From 78d34e696093f761c748ea35b37936602769f6b0 Mon Sep 17 00:00:00 2001 From: evanchia Date: Fri, 13 Aug 2021 14:10:43 -0700 Subject: [PATCH 001/355] Adds the MARS benchmark script in AR Signed-off-by: evanchia --- scripts/build/Jenkins/Jenkinsfile | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile index 30efdc00ad..95bb92a192 100644 --- a/scripts/build/Jenkins/Jenkinsfile +++ b/scripts/build/Jenkins/Jenkinsfile @@ -378,6 +378,25 @@ def TestMetrics(Map pipelineConfig, String workspace, String branchName, String } } +def BenchmarkMetrics(String workspace, String branchName, String outputDirectory) { + catchError(buildResult: null, stageResult: null) { + def cmakeBuildDir = [workspace, ENGINE_REPOSITORY_NAME, outputDirectory].join('/') + dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { + checkout scm: [ + $class: 'GitSCM', + branches: [[name: '*/main']], + extensions: [ + [$class: 'AuthorInChangelog'], + [$class: 'RelativeTargetDirectory', relativeTargetDir: 'mars'] + ], + userRemoteConfigs: [[url: "${env.MARS_REPO}", name: 'mars', credentialsId: "${env.GITHUB_USER}"]] + ] + def command = "${pipelineConfig.PYTHON_DIR}/python.cmd -u mars/scripts/python/benchmark_scraper.py ${cmakeBuildDir} ${branchName}" + palSh(command, "Publishing Benchmark Metrics") + } + } +} + def ExportTestResults(Map options, String platform, String type, String workspace, Map params) { catchError(message: "Error exporting tests results (this won't fail the build)", buildResult: 'SUCCESS', stageResult: 'FAILURE') { def o3deroot = "${workspace}/${ENGINE_REPOSITORY_NAME}" @@ -433,6 +452,7 @@ def CreateTestMetricsStage(Map pipelineConfig, String branchName, Map environmen return { stage("${buildJobName}_metrics") { TestMetrics(pipelineConfig, environmentVars['WORKSPACE'], branchName, env.DEFAULT_REPOSITORY_NAME, buildJobName, outputDirectory, configuration) + BenchmarkMetrics(environmentVars['WORKSPACE'], branchName, outputDirectory) } } } From e475405850d8ed562397e578dbbbb04ab449c2e2 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Mon, 16 Aug 2021 15:53:55 -0700 Subject: [PATCH 002/355] Updating multiplayer auto-components to require the LocalPredictionPlayerInputComponent service if they use NetworkInputs. Without LocalPredictionPlayerInputComponent CreateInput and ProcessInput will never be called Signed-off-by: Gene Walters --- .../Code/Source/AutoGen/AutoComponent_Source.jinja | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja index d2be2f682a..595efd76f4 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja @@ -1465,6 +1465,11 @@ namespace {{ Component.attrib['Namespace'] }} {% call(ComponentService) ParseComponentServiceNames(Component, ClassType, 'Required') %} required.push_back(AZ_CRC_CE("{{ ComponentService }}")); {% endcall %} + +{% if NetworkInputCount > 0 %} + // This component uses NetworkInputs so it requires LocalPredictionPlayerInputComponent which is responsible for calling CreateInput and ProcessInput + required.push_back(AZ_CRC_CE("LocalPredictionPlayerInputComponent")); +{% endif %} } void {{ ComponentBaseName }}::GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent) From 4374e6177e90c2381dc8bae357be8d82a23d9d5f Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Mon, 16 Aug 2021 20:46:34 -0700 Subject: [PATCH 003/355] Updating service requirement to use a generic 'MultiplayerInputDrive', that way if other developers want to make a non-local predictition player controller that calls create/process on the server they can do so as long as there custom component provides this 'MultiplayerInputDriver' service Signed-off-by: Gene Walters --- .../Components/LocalPredictionPlayerInputComponent.h | 1 + .../Code/Source/AutoGen/AutoComponent_Source.jinja | 6 +++--- .../Components/LocalPredictionPlayerInputComponent.cpp | 6 ++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/Components/LocalPredictionPlayerInputComponent.h b/Gems/Multiplayer/Code/Include/Multiplayer/Components/LocalPredictionPlayerInputComponent.h index fbb7131f76..932418b111 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/Components/LocalPredictionPlayerInputComponent.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/Components/LocalPredictionPlayerInputComponent.h @@ -22,6 +22,7 @@ namespace Multiplayer AZ_MULTIPLAYER_COMPONENT(Multiplayer::LocalPredictionPlayerInputComponent, s_localPredictionPlayerInputComponentConcreteUuid, Multiplayer::LocalPredictionPlayerInputComponentBase); static void Reflect([[maybe_unused]] AZ::ReflectContext* context); + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); void OnInit() override; void OnActivate([[maybe_unused]] Multiplayer::EntityIsMigrating entityIsMigrating) override; diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja index 595efd76f4..83830fad5f 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja @@ -1465,10 +1465,10 @@ namespace {{ Component.attrib['Namespace'] }} {% call(ComponentService) ParseComponentServiceNames(Component, ClassType, 'Required') %} required.push_back(AZ_CRC_CE("{{ ComponentService }}")); {% endcall %} - {% if NetworkInputCount > 0 %} - // This component uses NetworkInputs so it requires LocalPredictionPlayerInputComponent which is responsible for calling CreateInput and ProcessInput - required.push_back(AZ_CRC_CE("LocalPredictionPlayerInputComponent")); + + // This component uses NetworkInputs so it requires a MultiplayerInputDriver service which is responsible for calling CreateInput and ProcessInput + required.push_back(AZ_CRC_CE("MultiplayerInputDriver")); {% endif %} } diff --git a/Gems/Multiplayer/Code/Source/Components/LocalPredictionPlayerInputComponent.cpp b/Gems/Multiplayer/Code/Source/Components/LocalPredictionPlayerInputComponent.cpp index 242db95ecb..a1238c378d 100644 --- a/Gems/Multiplayer/Code/Source/Components/LocalPredictionPlayerInputComponent.cpp +++ b/Gems/Multiplayer/Code/Source/Components/LocalPredictionPlayerInputComponent.cpp @@ -56,6 +56,12 @@ namespace Multiplayer LocalPredictionPlayerInputComponentBase::Reflect(context); } + void LocalPredictionPlayerInputComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + LocalPredictionPlayerInputComponentBase::GetProvidedServices(provided); + provided.push_back(AZ_CRC_CE("MultiplayerInputDriver")); + } + void LocalPredictionPlayerInputComponent::OnInit() { ; From 7a83950f5929c0ff6ee9c9df5a5658b9db37831a Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Fri, 20 Aug 2021 11:14:56 -0700 Subject: [PATCH 004/355] Initial draft for save all prefabs workflow Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 95 +++++++++++ Code/Editor/CryEditDoc.cpp | 160 ++++++++++++++++-- Code/Editor/EditorPreferencesPageGeneral.cpp | 19 +++ Code/Editor/EditorPreferencesPageGeneral.h | 8 + Code/Editor/Settings.cpp | 24 ++- Code/Editor/Settings.h | 10 ++ Code/Editor/Style/Editor.qss | 24 +++ .../PrefabEditorEntityOwnershipInterface.h | 8 + .../PrefabEditorEntityOwnershipService.cpp | 21 +++ .../PrefabEditorEntityOwnershipService.h | 3 + .../Prefab/PrefabSystemComponent.cpp | 11 ++ .../Prefab/PrefabSystemComponent.h | 2 + .../Prefab/PrefabSystemComponentInterface.h | 1 + 13 files changed, 373 insertions(+), 13 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 280613815e..af7151a633 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -33,6 +33,9 @@ AZ_POP_DISABLE_WARNING #include #include #include +#include +#include +#include // Aws Native SDK #include @@ -68,10 +71,12 @@ AZ_POP_DISABLE_WARNING #include #include #include +#include #include // AzQtComponents #include +#include #include #include #include @@ -724,6 +729,96 @@ void CCryEditApp::OnFileSave() const QScopedValueRollback rollback(m_savingLevel, true); GetIEditor()->GetDocument()->DoFileSave(); + + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + + if (usePrefabSystemForLevels) + { + auto prefabSystemComponentInterface = AZ::Interface::Get(); + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + { + prefabSystemComponentInterface->SaveAllDirtyTemplates(); + } + else if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::Unspecified) + { + QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); + saveModifiedMessageBox.setObjectName("SaveAllPrefabsDialog"); + QBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); + + QFrame* levelSavedMessageFrame = new QFrame(&saveModifiedMessageBox); + QHBoxLayout* levelSavedMessageLayout = new QHBoxLayout(&saveModifiedMessageBox); + levelSavedMessageFrame->setObjectName("LevelSavedMessageFrame"); + QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); + QLabel* levelSavedSuccessfullyIcon = new QLabel(); + levelSavedSuccessfullyIcon->setPixmap(checkMarkIcon); + levelSavedSuccessfullyIcon->setFixedWidth(checkMarkIcon.width()); + QLabel* levelSavedSuccessfullyLabel = new QLabel("All entities inside level have been saved successfully."); + levelSavedSuccessfullyLabel->setObjectName("LevelSavedSuccessfullyLabel"); + levelSavedMessageLayout->addWidget(levelSavedSuccessfullyIcon); + levelSavedMessageLayout->addWidget(levelSavedSuccessfullyLabel); + levelSavedMessageFrame->setLayout(levelSavedMessageLayout); + + QFrame* prefabSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); + QHBoxLayout* prefabSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); + QLabel* warningIconContainer = new QLabel(); + QPixmap warningIcon(QString(":/Cards/img/UI20/Cards/warning.svg")); + warningIconContainer->setPixmap(warningIcon); + warningIconContainer->setFixedWidth(warningIcon.width()); + prefabSaveQuestionLayout->addWidget(warningIconContainer); + QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save all unsaved prefabs?"); + prefabSaveQuestionFrame->setObjectName("PrefabSaveQuestionFrame"); + prefabSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); + prefabSaveQuestionFrame->setLayout(prefabSaveQuestionLayout); + + contentLayout->addWidget(levelSavedMessageFrame); + contentLayout->addWidget(prefabSaveQuestionFrame); + + QFrame* footerSeparatorLine = new QFrame(); + footerSeparatorLine->setObjectName("FooterSeparatorLine"); + footerSeparatorLine->setFrameShape(QFrame::HLine); + contentLayout->addWidget(footerSeparatorLine); + QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); + QCheckBox* saveAllPrefabsPreference = new QCheckBox("Remember my preference."); + AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreference); + QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); + footerPreferenceLayout->addWidget(saveAllPrefabsPreference); + QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit->GlobalPreferences."); + prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); + footerPreferenceLayout->addWidget(prefabSavePreferenceHint); + footerLayout->addLayout(footerPreferenceLayout); + QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); + footerLayout->addWidget(prefabSaveConfirmationButtons); + + contentLayout->addLayout(footerLayout); + + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); + AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); + + int prefabSaveSelection = saveModifiedMessageBox.exec(); + switch (prefabSaveSelection) + { + case QDialog::Accepted: + if (saveAllPrefabsPreference->checkState() == Qt::CheckState::Checked) + { + gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveAll); + } + prefabSystemComponentInterface->SaveAllDirtyTemplates(); + break; + case QDialog::Rejected: + if (saveAllPrefabsPreference->checkState() == Qt::CheckState::Checked) + { + gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveNone); + } + break; + } + } + } } diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index e5988918f5..1eb0a5c0b8 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -13,6 +13,10 @@ // Qt #include +#include +#include +#include +#include // AzCore #include @@ -31,6 +35,7 @@ #include #include #include +#include // Editor #include "Settings.h" @@ -664,19 +669,116 @@ bool CCryEditDoc::SaveModified() return true; } - auto button = QMessageBox::question(AzToolsFramework::GetActiveWindow(), QString(), tr("Save changes to %1?").arg(GetTitle()), - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - switch (button) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (usePrefabSystemForLevels) { - case QMessageBox::Cancel: - return false; - case QMessageBox::Yes: - return DoFileSave(); - case QMessageBox::No: - SetModifiedFlag(false); - return true; + auto prefabSystemComponentInterface = AZ::Interface::Get(); + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + + QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); + saveModifiedMessageBox.setObjectName("SaveDirtyLevelDialog"); + + QVBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); + QFrame* levelEntitiesSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); + QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); + levelEntitiesSaveQuestionFrame->setObjectName("LevelEntitiesSaveQuestionFrame"); + QLabel* levelEntitiesSaveQuestionLabel = new QLabel("Do you want to save unsaved entities in the level?"); + + levelEntitiesSaveQuestionFrame->setLayout(levelEntitiesSaveQuestionLayout); + QPixmap warningIcon(QString(":/Cards/img/UI20/Cards/warning.svg")); + QLabel* warningIconContainer = new QLabel(); + warningIconContainer->setPixmap(warningIcon); + warningIconContainer->setFixedWidth(warningIcon.width()); + levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); + levelEntitiesSaveQuestionLayout->addWidget(levelEntitiesSaveQuestionLabel); + contentLayout->addWidget(levelEntitiesSaveQuestionFrame); + + QCheckBox* saveAllPrefabsCheckbox = new QCheckBox("Save all unsaved prefabs in the level too."); + AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsCheckbox); + saveAllPrefabsCheckbox->setObjectName("SaveAllPrefabsCheckbox"); + QObject::connect( + saveAllPrefabsCheckbox, &QCheckBox::stateChanged, + [&savePrefabsPreference](int state) + { + savePrefabsPreference = static_cast(state) == Qt::CheckState::Checked + ? AzToolsFramework::SavePrefabsPreference::SaveAll + : AzToolsFramework::SavePrefabsPreference::SaveNone; + }); + contentLayout->addWidget(saveAllPrefabsCheckbox); + QFrame* footerSeparatorLine = new QFrame(); + footerSeparatorLine->setObjectName("FooterSeparatorLine"); + footerSeparatorLine->setFrameShape(QFrame::HLine); + contentLayout->addWidget(footerSeparatorLine); + QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); + QCheckBox* saveAllPrefabsPreferenceCheckBox = new QCheckBox("Remember my preference."); + AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreferenceCheckBox); + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + { + saveAllPrefabsPreferenceCheckBox->setCheckState(Qt::CheckState::Checked); + saveAllPrefabsCheckbox->setCheckState(Qt::CheckState::Checked); + } + QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); + footerPreferenceLayout->addWidget(saveAllPrefabsPreferenceCheckBox); + QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); + prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); + footerPreferenceLayout->addWidget(prefabSavePreferenceHint); + footerLayout->addLayout(footerPreferenceLayout); + QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel); + footerLayout->addWidget(prefabSaveConfirmationButtons); + + contentLayout->addLayout(footerLayout); + + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); + AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); + + int prefabSaveSelection = saveModifiedMessageBox.exec(); + + if (saveAllPrefabsPreferenceCheckBox->checkState() == Qt::CheckState::Checked) + { + gSettings.SetSavePrefabsPreference(savePrefabsPreference); + prefabEditorEntityOwnershipInterface->SetSavePrefabsPreference(savePrefabsPreference); + } + + switch (prefabSaveSelection) + { + case QDialog::Accepted: + DoFileSave(); + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + { + prefabSystemComponentInterface->SaveAllDirtyTemplates(); + } + return true; + case QDialog::Rejected: + return false; + } + Q_UNREACHABLE(); + } + else + { + QMessageBox saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); + saveModifiedMessageBox.setText(QString("Save changes to %1?").arg(GetTitle())); + saveModifiedMessageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + saveModifiedMessageBox.setIcon(QMessageBox::Icon::Question); + + auto button = QMessageBox::question( + AzToolsFramework::GetActiveWindow(), QString(), tr("Save changes to %1?").arg(GetTitle()), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + switch (button) + { + case QMessageBox::Cancel: + return false; + case QMessageBox::Yes: + return DoFileSave(); + case QMessageBox::No: + SetModifiedFlag(false); + return true; + } + Q_UNREACHABLE(); } - Q_UNREACHABLE(); } void CCryEditDoc::OnFileSaveAs() @@ -1258,6 +1360,42 @@ bool CCryEditDoc::SaveLevel(const QString& filename) if (openResult) { AZ::IO::FileIOStream stream(tempSaveFileHandle, AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary, false); + //SaveAllPrefabsDialog dlg(MainWindow::instance()); + //dlg.exec(); + /* + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = + prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::Unspecified && !m_modified) + { + QMessageBox prefabSavePreferenceBox(AzToolsFramework::GetActiveWindow()); + prefabSavePreferenceBox.setText(QString("Save all prefabs in %1?").arg(GetTitle())); + prefabSavePreferenceBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + QCheckBox* checkbox = new QCheckBox("Remember my preference."); + prefabSavePreferenceBox.setCheckBox(checkbox); + prefabSavePreferenceBox.checkBox(); + int button = prefabSavePreferenceBox.exec(); + switch (button) + { + case QMessageBox::Yes: + if (checkbox->checkState() == Qt::CheckState::Checked) + { + prefabEditorEntityOwnershipInterface->SetSavePrefabsPreference( + AzToolsFramework::SavePrefabsPreference::SaveAll); + gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveAll); + } + prefabEditorEntityOwnershipInterface->SetSaveAllPrefabs(true); + break; + case QMessageBox::No: + if (checkbox->checkState() == Qt::CheckState::Checked) + { + prefabEditorEntityOwnershipInterface->SetSavePrefabsPreference( + AzToolsFramework::SavePrefabsPreference::SaveNone); + gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveNone); + } + prefabEditorEntityOwnershipInterface->SetSaveAllPrefabs(false); + break; + } + }*/ contentsAllSaved = prefabEditorEntityOwnershipInterface->SaveToStream(stream, AZStd::string_view(filenameStrData.data(), filenameStrData.size())); stream.Close(); } diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 79ecfbdfc7..f11659576b 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -42,6 +42,10 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Field("EnableSceneInspector", &GeneralSettings::m_enableSceneInspector) ->Field("RestoreViewportCamera", &GeneralSettings::m_restoreViewportCamera); + serialize.Class() + ->Version(1) + ->Field("SavePrefabsPreference", &PrefabSettings::m_savePrefabsPreference); + serialize.Class() ->Version(2) ->Field("ShowDashboard", &Messaging::m_showDashboard) @@ -64,6 +68,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) serialize.Class() ->Version(1) ->Field("General Settings", &CEditorPreferencesPage_General::m_generalSettings) + ->Field("Prefab Settings", &CEditorPreferencesPage_General::m_prefabSettings) ->Field("Messaging", &CEditorPreferencesPage_General::m_messaging) ->Field("Undo", &CEditorPreferencesPage_General::m_undo) ->Field("Deep Selection", &CEditorPreferencesPage_General::m_deepSelection) @@ -92,6 +97,13 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_restoreViewportCamera, EditorPreferencesGeneralRestoreViewportCameraSettingName, "Keep the original editor viewport transform when exiting game mode.") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_enableSceneInspector, "Enable Scene Inspector (EXPERIMENTAL)", "Enable the option to inspect the internal data loaded from scene files like .fbx. This is an experimental feature. Restart the Scene Settings if the option is not visible under the Help menu."); + editContext->Class("Prefabs", "") + ->DataElement( + AZ::Edit::UIHandlers::ComboBox, &PrefabSettings::m_savePrefabsPreference, "Save Prefabs Preference","Save Prefabs Preference") + ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::Unspecified, "Unspecified") + ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::SaveAll, "Save All") + ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::SaveNone, "Save None"); + editContext->Class("Messaging", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Messaging::m_showDashboard, "Show Welcome to Open 3D Engine at startup", "Show Welcome to Open 3D Engine at startup") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Messaging::m_showCircularDependencyError, "Show Error: Circular dependency", "Show an error message when adding a slice instance to the target slice would create a cyclic asset dependency. All other valid overrides will be saved even if this is turned off."); @@ -115,6 +127,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_generalSettings, "General Settings", "General Editor Preferences") + ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_prefabSettings, "Prefabs", "Prefab Settings") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_messaging, "Messaging", "Messaging") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_undo, "Undo", "Undo Preferences") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_deepSelection, "Selection", "Selection") @@ -161,6 +174,9 @@ void CEditorPreferencesPage_General::OnApply() MainWindow::instance()->AdjustToolBarIconSize(m_generalSettings.m_toolbarIconSize); } + //prefabs + gSettings.prefabSettings.savePrefabsPreference = m_prefabSettings.m_savePrefabsPreference; + //undo gSettings.undoLevels = m_undo.m_undoLevels; @@ -190,6 +206,9 @@ void CEditorPreferencesPage_General::InitializeSettings() m_generalSettings.m_toolbarIconSize = static_cast(gSettings.gui.nToolbarIconSize); + //prefabs + m_prefabSettings.m_savePrefabsPreference = gSettings.prefabSettings.savePrefabsPreference; + //Messaging m_messaging.m_showDashboard = gSettings.bShowDashboardAtStartup; m_messaging.m_showCircularDependencyError = gSettings.m_showCircularDependencyError; diff --git a/Code/Editor/EditorPreferencesPageGeneral.h b/Code/Editor/EditorPreferencesPageGeneral.h index 9a3a0f21e8..29dcefcb80 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.h +++ b/Code/Editor/EditorPreferencesPageGeneral.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "Settings.h" @@ -57,6 +58,12 @@ private: bool m_enableSceneInspector; }; + struct PrefabSettings + { + AZ_TYPE_INFO(PrefabSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); + AzToolsFramework::SavePrefabsPreference m_savePrefabsPreference; + }; + struct Messaging { AZ_TYPE_INFO(Messaging, "{A6AD87CB-E905-409B-A2BF-C43CDCE63B0C}") @@ -89,6 +96,7 @@ private: }; GeneralSettings m_generalSettings; + PrefabSettings m_prefabSettings; Messaging m_messaging; Undo m_undo; DeepSelection m_deepSelection; diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 8672bad5c4..0197a45cfa 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -255,6 +255,7 @@ SEditorSettings::SEditorSettings() g_TemporaryLevelName = nullptr; sliceSettings.dynamicByDefault = false; + prefabSettings.savePrefabsPreference = AzToolsFramework::SavePrefabsPreference::Unspecified; } void SEditorSettings::Connect() @@ -669,12 +670,20 @@ void SEditorSettings::Save() AzFramework::ApplicationRequests::Bus::Broadcast( &AzFramework::ApplicationRequests::SetPrefabSystemEnabled, prefabSystem); + AzToolsFramework::PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipService = + AZ::Interface::Get(); + prefabEditorEntityOwnershipService->SetSavePrefabsPreference(prefabSettings.savePrefabsPreference); + SaveSettingsRegistryFile(); } ////////////////////////////////////////////////////////////////////////// void SEditorSettings::Load() { + AzToolsFramework::PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipService = + AZ::Interface::Get(); + prefabSettings.savePrefabsPreference = prefabEditorEntityOwnershipService->GetSavePrefabsPreference(); + // Load from Settings Registry AzFramework::ApplicationRequests::Bus::BroadcastResult( prefabSystem, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); @@ -1073,6 +1082,11 @@ void SEditorSettings::ConvertPath(const AZStd::string_view sourcePath, AZStd::st AZStd::replace(category.begin(), category.end(), '|', '\\'); } +void SEditorSettings::SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference savePrefabsPreference) +{ + prefabSettings.savePrefabsPreference = savePrefabsPreference; +} + AzToolsFramework::EditorSettingsAPIRequests::SettingOutcome SEditorSettings::GetValue(const AZStd::string_view path) { if (path.find("|") == AZStd::string_view::npos) @@ -1148,11 +1162,17 @@ void SEditorSettings::SaveSettingsRegistryFile() AZ::SettingsRegistryMergeUtils::DumperSettings dumperSettings; dumperSettings.m_prettifyOutput = true; - dumperSettings.m_jsonPointerPrefix = "/Amazon/Preferences"; + dumperSettings.m_includeFilter = [](AZStd::string_view path) + { + AZStd::string_view amazonPrefixPath("/Amazon/Preferences"); + AZStd::string_view o3dePrefixPath("/O3DE/Preferences"); + return amazonPrefixPath.starts_with(path.substr(0, amazonPrefixPath.size())) || + o3dePrefixPath.starts_with(path.substr(0, o3dePrefixPath.size())); + }; AZStd::string stringBuffer; AZ::IO::ByteContainerStream stringStream(&stringBuffer); - if (!AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(*registry, "/Amazon/Preferences", stringStream, dumperSettings)) + if (!AZ::SettingsRegistryMergeUtils::DumpSettingsRegistryToStream(*registry, "", stringStream, dumperSettings)) { AZ_Warning("SEditorSettings", false, R"(Unable to save changes to the Editor Preferences registry file at "%s"\n)", editorPreferencesFilePath.c_str()); diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index 51931ab955..72e6a54032 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -230,6 +231,11 @@ struct SSliceSettings bool dynamicByDefault; }; +struct SPrefabSettings +{ + AzToolsFramework::SavePrefabsPreference savePrefabsPreference; +}; + ////////////////////////////////////////////////////////////////////////// struct SAssetBrowserSettings { @@ -466,8 +472,12 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING SSliceSettings sliceSettings; + SPrefabSettings prefabSettings; + bool prefabSystem = true; ///< Toggle to enable/disable the Prefab system for level entities. + void SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference savePrefabsPreference); + private: void SaveValue(const char* sSection, const char* sKey, int value); void SaveValue(const char* sSection, const char* sKey, const QColor& value); diff --git a/Code/Editor/Style/Editor.qss b/Code/Editor/Style/Editor.qss index b900dbeff3..e1b790ed0c 100644 --- a/Code/Editor/Style/Editor.qss +++ b/Code/Editor/Style/Editor.qss @@ -244,3 +244,27 @@ QTableWidget#recentLevelTable::item { max-height: 16px; qproperty-iconSize: 16px 16px; } + +#LevelSavedMessageFrame{ + border: 1px solid green; + border-radius: 2px; + margin: 5px 20px 5px 20px; + padding: 5px 2px 5px 2px; +} + +#SaveAllPrefabsDialog #PrefabSaveQuestionFrame, #SaveDirtyLevelDialog #LevelEntitiesSaveQuestionFrame, #SaveAllPrefabsCheckbox{ + border: 1px solid orange; + border-radius: 2px; + margin: 5px 20px 5px 20px; + padding: 5px 2px 5px 2px; + color : white; +} + +#SaveAllPrefabsDialog #FooterSeparatorLine, #SaveDirtyLevelDialog #FooterSeparatorLine{ + color: gray; +} + +#SaveAllPrefabsDialog #PrefabSavePreferenceHint, #SaveDirtyLevelDialog #PrefabSavePreferenceHint{ + font: italic; + color: #999999; +} diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index 1cd36e8055..f26f80ca10 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -18,6 +18,12 @@ namespace AzToolsFramework { + enum class SavePrefabsPreference : AZ::s64 + { + Unspecified = 0, + SaveAll = 1, + SaveNone = -1 + }; class PrefabEditorEntityOwnershipInterface { @@ -54,5 +60,7 @@ namespace AzToolsFramework virtual void StopPlayInEditor() = 0; virtual void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) = 0; + virtual SavePrefabsPreference GetSavePrefabsPreference() = 0; + virtual void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) = 0; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index 7df1e1b5c1..bd8bf28de2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -27,6 +28,8 @@ namespace AzToolsFramework { + static constexpr const char s_savePrefabsKey[] = "/O3DE/Preferences/SavePrefabs"; + PrefabEditorEntityOwnershipService::PrefabEditorEntityOwnershipService(const AzFramework::EntityContextId& entityContextId, AZ::SerializeContext* serializeContext) : m_entityContextId(entityContextId) @@ -607,6 +610,24 @@ namespace AzToolsFramework m_playInEditorData.m_isEnabled = false; } + SavePrefabsPreference PrefabEditorEntityOwnershipService::GetSavePrefabsPreference() + { + AZ::s64 savePrefabsPreference = static_cast(SavePrefabsPreference::Unspecified); + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->Get(savePrefabsPreference, s_savePrefabsKey); + } + return static_cast(savePrefabsPreference); + } + + void PrefabEditorEntityOwnershipService::SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) + { + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->Set(s_savePrefabsKey, static_cast(savePrefabsPreference)); + } + } + ////////////////////////////////////////////////////////////////////////// // Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab // development to pinpoint and replace specific calls to Slice system diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h index bf1199d6dd..e94c955061 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h @@ -168,6 +168,9 @@ namespace AzToolsFramework void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) override; + SavePrefabsPreference GetSavePrefabsPreference() override; + void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) override; + protected: AZ::SliceComponent::SliceInstanceAddress GetOwningSlice() override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 1051e530c8..31f5816bfc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -753,6 +753,17 @@ namespace AzToolsFramework } } + void PrefabSystemComponent::SaveAllDirtyTemplates() + { + for (auto& [id, templateObject] : m_templateIdMap) + { + if (IsTemplateDirty(id)) + { + m_prefabLoader.SaveTemplate(id); + } + } + } + bool PrefabSystemComponent::ConnectTemplates( Link& link, TemplateId sourceTemplateId, diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index b07ccbada6..3539a79d54 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -183,6 +183,8 @@ namespace AzToolsFramework */ void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override; + void SaveAllDirtyTemplates() override; + ////////////////////////////////////////////////////////////////////////// /** diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index 0c758a21af..bcea8a8b2d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -49,6 +49,7 @@ namespace AzToolsFramework virtual bool IsTemplateDirty(const TemplateId& templateId) = 0; virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; + virtual void SaveAllDirtyTemplates() = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; From c20ec14af793bbbbc950b8a1b704dc9b742ee705 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Fri, 20 Aug 2021 13:37:38 -0700 Subject: [PATCH 005/355] Added comments and did some code clean up Changes in this commit: - Added comments to dialog code in CryEdit.cpp and CryEditDoc.cpp - Moved Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg to Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/warning.svg - Improved the hover message over prefab settings in EditorPreferencesPageGeneral.cpp - Fixed a syntax error in Editor.qss Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 32 +++--- Code/Editor/CryEditDoc.cpp | 99 +++++++------------ Code/Editor/EditorPreferencesPageGeneral.cpp | 3 +- Code/Editor/Settings.h | 2 +- Code/Editor/Style/Editor.qss | 9 +- .../Components/Widgets/Card.cpp | 2 +- .../AzQtComponents/Components/resources.qrc | 1 - .../Notifications}/warning.svg | 0 .../AzQtComponents/Images/resources.qrc | 1 + 9 files changed, 67 insertions(+), 82 deletions(-) rename Code/Framework/AzQtComponents/AzQtComponents/{Components/img/UI20/Cards => Images/Notifications}/warning.svg (100%) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index af7151a633..9b46f99e16 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -747,55 +747,65 @@ void CCryEditApp::OnFileSave() else if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::Unspecified) { QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); + + // Main Content section begins. saveModifiedMessageBox.setObjectName("SaveAllPrefabsDialog"); QBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); - QFrame* levelSavedMessageFrame = new QFrame(&saveModifiedMessageBox); QHBoxLayout* levelSavedMessageLayout = new QHBoxLayout(&saveModifiedMessageBox); levelSavedMessageFrame->setObjectName("LevelSavedMessageFrame"); + + // Add a checkMark icon next to the level entities saved message. QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); - QLabel* levelSavedSuccessfullyIcon = new QLabel(); - levelSavedSuccessfullyIcon->setPixmap(checkMarkIcon); - levelSavedSuccessfullyIcon->setFixedWidth(checkMarkIcon.width()); + QLabel* levelSavedSuccessfullyIconContainer = new QLabel(); + levelSavedSuccessfullyIconContainer->setPixmap(checkMarkIcon); + levelSavedSuccessfullyIconContainer->setFixedWidth(checkMarkIcon.width()); + + // Add a message that level entities are saved successfully. QLabel* levelSavedSuccessfullyLabel = new QLabel("All entities inside level have been saved successfully."); levelSavedSuccessfullyLabel->setObjectName("LevelSavedSuccessfullyLabel"); - levelSavedMessageLayout->addWidget(levelSavedSuccessfullyIcon); + levelSavedMessageLayout->addWidget(levelSavedSuccessfullyIconContainer); levelSavedMessageLayout->addWidget(levelSavedSuccessfullyLabel); levelSavedMessageFrame->setLayout(levelSavedMessageLayout); + QFrame* prefabSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); QHBoxLayout* prefabSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); + + // Add a warning icon next to prefabs save question. QLabel* warningIconContainer = new QLabel(); - QPixmap warningIcon(QString(":/Cards/img/UI20/Cards/warning.svg")); + QPixmap warningIcon(QString(":/Notifications/warning.svg")); warningIconContainer->setPixmap(warningIcon); warningIconContainer->setFixedWidth(warningIcon.width()); prefabSaveQuestionLayout->addWidget(warningIconContainer); + + // Ask if user wants all prefabs saved. QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save all unsaved prefabs?"); prefabSaveQuestionFrame->setObjectName("PrefabSaveQuestionFrame"); prefabSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); prefabSaveQuestionFrame->setLayout(prefabSaveQuestionLayout); - contentLayout->addWidget(levelSavedMessageFrame); contentLayout->addWidget(prefabSaveQuestionFrame); - + + // Footer section begins. QFrame* footerSeparatorLine = new QFrame(); footerSeparatorLine->setObjectName("FooterSeparatorLine"); footerSeparatorLine->setFrameShape(QFrame::HLine); contentLayout->addWidget(footerSeparatorLine); QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); + + // Provide option for user to remember their prefab save preference. QCheckBox* saveAllPrefabsPreference = new QCheckBox("Remember my preference."); AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreference); QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); footerPreferenceLayout->addWidget(saveAllPrefabsPreference); - QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit->GlobalPreferences."); + QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); footerPreferenceLayout->addWidget(prefabSavePreferenceHint); footerLayout->addLayout(footerPreferenceLayout); QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); footerLayout->addWidget(prefabSaveConfirmationButtons); - contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 1eb0a5c0b8..37a5750e1f 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -672,7 +672,29 @@ bool CCryEditDoc::SaveModified() bool usePrefabSystemForLevels = false; AzFramework::ApplicationRequests::Bus::BroadcastResult( usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); - if (usePrefabSystemForLevels) + if (!usePrefabSystemForLevels) + { + QMessageBox saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); + saveModifiedMessageBox.setText(QString("Save changes to %1?").arg(GetTitle())); + saveModifiedMessageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + saveModifiedMessageBox.setIcon(QMessageBox::Icon::Question); + + auto button = QMessageBox::question( + AzToolsFramework::GetActiveWindow(), QString(), tr("Save changes to %1?").arg(GetTitle()), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + switch (button) + { + case QMessageBox::Cancel: + return false; + case QMessageBox::Yes: + return DoFileSave(); + case QMessageBox::No: + SetModifiedFlag(false); + return true; + } + Q_UNREACHABLE(); + } + else { auto prefabSystemComponentInterface = AZ::Interface::Get(); auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); @@ -681,21 +703,26 @@ bool CCryEditDoc::SaveModified() QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); saveModifiedMessageBox.setObjectName("SaveDirtyLevelDialog"); + // Main Content section begins. QVBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); QFrame* levelEntitiesSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); levelEntitiesSaveQuestionFrame->setObjectName("LevelEntitiesSaveQuestionFrame"); - QLabel* levelEntitiesSaveQuestionLabel = new QLabel("Do you want to save unsaved entities in the level?"); - + + // Add a warning icon next to save entities question. levelEntitiesSaveQuestionFrame->setLayout(levelEntitiesSaveQuestionLayout); - QPixmap warningIcon(QString(":/Cards/img/UI20/Cards/warning.svg")); + QPixmap warningIcon(QString(":/Notifications/warning.svg")); QLabel* warningIconContainer = new QLabel(); warningIconContainer->setPixmap(warningIcon); warningIconContainer->setFixedWidth(warningIcon.width()); levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); + + // Ask user if they want to save entities in level. + QLabel* levelEntitiesSaveQuestionLabel = new QLabel("Do you want to save unsaved entities in the level?"); levelEntitiesSaveQuestionLayout->addWidget(levelEntitiesSaveQuestionLabel); contentLayout->addWidget(levelEntitiesSaveQuestionFrame); + // Ask user if they want to save unsaved prefabs in the level too. QCheckBox* saveAllPrefabsCheckbox = new QCheckBox("Save all unsaved prefabs in the level too."); AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsCheckbox); saveAllPrefabsCheckbox->setObjectName("SaveAllPrefabsCheckbox"); @@ -708,11 +735,15 @@ bool CCryEditDoc::SaveModified() : AzToolsFramework::SavePrefabsPreference::SaveNone; }); contentLayout->addWidget(saveAllPrefabsCheckbox); + + // Footer section begins. QFrame* footerSeparatorLine = new QFrame(); footerSeparatorLine->setObjectName("FooterSeparatorLine"); footerSeparatorLine->setFrameShape(QFrame::HLine); contentLayout->addWidget(footerSeparatorLine); QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); + + // Provide option for user to remember their prefab save preference. QCheckBox* saveAllPrefabsPreferenceCheckBox = new QCheckBox("Remember my preference."); AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreferenceCheckBox); if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) @@ -728,9 +759,7 @@ bool CCryEditDoc::SaveModified() footerLayout->addLayout(footerPreferenceLayout); QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel); footerLayout->addWidget(prefabSaveConfirmationButtons); - contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); @@ -757,28 +786,6 @@ bool CCryEditDoc::SaveModified() } Q_UNREACHABLE(); } - else - { - QMessageBox saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); - saveModifiedMessageBox.setText(QString("Save changes to %1?").arg(GetTitle())); - saveModifiedMessageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - saveModifiedMessageBox.setIcon(QMessageBox::Icon::Question); - - auto button = QMessageBox::question( - AzToolsFramework::GetActiveWindow(), QString(), tr("Save changes to %1?").arg(GetTitle()), - QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - switch (button) - { - case QMessageBox::Cancel: - return false; - case QMessageBox::Yes: - return DoFileSave(); - case QMessageBox::No: - SetModifiedFlag(false); - return true; - } - Q_UNREACHABLE(); - } } void CCryEditDoc::OnFileSaveAs() @@ -1360,42 +1367,6 @@ bool CCryEditDoc::SaveLevel(const QString& filename) if (openResult) { AZ::IO::FileIOStream stream(tempSaveFileHandle, AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary, false); - //SaveAllPrefabsDialog dlg(MainWindow::instance()); - //dlg.exec(); - /* - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = - prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::Unspecified && !m_modified) - { - QMessageBox prefabSavePreferenceBox(AzToolsFramework::GetActiveWindow()); - prefabSavePreferenceBox.setText(QString("Save all prefabs in %1?").arg(GetTitle())); - prefabSavePreferenceBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); - QCheckBox* checkbox = new QCheckBox("Remember my preference."); - prefabSavePreferenceBox.setCheckBox(checkbox); - prefabSavePreferenceBox.checkBox(); - int button = prefabSavePreferenceBox.exec(); - switch (button) - { - case QMessageBox::Yes: - if (checkbox->checkState() == Qt::CheckState::Checked) - { - prefabEditorEntityOwnershipInterface->SetSavePrefabsPreference( - AzToolsFramework::SavePrefabsPreference::SaveAll); - gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveAll); - } - prefabEditorEntityOwnershipInterface->SetSaveAllPrefabs(true); - break; - case QMessageBox::No: - if (checkbox->checkState() == Qt::CheckState::Checked) - { - prefabEditorEntityOwnershipInterface->SetSavePrefabsPreference( - AzToolsFramework::SavePrefabsPreference::SaveNone); - gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveNone); - } - prefabEditorEntityOwnershipInterface->SetSaveAllPrefabs(false); - break; - } - }*/ contentsAllSaved = prefabEditorEntityOwnershipInterface->SaveToStream(stream, AZStd::string_view(filenameStrData.data(), filenameStrData.size())); stream.Close(); } diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index f11659576b..08703ba6cc 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -99,7 +99,8 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) editContext->Class("Prefabs", "") ->DataElement( - AZ::Edit::UIHandlers::ComboBox, &PrefabSettings::m_savePrefabsPreference, "Save Prefabs Preference","Save Prefabs Preference") + AZ::Edit::UIHandlers::ComboBox, &PrefabSettings::m_savePrefabsPreference, "Save Prefabs Preference", + "When saving levels, this option controls whether and how prefabs should be saved along with the level.") ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::Unspecified, "Unspecified") ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::SaveAll, "Save All") ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::SaveNone, "Save None"); diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index 72e6a54032..61f89a8a05 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include diff --git a/Code/Editor/Style/Editor.qss b/Code/Editor/Style/Editor.qss index e1b790ed0c..2999eb388f 100644 --- a/Code/Editor/Style/Editor.qss +++ b/Code/Editor/Style/Editor.qss @@ -252,7 +252,8 @@ QTableWidget#recentLevelTable::item { padding: 5px 2px 5px 2px; } -#SaveAllPrefabsDialog #PrefabSaveQuestionFrame, #SaveDirtyLevelDialog #LevelEntitiesSaveQuestionFrame, #SaveAllPrefabsCheckbox{ +#SaveAllPrefabsDialog #PrefabSaveQuestionFrame, #SaveDirtyLevelDialog #LevelEntitiesSaveQuestionFrame, #SaveAllPrefabsCheckbox +{ border: 1px solid orange; border-radius: 2px; margin: 5px 20px 5px 20px; @@ -260,11 +261,13 @@ QTableWidget#recentLevelTable::item { color : white; } -#SaveAllPrefabsDialog #FooterSeparatorLine, #SaveDirtyLevelDialog #FooterSeparatorLine{ +#SaveAllPrefabsDialog #FooterSeparatorLine, #SaveDirtyLevelDialog #FooterSeparatorLine +{ color: gray; } -#SaveAllPrefabsDialog #PrefabSavePreferenceHint, #SaveDirtyLevelDialog #PrefabSavePreferenceHint{ +#SaveAllPrefabsDialog #PrefabSavePreferenceHint, #SaveDirtyLevelDialog #PrefabSavePreferenceHint +{ font: italic; color: #999999; } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp index a4ab3c5e5d..b4fd74dd25 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/Card.cpp @@ -347,7 +347,7 @@ namespace AzQtComponents config.toolTipPaddingInPixels = 5; config.headerIconSizeInPixels = CardHeader::defaultIconSize(); config.rootLayoutSpacing = 0; - config.warningIcon = QStringLiteral(":/Cards/img/UI20/Cards/warning.svg"); + config.warningIcon = QStringLiteral(":/Notifications/warning.svg"); config.warningIconSize = {24, 24}; config.disabledIconAlpha = 0.25; diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc index 909510d63b..7321128b57 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/resources.qrc @@ -424,7 +424,6 @@ img/UI20/Cards/menu_ico.png img/UI20/Cards/error_icon.png img/UI20/Cards/warning.png - img/UI20/Cards/warning.svg img/UI20/Cards/search.png img/UI20/Cards/close.png img/UI20/Cards/error-conclict-state.svg diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg b/Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/warning.svg similarity index 100% rename from Code/Framework/AzQtComponents/AzQtComponents/Components/img/UI20/Cards/warning.svg rename to Code/Framework/AzQtComponents/AzQtComponents/Images/Notifications/warning.svg diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc b/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc index c72687359b..0c8fedc79d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc +++ b/Code/Framework/AzQtComponents/AzQtComponents/Images/resources.qrc @@ -30,6 +30,7 @@ Notifications/checkmark.svg Notifications/download.svg Notifications/link.svg + Notifications/warning.svg Outliner/sort_a_to_z.svg From fad4392ca4abeec9bfd7610e0e4cdaeee9177862 Mon Sep 17 00:00:00 2001 From: AMZN-Phil Date: Mon, 23 Aug 2021 17:27:59 -0700 Subject: [PATCH 006/355] Fix text descenders cutoff on Configure Gems page. Signed-off-by: AMZN-Phil --- Code/Tools/ProjectManager/Resources/ProjectManager.qss | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Code/Tools/ProjectManager/Resources/ProjectManager.qss b/Code/Tools/ProjectManager/Resources/ProjectManager.qss index 1bd261da00..fbdebd5492 100644 --- a/Code/Tools/ProjectManager/Resources/ProjectManager.qss +++ b/Code/Tools/ProjectManager/Resources/ProjectManager.qss @@ -157,15 +157,16 @@ QTabBar::tab:focus { font-size:14px; text-align:left; margin:0; - padding-top:10px; - padding-bottom:-5px; - min-height:15px; - max-height:15px; + padding-top:0px; + padding-bottom:0px; + min-height:20px; + max-height:20px; } #headerSubTitle { font-size:24px; text-align:left; margin:0; + padding-top:-5px; min-height:42px; max-height:42px; } From 79dd041d024b08eddc0319889bc8a2eda99dbd31 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 24 Aug 2021 17:22:50 -0700 Subject: [PATCH 007/355] Add helper methods to create and execute save level dialogs Changes in this commit : - Added AreDirtyTemplatesPresent() method to PrefabSystemComponentInterface - Added ConstructSaveLevelDialog() helper method to create the save level dialog - Added ExecuteSavePrefabsDialog() helper method to create and execute the save prefabs dialog Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 178 ++++------- Code/Editor/CryEditDoc.cpp | 297 +++++++++++++----- Code/Editor/CryEditDoc.h | 6 + .../Prefab/PrefabSystemComponent.cpp | 12 + .../Prefab/PrefabSystemComponent.h | 2 + .../Prefab/PrefabSystemComponentInterface.h | 1 + 6 files changed, 309 insertions(+), 187 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 9b46f99e16..6e921833cb 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -736,98 +736,7 @@ void CCryEditApp::OnFileSave() if (usePrefabSystemForLevels) { - auto prefabSystemComponentInterface = AZ::Interface::Get(); - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); - - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) - { - prefabSystemComponentInterface->SaveAllDirtyTemplates(); - } - else if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::Unspecified) - { - QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); - - // Main Content section begins. - saveModifiedMessageBox.setObjectName("SaveAllPrefabsDialog"); - QBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); - QFrame* levelSavedMessageFrame = new QFrame(&saveModifiedMessageBox); - QHBoxLayout* levelSavedMessageLayout = new QHBoxLayout(&saveModifiedMessageBox); - levelSavedMessageFrame->setObjectName("LevelSavedMessageFrame"); - - // Add a checkMark icon next to the level entities saved message. - QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); - QLabel* levelSavedSuccessfullyIconContainer = new QLabel(); - levelSavedSuccessfullyIconContainer->setPixmap(checkMarkIcon); - levelSavedSuccessfullyIconContainer->setFixedWidth(checkMarkIcon.width()); - - // Add a message that level entities are saved successfully. - QLabel* levelSavedSuccessfullyLabel = new QLabel("All entities inside level have been saved successfully."); - levelSavedSuccessfullyLabel->setObjectName("LevelSavedSuccessfullyLabel"); - levelSavedMessageLayout->addWidget(levelSavedSuccessfullyIconContainer); - levelSavedMessageLayout->addWidget(levelSavedSuccessfullyLabel); - levelSavedMessageFrame->setLayout(levelSavedMessageLayout); - - - QFrame* prefabSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); - QHBoxLayout* prefabSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); - - // Add a warning icon next to prefabs save question. - QLabel* warningIconContainer = new QLabel(); - QPixmap warningIcon(QString(":/Notifications/warning.svg")); - warningIconContainer->setPixmap(warningIcon); - warningIconContainer->setFixedWidth(warningIcon.width()); - prefabSaveQuestionLayout->addWidget(warningIconContainer); - - // Ask if user wants all prefabs saved. - QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save all unsaved prefabs?"); - prefabSaveQuestionFrame->setObjectName("PrefabSaveQuestionFrame"); - prefabSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); - prefabSaveQuestionFrame->setLayout(prefabSaveQuestionLayout); - contentLayout->addWidget(levelSavedMessageFrame); - contentLayout->addWidget(prefabSaveQuestionFrame); - - // Footer section begins. - QFrame* footerSeparatorLine = new QFrame(); - footerSeparatorLine->setObjectName("FooterSeparatorLine"); - footerSeparatorLine->setFrameShape(QFrame::HLine); - contentLayout->addWidget(footerSeparatorLine); - QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); - - // Provide option for user to remember their prefab save preference. - QCheckBox* saveAllPrefabsPreference = new QCheckBox("Remember my preference."); - AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreference); - QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); - footerPreferenceLayout->addWidget(saveAllPrefabsPreference); - QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); - prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); - footerPreferenceLayout->addWidget(prefabSavePreferenceHint); - footerLayout->addLayout(footerPreferenceLayout); - QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); - footerLayout->addWidget(prefabSaveConfirmationButtons); - contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); - AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); - - int prefabSaveSelection = saveModifiedMessageBox.exec(); - switch (prefabSaveSelection) - { - case QDialog::Accepted: - if (saveAllPrefabsPreference->checkState() == Qt::CheckState::Checked) - { - gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveAll); - } - prefabSystemComponentInterface->SaveAllDirtyTemplates(); - break; - case QDialog::Rejected: - if (saveAllPrefabsPreference->checkState() == Qt::CheckState::Checked) - { - gSettings.SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference::SaveNone); - } - break; - } - } + GetIEditor()->GetDocument()->ExecuteSavePrefabsDialog(); } } @@ -3239,29 +3148,80 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) bool bIsDocModified = GetIEditor()->GetDocument()->IsModified(); if (GetIEditor()->GetDocument()->IsDocumentReady() && bIsDocModified) { - QString str = QObject::tr("Level %1 has been changed. Save Level?").arg(GetIEditor()->GetGameEngine()->GetLevelName()); - int result = QMessageBox::question(AzToolsFramework::GetActiveWindow(), QObject::tr("Save Level"), str, QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); - if (QMessageBox::Yes == result) + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (!usePrefabSystemForLevels) { - if (!GetIEditor()->GetDocument()->DoFileSave()) + QString str = QObject::tr("Level %1 has been changed. Save Level?").arg(GetIEditor()->GetGameEngine()->GetLevelName()); + int result = QMessageBox::question( + AzToolsFramework::GetActiveWindow(), QObject::tr("Save Level"), str, + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel); + if (QMessageBox::Yes == result) + { + if (!GetIEditor()->GetDocument()->DoFileSave()) + { + // if the file save operation failed, assume that the user was informed of why + // already and treat it as a cancel + wasCreateLevelOperationCancelled = true; + return false; + } + + bIsDocModified = false; + } + else if (QMessageBox::No == result) + { + // Set Modified flag to false to prevent show Save unchanged dialog again + GetIEditor()->GetDocument()->SetModifiedFlag(false); + } + else if (QMessageBox::Cancel == result) { - // if the file save operation failed, assume that the user was informed of why - // already and treat it as a cancel wasCreateLevelOperationCancelled = true; return false; } + } + else + { + auto prefabSystemComponentInterface = AZ::Interface::Get(); + auto prefabSaveSelectionDialog = GetIEditor()->GetDocument()->ConstructSaveLevelDialog(); - bIsDocModified = false; - } - else if (QMessageBox::No == result) - { - // Set Modified flag to false to prevent show Save unchanged dialog again - GetIEditor()->GetDocument()->SetModifiedFlag(false); - } - else if (QMessageBox::Cancel == result) - { - wasCreateLevelOperationCancelled = true; - return false; + int prefabSaveSelection = prefabSaveSelectionDialog->exec(); + QCheckBox* saveAllPrefabsPreferenceCheckBox = + prefabSaveSelectionDialog->findChild("SaveAllPrefabsPreferenceCheckBox"); + QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() + ? AzToolsFramework::SavePrefabsPreference::SaveAll + : AzToolsFramework::SavePrefabsPreference::SaveNone; + + switch (1 - prefabSaveSelection) + { + case QDialogButtonBox::AcceptRole: + if (!GetIEditor()->GetDocument()->DoFileSave()) + { + // if the file save operation failed, assume that the user was informed of why + // already and treat it as a cancel + wasCreateLevelOperationCancelled = true; + return false; + } + if (saveAllPrefabsPreferenceCheckBox->checkState() == Qt::CheckState::Checked) + { + gSettings.SetSavePrefabsPreference(savePrefabsPreference); + gSettings.Save(); + } + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + { + prefabSystemComponentInterface->SaveAllDirtyTemplates(); + } + bIsDocModified = prefabSystemComponentInterface->AreDirtyTemplatesPresent(); + break; + case QDialogButtonBox::RejectRole: + wasCreateLevelOperationCancelled = true; + return false; + case QDialogButtonBox::InvalidRole: + // Set Modified flag to false to prevent show Save unchanged dialog again + GetIEditor()->GetDocument()->SetModifiedFlag(false); + break; + } } } diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 37a5750e1f..3301d2521a 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -697,92 +697,34 @@ bool CCryEditDoc::SaveModified() else { auto prefabSystemComponentInterface = AZ::Interface::Get(); - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); - - QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); - saveModifiedMessageBox.setObjectName("SaveDirtyLevelDialog"); - - // Main Content section begins. - QVBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); - QFrame* levelEntitiesSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); - QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); - levelEntitiesSaveQuestionFrame->setObjectName("LevelEntitiesSaveQuestionFrame"); - - // Add a warning icon next to save entities question. - levelEntitiesSaveQuestionFrame->setLayout(levelEntitiesSaveQuestionLayout); - QPixmap warningIcon(QString(":/Notifications/warning.svg")); - QLabel* warningIconContainer = new QLabel(); - warningIconContainer->setPixmap(warningIcon); - warningIconContainer->setFixedWidth(warningIcon.width()); - levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); - - // Ask user if they want to save entities in level. - QLabel* levelEntitiesSaveQuestionLabel = new QLabel("Do you want to save unsaved entities in the level?"); - levelEntitiesSaveQuestionLayout->addWidget(levelEntitiesSaveQuestionLabel); - contentLayout->addWidget(levelEntitiesSaveQuestionFrame); - - // Ask user if they want to save unsaved prefabs in the level too. - QCheckBox* saveAllPrefabsCheckbox = new QCheckBox("Save all unsaved prefabs in the level too."); - AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsCheckbox); - saveAllPrefabsCheckbox->setObjectName("SaveAllPrefabsCheckbox"); - QObject::connect( - saveAllPrefabsCheckbox, &QCheckBox::stateChanged, - [&savePrefabsPreference](int state) - { - savePrefabsPreference = static_cast(state) == Qt::CheckState::Checked - ? AzToolsFramework::SavePrefabsPreference::SaveAll - : AzToolsFramework::SavePrefabsPreference::SaveNone; - }); - contentLayout->addWidget(saveAllPrefabsCheckbox); - - // Footer section begins. - QFrame* footerSeparatorLine = new QFrame(); - footerSeparatorLine->setObjectName("FooterSeparatorLine"); - footerSeparatorLine->setFrameShape(QFrame::HLine); - contentLayout->addWidget(footerSeparatorLine); - QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); - - // Provide option for user to remember their prefab save preference. - QCheckBox* saveAllPrefabsPreferenceCheckBox = new QCheckBox("Remember my preference."); - AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreferenceCheckBox); - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + auto prefabSaveSelectionDialog = ConstructSaveLevelDialog(); + + int prefabSaveSelection = prefabSaveSelectionDialog->exec(); + QCheckBox* saveAllPrefabsPreferenceCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsPreferenceCheckBox"); + QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() + ? AzToolsFramework::SavePrefabsPreference::SaveAll + : AzToolsFramework::SavePrefabsPreference::SaveNone; + + switch (1 - prefabSaveSelection) { - saveAllPrefabsPreferenceCheckBox->setCheckState(Qt::CheckState::Checked); - saveAllPrefabsCheckbox->setCheckState(Qt::CheckState::Checked); - } - QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); - footerPreferenceLayout->addWidget(saveAllPrefabsPreferenceCheckBox); - QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); - prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); - footerPreferenceLayout->addWidget(prefabSavePreferenceHint); - footerLayout->addLayout(footerPreferenceLayout); - QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Cancel); - footerLayout->addWidget(prefabSaveConfirmationButtons); - contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); - AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); - - int prefabSaveSelection = saveModifiedMessageBox.exec(); - - if (saveAllPrefabsPreferenceCheckBox->checkState() == Qt::CheckState::Checked) - { - gSettings.SetSavePrefabsPreference(savePrefabsPreference); - prefabEditorEntityOwnershipInterface->SetSavePrefabsPreference(savePrefabsPreference); - } - - switch (prefabSaveSelection) - { - case QDialog::Accepted: + case QDialogButtonBox::AcceptRole: DoFileSave(); + if (saveAllPrefabsPreferenceCheckBox->checkState() == Qt::CheckState::Checked) + { + gSettings.SetSavePrefabsPreference(savePrefabsPreference); + gSettings.Save(); + } if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) { prefabSystemComponentInterface->SaveAllDirtyTemplates(); } return true; - case QDialog::Rejected: + case QDialogButtonBox::RejectRole: return false; + case QDialogButtonBox::InvalidRole: + SetModifiedFlag(false); + return true; } Q_UNREACHABLE(); } @@ -799,6 +741,17 @@ void CCryEditDoc::OnFileSaveAs() if (OnSaveDocument(levelFileDialog.GetFileName())) { CCryEditApp::instance()->AddToRecentFileList(levelFileDialog.GetFileName()); + bool usePrefabSystemForLevels = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult( + usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); + if (usePrefabSystemForLevels) + { + auto prefabSystemComponentInterface = AZ::Interface::Get(); + if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) + { + ExecuteSavePrefabsDialog(); + } + } } } } @@ -2308,6 +2261,194 @@ void CCryEditDoc::OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAsset } ////////////////////////////////////////////////////////////////////////// +AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() +{ + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + + AZStd::shared_ptr saveModifiedMessageBox = AZStd::make_shared(AzToolsFramework::GetActiveWindow()); + AZStd::weak_ptr saveModifiedMessageBoxWeakPtr(saveModifiedMessageBox); + // saveModifiedMessageBox.overrideWindowFlags((saveModifiedMessageBox.windowFlags()) & ~Qt::WindowCloseButtonHint); + saveModifiedMessageBox->setObjectName("SaveDirtyLevelDialog"); + + // Main Content section begins. + QVBoxLayout* contentLayout = new QVBoxLayout(saveModifiedMessageBox.get()); + QFrame* levelEntitiesSaveQuestionFrame = new QFrame(saveModifiedMessageBox.get()); + QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + levelEntitiesSaveQuestionFrame->setObjectName("LevelEntitiesSaveQuestionFrame"); + + // Add a warning icon next to save entities question. + levelEntitiesSaveQuestionFrame->setLayout(levelEntitiesSaveQuestionLayout); + QPixmap warningIcon(QString(":/Notifications/warning.svg")); + QLabel* warningIconContainer = new QLabel(); + warningIconContainer->setPixmap(warningIcon); + warningIconContainer->setFixedWidth(warningIcon.width()); + levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); + + // Ask user if they want to save entities in level. + QLabel* levelEntitiesSaveQuestionLabel = new QLabel("Do you want to save unsaved entities in the level?"); + levelEntitiesSaveQuestionLayout->addWidget(levelEntitiesSaveQuestionLabel); + contentLayout->addWidget(levelEntitiesSaveQuestionFrame); + + // Ask user if they want to save unsaved prefabs in the level too. + QCheckBox* saveAllPrefabsCheckbox = new QCheckBox("Save all unsaved prefabs in the level too."); + AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsCheckbox); + saveAllPrefabsCheckbox->setObjectName("SaveAllPrefabsCheckbox"); + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + { + saveAllPrefabsCheckbox->setCheckState(Qt::CheckState::Checked); + } + QObject::connect( + saveAllPrefabsCheckbox, &QCheckBox::stateChanged, + [&savePrefabsPreference](int state) + { + savePrefabsPreference = static_cast(state) == Qt::CheckState::Checked + ? AzToolsFramework::SavePrefabsPreference::SaveAll + : AzToolsFramework::SavePrefabsPreference::SaveNone; + }); + contentLayout->addWidget(saveAllPrefabsCheckbox); + + // Footer section begins. + QFrame* footerSeparatorLine = new QFrame(); + footerSeparatorLine->setObjectName("FooterSeparatorLine"); + footerSeparatorLine->setFrameShape(QFrame::HLine); + contentLayout->addWidget(footerSeparatorLine); + QHBoxLayout* footerLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + + // Provide option for user to remember their prefab save preference. + QCheckBox* saveAllPrefabsPreferenceCheckBox = new QCheckBox("Remember my preference."); + saveAllPrefabsPreferenceCheckBox->setObjectName("SaveAllPrefabsPreferenceCheckBox"); + AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreferenceCheckBox); + if (savePrefabsPreference != AzToolsFramework::SavePrefabsPreference::Unspecified) + { + saveAllPrefabsPreferenceCheckBox->setCheckState(Qt::CheckState::Checked); + } + QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(saveModifiedMessageBox.get()); + footerPreferenceLayout->addWidget(saveAllPrefabsPreferenceCheckBox); + QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); + prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); + footerPreferenceLayout->addWidget(prefabSavePreferenceHint); + footerLayout->addLayout(footerPreferenceLayout); + QDialogButtonBox* prefabSaveConfirmationButtons = + new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Discard | QDialogButtonBox::Cancel); + footerLayout->addWidget(prefabSaveConfirmationButtons); + contentLayout->addLayout(footerLayout); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, saveModifiedMessageBox.get(), &QDialog::accept); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, saveModifiedMessageBox.get(), &QDialog::reject); + connect( + prefabSaveConfirmationButtons, &QDialogButtonBox::clicked, saveModifiedMessageBox.get(), + [saveModifiedMessageBoxWeakPtr, prefabSaveConfirmationButtons](QAbstractButton* button) + { + int prefabSaveSelection = prefabSaveConfirmationButtons->buttonRole(button); + saveModifiedMessageBoxWeakPtr.lock()->done(prefabSaveSelection); + }); + AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.get(), QStringLiteral("style:Editor.qss")); + return saveModifiedMessageBox; +} + +void CCryEditDoc::ExecuteSavePrefabsDialog() +{ + auto prefabSystemComponentInterface = AZ::Interface::Get(); + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + + if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + { + prefabSystemComponentInterface->SaveAllDirtyTemplates(); + SetModifiedFlag(false); + } + else if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveNone) + { + if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) + { + SetModifiedFlag(true); + } + } + else // AzToolsFramework::SavePrefabsPreference::Unspecified + { + QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); + + // Main Content section begins. + saveModifiedMessageBox.setObjectName("SaveAllPrefabsDialog"); + QBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); + QFrame* levelSavedMessageFrame = new QFrame(&saveModifiedMessageBox); + QHBoxLayout* levelSavedMessageLayout = new QHBoxLayout(&saveModifiedMessageBox); + levelSavedMessageFrame->setObjectName("LevelSavedMessageFrame"); + + // Add a checkMark icon next to the level entities saved message. + QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); + QLabel* levelSavedSuccessfullyIconContainer = new QLabel(); + levelSavedSuccessfullyIconContainer->setPixmap(checkMarkIcon); + levelSavedSuccessfullyIconContainer->setFixedWidth(checkMarkIcon.width()); + + // Add a message that level entities are saved successfully. + QLabel* levelSavedSuccessfullyLabel = new QLabel("All entities inside level have been saved successfully."); + levelSavedSuccessfullyLabel->setObjectName("LevelSavedSuccessfullyLabel"); + levelSavedMessageLayout->addWidget(levelSavedSuccessfullyIconContainer); + levelSavedMessageLayout->addWidget(levelSavedSuccessfullyLabel); + levelSavedMessageFrame->setLayout(levelSavedMessageLayout); + + QFrame* prefabSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); + QHBoxLayout* prefabSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); + + // Add a warning icon next to prefabs save question. + QLabel* warningIconContainer = new QLabel(); + QPixmap warningIcon(QString(":/Notifications/warning.svg")); + warningIconContainer->setPixmap(warningIcon); + warningIconContainer->setFixedWidth(warningIcon.width()); + prefabSaveQuestionLayout->addWidget(warningIconContainer); + + // Ask if user wants all prefabs saved. + QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save all unsaved prefabs?"); + prefabSaveQuestionFrame->setObjectName("PrefabSaveQuestionFrame"); + prefabSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); + prefabSaveQuestionFrame->setLayout(prefabSaveQuestionLayout); + contentLayout->addWidget(levelSavedMessageFrame); + contentLayout->addWidget(prefabSaveQuestionFrame); + + // Footer section begins. + QFrame* footerSeparatorLine = new QFrame(); + footerSeparatorLine->setObjectName("FooterSeparatorLine"); + footerSeparatorLine->setFrameShape(QFrame::HLine); + contentLayout->addWidget(footerSeparatorLine); + QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); + + // Provide option for user to remember their prefab save preference. + QCheckBox* saveAllPrefabsPreference = new QCheckBox("Remember my preference."); + AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreference); + QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); + footerPreferenceLayout->addWidget(saveAllPrefabsPreference); + QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); + prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); + footerPreferenceLayout->addWidget(prefabSavePreferenceHint); + footerLayout->addLayout(footerPreferenceLayout); + QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); + footerLayout->addWidget(prefabSaveConfirmationButtons); + contentLayout->addLayout(footerLayout); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); + AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); + + int prefabSaveSelection = saveModifiedMessageBox.exec(); + + if (saveAllPrefabsPreference->checkState() == Qt::CheckState::Checked) + { + gSettings.SetSavePrefabsPreference(savePrefabsPreference); + gSettings.Save(); + } + switch (prefabSaveSelection) + { + case QDialog::Accepted: + prefabSystemComponentInterface->SaveAllDirtyTemplates(); + SetModifiedFlag(false); + break; + case QDialog::Rejected: + SetModifiedFlag(true); + break; + } + } +} + namespace AzToolsFramework { void CryEditDocFuncsHandler::Reflect(AZ::ReflectContext* context) diff --git a/Code/Editor/CryEditDoc.h b/Code/Editor/CryEditDoc.h index a96e9428b6..3a12b461fb 100644 --- a/Code/Editor/CryEditDoc.h +++ b/Code/Editor/CryEditDoc.h @@ -104,6 +104,12 @@ public: // Create from serialization only bool CanCloseFrame(); + //! Returns a Modal containing options to save the current level. + AZStd::shared_ptr ConstructSaveLevelDialog(); + + //! Executes a Modal asking users about their prefabs save preference. + void ExecuteSavePrefabsDialog(); + enum class FetchPolicy { DELETE_FOLDER, diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 31f5816bfc..c6f91a422a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -753,6 +753,18 @@ namespace AzToolsFramework } } + bool PrefabSystemComponent::AreDirtyTemplatesPresent() + { + for (const auto& [id, templateObject] : m_templateIdMap) + { + if (IsTemplateDirty(id)) + { + return true; + } + } + return false; + } + void PrefabSystemComponent::SaveAllDirtyTemplates() { for (auto& [id, templateObject] : m_templateIdMap) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 3539a79d54..cb95f9b367 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -183,6 +183,8 @@ namespace AzToolsFramework */ void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override; + bool AreDirtyTemplatesPresent() override; + void SaveAllDirtyTemplates() override; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index bcea8a8b2d..252c8bdb6a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -49,6 +49,7 @@ namespace AzToolsFramework virtual bool IsTemplateDirty(const TemplateId& templateId) = 0; virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; + virtual bool AreDirtyTemplatesPresent() = 0; virtual void SaveAllDirtyTemplates() = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; From 1ca67cad804c72920e842fcace94f3964f974bac Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 24 Aug 2021 18:34:51 -0700 Subject: [PATCH 008/355] Moved PrefabSavePreference settings registry code from PrefabEditorEntityOwnershipInterface to PrefabLoaderInterface Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 10 +++-- Code/Editor/CryEditDoc.cpp | 38 ++++++++++--------- Code/Editor/EditorPreferencesPageGeneral.cpp | 6 +-- Code/Editor/EditorPreferencesPageGeneral.h | 4 +- Code/Editor/Settings.cpp | 16 ++++---- Code/Editor/Settings.h | 6 +-- .../PrefabEditorEntityOwnershipInterface.h | 9 ----- .../PrefabEditorEntityOwnershipService.cpp | 20 ---------- .../PrefabEditorEntityOwnershipService.h | 3 -- .../AzToolsFramework/Prefab/PrefabLoader.cpp | 31 +++++++++++++++ .../AzToolsFramework/Prefab/PrefabLoader.h | 5 +++ .../Prefab/PrefabLoaderInterface.h | 15 ++++++++ .../Prefab/PrefabSystemComponent.cpp | 1 + 13 files changed, 95 insertions(+), 69 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 6e921833cb..b60351b6b9 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -3182,6 +3182,8 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) } else { + using namespace AzToolsFramework::Prefab; + auto prefabSystemComponentInterface = AZ::Interface::Get(); auto prefabSaveSelectionDialog = GetIEditor()->GetDocument()->ConstructSaveLevelDialog(); @@ -3189,9 +3191,9 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) QCheckBox* saveAllPrefabsPreferenceCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsPreferenceCheckBox"); QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() - ? AzToolsFramework::SavePrefabsPreference::SaveAll - : AzToolsFramework::SavePrefabsPreference::SaveNone; + SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() + ? SavePrefabsPreference::SaveAll + : SavePrefabsPreference::SaveNone; switch (1 - prefabSaveSelection) { @@ -3208,7 +3210,7 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) gSettings.SetSavePrefabsPreference(savePrefabsPreference); gSettings.Save(); } - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + if (savePrefabsPreference == SavePrefabsPreference::SaveAll) { prefabSystemComponentInterface->SaveAllDirtyTemplates(); } diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 3301d2521a..208604e2dd 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include // Editor @@ -696,15 +697,16 @@ bool CCryEditDoc::SaveModified() } else { + using namespace AzToolsFramework::Prefab; + auto prefabSystemComponentInterface = AZ::Interface::Get(); auto prefabSaveSelectionDialog = ConstructSaveLevelDialog(); int prefabSaveSelection = prefabSaveSelectionDialog->exec(); QCheckBox* saveAllPrefabsPreferenceCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsPreferenceCheckBox"); QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() - ? AzToolsFramework::SavePrefabsPreference::SaveAll - : AzToolsFramework::SavePrefabsPreference::SaveNone; + SavePrefabsPreference savePrefabsPreference = + saveAllPrefabsCheckBox->isChecked() ? SavePrefabsPreference::SaveAll : SavePrefabsPreference::SaveNone; switch (1 - prefabSaveSelection) { @@ -715,7 +717,7 @@ bool CCryEditDoc::SaveModified() gSettings.SetSavePrefabsPreference(savePrefabsPreference); gSettings.Save(); } - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + if (savePrefabsPreference == SavePrefabsPreference::SaveAll) { prefabSystemComponentInterface->SaveAllDirtyTemplates(); } @@ -2263,8 +2265,9 @@ void CCryEditDoc::OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAsset AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() { - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + using namespace AzToolsFramework::Prefab; + auto prefabLoaderInterface = AZ::Interface::Get(); + SavePrefabsPreference savePrefabsPreference = prefabLoaderInterface->GetSavePrefabsPreference(); AZStd::shared_ptr saveModifiedMessageBox = AZStd::make_shared(AzToolsFramework::GetActiveWindow()); AZStd::weak_ptr saveModifiedMessageBoxWeakPtr(saveModifiedMessageBox); @@ -2294,7 +2297,7 @@ AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() QCheckBox* saveAllPrefabsCheckbox = new QCheckBox("Save all unsaved prefabs in the level too."); AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsCheckbox); saveAllPrefabsCheckbox->setObjectName("SaveAllPrefabsCheckbox"); - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + if (savePrefabsPreference == SavePrefabsPreference::SaveAll) { saveAllPrefabsCheckbox->setCheckState(Qt::CheckState::Checked); } @@ -2302,9 +2305,8 @@ AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() saveAllPrefabsCheckbox, &QCheckBox::stateChanged, [&savePrefabsPreference](int state) { - savePrefabsPreference = static_cast(state) == Qt::CheckState::Checked - ? AzToolsFramework::SavePrefabsPreference::SaveAll - : AzToolsFramework::SavePrefabsPreference::SaveNone; + savePrefabsPreference = static_cast(state) == Qt::CheckState::Checked ? SavePrefabsPreference::SaveAll + : SavePrefabsPreference::SaveNone; }); contentLayout->addWidget(saveAllPrefabsCheckbox); @@ -2319,7 +2321,7 @@ AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() QCheckBox* saveAllPrefabsPreferenceCheckBox = new QCheckBox("Remember my preference."); saveAllPrefabsPreferenceCheckBox->setObjectName("SaveAllPrefabsPreferenceCheckBox"); AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreferenceCheckBox); - if (savePrefabsPreference != AzToolsFramework::SavePrefabsPreference::Unspecified) + if (savePrefabsPreference != SavePrefabsPreference::Unspecified) { saveAllPrefabsPreferenceCheckBox->setCheckState(Qt::CheckState::Checked); } @@ -2348,23 +2350,25 @@ AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() void CCryEditDoc::ExecuteSavePrefabsDialog() { - auto prefabSystemComponentInterface = AZ::Interface::Get(); - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - AzToolsFramework::SavePrefabsPreference savePrefabsPreference = prefabEditorEntityOwnershipInterface->GetSavePrefabsPreference(); + using namespace AzToolsFramework::Prefab; - if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveAll) + auto prefabSystemComponentInterface = AZ::Interface::Get(); + auto prefabLoaderInterface = AZ::Interface::Get(); + SavePrefabsPreference savePrefabsPreference = prefabLoaderInterface->GetSavePrefabsPreference(); + + if (savePrefabsPreference == SavePrefabsPreference::SaveAll) { prefabSystemComponentInterface->SaveAllDirtyTemplates(); SetModifiedFlag(false); } - else if (savePrefabsPreference == AzToolsFramework::SavePrefabsPreference::SaveNone) + else if (savePrefabsPreference == SavePrefabsPreference::SaveNone) { if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) { SetModifiedFlag(true); } } - else // AzToolsFramework::SavePrefabsPreference::Unspecified + else // SavePrefabsPreference::Unspecified { QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 08703ba6cc..9e0d2962a9 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -101,9 +101,9 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement( AZ::Edit::UIHandlers::ComboBox, &PrefabSettings::m_savePrefabsPreference, "Save Prefabs Preference", "When saving levels, this option controls whether and how prefabs should be saved along with the level.") - ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::Unspecified, "Unspecified") - ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::SaveAll, "Save All") - ->EnumAttribute(AzToolsFramework::SavePrefabsPreference::SaveNone, "Save None"); + ->EnumAttribute(AzToolsFramework::Prefab::SavePrefabsPreference::Unspecified, "Unspecified") + ->EnumAttribute(AzToolsFramework::Prefab::SavePrefabsPreference::SaveAll, "Save All") + ->EnumAttribute(AzToolsFramework::Prefab::SavePrefabsPreference::SaveNone, "Save None"); editContext->Class("Messaging", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Messaging::m_showDashboard, "Show Welcome to Open 3D Engine at startup", "Show Welcome to Open 3D Engine at startup") diff --git a/Code/Editor/EditorPreferencesPageGeneral.h b/Code/Editor/EditorPreferencesPageGeneral.h index 29dcefcb80..b2d652ccba 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.h +++ b/Code/Editor/EditorPreferencesPageGeneral.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include "Settings.h" @@ -61,7 +61,7 @@ private: struct PrefabSettings { AZ_TYPE_INFO(PrefabSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); - AzToolsFramework::SavePrefabsPreference m_savePrefabsPreference; + AzToolsFramework::Prefab::SavePrefabsPreference m_savePrefabsPreference; }; struct Messaging diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 0197a45cfa..d20f132848 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -255,7 +255,7 @@ SEditorSettings::SEditorSettings() g_TemporaryLevelName = nullptr; sliceSettings.dynamicByDefault = false; - prefabSettings.savePrefabsPreference = AzToolsFramework::SavePrefabsPreference::Unspecified; + prefabSettings.savePrefabsPreference = AzToolsFramework::Prefab::SavePrefabsPreference::Unspecified; } void SEditorSettings::Connect() @@ -670,9 +670,9 @@ void SEditorSettings::Save() AzFramework::ApplicationRequests::Bus::Broadcast( &AzFramework::ApplicationRequests::SetPrefabSystemEnabled, prefabSystem); - AzToolsFramework::PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipService = - AZ::Interface::Get(); - prefabEditorEntityOwnershipService->SetSavePrefabsPreference(prefabSettings.savePrefabsPreference); + AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = + AZ::Interface::Get(); + prefabLoaderInterface->SetSavePrefabsPreference(prefabSettings.savePrefabsPreference); SaveSettingsRegistryFile(); } @@ -680,9 +680,9 @@ void SEditorSettings::Save() ////////////////////////////////////////////////////////////////////////// void SEditorSettings::Load() { - AzToolsFramework::PrefabEditorEntityOwnershipInterface* prefabEditorEntityOwnershipService = - AZ::Interface::Get(); - prefabSettings.savePrefabsPreference = prefabEditorEntityOwnershipService->GetSavePrefabsPreference(); + AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = + AZ::Interface::Get(); + prefabSettings.savePrefabsPreference = prefabLoaderInterface->GetSavePrefabsPreference(); // Load from Settings Registry AzFramework::ApplicationRequests::Bus::BroadcastResult( @@ -1082,7 +1082,7 @@ void SEditorSettings::ConvertPath(const AZStd::string_view sourcePath, AZStd::st AZStd::replace(category.begin(), category.end(), '|', '\\'); } -void SEditorSettings::SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference savePrefabsPreference) +void SEditorSettings::SetSavePrefabsPreference(AzToolsFramework::Prefab::SavePrefabsPreference savePrefabsPreference) { prefabSettings.savePrefabsPreference = savePrefabsPreference; } diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index 61f89a8a05..dcc96dd2da 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -18,7 +18,7 @@ #include #include -#include +#include #include #include @@ -233,7 +233,7 @@ struct SSliceSettings struct SPrefabSettings { - AzToolsFramework::SavePrefabsPreference savePrefabsPreference; + AzToolsFramework::Prefab::SavePrefabsPreference savePrefabsPreference; }; ////////////////////////////////////////////////////////////////////////// @@ -476,7 +476,7 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING bool prefabSystem = true; ///< Toggle to enable/disable the Prefab system for level entities. - void SetSavePrefabsPreference(AzToolsFramework::SavePrefabsPreference savePrefabsPreference); + void SetSavePrefabsPreference(AzToolsFramework::Prefab::SavePrefabsPreference savePrefabsPreference); private: void SaveValue(const char* sSection, const char* sKey, int value); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index f26f80ca10..f9b8e679b5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -18,13 +18,6 @@ namespace AzToolsFramework { - enum class SavePrefabsPreference : AZ::s64 - { - Unspecified = 0, - SaveAll = 1, - SaveNone = -1 - }; - class PrefabEditorEntityOwnershipInterface { public: @@ -60,7 +53,5 @@ namespace AzToolsFramework virtual void StopPlayInEditor() = 0; virtual void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) = 0; - virtual SavePrefabsPreference GetSavePrefabsPreference() = 0; - virtual void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) = 0; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index bd8bf28de2..f336a9765c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -28,8 +28,6 @@ namespace AzToolsFramework { - static constexpr const char s_savePrefabsKey[] = "/O3DE/Preferences/SavePrefabs"; - PrefabEditorEntityOwnershipService::PrefabEditorEntityOwnershipService(const AzFramework::EntityContextId& entityContextId, AZ::SerializeContext* serializeContext) : m_entityContextId(entityContextId) @@ -610,24 +608,6 @@ namespace AzToolsFramework m_playInEditorData.m_isEnabled = false; } - SavePrefabsPreference PrefabEditorEntityOwnershipService::GetSavePrefabsPreference() - { - AZ::s64 savePrefabsPreference = static_cast(SavePrefabsPreference::Unspecified); - if (auto* registry = AZ::SettingsRegistry::Get()) - { - registry->Get(savePrefabsPreference, s_savePrefabsKey); - } - return static_cast(savePrefabsPreference); - } - - void PrefabEditorEntityOwnershipService::SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) - { - if (auto* registry = AZ::SettingsRegistry::Get()) - { - registry->Set(s_savePrefabsKey, static_cast(savePrefabsPreference)); - } - } - ////////////////////////////////////////////////////////////////////////// // Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab // development to pinpoint and replace specific calls to Slice system diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h index e94c955061..bf1199d6dd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h @@ -168,9 +168,6 @@ namespace AzToolsFramework void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) override; - SavePrefabsPreference GetSavePrefabsPreference() override; - void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) override; - protected: AZ::SliceComponent::SliceInstanceAddress GetOwningSlice() override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 0a9c937832..d8c308528d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -25,6 +25,19 @@ namespace AzToolsFramework { namespace Prefab { + static constexpr const char s_savePrefabsKey[] = "/O3DE/Preferences/SavePrefabs"; + + void PrefabLoader::Reflect(AZ::ReflectContext* context) + { + if (auto* serializeContext = azrtti_cast(context)) + { + serializeContext->Enum() + ->Value("Unspecified", SavePrefabsPreference::Unspecified) + ->Value("SaveAll", SavePrefabsPreference::SaveAll) + ->Value("SaveNone", SavePrefabsPreference::SaveNone); + } + } + void PrefabLoader::RegisterPrefabLoaderInterface() { m_prefabSystemComponentInterface = AZ::Interface::Get(); @@ -656,6 +669,24 @@ namespace AzToolsFramework return finalPath; } + SavePrefabsPreference PrefabLoader::GetSavePrefabsPreference() + { + SavePrefabsPreference savePrefabsPreference = SavePrefabsPreference::Unspecified; + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->GetObject(savePrefabsPreference, s_savePrefabsKey); + } + return static_cast(savePrefabsPreference); + } + + void PrefabLoader::SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) + { + if (auto* registry = AZ::SettingsRegistry::Get()) + { + registry->SetObject(s_savePrefabsKey, savePrefabsPreference); + } + } + AZ::IO::Path PrefabLoaderInterface::GeneratePath() { return AZStd::string::format("Prefab_%s", AZ::Entity::MakeId().ToString().c_str()); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h index 007933c021..e97eb694c2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h @@ -39,6 +39,8 @@ namespace AzToolsFramework AZ_CLASS_ALLOCATOR(PrefabLoader, AZ::SystemAllocator, 0); AZ_RTTI(PrefabLoader, "{A302B072-4DC4-4B7E-9188-226F56A3429C8}", PrefabLoaderInterface); + static void Reflect(AZ::ReflectContext* context); + ////////////////////////////////////////////////////////////////////////// // PrefabLoaderInterface interface implementation @@ -108,6 +110,9 @@ namespace AzToolsFramework //! Returns if the path is a valid path for a prefab static bool IsValidPrefabPath(AZ::IO::PathView path); + SavePrefabsPreference GetSavePrefabsPreference() override; + void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) override; + private: /** * Copies the template dom provided and manipulates it into the proper format to be saved to disk. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h index 3c60bea18c..938ad00809 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h @@ -17,6 +17,13 @@ namespace AzToolsFramework { namespace Prefab { + enum class SavePrefabsPreference : AZ::u8 + { + Unspecified = 0, + SaveAll = 1, + SaveNone = 2 + }; + /*! * PrefabLoaderInterface * Interface for saving/loading Prefab files. @@ -84,6 +91,9 @@ namespace AzToolsFramework //! The path will always use the '/' separator. virtual AZ::IO::Path GenerateRelativePath(AZ::IO::PathView path) = 0; + virtual SavePrefabsPreference GetSavePrefabsPreference() = 0; + virtual void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) = 0; + protected: // Generates a new path @@ -93,3 +103,8 @@ namespace AzToolsFramework } // namespace Prefab } // namespace AzToolsFramework +namespace AZ +{ + AZ_TYPE_INFO_SPECIALIZE(AzToolsFramework::Prefab::SavePrefabsPreference, "{7E61EA82-4DE4-4A3F-945F-C8FEDC1114B5}"); +} + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index c6f91a422a..928158dae0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -57,6 +57,7 @@ namespace AzToolsFramework AzToolsFramework::Prefab::PrefabConversionUtils::PrefabCatchmentProcessor::Reflect(context); AzToolsFramework::Prefab::PrefabConversionUtils::EditorInfoRemover::Reflect(context); PrefabPublicRequestHandler::Reflect(context); + PrefabLoader::Reflect(context); AZ::SerializeContext* serialize = azrtti_cast(context); if (serialize) From a13fb3c13aaee60fca81a9ec86f556e5df3bba57 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 24 Aug 2021 19:21:06 -0700 Subject: [PATCH 009/355] Added some comments and some minor fixes Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 7 +- Code/Editor/CryEditDoc.cpp | 3 +- Code/Editor/SaveAllPrefabsDialog.cpp | 29 +++++ Code/Editor/SaveAllPrefabsDialog.h | 29 +++++ Code/Editor/SaveAllPrefabsDialog.ui | 107 ++++++++++++++++++ .../PrefabEditorEntityOwnershipInterface.h | 1 + .../PrefabEditorEntityOwnershipService.cpp | 1 - .../AzToolsFramework/Prefab/PrefabLoader.cpp | 2 +- 8 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 Code/Editor/SaveAllPrefabsDialog.cpp create mode 100644 Code/Editor/SaveAllPrefabsDialog.h create mode 100644 Code/Editor/SaveAllPrefabsDialog.ui diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index b60351b6b9..83a98ca67b 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -736,7 +736,11 @@ void CCryEditApp::OnFileSave() if (usePrefabSystemForLevels) { - GetIEditor()->GetDocument()->ExecuteSavePrefabsDialog(); + auto prefabSystemComponentInterface = AZ::Interface::Get(); + if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) + { + GetIEditor()->GetDocument()->ExecuteSavePrefabsDialog(); + } } } @@ -3195,6 +3199,7 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) ? SavePrefabsPreference::SaveAll : SavePrefabsPreference::SaveNone; + // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 208604e2dd..3e619aba24 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -707,7 +707,8 @@ bool CCryEditDoc::SaveModified() QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() ? SavePrefabsPreference::SaveAll : SavePrefabsPreference::SaveNone; - + + // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: diff --git a/Code/Editor/SaveAllPrefabsDialog.cpp b/Code/Editor/SaveAllPrefabsDialog.cpp new file mode 100644 index 0000000000..4a344b32ae --- /dev/null +++ b/Code/Editor/SaveAllPrefabsDialog.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + #include + #include "SaveAllPrefabsDialog.h" + #include + +AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING +#include +AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING + +SaveAllPrefabsDialog::SaveAllPrefabsDialog(QWidget* parent) + : QDialog(parent) + , ui(new Ui::SaveAllPrefabsDialog) +{ + ui->setupUi(this); + AzQtComponents::CheckBox::applyToggleSwitchStyle(ui->saveAllPrefabsCheckBox); + AzQtComponents::CheckBox::applyToggleSwitchStyle(ui->rememberPrefabSavePreferenceCheckBox); +} + +SaveAllPrefabsDialog::~SaveAllPrefabsDialog() +{ + delete ui; +} diff --git a/Code/Editor/SaveAllPrefabsDialog.h b/Code/Editor/SaveAllPrefabsDialog.h new file mode 100644 index 0000000000..807f902309 --- /dev/null +++ b/Code/Editor/SaveAllPrefabsDialog.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include + +namespace Ui +{ + class SaveAllPrefabsDialog; +} + + + class SaveAllPrefabsDialog : public QDialog + { + public: + SaveAllPrefabsDialog(QWidget* pParent = nullptr); + ~SaveAllPrefabsDialog(); + + private: + Ui::SaveAllPrefabsDialog* ui; + }; + diff --git a/Code/Editor/SaveAllPrefabsDialog.ui b/Code/Editor/SaveAllPrefabsDialog.ui new file mode 100644 index 0000000000..8d1e70b935 --- /dev/null +++ b/Code/Editor/SaveAllPrefabsDialog.ui @@ -0,0 +1,107 @@ + + + SaveAllPrefabsDialog + + + + 0 + 0 + 800 + 600 + + + + Dialog + + + + + + Changes in level saved successfully + + + + + + + Second text + + + + + + + + + CheckBox + + + + + + + TextLabel + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + + CheckBox + + + + + + + TextLabel + + + + + + + + + TextLabel + + + + + + + + + PushButton + + + + + + + PushButton + + + + + + + + + + diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index f9b8e679b5..1cd36e8055 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -18,6 +18,7 @@ namespace AzToolsFramework { + class PrefabEditorEntityOwnershipInterface { public: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index f336a9765c..7df1e1b5c1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index d8c308528d..2f0a0601b9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -676,7 +676,7 @@ namespace AzToolsFramework { registry->GetObject(savePrefabsPreference, s_savePrefabsKey); } - return static_cast(savePrefabsPreference); + return savePrefabsPreference; } void PrefabLoader::SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) From 06b1d9afbb697248e958e66a05ed6bc650c78655 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 24 Aug 2021 19:25:06 -0700 Subject: [PATCH 010/355] Delete some accidentally committed local ui work Signed-off-by: srikappa-amzn --- Code/Editor/SaveAllPrefabsDialog.cpp | 29 -------- Code/Editor/SaveAllPrefabsDialog.h | 29 -------- Code/Editor/SaveAllPrefabsDialog.ui | 107 --------------------------- 3 files changed, 165 deletions(-) delete mode 100644 Code/Editor/SaveAllPrefabsDialog.cpp delete mode 100644 Code/Editor/SaveAllPrefabsDialog.h delete mode 100644 Code/Editor/SaveAllPrefabsDialog.ui diff --git a/Code/Editor/SaveAllPrefabsDialog.cpp b/Code/Editor/SaveAllPrefabsDialog.cpp deleted file mode 100644 index 4a344b32ae..0000000000 --- a/Code/Editor/SaveAllPrefabsDialog.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - #include - #include "SaveAllPrefabsDialog.h" - #include - -AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING -#include -AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - -SaveAllPrefabsDialog::SaveAllPrefabsDialog(QWidget* parent) - : QDialog(parent) - , ui(new Ui::SaveAllPrefabsDialog) -{ - ui->setupUi(this); - AzQtComponents::CheckBox::applyToggleSwitchStyle(ui->saveAllPrefabsCheckBox); - AzQtComponents::CheckBox::applyToggleSwitchStyle(ui->rememberPrefabSavePreferenceCheckBox); -} - -SaveAllPrefabsDialog::~SaveAllPrefabsDialog() -{ - delete ui; -} diff --git a/Code/Editor/SaveAllPrefabsDialog.h b/Code/Editor/SaveAllPrefabsDialog.h deleted file mode 100644 index 807f902309..0000000000 --- a/Code/Editor/SaveAllPrefabsDialog.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once - -#include -#include - -namespace Ui -{ - class SaveAllPrefabsDialog; -} - - - class SaveAllPrefabsDialog : public QDialog - { - public: - SaveAllPrefabsDialog(QWidget* pParent = nullptr); - ~SaveAllPrefabsDialog(); - - private: - Ui::SaveAllPrefabsDialog* ui; - }; - diff --git a/Code/Editor/SaveAllPrefabsDialog.ui b/Code/Editor/SaveAllPrefabsDialog.ui deleted file mode 100644 index 8d1e70b935..0000000000 --- a/Code/Editor/SaveAllPrefabsDialog.ui +++ /dev/null @@ -1,107 +0,0 @@ - - - SaveAllPrefabsDialog - - - - 0 - 0 - 800 - 600 - - - - Dialog - - - - - - Changes in level saved successfully - - - - - - - Second text - - - - - - - - - CheckBox - - - - - - - TextLabel - - - - - - - - - Qt::Horizontal - - - - - - - - - - - - - CheckBox - - - - - - - TextLabel - - - - - - - - - TextLabel - - - - - - - - - PushButton - - - - - - - PushButton - - - - - - - - - - From 89a415d50cbbfe08bcb4e8f1733c5cb6b0d0658e Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 24 Aug 2021 19:56:29 -0700 Subject: [PATCH 011/355] Removed az::u8 from Prefab save preference Enum Signed-off-by: srikappa-amzn --- .../AzToolsFramework/Prefab/PrefabLoaderInterface.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h index 938ad00809..57ef6d6a3a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h @@ -17,11 +17,11 @@ namespace AzToolsFramework { namespace Prefab { - enum class SavePrefabsPreference : AZ::u8 + enum class SavePrefabsPreference { - Unspecified = 0, - SaveAll = 1, - SaveNone = 2 + Unspecified, + SaveAll, + SaveNone }; /*! From 5e4ec8c421d20c6ceb105ca7bfd1154441a2f5fb Mon Sep 17 00:00:00 2001 From: evanchia Date: Fri, 27 Aug 2021 10:14:22 -0700 Subject: [PATCH 012/355] adding missing param to Jenkins benchmark step Signed-off-by: evanchia --- scripts/build/Jenkins/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile index 95bb92a192..d3ef7ea8de 100644 --- a/scripts/build/Jenkins/Jenkinsfile +++ b/scripts/build/Jenkins/Jenkinsfile @@ -378,7 +378,7 @@ def TestMetrics(Map pipelineConfig, String workspace, String branchName, String } } -def BenchmarkMetrics(String workspace, String branchName, String outputDirectory) { +def BenchmarkMetrics(Map pipelineConfig, String workspace, String branchName, String outputDirectory) { catchError(buildResult: null, stageResult: null) { def cmakeBuildDir = [workspace, ENGINE_REPOSITORY_NAME, outputDirectory].join('/') dir("${workspace}/${ENGINE_REPOSITORY_NAME}") { @@ -452,7 +452,7 @@ def CreateTestMetricsStage(Map pipelineConfig, String branchName, Map environmen return { stage("${buildJobName}_metrics") { TestMetrics(pipelineConfig, environmentVars['WORKSPACE'], branchName, env.DEFAULT_REPOSITORY_NAME, buildJobName, outputDirectory, configuration) - BenchmarkMetrics(environmentVars['WORKSPACE'], branchName, outputDirectory) + BenchmarkMetrics(pipelineConfig, environmentVars['WORKSPACE'], branchName, outputDirectory) } } } From 0ae25fe7e7d560c07a53f0df29b328246b1a2e2f Mon Sep 17 00:00:00 2001 From: jromnoa Date: Fri, 27 Aug 2021 20:35:11 -0700 Subject: [PATCH 013/355] add extra timeout value as well as some extra time.sleep() calls in an attempt to fix the test (seems race condition related) Signed-off-by: jromnoa --- .../atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py | 2 ++ .../Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py index b3c51ca912..130482cb99 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py @@ -67,6 +67,7 @@ def run(): material_editor.save_document_as_child(document_id, target_path) material_editor.wait_for_condition(lambda: os.path.exists(target_path), 2.0) print(f"New asset created: {os.path.exists(target_path)}") + time.sleep(2.0) # Verify if the newly created document is open new_document_id = material_editor.open_material(target_path) @@ -101,6 +102,7 @@ def run(): expected_color = math.Color(0.25, 0.25, 0.25, 1.0) material_editor.set_property(document_id, property_name, expected_color) material_editor.save_document(document_id) + time.sleep(2.0) # 7) Test Case: Saving as a New Material # Assign new color to the material file and save the document as copy diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py index bb7a16ad6b..646c20a84f 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py @@ -299,7 +299,7 @@ class TestMaterialEditorBasicTests(object): generic_launcher, "hydra_AtomMaterialEditor_BasicTests.py", run_python="--runpython", - timeout=80, + timeout=EDITOR_TIMEOUT, expected_lines=expected_lines, unexpected_lines=unexpected_lines, halt_on_unexpected=True, From dbf12ae697b4ee44c11333d8b8aae7a233e24d6e Mon Sep 17 00:00:00 2001 From: Chris Galvan Date: Mon, 30 Aug 2021 09:43:11 -0500 Subject: [PATCH 014/355] Updated remaining Project Configurator references to Project Manager. Signed-off-by: Chris Galvan --- Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp | 4 ++-- .../SceneAPI/SceneCore/Components/SceneSystemComponent.h | 2 +- Code/Tools/SceneAPI/SceneCore/DllMain.cpp | 2 +- Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp | 2 +- .../Source/Editor/Plugins/Cloth/ClothJointInspectorPlugin.cpp | 2 +- .../Plugins/HitDetection/HitDetectionJointInspectorPlugin.cpp | 2 +- .../Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp | 2 +- .../Editor/Plugins/SimulatedObject/SimulatedJointWidget.cpp | 2 +- Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp | 2 +- .../Components/SceneProcessingConfigSystemComponent.cpp | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp b/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp index 39dd482cb7..5358dd46bd 100644 --- a/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp +++ b/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp @@ -126,9 +126,9 @@ namespace AzFramework * 1. Key exists, value is identical -> do nothing * This can occur if a user modifies a config file while the tooling is open. * Example: - * 1) Load Project Configurator. + * 1) Load Project Manager. * 2) Modify your bootstrap.cfg to a different project. - * 3) Tell Project Configurator to set your project to the project you set in #2. + * 3) Tell Project Manager to set your project to the project you set in #2. * 2. Key exists, value is missing -> stomps over key with new key value pair. * 3. Key exists, value is different -> stomps over key with new key value pair. Ignores previous values. * 4. Key does not exist, header is not required -> insert "key=value" at the end of file. diff --git a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h index a9ce974a59..3f47424328 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h @@ -19,7 +19,7 @@ namespace AZ { // Scene system components are components that can be used to create system components // in situations where the full initialization and/or construction of regular - // system components don't apply such as in the Project Configurator's advanced + // system components don't apply such as in the Project Manager's advanced // settings and the ResourceCompilerScene. class SCENE_CORE_CLASS SceneSystemComponent : public AZ::Component diff --git a/Code/Tools/SceneAPI/SceneCore/DllMain.cpp b/Code/Tools/SceneAPI/SceneCore/DllMain.cpp index 27a5ee238f..408b516f84 100644 --- a/Code/Tools/SceneAPI/SceneCore/DllMain.cpp +++ b/Code/Tools/SceneAPI/SceneCore/DllMain.cpp @@ -137,7 +137,7 @@ namespace AZ // Check if this library hasn't already been reflected. This can happen as the ResourceCompilerScene needs // to explicitly load and reflect the SceneAPI libraries to discover the available extension, while - // Gems with system components need to do the same in the Project Configurator. + // Gems with system components need to do the same in the Project Manager. if (context && (context->IsRemovingReflection() || !context->FindClassData(AZ::SceneAPI::DataTypes::IGroup::TYPEINFO_Uuid()))) { AZ::SceneAPI::DataTypes::IManifestObject::Reflect(context); diff --git a/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp b/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp index e32eff3471..7d0b5c72b1 100644 --- a/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp +++ b/Code/Tools/SceneAPI/SceneData/ReflectionRegistrar.cpp @@ -49,7 +49,7 @@ namespace AZ { // Check if this library hasn't already been reflected. This can happen as the ResourceCompilerScene needs // to explicitly load and reflect the SceneAPI libraries to discover the available extension, while - // Gems with system components need to do the same in the Project Configurator. + // Gems with system components need to do the same in the Project Manager. if (!context->IsRemovingReflection() && context->FindClassData(SceneData::MeshGroup::TYPEINFO_Uuid())) { return; diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/Cloth/ClothJointInspectorPlugin.cpp b/Gems/EMotionFX/Code/Source/Editor/Plugins/Cloth/ClothJointInspectorPlugin.cpp index 861100b073..e1a58f1f44 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/Cloth/ClothJointInspectorPlugin.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/Cloth/ClothJointInspectorPlugin.cpp @@ -71,7 +71,7 @@ namespace EMotionFX } else { - m_dock->setWidget(CreateErrorContentWidget("Cloth collider editor depends on the NVIDIA Cloth gem. Please enable it in the project configurator.")); + m_dock->setWidget(CreateErrorContentWidget("Cloth collider editor depends on the NVIDIA Cloth gem. Please enable it in the Project Manager.")); } return true; diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/HitDetection/HitDetectionJointInspectorPlugin.cpp b/Gems/EMotionFX/Code/Source/Editor/Plugins/HitDetection/HitDetectionJointInspectorPlugin.cpp index c69fdd9393..b7cf3ea13d 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/HitDetection/HitDetectionJointInspectorPlugin.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/HitDetection/HitDetectionJointInspectorPlugin.cpp @@ -57,7 +57,7 @@ namespace EMotionFX } else { - m_dock->setWidget(CreateErrorContentWidget("Hit detection collider editor depends on the PhysX gem. Please enable it in the project configurator.")); + m_dock->setWidget(CreateErrorContentWidget("Hit detection collider editor depends on the PhysX gem. Please enable it in the Project Manager.")); } return true; diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp b/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp index 5324950c82..171100592d 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp @@ -86,7 +86,7 @@ namespace EMotionFX } else { - m_dock->setWidget(CreateErrorContentWidget("Ragdoll editor depends on the PhysX gem. Please enable it in the project configurator.")); + m_dock->setWidget(CreateErrorContentWidget("Ragdoll editor depends on the PhysX gem. Please enable it in the Project Manager.")); } return true; diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedJointWidget.cpp b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedJointWidget.cpp index 1e35a084fa..ce9eb1cbae 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedJointWidget.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/SimulatedObject/SimulatedJointWidget.cpp @@ -389,7 +389,7 @@ namespace EMotionFX { QLabel* noColliders = new QLabel( "To adjust the properties of the Simulated Object Colliders, " - "enable the PhysX gem via the Project Configurator"); + "enable the PhysX gem via the Project Manager"); colliderWidgetLayout->addWidget(noColliders); } diff --git a/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp b/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp index 92c6ba5a05..2c12344873 100644 --- a/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp +++ b/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp @@ -42,7 +42,7 @@ namespace SceneLoggingExample } // In this example, no system components are added. You can use system components - // to set global settings for this gem from the Project Configurator. + // to set global settings for this gem from the Project Manager. // For functionality that should always be available to the SceneAPI, we recommend // that you use a BehaviorComponent instead. AZ::ComponentTypeList GetRequiredSystemComponents() const override diff --git a/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp b/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp index a648859b92..93d8fc6a06 100644 --- a/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp +++ b/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp @@ -34,7 +34,7 @@ namespace AZ ActivateSceneModule(SceneProcessing::s_sceneDataModule); ActivateSceneModule(SceneProcessing::s_sceneBuilderModule); - // Defaults in case there's no config setup in the Project Configurator. + // Defaults in case there's no config setup in the Project Manager. m_softNames.push_back(aznew NodeSoftNameSetting("^.*_[Ll][Oo][Dd]1(_optimized)?$", PatternMatcher::MatchApproach::Regex, "LODMesh1", true)); m_softNames.push_back(aznew NodeSoftNameSetting("^.*_[Ll][Oo][Dd]2(_optimized)?$", PatternMatcher::MatchApproach::Regex, "LODMesh2", true)); m_softNames.push_back(aznew NodeSoftNameSetting("^.*_[Ll][Oo][Dd]3(_optimized)?$", PatternMatcher::MatchApproach::Regex, "LODMesh3", true)); From 9688832adc7f02d832c15764db572177ed3d8b37 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Mon, 30 Aug 2021 08:30:56 -0700 Subject: [PATCH 015/355] Initial fixes for graph update tool Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Builder/ScriptCanvasBuilderWorker.cpp | 2 +- .../Code/Editor/Components/EditorGraph.cpp | 5 +- .../Code/Editor/Components/GraphUpgrade.cpp | 21 +- .../Assets/ScriptCanvasAssetHandler.h | 2 +- .../ScriptCanvas/Components/EditorGraph.h | 7 +- .../ScriptCanvas/Components/GraphUpgrade.h | 11 +- .../Windows/Tools/UpgradeTool/UpgradeTool.cpp | 118 +------ .../Windows/Tools/UpgradeTool/UpgradeTool.h | 15 +- .../Tools/UpgradeTool/VersionExplorer.cpp | 318 ++++++++++-------- .../Tools/UpgradeTool/VersionExplorer.h | 32 +- .../Tools/UpgradeTool/VersionExplorer.ui | 73 ++-- .../Code/Include/ScriptCanvas/Core/Core.h | 2 + 12 files changed, 274 insertions(+), 332 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index 536a678577..7dddf93818 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -222,7 +222,7 @@ namespace ScriptCanvasBuilder bool pathFound = false; AZStd::string relativePath; AzToolsFramework::AssetSystemRequestBus::BroadcastResult - (pathFound + ( pathFound , &AzToolsFramework::AssetSystem::AssetSystemRequest::GetRelativeProductPathFromFullSourceOrProductPath , request.m_fullPath.c_str(), relativePath); diff --git a/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp b/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp index 325c348d9c..f52503fa7d 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/EditorGraph.cpp @@ -3476,11 +3476,12 @@ namespace ScriptCanvasEditor m_focusHelper.SetActiveGraph(GetGraphCanvasGraphId()); } - bool Graph::UpgradeGraph(const AZ::Data::Asset& asset) + bool Graph::UpgradeGraph(const AZ::Data::Asset& asset, UpgradeRequest request, bool isVerbose) { m_upgradeSM.SetAsset(asset); + m_upgradeSM.SetVerbose(isVerbose); - if (!GetVersion().IsLatest()) + if (request == UpgradeRequest::Forced || !GetVersion().IsLatest()) { m_upgradeSM.Run(Start::StateID()); return true; diff --git a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp index 9df6311a92..d89aac8ca3 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp @@ -79,7 +79,7 @@ namespace ScriptCanvasEditor { if (node->GetComponents().empty()) { - AZ_TracePrintf("Script Canvas", "Removing node due to missing components: %s\nVerify that all gems that this script relies on are enabled\n", node->GetName().c_str()); + AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "Removing node due to missing components: %s\nVerify that all gems that this script relies on are enabled\n", node->GetName().c_str()); nodesToRemove.push_back(node); } @@ -193,7 +193,7 @@ namespace ScriptCanvasEditor } else { - AZ_Warning("ScriptCanvas", false, "Could not find ScriptCanvas Node with id %llu", static_cast(scriptCanvasSourceEndpoint.GetNodeId())); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Could not find ScriptCanvas Node with id %llu", static_cast(scriptCanvasSourceEndpoint.GetNodeId())); } AZ::EntityId graphCanvasSourceSlotId; @@ -213,7 +213,7 @@ namespace ScriptCanvasEditor if (!graphCanvasSourceSlotId.IsValid()) { - AZ_Warning("ScriptCanvas", sm->m_deletedNodes.count(scriptCanvasSourceEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasSourceEndpoint.GetNodeId().ToString().c_str()); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_deletedNodes.count(scriptCanvasSourceEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasSourceEndpoint.GetNodeId().ToString().c_str()); graph->DisconnectById(connectionId); continue; } @@ -229,7 +229,7 @@ namespace ScriptCanvasEditor } else { - AZ_Warning("ScriptCanvas", false, "Could not find ScriptCanvas Node with id %llu", static_cast(scriptCanvasSourceEndpoint.GetNodeId())); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Could not find ScriptCanvas Node with id %llu", static_cast(scriptCanvasSourceEndpoint.GetNodeId())); } SlotMappingRequestBus::EventResult(graphCanvasTargetEndpoint.m_slotId, graphCanvasTargetEndpoint.GetNodeId(), &SlotMappingRequests::MapToGraphCanvasId, scriptCanvasTargetEndpoint.GetSlotId()); @@ -245,7 +245,7 @@ namespace ScriptCanvasEditor if (!graphCanvasTargetEndpoint.IsValid()) { - AZ_Warning("ScriptCanvas", sm->m_deletedNodes.count(scriptCanvasTargetEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasTargetEndpoint.GetNodeId().ToString().c_str()); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_deletedNodes.count(scriptCanvasTargetEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasTargetEndpoint.GetNodeId().ToString().c_str()); graph->DisconnectById(connectionId); continue; } @@ -422,7 +422,7 @@ namespace ScriptCanvasEditor if (!sm->m_updateReport.IsEmpty()) { // currently, it is expected that there are no deleted old slots, those need manual correction - AZ_Error("ScriptCanvas", sm->m_updateReport.m_deletedOldSlots.empty(), "Graph upgrade path: If old slots are deleted, manual upgrading is required"); + AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_updateReport.m_deletedOldSlots.empty(), "Graph upgrade path: If old slots are deleted, manual upgrading is required"); UpdateConnectionStatus(*graph, sm->m_updateReport); } } @@ -690,6 +690,10 @@ namespace ScriptCanvasEditor ////////////////////////////////////////////////////////////////////// // State Machine Internals + bool StateMachine::GetVerbose() const + { + return m_isVerbose; + } void StateMachine::OnSystemTick() { @@ -743,7 +747,10 @@ namespace ScriptCanvasEditor AZ::SystemTickBus::Handler::BusConnect(); } - } + void StateMachine::SetVerbose(bool isVerbose) + { + m_isVerbose = isVerbose; + } } diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h index c0af2d59ac..a0e00b40fd 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h @@ -49,7 +49,7 @@ namespace ScriptCanvasEditor // Called by the asset database to perform actual asset save. Returns true if successful otherwise false (default - as we don't require support save). bool SaveAssetData(const AZ::Data::Asset& asset, AZ::IO::GenericStream* stream) override; bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream); - bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream , AZ::DataStream::StreamType streamType); + bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream, AZ::DataStream::StreamType streamType); // Called by the asset database when an asset should be deleted. void DestroyAsset(AZ::Data::AssetPtr ptr) override; diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h index bf654a4440..cb6689091b 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h @@ -230,7 +230,12 @@ namespace ScriptCanvasEditor ///// EditorGraphUpgradeMachine m_upgradeSM; - bool UpgradeGraph(const AZ::Data::Asset& asset); + enum UpgradeRequest + { + IfOutOfDate, + Forced + }; + bool UpgradeGraph(const AZ::Data::Asset& asset, UpgradeRequest request, bool isVerbose = true); void ConnectGraphCanvasBuses(); void DisconnectGraphCanvasBuses(); /////// diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h index df7fa0535f..d39bb30f3c 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h @@ -131,8 +131,15 @@ namespace ScriptCanvasEditor void OnSystemTick() override; + bool GetVerbose() const; + + void SetVerbose(bool isVerbose); + AZStd::shared_ptr m_currentState = nullptr; AZStd::vector> m_states; + + private: + bool m_isVerbose = true; }; //! This state machine will collect and share a variety of data from the EditorGraph @@ -347,14 +354,14 @@ namespace ScriptCanvasEditor { if (m_verbose) { - char sBuffer[1024]; + char sBuffer[2048]; va_list ArgList; va_start(ArgList, format); azvsnprintf(sBuffer, sizeof(sBuffer), format, ArgList); sBuffer[sizeof(sBuffer) - 1] = '\0'; va_end(ArgList); - AZ_TracePrintf("Script Canvas", "%s\n", sBuffer); + AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "%s\n", sBuffer); } } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.cpp index e069c509ce..09f77ac9a8 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.cpp @@ -92,7 +92,7 @@ namespace ScriptCanvasEditor void UpgradeTool::closeEvent(QCloseEvent* event) { - m_keepEditorAlive.reset(); + // m_keepEditorAlive.reset(); DisconnectBuses(); @@ -110,7 +110,7 @@ namespace ScriptCanvasEditor { setWindowFlag(Qt::WindowCloseButtonHint, false); - m_keepEditorAlive = AZStd::make_unique(); + // m_keepEditorAlive = AZStd::make_unique(); UpdateSettings(); @@ -581,74 +581,6 @@ namespace ScriptCanvasEditor accept(); } - template - AZ::Entity* UpgradeGraph(AZ::Data::Asset& asset, UpgradeTool* upgradeTool) - { - AssetType* scriptCanvasAsset = asset.GetAs(); - AZ_Assert(scriptCanvasAsset, "Unable to get the asset of type: %s", azrtti_typeid().template ToString().c_str()); - - if (!scriptCanvasAsset) - { - return nullptr; - } - - AZ::Entity* scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity(); - AZ_Assert(scriptCanvasEntity, "The Script Canvas asset must have a valid entity"); - if (!scriptCanvasEntity) - { - return nullptr; - } - - auto graphComponent = scriptCanvasEntity->FindComponent(); - AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component"); - - bool isLatest = graphComponent->GetVersion().IsLatest(); - if (isLatest) - { - ++upgradeTool->SkippedGraphCount(); - - // No need to upgrade - return nullptr; - } - - - AZ::Entity* queryEntity = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(queryEntity, &AZ::ComponentApplicationRequests::FindEntity, scriptCanvasEntity->GetId()); - if (queryEntity) - { - if (queryEntity->GetState() == AZ::Entity::State::Active) - { - queryEntity->Deactivate(); - } - - scriptCanvasEntity = queryEntity; - } - - if (scriptCanvasEntity->GetState() == AZ::Entity::State::Constructed) - { - scriptCanvasEntity->Init(); - } - - if (scriptCanvasEntity->GetState() == AZ::Entity::State::Init) - { - scriptCanvasEntity->Activate(); - } - - if (graphComponent) - { - if (!graphComponent->UpgradeGraph(asset)) - { - ++upgradeTool->SkippedGraphCount(); - } - else - { - ++upgradeTool->UpgradedGraphCount(); - } - } - - return scriptCanvasEntity; - } - void UpgradeTool::SaveLog() { AZStd::string outputFileName = AZStd::string::format("@devroot@/ScriptCanvasUpgradeReport.html"); @@ -688,29 +620,9 @@ namespace ScriptCanvasEditor outputFile.Close(); } - AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset& asset) + AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset&) { - using namespace ScriptCanvasEditor; - - AZ_Assert(asset.IsReady(), "The asset must be ready by now"); - - AZStd::lock_guard myLocker(m_mutex); - - AZ::Entity* scriptCanvasEntity = nullptr; - if (asset.GetType() == azrtti_typeid()) - { - scriptCanvasEntity = UpgradeGraph(asset, this); - } - - if (!scriptCanvasEntity) - { - // This may happen if the graph failed or did not need to upgrade - AZ_TracePrintf("Script Canvas", "%s .. up to date!\n", asset.GetHint().c_str()); - return nullptr; - } - - // The rest will happen when we get notified that the graph is done. - return scriptCanvasEntity; + return nullptr; } void UpgradeTool::RetryMove(AZ::Data::Asset& asset, const AZStd::string& source, const AZStd::string& target) @@ -780,28 +692,6 @@ namespace ScriptCanvasEditor return false; } - ScriptCanvasEditor::EditorKeepAlive::EditorKeepAlive() - { - ISystem* system = nullptr; - CrySystemRequestBus::BroadcastResult(system, &CrySystemRequestBus::Events::GetCrySystem); - - m_edKeepEditorActive = system->GetIConsole()->GetCVar("ed_KeepEditorActive"); - - if (m_edKeepEditorActive) - { - m_keepEditorActive = m_edKeepEditorActive->GetIVal(); - m_edKeepEditorActive->Set(1); - } - } - - ScriptCanvasEditor::EditorKeepAlive::~EditorKeepAlive() - { - if (m_edKeepEditorActive) - { - m_edKeepEditorActive->Set(m_keepEditorActive); - } - } - #include } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h index d771de4dd1..be00198457 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h @@ -38,18 +38,7 @@ namespace Ui namespace ScriptCanvasEditor { - //! Scoped utility to set and restore the "ed_KeepEditorActive" CVar in order to allow - //! the upgrade tool to work even if the editor is not in the foreground - class EditorKeepAlive - { - public: - EditorKeepAlive(); - ~EditorKeepAlive(); - - private: - int m_keepEditorActive; - ICVar* m_edKeepEditorActive; - }; + class KeepEditorAlive; //! A tool that collects and upgrades all Script Canvas graphs in the asset catalog class UpgradeTool @@ -140,7 +129,7 @@ namespace ScriptCanvasEditor AZStd::unique_ptr m_ui; AZStd::recursive_mutex m_mutex; - AZStd::unique_ptr m_keepEditorAlive; + // AZStd::unique_ptr m_keepEditorAlive; AZStd::vector m_logs; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index efa7aded40..a7dbac759e 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -6,40 +6,89 @@ * */ + +#include +#include #include #include -#include #include -#include #include -#include "VersionExplorer.h" - #include #include #include +#include #include #include - #include #include - +#include +#include #include #include #include - -#include - #include #include #include - +#include #include #include -#include + +namespace VersionExplorerCpp +{ + class FileEventHandler + : public AZ::IO::FileIOEventBus::Handler + { + public: + int m_errorCode = 0; + AZStd::string m_fileName; + + FileEventHandler() + { + BusConnect(); + } + + ~FileEventHandler() + { + BusDisconnect(); + } + + void OnError(const AZ::IO::SystemFile* /*file*/, const char* fileName, int errorCode) override + { + m_errorCode = errorCode; + + if (fileName) + { + m_fileName = fileName; + } + } + }; +} namespace ScriptCanvasEditor { + EditorKeepAlive::EditorKeepAlive() + { + ISystem* system = nullptr; + CrySystemRequestBus::BroadcastResult(system, &CrySystemRequestBus::Events::GetCrySystem); + + m_edKeepEditorActive = system->GetIConsole()->GetCVar("ed_KeepEditorActive"); + + if (m_edKeepEditorActive) + { + m_keepEditorActive = m_edKeepEditorActive->GetIVal(); + m_edKeepEditorActive->Set(1); + } + } + + EditorKeepAlive::~EditorKeepAlive() + { + if (m_edKeepEditorActive) + { + m_edKeepEditorActive->Set(m_keepEditorActive); + } + } + VersionExplorer::VersionExplorer(QWidget* parent /*= nullptr*/) : AzQtComponents::StyledDialog(parent) , m_ui(new Ui::VersionExplorer()) @@ -80,14 +129,14 @@ namespace ScriptCanvasEditor { if (m_ui->verbose->isChecked()) { - char sBuffer[1024]; + char sBuffer[2048]; va_list ArgList; va_start(ArgList, format); azvsnprintf(sBuffer, sizeof(sBuffer), format, ArgList); sBuffer[sizeof(sBuffer) - 1] = '\0'; va_end(ArgList); - AZ_TracePrintf("Script Canvas", "%s\n", sBuffer); + AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "%s\n", sBuffer); } } @@ -143,6 +192,7 @@ namespace ScriptCanvasEditor // Make the backup if (result == OperationResult::BackupSuccess) { + Log("SystemTick::ProcessState::Upgrade: Backup Success %s ", m_inProgressAsset->GetHint().c_str()); QList items = m_ui->tableWidget->findItems(m_inProgressAsset->GetHint().c_str(), Qt::MatchFlag::MatchExactly); if (!items.isEmpty()) { @@ -159,6 +209,7 @@ namespace ScriptCanvasEditor } else { + Log("SystemTick::ProcessState::Upgrade: Backup Failed %s ", m_inProgressAsset->GetHint().c_str()); GraphUpgradeComplete(*m_inProgressAsset, result); } @@ -184,6 +235,7 @@ namespace ScriptCanvasEditor m_state = ProcessState::Upgrade; m_inProgressAsset = m_assetsToUpgrade.begin(); + AZ::Debug::TraceMessageBus::Handler::BusConnect(); AZ::SystemTickBus::Handler::BusConnect(); } @@ -207,7 +259,7 @@ namespace ScriptCanvasEditor { if (AZ::IO::FileIOBase::GetInstance()->CreatePath(backupPath.c_str()) != AZ::IO::ResultCode::Success) { - AZ_Error("Script Canvas", false, "Failed to create backup folder %s", backupPath.c_str()); + AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Failed to create backup folder %s", backupPath.c_str()); return OperationResult::BackupFail_CreateFolder; } } @@ -243,7 +295,7 @@ namespace ScriptCanvasEditor } else { - // The file no longer exists, we'll need to skip it. + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "VersionExplorer::BackupGraph: Failed to find file: %s", asset.GetHint().c_str()); return OperationResult::BackupFail_FileNotFound; } @@ -262,94 +314,104 @@ namespace ScriptCanvasEditor if (AZ::IO::FileIOBase::GetInstance()->Copy(sourceFilePath.c_str(), targetFilePath.c_str()) != AZ::IO::ResultCode::Error) { - AZ_TracePrintf("Script Canvas", "Backed up: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); + Log("VersionExplorer::BackupGraph: Backed up: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); + return OperationResult::BackupSuccess; } else { - AZ_TracePrintf("Script Canvas", "Error creating backup: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "VersionExplorer::BackupGraph: Error creating backup: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); return OperationResult::BackupFail; } - - return OperationResult::BackupSuccess; - } - - // Upgrade - - template - AZ::Entity* UpgradeGraphProcess(const AZ::Data::Asset& asset, VersionExplorer* /*versionExplorer*/) - { - AssetType* scriptCanvasAsset = asset.GetAs(); - AZ_Assert(scriptCanvasAsset, "Unable to get the asset of type: %s", azrtti_typeid().template ToString().c_str()); - - if (!scriptCanvasAsset) - { - return nullptr; - } - - AZ::Entity* scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity(); - AZ_Assert(scriptCanvasEntity, "The Script Canvas asset must have a valid entity"); - if (!scriptCanvasEntity) - { - return nullptr; - } - - - AZ::Entity* queryEntity = nullptr; - AZ::ComponentApplicationBus::BroadcastResult(queryEntity, &AZ::ComponentApplicationRequests::FindEntity, scriptCanvasEntity->GetId()); - if (queryEntity) - { - if (queryEntity->GetState() == AZ::Entity::State::Active) - { - queryEntity->Deactivate(); - } - - scriptCanvasEntity = queryEntity; - } - - if (scriptCanvasEntity->GetState() == AZ::Entity::State::Constructed) - { - scriptCanvasEntity->Init(); - } - - if (scriptCanvasEntity->GetState() == AZ::Entity::State::Init) - { - scriptCanvasEntity->Activate(); - } - - auto graphComponent = scriptCanvasEntity->FindComponent(); - AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component"); - - if (graphComponent) - { - graphComponent->UpgradeGraph(asset); - } - - return scriptCanvasEntity; } void VersionExplorer::UpgradeGraph(const AZ::Data::Asset& asset) { m_inProgress = true; + Log("UpgradeGraph %s ", m_inProgressAsset->GetHint().c_str()); m_ui->spinner->SetText(QObject::tr("Upgrading: %1").arg(asset.GetHint().c_str())); - - AZ::Debug::TraceMessageBus::Handler::BusConnect(); + m_scriptCanvasEntity = nullptr; UpgradeNotifications::Bus::Handler::BusConnect(); if (asset.GetType() == azrtti_typeid()) { - m_scriptCanvasEntity = UpgradeGraphProcess(asset, this); + ScriptCanvasAsset* scriptCanvasAsset = asset.GetAs(); + AZ_Assert(scriptCanvasAsset, "Unable to get the asset of ScriptCanvasAsset, but received type: %s" + , azrtti_typeid().template ToString().c_str()); + + if (!scriptCanvasAsset) + { + return; + } + + AZ::Entity* scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity(); + AZ_Assert(scriptCanvasEntity, "VersionExplorer::UpgradeGraph The Script Canvas asset must have a valid entity"); + if (!scriptCanvasEntity) + { + return; + } + + AZ::Entity* queryEntity = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(queryEntity, &AZ::ComponentApplicationRequests::FindEntity, scriptCanvasEntity->GetId()); + if (queryEntity) + { + if (queryEntity->GetState() == AZ::Entity::State::Active) + { + queryEntity->Deactivate(); + } + + scriptCanvasEntity = queryEntity; + } + + if (scriptCanvasEntity->GetState() == AZ::Entity::State::Constructed) + { + scriptCanvasEntity->Init(); + } + + if (scriptCanvasEntity->GetState() == AZ::Entity::State::Init) + { + scriptCanvasEntity->Activate(); + } + + auto graphComponent = scriptCanvasEntity->FindComponent(); + AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component"); + + if (graphComponent) + { + graphComponent->UpgradeGraph + ( asset + , m_ui->forceUpgrade->isChecked() ? Graph::UpgradeRequest::Forced : Graph::UpgradeRequest::IfOutOfDate + , m_ui->verbose->isChecked()); + + m_scriptCanvasEntity = scriptCanvasEntity; + } } - if (!m_scriptCanvasEntity) - { - AZ_Assert(m_scriptCanvasEntity, "The ScriptCanvas asset should have an entity"); - return; - } + AZ_Assert(m_scriptCanvasEntity, "The ScriptCanvas asset should have an entity"); } void VersionExplorer::OnGraphUpgradeComplete(AZ::Data::Asset& asset, bool /*skipped*/ /*= false*/) + { + AZStd::string relativePath, fullPath; + AZ::Data::AssetCatalogRequestBus::BroadcastResult(relativePath, &AZ::Data::AssetCatalogRequests::GetAssetPathById, asset.GetId()); + bool fullPathFound = false; + AzToolsFramework::AssetSystemRequestBus::BroadcastResult(fullPathFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath, relativePath, fullPath); + if (!fullPathFound) + { + AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Full source path not found for %s", relativePath.c_str()); + } + + auto streamer = AZ::Interface::Get(); + AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(fullPath); + streamer->SetRequestCompleteCallback(flushRequest, [this, asset]([[maybe_unused]] AZ::IO::FileRequestHandle request) + { + this->OnSourceFileReleased(asset); + }); + streamer->QueueRequest(flushRequest); + } + + void VersionExplorer::OnSourceFileReleased(AZ::Data::Asset asset) { AZStd::string relativePath, fullPath; AZ::Data::AssetCatalogRequestBus::BroadcastResult(relativePath, &AZ::Data::AssetCatalogRequests::GetAssetPathById, asset.GetId()); @@ -370,7 +432,8 @@ namespace ScriptCanvasEditor { if (asset.GetType() == azrtti_typeid()) { - tmpFilesaved = AZ::Utils::SaveObjectToStream(fileStream, AZ::DataStream::ST_XML, &asset.GetAs()->GetScriptCanvasData()); + ScriptCanvasEditor::ScriptCanvasAssetHandler handler; + tmpFilesaved = handler.SaveAssetData(asset, &fileStream); } fileStream.Close(); @@ -378,7 +441,7 @@ namespace ScriptCanvasEditor using SCCommandBus = AzToolsFramework::SourceControlCommandBus; SCCommandBus::Broadcast(&SCCommandBus::Events::RequestEdit, fullPath.c_str(), true, - [this, &asset, fullPath, tmpFileName, tmpFilesaved](bool /*success*/, const AzToolsFramework::SourceControlFileInfo& info) + [this, asset, fullPath, tmpFileName, tmpFilesaved](bool /*success*/, const AzToolsFramework::SourceControlFileInfo& info) { if (!info.IsReadOnly()) { @@ -427,64 +490,35 @@ namespace ScriptCanvasEditor } } - //if (!info.IsReadOnly()) - //{ - // if (tmpFilesaved) - // { - // auto normTarget = fullPath; - // AzFramework::StringFunc::Path::Normalize(normTarget); - - // auto moveResult = AZ::IO::SmartMove(tmpFileName.c_str(), normTarget.c_str()); - // if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success) - // { - // // Bump the slice asset up in the asset processor's queue. - // AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, fullPath.c_str()); - - // AZ::SystemTickBus::QueueFunction([this, asset]() { GraphUpgradeComplete(asset); }); - // } - // else - // { - // AZ::SystemTickBus::QueueFunction([this, asset, tmpFileName, fullPath]() { RetryMove(asset, tmpFileName, fullPath); }); - // } - - // } - //} - //else - //{ - // QWidget* mainWindow = nullptr; - // AzToolsFramework::EditorRequests::Bus::BroadcastResult(mainWindow, &AzToolsFramework::EditorRequests::GetMainWindow); - // QMessageBox::warning(mainWindow, QObject::tr("Unable to Modify Script Canvas asset"), - // QObject::tr("File is not writable."), QMessageBox::Ok, QMessageBox::Ok); - //} }); } } - void VersionExplorer::PerformMove(AZ::Data::Asset& asset, const AZStd::string& source, const AZStd::string& target) + void VersionExplorer::PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target) { + VersionExplorerCpp::FileEventHandler fileEventHandler; + auto moveResult = AZ::IO::SmartMove(source.c_str(), target.c_str()); if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success) { // Bump the slice asset up in the asset processor's queue. AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str()); - AZ::SystemTickBus::QueueFunction([this, asset]() { GraphUpgradeComplete(asset); }); } else { auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); - streamer->SetRequestCompleteCallback(flushRequest, [this, &asset, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) + streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) { // Continue saving. AZ::SystemTickBus::QueueFunction([this, asset, source, target]() { RetryMove(asset, source, target); }); }); streamer->QueueRequest(flushRequest); - } } - void VersionExplorer::GraphUpgradeComplete(const AZ::Data::Asset& asset, OperationResult result /*= OperationResult::Success*/) + void VersionExplorer::GraphUpgradeComplete(const AZ::Data::Asset asset, OperationResult result ) { m_inProgress = false; @@ -494,8 +528,6 @@ namespace ScriptCanvasEditor m_scriptCanvasEntity = nullptr; } - AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); - GraphUpgradeCompleteUIUpdate(asset, result); if (!m_isUpgradingSingleGraph) @@ -513,10 +545,10 @@ namespace ScriptCanvasEditor else { m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset); - m_inProgress = false; m_state = ProcessState::Inactive; AZ::SystemTickBus::Handler::BusDisconnect(); + AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); } m_isUpgradingSingleGraph = false; @@ -527,19 +559,19 @@ namespace ScriptCanvasEditor } } - void VersionExplorer::GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset& asset, OperationResult result /*= OperationResult::Success*/) + void VersionExplorer::GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset asset, OperationResult result /*= OperationResult::Success*/) { QString text = asset.GetHint().c_str(); QList items = m_ui->tableWidget->findItems(text, Qt::MatchFlag::MatchExactly); + if (!items.isEmpty()) { for (auto* item : items) { int row = item->row(); - QTableWidgetItem* label = m_ui->tableWidget->item(row, ColumnAsset); - QString assetName = asset.GetHint().c_str(); + if (label->text().compare(assetName) == 0) { m_ui->tableWidget->removeCellWidget(row, ColumnAction); @@ -562,26 +594,23 @@ namespace ScriptCanvasEditor { doneButton->setToolTip("Failed to create the backup folder"); } - } m_ui->tableWidget->setCellWidget(row, ColumnStatus, doneButton); } - - } } } void VersionExplorer::FinalizeUpgrade() { + Log("FinalizeUpgrade!"); m_inProgress = false; m_assetsToUpgrade.clear(); m_ui->upgradeAllButton->setEnabled(false); m_ui->onlyShowOutdated->setEnabled(true); - // Manual correction size_t assetsThatNeedManualInspection = AZ::Interface::Get()->GetGraphsThatNeedManualUpgrade().size(); if (assetsThatNeedManualInspection > 0) @@ -592,7 +621,6 @@ namespace ScriptCanvasEditor AZ::SystemTickBus::Handler::BusDisconnect(); AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); UpgradeNotifications::Bus::Handler::BusDisconnect(); - AZ::Interface::Get()->SetIsUpgrading(false); } @@ -641,14 +669,12 @@ namespace ScriptCanvasEditor { m_currentAssetIndex = 0; m_ui->progressBar->setValue(0); - DoScan(); } void VersionExplorer::InspectAsset(AZ::Data::Asset& asset, AZ::Data::AssetInfo& assetInfo) { Log("InspectAsset: %s", asset.GetHint().c_str()); - AZ::Entity* scriptCanvasEntity = nullptr; if (asset.GetType() == azrtti_typeid()) { @@ -724,7 +750,7 @@ namespace ScriptCanvasEditor AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, assetNameUtf8, info, watchFolder); if (!result) { - AZ_Error("AssetProvider", false, "Failed to locate asset info for '%s'.", assetNameUtf8.constData()); + AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Failed to locate asset info for '%s'.", assetNameUtf8.constData()); } QString absolutePath = QDir(watchFolder.c_str()).absoluteFilePath(info.m_relativePath.c_str()); @@ -867,8 +893,13 @@ namespace ScriptCanvasEditor } - void VersionExplorer::CaptureLogFromTraceBus(const char* /*window*/, const char* message) + bool VersionExplorer::CaptureLogFromTraceBus(const char* window, const char* message) { + if (m_ui->updateReportingOnly->isChecked() && window != ScriptCanvas::k_VersionExplorerWindow) + { + return true; + } + AZStd::string msg = message; if (msg.ends_with("\n")) { @@ -876,39 +907,33 @@ namespace ScriptCanvasEditor } m_logs.push_back(msg); + return m_ui->updateReportingOnly->isChecked(); } bool VersionExplorer::OnPreError(const char* window, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* message) { AZStd::string msg = AZStd::string::format("(Error): %s", message); - CaptureLogFromTraceBus(window, msg.c_str()); - - return false; + return CaptureLogFromTraceBus(window, msg.c_str()); } bool VersionExplorer::OnPreWarning(const char* window, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* message) { AZStd::string msg = AZStd::string::format("(Warning): %s", message); - CaptureLogFromTraceBus(window, msg.c_str()); - - return false; + return CaptureLogFromTraceBus(window, msg.c_str()); } bool VersionExplorer::OnException(const char* message) { AZStd::string msg = AZStd::string::format("(Exception): %s", message); - CaptureLogFromTraceBus("Script Canvas", msg.c_str()); - - return false; + return CaptureLogFromTraceBus("Script Canvas", msg.c_str()); } bool VersionExplorer::OnPrintf(const char* window, const char* message) { - CaptureLogFromTraceBus(window, message); - return false; + return CaptureLogFromTraceBus(window, message); } - void VersionExplorer::RetryMove(const AZ::Data::Asset& asset, const AZStd::string& source, const AZStd::string& target) + void VersionExplorer::RetryMove(const AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target) { auto normTarget = target; AzFramework::StringFunc::Path::Normalize(normTarget); @@ -924,15 +949,12 @@ namespace ScriptCanvasEditor { auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); - streamer->SetRequestCompleteCallback(flushRequest, [this, &asset, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) + streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) { // Continue saving. AZ::SystemTickBus::QueueFunction([this, asset, source, target]() { RetryMove(asset, source, target); }); }); streamer->QueueRequest(flushRequest); - - - //AZ::SystemTickBus::QueueFunction([this, asset, source, target]() { RetryMove(asset, source, target); }); } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index 266a42e2e6..6cacc570f8 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -20,11 +20,11 @@ AZ_POP_DISABLE_WARNING #include #include +#include #include #include #include -#include "UpgradeTool.h" #endif class QPushButton; @@ -41,6 +41,19 @@ namespace AzQtComponents namespace ScriptCanvasEditor { + //! Scoped utility to set and restore the "ed_KeepEditorActive" CVar in order to allow + //! the upgrade tool to work even if the editor is not in the foreground + class EditorKeepAlive + { + public: + EditorKeepAlive(); + ~EditorKeepAlive(); + + private: + int m_keepEditorActive; + ICVar* m_edKeepEditorActive; + }; + //! A tool that collects and upgrades all Script Canvas graphs in the asset catalog class VersionExplorer : public AzQtComponents::StyledDialog @@ -75,10 +88,6 @@ namespace ScriptCanvasEditor }; ProcessState m_state = ProcessState::Inactive; - bool DoBackup(); - void BackupAsset(const AZ::Data::AssetInfo& assetInfo); - void BackupComplete(); - void DoScan(); void ScanComplete(const AZ::Data::Asset&); @@ -97,7 +106,7 @@ namespace ScriptCanvasEditor bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override; // - void CaptureLogFromTraceBus(const char* window, const char* message); + bool CaptureLogFromTraceBus(const char* window, const char* message); enum class OperationResult { @@ -109,7 +118,7 @@ namespace ScriptCanvasEditor BackupFail_FileNotFound }; - void GraphUpgradeComplete(const AZ::Data::Asset&, OperationResult result = OperationResult::Success); + void GraphUpgradeComplete(const AZ::Data::Asset, OperationResult result = OperationResult::Success); bool IsUpgrading() const; @@ -146,18 +155,21 @@ namespace ScriptCanvasEditor void FinalizeUpgrade(); void FinalizeScan(); + void BackupComplete(); OperationResult BackupGraph(const AZ::Data::Asset&); void UpgradeGraph(const AZ::Data::Asset&); - void RetryMove(const AZ::Data::Asset& asset, const AZStd::string& source, const AZStd::string& target); + void RetryMove(const AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target); - void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset& asset, OperationResult result = OperationResult::Success); + void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset asset, OperationResult result = OperationResult::Success); void OnGraphUpgradeComplete(AZ::Data::Asset&, bool skipped = false) override; + void OnSourceFileReleased(AZ::Data::Asset asset); + void closeEvent(QCloseEvent* event) override; bool m_overwriteAll = false; - void PerformMove(AZ::Data::Asset& asset, const AZStd::string& source, const AZStd::string& target); + void PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target); void Log(const char* format, ...); }; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui index 3e2604dd99..53e9401194 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui @@ -9,8 +9,8 @@ 0 0 - 747 - 687 + 1363 + 770 @@ -261,10 +261,10 @@ 0 - - Qt::ScrollBarAlwaysOn - - + + Qt::ScrollBarAlwaysOn + + true @@ -273,6 +273,16 @@ + + + + Backup before upgrade + + + true + + + @@ -311,36 +321,16 @@ - - + + - Only show outdated graphs + Verbose - true + false - - - - Force Upgrade - - - false - - - - - - - Verbose - - - false - - - @@ -354,16 +344,33 @@ - - + + - Backup before upgrade + Only show outdated graphs true + + + + Force Upgrade + + + false + + + + + + + Update Reporting Only + + + diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h index 76542d6097..03bcb8450f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h @@ -57,6 +57,8 @@ namespace ScriptCanvas constexpr const char* k_OnVariableWriteEventName = "OnVariableValueChanged"; constexpr const char* k_OnVariableWriteEbusName = "VariableNotification"; + constexpr const AZStd::string_view k_VersionExplorerWindow = "VersionExplorerWindow"; + class Node; class Edge; From 99d71cfbc58697a55402b605980e369f6b4f1a73 Mon Sep 17 00:00:00 2001 From: kberg-amzn Date: Mon, 30 Aug 2021 12:05:53 -0700 Subject: [PATCH 016/355] Added delta replication and stat tracking to vector and array network property container types, + some minor cleanup I ran into when looking for the best hook points for this functionality Signed-off-by: kberg-amzn --- .../Components/MultiplayerComponent.h | 103 ++++++++++++++++-- .../Multiplayer/MultiplayerConstants.h | 8 +- .../Include/Multiplayer/MultiplayerTypes.h | 53 +++++---- .../Source/AutoGen/AutoComponent_Common.jinja | 6 +- .../Source/AutoGen/AutoComponent_Source.jinja | 14 ++- .../Editor/MultiplayerEditorConnection.cpp | 4 +- .../MultiplayerEditorSystemComponent.cpp | 4 +- .../Source/MultiplayerSystemComponent.cpp | 4 +- 8 files changed, 144 insertions(+), 52 deletions(-) diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponent.h b/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponent.h index 64ceb6e16f..f685d453f3 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponent.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerComponent.h @@ -102,11 +102,34 @@ namespace Multiplayer return GetEntity()->FindComponent(); } + inline void UpdateComponentMetrics + ( + bool modifyRecord, + uint32_t prevSerializerSize, + uint32_t currSerializerSize, + NetComponentId componentId, + PropertyIndex propertyIndex, + MultiplayerStats& stats + ) + { + const uint32_t updateSize = (currSerializerSize - prevSerializerSize); + if (updateSize > 0) + { + if (modifyRecord) + { + stats.RecordPropertyReceived(componentId, propertyIndex, updateSize); + } + else + { + stats.RecordPropertySent(componentId, propertyIndex, updateSize); + } + } + } + template inline void SerializeNetworkPropertyHelper ( AzNetworking::ISerializer& serializer, - bool modifyRecord, AzNetworking::FixedSizeBitsetView& bitset, int32_t bitIndex, TYPE& value, @@ -118,6 +141,7 @@ namespace Multiplayer { if (bitset.GetBit(bitIndex)) { + const bool modifyRecord = serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject; const uint32_t prevUpdateSize = serializer.GetSize(); serializer.ClearTrackedChangesFlag(); serializer.Serialize(value, name); @@ -127,19 +151,78 @@ namespace Multiplayer bitset.SetBit(bitIndex, false); } const uint32_t postUpdateSize = serializer.GetSize(); - // Network Property metrics - const uint32_t updateSize = (postUpdateSize - prevUpdateSize); - if (updateSize > 0) + UpdateComponentMetrics(modifyRecord, prevUpdateSize, postUpdateSize, componentId, propertyIndex, stats); + } + } + + template + inline void SerializeNetworkPropertyHelperArray + ( + AzNetworking::ISerializer& serializer, + AzNetworking::FixedSizeBitsetView& bitset, + AZStd::array& value, + NetComponentId componentId, + PropertyIndex propertyIndex, + MultiplayerStats& stats + ) + { + const bool modifyRecord = serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject; + const uint32_t prevUpdateSize = serializer.GetSize(); + for (uint32_t i = 0; i < SIZE; ++i) + { + if (bitset.GetBit(i)) { - if (modifyRecord) + serializer.ClearTrackedChangesFlag(); + serializer.Serialize(value[i], "Element"); + if (modifyRecord && !serializer.GetTrackedChangesFlag()) { - stats.RecordPropertyReceived(componentId, propertyIndex, updateSize); - } - else - { - stats.RecordPropertySent(componentId, propertyIndex, updateSize); + bitset.SetBit(i, false); } } } + const uint32_t postUpdateSize = serializer.GetSize(); + UpdateComponentMetrics(modifyRecord, prevUpdateSize, postUpdateSize, componentId, propertyIndex, stats); + } + + template + inline void SerializeNetworkPropertyHelperVector + ( + AzNetworking::ISerializer& serializer, + AzNetworking::FixedSizeBitsetView& bitset, + AZStd::fixed_vector& value, + NetComponentId componentId, + PropertyIndex propertyIndex, + MultiplayerStats& stats + ) + { + const bool modifyRecord = serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject; + const uint32_t prevUpdateSize = serializer.GetSize(); + if (bitset.GetBit(SIZE)) + { + using SizeType = typename AZ::SizeType(), false>::Type; + SizeType origSize = aznumeric_cast(value.size()); + SizeType newSize = origSize; + serializer.Serialize(newSize, "Size"); + value.resize(newSize); + if (modifyRecord && origSize == newSize) + { + bitset.SetBit(SIZE, false); + } + } + + for (uint32_t i = 0; i < value.size(); ++i) + { + if (bitset.GetBit(i)) + { + serializer.ClearTrackedChangesFlag(); + serializer.Serialize(value[i], "Element"); + if (modifyRecord && !serializer.GetTrackedChangesFlag()) + { + bitset.SetBit(i, false); + } + } + } + const uint32_t postUpdateSize = serializer.GetSize(); + UpdateComponentMetrics(modifyRecord, prevUpdateSize, postUpdateSize, componentId, propertyIndex, stats); } } diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h b/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h index b6ed0219f8..4471aa0c2b 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerConstants.h @@ -17,12 +17,10 @@ namespace Multiplayer { - constexpr AZStd::string_view MPNetworkInterfaceName("MultiplayerNetworkInterface"); - constexpr AZStd::string_view MPEditorInterfaceName("MultiplayerEditorNetworkInterface"); - + constexpr AZStd::string_view MpNetworkInterfaceName("MultiplayerNetworkInterface"); + constexpr AZStd::string_view MpEditorInterfaceName("MultiplayerEditorNetworkInterface"); constexpr AZStd::string_view LocalHost("127.0.0.1"); + constexpr uint16_t DefaultServerPort = 33450; constexpr uint16_t DefaultServerEditorPort = 33451; - } - diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerTypes.h b/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerTypes.h index 704e9d2734..4ac20abc83 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerTypes.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/MultiplayerTypes.h @@ -86,7 +86,7 @@ namespace Multiplayer Activate }; - // Structure for identifying a specific entity within a spawnable + //! Structure for identifying a specific entity within a spawnable. struct PrefabEntityId { AZ_TYPE_INFO(PrefabEntityId, "{EFD37465-CCAC-4E87-A825-41B4010A2C75}"); @@ -97,29 +97,10 @@ namespace Multiplayer uint32_t m_entityOffset = AllIndices; PrefabEntityId() = default; - - explicit PrefabEntityId(AZ::Name name, uint32_t entityOffset = AllIndices) - : m_prefabName(name) - , m_entityOffset(entityOffset) - { - } - - bool operator==(const PrefabEntityId& rhs) const - { - return m_prefabName == rhs.m_prefabName && m_entityOffset == rhs.m_entityOffset; - } - - bool operator!=(const PrefabEntityId& rhs) const - { - return !(*this == rhs); - } - - bool Serialize(AzNetworking::ISerializer& serializer) - { - serializer.Serialize(m_prefabName, "prefabName"); - serializer.Serialize(m_entityOffset, "entityOffset"); - return serializer.IsValid(); - } + explicit PrefabEntityId(AZ::Name name, uint32_t entityOffset = AllIndices); + bool operator==(const PrefabEntityId& rhs) const; + bool operator!=(const PrefabEntityId& rhs) const; + bool Serialize(AzNetworking::ISerializer& serializer); }; struct EntityMigrationMessage @@ -128,6 +109,30 @@ namespace Multiplayer PrefabEntityId m_prefabEntityId; AzNetworking::PacketEncodingBuffer m_propertyUpdateData; }; + + inline PrefabEntityId::PrefabEntityId(AZ::Name name, uint32_t entityOffset) + : m_prefabName(name) + , m_entityOffset(entityOffset) + { + ; + } + + inline bool PrefabEntityId::operator==(const PrefabEntityId& rhs) const + { + return m_prefabName == rhs.m_prefabName && m_entityOffset == rhs.m_entityOffset; + } + + inline bool PrefabEntityId::operator!=(const PrefabEntityId& rhs) const + { + return !(*this == rhs); + } + + inline bool PrefabEntityId::Serialize(AzNetworking::ISerializer& serializer) + { + serializer.Serialize(m_prefabName, "prefabName"); + serializer.Serialize(m_entityOffset, "entityOffset"); + return serializer.IsValid(); + } } AZ_TYPE_SAFE_INTEGRAL_SERIALIZEBINDING(Multiplayer::HostId); diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja index 72583f9062..811039feda 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja @@ -5,12 +5,12 @@ #} {%- macro ParseRpcParams(property, outNames, outTypes, outDefines, use_default_value=False) -%} {%- for Param in property.iter('Param') -%} -{%- do outNames.append(Param.attrib['Name']) -%} +{%- do outNames.append(LowerFirst(Param.attrib['Name'])) -%} {%- do outTypes.append(Param.attrib['Type']) -%} {%- if use_default_value and Param.attrib['DefaultValue'] -%} -{%- do outDefines.append('const ' ~ Param.attrib['Type'] ~ '& ' + Param.attrib['Name'] + ' = ' + Param.attrib['DefaultValue']) -%} +{%- do outDefines.append('const ' ~ Param.attrib['Type'] ~ '& ' + LowerFirst(Param.attrib['Name']) + ' = ' + Param.attrib['DefaultValue']) -%} {%- else -%} -{%- do outDefines.append('const ' ~ Param.attrib['Type'] ~ '& ' ~ Param.attrib['Name']) -%} +{%- do outDefines.append('const ' ~ Param.attrib['Type'] ~ '& ' ~ LowerFirst(Param.attrib['Name'])) -%} {%- endif -%} {%- endfor -%} {%- endmacro -%} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja index 079cac329b..35b5ac3abf 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja @@ -636,7 +636,6 @@ bool {{ ClassName }}::Serialize{{ AutoComponentMacros.GetNetPropertiesSetName(Re {% if networkPropertyCount.value > 0 %} [[maybe_unused]] Multiplayer::MultiplayerStats& stats = Multiplayer::GetMultiplayer()->GetStats(); // We modify the record if we are writing an update so that we don't notify for a change that really didn't change the value (just a duplicated send from the server) - [[maybe_unused]] bool modifyRecord = serializer.GetSerializerMode() == AzNetworking::SerializerMode::WriteToObject; {% call(Property) AutoComponentMacros.ParseNetworkProperties(Component, ReplicateFrom, ReplicateTo) %} {% if Property.attrib['Container'] != 'None' and Property.attrib['Container'] != 'Object' %} { // Serialization for Vector and Array Network Properties @@ -651,17 +650,24 @@ bool {{ ClassName }}::Serialize{{ AutoComponentMacros.GetNetPropertiesSetName(Re if (deltaRecord.AnySet()) { {% if Property.attrib['Container'] == 'Vector' %} - serializer.Serialize>(m_{{ LowerFirst(Property.attrib['Name']) }}, "{{ LowerFirst(Property.attrib['Name']) }}"); + Multiplayer::SerializeNetworkPropertyHelperVector {% elif Property.attrib['Container'] == 'Array' %} - serializer.Serialize>(m_{{ LowerFirst(Property.attrib['Name']) }}, "{{ LowerFirst(Property.attrib['Name']) }}"); + Multiplayer::SerializeNetworkPropertyHelperArray {% endif %} + ( + serializer, + deltaRecord, + m_{{ LowerFirst(Property.attrib['Name']) }}, + GetNetComponentId(), + static_cast({{ UpperFirst(Component.attrib['Name']) }}Internal::NetworkProperties::{{ UpperFirst(Property.attrib['Name']) }}), + stats + ); } } {% else %} Multiplayer::SerializeNetworkPropertyHelper ( serializer, - modifyRecord, replicationRecord.m_{{ LowerFirst(AutoComponentMacros.GetNetPropertiesSetName(ReplicateFrom, ReplicateTo)) }}, static_cast({{ AutoComponentMacros.GetNetPropertiesQualifiedPropertyDirtyEnum(Component.attrib['Name'], ReplicateFrom, ReplicateTo, Property) }}), m_{{ LowerFirst(Property.attrib['Name']) }}, diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.cpp b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.cpp index fc398182ef..3bf578dd03 100644 --- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.cpp +++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorConnection.cpp @@ -31,7 +31,7 @@ namespace Multiplayer : m_byteStream(&m_buffer) { m_networkEditorInterface = AZ::Interface::Get()->CreateNetworkInterface( - AZ::Name(MPEditorInterfaceName), ProtocolType::Tcp, TrustZone::ExternalClientToServer, *this); + AZ::Name(MpEditorInterfaceName), ProtocolType::Tcp, TrustZone::ExternalClientToServer, *this); m_networkEditorInterface->SetTimeoutEnabled(false); if (editorsv_isDedicated) { @@ -109,7 +109,7 @@ namespace Multiplayer // Setup the normal multiplayer connection AZ::Interface::Get()->InitializeMultiplayer(MultiplayerAgentType::DedicatedServer); - INetworkInterface* networkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(MPNetworkInterfaceName)); + INetworkInterface* networkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(MpNetworkInterfaceName)); uint16_t serverPort = DefaultServerPort; if (auto console = AZ::Interface::Get(); console) diff --git a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp index d557c65215..377fb1eb56 100644 --- a/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/Editor/MultiplayerEditorSystemComponent.cpp @@ -105,7 +105,7 @@ namespace Multiplayer m_serverProcess->TerminateProcess(0); m_serverProcess = nullptr; } - INetworkInterface* editorNetworkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(MPEditorInterfaceName)); + INetworkInterface* editorNetworkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(MpEditorInterfaceName)); if (editorNetworkInterface) { editorNetworkInterface->Disconnect(m_editorConnId, AzNetworking::DisconnectReason::TerminatedByClient); @@ -194,7 +194,7 @@ namespace Multiplayer AZ::Interface::Get()->BuildSpawnablesList(); // Now that the server has launched, attempt to connect the NetworkInterface - INetworkInterface* editorNetworkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(MPEditorInterfaceName)); + INetworkInterface* editorNetworkInterface = AZ::Interface::Get()->RetrieveNetworkInterface(AZ::Name(MpEditorInterfaceName)); AZ_Assert(editorNetworkInterface, "MP Editor Network Interface was unregistered before Editor could connect."); m_editorConnId = editorNetworkInterface->Connect( AzNetworking::IpAddress(remoteAddress.c_str(), editorsv_port, AzNetworking::ProtocolType::Tcp)); diff --git a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp index b0a8350982..5396d53c79 100644 --- a/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp +++ b/Gems/Multiplayer/Code/Source/MultiplayerSystemComponent.cpp @@ -180,7 +180,7 @@ namespace Multiplayer { AZ::TickBus::Handler::BusConnect(); AzFramework::SessionNotificationBus::Handler::BusConnect(); - m_networkInterface = AZ::Interface::Get()->CreateNetworkInterface(AZ::Name(MPNetworkInterfaceName), sv_protocol, TrustZone::ExternalClientToServer, *this); + m_networkInterface = AZ::Interface::Get()->CreateNetworkInterface(AZ::Name(MpNetworkInterfaceName), sv_protocol, TrustZone::ExternalClientToServer, *this); if (AZ::Interface::Get()) { m_consoleCommandHandler.Connect(AZ::Interface::Get()->GetConsoleCommandInvokedEvent()); @@ -197,7 +197,7 @@ namespace Multiplayer AZ::Interface::Unregister(this); AZ::Interface::Unregister(this); m_consoleCommandHandler.Disconnect(); - AZ::Interface::Get()->DestroyNetworkInterface(AZ::Name(MPNetworkInterfaceName)); + AZ::Interface::Get()->DestroyNetworkInterface(AZ::Name(MpNetworkInterfaceName)); AzFramework::SessionNotificationBus::Handler::BusDisconnect(); AZ::TickBus::Handler::BusDisconnect(); } From 194205c4538161cafe06ba59b0323d462837798c Mon Sep 17 00:00:00 2001 From: Chris Galvan Date: Mon, 30 Aug 2021 14:10:30 -0500 Subject: [PATCH 017/355] Replaced AzFramework::FileFunc JSON utils API calls with AzCore::JsonUtils APIs that appear to have been duplicated. Also fixed up improper Project Configurator -> Project Manager comment replacements. Signed-off-by: Chris Galvan --- .../AzCore/Serialization/Json/JsonUtils.cpp | 5 + .../AzFramework/FileFunc/FileFunc.cpp | 279 --------------- .../AzFramework/FileFunc/FileFunc.h | 75 ---- .../AzToolsFramework/Prefab/PrefabLoader.cpp | 11 +- .../AzToolsFramework/Tests/FileFunc.cpp | 327 ------------------ .../Components/SceneSystemComponent.h | 3 +- .../SceneCore/Containers/SceneManifest.cpp | 7 +- .../Tests/Containers/SceneManifestTests.cpp | 8 +- .../SceneManifest/SceneManifestRuleTests.cpp | 8 +- .../AWSResourceMappingManager.cpp | 5 +- .../Code/Source/IdentityProvider.cpp | 5 +- Gems/AWSMetrics/Code/Source/MetricsEvent.cpp | 4 +- Gems/AWSMetrics/Code/Source/MetricsQueue.cpp | 12 +- .../Exporter/MotionEventExport.cpp | 6 +- .../Source/Importer/ChunkProcessors.cpp | 6 +- .../SliceBuilder/SliceBuilderWorker.cpp | 6 +- .../PrefabBuilder/PrefabBuilderComponent.cpp | 2 +- .../PrefabBuilder/PrefabBuilderComponent.h | 2 +- .../PrefabBuilder/PrefabBuilderTests.cpp | 3 +- .../Code/SceneLoggingExampleModule.cpp | 2 +- .../SceneProcessingConfigSystemComponent.cpp | 2 +- 21 files changed, 45 insertions(+), 733 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp index 8f2ebaba8d..af35842afc 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp @@ -209,6 +209,11 @@ namespace AZ AZ::Outcome ReadJsonString(AZStd::string_view jsonText) { + if (jsonText.empty()) + { + return AZ::Failure(AZStd::string("Failed to parse JSON: input string is empty.")); + } + rapidjson::Document jsonDocument; jsonDocument.Parse(jsonText.data(), jsonText.size()); if (jsonDocument.HasParseError()) diff --git a/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp b/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp index 5358dd46bd..7bfdbb2f7e 100644 --- a/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp +++ b/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.cpp @@ -36,28 +36,6 @@ namespace AzFramework { namespace Internal { - //! Save a JSON document to a stream. Otherwise returns a failure with error message. - AZ::Outcome WriteJsonToStream(const rapidjson::Document& document, AZ::IO::GenericStream& stream, WriteJsonSettings settings = WriteJsonSettings{}) - { - AZ::IO::RapidJSONStreamWriter jsonStreamWriter(&stream); - - rapidjson::PrettyWriter writer(jsonStreamWriter); - - if (settings.m_maxDecimalPlaces >= 0) - { - writer.SetMaxDecimalPlaces(settings.m_maxDecimalPlaces); - } - - if (document.Accept(writer)) - { - return AZ::Success(); - } - else - { - return AZ::Failure(AZStd::string{ "Json Writer failed" }); - } - } - static bool FindFilesInPath(const AZStd::string& folder, const AZStd::string& filter, bool recurseSubFolders, AZStd::list& fileList) { AZStd::string file_filter = folder; @@ -107,210 +85,8 @@ namespace AzFramework { return AZStd::string("(^|\\n\\s*)" + key + "([ \\t]*)=([ \\t]*)(.*)"); } - - /** - * Replaces a value in an ini-style content. - * - * \param[in] cfgContents The contents of the ini-style file - * \param[in] header The optional group title for the key - * \param[in] key The key of the value to replace - * \param[in] newValue The value to assign to the key - * - * \returns Void on success, error message on failure. - * - * If key has multiple values, it does not preserve other values. - * enabled_game_projects = oldProject1, oldProject2, oldProject3 - * becomes - * enabled_game_projects = newProject - * Cases to handle: - * 1. Key exists, value is identical -> do nothing - * This can occur if a user modifies a config file while the tooling is open. - * Example: - * 1) Load Project Manager. - * 2) Modify your bootstrap.cfg to a different project. - * 3) Tell Project Manager to set your project to the project you set in #2. - * 2. Key exists, value is missing -> stomps over key with new key value pair. - * 3. Key exists, value is different -> stomps over key with new key value pair. Ignores previous values. - * 4. Key does not exist, header is not required -> insert "key=value" at the end of file. - * 5. Key does not exist, required header does not exist -> insert "\nHeader\n" at end of file and continue to #6. - * 6. Key does not exist, required header does exist -> insert "key=value" at next line under the header. - * The header will always exist at this point, it was created in the previous check if it was missing. - */ - AZ::Outcome UpdateCfgContents(AZStd::string& cfgContents, const AZStd::string& header, const AZStd::string& key, const AZStd::string& value) - { - // Generate regex str and replacement str - AZStd::string lhsStr = key; - AZStd::string regexStr = BuildConfigKeyValueRegex(lhsStr); - AZStd::string gameFolderAssignment = "$1" + lhsStr + "$2=$03" + value; - - // Replace the current key with the new value - // AZStd's regex was not functional at the time this was authored, so convert to std from AZStd. - std::regex sysGameRegex(regexStr.c_str()); - std::smatch matchResults; - std::string settingsFileContentsStdStr = cfgContents.c_str(); - bool matchFound = std::regex_search(settingsFileContentsStdStr, matchResults, sysGameRegex); - - std::string result; - if (matchFound) - { - // Case 1, 2, and 3 - Key value pair exists, stomp over the key with a new value pair. - result = std::regex_replace(cfgContents.c_str(), sysGameRegex, gameFolderAssignment.c_str()); - } - else - { - // Cases 4 through 6 - the key does not exist. - result = cfgContents.c_str(); - std::size_t insertLocation = 0; - // Case 5 & 6 - key does not exist, header is required - if (!header.empty()) - { - insertLocation = result.find(header.c_str()); - // Case 6 - key does not exist, header does exist. - // Set the key insertion point to right after the header. - if (insertLocation != std::string::npos) - { - insertLocation += header.length(); - } - // Case 5 - key does not exist, required header does not exist. - // Insert the header at the top of the file, set the key insertion point after the header. - else - { - AZStd::string headerAndCr = AZStd::string::format("\n%s\n", header.c_str()); - result.insert(result.length(), headerAndCr.c_str()); - insertLocation = result.length() - 1; - } - } - // Case 4 - key does not exist, header is not required. - // Case 5 & 6 - the header has been added. - // Insert the key at the tracked insertion point - AZStd::string newConfigData = AZStd::string::format("\n%s=%s", key.c_str(), value.c_str()); - result.insert(insertLocation, newConfigData.c_str()); - } - cfgContents = result.c_str(); - return AZ::Success(); - } - - /** - * Updates a configuration (ini) style contents string representation with a list of replacement string rules - * - * \param[in] cfgContents The contents of the ini file to update - * \param[in] updateRules The update rules (list of update strings, see below) to apply - * - * The replace string rule format follows the following: - * ([header]/)[key]=[value] - * - * where: - * header (optional) : Optional group title for the key - * key : The key to lookup or create for the value - * value : The value to update or create - */ - AZ::Outcome UpdateCfgContents(AZStd::string& cfgContents, const AZStd::list& updateRules) - { - AZStd::string updateCfgContents = cfgContents; - for (const AZStd::string& updateRule : updateRules) - { - // Since we are parsing manually anyways, no need to do a regex validation - AZStd::string::size_type headerKeySep = updateRule.find_first_of('/'); - bool hasHeader = (headerKeySep != AZStd::string::npos); - AZStd::string::size_type keyValueSep = updateRule.find_first_of('=', !hasHeader ? 0 : headerKeySep + 1); - if (keyValueSep == AZStd::string::npos) - { - return AZ::Failure(AZStd::string::format("Invalid update config rule '%s'. Must be in the format ([header]/)[key]=[value]", updateRule.c_str())); - } - AZStd::string header = hasHeader ? updateRule.substr(0, headerKeySep) : AZStd::string(""); - AZStd::string key = hasHeader ? updateRule.substr(headerKeySep + 1, keyValueSep - (headerKeySep + 1)) : updateRule.substr(0, keyValueSep); - AZStd::string value = updateRule.substr(keyValueSep + 1); - - auto updateResult = UpdateCfgContents(updateCfgContents, header, key, value); - if (!updateResult.IsSuccess()) - { - return updateResult; - } - } - cfgContents = updateCfgContents; - return AZ::Success(); - } } // namespace Internal - AZ::Outcome WriteJsonToString(const rapidjson::Document& document, AZStd::string& jsonText, WriteJsonSettings settings) - { - AZ::IO::ByteContainerStream stream{ &jsonText }; - return Internal::WriteJsonToStream(document, stream, settings); - } - - AZ::Outcome ReadJsonFromString(AZStd::string_view jsonText) - { - if (jsonText.empty()) - { - return AZ::Failure(AZStd::string("Failed to parse JSON: input string is empty.")); - } - - rapidjson::Document jsonDocument; - jsonDocument.Parse(jsonText.data(), jsonText.size()); - if (jsonDocument.HasParseError()) - { - size_t lineNumber = 1; - - const size_t errorOffset = jsonDocument.GetErrorOffset(); - for (size_t searchOffset = jsonText.find('\n'); - searchOffset < errorOffset && searchOffset < AZStd::string::npos; - searchOffset = jsonText.find('\n', searchOffset + 1)) - { - lineNumber++; - } - - return AZ::Failure(AZStd::string::format("JSON parse error at line %zu: %s", lineNumber, rapidjson::GetParseError_En(jsonDocument.GetParseError()))); - } - else - { - return AZ::Success(AZStd::move(jsonDocument)); - } - } - - AZ::Outcome ReadJsonFile(const AZ::IO::Path& jsonFilePath, AZ::IO::FileIOBase* overrideFileIO /*= nullptr*/, size_t maxFileSize /*= AZ::Utils::DefaultMaxFileSize*/) - { - AZ::IO::FileIOBase* fileIo = overrideFileIO != nullptr ? overrideFileIO : AZ::IO::FileIOBase::GetInstance(); - if (fileIo == nullptr) - { - return AZ::Failure(AZStd::string("No FileIO instance present.")); - } - - // Read into memory first and then parse the JSON, rather than passing a file stream to rapidjson. - // This should avoid creating a large number of micro-reads from the file. - - auto readResult = AZ::Utils::ReadFile(jsonFilePath.String(), maxFileSize); - if (!readResult.IsSuccess()) - { - return AZ::Failure(readResult.GetError()); - } - - AZStd::string jsonContent = readResult.TakeValue(); - - auto result = ReadJsonFromString(jsonContent); - if (!result.IsSuccess()) - { - return AZ::Failure(AZStd::string::format("Failed to load '%s'. %s", jsonFilePath.c_str(), result.GetError().c_str())); - } - else - { - return result; - } - } - - AZ::Outcome WriteJsonFile(const rapidjson::Document& jsonDoc, const AZ::IO::Path& jsonFilePath, WriteJsonSettings settings) - { - // Write the JSON into memory first and then write the file, rather than passing a file stream to rapidjson. - // This should avoid creating a large number of micro-writes to the file. - AZStd::string fileContent; - auto outcome = WriteJsonToString(jsonDoc, fileContent, settings); - if (!outcome.IsSuccess()) - { - return outcome; - } - - return AZ::Utils::WriteFile(fileContent, jsonFilePath.String()); - } - AZ::Outcome, AZStd::string> FindFilesInPath(const AZStd::string& folder, const AZStd::string& filter, bool recurseSubFolders) { AZStd::list fileList; @@ -348,61 +124,6 @@ namespace AzFramework return AZ::Success(); } - AZ::Outcome ReplaceInCfgFile(const AZStd::string& filePath, const AZStd::list& updateRules) - { - if (!AZ::IO::SystemFile::Exists(filePath.c_str())) - { - return AZ::Failure(AZStd::string::format("Cfg file '%s' does not exist.", filePath.c_str())); - } - - // Load the settings file into a string - AZ::IO::SystemFile settingsFile; - if (!settingsFile.Open(filePath.c_str(), AZ::IO::SystemFile::SF_OPEN_READ_ONLY)) - { - return AZ::Failure(AZStd::string::format("Error reading cfg file '%s'.", filePath.c_str())); - } - - AZStd::string settingsFileContents(settingsFile.Length(), '\0'); - settingsFile.Read(settingsFileContents.size(), settingsFileContents.data()); - settingsFile.Close(); - - auto updateContentResult = Internal::UpdateCfgContents(settingsFileContents, updateRules); - if (!updateContentResult.IsSuccess()) - { - return updateContentResult; - } - - // Write the result. - if (!settingsFile.ReOpen(AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY | AZ::IO::SystemFile::SF_OPEN_TRUNCATE)) - { - return AZ::Failure(AZStd::string::format("Failed to open settings file %s.", filePath.c_str())); - } - auto bytesWritten = settingsFile.Write(settingsFileContents.c_str(), settingsFileContents.size()); - settingsFile.Close(); - - if (bytesWritten != settingsFileContents.size()) - { - return AZ::Failure(AZStd::string::format("Failed to write to config file %s.", filePath.c_str())); - } - - return AZ::Success(); - } - - AZ::Outcome ReplaceInCfgFile(const AZStd::string& filePath, const char* header, const AZStd::string& key, const AZStd::string& newValue) - { - if (key.length() <= 0) - { - return AZ::Failure(AZStd::string("'key' parameter for ReplaceInCfgFile must not be empty")); - } - - AZStd::string updateRule = (header != nullptr) ? AZStd::string::format("%s/%s=%s", header, key.c_str(), newValue.c_str()) : AZStd::string::format("%s=%s", key.c_str(), newValue.c_str()); - AZStd::list updateRules{ - updateRule - }; - auto replaceResult = ReplaceInCfgFile(filePath, updateRules); - return replaceResult; - } - AZ::Outcome GetValueForKeyInCfgFile(const AZStd::string& filePath, const char* key) { AZ::Outcome subCommandResult = GetCfgFileContents(filePath); diff --git a/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.h b/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.h index 43609986f7..1fcef4ccfa 100644 --- a/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.h +++ b/Code/Framework/AzFramework/AzFramework/FileFunc/FileFunc.h @@ -27,49 +27,6 @@ namespace AzFramework { namespace FileFunc { - struct WriteJsonSettings - { - int m_maxDecimalPlaces = -1; // -1 means use default - }; - - /* - * Read a string into a JSON document - * - * \param[in] jsonText The string of JSON to parse into a JSON document. - * \return Outcome ReadJsonFromString(AZStd::string_view jsonText); - - /* - * Read a text file into a JSON document - * - * \param[in] jsonFilePath The path to the JSON file path to open - * \param[in] overrideFileIO Optional file IO instance to use. If null, use the Singleton instead - * \param[in] maxFileSize The maximum size, in bytes, of the file to read. Defaults to 1 MB. - * \return Outcome(rapidjson::Document) Returns a failure with error message if the content is not valid JSON. - */ - AZ::Outcome ReadJsonFile(const AZ::IO::Path& jsonFilePath, AZ::IO::FileIOBase* overrideFileIO = nullptr, size_t maxFileSize = AZ::Utils::DefaultMaxFileSize); - - /** - * Write a JSON document to a string - * - * \param[in] jsonDoc The JSON document to write to a text file - * \param[out] jsonFilePath The string that the JSON text will be written to. - * \param[in] settings Settings to pass along to the JSON writer. - * \return StringOutcome Saves the JSON document to text. Otherwise returns a failure with error message. - */ - AZ::Outcome WriteJsonToString(const rapidjson::Document& document, AZStd::string& jsonText, WriteJsonSettings settings = WriteJsonSettings{}); - - /** - * Write a JSON document to a text file - * - * \param[in] jsonDoc The JSON document to write to a text file - * \param[in] jsonFilePath The path to the JSON file path to write to - * \param[in] settings Settings to pass along to the JSON writer. - * \return StringOutcome Saves the JSON document to a file. Otherwise returns a failure with error message. - */ - AZ::Outcome WriteJsonFile(const rapidjson::Document& jsonDoc, const AZ::IO::Path& jsonFilePath, WriteJsonSettings settings = WriteJsonSettings{}); - /** * Find all the files in a path based on an optional filter. Recurse if requested. * @@ -91,38 +48,6 @@ namespace AzFramework */ AZ::Outcome ReadTextFileByLine(const AZStd::string& filePath, AZStd::function perLineCallback); - /** - * Replaces a value in an ini-style file. - * - * \param[in] filePath The path to the config file to update - * \param[in] updateRules The update rules (list of update strings, see below) to apply - * - * The replace string rule format follows the following: - * ([header]/)[key]=[value] - * - * where: - * header (optional) : Optional group title for the key - * key : The key to lookup or create for the value - * value : The value to update or create - */ - AZ::Outcome ReplaceInCfgFile(const AZStd::string& filePath, const AZStd::list& updateRules); - - /** - * Replaces a value in an ini-style file. - * - * \param[in] filePath The path to the config file to update - * \param[in] updateRule The update rule (list of update strings, see below) to apply - * - * The replace string rule format follows the following: - * ([header]/)[key]=[value] - * - * where: - * header (optional) : Optional group title for the key - * key : The key to lookup or create for the value - * value : The value to update or create - */ - AZ::Outcome ReplaceInCfgFile(const AZStd::string& filePath, const char* header, const AZStd::string& key, const AZStd::string& newValue); - /** * Gets the value(s) for a key in an INI style config file. * diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 0a9c937832..85b89b93dc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -11,11 +11,12 @@ #include #include +#include #include #include +#include #include -#include #include #include #include @@ -134,7 +135,7 @@ namespace AzToolsFramework } // Read Template's prefab file from disk and parse Prefab DOM from file. - AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFromString(fileContent); + AZ::Outcome readPrefabFileResult = AZ::JsonSerializationUtils::ReadJsonString(fileContent); if (!readPrefabFileResult.IsSuccess()) { AZ_Error( @@ -346,7 +347,7 @@ namespace AzToolsFramework return false; } - auto outcome = AzFramework::FileFunc::WriteJsonFile(domAndFilepath->first, GetFullPath(domAndFilepath->second)); + auto outcome = AZ::JsonSerializationUtils::WriteJsonFile(domAndFilepath->first, GetFullPath(domAndFilepath->second).Native()); if (!outcome.IsSuccess()) { AZ_Error( @@ -387,7 +388,7 @@ namespace AzToolsFramework return false; } - auto outcome = AzFramework::FileFunc::WriteJsonFile(domAndFilepath->first, absolutePath); + auto outcome = AZ::JsonSerializationUtils::WriteJsonFile(domAndFilepath->first, absolutePath.Native()); if (!outcome.IsSuccess()) { AZ_Error( @@ -410,7 +411,7 @@ namespace AzToolsFramework return false; } - auto outcome = AzFramework::FileFunc::WriteJsonToString(domAndFilepath->first, output); + auto outcome = AZ::JsonSerializationUtils::WriteJsonString(domAndFilepath->first, output); if (!outcome.IsSuccess()) { AZ_Error( diff --git a/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp b/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp index 80b1576b33..c4299a6ff9 100644 --- a/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp +++ b/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp @@ -26,20 +26,6 @@ #include #include -namespace AzFramework -{ - namespace FileFunc - { - namespace Internal - { - AZ::Outcome UpdateCfgContents(AZStd::string& cfgContents, const AZStd::list& updateRules); - AZ::Outcome UpdateCfgContents(AZStd::string& cfgContents, const AZStd::string& header, const AZStd::string& key, const AZStd::string& value); - AZ::Outcome WriteJsonToStream(const rapidjson::Document& document, AZ::IO::GenericStream& stream, - WriteJsonSettings settings = WriteJsonSettings{}); - } - } -} - namespace UnitTest { class FileFuncTest : public ScopedAllocatorSetupFixture @@ -62,110 +48,6 @@ namespace UnitTest AZ::IO::FileIOBase* m_prevFileIO; }; - TEST_F(FileFuncTest, UpdateCfgContents_InValidInput_Fail) - { - AZStd::string cfgContents = "[Foo]\n"; - AZStd::list updateRules; - - updateRules.push_back(AZStd::string("Foo/one*1")); - auto result = AzFramework::FileFunc::Internal::UpdateCfgContents(cfgContents, updateRules); - ASSERT_FALSE(result.IsSuccess()); - } - - TEST_F(FileFuncTest, UpdateCfgContents_ValidInput_Success) - { - AZStd::string cfgContents = - "[Foo]\n" - "one =2 \n" - "two= 3\n" - "three = 4\n" - "\n" - "[Bar]\n" - "four=3\n" - "five=3\n" - "six=3\n" - "eight=3\n"; - - AZStd::list updateRules; - - updateRules.push_back(AZStd::string("Foo/one=1")); - updateRules.push_back(AZStd::string("Foo/two=2")); - updateRules.push_back(AZStd::string("three=3")); - auto result = AzFramework::FileFunc::Internal::UpdateCfgContents(cfgContents, updateRules); - EXPECT_TRUE(result.IsSuccess()); - - AZStd::string compareCfgContents = - "[Foo]\n" - "one =1\n" - "two= 2\n" - "three = 3\n" - "\n" - "[Bar]\n" - "four=3\n" - "five=3\n" - "six=3\n" - "eight=3\n"; - - bool equals = cfgContents.compare(compareCfgContents) == 0; - ASSERT_TRUE(equals); - } - - TEST_F(FileFuncTest, UpdateCfgContents_ValidInputNewEntrySameHeader_Success) - { - AZStd::string cfgContents = - "[Foo]\n" - "one =2 \n" - "two= 3\n" - "three = 4\n"; - - AZStd::string header("[Foo]"); - AZStd::string key("four"); - AZStd::string value("4"); - auto result = AzFramework::FileFunc::Internal::UpdateCfgContents(cfgContents, header, key, value); - EXPECT_TRUE(result.IsSuccess()); - - AZStd::string compareCfgContents = - "[Foo]\n" - "four=4\n" - "one =2 \n" - "two= 3\n" - "three = 4\n"; - - bool equals = cfgContents.compare(compareCfgContents) == 0; - ASSERT_TRUE(equals); - } - - TEST_F(FileFuncTest, UpdateCfgContents_ValidInputNewEntryDifferentHeader_Success) - { - AZStd::string cfgContents = - ";Sample Data\n" - "[Foo]\n" - "one =2 \n" - "two= 3\n" - "three = 4\n"; - - AZStd::list updateRules; - - AZStd::string header("[Bar]"); - AZStd::string key("four"); - AZStd::string value("4"); - auto result = AzFramework::FileFunc::Internal::UpdateCfgContents(cfgContents, header, key, value); - EXPECT_TRUE(result.IsSuccess()); - - AZStd::string compareCfgContents = - ";Sample Data\n" - "[Foo]\n" - "one =2 \n" - "two= 3\n" - "three = 4\n" - "\n" - "[Bar]\n" - "four=4\n"; - - bool equals = cfgContents.compare(compareCfgContents) == 0; - ASSERT_TRUE(equals); - } - static bool CreateDummyFile(const QString& fullPathToFile, const QString& tempStr = {}) { QFileInfo fi(fullPathToFile); @@ -268,213 +150,4 @@ namespace UnitTest ASSERT_NE(findElement, result.GetValue().end()); } } - - class JsonFileFuncTest - : public FrameworkApplicationFixture - { - protected: - void SetUp() override - { - FrameworkApplicationFixture::SetUp(); - - AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get(); - auto projectPathKey = - AZ::SettingsRegistryInterface::FixedValueString(AZ::SettingsRegistryMergeUtils::BootstrapSettingsRootKey) + "/project_path"; - registry->Set(projectPathKey, "AutomatedTesting"); - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry); - - m_serializeContext = AZStd::make_unique(); - m_jsonRegistrationContext = AZStd::make_unique(); - m_jsonSystemComponent = AZStd::make_unique(); - - m_serializationSettings.m_serializeContext = m_serializeContext.get(); - m_serializationSettings.m_registrationContext = m_jsonRegistrationContext.get(); - - m_deserializationSettings.m_serializeContext = m_serializeContext.get(); - m_deserializationSettings.m_registrationContext = m_jsonRegistrationContext.get(); - - m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get()); - } - - void TearDown() override - { - m_jsonRegistrationContext->EnableRemoveReflection(); - m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get()); - m_jsonRegistrationContext->DisableRemoveReflection(); - - m_jsonRegistrationContext.reset(); - m_serializeContext.reset(); - m_jsonSystemComponent.reset(); - - FrameworkApplicationFixture::TearDown(); - } - - AZStd::unique_ptr m_serializeContext; - AZStd::unique_ptr m_jsonRegistrationContext; - AZStd::unique_ptr m_jsonSystemComponent; - - AZ::JsonSerializerSettings m_serializationSettings; - AZ::JsonDeserializerSettings m_deserializationSettings; - }; - - TEST_F(JsonFileFuncTest, WriteJsonString_ValidJson_ExpectSuccess) - { - rapidjson::Document document; - document.SetObject(); - document.AddMember("a", 1, document.GetAllocator()); - document.AddMember("b", 2, document.GetAllocator()); - document.AddMember("c", 3, document.GetAllocator()); - - AZStd::string expectedJsonText = - R"({ - "a": 1, - "b": 2, - "c": 3 - })"; - expectedJsonText.erase(AZStd::remove_if(expectedJsonText.begin(), expectedJsonText.end(), ::isspace), expectedJsonText.end()); - - AZStd::string outString; - AZ::Outcome result = AzFramework::FileFunc::WriteJsonToString(document, outString); - EXPECT_TRUE(result.IsSuccess()); - - outString.erase(AZStd::remove_if(outString.begin(), outString.end(), ::isspace), outString.end()); - EXPECT_EQ(expectedJsonText, outString) << "expected:\n" << expectedJsonText.c_str() << "\nactual:\n" << outString.c_str(); - } - - TEST_F(JsonFileFuncTest, WriteJsonStream_ValidJson_ExpectSuccess) - { - rapidjson::Document document; - document.SetObject(); - document.AddMember("a", 1, document.GetAllocator()); - document.AddMember("b", 2, document.GetAllocator()); - document.AddMember("c", 3, document.GetAllocator()); - - AZStd::string expectedJsonText = - R"({ - "a": 1, - "b": 2, - "c": 3 - })"; - expectedJsonText.erase(AZStd::remove_if(expectedJsonText.begin(), expectedJsonText.end(), ::isspace), expectedJsonText.end()); - - AZStd::vector outBuffer; - AZ::IO::ByteContainerStream> outStream{ &outBuffer }; - AZ::Outcome result = AzFramework::FileFunc::Internal::WriteJsonToStream(document, outStream); - EXPECT_TRUE(result.IsSuccess()); - - outBuffer.push_back(0); - AZStd::string outString = outBuffer.data(); - outString.erase(AZStd::remove_if(outString.begin(), outString.end(), ::isspace), outString.end()); - EXPECT_EQ(expectedJsonText, outString) << "expected:\n" << expectedJsonText.c_str() << "\nactual:\n" << outString.c_str(); - } - - TEST_F(JsonFileFuncTest, WriteJsonFile_ValidJson_ExpectSuccess) - { - AZ::Test::ScopedAutoTempDirectory tempDir; - - rapidjson::Document document; - document.SetObject(); - document.AddMember("a", 1, document.GetAllocator()); - document.AddMember("b", 2, document.GetAllocator()); - document.AddMember("c", 3, document.GetAllocator()); - - AZStd::string expectedJsonText = - R"({ - "a": 1, - "b": 2, - "c": 3 - })"; - expectedJsonText.erase(AZStd::remove_if(expectedJsonText.begin(), expectedJsonText.end(), ::isspace), expectedJsonText.end()); - - AZStd::string pathStr; - AzFramework::StringFunc::Path::ConstructFull(tempDir.GetDirectory(), "test.json", pathStr, true); - - // Write the JSON to a file - AZ::IO::Path path(pathStr); - AZ::Outcome saveResult = AzFramework::FileFunc::WriteJsonFile(document, path); - EXPECT_TRUE(saveResult.IsSuccess()); - - // Verify that the contents of the file is what we expect - AZ::Outcome readResult = AZ::Utils::ReadFile(pathStr); - EXPECT_TRUE(readResult.IsSuccess()); - AZStd::string outString(readResult.TakeValue()); - outString.erase(AZStd::remove_if(outString.begin(), outString.end(), ::isspace), outString.end()); - EXPECT_EQ(outString, expectedJsonText); - - // Clean up - AZ::IO::FileIOBase::GetInstance()->Remove(path.c_str()); - } - - TEST_F(JsonFileFuncTest, ReadJsonString_ValidJson_ExpectSuccess) - { - const char* jsonText = - R"( - { - "a": 1, - "b": 2, - "c": 3 - })"; - - AZ::Outcome result = AzFramework::FileFunc::ReadJsonFromString(jsonText); - - EXPECT_TRUE(result.IsSuccess()); - EXPECT_TRUE(result.GetValue().IsObject()); - EXPECT_TRUE(result.GetValue().HasMember("a")); - EXPECT_TRUE(result.GetValue().HasMember("b")); - EXPECT_TRUE(result.GetValue().HasMember("c")); - EXPECT_EQ(result.GetValue()["a"].GetInt(), 1); - EXPECT_EQ(result.GetValue()["b"].GetInt(), 2); - EXPECT_EQ(result.GetValue()["c"].GetInt(), 3); - } - - TEST_F(JsonFileFuncTest, ReadJsonString_InvalidJson_ErrorReportsLineNumber) - { - const char* jsonText = - R"( - { - "a": "This line is missing a comma" - "b": 2, - "c": 3 - } - )"; - - AZ::Outcome result = AzFramework::FileFunc::ReadJsonFromString(jsonText); - - EXPECT_FALSE(result.IsSuccess()); - EXPECT_TRUE(result.GetError().find("JSON parse error at line 4:") == 0); - } - - TEST_F(JsonFileFuncTest, ReadJsonFile_ValidJson_ExpectSuccess) - { - AZ::Test::ScopedAutoTempDirectory tempDir; - - const char* inputJsonText = - R"({ - "a": 1, - "b": 2, - "c": 3 - })"; - - rapidjson::Document expectedDocument; - expectedDocument.SetObject(); - expectedDocument.AddMember("a", 1, expectedDocument.GetAllocator()); - expectedDocument.AddMember("b", 2, expectedDocument.GetAllocator()); - expectedDocument.AddMember("c", 3, expectedDocument.GetAllocator()); - - // Create test file - AZStd::string path; - AzFramework::StringFunc::Path::ConstructFull(tempDir.GetDirectory(), "test.json", path, true); - AZ::Outcome writeResult = AZ::Utils::WriteFile(inputJsonText, path); - EXPECT_TRUE(writeResult.IsSuccess()); - - - // Read the JSON from the test file - AZ::Outcome readResult = AzFramework::FileFunc::ReadJsonFile(path); - EXPECT_TRUE(readResult.IsSuccess()); - - EXPECT_EQ(expectedDocument, readResult.GetValue()); - - // Clean up - AZ::IO::FileIOBase::GetInstance()->Remove(path.c_str()); - } } // namespace UnitTest diff --git a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h index 3f47424328..296d791f9a 100644 --- a/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h +++ b/Code/Tools/SceneAPI/SceneCore/Components/SceneSystemComponent.h @@ -19,8 +19,7 @@ namespace AZ { // Scene system components are components that can be used to create system components // in situations where the full initialization and/or construction of regular - // system components don't apply such as in the Project Manager's advanced - // settings and the ResourceCompilerScene. + // system components don't apply such as in the ResourceCompilerScene. class SCENE_CORE_CLASS SceneSystemComponent : public AZ::Component { diff --git a/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.cpp b/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.cpp index 8bbe9e2ed3..d68b6c52d4 100644 --- a/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Containers/SceneManifest.cpp @@ -21,10 +21,10 @@ #include #include #include +#include #include #include #include -#include #include #include #include @@ -163,8 +163,7 @@ namespace AZ return false; } - AZ::IO::Path fileIoPath(absoluteFilePath); - auto saveToFileOutcome = AzFramework::FileFunc::WriteJsonFile(saveToJsonOutcome.GetValue(), fileIoPath); + auto saveToFileOutcome = AZ::JsonSerializationUtils::WriteJsonFile(saveToJsonOutcome.GetValue(), absoluteFilePath); if (!saveToFileOutcome.IsSuccess()) { AZ_Error(ErrorWindowName, false, "%s%s", errorMsg.c_str(), saveToFileOutcome.GetError().c_str()); @@ -309,7 +308,7 @@ namespace AZ else { // Attempt to read the stream as JSON - auto readJsonOutcome = AzFramework::FileFunc::ReadJsonFromString(fileContents); + auto readJsonOutcome = AZ::JsonSerializationUtils::ReadJsonString(fileContents); AZStd::string errorMsg; if (!readJsonOutcome.IsSuccess()) { diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneManifestTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneManifestTests.cpp index 875e433bb7..1766395626 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneManifestTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneManifestTests.cpp @@ -14,8 +14,8 @@ #include #include #include +#include #include -#include #include #include #include @@ -325,7 +325,7 @@ namespace AZ ASSERT_TRUE(writeToJsonResult.IsSuccess()); AZStd::string jsonText; - auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText); ASSERT_TRUE(writeToStringResult.IsSuccess()); MockSceneManifest loaded; @@ -340,7 +340,7 @@ namespace AZ ASSERT_TRUE(writeToJsonResult.IsSuccess()); AZStd::string jsonText; - auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText); ASSERT_TRUE(writeToStringResult.IsSuccess()); MockSceneManifest loaded; @@ -371,7 +371,7 @@ namespace AZ ASSERT_TRUE(writeToJsonResult.IsSuccess()); AZStd::string jsonText; - auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText); ASSERT_TRUE(writeToStringResult.IsSuccess()); // Deserialize JSON diff --git a/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp b/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp index 428788f626..e0d5cca484 100644 --- a/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp +++ b/Code/Tools/SceneAPI/SceneData/Tests/SceneManifest/SceneManifestRuleTests.cpp @@ -20,12 +20,12 @@ #include #include #include +#include #include #include #include #include #include -#include namespace AZ { @@ -154,7 +154,7 @@ namespace AZ ASSERT_TRUE(writeToJsonResult.IsSuccess()); AZStd::string jsonText; - auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText); ASSERT_TRUE(writeToStringResult.IsSuccess()); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("$type": "MockRotationRule")")); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("rotation": [)")); @@ -191,7 +191,7 @@ namespace AZ ASSERT_TRUE(writeToJsonResult.IsSuccess()); AZStd::string jsonText; - auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText); ASSERT_TRUE(writeToStringResult.IsSuccess()); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("$type": "MockRotationRule")")); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("rotation": [)")); @@ -230,7 +230,7 @@ namespace AZ ASSERT_TRUE(writeToJsonResult.IsSuccess()); AZStd::string jsonText; - auto writeToStringResult = AzFramework::FileFunc::WriteJsonToString(writeToJsonResult.GetValue(), jsonText); + auto writeToStringResult = AZ::JsonSerializationUtils::WriteJsonString(writeToJsonResult.GetValue(), jsonText); ASSERT_TRUE(writeToStringResult.IsSuccess()); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("$type": "CoordinateSystemRule")")); EXPECT_THAT(jsonText.c_str(), ::testing::HasSubstr(R"("useAdvancedData": true,)")); diff --git a/Gems/AWSCore/Code/Source/ResourceMapping/AWSResourceMappingManager.cpp b/Gems/AWSCore/Code/Source/ResourceMapping/AWSResourceMappingManager.cpp index 7b5196462c..c3d87bff86 100644 --- a/Gems/AWSCore/Code/Source/ResourceMapping/AWSResourceMappingManager.cpp +++ b/Gems/AWSCore/Code/Source/ResourceMapping/AWSResourceMappingManager.cpp @@ -9,9 +9,9 @@ #include #include #include +#include #include #include -#include #include #include @@ -211,8 +211,7 @@ namespace AWSCore } AzFramework::StringFunc::Path::Normalize(configJsonPath); - AZ::IO::Path configJsonFileIOPath(configJsonPath); - auto readJsonOutcome = AzFramework::FileFunc::ReadJsonFile(configJsonFileIOPath); + auto readJsonOutcome = AZ::JsonSerializationUtils::ReadJsonFile(configJsonPath); if (readJsonOutcome.IsSuccess()) { auto jsonDocument = readJsonOutcome.TakeValue(); diff --git a/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp b/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp index aa0f59976f..7e4ec05aba 100644 --- a/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp +++ b/Gems/AWSMetrics/Code/Source/IdentityProvider.cpp @@ -11,7 +11,7 @@ #include #include #include -#include +#include namespace AWSMetrics { @@ -39,8 +39,7 @@ namespace AWSMetrics return ""; } - AZ::IO::Path configIoPath(resolvedPath); - auto readOutcome = AzFramework::FileFunc::ReadJsonFile(configIoPath, fileIO); + auto readOutcome = AZ::JsonSerializationUtils::ReadJsonFile(resolvedPath); if (!readOutcome.IsSuccess()) { AZ_Error("AWSMetrics", false, readOutcome.GetError().c_str()); diff --git a/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp b/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp index e23c97a5fe..737ef6abc5 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsEvent.cpp @@ -11,7 +11,7 @@ #include #include -#include +#include #include @@ -150,7 +150,7 @@ namespace AWSMetrics return false; } - auto result = AzFramework::FileFunc::ReadJsonFromString(stringStream.str().c_str()); + auto result = AZ::JsonSerializationUtils::ReadJsonString(stringStream.str().c_str()); if (!result.IsSuccess()) { return false; diff --git a/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp b/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp index 4cc037189a..ec90cf28ef 100644 --- a/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp +++ b/Gems/AWSMetrics/Code/Source/MetricsQueue.cpp @@ -14,8 +14,8 @@ #include #include #include +#include #include -#include #include @@ -191,15 +191,7 @@ namespace AWSMetrics bool MetricsQueue::ReadFromJson(const AZStd::string& filePath) { - AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance(); - if (!fileIO) - { - AZ_Error("AWSMetrics", false, "Failed to get file IO instance"); - return false; - } - - AZ::IO::Path fileIoPath(filePath); - auto result = AzFramework::FileFunc::ReadJsonFile(fileIoPath, fileIO); + auto result = AZ::JsonSerializationUtils::ReadJsonFile(filePath); if (!result.IsSuccess() ||!ReadFromJsonDocument(result.GetValue())) { AZ_Error("AWSMetrics", false, "Failed to read metrics file %s", filePath.c_str()); diff --git a/Gems/EMotionFX/Code/EMotionFX/Exporters/ExporterLib/Exporter/MotionEventExport.cpp b/Gems/EMotionFX/Code/EMotionFX/Exporters/ExporterLib/Exporter/MotionEventExport.cpp index e1bde1ff79..d2a69bca67 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Exporters/ExporterLib/Exporter/MotionEventExport.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Exporters/ExporterLib/Exporter/MotionEventExport.cpp @@ -11,8 +11,8 @@ #include #include #include +#include #include -#include #include "Exporter.h" #include #include @@ -55,10 +55,10 @@ namespace ExporterLib } AZStd::string serializedMotionEventTable; - auto writeToStringOutcome = AzFramework::FileFunc::WriteJsonToString(jsonDocument, serializedMotionEventTable); + auto writeToStringOutcome = AZ::JsonSerializationUtils::WriteJsonString(jsonDocument, serializedMotionEventTable); if (!writeToStringOutcome.IsSuccess()) { - AZ_Error("EMotionFX", false, "WriteJsonToString failed: %s", writeToStringOutcome.GetError().c_str()); + AZ_Error("EMotionFX", false, "WriteJsonString failed: %s", writeToStringOutcome.GetError().c_str()); return; } diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Importer/ChunkProcessors.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Importer/ChunkProcessors.cpp index fad160407b..10f9c0dc60 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Importer/ChunkProcessors.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Importer/ChunkProcessors.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include @@ -1081,11 +1081,11 @@ namespace EMotionFX file->Read(&buffer[0], fileEventTable.m_size); AZStd::string_view bufferStringView(&buffer[0], buffer.size()); - auto readJsonOutcome = AzFramework::FileFunc::ReadJsonFromString(bufferStringView); + auto readJsonOutcome = AZ::JsonSerializationUtils::ReadJsonString(bufferStringView); AZStd::string errorMsg; if (!readJsonOutcome.IsSuccess()) { - AZ_Error("EMotionFX", false, "Loading motion event table failed due to ReadJsonFromString. %s", readJsonOutcome.TakeError().c_str()); + AZ_Error("EMotionFX", false, "Loading motion event table failed due to ReadJsonString. %s", readJsonOutcome.TakeError().c_str()); return false; } rapidjson::Document document = readJsonOutcome.TakeValue(); diff --git a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp index 88284ede1d..b65a3e917c 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -27,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -73,9 +73,7 @@ namespace SliceBuilder AzFramework::StringFunc::Path::Join(relativePath.c_str(), settingsAssetInfo.m_relativePath.c_str(), sliceBuilderSettingsPath, true, true); // Attempt to load the Slice Builder Settings file - AZ::IO::LocalFileIO localFileIO; - AZ::IO::Path sliceBuilderSettingsIoPath(sliceBuilderSettingsPath); - auto result = AzFramework::FileFunc::ReadJsonFile(sliceBuilderSettingsIoPath, &localFileIO); + auto result = AZ::JsonSerializationUtils::ReadJsonFile(sliceBuilderSettingsPath); if (result.IsSuccess()) { AZ::JsonSerializationResult::ResultCode serializaionResult = AZ::JsonSerialization::Load(m_settings, result.GetValue()); diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp index bffb64e51b..a86d7b57e2 100644 --- a/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.cpp @@ -132,7 +132,7 @@ namespace AZ::Prefab AZ::StringFunc::Path::ConstructFull(request.m_watchFolder.c_str(), request.m_sourceFile.c_str(), fullPath); // Load the JSON Dom - AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFile(AZ::IO::Path(fullPath)); + AZ::Outcome readPrefabFileResult = AZ::JsonSerializationUtils::ReadJsonFile(fullPath); if (!readPrefabFileResult.IsSuccess()) { AZ_Error( diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h index 1458c8dd40..9ebdd690f5 100644 --- a/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderComponent.h @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp index 95827d4457..7d3096a6da 100644 --- a/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp +++ b/Gems/Prefab/PrefabBuilder/PrefabBuilderTests.cpp @@ -9,6 +9,7 @@ #include "PrefabBuilderTests.h" #include #include +#include #include #include #include @@ -56,7 +57,7 @@ namespace UnitTest // Save to a string so we can load it as a PrefabDom and so that the nested instance becomes a Source file reference ASSERT_TRUE(prefabLoaderInterface->SaveTemplateToString(parentInstance->GetTemplateId(), serializedInstance)); - AZ::Outcome readPrefabFileResult = AzFramework::FileFunc::ReadJsonFromString(serializedInstance); + AZ::Outcome readPrefabFileResult = AZ::JsonSerializationUtils::ReadJsonString(serializedInstance); ASSERT_TRUE(readPrefabFileResult.IsSuccess()); diff --git a/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp b/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp index 2c12344873..9a03d7c1ce 100644 --- a/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp +++ b/Gems/SceneLoggingExample/Code/SceneLoggingExampleModule.cpp @@ -42,7 +42,7 @@ namespace SceneLoggingExample } // In this example, no system components are added. You can use system components - // to set global settings for this gem from the Project Manager. + // to set global settings for this gem. // For functionality that should always be available to the SceneAPI, we recommend // that you use a BehaviorComponent instead. AZ::ComponentTypeList GetRequiredSystemComponents() const override diff --git a/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp b/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp index 93d8fc6a06..ea0c3520bf 100644 --- a/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp +++ b/Gems/SceneProcessing/Code/Source/Config/Components/SceneProcessingConfigSystemComponent.cpp @@ -34,7 +34,7 @@ namespace AZ ActivateSceneModule(SceneProcessing::s_sceneDataModule); ActivateSceneModule(SceneProcessing::s_sceneBuilderModule); - // Defaults in case there's no config setup in the Project Manager. + // Defaults in case there's no config setup m_softNames.push_back(aznew NodeSoftNameSetting("^.*_[Ll][Oo][Dd]1(_optimized)?$", PatternMatcher::MatchApproach::Regex, "LODMesh1", true)); m_softNames.push_back(aznew NodeSoftNameSetting("^.*_[Ll][Oo][Dd]2(_optimized)?$", PatternMatcher::MatchApproach::Regex, "LODMesh2", true)); m_softNames.push_back(aznew NodeSoftNameSetting("^.*_[Ll][Oo][Dd]3(_optimized)?$", PatternMatcher::MatchApproach::Regex, "LODMesh3", true)); From cce532c99e573d81be2878f5100587960eff732f Mon Sep 17 00:00:00 2001 From: jromnoa Date: Mon, 30 Aug 2021 12:40:09 -0700 Subject: [PATCH 018/355] remove EDITOR_TIMEOUT constant and manually enter each time value, sets an example for future patterns to NOT use a constant for this value Signed-off-by: jromnoa --- .../Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py index 646c20a84f..c40dc8f178 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py @@ -16,7 +16,6 @@ import editor_python_test_tools.hydra_test_utils as hydra from atom_renderer.atom_utils.atom_constants import LIGHT_TYPES logger = logging.getLogger(__name__) -EDITOR_TIMEOUT = 120 TEST_DIRECTORY = os.path.join(os.path.dirname(__file__), "atom_hydra_scripts") @@ -175,7 +174,7 @@ class TestAtomEditorComponentsMain(object): TEST_DIRECTORY, editor, "hydra_AtomEditorComponents_AddedToEntity.py", - timeout=EDITOR_TIMEOUT, + timeout=120, expected_lines=expected_lines, unexpected_lines=unexpected_lines, halt_on_unexpected=True, @@ -236,7 +235,7 @@ class TestAtomEditorComponentsMain(object): TEST_DIRECTORY, editor, "hydra_AtomEditorComponents_LightComponent.py", - timeout=EDITOR_TIMEOUT, + timeout=120, expected_lines=expected_lines, unexpected_lines=unexpected_lines, halt_on_unexpected=True, @@ -299,7 +298,7 @@ class TestMaterialEditorBasicTests(object): generic_launcher, "hydra_AtomMaterialEditor_BasicTests.py", run_python="--runpython", - timeout=EDITOR_TIMEOUT, + timeout=120, expected_lines=expected_lines, unexpected_lines=unexpected_lines, halt_on_unexpected=True, From da6bdd5b43dabdac3c8980d82efa5859e59fd484 Mon Sep 17 00:00:00 2001 From: Vincent Liu <5900509+onecent1101@users.noreply.github.com> Date: Mon, 30 Aug 2021 13:06:29 -0700 Subject: [PATCH 019/355] [LYN-4065] Expose GameLift server api to notify server process ready (#2409) --- .../Code/AWSGameLiftServer/CMakeLists.txt | 2 + .../Request/IAWSGameLiftServerRequests.h | 43 +++++++++++++++ .../Source/AWSGameLiftServerManager.cpp | 55 +++++++++++++++++-- .../Source/AWSGameLiftServerManager.h | 21 ++++--- .../AWSGameLiftServerSystemComponent.cpp | 39 +------------ .../Source/AWSGameLiftServerSystemComponent.h | 4 -- .../Tests/AWSGameLiftServerManagerTest.cpp | 48 ++++++++++------ .../AWSGameLiftServerSystemComponentTest.cpp | 16 ------ .../awsgamelift_server_files.cmake | 1 + 9 files changed, 142 insertions(+), 87 deletions(-) create mode 100644 Gems/AWSGameLift/Code/AWSGameLiftServer/Include/Request/IAWSGameLiftServerRequests.h diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/CMakeLists.txt b/Gems/AWSGameLift/Code/AWSGameLiftServer/CMakeLists.txt index 4fa2ddd82b..798c6a6a25 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/CMakeLists.txt +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/CMakeLists.txt @@ -16,6 +16,8 @@ ly_add_target( FILES_CMAKE awsgamelift_server_files.cmake INCLUDE_DIRECTORIES + PUBLIC + Include PRIVATE ../AWSGameLiftCommon/Source Source diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Include/Request/IAWSGameLiftServerRequests.h b/Gems/AWSGameLift/Code/AWSGameLiftServer/Include/Request/IAWSGameLiftServerRequests.h new file mode 100644 index 0000000000..e5b14319a8 --- /dev/null +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Include/Request/IAWSGameLiftServerRequests.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include +#include +#include + +namespace AWSGameLift +{ + //! IAWSGameLiftServerRequests + //! Server interfaces to expose Amazon GameLift Server SDK + class IAWSGameLiftServerRequests + { + public: + AZ_RTTI(IAWSGameLiftServerRequests, "{D76CD98D-4C37-4C25-82C4-4E8772706D70}"); + + IAWSGameLiftServerRequests() = default; + virtual ~IAWSGameLiftServerRequests() = default; + + //! Notify GameLift that the server process is ready to host a game session. + //! @return Whether the ProcessReady notification is sent to GameLift. + virtual bool NotifyGameLiftProcessReady() = 0; + }; + + // IAWSGameLiftServerRequests EBus wrapper for scripting + class AWSGameLiftServerRequests + : public AZ::EBusTraits + { + public: + using MutexType = AZStd::recursive_mutex; + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + }; + using AWSGameLiftServerRequestBus = AZ::EBus; +} // namespace AWSGameLift diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.cpp b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.cpp index 94d6a7dac1..e739933ab2 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.cpp +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.cpp @@ -10,8 +10,11 @@ #include #include +#include #include #include +#include +#include #include #include #include @@ -32,6 +35,18 @@ namespace AWSGameLift m_connectedPlayers.clear(); } + void AWSGameLiftServerManager::ActivateManager() + { + AZ::Interface::Register(this); + AWSGameLiftServerRequestBus::Handler::BusConnect(); + } + + void AWSGameLiftServerManager::DeactivateManager() + { + AWSGameLiftServerRequestBus::Handler::BusDisconnect(); + AZ::Interface::Unregister(this); + } + bool AWSGameLiftServerManager::AddConnectedPlayer(const AzFramework::PlayerConnectionConfig& playerConnectionConfig) { AZStd::lock_guard lock(m_gameliftMutex); @@ -51,6 +66,37 @@ namespace AWSGameLift } } + GameLiftServerProcessDesc AWSGameLiftServerManager::BuildGameLiftServerProcessDesc() + { + GameLiftServerProcessDesc serverProcessDesc; + AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance(); + if (fileIO) + { + const char pathToLogFolder[] = "@log@/"; + char resolvedPath[AZ_MAX_PATH_LEN]; + if (fileIO->ResolvePath(pathToLogFolder, resolvedPath, AZ_ARRAY_SIZE(resolvedPath))) + { + serverProcessDesc.m_logPaths.push_back(resolvedPath); + } + else + { + AZ_Error(AWSGameLiftServerManagerName, false, "Failed to resolve the path to the log folder."); + } + } + else + { + AZ_Error(AWSGameLiftServerManagerName, false, "Failed to get File IO."); + } + + if (auto console = AZ::Interface::Get(); console != nullptr) + { + [[maybe_unused]] AZ::GetValueResult getCvarResult = console->GetCvarValue("sv_port", serverProcessDesc.m_port); + AZ_Error(AWSGameLiftServerManagerName, getCvarResult == AZ::GetValueResult::Success, + "Lookup of 'sv_port' console variable failed with error %s", AZ::GetEnumString(getCvarResult)); + } + return serverProcessDesc; + } + AzFramework::SessionConfig AWSGameLiftServerManager::BuildSessionConfig(const Aws::GameLift::Server::Model::GameSession& gameSession) { AzFramework::SessionConfig sessionConfig; @@ -99,12 +145,12 @@ namespace AWSGameLift return AZ::IO::Path(); } - bool AWSGameLiftServerManager::InitializeGameLiftServerSDK() + void AWSGameLiftServerManager::InitializeGameLiftServerSDK() { if (m_serverSDKInitialized) { AZ_Error(AWSGameLiftServerManagerName, false, AWSGameLiftServerSDKAlreadyInitErrorMessage); - return false; + return; } AZ_TracePrintf(AWSGameLiftServerManagerName, "Initiating Amazon GameLift Server SDK ..."); @@ -115,8 +161,6 @@ namespace AWSGameLift AZ_Error(AWSGameLiftServerManagerName, m_serverSDKInitialized, AWSGameLiftServerInitSDKErrorMessage, initOutcome.GetError().GetErrorMessage().c_str()); - - return m_serverSDKInitialized; } void AWSGameLiftServerManager::HandleDestroySession() @@ -170,7 +214,7 @@ namespace AWSGameLift playerSessionId.c_str(), disconnectOutcome.GetError().GetErrorMessage().c_str()); } - bool AWSGameLiftServerManager::NotifyGameLiftProcessReady(const GameLiftServerProcessDesc& desc) + bool AWSGameLiftServerManager::NotifyGameLiftProcessReady() { if (!m_serverSDKInitialized) { @@ -178,6 +222,7 @@ namespace AWSGameLift return false; } + GameLiftServerProcessDesc desc = BuildGameLiftServerProcessDesc(); AZ_Warning(AWSGameLiftServerManagerName, desc.m_port != 0, AWSGameLiftServerTempPortErrorMessage); AZ::JobContext* jobContext = nullptr; diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.h b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.h index 09c9d4a719..c0f1c00bea 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.h +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerManager.h @@ -16,6 +16,7 @@ #include #include #include +#include namespace AWSGameLift { @@ -31,7 +32,8 @@ namespace AWSGameLift //! Manage the server process for hosting game sessions via GameLiftServerSDK. class AWSGameLiftServerManager - : public AzFramework::ISessionHandlingProviderRequests + : public AWSGameLiftServerRequestBus::Handler + , public AzFramework::ISessionHandlingProviderRequests { public: static constexpr const char AWSGameLiftServerManagerName[] = "AWSGameLiftServerManager"; @@ -68,14 +70,14 @@ namespace AWSGameLift AWSGameLiftServerManager(); virtual ~AWSGameLiftServerManager(); - //! Initialize GameLift API client by calling InitSDK(). - //! @return Whether the initialization is successful. - bool InitializeGameLiftServerSDK(); + void ActivateManager(); + void DeactivateManager(); - //! Notify GameLift that the server process is ready to host a game session. - //! @param desc GameLift server process settings. - //! @return Whether the ProcessReady notification is sent to GameLift. - bool NotifyGameLiftProcessReady(const GameLiftServerProcessDesc& desc); + //! Initialize GameLift API client by calling InitSDK(). + void InitializeGameLiftServerSDK(); + + // AWSGameLiftServerRequestBus interface implementation + bool NotifyGameLiftProcessReady() override; // ISessionHandlingProviderRequests interface implementation void HandleDestroySession() override; @@ -91,6 +93,9 @@ namespace AWSGameLift bool AddConnectedPlayer(const AzFramework::PlayerConnectionConfig& playerConnectionConfig); private: + //! Build the serverProcessDesc with appropriate server port number and log paths. + GameLiftServerProcessDesc BuildGameLiftServerProcessDesc(); + //! Build session config by using AWS GameLift Server GameSession Model. AzFramework::SessionConfig BuildSessionConfig(const Aws::GameLift::Server::Model::GameSession& gameSession); diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.cpp b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.cpp index edcdef3c26..a3f60fb849 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.cpp +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.cpp @@ -74,49 +74,16 @@ namespace AWSGameLift void AWSGameLiftServerSystemComponent::Activate() { - if (m_gameLiftServerManager->InitializeGameLiftServerSDK()) - { - GameLiftServerProcessDesc serverProcessDesc; - UpdateGameLiftServerProcessDesc(serverProcessDesc); - m_gameLiftServerManager->NotifyGameLiftProcessReady(serverProcessDesc); - } + m_gameLiftServerManager->InitializeGameLiftServerSDK(); + m_gameLiftServerManager->ActivateManager(); } void AWSGameLiftServerSystemComponent::Deactivate() { + m_gameLiftServerManager->DeactivateManager(); m_gameLiftServerManager->HandleDestroySession(); } - void AWSGameLiftServerSystemComponent::UpdateGameLiftServerProcessDesc(GameLiftServerProcessDesc& serverProcessDesc) - { - AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetDirectInstance(); - if (fileIO) - { - const char pathToLogFolder[] = "@log@/"; - char resolvedPath[AZ_MAX_PATH_LEN]; - if (fileIO->ResolvePath(pathToLogFolder, resolvedPath, AZ_ARRAY_SIZE(resolvedPath))) - { - serverProcessDesc.m_logPaths.push_back(resolvedPath); - } - else - { - AZ_Error("AWSGameLift", false, "Failed to resolve the path to the log folder."); - } - } - else - { - AZ_Error("AWSGameLift", false, "Failed to get File IO."); - } - - if (auto console = AZ::Interface::Get(); console != nullptr) - { - [[maybe_unused]] AZ::GetValueResult getCvarResult = console->GetCvarValue("sv_port", serverProcessDesc.m_port); - AZ_Error( - "AWSGameLift", getCvarResult == AZ::GetValueResult::Success, "Lookup of 'sv_port' console variable failed with error %s", - AZ::GetEnumString(getCvarResult)); - } - } - void AWSGameLiftServerSystemComponent::SetGameLiftServerManager(AZStd::unique_ptr gameLiftServerManager) { m_gameLiftServerManager.reset(); diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.h b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.h index 3df7629c9f..d70558254c 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.h +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Source/AWSGameLiftServerSystemComponent.h @@ -43,10 +43,6 @@ namespace AWSGameLift void SetGameLiftServerManager(AZStd::unique_ptr gameLiftServerManager); private: - //! Update the serverProcessDesc with appropriate server port number and log paths. - //! @param serverProcessDesc Desc object to update. - void UpdateGameLiftServerProcessDesc(GameLiftServerProcessDesc& serverProcessDesc); - AZStd::unique_ptr m_gameLiftServerManager; }; diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerManagerTest.cpp b/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerManagerTest.cpp index e0a7caba24..2c8929b297 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerManagerTest.cpp +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerManagerTest.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -44,26 +45,39 @@ namespace UnitTest GameLiftServerProcessDesc serverDesc; m_serverManager = AZStd::make_unique>(); + + // Set up the file IO and alias + m_localFileIO = aznew AZ::IO::LocalFileIO(); + m_priorFileIO = AZ::IO::FileIOBase::GetInstance(); + + AZ::IO::FileIOBase::SetInstance(nullptr); + AZ::IO::FileIOBase::SetInstance(m_localFileIO); + m_localFileIO->SetAlias("@log@", AZ_TRAIT_TEST_ROOT_FOLDER); } void TearDown() override { + AZ::IO::FileIOBase::SetInstance(nullptr); + delete m_localFileIO; + AZ::IO::FileIOBase::SetInstance(m_priorFileIO); + m_serverManager.reset(); AWSGameLiftServerFixture::TearDown(); } AZStd::unique_ptr> m_serverManager; + AZ::IO::FileIOBase* m_priorFileIO; + AZ::IO::FileIOBase* m_localFileIO; }; TEST_F(GameLiftServerManagerTest, InitializeGameLiftServerSDK_InitializeTwice_InitSDKCalledOnce) { EXPECT_CALL(*(m_serverManager->m_gameLiftServerSDKWrapperMockPtr), InitSDK()).Times(1); - - EXPECT_TRUE(m_serverManager->InitializeGameLiftServerSDK()); + m_serverManager->InitializeGameLiftServerSDK(); AZ_TEST_START_TRACE_SUPPRESSION; - EXPECT_FALSE(m_serverManager->InitializeGameLiftServerSDK()); + m_serverManager->InitializeGameLiftServerSDK(); AZ_TEST_STOP_TRACE_SUPPRESSION(1); } @@ -72,36 +86,34 @@ namespace UnitTest EXPECT_CALL(*(m_serverManager->m_gameLiftServerSDKWrapperMockPtr), ProcessReady(testing::_)).Times(0); AZ_TEST_START_TRACE_SUPPRESSION; - EXPECT_FALSE(m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc())); + EXPECT_FALSE(m_serverManager->NotifyGameLiftProcessReady()); AZ_TEST_STOP_TRACE_SUPPRESSION(1); } TEST_F(GameLiftServerManagerTest, NotifyGameLiftProcessReady_SDKInitialized_ProcessReadyNotificationSent) { - EXPECT_TRUE(m_serverManager->InitializeGameLiftServerSDK()); - + m_serverManager->InitializeGameLiftServerSDK(); EXPECT_CALL(*(m_serverManager->m_gameLiftServerSDKWrapperMockPtr), ProcessReady(testing::_)).Times(1); - EXPECT_TRUE(m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc())); + EXPECT_TRUE(m_serverManager->NotifyGameLiftProcessReady()); } TEST_F(GameLiftServerManagerTest, NotifyGameLiftProcessReady_ProcessReadyFails_TerminationNotificationSent) { - EXPECT_TRUE(m_serverManager->InitializeGameLiftServerSDK()); - + m_serverManager->InitializeGameLiftServerSDK(); EXPECT_CALL(*(m_serverManager->m_gameLiftServerSDKWrapperMockPtr), ProcessReady(testing::_)) .Times(1) .WillOnce(testing::Return(Aws::GameLift::GenericOutcome())); EXPECT_CALL(*(m_serverManager->m_gameLiftServerSDKWrapperMockPtr), ProcessEnding()).Times(1); AZ_TEST_START_TRACE_SUPPRESSION; - EXPECT_TRUE(m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc())); + EXPECT_TRUE(m_serverManager->NotifyGameLiftProcessReady()); AZ_TEST_STOP_TRACE_SUPPRESSION(1); } TEST_F(GameLiftServerManagerTest, OnProcessTerminate_OnDestroySessionBeginReturnsFalse_FailToNotifyGameLift) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); if (!AZ::Interface::Get()) { AZ::Interface::Register(m_serverManager.get()); @@ -122,7 +134,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnProcessTerminate_OnDestroySessionBeginReturnsTrue_TerminationNotificationSent) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); if (!AZ::Interface::Get()) { AZ::Interface::Register(m_serverManager.get()); @@ -141,7 +153,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnHealthCheck_OnSessionHealthCheckReturnsTrue_CallbackFunctionReturnsTrue) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); SessionNotificationsHandlerMock handlerMock; EXPECT_CALL(handlerMock, OnSessionHealthCheck()).Times(1).WillOnce(testing::Return(true)); EXPECT_TRUE(m_serverManager->m_gameLiftServerSDKWrapperMockPtr->m_healthCheckFunc()); @@ -150,7 +162,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnHealthCheck_OnSessionHealthCheckReturnsFalseAndTrue_CallbackFunctionReturnsFalse) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); SessionNotificationsHandlerMock handlerMock1; EXPECT_CALL(handlerMock1, OnSessionHealthCheck()).Times(1).WillOnce(testing::Return(false)); SessionNotificationsHandlerMock handlerMock2; @@ -161,7 +173,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnHealthCheck_OnSessionHealthCheckReturnsFalse_CallbackFunctionReturnsFalse) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); SessionNotificationsHandlerMock handlerMock; EXPECT_CALL(handlerMock, OnSessionHealthCheck()).Times(1).WillOnce(testing::Return(false)); EXPECT_FALSE(m_serverManager->m_gameLiftServerSDKWrapperMockPtr->m_healthCheckFunc()); @@ -170,7 +182,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnStartGameSession_OnCreateSessionBeginReturnsFalse_TerminationNotificationSent) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); SessionNotificationsHandlerMock handlerMock; EXPECT_CALL(handlerMock, OnCreateSessionBegin(testing::_)).Times(1).WillOnce(testing::Return(false)); EXPECT_CALL(handlerMock, OnDestroySessionBegin()).Times(1).WillOnce(testing::Return(true)); @@ -183,7 +195,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnStartGameSession_ActivateGameSessionSucceeds_RegisterAsHandler) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); SessionNotificationsHandlerMock handlerMock; EXPECT_CALL(handlerMock, OnCreateSessionBegin(testing::_)).Times(1).WillOnce(testing::Return(true)); EXPECT_CALL(handlerMock, OnDestroySessionBegin()).Times(1).WillOnce(testing::Return(true)); @@ -203,7 +215,7 @@ namespace UnitTest TEST_F(GameLiftServerManagerTest, OnStartGameSession_ActivateGameSessionFails_TerminationNotificationSent) { m_serverManager->InitializeGameLiftServerSDK(); - m_serverManager->NotifyGameLiftProcessReady(GameLiftServerProcessDesc()); + m_serverManager->NotifyGameLiftProcessReady(); SessionNotificationsHandlerMock handlerMock; EXPECT_CALL(handlerMock, OnCreateSessionBegin(testing::_)).Times(1).WillOnce(testing::Return(true)); EXPECT_CALL(handlerMock, OnDestroySessionBegin()).Times(1).WillOnce(testing::Return(true)); diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerSystemComponentTest.cpp b/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerSystemComponentTest.cpp index bec4acbe70..b7cb0ef3cb 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerSystemComponentTest.cpp +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/Tests/AWSGameLiftServerSystemComponentTest.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include namespace UnitTest @@ -37,22 +36,10 @@ namespace UnitTest m_AWSGameLiftServerSystemsComponent = aznew NiceMock(); m_entity->AddComponent(m_AWSGameLiftServerSystemsComponent); - - // Set up the file IO and alias - m_localFileIO = aznew AZ::IO::LocalFileIO(); - m_priorFileIO = AZ::IO::FileIOBase::GetInstance(); - - AZ::IO::FileIOBase::SetInstance(nullptr); - AZ::IO::FileIOBase::SetInstance(m_localFileIO); - m_localFileIO->SetAlias("@log@", AZ_TRAIT_TEST_ROOT_FOLDER); } void TearDown() override { - AZ::IO::FileIOBase::SetInstance(nullptr); - delete m_localFileIO; - AZ::IO::FileIOBase::SetInstance(m_priorFileIO); - m_entity->RemoveComponent(m_AWSGameLiftServerSystemsComponent); delete m_AWSGameLiftServerSystemsComponent; delete m_entity; @@ -70,9 +57,6 @@ namespace UnitTest AZ::Entity* m_entity; NiceMock* m_AWSGameLiftServerSystemsComponent; - - AZ::IO::FileIOBase* m_priorFileIO; - AZ::IO::FileIOBase* m_localFileIO; }; TEST_F(AWSGameLiftServerSystemComponentTest, ActivateDeactivateComponent_ExecuteInOrder_Success) diff --git a/Gems/AWSGameLift/Code/AWSGameLiftServer/awsgamelift_server_files.cmake b/Gems/AWSGameLift/Code/AWSGameLiftServer/awsgamelift_server_files.cmake index d07ef45b5f..95b5e1d2d2 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftServer/awsgamelift_server_files.cmake +++ b/Gems/AWSGameLift/Code/AWSGameLiftServer/awsgamelift_server_files.cmake @@ -8,6 +8,7 @@ set(FILES ../AWSGameLiftCommon/Source/AWSGameLiftSessionConstants.h + Include/Request/IAWSGameLiftServerRequests.h Source/AWSGameLiftServerManager.cpp Source/AWSGameLiftServerManager.h Source/AWSGameLiftServerSystemComponent.cpp From fa0f2a10073e5182f8980f0458307f4fe4749651 Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Mon, 30 Aug 2021 13:10:41 -0700 Subject: [PATCH 020/355] Fix unused warnings release (#3677) * Release build fix for Windows * Release build fix for Android * Release build fix for Windows * Release build fix for Android * Release build fix for Linux * Release build fix for Mac * Release build fix for iOS Signed-off-by: Steve Pham --- Code/Editor/ActionManager.cpp | 1 + Code/Editor/EditorViewportWidget.cpp | 2 +- Code/Editor/TrackView/TrackViewAnimNode.cpp | 2 +- .../AzCore/AzCore/Asset/AssetContainer.cpp | 1 + .../AzCore/AzCore/Asset/AssetManager.cpp | 4 ++-- .../IO/Streamer/FullFileDecompressor.cpp | 2 ++ .../AzCore/AzCore/IO/Streamer/Scheduler.cpp | 4 +++- .../AzCore/IO/Streamer/StreamerContext.cpp | 3 ++- .../Memory/OverrunDetectionAllocator.cpp | 2 +- .../AzCore/AzCore/Name/NameDictionary.cpp | 2 +- .../Serialization/Json/RegistrationContext.cpp | 2 +- .../AzCore/Serialization/ObjectStream.cpp | 3 +++ .../AzCore/AzCore/Slice/SliceComponent.cpp | 1 + .../Platform/Mac/AzCore/Platform_Mac.cpp | 2 +- .../AzFramework/Application/Application.cpp | 4 ++-- .../Asset/Benchmark/BenchmarkCommands.cpp | 2 +- .../AzFramework/IO/RemoteFileIO.cpp | 4 ++-- .../Network/AssetProcessorConnection.cpp | 2 +- .../AzFramework/Visibility/VisibilityDebug.cpp | 2 +- .../Motion/InputDeviceMotion_Android.cpp | 2 +- .../InputDeviceVirtualKeyboard_Android.cpp | 2 +- .../Process/ProcessCommunicator_Linux.cpp | 4 ++-- .../Process/ProcessCommunicator_Mac.cpp | 4 ++-- .../AzToolsFramework/Prefab/Link/Link.cpp | 4 ++-- .../Prefab/PrefabPublicHandler.cpp | 6 +++--- .../Prefab/PrefabSystemComponent.cpp | 2 +- .../AzToolsFramework/Prefab/PrefabUndo.cpp | 2 +- .../UI/Slice/SlicePushWidget.cpp | 2 +- .../Tests/Prefab/PrefabUndoLinkTests.cpp | 2 +- .../GridMate/GridMate/Carrier/Carrier.cpp | 2 +- Code/Legacy/CrySystem/ConsoleBatchFile.cpp | 2 +- .../CrySystem/LocalizedStringManager.cpp | 5 ++++- Code/Legacy/CrySystem/Log.cpp | 2 +- Code/Legacy/CrySystem/System.cpp | 2 +- Code/Legacy/CrySystem/SystemCFG.cpp | 4 ++-- Code/Legacy/CrySystem/SystemInit.cpp | 4 ++-- Code/Legacy/CrySystem/Timer.cpp | 6 +++--- .../source/utils/applicationManager.cpp | 2 +- .../Importers/AssImpColorStreamImporter.cpp | 2 +- .../Standalone/Source/LUA/LUAEditorContext.cpp | 2 +- .../Source/Converters/ConvertPixelFormat.cpp | 2 +- .../Code/Source/Processing/ImageConvert.cpp | 6 +++--- .../Code/Tests/ImageProcessing_Test.cpp | 2 +- .../Shader/Code/Source/Editor/AzslCompiler.cpp | 6 +++--- .../Code/Source/Editor/ShaderAssetBuilder.cpp | 2 +- .../Editor/ShaderVariantAssetBuilder.cpp | 4 ++-- .../DirectionalLightFeatureProcessor.cpp | 4 ++-- .../Common/Code/Source/ImGui/ImGuiPass.cpp | 2 +- .../Code/Source/Utils/GpuBufferHandler.cpp | 2 +- .../Code/Source/RHI/FrameGraphExecuteGroup.cpp | 2 +- Gems/Atom/RHI/Code/Source/RHI/Resource.cpp | 4 ++-- Gems/Atom/RHI/Code/Tests/BufferTests.cpp | 1 + Gems/Atom/RHI/Code/Tests/FrameGraph.cpp | 2 +- Gems/Atom/RHI/Code/Tests/ImageTests.cpp | 1 + Gems/Atom/RHI/Code/Tests/QueryTests.cpp | 1 + .../RHI.Builders/ShaderPlatformInterface.cpp | 4 ++-- .../Metal/Code/Source/RHI/ArgumentBuffer.cpp | 2 +- .../RHI/Metal/Code/Source/RHI/BufferView.cpp | 2 +- .../Metal/Code/Source/RHI/PipelineState.cpp | 4 ++-- .../RHI/Vulkan/Code/Source/RHI/BufferView.cpp | 2 +- .../RHI/Vulkan/Code/Source/RHI/ImageView.cpp | 6 +++--- .../Source/RPI.Public/Image/ImageSystem.cpp | 6 +++--- .../Image/StreamingImageController.cpp | 2 +- .../Code/Source/RPI.Public/Pass/RenderPass.cpp | 1 + .../Source/RPI.Reflect/Shader/ShaderAsset.cpp | 2 +- .../RPI.Reflect/Shader/ShaderVariantAsset.cpp | 4 ++-- .../Application/AtomToolsApplication.cpp | 1 + .../Source/Window/MaterialEditorWindow.cpp | 2 +- .../Include/Atom/Utils/ImGuiGpuProfiler.inl | 4 ++-- .../AtomFont/Code/Source/FontRenderer.cpp | 2 +- .../Code/Source/AtomActorInstance.cpp | 2 +- .../CommandSystem/Source/MotionSetCommands.cpp | 2 +- .../RCExt/Motion/MotionDataBuilder.cpp | 2 +- Gems/EMotionFX/Code/EMotionFX/Source/Pose.cpp | 4 ++-- .../EMStudioSDK/Source/NodeHierarchyWidget.cpp | 4 ++-- .../Source/AnimGraph/NodeGraph.cpp | 2 +- .../Source/Integration/GraphController.cpp | 1 + Gems/ImGui/Code/Include/ImGuiContextScope.h | 2 +- .../Common/Apple/InAppPurchasesDelegate.mm | 2 +- .../SliceBuilder/SliceBuilderWorker.cpp | 18 +++++++++--------- .../Editor/Animation/UiAnimViewAnimNode.cpp | 4 ++-- Gems/LyShine/Code/Source/LyShineDebug.cpp | 8 ++++---- .../EditorSequenceAgentComponent.cpp | 2 +- .../Components/SequenceAgentComponent.cpp | 2 +- .../Debug/MultiplayerDebugPerEntityReporter.h | 4 ++-- .../Code/Tests/MultiplayerCompressionTest.cpp | 4 ++-- Gems/PhysX/Code/Source/Debug/PhysXDebug.h | 2 +- Gems/PhysX/Code/Source/Scene/PhysXScene.cpp | 4 ++-- .../Processors/ExportTrackingProcessor.cpp | 2 +- .../Code/Include/ScriptCanvas/Core/Node.cpp | 6 +++--- .../Interpreted/ExecutionInterpretedAPI.cpp | 2 +- .../Execution/NodeableOut/NodeableOutNative.h | 4 ++-- .../Libraries/Core/MethodUtility.cpp | 2 +- .../Code/Source/SystemComponent.cpp | 2 +- 94 files changed, 150 insertions(+), 130 deletions(-) diff --git a/Code/Editor/ActionManager.cpp b/Code/Editor/ActionManager.cpp index 390dbbc1bd..ff74a2c208 100644 --- a/Code/Editor/ActionManager.cpp +++ b/Code/Editor/ActionManager.cpp @@ -326,6 +326,7 @@ ActionManager::MenuWrapper ActionManager::FindMenu(const QString& menuId) return *menuIt; } + AZ_UNUSED(menuId); // Prevent unused warning in release builds AZ_Warning("ActionManager", false, "Did not find menu with menuId %s", menuId.toUtf8().data()); return nullptr; }(); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 44ac159c87..796e16dd53 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -1528,7 +1528,7 @@ AZ::EntityId EditorViewportWidget::GetCurrentViewEntityId() &AZ::RPI::ViewProviderBus::Events::GetView ); - const bool isViewEntityCorrect = viewEntityView == GetCurrentAtomView(); + [[maybe_unused]] const bool isViewEntityCorrect = viewEntityView == GetCurrentAtomView(); AZ_Error("EditorViewportWidget", isViewEntityCorrect, "GetCurrentViewEntityId called while the current view is being changed. " "You may get inconsistent results if you make use of the returned entity ID. " diff --git a/Code/Editor/TrackView/TrackViewAnimNode.cpp b/Code/Editor/TrackView/TrackViewAnimNode.cpp index 2119bf849f..0bb9ac5593 100644 --- a/Code/Editor/TrackView/TrackViewAnimNode.cpp +++ b/Code/Editor/TrackView/TrackViewAnimNode.cpp @@ -1942,7 +1942,7 @@ void CTrackViewAnimNode::OnSelectionChanged(const bool selected) { if (m_animNode) { - const AnimNodeType animNodeType = GetType(); + [[maybe_unused]] const AnimNodeType animNodeType = GetType(); AZ_Assert(animNodeType == AnimNodeType::AzEntity, "Expected AzEntity for selection changed"); const EAnimNodeFlags flags = (EAnimNodeFlags)m_animNode->GetFlags(); diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp index 83cc1da69a..ce15c7bc4e 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetContainer.cpp @@ -153,6 +153,7 @@ namespace AZ // behavior, we would need to rework the way filters work as well as the code in AssetSerializer.cpp to pass down // the loadParams.m_assetLoadFilterCB that was passed into the AddDependentAssets() methods to use as the dependent // asset filter instead of this lambda function. + AZ_UNUSED(handledAssetDependencyList); // Prevent unused warning in release builds AZ_Assert(AZStd::find(handledAssetDependencyList.begin(), handledAssetDependencyList.end(), filterInfo.m_assetId) != handledAssetDependencyList.end(), "Dependent Asset ID (%s) is expected to load, but the Asset Catalog has no dependency recorded. " diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp index f31859c14d..3df751fb02 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp @@ -1478,7 +1478,7 @@ namespace AZ // Resolve the asset handler and account for the new asset instance. { - AssetHandlerMap::iterator handlerIt = m_handlers.find(newData->GetType()); + [[maybe_unused]] AssetHandlerMap::iterator handlerIt = m_handlers.find(newData->GetType()); AZ_Assert( handlerIt != m_handlers.end(), "No handler was registered for this asset [type:%s id:%s]!", newData->GetType().ToString().c_str(), newData->GetId().ToString().c_str()); @@ -1869,7 +1869,7 @@ namespace AZ { AZStd::scoped_lock requestLock(m_activeBlockingRequestMutex); - auto inserted = m_activeBlockingRequests.insert(AZStd::make_pair(assetId, blockingRequest)); + [[maybe_unused]] auto inserted = m_activeBlockingRequests.insert(AZStd::make_pair(assetId, blockingRequest)); AZ_Assert(inserted.second, "Failed to track blocking request for asset %s", assetId.ToString().c_str()); } diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/FullFileDecompressor.cpp b/Code/Framework/AzCore/AzCore/IO/Streamer/FullFileDecompressor.cpp index 44bf36bd9d..6427571f10 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/FullFileDecompressor.cpp +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/FullFileDecompressor.cpp @@ -45,8 +45,10 @@ namespace AZ } } +#if AZ_STREAMER_ADD_EXTRA_PROFILING_INFO static constexpr char DecompBoundName[] = "Decompression bound"; static constexpr char ReadBoundName[] = "Read bound"; +#endif // AZ_STREAMER_ADD_EXTRA_PROFILING_INFO bool FullFileDecompressor::DecompressionInformation::IsProcessing() const { diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/Scheduler.cpp b/Code/Framework/AzCore/AzCore/IO/Streamer/Scheduler.cpp index e7f9b0fd18..9b4996ad49 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/Scheduler.cpp +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/Scheduler.cpp @@ -14,8 +14,10 @@ namespace AZ::IO { +#if AZ_STREAMER_ADD_EXTRA_PROFILING_INFO static constexpr char SchedulerName[] = "Scheduler"; static constexpr char ImmediateReadsName[] = "Immediate reads"; +#endif // AZ_STREAMER_ADD_EXTRA_PROFILING_INFO Scheduler::Scheduler(AZStd::shared_ptr streamStack, u64 memoryAlignment, u64 sizeAlignment, u64 granularity) { @@ -337,7 +339,7 @@ namespace AZ::IO AZStd::chrono::system_clock::time_point now = AZStd::chrono::system_clock::now(); auto visitor = [this, now](auto&& args) -> void #else - auto visitor = [this](auto&& args) -> void + auto visitor = [](auto&& args) -> void #endif { using Command = AZStd::decay_t; diff --git a/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerContext.cpp b/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerContext.cpp index 823ab6e050..5cd483bc55 100644 --- a/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerContext.cpp +++ b/Code/Framework/AzCore/AzCore/IO/Streamer/StreamerContext.cpp @@ -17,10 +17,11 @@ namespace AZ namespace IO { static constexpr char ContextName[] = "Context"; +#if AZ_STREAMER_ADD_EXTRA_PROFILING_INFO static constexpr char PredictionAccuracyName[] = "Prediction accuracy (ms)"; static constexpr char LatePredictionName[] = "Early completions"; static constexpr char MissedDeadlinesName[] = "Missed deadlines"; - +#endif // AZ_STREAMER_ADD_EXTRA_PROFILING_INFO StreamerContext::~StreamerContext() { for (FileRequest* entry : m_internalRecycleBin) diff --git a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp index 63fa9250d6..e59e304c54 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp @@ -511,7 +511,7 @@ AZ::OverrunDetectionSchemaImpl::OverrunDetectionSchemaImpl(const OverrunDetectio { m_platformAllocator.reset(new Internal::PlatformOverrunDetectionSchema); - auto info = m_platformAllocator->GetSystemInformation(); + [[maybe_unused]] auto info = m_platformAllocator->GetSystemInformation(); AZ_Assert(info.m_pageSize == Internal::ODS_PAGE_SIZE, "System page size %d does not equal expected page size %d", info.m_pageSize, Internal::ODS_PAGE_SIZE); AZ_Assert(info.m_minimumAllocationSize == Internal::ODS_ALLOCATION_SIZE, "System minimum allocation size %d does not equal expected size %d", info.m_minimumAllocationSize, Internal::ODS_ALLOCATION_SIZE); diff --git a/Code/Framework/AzCore/AzCore/Name/NameDictionary.cpp b/Code/Framework/AzCore/AzCore/Name/NameDictionary.cpp index cf85e0f4e0..8e8011add9 100644 --- a/Code/Framework/AzCore/AzCore/Name/NameDictionary.cpp +++ b/Code/Framework/AzCore/AzCore/Name/NameDictionary.cpp @@ -87,7 +87,7 @@ namespace AZ { Internal::NameData* nameData = keyValue.second; const int useCount = keyValue.second->m_useCount; - const bool hadCollision = keyValue.second->m_hashCollision; + [[maybe_unused]] const bool hadCollision = keyValue.second->m_hashCollision; if (useCount == 0) { diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.cpp index fae67d487c..989f306b08 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/RegistrationContext.cpp @@ -43,7 +43,7 @@ namespace AZ if (!overwriteExisting) { - auto emplaceResult = m_context->m_handledTypesMap.try_emplace(uuid, serializer); + [[maybe_unused]] auto emplaceResult = m_context->m_handledTypesMap.try_emplace(uuid, serializer); AZ_Assert( emplaceResult.second, "Couldn't register Json serializer %s. Another serializer (%s) has already been registered for the same Uuid (%s).", diff --git a/Code/Framework/AzCore/AzCore/Serialization/ObjectStream.cpp b/Code/Framework/AzCore/AzCore/Serialization/ObjectStream.cpp index 73ab174699..6251a2e6de 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/ObjectStream.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/ObjectStream.cpp @@ -1520,6 +1520,7 @@ namespace AZ { if (m_writeElementResultStack.empty()) { + AZ_UNUSED(classData); // Prevent unused warning in release builds AZ_Error("Serialize", false, "CloseElement is attempted to be called without a corresponding WriteElement when writing class %s", classData->m_name); return true; } @@ -1581,6 +1582,7 @@ namespace AZ { if (m_writeElementResultStack.empty()) { + AZ_UNUSED(classData); // Prevent unused warning in release builds AZ_Error("Serialize", false, "CloseElement is attempted to be called without a corresponding WriteElement when writing class %s", classData->m_name); return true; } @@ -1644,6 +1646,7 @@ namespace AZ { if (m_writeElementResultStack.empty()) { + AZ_UNUSED(classData); // Prevent unused warning in release builds AZ_Error("Serialize", false, "CloseElement is attempted to be called without a corresponding WriteElement when writing class %s", classData->m_name); return true; } diff --git a/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp b/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp index 23a197b2ad..03ed3f6ebb 100644 --- a/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp +++ b/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp @@ -3839,6 +3839,7 @@ namespace AZ { if (instance->GetId() == existingInstance.GetId()) { + AZ_UNUSED(sliceReference); // Prevent unused warning in release builds AZ_Warning("Slice", false, "Multiple slice instances with the same ID from slice %s were found. The last instance found has been loaded.", sliceReference.GetSliceAsset().GetHint().c_str()); return true; diff --git a/Code/Framework/AzCore/Platform/Mac/AzCore/Platform_Mac.cpp b/Code/Framework/AzCore/Platform/Mac/AzCore/Platform_Mac.cpp index edb3d3ea0e..78e97f47c8 100644 --- a/Code/Framework/AzCore/Platform/Mac/AzCore/Platform_Mac.cpp +++ b/Code/Framework/AzCore/Platform/Mac/AzCore/Platform_Mac.cpp @@ -32,7 +32,7 @@ namespace AZ timespec wait; wait.tv_sec = 0; wait.tv_nsec = 5000; - int result = ::gethostuuid(hostId, &wait); + [[maybe_unused]] int result = ::gethostuuid(hostId, &wait); AZ_Error("System", result == 0, "gethostuuid() failed with code %d", result); Sha1 hash; AZ::u32 digest[5] = { 0 }; diff --git a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp index fa0f14ac74..958dba2cc9 100644 --- a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp +++ b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp @@ -72,7 +72,7 @@ #include #include -static const char* s_azFrameworkWarningWindow = "AzFramework"; +[[maybe_unused]] static const char* s_azFrameworkWarningWindow = "AzFramework"; namespace AzFramework { @@ -602,7 +602,7 @@ namespace AzFramework void Application::SetRootPath(RootPathType type, const char* source) { - const size_t sourceLen = strlen(source); + [[maybe_unused]] const size_t sourceLen = strlen(source); // Copy the source path to the intended root path and correct the path separators as well switch (type) diff --git a/Code/Framework/AzFramework/AzFramework/Asset/Benchmark/BenchmarkCommands.cpp b/Code/Framework/AzFramework/AzFramework/Asset/Benchmark/BenchmarkCommands.cpp index d27fe8188f..30c1aa39c0 100644 --- a/Code/Framework/AzFramework/AzFramework/Asset/Benchmark/BenchmarkCommands.cpp +++ b/Code/Framework/AzFramework/AzFramework/Asset/Benchmark/BenchmarkCommands.cpp @@ -43,7 +43,7 @@ namespace AzFramework::AssetBenchmark AZStd::thread benchmarkThread([assetList = AZStd::move(sourceAssetList), loadBlocking]() { // Define the set of loading stats to track - const size_t initialRequests = assetList.size(); + [[maybe_unused]] const size_t initialRequests = assetList.size(); size_t previouslyLoadedAssets = 0; size_t newlyLoadedAssets = 0; size_t loadErrors = 0; diff --git a/Code/Framework/AzFramework/AzFramework/IO/RemoteFileIO.cpp b/Code/Framework/AzFramework/AzFramework/IO/RemoteFileIO.cpp index 3ac1b91144..041e5baf4a 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/RemoteFileIO.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/RemoteFileIO.cpp @@ -24,9 +24,9 @@ namespace AZ namespace IO { ////////////////////////////////////////////////////////////////////////// - const char* const NetworkFileIOChannel = "NetworkFileIO"; + [[maybe_unused]] const char* const NetworkFileIOChannel = "NetworkFileIO"; #ifndef REMOTEFILEIO_IS_NETWORKFILEIO - const char* const RemoteFileIOChannel = "RemoteFileIO"; + [[maybe_unused]] const char* const RemoteFileIOChannel = "RemoteFileIO"; #ifdef REMOTEFILEIO_SYNC_CHECK const char* const RemoteFileCacheChannel = "RemoteFileCache"; #endif diff --git a/Code/Framework/AzFramework/AzFramework/Network/AssetProcessorConnection.cpp b/Code/Framework/AzFramework/AzFramework/Network/AssetProcessorConnection.cpp index ebea29c2d9..2e1cde443c 100644 --- a/Code/Framework/AzFramework/AzFramework/Network/AssetProcessorConnection.cpp +++ b/Code/Framework/AzFramework/AzFramework/Network/AssetProcessorConnection.cpp @@ -177,7 +177,7 @@ namespace AzFramework //trying to connect, if any error occurs start the disconnect thread void AssetProcessorConnection::ConnectThread() { - static constexpr char ConnectThreadWindow[] = "AssetProcessorConnection::ConnectThread"; + [[maybe_unused]] static constexpr char ConnectThreadWindow[] = "AssetProcessorConnection::ConnectThread"; //check for join before doing an op if (m_connectThread.m_join) diff --git a/Code/Framework/AzFramework/AzFramework/Visibility/VisibilityDebug.cpp b/Code/Framework/AzFramework/AzFramework/Visibility/VisibilityDebug.cpp index 0d74bcc54b..a71819ab45 100644 --- a/Code/Framework/AzFramework/AzFramework/Visibility/VisibilityDebug.cpp +++ b/Code/Framework/AzFramework/AzFramework/Visibility/VisibilityDebug.cpp @@ -91,7 +91,7 @@ namespace AzFramework const AZ::Frustum::PlaneId planeId3) { AZ::Vector3 corner = AZ::Vector3::CreateZero(); - const auto intersectionOkay = AZ::ShapeIntersection::IntersectThreePlanes( + [[maybe_unused]] const auto intersectionOkay = AZ::ShapeIntersection::IntersectThreePlanes( frustum.GetPlane(planeId1), frustum.GetPlane(planeId2), frustum.GetPlane(planeId3), corner); AZ_Assert(intersectionOkay, "Plane intersection of Frustum failed"); diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/Motion/InputDeviceMotion_Android.cpp b/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/Motion/InputDeviceMotion_Android.cpp index 5cb3985569..74b2024fd1 100644 --- a/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/Motion/InputDeviceMotion_Android.cpp +++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/Motion/InputDeviceMotion_Android.cpp @@ -175,7 +175,7 @@ namespace AzFramework m_packedSensorDataArray = new float[packedSensorDataLength]; // create the java instance - bool ret = m_motionSensorManager->CreateInstance("(Landroid/app/Activity;)V", AZ::Android::Utils::GetActivityRef()); + [[maybe_unused]] bool ret = m_motionSensorManager->CreateInstance("(Landroid/app/Activity;)V", AZ::Android::Utils::GetActivityRef()); AZ_Assert(ret, "Failed to create the MotionSensorManager Java instance."); } diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard_Android.cpp b/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard_Android.cpp index 00139ffc9d..c477b0bd37 100644 --- a/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard_Android.cpp +++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/Input/Devices/VirtualKeyboard/InputDeviceVirtualKeyboard_Android.cpp @@ -128,7 +128,7 @@ namespace AzFramework }); // create the java instance - bool ret = m_keyboardHandler->CreateInstance("(Landroid/app/Activity;)V", AZ::Android::Utils::GetActivityRef()); + [[maybe_unused]] bool ret = m_keyboardHandler->CreateInstance("(Landroid/app/Activity;)V", AZ::Android::Utils::GetActivityRef()); AZ_Assert(ret, "Failed to create the KeyboardHandler Java instance."); // Connect to the raw input notifications bus diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp index 325ab81d41..0249a42976 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp @@ -78,7 +78,7 @@ namespace AzFramework FD_ZERO(&set); FD_SET(handle->GetHandle(), &set); - int numReady = select(handle->GetHandle() + 1, &set, NULL, NULL, NULL); + [[maybe_unused]] int numReady = select(handle->GetHandle() + 1, &set, NULL, NULL, NULL); // if numReady == -1 and errno == EINTR then the child process died unexpectedly and // the handle was closed. Not something to assert about in regards to trying to read @@ -87,7 +87,7 @@ namespace AzFramework // dead and return any error codes the child may have written to the error stream. AZ_Assert(numReady != -1 || errno == EINTR, "Could not determine if any data is available for reading due to an error. Errno: %d", errno); - const bool wasSet = FD_ISSET(handle->GetHandle(), &set); + [[maybe_unused]] const bool wasSet = FD_ISSET(handle->GetHandle(), &set); AZ_Assert(wasSet, "handle was not set when we selected it for read"); return 0; diff --git a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp index ea22bc72a3..1c233c6f29 100644 --- a/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp +++ b/Code/Framework/AzFramework/Platform/Mac/AzFramework/Process/ProcessCommunicator_Mac.cpp @@ -75,7 +75,7 @@ namespace AzFramework FD_ZERO(&set); FD_SET(handle->GetHandle(), &set); - int numReady = select(handle->GetHandle() + 1, &set, NULL, NULL, NULL); + [[maybe_unused]] int numReady = select(handle->GetHandle() + 1, &set, NULL, NULL, NULL); // if numReady == -1 and errno == EINTR then the child process died unexpectedly and // the handle was closed. Not something to assert about in regards to trying to read @@ -84,7 +84,7 @@ namespace AzFramework // dead and return any error codes the child may have written to the error stream. AZ_Assert(numReady != -1 || errno == EINTR, "Could not determine if any data is available for reading due to an error. Errno: %d", errno); - const bool wasSet = FD_ISSET(handle->GetHandle(), &set); + [[maybe_unused]] const bool wasSet = FD_ISSET(handle->GetHandle(), &set); AZ_Assert(wasSet, "handle was not set when we selected it for read"); return 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp index 940a2787cb..800a90c622 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Link/Link.cpp @@ -181,10 +181,10 @@ namespace AzToolsFramework PrefabDomUtils::ApplyPatches(sourceTemplateDomCopy, targetTemplatePrefabDom.GetAllocator(), patchesReference->get()); linkedInstanceDom.CopyFrom(sourceTemplateDomCopy, targetTemplatePrefabDom.GetAllocator()); - PrefabDomValueReference sourceTemplateName = + [[maybe_unused]] PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(sourceTemplateDomCopy, PrefabDomUtils::SourceName); AZ_Assert(sourceTemplateName && sourceTemplateName->get().IsString(), "A valid source template name couldn't be found"); - PrefabDomValueReference targetTemplateName = + [[maybe_unused]] PrefabDomValueReference targetTemplateName = PrefabDomUtils::FindPrefabDomValue(targetTemplatePrefabDom, PrefabDomUtils::SourceName); AZ_Assert(targetTemplateName && targetTemplateName->get().IsString(), "A valid target template name couldn't be found"); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp index 24cd0f0252..c412033362 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp @@ -1259,12 +1259,12 @@ namespace AzToolsFramework auto& containerEntity = *containerEntityPtr.release(); auto editorPrefabComponent = containerEntity.FindComponent(); containerEntity.Deactivate(); - const bool editorPrefabComponentRemoved = containerEntity.RemoveComponent(editorPrefabComponent); + [[maybe_unused]] const bool editorPrefabComponentRemoved = containerEntity.RemoveComponent(editorPrefabComponent); AZ_Assert(editorPrefabComponentRemoved, "Remove EditorPrefabComponent failed."); delete editorPrefabComponent; containerEntity.Activate(); - const bool containerEntityAdded = parentInstance.AddEntity(containerEntity); + [[maybe_unused]] const bool containerEntityAdded = parentInstance.AddEntity(containerEntity); AZ_Assert(containerEntityAdded, "Add target Instance's container entity to its parent Instance failed."); EntityIdList entityIds; @@ -1281,7 +1281,7 @@ namespace AzToolsFramework [&](AZStd::unique_ptr entityPtr) { auto& entity = *entityPtr.release(); - const bool entityAdded = parentInstance.AddEntity(entity); + [[maybe_unused]] const bool entityAdded = parentInstance.AddEntity(entity); AZ_Assert(entityAdded, "Add target Instance's entity to its parent Instance failed."); entityIds.emplace_back(entity.GetId()); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 1051e530c8..f3250e0bfd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -783,7 +783,7 @@ namespace AzToolsFramework PrefabDomValue& instance = instanceIterator->value; AZ_Assert(instance.IsObject(), "Nested instance DOM provided is not a valid JSON object."); - PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); + [[maybe_unused]] PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); AZ_Assert(sourceTemplateName, "Couldn't find source template name in the DOM of the nested instance while creating a link."); AZ_Assert( sourceTemplateName->get() == sourceTemplate.GetFilePath().c_str(), diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp index fc64e0b5b3..fe3555a853 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndo.cpp @@ -262,7 +262,7 @@ namespace AzToolsFramework instanceDom.CopyFrom(instanceDomRef->get(), instanceDom.GetAllocator()); //apply the patch to the template within the target - AZ::JsonSerializationResult::ResultCode result = PrefabDomUtils::ApplyPatches(instanceDom, instanceDom.GetAllocator(), patch); + [[maybe_unused]] AZ::JsonSerializationResult::ResultCode result = PrefabDomUtils::ApplyPatches(instanceDom, instanceDom.GetAllocator(), patch); AZ_Error( "Prefab", diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.cpp index c276fc5c5a..76f91b438e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.cpp @@ -2525,7 +2525,7 @@ namespace AzToolsFramework { // This is an approximate measurement of how much this slice proliferates within the currently-loaded level. // Down the line we'll actually query the asset DB's dependency tree, summing up instances. - + AZ_UNUSED(levelSlice); // Prevent unused warning in release builds AZ_Warning("SlicePush", levelSlice, "SlicePushWidget::CalculateReferenceCount could not find root slice, displayed counts will be inaccurate!"); size_t instanceCount = 0; AZ::Data::AssetBus::EnumerateHandlersId(assetId, diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp index e506159fd2..8fafe1f177 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/PrefabUndoLinkTests.cpp @@ -97,7 +97,7 @@ namespace UnitTest //apply the patch PrefabDom& templateDomReference = m_prefabSystemComponent->FindTemplateDom(nestedTemplateId); - AZ::JsonSerializationResult::ResultCode result = + [[maybe_unused]] AZ::JsonSerializationResult::ResultCode result = PrefabDomUtils::ApplyPatches(templateDomReference, templateDomReference.GetAllocator(), patch); AZ_Error("Prefab", result.GetOutcome() == AZ::JsonSerializationResult::Outcomes::Success, diff --git a/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp b/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp index 0285a7fc02..8b484143de 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp +++ b/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp @@ -1452,7 +1452,7 @@ void CarrierThread::NotifyRateUpdate(ThreadConnection* conn) float rtt = lifetime.m_rtt > 1.f ? lifetime.m_rtt : 100.f; //For unknown RTT use conservative 100ms to avoid buffer bloat //Note: using lifetime RTT as stand-in for smoothed RTT float ratef = (1010 * (cState.m_congestionWindow)) / rtt; //Add 10% to allow rate increases until buffer fills up - constexpr float max_rate = azlossy_cast(0x7FFFFFFF); + [[maybe_unused]] constexpr float max_rate = azlossy_cast(0x7FFFFFFF); AZ_Assert(ratef <= max_rate, " ratef %f > 0x7FFFFFFF", ratef); bytesPerSecond = static_cast(ratef); diff --git a/Code/Legacy/CrySystem/ConsoleBatchFile.cpp b/Code/Legacy/CrySystem/ConsoleBatchFile.cpp index 3d46716873..d3a0ccf4de 100644 --- a/Code/Legacy/CrySystem/ConsoleBatchFile.cpp +++ b/Code/Legacy/CrySystem/ConsoleBatchFile.cpp @@ -87,7 +87,7 @@ bool CConsoleBatchFile::ExecuteConfigFile(const char* sFilename) CCryFile file; { - const char* szLog = "Executing console batch file (try game,config,root):"; + [[maybe_unused]] const char* szLog = "Executing console batch file (try game,config,root):"; AZStd::string filenameLog; AZStd::string sfn = PathUtil::GetFile(filename); diff --git a/Code/Legacy/CrySystem/LocalizedStringManager.cpp b/Code/Legacy/CrySystem/LocalizedStringManager.cpp index 78ece6f74c..365c71252c 100644 --- a/Code/Legacy/CrySystem/LocalizedStringManager.cpp +++ b/Code/Legacy/CrySystem/LocalizedStringManager.cpp @@ -32,8 +32,11 @@ #define MAX_CELL_COUNT 32 // CVAR names +#if !defined(_RELEASE) const char c_sys_localization_debug[] = "sys_localization_debug"; const char c_sys_localization_encode[] = "sys_localization_encode"; +#endif // !defined(_RELEASE) + #define LOC_WINDOW "Localization" const char c_sys_localization_format[] = "sys_localization_format"; @@ -1754,7 +1757,7 @@ void CLocalizedStringsManager::ReloadData() void CLocalizedStringsManager::AddLocalizedString(SLanguage* pLanguage, SLocalizedStringEntry* pEntry, const uint32 keyCRC32) { pLanguage->m_vLocalizedStrings.push_back(pEntry); - int nId = (int)pLanguage->m_vLocalizedStrings.size() - 1; + [[maybe_unused]] int nId = (int)pLanguage->m_vLocalizedStrings.size() - 1; pLanguage->m_keysMap[keyCRC32] = pEntry; if (m_cvarLocalizationDebug >= 2) diff --git a/Code/Legacy/CrySystem/Log.cpp b/Code/Legacy/CrySystem/Log.cpp index a157501f0a..68b9621f74 100644 --- a/Code/Legacy/CrySystem/Log.cpp +++ b/Code/Legacy/CrySystem/Log.cpp @@ -744,7 +744,7 @@ void CLog::LogToConsolePlus(const char* szFormat, ...) ////////////////////////////////////////////////////////////////////// -static void RemoveColorCodeInPlace(CLog::LogStringType& rStr) +[[maybe_unused]] static void RemoveColorCodeInPlace(CLog::LogStringType& rStr) { char* s = (char*)rStr.c_str(); char* d = s; diff --git a/Code/Legacy/CrySystem/System.cpp b/Code/Legacy/CrySystem/System.cpp index 2d756d1352..70fb9382e1 100644 --- a/Code/Legacy/CrySystem/System.cpp +++ b/Code/Legacy/CrySystem/System.cpp @@ -1465,7 +1465,7 @@ void CSystem::SetSystemGlobalState(const ESystemGlobalState systemGlobalState) if (gEnv && gEnv->pTimer) { const CTimeValue endTime = gEnv->pTimer->GetAsyncTime(); - const float numSeconds = endTime.GetDifferenceInSeconds(s_startTime); + [[maybe_unused]] const float numSeconds = endTime.GetDifferenceInSeconds(s_startTime); CryLog("SetGlobalState %d->%d '%s'->'%s' %3.1f seconds", m_systemGlobalState, systemGlobalState, CSystem::GetSystemGlobalStateName(m_systemGlobalState), CSystem::GetSystemGlobalStateName(systemGlobalState), diff --git a/Code/Legacy/CrySystem/SystemCFG.cpp b/Code/Legacy/CrySystem/SystemCFG.cpp index 57de0be909..0f67fdc2e1 100644 --- a/Code/Legacy/CrySystem/SystemCFG.cpp +++ b/Code/Legacy/CrySystem/SystemCFG.cpp @@ -180,7 +180,7 @@ void CSystem::LogVersion() strftime(s, 128, "%d %b %y (%H %M %S)", today); #endif - const SFileVersion& ver = GetFileVersion(); + [[maybe_unused]] const SFileVersion& ver = GetFileVersion(); CryLogAlways("BackupNameAttachment=\" Build(%d) %s\" -- used by backup system\n", ver.v[0], s); // read by CreateBackupFile() @@ -251,7 +251,7 @@ void CSystem::LogVersion() ////////////////////////////////////////////////////////////////////////// void CSystem::LogBuildInfo() { - auto projectName = AZ::Utils::GetProjectName(); + [[maybe_unused]] auto projectName = AZ::Utils::GetProjectName(); CryLogAlways("GameName: %s", projectName.c_str()); CryLogAlways("BuildTime: " __DATE__ " " __TIME__); } diff --git a/Code/Legacy/CrySystem/SystemInit.cpp b/Code/Legacy/CrySystem/SystemInit.cpp index a0769d1a2c..d5efff2748 100644 --- a/Code/Legacy/CrySystem/SystemInit.cpp +++ b/Code/Legacy/CrySystem/SystemInit.cpp @@ -257,8 +257,8 @@ static void CmdCrashTest(IConsoleCmdArgs* pArgs) { float a = 1.0f; memset(&a, 0, sizeof(a)); - float* b = &a; - float c = 3; + [[maybe_unused]] float* b = &a; + [[maybe_unused]] float c = 3; CryLog("%f", (c / *b)); } break; diff --git a/Code/Legacy/CrySystem/Timer.cpp b/Code/Legacy/CrySystem/Timer.cpp index d411e76875..1e1b6859e1 100644 --- a/Code/Legacy/CrySystem/Timer.cpp +++ b/Code/Legacy/CrySystem/Timer.cpp @@ -550,7 +550,7 @@ void CTimer::Serialize(TSerialize ser) if (m_TimeDebug) { - const int64 now = CryGetTicks(); + [[maybe_unused]] const int64 now = CryGetTicks(); CryLogAlways("[CTimer]: Serialize: Last=%lld Now=%lld Off=%lld Async=%f CurrTime=%f UI=%f", (long long)m_lLastTime, (long long)now, (long long)m_lOffsetTime, GetAsyncCurTime(), GetCurrTime(ETIMER_GAME), GetCurrTime(ETIMER_UI)); } } @@ -700,8 +700,8 @@ void CTimer::EnableFixedTimeMode([[maybe_unused]] bool enable, [[maybe_unused]] void CTimer::SetOffsetToMatchGameTime(int64 ticks) { - const int64 previousOffset = m_lOffsetTime; - const float previousGameTime = GetCurrTime(ETIMER_GAME); + [[maybe_unused]] const int64 previousOffset = m_lOffsetTime; + [[maybe_unused]] const float previousGameTime = GetCurrTime(ETIMER_GAME); m_lOffsetTime = ticks - m_lLastTime; RefreshGameTime(m_lLastTime); diff --git a/Code/Tools/AssetBundler/source/utils/applicationManager.cpp b/Code/Tools/AssetBundler/source/utils/applicationManager.cpp index 0887b17682..0742035c1a 100644 --- a/Code/Tools/AssetBundler/source/utils/applicationManager.cpp +++ b/Code/Tools/AssetBundler/source/utils/applicationManager.cpp @@ -1399,7 +1399,7 @@ namespace AssetBundler AZStd::string_view{ AZ::Utils::GetEnginePath() }, AZStd::string_view{ AZ::Utils::GetEnginePath() }, AZStd::string_view{ AZ::Utils::GetProjectPath() }); - auto platformsString = AzFramework::PlatformHelper::GetCommaSeparatedPlatformList(platformFlags); + [[maybe_unused]] auto platformsString = AzFramework::PlatformHelper::GetCommaSeparatedPlatformList(platformFlags); AZ_TracePrintf(AppWindowName, "No platform specified, defaulting to platforms ( %s ).\n", platformsString.c_str()); return platformFlags; diff --git a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpColorStreamImporter.cpp b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpColorStreamImporter.cpp index 4043f529df..f9b3de6df1 100644 --- a/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpColorStreamImporter.cpp +++ b/Code/Tools/SceneAPI/SceneBuilder/Importers/AssImpColorStreamImporter.cpp @@ -57,7 +57,7 @@ namespace AZ // This node has at least one mesh, verify that the color channel counts are the same for all meshes. const unsigned int expectedColorChannels = scene->mMeshes[currentNode->mMeshes[0]]->GetNumColorChannels(); - const bool allMeshesHaveSameNumberOfColorChannels = + [[maybe_unused]] const bool allMeshesHaveSameNumberOfColorChannels = AZStd::all_of(currentNode->mMeshes + 1, currentNode->mMeshes + currentNode->mNumMeshes, [scene, expectedColorChannels](const unsigned int meshIndex) { return scene->mMeshes[meshIndex]->GetNumColorChannels() == expectedColorChannels; diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorContext.cpp b/Code/Tools/Standalone/Source/LUA/LUAEditorContext.cpp index 1fa127dd7d..f36724ee1a 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorContext.cpp +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorContext.cpp @@ -1020,7 +1020,7 @@ namespace LUAEditor { AZ_TracePrintf(LUAEditorDebugName, AZStd::string::format("LUAEditor OnSaveDocumentAs" "%s\n", assetId.c_str()).c_str()); - DocumentInfoMap::iterator docInfoIter = m_documentInfoMap.find(assetId); + [[maybe_unused]] DocumentInfoMap::iterator docInfoIter = m_documentInfoMap.find(assetId); AZ_Assert(docInfoIter != m_documentInfoMap.end(), "LUAEditor OnSaveDocumentAs() : Cant find Document Info."); OnSaveDocument(assetId, bCloseAfterSave, true); diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/ConvertPixelFormat.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/ConvertPixelFormat.cpp index 8f851b46d1..b0f78d60a3 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/ConvertPixelFormat.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/ConvertPixelFormat.cpp @@ -98,7 +98,7 @@ namespace ImageProcessingAtom else { IImageObjectPtr dstImage = nullptr; - const PixelFormatInfo* compressedInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(compressedFmt); + [[maybe_unused]] const PixelFormatInfo* compressedInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(compressedFmt); if (isSrcUncompressed) { AZ::u64 startTime = AZStd::GetTimeUTCMilliSecond(); diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp index a1093ffc37..1618f376b4 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp @@ -350,7 +350,7 @@ namespace ImageProcessingAtom // output conversion log if (m_isSucceed && m_isFinished) { - const uint32 sizeTotal = m_image->Get()->GetTextureMemory(); + [[maybe_unused]] const uint32 sizeTotal = m_image->Get()->GetTextureMemory(); if (m_input->m_isPreview) { AZ_TracePrintf("Image Processing", "Image (%d bytes) converted in %f seconds\n", sizeTotal, m_processTime); @@ -971,7 +971,7 @@ namespace ImageProcessingAtom IImageObjectPtr previewImageAlpha = imageToProcess2.Get(); const uint32 imageMips = previewImage->GetMipCount(); - const uint32 alphaMips = previewImageAlpha->GetMipCount(); + [[maybe_unused]] const uint32 alphaMips = previewImageAlpha->GetMipCount(); // Get count of bytes per pixel for both rgb and alpha images uint32 imagePixelBytes = CPixelFormats::GetInstance().GetPixelFormatInfo(ePixelFormat_R8G8B8A8)->bitsPerBlock / 8; @@ -983,7 +983,7 @@ namespace ImageProcessingAtom for (uint32 mipLevel = 0; mipLevel < imageMips; ++mipLevel) { const uint32 pixelCount = previewImage->GetPixelCount(mipLevel); - const uint32 alphaPixelCount = previewImageAlpha->GetPixelCount(mipLevel); + [[maybe_unused]] const uint32 alphaPixelCount = previewImageAlpha->GetPixelCount(mipLevel); AZ_Assert(pixelCount == alphaPixelCount, "Pixel count for image and alpha image at mip level %d is not equal!", mipLevel); diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp index fa1b092e6b..0656fb4e46 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp @@ -830,7 +830,7 @@ namespace UnitTest continue; } - auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); + [[maybe_unused]] auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); imageToProcess.Set(srcImage); imageToProcess.ConvertFormat(pixelFormat); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp index 4a56c198d7..154bfdd607 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp @@ -908,9 +908,9 @@ namespace AZ AZ_Assert(optionEntry.IsObject(), "Expected option entry to be an object!"); Name defaultValueId = optionEntry.HasMember("defaultValue") ? Name(optionEntry["defaultValue"].GetString()) : Name(); - const AZStd::string optionName = optionEntry.HasMember("name") ? optionEntry["name"].GetString() : ""; - const bool valuesAreRange = optionEntry.HasMember("range") ? optionEntry["range"].GetBool() : false; - const bool isPredefinedType = optionEntry.HasMember("kind") ? AzFramework::StringFunc::Equal(optionEntry["kind"].GetString(), "predefined") : false; + const AZStd::string optionName = optionEntry.HasMember("name") ? optionEntry["name"].GetString() : ""; + [[maybe_unused]] const bool valuesAreRange = optionEntry.HasMember("range") ? optionEntry["range"].GetBool() : false; + const bool isPredefinedType = optionEntry.HasMember("kind") ? AzFramework::StringFunc::Equal(optionEntry["kind"].GetString(), "predefined") : false; auto optionType = RPI::ShaderOptionType::Unknown; if (isPredefinedType && optionEntry.HasMember("type")) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp index 8ec7733d07..9ee4ff2161 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp @@ -462,7 +462,7 @@ namespace AZ { finalShaderOptionGroupLayout = shaderOptionGroupLayout; shaderAssetCreator.SetShaderOptionGroupLayout(finalShaderOptionGroupLayout); - const uint32_t usedShaderOptionBits = shaderOptionGroupLayout->GetBitSize(); + [[maybe_unused]] const uint32_t usedShaderOptionBits = shaderOptionGroupLayout->GetBitSize(); AZ_TracePrintf( ShaderAssetBuilderName, "Note: This shader uses %u of %u available shader variant key bits. \n", usedShaderOptionBits, RPI::ShaderVariantKeyBitCount); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp index 5dc1267dbb..12e5382b63 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp @@ -388,7 +388,7 @@ namespace AZ for (const AZ::RPI::ShaderVariantListSourceData::VariantInfo& variantInfo : shaderVariantList.m_shaderVariants) { AZStd::string variantInfoAsJsonString; - const bool convertSuccess = AZ::RPI::JsonUtils::SaveObjectToJsonString(variantInfo, variantInfoAsJsonString); + [[maybe_unused]] const bool convertSuccess = AZ::RPI::JsonUtils::SaveObjectToJsonString(variantInfo, variantInfoAsJsonString); AZ_Assert(convertSuccess, "Failed to convert VariantInfo to json string"); AssetBuilderSDK::JobDescriptor jobDescriptor; @@ -755,7 +755,7 @@ namespace AZ const AZStd::string& variantJsonString = jobParameters.at(ShaderVariantJobVariantParam); RPI::ShaderVariantListSourceData::VariantInfo variantInfo; - const bool fromJsonStringSuccess = AZ::RPI::JsonUtils::LoadObjectFromJsonString(variantJsonString, variantInfo); + [[maybe_unused]] const bool fromJsonStringSuccess = AZ::RPI::JsonUtils::LoadObjectFromJsonString(variantJsonString, variantInfo); AZ_Assert(fromJsonStringSuccess, "Failed to convert json string to VariantInfo"); RPI::ShaderSourceData shaderSourceDescriptor; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp index 0d089a26bf..e0812f633a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp @@ -325,11 +325,11 @@ namespace AZ DirectionalLightFeatureProcessorInterface::LightHandle DirectionalLightFeatureProcessor::AcquireLight() { const uint16_t index = m_lightData.GetFreeSlotIndex(); - const uint16_t shadowPropIndex = m_shadowProperties.GetFreeSlotIndex(); + [[maybe_unused]] const uint16_t shadowPropIndex = m_shadowProperties.GetFreeSlotIndex(); AZ_Assert(index == shadowPropIndex, "light index is illegal."); for (const auto& viewIt : m_cameraViewNames) { - const uint16_t shadowIndex = m_shadowData.at(viewIt.first).GetFreeSlotIndex(); + [[maybe_unused]] const uint16_t shadowIndex = m_shadowData.at(viewIt.first).GetFreeSlotIndex(); AZ_Assert(index == shadowIndex, "light index is illegal."); } diff --git a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp index a885708a47..b6ca1191dd 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.cpp @@ -38,7 +38,7 @@ namespace AZ { namespace { - static const char* PassName = "ImGuiPass"; + [[maybe_unused]] static const char* PassName = "ImGuiPass"; static const char* ImguiShaderFilePath = "Shaders/imgui/imgui.azshader"; } diff --git a/Gems/Atom/Feature/Common/Code/Source/Utils/GpuBufferHandler.cpp b/Gems/Atom/Feature/Common/Code/Source/Utils/GpuBufferHandler.cpp index 3115c5410b..7a2827bebe 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Utils/GpuBufferHandler.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Utils/GpuBufferHandler.cpp @@ -17,7 +17,7 @@ namespace AZ { namespace Render { - static const char* ClassName = "GpuBufferHandler"; + [[maybe_unused]] static const char* ClassName = "GpuBufferHandler"; static const uint32_t BufferMinSize = 1 << 16; // Min 64Kb. GpuBufferHandler::GpuBufferHandler(const Descriptor& descriptor) diff --git a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteGroup.cpp b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteGroup.cpp index a493fbd143..d00991421f 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteGroup.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/FrameGraphExecuteGroup.cpp @@ -71,7 +71,7 @@ namespace AZ { EndContextInternal(m_contexts[contextIndex], contextIndex); - const int32_t activeCount = --m_contextCountActive; + [[maybe_unused]] const int32_t activeCount = --m_contextCountActive; AZ_Assert(activeCount >= 0, "Asymmetric calls to FrameSchedulerExecuteContext:: Begin / End."); ++m_contextCountCompleted; } diff --git a/Gems/Atom/RHI/Code/Source/RHI/Resource.cpp b/Gems/Atom/RHI/Code/Source/RHI/Resource.cpp index b7ae469f16..f27ea22d8a 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/Resource.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/Resource.cpp @@ -98,8 +98,8 @@ namespace AZ if (Validation::IsEnabled()) { // The frame attachment has tight control over lifecycle here. - const bool isAttach = (!m_frameAttachment && frameAttachment); - const bool isDetach = (m_frameAttachment && !frameAttachment); + [[maybe_unused]] const bool isAttach = (!m_frameAttachment && frameAttachment); + [[maybe_unused]] const bool isDetach = (m_frameAttachment && !frameAttachment); AZ_Assert(isAttach || isDetach, "The frame attachment for resource '%s' was not assigned properly."); } diff --git a/Gems/Atom/RHI/Code/Tests/BufferTests.cpp b/Gems/Atom/RHI/Code/Tests/BufferTests.cpp index 0ce4626b92..acf680a6d8 100644 --- a/Gems/Atom/RHI/Code/Tests/BufferTests.cpp +++ b/Gems/Atom/RHI/Code/Tests/BufferTests.cpp @@ -121,6 +121,7 @@ namespace UnitTest bufferPool->ForEach([&bufferIndex, &buffers]([[maybe_unused]] RHI::Buffer& buffer) { + AZ_UNUSED(buffers); // Prevent unused warning in release builds AZ_Assert(buffers[bufferIndex] == &buffer, "buffers don't match"); bufferIndex++; }); diff --git a/Gems/Atom/RHI/Code/Tests/FrameGraph.cpp b/Gems/Atom/RHI/Code/Tests/FrameGraph.cpp index e03c9d13b4..bc2dce056c 100644 --- a/Gems/Atom/RHI/Code/Tests/FrameGraph.cpp +++ b/Gems/Atom/RHI/Code/Tests/FrameGraph.cpp @@ -58,7 +58,7 @@ namespace UnitTest FrameGraphExecuteGroup* group = AddGroup(); group->Init(scope->GetId()); - const bool wasInserted = m_scopeIds.emplace(scope->GetId()).second; + [[maybe_unused]] const bool wasInserted = m_scopeIds.emplace(scope->GetId()).second; AZ_Assert(wasInserted, "scope was inserted already"); } } diff --git a/Gems/Atom/RHI/Code/Tests/ImageTests.cpp b/Gems/Atom/RHI/Code/Tests/ImageTests.cpp index d3f528c9cd..ebcc05abe1 100644 --- a/Gems/Atom/RHI/Code/Tests/ImageTests.cpp +++ b/Gems/Atom/RHI/Code/Tests/ImageTests.cpp @@ -108,6 +108,7 @@ namespace UnitTest imagePool->ForEach([&imageIndex, &images]([[maybe_unused]] const RHI::Image& image) { + AZ_UNUSED(images); // Prevent unused warning in release builds AZ_Assert(images[imageIndex] == &image, "images don't match"); imageIndex++; }); diff --git a/Gems/Atom/RHI/Code/Tests/QueryTests.cpp b/Gems/Atom/RHI/Code/Tests/QueryTests.cpp index f883f6a8bd..9eb45cbd96 100644 --- a/Gems/Atom/RHI/Code/Tests/QueryTests.cpp +++ b/Gems/Atom/RHI/Code/Tests/QueryTests.cpp @@ -112,6 +112,7 @@ namespace UnitTest queryPool->ForEach([&queryIndex, &queries]([[maybe_unused]] RHI::Query& query) { + AZ_UNUSED(queries); // Prevent unused warning in release builds AZ_Assert(queries[queryIndex] == &query, "Queries don't match"); queryIndex++; }); diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp index 903b25e16f..7e41e50892 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp @@ -191,7 +191,7 @@ namespace AZ StageDescriptor& outputDescriptor, const RHI::ShaderCompilerArguments& shaderCompilerArguments) const { - for (auto srgLayout : m_srgLayouts) + for ([[maybe_unused]] auto srgLayout : m_srgLayouts) { AZ_Assert(srgLayout != nullptr, "Most likely BuildPipelineLayoutDescriptor() was not called!"); } @@ -280,7 +280,7 @@ namespace AZ // Enable half precision types when shader model >= 6.2 int shaderModelMajor = 0; int shaderModelMinor = 0; - int numValuesRead = azsscanf(shaderModelVersion.c_str(), "%d_%d", &shaderModelMajor, &shaderModelMinor); + [[maybe_unused]] int numValuesRead = azsscanf(shaderModelVersion.c_str(), "%d_%d", &shaderModelMajor, &shaderModelMinor); AZ_Assert(numValuesRead == 2, "Unknown shader model version format"); if (shaderModelMajor >= 6 && shaderModelMinor >= 2) { diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/ArgumentBuffer.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI/ArgumentBuffer.cpp index 05107128ad..b820a6bf76 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI/ArgumentBuffer.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/ArgumentBuffer.cpp @@ -431,7 +431,7 @@ namespace AZ } else { - bool isBoundToGraphics = RHI::CheckBitsAny(visMaskIt->second, RHI::ShaderStageMask::Vertex) || RHI::CheckBitsAny(visMaskIt->second, RHI::ShaderStageMask::Fragment); + [[maybe_unused]] bool isBoundToGraphics = RHI::CheckBitsAny(visMaskIt->second, RHI::ShaderStageMask::Vertex) || RHI::CheckBitsAny(visMaskIt->second, RHI::ShaderStageMask::Fragment); AZ_Assert(isBoundToGraphics, "The visibility mask %i is not set for Vertex or fragment stage", visMaskIt->second); CollectResourcesForGraphics(commandEncoder, visMaskIt->second, it.second, resourcesToMakeResidentGraphics); } diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/BufferView.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI/BufferView.cpp index 9b67f5c6e2..5508086fe5 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI/BufferView.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/BufferView.cpp @@ -54,7 +54,7 @@ namespace AZ usage : textureUsage]; mtlTextureDesc.textureType = MTLTextureTypeTextureBuffer; - uint32_t bytesPerRow = viewDescriptor.m_elementCount * bytesPerPixel; + [[maybe_unused]] uint32_t bytesPerRow = viewDescriptor.m_elementCount * bytesPerPixel; AZ_Assert(bytesPerRow == (viewDescriptor.m_elementCount * viewDescriptor.m_elementSize), "Mismatch for bytesPerRow"); id mtlTexture = [mtlBuffer newTextureWithDescriptor : mtlTextureDesc offset : m_memoryView.GetOffset() diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/PipelineState.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI/PipelineState.cpp index f1d9fdc3a6..8d6ab8fee3 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI/PipelineState.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/PipelineState.cpp @@ -188,7 +188,7 @@ namespace AZ } else { - const char * errorStr = [ error.localizedDescription UTF8String ]; + [[maybe_unused]] const char * errorStr = [ error.localizedDescription UTF8String ]; AZ_Error("PipelineState", false, "Failed to compile compute pipeline state with error: %s.", errorStr); return RHI::ResultCode::Fail; } @@ -221,7 +221,7 @@ namespace AZ } else { - const char * errorStr = [ error.localizedDescription UTF8String ]; + [[maybe_unused]] const char * errorStr = [ error.localizedDescription UTF8String ]; AZ_Error("PipelineState", false, "Failed to compile compute pipeline state with error: %s.", errorStr); return RHI::ResultCode::Fail; } diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/BufferView.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/BufferView.cpp index d07ee5dde3..3cd016ba39 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/BufferView.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/BufferView.cpp @@ -108,7 +108,7 @@ namespace AZ VkAccelerationStructureKHR BufferView::GetNativeAccelerationStructure() const { bool hasOverrideFlags = GetDescriptor().m_overrideBindFlags != RHI::BufferBindFlags::None; - const RHI::BufferBindFlags bindFlags = hasOverrideFlags ? GetDescriptor().m_overrideBindFlags : GetBuffer().GetDescriptor().m_bindFlags; + [[maybe_unused]] const RHI::BufferBindFlags bindFlags = hasOverrideFlags ? GetDescriptor().m_overrideBindFlags : GetBuffer().GetDescriptor().m_bindFlags; AZ_Assert(RHI::CheckBitsAll(bindFlags, RHI::BufferBindFlags::RayTracingAccelerationStructure), "GetNativeAccelerationStructure() is only valid for buffers with the RayTracingAccelerationStructure bind flag"); diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ImageView.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ImageView.cpp index 44c36f5c70..9a92028b86 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ImageView.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ImageView.cpp @@ -117,10 +117,10 @@ namespace AZ const auto& device = static_cast(GetDevice()); const auto& physicalDevice = static_cast(GetDevice().GetPhysicalDevice()); - const uint16_t width = static_cast(imgDesc.m_size.m_width); - const uint16_t height = static_cast(imgDesc.m_size.m_height); + [[maybe_unused]] const uint16_t width = static_cast(imgDesc.m_size.m_width); + [[maybe_unused]] const uint16_t height = static_cast(imgDesc.m_size.m_height); const uint16_t depth = AZStd::min(static_cast(imgViewDesc.m_depthSliceMax - imgViewDesc.m_depthSliceMin), static_cast(imgDesc.m_size.m_depth - 1)) + 1; - const uint16_t samples = imgDesc.m_multisampleState.m_samples; + [[maybe_unused]] const uint16_t samples = imgDesc.m_multisampleState.m_samples; const uint16_t arrayLayers = AZStd::min(static_cast(imgViewDesc.m_arraySliceMax - imgViewDesc.m_arraySliceMin), static_cast(imgDesc.m_arraySize - 1)) + 1; // We cannot only use the number of layers of the ImageView to determinate if is a texture array. You can have a texture array with only 1 layer and the shader expects // an array type instead of a normal image type. diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Image/ImageSystem.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Image/ImageSystem.cpp index cb838eb2ba..d4a55d1c29 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Image/ImageSystem.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Image/ImageSystem.cpp @@ -254,7 +254,7 @@ namespace AZ poolAssetCreator.SetPoolDescriptor(AZStd::move(imagePoolDescriptor)); poolAssetCreator.SetControllerAsset(m_defaultStreamingImageControllerAsset); poolAssetCreator.SetPoolName(systemStreamingPoolDescriptor.m_name); - const bool created = poolAssetCreator.End(poolAsset); + [[maybe_unused]] const bool created = poolAssetCreator.End(poolAsset); AZ_Assert(created, "Failed to build streaming image pool"); m_systemStreamingPool = StreamingImagePool::FindOrCreate(poolAsset); @@ -272,7 +272,7 @@ namespace AZ poolAssetCreator.SetPoolDescriptor(AZStd::move(imagePoolDescriptor)); poolAssetCreator.SetControllerAsset(m_defaultStreamingImageControllerAsset); poolAssetCreator.SetPoolName(assetStreamingPoolDescriptor.m_name); - const bool created = poolAssetCreator.End(poolAsset); + [[maybe_unused]] const bool created = poolAssetCreator.End(poolAsset); AZ_Assert(created, "Failed to build streaming image pool for assets"); m_assetStreamingPool = StreamingImagePool::FindOrCreate(poolAsset); @@ -292,7 +292,7 @@ namespace AZ poolAssetCreator.Begin(systemAttachmentPoolDescriptor.m_assetId); poolAssetCreator.SetPoolDescriptor(AZStd::move(imagePoolDescriptor)); poolAssetCreator.SetPoolName(systemAttachmentPoolDescriptor.m_name); - const bool created = poolAssetCreator.End(poolAsset); + [[maybe_unused]] const bool created = poolAssetCreator.End(poolAsset); AZ_Assert(created, "Failed to build attachment image pool"); m_systemAttachmentPool = AttachmentImagePool::FindOrCreate(poolAsset); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageController.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageController.cpp index 97a3eb324b..a84d8ca9b7 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageController.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Image/StreamingImageController.cpp @@ -88,7 +88,7 @@ namespace AZ { if (StreamingImage* image = context->TryGetImage()) { - const RHI::ResultCode resultCode = image->ExpandMipChain(); + [[maybe_unused]] const RHI::ResultCode resultCode = image->ExpandMipChain(); AZ_Warning("StreamingImageController", resultCode == RHI::ResultCode::Success, "Failed to expand mip chain for streaming image."); } context->m_queuedForMipExpand = false; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp index 9b182a3c4b..318ea7d11f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RenderPass.cpp @@ -494,6 +494,7 @@ namespace AZ { if (query->BeginQuery(context) == QueryResultCode::Fail) { + AZ_UNUSED(this); // Prevent unused warning in release builds AZ_WarningOnce("RenderPass", false, "BeginScopeQuery failed. Make sure AddScopeQueryToFrameGraph was called in SetupFrameGraphDependencies" " for this pass: %s", this->RTTI_GetTypeName()); } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp index bd49a72f40..616aa44299 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp @@ -28,7 +28,7 @@ namespace AZ static constexpr uint32_t SubProductTypeBitPosition = 0; static constexpr uint32_t SubProductTypeNumBits = SupervariantIndexBitPosition - SubProductTypeBitPosition; - static constexpr uint32_t SubProductTypeMaxValue = (1 << SubProductTypeNumBits) - 1; + [[maybe_unused]] static constexpr uint32_t SubProductTypeMaxValue = (1 << SubProductTypeNumBits) - 1; static_assert(RhiIndexMaxValue == RHI::Limits::APIType::PerPlatformApiUniqueIndexMax); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantAsset.cpp index 5d31feb411..442fc6a79f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantAsset.cpp @@ -25,11 +25,11 @@ namespace AZ { static constexpr uint32_t SubProductTypeBitPosition = 17; static constexpr uint32_t SubProductTypeNumBits = SupervariantIndexBitPosition - SubProductTypeBitPosition; - static constexpr uint32_t SubProductTypeMaxValue = (1 << SubProductTypeNumBits) - 1; + [[maybe_unused]] static constexpr uint32_t SubProductTypeMaxValue = (1 << SubProductTypeNumBits) - 1; static constexpr uint32_t StableIdBitPosition = 0; static constexpr uint32_t StableIdNumBits = SubProductTypeBitPosition - StableIdBitPosition; - static constexpr uint32_t StableIdMaxValue = (1 << StableIdNumBits) - 1; + [[maybe_unused]] static constexpr uint32_t StableIdMaxValue = (1 << StableIdNumBits) - 1; static_assert(RhiIndexMaxValue == RHI::Limits::APIType::PerPlatformApiUniqueIndexMax); diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Application/AtomToolsApplication.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Application/AtomToolsApplication.cpp index b8426f7528..36e45bb7ca 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Application/AtomToolsApplication.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Application/AtomToolsApplication.cpp @@ -238,6 +238,7 @@ namespace AtomToolsFramework connectionSettings.m_connectionIdentifier = GetBuildTargetName(); connectionSettings.m_loggingCallback = [targetName]([[maybe_unused]] AZStd::string_view logData) { + AZ_UNUSED(targetName); // Prevent unused warning in release builds AZ_TracePrintf(targetName.c_str(), "%.*s", aznumeric_cast(logData.size()), logData.data()); }; AzFramework::AssetSystemRequestBus::BroadcastResult( diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp index 0be6925701..0388af0134 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Window/MaterialEditorWindow.cpp @@ -112,7 +112,7 @@ namespace MaterialEditor requestedViewportSize.width(), requestedViewportSize.height(), m_materialViewport->size().width(), m_materialViewport->size().height()); - QSize newDeviceSize = m_materialViewport->size(); + [[maybe_unused]] QSize newDeviceSize = m_materialViewport->size(); AZ_Warning( "Material Editor", static_cast(newDeviceSize.width()) == width && static_cast(newDeviceSize.height()) == height, "Resizing the window did not give the expected frame size. Requested %d x %d but got %d x %d.", width, height, diff --git a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl index 49b6430221..9b2f2b0dd9 100644 --- a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl +++ b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl @@ -390,7 +390,7 @@ namespace AZ inline void ImGuiPipelineStatisticsView::CreateAttributeRow(const PassEntry* passEntry, const PassEntry* rootEntry) { - const uint32_t columnCount = static_cast(ImGui::GetColumnsCount()); + [[maybe_unused]] const uint32_t columnCount = static_cast(ImGui::GetColumnsCount()); AZ_Assert(columnCount == ImGuiPipelineStatisticsView::HeaderAttributeCount, "The column count needs to match HeaderAttributeCount."); ImGui::Separator(); @@ -1348,7 +1348,7 @@ namespace AZ PassEntry entry(pass, parent); // Set the time stamp in the database. - const auto passEntry = passEntryDatabase.find(entry.m_path); + [[maybe_unused]] const auto passEntry = passEntryDatabase.find(entry.m_path); AZ_Assert(passEntry == passEntryDatabase.end(), "There already is an entry with the name \"%s\".", entry.m_path.GetCStr()); // Set the entry in the map. diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp b/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp index 053a2eb419..f1fc8be965 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp @@ -256,7 +256,7 @@ int AZ::FontRenderer::GetGlyph(GlyphBitmap* glyphBitmap, int* horizontalAdvance, // might happen if font characters are too big or cache dimenstions in font.xml is too small "" const bool charWidthFits = static_cast(iX + m_glyph->bitmap.width) <= textureSlotBufferWidth; const bool charHeightFits = static_cast(iY + m_glyph->bitmap.rows) <= textureSlotBufferHeight; - const bool charFitsInSlot = charWidthFits && charHeightFits; + [[maybe_unused]] const bool charFitsInSlot = charWidthFits && charHeightFits; AZ_Error("Font", charFitsInSlot, "Character code %d doesn't fit in font texture; check 'sizeRatio' attribute in font XML or adjust this character's sizing in the font.", characterCode); // Since we might be re-rendering/overwriting a glyph that already exists diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp index 16243235a2..a3161002a0 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.cpp @@ -811,7 +811,7 @@ namespace AZ const uint64_t inputByteOffset = aznumeric_cast(inputBufferViewDescriptor.m_elementOffset) * aznumeric_cast(inputBufferViewDescriptor.m_elementSize); const uint32_t outputElementSize = SkinnedMeshVertexStreamPropertyInterface::Get()->GetOutputStreamInfo(outputStream).m_elementSize; - const uint64_t outputByteCount = aznumeric_cast(lodVertexCount) * aznumeric_cast(outputElementSize); + [[maybe_unused]] const uint64_t outputByteCount = aznumeric_cast(lodVertexCount) * aznumeric_cast(outputElementSize); const uint64_t outputByteOffset = aznumeric_cast(outputBufferOffsetsInBytes[static_cast(outputStream)]); // The byte count from input and output buffers doesn't have to match necessarily. diff --git a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp index c3d9a88471..34fee273c2 100644 --- a/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/CommandSystem/Source/MotionSetCommands.cpp @@ -997,7 +997,7 @@ namespace CommandSystem else { AZStd::string result; - const bool success = GetCommandManager()->ExecuteCommand(AZStd::string::format("Unselect -motionName %s", selectedMotion->GetName()), result); + [[maybe_unused]] const bool success = GetCommandManager()->ExecuteCommand(AZStd::string::format("Unselect -motionName %s", selectedMotion->GetName()), result); AZ_Error("EMotionFX", success, result.c_str()); } } diff --git a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp index 130aa41931..422baa5125 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp @@ -406,7 +406,7 @@ namespace EMotionFX for (; iterator != sceneGraphDownardsIteratorView.end(); ++iterator) { SceneContainers::SceneGraph::HierarchyStorageConstIterator hierarchy = iterator.GetHierarchyIterator(); - SceneContainers::SceneGraph::NodeIndex currentIndex = graph.ConvertToNodeIndex(hierarchy); + [[maybe_unused]] SceneContainers::SceneGraph::NodeIndex currentIndex = graph.ConvertToNodeIndex(hierarchy); AZ_Assert(currentIndex.IsValid(), "While iterating through the Scene Graph an unexpected invalid entry was found."); AZStd::shared_ptr currentItem = iterator->second; if (hierarchy->IsEndPoint()) diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Pose.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Pose.cpp index 99f1474c89..e2bff677ad 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Pose.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Pose.cpp @@ -728,7 +728,7 @@ namespace EMotionFX m_localSpaceTransforms[nodeNr].Zero(); } - const size_t numMorphs = m_morphWeights.size(); + [[maybe_unused]] const size_t numMorphs = m_morphWeights.size(); MCORE_ASSERT(m_actorInstance->GetMorphSetupInstance()->GetNumMorphTargets() == numMorphs); for (float& morphWeight : m_morphWeights) { @@ -743,7 +743,7 @@ namespace EMotionFX m_localSpaceTransforms[i].Zero(); } - const size_t numMorphs = m_morphWeights.size(); + [[maybe_unused]] const size_t numMorphs = m_morphWeights.size(); MCORE_ASSERT(m_actor->GetMorphSetup(0)->GetNumMorphTargets() == numMorphs); for (float& morphWeight : m_morphWeights) { diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NodeHierarchyWidget.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NodeHierarchyWidget.cpp index 63934a380c..89e5363bbb 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NodeHierarchyWidget.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/NodeHierarchyWidget.cpp @@ -454,7 +454,7 @@ namespace EMStudio // get the actor instance id to which this item belongs to m_actorInstanceIdString = FromQtString(item->whatsThis(0)); int actorInstanceID; - const bool validConversion = AzFramework::StringFunc::LooksLikeInt(m_actorInstanceIdString.c_str(), &actorInstanceID); + [[maybe_unused]] const bool validConversion = AzFramework::StringFunc::LooksLikeInt(m_actorInstanceIdString.c_str(), &actorInstanceID); MCORE_ASSERT(validConversion); // remove the node from the selected nodes @@ -497,7 +497,7 @@ namespace EMStudio FromQtString(item->whatsThis(0), &m_actorInstanceIdString); int actorInstanceID; - const bool validConversion = AzFramework::StringFunc::LooksLikeInt(m_actorInstanceIdString.c_str(), &actorInstanceID); + [[maybe_unused]] const bool validConversion = AzFramework::StringFunc::LooksLikeInt(m_actorInstanceIdString.c_str(), &actorInstanceID); MCORE_ASSERT(validConversion); EMotionFX::ActorInstance* actorInstance = EMotionFX::GetActorManager().FindActorInstanceByID(actorInstanceID); diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGraph.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGraph.cpp index 596f3d7e30..759adbcb1c 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGraph.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/NodeGraph.cpp @@ -2077,7 +2077,7 @@ namespace EMStudio if (visualStateConnection->GetModelIndex() == modelIndex) { // Transfer ownership from the previous visual node to where we relinked the transition to. - const bool connectionRemoveResult = visualNode->RemoveConnection(transition, false); + [[maybe_unused]] const bool connectionRemoveResult = visualNode->RemoveConnection(transition, false); AZ_Error("EMotionFX", connectionRemoveResult, "Removing connection failed."); targetGraphNode->AddConnection(visualStateConnection); diff --git a/Gems/GraphModel/Code/Source/Integration/GraphController.cpp b/Gems/GraphModel/Code/Source/Integration/GraphController.cpp index 3551e5ba41..86cfb42990 100644 --- a/Gems/GraphModel/Code/Source/Integration/GraphController.cpp +++ b/Gems/GraphModel/Code/Source/Integration/GraphController.cpp @@ -280,6 +280,7 @@ namespace GraphModelIntegration } else { + AZ_UNUSED(this); // Prevent unused warning in release builds AZ_Error(m_graph->GetSystemName(), false, "Failed to load position information for node [%d]", nodeId); } diff --git a/Gems/ImGui/Code/Include/ImGuiContextScope.h b/Gems/ImGui/Code/Include/ImGuiContextScope.h index 553430862e..f9b2df1834 100644 --- a/Gems/ImGui/Code/Include/ImGuiContextScope.h +++ b/Gems/ImGui/Code/Include/ImGuiContextScope.h @@ -39,6 +39,6 @@ namespace ImGui private: //////////////////////////////////////////////////////////////////////////////////////////// - ImGuiContext* m_previousContext = nullptr; + [[maybe_unused]] ImGuiContext* m_previousContext = nullptr; }; } diff --git a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm index 09d087e97a..d1ec128236 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm +++ b/Gems/InAppPurchases/Code/Source/Platform/Common/Apple/InAppPurchasesDelegate.mm @@ -131,7 +131,7 @@ -(void) productsRequest:(SKProductsRequest*) request didReceiveResponse:(SKProductsResponse*) response { - for (NSString* invalidId in response.invalidProductIdentifiers) + for ([[maybe_unused]] NSString* invalidId in response.invalidProductIdentifiers) { AZ_TracePrintf("O3DEInAppPurchases:", "Invalid product ID:", [invalidId cStringUsingEncoding:NSASCIIStringEncoding]); } diff --git a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp index 88284ede1d..4fc350067d 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp @@ -388,11 +388,11 @@ namespace SliceBuilder bool sliceWritable = AZ::IO::SystemFile::IsWritable(fullPath.c_str()); if (!m_settings.m_enableSliceConversion || !sliceWritable) { - static const char* const s_OutOfDate = "This slice file is out of date: "; - static const char* const s_ToEnable = "To enable automatic upgrades:"; - static const char* const s_FixSettings1 = "In the settings file "; - static const char* const s_FixSettings2 = ", Set 'EnableSliceConversion' to true and restart the Asset Processor"; - static const char* const s_FixReadOnly = "Make sure the slice file isn't marked read-only. If using perforce, check out the slice file."; + [[maybe_unused]] static const char* const s_OutOfDate = "This slice file is out of date: "; + [[maybe_unused]] static const char* const s_ToEnable = "To enable automatic upgrades:"; + [[maybe_unused]] static const char* const s_FixSettings1 = "In the settings file "; + [[maybe_unused]] static const char* const s_FixSettings2 = ", Set 'EnableSliceConversion' to true and restart the Asset Processor"; + [[maybe_unused]] static const char* const s_FixReadOnly = "Make sure the slice file isn't marked read-only. If using perforce, check out the slice file."; // The Slice isn't marked as read only but Slice Upgrades aren't Enabled in the builder settings file if(!m_settings.m_enableSliceConversion && sliceWritable) @@ -512,10 +512,10 @@ namespace SliceBuilder // To avoid potential data loss, only delete the old file if there is a data patching error detected if (m_sliceDataPatchError) { - static const char* const s_overrideWarning = "At least one Data Patch Upgrade wasn't completed:"; - static const char* const s_checkLogs = "Please check the slice processing log for more information."; - static const char* const s_originalSliceAvailable = "The original slice file has been preserved at: "; - static const char* const s_recomendReload = "It's recomended that this slice be loaded into the editor and repaired before upgrading."; + [[maybe_unused]] static const char* const s_overrideWarning = "At least one Data Patch Upgrade wasn't completed:"; + [[maybe_unused]] static const char* const s_checkLogs = "Please check the slice processing log for more information."; + [[maybe_unused]] static const char* const s_originalSliceAvailable = "The original slice file has been preserved at: "; + [[maybe_unused]] static const char* const s_recomendReload = "It's recomended that this slice be loaded into the editor and repaired before upgrading."; AZ_Warning(s_sliceBuilder, false, "%s\n%s\n%s%s\n%s", s_overrideWarning, s_checkLogs, s_originalSliceAvailable, oldPath.c_str(), s_recomendReload); } diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp index 41397ce265..5d62f88310 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewAnimNode.cpp @@ -178,8 +178,8 @@ void CUiAnimViewAnimNode::UiElementPropertyChanged() AZ::Component* oldComponent = oldComponents[componentIndex]; AZ::Component* newComponent = newComponents[componentIndex]; - AZ::Uuid oldComponentType = oldComponent->RTTI_GetType(); - AZ::Uuid newComponentType = newComponent->RTTI_GetType(); + [[maybe_unused]] AZ::Uuid oldComponentType = oldComponent->RTTI_GetType(); + [[maybe_unused]] AZ::Uuid newComponentType = newComponent->RTTI_GetType(); AZ_Assert(oldComponentType == newComponentType, "Components have different types"); diff --git a/Gems/LyShine/Code/Source/LyShineDebug.cpp b/Gems/LyShine/Code/Source/LyShineDebug.cpp index a30f816c73..160df96ac9 100644 --- a/Gems/LyShine/Code/Source/LyShineDebug.cpp +++ b/Gems/LyShine/Code/Source/LyShineDebug.cpp @@ -39,7 +39,7 @@ AllocateConstIntCVar(LyShineDebug, CV_r_DebugUIDraw2dLine); AllocateConstIntCVar(LyShineDebug, CV_r_DebugUIDraw2dDefer); static const int g_numColors = 8; -static const char* g_colorNames[g_numColors] = +[[maybe_unused]] static const char* g_colorNames[g_numColors] = { "white", "red", @@ -64,7 +64,7 @@ static AZ::Vector3 g_colorVec3[g_numColors] = }; static const int g_numSrcBlendModes = 11; -static int g_srcBlendModes[g_numSrcBlendModes] = +[[maybe_unused]] static int g_srcBlendModes[g_numSrcBlendModes] = { GS_BLSRC_ZERO, GS_BLSRC_ONE, @@ -80,7 +80,7 @@ static int g_srcBlendModes[g_numSrcBlendModes] = }; static const int g_numDstBlendModes = 10; -static int g_dstBlendModes[g_numDstBlendModes] = +[[maybe_unused]] static int g_dstBlendModes[g_numDstBlendModes] = { GS_BLDST_ZERO, GS_BLDST_ONE, @@ -94,7 +94,7 @@ static int g_dstBlendModes[g_numDstBlendModes] = GS_BLDST_ONEMINUSSRC1ALPHA, // dual source blending }; -static bool g_deferDrawsToEndOfFrame = false; +[[maybe_unused]] static bool g_deferDrawsToEndOfFrame = false; //////////////////////////////////////////////////////////////////////////////////////////////////// // LOCAL STATIC FUNCTIONS diff --git a/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.cpp b/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.cpp index 4264dd0ab3..acc9713291 100644 --- a/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.cpp +++ b/Gems/Maestro/Code/Source/Components/EditorSequenceAgentComponent.cpp @@ -146,7 +146,7 @@ namespace Maestro AZ::EntityId sequenceEntityId = busIdToDisconnect->first; // we only process DisconnectSequence events sent over an ID'ed bus - otherwise we don't know which SequenceComponent to disconnect - auto findIter = m_sequenceEntityIds.find(sequenceEntityId); + [[maybe_unused]] auto findIter = m_sequenceEntityIds.find(sequenceEntityId); AZ_Assert(findIter != m_sequenceEntityIds.end(), "A sequence not connected to SequenceAgentComponent on %s is requesting a disconnection", GetEntity()->GetName().c_str()); m_sequenceEntityIds.erase(sequenceEntityId); diff --git a/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.cpp b/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.cpp index 83599d7b40..5f38334c83 100644 --- a/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.cpp +++ b/Gems/Maestro/Code/Source/Components/SequenceAgentComponent.cpp @@ -74,7 +74,7 @@ namespace Maestro AZ::EntityId sequenceEntityId = busIdToDisconnect->first; // we only process DisconnectSequence events sent over an ID'ed bus - otherwise we don't know which SequenceComponent to disconnect - auto findIter = m_sequenceEntityIds.find(sequenceEntityId); + [[maybe_unused]] auto findIter = m_sequenceEntityIds.find(sequenceEntityId); AZ_Assert(findIter != m_sequenceEntityIds.end(), "A sequence not connected to SequenceAgentComponent on %s is requesting a disconnection", GetEntity()->GetName().c_str()); m_sequenceEntityIds.erase(sequenceEntityId); diff --git a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugPerEntityReporter.h b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugPerEntityReporter.h index 8a68110b93..2d0fe4da39 100644 --- a/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugPerEntityReporter.h +++ b/Gems/Multiplayer/Code/Source/Debug/MultiplayerDebugPerEntityReporter.h @@ -53,8 +53,8 @@ namespace Multiplayer AZStd::map m_receivingEntityReports{}; MultiplayerDebugEntityReporter m_currentReceivingEntityReport; - float m_replicatedStateKbpsWarn = 10.f; - float m_replicatedStateMaxSizeWarn = 30.f; + [[maybe_unused]] float m_replicatedStateKbpsWarn = 10.f; + [[maybe_unused]] float m_replicatedStateMaxSizeWarn = 30.f; char m_statusBuffer[100] = {}; diff --git a/Gems/MultiplayerCompression/Code/Tests/MultiplayerCompressionTest.cpp b/Gems/MultiplayerCompression/Code/Tests/MultiplayerCompressionTest.cpp index 572dffbe60..4748d0f331 100644 --- a/Gems/MultiplayerCompression/Code/Tests/MultiplayerCompressionTest.cpp +++ b/Gems/MultiplayerCompression/Code/Tests/MultiplayerCompressionTest.cpp @@ -53,7 +53,7 @@ TEST_F(MultiplayerCompressionTest, MultiplayerCompression_CompressTest) MultiplayerCompression::LZ4Compressor lz4Compressor; startTime = AZStd::chrono::system_clock::now(); AzNetworking::CompressorError compressStatus = lz4Compressor.Compress(buffer.GetBuffer(), buffer.GetSize(), pCompressedBuffer, maxCompressedSize, compressedSize); - const AZ::u64 compressTime = (AZStd::chrono::system_clock::now() - startTime).count(); + [[maybe_unused]] const AZ::u64 compressTime = (AZStd::chrono::system_clock::now() - startTime).count(); ASSERT_TRUE(compressStatus == AzNetworking::CompressorError::Ok); EXPECT_TRUE(compressedSize < maxCompressedSize); @@ -61,7 +61,7 @@ TEST_F(MultiplayerCompressionTest, MultiplayerCompression_CompressTest) //Run and test decompress startTime = AZStd::chrono::system_clock::now(); AzNetworking::CompressorError decompressStatus = lz4Compressor.Decompress(pCompressedBuffer, compressedSize, pDecompressedBuffer, buffer.GetSize(), consumedSize, uncompressedSize); - const AZ::u64 decompressTime = (AZStd::chrono::system_clock::now() - startTime).count(); + [[maybe_unused]] const AZ::u64 decompressTime = (AZStd::chrono::system_clock::now() - startTime).count(); ASSERT_TRUE(decompressStatus == AzNetworking::CompressorError::Ok); EXPECT_TRUE(uncompressedSize = buffer.GetSize()); diff --git a/Gems/PhysX/Code/Source/Debug/PhysXDebug.h b/Gems/PhysX/Code/Source/Debug/PhysXDebug.h index 8286981032..58d6f7e03e 100644 --- a/Gems/PhysX/Code/Source/Debug/PhysXDebug.h +++ b/Gems/PhysX/Code/Source/Debug/PhysXDebug.h @@ -43,7 +43,7 @@ namespace PhysX void DisconnectFromPvd() override; private: - physx::PxPvdTransport* m_pvdTransport = nullptr; + [[maybe_unused]] physx::PxPvdTransport* m_pvdTransport = nullptr; physx::PxPvd* m_pvd = nullptr; DebugConfiguration m_config; diff --git a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp index a2866b5a09..3b5c98ba2d 100644 --- a/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp +++ b/Gems/PhysX/Code/Source/Scene/PhysXScene.cpp @@ -182,7 +182,7 @@ namespace PhysX SimulatedBodyType* newBody = aznew SimulatedBodyType(*configuration); if (!AZStd::holds_alternative(configuration->m_colliderAndShapeData)) { - const bool shapeAdded = AddShape(newBody, configuration->m_colliderAndShapeData); + [[maybe_unused]] const bool shapeAdded = AddShape(newBody, configuration->m_colliderAndShapeData); AZ_Warning("PhysXScene", shapeAdded, "No Collider or Shape information found when creating Rigid body [%s]", configuration->m_debugName.c_str()); } crc = AZ::Crc32(newBody, sizeof(*newBody)); @@ -194,7 +194,7 @@ namespace PhysX RigidBody* newBody = aznew RigidBody(*configuration); if (!AZStd::holds_alternative(configuration->m_colliderAndShapeData)) { - const bool shapeAdded = AddShape(newBody, configuration->m_colliderAndShapeData); + [[maybe_unused]] const bool shapeAdded = AddShape(newBody, configuration->m_colliderAndShapeData); AZ_Warning("PhysXScene", shapeAdded, "No Collider or Shape information found when creating Rigid body [%s]", configuration->m_debugName.c_str()); } const AzPhysics::MassComputeFlags& flags = configuration->GetMassComputeFlags(); diff --git a/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.cpp b/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.cpp index 7b3b99c641..0f169d1265 100644 --- a/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.cpp +++ b/Gems/SceneLoggingExample/Code/Processors/ExportTrackingProcessor.cpp @@ -171,7 +171,7 @@ namespace SceneLoggingExample { // While it's generally preferable to stick with either index- or iterator-based traversal, there may be times where switching between one // or the other becomes necessary. The SceneGraph provides utility functions to convert between the two approaches. - AZ::SceneAPI::Containers::SceneGraph::NodeIndex itNodeIndex = graph.ConvertToNodeIndex(it.GetHierarchyIterator()); + [[maybe_unused]] AZ::SceneAPI::Containers::SceneGraph::NodeIndex itNodeIndex = graph.ConvertToNodeIndex(it.GetHierarchyIterator()); // Nodes in the SceneGraph can be marked as endpoints. To the graph, this means that these nodes are not allowed to have children. // While not a true one-to-one mapping, endpoints often act as attributes to a node. For example, a transform can be marked as an endpoint. diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp index 059b560cb0..2ae37b1253 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.cpp @@ -2885,7 +2885,7 @@ namespace ScriptCanvas if (node == nullptr) { AZStd::string assetName = m_graphRequestBus->GetAssetName(); - AZ::EntityId assetNodeId = m_graphRequestBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); + [[maybe_unused]] AZ::EntityId assetNodeId = m_graphRequestBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); AZ_Warning("Script Canvas", false, "Unable to find node with id (id: %s) in the graph '%s'. Most likely the node was serialized with a type that is no longer reflected", assetNodeId.ToString().data(), assetName.data()); @@ -2900,7 +2900,7 @@ namespace ScriptCanvas if (!endpointSlot) { AZStd::string assetName = m_graphRequestBus->GetAssetName(); - AZ::EntityId assetNodeId = m_graphRequestBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); + [[maybe_unused]] AZ::EntityId assetNodeId = m_graphRequestBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); AZ_Warning("Script Canvas", false, "Endpoint was missing slot. id (id: %s) in the graph '%s'.", assetNodeId.ToString().data(), assetName.data()); @@ -2934,7 +2934,7 @@ namespace ScriptCanvas if (node == nullptr) { AZStd::string assetName = m_graphRequestBus->GetAssetName(); - AZ::EntityId assetNodeId = m_graphRequestBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); + [[maybe_unused]] AZ::EntityId assetNodeId = m_graphRequestBus->FindAssetNodeIdByRuntimeNodeId(endpoint.GetNodeId()); AZ_Error("Script Canvas", false, "Unable to find node with id (id: %s) in the graph '%s'. Most likely the node was serialized with a type that is no longer reflected", assetNodeId.ToString().data(), assetName.data()); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp index cc2058f249..d7a4c360ac 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp @@ -549,7 +549,7 @@ namespace ScriptCanvas { using namespace ExecutionInterpretedAPICpp; // Lua: usernodeable, keyCount - const int argsCount = lua_gettop(lua); + [[maybe_unused]] const int argsCount = lua_gettop(lua); AZ_Assert(argsCount == 2, "InitializeNodeableOutKeys: Error in compiled Lua file, not enough arguments"); AZ_Assert(lua_isuserdata(lua, 1), "InitializeNodeableOutKeys: Error in compiled lua file, 1st argument to SetExecutionOut is not userdata (Nodeable)"); Nodeable* nodeable = AZ::ScriptValue::StackRead(lua, 1); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NodeableOut/NodeableOutNative.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NodeableOut/NodeableOutNative.h index dc428cb480..ab6859db1e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NodeableOut/NodeableOutNative.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/NodeableOut/NodeableOutNative.h @@ -23,7 +23,7 @@ namespace ScriptCanvas { auto nodeCallWrapper = [callable = AZStd::forward(callable)](AZ::BehaviorValueParameter* result, AZ::BehaviorValueParameter* arguments, int numArguments) mutable { - constexpr size_t numFunctorArguments = sizeof...(Args); + [[maybe_unused]] constexpr size_t numFunctorArguments = sizeof...(Args); (void)numArguments; AZ_Assert(numArguments == numFunctorArguments, "number of arguments doesn't match number of parameters"); AZ_Assert(result, "no null result allowed"); @@ -39,7 +39,7 @@ namespace ScriptCanvas { auto nodeCallWrapper = [callable = AZStd::forward(callable)](AZ::BehaviorValueParameter*, AZ::BehaviorValueParameter* arguments, int numArguments) mutable { - constexpr size_t numFunctorArguments = sizeof...(Args); + [[maybe_unused]] constexpr size_t numFunctorArguments = sizeof...(Args); (void)numArguments; AZ_Assert(numArguments == numFunctorArguments, "number of arguments doesn't match number of parameters"); AZStd::invoke(callable, *arguments[IndexSequence].GetAsUnsafe()...); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/MethodUtility.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/MethodUtility.cpp index e2cfa8d9ad..0ddd161847 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/MethodUtility.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/MethodUtility.cpp @@ -45,7 +45,7 @@ namespace ScriptCanvas int tupleGetFuncIndex = -1; if (tupleGetFuncAttrReader.Read(tupleGetFuncIndex)) { - auto insertIter = tupleGetMethodMap.emplace(tupleGetFuncIndex, behaviorMethod); + [[maybe_unused]] auto insertIter = tupleGetMethodMap.emplace(tupleGetFuncIndex, behaviorMethod); AZ_Error("Script Canvas", insertIter.second, "Multiple methods with the same TupleGetFunctionIndex attribute" "has been registered for the class name: %s with typeid: %s", behaviorClass->m_name.data(), behaviorClass->m_typeId.ToString().data()) diff --git a/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp b/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp index 26af95fa8e..ba02fa8a62 100644 --- a/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp +++ b/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp @@ -260,7 +260,7 @@ namespace ScriptCanvas } LockType lock(m_ownedObjectsByAddressMutex); - auto emplaceResult = m_ownedObjectsByAddress.emplace(object, behaviorContextObject); + [[maybe_unused]] auto emplaceResult = m_ownedObjectsByAddress.emplace(object, behaviorContextObject); AZ_Assert(emplaceResult.second, "Adding second owned reference to memory"); } From dd0a9ebe10de6fa2d5d153b6da0e01fa799554d3 Mon Sep 17 00:00:00 2001 From: mcphedar Date: Mon, 30 Aug 2021 15:14:58 -0500 Subject: [PATCH 021/355] Adding a template for nightly build failures Signed-off-by: mcphedar --- .../nightly_build_failure_bug_template.md | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/nightly_build_failure_bug_template.md diff --git a/.github/ISSUE_TEMPLATE/nightly_build_failure_bug_template.md b/.github/ISSUE_TEMPLATE/nightly_build_failure_bug_template.md new file mode 100644 index 0000000000..40f6f0dbbc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/nightly_build_failure_bug_template.md @@ -0,0 +1,36 @@ +--- +name: Nightly Build Error bug report +about: Create a report when the nightly build process fails +title: 'Nightly Build Failure' +labels: 'needs-triage,needs-sig,kind/bug,kind/nightlybuildfailure' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**Failure type** +Build | Asset Processing | Test Tools | Infrastructure | Test + +**To Reproduce Test Failures** + - Paste the command line that reproduces the test failure + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Logs** +Attach the Jenkins logs that are relevant to the failure + +**Desktop/Device (please complete the following information):** + - Device: [e.g. PC, Mac, iPhone, Samsung] + - OS: [e.g. Windows, macOS, iOS, Android] + - Version [e.g. 10, Bug Sur, Oreo] + - CPU [e.g. Intel I9-9900k , Ryzen 5900x, ] + - GPU [AMD 6800 XT, NVidia RTX 3090] + - Memory [e.g. 16GB] + +**Additional context** +Add any other context about the problem here. \ No newline at end of file From 96a5f06ca3d627c2b9c574c72c4e464a415a91bc Mon Sep 17 00:00:00 2001 From: Artur K <96597+nemerle@users.noreply.github.com> Date: Mon, 30 Aug 2021 22:40:02 +0200 Subject: [PATCH 022/355] Legacy cleanup, part 2 (#3659) * Legacy cleanup, part 2 There are still things that can be removed, those will be likely done in part three: `The Return of the Cleanup` :) Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Fix windows build Somehow there were some unfixed errors from enabled warnings? I'm unsure if I've pulled repo in unstable state, or those were somehow missed. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> --- Code/Editor/Controls/ImageHistogramCtrl.cpp | 6 +- Code/Editor/Controls/SplineCtrl.cpp | 4 +- Code/Editor/EditorViewportWidget.cpp | 3 - Code/Editor/Export/ExportManager.cpp | 7 +- Code/Editor/Geometry/TriMesh.cpp | 125 - Code/Editor/Geometry/TriMesh.h | 2 - Code/Editor/Include/Command.h | 27 +- Code/Editor/Include/IFileUtil.h | 3 +- Code/Editor/Include/IObjectManager.h | 2 +- Code/Editor/Lib/Tests/IEditorMock.h | 7 +- Code/Editor/Objects/BaseObject.cpp | 46 - Code/Editor/Objects/BaseObject.h | 4 - Code/Editor/Objects/DisplayContext.h | 1 + Code/Editor/Objects/ObjectManager.cpp | 20 +- Code/Editor/Objects/ObjectManager.h | 2 +- Code/Editor/ToolsConfigPage.cpp | 4 +- Code/Editor/Util/DynamicArray2D.cpp | 5 - Code/Editor/Util/DynamicArray2D.h | 2 - Code/Editor/Util/GdiUtil.cpp | 2 +- Code/Editor/Util/ImageHistogram.cpp | 2 +- Code/Editor/Viewport.cpp | 2 +- Code/Editor/ViewportTitleDlg.cpp | 7 +- Code/LauncherUnified/Launcher.h | 6 +- Code/Legacy/CryCommon/Common_TypeInfo.cpp | 142 +- Code/Legacy/CryCommon/CryArray.h | 1322 ----------- Code/Legacy/CryCommon/CryCommon.cpp | 53 - Code/Legacy/CryCommon/CryCustomTypes.h | 1204 ---------- Code/Legacy/CryCommon/CryHalf.inl | 2 - Code/Legacy/CryCommon/CryHalf_info.h | 28 - Code/Legacy/CryCommon/CryHeaders.h | 1506 ------------ Code/Legacy/CryCommon/CryHeaders_info.cpp | 486 ---- Code/Legacy/CryCommon/CrySizer.h | 23 - Code/Legacy/CryCommon/CryTypeInfo.cpp | 1472 ------------ Code/Legacy/CryCommon/CryTypeInfo.h | 219 -- Code/Legacy/CryCommon/Cry_Camera.h | 112 +- Code/Legacy/CryCommon/Cry_Color.h | 4 +- Code/Legacy/CryCommon/Cry_Geo.h | 5 - Code/Legacy/CryCommon/Cry_GeoOverlap.h | 1982 ---------------- Code/Legacy/CryCommon/Cry_Math.h | 2 +- Code/Legacy/CryCommon/Cry_Matrix33.h | 2 - Code/Legacy/CryCommon/Cry_Matrix34.h | 2 - Code/Legacy/CryCommon/Cry_Matrix44.h | 2 - Code/Legacy/CryCommon/Cry_Quat.h | 11 - Code/Legacy/CryCommon/Cry_Vector2.h | 2 - Code/Legacy/CryCommon/Cry_Vector3.h | 6 - Code/Legacy/CryCommon/Cry_Vector4.h | 2 - Code/Legacy/CryCommon/HMDBus.h | 46 +- Code/Legacy/CryCommon/IConsole.h | 38 +- Code/Legacy/CryCommon/IEntityRenderState.h | 555 +---- .../CryCommon/IEntityRenderState_info.cpp | 41 - Code/Legacy/CryCommon/IFont.h | 1 + Code/Legacy/CryCommon/IIndexedMesh.h | 2064 +---------------- Code/Legacy/CryCommon/IIndexedMesh_info.cpp | 46 - Code/Legacy/CryCommon/ILocalizationManager.h | 4 +- Code/Legacy/CryCommon/IMaterial.h | 395 +--- Code/Legacy/CryCommon/IMovieSystem.h | 1 - Code/Legacy/CryCommon/IPathfinder.h | 29 +- Code/Legacy/CryCommon/IPhysics.h | 38 - Code/Legacy/CryCommon/IPostEffectGroup.h | 49 - Code/Legacy/CryCommon/IRenderMesh.h | 282 --- Code/Legacy/CryCommon/ISerialize.h | 7 - Code/Legacy/CryCommon/IShader.h | 1204 +--------- Code/Legacy/CryCommon/ISplines.h | 1 + Code/Legacy/CryCommon/IStatObj.h | 190 -- Code/Legacy/CryCommon/IStereoRenderer.h | 105 - Code/Legacy/CryCommon/ISystem.h | 54 - Code/Legacy/CryCommon/ITexture.h | 309 +-- Code/Legacy/CryCommon/IViewSystem.h | 8 - .../LyShine/Animation/IUiAnimation.h | 1 - Code/Legacy/CryCommon/LyShine/UiBase.h | 4 +- Code/Legacy/CryCommon/MemoryAccess.h | 567 ----- Code/Legacy/CryCommon/Mocks/ICVarMock.h | 3 - Code/Legacy/CryCommon/Mocks/IConsoleMock.h | 7 - Code/Legacy/CryCommon/Mocks/ITextureMock.h | 148 -- Code/Legacy/CryCommon/Options.h | 90 - Code/Legacy/CryCommon/StereoRendererBus.h | 43 - Code/Legacy/CryCommon/StlUtils.h | 263 +-- Code/Legacy/CryCommon/Tarray.h | 56 - Code/Legacy/CryCommon/TimeValue.h | 2 - Code/Legacy/CryCommon/TimeValue_info.h | 21 - Code/Legacy/CryCommon/TypeInfo_decl.h | 120 - Code/Legacy/CryCommon/TypeInfo_impl.h | 213 -- Code/Legacy/CryCommon/VectorSet.h | 492 ---- Code/Legacy/CryCommon/Vertex.h | 782 +------ Code/Legacy/CryCommon/VertexFormats.h | 841 +------ Code/Legacy/CryCommon/crycommon_files.cmake | 26 - Code/Legacy/CryCommon/physinterface.h | 24 - Code/Legacy/CryCommon/platform.h | 6 - Code/Legacy/CryCommon/primitives.h | 294 --- Code/Legacy/CryCommon/smartptr.h | 2 - Code/Legacy/CryCommon/stridedptr.h | 114 - .../Legacy/CrySystem/LocalizedStringManager.h | 8 +- Code/Legacy/CrySystem/SimpleStringPool.h | 19 +- Code/Legacy/CrySystem/System.cpp | 4 +- Code/Legacy/CrySystem/ViewSystem/View.cpp | 15 +- Code/Legacy/CrySystem/ViewSystem/View.h | 2 +- .../CrySystem/ViewSystem/ViewSystem.cpp | 20 +- Code/Legacy/CrySystem/ViewSystem/ViewSystem.h | 1 - Code/Legacy/CrySystem/XConsole.cpp | 227 +- Code/Legacy/CrySystem/XConsole.h | 11 - Code/Legacy/CrySystem/XConsoleVariable.cpp | 34 - Code/Legacy/CrySystem/XConsoleVariable.h | 13 +- .../Code/Source/Ai/NavigationComponent.cpp | 11 +- .../Editor/Animation/UiAnimUndoManager.cpp | 3 +- Gems/LyShine/Code/Editor/EditorCommon.h | 1 - Gems/LyShine/Code/Editor/EditorWindow.cpp | 4 +- Gems/LyShine/Code/Editor/HierarchyHelpers.cpp | 14 +- .../Code/Editor/PropertiesContainer.cpp | 4 +- Gems/LyShine/Code/Editor/SerializeHelpers.cpp | 9 +- .../LyShine/Code/Source/UiCanvasComponent.cpp | 6 +- .../Code/Source/UiElementComponent.cpp | 10 +- .../Tests/UiDynamicScrollBoxComponentTest.cpp | 4 +- .../Code/Source/Cinematics/AnimPostFXNode.cpp | 3 +- .../Code/Source/Cinematics/MaterialNode.h | 4 +- Gems/Maestro/Code/Source/Cinematics/Movie.h | 3 + .../Code/Source/MaestroSystemComponent.h | 1 + 116 files changed, 189 insertions(+), 18706 deletions(-) delete mode 100644 Code/Legacy/CryCommon/CryArray.h delete mode 100644 Code/Legacy/CryCommon/CryCommon.cpp delete mode 100644 Code/Legacy/CryCommon/CryCustomTypes.h delete mode 100644 Code/Legacy/CryCommon/CryHalf_info.h delete mode 100644 Code/Legacy/CryCommon/CryHeaders.h delete mode 100644 Code/Legacy/CryCommon/CryHeaders_info.cpp delete mode 100644 Code/Legacy/CryCommon/CryTypeInfo.cpp delete mode 100644 Code/Legacy/CryCommon/CryTypeInfo.h delete mode 100644 Code/Legacy/CryCommon/Cry_GeoOverlap.h delete mode 100644 Code/Legacy/CryCommon/IEntityRenderState_info.cpp delete mode 100644 Code/Legacy/CryCommon/IIndexedMesh_info.cpp delete mode 100644 Code/Legacy/CryCommon/IPhysics.h delete mode 100644 Code/Legacy/CryCommon/IPostEffectGroup.h delete mode 100644 Code/Legacy/CryCommon/IRenderMesh.h delete mode 100644 Code/Legacy/CryCommon/IStereoRenderer.h delete mode 100644 Code/Legacy/CryCommon/MemoryAccess.h delete mode 100644 Code/Legacy/CryCommon/Options.h delete mode 100644 Code/Legacy/CryCommon/StereoRendererBus.h delete mode 100644 Code/Legacy/CryCommon/Tarray.h delete mode 100644 Code/Legacy/CryCommon/TimeValue_info.h delete mode 100644 Code/Legacy/CryCommon/TypeInfo_decl.h delete mode 100644 Code/Legacy/CryCommon/TypeInfo_impl.h delete mode 100644 Code/Legacy/CryCommon/VectorSet.h delete mode 100644 Code/Legacy/CryCommon/physinterface.h delete mode 100644 Code/Legacy/CryCommon/primitives.h delete mode 100644 Code/Legacy/CryCommon/stridedptr.h diff --git a/Code/Editor/Controls/ImageHistogramCtrl.cpp b/Code/Editor/Controls/ImageHistogramCtrl.cpp index 48bc7a70d2..bdb81e3655 100644 --- a/Code/Editor/Controls/ImageHistogramCtrl.cpp +++ b/Code/Editor/Controls/ImageHistogramCtrl.cpp @@ -188,7 +188,7 @@ void CImageHistogramDisplay::paintEvent([[maybe_unused]] QPaintEvent* event) float scale = 0; i = static_cast(((float)x / graphWidth) * (kNumColorLevels - 1)); - i = CLAMP(i, 0, kNumColorLevels - 1); + i = AZStd::clamp(i, 0, kNumColorLevels - 1); switch (m_drawMode) { @@ -253,7 +253,7 @@ void CImageHistogramDisplay::paintEvent([[maybe_unused]] QPaintEvent* event) for (size_t x = 0, xCount = abs(rcGraph.width()); x < xCount; ++x) { i = static_cast(((float)x / graphWidth) * (kNumColorLevels - 1)); - i = CLAMP(i, 0, kNumColorLevels - 1); + i = AZStd::clamp(i, 0, kNumColorLevels - 1); crtX = static_cast(rcGraph.left() + x + 1); scaleR = scaleG = scaleB = scaleA = 0; @@ -345,7 +345,7 @@ void CImageHistogramDisplay::paintEvent([[maybe_unused]] QPaintEvent* event) { pos = (float)x / graphWidth; i = static_cast((float)((int)(pos * kNumColorLevels) % aThirdOfNumColorLevels) / aThirdOfNumColorLevels * kNumColorLevels); - i = CLAMP(i, 0, kNumColorLevels - 1); + i = AZStd::clamp(i, 0, kNumColorLevels - 1); scale = 0; // R diff --git a/Code/Editor/Controls/SplineCtrl.cpp b/Code/Editor/Controls/SplineCtrl.cpp index 8ccf103c25..73264274b7 100644 --- a/Code/Editor/Controls/SplineCtrl.cpp +++ b/Code/Editor/Controls/SplineCtrl.cpp @@ -101,7 +101,7 @@ void CSplineCtrl::PointToTimeValue(const QPoint& point, float& time, float& valu { time = XOfsToTime(point.x()); float t = float(m_rcSpline.bottom() - point.y()) / m_rcSpline.height(); - value = LERP(m_fMinValue, m_fMaxValue, t); + value = AZ::Lerp(m_fMinValue, m_fMaxValue, t); } ////////////////////////////////////////////////////////////////////////// @@ -109,7 +109,7 @@ float CSplineCtrl::XOfsToTime(int x) { // m_fMinTime to m_fMaxTime time range. float t = float(x - m_rcSpline.left()) / m_rcSpline.width(); - return LERP(m_fMinTime, m_fMaxTime, t); + return AZ::Lerp(m_fMinTime, m_fMaxTime, t); } ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 796e16dd53..5294ebbc7e 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -54,7 +54,6 @@ // CryCommon #include #include -#include // AzFramework #include @@ -70,7 +69,6 @@ #include "Include/IDisplayViewport.h" #include "Objects/ObjectManager.h" #include "ProcessInfo.h" -#include "IPostEffectGroup.h" #include "EditorPreferencesPageGeneral.h" #include "ViewportManipulatorController.h" #include "EditorViewportSettings.h" @@ -100,7 +98,6 @@ #include #include -#include #include AZ_CVAR( diff --git a/Code/Editor/Export/ExportManager.cpp b/Code/Editor/Export/ExportManager.cpp index 220c341f5c..5527aa6ce6 100644 --- a/Code/Editor/Export/ExportManager.cpp +++ b/Code/Editor/Export/ExportManager.cpp @@ -356,10 +356,9 @@ void CExportManager::AddMesh(Export::CObject* pObj, const IIndexedMesh* pIndMesh for (int v = 0; v < meshDesc.m_nCoorCount; ++v) { - Export::UV tc; - meshDesc.m_pTexCoord[v].ExportTo(tc.u, tc.v); - tc.v = 1.0f - tc.v; - pObj->m_texCoords.push_back(tc); + Vec2 uv = meshDesc.m_pTexCoord[v].GetUV(); + uv.y = 1.0f - uv.y; + pObj->m_texCoords.push_back({uv.x,uv.y}); } if (pIndMesh->GetSubSetCount() && !(pIndMesh->GetSubSetCount() == 1 && pIndMesh->GetSubSet(0).nNumIndices == 0)) diff --git a/Code/Editor/Geometry/TriMesh.cpp b/Code/Editor/Geometry/TriMesh.cpp index d56aa038b5..efc201095d 100644 --- a/Code/Editor/Geometry/TriMesh.cpp +++ b/Code/Editor/Geometry/TriMesh.cpp @@ -161,61 +161,6 @@ void* CTriMesh::ReAllocElements(void* old_ptr, int new_elem_num, int size_of_ele return realloc(old_ptr, new_elem_num * size_of_element); } -////////////////////////////////////////////////////////////////////////// -// Unshare all vertices and split on 3 arrays, positions/texcoords. -////////////////////////////////////////////////////////////////////////// -void CTriMesh::SetFromMesh(CMesh& mesh) -{ - bbox = mesh.m_bbox; - - int maxVerts = mesh.GetIndexCount(); - - SetVertexCount(maxVerts); - SetUVCount(maxVerts); - if (mesh.m_pColor0) - { - SetColorsCount(maxVerts); - } - - SetFacesCount(mesh.GetIndexCount()); - - int numv = 0; - int numface = 0; - for (int nSubset = 0; nSubset < mesh.GetSubSetCount(); nSubset++) - { - SMeshSubset& subset = mesh.m_subsets[nSubset]; - for (int i = subset.nFirstIndexId; i < subset.nFirstIndexId + subset.nNumIndices; i += 3) - { - CTriFace& face = pFaces[numface++]; - for (int j = 0; j < 3; j++) - { - int idx = mesh.m_pIndices[i + j]; - pVertices[numv].pos = mesh.m_pPositions ? mesh.m_pPositions[idx] : mesh.m_pPositionsF16[idx].ToVec3(); - pWeights[numv] = 0.0f; - pUV[numv] = mesh.m_pTexCoord[idx]; - if (mesh.m_pColor0) - { - pColors[numv] = mesh.m_pColor0[idx]; - } - - face.v [j] = numv; - face.uv[j] = numv; - face.n [j] = mesh.m_pNorms[idx].GetN(); - face.MatID = static_cast(subset.nMatID); - face.flags = 0; - - numv++; - } - } - } - SetFacesCount(numface); - SharePositions(); - ShareUV(); - UpdateEdges(); - - CalcFaceNormals(); -} - ///////////////////////////////////////////////////////////////////////////////////// inline int FindVertexInHash(const Vec3& vPosToFind, const CTriVertex* pVectors, std::vector& hash, float fEpsilon) { @@ -360,76 +305,6 @@ void CTriMesh::CalcFaceNormals() #define TEX_EPS 0.001f #define VER_EPS 0.001f -////////////////////////////////////////////////////////////////////////// -void CTriMesh::UpdateIndexedMesh(IIndexedMesh* pIndexedMesh) const -{ - { - const int maxVerts = nFacesCount * 3; - - pIndexedMesh->SetVertexCount(maxVerts); - pIndexedMesh->SetTexCoordCount(maxVerts); - if (pColors) - { - pIndexedMesh->SetColorCount(maxVerts); - } - pIndexedMesh->SetIndexCount(0); - pIndexedMesh->SetFaceCount(nFacesCount); - } - - ////////////////////////////////////////////////////////////////////////// - // To find really used materials - std::vector usedMaterialIds; - uint16 MatIdToSubset[MAX_SUB_MATERIALS]; - uint16 nLastSubsetId = 0; - memset(MatIdToSubset, 0, sizeof(MatIdToSubset)); - ////////////////////////////////////////////////////////////////////////// - - CMesh& mesh = *pIndexedMesh->GetMesh(); - AABB bb; - bb.Reset(); - for (int i = 0; i < nFacesCount; ++i) - { - const CTriFace& face = pFaces[i]; - SMeshFace& meshFace = mesh.m_pFaces[i]; - - // Remap new used material ID to index of chunk id. - if (!MatIdToSubset[face.MatID]) - { - MatIdToSubset[face.MatID] = 1 + nLastSubsetId++; - usedMaterialIds.push_back(face.MatID); // Order of material ids in usedMaterialIds correspond to the indices of chunks. - } - meshFace.nSubset = static_cast(MatIdToSubset[face.MatID] - 1); - - for (int j = 0; j < 3; ++j) - { - const int dstVIdx = i * 3 + j; - - mesh.m_pPositions[dstVIdx] = pVertices[face.v[j]].pos; - mesh.m_pNorms[dstVIdx] = SMeshNormal(face.n[j]); - mesh.m_pTexCoord[dstVIdx] = pUV[face.uv[j]]; - if (pColors) - { - mesh.m_pColor0[dstVIdx] = pColors[face.v[j]]; - } - - meshFace.v[j] = dstVIdx; - - bb.Add(mesh.m_pPositions[dstVIdx]); - } - } - - pIndexedMesh->SetBBox(bb); - - pIndexedMesh->SetSubSetCount(static_cast(usedMaterialIds.size())); - for (int i = 0; i < usedMaterialIds.size(); i++) - { - pIndexedMesh->SetSubsetMaterialId(i, usedMaterialIds[i]); - } - - pIndexedMesh->Optimize(); -} - - ////////////////////////////////////////////////////////////////////////// void CTriMesh::CopyStream(CTriMesh& fromMesh, int stream) { diff --git a/Code/Editor/Geometry/TriMesh.h b/Code/Editor/Geometry/TriMesh.h index 9bb73f945d..a6c58b8f9d 100644 --- a/Code/Editor/Geometry/TriMesh.h +++ b/Code/Editor/Geometry/TriMesh.h @@ -198,8 +198,6 @@ public: void GetStreamInfo(int stream, void*& pStream, int& nElementSize) const; int GetStreamSize(int stream) const { return m_streamSize[stream]; }; - void SetFromMesh(CMesh& mesh); - void UpdateIndexedMesh(IIndexedMesh* pIndexedMesh) const; // Calculate per face normal. void CalcFaceNormals(); diff --git a/Code/Editor/Include/Command.h b/Code/Editor/Include/Command.h index e4fea5a3e7..dfdcec78ef 100644 --- a/Code/Editor/Include/Command.h +++ b/Code/Editor/Include/Command.h @@ -8,14 +8,12 @@ // Description : Classes to deal with commands - - -#ifndef CRYINCLUDE_EDITOR_INCLUDE_COMMAND_H -#define CRYINCLUDE_EDITOR_INCLUDE_COMMAND_H #pragma once #include - +#include +#include +#include #include "Util/EditorUtils.h" inline AZStd::string ToString(const QString& s) @@ -23,8 +21,20 @@ inline AZStd::string ToString(const QString& s) return s.toUtf8().data(); } + class CCommand { + static inline bool FromString(int32 &val, const char* s) { + if(!s) + { + return false; + } + val = (int)strtol(s, nullptr, 10); + if(val==0 && errno!=0) { + return false; + } + return true; + } public: CCommand( const AZStd::string& module, @@ -77,7 +87,7 @@ public: return false; } } - int GetArgCount() const + size_t GetArgCount() const { return m_args.size(); } const AZStd::string& GetArg(int i) const { @@ -85,7 +95,7 @@ public: return m_args[i]; } private: - DynArray m_args; + AZStd::vector m_args; unsigned char m_stringFlags; // This is needed to quote string parameters when logging a command. }; @@ -115,7 +125,7 @@ protected: static inline AZStd::string ToString_(const char* val) { return val; } template - static bool FromString_(T& t, const char* s) { return ::FromString(t, s); } + static bool FromString_(T& t, const char* s) { return FromString(t, s); } static inline bool FromString_(const char*& val, const char* s) { return (val = s) != 0; } @@ -789,4 +799,3 @@ QString CCommand6::Execute(const CCommand::CArgs& args) } return ""; } -#endif // CRYINCLUDE_EDITOR_INCLUDE_COMMAND_H diff --git a/Code/Editor/Include/IFileUtil.h b/Code/Editor/Include/IFileUtil.h index 700e04f6d3..e179f892d9 100644 --- a/Code/Editor/Include/IFileUtil.h +++ b/Code/Editor/Include/IFileUtil.h @@ -9,6 +9,7 @@ #pragma once #include "../Include/SandboxAPI.h" +#include #include class QWidget; @@ -103,7 +104,7 @@ struct IFileUtil } }; - typedef DynArray FileArray; + using FileArray = AZStd::vector; typedef bool (* ScanDirectoryUpdateCallBack)(const QString& msg); diff --git a/Code/Editor/Include/IObjectManager.h b/Code/Editor/Include/IObjectManager.h index 360cc8fe34..fb99a50bb0 100644 --- a/Code/Editor/Include/IObjectManager.h +++ b/Code/Editor/Include/IObjectManager.h @@ -89,7 +89,7 @@ public: //! Get array of objects, managed by manager (not contain sub objects of groups). //! @param layer if 0 get objects for all layers, or layer to get objects from. virtual void GetObjects(CBaseObjectsArray& objects) const = 0; - virtual void GetObjects(DynArray& objects) const = 0; + //virtual void GetObjects(DynArray& objects) const = 0; //! Get array of objects that pass the filter. //! @param filter The filter functor, return true if you want to get the certain obj, return false if want to skip it. diff --git a/Code/Editor/Lib/Tests/IEditorMock.h b/Code/Editor/Lib/Tests/IEditorMock.h index 242bf4d25c..30f1d23576 100644 --- a/Code/Editor/Lib/Tests/IEditorMock.h +++ b/Code/Editor/Lib/Tests/IEditorMock.h @@ -9,7 +9,6 @@ #include #include -#include #include class CEditorMock @@ -85,8 +84,8 @@ public: MOCK_METHOD0(GetObjectManager, struct IObjectManager* ()); MOCK_METHOD0(GetSettingsManager, CSettingsManager* ()); MOCK_METHOD1(GetDBItemManager, IDataBaseManager* (EDataBaseItemType)); - MOCK_METHOD0(GetMaterialManagerLibrary, IBaseLibraryManager* ()); - MOCK_METHOD0(GetIEditorMaterialManager, IEditorMaterialManager* ()); + MOCK_METHOD0(GetMaterialManagerLibrary, IBaseLibraryManager* ()); + MOCK_METHOD0(GetIEditorMaterialManager, IEditorMaterialManager* ()); MOCK_METHOD0(GetIconManager, IIconManager* ()); MOCK_METHOD0(GetMusicManager, CMusicManager* ()); MOCK_METHOD2(GetTerrainElevation, float(float , float )); @@ -183,7 +182,7 @@ public: MOCK_METHOD0(GetEnv, SSystemGlobalEnvironment* ()); MOCK_METHOD0(GetImageUtil, IImageUtil* ()); MOCK_METHOD0(GetEditorSettings, SEditorSettings* ()); - MOCK_METHOD0(GetLogFile, ILogFile* ()); + MOCK_METHOD0(GetLogFile, ILogFile* ()); MOCK_METHOD0(UnloadPlugins, void()); MOCK_METHOD0(LoadPlugins, void()); MOCK_METHOD1(GetSearchPath, QString(EEditorPathName)); diff --git a/Code/Editor/Objects/BaseObject.cpp b/Code/Editor/Objects/BaseObject.cpp index c653830e70..0d5f982bd4 100644 --- a/Code/Editor/Objects/BaseObject.cpp +++ b/Code/Editor/Objects/BaseObject.cpp @@ -2057,53 +2057,7 @@ bool CBaseObject::IsChildOf(CBaseObject* node) } ////////////////////////////////////////////////////////////////////////// -void CBaseObject::GetAllChildren(TBaseObjects& outAllChildren, CBaseObject* pObj) const -{ - const CBaseObject* pBaseObj = pObj ? pObj : this; - for (size_t i = 0, iChildCount(pBaseObj->GetChildCount()); i < iChildCount; ++i) - { - CBaseObject* pChild = pBaseObj->GetChild(i); - if (pChild == nullptr) - { - continue; - } - outAllChildren.push_back(pChild); - GetAllChildren(outAllChildren, pChild); - } -} - -void CBaseObject::GetAllChildren(DynArray< _smart_ptr >& outAllChildren, CBaseObject* pObj) const -{ - const CBaseObject* pBaseObj = pObj ? pObj : this; - - for (size_t i = 0, iChildCount(pBaseObj->GetChildCount()); i < iChildCount; ++i) - { - CBaseObject* pChild = pBaseObj->GetChild(i); - if (pChild == nullptr) - { - continue; - } - outAllChildren.push_back(pChild); - GetAllChildren(outAllChildren, pChild); - } -} - -void CBaseObject::GetAllChildren(CSelectionGroup& outAllChildren, CBaseObject* pObj) const -{ - const CBaseObject* pBaseObj = pObj ? pObj : this; - - for (size_t i = 0, iChildCount(pBaseObj->GetChildCount()); i < iChildCount; ++i) - { - CBaseObject* pChild = pBaseObj->GetChild(i); - if (pChild == nullptr) - { - continue; - } - outAllChildren.AddObject(pChild); - GetAllChildren(outAllChildren, pChild); - } -} ////////////////////////////////////////////////////////////////////////// void CBaseObject::CloneChildren(CBaseObject* pFromObject) diff --git a/Code/Editor/Objects/BaseObject.h b/Code/Editor/Objects/BaseObject.h index ece0bf67c3..89e47ae881 100644 --- a/Code/Editor/Objects/BaseObject.h +++ b/Code/Editor/Objects/BaseObject.h @@ -408,10 +408,6 @@ public: CBaseObject* GetParent() const { return m_parent; }; //! Scans hierarchy up to determine if we child of specified node. virtual bool IsChildOf(CBaseObject* node); - //! Get all child objects - void GetAllChildren(TBaseObjects& outAllChildren, CBaseObject* pObj = nullptr) const; - void GetAllChildren(DynArray< _smart_ptr >& outAllChildren, CBaseObject* pObj = nullptr) const; - void GetAllChildren(CSelectionGroup& outAllChildren, CBaseObject* pObj = nullptr) const; //! Clone Children void CloneChildren(CBaseObject* pFromObject); //! Attach new child node. diff --git a/Code/Editor/Objects/DisplayContext.h b/Code/Editor/Objects/DisplayContext.h index a78e35cdba..0f0f0e665a 100644 --- a/Code/Editor/Objects/DisplayContext.h +++ b/Code/Editor/Objects/DisplayContext.h @@ -18,6 +18,7 @@ #include "SandboxAPI.h" #include #include +#include #include diff --git a/Code/Editor/Objects/ObjectManager.cpp b/Code/Editor/Objects/ObjectManager.cpp index f8eebb1b19..9c452ac1ad 100644 --- a/Code/Editor/Objects/ObjectManager.cpp +++ b/Code/Editor/Objects/ObjectManager.cpp @@ -759,16 +759,16 @@ void CObjectManager::GetObjects(CBaseObjectsArray& objects) const } } -void CObjectManager::GetObjects(DynArray& objects) const -{ - CBaseObjectsArray objectArray; - GetObjects(objectArray); - objects.clear(); - for (size_t i = 0, iCount(objectArray.size()); i < iCount; ++i) - { - objects.push_back(objectArray[i]); - } -} +//void CObjectManager::GetObjects(DynArray& objects) const +//{ +// CBaseObjectsArray objectArray; +// GetObjects(objectArray); +// objects.clear(); +// for (size_t i = 0, iCount(objectArray.size()); i < iCount; ++i) +// { +// objects.push_back(objectArray[i]); +// } +//} void CObjectManager::GetObjects(CBaseObjectsArray& objects, BaseObjectFilterFunctor const& filter) const { diff --git a/Code/Editor/Objects/ObjectManager.h b/Code/Editor/Objects/ObjectManager.h index aa9faab0e4..a2e0822a2b 100644 --- a/Code/Editor/Objects/ObjectManager.h +++ b/Code/Editor/Objects/ObjectManager.h @@ -122,7 +122,7 @@ public: //! Get array of objects, managed by manager (not contain sub objects of groups). //! @param layer if 0 get objects for all layers, or layer to get objects from. void GetObjects(CBaseObjectsArray& objects) const; - void GetObjects(DynArray& objects) const; + //void GetObjects(DynArray& objects) const; //! Get array of objects that pass the filter. //! @param filter The filter functor, return true if you want to get the certain obj, return false if want to skip it. diff --git a/Code/Editor/ToolsConfigPage.cpp b/Code/Editor/ToolsConfigPage.cpp index 50001dc2f0..509dca55e3 100644 --- a/Code/Editor/ToolsConfigPage.cpp +++ b/Code/Editor/ToolsConfigPage.cpp @@ -59,8 +59,8 @@ public: } const QString iconsDir = gSettings.searchPaths[EDITOR_PATH_UI_ICONS][0]; CFileUtil::ScanDirectory(iconsDir, "*.png", pngFiles); - m_iconImages.reserve(pngFiles.size()); - m_iconFiles.reserve(pngFiles.size()); + m_iconImages.reserve(static_cast(pngFiles.size())); + m_iconFiles.reserve(static_cast(pngFiles.size())); for (size_t i = 0; i < pngFiles.size(); ++i) { const QString path = Path::Make(iconsDir, pngFiles[i].filename); diff --git a/Code/Editor/Util/DynamicArray2D.cpp b/Code/Editor/Util/DynamicArray2D.cpp index 6ac3edbb6b..3f09c557de 100644 --- a/Code/Editor/Util/DynamicArray2D.cpp +++ b/Code/Editor/Util/DynamicArray2D.cpp @@ -62,11 +62,6 @@ CDynamicArray2D::~CDynamicArray2D() } -void CDynamicArray2D::GetMemoryUsage(ICrySizer* pSizer) -{ - pSizer->Add((char*)this, m_Dimension1 * m_Dimension2 * sizeof(float) + sizeof(*this)); -} - void CDynamicArray2D::ScaleImage(CDynamicArray2D* pDestination) { //////////////////////////////////////////////////////////////////////// diff --git a/Code/Editor/Util/DynamicArray2D.h b/Code/Editor/Util/DynamicArray2D.h index 80e40bfd22..20d26d2d87 100644 --- a/Code/Editor/Util/DynamicArray2D.h +++ b/Code/Editor/Util/DynamicArray2D.h @@ -24,8 +24,6 @@ public: virtual ~CDynamicArray2D(); // void ScaleImage(CDynamicArray2D* pDestination); - // - void GetMemoryUsage(ICrySizer* pSizer); float** m_Array; // diff --git a/Code/Editor/Util/GdiUtil.cpp b/Code/Editor/Util/GdiUtil.cpp index 1048b5f4dd..72e5e28605 100644 --- a/Code/Editor/Util/GdiUtil.cpp +++ b/Code/Editor/Util/GdiUtil.cpp @@ -28,7 +28,7 @@ QColor ScaleColor(const QColor& c, float aScale) const float g = static_cast(aColor.green()) * aScale; const float b = static_cast(aColor.blue()) * aScale; - return QColor(CLAMP(static_cast(r), 0, 255), CLAMP(static_cast(g), 0, 255), CLAMP(static_cast(b), 0, 255)); + return QColor(AZStd::clamp(static_cast(r), 0, 255), AZStd::clamp(static_cast(g), 0, 255), AZStd::clamp(static_cast(b), 0, 255)); } CAlphaBitmap::CAlphaBitmap() diff --git a/Code/Editor/Util/ImageHistogram.cpp b/Code/Editor/Util/ImageHistogram.cpp index acea2dc340..4cc9816065 100644 --- a/Code/Editor/Util/ImageHistogram.cpp +++ b/Code/Editor/Util/ImageHistogram.cpp @@ -105,7 +105,7 @@ void CImageHistogram::ComputeHistogram(BYTE* pImageData, UINT aWidth, UINT aHeig ++m_count[3][a]; lumIndex = (r + b + g) / 3; - lumIndex = CLAMP(lumIndex, 0, kNumColorLevels - 1); + lumIndex = AZStd::clamp(lumIndex, 0, kNumColorLevels - 1); ++m_lumCount[lumIndex]; if (m_maxCount[0] < m_count[0][r]) diff --git a/Code/Editor/Viewport.cpp b/Code/Editor/Viewport.cpp index 0ddad5c31e..92e193bddf 100644 --- a/Code/Editor/Viewport.cpp +++ b/Code/Editor/Viewport.cpp @@ -1491,7 +1491,7 @@ void QtViewport::OnRawInput([[maybe_unused]] UINT wParam, HRAWINPUT lParam) float as = 0.001f * gSettings.cameraMoveSpeed; Ang3 ypr = CCamera::CreateAnglesYPR(Matrix33(viewTM)); ypr.x += -all6DOFs[5] * as * fScaleYPR; - ypr.y = CLAMP(ypr.y + all6DOFs[3] * as * fScaleYPR, -1.5f, 1.5f); // to keep rotation in reasonable range + ypr.y = AZStd::clamp(ypr.y + all6DOFs[3] * as * fScaleYPR, -1.5f, 1.5f); // to keep rotation in reasonable range ypr.z = 0; // to have camera always upward viewTM = Matrix34(CCamera::CreateOrientationYPR(ypr), viewTM.GetTranslation()); diff --git a/Code/Editor/ViewportTitleDlg.cpp b/Code/Editor/ViewportTitleDlg.cpp index a6dee5382e..1f04f71712 100644 --- a/Code/Editor/ViewportTitleDlg.cpp +++ b/Code/Editor/ViewportTitleDlg.cpp @@ -19,9 +19,6 @@ #include -// CryCommon -#include - // Editor #include "Settings.h" #include "ViewPane.h" @@ -800,8 +797,8 @@ void CViewportTitleDlg::OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_ const int eventHeight = static_cast(lparam); const QWidget* viewport = m_pViewPane->GetViewport(); - // This should eventually be converted to an EBus to make it easy to connect to the correct viewport - // sending the event. But for now, just detect that we've gotten width/height values that match our + // This should eventually be converted to an EBus to make it easy to connect to the correct viewport + // sending the event. But for now, just detect that we've gotten width/height values that match our // associated viewport if (viewport && (eventWidth == viewport->width()) && (eventHeight == viewport->height())) { diff --git a/Code/LauncherUnified/Launcher.h b/Code/LauncherUnified/Launcher.h index 5ff6009e43..7c4c09c19f 100644 --- a/Code/LauncherUnified/Launcher.h +++ b/Code/LauncherUnified/Launcher.h @@ -10,7 +10,9 @@ #include // for AZ_COMMAND_LINE_LEN #include #include +#include #include +#include struct IOutputPrintSink; @@ -34,7 +36,7 @@ namespace O3DELauncher #define COMMAND_LINE_ARG_COUNT_LIMIT (AZ_COMMAND_LINE_LEN+1) / 2 // Assume that the limit to how many arguments we can maintain is the max buffer size divided by 2 // to account for an argument and a spec in between each argument (with the worse case scenario being - + struct PlatformMainInfo { typedef bool (*ResourceLimitUpdater)(); @@ -69,7 +71,7 @@ namespace O3DELauncher void* m_window = nullptr; //!< maps to \ref SSystemInitParams::hWnd void* m_instance = nullptr; //!< maps to \ref SSystemInitParams::hInstance - IOutputPrintSink* m_printSink = nullptr; //!< maps to \ref SSystemInitParams::pPrintSync + IOutputPrintSink* m_printSink = nullptr; //!< maps to \ref SSystemInitParams::pPrintSync }; enum class ReturnCode : unsigned char diff --git a/Code/Legacy/CryCommon/Common_TypeInfo.cpp b/Code/Legacy/CryCommon/Common_TypeInfo.cpp index 6a295c696f..ccb28cbc3d 100644 --- a/Code/Legacy/CryCommon/Common_TypeInfo.cpp +++ b/Code/Legacy/CryCommon/Common_TypeInfo.cpp @@ -7,150 +7,10 @@ */ -#include "TypeInfo_impl.h" #include "Cry_Geo.h" - -STRUCT_INFO_T_BEGIN(Vec2_tpl, class, F) -VAR_INFO(x) -VAR_INFO(y) -STRUCT_INFO_T_END(Vec2_tpl, class, F) - +#include "Cry_Color.h" #include "Cry_Vector3.h" -STRUCT_INFO_T_BEGIN(Vec3_tpl, typename, F) -VAR_INFO(x) -VAR_INFO(y) -VAR_INFO(z) -STRUCT_INFO_T_END(Vec3_tpl, typename, F) - -typedef TFixed TFixedUChar_1_255_0; -STRUCT_INFO_T_INSTANTIATE(Vec3_tpl, TFixedUChar_1_255_0) - -STRUCT_INFO_T_BEGIN(Vec4_tpl, typename, F) -VAR_INFO(x) -VAR_INFO(y) -VAR_INFO(z) -VAR_INFO(w) -STRUCT_INFO_T_END(Vec4_tpl, typename, F) - -STRUCT_INFO_T_INSTANTIATE(Vec4_tpl, short) - -STRUCT_INFO_T_BEGIN(Ang3_tpl, typename, F) -VAR_INFO(x) -VAR_INFO(y) -VAR_INFO(z) -STRUCT_INFO_T_END(Ang3_tpl, typename, F) - -STRUCT_INFO_T_BEGIN(Plane_tpl, typename, F) -VAR_INFO(n) -VAR_INFO(d) -STRUCT_INFO_T_END(Plane_tpl, typename, F) - -//----------------------------------------------------------------- -//#include "Cry_Quat_info.h" -STRUCT_INFO_T_BEGIN(Quat_tpl, typename, F) -VAR_INFO(v) -VAR_INFO(w) -STRUCT_INFO_T_END(Quat_tpl, typename, F) - -STRUCT_INFO_T_INSTANTIATE(Quat_tpl, float) - -STRUCT_INFO_T_BEGIN(QuatT_tpl, typename, F) -VAR_INFO(q) -VAR_INFO(t) -STRUCT_INFO_T_END(QuatT_tpl, typename, F) - -STRUCT_INFO_T_INSTANTIATE(QuatT_tpl, float) - -STRUCT_INFO_T_BEGIN(QuatTS_tpl, typename, F) -VAR_INFO(q) -VAR_INFO(t) -VAR_INFO(s) -STRUCT_INFO_T_END(QuatTS_tpl, typename, F) - -STRUCT_INFO_T_BEGIN(DualQuat_tpl, typename, F) -VAR_INFO(nq) -VAR_INFO(dq) -STRUCT_INFO_T_END(DualQuat_tpl, typename, F) - - -//------------------------------------------------------------ -//#include "Cry_Matrix_info.h" -STRUCT_INFO_T_BEGIN(Matrix33_tpl, typename, F) -VAR_INFO(m00) -VAR_INFO(m01) -VAR_INFO(m02) -VAR_INFO(m10) -VAR_INFO(m11) -VAR_INFO(m12) -VAR_INFO(m20) -VAR_INFO(m21) -VAR_INFO(m22) -STRUCT_INFO_T_END(Matrix33_tpl, typename, F) - -STRUCT_INFO_T_BEGIN(Matrix34_tpl, typename, F) -VAR_INFO(m00) -VAR_INFO(m01) -VAR_INFO(m02) -VAR_INFO(m03) -VAR_INFO(m10) -VAR_INFO(m11) -VAR_INFO(m12) -VAR_INFO(m13) -VAR_INFO(m20) -VAR_INFO(m21) -VAR_INFO(m22) -VAR_INFO(m23) -STRUCT_INFO_T_END(Matrix34_tpl, typename, F) - -STRUCT_INFO_T_INSTANTIATE(Matrix34_tpl, float) - -STRUCT_INFO_T_BEGIN(Matrix44_tpl, typename, F) -VAR_INFO(m00) -VAR_INFO(m01) -VAR_INFO(m02) -VAR_INFO(m03) -VAR_INFO(m10) -VAR_INFO(m11) -VAR_INFO(m12) -VAR_INFO(m13) -VAR_INFO(m20) -VAR_INFO(m21) -VAR_INFO(m22) -VAR_INFO(m23) -VAR_INFO(m30) -VAR_INFO(m31) -VAR_INFO(m32) -VAR_INFO(m33) -STRUCT_INFO_T_END(Matrix44_tpl, typename, F) - - -//#include "Cry_Color_info.h" -STRUCT_INFO_T_BEGIN(Color_tpl, class, T) -VAR_INFO(r) -VAR_INFO(g) -VAR_INFO(b) -VAR_INFO(a) -STRUCT_INFO_T_END(Color_tpl, class, T) - -STRUCT_INFO_T_INSTANTIATE(Color_tpl, unsigned char) - -//#include "Cry_Geo_info.h" -STRUCT_INFO_BEGIN(AABB) -VAR_INFO(min) -VAR_INFO(max) -STRUCT_INFO_END(AABB) - -STRUCT_INFO_BEGIN(RectF) -VAR_INFO(x) -VAR_INFO(y) -VAR_INFO(w) -VAR_INFO(h) -STRUCT_INFO_END(RectF) - -#include "TimeValue_info.h" -#include "CryHalf_info.h" - // Manually instantiate templates as needed here. template struct Vec3_tpl; template struct Vec4_tpl; diff --git a/Code/Legacy/CryCommon/CryArray.h b/Code/Legacy/CryCommon/CryArray.h deleted file mode 100644 index b4878ec25a..0000000000 --- a/Code/Legacy/CryCommon/CryArray.h +++ /dev/null @@ -1,1322 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYARRAY_H -#define CRYINCLUDE_CRYCOMMON_CRYARRAY_H -#pragma once - -#include -#include - -//--------------------------------------------------------------------------- -// Convenient iteration macros - -#define for_ptr(T, it, b, e) for (T* it = (b), * _e = (e); it != _e; ++it) -#define for_array_ptr(T, it, arr) for_ptr (T, it, (arr).begin(), (arr).end()) -#define for_array(i, arr) for (int i = 0, _e = (arr).size(); i < _e; i++) - -//--------------------------------------------------------------------------- -// Specify semantics for moving objects. -// If raw_movable() is true, objects will be moved with memmove(). -// If false, with the templated move_init() function. -template -bool raw_movable([[maybe_unused]] T const& dest) -{ - return false; -} - -// This container was written before C++11 and move semantics. As a result, it attempts -// to fake move semantics where possible by constructing over top of existing instances. -// This works great, unless the type being operated on has internal pointers to its own -// memory space (for instance a string with SSO, or COW semantics). -template -struct fake_move_helper -{ - static void move(T& dest, T& source) - { - ::new(&dest) T(source); - source.~T(); - } -}; - -// Generic move function: transfer an existing source object to uninitialized dest address. -// Addresses must not overlap (requirement on caller). -// May be specialized for specific types, to provide a more optimal move. -// For types that can be trivially moved (memcpy), do not specialize move_init, rather specialize raw_movable to return true. -template -void move_init(T& dest, T& source) -{ - assert(&dest != &source); - fake_move_helper::move(dest, source); -} - -/*--------------------------------------------------------------------------- -Public classes: - - Array - StaticArray - DynArray - StaticDynArray - -Support classes are placed in namespaces NArray and NAlloc to reduce global name usage. ----------------------------------------------------------------------------*/ - -namespace NArray -{ - // We should never have these defined as macros. - #undef min - #undef max - - // Define our own min/max here, to avoid including entire . - template - inline T min(T a, T b) - { return a < b ? a : b; } - template - inline T max(T a, T b) - { return a > b ? a : b; } - - // Automatic inference of signed from unsigned int type. - template - struct IntTraits - { - typedef T TSigned; - }; - - template<> - struct IntTraits - { - typedef int TSigned; - }; - template<> - struct IntTraits - { - typedef int64 TSigned; - }; -#if !defined(LINUX) && !defined(APPLE) - template<> - struct IntTraits - { - typedef long TSigned; - }; -#endif - - /*--------------------------------------------------------------------------- - // STORAGE prototype for Array. - struct Storage - { - template - struct Store - { - [const] T* begin() [const]; - I size() const; - }; - }; - ---------------------------------------------------------------------------*/ - - //--------------------------------------------------------------------------- - // ArrayStorage: Default STORAGE Array. - // Simply contains a pointer and count to an existing array, - // performs no allocation or deallocation. - - struct ArrayStorage - { - template - struct Store - { - // Construction. - Store() - : m_aElems(0) - , m_nCount(0) - {} - Store(T* elems, I count) - : m_aElems(elems) - , m_nCount(count) - {} - Store(T* start, T* finish) - : m_aElems(start) - , m_nCount(check_cast(finish - start)) - {} - - void set(T* elems, I count) - { - m_aElems = elems; - m_nCount = count; - } - - // Basic storage. - CONST_VAR_FUNCTION(T * begin(), - { return m_aElems; - }) - inline I size() const - { return m_nCount; } - - // Modifiers, alter range in place. - void erase_front(I count = 1) - { - assert(count >= 0 && count <= m_nCount); - m_nCount -= count; - m_aElems += count; - } - - void erase_back(I count = 1) - { - assert(count >= 0 && count <= m_nCount); - m_nCount -= count; - } - - void resize(I count) - { - assert(count >= 0 && count <= m_nCount); - m_nCount = count; - } - - protected: - T* m_aElems; - I m_nCount; - }; - }; - - //--------------------------------------------------------------------------- - // StaticArrayStorage: STORAGE scheme with a statically sized member array. - - template - struct StaticArrayStorage - { - template - struct Store - { - // Basic storage. - CONST_VAR_FUNCTION(T * begin(), - { return m_aElems; - }) - inline static I size() - { return (I)nSIZE; } - - protected: - T m_aElems[nSIZE]; - }; - }; -}; - -//--------------------------------------------------------------------------- -// Array: Non-growing array. -// S serves as base class, and implements storage scheme: begin(), size() - -template< class T, class I = int, class STORE = NArray::ArrayStorage > -struct Array - : STORE::template Store -{ - typedef typename STORE::template Store S; - - // Tedious redundancy. - using S::size; - using S::begin; - - // STL-compatible typedefs. - typedef T value_type; - typedef T* pointer; - typedef const T* const_pointer; - typedef T& reference; - typedef const T& const_reference; - - typedef T* iterator; - typedef const T* const_iterator; - - typedef I size_type; - typedef typename NArray::IntTraits::TSigned - difference_type; - - typedef Array array; - typedef Array const_array; - - // Construction. - Array() - {} - - // Forward single- and double-argument constructors. - template - explicit Array(const In& i) - : S(i) - {} - - template - Array(const In1& i1, const In2& i2) - : S(i1, i2) - {} - - // Accessors. - inline bool empty() const - { return size() == 0; } - inline size_type size_mem() const - { return size() * sizeof(T); } - - CONST_VAR_FUNCTION(T * data(), - { return begin(); - }) - - CONST_VAR_FUNCTION(T * end(), - { return begin() + size(); - }) - - CONST_VAR_FUNCTION(T * rbegin(), - { return begin() + size() - 1; - }) - - CONST_VAR_FUNCTION(T * rend(), - { return begin() - 1; - }) - - CONST_VAR_FUNCTION(T & front(), - { - assert(!empty()); - return *begin(); - }) - - CONST_VAR_FUNCTION(T & back(), - { - assert(!empty()); - return *rbegin(); - }) - - CONST_VAR_FUNCTION(T & at(size_type i), - { - CRY_ASSERT_TRACE(i >= 0 && i < size(), ("Index %lld is out of range (array size is %lld)", (long long int) i, (long long int) size())); - return begin()[i]; - }) - - CONST_VAR_FUNCTION(T & operator [](size_type i), - { - CRY_ASSERT_TRACE(i >= 0 && i < size(), ("Index %lld is out of range (array size is %lld)", (long long int) i, (long long int) size())); - return begin()[i]; - }) - - // Conversion to canonical array type. - operator array() - { return array(begin(), size()); } - operator const_array() const - { - return const_array(begin(), size()); - } - - // Additional conversion via operator() to full or sub array. - array operator ()(size_type i, size_type count) - { - assert(i >= 0 && i + count <= size()); - return array(begin() + i, count); - } - const_array operator ()(size_type i, size_type count) const - { - assert(i >= 0 && i + count <= size()); - return const_array(begin() + i, count); - } - - array operator ()(size_type i = 0) - { return (*this)(i, size() - i); } - const_array operator ()(size_type i = 0) const - { return (*this)(i, size() - i); } - - // Basic element assignment functions. - - // Copy values to existing elements. - void fill(const T& val) - { - for_array_ptr (T, it, *this) - * it = val; - } - - void copy(const_array source) - { - assert(source.size() >= size()); - const T* s = source.begin(); - for_array_ptr (T, it, *this) - * it = *s++; - } - - // Raw element construct/destruct functions. - iterator init() - { - for_array_ptr (T, it, *this) - new(it) T; - return begin(); - } - iterator init(const T& val) - { - for_array_ptr (T, it, *this) - new(it) T(val); - return begin(); - } - iterator init(const_array source) - { - assert(source.size() >= size()); - assert(source.end() <= begin() || source.begin() >= end()); - const_iterator s = source.begin(); - for_array_ptr (T, it, *this) - new(it) T(*s++); - return begin(); - } - - iterator move_init(array source) - { - assert(source.size() >= size()); - iterator s = source.begin(); - if (s != begin()) - { - if (raw_movable(*s)) - { - memmove(begin(), s, size_mem()); - } - else if (s > begin() || source.end() <= begin()) - { - for_array_ptr (T, it, *this) - ::move_init(*it, *s++); - } - else - { - s += size(); - for (iterator it = end(); it > begin(); ) - { - ::move_init(*--it, *--s); - } - } - } - return begin(); - } - - void destroy() - { - // Destroy in reverse order, to complement construction order. - for (iterator it = rbegin(); it > rend(); --it) - { - it->~T(); - } - } -}; - -// Type-inferring constructor. - -template -inline Array ArrayT(T* elems, I count) -{ - return Array(elems, count); -} - -template -inline Array ArrayT(T* start, T* finish) -{ - return Array(start, finish); -} - -// StaticArray -// A superior alternative to static C arrays. -// Provides standard STL-like Array interface, including bounds-checking. -// standard: Type array[256]; -// structured: StaticArray array; - -template -struct StaticArray - : Array< T, I, NArray::StaticArrayStorage > -{ -}; - -//--------------------------------------------------------------------------- -// Specify allocation for dynamic arrays - -namespace NAlloc -{ - // Multi-purpose allocation function prototype - // pMem = 0, nSize != 0: allocate new mem, nSize = actual amount alloced - // pMem != 0, nSize = 0: deallcate mem - // pMem != 0, nSize != 0: nSize = actual amount allocated - typedef void* (* Allocator)(void* pMem, size_t& nSize, size_t nAlign, bool bSlack); - - // - // Allocation utilities - // - - inline size_t realloc_size(size_t nMinSize) - { - // Choose an efficient realloc size, when growing an existing (non-zero) block. - // Find the next power-of-two, minus a bit of presumed system alloc overhead. - static const size_t nMinAlloc = 32; - static const size_t nOverhead = 16; - static const size_t nDoubleLimit = - sizeof(size_t) < 8 ? 1 << 12 // 32-bit system - : 1 << 16; // >= 64-bit system - - nMinSize += nOverhead; - size_t nAlloc = nMinAlloc; - while (nAlloc < nMinSize) - { - nAlloc <<= 1; - } - if (nAlloc > nDoubleLimit) - { - size_t nAlign = NArray::max(nAlloc >> 3, nDoubleLimit); - nAlloc = Align(nMinSize, nAlign); - } - return nAlloc - nOverhead; - } - - template - T* reallocate(A& allocator, T* old_elems, I old_size, I& new_size, size_t alignment = 1, bool allow_slack = false) - { - T* new_elems; - if (new_size) - { - size_t new_bytes = new_size * sizeof(T); - new_elems = (T*) allocator.alloc(0, new_bytes, alignment, allow_slack); - assert(IsAligned(new_elems, alignment)); - assert(new_bytes >= new_size * sizeof(T)); - new_size = check_cast(new_bytes / sizeof(T)); - } - else - { - new_elems = 0; - } - - if (old_elems) - { - Array old_elems_array(old_elems, old_size); - if (new_elems) - { - // Move elements. - ArrayT(new_elems, NArray::min(old_size, new_size)).move_init(old_elems_array); - } - - // Dealloc old. - old_elems_array.destroy(); // call destructors - size_t zero = 0; - allocator.alloc(old_elems, zero, alignment); - } - - return new_elems; - } - - template - inline size_t get_alloc_size(const A& allocator, const void* pMem, size_t nSize, size_t nAlign) - { - non_const(allocator).alloc((void*)pMem, nSize, nAlign); - return nSize; - } - - struct AllocFunction - { - Allocator m_Function; - - void* alloc(void* pMem, size_t& nSize, size_t nAlign, bool bSlack = false) - { - return m_Function(pMem, nSize, nAlign, bSlack); - } - }; - - // Adds prefix bytes to allocation, preserving alignment - template - struct AllocPrefix - : A - { - void* alloc(void* pMem, size_t& nSize, size_t nAlign, bool bSlack = false) - { - // Adjust pointer and size for prefix bytes - nAlign = NArray::max(nAlign, alignof(Prefix)); - size_t nPrefixSize = Align(sizeof(Prefix), nAlign); - - if (pMem) - { - pMem = (char*)pMem - nPrefixSize; - } - if (nSize) - { - nSize = Align(nSize, nSizeAlign); - nSize += nPrefixSize; - } - - pMem = A::alloc(pMem, nSize, nAlign, bSlack); - - if (nSize) - { - nSize -= nPrefixSize; - } - if (pMem) - { - pMem = (char*)pMem + nPrefixSize; - } - return pMem; - } - }; - - // Stores and retrieves allocator function in memory, for compatibility with diverse allocators - template - struct AllocCompatible - { - void* alloc(void* pMem, size_t& nSize, size_t nAlign, bool bSlack = false) - { - nAlign = NArray::max(nAlign, alignof(Allocator)); - if (pMem) - { - // Retrieve original allocation function, for dealloc or size query - AllocPrefix alloc_prefix; - alloc_prefix.m_Function = ((Allocator*)pMem)[-1]; - return alloc_prefix.alloc(pMem, nSize, nAlign, bSlack); - } - else if (nSize) - { - // Allocate new with this module's base_allocator, storing pointer to function - AllocPrefix alloc_prefix; - pMem = alloc_prefix.alloc(pMem, nSize, nAlign, bSlack); - if (pMem) - { - ((Allocator*)pMem)[-1] = &A::alloc; - } - } - return pMem; - } - }; - - //--------------------------------------------------------------------------- - // Allocators for DynArray. - - // Standard CryModule memory allocation, using aligned versions - struct ModuleAlloc - { - static void* alloc(void* pMem, size_t& nSize, size_t nAlign, bool bSlack = false) - { - if (pMem) - { - if (nSize) - { - // Return memory usage, adding presumed alignment padding - if (nAlign > sizeof(size_t)) - { - nSize += nAlign - sizeof(size_t); - } - } - else - { - // Dealloc - CryModuleMemalignFree(pMem); - } - } - else if (nSize) - { - // Alloc - if (bSlack) - { - nSize = realloc_size(nSize); - } - return CryModuleMemalign(nSize, nAlign); - } - return 0; - } - }; - - // Standard allocator for DynArray stores a compatibility pointer in the memory - typedef AllocCompatible StandardAlloc; -}; - -//--------------------------------------------------------------------------- -// Storage schemes for dynamic arrays -namespace NArray -{ - //--------------------------------------------------------------------------- - // SmallDynStorage: STORAGE scheme for DynArray. - // Array is just a single pointer, size and capacity information stored before the array data. - - template - struct SmallDynStorage - { - template - struct Store - : private A - { - struct Header - { - static const I nCAP_BIT = I(1) << (sizeof(I) * 8 - 1); - - ILINE char* data() const - { - assert(IsAligned(this, sizeof(I))); - return (char*)(this + 1); - } - ILINE bool is_null() const - { return m_nSizeCap == 0; } - ILINE I size() const - { return m_nSizeCap & ~nCAP_BIT; } - - I capacity() const - { - I aligned_bytes = static_cast(Align(size() * sizeof(T), sizeof(I))); - if (m_nSizeCap & nCAP_BIT) - { - // Capacity stored in word following data - return *(I*)(data() + aligned_bytes); - } - else - { - // Capacity - size < sizeof(I) - return aligned_bytes / sizeof(T); - } - } - - void set_sizes(I s, I c) - { - // Store size, and assert against overflow. - assert(s <= c); - m_nSizeCap = s; - I aligned_bytes = static_cast(Align(s * sizeof(T), sizeof(I))); - if (c * sizeof(T) >= aligned_bytes + sizeof(I)) - { - // Has extra capacity, more than word-alignment - m_nSizeCap |= nCAP_BIT; - *(I*)(data() + aligned_bytes) = c; - } - assert(size() == s); - assert(capacity() == c); - } - - protected: - I m_nSizeCap; // Store allocation size, with last bit indicating extra capacity. - - public: - - static T* null_header() - { - // m_aElems is never 0, for empty array points to a static empty header. - // Declare a big enough static var to account for alignment. - struct EmptyHeader - { - Header head; - char pad[alignof(T)]; - }; - static EmptyHeader s_EmptyHeader; - - // The actual header pointer can be anywhere in the struct, it's all initialized to 0. - static T* s_EmptyElems = (T*)Align(s_EmptyHeader.pad, alignof(T)); - - return s_EmptyElems; - } - }; - - // Construction. - Store() - { - set_null(); - } - - Store(const A& a) - : A(a) - { - set_null(); - } - - // Basic storage. - CONST_VAR_FUNCTION(T * begin(), - { return m_aElems; - }) - inline I size() const - { return header()->size(); } - inline I capacity() const - { return header()->capacity(); } - size_t get_alloc_size() const - { return is_null() ? 0 : NAlloc::get_alloc_size(allocator(), begin(), capacity() * sizeof(T), alignof(T)); } - - void resize_raw(I new_size, bool allow_slack = false) - { - I new_cap = capacity(); - if (allow_slack ? new_size > new_cap : new_size != new_cap) - { - new_cap = new_size; - m_aElems = NAlloc::reallocate(allocator(), header()->is_null() ? 0 : m_aElems, size(), new_cap, alignof(T), allow_slack); - if (!m_aElems) - { - set_null(); - return; - } - } - header()->set_sizes(new_size, new_cap); - } - - protected: - - T* m_aElems; - - CONST_VAR_FUNCTION(Header * header(), - { - assert(m_aElems); - return ((Header*)m_aElems) - 1; - }) - - void set_null() - { m_aElems = Header::null_header(); } - bool is_null() const - { return header()->is_null(); } - - typedef NAlloc::AllocPrefix AP; - - AP& allocator() - { - static_assert(sizeof(AP) == sizeof(A)); - return *(AP*)this; - } - const AP& allocator() const - { - return *(const AP*)this; - } - }; - }; - - //--------------------------------------------------------------------------- - // StaticDynStorage: STORAGE scheme with a statically sized member array. - - template - struct StaticDynStorage - { - template - struct Store - : ArrayStorage::Store - { - Store() - : ArrayStorage::Store((T*)Align(m_aData, alignof(T)), 0) {} - - static I capacity() - { return (I)nSIZE; } - static size_t get_alloc_size() - { return 0; } - - void resize_raw(I new_size, [[maybe_unused]] bool allow_slack = false) - { - // cannot realloc, just set size - assert(new_size >= 0 && new_size <= capacity()); - this->m_nCount = new_size; - } - - protected: - - char m_aData[nSIZE * sizeof(T) + alignof(T) - 1]; // Storage for elems, deferred construction - }; - }; -}; - -// Legacy base class of DynArray, only used for read-only access -#define DynArrayRef DynArray - -//--------------------------------------------------------------------------- -// DynArray: Extension of Array allowing dynamic allocation. -// S specifies storage scheme, as with Array, but adds resize(), capacity(), ... -// A specifies the actual memory allocation function: alloc() - -// NOTE: This version has been re-based on AZStd::vector for correctness and performance -// The original implementation has been retained as LegacyDynArray below, for the few -// cases where we must retain the old internal behavior -template< class T, class I = int, class STORE = NArray::SmallDynStorage<> > -struct DynArray - : public AZStd::vector -{ - typedef AZStd::vector vector_base; - using value_type = typename vector_base::value_type; - using size_type = I; - using iterator = typename vector_base::iterator; - using const_iterator = typename vector_base::const_iterator; - - using vector_base::begin; - using vector_base::end; - - DynArray() - : vector_base::vector() - { - } - - explicit DynArray(size_type numElements) - : vector_base::vector(numElements) - { - } - - DynArray(size_type numElements, const T& value) - : vector_base::vector(numElements, value) - { - } - - // Ignore any specialized allocators, they all pull from the LegacyAllocator now - // Because we mandate that all DynArrays use the StdLegacyAllocator, matching allocators - // isn't meaningful here, so it's factored out - // Note that the STORE/S& is ignored entirely, because we do not support sharing storage - // between 2 DynArrays anymore. LegacyDynArray can still do that, but this feature is no longer used - template >::value>> - explicit DynArray(const S&) - : vector_base::vector() - { - } - - size_type capacity() const - { - return static_cast(vector_base::capacity()); - } - - size_type size() const - { - return static_cast(vector_base::size()); - } - - size_type available() const - { - return capacity() - size(); - } - - size_type get_alloc_size() const - { - return capacity() * sizeof(T); - } - - // Grow array, return iterator to new raw elems. - iterator grow_raw(size_type count = 1, bool /*allow_slack*/ = true) - { - vector_base::resize(size() + count); - return end() - count; - } - - iterator grow(size_type count) - { - return grow_raw(count); - } - iterator grow(size_type count, const T& val) - { - vector_base::reserve(size() + count); - for (size_type idx = 0; idx < count; ++idx) - { - vector_base::push_back(val); - } - return end() - count; - } - - void shrink() - { - // Realloc memory to exact array size. - vector_base::shrink_to_fit(); - } - - void resize(size_type newSize) - { - vector_base::resize(newSize); - } - - void resize(size_type new_size, const T& val) - { - size_type s = size(); - if (new_size > s) - { - grow(new_size - s, val); - } - else - { - pop_back(s - new_size); - } - } - - void assign(const_iterator first, const_iterator last) - { - vector_base::assign(first, last); - } - - void assign(size_type n, const T& val) - { - clear(); - grow(n, val); - } - - iterator push_back() - { - return grow(1); - } - iterator push_back(const T& val) - { - vector_base::push_back(val); - return vector_base::end() - 1; - } - iterator push_back(const DynArray& other) - { - return insert(end(), other.begin(), other.end()); - } - - iterator insert_raw(iterator pos, size_type count = 1) - { - // Grow array, return iterator to inserted raw elems. - assert(pos >= begin() && pos <= end()); - vector_base::insert(pos, count, T()); - return pos; - } - - iterator insert(iterator it, const T& val) - { - vector_base::insert(it, 1, val); - return it; - } - iterator insert(iterator it, size_type count, const T& val) - { - vector_base::insert(it, count, val); - return it; - } - iterator insert(iterator it, const_iterator start, const_iterator finish) - { - vector_base::insert(it, start, finish); - return it; - } - - iterator insert(size_type pos) - { - return insert_raw(begin() + pos); - } - iterator insert(size_type pos, const T& val) - { - iterator it = insert_raw(begin() + pos); - *it = val; - return it; - } - - void pop_back(size_type count = 1, [[maybe_unused]] bool allow_slack = true) - { - // Destroy erased elems, change size without reallocing. - assert(count >= 0 && count <= size()); - for (size_type idx = 0; idx < count; ++idx) - { - vector_base::pop_back(); - } - } - - iterator erase(iterator pos) - { - return vector_base::erase(pos); - } - - iterator erase(iterator start, iterator finish) - { - AZ_Assert(start >= begin() && finish >= start && finish <= end(), "DynArray: Erasure range out of bounds"); - - // Copy over erased elems, destroy those at end. - iterator it = start, e = end(); - while (finish < e) - { - *it++ = *finish++; - } - pop_back(check_cast(finish - it)); - return it; - } - - iterator erase(size_type pos, size_type count = 1) - { - return erase(begin() + pos, begin() + pos + count); - } - - void clear() - { - vector_base::clear(); - vector_base::shrink_to_fit(); - } -}; - -//--------------------------------------------------------------------------- -// Original Cry DynArray -//--------------------------------------------------------------------------- -template< class T, class I = int, class STORE = NArray::SmallDynStorage<> > -struct LegacyDynArray - : Array< T, I, STORE > -{ - typedef LegacyDynArray self_type; - typedef Array super_type; - typedef typename STORE::template Store S; - - // Tedious redundancy for GCC. - using_type(super_type, size_type); - using_type(super_type, iterator); - using_type(super_type, const_iterator); - using_type(super_type, array); - using_type(super_type, const_array); - - using super_type::size; - using super_type::capacity; - using super_type::begin; - using super_type::end; - using super_type::at; - using super_type::copy; - using super_type::init; - using super_type::destroy; - - // - // Construction. - // - LegacyDynArray() - {} - - LegacyDynArray(size_type count) - { - grow(count); - } - LegacyDynArray(size_type count, const T& val) - { - grow(count, val); - } - -#if !defined(_DISALLOW_INITIALIZER_LISTS) - // Initializer-list - LegacyDynArray(std::initializer_list l) - { - push_back(Array(l.begin(), l.size())); - } -#endif - - // Copying from a generic array type. - LegacyDynArray(const_array a) - { - push_back(a); - } - self_type& operator =(const_array a) - { - if (a.begin() >= begin() && a.end() <= end()) - { - // Assigning from (partial) self; remove undesired elements. - erase((T*)a.end(), end()); - erase(begin(), (T*)a.begin()); - } - else - { - // Assert no overlap. - assert(a.end() <= begin() || a.begin() >= end()); - if (a.size() == size()) - { - // If same size, perform element copy. - copy(a); - } - else - { - // If different sizes, destroy then copy init elements. - pop_back(size()); - push_back(a); - } - } - return *this; - } - - // Copy init/assign. - inline LegacyDynArray(const self_type& a) - { - push_back(a()); - } - inline self_type& operator =(const self_type& a) - { - return *this = a(); - } - - // Init/assign from basic storage type. - inline LegacyDynArray(const S& a) - { - push_back(const_array(a.begin(), a.size())); - } - inline self_type& operator =(const S& a) - { - return *this = const_array(a.begin(), a.size()); - } - - inline ~LegacyDynArray() - { - destroy(); - S::resize_raw(0); - } - - void swap(self_type& a) - { - // Swap storage structures, no element copying - S temp = static_cast(*this); - static_cast(*this) = static_cast(a); - static_cast(a) = temp; - } - - inline size_type available() const - { - return capacity() - size(); - } - - // - // Allocation modifiers. - // - - void reserve(size_type count) - { - if (count > capacity()) - { - I s = size(); - S::resize_raw(count, false); - S::resize_raw(s, true); - } - } - - // Grow array, return iterator to new raw elems. - iterator grow_raw(size_type count = 1, bool allow_slack = true) - { - S::resize_raw(size() + count, allow_slack); - return end() - count; - } - Array append_raw(size_type count = 1, bool allow_slack = true) - { - return Array(grow_raw(count, allow_slack), count); - } - - iterator grow(size_type count) - { - return append_raw(count).init(); - } - iterator grow(size_type count, const T& val) - { - return append_raw(count).init(val); - } - - void shrink() - { - // Realloc memory to exact array size. - S::resize_raw(size()); - } - - void resize(size_type new_size) - { - size_type s = size(); - if (new_size > s) - { - append_raw(new_size - s, false).init(); - } - else - { - pop_back(s - new_size, false); - } - } - void resize(size_type new_size, const T& val) - { - size_type s = size(); - if (new_size > s) - { - append_raw(new_size - s, false).init(val); - } - else - { - pop_back(s - new_size, false); - } - } - - void assign(size_type n, const T& val) - { - resize(n); - fill(val); - } - - void assign(const_iterator start, const_iterator finish) - { - *this = const_array(start, finish); - } - - iterator push_back() - { - return grow(1); - } - iterator push_back(const T& val) - { - return grow(1, val); - } - iterator push_back(const_array a) - { - return append_raw(a.size(), false).init(a); - } - - array insert_raw(iterator pos, size_type count = 1) - { - // Grow array, return iterator to inserted raw elems. - assert(pos >= begin() && pos <= end()); - size_t i = pos - begin(); - append_raw(count); - (*this)(i + count).move_init((*this)(i)); - return (*this)(i, count); - } - - iterator insert(iterator it, const T& val) - { - return insert_raw(it, 1).init(val); - } - iterator insert(iterator it, size_type count, const T& val) - { - return insert_raw(it, count).init(val); - } - iterator insert(iterator it, const_iterator start, const_iterator finish) - { - return insert(it, const_array(start, finish)); - } - iterator insert(iterator it, const_array a) - { - return insert_raw(it, a.size()).init(a); - } - - iterator insert(size_type pos) - { - return insert_raw(&at(pos)).init(); - } - iterator insert(size_type pos, const T& val) - { - return insert_raw(&at(pos)).init(val); - } - iterator insert(size_type pos, const_array a) - { - return insert_raw(&at(pos), a.size()).init(a); - } - - void pop_back(size_type count = 1, bool allow_slack = true) - { - // Destroy erased elems, change size without reallocing. - assert(count >= 0 && count <= size()); - size_type new_size = size() - count; - (*this)(new_size).destroy(); - S::resize_raw(new_size, allow_slack); - } - - iterator erase(iterator start, iterator finish) - { - assert(start >= begin() && finish >= start && finish <= end()); - - // Copy over erased elems, destroy those at end. - iterator it = start, e = end(); - while (finish < e) - { - *it++ = *finish++; - } - pop_back(check_cast(finish - it)); - return it; - } - - iterator erase(iterator it) - { - return erase(it, it + 1); - } - - iterator erase(size_type pos, size_type count = 1) - { - return erase(begin() + pos, begin() + pos + count); - } - - void clear() - { - destroy(); - S::resize_raw(0); - } -}; - -template -struct StaticDynArray - : LegacyDynArray< T, I, NArray::StaticDynStorage > -{ -}; - - - - #include "CryPodArray.h" - - -#endif // CRYINCLUDE_CRYCOMMON_CRYARRAY_H diff --git a/Code/Legacy/CryCommon/CryCommon.cpp b/Code/Legacy/CryCommon/CryCommon.cpp deleted file mode 100644 index e2eb7c78a8..0000000000 --- a/Code/Legacy/CryCommon/CryCommon.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - - -// This contains compiled code that is used by other projects in the solution. -// Because we don't want static DLL dependencies, the CryCommon project is not compiled into a library. -// Instead, this .cpp file is included in every project which needs it. -// But we also include it in the CryCommon project (disabled in the build), -// so that CryCommon can have the same editable settings as other projects. - -// Set this to 1 to get an output of some pre-defined compiler symbols. - -#if 0 - -#ifdef _WIN32 -#pragma message("_WIN32") -#endif -#ifdef _WIN64 -#pragma message("_WIN64") -#endif - -#ifdef _M_IX86 -#pragma message("_M_IX86") -#endif -#ifdef _M_PPC -#pragma message("_M_PPC") -#endif - -#ifdef _DEBUG -#pragma message("_DEBUG") -#endif - -#ifdef _DLL -#pragma message("_DLL") -#endif -#ifdef _USRDLL -#pragma message("_USRDLL") -#endif -#ifdef _MT -#pragma message("_MT") -#endif - -#endif - -#include - -#include "TypeInfo_impl.h" diff --git a/Code/Legacy/CryCommon/CryCustomTypes.h b/Code/Legacy/CryCommon/CryCustomTypes.h deleted file mode 100644 index 58a6bc9306..0000000000 --- a/Code/Legacy/CryCommon/CryCustomTypes.h +++ /dev/null @@ -1,1204 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Derived CTypeInfos for structs, enums, etc. -// Compressed numerical types and associated TypeInfos - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYCUSTOMTYPES_H -#define CRYINCLUDE_CRYCOMMON_CRYCUSTOMTYPES_H -#pragma once - -#include "CryTypeInfo.h" -#include -#include -#include -#include - -#define STATIC_CONST(T, name, val) \ - static inline T name() { static T t = val; return t; } - -#define ARRAY_COUNT(arr) (sizeof(arr) / sizeof *(arr)) -#define ARRAY_VAR(arr) ArrayT(&(arr)[0], (int)ARRAY_COUNT(arr)) - -//--------------------------------------------------------------------------- -// String helper function. - -template -inline bool HasString(const T& val, FToString flags, const void* def_data = 0) -{ - if (flags.SkipDefault) - { - if (val == (def_data ? *(const T*)def_data : T())) - { - return false; - } - } - return true; -} - -float NumToFromString(float val, int digits, bool floating, char buffer[], int buf_size); - -template -AZStd::string NumToString(T val, int min_digits, int max_digits, bool floating) -{ - char buffer[64]; - float f(val); - for (int digits = min_digits; digits < max_digits; digits++) - { - if (T(NumToFromString(f, digits, floating, buffer, 64)) == val) - { - break; - } - } - return buffer; -} - -//--------------------------------------------------------------------------- -// TypeInfo for structs - -struct CStructInfo - : CTypeInfo -{ - CStructInfo(cstr name, size_t size, size_t align, Array vars = Array(), Array templates = Array()); - virtual bool IsType(CTypeInfo const& Info) const; - virtual AZStd::string ToString(const void* data, FToString flags = 0, const void* def_data = 0) const; - virtual bool FromString(void* data, cstr str, FFromString flags = 0) const; - virtual bool ToValue(const void* data, void* value, const CTypeInfo& typeVal) const; - virtual bool FromValue(void* data, const void* value, const CTypeInfo& typeVal) const; - virtual bool ValueEqual(const void* data, const void* def_data) const; - virtual void SwapEndian(void* pData, size_t nCount, bool bWriting) const; - virtual void GetMemoryUsage(ICrySizer* pSizer, void const* data) const; - - virtual const CVarInfo* NextSubVar(const CVarInfo* pPrev, bool bRecurseBase = false) const; - virtual const CVarInfo* FindSubVar(cstr name) const; - - virtual CTypeInfo const* const* NextTemplateType(CTypeInfo const* const* pPrev) const - { - pPrev = pPrev ? pPrev + 1 : TemplateTypes.begin(); - return pPrev < TemplateTypes.end() ? pPrev : 0; - } - -protected: - Array Vars; - AZStd::fixed_string<16> EndianDesc; // Encodes instructions for endian swapping. - bool HasBitfields; - Array TemplateTypes; - - void MakeEndianDesc(); - size_t AddEndianDesc(cstr desc, size_t dim, size_t elem_size); - bool IsCompatibleType(CTypeInfo const& Info) const; -}; - -//--------------------------------------------------------------------------- -// Template TypeInfo for base types, using global To/FromString functions. - -template -struct TTypeInfo - : CTypeInfo -{ - TTypeInfo(cstr name) - : CTypeInfo(name, sizeof(T), alignof(T)) - {} - - virtual bool ToValue(const void* data, void* value, const CTypeInfo& typeVal) const - { - if (&typeVal == this) - { - return *(T*)value = *(const T*)data, true; - } - return false; - } - virtual bool FromValue(void* data, const void* value, const CTypeInfo& typeVal) const - { - if (&typeVal == this) - { - return *(T*)data = *(const T*)value, true; - } - return false; - } - - virtual AZStd::string ToString(const void* data, FToString flags = 0, const void* def_data = 0) const - { - if (!HasString(*(const T*)data, flags, def_data)) - { - return AZStd::string(); - } - return ::ToString(*(const T*)data); - } - virtual bool FromString(void* data, cstr str, FFromString flags = 0) const - { - if (!*str) - { - if (!flags.SkipEmpty) - { - *(T*)data = T(); - } - return true; - } - return ::FromString(*(T*)data, str); - } - virtual bool ValueEqual(const void* data, const void* def_data = 0) const - { - return *(const T*)data == (def_data ? *(const T*)def_data : T()); - } - - virtual void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer, [[maybe_unused]] void const* data) const - {} -}; - -//--------------------------------------------------------------------------- -// Template TypeInfo for modified types (e.g. compressed, range-limited) - -template -struct TProxyTypeInfo - : CTypeInfo -{ - TProxyTypeInfo(cstr name) - : CTypeInfo(name, sizeof(S), alignof(S)) - {} - - virtual bool IsType(CTypeInfo const& Info) const - { return &Info == this || ValTypeInfo().IsType(Info); } - - virtual bool ToValue(const void* data, void* value, const CTypeInfo& typeVal) const - { - if (&typeVal == this) - { - *(S*)value = *(const S*)data; - return true; - } - T val = T(*(const S*)data); - return ValTypeInfo().ToValue(&val, value, typeVal); - } - virtual bool FromValue(void* data, const void* value, const CTypeInfo& typeVal) const - { - if (&typeVal == this) - { - *(S*)data = *(const S*)value; - return true; - } - T val; - if (ValTypeInfo().FromValue(&val, value, typeVal)) - { - *(S*)data = S(val); - return true; - } - return false; - } - - virtual AZStd::string ToString(const void* data, FToString flags = 0, const void* def_data = 0) const - { - T val = T(*(const S*)data); - T def_val = def_data ? T(*(const S*)def_data) : T(); - return ValTypeInfo().ToString(&val, flags, &def_val); - } - virtual bool FromString(void* data, cstr str, FFromString flags = 0) const - { - T val; - if (!*str) - { - if (!flags.SkipEmpty) - { - *(S*)data = S(); - } - return true; - } - if (!TypeInfo(&val).FromString(&val, str)) - { - return false; - } - *(S*)data = S(val); - return true; - } - - // Forward additional TypeInfo functions. - virtual bool GetLimit(ENumericLimit eLimit, float& fVal) const - { return ValTypeInfo().GetLimit(eLimit, fVal); } - virtual cstr EnumElem(uint nIndex) const - { return ValTypeInfo().EnumElem(nIndex); } - -protected: - - static const CTypeInfo& ValTypeInfo() - { return TypeInfo((T*)0); } -}; - -//--------------------------------------------------------------------------- -// Customisation for string. - -template<> -inline AZStd::string TTypeInfo::ToString(const void* data, FToString flags, const void* def_data) const -{ - const AZStd::string& val = *(const AZStd::string*)data; - if (def_data && flags.SkipDefault) - { - if (val == *(const AZStd::string*)def_data) - { - return AZStd::string(); - } - } - return val; -} - -template<> -inline bool TTypeInfo::FromString(void* data, cstr str, FFromString flags) const -{ - if (!*str && flags.SkipEmpty) - { - return true; - } - *(AZStd::string*)data = str; - return true; -} - -template<> -void TTypeInfo::GetMemoryUsage(ICrySizer* pSizer, void const* data) const; - -//--------------------------------------------------------------------------- -// -// TypeInfo for small integer types. - - -template -struct TIntTraits -{ - static const bool bSIGNED - = T(-1) < T(0); - - static const T nMIN_FACTOR - = bSIGNED ? T(-1) : T(0); - - static const size_t nPOS_BITS - = sizeof(T) * 8 - bSIGNED; - - static const T nMIN = std::numeric_limits::min(); - - static const T nMAX = std::numeric_limits::max(); -}; - -template -struct TIntType -{}; - -template<> -struct TIntType<1> -{ - typedef int8 TType; -}; -template<> -struct TIntType<2> -{ - typedef int16 TType; -}; -template<> -struct TIntType<4> -{ - typedef int32 TType; -}; -template<> -struct TIntType<8> -{ - typedef int64 TType; -}; - -template -inline bool ConvertInt(D& dest, S src) -{ - if constexpr (TIntTraits::nPOS_BITS < TIntTraits::nPOS_BITS) - { - src = clamp_tpl(src, S(TIntTraits::nMIN), S(TIntTraits::nMAX)); - } - else if constexpr (TIntTraits::bSIGNED < TIntTraits::bSIGNED) - { - src = max(src, S(0)); - } - - dest = D(src); - assert(S(dest) == src); - return true; -} - -template -inline bool ConvertInt(D& dest, const void* src, const CTypeInfo& typeSrc) -{ - if (typeSrc.IsType()) - { - switch (typeSrc.Size) - { - case 1: - return ConvertInt(dest, *(const int8*)src); - case 2: - return ConvertInt(dest, *(const int16*)src); - case 4: - return ConvertInt(dest, *(const int32*)src); - case 8: - return ConvertInt(dest, *(const int64*)src); - } - } - else if (typeSrc.IsType()) - { - switch (typeSrc.Size) - { - case 1: - return ConvertInt(dest, *(const uint8*)src); - case 2: - return ConvertInt(dest, *(const uint16*)src); - case 4: - return ConvertInt(dest, *(const uint32*)src); - case 8: - return ConvertInt(dest, *(const uint64*)src); - } - } - return false; -} - -template -inline bool ConvertInt(void* dest, const CTypeInfo& typeDest, S src) -{ - if (typeDest.IsType()) - { - switch (typeDest.Size) - { - case 1: - return ConvertInt(*(int8*)dest, src); - case 2: - return ConvertInt(*(int16*)dest, src); - case 4: - return ConvertInt(*(int32*)dest, src); - case 8: - return ConvertInt(*(int64*)dest, src); - } - } - else if (typeDest.IsType()) - { - switch (typeDest.Size) - { - case 1: - return ConvertInt(*(uint8*)dest, src); - case 2: - return ConvertInt(*(uint16*)dest, src); - case 4: - return ConvertInt(*(uint32*)dest, src); - case 8: - return ConvertInt(*(uint64*)dest, src); - } - } - return false; -} - -template -struct TIntTypeInfo - : TTypeInfo -{ - TIntTypeInfo(cstr name) - : TTypeInfo(name) - {} - - virtual bool IsType(CTypeInfo const& Info) const - { return &Info == this || &Info == (TIntTraits::bSIGNED ? &TypeInfo((int*)0) : &TypeInfo((uint*)0)); } - - virtual bool GetLimit(ENumericLimit eLimit, float& fVal) const - { - if (eLimit == eLimit_Min) - { - return fVal = float(TIntTraits::nMIN), true; - } - if (eLimit == eLimit_Max) - { - return fVal = float(TIntTraits::nMAX), true; - } - if (eLimit == eLimit_Step) - { - return fVal = 1.f, true; - } - return false; - } - - // Override to allow int conversion - virtual bool FromValue(void* data, const void* value, const CTypeInfo& typeVal) const - { return ConvertInt(*(T*)data, value, typeVal); } - virtual bool ToValue(const void* data, void* value, const CTypeInfo& typeVal) const - { return ConvertInt(value, typeVal, *(const T*)data); } -}; - -//--------------------------------------------------------------------------- -// Store any type, such as an enum, in a small int. - -template -struct TRangedType -{ - typedef TRangedType TThis; - - TRangedType(T init = T(nDEFAULT)) - : m_Val(init) - { - CheckRange(m_Val); - } - - operator T() const - { - return m_Val; - } - - CUSTOM_STRUCT_INFO(CCustomInfo) - -protected: - T m_Val; - - static bool HasMin() - { return nMIN > INT_MIN; } - static bool HasMax() - { return nMAX < INT_MAX; } - - static bool CheckRange(T& val) - { - if (HasMin() && val < T(nMIN)) - { - val = T(nMIN); - return false; - } - else if (HasMax() && val > T(nMAX)) - { - val = T(nMAX); - return false; - } - return true; - } - - // Adaptor TypeInfo for specifying limits, and implementing range checking - struct CCustomInfo - : TProxyTypeInfo - { - CCustomInfo() - : TProxyTypeInfo(::TypeInfo((T*) 0).Name) - {} - - virtual bool GetLimit(ENumericLimit eLimit, float& fVal) const - { - if (eLimit == eLimit_Min && HasMin()) - { - return fVal = T(nMIN), true; - } - if (eLimit == eLimit_Max && HasMax()) - { - return fVal = T(nMAX), true; - } - return ::TypeInfo((T*)0).GetLimit(eLimit, fVal); - } - }; -}; - -//--------------------------------------------------------------------------- -// Store any type, such as an enum, in a small int. - -template -struct TSmall -{ - typedef TSmall TThis; - typedef T TValue; - - inline TSmall(T val = T(nDefault)) - { - set(val); - } - void set(T val = T(nDefault)) - { - m_Val = S(val) - S(nOffset); - - // The unary operator+() forces integer promotion to happen and thus - // induces a call to operator T(), which allows the equality operator to work. - assert(+(*this) == val); - } - - inline operator T() const - { return T(T(m_Val) + nOffset); } - inline T operator +() const - { return T(T(m_Val) + nOffset); } - - CUSTOM_STRUCT_INFO(CCustomInfo) - -protected: - S m_Val; - - struct CCustomInfo - : TProxyTypeInfo - { - CCustomInfo() - : TProxyTypeInfo("TSmall<>") - {} - - virtual bool GetLimit(ENumericLimit eLimit, float& fVal) const - { - if (eLimit == eLimit_Min) - { - return fVal = float(TIntTraits::nMIN + nOffset), true; - } - if (eLimit == eLimit_Max) - { - return fVal = float(TIntTraits::nMAX + nOffset), true; - } - if (eLimit == eLimit_Step) - { - return fVal = 1.f, true; - } - return false; - } - }; -}; - -//--------------------------------------------------------------------------- -// Quantise a float linearly in an int. -template::nMAX, bool bTRUNC = false> -struct TFixed -{ - typedef float TValue; - - inline TFixed() - : m_Store(0) - {} - - inline TFixed(float fIn) - { - float fStore = ToStore(fIn); - fStore = clamp_tpl(fStore, float(TIntTraits::nMIN_FACTOR * nQUANT), float(nQUANT)); - m_Store = bTRUNC ? S(fStore) : fStore < 0.f ? S(fStore - 0.5f) : S(fStore + 0.5f); - } - - // Conversion. - inline operator float() const - { return FromStore(m_Store); } - inline float operator +() const - { return FromStore(m_Store); } - inline bool operator !() const - { return !m_Store; } - - inline bool operator ==(const TFixed& x) const - { return m_Store == x.m_Store; } - inline bool operator ==(float x) const - { return m_Store == TFixed(x); } - inline S GetStore() const - { return m_Store; } - - static S GetMaxStore() - { return nQUANT; } - static float GetMaxValue() - { return float(nLIMIT); } - - CUSTOM_STRUCT_INFO(CCustomInfo) - -protected: - S m_Store; - - typedef TFixed TThis; - - static const int nMAX = nLIMIT; - static const int nMIN = TIntTraits::nMIN_FACTOR * nLIMIT; - - static inline float ToStore(float f) - { return f * float(nQUANT) / float(nLIMIT); } - static inline float FromStore(float f) - { return f * float(nLIMIT) / float(nQUANT); } - - // TypeInfo implementation. - struct CCustomInfo - : TProxyTypeInfo - { - CCustomInfo() - : TProxyTypeInfo("TFixed<>") - {} - - virtual bool GetLimit(ENumericLimit eLimit, float& fVal) const - { - if (eLimit == eLimit_Min) - { - return fVal = float(nMIN), true; - } - if (eLimit == eLimit_Max) - { - return fVal = float(nMAX), true; - } - if (eLimit == eLimit_Step) - { - return fVal = FromStore(1.f), true; - } - return false; - } - - // Override ToString: Limit to significant digits. - virtual AZStd::string ToString(const void* data, FToString flags = 0, const void* def_data = 0) const - { - if (!HasString(*(const S*)data, flags, def_data)) - { - return AZStd::string(); - } - static int digits = int_ceil(log10f(float(nQUANT))); - return NumToString(*(const TFixed*)data, 1, digits + 3, true); - } - }; -}; - - -// Define the canonical float-to-byte quantisation. -typedef TFixed UnitFloat8; - -#ifdef COMPRESSED_FLOATS - -//--------------------------------------------------------------------------- -// A floating point number, with templated storage size (and sign), and number of exponent bits -template -struct TFloat -{ - typedef float TValue; - - ILINE TFloat() - : m_Store(0) - {} - - ILINE TFloat(float fIn) - : m_Store(FromFloat(fIn)) - {} - - ILINE operator float() const - { return ToFloat(m_Store); } - ILINE float operator +() const - { return ToFloat(m_Store); } - - ILINE bool operator !() const - { return !m_Store; } - - ILINE bool operator ==(TFloat x) const - { return m_Store == x.m_Store; } - ILINE bool operator ==(float x) const - { return float(*this) == x; } - - inline TFloat& operator *=(float x) - { return *this = *this * x; } - - ILINE uint32 partial_float_conversion() const - { return (0 == m_Store) ? 0 : ToFloatCore(m_Store); } - - STATIC_CONST(float, fMAX, ToFloat(TIntTraits::nMAX)); - STATIC_CONST(float, fPOS_MIN, ToFloat(1 << nMANT_BITS)); - STATIC_CONST(float, fMIN, -fMAX() * (float)TIntTraits::bSIGNED); - - CUSTOM_STRUCT_INFO(CCustomInfo) - -protected: - S m_Store; - - typedef TFloat TThis; - - static const S nBITS = sizeof(S) * 8; - static const S nSIGN = TIntTraits::bSIGNED; - static const S nMANT_BITS = nBITS - nEXP_BITS - nSIGN; - static const S nSIGN_MASK = S(nSIGN << (nBITS - 1)); - static const S nMANT_MASK = (S(1) << nMANT_BITS) - 1; - static const S nEXP_MASK = ~S(nMANT_MASK | nSIGN_MASK); - static const int nEXP_MAX = 1 << (nEXP_BITS - 1), - nEXP_MIN = 1 - nEXP_MAX; - - STATIC_CONST(float, fROUNDER, 1.f + fPOS_MIN() * 0.5f); - - static inline S FromFloat(float fIn) - { - static_assert(sizeof(S) <= 4); - static_assert(nEXP_BITS > 0 && nEXP_BITS <= 8 && nEXP_BITS < sizeof(S) * 8 - 4); - - // Clamp to allowed range. - float fClamped = clamp_tpl(fIn * fROUNDER(), fMIN(), fMAX()); - - // Bit shift to convert from IEEE float32. - uint32 uBits = *(const uint32*)&fClamped; - - // Convert exp. - int32 iExp = (uBits >> 23) & 0xFF; - iExp -= 127 + nEXP_MIN; - IF (iExp < 0, 0) - { - // Underflow. - return 0; - } - - // Reduce mantissa. - uint32 uMant = uBits >> (23 - nMANT_BITS); - - S bits = (uMant & nMANT_MASK) - | (iExp << nMANT_BITS) - | ((uBits >> (32 - nBITS)) & nSIGN_MASK); - - #ifdef _DEBUG - fIn = clamp_tpl(fIn, fMIN(), fMAX()); - float fErr = fabs(ToFloat(bits) - fIn); - float fMaxErr = fabs(fIn) / float(1 << nMANT_BITS); - assert(fErr <= fMaxErr); - #endif - - return bits; - } - - static inline uint32 ToFloatCore(S bits) - { - // Extract FP components. - uint32 uBits = bits & nMANT_MASK, - uExp = (bits & ~nSIGN_MASK) >> nMANT_BITS, - uSign = bits & nSIGN_MASK; - - // Shift to 32-bit. - uBits <<= 23 - nMANT_BITS; - uBits |= (uExp + 127 + nEXP_MIN) << 23; - uBits |= uSign << (32 - nBITS); - - return uBits; - } - - static ILINE float ToFloat(S bits) - { - IF (bits == 0, 0) - { - return 0.f; - } - - uint32 uBits = ToFloatCore(bits); - return *(float*)&uBits; - } - - // TypeInfo implementation. - struct CCustomInfo - : TProxyTypeInfo - { - CCustomInfo() - : TProxyTypeInfo("TFloat<>") - {} - - virtual bool GetLimit(ENumericLimit eLimit, float& fVal) const - { - if (eLimit == eLimit_Min) - { - return fVal = fMIN(), true; - } - if (eLimit == eLimit_Max) - { - return fVal = fMAX(), true; - } - if (eLimit == eLimit_Step) - { - return fVal = fPOS_MIN(), true; - } - return false; - } - - // Override ToString: Limit to significant digits. - virtual string ToString(const void* data, FToString flags = 0, const void* def_data = 0) const - { - if (!HasString(*(const S*)data, flags, def_data)) - { - return string(); - } - static int digits = int_ceil(log10f(1 << nMANT_BITS)); - return NumToString(*(const TFloat*)data, 1, digits + 3, true); - } - }; -}; - -// Canonical float16 types, with range ~= 64K. -typedef TFloat SFloat16; -typedef TFloat UFloat16; - -template -ILINE T partial_float_cast(const SFloat16& s) { return static_cast(s.partial_float_conversion()); } - -template -ILINE T partial_float_cast(const UFloat16& u) { return static_cast(u.partial_float_conversion()); } - -#ifdef _DEBUG - -// Classes for unit tests. -template -void TestValues(T val) -{ - T2 val2 = val; - T2 val2c; - - bool b = TypeInfo(&val2c).FromValue(&val2c, val); - assert(b); - assert(val2 == val2c); - b = TypeInfo(&val2c).ToValue(&val2c, val); - assert(b); - assert(val2 == T2(val)); -} - -template -void TestTypes(T val) -{ - T2 val2 = val; - string s = TypeInfo(&val2).ToString(&val2); - bool b = TypeInfo(&val).FromString(&val, s); - assert(b); - assert(val2 == T2(val)); - - TestValues(val); -} - -template -void TestType(T val) -{ - TestTypes(val); -} - -#endif // _DEBUG - -#endif // COMPRESSED_FLOATS - -//--------------------------------------------------------------------------- -// TypeInfo for enums - -//--------------------------------------------------------------------------- -// Implement data features based on enum definition -/* - interface EnumDef - { - typedef TInt; - uint Count(); - TInt Value(uint i); - cstr Name(uint i); - bool MatchName(uint i, cstr str); - cstr ToName(TInt value); - } const -*/ - -template -struct TEnumInfo - : TIntTypeInfo - , TEnumDef -{ - TEnumInfo(cstr name) - : TIntTypeInfo(name) {} - - virtual cstr EnumElem(uint nIndex) const - { - if (nIndex < TEnumDef::Count()) - { - cstr name = TEnumDef::Name(nIndex); - if (*name != '_') - { - return name; - } - } - return 0; - } - - virtual bool FromValue(void* data, const void* value, const CTypeInfo& typeVal) const - { - TInt val; - if (ConvertInt(val, value, typeVal)) - { - if (TEnumDef::ToName(val)) - { - return *(TInt*)data = val, true; - } - } - return false; - } - - virtual AZStd::string ToString(const void* data, FToString flags, const void* def_data) const - { - TInt val = *(const TInt*)(data); - if (flags.SkipDefault && val == (def_data ? *(const TInt*)def_data : TInt(0))) - { - return AZStd::string(); - } - - if (cstr sName = TEnumDef::ToName(val)) - { - return sName; - } - - // Unmatched value, return as number. - return ::ToString(val); - } - - virtual bool FromString(void* data, cstr str, FFromString flags) const - { - if (!*str) - { - if (!flags.SkipEmpty) - { - *(TInt*)data = (TInt)0; - } - return true; - } - - for (int i = 0, count = TEnumDef::Count(); i < count; i++) - { - if (TEnumDef::MatchName(i, str)) - { - return *(TInt*)data = check_cast(TEnumDef::Value(i)), true; - } - } - - // No match, attempt numeric or bool conversion. - if (::FromString(*(TInt*)data, str)) - { - return true; - } - - bool b; - if (::FromString(b, str)) - { - return *(TInt*)data = b, true; - } - - return false; - } -}; - -//--------------------------------------------------------------------------- -// TypeInfo for regular enums - -struct CSimpleEnumDef -{ - void Init(Array names, char* enum_str); - - // TEnumDef implementations - ILINE uint Count() const - { return asNames.size(); } - ILINE static uint Value(uint i) - { return i; } - ILINE cstr Name(uint i) const - { return asNames[i]; } - ILINE bool MatchName(uint i, cstr str) const - { - cstr name = asNames[i]; - if (*name == '_') - { - name++; - } - return azstricmp(name, str) == 0; - } - ILINE cstr ToName(uint value) const - { - if (value < Count()) - { - return asNames[value]; - } - return 0; - } - -protected: - - Array asNames; -}; - -struct CSimpleEnumInfo - : TEnumInfo -{ - CSimpleEnumInfo(cstr name, Array names, char* enum_str) - : TEnumInfo(name) - { - Init(names, enum_str); - } -}; - -// Define a regular small enum with TypeInfo - -#define DEFINE_ENUM_VALUE(EType, E, TInt) \ - TInt Value; \ - ILINE EType(E val = E(0)) \ - : Value(aznumeric_caster(val)) {} \ - ILINE operator E() const { return E(Value); } \ - ILINE E operator +() const { return E(Value); } \ - -#define DEFINE_ENUM(EType, ...) \ - struct EType \ - { \ - enum E { __VA_ARGS__, _count }; \ - typedef uint8 TInt; \ - DEFINE_ENUM_VALUE(EType, E, TInt) \ - ILINE static uint Count() { return _count; } \ - static const CSimpleEnumInfo& TypeInfo() { \ - static cstr names[_count]; \ - static char enum_str[] = #__VA_ARGS__; \ - static CSimpleEnumInfo info( #EType, Array(&names[0], _count), enum_str); \ - return info; \ - } \ - }; - -//--------------------------------------------------------------------------- -// TypeInfo for irregular enums - -struct CEnumDef -{ - typedef int64 TValue; - - struct SElem - { - TValue Value; - cstr Name; - }; - - void Init(Array elems, char* enum_str = 0); - - // TEnumDef implementations - ILINE uint Count() const - { return Elems.size(); } - ILINE TValue Value(uint i) const - { return Elems[i].Value; } - ILINE cstr Name(uint i) const - { return *Elems[i].Name ? Elems[i].Name + nPrefixLength : ""; } - bool MatchName(uint i, cstr str) const; - cstr ToName(TValue val) const; - - struct SInit - { - static LegacyDynArray* s_pElems; - - static void Init(LegacyDynArray& elems) - { - s_pElems = &elems; - } - SInit() - { - TValue val = s_pElems->empty() ? 0 : s_pElems->back().Value + 1; - s_pElems->push_back()->Value = val; - } - SInit(TValue val) - { - s_pElems->push_back()->Value = val; - } - }; - -protected: - - Array Elems; - TValue MinValue; - bool bRegular; - uint nPrefixLength; -}; - -template -struct CEnumInfo - : TEnumInfo -{ - CEnumInfo(cstr name, Array elems, char* enum_str = 0) - : TEnumInfo(name) - { - CEnumDef::Init(elems, enum_str); - } -}; - -struct CEnumDefUuid - : public TTypeInfo -{ - struct SElem - { - AZ::Uuid Value; - cstr Name; - }; - - CEnumDefUuid(cstr name, Array elems, char* enum_str = 0) - : TTypeInfo(name) - { - CEnumDefUuid::Init(elems, enum_str); - } - void Init(Array elems, char* enum_str = 0); - - // TEnumDef implementations - ILINE uint Count() const - { - return Elems.size(); - } - ILINE AZ::Uuid Value(uint i) const - { - return Elems[i].Value; - } - ILINE cstr Name(uint i) const - { - return *Elems[i].Name ? Elems[i].Name + nPrefixLength : ""; - } - bool MatchName(uint i, cstr str) const; - cstr ToName(AZ::Uuid val) const; - - cstr EnumElem(uint nIndex) const override - { - if (nIndex < Count()) - { - cstr name = Name(nIndex); - if (*name != '_') - { - return name; - } - } - return 0; - } - - bool FromValue(void* data, const void* value, const CTypeInfo& typeVal) const override - { - if (&typeVal == this) - { - const AZ::Uuid& valueUuid = *reinterpret_cast(value); - if (ToName(valueUuid)) - { - AZ::Uuid& dataUuid = *reinterpret_cast(data); - dataUuid = valueUuid; - return true; - } - } - return false; - } - - AZStd::string ToString(const void* data, FToString flags, const void* def_data) const override - { - const AZ::Uuid& uuidData = *reinterpret_cast(data); - const AZ::Uuid& defUuidData = *reinterpret_cast(def_data); - if (flags.SkipDefault && uuidData == (def_data ? defUuidData : AZ::Uuid::CreateNull())) - { - return AZStd::string(); - } - - if (cstr sName = ToName(uuidData)) - { - return sName; - } - - return AZStd::string(); - } - - bool FromString(void* data, cstr str, FFromString flags) const override - { - AZ::Uuid& uuidData = *reinterpret_cast(data); - if (!*str) - { - if (!flags.SkipEmpty) - { - uuidData = AZ::Uuid::CreateNull(); - } - return true; - } - - for (int i = 0, count = Count(); i < count; i++) - { - if (MatchName(i, str)) - { - uuidData = Value(i); - return true; - } - } - - return false; - } - -protected: - - Array Elems; - bool bRegular; - uint nPrefixLength; -}; - -#endif // CRYINCLUDE_CRYCOMMON_CRYCUSTOMTYPES_H diff --git a/Code/Legacy/CryCommon/CryHalf.inl b/Code/Legacy/CryCommon/CryHalf.inl index b0d322f418..a9683540e1 100644 --- a/Code/Legacy/CryCommon/CryHalf.inl +++ b/Code/Legacy/CryCommon/CryHalf.inl @@ -141,7 +141,6 @@ struct CryHalf2 void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const {} - AUTO_STRUCT_INFO }; struct CryHalf4 @@ -197,7 +196,6 @@ struct CryHalf4 void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const {} - AUTO_STRUCT_INFO }; #endif // #ifndef CRY_HALF_INL diff --git a/Code/Legacy/CryCommon/CryHalf_info.h b/Code/Legacy/CryCommon/CryHalf_info.h deleted file mode 100644 index 8e4105f8b2..0000000000 --- a/Code/Legacy/CryCommon/CryHalf_info.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYHALF_INFO_H -#define CRYINCLUDE_CRYCOMMON_CRYHALF_INFO_H -#pragma once - -#include "CryHalf.inl" - -STRUCT_INFO_BEGIN(CryHalf2) -STRUCT_VAR_INFO(x, TYPE_INFO(CryHalf)) -STRUCT_VAR_INFO(y, TYPE_INFO(CryHalf)) -STRUCT_INFO_END(CryHalf2) - -STRUCT_INFO_BEGIN(CryHalf4) -STRUCT_VAR_INFO(x, TYPE_INFO(CryHalf)) -STRUCT_VAR_INFO(y, TYPE_INFO(CryHalf)) -STRUCT_VAR_INFO(z, TYPE_INFO(CryHalf)) -STRUCT_VAR_INFO(w, TYPE_INFO(CryHalf)) -STRUCT_INFO_END(CryHalf4) - -#endif // CRYINCLUDE_CRYCOMMON_CRYHALF_INFO_H diff --git a/Code/Legacy/CryCommon/CryHeaders.h b/Code/Legacy/CryCommon/CryHeaders.h deleted file mode 100644 index 49ea28ee0e..0000000000 --- a/Code/Legacy/CryCommon/CryHeaders.h +++ /dev/null @@ -1,1506 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYHEADERS_H -#define CRYINCLUDE_CRYCOMMON_CRYHEADERS_H -#pragma once - - -#include "BaseTypes.h" -#include "Cry_Math.h" - -#ifdef MAX_SUB_MATERIALS -// This checks that the values are in sync in the different files. -static_assert(MAX_SUB_MATERIALS == 128); -#else - #define MAX_SUB_MATERIALS 128 -#endif - -#include "CryEndian.h" - -// Chunk type must fit into uint16 -enum ChunkTypes -{ - ChunkType_ANY = 0, - - ChunkType_Mesh = 0x1000, // was 0xCCCC0000 in chunk files with versions <= 0x745 - ChunkType_Helper, - ChunkType_VertAnim, - ChunkType_BoneAnim, - ChunkType_GeomNameList, // obsolete - ChunkType_BoneNameList, - ChunkType_MtlList, // obsolete - ChunkType_MRM, // obsolete - ChunkType_SceneProps, // obsolete - ChunkType_Light, // obsolete - ChunkType_PatchMesh, // not implemented - ChunkType_Node, - ChunkType_Mtl, // obsolete - ChunkType_Controller, - ChunkType_Timing, - ChunkType_BoneMesh, - ChunkType_BoneLightBinding, // obsolete. describes the lights binded to bones - ChunkType_MeshMorphTarget, // describes a morph target of a mesh chunk - ChunkType_BoneInitialPos, // describes the initial position (4x3 matrix) of each bone; just an array of 4x3 matrices - ChunkType_SourceInfo, // describes the source from which the cgf was exported: source max file, machine and user - ChunkType_MtlName, // material name - ChunkType_ExportFlags, // Special export flags. - ChunkType_DataStream, // Stream data. - ChunkType_MeshSubsets, // Array of mesh subsets. - ChunkType_MeshPhysicsData, // Physicalized mesh data. - - // these are the new compiled chunks for characters - ChunkType_CompiledBones = 0x2000, // was 0xACDC0000 in chunk files with versions <= 0x745 - ChunkType_CompiledPhysicalBones, - ChunkType_CompiledMorphTargets, - ChunkType_CompiledPhysicalProxies, - ChunkType_CompiledIntFaces, - ChunkType_CompiledIntSkinVertices, - ChunkType_CompiledExt2IntMap, - - ChunkType_BreakablePhysics = 0x3000, // was 0xAAFC0000 in chunk files with versions <= 0x745 - ChunkType_FaceMap, // obsolete - ChunkType_MotionParameters, - ChunkType_FootPlantInfo, // obsolete - ChunkType_BonesBoxes, - ChunkType_FoliageInfo, - ChunkType_Timestamp, - ChunkType_GlobalAnimationHeaderCAF, - ChunkType_GlobalAnimationHeaderAIM, - ChunkType_BspTreeData -}; - -enum ECgfStreamType -{ - CGF_STREAM_POSITIONS, - CGF_STREAM_NORMALS, - CGF_STREAM_TEXCOORDS, - CGF_STREAM_COLORS, - CGF_STREAM_COLORS2, - CGF_STREAM_INDICES, - CGF_STREAM_TANGENTS, - CGF_STREAM_DUMMY0_, // used to be CGF_STREAM_SHCOEFFS, dummy is needed to keep existing assets loadable - CGF_STREAM_DUMMY1_, // used to be CGF_STREAM_SHAPEDEFORMATION, dummy is needed to keep existing assets loadable - CGF_STREAM_BONEMAPPING, - CGF_STREAM_FACEMAP, - CGF_STREAM_VERT_MATS, - CGF_STREAM_QTANGENTS, - CGF_STREAM_SKINDATA, - CGF_STREAM_DUMMY2_, // used to be old console specific, dummy is needed to keep existing assets loadable - CGF_STREAM_P3S_C4B_T2S, - CGF_STREAM_NUM_TYPES -}; - -////////////////////////////////////////////////////////////////////////// -enum EPhysicsGeomType -{ - PHYS_GEOM_TYPE_NONE = -1, - PHYS_GEOM_TYPE_DEFAULT = 0x1000 + 0, - PHYS_GEOM_TYPE_NO_COLLIDE = 0x1000 + 1, - PHYS_GEOM_TYPE_OBSTRUCT = 0x1000 + 2, - - PHYS_GEOM_TYPE_DEFAULT_PROXY = 0x1000 + 0x100, // Default physicalization, but only proxy (NoDraw geometry). -}; - -struct CryVertex -{ - Vec3 p; //position - Vec3 n; //normal vector - - AUTO_STRUCT_INFO -}; - -struct CryFace -{ - int v0, v1, v2; //vertex indices - int MatID; //mat ID - - int& operator [] (int i) {return (&v0)[i]; } - int operator [] (int i) const {return (&v0)[i]; } - bool isDegenerate () const {return v0 == v1 || v1 == v2 || v2 == v0; } - - AUTO_STRUCT_INFO -}; - -struct CryUV -{ - float u, v; //texture coordinates - AUTO_STRUCT_INFO -}; - -struct CrySkinVtx -{ - int bVolumetric; - int idx[4]; - float w[4]; - Matrix33 M; - - AUTO_STRUCT_INFO -}; - -////////////////////////////////////////////////////////////////////////// -struct CryLink -{ - int BoneID; - Vec3 offset; - float Blending; - - AUTO_STRUCT_INFO -}; - -struct CryIRGB -{ - unsigned char r, g, b; - AUTO_STRUCT_INFO -}; - -struct NAME_ENTITY -{ - char name[64]; -}; - -struct phys_geometry; - -struct CryBonePhysics -{ - phys_geometry* pPhysGeom; // id of a separate mesh for this bone // MUST not be in File Structures!!! - // additional joint parameters - int flags; - float min[3], max[3]; - float spring_angle[3]; - float spring_tension[3]; - float damping[3]; - float framemtx[3][3]; -}; - -// the compatible between 32- and 64-bits structure -struct CryBonePhysics_Comp -{ - int nPhysGeom; // id of a separate mesh for this bone - // additional joint parameters - int flags; - float min[3], max[3]; - float spring_angle[3]; - float spring_tension[3]; - float damping[3]; - float framemtx[3][3]; - - AUTO_STRUCT_INFO -}; - -#define __copy3(MEMBER) left.MEMBER[0] = right.MEMBER[0]; left.MEMBER[1] = right.MEMBER[1]; left.MEMBER[2] = right.MEMBER[2]; -inline void CopyPhysInfo(CryBonePhysics& left, const CryBonePhysics_Comp& right) -{ - left.pPhysGeom = (phys_geometry*)(INT_PTR)right.nPhysGeom; - left.flags = right.flags; - __copy3(min); - __copy3(max); - __copy3(spring_angle); - __copy3(spring_tension); - __copy3(damping); - __copy3(framemtx[0]); - __copy3(framemtx[1]); - __copy3(framemtx[2]); -} -inline void CopyPhysInfo(CryBonePhysics_Comp& left, const CryBonePhysics& right) -{ - left.nPhysGeom = (int)(INT_PTR)right.pPhysGeom; - left.flags = right.flags; - __copy3(min); - __copy3(max); - __copy3(spring_angle); - __copy3(spring_tension); - __copy3(damping); - __copy3(framemtx[0]); - __copy3(framemtx[1]); - __copy3(framemtx[2]); -} -#undef __copy3 - -struct CryBoneDescData -{ - unsigned int m_nControllerID; // unic id of bone (generated from bone name in the max) - - // [Sergiy] physics info for different lods - // lod 0 is the physics of alive body, lod 1 is the physics of a dead body - CryBonePhysics m_PhysInfo[2]; - float m_fMass; - - Matrix34 m_DefaultW2B; //intitalpose matrix World2Bone - Matrix34 m_DefaultB2W; //intitalpose matrix Bone2World - - enum - { - kBoneNameMaxSize = 256, - }; - char m_arrBoneName[CryBoneDescData::kBoneNameMaxSize]; - - int m_nLimbId; // set by model state class - - // this bone parent is this[m_nOffsetParent], 0 if the bone is root. Normally this is <= 0 - int m_nOffsetParent; - - // The whole hierarchy of bones is kept in one big array that belongs to the ModelState - // Each bone that has children has its own range of bone objects in that array, - // and this points to the beginning of that range and defines the number of bones. - unsigned m_numChildren; - // the beginning of the subarray of children is at this[m_nOffsetChildren] - // this is 0 if there are no children - int m_nOffsetChildren; -}; - -struct CryBoneDescData_Comp -{ - unsigned int m_nControllerID; // unique id of bone (generated from bone name) - - // [Sergiy] physics info for different lods - // lod 0 is the physics of alive body, lod 1 is the physics of a dead body - CryBonePhysics_Comp m_PhysInfo[2]; - float m_fMass; - - Matrix34 m_DefaultW2B; //intitalpose matrix World2Bone - Matrix34 m_DefaultB2W; //intitalpose matrix Bone2World - - char m_arrBoneName[256]; - - int m_nLimbId; // set by model state class - - // this bone parent is this[m_nOffsetParent], 0 if the bone is root. Normally this is <= 0 - int m_nOffsetParent; - - // The whole hierarchy of bones is kept in one big array that belongs to the ModelState - // Each bone that has children has its own range of bone objects in that array, - // and this points to the beginning of that range and defines the number of bones. - unsigned m_numChildren; - // the beginning of the subarray of children is at this[m_nOffsetChildren] - // this is 0 if there are no children - int m_nOffsetChildren; - - AUTO_STRUCT_INFO -}; - -inline void CopyBoneDescData(CryBoneDescData_Comp& left, const CryBoneDescData& right) -{ - left.m_nControllerID = right.m_nControllerID; - - CopyPhysInfo(left.m_PhysInfo[0], right.m_PhysInfo[0]); - CopyPhysInfo(left.m_PhysInfo[1], right.m_PhysInfo[1]); - - left.m_fMass = right.m_fMass; - left.m_DefaultW2B = right.m_DefaultW2B; - left.m_DefaultB2W = right.m_DefaultB2W; - memcpy(left.m_arrBoneName, right.m_arrBoneName, sizeof(left.m_arrBoneName)); - left.m_nLimbId = right.m_nLimbId; - left.m_nOffsetParent = right.m_nOffsetParent; - left.m_numChildren = right.m_numChildren; - left.m_nOffsetChildren = right.m_nOffsetChildren; -} - -struct BONE_ENTITY -{ - int BoneID; - int ParentID; - int nChildren; - - // Id of controller (CRC32 From name of bone). - unsigned int ControllerID; - - char prop[32]; - CryBonePhysics_Comp phys; - - AUTO_STRUCT_INFO -}; - -struct KEY_HEADER -{ - int KeyTime; //in ticks - AUTO_STRUCT_INFO -}; - -struct RANGE_ENTITY -{ - char name[32]; - int start; - int end; - AUTO_STRUCT_INFO -}; - -//======================================== -//Timing Chunk Header -//======================================== -struct TIMING_CHUNK_DESC_0918 -{ - enum - { - VERSION = 0x0918 - }; - - f32 m_SecsPerTick; // seconds/ticks - int32 m_TicksPerFrame; // ticks/Frame - - RANGE_ENTITY global_range; // covers all of the time ranges - int qqqqnSubRanges; - - AUTO_STRUCT_INFO -}; - - -struct SPEED_CHUNK_DESC_2 -{ - enum - { - VERSION = 0x0922 - }; - - float Speed; - float Distance; - float Slope; - uint32 AnimFlags; - f32 MoveDir[3]; - QuatT StartPosition; - AUTO_STRUCT_INFO -}; - - -struct MotionParams905 -{ - uint32 m_nAssetFlags; - uint32 m_nCompression; - - int32 m_nTicksPerFrame; - f32 m_fSecsPerTick; - int32 m_nStart; - int32 m_nEnd; - - f32 m_fMoveSpeed; - f32 m_fTurnSpeed; - f32 m_fAssetTurn; - f32 m_fDistance; - f32 m_fSlope; - - QuatT m_StartLocation; - QuatT m_EndLocation; - - f32 m_LHeelStart, m_LHeelEnd; - f32 m_LToe0Start, m_LToe0End; - f32 m_RHeelStart, m_RHeelEnd; - f32 m_RToe0Start, m_RToe0End; - - MotionParams905() - { - m_nAssetFlags = 0; - m_nCompression = std::numeric_limits::max(); - m_nTicksPerFrame = 0; - m_fSecsPerTick = 0; - m_nStart = 0; - m_nEnd = 0; - - m_fMoveSpeed = -1; - m_fTurnSpeed = -1; - m_fAssetTurn = -1; - m_fDistance = -1; - m_fSlope = -1; - - m_LHeelStart = -1; - m_LHeelEnd = -1; - m_LToe0Start = -1; - m_LToe0End = -1; - m_RHeelStart = -1; - m_RHeelEnd = -1; - m_RToe0Start = -1; - m_RToe0End = -1; - - m_StartLocation.SetIdentity(); - m_EndLocation.SetIdentity(); - } -}; - - -struct CHUNK_MOTION_PARAMETERS -{ - enum - { - VERSION = 0x0925 - }; - - MotionParams905 mp; -}; - - - -struct CHUNK_GAHCAF_INFO -{ - enum - { - VERSION = 0x0971 - }; - enum - { - FILEPATH_SIZE = 256 - }; - - uint32 m_Flags; - char m_FilePath[FILEPATH_SIZE]; - uint32 m_FilePathCRC32; - uint32 m_FilePathDBACRC32; - - f32 m_LHeelStart, m_LHeelEnd; - f32 m_LToe0Start, m_LToe0End; - f32 m_RHeelStart, m_RHeelEnd; - f32 m_RToe0Start, m_RToe0End; - - f32 m_fStartSec; //asset-feature: Start time in seconds. - f32 m_fEndSec; //asset-feature: End time in seconds. - f32 m_fTotalDuration; //asset-feature: asset-feature: total duration in seconds. - uint32 m_nControllers; - - //locator information - QuatT m_StartLocation; - QuatT m_LastLocatorKey; - Vec3 m_vVelocity; //asset-feature: the velocity vector for this asset - f32 m_fDistance; //asset-feature: the absolute distance this objects is moving - f32 m_fSpeed; //asset-feature: speed (meters in second) - f32 m_fSlope; //asset-feature: uphill-downhill measured in degrees - f32 m_fTurnSpeed; //asset-feature: turning speed per second - f32 m_fAssetTurn; //asset-feature: radiant between first and last frame -}; - - - - -struct CHUNK_GAHAIM_INFO -{ - struct VirtualExampleInit2 - { - Vec2 polar; - uint8 i0, i1, i2, i3; - f32 w0, w1, w2, w3; - }; - struct VirtualExample - { - uint8 i0, i1, i2, i3; - int16 v0, v1, v2, v3; - }; - - enum - { - VERSION = 0x0970 - }; - enum - { - XGRID = 17 - }; - enum - { - YGRID = 9 - }; - enum - { - FILEPATH_SIZE = 256 - }; - - uint32 m_Flags; - char m_FilePath[FILEPATH_SIZE]; - uint32 m_FilePathCRC32; - - f32 m_fStartSec; //asset-feature: Start time in seconds. - f32 m_fEndSec; //asset-feature: End time in seconds. - f32 m_fTotalDuration; //asset-feature: asset-feature: total duration in seconds. - - uint32 m_AnimTokenCRC32; - - uint64 m_nExist; - Quat m_MiddleAimPoseRot; - Quat m_MiddleAimPose; - VirtualExample m_PolarGrid[XGRID * YGRID]; - uint32 m_numAimPoses; -}; - - -//======================================== -//Material Chunk Header -//======================================== - -////////////////////////////////////////////////////////////////////////// -#define MTL_NAME_CHUNK_DESC_0800_MAX_SUB_MATERIALS (32) -struct MTL_NAME_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - enum EFlags - { - FLAG_MULTI_MATERIAL = 0x0001, // Have sub materials info. - FLAG_SUB_MATERIAL = 0x0002, // This is sub material. - FLAG_SH_COEFFS = 0x0004, // This material should get spherical harmonics coefficients computed. - FLAG_SH_2SIDED = 0x0008, // This material will be used as 2 sided in the sh precomputation - FLAG_SH_AMBIENT = 0x0010, // This material will get an ambient sh term(to not shadow it entirely) - }; - - int nFlags; // see EFlags. - int nFlags2; - char name[128]; //material/shader name - int nPhysicalizeType; - int nSubMaterials; - int nSubMatChunkId[MTL_NAME_CHUNK_DESC_0800_MAX_SUB_MATERIALS]; - int nAdvancedDataChunkId; - float sh_opacity; - int reserve[32]; - - AUTO_STRUCT_INFO -}; - -struct MTL_NAME_CHUNK_DESC_0802 -{ - enum - { - VERSION = 0x0802 - }; - - char name[128]; //material/shader name - int nSubMaterials; - - // Data continues from here. - // 1) if nSubMaterials is 0, this is a single-material: we store physicalization type of the material (int32). - // 2) if nSubMaterials is not 0, this is a multi-material: we store nSubMaterials physicalization types (int32 - // value for each sub-material). After the physicalization types we store chain of ASCIIZ names of sub-materials. - - AUTO_STRUCT_INFO -}; - -//======================================== -//Mesh Chunk Header -//======================================== - -struct MESH_CHUNK_DESC_0745 -{ - // Versions 0x0744 and 0x0745 are *exactly* the same. - // Version number was increased from 0x0744 to 0x0745 just because - // it was the only way to inform *old* (existing) executables that - // NODE_CHUNK_DESC(!) chunk format was changed and cannot be read - // by them (old CLoaderCGF::LoadNodeChunk() didn't check - // NODE_CHUNK_DESC's version number). - enum - { - VERSION = 0x0745 - }; - enum - { - COMPATIBLE_OLD_VERSION = 0x0744 - }; - - enum EFlags1 - { - FLAG1_BONE_INFO = 0x01, - }; - enum EFlags2 - { - FLAG2_HAS_VERTEX_COLOR = 0x01, - FLAG2_HAS_VERTEX_ALPHA = 0x02, - FLAG2_HAS_TOPOLOGY_IDS = 0x04, - }; - unsigned char flags1; - unsigned char flags2; - int nVerts; - int nTVerts; // # of texture vertices (0 or nVerts) - int nFaces; - int VertAnimID; // id of the related vertAnim chunk if present. otherwise it is -1 - - AUTO_STRUCT_INFO -}; - -// Compiled Mesh chunk. -struct MESH_CHUNK_DESC_0801 -{ - // Versions 0x0800 and 0x0801 are *exactly* the same. - // Version number was increased from 0x0800 to 0x0801 just because - // it was the only way to inform *old* (existing) executables that - // NODE_CHUNK_DESC(!) chunk format was changed and cannot be read - // by them (old CLoaderCGF::LoadNodeChunk() didn't check - // NODE_CHUNK_DESC's version number). - enum - { - VERSION = 0x0801 - }; - enum - { - COMPATIBLE_OLD_VERSION = 0x0800 - }; - - enum EFlags - { - MESH_IS_EMPTY = 0x0001, // Empty mesh (no streams are saved) - HAS_TEX_MAPPING_DENSITY = 0x0002, // texMappingDensity contains a valid value - HAS_EXTRA_WEIGHTS = 0x0004, // The weight stream will have weights for influences 5-8 - HAS_FACE_AREA = 0x0008, // geometricMeanFaceArea contains a valid value - }; - - int nFlags; // @see EFlags - int nFlags2; - - // Just for info. - int nVerts; // Number of vertices. - int nIndices; // Number of indices. - int nSubsets; // Number of mesh subsets. - - int nSubsetsChunkId; // Chunk id of subsets. (Must be ChunkType_MeshSubsets) - int nVertAnimID; // id of the related vertAnim chunk if present. otherwise it is -1 - - // ChunkIDs of data streams (Must be ChunkType_DataStream). - int GetStreamChunkID(ECgfStreamType streamType, [[maybe_unused]] int streamIndex) const - { - // Ignore streamIndex since all chunks with version 0x0801 have only one stream per type - return nStreamChunkID[streamType]; - } - int nStreamChunkID[ECgfStreamType::CGF_STREAM_NUM_TYPES]; // Index is one of ECgfStreamType values. - - // Chunk IDs of physical mesh data. (Must be ChunkType_MeshPhysicsData) - int nPhysicsDataChunkId[4]; - - // Bounding box of the mesh. - Vec3 bboxMin; - Vec3 bboxMax; - - float texMappingDensity; - float geometricMeanFaceArea; - int reserved[31]; - AUTO_STRUCT_INFO -}; - -struct MESH_CHUNK_DESC_0802 -{ - // Version 0x0802 adds an additional dimention to the nStreamChunkID array to allow for multiple streams of the same type - enum - { - VERSION = 0x0802 - }; - enum - { - COMPATIBLE_OLD_VERSION = 0x0802 - }; - - enum EFlags - { - MESH_IS_EMPTY = 0x0001, // Empty mesh (no streams are saved) - HAS_TEX_MAPPING_DENSITY = 0x0002, // texMappingDensity contains a valid value - HAS_EXTRA_WEIGHTS = 0x0004, // The weight stream will have weights for influences 5-8 - HAS_FACE_AREA = 0x0008, // geometricMeanFaceArea contains a valid value - }; - - int nFlags; // @see EFlags - int nFlags2; - - // Just for info. - int nVerts; // Number of vertices. - int nIndices; // Number of indices. - int nSubsets; // Number of mesh subsets. - - int nSubsetsChunkId; // Chunk id of subsets. (Must be ChunkType_MeshSubsets) - int nVertAnimID; // id of the related vertAnim chunk if present. otherwise it is -1 - - // ChunkIDs of data streams (Must be ChunkType_DataStream). - int GetStreamChunkID(ECgfStreamType streamType, int streamIndex) const - { - return nStreamChunkID[streamType][streamIndex]; - } - int nStreamChunkID[ECgfStreamType::CGF_STREAM_NUM_TYPES][8]; // [ECgfStreamType value][streamIndex] e.g. [CGF_STREAM_TEXCOORDS][1] to get UV set 1 - - // Chunk IDs of physical mesh data. (Must be ChunkType_MeshPhysicsData) - int nPhysicsDataChunkId[4]; - - // Bounding box of the mesh. - Vec3 bboxMin; - Vec3 bboxMax; - - float texMappingDensity; - float geometricMeanFaceArea; - int reserved[31]; - AUTO_STRUCT_INFO -}; - - -////////////////////////////////////////////////////////////////////////// -// Stream chunk contains data about a mesh data stream (positions, normals, etc...) -////////////////////////////////////////////////////////////////////////// -struct STREAM_DATA_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - enum EFlags { }; // Not implemented. - - int nFlags; - int nStreamType; // Stream type one of ECgfStreamType. - int nCount; // Number of elements. - int nElementSize; // Element Size. - int reserved[2]; - - // Data starts here at the end of the chunk.. - //char streamData[nCount*nElementSize]; - - AUTO_STRUCT_INFO -}; - -struct STREAM_DATA_CHUNK_DESC_0801 -{ - enum - { - VERSION = 0x0801 - }; - - enum EFlags { }; // Not implemented. - - int nFlags; - int nStreamType; // Stream type one of ECgfStreamType. - int nStreamIndex; // To handle multiple streams of the same type - int nCount; // Number of elements. - int nElementSize; // Element Size. - int reserved[2]; - - // Data starts here at the end of the chunk.. - //char streamData[nCount*nElementSize]; - - AUTO_STRUCT_INFO -}; - -////////////////////////////////////////////////////////////////////////// -// Contains array of mesh subsets. -// Each subset holds an info about material id, indices ranges etc... -////////////////////////////////////////////////////////////////////////// -struct MESH_SUBSETS_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - enum EFlags - { - SH_HAS_DECOMPR_MAT = 0x0001, // obsolete - BONEINDICES = 0x0002, - HAS_SUBSET_TEXEL_DENSITY = 0x0004, - }; - - int nFlags; - int nCount; // Number of elements. - int reserved[2]; - - struct MeshSubset - { - int nFirstIndexId; - int nNumIndices; - int nFirstVertId; - int nNumVerts; - int nMatID; // Material sub-object Id. - float fRadius; - Vec3 vCenter; - - AUTO_STRUCT_INFO - }; - - struct MeshBoneIDs - { - uint32 numBoneIDs; - uint16 arrBoneIDs[0x80]; - - AUTO_STRUCT_INFO - }; - - struct MeshSubsetTexelDensity - { - float texelDensity; - - AUTO_STRUCT_INFO - }; - - // Data starts here at the end of the chunk. - //Subset streamData[nCount]; - - MESH_SUBSETS_CHUNK_DESC_0800() - : nFlags(0) - , nCount(0) - { - } - - AUTO_STRUCT_INFO -}; - -////////////////////////////////////////////////////////////////////////// -// Contain array of mesh subsets. -// Each subset holds an info about material id, indices ranges etc... -////////////////////////////////////////////////////////////////////////// -struct MESH_PHYSICS_DATA_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - int nDataSize; // Size of physical data at the end of the chunk. - int nFlags; - int nTetrahedraDataSize; - int nTetrahedraChunkId; // Chunk of physics Tetrahedra data. - int reserved[2]; - - // Data starts here at the end of the chunk. - //char physicsData[nDataSize]; - //char tetrahedraData[nTetrahedraDataSize]; - - AUTO_STRUCT_INFO -}; - - -struct VERTANIM_CHUNK_DESC_0744 -{ - enum - { - VERSION = 0x0744 - }; - - int GeomID; // ID of the related mesh chunk - int nKeys; // # of keys - int nVerts; // # of vertices this object has - int nFaces; // # of faces this object has (for double check purpose) - - AUTO_STRUCT_INFO -}; - -typedef VERTANIM_CHUNK_DESC_0744 VERTANIM_CHUNK_DESC; -#define VERTANIM_CHUNK_DESC_VERSION VERTANIM_CHUNK_DESC_0744::VERSION - -//======================================== -//Bone Anim Chunk Header -//======================================== - -struct BONEANIM_CHUNK_DESC_0290 -{ - enum - { - VERSION = 0x0290 - }; - - int nBones; - - AUTO_STRUCT_INFO -}; - -//======================================== -//Bonelist Chunk Header -//======================================== - -// this structure describes the bone names -// it's followed by numEntities packed \0-terminated strings, the list terminated by double-\0 -struct BONENAMELIST_CHUNK_DESC_0745 -{ - enum - { - VERSION = 0x0745 - }; - - int numEntities; - AUTO_STRUCT_INFO -}; - - -struct COMPILED_BONE_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - char reserved[32]; - AUTO_STRUCT_INFO -}; - -struct COMPILED_PHYSICALBONE_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - char reserved[32]; - AUTO_STRUCT_INFO -}; - -struct COMPILED_PHYSICALPROXY_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - uint32 numPhysicalProxies; - AUTO_STRUCT_INFO -}; - -struct COMPILED_MORPHTARGETS_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800, VERSION1 = 0x801 - }; - - uint32 numMorphTargets; - AUTO_STRUCT_INFO -}; - - -struct COMPILED_INTFACES_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - AUTO_STRUCT_INFO -}; - -struct COMPILED_INTSKINVERTICES_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - char reserved[32]; - AUTO_STRUCT_INFO -}; - -struct COMPILED_EXT2INTMAP_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800 - }; - - AUTO_STRUCT_INFO -}; - -struct COMPILED_BONEBOXES_CHUNK_DESC_0800 -{ - enum - { - VERSION = 0x0800, VERSION1 = 0x801 - }; - - AUTO_STRUCT_INFO -}; - -// Keyframe and Timing Primitives __________________________________________________________________________________________________________________ -struct BaseKey -{ - int time; - AUTO_STRUCT_INFO -}; - -struct BaseTCB -{ - float t, c, b; - float ein, eout; - AUTO_STRUCT_INFO -}; - -struct BaseKey1 - : BaseKey -{ - float val; - AUTO_STRUCT_INFO -}; -struct BaseKey3 - : BaseKey -{ - Vec3 val; - AUTO_STRUCT_INFO -}; -struct BaseKeyQ - : BaseKey -{ - CryQuat val; - AUTO_STRUCT_INFO -}; - -struct CryLin1Key - : BaseKey1 -{ - AUTO_STRUCT_INFO -}; -struct CryLin3Key - : BaseKey3 -{ - AUTO_STRUCT_INFO -}; -struct CryLinQKey - : BaseKeyQ -{ - AUTO_STRUCT_INFO -}; -struct CryTCB1Key - : BaseKey1 - , BaseTCB -{ - AUTO_STRUCT_INFO -}; -struct CryTCB3Key - : BaseKey3 - , BaseTCB -{ - AUTO_STRUCT_INFO -}; -struct CryTCBQKey - : BaseKeyQ - , BaseTCB -{ - AUTO_STRUCT_INFO -}; -struct CryBez1Key - : BaseKey1 -{ - float intan, outtan; - AUTO_STRUCT_INFO -}; -struct CryBez3Key - : BaseKey3 -{ - Vec3 intan, outtan; - AUTO_STRUCT_INFO -}; -struct CryBezQKey - : BaseKeyQ -{ - AUTO_STRUCT_INFO -}; - -struct CryKeyPQLog -{ - int nTime; - Vec3 vPos; - Vec3 vRotLog; // logarithm of the rotation - - // resets to initial position/rotation/time - void reset () - { - nTime = 0; - vPos.x = vPos.y = vPos.z = 0; - vRotLog.x = vRotLog.y = vRotLog.z = 0; - } - - AUTO_STRUCT_INFO -}; - -//======================================== -//Controller Chunk Header -//======================================== -enum CtrlTypes -{ - CTRL_NONE, - CTRL_CRYBONE, - CTRL_LINEER1, CTRL_LINEER3, CTRL_LINEERQ, - CTRL_BEZIER1, CTRL_BEZIER3, CTRL_BEZIERQ, - CTRL_TCB1, CTRL_TCB3, CTRL_TCBQ, - CTRL_BSPLINE_2O, // 2-byte fixed values, open - CTRL_BSPLINE_1O, // 1-byte fixed values, open - CTRL_BSPLINE_2C, // 2-byte fixed values, closed - CTRL_BSPLINE_1C, // 1-byte fixed values, closed - CTRL_CONST // constant position&rotation -}; - -enum CtrlFlags -{ - CTRL_ORT_CYCLE = 0x01, - CTRL_ORT_LOOP = 0x02 -}; - -// Used to store TCB-controllers in .anm files -struct CONTROLLER_CHUNK_DESC_0826 -{ - enum - { - VERSION = 0x0826 - }; - - CtrlTypes type; //one ot the CtrlTypes values - int nKeys; // # of keys this controller has; toatl # of knots (positional and orientational) in the case of B-Spline - - //unsigned short nSubCtrl; // # of sub controllers; not used now/reserved - unsigned int nFlags; // Flags of controller. - //int nSubCtrl; // # of sub controllers; not used now/reserved - - unsigned nControllerId; // unique generated in exporter id based on crc32 of bone name - - AUTO_STRUCT_INFO -}; - -// Format used to store uncompressed sampled animation exported from DCC into .i_caf files (earlier .caf) -struct CONTROLLER_CHUNK_DESC_0827 -{ - enum - { - VERSION = 0x0827 - }; - unsigned numKeys; - unsigned nControllerId; - - AUTO_STRUCT_INFO -}; - -// Unused format (was it introduced to fix missing header in 827?) -struct CONTROLLER_CHUNK_DESC_0828 -{ - enum - { - VERSION = 0x0828 - }; -}; - -struct CONTROLLER_CHUNK_DESC_0829 -{ - enum - { - VERSION = 0x0829 - }; - - enum - { - eKeyTimeRotation = 0, eKeyTimePosition = 1, eKeyTimeScale = 2 - }; - - unsigned int nControllerId; - - uint16 numRotationKeys; - uint16 numPositionKeys; - uint8 RotationFormat; - uint8 RotationTimeFormat; - uint8 PositionFormat; - uint8 PositionKeysInfo; - uint8 PositionTimeFormat; - uint8 TracksAligned; - - AUTO_STRUCT_INFO -}; - -// Added new controller flags field, correspond to v827 and v829 respectively -struct CONTROLLER_CHUNK_DESC_0830 -{ - enum - { - VERSION = 0x830 - }; - - CONTROLLER_CHUNK_DESC_0830(){} - - CONTROLLER_CHUNK_DESC_0830(const CONTROLLER_CHUNK_DESC_0827* oldChunk) - : numKeys(oldChunk->numKeys) - , nControllerId(oldChunk->nControllerId) - , nFlags(0) - {} - - unsigned numKeys; - unsigned nControllerId; - unsigned nFlags; - - AUTO_STRUCT_INFO -}; - -struct CONTROLLER_CHUNK_DESC_0831 -{ - enum - { - VERSION = 0x831 - }; - - CONTROLLER_CHUNK_DESC_0831(){} - - CONTROLLER_CHUNK_DESC_0831(const CONTROLLER_CHUNK_DESC_0829* oldChunk) - : nControllerId(oldChunk->nControllerId) - , nFlags(0) - , numPositionKeys(oldChunk->numPositionKeys) - , numRotationKeys(oldChunk->numRotationKeys) - , RotationFormat(oldChunk->RotationFormat) - , RotationTimeFormat(oldChunk->RotationTimeFormat) - , PositionFormat(oldChunk->PositionFormat) - , PositionKeysInfo(oldChunk->PositionKeysInfo) - , PositionTimeFormat(oldChunk->PositionTimeFormat) - , TracksAligned(oldChunk->TracksAligned) - {} - - enum - { - eKeyTimeRotation = 0, eKeyTimePosition = 1, eKeyTimeScale = 2 - }; - - unsigned int nControllerId; - unsigned int nFlags; - - uint16 numRotationKeys; - uint16 numPositionKeys; - uint8 RotationFormat; - uint8 RotationTimeFormat; - uint8 PositionFormat; - uint8 PositionKeysInfo; - uint8 PositionTimeFormat; - uint8 TracksAligned; - - AUTO_STRUCT_INFO -}; - -struct CONTROLLER_CHUNK_DESC_0905 -{ - enum - { - VERSION = 0x0905 - }; - - uint32 numKeyPos; - uint32 numKeyRot; - uint32 numKeyTime; - uint32 numAnims; - AUTO_STRUCT_INFO -}; - -//======================================== -//Node Chunk Header -//======================================== -struct NODE_CHUNK_DESC_0824 -{ - // Versions 0x0823 and 0x0824 have exactly same layout. - // The only difference between 0x0823 and 0x0824 is that some members - // are now named _obsoleteXXX_ and are not filled/used in 0x0824. - enum - { - VERSION = 0x0824 - }; - enum - { - COMPATIBLE_OLD_VERSION = 0x0823 - }; - - char name[64]; - - int ObjectID; // ID of this node's object chunk (if present) - int ParentID; // chunk ID of the parent Node's chunk - int nChildren; // # of children Nodes - int MatID; // Material chunk No - - uint8 _obsoleteA_[4]; // uint8 IsGroupHead; uint8 IsGroupMember; uint8 _padding_[2]. not used anymore. - - float tm[4][4]; // transformation matrix - - float _obsoleteB_[3]; // position component of the matrix, stored as Vec3. not used anymore. - float _obsoleteC_[4]; // rotation component of the matrix, stored as CryQuat. not used anymore. - float _obsoleteD_[3]; // scale component of the matrix, stored as Vec3. not used anymore. - - int pos_cont_id; // position controller chunk id - int rot_cont_id; // rotation controller chunk id - int scl_cont_id; // scale controller chunk id - - int PropStrLen; // length of the property string - - AUTO_STRUCT_INFO -}; - -//======================================== -//Helper Chunk Header -//======================================== -enum HelperTypes -{ - HP_POINT = 0, - HP_DUMMY = 1, - HP_XREF = 2, - HP_CAMERA = 3, - HP_GEOMETRY = 4 -}; - -struct HELPER_CHUNK_DESC_0744 -{ - enum - { - VERSION = 0x0744 - }; - - HelperTypes type; // one of the HelperTypes values - Vec3 size; // size in local x,y,z axises (for dummy only) - - AUTO_STRUCT_INFO -}; - -typedef HELPER_CHUNK_DESC_0744 HELPER_CHUNK_DESC; -#define HELPER_CHUNK_DESC_VERSION HELPER_CHUNK_DESC::VERSION - - -// ChunkType_MeshMorphTarget - morph target of a mesh chunk -// This chunk contains only the information about the vertices that are changed in the mesh -// This chunk is followed by an array of numMorphVertices structures SMeshMorphTargetVertex, -// immediately followed by the name (null-terminated, variable-length string) of the morph target. -// The string is after the array because of future alignment considerations; it may be padded with 0s. -struct MESHMORPHTARGET_CHUNK_DESC_0001 -{ - enum - { - VERSION = 0x0001 - }; - uint32 nChunkIdMesh; // the chunk id of the mesh chunk (ChunkType_Mesh) for which this morph target is - uint32 numMorphVertices; // number of MORPHED vertices - - AUTO_STRUCT_INFO -}; - - -// an array of these structures follows the MESHMORPHTARGET_CHUNK_DESC_0001 -// there are numMorphVertices of them -struct SMeshMorphTargetVertex -{ - uint32 nVertexId; // vertex index in the original (mesh) array of vertices - Vec3 ptVertex; // the target point of the morph target - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{} - AUTO_STRUCT_INFO -}; - -struct SMeshMorphTargetHeader -{ - uint32 MeshID; - uint32 NameLength; //size of the name string - uint32 numIntVertices; //type SMeshMorphTargetVertex - uint32 numExtVertices; //type SMeshMorphTargetVertex - - AUTO_STRUCT_INFO -}; - -struct SMeshPhysicalProxyHeader -{ - uint32 ChunkID; - uint32 numPoints; - uint32 numIndices; - uint32 numMaterials; - - AUTO_STRUCT_INFO -}; - -// -// ChunkType_BoneInitialPos - describes the initial position (4x3 matrix) of each bone; just an array of 4x3 matrices -// This structure is followed by -struct BONEINITIALPOS_CHUNK_DESC_0001 -{ - enum - { - VERSION = 0x0001 - }; - // the chunk id of the mesh chunk (ChunkType_Mesh) with bone info for which these bone initial positions are applicable. - // there might be some unused bones here as well. There must be the same number of bones as in the other chunks - they're placed - // in BoneId order. - unsigned nChunkIdMesh; - // this is the number of bone initial pose matrices here - unsigned numBones; - - AUTO_STRUCT_INFO -}; - -// an array of these matrices follows the BONEINITIALPOS_CHUNK_DESC_0001 header -// there are numBones of them -// TO BE REPLACED WITH Matrix43 -struct SBoneInitPosMatrix -{ - float mx[4][3]; - float* operator [] (int i) {return mx[i]; } - const float* operator [] (int i) const {return mx[i]; } - const Vec3& getOrt (int nOrt) const {return *(const Vec3*)(mx[nOrt]); } - - AUTO_STRUCT_INFO -}; - -////////////////////////////////////////////////////////////////////////// -// Custom Attributes chunk description. -////////////////////////////////////////////////////////////////////////// -struct EXPORT_FLAGS_CHUNK_DESC -{ - enum - { - VERSION = 0x0001 - }; - enum EFlags - { - MERGE_ALL_NODES = 0x0001, - HAVE_AUTO_LODS = 0x0002, - USE_CUSTOM_NORMALS = 0x0004, - WANT_F32_VERTICES = 0x0008, - EIGHT_WEIGHTS_PER_VERTEX = 0x0010, - //START: Prevent reprocessing skinning data for skinned CGF - SKINNED_CGF = 0x0020, - //END: Prevent reprocessing skinning data for skinned CGF - }; - enum ESrcFlags - { - FROM_MAX_EXPORTER = 0x0000, - FROM_COLLADA_XSI = 0x1001, - FROM_COLLADA_MAX = 0x1002, - FROM_COLLADA_MAYA = 0x1003, - }; - - unsigned int flags; // @see EFlags - unsigned int rc_version[4]; // Resource compiler version. - char rc_version_string[16]; // Version as a string. - unsigned int assetAuthorTool; - unsigned int authorToolVersion; - unsigned int reserved[30]; - - AUTO_STRUCT_INFO -}; - -struct BREAKABLE_PHYSICS_CHUNK_DESC -{ - enum - { - VERSION = 0x0001 - }; - - unsigned int granularity; - int nMode; - int nRetVtx; - int nRetTets; - int nReserved[10]; - - AUTO_STRUCT_INFO -}; - -struct FOLIAGE_INFO_CHUNK_DESC -{ - enum - { - //START: Add Skinned Geometry (.CGF) export type (for touch bending vegetation) - VERSION = 0x0001, - VERSION2 = 0x0002 - //END: Add Skinned Geometry (.CGF) export type (for touch bending vegetation) - }; - - int nSpines; - int nSpineVtx; - int nSkinnedVtx; - int nBoneIds; - - AUTO_STRUCT_INFO -}; - -struct FOLIAGE_SPINE_SUB_CHUNK -{ - unsigned char nVtx; - char _paddingA_[3]; - float len; - Vec3 navg; - unsigned char iAttachSpine; - unsigned char iAttachSeg; - char _paddingB_[2]; - - AUTO_STRUCT_INFO -}; - -#endif // CRYINCLUDE_CRYCOMMON_CRYHEADERS_H diff --git a/Code/Legacy/CryCommon/CryHeaders_info.cpp b/Code/Legacy/CryCommon/CryHeaders_info.cpp deleted file mode 100644 index 3487055013..0000000000 --- a/Code/Legacy/CryCommon/CryHeaders_info.cpp +++ /dev/null @@ -1,486 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "TypeInfo_impl.h" -#include "CryHeaders.h" - -STRUCT_INFO_BEGIN(CryVertex) -STRUCT_VAR_INFO(p, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(n, TYPE_INFO(Vec3)) -STRUCT_INFO_END(CryVertex) - -STRUCT_INFO_BEGIN(CryFace) -STRUCT_VAR_INFO(v0, TYPE_INFO(int)) -STRUCT_VAR_INFO(v1, TYPE_INFO(int)) -STRUCT_VAR_INFO(v2, TYPE_INFO(int)) -STRUCT_VAR_INFO(MatID, TYPE_INFO(int)) -STRUCT_INFO_END(CryFace) - -STRUCT_INFO_BEGIN(CryUV) -STRUCT_VAR_INFO(u, TYPE_INFO(float)) -STRUCT_VAR_INFO(v, TYPE_INFO(float)) -STRUCT_INFO_END(CryUV) - -STRUCT_INFO_BEGIN(CrySkinVtx) -STRUCT_VAR_INFO(bVolumetric, TYPE_INFO(int)) -STRUCT_VAR_INFO(idx, TYPE_INFO_ARRAY(4, TYPE_INFO(int))) -STRUCT_VAR_INFO(w, TYPE_INFO_ARRAY(4, TYPE_INFO(float))) -STRUCT_VAR_INFO(M, TYPE_INFO(Matrix33)) -STRUCT_INFO_END(CrySkinVtx) - -STRUCT_INFO_BEGIN(CryLink) -STRUCT_VAR_INFO(BoneID, TYPE_INFO(int)) -STRUCT_VAR_INFO(offset, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(Blending, TYPE_INFO(float)) -STRUCT_INFO_END(CryLink) - -STRUCT_INFO_BEGIN(CryIRGB) -STRUCT_VAR_INFO(r, TYPE_INFO(unsigned char)) -STRUCT_VAR_INFO(g, TYPE_INFO(unsigned char)) -STRUCT_VAR_INFO(b, TYPE_INFO(unsigned char)) -STRUCT_INFO_END(CryIRGB) - -STRUCT_INFO_BEGIN(CryBonePhysics_Comp) -STRUCT_VAR_INFO(nPhysGeom, TYPE_INFO(int)) -STRUCT_VAR_INFO(flags, TYPE_INFO(int)) -STRUCT_VAR_INFO(min, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(max, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(spring_angle, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(spring_tension, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(damping, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(framemtx, TYPE_ARRAY(3, TYPE_ARRAY(3, TYPE_INFO(float)))) -STRUCT_INFO_END(CryBonePhysics_Comp) - -STRUCT_INFO_BEGIN(CryBoneDescData_Comp) -STRUCT_VAR_INFO(m_nControllerID, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(m_PhysInfo, TYPE_ARRAY(2, TYPE_INFO(BONE_PHYSICS_COMP))) -STRUCT_VAR_INFO(m_fMass, TYPE_INFO(float)) -STRUCT_VAR_INFO(m_DefaultW2B, TYPE_INFO(Matrix34)) -STRUCT_VAR_INFO(m_DefaultB2W, TYPE_INFO(Matrix34)) -STRUCT_VAR_INFO(m_arrBoneName, TYPE_ARRAY(256, TYPE_INFO(char))) -STRUCT_VAR_INFO(m_nLimbId, TYPE_INFO(int)) -STRUCT_VAR_INFO(m_nOffsetParent, TYPE_INFO(int)) -STRUCT_VAR_INFO(m_numChildren, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(m_nOffsetChildren, TYPE_INFO(int)) -STRUCT_INFO_END(CryBoneDescData_Comp) - -STRUCT_INFO_BEGIN(BONE_ENTITY) -STRUCT_VAR_INFO(BoneID, TYPE_INFO(int)) -STRUCT_VAR_INFO(ParentID, TYPE_INFO(int)) -STRUCT_VAR_INFO(nChildren, TYPE_INFO(int)) -STRUCT_VAR_INFO(ControllerID, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(prop, TYPE_ARRAY(32, TYPE_INFO(char))) -STRUCT_VAR_INFO(phys, TYPE_INFO(BONE_PHYSICS_COMP)) -STRUCT_INFO_END(BONE_ENTITY) - -ENUM_INFO_BEGIN(ChunkTypes) -ENUM_ELEM_INFO(, ChunkType_ANY) -ENUM_ELEM_INFO(, ChunkType_Mesh) -ENUM_ELEM_INFO(, ChunkType_Helper) -ENUM_ELEM_INFO(, ChunkType_VertAnim) -ENUM_ELEM_INFO(, ChunkType_BoneAnim) -ENUM_ELEM_INFO(, ChunkType_GeomNameList) -ENUM_ELEM_INFO(, ChunkType_BoneNameList) -ENUM_ELEM_INFO(, ChunkType_MtlList) -ENUM_ELEM_INFO(, ChunkType_MRM) -ENUM_ELEM_INFO(, ChunkType_SceneProps) -ENUM_ELEM_INFO(, ChunkType_Light) -ENUM_ELEM_INFO(, ChunkType_PatchMesh) -ENUM_ELEM_INFO(, ChunkType_Node) -ENUM_ELEM_INFO(, ChunkType_Mtl) -ENUM_ELEM_INFO(, ChunkType_Controller) -ENUM_ELEM_INFO(, ChunkType_Timing) -ENUM_ELEM_INFO(, ChunkType_BoneMesh) -ENUM_ELEM_INFO(, ChunkType_BoneLightBinding) -ENUM_ELEM_INFO(, ChunkType_MeshMorphTarget) -ENUM_ELEM_INFO(, ChunkType_BoneInitialPos) -ENUM_ELEM_INFO(, ChunkType_SourceInfo) -ENUM_ELEM_INFO(, ChunkType_MtlName) -ENUM_ELEM_INFO(, ChunkType_ExportFlags) -ENUM_ELEM_INFO(, ChunkType_DataStream) -ENUM_ELEM_INFO(, ChunkType_MeshSubsets) -ENUM_ELEM_INFO(, ChunkType_MeshPhysicsData) -ENUM_ELEM_INFO(, ChunkType_CompiledBones) -ENUM_ELEM_INFO(, ChunkType_CompiledPhysicalBones) -ENUM_ELEM_INFO(, ChunkType_CompiledMorphTargets) -ENUM_ELEM_INFO(, ChunkType_CompiledPhysicalProxies) -ENUM_ELEM_INFO(, ChunkType_CompiledIntFaces) -ENUM_ELEM_INFO(, ChunkType_CompiledIntSkinVertices) -ENUM_ELEM_INFO(, ChunkType_CompiledExt2IntMap) -ENUM_ELEM_INFO(, ChunkType_BreakablePhysics) -ENUM_ELEM_INFO(, ChunkType_FaceMap) -ENUM_ELEM_INFO(, ChunkType_MotionParameters) -ENUM_ELEM_INFO(, ChunkType_FootPlantInfo) -ENUM_ELEM_INFO(, ChunkType_BonesBoxes) -ENUM_ELEM_INFO(, ChunkType_FoliageInfo) -ENUM_INFO_END(ChunkTypes) - -STRUCT_INFO_BEGIN(RANGE_ENTITY) -STRUCT_VAR_INFO(name, TYPE_ARRAY(32, TYPE_INFO(char))) -STRUCT_VAR_INFO(start, TYPE_INFO(int)) -STRUCT_VAR_INFO(end, TYPE_INFO(int)) -STRUCT_INFO_END(RANGE_ENTITY) - -STRUCT_INFO_BEGIN(TIMING_CHUNK_DESC_0918) -STRUCT_VAR_INFO(m_SecsPerTick, TYPE_INFO(float)) -STRUCT_VAR_INFO(m_TicksPerFrame, TYPE_INFO(int)) -STRUCT_VAR_INFO(global_range, TYPE_INFO(RANGE_ENTITY)) -STRUCT_VAR_INFO(qqqqnSubRanges, TYPE_INFO(int)) -STRUCT_INFO_END(TIMING_CHUNK_DESC_0918) - - -STRUCT_INFO_BEGIN(SPEED_CHUNK_DESC_2) -STRUCT_VAR_INFO(Speed, TYPE_INFO(float)) -STRUCT_VAR_INFO(Distance, TYPE_INFO(float)) -STRUCT_VAR_INFO(Slope, TYPE_INFO(float)) -STRUCT_VAR_INFO(AnimFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(MoveDir, TYPE_ARRAY(3, TYPE_INFO(f32))) -STRUCT_VAR_INFO(StartPosition, TYPE_INFO(QuatT)) -STRUCT_INFO_END(SPEED_CHUNK_DESC_2) - -STRUCT_INFO_BEGIN(MTL_NAME_CHUNK_DESC_0800) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFlags2, TYPE_INFO(int)) -STRUCT_VAR_INFO(name, TYPE_ARRAY(128, TYPE_INFO(char))) -STRUCT_VAR_INFO(nPhysicalizeType, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSubMaterials, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSubMatChunkId, TYPE_ARRAY(MTL_NAME_CHUNK_DESC_0800_MAX_SUB_MATERIALS, TYPE_INFO(int))) -STRUCT_VAR_INFO(nAdvancedDataChunkId, TYPE_INFO(int)) -STRUCT_VAR_INFO(sh_opacity, TYPE_INFO(float)) -STRUCT_VAR_INFO(reserve, TYPE_ARRAY(32, TYPE_INFO(int))) -STRUCT_INFO_END(MTL_NAME_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(MTL_NAME_CHUNK_DESC_0802) -STRUCT_VAR_INFO(name, TYPE_ARRAY(128, TYPE_INFO(char))) -STRUCT_VAR_INFO(nSubMaterials, TYPE_INFO(int)) -STRUCT_INFO_END(MTL_NAME_CHUNK_DESC_0802) - -STRUCT_INFO_BEGIN(MESH_CHUNK_DESC_0745) -STRUCT_VAR_INFO(flags1, TYPE_INFO(unsigned char)) -STRUCT_VAR_INFO(flags2, TYPE_INFO(unsigned char)) -STRUCT_VAR_INFO(nVerts, TYPE_INFO(int)) -STRUCT_VAR_INFO(nTVerts, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFaces, TYPE_INFO(int)) -STRUCT_VAR_INFO(VertAnimID, TYPE_INFO(int)) -STRUCT_INFO_END(MESH_CHUNK_DESC_0745) - -STRUCT_INFO_BEGIN(MESH_CHUNK_DESC_0801) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFlags2, TYPE_INFO(int)) -STRUCT_VAR_INFO(nVerts, TYPE_INFO(int)) -STRUCT_VAR_INFO(nIndices, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSubsets, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSubsetsChunkId, TYPE_INFO(int)) -STRUCT_VAR_INFO(nVertAnimID, TYPE_INFO(int)) -STRUCT_VAR_INFO(nStreamChunkID, TYPE_ARRAY(16, TYPE_INFO(int))) -STRUCT_VAR_INFO(nPhysicsDataChunkId, TYPE_ARRAY(4, TYPE_INFO(int))) -STRUCT_VAR_INFO(bboxMin, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(bboxMax, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(texMappingDensity, TYPE_INFO(float)) -STRUCT_VAR_INFO(geometricMeanFaceArea, TYPE_INFO(float)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(30, TYPE_INFO(int))) -STRUCT_INFO_END(MESH_CHUNK_DESC_0801) - -STRUCT_INFO_BEGIN(MESH_CHUNK_DESC_0802) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFlags2, TYPE_INFO(int)) -STRUCT_VAR_INFO(nVerts, TYPE_INFO(int)) -STRUCT_VAR_INFO(nIndices, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSubsets, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSubsetsChunkId, TYPE_INFO(int)) -STRUCT_VAR_INFO(nVertAnimID, TYPE_INFO(int)) -STRUCT_VAR_INFO(nStreamChunkID, TYPE_ARRAY(16, TYPE_ARRAY(8, TYPE_INFO(int)))) -STRUCT_VAR_INFO(nPhysicsDataChunkId, TYPE_ARRAY(4, TYPE_INFO(int))) -STRUCT_VAR_INFO(bboxMin, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(bboxMax, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(texMappingDensity, TYPE_INFO(float)) -STRUCT_VAR_INFO(geometricMeanFaceArea, TYPE_INFO(float)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(30, TYPE_INFO(int))) -STRUCT_INFO_END(MESH_CHUNK_DESC_0802) - -STRUCT_INFO_BEGIN(STREAM_DATA_CHUNK_DESC_0800) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nStreamType, TYPE_INFO(int)) -STRUCT_VAR_INFO(nCount, TYPE_INFO(int)) -STRUCT_VAR_INFO(nElementSize, TYPE_INFO(int)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(2, TYPE_INFO(int))) -STRUCT_INFO_END(STREAM_DATA_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(STREAM_DATA_CHUNK_DESC_0801) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nStreamType, TYPE_INFO(int)) -STRUCT_VAR_INFO(nStreamIndex, TYPE_INFO(int)) -STRUCT_VAR_INFO(nCount, TYPE_INFO(int)) -STRUCT_VAR_INFO(nElementSize, TYPE_INFO(int)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(2, TYPE_INFO(int))) -STRUCT_INFO_END(STREAM_DATA_CHUNK_DESC_0801) - -STRUCT_INFO_BEGIN(MESH_SUBSETS_CHUNK_DESC_0800::MeshSubset) -STRUCT_VAR_INFO(nFirstIndexId, TYPE_INFO(int)) -STRUCT_VAR_INFO(nNumIndices, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFirstVertId, TYPE_INFO(int)) -STRUCT_VAR_INFO(nNumVerts, TYPE_INFO(int)) -STRUCT_VAR_INFO(nMatID, TYPE_INFO(int)) -STRUCT_VAR_INFO(fRadius, TYPE_INFO(float)) -STRUCT_VAR_INFO(vCenter, TYPE_INFO(Vec3)) -STRUCT_INFO_END(MESH_SUBSETS_CHUNK_DESC_0800::MeshSubset) - -STRUCT_INFO_BEGIN(MESH_SUBSETS_CHUNK_DESC_0800::MeshBoneIDs) -STRUCT_VAR_INFO(numBoneIDs, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(arrBoneIDs, TYPE_ARRAY(128, TYPE_INFO(uint16))) -STRUCT_INFO_END(MESH_SUBSETS_CHUNK_DESC_0800::MeshBoneIDs) - -STRUCT_INFO_BEGIN(MESH_SUBSETS_CHUNK_DESC_0800::MeshSubsetTexelDensity) -STRUCT_VAR_INFO(texelDensity, TYPE_INFO(float)) -STRUCT_INFO_END(MESH_SUBSETS_CHUNK_DESC_0800::MeshSubsetTexelDensity) - - -STRUCT_INFO_BEGIN(MESH_SUBSETS_CHUNK_DESC_0800) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nCount, TYPE_INFO(int)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(2, TYPE_INFO(int))) -STRUCT_INFO_END(MESH_SUBSETS_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(MESH_PHYSICS_DATA_CHUNK_DESC_0800) -STRUCT_VAR_INFO(nDataSize, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(int)) -STRUCT_VAR_INFO(nTetrahedraDataSize, TYPE_INFO(int)) -STRUCT_VAR_INFO(nTetrahedraChunkId, TYPE_INFO(int)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(2, TYPE_INFO(int))) -STRUCT_INFO_END(MESH_PHYSICS_DATA_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(BONEANIM_CHUNK_DESC_0290) -STRUCT_VAR_INFO(nBones, TYPE_INFO(int)) -STRUCT_INFO_END(BONEANIM_CHUNK_DESC_0290) - -STRUCT_INFO_BEGIN(BONENAMELIST_CHUNK_DESC_0745) -STRUCT_VAR_INFO(numEntities, TYPE_INFO(int)) -STRUCT_INFO_END(BONENAMELIST_CHUNK_DESC_0745) - -STRUCT_INFO_BEGIN(COMPILED_BONE_CHUNK_DESC_0800) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(32, TYPE_INFO(char))) -STRUCT_INFO_END(COMPILED_BONE_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(COMPILED_PHYSICALBONE_CHUNK_DESC_0800) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(32, TYPE_INFO(char))) -STRUCT_INFO_END(COMPILED_PHYSICALBONE_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(COMPILED_PHYSICALPROXY_CHUNK_DESC_0800) -STRUCT_VAR_INFO(numPhysicalProxies, TYPE_INFO(uint32)) -STRUCT_INFO_END(COMPILED_PHYSICALPROXY_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(COMPILED_MORPHTARGETS_CHUNK_DESC_0800) -STRUCT_VAR_INFO(numMorphTargets, TYPE_INFO(uint32)) -STRUCT_INFO_END(COMPILED_MORPHTARGETS_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(COMPILED_INTSKINVERTICES_CHUNK_DESC_0800) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(32, TYPE_INFO(char))) -STRUCT_INFO_END(COMPILED_INTSKINVERTICES_CHUNK_DESC_0800) - -STRUCT_INFO_BEGIN(BaseKey) -STRUCT_VAR_INFO(time, TYPE_INFO(int)) -STRUCT_INFO_END(BaseKey) - -STRUCT_INFO_BEGIN(BaseTCB) -STRUCT_VAR_INFO(t, TYPE_INFO(float)) -STRUCT_VAR_INFO(c, TYPE_INFO(float)) -STRUCT_VAR_INFO(b, TYPE_INFO(float)) -STRUCT_VAR_INFO(ein, TYPE_INFO(float)) -STRUCT_VAR_INFO(eout, TYPE_INFO(float)) -STRUCT_INFO_END(BaseTCB) - -STRUCT_INFO_BEGIN(BaseKey3) -STRUCT_BASE_INFO(BaseKey) -STRUCT_VAR_INFO(val, TYPE_INFO(Vec3)) -STRUCT_INFO_END(BaseKey3) - -STRUCT_INFO_BEGIN(BaseKeyQ) -STRUCT_BASE_INFO(BaseKey) -STRUCT_VAR_INFO(val, TYPE_INFO(CryQuat)) -STRUCT_INFO_END(BaseKeyQ) - -STRUCT_INFO_BEGIN(CryTCB3Key) -STRUCT_BASE_INFO(BaseKey3) -STRUCT_BASE_INFO(BaseTCB) -STRUCT_INFO_END(CryTCB3Key) - -STRUCT_INFO_BEGIN(CryTCBQKey) -STRUCT_BASE_INFO(BaseKeyQ) -STRUCT_BASE_INFO(BaseTCB) -STRUCT_INFO_END(CryTCBQKey) - -STRUCT_INFO_BEGIN(CryKeyPQLog) -STRUCT_VAR_INFO(nTime, TYPE_INFO(int)) -STRUCT_VAR_INFO(vPos, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(vRotLog, TYPE_INFO(Vec3)) -STRUCT_INFO_END(CryKeyPQLog) - -ENUM_INFO_BEGIN(CtrlTypes) -ENUM_ELEM_INFO(, CTRL_NONE) -ENUM_ELEM_INFO(, CTRL_CRYBONE) -ENUM_ELEM_INFO(, CTRL_LINEER1) -ENUM_ELEM_INFO(, CTRL_LINEER3) -ENUM_ELEM_INFO(, CTRL_LINEERQ) -ENUM_ELEM_INFO(, CTRL_BEZIER1) -ENUM_ELEM_INFO(, CTRL_BEZIER3) -ENUM_ELEM_INFO(, CTRL_BEZIERQ) -ENUM_ELEM_INFO(, CTRL_TCB1) -ENUM_ELEM_INFO(, CTRL_TCB3) -ENUM_ELEM_INFO(, CTRL_TCBQ) -ENUM_ELEM_INFO(, CTRL_BSPLINE_2O) -ENUM_ELEM_INFO(, CTRL_BSPLINE_1O) -ENUM_ELEM_INFO(, CTRL_BSPLINE_2C) -ENUM_ELEM_INFO(, CTRL_BSPLINE_1C) -ENUM_ELEM_INFO(, CTRL_CONST) -ENUM_INFO_END(CtrlTypes) - -STRUCT_INFO_BEGIN(CONTROLLER_CHUNK_DESC_0826) -STRUCT_VAR_INFO(type, TYPE_INFO(CtrlTypes)) -STRUCT_VAR_INFO(nKeys, TYPE_INFO(int)) -STRUCT_VAR_INFO(nFlags, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(nControllerId, TYPE_INFO(unsigned int)) -STRUCT_INFO_END(CONTROLLER_CHUNK_DESC_0826) - -STRUCT_INFO_BEGIN(CONTROLLER_CHUNK_DESC_0827) -STRUCT_VAR_INFO(numKeys, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(nControllerId, TYPE_INFO(unsigned int)) -STRUCT_INFO_END(CONTROLLER_CHUNK_DESC_0827) - -STRUCT_INFO_BEGIN(CONTROLLER_CHUNK_DESC_0829) -STRUCT_VAR_INFO(nControllerId, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(numRotationKeys, TYPE_INFO(uint16)) -STRUCT_VAR_INFO(numPositionKeys, TYPE_INFO(uint16)) -STRUCT_VAR_INFO(RotationFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(RotationTimeFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(PositionFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(PositionKeysInfo, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(PositionTimeFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(TracksAligned, TYPE_INFO(uint8)) -STRUCT_INFO_END(CONTROLLER_CHUNK_DESC_0829) - -STRUCT_INFO_BEGIN(CONTROLLER_CHUNK_DESC_0830) -STRUCT_VAR_INFO(numKeys, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(nFlags, Type_info(unsigned int)) -STRUCT_VAR_INFO(nControllerId, TYPE_INFO(unsigned int)) -STRUCT_INFO_END(CONTROLLER_CHUNK_DESC_0830) - -STRUCT_INFO_BEGIN(CONTROLLER_CHUNK_DESC_0831) -STRUCT_VAR_INFO(nControllerId, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(nFlags, Type_info(unsigned int)) -STRUCT_VAR_INFO(numRotationKeys, TYPE_INFO(uint16)) -STRUCT_VAR_INFO(numPositionKeys, TYPE_INFO(uint16)) -STRUCT_VAR_INFO(RotationFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(RotationTimeFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(PositionFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(PositionKeysInfo, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(PositionTimeFormat, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(TracksAligned, TYPE_INFO(uint8)) -STRUCT_INFO_END(CONTROLLER_CHUNK_DESC_0831) - -STRUCT_INFO_BEGIN(CONTROLLER_CHUNK_DESC_0905) -STRUCT_VAR_INFO(numKeyPos, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numKeyRot, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numKeyTime, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numAnims, TYPE_INFO(uint32)) -STRUCT_INFO_END(CONTROLLER_CHUNK_DESC_0905) - -STRUCT_INFO_BEGIN(NODE_CHUNK_DESC_0824) -STRUCT_VAR_INFO(name, TYPE_ARRAY(64, TYPE_INFO(char))) -STRUCT_VAR_INFO(ObjectID, TYPE_INFO(int)) -STRUCT_VAR_INFO(ParentID, TYPE_INFO(int)) -STRUCT_VAR_INFO(nChildren, TYPE_INFO(int)) -STRUCT_VAR_INFO(MatID, TYPE_INFO(int)) -STRUCT_VAR_INFO(_obsoleteA_, TYPE_ARRAY(4, TYPE_INFO(uint8))) -STRUCT_VAR_INFO(tm, TYPE_ARRAY(4, TYPE_ARRAY(4, TYPE_INFO(float)))) -STRUCT_VAR_INFO(_obsoleteB_, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(_obsoleteC_, TYPE_ARRAY(4, TYPE_INFO(float))) -STRUCT_VAR_INFO(_obsoleteD_, TYPE_ARRAY(3, TYPE_INFO(float))) -STRUCT_VAR_INFO(pos_cont_id, TYPE_INFO(int)) -STRUCT_VAR_INFO(rot_cont_id, TYPE_INFO(int)) -STRUCT_VAR_INFO(scl_cont_id, TYPE_INFO(int)) -STRUCT_VAR_INFO(PropStrLen, TYPE_INFO(int)) -STRUCT_INFO_END(NODE_CHUNK_DESC_0824) - -ENUM_INFO_BEGIN(HelperTypes) -ENUM_ELEM_INFO(, HP_POINT) -ENUM_ELEM_INFO(, HP_DUMMY) -ENUM_ELEM_INFO(, HP_XREF) -ENUM_ELEM_INFO(, HP_CAMERA) -ENUM_ELEM_INFO(, HP_GEOMETRY) -ENUM_INFO_END(HelperTypes) - -STRUCT_INFO_BEGIN(HELPER_CHUNK_DESC_0744) -STRUCT_VAR_INFO(type, TYPE_INFO(HelperTypes)) -STRUCT_VAR_INFO(size, TYPE_INFO(Vec3)) -STRUCT_INFO_END(HELPER_CHUNK_DESC_0744) - -STRUCT_INFO_BEGIN(MESHMORPHTARGET_CHUNK_DESC_0001) -STRUCT_VAR_INFO(nChunkIdMesh, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(numMorphVertices, TYPE_INFO(unsigned int)) -STRUCT_INFO_END(MESHMORPHTARGET_CHUNK_DESC_0001) - -STRUCT_INFO_BEGIN(SMeshMorphTargetVertex) -STRUCT_VAR_INFO(nVertexId, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(ptVertex, TYPE_INFO(Vec3)) -STRUCT_INFO_END(SMeshMorphTargetVertex) - -STRUCT_INFO_BEGIN(SMeshMorphTargetHeader) -STRUCT_VAR_INFO(MeshID, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(NameLength, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numIntVertices, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numExtVertices, TYPE_INFO(uint32)) -STRUCT_INFO_END(SMeshMorphTargetHeader) - -STRUCT_INFO_BEGIN(SMeshPhysicalProxyHeader) -STRUCT_VAR_INFO(ChunkID, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numPoints, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numIndices, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(numMaterials, TYPE_INFO(uint32)) -STRUCT_INFO_END(SMeshPhysicalProxyHeader) - -STRUCT_INFO_BEGIN(BONEINITIALPOS_CHUNK_DESC_0001) -STRUCT_VAR_INFO(nChunkIdMesh, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(numBones, TYPE_INFO(unsigned int)) -STRUCT_INFO_END(BONEINITIALPOS_CHUNK_DESC_0001) - -STRUCT_INFO_BEGIN(SBoneInitPosMatrix) -STRUCT_VAR_INFO(mx, TYPE_ARRAY(4, TYPE_ARRAY(3, TYPE_INFO(float)))) -STRUCT_INFO_END(SBoneInitPosMatrix) - -STRUCT_INFO_BEGIN(EXPORT_FLAGS_CHUNK_DESC) -STRUCT_VAR_INFO(flags, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(rc_version, TYPE_ARRAY(4, TYPE_INFO(unsigned int))) -STRUCT_VAR_INFO(rc_version_string, TYPE_ARRAY(16, TYPE_INFO(char))) -STRUCT_VAR_INFO(assetAuthorTool, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(authorToolVersion, TYPE_INFO(uint32)) -STRUCT_VAR_INFO(reserved, TYPE_ARRAY(30, TYPE_INFO(unsigned int))) -STRUCT_INFO_END(EXPORT_FLAGS_CHUNK_DESC) - -STRUCT_INFO_BEGIN(BREAKABLE_PHYSICS_CHUNK_DESC) -STRUCT_VAR_INFO(granularity, TYPE_INFO(unsigned int)) -STRUCT_VAR_INFO(nMode, TYPE_INFO(int)) -STRUCT_VAR_INFO(nRetVtx, TYPE_INFO(int)) -STRUCT_VAR_INFO(nRetTets, TYPE_INFO(int)) -STRUCT_VAR_INFO(nReserved, TYPE_ARRAY(10, TYPE_INFO(int))) -STRUCT_INFO_END(BREAKABLE_PHYSICS_CHUNK_DESC) - -STRUCT_INFO_BEGIN(FOLIAGE_INFO_CHUNK_DESC) -STRUCT_VAR_INFO(nSpines, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSpineVtx, TYPE_INFO(int)) -STRUCT_VAR_INFO(nSkinnedVtx, TYPE_INFO(int)) -STRUCT_VAR_INFO(nBoneIds, TYPE_INFO(int)) -STRUCT_INFO_END(FOLIAGE_INFO_CHUNK_DESC) - -STRUCT_INFO_BEGIN(FOLIAGE_SPINE_SUB_CHUNK) -STRUCT_VAR_INFO(nVtx, TYPE_INFO(char)) -STRUCT_VAR_INFO(len, TYPE_INFO(float)) -STRUCT_VAR_INFO(navg, TYPE_INFO(Vec3)) -STRUCT_VAR_INFO(iAttachSpine, TYPE_INFO(unsigned char)) -STRUCT_VAR_INFO(iAttachSeg, TYPE_INFO(unsigned char)) -STRUCT_INFO_END(FOLIAGE_SPINE_SUB_CHUNK) diff --git a/Code/Legacy/CryCommon/CrySizer.h b/Code/Legacy/CryCommon/CrySizer.h index 3f9eed84f6..27323368ab 100644 --- a/Code/Legacy/CryCommon/CrySizer.h +++ b/Code/Legacy/CryCommon/CrySizer.h @@ -24,7 +24,6 @@ #include "Cry_Math.h" #include -#include #include #include #include @@ -36,7 +35,6 @@ struct AABB; struct SVF_P3F; struct SVF_P3F_C4B_T2F; -struct SVF_P3F_C4B_T2S; struct SVF_P3S_C4B_T2S; struct SPipTangents; @@ -237,7 +235,6 @@ public: void AddObject(const AABB&) {} void AddObject(const SVF_P3F&) {} void AddObject(const SVF_P3F_C4B_T2F&) {} - void AddObject(const SVF_P3F_C4B_T2S&) {} void AddObject(const SVF_P3S_C4B_T2S&) {} void AddObject(const SPipTangents&) {} void AddObject([[maybe_unused]] const AZ::Vector3& rObj) {} @@ -301,26 +298,6 @@ public: } } - template - void AddObject(const DynArray& rVector) - { - if (rVector.empty()) - { - this->AddObject(rVector.begin(), rVector.get_alloc_size()); - return; - } - - if (!this->AddObject(rVector.begin(), rVector.get_alloc_size())) - { - return; - } - - for (typename DynArray::const_iterator it = rVector.begin(); it != rVector.end(); ++it) - { - this->AddObject(*it); - } - } - template void AddObject(const PodArray& rVector) { diff --git a/Code/Legacy/CryCommon/CryTypeInfo.cpp b/Code/Legacy/CryCommon/CryTypeInfo.cpp deleted file mode 100644 index 82743f7eef..0000000000 --- a/Code/Legacy/CryCommon/CryTypeInfo.cpp +++ /dev/null @@ -1,1472 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Implementation of TypeInfo classes and functions. - -#include -#include "CryTypeInfo.h" -#include "CryCustomTypes.h" -#include "Cry_Math.h" -#include "CrySizer.h" -#include "CryEndian.h" -#include "TypeInfo_impl.h" -#include - -// Traits -#if defined(AZ_RESTRICTED_PLATFORM) - #include AZ_RESTRICTED_FILE(CryTypeInfo_cpp) -#elif defined(LINUX) || defined(APPLE) -#define CRYTYPEINFO_CPP_TRAIT_DEFINE_LTOA_S 1 -#endif - -#if CRYTYPEINFO_CPP_TRAIT_DEFINE_LTOA_S - -char* _ltoa_s(long value, char* string, size_t size, int32 radix) -{ - if (10 == radix) - { - sprintf_s(string, size, "%ld", value); - } - else - { - sprintf_s(string, size, "%lx", value); - } - return(string); -} - - -char* _i64toa_s(int64 value, char* string, size_t size, int32 radix) -{ - if (10 == radix) - { - sprintf_s(string, size, "%llu", (unsigned long long)value); - } - else - { - sprintf_s(string, size, "%llx", (unsigned long long)value); - } - return(string); -} - -char* _ultoa_s(uint32 value, char* string, size_t size, int32 radix) -{ - if (10 == radix) - { - sprintf_s(string, size, "%.d", value); - } - else - { - sprintf_s(string, size, "%.x", value); - } - return(string); -} - -#endif //LINUX || MAC - -////////////////////////////////////////////////////////////////////// -// Case-insensitive comparison helpers. - -class StrNoCase -{ -public: - inline StrNoCase(cstr str) - : m_Str(str) {} - inline bool operator == (cstr str) const { return azstricmp(m_Str, str) == 0; } - inline bool operator != (cstr str) const { return azstricmp(m_Str, str) != 0; } -private: - cstr m_Str; -}; - -// Default Endian swap function, forwards to TypeInfo. -void SwapEndian(const CTypeInfo& Info, [[maybe_unused]] size_t nSizeCheck, void* data, size_t nCount, bool bWriting) -{ - assert(nSizeCheck == Info.Size); - Info.SwapEndian(data, nCount, bWriting); -} - -////////////////////////////////////////////////////////////////////// -// Basic TypeInfo implementations. - -// Basic type infos. - -DEFINE_TYPE_INFO(void, CTypeInfo, ("void", 0, 0)) - -TYPE_INFO_BASIC(bool) -TYPE_INFO_BASIC(char) -TYPE_INFO_BASIC(wchar_t) - -TYPE_INFO_INT(signed char) -TYPE_INFO_INT(unsigned char) -TYPE_INFO_INT(short) -TYPE_INFO_INT(unsigned short) -TYPE_INFO_INT(int) -TYPE_INFO_INT(unsigned int) -TYPE_INFO_INT(long) -TYPE_INFO_INT(unsigned long) -TYPE_INFO_INT(int64) -TYPE_INFO_INT(uint64) - -TYPE_INFO_BASIC(float) -TYPE_INFO_BASIC(double) - -TYPE_INFO_BASIC(AZStd::string) - - -const CTypeInfo&PtrTypeInfo() -{ - static CTypeInfo Info(TYPE_INFO_NAME(void*), sizeof(void*), alignof(void*)); - return Info; -} - -////////////////////////////////////////////////////////////////////// -// Basic type info implementations. - -// String conversion functions needed by TypeInfo. - -// bool -AZStd::string ToString(bool const& val) -{ - return val ? "true" : "false"; -} - -bool FromString(bool& val, cstr s) -{ - if (!strcmp(s, "0") || !azstricmp(s, "false")) - { - val = false; - return true; - } - if (!strcmp(s, "1") || !azstricmp(s, "true")) - { - val = true; - return true; - } - return false; -} - -// int64 -AZStd::string ToString(int64 const& val) -{ - char buffer[64]; - _i64toa_s(val, buffer, sizeof(buffer), 10); - return buffer; -} -// uint64 -AZStd::string ToString(uint64 const& val) -{ - char buffer[64]; - sprintf_s(buffer, "%" PRIu64, val); - return buffer; -} - - - -// long -AZStd::string ToString(long const& val) -{ - char buffer[64]; - _ltoa_s(val, buffer, sizeof(buffer), 10); - return buffer; -} - -// ulong -AZStd::string ToString(unsigned long const& val) -{ - char buffer[64]; - _ultoa_s(val, buffer, sizeof(buffer), 10); - return buffer; -} - -template -bool ClampedIntFromString(T& val, const char* s) -{ - bool signbit = *s == '-'; - s += signbit; - if (signbit && !TIntTraits::bSIGNED) - { - // Negative number on unsigned. - val = T(0); - return true; - } - - uint digit = (uint8) * s - '0'; - if (digit > 9) - { - // No digits. - return false; - } - - // Extract digits until overflow. - T v = static_cast(digit); - while ((digit = (uint8) * ++s - '0') <= 9) - { - T vnew = static_cast(v * 10 + digit); - if (vnew < v) - { - // Overflow. - if (signbit) - { - val = TIntTraits::nMIN; - } - else - { - val = TIntTraits::nMAX; - } - return true; - } - v = vnew; - } - - val = signbit ? ~v + 1 : v; - return true; -} - -bool FromString(int64& val, const char* s) { return ClampedIntFromString(val, s); } -bool FromString(uint64& val, const char* s) { return ClampedIntFromString(val, s); } - -bool FromString(long& val, const char* s) { return ClampedIntFromString(val, s); } -bool FromString(unsigned long& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(int const& val) { return ToString(long(val)); } -bool FromString(int& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(unsigned int const& val) { return ToString((unsigned long)(val)); } -bool FromString(unsigned int& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(short const& val) { return ToString(long(val)); } -bool FromString(short& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(unsigned short const& val) { return ToString((unsigned long)(val)); } -bool FromString(unsigned short& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(char const& val) { return ToString(long(val)); } -bool FromString(char& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(wchar_t const& val) { return ToString(long(val)); } -bool FromString(wchar_t& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(signed char const& val) { return ToString(long(val)); } -bool FromString(signed char& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(unsigned char const& val) { return ToString((unsigned long)(val)); } -bool FromString(unsigned char& val, const char* s) { return ClampedIntFromString(val, s); } - -AZStd::string ToString(const AZ::Uuid& val) -{ - return val.ToString(); -} - -bool FromString(AZ::Uuid& val, const char* s) -{ - val = AZ::Uuid(s); - return true; -} - -float NumToFromString(float val, int digits, bool floating, char buffer[], int buf_size) -{ - assert(buf_size >= 32); - if (floating) - { - if (val >= powf(10.f, float(digits))) - { - sprintf_s(buffer, buf_size, "%.0f", val); - } - else - { - sprintf_s(buffer, buf_size, "%.*g", digits, val); - } - } - else - { - sprintf_s(buffer, buf_size, "%.*f", digits, float(val)); - } -#if !defined(NDEBUG) - int readCount = -#endif - azsscanf(buffer, "%g", &val); - assert(readCount == 1); - return val; -} - -// double -AZStd::string ToString(double const& val) -{ - char buffer[64]; - sprintf_s(buffer, "%.16g", val); - return buffer; -} -bool FromString(double& val, const char* s) -{ - return azsscanf(s, "%lg", &val) == 1; -} - -// float -AZStd::string ToString(float const& val) -{ - char buffer[64]; - for (int digits = 7; digits < 10; digits++) - { - if (NumToFromString(val, digits, true, buffer, 64) == val) - { - break; - } - } - return buffer; -} - -bool FromString(float& val, const char* s) -{ - return azsscanf(s, "%g", &val) == 1; -} - - - -// string override. -template <> -void TTypeInfo::GetMemoryUsage(ICrySizer* pSizer, void const* data) const -{ - // CRAIG: just a temp hack to try and get things working -#if !defined(LINUX) && !defined(APPLE) - pSizer->AddString(*(AZStd::string*)data); -#endif -} - -#if defined(TEST_TYPEINFO) && defined(_DEBUG) - -struct STypeInfoTest -{ - STypeInfoTest() - { - TestType(AZStd::string("well")); - - TestType(true); - - TestType(int8(-0x12)); - TestType(uint8(0x87)); - TestType(int16(-0x1234)); - TestType(uint16(0x8765)); - TestType(int32(-0x12345678)); - TestType(uint32(0x87654321)); - TestType(int64(-0x123456789ABCDEF0LL)); - TestType(uint64(0xFEDCBA9876543210LL)); - - TestType(float(1234.5678)); - TestType(float(12345678)); - TestType(float(12345678e-20)); - TestType(float(12345678e20)); - - TestType(double(987654321.0123456789)); - TestType(double(9876543210123456789.0)); - TestType(double(9876543210123456789e-40)); - TestType(double(9876543210123456789e40)); - } -}; -static STypeInfoTest _TypeInfoTest; - -#endif //TEST_TYPEINFO - - -////////////////////////////////////////////////////////////////////// -// CTypeInfo implementation - -//--------------------------------------------------------------------------- -// Endian helper functions. - -void CTypeInfo::SwapEndian(void* pData, size_t nCount, [[maybe_unused]] bool bWriting) const -{ - switch (Size) - { - case 1: - break; - case 2: - ::SwapEndianBase((uint16*)pData, nCount); - break; - case 4: - ::SwapEndianBase((uint32*)pData, nCount); - break; - case 8: - ::SwapEndianBase((uint64*)pData, nCount); - break; - default: - assert(0); - } -} - -// If attr name is found, return pointer to start of value text; else 0. -static cstr FindAttr(cstr attrs, cstr name) -{ - size_t name_len = strlen(name); - while (attrs) - { - attrs = strchr(attrs, '<'); - if (!attrs) - { - return 0; - } - - attrs++; - size_t attr_len = strcspn(attrs, "=>"); - if (attr_len == name_len && _strnicmp(attrs, name, name_len) == 0) - { - attrs += attr_len; - if (*attrs == '=') - { - ++attrs; - } - return attrs; - } - attrs += attr_len; - if (*attrs == '=') - { - attrs = strchr(attrs + 1, '>'); - } - } - return 0; -} - -bool CTypeInfo::CVarInfo::GetAttr(cstr name) const -{ - return FindAttr(Attrs, name) != 0; -} - -bool CTypeInfo::CVarInfo::GetAttr(cstr name, AZStd::string& val) const -{ - cstr valstr = FindAttr(Attrs, name); - if (!valstr) - { - return false; - } - - // Find attr delimiter. - cstr end = strchr(valstr, '>'); - if (!end) - { - return false; - } - - // Strip quotes. - if (*valstr == '"') - { - valstr++; - if (end - valstr > 1 && end[-1] == '"') - { - end--; - } - } - val = AZStd::string(valstr, end - valstr); - return true; -} - -bool CTypeInfo::CVarInfo::GetAttr(cstr name, float& val) const -{ - cstr valstr = FindAttr(Attrs, name); - if (!valstr) - { - return false; - } - val = (float)atof(valstr); - return true; -} - -cstr CTypeInfo::CVarInfo::GetComment() const -{ - cstr send = strrchr(Attrs, '>'); - if (send) - { - do - { - ++send; - } while (*send == ' '); - return send; - } - else - { - return Attrs; - } -} - -////////////////////////////////////////////////////////////////////// -// CStructInfo implementation - -inline cstr DisplayName(cstr name) -{ - // Skip prefixes in Name. - cstr dname = name; - while (islower((unsigned char)*dname) || *dname == '_') - { - dname++; - } - if (isupper((unsigned char)*dname)) - { - return dname; - } - else - { - return name; - } -} - -CStructInfo::CStructInfo(cstr name, size_t size, size_t align, Array vars, Array templates) - : CTypeInfo(name, size, align) - , Vars(vars) - , TemplateTypes(templates) - , HasBitfields(false) -{ - // Process and validate offsets and sizes. - if (Vars.size() > 0) - { - size = 0; - int bitoffset = 0; - - for (int i = 0; i < Vars.size(); i++) - { - CStructInfo::CVarInfo& var = Vars[i]; - - // Convert name. - var.Name = DisplayName(var.Name); - - if (var.bBitfield) - { - HasBitfields = true; - if (bitoffset > 0) - { - // Continuing bitfield. - var.Offset = Vars[i - 1].Offset; - var.BitWordWidth = Vars[i - 1].BitWordWidth; - - if (bitoffset + var.ArrayDim > var.GetSize() * 8) - { - // Overflows word, start on next one. - bitoffset = 0; - size += var.GetSize(); - } - } - - if (bitoffset == 0) - { - var.Offset = check_cast(size); - - // Detect real word size of bitfield, from offset of next field. - size_t next_offset = Size; - for (int j = i + 1; j < Vars.size(); j++) - { - if (!Vars[j].bBitfield) - { - next_offset = Vars[j].Offset; - break; - } - } - assert(next_offset > size); - size_t wordsize = min(next_offset - size, var.Type.Size); - size = next_offset; - switch (wordsize) - { - case 1: - var.BitWordWidth = 0; - break; - case 2: - var.BitWordWidth = 1; - break; - case 4: - var.BitWordWidth = 2; - break; - case 8: - var.BitWordWidth = 3; - break; - default: - assert(0); - } - } - - assert(var.ArrayDim <= var.GetSize() * 8); - var.BitOffset = bitoffset; - bitoffset += var.ArrayDim; - } - else - { - bitoffset = 0; - if (var.Offset >= size) - { - size = var.Offset + var.GetSize(); - } - } - } - assert(Align(size, Alignment) == Align(Size, Alignment)); - } -} - -size_t EndianDescSize(cstr desc) -{ - // Iterate the endian descriptor. - size_t nSize = 0; - for (; *desc; desc++) - { - size_t count = *desc & 0x3F; - size_t nType = *(uint8*)desc >> 6; - nSize += count << nType; - } - return nSize; -} - -size_t CStructInfo::AddEndianDesc(cstr desc, size_t dim, size_t elem_size) -{ - if (dim == 0) - { - return 0; - } - - size_t endian_size = EndianDescSize(desc); - size_t total_size = elem_size * (dim - 1) + endian_size; - - if (desc[1] || (endian_size < elem_size && dim > 1)) - { - // Composite endian descriptor, replicate it. - assert(endian_size <= elem_size); - assert(elem_size - endian_size < 0x40); - while (dim-- > 0) - { - EndianDesc += (cstr)desc; - if (dim > 1 && endian_size < elem_size) - { - EndianDesc += char(0x40 | (elem_size - endian_size)); - } - } - } - else - { - // Single endian component. Replicate using count field. - size_t subdim = desc[0] & 0x3F; - dim *= subdim; - if (!EndianDesc.empty()) - { - // Combine with previous component if possible. - char prevdesc = *(EndianDesc.end() - 1); - if ((prevdesc & ~0x3F) == (desc[0] & ~0x3F)) - { - // Combine with previous char. - size_t maxdim = min(dim, size_t(0x3F - (prevdesc & 0x3F))); - prevdesc += check_cast(maxdim); - EndianDesc.erase(EndianDesc.length() - 1, 1); - EndianDesc.append(1, prevdesc); - dim -= maxdim; - } - } - for (; dim > 0x3F; dim -= 0x3F) - { - EndianDesc += desc[0] | 0x3F; - } - if (dim > 0) - { - EndianDesc += check_cast((desc[0] & ~0x3F) | dim); - } - } - - return total_size; -} - -bool CStructInfo::FromValue(void* data, const void* value, const CTypeInfo& typeVal) const -{ - if (IsCompatibleType(typeVal)) - { - bool bOK = true; - int i = 0; - for AllSubVars(pToVar, typeVal) - { - if (!Vars[i].Type.FromValue(Vars[i].GetAddress(data), pToVar->GetAddress(value), pToVar->Type)) - { - bOK = false; - } - i++; - } - return bOK; - } - - // Check all subclasses. - for (int i = 0; i < Vars.size() && Vars[i].IsBaseClass(); i++) - { - if (Vars[i].Type.FromValue(Vars[i].GetAddress(data), value, typeVal)) - { - return true; - } - } - return false; -} - -bool CStructInfo::ToValue(const void* data, void* value, const CTypeInfo& typeVal) const -{ - if (IsCompatibleType(typeVal)) - { - bool bOK = true; - int i = 0; - for AllSubVars(pToVar, typeVal) - { - if (!Vars[i].Type.ToValue(Vars[i].GetAddress(data), pToVar->GetAddress(value), pToVar->Type)) - { - bOK = false; - } - i++; - } - return bOK; - } - - // Check all subclasses. - for (int i = 0; i < Vars.size() && Vars[i].IsBaseClass(); i++) - { - if (Vars[i].Type.ToValue(Vars[i].GetAddress(data), value, typeVal)) - { - return true; - } - } - return false; -} - -// Parse structs as comma-separated values. - -/* , 1, ,2 1,2 - - Top 1 ,2 1,2 ; strip trail commas - Child Named 1 (,2) (1,2) ; strip trail commas, paren if internal commas - Nameless , 1, ,2 1,2 ; -*/ - -static void StripCommas(AZStd::string& str) -{ - size_t nLast = str.size(); - while (nLast > 0 && str[nLast - 1] == ',') - { - nLast--; - } - str.resize(nLast); -} - -AZStd::string CStructInfo::ToString(const void* data, FToString flags, const void* def_data) const -{ - AZStd::string str; // Return str. - - for (int i = 0; i < Vars.size(); i++) - { - // Handling of empty values: Skip trailing empty values. - // If there are intermediate empty values, replace them with non-empty ones. - const CVarInfo& var = Vars[i]; - - if (!var.IsInline()) - { - // Named sub var or struct. - if (!flags.NamedFields && i > 0) - { - str += ","; - } - - AZStd::string substr = var.ToString(data, FToString(flags).Sub(0), def_data); - - if (flags.SkipDefault && substr.empty()) - { - continue; - } - - if (flags.NamedFields) - { - if (*str.c_str()) - { - str += ","; - } - if (*var.Name) - { - str += var.Name; - str += "="; - } - } - if (substr.find(',') != AZStd::string::npos || substr.find('=') != AZStd::string::npos) - { - // Encase nested composite types in parens. - str += "("; - str += substr; - str += ")"; - } - else - { - str += substr; - } - } - else - { - // Nameless base struct. Treat children as inline. - str += var.ToString(data, FToString(flags).Sub(1), def_data); - } - } - - if (flags.SkipDefault && !flags.Sub) - { - StripCommas(str); - } - return str; -} - -// Retrieve and return one subelement from src, advancing the pointer. -// Copy to tempstr if necessary. - -typedef AZStd::fixed_string<256> CTempStr; - -void ParseElement(cstr& src, cstr& varname, cstr& val, CTempStr& tempstr) -{ - varname = val = 0; - - while (*src == ' ') - { - src++; - } - if (!*src) - { - return; - } - - // Find end of var assignment. - int nest = 0; - cstr eq = 0; - - cstr end; - for (end = src; *end; end++) - { - if (*end == '(') - { - nest++; - } - else if (*end == ')') - { - nest--; - } - else if (nest == 0) - { - if (*end == '=' && !eq) - { - eq = end; - } - else if (*end == ',') - { - break; - } - } - } - - // Advance src past element. - val = src; - src = end; - - if (*src == ',') - { - src++; - } - - if (eq) - { - varname = val; - val = eq + 1; - } - - PREFAST_ASSUME(val); - if (*val == '(' && end[-1] == ')') - { - // Remove parens. - val++; - end--; - } - - if (eq) - { - if (*end) - { - // Must copy sub string to temp. - val = tempstr.c_str() + (val - varname); - eq = tempstr.c_str() + (eq - varname); - tempstr.assign(varname, end); - varname = tempstr.c_str(); - non_const(*eq) = 0; - } - else - { - // Copy just varname to temp, return val in place. - tempstr.assign(varname, eq); - varname = tempstr.c_str(); - } - } - else if (*end) - { - // Must copy sub string to temp. - tempstr.assign(val, end); - val = tempstr.c_str(); - } - - // Else can return val without copying. -} - -bool CStructInfo::FromString(void* data, cstr str, FFromString flags) const -{ - if (!flags.SkipEmpty) - { - // Initialise all to default - for (int i = 0; i < Vars.size(); i++) - { - Vars[i].FromString(data, ""); - } - } - - CTempStr tempstr; - const CVarInfo* pVar = 0; - int nErrors = 0; - - while (*str) - { - cstr varname, val; - ParseElement(str, varname, val, tempstr); - - if (varname) - { - pVar = FindSubVar(varname); - } - else - { - pVar = NextSubVar(pVar, true); - } - if (pVar) - { - if (*val || !flags.SkipEmpty) - { - nErrors += !pVar->FromString(data, val, flags); - } - } - else - { - nErrors++; - } - } - - return !nErrors; -} - -bool CStructInfo::ValueEqual(const void* data, const void* def_data) const -{ - for (int i = 0; i < Vars.size(); i++) - { - const CVarInfo& var = Vars[i]; - if (!var.Type.ValueEqual((char*)data + var.Offset, (def_data ? (char*)def_data + var.Offset : 0))) - { - return false; - } - } - return true; -} - -void CStructInfo::SwapEndian(void* data, size_t nCount, bool bWriting) const -{ - non_const(*this).MakeEndianDesc(); - - if (EndianDesc.length() == 1 && !HasBitfields && EndianDescSize(EndianDesc.c_str()) == Size) - { - // Optimised array swap. - size_t nElems = (EndianDesc[0u] & 0x3F) * nCount; - switch (EndianDesc[0u] & 0xC0) - { - case 0: // Skip bytes - break; - case 0x40: // Swap 2 bytes - ::SwapEndianBase((uint16*)data, nElems); - break; - case 0x80: // Swap 4 bytes - ::SwapEndianBase((uint32*)data, nElems); - break; - case 0xC0: // Swap 8 bytes - ::SwapEndianBase((uint64*)data, nElems); - break; - } - return; - } - - for (; nCount-- > 0; data = (char*)data + Size) - { - // First swap bits. - // Iterate the endian descriptor. - void* step = data; - for (cstr desc = EndianDesc.c_str(); *desc; desc++) - { - size_t nElems = *desc & 0x3F; - switch (*desc & 0xC0) - { - case 0: // Skip bytes - step = (uint8*)step + nElems; - break; - case 0x40: // Swap 2 bytes - ::SwapEndianBase((uint16*)step, nElems); - step = (uint16*)step + nElems; - break; - case 0x80: // Swap 4 bytes - ::SwapEndianBase((uint32*)step, nElems); - step = (uint32*)step + nElems; - break; - case 0xC0: // Swap 8 bytes - ::SwapEndianBase((uint64*)step, nElems); - step = (uint64*)step + nElems; - break; - } - } - - // Then bitfields if needed. - if (HasBitfields) - { - uint64 uOrigBits = 0, uNewBits = 0; - for (int i = 0; i < Vars.size(); i++) - { - CVarInfo const& var = Vars[i]; - if (var.bBitfield) - { - // Reverse location of all bitfields in word. - size_t nWordBits = var.GetElemSize() * 8; - assert(nWordBits <= 64); - if (var.BitOffset == 0) - { - // Initialise bitfield swapping. - var.Type.ToValue(var.GetAddress(data), uOrigBits); - uNewBits = 0; - } - size_t nSrcOffset = (GetPlatformEndian() == eLittleEndian) == bWriting ? var.BitOffset : nWordBits - var.GetBits() - var.BitOffset; - size_t nDstOffset = nWordBits - var.GetBits() - nSrcOffset; - - uint64 uFieldVal = uOrigBits >> nSrcOffset; - uFieldVal &= ((1 << var.GetBits()) - 1); - uNewBits |= uFieldVal << nDstOffset; - var.Type.FromValue(var.GetAddress(data), uNewBits); - } - } - } - } -} - -void CStructInfo::MakeEndianDesc() -{ - if (!EndianDesc.empty()) - { - return; - } - - size_t last_offset = 0; - for (int i = 0; i < Vars.size(); i++) - { - CVarInfo const& var = Vars[i]; - bool bUnionAlias = var.bBitfield ? var.BitOffset > 0 : var.Offset < last_offset; - if (!bUnionAlias) - { - // Add endian desc for member. - cstr subdesc = 0; - if (var.Type.HasSubVars()) - { - // Struct-computed endian desc. - CStructInfo const& infoSub = static_cast(var.Type); - non_const(infoSub).MakeEndianDesc(); - subdesc = infoSub.EndianDesc.c_str(); - if (!*subdesc) - { - // No swapping. - continue; - } - } - else - { - // Basic type. - switch (var.GetElemSize()) - { - case 0: - case 1: - continue; // No swapping needed. - case 2: - subdesc = "\x41"; - break; - case 4: - subdesc = "\x81"; - break; - case 8: - subdesc = "\xC1"; - break; - default: - assert(0); - } - } - - // Apply any padding to current offset. - assert(last_offset <= var.Offset); - if (last_offset < var.Offset) - { - last_offset += AddEndianDesc("\x01", var.Offset - last_offset, 1); - } - last_offset += AddEndianDesc(subdesc, var.GetDim(), var.GetElemSize()); - } - } -} - -void CStructInfo::GetMemoryUsage(ICrySizer* pSizer, void const* data) const -{ - for (int i = 0; i < Vars.size(); i++) - { - Vars[i].Type.GetMemoryUsage(pSizer, (char*)data + Vars[i].Offset); - } -} - -const CTypeInfo::CVarInfo* CStructInfo::NextSubVar(const CVarInfo* pPrev, bool bRecurseBase) const -{ - if (pPrev >= Vars.begin() && pPrev < Vars.end()) - { - // pPrev is within this struct's vars - if (++pPrev < Vars.end()) - { - return pPrev; - } - return 0; - } - - if (Vars.empty()) - { - return 0; - } - - if (bRecurseBase) - { - // Recurse into inline base structs - const CVarInfo* pBase = Vars.begin(); - if (pBase->IsInline()) - { - if (const CVarInfo* pNext = pBase->Type.NextSubVar(pPrev, true)) - { - return pNext; - } - if (++pBase < Vars.end()) - { - return pBase; - } - return 0; - } - } - - if (!pPrev) - { - // Return first var - return Vars.begin(); - } - - return 0; -} - -const CTypeInfo::CVarInfo* CStructInfo::FindSubVar(cstr name) const -{ - static int s_nLast = 0; - int nSize = Vars.size(); - if (s_nLast >= nSize) - { - s_nLast = 0; - } - - for (int i = s_nLast, iEnd = s_nLast + nSize; i < iEnd; i++) - { - int v = i >= nSize ? i - nSize : i; - const CVarInfo& var = Vars[v]; - if (var.Type.Size > 0 && StrNoCase(var.GetName()) == name) - { - s_nLast = v; - return &var; - } - if (var.IsBaseClass()) - { - if (const CVarInfo* pSubVar = var.Type.FindSubVar(name)) - { - return pSubVar; - } - } - } - return 0; -} - -bool CStructInfo::IsCompatibleType(CTypeInfo const& Info) const -{ - if (this == &Info) - { - return true; - } - - if (!TemplateTypes.empty() && Info.IsTemplate() && strcmp(Name, Info.Name) == 0) - { - CTypeInfo const* const* pA = NextTemplateType(0); - CTypeInfo const* const* pB = Info.NextTemplateType(0); - - while (pA && pB && (*pA)->IsType(**pB)) - { - pA = Info.NextTemplateType(pA); - pB = Info.NextTemplateType(pB); - } - return !pA && !pB; - } - - return false; -} - -bool CStructInfo::IsType(CTypeInfo const& Info) const -{ - if (IsCompatibleType(Info)) - { - return true; - } - - // Check all subclasses. - for (int i = 0; i < Vars.size() && Vars[i].IsBaseClass(); i++) - { - if (Vars[i].Type.IsType(Info)) - { - return true; - } - } - return false; -} - -////////////////////////////////////////////////////////////////////// -// CSimpleEnumDef implementation - -cstr ParseNextEnum(char*& rs) -{ - char* s = rs; - while (isspace(*s)) - { - s++; - } - if (!*s) - { - return 0; - } - - cstr se = s; - while (isalnum(*s) || *s == '_') - { - s++; - } - - if (*s == ',') - { - *s++ = 0; - } - else if (*s) - { - *s++ = 0; - while (*s && *s != ',') - { - s++; - } - if (*s) - { - s++; - } - } - rs = s; - return se; -} - -void CSimpleEnumDef::Init(Array names, char* enum_str) -{ - asNames = names; - - // Split copy of enums string into elements, store in array. - int i = 0; - while (cstr se = ParseNextEnum(enum_str)) - { - asNames[i++] = se; - } -} - -////////////////////////////////////////////////////////////////////// -// CEnumDef implementation - -void CEnumDef::Init(Array elems, char* enum_str) -{ - Elems = elems; - MinValue = 0; - bRegular = true; - nPrefixLength = 0; - - if (enum_str) - { - // Parse enum names from str - int i = 0; - while (cstr se = ParseNextEnum(enum_str)) - { - Elems[i++].Name = se; - } - } - - // Analyse names and values. - if (!elems.empty()) - { - cstr sPrefix = ""; - MinValue = Elems[0].Value; - for (int i = 0; i < elems.size(); i++) - { - if (Elems[i].Value != i + Elems[0].Value) - { - bRegular = false; - } - MinValue = min(MinValue, Elems[i].Value); - - // Find common prefix. - cstr sElem = Elems[i].Name; - if (*sElem) - { - if (!*sPrefix) - { - sPrefix = sElem; - nPrefixLength = static_cast(strlen(sPrefix)); - } - else - { - uint p = 0; - while (p < nPrefixLength && sElem[p] == sPrefix[p]) - { - p++; - } - nPrefixLength = p; - } - } - } - - // Ensure prefix is on underscore boundary. - while (nPrefixLength > 0 && sPrefix[nPrefixLength - 1] != '_') - { - nPrefixLength--; - } - } -} - -bool CEnumDef::MatchName(uint i, cstr str) const -{ - cstr name = Elems[i].Name; - if (*name && nPrefixLength) - { - if (azstricmp(name + nPrefixLength, str) == 0) - { - return true; - } - } - if (*name == '_') - { - name++; - } - return azstricmp(name, str) == 0; -} - -cstr CEnumDef::ToName(TValue value) const -{ - // Find matching element. - if (bRegular) - { - TValue index = value - MinValue; - if (index >= 0 && index < Elems.size()) - { - return Name((uint)index); - } - } - else - { - for (int i = 0; i < Elems.size(); i++) - { - if (Elems[i].Value == value) - { - return Name(i); - } - } - } - - // No match - return 0; -} - -LegacyDynArray* CEnumDef::SInit::s_pElems = 0; - -void CEnumDefUuid::Init(Array elems, char* enum_str) -{ - Elems = elems; - bRegular = false; - nPrefixLength = 0; - - if (enum_str) - { - // Parse enum names from str - int i = 0; - while (cstr se = ParseNextEnum(enum_str)) - { - Elems[i++].Name = se; - } - } - - // Analyse names and values. - if (!elems.empty()) - { - cstr sPrefix = ""; - for (int i = 0; i < elems.size(); i++) - { - // Find common prefix. - cstr sElem = Elems[i].Name; - if (*sElem) - { - if (!*sPrefix) - { - sPrefix = sElem; - nPrefixLength = static_cast(strlen(sPrefix)); - } - else - { - uint p = 0; - while (p < nPrefixLength && sElem[p] == sPrefix[p]) - { - p++; - } - nPrefixLength = p; - } - } - } - - // Ensure prefix is on underscore boundary. - while (nPrefixLength > 0 && sPrefix[nPrefixLength - 1] != '_') - { - nPrefixLength--; - } - } -} - -bool CEnumDefUuid::MatchName(uint i, cstr str) const -{ - cstr name = Elems[i].Name; - if (*name && nPrefixLength) - { - if (azstricmp(name + nPrefixLength, str) == 0) - { - return true; - } - } - if (*name == '_') - { - name++; - } - return azstricmp(name, str) == 0; -} - -cstr CEnumDefUuid::ToName(AZ::Uuid value) const -{ - // Find matching element. - for (int i = 0; i < Elems.size(); ++i) - { - if (Elems[i].Value == value) - { - return Elems[i].Name; - } - } - // No match - return 0; -} diff --git a/Code/Legacy/CryCommon/CryTypeInfo.h b/Code/Legacy/CryCommon/CryTypeInfo.h deleted file mode 100644 index dbc3fdb642..0000000000 --- a/Code/Legacy/CryCommon/CryTypeInfo.h +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Declaration of CTypeInfo and related types. - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYTYPEINFO_H -#define CRYINCLUDE_CRYCOMMON_CRYTYPEINFO_H -#pragma once - -#include -#include "CryArray.h" -#include "Options.h" -#include "TypeInfo_decl.h" - -class ICrySizer; - -//--------------------------------------------------------------------------- -// Specify options for converting data to/from strings -struct FToString -{ - OPT_STRUCT(FToString) - OPT_VAR(bool, SkipDefault) // Omit default values on writing. - OPT_VAR(bool, NamedFields) // Add Name= text to sub-values. - OPT_VAR(bool, Sub) // Write sub-structures (internal usage). -}; - -struct FFromString -{ - OPT_STRUCT(FFromString) - OPT_VAR(bool, SkipEmpty) // Do not set values from empty strings (otherwise, set to zero). -}; - -// Specify which limits a variable has -enum ENumericLimit -{ - eLimit_Min, - eLimit_Max, - eLimit_SoftMin, - eLimit_SoftMax, - eLimit_MinIsInfinite, - eLimit_Step, -}; - -//--------------------------------------------------------------------------- -// Type info base class, and default implementation - -struct CTypeInfo -{ - cstr Name; - size_t Size; - size_t Alignment; - - CTypeInfo(cstr name, size_t size, size_t align) - : Name(name) - , Size(size) - , Alignment(align) {} - - virtual ~CTypeInfo() - {} - - // - // Inheritance. - // - virtual bool IsType(CTypeInfo const& Info) const - { return this == &Info; } - - template - bool IsType() const - { return IsType(TypeInfo((T*)0)); } - - // - // Data access interface. - // - - // Convert value to string. - virtual AZStd::string ToString([[maybe_unused]] const void* data, [[maybe_unused]] FToString flags = 0, [[maybe_unused]] const void* def_data = 0) const - { return ""; } - - // Write value from string, return success. - virtual bool FromString([[maybe_unused]] void* data, [[maybe_unused]] cstr str, [[maybe_unused]] FFromString flags = 0) const - { return false; } - - // Read and write values of a specified type. - virtual bool ToValue([[maybe_unused]] const void* data, [[maybe_unused]] void* value, [[maybe_unused]] const CTypeInfo& typeVal) const - { return false; } - - virtual bool FromValue([[maybe_unused]] void* data, [[maybe_unused]] const void* value, [[maybe_unused]] const CTypeInfo& typeVal) const - { return false; } - - // Templated interface to above functions. - template - bool ToValue(const void* data, T& value) const - { return ToValue(data, &value, TypeInfo(&value)); } - template - bool FromValue(void* data, const T& value) const - { return FromValue(data, &value, TypeInfo(&value)); } - - virtual bool ValueEqual(const void* data, const void* def_data = 0) const - { return ToString(data, FToString().SkipDefault(1), def_data).empty(); } - - virtual bool GetLimit([[maybe_unused]] ENumericLimit eLimit, [[maybe_unused]] float& fVal) const - { return false; } - - // Convert numeric formats from big-to-little endian or vice versa. - // Swaps bitfield order as well (which may be separate from integer bit order). - virtual void SwapEndian(void* pData, size_t nCount, bool bWriting) const; - - // Track memory used by any internal structures (not counting object size itself). - // Add to CrySizer as needed, return remaining mem count. - virtual void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer, [[maybe_unused]] const void* data) const - {} - - // - // Structure interface. - // - struct CVarInfo - { - const CTypeInfo& Type; // Info for type of variable. - cstr Name; // Display name of variable. - cstr Attrs; // Var-specific attribute string, of form: - // "" for each attr, concatenated. - // Remaining text considered as comment. - uint32 Offset; // Offset in bytes from struct start. - uint32 ArrayDim : 22, // Number of array elements, or bits if bitfield. - bBaseClass : 1, // Sub-var is actually a base class. - bBitfield : 1, // Var is a bitfield, ArrayDim is number of bits. - BitOffset : 6, // Additional offset in bits for bitfields. - // Bit offset is computed in declaration order; on some platforms, it goes high to low. - BitWordWidth : 2; // Width of bitfield = 1 byte << BitWordWidth - - - // Accessors. - cstr GetName() const { return Name; } - size_t GetDim() const { return bBitfield ? 1 : ArrayDim; } - size_t GetSize() const { return bBitfield ? (size_t)1 << BitWordWidth : Type.Size* ArrayDim; } - size_t GetElemSize() const { return bBitfield ? (size_t)1 << BitWordWidth : Type.Size; } - size_t GetBits() const { return bBitfield ? ArrayDim : ArrayDim* Type.Size* 8; } - bool IsBaseClass() const { return bBaseClass; } - bool IsInline() const - { - if (bBaseClass && Offset == 0) - { - const CVarInfo* pFirst = Type.NextSubVar(0); - if (pFirst) - { - return pFirst->IsBaseClass(); - } - } - return false; - } - - bool GetLimit(ENumericLimit eLimit, float& fVal) const - { - return Type.GetLimit(eLimit, fVal); - } - - // Useful functions. - void* GetAddress(void* base) const - { - return (char*)base + Offset; - } - const void* GetAddress(const void* base) const - { - return (const char*)base + Offset; - } - bool FromString(void* base, cstr str, FFromString flags = 0) const - { - assert(!bBitfield); - return Type.FromString((char*)base + Offset, str, flags); - } - AZStd::string ToString(const void* base, FToString flags = 0, const void* def_base = 0) const - { - assert(!bBitfield); - return Type.ToString((const char*)base + Offset, flags, def_base ? (const char*)def_base + Offset : 0); - } - - // Attribute access. Not fast. - bool GetAttr(cstr name) const; - bool GetAttr(cstr name, float& val) const; - bool GetAttr(cstr name, AZStd::string& val) const; - - // Comment, excluding attributes. - cstr GetComment() const; - }; - - // Structure var iteration. - virtual CVarInfo const* NextSubVar([[maybe_unused]] CVarInfo const* pPrev, [[maybe_unused]] bool bRecurseBase = false) const - { return 0; } - inline bool HasSubVars() const - { return NextSubVar(0) != 0; } - #define AllSubVars(pVar, Info) \ - (const CTypeInfo::CVarInfo* pVar = (Info).NextSubVar(0); pVar; pVar = (Info).NextSubVar(pVar)) - - // Named var search. - virtual const CVarInfo* FindSubVar([[maybe_unused]] cstr name) const - { return 0; } - - virtual CTypeInfo const* const* NextTemplateType([[maybe_unused]] CTypeInfo const* const* pPrev) const - { return 0; } - inline bool IsTemplate() const - { return NextTemplateType(0) != 0; } - - // - // String enumeration interface. - // Return sequential strings in enumeration, then 0 when out of range. - // String/int conversion is handled by ToString/FromString. - // - virtual cstr EnumElem([[maybe_unused]] uint nIndex) const { return 0; } -}; - - -#endif // CRYINCLUDE_CRYCOMMON_CRYTYPEINFO_H diff --git a/Code/Legacy/CryCommon/Cry_Camera.h b/Code/Legacy/CryCommon/Cry_Camera.h index 4d33260c44..852467d787 100644 --- a/Code/Legacy/CryCommon/Cry_Camera.h +++ b/Code/Legacy/CryCommon/Cry_Camera.h @@ -17,7 +17,6 @@ //DOC-IGNORE-BEGIN #include #include -#include //DOC-IGNORE-END ////////////////////////////////////////////////////////////////////// @@ -546,7 +545,7 @@ public: ILINE void SetMatrixNoUpdate(const Matrix34& mat) { assert(mat.IsOrthonormal()); m_Matrix = mat; }; ILINE const Matrix34& GetMatrix() const { return m_Matrix; }; ILINE Vec3 GetViewdir() const { return m_Matrix.GetColumn1(); }; - + ILINE void SetEntityRotation(const Quat& entityRot) { m_entityRot = entityRot; } ILINE Quat GetEntityRotation() { return m_entityRot; } ILINE void SetEntityPos(const Vec3& entityPos) { m_entityPos = entityPos; } @@ -626,11 +625,6 @@ public: uint8 IsAABBVisible_EH(const ::AABB& aabb, bool* pAllInside) const; uint8 IsAABBVisible_EH(const ::AABB& aabb) const; - // Multi-camera - bool IsAABBVisible_EHM(const ::AABB& aabb, bool* pAllInside) const; - bool IsAABBVisible_EM(const ::AABB& aabb) const; - bool IsAABBVisible_FM(const ::AABB& aabb) const; - //OBB-frustum test bool IsOBBVisible_F(const Vec3& wpos, const OBB& obb) const; uint8 IsOBBVisible_FH(const Vec3& wpos, const OBB& obb) const; @@ -648,7 +642,6 @@ public: SetFrustum(640, 480); m_zrangeMin = 0.0f; m_zrangeMax = 1.0f; - m_pMultiCamera = NULL; m_pPortal = NULL; m_JustActivated = 0; m_nPosX = m_nPosY = m_nSizeX = m_nSizeY = 0; @@ -704,8 +697,8 @@ private: Vec3 m_edge_flt; // this is the left/upper vertex of the far-clip-plane f32 m_asymLeft, m_asymRight, m_asymBottom, m_asymTop; // Shift to create asymmetric frustum (only used for GPU culling of tessellated objects) - f32 m_asymLeftProj, m_asymRightProj, m_asymBottomProj, m_asymTopProj; - f32 m_asymLeftFar, m_asymRightFar, m_asymBottomFar, m_asymTopFar; + f32 m_asymLeftProj, m_asymRightProj, m_asymBottomProj, m_asymTopProj; + f32 m_asymLeftFar, m_asymRightFar, m_asymBottomFar, m_asymTopFar; //usually we update these values every frame (they depend on m_Matrix) Vec3 m_cltp, m_crtp, m_clbp, m_crbp; //this are the 4 vertices of the projection-plane in cam-space @@ -774,7 +767,6 @@ public: uint16 x1, y1, x2, y2; }; ScissorInfo m_ScissorInfo; - class PodArray* m_pMultiCamera; // maybe used for culling instead of this camera Vec3 m_OccPosition; //Position for calculate occlusions (needed for portals rendering) inline const Vec3& GetOccPos() const { return(m_OccPosition); } @@ -930,7 +922,7 @@ inline void CCamera::SetFrustum(int nWidth, int nHeight, f32 FOV, f32 nearplane, //Apply asym shift to the camera frustum - Necessary for properly culling tessellated objects in VR //These are applied in UpdateFrustum to the camera space frustum planes - //Can't apply asym shift to frustum edges here. That would only apply to the top left corner + //Can't apply asym shift to frustum edges here. That would only apply to the top left corner //rather than the whole frustum. It would also interfere with shadow map application //m_asym is at the near plane, we want it at the projection plane too @@ -1576,102 +1568,6 @@ inline uint8 CCamera::IsAABBVisible_EH(const AABB& aabb) const return AdditionalCheck(aabb); //result is either "exclusion" or "overlap" } -// Description: -// Makes culling taking into account presence of m_pMultiCamera -// If m_pMultiCamera exists - object is visible if at least one of cameras see's it -// -// return values: -// true - box visible -// true - not visible -inline bool CCamera::IsAABBVisible_EHM(const AABB& aabb, bool* pAllInside) const -{ - assert(pAllInside && *pAllInside == false); - - if (!m_pMultiCamera) // use main camera - { - return IsAABBVisible_EH(aabb, pAllInside) != CULL_EXCLUSION; - } - - bool bVisible = false; - - for (int i = 0; i < m_pMultiCamera->Count(); i++) - { - bool bAllIn = false; - - if (m_pMultiCamera->GetAt(i).IsAABBVisible_EH(aabb, &bAllIn)) - { - bVisible = true; - - // don't break here always because another camera may include bbox completely - if (bAllIn) - { - *pAllInside = true; - break; - } - } - } - - return bVisible; -} - -// Description: -// Makes culling taking into account presence of m_pMultiCamera -// If m_pMultiCamera exists - object is visible if at least one of cameras see's it -// -// return values: -// true - box visible -// true - not visible -ILINE bool CCamera::IsAABBVisible_EM(const AABB& aabb) const -{ - if (!m_pMultiCamera) // use main camera - { - return IsAABBVisible_E(aabb) != CULL_EXCLUSION; - } - - // check several parallel cameras - object is visible if at least one camera see's it - - for (int i = 0; i < m_pMultiCamera->Count(); i++) - { - if (m_pMultiCamera->GetAt(i).IsAABBVisible_E(aabb)) - { - return true; - } - } - - return false; -} - - -// Description: -// Makes culling taking into account presence of m_pMultiCamera -// If m_pMultiCamera exists - object is visible if at least one of cameras see's it -// -// return values: -// true - box visible -// true - not visible -ILINE bool CCamera::IsAABBVisible_FM(const AABB& aabb) const -{ - PrefetchLine(&aabb, sizeof(AABB)); - - if (!m_pMultiCamera) // use main camera - { - return IsAABBVisible_F(aabb) != CULL_EXCLUSION; - } - - // check several parallel cameras - object is visible if at least one camera see's it - - for (int i = 0; i < m_pMultiCamera->Count(); i++) - { - if (m_pMultiCamera->GetAt(i).IsAABBVisible_F(aabb)) - { - return true; - } - } - - return false; -} - - // Description diff --git a/Code/Legacy/CryCommon/Cry_Color.h b/Code/Legacy/CryCommon/Cry_Color.h index abb79c6662..4f00f0c373 100644 --- a/Code/Legacy/CryCommon/Cry_Color.h +++ b/Code/Legacy/CryCommon/Cry_Color.h @@ -14,9 +14,9 @@ #define CRYINCLUDE_CRYCOMMON_CRY_COLOR_H #pragma once -#include #include #include +#include "Cry_Math.h" ILINE float FClamp(float X, float Min, float Max) { @@ -362,8 +362,6 @@ struct Color_tpl AZStd::array primitiveArray = { { r, g, b, a } }; return primitiveArray; } - - AUTO_STRUCT_INFO }; diff --git a/Code/Legacy/CryCommon/Cry_Geo.h b/Code/Legacy/CryCommon/Cry_Geo.h index f8a356c66f..95213c62dc 100644 --- a/Code/Legacy/CryCommon/Cry_Geo.h +++ b/Code/Legacy/CryCommon/Cry_Geo.h @@ -54,7 +54,6 @@ enum EGeomForm MaxGeomForm }; -AUTO_TYPE_INFO(EGeomForm) enum EGeomType { @@ -63,7 +62,6 @@ enum EGeomType GeomType_Physics, GeomType_Render, }; -AUTO_TYPE_INFO(EGeomType) struct PosNorm { @@ -104,7 +102,6 @@ struct RectF , h(1) { } - AUTO_STRUCT_INFO }; struct RectI @@ -705,8 +702,6 @@ struct AABB result.Add(c.mTip); return result; } - - AUTO_STRUCT_INFO }; ILINE bool IsEquivalent(const AABB& a, const AABB& b, float epsilon = VEC_EPSILON) diff --git a/Code/Legacy/CryCommon/Cry_GeoOverlap.h b/Code/Legacy/CryCommon/Cry_GeoOverlap.h deleted file mode 100644 index 039f292f5b..0000000000 --- a/Code/Legacy/CryCommon/Cry_GeoOverlap.h +++ /dev/null @@ -1,1982 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Common overlap-tests - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_GEOOVERLAP_H -#define CRYINCLUDE_CRYCOMMON_CRY_GEOOVERLAP_H -#pragma once - -#include -#include - -namespace Distance -{ - template - ILINE F Point_TriangleSq(const Vec3_tpl& p, const Triangle_tpl& t); - template - ILINE F Point_Lineseg2DSq(Vec3_tpl p, Lineseg lineseg, F& fT); - simdf Point_TriangleByPointsSq(const hwvec3& p, const hwvec3& t0, const hwvec3& t1, const hwvec3& t2); -} - - -namespace Overlap { - ILINE void FINDMINMAX(const f32 x0, const f32 x1, const f32 x2, f32& min_value, f32& max_value) - { - min_value = max_value = x0; - min_value = min(x1, min_value); - max_value = max(x1, max_value); - min_value = min(x2, min_value); - max_value = max(x2, max_value); - } - - inline bool Lineseg_AABB2D(const Lineseg&, const AABB&); - ILINE bool AABB_AABB2D(const AABB&, const AABB&); - - //////////////////////////////////////////////////////////////// - // Checks if the point is inside an AABB - /* inline bool Point_AABB(const Vec3 &p, const Vec3 &mins,const Vec3 &maxs) - { - if ((p.x>=mins.x && p.x<=maxs.x) && (p.y>=mins.y && p.y<=maxs.y) && (p.z>=mins.z && p.z<=maxs.z)) return (true); - return (false); - }*/ - - // Description: - // Checks if the point is inside an AABB - // The min value of the AABB is inclusive - // The max value of the AABB is exclusive - ILINE bool Point_AABB(const Vec3& p, const AABB& aabb) - { - return ((p.x >= aabb.min.x && p.x < aabb.max.x) && (p.y >= aabb.min.y && p.y < aabb.max.y) && (p.z >= aabb.min.z && p.z < aabb.max.z)); - } - - // Description: - // Checks if the point is inside a 2D AABB - // The min value of the AABB is inclusive - // The max value of the AABB is exclusive - template - ILINE bool Point_AABB2D(const PtType& p, const AABB& aabb) - { - return ((p.x >= aabb.min.x && p.x < aabb.max.x) && (p.y >= aabb.min.y && p.y < aabb.max.y)); - } - - // Description: - // Checks if the point is inside an AABB - // The min and max value of the AABB is inclusive - ILINE bool Point_AABB_MaxInclusive(const Vec3& p, const AABB& aabb) - { - return ((p.x >= aabb.min.x && p.x <= aabb.max.x) && (p.y >= aabb.min.y && p.y <= aabb.max.y) && (p.z >= aabb.min.z && p.z <= aabb.max.z)); - } - - // Description: - // Checks if the point is inside a 2D AABB - // The min and max value of the AABB is inclusive - template - ILINE bool Point_AABB2D_MaxInclusive(const PtType& p, const AABB& aabb) - { - return ((p.x >= aabb.min.x && p.x <= aabb.max.x) && (p.y >= aabb.min.y && p.y <= aabb.max.y)); - } - - // Description: - // Checks if a point is inside an OBB. - // Example: - // bool result=Overlap::Point_OBB( point, obb ); - ILINE bool Point_OBB(const Vec3& p, const Vec3& wpos, const OBB& obb) - { - AABB aabb = AABB(obb.c - obb.h, obb.c + obb.h); - Vec3 t = (p - wpos) * obb.m33; - return ((t.x >= aabb.min.x && t.x <= aabb.max.x) && (t.y >= aabb.min.y && t.y <= aabb.max.y) && (t.z >= aabb.min.z && t.z <= aabb.max.z)); - } - - // Description: - // Checks if a point is inside a sphere. - // Example: - // bool result=Overlap::Point_Sphere( point, sphere ); - ILINE bool Point_Sphere(const Vec3& p, const ::Sphere& s) - { - Vec3 distc = p - s.center; - f32 sqrad = s.radius * s.radius; - return (sqrad > (distc | distc)); - } - - /// Two line segments, in 2D (ignore z) - inline bool Lineseg_Lineseg2D(const Lineseg& lineA, const Lineseg& lineB) - { - const float Epsilon = 0.0000001f; - - Vec3 delta = lineB.start - lineA.start; - - Vec3 dirA = lineA.end - lineA.start; - Vec3 dirB = lineB.end - lineB.start; - - float det = dirA.x * dirB.y - dirA.y * dirB.x; - float detA = delta.x * dirB.y - delta.y * dirB.x; - float detB = delta.x * dirA.y - delta.y * dirA.x; - - float absDet = fabs_tpl(det); - - if (absDet >= Epsilon) - { - float invDet = 1.0f / det; - - float a = detA * invDet; - float b = detB * invDet; - - if ((a > 1.0f) || (a < 0.0f) || (b > 1.0f) || (b < 0.0f)) - { - return false; - } - } - else - { - return false; - } - - return true; - } - - - - /// Check if a point is within a polygon, in 2D (i.e. ignoring z coordinate) - /// The VecContainer should be a container of Vec3_tpl such that we can traverse - /// it using iterators. - /// - /// This works by checking all the lines that start/end above/below the point - /// and counting how many have the point on the right/left side. If the - /// point is inside, then left/right counts should be odd - if outside then - /// even. If it's on the edge then this algorithm will return an arbitrary - /// result. This is basically the same as casting a ray horizontally and - /// counting the intersections. - /// Don't mess with putting tolerances etc in this code, or chaning the < - /// to <= etc in case you're worried about the "ray" going through a vertex. - /// the only issue is when the point is on the edge - if you're worried about - /// that then use the separate function that indicates if a point is within - /// a certain tolerance of an edge. - template - inline bool Point_Polygon2D(const PtType& p, const VecContainer& polygon, const AABB* pAABBPolygon = 0) - { - if (pAABBPolygon && !Overlap::Point_AABB2D(p, *pAABBPolygon)) - { - return false; - } - - int count = 0; - - typename VecContainer::const_iterator li, linext; - typename VecContainer::const_iterator liend = polygon.end(); - for (li = polygon.begin(); li != liend; ++li) - { - linext = li; - ++linext; - if (linext == liend) - { - linext = polygon.begin(); - } - const PtType& l0 = *li; - const PtType& l1 = *linext; - - if ((((l1.y <= p.y) && (p.y < l0.y)) || - ((l0.y <= p.y) && (p.y < l1.y))) && - (p.x < (l0.x - l1.x) * (p.y - l1.y) / (l0.y - l1.y) + l1.x)) - { - count = !count; - } - } - return (0 != count); - } - - template - inline bool Point_Polygon2D(const PtType& p, const PtType* polygon, size_t vertexCount, const AABB* pAABBPolygon = 0) - { - if (pAABBPolygon && !Overlap::Point_AABB2D(p, *pAABBPolygon)) - { - return false; - } - - bool count = false; - - for (size_t i = 0; i < vertexCount; ++i) - { - const PtType l0 = polygon[i % vertexCount]; - const PtType l1 = polygon[(i + 1) % vertexCount]; - - if ((((l1.y <= p.y) && (p.y < l0.y)) || - ((l0.y <= p.y) && (p.y < l1.y))) && - (p.x < (l0.x - l1.x) * (p.y - l1.y) / (l0.y - l1.y) + l1.x)) - { - count = !count; - } - } - - return count; - } - - - template - inline bool Circle_Polygon2D(const Vec3_tpl& p, F radius, const VecContainer& polygon) - { - if (Overlap::Point_Polygon2D(p, polygon)) - { - return true; - } - typename VecContainer::const_iterator li, linext; - typename VecContainer::const_iterator liend = polygon.end(); - for (li = polygon.begin(); li != liend; ++li) - { - linext = li; - ++linext; - if (linext == liend) - { - linext = polygon.begin(); - } - const Vec3_tpl& l0 = *li; - const Vec3_tpl& l1 = *linext; - float junk; - if (Distance::Point_Lineseg2DSq(p, Lineseg(l0, l1), junk) < square(radius)) - { - return true; - } - } - return false; - } - /// Checks if a line segment overlaps a polygon (defined by a container of sorted - /// points) in 2D (ignoring z). If you know the polygon AABB pass it in (z is ignored) - template - inline bool Lineseg_Polygon2D(const Lineseg& lineseg, - const VecContainer& polygon, - const AABB* pAABBPolygon = 0) - { - if (pAABBPolygon && !Overlap::Lineseg_AABB2D(lineseg, *pAABBPolygon)) - { - return false; - } - - typename VecContainer::const_iterator it; - for (it = polygon.begin(); it != polygon.end(); ++it) - { - typename VecContainer::const_iterator itNext = it; - ++itNext; - if (itNext == polygon.end()) - { - itNext = polygon.begin(); - } - - Lineseg polySeg(*it, *itNext); - if (Lineseg_Lineseg2D(lineseg, polySeg)) - { - return true; - } - } - return false; - } - - /// Checks for overlap of two polygons in 2D (ignoring z) - template - inline bool Polygon_Polygon2D(const VecContainerA& polygonA, const VecContainerB& polygonB, - const AABB* pAABBA = 0, const AABB* pAABBB = 0) - { - const typename VecContainerA::const_iterator itEndA = polygonA.end(); - const typename VecContainerB::const_iterator itEndB = polygonB.end(); - typename VecContainerA::const_iterator itA; - typename VecContainerB::const_iterator itB; - - AABB aabbA, aabbB; - if (!pAABBA) - { - pAABBA = &aabbA; - aabbA.Reset(); - for (itA = polygonA.begin(); itA != itEndA; ++itA) - { - aabbA.Add(*itA); - } - } - if (!pAABBB) - { - pAABBB = &aabbB; - aabbB.Reset(); - for (itB = polygonB.begin(); itB != itEndB; ++itB) - { - aabbB.Add(*itB); - } - } - - // AABB - if (!Overlap::AABB_AABB2D(*pAABBA, *pAABBB)) - { - return false; - } - - // points of A in B - for (itA = polygonA.begin(); itA != itEndA; ++itA) - { - if (Point_Polygon2D(*itA, polygonB, pAABBB)) - { - return true; - } - } - // points of B in A - for (itB = polygonB.begin(); itB != itEndB; ++itB) - { - if (Point_Polygon2D(*itB, polygonA, pAABBA)) - { - return true; - } - } - // segments of one A against B - for (itA = polygonA.begin(); itA != itEndA; ++itA) - { - typename VecContainerA::const_iterator itNext = itA; - ++itNext; - if (itNext == itEndA) - { - itNext = polygonA.begin(); - } - if (Lineseg_Polygon2D(Lineseg(*itA, *itNext), polygonB, pAABBB)) - { - return true; - } - } - return false; - } - - - /// Checks if a triangle (defined by three vertices) overlaps a polygon (defined - /// by a container of sorted points), all in 2D only (ignoring z). - template - inline bool Triangle_Polygon2D(const Vec3_tpl& p0, const Vec3_tpl& p1, const Vec3_tpl& p2, - const VecContainer& polygon) - { - // Check for triangle points within the poly - if (Point_Polygon2D(p0, polygon)) - { - return true; - } - if (Point_Polygon2D(p1, polygon)) - { - return true; - } - if (Point_Polygon2D(p2, polygon)) - { - return true; - } - - // check the poly points against the triangle - static std::vector triangle; - triangle.clear(); - triangle.push_back(p0); - triangle.push_back(p1); - triangle.push_back(p2); - - typename VecContainer::const_iterator it; - for (it = polygon.begin(); it != polygon.end(); ++it) - { - if (Point_Polygon2D(*it, triangle)) - { - return true; - } - } - - // finally check the edges - if (Overlap::Lineseg_Polygon2D(Lineseg(p0, p1), polygon)) - { - return true; - } - if (Overlap::Lineseg_Polygon2D(Lineseg(p1, p2), polygon)) - { - return true; - } - if (Overlap::Lineseg_Polygon2D(Lineseg(p2, p0), polygon)) - { - return true; - } - return false; - } - - //----------------------------------------------------------------------------------------- - - - //! check if a Lineseg and a Sphere overlap - inline bool Lineseg_Sphere(const Lineseg& ls, const ::Sphere& s) - { - float radius2 = s.radius * s.radius; - - //check if one of the two edpoints of the line is inside the sphere - Vec3 diff = ls.end - s.center; - if (diff.x * diff.x + diff.y * diff.y + diff.z * diff.z <= radius2) - { - return true; - } - - Vec3 AC = s.center - ls.start; - if (AC.x * AC.x + AC.y * AC.y + AC.z * AC.z <= radius2) - { - return true; - } - - //check distance from the sphere to the line - Vec3 AB = ls.end - ls.start; - - float r = (AC.x * AB.x + AC.y * AB.y + AC.z * AB.z) / (AB.x * AB.x + AB.y * AB.y + AB.z * AB.z); - - //projection falls outside the line - if (r < 0 || r > 1) - { - return false; - } - - //check if the distance from the line to the center of the sphere is less than radius - Vec3 point = ls.start + r * AB; - if ((point.x - s.center.x) * (point.x - s.center.x) + (point.y - s.center.y) * (point.y - s.center.y) + (point.z - s.center.z) * (point.z - s.center.z) > radius2) - { - return false; - } - - return true; - } - - - /*! - * we use the SEPARATING AXIS TEST to check if a Linesegment overlap an AABB. - * - * Example: - * bool result=Overlap::Lineseg_AABB( ls, pos,aabb ); - */ - inline bool Lineseg_AABB (const Lineseg& ls, const AABB& aabb) - { - //calculate the half-length-vectors of the AABB - Vec3 h = (aabb.max - aabb.min) * 0.5f; - //"t" is the transfer-vector from one center to the other - Vec3 t = (ls.start + ls.end) * 0.5f - (aabb.max + aabb.min) * 0.5f; - //calculate line-direction - Vec3 ld = (ls.end - ls.start) * 0.5f; - if (fabsf(t.x) > (h.x + fabsf(ld.x))) - { - return 0; - } - if (fabsf(t.y) > (h.y + fabsf(ld.y))) - { - return 0; - } - if (fabsf(t.z) > (h.z + fabsf(ld.z))) - { - return 0; - } - if (fabsf(t.z * ld.y - t.y * ld.z) > (fabsf(h.y * ld.z) + fabsf(h.z * ld.y))) - { - return 0; - } - if (fabsf(t.x * ld.z - t.z * ld.x) > (fabsf(h.x * ld.z) + fabsf(h.z * ld.x))) - { - return 0; - } - if (fabsf(t.y * ld.x - t.x * ld.y) > (fabsf(h.x * ld.y) + fabsf(h.y * ld.x))) - { - return 0; - } - return 1; //no separating axis found, objects overlap - } - - /// 2D seaparating axis test - ignores z - inline bool Lineseg_AABB2D (const Lineseg& ls, const AABB& aabb) - { - //calculate the half-length-vectors of the AABB - Vec3 h = (aabb.max - aabb.min) * 0.5f; - //"t" is the transfer-vector from one center to the other - Vec3 t = (ls.start + ls.end) * 0.5f - (aabb.max + aabb.min) * 0.5f; - //calculate line-direction - Vec3 ld = (ls.end - ls.start) * 0.5f; - if (fabsf(t.x) > (h.x + fabsf(ld.x))) - { - return 0; - } - if (fabsf(t.y) > (h.y + fabsf(ld.y))) - { - return 0; - } - if (fabsf(t.y * ld.x - t.x * ld.y) > (fabsf(h.x * ld.y) + fabsf(h.y * ld.x))) - { - return 0; - } - return 1; //no separating axis found, objects overlap - } - - - - /*! - * we use the SEPARATING AXIS TEST to check if two OBB's overlap. - * - * Example: - * bool result=Overlap::Lineseg_OBB( lineseg, pos,obb ); - */ - inline bool Lineseg_OBB (const Lineseg& ls, const Vec3& pos, const OBB& obb) - { - //the new center-position of Lineseg and OBB in world-space - Vec3 wposobb = obb.m33 * obb.c + pos; - Vec3 wposls = (ls.start + ls.end) * 0.5f; - //"t" is the transfer-vector from one center to the other - Vec3 t = (wposls - wposobb) * obb.m33; - //calculate line-direction in local obb-space - Vec3 ld = ((ls.end - ls.start) * obb.m33) * 0.5f; - if (fabsf(t.x) > (obb.h.x + fabsf(ld.x))) - { - return 0; - } - if (fabsf(t.y) > (obb.h.y + fabsf(ld.y))) - { - return 0; - } - if (fabsf(t.z) > (obb.h.z + fabsf(ld.z))) - { - return 0; - } - if (fabsf(t.z * ld.y - t.y * ld.z) > (fabsf(obb.h.y * ld.z) + fabsf(obb.h.z * ld.y))) - { - return 0; - } - if (fabsf(t.x * ld.z - t.z * ld.x) > (fabsf(obb.h.x * ld.z) + fabsf(obb.h.z * ld.x))) - { - return 0; - } - if (fabsf(t.y * ld.x - t.x * ld.y) > (fabsf(obb.h.x * ld.y) + fabsf(obb.h.y * ld.x))) - { - return 0; - } - return 1; //no separating axis found, objects overlap - } - - - - - /*! - * - * overlap-test between a line and a triangle. - * IMPORTANT: this is a single-sided test. That means its not enough - * that the triangle and line overlap, its also important that the triangle - * is "visible" when you are looking along the line-direction. - * - * If you need a double-sided test, you'll have to call this function twice with - * reversed order of triangle vertices. - * - * return values - * return "true" if line and triangle overlap. - * - */ - inline bool Line_Triangle(const Line& line, const Vec3& v0, const Vec3& v1, const Vec3& v2) - { - const float Epsilon = 0.0000001f; - - Vec3 edgeA = v1 - v0; - Vec3 edgeB = v2 - v0; - - Vec3 dir = line.direction; - - Vec3 p = dir.Cross(edgeA); - Vec3 t = line.pointonline - v0; - Vec3 q = t.Cross(edgeB); - - float dot = edgeB.Dot(p); - - float u = t.Dot(p); - float v = dir.Dot(q); - - float DotGreaterThanEpsilon = dot - Epsilon; - float VGreaterEqualThanZero = v; - float UGreaterEqualThanZero = u; - float UVLessThanDot = dot - (u + v); - float ULessThanDot = dot - u; - - float UVGreaterEqualThanZero = (float)fsel(VGreaterEqualThanZero, UGreaterEqualThanZero, VGreaterEqualThanZero); - float UUVLessThanDot = (float)fsel(UVLessThanDot, ULessThanDot, UVLessThanDot); - float BothGood = (float)fsel(UVGreaterEqualThanZero, UUVLessThanDot, UVGreaterEqualThanZero); - float AllGood = (float)fsel(DotGreaterThanEpsilon, BothGood, DotGreaterThanEpsilon); - - return AllGood >= 0.0f; - } - - - /*! - * - * overlap-test between a ray and a triangle. - * IMPORTANT: this is a single-sided test. That means its not sufficient - * that the triangle and ray overlap, its also important that the triangle - * is "visible" when you are looking from the origin along the ray-direction. - * - * If you need a double-sided test, you'll have to call this function twice with - * reversed order of triangle vertices. - * - * return values - * return "true" if ray and triangle overlap. - */ - inline bool Ray_Triangle(const Ray& ray, const Vec3& v0, const Vec3& v1, const Vec3& v2) - { - const float Epsilon = 0.0000001f; - - Vec3 edgeA = v1 - v0; - Vec3 edgeB = v2 - v0; - - Vec3 dir = ray.direction; - - Vec3 p = dir.Cross(edgeA); - Vec3 t = ray.origin - v0; - Vec3 q = t.Cross(edgeB); - - float dot = edgeB.Dot(p); - - float u = t.Dot(p); - float v = dir.Dot(q); - - float DotGreaterThanEpsilon = dot - Epsilon; - float VGreaterEqualThanZero = v; - float UGreaterEqualThanZero = u; - float UVLessThanDot = dot - (u + v); - float ULessThanDot = dot - u; - - float UVGreaterEqualThanZero = (float)fsel(VGreaterEqualThanZero, UGreaterEqualThanZero, VGreaterEqualThanZero); - float UUVLessThanDot = (float)fsel(UVLessThanDot, ULessThanDot, UVLessThanDot); - float BothGood = (float)fsel(UVGreaterEqualThanZero, UUVLessThanDot, UVGreaterEqualThanZero); - float AllGood = (float)fsel(DotGreaterThanEpsilon, BothGood, DotGreaterThanEpsilon); - - if (AllGood < 0.0f) - { - return false; - } - - float dt = edgeA.Dot(q) / dot; - - Vec3 result = (dir * dt) + ray.origin; - - float AfterStart = (result - ray.origin).Dot(dir); - - return AfterStart >= 0.0f; - } - - /*---------------------------------------------------------------------------------- - * Sphere_AABB - * Sphere and AABB are assumed to be in the same space - * - * Example: - * bool result=Overlap::Sphere_AABB_Inside( sphere, aabb ); - * - * 0 = no overlap - * 1 = overlap - *----------------------------------------------------------------------------------*/ - ILINE bool Sphere_AABB(const ::Sphere& s, const AABB& aabb) - { - Vec3 center(s.center); - - Vec3 aabb_min(aabb.min); - Vec3 aabb_max(aabb.max); - - float radiusSq = s.radius * s.radius; - - float x = (float)fsel(aabb_min.x - center.x, center.x - aabb_min.x, fsel(center.x - aabb_max.x, center.x - aabb_max.x, 0.0f)); - float y = (float)fsel(aabb_min.y - center.y, center.y - aabb_min.y, fsel(center.y - aabb_max.y, center.y - aabb_max.y, 0.0f)); - float z = (float)fsel(aabb_min.z - center.z, center.z - aabb_min.z, fsel(center.z - aabb_max.z, center.z - aabb_max.z, 0.0f)); - - return (x * x + y * y + z * z) < radiusSq; - } - - // As Sphere_AABB but ignores z parts - ILINE bool Sphere_AABB2D(const ::Sphere& s, const AABB& aabb) - { - Vec3 center(s.center); - - Vec3 aabb_min(aabb.min); - Vec3 aabb_max(aabb.max); - - float radiusSq = s.radius * s.radius; - - float x = (float)fsel(aabb_min.x - center.x, center.x - aabb_min.x, fsel(center.x - aabb_max.x, center.x - aabb_max.x, 0.0f)); - float y = (float)fsel(aabb_min.y - center.y, center.y - aabb_min.y, fsel(center.y - aabb_max.y, center.y - aabb_max.y, 0.0f)); - - return (x * x + y * y) < radiusSq; - } - - - /*! - * - * conventional method to check if a Sphere and an AABB overlap, - * or if the Sphere is completely inside the AABB. - * Sphere and AABB are assumed to be in the same space - * - * Example: - * bool result=Overlap::Sphere_AABB_Inside( sphere, aabb ); - * - * return values: - * 0x00 = no overlap - * 0x01 = Sphere and AABB overlap - * 0x02 = Sphere in inside AABB - */ - ILINE char Sphere_AABB_Inside(const ::Sphere& s, const AABB& aabb) - { - if (Sphere_AABB(s, aabb)) - { - Vec3 amin = aabb.min - s.center; - Vec3 amax = aabb.max - s.center; - if (amin.x >= (-s.radius)) - { - return 1; - } - if (amin.y >= (-s.radius)) - { - return 1; - } - if (amin.z >= (-s.radius)) - { - return 1; - } - if (amax.x <= (+s.radius)) - { - return 1; - } - if (amax.y <= (+s.radius)) - { - return 1; - } - if (amax.z <= (+s.radius)) - { - return 1; - } - //yes, its inside - return 2; - } - return 0; - } - - //---------------------------------------------------------------------------------- - // Sphere_OBB - // VERY IMPORTANT: Sphere is assumed to be in the space of the OBB, otherwise it won't work - // - //--- 0 = no overlap --------------------------- - //--- 1 = overlap ----------------- - //---------------------------------------------------------------------------------- - inline bool Sphere_OBB(const ::Sphere& s, const OBB& obb) - { - //first we transform the sphere-center into the AABB-space of the OBB - Vec3 SphereInOBBSpace = s.center * obb.m33; - //the rest ist the same as the "Overlap::Sphere_AABB" calculation - float quatradius = s.radius * s.radius; - Vec3 quat(0, 0, 0); - AABB aabb = AABB(obb.c - obb.h, obb.c + obb.h); - if (SphereInOBBSpace.x < aabb.min.x) - { - quat.x = SphereInOBBSpace.x - aabb.min.x; - } - else if (SphereInOBBSpace.x > aabb.max.x) - { - quat.x = SphereInOBBSpace.x - aabb.max.x; - } - if (SphereInOBBSpace.y < aabb.min.y) - { - quat.y = SphereInOBBSpace.y - aabb.min.y; - } - else if (SphereInOBBSpace.y > aabb.max.y) - { - quat.y = SphereInOBBSpace.y - aabb.max.y; - } - if (SphereInOBBSpace.z < aabb.min.z) - { - quat.z = SphereInOBBSpace.z - aabb.min.z; - } - else if (SphereInOBBSpace.z > aabb.max.z) - { - quat.z = SphereInOBBSpace.z - aabb.max.z; - } - return((quat | quat) < quatradius); - } - - - //---------------------------------------------------------------------------------- - // Sphere_Sphere overlap test - // - //--- 0 = no overlap --------------------------- - //--- 1 = overlap ----------------- - //---------------------------------------------------------------------------------- - inline bool Sphere_Sphere(const ::Sphere& s1, const ::Sphere& s2) - { - Vec3 distc = s1.center - s2.center; - f32 sqrad = (s1.radius + s2.radius) * (s1.radius + s2.radius); - return (sqrad > (distc | distc)); - } - - ILINE bool HWVSphere_HWVSphere(const HWVSphere& s1, const HWVSphere& s2) - { - simdf fTotalRadius = SIMDFAdd(s1.radius, s2.radius); - hwvec3 distc = HWVSub(s1.center, s2.center); - simdf fTotalRadiusSqr = SIMDFMult(fTotalRadius, fTotalRadius); - simdf fDistanceSqr = HWV3Dot(distc, distc); - return SIMDFLessThanEqualB(fDistanceSqr, fTotalRadiusSqr); - } - - //---------------------------------------------------------------------------------- - // Sphere_Triangle overlap test - // - //--- 0 = no overlap --------------------------- - //--- 1 = overlap ----------------- - //---------------------------------------------------------------------------------- - template - ILINE bool Sphere_Triangle(const ::Sphere& s, const Triangle_tpl& t) - { - //create a "bouding sphere" around triangle for fast rejection test - Vec3_tpl middle = (t.v0 + t.v1 + t.v2) * (1 / 3.0f); - Vec3_tpl ov0 = t.v0 - middle; - Vec3_tpl ov1 = t.v1 - middle; - Vec3_tpl ov2 = t.v2 - middle; - F SqRad0 = (ov0 | ov0); - F SqRad1 = (ov1 | ov1); - F SqRad2 = (ov2 | ov2); - - SqRad0 = (F)fsel(SqRad0 - SqRad1, SqRad0, SqRad1); - SqRad0 = (F)fsel(SqRad0 - SqRad2, SqRad0, SqRad2); - - //first simple rejection-test... - if (Sphere_Sphere(s, ::Sphere(middle, sqrt_tpl(SqRad0))) == 0) - { - return 0; //overlap not possible - } - //...and now the hardcore-test! - if ((s.radius * s.radius) < Distance::Point_TriangleSq(s.center, t)) - { - return 0; - } - return 1; //sphere and triangle are overlapping - } - - ILINE bool HWVSphere_TriangleFromPoints(const HWVSphere& s, const hwvec3& t0, const hwvec3& t1, const hwvec3& t2) - { - //create a "bounding sphere" around triangle for fast rejection test - SIMDFConstant(fOneThird, 1.0f / 3.0f); - - hwvec3 middle = HWVMultiplySIMDF(HWVAdd(t0, HWVAdd(t1, t2)), fOneThird); - - hwvec3 ov0 = HWVSub(t0, middle); - hwvec3 ov1 = HWVSub(t1, middle); - hwvec3 ov2 = HWVSub(t2, middle); - - simdf SqRad0 = HWV3Dot(ov0, ov0); - simdf SqRad1 = HWV3Dot(ov1, ov1); - simdf SqRad2 = HWV3Dot(ov2, ov2); - - SqRad0 = SIMDFMax(SqRad0, SqRad1); - SqRad0 = SIMDFMax(SqRad0, SqRad2); - - //first simple rejection-test... - //if( HWVSphere_HWVSphere(s, HWVSphere(middle, SIMDFSqrtEstFast(SqRad0)))==0 ) - if (HWVSphere_HWVSphere(s, HWVSphere(middle, SIMDFSqrtEst(SqRad0))) == 0) - { - return 0; //overlap not possible - } - else - { - //...and now the hardcore-test! - simdf fRadiusSq = SIMDFMult(s.radius, s.radius); - simdf fDistToTriangleSq = Distance::Point_TriangleByPointsSq(s.center, t0, t1, t2); - - return SIMDFLessThanEqualB(fDistToTriangleSq, fRadiusSq); - } - } - - /*! - * - * we use the SEPARATING AXIS TEST to check if a triangle and AABB overlap. - * - * Example: - * bool result=Overlap::AABB_Triangle( pos,aabb, tv0,tv1,tv2 ); - * - */ - inline bool AABB_Triangle (const AABB& aabb, const Vec3& tv0, const Vec3& tv1, const Vec3& tv2) - { - //------ convert AABB into half-length AABB ----------- - Vec3 h = (aabb.max - aabb.min) * 0.5f; //calculate the half-length-vectors - Vec3 c = (aabb.max + aabb.min) * 0.5f; //the center is relative to the PIVOT - - //move everything so that the boxcenter is in (0,0,0) - Vec3 v0 = tv0 - c; - Vec3 v1 = tv1 - c; - Vec3 v2 = tv2 - c; - - //compute triangle edges - Vec3 e0 = v1 - v0; - Vec3 e1 = v2 - v1; - Vec3 e2 = v0 - v2; - - //-------------------------------------------------------------------------------------- - // use SEPARATING AXIS THEOREM to test overlap between AABB and triangle - // cross-product(edge from triangle, {x,y,z}-direction), this are 3x3=9 tests - //-------------------------------------------------------------------------------------- - float min, max, p0, p1, p2, rad, fex, fey, fez; - fex = fabsf(e0.x); - fey = fabsf(e0.y); - fez = fabsf(e0.z); - - //AXISTEST_X01(e0.z, e0.y, fez, fey); - p0 = e0.z * v0.y - e0.y * v0.z; - p2 = e0.z * v2.y - e0.y * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * h.y + fey * h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Y02(e0.z, e0.x, fez, fex); - p0 = -e0.z * v0.x + e0.x * v0.z; - p2 = -e0.z * v2.x + e0.x * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * h.x + fex * h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Z12(e0.y, e0.x, fey, fex); - p1 = e0.y * v1.x - e0.x * v1.y; - p2 = e0.y * v2.x - e0.x * v2.y; - if (p2 < p1) - { - min = p2; - max = p1; - } - else - { - min = p1; - max = p2; - } - rad = fey * h.x + fex * h.y; - if (min > rad || max < -rad) - { - return 0; - } - - //----------------------------------------------- - - fex = fabsf(e1.x); - fey = fabsf(e1.y); - fez = fabsf(e1.z); - //AXISTEST_X01(e1.z, e1.y, fez, fey); - p0 = e1.z * v0.y - e1.y * v0.z; - p2 = e1.z * v2.y - e1.y * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * h.y + fey * h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Y02(e1.z, e1.x, fez, fex); - p0 = -e1.z * v0.x + e1.x * v0.z; - p2 = -e1.z * v2.x + e1.x * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * h.x + fex * h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Z0(e1.y, e1.x, fey, fex); - p0 = e1.y * v0.x - e1.x * v0.y; - p1 = e1.y * v1.x - e1.x * v1.y; - if (p0 < p1) - { - min = p0; - max = p1; - } - else - { - min = p1; - max = p0; - } - rad = fey * h.x + fex * h.y; - if (min > rad || max < -rad) - { - return 0; - } - - //----------------------------------------------- - - fex = fabsf(e2.x); - fey = fabsf(e2.y); - fez = fabsf(e2.z); - //AXISTEST_X2(e2.z, e2.y, fez, fey); - p0 = e2.z * v0.y - e2.y * v0.z; - p1 = e2.z * v1.y - e2.y * v1.z; - if (p0 < p1) - { - min = p0; - max = p1; - } - else - { - min = p1; - max = p0; - } - rad = fez * h.y + fey * h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Y1(e2.z, e2.x, fez, fex); - p0 = -e2.z * v0.x + e2.x * v0.z; - p1 = -e2.z * v1.x + e2.x * v1.z; - if (p0 < p1) - { - min = p0; - max = p1; - } - else - { - min = p1; - max = p0; - } - rad = fez * h.x + fex * h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Z12(e2.y, e2.x, fey, fex); - p1 = e2.y * v1.x - e2.x * v1.y; - p2 = e2.y * v2.x - e2.x * v2.y; - if (p2 < p1) - { - min = p2; - max = p1; - } - else - { - min = p1; - max = p2; - } - rad = fey * h.x + fex * h.y; - if (min > rad || max < -rad) - { - return 0; - } - - //the {x,y,z}-directions (actually, since we use the AABB of the triangle we don't even need to test these) - //first test overlap in the {x,y,z}-directions - //find min, max of the triangle each direction, and test for overlap in that direction -- - //this is equivalent to testing a minimal AABB around the triangle against the AABB - AABB taabb; - FINDMINMAX(v0.x, v1.x, v2.x, taabb.min.x, taabb.max.x); - FINDMINMAX(v0.y, v1.y, v2.y, taabb.min.y, taabb.max.y); - FINDMINMAX(v0.z, v1.z, v2.z, taabb.min.z, taabb.max.z); - - //test in X-direction - FINDMINMAX(v0.x, v1.x, v2.x, taabb.min.x, taabb.max.x); - if (taabb.min.x > h.x || taabb.max.x < -h.x) - { - return 0; - } - - //test in Y-direction - FINDMINMAX(v0.y, v1.y, v2.y, taabb.min.y, taabb.max.y); - if (taabb.min.y > h.y || taabb.max.y < -h.y) - { - return 0; - } - - //test in Z-direction - FINDMINMAX(v0.z, v1.z, v2.z, taabb.min.z, taabb.max.z); - if (taabb.min.z > h.z || taabb.max.z < -h.z) - { - return 0; - } - - //test if the box intersects the plane of the triangle - //compute plane equation of triangle: normal*x+d=0 - Plane_tpl plane = Plane_tpl::CreatePlane((e0 % e1), v0); - - Vec3 vmin, vmax; - if (plane.n.x > 0.0f) - { - vmin.x = -h.x; - vmax.x = +h.x; - } - else - { - vmin.x = +h.x; - vmax.x = -h.x; - } - if (plane.n.y > 0.0f) - { - vmin.y = -h.y; - vmax.y = +h.y; - } - else - { - vmin.y = +h.y; - vmax.y = -h.y; - } - if (plane.n.z > 0.0f) - { - vmin.z = -h.z; - vmax.z = +h.z; - } - else - { - vmin.z = +h.z; - vmax.z = -h.z; - } - if ((plane | vmin) > 0.0f) - { - return 0; - } - if ((plane | vmax) < 0.0f) - { - return 0; - } - return 1; - } - - - - /*! - * - * we use the SEPARATING AXIS TEST to check if a triangle and an OBB overlaps. - * - * Example: - * bool result=Overlap::OBB_Trinagle( pos1,obb1, tv0,tv1,tv2 ); - * - */ - inline bool OBB_Triangle(const Vec3& pos, const OBB& obb, const Vec3& tv0, const Vec3& tv1, const Vec3& tv2) - { - Vec3 p = obb.m33 * obb.c + pos; //the new center-position in world-space - - //move everything so that the boxcenter is in (0,0,0) - Vec3 v0 = (tv0 - p) * obb.m33; //pre-transform - Vec3 v1 = (tv1 - p) * obb.m33; //pre-transform - Vec3 v2 = (tv2 - p) * obb.m33; //pre-transform - - - //compute triangle edges - Vec3 e0 = v1 - v0; - Vec3 e1 = v2 - v1; - Vec3 e2 = v0 - v2; - - //-------------------------------------------------------------------------------------- - // use SEPARATING AXIS THEOREM to test intersection between AABB and triangle - // cross-product(edge from triangle, {x,y,z}-direction), this are 3x3=9 tests - //-------------------------------------------------------------------------------------- - float min, max, p0, p1, p2, rad, fex, fey, fez; - fex = fabsf(e0.x); - fey = fabsf(e0.y); - fez = fabsf(e0.z); - - //AXISTEST_X01(e0.z, e0.y, fez, fey); - p0 = e0.z * v0.y - e0.y * v0.z; - p2 = e0.z * v2.y - e0.y * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * obb.h.y + fey * obb.h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Y02(e0.z, e0.x, fez, fex); - p0 = -e0.z * v0.x + e0.x * v0.z; - p2 = -e0.z * v2.x + e0.x * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * obb.h.x + fex * obb.h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Z12(e0.y, e0.x, fey, fex); - p1 = e0.y * v1.x - e0.x * v1.y; - p2 = e0.y * v2.x - e0.x * v2.y; - if (p2 < p1) - { - min = p2; - max = p1; - } - else - { - min = p1; - max = p2; - } - rad = fey * obb.h.x + fex * obb.h.y; - if (min > rad || max < -rad) - { - return 0; - } - - //----------------------------------------------- - - fex = fabsf(e1.x); - fey = fabsf(e1.y); - fez = fabsf(e1.z); - //AXISTEST_X01(e1.z, e1.y, fez, fey); - p0 = e1.z * v0.y - e1.y * v0.z; - p2 = e1.z * v2.y - e1.y * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * obb.h.y + fey * obb.h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Y02(e1.z, e1.x, fez, fex); - p0 = -e1.z * v0.x + e1.x * v0.z; - p2 = -e1.z * v2.x + e1.x * v2.z; - if (p0 < p2) - { - min = p0; - max = p2; - } - else - { - min = p2; - max = p0; - } - rad = fez * obb.h.x + fex * obb.h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Z0(e1.y, e1.x, fey, fex); - p0 = e1.y * v0.x - e1.x * v0.y; - p1 = e1.y * v1.x - e1.x * v1.y; - if (p0 < p1) - { - min = p0; - max = p1; - } - else - { - min = p1; - max = p0; - } - rad = fey * obb.h.x + fex * obb.h.y; - if (min > rad || max < -rad) - { - return 0; - } - - //----------------------------------------------- - - fex = fabsf(e2.x); - fey = fabsf(e2.y); - fez = fabsf(e2.z); - //AXISTEST_X2(e2.z, e2.y, fez, fey); - p0 = e2.z * v0.y - e2.y * v0.z; - p1 = e2.z * v1.y - e2.y * v1.z; - if (p0 < p1) - { - min = p0; - max = p1; - } - else - { - min = p1; - max = p0; - } - rad = fez * obb.h.y + fey * obb.h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Y1(e2.z, e2.x, fez, fex); - p0 = -e2.z * v0.x + e2.x * v0.z; - p1 = -e2.z * v1.x + e2.x * v1.z; - if (p0 < p1) - { - min = p0; - max = p1; - } - else - { - min = p1; - max = p0; - } - rad = fez * obb.h.x + fex * obb.h.z; - if (min > rad || max < -rad) - { - return 0; - } - - //AXISTEST_Z12(e2.y, e2.x, fey, fex); - p1 = e2.y * v1.x - e2.x * v1.y; - p2 = e2.y * v2.x - e2.x * v2.y; - if (p2 < p1) - { - min = p2; - max = p1; - } - else - { - min = p1; - max = p2; - } - rad = fey * obb.h.x + fex * obb.h.y; - if (min > rad || max < -rad) - { - return 0; - } - - //the {x,y,z}-directions (actually, since we use the AABB of the triangle we don't even need to test these) - //first test overlap in the {x,y,z}-directions - //find min, max of the triangle each direction, and test for overlap in that direction -- - //this is equivalent to testing a minimal AABB around the triangle against the AABB - AABB taabb; - FINDMINMAX(v0.x, v1.x, v2.x, taabb.min.x, taabb.max.x); - FINDMINMAX(v0.y, v1.y, v2.y, taabb.min.y, taabb.max.y); - FINDMINMAX(v0.z, v1.z, v2.z, taabb.min.z, taabb.max.z); - - // test in X-direction - FINDMINMAX(v0.x, v1.x, v2.x, taabb.min.x, taabb.max.x); - if (taabb.min.x > obb.h.x || taabb.max.x < -obb.h.x) - { - return 0; - } - - // test in Y-direction - FINDMINMAX(v0.y, v1.y, v2.y, taabb.min.y, taabb.max.y); - if (taabb.min.y > obb.h.y || taabb.max.y < -obb.h.y) - { - return 0; - } - - // test in Z-direction - FINDMINMAX(v0.z, v1.z, v2.z, taabb.min.z, taabb.max.z); - if (taabb.min.z > obb.h.z || taabb.max.z < -obb.h.z) - { - return 0; - } - - //test if the box overlaps the plane of the triangle - //compute plane equation of triangle: normal*x+d=0 - Plane_tpl plane = Plane_tpl::CreatePlane((e0 % e1), v0); - - Vec3 vmin, vmax; - if (plane.n.x > 0.0f) - { - vmin.x = -obb.h.x; - vmax.x = +obb.h.x; - } - else - { - vmin.x = +obb.h.x; - vmax.x = -obb.h.x; - } - if (plane.n.y > 0.0f) - { - vmin.y = -obb.h.y; - vmax.y = +obb.h.y; - } - else - { - vmin.y = +obb.h.y; - vmax.y = -obb.h.y; - } - if (plane.n.z > 0.0f) - { - vmin.z = -obb.h.z; - vmax.z = +obb.h.z; - } - else - { - vmin.z = +obb.h.z; - vmax.z = -obb.h.z; - } - if ((plane | vmin) > 0.0f) - { - return 0; - } - if ((plane | vmax) < 0.0f) - { - return 0; - } - return 1; - } - - - - - - - - - - /*! - * - * conventional method to check if two AABB's overlap. - * both AABBs are assumed to be in the same space - * - * Example: - * bool result=Overlap::AABB_AABB( aabb1, aabb2 ); - * - */ - ILINE bool AABB_AABB(const AABB& aabb1, const AABB& aabb2) - { - if (aabb1.min.x >= aabb2.max.x) - { - return 0; - } - if (aabb1.min.y >= aabb2.max.y) - { - return 0; - } - if (aabb1.min.z >= aabb2.max.z) - { - return 0; - } - if (aabb1.max.x <= aabb2.min.x) - { - return 0; - } - if (aabb1.max.y <= aabb2.min.y) - { - return 0; - } - if (aabb1.max.z <= aabb2.min.z) - { - return 0; - } - return 1; //the aabb's overlap - } - - /// AABB overlap test - but ignores z values - ILINE bool AABB_AABB2D(const AABB& aabb1, const AABB& aabb2) - { - if (aabb1.min.x >= aabb2.max.x) - { - return 0; - } - if (aabb1.min.y >= aabb2.max.y) - { - return 0; - } - if (aabb1.max.x <= aabb2.min.x) - { - return 0; - } - if (aabb1.max.y <= aabb2.min.y) - { - return 0; - } - return 1; //the aabb's overlap - } - - - /*! - * - * Conventional method to check if two AABB's overlap. - * Both AABBs are in local object space. Used the position-vector - * to translate them into world-space - * - * Example: - * bool result=Overlap::AABB_AABB( pos1,aabb1, pos2,aabb2 ); - * - */ - ILINE bool AABB_AABB(const Vec3& pos1, const AABB& aabb1, const Vec3& pos2, const AABB& aabb2) - { - AABB waabb1(aabb1.min + pos1, aabb1.max + pos1); - AABB waabb2(aabb2.min + pos2, aabb2.max + pos2); - return AABB_AABB(waabb1, waabb2); - } - - - /*! - * - * conventional method to check if two AABB's overlap - * or if AABB1 is comletely inside AABB2. - * both AABBs are assumed to be in the same space - * - * Example: - * bool result=Overlap::AABB_AABB_Inside( aabb1, aabb2 ); - * - * return values: - * 0x00 = no overlap - * 0x01 = both AABBs one overlap - * 0x02 = AABB1 in inside AABB2 - */ - ILINE char AABB_AABB_Inside(const AABB& aabb1, const AABB& aabb2) - { - if (AABB_AABB(aabb1, aabb2)) - { - if (aabb1.min.x <= aabb2.min.x) - { - return 1; - } - if (aabb1.min.y <= aabb2.min.y) - { - return 1; - } - if (aabb1.min.z <= aabb2.min.z) - { - return 1; - } - if (aabb1.max.x >= aabb2.max.x) - { - return 1; - } - if (aabb1.max.y >= aabb2.max.y) - { - return 1; - } - if (aabb1.max.z >= aabb2.max.z) - { - return 1; - } - //yes, its inside - return 2; - } - return 0; - } - - - /*! - * - * we use the SEPARATING AXIS TEST to check if and AABB and an OBB overlap. - * - * Example: - * bool result=Overlap::AABB_OBB( aabb, pos,obb ); - * - */ - inline bool AABB_OBB (const AABB& aabb, const Vec3& pos, const OBB& obb) - { - Vec3 h = (aabb.max - aabb.min) * 0.5f; //calculate the half-length-vectors - Vec3 c = (aabb.max + aabb.min) * 0.5f; //the center in world-space - - //"t" is the transfer-vector from one center to the other - Vec3 t = obb.m33 * obb.c + pos - c; - - f32 ra, rb; - - //-------------------------------------------------------------------------- - //-- we use the vectors "1,0,0","0,1,0" and "0,0,1" as separating axis - //-------------------------------------------------------------------------- - rb = fabsf(obb.m33.m00 * obb.h.x) + fabsf(obb.m33.m01 * obb.h.y) + fabsf(obb.m33.m02 * obb.h.z); - if (fabsf(t.x) > (fabsf(h.x) + rb)) - { - return 0; - } - rb = fabsf(obb.m33.m10 * obb.h.x) + fabsf(obb.m33.m11 * obb.h.y) + fabsf(obb.m33.m12 * obb.h.z); - if (fabsf(t.y) > (fabsf(h.y) + rb)) - { - return 0; - } - rb = fabsf(obb.m33.m20 * obb.h.x) + fabsf(obb.m33.m21 * obb.h.y) + fabsf(obb.m33.m22 * obb.h.z); - if (fabsf(t.z) > (fabsf(h.z) + rb)) - { - return 0; - } - - //-------------------------------------------------------------------------- - //-- we use the orientation-vectors "Mx","My" and "Mz" as separating axis - //-------------------------------------------------------------------------- - ra = fabsf(obb.m33.m00 * h.x) + fabsf(obb.m33.m10 * h.y) + fabsf(obb.m33.m20 * h.z); - if (fabsf(t | Vec3(obb.m33.m00, obb.m33.m10, obb.m33.m20)) > (ra + obb.h.x)) - { - return 0; - } - ra = fabsf(obb.m33.m01 * h.x) + fabsf(obb.m33.m11 * h.y) + fabsf(obb.m33.m21 * h.z); - if (fabsf(t | Vec3(obb.m33.m01, obb.m33.m11, obb.m33.m21)) > (ra + obb.h.y)) - { - return 0; - } - ra = fabsf(obb.m33.m02 * h.x) + fabsf(obb.m33.m12 * h.y) + fabsf(obb.m33.m22 * h.z); - if (fabsf(t | Vec3(obb.m33.m02, obb.m33.m12, obb.m33.m22)) > (ra + obb.h.z)) - { - return 0; - } - - //--------------------------------------------------------------------- - //---- using 9 cross products we generate new separating axis - //--------------------------------------------------------------------- - const float e0 = h.x + h.y + h.z, e1 = obb.h.x + obb.h.y + obb.h.z, e = (e0 + e1 - fabsf(e0 - e1)) * 0.0001f; - ra = h.y * fabsf(obb.m33.m20) + h.z * fabsf(obb.m33.m10); - rb = obb.h.y * fabsf(obb.m33.m02) + obb.h.z * fabsf(obb.m33.m01); - if (fabsf(t.z * obb.m33.m10 - t.y * obb.m33.m20) > (ra + rb) + e) - { - return 0; - } - ra = h.y * fabsf(obb.m33.m21) + h.z * fabsf(obb.m33.m11); - rb = obb.h.x * fabsf(obb.m33.m02) + obb.h.z * fabsf(obb.m33.m00); - if (fabsf(t.z * obb.m33.m11 - t.y * obb.m33.m21) > (ra + rb) + e) - { - return 0; - } - ra = h.y * fabsf(obb.m33.m22) + h.z * fabsf(obb.m33.m12); - rb = obb.h.x * fabsf(obb.m33.m01) + obb.h.y * fabsf(obb.m33.m00); - if (fabsf(t.z * obb.m33.m12 - t.y * obb.m33.m22) > (ra + rb) + e) - { - return 0; - } - - - ra = h.x * fabsf(obb.m33.m20) + h.z * fabsf(obb.m33.m00); - rb = obb.h.y * fabsf(obb.m33.m12) + obb.h.z * fabsf(obb.m33.m11); - if (fabsf(t.x * obb.m33.m20 - t.z * obb.m33.m00) > (ra + rb) + e) - { - return 0; - } - ra = h.x * fabsf(obb.m33.m21) + h.z * fabsf(obb.m33.m01); - rb = obb.h.x * fabsf(obb.m33.m12) + obb.h.z * fabsf(obb.m33.m10); - if (fabsf(t.x * obb.m33.m21 - t.z * obb.m33.m01) > (ra + rb) + e) - { - return 0; - } - ra = h.x * fabsf(obb.m33.m22) + h.z * fabsf(obb.m33.m02); - rb = obb.h.x * fabsf(obb.m33.m11) + obb.h.y * fabsf(obb.m33.m10); - if (fabsf(t.x * obb.m33.m22 - t.z * obb.m33.m02) > (ra + rb) + e) - { - return 0; - } - - - ra = h.x * fabsf(obb.m33.m10) + h.y * fabsf(obb.m33.m00); - rb = obb.h.y * fabsf(obb.m33.m22) + obb.h.z * fabsf(obb.m33.m21); - if (fabsf(t.y * obb.m33.m00 - t.x * obb.m33.m10) > (ra + rb) + e) - { - return 0; - } - ra = h.x * fabsf(obb.m33.m11) + h.y * fabsf(obb.m33.m01); - rb = obb.h.x * fabsf(obb.m33.m22) + obb.h.z * fabsf(obb.m33.m20); - if (fabsf(t.y * obb.m33.m01 - t.x * obb.m33.m11) > (ra + rb) + e) - { - return 0; - } - ra = h.x * fabsf(obb.m33.m12) + h.y * fabsf(obb.m33.m02); - rb = obb.h.x * fabsf(obb.m33.m21) + obb.h.y * fabsf(obb.m33.m20); - if (fabsf(t.y * obb.m33.m02 - t.x * obb.m33.m12) > (ra + rb) + e) - { - return 0; - } - - //no separating axis found, we have an intersection - return 1; - } - - /*! - * - * we use the SEPARATING AXIS TEST to check if two OBB's overlap. - * - * Example: - * bool result=Overlap::OBB_OBB( pos1,obb1, pos2,obb2 ); - * - */ - inline bool OBB_OBB (const Vec3& pos1, const OBB& obb1, const Vec3& pos2, const OBB& obb2) - { - //tranform obb2 in local space of obb1 - Matrix33 M = obb1.m33.T() * obb2.m33; - - //the new center-position in world-space - Vec3 p1 = obb1.m33 * obb1.c + pos1; - Vec3 p2 = obb2.m33 * obb2.c + pos2; - - //"t" is the transfer-vector from one center to the other - Vec3 t = (p2 - p1) * obb1.m33; - - float ra, rb; - - //-------------------------------------------------------------------------- - //-- we use the vectors "1,0,0","0,1,0" and "0,0,1" as separating axis - //-------------------------------------------------------------------------- - rb = fabsf(M.m00 * obb2.h.x) + fabsf(M.m01 * obb2.h.y) + fabsf(M.m02 * obb2.h.z); - if (fabsf(t.x) > (fabsf(obb1.h.x) + rb)) - { - return 0; - } - rb = fabsf(M.m10 * obb2.h.x) + fabsf(M.m11 * obb2.h.y) + fabsf(M.m12 * obb2.h.z); - if (fabsf(t.y) > (fabsf(obb1.h.y) + rb)) - { - return 0; - } - rb = fabsf(M.m20 * obb2.h.x) + fabsf(M.m21 * obb2.h.y) + fabsf(M.m22 * obb2.h.z); - if (fabsf(t.z) > (fabsf(obb1.h.z) + rb)) - { - return 0; - } - - //-------------------------------------------------------------------------- - //-- we use the orientation-vectors "Mx","My" and "Mz" as separating axis - //-------------------------------------------------------------------------- - ra = fabsf(M.m00 * obb1.h.x) + fabsf(M.m10 * obb1.h.y) + fabsf(M.m20 * obb1.h.z); - if (fabsf(t | Vec3(M.m00, M.m10, M.m20)) > (ra + obb2.h.x)) - { - return 0; - } - ra = fabsf(M.m01 * obb1.h.x) + fabsf(M.m11 * obb1.h.y) + fabsf(M.m21 * obb1.h.z); - if (fabsf(t | Vec3(M.m01, M.m11, M.m21)) > (ra + obb2.h.y)) - { - return 0; - } - ra = fabsf(M.m02 * obb1.h.x) + fabsf(M.m12 * obb1.h.y) + fabsf(M.m22 * obb1.h.z); - if (fabsf(t | Vec3(M.m02, M.m12, M.m22)) > (ra + obb2.h.z)) - { - return 0; - } - - //--------------------------------------------------------------------- - //---- using 9 cross products we generate new separating axis - //--------------------------------------------------------------------- - ra = obb1.h.y * fabsf(M.m20) + obb1.h.z * fabsf(M.m10); - rb = obb2.h.y * fabsf(M.m02) + obb2.h.z * fabsf(M.m01); - if (fabsf(t.z * M.m10 - t.y * M.m20) > (ra + rb)) - { - return 0; - } - ra = obb1.h.y * fabsf(M.m21) + obb1.h.z * fabsf(M.m11); - rb = obb2.h.x * fabsf(M.m02) + obb2.h.z * fabsf(M.m00); - if (fabsf(t.z * M.m11 - t.y * M.m21) > (ra + rb)) - { - return 0; - } - ra = obb1.h.y * fabsf(M.m22) + obb1.h.z * fabsf(M.m12); - rb = obb2.h.x * fabsf(M.m01) + obb2.h.y * fabsf(M.m00); - if (fabsf(t.z * M.m12 - t.y * M.m22) > (ra + rb)) - { - return 0; - } - - - ra = obb1.h.x * fabsf(M.m20) + obb1.h.z * fabsf(M.m00); - rb = obb2.h.y * fabsf(M.m12) + obb2.h.z * fabsf(M.m11); - if (fabsf(t.x * M.m20 - t.z * M.m00) > (ra + rb)) - { - return 0; - } - ra = obb1.h.x * fabsf(M.m21) + obb1.h.z * fabsf(M.m01); - rb = obb2.h.x * fabsf(M.m12) + obb2.h.z * fabsf(M.m10); - if (fabsf(t.x * M.m21 - t.z * M.m01) > (ra + rb)) - { - return 0; - } - ra = obb1.h.x * fabsf(M.m22) + obb1.h.z * fabsf(M.m02); - rb = obb2.h.x * fabsf(M.m11) + obb2.h.y * fabsf(M.m10); - if (fabsf(t.x * M.m22 - t.z * M.m02) > (ra + rb)) - { - return 0; - } - - - ra = obb1.h.x * fabsf(M.m10) + obb1.h.y * fabsf(M.m00); - rb = obb2.h.y * fabsf(M.m22) + obb2.h.z * fabsf(M.m21); - if (fabsf(t.y * M.m00 - t.x * M.m10) > (ra + rb)) - { - return 0; - } - ra = obb1.h.x * fabsf(M.m11) + obb1.h.y * fabsf(M.m01); - rb = obb2.h.x * fabsf(M.m22) + obb2.h.z * fabsf(M.m20); - if (fabsf(t.y * M.m01 - t.x * M.m11) > (ra + rb)) - { - return 0; - } - ra = obb1.h.x * fabsf(M.m12) + obb1.h.y * fabsf(M.m02); - rb = obb2.h.x * fabsf(M.m21) + obb2.h.y * fabsf(M.m20); - if (fabsf(t.y * M.m02 - t.x * M.m12) > (ra + rb)) - { - return 0; - } - - return 1; //no separating axis found, we have an overlap - } - - - - - - -#define PLANE_X 0 -#define PLANE_Y 1 -#define PLANE_Z 2 -#define PLANE_NON_AXIAL 3 - - //! check if the point is inside a triangle - inline bool PointInTriangle(const Vec3& point, const Vec3& v0, const Vec3& v1, const Vec3& v2, const Vec3& normal) - { - float xt, yt; - Vec3 nn; - - int p1, p2; - - nn = normal; - nn.x = (float)fabs(nn.x); - nn.y = (float)fabs(nn.y); - nn.z = (float)fabs(nn.z); - - if ((nn.x >= nn.y) && (nn.x >= nn.z)) - { - xt = point.y; - yt = point.z; - p1 = PLANE_Y; - p2 = PLANE_Z; - } - else - if ((nn.y >= nn.x) && (nn.y >= nn.z)) - { - xt = point.x; - yt = point.z; - p1 = PLANE_X; - p2 = PLANE_Z; - } - else - { - xt = point.x; - yt = point.y; - p1 = PLANE_X; - p2 = PLANE_Y; - } - - float Ax, Ay, Bx, By; - float s; - - bool front = false; - bool back = false; - - - Ax = (v0)[p1]; - Bx = (v1)[p1]; - Ay = (v0)[p2]; - By = (v1)[p2]; - - s = ((Ay - yt) * (Bx - Ax) - (Ax - xt) * (By - Ay)); - - if (s >= 0) - { - if (back) - { - return (false); - } - front = true; - } - else - { - if (front) - { - return (false); - } - back = true; - } - - Ax = (v1)[p1]; - Bx = (v2)[p1]; - Ay = (v1)[p2]; - By = (v2)[p2]; - - s = ((Ay - yt) * (Bx - Ax) - (Ax - xt) * (By - Ay)); - - if (s >= 0) - { - if (back) - { - return (false); - } - front = true; - } - else - { - if (front) - { - return (false); - } - back = true; - } - - Ax = (v2)[p1]; - Bx = (v0)[p1]; - Ay = (v2)[p2]; - By = (v0)[p2]; - - s = ((Ay - yt) * (Bx - Ax) - (Ax - xt) * (By - Ay)); - - if (s >= 0) - { - if (back) - { - return (false); - } - front = true; - } - else - { - if (front) - { - return (false); - } - back = true; - } - - return (true); - } -} - - - -#endif // CRYINCLUDE_CRYCOMMON_CRY_GEOOVERLAP_H diff --git a/Code/Legacy/CryCommon/Cry_Math.h b/Code/Legacy/CryCommon/Cry_Math.h index 885361f4e3..74a18e8910 100644 --- a/Code/Legacy/CryCommon/Cry_Math.h +++ b/Code/Legacy/CryCommon/Cry_Math.h @@ -18,7 +18,7 @@ #include "Cry_ValidNumber.h" #include // eLittleEndian #include -#include +//#include #include /////////////////////////////////////////////////////////////////////////////// // Forward declarations // diff --git a/Code/Legacy/CryCommon/Cry_Matrix33.h b/Code/Legacy/CryCommon/Cry_Matrix33.h index 02d1586931..9e0b12fafa 100644 --- a/Code/Legacy/CryCommon/Cry_Matrix33.h +++ b/Code/Legacy/CryCommon/Cry_Matrix33.h @@ -1194,8 +1194,6 @@ struct Matrix33_tpl return true; } - - AUTO_STRUCT_INFO }; /////////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/Cry_Matrix34.h b/Code/Legacy/CryCommon/Cry_Matrix34.h index d409cfef8b..0659d3bc47 100644 --- a/Code/Legacy/CryCommon/Cry_Matrix34.h +++ b/Code/Legacy/CryCommon/Cry_Matrix34.h @@ -1213,8 +1213,6 @@ struct Matrix34_tpl m.m23 = pdotn * n.z; return m; } - - AUTO_STRUCT_INFO }; /////////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/Cry_Matrix44.h b/Code/Legacy/CryCommon/Cry_Matrix44.h index e97325141c..20d7494e16 100644 --- a/Code/Legacy/CryCommon/Cry_Matrix44.h +++ b/Code/Legacy/CryCommon/Cry_Matrix44.h @@ -655,8 +655,6 @@ struct Matrix44_tpl (fabs_tpl(m0.m30 - m1.m30) <= e) && (fabs_tpl(m0.m31 - m1.m31) <= e) && (fabs_tpl(m0.m32 - m1.m32) <= e) && (fabs_tpl(m0.m33 - m1.m33) <= e) ); } - - AUTO_STRUCT_INFO }; /////////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/Cry_Quat.h b/Code/Legacy/CryCommon/Cry_Quat.h index b062c584b7..a18d8a2ad9 100644 --- a/Code/Legacy/CryCommon/Cry_Quat.h +++ b/Code/Legacy/CryCommon/Cry_Quat.h @@ -888,9 +888,6 @@ struct Quat_tpl { return CreateNlerp(IDENTITY, *this, scale); } - - - AUTO_STRUCT_INFO }; @@ -1409,8 +1406,6 @@ struct QuatT_tpl { return QuatT_tpl(t * scale, q.GetScaled(scale)); } - - AUTO_STRUCT_INFO }; typedef QuatT_tpl QuatT; //always 32 bit @@ -1690,8 +1685,6 @@ struct QuatTS_tpl ILINE Vec3_tpl GetRow0() const { return q.GetRow0(); } ILINE Vec3_tpl GetRow1() const { return q.GetRow1(); } ILINE Vec3_tpl GetRow2() const { return q.GetRow2(); } - - AUTO_STRUCT_INFO }; typedef QuatTS_tpl QuatTS; //always 64 bit @@ -1947,8 +1940,6 @@ struct QuatTNS_tpl ILINE Vec3_tpl GetRow0() const { return q.GetRow0(); } ILINE Vec3_tpl GetRow1() const { return q.GetRow1(); } ILINE Vec3_tpl GetRow2() const { return q.GetRow2(); } - - AUTO_STRUCT_INFO }; typedef QuatTNS_tpl QuatTNS; @@ -2097,8 +2088,6 @@ struct DualQuat_tpl nq *= norm; dq *= norm; } - - AUTO_STRUCT_INFO }; #ifndef MAX_API_NUM diff --git a/Code/Legacy/CryCommon/Cry_Vector2.h b/Code/Legacy/CryCommon/Cry_Vector2.h index f17259d70f..a8722c1b02 100644 --- a/Code/Legacy/CryCommon/Cry_Vector2.h +++ b/Code/Legacy/CryCommon/Cry_Vector2.h @@ -295,8 +295,6 @@ struct Vec2_tpl { return sqrt_tpl((x - vec1.x) * (x - vec1.x) + (y - vec1.y) * (y - vec1.y)); } - - AUTO_STRUCT_INFO }; /////////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/Cry_Vector3.h b/Code/Legacy/CryCommon/Cry_Vector3.h index 7b735df0fa..bd1cc11430 100644 --- a/Code/Legacy/CryCommon/Cry_Vector3.h +++ b/Code/Legacy/CryCommon/Cry_Vector3.h @@ -845,8 +845,6 @@ struct Vec3_tpl { return Vec3_tpl(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); } - - AUTO_STRUCT_INFO }; // dot product (2 versions) @@ -1175,8 +1173,6 @@ struct Ang3_tpl } return true; } - - AUTO_STRUCT_INFO }; typedef Ang3_tpl Ang3; @@ -1406,8 +1402,6 @@ struct Plane_tpl Vec3_tpl MirrorPosition(const Vec3_tpl& i) { return i - n * (2 * ((n | i) + d)); } ILINE bool IsValid() const { return !n.IsZeroFast(); } //A plane with a zero normal isn't valid. - - AUTO_STRUCT_INFO }; typedef Plane_tpl Plane; //always 32 bit diff --git a/Code/Legacy/CryCommon/Cry_Vector4.h b/Code/Legacy/CryCommon/Cry_Vector4.h index bafeefe00b..bbb3395fb3 100644 --- a/Code/Legacy/CryCommon/Cry_Vector4.h +++ b/Code/Legacy/CryCommon/Cry_Vector4.h @@ -227,8 +227,6 @@ struct Vec4_tpl ILINE void SetLerp(const Vec4_tpl& p, const Vec4_tpl& q, F t) { *this = p * (1.0f - t) + q * t; } ILINE static Vec4_tpl CreateLerp(const Vec4_tpl& p, const Vec4_tpl& q, F t) { return p * (1.0f - t) + q * t; } - - AUTO_STRUCT_INFO }; diff --git a/Code/Legacy/CryCommon/HMDBus.h b/Code/Legacy/CryCommon/HMDBus.h index 674b7ffd1e..dab4c28668 100644 --- a/Code/Legacy/CryCommon/HMDBus.h +++ b/Code/Legacy/CryCommon/HMDBus.h @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include @@ -36,7 +35,7 @@ namespace AZ * Event triggered when an HMD initializes successfully */ virtual void OnHMDInitialized() {} - + /** * Event triggered when an HMD shuts down */ @@ -56,7 +55,7 @@ namespace AZ virtual ~HMDInitBus() {} /// - /// Attempt to initialize this device. If initialization is initially successful (device exists and is able to startup) then this device should connect to the + /// Attempt to initialize this device. If initialization is initially successful (device exists and is able to startup) then this device should connect to the /// HMDDeviceRequestBus in order to be used as an HMD from the main Open 3D Engine system. /// /// @return If true, initialization fully succeeded. @@ -120,21 +119,10 @@ namespace AZ }; /// - /// Get per-eye camera info from the device. The specific info to get is defined in the EyeCameraInfo struct. This function can be used to setup - /// rendering cameras per-eye. Note that each eye may have different projection matrix information. - /// - /// @param eye The specific eye to get camera data for. - /// @param nearPlane Near distance for the main render camera. - /// @param farPlane Far distance for the main render camera. - /// @param cameraInfo Returned camera information for this particular eye. - /// - virtual void GetPerEyeCameraInfo([[maybe_unused]] const EStereoEye eye, [[maybe_unused]] const float nearPlane, [[maybe_unused]] const float farPlane, [[maybe_unused]] PerEyeCameraInfo& cameraInfo) {} - - /// /// Update the HMD's internal state and handle events /// This is NOT where tracking is updated. This is for game-time /// events such as controllers connecting/disconnecting or - /// certain compositor events being triggered. + /// certain compositor events being triggered. /// virtual void UpdateInternalState() {} @@ -164,9 +152,9 @@ namespace AZ /// /// Retrieve the latest tracking state that was cached since the last call /// to UpdateTrackingStates. - /// - /// TODO: Differentiate between tracking states viable for rendering and - /// tracking states viable for game simulation. + /// + /// TODO: Differentiate between tracking states viable for rendering and + /// tracking states viable for game simulation. /// virtual TrackingState* GetTrackingState() { return nullptr; } @@ -196,7 +184,7 @@ namespace AZ /// /// Set the current tracking level of the HMD. Supported tracking levels are defined in struct TrackingLevel. - /// + /// /// @param level The tracking level we want to use with this HMD /// virtual void SetTrackingLevel([[maybe_unused]] const AZ::VR::HMDTrackingLevel level) {} @@ -209,7 +197,7 @@ namespace AZ /// /// Enable/disable debugging for this device. The device can decide what the most appropriate debugging information is /// displayed to the user (e.g. HMD position, performance info, latency timing, etc.). - /// + /// /// @param enable Set to true to enable debugging /// virtual void EnableDebugging([[maybe_unused]] bool enable) {} @@ -230,16 +218,16 @@ namespace AZ virtual HMDDeviceInfo* GetDeviceInfo() { return nullptr; } /// - /// Get whether or not the HMD has been initialized. The HMD has been initialized when it has fully established an interface - /// with its necessary SDK and is ready to be used. - /// + /// Get whether or not the HMD has been initialized. The HMD has been initialized when it has fully established an interface + /// with its necessary SDK and is ready to be used. + /// /// @return True if the device has been initialized and is usable /// virtual bool IsInitialized() { return false; } /// /// Get the play space of the device, if exists - /// + /// /// @return True if the device has been initialized and is usable /// virtual const Playspace* GetPlayspace() { return nullptr; } @@ -251,21 +239,13 @@ namespace AZ /// virtual void UpdateTrackingStates() {} - /// - /// Retrieves the current index into the VR system's swapchain that should be used. - /// This only really need to be overridden by VR implementations that keep track - /// of an internal swapchain like Oculus. OpenVR will handle swapchains - /// internally and can just return 0. - /// - virtual AZ::u32 GetSwapchainIndex([[maybe_unused]] const EStereoEye& eye) { return 0; } - protected: }; using HMDDeviceRequestBus = AZ::EBus; /// - /// Bus to define HMD debugging. This includes visualization of any HMD-specific objects as well as any + /// Bus to define HMD debugging. This includes visualization of any HMD-specific objects as well as any /// VR performance metrics displayed in the HMD. /// class HMDDebuggerBus diff --git a/Code/Legacy/CryCommon/IConsole.h b/Code/Legacy/CryCommon/IConsole.h index e03de35aa1..dcbb0399aa 100644 --- a/Code/Legacy/CryCommon/IConsole.h +++ b/Code/Legacy/CryCommon/IConsole.h @@ -6,12 +6,11 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_ICONSOLE_H -#define CRYINCLUDE_CRYCOMMON_ICONSOLE_H #pragma once #include +#include +#include struct SFunctor; @@ -454,24 +453,6 @@ struct IConsole virtual void DumpKeyBinds(IKeyBindDumpSink* pCallback) = 0; virtual const char* FindKeyBind(const char* sCmd) const = 0; - ////////////////////////////////////////////////////////////////////////// - // Hashing of cvars (for anti-cheat). Separates setting of range, calculation, - // and retrieval of result so calculation can be done at a known safe point - // (e.g end of frame) when we know cvars won't be modified or in temporary state - - // Get Number of cvars that can be hashed - virtual int GetNumCheatVars() = 0; - // Set the range of cvars - virtual void SetCheatVarHashRange(size_t firstVar, size_t lastVar) = 0; - // Calculate the hash from current cvars - virtual void CalcCheatVarHash() = 0; - // Since hash is calculated async, check if it's completed - virtual bool IsHashCalculated() = 0; - // Get the hash calculated - virtual uint64 GetCheatVarHash() = 0; - virtual void PrintCheatVars(bool bUseLastHashRange) = 0; - virtual char* GetCheatVarAt(uint32 nOffset) = 0; - ////////////////////////////////////////////////////////////////////////// // Console variable sink. // Adds a new console variables sink callback. @@ -644,19 +625,6 @@ struct ICVar // Returns an ID to use when getting or removing the functor virtual uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) = 0; - ////////////////////////////////////////////////////////////////////////// - // Returns the number of registered on change functos. - virtual uint64 GetNumberOfOnChangeFunctors() const = 0; - - ////////////////////////////////////////////////////////////////////////// - // Returns the functors with the specified id. - virtual const SFunctor& GetOnChangeFunctor(uint64 nFunctorId) const = 0; - - ////////////////////////////////////////////////////////////////////////// - // Removes an on change functor - // returns true if removal was successful. - virtual bool RemoveOnChangeFunctor(uint64 nFunctorId) = 0; - ////////////////////////////////////////////////////////////////////////// // Get the current callback function. virtual ConsoleVarFunc GetOnChangeCallback() const = 0; @@ -685,5 +653,3 @@ struct ICVar // Set the data probe string value of the variable virtual void SetDataProbeString(const char* pDataProbeString) = 0; }; - -#endif // CRYINCLUDE_CRYCOMMON_ICONSOLE_H diff --git a/Code/Legacy/CryCommon/IEntityRenderState.h b/Code/Legacy/CryCommon/IEntityRenderState.h index c4267b28f2..b459a6acaa 100644 --- a/Code/Legacy/CryCommon/IEntityRenderState.h +++ b/Code/Legacy/CryCommon/IEntityRenderState.h @@ -13,9 +13,10 @@ #include #include #include +#include -namespace AZ +namespace AZ { class Vector2; } @@ -29,560 +30,16 @@ struct SFrameLodInfo; struct pe_params_area; struct pe_articgeomparams; -// @NOTE: When removing an item from this enum, replace it with a dummy - ID's from this enum are stored in data and should not change. -enum EERType -{ - eERType_NotRenderNode, - eERType_Dummy_10, - eERType_Dummy8, - eERType_Light, - eERType_Cloud, - eERType_TerrainSystem, // used to be eERType_Dummy_1 which used to be eERType_VoxelObject, preserve order for compatibility - eERType_FogVolume, - eERType_Decal, - eERType_Dummy_6, // used to be eERType_ParticleEmitter, preserve order for compatibility - eERType_WaterVolume, - eERType_Dummy_5, // used to be eERType_WaterWave, preserve order for compatibility - eERType_Dummy_7, // used to be eERType_Road, preserve order for compatibility - eERType_DistanceCloud, - eERType_VolumeObject, - eERType_Dummy_0, // used to be eERType_AutoCubeMap, preserve order for compatibility - eERType_Rope, - eERType_PrismObject, - eERType_Dummy_2, // used to be eERType_IsoMesh, preserve order for compatibility - eERType_Dummy_4, - eERType_RenderComponent, - eERType_GameEffect, - eERType_BreakableGlass, - eERType_Dummy_3, // used to be eERType_LightShape, preserve order for compatibility - eERType_Dummy_9, - eERType_GeomCache, - eERType_StaticMeshRenderComponent, - eERType_DynamicMeshRenderComponent, - eERType_SkinnedMeshRenderComponent, - eERType_TypesNum, // MUST BE AT END TOTAL NUMBER OF ERTYPES -}; - -enum ERNListType -{ - eRNListType_Unknown, - eRNListType_DecalsAndRoads, - eRNListType_ListsNum, - eRNListType_First = eRNListType_Unknown, // This should be the last member - // And it counts on eRNListType_Unknown - // being the first enum element. -}; - -enum EOcclusionObjectType -{ - eoot_OCCLUDER, - eoot_OCEAN, - eoot_OCCELL, - eoot_OCCELL_OCCLUDER, - eoot_OBJECT, - eoot_OBJECT_TO_LIGHT, - eoot_TERRAIN_NODE, - eoot_PORTAL, -}; - -// RenderNode flags - -#define ERF_GOOD_OCCLUDER BIT(0) -#define ERF_PROCEDURAL BIT(1) -#define ERF_CLONE_SOURCE BIT(2) // set if this object was cloned from another one -#define ERF_CASTSHADOWMAPS BIT(3) // if you ever set this flag, be sure also to set ERF_HAS_CASTSHADOWMAPS -#define ERF_RENDER_ALWAYS BIT(4) -#define ERF_DYNAMIC_DISTANCESHADOWS BIT(5) -#define ERF_HIDABLE BIT(6) -#define ERF_HIDABLE_SECONDARY BIT(7) -#define ERF_HIDDEN BIT(8) -#define ERF_SELECTED BIT(9) -#define ERF_PROCEDURAL_ENTITY BIT(10) // this is an object generated at runtime which has a limited lifetime (matches procedural entity) -#define ERF_OUTDOORONLY BIT(11) -#define ERF_NODYNWATER BIT(12) -#define ERF_EXCLUDE_FROM_TRIANGULATION BIT(13) -#define ERF_REGISTER_BY_BBOX BIT(14) -#define ERF_STATIC_INSTANCING BIT(15) -#define ERF_VOXELIZE_STATIC BIT(16) -#define ERF_NO_PHYSICS BIT(17) -#define ERF_NO_DECALNODE_DECALS BIT(18) -#define ERF_REGISTER_BY_POSITION BIT(19) -#define ERF_COMPONENT_ENTITY BIT(20) -#define ERF_RECVWIND BIT(21) -#define ERF_COLLISION_PROXY BIT(22) // Collision proxy is a special object that is only visible in editor -// and used for physical collisions with player and vehicles. -#define ERF_LOD_BBOX_BASED BIT(23) // Lod changes based on bounding boxes. -#define ERF_SPEC_BIT0 BIT(24) // Bit0 of min config specification. -#define ERF_SPEC_BIT1 BIT(25) // Bit1 of min config specification. -#define ERF_SPEC_BIT2 BIT(26) // Bit2 of min config specification. -#define ERF_SPEC_BITS_MASK (ERF_SPEC_BIT0 | ERF_SPEC_BIT1 | ERF_SPEC_BIT2) // Bit mask of the min spec bits. -#define ERF_SPEC_BITS_SHIFT (24) // Bit offset of the ERF_SPEC_BIT0. -#define ERF_RAYCAST_PROXY BIT(27) // raycast proxy is only used for raycasting -#define ERF_HUD BIT(28) // Hud object that can avoid some visibility tests -#define ERF_RAIN_OCCLUDER BIT(29) // Is used for rain occlusion map -#define ERF_HAS_CASTSHADOWMAPS BIT(30) // at one point had ERF_CASTSHADOWMAPS set -#define ERF_ACTIVE_LAYER BIT(31) // the node is on a currently active layer - -struct IShadowCaster -{ - // - virtual ~IShadowCaster(){} - virtual bool HasOcclusionmap([[maybe_unused]] int nLod, [[maybe_unused]] IRenderNode* pLightOwner) { return false; } - virtual CLodValue ComputeLod(int wantedLod, [[maybe_unused]] const SRenderingPassInfo& passInfo) { return CLodValue(wantedLod); } - virtual void Render(const SRendParams& RendParams, const SRenderingPassInfo& passInfo) = 0; - virtual const AABB GetBBoxVirtual() = 0; - virtual void FillBBox(AABB& aabb) = 0; - virtual EERType GetRenderNodeType() = 0; - virtual bool IsRenderNode() { return true; } - // - uint8 m_cStaticShadowLod; -}; - -// Optional filter function for octree queries to perform custom filtering of the results. -// return true to keep the render node, false to filter it out. -using ObjectTreeQueryFilterCallback = AZStd::function; - -struct IOctreeNode -{ -public: - virtual ~IOctreeNode() {}; - - virtual void GetObjectsByType(PodArray& lstObjects, EERType objType, const AABB* pBBox, ObjectTreeQueryFilterCallback filterCallback = nullptr) = 0; - - struct CVisArea* m_pVisArea; -}; - -struct SLodDistDissolveTransitionState -{ - float fStartDist; - int8 nOldLod; - int8 nNewLod; - bool bFarside; -}; - -struct SLightInfo -{ - bool operator == (const SLightInfo& other) const - { return other.vPos.IsEquivalent(vPos, 0.1f) && fabs(other.fRadius - fRadius) < 0.1f; } - Vec3 vPos; - float fRadius; - bool bAffecting; -}; - struct IRenderNode - : public IShadowCaster { - enum EInternalFlags - { - DECAL_OWNER = BIT(0), // Owns some decals. - REQUIRES_NEAREST_CUBEMAP = BIT(1), // Pick nearest cube map - UPDATE_DECALS = BIT(2), // The node changed geometry - decals must be updated. - REQUIRES_FORWARD_RENDERING = BIT(3), // Special shadow processing needed. - WAS_INVISIBLE = BIT(4), // Was invisible last frame. - WAS_IN_VISAREA = BIT(5), // Was inside vis-ares last frame. - WAS_FARAWAY = BIT(6), // Was considered 'far away' for the purposes of physics deactivation. - HAS_OCCLUSION_PROXY = BIT(7) // This node has occlusion proxy. - }; - - IRenderNode() - { - m_dwRndFlags = 0; - m_fViewDistanceMultiplier = static_cast(IRenderNode::VIEW_DISTANCE_MULTIPLIER_MAX); // By default object is not limited by distance. - m_ucLodRatio = 100; - m_pOcNode = 0; - m_fWSMaxViewDist = 0; - m_nInternalFlags = 0; - m_nMaterialLayers = 0; - m_pRNTmpData = NULL; - m_pPrev = m_pNext = NULL; - m_nSID = 0; - m_cShadowLodBias = 0; - m_cStaticShadowLod = 0; - } - - virtual bool CanExecuteRenderAsJob() { return false; } - - // - // Debug info about object. - virtual const char* GetName() const = 0; - virtual const char* GetEntityClassName() const = 0; - virtual AZStd::string GetDebugString([[maybe_unused]] char type = 0) const { return ""; } - virtual float GetImportance() const { return 1.f; } - - // Description: - // Releases IRenderNode. - virtual void ReleaseNode([[maybe_unused]] bool bImmediate = false) { delete this; } - - - virtual IRenderNode* Clone() const { return NULL; } - - // Description: - // Sets render node transformation matrix. - virtual void SetMatrix([[maybe_unused]] const Matrix34& mat) {} - - // Description: - // Gets local bounds of the render node. - virtual void GetLocalBounds(AABB& bbox) { AABB WSBBox(GetBBox()); bbox = AABB(WSBBox.min - GetPos(true), WSBBox.max - GetPos(true)); } - - virtual Vec3 GetPos(bool bWorldOnly = true) const = 0; - virtual const AABB GetBBox() const = 0; - virtual void FillBBox(AABB& aabb) { aabb = GetBBox(); } - virtual void SetBBox(const AABB& WSBBox) = 0; - - virtual void SetScale([[maybe_unused]] const Vec3& scale) {} - - //Get the scales assuming the scale is uniform or per column as needed. - virtual float GetUniformScale() { return 1.0f; } - virtual float GetColumnScale([[maybe_unused]] int column) { return 1.0f; } - - // Summary: - // Changes the world coordinates position of this node by delta - // Don't forget to call this base function when overriding it. - virtual void OffsetPosition(const Vec3& delta) = 0; - - // Return true when the node is initialized and ready to render - virtual bool IsReady() const { return true; } - - // Summary: - // Renders node geometry - virtual void Render(const struct SRendParams& EntDrawParams, const SRenderingPassInfo& passInfo) = 0; - - // Hides/disables node in renderer. - virtual void Hide(bool bHide) { SetRndFlags(ERF_HIDDEN, bHide); } - bool IsHidden() const { return (GetRndFlags() & ERF_HIDDEN) != 0; } - // Gives access to object components. - virtual struct IStatObj* GetEntityStatObj(unsigned int nPartId = 0, unsigned int nSubPartId = 0, Matrix34A* pMatrix = NULL, bool bReturnOnlyVisible = false); - virtual _smart_ptr GetEntitySlotMaterial([[maybe_unused]] unsigned int nPartId, [[maybe_unused]] bool bReturnOnlyVisible = false, [[maybe_unused]] bool* pbDrawNear = NULL) { return NULL; } - virtual void SetEntityStatObj([[maybe_unused]] unsigned int nSlot, [[maybe_unused]] IStatObj* pStatObj, [[maybe_unused]] const Matrix34A* pMatrix = NULL) {}; - virtual int GetSlotCount() const { return 1; } - - // Summary: - // Returns IRenderMesh of the object. - virtual struct IRenderMesh* GetRenderMesh([[maybe_unused]] int nLod) { return 0; }; - - // Description: - // Allows to adjust default lod distance settings, - // if fLodRatio is 100 - default lod distance is used. - virtual void SetLodRatio(int nLodRatio) { m_ucLodRatio = static_cast(min(255, max(0, nLodRatio))); } - - // Summary: - // Gets material layers mask. - virtual uint8 GetMaterialLayers() const { return m_nMaterialLayers; } - - - // Summary - // Physicalizes if it isn't already. - virtual void CheckPhysicalized() {}; - - // Summary: - // Physicalizes node. - virtual void Physicalize([[maybe_unused]] bool bInstant = false) {} - - virtual ~IRenderNode() { assert(!m_pRNTmpData); }; - - // Summary: - // Sets override material for this instance. - virtual void SetMaterial(_smart_ptr pMat) = 0; - // Summary: - // Queries override material of this instance. - virtual _smart_ptr GetMaterial(Vec3* pHitPos = NULL) = 0; - virtual _smart_ptr GetMaterialOverride() = 0; - virtual void GetMaterials(AZStd::vector<_smart_ptr>& materials) - { - _smart_ptr currentMaterial = GetMaterialOverride(); - if (!currentMaterial) - { - currentMaterial = GetMaterial(); - } - if (currentMaterial) - { - materials.push_back(currentMaterial); - } + struct IStatObj* GetEntityStatObj(unsigned int = 0, unsigned int = 0, Matrix34A* = NULL, bool = false) { + return nullptr; } - // Used by the editor during export - virtual void SetCollisionClassIndex([[maybe_unused]] int tableIndex) {} - - virtual int GetEditorObjectId() { return 0; } - virtual void SetEditorObjectId([[maybe_unused]] int nEditorObjectId) {} - virtual void SetStatObjGroupIndex([[maybe_unused]] int nVegetationGroupIndex) { } - virtual int GetStatObjGroupId() const { return -1; } - virtual void SetLayerId([[maybe_unused]] uint16 nLayerId) { } - virtual uint16 GetLayerId() { return 0; } - virtual float GetMaxViewDist() = 0; - - virtual EERType GetRenderNodeType() = 0; - virtual bool IsAllocatedOutsideOf3DEngineDLL() - { - return GetRenderNodeType() == eERType_RenderComponent || - GetRenderNodeType() == eERType_StaticMeshRenderComponent || - GetRenderNodeType() == eERType_DynamicMeshRenderComponent || - GetRenderNodeType() == eERType_SkinnedMeshRenderComponent; - } - virtual void Dephysicalize([[maybe_unused]] bool bKeepIfReferenced = false) {} - virtual void Dematerialize() {} - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - - virtual void Precache() {}; - - virtual const AABB GetBBoxVirtual() { return GetBBox(); } - - // virtual float GetLodForDistance(float fDistance) { return 0; } - - virtual void OnRenderNodeBecomeVisible([[maybe_unused]] const SRenderingPassInfo& passInfo) {} - virtual void OnPhysAreaChange() {} - - virtual bool IsMovableByGame() const { return false; } - - virtual uint8 GetSortPriority() { return 0; } - - // Types of voxelization for objects and lights - enum EVoxelGIMode : int - { - VM_None = 0, // No voxelization - VM_Static, // Incremental or asynchronous lazy voxelization - VM_Dynamic, // Real-time every-frame voxelization on GPU - }; - - virtual EVoxelGIMode GetVoxelGIMode() { return VM_None; } - virtual void SetDesiredVoxelGIMode([[maybe_unused]] EVoxelGIMode voxelMode) {} - - virtual void SetMinSpec(int nMinSpec) { m_dwRndFlags &= ~ERF_SPEC_BITS_MASK; m_dwRndFlags |= (nMinSpec << ERF_SPEC_BITS_SHIFT) & ERF_SPEC_BITS_MASK; }; - - // Description: - // Allows to adjust default max view distance settings, - // if fMaxViewDistRatio is 1.0f - default max view distance is used. - virtual void SetViewDistanceMultiplier(float fViewDistanceMultiplier); - // - - void CopyIRenderNodeData(IRenderNode* pDest) const - { - pDest->m_fWSMaxViewDist = m_fWSMaxViewDist; - pDest->m_dwRndFlags = m_dwRndFlags; - //pDest->m_pOcNode = m_pOcNode; // Removed to stop the registering from earlying out. - pDest->m_fViewDistanceMultiplier = m_fViewDistanceMultiplier; - pDest->m_ucLodRatio = m_ucLodRatio; - pDest->m_cShadowLodBias = m_cShadowLodBias; - pDest->m_cStaticShadowLod = m_cStaticShadowLod; - pDest->m_nInternalFlags = m_nInternalFlags; - pDest->m_nMaterialLayers = m_nMaterialLayers; - //pDestBrush->m_pRNTmpData //If this is copied from the source render node, there are two - // pointers to the same data, and if either is deleted, there will - // be a crash when the dangling pointer is used on the other - } - - // Rendering flags. - ILINE void SetRndFlags(unsigned int dwFlags) { m_dwRndFlags = dwFlags; } - ILINE void SetRndFlags(unsigned int dwFlags, bool bEnable) - { - if (bEnable) - { - SetRndFlags(m_dwRndFlags | dwFlags); - } - else - { - SetRndFlags(m_dwRndFlags & (~dwFlags)); - } - } - ILINE unsigned int GetRndFlags() const { return m_dwRndFlags; } - - // Object draw frames (set if was drawn). - ILINE void SetDrawFrame(int nFrameID, int nRecursionLevel) - { - assert(m_pRNTmpData); - int* pDrawFrames = (int*)m_pRNTmpData; - pDrawFrames[nRecursionLevel] = nFrameID; - } - - ILINE int GetDrawFrame(int nRecursionLevel = 0) const - { - IF (!m_pRNTmpData, 0) - { - return 0; - } - - int* pDrawFrames = (int*)m_pRNTmpData; - return pDrawFrames[nRecursionLevel]; - } - - // Returns: - // Current VisArea or null if in outdoors or entity was not registered in 3dengine. - ILINE IVisArea* GetEntityVisArea() const { return m_pOcNode ? (IVisArea*)(m_pOcNode->m_pVisArea) : NULL; } - - // Summary: - // Makes object visible at any distance. - ILINE void SetViewDistUnlimited() { SetViewDistanceMultiplier(100.0f); } - - // Summary: - // Retrieves the view distance settings. - ILINE float GetViewDistanceMultiplier() const - { - return m_fViewDistanceMultiplier; - } - - // Summary: - // Returns lod distance ratio. - ILINE int GetLodRatio() const { return m_ucLodRatio; } - - // Summary: - // Returns lod distance ratio - ILINE float GetLodRatioNormalized() const { return 0.01f * m_ucLodRatio; } - - virtual bool GetLodDistances([[maybe_unused]] const SFrameLodInfo& frameLodInfo, [[maybe_unused]] float* distances) const { return false; } - - // Returns distance for first lod change, not factoring in distance multiplier or lod ratio - virtual float GetFirstLodDistance() const { return FLT_MAX; } - - // Description: - // Bias value to add to the regular lod - virtual void SetShadowLodBias(int8 nShadowLodBias) { m_cShadowLodBias = nShadowLodBias; } - - // Summary: - // Returns lod distance ratio. - ILINE int GetShadowLodBias() const { return m_cShadowLodBias; } - - // Summary: - // Sets material layers mask. - ILINE void SetMaterialLayers(uint8 nMtlLayers) { m_nMaterialLayers = nMtlLayers; } - - ILINE int GetMinSpec() const { return (m_dwRndFlags & ERF_SPEC_BITS_MASK) >> ERF_SPEC_BITS_SHIFT; }; - - static const ERNListType GetRenderNodeListId(const EERType eRType) - { - switch (eRType) - { - case eERType_Decal: - return eRNListType_DecalsAndRoads; - default: - return eRNListType_Unknown; - } - } - - virtual AZ::EntityId GetEntityId() { return AZ::EntityId(); } - - ////////////////////////////////////////////////////////////////////////// - // Variables - ////////////////////////////////////////////////////////////////////////// - -public: - - // Every sector has linked list of IRenderNode objects. - IRenderNode* m_pNext, * m_pPrev; - - // Current objects tree cell. - IOctreeNode* m_pOcNode; - - // Pointer to temporary data allocated only for currently visible objects. - struct CRNTmpData* m_pRNTmpData; - - // Max view distance. - float m_fWSMaxViewDist; - - // Render flags. - int m_dwRndFlags; - - // Shadow LOD bias - // Set to SHADOW_LODBIAS_DISABLE to disable any shadow lod overrides for this rendernode - static const int8 SHADOW_LODBIAS_DISABLE = -128; - int8 m_cShadowLodBias; - - // Segment Id - int m_nSID; + int GetSlotCount() const { return 1; } // Max view distance settings. - static const int VIEW_DISTANCE_MULTIPLIER_MAX = 100; - float m_fViewDistanceMultiplier; + static constexpr int VIEW_DISTANCE_MULTIPLIER_MAX = 100; - // LOD settings. - unsigned char m_ucLodRatio; - - // Flags for render node internal usage, one or more bits from EInternalFlags. - unsigned char m_nInternalFlags; - - // Material layers bitmask -> which material layers are active. - unsigned char m_nMaterialLayers; -}; - -inline void IRenderNode::SetViewDistanceMultiplier(float fViewDistanceMultiplier) -{ - fViewDistanceMultiplier = CLAMP(fViewDistanceMultiplier, 0.0f, 100.0f); - if (fabs(m_fViewDistanceMultiplier - fViewDistanceMultiplier) > FLT_EPSILON) - { - m_fViewDistanceMultiplier = fViewDistanceMultiplier; - } -} - - -/////////////////////////////////////////////////////////////////////////////// -inline IStatObj* IRenderNode::GetEntityStatObj([[maybe_unused]] unsigned int nPartId, [[maybe_unused]] unsigned int nSubPartId, [[maybe_unused]] Matrix34A* pMatrix, [[maybe_unused]] bool bReturnOnlyVisible) -{ - return 0; -} - - -//We must use interfaces instead of unsafe type casts and unnecessary includes - -struct ILightSource - : public IRenderNode -{ - // - virtual void SetLightProperties(const CDLight& light) = 0; - virtual CDLight& GetLightProperties() = 0; - virtual const Matrix34& GetMatrix() = 0; - virtual struct ShadowMapFrustum* GetShadowFrustum(int nId = 0) = 0; - virtual bool IsLightAreasVisible() = 0; - virtual void SetCastingException(IRenderNode* pNotCaster) = 0; - virtual void SetName(const char* name) = 0; - // -}; - -struct SCloudMovementProperties -{ - bool m_autoMove; - Vec3 m_speed; - Vec3 m_spaceLoopBox; - float m_fadeDistance; -}; - -// Summary: -// ICloudRenderNode is an interface to the Cloud Render Node object. -struct ICloudRenderNode - : public IRenderNode -{ - // - // Description: - // Loads a cloud from a cloud description XML file. - virtual bool LoadCloud(const char* sCloudFilename) = 0; - virtual bool LoadCloudFromXml(XmlNodeRef cloudNode) = 0; - virtual void SetMovementProperties(const SCloudMovementProperties& properties) = 0; - // -}; - -// Summary: -// IVoxelObject is an interface to the Voxel Object Render Node object. -struct IVoxelObject - : public IRenderNode -{ - // - virtual void SetCompiledData(void* pData, int nSize, uint8 ucChildId, EEndian eEndian) = 0; - virtual void SetObjectName(const char* pName) = 0; - virtual void SetMatrix(const Matrix34& mat) = 0; - virtual bool ResetTransformation() = 0; - virtual void InterpolateVoxelData() = 0; - virtual void SetFlags(int nFlags) = 0; - virtual void Regenerate() = 0; - virtual void CopyHM() = 0; - virtual bool IsEmpty() = 0; - // -}; - -// LY renderer system spec levels. -enum class EngineSpec : AZ::u32 -{ - Low = 1, - Medium, - High, - VeryHigh, - Never = UINT_MAX, }; diff --git a/Code/Legacy/CryCommon/IEntityRenderState_info.cpp b/Code/Legacy/CryCommon/IEntityRenderState_info.cpp deleted file mode 100644 index 762c741214..0000000000 --- a/Code/Legacy/CryCommon/IEntityRenderState_info.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "TypeInfo_impl.h" -#include // <> required for Interfuscator - -ENUM_INFO_BEGIN(EERType) -ENUM_ELEM_INFO(, eERType_NotRenderNode) -ENUM_ELEM_INFO(, eERType_Dummy_10) -ENUM_ELEM_INFO(, eERType_Light) -ENUM_ELEM_INFO(, eERType_Cloud) -ENUM_ELEM_INFO(, eERType_TerrainSystem) -ENUM_ELEM_INFO(, eERType_FogVolume) -ENUM_ELEM_INFO(, eERType_Decal) -ENUM_ELEM_INFO(, eERType_Dummy_6) -ENUM_ELEM_INFO(, eERType_WaterVolume) -ENUM_ELEM_INFO(, eERType_Dummy_7) -ENUM_ELEM_INFO(, eERType_DistanceCloud) -ENUM_ELEM_INFO(, eERType_VolumeObject) -ENUM_ELEM_INFO(, eERType_Dummy_0) -ENUM_ELEM_INFO(, eERType_Rope) -ENUM_ELEM_INFO(, eERType_PrismObject) -ENUM_ELEM_INFO(, eERType_Dummy_2) -ENUM_ELEM_INFO(, eERType_Dummy_4) -ENUM_ELEM_INFO(, eERType_RenderComponent) -ENUM_ELEM_INFO(, eERType_StaticMeshRenderComponent) -ENUM_ELEM_INFO(, eERType_DynamicMeshRenderComponent) -ENUM_ELEM_INFO(, eERType_SkinnedMeshRenderComponent) -ENUM_ELEM_INFO(, eERType_GameEffect) -ENUM_ELEM_INFO(, eERType_BreakableGlass) -ENUM_ELEM_INFO(, eERType_Dummy_3) -ENUM_ELEM_INFO(, eERType_Dummy_9) -ENUM_ELEM_INFO(, eERType_GeomCache) -ENUM_ELEM_INFO(, eERType_TypesNum) -ENUM_INFO_END(EERType) diff --git a/Code/Legacy/CryCommon/IFont.h b/Code/Legacy/CryCommon/IFont.h index 41e9f5653a..15cc6568bf 100644 --- a/Code/Legacy/CryCommon/IFont.h +++ b/Code/Legacy/CryCommon/IFont.h @@ -19,6 +19,7 @@ #include #include +#include #include struct ISystem; diff --git a/Code/Legacy/CryCommon/IIndexedMesh.h b/Code/Legacy/CryCommon/IIndexedMesh.h index 1c91bb82b8..a84cebacb3 100644 --- a/Code/Legacy/CryCommon/IIndexedMesh.h +++ b/Code/Legacy/CryCommon/IIndexedMesh.h @@ -7,16 +7,12 @@ */ -#ifndef CRYINCLUDE_CRYCOMMON_IINDEXEDMESH_H -#define CRYINCLUDE_CRYCOMMON_IINDEXEDMESH_H #pragma once -#include "CryHeaders.h" #include "Cry_Color.h" #include "StlUtils.h" #include "CryEndian.h" -#include #include // for AABB #include #include @@ -58,74 +54,16 @@ public: t = other.y; } - void ExportTo(Vec2f16& other) const - { - other = Vec2f16(s, t); - } - - void ExportTo(float& others, float& othert) const - { - others = s; - othert = t; - } - - bool operator ==(const SMeshTexCoord& other) const - { - return (s == other.s) && (t == other.t); - } - - bool operator !=(const SMeshTexCoord& other) const - { - return !(*this == other); - } - - bool operator <(const SMeshTexCoord& other) const - { - return (s != other.s) ? (s < other.s) : (t < other.t); - } - - bool IsEquivalent(const Vec2& other, float epsilon = 0.003f) const - { - return - (fabs_tpl(s - other.x) <= epsilon) && - (fabs_tpl(t - other.y) <= epsilon); - } - bool IsEquivalent(const SMeshTexCoord& other, float epsilon = 0.00005f) const { return (fabs_tpl(s - other.s) <= epsilon) && (fabs_tpl(t - other.t) <= epsilon); } - ILINE Vec2 GetUV() const { return Vec2(s, t); } - - void GetUV(Vec2& otheruv) const - { - otheruv = GetUV(); - } - - void GetUV(Vec4& otheruv) const - { - otheruv = Vec4(s, t, 0.0f, 1.0f); - } - - void Lerp(const SMeshTexCoord& other, float pos) - { - Vec2 texA; - Vec2 texB; - this->GetUV(); - other.GetUV(); - - texA.SetLerp(texA, texB, pos); - - *this = SMeshTexCoord(texA); - } - - AUTO_STRUCT_INFO }; // Description: @@ -145,55 +83,6 @@ public: b = otherb; a = othera; } - - void TransferRGBTo(SMeshColor& other) const - { - other.r = r; - other.g = g; - other.b = b; - } - - void TransferATo(SMeshColor& other) const - { - other.a = a; - } - - void MaskA(uint8 maska) - { - a &= maska; - } - - bool operator ==(const SMeshColor& other) const - { - return (r == other.r) && (g == other.g) && (b == other.b) && (a == other.a); - } - - bool operator !=(const SMeshColor& other) const - { - return !(*this == other); - } - - bool operator <(const SMeshColor& other) const - { - return (r != other.r) ? (r < other.r) : (g != other.g) ? (g < other.g) : (b != other.b) ? (b < other.b) : (a < other.a); - } - - ILINE ColorB GetRGBA() const - { - return ColorB(r, g, b, a); - } - - void GetRGBA(ColorB& otherc) const - { - otherc = GetRGBA(); - } - - void GetRGBA(Vec4& otherc) const - { - otherc = Vec4(r, g, b, a); - } - - AUTO_STRUCT_INFO }; @@ -203,8 +92,6 @@ struct SMeshFace { int v[3]; // indices to vertex, normals and optionally tangent basis arrays unsigned char nSubset; // index to mesh subsets array. - - AUTO_STRUCT_INFO }; // Description: @@ -222,380 +109,11 @@ public: Normal = othern; } - bool operator ==(const SMeshNormal& othern) const - { - return (Normal.x == othern.Normal.x) && (Normal.y == othern.Normal.y) && (Normal.z == othern.Normal.z); - } + Vec3 GetN() const { return Normal; } - bool operator !=(const SMeshNormal& othern) const - { - return !(*this == othern); - } - - bool operator <(const SMeshNormal& othern) const - { - return (Normal.x != othern.Normal.x) ? (Normal.x < othern.Normal.x) : (Normal.y != othern.Normal.y) ? (Normal.y < othern.Normal.y) : (Normal.z < othern.Normal.z); - } - - bool IsEquivalent(const Vec3& othern, float epsilon = 0.00005f) const - { - return - Normal.IsEquivalent(othern, epsilon); - } - - bool IsEquivalent(const SMeshNormal& othern, float epsilon = 0.00005f) const - { - return - IsEquivalent(othern.Normal, epsilon); - } - - ILINE Vec3 GetN() const - { - return Normal; - } - - void GetN(Vec3& othern) const - { - othern = GetN(); - } - - void RotateBy(const Matrix33& rot) - { - Normal = rot * Normal; - } - - void RotateSafelyBy(const Matrix33& rot) - { - Normal = rot * Normal; - // normalize in case "rot" wasn't length-preserving - Normal.Normalize(); - } - - void RotateBy(const Matrix34& trn) - { - Normal = trn.TransformVector(Normal); - } - - void RotateSafelyBy(const Matrix34& trn) - { - Normal = trn.TransformVector(Normal); - // normalize in case "trn" wasn't length-preserving - Normal.Normalize(); - } - - void Slerp(const SMeshNormal& other, float pos) - { - Vec3 nrmA = this->GetN(); - Vec3 nrmB = other.GetN(); - - nrmA.Normalize(); - nrmB.Normalize(); - - nrmA.SetSlerp(nrmA, nrmB, pos); - - *this = SMeshNormal(nrmA); - } - - AUTO_STRUCT_INFO }; -// Description: -// Mesh tangents (tangent space normals). -struct SMeshTangents -{ - SMeshTangents() {} - -private: - Vec4sf Tangent; - Vec4sf Bitangent; - -public: - explicit SMeshTangents(const Vec4sf& othert, const Vec4sf& otherb) - { - Tangent = othert; - Bitangent = otherb; - } - - explicit SMeshTangents(const SPipTangents& other) - { - Tangent = other.Tangent; - Bitangent = other.Bitangent; - } - - explicit SMeshTangents(const Vec4& othert, const Vec4& otherb) - { - Tangent = PackingSNorm::tPackF2Bv(othert); - Bitangent = PackingSNorm::tPackF2Bv(otherb); - } - - explicit SMeshTangents(const Vec3& othert, const Vec3& otherb, const Vec3& othern) - { - // TODO: can be optimized to use only integer arithmetic - int16 othersign = 1; - if (othert.Cross(otherb).Dot(othern) < 0) - { - othersign = -1; - } - - Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), PackingSNorm::tPackS2B(othersign)); - Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), PackingSNorm::tPackS2B(othersign)); - } - - explicit SMeshTangents(const Vec3& othert, const Vec3& otherb, const int16& othersign) - { - Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), PackingSNorm::tPackS2B(othersign)); - Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), PackingSNorm::tPackS2B(othersign)); - } - - void ExportTo(Vec4sf& othert, Vec4sf& otherb) const - { - othert = Tangent; - otherb = Bitangent; - } - - void ExportTo(SPipTangents& other) const - { - other.Tangent = Tangent; - other.Bitangent = Bitangent; - } - - bool operator ==(const SMeshTangents& other) const - { - return - Tangent[0] == other.Tangent[0] || - Tangent[1] == other.Tangent[1] || - Tangent[2] == other.Tangent[2] || - Tangent[3] == other.Tangent[3] || - Bitangent[0] == other.Bitangent[0] || - Bitangent[1] == other.Bitangent[1] || - Bitangent[2] == other.Bitangent[2] || - Bitangent[3] == other.Bitangent[3]; - } - - bool operator !=(const SMeshTangents& other) const - { - return !(*this == other); - } - - bool IsEquivalent(const Vec3& othert, const Vec3& otherb, const int16& othersign, float epsilon = 0.01f) const - { - // TODO: can be optimized to use only integer arithmetic - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - return - (tng.w == othersign) && - (btg.w == othersign) && - (tng3.Dot(othert) >= (1.0f - epsilon)) && - (btg3.Dot(otherb) >= (1.0f - epsilon)); - } - - void GetTB(Vec4sf& othert, Vec4sf& otherb) const - { - othert = Tangent; - otherb = Bitangent; - } - - void GetTB(Vec4& othert, Vec4& otherb) const - { - othert = PackingSNorm::tPackB2F(Tangent); - otherb = PackingSNorm::tPackB2F(Bitangent); - } - - void GetTB(Vec3& othert, Vec3& otherb) const - { - const Vec4 t = PackingSNorm::tPackB2F(Tangent); - const Vec4 b = PackingSNorm::tPackB2F(Bitangent); - - othert = Vec3(t.x, t.y, t.z); - otherb = Vec3(b.x, b.y, b.z); - } - - ILINE Vec3 GetN() const - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - // assumes w 1 or -1 - return tng3.Cross(btg3) * tng.w; - } - - void GetN(Vec3& othern) const - { - othern = GetN(); - } - - void GetTBN(Vec3& othert, Vec3& otherb, Vec3& othern) const - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - // assumes w 1 or -1 - othert = tng3; - otherb = btg3; - othern = tng3.Cross(btg3) * tng.w; - } - - ILINE int16 GetR() const - { - return PackingSNorm::tPackB2S(Tangent.w); - } - - void GetR(int16& sign) const - { - sign = GetR(); - } - - void RotateBy(const Matrix33& rot) - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - tng3 = rot * tng3; - btg3 = rot * btg3; - - *this = SMeshTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); - } - - void RotateSafelyBy(const Matrix33& rot) - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - tng3 = rot * tng3; - btg3 = rot * btg3; - - // normalize in case "rot" wasn't length-preserving - tng3.Normalize(); - btg3.Normalize(); - - *this = SMeshTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); - } - - void RotateBy(const Matrix34& trn) - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - tng3 = trn.TransformVector(tng3); - btg3 = trn.TransformVector(btg3); - - *this = SMeshTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); - } - - void RotateSafelyBy(const Matrix34& trn) - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z); - Vec3 btg3(btg.x, btg.y, btg.z); - - tng3 = trn.TransformVector(tng3); - btg3 = trn.TransformVector(btg3); - - // normalize in case "rot" wasn't length-preserving - tng3.Normalize(); - btg3.Normalize(); - - *this = SMeshTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); - } - - void SlerpTowards(const SMeshTangents& other, const SMeshNormal& normal, float pos) - { - Vec3 tngA, btgA; - Vec3 tngB, btgB; - this->GetTB(tngA, btgA); - other.GetTB(tngB, btgB); - - // Q: necessary? - tngA.Normalize(); - tngB.Normalize(); - btgA.Normalize(); - btgB.Normalize(); - - tngA.SetSlerp(tngA, tngB, pos); - btgA.SetSlerp(btgA, btgB, pos); - - *this = SMeshTangents(tngA, btgA, normal.GetN()); - } - - AUTO_STRUCT_INFO -}; - -struct SMeshQTangents -{ - SMeshQTangents() {} - -private: - Vec4sf TangentBitangent; - -public: - explicit SMeshQTangents(const SPipQTangents& other) - { - TangentBitangent = other.QTangent; - } - - explicit SMeshQTangents(const Quat& other) - { - TangentBitangent.x = PackingSNorm::tPackF2B(other.v.x); - TangentBitangent.y = PackingSNorm::tPackF2B(other.v.y); - TangentBitangent.z = PackingSNorm::tPackF2B(other.v.z); - TangentBitangent.w = PackingSNorm::tPackF2B(other.w); - } - - void ExportTo(SPipQTangents& other) - { - other.QTangent = TangentBitangent; - } - - ILINE Quat GetQ() const - { - Quat q; - - q.v.x = PackingSNorm::tPackB2F(TangentBitangent.x); - q.v.y = PackingSNorm::tPackB2F(TangentBitangent.y); - q.v.z = PackingSNorm::tPackB2F(TangentBitangent.z); - q.w = PackingSNorm::tPackB2F(TangentBitangent.w); - - return q; - } - - AUTO_STRUCT_INFO -}; - -// Description: -// for skinning every vertex has 4 bones and 4 weights. -struct SMeshBoneMapping_uint16 -{ - typedef uint16 BoneId; - typedef uint8 Weight; - - BoneId boneIds[4]; - Weight weights[4]; - - AUTO_STRUCT_INFO -}; - struct SMeshBoneMapping_uint8 { typedef uint8 BoneId; @@ -603,27 +121,8 @@ struct SMeshBoneMapping_uint8 BoneId boneIds[4]; Weight weights[4]; - - AUTO_STRUCT_INFO }; -//START: Add LOD support for touch bending vegetation -struct SMeshBoneMappingInfo_uint8 -{ - SMeshBoneMappingInfo_uint8(int vertexCount) - { - //Will be deleted by ~SFoliageInfoCGF() - pBoneMapping = new SMeshBoneMapping_uint8[vertexCount]; - nVertexCount = vertexCount; - } - - int nVertexCount; - struct SMeshBoneMapping_uint8* pBoneMapping; - - AUTO_STRUCT_INFO -}; -//END: Add LOD support for touch bending vegetation - // Subset of mesh is a continuous range of vertices and indices that share same material. struct SMeshSubset { @@ -653,1529 +152,11 @@ struct SMeshSubset , nNumVerts(0) , nMatID(0) , nMatFlags(0) - , nPhysicalizeType(PHYS_GEOM_TYPE_DEFAULT) + , nPhysicalizeType(0x1000) , vertexFormat(eVF_P3S_C4B_T2S) { } - void GetMemoryUsage([[maybe_unused]] class ICrySizer* pSizer) const - { - } - - // fix numVerts - void FixRanges(vtx_idx* pIndices) - { - int startVertexToMerge = nFirstVertId; - int startIndexToMerge = nFirstIndexId; - int numIndiciesToMerge = nNumIndices; - // find good min and max AGAIN - int maxVertexInUse = 0; - for (int n = 0; n < numIndiciesToMerge; n++) - { - int i = (int)pIndices[n + startIndexToMerge]; - startVertexToMerge = (i < startVertexToMerge ? i : startVertexToMerge);// min - maxVertexInUse = (i > maxVertexInUse ? i : maxVertexInUse);// max - } - nNumVerts = maxVertexInUse - startVertexToMerge + 1; - } -}; - -class CMeshHelpers -{ -public: - template - static bool ComputeTexMappingAreas( - size_t indexCount, const TIndex* pIndices, - size_t vertexCount, - const TPosition* pPositions, size_t stridePositions, - const TTexCoordinates* pTexCoords, size_t strideTexCoords, - float& computedPosArea, float& computedTexArea, const char*& errorText) - { - static const float minPosArea = 10e-6f; - static const float minTexArea = 10e-8f; - - computedPosArea = 0; - computedTexArea = 0; - errorText = "?"; - - if (indexCount <= 0) - { - errorText = "index count is 0"; - return false; - } - - if (vertexCount <= 0) - { - errorText = "vertex count is 0"; - return false; - } - - if ((pIndices == NULL) || (pPositions == NULL)) - { - errorText = "indices and/or positions are NULL"; - return false; - } - - if (pTexCoords == NULL) - { - errorText = "texture coordinates are NULL"; - return false; - } - - if (indexCount % 3 != 0) - { - assert(0); - errorText = "bad number of indices"; - return false; - } - - // Compute average geometry area of face - - int count = 0; - float posAreaSum = 0; - float texAreaSum = 0; - for (size_t i = 0; i < indexCount; i += 3) - { - const size_t index0 = pIndices[i]; - const size_t index1 = pIndices[i + 1]; - const size_t index2 = pIndices[i + 2]; - - if ((index0 >= vertexCount) || (index1 >= vertexCount) || (index2 >= vertexCount)) - { - errorText = "bad vertex index detected"; - return false; - } - - const Vec3 pos0 = ToVec3(*(const TPosition*) (((const char*)pPositions) + index0 * stridePositions)); - const Vec3 pos1 = ToVec3(*(const TPosition*) (((const char*)pPositions) + index1 * stridePositions)); - const Vec3 pos2 = ToVec3(*(const TPosition*) (((const char*)pPositions) + index2 * stridePositions)); - - const Vec2 tex0 = ToVec2(*(const TTexCoordinates*) (((const char*)pTexCoords) + index0 * strideTexCoords)); - const Vec2 tex1 = ToVec2(*(const TTexCoordinates*) (((const char*)pTexCoords) + index1 * strideTexCoords)); - const Vec2 tex2 = ToVec2(*(const TTexCoordinates*) (((const char*)pTexCoords) + index2 * strideTexCoords)); - - const float posArea = ((pos1 - pos0).Cross(pos2 - pos0)).GetLength() * 0.5f; - const float texArea = fabsf((tex1 - tex0).Cross(tex2 - tex0)) * 0.5f; - - if ((posArea >= minPosArea) && (texArea >= minTexArea)) - { - posAreaSum += posArea; - texAreaSum += texArea; - ++count; - } - } - - if (count == 0 || (posAreaSum < minPosArea) || (texAreaSum < minTexArea)) - { - errorText = "faces are too small or have stretched mapping"; - return false; - } - - computedPosArea = posAreaSum; - computedTexArea = texAreaSum; - return true; - } - - template - static bool CollectFaceAreas(size_t indexCount, const vtx_idx* pIndices, size_t vertexCount, - const TPosition* pPositions, size_t stridePositions, std::vector& areas) - { - static const float minFaceArea = 10e-6f; - - if (indexCount % 3 != 0) - { - return false; - } - - areas.reserve(areas.size() + indexCount / 3); - - for (size_t i = 0; i < indexCount; i += 3) - { - const uint index0 = pIndices[i]; - const uint index1 = pIndices[i + 1]; - const uint index2 = pIndices[i + 2]; - - if ((index0 >= vertexCount) || (index1 >= vertexCount) || (index2 >= vertexCount)) - { - return false; - } - - const Vec3 pos0 = ToVec3(*(const TPosition*) (((const char*)pPositions) + index0 * stridePositions)); - const Vec3 pos1 = ToVec3(*(const TPosition*) (((const char*)pPositions) + index1 * stridePositions)); - const Vec3 pos2 = ToVec3(*(const TPosition*) (((const char*)pPositions) + index2 * stridePositions)); - - const float faceArea = ((pos1 - pos0).Cross(pos2 - pos0)).GetLength() * 0.5f; - - if (faceArea >= minFaceArea) - { - areas.push_back(faceArea); - } - } - - return true; - } - -private: - template - inline static Vec3 ToVec3(const T& v) - { - return v.ToVec3(); - } - - template - inline static Vec2 ToVec2(const T& v) - { - Vec2 uv; - v.GetUV(uv); - - return uv; - } -}; - -template <> -inline Vec3 CMeshHelpers::ToVec3(const Vec3& v) -{ - return v; -} - -template <> -inline Vec2 CMeshHelpers::ToVec2(const Vec2& v) -{ - return v; -} - -template <> -inline Vec2 CMeshHelpers::ToVec2(const Vec2f16& v) -{ - return v.ToVec2(); -} - -template <> -inline Vec2 CMeshHelpers::ToVec2(const SMeshTexCoord& v) -{ - return v.GetUV(); -} - - -////////////////////////////////////////////////////////////////////////// -// Description: -// General purpose mesh class. -////////////////////////////////////////////////////////////////////////// -class CMesh -{ -public: - // e.g. no more than 8 positions, 8 colors, 8 uv sets, etc. - const static uint maxStreamsPerType = 8; - enum EStream - { - POSITIONS = 0, - POSITIONSF16, - NORMALS, - FACES, - TOPOLOGY_IDS, - TEXCOORDS, - COLORS, - INDICES, - TANGENTS, - BONEMAPPING, - VERT_MATS, - QTANGENTS, - P3S_C4B_T2S, - - EXTRABONEMAPPING, // Extra stream. Does not have a stream ID in the CGF. Its data is saved at the end of the BONEMAPPING stream. - - LAST_STREAM, - }; - - SMeshFace* m_pFaces; // faces are used in mesh processing/compilation - int32* m_pTopologyIds; - - // geometry data - vtx_idx* m_pIndices; // indices are used for the final render-mesh - Vec3* m_pPositions; - Vec3f16* m_pPositionsF16; - - SMeshNormal* m_pNorms; - SMeshTangents* m_pTangents; - SMeshQTangents* m_pQTangents; - SMeshTexCoord* m_pTexCoord; - SMeshColor* m_pColor0; - SMeshColor* m_pColor1; - - int* m_pVertMats; - SVF_P3S_C4B_T2S* m_pP3S_C4B_T2S; - - SMeshBoneMapping_uint16* m_pBoneMapping; //bone-mapping for the final render-mesh - SMeshBoneMapping_uint16* m_pExtraBoneMapping; //bone indices and weights for bones 5 to 8. - - int m_nCoorCount; //number of texture coordinates in m_pTexCoord array - int m_streamSize[LAST_STREAM][maxStreamsPerType]; - - // Bounding box. - AABB m_bbox; - - // Array of mesh subsets. - DynArray m_subsets; - - // Mask that indicate if this stream is using not allocated in Mesh pointer; - // ex. if (m_sharedStreamMasks[0] & (1< the 1st normals stream is shared - // if (m_sharedStreamMasks[1] & (1< the 2nd uv set stream is shared - uint32 m_sharedStreamMasks[maxStreamsPerType]; - - // Texture space area divided by geometry area. Zero if cannot compute. - float m_texMappingDensity; - - // Geometric mean value calculated from the areas of this mesh faces. - float m_geometricMeanFaceArea; - - ////////////////////////////////////////////////////////////////////////// - void GetMemoryUsage(class ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_subsets); - - for (int streamType = 0; streamType < LAST_STREAM; streamType++) - { - for (int streamIndex = 0; streamIndex < GetNumberOfStreamsByType(streamType); ++streamIndex) - { - void* pStream; - int nElementSize = 0; - GetStreamInfo(streamType, streamIndex, pStream, nElementSize); - pSizer->AddObject(pStream, m_streamSize[streamType][streamIndex] * nElementSize); - } - } - } - - ////////////////////////////////////////////////////////////////////////// - CMesh() - { - m_pFaces = NULL; - m_pTopologyIds = NULL; - m_pIndices = NULL; - m_pPositions = NULL; - m_pPositionsF16 = NULL; - m_pNorms = NULL; - m_pTangents = NULL; - m_pQTangents = NULL; - m_pTexCoord = NULL; - m_pColor0 = NULL; - m_pColor1 = NULL; - m_pVertMats = NULL; - m_pP3S_C4B_T2S = NULL; - m_pBoneMapping = NULL; - m_pExtraBoneMapping = NULL; - - m_nCoorCount = 0; - - memset(m_texCoords, 0, sizeof(m_texCoords)); - memset(m_streamSize, 0, sizeof(m_streamSize)); - - m_bbox.Reset(); - - memset(m_sharedStreamMasks, 0, sizeof(m_sharedStreamMasks)); - - m_texMappingDensity = 0.0f; - m_geometricMeanFaceArea = 0.0f; - } - - virtual ~CMesh() - { - FreeStreams(); - } - - void FreeStreams() - { - for (int streamType = 0; streamType < LAST_STREAM; ++streamType) - { - for (int streamIndex = 0; streamIndex < GetNumberOfStreamsByType(streamType); ++streamIndex) - { - ReallocStream(streamType, streamIndex, 0); - } - } - } - - int GetFaceCount() const - { - return m_streamSize[FACES][0]; - } - int GetVertexCount() const - { - return max(max(m_streamSize[POSITIONS][0], m_streamSize[POSITIONSF16][0]), m_streamSize[P3S_C4B_T2S][0]); - } - int GetTexCoordCount() const - { - return m_nCoorCount; - } - int GetTangentCount() const - { - return m_streamSize[TANGENTS][0]; - } - int GetSubSetCount() const - { - return m_subsets.size(); - } - int GetIndexCount() const - { - return m_streamSize[INDICES][0]; - } - - void SetFaceCount(int nNewCount) - { - ReallocStream(FACES, 0, nNewCount); - } - - void SetVertexCount(int nNewCount) - { - if (GetVertexCount() != nNewCount || GetVertexCount() == 0) - { - ReallocStream(POSITIONS, 0, nNewCount); - ReallocStream(POSITIONSF16, 0, 0); - ReallocStream(NORMALS, 0, nNewCount); - - if (m_pColor0) - { - ReallocStream(COLORS, 0, nNewCount); - } - - if (m_pColor1) - { - ReallocStream(COLORS, 1, nNewCount); - } - - if (m_pVertMats) - { - ReallocStream(VERT_MATS, 0, nNewCount); - } - } - } - - void SetTexCoordsCount(int nNewCount) - { - if (m_nCoorCount != nNewCount || m_nCoorCount == 0) - { - ReallocStream(TEXCOORDS, 0, nNewCount); - m_nCoorCount = nNewCount; - } - } - - void SetTexCoordsAndTangentsCount(int nNewCount) - { - if (m_nCoorCount != nNewCount || m_nCoorCount == 0) - { - ReallocStream(TEXCOORDS, 0, nNewCount); - ReallocStream(TANGENTS, 0, nNewCount); - m_nCoorCount = nNewCount; - } - } - - void SetIndexCount(int nNewCount) - { - ReallocStream(INDICES, 0, nNewCount); - } - // Once m_pTexCoords, m_pColors, etc. are wrapped in vectors, return the size of the vector - // or if we go with fixed size arrays, with a bunch of nullptrs, maybe just return the fixed size or the number of non-null ptrs - int GetNumberOfStreamsByType(int streamType) const - { - if (streamType == COLORS || streamType == TEXCOORDS) - { - return 2; - } - return 1; - } - - bool Has32BitPositions(void) const - { - return m_pPositions != nullptr; - } - - bool Has16BitPositions(void) const - { - return m_pPositionsF16 != nullptr; - } - - bool IsUVSetEmptyForSubmesh(uint submeshIndex, uint uvSet) - { - // Get a pointer to the uv set - SMeshTexCoord* texCoords = nullptr; - if (uvSet == 0) - { - texCoords = m_pTexCoord; - } - else - { - texCoords = m_texCoords[uvSet]; - } - - if (texCoords) - { - // Iterate through the vertices for the submesh - Vec2 emptyTexCoord = Vec2(0.0f, 0.0f); - for (int i = m_subsets[submeshIndex].nFirstVertId; i < m_subsets[submeshIndex].nFirstVertId + m_subsets[submeshIndex].nNumVerts; ++i) - { - // If any of the texture coordinates for the given uv set are non-zero, return false. - if (texCoords[i].GetUV() != emptyTexCoord) - { - return false; - } - } - } - // If no valid texture coordinates are found for submesh for the given uv set, return true. - return true; - } - - void SetSubmeshVertexFormats(void) - { - EVertexFormat desiredFormat = eVF_Unknown; - for (int submeshIndex = 0; submeshIndex < m_subsets.size(); ++submeshIndex) - { - // Choose float or short based on the precision of the positions - if (this->Has32BitPositions()) - { - // Choose one or two uv sets - if (IsUVSetEmptyForSubmesh(submeshIndex, 1)) - { - desiredFormat = eVF_P3F_C4B_T2F; - } - else - { - desiredFormat = eVF_P3F_C4B_T2F_T2F; - } - } - else if (this->Has16BitPositions()) - { - // Choose one or two uv sets - if (IsUVSetEmptyForSubmesh(submeshIndex, 1)) - { - desiredFormat = eVF_P3S_C4B_T2S; - } - else - { - desiredFormat = eVF_P3S_C4B_T2S_T2S; - } - } - else - { - AZ_Assert(false, "Submesh does not contain positions"); - } - - // Set the vertex format for the submesh - m_subsets[submeshIndex].vertexFormat = AZ::Vertex::Format(desiredFormat); - } - } - - AZ::Vertex::Format GetVertexFormatForSubmesh(int submeshIndex) const - { - assert(submeshIndex < m_subsets.size()); - - return m_subsets[submeshIndex].vertexFormat; - } - - AZ::Vertex::Format GetMeshGroupVertexFormat() const - { - AZ::Vertex::Format meshGroupFormat; - for (int submeshIndex = 0; submeshIndex < m_subsets.size(); ++submeshIndex) - { - if (m_subsets[submeshIndex].vertexFormat > meshGroupFormat) - { - meshGroupFormat = m_subsets[submeshIndex].vertexFormat; - } - } - - return meshGroupFormat; - } - - // Set specific stream type as shared. If there are multiple streams for a given type (such as multiple uv sets), then all streams of that type will be marked as shared - void SetSharedStream(int streamType, int streamIndex, void* pStream, int nElementCount) - { - AZ_Assert(streamType >= 0 && streamType < LAST_STREAM && streamIndex < maxStreamsPerType, "Stream type %d outside of allowable range (%d to %d) of CMesh::EStream, or stream index %d exceeds the maximum number of vertex streams (%d) per type.", streamType, 0, CMesh::LAST_STREAM, streamIndex, maxStreamsPerType); - if ((m_sharedStreamMasks[streamIndex] & (1 << streamType)) == 0) - { - ReallocStream(streamType, streamIndex, 0); - m_sharedStreamMasks[streamIndex] |= (1 << streamType); - } - SetStreamData(streamType, streamIndex, pStream, nElementCount); - } - - template - T* GetStreamPtrAndElementCount(int streamType, int streamIndex, int* pElementCount = 0) const - { - void* pStream = 0; - int nElementSize = 0; - GetStreamInfo(streamType, streamIndex, pStream, nElementSize); - - if (nElementSize != sizeof(T)) - { - AZ_Assert(false, "The element size %d returned by GetStreamInfo does not match the size %d of type T", nElementSize, sizeof(T)); - pStream = 0; - } - - const int nElementCount = (pStream ? this->m_streamSize[streamType][streamIndex] : 0); - - if (pElementCount) - { - *pElementCount = nElementCount; - } - return (T*)pStream; - } - - template - T* GetStreamPtr(int streamType, int streamIndex = 0) const - { - void* pStream = 0; - int nElementSize = 0; - GetStreamInfo(streamType, streamIndex, pStream, nElementSize); - - if (nElementSize != sizeof(T)) - { - AZ_Assert(false, "The element size %d returned by GetStreamInfo does not match the size %d of type T", nElementSize, sizeof(T)); - pStream = 0; - } - - return (T*)pStream; - } - - void GetStreamInfo(int streamType, int streamIndex, void*& pStream, int& nElementSize) const - { - pStream = 0; - nElementSize = 0; - AZ_Assert(streamType >= 0 && streamType < LAST_STREAM && streamIndex < maxStreamsPerType, "Stream type %d outside of allowable range (%d to %d) of CMesh::EStream, or stream index %d exceeds the maximum number of vertex streams (%d) per type.", streamType, 0, CMesh::LAST_STREAM, streamIndex, maxStreamsPerType); - - switch (streamType) - { - case POSITIONS: - pStream = m_pPositions; - nElementSize = sizeof(Vec3); - break; - case POSITIONSF16: - pStream = m_pPositionsF16; - nElementSize = sizeof(Vec3f16); - break; - case NORMALS: - pStream = m_pNorms; - nElementSize = sizeof(Vec3); - break; - case VERT_MATS: - pStream = m_pVertMats; - nElementSize = sizeof(int); - break; - case FACES: - pStream = m_pFaces; - nElementSize = sizeof(SMeshFace); - break; - case TOPOLOGY_IDS: - pStream = m_pTopologyIds; - nElementSize = sizeof(int32); - break; - case TEXCOORDS: - if (streamIndex == 0) - { - pStream = m_pTexCoord; - } - else - { - pStream = m_texCoords[streamIndex]; - } - nElementSize = sizeof(SMeshTexCoord); - break; - case COLORS: - if (streamIndex == 0) - { - pStream = m_pColor0; - } - else - { - pStream = m_pColor1; - } - nElementSize = sizeof(SMeshColor); - break; - case INDICES: - pStream = m_pIndices; - nElementSize = sizeof(vtx_idx); - break; - case TANGENTS: - pStream = m_pTangents; - nElementSize = sizeof(SMeshTangents); - break; - case QTANGENTS: - pStream = m_pQTangents; - nElementSize = sizeof(SMeshQTangents); - break; - case BONEMAPPING: - pStream = m_pBoneMapping; - nElementSize = sizeof(SMeshBoneMapping_uint16); - break; - case EXTRABONEMAPPING: - pStream = m_pExtraBoneMapping; - nElementSize = sizeof(SMeshBoneMapping_uint16); - break; - case P3S_C4B_T2S: - pStream = m_pP3S_C4B_T2S; - nElementSize = sizeof(SVF_P3S_C4B_T2S); - break; - default: - AZ_Assert(false, "Unknown stream"); - break; - } - } - - - virtual void ReallocStream(int streamType, int streamIndex, int nNewCount) - { - if (streamType < 0 || streamType >= LAST_STREAM || streamIndex >= maxStreamsPerType) - { - AZ_Assert(false, "Stream type %d outside of allowable range (%d to %d) of CMesh::EStream, or stream index %d exceeds the maximum number of vertex streams (%d) per type.", streamType, 0, CMesh::LAST_STREAM, streamIndex, maxStreamsPerType); - return; - } - - if (m_sharedStreamMasks[streamIndex] & (1 << streamType)) - { - m_sharedStreamMasks[streamIndex] &= ~(1 << streamType); - - if (nNewCount <= 0) - { - SetStreamData(streamType, 0, nullptr, 0); - } - else - { - const int nOldCount = m_streamSize[streamType][streamIndex]; - void* pOldElements = 0; - int nElementSize = 0; - GetStreamInfo(streamType, streamIndex, pOldElements, nElementSize); - - void* const pNewElements = realloc(0, nNewCount * nElementSize); - if (!pNewElements) - { - AZ_Assert(false, "Allocation failed"); - SetStreamData(streamType, streamIndex, nullptr, 0); - return; - } - - if (nOldCount > 0) - { - memcpy(pNewElements, pOldElements, min(nOldCount, nNewCount) * nElementSize); - } - if (nNewCount > nOldCount) - { - memset((char*)pNewElements + nOldCount * nElementSize, 0, (nNewCount - nOldCount) * nElementSize); - } - - SetStreamData(streamType, streamIndex, pNewElements, nNewCount); - } - } - else - { - const int nOldCount = m_streamSize[streamType][streamIndex]; - if (nOldCount == nNewCount) - { - // stream already has required size - return; - } - - void* pOldElements = 0; - int nElementSize = 0; - GetStreamInfo(streamType, streamIndex, pOldElements, nElementSize); - - if (nNewCount <= 0) - { - free(pOldElements); - SetStreamData(streamType, streamIndex, nullptr, 0); - } - else - { - void* const pNewElements = realloc(pOldElements, nNewCount * nElementSize); - if (!pNewElements) - { - AZ_Assert(false, "Allocation failed"); - free(pOldElements); - SetStreamData(streamType, streamIndex, nullptr, 0); - return; - } - - if (nNewCount > nOldCount) - { - memset((char*)pNewElements + nOldCount * nElementSize, 0, (nNewCount - nOldCount) * nElementSize); - } - - SetStreamData(streamType, streamIndex, pNewElements, nNewCount); - } - } - } - - // Copy mesh from source mesh. - void Copy(const CMesh& mesh) - { - for (int streamType = 0; streamType < LAST_STREAM; streamType++) - { - for (int streamIndex = 0; streamIndex < GetNumberOfStreamsByType(streamType); ++streamIndex) - { - ReallocStream(streamType, streamIndex, mesh.m_streamSize[streamType][streamIndex]); - if (mesh.m_streamSize[streamType][streamIndex] > 0) - { - void* pSrcStream = 0; - void* pTrgStream = 0; - int nElementSize = 0; - mesh.GetStreamInfo(streamType, streamIndex, pSrcStream, nElementSize); - GetStreamInfo(streamType, streamIndex, pTrgStream, nElementSize); - if (pSrcStream && pTrgStream) - { - memcpy(pTrgStream, pSrcStream, m_streamSize[streamType][streamIndex] * nElementSize); - } - } - } - } - m_bbox = mesh.m_bbox; - m_subsets = mesh.m_subsets; - m_texMappingDensity = mesh.m_texMappingDensity; - m_geometricMeanFaceArea = mesh.m_geometricMeanFaceArea; - } - - bool CompareStreams(const CMesh& mesh) const - { - for (int streamType = 0; streamType < LAST_STREAM; streamType++) - { - for (int streamIndex = 0; streamIndex < GetNumberOfStreamsByType(streamType); ++streamIndex) - { - if (m_streamSize[streamType][streamIndex] != mesh.m_streamSize[streamType][streamIndex]) - { - return false; - } - - if (m_streamSize[streamType][streamIndex]) - { - void* pStream1 = 0; - void* pStream2 = 0; - int nElementSize1 = 0; - int nElementSize2 = 0; - GetStreamInfo(streamType, streamIndex, pStream1, nElementSize1); - mesh.GetStreamInfo(streamType, streamIndex, pStream2, nElementSize2); - - assert(nElementSize1 == nElementSize2); - - if ((pStream1 && !pStream2) || (!pStream1 && pStream2)) - { - return false; - } - - if (pStream1 && pStream2) - { - if (memcmp(pStream1, pStream2, m_streamSize[streamType][streamIndex] * nElementSize1) != 0) - { - return false; - } - } - } - } - } - return true; - } - - // Add streams from source mesh to the end of existing streams. - const char* Append(const CMesh& mesh) - { - return Append(mesh, 0, -1, 0, -1); - } - - // Add streams from source mesh to the end of existing streams. - const char* Append(const CMesh& mesh, int fromVertex, int vertexCount, int fromFace, int faceCount) - { - if (GetIndexCount() > 0 || mesh.GetIndexCount() > 0) - { - assert(0); - return "Cmesh::Append() cannot handle meshes with indices, it can handle faces only"; - } - - // Non-ranged requests should start from 0th element and element count should be <0. - if ((vertexCount < 0 && fromVertex != 0) || (faceCount < 0 && fromFace != 0)) - { - assert(0); - return "Cmesh::Append(): Bad CMesh parameters"; - } - if (vertexCount < 0) - { - vertexCount = mesh.GetVertexCount(); - } - if (faceCount < 0) - { - faceCount = mesh.GetFaceCount(); - } - - const int oldVertexCount = GetVertexCount(); - const int oldFaceCount = GetFaceCount(); - - if (GetTexCoordCount() != 0 && GetTexCoordCount() != oldVertexCount) - { - assert(0); - return "Cmesh::Append(): Mismatch in target CMesh vert/tcoord counts"; - } - - if (mesh.GetTexCoordCount() != 0 && mesh.GetTexCoordCount() != mesh.GetVertexCount()) - { - assert(0); - return "Cmesh::Append(): Mismatch in source CMesh vert/tcoord counts"; - } - - for (int streamType = 0; streamType < LAST_STREAM; ++streamType) - { - for (int streamIndex = 0; streamIndex < GetNumberOfStreamsByType(streamType); ++streamIndex) - { - const int oldCount = (streamType == FACES) ? oldFaceCount : oldVertexCount; - - const int from = (streamType == FACES) ? fromFace : fromVertex; - const int count = (streamType == FACES) ? faceCount : vertexCount; - - const int oldStreamSize = m_streamSize[streamType][streamIndex]; - const int streamSize = mesh.m_streamSize[streamType][streamIndex]; - - if (oldStreamSize <= 0 && (count <= 0 || streamSize <= 0)) - { - continue; - } - - ReallocStream(streamType, streamIndex, oldCount + count); - - if (count > 0) - { - void* pSrcStream = 0; - void* pTrgStream = 0; - int srcElementSize = 0; - int trgElementSize = 0; - mesh.GetStreamInfo(streamType, streamIndex, pSrcStream, srcElementSize); - GetStreamInfo(streamType, streamIndex, pTrgStream, trgElementSize); - - assert(srcElementSize == trgElementSize); - - if (pSrcStream && pTrgStream) - { - memcpy( - (char*)pTrgStream + oldCount * trgElementSize, - (char*)pSrcStream + from * srcElementSize, - count * srcElementSize); - } - } - } - } - - { - const int nOffset = oldVertexCount - fromVertex; - const int newFaceCount = GetFaceCount(); - - for (int i = oldFaceCount; i < newFaceCount; ++i) - { - m_pFaces[i].v[0] += nOffset; - m_pFaces[i].v[1] += nOffset; - m_pFaces[i].v[2] += nOffset; - } - } - - m_bbox.Add(mesh.m_bbox.min); - m_bbox.Add(mesh.m_bbox.max); - - return 0; - } - - void RemoveRangeFromStream(int streamType, int streamIndex, int nFirst, int nCount) - { - if (streamType < 0 || streamType >= LAST_STREAM || streamIndex >= maxStreamsPerType) - { - AZ_Assert(false, "Stream type %d outside of allowable range (%d to %d) of CMesh::EStream, or stream index %d exceeds the maximum number of vertex streams (%d) per type.", streamType, 0, CMesh::LAST_STREAM, streamIndex, maxStreamsPerType); - return; - } - - if (m_sharedStreamMasks[streamIndex] & (1 << streamType)) - { - // Make shared stream non-shared - ReallocStream(streamType, streamIndex, m_streamSize[streamType][streamIndex]); - } - - const int nTotalCount = m_streamSize[streamType][streamIndex]; - - int nElementSize; - void* pStream = 0; - GetStreamInfo(streamType, streamIndex, pStream, nElementSize); - - if (nFirst >= nTotalCount || nTotalCount <= 0 || pStream == 0) - { - return; - } - if (nFirst + nCount > nTotalCount) - { - nCount = nTotalCount - nFirst; - } - if (nCount <= 0) - { - return; - } - - const int nTailCount = nTotalCount - (nFirst + nCount); - if (nTailCount > 0) - { - char* const pRangeStart = (char*)pStream + nFirst * nElementSize; - char* const pRangeEnd = (char*)pStream + (nFirst + nCount) * nElementSize; - memmove(pRangeStart, pRangeEnd, nTailCount * nElementSize); - } - - ReallocStream(streamType, streamIndex, nTotalCount - nCount); - } - - bool Validate(const char** const ppErrorDescription) const - { - const int vertexCount = GetVertexCount(); - const int faceCount = GetFaceCount(); - const int indexCount = GetIndexCount(); - - if ((faceCount <= 0) && (indexCount <= 0)) - { - if (vertexCount > 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "no any indices, but vertices exist"; - } - return false; - } - } - - if ((uint)vertexCount > (sizeof(vtx_idx) == 2 ? 0xffff : 0x7fffffff)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = - (sizeof(vtx_idx) == 2) - ? "vertex count is greater or equal than 64K" - : "vertex count is greater or equal than 2G"; - } - return false; - } - - if (faceCount > 0) - { - if (vertexCount <= 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "no any vertices, but faces exist"; - } - return false; - } - } - - if (indexCount > 0) - { - if (vertexCount <= 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "no any vertices, but indices exist"; - } - return false; - } - } - - for (int i = 0; i < faceCount; ++i) - { - const SMeshFace& face = m_pFaces[i]; - for (int j = 0; j < 3; ++j) - { - const int v = face.v[j]; - if ((v < 0) || (v >= vertexCount)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a face refers vertex outside of vertex array"; - } - return false; - } - } - } - - for (int i = 0; i < indexCount; i++) - { - if ((uint)m_pIndices[i] >= (uint)vertexCount) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "an index refers vertex outside of vertex array"; - } - return false; - } - } - - if (GetTexCoordCount() != 0 && GetTexCoordCount() != vertexCount) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "number of texture coordinates is different from number of vertices"; - } - return false; - } - - if (!_finite(m_bbox.min.x) || !_finite(m_bbox.min.y) || !_finite(m_bbox.min.z) || - !_finite(m_bbox.max.x) || !_finite(m_bbox.max.y) || !_finite(m_bbox.max.z)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "bounding box contains damaged data"; - } - return false; - } - - if (m_bbox.IsReset()) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "bounding box is not set"; - } - return false; - } - - if (m_bbox.max.x < m_bbox.min.x || - m_bbox.max.y < m_bbox.min.y || - m_bbox.max.z < m_bbox.min.z) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "bounding box min is greater than max"; - } - return false; - } - - if (m_bbox.min.GetDistance(m_bbox.max) < 0.001f) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "bounding box is less than 1 mm in size"; - } - return false; - } - - for (int s = 0, subsetCount = m_subsets.size(); s < subsetCount; ++s) - { - const SMeshSubset& subset = m_subsets[s]; - - if (subset.nNumIndices <= 0) - { - if (subset.nNumVerts > 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset without indices contains vertices"; - } - return false; - } - continue; - } - else if (subset.nNumVerts <= 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset has indices but vertices are missing"; - } - return false; - } - - if (subset.nFirstIndexId < 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset has negative start position in index array"; - } - return false; - } - if (subset.nFirstIndexId + subset.nNumIndices > indexCount) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset refers indices outside of index array"; - } - return false; - } - if (subset.nFirstVertId < 0) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset has negative start position in vertex array"; - } - return false; - } - if (subset.nFirstVertId + subset.nNumVerts > vertexCount) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset refers vertices outside of vertex array"; - } - return false; - } - - for (int ii = subset.nFirstIndexId; ii < subset.nFirstIndexId + subset.nNumIndices; ++ii) - { - const uint index = m_pIndices[ii]; - if (index < (uint)subset.nFirstVertId) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset refers a vertex lying before subset vertices"; - } - return false; - } - if (index >= (uint)(subset.nFirstVertId + subset.nNumVerts)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset refers a vertex lying after subset vertices"; - } - return false; - } - - Vec3 p(ZERO); - const Vec3* pp = &p; - if (m_pPositions) - { - pp = &m_pPositions[index]; - } - else if (m_pPositionsF16) - { - p = m_pPositionsF16[index].ToVec3(); - } - else if (m_pP3S_C4B_T2S) - { - p = m_pP3S_C4B_T2S[index].xyz.ToVec3(); - } - if (!_finite(pp->x)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset contains a vertex with damaged x component"; - } - return false; - } - if (!_finite(pp->y)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset contains a vertex with damaged y component"; - } - return false; - } - if (!_finite(pp->z)) - { - if (ppErrorDescription) - { - ppErrorDescription[0] = "a mesh subset contains a vertex with damaged z component"; - } - return false; - } - } - } - - return true; - } - - bool ComputeSubsetTexMappingAreas( - size_t subsetIndex, - float& computedPosArea, float& computedTexArea, const char*& errorText) - { - computedPosArea = 0.0f; - computedTexArea = 0.0f; - errorText = ""; - - if (subsetIndex >= (size_t)m_subsets.size()) - { - errorText = "subset index is bad"; - return false; - } - - if (GetIndexCount() <= 0) - { - errorText = "missing indices"; - return false; - } - - if ((GetVertexCount() <= 0) || ((m_pPositions == NULL) && (m_pPositionsF16 == NULL))) - { - errorText = "missing vertices"; - return false; - } - - if ((m_pTexCoord == NULL) || (GetTexCoordCount() <= 0)) - { - errorText = "missing texture coordinates"; - return false; - } - - const SMeshSubset& subset = m_subsets[subsetIndex]; - - if ((subset.nNumIndices <= 0) || (subset.nFirstIndexId < 0)) - { - errorText = "missing or bad indices in subset"; - return false; - } - - bool ok; - if (m_pPositions) - { - ok = CMeshHelpers::ComputeTexMappingAreas( - subset.nNumIndices, &m_pIndices[subset.nFirstIndexId], - GetVertexCount(), - &m_pPositions[0], sizeof(m_pPositions[0]), - &m_pTexCoord[0], sizeof(m_pTexCoord[0]), - computedPosArea, computedTexArea, errorText); - } - else - { - ok = CMeshHelpers::ComputeTexMappingAreas( - subset.nNumIndices, &m_pIndices[subset.nFirstIndexId], - GetVertexCount(), - &m_pPositionsF16[0], sizeof(m_pPositionsF16[0]), - &m_pTexCoord[0], sizeof(m_pTexCoord[0]), - computedPosArea, computedTexArea, errorText); - } - - return ok; - } - - // note: this function doesn't work for "old" uncompressed meshes (with faces instead of indices) - bool RecomputeTexMappingDensity() - { - m_texMappingDensity = 0; - - if (GetFaceCount() > 0) - { - // uncompressed mesh - not supported - return false; - } - - if ((GetIndexCount() <= 0) || (GetVertexCount() <= 0) || ((m_pPositions == NULL) && (m_pPositionsF16 == NULL))) - { - return false; - } - - if ((m_pTexCoord == NULL) || (GetTexCoordCount() <= 0)) - { - return false; - } - - float totalPosArea = 0; - float totalTexArea = 0; - - for (size_t i = 0, count = m_subsets.size(); i < count; ++i) - { - - float posArea; - float texArea; - const char* errorText = ""; - - const bool ok = ComputeSubsetTexMappingAreas(i, posArea, texArea, errorText); - - if (ok) - { - totalPosArea += posArea; - totalTexArea += texArea; - } - } - - if (totalPosArea <= 0) - { - return false; - } - - m_texMappingDensity = totalTexArea / totalPosArea; - return true; - } - - bool RecomputeGeometricMeanFaceArea() - { - m_geometricMeanFaceArea = 0.0f; - - if (GetFaceCount() > 0) - { - // uncompressed mesh - not supported - return false; - } - - if ((GetIndexCount() <= 0) || (GetVertexCount() <= 0) || ((m_pPositions == NULL) && (m_pPositionsF16 == NULL))) - { - return false; - } - - std::vector areas; - const size_t subsetCount = m_subsets.size(); - - for (size_t i = 0; i < subsetCount; ++i) - { - CollectSubsetFaceAreas(m_subsets[i], areas); - } - - const size_t areasCount = areas.size(); - if (areasCount == 0) - { - return false; - } - - float fGeometricTotal = 0.0f; - for (size_t i = 0; i < areasCount; ++i) - { - fGeometricTotal += logf(areas[i]); - } - - m_geometricMeanFaceArea = expf(fGeometricTotal / areasCount); - - assert(m_geometricMeanFaceArea > 0.0f); - - return true; - } - - bool CollectSubsetFaceAreas(const SMeshSubset& subset, std::vector& areas) - { - if ((subset.nNumIndices <= 0) || (subset.nFirstIndexId < 0)) - { - return false; - } - - bool ok = false; - if (m_pPositions != NULL) - { - ok = CMeshHelpers::CollectFaceAreas(subset.nNumIndices, &m_pIndices[subset.nFirstIndexId], - GetVertexCount(), &m_pPositions[0], sizeof(m_pPositions[0]), areas); - } - else if (m_pPositionsF16 != NULL) - { - ok = CMeshHelpers::CollectFaceAreas(subset.nNumIndices, &m_pIndices[subset.nFirstIndexId], - GetVertexCount(), &m_pPositionsF16[0], sizeof(m_pPositionsF16[0]), areas); - } - - return ok; - } - - ////////////////////////////////////////////////////////////////////////// - // Estimates the size of the render mesh. - uint32 EstimateRenderMeshMemoryUsage() const - { - const size_t cSizeStream[VSF_NUM] = { - 0U, - sizeof(SPipTangents), // VSF_TANGENTS - sizeof(SPipQTangents), // VSF_QTANGENTS - sizeof(SVF_W4B_I4S), // VSF_HWSKIN_INFO - sizeof(SVF_P3F), // VSF_VERTEX_VELOCITY -#if ENABLE_NORMALSTREAM_SUPPORT - sizeof(SPipNormal), // VSF_NORMALS -#endif - }; - - uint32 nMeshSize = 0; - uint32 activeStreams = (GetVertexCount()) ? 1U << VSF_GENERAL : 0U; - activeStreams |= - (m_pQTangents) ? (1U << VSF_QTANGENTS) : - (m_pTangents) ? (1U << VSF_TANGENTS) : 0U; - if (m_pBoneMapping) - { - activeStreams |= 1U << VSF_HWSKIN_INFO; - } - for (uint32 i = 0; i < VSF_NUM; i++) - { - if (activeStreams & (1U << i)) - { - nMeshSize += static_cast(((i == VSF_GENERAL) ? sizeof(SVF_P3S_C4B_T2S) : cSizeStream[i]) * GetVertexCount()); - nMeshSize += TARGET_DEFAULT_ALIGN - (nMeshSize & (TARGET_DEFAULT_ALIGN - 1)); - } - } - if (GetIndexCount()) - { - nMeshSize += GetIndexCount() * sizeof(vtx_idx); - nMeshSize += TARGET_DEFAULT_ALIGN - (nMeshSize & (TARGET_DEFAULT_ALIGN - 1)); - } - - return nMeshSize; - } - ////////////////////////////////////////////////////////////////////////// - - // This function used when we do not have an actual mesh, but only vertex/index count of it. - static uint32 ApproximateRenderMeshMemoryUsage(int nVertexCount, int nIndexCount) - { - uint32 nMeshSize = 0; - nMeshSize += nVertexCount * sizeof(SVF_P3S_C4B_T2S); - nMeshSize += nVertexCount * sizeof(SPipTangents); - - nMeshSize += nIndexCount * sizeof(vtx_idx); - return nMeshSize; - } - -private: - // Set stream size. - void SetStreamData(int streamType, int streamIndex, void* pStream, int nNewCount) - { - if (streamType < 0 || streamType >= LAST_STREAM || streamIndex >= maxStreamsPerType) - { - AZ_Assert(false, "Stream type %d outside of allowable range (%d to %d) of CMesh::EStream, or stream index %d exceeds the maximum number of vertex streams (%d) per type.", streamType, 0, CMesh::LAST_STREAM, streamIndex, maxStreamsPerType); - return; - } - m_streamSize[streamType][streamIndex] = nNewCount; - switch (streamType) - { - case POSITIONS: - m_pPositions = (Vec3*)pStream; - break; - case POSITIONSF16: - m_pPositionsF16 = (Vec3f16*)pStream; - break; - case NORMALS: - m_pNorms = (SMeshNormal*)pStream; - break; - case VERT_MATS: - m_pVertMats = (int*)pStream; - break; - case FACES: - m_pFaces = (SMeshFace*)pStream; - break; - case TOPOLOGY_IDS: - m_pTopologyIds = (int32*)pStream; - break; - case TEXCOORDS: - if (streamIndex == 0) - { - m_pTexCoord = (SMeshTexCoord*)pStream; - } - else - { - m_texCoords[streamIndex] = (SMeshTexCoord*)pStream; - } - m_nCoorCount = nNewCount; - break; - case COLORS: - if (streamIndex == 0) - { - m_pColor0 = (SMeshColor*)pStream; - } - else - { - m_pColor1 = (SMeshColor*)pStream; - } - break; - case INDICES: - m_pIndices = (vtx_idx*)pStream; - break; - case TANGENTS: - m_pTangents = (SMeshTangents*)pStream; - break; - case QTANGENTS: - m_pQTangents = (SMeshQTangents*)pStream; - break; - case BONEMAPPING: - m_pBoneMapping = (SMeshBoneMapping_uint16*)pStream; - break; - case EXTRABONEMAPPING: - m_pExtraBoneMapping = (SMeshBoneMapping_uint16*)pStream; - break; - case P3S_C4B_T2S: - m_pP3S_C4B_T2S = (SVF_P3S_C4B_T2S*)pStream; - m_nCoorCount = nNewCount; - break; - default: - AZ_Assert(false, "Unknown stream"); - break; - } - } - - SMeshTexCoord* m_texCoords[maxStreamsPerType]; }; // Description: @@ -2209,10 +190,6 @@ struct IIndexedMesh //! Gives read-only access to mesh data virtual void GetMeshDescription(SMeshDescription& meshDesc) const = 0; - virtual CMesh* GetMesh() = 0; - - virtual void SetMesh(CMesh& mesh) = 0; - /*! Frees vertex and face streams. Calling this function invalidates SMeshDescription pointers */ virtual void FreeStreams() = 0; @@ -2228,54 +205,17 @@ struct IIndexedMesh /*! Reallocates vertices, normals and colors. Calling this function invalidates SMeshDescription pointers */ virtual void SetVertexCount(int nNewCount) = 0; - /*! Reallocates colors. Calling this function invalidates SMeshDescription pointers */ - virtual void SetColorCount(int nNewCount) = 0; - //! Return number of allocated texture coordinates virtual int GetTexCoordCount() const = 0; - /*! Reallocates texture coordinates. Calling this function invalidates SMeshDescription pointers */ - virtual void SetTexCoordCount(int nNewCount, int numStreams = 1) = 0; - - //! Return number of allocated tangents. - virtual int GetTangentCount() const = 0; - - /*! Reallocates tangents. Calling this function invalidates SMeshDescription pointers */ - virtual void SetTangentCount(int nNewCount) = 0; - // Get number of indices in the mesh. virtual int GetIndexCount() const = 0; - // Set number of indices in the mesh. - virtual void SetIndexCount(int nNewCount) = 0; - - // Allocates m_pBoneMapping in CMesh - virtual void AllocateBoneMapping() = 0; - ////////////////////////////////////////////////////////////////////////// // Subset access. ////////////////////////////////////////////////////////////////////////// virtual int GetSubSetCount() const = 0; - virtual void SetSubSetCount(int nSubsets) = 0; virtual const SMeshSubset& GetSubSet(int nIndex) const = 0; - virtual void SetSubsetBounds(int nIndex, const Vec3& vCenter, float fRadius) = 0; - virtual void SetSubsetIndexVertexRanges(int nIndex, int nFirstIndexId, int nNumIndices, int nFirstVertId, int nNumVerts) = 0; - virtual void SetSubsetMaterialId(int nIndex, int nMatID) = 0; - virtual void SetSubsetMaterialProperties(int nIndex, int nMatFlags, int nPhysicalizeType, const AZ::Vertex::Format& vertexFormat) = 0; - ////////////////////////////////////////////////////////////////////////// - // Mesh bounding box. - ////////////////////////////////////////////////////////////////////////// - virtual void SetBBox(const AABB& box) = 0; - virtual AABB GetBBox() const = 0; - virtual void CalcBBox() = 0; - - virtual void RestoreFacesFromIndices() = 0; // - - // Optimizes mesh - virtual void Optimize(const char* szComment = NULL) = 0; }; - - -#endif // CRYINCLUDE_CRYCOMMON_IINDEXEDMESH_H diff --git a/Code/Legacy/CryCommon/IIndexedMesh_info.cpp b/Code/Legacy/CryCommon/IIndexedMesh_info.cpp deleted file mode 100644 index fe15ab7949..0000000000 --- a/Code/Legacy/CryCommon/IIndexedMesh_info.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "TypeInfo_impl.h" -#include // <> required for Interfuscator - -STRUCT_INFO_BEGIN(SMeshTexCoord) -STRUCT_VAR_INFO(s, TYPE_INFO(float)) -STRUCT_VAR_INFO(t, TYPE_INFO(float)) -STRUCT_INFO_END(SMeshTexCoord) - -STRUCT_INFO_BEGIN(SMeshNormal) -STRUCT_VAR_INFO(Normal, TYPE_INFO(Vec3)) -STRUCT_INFO_END(SMeshNormal) - -STRUCT_INFO_BEGIN(SMeshColor) -STRUCT_VAR_INFO(r, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(g, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(b, TYPE_INFO(uint8)) -STRUCT_VAR_INFO(a, TYPE_INFO(uint8)) -STRUCT_INFO_END(SMeshColor) - -STRUCT_INFO_BEGIN(SMeshTangents) -STRUCT_VAR_INFO(Tangent, TYPE_INFO(Vec4sf)) -STRUCT_VAR_INFO(Bitangent, TYPE_INFO(Vec4sf)) -STRUCT_INFO_END(SMeshTangents) - -STRUCT_INFO_BEGIN(SMeshQTangents) -STRUCT_VAR_INFO(TangentBitangent, TYPE_INFO(Vec4sf)) -STRUCT_INFO_END(SMeshQTangents) - -STRUCT_INFO_BEGIN(SMeshBoneMapping_uint16) -STRUCT_VAR_INFO(boneIds, TYPE_ARRAY(4, TYPE_INFO(SMeshBoneMapping_uint16::BoneId))) -STRUCT_VAR_INFO(weights, TYPE_ARRAY(4, TYPE_INFO(SMeshBoneMapping_uint16::Weight))) -STRUCT_INFO_END(SMeshBoneMapping_uint16) - -STRUCT_INFO_BEGIN(SMeshBoneMapping_uint8) -STRUCT_VAR_INFO(boneIds, TYPE_ARRAY(4, TYPE_INFO(SMeshBoneMapping_uint8::BoneId))) -STRUCT_VAR_INFO(weights, TYPE_ARRAY(4, TYPE_INFO(SMeshBoneMapping_uint8::Weight))) -STRUCT_INFO_END(SMeshBoneMapping_uint8) diff --git a/Code/Legacy/CryCommon/ILocalizationManager.h b/Code/Legacy/CryCommon/ILocalizationManager.h index 2cba093f21..0f0ba88250 100644 --- a/Code/Legacy/CryCommon/ILocalizationManager.h +++ b/Code/Legacy/CryCommon/ILocalizationManager.h @@ -73,11 +73,11 @@ struct SLocalizedSoundInfoGame bool bIsIntercepted; // SoundMoods. - int nNumSoundMoods; + size_t nNumSoundMoods; SLocalizedAdvancesSoundEntry* pSoundMoods; // EventParameters. - int nNumEventParameters; + size_t nNumEventParameters; SLocalizedAdvancesSoundEntry* pEventParameters; }; diff --git a/Code/Legacy/CryCommon/IMaterial.h b/Code/Legacy/CryCommon/IMaterial.h index e1502b0f1a..1b3ef258ce 100644 --- a/Code/Legacy/CryCommon/IMaterial.h +++ b/Code/Legacy/CryCommon/IMaterial.h @@ -10,36 +10,12 @@ // Description : IMaterial interface declaration. #pragma once -struct ISurfaceType; -struct ISurfaceTypeManager; -class ICrySizer; - -enum EEfResTextures : int; // Need to specify a fixed size for the forward declare to work on clang - -struct SShaderItem; -struct SShaderParam; -struct IShader; -struct IMaterial; -struct IMaterialManager; -struct CMaterialCGF; -struct IRenderMesh; - -#include -#include #include #include -#ifdef MAX_SUB_MATERIALS -// This checks that the values are in sync in the different files. -static_assert(MAX_SUB_MATERIALS == 128); -#else -#define MAX_SUB_MATERIALS 128 -#endif - -// Special names for materials. -#define MTL_SPECIAL_NAME_COLLISION_PROXY "collision_proxy" -#define MTL_SPECIAL_NAME_COLLISION_PROXY_VEHICLE "nomaterial_vehicle" -#define MTL_SPECIAL_NAME_RAYCAST_PROXY "raycast_proxy" +struct IShader; +struct ISurfaceType; +struct SShaderItem; namespace AZ { @@ -59,380 +35,15 @@ namespace AZ using MaterialNotificationEventBus = AZ::EBus; } -enum -{ - MAX_STREAM_PREDICTION_ZONES = 2 -}; - -////////////////////////////////////////////////////////////////////////// -// Description: -// IMaterial is an interface to the material object, SShaderItem host which is a combination of IShader and SShaderInputResources. -// Material bind together rendering algorithm (Shader) and resources needed to render this shader, textures, colors, etc... -// All materials except for pure sub material childs have a unique name which directly represent .mtl file on disk. -// Ex: "Materials/Fire/Burn" -// Materials can be created by Sandbox MaterialEditor. -////////////////////////////////////////////////////////////////////////// -enum EMaterialFlags -{ - MTL_FLAG_WIRE = 0x0001, // Use wire frame rendering for this material. - MTL_FLAG_2SIDED = 0x0002, // Use 2 Sided rendering for this material. - MTL_FLAG_ADDITIVE = 0x0004, // Use Additive blending for this material. - //MTL_FLAG_DETAIL_DECAL = 0x0008, // UNUSED RESERVED FOR LEGACY REASONS - MTL_FLAG_LIGHTING = 0x0010, // Should lighting be applied on this material. - MTL_FLAG_NOSHADOW = 0x0020, // Material do not cast shadows. - MTL_FLAG_ALWAYS_USED = 0x0040, // When set forces material to be export even if not explicitly used. - MTL_FLAG_PURE_CHILD = 0x0080, // Not shared sub material, sub material unique to his parent multi material. - MTL_FLAG_MULTI_SUBMTL = 0x0100, // This material is a multi sub material. - MTL_FLAG_NOPHYSICALIZE = 0x0200, // Should not physicalize this material. - MTL_FLAG_NODRAW = 0x0400, // Do not render this material. - MTL_FLAG_NOPREVIEW = 0x0800, // Cannot preview the material. - MTL_FLAG_NOTINSTANCED = 0x1000, // Do not instantiate this material. - MTL_FLAG_COLLISION_PROXY = 0x2000, // This material is the collision proxy. - MTL_FLAG_SCATTER = 0x4000, // Use scattering for this material - MTL_FLAG_REQUIRE_FORWARD_RENDERING = 0x8000, // This material has to be rendered in forward rendering passes (alpha/additive blended) - MTL_FLAG_NON_REMOVABLE = 0x10000, // Material with this flag once created are never removed from material manager (Used for decal materials, this flag should not be saved). - MTL_FLAG_HIDEONBREAK = 0x20000, // Non-physicalized subsets with such materials will be removed after the object breaks - MTL_FLAG_UIMATERIAL = 0x40000, // Used for UI in Editor. Don't need show it DB. - MTL_64BIT_SHADERGENMASK = 0x80000, // ShaderGen mask is remapped - MTL_FLAG_RAYCAST_PROXY = 0x100000, - MTL_FLAG_REQUIRE_NEAREST_CUBEMAP = 0x200000, // materials with alpha blending requires special processing for shadows - MTL_FLAG_CONSOLE_MAT = 0x400000, - MTL_FLAG_DELETE_PENDING = 0x800000, // Internal use only - MTL_FLAG_BLEND_TERRAIN = 0x1000000, - MTL_FLAG_IS_TERRAIN = 0x2000000,// indication to the loader - Terrain type - MTL_FLAG_IS_SKY = 0x4000000,// indication to the loader - Sky type - MTL_FLAG_FOG_VOLUME_SHADING_QUALITY_HIGH= 0x8000000 // high vertex shading quality behaves more accurately with fog volumes. -}; - -#define MTL_FLAGS_SAVE_MASK (MTL_FLAG_WIRE | MTL_FLAG_2SIDED | MTL_FLAG_ADDITIVE | MTL_FLAG_LIGHTING | \ - MTL_FLAG_NOSHADOW | MTL_FLAG_MULTI_SUBMTL | MTL_FLAG_SCATTER | MTL_FLAG_REQUIRE_FORWARD_RENDERING | MTL_FLAG_FOG_VOLUME_SHADING_QUALITY_HIGH | MTL_FLAG_HIDEONBREAK | MTL_FLAG_UIMATERIAL | MTL_64BIT_SHADERGENMASK | MTL_FLAG_REQUIRE_NEAREST_CUBEMAP | MTL_FLAG_CONSOLE_MAT | MTL_FLAG_BLEND_TERRAIN) - -// Post effects flags -enum EPostEffectFlags -{ - POST_EFFECT_GHOST = 0x1, - POST_EFFECT_HOLOGRAM = 0x2, - - POST_EFFECT_MASK = POST_EFFECT_GHOST | POST_EFFECT_HOLOGRAM -}; - -// Bit offsets for shader layer flags -enum EMaterialLayerFlags -{ - // Active layers flags - MTL_LAYER_FROZEN = 0x0001, - MTL_LAYER_WET = 0x0002, - MTL_LAYER_DYNAMICFROZEN = 0x0008, - - // Usage flags - MTL_LAYER_USAGE_NODRAW = 0x0001, // Layer is disabled - MTL_LAYER_USAGE_REPLACEBASE = 0x0002, // Replace base pass rendering with layer - optimization - MTL_LAYER_USAGE_FADEOUT = 0x0004, // Layer doesn't render but still causes parent to fade out - - // Blend offsets - MTL_LAYER_BLEND_FROZEN = 0xff000000, - MTL_LAYER_BLEND_WET = 0x00fe0000, - MTL_LAYER_BLEND_DYNAMICFROZEN = 0x000000ff, - - MTL_LAYER_FROZEN_MASK = 0xff, - MTL_LAYER_WET_MASK = 0xfe, // bit stolen - MTL_LAYER_DYNAMICFROZEN_MASK = 0xff, - - MTL_LAYER_BLEND_MASK = (MTL_LAYER_BLEND_FROZEN | MTL_LAYER_BLEND_WET | MTL_LAYER_BLEND_DYNAMICFROZEN), - - // Slot count - MTL_LAYER_MAX_SLOTS = 3 -}; - -// copy flags -enum EMaterialCopyFlags -{ - // copy flags - MTL_COPY_DEFAULT = 0, - MTL_COPY_NAME = BIT(0), - MTL_COPY_TEXTURES = BIT(1), -}; - struct IMaterial { // TODO: Remove it! - //! default texture mapping - uint8 m_ucDefautMappingAxis; - float m_fDefautMappingScale; - // virtual ~IMaterial() {} - - ////////////////////////////////////////////////////////////////////////// - // Reference counting. - ////////////////////////////////////////////////////////////////////////// virtual void AddRef() = 0; virtual void Release() = 0; - virtual int GetNumRefs() = 0; - virtual IMaterialManager* GetMaterialManager() = 0; - - ////////////////////////////////////////////////////////////////////////// - // material name - ////////////////////////////////////////////////////////////////////////// - //! Set material name, (Do not use this directly - virtual void SetName(const char* pName) = 0; - //! Returns material name. - virtual const char* GetName() const = 0; - - //! Set/get shader name. The shader name may include technique name so it could be deferent than GetShaderItem()->m_pShader->GetName(). - virtual void SetShaderName(const char* pName) = 0; - virtual const char* GetShaderName() const = 0; - - //! Material flags. - //! @see EMaterialFlags - virtual void SetFlags(int flags) = 0; - virtual int GetFlags() const = 0; - virtual void UpdateFlags() = 0; - - // Returns true if this is the default material. - virtual bool IsDefault() = 0; - - virtual int GetSurfaceTypeId() = 0; - - // Assign a different surface type to this material. - virtual void SetSurfaceType(const char* sSurfaceTypeName) = 0; - - virtual ISurfaceType* GetSurfaceType() = 0; - - // shader item virtual SShaderItem& GetShaderItem() = 0; virtual const SShaderItem& GetShaderItem() const = 0; - // Returns shader item for correct sub material or for single material. - // Even if this is not sub material or nSubMtlSlot is invalid it will return valid renderable shader item. - virtual SShaderItem& GetShaderItem(int nSubMtlSlot) = 0; - virtual const SShaderItem& GetShaderItem(int nSubMtlSlot) const = 0; - - // Returns true if streamed in - virtual bool IsStreamedIn(const int nMinPrecacheRoundIds[MAX_STREAM_PREDICTION_ZONES], IRenderMesh* pRenderMesh) const = 0; - - // Description: - // Fill an array of integeres representing surface ids of the sub materials or the material itself. - // Arguments: - // pSurfaceIdsTable is a pointer to the array of int with size enough to hold MAX_SUB_MATERIALS surface type ids. - // Return: - // number of filled items. - virtual int FillSurfaceTypeIds(int pSurfaceIdsTable[]) = 0; - - ////////////////////////////////////////////////////////////////////////// - // UserData used to link with the Editor. - ////////////////////////////////////////////////////////////////////////// - virtual void SetUserData(void* pUserData) = 0; - virtual void* GetUserData() const = 0; - - ////////////////////////////////////////////////////////////////////////// - //! Set or get a material parameter value. - //! \param sParamName - Name of the parameter - //! \param v - Input or output value depending on bGet - //! \param bGet - If true, v is an output; if false, v is an input - //! \param allowShaderParam - If true, and sParamName is not a built-in parameter of the Material, then custom shader parameters will be searched as well. Defaults to false to preserve legacy behavior. - //! \param materialIndex - Index of the sub-material if this is a material group - //! return - True if sParamName was found - virtual bool SetGetMaterialParamFloat(const char* sParamName, float& v, bool bGet, bool allowShaderParam = false, int materialIndex = 0) = 0; - //! Set or get a material parameter value. - //! \param sParamName - Name of the parameter - //! \param v - Input or output value depending on bGet - //! \param bGet - If true, v is an output; if false, v is an input - //! \param allowShaderParam - If true, and sParamName is not a built-in parameter of the Material, then custom shader parameters will be searched as well. Defaults to false to preserve legacy behavior. - //! \param materialIndex - Index of the sub-material if this is a material group - //! return - True if sParamName was found - virtual bool SetGetMaterialParamVec3(const char* sParamName, Vec3& v, bool bGet, bool allowShaderParam = false, int materialIndex = 0) = 0; - //! Set or get a material parameter value. - //! \param sParamName - Name of the parameter - //! \param v - Input or output value depending on bGet - //! \param bGet - If true, v is an output; if false, v is an input - //! \param allowShaderParam - If true, and sParamName is not a built-in parameter of the Material, then custom shader parameters will be searched as well. Defaults to false to preserve legacy behavior. - //! \param materialIndex - Index of the sub-material if this is a material group - //! return - True if sParamName was found - virtual bool SetGetMaterialParamVec4(const char* sParamName, Vec4& v, bool bGet, bool allowShaderParam = false, int materialIndex = 0) = 0; - - virtual void SetDirty(bool dirty = true) = 0; - virtual bool IsDirty() const = 0; - - //! Returns true if the material is the parent of a group of materials - virtual bool IsMaterialGroup() const = 0; - - //! Returns true if the material is a single material belongs to a material group - virtual bool IsSubMaterial() const = 0; - - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - - virtual size_t GetResourceMemoryUsage(ICrySizer* pSizer) = 0; - - ////////////////////////////////////////////////////////////////////////// - // Makes this specific material enter sketch mode. - // Current supported sketch modes: - // - 0, no sketch. - // - 1, normal sketch mode. - // - 2, fast sketch mode. - virtual void SetSketchMode(int mode) = 0; - - // Sets FT_DONT_STREAM flag for all textures used by the material - // If a stream is already in process, this will stop the stream and flush the device texture - virtual void DisableTextureStreaming() = 0; - ////////////////////////////////////////////////////////////////////////// - // Tells to texture streamer to start loading textures asynchronously - ////////////////////////////////////////////////////////////////////////// - virtual void RequestTexturesLoading(const float fMipFactor) = 0; - - virtual void PrecacheMaterial(const float fEntDistance, struct IRenderMesh* pRenderMesh, bool bFullUpdate, bool bDrawNear = false) = 0; - - // Estimates texture memory usage for this material - // When nMatID is not negative only caluclate for one sub-material - virtual int GetTextureMemoryUsage(ICrySizer* pSizer, int nMatID = -1) = 0; - - // Set & retrieve a material link name - // This value by itself is not used by the material system per-se and hence - // has no real effect, however it is used on a higher level to tie related materials - // together, for example by procedural breakable glass to determine which material to - // switch to. - virtual void SetMaterialLinkName(const char* name) = 0; - virtual const char* GetMaterialLinkName() const = 0; - virtual void SetKeepLowResSysCopyForDiffTex() = 0; - - virtual uint32 GetDccMaterialHash() const = 0; - virtual void SetDccMaterialHash(uint32 hash) = 0; - - virtual void UpdateShaderItems() = 0; - - // -}; - - - -////////////////////////////////////////////////////////////////////////// -// Description: -// IMaterialManagerListener is a callback interface to listenen -// for special events of material manager, (used by Editor). -struct IMaterialManagerListener -{ - // - virtual ~IMaterialManagerListener(){} - // Called when material manager tries to load a material. - // nLoadingFlags - Zero or a bitwise combination of the flagas defined in ELoadingFlags. - virtual void OnCreateMaterial(_smart_ptr pMaterial) = 0; - virtual void OnDeleteMaterial(_smart_ptr pMaterial) = 0; - virtual bool IsCurrentMaterial(_smart_ptr pMaterial) const = 0; - // -}; - -using IMaterialRef = _smart_ptr; -////////////////////////////////////////////////////////////////////////// -// Description: -// IMaterialManager interface provide access to the material manager -// implemented in 3d engine. -struct IMaterialManager -{ - //! Loading flags - enum ELoadingFlags - { - ELoadingFlagsPreviewMode = BIT(0), - }; - - // - virtual ~IMaterialManager(){} - - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - - // Summary: - // Creates a new material object and register it with the material manager - // Return Value: - // A newly created object derived from IMaterial. - virtual _smart_ptr CreateMaterial(const char* sMtlName, int nMtlFlags = 0) = 0; - - // Summary: - // Renames a material object - // Note: - // Do not use IMaterial::SetName directly. - // Arguments: - // pMtl - Pointer to a material object - // sNewName - New name to assign to the material - virtual void RenameMaterial(_smart_ptr pMtl, const char* sNewName) = 0; - - // Description: - // Finds named material. - virtual _smart_ptr FindMaterial(const char* sMtlName) const = 0; - - // Description: - // Loads material. - // nLoadingFlags - Zero or a bitwise combination of the values defined in ELoadingFlags. - virtual _smart_ptr LoadMaterial(const char* sMtlName, bool bMakeIfNotFound = true, bool bNonremovable = false, unsigned long nLoadingFlags = 0) = 0; - - // Description: - // Loads material from xml. - virtual _smart_ptr LoadMaterialFromXml(const char* sMtlName, XmlNodeRef mtlNode) = 0; - - // Description: - // Reloads the material from disk. - virtual void ReloadMaterial(_smart_ptr pMtl) = 0; - - // Description: - // Saves material. - virtual bool SaveMaterial(XmlNodeRef mtlNode, _smart_ptr pMtl) = 0; - - // Description: - // Clone single material or multi sub material. - // Arguments: - // nSubMtl - when negative all sub materials of MultiSubMtl are cloned, if positive only specified slot is cloned. - virtual _smart_ptr CloneMaterial(_smart_ptr pMtl, int nSubMtl = -1) = 0; - - // Description: - // Copy single material. - virtual void CopyMaterial(_smart_ptr pMtlSrc, _smart_ptr pMtlDest, EMaterialCopyFlags flags) = 0; - - // Description: - // Clone MultiSubMtl material. - // Arguments: - // sSubMtlName - name of the sub-material to clone, if NULL all submaterial are cloned. - virtual _smart_ptr CloneMultiMaterial(_smart_ptr pMtl, const char* sSubMtlName = 0) = 0; - - // Description: - // Associate a special listener callback with material manager inside 3d engine. - // This listener callback is used primerly by the editor. - virtual void SetListener(IMaterialManagerListener* pListener) = 0; - - // Description: - // Retrieve a default engine material. - virtual _smart_ptr GetDefaultMaterial() = 0; - - // Description: - // Retrieve a default engine material for terrain layer - virtual _smart_ptr GetDefaultTerrainLayerMaterial() = 0; - - // Description: - // Retrieve a default engine material with material layers presets. - virtual _smart_ptr GetDefaultLayersMaterial() = 0; - - // Description: - // Retrieve a default engine material for drawing helpers. - virtual _smart_ptr GetDefaultHelperMaterial() = 0; - - // Description: - // Retrieve surface type by name. - virtual ISurfaceType* GetSurfaceTypeByName(const char* sSurfaceTypeName, const char* sWhy = NULL) = 0; - virtual int GetSurfaceTypeIdByName(const char* sSurfaceTypeName, const char* sWhy = NULL) = 0; - // Description: - // Retrieve surface type by unique surface type id. - virtual ISurfaceType* GetSurfaceType(int nSurfaceTypeId, const char* sWhy = NULL) = 0; - // Description: - // Retrieve interface to surface type manager. - virtual ISurfaceTypeManager* GetSurfaceTypeManager() = 0; - - // Get IMaterial pointer from the CGF material structure. - // nLoadingFlags - Zero, or a bitwise combination of the enum items from ELoadingFlags. - virtual _smart_ptr LoadCGFMaterial(CMaterialCGF* pMaterialCGF, const char* sCgfFilename, unsigned long nLoadingFlags = 0) = 0; - - // for statistics - call once to get the count (pData==0), again to get the data(pData!=0) - virtual void GetLoadedMaterials(AZStd::vector<_smart_ptr>* pData, uint32& nObjCount) const = 0; - - // Updates material data in the renderer - virtual void RefreshMaterialRuntime() = 0; - - // }; diff --git a/Code/Legacy/CryCommon/IMovieSystem.h b/Code/Legacy/CryCommon/IMovieSystem.h index 5d878c45ec..b5302b58f5 100644 --- a/Code/Legacy/CryCommon/IMovieSystem.h +++ b/Code/Legacy/CryCommon/IMovieSystem.h @@ -21,7 +21,6 @@ #include #include #include -#include // forward declaration. struct IAnimTrack; diff --git a/Code/Legacy/CryCommon/IPathfinder.h b/Code/Legacy/CryCommon/IPathfinder.h index 781e379cf9..7a05321c99 100644 --- a/Code/Legacy/CryCommon/IPathfinder.h +++ b/Code/Legacy/CryCommon/IPathfinder.h @@ -15,11 +15,12 @@ struct IAIPathAgent; #include #include -#include #include #include +#include #include +#include #include #include @@ -131,8 +132,7 @@ struct NavigationBlocker Location location; }; -typedef DynArray NavigationBlockers; - +using NavigationBlockers = AZStd::vector; //==================================================================== // PathPointDescriptor @@ -240,8 +240,7 @@ struct PathfindingExtraConstraint UConstraint constraint; }; -typedef DynArray PathfindingExtraConstraints; - +using PathfindingExtraConstraints = AZStd::vector; struct PathfindRequest { @@ -557,26 +556,6 @@ public: virtual void Draw(const Vec3& drawOffset = ZERO) const = 0; virtual void Dump(const char* name) const = 0; - bool ArePathsEqual(const INavPath& otherNavPath) - { - const TPathPoints& path1 = this->GetPath(); - const TPathPoints& path2 = otherNavPath.GetPath(); - const TPathPoints::size_type path1Size = path1.size(); - const TPathPoints::size_type path2Size = path2.size(); - if (path1Size != path2Size) - { - return false; - } - - TPathPoints::const_iterator path1It = path1.begin(); - TPathPoints::const_iterator path1End = path1.end(); - TPathPoints::const_iterator path2It = path2.begin(); - - typedef std::pair TMismatchResult; - - TMismatchResult result = std::mismatch(path1It, path1End, path2It, PathPointDescriptor::ArePointsEquivalent); - return result.first == path1.end(); - } }; using INavPathPtr = AZStd::shared_ptr; diff --git a/Code/Legacy/CryCommon/IPhysics.h b/Code/Legacy/CryCommon/IPhysics.h deleted file mode 100644 index a1825d3e44..0000000000 --- a/Code/Legacy/CryCommon/IPhysics.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#pragma once -#include -#include "Cry_Math.h" -#include "primitives.h" -#include // <> required for Interfuscator - -////////////////////////////////////////////////////////////////////////// -// IDs that can be used for foreign id. -////////////////////////////////////////////////////////////////////////// -enum EPhysicsForeignIds -{ - PHYS_FOREIGN_ID_TERRAIN = 0, - PHYS_FOREIGN_ID_STATIC = 1, - PHYS_FOREIGN_ID_ENTITY = 2, - PHYS_FOREIGN_ID_FOLIAGE = 3, - PHYS_FOREIGN_ID_ROPE = 4, - PHYS_FOREIGN_ID_SOUND_OBSTRUCTION = 5, - PHYS_FOREIGN_ID_SOUND_PROXY_OBSTRUCTION = 6, - PHYS_FOREIGN_ID_SOUND_REVERB_OBSTRUCTION = 7, - PHYS_FOREIGN_ID_WATERVOLUME = 8, - PHYS_FOREIGN_ID_BREAKABLE_GLASS = 9, - PHYS_FOREIGN_ID_BREAKABLE_GLASS_FRAGMENT = 10, - PHYS_FOREIGN_ID_RIGID_PARTICLE = 11, - PHYS_FOREIGN_ID_RESERVED1 = 12, - PHYS_FOREIGN_ID_RAGDOLL = 13, - PHYS_FOREIGN_ID_COMPONENT_ENTITY = 14, - - PHYS_FOREIGN_ID_USER = 100, // All user defined foreign ids should start from this enum. -}; diff --git a/Code/Legacy/CryCommon/IPostEffectGroup.h b/Code/Legacy/CryCommon/IPostEffectGroup.h deleted file mode 100644 index d8452b75ab..0000000000 --- a/Code/Legacy/CryCommon/IPostEffectGroup.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -#pragma once - -#include - -typedef AZStd::variant PostEffectGroupParam; - -// A prioritized group of postprocessing effect parameters. -// These are defined in XML files and can be enabled or disabled using flow graph or Lua scripts. -// Effect groups can also optionally specify blend curves to smoothly transition between effects, whether to stay enabled until explicitly disabled, -// and whether to make effect strength based on distance from the camera. -class IPostEffectGroup -{ -public: - virtual ~IPostEffectGroup(){} - - virtual const char* GetName() const = 0; - virtual void SetEnable(bool enable) = 0; - virtual bool GetEnable() const = 0; - virtual unsigned int GetPriority() const = 0; - virtual bool GetHold() const = 0; - virtual float GetFadeDistance() const = 0; - virtual void SetParam(const char* name, const PostEffectGroupParam& value) = 0; - virtual PostEffectGroupParam* GetParam(const char* name) = 0; - virtual void ClearParams() = 0; - // Increases the strength of the effects based on distance from the camera each time it's called. The effect strength is cleared each frame. - // Only applies to effect groups with the fadeDistance attribute set. - virtual void ApplyAtPosition(const Vec3& position) = 0; -}; - -typedef AZStd::list PostEffectGroupList; - -class IPostEffectGroupManager -{ -public: - virtual ~IPostEffectGroupManager(){} - - virtual IPostEffectGroup* GetGroup(const char* name) = 0; - virtual IPostEffectGroup* GetGroup(const unsigned int index) = 0; - virtual const unsigned int GetGroupCount() = 0; - // Returns a list of IPostEffectGroups who had their Enabled state toggled this frame - virtual const PostEffectGroupList& GetGroupsToggledThisFrame() = 0; -}; diff --git a/Code/Legacy/CryCommon/IRenderMesh.h b/Code/Legacy/CryCommon/IRenderMesh.h deleted file mode 100644 index 0e225579ad..0000000000 --- a/Code/Legacy/CryCommon/IRenderMesh.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_IRENDERMESH_H -#define CRYINCLUDE_CRYCOMMON_IRENDERMESH_H -#pragma once - -#include "VertexFormats.h" -#include -#include // PublicRenderPrimitiveType -#include -#include -#include - -class CMesh; -class CRenderObject; -struct SSkinningData; -struct IMaterial; -struct IIndexedMesh; -struct SMRendTexVert; -struct UCol; -struct GeomInfo; - -struct TFace; -struct SMeshSubset; -struct SRenderingPassInfo; -struct SRendItemSorter; -struct SRenderObjectModifier; - -namespace AZ -{ - namespace Vertex - { - class Format; - } -} - -enum eRenderPrimitiveType : int8; - -// Keep this in sync with BUFFER_USAGE hints DevBuffer.h -enum ERenderMeshType -{ - eRMT_Immmutable = 0, - eRMT_Static = 1, - eRMT_Dynamic = 2, - eRMT_Transient = 3, -}; - - -#define FSM_VERTEX_VELOCITY 1 -#define FSM_NO_TANGENTS 2 -#define FSM_CREATE_DEVICE_MESH 4 -#define FSM_SETMESH_ASYNC 8 -#define FSM_ENABLE_NORMALSTREAM 16 -#define FSM_IGNORE_TEXELDENSITY 32 - -// Invalidate video buffer flags -#define FMINV_STREAM 1 -#define FMINV_STREAM_MASK ((1 << VSF_NUM) - 1) -#define FMINV_INDICES 0x100 -#define FMINV_ALL -1 - -// Stream lock flags -#define FSL_READ 0x01 -#define FSL_WRITE 0x02 -#define FSL_DYNAMIC 0x04 -#define FSL_DISCARD 0x08 -#define FSL_VIDEO 0x10 -#define FSL_SYSTEM 0x20 -#define FSL_INSTANCED 0x40 -#define FSL_NONSTALL_MAP 0x80 // Map must not stall for VB/IB locking -#define FSL_VBIBPUSHDOWN 0x100 // Push down from vram on demand if target architecture supports it, used internally -#define FSL_DIRECT 0x200 // Access VRAM directly if target architecture supports it, used internally -#define FSL_LOCKED 0x400 // Internal use -#define FSL_SYSTEM_CREATE (FSL_WRITE | FSL_DISCARD | FSL_SYSTEM) -#define FSL_SYSTEM_UPDATE (FSL_WRITE | FSL_SYSTEM) -#define FSL_VIDEO_CREATE (FSL_WRITE | FSL_DISCARD | FSL_VIDEO) -#define FSL_VIDEO_UPDATE (FSL_WRITE | FSL_VIDEO) - -#define FSL_ASYNC_DEFER_COPY (1u << 1) -#define FSL_FREE_AFTER_ASYNC (2u << 1) - -struct IRenderMesh -{ - enum EMemoryUsageArgument - { - MEM_USAGE_COMBINED, - MEM_USAGE_ONLY_SYSTEM, - MEM_USAGE_ONLY_VIDEO, - MEM_USAGE_ONLY_STREAMS, - }; - - // Render mesh initialization parameters, that can be used to create RenderMesh from raw pointers. - struct SInitParamerers - { - AZ::Vertex::Format vertexFormat; - ERenderMeshType eType; - - void* pVertBuffer; - int nVertexCount; - SPipTangents* pTangents; - SPipNormal* pNormals; - vtx_idx* pIndices; - int nIndexCount; - PublicRenderPrimitiveType nPrimetiveType; - int nRenderChunkCount; - int nClientTextureBindID; - bool bOnlyVideoBuffer; - bool bPrecache; - bool bLockForThreadAccess; - - SInitParamerers() - : vertexFormat(eVF_P3F_C4B_T2F) - , eType(eRMT_Static) - , pVertBuffer(0) - , nVertexCount(0) - , pTangents(0) - , pNormals(0) - , pIndices(0) - , nIndexCount(0) - , nPrimetiveType(PublicRenderPrimitiveType::prtTriangleList) - , nRenderChunkCount(0) - , nClientTextureBindID(0) - , bOnlyVideoBuffer(false) - , bPrecache(true) - , bLockForThreadAccess(false) {} - }; - - struct ThreadAccessLock - { - ThreadAccessLock(IRenderMesh* pRM) - : m_pRM(pRM) - { - m_pRM->LockForThreadAccess(); - } - - ~ThreadAccessLock() - { - m_pRM->UnLockForThreadAccess(); - } - - private: - ThreadAccessLock(const ThreadAccessLock&); - ThreadAccessLock& operator = (const ThreadAccessLock&); - - private: - IRenderMesh* m_pRM; - }; - - // - virtual ~IRenderMesh(){} - - ////////////////////////////////////////////////////////////////////////// - // Reference Counting. - virtual void AddRef() = 0; - virtual int Release() = 0; - ////////////////////////////////////////////////////////////////////////// - - // Prevent rendering if video memory could not been allocated for it - virtual bool CanRender() = 0; - - // Returns type name given to the render mesh on creation time. - virtual const char* GetTypeName() = 0; - // Returns the name of the source given to the render mesh on creation time. - virtual const char* GetSourceName() const = 0; - - virtual int GetIndicesCount() = 0; - virtual int GetVerticesCount() = 0; - virtual AZ::Vertex::Format GetVertexFormat() = 0; - virtual ERenderMeshType GetMeshType() = 0; - virtual float GetGeometricMeanFaceArea() const = 0; - - virtual bool CheckUpdate(uint32 nStreamMask) = 0; - virtual int GetStreamStride(int nStream) const = 0; - - virtual int GetNumVerts() const = 0; - virtual int GetNumInds() const = 0; - virtual const eRenderPrimitiveType GetPrimitiveType() const = 0; - - virtual void SetSkinned(bool bSkinned = true) = 0; - virtual uint GetSkinningWeightCount() const = 0; - - // Create render buffers from render mesh. Returns the final size of the render mesh or ~0U on failure - virtual size_t SetMesh(CMesh& mesh, int nSecColorsSetOffset, uint32 flags, bool requiresLock) = 0; - virtual void CopyTo(IRenderMesh* pDst, int nAppendVtx = 0, bool bDynamic = false, bool fullCopy = true) = 0; - virtual void SetSkinningDataVegetation(struct SMeshBoneMapping_uint8* pBoneMapping) = 0; - virtual void SetSkinningDataCharacter(CMesh& mesh, struct SMeshBoneMapping_uint16* pBoneMapping, struct SMeshBoneMapping_uint16* pExtraBoneMapping) = 0; - // Creates an indexed mesh from this render mesh (accepts an optional pointer to an IIndexedMesh object that should be used) - virtual IIndexedMesh* GetIndexedMesh(IIndexedMesh* pIdxMesh = 0) = 0; - virtual int GetRenderChunksCount(_smart_ptr pMat, int& nRenderTrisCount) = 0; - - virtual IRenderMesh* GenerateMorphWeights() = 0; - virtual IRenderMesh* GetMorphBuddy() = 0; - virtual void SetMorphBuddy(IRenderMesh* pMorph) = 0; - - virtual bool UpdateVertices(const void* pVertBuffer, int nVertCount, int nOffset, int nStream, uint32 copyFlags, bool requiresLock = true) = 0; - virtual bool UpdateIndices(const vtx_idx* pNewInds, int nInds, int nOffsInd, uint32 copyFlags, bool requiresLock = true) = 0; - virtual void SetCustomTexID(int nCustomTID) = 0; - - virtual void GenerateQTangents() = 0; - virtual void CreateChunksSkinned() = 0; - virtual void NextDrawSkinned() = 0; - virtual IRenderMesh* GetVertexContainer() = 0; - virtual void SetVertexContainer(IRenderMesh* pBuf) = 0; - virtual void SetBBox(const Vec3& vBoxMin, const Vec3& vBoxMax) = 0; - virtual void GetBBox(Vec3& vBoxMin, Vec3& vBoxMax) = 0; - virtual void UpdateBBoxFromMesh() = 0; - virtual uint32* GetPhysVertexMap() = 0; - virtual bool IsEmpty() = 0; - - virtual int8* GetPosPtrNoCache(int32& nStride, uint32 nFlags) = 0; - virtual int8* GetPosPtr(int32& nStride, uint32 nFlags) = 0; - virtual int8* GetColorPtr(int32& nStride, uint32 nFlags) = 0; - virtual int8* GetNormPtr(int32& nStride, uint32 nFlags) = 0; - //! Returns a pointer to the first uv coordinate in the interleaved vertex stream - virtual int8* GetUVPtrNoCache(int32& nStride, uint32 nFlags, uint32 uvSetIndex = 0) = 0; - /*! Get a pointer to the mesh's uv coordinates and the stride from the beginning of one uv coordinate to the next - \param[out] nStride The stride in between successive uv coordinates. - \param nFlags Stream lock flags (FSL_READ, FSL_WRITE, etc) - \param uvSetIndex Which uv set to retrieve (defaults to 0) - \return A pointer to cached uvs which contains all of the uv coordinates contiguous in memory, or as a fallback a pointer to the first uv coordinate in the interleaved vertex stream - Either way, nStride is set such that the caller can use it to iterate over the data in the same way regardless of which pointer was returned - Returns nullptr if there is no uv coordinate stream at the given index - */ - virtual int8* GetUVPtr(int32& nStride, uint32 nFlags, uint32 uvSetIndex = 0) = 0; - - virtual int8* GetTangentPtr(int32& nStride, uint32 nFlags) = 0; - virtual int8* GetQTangentPtr(int32& nStride, uint32 nFlags) = 0; - - virtual int8* GetHWSkinPtr(int32& nStride, uint32 nFlags, bool remapped = false) = 0; - virtual int8* GetVelocityPtr(int32& nStride, uint32 nFlags) = 0; - - virtual void UnlockStream(int nStream) = 0; - virtual void UnlockIndexStream() = 0; - - virtual vtx_idx* GetIndexPtr(uint32 nFlags, int32 nOffset = 0) = 0; - virtual const PodArray >* GetTrisForPosition(const Vec3& vPos, _smart_ptr pMaterial) = 0; - - virtual float GetExtent(EGeomForm eForm) = 0; - virtual void GetRandomPos(PosNorm& ran, EGeomForm eForm, SSkinningData const* pSkinning = NULL) = 0; - - virtual void Render(const struct SRendParams& rParams, CRenderObject* pObj, _smart_ptr pMaterial, const SRenderingPassInfo& passInfo, bool bSkinned = false) = 0; - virtual void Render(CRenderObject* pObj, const SRenderingPassInfo& passInfo, const SRendItemSorter& rendItemSorter) = 0; - virtual void SetREUserData(float* pfCustomData, float fFogScale = 0, float fAlpha = 1) = 0; - - // Debug draw this render mesh. - virtual void DebugDraw(const struct SGeometryDebugDrawInfo& info, uint32 nVisibleChunksMask = ~0, float fExtrdueScale = 0.01f) = 0; - - // Returns mesh memory usage and add it to the CrySizer (if not NULL). - // Arguments: - // pSizer - Sizer interface, can be NULL if caller only want to calculate size - // nType - see EMemoryUsageArgument - virtual size_t GetMemoryUsage(ICrySizer* pSizer, EMemoryUsageArgument nType) const = 0; - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - - // Get allocated only in video memory or only in system memory. - virtual int GetAllocatedBytes(bool bVideoMem) const = 0; - virtual float GetAverageTrisNumPerChunk(_smart_ptr pMat) = 0; - virtual int GetTextureMemoryUsage(const _smart_ptr pMaterial, ICrySizer* pSizer = NULL, bool bStreamedIn = true) const = 0; - virtual void KeepSysMesh(bool keep) = 0; // HACK: temp workaround for GDC-888 - virtual void UnKeepSysMesh() = 0; - virtual void SetMeshLod(int nLod) = 0; - - virtual void LockForThreadAccess() = 0; - virtual void UnLockForThreadAccess() = 0; - - // Sets the async update state - will sync before rendering to this - virtual volatile int* SetAsyncUpdateState(void) = 0; - virtual void CreateRemappedBoneIndicesPair(const DynArray& arrRemapTable, const uint pairGuid) = 0; - virtual void ReleaseRemappedBoneIndicesPair(const uint pairGuid) = 0; - - virtual void OffsetPosition(const Vec3& delta) = 0; - // -}; - -#endif // CRYINCLUDE_CRYCOMMON_IRENDERMESH_H diff --git a/Code/Legacy/CryCommon/ISerialize.h b/Code/Legacy/CryCommon/ISerialize.h index b153a52487..82ba9aef0d 100644 --- a/Code/Legacy/CryCommon/ISerialize.h +++ b/Code/Legacy/CryCommon/ISerialize.h @@ -17,7 +17,6 @@ #include #include #include "MiniQueue.h" -#include #include #include #include @@ -105,8 +104,6 @@ struct SNetObjectID } void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const { /*nothing*/} - - AUTO_STRUCT_INFO }; // this enumeration details what "kind" of serialization we are @@ -154,8 +151,6 @@ private: ////////////////////////////////////////////////////////////////////////// struct SSerializeString { - AUTO_STRUCT_INFO - SSerializeString() {}; SSerializeString(const SSerializeString& src) { m_str.assign(src.c_str()); }; explicit SSerializeString(const char* sbegin, const char* send) @@ -571,8 +566,6 @@ public: CONTAINER_VALUE(std::list, push_back); CONTAINER_VALUE(std::set, insert); CONTAINER_VALUE(std::deque, push_back); - CONTAINER_VALUE(VectorSet, insert); - CONTAINER_VALUE(DynArray, insert); PAIR_CONTAINER_VALUE(std::list, push_back); PAIR_CONTAINER_VALUE(std::vector, push_back); diff --git a/Code/Legacy/CryCommon/IShader.h b/Code/Legacy/CryCommon/IShader.h index 93f8534dfc..e9a00d3b76 100644 --- a/Code/Legacy/CryCommon/IShader.h +++ b/Code/Legacy/CryCommon/IShader.h @@ -6,161 +6,35 @@ * */ - // Description : Shaders common interface. - #pragma once - #if defined(LINUX) || defined(APPLE) #include #endif #include "smartptr.h" - #include "Cry_Vector3.h" - #include "Cry_Color.h" -#include "smartptr.h" - #include "VertexFormats.h" #include - - -#include -#include - -struct IMaterial; -class CRendElementBase; -class CRenderObject; -class CREMesh; -struct IRenderMesh; -struct IShader; -struct IVisArea; - -class CRendElement; -class CRendElementBase; -class CTexture; -class CTexAnim; -class CShader; -class ITexAnim; -struct SShaderPass; -struct SShaderItem; -class ITexture; -struct IMaterial; -struct SParam; -struct SShaderSerializeContext; -struct IAnimNode; -struct SSkinningData; -struct SSTexSamplerFX; -struct SShaderTextureSlot; -struct IRenderElement; - -namespace AZ -{ - class LegacyJobExecutor; - - namespace Vertex - { - class Format; - } -} - -//================================================================ -// Summary: -// Geometry Culling type. -enum ECull -{ - eCULL_Back = 0, // Back culling flag. - eCULL_Front, // Front culling flag. - eCULL_None // No culling flag. -}; - -enum ERenderResource -{ - eRR_Unknown, - eRR_Mesh, - eRR_Texture, - eRR_Shader, - eRR_ShaderResource, -}; - enum EEfResTextures : int // This needs a fixed size so the enum can be forward declared (needed by IMaterial.h) { EFTT_DIFFUSE = 0, EFTT_NORMALS, EFTT_SPECULAR, - EFTT_ENV, - EFTT_DETAIL_OVERLAY, - EFTT_SECOND_SMOOTHNESS, - EFTT_HEIGHT, - EFTT_DECAL_OVERLAY, - EFTT_SUBSURFACE, - EFTT_CUSTOM, - EFTT_CUSTOM_SECONDARY, EFTT_OPACITY, EFTT_SMOOTHNESS, EFTT_EMITTANCE, - EFTT_OCCLUSION, - EFTT_SPECULAR_2, - EFTT_MAX, EFTT_UNKNOWN = EFTT_MAX }; -enum EEfResSamplers -{ - EFSS_ANISO_HIGH = 0, - EFSS_ANISO_LOW, - EFSS_TRILINEAR, - EFSS_BILINEAR, - EFSS_TRILINEAR_CLAMP, - EFSS_BILINEAR_CLAMP, - EFSS_ANISO_HIGH_BORDER, - EFSS_TRILINEAR_BORDER, - - EFSS_MAX, -}; - -//========================================================================= - -// Summary: -// Array Pointers for Shaders. - -enum ESrcPointer -{ - eSrcPointer_Unknown, - eSrcPointer_Vert, - eSrcPointer_Color, - eSrcPointer_Tex, - eSrcPointer_TexLM, - eSrcPointer_Normal, - eSrcPointer_Tangent, - eSrcPointer_Max, -}; - -struct SWaveForm; -struct SWaveForm2; - -#define FRF_REFRACTIVE 1 -// FREE 2 -#define FRF_HEAT 4 -#define MAX_HEATSCALE 4 - #if !defined(MAX_JOINT_AMOUNT) #error MAX_JOINT_AMOUNT is not defined #endif -#if (MAX_JOINT_AMOUNT <= 256) -typedef uint8 JointIdType; -#else -typedef uint16 JointIdType; -#endif - -// The soft maximum cap for the sliders for emissive intensity. Also used to clamp legacy glow calculations in MaterialHelpers::MigrateXmlLegacyData. -// Note this is a "soft max" because the Emissive Intensity slider is capped at 200, but values higher than 200 may be entered in the text field. -#define EMISSIVE_INTENSITY_SOFT_MAX 200.0f //========================================================================= @@ -176,17 +50,10 @@ enum EParamType eType_STRING, eType_FCOLOR, eType_VECTOR, - eType_TEXTURE_HANDLE, - eType_CAMERA, - eType_FCOLORA, // with alpha channel }; -enum ESamplerType -{ - eSType_UNKNOWN, - eSType_Sampler, - eSType_SamplerComp, -}; +struct IShader; +class CCamera; union UParamVal { @@ -201,999 +68,20 @@ union UParamVal CCamera* m_pCamera; }; -// Note: -// In order to facilitate the memory allocation tracking, we're using here this class; -// if you don't like it, please write a substitute for all string within the project and use them everywhere. struct SShaderParam { AZStd::string m_Name; - AZStd::string m_Script; UParamVal m_Value; EParamType m_Type; - uint8 m_eSemantic; - uint8 m_Pad[3] = { 0 }; - - void Construct() - { - memset(&m_Value, 0, sizeof(m_Value)); - m_Type = eType_UNKNOWN; - m_eSemantic = 0; - m_Name.clear(); - m_Script.clear(); - } - - SShaderParam() - { - Construct(); - } - size_t Size() - { - size_t nSize = sizeof(*this); - if (m_Type == eType_STRING) - { - nSize += strlen (m_Value.m_String) + 1; - } - - return nSize; - } - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(m_Script); - if (m_Type == eType_STRING) - { - pSizer->AddObject(m_Value.m_String, strlen (m_Value.m_String) + 1); - } - } - - void Destroy() - { - if (m_Type == eType_STRING) - { - delete [] m_Value.m_String; - } - } - - ~SShaderParam() - { - Destroy(); - } - - SShaderParam (const SShaderParam& src) - { - m_Name = src.m_Name; - m_Script = src.m_Script; - m_Type = src.m_Type; - m_eSemantic = src.m_eSemantic; - if (m_Type == eType_STRING) - { - const size_t len = strlen(src.m_Value.m_String) + 1; - m_Value.m_String = new char[len]; - azstrcpy(m_Value.m_String, len, src.m_Value.m_String); - } - else - { - m_Value = src.m_Value; - } - } - - SShaderParam& operator = (const SShaderParam& src) - { - this->~SShaderParam(); - new(this)SShaderParam(src); - return *this; - } - - static bool SetParam(const char* name, AZStd::vector* Params, const UParamVal& pr) - { - uint32 i; - for (i = 0; i < (uint32)Params->size(); i++) - { - SShaderParam* sp = &(*Params)[i]; - if (!sp || &sp->m_Value == &pr) - { - continue; - } - if (azstricmp(sp->m_Name.c_str(), name) == 0) - { - if (sp->m_Type == eType_STRING) - { - delete[] sp->m_Value.m_String; - } - - - switch (sp->m_Type) - { - case eType_FLOAT: - sp->m_Value.m_Float = pr.m_Float; - break; - case eType_SHORT: - sp->m_Value.m_Short = pr.m_Short; - break; - case eType_INT: - case eType_TEXTURE_HANDLE: - sp->m_Value.m_Int = pr.m_Int; - break; - - case eType_VECTOR: - sp->m_Value.m_Vector[0] = pr.m_Vector[0]; - sp->m_Value.m_Vector[1] = pr.m_Vector[1]; - sp->m_Value.m_Vector[2] = pr.m_Vector[2]; - break; - - case eType_FCOLOR: - case eType_FCOLORA: - sp->m_Value.m_Color[0] = pr.m_Color[0]; - sp->m_Value.m_Color[1] = pr.m_Color[1]; - sp->m_Value.m_Color[2] = pr.m_Color[2]; - sp->m_Value.m_Color[3] = pr.m_Color[3]; - break; - - case eType_STRING: - { - char* str = pr.m_String; - const size_t len = strlen(str) + 1; - sp->m_Value.m_String = new char [len]; - azstrcpy(sp->m_Value.m_String, len, str); - } - break; - } - break; - } - } - if (i == Params->size()) - { - return false; - } - return true; - } - static bool GetValue(const char* szName, AZStd::vector* Params, float* v, int nID); - - static bool GetValue(uint8 eSemantic, AZStd::vector* Params, float* v, int nID); - - void CopyValue(const SShaderParam& src) - { - if (m_Type == eType_STRING && this != &src) - { - delete[] m_Value.m_String; - - if (src.m_Type == eType_STRING) - { - size_t size = strlen(src.m_Value.m_String) + 1; - m_Value.m_String = new char[size]; - azstrcpy(m_Value.m_String, size, src.m_Value.m_String); - return; - } - } - - m_Value = src.m_Value; - } - - void CopyValueNoString(const SShaderParam& src) - { - assert(m_Type != eType_STRING && src.m_Type != eType_STRING); - - m_Value = src.m_Value; - } - - void CopyType(const SShaderParam& src) - { - m_Type = src.m_Type; - } }; - -// Summary: -// Vertex modificators definitions (must be 16 bit flag). - -#define MDV_BENDING 0x100 -#define MDV_DET_BENDING 0x200 -#define MDV_DET_BENDING_GRASS 0x400 -#define MDV_WIND 0x800 -#define MDV_DEPTH_OFFSET 0x2000 - -// Does the vertex shader require position-invariant compilation? -// This would be true of shaders rendering multiple times with different vertex shaders - for example during zprepass and the gbuffer pass -// Note this is different than the technique flag FHF_POSITION_INVARIANT as that does custom behavior for terrain -#define MDV_POSITION_INVARIANT 0x4000 - - -//============================================================================== -// CRenderObject - -////////////////////////////////////////////////////////////////////// -// CRenderObject::m_ObjFlags: Flags used by shader pipeline - -enum ERenderObjectFlags -{ - FOB_VERTEX_VELOCITY = BIT(0), - FOB_RENDER_TRANS_AFTER_DOF = BIT(1), //transparencies rendered after depth of field - //Unused = BIT(2), - FOB_RENDER_AFTER_POSTPROCESSING = BIT(3), - FOB_OWNER_GEOMETRY = BIT(4), - FOB_MESH_SUBSET_INDICES = BIT(5), - FOB_SELECTED = BIT(6), - FOB_RENDERER_IDENDITY_OBJECT = BIT(7), - FOB_GLOBAL_ILLUMINATION = BIT(8), - FOB_NO_FOG = BIT(9), - FOB_DECAL = BIT(10), - FOB_OCTAGONAL = BIT(11), - FOB_POINT_SPRITE = BIT(13), - FOB_SOFT_PARTICLE = BIT(14), - FOB_REQUIRES_RESOLVE = BIT(15), - FOB_UPDATED_RTMASK = BIT(16), - FOB_AFTER_WATER = BIT(17), - FOB_BENDED = BIT(18), - FOB_ZPREPASS = BIT(19), - FOB_PARTICLE_SHADOWS = BIT(20), - FOB_DISSOLVE = BIT(21), - FOB_MOTION_BLUR = BIT(22), - FOB_NEAREST = BIT(23), // [Rendered in Camera Space] - FOB_SKINNED = BIT(24), - FOB_DISSOLVE_OUT = BIT(25), - FOB_DYNAMIC_OBJECT = BIT(26), - FOB_ALLOW_TESSELLATION = BIT(27), - FOB_DECAL_TEXGEN_2D = BIT(28), - FOB_IN_DOORS = BIT(29), - FOB_HAS_PREVMATRIX = BIT(30), - FOB_LIGHTVOLUME = BIT(31), - - FOB_DECAL_MASK = (FOB_DECAL | FOB_DECAL_TEXGEN_2D), - FOB_PARTICLE_MASK = (FOB_SOFT_PARTICLE | FOB_NO_FOG | FOB_GLOBAL_ILLUMINATION | FOB_PARTICLE_SHADOWS | FOB_NEAREST | FOB_MOTION_BLUR | FOB_LIGHTVOLUME | FOB_ALLOW_TESSELLATION | FOB_IN_DOORS | FOB_AFTER_WATER), - - // WARNING: FOB_MASK_AFFECTS_MERGING must start from 0x10000/bit 16 (important for instancing). - FOB_MASK_AFFECTS_MERGING_GEOM = (FOB_ZPREPASS | FOB_SKINNED | FOB_BENDED | FOB_DYNAMIC_OBJECT | FOB_ALLOW_TESSELLATION | FOB_NEAREST), - FOB_MASK_AFFECTS_MERGING = (FOB_ZPREPASS | FOB_MOTION_BLUR | FOB_HAS_PREVMATRIX | FOB_SKINNED | FOB_BENDED | FOB_PARTICLE_SHADOWS | FOB_AFTER_WATER | FOB_DISSOLVE | FOB_DISSOLVE_OUT | FOB_NEAREST | FOB_DYNAMIC_OBJECT | FOB_ALLOW_TESSELLATION) -}; - -struct SSkyInfo -{ - ITexture* m_SkyBox[3]; - float m_fSkyLayerHeight; - - int Size() - { - int nSize = sizeof(SSkyInfo); - return nSize; - } - SSkyInfo() - { - memset(this, 0, sizeof(SSkyInfo)); - } -}; - - -// Description: -// Interface for the skinnable objects (renderer calls its functions to get the skinning data). -// should only created by EF_CreateSkinningData -struct alignas(16) SSkinningData -{ - uint32 nNumBones; - uint32 nHWSkinningFlags; - DualQuat* pBoneQuatsS; - Matrix34* pBoneMatrices; - JointIdType* pRemapTable; - AZ::LegacyJobExecutor* pAsyncJobExecutor; - AZ::LegacyJobExecutor* pAsyncDataJobExecutor; - SSkinningData* pPreviousSkinningRenderData; // used for motion blur - uint32 remapGUID; - void* pCharInstCB; // used if per char instance cbs are available in renderdll (d3d11+); - // members below are for Software Skinning - void* pCustomData; // client specific data, used for example for sw-skinning on animation side - SSkinningData* pNextSkinningData; // List to the next element which needs SW-Skinning - [[maybe_unused]] int m_padding[2]; // padding to avoid MSVC warning 4324 -}; - -struct alignas(16) SRenderObjData -{ - uintptr_t m_uniqueObjectId; - - SSkinningData* m_pSkinningData; - - float m_fTempVars[10]; // Different useful vars (ObjVal component in shaders) - - // using a pointer, the client code has to ensure that the data stays valid - const AZStd::vector* m_pShaderParams; - - uint32 m_nHUDSilhouetteParams; - - uint64 m_nSubObjHideMask; - - - uint16 m_FogVolumeContribIdx[2]; - - uint16 m_nLightID; - uint16 m_LightVolumeId; - - uint8 m_screenBounds[4]; - - uint16 m_nCustomFlags; - uint8 m_nCustomData; - - SRenderObjData() - { - Init(); - } - - void Init() - { - m_nSubObjHideMask = 0; - m_uniqueObjectId = 0; - m_nLightID = 0; - m_LightVolumeId = 0; - m_pSkinningData = NULL; - m_screenBounds[0] = m_screenBounds[1] = m_screenBounds[2] = m_screenBounds[3] = 0; - m_nCustomData = 0; - m_nCustomFlags = 0; - m_nHUDSilhouetteParams = 0; - - m_pShaderParams = nullptr; - m_FogVolumeContribIdx[0] = m_FogVolumeContribIdx[1] = static_cast(-1); - - // The following should be changed to be something like 0xac to indicate invalid data so that by default - // data that was not set will break render features and will be traced (otherwise, default 0 just might pass) - memset(m_fTempVars, 0, 10 * sizeof(float)); - } - - void SetShaderParams(const AZStd::vector* pShaderParams) - { - m_pShaderParams = pShaderParams; - } - - void GetMemoryUsage(ICrySizer* pSizer) const - { - AZ_UNUSED(pSizer); - } -}; - -////////////////////////////////////////////////////////////////////// -// Objects using in shader pipeline - - -// Summary: -// Same as in the 3dEngine. -#define MAX_LIGHTS_NUM 32 - -struct ShadowMapFrustum; - -////////////////////////////////////////////////////////////////////// -/// -/// Objects using in shader pipeline -/// Single rendering item, that can be created from 3DEngine and persist across multiple frames -/// It can be compiled into the platform specific efficient rendering compiled object. -/// -////////////////////////////////////////////////////////////////////// -class alignas(16) CRenderObject -{ -public: - AZ_CLASS_ALLOCATOR(CRenderObject, AZ::LegacyAllocator, 0); - - struct SInstanceInfo - { - Matrix34 m_Matrix; - ColorF m_AmbColor; - }; - - struct SInstanceData - { - Matrix34 m_MatInst; - Vec4 m_vBendInfo; - Vec4 m_vDissolveInfo; - }; - - struct PerInstanceConstantBufferKey - { - PerInstanceConstantBufferKey() - : m_Id{0xFFFF} - , m_IndirectId{0xFF} - {} - - bool IsValid() const - { - return m_Id != 0xFFFF; - } - - AZ::u16 m_Id; - AZ::u8 m_IndirectId; - }; - - ////////////////////////////////////////////////////////////////////////// - SInstanceInfo m_II; //!< Per instance data - - uint64 m_ObjFlags; //!< Combination of FOB_ flags. - uint32 m_Id; - - float m_fAlpha; //!< Object alpha. - float m_fDistance; //!< Distance to the object. - - union - { - float m_fSort; //!< Custom sort value. - uint16 m_nSort; - }; - - uint64 m_nRTMask; //!< Shader runtime modification flags - uint16 m_nMDV; //!< Vertex modifier flags for Shader. - uint16 m_nRenderQuality; //!< 65535 - full quality, 0 - lowest quality, used by CStatObj - int16 m_nTextureID; //!< Custom texture id. - - union - { - uint8 m_breakableGlassSubFragIndex; - uint8 m_ParticleObjFlags; - }; - uint8 m_nClipVolumeStencilRef; //!< Per instance vis area stencil reference ID - uint8 m_DissolveRef; //!< Dissolve value - uint8 m_RState; //!< Render state used for object - - bool m_NoDecalReceiver; - - uint32 m_nMaterialLayers; //!< Which mtl layers active and how much to blend them - - - _smart_ptr m_pCurrMaterial; //!< Parent material used for render object. - - - PerInstanceConstantBufferKey m_PerInstanceConstantBufferKey; - - [[maybe_unused]] int m_padding[1]; // padding to avoid MSVC warning 4324 - - //! Embedded SRenderObjData, optional data carried by CRenderObject - SRenderObjData m_data; - -public: - - ////////////////////////////////////////////////////////////////////////// - // Methods - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - /// Constructor - ////////////////////////////////////////////////////////////////////////// - CRenderObject() - : m_Id(~0u) - { - Init(); - } - ~CRenderObject() {} - - //========================================================================================================= - - Vec3 GetTranslation() const { return m_II.m_Matrix.GetTranslation(); } - float GetScaleX() const { return sqrt_tpl(m_II.m_Matrix(0, 0) * m_II.m_Matrix(0, 0) + m_II.m_Matrix(0, 1) * m_II.m_Matrix(0, 1) + m_II.m_Matrix(0, 2) * m_II.m_Matrix(0, 2)); } - float GetScaleZ() const { return sqrt_tpl(m_II.m_Matrix(2, 0) * m_II.m_Matrix(2, 0) + m_II.m_Matrix(2, 1) * m_II.m_Matrix(2, 1) + m_II.m_Matrix(2, 2) * m_II.m_Matrix(2, 2)); } - - void Init() - { - m_ObjFlags = 0; - m_nRenderQuality = 65535; - - m_RState = 0; - m_fDistance = 0.0f; - - m_nClipVolumeStencilRef = 0; - m_nMaterialLayers = 0; - m_DissolveRef = 0; - - m_nMDV = 0; - m_fSort = 0; - - m_II.m_AmbColor = Col_White; - m_fAlpha = 1.0f; - m_nTextureID = -1; - m_pCurrMaterial = nullptr; - - m_PerInstanceConstantBufferKey = {}; - - m_nRTMask = 0; - - - m_NoDecalReceiver = false; - m_data.Init(); - } - void AssignId(uint32 id) { m_Id = id; } - - ILINE Matrix34A& GetMatrix() { return m_II.m_Matrix; } - - -protected: - - // Disallow copy (potential bugs with PERMANENT objects) - // alwasy use IRendeer::EF_DuplicateRO if you want a copy - // of a CRenderObject - CRenderObject& operator= (CRenderObject& other) = default; - - void CloneObject(CRenderObject* srcObj) - { - *this = *srcObj; - } - - friend class CRenderer; -}; - -enum EResClassName -{ - eRCN_Texture, - eRCN_Shader, -}; - -// className: CTexture, CHWShader_VS, CHWShader_PS, CShader -struct SResourceAsync -{ - AZ_CLASS_ALLOCATOR(SResourceAsync, AZ::SystemAllocator, 0); - int nReady; // 0: Not ready; 1: Ready; -1: Error - int8* pData; - EResClassName eClassName; // Resource class name - char* Name; // Resource name - union - { - // CTexture parameters - struct - { - int nWidth, nHeight, nMips, nTexFlags, nFormat, nTexId; - }; - // CShader parameters - struct - { - int nShaderFlags; - }; - }; - void* pResource; // Pointer to created resource - - SResourceAsync() - { - memset(this, 0, sizeof(SResourceAsync)); - } - - ~SResourceAsync() - { - delete Name; - } -}; - -#include "IRenderer.h" - -//============================================================================== - -// Summary: -// Color operations flags. -enum EColorOp -{ - eCO_NOSET = 0, - eCO_DISABLE = 1, - eCO_REPLACE = 2, - eCO_DECAL = 3, - eCO_ARG2 = 4, - eCO_MODULATE = 5, - eCO_MODULATE2X = 6, - eCO_MODULATE4X = 7, - eCO_BLENDDIFFUSEALPHA = 8, - eCO_BLENDTEXTUREALPHA = 9, - eCO_DETAIL = 10, - eCO_ADD = 11, - eCO_ADDSIGNED = 12, - eCO_ADDSIGNED2X = 13, - eCO_MULTIPLYADD = 14, - eCO_BUMPENVMAP = 15, - eCO_BLEND = 16, - eCO_MODULATEALPHA_ADDCOLOR = 17, - eCO_MODULATECOLOR_ADDALPHA = 18, - eCO_MODULATEINVALPHA_ADDCOLOR = 19, - eCO_MODULATEINVCOLOR_ADDALPHA = 20, - eCO_DOTPRODUCT3 = 21, - eCO_LERP = 22, - eCO_SUBTRACT = 23, - eCO_MODULATE_METAL_FONT_SPECIAL_MODE = 24, -}; - -enum EColorArg -{ - eCA_Unknown, - eCA_Specular, - eCA_Texture, - eCA_Texture1, - eCA_Normal, - eCA_Diffuse, - eCA_Previous, - eCA_Constant, -}; - -#define DEF_TEXARG0 (eCA_Texture | (eCA_Diffuse << 3)) -#define DEF_TEXARG1 (eCA_Texture | (eCA_Previous << 3)) - -enum ETexModRotateType -{ - ETMR_NoChange, - ETMR_Fixed, - ETMR_Constant, - ETMR_Oscillated, - ETMR_Max -}; - -enum ETexModMoveType -{ - ETMM_NoChange, - ETMM_Fixed, - ETMM_Constant, - ETMM_Jitter, - ETMM_Pan, - ETMM_Stretch, - ETMM_StretchRepeat, - ETMM_Max -}; - -enum ETexGenType -{ - ETG_Stream, - ETG_World, - ETG_Camera, - ETG_Max -}; - - - - -////////////////////////////////////////////////////////////////////// -#define FILTER_NONE -1 -#define FILTER_POINT 0 -#define FILTER_LINEAR 1 -#define FILTER_BILINEAR 2 -#define FILTER_TRILINEAR 3 -#define FILTER_ANISO2X 4 -#define FILTER_ANISO4X 5 -#define FILTER_ANISO8X 6 -#define FILTER_ANISO16X 7 - -////////////////////////////////////////////////////////////////////// -#define TADDR_WRAP 0 -#define TADDR_CLAMP 1 -#define TADDR_MIRROR 2 -#define TADDR_BORDER 3 - - -struct IRenderTarget -{ - virtual ~IRenderTarget(){} - virtual void Release() = 0; - virtual void AddRef() = 0; -}; - - struct IRenderShaderResources { - // - virtual void AddRef() = 0; virtual void UpdateConstants(IShader* pSH) = 0; - virtual void CloneConstants(const IRenderShaderResources* pSrc) = 0; - virtual bool HasLMConstants() const = 0; - // properties - - virtual ColorF GetColorValue(EEfResTextures slot) const = 0; virtual void SetColorValue(EEfResTextures slot, const ColorF& color) = 0; - - virtual float GetStrengthValue(EEfResTextures slot) const = 0; virtual void SetStrengthValue(EEfResTextures slot, float value) = 0; - - // configs - virtual const float& GetAlphaRef() const = 0; - virtual void SetAlphaRef(float v) = 0; - - virtual int GetResFlags() = 0; - virtual void SetMtlLayerNoDrawFlags(uint8 nFlags) = 0; - virtual uint8 GetMtlLayerNoDrawFlags() const = 0; - virtual SSkyInfo* GetSkyInfo() = 0; - virtual void SetMaterialName(const char* szName) = 0; - - virtual AZStd::vector& GetParameters() = 0; - - virtual ColorF GetFinalEmittance() = 0; - virtual float GetVoxelCoverage() = 0; - - virtual ~IRenderShaderResources() {} - virtual void Release() = 0; - virtual void ConvertToInputResource(struct SInputShaderResources* pDst) = 0; - virtual IRenderShaderResources* Clone() const = 0; - virtual void SetShaderParams(struct SInputShaderResources* pDst, IShader* pSH) = 0; - - virtual size_t GetResourceMemoryUsage(ICrySizer* pSizer) = 0; - - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // - - bool IsEmissive() const - { - // worst: *reinterpret_cast(&) > 0x00000000 - // causes value to pass from FPU to CPU registers - return GetStrengthValue(EFTT_EMITTANCE) > 0.0f; - } - - bool IsTransparent() const - { - // worst: *reinterpret_cast(&) < 0x3f800000 - // causes value to pass from FPU to CPU registers - return GetStrengthValue(EFTT_OPACITY) < 1.0f; - } - - bool IsAlphaTested() const - { - return GetAlphaRef() > 0.0f; - } - - bool IsInvisible() const - { - const float o = GetStrengthValue(EFTT_OPACITY); - const float a = GetAlphaRef(); - - return o == 0.0f || a == 1.0f || o <= a; - } -}; - - -//=================================================================================== -// Shader gen structure (used for automatic shader script generating). - -// -#define SHGF_HIDDEN 1 -#define SHGF_PRECACHE 2 -#define SHGF_AUTO_PRECACHE 4 -#define SHGF_LOWSPEC_AUTO_PRECACHE 8 -#define SHGF_RUNTIME 0x10 - -#define SHGD_LM_DIFFUSE 0x1 -#define SHGD_TEX_DETAIL 0x2 -#define SHGD_TEX_NORMALS 0x4 -#define SHGD_TEX_ENVCM 0x8 -#define SHGD_TEX_SPECULAR 0x10 -#define SHGD_TEX_SECOND_SMOOTHNESS 0x20 -#define SHGD_TEX_HEIGHT 0x40 -#define SHGD_TEX_SUBSURFACE 0x80 -#define SHGD_HW_BILINEARFP16 0x100 -#define SHGD_HW_SEPARATEFP16 0x200 -#define SHGD_HW_ORBIS 0x800 -#define SHGD_TEX_CUSTOM 0x1000 -#define SHGD_TEX_CUSTOM_SECONDARY 0x2000 -#define SHGD_TEX_DECAL 0x4000 -#define SHGD_TEX_OCC 0x8000 -#define SHGD_TEX_SPECULAR_2 0x10000 -#define SHGD_HW_GLES3 0x20000 -#define SHGD_USER_ENABLED 0x40000 -#define SHGD_HW_SAA 0x80000 -#define SHGD_TEX_EMITTANCE 0x100000 -#define SHGD_HW_DX10 0x200000 -#define SHGD_HW_DX11 0x400000 -#define SHGD_HW_GL4 0x800000 -#define SHGD_HW_WATER_TESSELLATION 0x1000000 -#define SHGD_HW_SILHOUETTE_POM 0x2000000 -// Confetti Nicholas Baldwin: adding metal shader language support -#define SHGD_HW_METAL 0x4000000 -#define SHGD_TEX_MASK ( SHGD_TEX_DETAIL | SHGD_TEX_NORMALS | SHGD_TEX_ENVCM | SHGD_TEX_SPECULAR | SHGD_TEX_SECOND_SMOOTHNESS | \ - SHGD_TEX_HEIGHT | SHGD_TEX_SUBSURFACE | SHGD_TEX_CUSTOM | SHGD_TEX_CUSTOM_SECONDARY | SHGD_TEX_DECAL | \ - SHGD_TEX_OCC | SHGD_TEX_SPECULAR_2 | SHGD_TEX_EMITTANCE) - - -//=================================================================================== - -enum EShaderType -{ - eST_All = -1, // To set all with one call. - - eST_General = 0, - eST_Metal, - eST_Glass, - eST_Ice, - eST_Shadow, - eST_Water, - eST_FX, - eST_PostProcess, - eST_HDR, - eST_Sky, - eST_Compute, - eST_Max // To define array size. -}; - -enum EShaderDrawType -{ - eSHDT_General, - eSHDT_Light, - eSHDT_Shadow, - eSHDT_Terrain, - eSHDT_Overlay, - eSHDT_OceanShore, - eSHDT_Fur, - eSHDT_NoDraw, - eSHDT_CustomDraw, - eSHDT_Sky, - eSHDT_Volume -}; - -enum EShaderQuality -{ - eSQ_Low = 0, - eSQ_Medium = 1, - eSQ_High = 2, - eSQ_VeryHigh = 3, - eSQ_Max = 4 -}; - -enum ERenderQuality -{ - eRQ_Low = 0, - eRQ_Medium = 1, - eRQ_High = 2, - eRQ_VeryHigh = 3, - eRQ_Max = 4 -}; - - -//==================================================================================== -// Phys. material flags - -#define MATF_NOCLIP 1 - -//==================================================================================== -// Registered shader techniques ID's - -enum EShaderTechniqueID -{ - TTYPE_GENERAL = -1, - TTYPE_Z = 0, - TTYPE_SHADOWGEN, - TTYPE_GLOWPASS, - TTYPE_MOTIONBLURPASS, - TTYPE_CUSTOMRENDERPASS, - TTYPE_EFFECTLAYER, - TTYPE_SOFTALPHATESTPASS, - TTYPE_WATERREFLPASS, - TTYPE_WATERCAUSTICPASS, - TTYPE_ZPREPASS, - TTYPE_PARTICLESTHICKNESSPASS, - - // PC specific techniques must go after this point, to support shader serializing - // TTYPE_CONSOLE_MAX must equal TTYPE_MAX for console - TTYPE_CONSOLE_MAX, - TTYPE_DEBUG = TTYPE_CONSOLE_MAX, - - TTYPE_MAX -}; - - -//================================================================ -// Different preprocess flags for shaders that require preprocessing (like recursive render to texture, screen effects, visibility check, ...) -// SShader->m_nPreprocess flags in priority order - -#define SPRID_FIRST 25 -#define SPRID_SCANTEXWATER 26 -#define FSPR_SCANTEXWATER (1 << SPRID_SCANTEXWATER) -#define SPRID_SCANTEX 27 -#define FSPR_SCANTEX (1 << SPRID_SCANTEX) -#define SPRID_SCANLCM 28 -#define FSPR_SCANLCM (1 << SPRID_SCANLCM) -#define SPRID_GENSPRITES_DEPRECATED 29 -#define FSPR_GENSPRITES_DEPRECATED (1 << SPRID_GENSPRITES_DEPRECATED) -#define SPRID_CUSTOMTEXTURE 30 -#define FSPR_CUSTOMTEXTURE (1 << SPRID_CUSTOMTEXTURE) -#define SPRID_GENCLOUDS 31 -#define FSPR_GENCLOUDS (1 << SPRID_GENCLOUDS) - -#define FSPR_MASK 0xfff00000 -#define FSPR_MAX (1 << 31) - -#define FEF_DONTSETTEXTURES 1 // Set: explicit setting of samplers (e.g. tex->Apply(1,nTexStatePoint)), not set: set sampler by sematics (e.g. $ZTarget). -#define FEF_DONTSETSTATES 2 - -// SShader::m_Flags -// Different useful flags -#define EF_RELOAD 1 // Shader needs tangent vectors array. -#define EF_FORCE_RELOAD 2 -#define EF_RELOADED 4 -#define EF_NODRAW 8 -#define EF_HASCULL 0x10 -#define EF_SUPPORTSDEFERREDSHADING_MIXED 0x20 -#define EF_SUPPORTSDEFERREDSHADING_FULL 0x40 -#define EF_SUPPORTSDEFERREDSHADING (EF_SUPPORTSDEFERREDSHADING_MIXED | EF_SUPPORTSDEFERREDSHADING_FULL) -#define EF_DECAL 0x80 -#define EF_LOADED 0x100 -#define EF_LOCALCONSTANTS 0x200 -#define EF_BUILD_TREE 0x400 -#define EF_LIGHTSTYLE 0x800 -#define EF_NOCHUNKMERGING 0x1000 -#define EF_SUNFLARES 0x2000 -#define EF_NEEDNORMALS 0x4000 // Need normals operations. -#define EF_OFFSETBUMP 0x8000 -#define EF_NOTFOUND 0x10000 -#define EF_DEFAULT 0x20000 -#define EF_SKY 0x40000 -#define EF_USELIGHTS 0x80000 -#define EF_ALLOW3DC 0x100000 -#define EF_FOGSHADER 0x200000 -#define EF_FAILED_IMPORT 0x400000 // Currently just for debug, can be removed if necessary -#define EF_PRECACHESHADER 0x800000 -#define EF_FORCEREFRACTIONUPDATE 0x1000000 -#define EF_SUPPORTSINSTANCING_CONST 0x2000000 -#define EF_SUPPORTSINSTANCING_ATTR 0x4000000 -#define EF_SUPPORTSINSTANCING (EF_SUPPORTSINSTANCING_CONST | EF_SUPPORTSINSTANCING_ATTR) -#define EF_WATERPARTICLE 0x8000000 -#define EF_CLIENTEFFECT 0x10000000 -#define EF_SYSTEM 0x20000000 -#define EF_REFRACTIVE 0x40000000 -#define EF_NOPREVIEW 0x80000000 - -#define EF_PARSE_MASK (EF_SUPPORTSINSTANCING | EF_SKY | EF_HASCULL | EF_USELIGHTS | EF_REFRACTIVE) - - -// SShader::Flags2 -// Additional Different useful flags - -#define EF2_PREPR_GENSPRITES_DEPRECATED 0x1 -#define EF2_PREPR_GENCLOUDS 0x2 -#define EF2_PREPR_SCANWATER 0x4 -#define EF2_NOCASTSHADOWS 0x8 -#define EF2_NODRAW 0x10 -#define EF2_HASOPAQUE 0x40 -#define EF2_AFTERHDRPOSTPROCESS 0x80 -#define EF2_DONTSORTBYDIST 0x100 -#define EF2_FORCE_WATERPASS 0x200 -#define EF2_FORCE_GENERALPASS 0x400 -#define EF2_AFTERPOSTPROCESS 0x800 -#define EF2_IGNORERESOURCESTATES 0x1000 -#define EF2_EYE_OVERLAY 0x2000 -#define EF2_FORCE_TRANSPASS 0x4000 -#define EF2_DEFAULTVERTEXFORMAT 0x8000 -#define EF2_FORCE_ZPASS 0x10000 -#define EF2_FORCE_DRAWLAST 0x20000 -#define EF2_FORCE_DRAWAFTERWATER 0x40000 -// free 0x80000 -#define EF2_DEPTH_FIXUP 0x100000 -#define EF2_SINGLELIGHTPASS 0x200000 -#define EF2_FORCE_DRAWFIRST 0x400000 -#define EF2_HAIR 0x800000 -#define EF2_DETAILBUMPMAPPING 0x1000000 -#define EF2_HASALPHATEST 0x2000000 -#define EF2_HASALPHABLEND 0x4000000 -#define EF2_ZPREPASS 0x8000000 -#define EF2_VERTEXCOLORS 0x10000000 -#define EF2_SKINPASS 0x20000000 -#define EF2_HW_TESSELLATION 0x40000000 -#define EF2_ALPHABLENDSHADOWS 0x80000000 - -class CCryNameR; -class CCryNameTSCRC; -struct IShader -{ -public: - // - virtual ~IShader(){} - virtual int GetID() = 0; - virtual int AddRef() = 0; - virtual int Release() = 0; - virtual int ReleaseForce() = 0; - - virtual const char* GetName() = 0; - virtual const char* GetName() const = 0; - virtual int GetFlags() const = 0; - virtual int GetFlags2() const = 0; - virtual void SetFlags2(int Flags) = 0; - virtual void ClearFlags2(int Flags) = 0; - virtual bool Reload(int nFlags, const char* szShaderName) = 0; - - virtual int GetTexId () = 0; - - virtual ECull GetCull(void) = 0; - virtual int Size(int Flags) = 0; - - virtual int GetTechniqueID(int nTechnique, int nRegisteredTechnique) = 0; - virtual AZ::Vertex::Format GetVertexFormat(void) = 0; - - - virtual EShaderType GetShaderType() = 0; - virtual EShaderDrawType GetShaderDrawType() const = 0; - virtual uint32 GetVertexModificator() = 0; - - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // - - static uint32 GetTextureSlot(EEfResTextures textureType) { return (uint32)textureType; } }; struct SShaderItem @@ -1203,72 +91,11 @@ struct SShaderItem int32 m_nTechnique; uint32 m_nPreprocessFlags; - SShaderItem() - { - m_pShader = NULL; - m_pShaderResources = NULL; - m_nTechnique = -1; - m_nPreprocessFlags = 1; - } - SShaderItem(IShader* pSH) - { - m_pShader = pSH; - m_pShaderResources = NULL; - m_nTechnique = -1; - m_nPreprocessFlags = 1; - } - SShaderItem(IShader* pSH, IRenderShaderResources* pRS) - { - m_pShader = pSH; - m_pShaderResources = pRS; - m_nTechnique = -1; - m_nPreprocessFlags = 1; - } - SShaderItem(IShader* pSH, IRenderShaderResources* pRS, int nTechnique) - { - m_pShader = pSH; - m_pShaderResources = pRS; - m_nTechnique = nTechnique; - m_nPreprocessFlags = 1; - } - - uint32 PostLoad(); bool Update(); bool RefreshResourceConstants(); - // Note: - // If you change this function please check bTransparent variable in CRenderMesh::Render(). - // See also: - // CRenderMesh::Render() - bool IsZWrite() const - { - IShader* pSH = m_pShader; - if (pSH->GetFlags() & (EF_NODRAW | EF_DECAL)) - { - return false; - } - if (pSH->GetFlags2() & EF2_FORCE_ZPASS) - { - return true; - } - if (m_pShaderResources && m_pShaderResources->IsTransparent()) - { - return false; - } - return true; - } inline struct SShaderTechnique* GetTechnique() const; - bool IsMergable(SShaderItem& PrevSI); - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(m_pShader); - pSizer->AddObject(m_pShaderResources); - } }; - -#include // <> required for Interfuscator - struct IAnimNode; struct ILightAnimWrapper @@ -1289,30 +116,3 @@ protected: IAnimNode* m_pNode; }; - -#define MAX_RECURSION_LEVELS 2 - -#define DECAL_HAS_NORMAL_MAP (1 << 0) -#define DECAL_STATIC (1 << 1) -#define DECAL_HAS_SPECULAR_MAP (1 << 2) - - -// Summary: -// Runtime shader flags for HW skinning. -enum EHWSkinningRuntimeFlags -{ - eHWS_MotionBlured = 0x04, - eHWS_Skinning_DQ_Linear = 0x08, // Convert dual-quaternions to matrices on the GPU - eHWS_Skinning_Matrix = 0x10, // Pass float3x4 skinning matrices directly to the GPU -}; - -// Enum of data types that can be used as bones on GPU for skinning -enum EBoneTypes -{ - eBoneType_DualQuat = 0, - eBoneType_Matrix, - eBoneType_Count, -}; - - -#include diff --git a/Code/Legacy/CryCommon/ISplines.h b/Code/Legacy/CryCommon/ISplines.h index ff67ae0d56..a1c5c674b0 100644 --- a/Code/Legacy/CryCommon/ISplines.h +++ b/Code/Legacy/CryCommon/ISplines.h @@ -12,6 +12,7 @@ #pragma once #include +#include ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/IStatObj.h b/Code/Legacy/CryCommon/IStatObj.h index a268f40406..b2cde275c5 100644 --- a/Code/Legacy/CryCommon/IStatObj.h +++ b/Code/Legacy/CryCommon/IStatObj.h @@ -11,7 +11,6 @@ #include "smartptr.h" // TYPEDEF_AUTOPTR #include "IMaterial.h" -#include "ISerialize.h" // forward declarations ////////////////////////////////////////////////////////////////////// @@ -35,15 +34,12 @@ struct phys_geometry; struct IChunkFile; // General forward declaration. -class CRenderObject; struct SMeshLodInfo; -#include "CryHeaders.h" #include "Cry_Color.h" #include "Cry_Math.h" #include "Cry_Geo.h" #include "CrySizer.h" -#include "stridedptr.h" #define MAX_STATOBJ_LODS_NUM 6 @@ -150,70 +146,6 @@ enum EFileStreamingStatus ecss_Ready }; -// Interface for streaming of objects like CStatObj. -struct IStreamable -{ - struct SInstancePriorityInfo - { - int nRoundId; - float fMaxImportance; - }; - - IStreamable() - { - ZeroStruct(m_arrUpdateStreamingPrioriryRoundInfo); - m_eStreamingStatus = ecss_NotLoaded; - fCurImportance = 0; - m_nSelectedFrameId = 0; - m_nStatsInUse = 0; - } - - bool UpdateStreamingPrioriryLowLevel(float fImportance, int nRoundId, bool bFullUpdate) - { - bool bRegister = false; - - if (m_arrUpdateStreamingPrioriryRoundInfo[0].nRoundId != nRoundId) - { - if (!m_arrUpdateStreamingPrioriryRoundInfo[0].nRoundId) - { - bRegister = true; - } - - m_arrUpdateStreamingPrioriryRoundInfo[1] = m_arrUpdateStreamingPrioriryRoundInfo[0]; - - m_arrUpdateStreamingPrioriryRoundInfo[0].nRoundId = nRoundId; - m_arrUpdateStreamingPrioriryRoundInfo[0].fMaxImportance = fImportance; - } - else - { - m_arrUpdateStreamingPrioriryRoundInfo[0].fMaxImportance = max(m_arrUpdateStreamingPrioriryRoundInfo[0].fMaxImportance, fImportance); - } - - if (bFullUpdate) - { - m_arrUpdateStreamingPrioriryRoundInfo[1] = m_arrUpdateStreamingPrioriryRoundInfo[0]; - m_arrUpdateStreamingPrioriryRoundInfo[1].nRoundId--; - } - - return bRegister; - } - - // - virtual ~IStreamable(){} - virtual void StartStreaming(bool bFinishNow, IReadStream_AutoPtr* ppStream) = 0; - virtual int GetStreamableContentMemoryUsage(bool bJustForDebug = false) = 0; - virtual void ReleaseStreamableContent() = 0; - virtual void GetStreamableName(AZStd::string& sName) = 0; - virtual uint32 GetLastDrawMainFrameId() = 0; - virtual bool IsUnloadable() const = 0; - - SInstancePriorityInfo m_arrUpdateStreamingPrioriryRoundInfo[2]; - float fCurImportance; - EFileStreamingStatus m_eStreamingStatus; - uint32 m_nSelectedFrameId : 31; - uint32 m_nStatsInUse : 1; -}; - struct SMeshBoneMapping_uint8; struct SSpine; struct SMeshColor; @@ -221,7 +153,6 @@ struct SMeshColor; // Summary: // Interface to hold static object data struct IStatObj - : public IStreamable { //! Loading flags enum ELoadingFlags @@ -262,50 +193,6 @@ struct IStatObj }; ////////////////////////////////////////////////////////////////////////// - // Statistics information about this object. - struct SStatistics - { - int nVertices; - int nVerticesPerLod[MAX_STATOBJ_LODS_NUM]; - int nIndices; - int nIndicesPerLod[MAX_STATOBJ_LODS_NUM]; - int nMeshSize; - int nMeshSizeLoaded; - int nPhysProxySize; - int nPhysProxySizeMax; - int nPhysPrimitives; - int nDrawCalls; - int nLods; - int nSubMeshCount; - int nNumRefs; - bool bSplitLods; // Lods split between files. - - // Optional texture sizer. - ICrySizer* pTextureSizer; - ICrySizer* pTextureSizer2; - - SStatistics() { Reset(); } - - void Reset() - { - pTextureSizer = NULL; - pTextureSizer2 = NULL; - nVertices = 0; - nIndices = 0; - nMeshSize = 0; - nMeshSizeLoaded = 0; - nNumRefs = 0; - nPhysProxySize = 0; - nPhysPrimitives = 0; - nDrawCalls = 0; - nLods = 0; - nSubMeshCount = 0; - bSplitLods = false; - ZeroStruct(nVerticesPerLod); - ZeroStruct(nIndicesPerLod); - } - }; - // // Description: // Increase the reference count of the object. @@ -337,10 +224,6 @@ struct IStatObj // Retrieves the internal flag m_nVehicleOnlyPhysics. virtual unsigned int GetVehicleOnlyPhysics() = 0; - // Description: - // Retrieves the internal flag m_nIdMaterialBreakable. - virtual int GetIDMatBreakable() = 0; - // Description: // Retrieves the internal flag m_bBreakableByGame. virtual unsigned int GetBreakableByGame() = 0; @@ -364,34 +247,6 @@ struct IStatObj //! Access to rendering geometry for indoor engine ( optimized vert arrays, lists of shader pointers ) virtual struct IRenderMesh* GetRenderMesh() = 0; - // Description: - // Returns the physical representation of the object. - // Arguments: - // nType - one of PHYS_GEOM_TYPE_'s, or an explicit slot index - // Return Value: - // A pointer to a phys_geometry structure. - // Summary: - // Get the physic representation - virtual phys_geometry* GetPhysGeom(int nType = PHYS_GEOM_TYPE_DEFAULT) = 0; - - // Description: - // Updates rendermesh's vertices, normals, and tangents with the data provided - // Summary: - // Updates vertices in the range [iVtx0..iVtx0+nVtx-1], vertices are in their original order - // (as they are physicalized). Clones the object if necessary to make the modifications - // Return Value: - // modified IStatObj (a clone or this one, if it's already a clone) - virtual IStatObj* UpdateVertices(strided_pointer pVtx, strided_pointer pNormals, int iVtx0, int nVtx, int* pVtxMap = 0, float rscale = 1.f) = 0; - - // Description: - // Skins rendermesh's vertices based on skeleton vertices - // Summary: - // Skins vertices based on mtxSkelToMesh[pSkelVtx[i]] - // Clones the object if necessary to make the modifications - // Return Value: - // modified IStatObj (a clone or this one, if it's already a clone) - virtual IStatObj* SkinVertices(strided_pointer pSkelVtx, const Matrix34& mtxSkelToMesh) = 0; - // Description: // Sets and replaces the physical representation of the object. // Arguments: @@ -431,18 +286,6 @@ struct IStatObj // Get the minimal bounding box component virtual Vec3 GetBoxMax() = 0; - // Return Value: - // A Vec3 object containing the bounding box center. - // Summary: - // Get the center of bounding box - virtual const Vec3 GetVegCenter() = 0; - - // Arguments: - // Minimum bounding box component - // Summary: - // Set the minimum bounding box component - virtual void SetBBoxMin(const Vec3& vBBoxMin) = 0; - // Arguments: // Minimum bounding box component // Summary: @@ -502,17 +345,9 @@ struct IStatObj virtual int FindNearesLoadedLOD(int nLodIn, bool bSearchUp = false) = 0; virtual int FindHighestLOD(int nBias) = 0; - virtual bool LoadCGF(const char* filename, bool bLod, unsigned long nLoadingFlags, const void* pData, const int nDataSize) = 0; - virtual void DisableStreaming() = 0; - virtual void TryMergeSubObjects(bool bFromStreaming) = 0; - virtual bool IsUnloadable() const = 0; - virtual void SetCanUnload(bool value) = 0; - virtual AZStd::string& GetFileName() = 0; virtual const AZStd::string& GetFileName() const = 0; - virtual const AZStd::string& GetCGFNodeName() const = 0; - // Summary: // Returns the filename of the object // Return Value: @@ -527,25 +362,6 @@ struct IStatObj // None virtual void SetFilePath(const char* szFileName) = 0; - // Summary: - // Returns the name of the geometry - // Return Value: - // A null terminated string which contains the name of the geometry - virtual const char* GetGeoName() = 0; - - // Summary: - // Sets the name of the geometry - virtual void SetGeoName(const char* szGeoName) = 0; - - // Summary: - // Compares if another object is the same - // Arguments: - // szFileName - Filename of the object to compare - // szGeomName - Geometry name of the object to compare (optional) - // Return Value: - // A boolean which equals to true in case both object are the same, or false in the opposite case. - virtual bool IsSameObject(const char* szFileName, const char* szGeomName) = 0; - // Description: // Will return the position of the helper named in the argument. The // helper should have been specified during the exporting process of @@ -679,9 +495,6 @@ struct IStatObj // hides all non-physicalized geometry, clones the object if necessary virtual IStatObj* HideFoliage() = 0; - // serializes the StatObj's mesh into a stream - virtual int Serialize(TSerialize ser) = 0; - // Get object properties as loaded from CGF. virtual const char* GetProperties() = 0; @@ -702,9 +515,6 @@ struct IStatObj // Debug Draw this static object. virtual void DebugDraw(const struct SGeometryDebugDrawInfo& info, float fExtrdueScale = 0.01f) = 0; - // Fill statistics about the level. - virtual void GetStatistics(SStatistics& stats) = 0; - // Returns initial hide mask virtual uint64 GetInitialHideMask() = 0; diff --git a/Code/Legacy/CryCommon/IStereoRenderer.h b/Code/Legacy/CryCommon/IStereoRenderer.h deleted file mode 100644 index 63fba6d214..0000000000 --- a/Code/Legacy/CryCommon/IStereoRenderer.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef __ISTEREORENDERER_H__ -#define __ISTEREORENDERER_H__ - -#pragma once - -#include "StereoRendererBus.h" - -enum EStereoEye -{ - STEREO_EYE_LEFT = 0, - STEREO_EYE_RIGHT = 1, - STEREO_EYE_COUNT -}; - -enum EStereoDevice -{ - STEREO_DEVICE_NONE = 0, - STEREO_DEVICE_FRAMECOMP = 1, - STEREO_DEVICE_HDMI = 2, - STEREO_DEVICE_DRIVER = 3, //!< Nvidia and AMD drivers. - STEREO_DEVICE_DUALHEAD = 4, - STEREO_DEVICE_COUNT, - - STEREO_DEVICE_DEFAULT = 100 //!< Auto-detect device. -}; - -enum EStereoMode -{ - STEREO_MODE_NO_STEREO = 0, //!< Stereo disabled. - STEREO_MODE_DUAL_RENDERING = 1, - STEREO_MODE_COUNT, -}; - -enum EStereoOutput -{ - STEREO_OUTPUT_STANDARD = 0, - STEREO_OUTPUT_IZ3D = 1, - STEREO_OUTPUT_CHECKERBOARD = 2, - STEREO_OUTPUT_ABOVE_AND_BELOW = 3, - STEREO_OUTPUT_SIDE_BY_SIDE = 4, - STEREO_OUTPUT_LINE_BY_LINE = 5, - STEREO_OUTPUT_ANAGLYPH = 6, - STEREO_OUTPUT_HMD = 7, - STEREO_OUTPUT_COUNT, -}; - -enum EStereoDeviceState -{ - STEREO_DEVSTATE_OK = 0, - STEREO_DEVSTATE_UNSUPPORTED_DEVICE, - STEREO_DEVSTATE_REQ_1080P, - STEREO_DEVSTATE_REQ_FRAMEPACKED, - STEREO_DEVSTATE_BAD_DRIVER, - STEREO_DEVSTATE_REQ_FULLSCREEN -}; - -class IStereoRenderer - : public AZ::StereoRendererRequestBus::Handler -{ -public: - enum EHmdRender - { - eHR_Eyes = 0, - eHR_Latency - }; - - // - virtual ~IStereoRenderer(){} - - virtual EStereoDevice GetDevice() = 0; - virtual EStereoDeviceState GetDeviceState() = 0; - virtual void GetInfo(EStereoDevice* device, EStereoMode* mode, EStereoOutput* output, EStereoDeviceState* state) const = 0; - - virtual bool GetStereoEnabled() = 0; - virtual float GetStereoStrength() = 0; - virtual float GetMaxSeparationScene(bool half = true) = 0; - virtual float GetZeroParallaxPlaneDist() = 0; - - virtual void OnHmdDeviceChanged() = 0; - - virtual void OnResolutionChanged() {} - - virtual void GetNVControlValues(bool& stereoEnabled, float& stereoStrength) = 0; - // - - enum class Status - { - kRenderingFirstEye, - kRenderingSecondEye, - kIdle ///< Not currently rendering to either eye. - }; - - virtual Status GetStatus() const = 0; -}; - -#endif diff --git a/Code/Legacy/CryCommon/ISystem.h b/Code/Legacy/CryCommon/ISystem.h index 6008c4ae32..722e73c774 100644 --- a/Code/Legacy/CryCommon/ISystem.h +++ b/Code/Legacy/CryCommon/ISystem.h @@ -1095,57 +1095,6 @@ struct ISystem using CrySystemNotificationBus = AZ::EBus; }; -#if defined(USE_DISK_PROFILER) - -struct DiskOperationInfo -{ - DiskOperationInfo() - : m_nSeeksCount(0) - , m_nFileOpenCount(0) - , m_nFileReadCount(0) - , m_dOperationSize(0.) - , m_dOperationTime(0.) {} - int m_nSeeksCount; - int m_nFileOpenCount; - int m_nFileReadCount; - double m_dOperationTime; - double m_dOperationSize; - - DiskOperationInfo& operator -= (const DiskOperationInfo& rv) - { - m_nSeeksCount -= rv.m_nSeeksCount; - m_nFileOpenCount -= rv.m_nFileOpenCount; - m_nFileReadCount -= rv.m_nFileReadCount; - m_dOperationSize -= rv.m_dOperationSize; - m_dOperationTime -= rv.m_dOperationTime; - return *this; - } - - DiskOperationInfo& operator += (const DiskOperationInfo& rv) - { - m_nSeeksCount += rv.m_nSeeksCount; - m_nFileOpenCount += rv.m_nFileOpenCount; - m_nFileReadCount += rv.m_nFileReadCount; - m_dOperationSize += rv.m_dOperationSize; - m_dOperationTime += rv.m_dOperationTime; - return *this; - } - - DiskOperationInfo operator - (const DiskOperationInfo& rv) - { - DiskOperationInfo res(*this); - return res -= rv; - } - - DiskOperationInfo operator + (const DiskOperationInfo& rv) - { - DiskOperationInfo res(*this); - return res += rv; - } -}; - -#endif - ////////////////////////////////////////////////////////////////////////// // CrySystem DLL Exports. ////////////////////////////////////////////////////////////////////////// @@ -1365,9 +1314,6 @@ namespace Detail bool IsConstCVar() const { return true; } void SetOnChangeCallback(ConsoleVarFunc pChangeFunc) { (void)pChangeFunc; } uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) { (void)pChangeFunctor; return 0; } - uint64 GetNumberOfOnChangeFunctors() const { return 0; } - const SFunctor& GetOnChangeFunctor([[maybe_unused]] uint64 nFunctorIndex) const { InvalidAccess(); SFunctor* pNull = nullptr; return *pNull; } - bool RemoveOnChangeFunctor([[maybe_unused]] const uint64 nElement) { return true; } ConsoleVarFunc GetOnChangeCallback() const { InvalidAccess(); return NULL; } void GetMemoryUsage([[maybe_unused]] class ICrySizer* pSizer) const {} int GetRealIVal() const { return GetIVal(); } diff --git a/Code/Legacy/CryCommon/ITexture.h b/Code/Legacy/CryCommon/ITexture.h index 170e3b6709..b370005f83 100644 --- a/Code/Legacy/CryCommon/ITexture.h +++ b/Code/Legacy/CryCommon/ITexture.h @@ -5,60 +5,12 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - - -#ifndef CRYINCLUDE_CRYCOMMON_ITEXTURE_H -#define CRYINCLUDE_CRYCOMMON_ITEXTURE_H #pragma once -#include - -#include "Cry_Math.h" -#include "Cry_Color.h" -#include "Tarray.h" -#include -class CTexture; - -#ifndef COMPILER_SUPPORTS_ENUM_SPECIFICATION -# if defined(_MSC_VER) -# define COMPILER_SUPPORTS_ENUM_SPECIFICATION 1 -# else -# define COMPILER_SUPPORTS_ENUM_SPECIFICATION 0 -# endif -#endif - -#if COMPILER_SUPPORTS_ENUM_SPECIFICATION -enum ETEX_Type : uint8 -#else -typedef uint8 ETEX_Type; -enum eTEX_Type -#endif -{ - eTT_1D = 0, - eTT_2D, - eTT_3D, - eTT_Cube, - eTT_CubeArray, - eTT_Dyn2D, - eTT_User, - eTT_NearestCube, - - eTT_2DArray, - eTT_2DMS, - - eTT_Auto2D, - - eTT_MaxTexType, // not used -}; - +#include // Texture formats -#if COMPILER_SUPPORTS_ENUM_SPECIFICATION -enum ETEX_Format : uint8 -#else -typedef uint8 ETEX_Format; -enum eTEX_Format -#endif +enum ETEX_Format : AZ::u8 { eTF_Unknown = 0, eTF_R8G8B8A8S, @@ -147,277 +99,20 @@ enum eTEX_Format eTF_MaxFormat // unused, must be always the last in the list }; -#if COMPILER_SUPPORTS_ENUM_SPECIFICATION -enum ETEX_TileMode : uint8 -#else -typedef uint8 ETEX_TileMode; -enum eTEX_TileMode -#endif -{ - eTM_None = 0, - eTM_LinearPadded, - eTM_Optimal, -}; - - -enum ETextureFlags -{ - FT_NOMIPS = 0x00000001, - FT_TEX_NORMAL_MAP = 0x00000002, - FT_TEX_WAS_NOT_PRE_TILED = 0x00000004, - FT_USAGE_DEPTHSTENCIL = 0x00000008, - FT_USAGE_ALLOWREADSRGB = 0x00000010, - FT_FILESINGLE = 0x00000020, // suppress loading of additional files like _DDNDIF (faster, RC can tag the file for that) - FT_TEX_FONT = 0x00000040, - FT_HAS_ATTACHED_ALPHA = 0x00000080, - FT_USAGE_UNORDERED_ACCESS = 0x00000100, - FT_USAGE_READBACK = 0x00000200, - FT_USAGE_MSAA = 0x00000400, - FT_FORCE_MIPS = 0x00000800, - FT_USAGE_RENDERTARGET = 0x00001000, - FT_USAGE_DYNAMIC = 0x00002000, - FT_STAGE_READBACK = 0x00004000, - FT_STAGE_UPLOAD = 0x00008000, - FT_DONT_RELEASE = 0x00010000, - FT_ASYNC_PREPARE = 0x00020000, - FT_DONT_STREAM = 0x00040000, -#if defined(AZ_RESTRICTED_PLATFORM) - #include AZ_RESTRICTED_FILE(ITexture_h) -#endif - -#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED) - #undef AZ_RESTRICTED_SECTION_IMPLEMENTED -#else -#if defined(AZ_PLATFORM_IOS) - FT_USAGE_MEMORYLESS = 0x00080000, //reusing an unused bit for ios -#else - FT_USAGE_PREDICATED_TILING = 0x00080000, //unused -#endif -#endif - FT_FAILED = 0x00100000, - FT_FROMIMAGE = 0x00200000, - FT_STATE_CLAMP = 0x00400000, - FT_USAGE_ATLAS = 0x00800000, - FT_ALPHA = 0x01000000, - FT_REPLICATE_TO_ALL_SIDES = 0x02000000, - FT_KEEP_LOWRES_SYSCOPY = 0x04000000, // keep low res copy in system memory for voxelization on CPU - FT_SPLITTED = 0x08000000, // for split dds files - FT_USE_HTILE = 0x10000000, - FT_IGNORE_PRECACHE = 0x20000000, - FT_COMPOSITE = 0x40000000, - FT_USAGE_UAV_RWTEXTURE = 0x80000000, -}; - struct SDepthTexture; -struct STextureStreamingStats -{ - STextureStreamingStats(bool bComputeTexturesPerFrame) - : bComputeReuquiredTexturesPerFrame(bComputeTexturesPerFrame) - { - nMaxPoolSize = 0; - nCurrentPoolSize = 0; - nStreamedTexturesSize = 0; - nStaticTexturesSize = 0; - nThroughput = 0; - nNumTexturesPerFrame = 0; - nRequiredStreamedTexturesSize = 0; - nRequiredStreamedTexturesCount = 0; - bPoolOverflow = false; - bPoolOverflowTotally = false; - fPoolFragmentation = 0.0f; - } - size_t nMaxPoolSize; - size_t nCurrentPoolSize; - size_t nStreamedTexturesSize; - size_t nStaticTexturesSize; - uint32 nNumTexturesPerFrame; - size_t nThroughput; - size_t nRequiredStreamedTexturesSize; - uint32 nRequiredStreamedTexturesCount; - float fPoolFragmentation; - uint32 bPoolOverflow : 1; - uint32 bPoolOverflowTotally : 1; - const bool bComputeReuquiredTexturesPerFrame; -}; - - ////////////////////////////////////////////////////////////////////// // Texture object interface -class CDeviceTexture; class ITexture { protected: virtual ~ITexture() {} public: - - // virtual int AddRef() = 0; virtual int Release() = 0; virtual int ReleaseForce() = 0; - virtual const ColorF& GetClearColor() const = 0; - virtual const ETEX_Format GetDstFormat() const = 0; - virtual const ETEX_Format GetSrcFormat() const = 0; - virtual const ETEX_Type GetTexType() const = 0; - virtual void ApplyTexture(int nTUnit, int nState = -1) = 0; virtual const char* GetName() const = 0; - virtual const int GetWidth() const = 0; - virtual const int GetHeight() const = 0; - virtual const int GetDepth() const = 0; - virtual const int GetTextureID() const = 0; - virtual const uint32 GetFlags() const = 0; - virtual const int GetNumMips() const = 0; - virtual const int GetRequiredMip() const = 0; - virtual const int GetDeviceDataSize() const = 0; - virtual const int GetDataSize() const = 0; - virtual const ETEX_Type GetTextureType() const = 0; - // Sets the texture type of the texture to be used before the texture is loaded. - // Once the texture is loaded the type from the file will overwrite whatever - // value was set here. - virtual void SetTextureType(ETEX_Type type) = 0; - virtual const bool IsTextureLoaded() const = 0; - virtual void PrecacheAsynchronously(float fMipFactor, int nFlags, int nUpdateId, int nCounter = 1) = 0; - virtual uint8* GetData32(int nSide = 0, int nLevel = 0, uint8* pDst = NULL, ETEX_Format eDstFormat = eTF_R8G8B8A8) = 0; - virtual bool SetFilter(int nFilter) = 0; // FILTER_ flags - virtual void SetClamp(bool bEnable) = 0; // Texture addressing set - virtual float GetAvgBrightness() const = 0; - - virtual int StreamCalculateMipsSigned(float fMipFactor) const = 0; - virtual int GetStreamableMipNumber() const = 0; - virtual int GetStreamableMemoryUsage(int nStartMip) const = 0; - virtual int GetMinLoadedMip() const = 0; - - using StagingHook = AZStd::function; - virtual void Readback(AZ::u32 subresourceIndex, StagingHook callback) = 0; - - virtual bool Reload() = 0; - // Used for debugging/profiling. - virtual const char* GetFormatName() const = 0; - virtual const char* GetTypeName() const = 0; - virtual const bool IsStreamedVirtual() const = 0; - virtual const bool IsShared() const = 0; - virtual const bool IsStreamable() const = 0; - virtual bool IsStreamedIn(const int nMinPrecacheRoundIds[2]) const = 0; - virtual const int GetAccessFrameId() const = 0; - - virtual const ETEX_Format GetTextureDstFormat() const = 0; - virtual const ETEX_Format GetTextureSrcFormat() const = 0; - - virtual bool IsPostponed() const = 0; - virtual const bool IsParticularMipStreamed(float fMipFactor) const = 0; - - // get low res system memory (used for CPU voxelization) - virtual const ColorB* GetLowResSystemCopy([[maybe_unused]] uint16& nWidth, [[maybe_unused]] uint16& nHeight, [[maybe_unused]] int** ppLowResSystemCopyAtlasId) { return 0; } - - // - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const - { - static_assert(eTT_MaxTexType <= 255); - static_assert(eTF_MaxFormat <= 255); - /*LATER*/ - } - - virtual void SetKeepSystemCopy(bool bKeepSystemCopy) = 0; - virtual void UpdateTextureRegion(const uint8_t* data, int nX, int nY, int nZ, int USize, int VSize, int ZSize, ETEX_Format eTFSrc) = 0; - virtual CDeviceTexture* GetDevTexture() const = 0; - -}; - -struct STextureLoadData -{ - void* m_pData; - size_t m_DataSize; - int m_Width; - int m_Height; - ETEX_Format m_Format; - int m_NumMips; - int m_nFlags; - ITexture* m_pTexture; - STextureLoadData() - : m_pData(nullptr) - , m_Width(0) - , m_Height(0) - , m_Format(eTF_Unknown) - , m_NumMips(0) - , m_nFlags(0) - , m_pTexture(nullptr) - { - } - ~STextureLoadData() - { - if (m_pData) - { - CryModuleFree(m_pData); - } - } - - static void* AllocateData(size_t dataSize) - { - return CryModuleMalloc(dataSize); - } -}; -struct ITextureLoadHandler -{ - virtual ~ITextureLoadHandler() {} - virtual bool LoadTextureData(const char* path, STextureLoadData& loadData) = 0; - virtual bool SupportsExtension(const char* ext) const = 0; - virtual void Update() = 0; }; //========================================================================================= - -class IDynTexture -{ -public: - enum - { - fNeedRegenerate = 1ul << 0, - }; - // - virtual ~IDynTexture(){} - virtual void Release() = 0; - virtual void GetSubImageRect(uint32& nX, uint32& nY, uint32& nWidth, uint32& nHeight) = 0; - virtual void GetImageRect(uint32& nX, uint32& nY, uint32& nWidth, uint32& nHeight) = 0; - virtual int GetTextureID() = 0; - virtual void Lock() = 0; - virtual void UnLock() = 0; - virtual int GetWidth() = 0; - virtual int GetHeight() = 0; - virtual bool IsValid() = 0; - virtual uint8 GetFlags() const = 0; - virtual void SetFlags([[maybe_unused]] uint8 flags) {} - virtual bool Update(int nNewWidth, int nNewHeight) = 0; - virtual void Apply(int nTUnit, int nTS = -1) = 0; - virtual bool ClearRT() = 0; - virtual bool SetRT(int nRT, bool bPush, struct SDepthTexture* pDepthSurf, bool bScreenVP = false) = 0; - virtual bool SetRectStates() = 0; - virtual bool RestoreRT(int nRT, bool bPop) = 0; - virtual ITexture* GetTexture() = 0; - virtual void SetUpdateMask() = 0; - virtual void ResetUpdateMask() = 0; - virtual bool IsSecondFrame() = 0; - virtual bool GetImageData32([[maybe_unused]] uint8* pData, [[maybe_unused]] int nDataSize) { return 0; } - // -}; - -// Animating Texture sequence definition -class ITexAnim -{ -public: - virtual ~ITexAnim() {}; - virtual void Release() = 0; - virtual void AddRef() = 0; -}; - -struct AZ_DEPRECATED(STexAnim, "STexAnim has been deprecated and replaced by the abstract interface ITexAnim above and CTexAnim in RenderDLL/Common/Textures/Texture.h. This was done to keep proper ref counting between CryRenderDLL and EditorLib.") {}; - -struct STexComposition -{ - _smart_ptr pTexture; - uint16 nSrcSlice; - uint16 nDstSlice; -}; - -#endif // CRYINCLUDE_CRYCOMMON_ITEXTURE_H diff --git a/Code/Legacy/CryCommon/IViewSystem.h b/Code/Legacy/CryCommon/IViewSystem.h index 583c0982c9..d8514aadf6 100644 --- a/Code/Legacy/CryCommon/IViewSystem.h +++ b/Code/Legacy/CryCommon/IViewSystem.h @@ -9,12 +9,8 @@ // Description : View System interfaces. - -#ifndef CRYINCLUDE_CRYACTION_IVIEWSYSTEM_H -#define CRYINCLUDE_CRYACTION_IVIEWSYSTEM_H #pragma once -#include #include #include @@ -233,7 +229,6 @@ struct IView virtual CCamera& GetCamera() = 0; virtual const CCamera& GetCamera() const = 0; - virtual void Serialize(TSerialize ser) = 0; virtual void PostSerialize() = 0; virtual void SetCurrentParams(SViewParams& params) = 0; virtual const SViewParams* GetCurrentParams() = 0; @@ -281,7 +276,6 @@ struct IViewSystem virtual bool AddListener(IViewSystemListener* pListener) = 0; virtual bool RemoveListener(IViewSystemListener* pListener) = 0; - virtual void Serialize(TSerialize ser) = 0; virtual void PostSerialize() = 0; // Get default distance to near clipping plane. @@ -299,5 +293,3 @@ struct IViewSystem virtual void SetControlAudioListeners(bool const bActive) = 0; virtual void ForceUpdate(float elapsed) = 0; }; - -#endif // CRYINCLUDE_CRYACTION_IVIEWSYSTEM_H diff --git a/Code/Legacy/CryCommon/LyShine/Animation/IUiAnimation.h b/Code/Legacy/CryCommon/LyShine/Animation/IUiAnimation.h index 8d988d0df5..be449bb6ad 100644 --- a/Code/Legacy/CryCommon/LyShine/Animation/IUiAnimation.h +++ b/Code/Legacy/CryCommon/LyShine/Animation/IUiAnimation.h @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/Code/Legacy/CryCommon/LyShine/UiBase.h b/Code/Legacy/CryCommon/LyShine/UiBase.h index af6314be2c..5eef06b94e 100644 --- a/Code/Legacy/CryCommon/LyShine/UiBase.h +++ b/Code/Legacy/CryCommon/LyShine/UiBase.h @@ -12,10 +12,12 @@ #include #include #include +#include #include #include #include +#include // This is a workaround for AZCore including WinUser.h which defines DrawText to be DrawTextA #ifdef DrawText @@ -44,7 +46,7 @@ namespace LyShine typedef AZStd::string StringType; // not yet decided if we should use wchar_t or UTF8 //! Used for passing lists of entities - typedef DynArray EntityArray; + typedef AZStd::vector EntityArray; enum class BlendMode { diff --git a/Code/Legacy/CryCommon/MemoryAccess.h b/Code/Legacy/CryCommon/MemoryAccess.h deleted file mode 100644 index 8343c961a8..0000000000 --- a/Code/Legacy/CryCommon/MemoryAccess.h +++ /dev/null @@ -1,567 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Misc mathematical functions - -#pragma once - - -#include - -// Section dictionary -#if defined(AZ_RESTRICTED_PLATFORM) -#undef AZ_RESTRICTED_SECTION -#define MEMORYACCESS_H_SECTION_TRAITS 1 -#define MEMORYACCESS_H_SECTION_CRYPREFETCH 2 -#endif - -// Traits -#if defined(AZ_RESTRICTED_PLATFORM) - #define AZ_RESTRICTED_SECTION MEMORYACCESS_H_SECTION_TRAITS - #include AZ_RESTRICTED_FILE(MemoryAccess_h) -#else -#define MEMORYACCESS_H_TRAIT_USE_LEGACY_PREFETCHLINE 1 -#endif - -#if MEMORYACCESS_H_TRAIT_USE_LEGACY_PREFETCHLINE -#define PrefetchLine(ptr, off) cryPrefetchT0SSE((void*)((UINT_PTR)ptr + off)) -#else -#define PrefetchLine(ptr, off) (void)(0) -#endif -#define ResetLine128(ptr, off) (void)(0) -#define FlushLine128(ptr, off) (void)(0) - - - -//======================================================================================== - -// cryMemcpy flags -#define MC_CPU_TO_GPU 0x10 -#define MC_GPU_TO_CPU 0x20 -#define MC_CPU_TO_CPU 0x40 - -extern int g_CpuFlags; - -// -#define CPUF_SSE 0x01 -#define CPUF_SSE2 0x02 -#define CPUF_3DNOW 0x04 -#define CPUF_MMX 0x08 -#define CPUF_SSE3 0x10 -#define CPUF_F16C 0x20 -#define CPUF_SSE41 0x40 - -#ifdef _CPU_SSE - -#ifdef _CPU_X86 -#include -#endif - -#define _MM_PREFETCH(MemPtr, Hint) _mm_prefetch((MemPtr), (Hint)); -#define _MM_PREFETCH_LOOP(nCount, MemPtr, Hint) { for (int p = 0; p < nCount; p += 64) { _mm_prefetch((const char*)(MemPtr) + p, Hint); } \ -} -#else //_CPU_SSE -#define _MM_PREFETCH(MemPtr, Hint) -#define _MM_PREFETCH_LOOP(nCount, MemPtr, Hint) -#endif //_CPU_SSE - -void cryMemcpy(void* Dst, const void* Src, int Count); -#if defined(LINUX) || defined(APPLE) -// Define this for Mac and Linux since it is used with the pthread sources - #define mymemcpy16 memcpy -#endif - - -//========================================================================================== -// 3DNow! optimizations - -#if defined _CPU_X86 && !defined(LINUX) && !defined(APPLE) -// *************************************************************************** -inline void cryPrecacheSSE(const void* src, int nbytes) -{ - _asm - { - mov esi, src - mov ecx, nbytes - // 64 bytes per pass - shr ecx, 6 - jz endLabel - -loopMemToL1: - prefetchnta 64[ESI] // Prefetch next loop, non-temporal - prefetchnta 96[ESI] - - movq mm1, 0[ESI]// Read in source data - movq mm2, 8[ESI] - movq mm3, 16[ESI] - movq mm4, 24[ESI] - movq mm5, 32[ESI] - movq mm6, 40[ESI] - movq mm7, 48[ESI] - movq mm0, 56[ESI] - - add esi, 64 - dec ecx - jnz loopMemToL1 - - emms - -endLabel: - } -} - - -#endif - - - -ILINE void cryPrefetchT0SSE(const void* src) -{ -#if defined(WIN32) && !defined(WIN64) - _asm - { - mov esi, src - prefetchT0 [ESI] // Prefetch - } -#else - _MM_PREFETCH((char*)src, _MM_HINT_T0); -#endif -} - -//================================================================================= - -// Very optimized memcpy() routine for AMD Athlon and Duron family. -// This code uses any of FOUR different basic copy methods, depending -// on the transfer size. -// NOTE: Since this code uses MOVNTQ (also known as "Non-Temporal MOV" or -// "Streaming Store"), and also uses the software prefetch instructions, -// be sure you're running on Athlon/Duron or other recent CPU before calling! - -#define TINY_BLOCK_COPY 64 // Upper limit for movsd type copy. -// The smallest copy uses the X86 "movsd" instruction, in an optimized -// form which is an "unrolled loop". - -#define IN_CACHE_COPY 64 * 1024 // Upper limit for movq/movq copy w/SW prefetch. -// Next is a copy that uses the MMX registers to copy 8 bytes at a time, -// also using the "unrolled loop" optimization. This code uses -// the software prefetch instruction to get the data into the cache. - -#define UNCACHED_COPY 197 * 1024 // Upper limit for movq/movntq w/SW prefetch. -// For larger blocks, which will spill beyond the cache, it's faster to -// use the Streaming Store instruction MOVNTQ. This write instruction -// bypasses the cache and writes straight to main memory. This code also -// uses the software prefetch instruction to pre-read the data. -// USE 64 * 1024 FOR THIS VALUE IF YOU'RE ALWAYS FILLING A "CLEAN CACHE". - -#define BLOCK_PREFETCH_COPY infinity // No limit for movq/movntq w/block prefetch. -#define CACHEBLOCK 80h // Number of 64-byte blocks (cache lines) for block prefetch. -// For the largest size blocks, a special technique called Block Prefetch -// can be used to accelerate the read operations. Block Prefetch reads -// one address per cache line, for a series of cache lines, in a short loop. -// This is faster than using software prefetch. The technique is great for -// getting maximum read bandwidth, especially in DDR memory systems. - - -#if defined _CPU_X86 && !defined(LINUX) && !defined(APPLE) -// Inline assembly syntax for use with Visual C++ -inline void cryMemcpy(void* Dst, const void* Src, int Count) -{ - if (g_CpuFlags & CPUF_SSE) - { - __asm - { - mov ecx, [Count]; - number of bytes to copy - mov edi, [Dst]; - destination - mov esi, [Src]; - source - mov ebx, ecx; - keep a copy of count - - cld - cmp ecx, TINY_BLOCK_COPY - jb $memcpy_ic_3; - tiny ? skip mmx copy - - cmp ecx, 32 * 1024; - dont align between 32k - 64k because - jbe $memcpy_do_align; - it appears to be slower - cmp ecx, 64*1024 - jbe $memcpy_align_done - $memcpy_do_align : - mov ecx, 8; - a trick thats faster than rep movsb ... - sub ecx, edi; - align destination to qword - and ecx, 111b; - get the low bits - sub ebx, ecx; - update copy count - neg ecx; - set up to jump into the array - add ecx, offset $memcpy_align_done - jmp ecx; - jump to array of movsbs - - align 4 - movsb - movsb - movsb - movsb - movsb - movsb - movsb - movsb - -$memcpy_align_done:; - destination is dword aligned - mov ecx, ebx; - number of bytes left to copy - shr ecx, 6; - get 64 - byte block count - jz $memcpy_ic_2; - finish the last few bytes - - cmp ecx, IN_CACHE_COPY / 64; - too big 4 cache ? use uncached copy - jae $memcpy_uc_test - - // This is small block copy that uses the MMX registers to copy 8 bytes - // at a time. It uses the "unrolled loop" optimization, and also uses - // the software prefetch instruction to get the data into the cache. - align 16 - $memcpy_ic_1 :; - 64 - byte block copies, in - cache copy - - prefetchnta [esi + (200 * 64 / 34 + 192)]; - start reading ahead - - movq mm0, [esi + 0]; - read 64 bits - movq mm1, [esi + 8] - movq [edi + 0], mm0; - write 64 bits - movq [edi + 8], mm1; -note: the normal movq writes the - movq mm2, [esi + 16]; - data to cache; - a cache line will be - movq mm3, [esi + 24]; - allocated as needed, to store the data - movq [edi + 16], mm2 - movq [edi + 24], mm3 - movq mm0, [esi + 32] - movq mm1, [esi + 40] - movq [edi + 32], mm0 - movq [edi + 40], mm1 - movq mm2, [esi + 48] - movq mm3, [esi + 56] - movq [edi + 48], mm2 - movq [edi + 56], mm3 - - add esi, 64; - update source pointer - add edi, 64; - update destination pointer - dec ecx; - count down - jnz $memcpy_ic_1; - last 64 - byte block ? - - $memcpy_ic_2 : - mov ecx, ebx; - has valid low 6 bits of the byte count -$memcpy_ic_3: - shr ecx, 2; - dword count - and ecx, 1111b; - only look at the "remainder" bits - neg ecx; - set up to jump into the array - add ecx, offset $memcpy_last_few - jmp ecx; - jump to array of movsds - -$memcpy_uc_test: - cmp ecx, UNCACHED_COPY / 64; - big enough ? use block prefetch copy - jae $memcpy_bp_1 - - $memcpy_64_test : - or ecx, ecx; - tail end of block prefetch will jump here - jz $memcpy_ic_2; - no more 64 - byte blocks left - - // For larger blocks, which will spill beyond the cache, it's faster to - // use the Streaming Store instruction MOVNTQ. This write instruction - // bypasses the cache and writes straight to main memory. This code also - // uses the software prefetch instruction to pre-read the data. - align 16 -$memcpy_uc_1:; - 64 - byte blocks, uncached copy - - prefetchnta [esi + (200 * 64 / 34 + 192)]; - start reading ahead - - movq mm0, [esi + 0]; - read 64 bits - add edi, 64; - update destination pointer - movq mm1, [esi + 8] - add esi, 64; - update source pointer - movq mm2, [esi - 48] - movntq [edi - 64], mm0; - write 64 bits, bypassing the cache - movq mm0, [esi - 40]; -note: movntq also prevents the CPU - movntq [edi - 56], mm1; - from READING the destination address - movq mm1, [esi - 32]; - into the cache, only to be over - written - movntq [edi - 48], mm2; - so that also helps performance - movq mm2, [esi - 24] - movntq [edi - 40], mm0 - movq mm0, [esi - 16] - movntq [edi - 32], mm1 - movq mm1, [esi - 8] - movntq [edi - 24], mm2 - movntq [edi - 16], mm0 - dec ecx - movntq [edi - 8], mm1 - jnz $memcpy_uc_1; - last 64 - byte block ? - - jmp $memcpy_ic_2; - almost done - - // For the largest size blocks, a special technique called Block Prefetch - // can be used to accelerate the read operations. Block Prefetch reads - // one address per cache line, for a series of cache lines, in a short loop. - // This is faster than using software prefetch. The technique is great for - // getting maximum read bandwidth, especially in DDR memory systems. - $memcpy_bp_1 :; - large blocks, block prefetch copy - - cmp ecx, CACHEBLOCK; - big enough to run another prefetch loop ? - jl $memcpy_64_test; - no, back to regular uncached copy - - mov eax, CACHEBLOCK / 2; - block prefetch loop, unrolled 2X - add esi, CACHEBLOCK* 64; - move to the top of the block - align 16 - $memcpy_bp_2 : - mov edx, [esi - 64]; - grab one address per cache line - mov edx, [esi - 128]; - grab one address per cache line - sub esi, 128; - go reverse order to suppress HW prefetcher - dec eax; - count down the cache lines - jnz $memcpy_bp_2; - keep grabbing more lines into cache - - mov eax, CACHEBLOCK; - now that its in cache, do - { - the copy - align 16 -$memcpy_bp_3: - movq mm0, [esi ]; - } read 64 bits - movq mm1, [esi + 8] - movq mm2, [esi + 16] - movq mm3, [esi + 24] - movq mm4, [esi + 32] - movq mm5, [esi + 40] - movq mm6, [esi + 48] - movq mm7, [esi + 56] - add esi, 64; - update source pointer - movntq [edi ], mm0; - write 64 bits, bypassing cache - movntq [edi + 8], mm1; -note: movntq also prevents the CPU - movntq [edi + 16], mm2; - from READING the destination address - movntq [edi + 24], mm3; - into the cache, only to be over - written, - movntq [edi + 32], mm4; - so that also helps performance - movntq [edi + 40], mm5 - movntq [edi + 48], mm6 - movntq [edi + 56], mm7 - add edi, 64; - update dest pointer - - dec eax; - count down - - jnz $memcpy_bp_3; - keep copying - sub ecx, CACHEBLOCK; - update the 64 - byte block count - jmp $memcpy_bp_1; - keep processing chunks - - // The smallest copy uses the X86 "movsd" instruction, in an optimized - // form which is an "unrolled loop". Then it handles the last few bytes. - align 4 - movsd - movsd; - perform last 1 - 15 dword copies - movsd - movsd - movsd - movsd - movsd - movsd - movsd - movsd; - perform last 1 - 7 dword copies - movsd - movsd - movsd - movsd - movsd - movsd - -$memcpy_last_few:; - dword aligned from before movsds - mov ecx, ebx; - has valid low 2 bits of the byte count - and ecx, 11b; - the last few cows must come home - jz $memcpy_final; - no more, lets leave - rep movsb; - the last 1, 2, or 3 bytes - -$memcpy_final: - emms; - clean up the MMX state - sfence; - flush the write buffer - // mov eax, [dest] ; ret value = destination pointer - } - } - else - { - memcpy(Dst, Src, Count); - } -} - -inline void cryPrefetch(const void* Src, int nCount) -{ - nCount >>= 6; - if (nCount > 0) - { - _asm - { - mov esi, Src; - mov ecx, nCount; -mPr0: - align 16 - dec ecx; - mov eax, [esi]; - mov eax, 0; - lea esi, [esi + 40h]; - jne mPr0; - } - } - else - { - _asm - { - mov esi, Src; - mov ecx, nCount; -mPr1: - align 16 - inc ecx; - mov eax, [esi]; - mov eax, 0; - lea esi, [esi - 40h]; - jne mPr1; - } - } -} - -inline void cryMemcpy (void* inDst, const void* inSrc, int nCount, int nFlags) -{ - cryMemcpy(inDst, inSrc, nCount); -} - -//========================================================================================== -// SSE optimizations - - -#else - -const int PREFNTA_BLOCK = 0x4000; - -ILINE void cryMemcpy(void* Dst, const void* Src, int n) -{ - char* dst = (char*)Dst; - char* src = (char*)Src; - while (n > PREFNTA_BLOCK) - { - _MM_PREFETCH_LOOP(PREFNTA_BLOCK, src, _MM_HINT_NTA); - - memcpy(dst, src, PREFNTA_BLOCK); - src += PREFNTA_BLOCK; - dst += PREFNTA_BLOCK; - n -= PREFNTA_BLOCK; - } - _MM_PREFETCH_LOOP(n, src, _MM_HINT_NTA); - memcpy(dst, src, n); -} - -ILINE void cryMemcpy(void* Dst, const void* Src, int n, [[maybe_unused]] int nFlags) -{ - char* dst = (char*)Dst; - char* src = (char*)Src; - while (n > PREFNTA_BLOCK) - { - _MM_PREFETCH_LOOP(PREFNTA_BLOCK, src, _MM_HINT_NTA); - memcpy(dst, src, PREFNTA_BLOCK); - src += PREFNTA_BLOCK; - dst += PREFNTA_BLOCK; - n -= PREFNTA_BLOCK; - } - _MM_PREFETCH_LOOP(n, src, _MM_HINT_NTA); - memcpy(dst, src, n); -} - - -#endif - - -#if defined(AZ_RESTRICTED_PLATFORM) - #define AZ_RESTRICTED_SECTION MEMORYACCESS_H_SECTION_CRYPREFETCH - #include AZ_RESTRICTED_FILE(MemoryAccess_h) -#endif -#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED) -#undef AZ_RESTRICTED_SECTION_IMPLEMENTED -#else -//implement something usual to bring one memory location into L1 data cache -ILINE void CryPrefetch(const void* const cpSrc) -{ - cryPrefetchT0SSE(cpSrc); -} -#endif - -#define CryPrefetchInl CryPrefetch diff --git a/Code/Legacy/CryCommon/Mocks/ICVarMock.h b/Code/Legacy/CryCommon/Mocks/ICVarMock.h index 9fad05cc35..08f4471ad1 100644 --- a/Code/Legacy/CryCommon/Mocks/ICVarMock.h +++ b/Code/Legacy/CryCommon/Mocks/ICVarMock.h @@ -36,9 +36,6 @@ public: MOCK_CONST_METHOD0(IsConstCVar, bool()); MOCK_METHOD1(SetOnChangeCallback, void(ConsoleVarFunc)); MOCK_METHOD1(AddOnChangeFunctor, uint64(const SFunctor& pChangeFunctor)); - MOCK_CONST_METHOD0(GetNumberOfOnChangeFunctors, uint64()); - MOCK_CONST_METHOD1(GetOnChangeFunctor, const SFunctor&(uint64)); - MOCK_METHOD1(RemoveOnChangeFunctor, bool(uint64)); MOCK_CONST_METHOD0(GetOnChangeCallback, ConsoleVarFunc()); MOCK_CONST_METHOD1(GetMemoryUsage, void(class ICrySizer* pSizer)); MOCK_CONST_METHOD0(GetRealIVal, int()); diff --git a/Code/Legacy/CryCommon/Mocks/IConsoleMock.h b/Code/Legacy/CryCommon/Mocks/IConsoleMock.h index b416aa5f11..9c947b9c0f 100644 --- a/Code/Legacy/CryCommon/Mocks/IConsoleMock.h +++ b/Code/Legacy/CryCommon/Mocks/IConsoleMock.h @@ -69,13 +69,6 @@ public: MOCK_METHOD1(SetInputLine, void (const char* szLine)); MOCK_METHOD1(DumpKeyBinds, void (IKeyBindDumpSink * pCallback)); MOCK_CONST_METHOD1(FindKeyBind, const char*(const char* sCmd)); - MOCK_METHOD0(GetNumCheatVars, int ()); - MOCK_METHOD2(SetCheatVarHashRange, void (size_t firstVar, size_t lastVar)); - MOCK_METHOD0(CalcCheatVarHash, void ()); - MOCK_METHOD0(IsHashCalculated, bool ()); - MOCK_METHOD0(GetCheatVarHash, uint64 ()); - MOCK_METHOD1(PrintCheatVars, void (bool bUseLastHashRange)); - MOCK_METHOD1(GetCheatVarAt, char* (uint32 nOffset)); MOCK_METHOD1(AddConsoleVarSink, void (IConsoleVarSink * pSink)); MOCK_METHOD1(RemoveConsoleVarSink, void (IConsoleVarSink * pSink)); MOCK_METHOD1(GetHistoryElement, const char*(bool bUpOrDown)); diff --git a/Code/Legacy/CryCommon/Mocks/ITextureMock.h b/Code/Legacy/CryCommon/Mocks/ITextureMock.h index 1a9bca9082..8dc657195c 100644 --- a/Code/Legacy/CryCommon/Mocks/ITextureMock.h +++ b/Code/Legacy/CryCommon/Mocks/ITextureMock.h @@ -20,154 +20,6 @@ public: int()); MOCK_METHOD0(ReleaseForce, int()); - MOCK_CONST_METHOD0(GetClearColor, - const ColorF& ()); - MOCK_CONST_METHOD0(GetDstFormat, - const ETEX_Format()); - MOCK_CONST_METHOD0(GetSrcFormat, - const ETEX_Format()); - MOCK_CONST_METHOD0(GetTexType, - const ETEX_Type()); - MOCK_METHOD2(ApplyTexture, - void(int, int)); MOCK_CONST_METHOD0(GetName, const char*()); - MOCK_CONST_METHOD0(GetWidth, - const int()); - MOCK_CONST_METHOD0(GetHeight, - const int()); - MOCK_CONST_METHOD0(GetDepth, - const int()); - MOCK_CONST_METHOD0(GetTextureID, - const int()); - MOCK_CONST_METHOD0(GetFlags, - const uint32()); - MOCK_CONST_METHOD0(GetNumMips, - const int()); - MOCK_CONST_METHOD0(GetRequiredMip, - const int()); - MOCK_CONST_METHOD0(GetDeviceDataSize, - const int()); - MOCK_CONST_METHOD0(GetDataSize, - const int()); - MOCK_CONST_METHOD0(GetTextureType, - const ETEX_Type()); - MOCK_METHOD1(SetTextureType, - void(ETEX_Type type)); - MOCK_CONST_METHOD0(IsTextureLoaded, - const bool()); - MOCK_METHOD4(PrecacheAsynchronously, - void(float, int, int, int)); - MOCK_METHOD4(GetData32, - uint8 * (int nSide, int nLevel, uint8 * pDst, ETEX_Format eDstFormat)); - MOCK_METHOD1(SetFilter, - bool(int nFilter)); - MOCK_METHOD1(SetClamp, - void(bool bEnable)); - MOCK_CONST_METHOD0(GetAvgBrightness, - float()); - MOCK_CONST_METHOD1(StreamCalculateMipsSigned, - int(float fMipFactor)); - MOCK_CONST_METHOD0(GetStreamableMipNumber, - int()); - MOCK_CONST_METHOD1(GetStreamableMemoryUsage, - int(int nStartMip)); - MOCK_CONST_METHOD0(GetMinLoadedMip, - int()); - MOCK_METHOD2(Readback, - void(AZ::u32 subresourceIndex, StagingHook callback)); - MOCK_METHOD0(Reload, - bool()); - MOCK_CONST_METHOD0(GetFormatName, - const char*()); - MOCK_CONST_METHOD0(GetTypeName, - const char*()); - MOCK_CONST_METHOD0(IsStreamedVirtual, - const bool()); - MOCK_CONST_METHOD0(IsShared, - const bool()); - MOCK_CONST_METHOD0(IsStreamable, - const bool()); - MOCK_CONST_METHOD1(IsStreamedIn, - bool(const int nMinPrecacheRoundIds[2])); - MOCK_CONST_METHOD0(GetAccessFrameId, - const int()); - MOCK_CONST_METHOD0(GetTextureDstFormat, - const ETEX_Format()); - MOCK_CONST_METHOD0(GetTextureSrcFormat, - const ETEX_Format()); - MOCK_CONST_METHOD0(IsPostponed, - bool()); - MOCK_CONST_METHOD1(IsParticularMipStreamed, - const bool(float fMipFactor)); - MOCK_METHOD3(GetLowResSystemCopy, - const ColorB * (uint16 & nWidth, uint16 & nHeight, int** ppLowResSystemCopyAtlasId)); - MOCK_METHOD1(SetKeepSystemCopy, - void(bool bKeepSystemCopy)); - MOCK_METHOD8(UpdateTextureRegion, - void(const uint8_t * data, int nX, int nY, int nZ, int USize, int VSize, int ZSize, ETEX_Format eTFSrc)); - MOCK_CONST_METHOD0(GetDevTexture, - CDeviceTexture * ()); -}; - -class ITextureLoadHandlerMock - : public ITextureLoadHandler -{ -public: - MOCK_METHOD2(LoadTextureData, - bool(const char* path, STextureLoadData & loadData)); - MOCK_CONST_METHOD1(SupportsExtension, - bool(const char* ext)); - MOCK_METHOD0(Update, - void()); -}; - -class IDynTextureMock - : public IDynTexture -{ -public: - MOCK_METHOD0(Release, - void()); - MOCK_METHOD4(GetSubImageRect, - void(uint32 & nX, uint32 & nY, uint32 & nWidth, uint32 & nHeight)); - MOCK_METHOD4(GetImageRect, - void(uint32 & nX, uint32 & nY, uint32 & nWidth, uint32 & nHeight)); - MOCK_METHOD0(GetTextureID, - int()); - MOCK_METHOD0(Lock, - void()); - MOCK_METHOD0(UnLock, - void()); - MOCK_METHOD0(GetWidth, - int()); - MOCK_METHOD0(GetHeight, - int()); - MOCK_METHOD0(IsValid, - bool()); - MOCK_CONST_METHOD0(GetFlags, - uint8()); - MOCK_METHOD1(SetFlags, - void(uint8 flags)); - MOCK_METHOD2(Update, - bool(int nNewWidth, int nNewHeight)); - MOCK_METHOD2(Apply, - void(int, int)); - MOCK_METHOD0(ClearRT, - bool()); - MOCK_METHOD4(SetRT, - bool(int nRT, bool bPush, struct SDepthTexture* pDepthSurf, bool bScreenVP)); - MOCK_METHOD0(SetRectStates, - bool()); - MOCK_METHOD2(RestoreRT, - bool(int nRT, bool bPop)); - MOCK_METHOD0(GetTexture, - ITexture * ()); - MOCK_METHOD0(SetUpdateMask, - void()); - MOCK_METHOD0(ResetUpdateMask, - void()); - MOCK_METHOD0(IsSecondFrame, - bool()); - MOCK_METHOD2(GetImageData32, - bool(uint8 * pData, int nDataSize)); }; diff --git a/Code/Legacy/CryCommon/Options.h b/Code/Legacy/CryCommon/Options.h deleted file mode 100644 index 935c8bd371..0000000000 --- a/Code/Legacy/CryCommon/Options.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Facilities for defining and combining general-purpose or specific options, for functions or structs. - - -#ifndef CRYINCLUDE_CRYCOMMON_OPTIONS_H -#define CRYINCLUDE_CRYCOMMON_OPTIONS_H -#pragma once - - -// Facilities for collecting options in a struct, and quickly constructing them. -// Used, for example, as construction argument. Safer and more informative than bool arguments. -// -// Example: -// struct FObjectOpts; -// struct CObject { CObject(FObjectOpts = ZERO); }; -// CObject object_def(); -// CObject object( FObjectOpts().Size(8).AllowGrowth(true) ); - -template -struct TOptVar -{ - typedef T TValue; - - TOptVar() - : _val(T(NInit)) - { - offset(this); - } - TOptVar(T val) - : _val(val) {} - - operator T () const - { - return _val; - } - T operator ()() const - { return _val; } - T operator +() const - { return _val; } - bool operator !() const - { return !_val; } - - TContainer& operator()(T val) - { - _val = val; - return *(TContainer*)((char*)this - offset()); - } - -private: - T _val; - - static size_t offset(void* self = 0) - { - static size_t _offset = TContainer::static_offset(self); - return _offset; - } -}; - -#define OPT_STRUCT(TOpts) \ - typedef TOpts TThis; typedef uint TInt; \ - static size_t static_offset(void* var) { static void* _first = var; return (char*)var - (char*)_first; } \ - TOpts([[maybe_unused]] void* p = 0) {} \ - TOpts operator()() const { return TOpts(*this); } \ - -#define OPT_VAR(Type, Var) \ - enum E##Var {}; TOptVar Var; \ - -#define OPT_VAR_INIT(Type, Var, init) \ - enum E##Var {}; TOptVar Var; \ - -#define BIT_STRUCT(Struc, Int) \ - typedef Struc TThis; typedef Int TInt; \ - TInt Mask() const { return *(const TInt*)this; } \ - TInt& Mask() { return *(TInt*)this; } \ - Struc(TInt init = 0) { static_assert(sizeof(TThis) == sizeof(TInt)); Mask() = init; } \ - -#define BIT_VAR(Var) \ - TInt _##Var : 1; \ - bool Var() const { return _##Var; } \ - TThis& Var(bool val) { _##Var = val; return *this; } \ - -#endif // CRYINCLUDE_CRYCOMMON_OPTIONS_H diff --git a/Code/Legacy/CryCommon/StereoRendererBus.h b/Code/Legacy/CryCommon/StereoRendererBus.h deleted file mode 100644 index 370bbaef27..0000000000 --- a/Code/Legacy/CryCommon/StereoRendererBus.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once - -#include - -namespace AZ -{ - /// - /// The Stereo Renderer bus allows other systems to query various properties on the stereo renderer - /// - class StereoRendererBus - : public EBusTraits - { - public: - - ////////////////////////////////////////////////////////////////////////// - // EBus Traits - static const EBusHandlerPolicy HandlerPolicy = EBusHandlerPolicy::Multiple; - static const EBusAddressPolicy AddressPolicy = EBusAddressPolicy::Single; - using MutexType = AZStd::recursive_mutex; - ////////////////////////////////////////////////////////////////////////// - - virtual ~StereoRendererBus() {} - - /// - /// Return whether the renderer is rendering to the HMD - /// - /// @return True if rendering to the HMD - /// - virtual bool IsRenderingToHMD() { return false; } - - protected: - }; - - using StereoRendererRequestBus = EBus < StereoRendererBus >; -} diff --git a/Code/Legacy/CryCommon/StlUtils.h b/Code/Legacy/CryCommon/StlUtils.h index d7e5697593..4aafd4dd0e 100644 --- a/Code/Legacy/CryCommon/StlUtils.h +++ b/Code/Legacy/CryCommon/StlUtils.h @@ -9,14 +9,13 @@ // Description : Various convenience utility functions for STL and alike // Used in Animation subsystem, and in some tools -#ifndef CRYINCLUDE_CRYCOMMON_STLUTILS_H -#define CRYINCLUDE_CRYCOMMON_STLUTILS_H #pragma once #include #include #include #include +#include #if (defined(LINUX) || defined(APPLE)) #include "platform.h" @@ -527,58 +526,6 @@ namespace stl // typedef AZStd::unordered_map, stl::equality_string_insensitive > StringToIntHash; ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - // useful when the key is already the result of an hash function - // key needs to be convertible to size_t - ////////////////////////////////////////////////////////////////////////// - template - class hash_simple - { - public: - enum // parameters for hash table - { - bucket_size = 4, // 0 < bucket_size - min_buckets = 8 - };// min_buckets = 2 ^^ N, 0 < N - - size_t operator()(const Key& key) const - { - return size_t(key); - }; - bool operator()(const Key& key1, const Key& key2) const - { - return key1 < key2; - } - }; - - // simple hash class that has the avalanche property (a change in one bit affects all others) - // ... use this if you have uint32 key values! - class hash_uint32 - { - public: - enum // parameters for hash table - { - bucket_size = 4, // 0 < bucket_size - min_buckets = 8 // min_buckets = 2 ^^ N, 0 < N - }; - - ILINE size_t operator()(uint32 a) const - { - a = (a + 0x7ed55d16) + (a << 12); - a = (a ^ 0xc761c23c) ^ (a >> 19); - a = (a + 0x165667b1) + (a << 5); - a = (a + 0xd3a2646c) ^ (a << 9); - a = (a + 0xfd7046c5) + (a << 3); - a = (a ^ 0xb55a4f09) ^ (a >> 16); - return a; - }; - bool operator()(uint32 key1, uint32 key2) const - { - return key1 < key2; - } - }; - - ////////////////////////////////////////////////////////////////////////// //! Case sensitive string hash ////////////////////////////////////////////////////////////////////////// @@ -655,130 +602,6 @@ namespace stl } }; - - // Support for both Microsoft and SGI kind of hash_map. - -#if defined(_STLP_HASH_MAP) || defined(APPLE) || defined(LINUX) - // STL Port - template > - struct hash_compare - { - enum - { // parameters for hash table - bucket_size = 4, // 0 < bucket_size - min_buckets = 8 // min_buckets = 2 ^^ N, 0 < N - }; - - size_t operator()(const _Key& _Keyval) const - { - // return hash value. - uint32 a = _Keyval; - a = (a + 0x7ed55d16) + (a << 12); - a = (a ^ 0xc761c23c) ^ (a >> 19); - a = (a + 0x165667b1) + (a << 5); - a = (a + 0xd3a2646c) ^ (a << 9); - a = (a + 0xfd7046c5) + (a << 3); - a = (a ^ 0xb55a4f09) ^ (a >> 16); - return a; - } - - // Less then function. - bool operator()(const _Key& _Keyval1, const _Key& _Keyval2) const - { // test if _Keyval1 ordered before _Keyval2 - _Predicate comp; - return (comp(_Keyval1, _Keyval2)); - } - }; - - template - struct stlport_hash_equal - { - // Equal function. - bool operator()(const Key& k1, const Key& k2) const - { - HashFunc less; - // !(k1 < k2) && !(k2 < k1) - return !less(k1, k2) && !less(k2, k1); - } - }; - - template , class Alloc = std::allocator< std::pair > > - struct hash_map - : public std__hash_map, Alloc> - { - hash_map() - : std__hash_map, Alloc>(HashFunc::min_buckets) {} - }; - - template , class Alloc = std::allocator< std::pair > > - struct hash_multimap - : public std__hash_multimap, Alloc> - { - hash_multimap() - : std__hash_multimap, Alloc>(HashFunc::min_buckets) {} - }; -#endif - - ////////////////////////////////////////////////////////////////////////// - template - class intrusive_linked_list_node - { - public: - intrusive_linked_list_node() { link_to_intrusive_list(static_cast(this)); } - // Not virtual by design - ~intrusive_linked_list_node() { unlink_from_intrusive_list(static_cast(this)); } - - static T* get_intrusive_list_root() { return m_root_intrusive; }; - - static void link_to_intrusive_list(T* pNode) - { - if (m_root_intrusive) - { - // Add to the beginning of the list. - T* head = m_root_intrusive; - pNode->m_prev_intrusive = 0; - pNode->m_next_intrusive = head; - head->m_prev_intrusive = pNode; - m_root_intrusive = pNode; - } - else - { - m_root_intrusive = pNode; - pNode->m_prev_intrusive = 0; - pNode->m_next_intrusive = 0; - } - } - static void unlink_from_intrusive_list(T* pNode) - { - if (pNode == m_root_intrusive) // if head of list. - { - m_root_intrusive = pNode->m_next_intrusive; - if (m_root_intrusive) - { - m_root_intrusive->m_prev_intrusive = 0; - } - } - else - { - if (pNode->m_prev_intrusive) - { - pNode->m_prev_intrusive->m_next_intrusive = pNode->m_next_intrusive; - } - if (pNode->m_next_intrusive) - { - pNode->m_next_intrusive->m_prev_intrusive = pNode->m_prev_intrusive; - } - } - pNode->m_next_intrusive = 0; - pNode->m_prev_intrusive = 0; - } - - public: - static T* m_root_intrusive; - T* m_next_intrusive; - T* m_prev_intrusive; - }; - template inline void reconstruct(T& t) { @@ -860,30 +683,6 @@ namespace stl } }; - template - struct scoped_set - { - scoped_set(T& ref, T val) - : m_ref(&ref) - , m_oldVal(ref) - { - ref = val; - } - - ~scoped_set() - { - (*m_ref) = m_oldVal; - } - - private: - scoped_set(const scoped_set& other); - scoped_set& operator = (const scoped_set& other); - - private: - T* m_ref; - T m_oldVal; - }; - template inline void for_each_array(T (&buffer)[Length], Func func) { @@ -910,64 +709,6 @@ namespace stl template<> \ Class * stl::intrusive_linked_list_node::m_root_intrusive = nullptr; - -// Performs a less-than compare on a serial sequence space, such that earlier values compare less-than later values. -// Unlike a normal integral value, this accounts for overflowing the limit of the underlying type. -// For example, assuming a 2-bit unsigned underlying type (with possible values 0, 1, 2 and 3), the following will hold: 0 < 1 && 1 < 2 && 2 < 3 && 3 < 0 -// Assuming two equal values V1 and V2, V2 can be incremented up to "(2 ^ (bits - 1) - 1)" times and V1 < V2 will continue to hold. -// See also RFC-1982 that documents this http://tools.ietf.org/html/rfc1982 -template -struct SSerialCompare -{ - static_assert(std::is_integral::value && std::is_unsigned::value, "T must be an unsigned integral type"); - - static const T limit = (T(1) << (sizeof(T) * 8 - 1)); - - bool operator()(T lhs, T rhs) - { - return ((lhs < rhs) && (rhs - lhs < limit)) || ((lhs > rhs) && (lhs - rhs > limit)); - } -}; - -template -unsigned sizeOfVP(Container& arr) -{ - int i; - unsigned size = 0; - for (i = 0; i < (int)arr.size(); i++) - { - typename Container::value_type& T = arr[i]; - size += T->Size(); - } - size += (arr.capacity() - arr.size()) * sizeof(typename Container::value_type); - return size; -} - -template -unsigned sizeOfV(Container& arr) -{ - int i; - unsigned size = 0; - for (i = 0; i < (int)arr.size(); i++) - { - typename Container::value_type& T = arr[i]; - size += T.Size(); - } - size += (arr.capacity() - arr.size()) * sizeof(typename Container::value_type); - return size; -} -template -unsigned sizeOfA(Container& arr) -{ - int i; - unsigned size = 0; - for (i = 0; i < arr.size(); i++) - { - typename Container::value_type& T = arr[i]; - size += T.Size(); - } - return size; -} // define the maplikestruct, used to approximate the memory requirements for a map node namespace stl { @@ -1027,5 +768,3 @@ unsigned sizeOfMapS(Map& map) size += map.size() * sizeof(stl::MapLikeStruct); return size; } - -#endif // CRYINCLUDE_CRYCOMMON_STLUTILS_H diff --git a/Code/Legacy/CryCommon/Tarray.h b/Code/Legacy/CryCommon/Tarray.h deleted file mode 100644 index 77c27f0ef8..0000000000 --- a/Code/Legacy/CryCommon/Tarray.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_TARRAY_H -#define CRYINCLUDE_CRYCOMMON_TARRAY_H -#pragma once - - -#include -#include -#include - -#ifndef CLAMP -#define CLAMP(X, mn, mx) ((X) < (mn) ? (mn) : ((X) < (mx) ? (X) : (mx))) -#endif - -#ifndef SATURATE -#define SATURATE(X) clamp_tpl(X, 0.f, 1.f) -#endif - -#ifndef SATURATEB -#define SATURATEB(X) CLAMP(X, 0, 255) -#endif - -#ifndef LERP -#define LERP(A, B, Alpha) ((A) + (Alpha) * ((B)-(A))) -#endif - -// Safe memory freeing -#ifndef SAFE_DELETE -#define SAFE_DELETE(p) { if (p) { delete (p); (p) = NULL; } \ -} -#endif - -#ifndef SAFE_DELETE_ARRAY -#define SAFE_DELETE_ARRAY(p) { if (p) { delete[] (p); (p) = NULL; } \ -} -#endif - -#ifndef SAFE_RELEASE -#define SAFE_RELEASE(p) { if (p) { (p)->Release(); (p) = NULL; } \ -} -#endif - -#ifndef SAFE_RELEASE_FORCE -#define SAFE_RELEASE_FORCE(p) { if (p) { (p)->ReleaseForce(); (p) = NULL; } \ -} -#endif - -#endif // CRYINCLUDE_CRYCOMMON_TARRAY_H diff --git a/Code/Legacy/CryCommon/TimeValue.h b/Code/Legacy/CryCommon/TimeValue.h index abe37c8608..14f402eb3d 100644 --- a/Code/Legacy/CryCommon/TimeValue.h +++ b/Code/Legacy/CryCommon/TimeValue.h @@ -164,8 +164,6 @@ public: ILINE bool operator==(const CTimeValue& inRhs) const { return m_lValue == inRhs.m_lValue; }; ILINE bool operator!=(const CTimeValue& inRhs) const { return m_lValue != inRhs.m_lValue; }; - AUTO_STRUCT_INFO - void GetMemoryStatistics(class ICrySizer*) const { /*nothing*/} private: // ---------------------------------------------------------- diff --git a/Code/Legacy/CryCommon/TimeValue_info.h b/Code/Legacy/CryCommon/TimeValue_info.h deleted file mode 100644 index 4de34e7997..0000000000 --- a/Code/Legacy/CryCommon/TimeValue_info.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_TIMEVALUE_INFO_H -#define CRYINCLUDE_CRYCOMMON_TIMEVALUE_INFO_H -#pragma once - -#include "TimeValue.h" - -STRUCT_INFO_BEGIN(CTimeValue) -STRUCT_VAR_INFO(m_lValue, TYPE_INFO(int64)) -STRUCT_INFO_END(CTimeValue) - - -#endif // CRYINCLUDE_CRYCOMMON_TIMEVALUE_INFO_H diff --git a/Code/Legacy/CryCommon/TypeInfo_decl.h b/Code/Legacy/CryCommon/TypeInfo_decl.h deleted file mode 100644 index 28a0b370a9..0000000000 --- a/Code/Legacy/CryCommon/TypeInfo_decl.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Macros and other definitions needed for TypeInfo declarations. - - -#ifndef CRYINCLUDE_CRYCOMMON_TYPEINFO_DECL_H -#define CRYINCLUDE_CRYCOMMON_TYPEINFO_DECL_H -#pragma once - -#include -#include - -////////////////////////////////////////////////////////////////////////// -// Meta-type support. -////////////////////////////////////////////////////////////////////////// - -// Currently enable type info for all platforms. -#if !defined(ENABLE_TYPE_INFO) -#define ENABLE_TYPE_INFO -#endif -#ifdef ENABLE_TYPE_INFO - -struct CTypeInfo; - -// If TypeInfo exists for T, it is accessed via TypeInfo(T*). -// Default TypeInfo() is implemented by a struct member function. -template -inline const CTypeInfo& TypeInfo(const T* t) -{ - return t->TypeInfo(); -} - -// Declare a class's TypeInfo member -#define STRUCT_INFO \ - const CTypeInfo&TypeInfo() const; - -#define NULL_STRUCT_INFO \ - const CTypeInfo&TypeInfo() const { return *(CTypeInfo*)0; } - -// Declare an override for a type without TypeInfo() member (e.g. basic type) -#define DECLARE_TYPE_INFO(Type) \ - template<> \ - const CTypeInfo&TypeInfo(const Type*); - -// Template version. -#define DECLARE_TYPE_INFO_T(Type) \ - template \ - const CTypeInfo&TypeInfo(const Type*); - -// Type info declaration, with additional prototypes for string conversions. -#define BASIC_TYPE_INFO(Type) \ - AZStd::string ToString(Type const & val); \ - bool FromString(Type & val, const char* s); \ - DECLARE_TYPE_INFO(Type) - -#define CUSTOM_STRUCT_INFO(Struct) \ - const CTypeInfo&TypeInfo() const \ - { static Struct Info; return Info; } - -#else // ENABLE_TYPE_INFO - -#define STRUCT_INFO -#define NULL_STRUCT_INFO -#define DECLARE_TYPE_INFO(Type) -#define DECLARE_TYPE_INFO_T(Type) -#define BASIC_TYPE_INFO(T) - -#endif // ENABLE_TYPE_INFO - -// Specify automatic tool generation of TypeInfo bodies. -#define AUTO_STRUCT_INFO STRUCT_INFO -#define AUTO_TYPE_INFO DECLARE_TYPE_INFO -#define AUTO_TYPE_INFO_T DECLARE_TYPE_INFO_T - -// Obsolete "LOCAL" versions (all infos now generated in local files). -#define AUTO_STRUCT_INFO_LOCAL STRUCT_INFO -#define AUTO_TYPE_INFO_LOCAL DECLARE_TYPE_INFO -#define AUTO_TYPE_INFO_LOCAL_T DECLARE_TYPE_INFO_T - -// Overrides for basic types. -DECLARE_TYPE_INFO(void) - -BASIC_TYPE_INFO(bool) -BASIC_TYPE_INFO(char) -BASIC_TYPE_INFO(wchar_t) -BASIC_TYPE_INFO(signed char) -BASIC_TYPE_INFO(unsigned char) -BASIC_TYPE_INFO(short) -BASIC_TYPE_INFO(unsigned short) -BASIC_TYPE_INFO(int) -BASIC_TYPE_INFO(unsigned int) -BASIC_TYPE_INFO(long) -BASIC_TYPE_INFO(unsigned long) -BASIC_TYPE_INFO(int64) -BASIC_TYPE_INFO(uint64) - -BASIC_TYPE_INFO(float) -BASIC_TYPE_INFO(double) - -BASIC_TYPE_INFO(AZ::Uuid) - -DECLARE_TYPE_INFO(AZStd::string) - -// All pointers share same TypeInfo. -const CTypeInfo&PtrTypeInfo(); -template -inline const CTypeInfo& TypeInfo([[maybe_unused]] T** t) -{ - return PtrTypeInfo(); -} - - -#endif // CRYINCLUDE_CRYCOMMON_TYPEINFO_DECL_H diff --git a/Code/Legacy/CryCommon/TypeInfo_impl.h b/Code/Legacy/CryCommon/TypeInfo_impl.h deleted file mode 100644 index 9c4bb6bca7..0000000000 --- a/Code/Legacy/CryCommon/TypeInfo_impl.h +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Declaration of CTypeInfo, and other things to access meta-type info. - - -#ifndef CRYINCLUDE_CRYCOMMON_TYPEINFO_IMPL_H -#define CRYINCLUDE_CRYCOMMON_TYPEINFO_IMPL_H -#pragma once - - -#include "CryCustomTypes.h" - -#define ENABLE_TYPE_INFO_NAMES 1 - -//--------------------------------------------------------------------------- -// DECLARATION MACROS -// Used to construct meta TypeInfo objects in AutoTypeInfo files. -// Two possible levels of TypeInfo: default, with size and offset info only, allowing Endian conversion; -// and full, with string, attr, and enum info, allowing UI and serialisation. -// The full version is selected by the ENABLE_TYPE_INFO_NAMES macro. - -#ifdef ENABLE_TYPE_INFO - - #ifndef ENABLE_TYPE_INFO_NAMES -// This symbol must be defined only once per module. - #define ENABLE_TYPE_INFO_NAMES 0 - #endif - - #if ENABLE_TYPE_INFO_NAMES - #define TYPE_INFO_NAME(n) #n - #else - #define TYPE_INFO_NAME(n) "" - #endif - #define TYPE_INFO_NAME_T(n) #n "<>" - -// Set of template functions for automatically returning the base element type for any scalar or array variable. - -template -inline T& ElemType(T* at) -{ return *at; } - -template -inline T& ElemType(T (*at)[N]) -{ return **at; } - -template -inline T& ElemType(T (*at)[N][N2]) -{ return ***at; } - -template -inline T& ElemType(T (*at)[N][N2][N3]) -{ return ****at; } - -template -inline T& ValType([[maybe_unused]] T t) -{ static T _t; return _t; } - -//--------------------------------------------------------------------------- -// Macros for constructing StructInfos (invoked by AutoTypeInfo.h) - - #define DEFINE_TYPE_INFO(T, Type, Args) \ - template<> \ - const CTypeInfo&TypeInfo(const T*) \ - { static Type Info Args; return Info; } \ - - #define STRUCT_INFO_EMPTY_BODY(T) \ - { \ - static CStructInfo Info(#T, sizeof(T), alignof(T)); \ - return Info; \ - } \ - - #define STRUCT_INFO_EMPTY(T) \ - const CTypeInfo&T::TypeInfo() const \ - STRUCT_INFO_EMPTY_BODY(T) \ - - #define STRUCT_INFO_T_EMPTY(T, Key, Arg) \ - template \ - STRUCT_INFO_EMPTY(T) - - #define STRUCT_INFO_TYPE_EMPTY(T) \ - DEFINE_TYPE_INFO(T, CStructInfo, (#T, sizeof(T), alignof(T))) - - #define STRUCT_INFO_TYPE_T_EMPTY(T, TArgs, TDecl) \ - template TDecl const CTypeInfo&TypeInfo(const T TArgs*) \ - STRUCT_INFO_EMPTY_BODY(T TArgs) \ - -// Define TypeInfo for a primitive type, without string conversion. - #define TYPE_INFO_PLAIN(T) DEFINE_TYPE_INFO(T, CTypeInfo, (#T, sizeof(T), alignof(T))) - -// Define TypeInfo for a basic type (undecomposable as far as TypeInfo cares), with external string converters. - #define TYPE_INFO_BASIC(T) DEFINE_TYPE_INFO(T, TTypeInfo, (#T)) - -// Variant for int types, allowing conversion between sizes. - #define TYPE_INFO_INT(T) DEFINE_TYPE_INFO(T, TIntTypeInfo, (#T)) - - #define STRUCT_INFO_BEGIN(T) \ - const CTypeInfo&T::TypeInfo() const { \ - static CStructInfo::CVarInfo Vars[] = { \ - - #define STRUCT_INFO_END(T) \ - }; \ - static CStructInfo Info(#T, sizeof(T), alignof(T), ARRAY_VAR(Vars)); \ - return Info; \ - } - - #define BASE_INFO_ATTRS(BaseType, Attrs) \ - { ::TypeInfo((const BaseType*)this), "", Attrs, uint32((char*)static_cast(this) - (char*)this), 1, 1, 0, 0, 0 }, - - #define BASE_INFO(BaseType) BASE_INFO_ATTRS(BaseType, "") - - #define ALIAS_INFO_ATTRS(AliasName, VarName, Attrs) \ - { ::TypeInfo(&ElemType(&VarName)), TYPE_INFO_NAME(AliasName), Attrs, uint32((char*)&VarName - (char*)this), sizeof(VarName) / sizeof(ElemType(&VarName)), 0, 0, 0, 0 }, - - #define ALIAS_INFO_STRINGNAME_ATTR(AliasStringName, VarName, Attrs) \ - { ::TypeInfo(&ElemType(&VarName)), AliasStringName, Attrs, uint32((char*)&VarName - (char*)this), sizeof(VarName) / sizeof(ElemType(&VarName)), 0, 0, 0, 0 }, - - #define VAR_INFO_ATTRS(VarName, Attrs) \ - ALIAS_INFO_ATTRS(VarName, VarName, Attrs) - - #define VAR_INFO(VarName) \ - VAR_INFO_ATTRS(VarName, "") - - #define ALIAS_INFO(AliasName, VarName) \ - ALIAS_INFO_ATTRS(AliasName, VarName, "") - - #define ATTRS_INFO(Attrs) \ - { ::TypeInfo((void*)0), "", Attrs, 0, 0, 0, 0, 0, 0 }, - - #define BITFIELD_INFO(VarName, Bits) \ - { ::TypeInfo(&ValType(VarName)), TYPE_INFO_NAME(VarName), "", 0, Bits, 0, 1, 0, 0 }, - -// Conversion macros for older system. - #define STRUCT_BASE_INFO(BaseType) BASE_INFO(BaseType) - #define STRUCT_VAR_INFO(VarName, InfoName) VAR_INFO(VarName) - #define STRUCT_BITFIELD_INFO(VarName, VarType, Bits) BITFIELD_INFO(VarName, Bits) - -// Template versions - -template -Array TypeInfoArray1(T const* pt) -{ - static CTypeInfo const* s_info = &::TypeInfo(pt); - return ArrayT(&s_info, 1); -} - - #define STRUCT_INFO_T_BEGIN(T, Key, Arg) \ - template \ - STRUCT_INFO_BEGIN(T) - - #define STRUCT_INFO_T_END(T, Key, Arg) \ - }; \ - static CStructInfo Info(#T "<>", sizeof(T), alignof(T), ARRAY_VAR(Vars), TypeInfoArray1((Arg*)0)); \ - return Info; \ - } - - #define STRUCT_INFO_T2_BEGIN(T, Key1, Arg1, Key2, Arg2) \ - template \ - const CTypeInfo&T::TypeInfo() const { \ - typedef T TThis; \ - static CStructInfo::CVarInfo Vars[] = { \ - - #define STRUCT_INFO_T2_END(T, Key1, Arg1, Key2, Arg2) \ - }; \ - static CTypeInfo const* TemplateTypes[] = { &::TypeInfo((Arg1*)0), &::TypeInfo((Arg2*)0) }; \ - static CStructInfo Info(#T "<,>", sizeof(TThis), alignof(TThis), ARRAY_VAR(Vars), ARRAY_VAR(TemplateTypes)); \ - return Info; \ - } - - #define STRUCT_INFO_T_INSTANTIATE(T, TArgs) \ - template const CTypeInfo& T::TypeInfo() const; - -//--------------------------------------------------------------------------- -// Enum type info - - #if ENABLE_TYPE_INFO_NAMES - -// Enums represented as full CEnumInfo types, with string conversion. - #define ENUM_INFO_BEGIN(T) \ - template<> \ - const CTypeInfo&TypeInfo(const T*) { \ - static CEnumDef::SElem Elems[] = { \ - - #define ENUM_INFO_END(T) \ - }; \ - typedef TIntType::TType TInt; \ - static CEnumInfo Info(#T, ARRAY_VAR(Elems)); \ - return Info; \ - } \ - - #define ENUM_ELEM_INFO(Scope, Elem) \ - { Scope Elem, #Elem }, - - #else // ENABLE_TYPE_INFO_NAMES - -// Enums represented as simple types, with no elements or string conversion. - #define ENUM_INFO_BEGIN(T) \ - TYPE_INFO_PLAIN(T) \ - - #define ENUM_INFO_END(T) - #define ENUM_ELEM_INFO(Scope, Elem) - - #endif // ENABLE_TYPE_INFO_NAMES - -#endif // ENABLE_TYPE_INFO - -#endif // CRYINCLUDE_CRYCOMMON_TYPEINFO_IMPL_H diff --git a/Code/Legacy/CryCommon/VectorSet.h b/Code/Legacy/CryCommon/VectorSet.h deleted file mode 100644 index 15b05e62ef..0000000000 --- a/Code/Legacy/CryCommon/VectorSet.h +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : std::set replacement implemented using sorted vector. - - -#ifndef CRYINCLUDE_CRYCOMMON_VECTORSET_H -#define CRYINCLUDE_CRYCOMMON_VECTORSET_H -#pragma once - - -//-------------------------------------------------------------------------- -// VectorSet -// -// Usage Notes: -// This class is designed to be an (almost, see below) drop-in replacement -// for std::set. It features an almost identical interface, but it is -// implemented using a sorted vector rather than a tree. This is in most -// cases more efficient, as there is less dynamic memory allocation and -// pointer dereferencing. -// -// ************************************************************************* -// PLEASE NOTE: There is one vital difference between std::set and VectorSet -// that you will need to note before trying to replace std::set. Since -// VectorSet is implemented using a vector, iterators can and will be -// invalidated by many operations, such as insertions and deletions, and -// due to sorting potentially even normal lookups. Please Please PLEASE make -// sure that you are not storing any iterators to this class. -// ************************************************************************* -// -// The class varies from the std::set API in that two of the erase methods -// methods are not of void return type but return an iterator - this is -// required in practice because they invalidate iterators, as noted above. -// -// * iterator erase(iterator where); -// * iterator erase(iterator first, iterator last); -// -// It also adds operator[] to the API. -// -// -// Performance Notes: -// -// This class uses the empty base optimization hack to allow comparison -// predicate objects that have no state to take up no space in the object. -// As a result the size of the overall VectorMap instance is the same as -// that of the std::vector it uses to store the elements. -// -// In addition to the normal map interface, this class provides the -// following members that can be used to manage memory requirements: -// -// * void reserve(size_type count); -// Allocate enough space for count elements (see vector::reserve()). -// -// * size_type capacity() const; -// Report how many elements can be stored without reallocating (see -// vector::capacity()). -// -// * void resize(size_type new_size, const_reference x=key_type()); -// see vector::resize()). -// -//-------------------------------------------------------------------------- - -template , typename A = AZ::StdLegacyAllocator > -class VectorSet - : private T // Empty base optimization -{ -public: - typedef K key_type; - typedef A allocator_type; - typedef T key_compare; - typedef T value_compare; - typedef AZStd::vector container_type; - typedef typename container_type::iterator iterator; - typedef typename container_type::const_iterator const_iterator; - typedef typename container_type::reverse_iterator reverse_iterator; - typedef typename container_type::const_reverse_iterator const_reverse_iterator; - typedef typename container_type::size_type size_type; - typedef typename container_type::difference_type difference_type; - typedef key_type& reference; - typedef const key_type& const_reference; - typedef key_type* pointer; - typedef const key_type* const_pointer; - - VectorSet(); - explicit VectorSet(const key_compare& comp); - explicit VectorSet(const key_compare& comp, const allocator_type& allocator); - VectorSet(const VectorSet& right); - template - VectorSet(InputIterator first, InputIterator last); - template - VectorSet(InputIterator first, InputIterator last, const key_compare& comp); - template - VectorSet(InputIterator first, InputIterator last, const key_compare& comp, const allocator_type& allocator); - void SwapElementsWithVector(container_type& elementVector); - const_iterator begin() const; - iterator begin(); - size_type capacity() const; - void resize(size_type __new_size, const_reference __x = key_type()); - void clear(); - size_type count(const_reference key) const; - bool empty() const; - const_iterator end() const; - iterator end(); - std::pair equal_range(const_reference key) const; - std::pair equal_range(const_reference key); - iterator erase(iterator where); // See documentation above - iterator erase(iterator first, iterator last); // See documentation above - size_t erase(const_reference key); - iterator find(const_reference key); - const_iterator find(const_reference key) const; - allocator_type get_allocator() const; - std::pair insert(const_reference value); - iterator insert(iterator _Where, const_reference value); - template - void insert(InputIterator first, InputIterator last); - key_compare key_comp() const; - const_iterator lower_bound(const_reference key) const; - iterator lower_bound(const_reference key); - size_type max_size() const; - const_reverse_iterator rbegin() const; - reverse_iterator rbegin(); - const_reverse_iterator rend() const; - reverse_iterator rend(); - void reserve(size_type count); - size_type size() const; - void swap(VectorSet& right); - const_iterator upper_bound(const_reference key) const; - iterator upper_bound(const_reference key); - value_compare value_comp() const; - reference operator[](int index); // See documentation above - const_reference operator[](int index) const; // See documentation above - - template - void GetMemoryUsage(Sizer* pSizer) const - { - pSizer->AddObject(m_entries); - } -private: - container_type m_entries; -}; - -template -VectorSet::VectorSet() -{ -} - -template -VectorSet::VectorSet(const key_compare& comp) - : key_compare(comp) -{ -} - -template -VectorSet::VectorSet(const key_compare& comp, const allocator_type& allocator) - : key_compare(comp) - , m_entries(allocator) -{ -} - -template -VectorSet::VectorSet(const VectorSet& right) - : key_compare(right) - , m_entries(right.m_entries) -{ -} - -template -template -VectorSet::VectorSet(InputIterator first, InputIterator last) -{ - for (; first != last; ++first) - { - m_entries.push_back(*first); - } - std::sort(m_entries.begin(), m_entries.end(), static_cast(*this)); -} - -template -template -VectorSet::VectorSet(InputIterator first, InputIterator last, const key_compare& comp) - : key_compare(comp) -{ - for (; first != last; ++first) - { - m_entries.push_back(*first); - } - std::sort(m_entries.begin(), m_entries.end(), static_cast(*this)); -} - -template -template -VectorSet::VectorSet(InputIterator first, InputIterator last, const key_compare& comp, const allocator_type& allocator) - : key_compare(comp) - , m_entries(allocator) -{ - for (; first != last; ++first) - { - m_entries.push_back(*first); - } - std::sort(m_entries.begin(), m_entries.end(), static_cast(*this)); -} - -template -void VectorSet::SwapElementsWithVector(container_type& elementVector) -{ - m_entries.swap(elementVector); - std::sort(m_entries.begin(), m_entries.end(), static_cast(*this)); -} - -template -typename VectorSet::const_iterator VectorSet::begin() const -{ - return m_entries.begin(); -} - -template -typename VectorSet::iterator VectorSet::begin() -{ - return m_entries.begin(); -} - -template -typename VectorSet::size_type VectorSet::capacity() const -{ - return m_entries.capacity(); -} - -template -void VectorSet::clear() -{ - m_entries.clear(); -} - -template -void VectorSet::resize(size_type __new_size, const_reference __x) -{ - m_entries.resize(__new_size, __x); -} - -template -typename VectorSet::size_type VectorSet::count(const_reference key) const -{ - return size_type(std::binary_search(m_entries.begin(), m_entries.end(), key, static_cast(*this))); -} - -template -bool VectorSet::empty() const -{ - return m_entries.empty(); -} - -template -typename VectorSet::const_iterator VectorSet::end() const -{ - return m_entries.end(); -} - -template -typename VectorSet::iterator VectorSet::end() -{ - return m_entries.end(); -} - -template -std::pair::const_iterator, typename VectorSet::const_iterator> VectorSet::equal_range(const_reference key) const -{ - const_iterator lower = lower_bound(key); - if (lower != m_entries.end() && key_compare::operator()(key, *lower)) - { - lower = m_entries.end(); - } - const_iterator upper = lower; - if (upper != m_entries.end()) - { - ++upper; - } - return std::make_pair(lower, upper); -} - -template -std::pair::iterator, typename VectorSet::iterator> VectorSet::equal_range(const_reference key) -{ - iterator lower = lower_bound(key); - if (lower != m_entries.end() && key_compare::operator()(key, *lower)) - { - lower = m_entries.end(); - } - iterator upper = lower; - if (upper != m_entries.end()) - { - ++upper; - } - return std::make_pair(lower, upper); -} - -template -typename VectorSet::iterator VectorSet::erase(iterator where) -{ - return m_entries.erase(where); -} - -template -typename VectorSet::iterator VectorSet::erase(iterator first, iterator last) -{ - return m_entries.erase(first, last); -} - -template -size_t VectorSet::erase(const_reference key) -{ - iterator where = find(key); - - if (where != m_entries.end()) - { - // Note erasing entries does not invalidate the sort - no need to trigger a re-sort. - m_entries.erase(where); - return 1; - } - - return 0; -} - -template -typename VectorSet::iterator VectorSet::find(const_reference key) -{ - iterator it = lower_bound(key); - if (it != m_entries.end() && key_compare::operator()(key, *it)) - { - it = m_entries.end(); - } - return it; -} - -template -typename VectorSet::const_iterator VectorSet::find(const_reference key) const -{ - const_iterator it = lower_bound(key); - if (it != m_entries.end() && key_compare::operator()(key, *it)) - { - it = m_entries.end(); - } - return it; -} - -template -typename VectorSet::allocator_type VectorSet::get_allocator() const -{ - return m_entries.get_allocator(); -} - -template -std::pair::iterator, bool> VectorSet::insert(const_reference value) -{ - iterator it = lower_bound(value); - bool insertionMade = false; - if (it == m_entries.end() || key_compare::operator()(value, (*it))) - { - it = m_entries.insert(it, value), insertionMade = true; - } - return std::make_pair(it, insertionMade); -} - -template -typename VectorSet::iterator VectorSet::insert(iterator where, const_reference value) -{ - return insert(value); -} - -template -template -void VectorSet::insert(InputIterator first, InputIterator last) -{ - for (; first != last; ++first) - { - insert(*first); - } -} - -template -typename VectorSet::key_compare VectorSet::key_comp() const -{ - return static_cast(*this); -} - -template -typename VectorSet::const_iterator VectorSet::lower_bound(const_reference key) const -{ - return std::lower_bound(m_entries.begin(), m_entries.end(), key, static_cast(*this)); -} - -template -typename VectorSet::iterator VectorSet::lower_bound(const_reference key) -{ - return std::lower_bound(m_entries.begin(), m_entries.end(), key, static_cast(*this)); -} - -template -typename VectorSet::size_type VectorSet::max_size() const -{ - return m_entries.max_size(); -} - -template -typename VectorSet::const_reverse_iterator VectorSet::rbegin() const -{ - return m_entries.rbegin(); -} - -template -typename VectorSet::reverse_iterator VectorSet::rbegin() -{ - return m_entries.rbegin(); -} - -template -typename VectorSet::const_reverse_iterator VectorSet::rend() const -{ - return m_entries.rend(); -} - -template -typename VectorSet::reverse_iterator VectorSet::rend() -{ - return m_entries.rend(); -} - -template -void VectorSet::reserve(size_type count) -{ - m_entries.reserve(count); -} - -template -typename VectorSet::size_type VectorSet::size() const -{ - return m_entries.size(); -} - -template -void VectorSet::swap(VectorSet& other) -{ - m_entries.swap(other.m_entries); - std::swap(static_cast(*this), static_cast(other)); -} - -template -typename VectorSet::const_iterator VectorSet::upper_bound(const_reference key) const -{ - const_iterator upper = lower_bound(key); - if (upper != m_entries.end() && !key_compare::operator()(key, *upper)) - { - ++upper; - } - return upper; -} - -template -typename VectorSet::iterator VectorSet::upper_bound(const_reference key) -{ - iterator upper = lower_bound(key); - if (upper != m_entries.end() && !key_compare::operator()(key, *upper)) - { - ++upper; - } - return upper; -} - -template -typename VectorSet::value_compare VectorSet::value_comp() const -{ - return static_cast(*this); -} - -template -typename VectorSet::reference VectorSet::operator[](int index) -{ - return m_entries[index]; -} - -template -typename VectorSet::const_reference VectorSet::operator[](int index) const -{ - return m_entries[index]; -} - -#endif // CRYINCLUDE_CRYCOMMON_VECTORSET_H diff --git a/Code/Legacy/CryCommon/Vertex.h b/Code/Legacy/CryCommon/Vertex.h index b9e0b25d38..f4e8f71a56 100644 --- a/Code/Legacy/CryCommon/Vertex.h +++ b/Code/Legacy/CryCommon/Vertex.h @@ -9,6 +9,9 @@ #include #include #include +#include +#include + namespace AZ { namespace Vertex @@ -77,7 +80,7 @@ namespace AZ UInt32_4, NumTypes - }; + }; struct AttributeTypeData { @@ -127,15 +130,15 @@ namespace AZ return (static_cast(type) << kUsageBitCount) | static_cast(usage); } static AttributeUsage GetUsage(const uint8 attribute) - { + { return static_cast(attribute & kUsageMask); } static AttributeType GetType(const uint8 attribute) - { + { return static_cast((attribute & kTypeMask) >> kUsageBitCount); } static uint8 GetByteLength(const uint8 attribute) - { + { return AttributeTypeDataTable[(uint)GetType(attribute)].byteSize; } static const AZStd::string& GetSemanticName(uint8 attribute) @@ -167,126 +170,22 @@ namespace AZ AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); m_enum = eVF_P3F_C4B_T2F; break; - case eVF_P3F_C4B_T2F_T2F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - m_enum = eVF_P3F_C4B_T2F_T2F; - break; case eVF_P3S_C4B_T2S: AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float16_4));// vec3f16 is backed by a CryHalf4 AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float16_2)); m_enum = eVF_P3S_C4B_T2S; break; - case eVF_P3S_C4B_T2S_T2S: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float16_4));// vec3f16 is backed by a CryHalf4 - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float16_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float16_2)); - m_enum = eVF_P3S_C4B_T2S_T2S; - break; - case eVF_P3S_N4B_C4B_T2S: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float16_4));// vec3f16 is backed by a CryHalf4 - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Normal, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float16_2)); - m_enum = eVF_P3S_N4B_C4B_T2S; - break; - case eVF_P3F_C4B_T4B_N3F2: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Tangent, AttributeType::Float32_3));//x-axis - AddAttribute(Attribute::CreateAttribute(AttributeUsage::BiTangent, AttributeType::Float32_3));//y-axis -#ifdef PARTICLE_MOTION_BLUR // Nonfunctional and disabled. - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3));//prevPos - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Tangent, AttributeType::Float32_3));//prevXTan - AddAttribute(Attribute::CreateAttribute(AttributeUsage::BiTangent, AttributeType::Float32_3));//prevYTan -#endif - m_enum = eVF_P3F_C4B_T4B_N3F2;// Particles. - break; - case eVF_TP3F_C4B_T2F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - m_enum = eVF_TP3F_C4B_T2F;// Fonts (28 bytes). - break; - case eVF_TP3F_T2F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_TP3F_T2F_T3F; - break; - case eVF_P3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_T3F; // Miscellaneus. - break; - case eVF_P3F_T2F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_T2F_T3F; - break; // Additional streams - case eVF_T2F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - m_enum = eVF_T2F; // Light maps TC (8 bytes). - break; case eVF_W4B_I4S:// Skinned weights/indices stream. AddAttribute(Attribute::CreateAttribute(AttributeUsage::Weights, AttributeType::Byte_4)); AddAttribute(Attribute::CreateAttribute(AttributeUsage::Indices, AttributeType::UInt16_4)); m_enum = eVF_W4B_I4S; break; - case eVF_C4B_C4B:// SH coefficients. - // We use the "Weights" usage since sh coefs use an unknown usage of 4 bytes. - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Weights, AttributeType::Byte_4)); //coef0 - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Weights, AttributeType::Byte_4)); //coef1 - m_enum = eVF_C4B_C4B; - break; - case eVF_P3F_P3F_I4B:// Shape deformation stream. - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); //thin - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); //fat - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Indices, AttributeType::Byte_4)); - m_enum = eVF_P3F_P3F_I4B; - break; case eVF_P3F:// Velocity stream. AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); m_enum = eVF_P3F; break; - case eVF_C4B_T2S: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float16_2)); - m_enum = eVF_C4B_T2S;// General (Position is merged with Tangent stream) - break; - case eVF_P2F_T4F_C4F: // Lens effects simulation - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - m_enum = eVF_P2F_T4F_C4F; - break; - case eVF_P2F_T4F_T4F_C4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - m_enum = eVF_P2F_T4F_T4F_C4F; - break; - case eVF_P2S_N4B_C4B_T1F:// terrain - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float16_2));// xy-coordinates in terrain - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Normal, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1));// z-coordinate in terrain - m_enum = eVF_P2S_N4B_C4B_T1F; - break; - case eVF_P3F_C4B_T2S: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float16_2)); - m_enum = eVF_P3F_C4B_T2S; - break; case eVF_P2F_C4B_T2F_F4B: AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_2)); AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); @@ -299,546 +198,6 @@ namespace AZ AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Byte_4)); m_enum = eVF_P3F_C4B; break; - case eVF_P3F_C4F_T2F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - m_enum = eVF_P3F_C4F_T2F; - break; - case eVF_P3F_C4F_T2F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T3F; - break; - case eVF_P3F_C4F_T2F_T3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T3F_T3F; - break; - case eVF_P3F_C4F_T2F_T1F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - m_enum = eVF_P3F_C4F_T2F_T1F; - break; - case eVF_P3F_C4F_T2F_T1F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T1F_T3F; - break; - case eVF_P3F_C4F_T2F_T1F_T3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T1F_T3F_T3F; - break; - case eVF_P3F_C4F_T4F_T2F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - m_enum = eVF_P3F_C4F_T4F_T2F; - break; - case eVF_P3F_C4F_T4F_T2F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T4F_T2F_T3F; - break; - case eVF_P3F_C4F_T4F_T2F_T3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T4F_T2F_T3F_T3F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T3F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T3F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F; - break; - case eVF_P4F_T2F_C4F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P4F_T2F_C4F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T4F; - break; - case eVF_P3F_C4F_T2F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T3F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T3F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T1F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T1F_T4F; - break; - case eVF_P3F_C4F_T2F_T1F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T1F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T3F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F; - break; - case eVF_P4F_T2F_C4F_T4F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P4F_T2F_C4F_T4F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T3F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T3F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T1F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T1F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T1F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T1F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T4F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T4F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F_T4F; - break; - case eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_1)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_3)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F_T4F; - break; - case eVF_P4F_T2F_C4F_T4F_T4F_T4F_T4F: - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Position, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_2)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::Color, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - AddAttribute(Attribute::CreateAttribute(AttributeUsage::TexCoord, AttributeType::Float32_4)); - m_enum = eVF_P4F_T2F_C4F_T4F_T4F_T4F_T4F; - break; case eVF_Max: default: AZ_Error("VF", false, "Invalid vertex format"); @@ -854,115 +213,19 @@ namespace AZ static const uint8 kHas16BitFloatTexCoords = 0x2; static const uint8 kHas32BitFloatTexCoords = 0x1; - - //! Helper function to check to see if the vertex format has a position attribute that uses 16 bit floats for the underlying type - bool Has16BitFloatPosition() const - { - return (m_flags & kHas16BitFloatPosition) != 0x0; - } - - //! Helper function to check to see if the vertex format has a texture coordinate attribute that uses 16 bit floats for the underlying type - bool Has16BitFloatTextureCoordinates() const - { - return (m_flags & kHas16BitFloatTexCoords) != 0x0; - } - - //! Helper function to check to see if the vertex format has a texture coordinate attribute that uses 32 bit floats for the underlying type - bool Has32BitFloatTextureCoordinates() const - { - return (m_flags & kHas32BitFloatTexCoords) != 0x0; - } - uint32 GetAttributeUsageCount(AttributeUsage usage) const { return (uint32)m_attributeUsageCounts[(uint)usage]; } - bool TryGetAttributeOffsetAndType(AttributeUsage usage, uint32 index, uint& outOffset, AttributeType& outType) const - { - outOffset = 0; - outType = AttributeType::NumTypes; - for (uint ii=0; ii < m_numAttributes; ++ii) - { - uint8 attribute = m_vertexAttributes[ii]; - if (Attribute::GetUsage(attribute) == usage) - { - if (index == 0) - { - outType = Attribute::GetType(attribute); - return true; - } - else - { - --index; - } - } - outOffset += Attribute::GetByteLength(attribute); - } - return false; - } - - uint8 GetAttributeByteLength(AttributeUsage usage) const - { - for (uint ii = 0; ii < m_numAttributes; ++ii) - { - uint8 attribute = m_vertexAttributes[ii]; - if (Attribute::GetUsage(attribute) == usage) - { - return Attribute::GetByteLength(attribute); - } - } - return 0; - } - - const uint8* GetAttributes( uint32 &outCount) const { outCount = m_numAttributes; return m_vertexAttributes; } - //! Return true if the vertex format is a superset of the input - bool IsSupersetOf(const AZ::Vertex::Format& input) const - { - uint32 count = 0; - const uint8* attributes = input.GetAttributes(count); - for ( uint8 ii=0; ii(stride); } - + #ifdef PARTICLE_MOTION_BLUR @@ -1056,34 +319,5 @@ namespace AZ uint8 m_flags = 0x0; }; - - // bNeedNormals=1 - float normals; bNeedNormals=2 - byte normals //waltont TODO (this was copied as is from vertexformats.h) this comment is out of date and the function does not even use all the parameters. This should be replaceable with the new vertex class, and should be replaced when refactoring CHWShader_D3D::mfVertexFormat which handles the shader parsing/serialization - _inline Format VertFormatForComponents([[maybe_unused]] bool bNeedCol, [[maybe_unused]] bool bHasTC, bool bHasTC2, bool bHasPS, bool bHasNormal) - { - AZ::Vertex::Format RequestedVertFormat; - - if (bHasPS) - { - RequestedVertFormat = AZ::Vertex::Format(eVF_P3F_C4B_T4B_N3F2); - } - else - if (bHasNormal) - { - RequestedVertFormat = AZ::Vertex::Format(eVF_P3S_N4B_C4B_T2S); - } - else - { - if (!bHasTC2) - { - RequestedVertFormat = AZ::Vertex::Format(eVF_P3S_C4B_T2S); - } - else - { - RequestedVertFormat = AZ::Vertex::Format(eVF_P3F_C4B_T2F_T2F); - } - } - - return RequestedVertFormat; - } } } diff --git a/Code/Legacy/CryCommon/VertexFormats.h b/Code/Legacy/CryCommon/VertexFormats.h index 2231d4dfd0..8f5d0f0923 100644 --- a/Code/Legacy/CryCommon/VertexFormats.h +++ b/Code/Legacy/CryCommon/VertexFormats.h @@ -7,12 +7,9 @@ */ -#ifndef CRYINCLUDE_CRYCOMMON_VERTEXFORMATS_H -#define CRYINCLUDE_CRYCOMMON_VERTEXFORMATS_H - #pragma once -#include +#include // Stream Configuration options #define ENABLE_NORMALSTREAM_SUPPORT 1 @@ -22,94 +19,16 @@ enum EVertexFormat : uint8 // Base stream eVF_P3F_C4B_T2F, - eVF_P3F_C4B_T2F_T2F, eVF_P3S_C4B_T2S, - eVF_P3S_C4B_T2S_T2S, // For UV2 support - eVF_P3S_N4B_C4B_T2S, - - eVF_P3F_C4B_T4B_N3F2, // Particles. - eVF_TP3F_C4B_T2F, // Fonts (28 bytes). - eVF_TP3F_T2F_T3F, // Miscellaneus. - eVF_P3F_T3F, // Miscellaneus. (AuxGeom) - eVF_P3F_T2F_T3F, // Miscellaneus. // Additional streams - eVF_T2F, // Light maps TC (8 bytes). eVF_W4B_I4S, // Skinned weights/indices stream. - eVF_C4B_C4B, // SH coefficients. - eVF_P3F_P3F_I4B, // Shape deformation stream. eVF_P3F, // Velocity stream. - eVF_C4B_T2S, // General (Position is merged with Tangent stream) - // Lens effects simulation - eVF_P2F_T4F_C4F, // primary - eVF_P2F_T4F_T4F_C4F, - eVF_P2S_N4B_C4B_T1F, - eVF_P3F_C4B_T2S, eVF_P2F_C4B_T2F_F4B, // UI eVF_P3F_C4B,// Auxiliary geometry - - - eVF_P3F_C4F_T2F, //numbering for tracking the new vertex formats and for comparison with testing 23 - eVF_P3F_C4F_T2F_T3F, - eVF_P3F_C4F_T2F_T3F_T3F, - eVF_P3F_C4F_T2F_T1F, - eVF_P3F_C4F_T2F_T1F_T3F, - eVF_P3F_C4F_T2F_T1F_T3F_T3F, - eVF_P3F_C4F_T4F_T2F, - eVF_P3F_C4F_T4F_T2F_T3F, //30 - eVF_P3F_C4F_T4F_T2F_T3F_T3F, - eVF_P3F_C4F_T4F_T2F_T1F, - eVF_P3F_C4F_T4F_T2F_T1F_T3F, - eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F, - eVF_P3F_C4F_T2F_T2F_T1F, //35 - eVF_P3F_C4F_T2F_T2F_T1F_T3F, - eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F, //40 - eVF_P4F_T2F_C4F_T4F_T4F, - eVF_P3F_C4F_T2F_T4F, - eVF_P3F_C4F_T2F_T3F_T4F, - eVF_P3F_C4F_T2F_T3F_T3F_T4F, - eVF_P3F_C4F_T2F_T1F_T4F, //45 - eVF_P3F_C4F_T2F_T1F_T3F_T4F, - eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F, - eVF_P3F_C4F_T4F_T2F_T4F, - eVF_P3F_C4F_T4F_T2F_T3F_T4F, - eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F, //50 - eVF_P3F_C4F_T4F_T2F_T1F_T4F, - eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F, - eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F, //55 - eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F, - eVF_P4F_T2F_C4F_T4F_T4F_T4F, //60 - eVF_P3F_C4F_T2F_T4F_T4F, - eVF_P3F_C4F_T2F_T3F_T4F_T4F, - eVF_P3F_C4F_T2F_T3F_T3F_T4F_T4F, - eVF_P3F_C4F_T2F_T1F_T4F_T4F, - eVF_P3F_C4F_T2F_T1F_T3F_T4F_T4F, //65 - eVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F_T4F, - eVF_P3F_C4F_T4F_T2F_T4F_T4F, - eVF_P3F_C4F_T4F_T2F_T3F_T4F_T4F, - eVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F_T4F, - eVF_P3F_C4F_T4F_T2F_T1F_T4F_T4F, //70 - eVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F_T4F, - eVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T4F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F_T4F, //75 - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F_T4F, - eVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F_T4F, - eVF_P4F_T2F_C4F_T4F_T4F_T4F_T4F, - eVF_Max, }; @@ -143,8 +62,6 @@ struct UCol (bcolor[2] - 128.0f) / 127.5f ); } - - AUTO_STRUCT_INFO }; struct Vec3f16 @@ -242,14 +159,6 @@ struct SVF_P3F_C4B_T2F Vec2 st; }; -struct SVF_P3F_C4B_T2F_T2F -{ - Vec3 xyz; - UCol color; - Vec2 st; - Vec2 st2; -}; - struct SVF_P2F_C4B_T2F_F4B { Vec2 xy; @@ -261,743 +170,23 @@ struct SVF_P2F_C4B_T2F_F4B uint8 pad; }; -struct SVF_TP3F_C4B_T2F //Fonts -{ - Vec4 pos; - UCol color; - Vec2 st; -}; struct SVF_P3S_C4B_T2S { Vec3f16 xyz; UCol color; Vec2f16 st; - - AUTO_STRUCT_INFO }; -struct SVF_P3S_C4B_T2S_T2S -{ - Vec3f16 xyz; - UCol color; - Vec2f16 st; - Vec2f16 st2; - - AUTO_STRUCT_INFO -}; - -struct SVF_P3F_C4B_T2S -{ - Vec3 xyz; - UCol color; - Vec2f16 st; -}; - -struct SVF_P3S_N4B_C4B_T2S -{ - Vec3f16 xyz; - UCol normal; - UCol color; - Vec2f16 st; -}; - -struct SVF_P2S_N4B_C4B_T1F -{ - CryHalf2 xy; - UCol normal; - UCol color; - float z; -}; - -struct SVF_T2F -{ - Vec2 st; -}; struct SVF_W4B_I4S { UCol weights; uint16 indices[4]; }; -struct SVF_C4B_C4B -{ - UCol coef0; - UCol coef1; -}; -struct SVF_P3F_P3F_I4B -{ - Vec3 thin; - Vec3 fat; - UCol index; -}; + struct SVF_P3F { Vec3 xyz; }; -struct SVF_P3F_T3F -{ - Vec3 p; - Vec3 st; -}; -struct SVF_P3F_T2F_T3F -{ - Vec3 p; - Vec2 st0; - Vec3 st1; -}; -struct SVF_TP3F_T2F_T3F -{ - Vec4 p; - Vec2 st0; - Vec3 st1; -}; -struct SVF_P2F_T4F_C4F -{ - Vec2 p; - Vec4 st; - Vec4 color; -}; - -struct SVF_P2F_T4F_T4F_C4F -{ - Vec2 p; - Vec4 st; - Vec4 st2; - Vec4 color; -}; - -struct SVF_P3F_C4B_I4B_PS4F -{ - Vec3 xyz; - Vec2 prevXaxis; - Vec2 prevYaxis; - UCol color; - Vec3 prevPos; - struct SpriteInfo - { - uint8 tex_x, tex_y, tex_z, backlight; // xyzw - } info; - Vec2 xaxis; - Vec2 yaxis; -}; - -struct SVF_P3F_C4B_T4B_N3F2 -{ - Vec3 xyz; - UCol color; - UCol st; // st is used as a color, even though st usually refers to a TexCoord - Vec3 xaxis; - Vec3 yaxis; -#ifdef PARTICLE_MOTION_BLUR - Vec3 prevPos; - Vec3 prevXTan; - Vec3 prevYTan; -#endif -}; - -struct SVF_C4B_T2S -{ - UCol color; - Vec2f16 st; -}; - -struct SVF_P3F_C4F_T2F -{ - Vec3 xyz; - Vec4 color; - Vec2 st; -}; - -struct SVF_P3F_C4F_T2F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec3 st1; -}; - -struct SVF_P3F_C4F_T2F_T3F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec3 st1; - Vec3 st2; -}; - -struct SVF_P3F_C4F_T2F_T1F -{ - Vec3 xyz; - Vec4 color; - Vec2 st; - float z; -}; - -struct SVF_P3F_C4F_T2F_T1F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec3 st1; -}; - -struct SVF_P3F_C4F_T2F_T1F_T3F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec3 st1; - Vec3 st2; -}; - - -struct SVF_P3F_C4F_T4F_T2F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; -}; - -struct SVF_P3F_C4F_T4F_T2F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec3 st2; -}; - -struct SVF_P3F_C4F_T4F_T2F_T3F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec3 st2; - Vec3 st3; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec3 st2; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec3 st3; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec3 st2; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec3 st3; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec3 st2; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec3 st2; - Vec3 st3; -}; - -struct SVF_P4F_T2F_C4F_T4F_T4F -{ - Vec4 xyzw; - Vec2 st0; - Vec4 color; - Vec4 st1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec4 st1; -}; - -struct SVF_P3F_C4F_T2F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec3 st1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T3F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec3 st1; - Vec3 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T1F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec4 st1; -}; - -struct SVF_P3F_C4F_T2F_T1F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec3 st1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec3 st1; - Vec3 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T4F_T2F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T4F_T2F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec3 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec3 st2; - Vec3 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec3 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec3 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec3 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec3 st2; - Vec3 st3; - Vec4 st4; -}; - -struct SVF_P4F_T2F_C4F_T4F_T4F_T4F -{ - Vec4 xyzw; - Vec2 st0; - Vec4 color; - Vec4 st1; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec4 st1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec3 st1; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T3F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec3 st1; - Vec3 st2; - Vec4 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T2F_T1F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec4 st1; - Vec4 st2; -}; - -struct SVF_P3F_C4F_T2F_T1F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec3 st1; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T1F_T3F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - float z; - Vec3 st1; - Vec3 st2; - Vec4 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T4F_T2F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T4F_T2F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec3 st2; - Vec4 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T4F_T2F_T3F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - Vec3 st2; - Vec3 st3; - Vec4 st4; - Vec4 st5; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec4 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T4F_T2F_T1F_T3F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec4 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec3 st3; - Vec4 st4; - Vec4 st5; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec4 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T3F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z; - Vec3 st2; - Vec3 st3; - Vec4 st4; - Vec4 st5; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec4 st2; - Vec4 st3; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec3 st2; - Vec4 st3; - Vec4 st4; -}; - -struct SVF_P3F_C4F_T2F_T2F_T1F_T1F_T3F_T3F_T4F_T4F -{ - Vec3 xyz; - Vec4 color; - Vec2 st0; - Vec2 st1; - float z0; - float z1; - Vec3 st2; - Vec3 st3; - Vec4 st4; - Vec4 st5; -}; - -struct SVF_P4F_T2F_C4F_T4F_T4F_T4F_T4F -{ - Vec4 xyzw; - Vec2 st0; - Vec4 color; - Vec4 st1; - Vec4 st2; - Vec4 st3; - Vec4 st4; -}; - //============================================================= // Signed norm value packing [-1,+1] @@ -1240,8 +429,6 @@ public: *this = SPipTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); } - - friend struct SMeshTangents; }; struct SPipQTangents @@ -1290,8 +477,6 @@ public: const Quat q = GetQ(); return q.GetColumn2() * (q.w < 0.0f ? -1.0f : +1.0f); } - - friend struct SMeshQTangents; }; struct SPipNormal @@ -1328,8 +513,6 @@ struct SPipNormal // normalize in case "trn" wasn't length-preserving *this = SPipNormal(trn.TransformVector(*this).normalize()); } - - friend struct SMeshNormal; }; //================================================================================================== @@ -1364,24 +547,4 @@ enum EStreamIDs VSF_MORPHBUDDY_WEIGHTS = 15, // Morphing weights }; -// Stream Masks (Used during updating) -enum EStreamMasks -{ - VSM_GENERAL = 1 << VSF_GENERAL, - VSM_TANGENTS = ((1 << VSF_TANGENTS) | (1 << VSF_QTANGENTS)), - VSM_HWSKIN = 1 << VSF_HWSKIN_INFO, - VSM_VERTEX_VELOCITY = 1 << VSF_VERTEX_VELOCITY, -# if ENABLE_NORMALSTREAM_SUPPORT - VSM_NORMALS = 1 << VSF_NORMALS, -#endif - - VSM_MORPHBUDDY = 1 << VSF_MORPHBUDDY, - VSM_INSTANCED = 1 << VSF_INSTANCED, - - VSM_MASK = ((1 << VSF_NUM) - 1), -}; - //================================================================================================================== - -#endif // CRYINCLUDE_CRYCOMMON_VERTEXFORMATS_H - diff --git a/Code/Legacy/CryCommon/crycommon_files.cmake b/Code/Legacy/CryCommon/crycommon_files.cmake index 7131eb7207..2f5030ccc4 100644 --- a/Code/Legacy/CryCommon/crycommon_files.cmake +++ b/Code/Legacy/CryCommon/crycommon_files.cmake @@ -7,18 +7,15 @@ # set(FILES - CryCommon.cpp IAudioInterfacesCommonData.h IAudioSystem.h ICmdLine.h IConsole.h IEntityRenderState.h - IEntityRenderState_info.cpp IFont.h IFunctorBase.h IGem.h IIndexedMesh.h - IIndexedMesh_info.cpp ILevelSystem.h ILocalizationManager.h LocalizationManagerBus.h @@ -27,19 +24,15 @@ set(FILES IMaterial.h IMiniLog.h IMovieSystem.h - IPhysics.h - IPostEffectGroup.h IProcess.h IReadWriteXMLSink.h IRenderAuxGeom.h IRenderer.h - IRenderMesh.h ISerialize.h IShader.h ISplines.h IStatObj.h StatObjBus.h - IStereoRenderer.h ISurfaceType.h ISystem.h ITexture.h @@ -49,42 +42,31 @@ set(FILES IWindowMessageHandler.h IXml.h MicrophoneBus.h - physinterface.h HMDBus.h VRCommon.h - StereoRendererBus.h INavigationSystem.h IMNM.h SFunctor.h FunctorBaseFunction.h FunctorBaseMember.h - stridedptr.h - Options.h SerializationTypes.h CryEndian.h CryRandomInternal.h Random.h LCGRandom.h - CryTypeInfo.cpp BaseTypes.h - MemoryAccess.h AnimKey.h BitFiddling.h Common_TypeInfo.cpp - CryArray.h CryAssert.h CryCrc32.h - CryCustomTypes.h CryFile.h - CryHeaders.h - CryHeaders_info.cpp CryListenerSet.h CryLegacyAllocator.h CryPath.h CryPodArray.h CrySizer.h CrySystemBus.h - CryTypeInfo.h CryVersion.h LegacyAllocator.cpp LegacyAllocator.h @@ -93,7 +75,6 @@ set(FILES MultiThread_Containers.h NullAudioSystem.h PNoise3.h - primitives.h ProjectDefines.h Range.h ScopedVariableSetter.h @@ -102,14 +83,9 @@ set(FILES smartptr.h StlUtils.h Synchronization.h - Tarray.h Timer.h TimeValue.h - TimeValue_info.h - TypeInfo_decl.h - TypeInfo_impl.h VectorMap.h - VectorSet.h VertexFormats.h XMLBinaryHeaders.h RenderBus.h @@ -123,13 +99,11 @@ set(FILES Cry_Geo.h Cry_GeoDistance.h Cry_GeoIntersect.h - Cry_GeoOverlap.h Cry_Math.h Cry_Quat.h Cry_ValidNumber.h Cry_Vector2.h Cry_Vector3.h - CryHalf_info.h CryHalf.inl MathConversion.h Cry_HWMatrix.h diff --git a/Code/Legacy/CryCommon/physinterface.h b/Code/Legacy/CryCommon/physinterface.h deleted file mode 100644 index 06d07af82b..0000000000 --- a/Code/Legacy/CryCommon/physinterface.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : declarations of all physics interfaces and structures -#pragma once - - -#include - -#include "Cry_Geo.h" -#include "stridedptr.h" -#include "primitives.h" -#ifdef NEED_ENDIAN_SWAP - #include "CryEndian.h" -#endif - -#include -#include diff --git a/Code/Legacy/CryCommon/platform.h b/Code/Legacy/CryCommon/platform.h index 3b80079c0f..37f0636c3a 100644 --- a/Code/Legacy/CryCommon/platform.h +++ b/Code/Legacy/CryCommon/platform.h @@ -353,12 +353,6 @@ void SetFlags(T& dest, U flags, bool b) #include AZ_RESTRICTED_FILE(platform_h) #endif -// Include support for meta-type data. -#include "TypeInfo_decl.h" - -// Include array. -#include - bool CrySetFileAttributes(const char* lpFileName, uint32 dwFileAttributes); threadID CryGetCurrentThreadId(); diff --git a/Code/Legacy/CryCommon/primitives.h b/Code/Legacy/CryCommon/primitives.h deleted file mode 100644 index e44690a977..0000000000 --- a/Code/Legacy/CryCommon/primitives.h +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_PRIMITIVES_H -#define CRYINCLUDE_CRYCOMMON_PRIMITIVES_H -#pragma once - - - -typedef int index_t; -enum -{ - PHYS_MAX_INDICES = 1 << 30 -}; - -#include "stridedptr.h" - -namespace primitives { - ////////////////////////// primitives ////////////////////// - - struct primitive - { - }; - - struct box - : primitive - { - enum entype - { - type = 0 - }; - Matrix33 Basis; // v_box = Basis*v_world; Basis = Rotation.T() - int bOriented; - Vec3 center; - Vec3 size; - AUTO_STRUCT_INFO - }; - - struct triangle - : primitive - { - enum entype - { - type = 1 - }; - Vec3 pt[3]; - Vec3 n; - AUTO_STRUCT_INFO - }; - - struct indexed_triangle - : triangle - { - int idx; - AUTO_STRUCT_INFO - }; - - typedef float (* getHeightCallback)(int ix, int iy); - typedef unsigned char (* getSurfTypeCallback)(int ix, int iy); - - struct grid - : primitive - { - Matrix33 Basis; - int bOriented; - Vec3 origin; - vector2df step, stepr; - vector2di size; - vector2di stride; - int bCyclic; - grid() { bCyclic = 0; } - int inrange(int ix, int iy) { return bCyclic | -((ix - size.x & - 1 - ix & iy - size.y & - 1 - iy) >> 31); } - int getcell_safe(int ix, int iy) { int mask = -inrange(ix, iy); return (iy & size.y - 1) * stride.y + (ix & size.x - 1) * stride.x & mask | size.x * size.y & ~mask; } - int crop(int i, int icoord, int bAllowBorder = 1) { int brd = bAllowBorder + (1 << 30 & - bCyclic); return max(-brd, min(size[icoord] - 1 + brd, i)); } - vector2di cropxy(const vector2di& ic, int bAllowBorder = 1) { int brd = bAllowBorder + (1 << 30 & - bCyclic); return vector2di(max(-brd, min(size.x - 1 + brd, ic.x)), max(-brd, min(size.y - 1 + brd, ic.y))); } - int iscyclic() { return bCyclic; } - AUTO_STRUCT_INFO - }; - - struct heightfield - : grid - { - enum entype - { - type = 2 - }; - heightfield& operator=(const heightfield& src) - { - step = src.step; - stepr = src.stepr; - size = src.size; - stride = src.stride; - heightscale = src.heightscale; - typemask = src.typemask; - typehole = src.typehole; - typepower = src.typepower; - fpGetHeightCallback = src.fpGetHeightCallback; - fpGetSurfTypeCallback = src.fpGetSurfTypeCallback; - return *this; - } - - ILINE float getheight(int ix, int iy) const - { - float result = (*fpGetHeightCallback)(ix, iy); - return result * heightscale; - } - ILINE int gettype(int ix, int iy) const - { - int itype = (((*fpGetSurfTypeCallback)(ix, iy)) & typemask) >> typepower, idelta = itype - typehole; - return itype | ((idelta - 1) >> 31 ^ idelta >> 31); - } - - float heightscale; - unsigned short typemask; - int typehole; - int typepower; - getHeightCallback fpGetHeightCallback; - getSurfTypeCallback fpGetSurfTypeCallback; - }; - - struct ray - : primitive - { - enum entype - { - type = 3 - }; - Vec3 origin; - Vec3 dir; - AUTO_STRUCT_INFO - }; - - struct sphere - : primitive - { - enum entype - { - type = 4 - }; - Vec3 center; - float r; - AUTO_STRUCT_INFO - }; - - struct cylinder - : primitive - { - enum entype - { - type = 5 - }; - Vec3 center; - Vec3 axis; - float r, hh; - AUTO_STRUCT_INFO - }; - - struct capsule - : cylinder - { - enum entype - { - type = 6 - }; - AUTO_STRUCT_INFO - }; - - struct grid3d - : primitive - { - Matrix33 Basis; - int bOriented; - Vec3 origin; - Vec3 step, stepr; - Vec3i size; - Vec3i stride; - }; - - struct voxelgrid - : grid3d - { - enum entype - { - type = 7 - }; - Matrix33 R; - Vec3 offset; - float scale, rscale; - strided_pointer pVtx; - index_t* pIndices; - Vec3* pNormals; - char* pIds; - int* pCellTris; - int* pTriBuf; - }; - - struct plane - : primitive - { - enum entype - { - type = 8 - }; - Vec3 n; - Vec3 origin; - AUTO_STRUCT_INFO - }; - - struct coord_plane - : plane - { - Vec3 axes[2]; - AUTO_STRUCT_INFO - }; -} - -AUTO_TYPE_INFO(primitives::getHeightCallback) -AUTO_TYPE_INFO(primitives::getSurfTypeCallback) - -struct prim_inters -{ - prim_inters() { minPtDist2 = 0.0f; ptbest.zero(); } - Vec3 pt[2]; - Vec3 n; - unsigned char iFeature[2][2]; - float minPtDist2; - short id[2]; - int iNode[2]; - Vec3* ptborder; - int nborderpt, nbordersz; - Vec3 ptbest; - int nBestPtVal; -}; - -struct contact -{ - real t, taux; - Vec3 pt; - Vec3 n; - unsigned int iFeature[2]; -}; - -const int NPRIMS = 8; // since plane is currently not supported in collision checks - -///////////////////// geometry contact structures /////////////////// - -struct geom_contact_area -{ - enum entype - { - polygon, polyline - }; - int type; - int npt; - int nmaxpt; - float minedge; - int* piPrim[2]; - int* piFeature[2]; - Vec3* pt; - Vec3 n1; // normal of other object surface (or edge) -}; - -const int IFEAT_LOG2 = 23; -const int IDXMASK = ~(0xFF << IFEAT_LOG2); -const int TRIEND = 0x80 << IFEAT_LOG2; - -struct geom_contact -{ - real t; - Vec3 pt; - Vec3 n; - Vec3 dir; // unprojection direction - int iUnprojMode; - float vel; // original velocity along this direction, <0 if least squares normal was used - int id[2]; // external ids for colliding geometry parts - int iPrim[2]; - int iFeature[2]; - int iNode[2]; // BV-tree nodes of contacting primitives - Vec3* ptborder; // intersection border - int (*idxborder)[2]; // primitive index | primitive's feature's id << IFEAT_LOG2 - int nborderpt; - int bClosed; - Vec3 center; - bool bBorderConsecutive; - geom_contact_area* parea; -}; - -#endif // CRYINCLUDE_CRYCOMMON_PRIMITIVES_H diff --git a/Code/Legacy/CryCommon/smartptr.h b/Code/Legacy/CryCommon/smartptr.h index baf51d5030..ec2b437696 100644 --- a/Code/Legacy/CryCommon/smartptr.h +++ b/Code/Legacy/CryCommon/smartptr.h @@ -146,8 +146,6 @@ public: { std::swap(p, other.p); } - - AUTO_STRUCT_INFO }; template diff --git a/Code/Legacy/CryCommon/stridedptr.h b/Code/Legacy/CryCommon/stridedptr.h deleted file mode 100644 index 8a74aa97b1..0000000000 --- a/Code/Legacy/CryCommon/stridedptr.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_STRIDEDPTR_H -#define CRYINCLUDE_CRYCOMMON_STRIDEDPTR_H -#pragma once - -#include -#include - -template -class strided_pointer -{ -public: - strided_pointer() - : data(0) - , iStride(sizeof(dtype)) - { - } - - strided_pointer(dtype* pdata, int32 stride = sizeof(dtype)) - : data(pdata) - , iStride(stride) - { - } - - template - strided_pointer(dtype1* pdata) - { - set(pdata, sizeof(dtype1)); - } - - template - strided_pointer(const strided_pointer& src) - { - set(src.data, src.iStride); - } - - template - ILINE strided_pointer& operator=(const strided_pointer& src) - { - set(src.data, src.iStride); - return *this; - } - - ILINE dtype& operator[](int32 idx) { return *(dtype*)((char*)data + idx * iStride); } - ILINE const dtype& operator[](int32 idx) const { return *(const dtype*)((const char*)data + idx * iStride); } - ILINE strided_pointer operator+(int32 idx) const { return strided_pointer((dtype*)((char*)data + idx * iStride), iStride); } - ILINE strided_pointer operator-(int32 idx) const { return strided_pointer((dtype*)((char*)data - idx * iStride), iStride); } - - ILINE operator bool() const - { - return data != 0; - } - -private: - template - ILINE void set(dtype1* pdata, int32 stride) - { -# if !defined(eLittleEndian) -# error eLittleEndian is not defined, please include CryEndian.h. -# endif - static_assert(metautils::is_const::value || !metautils::is_const::value); - // note: we allow xint32 -> xint16 converting - static_assert( - (metautils::is_same::type, typename metautils::remove_const::type>::value || - ((metautils::is_same::type, sint32>::value || - metautils::is_same::type, uint32>::value || - metautils::is_same::type, sint16>::value || - metautils::is_same::type, uint16>::value) && - (metautils::is_same::type, sint16>::value || - metautils::is_same::type, uint16>::value)))); - data = (dtype*)pdata + (sizeof(dtype1) / sizeof(dtype) - 1) * (int)eLittleEndian; - iStride = stride; - } - -private: - // Prevents assignment of a structure member's address by mistake: - // stridedPtrObject = &myStruct.member; - // Use explicit constructor instead: - // stridedPtrObject = strided_pointer(&myStruct.member, sizeof(myStruct)); - // - // Keep it private and non-implemented. - strided_pointer& operator=(dtype* pdata); - - // Prevents using the address directly by mistake: - // memcpy(destination, stridedPtrObject, sizeof(baseType) * n); - // Use address of the first element instead: - // memcpy(destination, &stridedPtrObject[0], stridedPtrObject.iStride * n); - // - // Keep it private and non-implemented. - operator void*() const; - - // Prevents direct dereferencing to avoid confusing it with "normal" pointers: - // val = *stridedPtrObject; - // Use operator [] instead: - // val = stridedPtrObject[0]; - // - // Keep it private and non-implemented. - dtype& operator*() const; - -public: - dtype* data; - int32 iStride; -}; - - -#endif // CRYINCLUDE_CRYCOMMON_STRIDEDPTR_H diff --git a/Code/Legacy/CrySystem/LocalizedStringManager.h b/Code/Legacy/CrySystem/LocalizedStringManager.h index 283eaa79bf..1fba05f9ac 100644 --- a/Code/Legacy/CrySystem/LocalizedStringManager.h +++ b/Code/Legacy/CrySystem/LocalizedStringManager.h @@ -10,9 +10,11 @@ #pragma once #include +#include #include #include #include +#include #include "Huffman.h" @@ -153,9 +155,9 @@ private: CryHalf fVolume; CryHalf fRadioRatio; // SoundMoods - DynArray SoundMoods; + AZStd::vector SoundMoods; // EventParameters - DynArray EventParameters; + AZStd::vector EventParameters; // ~audio specific part // subtitle & radio flags @@ -312,5 +314,3 @@ private: mutable AZStd::mutex m_cs; typedef AZStd::lock_guard AutoLock; }; - - diff --git a/Code/Legacy/CrySystem/SimpleStringPool.h b/Code/Legacy/CrySystem/SimpleStringPool.h index d1a618425c..13be471f9e 100644 --- a/Code/Legacy/CrySystem/SimpleStringPool.h +++ b/Code/Legacy/CrySystem/SimpleStringPool.h @@ -12,7 +12,7 @@ #pragma once #include "ISystem.h" - +#include #include //TODO: Pull most of this into a cpp file! @@ -265,23 +265,6 @@ public: return ret; } - void GetMemoryUsage(ICrySizer* pSizer) const - { - BLOCK* pBlock = m_blocks; - while (pBlock) - { - pSizer->AddObject(pBlock, offsetof(BLOCK, s) + pBlock->size * sizeof(char)); - pBlock = pBlock->next; - } - - pBlock = m_free_blocks; - while (pBlock) - { - pSizer->AddObject(pBlock, offsetof(BLOCK, s) + pBlock->size * sizeof(char)); - pBlock = pBlock->next; - } - } - private: CSimpleStringPool(const CSimpleStringPool&); CSimpleStringPool& operator = (const CSimpleStringPool&); diff --git a/Code/Legacy/CrySystem/System.cpp b/Code/Legacy/CrySystem/System.cpp index 70fb9382e1..0f0a62f8c6 100644 --- a/Code/Legacy/CrySystem/System.cpp +++ b/Code/Legacy/CrySystem/System.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -28,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -641,7 +643,7 @@ void CSystem::SleepIfNeeded() allowStallCatchup = true; float totalElapsed = (now - prevNow.Front()).GetSeconds(); - float wantSleepTime = CLAMP(minTime * (prevNow.Size() - 1) - totalElapsed, 0, (minTime - elapsed) * 0.9f); + float wantSleepTime = AZStd::clamp(minTime * (prevNow.Size() - 1) - totalElapsed, 0.0f, (minTime - elapsed) * 0.9f); static float sleepTime = 0; sleepTime = (15 * sleepTime + wantSleepTime) / 16; int sleepMS = (int)(1000.0f * sleepTime + 0.5f); diff --git a/Code/Legacy/CrySystem/ViewSystem/View.cpp b/Code/Legacy/CrySystem/ViewSystem/View.cpp index 7b3883f014..36cd891e3e 100644 --- a/Code/Legacy/CrySystem/ViewSystem/View.cpp +++ b/Code/Legacy/CrySystem/ViewSystem/View.cpp @@ -13,7 +13,6 @@ #include #include "View.h" #include -#include #include #include #include @@ -541,13 +540,13 @@ void CView::GetMemoryUsage(ICrySizer* s) const s->AddObject(m_shakes); } -void CView::Serialize(TSerialize ser) -{ - if (ser.IsReading()) - { - ResetShaking(); - } -} +//void CView::Serialize(TSerialize ser) +//{ +// if (ser.IsReading()) +// { +// ResetShaking(); +// } +//} void CView::PostSerialize() { diff --git a/Code/Legacy/CrySystem/ViewSystem/View.h b/Code/Legacy/CrySystem/ViewSystem/View.h index 58d7e64869..689c254897 100644 --- a/Code/Legacy/CrySystem/ViewSystem/View.h +++ b/Code/Legacy/CrySystem/ViewSystem/View.h @@ -15,6 +15,7 @@ #include class CGameObject; +struct ISystem; namespace LegacyViewSystem { @@ -106,7 +107,6 @@ public: virtual void SetActive(const bool bActive); // ~IView - void Serialize(TSerialize ser) override; void PostSerialize() override; CCamera& GetCamera() override { return m_camera; } const CCamera& GetCamera() const override { return m_camera; } diff --git a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp index 01c7340919..1d141a5e13 100644 --- a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp +++ b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp @@ -617,16 +617,16 @@ void CViewSystem::GetMemoryUsage(ICrySizer* s) const s->AddContainer(m_views); } -void CViewSystem::Serialize(TSerialize ser) -{ - TViewMap::iterator iter = m_views.begin(); - TViewMap::iterator iterEnd = m_views.end(); - while (iter != iterEnd) - { - iter->second->Serialize(ser); - ++iter; - } -} +//void CViewSystem::Serialize(TSerialize ser) +//{ +// TViewMap::iterator iter = m_views.begin(); +// TViewMap::iterator iterEnd = m_views.end(); +// while (iter != iterEnd) +// { +// iter->second->Serialize(ser); +// ++iter; +// } +//} void CViewSystem::PostSerialize() { diff --git a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h index 644a197e46..dd49e09e04 100644 --- a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h +++ b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h @@ -53,7 +53,6 @@ public: virtual unsigned int GetViewId(IView* pView); virtual unsigned int GetActiveViewId(); - virtual void Serialize(TSerialize ser); virtual void PostSerialize(); virtual IView* GetViewByEntityId(const AZ::EntityId& id, bool forceCreate); diff --git a/Code/Legacy/CrySystem/XConsole.cpp b/Code/Legacy/CrySystem/XConsole.cpp index 88a7fc262e..bb8316981a 100644 --- a/Code/Legacy/CrySystem/XConsole.cpp +++ b/Code/Legacy/CrySystem/XConsole.cpp @@ -1762,7 +1762,7 @@ void CXConsole::ExecuteString(const char* command, const bool bSilentMode, const AZ::StringFunc::TrimWhiteSpace(str, true, false); // Unroll the exec command - + bool unroll = (0 == AZ::StringFunc::Find(str, "exec", 0, false, false)); if (unroll) @@ -2891,75 +2891,6 @@ int CXConsole::GetNumVisibleVars() return numVars; } - -////////////////////////////////////////////////////////////////////////// -bool CXConsole::IsHashCalculated() -{ - return m_bCheatHashDirty == false; -} - -////////////////////////////////////////////////////////////////////////// -int CXConsole::GetNumCheatVars() -{ - return static_cast(m_randomCheckedVariables.size()); -} - -////////////////////////////////////////////////////////////////////////// -uint64 CXConsole::GetCheatVarHash() -{ - return m_nCheatHash; -} - -////////////////////////////////////////////////////////////////////////// -void CXConsole::SetCheatVarHashRange(size_t firstVar, size_t lastVar) -{ - // check inputs are sane -#if !defined(NDEBUG) - size_t numVars = GetNumCheatVars(); - assert(firstVar < numVars && lastVar < numVars && lastVar >= firstVar); -#endif - -#if defined(DEFENCE_CVAR_HASH_LOGGING) - if (m_bCheatHashDirty) - { - CryLog("HASHING: WARNING - trying to set up new cvar hash range while existing hash still calculating!"); - } -#endif - - m_nCheatHashRangeFirst = firstVar; - m_nCheatHashRangeLast = lastVar; - m_bCheatHashDirty = true; -} - -////////////////////////////////////////////////////////////////////////// -void CXConsole::CalcCheatVarHash() -{ - if (!m_bCheatHashDirty) - { - return; - } - - CCrc32 runningNameCrc32; - CCrc32 runningNameValueCrc32; - - AddCVarsToHash(m_randomCheckedVariables.begin() + m_nCheatHashRangeFirst, m_randomCheckedVariables.begin() + m_nCheatHashRangeLast, runningNameCrc32, runningNameValueCrc32); - AddCVarsToHash(m_alwaysCheckedVariables.begin(), m_alwaysCheckedVariables.end() - 1, runningNameCrc32, runningNameValueCrc32); - - // store hash - m_nCheatHash = (((uint64)runningNameCrc32.Get()) << 32) | runningNameValueCrc32.Get(); - m_bCheatHashDirty = false; - -#if defined(DEFENCE_CVAR_HASH_LOGGING) - if (!gEnv->IsDedicated()) - { - CryLog("HASHING: Range %d->%d = %llx(%x,%x), max cvars = %d", m_nCheatHashRangeFirst, m_nCheatHashRangeLast, - m_nCheatHash, runningNameCrc32.Get(), runningNameValueCrc32.Get(), - GetNumCheatVars()); - PrintCheatVars(true); - } -#endif -} - void CXConsole::AddCVarsToHash(ConsoleVariablesVector::const_iterator begin, ConsoleVariablesVector::const_iterator end, CCrc32& runningNameCrc32, CCrc32& runningNameValueCrc32) { for (ConsoleVariablesVector::const_iterator it = begin; it <= end; ++it) @@ -2974,162 +2905,6 @@ void CXConsole::AddCVarsToHash(ConsoleVariablesVector::const_iterator begin, Con } } -void CXConsole::CmdDumpAllAnticheatVars([[maybe_unused]] IConsoleCmdArgs* pArgs) -{ -#if defined(DEFENCE_CVAR_HASH_LOGGING) - CXConsole* pConsole = (CXConsole*)gEnv->pConsole; - - if (pConsole->IsHashCalculated()) - { - CryLog("HASHING: Displaying Full Anticheat Cvar list:"); - pConsole->PrintCheatVars(false); - } - else - { - CryLogAlways("DumpAllAnticheatVars - cannot complete, cheat vars are in a state of flux, please retry."); - } -#endif -} - -void CXConsole::CmdDumpLastHashedAnticheatVars([[maybe_unused]] IConsoleCmdArgs* pArgs) -{ -#if defined(DEFENCE_CVAR_HASH_LOGGING) - CXConsole* pConsole = (CXConsole*)gEnv->pConsole; - - if (pConsole->IsHashCalculated()) - { - CryLog("HASHING: Displaying Last Hashed Anticheat Cvar list:"); - pConsole->PrintCheatVars(true); - } - else - { - CryLogAlways("DumpLastHashedAnticheatVars - cannot complete, cheat vars are in a state of flux, please retry."); - } -#endif -} - -void CXConsole::PrintCheatVars([[maybe_unused]] bool bUseLastHashRange) -{ -#if defined(DEFENCE_CVAR_HASH_LOGGING) - if (m_bCheatHashDirty) - { - return; - } - - size_t i = 0; - char floatFormatBuf[64]; - - size_t nStart = 0; - size_t nEnd = m_mapVariables.size(); - - if (bUseLastHashRange) - { - nStart = m_nCheatHashRangeFirst; - nEnd = m_nCheatHashRangeLast; - } - - // iterate over all const cvars in our range - // then hash the string. - CryLog("VF_CHEAT & ~VF_CHEAT_NOCHECK list:"); - - ConsoleVariablesMap::const_iterator it, end = m_mapVariables.end(); - for (it = m_mapVariables.begin(); it != end; ++it) - { - // only count cheat cvars - if ((it->second->GetFlags() & VF_CHEAT) == 0 || - (it->second->GetFlags() & VF_CHEAT_NOCHECK) != 0) - { - continue; - } - - // count up - i++; - - // if we haven't reached the first var, or have passed the last var, break out - if (i - 1 < nStart) - { - continue; - } - if (i - 1 > nEnd) - { - break; - } - - // add name & variable to string. We add both since adding only the value could cause - // many collisions with variables all having value 0 or all 1. - string hashStr = it->first; - if (it->second->GetType() == CVAR_FLOAT) - { - sprintf(floatFormatBuf, "%.1g", it->second->GetFVal()); - hashStr += floatFormatBuf; - } - else - { - hashStr += it->second->GetString(); - } - - CryLog("%s", hashStr.c_str()); - } - - // iterate over any must-check variables - CryLog("VF_CHEAT_ALWAYS_CHECK list:"); - - for (it = m_mapVariables.begin(); it != end; ++it) - { - // only count cheat cvars - if ((it->second->GetFlags() & VF_CHEAT_ALWAYS_CHECK) == 0) - { - continue; - } - - // add name & variable to string. We add both since adding only the value could cause - // many collisions with variables all having value 0 or all 1. - string hashStr = it->first; - hashStr += it->second->GetString(); - - CryLog("%s", hashStr.c_str()); - } -#endif -} - -char* CXConsole::GetCheatVarAt(uint32 nOffset) -{ - if (m_bCheatHashDirty) - { - return NULL; - } - - size_t i = 0; - size_t nStart = nOffset; - - // iterate over all const cvars in our range - // then hash the string. - ConsoleVariablesMap::const_iterator it, end = m_mapVariables.end(); - for (it = m_mapVariables.begin(); it != end; ++it) - { - // only count cheat cvars - if ((it->second->GetFlags() & VF_CHEAT) == 0 || - (it->second->GetFlags() & VF_CHEAT_NOCHECK) != 0) - { - continue; - } - - // count up - i++; - - // if we haven't reached the first var continue - if (i - 1 < nStart) - { - continue; - } - - return (char*)it->first; - } - - return NULL; -} - - ////////////////////////////////////////////////////////////////////////// size_t CXConsole::GetSortedVars(AZStd::vector& pszArray, const char* szPrefix) { diff --git a/Code/Legacy/CrySystem/XConsole.h b/Code/Legacy/CrySystem/XConsole.h index 67d9371e8d..3ff9824e6f 100644 --- a/Code/Legacy/CrySystem/XConsole.h +++ b/Code/Legacy/CrySystem/XConsole.h @@ -182,11 +182,6 @@ public: virtual int GetNumVars(); virtual int GetNumVisibleVars(); virtual size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = 0); - virtual int GetNumCheatVars(); - virtual void SetCheatVarHashRange(size_t firstVar, size_t lastVar); - virtual void CalcCheatVarHash(); - virtual bool IsHashCalculated(); - virtual uint64 GetCheatVarHash(); virtual void FindVar(const char* substr); virtual const char* AutoComplete(const char* substr); virtual const char* AutoCompletePrev(const char* substr); @@ -231,9 +226,6 @@ public: // 0 if the operation failed ICVar* RegisterCVarGroup(const char* sName, const char* szFileName); - virtual void PrintCheatVars(bool bUseLastHashRange); - virtual char* GetCheatVarAt(uint32 nOffset); - void SetProcessingGroup(bool isGroup) { m_bIsProcessingGroup = isGroup; } bool GetIsProcessingGroup(void) const { return m_bIsProcessingGroup; } @@ -286,9 +278,6 @@ protected: // ------------------------------------------------------------------ static const char* GetFlagsString(const uint32 dwFlags); - static void CmdDumpAllAnticheatVars(IConsoleCmdArgs* pArgs); - static void CmdDumpLastHashedAnticheatVars(IConsoleCmdArgs* pArgs); - private: // ---------------------------------------------------------- typedef std::map ConsoleVariablesMap; // key points into string stored in ICVar or in .exe/.dll diff --git a/Code/Legacy/CrySystem/XConsoleVariable.cpp b/Code/Legacy/CrySystem/XConsoleVariable.cpp index ab6ed0b078..efd5ecd495 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.cpp +++ b/Code/Legacy/CrySystem/XConsoleVariable.cpp @@ -129,40 +129,6 @@ uint64 CXConsoleVariableBase::AddOnChangeFunctor(const SFunctor& pChangeFunctor) return newId; } -uint64 CXConsoleVariableBase::GetNumberOfOnChangeFunctors() const -{ - return m_changeFunctors.size(); -} - -const SFunctor& CXConsoleVariableBase::GetOnChangeFunctor(uint64 nFunctorId) const -{ - auto predicate = [nFunctorId](const std::pair& entry) -> bool { return entry.first == nFunctorId; }; - auto changeFunctor = std::find_if(m_changeFunctors.begin(), m_changeFunctors.end(), predicate); - if (changeFunctor != m_changeFunctors.end()) - { - return (*changeFunctor).second; - } - - static SFunctor sDummyFunctor; - assert(false && "[CXConsoleVariableBase::GetOnChangeFunctor] Trying to get a functor for an id that does not exist."); - - return sDummyFunctor; -} - -bool CXConsoleVariableBase::RemoveOnChangeFunctor(const uint64 nFunctorId) -{ - auto predicate = [nFunctorId](const std::pair& entry) -> bool { return entry.first == nFunctorId; }; - auto changeFunctor = std::find_if(m_changeFunctors.begin(), m_changeFunctors.end(), predicate); - - if (changeFunctor != m_changeFunctors.end()) - { - m_changeFunctors.erase(changeFunctor); - return true; - } - - return false; -} - ConsoleVarFunc CXConsoleVariableBase::GetOnChangeCallback() const { return m_pChangeFunc; diff --git a/Code/Legacy/CrySystem/XConsoleVariable.h b/Code/Legacy/CrySystem/XConsoleVariable.h index 122389407f..f761287b41 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.h +++ b/Code/Legacy/CrySystem/XConsoleVariable.h @@ -108,9 +108,6 @@ public: virtual void ForceSet(const char* s); virtual void SetOnChangeCallback(ConsoleVarFunc pChangeFunc); virtual uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) override; - virtual bool RemoveOnChangeFunctor(const uint64 nFunctorId) override; - virtual uint64 GetNumberOfOnChangeFunctors() const; - virtual const SFunctor& GetOnChangeFunctor(uint64 nFunctorId) const override; virtual ConsoleVarFunc GetOnChangeCallback() const; virtual bool ShouldReset() const { return (m_nFlags & VF_RESETTABLE) != 0; } @@ -250,7 +247,7 @@ public: virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } private: // -------------------------------------------------------------------------------------------- - AZStd::string m_sValue; + AZStd::string m_sValue; AZStd::string m_sDefault; //!< }; @@ -315,7 +312,7 @@ public: virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } protected: // -------------------------------------------------------------------------------------------- - int m_iValue; + int m_iValue; int m_iDefault; //!< }; @@ -382,7 +379,7 @@ public: virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } protected: // -------------------------------------------------------------------------------------------- - int64 m_iValue; + int64 m_iValue; int64 m_iDefault; //!< }; @@ -488,7 +485,7 @@ protected: private: // -------------------------------------------------------------------------------------------- - float m_fValue; + float m_fValue; float m_fDefault; //!< }; @@ -578,7 +575,7 @@ public: virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } private: // -------------------------------------------------------------------------------------------- - int& m_iValue; + int& m_iValue; int m_iDefault; //!< }; diff --git a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp index 9086f40ede..9897895dcd 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.cpp @@ -9,7 +9,6 @@ #include "EditorNavigationUtil.h" #include -#include #include #include #include @@ -47,7 +46,7 @@ namespace LmbrCentral Call(FN_OnTraversalStarted, requestId); } - void OnTraversalPathUpdate(PathfindRequest::NavigationRequestId requestId, const AZ::Vector3& nextPathPosition, const AZ::Vector3& inflectionPosition) override + void OnTraversalPathUpdate(PathfindRequest::NavigationRequestId requestId, const AZ::Vector3& nextPathPosition, const AZ::Vector3& inflectionPosition) override { Call(FN_OnTraversalPathUpdate, requestId, nextPathPosition, inflectionPosition); } @@ -460,7 +459,7 @@ namespace LmbrCentral const bool usesAZCharacterPhysics = Physics::CharacterRequestBus::FindFirstHandler(entityId) != nullptr; m_usesCharacterPhysics = usesLegacyCharacterPhysics || usesAZCharacterPhysics; - + AZ_Warning("NavigationComponent", usesAZCharacterPhysics || Physics::RigidBodyRequestBus::FindFirstHandler(entityId), "Entity %s cannot be moved physically because it is missing a physics component", GetEntity()->GetName().c_str()); @@ -791,10 +790,10 @@ namespace LmbrCentral m_lastResponseCache.SetNextPathPosition(nextPathPosition); m_lastResponseCache.SetInflectionPosition(inflectionPosition); - // when using the custom movement method we just update the path and rely on + // when using the custom movement method we just update the path and rely on // the user to move the entity NavigationComponentNotificationBus::Event(m_entity->GetId(), - &NavigationComponentNotificationBus::Events::OnTraversalPathUpdate, + &NavigationComponentNotificationBus::Events::OnTraversalPathUpdate, m_lastResponseCache.GetRequestId(), nextPathPosition, inflectionPosition); @@ -808,7 +807,7 @@ namespace LmbrCentral if (m_usesCharacterPhysics) { - Physics::CharacterRequestBus::Event(GetEntityId(), + Physics::CharacterRequestBus::Event(GetEntityId(), &Physics::CharacterRequestBus::Events::AddVelocity, targetVelocity); } else diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimUndoManager.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimUndoManager.cpp index 025b8c94d8..3a3234fdce 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimUndoManager.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimUndoManager.cpp @@ -6,11 +6,10 @@ * */ - #include "UiAnimUndoManager.h" #include "UiAnimUndoObject.h" #include "Undo/IUndoManagerListener.h" -#include +#include // UI Editor #include "EditorCommon.h" diff --git a/Gems/LyShine/Code/Editor/EditorCommon.h b/Gems/LyShine/Code/Editor/EditorCommon.h index 9af5958c67..a13332b0fd 100644 --- a/Gems/LyShine/Code/Editor/EditorCommon.h +++ b/Gems/LyShine/Code/Editor/EditorCommon.h @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/Gems/LyShine/Code/Editor/EditorWindow.cpp b/Gems/LyShine/Code/Editor/EditorWindow.cpp index 663570bbf0..a4ad4d7043 100644 --- a/Gems/LyShine/Code/Editor/EditorWindow.cpp +++ b/Gems/LyShine/Code/Editor/EditorWindow.cpp @@ -2112,8 +2112,8 @@ int EditorWindow::GetCanvasMaxHierarchyDepth(const LyShine::EntityArray& rootChi return depth; } - int numChildrenCurLevel = rootChildElements.size(); - int numChildrenNextLevel = 0; + size_t numChildrenCurLevel = rootChildElements.size(); + size_t numChildrenNextLevel = 0; std::list elementList(rootChildElements.begin(), rootChildElements.end()); while (!elementList.empty()) { diff --git a/Gems/LyShine/Code/Editor/HierarchyHelpers.cpp b/Gems/LyShine/Code/Editor/HierarchyHelpers.cpp index 5d97ecb83c..91e5781608 100644 --- a/Gems/LyShine/Code/Editor/HierarchyHelpers.cpp +++ b/Gems/LyShine/Code/Editor/HierarchyHelpers.cpp @@ -186,16 +186,20 @@ namespace HierarchyHelpers if (listOfNewlyCreatedTopLevelElements.empty()) { // This happens when the serialization version numbers DON'T match. - QMessageBox(QMessageBox::Critical, - "Error", - QString("Failed to load elements. The serialization format is incompatible."), - QMessageBox::Ok, widget->GetEditorWindow()).exec(); + QMessageBox( + QMessageBox::Critical, "Error", QString("Failed to load elements. The serialization format is incompatible."), QMessageBox::Ok, + widget->GetEditorWindow()) + .exec(); // Nothing more to do. return LyShine::EntityArray(); } - completeListOfNewlyCreatedTopLevelElements.push_back(listOfNewlyCreatedTopLevelElements); + completeListOfNewlyCreatedTopLevelElements.insert( + completeListOfNewlyCreatedTopLevelElements.end(), + listOfNewlyCreatedTopLevelElements.begin(), + listOfNewlyCreatedTopLevelElements.end() + ); } } diff --git a/Gems/LyShine/Code/Editor/PropertiesContainer.cpp b/Gems/LyShine/Code/Editor/PropertiesContainer.cpp index 9f9023f84d..e86cffcc08 100644 --- a/Gems/LyShine/Code/Editor/PropertiesContainer.cpp +++ b/Gems/LyShine/Code/Editor/PropertiesContainer.cpp @@ -544,7 +544,7 @@ AzToolsFramework::ComponentEditor* PropertiesContainer::CreateComponentEditor([[ { AzToolsFramework::ComponentEditor* editor = new AzToolsFramework::ComponentEditor(m_serializeContext, m_propertiesWidget, this); connect(editor, &AzToolsFramework::ComponentEditor::OnDisplayComponentEditorMenu, this, &PropertiesContainer::OnDisplayUiComponentEditorMenu); - + m_rowLayout->addWidget(editor); editor->hide(); @@ -788,7 +788,7 @@ void PropertiesContainer::Update() } else // more than one entity selected { - displayName = (ToString(selectedEntitiesAmount) + " elements selected").c_str(); + displayName = QString::number(selectedEntitiesAmount) + " elements selected"; } // Update the selected element display name diff --git a/Gems/LyShine/Code/Editor/SerializeHelpers.cpp b/Gems/LyShine/Code/Editor/SerializeHelpers.cpp index 724b6dee14..f9ce70caec 100644 --- a/Gems/LyShine/Code/Editor/SerializeHelpers.cpp +++ b/Gems/LyShine/Code/Editor/SerializeHelpers.cpp @@ -243,11 +243,14 @@ namespace SerializeHelpers insertBefore); } - // if a list of entities was passed then add all the entities that we added + // if a list of entities was passed then add all the entities that we added // to the list if (cumulativeListOfCreatedEntities) { - cumulativeListOfCreatedEntities->push_back(validatedListOfNewlyCreatedTopLevelElements); + cumulativeListOfCreatedEntities->insert( + cumulativeListOfCreatedEntities->end(), + validatedListOfNewlyCreatedTopLevelElements.begin(), + validatedListOfNewlyCreatedTopLevelElements.end()); } } @@ -363,7 +366,7 @@ namespace SerializeHelpers entityRestoreInfos.insert(entityRestoreInfos.end(), unserializedEntities->m_entityRestoreInfos.begin(), unserializedEntities->m_entityRestoreInfos.end()); entityRestoreInfos.insert(entityRestoreInfos.end(), - unserializedEntities->m_childEntityRestoreInfos.begin(), unserializedEntities->m_childEntityRestoreInfos.end()); + unserializedEntities->m_childEntityRestoreInfos.begin(), unserializedEntities->m_childEntityRestoreInfos.end()); } } // namespace EntityHelpers diff --git a/Gems/LyShine/Code/Source/UiCanvasComponent.cpp b/Gems/LyShine/Code/Source/UiCanvasComponent.cpp index 4b5f072966..d967b88610 100644 --- a/Gems/LyShine/Code/Source/UiCanvasComponent.cpp +++ b/Gems/LyShine/Code/Source/UiCanvasComponent.cpp @@ -706,7 +706,7 @@ AZStd::string UiCanvasComponent::GetUniqueChildName(AZ::EntityId parentEntityId, if (includeChildren) { - children.push_back(*includeChildren); + children.insert(children.end(),includeChildren->begin(),includeChildren->end()); } // First, check if base name is unique @@ -1862,7 +1862,7 @@ AZ::RHI::AttachmentId UiCanvasComponent::UseRenderTarget(const AZ::Name& renderT // Notify LyShine render pass that it needs to rebuild QueueRttPassRebuild(); - + return attachmentImage->GetAttachmentId(); } @@ -4101,7 +4101,7 @@ UiCanvasComponent* UiCanvasComponent::FixupPostLoad(AZ::Entity* canvasEntity, AZ canvasComponent->m_editorToGameEntityIdMap = *previousRemapTable; ReuseOrGenerateNewIdsAndFixRefs(&entityContainer, canvasComponent->m_editorToGameEntityIdMap, context); - + AzFramework::SliceEntityOwnershipServiceRequestBus::EventResult(isLoadingRootEntitySuccessful, canvasComponent->m_entityContext->GetContextId(), &AzFramework::SliceEntityOwnershipServiceRequestBus::Events::HandleRootEntityReloadedFromStream, rootSliceEntity, false, nullptr); diff --git a/Gems/LyShine/Code/Source/UiElementComponent.cpp b/Gems/LyShine/Code/Source/UiElementComponent.cpp index 0aa57e4041..cb81ea639c 100644 --- a/Gems/LyShine/Code/Source/UiElementComponent.cpp +++ b/Gems/LyShine/Code/Source/UiElementComponent.cpp @@ -561,7 +561,7 @@ LyShine::EntityArray UiElementComponent::FindAllChildrenIntersectingRect(const A // Check children of this child first // child elements do not have to be contained in the parent element's bounds LyShine::EntityArray childMatches = childElementComponent->FindAllChildrenIntersectingRect(bound0, bound1, isInGame); - result.push_back(childMatches); + result.insert(result.end(),childMatches.begin(),childMatches.end()); bool isSelectable = true; if (!isInGame) @@ -943,7 +943,7 @@ bool UiElementComponent::GetAreElementAndAncestorsEnabled() { return m_parentElementComponent->GetAreElementAndAncestorsEnabled(); } - + return true; } @@ -1327,7 +1327,7 @@ void UiElementComponent::Reflect(AZ::ReflectContext* context) serializeContext->Class() // Persistent IDs for this are simply the entity id ->PersistentId([](const void* instance) -> AZ::u64 - { + { const ChildEntityIdOrderEntry* entry = reinterpret_cast(instance); return static_cast(entry->m_entityId); }) @@ -1680,7 +1680,7 @@ void UiElementComponent::OnPatchEnd(const AZ::DataPatchNodeInfo& patchInfo) entityIdLoaded = true; } } - + if (entityIdLoaded) { oldChildrenDataPatchFound = true; @@ -1812,7 +1812,7 @@ void UiElementComponent::OnPatchEnd(const AZ::DataPatchNodeInfo& patchInfo) m_childEntityIdOrder.push_back({elementChanged.second, m_childEntityIdOrder.size()}); } } - + // sort the added elements by index AZStd::sort(elementsAdded.begin(), elementsAdded.end()); for (auto& elementAdded : elementsAdded) diff --git a/Gems/LyShine/Code/Tests/UiDynamicScrollBoxComponentTest.cpp b/Gems/LyShine/Code/Tests/UiDynamicScrollBoxComponentTest.cpp index 3ea3550e76..425ab6bb9a 100644 --- a/Gems/LyShine/Code/Tests/UiDynamicScrollBoxComponentTest.cpp +++ b/Gems/LyShine/Code/Tests/UiDynamicScrollBoxComponentTest.cpp @@ -93,7 +93,7 @@ namespace UnitTest static int FindDescendantCount(const AZ::Entity* entity) { LyShine::EntityArray children = entity->FindComponent()->GetChildElements(); - int numDescendants = children.size(); + int numDescendants = static_cast(children.size()); for(const AZ::Entity* child : children) { numDescendants += FindDescendantCount(child); @@ -105,7 +105,7 @@ namespace UnitTest static int FindCanvasElementCount(UiCanvasComponent* uiCanvasComponent) { const LyShine::EntityArray childEntities = uiCanvasComponent->GetChildElements(); - int numCanvasElements = childEntities.size(); + int numCanvasElements = static_cast(childEntities.size()); for (const AZ::Entity* childEntity : childEntities) { numCanvasElements += FindDescendantCount(childEntity); diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp index 39e84d24a7..7e32301b71 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.cpp @@ -12,7 +12,6 @@ #include "AnimSplineTrack.h" #include "CompoundSplineTrack.h" #include "BoolTrack.h" -#include "IPostEffectGroup.h" #include "Maestro/Types/AnimNodeType.h" #include "Maestro/Types/AnimParamType.h" #include "Maestro/Types/AnimValueType.h" @@ -236,7 +235,7 @@ CAnimNode* CAnimPostFXNode::CreateNode(const int id, AnimNodeType nodeType) retNode = aznew CAnimPostFXNode(id, nodeType, pDesc); static_cast(retNode)->m_nodeType = nodeType; } - + return retNode; } diff --git a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h index 63f287f513..0c8bc38f1a 100644 --- a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h @@ -12,6 +12,8 @@ #pragma once #include "AnimNode.h" +#include +#include class CAnimMaterialNode : public CAnimNode @@ -43,7 +45,7 @@ public: virtual void SetKeyValueRange(float fMin, float fMax){ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; virtual void InitializeTrack(IAnimTrack* pTrack, const CAnimParamType& paramType); - + static void Reflect(AZ::ReflectContext* context); protected: diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.h b/Gems/Maestro/Code/Source/Cinematics/Movie.h index 7c8edd15ae..0d7d1743f1 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.h +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.h @@ -15,6 +15,9 @@ #pragma once #include +#include +#include + #include "IMovieSystem.h" #include "IShader.h" diff --git a/Gems/Maestro/Code/Source/MaestroSystemComponent.h b/Gems/Maestro/Code/Source/MaestroSystemComponent.h index b27075dbc0..8b37dee183 100644 --- a/Gems/Maestro/Code/Source/MaestroSystemComponent.h +++ b/Gems/Maestro/Code/Source/MaestroSystemComponent.h @@ -11,6 +11,7 @@ #include #include #include +#include #include "Cinematics/Movie.h" #include "Maestro/MaestroBus.h" From 6f589ad50ccb8b43bacd466ea479ae1529f2008b Mon Sep 17 00:00:00 2001 From: Jonny Galloway Date: Mon, 30 Aug 2021 15:42:26 -0500 Subject: [PATCH 023/355] color grading workflow (#3152) * color grading workflow assets, python scripts, ~and test data for Nuke and PS. Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * minor changes Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * pep8 reformate code style, clean up, address CR Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * Pep8 refactor, some DRY refactoring. Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * simplification write_azasset() Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * corrected code and further simplified () Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * updated readme.txt, I was mistakenly converting the wrong lut to engine Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * refactoring, simplification and some re-org Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * fixed bad loop in old_lut_helper Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * improve the lut_helper and corrected lut shaping Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * skip non-digit metadata in 3DL files Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * file name fix Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * nit: renamed a tag in comment Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * style Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * cleanup, cmd readme Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * fixed WINGHOME Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * Updated the readme with basic instructions Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * fixed py bootstrapping errors Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * removed log file (shouldn't be there) Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * re-gen bad test lut (forgot) Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> Co-authored-by: Jonny Gallowy <~gallowj@amazon.com> --- ...treme-grade_inv-Log2-48nits_32_LUT.azasset | 32780 ++++++++++++++++ .../test-grade_inv-Log2-48nits_32_LUT.azasset | 32780 ++++++++++++++++ .../inv-Log2-48nits/Test_3DL_32_LUT.azasset | 4922 +++ .../inv-Log2-48nits/test_clt_32_LUT.azasset | 32777 +++++++++++++++ .../test_hue-sat_32_LUT.azasset | 32777 +++++++++++++++ .../Editor/Scripts/ColorGrading/.gitignore | 1 + .../Editor/Scripts/ColorGrading/__init__.py | 258 + .../capture_displaymapperpassthrough.py | 61 + .../ColorGrading/exr_to_3dl_azasset.py | 120 + .../ColorGrading/from_3dl_to_azasset.py | 114 + .../Editor/Scripts/ColorGrading/initialize.py | 123 + .../Scripts/ColorGrading/lut_compositor.py | 110 + .../Editor/Scripts/ColorGrading/lut_helper.py | 186 + .../Common/Editor/Scripts/bootstrap.py | 60 + .../Common/Tools/ColorGrading/.gitignore | 1 + .../LUTs/base_Log2-1000nits_16_LUT.exr | 3 + .../LUTs/base_Log2-1000nits_32_LUT.exr | 3 + .../LUTs/base_Log2-1000nits_64_LUT.exr | 3 + .../LUTs/base_Log2-2000nits_16_LUT.exr | 3 + .../LUTs/base_Log2-2000nits_32_LUT.exr | 3 + .../LUTs/base_Log2-2000nits_64_LUT.exr | 3 + .../LUTs/base_Log2-4000nits_16_LUT.exr | 3 + .../LUTs/base_Log2-4000nits_32_LUT.exr | 3 + .../LUTs/base_Log2-4000nits_64_LUT.exr | 3 + .../LUTs/base_Log2-48nits_16_LUT.exr | 3 + .../LUTs/base_Log2-48nits_32_LUT.exr | 3 + .../LUTs/base_Log2-48nits_64_LUT.exr | 3 + .../Resources/LUTs/from_ACEScg_to_sRGB.icc | Bin 0 -> 394128 bytes .../Resources/LUTs/linear_16_LUT.exr | 3 + .../Resources/LUTs/linear_32_LUT.exr | 3 + .../Resources/LUTs/linear_64_LUT.exr | 3 + .../Nuke_Test_Extreme_Grade.nk | 230 + .../Nuke_Test_Extreme_Grade.nk~ | 232 + .../Shot_post_test-extreme-grade.exr | 3 + ...t-extreme-grade_inv-Log2-48nits_32_LUT.3dl | 32769 +++++++++++++++ ...treme-grade_inv-Log2-48nits_32_LUT.azasset | 32780 ++++++++++++++++ ...t-extreme-grade_inv-Log2-48nits_32_LUT.exr | 3 + .../HDR/Test_Grade/Shot_post_test-grade.exr | 3 + .../Nuke/HDR/Test_Grade/Test-Grade.nk | 225 + .../Nuke/HDR/Test_Grade/Test-Grade.nk~ | 227 + .../test-grade_inv-Log2-48nits_32_LUT.3dl | 32769 +++++++++++++++ .../test-grade_inv-Log2-48nits_32_LUT.azasset | 32780 ++++++++++++++++ .../test-grade_inv-Log2-48nits_32_LUT.exr | 3 + .../Nuke/HDR/displaymapperpassthrough.dds | 3 + .../Nuke/HDR/displaymapperpassthrough.exr | 3 + .../TestData/Nuke/O3DE_HDR_Nuke_Color_Grading | 57 + .../Nuke/O3DE_HDR_Nuke_Color_Grading.autosave | 125 + .../Photoshop/Log2-48nits/CLT_grade.psd | 3 + .../LUT_layer_composite_hue-sat_grade.psd | 3 + .../framebuffer_ACEScg_to_sRGB_icc.exr | 3 + .../Log2-48nits/i_shaped/test_clt_32_LUT.exr | 3 + .../i_shaped/test_hue-sat_32_LUT.exr | 3 + .../o_invShaped/Test_3DL_32_LUT.azasset | 4922 +++ .../o_invShaped/test_clt_32_LUT.3dl | 32769 +++++++++++++++ .../o_invShaped/test_clt_32_LUT.azasset | 32777 +++++++++++++++ .../o_invShaped/test_hue-sat_32_LUT.3dl | 32769 +++++++++++++++ .../o_invShaped/test_hue-sat_32_LUT.azasset | 32777 +++++++++++++++ .../TestData/displaymapperpassthrough.dds | 3 + .../TestData/displaymapperpassthrough.exr | 3 + .../Tools/ColorGrading/cmdline/.gitignore | 1 + .../cmdline/CMD_ColorGradingTools.bat | 52 + .../Tools/ColorGrading/cmdline/Env_Core.bat | 129 + .../Tools/ColorGrading/cmdline/Env_Python.bat | 102 + .../Tools/ColorGrading/cmdline/Env_Tools.bat | 88 + .../ColorGrading/cmdline/Env_WingIDE.bat | 67 + .../cmdline/Launch_WingIDE-7-1.bat | 99 + .../Tools/ColorGrading/cmdline/README.txt | 26 + .../cmdline/User_Env.bat.template | 41 + .../Common/Tools/ColorGrading/readme.txt | 98 + 69 files changed, 406065 insertions(+) create mode 100644 Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-grade_inv-Log2-48nits_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/Test_3DL_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_clt_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_hue-sat_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/.gitignore create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/capture_displaymapperpassthrough.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py create mode 100644 Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/.gitignore create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_16_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_64_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_16_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_64_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_16_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_64_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_16_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_64_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/from_ACEScg_to_sRGB.icc create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_16_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_64_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.3dl create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.3dl create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.dds create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading.autosave create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/framebuffer_ACEScg_to_sRGB_icc.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_clt_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_hue-sat_32_LUT.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/Test_3DL_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.3dl create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.3dl create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.azasset create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.dds create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/.gitignore create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Tools.bat create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/README.txt create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template create mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/readme.txt diff --git a/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset new file mode 100644 index 0000000000..66f3b57564 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset @@ -0,0 +1,32780 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [ + 0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [ + 0, 0, 0, + 0, 40, 0, + 0, 176, 0, + 0, 310, 0, + 0, 444, 0, + 0, 578, 0, + 0, 711, 0, + 0, 844, 0, + 0, 976, 0, + 0, 1109, 0, + 0, 1241, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 235, 0, 150, + 0, 22, 0, + 0, 162, 0, + 0, 300, 0, + 0, 437, 0, + 0, 572, 0, + 0, 707, 0, + 0, 841, 0, + 0, 974, 0, + 0, 1107, 0, + 0, 1240, 0, + 0, 1373, 0, + 0, 1505, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 474, 0, 352, + 349, 0, 225, + 98, 143, 0, + 0, 286, 0, + 0, 427, 0, + 0, 565, 0, + 0, 701, 0, + 0, 836, 0, + 0, 971, 0, + 0, 1105, 0, + 0, 1238, 0, + 0, 1371, 0, + 0, 1504, 0, + 0, 1637, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 672, 0, 529, + 595, 0, 448, + 467, 117, 309, + 205, 267, 14, + 0, 412, 0, + 0, 554, 0, + 0, 693, 0, + 0, 831, 0, + 0, 967, 0, + 0, 1102, 0, + 0, 1236, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 848, 0, 693, + 797, 0, 638, + 719, 78, 551, + 588, 240, 402, + 318, 393, 67, + 0, 540, 0, + 0, 683, 0, + 0, 823, 0, + 0, 961, 0, + 0, 1097, 0, + 0, 1233, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1010, 0, 848, + 975, 0, 809, + 924, 22, 751, + 845, 201, 661, + 712, 365, 502, + 435, 520, 130, + 0, 669, 0, + 0, 813, 0, + 0, 953, 0, + 0, 1092, 0, + 0, 1228, 0, + 0, 1364, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1766, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1163, 0, 996, + 1139, 0, 968, + 1104, 0, 928, + 1052, 143, 869, + 972, 326, 775, + 837, 493, 609, + 555, 649, 202, + 0, 798, 0, + 0, 943, 0, + 0, 1084, 0, + 0, 1223, 0, + 0, 1360, 0, + 0, 1496, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1898, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1311, 0, 1139, + 1293, 0, 1119, + 1269, 0, 1091, + 1233, 52, 1050, + 1181, 267, 990, + 1101, 452, 893, + 965, 621, 721, + 678, 778, 283, + 0, 928, 0, + 0, 1073, 0, + 0, 1215, 0, + 0, 1354, 0, + 0, 1491, 0, + 0, 1627, 0, + 0, 1762, 0, + 0, 1897, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1454, 0, 1280, + 1441, 0, 1265, + 1424, 0, 1245, + 1399, 0, 1216, + 1363, 174, 1175, + 1311, 393, 1113, + 1230, 580, 1015, + 1093, 750, 837, + 804, 908, 374, + 0, 1059, 0, + 0, 1204, 0, + 0, 1346, 0, + 0, 1486, 0, + 0, 1623, 0, + 0, 1759, 0, + 0, 1894, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1595, 0, 1418, + 1585, 0, 1407, + 1572, 0, 1393, + 1554, 0, 1372, + 1530, 9, 1343, + 1494, 298, 1301, + 1441, 520, 1239, + 1360, 709, 1139, + 1222, 880, 957, + 931, 1039, 472, + 0, 1190, 0, + 0, 1336, 0, + 0, 1478, 0, + 0, 1617, 0, + 0, 1755, 0, + 0, 1891, 0, + 0, 2026, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1733, 0, 1555, + 1726, 0, 1547, + 1716, 0, 1536, + 1703, 0, 1521, + 1686, 0, 1501, + 1661, 130, 1471, + 1625, 424, 1429, + 1572, 649, 1366, + 1491, 839, 1265, + 1352, 1011, 1080, + 1059, 1170, 577, + 0, 1321, 0, + 0, 1467, 0, + 0, 1610, 0, + 0, 1749, 0, + 0, 1887, 0, + 0, 2023, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1869, 0, 1690, + 1864, 0, 1684, + 1857, 0, 1676, + 1848, 0, 1666, + 1835, 0, 1651, + 1817, 0, 1630, + 1792, 254, 1601, + 1756, 552, 1558, + 1704, 778, 1494, + 1622, 970, 1392, + 1483, 1141, 1205, + 1188, 1301, 687, + 0, 1453, 0, + 0, 1599, 0, + 0, 1741, 0, + 0, 1881, 0, + 0, 2019, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2005, 0, 1825, + 2001, 0, 1821, + 1996, 0, 1815, + 1989, 0, 1807, + 1979, 0, 1796, + 1966, 0, 1781, + 1949, 0, 1760, + 1924, 379, 1731, + 1888, 681, 1688, + 1835, 908, 1624, + 1753, 1100, 1521, + 1614, 1272, 1332, + 1318, 1432, 803, + 0, 1584, 0, + 0, 1731, 0, + 0, 1873, 0, + 0, 2013, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2139, 0, 1959, + 2137, 0, 1956, + 2133, 0, 1951, + 2127, 0, 1945, + 2121, 0, 1937, + 2111, 0, 1927, + 2099, 0, 1912, + 2081, 0, 1891, + 2055, 506, 1861, + 2019, 810, 1818, + 1967, 1038, 1754, + 1885, 1231, 1650, + 1745, 1404, 1460, + 1448, 1564, 922, + 0, 1716, 0, + 0, 1863, 0, + 0, 2005, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2273, 0, 2093, + 2271, 0, 2091, + 2269, 0, 2087, + 2265, 0, 2083, + 2259, 0, 2077, + 2253, 0, 2069, + 2243, 0, 2057, + 2231, 0, 2043, + 2213, 60, 2022, + 2187, 635, 1992, + 2151, 941, 1949, + 2099, 1169, 1884, + 2016, 1363, 1781, + 1877, 1536, 1589, + 1579, 1696, 1044, + 0, 1848, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2225, + 2405, 0, 2223, + 2403, 0, 2221, + 2401, 0, 2219, + 2397, 0, 2213, + 2391, 0, 2207, + 2385, 0, 2199, + 2375, 0, 2189, + 2361, 0, 2173, + 2345, 182, 2153, + 2319, 764, 2123, + 2283, 1071, 2081, + 2231, 1301, 2015, + 2149, 1494, 1911, + 2008, 1667, 1719, + 1710, 1828, 1168, + 0, 1980, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2539, 0, 2359, + 2539, 0, 2357, + 2537, 0, 2355, + 2535, 0, 2353, + 2533, 0, 2349, + 2529, 0, 2345, + 2523, 0, 2339, + 2517, 0, 2331, + 2507, 0, 2321, + 2493, 0, 2305, + 2475, 306, 2285, + 2451, 894, 2255, + 2415, 1202, 2211, + 2363, 1432, 2147, + 2279, 1626, 2042, + 2141, 1799, 1850, + 1842, 1960, 1295, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2491, + 2671, 0, 2491, + 2671, 0, 2489, + 2669, 0, 2487, + 2667, 0, 2485, + 2665, 0, 2481, + 2661, 0, 2477, + 2655, 0, 2471, + 2649, 0, 2463, + 2639, 0, 2453, + 2625, 0, 2437, + 2607, 433, 2415, + 2583, 1025, 2387, + 2547, 1334, 2343, + 2493, 1564, 2279, + 2411, 1758, 2173, + 2273, 1931, 1981, + 1973, 2091, 1423, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2623, + 2805, 0, 2623, + 2803, 0, 2623, + 2803, 0, 2621, + 2801, 0, 2619, + 2799, 0, 2617, + 2797, 0, 2613, + 2793, 0, 2609, + 2787, 0, 2603, + 2781, 0, 2595, + 2771, 0, 2583, + 2757, 0, 2569, + 2741, 560, 2547, + 2715, 1155, 2517, + 2679, 1465, 2475, + 2625, 1696, 2409, + 2543, 1890, 2305, + 2403, 2063, 2111, + 2105, 2223, 1552, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2745, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2715, + 2891, 0, 2701, + 2873, 689, 2679, + 2847, 1287, 2649, + 2811, 1597, 2607, + 2759, 1828, 2541, + 2675, 2022, 2437, + 2535, 2195, 2243, + 2237, 2355, 1681, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2847, + 3023, 0, 2833, + 3005, 819, 2811, + 2979, 1418, 2781, + 2943, 1729, 2739, + 2891, 1959, 2673, + 2807, 2153, 2569, + 2667, 2327, 2375, + 2369, 2487, 1811, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3201, 0, 3017, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2979, + 3155, 0, 2965, + 3137, 949, 2943, + 3111, 1550, 2913, + 3075, 1860, 2871, + 3023, 2091, 2805, + 2939, 2285, 2701, + 2801, 2459, 2507, + 2501, 2619, 1942, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3111, + 3287, 0, 3097, + 3269, 1080, 3075, + 3243, 1682, 3045, + 3207, 1992, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2751, 2073, + 0, 2905, 0, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3243, + 3419, 0, 3229, + 3401, 1211, 3207, + 3375, 1813, 3177, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2205, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3465, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4009, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3375, + 3551, 0, 3361, + 3533, 1342, 3339, + 3507, 1945, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2337, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3735, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3547, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3711, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3507, + 3683, 0, 3493, + 3665, 1474, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2813, 3229, + 3329, 2987, 3035, + 3029, 3149, 2467, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1605, 3603, + 3771, 2209, 3573, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2599, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1737, 3735, + 3903, 2341, 3705, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2731, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1869, 3867, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3015, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2863, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2001, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2995, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 0, 0, 13, + 0, 54, 0, + 0, 186, 0, + 0, 318, 0, + 0, 450, 0, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 258, 0, 216, + 36, 36, 36, + 0, 172, 0, + 0, 308, 0, + 0, 442, 0, + 0, 576, 0, + 0, 710, 0, + 0, 843, 0, + 0, 976, 0, + 0, 1108, 0, + 0, 1241, 0, + 0, 1373, 0, + 0, 1506, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 488, 0, 395, + 367, 11, 282, + 129, 154, 65, + 0, 294, 0, + 0, 432, 0, + 0, 569, 0, + 0, 704, 0, + 0, 839, 0, + 0, 973, 0, + 0, 1106, 0, + 0, 1239, 0, + 0, 1372, 0, + 0, 1505, 0, + 0, 1637, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 681, 0, 560, + 606, 0, 484, + 481, 128, 357, + 230, 275, 101, + 0, 418, 0, + 0, 559, 0, + 0, 697, 0, + 0, 833, 0, + 0, 969, 0, + 0, 1103, 0, + 0, 1237, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 854, 0, 714, + 804, 0, 662, + 727, 91, 580, + 599, 249, 441, + 337, 399, 146, + 0, 544, 0, + 0, 686, 0, + 0, 826, 0, + 0, 963, 0, + 0, 1099, 0, + 0, 1234, 0, + 0, 1368, 0, + 0, 1502, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1015, 0, 863, + 980, 0, 825, + 929, 36, 770, + 851, 210, 683, + 720, 372, 534, + 450, 525, 199, + 0, 672, 0, + 0, 815, 0, + 0, 955, 0, + 0, 1093, 0, + 0, 1229, 0, + 0, 1365, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1167, 0, 1007, + 1142, 0, 980, + 1107, 0, 941, + 1056, 154, 883, + 977, 333, 793, + 844, 498, 634, + 567, 652, 262, + 0, 801, 0, + 0, 945, 0, + 0, 1085, 0, + 0, 1224, 0, + 0, 1361, 0, + 0, 1496, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1313, 0, 1147, + 1296, 0, 1128, + 1271, 0, 1100, + 1236, 65, 1060, + 1184, 275, 1001, + 1104, 458, 907, + 969, 625, 741, + 687, 781, 334, + 0, 930, 0, + 0, 1075, 0, + 0, 1216, 0, + 0, 1355, 0, + 0, 1492, 0, + 0, 1628, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1456, 0, 1286, + 1443, 0, 1271, + 1425, 0, 1251, + 1401, 0, 1223, + 1365, 184, 1182, + 1313, 399, 1122, + 1233, 584, 1025, + 1097, 753, 853, + 810, 910, 416, + 0, 1060, 0, + 0, 1206, 0, + 0, 1347, 0, + 0, 1486, 0, + 0, 1624, 0, + 0, 1760, 0, + 0, 1894, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1596, 0, 1422, + 1586, 0, 1412, + 1574, 0, 1397, + 1556, 0, 1377, + 1531, 23, 1348, + 1495, 306, 1307, + 1443, 525, 1245, + 1362, 712, 1147, + 1225, 882, 969, + 936, 1040, 506, + 0, 1191, 0, + 0, 1337, 0, + 0, 1479, 0, + 0, 1618, 0, + 0, 1755, 0, + 0, 1891, 0, + 0, 2026, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1734, 0, 1558, + 1727, 0, 1550, + 1717, 0, 1539, + 1704, 0, 1525, + 1687, 0, 1504, + 1662, 141, 1475, + 1626, 430, 1434, + 1574, 652, 1371, + 1492, 841, 1271, + 1354, 1012, 1089, + 1063, 1171, 604, + 0, 1322, 0, + 0, 1468, 0, + 0, 1610, 0, + 0, 1750, 0, + 0, 1887, 0, + 0, 2023, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1870, 0, 1693, + 1865, 0, 1687, + 1858, 0, 1679, + 1848, 0, 1668, + 1836, 0, 1653, + 1818, 0, 1633, + 1793, 262, 1604, + 1757, 556, 1561, + 1704, 781, 1498, + 1623, 971, 1397, + 1485, 1142, 1212, + 1191, 1302, 709, + 0, 1453, 0, + 0, 1599, 0, + 0, 1742, 0, + 0, 1881, 0, + 0, 2019, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2005, 0, 1827, + 2001, 0, 1822, + 1996, 0, 1817, + 1989, 0, 1809, + 1980, 0, 1798, + 1967, 0, 1783, + 1949, 0, 1762, + 1924, 386, 1733, + 1888, 684, 1690, + 1836, 910, 1627, + 1754, 1101, 1524, + 1615, 1273, 1337, + 1320, 1433, 819, + 0, 1585, 0, + 0, 1731, 0, + 0, 1874, 0, + 0, 2013, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2139, 0, 1960, + 2137, 0, 1957, + 2133, 0, 1953, + 2127, 0, 1947, + 2121, 0, 1939, + 2111, 0, 1928, + 2099, 0, 1913, + 2081, 0, 1892, + 2055, 511, 1863, + 2020, 813, 1820, + 1967, 1040, 1756, + 1885, 1232, 1653, + 1746, 1405, 1464, + 1450, 1565, 935, + 0, 1717, 0, + 0, 1863, 0, + 0, 2005, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2273, 0, 2093, + 2271, 0, 2091, + 2269, 0, 2087, + 2265, 0, 2083, + 2259, 0, 2077, + 2253, 0, 2069, + 2243, 0, 2059, + 2231, 0, 2044, + 2213, 72, 2023, + 2187, 638, 1993, + 2151, 943, 1950, + 2099, 1171, 1886, + 2017, 1363, 1783, + 1877, 1536, 1592, + 1580, 1696, 1054, + 0, 1848, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2227, + 2405, 0, 2225, + 2403, 0, 2223, + 2401, 0, 2219, + 2397, 0, 2215, + 2391, 0, 2209, + 2385, 0, 2201, + 2375, 0, 2189, + 2363, 0, 2175, + 2345, 192, 2153, + 2319, 767, 2125, + 2283, 1073, 2081, + 2231, 1302, 2017, + 2149, 1495, 1913, + 2009, 1668, 1722, + 1711, 1828, 1176, + 0, 1980, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2539, 0, 2359, + 2539, 0, 2357, + 2537, 0, 2357, + 2535, 0, 2353, + 2533, 0, 2351, + 2529, 0, 2345, + 2523, 0, 2341, + 2517, 0, 2333, + 2507, 0, 2321, + 2495, 0, 2305, + 2477, 314, 2285, + 2451, 896, 2255, + 2415, 1203, 2213, + 2363, 1433, 2147, + 2281, 1626, 2043, + 2141, 1799, 1851, + 1842, 1960, 1301, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2491, + 2671, 0, 2491, + 2671, 0, 2489, + 2669, 0, 2487, + 2667, 0, 2485, + 2665, 0, 2481, + 2661, 0, 2477, + 2655, 0, 2471, + 2649, 0, 2463, + 2639, 0, 2453, + 2627, 0, 2437, + 2609, 438, 2417, + 2583, 1026, 2387, + 2547, 1334, 2343, + 2495, 1564, 2279, + 2413, 1758, 2175, + 2273, 1931, 1982, + 1974, 2091, 1427, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2623, + 2803, 0, 2623, + 2803, 0, 2621, + 2801, 0, 2619, + 2799, 0, 2617, + 2797, 0, 2613, + 2793, 0, 2609, + 2787, 0, 2603, + 2781, 0, 2595, + 2771, 0, 2585, + 2759, 0, 2569, + 2741, 565, 2549, + 2715, 1157, 2519, + 2679, 1466, 2475, + 2627, 1696, 2411, + 2543, 1890, 2305, + 2405, 2063, 2113, + 2105, 2223, 1555, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2745, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2717, + 2891, 0, 2701, + 2873, 693, 2679, + 2847, 1288, 2651, + 2811, 1597, 2607, + 2759, 1828, 2541, + 2675, 2022, 2437, + 2537, 2195, 2243, + 2237, 2355, 1684, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2847, + 3023, 0, 2833, + 3005, 821, 2811, + 2979, 1419, 2781, + 2943, 1729, 2739, + 2891, 1960, 2673, + 2807, 2153, 2569, + 2669, 2327, 2375, + 2369, 2487, 1813, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2979, + 3155, 0, 2965, + 3137, 951, 2943, + 3111, 1550, 2913, + 3075, 1861, 2871, + 3023, 2091, 2805, + 2941, 2285, 2701, + 2801, 2459, 2507, + 2501, 2619, 1944, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3111, + 3287, 0, 3097, + 3269, 1081, 3075, + 3243, 1682, 3045, + 3207, 1993, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2753, 2075, + 0, 2905, 0, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3243, + 3419, 0, 3229, + 3401, 1212, 3207, + 3375, 1814, 3177, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2205, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4009, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3375, + 3551, 0, 3361, + 3533, 1343, 3339, + 3507, 1946, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2337, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3735, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3711, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3507, + 3683, 0, 3493, + 3665, 1474, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2813, 3229, + 3329, 2987, 3035, + 3029, 3149, 2469, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1606, 3603, + 3771, 2209, 3573, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1738, 3735, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2731, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1869, 3867, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3015, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2863, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2001, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2995, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 7, 0, 127, + 0, 71, 0, + 0, 199, 0, + 0, 328, 0, + 0, 457, 0, + 0, 587, 0, + 0, 718, 0, + 0, 849, 0, + 0, 980, 0, + 0, 1112, 0, + 0, 1243, 0, + 0, 1375, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 287, 0, 292, + 83, 54, 145, + 0, 186, 0, + 0, 318, 0, + 0, 450, 0, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 506, 0, 448, + 390, 30, 348, + 168, 168, 168, + 0, 304, 0, + 0, 440, 0, + 0, 574, 0, + 0, 708, 0, + 0, 842, 0, + 0, 975, 0, + 0, 1108, 0, + 0, 1240, 0, + 0, 1373, 0, + 0, 1505, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 693, 0, 597, + 620, 0, 527, + 499, 143, 414, + 261, 286, 197, + 0, 426, 0, + 0, 564, 0, + 0, 701, 0, + 0, 836, 0, + 0, 971, 0, + 0, 1105, 0, + 0, 1238, 0, + 0, 1371, 0, + 0, 1504, 0, + 0, 1637, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 862, 0, 741, + 813, 0, 692, + 738, 107, 616, + 613, 260, 489, + 362, 407, 233, + 0, 550, 0, + 0, 691, 0, + 0, 829, 0, + 0, 965, 0, + 0, 1100, 0, + 0, 1235, 0, + 0, 1369, 0, + 0, 1502, 0, + 0, 1636, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1020, 0, 882, + 986, 0, 846, + 936, 54, 794, + 859, 223, 712, + 731, 381, 573, + 469, 531, 278, + 0, 677, 0, + 0, 818, 0, + 0, 958, 0, + 0, 1095, 0, + 0, 1231, 0, + 0, 1366, 0, + 0, 1500, 0, + 0, 1634, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1171, 0, 1021, + 1146, 0, 995, + 1112, 0, 957, + 1061, 168, 902, + 983, 343, 815, + 852, 504, 666, + 582, 657, 331, + 0, 804, 0, + 0, 947, 0, + 0, 1087, 0, + 0, 1225, 0, + 0, 1362, 0, + 0, 1497, 0, + 0, 1632, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1316, 0, 1158, + 1299, 0, 1139, + 1274, 0, 1112, + 1239, 82, 1073, + 1188, 286, 1015, + 1109, 465, 925, + 976, 630, 766, + 699, 784, 394, + 0, 933, 0, + 0, 1077, 0, + 0, 1217, 0, + 0, 1356, 0, + 0, 1493, 0, + 0, 1628, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1458, 0, 1293, + 1445, 0, 1279, + 1428, 0, 1260, + 1403, 0, 1232, + 1368, 197, 1192, + 1316, 407, 1133, + 1236, 590, 1039, + 1101, 757, 873, + 819, 913, 466, + 0, 1062, 0, + 0, 1207, 0, + 0, 1348, 0, + 0, 1487, 0, + 0, 1624, 0, + 0, 1760, 0, + 0, 1895, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1597, 0, 1428, + 1588, 0, 1418, + 1575, 0, 1403, + 1558, 0, 1383, + 1533, 42, 1355, + 1497, 316, 1315, + 1445, 531, 1254, + 1365, 717, 1157, + 1229, 885, 985, + 943, 1042, 548, + 0, 1192, 0, + 0, 1338, 0, + 0, 1479, 0, + 0, 1618, 0, + 0, 1756, 0, + 0, 1892, 0, + 0, 2027, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1735, 0, 1562, + 1728, 0, 1555, + 1718, 0, 1544, + 1706, 0, 1529, + 1688, 0, 1509, + 1663, 155, 1480, + 1628, 438, 1439, + 1575, 657, 1377, + 1494, 845, 1279, + 1357, 1014, 1101, + 1068, 1172, 638, + 0, 1323, 0, + 0, 1469, 0, + 0, 1611, 0, + 0, 1750, 0, + 0, 1887, 0, + 0, 2023, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1871, 0, 1696, + 1866, 0, 1690, + 1859, 0, 1682, + 1849, 0, 1672, + 1837, 0, 1657, + 1819, 0, 1636, + 1794, 273, 1607, + 1758, 562, 1566, + 1706, 784, 1503, + 1624, 974, 1403, + 1487, 1144, 1221, + 1195, 1303, 736, + 0, 1454, 0, + 0, 1600, 0, + 0, 1742, 0, + 0, 1882, 0, + 0, 2019, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2006, 0, 1829, + 2002, 0, 1825, + 1997, 0, 1819, + 1990, 0, 1811, + 1981, 0, 1800, + 1968, 0, 1785, + 1950, 0, 1765, + 1925, 394, 1736, + 1889, 689, 1694, + 1837, 913, 1630, + 1755, 1103, 1529, + 1617, 1275, 1344, + 1323, 1434, 841, + 0, 1585, 0, + 0, 1732, 0, + 0, 1874, 0, + 0, 2013, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2141, 0, 1962, + 2137, 0, 1959, + 2133, 0, 1955, + 2129, 0, 1949, + 2121, 0, 1941, + 2113, 0, 1930, + 2099, 0, 1915, + 2081, 0, 1894, + 2057, 518, 1865, + 2020, 816, 1822, + 1968, 1042, 1759, + 1886, 1234, 1657, + 1747, 1405, 1470, + 1452, 1565, 952, + 0, 1717, 0, + 0, 1863, 0, + 0, 2006, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2273, 0, 2095, + 2271, 0, 2093, + 2269, 0, 2089, + 2265, 0, 2085, + 2259, 0, 2079, + 2253, 0, 2071, + 2243, 0, 2061, + 2231, 0, 2045, + 2213, 89, 2024, + 2187, 643, 1995, + 2151, 945, 1952, + 2099, 1172, 1888, + 2017, 1364, 1785, + 1878, 1537, 1596, + 1582, 1697, 1067, + 0, 1849, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2227, + 2405, 0, 2225, + 2403, 0, 2223, + 2401, 0, 2219, + 2397, 0, 2215, + 2391, 0, 2209, + 2385, 0, 2201, + 2375, 0, 2191, + 2363, 0, 2175, + 2345, 205, 2155, + 2319, 771, 2125, + 2283, 1074, 2083, + 2231, 1303, 2018, + 2149, 1495, 1915, + 2010, 1668, 1725, + 1713, 1828, 1186, + 0, 1980, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2359, + 2539, 0, 2359, + 2537, 0, 2357, + 2535, 0, 2355, + 2533, 0, 2351, + 2529, 0, 2347, + 2523, 0, 2341, + 2517, 0, 2333, + 2507, 0, 2321, + 2495, 0, 2307, + 2477, 324, 2285, + 2451, 899, 2257, + 2415, 1205, 2213, + 2363, 1434, 2149, + 2281, 1627, 2045, + 2141, 1800, 1854, + 1843, 1960, 1308, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2493, + 2673, 0, 2491, + 2671, 0, 2489, + 2669, 0, 2489, + 2667, 0, 2485, + 2665, 0, 2483, + 2661, 0, 2479, + 2655, 0, 2473, + 2649, 0, 2465, + 2639, 0, 2453, + 2627, 0, 2439, + 2609, 446, 2417, + 2583, 1028, 2387, + 2547, 1335, 2345, + 2495, 1565, 2279, + 2413, 1758, 2175, + 2273, 1932, 1984, + 1975, 2093, 1433, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2623, + 2805, 0, 2623, + 2803, 0, 2621, + 2801, 0, 2619, + 2799, 0, 2617, + 2797, 0, 2615, + 2793, 0, 2609, + 2787, 0, 2603, + 2781, 0, 2595, + 2771, 0, 2585, + 2759, 0, 2569, + 2741, 570, 2549, + 2715, 1158, 2519, + 2679, 1467, 2475, + 2627, 1697, 2411, + 2545, 1890, 2307, + 2405, 2063, 2113, + 2107, 2223, 1559, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2745, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2717, + 2891, 0, 2701, + 2873, 697, 2681, + 2847, 1289, 2651, + 2811, 1598, 2607, + 2759, 1828, 2543, + 2677, 2022, 2437, + 2537, 2195, 2245, + 2237, 2355, 1687, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2849, + 3023, 0, 2833, + 3005, 825, 2811, + 2979, 1420, 2783, + 2943, 1729, 2739, + 2891, 1960, 2673, + 2809, 2153, 2569, + 2669, 2327, 2377, + 2369, 2487, 1816, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 954, 2943, + 3111, 1551, 2913, + 3075, 1861, 2871, + 3023, 2091, 2805, + 2941, 2285, 2701, + 2801, 2459, 2507, + 2501, 2621, 1945, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3111, + 3287, 0, 3097, + 3269, 1083, 3075, + 3243, 1682, 3045, + 3207, 1993, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2753, 2075, + 0, 2905, 0, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3243, + 3419, 0, 3229, + 3401, 1213, 3207, + 3375, 1814, 3177, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2207, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4009, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1344, 3339, + 3507, 1946, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2337, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3711, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1475, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2813, 3229, + 3329, 2987, 3035, + 3029, 3149, 2469, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1606, 3603, + 3771, 2209, 3573, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1738, 3735, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1870, 3869, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2863, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2002, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2995, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 73, 0, 245, + 0, 93, 78, + 0, 216, 0, + 0, 340, 0, + 0, 467, 0, + 0, 595, 0, + 0, 724, 0, + 0, 853, 0, + 0, 984, 0, + 0, 1114, 0, + 0, 1245, 0, + 0, 1377, 0, + 0, 1508, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 324, 0, 378, + 139, 77, 259, + 0, 203, 27, + 0, 331, 0, + 0, 460, 0, + 0, 589, 0, + 0, 719, 0, + 0, 850, 0, + 0, 981, 0, + 0, 1112, 0, + 0, 1244, 0, + 0, 1376, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 528, 0, 510, + 420, 54, 424, + 215, 186, 277, + 0, 318, 0, + 0, 450, 0, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 708, 0, 642, + 638, 21, 580, + 522, 162, 481, + 300, 300, 300, + 0, 437, 0, + 0, 572, 0, + 0, 707, 0, + 0, 841, 0, + 0, 974, 0, + 0, 1107, 0, + 0, 1240, 0, + 0, 1373, 0, + 0, 1505, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 873, 0, 775, + 825, 0, 729, + 752, 127, 659, + 631, 275, 546, + 393, 418, 329, + 0, 558, 0, + 0, 696, 0, + 0, 833, 0, + 0, 968, 0, + 0, 1103, 0, + 0, 1237, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1028, 0, 907, + 994, 0, 873, + 945, 77, 824, + 870, 239, 748, + 745, 392, 621, + 494, 539, 365, + 0, 683, 0, + 0, 823, 0, + 0, 961, 0, + 0, 1097, 0, + 0, 1233, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1176, 0, 1039, + 1152, 0, 1014, + 1118, 0, 979, + 1068, 186, 926, + 991, 355, 844, + 863, 513, 705, + 601, 663, 410, + 0, 809, 0, + 0, 951, 0, + 0, 1090, 0, + 0, 1227, 0, + 0, 1363, 0, + 0, 1498, 0, + 0, 1632, 0, + 0, 1766, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1320, 0, 1171, + 1303, 0, 1153, + 1279, 0, 1127, + 1244, 103, 1089, + 1193, 300, 1034, + 1115, 475, 948, + 984, 636, 798, + 714, 789, 463, + 0, 936, 0, + 0, 1079, 0, + 0, 1219, 0, + 0, 1357, 0, + 0, 1494, 0, + 0, 1629, 0, + 0, 1764, 0, + 0, 1898, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1461, 0, 1304, + 1448, 0, 1290, + 1431, 0, 1271, + 1406, 0, 1244, + 1371, 214, 1205, + 1320, 418, 1147, + 1241, 597, 1057, + 1108, 762, 898, + 831, 917, 526, + 0, 1065, 0, + 0, 1209, 0, + 0, 1350, 0, + 0, 1488, 0, + 0, 1625, 0, + 0, 1760, 0, + 0, 1895, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1599, 0, 1436, + 1590, 0, 1426, + 1577, 0, 1411, + 1560, 0, 1392, + 1535, 65, 1364, + 1500, 329, 1324, + 1448, 539, 1265, + 1368, 722, 1171, + 1233, 889, 1005, + 952, 1045, 598, + 0, 1194, 0, + 0, 1339, 0, + 0, 1480, 0, + 0, 1619, 0, + 0, 1756, 0, + 0, 1892, 0, + 0, 2027, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1736, 0, 1568, + 1729, 0, 1560, + 1720, 0, 1550, + 1707, 0, 1535, + 1690, 0, 1515, + 1665, 174, 1487, + 1630, 448, 1447, + 1578, 663, 1386, + 1497, 849, 1289, + 1361, 1017, 1117, + 1074, 1174, 680, + 0, 1325, 0, + 0, 1470, 0, + 0, 1611, 0, + 0, 1751, 0, + 0, 1888, 0, + 0, 2024, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1872, 0, 1700, + 1867, 0, 1694, + 1860, 0, 1687, + 1851, 0, 1676, + 1838, 0, 1661, + 1820, 0, 1641, + 1795, 287, 1613, + 1760, 570, 1571, + 1707, 789, 1510, + 1627, 977, 1411, + 1489, 1146, 1233, + 1200, 1304, 770, + 0, 1455, 0, + 0, 1601, 0, + 0, 1743, 0, + 0, 1882, 0, + 0, 2020, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2007, 0, 1832, + 2003, 0, 1828, + 1998, 0, 1822, + 1991, 0, 1814, + 1982, 0, 1804, + 1969, 0, 1789, + 1951, 0, 1768, + 1926, 405, 1740, + 1890, 694, 1698, + 1838, 916, 1635, + 1757, 1105, 1535, + 1619, 1276, 1354, + 1327, 1435, 868, + 0, 1586, 0, + 0, 1732, 0, + 0, 1874, 0, + 0, 2014, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2141, 0, 1964, + 2137, 0, 1961, + 2135, 0, 1957, + 2129, 0, 1951, + 2123, 0, 1943, + 2113, 0, 1932, + 2099, 0, 1918, + 2083, 6, 1897, + 2057, 526, 1868, + 2021, 821, 1826, + 1969, 1045, 1762, + 1887, 1235, 1661, + 1749, 1407, 1477, + 1455, 1566, 973, + 0, 1718, 0, + 0, 1864, 0, + 0, 2006, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2275, 0, 2097, + 2273, 0, 2095, + 2269, 0, 2091, + 2265, 0, 2087, + 2261, 0, 2081, + 2253, 0, 2073, + 2245, 0, 2063, + 2231, 0, 2047, + 2213, 111, 2026, + 2189, 650, 1997, + 2153, 948, 1955, + 2099, 1174, 1891, + 2018, 1366, 1789, + 1879, 1538, 1602, + 1584, 1697, 1083, + 0, 1849, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2229, + 2405, 0, 2227, + 2403, 0, 2225, + 2401, 0, 2221, + 2397, 0, 2217, + 2393, 0, 2211, + 2385, 0, 2203, + 2375, 0, 2193, + 2363, 0, 2177, + 2345, 221, 2157, + 2319, 775, 2127, + 2285, 1077, 2085, + 2231, 1304, 2020, + 2149, 1496, 1917, + 2010, 1669, 1729, + 1714, 1829, 1199, + 0, 1981, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2361, + 2539, 0, 2359, + 2537, 0, 2357, + 2535, 0, 2355, + 2533, 0, 2353, + 2529, 0, 2347, + 2523, 0, 2341, + 2517, 0, 2333, + 2507, 0, 2323, + 2495, 0, 2307, + 2477, 337, 2287, + 2451, 903, 2257, + 2415, 1207, 2215, + 2363, 1435, 2151, + 2281, 1628, 2047, + 2141, 1800, 1857, + 1845, 1961, 1318, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2493, + 2673, 0, 2493, + 2671, 0, 2491, + 2669, 0, 2489, + 2667, 0, 2487, + 2665, 0, 2483, + 2661, 0, 2479, + 2655, 0, 2473, + 2649, 0, 2465, + 2639, 0, 2453, + 2627, 0, 2439, + 2609, 456, 2417, + 2583, 1031, 2389, + 2547, 1337, 2345, + 2495, 1566, 2281, + 2413, 1759, 2177, + 2273, 1932, 1986, + 1976, 2093, 1440, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2625, + 2805, 0, 2623, + 2803, 0, 2623, + 2801, 0, 2621, + 2799, 0, 2617, + 2797, 0, 2615, + 2793, 0, 2611, + 2787, 0, 2605, + 2781, 0, 2597, + 2771, 0, 2585, + 2759, 0, 2571, + 2741, 578, 2549, + 2715, 1160, 2519, + 2679, 1468, 2477, + 2627, 1697, 2411, + 2545, 1891, 2307, + 2405, 2063, 2115, + 2107, 2225, 1565, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2747, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2717, + 2891, 0, 2701, + 2873, 703, 2681, + 2847, 1290, 2651, + 2811, 1599, 2607, + 2759, 1829, 2543, + 2677, 2022, 2439, + 2537, 2195, 2247, + 2239, 2357, 1691, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2849, + 3023, 0, 2833, + 3005, 829, 2813, + 2979, 1421, 2783, + 2943, 1730, 2739, + 2891, 1960, 2675, + 2809, 2155, 2569, + 2669, 2327, 2377, + 2369, 2489, 1819, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 957, 2945, + 3111, 1552, 2915, + 3075, 1862, 2871, + 3023, 2093, 2807, + 2941, 2285, 2701, + 2801, 2459, 2509, + 2501, 2621, 1948, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3113, + 3287, 0, 3097, + 3269, 1085, 3075, + 3243, 1683, 3047, + 3207, 1993, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2753, 2077, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1215, 3207, + 3375, 1815, 3179, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2207, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1345, 3339, + 3507, 1946, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2339, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1476, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2469, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1607, 3603, + 3771, 2209, 3575, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1739, 3735, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1870, 3869, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2865, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2002, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 148, 10, 366, + 0, 122, 244, + 0, 237, 2, + 0, 357, 0, + 0, 479, 0, + 0, 604, 0, + 0, 731, 0, + 0, 859, 0, + 0, 988, 0, + 0, 1117, 0, + 0, 1247, 0, + 0, 1378, 0, + 0, 1509, 0, + 0, 1641, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 369, 0, 471, + 205, 106, 377, + 0, 225, 210, + 0, 348, 0, + 0, 473, 0, + 0, 599, 0, + 0, 727, 0, + 0, 856, 0, + 0, 985, 0, + 0, 1115, 0, + 0, 1246, 0, + 0, 1377, 0, + 0, 1509, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 558, 0, 582, + 456, 85, 510, + 271, 209, 391, + 0, 335, 159, + 0, 463, 0, + 0, 592, 0, + 0, 721, 0, + 0, 852, 0, + 0, 982, 0, + 0, 1113, 0, + 0, 1245, 0, + 0, 1376, 0, + 0, 1508, 0, + 0, 1640, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 728, 0, 697, + 661, 54, 642, + 552, 186, 556, + 347, 318, 409, + 0, 450, 82, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 887, 0, 816, + 840, 10, 775, + 770, 153, 712, + 654, 294, 613, + 432, 432, 432, + 0, 569, 0, + 0, 704, 0, + 0, 839, 0, + 0, 973, 0, + 0, 1106, 0, + 0, 1239, 0, + 0, 1372, 0, + 0, 1505, 0, + 0, 1637, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1037, 0, 938, + 1005, 0, 907, + 957, 106, 861, + 884, 259, 792, + 763, 407, 678, + 525, 550, 461, + 0, 690, 0, + 0, 829, 0, + 0, 965, 0, + 0, 1100, 0, + 0, 1235, 0, + 0, 1369, 0, + 0, 1502, 0, + 0, 1636, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1183, 0, 1063, + 1160, 0, 1039, + 1126, 33, 1005, + 1077, 209, 956, + 1002, 371, 880, + 877, 524, 753, + 626, 672, 498, + 0, 815, 0, + 0, 955, 0, + 0, 1093, 0, + 0, 1229, 0, + 0, 1365, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1325, 0, 1189, + 1308, 0, 1171, + 1284, 0, 1146, + 1250, 131, 1110, + 1200, 318, 1058, + 1123, 487, 976, + 995, 645, 837, + 734, 795, 542, + 0, 941, 0, + 0, 1082, 0, + 0, 1222, 0, + 0, 1359, 0, + 0, 1495, 0, + 0, 1630, 0, + 0, 1764, 0, + 0, 1898, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1465, 0, 1317, + 1452, 0, 1304, + 1435, 0, 1285, + 1411, 0, 1259, + 1376, 236, 1221, + 1325, 432, 1166, + 1247, 607, 1079, + 1116, 768, 930, + 846, 921, 595, + 0, 1068, 0, + 0, 1211, 0, + 0, 1351, 0, + 0, 1489, 0, + 0, 1626, 0, + 0, 1761, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1602, 0, 1446, + 1593, 0, 1436, + 1580, 0, 1422, + 1563, 0, 1403, + 1538, 95, 1376, + 1504, 346, 1337, + 1452, 550, 1279, + 1373, 729, 1189, + 1240, 894, 1030, + 963, 1048, 658, + 0, 1197, 0, + 0, 1341, 0, + 0, 1482, 0, + 0, 1620, 0, + 0, 1757, 0, + 0, 1893, 0, + 0, 2027, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1738, 0, 1575, + 1732, 0, 1568, + 1722, 0, 1558, + 1710, 0, 1544, + 1692, 0, 1524, + 1667, 198, 1496, + 1632, 461, 1456, + 1580, 671, 1397, + 1501, 854, 1303, + 1366, 1021, 1137, + 1083, 1177, 730, + 0, 1327, 0, + 0, 1471, 0, + 0, 1612, 0, + 0, 1751, 0, + 0, 1888, 0, + 0, 2024, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1873, 0, 1706, + 1868, 0, 1700, + 1862, 0, 1692, + 1852, 0, 1682, + 1839, 0, 1668, + 1822, 0, 1648, + 1797, 306, 1619, + 1762, 580, 1579, + 1710, 795, 1518, + 1629, 981, 1422, + 1493, 1149, 1249, + 1207, 1307, 812, + 0, 1457, 0, + 0, 1602, 0, + 0, 1744, 0, + 0, 1883, 0, + 0, 2020, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2008, 0, 1837, + 2004, 0, 1832, + 1999, 0, 1827, + 1992, 0, 1819, + 1983, 0, 1808, + 1970, 0, 1794, + 1952, 0, 1773, + 1927, 419, 1745, + 1892, 702, 1703, + 1840, 921, 1642, + 1759, 1109, 1543, + 1621, 1278, 1366, + 1332, 1437, 902, + 0, 1587, 0, + 0, 1733, 0, + 0, 1875, 0, + 0, 2014, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2141, 0, 1968, + 2139, 0, 1964, + 2135, 0, 1960, + 2129, 0, 1954, + 2123, 0, 1947, + 2113, 0, 1936, + 2101, 0, 1921, + 2083, 39, 1901, + 2059, 537, 1872, + 2022, 826, 1830, + 1970, 1048, 1767, + 1889, 1238, 1667, + 1751, 1408, 1486, + 1459, 1567, 1000, + 0, 1718, 0, + 0, 1864, 0, + 0, 2006, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2275, 0, 2099, + 2273, 0, 2097, + 2271, 0, 2093, + 2267, 0, 2089, + 2261, 0, 2083, + 2255, 0, 2075, + 2245, 0, 2065, + 2231, 0, 2049, + 2215, 138, 2029, + 2189, 658, 2000, + 2153, 953, 1958, + 2101, 1177, 1895, + 2019, 1367, 1793, + 1881, 1539, 1609, + 1587, 1698, 1105, + 0, 1850, 0, + 0, 1996, 0, + 0, 2139, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2231, + 2407, 0, 2229, + 2405, 0, 2227, + 2401, 0, 2223, + 2397, 0, 2219, + 2393, 0, 2213, + 2385, 0, 2205, + 2377, 0, 2195, + 2363, 0, 2179, + 2345, 243, 2159, + 2321, 782, 2129, + 2285, 1080, 2087, + 2233, 1306, 2023, + 2151, 1498, 1921, + 2012, 1670, 1734, + 1716, 1830, 1216, + 0, 1981, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2363, + 2539, 0, 2361, + 2539, 0, 2359, + 2535, 0, 2357, + 2533, 0, 2353, + 2529, 0, 2349, + 2525, 0, 2343, + 2517, 0, 2335, + 2507, 0, 2325, + 2495, 0, 2309, + 2477, 353, 2289, + 2453, 908, 2259, + 2417, 1209, 2217, + 2363, 1436, 2153, + 2281, 1629, 2049, + 2143, 1801, 1861, + 1846, 1961, 1331, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2493, + 2673, 0, 2493, + 2671, 0, 2491, + 2669, 0, 2489, + 2667, 0, 2487, + 2665, 0, 2485, + 2661, 0, 2479, + 2657, 0, 2475, + 2649, 0, 2465, + 2639, 0, 2455, + 2627, 0, 2441, + 2609, 469, 2419, + 2583, 1035, 2389, + 2547, 1339, 2347, + 2495, 1567, 2283, + 2413, 1760, 2179, + 2273, 1932, 1989, + 1977, 2093, 1450, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2625, + 2805, 0, 2625, + 2803, 0, 2623, + 2801, 0, 2621, + 2799, 0, 2619, + 2797, 0, 2615, + 2793, 0, 2611, + 2787, 0, 2605, + 2781, 0, 2597, + 2771, 0, 2587, + 2759, 0, 2571, + 2741, 588, 2551, + 2715, 1163, 2521, + 2679, 1469, 2477, + 2627, 1698, 2413, + 2545, 1891, 2309, + 2405, 2065, 2117, + 2107, 2225, 1572, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2755, + 2935, 0, 2755, + 2933, 0, 2753, + 2931, 0, 2749, + 2929, 0, 2747, + 2925, 0, 2743, + 2919, 0, 2737, + 2913, 0, 2729, + 2903, 0, 2717, + 2891, 0, 2703, + 2873, 710, 2681, + 2847, 1292, 2651, + 2811, 1600, 2609, + 2759, 1829, 2543, + 2677, 2023, 2439, + 2537, 2195, 2247, + 2239, 2357, 1697, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2879, + 3057, 0, 2873, + 3051, 0, 2869, + 3045, 0, 2859, + 3035, 0, 2849, + 3023, 0, 2833, + 3005, 835, 2813, + 2979, 1422, 2783, + 2943, 1731, 2739, + 2891, 1961, 2675, + 2809, 2155, 2571, + 2669, 2327, 2379, + 2371, 2489, 1823, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3011, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 961, 2945, + 3111, 1553, 2915, + 3075, 1862, 2871, + 3023, 2093, 2807, + 2941, 2287, 2703, + 2801, 2459, 2509, + 2501, 2621, 1951, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3113, + 3287, 0, 3097, + 3269, 1089, 3077, + 3243, 1684, 3047, + 3207, 1994, 3003, + 3155, 2225, 2939, + 3073, 2419, 2833, + 2933, 2591, 2641, + 2633, 2753, 2081, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1218, 3209, + 3375, 1815, 3179, + 3339, 2125, 3135, + 3287, 2357, 3069, + 3205, 2551, 2965, + 3065, 2723, 2771, + 2765, 2885, 2209, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1347, 3339, + 3507, 1947, 3311, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2683, 3097, + 3197, 2855, 2903, + 2897, 3017, 2339, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1478, 3471, + 3639, 2079, 3443, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2471, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1608, 3603, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1739, 3737, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2885, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1871, 3869, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2865, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2002, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 232, 55, 490, + 0, 157, 400, + 0, 265, 243, + 0, 378, 0, + 0, 496, 0, + 0, 617, 0, + 0, 740, 0, + 0, 866, 0, + 0, 993, 0, + 0, 1121, 0, + 0, 1251, 0, + 0, 1381, 0, + 0, 1511, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1905, 0, + 0, 2036, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 422, 37, 572, + 280, 142, 498, + 0, 254, 376, + 0, 369, 134, + 0, 489, 0, + 0, 611, 0, + 0, 736, 0, + 0, 863, 0, + 0, 991, 0, + 0, 1120, 0, + 0, 1249, 0, + 0, 1380, 0, + 0, 1510, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 594, 12, 663, + 501, 123, 603, + 337, 238, 509, + 0, 358, 342, + 0, 480, 0, + 0, 605, 0, + 0, 731, 0, + 0, 859, 0, + 0, 988, 0, + 0, 1117, 0, + 0, 1248, 0, + 0, 1378, 0, + 0, 1509, 0, + 0, 1641, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 753, 0, 761, + 690, 95, 714, + 588, 217, 642, + 403, 341, 523, + 0, 467, 291, + 0, 595, 0, + 0, 724, 0, + 0, 853, 0, + 0, 984, 0, + 0, 1114, 0, + 0, 1245, 0, + 0, 1377, 0, + 0, 1508, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 905, 0, 866, + 860, 54, 829, + 793, 186, 774, + 684, 318, 689, + 479, 450, 541, + 0, 582, 214, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1050, 0, 977, + 1019, 0, 948, + 972, 142, 907, + 902, 286, 844, + 786, 426, 745, + 564, 564, 564, + 0, 701, 84, + 0, 836, 0, + 0, 971, 0, + 0, 1105, 0, + 0, 1238, 0, + 0, 1371, 0, + 0, 1504, 0, + 0, 1637, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1193, 0, 1093, + 1170, 0, 1070, + 1137, 76, 1039, + 1089, 238, 993, + 1016, 392, 924, + 895, 539, 810, + 658, 682, 593, + 0, 823, 0, + 0, 961, 0, + 0, 1097, 0, + 0, 1232, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1332, 0, 1212, + 1315, 0, 1195, + 1292, 0, 1171, + 1258, 165, 1137, + 1209, 341, 1088, + 1134, 503, 1012, + 1009, 656, 885, + 758, 804, 630, + 0, 947, 0, + 0, 1087, 0, + 0, 1225, 0, + 0, 1361, 0, + 0, 1497, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1470, 0, 1334, + 1457, 0, 1321, + 1440, 0, 1303, + 1416, 46, 1278, + 1382, 263, 1243, + 1332, 450, 1190, + 1255, 619, 1108, + 1127, 777, 970, + 866, 928, 674, + 0, 1073, 0, + 0, 1215, 0, + 0, 1354, 0, + 0, 1491, 0, + 0, 1627, 0, + 0, 1762, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1606, 0, 1459, + 1597, 0, 1449, + 1584, 0, 1436, + 1567, 0, 1417, + 1543, 132, 1391, + 1508, 368, 1354, + 1458, 564, 1298, + 1379, 739, 1212, + 1248, 900, 1062, + 978, 1053, 727, + 0, 1200, 0, + 0, 1343, 0, + 0, 1484, 0, + 0, 1622, 0, + 0, 1758, 0, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1741, 0, 1585, + 1734, 0, 1578, + 1725, 0, 1568, + 1713, 0, 1554, + 1695, 0, 1535, + 1671, 227, 1508, + 1636, 478, 1469, + 1584, 682, 1412, + 1505, 861, 1321, + 1372, 1026, 1162, + 1095, 1181, 790, + 0, 1329, 0, + 0, 1473, 0, + 0, 1614, 0, + 0, 1752, 0, + 0, 1889, 0, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1876, 0, 1713, + 1871, 0, 1708, + 1864, 0, 1700, + 1854, 0, 1690, + 1842, 0, 1676, + 1824, 0, 1656, + 1799, 330, 1628, + 1764, 593, 1589, + 1713, 803, 1529, + 1633, 986, 1435, + 1498, 1153, 1269, + 1216, 1309, 862, + 0, 1459, 0, + 0, 1603, 0, + 0, 1745, 0, + 0, 1883, 0, + 0, 2021, 0, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2009, 0, 1842, + 2006, 0, 1838, + 2001, 0, 1832, + 1994, 0, 1825, + 1984, 0, 1814, + 1972, 0, 1800, + 1954, 0, 1780, + 1929, 438, 1752, + 1894, 712, 1711, + 1842, 927, 1650, + 1761, 1113, 1554, + 1625, 1281, 1381, + 1339, 1439, 944, + 0, 1589, 0, + 0, 1734, 0, + 0, 1876, 0, + 0, 2015, 0, + 0, 2153, 0, + 0, 2289, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2143, 0, 1972, + 2139, 0, 1969, + 2137, 0, 1964, + 2131, 0, 1959, + 2125, 0, 1951, + 2115, 0, 1940, + 2103, 0, 1926, + 2085, 81, 1905, + 2059, 551, 1877, + 2024, 834, 1836, + 1972, 1053, 1774, + 1891, 1241, 1675, + 1754, 1410, 1498, + 1464, 1569, 1034, + 0, 1720, 0, + 0, 1865, 0, + 0, 2007, 0, + 0, 2147, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2275, 0, 2103, + 2273, 0, 2099, + 2271, 0, 2097, + 2267, 0, 2093, + 2263, 0, 2087, + 2255, 0, 2079, + 2245, 0, 2067, + 2233, 0, 2053, + 2215, 172, 2033, + 2191, 669, 2004, + 2155, 959, 1962, + 2103, 1180, 1899, + 2021, 1370, 1799, + 1883, 1540, 1618, + 1591, 1699, 1132, + 0, 1851, 0, + 0, 1996, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2409, 0, 2233, + 2407, 0, 2231, + 2405, 0, 2229, + 2403, 0, 2225, + 2399, 0, 2221, + 2393, 0, 2215, + 2387, 0, 2207, + 2377, 0, 2197, + 2365, 0, 2181, + 2347, 270, 2161, + 2321, 790, 2133, + 2285, 1085, 2089, + 2233, 1309, 2027, + 2151, 1500, 1925, + 2013, 1671, 1741, + 1719, 1830, 1237, + 0, 1982, 0, + 0, 2127, 0, + 0, 2271, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2363, + 2541, 0, 2363, + 2539, 0, 2361, + 2537, 0, 2359, + 2533, 0, 2355, + 2529, 0, 2351, + 2525, 0, 2345, + 2517, 0, 2337, + 2509, 0, 2327, + 2495, 0, 2311, + 2477, 375, 2291, + 2453, 914, 2261, + 2417, 1212, 2219, + 2365, 1438, 2155, + 2283, 1630, 2053, + 2143, 1802, 1866, + 1849, 1962, 1348, + 0, 2113, 0, + 0, 2259, 0, + 0, 2403, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2495, + 2673, 0, 2495, + 2671, 0, 2493, + 2671, 0, 2491, + 2669, 0, 2489, + 2665, 0, 2485, + 2661, 0, 2481, + 2657, 0, 2475, + 2649, 0, 2467, + 2641, 0, 2457, + 2627, 0, 2441, + 2609, 485, 2421, + 2585, 1039, 2391, + 2549, 1341, 2349, + 2495, 1569, 2285, + 2413, 1761, 2181, + 2275, 1933, 1993, + 1978, 2093, 1463, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2627, + 2805, 0, 2627, + 2805, 0, 2625, + 2803, 0, 2623, + 2801, 0, 2623, + 2799, 0, 2619, + 2797, 0, 2617, + 2793, 0, 2613, + 2789, 0, 2607, + 2781, 0, 2599, + 2771, 0, 2587, + 2759, 0, 2573, + 2741, 601, 2551, + 2715, 1167, 2521, + 2681, 1471, 2479, + 2627, 1699, 2415, + 2545, 1892, 2311, + 2405, 2065, 2121, + 2109, 2225, 1582, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2759, + 2939, 0, 2759, + 2937, 0, 2757, + 2937, 0, 2757, + 2935, 0, 2755, + 2933, 0, 2753, + 2931, 0, 2751, + 2929, 0, 2747, + 2925, 0, 2743, + 2919, 0, 2737, + 2913, 0, 2729, + 2903, 0, 2719, + 2891, 0, 2703, + 2873, 720, 2683, + 2847, 1295, 2653, + 2811, 1601, 2609, + 2759, 1830, 2545, + 2677, 2023, 2441, + 2537, 2197, 2251, + 2239, 2357, 1705, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2891, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3067, 0, 2887, + 3065, 0, 2885, + 3063, 0, 2883, + 3061, 0, 2879, + 3057, 0, 2875, + 3051, 0, 2869, + 3045, 0, 2861, + 3035, 0, 2849, + 3023, 0, 2835, + 3005, 842, 2813, + 2979, 1425, 2783, + 2943, 1732, 2741, + 2891, 1961, 2675, + 2809, 2155, 2571, + 2669, 2327, 2379, + 2371, 2489, 1829, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3023, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3017, + 3195, 0, 3013, + 3193, 0, 3011, + 3189, 0, 3007, + 3183, 0, 3001, + 3177, 0, 2993, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 967, 2945, + 3111, 1555, 2915, + 3075, 1863, 2873, + 3023, 2093, 2807, + 2941, 2287, 2703, + 2801, 2459, 2511, + 2503, 2621, 1956, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3143, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3113, + 3287, 0, 3097, + 3269, 1093, 3077, + 3243, 1685, 3047, + 3207, 1994, 3003, + 3155, 2225, 2939, + 3073, 2419, 2835, + 2933, 2591, 2641, + 2635, 2753, 2083, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1221, 3209, + 3375, 1816, 3179, + 3339, 2125, 3135, + 3287, 2357, 3071, + 3205, 2551, 2965, + 3065, 2723, 2773, + 2765, 2885, 2213, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3581, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1350, 3341, + 3507, 1947, 3311, + 3471, 2257, 3267, + 3419, 2489, 3203, + 3337, 2683, 3097, + 3197, 2855, 2903, + 2897, 3017, 2341, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1479, 3473, + 3639, 2079, 3443, + 3603, 2389, 3399, + 3551, 2621, 3333, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2473, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1610, 3605, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2753, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2603, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1740, 3737, + 3903, 2343, 3707, + 3867, 2653, 3663, + 3815, 2885, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1872, 3869, + 4035, 2475, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2865, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2003, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2135, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 325, 108, 616, + 140, 200, 549, + 0, 299, 442, + 0, 405, 242, + 0, 517, 0, + 0, 633, 0, + 0, 753, 0, + 0, 875, 0, + 0, 1000, 0, + 0, 1127, 0, + 0, 1255, 0, + 0, 1384, 0, + 0, 1513, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 486, 92, 679, + 364, 187, 622, + 125, 289, 532, + 0, 397, 375, + 0, 510, 9, + 0, 628, 0, + 0, 749, 0, + 0, 872, 0, + 0, 998, 0, + 0, 1125, 0, + 0, 1253, 0, + 0, 1383, 0, + 0, 1513, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 638, 70, 752, + 554, 169, 704, + 412, 274, 630, + 103, 386, 508, + 0, 502, 267, + 0, 621, 0, + 0, 744, 0, + 0, 868, 0, + 0, 995, 0, + 0, 1123, 0, + 0, 1252, 0, + 0, 1381, 0, + 0, 1512, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 785, 38, 835, + 726, 144, 795, + 633, 255, 735, + 469, 370, 641, + 73, 490, 474, + 0, 612, 63, + 0, 737, 0, + 0, 863, 0, + 0, 991, 0, + 0, 1120, 0, + 0, 1249, 0, + 0, 1380, 0, + 0, 1510, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1905, 0, + 0, 2036, 0, + 0, 2169, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 927, 0, 926, + 885, 108, 893, + 822, 227, 846, + 720, 349, 774, + 535, 473, 655, + 29, 599, 424, + 0, 727, 0, + 0, 856, 0, + 0, 986, 0, + 0, 1116, 0, + 0, 1246, 0, + 0, 1377, 0, + 0, 1509, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1067, 0, 1024, + 1036, 55, 998, + 992, 187, 961, + 925, 318, 906, + 816, 450, 821, + 611, 582, 673, + 0, 714, 346, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1205, 0, 1129, + 1182, 0, 1109, + 1151, 127, 1080, + 1104, 274, 1039, + 1034, 418, 976, + 919, 558, 877, + 696, 696, 696, + 0, 833, 216, + 0, 968, 0, + 0, 1103, 0, + 0, 1237, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1341, 0, 1241, + 1325, 0, 1225, + 1302, 31, 1202, + 1269, 208, 1171, + 1221, 370, 1125, + 1148, 524, 1056, + 1027, 671, 942, + 790, 814, 725, + 0, 955, 0, + 0, 1093, 0, + 0, 1229, 0, + 0, 1365, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1477, 0, 1356, + 1464, 0, 1344, + 1447, 0, 1327, + 1424, 100, 1303, + 1390, 297, 1269, + 1341, 473, 1220, + 1266, 635, 1144, + 1141, 788, 1017, + 891, 936, 762, + 0, 1079, 0, + 0, 1219, 0, + 0, 1357, 0, + 0, 1494, 0, + 0, 1629, 0, + 0, 1764, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1611, 0, 1476, + 1602, 0, 1466, + 1590, 0, 1453, + 1572, 0, 1436, + 1549, 178, 1411, + 1514, 395, 1375, + 1464, 582, 1322, + 1388, 751, 1240, + 1259, 909, 1101, + 998, 1059, 806, + 0, 1205, 0, + 0, 1347, 0, + 0, 1486, 0, + 0, 1623, 0, + 0, 1759, 0, + 0, 1894, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1745, 0, 1598, + 1738, 0, 1591, + 1729, 0, 1581, + 1716, 0, 1568, + 1699, 0, 1549, + 1675, 264, 1523, + 1640, 500, 1486, + 1590, 696, 1430, + 1511, 871, 1344, + 1380, 1032, 1194, + 1110, 1185, 859, + 0, 1332, 0, + 0, 1476, 0, + 0, 1616, 0, + 0, 1754, 0, + 0, 1890, 0, + 0, 2025, 0, + 0, 2161, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1878, 0, 1723, + 1873, 0, 1717, + 1867, 0, 1710, + 1857, 0, 1700, + 1845, 0, 1686, + 1827, 0, 1667, + 1803, 359, 1640, + 1768, 610, 1601, + 1717, 814, 1544, + 1637, 994, 1453, + 1504, 1158, 1294, + 1227, 1313, 922, + 0, 1461, 0, + 0, 1605, 0, + 0, 1746, 0, + 0, 1884, 0, + 0, 2021, 0, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2011, 0, 1849, + 2008, 0, 1845, + 2003, 0, 1840, + 1996, 0, 1832, + 1987, 0, 1822, + 1974, 0, 1808, + 1956, 59, 1788, + 1932, 462, 1761, + 1896, 725, 1721, + 1845, 936, 1661, + 1765, 1118, 1568, + 1630, 1285, 1401, + 1348, 1441, 994, + 0, 1591, 0, + 0, 1735, 0, + 0, 1877, 0, + 0, 2016, 0, + 0, 2153, 0, + 0, 2289, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2145, 0, 1977, + 2141, 0, 1974, + 2137, 0, 1970, + 2133, 0, 1964, + 2125, 0, 1957, + 2117, 0, 1946, + 2103, 0, 1932, + 2087, 132, 1912, + 2061, 570, 1884, + 2026, 844, 1843, + 1974, 1059, 1782, + 1893, 1245, 1686, + 1757, 1413, 1513, + 1471, 1571, 1076, + 0, 1721, 0, + 0, 1866, 0, + 0, 2008, 0, + 0, 2147, 0, + 0, 2285, 0, + 0, 2421, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2277, 0, 2107, + 2275, 0, 2103, + 2273, 0, 2101, + 2269, 0, 2097, + 2263, 0, 2091, + 2257, 0, 2083, + 2247, 0, 2073, + 2235, 0, 2057, + 2217, 213, 2038, + 2191, 684, 2009, + 2157, 966, 1968, + 2103, 1185, 1906, + 2023, 1373, 1807, + 1886, 1543, 1630, + 1596, 1701, 1166, + 0, 1852, 0, + 0, 1997, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2409, 0, 2235, + 2407, 0, 2235, + 2405, 0, 2231, + 2403, 0, 2229, + 2399, 0, 2225, + 2395, 0, 2219, + 2387, 0, 2211, + 2377, 0, 2201, + 2365, 0, 2185, + 2347, 304, 2165, + 2323, 801, 2135, + 2287, 1090, 2095, + 2235, 1313, 2032, + 2153, 1502, 1932, + 2015, 1673, 1750, + 1723, 1831, 1264, + 0, 1983, 0, + 0, 2129, 0, + 0, 2271, 0, + 0, 2411, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2367, + 2541, 0, 2365, + 2539, 0, 2363, + 2537, 0, 2361, + 2535, 0, 2357, + 2531, 0, 2353, + 2525, 0, 2347, + 2519, 0, 2339, + 2509, 0, 2329, + 2497, 0, 2313, + 2479, 402, 2293, + 2453, 922, 2265, + 2417, 1217, 2223, + 2365, 1441, 2159, + 2283, 1632, 2057, + 2145, 1803, 1873, + 1851, 1962, 1369, + 0, 2115, 0, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2675, 0, 2497, + 2673, 0, 2497, + 2673, 0, 2495, + 2671, 0, 2493, + 2669, 0, 2491, + 2665, 0, 2487, + 2661, 0, 2483, + 2657, 0, 2477, + 2649, 0, 2469, + 2641, 0, 2459, + 2627, 0, 2443, + 2609, 507, 2423, + 2585, 1046, 2393, + 2549, 1345, 2351, + 2497, 1571, 2287, + 2415, 1762, 2185, + 2275, 1934, 1998, + 1981, 2093, 1480, + 0, 2245, 0, + 0, 2391, 0, + 0, 2535, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2629, + 2805, 0, 2627, + 2805, 0, 2627, + 2803, 0, 2625, + 2803, 0, 2623, + 2801, 0, 2621, + 2797, 0, 2617, + 2793, 0, 2613, + 2789, 0, 2607, + 2781, 0, 2599, + 2773, 0, 2589, + 2759, 0, 2573, + 2741, 617, 2553, + 2717, 1172, 2523, + 2681, 1473, 2481, + 2627, 1701, 2417, + 2545, 1893, 2313, + 2407, 2065, 2125, + 2111, 2225, 1595, + 0, 2377, 0, + 0, 2523, 0, + 0, 2667, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2759, + 2939, 0, 2759, + 2937, 0, 2759, + 2937, 0, 2757, + 2935, 0, 2755, + 2935, 0, 2755, + 2931, 0, 2751, + 2929, 0, 2749, + 2925, 0, 2745, + 2921, 0, 2739, + 2913, 0, 2731, + 2903, 0, 2719, + 2891, 0, 2705, + 2873, 733, 2683, + 2849, 1299, 2653, + 2813, 1603, 2611, + 2759, 1831, 2547, + 2677, 2024, 2443, + 2539, 2197, 2253, + 2241, 2357, 1714, + 0, 2509, 0, + 0, 2655, 0, + 0, 2799, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2891, + 3071, 0, 2891, + 3071, 0, 2891, + 3069, 0, 2889, + 3069, 0, 2889, + 3067, 0, 2887, + 3065, 0, 2885, + 3063, 0, 2883, + 3061, 0, 2879, + 3057, 0, 2875, + 3053, 0, 2869, + 3045, 0, 2861, + 3035, 0, 2851, + 3023, 0, 2835, + 3005, 852, 2815, + 2979, 1427, 2785, + 2943, 1733, 2741, + 2891, 1962, 2677, + 2809, 2155, 2573, + 2669, 2329, 2383, + 2371, 2489, 1837, + 0, 2641, 0, + 0, 2787, 0, + 0, 2931, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3199, 0, 3019, + 3197, 0, 3017, + 3195, 0, 3015, + 3193, 0, 3011, + 3189, 0, 3007, + 3185, 0, 3001, + 3177, 0, 2993, + 3167, 0, 2981, + 3155, 0, 2967, + 3137, 974, 2945, + 3111, 1557, 2915, + 3075, 1864, 2873, + 3023, 2093, 2809, + 2941, 2287, 2703, + 2801, 2461, 2513, + 2503, 2621, 1961, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3331, 0, 3151, + 3329, 0, 3149, + 3327, 0, 3145, + 3325, 0, 3143, + 3321, 0, 3139, + 3317, 0, 3133, + 3309, 0, 3125, + 3299, 0, 3113, + 3287, 0, 3099, + 3269, 1099, 3077, + 3243, 1687, 3047, + 3207, 1995, 3005, + 3155, 2225, 2939, + 3073, 2419, 2835, + 2933, 2591, 2643, + 2635, 2753, 2087, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3275, + 3453, 0, 3269, + 3449, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1225, 3209, + 3375, 1817, 3179, + 3339, 2127, 3135, + 3287, 2357, 3071, + 3205, 2551, 2967, + 3065, 2723, 2773, + 2767, 2885, 2215, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3407, + 3585, 0, 3401, + 3581, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1353, 3341, + 3507, 1948, 3311, + 3471, 2257, 3267, + 3419, 2489, 3203, + 3337, 2683, 3097, + 3197, 2855, 2905, + 2897, 3017, 2345, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1482, 3473, + 3639, 2079, 3443, + 3603, 2389, 3399, + 3551, 2621, 3335, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2473, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1612, 3605, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2753, 3467, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2605, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1742, 3737, + 3903, 2343, 3707, + 3867, 2653, 3663, + 3815, 2885, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2735, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1873, 3869, + 4035, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2867, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2004, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2135, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 425, 171, 743, + 284, 251, 694, + 0, 341, 618, + 0, 439, 493, + 0, 543, 240, + 0, 653, 0, + 0, 769, 0, + 0, 887, 0, + 0, 1009, 0, + 0, 1134, 0, + 0, 1260, 0, + 0, 1388, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 558, 157, 792, + 457, 240, 748, + 272, 332, 682, + 0, 431, 574, + 0, 537, 374, + 0, 649, 0, + 0, 765, 0, + 0, 885, 0, + 0, 1007, 0, + 0, 1132, 0, + 0, 1259, 0, + 0, 1387, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 691, 138, 850, + 618, 224, 811, + 496, 319, 754, + 257, 421, 664, + 0, 529, 507, + 0, 642, 141, + 0, 760, 0, + 0, 881, 0, + 0, 1004, 0, + 0, 1130, 0, + 0, 1257, 0, + 0, 1385, 0, + 0, 1515, 0, + 0, 1645, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 824, 111, 918, + 770, 202, 885, + 687, 301, 836, + 544, 407, 762, + 235, 518, 640, + 0, 634, 399, + 0, 753, 0, + 0, 876, 0, + 0, 1001, 0, + 0, 1127, 0, + 0, 1255, 0, + 0, 1384, 0, + 0, 1514, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 956, 72, 995, + 917, 170, 967, + 858, 276, 927, + 765, 387, 867, + 601, 502, 773, + 205, 622, 606, + 0, 744, 196, + 0, 869, 0, + 0, 995, 0, + 0, 1123, 0, + 0, 1252, 0, + 0, 1382, 0, + 0, 1512, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1088, 14, 1080, + 1059, 125, 1058, + 1017, 240, 1025, + 954, 359, 978, + 852, 481, 906, + 667, 605, 787, + 161, 732, 556, + 0, 859, 0, + 0, 988, 0, + 0, 1117, 0, + 0, 1248, 0, + 0, 1378, 0, + 0, 1510, 0, + 0, 1641, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1221, 0, 1175, + 1199, 55, 1156, + 1169, 187, 1130, + 1124, 319, 1093, + 1057, 450, 1038, + 948, 582, 953, + 743, 714, 805, + 94, 846, 478, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1353, 0, 1276, + 1337, 0, 1262, + 1315, 105, 1241, + 1283, 259, 1212, + 1236, 406, 1171, + 1166, 550, 1108, + 1050, 690, 1009, + 828, 828, 828, + 0, 965, 349, + 0, 1100, 0, + 0, 1235, 0, + 0, 1369, 0, + 0, 1502, 0, + 0, 1636, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1485, 0, 1384, + 1473, 0, 1373, + 1457, 0, 1357, + 1434, 164, 1335, + 1401, 340, 1303, + 1353, 502, 1257, + 1280, 656, 1188, + 1159, 803, 1074, + 922, 947, 858, + 0, 1087, 83, + 0, 1225, 0, + 0, 1361, 0, + 0, 1497, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1618, 0, 1497, + 1609, 0, 1488, + 1596, 0, 1476, + 1580, 0, 1459, + 1556, 232, 1435, + 1523, 430, 1402, + 1473, 605, 1352, + 1398, 767, 1276, + 1273, 921, 1149, + 1023, 1068, 894, + 0, 1211, 0, + 0, 1351, 0, + 0, 1489, 0, + 0, 1626, 0, + 0, 1761, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1750, 0, 1615, + 1743, 0, 1608, + 1734, 0, 1598, + 1722, 0, 1586, + 1705, 31, 1568, + 1681, 310, 1543, + 1647, 527, 1507, + 1597, 714, 1454, + 1520, 883, 1372, + 1391, 1041, 1234, + 1130, 1192, 938, + 0, 1337, 0, + 0, 1479, 0, + 0, 1618, 0, + 0, 1755, 0, + 0, 1891, 0, + 0, 2026, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1882, 0, 1736, + 1877, 0, 1730, + 1870, 0, 1723, + 1861, 0, 1713, + 1849, 0, 1700, + 1831, 75, 1681, + 1807, 397, 1655, + 1773, 632, 1618, + 1722, 828, 1562, + 1644, 1003, 1476, + 1512, 1164, 1326, + 1242, 1317, 992, + 0, 1465, 0, + 0, 1608, 0, + 0, 1748, 0, + 0, 1886, 0, + 0, 2022, 0, + 0, 2157, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2014, 0, 1859, + 2010, 0, 1855, + 2005, 0, 1850, + 1999, 0, 1842, + 1989, 0, 1832, + 1977, 0, 1818, + 1959, 128, 1799, + 1935, 492, 1772, + 1900, 742, 1733, + 1849, 946, 1676, + 1770, 1125, 1585, + 1636, 1290, 1426, + 1359, 1445, 1054, + 0, 1593, 0, + 0, 1737, 0, + 0, 1878, 0, + 0, 2017, 0, + 0, 2153, 0, + 0, 2289, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2147, 0, 1985, + 2143, 0, 1982, + 2139, 0, 1977, + 2135, 0, 1972, + 2127, 0, 1964, + 2119, 0, 1954, + 2105, 0, 1940, + 2089, 191, 1920, + 2063, 594, 1893, + 2029, 857, 1853, + 1977, 1067, 1793, + 1897, 1250, 1700, + 1762, 1417, 1533, + 1480, 1573, 1126, + 0, 1723, 0, + 0, 1868, 0, + 0, 2009, 0, + 0, 2147, 0, + 0, 2285, 0, + 0, 2421, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2279, 0, 2111, + 2277, 0, 2109, + 2273, 0, 2107, + 2269, 0, 2103, + 2265, 0, 2097, + 2257, 0, 2089, + 2249, 0, 2079, + 2235, 0, 2063, + 2219, 264, 2044, + 2193, 702, 2016, + 2159, 976, 1975, + 2107, 1191, 1914, + 2026, 1377, 1818, + 1889, 1545, 1645, + 1603, 1703, 1208, + 0, 1853, 0, + 0, 1998, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2411, 0, 2241, + 2409, 0, 2239, + 2407, 0, 2237, + 2405, 0, 2233, + 2401, 0, 2229, + 2395, 0, 2223, + 2389, 0, 2215, + 2379, 0, 2205, + 2367, 0, 2189, + 2349, 345, 2169, + 2323, 816, 2141, + 2289, 1098, 2099, + 2235, 1317, 2038, + 2155, 1505, 1940, + 2018, 1675, 1762, + 1728, 1833, 1298, + 0, 1984, 0, + 0, 2129, 0, + 0, 2271, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2543, 0, 2369, + 2541, 0, 2369, + 2541, 0, 2367, + 2537, 0, 2363, + 2535, 0, 2361, + 2531, 0, 2357, + 2527, 0, 2351, + 2519, 0, 2343, + 2511, 0, 2333, + 2497, 0, 2317, + 2479, 436, 2297, + 2455, 933, 2269, + 2419, 1223, 2227, + 2367, 1445, 2163, + 2285, 1634, 2063, + 2147, 1805, 1882, + 1855, 1964, 1396, + 0, 2115, 0, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2679, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2675, 0, 2499, + 2675, 0, 2499, + 2673, 0, 2497, + 2671, 0, 2495, + 2669, 0, 2493, + 2667, 0, 2489, + 2663, 0, 2485, + 2657, 0, 2479, + 2651, 0, 2471, + 2641, 0, 2461, + 2629, 0, 2447, + 2611, 534, 2425, + 2585, 1054, 2397, + 2549, 1349, 2355, + 2497, 1573, 2291, + 2415, 1764, 2189, + 2277, 1935, 2005, + 1984, 2095, 1501, + 0, 2247, 0, + 0, 2393, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2629, + 2807, 0, 2629, + 2805, 0, 2629, + 2805, 0, 2627, + 2803, 0, 2625, + 2801, 0, 2623, + 2797, 0, 2619, + 2795, 0, 2615, + 2789, 0, 2609, + 2783, 0, 2601, + 2773, 0, 2591, + 2759, 0, 2575, + 2741, 639, 2555, + 2717, 1178, 2525, + 2681, 1477, 2483, + 2629, 1703, 2419, + 2547, 1894, 2317, + 2407, 2067, 2131, + 2113, 2225, 1612, + 0, 2377, 0, + 0, 2523, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2761, + 2939, 0, 2761, + 2939, 0, 2759, + 2937, 0, 2759, + 2935, 0, 2757, + 2935, 0, 2755, + 2933, 0, 2753, + 2929, 0, 2749, + 2925, 0, 2745, + 2921, 0, 2739, + 2913, 0, 2731, + 2905, 0, 2721, + 2891, 0, 2705, + 2873, 750, 2685, + 2849, 1304, 2655, + 2813, 1605, 2613, + 2759, 1833, 2549, + 2679, 2025, 2445, + 2539, 2197, 2257, + 2243, 2357, 1727, + 0, 2509, 0, + 0, 2655, 0, + 0, 2799, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2893, + 3071, 0, 2891, + 3071, 0, 2891, + 3069, 0, 2891, + 3069, 0, 2889, + 3067, 0, 2889, + 3067, 0, 2887, + 3065, 0, 2883, + 3061, 0, 2881, + 3057, 0, 2877, + 3053, 0, 2871, + 3045, 0, 2863, + 3037, 0, 2851, + 3023, 0, 2837, + 3005, 865, 2815, + 2981, 1431, 2785, + 2945, 1735, 2743, + 2891, 1963, 2679, + 2809, 2157, 2575, + 2671, 2329, 2385, + 2373, 2489, 1847, + 0, 2641, 0, + 0, 2787, 0, + 0, 2931, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3023, + 3201, 0, 3021, + 3201, 0, 3021, + 3199, 0, 3019, + 3199, 0, 3017, + 3195, 0, 3015, + 3193, 0, 3011, + 3189, 0, 3007, + 3185, 0, 3001, + 3177, 0, 2993, + 3167, 0, 2983, + 3155, 0, 2967, + 3137, 984, 2947, + 3111, 1559, 2917, + 3077, 1865, 2873, + 3023, 2095, 2809, + 2941, 2287, 2705, + 2801, 2461, 2515, + 2505, 2621, 1969, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3331, 0, 3151, + 3329, 0, 3149, + 3327, 0, 3147, + 3325, 0, 3143, + 3321, 0, 3139, + 3317, 0, 3133, + 3309, 0, 3125, + 3299, 0, 3113, + 3287, 0, 3099, + 3269, 1106, 3077, + 3243, 1689, 3049, + 3207, 1996, 3005, + 3155, 2225, 2941, + 3073, 2419, 2837, + 2933, 2593, 2645, + 2635, 2753, 2093, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3463, 0, 3283, + 3461, 0, 3281, + 3459, 0, 3277, + 3457, 0, 3275, + 3453, 0, 3271, + 3449, 0, 3265, + 3441, 0, 3257, + 3431, 0, 3245, + 3419, 0, 3231, + 3401, 1231, 3209, + 3375, 1819, 3179, + 3339, 2127, 3137, + 3287, 2357, 3071, + 3205, 2551, 2967, + 3065, 2725, 2775, + 2767, 2885, 2219, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3413, + 3591, 0, 3409, + 3589, 0, 3407, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1357, 3341, + 3507, 1949, 3311, + 3471, 2259, 3267, + 3419, 2489, 3203, + 3337, 2683, 3099, + 3197, 2855, 2905, + 2899, 3017, 2347, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3545, + 3727, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3539, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1485, 3473, + 3639, 2081, 3443, + 3603, 2391, 3399, + 3551, 2621, 3335, + 3469, 2815, 3229, + 3329, 2987, 3037, + 3031, 3149, 2477, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3671, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1614, 3605, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2753, 3467, + 3601, 2947, 3361, + 3461, 3119, 3169, + 3161, 3281, 2607, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3803, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1744, 3737, + 3903, 2343, 3707, + 3867, 2653, 3663, + 3815, 2885, 3599, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2737, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1874, 3869, + 4037, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3731, + 3865, 3211, 3625, + 3725, 3385, 3431, + 3425, 3545, 2867, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2005, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2999, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2135, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 532, 243, 872, + 424, 313, 835, + 222, 392, 781, + 0, 480, 697, + 0, 576, 552, + 0, 680, 237, + 0, 789, 0, + 0, 903, 0, + 0, 1022, 0, + 0, 1143, 0, + 0, 1267, 0, + 0, 1393, 0, + 0, 1520, 0, + 0, 1649, 0, + 0, 1779, 0, + 0, 1909, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 640, 231, 909, + 557, 303, 875, + 416, 384, 826, + 111, 473, 750, + 0, 571, 625, + 0, 675, 372, + 0, 786, 0, + 0, 901, 0, + 0, 1020, 0, + 0, 1141, 0, + 0, 1266, 0, + 0, 1392, 0, + 0, 1520, 0, + 0, 1649, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 754, 215, 955, + 690, 289, 924, + 589, 372, 880, + 404, 464, 814, + 0, 563, 706, + 0, 669, 506, + 0, 781, 0, + 0, 897, 0, + 0, 1017, 0, + 0, 1139, 0, + 0, 1264, 0, + 0, 1391, 0, + 0, 1519, 0, + 0, 1648, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 871, 192, 1009, + 823, 270, 982, + 750, 356, 944, + 628, 451, 886, + 389, 553, 796, + 0, 661, 639, + 0, 774, 273, + 0, 892, 0, + 0, 1013, 0, + 0, 1136, 0, + 0, 1262, 0, + 0, 1389, 0, + 0, 1518, 0, + 0, 1647, 0, + 0, 1777, 0, + 0, 1908, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 992, 160, 1073, + 956, 243, 1049, + 902, 334, 1017, + 819, 433, 968, + 676, 539, 895, + 367, 650, 772, + 0, 766, 531, + 0, 885, 0, + 0, 1008, 0, + 0, 1132, 0, + 0, 1259, 0, + 0, 1387, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1116, 113, 1146, + 1088, 204, 1126, + 1049, 302, 1099, + 990, 408, 1059, + 897, 519, 1000, + 733, 634, 905, + 337, 754, 738, + 0, 876, 328, + 0, 1001, 0, + 0, 1127, 0, + 0, 1255, 0, + 0, 1384, 0, + 0, 1514, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1241, 42, 1229, + 1221, 146, 1212, + 1191, 257, 1190, + 1149, 372, 1157, + 1086, 491, 1110, + 985, 613, 1038, + 799, 737, 919, + 293, 864, 688, + 0, 991, 0, + 0, 1120, 0, + 0, 1250, 0, + 0, 1380, 0, + 0, 1511, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1905, 0, + 0, 2036, 0, + 0, 2169, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1368, 0, 1320, + 1353, 56, 1307, + 1331, 187, 1288, + 1301, 319, 1262, + 1256, 451, 1225, + 1189, 582, 1170, + 1080, 714, 1085, + 875, 846, 937, + 226, 978, 610, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1497, 0, 1419, + 1485, 0, 1408, + 1469, 74, 1394, + 1447, 237, 1373, + 1415, 391, 1345, + 1369, 538, 1303, + 1298, 682, 1240, + 1183, 822, 1141, + 960, 960, 960, + 118, 1097, 481, + 0, 1232, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1634, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1626, 0, 1525, + 1617, 0, 1516, + 1606, 0, 1505, + 1589, 97, 1489, + 1566, 296, 1467, + 1533, 472, 1435, + 1485, 634, 1389, + 1412, 788, 1320, + 1291, 935, 1206, + 1054, 1078, 990, + 0, 1219, 216, + 0, 1357, 0, + 0, 1493, 0, + 0, 1629, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1756, 0, 1636, + 1750, 0, 1630, + 1741, 0, 1621, + 1729, 0, 1608, + 1712, 126, 1591, + 1688, 364, 1568, + 1655, 562, 1534, + 1606, 737, 1484, + 1530, 899, 1408, + 1405, 1052, 1281, + 1155, 1200, 1026, + 0, 1343, 0, + 0, 1483, 0, + 0, 1621, 0, + 0, 1758, 0, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1887, 0, 1752, + 1882, 0, 1747, + 1875, 0, 1740, + 1866, 0, 1731, + 1854, 0, 1718, + 1837, 163, 1700, + 1813, 442, 1675, + 1779, 659, 1639, + 1729, 846, 1586, + 1652, 1015, 1505, + 1523, 1173, 1366, + 1262, 1324, 1070, + 0, 1469, 0, + 0, 1611, 0, + 0, 1750, 0, + 0, 1888, 0, + 0, 2024, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2018, 0, 1872, + 2014, 0, 1868, + 2009, 0, 1862, + 2002, 0, 1855, + 1993, 0, 1845, + 1981, 0, 1832, + 1963, 207, 1813, + 1939, 529, 1787, + 1905, 764, 1750, + 1854, 960, 1695, + 1776, 1135, 1608, + 1644, 1297, 1458, + 1374, 1450, 1123, + 0, 1597, 0, + 0, 1740, 0, + 0, 1880, 0, + 0, 2018, 0, + 0, 2155, 0, + 0, 2289, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2149, 0, 1994, + 2147, 0, 1991, + 2143, 0, 1987, + 2137, 0, 1982, + 2131, 0, 1974, + 2121, 0, 1964, + 2109, 0, 1950, + 2091, 260, 1931, + 2067, 624, 1904, + 2032, 874, 1866, + 1981, 1078, 1808, + 1902, 1258, 1717, + 1768, 1422, 1559, + 1491, 1577, 1186, + 0, 1725, 0, + 0, 1869, 0, + 0, 2010, 0, + 0, 2149, 0, + 0, 2285, 0, + 0, 2421, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2281, 0, 2119, + 2279, 0, 2117, + 2275, 0, 2113, + 2271, 0, 2109, + 2267, 0, 2105, + 2261, 0, 2097, + 2251, 0, 2087, + 2239, 0, 2073, + 2221, 323, 2053, + 2195, 726, 2025, + 2161, 989, 1985, + 2109, 1200, 1926, + 2029, 1382, 1832, + 1894, 1549, 1665, + 1612, 1706, 1258, + 0, 1855, 0, + 0, 2000, 0, + 0, 2141, 0, + 0, 2279, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2413, 0, 2245, + 2411, 0, 2243, + 2409, 0, 2241, + 2405, 0, 2239, + 2401, 0, 2235, + 2397, 0, 2229, + 2391, 0, 2221, + 2381, 0, 2211, + 2367, 0, 2197, + 2351, 396, 2177, + 2325, 834, 2147, + 2291, 1108, 2107, + 2239, 1323, 2047, + 2157, 1509, 1950, + 2021, 1678, 1777, + 1735, 1835, 1340, + 0, 1985, 0, + 0, 2131, 0, + 0, 2273, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2543, 0, 2373, + 2543, 0, 2373, + 2541, 0, 2371, + 2539, 0, 2369, + 2537, 0, 2365, + 2533, 0, 2361, + 2527, 0, 2355, + 2521, 0, 2347, + 2511, 0, 2337, + 2499, 0, 2323, + 2481, 477, 2301, + 2455, 948, 2273, + 2421, 1230, 2231, + 2369, 1449, 2171, + 2287, 1637, 2071, + 2149, 1807, 1894, + 1860, 1965, 1430, + 0, 2115, 0, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2675, 0, 2503, + 2675, 0, 2501, + 2673, 0, 2501, + 2673, 0, 2499, + 2671, 0, 2497, + 2667, 0, 2493, + 2663, 0, 2489, + 2659, 0, 2483, + 2651, 0, 2475, + 2643, 0, 2465, + 2629, 0, 2449, + 2611, 568, 2429, + 2587, 1065, 2401, + 2551, 1355, 2359, + 2499, 1577, 2295, + 2417, 1766, 2195, + 2279, 1937, 2014, + 1987, 2095, 1528, + 0, 2247, 0, + 0, 2393, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2633, + 2807, 0, 2631, + 2807, 0, 2631, + 2805, 0, 2629, + 2803, 0, 2627, + 2801, 0, 2625, + 2799, 0, 2621, + 2795, 0, 2617, + 2789, 0, 2611, + 2783, 0, 2603, + 2773, 0, 2593, + 2761, 0, 2579, + 2743, 666, 2557, + 2717, 1186, 2529, + 2681, 1481, 2487, + 2629, 1705, 2423, + 2547, 1896, 2321, + 2409, 2067, 2137, + 2115, 2227, 1633, + 0, 2379, 0, + 0, 2525, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2943, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2763, + 2939, 0, 2763, + 2939, 0, 2761, + 2937, 0, 2761, + 2937, 0, 2759, + 2935, 0, 2757, + 2933, 0, 2755, + 2931, 0, 2751, + 2927, 0, 2747, + 2921, 0, 2741, + 2915, 0, 2733, + 2905, 0, 2723, + 2891, 0, 2707, + 2875, 771, 2687, + 2849, 1310, 2657, + 2813, 1609, 2615, + 2761, 1835, 2551, + 2679, 2026, 2449, + 2541, 2199, 2263, + 2245, 2359, 1744, + 0, 2509, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3075, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2893, + 3071, 0, 2893, + 3071, 0, 2893, + 3071, 0, 2891, + 3069, 0, 2891, + 3069, 0, 2889, + 3067, 0, 2887, + 3065, 0, 2885, + 3061, 0, 2881, + 3057, 0, 2877, + 3053, 0, 2871, + 3045, 0, 2863, + 3037, 0, 2853, + 3023, 0, 2837, + 3005, 882, 2817, + 2981, 1436, 2787, + 2945, 1738, 2745, + 2891, 1965, 2681, + 2811, 2157, 2577, + 2671, 2329, 2389, + 2375, 2489, 1860, + 0, 2641, 0, + 0, 2787, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3023, + 3203, 0, 3023, + 3201, 0, 3023, + 3201, 0, 3021, + 3199, 0, 3021, + 3199, 0, 3019, + 3197, 0, 3015, + 3193, 0, 3013, + 3189, 0, 3009, + 3185, 0, 3003, + 3177, 0, 2995, + 3169, 0, 2983, + 3155, 0, 2969, + 3137, 997, 2947, + 3113, 1563, 2919, + 3077, 1867, 2875, + 3023, 2095, 2811, + 2941, 2289, 2707, + 2803, 2461, 2517, + 2505, 2621, 1979, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3333, 0, 3153, + 3333, 0, 3153, + 3331, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3325, 0, 3143, + 3321, 0, 3139, + 3317, 0, 3133, + 3309, 0, 3125, + 3301, 0, 3115, + 3287, 0, 3099, + 3269, 1116, 3079, + 3245, 1692, 3049, + 3209, 1997, 3007, + 3155, 2227, 2941, + 3073, 2419, 2837, + 2933, 2593, 2647, + 2637, 2753, 2101, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3285, + 3463, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3457, 0, 3275, + 3453, 0, 3271, + 3449, 0, 3265, + 3441, 0, 3257, + 3431, 0, 3245, + 3419, 0, 3231, + 3401, 1238, 3209, + 3375, 1821, 3181, + 3341, 2129, 3137, + 3287, 2357, 3073, + 3205, 2551, 2969, + 3065, 2725, 2777, + 2767, 2885, 2225, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3595, 0, 3415, + 3595, 0, 3413, + 3591, 0, 3411, + 3589, 0, 3407, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3563, 0, 3377, + 3551, 0, 3363, + 3533, 1363, 3341, + 3507, 1951, 3311, + 3471, 2259, 3269, + 3419, 2489, 3203, + 3337, 2683, 3099, + 3197, 2857, 2907, + 2899, 3017, 2351, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3545, + 3727, 0, 3545, + 3725, 0, 3541, + 3721, 0, 3539, + 3717, 0, 3535, + 3713, 0, 3529, + 3705, 0, 3521, + 3695, 0, 3509, + 3683, 0, 3495, + 3665, 1489, 3473, + 3639, 2081, 3443, + 3603, 2391, 3401, + 3551, 2621, 3335, + 3469, 2815, 3231, + 3329, 2989, 3037, + 3031, 3149, 2479, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3677, + 3857, 0, 3673, + 3853, 0, 3671, + 3849, 0, 3665, + 3845, 0, 3661, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1617, 3605, + 3771, 2213, 3575, + 3735, 2523, 3531, + 3683, 2753, 3467, + 3601, 2947, 3363, + 3461, 3121, 3169, + 3163, 3281, 2609, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3803, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1746, 3737, + 3903, 2343, 3707, + 3869, 2653, 3663, + 3815, 2885, 3599, + 3733, 3079, 3493, + 3593, 3253, 3301, + 3295, 3413, 2739, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1876, 3869, + 4037, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3731, + 3865, 3211, 3625, + 3725, 3385, 3431, + 3425, 3545, 2869, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2006, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2999, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2137, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3131, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 644, 324, 1001, + 562, 383, 974, + 422, 452, 935, + 123, 530, 876, + 0, 617, 784, + 0, 713, 622, + 0, 815, 233, + 0, 924, 0, + 0, 1037, 0, + 0, 1155, 0, + 0, 1276, 0, + 0, 1400, 0, + 0, 1526, 0, + 0, 1653, 0, + 0, 1782, 0, + 0, 1911, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 731, 315, 1029, + 664, 375, 1004, + 556, 445, 967, + 354, 524, 913, + 0, 612, 829, + 0, 708, 684, + 0, 812, 369, + 0, 921, 0, + 0, 1035, 0, + 0, 1154, 0, + 0, 1275, 0, + 0, 1399, 0, + 0, 1525, 0, + 0, 1653, 0, + 0, 1781, 0, + 0, 1911, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 826, 301, 1065, + 772, 363, 1041, + 689, 435, 1008, + 548, 516, 958, + 243, 605, 883, + 0, 703, 757, + 0, 807, 504, + 0, 918, 0, + 0, 1033, 0, + 0, 1151, 0, + 0, 1273, 0, + 0, 1398, 0, + 0, 1524, 0, + 0, 1652, 0, + 0, 1781, 0, + 0, 1910, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 928, 282, 1108, + 886, 347, 1086, + 822, 421, 1056, + 721, 504, 1012, + 536, 596, 946, + 32, 695, 838, + 0, 801, 638, + 0, 913, 23, + 0, 1029, 0, + 0, 1149, 0, + 0, 1271, 0, + 0, 1396, 0, + 0, 1523, 0, + 0, 1651, 0, + 0, 1780, 0, + 0, 1910, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1036, 256, 1160, + 1003, 324, 1141, + 955, 402, 1114, + 882, 488, 1075, + 760, 583, 1018, + 521, 685, 929, + 0, 793, 771, + 0, 907, 406, + 0, 1024, 0, + 0, 1145, 0, + 0, 1268, 0, + 0, 1394, 0, + 0, 1521, 0, + 0, 1650, 0, + 0, 1779, 0, + 0, 1909, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1150, 219, 1221, + 1124, 292, 1205, + 1088, 375, 1182, + 1034, 466, 1149, + 951, 565, 1100, + 808, 671, 1026, + 500, 782, 905, + 0, 898, 663, + 0, 1017, 0, + 0, 1140, 0, + 0, 1265, 0, + 0, 1391, 0, + 0, 1519, 0, + 0, 1648, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1267, 163, 1292, + 1248, 245, 1278, + 1220, 336, 1259, + 1181, 435, 1231, + 1122, 540, 1191, + 1029, 651, 1131, + 865, 767, 1037, + 469, 886, 870, + 0, 1008, 460, + 0, 1133, 0, + 0, 1259, 0, + 0, 1387, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1388, 76, 1373, + 1373, 174, 1361, + 1353, 278, 1345, + 1324, 389, 1322, + 1281, 504, 1289, + 1218, 623, 1242, + 1116, 745, 1170, + 932, 870, 1051, + 425, 996, 820, + 0, 1123, 0, + 0, 1252, 0, + 0, 1382, 0, + 0, 1512, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1512, 0, 1462, + 1501, 57, 1452, + 1485, 188, 1439, + 1463, 319, 1420, + 1433, 451, 1395, + 1388, 583, 1357, + 1321, 715, 1303, + 1212, 847, 1217, + 1008, 979, 1069, + 358, 1110, 742, + 0, 1242, 0, + 0, 1374, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1638, 0, 1559, + 1629, 0, 1551, + 1617, 29, 1541, + 1601, 206, 1526, + 1579, 369, 1505, + 1547, 523, 1477, + 1501, 670, 1435, + 1430, 814, 1373, + 1315, 954, 1273, + 1092, 1092, 1092, + 250, 1229, 613, + 0, 1364, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1765, 0, 1663, + 1758, 0, 1657, + 1750, 0, 1649, + 1738, 0, 1637, + 1721, 229, 1621, + 1698, 428, 1599, + 1665, 604, 1567, + 1617, 766, 1522, + 1544, 920, 1452, + 1423, 1067, 1338, + 1186, 1211, 1122, + 47, 1351, 348, + 0, 1489, 0, + 0, 1626, 0, + 0, 1761, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1893, 0, 1773, + 1888, 0, 1768, + 1882, 0, 1762, + 1873, 0, 1753, + 1861, 0, 1740, + 1844, 258, 1723, + 1820, 496, 1700, + 1787, 694, 1666, + 1738, 869, 1616, + 1662, 1031, 1540, + 1537, 1185, 1414, + 1287, 1332, 1158, + 0, 1475, 0, + 0, 1615, 0, + 0, 1753, 0, + 0, 1890, 0, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2023, 0, 1888, + 2019, 0, 1884, + 2014, 0, 1879, + 2007, 0, 1872, + 1998, 0, 1863, + 1986, 0, 1850, + 1969, 295, 1832, + 1945, 574, 1807, + 1911, 791, 1771, + 1861, 978, 1718, + 1784, 1147, 1637, + 1655, 1305, 1498, + 1394, 1456, 1202, + 0, 1601, 0, + 0, 1743, 0, + 0, 1882, 0, + 0, 2020, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2153, 0, 2007, + 2149, 0, 2004, + 2147, 0, 2000, + 2141, 0, 1995, + 2135, 0, 1987, + 2125, 0, 1978, + 2113, 0, 1964, + 2095, 339, 1946, + 2071, 661, 1920, + 2037, 896, 1882, + 1986, 1092, 1827, + 1908, 1267, 1740, + 1777, 1429, 1590, + 1507, 1582, 1256, + 0, 1729, 0, + 0, 1872, 0, + 0, 2012, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2283, 0, 2129, + 2281, 0, 2127, + 2279, 0, 2123, + 2275, 0, 2119, + 2269, 0, 2113, + 2263, 0, 2107, + 2253, 0, 2097, + 2241, 0, 2083, + 2223, 393, 2063, + 2199, 756, 2036, + 2165, 1006, 1998, + 2113, 1210, 1940, + 2034, 1390, 1850, + 1900, 1554, 1691, + 1624, 1709, 1318, + 0, 1858, 0, + 0, 2002, 0, + 0, 2143, 0, + 0, 2281, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2415, 0, 2253, + 2413, 0, 2251, + 2411, 0, 2249, + 2407, 0, 2245, + 2405, 0, 2241, + 2399, 0, 2237, + 2393, 0, 2229, + 2383, 0, 2219, + 2371, 0, 2205, + 2353, 455, 2185, + 2329, 858, 2157, + 2293, 1121, 2117, + 2241, 1332, 2057, + 2161, 1515, 1964, + 2026, 1681, 1797, + 1744, 1838, 1391, + 0, 1987, 0, + 0, 2131, 0, + 0, 2273, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2545, 0, 2379, + 2545, 0, 2377, + 2543, 0, 2377, + 2541, 0, 2373, + 2537, 0, 2371, + 2535, 0, 2367, + 2529, 0, 2361, + 2523, 0, 2353, + 2513, 0, 2343, + 2501, 0, 2329, + 2483, 528, 2309, + 2457, 966, 2281, + 2423, 1240, 2239, + 2371, 1456, 2179, + 2289, 1641, 2083, + 2153, 1810, 1910, + 1867, 1967, 1472, + 0, 2117, 0, + 0, 2263, 0, + 0, 2405, 0, + 0, 2543, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2677, 0, 2507, + 2675, 0, 2505, + 2675, 0, 2505, + 2673, 0, 2503, + 2671, 0, 2501, + 2669, 0, 2497, + 2665, 0, 2493, + 2659, 0, 2487, + 2653, 0, 2479, + 2643, 0, 2469, + 2631, 0, 2455, + 2613, 609, 2433, + 2587, 1080, 2405, + 2553, 1362, 2365, + 2501, 1582, 2303, + 2419, 1769, 2203, + 2283, 1939, 2026, + 1993, 2097, 1562, + 0, 2249, 0, + 0, 2393, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2809, 0, 2635, + 2807, 0, 2635, + 2807, 0, 2633, + 2805, 0, 2633, + 2805, 0, 2631, + 2803, 0, 2629, + 2799, 0, 2625, + 2795, 0, 2621, + 2791, 0, 2615, + 2783, 0, 2607, + 2775, 0, 2597, + 2761, 0, 2581, + 2743, 700, 2561, + 2719, 1198, 2533, + 2683, 1487, 2491, + 2631, 1709, 2427, + 2549, 1898, 2327, + 2411, 2069, 2147, + 2119, 2227, 1661, + 0, 2379, 0, + 0, 2525, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2941, 0, 2765, + 2939, 0, 2765, + 2939, 0, 2763, + 2939, 0, 2763, + 2937, 0, 2761, + 2935, 0, 2759, + 2933, 0, 2757, + 2931, 0, 2755, + 2927, 0, 2749, + 2921, 0, 2743, + 2915, 0, 2737, + 2905, 0, 2725, + 2893, 0, 2711, + 2875, 798, 2689, + 2849, 1319, 2661, + 2815, 1613, 2619, + 2761, 1837, 2555, + 2681, 2028, 2453, + 2541, 2199, 2269, + 2247, 2359, 1766, + 0, 2511, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3073, 0, 2895, + 3071, 0, 2895, + 3071, 0, 2895, + 3071, 0, 2893, + 3069, 0, 2893, + 3069, 0, 2891, + 3067, 0, 2889, + 3065, 0, 2887, + 3063, 0, 2883, + 3059, 0, 2879, + 3053, 0, 2873, + 3047, 0, 2865, + 3037, 0, 2855, + 3025, 0, 2839, + 3007, 903, 2819, + 2981, 1442, 2789, + 2945, 1741, 2747, + 2893, 1967, 2683, + 2811, 2159, 2581, + 2673, 2331, 2395, + 2377, 2491, 1876, + 0, 2641, 0, + 0, 2789, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3023, + 3201, 0, 3023, + 3201, 0, 3021, + 3199, 0, 3019, + 3197, 0, 3017, + 3193, 0, 3015, + 3191, 0, 3009, + 3185, 0, 3003, + 3177, 0, 2995, + 3169, 0, 2985, + 3155, 0, 2971, + 3137, 1014, 2949, + 3113, 1568, 2919, + 3077, 1870, 2877, + 3025, 2097, 2813, + 2943, 2289, 2711, + 2803, 2461, 2521, + 2507, 2621, 1992, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3333, 0, 3153, + 3333, 0, 3153, + 3331, 0, 3151, + 3329, 0, 3149, + 3325, 0, 3145, + 3321, 0, 3141, + 3317, 0, 3135, + 3309, 0, 3127, + 3301, 0, 3115, + 3287, 0, 3101, + 3269, 1129, 3079, + 3245, 1695, 3051, + 3209, 1999, 3007, + 3155, 2227, 2943, + 3073, 2421, 2839, + 2935, 2593, 2649, + 2637, 2753, 2111, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3469, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3465, 0, 3285, + 3465, 0, 3285, + 3463, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3457, 0, 3277, + 3453, 0, 3271, + 3449, 0, 3265, + 3441, 0, 3257, + 3433, 0, 3247, + 3419, 0, 3231, + 3401, 1248, 3211, + 3377, 1824, 3181, + 3341, 2129, 3139, + 3287, 2359, 3073, + 3205, 2551, 2969, + 3065, 2725, 2779, + 2769, 2885, 2233, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3417, + 3595, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3589, 0, 3407, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3565, 0, 3379, + 3551, 0, 3363, + 3533, 1371, 3341, + 3509, 1953, 3313, + 3473, 2261, 3269, + 3419, 2489, 3205, + 3337, 2683, 3101, + 3197, 2857, 2909, + 2899, 3017, 2357, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3551, + 3733, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3721, 0, 3539, + 3717, 0, 3535, + 3713, 0, 3529, + 3705, 0, 3521, + 3697, 0, 3509, + 3683, 0, 3495, + 3665, 1495, 3473, + 3641, 2083, 3443, + 3605, 2391, 3401, + 3551, 2621, 3335, + 3469, 2815, 3231, + 3329, 2989, 3039, + 3031, 3149, 2485, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3673, + 3853, 0, 3671, + 3849, 0, 3667, + 3845, 0, 3661, + 3837, 0, 3653, + 3829, 0, 3641, + 3815, 0, 3627, + 3797, 1622, 3605, + 3773, 2213, 3575, + 3737, 2523, 3533, + 3683, 2753, 3467, + 3601, 2947, 3363, + 3461, 3121, 3169, + 3163, 3281, 2611, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3809, + 3989, 0, 3805, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3773, + 3947, 0, 3757, + 3929, 1749, 3737, + 3905, 2345, 3707, + 3869, 2655, 3663, + 3815, 2885, 3599, + 3733, 3079, 3495, + 3593, 3253, 3301, + 3295, 3413, 2741, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3925, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1878, 3869, + 4037, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3731, + 3865, 3211, 3625, + 3725, 3385, 3433, + 3427, 3545, 2871, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2008, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3559, 3677, 3001, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2139, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3691, 3809, 3131, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2269, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3823, 3941, 3263, + 761, 415, 1131, + 699, 464, 1111, + 599, 522, 1082, + 420, 590, 1041, + 0, 667, 979, + 0, 753, 880, + 0, 848, 701, + 0, 950, 229, + 0, 1058, 0, + 0, 1171, 0, + 0, 1288, 0, + 0, 1409, 0, + 0, 1533, 0, + 0, 1658, 0, + 0, 1786, 0, + 0, 1914, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 829, 407, 1153, + 776, 456, 1133, + 694, 515, 1106, + 554, 584, 1067, + 255, 662, 1008, + 0, 749, 916, + 0, 845, 754, + 0, 947, 365, + 0, 1056, 0, + 0, 1169, 0, + 0, 1287, 0, + 0, 1408, 0, + 0, 1532, 0, + 0, 1658, 0, + 0, 1785, 0, + 0, 1914, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 907, 396, 1180, + 863, 447, 1161, + 796, 507, 1136, + 688, 577, 1099, + 486, 656, 1045, + 0, 744, 961, + 0, 841, 817, + 0, 944, 501, + 0, 1053, 0, + 0, 1167, 0, + 0, 1286, 0, + 0, 1407, 0, + 0, 1531, 0, + 0, 1657, 0, + 0, 1785, 0, + 0, 1913, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 994, 381, 1214, + 958, 433, 1197, + 904, 495, 1173, + 821, 567, 1139, + 680, 648, 1090, + 375, 737, 1015, + 0, 835, 889, + 0, 939, 636, + 0, 1050, 0, + 0, 1165, 0, + 0, 1284, 0, + 0, 1406, 0, + 0, 1530, 0, + 0, 1656, 0, + 0, 1784, 0, + 0, 1913, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1089, 360, 1255, + 1060, 415, 1240, + 1018, 479, 1219, + 955, 553, 1188, + 853, 636, 1144, + 669, 728, 1078, + 164, 827, 970, + 0, 933, 770, + 0, 1045, 155, + 0, 1161, 0, + 0, 1281, 0, + 0, 1403, 0, + 0, 1528, 0, + 0, 1655, 0, + 0, 1783, 0, + 0, 1912, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1191, 330, 1306, + 1168, 388, 1292, + 1135, 456, 1273, + 1087, 534, 1246, + 1014, 620, 1208, + 893, 715, 1150, + 653, 817, 1060, + 0, 925, 903, + 0, 1038, 538, + 0, 1156, 0, + 0, 1277, 0, + 0, 1401, 0, + 0, 1526, 0, + 0, 1653, 0, + 0, 1782, 0, + 0, 1911, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1300, 287, 1366, + 1282, 351, 1353, + 1256, 424, 1337, + 1220, 507, 1314, + 1166, 598, 1281, + 1083, 697, 1232, + 940, 803, 1159, + 632, 914, 1036, + 0, 1030, 795, + 0, 1149, 0, + 0, 1272, 0, + 0, 1397, 0, + 0, 1523, 0, + 0, 1651, 0, + 0, 1780, 0, + 0, 1910, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1413, 222, 1435, + 1399, 295, 1425, + 1380, 377, 1410, + 1352, 468, 1391, + 1313, 567, 1363, + 1254, 672, 1323, + 1161, 783, 1264, + 997, 899, 1169, + 601, 1018, 1002, + 0, 1140, 592, + 0, 1265, 0, + 0, 1391, 0, + 0, 1519, 0, + 0, 1648, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1531, 118, 1514, + 1520, 208, 1505, + 1505, 306, 1493, + 1485, 411, 1477, + 1456, 521, 1454, + 1413, 636, 1421, + 1350, 755, 1374, + 1249, 877, 1302, + 1063, 1002, 1183, + 557, 1128, 952, + 0, 1255, 0, + 0, 1384, 0, + 0, 1514, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1652, 0, 1601, + 1644, 58, 1594, + 1633, 189, 1584, + 1617, 320, 1571, + 1596, 451, 1553, + 1565, 583, 1527, + 1520, 715, 1490, + 1453, 847, 1435, + 1344, 979, 1349, + 1139, 1110, 1201, + 490, 1242, 875, + 0, 1375, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1776, 0, 1697, + 1770, 0, 1691, + 1761, 0, 1683, + 1749, 161, 1673, + 1733, 338, 1658, + 1711, 501, 1638, + 1679, 655, 1609, + 1633, 803, 1567, + 1562, 946, 1505, + 1447, 1086, 1405, + 1225, 1225, 1225, + 382, 1361, 745, + 0, 1497, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1902, 0, 1800, + 1897, 0, 1795, + 1890, 0, 1789, + 1882, 0, 1781, + 1870, 122, 1769, + 1853, 361, 1753, + 1830, 560, 1731, + 1797, 736, 1700, + 1750, 898, 1654, + 1676, 1052, 1584, + 1556, 1199, 1471, + 1318, 1343, 1254, + 179, 1483, 480, + 0, 1621, 0, + 0, 1758, 0, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2029, 0, 1909, + 2025, 0, 1905, + 2021, 0, 1900, + 2014, 0, 1894, + 2005, 0, 1885, + 1993, 63, 1873, + 1976, 390, 1856, + 1952, 628, 1832, + 1919, 826, 1798, + 1870, 1001, 1748, + 1795, 1163, 1672, + 1669, 1317, 1546, + 1419, 1464, 1290, + 0, 1607, 0, + 0, 1747, 0, + 0, 1886, 0, + 0, 2022, 0, + 0, 2157, 0, + 0, 2293, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2157, 0, 2023, + 2155, 0, 2020, + 2151, 0, 2016, + 2147, 0, 2011, + 2139, 0, 2004, + 2131, 0, 1995, + 2119, 0, 1982, + 2101, 427, 1964, + 2077, 706, 1939, + 2043, 924, 1903, + 1993, 1110, 1851, + 1916, 1279, 1769, + 1787, 1437, 1630, + 1526, 1588, 1334, + 0, 1733, 0, + 0, 1875, 0, + 0, 2014, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2287, 0, 2141, + 2285, 0, 2139, + 2283, 0, 2135, + 2279, 0, 2131, + 2273, 0, 2127, + 2267, 0, 2119, + 2257, 0, 2109, + 2245, 0, 2097, + 2227, 471, 2077, + 2203, 793, 2051, + 2169, 1028, 2014, + 2119, 1224, 1959, + 2040, 1399, 1872, + 1909, 1561, 1723, + 1639, 1714, 1388, + 0, 1861, 0, + 0, 2004, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2417, 0, 2263, + 2415, 0, 2261, + 2413, 0, 2259, + 2411, 0, 2255, + 2407, 0, 2251, + 2401, 0, 2245, + 2395, 0, 2239, + 2385, 0, 2229, + 2373, 0, 2215, + 2355, 525, 2195, + 2331, 888, 2169, + 2297, 1138, 2129, + 2245, 1342, 2073, + 2165, 1522, 1982, + 2033, 1686, 1823, + 1756, 1841, 1450, + 0, 1990, 0, + 0, 2133, 0, + 0, 2275, 0, + 0, 2413, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2547, 0, 2387, + 2547, 0, 2385, + 2545, 0, 2383, + 2543, 0, 2381, + 2539, 0, 2377, + 2537, 0, 2373, + 2531, 0, 2369, + 2525, 0, 2361, + 2515, 0, 2351, + 2503, 0, 2337, + 2485, 587, 2317, + 2461, 990, 2289, + 2425, 1253, 2249, + 2373, 1464, 2189, + 2293, 1647, 2097, + 2159, 1813, 1930, + 1876, 1970, 1523, + 0, 2119, 0, + 0, 2263, 0, + 0, 2405, 0, + 0, 2545, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2679, 0, 2513, + 2677, 0, 2511, + 2677, 0, 2509, + 2675, 0, 2509, + 2673, 0, 2505, + 2669, 0, 2503, + 2667, 0, 2499, + 2661, 0, 2493, + 2655, 0, 2485, + 2645, 0, 2475, + 2633, 0, 2461, + 2615, 660, 2441, + 2589, 1098, 2413, + 2555, 1372, 2371, + 2503, 1588, 2311, + 2421, 1773, 2215, + 2285, 1942, 2042, + 1999, 2099, 1604, + 0, 2249, 0, + 0, 2395, 0, + 0, 2537, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2809, 0, 2639, + 2809, 0, 2639, + 2809, 0, 2637, + 2807, 0, 2637, + 2805, 0, 2635, + 2803, 0, 2633, + 2801, 0, 2629, + 2797, 0, 2625, + 2791, 0, 2619, + 2785, 0, 2611, + 2775, 0, 2601, + 2763, 0, 2587, + 2745, 742, 2567, + 2721, 1212, 2537, + 2685, 1495, 2497, + 2633, 1714, 2435, + 2551, 1901, 2335, + 2415, 2071, 2159, + 2125, 2229, 1695, + 0, 2381, 0, + 0, 2525, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2941, 0, 2769, + 2941, 0, 2767, + 2939, 0, 2767, + 2939, 0, 2765, + 2937, 0, 2765, + 2937, 0, 2763, + 2935, 0, 2761, + 2931, 0, 2757, + 2927, 0, 2753, + 2923, 0, 2747, + 2915, 0, 2739, + 2907, 0, 2729, + 2893, 0, 2713, + 2875, 832, 2693, + 2851, 1330, 2665, + 2815, 1619, 2623, + 2763, 1841, 2561, + 2681, 2030, 2461, + 2543, 2201, 2279, + 2251, 2361, 1793, + 0, 2511, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3073, 0, 2897, + 3073, 0, 2897, + 3071, 0, 2897, + 3071, 0, 2895, + 3071, 0, 2895, + 3069, 0, 2893, + 3067, 0, 2891, + 3065, 0, 2889, + 3063, 0, 2887, + 3059, 0, 2881, + 3053, 0, 2877, + 3047, 0, 2869, + 3037, 0, 2857, + 3025, 0, 2843, + 3007, 930, 2821, + 2981, 1451, 2793, + 2947, 1745, 2751, + 2893, 1970, 2687, + 2813, 2161, 2587, + 2673, 2331, 2401, + 2379, 2491, 1898, + 0, 2643, 0, + 0, 2789, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3027, + 3205, 0, 3027, + 3203, 0, 3027, + 3203, 0, 3027, + 3203, 0, 3025, + 3201, 0, 3025, + 3201, 0, 3023, + 3199, 0, 3021, + 3197, 0, 3019, + 3195, 0, 3015, + 3191, 0, 3011, + 3185, 0, 3005, + 3179, 0, 2997, + 3169, 0, 2987, + 3157, 0, 2973, + 3139, 1035, 2951, + 3113, 1574, 2921, + 3077, 1873, 2879, + 3025, 2099, 2815, + 2943, 2291, 2713, + 2805, 2463, 2527, + 2509, 2623, 2008, + 0, 2775, 0, + 0, 2921, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3337, 0, 3159, + 3337, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3155, + 3333, 0, 3155, + 3333, 0, 3153, + 3331, 0, 3151, + 3329, 0, 3149, + 3325, 0, 3147, + 3323, 0, 3141, + 3317, 0, 3137, + 3311, 0, 3129, + 3301, 0, 3117, + 3287, 0, 3103, + 3269, 1146, 3081, + 3245, 1700, 3051, + 3209, 2002, 3009, + 3157, 2229, 2945, + 3075, 2421, 2843, + 2935, 2593, 2653, + 2639, 2753, 2123, + 0, 2905, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4011, 0, + 3469, 0, 3289, + 3469, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3287, + 3467, 0, 3287, + 3465, 0, 3285, + 3465, 0, 3285, + 3463, 0, 3283, + 3461, 0, 3281, + 3457, 0, 3277, + 3453, 0, 3273, + 3449, 0, 3267, + 3441, 0, 3259, + 3433, 0, 3247, + 3419, 0, 3233, + 3401, 1261, 3211, + 3377, 1827, 3183, + 3341, 2131, 3139, + 3287, 2359, 3075, + 3205, 2553, 2971, + 3067, 2725, 2781, + 2769, 2885, 2243, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3421, + 3601, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3597, 0, 3417, + 3595, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3589, 0, 3409, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3565, 0, 3379, + 3551, 0, 3363, + 3533, 1380, 3343, + 3509, 1956, 3313, + 3473, 2261, 3271, + 3419, 2491, 3205, + 3337, 2683, 3101, + 3199, 2857, 2911, + 2901, 3017, 2365, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3551, + 3733, 0, 3551, + 3733, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3729, 0, 3549, + 3729, 0, 3549, + 3727, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3721, 0, 3539, + 3717, 0, 3535, + 3713, 0, 3529, + 3705, 0, 3521, + 3697, 0, 3511, + 3683, 0, 3495, + 3665, 1503, 3475, + 3641, 2085, 3445, + 3605, 2393, 3401, + 3551, 2623, 3337, + 3469, 2815, 3233, + 3329, 2989, 3041, + 3031, 3149, 2489, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3853, 0, 3671, + 3849, 0, 3667, + 3845, 0, 3661, + 3837, 0, 3653, + 3829, 0, 3641, + 3815, 0, 3627, + 3797, 1627, 3605, + 3773, 2215, 3575, + 3737, 2523, 3533, + 3683, 2753, 3467, + 3601, 2947, 3363, + 3461, 3121, 3171, + 3163, 3281, 2617, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3811, + 3991, 0, 3809, + 3989, 0, 3807, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3773, + 3947, 0, 3759, + 3929, 1754, 3737, + 3905, 2345, 3707, + 3869, 2655, 3665, + 3815, 2885, 3599, + 3733, 3079, 3495, + 3593, 3253, 3301, + 3295, 3413, 2743, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3905, + 4079, 0, 3891, + 4061, 1881, 3869, + 4037, 2477, 3839, + 4001, 2787, 3795, + 3947, 3017, 3731, + 3865, 3211, 3627, + 3725, 3385, 3433, + 3427, 3545, 2873, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2010, 4001, + 4095, 2609, 3971, + 4095, 2919, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3565, + 3559, 3677, 3003, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2141, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3697, + 3691, 3809, 3133, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2271, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3823, 3941, 3263, + 881, 513, 1262, + 834, 553, 1247, + 762, 601, 1225, + 645, 659, 1196, + 417, 726, 1152, + 0, 802, 1087, + 0, 888, 982, + 0, 982, 788, + 0, 1083, 222, + 0, 1191, 0, + 0, 1304, 0, + 0, 1421, 0, + 0, 1542, 0, + 0, 1665, 0, + 0, 1791, 0, + 0, 1918, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 934, 506, 1278, + 893, 547, 1263, + 831, 596, 1243, + 731, 654, 1214, + 552, 722, 1173, + 77, 799, 1111, + 0, 885, 1012, + 0, 980, 833, + 0, 1082, 361, + 0, 1190, 0, + 0, 1303, 0, + 0, 1421, 0, + 0, 1541, 0, + 0, 1665, 0, + 0, 1791, 0, + 0, 1918, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 997, 497, 1299, + 961, 539, 1285, + 908, 588, 1265, + 826, 648, 1238, + 686, 716, 1199, + 387, 794, 1140, + 0, 882, 1048, + 0, 977, 886, + 0, 1079, 498, + 0, 1188, 0, + 0, 1302, 0, + 0, 1419, 0, + 0, 1541, 0, + 0, 1664, 0, + 0, 1790, 0, + 0, 1917, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1070, 485, 1325, + 1039, 528, 1312, + 995, 579, 1294, + 928, 639, 1268, + 820, 709, 1231, + 618, 788, 1177, + 0, 876, 1093, + 0, 973, 949, + 0, 1076, 633, + 0, 1185, 0, + 0, 1299, 0, + 0, 1418, 0, + 0, 1539, 0, + 0, 1663, 0, + 0, 1789, 0, + 0, 1917, 0, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1151, 469, 1358, + 1126, 513, 1346, + 1090, 565, 1329, + 1036, 627, 1305, + 954, 699, 1272, + 812, 780, 1222, + 507, 870, 1147, + 0, 967, 1021, + 0, 1071, 768, + 0, 1182, 0, + 0, 1297, 0, + 0, 1416, 0, + 0, 1538, 0, + 0, 1662, 0, + 0, 1788, 0, + 0, 1916, 0, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1242, 446, 1399, + 1221, 492, 1387, + 1192, 547, 1372, + 1150, 611, 1351, + 1086, 685, 1320, + 985, 768, 1276, + 801, 860, 1210, + 296, 960, 1102, + 0, 1065, 902, + 0, 1177, 287, + 0, 1293, 0, + 0, 1413, 0, + 0, 1536, 0, + 0, 1661, 0, + 0, 1787, 0, + 0, 1915, 0, + 0, 2044, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1340, 413, 1448, + 1323, 462, 1438, + 1300, 520, 1424, + 1267, 588, 1405, + 1219, 666, 1378, + 1146, 752, 1340, + 1024, 847, 1283, + 785, 949, 1193, + 0, 1057, 1035, + 0, 1171, 670, + 0, 1288, 0, + 0, 1409, 0, + 0, 1533, 0, + 0, 1658, 0, + 0, 1786, 0, + 0, 1914, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1445, 365, 1506, + 1432, 419, 1498, + 1414, 483, 1486, + 1388, 556, 1469, + 1352, 639, 1446, + 1298, 730, 1413, + 1215, 829, 1365, + 1072, 935, 1291, + 764, 1046, 1169, + 0, 1162, 927, + 0, 1281, 0, + 0, 1404, 0, + 0, 1529, 0, + 0, 1655, 0, + 0, 1783, 0, + 0, 1912, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1556, 291, 1575, + 1546, 354, 1567, + 1531, 427, 1557, + 1512, 509, 1542, + 1485, 600, 1523, + 1445, 699, 1495, + 1386, 804, 1455, + 1293, 915, 1396, + 1129, 1031, 1301, + 733, 1150, 1134, + 0, 1272, 724, + 0, 1397, 0, + 0, 1524, 0, + 0, 1651, 0, + 0, 1780, 0, + 0, 1910, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1671, 169, 1652, + 1663, 250, 1646, + 1652, 340, 1637, + 1638, 438, 1625, + 1617, 543, 1609, + 1588, 653, 1586, + 1546, 768, 1554, + 1482, 887, 1506, + 1381, 1009, 1434, + 1196, 1134, 1315, + 689, 1260, 1084, + 0, 1388, 87, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1790, 0, 1739, + 1784, 59, 1733, + 1776, 190, 1726, + 1765, 321, 1716, + 1749, 452, 1703, + 1728, 583, 1685, + 1697, 715, 1659, + 1653, 847, 1622, + 1585, 979, 1567, + 1476, 1111, 1481, + 1272, 1243, 1334, + 622, 1375, 1007, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1913, 0, 1833, + 1908, 0, 1829, + 1902, 0, 1823, + 1893, 93, 1816, + 1882, 293, 1805, + 1866, 470, 1790, + 1843, 633, 1770, + 1811, 787, 1741, + 1765, 935, 1699, + 1694, 1078, 1637, + 1579, 1218, 1537, + 1357, 1357, 1357, + 514, 1493, 877, + 0, 1629, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2037, 0, 1935, + 2034, 0, 1932, + 2029, 0, 1927, + 2023, 0, 1921, + 2014, 0, 1913, + 2002, 254, 1901, + 1985, 493, 1885, + 1962, 692, 1863, + 1930, 868, 1832, + 1882, 1030, 1786, + 1809, 1184, 1716, + 1688, 1331, 1603, + 1450, 1475, 1386, + 311, 1615, 612, + 0, 1753, 0, + 0, 1890, 0, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2163, 0, 2044, + 2161, 0, 2041, + 2157, 0, 2037, + 2153, 0, 2033, + 2147, 0, 2026, + 2137, 0, 2017, + 2125, 195, 2005, + 2109, 522, 1988, + 2085, 760, 1964, + 2051, 958, 1930, + 2002, 1133, 1881, + 1927, 1295, 1805, + 1802, 1449, 1678, + 1551, 1596, 1422, + 0, 1739, 0, + 0, 1880, 0, + 0, 2018, 0, + 0, 2155, 0, + 0, 2289, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2291, 0, 2157, + 2289, 0, 2155, + 2287, 0, 2153, + 2283, 0, 2149, + 2279, 0, 2143, + 2271, 0, 2137, + 2263, 0, 2127, + 2251, 102, 2115, + 2233, 559, 2097, + 2209, 838, 2071, + 2175, 1055, 2035, + 2125, 1242, 1983, + 2049, 1412, 1901, + 1920, 1570, 1762, + 1658, 1720, 1466, + 0, 1866, 0, + 0, 2007, 0, + 0, 2147, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2421, 0, 2275, + 2419, 0, 2273, + 2417, 0, 2271, + 2415, 0, 2269, + 2411, 0, 2265, + 2405, 0, 2259, + 2399, 0, 2251, + 2389, 0, 2241, + 2377, 0, 2229, + 2359, 603, 2209, + 2335, 925, 2183, + 2301, 1160, 2147, + 2251, 1356, 2091, + 2173, 1531, 2004, + 2041, 1693, 1855, + 1771, 1846, 1520, + 0, 1993, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2551, 0, 2395, + 2549, 0, 2395, + 2547, 0, 2393, + 2545, 0, 2391, + 2543, 0, 2387, + 2539, 0, 2383, + 2533, 0, 2379, + 2527, 0, 2371, + 2517, 0, 2361, + 2505, 0, 2347, + 2487, 657, 2327, + 2463, 1020, 2301, + 2429, 1270, 2261, + 2377, 1475, 2205, + 2299, 1654, 2113, + 2165, 1818, 1955, + 1888, 1973, 1583, + 0, 2121, 0, + 0, 2265, 0, + 0, 2407, 0, + 0, 2545, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2681, 0, 2519, + 2679, 0, 2519, + 2679, 0, 2517, + 2677, 0, 2515, + 2675, 0, 2513, + 2673, 0, 2511, + 2669, 0, 2505, + 2663, 0, 2501, + 2657, 0, 2493, + 2647, 0, 2483, + 2635, 0, 2469, + 2617, 720, 2449, + 2593, 1122, 2421, + 2557, 1386, 2381, + 2505, 1596, 2321, + 2425, 1779, 2229, + 2291, 1946, 2061, + 2008, 2101, 1655, + 0, 2251, 0, + 0, 2397, 0, + 0, 2537, 0, + 0, 2677, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3219, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2811, 0, 2645, + 2811, 0, 2645, + 2809, 0, 2643, + 2809, 0, 2641, + 2807, 0, 2641, + 2805, 0, 2637, + 2803, 0, 2635, + 2799, 0, 2631, + 2793, 0, 2625, + 2787, 0, 2617, + 2777, 0, 2607, + 2765, 0, 2593, + 2747, 792, 2573, + 2721, 1230, 2545, + 2687, 1505, 2503, + 2635, 1720, 2443, + 2555, 1906, 2347, + 2417, 2073, 2173, + 2131, 2231, 1736, + 0, 2381, 0, + 0, 2527, 0, + 0, 2669, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3351, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2943, 0, 2773, + 2941, 0, 2771, + 2941, 0, 2771, + 2941, 0, 2769, + 2939, 0, 2769, + 2937, 0, 2767, + 2935, 0, 2765, + 2933, 0, 2761, + 2929, 0, 2757, + 2923, 0, 2751, + 2917, 0, 2743, + 2907, 0, 2733, + 2895, 0, 2719, + 2877, 874, 2699, + 2853, 1344, 2669, + 2817, 1627, 2629, + 2765, 1846, 2567, + 2683, 2034, 2469, + 2547, 2203, 2291, + 2257, 2361, 1827, + 0, 2513, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3073, 0, 2901, + 3073, 0, 2901, + 3073, 0, 2899, + 3073, 0, 2899, + 3071, 0, 2897, + 3071, 0, 2897, + 3069, 0, 2895, + 3067, 0, 2893, + 3063, 0, 2889, + 3059, 0, 2885, + 3055, 0, 2879, + 3047, 0, 2871, + 3039, 0, 2861, + 3025, 0, 2847, + 3007, 964, 2825, + 2983, 1462, 2797, + 2947, 1751, 2755, + 2895, 1973, 2693, + 2813, 2163, 2593, + 2675, 2333, 2411, + 2383, 2493, 1925, + 0, 2643, 0, + 0, 2789, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3029, + 3205, 0, 3029, + 3205, 0, 3029, + 3205, 0, 3029, + 3203, 0, 3027, + 3203, 0, 3027, + 3201, 0, 3025, + 3199, 0, 3023, + 3197, 0, 3021, + 3195, 0, 3019, + 3191, 0, 3013, + 3187, 0, 3009, + 3179, 0, 3001, + 3169, 0, 2989, + 3157, 0, 2975, + 3139, 1062, 2955, + 3115, 1583, 2925, + 3079, 1877, 2883, + 3025, 2101, 2819, + 2945, 2293, 2719, + 2805, 2463, 2533, + 2513, 2623, 2030, + 0, 2775, 0, + 0, 2921, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3747, 0, + 0, 3879, 0, + 0, 4013, 0, + 3337, 0, 3159, + 3337, 0, 3159, + 3337, 0, 3159, + 3335, 0, 3159, + 3335, 0, 3159, + 3335, 0, 3157, + 3335, 0, 3157, + 3333, 0, 3155, + 3331, 0, 3153, + 3329, 0, 3151, + 3327, 0, 3149, + 3323, 0, 3143, + 3317, 0, 3137, + 3311, 0, 3129, + 3301, 0, 3119, + 3289, 0, 3105, + 3271, 1167, 3083, + 3245, 1707, 3055, + 3209, 2005, 3011, + 3157, 2231, 2947, + 3075, 2423, 2845, + 2937, 2595, 2659, + 2641, 2755, 2141, + 0, 2907, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4011, 0, + 3469, 0, 3291, + 3469, 0, 3291, + 3469, 0, 3291, + 3469, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3465, 0, 3287, + 3465, 0, 3285, + 3463, 0, 3283, + 3461, 0, 3281, + 3459, 0, 3279, + 3455, 0, 3275, + 3449, 0, 3269, + 3443, 0, 3261, + 3433, 0, 3249, + 3419, 0, 3235, + 3403, 1278, 3213, + 3377, 1832, 3183, + 3341, 2133, 3141, + 3289, 2361, 3077, + 3207, 2553, 2975, + 3067, 2725, 2785, + 2771, 2885, 2255, + 0, 3037, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3421, + 3601, 0, 3421, + 3601, 0, 3421, + 3601, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3419, + 3599, 0, 3419, + 3597, 0, 3417, + 3597, 0, 3417, + 3595, 0, 3415, + 3593, 0, 3413, + 3589, 0, 3409, + 3587, 0, 3405, + 3581, 0, 3399, + 3573, 0, 3391, + 3565, 0, 3379, + 3551, 0, 3365, + 3533, 1393, 3345, + 3509, 1959, 3315, + 3473, 2263, 3271, + 3419, 2491, 3207, + 3339, 2685, 3103, + 3199, 2857, 2913, + 2901, 3017, 2375, + 0, 3169, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3721, 0, 3541, + 3717, 0, 3535, + 3713, 0, 3531, + 3705, 0, 3521, + 3697, 0, 3511, + 3683, 0, 3495, + 3665, 1513, 3475, + 3641, 2087, 3445, + 3605, 2393, 3403, + 3551, 2623, 3337, + 3469, 2817, 3233, + 3331, 2989, 3043, + 3033, 3149, 2497, + 0, 3301, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3853, 0, 3671, + 3849, 0, 3667, + 3845, 0, 3661, + 3837, 0, 3653, + 3829, 0, 3643, + 3815, 0, 3627, + 3797, 1635, 3607, + 3773, 2217, 3577, + 3737, 2525, 3533, + 3683, 2755, 3469, + 3601, 2947, 3365, + 3461, 3121, 3173, + 3163, 3281, 2621, + 0, 3433, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3989, 0, 3807, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3773, + 3947, 0, 3759, + 3929, 1759, 3737, + 3905, 2347, 3707, + 3869, 2655, 3665, + 3815, 2885, 3599, + 3733, 3079, 3495, + 3593, 3253, 3303, + 3295, 3413, 2749, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3905, + 4079, 0, 3891, + 4061, 1886, 3869, + 4037, 2477, 3839, + 4001, 2787, 3797, + 3947, 3017, 3731, + 3865, 3211, 3627, + 3725, 3385, 3435, + 3427, 3545, 2877, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4037, + 4095, 0, 4023, + 4095, 2014, 4001, + 4095, 2609, 3971, + 4095, 2919, 3929, + 4079, 3149, 3863, + 3997, 3343, 3759, + 3857, 3517, 3565, + 3559, 3677, 3005, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2143, 4095, + 4095, 2741, 4095, + 4095, 3051, 4059, + 4095, 3281, 3995, + 4095, 3475, 3891, + 3989, 3649, 3697, + 3691, 3809, 3135, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2273, 4095, + 4095, 2871, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3829, + 3823, 3941, 3265, + 1004, 617, 1393, + 969, 649, 1381, + 916, 689, 1366, + 836, 737, 1344, + 699, 794, 1313, + 412, 861, 1269, + 0, 937, 1201, + 0, 1022, 1091, + 0, 1116, 884, + 0, 1217, 213, + 0, 1324, 0, + 0, 1437, 0, + 0, 1554, 0, + 0, 1675, 0, + 0, 1798, 0, + 0, 1923, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1045, 612, 1405, + 1013, 645, 1394, + 966, 685, 1379, + 895, 733, 1358, + 777, 791, 1328, + 549, 858, 1284, + 0, 935, 1219, + 0, 1020, 1114, + 0, 1114, 920, + 0, 1216, 354, + 0, 1323, 0, + 0, 1436, 0, + 0, 1554, 0, + 0, 1674, 0, + 0, 1798, 0, + 0, 1923, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1095, 605, 1421, + 1066, 638, 1410, + 1025, 679, 1395, + 963, 728, 1375, + 864, 786, 1346, + 684, 854, 1305, + 209, 931, 1243, + 0, 1018, 1144, + 0, 1112, 965, + 0, 1214, 493, + 0, 1322, 0, + 0, 1435, 0, + 0, 1553, 0, + 0, 1674, 0, + 0, 1797, 0, + 0, 1923, 0, + 0, 2049, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1154, 596, 1441, + 1129, 629, 1431, + 1093, 671, 1417, + 1040, 721, 1397, + 958, 780, 1370, + 818, 848, 1331, + 519, 927, 1272, + 0, 1014, 1180, + 0, 1109, 1018, + 0, 1211, 630, + 0, 1320, 0, + 0, 1434, 0, + 0, 1552, 0, + 0, 1673, 0, + 0, 1796, 0, + 0, 1922, 0, + 0, 2049, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1223, 583, 1467, + 1202, 617, 1457, + 1171, 660, 1444, + 1127, 711, 1426, + 1060, 771, 1400, + 952, 841, 1363, + 750, 920, 1309, + 121, 1009, 1225, + 0, 1105, 1081, + 0, 1208, 765, + 0, 1317, 0, + 0, 1432, 0, + 0, 1550, 0, + 0, 1671, 0, + 0, 1796, 0, + 0, 1922, 0, + 0, 2049, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1301, 565, 1499, + 1283, 601, 1490, + 1258, 645, 1478, + 1222, 697, 1461, + 1168, 759, 1437, + 1085, 831, 1404, + 944, 912, 1354, + 639, 1002, 1279, + 0, 1099, 1153, + 0, 1204, 900, + 0, 1314, 0, + 0, 1429, 0, + 0, 1548, 0, + 0, 1670, 0, + 0, 1794, 0, + 0, 1921, 0, + 0, 2049, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1389, 540, 1539, + 1374, 578, 1531, + 1353, 624, 1520, + 1324, 679, 1504, + 1282, 743, 1483, + 1219, 817, 1452, + 1117, 900, 1408, + 933, 992, 1342, + 429, 1091, 1234, + 0, 1197, 1034, + 0, 1309, 419, + 0, 1425, 0, + 0, 1545, 0, + 0, 1668, 0, + 0, 1793, 0, + 0, 1919, 0, + 0, 2047, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1484, 504, 1587, + 1472, 545, 1580, + 1456, 594, 1570, + 1432, 652, 1556, + 1400, 721, 1537, + 1351, 798, 1510, + 1278, 885, 1472, + 1157, 979, 1415, + 917, 1081, 1325, + 0, 1189, 1167, + 0, 1303, 802, + 0, 1420, 0, + 0, 1541, 0, + 0, 1665, 0, + 0, 1790, 0, + 0, 1918, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1587, 451, 1645, + 1577, 497, 1639, + 1564, 551, 1630, + 1546, 615, 1618, + 1520, 688, 1601, + 1484, 771, 1578, + 1430, 862, 1545, + 1347, 961, 1497, + 1204, 1067, 1423, + 896, 1178, 1301, + 0, 1294, 1059, + 0, 1414, 0, + 0, 1536, 0, + 0, 1661, 0, + 0, 1788, 0, + 0, 1915, 0, + 0, 2044, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1695, 369, 1712, + 1688, 423, 1707, + 1678, 486, 1699, + 1664, 559, 1689, + 1644, 641, 1675, + 1617, 732, 1655, + 1577, 831, 1627, + 1518, 936, 1587, + 1425, 1047, 1528, + 1261, 1163, 1434, + 865, 1282, 1266, + 0, 1404, 856, + 0, 1529, 0, + 0, 1656, 0, + 0, 1784, 0, + 0, 1912, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1809, 230, 1789, + 1803, 301, 1784, + 1795, 382, 1778, + 1785, 472, 1769, + 1770, 570, 1757, + 1749, 675, 1741, + 1720, 785, 1718, + 1678, 900, 1686, + 1614, 1019, 1638, + 1513, 1141, 1566, + 1328, 1266, 1448, + 821, 1392, 1216, + 0, 1520, 219, + 0, 1649, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1927, 0, 1875, + 1923, 61, 1871, + 1917, 191, 1865, + 1908, 322, 1858, + 1897, 453, 1849, + 1881, 584, 1835, + 1860, 716, 1817, + 1829, 847, 1791, + 1785, 979, 1754, + 1717, 1111, 1699, + 1608, 1243, 1613, + 1404, 1375, 1466, + 754, 1507, 1139, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2049, 0, 1969, + 2045, 0, 1966, + 2040, 0, 1961, + 2034, 0, 1955, + 2025, 225, 1948, + 2014, 425, 1937, + 1998, 602, 1922, + 1975, 765, 1902, + 1943, 919, 1873, + 1897, 1067, 1831, + 1827, 1210, 1769, + 1711, 1351, 1669, + 1489, 1489, 1489, + 646, 1625, 1009, + 0, 1761, 0, + 0, 1896, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2173, 0, 2071, + 2169, 0, 2067, + 2165, 0, 2065, + 2161, 0, 2059, + 2155, 0, 2053, + 2145, 53, 2045, + 2135, 386, 2033, + 2117, 625, 2017, + 2095, 824, 1995, + 2061, 1000, 1964, + 2014, 1162, 1918, + 1941, 1316, 1848, + 1820, 1464, 1735, + 1582, 1607, 1518, + 443, 1747, 744, + 0, 1885, 0, + 0, 2022, 0, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2297, 0, 2177, + 2295, 0, 2175, + 2293, 0, 2173, + 2289, 0, 2169, + 2285, 0, 2165, + 2279, 0, 2159, + 2269, 0, 2149, + 2257, 327, 2137, + 2241, 655, 2119, + 2217, 892, 2097, + 2183, 1090, 2063, + 2135, 1265, 2013, + 2059, 1428, 1937, + 1934, 1581, 1810, + 1683, 1728, 1554, + 0, 1871, 0, + 0, 2012, 0, + 0, 2149, 0, + 0, 2287, 0, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2425, 0, 2291, + 2423, 0, 2289, + 2421, 0, 2287, + 2419, 0, 2285, + 2415, 0, 2281, + 2411, 0, 2275, + 2403, 0, 2269, + 2395, 0, 2259, + 2383, 234, 2247, + 2365, 691, 2229, + 2341, 970, 2203, + 2307, 1188, 2167, + 2257, 1374, 2115, + 2181, 1544, 2033, + 2051, 1702, 1894, + 1790, 1852, 1599, + 0, 1998, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2553, 0, 2409, + 2553, 0, 2407, + 2551, 0, 2405, + 2549, 0, 2403, + 2547, 0, 2401, + 2543, 0, 2397, + 2537, 0, 2391, + 2531, 0, 2383, + 2521, 0, 2375, + 2509, 69, 2361, + 2491, 735, 2343, + 2467, 1057, 2315, + 2433, 1292, 2279, + 2383, 1489, 2223, + 2305, 1663, 2137, + 2173, 1825, 1987, + 1903, 1978, 1652, + 0, 2125, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2683, 0, 2529, + 2683, 0, 2527, + 2681, 0, 2527, + 2679, 0, 2525, + 2677, 0, 2523, + 2675, 0, 2519, + 2671, 0, 2515, + 2667, 0, 2511, + 2659, 0, 2503, + 2651, 0, 2493, + 2637, 0, 2479, + 2619, 789, 2459, + 2595, 1152, 2433, + 2561, 1403, 2395, + 2509, 1607, 2337, + 2431, 1786, 2245, + 2297, 1951, 2087, + 2020, 2105, 1715, + 0, 2253, 0, + 0, 2397, 0, + 0, 2539, 0, + 0, 2677, 0, + 0, 2815, 0, + 0, 2949, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2813, 0, 2653, + 2813, 0, 2651, + 2811, 0, 2651, + 2811, 0, 2649, + 2809, 0, 2647, + 2807, 0, 2645, + 2805, 0, 2643, + 2801, 0, 2639, + 2795, 0, 2633, + 2789, 0, 2625, + 2779, 0, 2615, + 2767, 0, 2601, + 2749, 852, 2581, + 2725, 1254, 2553, + 2689, 1518, 2513, + 2637, 1728, 2455, + 2557, 1911, 2361, + 2423, 2077, 2193, + 2141, 2235, 1787, + 0, 2383, 0, + 0, 2529, 0, + 0, 2669, 0, + 0, 2809, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2943, 0, 2777, + 2943, 0, 2777, + 2943, 0, 2777, + 2941, 0, 2775, + 2941, 0, 2775, + 2939, 0, 2773, + 2937, 0, 2771, + 2935, 0, 2767, + 2931, 0, 2763, + 2925, 0, 2757, + 2919, 0, 2749, + 2909, 0, 2739, + 2897, 0, 2725, + 2879, 924, 2705, + 2855, 1363, 2677, + 2819, 1637, 2635, + 2767, 1852, 2575, + 2687, 2038, 2479, + 2549, 2207, 2305, + 2263, 2363, 1869, + 0, 2513, 0, + 0, 2659, 0, + 0, 2801, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3483, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3075, 0, 2905, + 3075, 0, 2905, + 3073, 0, 2903, + 3073, 0, 2903, + 3073, 0, 2903, + 3071, 0, 2901, + 3069, 0, 2899, + 3067, 0, 2897, + 3065, 0, 2893, + 3061, 0, 2889, + 3055, 0, 2883, + 3049, 0, 2875, + 3039, 0, 2865, + 3027, 0, 2851, + 3009, 1006, 2831, + 2985, 1476, 2801, + 2949, 1759, 2761, + 2897, 1978, 2699, + 2815, 2165, 2601, + 2679, 2335, 2423, + 2389, 2493, 1959, + 0, 2645, 0, + 0, 2791, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3615, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3033, + 3205, 0, 3033, + 3205, 0, 3033, + 3205, 0, 3031, + 3205, 0, 3031, + 3203, 0, 3031, + 3203, 0, 3029, + 3201, 0, 3027, + 3199, 0, 3025, + 3195, 0, 3021, + 3193, 0, 3017, + 3187, 0, 3011, + 3181, 0, 3003, + 3171, 0, 2993, + 3157, 0, 2979, + 3141, 1096, 2957, + 3115, 1594, 2929, + 3079, 1883, 2887, + 3027, 2105, 2825, + 2945, 2295, 2725, + 2807, 2465, 2543, + 2515, 2625, 2057, + 0, 2775, 0, + 0, 2921, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3747, 0, + 0, 3879, 0, + 0, 4013, 0, + 3337, 0, 3163, + 3337, 0, 3163, + 3337, 0, 3161, + 3337, 0, 3161, + 3337, 0, 3161, + 3335, 0, 3161, + 3335, 0, 3159, + 3333, 0, 3157, + 3331, 0, 3155, + 3329, 0, 3153, + 3327, 0, 3151, + 3323, 0, 3147, + 3319, 0, 3141, + 3311, 0, 3133, + 3301, 0, 3121, + 3289, 0, 3107, + 3271, 1194, 3087, + 3247, 1715, 3057, + 3211, 2010, 3015, + 3157, 2233, 2951, + 3077, 2425, 2851, + 2937, 2595, 2665, + 2645, 2755, 2161, + 0, 2907, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4011, 0, + 3469, 0, 3293, + 3469, 0, 3293, + 3469, 0, 3291, + 3469, 0, 3291, + 3469, 0, 3291, + 3467, 0, 3291, + 3467, 0, 3289, + 3467, 0, 3289, + 3465, 0, 3287, + 3463, 0, 3285, + 3461, 0, 3283, + 3459, 0, 3281, + 3455, 0, 3275, + 3449, 0, 3269, + 3443, 0, 3263, + 3433, 0, 3251, + 3421, 0, 3237, + 3403, 1299, 3215, + 3377, 1839, 3187, + 3341, 2137, 3143, + 3289, 2363, 3079, + 3207, 2555, 2977, + 3069, 2727, 2791, + 2773, 2887, 2273, + 0, 3039, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3421, + 3597, 0, 3419, + 3597, 0, 3417, + 3595, 0, 3417, + 3593, 0, 3413, + 3591, 0, 3411, + 3587, 0, 3407, + 3581, 0, 3401, + 3575, 0, 3393, + 3565, 0, 3381, + 3553, 0, 3367, + 3535, 1410, 3345, + 3509, 1964, 3317, + 3473, 2267, 3273, + 3421, 2493, 3209, + 3339, 2685, 3107, + 3199, 2857, 2917, + 2903, 3019, 2389, + 0, 3169, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3551, + 3731, 0, 3551, + 3729, 0, 3551, + 3729, 0, 3549, + 3727, 0, 3547, + 3725, 0, 3545, + 3721, 0, 3541, + 3719, 0, 3537, + 3713, 0, 3531, + 3707, 0, 3523, + 3697, 0, 3513, + 3683, 0, 3497, + 3665, 1525, 3477, + 3641, 2091, 3447, + 3605, 2395, 3403, + 3553, 2625, 3339, + 3471, 2817, 3235, + 3331, 2989, 3045, + 3033, 3149, 2507, + 0, 3301, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3679, + 3857, 0, 3675, + 3853, 0, 3673, + 3851, 0, 3669, + 3845, 0, 3663, + 3837, 0, 3655, + 3829, 0, 3643, + 3815, 0, 3629, + 3797, 1645, 3607, + 3773, 2221, 3577, + 3737, 2527, 3535, + 3683, 2755, 3469, + 3601, 2949, 3367, + 3463, 3121, 3175, + 3165, 3281, 2629, + 0, 3433, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3989, 0, 3807, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3775, + 3947, 0, 3759, + 3929, 1767, 3739, + 3905, 2349, 3709, + 3869, 2657, 3665, + 3815, 2887, 3601, + 3733, 3079, 3497, + 3593, 3253, 3305, + 3295, 3413, 2755, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3907, + 4079, 0, 3891, + 4061, 1892, 3869, + 4037, 2479, 3841, + 4001, 2787, 3797, + 3947, 3017, 3733, + 3865, 3211, 3627, + 3725, 3385, 3435, + 3427, 3545, 2881, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4037, + 4095, 0, 4023, + 4095, 2018, 4001, + 4095, 2611, 3971, + 4095, 2919, 3929, + 4079, 3149, 3863, + 3997, 3343, 3759, + 3857, 3517, 3567, + 3559, 3677, 3009, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2145, 4095, + 4095, 2741, 4095, + 4095, 3051, 4061, + 4095, 3281, 3995, + 4095, 3475, 3891, + 3989, 3649, 3697, + 3691, 3809, 3137, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2275, 4095, + 4095, 2873, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4023, + 4095, 3781, 3829, + 3823, 3941, 3267, + 1129, 728, 1524, + 1102, 753, 1516, + 1064, 785, 1504, + 1008, 824, 1488, + 919, 872, 1466, + 763, 929, 1434, + 407, 995, 1388, + 0, 1071, 1319, + 0, 1156, 1205, + 0, 1249, 987, + 0, 1350, 201, + 0, 1457, 0, + 0, 1570, 0, + 0, 1687, 0, + 0, 1807, 0, + 0, 1930, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1161, 724, 1533, + 1136, 750, 1525, + 1100, 782, 1514, + 1048, 821, 1498, + 968, 869, 1476, + 832, 926, 1445, + 544, 993, 1401, + 0, 1069, 1333, + 0, 1154, 1223, + 0, 1248, 1016, + 0, 1349, 345, + 0, 1456, 0, + 0, 1569, 0, + 0, 1686, 0, + 0, 1807, 0, + 0, 1930, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1200, 719, 1545, + 1177, 745, 1537, + 1145, 777, 1526, + 1098, 817, 1511, + 1026, 865, 1490, + 909, 923, 1460, + 681, 990, 1417, + 0, 1066, 1351, + 0, 1152, 1246, + 0, 1246, 1052, + 0, 1348, 486, + 0, 1455, 0, + 0, 1568, 0, + 0, 1686, 0, + 0, 1806, 0, + 0, 1930, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1248, 711, 1561, + 1227, 738, 1553, + 1198, 770, 1542, + 1157, 811, 1528, + 1095, 860, 1507, + 996, 918, 1478, + 816, 986, 1437, + 341, 1063, 1375, + 0, 1149, 1276, + 0, 1244, 1097, + 0, 1346, 625, + 0, 1454, 0, + 0, 1567, 0, + 0, 1685, 0, + 0, 1806, 0, + 0, 1929, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1304, 701, 1581, + 1286, 728, 1573, + 1261, 762, 1563, + 1225, 803, 1549, + 1172, 853, 1530, + 1090, 912, 1502, + 951, 981, 1463, + 651, 1058, 1405, + 0, 1146, 1312, + 0, 1241, 1150, + 0, 1343, 762, + 0, 1452, 0, + 0, 1566, 0, + 0, 1684, 0, + 0, 1805, 0, + 0, 1929, 0, + 0, 2055, 0, + 0, 2181, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1371, 688, 1606, + 1355, 715, 1599, + 1334, 750, 1589, + 1303, 792, 1576, + 1259, 843, 1558, + 1192, 903, 1532, + 1084, 973, 1496, + 882, 1052, 1441, + 253, 1140, 1357, + 0, 1237, 1213, + 0, 1340, 897, + 0, 1449, 0, + 0, 1564, 0, + 0, 1682, 0, + 0, 1804, 0, + 0, 1928, 0, + 0, 2053, 0, + 0, 2181, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1447, 669, 1638, + 1434, 697, 1631, + 1416, 733, 1622, + 1390, 777, 1610, + 1354, 829, 1593, + 1301, 891, 1569, + 1218, 963, 1536, + 1076, 1044, 1486, + 771, 1134, 1411, + 0, 1231, 1285, + 0, 1336, 1032, + 0, 1446, 0, + 0, 1561, 0, + 0, 1680, 0, + 0, 1802, 0, + 0, 1926, 0, + 0, 2053, 0, + 0, 2181, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1532, 642, 1677, + 1521, 672, 1671, + 1506, 710, 1663, + 1485, 756, 1652, + 1456, 811, 1636, + 1414, 875, 1615, + 1351, 949, 1585, + 1249, 1032, 1541, + 1065, 1124, 1474, + 561, 1224, 1367, + 0, 1330, 1166, + 0, 1441, 551, + 0, 1557, 0, + 0, 1677, 0, + 0, 1800, 0, + 0, 1925, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1625, 603, 1725, + 1616, 636, 1720, + 1604, 677, 1712, + 1588, 726, 1702, + 1565, 785, 1688, + 1532, 853, 1669, + 1484, 930, 1643, + 1410, 1017, 1604, + 1289, 1111, 1547, + 1049, 1213, 1457, + 0, 1321, 1300, + 0, 1435, 934, + 0, 1552, 0, + 0, 1673, 0, + 0, 1797, 0, + 0, 1923, 0, + 0, 2049, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1726, 546, 1782, + 1719, 583, 1777, + 1709, 629, 1771, + 1696, 683, 1762, + 1678, 747, 1750, + 1653, 820, 1733, + 1616, 903, 1710, + 1563, 994, 1677, + 1479, 1093, 1629, + 1336, 1199, 1555, + 1028, 1310, 1433, + 0, 1426, 1191, + 0, 1546, 0, + 0, 1668, 0, + 0, 1793, 0, + 0, 1920, 0, + 0, 2047, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1833, 456, 1848, + 1827, 501, 1844, + 1820, 555, 1839, + 1810, 618, 1831, + 1796, 691, 1821, + 1776, 774, 1807, + 1749, 864, 1787, + 1709, 963, 1759, + 1650, 1068, 1719, + 1558, 1179, 1660, + 1393, 1295, 1566, + 997, 1414, 1398, + 0, 1537, 988, + 0, 1661, 0, + 0, 1788, 0, + 0, 1916, 0, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1946, 299, 1925, + 1941, 362, 1921, + 1935, 433, 1916, + 1928, 514, 1910, + 1917, 604, 1901, + 1902, 702, 1889, + 1881, 807, 1873, + 1852, 917, 1850, + 1810, 1032, 1818, + 1746, 1151, 1771, + 1645, 1273, 1698, + 1460, 1398, 1580, + 953, 1524, 1348, + 0, 1652, 351, + 0, 1781, 0, + 0, 1910, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2063, 0, 2010, + 2059, 63, 2007, + 2055, 193, 2003, + 2049, 323, 1998, + 2040, 454, 1990, + 2029, 585, 1981, + 2014, 716, 1967, + 1992, 848, 1949, + 1961, 979, 1923, + 1917, 1111, 1886, + 1850, 1243, 1831, + 1740, 1375, 1745, + 1536, 1507, 1598, + 886, 1639, 1271, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2183, 0, 2103, + 2181, 0, 2101, + 2177, 0, 2097, + 2173, 0, 2093, + 2167, 115, 2087, + 2157, 358, 2079, + 2145, 557, 2069, + 2129, 734, 2055, + 2107, 897, 2034, + 2075, 1051, 2005, + 2029, 1199, 1964, + 1959, 1342, 1901, + 1843, 1483, 1801, + 1621, 1621, 1621, + 778, 1758, 1141, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2307, 0, 2205, + 2305, 0, 2203, + 2301, 0, 2199, + 2299, 0, 2197, + 2293, 0, 2191, + 2287, 0, 2185, + 2279, 185, 2177, + 2267, 518, 2165, + 2249, 757, 2149, + 2227, 956, 2127, + 2193, 1132, 2095, + 2145, 1295, 2051, + 2073, 1448, 1981, + 1952, 1596, 1867, + 1714, 1739, 1650, + 575, 1879, 876, + 0, 2018, 0, + 0, 2155, 0, + 0, 2289, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2431, 0, 2311, + 2429, 0, 2309, + 2427, 0, 2307, + 2425, 0, 2305, + 2421, 0, 2301, + 2417, 0, 2297, + 2411, 0, 2291, + 2401, 0, 2281, + 2389, 459, 2269, + 2373, 787, 2251, + 2349, 1024, 2229, + 2315, 1222, 2195, + 2267, 1398, 2145, + 2191, 1560, 2069, + 2065, 1713, 1942, + 1815, 1860, 1686, + 0, 2004, 0, + 0, 2143, 0, + 0, 2281, 0, + 0, 2419, 0, + 0, 2553, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2559, 0, 2425, + 2557, 0, 2423, + 2555, 0, 2421, + 2553, 0, 2419, + 2551, 0, 2417, + 2547, 0, 2413, + 2543, 0, 2407, + 2535, 0, 2401, + 2527, 0, 2391, + 2515, 366, 2379, + 2497, 823, 2361, + 2473, 1102, 2335, + 2439, 1320, 2299, + 2389, 1507, 2247, + 2313, 1676, 2165, + 2183, 1834, 2026, + 1923, 1984, 1731, + 0, 2129, 0, + 0, 2271, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2687, 0, 2541, + 2685, 0, 2541, + 2685, 0, 2539, + 2683, 0, 2537, + 2681, 0, 2535, + 2679, 0, 2533, + 2675, 0, 2529, + 2669, 0, 2523, + 2663, 0, 2515, + 2653, 0, 2507, + 2641, 201, 2493, + 2625, 868, 2475, + 2599, 1189, 2449, + 2565, 1424, 2411, + 2515, 1621, 2355, + 2437, 1796, 2269, + 2305, 1957, 2119, + 2035, 2111, 1784, + 0, 2257, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2815, 0, 2661, + 2815, 0, 2661, + 2815, 0, 2659, + 2813, 0, 2659, + 2811, 0, 2657, + 2809, 0, 2655, + 2807, 0, 2651, + 2803, 0, 2647, + 2799, 0, 2643, + 2791, 0, 2635, + 2783, 0, 2625, + 2769, 0, 2611, + 2753, 921, 2591, + 2727, 1284, 2565, + 2693, 1535, 2527, + 2641, 1739, 2469, + 2563, 1918, 2379, + 2429, 2083, 2219, + 2153, 2237, 1847, + 0, 2387, 0, + 0, 2531, 0, + 0, 2671, 0, + 0, 2809, 0, + 0, 2947, 0, + 0, 3081, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2945, 0, 2785, + 2945, 0, 2785, + 2945, 0, 2783, + 2943, 0, 2783, + 2943, 0, 2781, + 2941, 0, 2779, + 2939, 0, 2777, + 2937, 0, 2775, + 2933, 0, 2771, + 2927, 0, 2765, + 2921, 0, 2757, + 2911, 0, 2747, + 2899, 0, 2733, + 2881, 984, 2713, + 2857, 1386, 2685, + 2821, 1650, 2645, + 2769, 1860, 2587, + 2689, 2043, 2493, + 2555, 2209, 2325, + 2273, 2367, 1919, + 0, 2515, 0, + 0, 2661, 0, + 0, 2801, 0, + 0, 2941, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3077, 0, 2911, + 3075, 0, 2909, + 3075, 0, 2909, + 3075, 0, 2909, + 3073, 0, 2907, + 3073, 0, 2907, + 3071, 0, 2905, + 3069, 0, 2903, + 3067, 0, 2899, + 3063, 0, 2895, + 3057, 0, 2889, + 3051, 0, 2881, + 3041, 0, 2871, + 3029, 0, 2857, + 3011, 1056, 2837, + 2987, 1495, 2809, + 2951, 1769, 2767, + 2899, 1984, 2707, + 2819, 2169, 2611, + 2683, 2339, 2439, + 2395, 2495, 2001, + 0, 2645, 0, + 0, 2791, 0, + 0, 2933, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3207, 0, 3037, + 3207, 0, 3037, + 3207, 0, 3037, + 3207, 0, 3035, + 3205, 0, 3035, + 3205, 0, 3035, + 3203, 0, 3033, + 3201, 0, 3031, + 3199, 0, 3029, + 3197, 0, 3025, + 3193, 0, 3021, + 3189, 0, 3015, + 3181, 0, 3007, + 3171, 0, 2997, + 3159, 0, 2983, + 3141, 1138, 2963, + 3117, 1608, 2933, + 3081, 1891, 2893, + 3029, 2111, 2831, + 2947, 2297, 2733, + 2811, 2467, 2555, + 2521, 2625, 2091, + 0, 2777, 0, + 0, 2923, 0, + 0, 3065, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3747, 0, + 0, 3879, 0, + 0, 4013, 0, + 3339, 0, 3165, + 3339, 0, 3165, + 3337, 0, 3165, + 3337, 0, 3165, + 3337, 0, 3163, + 3337, 0, 3163, + 3335, 0, 3163, + 3335, 0, 3161, + 3333, 0, 3159, + 3331, 0, 3157, + 3327, 0, 3153, + 3325, 0, 3149, + 3319, 0, 3143, + 3313, 0, 3135, + 3303, 0, 3125, + 3289, 0, 3111, + 3273, 1228, 3089, + 3247, 1726, 3061, + 3211, 2015, 3019, + 3159, 2237, 2957, + 3077, 2427, 2857, + 2941, 2597, 2675, + 2649, 2757, 2189, + 0, 2907, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4013, 0, + 3469, 0, 3295, + 3469, 0, 3295, + 3469, 0, 3295, + 3469, 0, 3293, + 3469, 0, 3293, + 3469, 0, 3293, + 3467, 0, 3293, + 3467, 0, 3291, + 3465, 0, 3289, + 3465, 0, 3289, + 3461, 0, 3285, + 3459, 0, 3283, + 3455, 0, 3279, + 3451, 0, 3273, + 3443, 0, 3265, + 3435, 0, 3253, + 3421, 0, 3239, + 3403, 1326, 3219, + 3379, 1847, 3189, + 3343, 2141, 3147, + 3291, 2365, 3083, + 3209, 2557, 2983, + 3071, 2727, 2797, + 2777, 2887, 2295, + 0, 3039, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3425, + 3601, 0, 3425, + 3601, 0, 3425, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3423, + 3599, 0, 3423, + 3599, 0, 3421, + 3599, 0, 3421, + 3597, 0, 3419, + 3595, 0, 3417, + 3593, 0, 3415, + 3591, 0, 3413, + 3587, 0, 3407, + 3581, 0, 3403, + 3575, 0, 3395, + 3565, 0, 3383, + 3553, 0, 3369, + 3535, 1431, 3347, + 3509, 1971, 3319, + 3473, 2269, 3275, + 3421, 2495, 3213, + 3339, 2687, 3109, + 3201, 2859, 2923, + 2905, 3019, 2405, + 0, 3171, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3731, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3553, + 3729, 0, 3551, + 3729, 0, 3551, + 3727, 0, 3549, + 3725, 0, 3545, + 3723, 0, 3543, + 3719, 0, 3539, + 3713, 0, 3533, + 3707, 0, 3525, + 3697, 0, 3513, + 3685, 0, 3499, + 3667, 1542, 3477, + 3641, 2097, 3449, + 3605, 2399, 3405, + 3553, 2625, 3341, + 3471, 2817, 3239, + 3331, 2991, 3049, + 3035, 3151, 2521, + 0, 3303, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3863, 0, 3685, + 3863, 0, 3683, + 3863, 0, 3683, + 3861, 0, 3683, + 3861, 0, 3681, + 3859, 0, 3679, + 3857, 0, 3677, + 3855, 0, 3673, + 3851, 0, 3669, + 3845, 0, 3663, + 3839, 0, 3655, + 3829, 0, 3645, + 3815, 0, 3629, + 3797, 1658, 3609, + 3773, 2223, 3579, + 3737, 2527, 3535, + 3685, 2757, 3471, + 3603, 2949, 3369, + 3463, 3121, 3177, + 3165, 3281, 2639, + 0, 3433, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3811, + 3989, 0, 3807, + 3985, 0, 3805, + 3983, 0, 3801, + 3977, 0, 3795, + 3971, 0, 3787, + 3961, 0, 3775, + 3947, 0, 3761, + 3929, 1777, 3739, + 3905, 2353, 3709, + 3869, 2659, 3667, + 3815, 2887, 3603, + 3733, 3081, 3499, + 3595, 3253, 3307, + 3297, 3413, 2761, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3907, + 4079, 0, 3891, + 4061, 1899, 3871, + 4037, 2481, 3841, + 4001, 2789, 3797, + 3947, 3019, 3733, + 3865, 3211, 3629, + 3727, 3385, 3437, + 3429, 3545, 2887, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4039, + 4095, 0, 4023, + 4095, 2024, 4001, + 4095, 2611, 3973, + 4095, 2919, 3929, + 4079, 3149, 3865, + 3997, 3343, 3759, + 3857, 3517, 3567, + 3559, 3677, 3013, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2151, 4095, + 4095, 2743, 4095, + 4095, 3051, 4061, + 4095, 3281, 3995, + 4095, 3475, 3891, + 3989, 3649, 3699, + 3691, 3809, 3141, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2277, 4095, + 4095, 2873, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4023, + 4095, 3781, 3829, + 3823, 3941, 3269, + 1256, 844, 1656, + 1236, 863, 1649, + 1208, 888, 1641, + 1167, 920, 1629, + 1106, 959, 1613, + 1010, 1006, 1590, + 837, 1063, 1558, + 399, 1129, 1511, + 0, 1204, 1440, + 0, 1289, 1323, + 0, 1382, 1096, + 0, 1483, 185, + 0, 1590, 0, + 0, 1702, 0, + 0, 1819, 0, + 0, 1940, 0, + 0, 2063, 0, + 0, 2189, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1280, 840, 1662, + 1261, 860, 1656, + 1234, 886, 1648, + 1196, 917, 1636, + 1139, 957, 1620, + 1050, 1004, 1598, + 896, 1061, 1566, + 539, 1127, 1520, + 0, 1203, 1451, + 0, 1288, 1337, + 0, 1381, 1119, + 0, 1482, 333, + 0, 1589, 0, + 0, 1702, 0, + 0, 1819, 0, + 0, 1939, 0, + 0, 2063, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1310, 836, 1671, + 1293, 856, 1665, + 1268, 882, 1657, + 1233, 914, 1646, + 1180, 953, 1630, + 1100, 1001, 1608, + 964, 1058, 1578, + 676, 1125, 1533, + 0, 1201, 1465, + 0, 1286, 1355, + 0, 1380, 1148, + 0, 1481, 478, + 0, 1589, 0, + 0, 1701, 0, + 0, 1818, 0, + 0, 1939, 0, + 0, 2063, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1348, 831, 1683, + 1332, 851, 1677, + 1309, 877, 1669, + 1277, 909, 1658, + 1230, 949, 1643, + 1159, 997, 1622, + 1041, 1055, 1592, + 813, 1122, 1549, + 0, 1199, 1483, + 0, 1284, 1378, + 0, 1378, 1184, + 0, 1480, 618, + 0, 1588, 0, + 0, 1701, 0, + 0, 1818, 0, + 0, 1938, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1394, 823, 1698, + 1380, 844, 1693, + 1359, 870, 1685, + 1331, 903, 1674, + 1289, 943, 1660, + 1227, 992, 1639, + 1128, 1050, 1611, + 948, 1118, 1569, + 474, 1195, 1507, + 0, 1282, 1408, + 0, 1376, 1229, + 0, 1478, 757, + 0, 1586, 0, + 0, 1699, 0, + 0, 1817, 0, + 0, 1938, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1449, 812, 1718, + 1437, 834, 1713, + 1419, 860, 1705, + 1393, 894, 1695, + 1358, 935, 1681, + 1305, 985, 1662, + 1222, 1044, 1634, + 1082, 1112, 1595, + 784, 1191, 1537, + 0, 1278, 1445, + 0, 1373, 1282, + 0, 1476, 894, + 0, 1584, 0, + 0, 1698, 0, + 0, 1816, 0, + 0, 1937, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2313, 0, + 0, 2443, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1514, 798, 1743, + 1503, 820, 1738, + 1487, 847, 1731, + 1466, 882, 1721, + 1435, 924, 1708, + 1391, 975, 1690, + 1324, 1035, 1664, + 1216, 1105, 1628, + 1014, 1184, 1574, + 385, 1273, 1489, + 0, 1369, 1345, + 0, 1472, 1029, + 0, 1582, 0, + 0, 1696, 0, + 0, 1814, 0, + 0, 1936, 0, + 0, 2059, 0, + 0, 2185, 0, + 0, 2313, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1588, 778, 1775, + 1579, 801, 1770, + 1566, 829, 1763, + 1548, 865, 1754, + 1522, 909, 1742, + 1486, 962, 1725, + 1433, 1023, 1702, + 1350, 1095, 1668, + 1208, 1176, 1619, + 903, 1266, 1543, + 0, 1363, 1417, + 0, 1468, 1164, + 0, 1578, 0, + 0, 1693, 0, + 0, 1812, 0, + 0, 1934, 0, + 0, 2059, 0, + 0, 2185, 0, + 0, 2313, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1672, 750, 1814, + 1664, 774, 1809, + 1653, 804, 1803, + 1638, 842, 1795, + 1617, 888, 1784, + 1588, 943, 1768, + 1546, 1007, 1747, + 1483, 1081, 1717, + 1382, 1164, 1673, + 1197, 1256, 1606, + 693, 1356, 1499, + 0, 1462, 1298, + 0, 1573, 683, + 0, 1689, 0, + 0, 1809, 0, + 0, 1932, 0, + 0, 2057, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1764, 709, 1861, + 1757, 735, 1857, + 1748, 768, 1852, + 1736, 809, 1844, + 1720, 858, 1834, + 1697, 917, 1821, + 1664, 985, 1801, + 1616, 1062, 1775, + 1542, 1149, 1736, + 1421, 1243, 1679, + 1181, 1345, 1589, + 0, 1454, 1432, + 0, 1567, 1066, + 0, 1685, 0, + 0, 1805, 0, + 0, 1929, 0, + 0, 2055, 0, + 0, 2181, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1863, 648, 1918, + 1858, 678, 1914, + 1851, 715, 1909, + 1841, 761, 1903, + 1828, 815, 1894, + 1810, 879, 1882, + 1785, 953, 1865, + 1748, 1035, 1842, + 1695, 1126, 1809, + 1611, 1225, 1761, + 1469, 1331, 1687, + 1160, 1442, 1565, + 0, 1558, 1323, + 0, 1678, 55, + 0, 1800, 0, + 0, 1925, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1969, 552, 1984, + 1965, 588, 1981, + 1960, 633, 1976, + 1952, 687, 1971, + 1942, 751, 1963, + 1928, 824, 1953, + 1908, 906, 1939, + 1881, 997, 1919, + 1841, 1095, 1891, + 1783, 1200, 1852, + 1690, 1311, 1792, + 1526, 1427, 1698, + 1129, 1546, 1531, + 0, 1669, 1120, + 0, 1793, 0, + 0, 1920, 0, + 0, 2047, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2081, 379, 2059, + 2077, 431, 2057, + 2073, 494, 2053, + 2067, 565, 2049, + 2059, 647, 2042, + 2049, 737, 2033, + 2034, 834, 2022, + 2013, 939, 2005, + 1984, 1049, 1982, + 1942, 1164, 1950, + 1879, 1283, 1903, + 1777, 1405, 1831, + 1592, 1530, 1712, + 1085, 1656, 1480, + 0, 1784, 483, + 0, 1913, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2197, 0, 2143, + 2195, 67, 2141, + 2191, 195, 2139, + 2187, 325, 2135, + 2181, 455, 2129, + 2173, 586, 2123, + 2161, 717, 2113, + 2145, 848, 2099, + 2125, 980, 2081, + 2093, 1111, 2055, + 2049, 1243, 2018, + 1982, 1375, 1963, + 1873, 1507, 1878, + 1668, 1639, 1730, + 1018, 1771, 1403, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2317, 0, 2237, + 2315, 0, 2235, + 2313, 0, 2233, + 2309, 0, 2229, + 2305, 0, 2225, + 2299, 247, 2219, + 2289, 490, 2211, + 2279, 689, 2201, + 2261, 866, 2187, + 2239, 1029, 2167, + 2207, 1183, 2137, + 2161, 1331, 2095, + 2091, 1474, 2033, + 1975, 1615, 1934, + 1753, 1753, 1753, + 910, 1890, 1273, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2439, 0, 2337, + 2439, 0, 2337, + 2437, 0, 2335, + 2433, 0, 2331, + 2431, 0, 2329, + 2425, 0, 2323, + 2419, 0, 2317, + 2411, 317, 2309, + 2399, 650, 2297, + 2381, 890, 2281, + 2359, 1088, 2259, + 2325, 1264, 2229, + 2279, 1427, 2183, + 2205, 1580, 2113, + 2085, 1728, 1999, + 1846, 1871, 1782, + 707, 2011, 1008, + 0, 2149, 0, + 0, 2287, 0, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2565, 0, 2445, + 2563, 0, 2443, + 2563, 0, 2443, + 2561, 0, 2441, + 2557, 0, 2437, + 2553, 0, 2433, + 2549, 0, 2429, + 2543, 0, 2423, + 2533, 0, 2413, + 2521, 591, 2401, + 2505, 919, 2385, + 2481, 1156, 2361, + 2447, 1354, 2327, + 2399, 1530, 2277, + 2323, 1692, 2201, + 2199, 1845, 2075, + 1947, 1993, 1818, + 74, 2135, 0, + 0, 2275, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2691, 0, 2557, + 2691, 0, 2557, + 2689, 0, 2555, + 2687, 0, 2553, + 2685, 0, 2551, + 2683, 0, 2549, + 2679, 0, 2545, + 2675, 0, 2539, + 2669, 0, 2533, + 2659, 0, 2523, + 2647, 498, 2511, + 2629, 955, 2493, + 2605, 1234, 2467, + 2571, 1452, 2431, + 2521, 1639, 2379, + 2445, 1808, 2297, + 2315, 1966, 2159, + 2055, 2117, 1863, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2819, 0, 2673, + 2819, 0, 2673, + 2817, 0, 2673, + 2817, 0, 2671, + 2815, 0, 2669, + 2813, 0, 2667, + 2811, 0, 2665, + 2807, 0, 2661, + 2801, 0, 2655, + 2795, 0, 2649, + 2787, 0, 2639, + 2773, 333, 2625, + 2757, 1000, 2607, + 2731, 1321, 2581, + 2697, 1556, 2543, + 2647, 1753, 2487, + 2569, 1928, 2401, + 2437, 2089, 2251, + 2167, 2243, 1916, + 0, 2389, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2949, 0, 2795, + 2947, 0, 2793, + 2947, 0, 2793, + 2947, 0, 2793, + 2945, 0, 2791, + 2943, 0, 2789, + 2941, 0, 2787, + 2939, 0, 2783, + 2935, 0, 2779, + 2931, 0, 2775, + 2923, 0, 2767, + 2915, 0, 2757, + 2901, 0, 2743, + 2885, 1053, 2725, + 2859, 1416, 2697, + 2825, 1667, 2659, + 2773, 1871, 2601, + 2695, 2051, 2511, + 2561, 2215, 2351, + 2285, 2369, 1979, + 0, 2519, 0, + 0, 2663, 0, + 0, 2803, 0, + 0, 2941, 0, + 0, 3079, 0, + 0, 3213, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3079, 0, 2917, + 3077, 0, 2917, + 3077, 0, 2917, + 3077, 0, 2915, + 3075, 0, 2915, + 3075, 0, 2913, + 3073, 0, 2911, + 3071, 0, 2909, + 3069, 0, 2907, + 3065, 0, 2903, + 3059, 0, 2897, + 3053, 0, 2889, + 3043, 0, 2879, + 3031, 0, 2865, + 3013, 1116, 2845, + 2989, 1518, 2817, + 2953, 1782, 2777, + 2901, 1992, 2719, + 2821, 2175, 2625, + 2687, 2341, 2459, + 2405, 2499, 2051, + 0, 2647, 0, + 0, 2793, 0, + 0, 2933, 0, + 0, 3073, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3209, 0, 3043, + 3209, 0, 3043, + 3209, 0, 3041, + 3207, 0, 3041, + 3207, 0, 3041, + 3207, 0, 3039, + 3205, 0, 3039, + 3203, 0, 3037, + 3201, 0, 3035, + 3199, 0, 3031, + 3195, 0, 3027, + 3189, 0, 3021, + 3183, 0, 3013, + 3173, 0, 3003, + 3161, 0, 2989, + 3143, 1188, 2969, + 3119, 1627, 2941, + 3083, 1901, 2901, + 3031, 2117, 2839, + 2951, 2301, 2743, + 2815, 2471, 2571, + 2527, 2627, 2133, + 0, 2777, 0, + 0, 2923, 0, + 0, 3065, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3339, 0, 3169, + 3339, 0, 3169, + 3339, 0, 3169, + 3339, 0, 3169, + 3339, 0, 3169, + 3337, 0, 3167, + 3337, 0, 3167, + 3335, 0, 3165, + 3333, 0, 3163, + 3331, 0, 3161, + 3329, 0, 3157, + 3325, 0, 3153, + 3321, 0, 3147, + 3313, 0, 3141, + 3305, 0, 3129, + 3291, 0, 3115, + 3273, 1270, 3095, + 3249, 1740, 3067, + 3213, 2023, 3025, + 3161, 2243, 2963, + 3079, 2429, 2865, + 2943, 2599, 2687, + 2653, 2757, 2223, + 0, 2909, 0, + 0, 3055, 0, + 0, 3197, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3471, 0, 3297, + 3471, 0, 3297, + 3471, 0, 3297, + 3469, 0, 3297, + 3469, 0, 3297, + 3469, 0, 3297, + 3469, 0, 3295, + 3467, 0, 3295, + 3467, 0, 3293, + 3465, 0, 3291, + 3463, 0, 3289, + 3461, 0, 3285, + 3457, 0, 3281, + 3451, 0, 3275, + 3445, 0, 3267, + 3435, 0, 3257, + 3423, 0, 3243, + 3405, 1360, 3221, + 3379, 1858, 3193, + 3343, 2147, 3151, + 3291, 2369, 3089, + 3211, 2559, 2989, + 3073, 2729, 2807, + 2781, 2889, 2321, + 0, 3039, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3425, + 3601, 0, 3425, + 3599, 0, 3425, + 3599, 0, 3423, + 3597, 0, 3423, + 3597, 0, 3421, + 3595, 0, 3417, + 3591, 0, 3415, + 3587, 0, 3411, + 3583, 0, 3405, + 3575, 0, 3397, + 3567, 0, 3385, + 3553, 0, 3371, + 3535, 1458, 3351, + 3511, 1979, 3321, + 3475, 2273, 3279, + 3423, 2499, 3215, + 3341, 2689, 3115, + 3203, 2861, 2929, + 2909, 3019, 2427, + 0, 3171, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3555, + 3733, 0, 3555, + 3731, 0, 3555, + 3731, 0, 3555, + 3731, 0, 3553, + 3729, 0, 3551, + 3727, 0, 3551, + 3725, 0, 3547, + 3723, 0, 3545, + 3719, 0, 3541, + 3713, 0, 3535, + 3707, 0, 3527, + 3697, 0, 3515, + 3685, 0, 3501, + 3667, 1564, 3479, + 3641, 2103, 3451, + 3607, 2401, 3409, + 3553, 2627, 3345, + 3471, 2819, 3243, + 3333, 2991, 3055, + 3037, 3151, 2537, + 0, 3303, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3685, + 3863, 0, 3685, + 3863, 0, 3685, + 3863, 0, 3683, + 3861, 0, 3683, + 3859, 0, 3681, + 3857, 0, 3677, + 3855, 0, 3675, + 3851, 0, 3671, + 3845, 0, 3665, + 3839, 0, 3657, + 3829, 0, 3645, + 3817, 0, 3631, + 3799, 1674, 3609, + 3773, 2229, 3581, + 3737, 2531, 3537, + 3685, 2757, 3473, + 3603, 2949, 3371, + 3463, 3123, 3181, + 3167, 3283, 2653, + 0, 3435, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3815, + 3993, 0, 3815, + 3993, 0, 3813, + 3991, 0, 3811, + 3989, 0, 3809, + 3987, 0, 3805, + 3983, 0, 3801, + 3977, 0, 3795, + 3971, 0, 3787, + 3961, 0, 3777, + 3949, 0, 3761, + 3931, 1790, 3741, + 3905, 2355, 3711, + 3869, 2661, 3669, + 3817, 2889, 3603, + 3735, 3081, 3501, + 3595, 3253, 3311, + 3299, 3413, 2771, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3927, + 4095, 0, 3919, + 4093, 0, 3907, + 4079, 0, 3893, + 4061, 1909, 3871, + 4037, 2485, 3841, + 4001, 2791, 3799, + 3949, 3019, 3735, + 3867, 3213, 3631, + 3727, 3385, 3439, + 3429, 3545, 2893, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4039, + 4095, 0, 4023, + 4095, 2031, 4003, + 4095, 2613, 3973, + 4095, 2921, 3929, + 4079, 3151, 3865, + 3997, 3343, 3761, + 3859, 3517, 3569, + 3561, 3677, 3019, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2155, 4095, + 4095, 2743, 4095, + 4095, 3053, 4061, + 4095, 3283, 3997, + 4095, 3475, 3893, + 3989, 3649, 3699, + 3691, 3809, 3145, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2283, 4095, + 4095, 2875, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4023, + 4095, 3781, 3831, + 3823, 3941, 3273, + 1384, 963, 1787, + 1369, 978, 1782, + 1348, 998, 1776, + 1319, 1023, 1767, + 1276, 1054, 1755, + 1212, 1093, 1739, + 1109, 1140, 1716, + 920, 1196, 1684, + 388, 1262, 1636, + 0, 1338, 1564, + 0, 1422, 1444, + 0, 1515, 1210, + 0, 1616, 161, + 0, 1723, 0, + 0, 1835, 0, + 0, 1952, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2321, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1402, 960, 1792, + 1388, 976, 1788, + 1368, 995, 1781, + 1340, 1020, 1773, + 1299, 1052, 1761, + 1238, 1091, 1745, + 1142, 1138, 1722, + 969, 1195, 1690, + 531, 1261, 1643, + 0, 1337, 1572, + 0, 1421, 1455, + 0, 1514, 1228, + 0, 1615, 317, + 0, 1722, 0, + 0, 1835, 0, + 0, 1951, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2321, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1426, 957, 1799, + 1412, 973, 1795, + 1393, 992, 1788, + 1367, 1018, 1780, + 1328, 1049, 1768, + 1272, 1088, 1752, + 1183, 1136, 1730, + 1027, 1193, 1699, + 671, 1259, 1653, + 0, 1335, 1583, + 0, 1420, 1469, + 0, 1513, 1251, + 0, 1614, 465, + 0, 1722, 0, + 0, 1834, 0, + 0, 1951, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1455, 953, 1808, + 1443, 968, 1804, + 1425, 988, 1797, + 1400, 1014, 1789, + 1365, 1046, 1778, + 1313, 1085, 1762, + 1232, 1133, 1740, + 1096, 1190, 1710, + 809, 1257, 1665, + 0, 1333, 1597, + 0, 1419, 1487, + 0, 1512, 1280, + 0, 1613, 610, + 0, 1721, 0, + 0, 1834, 0, + 0, 1951, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1492, 947, 1820, + 1480, 963, 1815, + 1464, 983, 1809, + 1441, 1009, 1801, + 1409, 1041, 1790, + 1362, 1081, 1775, + 1291, 1129, 1754, + 1173, 1187, 1724, + 945, 1254, 1681, + 8, 1331, 1616, + 0, 1416, 1511, + 0, 1511, 1317, + 0, 1612, 750, + 0, 1720, 0, + 0, 1833, 0, + 0, 1950, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1537, 939, 1835, + 1526, 955, 1831, + 1512, 976, 1825, + 1491, 1002, 1817, + 1463, 1034, 1806, + 1421, 1075, 1792, + 1359, 1124, 1771, + 1260, 1182, 1743, + 1080, 1250, 1701, + 606, 1327, 1639, + 0, 1414, 1540, + 0, 1508, 1361, + 0, 1610, 889, + 0, 1718, 0, + 0, 1832, 0, + 0, 1949, 0, + 0, 2069, 0, + 0, 2193, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1591, 928, 1854, + 1582, 945, 1850, + 1569, 966, 1845, + 1551, 992, 1837, + 1526, 1026, 1827, + 1490, 1067, 1813, + 1437, 1117, 1794, + 1354, 1176, 1767, + 1215, 1245, 1727, + 916, 1323, 1669, + 0, 1410, 1577, + 0, 1505, 1414, + 0, 1608, 1026, + 0, 1716, 0, + 0, 1830, 0, + 0, 1948, 0, + 0, 2069, 0, + 0, 2193, 0, + 0, 2319, 0, + 0, 2445, 0, + 0, 2575, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1654, 913, 1879, + 1646, 930, 1875, + 1635, 952, 1870, + 1620, 979, 1863, + 1598, 1014, 1854, + 1568, 1056, 1840, + 1523, 1107, 1822, + 1457, 1167, 1796, + 1348, 1237, 1760, + 1146, 1317, 1706, + 517, 1405, 1621, + 0, 1501, 1477, + 0, 1604, 1161, + 0, 1714, 0, + 0, 1828, 0, + 0, 1946, 0, + 0, 2067, 0, + 0, 2191, 0, + 0, 2317, 0, + 0, 2445, 0, + 0, 2575, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1727, 892, 1910, + 1720, 910, 1907, + 1711, 933, 1902, + 1698, 962, 1895, + 1680, 997, 1886, + 1654, 1041, 1874, + 1618, 1093, 1857, + 1565, 1156, 1834, + 1482, 1227, 1800, + 1340, 1308, 1751, + 1035, 1398, 1675, + 0, 1495, 1549, + 0, 1600, 1296, + 0, 1710, 0, + 0, 1825, 0, + 0, 1944, 0, + 0, 2067, 0, + 0, 2191, 0, + 0, 2317, 0, + 0, 2445, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1810, 863, 1949, + 1804, 882, 1946, + 1796, 906, 1941, + 1785, 936, 1935, + 1770, 974, 1927, + 1750, 1020, 1916, + 1720, 1075, 1901, + 1678, 1139, 1879, + 1615, 1213, 1849, + 1514, 1297, 1805, + 1329, 1388, 1738, + 825, 1488, 1631, + 0, 1594, 1430, + 0, 1705, 815, + 0, 1822, 0, + 0, 1941, 0, + 0, 2065, 0, + 0, 2189, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1900, 820, 1996, + 1896, 841, 1993, + 1889, 868, 1989, + 1880, 900, 1984, + 1868, 941, 1976, + 1852, 990, 1966, + 1829, 1049, 1953, + 1796, 1117, 1934, + 1748, 1194, 1907, + 1674, 1281, 1868, + 1553, 1375, 1811, + 1314, 1477, 1721, + 121, 1586, 1564, + 0, 1699, 1198, + 0, 1817, 0, + 0, 1938, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1999, 757, 2053, + 1995, 780, 2049, + 1990, 810, 2046, + 1983, 848, 2041, + 1973, 893, 2035, + 1960, 947, 2026, + 1942, 1011, 2014, + 1917, 1084, 1998, + 1881, 1167, 1974, + 1827, 1258, 1941, + 1743, 1357, 1893, + 1601, 1463, 1819, + 1292, 1574, 1697, + 0, 1690, 1455, + 0, 1810, 187, + 0, 1932, 0, + 0, 2057, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2105, 654, 2119, + 2101, 684, 2115, + 2097, 721, 2113, + 2091, 765, 2109, + 2085, 819, 2103, + 2075, 883, 2095, + 2059, 956, 2085, + 2040, 1038, 2071, + 2013, 1128, 2051, + 1974, 1227, 2024, + 1915, 1332, 1984, + 1822, 1443, 1924, + 1658, 1559, 1830, + 1261, 1678, 1663, + 0, 1801, 1252, + 0, 1926, 0, + 0, 2053, 0, + 0, 2179, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2215, 467, 2193, + 2213, 511, 2191, + 2209, 563, 2189, + 2205, 626, 2185, + 2199, 698, 2181, + 2191, 779, 2175, + 2181, 869, 2165, + 2167, 966, 2153, + 2145, 1071, 2137, + 2117, 1181, 2115, + 2075, 1296, 2083, + 2011, 1415, 2035, + 1909, 1538, 1963, + 1724, 1662, 1844, + 1217, 1788, 1612, + 0, 1916, 615, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2331, 0, 2277, + 2329, 71, 2277, + 2327, 199, 2273, + 2323, 327, 2271, + 2319, 457, 2267, + 2313, 587, 2261, + 2305, 718, 2255, + 2293, 849, 2245, + 2277, 980, 2231, + 2257, 1112, 2213, + 2225, 1243, 2187, + 2181, 1375, 2151, + 2113, 1507, 2095, + 2005, 1639, 2010, + 1800, 1771, 1862, + 1150, 1903, 1535, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2451, 0, 2371, + 2449, 0, 2369, + 2447, 0, 2367, + 2445, 0, 2365, + 2441, 0, 2361, + 2437, 40, 2357, + 2431, 379, 2351, + 2421, 622, 2345, + 2411, 822, 2333, + 2395, 999, 2319, + 2371, 1161, 2299, + 2339, 1315, 2269, + 2293, 1463, 2227, + 2223, 1606, 2165, + 2107, 1747, 2065, + 1885, 1885, 1885, + 1042, 2022, 1405, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2573, 0, 2471, + 2571, 0, 2469, + 2571, 0, 2469, + 2569, 0, 2467, + 2565, 0, 2463, + 2563, 0, 2461, + 2557, 0, 2455, + 2551, 0, 2449, + 2543, 449, 2441, + 2531, 782, 2429, + 2513, 1022, 2413, + 2491, 1220, 2391, + 2459, 1396, 2361, + 2411, 1559, 2315, + 2337, 1712, 2245, + 2217, 1860, 2131, + 1979, 2003, 1914, + 839, 2143, 1140, + 0, 2281, 0, + 0, 2419, 0, + 0, 2553, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2697, 0, 2577, + 2697, 0, 2577, + 2695, 0, 2575, + 2695, 0, 2575, + 2693, 0, 2573, + 2689, 0, 2569, + 2687, 0, 2565, + 2681, 0, 2561, + 2675, 0, 2555, + 2665, 12, 2545, + 2653, 723, 2533, + 2637, 1051, 2517, + 2613, 1289, 2493, + 2579, 1486, 2459, + 2531, 1662, 2409, + 2455, 1824, 2333, + 2331, 1977, 2207, + 2079, 2125, 1951, + 206, 2267, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2825, 0, 2689, + 2823, 0, 2689, + 2823, 0, 2689, + 2821, 0, 2687, + 2821, 0, 2685, + 2819, 0, 2683, + 2815, 0, 2681, + 2811, 0, 2677, + 2807, 0, 2671, + 2801, 0, 2665, + 2791, 0, 2655, + 2779, 630, 2643, + 2761, 1087, 2625, + 2737, 1366, 2599, + 2703, 1584, 2563, + 2653, 1771, 2511, + 2577, 1940, 2429, + 2449, 2099, 2291, + 2187, 2249, 1995, + 0, 2395, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2953, 0, 2807, + 2951, 0, 2807, + 2951, 0, 2805, + 2951, 0, 2805, + 2949, 0, 2803, + 2947, 0, 2801, + 2945, 0, 2799, + 2943, 0, 2797, + 2939, 0, 2793, + 2935, 0, 2787, + 2927, 0, 2781, + 2919, 0, 2771, + 2905, 465, 2757, + 2889, 1132, 2739, + 2865, 1453, 2713, + 2829, 1689, 2675, + 2779, 1885, 2619, + 2701, 2059, 2533, + 2569, 2221, 2383, + 2299, 2375, 2049, + 0, 2521, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3081, 0, 2927, + 3081, 0, 2927, + 3081, 0, 2925, + 3079, 0, 2925, + 3079, 0, 2925, + 3077, 0, 2923, + 3075, 0, 2921, + 3073, 0, 2919, + 3071, 0, 2917, + 3067, 0, 2913, + 3063, 0, 2907, + 3055, 0, 2899, + 3047, 0, 2889, + 3033, 66, 2875, + 3017, 1185, 2857, + 2991, 1548, 2829, + 2957, 1799, 2791, + 2905, 2003, 2733, + 2827, 2183, 2643, + 2693, 2347, 2483, + 2417, 2501, 2111, + 0, 2651, 0, + 0, 2795, 0, + 0, 2935, 0, + 0, 3073, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3211, 0, 3049, + 3211, 0, 3049, + 3211, 0, 3049, + 3209, 0, 3049, + 3209, 0, 3047, + 3209, 0, 3047, + 3207, 0, 3045, + 3205, 0, 3043, + 3203, 0, 3041, + 3201, 0, 3039, + 3197, 0, 3035, + 3191, 0, 3029, + 3185, 0, 3021, + 3175, 0, 3011, + 3163, 0, 2997, + 3145, 1248, 2977, + 3121, 1651, 2949, + 3085, 1914, 2909, + 3033, 2125, 2851, + 2955, 2307, 2757, + 2819, 2475, 2591, + 2537, 2631, 2183, + 0, 2779, 0, + 0, 2925, 0, + 0, 3065, 0, + 0, 3205, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3341, 0, 3175, + 3341, 0, 3175, + 3341, 0, 3175, + 3341, 0, 3173, + 3339, 0, 3173, + 3339, 0, 3173, + 3339, 0, 3171, + 3337, 0, 3171, + 3335, 0, 3169, + 3333, 0, 3167, + 3331, 0, 3163, + 3327, 0, 3159, + 3321, 0, 3153, + 3315, 0, 3145, + 3305, 0, 3135, + 3293, 0, 3121, + 3275, 1320, 3101, + 3251, 1759, 3073, + 3215, 2033, 3033, + 3163, 2249, 2971, + 3083, 2435, 2875, + 2947, 2603, 2703, + 2661, 2759, 2265, + 0, 2911, 0, + 0, 3055, 0, + 0, 3197, 0, + 0, 3337, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3469, 0, 3299, + 3469, 0, 3299, + 3467, 0, 3297, + 3467, 0, 3295, + 3463, 0, 3293, + 3461, 0, 3289, + 3457, 0, 3285, + 3453, 0, 3279, + 3445, 0, 3273, + 3437, 0, 3261, + 3423, 0, 3247, + 3405, 1402, 3227, + 3381, 1873, 3199, + 3345, 2155, 3157, + 3293, 2375, 3095, + 3213, 2563, 2997, + 3075, 2731, 2819, + 2785, 2891, 2355, + 0, 3041, 0, + 0, 3187, 0, + 0, 3329, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3603, 0, 3429, + 3603, 0, 3429, + 3603, 0, 3429, + 3603, 0, 3429, + 3603, 0, 3429, + 3601, 0, 3429, + 3601, 0, 3429, + 3601, 0, 3427, + 3599, 0, 3427, + 3599, 0, 3425, + 3597, 0, 3423, + 3595, 0, 3421, + 3593, 0, 3417, + 3589, 0, 3413, + 3583, 0, 3407, + 3577, 0, 3399, + 3567, 0, 3389, + 3555, 0, 3375, + 3537, 1492, 3355, + 3511, 1990, 3325, + 3475, 2279, 3283, + 3423, 2501, 3221, + 3343, 2691, 3121, + 3205, 2861, 2939, + 2913, 3021, 2453, + 0, 3171, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3735, 0, 3559, + 3735, 0, 3559, + 3735, 0, 3559, + 3733, 0, 3559, + 3733, 0, 3559, + 3733, 0, 3559, + 3733, 0, 3557, + 3733, 0, 3557, + 3731, 0, 3557, + 3731, 0, 3555, + 3729, 0, 3555, + 3729, 0, 3553, + 3727, 0, 3551, + 3723, 0, 3547, + 3719, 0, 3543, + 3715, 0, 3537, + 3707, 0, 3529, + 3699, 0, 3517, + 3685, 0, 3503, + 3667, 1591, 3483, + 3643, 2111, 3453, + 3607, 2405, 3411, + 3555, 2631, 3347, + 3473, 2821, 3247, + 3335, 2993, 3063, + 3041, 3151, 2559, + 0, 3303, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3863, 0, 3687, + 3863, 0, 3685, + 3861, 0, 3683, + 3859, 0, 3683, + 3857, 0, 3679, + 3855, 0, 3677, + 3851, 0, 3673, + 3847, 0, 3667, + 3839, 0, 3659, + 3829, 0, 3647, + 3817, 0, 3633, + 3799, 1696, 3611, + 3773, 2235, 3583, + 3739, 2533, 3541, + 3685, 2759, 3477, + 3603, 2951, 3375, + 3465, 3123, 3187, + 3169, 3283, 2669, + 0, 3435, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3815, + 3993, 0, 3815, + 3991, 0, 3813, + 3989, 0, 3811, + 3987, 0, 3807, + 3983, 0, 3803, + 3977, 0, 3797, + 3971, 0, 3789, + 3961, 0, 3777, + 3949, 0, 3763, + 3931, 1806, 3741, + 3905, 2361, 3713, + 3869, 2663, 3669, + 3817, 2889, 3605, + 3735, 3083, 3503, + 3595, 3255, 3315, + 3299, 3415, 2785, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3927, + 4095, 0, 3919, + 4093, 0, 3909, + 4081, 0, 3893, + 4063, 1922, 3873, + 4037, 2487, 3843, + 4001, 2793, 3801, + 3949, 3021, 3735, + 3867, 3213, 3633, + 3727, 3385, 3443, + 3431, 3547, 2903, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4059, + 4095, 0, 4051, + 4095, 0, 4039, + 4095, 0, 4025, + 4095, 2041, 4003, + 4095, 2617, 3973, + 4095, 2923, 3931, + 4081, 3151, 3867, + 3999, 3345, 3763, + 3859, 3517, 3571, + 3561, 3677, 3025, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2163, 4095, + 4095, 2745, 4095, + 4095, 3053, 4063, + 4095, 3283, 3997, + 4095, 3477, 3893, + 3991, 3649, 3701, + 3693, 3809, 3151, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2287, 4095, + 4095, 2875, 4095, + 4095, 3185, 4095, + 4095, 3415, 4095, + 4095, 3607, 4025, + 4095, 3781, 3831, + 3823, 3941, 3277, + 1513, 1085, 1919, + 1502, 1096, 1915, + 1486, 1112, 1911, + 1465, 1131, 1904, + 1434, 1156, 1895, + 1390, 1187, 1883, + 1323, 1226, 1867, + 1214, 1273, 1844, + 1011, 1329, 1811, + 373, 1395, 1763, + 0, 1470, 1689, + 0, 1555, 1568, + 0, 1648, 1328, + 0, 1748, 128, + 0, 1855, 0, + 0, 1967, 0, + 0, 2085, 0, + 0, 2205, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1527, 1083, 1923, + 1516, 1095, 1919, + 1501, 1110, 1915, + 1480, 1129, 1908, + 1451, 1154, 1899, + 1408, 1186, 1888, + 1344, 1225, 1871, + 1241, 1272, 1848, + 1052, 1328, 1816, + 520, 1394, 1768, + 0, 1470, 1696, + 0, 1554, 1576, + 0, 1647, 1342, + 0, 1748, 294, + 0, 1855, 0, + 0, 1967, 0, + 0, 2083, 0, + 0, 2205, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1545, 1080, 1928, + 1534, 1092, 1924, + 1520, 1108, 1920, + 1500, 1127, 1913, + 1472, 1152, 1905, + 1431, 1184, 1893, + 1370, 1223, 1877, + 1274, 1270, 1854, + 1101, 1327, 1822, + 663, 1393, 1775, + 0, 1469, 1704, + 0, 1553, 1587, + 0, 1647, 1360, + 0, 1747, 449, + 0, 1854, 0, + 0, 1967, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1568, 1077, 1935, + 1558, 1089, 1931, + 1544, 1104, 1927, + 1525, 1124, 1920, + 1499, 1150, 1912, + 1460, 1181, 1900, + 1404, 1221, 1884, + 1315, 1268, 1862, + 1160, 1325, 1831, + 803, 1391, 1785, + 0, 1467, 1715, + 0, 1552, 1601, + 0, 1646, 1383, + 0, 1746, 597, + 0, 1854, 0, + 0, 1966, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1597, 1073, 1944, + 1588, 1085, 1940, + 1575, 1100, 1936, + 1557, 1120, 1930, + 1532, 1146, 1921, + 1497, 1178, 1910, + 1445, 1217, 1894, + 1364, 1265, 1873, + 1228, 1322, 1842, + 941, 1389, 1797, + 0, 1465, 1729, + 0, 1551, 1619, + 0, 1644, 1412, + 0, 1745, 742, + 0, 1853, 0, + 0, 1966, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1633, 1067, 1955, + 1624, 1079, 1952, + 1613, 1095, 1947, + 1596, 1115, 1942, + 1574, 1141, 1933, + 1541, 1173, 1922, + 1494, 1213, 1907, + 1423, 1261, 1886, + 1305, 1319, 1856, + 1077, 1386, 1813, + 140, 1463, 1748, + 0, 1549, 1643, + 0, 1643, 1449, + 0, 1744, 883, + 0, 1852, 0, + 0, 1965, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1677, 1058, 1970, + 1669, 1071, 1967, + 1659, 1087, 1963, + 1644, 1108, 1957, + 1624, 1134, 1949, + 1595, 1167, 1939, + 1553, 1207, 1924, + 1491, 1256, 1904, + 1392, 1314, 1875, + 1212, 1382, 1833, + 738, 1459, 1771, + 0, 1546, 1672, + 0, 1640, 1493, + 0, 1742, 1021, + 0, 1850, 0, + 0, 1964, 0, + 0, 2081, 0, + 0, 2203, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1730, 1047, 1990, + 1723, 1060, 1987, + 1714, 1076, 1982, + 1701, 1098, 1977, + 1683, 1124, 1969, + 1658, 1158, 1959, + 1622, 1199, 1945, + 1569, 1249, 1926, + 1487, 1308, 1899, + 1347, 1377, 1859, + 1048, 1455, 1801, + 0, 1542, 1709, + 0, 1637, 1546, + 0, 1740, 1158, + 0, 1848, 0, + 0, 1962, 0, + 0, 2081, 0, + 0, 2201, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1793, 1032, 2014, + 1787, 1045, 2011, + 1778, 1062, 2008, + 1767, 1084, 2002, + 1752, 1111, 1995, + 1730, 1146, 1986, + 1700, 1188, 1972, + 1655, 1239, 1954, + 1589, 1299, 1929, + 1481, 1369, 1892, + 1278, 1449, 1838, + 650, 1537, 1754, + 0, 1633, 1609, + 0, 1736, 1294, + 0, 1846, 0, + 0, 1960, 0, + 0, 2079, 0, + 0, 2201, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2577, 0, + 0, 2707, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1865, 1011, 2045, + 1860, 1024, 2043, + 1853, 1042, 2039, + 1843, 1065, 2034, + 1830, 1093, 2028, + 1812, 1129, 2019, + 1787, 1173, 2006, + 1750, 1226, 1989, + 1697, 1288, 1966, + 1614, 1359, 1932, + 1472, 1440, 1883, + 1167, 1530, 1807, + 0, 1628, 1681, + 0, 1732, 1428, + 0, 1842, 0, + 0, 1957, 0, + 0, 2077, 0, + 0, 2199, 0, + 0, 2323, 0, + 0, 2449, 0, + 0, 2577, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1946, 980, 2083, + 1942, 995, 2081, + 1936, 1014, 2077, + 1928, 1038, 2073, + 1917, 1068, 2067, + 1902, 1106, 2059, + 1882, 1152, 2049, + 1853, 1207, 2033, + 1810, 1271, 2011, + 1747, 1345, 1981, + 1646, 1429, 1937, + 1461, 1520, 1870, + 957, 1620, 1763, + 0, 1726, 1562, + 0, 1838, 947, + 0, 1954, 0, + 0, 2073, 0, + 0, 2197, 0, + 0, 2321, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2036, 936, 2131, + 2033, 953, 2129, + 2028, 973, 2125, + 2021, 1000, 2121, + 2013, 1032, 2115, + 2001, 1073, 2109, + 1984, 1122, 2099, + 1961, 1181, 2085, + 1928, 1249, 2065, + 1880, 1326, 2039, + 1807, 1413, 2000, + 1685, 1508, 1943, + 1446, 1610, 1853, + 253, 1718, 1696, + 0, 1831, 1330, + 0, 1949, 0, + 0, 2069, 0, + 0, 2193, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2135, 870, 2187, + 2131, 889, 2185, + 2127, 913, 2181, + 2123, 942, 2179, + 2115, 980, 2173, + 2105, 1025, 2167, + 2093, 1079, 2159, + 2075, 1143, 2147, + 2049, 1217, 2129, + 2013, 1299, 2107, + 1959, 1391, 2073, + 1876, 1490, 2025, + 1733, 1595, 1951, + 1424, 1707, 1829, + 0, 1822, 1587, + 0, 1942, 319, + 0, 2065, 0, + 0, 2189, 0, + 0, 2317, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2239, 763, 2251, + 2237, 786, 2251, + 2233, 816, 2247, + 2229, 853, 2245, + 2223, 898, 2241, + 2217, 952, 2235, + 2207, 1015, 2227, + 2193, 1088, 2217, + 2173, 1170, 2203, + 2145, 1261, 2183, + 2105, 1359, 2155, + 2047, 1464, 2115, + 1954, 1575, 2057, + 1790, 1691, 1962, + 1394, 1811, 1795, + 0, 1933, 1384, + 0, 2057, 0, + 0, 2185, 0, + 0, 2313, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2349, 563, 2327, + 2347, 599, 2325, + 2345, 643, 2323, + 2341, 696, 2321, + 2337, 758, 2317, + 2331, 830, 2313, + 2323, 911, 2307, + 2313, 1001, 2297, + 2299, 1098, 2285, + 2277, 1203, 2269, + 2249, 1313, 2247, + 2207, 1429, 2215, + 2143, 1548, 2167, + 2041, 1670, 2095, + 1856, 1794, 1976, + 1349, 1920, 1745, + 0, 2049, 747, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2465, 0, 2411, + 2463, 77, 2409, + 2461, 203, 2409, + 2459, 331, 2407, + 2455, 460, 2403, + 2451, 589, 2399, + 2445, 719, 2393, + 2437, 850, 2387, + 2425, 981, 2377, + 2409, 1112, 2363, + 2389, 1244, 2345, + 2357, 1376, 2319, + 2313, 1507, 2283, + 2245, 1639, 2227, + 2137, 1771, 2141, + 1932, 1903, 1994, + 1282, 2035, 1667, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2583, 0, 2503, + 2583, 0, 2503, + 2581, 0, 2501, + 2579, 0, 2499, + 2577, 0, 2497, + 2573, 0, 2495, + 2569, 172, 2489, + 2563, 511, 2483, + 2553, 754, 2477, + 2543, 954, 2465, + 2527, 1130, 2451, + 2503, 1293, 2431, + 2471, 1447, 2401, + 2425, 1595, 2359, + 2355, 1739, 2297, + 2239, 1879, 2197, + 2017, 2017, 2017, + 1174, 2153, 1537, + 0, 2289, 0, + 0, 2425, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2705, 0, 2603, + 2705, 0, 2603, + 2703, 0, 2601, + 2703, 0, 2601, + 2701, 0, 2599, + 2697, 0, 2597, + 2695, 0, 2593, + 2689, 0, 2589, + 2683, 0, 2581, + 2675, 581, 2573, + 2663, 914, 2561, + 2647, 1154, 2545, + 2623, 1352, 2523, + 2591, 1528, 2493, + 2543, 1691, 2447, + 2469, 1845, 2377, + 2349, 1992, 2263, + 2111, 2135, 2046, + 972, 2275, 1272, + 0, 2413, 0, + 0, 2551, 0, + 0, 2685, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2831, 0, 2711, + 2829, 0, 2709, + 2829, 0, 2709, + 2827, 0, 2707, + 2827, 0, 2707, + 2825, 0, 2705, + 2821, 0, 2701, + 2819, 0, 2699, + 2813, 0, 2693, + 2807, 0, 2687, + 2797, 144, 2677, + 2785, 855, 2665, + 2769, 1183, 2649, + 2745, 1421, 2625, + 2711, 1618, 2591, + 2663, 1794, 2541, + 2587, 1956, 2465, + 2463, 2109, 2339, + 2211, 2257, 2083, + 338, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2957, 0, 2823, + 2957, 0, 2821, + 2955, 0, 2821, + 2955, 0, 2821, + 2953, 0, 2819, + 2953, 0, 2817, + 2951, 0, 2815, + 2947, 0, 2813, + 2943, 0, 2809, + 2939, 0, 2803, + 2933, 0, 2797, + 2923, 0, 2787, + 2911, 762, 2775, + 2893, 1219, 2757, + 2869, 1499, 2731, + 2835, 1716, 2697, + 2785, 1903, 2643, + 2709, 2073, 2561, + 2581, 2231, 2423, + 2319, 2381, 2127, + 0, 2527, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3085, 0, 2939, + 3085, 0, 2939, + 3083, 0, 2939, + 3083, 0, 2937, + 3083, 0, 2937, + 3081, 0, 2935, + 3079, 0, 2933, + 3077, 0, 2931, + 3075, 0, 2929, + 3071, 0, 2925, + 3067, 0, 2919, + 3059, 0, 2913, + 3051, 0, 2903, + 3037, 597, 2889, + 3021, 1264, 2871, + 2997, 1585, 2845, + 2961, 1821, 2807, + 2911, 2017, 2751, + 2833, 2191, 2665, + 2701, 2353, 2515, + 2431, 2507, 2181, + 0, 2653, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3213, 0, 3059, + 3213, 0, 3059, + 3213, 0, 3059, + 3213, 0, 3057, + 3211, 0, 3057, + 3211, 0, 3057, + 3209, 0, 3055, + 3209, 0, 3053, + 3207, 0, 3051, + 3203, 0, 3049, + 3199, 0, 3045, + 3195, 0, 3039, + 3187, 0, 3031, + 3179, 0, 3021, + 3165, 198, 3007, + 3149, 1317, 2989, + 3125, 1680, 2961, + 3089, 1931, 2923, + 3037, 2135, 2865, + 2959, 2315, 2775, + 2825, 2479, 2615, + 2549, 2635, 2243, + 0, 2783, 0, + 0, 2927, 0, + 0, 3067, 0, + 0, 3205, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3343, 0, 3183, + 3343, 0, 3181, + 3343, 0, 3181, + 3343, 0, 3181, + 3341, 0, 3181, + 3341, 0, 3179, + 3341, 0, 3179, + 3339, 0, 3177, + 3337, 0, 3177, + 3335, 0, 3173, + 3333, 0, 3171, + 3329, 0, 3167, + 3323, 0, 3161, + 3317, 0, 3153, + 3307, 0, 3143, + 3295, 0, 3129, + 3277, 1380, 3109, + 3253, 1783, 3081, + 3217, 2046, 3041, + 3167, 2257, 2983, + 3087, 2439, 2889, + 2951, 2607, 2723, + 2669, 2763, 2315, + 0, 2913, 0, + 0, 3057, 0, + 0, 3197, 0, + 0, 3337, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3473, 0, 3307, + 3473, 0, 3307, + 3473, 0, 3307, + 3473, 0, 3307, + 3473, 0, 3307, + 3471, 0, 3305, + 3471, 0, 3305, + 3471, 0, 3303, + 3469, 0, 3303, + 3467, 0, 3301, + 3465, 0, 3299, + 3463, 0, 3295, + 3459, 0, 3291, + 3453, 0, 3285, + 3447, 0, 3277, + 3437, 0, 3267, + 3425, 0, 3253, + 3407, 1452, 3233, + 3383, 1891, 3205, + 3347, 2165, 3165, + 3295, 2381, 3103, + 3215, 2567, 3007, + 3079, 2735, 2835, + 2793, 2893, 2397, + 0, 3043, 0, + 0, 3187, 0, + 0, 3329, 0, + 0, 3469, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3603, 0, 3435, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3601, 0, 3431, + 3601, 0, 3431, + 3599, 0, 3429, + 3599, 0, 3427, + 3597, 0, 3425, + 3593, 0, 3423, + 3589, 0, 3417, + 3585, 0, 3413, + 3577, 0, 3405, + 3569, 0, 3393, + 3555, 0, 3379, + 3537, 1534, 3359, + 3513, 2005, 3331, + 3477, 2287, 3289, + 3425, 2507, 3227, + 3345, 2695, 3129, + 3207, 2863, 2951, + 2917, 3023, 2487, + 0, 3173, 0, + 0, 3319, 0, + 0, 3461, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3735, 0, 3563, + 3735, 0, 3563, + 3735, 0, 3561, + 3735, 0, 3561, + 3735, 0, 3561, + 3735, 0, 3561, + 3733, 0, 3561, + 3733, 0, 3561, + 3733, 0, 3559, + 3731, 0, 3559, + 3731, 0, 3557, + 3729, 0, 3555, + 3727, 0, 3553, + 3725, 0, 3549, + 3721, 0, 3545, + 3715, 0, 3539, + 3709, 0, 3533, + 3699, 0, 3521, + 3687, 0, 3507, + 3669, 1625, 3487, + 3643, 2123, 3457, + 3607, 2411, 3415, + 3555, 2633, 3353, + 3475, 2823, 3253, + 3337, 2993, 3071, + 3045, 3153, 2585, + 0, 3303, 0, + 0, 3449, 0, + 0, 3593, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3867, 0, 3691, + 3867, 0, 3691, + 3867, 0, 3691, + 3867, 0, 3691, + 3865, 0, 3691, + 3865, 0, 3691, + 3865, 0, 3691, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3863, 0, 3687, + 3863, 0, 3687, + 3861, 0, 3685, + 3859, 0, 3683, + 3855, 0, 3679, + 3851, 0, 3675, + 3847, 0, 3669, + 3839, 0, 3661, + 3831, 0, 3651, + 3817, 0, 3635, + 3799, 1723, 3615, + 3775, 2243, 3585, + 3739, 2539, 3543, + 3687, 2763, 3481, + 3605, 2953, 3379, + 3467, 3125, 3195, + 3173, 3283, 2691, + 0, 3435, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3819, + 3997, 0, 3819, + 3995, 0, 3819, + 3995, 0, 3817, + 3993, 0, 3817, + 3991, 0, 3815, + 3989, 0, 3811, + 3987, 0, 3809, + 3983, 0, 3805, + 3979, 0, 3799, + 3971, 0, 3791, + 3961, 0, 3779, + 3949, 0, 3765, + 3931, 1828, 3745, + 3907, 2367, 3715, + 3871, 2665, 3673, + 3817, 2891, 3609, + 3735, 3083, 3507, + 3597, 3255, 3319, + 3301, 3415, 2801, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3921, + 4093, 0, 3909, + 4081, 0, 3895, + 4063, 1938, 3875, + 4037, 2493, 3845, + 4001, 2795, 3801, + 3949, 3021, 3737, + 3867, 3215, 3635, + 3729, 3387, 3447, + 3431, 3547, 2917, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4059, + 4095, 0, 4051, + 4095, 0, 4041, + 4095, 0, 4025, + 4095, 2053, 4005, + 4095, 2621, 3975, + 4095, 2925, 3933, + 4081, 3153, 3867, + 3999, 3345, 3765, + 3859, 3517, 3575, + 3563, 3679, 3035, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2173, 4095, + 4095, 2749, 4095, + 4095, 3055, 4063, + 4095, 3283, 3999, + 4095, 3477, 3895, + 3991, 3649, 3703, + 3693, 3809, 3157, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2295, 4095, + 4095, 2877, 4095, + 4095, 3185, 4095, + 4095, 3415, 4095, + 4095, 3609, 4025, + 4095, 3781, 3833, + 3825, 3941, 3283, + 1643, 1209, 2051, + 1635, 1218, 2049, + 1623, 1230, 2045, + 1607, 1245, 2040, + 1585, 1264, 2033, + 1554, 1289, 2025, + 1508, 1321, 2012, + 1439, 1359, 1996, + 1326, 1406, 1972, + 1110, 1462, 1939, + 353, 1528, 1891, + 0, 1603, 1817, + 0, 1688, 1694, + 0, 1780, 1449, + 0, 1881, 80, + 0, 1987, 0, + 0, 2099, 0, + 0, 2217, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1653, 1208, 2053, + 1645, 1217, 2051, + 1634, 1229, 2047, + 1618, 1244, 2043, + 1597, 1263, 2036, + 1566, 1288, 2028, + 1522, 1319, 2016, + 1455, 1358, 1999, + 1346, 1405, 1976, + 1143, 1462, 1943, + 505, 1527, 1895, + 0, 1603, 1821, + 0, 1687, 1700, + 0, 1780, 1460, + 0, 1880, 260, + 0, 1987, 0, + 0, 2099, 0, + 0, 2217, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1667, 1206, 2057, + 1659, 1215, 2055, + 1648, 1227, 2051, + 1633, 1242, 2047, + 1612, 1262, 2040, + 1583, 1287, 2032, + 1540, 1318, 2020, + 1476, 1357, 2003, + 1373, 1404, 1980, + 1184, 1461, 1948, + 652, 1526, 1900, + 0, 1602, 1828, + 0, 1686, 1708, + 0, 1779, 1474, + 0, 1880, 426, + 0, 1987, 0, + 0, 2099, 0, + 0, 2215, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1685, 1204, 2063, + 1677, 1213, 2061, + 1667, 1224, 2057, + 1652, 1240, 2051, + 1632, 1259, 2046, + 1604, 1284, 2037, + 1563, 1316, 2025, + 1503, 1355, 2009, + 1406, 1403, 1986, + 1233, 1459, 1954, + 795, 1525, 1907, + 0, 1601, 1836, + 0, 1686, 1719, + 0, 1779, 1492, + 0, 1879, 581, + 0, 1986, 0, + 0, 2099, 0, + 0, 2215, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1707, 1200, 2069, + 1700, 1209, 2067, + 1690, 1221, 2063, + 1676, 1237, 2059, + 1657, 1256, 2053, + 1631, 1282, 2044, + 1593, 1313, 2033, + 1536, 1353, 2017, + 1447, 1400, 1994, + 1292, 1457, 1963, + 935, 1524, 1917, + 0, 1599, 1847, + 0, 1684, 1733, + 0, 1778, 1515, + 0, 1879, 730, + 0, 1986, 0, + 0, 2099, 0, + 0, 2215, 0, + 0, 2335, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1736, 1196, 2079, + 1729, 1205, 2075, + 1720, 1217, 2073, + 1707, 1232, 2067, + 1689, 1252, 2061, + 1664, 1278, 2053, + 1629, 1310, 2042, + 1577, 1349, 2026, + 1496, 1397, 2005, + 1360, 1455, 1974, + 1073, 1521, 1929, + 0, 1598, 1861, + 0, 1683, 1752, + 0, 1776, 1545, + 0, 1878, 874, + 0, 1985, 0, + 0, 2097, 0, + 0, 2215, 0, + 0, 2335, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1771, 1189, 2089, + 1765, 1199, 2087, + 1756, 1211, 2083, + 1745, 1227, 2079, + 1728, 1247, 2073, + 1706, 1273, 2065, + 1674, 1305, 2055, + 1627, 1345, 2039, + 1555, 1393, 2018, + 1437, 1451, 1988, + 1209, 1518, 1945, + 272, 1595, 1880, + 0, 1681, 1775, + 0, 1775, 1581, + 0, 1876, 1015, + 0, 1984, 0, + 0, 2097, 0, + 0, 2215, 0, + 0, 2335, 0, + 0, 2459, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1815, 1181, 2105, + 1809, 1191, 2103, + 1801, 1203, 2099, + 1791, 1219, 2095, + 1776, 1240, 2089, + 1756, 1266, 2081, + 1727, 1299, 2071, + 1685, 1339, 2057, + 1623, 1388, 2036, + 1524, 1446, 2007, + 1344, 1514, 1966, + 870, 1592, 1903, + 0, 1678, 1804, + 0, 1772, 1625, + 0, 1874, 1153, + 0, 1982, 0, + 0, 2095, 0, + 0, 2213, 0, + 0, 2335, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1867, 1170, 2123, + 1862, 1179, 2121, + 1855, 1192, 2119, + 1846, 1209, 2115, + 1833, 1230, 2109, + 1815, 1256, 2101, + 1790, 1290, 2091, + 1754, 1331, 2077, + 1701, 1381, 2059, + 1619, 1440, 2031, + 1479, 1509, 1992, + 1180, 1587, 1933, + 0, 1674, 1841, + 0, 1769, 1678, + 0, 1872, 1290, + 0, 1981, 0, + 0, 2095, 0, + 0, 2213, 0, + 0, 2333, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1929, 1154, 2149, + 1925, 1164, 2147, + 1919, 1177, 2143, + 1910, 1194, 2139, + 1899, 1216, 2135, + 1884, 1243, 2127, + 1862, 1278, 2117, + 1832, 1320, 2105, + 1788, 1371, 2087, + 1721, 1432, 2061, + 1613, 1501, 2024, + 1410, 1581, 1970, + 782, 1669, 1886, + 0, 1765, 1741, + 0, 1869, 1426, + 0, 1978, 0, + 0, 2093, 0, + 0, 2211, 0, + 0, 2333, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2709, 0, + 0, 2839, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2001, 1132, 2179, + 1997, 1143, 2177, + 1992, 1156, 2175, + 1985, 1174, 2171, + 1975, 1197, 2167, + 1962, 1226, 2159, + 1944, 1261, 2151, + 1919, 1305, 2139, + 1883, 1358, 2121, + 1829, 1420, 2097, + 1746, 1491, 2065, + 1604, 1572, 2015, + 1299, 1662, 1939, + 0, 1760, 1813, + 0, 1864, 1560, + 0, 1974, 0, + 0, 2089, 0, + 0, 2209, 0, + 0, 2331, 0, + 0, 2455, 0, + 0, 2581, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2081, 1101, 2217, + 2079, 1112, 2215, + 2073, 1127, 2213, + 2069, 1146, 2211, + 2061, 1170, 2205, + 2049, 1200, 2199, + 2034, 1238, 2191, + 2014, 1284, 2181, + 1985, 1339, 2165, + 1943, 1404, 2143, + 1879, 1478, 2113, + 1778, 1561, 2069, + 1593, 1653, 2003, + 1089, 1752, 1895, + 0, 1858, 1695, + 0, 1970, 1079, + 0, 2085, 0, + 0, 2205, 0, + 0, 2329, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2171, 1056, 2265, + 2169, 1068, 2263, + 2165, 1084, 2261, + 2159, 1105, 2257, + 2153, 1132, 2253, + 2145, 1164, 2249, + 2133, 1205, 2241, + 2117, 1254, 2231, + 2093, 1313, 2217, + 2061, 1381, 2197, + 2012, 1458, 2171, + 1939, 1545, 2133, + 1817, 1640, 2075, + 1578, 1742, 1985, + 385, 1850, 1828, + 0, 1963, 1462, + 0, 2081, 0, + 0, 2201, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2269, 988, 2321, + 2267, 1002, 2319, + 2263, 1021, 2317, + 2259, 1044, 2315, + 2255, 1074, 2311, + 2247, 1112, 2305, + 2237, 1157, 2299, + 2225, 1211, 2291, + 2207, 1275, 2279, + 2181, 1349, 2261, + 2145, 1431, 2239, + 2091, 1523, 2205, + 2008, 1622, 2157, + 1865, 1727, 2083, + 1556, 1839, 1961, + 0, 1955, 1720, + 0, 2075, 451, + 0, 2197, 0, + 0, 2321, 0, + 0, 2449, 0, + 0, 2577, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2373, 877, 2385, + 2371, 895, 2385, + 2369, 918, 2383, + 2365, 948, 2381, + 2361, 985, 2377, + 2357, 1029, 2373, + 2349, 1083, 2367, + 2339, 1147, 2359, + 2325, 1220, 2349, + 2305, 1302, 2335, + 2277, 1393, 2315, + 2237, 1491, 2287, + 2179, 1597, 2247, + 2087, 1708, 2189, + 1922, 1823, 2095, + 1526, 1943, 1927, + 0, 2065, 1516, + 0, 2189, 0, + 0, 2317, 0, + 0, 2445, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2483, 666, 2461, + 2481, 695, 2459, + 2479, 731, 2457, + 2477, 775, 2455, + 2475, 828, 2453, + 2469, 890, 2449, + 2463, 962, 2445, + 2457, 1043, 2439, + 2445, 1133, 2429, + 2431, 1230, 2417, + 2409, 1335, 2401, + 2381, 1445, 2379, + 2339, 1561, 2347, + 2275, 1680, 2299, + 2173, 1802, 2227, + 1988, 1926, 2109, + 1481, 2053, 1877, + 0, 2181, 879, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2597, 0, 2543, + 2597, 84, 2543, + 2595, 209, 2541, + 2593, 335, 2541, + 2591, 463, 2539, + 2587, 592, 2535, + 2583, 721, 2531, + 2577, 852, 2527, + 2569, 982, 2519, + 2557, 1113, 2509, + 2543, 1244, 2495, + 2521, 1376, 2477, + 2489, 1508, 2451, + 2445, 1640, 2415, + 2379, 1771, 2359, + 2269, 1903, 2273, + 2065, 2035, 2127, + 1415, 2167, 1799, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2717, 0, 2637, + 2715, 0, 2635, + 2715, 0, 2635, + 2713, 0, 2633, + 2711, 0, 2631, + 2709, 0, 2629, + 2705, 0, 2627, + 2701, 304, 2621, + 2695, 644, 2617, + 2687, 886, 2609, + 2675, 1086, 2597, + 2659, 1263, 2583, + 2635, 1426, 2563, + 2605, 1580, 2533, + 2557, 1727, 2493, + 2487, 1871, 2429, + 2371, 2011, 2329, + 2149, 2149, 2149, + 1306, 2287, 1669, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2839, 0, 2737, + 2837, 0, 2735, + 2837, 0, 2735, + 2837, 0, 2735, + 2835, 0, 2733, + 2833, 0, 2731, + 2831, 0, 2729, + 2827, 0, 2725, + 2821, 0, 2721, + 2815, 0, 2713, + 2807, 713, 2705, + 2795, 1046, 2693, + 2779, 1286, 2679, + 2755, 1484, 2655, + 2723, 1661, 2625, + 2675, 1823, 2579, + 2601, 1977, 2509, + 2481, 2125, 2395, + 2243, 2267, 2179, + 1103, 2407, 1404, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2963, 0, 2843, + 2963, 0, 2843, + 2961, 0, 2841, + 2961, 0, 2841, + 2959, 0, 2839, + 2959, 0, 2839, + 2957, 0, 2837, + 2953, 0, 2833, + 2951, 0, 2831, + 2945, 0, 2825, + 2939, 0, 2819, + 2929, 276, 2809, + 2917, 987, 2797, + 2901, 1315, 2781, + 2877, 1553, 2757, + 2843, 1750, 2723, + 2795, 1926, 2673, + 2719, 2089, 2597, + 2595, 2241, 2471, + 2343, 2389, 2215, + 471, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3089, 0, 2955, + 3089, 0, 2955, + 3089, 0, 2955, + 3087, 0, 2953, + 3087, 0, 2953, + 3085, 0, 2951, + 3085, 0, 2949, + 3083, 0, 2947, + 3079, 0, 2945, + 3075, 0, 2941, + 3071, 0, 2937, + 3065, 0, 2929, + 3055, 0, 2919, + 3043, 894, 2907, + 3025, 1351, 2889, + 3001, 1631, 2863, + 2967, 1848, 2829, + 2917, 2035, 2775, + 2841, 2205, 2693, + 2713, 2363, 2555, + 2451, 2513, 2259, + 0, 2659, 0, + 0, 2801, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3483, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3217, 0, 3071, + 3217, 0, 3071, + 3217, 0, 3071, + 3215, 0, 3071, + 3215, 0, 3069, + 3215, 0, 3069, + 3213, 0, 3067, + 3211, 0, 3065, + 3209, 0, 3063, + 3207, 0, 3061, + 3203, 0, 3057, + 3199, 0, 3051, + 3191, 0, 3045, + 3183, 0, 3035, + 3169, 729, 3021, + 3153, 1396, 3003, + 3129, 1717, 2977, + 3093, 1953, 2939, + 3043, 2149, 2883, + 2965, 2325, 2797, + 2833, 2485, 2647, + 2563, 2639, 2313, + 0, 2785, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3345, 0, 3191, + 3345, 0, 3191, + 3345, 0, 3191, + 3345, 0, 3191, + 3345, 0, 3191, + 3343, 0, 3189, + 3343, 0, 3189, + 3341, 0, 3187, + 3341, 0, 3185, + 3339, 0, 3183, + 3335, 0, 3181, + 3331, 0, 3177, + 3327, 0, 3171, + 3319, 0, 3163, + 3311, 0, 3153, + 3299, 330, 3139, + 3281, 1449, 3121, + 3257, 1813, 3093, + 3221, 2063, 3055, + 3169, 2267, 2997, + 3091, 2447, 2907, + 2957, 2611, 2747, + 2681, 2767, 2375, + 0, 2915, 0, + 0, 3059, 0, + 0, 3199, 0, + 0, 3337, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3475, 0, 3315, + 3475, 0, 3315, + 3475, 0, 3313, + 3475, 0, 3313, + 3475, 0, 3313, + 3473, 0, 3313, + 3473, 0, 3313, + 3473, 0, 3311, + 3471, 0, 3309, + 3469, 0, 3309, + 3467, 0, 3305, + 3465, 0, 3303, + 3461, 0, 3299, + 3457, 0, 3293, + 3449, 0, 3285, + 3439, 0, 3275, + 3427, 0, 3261, + 3409, 1512, 3241, + 3385, 1915, 3213, + 3349, 2179, 3175, + 3299, 2389, 3115, + 3219, 2571, 3021, + 3083, 2739, 2855, + 2801, 2895, 2447, + 0, 3045, 0, + 0, 3189, 0, + 0, 3331, 0, + 0, 3469, 0, + 0, 3607, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3603, 0, 3437, + 3603, 0, 3437, + 3603, 0, 3437, + 3601, 0, 3435, + 3599, 0, 3433, + 3597, 0, 3431, + 3595, 0, 3427, + 3591, 0, 3423, + 3587, 0, 3417, + 3579, 0, 3411, + 3569, 0, 3399, + 3557, 0, 3385, + 3539, 1585, 3365, + 3515, 2023, 3337, + 3479, 2297, 3297, + 3427, 2513, 3235, + 3347, 2699, 3139, + 3211, 2867, 2967, + 2925, 3025, 2529, + 0, 3175, 0, + 0, 3319, 0, + 0, 3461, 0, + 0, 3601, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3737, 0, 3567, + 3737, 0, 3567, + 3735, 0, 3567, + 3735, 0, 3565, + 3735, 0, 3565, + 3735, 0, 3565, + 3735, 0, 3565, + 3735, 0, 3565, + 3733, 0, 3563, + 3733, 0, 3563, + 3731, 0, 3561, + 3731, 0, 3559, + 3729, 0, 3557, + 3725, 0, 3555, + 3721, 0, 3549, + 3717, 0, 3545, + 3709, 0, 3537, + 3701, 0, 3525, + 3687, 0, 3511, + 3669, 1666, 3491, + 3645, 2137, 3463, + 3609, 2419, 3421, + 3557, 2639, 3359, + 3477, 2827, 3261, + 3339, 2995, 3083, + 3049, 3155, 2619, + 0, 3305, 0, + 0, 3451, 0, + 0, 3593, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3867, 0, 3695, + 3867, 0, 3695, + 3867, 0, 3695, + 3867, 0, 3695, + 3867, 0, 3693, + 3867, 0, 3693, + 3867, 0, 3693, + 3867, 0, 3693, + 3865, 0, 3693, + 3865, 0, 3691, + 3865, 0, 3691, + 3863, 0, 3689, + 3861, 0, 3687, + 3859, 0, 3685, + 3857, 0, 3683, + 3853, 0, 3677, + 3847, 0, 3673, + 3841, 0, 3665, + 3831, 0, 3653, + 3819, 0, 3639, + 3801, 1757, 3619, + 3775, 2255, 3589, + 3741, 2543, 3547, + 3687, 2765, 3485, + 3607, 2955, 3385, + 3469, 3125, 3203, + 3177, 3285, 2717, + 0, 3437, 0, + 0, 3581, 0, + 0, 3725, 0, + 0, 3863, 0, + 0, 4001, 0, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3997, 0, 3823, + 3997, 0, 3823, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3995, 0, 3819, + 3995, 0, 3819, + 3993, 0, 3817, + 3991, 0, 3815, + 3987, 0, 3811, + 3983, 0, 3807, + 3979, 0, 3801, + 3971, 0, 3793, + 3963, 0, 3783, + 3949, 0, 3767, + 3931, 1855, 3747, + 3907, 2375, 3717, + 3871, 2671, 3675, + 3819, 2895, 3613, + 3737, 3085, 3511, + 3599, 3257, 3327, + 3305, 3415, 2823, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3931, + 4095, 0, 3923, + 4093, 0, 3911, + 4081, 0, 3897, + 4063, 1960, 3877, + 4039, 2499, 3847, + 4003, 2797, 3805, + 3949, 3023, 3741, + 3869, 3215, 3639, + 3729, 3387, 3451, + 3435, 3547, 2933, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4071, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4053, + 4095, 0, 4043, + 4095, 0, 4027, + 4095, 2071, 4007, + 4095, 2625, 3977, + 4095, 2927, 3935, + 4081, 3155, 3869, + 3999, 3347, 3767, + 3861, 3519, 3579, + 3563, 3679, 3049, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2187, 4095, + 4095, 2753, 4095, + 4095, 3057, 4065, + 4095, 3285, 4001, + 4095, 3477, 3897, + 3991, 3651, 3707, + 3695, 3811, 3167, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2305, 4095, + 4095, 2881, 4095, + 4095, 3187, 4095, + 4095, 3415, 4095, + 4095, 3609, 4027, + 4095, 3781, 3835, + 3825, 3943, 3291, + 1773, 1336, 2183, + 1767, 1342, 2181, + 1759, 1351, 2179, + 1747, 1363, 2175, + 1731, 1378, 2169, + 1708, 1398, 2163, + 1676, 1422, 2155, + 1629, 1453, 2143, + 1558, 1492, 2125, + 1442, 1539, 2101, + 1216, 1595, 2069, + 324, 1661, 2020, + 0, 1736, 1945, + 0, 1820, 1821, + 0, 1913, 1573, + 0, 2013, 6, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1781, 1335, 2185, + 1775, 1341, 2183, + 1767, 1350, 2181, + 1755, 1362, 2177, + 1739, 1377, 2171, + 1717, 1397, 2165, + 1686, 1421, 2157, + 1640, 1453, 2145, + 1571, 1491, 2127, + 1458, 1538, 2105, + 1242, 1594, 2071, + 485, 1660, 2023, + 0, 1735, 1949, + 0, 1820, 1826, + 0, 1912, 1582, + 0, 2013, 212, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1792, 1333, 2187, + 1786, 1340, 2185, + 1777, 1349, 2183, + 1766, 1361, 2179, + 1751, 1376, 2175, + 1729, 1395, 2169, + 1699, 1420, 2159, + 1654, 1452, 2147, + 1587, 1490, 2131, + 1479, 1537, 2107, + 1275, 1594, 2075, + 637, 1659, 2027, + 0, 1735, 1954, + 0, 1819, 1832, + 0, 1912, 1592, + 0, 2012, 393, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1805, 1331, 2191, + 1799, 1338, 2189, + 1791, 1347, 2187, + 1780, 1359, 2183, + 1765, 1374, 2179, + 1744, 1394, 2173, + 1715, 1419, 2163, + 1672, 1450, 2151, + 1608, 1489, 2135, + 1505, 1536, 2113, + 1316, 1593, 2079, + 784, 1659, 2032, + 0, 1734, 1960, + 0, 1819, 1840, + 0, 1912, 1606, + 0, 2012, 558, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1823, 1329, 2197, + 1817, 1336, 2195, + 1809, 1345, 2193, + 1799, 1356, 2189, + 1784, 1372, 2185, + 1764, 1392, 2177, + 1736, 1417, 2169, + 1695, 1448, 2157, + 1635, 1487, 2141, + 1538, 1535, 2119, + 1365, 1591, 2087, + 927, 1657, 2040, + 0, 1733, 1968, + 0, 1818, 1851, + 0, 1911, 1624, + 0, 2011, 713, + 0, 2119, 0, + 0, 2231, 0, + 0, 2347, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1845, 1325, 2203, + 1839, 1332, 2201, + 1832, 1341, 2199, + 1822, 1353, 2195, + 1809, 1369, 2191, + 1790, 1389, 2185, + 1763, 1414, 2177, + 1725, 1446, 2165, + 1668, 1485, 2149, + 1579, 1532, 2127, + 1424, 1589, 2095, + 1067, 1656, 2049, + 0, 1732, 1979, + 0, 1817, 1865, + 0, 1910, 1647, + 0, 2011, 862, + 0, 2117, 0, + 0, 2231, 0, + 0, 2347, 0, + 0, 2467, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1873, 1321, 2213, + 1868, 1328, 2211, + 1861, 1337, 2207, + 1852, 1349, 2205, + 1839, 1365, 2199, + 1821, 1385, 2193, + 1797, 1410, 2185, + 1761, 1442, 2175, + 1709, 1482, 2159, + 1628, 1530, 2137, + 1492, 1587, 2107, + 1205, 1653, 2061, + 0, 1730, 1994, + 0, 1815, 1884, + 0, 1909, 1677, + 0, 2010, 1006, + 0, 2117, 0, + 0, 2229, 0, + 0, 2347, 0, + 0, 2467, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1908, 1315, 2223, + 1904, 1322, 2221, + 1897, 1331, 2219, + 1889, 1343, 2217, + 1877, 1359, 2211, + 1861, 1379, 2205, + 1838, 1405, 2197, + 1806, 1437, 2187, + 1759, 1477, 2171, + 1687, 1526, 2151, + 1570, 1583, 2121, + 1341, 1650, 2077, + 404, 1727, 2012, + 0, 1813, 1907, + 0, 1907, 1713, + 0, 2008, 1147, + 0, 2117, 0, + 0, 2229, 0, + 0, 2347, 0, + 0, 2467, 0, + 0, 2591, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 1951, 1306, 2239, + 1947, 1313, 2237, + 1941, 1323, 2235, + 1934, 1335, 2231, + 1923, 1351, 2227, + 1908, 1372, 2221, + 1888, 1398, 2213, + 1859, 1431, 2203, + 1818, 1471, 2189, + 1755, 1520, 2167, + 1656, 1579, 2139, + 1476, 1646, 2097, + 1002, 1724, 2036, + 0, 1810, 1936, + 0, 1905, 1757, + 0, 2007, 1285, + 0, 2115, 0, + 0, 2227, 0, + 0, 2345, 0, + 0, 2467, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2003, 1294, 2257, + 2000, 1302, 2257, + 1994, 1312, 2253, + 1987, 1324, 2251, + 1978, 1341, 2247, + 1965, 1362, 2241, + 1947, 1389, 2233, + 1922, 1422, 2223, + 1886, 1463, 2209, + 1833, 1513, 2191, + 1751, 1572, 2163, + 1611, 1641, 2123, + 1312, 1719, 2065, + 0, 1806, 1973, + 0, 1902, 1811, + 0, 2004, 1422, + 0, 2113, 0, + 0, 2227, 0, + 0, 2345, 0, + 0, 2465, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2065, 1278, 2283, + 2061, 1286, 2281, + 2057, 1296, 2279, + 2051, 1309, 2275, + 2043, 1326, 2271, + 2031, 1348, 2267, + 2016, 1376, 2259, + 1994, 1410, 2249, + 1964, 1452, 2237, + 1920, 1503, 2219, + 1853, 1564, 2193, + 1745, 1634, 2157, + 1543, 1713, 2103, + 914, 1801, 2018, + 0, 1897, 1873, + 0, 2001, 1558, + 0, 2111, 0, + 0, 2225, 0, + 0, 2343, 0, + 0, 2465, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2841, 0, + 0, 2971, 0, + 0, 3099, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2135, 1256, 2313, + 2133, 1264, 2311, + 2129, 1275, 2309, + 2123, 1289, 2307, + 2117, 1306, 2303, + 2107, 1329, 2299, + 2095, 1358, 2291, + 2077, 1393, 2283, + 2051, 1437, 2271, + 2015, 1490, 2253, + 1961, 1552, 2231, + 1878, 1624, 2197, + 1737, 1704, 2147, + 1431, 1794, 2071, + 0, 1892, 1946, + 0, 1996, 1693, + 0, 2107, 0, + 0, 2221, 0, + 0, 2341, 0, + 0, 2463, 0, + 0, 2587, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2215, 1225, 2351, + 2213, 1233, 2349, + 2211, 1244, 2347, + 2205, 1259, 2345, + 2201, 1278, 2343, + 2193, 1302, 2337, + 2181, 1333, 2331, + 2167, 1370, 2323, + 2145, 1416, 2313, + 2117, 1471, 2297, + 2075, 1536, 2275, + 2011, 1610, 2245, + 1910, 1693, 2201, + 1725, 1785, 2135, + 1221, 1884, 2027, + 0, 1990, 1827, + 0, 2101, 1211, + 0, 2219, 0, + 0, 2337, 0, + 0, 2461, 0, + 0, 2585, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 2305, 1179, 2397, + 2303, 1188, 2397, + 2301, 1200, 2395, + 2297, 1217, 2393, + 2293, 1237, 2389, + 2285, 1264, 2385, + 2277, 1297, 2381, + 2265, 1337, 2373, + 2249, 1387, 2363, + 2225, 1445, 2349, + 2193, 1513, 2329, + 2145, 1591, 2303, + 2071, 1677, 2265, + 1949, 1772, 2207, + 1710, 1874, 2117, + 517, 1982, 1960, + 0, 2095, 1594, + 0, 2213, 0, + 0, 2335, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 2401, 1109, 2453, + 2401, 1120, 2453, + 2399, 1134, 2451, + 2395, 1153, 2449, + 2391, 1177, 2447, + 2387, 1206, 2443, + 2379, 1244, 2437, + 2369, 1289, 2431, + 2357, 1344, 2423, + 2339, 1407, 2411, + 2313, 1481, 2393, + 2277, 1564, 2371, + 2223, 1655, 2337, + 2139, 1754, 2289, + 1997, 1860, 2215, + 1688, 1971, 2093, + 0, 2087, 1852, + 0, 2207, 583, + 0, 2329, 0, + 0, 2453, 0, + 0, 2581, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2505, 995, 2519, + 2505, 1009, 2517, + 2503, 1027, 2517, + 2501, 1050, 2515, + 2497, 1080, 2513, + 2493, 1117, 2509, + 2489, 1162, 2505, + 2481, 1216, 2499, + 2471, 1279, 2491, + 2457, 1352, 2481, + 2437, 1434, 2467, + 2409, 1525, 2447, + 2369, 1623, 2419, + 2311, 1729, 2381, + 2219, 1840, 2321, + 2055, 1955, 2227, + 1658, 2075, 2059, + 0, 2197, 1649, + 0, 2321, 0, + 0, 2449, 0, + 0, 2577, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2615, 775, 2593, + 2615, 798, 2593, + 2613, 827, 2591, + 2611, 863, 2589, + 2609, 907, 2587, + 2607, 960, 2585, + 2601, 1022, 2581, + 2597, 1094, 2577, + 2589, 1175, 2571, + 2577, 1265, 2561, + 2563, 1363, 2551, + 2541, 1467, 2533, + 2513, 1578, 2511, + 2471, 1693, 2479, + 2407, 1812, 2431, + 2305, 1934, 2359, + 2121, 2059, 2241, + 1614, 2185, 2009, + 0, 2313, 1012, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2731, 0, 2677, + 2729, 94, 2677, + 2729, 216, 2675, + 2727, 341, 2675, + 2725, 467, 2673, + 2723, 595, 2671, + 2719, 724, 2667, + 2715, 853, 2663, + 2709, 984, 2659, + 2701, 1114, 2651, + 2689, 1245, 2641, + 2675, 1377, 2629, + 2653, 1508, 2609, + 2621, 1640, 2583, + 2577, 1772, 2547, + 2511, 1904, 2491, + 2401, 2035, 2407, + 2197, 2167, 2259, + 1547, 2299, 1931, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2849, 0, 2769, + 2849, 0, 2769, + 2847, 0, 2767, + 2847, 0, 2767, + 2845, 0, 2765, + 2843, 0, 2763, + 2841, 0, 2761, + 2837, 0, 2759, + 2833, 436, 2755, + 2827, 776, 2749, + 2819, 1018, 2741, + 2807, 1218, 2729, + 2791, 1395, 2715, + 2769, 1558, 2695, + 2737, 1712, 2665, + 2689, 1859, 2625, + 2619, 2003, 2561, + 2503, 2143, 2463, + 2281, 2281, 2281, + 1438, 2419, 1802, + 0, 2553, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2971, 0, 2869, + 2971, 0, 2869, + 2971, 0, 2867, + 2969, 0, 2867, + 2969, 0, 2867, + 2967, 0, 2865, + 2965, 0, 2863, + 2963, 0, 2861, + 2959, 0, 2857, + 2953, 0, 2853, + 2947, 96, 2847, + 2939, 845, 2837, + 2927, 1178, 2827, + 2911, 1418, 2811, + 2887, 1617, 2789, + 2855, 1793, 2757, + 2807, 1955, 2711, + 2733, 2109, 2641, + 2613, 2257, 2527, + 2375, 2399, 2311, + 1236, 2539, 1536, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3095, 0, 2975, + 3095, 0, 2975, + 3095, 0, 2975, + 3095, 0, 2973, + 3093, 0, 2973, + 3093, 0, 2973, + 3091, 0, 2971, + 3089, 0, 2969, + 3085, 0, 2965, + 3083, 0, 2963, + 3077, 0, 2957, + 3071, 0, 2951, + 3063, 409, 2941, + 3049, 1119, 2929, + 3033, 1447, 2913, + 3009, 1685, 2889, + 2975, 1883, 2855, + 2927, 2059, 2805, + 2851, 2221, 2729, + 2727, 2373, 2603, + 2475, 2521, 2347, + 602, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3221, 0, 3087, + 3221, 0, 3087, + 3221, 0, 3087, + 3221, 0, 3087, + 3219, 0, 3085, + 3219, 0, 3085, + 3217, 0, 3083, + 3217, 0, 3083, + 3215, 0, 3079, + 3211, 0, 3077, + 3209, 0, 3073, + 3203, 0, 3069, + 3197, 0, 3061, + 3187, 0, 3051, + 3175, 1026, 3039, + 3159, 1483, 3021, + 3135, 1763, 2997, + 3099, 1980, 2961, + 3049, 2167, 2907, + 2973, 2337, 2825, + 2845, 2495, 2687, + 2583, 2645, 2391, + 0, 2791, 0, + 0, 2933, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3615, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3349, 0, 3203, + 3349, 0, 3203, + 3349, 0, 3203, + 3349, 0, 3203, + 3347, 0, 3203, + 3347, 0, 3201, + 3347, 0, 3201, + 3345, 0, 3199, + 3343, 0, 3199, + 3341, 0, 3195, + 3339, 0, 3193, + 3335, 0, 3189, + 3331, 0, 3183, + 3323, 0, 3177, + 3315, 0, 3167, + 3303, 861, 3153, + 3285, 1528, 3135, + 3261, 1850, 3109, + 3225, 2085, 3071, + 3175, 2281, 3015, + 3097, 2457, 2929, + 2965, 2617, 2779, + 2695, 2771, 2445, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3475, 0, 3321, + 3475, 0, 3321, + 3473, 0, 3319, + 3473, 0, 3317, + 3471, 0, 3315, + 3467, 0, 3313, + 3463, 0, 3309, + 3459, 0, 3303, + 3453, 0, 3295, + 3443, 0, 3285, + 3431, 462, 3271, + 3413, 1581, 3253, + 3389, 1945, 3225, + 3353, 2195, 3187, + 3303, 2399, 3129, + 3223, 2579, 3039, + 3089, 2743, 2879, + 2813, 2899, 2507, + 0, 3047, 0, + 0, 3191, 0, + 0, 3331, 0, + 0, 3469, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3607, 0, 3447, + 3607, 0, 3447, + 3607, 0, 3447, + 3607, 0, 3447, + 3607, 0, 3445, + 3607, 0, 3445, + 3605, 0, 3445, + 3605, 0, 3445, + 3605, 0, 3443, + 3603, 0, 3441, + 3601, 0, 3441, + 3599, 0, 3439, + 3597, 0, 3435, + 3593, 0, 3431, + 3589, 0, 3425, + 3581, 0, 3417, + 3573, 0, 3407, + 3559, 0, 3393, + 3541, 1644, 3373, + 3517, 2047, 3347, + 3483, 2311, 3307, + 3431, 2521, 3247, + 3351, 2703, 3153, + 3215, 2871, 2987, + 2933, 3027, 2579, + 0, 3177, 0, + 0, 3321, 0, + 0, 3463, 0, + 0, 3601, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3569, + 3735, 0, 3569, + 3735, 0, 3569, + 3733, 0, 3567, + 3731, 0, 3565, + 3729, 0, 3563, + 3727, 0, 3559, + 3723, 0, 3555, + 3719, 0, 3549, + 3711, 0, 3543, + 3703, 0, 3531, + 3689, 0, 3517, + 3671, 1717, 3497, + 3647, 2155, 3469, + 3611, 2429, 3429, + 3559, 2645, 3367, + 3479, 2831, 3271, + 3343, 2999, 3099, + 3057, 3157, 2661, + 0, 3307, 0, + 0, 3451, 0, + 0, 3593, 0, + 0, 3733, 0, + 0, 3869, 0, + 0, 4005, 0, + 3869, 0, 3699, + 3869, 0, 3699, + 3869, 0, 3699, + 3869, 0, 3699, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3695, + 3865, 0, 3695, + 3865, 0, 3693, + 3863, 0, 3691, + 3861, 0, 3689, + 3857, 0, 3687, + 3853, 0, 3683, + 3849, 0, 3677, + 3841, 0, 3669, + 3833, 0, 3657, + 3819, 0, 3643, + 3801, 1798, 3623, + 3777, 2269, 3595, + 3741, 2551, 3553, + 3689, 2771, 3491, + 3609, 2959, 3393, + 3471, 3129, 3215, + 3181, 3287, 2751, + 0, 3437, 0, + 0, 3583, 0, + 0, 3725, 0, + 0, 3865, 0, + 0, 4001, 0, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3825, + 3999, 0, 3825, + 3999, 0, 3825, + 3997, 0, 3825, + 3997, 0, 3823, + 3997, 0, 3823, + 3995, 0, 3821, + 3993, 0, 3819, + 3991, 0, 3817, + 3989, 0, 3815, + 3985, 0, 3809, + 3979, 0, 3805, + 3973, 0, 3797, + 3963, 0, 3785, + 3951, 0, 3771, + 3933, 1889, 3751, + 3907, 2387, 3721, + 3873, 2677, 3679, + 3819, 2899, 3617, + 3739, 3087, 3517, + 3601, 3259, 3335, + 3309, 3417, 2849, + 0, 3569, 0, + 0, 3715, 0, + 0, 3857, 0, + 0, 3995, 0, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3943, + 4095, 0, 3939, + 4095, 0, 3933, + 4095, 0, 3925, + 4095, 0, 3915, + 4081, 0, 3899, + 4063, 1987, 3879, + 4039, 2507, 3849, + 4003, 2803, 3807, + 3951, 3027, 3745, + 3869, 3217, 3643, + 3731, 3389, 3459, + 3437, 3549, 2955, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4063, + 4095, 0, 4055, + 4095, 0, 4043, + 4095, 0, 4029, + 4095, 2093, 4009, + 4095, 2631, 3979, + 4095, 2931, 3937, + 4081, 3157, 3873, + 4001, 3347, 3771, + 3861, 3519, 3583, + 3567, 3679, 3065, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2203, 4095, + 4095, 2757, 4095, + 4095, 3059, 4067, + 4095, 3287, 4003, + 4095, 3479, 3899, + 3993, 3651, 3711, + 3697, 3811, 3181, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2319, 4095, + 4095, 2885, 4095, + 4095, 3189, 4095, + 4095, 3417, 4095, + 4095, 3609, 4029, + 4095, 3783, 3839, + 3827, 3943, 3299, + 1904, 1463, 2315, + 1900, 1469, 2313, + 1893, 1475, 2311, + 1884, 1484, 2309, + 1873, 1496, 2305, + 1856, 1511, 2301, + 1833, 1530, 2293, + 1801, 1555, 2285, + 1753, 1586, 2273, + 1681, 1625, 2255, + 1561, 1672, 2233, + 1327, 1728, 2199, + 282, 1793, 2149, + 0, 1868, 2075, + 0, 1952, 1949, + 0, 2045, 1699, + 0, 2145, 0, + 0, 2253, 0, + 0, 2365, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1910, 1463, 2317, + 1906, 1468, 2315, + 1899, 1475, 2313, + 1891, 1483, 2311, + 1879, 1495, 2307, + 1863, 1510, 2301, + 1840, 1530, 2295, + 1808, 1554, 2287, + 1761, 1586, 2275, + 1690, 1624, 2257, + 1574, 1671, 2235, + 1348, 1727, 2201, + 456, 1793, 2151, + 0, 1868, 2077, + 0, 1952, 1953, + 0, 2045, 1706, + 0, 2145, 138, + 0, 2251, 0, + 0, 2365, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1918, 1462, 2319, + 1913, 1467, 2317, + 1907, 1474, 2315, + 1899, 1482, 2313, + 1887, 1494, 2309, + 1871, 1509, 2305, + 1849, 1529, 2297, + 1818, 1554, 2289, + 1772, 1585, 2277, + 1703, 1623, 2261, + 1590, 1670, 2237, + 1374, 1727, 2203, + 617, 1792, 2155, + 0, 1867, 2081, + 0, 1952, 1958, + 0, 2045, 1714, + 0, 2145, 344, + 0, 2251, 0, + 0, 2363, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1928, 1460, 2321, + 1924, 1465, 2319, + 1918, 1472, 2317, + 1909, 1481, 2315, + 1898, 1493, 2311, + 1883, 1508, 2307, + 1861, 1528, 2301, + 1831, 1552, 2291, + 1786, 1584, 2279, + 1719, 1622, 2263, + 1611, 1670, 2241, + 1407, 1726, 2207, + 769, 1792, 2159, + 0, 1867, 2085, + 0, 1951, 1964, + 0, 2044, 1724, + 0, 2145, 525, + 0, 2251, 0, + 0, 2363, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1942, 1458, 2325, + 1937, 1463, 2323, + 1931, 1470, 2321, + 1923, 1479, 2319, + 1912, 1491, 2315, + 1897, 1506, 2311, + 1877, 1526, 2305, + 1847, 1551, 2295, + 1804, 1582, 2283, + 1740, 1621, 2267, + 1637, 1668, 2245, + 1448, 1725, 2213, + 916, 1791, 2165, + 0, 1866, 2093, + 0, 1951, 1972, + 0, 2044, 1738, + 0, 2145, 690, + 0, 2251, 0, + 0, 2363, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1959, 1456, 2331, + 1955, 1461, 2329, + 1949, 1468, 2327, + 1941, 1477, 2325, + 1931, 1489, 2321, + 1916, 1504, 2317, + 1896, 1524, 2309, + 1868, 1549, 2301, + 1828, 1580, 2289, + 1767, 1619, 2273, + 1670, 1667, 2251, + 1497, 1723, 2219, + 1059, 1789, 2171, + 0, 1865, 2101, + 0, 1950, 1983, + 0, 2043, 1757, + 0, 2143, 845, + 0, 2251, 0, + 0, 2363, 0, + 0, 2479, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1981, 1452, 2337, + 1977, 1457, 2335, + 1972, 1464, 2333, + 1964, 1474, 2331, + 1954, 1485, 2327, + 1941, 1501, 2323, + 1922, 1521, 2317, + 1895, 1546, 2309, + 1857, 1578, 2297, + 1800, 1617, 2281, + 1711, 1665, 2259, + 1556, 1721, 2227, + 1199, 1788, 2181, + 0, 1864, 2111, + 0, 1949, 1998, + 0, 2042, 1780, + 0, 2143, 994, + 0, 2251, 0, + 0, 2363, 0, + 0, 2479, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2009, 1448, 2345, + 2005, 1453, 2345, + 2000, 1460, 2343, + 1993, 1469, 2339, + 1984, 1481, 2337, + 1971, 1497, 2333, + 1953, 1517, 2325, + 1929, 1542, 2317, + 1893, 1574, 2307, + 1841, 1614, 2291, + 1761, 1662, 2269, + 1624, 1719, 2239, + 1337, 1786, 2193, + 0, 1862, 2125, + 0, 1947, 2016, + 0, 2041, 1809, + 0, 2141, 1138, + 0, 2249, 0, + 0, 2363, 0, + 0, 2479, 0, + 0, 2599, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2044, 1441, 2357, + 2040, 1447, 2355, + 2036, 1454, 2353, + 2029, 1463, 2351, + 2021, 1475, 2349, + 2009, 1491, 2343, + 1993, 1511, 2337, + 1970, 1537, 2329, + 1938, 1569, 2319, + 1891, 1609, 2303, + 1819, 1658, 2283, + 1702, 1715, 2253, + 1473, 1783, 2209, + 536, 1859, 2145, + 0, 1945, 2039, + 0, 2039, 1845, + 0, 2141, 1279, + 0, 2249, 0, + 0, 2361, 0, + 0, 2479, 0, + 0, 2599, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2087, 1433, 2371, + 2083, 1438, 2371, + 2079, 1445, 2369, + 2073, 1455, 2367, + 2065, 1467, 2363, + 2055, 1483, 2359, + 2040, 1504, 2353, + 2020, 1530, 2345, + 1991, 1563, 2335, + 1950, 1603, 2321, + 1887, 1652, 2299, + 1788, 1711, 2271, + 1609, 1779, 2229, + 1134, 1856, 2167, + 0, 1942, 2069, + 0, 2037, 1889, + 0, 2139, 1417, + 0, 2247, 0, + 0, 2361, 0, + 0, 2477, 0, + 0, 2599, 0, + 0, 2723, 0, + 0, 2847, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2139, 1421, 2391, + 2135, 1427, 2389, + 2131, 1434, 2389, + 2127, 1444, 2385, + 2119, 1456, 2383, + 2111, 1473, 2379, + 2097, 1494, 2373, + 2079, 1521, 2365, + 2055, 1554, 2355, + 2018, 1595, 2341, + 1965, 1645, 2323, + 1883, 1704, 2295, + 1743, 1773, 2255, + 1444, 1851, 2197, + 0, 1938, 2105, + 0, 2034, 1943, + 0, 2137, 1554, + 0, 2245, 0, + 0, 2359, 0, + 0, 2477, 0, + 0, 2597, 0, + 0, 2721, 0, + 0, 2847, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2199, 1405, 2415, + 2197, 1411, 2415, + 2193, 1418, 2413, + 2189, 1428, 2411, + 2183, 1441, 2407, + 2175, 1458, 2403, + 2163, 1480, 2399, + 2149, 1508, 2391, + 2127, 1542, 2383, + 2097, 1584, 2369, + 2051, 1635, 2351, + 1985, 1696, 2325, + 1877, 1766, 2289, + 1675, 1845, 2235, + 1046, 1933, 2149, + 0, 2030, 2005, + 0, 2133, 1690, + 0, 2243, 0, + 0, 2357, 0, + 0, 2475, 0, + 0, 2597, 0, + 0, 2721, 0, + 0, 2847, 0, + 0, 2973, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2269, 1382, 2447, + 2267, 1388, 2445, + 2265, 1396, 2443, + 2261, 1407, 2441, + 2255, 1421, 2439, + 2249, 1438, 2435, + 2239, 1461, 2431, + 2227, 1490, 2423, + 2209, 1526, 2415, + 2183, 1569, 2403, + 2147, 1622, 2385, + 2093, 1684, 2363, + 2010, 1756, 2329, + 1869, 1837, 2279, + 1564, 1926, 2203, + 0, 2024, 2077, + 0, 2129, 1825, + 0, 2239, 0, + 0, 2353, 0, + 0, 2473, 0, + 0, 2595, 0, + 0, 2719, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2349, 1350, 2485, + 2347, 1357, 2483, + 2345, 1365, 2481, + 2343, 1377, 2481, + 2339, 1391, 2477, + 2333, 1410, 2475, + 2325, 1434, 2469, + 2313, 1465, 2463, + 2299, 1502, 2455, + 2279, 1548, 2445, + 2249, 1603, 2429, + 2207, 1668, 2407, + 2143, 1742, 2377, + 2042, 1825, 2333, + 1857, 1917, 2267, + 1353, 2016, 2159, + 0, 2123, 1959, + 0, 2233, 1343, + 0, 2351, 0, + 0, 2469, 0, + 0, 2593, 0, + 0, 2717, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2439, 1303, 2531, + 2437, 1311, 2529, + 2435, 1320, 2529, + 2433, 1333, 2527, + 2429, 1349, 2525, + 2425, 1369, 2521, + 2417, 1396, 2517, + 2409, 1429, 2513, + 2397, 1469, 2505, + 2381, 1519, 2495, + 2357, 1577, 2481, + 2325, 1645, 2463, + 2277, 1723, 2435, + 2203, 1809, 2397, + 2081, 1904, 2339, + 1842, 2006, 2249, + 650, 2115, 2093, + 0, 2227, 1726, + 0, 2345, 0, + 0, 2467, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2535, 1232, 2587, + 2535, 1241, 2585, + 2533, 1252, 2585, + 2531, 1266, 2583, + 2527, 1285, 2581, + 2523, 1309, 2579, + 2519, 1339, 2575, + 2511, 1376, 2569, + 2503, 1421, 2563, + 2489, 1476, 2555, + 2471, 1540, 2543, + 2445, 1613, 2527, + 2409, 1696, 2503, + 2355, 1787, 2469, + 2271, 1886, 2421, + 2129, 1992, 2347, + 1820, 2103, 2225, + 0, 2219, 1984, + 0, 2339, 715, + 0, 2461, 0, + 0, 2585, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 2639, 1115, 2651, + 2639, 1126, 2651, + 2637, 1141, 2649, + 2635, 1159, 2649, + 2633, 1182, 2647, + 2629, 1212, 2645, + 2625, 1249, 2641, + 2621, 1294, 2637, + 2613, 1348, 2631, + 2603, 1411, 2623, + 2589, 1484, 2613, + 2569, 1566, 2599, + 2541, 1657, 2579, + 2503, 1756, 2553, + 2443, 1861, 2513, + 2351, 1972, 2453, + 2187, 2087, 2359, + 1790, 2207, 2191, + 0, 2329, 1781, + 0, 2455, 0, + 0, 2581, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2749, 890, 2725, + 2749, 908, 2725, + 2747, 930, 2725, + 2745, 959, 2723, + 2743, 995, 2721, + 2741, 1039, 2719, + 2739, 1092, 2717, + 2735, 1154, 2713, + 2729, 1226, 2709, + 2721, 1307, 2703, + 2709, 1397, 2695, + 2695, 1495, 2683, + 2673, 1599, 2665, + 2645, 1710, 2643, + 2603, 1825, 2611, + 2539, 1944, 2563, + 2437, 2067, 2491, + 2253, 2191, 2373, + 1746, 2317, 2141, + 0, 2445, 1143, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2863, 0, 2809, + 2863, 107, 2809, + 2863, 226, 2809, + 2861, 348, 2807, + 2859, 473, 2807, + 2857, 599, 2805, + 2855, 727, 2803, + 2851, 856, 2799, + 2847, 986, 2795, + 2841, 1116, 2791, + 2833, 1246, 2783, + 2821, 1377, 2773, + 2807, 1509, 2761, + 2785, 1640, 2741, + 2755, 1772, 2715, + 2709, 1904, 2679, + 2643, 2036, 2623, + 2533, 2167, 2539, + 2329, 2299, 2391, + 1679, 2431, 2063, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2981, 0, 2901, + 2981, 0, 2901, + 2981, 0, 2901, + 2981, 0, 2899, + 2979, 0, 2899, + 2977, 0, 2897, + 2975, 0, 2895, + 2973, 0, 2893, + 2969, 0, 2891, + 2965, 568, 2887, + 2959, 908, 2881, + 2951, 1150, 2873, + 2939, 1350, 2861, + 2923, 1527, 2847, + 2901, 1690, 2827, + 2869, 1844, 2797, + 2821, 1992, 2757, + 2751, 2135, 2693, + 2635, 2275, 2595, + 2413, 2413, 2413, + 1570, 2551, 1934, + 0, 2685, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 3103, 0, 3001, + 3103, 0, 3001, + 3103, 0, 3001, + 3103, 0, 3001, + 3101, 0, 2999, + 3101, 0, 2999, + 3099, 0, 2997, + 3097, 0, 2995, + 3095, 0, 2993, + 3091, 0, 2989, + 3087, 0, 2985, + 3079, 228, 2979, + 3071, 978, 2969, + 3059, 1310, 2959, + 3043, 1550, 2943, + 3019, 1749, 2921, + 2987, 1925, 2889, + 2939, 2087, 2843, + 2865, 2241, 2773, + 2745, 2389, 2659, + 2507, 2531, 2443, + 1368, 2673, 1669, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3227, 0, 3107, + 3227, 0, 3107, + 3227, 0, 3107, + 3227, 0, 3107, + 3227, 0, 3107, + 3225, 0, 3105, + 3225, 0, 3105, + 3223, 0, 3103, + 3221, 0, 3101, + 3219, 0, 3099, + 3215, 0, 3095, + 3209, 0, 3089, + 3203, 0, 3083, + 3195, 541, 3073, + 3183, 1251, 3061, + 3165, 1579, 3045, + 3141, 1817, 3021, + 3109, 2015, 2987, + 3059, 2191, 2937, + 2983, 2353, 2861, + 2859, 2505, 2735, + 2609, 2653, 2479, + 735, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3217, + 3351, 0, 3217, + 3351, 0, 3215, + 3349, 0, 3215, + 3347, 0, 3213, + 3343, 0, 3209, + 3341, 0, 3205, + 3335, 0, 3201, + 3329, 0, 3193, + 3319, 0, 3185, + 3307, 1158, 3171, + 3291, 1616, 3153, + 3267, 1895, 3129, + 3233, 2113, 3093, + 3183, 2299, 3039, + 3105, 2469, 2957, + 2977, 2627, 2819, + 2715, 2777, 2523, + 0, 2923, 0, + 0, 3065, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3481, 0, 3337, + 3481, 0, 3335, + 3481, 0, 3335, + 3481, 0, 3335, + 3481, 0, 3335, + 3481, 0, 3335, + 3479, 0, 3333, + 3479, 0, 3333, + 3477, 0, 3331, + 3475, 0, 3331, + 3473, 0, 3327, + 3471, 0, 3325, + 3467, 0, 3321, + 3463, 0, 3315, + 3455, 0, 3309, + 3447, 0, 3299, + 3435, 994, 3285, + 3417, 1660, 3267, + 3393, 1982, 3241, + 3359, 2217, 3203, + 3307, 2413, 3147, + 3229, 2589, 3061, + 3097, 2749, 2911, + 2827, 2903, 2577, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3611, 0, 3457, + 3611, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3607, 0, 3453, + 3607, 0, 3453, + 3605, 0, 3451, + 3605, 0, 3449, + 3603, 0, 3447, + 3599, 0, 3445, + 3595, 0, 3441, + 3591, 0, 3435, + 3585, 0, 3427, + 3575, 0, 3417, + 3563, 594, 3403, + 3545, 1714, 3385, + 3521, 2077, 3357, + 3485, 2327, 3319, + 3435, 2531, 3261, + 3355, 2711, 3171, + 3221, 2875, 3011, + 2945, 3031, 2639, + 0, 3179, 0, + 0, 3323, 0, + 0, 3463, 0, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3577, + 3739, 0, 3577, + 3739, 0, 3577, + 3737, 0, 3577, + 3737, 0, 3575, + 3735, 0, 3575, + 3733, 0, 3573, + 3731, 0, 3571, + 3729, 0, 3567, + 3725, 0, 3563, + 3721, 0, 3557, + 3713, 0, 3549, + 3705, 0, 3539, + 3691, 0, 3525, + 3673, 1776, 3505, + 3649, 2179, 3479, + 3615, 2443, 3439, + 3563, 2653, 3379, + 3483, 2835, 3285, + 3347, 3003, 3119, + 3065, 3159, 2711, + 0, 3309, 0, + 0, 3453, 0, + 0, 3595, 0, + 0, 3733, 0, + 0, 3871, 0, + 0, 4007, 0, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3701, + 3867, 0, 3701, + 3867, 0, 3701, + 3865, 0, 3699, + 3863, 0, 3697, + 3861, 0, 3695, + 3859, 0, 3691, + 3855, 0, 3687, + 3851, 0, 3683, + 3843, 0, 3675, + 3835, 0, 3663, + 3821, 0, 3649, + 3803, 1849, 3629, + 3779, 2287, 3601, + 3743, 2561, 3561, + 3691, 2777, 3499, + 3611, 2963, 3403, + 3475, 3131, 3231, + 3189, 3289, 2793, + 0, 3439, 0, + 0, 3583, 0, + 0, 3725, 0, + 0, 3865, 0, + 0, 4001, 0, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 3999, 0, 3829, + 3999, 0, 3829, + 3999, 0, 3829, + 3999, 0, 3829, + 3999, 0, 3827, + 3997, 0, 3827, + 3997, 0, 3825, + 3995, 0, 3823, + 3993, 0, 3821, + 3989, 0, 3819, + 3985, 0, 3815, + 3981, 0, 3809, + 3975, 0, 3801, + 3965, 0, 3791, + 3951, 0, 3775, + 3935, 1931, 3755, + 3909, 2401, 3727, + 3873, 2683, 3685, + 3821, 2903, 3623, + 3741, 3091, 3525, + 3603, 3261, 3347, + 3313, 3419, 2883, + 0, 3569, 0, + 0, 3715, 0, + 0, 3857, 0, + 0, 3997, 0, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3943, + 4095, 0, 3937, + 4095, 0, 3929, + 4095, 0, 3917, + 4083, 0, 3903, + 4065, 2021, 3883, + 4041, 2519, 3853, + 4005, 2809, 3811, + 3951, 3031, 3749, + 3871, 3219, 3649, + 3733, 3391, 3467, + 3441, 3549, 2981, + 0, 3701, 0, + 0, 3847, 0, + 0, 3989, 0, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4075, + 4095, 0, 4071, + 4095, 0, 4065, + 4095, 0, 4057, + 4095, 0, 4047, + 4095, 0, 4031, + 4095, 2119, 4011, + 4095, 2639, 3981, + 4095, 2935, 3939, + 4083, 3159, 3877, + 4001, 3349, 3775, + 3863, 3521, 3591, + 3569, 3681, 3087, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2225, 4095, + 4095, 2763, 4095, + 4095, 3063, 4069, + 4095, 3289, 4005, + 4095, 3479, 3903, + 3993, 3651, 3715, + 3699, 3811, 3197, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2335, 4095, + 4095, 2889, 4095, + 4095, 3191, 4095, + 4095, 3419, 4095, + 4095, 3611, 4031, + 4095, 3783, 3843, + 3829, 3943, 3313, + 2035, 1592, 2447, + 2032, 1596, 2445, + 2027, 1601, 2445, + 2021, 1608, 2443, + 2012, 1617, 2439, + 2000, 1629, 2435, + 1983, 1644, 2431, + 1960, 1663, 2425, + 1927, 1688, 2415, + 1879, 1719, 2403, + 1805, 1757, 2387, + 1684, 1804, 2363, + 1443, 1860, 2329, + 219, 1926, 2281, + 0, 2001, 2205, + 0, 2085, 2079, + 0, 2177, 1827, + 0, 2277, 0, + 0, 2385, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2857, 0, + 0, 2981, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2040, 1592, 2447, + 2036, 1596, 2447, + 2032, 1601, 2445, + 2025, 1607, 2443, + 2017, 1616, 2441, + 2005, 1628, 2437, + 1988, 1643, 2433, + 1965, 1662, 2425, + 1933, 1687, 2417, + 1885, 1718, 2405, + 1813, 1757, 2387, + 1693, 1804, 2365, + 1459, 1860, 2331, + 414, 1925, 2281, + 0, 2000, 2207, + 0, 2085, 2081, + 0, 2177, 1831, + 0, 2277, 16, + 0, 2385, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2857, 0, + 0, 2981, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2046, 1591, 2449, + 2042, 1595, 2449, + 2038, 1600, 2447, + 2031, 1607, 2445, + 2023, 1616, 2443, + 2011, 1627, 2439, + 1995, 1642, 2433, + 1972, 1662, 2427, + 1940, 1687, 2419, + 1894, 1718, 2407, + 1822, 1756, 2389, + 1706, 1803, 2367, + 1480, 1859, 2333, + 588, 1925, 2285, + 0, 2000, 2209, + 0, 2085, 2085, + 0, 2177, 1838, + 0, 2277, 270, + 0, 2385, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2053, 1590, 2451, + 2051, 1594, 2451, + 2046, 1599, 2449, + 2039, 1606, 2447, + 2031, 1615, 2445, + 2019, 1626, 2441, + 2004, 1641, 2437, + 1981, 1661, 2429, + 1950, 1686, 2421, + 1904, 1717, 2409, + 1835, 1756, 2393, + 1722, 1803, 2369, + 1507, 1859, 2335, + 749, 1924, 2287, + 0, 2000, 2213, + 0, 2083, 2089, + 0, 2177, 1846, + 0, 2277, 476, + 0, 2383, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2063, 1588, 2455, + 2061, 1592, 2453, + 2055, 1597, 2453, + 2049, 1604, 2451, + 2042, 1613, 2447, + 2030, 1625, 2443, + 2015, 1640, 2439, + 1993, 1660, 2433, + 1963, 1685, 2423, + 1918, 1716, 2411, + 1851, 1755, 2395, + 1743, 1802, 2373, + 1540, 1858, 2339, + 902, 1924, 2291, + 0, 1999, 2217, + 0, 2083, 2097, + 0, 2177, 1857, + 0, 2277, 657, + 0, 2383, 0, + 0, 2495, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2077, 1586, 2459, + 2073, 1590, 2457, + 2069, 1596, 2455, + 2063, 1602, 2453, + 2055, 1611, 2451, + 2045, 1623, 2447, + 2030, 1638, 2443, + 2009, 1658, 2437, + 1979, 1683, 2429, + 1937, 1714, 2417, + 1872, 1753, 2399, + 1769, 1801, 2377, + 1580, 1857, 2345, + 1048, 1923, 2297, + 0, 1998, 2225, + 0, 2083, 2105, + 0, 2175, 1871, + 0, 2277, 822, + 0, 2383, 0, + 0, 2495, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2095, 1584, 2463, + 2091, 1588, 2463, + 2087, 1593, 2461, + 2081, 1600, 2459, + 2073, 1609, 2457, + 2063, 1621, 2453, + 2049, 1636, 2449, + 2029, 1656, 2441, + 2000, 1681, 2433, + 1960, 1712, 2421, + 1899, 1751, 2405, + 1802, 1799, 2383, + 1630, 1855, 2351, + 1191, 1922, 2303, + 0, 1997, 2233, + 0, 2081, 2115, + 0, 2175, 1889, + 0, 2275, 977, + 0, 2383, 0, + 0, 2495, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2117, 1580, 2471, + 2113, 1584, 2469, + 2109, 1590, 2467, + 2103, 1597, 2465, + 2097, 1606, 2463, + 2087, 1618, 2459, + 2073, 1633, 2455, + 2053, 1653, 2449, + 2027, 1678, 2441, + 1989, 1710, 2429, + 1932, 1749, 2413, + 1843, 1797, 2391, + 1688, 1854, 2359, + 1331, 1920, 2313, + 0, 1996, 2243, + 0, 2081, 2129, + 0, 2175, 1912, + 0, 2275, 1126, + 0, 2383, 0, + 0, 2495, 0, + 0, 2611, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2143, 1576, 2479, + 2141, 1580, 2477, + 2137, 1585, 2477, + 2133, 1592, 2475, + 2125, 1601, 2473, + 2117, 1613, 2469, + 2103, 1629, 2465, + 2085, 1649, 2459, + 2061, 1674, 2449, + 2025, 1706, 2439, + 1973, 1746, 2423, + 1893, 1794, 2401, + 1756, 1851, 2371, + 1469, 1918, 2325, + 0, 1994, 2257, + 0, 2079, 2147, + 0, 2173, 1941, + 0, 2273, 1270, + 0, 2381, 0, + 0, 2495, 0, + 0, 2611, 0, + 0, 2731, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2179, 1569, 2491, + 2175, 1573, 2489, + 2173, 1579, 2487, + 2167, 1586, 2487, + 2161, 1595, 2483, + 2153, 1607, 2481, + 2141, 1623, 2475, + 2125, 1643, 2471, + 2103, 1669, 2461, + 2069, 1701, 2451, + 2023, 1741, 2435, + 1951, 1790, 2415, + 1834, 1848, 2385, + 1605, 1915, 2341, + 668, 1991, 2277, + 0, 2077, 2171, + 0, 2171, 1977, + 0, 2273, 1411, + 0, 2381, 0, + 0, 2493, 0, + 0, 2611, 0, + 0, 2731, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2221, 1561, 2505, + 2219, 1565, 2505, + 2215, 1570, 2503, + 2211, 1578, 2501, + 2205, 1587, 2499, + 2197, 1599, 2495, + 2187, 1615, 2491, + 2173, 1636, 2485, + 2153, 1662, 2477, + 2123, 1695, 2467, + 2081, 1736, 2453, + 2020, 1785, 2433, + 1920, 1843, 2403, + 1741, 1911, 2361, + 1266, 1988, 2299, + 0, 2075, 2201, + 0, 2169, 2022, + 0, 2271, 1549, + 0, 2379, 0, + 0, 2493, 0, + 0, 2609, 0, + 0, 2731, 0, + 0, 2855, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2273, 1549, 2525, + 2271, 1553, 2523, + 2267, 1559, 2521, + 2263, 1566, 2521, + 2259, 1576, 2519, + 2251, 1589, 2515, + 2243, 1605, 2511, + 2229, 1626, 2505, + 2211, 1653, 2497, + 2187, 1686, 2487, + 2151, 1727, 2473, + 2097, 1777, 2455, + 2015, 1837, 2427, + 1875, 1905, 2387, + 1576, 1983, 2329, + 0, 2071, 2237, + 0, 2165, 2075, + 0, 2269, 1686, + 0, 2377, 0, + 0, 2491, 0, + 0, 2609, 0, + 0, 2729, 0, + 0, 2853, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2333, 1532, 2549, + 2331, 1537, 2547, + 2329, 1543, 2547, + 2325, 1550, 2545, + 2321, 1560, 2543, + 2315, 1574, 2539, + 2307, 1591, 2537, + 2295, 1612, 2531, + 2281, 1640, 2523, + 2259, 1674, 2515, + 2229, 1717, 2501, + 2183, 1768, 2483, + 2117, 1828, 2457, + 2009, 1898, 2421, + 1807, 1977, 2367, + 1178, 2065, 2283, + 0, 2161, 2137, + 0, 2265, 1822, + 0, 2375, 0, + 0, 2489, 0, + 0, 2607, 0, + 0, 2729, 0, + 0, 2853, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2403, 1510, 2579, + 2401, 1514, 2579, + 2399, 1520, 2577, + 2397, 1528, 2575, + 2393, 1539, 2573, + 2389, 1553, 2571, + 2381, 1571, 2567, + 2371, 1593, 2563, + 2359, 1622, 2557, + 2341, 1658, 2547, + 2315, 1701, 2535, + 2279, 1754, 2517, + 2225, 1816, 2495, + 2143, 1888, 2461, + 2001, 1969, 2411, + 1696, 2059, 2335, + 0, 2157, 2209, + 0, 2261, 1957, + 0, 2371, 0, + 0, 2485, 0, + 0, 2605, 0, + 0, 2727, 0, + 0, 2851, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3235, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2483, 1477, 2617, + 2481, 1482, 2617, + 2481, 1489, 2615, + 2477, 1497, 2615, + 2475, 1509, 2613, + 2471, 1523, 2609, + 2465, 1542, 2607, + 2457, 1566, 2603, + 2445, 1597, 2597, + 2431, 1634, 2587, + 2411, 1680, 2577, + 2381, 1735, 2561, + 2339, 1800, 2539, + 2275, 1874, 2509, + 2175, 1957, 2465, + 1990, 2049, 2399, + 1485, 2149, 2291, + 0, 2255, 2091, + 0, 2367, 1476, + 0, 2483, 0, + 0, 2603, 0, + 0, 2725, 0, + 0, 2849, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2571, 1430, 2663, + 2571, 1435, 2663, + 2569, 1443, 2661, + 2567, 1452, 2661, + 2565, 1465, 2659, + 2561, 1481, 2657, + 2557, 1502, 2653, + 2549, 1528, 2649, + 2541, 1561, 2645, + 2529, 1602, 2637, + 2513, 1651, 2627, + 2489, 1709, 2613, + 2457, 1777, 2595, + 2409, 1855, 2567, + 2335, 1941, 2529, + 2213, 2036, 2471, + 1974, 2139, 2381, + 782, 2247, 2225, + 0, 2359, 1859, + 0, 2477, 0, + 0, 2599, 0, + 0, 2721, 0, + 0, 2847, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2669, 1358, 2719, + 2667, 1364, 2719, + 2667, 1373, 2717, + 2665, 1384, 2717, + 2663, 1398, 2715, + 2659, 1417, 2713, + 2655, 1441, 2711, + 2651, 1471, 2707, + 2643, 1508, 2703, + 2635, 1553, 2695, + 2621, 1608, 2687, + 2603, 1672, 2675, + 2577, 1745, 2659, + 2541, 1828, 2635, + 2487, 1919, 2601, + 2405, 2018, 2553, + 2261, 2123, 2479, + 1953, 2235, 2357, + 0, 2351, 2115, + 0, 2471, 847, + 0, 2593, 0, + 0, 2717, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2771, 1239, 2783, + 2771, 1248, 2783, + 2771, 1259, 2783, + 2769, 1273, 2781, + 2767, 1291, 2781, + 2765, 1315, 2779, + 2763, 1344, 2777, + 2757, 1381, 2773, + 2753, 1426, 2769, + 2745, 1480, 2763, + 2735, 1543, 2757, + 2721, 1616, 2745, + 2701, 1698, 2731, + 2673, 1789, 2711, + 2635, 1888, 2685, + 2575, 1993, 2645, + 2483, 2105, 2585, + 2319, 2219, 2491, + 1922, 2339, 2323, + 0, 2461, 1913, + 0, 2587, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2881, 1008, 2859, + 2881, 1022, 2857, + 2881, 1039, 2857, + 2879, 1062, 2857, + 2877, 1091, 2855, + 2877, 1127, 2853, + 2873, 1171, 2851, + 2871, 1224, 2849, + 2867, 1286, 2845, + 2861, 1358, 2841, + 2853, 1439, 2835, + 2841, 1529, 2827, + 2827, 1627, 2815, + 2807, 1731, 2799, + 2777, 1842, 2775, + 2735, 1957, 2743, + 2671, 2077, 2695, + 2569, 2199, 2623, + 2385, 2323, 2505, + 1878, 2449, 2273, + 0, 2577, 1276, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2995, 13, 2941, + 2995, 124, 2941, + 2995, 239, 2941, + 2995, 358, 2941, + 2993, 481, 2939, + 2991, 605, 2939, + 2989, 731, 2937, + 2987, 859, 2935, + 2985, 988, 2931, + 2979, 1117, 2927, + 2973, 1248, 2923, + 2965, 1378, 2915, + 2955, 1510, 2905, + 2939, 1641, 2893, + 2917, 1772, 2873, + 2887, 1904, 2847, + 2841, 2036, 2811, + 2775, 2167, 2755, + 2665, 2299, 2671, + 2461, 2431, 2523, + 1811, 2563, 2195, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3115, 0, 3035, + 3115, 0, 3033, + 3113, 0, 3033, + 3113, 0, 3033, + 3113, 0, 3033, + 3111, 0, 3031, + 3109, 0, 3029, + 3107, 0, 3029, + 3105, 0, 3025, + 3101, 0, 3023, + 3097, 700, 3019, + 3091, 1040, 3013, + 3083, 1282, 3005, + 3071, 1482, 2993, + 3055, 1659, 2979, + 3033, 1822, 2959, + 3001, 1976, 2931, + 2955, 2123, 2889, + 2883, 2267, 2825, + 2769, 2407, 2727, + 2545, 2545, 2545, + 1703, 2683, 2065, + 0, 2817, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 3237, 0, 3133, + 3235, 0, 3133, + 3235, 0, 3133, + 3235, 0, 3133, + 3235, 0, 3133, + 3233, 0, 3131, + 3233, 0, 3131, + 3231, 0, 3129, + 3229, 0, 3127, + 3227, 0, 3125, + 3223, 0, 3121, + 3219, 0, 3117, + 3211, 360, 3111, + 3203, 1109, 3101, + 3191, 1442, 3091, + 3175, 1682, 3075, + 3151, 1881, 3053, + 3119, 2057, 3021, + 3071, 2219, 2975, + 2997, 2373, 2905, + 2877, 2521, 2791, + 2639, 2663, 2575, + 1500, 2805, 1801, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3361, 0, 3241, + 3359, 0, 3239, + 3359, 0, 3239, + 3359, 0, 3239, + 3359, 0, 3239, + 3359, 0, 3239, + 3357, 0, 3237, + 3357, 0, 3237, + 3355, 0, 3235, + 3353, 0, 3233, + 3351, 0, 3231, + 3347, 0, 3227, + 3341, 0, 3221, + 3335, 0, 3215, + 3327, 673, 3207, + 3315, 1383, 3193, + 3297, 1711, 3177, + 3273, 1949, 3153, + 3241, 2147, 3119, + 3191, 2323, 3069, + 3115, 2485, 2993, + 2991, 2637, 2867, + 2741, 2785, 2611, + 867, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3487, 0, 3351, + 3487, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3349, + 3483, 0, 3349, + 3483, 0, 3347, + 3481, 0, 3347, + 3479, 0, 3345, + 3475, 0, 3341, + 3473, 0, 3337, + 3467, 0, 3333, + 3461, 0, 3325, + 3451, 0, 3317, + 3439, 1290, 3303, + 3423, 1748, 3285, + 3399, 2027, 3261, + 3365, 2245, 3225, + 3315, 2431, 3171, + 3237, 2601, 3091, + 3109, 2759, 2951, + 2847, 2909, 2655, + 0, 3055, 0, + 0, 3197, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3613, 0, 3469, + 3613, 0, 3469, + 3613, 0, 3469, + 3613, 0, 3467, + 3613, 0, 3467, + 3613, 0, 3467, + 3613, 0, 3467, + 3611, 0, 3465, + 3611, 0, 3465, + 3609, 0, 3463, + 3609, 0, 3463, + 3607, 0, 3461, + 3603, 0, 3457, + 3599, 0, 3453, + 3595, 0, 3447, + 3587, 0, 3441, + 3579, 0, 3431, + 3567, 1125, 3417, + 3549, 1792, 3399, + 3525, 2113, 3373, + 3491, 2349, 3335, + 3439, 2545, 3281, + 3361, 2721, 3193, + 3231, 2883, 3043, + 2961, 3035, 2709, + 0, 3183, 0, + 0, 3325, 0, + 0, 3465, 0, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3743, 0, 3589, + 3743, 0, 3589, + 3743, 0, 3589, + 3743, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3585, + 3739, 0, 3585, + 3739, 0, 3583, + 3737, 0, 3581, + 3735, 0, 3579, + 3731, 0, 3577, + 3729, 0, 3573, + 3723, 0, 3567, + 3717, 0, 3559, + 3707, 0, 3549, + 3695, 726, 3537, + 3677, 1846, 3517, + 3653, 2209, 3489, + 3617, 2459, 3451, + 3567, 2663, 3393, + 3487, 2843, 3303, + 3353, 3007, 3145, + 3077, 3163, 2771, + 0, 3311, 0, + 0, 3455, 0, + 0, 3595, 0, + 0, 3735, 0, + 0, 3871, 0, + 0, 4007, 0, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3709, + 3871, 0, 3709, + 3869, 0, 3709, + 3869, 0, 3707, + 3867, 0, 3707, + 3867, 0, 3705, + 3863, 0, 3703, + 3861, 0, 3699, + 3857, 0, 3695, + 3853, 0, 3689, + 3845, 0, 3683, + 3837, 0, 3671, + 3823, 0, 3657, + 3807, 1909, 3637, + 3781, 2311, 3611, + 3747, 2575, 3571, + 3695, 2785, 3511, + 3615, 2969, 3417, + 3479, 3135, 3251, + 3197, 3291, 2843, + 0, 3441, 0, + 0, 3585, 0, + 0, 3727, 0, + 0, 3865, 0, + 0, 4003, 0, + 4003, 0, 3837, + 4003, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 3999, 0, 3833, + 3999, 0, 3833, + 3997, 0, 3831, + 3997, 0, 3829, + 3995, 0, 3827, + 3991, 0, 3825, + 3987, 0, 3819, + 3983, 0, 3815, + 3975, 0, 3807, + 3967, 0, 3797, + 3953, 0, 3781, + 3935, 1981, 3761, + 3911, 2419, 3733, + 3875, 2693, 3693, + 3823, 2909, 3633, + 3743, 3095, 3535, + 3607, 3263, 3363, + 3321, 3421, 2925, + 0, 3571, 0, + 0, 3715, 0, + 0, 3857, 0, + 0, 3997, 0, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3961, + 4095, 0, 3961, + 4095, 0, 3961, + 4095, 0, 3961, + 4095, 0, 3959, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3947, + 4095, 0, 3941, + 4095, 0, 3933, + 4095, 0, 3923, + 4083, 0, 3907, + 4067, 2063, 3887, + 4041, 2533, 3859, + 4005, 2815, 3817, + 3953, 3035, 3755, + 3873, 3223, 3657, + 3735, 3393, 3479, + 3447, 3551, 3015, + 0, 3701, 0, + 0, 3847, 0, + 0, 3989, 0, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4087, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4075, + 4095, 0, 4069, + 4095, 0, 4061, + 4095, 0, 4049, + 4095, 0, 4035, + 4095, 2153, 4015, + 4095, 2651, 3985, + 4095, 2941, 3945, + 4085, 3163, 3881, + 4003, 3351, 3781, + 3865, 3523, 3599, + 3573, 3681, 3115, + 0, 3833, 0, + 0, 3979, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2251, 4095, + 4095, 2771, 4095, + 4095, 3067, 4071, + 4095, 3291, 4009, + 4095, 3481, 3907, + 3995, 3653, 3723, + 3701, 3813, 3219, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2357, 4095, + 4095, 2895, 4095, + 4095, 3195, 4095, + 4095, 3421, 4095, + 4095, 3611, 4035, + 4095, 3783, 3847, + 3831, 3943, 3329, + 2167, 1722, 2579, + 2165, 1725, 2577, + 2161, 1729, 2577, + 2155, 1734, 2575, + 2149, 1741, 2573, + 2141, 1749, 2571, + 2129, 1761, 2567, + 2111, 1776, 2563, + 2089, 1795, 2555, + 2055, 1820, 2547, + 2006, 1851, 2535, + 1932, 1890, 2517, + 1809, 1937, 2493, + 1563, 1992, 2461, + 119, 2057, 2411, + 0, 2133, 2335, + 0, 2217, 2209, + 0, 2309, 1955, + 0, 2409, 0, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2171, 1722, 2579, + 2167, 1724, 2579, + 2165, 1728, 2577, + 2159, 1733, 2577, + 2153, 1740, 2575, + 2145, 1749, 2571, + 2133, 1761, 2569, + 2115, 1776, 2563, + 2093, 1795, 2557, + 2059, 1820, 2547, + 2011, 1851, 2535, + 1938, 1889, 2519, + 1816, 1936, 2495, + 1575, 1992, 2461, + 351, 2057, 2413, + 0, 2133, 2337, + 0, 2217, 2211, + 0, 2309, 1959, + 0, 2409, 0, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2175, 1721, 2581, + 2173, 1724, 2581, + 2169, 1728, 2579, + 2163, 1733, 2577, + 2157, 1740, 2575, + 2149, 1748, 2573, + 2137, 1760, 2569, + 2121, 1775, 2565, + 2097, 1795, 2557, + 2065, 1819, 2549, + 2017, 1850, 2537, + 1945, 1889, 2519, + 1825, 1936, 2497, + 1592, 1992, 2463, + 546, 2057, 2413, + 0, 2133, 2339, + 0, 2217, 2213, + 0, 2309, 1964, + 0, 2409, 148, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2181, 1720, 2583, + 2177, 1723, 2581, + 2175, 1727, 2581, + 2169, 1732, 2579, + 2163, 1739, 2577, + 2155, 1748, 2575, + 2143, 1759, 2571, + 2127, 1774, 2567, + 2105, 1794, 2559, + 2073, 1819, 2551, + 2026, 1850, 2539, + 1955, 1888, 2521, + 1838, 1935, 2499, + 1612, 1991, 2465, + 720, 2057, 2417, + 0, 2133, 2341, + 0, 2217, 2217, + 0, 2309, 1970, + 0, 2409, 403, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2189, 1719, 2585, + 2185, 1722, 2583, + 2183, 1726, 2583, + 2177, 1731, 2581, + 2171, 1738, 2579, + 2163, 1747, 2577, + 2151, 1758, 2573, + 2135, 1774, 2569, + 2113, 1793, 2561, + 2083, 1818, 2553, + 2036, 1849, 2541, + 1967, 1888, 2525, + 1854, 1935, 2501, + 1639, 1991, 2467, + 881, 2057, 2419, + 0, 2131, 2345, + 0, 2217, 2223, + 0, 2309, 1978, + 0, 2409, 608, + 0, 2515, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2199, 1718, 2587, + 2195, 1721, 2587, + 2193, 1724, 2585, + 2189, 1730, 2585, + 2181, 1736, 2583, + 2173, 1745, 2579, + 2163, 1757, 2577, + 2147, 1772, 2571, + 2125, 1792, 2565, + 2095, 1817, 2557, + 2051, 1848, 2545, + 1984, 1887, 2527, + 1875, 1934, 2505, + 1672, 1990, 2471, + 1033, 2055, 2423, + 0, 2131, 2349, + 0, 2215, 2229, + 0, 2309, 1989, + 0, 2409, 789, + 0, 2515, 0, + 0, 2627, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2211, 1716, 2591, + 2209, 1719, 2591, + 2205, 1723, 2589, + 2201, 1728, 2587, + 2195, 1735, 2587, + 2187, 1744, 2583, + 2177, 1755, 2579, + 2161, 1771, 2575, + 2141, 1790, 2569, + 2111, 1815, 2561, + 2069, 1847, 2549, + 2004, 1885, 2531, + 1901, 1933, 2509, + 1712, 1989, 2477, + 1180, 2055, 2429, + 0, 2131, 2357, + 0, 2215, 2237, + 0, 2307, 2003, + 0, 2409, 954, + 0, 2515, 0, + 0, 2627, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2229, 1713, 2597, + 2227, 1716, 2595, + 2223, 1720, 2595, + 2219, 1725, 2593, + 2213, 1732, 2591, + 2205, 1741, 2589, + 2195, 1753, 2585, + 2181, 1768, 2581, + 2161, 1788, 2575, + 2133, 1813, 2565, + 2091, 1845, 2553, + 2031, 1884, 2537, + 1935, 1931, 2515, + 1762, 1988, 2483, + 1323, 2053, 2435, + 0, 2129, 2365, + 0, 2215, 2247, + 0, 2307, 2021, + 0, 2407, 1109, + 0, 2515, 0, + 0, 2627, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2251, 1710, 2603, + 2249, 1713, 2603, + 2245, 1716, 2601, + 2241, 1722, 2599, + 2235, 1729, 2597, + 2229, 1738, 2595, + 2219, 1750, 2591, + 2205, 1765, 2587, + 2185, 1785, 2581, + 2159, 1810, 2573, + 2121, 1842, 2561, + 2065, 1881, 2545, + 1975, 1929, 2523, + 1820, 1986, 2491, + 1463, 2053, 2445, + 0, 2127, 2375, + 0, 2213, 2261, + 0, 2307, 2044, + 0, 2407, 1258, + 0, 2515, 0, + 0, 2627, 0, + 0, 2743, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2279, 1705, 2611, + 2275, 1708, 2611, + 2273, 1712, 2609, + 2269, 1717, 2609, + 2265, 1724, 2607, + 2257, 1733, 2605, + 2249, 1745, 2601, + 2235, 1761, 2597, + 2217, 1781, 2591, + 2193, 1806, 2581, + 2157, 1838, 2571, + 2105, 1878, 2555, + 2025, 1926, 2533, + 1888, 1983, 2503, + 1601, 2049, 2457, + 0, 2127, 2389, + 0, 2211, 2281, + 0, 2305, 2073, + 0, 2407, 1402, + 0, 2513, 0, + 0, 2627, 0, + 0, 2743, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2313, 1698, 2623, + 2311, 1701, 2623, + 2309, 1706, 2621, + 2305, 1711, 2619, + 2299, 1718, 2619, + 2293, 1727, 2615, + 2285, 1739, 2613, + 2273, 1755, 2609, + 2257, 1776, 2603, + 2235, 1801, 2595, + 2203, 1834, 2583, + 2155, 1874, 2567, + 2083, 1922, 2547, + 1966, 1980, 2517, + 1738, 2047, 2473, + 801, 2123, 2409, + 0, 2209, 2303, + 0, 2303, 2109, + 0, 2405, 1543, + 0, 2513, 0, + 0, 2625, 0, + 0, 2743, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2355, 1690, 2637, + 2353, 1693, 2637, + 2351, 1697, 2637, + 2347, 1702, 2635, + 2343, 1710, 2633, + 2337, 1719, 2631, + 2329, 1732, 2627, + 2319, 1748, 2623, + 2305, 1768, 2617, + 2285, 1794, 2609, + 2255, 1827, 2599, + 2213, 1868, 2585, + 2151, 1917, 2565, + 2053, 1975, 2535, + 1873, 2043, 2495, + 1398, 2121, 2431, + 0, 2207, 2333, + 0, 2301, 2153, + 0, 2403, 1682, + 0, 2511, 0, + 0, 2625, 0, + 0, 2741, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2407, 1678, 2657, + 2405, 1681, 2657, + 2403, 1685, 2655, + 2399, 1691, 2655, + 2395, 1698, 2653, + 2391, 1708, 2651, + 2383, 1721, 2647, + 2375, 1737, 2643, + 2361, 1758, 2637, + 2343, 1785, 2631, + 2319, 1818, 2619, + 2283, 1860, 2605, + 2229, 1909, 2587, + 2147, 1969, 2559, + 2007, 2037, 2521, + 1708, 2115, 2461, + 0, 2203, 2369, + 0, 2297, 2207, + 0, 2401, 1818, + 0, 2509, 0, + 0, 2623, 0, + 0, 2741, 0, + 0, 2861, 0, + 0, 2985, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2467, 1661, 2681, + 2465, 1665, 2681, + 2463, 1669, 2679, + 2461, 1675, 2679, + 2457, 1683, 2677, + 2453, 1693, 2675, + 2447, 1706, 2673, + 2439, 1723, 2669, + 2427, 1744, 2663, + 2413, 1772, 2655, + 2391, 1806, 2647, + 2361, 1849, 2633, + 2317, 1900, 2615, + 2249, 1960, 2589, + 2141, 2030, 2553, + 1939, 2109, 2499, + 1310, 2197, 2415, + 0, 2293, 2269, + 0, 2397, 1954, + 0, 2507, 0, + 0, 2621, 0, + 0, 2739, 0, + 0, 2861, 0, + 0, 2985, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2537, 1638, 2711, + 2535, 1642, 2711, + 2535, 1646, 2711, + 2531, 1653, 2709, + 2529, 1661, 2707, + 2525, 1671, 2705, + 2521, 1685, 2703, + 2513, 1703, 2699, + 2503, 1725, 2695, + 2491, 1754, 2689, + 2473, 1790, 2679, + 2447, 1834, 2667, + 2411, 1886, 2651, + 2357, 1948, 2627, + 2275, 2020, 2593, + 2133, 2101, 2543, + 1828, 2191, 2467, + 0, 2289, 2341, + 0, 2393, 2089, + 0, 2503, 0, + 0, 2619, 0, + 0, 2737, 0, + 0, 2859, 0, + 0, 2983, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3367, 0, + 0, 3495, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2617, 1606, 2749, + 2615, 1609, 2749, + 2613, 1614, 2749, + 2613, 1621, 2747, + 2609, 1630, 2747, + 2607, 1641, 2745, + 2603, 1656, 2741, + 2597, 1674, 2739, + 2589, 1699, 2735, + 2577, 1729, 2729, + 2563, 1767, 2719, + 2543, 1813, 2709, + 2513, 1868, 2693, + 2471, 1932, 2671, + 2407, 2006, 2641, + 2307, 2089, 2597, + 2121, 2181, 2531, + 1617, 2281, 2423, + 0, 2387, 2223, + 0, 2499, 1608, + 0, 2615, 0, + 0, 2735, 0, + 0, 2857, 0, + 0, 2981, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2705, 1558, 2797, + 2703, 1562, 2795, + 2703, 1568, 2795, + 2701, 1575, 2795, + 2699, 1584, 2793, + 2697, 1597, 2791, + 2693, 1613, 2789, + 2689, 1634, 2787, + 2683, 1660, 2781, + 2673, 1693, 2777, + 2661, 1734, 2769, + 2645, 1783, 2759, + 2621, 1841, 2745, + 2589, 1909, 2727, + 2541, 1987, 2699, + 2467, 2073, 2661, + 2345, 2169, 2603, + 2107, 2271, 2513, + 914, 2379, 2357, + 0, 2491, 1991, + 0, 2609, 0, + 0, 2731, 0, + 0, 2853, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2801, 1485, 2851, + 2801, 1490, 2851, + 2799, 1496, 2851, + 2799, 1505, 2849, + 2797, 1516, 2849, + 2795, 1531, 2847, + 2791, 1549, 2845, + 2787, 1573, 2843, + 2783, 1603, 2839, + 2775, 1640, 2835, + 2767, 1686, 2827, + 2753, 1740, 2819, + 2735, 1804, 2807, + 2709, 1877, 2791, + 2673, 1960, 2767, + 2619, 2051, 2735, + 2537, 2151, 2685, + 2393, 2255, 2613, + 2085, 2367, 2489, + 0, 2483, 2249, + 0, 2603, 980, + 0, 2725, 0, + 0, 2851, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2905, 1365, 2917, + 2903, 1371, 2915, + 2903, 1380, 2915, + 2903, 1391, 2915, + 2901, 1405, 2913, + 2899, 1423, 2913, + 2897, 1447, 2911, + 2895, 1476, 2909, + 2891, 1513, 2905, + 2885, 1558, 2901, + 2877, 1612, 2895, + 2867, 1675, 2889, + 2853, 1748, 2877, + 2833, 1830, 2863, + 2805, 1921, 2845, + 2767, 2020, 2817, + 2707, 2125, 2777, + 2615, 2237, 2717, + 2451, 2351, 2623, + 2055, 2471, 2455, + 0, 2593, 2045, + 0, 2719, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3013, 1129, 2991, + 3013, 1140, 2991, + 3013, 1154, 2989, + 3013, 1172, 2989, + 3011, 1194, 2989, + 3009, 1223, 2987, + 3009, 1259, 2987, + 3005, 1303, 2985, + 3003, 1356, 2981, + 2999, 1418, 2979, + 2993, 1490, 2973, + 2985, 1571, 2967, + 2973, 1661, 2959, + 2959, 1759, 2947, + 2939, 1864, 2931, + 2909, 1974, 2907, + 2867, 2089, 2875, + 2803, 2209, 2827, + 2701, 2331, 2755, + 2517, 2455, 2637, + 2010, 2581, 2405, + 0, 2709, 1408, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3129, 41, 3075, + 3129, 145, 3075, + 3127, 256, 3073, + 3127, 371, 3073, + 3127, 491, 3073, + 3125, 613, 3071, + 3123, 737, 3071, + 3123, 864, 3069, + 3119, 991, 3067, + 3117, 1120, 3063, + 3111, 1250, 3059, + 3105, 1380, 3055, + 3097, 1511, 3047, + 3087, 1642, 3037, + 3071, 1773, 3025, + 3049, 1905, 3007, + 3019, 2036, 2981, + 2973, 2169, 2943, + 2907, 2299, 2889, + 2797, 2431, 2803, + 2593, 2563, 2655, + 1943, 2695, 2327, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3247, 0, 3167, + 3247, 0, 3167, + 3247, 0, 3165, + 3245, 0, 3165, + 3245, 0, 3165, + 3245, 0, 3165, + 3243, 0, 3163, + 3241, 0, 3161, + 3239, 0, 3161, + 3237, 0, 3157, + 3233, 22, 3155, + 3229, 832, 3151, + 3223, 1172, 3145, + 3215, 1414, 3137, + 3203, 1614, 3127, + 3187, 1791, 3111, + 3165, 1954, 3091, + 3133, 2109, 3063, + 3087, 2255, 3021, + 3015, 2399, 2959, + 2901, 2539, 2859, + 2677, 2677, 2677, + 1835, 2815, 2197, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3369, 0, 3267, + 3369, 0, 3265, + 3367, 0, 3265, + 3367, 0, 3265, + 3367, 0, 3265, + 3367, 0, 3265, + 3365, 0, 3263, + 3365, 0, 3263, + 3363, 0, 3261, + 3361, 0, 3259, + 3359, 0, 3257, + 3355, 0, 3253, + 3351, 0, 3249, + 3343, 492, 3243, + 3335, 1242, 3235, + 3323, 1575, 3223, + 3307, 1814, 3207, + 3283, 2013, 3185, + 3251, 2189, 3153, + 3203, 2351, 3107, + 3129, 2505, 3037, + 3009, 2653, 2925, + 2771, 2797, 2707, + 1632, 2937, 1933, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3493, 0, 3373, + 3493, 0, 3373, + 3493, 0, 3373, + 3491, 0, 3371, + 3491, 0, 3371, + 3491, 0, 3371, + 3491, 0, 3371, + 3489, 0, 3369, + 3489, 0, 3369, + 3487, 0, 3367, + 3485, 0, 3365, + 3483, 0, 3363, + 3479, 0, 3359, + 3473, 0, 3353, + 3467, 0, 3347, + 3459, 805, 3339, + 3447, 1516, 3325, + 3429, 1844, 3309, + 3405, 2081, 3285, + 3373, 2279, 3251, + 3323, 2455, 3201, + 3249, 2617, 3125, + 3123, 2771, 2999, + 2873, 2917, 2743, + 999, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3619, 0, 3485, + 3619, 0, 3485, + 3619, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3481, + 3615, 0, 3481, + 3615, 0, 3479, + 3613, 0, 3479, + 3611, 0, 3477, + 3609, 0, 3473, + 3605, 0, 3469, + 3599, 0, 3465, + 3593, 0, 3457, + 3583, 0, 3449, + 3571, 1422, 3435, + 3555, 1880, 3417, + 3531, 2159, 3393, + 3497, 2377, 3357, + 3447, 2563, 3303, + 3369, 2733, 3223, + 3241, 2891, 3083, + 2979, 3041, 2787, + 0, 3187, 0, + 0, 3329, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3745, 0, 3601, + 3745, 0, 3601, + 3745, 0, 3601, + 3745, 0, 3601, + 3745, 0, 3599, + 3745, 0, 3599, + 3745, 0, 3599, + 3745, 0, 3599, + 3743, 0, 3599, + 3743, 0, 3597, + 3741, 0, 3597, + 3741, 0, 3595, + 3739, 0, 3593, + 3735, 0, 3589, + 3731, 0, 3585, + 3727, 0, 3581, + 3721, 0, 3573, + 3711, 0, 3563, + 3699, 1258, 3549, + 3681, 1924, 3531, + 3657, 2245, 3505, + 3623, 2481, 3467, + 3571, 2677, 3413, + 3493, 2853, 3325, + 3363, 3015, 3177, + 3093, 3167, 2841, + 0, 3315, 0, + 0, 3457, 0, + 0, 3597, 0, + 0, 3735, 0, + 0, 3873, 0, + 0, 4007, 0, + 3875, 0, 3721, + 3875, 0, 3721, + 3875, 0, 3721, + 3875, 0, 3721, + 3875, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3717, + 3871, 0, 3717, + 3871, 0, 3715, + 3869, 0, 3715, + 3867, 0, 3711, + 3863, 0, 3709, + 3861, 0, 3705, + 3855, 0, 3699, + 3849, 0, 3693, + 3839, 0, 3681, + 3827, 858, 3669, + 3809, 1978, 3649, + 3785, 2341, 3623, + 3749, 2591, 3583, + 3699, 2795, 3525, + 3619, 2975, 3435, + 3485, 3139, 3277, + 3209, 3295, 2903, + 0, 3443, 0, + 0, 3587, 0, + 0, 3727, 0, + 0, 3867, 0, + 0, 4003, 0, + 4005, 0, 3843, + 4005, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3841, + 4003, 0, 3841, + 4001, 0, 3841, + 4001, 0, 3839, + 3999, 0, 3839, + 3999, 0, 3837, + 3997, 0, 3835, + 3993, 0, 3831, + 3989, 0, 3827, + 3985, 0, 3821, + 3977, 0, 3815, + 3969, 0, 3803, + 3955, 0, 3789, + 3939, 2041, 3771, + 3913, 2443, 3743, + 3879, 2707, 3703, + 3827, 2917, 3643, + 3747, 3101, 3549, + 3611, 3267, 3383, + 3329, 3423, 2977, + 0, 3573, 0, + 0, 3717, 0, + 0, 3859, 0, + 0, 3997, 0, + 4095, 0, 3969, + 4095, 0, 3969, + 4095, 0, 3969, + 4095, 0, 3969, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3965, + 4095, 0, 3965, + 4095, 0, 3963, + 4095, 0, 3961, + 4095, 0, 3959, + 4095, 0, 3957, + 4095, 0, 3951, + 4095, 0, 3947, + 4095, 0, 3939, + 4095, 0, 3929, + 4085, 0, 3913, + 4067, 2113, 3893, + 4043, 2551, 3865, + 4007, 2825, 3825, + 3955, 3041, 3765, + 3875, 3227, 3667, + 3739, 3395, 3495, + 3453, 3553, 3057, + 0, 3703, 0, + 0, 3849, 0, + 0, 3989, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4093, + 4095, 0, 4093, + 4095, 0, 4093, + 4095, 0, 4093, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 0, 4079, + 4095, 0, 4073, + 4095, 0, 4065, + 4095, 0, 4055, + 4095, 0, 4039, + 4095, 2195, 4019, + 4095, 2665, 3991, + 4095, 2947, 3949, + 4085, 3167, 3887, + 4005, 3355, 3789, + 3867, 3525, 3611, + 3579, 3683, 3149, + 0, 3833, 0, + 0, 3979, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2285, 4095, + 4095, 2783, 4095, + 4095, 3073, 4077, + 4095, 3295, 4013, + 4095, 3483, 3913, + 3997, 3655, 3731, + 3705, 3813, 3247, + 0, 3965, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2383, 4095, + 4095, 2905, 4095, + 4095, 3199, 4095, + 4095, 3423, 4095, + 4095, 3613, 4039, + 4095, 3785, 3855, + 3833, 3945, 3351, + 2299, 1852, 2711, + 2297, 1854, 2711, + 2293, 1857, 2709, + 2291, 1861, 2709, + 2285, 1866, 2707, + 2279, 1873, 2705, + 2269, 1882, 2703, + 2257, 1893, 2699, + 2241, 1909, 2693, + 2217, 1928, 2687, + 2183, 1953, 2679, + 2135, 1984, 2665, + 2059, 2022, 2649, + 1935, 2069, 2625, + 1685, 2125, 2591, + 0, 2191, 2541, + 0, 2265, 2467, + 0, 2349, 2339, + 0, 2441, 2085, + 0, 2543, 0, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2301, 1852, 2711, + 2299, 1854, 2711, + 2297, 1857, 2711, + 2293, 1861, 2709, + 2287, 1866, 2707, + 2281, 1873, 2705, + 2273, 1882, 2703, + 2261, 1893, 2699, + 2243, 1908, 2695, + 2221, 1928, 2687, + 2187, 1952, 2679, + 2139, 1983, 2667, + 2065, 2022, 2649, + 1941, 2069, 2627, + 1695, 2125, 2593, + 251, 2191, 2543, + 0, 2265, 2467, + 0, 2349, 2341, + 0, 2441, 2087, + 0, 2541, 0, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2305, 1851, 2713, + 2303, 1854, 2711, + 2299, 1857, 2711, + 2297, 1860, 2709, + 2291, 1866, 2709, + 2285, 1872, 2707, + 2277, 1881, 2703, + 2265, 1893, 2701, + 2247, 1908, 2695, + 2225, 1927, 2689, + 2191, 1952, 2679, + 2143, 1983, 2667, + 2069, 2022, 2651, + 1948, 2069, 2627, + 1708, 2125, 2593, + 483, 2189, 2545, + 0, 2265, 2469, + 0, 2349, 2343, + 0, 2441, 2091, + 0, 2541, 0, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2309, 1851, 2713, + 2307, 1853, 2713, + 2305, 1856, 2713, + 2301, 1860, 2711, + 2295, 1865, 2709, + 2289, 1872, 2707, + 2281, 1881, 2705, + 2269, 1892, 2701, + 2253, 1907, 2697, + 2229, 1927, 2691, + 2197, 1951, 2681, + 2149, 1983, 2669, + 2077, 2021, 2653, + 1958, 2069, 2629, + 1724, 2125, 2595, + 678, 2189, 2547, + 0, 2265, 2471, + 0, 2349, 2345, + 0, 2441, 2095, + 0, 2541, 280, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2315, 1850, 2715, + 2313, 1852, 2715, + 2311, 1855, 2713, + 2307, 1859, 2713, + 2301, 1864, 2711, + 2295, 1871, 2709, + 2287, 1880, 2707, + 2275, 1891, 2703, + 2259, 1907, 2699, + 2237, 1926, 2691, + 2205, 1951, 2683, + 2157, 1982, 2671, + 2087, 2021, 2653, + 1970, 2067, 2631, + 1744, 2123, 2597, + 852, 2189, 2549, + 0, 2265, 2473, + 0, 2349, 2349, + 0, 2441, 2101, + 0, 2541, 535, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2323, 1849, 2717, + 2321, 1851, 2717, + 2317, 1854, 2715, + 2315, 1858, 2715, + 2309, 1863, 2713, + 2303, 1870, 2711, + 2295, 1879, 2709, + 2283, 1890, 2705, + 2267, 1906, 2701, + 2245, 1925, 2693, + 2215, 1950, 2685, + 2169, 1981, 2673, + 2099, 2020, 2657, + 1986, 2067, 2633, + 1771, 2123, 2599, + 1013, 2189, 2551, + 0, 2263, 2477, + 0, 2349, 2355, + 0, 2441, 2111, + 0, 2541, 741, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2333, 1848, 2721, + 2331, 1850, 2719, + 2327, 1853, 2719, + 2325, 1857, 2717, + 2321, 1862, 2717, + 2315, 1869, 2715, + 2305, 1877, 2711, + 2295, 1889, 2709, + 2279, 1904, 2703, + 2257, 1924, 2697, + 2227, 1949, 2689, + 2183, 1980, 2677, + 2115, 2019, 2659, + 2007, 2065, 2637, + 1804, 2123, 2603, + 1166, 2187, 2555, + 0, 2263, 2483, + 0, 2347, 2361, + 0, 2441, 2121, + 0, 2541, 921, + 0, 2647, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2345, 1846, 2725, + 2343, 1848, 2723, + 2341, 1851, 2723, + 2337, 1855, 2721, + 2333, 1860, 2721, + 2327, 1867, 2719, + 2319, 1876, 2715, + 2309, 1887, 2713, + 2293, 1903, 2707, + 2273, 1922, 2701, + 2243, 1947, 2693, + 2201, 1979, 2681, + 2137, 2017, 2663, + 2034, 2065, 2641, + 1845, 2121, 2609, + 1312, 2187, 2561, + 0, 2263, 2489, + 0, 2347, 2369, + 0, 2441, 2135, + 0, 2541, 1086, + 0, 2647, 0, + 0, 2759, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2363, 1843, 2729, + 2361, 1845, 2729, + 2359, 1848, 2727, + 2355, 1852, 2727, + 2351, 1857, 2725, + 2345, 1864, 2723, + 2337, 1873, 2721, + 2327, 1885, 2717, + 2313, 1900, 2713, + 2293, 1920, 2707, + 2265, 1945, 2697, + 2223, 1977, 2685, + 2163, 2016, 2669, + 2067, 2063, 2647, + 1894, 2119, 2615, + 1455, 2185, 2569, + 0, 2261, 2497, + 0, 2347, 2379, + 0, 2439, 2153, + 0, 2539, 1241, + 0, 2647, 0, + 0, 2759, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2385, 1839, 2735, + 2383, 1842, 2735, + 2381, 1845, 2735, + 2377, 1849, 2733, + 2373, 1854, 2731, + 2367, 1861, 2729, + 2361, 1870, 2727, + 2351, 1882, 2725, + 2337, 1897, 2719, + 2319, 1917, 2713, + 2291, 1942, 2705, + 2253, 1974, 2693, + 2197, 2013, 2677, + 2107, 2061, 2655, + 1952, 2117, 2623, + 1595, 2185, 2577, + 0, 2261, 2507, + 0, 2345, 2393, + 0, 2439, 2175, + 0, 2539, 1390, + 0, 2647, 0, + 0, 2759, 0, + 0, 2875, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2411, 1835, 2745, + 2411, 1837, 2743, + 2409, 1840, 2743, + 2405, 1844, 2743, + 2401, 1849, 2741, + 2397, 1856, 2739, + 2389, 1865, 2737, + 2381, 1877, 2733, + 2367, 1893, 2729, + 2349, 1913, 2723, + 2325, 1939, 2715, + 2289, 1971, 2703, + 2237, 2010, 2687, + 2157, 2059, 2665, + 2020, 2115, 2635, + 1733, 2181, 2589, + 0, 2259, 2523, + 0, 2343, 2413, + 0, 2437, 2205, + 0, 2539, 1534, + 0, 2645, 0, + 0, 2759, 0, + 0, 2875, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2447, 1828, 2755, + 2445, 1831, 2755, + 2443, 1834, 2755, + 2441, 1838, 2753, + 2437, 1843, 2753, + 2433, 1850, 2751, + 2425, 1859, 2747, + 2417, 1872, 2745, + 2405, 1887, 2741, + 2389, 1908, 2735, + 2367, 1933, 2727, + 2335, 1966, 2715, + 2287, 2006, 2701, + 2215, 2055, 2679, + 2099, 2111, 2649, + 1870, 2179, 2605, + 933, 2255, 2541, + 0, 2341, 2435, + 0, 2435, 2241, + 0, 2537, 1675, + 0, 2645, 0, + 0, 2757, 0, + 0, 2875, 0, + 0, 2995, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2489, 1819, 2771, + 2487, 1822, 2771, + 2485, 1825, 2769, + 2483, 1829, 2769, + 2479, 1835, 2767, + 2475, 1842, 2765, + 2469, 1851, 2763, + 2463, 1864, 2759, + 2451, 1880, 2755, + 2437, 1900, 2749, + 2417, 1926, 2741, + 2387, 1959, 2731, + 2347, 2000, 2717, + 2283, 2049, 2697, + 2185, 2107, 2667, + 2005, 2175, 2627, + 1530, 2253, 2565, + 0, 2339, 2465, + 0, 2433, 2285, + 0, 2535, 1814, + 0, 2643, 0, + 0, 2757, 0, + 0, 2873, 0, + 0, 2995, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2539, 1807, 2789, + 2539, 1810, 2789, + 2537, 1813, 2789, + 2535, 1817, 2787, + 2531, 1823, 2787, + 2529, 1830, 2785, + 2523, 1840, 2783, + 2515, 1853, 2779, + 2507, 1869, 2775, + 2493, 1890, 2769, + 2475, 1917, 2763, + 2451, 1951, 2753, + 2415, 1992, 2739, + 2361, 2042, 2719, + 2279, 2101, 2691, + 2139, 2169, 2653, + 1840, 2247, 2593, + 0, 2335, 2501, + 0, 2431, 2339, + 0, 2533, 1951, + 0, 2641, 0, + 0, 2755, 0, + 0, 2873, 0, + 0, 2993, 0, + 0, 3117, 0, + 0, 3243, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2599, 1791, 2813, + 2599, 1793, 2813, + 2597, 1797, 2813, + 2595, 1801, 2811, + 2593, 1807, 2811, + 2589, 1815, 2809, + 2585, 1825, 2807, + 2579, 1838, 2805, + 2571, 1855, 2801, + 2559, 1877, 2795, + 2545, 1904, 2789, + 2523, 1938, 2779, + 2493, 1981, 2765, + 2449, 2032, 2747, + 2381, 2093, 2721, + 2273, 2163, 2685, + 2071, 2241, 2631, + 1442, 2329, 2547, + 0, 2425, 2401, + 0, 2529, 2087, + 0, 2639, 0, + 0, 2753, 0, + 0, 2871, 0, + 0, 2993, 0, + 0, 3117, 0, + 0, 3243, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2669, 1768, 2845, + 2669, 1770, 2845, + 2667, 1774, 2843, + 2667, 1779, 2843, + 2665, 1785, 2841, + 2661, 1793, 2841, + 2657, 1803, 2839, + 2653, 1817, 2835, + 2645, 1835, 2831, + 2635, 1857, 2827, + 2623, 1886, 2821, + 2605, 1922, 2811, + 2579, 1966, 2799, + 2543, 2018, 2783, + 2489, 2081, 2759, + 2407, 2153, 2725, + 2265, 2233, 2675, + 1960, 2323, 2601, + 0, 2421, 2475, + 0, 2525, 2221, + 0, 2635, 0, + 0, 2751, 0, + 0, 2869, 0, + 0, 2991, 0, + 0, 3115, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3499, 0, + 0, 3627, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2749, 1735, 2883, + 2749, 1738, 2883, + 2747, 1742, 2881, + 2747, 1747, 2881, + 2745, 1753, 2879, + 2741, 1762, 2879, + 2739, 1773, 2877, + 2735, 1788, 2875, + 2729, 1807, 2871, + 2721, 1831, 2867, + 2709, 1861, 2861, + 2695, 1899, 2853, + 2675, 1945, 2841, + 2645, 2000, 2825, + 2603, 2065, 2805, + 2539, 2139, 2773, + 2439, 2221, 2729, + 2253, 2313, 2663, + 1749, 2413, 2555, + 0, 2519, 2355, + 0, 2631, 1740, + 0, 2747, 0, + 0, 2867, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2837, 1687, 2929, + 2837, 1690, 2929, + 2835, 1694, 2927, + 2835, 1700, 2927, + 2833, 1707, 2927, + 2831, 1717, 2925, + 2829, 1729, 2923, + 2825, 1745, 2921, + 2821, 1766, 2919, + 2815, 1792, 2915, + 2805, 1825, 2909, + 2793, 1866, 2901, + 2777, 1915, 2891, + 2753, 1974, 2877, + 2721, 2042, 2859, + 2673, 2119, 2831, + 2599, 2205, 2793, + 2477, 2301, 2735, + 2239, 2403, 2647, + 1046, 2511, 2489, + 0, 2623, 2123, + 0, 2741, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2933, 1614, 2983, + 2933, 1617, 2983, + 2933, 1622, 2983, + 2931, 1629, 2983, + 2931, 1637, 2981, + 2929, 1648, 2981, + 2927, 1663, 2979, + 2923, 1681, 2977, + 2921, 1705, 2975, + 2915, 1735, 2971, + 2907, 1772, 2967, + 2899, 1818, 2959, + 2885, 1872, 2951, + 2867, 1936, 2939, + 2841, 2009, 2923, + 2805, 2093, 2899, + 2751, 2183, 2867, + 2669, 2283, 2817, + 2525, 2389, 2745, + 2217, 2499, 2621, + 0, 2615, 2381, + 0, 2735, 1111, + 0, 2857, 0, + 0, 2983, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 3037, 1492, 3049, + 3037, 1497, 3049, + 3037, 1503, 3049, + 3035, 1512, 3047, + 3035, 1523, 3047, + 3033, 1537, 3045, + 3031, 1555, 3045, + 3029, 1579, 3043, + 3027, 1608, 3041, + 3023, 1645, 3037, + 3017, 1690, 3033, + 3009, 1744, 3027, + 2999, 1807, 3021, + 2985, 1880, 3011, + 2965, 1962, 2995, + 2937, 2053, 2977, + 2899, 2151, 2949, + 2839, 2257, 2909, + 2747, 2369, 2849, + 2583, 2483, 2755, + 2187, 2603, 2587, + 0, 2725, 2177, + 0, 2851, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3147, 1253, 3123, + 3147, 1261, 3123, + 3145, 1272, 3123, + 3145, 1286, 3123, + 3145, 1304, 3121, + 3143, 1327, 3121, + 3143, 1355, 3119, + 3141, 1391, 3119, + 3137, 1435, 3117, + 3135, 1488, 3113, + 3131, 1550, 3111, + 3125, 1622, 3105, + 3117, 1703, 3099, + 3105, 1793, 3091, + 3091, 1891, 3079, + 3071, 1996, 3063, + 3041, 2107, 3039, + 2999, 2221, 3007, + 2935, 2341, 2959, + 2835, 2463, 2887, + 2649, 2587, 2769, + 2143, 2713, 2537, + 0, 2841, 1540, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 3261, 75, 3207, + 3261, 173, 3207, + 3261, 278, 3207, + 3259, 388, 3205, + 3259, 504, 3205, + 3259, 623, 3205, + 3257, 745, 3203, + 3255, 869, 3203, + 3255, 996, 3201, + 3251, 1123, 3199, + 3249, 1252, 3195, + 3243, 1382, 3193, + 3237, 1512, 3187, + 3229, 1643, 3179, + 3219, 1774, 3169, + 3203, 1905, 3157, + 3181, 2037, 3139, + 3151, 2169, 3113, + 3105, 2301, 3075, + 3039, 2433, 3021, + 2929, 2563, 2935, + 2725, 2695, 2787, + 2075, 2829, 2459, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3379, 0, 3299, + 3379, 0, 3299, + 3379, 0, 3299, + 3379, 0, 3299, + 3377, 0, 3297, + 3377, 0, 3297, + 3377, 0, 3297, + 3375, 0, 3295, + 3375, 0, 3295, + 3373, 0, 3293, + 3369, 0, 3289, + 3367, 154, 3287, + 3361, 964, 3283, + 3355, 1304, 3277, + 3347, 1546, 3269, + 3335, 1746, 3259, + 3319, 1923, 3243, + 3297, 2087, 3223, + 3265, 2241, 3195, + 3219, 2387, 3153, + 3147, 2531, 3091, + 3033, 2671, 2991, + 2811, 2811, 2811, + 1967, 2947, 2331, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3501, 0, 3399, + 3501, 0, 3399, + 3501, 0, 3399, + 3501, 0, 3397, + 3499, 0, 3397, + 3499, 0, 3397, + 3499, 0, 3397, + 3497, 0, 3395, + 3497, 0, 3395, + 3495, 0, 3393, + 3493, 0, 3391, + 3491, 0, 3389, + 3487, 0, 3385, + 3483, 0, 3381, + 3477, 624, 3375, + 3467, 1374, 3367, + 3455, 1707, 3355, + 3439, 1946, 3339, + 3415, 2145, 3317, + 3383, 2321, 3285, + 3335, 2483, 3239, + 3261, 2637, 3169, + 3141, 2785, 3057, + 2903, 2929, 2839, + 1764, 3069, 2065, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3625, 0, 3505, + 3625, 0, 3505, + 3625, 0, 3505, + 3625, 0, 3505, + 3623, 0, 3503, + 3623, 0, 3503, + 3623, 0, 3503, + 3623, 0, 3503, + 3621, 0, 3501, + 3621, 0, 3501, + 3619, 0, 3499, + 3617, 0, 3497, + 3615, 0, 3495, + 3611, 0, 3491, + 3607, 0, 3485, + 3599, 0, 3479, + 3591, 937, 3471, + 3579, 1648, 3459, + 3561, 1976, 3441, + 3539, 2213, 3417, + 3505, 2411, 3383, + 3455, 2587, 3335, + 3381, 2749, 3259, + 3255, 2903, 3131, + 3005, 3049, 2875, + 1131, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3751, 0, 3617, + 3751, 0, 3617, + 3751, 0, 3617, + 3751, 0, 3617, + 3751, 0, 3615, + 3749, 0, 3615, + 3749, 0, 3615, + 3749, 0, 3615, + 3749, 0, 3615, + 3747, 0, 3613, + 3747, 0, 3613, + 3745, 0, 3611, + 3743, 0, 3609, + 3741, 0, 3605, + 3737, 0, 3601, + 3731, 0, 3597, + 3725, 0, 3589, + 3717, 0, 3581, + 3703, 1555, 3567, + 3687, 2012, 3549, + 3663, 2291, 3525, + 3629, 2509, 3489, + 3579, 2695, 3437, + 3501, 2865, 3355, + 3373, 3023, 3215, + 3111, 3173, 2919, + 0, 3319, 0, + 0, 3461, 0, + 0, 3601, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3879, 0, 3733, + 3879, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3731, + 3877, 0, 3731, + 3877, 0, 3731, + 3875, 0, 3731, + 3875, 0, 3729, + 3873, 0, 3729, + 3873, 0, 3727, + 3871, 0, 3725, + 3867, 0, 3721, + 3863, 0, 3717, + 3859, 0, 3713, + 3853, 0, 3705, + 3843, 0, 3695, + 3831, 1390, 3681, + 3813, 2057, 3663, + 3789, 2379, 3637, + 3755, 2613, 3599, + 3703, 2809, 3545, + 3625, 2985, 3457, + 3495, 3147, 3309, + 3225, 3299, 2973, + 0, 3447, 0, + 0, 3589, 0, + 0, 3729, 0, + 0, 3867, 0, + 0, 4005, 0, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3851, + 4005, 0, 3851, + 4005, 0, 3851, + 4005, 0, 3851, + 4005, 0, 3851, + 4003, 0, 3849, + 4003, 0, 3847, + 4001, 0, 3847, + 3999, 0, 3843, + 3997, 0, 3841, + 3993, 0, 3837, + 3987, 0, 3831, + 3981, 0, 3825, + 3971, 0, 3815, + 3959, 990, 3801, + 3941, 2109, 3781, + 3917, 2473, 3755, + 3881, 2723, 3715, + 3831, 2927, 3657, + 3751, 3107, 3567, + 3619, 3271, 3409, + 3341, 3427, 3035, + 0, 3575, 0, + 0, 3719, 0, + 0, 3861, 0, + 0, 3999, 0, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3973, + 4095, 0, 3973, + 4095, 0, 3973, + 4095, 0, 3971, + 4095, 0, 3971, + 4095, 0, 3969, + 4095, 0, 3967, + 4095, 0, 3963, + 4095, 0, 3959, + 4095, 0, 3953, + 4095, 0, 3947, + 4095, 0, 3935, + 4087, 0, 3921, + 4071, 2173, 3903, + 4045, 2575, 3875, + 4011, 2839, 3835, + 3959, 3049, 3775, + 3879, 3233, 3681, + 3743, 3399, 3515, + 3461, 3555, 3109, + 0, 3705, 0, + 0, 3849, 0, + 0, 3991, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4093, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4085, + 4095, 0, 4079, + 4095, 0, 4071, + 4095, 0, 4061, + 4095, 0, 4045, + 4095, 2245, 4025, + 4095, 2683, 3997, + 4095, 2959, 3957, + 4087, 3173, 3897, + 4007, 3359, 3799, + 3871, 3527, 3627, + 3585, 3685, 3189, + 0, 3835, 0, + 0, 3981, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2327, 4095, + 4095, 2797, 4095, + 4095, 3081, 4081, + 4095, 3299, 4019, + 4095, 3487, 3921, + 3999, 3657, 3743, + 3711, 3815, 3281, + 0, 3965, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2417, 4095, + 4095, 2915, 4095, + 4095, 3205, 4095, + 4095, 3427, 4095, + 4095, 3615, 4045, + 4095, 3787, 3865, + 3837, 3945, 3379, + 2431, 1983, 2843, + 2429, 1985, 2843, + 2427, 1987, 2841, + 2425, 1990, 2841, + 2421, 1994, 2839, + 2415, 1999, 2839, + 2409, 2005, 2837, + 2401, 2014, 2833, + 2387, 2026, 2831, + 2371, 2041, 2825, + 2347, 2061, 2819, + 2313, 2085, 2809, + 2265, 2115, 2797, + 2189, 2155, 2781, + 2063, 2201, 2757, + 1810, 2257, 2723, + 0, 2323, 2673, + 0, 2397, 2597, + 0, 2481, 2471, + 0, 2575, 2215, + 0, 2675, 0, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2433, 1983, 2843, + 2431, 1984, 2843, + 2429, 1987, 2843, + 2425, 1989, 2841, + 2423, 1993, 2841, + 2417, 1998, 2839, + 2411, 2005, 2837, + 2403, 2014, 2835, + 2389, 2026, 2831, + 2373, 2041, 2825, + 2349, 2061, 2819, + 2317, 2085, 2811, + 2267, 2115, 2797, + 2193, 2155, 2781, + 2067, 2201, 2757, + 1818, 2257, 2723, + 69, 2323, 2675, + 0, 2397, 2599, + 0, 2481, 2471, + 0, 2575, 2217, + 0, 2675, 0, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2435, 1982, 2845, + 2433, 1984, 2843, + 2431, 1986, 2843, + 2429, 1989, 2843, + 2425, 1993, 2841, + 2421, 1998, 2839, + 2413, 2005, 2837, + 2405, 2014, 2835, + 2393, 2025, 2831, + 2375, 2040, 2827, + 2353, 2059, 2819, + 2319, 2085, 2811, + 2271, 2115, 2799, + 2197, 2153, 2781, + 2073, 2201, 2759, + 1827, 2257, 2725, + 383, 2323, 2675, + 0, 2397, 2599, + 0, 2481, 2473, + 0, 2573, 2219, + 0, 2675, 0, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2437, 1982, 2845, + 2437, 1984, 2845, + 2435, 1986, 2843, + 2431, 1989, 2843, + 2429, 1993, 2843, + 2423, 1998, 2841, + 2417, 2004, 2839, + 2409, 2013, 2835, + 2397, 2025, 2833, + 2379, 2040, 2827, + 2357, 2059, 2821, + 2323, 2085, 2811, + 2275, 2115, 2799, + 2201, 2153, 2783, + 2081, 2201, 2759, + 1840, 2257, 2725, + 615, 2321, 2677, + 0, 2397, 2601, + 0, 2481, 2475, + 0, 2573, 2223, + 0, 2673, 39, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2443, 1981, 2847, + 2441, 1983, 2845, + 2439, 1985, 2845, + 2437, 1988, 2845, + 2433, 1992, 2843, + 2429, 1997, 2841, + 2421, 2004, 2839, + 2413, 2013, 2837, + 2401, 2024, 2833, + 2385, 2039, 2829, + 2361, 2059, 2823, + 2329, 2083, 2813, + 2281, 2115, 2801, + 2209, 2153, 2785, + 2089, 2201, 2761, + 1856, 2257, 2727, + 810, 2321, 2679, + 0, 2397, 2603, + 0, 2481, 2477, + 0, 2573, 2227, + 0, 2673, 413, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2449, 1981, 2847, + 2447, 1982, 2847, + 2445, 1984, 2847, + 2443, 1987, 2845, + 2439, 1991, 2845, + 2435, 1996, 2843, + 2427, 2003, 2841, + 2419, 2012, 2839, + 2407, 2024, 2835, + 2391, 2039, 2831, + 2369, 2059, 2823, + 2337, 2083, 2815, + 2289, 2115, 2803, + 2219, 2153, 2787, + 2103, 2199, 2763, + 1877, 2255, 2729, + 984, 2321, 2681, + 0, 2397, 2605, + 0, 2481, 2481, + 0, 2573, 2235, + 0, 2673, 667, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2455, 1979, 2849, + 2455, 1981, 2849, + 2453, 1983, 2849, + 2449, 1986, 2849, + 2447, 1990, 2847, + 2441, 1995, 2845, + 2435, 2002, 2843, + 2427, 2011, 2841, + 2415, 2023, 2837, + 2399, 2038, 2833, + 2377, 2057, 2827, + 2347, 2083, 2817, + 2301, 2113, 2805, + 2231, 2151, 2789, + 2119, 2199, 2765, + 1903, 2255, 2733, + 1145, 2321, 2683, + 0, 2395, 2609, + 0, 2481, 2487, + 0, 2573, 2243, + 0, 2673, 873, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2465, 1978, 2853, + 2465, 1980, 2853, + 2463, 1982, 2851, + 2461, 1985, 2851, + 2457, 1989, 2849, + 2453, 1994, 2849, + 2447, 2001, 2847, + 2437, 2010, 2843, + 2427, 2021, 2841, + 2411, 2036, 2835, + 2389, 2057, 2829, + 2359, 2081, 2821, + 2315, 2113, 2809, + 2247, 2151, 2791, + 2139, 2199, 2769, + 1936, 2255, 2735, + 1298, 2321, 2687, + 0, 2395, 2615, + 0, 2479, 2493, + 0, 2573, 2253, + 0, 2673, 1053, + 0, 2779, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2479, 1976, 2857, + 2477, 1978, 2857, + 2475, 1980, 2855, + 2473, 1983, 2855, + 2471, 1987, 2853, + 2465, 1992, 2853, + 2459, 1999, 2851, + 2451, 2008, 2847, + 2441, 2020, 2845, + 2425, 2035, 2839, + 2405, 2055, 2833, + 2375, 2079, 2825, + 2333, 2111, 2813, + 2269, 2149, 2797, + 2165, 2197, 2773, + 1977, 2253, 2741, + 1445, 2319, 2693, + 0, 2395, 2621, + 0, 2479, 2501, + 0, 2573, 2267, + 0, 2673, 1218, + 0, 2779, 0, + 0, 2891, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2495, 1973, 2861, + 2495, 1975, 2861, + 2493, 1977, 2861, + 2491, 1980, 2859, + 2487, 1984, 2859, + 2483, 1989, 2857, + 2477, 1996, 2855, + 2469, 2005, 2853, + 2459, 2017, 2849, + 2445, 2032, 2845, + 2425, 2053, 2839, + 2397, 2077, 2829, + 2357, 2109, 2819, + 2295, 2147, 2801, + 2199, 2195, 2779, + 2026, 2251, 2747, + 1587, 2317, 2701, + 0, 2393, 2629, + 0, 2479, 2511, + 0, 2571, 2285, + 0, 2673, 1373, + 0, 2779, 0, + 0, 2891, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2517, 1970, 2869, + 2517, 1972, 2867, + 2515, 1974, 2867, + 2513, 1977, 2867, + 2509, 1981, 2865, + 2505, 1986, 2863, + 2501, 1993, 2863, + 2493, 2002, 2859, + 2483, 2014, 2857, + 2469, 2029, 2851, + 2451, 2049, 2845, + 2423, 2075, 2837, + 2385, 2107, 2825, + 2329, 2145, 2809, + 2239, 2193, 2787, + 2085, 2249, 2755, + 1727, 2317, 2709, + 0, 2393, 2639, + 0, 2477, 2527, + 0, 2571, 2309, + 0, 2671, 1522, + 0, 2779, 0, + 0, 2891, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2545, 1965, 2877, + 2543, 1967, 2877, + 2543, 1969, 2875, + 2541, 1972, 2875, + 2537, 1976, 2875, + 2533, 1981, 2873, + 2529, 1988, 2871, + 2521, 1998, 2869, + 2513, 2010, 2865, + 2499, 2025, 2861, + 2481, 2045, 2855, + 2457, 2071, 2847, + 2421, 2103, 2835, + 2369, 2143, 2819, + 2289, 2191, 2797, + 2153, 2247, 2767, + 1865, 2315, 2721, + 0, 2391, 2655, + 0, 2475, 2545, + 0, 2569, 2337, + 0, 2671, 1666, + 0, 2777, 0, + 0, 2891, 0, + 0, 3007, 0, + 0, 3129, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2579, 1959, 2889, + 2579, 1960, 2887, + 2577, 1963, 2887, + 2575, 1966, 2887, + 2573, 1970, 2885, + 2569, 1975, 2885, + 2565, 1982, 2883, + 2557, 1992, 2881, + 2549, 2004, 2877, + 2537, 2019, 2873, + 2521, 2040, 2867, + 2499, 2065, 2859, + 2467, 2097, 2847, + 2419, 2137, 2833, + 2347, 2187, 2811, + 2231, 2243, 2781, + 2002, 2311, 2737, + 1065, 2387, 2673, + 0, 2473, 2567, + 0, 2567, 2373, + 0, 2669, 1807, + 0, 2777, 0, + 0, 2889, 0, + 0, 3007, 0, + 0, 3127, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2621, 1950, 2903, + 2621, 1952, 2903, + 2619, 1954, 2903, + 2617, 1957, 2901, + 2615, 1961, 2901, + 2611, 1967, 2899, + 2607, 1974, 2897, + 2601, 1983, 2895, + 2595, 1996, 2891, + 2583, 2012, 2887, + 2569, 2032, 2881, + 2549, 2059, 2875, + 2519, 2091, 2863, + 2479, 2131, 2849, + 2415, 2181, 2829, + 2317, 2239, 2799, + 2137, 2307, 2759, + 1662, 2385, 2697, + 0, 2471, 2597, + 0, 2565, 2417, + 0, 2667, 1946, + 0, 2775, 0, + 0, 2889, 0, + 0, 3007, 0, + 0, 3127, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2673, 1938, 2923, + 2671, 1940, 2921, + 2671, 1942, 2921, + 2669, 1945, 2921, + 2667, 1949, 2919, + 2663, 1955, 2919, + 2661, 1962, 2917, + 2655, 1972, 2915, + 2649, 1985, 2911, + 2639, 2001, 2907, + 2625, 2022, 2901, + 2607, 2049, 2895, + 2583, 2083, 2885, + 2547, 2123, 2871, + 2493, 2173, 2851, + 2411, 2233, 2823, + 2271, 2301, 2785, + 1972, 2379, 2725, + 0, 2467, 2633, + 0, 2563, 2471, + 0, 2665, 2083, + 0, 2773, 0, + 0, 2887, 0, + 0, 3005, 0, + 0, 3127, 0, + 0, 3249, 0, + 0, 3375, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2733, 1921, 2947, + 2731, 1923, 2947, + 2731, 1926, 2945, + 2729, 1929, 2945, + 2727, 1933, 2945, + 2725, 1939, 2943, + 2721, 1947, 2941, + 2717, 1957, 2939, + 2711, 1970, 2937, + 2703, 1987, 2933, + 2693, 2009, 2927, + 2677, 2036, 2921, + 2655, 2071, 2911, + 2625, 2113, 2897, + 2581, 2163, 2879, + 2513, 2225, 2853, + 2405, 2295, 2817, + 2203, 2373, 2763, + 1574, 2461, 2679, + 0, 2559, 2533, + 0, 2661, 2219, + 0, 2771, 0, + 0, 2885, 0, + 0, 3003, 0, + 0, 3125, 0, + 0, 3249, 0, + 0, 3375, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2803, 1898, 2977, + 2801, 1900, 2977, + 2801, 1903, 2977, + 2799, 1906, 2975, + 2799, 1911, 2975, + 2797, 1917, 2973, + 2793, 1925, 2973, + 2789, 1935, 2971, + 2785, 1949, 2967, + 2777, 1967, 2963, + 2767, 1990, 2959, + 2755, 2018, 2953, + 2737, 2055, 2943, + 2711, 2097, 2931, + 2675, 2151, 2915, + 2621, 2213, 2891, + 2539, 2285, 2857, + 2397, 2365, 2807, + 2093, 2455, 2733, + 0, 2553, 2607, + 0, 2657, 2353, + 0, 2767, 0, + 0, 2883, 0, + 0, 3001, 0, + 0, 3123, 0, + 0, 3247, 0, + 0, 3375, 0, + 0, 3501, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2881, 1865, 3015, + 2881, 1867, 3015, + 2881, 1870, 3015, + 2879, 1874, 3013, + 2879, 1879, 3013, + 2877, 1885, 3011, + 2875, 1894, 3011, + 2871, 1905, 3009, + 2867, 1920, 3007, + 2861, 1939, 3003, + 2853, 1963, 2999, + 2843, 1993, 2993, + 2827, 2031, 2985, + 2807, 2077, 2973, + 2777, 2131, 2957, + 2735, 2197, 2937, + 2673, 2271, 2905, + 2571, 2353, 2861, + 2387, 2445, 2795, + 1882, 2545, 2687, + 0, 2651, 2487, + 0, 2763, 1872, + 0, 2879, 0, + 0, 2999, 0, + 0, 3121, 0, + 0, 3247, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2969, 1817, 3061, + 2969, 1819, 3061, + 2969, 1822, 3061, + 2969, 1826, 3059, + 2967, 1832, 3059, + 2965, 1839, 3059, + 2963, 1849, 3057, + 2961, 1861, 3055, + 2957, 1877, 3053, + 2953, 1898, 3051, + 2947, 1924, 3047, + 2937, 1957, 3041, + 2925, 1998, 3033, + 2909, 2047, 3023, + 2885, 2105, 3009, + 2853, 2173, 2991, + 2805, 2251, 2963, + 2731, 2337, 2925, + 2611, 2433, 2869, + 2371, 2535, 2779, + 1178, 2643, 2621, + 0, 2757, 2255, + 0, 2873, 0, + 0, 2995, 0, + 0, 3119, 0, + 0, 3243, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 3067, 1743, 3117, + 3065, 1746, 3117, + 3065, 1749, 3115, + 3065, 1754, 3115, + 3063, 1761, 3115, + 3063, 1769, 3113, + 3061, 1780, 3113, + 3059, 1795, 3111, + 3057, 1813, 3109, + 3053, 1837, 3107, + 3047, 1867, 3103, + 3041, 1904, 3099, + 3031, 1950, 3093, + 3017, 2004, 3083, + 2999, 2069, 3071, + 2973, 2141, 3055, + 2937, 2225, 3031, + 2883, 2315, 2999, + 2801, 2415, 2951, + 2657, 2521, 2877, + 2349, 2631, 2755, + 0, 2747, 2513, + 0, 2867, 1244, + 0, 2989, 0, + 0, 3115, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 3169, 1621, 3181, + 3169, 1624, 3181, + 3169, 1629, 3181, + 3169, 1636, 3181, + 3167, 1644, 3179, + 3167, 1655, 3179, + 3165, 1669, 3179, + 3163, 1687, 3177, + 3161, 1711, 3175, + 3159, 1741, 3173, + 3155, 1777, 3169, + 3149, 1822, 3165, + 3141, 1876, 3161, + 3131, 1940, 3153, + 3117, 2012, 3143, + 3097, 2095, 3129, + 3071, 2185, 3109, + 3031, 2285, 3081, + 2971, 2389, 3041, + 2879, 2501, 2981, + 2715, 2617, 2887, + 2319, 2735, 2719, + 0, 2857, 2309, + 0, 2983, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 3279, 1379, 3255, + 3279, 1385, 3255, + 3279, 1394, 3255, + 3277, 1404, 3255, + 3277, 1418, 3255, + 3277, 1436, 3253, + 3275, 1459, 3253, + 3275, 1487, 3251, + 3273, 1523, 3251, + 3271, 1567, 3249, + 3267, 1620, 3245, + 3263, 1683, 3243, + 3257, 1754, 3237, + 3249, 1836, 3231, + 3239, 1925, 3223, + 3223, 2023, 3211, + 3203, 2127, 3195, + 3173, 2239, 3171, + 3131, 2353, 3139, + 3067, 2473, 3091, + 2967, 2595, 3019, + 2781, 2719, 2901, + 2275, 2845, 2669, + 0, 2973, 1672, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3393, 117, 3339, + 3393, 207, 3339, + 3393, 305, 3339, + 3393, 410, 3339, + 3391, 520, 3337, + 3391, 636, 3337, + 3391, 755, 3337, + 3389, 877, 3335, + 3389, 1001, 3335, + 3387, 1128, 3333, + 3383, 1255, 3331, + 3381, 1384, 3329, + 3375, 1514, 3325, + 3369, 1644, 3319, + 3361, 1775, 3311, + 3351, 1906, 3303, + 3335, 2037, 3289, + 3313, 2169, 3271, + 3283, 2301, 3245, + 3239, 2433, 3207, + 3171, 2565, 3153, + 3061, 2697, 3067, + 2857, 2829, 2919, + 2207, 2961, 2591, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3511, 0, 3431, + 3511, 0, 3431, + 3511, 0, 3431, + 3511, 0, 3431, + 3511, 0, 3431, + 3509, 0, 3429, + 3509, 0, 3429, + 3509, 0, 3429, + 3507, 0, 3427, + 3507, 0, 3427, + 3505, 0, 3425, + 3501, 0, 3423, + 3499, 286, 3419, + 3493, 1096, 3415, + 3487, 1436, 3409, + 3479, 1678, 3401, + 3467, 1878, 3391, + 3451, 2055, 3375, + 3429, 2219, 3355, + 3397, 2373, 3327, + 3351, 2521, 3285, + 3279, 2663, 3223, + 3165, 2803, 3123, + 2943, 2943, 2943, + 2099, 3079, 2463, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3633, 0, 3531, + 3633, 0, 3531, + 3633, 0, 3531, + 3633, 0, 3531, + 3633, 0, 3529, + 3631, 0, 3529, + 3631, 0, 3529, + 3631, 0, 3529, + 3629, 0, 3527, + 3629, 0, 3527, + 3627, 0, 3525, + 3625, 0, 3523, + 3623, 0, 3521, + 3619, 0, 3517, + 3615, 0, 3513, + 3609, 756, 3507, + 3599, 1506, 3499, + 3587, 1839, 3487, + 3571, 2079, 3471, + 3547, 2277, 3449, + 3515, 2453, 3417, + 3467, 2615, 3371, + 3395, 2769, 3301, + 3273, 2917, 3189, + 3035, 3061, 2971, + 1896, 3201, 2197, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3755, 0, 3635, + 3755, 0, 3635, + 3755, 0, 3635, + 3753, 0, 3633, + 3753, 0, 3633, + 3751, 0, 3631, + 3749, 0, 3629, + 3747, 0, 3627, + 3743, 0, 3623, + 3739, 0, 3619, + 3731, 0, 3611, + 3723, 1069, 3603, + 3711, 1780, 3591, + 3693, 2107, 3573, + 3671, 2345, 3549, + 3637, 2543, 3515, + 3587, 2719, 3467, + 3513, 2881, 3391, + 3387, 3035, 3263, + 3137, 3181, 3007, + 1263, 3325, 0, + 0, 3465, 0, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3747, + 3881, 0, 3747, + 3881, 0, 3747, + 3881, 0, 3747, + 3881, 0, 3747, + 3879, 0, 3745, + 3879, 0, 3745, + 3877, 0, 3743, + 3875, 0, 3741, + 3873, 0, 3737, + 3869, 0, 3733, + 3863, 0, 3729, + 3857, 0, 3721, + 3849, 0, 3713, + 3835, 1687, 3699, + 3819, 2145, 3681, + 3795, 2423, 3657, + 3761, 2641, 3621, + 3711, 2827, 3569, + 3633, 2997, 3487, + 3505, 3155, 3347, + 3243, 3305, 3053, + 0, 3451, 0, + 0, 3593, 0, + 0, 3733, 0, + 0, 3869, 0, + 0, 4005, 0, + 4011, 0, 3865, + 4011, 0, 3865, + 4011, 0, 3865, + 4011, 0, 3865, + 4009, 0, 3865, + 4009, 0, 3865, + 4009, 0, 3865, + 4009, 0, 3863, + 4009, 0, 3863, + 4009, 0, 3863, + 4007, 0, 3863, + 4007, 0, 3861, + 4005, 0, 3861, + 4005, 0, 3859, + 4003, 0, 3857, + 3999, 0, 3853, + 3997, 0, 3849, + 3991, 0, 3845, + 3985, 0, 3837, + 3975, 0, 3827, + 3963, 1522, 3815, + 3945, 2189, 3795, + 3921, 2511, 3769, + 3887, 2745, 3731, + 3835, 2941, 3677, + 3757, 3117, 3589, + 3627, 3279, 3441, + 3357, 3431, 3105, + 0, 3579, 0, + 0, 3721, 0, + 0, 3861, 0, + 0, 3999, 0, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3983, + 4095, 0, 3983, + 4095, 0, 3983, + 4095, 0, 3983, + 4095, 0, 3981, + 4095, 0, 3981, + 4095, 0, 3979, + 4095, 0, 3977, + 4095, 0, 3973, + 4095, 0, 3969, + 4095, 0, 3963, + 4095, 0, 3957, + 4095, 0, 3947, + 4091, 1122, 3933, + 4073, 2243, 3913, + 4049, 2605, 3887, + 4015, 2855, 3847, + 3963, 3061, 3789, + 3883, 3239, 3699, + 3751, 3405, 3541, + 3473, 3559, 3169, + 0, 3707, 0, + 0, 3851, 0, + 0, 3993, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4091, + 4095, 0, 4085, + 4095, 0, 4079, + 4095, 0, 4069, + 4095, 0, 4053, + 4095, 2305, 4035, + 4095, 2707, 4007, + 4095, 2971, 3967, + 4091, 3181, 3907, + 4011, 3365, 3813, + 3877, 3531, 3647, + 3593, 3687, 3241, + 0, 3837, 0, + 0, 3981, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2377, 4095, + 4095, 2815, 4095, + 4095, 3091, 4089, + 4095, 3305, 4029, + 4095, 3491, 3933, + 4003, 3659, 3759, + 3717, 3817, 3321, + 0, 3967, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2459, 4095, + 4095, 2929, 4095, + 4095, 3213, 4095, + 4095, 3431, 4095, + 4095, 3619, 4053, + 4095, 3789, 3877, + 3843, 3947, 3413, + 2563, 2115, 2975, + 2561, 2115, 2975, + 2559, 2117, 2975, + 2557, 2119, 2973, + 2555, 2123, 2973, + 2551, 2125, 2971, + 2547, 2131, 2971, + 2539, 2137, 2969, + 2531, 2147, 2965, + 2519, 2159, 2961, + 2501, 2173, 2957, + 2477, 2193, 2951, + 2445, 2217, 2941, + 2395, 2249, 2929, + 2319, 2287, 2913, + 2193, 2333, 2889, + 1937, 2389, 2855, + 0, 2455, 2805, + 0, 2529, 2729, + 0, 2613, 2601, + 0, 2707, 2345, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2563, 2113, 2975, + 2563, 2115, 2975, + 2561, 2117, 2975, + 2559, 2119, 2973, + 2557, 2121, 2973, + 2553, 2125, 2973, + 2547, 2131, 2971, + 2541, 2137, 2969, + 2533, 2147, 2965, + 2519, 2157, 2963, + 2503, 2173, 2957, + 2479, 2193, 2951, + 2445, 2217, 2941, + 2397, 2249, 2929, + 2321, 2287, 2913, + 2195, 2333, 2889, + 1942, 2389, 2855, + 0, 2455, 2805, + 0, 2529, 2729, + 0, 2613, 2603, + 0, 2707, 2347, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2565, 2113, 2975, + 2565, 2115, 2975, + 2563, 2117, 2975, + 2561, 2119, 2975, + 2559, 2121, 2973, + 2555, 2125, 2973, + 2549, 2131, 2971, + 2543, 2137, 2969, + 2535, 2147, 2967, + 2523, 2157, 2963, + 2505, 2173, 2957, + 2481, 2193, 2951, + 2449, 2217, 2943, + 2399, 2247, 2931, + 2325, 2287, 2913, + 2199, 2333, 2889, + 1950, 2389, 2855, + 201, 2455, 2807, + 0, 2529, 2731, + 0, 2613, 2603, + 0, 2707, 2349, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2567, 2113, 2977, + 2567, 2115, 2977, + 2565, 2117, 2975, + 2563, 2119, 2975, + 2561, 2121, 2975, + 2557, 2125, 2973, + 2553, 2131, 2971, + 2545, 2137, 2969, + 2537, 2145, 2967, + 2525, 2157, 2963, + 2509, 2173, 2959, + 2485, 2191, 2953, + 2451, 2217, 2943, + 2403, 2247, 2931, + 2329, 2287, 2913, + 2205, 2333, 2891, + 1959, 2389, 2857, + 515, 2455, 2807, + 0, 2529, 2731, + 0, 2613, 2605, + 0, 2707, 2351, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2571, 2113, 2977, + 2569, 2115, 2977, + 2569, 2115, 2977, + 2567, 2117, 2977, + 2563, 2121, 2975, + 2561, 2125, 2975, + 2555, 2129, 2973, + 2549, 2137, 2971, + 2541, 2145, 2969, + 2529, 2157, 2965, + 2511, 2173, 2959, + 2489, 2191, 2953, + 2455, 2217, 2945, + 2407, 2247, 2931, + 2333, 2285, 2915, + 2213, 2333, 2891, + 1972, 2389, 2857, + 748, 2455, 2809, + 0, 2529, 2733, + 0, 2613, 2607, + 0, 2705, 2355, + 0, 2807, 171, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2575, 2113, 2979, + 2575, 2113, 2979, + 2573, 2115, 2977, + 2571, 2117, 2977, + 2569, 2121, 2977, + 2565, 2125, 2975, + 2561, 2129, 2973, + 2553, 2135, 2971, + 2545, 2145, 2969, + 2533, 2157, 2965, + 2517, 2171, 2961, + 2493, 2191, 2955, + 2461, 2215, 2945, + 2413, 2247, 2933, + 2341, 2285, 2917, + 2221, 2333, 2893, + 1988, 2389, 2859, + 942, 2453, 2811, + 0, 2529, 2735, + 0, 2613, 2611, + 0, 2705, 2359, + 0, 2805, 544, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2581, 2111, 2981, + 2581, 2113, 2979, + 2579, 2115, 2979, + 2577, 2117, 2979, + 2575, 2119, 2979, + 2571, 2123, 2977, + 2567, 2129, 2975, + 2559, 2135, 2973, + 2551, 2145, 2971, + 2539, 2155, 2967, + 2523, 2171, 2963, + 2501, 2191, 2955, + 2469, 2215, 2947, + 2423, 2247, 2935, + 2351, 2285, 2919, + 2235, 2331, 2895, + 2009, 2387, 2861, + 1116, 2453, 2813, + 0, 2529, 2737, + 0, 2613, 2613, + 0, 2705, 2367, + 0, 2805, 799, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2589, 2111, 2983, + 2587, 2111, 2983, + 2587, 2113, 2981, + 2585, 2115, 2981, + 2583, 2119, 2981, + 2579, 2123, 2979, + 2575, 2127, 2977, + 2567, 2135, 2975, + 2559, 2143, 2973, + 2547, 2155, 2969, + 2533, 2169, 2965, + 2509, 2189, 2959, + 2479, 2215, 2949, + 2433, 2245, 2937, + 2363, 2285, 2921, + 2251, 2331, 2897, + 2035, 2387, 2865, + 1277, 2453, 2815, + 0, 2529, 2741, + 0, 2613, 2619, + 0, 2705, 2375, + 0, 2805, 1005, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2599, 2109, 2985, + 2597, 2111, 2985, + 2597, 2111, 2985, + 2595, 2113, 2983, + 2593, 2117, 2983, + 2589, 2121, 2983, + 2585, 2125, 2981, + 2579, 2133, 2979, + 2571, 2141, 2975, + 2559, 2153, 2973, + 2543, 2169, 2967, + 2521, 2189, 2961, + 2491, 2213, 2953, + 2447, 2245, 2941, + 2379, 2283, 2923, + 2271, 2331, 2901, + 2069, 2387, 2867, + 1430, 2453, 2819, + 0, 2527, 2747, + 0, 2611, 2625, + 0, 2705, 2385, + 0, 2805, 1185, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2611, 2107, 2989, + 2611, 2109, 2989, + 2609, 2109, 2989, + 2607, 2113, 2987, + 2605, 2115, 2987, + 2603, 2119, 2985, + 2597, 2125, 2985, + 2593, 2131, 2983, + 2585, 2139, 2979, + 2573, 2151, 2977, + 2559, 2167, 2971, + 2537, 2187, 2965, + 2507, 2211, 2957, + 2465, 2243, 2945, + 2401, 2281, 2929, + 2297, 2329, 2905, + 2109, 2385, 2873, + 1577, 2451, 2825, + 0, 2527, 2753, + 0, 2611, 2633, + 0, 2705, 2399, + 0, 2805, 1350, + 0, 2911, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2629, 2105, 2995, + 2627, 2105, 2993, + 2627, 2107, 2993, + 2625, 2109, 2993, + 2623, 2113, 2991, + 2619, 2117, 2991, + 2615, 2121, 2989, + 2609, 2129, 2987, + 2601, 2137, 2985, + 2591, 2149, 2981, + 2577, 2165, 2977, + 2557, 2185, 2971, + 2529, 2209, 2961, + 2489, 2241, 2951, + 2427, 2279, 2933, + 2331, 2327, 2911, + 2159, 2383, 2879, + 1720, 2451, 2833, + 0, 2525, 2761, + 0, 2611, 2645, + 0, 2703, 2417, + 0, 2805, 1506, + 0, 2911, 0, + 0, 3023, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2651, 2101, 3001, + 2649, 2101, 3001, + 2649, 2103, 2999, + 2647, 2105, 2999, + 2645, 2109, 2999, + 2641, 2113, 2997, + 2637, 2119, 2997, + 2633, 2125, 2995, + 2625, 2135, 2991, + 2615, 2147, 2989, + 2601, 2161, 2983, + 2583, 2181, 2977, + 2555, 2207, 2969, + 2517, 2239, 2957, + 2461, 2277, 2941, + 2371, 2325, 2919, + 2217, 2383, 2887, + 1860, 2449, 2841, + 0, 2525, 2773, + 0, 2609, 2659, + 0, 2703, 2441, + 0, 2803, 1654, + 0, 2911, 0, + 0, 3023, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2677, 2095, 3009, + 2677, 2097, 3009, + 2675, 2099, 3009, + 2675, 2101, 3009, + 2673, 2105, 3007, + 2669, 2109, 3007, + 2665, 2113, 3005, + 2661, 2121, 3003, + 2653, 2129, 3001, + 2645, 2141, 2997, + 2631, 2157, 2993, + 2615, 2177, 2987, + 2589, 2203, 2979, + 2553, 2235, 2967, + 2501, 2275, 2951, + 2421, 2323, 2929, + 2285, 2379, 2899, + 1998, 2447, 2855, + 0, 2523, 2787, + 0, 2607, 2677, + 0, 2701, 2469, + 0, 2803, 1798, + 0, 2909, 0, + 0, 3023, 0, + 0, 3139, 0, + 0, 3261, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2713, 2089, 3021, + 2711, 2091, 3021, + 2711, 2093, 3021, + 2709, 2095, 3019, + 2707, 2097, 3019, + 2705, 2101, 3017, + 2701, 2107, 3017, + 2697, 2115, 3015, + 2689, 2123, 3013, + 2681, 2135, 3009, + 2669, 2151, 3005, + 2653, 2171, 2999, + 2631, 2197, 2991, + 2599, 2231, 2979, + 2551, 2269, 2965, + 2479, 2319, 2943, + 2363, 2377, 2913, + 2133, 2443, 2869, + 1197, 2519, 2805, + 0, 2605, 2699, + 0, 2699, 2505, + 0, 2801, 1939, + 0, 2909, 0, + 0, 3021, 0, + 0, 3139, 0, + 0, 3259, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2755, 2081, 3035, + 2753, 2081, 3035, + 2753, 2083, 3035, + 2751, 2087, 3035, + 2749, 2089, 3033, + 2747, 2093, 3033, + 2745, 2099, 3031, + 2739, 2107, 3029, + 2735, 2115, 3027, + 2727, 2127, 3025, + 2715, 2143, 3019, + 2701, 2165, 3015, + 2681, 2191, 3007, + 2651, 2223, 2995, + 2611, 2265, 2981, + 2549, 2313, 2961, + 2449, 2371, 2931, + 2269, 2439, 2891, + 1794, 2517, 2829, + 0, 2603, 2729, + 0, 2697, 2551, + 0, 2799, 2077, + 0, 2907, 0, + 0, 3021, 0, + 0, 3139, 0, + 0, 3259, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 2805, 2069, 3055, + 2805, 2069, 3055, + 2803, 2071, 3053, + 2803, 2075, 3053, + 2801, 2077, 3053, + 2799, 2081, 3051, + 2797, 2087, 3051, + 2793, 2095, 3049, + 2787, 2105, 3047, + 2781, 2117, 3043, + 2771, 2133, 3039, + 2757, 2155, 3033, + 2739, 2181, 3027, + 2715, 2215, 3017, + 2679, 2257, 3003, + 2625, 2305, 2983, + 2543, 2365, 2955, + 2403, 2433, 2917, + 2105, 2511, 2857, + 0, 2599, 2765, + 0, 2695, 2603, + 0, 2797, 2215, + 0, 2905, 0, + 0, 3019, 0, + 0, 3137, 0, + 0, 3259, 0, + 0, 3381, 0, + 0, 3507, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 2865, 2051, 3079, + 2865, 2053, 3079, + 2865, 2055, 3079, + 2863, 2057, 3077, + 2861, 2061, 3077, + 2859, 2065, 3077, + 2857, 2071, 3075, + 2855, 2079, 3073, + 2849, 2089, 3071, + 2843, 2103, 3069, + 2835, 2119, 3065, + 2825, 2141, 3059, + 2809, 2169, 3053, + 2787, 2203, 3043, + 2757, 2245, 3029, + 2713, 2297, 3011, + 2645, 2357, 2985, + 2537, 2427, 2949, + 2335, 2505, 2895, + 1706, 2593, 2811, + 0, 2691, 2667, + 0, 2793, 2351, + 0, 2903, 0, + 0, 3017, 0, + 0, 3135, 0, + 0, 3257, 0, + 0, 3381, 0, + 0, 3507, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 2935, 2029, 3109, + 2935, 2030, 3109, + 2935, 2032, 3109, + 2933, 2035, 3109, + 2933, 2038, 3107, + 2931, 2043, 3107, + 2929, 2049, 3105, + 2925, 2057, 3105, + 2921, 2067, 3103, + 2917, 2081, 3099, + 2909, 2099, 3097, + 2901, 2121, 3091, + 2887, 2151, 3085, + 2869, 2187, 3075, + 2843, 2229, 3063, + 2807, 2283, 3047, + 2753, 2345, 3023, + 2671, 2417, 2989, + 2529, 2497, 2939, + 2225, 2587, 2865, + 0, 2685, 2739, + 0, 2789, 2485, + 0, 2899, 0, + 0, 3015, 0, + 0, 3133, 0, + 0, 3255, 0, + 0, 3379, 0, + 0, 3507, 0, + 0, 3633, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 3015, 1995, 3147, + 3013, 1997, 3147, + 3013, 1999, 3147, + 3013, 2002, 3147, + 3011, 2006, 3145, + 3011, 2011, 3145, + 3009, 2017, 3143, + 3007, 2026, 3143, + 3003, 2037, 3141, + 2999, 2051, 3139, + 2993, 2071, 3135, + 2985, 2095, 3131, + 2975, 2125, 3125, + 2959, 2163, 3117, + 2939, 2209, 3105, + 2909, 2263, 3089, + 2867, 2329, 3069, + 2805, 2403, 3037, + 2703, 2485, 2993, + 2519, 2577, 2927, + 2014, 2677, 2819, + 0, 2783, 2619, + 0, 2895, 2004, + 0, 3011, 0, + 0, 3131, 0, + 0, 3253, 0, + 0, 3379, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4023, 0, + 3103, 1947, 3193, + 3103, 1949, 3193, + 3101, 1951, 3193, + 3101, 1954, 3193, + 3101, 1958, 3193, + 3099, 1964, 3191, + 3097, 1971, 3191, + 3095, 1981, 3189, + 3093, 1993, 3187, + 3089, 2009, 3185, + 3085, 2030, 3183, + 3079, 2057, 3179, + 3069, 2089, 3173, + 3057, 2131, 3165, + 3041, 2179, 3155, + 3017, 2237, 3141, + 2985, 2305, 3123, + 2937, 2383, 3095, + 2863, 2469, 3057, + 2743, 2565, 3001, + 2503, 2667, 2911, + 1310, 2775, 2753, + 0, 2889, 2387, + 0, 3005, 0, + 0, 3127, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 3199, 1873, 3249, + 3199, 1875, 3249, + 3197, 1878, 3249, + 3197, 1882, 3247, + 3197, 1886, 3247, + 3195, 1893, 3247, + 3195, 1901, 3247, + 3193, 1912, 3245, + 3191, 1927, 3243, + 3189, 1946, 3241, + 3185, 1969, 3239, + 3179, 1999, 3235, + 3173, 2036, 3231, + 3163, 2081, 3225, + 3149, 2137, 3215, + 3131, 2201, 3203, + 3107, 2273, 3187, + 3069, 2357, 3163, + 3015, 2447, 3131, + 2933, 2547, 3083, + 2789, 2653, 3009, + 2481, 2763, 2887, + 0, 2879, 2645, + 0, 2999, 1376, + 0, 3121, 0, + 0, 3247, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3891, 0, + 0, 4021, 0, + 3301, 1750, 3313, + 3301, 1753, 3313, + 3301, 1757, 3313, + 3301, 1761, 3313, + 3301, 1768, 3313, + 3299, 1776, 3311, + 3299, 1787, 3311, + 3297, 1801, 3311, + 3295, 1820, 3309, + 3293, 1843, 3307, + 3291, 1873, 3305, + 3287, 1909, 3301, + 3281, 1954, 3297, + 3273, 2008, 3293, + 3263, 2071, 3285, + 3249, 2145, 3275, + 3229, 2227, 3261, + 3203, 2317, 3241, + 3163, 2417, 3213, + 3103, 2521, 3173, + 3011, 2633, 3113, + 2847, 2749, 3019, + 2451, 2867, 2851, + 0, 2991, 2441, + 0, 3115, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4019, 0, + 3411, 1507, 3387, + 3411, 1511, 3387, + 3411, 1518, 3387, + 3411, 1526, 3387, + 3409, 1536, 3387, + 3409, 1550, 3387, + 3409, 1568, 3385, + 3407, 1591, 3385, + 3407, 1620, 3383, + 3405, 1656, 3383, + 3403, 1700, 3381, + 3399, 1752, 3377, + 3395, 1815, 3375, + 3389, 1886, 3369, + 3381, 1968, 3363, + 3371, 2057, 3355, + 3355, 2155, 3343, + 3335, 2259, 3327, + 3305, 2371, 3303, + 3263, 2485, 3271, + 3199, 2605, 3223, + 3099, 2727, 3151, + 2913, 2851, 3033, + 2407, 2977, 2801, + 0, 3105, 1804, + 0, 3235, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3525, 167, 3471, + 3525, 249, 3471, + 3525, 339, 3471, + 3525, 437, 3471, + 3525, 542, 3471, + 3523, 652, 3471, + 3523, 768, 3469, + 3523, 887, 3469, + 3521, 1009, 3467, + 3521, 1133, 3467, + 3519, 1260, 3465, + 3515, 1387, 3463, + 3513, 1516, 3461, + 3509, 1646, 3457, + 3503, 1776, 3451, + 3493, 1907, 3443, + 3483, 2038, 3435, + 3467, 2169, 3421, + 3445, 2301, 3403, + 3415, 2433, 3377, + 3371, 2565, 3339, + 3303, 2697, 3285, + 3193, 2829, 3199, + 2989, 2961, 3051, + 2339, 3093, 2725, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3561, + 3641, 0, 3561, + 3641, 0, 3561, + 3639, 0, 3559, + 3639, 0, 3559, + 3637, 0, 3557, + 3633, 0, 3555, + 3631, 418, 3551, + 3625, 1228, 3547, + 3619, 1568, 3541, + 3611, 1811, 3533, + 3599, 2011, 3523, + 3583, 2187, 3507, + 3561, 2351, 3487, + 3529, 2505, 3459, + 3483, 2653, 3417, + 3413, 2795, 3355, + 3297, 2937, 3255, + 3075, 3075, 3075, + 2231, 3211, 2595, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3763, 0, 3661, + 3763, 0, 3661, + 3763, 0, 3661, + 3763, 0, 3659, + 3761, 0, 3659, + 3759, 0, 3657, + 3757, 0, 3655, + 3755, 0, 3653, + 3751, 0, 3649, + 3747, 0, 3645, + 3741, 888, 3639, + 3731, 1638, 3631, + 3719, 1971, 3619, + 3703, 2211, 3603, + 3681, 2409, 3581, + 3647, 2585, 3549, + 3599, 2749, 3503, + 3527, 2901, 3433, + 3405, 3049, 3321, + 3167, 3193, 3103, + 2028, 3333, 2329, + 0, 3471, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3887, 0, 3767, + 3887, 0, 3767, + 3887, 0, 3767, + 3885, 0, 3765, + 3885, 0, 3765, + 3883, 0, 3763, + 3881, 0, 3761, + 3879, 0, 3759, + 3875, 0, 3755, + 3871, 0, 3751, + 3863, 0, 3743, + 3855, 1201, 3735, + 3843, 1912, 3723, + 3825, 2239, 3705, + 3803, 2477, 3681, + 3769, 2675, 3647, + 3719, 2851, 3599, + 3645, 3013, 3523, + 3519, 3167, 3395, + 3269, 3313, 3139, + 1395, 3457, 0, + 0, 3597, 0, + 0, 3735, 0, + 0, 3871, 0, + 0, 4007, 0, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3879, + 4013, 0, 3879, + 4013, 0, 3879, + 4013, 0, 3879, + 4011, 0, 3877, + 4011, 0, 3877, + 4009, 0, 3875, + 4007, 0, 3873, + 4005, 0, 3869, + 4001, 0, 3867, + 3995, 0, 3861, + 3989, 0, 3855, + 3981, 0, 3845, + 3967, 1819, 3831, + 3951, 2277, 3813, + 3927, 2555, 3789, + 3893, 2773, 3753, + 3843, 2961, 3701, + 3765, 3129, 3619, + 3637, 3287, 3479, + 3375, 3437, 3185, + 0, 3583, 0, + 0, 3725, 0, + 0, 3865, 0, + 0, 4001, 0, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3995, + 4095, 0, 3995, + 4095, 0, 3995, + 4095, 0, 3993, + 4095, 0, 3993, + 4095, 0, 3991, + 4095, 0, 3989, + 4095, 0, 3985, + 4095, 0, 3981, + 4095, 0, 3977, + 4095, 0, 3969, + 4095, 0, 3959, + 4095, 1654, 3947, + 4077, 2321, 3927, + 4053, 2643, 3901, + 4019, 2877, 3865, + 3967, 3075, 3809, + 3889, 3249, 3723, + 3759, 3411, 3573, + 3489, 3563, 3237, + 0, 3711, 0, + 0, 3853, 0, + 0, 3993, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4089, + 4095, 0, 4079, + 4095, 1254, 4065, + 4095, 2375, 4045, + 4095, 2737, 4019, + 4095, 2989, 3979, + 4095, 3193, 3923, + 4015, 3371, 3831, + 3883, 3537, 3673, + 3605, 3691, 3301, + 0, 3839, 0, + 0, 3983, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2437, 4095, + 4095, 2839, 4095, + 4095, 3103, 4095, + 4095, 3313, 4039, + 4095, 3497, 3945, + 4009, 3663, 3779, + 3725, 3819, 3373, + 0, 3969, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2509, 4095, + 4095, 2949, 4095, + 4095, 3223, 4095, + 4095, 3437, 4095, + 4095, 3623, 4065, + 4095, 3791, 3891, + 3849, 3949, 3455, + 2693, 2245, 3107, + 2693, 2247, 3107, + 2691, 2247, 3107, + 2691, 2249, 3107, + 2689, 2251, 3105, + 2685, 2255, 3105, + 2683, 2259, 3103, + 2677, 2263, 3103, + 2671, 2269, 3101, + 2661, 2279, 3097, + 2649, 2291, 3093, + 2633, 2305, 3089, + 2609, 2325, 3083, + 2575, 2349, 3073, + 2525, 2381, 3061, + 2449, 2419, 3043, + 2321, 2465, 3021, + 2065, 2521, 2987, + 0, 2587, 2937, + 0, 2661, 2861, + 0, 2745, 2733, + 0, 2839, 2477, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2695, 2245, 3107, + 2695, 2247, 3107, + 2693, 2247, 3107, + 2691, 2249, 3107, + 2689, 2251, 3105, + 2687, 2255, 3105, + 2683, 2259, 3103, + 2679, 2263, 3103, + 2671, 2269, 3101, + 2663, 2279, 3097, + 2651, 2291, 3095, + 2633, 2305, 3089, + 2609, 2325, 3083, + 2577, 2349, 3073, + 2527, 2381, 3061, + 2451, 2419, 3045, + 2325, 2465, 3021, + 2069, 2521, 2987, + 0, 2587, 2937, + 0, 2661, 2861, + 0, 2745, 2733, + 0, 2839, 2477, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2697, 2245, 3107, + 2695, 2247, 3107, + 2695, 2247, 3107, + 2693, 2249, 3107, + 2691, 2251, 3107, + 2689, 2253, 3105, + 2685, 2257, 3105, + 2679, 2263, 3103, + 2673, 2269, 3101, + 2665, 2279, 3099, + 2653, 2291, 3095, + 2635, 2305, 3089, + 2611, 2325, 3083, + 2577, 2349, 3073, + 2529, 2381, 3061, + 2453, 2419, 3045, + 2327, 2465, 3021, + 2075, 2521, 2987, + 0, 2587, 2937, + 0, 2661, 2861, + 0, 2745, 2735, + 0, 2839, 2479, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2699, 2245, 3109, + 2697, 2245, 3109, + 2697, 2247, 3107, + 2695, 2249, 3107, + 2693, 2251, 3107, + 2691, 2253, 3105, + 2687, 2257, 3105, + 2681, 2263, 3103, + 2675, 2269, 3101, + 2667, 2279, 3099, + 2655, 2289, 3095, + 2637, 2305, 3091, + 2613, 2325, 3083, + 2581, 2349, 3075, + 2531, 2381, 3063, + 2457, 2419, 3045, + 2331, 2465, 3021, + 2081, 2521, 2987, + 333, 2587, 2939, + 0, 2661, 2863, + 0, 2745, 2735, + 0, 2839, 2481, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2701, 2245, 3109, + 2699, 2245, 3109, + 2699, 2247, 3109, + 2697, 2249, 3107, + 2695, 2251, 3107, + 2693, 2253, 3107, + 2689, 2257, 3105, + 2685, 2263, 3103, + 2677, 2269, 3101, + 2669, 2277, 3099, + 2657, 2289, 3095, + 2641, 2305, 3091, + 2617, 2325, 3085, + 2583, 2349, 3075, + 2535, 2379, 3063, + 2461, 2419, 3047, + 2337, 2465, 3023, + 2091, 2521, 2989, + 647, 2587, 2939, + 0, 2661, 2863, + 0, 2745, 2737, + 0, 2839, 2483, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2705, 2245, 3109, + 2703, 2245, 3109, + 2703, 2247, 3109, + 2701, 2247, 3109, + 2699, 2251, 3109, + 2697, 2253, 3107, + 2693, 2257, 3107, + 2687, 2261, 3105, + 2681, 2269, 3103, + 2673, 2277, 3101, + 2661, 2289, 3097, + 2643, 2305, 3091, + 2621, 2323, 3085, + 2587, 2349, 3077, + 2539, 2379, 3063, + 2467, 2417, 3047, + 2345, 2465, 3023, + 2103, 2521, 2989, + 880, 2587, 2941, + 0, 2661, 2865, + 0, 2745, 2739, + 0, 2839, 2487, + 0, 2939, 303, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2709, 2243, 3111, + 2707, 2245, 3111, + 2707, 2245, 3111, + 2705, 2247, 3111, + 2703, 2249, 3109, + 2701, 2253, 3109, + 2697, 2257, 3107, + 2693, 2261, 3107, + 2685, 2269, 3105, + 2677, 2277, 3101, + 2665, 2289, 3097, + 2649, 2303, 3093, + 2627, 2323, 3087, + 2593, 2347, 3077, + 2545, 2379, 3065, + 2473, 2417, 3049, + 2353, 2465, 3025, + 2121, 2521, 2991, + 1074, 2585, 2943, + 0, 2661, 2867, + 0, 2745, 2743, + 0, 2837, 2493, + 0, 2939, 677, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2715, 2243, 3113, + 2713, 2243, 3113, + 2713, 2245, 3113, + 2711, 2247, 3111, + 2709, 2249, 3111, + 2707, 2251, 3111, + 2703, 2255, 3109, + 2699, 2261, 3107, + 2693, 2267, 3105, + 2683, 2277, 3103, + 2671, 2287, 3099, + 2655, 2303, 3095, + 2633, 2323, 3089, + 2601, 2347, 3079, + 2555, 2379, 3067, + 2483, 2417, 3051, + 2367, 2463, 3027, + 2141, 2519, 2993, + 1248, 2585, 2945, + 0, 2661, 2869, + 0, 2745, 2745, + 0, 2837, 2499, + 0, 2937, 931, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2721, 2241, 3115, + 2721, 2243, 3115, + 2719, 2243, 3115, + 2719, 2245, 3113, + 2717, 2247, 3113, + 2715, 2251, 3113, + 2711, 2255, 3111, + 2707, 2259, 3109, + 2701, 2267, 3107, + 2691, 2275, 3105, + 2681, 2287, 3101, + 2665, 2303, 3097, + 2643, 2321, 3091, + 2611, 2347, 3081, + 2565, 2377, 3069, + 2495, 2417, 3053, + 2383, 2463, 3029, + 2167, 2519, 2997, + 1409, 2585, 2947, + 0, 2661, 2873, + 0, 2745, 2751, + 0, 2837, 2507, + 0, 2937, 1137, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2731, 2241, 3117, + 2731, 2241, 3117, + 2731, 2243, 3117, + 2729, 2243, 3117, + 2727, 2247, 3117, + 2725, 2249, 3115, + 2721, 2253, 3115, + 2717, 2259, 3113, + 2711, 2265, 3111, + 2703, 2273, 3109, + 2691, 2285, 3105, + 2675, 2301, 3099, + 2653, 2321, 3093, + 2623, 2345, 3085, + 2579, 2377, 3073, + 2513, 2415, 3057, + 2403, 2463, 3033, + 2201, 2519, 3001, + 1562, 2585, 2951, + 0, 2659, 2879, + 0, 2745, 2757, + 0, 2837, 2517, + 0, 2937, 1317, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2745, 2239, 3121, + 2745, 2239, 3121, + 2743, 2241, 3121, + 2741, 2241, 3121, + 2739, 2245, 3119, + 2737, 2247, 3119, + 2735, 2251, 3117, + 2731, 2257, 3117, + 2725, 2263, 3115, + 2717, 2273, 3111, + 2705, 2283, 3109, + 2691, 2299, 3103, + 2669, 2319, 3097, + 2639, 2343, 3089, + 2597, 2375, 3077, + 2533, 2413, 3061, + 2429, 2461, 3037, + 2241, 2517, 3005, + 1709, 2583, 2957, + 0, 2659, 2885, + 0, 2743, 2765, + 0, 2837, 2531, + 0, 2937, 1482, + 0, 3043, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2761, 2235, 3127, + 2761, 2237, 3127, + 2761, 2237, 3125, + 2759, 2239, 3125, + 2757, 2241, 3125, + 2755, 2245, 3125, + 2751, 2249, 3123, + 2747, 2253, 3121, + 2741, 2261, 3119, + 2735, 2269, 3117, + 2723, 2281, 3113, + 2709, 2297, 3109, + 2689, 2317, 3103, + 2661, 2341, 3095, + 2621, 2373, 3083, + 2559, 2413, 3067, + 2463, 2459, 3043, + 2291, 2517, 3011, + 1852, 2583, 2965, + 0, 2657, 2893, + 0, 2743, 2777, + 0, 2835, 2549, + 0, 2937, 1638, + 0, 3043, 0, + 0, 3155, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2783, 2231, 3133, + 2783, 2233, 3133, + 2781, 2235, 3133, + 2781, 2235, 3133, + 2779, 2239, 3131, + 2777, 2241, 3131, + 2773, 2245, 3129, + 2769, 2251, 3129, + 2765, 2257, 3127, + 2757, 2267, 3123, + 2747, 2279, 3121, + 2733, 2293, 3115, + 2715, 2313, 3109, + 2687, 2339, 3101, + 2649, 2371, 3089, + 2593, 2409, 3073, + 2503, 2457, 3051, + 2349, 2515, 3019, + 1992, 2581, 2973, + 0, 2657, 2905, + 0, 2741, 2791, + 0, 2835, 2573, + 0, 2935, 1786, + 0, 3043, 0, + 0, 3155, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2811, 2227, 3141, + 2811, 2229, 3141, + 2809, 2229, 3141, + 2809, 2231, 3141, + 2807, 2233, 3141, + 2805, 2237, 3139, + 2801, 2241, 3139, + 2797, 2245, 3137, + 2793, 2253, 3135, + 2787, 2261, 3133, + 2777, 2273, 3129, + 2763, 2289, 3125, + 2747, 2309, 3119, + 2721, 2335, 3111, + 2687, 2367, 3099, + 2633, 2407, 3083, + 2553, 2455, 3061, + 2417, 2511, 3031, + 2129, 2579, 2987, + 0, 2655, 2919, + 0, 2739, 2809, + 0, 2833, 2601, + 0, 2935, 1931, + 0, 3043, 0, + 0, 3155, 0, + 0, 3271, 0, + 0, 3393, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2845, 2221, 3153, + 2845, 2221, 3153, + 2843, 2223, 3153, + 2843, 2225, 3153, + 2841, 2227, 3151, + 2839, 2229, 3151, + 2837, 2235, 3149, + 2833, 2239, 3149, + 2829, 2247, 3147, + 2823, 2255, 3145, + 2813, 2267, 3141, + 2801, 2283, 3137, + 2785, 2305, 3131, + 2763, 2329, 3123, + 2731, 2363, 3111, + 2683, 2403, 3097, + 2613, 2451, 3075, + 2495, 2509, 3045, + 2267, 2575, 3003, + 1329, 2653, 2937, + 0, 2737, 2831, + 0, 2831, 2637, + 0, 2933, 2071, + 0, 3041, 0, + 0, 3153, 0, + 0, 3271, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3767, 0, + 0, 3897, 0, + 0, 4025, 0, + 2887, 2211, 3167, + 2887, 2213, 3167, + 2885, 2215, 3167, + 2885, 2215, 3167, + 2883, 2219, 3167, + 2881, 2221, 3165, + 2879, 2225, 3165, + 2877, 2231, 3163, + 2873, 2239, 3161, + 2867, 2247, 3159, + 2859, 2261, 3157, + 2847, 2277, 3151, + 2833, 2297, 3147, + 2813, 2323, 3139, + 2785, 2355, 3127, + 2743, 2397, 3113, + 2681, 2445, 3093, + 2581, 2503, 3065, + 2401, 2571, 3023, + 1927, 2649, 2961, + 0, 2735, 2861, + 0, 2829, 2683, + 0, 2931, 2211, + 0, 3039, 0, + 0, 3153, 0, + 0, 3271, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 2937, 2199, 3187, + 2937, 2201, 3187, + 2937, 2203, 3187, + 2935, 2203, 3185, + 2935, 2207, 3185, + 2933, 2209, 3185, + 2931, 2213, 3183, + 2929, 2219, 3183, + 2925, 2227, 3181, + 2919, 2237, 3179, + 2913, 2249, 3175, + 2903, 2265, 3171, + 2889, 2287, 3167, + 2873, 2313, 3159, + 2847, 2347, 3149, + 2811, 2389, 3135, + 2757, 2439, 3115, + 2675, 2497, 3087, + 2535, 2565, 3049, + 2237, 2645, 2991, + 0, 2731, 2897, + 0, 2827, 2735, + 0, 2929, 2347, + 0, 3037, 0, + 0, 3151, 0, + 0, 3269, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3639, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 2997, 2183, 3211, + 2997, 2185, 3211, + 2997, 2185, 3211, + 2997, 2187, 3211, + 2995, 2189, 3209, + 2993, 2193, 3209, + 2993, 2197, 3209, + 2989, 2203, 3207, + 2987, 2211, 3205, + 2981, 2221, 3203, + 2975, 2235, 3201, + 2967, 2251, 3197, + 2957, 2273, 3191, + 2941, 2301, 3185, + 2919, 2335, 3175, + 2889, 2377, 3161, + 2845, 2429, 3143, + 2777, 2489, 3117, + 2669, 2559, 3081, + 2467, 2637, 3027, + 1839, 2727, 2943, + 0, 2823, 2799, + 0, 2925, 2483, + 0, 3035, 0, + 0, 3149, 0, + 0, 3267, 0, + 0, 3389, 0, + 0, 3513, 0, + 0, 3639, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 3067, 2159, 3241, + 3067, 2161, 3241, + 3067, 2163, 3241, + 3067, 2165, 3241, + 3065, 2167, 3241, + 3065, 2171, 3239, + 3063, 2175, 3239, + 3061, 2181, 3237, + 3057, 2189, 3237, + 3053, 2199, 3235, + 3049, 2213, 3231, + 3041, 2231, 3229, + 3033, 2253, 3223, + 3019, 2283, 3217, + 3001, 2319, 3207, + 2975, 2363, 3195, + 2939, 2415, 3179, + 2887, 2477, 3155, + 2803, 2549, 3121, + 2661, 2629, 3073, + 2357, 2719, 2997, + 0, 2817, 2871, + 0, 2921, 2617, + 0, 3031, 83, + 0, 3147, 0, + 0, 3265, 0, + 0, 3387, 0, + 0, 3511, 0, + 0, 3639, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4025, 0, + 3147, 2127, 3279, + 3147, 2127, 3279, + 3147, 2129, 3279, + 3145, 2131, 3279, + 3145, 2135, 3279, + 3143, 2137, 3277, + 3143, 2143, 3277, + 3141, 2149, 3277, + 3139, 2159, 3275, + 3135, 2169, 3273, + 3131, 2185, 3271, + 3125, 2203, 3267, + 3117, 2227, 3263, + 3107, 2257, 3257, + 3091, 2295, 3249, + 3071, 2341, 3237, + 3041, 2397, 3221, + 2999, 2461, 3201, + 2937, 2535, 3171, + 2835, 2617, 3127, + 2651, 2709, 3059, + 2145, 2809, 2953, + 0, 2915, 2751, + 0, 3027, 2137, + 0, 3143, 0, + 0, 3263, 0, + 0, 3385, 0, + 0, 3511, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4023, 0, + 3235, 2077, 3325, + 3235, 2079, 3325, + 3235, 2081, 3325, + 3233, 2083, 3325, + 3233, 2087, 3325, + 3233, 2091, 3325, + 3231, 2097, 3323, + 3229, 2103, 3323, + 3227, 2113, 3321, + 3225, 2125, 3319, + 3221, 2141, 3317, + 3217, 2163, 3315, + 3211, 2189, 3311, + 3201, 2221, 3305, + 3189, 2263, 3297, + 3173, 2311, 3287, + 3151, 2369, 3273, + 3117, 2437, 3255, + 3069, 2515, 3229, + 2995, 2601, 3189, + 2875, 2697, 3133, + 2635, 2799, 3043, + 1442, 2907, 2885, + 0, 3021, 2519, + 0, 3137, 0, + 0, 3259, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 3331, 2004, 3381, + 3331, 2005, 3381, + 3331, 2007, 3381, + 3331, 2010, 3381, + 3329, 2014, 3381, + 3329, 2019, 3379, + 3329, 2025, 3379, + 3327, 2033, 3379, + 3325, 2045, 3377, + 3323, 2059, 3375, + 3321, 2077, 3373, + 3317, 2101, 3371, + 3311, 2131, 3367, + 3305, 2169, 3363, + 3295, 2215, 3357, + 3281, 2269, 3347, + 3263, 2333, 3335, + 3239, 2405, 3319, + 3201, 2489, 3295, + 3149, 2579, 3263, + 3065, 2679, 3215, + 2923, 2785, 3141, + 2613, 2895, 3019, + 0, 3011, 2777, + 0, 3131, 1508, + 0, 3253, 0, + 0, 3379, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3763, 0, + 0, 3891, 0, + 0, 4023, 0, + 3435, 1880, 3445, + 3433, 1882, 3445, + 3433, 1885, 3445, + 3433, 1889, 3445, + 3433, 1894, 3445, + 3433, 1900, 3445, + 3431, 1908, 3443, + 3431, 1919, 3443, + 3429, 1933, 3443, + 3427, 1952, 3441, + 3425, 1975, 3439, + 3423, 2005, 3437, + 3419, 2042, 3435, + 3413, 2087, 3429, + 3405, 2141, 3425, + 3395, 2203, 3417, + 3381, 2277, 3407, + 3361, 2359, 3393, + 3335, 2449, 3373, + 3295, 2549, 3345, + 3237, 2653, 3305, + 3143, 2765, 3245, + 2979, 2881, 3151, + 2583, 2999, 2985, + 0, 3123, 2573, + 0, 3247, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3631, 0, + 0, 3759, 0, + 0, 3891, 0, + 0, 4021, 0, + 3543, 1635, 3519, + 3543, 1639, 3519, + 3543, 1644, 3519, + 3543, 1650, 3519, + 3543, 1658, 3519, + 3543, 1668, 3519, + 3541, 1682, 3519, + 3541, 1700, 3517, + 3539, 1723, 3517, + 3539, 1752, 3517, + 3537, 1788, 3515, + 3535, 1832, 3513, + 3531, 1885, 3511, + 3527, 1947, 3507, + 3521, 2019, 3501, + 3513, 2099, 3495, + 3503, 2189, 3487, + 3487, 2287, 3475, + 3467, 2393, 3459, + 3437, 2503, 3435, + 3395, 2617, 3403, + 3331, 2737, 3357, + 3231, 2859, 3285, + 3045, 2983, 3165, + 2539, 3109, 2933, + 0, 3237, 1936, + 0, 3367, 0, + 0, 3495, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 3657, 227, 3603, + 3657, 299, 3603, + 3657, 381, 3603, + 3657, 471, 3603, + 3657, 569, 3603, + 3657, 674, 3603, + 3657, 784, 3603, + 3655, 900, 3601, + 3655, 1019, 3601, + 3653, 1141, 3601, + 3653, 1265, 3599, + 3651, 1392, 3597, + 3649, 1520, 3595, + 3645, 1648, 3593, + 3641, 1778, 3589, + 3635, 1908, 3583, + 3625, 2039, 3577, + 3615, 2171, 3567, + 3599, 2301, 3553, + 3577, 2433, 3535, + 3547, 2565, 3509, + 3503, 2697, 3471, + 3435, 2829, 3417, + 3327, 2961, 3331, + 3121, 3093, 3183, + 2471, 3225, 2857, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3693, + 3773, 0, 3693, + 3773, 0, 3693, + 3771, 0, 3691, + 3771, 0, 3691, + 3769, 0, 3689, + 3765, 0, 3687, + 3763, 550, 3683, + 3757, 1360, 3679, + 3751, 1700, 3673, + 3743, 1943, 3665, + 3731, 2143, 3655, + 3715, 2319, 3639, + 3693, 2483, 3619, + 3661, 2637, 3591, + 3615, 2785, 3549, + 3545, 2927, 3487, + 3429, 3069, 3387, + 3207, 3207, 3207, + 2363, 3343, 2727, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3793, + 3895, 0, 3793, + 3895, 0, 3793, + 3895, 0, 3793, + 3893, 0, 3791, + 3891, 0, 3789, + 3889, 0, 3787, + 3887, 0, 3785, + 3883, 0, 3781, + 3879, 0, 3777, + 3873, 1021, 3771, + 3863, 1770, 3763, + 3851, 2103, 3751, + 3835, 2343, 3735, + 3813, 2541, 3713, + 3779, 2717, 3681, + 3731, 2881, 3635, + 3659, 3033, 3567, + 3537, 3181, 3453, + 3299, 3325, 3235, + 2161, 3465, 2461, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4019, 0, 3899, + 4019, 0, 3899, + 4019, 0, 3899, + 4019, 0, 3899, + 4017, 0, 3897, + 4015, 0, 3895, + 4013, 0, 3893, + 4011, 0, 3891, + 4007, 0, 3887, + 4003, 0, 3883, + 3995, 0, 3875, + 3987, 1333, 3867, + 3975, 2044, 3855, + 3957, 2373, 3837, + 3935, 2609, 3813, + 3901, 2807, 3779, + 3851, 2983, 3731, + 3777, 3145, 3655, + 3651, 3299, 3527, + 3401, 3445, 3271, + 1527, 3589, 0, + 0, 3729, 0, + 0, 3867, 0, + 0, 4005, 0, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4011, + 4095, 0, 4011, + 4095, 0, 4011, + 4095, 0, 4011, + 4095, 0, 4009, + 4095, 0, 4009, + 4095, 0, 4007, + 4095, 0, 4005, + 4095, 0, 4003, + 4095, 0, 3999, + 4095, 0, 3993, + 4095, 0, 3987, + 4095, 0, 3977, + 4095, 1951, 3963, + 4083, 2409, 3947, + 4059, 2687, 3921, + 4025, 2905, 3885, + 3975, 3093, 3833, + 3897, 3261, 3751, + 3769, 3419, 3611, + 3509, 3569, 3317, + 0, 3715, 0, + 0, 3857, 0, + 0, 3997, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4091, + 4095, 1786, 4079, + 4095, 2453, 4059, + 4095, 2775, 4033, + 4095, 3009, 3997, + 4095, 3207, 3941, + 4021, 3381, 3855, + 3891, 3543, 3705, + 3621, 3695, 3369, + 0, 3843, 0, + 0, 3985, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1387, 4095, + 4095, 2507, 4095, + 4095, 2869, 4095, + 4095, 3121, 4095, + 4095, 3325, 4055, + 4095, 3503, 3963, + 4015, 3669, 3805, + 3737, 3823, 3433, + 0, 3971, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2569, 4095, + 4095, 2971, 4095, + 4095, 3235, 4095, + 4095, 3445, 4095, + 4095, 3629, 4077, + 4095, 3795, 3911, + 3859, 3951, 3505, + 2825, 2377, 3239, + 2825, 2377, 3239, + 2825, 2379, 3239, + 2823, 2379, 3239, + 2821, 2381, 3237, + 2819, 2383, 3237, + 2817, 2387, 3237, + 2813, 2391, 3235, + 2809, 2395, 3233, + 2803, 2403, 3231, + 2793, 2411, 3229, + 2781, 2423, 3225, + 2763, 2437, 3221, + 2739, 2457, 3215, + 2705, 2481, 3205, + 2657, 2513, 3193, + 2579, 2551, 3175, + 2453, 2597, 3153, + 2193, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2879, 2865, + 0, 2971, 2607, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2827, 2377, 3239, + 2827, 2377, 3239, + 2825, 2379, 3239, + 2825, 2379, 3239, + 2823, 2381, 3239, + 2821, 2383, 3237, + 2817, 2387, 3237, + 2815, 2391, 3235, + 2809, 2395, 3235, + 2803, 2403, 3233, + 2793, 2411, 3229, + 2781, 2423, 3225, + 2765, 2437, 3221, + 2741, 2457, 3215, + 2707, 2481, 3205, + 2657, 2513, 3193, + 2581, 2551, 3177, + 2453, 2597, 3153, + 2197, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2877, 2865, + 0, 2971, 2609, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2827, 2377, 3239, + 2827, 2377, 3239, + 2827, 2379, 3239, + 2825, 2379, 3239, + 2823, 2381, 3239, + 2821, 2383, 3237, + 2819, 2387, 3237, + 2815, 2391, 3235, + 2811, 2395, 3235, + 2803, 2401, 3233, + 2795, 2411, 3229, + 2783, 2423, 3227, + 2765, 2437, 3221, + 2743, 2457, 3215, + 2709, 2481, 3205, + 2659, 2513, 3193, + 2583, 2551, 3177, + 2457, 2597, 3153, + 2201, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2877, 2867, + 0, 2971, 2609, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2829, 2377, 3241, + 2829, 2377, 3239, + 2827, 2379, 3239, + 2827, 2379, 3239, + 2825, 2381, 3239, + 2823, 2383, 3239, + 2821, 2387, 3237, + 2817, 2389, 3237, + 2811, 2395, 3235, + 2805, 2401, 3233, + 2797, 2411, 3231, + 2785, 2423, 3227, + 2767, 2437, 3221, + 2743, 2457, 3215, + 2711, 2481, 3207, + 2661, 2513, 3193, + 2585, 2551, 3177, + 2459, 2597, 3153, + 2207, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2877, 2867, + 0, 2971, 2611, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2831, 2377, 3241, + 2831, 2377, 3241, + 2829, 2377, 3241, + 2829, 2379, 3239, + 2827, 2381, 3239, + 2825, 2383, 3239, + 2823, 2385, 3237, + 2819, 2389, 3237, + 2813, 2395, 3235, + 2807, 2401, 3233, + 2799, 2411, 3231, + 2787, 2421, 3227, + 2769, 2437, 3223, + 2745, 2457, 3215, + 2713, 2481, 3207, + 2663, 2513, 3195, + 2589, 2551, 3177, + 2463, 2597, 3153, + 2213, 2653, 3119, + 465, 2719, 3071, + 0, 2793, 2995, + 0, 2877, 2869, + 0, 2971, 2613, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2833, 2375, 3241, + 2833, 2377, 3241, + 2833, 2377, 3241, + 2831, 2379, 3241, + 2829, 2381, 3241, + 2827, 2383, 3239, + 2825, 2385, 3239, + 2821, 2389, 3237, + 2817, 2395, 3237, + 2809, 2401, 3235, + 2801, 2411, 3231, + 2789, 2421, 3227, + 2773, 2437, 3223, + 2749, 2457, 3217, + 2715, 2481, 3207, + 2667, 2511, 3195, + 2593, 2551, 3179, + 2469, 2597, 3155, + 2223, 2653, 3121, + 779, 2719, 3071, + 0, 2793, 2995, + 0, 2877, 2869, + 0, 2971, 2615, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2837, 2375, 3243, + 2837, 2377, 3243, + 2835, 2377, 3241, + 2835, 2379, 3241, + 2833, 2379, 3241, + 2831, 2383, 3241, + 2829, 2385, 3239, + 2825, 2389, 3239, + 2819, 2395, 3237, + 2813, 2401, 3235, + 2805, 2409, 3233, + 2793, 2421, 3229, + 2777, 2437, 3223, + 2753, 2455, 3217, + 2719, 2481, 3209, + 2671, 2511, 3197, + 2599, 2551, 3179, + 2477, 2597, 3155, + 2237, 2653, 3123, + 1012, 2719, 3073, + 0, 2793, 2997, + 0, 2877, 2871, + 0, 2971, 2619, + 0, 3071, 435, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2841, 2375, 3243, + 2841, 2375, 3243, + 2839, 2377, 3243, + 2839, 2377, 3243, + 2837, 2379, 3243, + 2835, 2381, 3241, + 2833, 2385, 3241, + 2829, 2389, 3239, + 2825, 2393, 3239, + 2819, 2401, 3237, + 2809, 2409, 3233, + 2797, 2421, 3229, + 2781, 2435, 3225, + 2759, 2455, 3219, + 2725, 2479, 3209, + 2679, 2511, 3197, + 2605, 2549, 3181, + 2487, 2597, 3157, + 2253, 2653, 3123, + 1206, 2719, 3075, + 0, 2793, 2999, + 0, 2877, 2875, + 0, 2971, 2625, + 0, 3071, 809, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2847, 2375, 3245, + 2847, 2375, 3245, + 2845, 2375, 3245, + 2845, 2377, 3245, + 2843, 2379, 3243, + 2841, 2381, 3243, + 2839, 2383, 3243, + 2835, 2387, 3241, + 2831, 2393, 3239, + 2825, 2399, 3237, + 2815, 2409, 3235, + 2803, 2419, 3231, + 2787, 2435, 3227, + 2765, 2455, 3221, + 2733, 2479, 3211, + 2687, 2511, 3199, + 2615, 2549, 3183, + 2499, 2597, 3159, + 2273, 2653, 3125, + 1380, 2717, 3077, + 0, 2793, 3003, + 0, 2877, 2877, + 0, 2969, 2631, + 0, 3071, 1063, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2855, 2373, 3247, + 2853, 2373, 3247, + 2853, 2375, 3247, + 2853, 2375, 3247, + 2851, 2377, 3245, + 2849, 2379, 3245, + 2847, 2383, 3245, + 2843, 2387, 3243, + 2839, 2391, 3241, + 2833, 2399, 3239, + 2823, 2407, 3237, + 2813, 2419, 3233, + 2797, 2435, 3229, + 2775, 2453, 3223, + 2743, 2479, 3213, + 2697, 2509, 3201, + 2627, 2549, 3185, + 2515, 2595, 3161, + 2299, 2651, 3129, + 1541, 2717, 3079, + 0, 2793, 3005, + 0, 2877, 2883, + 0, 2969, 2639, + 0, 3069, 1269, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2865, 2371, 3249, + 2863, 2373, 3249, + 2863, 2373, 3249, + 2863, 2375, 3249, + 2861, 2377, 3249, + 2859, 2379, 3249, + 2857, 2381, 3247, + 2853, 2385, 3247, + 2849, 2391, 3245, + 2843, 2397, 3243, + 2835, 2405, 3241, + 2823, 2417, 3237, + 2807, 2433, 3231, + 2787, 2453, 3225, + 2755, 2477, 3217, + 2711, 2509, 3205, + 2645, 2547, 3189, + 2535, 2595, 3165, + 2333, 2651, 3133, + 1694, 2717, 3085, + 0, 2791, 3011, + 0, 2877, 2889, + 0, 2969, 2649, + 0, 3069, 1449, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2877, 2369, 3253, + 2877, 2371, 3253, + 2877, 2371, 3253, + 2875, 2373, 3253, + 2873, 2375, 3253, + 2873, 2377, 3251, + 2869, 2379, 3251, + 2867, 2383, 3251, + 2863, 2389, 3249, + 2857, 2395, 3247, + 2849, 2405, 3245, + 2837, 2415, 3241, + 2823, 2431, 3235, + 2801, 2451, 3229, + 2773, 2475, 3221, + 2729, 2507, 3209, + 2665, 2547, 3193, + 2563, 2593, 3169, + 2373, 2649, 3137, + 1841, 2715, 3089, + 0, 2791, 3017, + 0, 2875, 2897, + 0, 2969, 2663, + 0, 3069, 1614, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2895, 2367, 3259, + 2893, 2367, 3259, + 2893, 2369, 3259, + 2893, 2369, 3259, + 2891, 2371, 3257, + 2889, 2373, 3257, + 2887, 2377, 3257, + 2883, 2381, 3255, + 2879, 2385, 3253, + 2873, 2393, 3251, + 2867, 2401, 3249, + 2855, 2413, 3245, + 2841, 2429, 3241, + 2821, 2449, 3235, + 2793, 2473, 3227, + 2753, 2505, 3215, + 2691, 2545, 3199, + 2595, 2591, 3175, + 2423, 2649, 3143, + 1984, 2715, 3097, + 0, 2789, 3025, + 0, 2875, 2909, + 0, 2967, 2681, + 0, 3069, 1770, + 0, 3175, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2915, 2363, 3265, + 2915, 2365, 3265, + 2915, 2365, 3265, + 2913, 2367, 3265, + 2913, 2367, 3265, + 2911, 2371, 3263, + 2909, 2373, 3263, + 2905, 2377, 3261, + 2901, 2383, 3261, + 2897, 2389, 3259, + 2889, 2399, 3255, + 2879, 2411, 3253, + 2865, 2425, 3247, + 2847, 2445, 3241, + 2819, 2471, 3233, + 2781, 2503, 3221, + 2725, 2541, 3205, + 2637, 2589, 3183, + 2481, 2647, 3151, + 2123, 2713, 3107, + 0, 2789, 3037, + 0, 2873, 2923, + 0, 2967, 2705, + 0, 3067, 1919, + 0, 3175, 0, + 0, 3287, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2943, 2359, 3275, + 2943, 2359, 3273, + 2943, 2361, 3273, + 2941, 2361, 3273, + 2941, 2363, 3273, + 2939, 2365, 3273, + 2937, 2369, 3271, + 2933, 2373, 3271, + 2931, 2377, 3269, + 2925, 2385, 3267, + 2919, 2393, 3265, + 2909, 2405, 3261, + 2897, 2421, 3257, + 2879, 2441, 3251, + 2853, 2467, 3243, + 2819, 2499, 3231, + 2767, 2539, 3215, + 2685, 2587, 3193, + 2549, 2643, 3163, + 2261, 2711, 3119, + 0, 2787, 3051, + 0, 2871, 2941, + 0, 2965, 2733, + 0, 3067, 2063, + 0, 3175, 0, + 0, 3287, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2977, 2353, 3285, + 2977, 2353, 3285, + 2977, 2353, 3285, + 2975, 2355, 3285, + 2975, 2357, 3285, + 2973, 2359, 3283, + 2971, 2363, 3283, + 2969, 2367, 3281, + 2965, 2371, 3281, + 2961, 2379, 3279, + 2955, 2387, 3277, + 2945, 2401, 3273, + 2933, 2415, 3269, + 2917, 2437, 3263, + 2895, 2461, 3255, + 2863, 2495, 3243, + 2815, 2535, 3229, + 2745, 2583, 3207, + 2627, 2641, 3177, + 2399, 2707, 3135, + 1461, 2785, 3069, + 0, 2869, 2965, + 0, 2963, 2769, + 0, 3065, 2203, + 0, 3173, 0, + 0, 3287, 0, + 0, 3403, 0, + 0, 3525, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 3019, 2343, 3301, + 3019, 2343, 3299, + 3019, 2345, 3299, + 3017, 2347, 3299, + 3017, 2347, 3299, + 3015, 2351, 3299, + 3013, 2353, 3297, + 3011, 2357, 3297, + 3009, 2363, 3295, + 3005, 2371, 3293, + 2999, 2379, 3291, + 2991, 2393, 3289, + 2979, 2409, 3285, + 2965, 2429, 3279, + 2945, 2455, 3271, + 2917, 2487, 3259, + 2875, 2529, 3245, + 2813, 2577, 3225, + 2713, 2635, 3197, + 2533, 2703, 3155, + 2059, 2781, 3093, + 0, 2867, 2993, + 0, 2961, 2815, + 0, 3063, 2343, + 0, 3171, 0, + 0, 3285, 0, + 0, 3403, 0, + 0, 3523, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3899, 0, + 0, 4029, 0, + 3071, 2331, 3319, + 3069, 2331, 3319, + 3069, 2333, 3319, + 3069, 2335, 3319, + 3067, 2335, 3319, + 3067, 2339, 3317, + 3065, 2341, 3317, + 3063, 2345, 3315, + 3061, 2351, 3315, + 3057, 2359, 3313, + 3051, 2369, 3311, + 3045, 2381, 3307, + 3035, 2397, 3303, + 3023, 2419, 3299, + 3005, 2445, 3291, + 2979, 2479, 3281, + 2943, 2521, 3267, + 2891, 2571, 3247, + 2807, 2629, 3219, + 2667, 2699, 3181, + 2369, 2777, 3123, + 0, 2863, 3031, + 0, 2959, 2867, + 0, 3061, 2479, + 0, 3169, 0, + 0, 3283, 0, + 0, 3401, 0, + 0, 3523, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3899, 0, + 0, 4027, 0, + 3131, 2315, 3343, + 3131, 2315, 3343, + 3129, 2317, 3343, + 3129, 2317, 3343, + 3129, 2319, 3343, + 3127, 2321, 3341, + 3125, 2325, 3341, + 3125, 2329, 3341, + 3121, 2335, 3339, + 3119, 2343, 3337, + 3113, 2353, 3335, + 3107, 2367, 3333, + 3099, 2383, 3329, + 3089, 2405, 3323, + 3073, 2433, 3317, + 3051, 2467, 3307, + 3021, 2509, 3293, + 2977, 2561, 3275, + 2909, 2621, 3249, + 2801, 2691, 3213, + 2599, 2769, 3159, + 1971, 2859, 3075, + 0, 2955, 2931, + 0, 3057, 2615, + 0, 3167, 0, + 0, 3281, 0, + 0, 3399, 0, + 0, 3521, 0, + 0, 3645, 0, + 0, 3771, 0, + 0, 3899, 0, + 0, 4027, 0, + 3201, 2291, 3373, + 3199, 2291, 3373, + 3199, 2293, 3373, + 3199, 2295, 3373, + 3199, 2297, 3373, + 3197, 2299, 3373, + 3197, 2303, 3371, + 3195, 2307, 3371, + 3193, 2313, 3371, + 3189, 2321, 3369, + 3185, 2331, 3367, + 3181, 2345, 3363, + 3173, 2363, 3361, + 3165, 2387, 3355, + 3151, 2415, 3349, + 3133, 2451, 3339, + 3107, 2495, 3327, + 3071, 2547, 3311, + 3019, 2609, 3287, + 2935, 2681, 3253, + 2793, 2761, 3205, + 2489, 2851, 3129, + 0, 2949, 3003, + 0, 3053, 2749, + 0, 3163, 215, + 0, 3279, 0, + 0, 3397, 0, + 0, 3519, 0, + 0, 3645, 0, + 0, 3771, 0, + 0, 3899, 0, + 0, 4027, 0, + 3279, 2257, 3411, + 3279, 2259, 3411, + 3279, 2259, 3411, + 3279, 2261, 3411, + 3277, 2263, 3411, + 3277, 2267, 3411, + 3275, 2271, 3409, + 3275, 2275, 3409, + 3273, 2281, 3409, + 3271, 2291, 3407, + 3267, 2301, 3405, + 3263, 2317, 3403, + 3257, 2335, 3399, + 3249, 2359, 3395, + 3239, 2389, 3389, + 3223, 2427, 3381, + 3203, 2473, 3369, + 3173, 2529, 3355, + 3131, 2593, 3333, + 3069, 2667, 3303, + 2967, 2749, 3259, + 2783, 2841, 3191, + 2277, 2941, 3085, + 0, 3047, 2883, + 0, 3159, 2269, + 0, 3275, 0, + 0, 3395, 0, + 0, 3517, 0, + 0, 3643, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4027, 0, + 3367, 2209, 3457, + 3367, 2209, 3457, + 3367, 2211, 3457, + 3367, 2213, 3457, + 3365, 2215, 3457, + 3365, 2219, 3457, + 3365, 2223, 3457, + 3363, 2229, 3455, + 3361, 2235, 3455, + 3361, 2245, 3453, + 3357, 2257, 3451, + 3353, 2273, 3449, + 3349, 2295, 3447, + 3343, 2321, 3443, + 3333, 2353, 3437, + 3321, 2395, 3429, + 3305, 2443, 3419, + 3283, 2503, 3407, + 3249, 2571, 3387, + 3201, 2647, 3361, + 3127, 2735, 3321, + 3007, 2829, 3265, + 2767, 2931, 3175, + 1574, 3039, 3017, + 0, 3153, 2651, + 0, 3271, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 3463, 2135, 3513, + 3463, 2135, 3513, + 3463, 2137, 3513, + 3463, 2139, 3513, + 3463, 2143, 3513, + 3461, 2145, 3513, + 3461, 2151, 3511, + 3461, 2157, 3511, + 3459, 2165, 3511, + 3457, 2177, 3509, + 3455, 2191, 3507, + 3453, 2209, 3505, + 3449, 2233, 3503, + 3443, 2263, 3499, + 3437, 2301, 3495, + 3427, 2347, 3489, + 3413, 2401, 3479, + 3395, 2465, 3467, + 3371, 2537, 3451, + 3333, 2621, 3427, + 3281, 2711, 3395, + 3197, 2811, 3347, + 3055, 2917, 3273, + 2745, 3027, 3151, + 0, 3143, 2909, + 0, 3263, 1640, + 0, 3385, 0, + 0, 3511, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4023, 0, + 3567, 2011, 3577, + 3567, 2012, 3577, + 3567, 2014, 3577, + 3565, 2017, 3577, + 3565, 2021, 3577, + 3565, 2026, 3577, + 3565, 2032, 3577, + 3563, 2040, 3577, + 3563, 2051, 3575, + 3561, 2065, 3575, + 3561, 2083, 3573, + 3557, 2107, 3571, + 3555, 2137, 3569, + 3551, 2173, 3567, + 3545, 2219, 3563, + 3537, 2273, 3557, + 3527, 2335, 3549, + 3513, 2409, 3539, + 3493, 2491, 3525, + 3467, 2581, 3505, + 3427, 2681, 3477, + 3369, 2785, 3437, + 3275, 2897, 3377, + 3111, 3013, 3283, + 2715, 3131, 3117, + 0, 3255, 2705, + 0, 3379, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3763, 0, + 0, 3891, 0, + 0, 4023, 0, + 3675, 1765, 3653, + 3675, 1767, 3653, + 3675, 1771, 3651, + 3675, 1776, 3651, + 3675, 1782, 3651, + 3675, 1790, 3651, + 3675, 1801, 3651, + 3673, 1814, 3651, + 3673, 1832, 3651, + 3671, 1855, 3649, + 3671, 1884, 3649, + 3669, 1920, 3647, + 3667, 1964, 3645, + 3663, 2017, 3643, + 3659, 2079, 3639, + 3653, 2151, 3633, + 3645, 2231, 3627, + 3635, 2321, 3619, + 3619, 2419, 3607, + 3599, 2525, 3591, + 3569, 2635, 3567, + 3527, 2749, 3535, + 3465, 2869, 3489, + 3363, 2991, 3417, + 3177, 3115, 3297, + 2671, 3241, 3065, + 0, 3369, 2069, + 0, 3499, 0, + 0, 3627, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 3789, 297, 3735, + 3789, 359, 3735, + 3789, 432, 3735, + 3789, 513, 3735, + 3789, 603, 3735, + 3789, 701, 3735, + 3789, 806, 3735, + 3789, 917, 3735, + 3787, 1032, 3733, + 3787, 1151, 3733, + 3785, 1273, 3733, + 3785, 1398, 3731, + 3783, 1524, 3729, + 3781, 1652, 3727, + 3777, 1781, 3725, + 3773, 1910, 3721, + 3767, 2040, 3715, + 3759, 2171, 3709, + 3747, 2303, 3699, + 3731, 2433, 3685, + 3709, 2565, 3667, + 3679, 2697, 3641, + 3635, 2829, 3603, + 3567, 2961, 3549, + 3459, 3093, 3463, + 3253, 3225, 3315, + 2603, 3357, 2989, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3905, 0, 3825, + 3905, 0, 3825, + 3903, 0, 3823, + 3903, 0, 3823, + 3901, 0, 3821, + 3899, 0, 3819, + 3895, 682, 3815, + 3891, 1493, 3811, + 3883, 1832, 3805, + 3875, 2075, 3797, + 3863, 2275, 3787, + 3847, 2451, 3773, + 3825, 2615, 3751, + 3793, 2769, 3723, + 3747, 2917, 3681, + 3677, 3059, 3619, + 3561, 3201, 3519, + 3339, 3339, 3339, + 2495, 3475, 2859, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4027, 0, 3925, + 4027, 0, 3925, + 4027, 0, 3925, + 4025, 0, 3923, + 4023, 0, 3921, + 4021, 0, 3919, + 4019, 0, 3917, + 4015, 0, 3913, + 4011, 0, 3909, + 4005, 1152, 3903, + 3995, 1902, 3895, + 3983, 2235, 3883, + 3967, 2475, 3867, + 3945, 2673, 3845, + 3911, 2849, 3813, + 3863, 3013, 3767, + 3791, 3165, 3699, + 3669, 3313, 3585, + 3433, 3457, 3367, + 2293, 3597, 2593, + 0, 3735, 0, + 0, 3871, 0, + 0, 4007, 0, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4031, + 4095, 0, 4031, + 4095, 0, 4031, + 4095, 0, 4029, + 4095, 0, 4027, + 4095, 0, 4025, + 4095, 0, 4023, + 4095, 0, 4019, + 4095, 0, 4015, + 4095, 0, 4007, + 4095, 1465, 3999, + 4095, 2177, 3987, + 4091, 2505, 3969, + 4067, 2741, 3945, + 4033, 2939, 3913, + 3983, 3115, 3863, + 3909, 3277, 3787, + 3783, 3431, 3659, + 3533, 3579, 3405, + 1659, 3721, 0, + 0, 3861, 0, + 0, 3999, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2083, 4095, + 4095, 2541, 4079, + 4095, 2819, 4053, + 4095, 3037, 4017, + 4095, 3225, 3965, + 4031, 3393, 3883, + 3901, 3551, 3743, + 3641, 3703, 3449, + 0, 3847, 0, + 0, 3989, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1918, 4095, + 4095, 2585, 4095, + 4095, 2907, 4095, + 4095, 3141, 4095, + 4095, 3339, 4073, + 4095, 3513, 3987, + 4023, 3675, 3837, + 3753, 3827, 3501, + 0, 3975, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1519, 4095, + 4095, 2639, 4095, + 4095, 3001, 4095, + 4095, 3253, 4095, + 4095, 3457, 4095, + 4095, 3635, 4095, + 4095, 3801, 3937, + 3869, 3955, 3565, + 2957, 2509, 3371, + 2957, 2509, 3371, + 2957, 2509, 3371, + 2955, 2511, 3371, + 2955, 2513, 3371, + 2953, 2513, 3369, + 2951, 2515, 3369, + 2949, 2519, 3369, + 2945, 2523, 3367, + 2941, 2527, 3365, + 2933, 2535, 3363, + 2925, 2543, 3361, + 2913, 2555, 3357, + 2895, 2569, 3353, + 2871, 2589, 3347, + 2837, 2613, 3337, + 2787, 2645, 3325, + 2711, 2683, 3307, + 2583, 2731, 3283, + 2323, 2785, 3251, + 0, 2851, 3201, + 0, 2927, 3125, + 0, 3011, 2997, + 0, 3103, 2739, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2957, 2509, 3371, + 2957, 2511, 3371, + 2955, 2511, 3371, + 2953, 2513, 3371, + 2951, 2515, 3369, + 2949, 2519, 3369, + 2945, 2523, 3367, + 2941, 2527, 3367, + 2935, 2535, 3365, + 2925, 2543, 3361, + 2913, 2555, 3357, + 2895, 2569, 3353, + 2871, 2589, 3347, + 2839, 2613, 3337, + 2789, 2645, 3325, + 2711, 2683, 3307, + 2585, 2729, 3285, + 2327, 2785, 3251, + 0, 2851, 3201, + 0, 2927, 3125, + 0, 3011, 2997, + 0, 3103, 2739, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2957, 2511, 3371, + 2957, 2511, 3371, + 2955, 2513, 3371, + 2953, 2515, 3369, + 2951, 2519, 3369, + 2947, 2523, 3367, + 2941, 2527, 3367, + 2935, 2535, 3365, + 2925, 2543, 3361, + 2913, 2555, 3357, + 2897, 2569, 3353, + 2873, 2589, 3347, + 2839, 2613, 3337, + 2789, 2645, 3325, + 2713, 2683, 3309, + 2587, 2729, 3285, + 2329, 2785, 3251, + 0, 2851, 3201, + 0, 2927, 3125, + 0, 3011, 2997, + 0, 3103, 2741, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2961, 2509, 3373, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2959, 2511, 3371, + 2957, 2511, 3371, + 2955, 2513, 3371, + 2953, 2515, 3369, + 2951, 2519, 3369, + 2947, 2523, 3369, + 2943, 2527, 3367, + 2937, 2535, 3365, + 2927, 2543, 3361, + 2915, 2555, 3359, + 2897, 2569, 3353, + 2875, 2589, 3347, + 2841, 2613, 3337, + 2791, 2645, 3325, + 2715, 2683, 3309, + 2589, 2729, 3285, + 2333, 2785, 3251, + 0, 2851, 3201, + 0, 2925, 3125, + 0, 3011, 2999, + 0, 3103, 2741, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2961, 2509, 3373, + 2961, 2509, 3373, + 2961, 2509, 3373, + 2959, 2511, 3371, + 2959, 2511, 3371, + 2957, 2513, 3371, + 2955, 2515, 3371, + 2953, 2519, 3369, + 2949, 2523, 3369, + 2945, 2527, 3367, + 2937, 2533, 3365, + 2929, 2543, 3363, + 2917, 2555, 3359, + 2899, 2569, 3353, + 2875, 2589, 3347, + 2843, 2613, 3339, + 2793, 2645, 3325, + 2717, 2683, 3309, + 2591, 2729, 3285, + 2339, 2785, 3251, + 0, 2851, 3201, + 0, 2925, 3125, + 0, 3011, 2999, + 0, 3103, 2743, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2963, 2507, 3373, + 2963, 2509, 3373, + 2963, 2509, 3373, + 2961, 2511, 3373, + 2961, 2511, 3371, + 2959, 2513, 3371, + 2957, 2515, 3371, + 2955, 2517, 3371, + 2951, 2521, 3369, + 2947, 2527, 3367, + 2939, 2533, 3365, + 2931, 2543, 3363, + 2919, 2555, 3359, + 2901, 2569, 3355, + 2879, 2589, 3347, + 2845, 2613, 3339, + 2795, 2645, 3327, + 2721, 2683, 3309, + 2595, 2729, 3285, + 2347, 2785, 3253, + 597, 2851, 3203, + 0, 2925, 3127, + 0, 3009, 3001, + 0, 3103, 2745, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2967, 2507, 3373, + 2965, 2509, 3373, + 2965, 2509, 3373, + 2965, 2509, 3373, + 2963, 2511, 3373, + 2961, 2513, 3373, + 2959, 2515, 3371, + 2957, 2517, 3371, + 2953, 2521, 3369, + 2949, 2527, 3369, + 2943, 2533, 3367, + 2933, 2543, 3363, + 2921, 2553, 3359, + 2905, 2569, 3355, + 2881, 2589, 3349, + 2847, 2613, 3339, + 2799, 2645, 3327, + 2725, 2683, 3311, + 2601, 2729, 3287, + 2355, 2785, 3253, + 912, 2851, 3203, + 0, 2925, 3127, + 0, 3009, 3001, + 0, 3103, 2749, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2969, 2507, 3375, + 2969, 2507, 3375, + 2969, 2509, 3375, + 2967, 2509, 3373, + 2967, 2511, 3373, + 2965, 2513, 3373, + 2963, 2515, 3373, + 2961, 2517, 3371, + 2957, 2521, 3371, + 2953, 2527, 3369, + 2945, 2533, 3367, + 2937, 2541, 3365, + 2925, 2553, 3361, + 2909, 2569, 3355, + 2885, 2587, 3349, + 2853, 2613, 3341, + 2803, 2643, 3329, + 2731, 2683, 3311, + 2609, 2729, 3287, + 2369, 2785, 3255, + 1144, 2851, 3205, + 0, 2925, 3129, + 0, 3009, 3003, + 0, 3103, 2751, + 0, 3203, 567, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2973, 2507, 3375, + 2973, 2507, 3375, + 2973, 2507, 3375, + 2971, 2509, 3375, + 2971, 2509, 3375, + 2969, 2511, 3375, + 2967, 2513, 3373, + 2965, 2517, 3373, + 2961, 2521, 3371, + 2957, 2525, 3371, + 2951, 2533, 3369, + 2941, 2541, 3365, + 2929, 2553, 3363, + 2913, 2567, 3357, + 2891, 2587, 3351, + 2857, 2613, 3341, + 2811, 2643, 3329, + 2737, 2681, 3313, + 2619, 2729, 3289, + 2385, 2785, 3255, + 1339, 2851, 3207, + 0, 2925, 3131, + 0, 3009, 3007, + 0, 3103, 2757, + 0, 3203, 941, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2979, 2505, 3377, + 2979, 2507, 3377, + 2979, 2507, 3377, + 2977, 2507, 3377, + 2977, 2509, 3377, + 2975, 2511, 3375, + 2973, 2513, 3375, + 2971, 2515, 3375, + 2967, 2519, 3373, + 2963, 2525, 3371, + 2957, 2531, 3369, + 2947, 2541, 3367, + 2935, 2553, 3363, + 2919, 2567, 3359, + 2897, 2587, 3353, + 2865, 2611, 3343, + 2819, 2643, 3331, + 2747, 2681, 3315, + 2631, 2729, 3291, + 2405, 2785, 3257, + 1513, 2849, 3209, + 0, 2925, 3135, + 0, 3009, 3011, + 0, 3101, 2763, + 0, 3203, 1195, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2987, 2505, 3379, + 2987, 2505, 3379, + 2987, 2505, 3379, + 2985, 2507, 3379, + 2985, 2507, 3379, + 2983, 2509, 3379, + 2981, 2511, 3377, + 2979, 2515, 3377, + 2975, 2519, 3375, + 2971, 2523, 3375, + 2965, 2531, 3373, + 2955, 2539, 3369, + 2945, 2551, 3365, + 2929, 2567, 3361, + 2907, 2585, 3355, + 2875, 2611, 3345, + 2829, 2641, 3333, + 2759, 2681, 3317, + 2647, 2727, 3293, + 2431, 2783, 3261, + 1674, 2849, 3213, + 0, 2925, 3137, + 0, 3009, 3015, + 0, 3101, 2771, + 0, 3201, 1401, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 2997, 2503, 3383, + 2997, 2503, 3383, + 2997, 2505, 3381, + 2995, 2505, 3381, + 2995, 2507, 3381, + 2993, 2509, 3381, + 2991, 2511, 3381, + 2989, 2513, 3379, + 2985, 2517, 3379, + 2981, 2523, 3377, + 2975, 2529, 3375, + 2967, 2539, 3373, + 2955, 2549, 3369, + 2939, 2565, 3365, + 2919, 2585, 3357, + 2887, 2609, 3349, + 2843, 2641, 3337, + 2777, 2679, 3321, + 2667, 2727, 3297, + 2465, 2783, 3265, + 1826, 2849, 3217, + 0, 2923, 3143, + 0, 3009, 3021, + 0, 3101, 2781, + 0, 3201, 1581, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3011, 2501, 3387, + 3009, 2501, 3385, + 3009, 2503, 3385, + 3009, 2503, 3385, + 3007, 2505, 3385, + 3007, 2507, 3385, + 3005, 2509, 3385, + 3001, 2511, 3383, + 2999, 2515, 3383, + 2995, 2521, 3381, + 2989, 2527, 3379, + 2981, 2537, 3377, + 2969, 2549, 3373, + 2955, 2563, 3369, + 2933, 2583, 3361, + 2905, 2607, 3353, + 2861, 2639, 3341, + 2797, 2679, 3325, + 2695, 2725, 3301, + 2505, 2781, 3269, + 1973, 2847, 3221, + 0, 2923, 3149, + 0, 3007, 3029, + 0, 3101, 2795, + 0, 3201, 1747, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3027, 2499, 3391, + 3027, 2499, 3391, + 3025, 2499, 3391, + 3025, 2501, 3391, + 3025, 2501, 3391, + 3023, 2503, 3389, + 3021, 2505, 3389, + 3019, 2509, 3389, + 3015, 2513, 3387, + 3011, 2517, 3385, + 3007, 2525, 3383, + 2999, 2533, 3381, + 2987, 2545, 3377, + 2973, 2561, 3373, + 2953, 2581, 3367, + 2925, 2605, 3359, + 2885, 2637, 3347, + 2823, 2677, 3331, + 2727, 2723, 3307, + 2555, 2781, 3275, + 2115, 2847, 3229, + 0, 2923, 3157, + 0, 3007, 3041, + 0, 3099, 2813, + 0, 3201, 1902, + 0, 3307, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3049, 2495, 3397, + 3049, 2495, 3397, + 3047, 2497, 3397, + 3047, 2497, 3397, + 3045, 2499, 3397, + 3045, 2501, 3397, + 3043, 2503, 3395, + 3041, 2505, 3395, + 3037, 2509, 3393, + 3033, 2515, 3393, + 3029, 2521, 3391, + 3021, 2531, 3389, + 3011, 2543, 3385, + 2997, 2557, 3381, + 2979, 2577, 3373, + 2953, 2603, 3365, + 2913, 2635, 3353, + 2857, 2673, 3337, + 2769, 2721, 3315, + 2613, 2779, 3285, + 2255, 2845, 3239, + 0, 2921, 3169, + 0, 3005, 3055, + 0, 3099, 2837, + 0, 3199, 2051, + 0, 3307, 0, + 0, 3419, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3075, 2491, 3407, + 3075, 2491, 3407, + 3075, 2491, 3405, + 3075, 2493, 3405, + 3073, 2493, 3405, + 3073, 2495, 3405, + 3071, 2497, 3405, + 3069, 2501, 3403, + 3065, 2505, 3403, + 3063, 2509, 3401, + 3057, 2517, 3399, + 3051, 2527, 3397, + 3041, 2539, 3393, + 3029, 2553, 3389, + 3011, 2573, 3383, + 2985, 2599, 3375, + 2951, 2631, 3363, + 2899, 2671, 3347, + 2817, 2719, 3327, + 2681, 2775, 3295, + 2393, 2843, 3251, + 0, 2919, 3183, + 0, 3005, 3073, + 0, 3097, 2865, + 0, 3199, 2195, + 0, 3307, 0, + 0, 3419, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4033, 0, + 3109, 2483, 3417, + 3109, 2485, 3417, + 3109, 2485, 3417, + 3109, 2485, 3417, + 3107, 2487, 3417, + 3107, 2489, 3417, + 3105, 2491, 3415, + 3103, 2495, 3415, + 3101, 2499, 3415, + 3097, 2503, 3413, + 3093, 2511, 3411, + 3087, 2521, 3409, + 3077, 2533, 3405, + 3065, 2549, 3401, + 3049, 2569, 3395, + 3027, 2595, 3387, + 2995, 2627, 3375, + 2947, 2667, 3361, + 2877, 2715, 3339, + 2759, 2773, 3309, + 2531, 2839, 3267, + 1593, 2917, 3201, + 0, 3003, 3097, + 0, 3097, 2903, + 0, 3197, 2335, + 0, 3305, 0, + 0, 3419, 0, + 0, 3535, 0, + 0, 3657, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4033, 0, + 3153, 2475, 3433, + 3151, 2475, 3433, + 3151, 2477, 3433, + 3151, 2477, 3431, + 3151, 2479, 3431, + 3149, 2481, 3431, + 3147, 2483, 3431, + 3147, 2485, 3429, + 3143, 2489, 3429, + 3141, 2495, 3427, + 3137, 2503, 3425, + 3131, 2511, 3423, + 3123, 2525, 3421, + 3113, 2541, 3417, + 3097, 2561, 3411, + 3077, 2587, 3403, + 3049, 2619, 3391, + 3007, 2661, 3377, + 2945, 2709, 3357, + 2845, 2767, 3329, + 2665, 2835, 3287, + 2191, 2913, 3225, + 0, 2999, 3125, + 0, 3093, 2947, + 0, 3195, 2475, + 0, 3303, 0, + 0, 3417, 0, + 0, 3535, 0, + 0, 3655, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4031, 0, + 3203, 2463, 3451, + 3203, 2463, 3451, + 3203, 2463, 3451, + 3201, 2465, 3451, + 3201, 2467, 3451, + 3201, 2469, 3451, + 3199, 2471, 3449, + 3197, 2473, 3449, + 3195, 2477, 3449, + 3193, 2483, 3447, + 3189, 2491, 3445, + 3183, 2501, 3443, + 3177, 2513, 3439, + 3167, 2529, 3435, + 3155, 2551, 3431, + 3137, 2577, 3423, + 3111, 2611, 3413, + 3075, 2653, 3399, + 3023, 2703, 3379, + 2941, 2761, 3353, + 2801, 2831, 3313, + 2501, 2909, 3255, + 0, 2995, 3163, + 0, 3091, 2999, + 0, 3193, 2611, + 0, 3301, 0, + 0, 3415, 0, + 0, 3533, 0, + 0, 3655, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4031, 0, + 3263, 2445, 3475, + 3263, 2447, 3475, + 3263, 2447, 3475, + 3261, 2449, 3475, + 3261, 2449, 3475, + 3261, 2451, 3475, + 3259, 2455, 3475, + 3259, 2457, 3473, + 3257, 2461, 3473, + 3253, 2467, 3471, + 3251, 2475, 3469, + 3247, 2485, 3467, + 3239, 2499, 3465, + 3231, 2515, 3461, + 3221, 2537, 3455, + 3205, 2565, 3449, + 3183, 2599, 3439, + 3153, 2641, 3425, + 3109, 2693, 3407, + 3043, 2753, 3383, + 2933, 2823, 3345, + 2731, 2903, 3291, + 2103, 2991, 3207, + 0, 3087, 3063, + 0, 3189, 2747, + 0, 3299, 0, + 0, 3413, 0, + 0, 3531, 0, + 0, 3653, 0, + 0, 3777, 0, + 0, 3903, 0, + 0, 4031, 0, + 3333, 2423, 3507, + 3333, 2423, 3507, + 3331, 2423, 3505, + 3331, 2425, 3505, + 3331, 2427, 3505, + 3331, 2429, 3505, + 3329, 2431, 3505, + 3329, 2435, 3505, + 3327, 2439, 3503, + 3325, 2445, 3503, + 3321, 2453, 3501, + 3319, 2463, 3499, + 3313, 2477, 3497, + 3305, 2495, 3493, + 3297, 2519, 3487, + 3283, 2547, 3481, + 3265, 2583, 3473, + 3241, 2627, 3459, + 3203, 2679, 3443, + 3151, 2741, 3419, + 3067, 2813, 3385, + 2925, 2893, 3337, + 2621, 2983, 3261, + 0, 3081, 3135, + 0, 3185, 2881, + 0, 3295, 347, + 0, 3411, 0, + 0, 3529, 0, + 0, 3651, 0, + 0, 3777, 0, + 0, 3903, 0, + 0, 4031, 0, + 3411, 2389, 3545, + 3411, 2389, 3543, + 3411, 2391, 3543, + 3411, 2391, 3543, + 3411, 2393, 3543, + 3409, 2395, 3543, + 3409, 2399, 3543, + 3409, 2403, 3543, + 3407, 2407, 3541, + 3405, 2413, 3541, + 3403, 2423, 3539, + 3399, 2433, 3537, + 3395, 2449, 3535, + 3389, 2467, 3531, + 3381, 2491, 3527, + 3371, 2521, 3521, + 3355, 2559, 3513, + 3335, 2605, 3501, + 3305, 2661, 3487, + 3263, 2725, 3465, + 3201, 2799, 3435, + 3099, 2883, 3391, + 2915, 2973, 3323, + 2411, 3073, 3217, + 0, 3179, 3015, + 0, 3291, 2401, + 0, 3407, 0, + 0, 3527, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 3499, 2341, 3591, + 3499, 2341, 3591, + 3499, 2343, 3589, + 3499, 2343, 3589, + 3499, 2345, 3589, + 3499, 2347, 3589, + 3497, 2351, 3589, + 3497, 2355, 3589, + 3495, 2361, 3587, + 3495, 2367, 3587, + 3493, 2377, 3585, + 3489, 2389, 3583, + 3485, 2405, 3581, + 3481, 2427, 3579, + 3475, 2453, 3575, + 3467, 2485, 3569, + 3455, 2527, 3563, + 3437, 2575, 3551, + 3415, 2635, 3539, + 3381, 2703, 3519, + 3333, 2779, 3493, + 3259, 2867, 3453, + 3139, 2961, 3397, + 2899, 3063, 3307, + 1706, 3171, 3149, + 0, 3285, 2783, + 0, 3403, 0, + 0, 3523, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3899, 0, + 0, 4029, 0, + 3595, 2265, 3645, + 3595, 2267, 3645, + 3595, 2267, 3645, + 3595, 2269, 3645, + 3595, 2271, 3645, + 3595, 2275, 3645, + 3593, 2277, 3645, + 3593, 2283, 3643, + 3593, 2289, 3643, + 3591, 2297, 3643, + 3589, 2309, 3641, + 3587, 2323, 3639, + 3585, 2341, 3637, + 3581, 2365, 3635, + 3575, 2395, 3631, + 3569, 2433, 3627, + 3559, 2479, 3621, + 3545, 2533, 3611, + 3527, 2597, 3599, + 3503, 2671, 3583, + 3467, 2753, 3559, + 3413, 2845, 3527, + 3329, 2943, 3479, + 3187, 3049, 3405, + 2877, 3161, 3283, + 0, 3275, 3041, + 0, 3395, 1772, + 0, 3519, 0, + 0, 3643, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4027, 0, + 3699, 2141, 3711, + 3699, 2143, 3711, + 3699, 2145, 3709, + 3699, 2147, 3709, + 3697, 2149, 3709, + 3697, 2153, 3709, + 3697, 2157, 3709, + 3697, 2165, 3709, + 3697, 2173, 3709, + 3695, 2183, 3707, + 3693, 2197, 3707, + 3693, 2217, 3705, + 3689, 2239, 3703, + 3687, 2269, 3701, + 3683, 2305, 3699, + 3677, 2351, 3695, + 3669, 2405, 3689, + 3659, 2469, 3681, + 3645, 2541, 3671, + 3627, 2623, 3657, + 3599, 2713, 3637, + 3559, 2813, 3609, + 3501, 2917, 3569, + 3407, 3029, 3509, + 3243, 3145, 3415, + 2847, 3263, 3249, + 0, 3387, 2837, + 0, 3511, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4025, 0, + 3807, 1895, 3785, + 3807, 1897, 3785, + 3807, 1900, 3785, + 3807, 1903, 3785, + 3807, 1908, 3783, + 3807, 1914, 3783, + 3807, 1922, 3783, + 3807, 1933, 3783, + 3805, 1946, 3783, + 3805, 1964, 3783, + 3805, 1987, 3781, + 3803, 2016, 3781, + 3801, 2051, 3779, + 3799, 2095, 3777, + 3795, 2149, 3775, + 3791, 2211, 3771, + 3785, 2283, 3767, + 3777, 2365, 3759, + 3767, 2453, 3751, + 3751, 2551, 3739, + 3731, 2657, 3723, + 3701, 2767, 3701, + 3659, 2881, 3667, + 3597, 3001, 3621, + 3495, 3123, 3549, + 3309, 3247, 3429, + 2803, 3373, 3197, + 0, 3501, 2201, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 3921, 376, 3867, + 3921, 429, 3867, + 3921, 491, 3867, + 3921, 564, 3867, + 3921, 645, 3867, + 3921, 735, 3867, + 3921, 833, 3867, + 3921, 938, 3867, + 3921, 1048, 3867, + 3919, 1164, 3865, + 3919, 1283, 3865, + 3919, 1405, 3865, + 3917, 1530, 3863, + 3915, 1656, 3861, + 3913, 1784, 3859, + 3909, 1913, 3857, + 3905, 2042, 3853, + 3899, 2173, 3847, + 3891, 2303, 3841, + 3879, 2435, 3831, + 3863, 2565, 3817, + 3841, 2697, 3799, + 3811, 2829, 3773, + 3767, 2961, 3735, + 3699, 3093, 3681, + 3591, 3225, 3595, + 3385, 3357, 3447, + 2735, 3489, 3121, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 4041, 0, 3959, + 4041, 0, 3959, + 4041, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4037, 0, 3957, + 4037, 0, 3957, + 4037, 0, 3957, + 4035, 0, 3955, + 4033, 0, 3953, + 4031, 0, 3951, + 4027, 815, 3947, + 4023, 1625, 3943, + 4015, 1965, 3937, + 4007, 2207, 3929, + 3995, 2407, 3919, + 3979, 2583, 3905, + 3957, 2747, 3883, + 3925, 2901, 3855, + 3879, 3049, 3813, + 3809, 3193, 3751, + 3693, 3333, 3651, + 3471, 3471, 3471, + 2627, 3607, 2991, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4057, + 4095, 0, 4057, + 4095, 0, 4057, + 4095, 0, 4055, + 4095, 0, 4053, + 4095, 0, 4053, + 4095, 0, 4049, + 4095, 0, 4047, + 4095, 0, 4041, + 4095, 1285, 4035, + 4095, 2034, 4027, + 4095, 2367, 4015, + 4095, 2607, 3999, + 4077, 2805, 3977, + 4043, 2981, 3945, + 3995, 3145, 3899, + 3923, 3297, 3831, + 3801, 3445, 3717, + 3565, 3589, 3499, + 2425, 3729, 2725, + 0, 3867, 0, + 0, 4003, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1597, 4095, + 4095, 2309, 4095, + 4095, 2637, 4095, + 4095, 2875, 4079, + 4095, 3071, 4045, + 4095, 3247, 3995, + 4041, 3409, 3919, + 3915, 3563, 3791, + 3665, 3711, 3537, + 1791, 3853, 0, + 0, 3993, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2215, 4095, + 4095, 2673, 4095, + 4095, 2951, 4095, + 4095, 3169, 4095, + 4095, 3357, 4095, + 4095, 3525, 4015, + 4033, 3683, 3877, + 3773, 3835, 3581, + 0, 3979, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2051, 4095, + 4095, 2717, 4095, + 4095, 3039, 4095, + 4095, 3275, 4095, + 4095, 3471, 4095, + 4095, 3645, 4095, + 4095, 3807, 3969, + 3885, 3961, 3633, + 3089, 2641, 3503, + 3089, 2641, 3503, + 3089, 2641, 3503, + 3089, 2643, 3503, + 3087, 2643, 3503, + 3087, 2645, 3503, + 3085, 2645, 3501, + 3083, 2649, 3501, + 3081, 2651, 3501, + 3077, 2655, 3499, + 3071, 2659, 3497, + 3065, 2667, 3495, + 3057, 2675, 3493, + 3043, 2687, 3489, + 3027, 2703, 3485, + 3003, 2721, 3479, + 2969, 2747, 3469, + 2919, 2777, 3457, + 2843, 2815, 3439, + 2715, 2863, 3415, + 2453, 2919, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2871, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3089, 2641, 3503, + 3089, 2641, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3085, 2645, 3503, + 3083, 2647, 3501, + 3081, 2651, 3501, + 3077, 2655, 3499, + 3073, 2659, 3499, + 3065, 2667, 3497, + 3057, 2675, 3493, + 3045, 2687, 3489, + 3027, 2701, 3485, + 3003, 2721, 3479, + 2969, 2745, 3469, + 2919, 2777, 3457, + 2843, 2815, 3439, + 2715, 2863, 3417, + 2455, 2919, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2871, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3089, 2641, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3087, 2645, 3503, + 3085, 2647, 3501, + 3081, 2651, 3501, + 3077, 2655, 3499, + 3073, 2659, 3499, + 3067, 2667, 3497, + 3057, 2675, 3493, + 3045, 2687, 3489, + 3027, 2701, 3485, + 3005, 2721, 3479, + 2971, 2745, 3469, + 2921, 2777, 3457, + 2843, 2815, 3441, + 2717, 2863, 3417, + 2459, 2917, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2871, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3089, 2643, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3085, 2647, 3501, + 3083, 2651, 3501, + 3079, 2655, 3499, + 3073, 2659, 3499, + 3067, 2667, 3497, + 3059, 2675, 3493, + 3045, 2687, 3491, + 3029, 2701, 3485, + 3005, 2721, 3479, + 2971, 2745, 3469, + 2921, 2777, 3457, + 2845, 2815, 3441, + 2719, 2863, 3417, + 2461, 2917, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2873, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3093, 2641, 3505, + 3093, 2641, 3505, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2643, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3085, 2647, 3503, + 3083, 2651, 3501, + 3079, 2655, 3501, + 3075, 2659, 3499, + 3069, 2667, 3497, + 3059, 2675, 3495, + 3047, 2687, 3491, + 3031, 2701, 3485, + 3007, 2721, 3479, + 2973, 2745, 3469, + 2923, 2777, 3457, + 2847, 2815, 3441, + 2721, 2861, 3417, + 2465, 2917, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3131, + 0, 3235, 2873, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3095, 2639, 3505, + 3093, 2641, 3505, + 3093, 2641, 3505, + 3093, 2641, 3505, + 3091, 2643, 3503, + 3091, 2643, 3503, + 3089, 2645, 3503, + 3087, 2647, 3503, + 3085, 2651, 3501, + 3081, 2655, 3501, + 3077, 2659, 3499, + 3069, 2667, 3497, + 3061, 2675, 3495, + 3049, 2687, 3491, + 3031, 2701, 3485, + 3007, 2721, 3479, + 2975, 2745, 3471, + 2925, 2777, 3459, + 2849, 2815, 3441, + 2723, 2861, 3417, + 2471, 2917, 3383, + 108, 2983, 3335, + 0, 3059, 3257, + 0, 3143, 3131, + 0, 3235, 2875, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3097, 2639, 3505, + 3095, 2641, 3505, + 3095, 2641, 3505, + 3095, 2641, 3505, + 3093, 2643, 3505, + 3093, 2643, 3505, + 3091, 2645, 3503, + 3089, 2647, 3503, + 3087, 2651, 3503, + 3083, 2653, 3501, + 3079, 2659, 3499, + 3071, 2665, 3497, + 3063, 2675, 3495, + 3051, 2687, 3491, + 3033, 2701, 3487, + 3011, 2721, 3479, + 2977, 2745, 3471, + 2927, 2777, 3459, + 2853, 2815, 3441, + 2727, 2861, 3417, + 2479, 2917, 3385, + 729, 2983, 3335, + 0, 3057, 3259, + 0, 3143, 3133, + 0, 3235, 2877, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3099, 2639, 3505, + 3099, 2639, 3505, + 3097, 2641, 3505, + 3097, 2641, 3505, + 3097, 2641, 3505, + 3095, 2643, 3505, + 3093, 2645, 3505, + 3091, 2647, 3503, + 3089, 2649, 3503, + 3085, 2653, 3501, + 3081, 2659, 3501, + 3075, 2665, 3499, + 3065, 2675, 3495, + 3053, 2685, 3493, + 3037, 2701, 3487, + 3013, 2721, 3481, + 2979, 2745, 3471, + 2931, 2777, 3459, + 2857, 2815, 3443, + 2733, 2861, 3419, + 2487, 2917, 3385, + 1043, 2983, 3335, + 0, 3057, 3261, + 0, 3141, 3133, + 0, 3235, 2881, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3101, 2639, 3507, + 3101, 2639, 3507, + 3101, 2639, 3507, + 3101, 2641, 3507, + 3099, 2641, 3507, + 3099, 2643, 3505, + 3097, 2645, 3505, + 3095, 2647, 3505, + 3093, 2649, 3503, + 3089, 2653, 3503, + 3085, 2659, 3501, + 3077, 2665, 3499, + 3069, 2673, 3497, + 3057, 2685, 3493, + 3041, 2701, 3489, + 3017, 2721, 3481, + 2985, 2745, 3473, + 2937, 2775, 3461, + 2863, 2815, 3443, + 2741, 2861, 3419, + 2501, 2917, 3387, + 1276, 2983, 3337, + 0, 3057, 3261, + 0, 3141, 3135, + 0, 3235, 2883, + 0, 3335, 699, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3107, 2639, 3507, + 3105, 2639, 3507, + 3105, 2639, 3507, + 3105, 2639, 3507, + 3103, 2641, 3507, + 3103, 2641, 3507, + 3101, 2643, 3507, + 3099, 2645, 3505, + 3097, 2649, 3505, + 3093, 2653, 3503, + 3089, 2657, 3503, + 3083, 2665, 3501, + 3073, 2673, 3497, + 3061, 2685, 3495, + 3045, 2701, 3489, + 3023, 2719, 3483, + 2989, 2745, 3473, + 2943, 2775, 3461, + 2869, 2813, 3445, + 2751, 2861, 3421, + 2517, 2917, 3387, + 1471, 2983, 3339, + 0, 3057, 3263, + 0, 3141, 3139, + 0, 3235, 2889, + 0, 3335, 1073, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3111, 2637, 3509, + 3111, 2637, 3509, + 3111, 2639, 3509, + 3111, 2639, 3509, + 3109, 2639, 3509, + 3109, 2641, 3509, + 3107, 2643, 3509, + 3105, 2645, 3507, + 3103, 2647, 3507, + 3099, 2651, 3505, + 3095, 2657, 3505, + 3089, 2663, 3503, + 3079, 2673, 3499, + 3069, 2685, 3495, + 3051, 2699, 3491, + 3029, 2719, 3485, + 2997, 2743, 3475, + 2951, 2775, 3463, + 2879, 2813, 3447, + 2763, 2861, 3423, + 2537, 2917, 3389, + 1645, 2981, 3341, + 0, 3057, 3267, + 0, 3141, 3143, + 0, 3235, 2895, + 0, 3335, 1327, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3119, 2637, 3511, + 3119, 2637, 3511, + 3119, 2637, 3511, + 3119, 2637, 3511, + 3117, 2639, 3511, + 3117, 2641, 3511, + 3115, 2641, 3511, + 3113, 2643, 3509, + 3111, 2647, 3509, + 3107, 2651, 3507, + 3103, 2655, 3507, + 3097, 2663, 3505, + 3087, 2671, 3501, + 3077, 2683, 3499, + 3061, 2699, 3493, + 3039, 2717, 3487, + 3007, 2743, 3477, + 2961, 2773, 3465, + 2893, 2813, 3449, + 2779, 2859, 3425, + 2563, 2915, 3393, + 1806, 2981, 3345, + 0, 3057, 3271, + 0, 3141, 3147, + 0, 3233, 2903, + 0, 3335, 1533, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4039, 0, + 3129, 2635, 3515, + 3129, 2635, 3515, + 3129, 2635, 3515, + 3129, 2637, 3515, + 3127, 2637, 3513, + 3127, 2639, 3513, + 3125, 2641, 3513, + 3123, 2643, 3513, + 3121, 2645, 3511, + 3117, 2649, 3511, + 3113, 2655, 3509, + 3107, 2661, 3507, + 3099, 2671, 3505, + 3087, 2681, 3501, + 3071, 2697, 3497, + 3051, 2717, 3489, + 3019, 2741, 3481, + 2975, 2773, 3469, + 2909, 2811, 3453, + 2799, 2859, 3429, + 2597, 2915, 3397, + 1958, 2981, 3349, + 0, 3057, 3275, + 0, 3141, 3153, + 0, 3233, 2913, + 0, 3333, 1714, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4039, 0, + 3143, 2633, 3519, + 3143, 2633, 3519, + 3141, 2633, 3519, + 3141, 2635, 3517, + 3141, 2635, 3517, + 3139, 2637, 3517, + 3139, 2639, 3517, + 3137, 2641, 3517, + 3133, 2643, 3515, + 3131, 2647, 3515, + 3127, 2653, 3513, + 3121, 2659, 3511, + 3113, 2669, 3509, + 3101, 2681, 3505, + 3087, 2695, 3501, + 3065, 2715, 3493, + 3037, 2741, 3485, + 2993, 2771, 3473, + 2929, 2811, 3457, + 2827, 2857, 3433, + 2637, 2913, 3401, + 2105, 2979, 3353, + 0, 3055, 3281, + 0, 3139, 3161, + 0, 3233, 2927, + 0, 3333, 1879, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3159, 2631, 3523, + 3159, 2631, 3523, + 3159, 2631, 3523, + 3159, 2631, 3523, + 3157, 2633, 3523, + 3157, 2635, 3523, + 3155, 2635, 3521, + 3153, 2637, 3521, + 3151, 2641, 3521, + 3149, 2645, 3519, + 3143, 2651, 3517, + 3139, 2657, 3517, + 3131, 2665, 3513, + 3121, 2677, 3511, + 3105, 2693, 3505, + 3085, 2713, 3499, + 3057, 2737, 3491, + 3017, 2769, 3479, + 2955, 2809, 3463, + 2859, 2855, 3439, + 2687, 2913, 3407, + 2249, 2979, 3361, + 0, 3055, 3289, + 0, 3139, 3173, + 0, 3233, 2945, + 0, 3333, 2034, + 0, 3439, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3181, 2627, 3529, + 3181, 2627, 3529, + 3181, 2627, 3529, + 3179, 2629, 3529, + 3179, 2629, 3529, + 3179, 2631, 3529, + 3177, 2633, 3529, + 3175, 2635, 3527, + 3173, 2637, 3527, + 3171, 2641, 3527, + 3167, 2647, 3525, + 3161, 2653, 3523, + 3153, 2663, 3521, + 3143, 2675, 3517, + 3129, 2689, 3513, + 3111, 2709, 3505, + 3085, 2735, 3497, + 3047, 2767, 3485, + 2989, 2807, 3469, + 2901, 2853, 3447, + 2745, 2911, 3417, + 2389, 2977, 3371, + 0, 3053, 3301, + 0, 3137, 3187, + 0, 3231, 2969, + 0, 3333, 2183, + 0, 3439, 0, + 0, 3551, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3209, 2621, 3539, + 3207, 2623, 3539, + 3207, 2623, 3539, + 3207, 2623, 3539, + 3207, 2625, 3537, + 3205, 2625, 3537, + 3205, 2627, 3537, + 3203, 2629, 3537, + 3201, 2633, 3535, + 3199, 2637, 3535, + 3195, 2643, 3533, + 3189, 2649, 3531, + 3183, 2659, 3529, + 3173, 2671, 3525, + 3161, 2685, 3521, + 3143, 2705, 3515, + 3117, 2731, 3507, + 3083, 2763, 3495, + 3031, 2803, 3479, + 2949, 2851, 3459, + 2813, 2909, 3427, + 2527, 2975, 3383, + 0, 3051, 3315, + 0, 3137, 3205, + 0, 3229, 2997, + 0, 3331, 2327, + 0, 3439, 0, + 0, 3551, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3243, 2615, 3549, + 3243, 2615, 3549, + 3241, 2617, 3549, + 3241, 2617, 3549, + 3241, 2617, 3549, + 3239, 2619, 3549, + 3239, 2621, 3549, + 3237, 2623, 3547, + 3235, 2627, 3547, + 3233, 2631, 3547, + 3229, 2635, 3545, + 3225, 2643, 3543, + 3219, 2653, 3541, + 3209, 2665, 3537, + 3199, 2681, 3533, + 3181, 2701, 3527, + 3159, 2727, 3519, + 3127, 2759, 3507, + 3079, 2799, 3493, + 3009, 2847, 3471, + 2891, 2905, 3441, + 2663, 2971, 3399, + 1725, 3049, 3333, + 0, 3135, 3229, + 0, 3229, 3035, + 0, 3329, 2467, + 0, 3437, 0, + 0, 3551, 0, + 0, 3667, 0, + 0, 3789, 0, + 0, 3911, 0, + 0, 4037, 0, + 3285, 2607, 3565, + 3285, 2607, 3565, + 3283, 2607, 3565, + 3283, 2609, 3565, + 3283, 2609, 3565, + 3283, 2611, 3563, + 3281, 2613, 3563, + 3279, 2615, 3563, + 3279, 2617, 3563, + 3275, 2621, 3561, + 3273, 2627, 3559, + 3269, 2635, 3559, + 3263, 2645, 3555, + 3255, 2657, 3553, + 3245, 2673, 3549, + 3229, 2693, 3543, + 3209, 2719, 3535, + 3181, 2753, 3525, + 3139, 2793, 3509, + 3077, 2841, 3489, + 2977, 2899, 3461, + 2797, 2967, 3419, + 2323, 3045, 3357, + 0, 3131, 3257, + 0, 3225, 3079, + 0, 3327, 2607, + 0, 3435, 0, + 0, 3549, 0, + 0, 3667, 0, + 0, 3787, 0, + 0, 3911, 0, + 0, 4037, 0, + 3335, 2595, 3583, + 3335, 2595, 3583, + 3335, 2595, 3583, + 3335, 2597, 3583, + 3333, 2597, 3583, + 3333, 2599, 3583, + 3333, 2601, 3583, + 3331, 2603, 3581, + 3329, 2605, 3581, + 3327, 2611, 3581, + 3325, 2615, 3579, + 3321, 2623, 3577, + 3315, 2633, 3575, + 3309, 2645, 3573, + 3299, 2661, 3567, + 3287, 2683, 3563, + 3269, 2709, 3555, + 3243, 2743, 3545, + 3207, 2785, 3531, + 3155, 2835, 3511, + 3073, 2893, 3485, + 2933, 2963, 3445, + 2633, 3041, 3387, + 0, 3127, 3295, + 0, 3223, 3131, + 0, 3325, 2743, + 0, 3433, 0, + 0, 3547, 0, + 0, 3665, 0, + 0, 3787, 0, + 0, 3911, 0, + 0, 4037, 0, + 3395, 2577, 3607, + 3395, 2577, 3607, + 3395, 2579, 3607, + 3395, 2579, 3607, + 3393, 2581, 3607, + 3393, 2581, 3607, + 3393, 2583, 3607, + 3391, 2587, 3607, + 3391, 2589, 3605, + 3389, 2593, 3605, + 3385, 2599, 3603, + 3383, 2607, 3601, + 3379, 2617, 3599, + 3373, 2631, 3597, + 3363, 2647, 3593, + 3353, 2669, 3587, + 3337, 2697, 3581, + 3315, 2731, 3571, + 3285, 2773, 3559, + 3241, 2825, 3539, + 3175, 2885, 3515, + 3067, 2955, 3477, + 2863, 3035, 3423, + 2235, 3123, 3339, + 0, 3219, 3195, + 0, 3323, 2879, + 0, 3431, 0, + 0, 3545, 0, + 0, 3665, 0, + 0, 3785, 0, + 0, 3909, 0, + 0, 4035, 0, + 3465, 2555, 3639, + 3465, 2555, 3639, + 3465, 2555, 3639, + 3465, 2557, 3639, + 3463, 2557, 3637, + 3463, 2559, 3637, + 3463, 2561, 3637, + 3461, 2563, 3637, + 3461, 2567, 3637, + 3459, 2571, 3635, + 3457, 2577, 3635, + 3455, 2585, 3633, + 3451, 2597, 3631, + 3445, 2609, 3629, + 3439, 2627, 3625, + 3429, 2651, 3619, + 3415, 2679, 3613, + 3397, 2715, 3605, + 3373, 2759, 3591, + 3335, 2811, 3575, + 3283, 2873, 3551, + 3199, 2945, 3517, + 3057, 3025, 3469, + 2753, 3115, 3393, + 0, 3213, 3267, + 0, 3317, 3013, + 0, 3427, 479, + 0, 3543, 0, + 0, 3661, 0, + 0, 3783, 0, + 0, 3909, 0, + 0, 4035, 0, + 3543, 2521, 3677, + 3543, 2521, 3677, + 3543, 2521, 3677, + 3543, 2523, 3675, + 3543, 2525, 3675, + 3543, 2525, 3675, + 3541, 2527, 3675, + 3541, 2531, 3675, + 3541, 2535, 3675, + 3539, 2539, 3673, + 3537, 2545, 3673, + 3535, 2555, 3671, + 3531, 2565, 3669, + 3527, 2581, 3667, + 3521, 2599, 3663, + 3513, 2623, 3659, + 3503, 2653, 3653, + 3487, 2691, 3645, + 3467, 2737, 3633, + 3439, 2793, 3619, + 3395, 2857, 3597, + 3333, 2931, 3567, + 3231, 3015, 3523, + 3047, 3107, 3455, + 2543, 3205, 3349, + 0, 3311, 3147, + 0, 3423, 2533, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 3631, 2471, 3723, + 3631, 2473, 3723, + 3631, 2473, 3723, + 3631, 2475, 3723, + 3631, 2475, 3721, + 3631, 2477, 3721, + 3631, 2479, 3721, + 3629, 2483, 3721, + 3629, 2487, 3721, + 3627, 2493, 3719, + 3627, 2499, 3719, + 3625, 2509, 3717, + 3621, 2521, 3717, + 3619, 2537, 3713, + 3613, 2559, 3711, + 3607, 2585, 3707, + 3599, 2617, 3701, + 3587, 2659, 3695, + 3569, 2707, 3685, + 3547, 2767, 3671, + 3513, 2835, 3651, + 3465, 2911, 3625, + 3393, 2999, 3585, + 3271, 3093, 3529, + 3031, 3195, 3439, + 1838, 3303, 3281, + 0, 3417, 2915, + 0, 3535, 0, + 0, 3655, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4031, 0, + 3727, 2397, 3777, + 3727, 2397, 3777, + 3727, 2399, 3777, + 3727, 2399, 3777, + 3727, 2401, 3777, + 3727, 2403, 3777, + 3727, 2407, 3777, + 3725, 2411, 3777, + 3725, 2415, 3775, + 3725, 2421, 3775, + 3723, 2429, 3775, + 3721, 2441, 3773, + 3719, 2455, 3773, + 3717, 2475, 3771, + 3713, 2497, 3767, + 3707, 2527, 3763, + 3701, 2565, 3759, + 3691, 2611, 3753, + 3679, 2665, 3743, + 3659, 2729, 3731, + 3635, 2803, 3715, + 3599, 2885, 3691, + 3545, 2977, 3659, + 3461, 3075, 3611, + 3319, 3181, 3537, + 3009, 3293, 3415, + 0, 3409, 3173, + 0, 3527, 1904, + 0, 3651, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 3831, 2273, 3843, + 3831, 2273, 3843, + 3831, 2275, 3843, + 3831, 2277, 3843, + 3831, 2279, 3841, + 3831, 2281, 3841, + 3829, 2285, 3841, + 3829, 2289, 3841, + 3829, 2297, 3841, + 3829, 2305, 3841, + 3827, 2315, 3839, + 3827, 2329, 3839, + 3825, 2349, 3837, + 3823, 2371, 3835, + 3819, 2401, 3833, + 3815, 2437, 3831, + 3809, 2483, 3827, + 3801, 2537, 3821, + 3791, 2601, 3813, + 3777, 2673, 3803, + 3759, 2755, 3789, + 3731, 2847, 3769, + 3691, 2945, 3741, + 3633, 3051, 3701, + 3539, 3161, 3641, + 3375, 3277, 3547, + 2979, 3397, 3381, + 0, 3519, 2969, + 0, 3643, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4027, 0, + 3939, 2026, 3917, + 3939, 2027, 3917, + 3939, 2029, 3917, + 3939, 2032, 3917, + 3939, 2035, 3917, + 3939, 2040, 3917, + 3939, 2046, 3915, + 3939, 2055, 3915, + 3939, 2065, 3915, + 3937, 2079, 3915, + 3937, 2097, 3915, + 3937, 2119, 3913, + 3935, 2149, 3913, + 3933, 2185, 3911, + 3931, 2229, 3909, + 3927, 2281, 3907, + 3923, 2343, 3903, + 3917, 2415, 3899, + 3909, 2497, 3891, + 3899, 2587, 3883, + 3883, 2683, 3871, + 3863, 2789, 3855, + 3833, 2899, 3833, + 3791, 3015, 3799, + 3729, 3133, 3753, + 3627, 3255, 3681, + 3441, 3379, 3561, + 2935, 3507, 3331, + 0, 3633, 2333, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 4055, 463, 3999, + 4055, 508, 3999, + 4053, 561, 3999, + 4053, 623, 3999, + 4053, 696, 3999, + 4053, 777, 3999, + 4053, 867, 3999, + 4053, 965, 3999, + 4053, 1070, 3999, + 4053, 1181, 3999, + 4051, 1296, 3999, + 4051, 1415, 3997, + 4051, 1537, 3997, + 4049, 1662, 3995, + 4047, 1788, 3993, + 4045, 1916, 3991, + 4041, 2045, 3989, + 4037, 2175, 3985, + 4031, 2305, 3979, + 4023, 2435, 3973, + 4011, 2567, 3963, + 3995, 2697, 3949, + 3973, 2829, 3931, + 3943, 2961, 3905, + 3899, 3093, 3867, + 3831, 3225, 3813, + 3723, 3357, 3727, + 3517, 3489, 3579, + 2867, 3621, 3253, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4087, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 947, 4079, + 4095, 1757, 4075, + 4095, 2097, 4069, + 4095, 2339, 4061, + 4095, 2539, 4051, + 4095, 2717, 4037, + 4089, 2879, 4015, + 4057, 3033, 3987, + 4011, 3181, 3945, + 3941, 3325, 3883, + 3825, 3465, 3783, + 3603, 3603, 3603, + 2759, 3739, 3123, + 0, 3875, 0, + 0, 4009, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1417, 4095, + 4095, 2167, 4095, + 4095, 2499, 4095, + 4095, 2739, 4095, + 4095, 2937, 4095, + 4095, 3115, 4077, + 4095, 3277, 4033, + 4055, 3431, 3963, + 3933, 3577, 3849, + 3697, 3721, 3631, + 2557, 3861, 2857, + 0, 3999, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1729, 4095, + 4095, 2441, 4095, + 4095, 2769, 4095, + 4095, 3007, 4095, + 4095, 3203, 4095, + 4095, 3379, 4095, + 4095, 3541, 4051, + 4047, 3695, 3923, + 3797, 3843, 3669, + 1924, 3985, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2347, 4095, + 4095, 2805, 4095, + 4095, 3085, 4095, + 4095, 3301, 4095, + 4095, 3489, 4095, + 4095, 3657, 4095, + 4095, 3815, 4009, + 3905, 3967, 3713, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2775, 3635, + 3219, 2775, 3635, + 3219, 2777, 3635, + 3217, 2779, 3635, + 3215, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3203, 2793, 3629, + 3197, 2799, 3627, + 3187, 2807, 3625, + 3175, 2819, 3621, + 3159, 2835, 3617, + 3135, 2853, 3611, + 3101, 2879, 3601, + 3051, 2909, 3589, + 2973, 2947, 3571, + 2845, 2995, 3547, + 2585, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3387, + 0, 3275, 3261, + 0, 3367, 3003, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2775, 3635, + 3219, 2775, 3635, + 3219, 2777, 3635, + 3217, 2777, 3635, + 3215, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3203, 2791, 3631, + 3197, 2799, 3629, + 3189, 2807, 3625, + 3175, 2819, 3621, + 3159, 2835, 3617, + 3135, 2853, 3611, + 3101, 2879, 3601, + 3051, 2909, 3589, + 2975, 2947, 3571, + 2847, 2995, 3549, + 2587, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3003, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2773, 3635, + 3221, 2775, 3635, + 3221, 2775, 3635, + 3219, 2777, 3635, + 3217, 2777, 3635, + 3215, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3205, 2791, 3631, + 3197, 2799, 3629, + 3189, 2807, 3625, + 3177, 2819, 3621, + 3159, 2835, 3617, + 3135, 2853, 3611, + 3101, 2879, 3601, + 3051, 2909, 3589, + 2975, 2947, 3573, + 2847, 2995, 3549, + 2587, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3003, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2775, 3635, + 3221, 2775, 3635, + 3219, 2777, 3635, + 3219, 2777, 3635, + 3217, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3205, 2791, 3631, + 3199, 2799, 3629, + 3189, 2807, 3625, + 3177, 2819, 3623, + 3161, 2835, 3617, + 3137, 2853, 3611, + 3103, 2879, 3601, + 3053, 2909, 3589, + 2977, 2947, 3573, + 2849, 2995, 3549, + 2591, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3005, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3225, 2773, 3637, + 3223, 2773, 3637, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2775, 3635, + 3221, 2777, 3635, + 3219, 2777, 3635, + 3217, 2779, 3633, + 3215, 2783, 3633, + 3211, 2787, 3633, + 3205, 2791, 3631, + 3199, 2799, 3629, + 3191, 2807, 3625, + 3177, 2819, 3623, + 3161, 2833, 3617, + 3137, 2853, 3611, + 3103, 2877, 3601, + 3053, 2909, 3589, + 2977, 2947, 3573, + 2851, 2995, 3549, + 2593, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3005, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3225, 2771, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3223, 2773, 3635, + 3223, 2775, 3635, + 3221, 2775, 3635, + 3221, 2777, 3635, + 3219, 2779, 3635, + 3215, 2783, 3633, + 3211, 2787, 3633, + 3207, 2791, 3631, + 3201, 2799, 3629, + 3191, 2807, 3627, + 3179, 2819, 3623, + 3163, 2833, 3617, + 3139, 2853, 3611, + 3105, 2877, 3603, + 3055, 2909, 3589, + 2979, 2947, 3573, + 2853, 2995, 3549, + 2597, 3049, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3263, + 0, 3367, 3007, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3227, 2771, 3637, + 3227, 2773, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3225, 2775, 3637, + 3223, 2775, 3635, + 3221, 2777, 3635, + 3219, 2779, 3635, + 3217, 2783, 3633, + 3213, 2787, 3633, + 3209, 2791, 3631, + 3201, 2799, 3629, + 3193, 2807, 3627, + 3181, 2819, 3623, + 3163, 2833, 3619, + 3141, 2853, 3611, + 3107, 2877, 3603, + 3057, 2909, 3591, + 2981, 2947, 3573, + 2855, 2993, 3549, + 2603, 3049, 3515, + 240, 3115, 3467, + 0, 3191, 3391, + 0, 3275, 3263, + 0, 3367, 3007, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3229, 2771, 3637, + 3229, 2771, 3637, + 3227, 2773, 3637, + 3227, 2773, 3637, + 3227, 2773, 3637, + 3225, 2775, 3637, + 3225, 2775, 3637, + 3223, 2777, 3635, + 3221, 2779, 3635, + 3219, 2783, 3635, + 3215, 2787, 3633, + 3211, 2791, 3631, + 3203, 2797, 3629, + 3195, 2807, 3627, + 3183, 2819, 3623, + 3165, 2833, 3619, + 3143, 2853, 3611, + 3109, 2877, 3603, + 3059, 2909, 3591, + 2985, 2947, 3573, + 2861, 2993, 3551, + 2611, 3049, 3517, + 861, 3115, 3467, + 0, 3191, 3391, + 0, 3275, 3265, + 0, 3367, 3009, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3231, 2771, 3639, + 3231, 2771, 3637, + 3231, 2771, 3637, + 3229, 2773, 3637, + 3229, 2773, 3637, + 3229, 2773, 3637, + 3227, 2775, 3637, + 3225, 2777, 3637, + 3223, 2779, 3635, + 3221, 2781, 3635, + 3217, 2785, 3633, + 3213, 2791, 3633, + 3207, 2797, 3631, + 3197, 2807, 3627, + 3185, 2819, 3625, + 3169, 2833, 3619, + 3145, 2853, 3613, + 3113, 2877, 3603, + 3063, 2909, 3591, + 2989, 2947, 3575, + 2865, 2993, 3551, + 2619, 3049, 3517, + 1175, 3115, 3467, + 0, 3189, 3393, + 0, 3275, 3267, + 0, 3367, 3013, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3235, 2771, 3639, + 3233, 2771, 3639, + 3233, 2771, 3639, + 3233, 2771, 3639, + 3233, 2773, 3639, + 3231, 2773, 3639, + 3231, 2775, 3637, + 3229, 2777, 3637, + 3227, 2779, 3637, + 3225, 2781, 3635, + 3221, 2785, 3635, + 3217, 2791, 3633, + 3209, 2797, 3631, + 3201, 2807, 3629, + 3189, 2817, 3625, + 3173, 2833, 3621, + 3149, 2853, 3613, + 3117, 2877, 3605, + 3069, 2907, 3593, + 2995, 2947, 3575, + 2873, 2993, 3553, + 2633, 3049, 3519, + 1408, 3115, 3469, + 0, 3189, 3393, + 0, 3273, 3269, + 0, 3367, 3015, + 0, 3467, 831, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3239, 2771, 3641, + 3239, 2771, 3641, + 3237, 2771, 3639, + 3237, 2771, 3639, + 3237, 2771, 3639, + 3237, 2773, 3639, + 3235, 2775, 3639, + 3233, 2775, 3639, + 3231, 2777, 3637, + 3229, 2781, 3637, + 3225, 2785, 3637, + 3221, 2789, 3635, + 3215, 2797, 3633, + 3205, 2805, 3629, + 3193, 2817, 3627, + 3177, 2833, 3621, + 3155, 2851, 3615, + 3123, 2877, 3607, + 3075, 2907, 3593, + 3001, 2947, 3577, + 2883, 2993, 3553, + 2649, 3049, 3519, + 1603, 3115, 3471, + 0, 3189, 3395, + 0, 3273, 3271, + 0, 3367, 3021, + 0, 3467, 1205, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3245, 2769, 3641, + 3245, 2769, 3641, + 3243, 2769, 3641, + 3243, 2771, 3641, + 3243, 2771, 3641, + 3241, 2773, 3641, + 3241, 2773, 3641, + 3239, 2775, 3641, + 3237, 2777, 3639, + 3235, 2781, 3639, + 3231, 2783, 3637, + 3227, 2789, 3637, + 3221, 2795, 3635, + 3211, 2805, 3631, + 3201, 2817, 3627, + 3185, 2831, 3623, + 3161, 2851, 3617, + 3129, 2875, 3607, + 3083, 2907, 3595, + 3011, 2945, 3579, + 2895, 2993, 3555, + 2669, 3049, 3523, + 1777, 3115, 3473, + 0, 3189, 3399, + 0, 3273, 3275, + 0, 3367, 3027, + 0, 3467, 1459, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3923, 0, + 0, 4045, 0, + 3251, 2769, 3643, + 3251, 2769, 3643, + 3251, 2769, 3643, + 3251, 2769, 3643, + 3251, 2771, 3643, + 3249, 2771, 3643, + 3249, 2773, 3643, + 3247, 2773, 3643, + 3245, 2777, 3641, + 3243, 2779, 3641, + 3239, 2783, 3639, + 3235, 2789, 3639, + 3229, 2795, 3637, + 3221, 2803, 3633, + 3209, 2815, 3631, + 3193, 2831, 3625, + 3171, 2851, 3619, + 3139, 2875, 3611, + 3093, 2907, 3597, + 3025, 2945, 3581, + 2911, 2991, 3557, + 2695, 3047, 3525, + 1938, 3113, 3477, + 0, 3189, 3403, + 0, 3273, 3279, + 0, 3365, 3035, + 0, 3467, 1665, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3923, 0, + 0, 4045, 0, + 3261, 2767, 3647, + 3261, 2767, 3647, + 3261, 2767, 3647, + 3261, 2767, 3647, + 3261, 2769, 3647, + 3259, 2769, 3645, + 3259, 2771, 3645, + 3257, 2773, 3645, + 3255, 2775, 3645, + 3253, 2777, 3643, + 3249, 2781, 3643, + 3245, 2787, 3641, + 3239, 2793, 3639, + 3231, 2803, 3637, + 3219, 2815, 3633, + 3205, 2829, 3629, + 3183, 2849, 3621, + 3151, 2873, 3613, + 3107, 2905, 3601, + 3041, 2943, 3585, + 2933, 2991, 3561, + 2729, 3047, 3529, + 2091, 3113, 3481, + 0, 3189, 3407, + 0, 3273, 3285, + 0, 3365, 3045, + 0, 3465, 1846, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3275, 2765, 3651, + 3275, 2765, 3651, + 3275, 2765, 3651, + 3273, 2765, 3651, + 3273, 2767, 3649, + 3273, 2767, 3649, + 3271, 2769, 3649, + 3271, 2771, 3649, + 3269, 2773, 3649, + 3267, 2775, 3647, + 3263, 2779, 3647, + 3259, 2785, 3645, + 3253, 2791, 3643, + 3245, 2801, 3641, + 3233, 2813, 3637, + 3219, 2827, 3633, + 3197, 2847, 3625, + 3169, 2873, 3617, + 3125, 2903, 3605, + 3061, 2943, 3589, + 2959, 2989, 3565, + 2769, 3047, 3533, + 2237, 3111, 3485, + 0, 3187, 3413, + 0, 3271, 3293, + 0, 3365, 3059, + 0, 3465, 2011, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3289, 2765, 3655, + 3289, 2767, 3655, + 3287, 2767, 3653, + 3285, 2771, 3653, + 3283, 2773, 3653, + 3281, 2777, 3651, + 3275, 2783, 3651, + 3271, 2789, 3649, + 3263, 2799, 3645, + 3253, 2809, 3643, + 3237, 2825, 3637, + 3217, 2845, 3631, + 3189, 2871, 3623, + 3149, 2901, 3611, + 3089, 2941, 3595, + 2991, 2989, 3571, + 2819, 3045, 3539, + 2381, 3111, 3493, + 0, 3187, 3421, + 0, 3271, 3305, + 0, 3365, 3077, + 0, 3465, 2167, + 0, 3571, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3313, 2759, 3663, + 3313, 2759, 3661, + 3313, 2759, 3661, + 3313, 2759, 3661, + 3311, 2761, 3661, + 3311, 2761, 3661, + 3311, 2763, 3661, + 3309, 2765, 3661, + 3307, 2767, 3659, + 3305, 2769, 3659, + 3303, 2773, 3659, + 3299, 2779, 3657, + 3293, 2785, 3655, + 3285, 2795, 3653, + 3275, 2807, 3649, + 3261, 2823, 3645, + 3243, 2841, 3639, + 3217, 2867, 3629, + 3179, 2899, 3619, + 3121, 2939, 3603, + 3033, 2985, 3579, + 2877, 3043, 3549, + 2521, 3109, 3503, + 0, 3185, 3433, + 0, 3269, 3319, + 0, 3363, 3101, + 0, 3465, 2315, + 0, 3571, 0, + 0, 3683, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3341, 2753, 3671, + 3341, 2753, 3671, + 3341, 2755, 3671, + 3339, 2755, 3671, + 3339, 2755, 3671, + 3339, 2757, 3671, + 3337, 2757, 3669, + 3337, 2759, 3669, + 3335, 2761, 3669, + 3333, 2765, 3667, + 3331, 2769, 3667, + 3327, 2775, 3665, + 3321, 2781, 3663, + 3315, 2791, 3661, + 3305, 2803, 3657, + 3293, 2817, 3653, + 3275, 2837, 3647, + 3249, 2863, 3639, + 3215, 2895, 3627, + 3163, 2935, 3613, + 3081, 2983, 3591, + 2945, 3041, 3559, + 2659, 3107, 3515, + 0, 3183, 3447, + 0, 3269, 3337, + 0, 3363, 3131, + 0, 3463, 2459, + 0, 3571, 0, + 0, 3683, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3375, 2747, 3683, + 3375, 2747, 3683, + 3375, 2747, 3681, + 3373, 2749, 3681, + 3373, 2749, 3681, + 3373, 2751, 3681, + 3373, 2751, 3681, + 3371, 2753, 3681, + 3369, 2755, 3681, + 3367, 2759, 3679, + 3365, 2763, 3679, + 3361, 2767, 3677, + 3357, 2775, 3675, + 3351, 2785, 3673, + 3341, 2797, 3669, + 3331, 2813, 3665, + 3313, 2833, 3659, + 3291, 2859, 3651, + 3259, 2891, 3641, + 3213, 2931, 3625, + 3141, 2979, 3603, + 3023, 3037, 3573, + 2795, 3103, 3531, + 1857, 3181, 3465, + 0, 3267, 3361, + 0, 3361, 3167, + 0, 3461, 2601, + 0, 3569, 0, + 0, 3683, 0, + 0, 3799, 0, + 0, 3921, 0, + 0, 4043, 0, + 3417, 2739, 3697, + 3417, 2739, 3697, + 3417, 2739, 3697, + 3415, 2739, 3697, + 3415, 2741, 3697, + 3415, 2741, 3697, + 3415, 2743, 3695, + 3413, 2745, 3695, + 3413, 2747, 3695, + 3411, 2749, 3695, + 3407, 2753, 3693, + 3405, 2759, 3691, + 3401, 2767, 3691, + 3395, 2777, 3687, + 3387, 2789, 3685, + 3377, 2805, 3681, + 3361, 2825, 3675, + 3341, 2851, 3667, + 3313, 2885, 3657, + 3271, 2925, 3641, + 3209, 2973, 3621, + 3109, 3033, 3593, + 2929, 3099, 3551, + 2455, 3177, 3489, + 0, 3263, 3389, + 0, 3359, 3211, + 0, 3459, 2739, + 0, 3569, 0, + 0, 3681, 0, + 0, 3799, 0, + 0, 3919, 0, + 0, 4043, 0, + 3467, 2727, 3715, + 3467, 2727, 3715, + 3467, 2727, 3715, + 3467, 2727, 3715, + 3467, 2729, 3715, + 3465, 2729, 3715, + 3465, 2731, 3715, + 3465, 2733, 3715, + 3463, 2735, 3713, + 3461, 2737, 3713, + 3459, 2743, 3713, + 3457, 2747, 3711, + 3453, 2755, 3709, + 3447, 2765, 3707, + 3441, 2777, 3705, + 3431, 2795, 3701, + 3419, 2815, 3695, + 3401, 2841, 3687, + 3375, 2875, 3677, + 3339, 2917, 3663, + 3287, 2967, 3643, + 3205, 3025, 3617, + 3065, 3095, 3577, + 2765, 3173, 3519, + 0, 3259, 3427, + 0, 3355, 3265, + 0, 3457, 2875, + 0, 3567, 0, + 0, 3679, 0, + 0, 3797, 0, + 0, 3919, 0, + 0, 4043, 0, + 3527, 2709, 3741, + 3527, 2709, 3741, + 3527, 2711, 3739, + 3527, 2711, 3739, + 3527, 2711, 3739, + 3527, 2713, 3739, + 3525, 2713, 3739, + 3525, 2715, 3739, + 3523, 2719, 3739, + 3523, 2721, 3737, + 3521, 2727, 3737, + 3519, 2731, 3735, + 3515, 2739, 3735, + 3511, 2749, 3731, + 3505, 2763, 3729, + 3497, 2779, 3725, + 3485, 2801, 3719, + 3469, 2829, 3713, + 3447, 2863, 3703, + 3417, 2905, 3691, + 3373, 2957, 3671, + 3307, 3017, 3647, + 3199, 3087, 3609, + 2997, 3167, 3555, + 2367, 3255, 3471, + 0, 3351, 3327, + 0, 3455, 3011, + 0, 3563, 0, + 0, 3677, 0, + 0, 3797, 0, + 0, 3917, 0, + 0, 4041, 0, + 3597, 2685, 3771, + 3597, 2687, 3771, + 3597, 2687, 3771, + 3597, 2687, 3771, + 3597, 2689, 3771, + 3595, 2689, 3771, + 3595, 2691, 3769, + 3595, 2693, 3769, + 3593, 2695, 3769, + 3593, 2699, 3769, + 3591, 2703, 3767, + 3589, 2709, 3767, + 3587, 2717, 3765, + 3583, 2729, 3763, + 3577, 2741, 3761, + 3571, 2759, 3757, + 3561, 2783, 3751, + 3547, 2811, 3745, + 3529, 2847, 3737, + 3505, 2891, 3725, + 3469, 2943, 3707, + 3415, 3005, 3683, + 3331, 3077, 3649, + 3191, 3157, 3601, + 2885, 3247, 3525, + 0, 3345, 3399, + 0, 3449, 3145, + 0, 3559, 611, + 0, 3675, 0, + 0, 3795, 0, + 0, 3917, 0, + 0, 4041, 0, + 3675, 2653, 3809, + 3675, 2653, 3809, + 3675, 2653, 3809, + 3675, 2655, 3809, + 3675, 2655, 3809, + 3675, 2657, 3807, + 3675, 2657, 3807, + 3675, 2659, 3807, + 3673, 2663, 3807, + 3673, 2667, 3807, + 3671, 2671, 3805, + 3669, 2677, 3805, + 3667, 2687, 3803, + 3663, 2697, 3801, + 3659, 2713, 3799, + 3653, 2731, 3795, + 3645, 2755, 3791, + 3635, 2785, 3785, + 3621, 2823, 3777, + 3599, 2869, 3765, + 3571, 2925, 3751, + 3529, 2989, 3729, + 3465, 3063, 3699, + 3363, 3147, 3655, + 3179, 3239, 3589, + 2675, 3337, 3481, + 0, 3443, 3281, + 0, 3555, 2665, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3763, 2603, 3855, + 3763, 2605, 3855, + 3763, 2605, 3855, + 3763, 2605, 3855, + 3763, 2607, 3855, + 3763, 2607, 3855, + 3763, 2609, 3853, + 3763, 2611, 3853, + 3761, 2615, 3853, + 3761, 2619, 3853, + 3759, 2625, 3853, + 3759, 2631, 3851, + 3757, 2641, 3849, + 3753, 2653, 3849, + 3751, 2671, 3847, + 3745, 2691, 3843, + 3739, 2717, 3839, + 3731, 2751, 3833, + 3719, 2791, 3827, + 3701, 2839, 3817, + 3679, 2899, 3803, + 3645, 2967, 3783, + 3597, 3043, 3757, + 3525, 3131, 3719, + 3403, 3225, 3661, + 3163, 3327, 3571, + 1971, 3435, 3413, + 0, 3549, 3047, + 0, 3667, 0, + 0, 3787, 0, + 0, 3911, 0, + 0, 4037, 0, + 3859, 2529, 3909, + 3859, 2529, 3909, + 3859, 2531, 3909, + 3859, 2531, 3909, + 3859, 2533, 3909, + 3859, 2533, 3909, + 3859, 2535, 3909, + 3859, 2539, 3909, + 3859, 2543, 3909, + 3857, 2547, 3909, + 3857, 2553, 3907, + 3855, 2561, 3907, + 3853, 2573, 3905, + 3851, 2587, 3905, + 3849, 2607, 3903, + 3845, 2629, 3899, + 3839, 2659, 3897, + 3833, 2697, 3891, + 3823, 2743, 3885, + 3811, 2797, 3875, + 3793, 2861, 3863, + 3767, 2935, 3847, + 3731, 3017, 3825, + 3677, 3109, 3791, + 3593, 3207, 3743, + 3451, 3313, 3669, + 3141, 3425, 3547, + 0, 3541, 3305, + 0, 3659, 2036, + 0, 3783, 0, + 0, 3907, 0, + 0, 4033, 0, + 3963, 2405, 3975, + 3963, 2405, 3975, + 3963, 2407, 3975, + 3963, 2407, 3975, + 3963, 2409, 3975, + 3963, 2411, 3975, + 3963, 2413, 3973, + 3961, 2417, 3973, + 3961, 2423, 3973, + 3961, 2429, 3973, + 3961, 2437, 3973, + 3959, 2447, 3971, + 3959, 2461, 3971, + 3957, 2481, 3969, + 3955, 2503, 3967, + 3951, 2533, 3965, + 3947, 2571, 3963, + 3941, 2615, 3959, + 3935, 2669, 3953, + 3923, 2733, 3945, + 3909, 2805, 3935, + 3891, 2887, 3921, + 3863, 2979, 3901, + 3823, 3077, 3873, + 3765, 3183, 3833, + 3671, 3293, 3773, + 3507, 3409, 3679, + 3111, 3529, 3513, + 0, 3651, 3101, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 4073, 2157, 4049, + 4073, 2157, 4049, + 4071, 2159, 4049, + 4071, 2161, 4049, + 4071, 2163, 4049, + 4071, 2167, 4049, + 4071, 2173, 4049, + 4071, 2179, 4049, + 4071, 2187, 4047, + 4071, 2197, 4047, + 4071, 2211, 4047, + 4069, 2229, 4047, + 4069, 2251, 4045, + 4067, 2281, 4045, + 4065, 2317, 4043, + 4063, 2361, 4041, + 4059, 2413, 4039, + 4055, 2475, 4035, + 4049, 2547, 4031, + 4041, 2629, 4025, + 4031, 2719, 4015, + 4015, 2815, 4003, + 3995, 2921, 3987, + 3967, 3031, 3965, + 3923, 3147, 3931, + 3861, 3265, 3885, + 3759, 3387, 3813, + 3573, 3511, 3693, + 3067, 3639, 3463, + 0, 3765, 2465, + 0, 3895, 0, + 0, 4025, 0, + 4095, 559, 4095, + 4095, 596, 4095, + 4095, 640, 4095, + 4095, 693, 4095, + 4095, 756, 4095, + 4095, 828, 4095, + 4095, 909, 4095, + 4095, 999, 4095, + 4095, 1097, 4095, + 4095, 1202, 4095, + 4095, 1313, 4095, + 4095, 1428, 4095, + 4095, 1547, 4095, + 4095, 1669, 4095, + 4095, 1794, 4095, + 4095, 1920, 4095, + 4095, 2049, 4095, + 4095, 2177, 4095, + 4095, 2307, 4095, + 4095, 2437, 4095, + 4095, 2567, 4095, + 4095, 2699, 4095, + 4095, 2831, 4081, + 4095, 2961, 4063, + 4075, 3093, 4037, + 4031, 3225, 4001, + 3963, 3357, 3945, + 3855, 3489, 3859, + 3649, 3621, 3711, + 3001, 3753, 3385, + 0, 3885, 0, + 0, 4017, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1079, 4095, + 4095, 1889, 4095, + 4095, 2229, 4095, + 4095, 2471, 4095, + 4095, 2671, 4095, + 4095, 2849, 4095, + 4095, 3011, 4095, + 4095, 3165, 4095, + 4095, 3313, 4077, + 4073, 3457, 4015, + 3957, 3597, 3915, + 3735, 3735, 3735, + 2891, 3871, 3255, + 0, 4007, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1549, 4095, + 4095, 2299, 4095, + 4095, 2631, 4095, + 4095, 2871, 4095, + 4095, 3069, 4095, + 4095, 3247, 4095, + 4095, 3409, 4095, + 4095, 3563, 4095, + 4067, 3709, 3981, + 3829, 3853, 3765, + 2689, 3993, 2989, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1862, 4095, + 4095, 2573, 4095, + 4095, 2901, 4095, + 4095, 3139, 4095, + 4095, 3337, 4095, + 4095, 3511, 4095, + 4095, 3673, 4095, + 4095, 3827, 4057, + 3929, 3975, 3801, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3351, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3335, 2925, 3763, + 3329, 2931, 3761, + 3319, 2939, 3757, + 3307, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3105, 3079, 3703, + 2977, 3127, 3681, + 2715, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3351, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3335, 2925, 3763, + 3329, 2931, 3761, + 3321, 2939, 3757, + 3307, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3105, 3079, 3703, + 2977, 3127, 3681, + 2717, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3351, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3337, 2925, 3763, + 3329, 2931, 3761, + 3321, 2939, 3757, + 3309, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3107, 3079, 3705, + 2979, 3127, 3681, + 2719, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3353, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3337, 2925, 3763, + 3329, 2931, 3761, + 3321, 2939, 3757, + 3309, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3107, 3079, 3705, + 2979, 3127, 3681, + 2721, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2907, 3767, + 3353, 2907, 3767, + 3351, 2909, 3767, + 3351, 2909, 3767, + 3349, 2913, 3765, + 3345, 2915, 3765, + 3343, 2919, 3763, + 3337, 2923, 3763, + 3331, 2931, 3761, + 3321, 2939, 3757, + 3309, 2951, 3755, + 3293, 2967, 3749, + 3269, 2985, 3743, + 3235, 3011, 3733, + 3185, 3041, 3721, + 3109, 3079, 3705, + 2981, 3127, 3681, + 2723, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3137, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3357, 2903, 3769, + 3357, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3767, + 3355, 2907, 3767, + 3353, 2907, 3767, + 3353, 2909, 3767, + 3351, 2909, 3767, + 3349, 2913, 3767, + 3347, 2915, 3765, + 3343, 2919, 3765, + 3337, 2923, 3763, + 3331, 2931, 3761, + 3323, 2939, 3757, + 3311, 2951, 3755, + 3293, 2967, 3749, + 3269, 2985, 3743, + 3235, 3011, 3733, + 3185, 3041, 3721, + 3109, 3079, 3705, + 2983, 3127, 3681, + 2725, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3137, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3357, 2903, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3355, 2905, 3769, + 3355, 2907, 3767, + 3353, 2909, 3767, + 3353, 2909, 3767, + 3351, 2911, 3767, + 3347, 2915, 3765, + 3343, 2919, 3765, + 3339, 2923, 3763, + 3333, 2931, 3761, + 3323, 2939, 3759, + 3311, 2951, 3755, + 3295, 2965, 3749, + 3271, 2985, 3743, + 3237, 3009, 3735, + 3187, 3041, 3721, + 3111, 3079, 3705, + 2985, 3127, 3681, + 2729, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3395, + 0, 3499, 3139, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3359, 2903, 3769, + 3359, 2903, 3769, + 3359, 2905, 3769, + 3359, 2905, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3357, 2907, 3769, + 3355, 2907, 3767, + 3353, 2909, 3767, + 3351, 2911, 3767, + 3349, 2915, 3765, + 3345, 2919, 3765, + 3341, 2923, 3763, + 3333, 2931, 3761, + 3325, 2939, 3759, + 3313, 2951, 3755, + 3295, 2965, 3751, + 3273, 2985, 3743, + 3239, 3009, 3735, + 3189, 3041, 3723, + 3113, 3079, 3705, + 2987, 3127, 3681, + 2735, 3181, 3647, + 372, 3247, 3599, + 0, 3323, 3523, + 0, 3407, 3395, + 0, 3499, 3139, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3361, 2903, 3769, + 3361, 2903, 3769, + 3361, 2903, 3769, + 3359, 2905, 3769, + 3359, 2905, 3769, + 3359, 2905, 3769, + 3359, 2907, 3769, + 3357, 2907, 3769, + 3355, 2909, 3767, + 3353, 2911, 3767, + 3351, 2915, 3767, + 3347, 2919, 3765, + 3343, 2923, 3763, + 3335, 2931, 3761, + 3327, 2939, 3759, + 3315, 2951, 3755, + 3297, 2965, 3751, + 3275, 2985, 3745, + 3241, 3009, 3735, + 3193, 3041, 3723, + 3117, 3079, 3705, + 2993, 3125, 3683, + 2743, 3181, 3649, + 994, 3247, 3599, + 0, 3323, 3523, + 0, 3407, 3397, + 0, 3499, 3141, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3363, 2903, 3771, + 3363, 2903, 3771, + 3363, 2903, 3771, + 3363, 2903, 3769, + 3361, 2905, 3769, + 3361, 2905, 3769, + 3361, 2907, 3769, + 3359, 2907, 3769, + 3357, 2909, 3769, + 3357, 2911, 3767, + 3353, 2915, 3767, + 3349, 2917, 3767, + 3345, 2923, 3765, + 3339, 2929, 3763, + 3329, 2939, 3759, + 3317, 2951, 3757, + 3301, 2965, 3751, + 3277, 2985, 3745, + 3245, 3009, 3735, + 3195, 3041, 3723, + 3121, 3079, 3707, + 2997, 3125, 3683, + 2753, 3181, 3649, + 1308, 3247, 3599, + 0, 3323, 3525, + 0, 3407, 3399, + 0, 3499, 3145, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3367, 2903, 3771, + 3367, 2903, 3771, + 3367, 2903, 3771, + 3365, 2903, 3771, + 3365, 2903, 3771, + 3365, 2905, 3771, + 3363, 2905, 3771, + 3363, 2907, 3769, + 3361, 2909, 3769, + 3359, 2911, 3769, + 3357, 2913, 3769, + 3353, 2917, 3767, + 3349, 2923, 3765, + 3341, 2929, 3763, + 3333, 2939, 3761, + 3321, 2949, 3757, + 3305, 2965, 3753, + 3281, 2985, 3745, + 3249, 3009, 3737, + 3201, 3041, 3725, + 3127, 3079, 3707, + 3005, 3125, 3685, + 2765, 3181, 3651, + 1540, 3247, 3601, + 0, 3321, 3525, + 0, 3407, 3401, + 0, 3499, 3147, + 0, 3599, 963, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3371, 2901, 3773, + 3371, 2903, 3773, + 3371, 2903, 3773, + 3371, 2903, 3773, + 3369, 2903, 3771, + 3369, 2905, 3771, + 3369, 2905, 3771, + 3367, 2907, 3771, + 3365, 2907, 3771, + 3363, 2911, 3771, + 3361, 2913, 3769, + 3357, 2917, 3769, + 3353, 2921, 3767, + 3347, 2929, 3765, + 3337, 2937, 3763, + 3325, 2949, 3759, + 3309, 2965, 3753, + 3287, 2983, 3747, + 3255, 3009, 3739, + 3207, 3039, 3725, + 3135, 3079, 3709, + 3015, 3125, 3685, + 2781, 3181, 3653, + 1735, 3247, 3603, + 0, 3321, 3527, + 0, 3405, 3403, + 0, 3499, 3153, + 0, 3599, 1337, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3377, 2901, 3773, + 3377, 2901, 3773, + 3377, 2901, 3773, + 3375, 2903, 3773, + 3375, 2903, 3773, + 3375, 2903, 3773, + 3375, 2905, 3773, + 3373, 2905, 3773, + 3371, 2907, 3773, + 3369, 2909, 3771, + 3367, 2913, 3771, + 3363, 2917, 3769, + 3359, 2921, 3769, + 3353, 2927, 3767, + 3345, 2937, 3763, + 3333, 2949, 3761, + 3317, 2963, 3755, + 3293, 2983, 3749, + 3261, 3007, 3739, + 3215, 3039, 3727, + 3143, 3077, 3711, + 3027, 3125, 3687, + 2801, 3181, 3655, + 1909, 3247, 3605, + 0, 3321, 3531, + 0, 3405, 3407, + 0, 3499, 3159, + 0, 3599, 1591, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3385, 2901, 3777, + 3385, 2901, 3775, + 3383, 2901, 3775, + 3383, 2901, 3775, + 3383, 2901, 3775, + 3383, 2903, 3775, + 3381, 2903, 3775, + 3381, 2905, 3775, + 3379, 2905, 3775, + 3377, 2909, 3773, + 3375, 2911, 3773, + 3371, 2915, 3771, + 3367, 2921, 3771, + 3361, 2927, 3769, + 3353, 2935, 3765, + 3341, 2947, 3763, + 3325, 2963, 3757, + 3303, 2983, 3751, + 3271, 3007, 3743, + 3225, 3039, 3731, + 3157, 3077, 3713, + 3043, 3123, 3691, + 2827, 3181, 3657, + 2071, 3245, 3609, + 0, 3321, 3535, + 0, 3405, 3411, + 0, 3499, 3167, + 0, 3599, 1797, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4055, 0, + 3395, 2899, 3779, + 3393, 2899, 3779, + 3393, 2899, 3779, + 3393, 2899, 3779, + 3393, 2901, 3779, + 3393, 2901, 3779, + 3391, 2901, 3779, + 3391, 2903, 3777, + 3389, 2905, 3777, + 3387, 2907, 3777, + 3385, 2909, 3775, + 3381, 2913, 3775, + 3377, 2919, 3773, + 3371, 2925, 3771, + 3363, 2935, 3769, + 3351, 2947, 3765, + 3337, 2961, 3761, + 3315, 2981, 3755, + 3285, 3005, 3745, + 3239, 3037, 3733, + 3173, 3075, 3717, + 3065, 3123, 3693, + 2861, 3179, 3661, + 2223, 3245, 3613, + 0, 3321, 3539, + 0, 3405, 3417, + 0, 3497, 3177, + 0, 3599, 1978, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4055, 0, + 3407, 2897, 3783, + 3407, 2897, 3783, + 3407, 2897, 3783, + 3407, 2897, 3783, + 3407, 2899, 3783, + 3405, 2899, 3783, + 3405, 2899, 3781, + 3403, 2901, 3781, + 3403, 2903, 3781, + 3401, 2905, 3781, + 3399, 2907, 3779, + 3395, 2911, 3779, + 3391, 2917, 3777, + 3385, 2923, 3775, + 3377, 2933, 3773, + 3365, 2945, 3769, + 3351, 2959, 3765, + 3331, 2979, 3757, + 3301, 3005, 3749, + 3257, 3035, 3737, + 3193, 3075, 3721, + 3091, 3121, 3699, + 2901, 3179, 3665, + 2369, 3245, 3617, + 0, 3319, 3545, + 0, 3405, 3425, + 0, 3497, 3191, + 0, 3597, 2143, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4053, 0, + 3423, 2893, 3787, + 3423, 2895, 3787, + 3423, 2895, 3787, + 3423, 2895, 3787, + 3423, 2895, 3787, + 3423, 2897, 3787, + 3421, 2897, 3787, + 3421, 2899, 3787, + 3419, 2899, 3787, + 3417, 2903, 3785, + 3415, 2905, 3785, + 3413, 2909, 3783, + 3409, 2915, 3783, + 3403, 2921, 3781, + 3395, 2931, 3777, + 3385, 2943, 3775, + 3369, 2957, 3769, + 3349, 2977, 3763, + 3321, 3003, 3755, + 3281, 3033, 3743, + 3221, 3073, 3727, + 3123, 3121, 3705, + 2951, 3177, 3671, + 2513, 3243, 3625, + 0, 3319, 3553, + 0, 3403, 3437, + 0, 3497, 3209, + 0, 3597, 2299, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4053, 0, + 3445, 2891, 3795, + 3445, 2891, 3795, + 3445, 2891, 3795, + 3445, 2891, 3795, + 3445, 2891, 3793, + 3443, 2893, 3793, + 3443, 2893, 3793, + 3443, 2895, 3793, + 3441, 2897, 3793, + 3439, 2899, 3793, + 3437, 2901, 3791, + 3435, 2905, 3791, + 3431, 2911, 3789, + 3425, 2917, 3787, + 3417, 2927, 3785, + 3407, 2939, 3781, + 3395, 2955, 3777, + 3375, 2975, 3771, + 3349, 2999, 3761, + 3311, 3031, 3751, + 3253, 3071, 3735, + 3165, 3119, 3713, + 3009, 3175, 3681, + 2653, 3241, 3635, + 0, 3317, 3565, + 0, 3403, 3451, + 0, 3495, 3233, + 0, 3597, 2447, + 0, 3703, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4053, 0, + 3473, 2885, 3803, + 3473, 2885, 3803, + 3473, 2887, 3803, + 3473, 2887, 3803, + 3471, 2887, 3803, + 3471, 2887, 3803, + 3471, 2889, 3803, + 3469, 2889, 3801, + 3469, 2891, 3801, + 3467, 2893, 3801, + 3465, 2897, 3801, + 3463, 2901, 3799, + 3459, 2907, 3797, + 3453, 2913, 3795, + 3447, 2923, 3793, + 3437, 2935, 3789, + 3425, 2951, 3785, + 3407, 2971, 3779, + 3383, 2995, 3771, + 3347, 3027, 3759, + 3295, 3067, 3745, + 3213, 3115, 3723, + 3077, 3173, 3691, + 2791, 3239, 3647, + 0, 3315, 3579, + 0, 3401, 3469, + 0, 3495, 3263, + 0, 3595, 2591, + 0, 3703, 0, + 0, 3815, 0, + 0, 3933, 0, + 0, 4053, 0, + 3507, 2879, 3815, + 3507, 2879, 3815, + 3507, 2879, 3815, + 3507, 2879, 3815, + 3507, 2881, 3813, + 3505, 2881, 3813, + 3505, 2883, 3813, + 3505, 2883, 3813, + 3503, 2885, 3813, + 3501, 2887, 3813, + 3499, 2891, 3811, + 3497, 2895, 3811, + 3493, 2901, 3809, + 3489, 2907, 3807, + 3483, 2917, 3805, + 3475, 2929, 3801, + 3463, 2945, 3797, + 3447, 2965, 3791, + 3423, 2991, 3783, + 3391, 3023, 3773, + 3345, 3063, 3757, + 3273, 3111, 3735, + 3155, 3169, 3707, + 2927, 3235, 3663, + 1989, 3313, 3597, + 0, 3399, 3493, + 0, 3493, 3299, + 0, 3593, 2733, + 0, 3701, 0, + 0, 3815, 0, + 0, 3931, 0, + 0, 4053, 0, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3547, 2873, 3829, + 3547, 2873, 3829, + 3547, 2875, 3827, + 3545, 2877, 3827, + 3545, 2879, 3827, + 3543, 2881, 3827, + 3541, 2887, 3825, + 3537, 2891, 3825, + 3533, 2899, 3823, + 3527, 2909, 3819, + 3519, 2921, 3817, + 3509, 2937, 3813, + 3493, 2957, 3807, + 3473, 2983, 3799, + 3445, 3017, 3789, + 3403, 3057, 3773, + 3341, 3105, 3753, + 3241, 3165, 3725, + 3061, 3231, 3683, + 2587, 3309, 3621, + 0, 3395, 3521, + 0, 3491, 3343, + 0, 3593, 2871, + 0, 3701, 0, + 0, 3813, 0, + 0, 3931, 0, + 0, 4051, 0, + 3599, 2857, 3849, + 3599, 2859, 3847, + 3599, 2859, 3847, + 3599, 2859, 3847, + 3599, 2859, 3847, + 3599, 2861, 3847, + 3599, 2861, 3847, + 3597, 2863, 3847, + 3597, 2865, 3847, + 3595, 2867, 3847, + 3593, 2871, 3845, + 3591, 2875, 3845, + 3589, 2879, 3843, + 3585, 2887, 3841, + 3579, 2897, 3839, + 3573, 2909, 3837, + 3563, 2927, 3833, + 3551, 2947, 3827, + 3533, 2975, 3819, + 3507, 3007, 3809, + 3471, 3049, 3795, + 3419, 3099, 3775, + 3337, 3157, 3749, + 3197, 3227, 3709, + 2897, 3305, 3651, + 0, 3391, 3559, + 0, 3487, 3397, + 0, 3589, 3007, + 0, 3699, 0, + 0, 3811, 0, + 0, 3929, 0, + 0, 4051, 0, + 3659, 2841, 3873, + 3659, 2841, 3873, + 3659, 2841, 3873, + 3659, 2843, 3873, + 3659, 2843, 3871, + 3659, 2843, 3871, + 3659, 2845, 3871, + 3657, 2847, 3871, + 3657, 2847, 3871, + 3655, 2851, 3871, + 3655, 2853, 3869, + 3653, 2859, 3869, + 3651, 2865, 3867, + 3647, 2871, 3867, + 3643, 2881, 3865, + 3637, 2895, 3861, + 3629, 2911, 3857, + 3617, 2933, 3853, + 3601, 2961, 3845, + 3579, 2995, 3835, + 3549, 3037, 3823, + 3505, 3089, 3805, + 3439, 3149, 3779, + 3331, 3219, 3741, + 3129, 3299, 3687, + 2499, 3387, 3603, + 0, 3483, 3459, + 0, 3587, 3143, + 0, 3695, 0, + 0, 3809, 0, + 0, 3929, 0, + 0, 4049, 0, + 3729, 2817, 3903, + 3729, 2819, 3903, + 3729, 2819, 3903, + 3729, 2819, 3903, + 3729, 2819, 3903, + 3729, 2821, 3903, + 3727, 2821, 3903, + 3727, 2823, 3901, + 3727, 2825, 3901, + 3725, 2827, 3901, + 3725, 2831, 3901, + 3723, 2835, 3899, + 3721, 2841, 3899, + 3719, 2849, 3897, + 3715, 2861, 3895, + 3709, 2875, 3893, + 3703, 2891, 3889, + 3693, 2915, 3883, + 3679, 2943, 3877, + 3661, 2979, 3869, + 3637, 3023, 3857, + 3601, 3075, 3839, + 3547, 3137, 3815, + 3463, 3209, 3781, + 3323, 3291, 3733, + 3017, 3379, 3657, + 0, 3477, 3531, + 0, 3581, 3279, + 0, 3693, 744, + 0, 3807, 0, + 0, 3927, 0, + 0, 4049, 0, + 3809, 2785, 3941, + 3809, 2785, 3941, + 3807, 2785, 3941, + 3807, 2785, 3941, + 3807, 2787, 3941, + 3807, 2787, 3941, + 3807, 2789, 3941, + 3807, 2789, 3939, + 3807, 2791, 3939, + 3805, 2795, 3939, + 3805, 2799, 3939, + 3803, 2803, 3937, + 3801, 2811, 3937, + 3799, 2819, 3935, + 3795, 2831, 3933, + 3791, 2845, 3931, + 3785, 2863, 3927, + 3777, 2887, 3923, + 3767, 2919, 3917, + 3753, 2955, 3909, + 3731, 3001, 3897, + 3703, 3057, 3883, + 3661, 3121, 3861, + 3597, 3195, 3831, + 3495, 3279, 3787, + 3311, 3371, 3721, + 2807, 3469, 3613, + 0, 3575, 3413, + 0, 3687, 2797, + 0, 3803, 0, + 0, 3923, 0, + 0, 4047, 0, + 3897, 2735, 3987, + 3895, 2735, 3987, + 3895, 2737, 3987, + 3895, 2737, 3987, + 3895, 2737, 3987, + 3895, 2739, 3987, + 3895, 2739, 3987, + 3895, 2741, 3987, + 3895, 2743, 3985, + 3893, 2747, 3985, + 3893, 2751, 3985, + 3891, 2757, 3985, + 3891, 2765, 3983, + 3889, 2773, 3983, + 3885, 2787, 3981, + 3883, 2803, 3979, + 3877, 2823, 3975, + 3871, 2849, 3971, + 3863, 2883, 3965, + 3851, 2923, 3959, + 3833, 2973, 3949, + 3811, 3031, 3935, + 3777, 3099, 3915, + 3729, 3177, 3889, + 3657, 3263, 3851, + 3535, 3357, 3793, + 3295, 3459, 3703, + 2103, 3567, 3545, + 0, 3681, 3179, + 0, 3799, 0, + 0, 3919, 0, + 0, 4043, 0, + 3993, 2661, 4041, + 3991, 2661, 4041, + 3991, 2661, 4041, + 3991, 2663, 4041, + 3991, 2663, 4041, + 3991, 2665, 4041, + 3991, 2665, 4041, + 3991, 2667, 4041, + 3991, 2671, 4041, + 3991, 2675, 4041, + 3989, 2679, 4041, + 3989, 2685, 4039, + 3987, 2695, 4039, + 3985, 2705, 4037, + 3983, 2719, 4037, + 3981, 2739, 4035, + 3977, 2763, 4031, + 3971, 2793, 4029, + 3965, 2829, 4023, + 3955, 2875, 4017, + 3943, 2929, 4009, + 3925, 2993, 3997, + 3899, 3067, 3979, + 3863, 3149, 3957, + 3809, 3241, 3923, + 3725, 3339, 3875, + 3583, 3445, 3801, + 3273, 3557, 3679, + 0, 3673, 3437, + 0, 3791, 2169, + 0, 3915, 0, + 0, 4039, 0, + 4095, 2537, 4095, + 4095, 2537, 4095, + 4095, 2537, 4095, + 4095, 2539, 4095, + 4095, 2539, 4095, + 4095, 2541, 4095, + 4095, 2543, 4095, + 4095, 2545, 4095, + 4095, 2549, 4095, + 4093, 2555, 4095, + 4093, 2561, 4095, + 4093, 2569, 4095, + 4091, 2579, 4095, + 4091, 2595, 4095, + 4089, 2613, 4095, + 4087, 2635, 4095, + 4083, 2665, 4095, + 4079, 2703, 4095, + 4073, 2747, 4091, + 4067, 2801, 4085, + 4055, 2865, 4077, + 4041, 2937, 4067, + 4023, 3019, 4053, + 3995, 3111, 4033, + 3955, 3209, 4005, + 3897, 3315, 3965, + 3803, 3425, 3907, + 3639, 3541, 3811, + 3243, 3661, 3645, + 0, 3783, 3235, + 0, 3907, 0, + 0, 4033, 0, + 4095, 2287, 4095, + 4095, 2289, 4095, + 4095, 2289, 4095, + 4095, 2291, 4095, + 4095, 2293, 4095, + 4095, 2295, 4095, + 4095, 2299, 4095, + 4095, 2305, 4095, + 4095, 2311, 4095, + 4095, 2319, 4095, + 4095, 2329, 4095, + 4095, 2343, 4095, + 4095, 2361, 4095, + 4095, 2383, 4095, + 4095, 2413, 4095, + 4095, 2449, 4095, + 4095, 2493, 4095, + 4095, 2545, 4095, + 4095, 2607, 4095, + 4095, 2679, 4095, + 4095, 2761, 4095, + 4095, 2851, 4095, + 4095, 2949, 4095, + 4095, 3053, 4095, + 4095, 3163, 4095, + 4057, 3279, 4065, + 3993, 3397, 4017, + 3891, 3519, 3945, + 3707, 3643, 3825, + 3199, 3771, 3595, + 0, 3899, 2597, + 0, 4027, 0, + 4095, 662, 4095, + 4095, 691, 4095, + 4095, 728, 4095, + 4095, 772, 4095, + 4095, 825, 4095, + 4095, 888, 4095, + 4095, 960, 4095, + 4095, 1041, 4095, + 4095, 1131, 4095, + 4095, 1229, 4095, + 4095, 1334, 4095, + 4095, 1445, 4095, + 4095, 1560, 4095, + 4095, 1679, 4095, + 4095, 1802, 4095, + 4095, 1926, 4095, + 4095, 2053, 4095, + 4095, 2181, 4095, + 4095, 2309, 4095, + 4095, 2439, 4095, + 4095, 2569, 4095, + 4095, 2699, 4095, + 4095, 2831, 4095, + 4095, 2963, 4095, + 4095, 3093, 4095, + 4095, 3225, 4095, + 4095, 3357, 4095, + 4095, 3489, 4077, + 3987, 3621, 3991, + 3783, 3753, 3843, + 3133, 3885, 3517, + 0, 4017, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1211, 4095, + 4095, 2021, 4095, + 4095, 2361, 4095, + 4095, 2603, 4095, + 4095, 2803, 4095, + 4095, 2981, 4095, + 4095, 3143, 4095, + 4095, 3297, 4095, + 4095, 3445, 4095, + 4095, 3589, 4095, + 4089, 3729, 4047, + 3867, 3867, 3867, + 3023, 4003, 3387, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1681, 4095, + 4095, 2431, 4095, + 4095, 2763, 4095, + 4095, 3003, 4095, + 4095, 3203, 4095, + 4095, 3379, 4095, + 4095, 3541, 4095, + 4095, 3695, 4095, + 4095, 3841, 4095, + 3961, 3985, 3897, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3483, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3475, 3047, 3897, + 3473, 3051, 3895, + 3467, 3057, 3895, + 3461, 3063, 3893, + 3451, 3071, 3889, + 3439, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3237, 3211, 3835, + 3109, 3259, 3813, + 2847, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3483, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3467, 3057, 3895, + 3461, 3063, 3893, + 3451, 3071, 3889, + 3439, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3237, 3211, 3835, + 3109, 3259, 3813, + 2849, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3483, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3467, 3057, 3895, + 3461, 3063, 3893, + 3453, 3071, 3889, + 3439, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3239, 3211, 3837, + 3109, 3259, 3813, + 2849, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3901, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3485, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3469, 3057, 3895, + 3461, 3063, 3893, + 3453, 3071, 3889, + 3441, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3239, 3211, 3837, + 3111, 3259, 3813, + 2851, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3485, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3469, 3057, 3895, + 3463, 3063, 3893, + 3453, 3071, 3889, + 3441, 3083, 3887, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3239, 3211, 3837, + 3111, 3259, 3813, + 2853, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3899, + 3485, 3039, 3899, + 3485, 3039, 3899, + 3483, 3041, 3899, + 3483, 3043, 3899, + 3481, 3045, 3899, + 3477, 3047, 3897, + 3475, 3051, 3897, + 3469, 3057, 3895, + 3463, 3063, 3893, + 3453, 3071, 3889, + 3441, 3083, 3887, + 3425, 3099, 3881, + 3401, 3117, 3875, + 3367, 3143, 3865, + 3317, 3173, 3853, + 3241, 3211, 3837, + 3113, 3259, 3813, + 2855, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3269, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3489, 3035, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3039, 3899, + 3485, 3039, 3899, + 3485, 3041, 3899, + 3483, 3041, 3899, + 3481, 3045, 3899, + 3479, 3047, 3897, + 3475, 3051, 3897, + 3471, 3057, 3895, + 3463, 3063, 3893, + 3455, 3071, 3891, + 3443, 3083, 3887, + 3425, 3099, 3881, + 3401, 3117, 3875, + 3367, 3143, 3867, + 3317, 3173, 3853, + 3241, 3211, 3837, + 3115, 3259, 3813, + 2857, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3527, + 0, 3631, 3269, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3489, 3035, 3901, + 3489, 3035, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3487, 3039, 3901, + 3487, 3039, 3899, + 3485, 3041, 3899, + 3485, 3041, 3899, + 3483, 3045, 3899, + 3479, 3047, 3897, + 3477, 3051, 3897, + 3471, 3055, 3895, + 3465, 3063, 3893, + 3455, 3071, 3891, + 3443, 3083, 3887, + 3427, 3099, 3881, + 3403, 3117, 3875, + 3369, 3143, 3867, + 3319, 3173, 3855, + 3243, 3211, 3837, + 3117, 3259, 3813, + 2861, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3527, + 0, 3631, 3271, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3491, 3035, 3901, + 3491, 3035, 3901, + 3491, 3035, 3901, + 3491, 3037, 3901, + 3491, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3039, 3901, + 3487, 3041, 3899, + 3485, 3041, 3899, + 3483, 3043, 3899, + 3481, 3047, 3899, + 3477, 3051, 3897, + 3473, 3055, 3895, + 3467, 3063, 3893, + 3457, 3071, 3891, + 3445, 3083, 3887, + 3427, 3097, 3883, + 3405, 3117, 3875, + 3371, 3141, 3867, + 3321, 3173, 3855, + 3245, 3211, 3837, + 3121, 3259, 3813, + 2867, 3315, 3779, + 504, 3379, 3731, + 0, 3455, 3655, + 0, 3539, 3527, + 0, 3631, 3271, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3493, 3035, 3901, + 3493, 3035, 3901, + 3493, 3035, 3901, + 3493, 3037, 3901, + 3493, 3037, 3901, + 3491, 3037, 3901, + 3491, 3037, 3901, + 3491, 3039, 3901, + 3489, 3039, 3901, + 3487, 3041, 3901, + 3485, 3043, 3899, + 3483, 3047, 3899, + 3479, 3051, 3897, + 3475, 3055, 3895, + 3469, 3063, 3893, + 3459, 3071, 3891, + 3447, 3083, 3887, + 3431, 3097, 3883, + 3407, 3117, 3877, + 3373, 3141, 3867, + 3325, 3173, 3855, + 3249, 3211, 3839, + 3125, 3259, 3815, + 2875, 3313, 3781, + 1125, 3379, 3731, + 0, 3455, 3655, + 0, 3539, 3529, + 0, 3631, 3273, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3495, 3035, 3903, + 3495, 3035, 3903, + 3495, 3035, 3903, + 3495, 3035, 3903, + 3495, 3037, 3903, + 3495, 3037, 3901, + 3493, 3037, 3901, + 3493, 3039, 3901, + 3491, 3039, 3901, + 3491, 3041, 3901, + 3489, 3043, 3901, + 3485, 3047, 3899, + 3481, 3051, 3899, + 3477, 3055, 3897, + 3471, 3061, 3895, + 3461, 3071, 3893, + 3449, 3083, 3889, + 3433, 3097, 3883, + 3409, 3117, 3877, + 3377, 3141, 3869, + 3327, 3173, 3855, + 3253, 3211, 3839, + 3129, 3257, 3815, + 2885, 3313, 3781, + 1440, 3379, 3733, + 0, 3455, 3657, + 0, 3539, 3531, + 0, 3631, 3277, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3499, 3035, 3903, + 3499, 3035, 3903, + 3499, 3035, 3903, + 3499, 3035, 3903, + 3497, 3035, 3903, + 3497, 3037, 3903, + 3497, 3037, 3903, + 3495, 3037, 3903, + 3495, 3039, 3903, + 3493, 3041, 3901, + 3491, 3043, 3901, + 3489, 3045, 3901, + 3485, 3049, 3899, + 3481, 3055, 3897, + 3475, 3061, 3895, + 3465, 3071, 3893, + 3453, 3081, 3889, + 3437, 3097, 3885, + 3413, 3117, 3877, + 3381, 3141, 3869, + 3333, 3173, 3857, + 3259, 3211, 3839, + 3137, 3257, 3817, + 2897, 3313, 3783, + 1672, 3379, 3733, + 0, 3455, 3657, + 0, 3539, 3533, + 0, 3631, 3281, + 0, 3731, 1095, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3503, 3033, 3905, + 3503, 3035, 3905, + 3503, 3035, 3905, + 3503, 3035, 3905, + 3503, 3035, 3905, + 3501, 3035, 3905, + 3501, 3037, 3903, + 3501, 3037, 3903, + 3499, 3039, 3903, + 3497, 3041, 3903, + 3495, 3043, 3903, + 3493, 3045, 3901, + 3489, 3049, 3901, + 3485, 3055, 3899, + 3479, 3061, 3897, + 3471, 3069, 3895, + 3459, 3081, 3891, + 3441, 3097, 3885, + 3419, 3115, 3879, + 3387, 3141, 3871, + 3339, 3171, 3859, + 3267, 3211, 3841, + 3147, 3257, 3817, + 2913, 3313, 3785, + 1867, 3379, 3735, + 0, 3453, 3661, + 0, 3537, 3535, + 0, 3631, 3285, + 0, 3731, 1469, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3509, 3033, 3907, + 3509, 3033, 3907, + 3509, 3033, 3905, + 3509, 3033, 3905, + 3507, 3035, 3905, + 3507, 3035, 3905, + 3507, 3035, 3905, + 3507, 3037, 3905, + 3505, 3037, 3905, + 3503, 3039, 3905, + 3501, 3041, 3903, + 3499, 3045, 3903, + 3495, 3049, 3901, + 3491, 3053, 3901, + 3485, 3061, 3899, + 3477, 3069, 3895, + 3465, 3081, 3893, + 3449, 3095, 3887, + 3425, 3115, 3881, + 3393, 3139, 3873, + 3347, 3171, 3859, + 3275, 3209, 3843, + 3159, 3257, 3819, + 2933, 3313, 3787, + 2041, 3379, 3737, + 0, 3453, 3663, + 0, 3537, 3539, + 0, 3631, 3291, + 0, 3731, 1724, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3517, 3033, 3909, + 3517, 3033, 3909, + 3517, 3033, 3909, + 3515, 3033, 3909, + 3515, 3033, 3907, + 3515, 3033, 3907, + 3515, 3035, 3907, + 3513, 3035, 3907, + 3513, 3037, 3907, + 3511, 3039, 3907, + 3509, 3041, 3905, + 3507, 3043, 3905, + 3503, 3047, 3905, + 3499, 3053, 3903, + 3493, 3059, 3901, + 3485, 3067, 3897, + 3473, 3079, 3895, + 3457, 3095, 3889, + 3435, 3115, 3883, + 3403, 3139, 3875, + 3357, 3171, 3863, + 3289, 3209, 3845, + 3175, 3257, 3823, + 2959, 3313, 3789, + 2203, 3377, 3741, + 0, 3453, 3667, + 0, 3537, 3543, + 0, 3631, 3299, + 0, 3731, 1929, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3527, 3031, 3911, + 3527, 3031, 3911, + 3527, 3031, 3911, + 3525, 3031, 3911, + 3525, 3031, 3911, + 3525, 3033, 3911, + 3525, 3033, 3911, + 3523, 3033, 3911, + 3523, 3035, 3909, + 3521, 3037, 3909, + 3519, 3039, 3909, + 3517, 3041, 3907, + 3513, 3045, 3907, + 3509, 3051, 3905, + 3503, 3057, 3903, + 3495, 3067, 3901, + 3483, 3079, 3897, + 3469, 3093, 3893, + 3447, 3113, 3887, + 3417, 3137, 3877, + 3371, 3169, 3865, + 3305, 3207, 3849, + 3197, 3255, 3825, + 2993, 3311, 3793, + 2355, 3377, 3745, + 0, 3453, 3671, + 0, 3537, 3549, + 0, 3629, 3311, + 0, 3731, 2109, + 0, 3837, 0, + 0, 3949, 0, + 0, 4065, 0, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3031, 3915, + 3537, 3031, 3915, + 3537, 3031, 3913, + 3535, 3033, 3913, + 3535, 3035, 3913, + 3533, 3037, 3913, + 3531, 3039, 3911, + 3527, 3043, 3911, + 3523, 3049, 3909, + 3517, 3055, 3907, + 3509, 3065, 3905, + 3499, 3077, 3901, + 3483, 3091, 3897, + 3463, 3111, 3891, + 3433, 3137, 3881, + 3389, 3167, 3869, + 3325, 3207, 3853, + 3223, 3253, 3831, + 3033, 3311, 3797, + 2501, 3377, 3751, + 0, 3451, 3677, + 0, 3537, 3559, + 0, 3629, 3325, + 0, 3729, 2275, + 0, 3837, 0, + 0, 3949, 0, + 0, 4065, 0, + 3557, 3025, 3919, + 3557, 3027, 3919, + 3555, 3027, 3919, + 3555, 3027, 3919, + 3555, 3027, 3919, + 3555, 3027, 3919, + 3555, 3029, 3919, + 3553, 3029, 3919, + 3553, 3031, 3919, + 3551, 3033, 3919, + 3549, 3035, 3917, + 3547, 3037, 3917, + 3545, 3041, 3915, + 3541, 3047, 3915, + 3535, 3053, 3913, + 3527, 3063, 3909, + 3517, 3075, 3907, + 3501, 3089, 3901, + 3483, 3109, 3895, + 3453, 3135, 3887, + 3413, 3165, 3875, + 3353, 3205, 3859, + 3255, 3253, 3837, + 3083, 3309, 3805, + 2645, 3375, 3757, + 0, 3451, 3685, + 0, 3535, 3569, + 0, 3629, 3343, + 0, 3729, 2431, + 0, 3837, 0, + 0, 3949, 0, + 0, 4065, 0, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3025, 3925, + 3575, 3025, 3925, + 3575, 3027, 3925, + 3573, 3029, 3925, + 3571, 3031, 3925, + 3569, 3033, 3923, + 3567, 3037, 3923, + 3563, 3043, 3921, + 3557, 3049, 3919, + 3549, 3059, 3917, + 3539, 3071, 3913, + 3527, 3087, 3909, + 3507, 3107, 3903, + 3481, 3131, 3893, + 3443, 3163, 3883, + 3385, 3203, 3867, + 3297, 3251, 3845, + 3141, 3307, 3813, + 2785, 3373, 3767, + 0, 3449, 3697, + 0, 3535, 3583, + 0, 3627, 3365, + 0, 3729, 2579, + 0, 3835, 0, + 0, 3949, 0, + 0, 4065, 0, + 3605, 3017, 3935, + 3605, 3017, 3935, + 3605, 3017, 3935, + 3605, 3019, 3935, + 3605, 3019, 3935, + 3603, 3019, 3935, + 3603, 3019, 3935, + 3603, 3021, 3935, + 3601, 3023, 3933, + 3601, 3023, 3933, + 3599, 3027, 3933, + 3597, 3029, 3933, + 3595, 3033, 3931, + 3591, 3039, 3929, + 3585, 3045, 3927, + 3579, 3055, 3925, + 3569, 3067, 3923, + 3557, 3083, 3917, + 3539, 3103, 3911, + 3515, 3127, 3903, + 3479, 3159, 3891, + 3427, 3199, 3877, + 3347, 3247, 3855, + 3209, 3305, 3823, + 2923, 3371, 3779, + 0, 3447, 3711, + 0, 3533, 3601, + 0, 3627, 3395, + 0, 3727, 2723, + 0, 3835, 0, + 0, 3947, 0, + 0, 4065, 0, + 3639, 3011, 3947, + 3639, 3011, 3947, + 3639, 3011, 3947, + 3639, 3011, 3947, + 3639, 3013, 3947, + 3639, 3013, 3947, + 3637, 3013, 3945, + 3637, 3015, 3945, + 3637, 3015, 3945, + 3635, 3017, 3945, + 3633, 3019, 3945, + 3631, 3023, 3943, + 3629, 3027, 3943, + 3625, 3033, 3941, + 3621, 3039, 3939, + 3615, 3049, 3937, + 3607, 3061, 3933, + 3595, 3077, 3929, + 3579, 3097, 3923, + 3555, 3123, 3915, + 3523, 3155, 3905, + 3477, 3195, 3889, + 3405, 3243, 3869, + 3287, 3301, 3839, + 3059, 3369, 3795, + 2121, 3445, 3729, + 0, 3531, 3625, + 0, 3625, 3431, + 0, 3727, 2865, + 0, 3833, 0, + 0, 3947, 0, + 0, 4065, 0, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3679, 3005, 3961, + 3679, 3005, 3961, + 3679, 3007, 3961, + 3677, 3009, 3959, + 3677, 3011, 3959, + 3675, 3015, 3959, + 3673, 3019, 3957, + 3669, 3023, 3957, + 3665, 3031, 3955, + 3659, 3041, 3953, + 3651, 3053, 3949, + 3641, 3069, 3945, + 3625, 3089, 3939, + 3605, 3115, 3931, + 3577, 3149, 3921, + 3535, 3189, 3905, + 3473, 3237, 3885, + 3373, 3297, 3857, + 3195, 3365, 3815, + 2719, 3441, 3753, + 0, 3527, 3655, + 0, 3623, 3475, + 0, 3725, 3003, + 0, 3833, 0, + 0, 3945, 0, + 0, 4063, 0, + 3731, 2989, 3981, + 3731, 2991, 3981, + 3731, 2991, 3981, + 3731, 2991, 3981, + 3731, 2991, 3979, + 3731, 2991, 3979, + 3731, 2993, 3979, + 3731, 2993, 3979, + 3729, 2995, 3979, + 3729, 2997, 3979, + 3727, 2999, 3979, + 3725, 3003, 3977, + 3723, 3007, 3977, + 3721, 3013, 3975, + 3717, 3019, 3973, + 3713, 3029, 3971, + 3705, 3041, 3969, + 3695, 3059, 3965, + 3683, 3079, 3959, + 3665, 3107, 3951, + 3639, 3139, 3941, + 3603, 3181, 3927, + 3551, 3231, 3907, + 3469, 3289, 3881, + 3329, 3359, 3841, + 3029, 3437, 3783, + 0, 3523, 3691, + 0, 3619, 3529, + 0, 3721, 3139, + 0, 3831, 0, + 0, 3945, 0, + 0, 4061, 0, + 3791, 2973, 4005, + 3791, 2973, 4005, + 3791, 2973, 4005, + 3791, 2973, 4005, + 3791, 2975, 4005, + 3791, 2975, 4005, + 3791, 2975, 4003, + 3791, 2977, 4003, + 3789, 2979, 4003, + 3789, 2981, 4003, + 3787, 2983, 4003, + 3787, 2985, 4001, + 3785, 2991, 4001, + 3783, 2997, 3999, + 3779, 3003, 3999, + 3775, 3013, 3997, + 3769, 3027, 3993, + 3761, 3043, 3989, + 3749, 3065, 3985, + 3733, 3093, 3977, + 3713, 3127, 3967, + 3681, 3169, 3955, + 3637, 3221, 3937, + 3571, 3281, 3911, + 3463, 3351, 3873, + 3261, 3431, 3819, + 2631, 3519, 3735, + 0, 3615, 3591, + 0, 3719, 3275, + 0, 3827, 0, + 0, 3943, 0, + 0, 4061, 0, + 3861, 2949, 4035, + 3861, 2949, 4035, + 3861, 2951, 4035, + 3861, 2951, 4035, + 3861, 2951, 4035, + 3861, 2951, 4035, + 3861, 2953, 4035, + 3861, 2953, 4035, + 3859, 2955, 4035, + 3859, 2957, 4033, + 3859, 2959, 4033, + 3857, 2963, 4033, + 3855, 2967, 4031, + 3853, 2973, 4031, + 3851, 2981, 4029, + 3847, 2993, 4027, + 3841, 3007, 4025, + 3835, 3023, 4021, + 3825, 3047, 4017, + 3811, 3075, 4009, + 3793, 3111, 4001, + 3769, 3155, 3989, + 3733, 3207, 3971, + 3679, 3269, 3947, + 3595, 3341, 3915, + 3455, 3423, 3865, + 3149, 3511, 3789, + 0, 3609, 3663, + 0, 3713, 3411, + 0, 3825, 876, + 0, 3939, 0, + 0, 4059, 0, + 3941, 2917, 4073, + 3941, 2917, 4073, + 3941, 2917, 4073, + 3941, 2917, 4073, + 3939, 2917, 4073, + 3939, 2919, 4073, + 3939, 2919, 4073, + 3939, 2921, 4073, + 3939, 2921, 4071, + 3939, 2925, 4071, + 3937, 2927, 4071, + 3937, 2931, 4071, + 3935, 2935, 4069, + 3933, 2943, 4069, + 3931, 2951, 4067, + 3927, 2963, 4065, + 3923, 2977, 4063, + 3917, 2995, 4059, + 3909, 3019, 4055, + 3899, 3051, 4049, + 3885, 3087, 4041, + 3863, 3133, 4031, + 3835, 3189, 4015, + 3793, 3253, 3993, + 3729, 3327, 3963, + 3627, 3411, 3919, + 3443, 3503, 3853, + 2939, 3601, 3745, + 0, 3707, 3545, + 0, 3819, 2929, + 0, 3935, 0, + 0, 4055, 0, + 4029, 2867, 4095, + 4029, 2867, 4095, + 4029, 2867, 4095, + 4029, 2869, 4095, + 4027, 2869, 4095, + 4027, 2869, 4095, + 4027, 2871, 4095, + 4027, 2871, 4095, + 4027, 2873, 4095, + 4027, 2877, 4095, + 4025, 2879, 4095, + 4025, 2883, 4095, + 4025, 2889, 4095, + 4023, 2897, 4095, + 4021, 2905, 4095, + 4019, 2919, 4095, + 4015, 2935, 4095, + 4009, 2955, 4095, + 4003, 2981, 4095, + 3995, 3015, 4095, + 3983, 3055, 4091, + 3965, 3105, 4081, + 3943, 3163, 4067, + 3909, 3231, 4047, + 3861, 3309, 4021, + 3789, 3395, 3983, + 3667, 3489, 3925, + 3427, 3591, 3835, + 2235, 3699, 3677, + 0, 3813, 3313, + 0, 3931, 0, + 0, 4051, 0, + 4095, 2793, 4095, + 4095, 2793, 4095, + 4095, 2793, 4095, + 4095, 2793, 4095, + 4095, 2795, 4095, + 4095, 2795, 4095, + 4095, 2797, 4095, + 4095, 2797, 4095, + 4095, 2799, 4095, + 4095, 2803, 4095, + 4095, 2807, 4095, + 4095, 2811, 4095, + 4095, 2817, 4095, + 4095, 2827, 4095, + 4095, 2837, 4095, + 4095, 2851, 4095, + 4095, 2871, 4095, + 4095, 2895, 4095, + 4095, 2925, 4095, + 4095, 2961, 4095, + 4087, 3007, 4095, + 4075, 3061, 4095, + 4057, 3125, 4095, + 4031, 3199, 4095, + 3995, 3281, 4089, + 3941, 3373, 4055, + 3857, 3471, 4007, + 3715, 3577, 3933, + 3407, 3689, 3811, + 0, 3805, 3569, + 0, 3925, 2301, + 0, 4047, 0, + 4095, 2667, 4095, + 4095, 2669, 4095, + 4095, 2669, 4095, + 4095, 2669, 4095, + 4095, 2671, 4095, + 4095, 2671, 4095, + 4095, 2673, 4095, + 4095, 2675, 4095, + 4095, 2677, 4095, + 4095, 2681, 4095, + 4095, 2687, 4095, + 4095, 2693, 4095, + 4095, 2701, 4095, + 4095, 2711, 4095, + 4095, 2727, 4095, + 4095, 2745, 4095, + 4095, 2767, 4095, + 4095, 2797, 4095, + 4095, 2835, 4095, + 4095, 2879, 4095, + 4095, 2933, 4095, + 4095, 2997, 4095, + 4095, 3069, 4095, + 4095, 3151, 4095, + 4095, 3243, 4095, + 4087, 3341, 4095, + 4029, 3447, 4095, + 3935, 3557, 4039, + 3771, 3673, 3945, + 3375, 3793, 3777, + 0, 3915, 3367, + 0, 4039, 0, + 4095, 2419, 4095, + 4095, 2421, 4095, + 4095, 2421, 4095, + 4095, 2421, 4095, + 4095, 2423, 4095, + 4095, 2425, 4095, + 4095, 2429, 4095, + 4095, 2431, 4095, + 4095, 2437, 4095, + 4095, 2443, 4095, + 4095, 2451, 4095, + 4095, 2461, 4095, + 4095, 2475, 4095, + 4095, 2493, 4095, + 4095, 2515, 4095, + 4095, 2545, 4095, + 4095, 2581, 4095, + 4095, 2625, 4095, + 4095, 2677, 4095, + 4095, 2739, 4095, + 4095, 2811, 4095, + 4095, 2893, 4095, + 4095, 2983, 4095, + 4095, 3081, 4095, + 4095, 3185, 4095, + 4095, 3295, 4095, + 4095, 3411, 4095, + 4095, 3529, 4095, + 4023, 3651, 4077, + 3839, 3777, 3959, + 3331, 3903, 3727, + 0, 4031, 2729, + 4095, 771, 4095, + 4095, 795, 4095, + 4095, 824, 4095, + 4095, 860, 4095, + 4095, 904, 4095, + 4095, 957, 4095, + 4095, 1020, 4095, + 4095, 1092, 4095, + 4095, 1173, 4095, + 4095, 1263, 4095, + 4095, 1361, 4095, + 4095, 1466, 4095, + 4095, 1577, 4095, + 4095, 1692, 4095, + 4095, 1811, 4095, + 4095, 1934, 4095, + 4095, 2059, 4095, + 4095, 2185, 4095, + 4095, 2313, 4095, + 4095, 2441, 4095, + 4095, 2571, 4095, + 4095, 2701, 4095, + 4095, 2831, 4095, + 4095, 2963, 4095, + 4095, 3095, 4095, + 4095, 3225, 4095, + 4095, 3357, 4095, + 4095, 3489, 4095, + 4095, 3621, 4095, + 4095, 3753, 4095, + 3915, 3885, 3977, + 3265, 4017, 3649, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1343, 4095, + 4095, 2153, 4095, + 4095, 2493, 4095, + 4095, 2735, 4095, + 4095, 2935, 4095, + 4095, 3113, 4095, + 4095, 3275, 4095, + 4095, 3429, 4095, + 4095, 3577, 4095, + 4095, 3721, 4095, + 4095, 3861, 4095, + 3999, 3999, 3999 +] + } +} diff --git a/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-grade_inv-Log2-48nits_32_LUT.azasset b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-grade_inv-Log2-48nits_32_LUT.azasset new file mode 100644 index 0000000000..a91e9d0c1a --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/test-grade_inv-Log2-48nits_32_LUT.azasset @@ -0,0 +1,32780 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [ + 0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [ + 0, 0, 0, + 0, 0, 0, + 0, 15, 0, + 0, 104, 0, + 0, 201, 0, + 0, 305, 0, + 0, 415, 0, + 0, 530, 0, + 0, 649, 0, + 0, 771, 0, + 0, 895, 0, + 0, 1022, 0, + 0, 1149, 0, + 0, 1278, 0, + 0, 1408, 0, + 0, 1538, 0, + 0, 1668, 0, + 0, 1799, 0, + 0, 1931, 0, + 0, 2062, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2457, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 130, 0, 20, + 28, 0, 0, + 0, 33, 0, + 0, 119, 0, + 0, 213, 0, + 0, 315, 0, + 0, 423, 0, + 0, 536, 0, + 0, 654, 0, + 0, 775, 0, + 0, 898, 0, + 0, 1024, 0, + 0, 1151, 0, + 0, 1279, 0, + 0, 1408, 0, + 0, 1538, 0, + 0, 1669, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2062, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 342, 0, 170, + 280, 0, 102, + 183, 56, 0, + 7, 139, 0, + 0, 229, 0, + 0, 328, 0, + 0, 433, 0, + 0, 544, 0, + 0, 660, 0, + 0, 779, 0, + 0, 902, 0, + 0, 1026, 0, + 0, 1153, 0, + 0, 1281, 0, + 0, 1410, 0, + 0, 1539, 0, + 0, 1670, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 526, 0, 315, + 486, 18, 266, + 426, 86, 192, + 331, 163, 68, + 163, 250, 0, + 0, 344, 0, + 0, 446, 0, + 0, 555, 0, + 0, 668, 0, + 0, 785, 0, + 0, 906, 0, + 0, 1030, 0, + 0, 1156, 0, + 0, 1283, 0, + 0, 1411, 0, + 0, 1540, 0, + 0, 1670, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 693, 8, 457, + 666, 60, 422, + 626, 123, 370, + 568, 195, 290, + 475, 276, 155, + 312, 366, 0, + 0, 463, 0, + 0, 568, 0, + 0, 678, 0, + 0, 794, 0, + 0, 913, 0, + 0, 1035, 0, + 0, 1159, 0, + 0, 1285, 0, + 0, 1413, 0, + 0, 1542, 0, + 0, 1672, 0, + 0, 1802, 0, + 0, 1932, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 850, 65, 596, + 831, 112, 570, + 804, 168, 534, + 765, 233, 479, + 707, 308, 395, + 616, 393, 250, + 457, 485, 0, + 82, 585, 0, + 0, 692, 0, + 0, 804, 0, + 0, 921, 0, + 0, 1041, 0, + 0, 1164, 0, + 0, 1289, 0, + 0, 1416, 0, + 0, 1544, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 999, 131, 733, + 986, 172, 714, + 967, 222, 688, + 940, 280, 650, + 901, 348, 594, + 844, 426, 505, + 755, 513, 352, + 598, 608, 3, + 235, 710, 0, + 0, 818, 0, + 0, 932, 0, + 0, 1049, 0, + 0, 1170, 0, + 0, 1294, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1675, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1144, 207, 869, + 1134, 242, 855, + 1121, 285, 836, + 1102, 336, 809, + 1075, 397, 770, + 1037, 468, 712, + 980, 547, 621, + 892, 636, 461, + 737, 732, 82, + 382, 836, 0, + 0, 946, 0, + 0, 1060, 0, + 0, 1179, 0, + 0, 1300, 0, + 0, 1424, 0, + 0, 1550, 0, + 0, 1678, 0, + 0, 1807, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1286, 293, 1004, + 1278, 322, 994, + 1268, 358, 980, + 1255, 402, 960, + 1236, 455, 932, + 1210, 518, 893, + 1172, 590, 833, + 1115, 671, 740, + 1027, 761, 574, + 874, 859, 170, + 525, 964, 0, + 0, 1074, 0, + 0, 1190, 0, + 0, 1309, 0, + 0, 1431, 0, + 0, 1555, 0, + 0, 1682, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1424, 386, 1138, + 1419, 410, 1131, + 1412, 440, 1120, + 1402, 477, 1106, + 1389, 523, 1086, + 1370, 577, 1058, + 1343, 641, 1018, + 1306, 714, 958, + 1250, 797, 862, + 1162, 888, 692, + 1010, 987, 267, + 665, 1093, 0, + 0, 1204, 0, + 0, 1320, 0, + 0, 1439, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1562, 487, 1272, + 1558, 506, 1266, + 1552, 531, 1258, + 1545, 561, 1248, + 1535, 599, 1234, + 1522, 646, 1213, + 1503, 701, 1185, + 1477, 766, 1144, + 1439, 840, 1084, + 1383, 924, 987, + 1296, 1016, 813, + 1145, 1116, 370, + 802, 1222, 0, + 0, 1334, 0, + 0, 1450, 0, + 0, 1570, 0, + 0, 1693, 0, + 0, 1818, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2331, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1697, 595, 1405, + 1695, 610, 1401, + 1691, 629, 1395, + 1685, 654, 1387, + 1678, 685, 1377, + 1668, 724, 1362, + 1655, 771, 1342, + 1636, 827, 1314, + 1610, 893, 1273, + 1572, 968, 1211, + 1517, 1053, 1113, + 1430, 1145, 937, + 1279, 1246, 479, + 939, 1352, 0, + 0, 1465, 0, + 0, 1581, 0, + 0, 1701, 0, + 0, 1824, 0, + 0, 1950, 0, + 0, 2076, 0, + 0, 2204, 0, + 0, 2334, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1832, 707, 1538, + 1830, 719, 1535, + 1827, 735, 1531, + 1823, 755, 1525, + 1818, 780, 1517, + 1811, 811, 1507, + 1801, 851, 1492, + 1788, 898, 1472, + 1769, 955, 1443, + 1743, 1021, 1402, + 1705, 1097, 1340, + 1650, 1182, 1241, + 1563, 1275, 1062, + 1412, 1376, 594, + 1074, 1483, 0, + 0, 1596, 0, + 0, 1712, 0, + 0, 1833, 0, + 0, 1956, 0, + 0, 2081, 0, + 0, 2208, 0, + 0, 2336, 0, + 0, 2466, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1966, 824, 1671, + 1965, 834, 1668, + 1963, 846, 1665, + 1960, 861, 1661, + 1956, 881, 1655, + 1951, 907, 1647, + 1943, 939, 1637, + 1934, 978, 1622, + 1920, 1026, 1602, + 1902, 1084, 1573, + 1875, 1150, 1531, + 1838, 1227, 1469, + 1782, 1312, 1370, + 1696, 1406, 1190, + 1545, 1507, 712, + 1209, 1614, 0, + 0, 1727, 0, + 0, 1844, 0, + 0, 1964, 0, + 0, 2088, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2100, 945, 1803, + 2099, 952, 1802, + 2097, 961, 1799, + 2095, 973, 1796, + 2092, 989, 1792, + 2088, 1009, 1786, + 2083, 1035, 1778, + 2076, 1067, 1768, + 2066, 1107, 1753, + 2053, 1156, 1732, + 2034, 1213, 1703, + 2008, 1280, 1662, + 1970, 1357, 1599, + 1915, 1442, 1499, + 1828, 1536, 1318, + 1678, 1638, 834, + 1342, 1745, 0, + 0, 1858, 0, + 0, 1976, 0, + 0, 2096, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2730, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2233, 1068, 1936, + 2232, 1074, 1935, + 2231, 1081, 1933, + 2230, 1090, 1930, + 2227, 1102, 1927, + 2225, 1118, 1923, + 2221, 1139, 1917, + 2215, 1164, 1909, + 2208, 1197, 1899, + 2198, 1237, 1884, + 2185, 1286, 1863, + 2166, 1343, 1834, + 2140, 1411, 1793, + 2103, 1488, 1730, + 2047, 1573, 1629, + 1961, 1668, 1447, + 1811, 1769, 958, + 1476, 1877, 0, + 0, 1990, 0, + 0, 2107, 0, + 0, 2228, 0, + 0, 2351, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2366, 1194, 2068, + 2366, 1198, 2067, + 2365, 1203, 2066, + 2364, 1210, 2064, + 2362, 1220, 2062, + 2360, 1232, 2059, + 2357, 1248, 2054, + 2353, 1268, 2049, + 2348, 1294, 2041, + 2340, 1327, 2030, + 2331, 1367, 2015, + 2317, 1416, 1995, + 2299, 1474, 1966, + 2273, 1542, 1924, + 2235, 1619, 1861, + 2180, 1705, 1760, + 2093, 1799, 1577, + 1944, 1901, 1084, + 1609, 2009, 0, + 0, 2122, 0, + 0, 2239, 0, + 0, 2360, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2499, 1321, 2200, + 2499, 1324, 2200, + 2498, 1328, 2199, + 2497, 1333, 2197, + 2496, 1340, 2196, + 2494, 1350, 2193, + 2492, 1362, 2190, + 2489, 1378, 2186, + 2485, 1399, 2180, + 2480, 1425, 2172, + 2473, 1458, 2161, + 2463, 1498, 2147, + 2450, 1547, 2126, + 2431, 1605, 2097, + 2405, 1673, 2055, + 2367, 1750, 1992, + 2312, 1836, 1891, + 2226, 1931, 1708, + 2076, 2032, 1211, + 1742, 2140, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2632, 1449, 2333, + 2631, 1451, 2332, + 2631, 1454, 2331, + 2630, 1458, 2330, + 2629, 1464, 2329, + 2628, 1471, 2327, + 2626, 1481, 2325, + 2624, 1493, 2322, + 2621, 1509, 2318, + 2617, 1530, 2312, + 2612, 1556, 2304, + 2605, 1589, 2293, + 2595, 1629, 2278, + 2582, 1678, 2258, + 2563, 1736, 2229, + 2537, 1804, 2187, + 2500, 1881, 2123, + 2444, 1968, 2023, + 2358, 2062, 1839, + 2208, 2164, 1340, + 1874, 2272, 0, + 0, 2385, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1578, 2465, + 2764, 1580, 2465, + 2763, 1582, 2464, + 2763, 1585, 2463, + 2762, 1589, 2462, + 2761, 1595, 2461, + 2760, 1602, 2459, + 2759, 1612, 2457, + 2756, 1624, 2454, + 2753, 1640, 2449, + 2750, 1661, 2444, + 2744, 1687, 2436, + 2737, 1720, 2425, + 2727, 1760, 2410, + 2714, 1809, 2389, + 2695, 1868, 2360, + 2669, 1936, 2318, + 2632, 2013, 2255, + 2577, 2099, 2154, + 2490, 2194, 1970, + 2341, 2296, 1469, + 2007, 2404, 0, + 0, 2517, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1708, 2597, + 2896, 1709, 2597, + 2896, 1711, 2596, + 2896, 1713, 2596, + 2895, 1716, 2595, + 2894, 1721, 2594, + 2893, 1726, 2593, + 2892, 1733, 2591, + 2891, 1743, 2589, + 2889, 1755, 2586, + 2886, 1771, 2581, + 2882, 1792, 2575, + 2876, 1818, 2568, + 2869, 1851, 2557, + 2859, 1892, 2542, + 2846, 1941, 2521, + 2828, 1999, 2492, + 2801, 2067, 2450, + 2764, 2145, 2387, + 2709, 2231, 2286, + 2622, 2326, 2101, + 2473, 2428, 1599, + 2139, 2536, 0, + 0, 2649, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1838, 2729, + 3029, 1839, 2729, + 3028, 1841, 2729, + 3028, 1842, 2728, + 3028, 1845, 2728, + 3027, 1848, 2727, + 3027, 1852, 2726, + 3026, 1858, 2725, + 3024, 1865, 2723, + 3023, 1874, 2721, + 3021, 1887, 2717, + 3018, 1903, 2713, + 3014, 1924, 2707, + 3009, 1950, 2699, + 3001, 1983, 2689, + 2992, 2024, 2674, + 2978, 2073, 2653, + 2960, 2131, 2624, + 2934, 2199, 2582, + 2896, 2277, 2519, + 2841, 2363, 2418, + 2755, 2458, 2233, + 2605, 2560, 1730, + 2272, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3143, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1969, 2861, + 3161, 1970, 2861, + 3161, 1971, 2861, + 3160, 1972, 2861, + 3160, 1974, 2860, + 3160, 1976, 2860, + 3159, 1980, 2859, + 3159, 1984, 2858, + 3158, 1989, 2857, + 3157, 1996, 2855, + 3155, 2006, 2853, + 3153, 2018, 2849, + 3150, 2035, 2845, + 3146, 2055, 2839, + 3141, 2082, 2831, + 3134, 2115, 2821, + 3124, 2155, 2806, + 3110, 2205, 2785, + 3092, 2263, 2756, + 3066, 2331, 2714, + 3028, 2409, 2651, + 2973, 2495, 2549, + 2887, 2590, 2365, + 2737, 2692, 1861, + 2404, 2800, 0, + 0, 2913, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2100, 2994, + 3293, 2101, 2993, + 3293, 2102, 2993, + 3293, 2103, 2993, + 3293, 2104, 2993, + 3292, 2106, 2992, + 3292, 2108, 2992, + 3291, 2111, 2991, + 3291, 2115, 2990, + 3290, 2121, 2989, + 3289, 2128, 2987, + 3287, 2138, 2985, + 3285, 2150, 2981, + 3282, 2166, 2977, + 3278, 2187, 2971, + 3273, 2213, 2963, + 3266, 2246, 2953, + 3256, 2287, 2938, + 3242, 2336, 2917, + 3224, 2395, 2888, + 3198, 2463, 2846, + 3161, 2541, 2783, + 3105, 2627, 2681, + 3019, 2722, 2497, + 2870, 2824, 1992, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2232, 3126, + 3425, 2232, 3126, + 3425, 2233, 3125, + 3425, 2233, 3125, + 3425, 2234, 3125, + 3425, 2236, 3125, + 3424, 2238, 3124, + 3424, 2240, 3124, + 3424, 2243, 3123, + 3423, 2247, 3122, + 3422, 2253, 3121, + 3421, 2260, 3119, + 3419, 2270, 3117, + 3417, 2282, 3113, + 3414, 2298, 3109, + 3410, 2319, 3103, + 3405, 2345, 3095, + 3398, 2378, 3085, + 3388, 2419, 3070, + 3375, 2468, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2813, + 3151, 2854, 2629, + 3002, 2956, 2124, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2363, 3258, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2365, 3257, + 3557, 2366, 3257, + 3557, 2368, 3257, + 3557, 2370, 3256, + 3556, 2372, 3256, + 3556, 2375, 3255, + 3555, 2379, 3254, + 3554, 2385, 3253, + 3553, 2392, 3251, + 3551, 2402, 3249, + 3549, 2414, 3245, + 3546, 2430, 3241, + 3542, 2451, 3235, + 3537, 2477, 3227, + 3530, 2510, 3217, + 3520, 2551, 3202, + 3507, 2600, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2945, + 3283, 2986, 2760, + 3134, 3088, 2255, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2495, 3390, + 3690, 2495, 3390, + 3690, 2496, 3390, + 3689, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3389, + 3689, 2498, 3389, + 3689, 2500, 3389, + 3689, 2501, 3388, + 3688, 2504, 3388, + 3688, 2507, 3387, + 3687, 2511, 3386, + 3686, 2517, 3385, + 3685, 2524, 3383, + 3683, 2534, 3381, + 3681, 2546, 3378, + 3678, 2562, 3373, + 3674, 2583, 3367, + 3669, 2609, 3360, + 3662, 2642, 3349, + 3652, 2683, 3334, + 3639, 2732, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3502, 3023, 3077, + 3415, 3118, 2892, + 3266, 3220, 2387, + 2933, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3821, 2629, 3521, + 3821, 2630, 3521, + 3821, 2632, 3521, + 3821, 2633, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2643, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3816, 2666, 3513, + 3813, 2678, 3510, + 3810, 2694, 3505, + 3807, 2715, 3499, + 3801, 2741, 3492, + 3794, 2774, 3481, + 3784, 2815, 3466, + 3771, 2864, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3209, + 3547, 3250, 3024, + 3398, 3352, 2519, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2761, 3654, + 3953, 2762, 3653, + 3953, 2764, 3653, + 3953, 2765, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2873, 3624, + 3926, 2906, 3613, + 3916, 2947, 3598, + 3903, 2996, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3341, + 3679, 3382, 3156, + 3530, 3484, 2651, + 3197, 3592, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4085, 2894, 3785, + 4085, 2896, 3785, + 4085, 2897, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4083, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3769, + 4071, 2979, 3764, + 4065, 3005, 3756, + 4058, 3038, 3745, + 4049, 3079, 3730, + 4035, 3128, 3709, + 4017, 3187, 3680, + 3991, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3473, + 3812, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3917, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3915, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3137, 3888, + 4095, 3170, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3551, 3605, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 0, 0, + 0, 0, 0, + 0, 49, 0, + 0, 132, 0, + 0, 224, 0, + 0, 324, 0, + 0, 430, 0, + 0, 542, 0, + 0, 658, 0, + 0, 778, 0, + 0, 901, 0, + 0, 1025, 0, + 0, 1152, 0, + 0, 1280, 0, + 0, 1409, 0, + 0, 1539, 0, + 0, 1669, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 104, 0, 80, + 0, 0, 0, + 0, 66, 0, + 0, 147, 0, + 0, 236, 0, + 0, 333, 0, + 0, 438, 0, + 0, 548, 0, + 0, 662, 0, + 0, 781, 0, + 0, 903, 0, + 0, 1028, 0, + 0, 1154, 0, + 0, 1281, 0, + 0, 1410, 0, + 0, 1540, 0, + 0, 1670, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 326, 0, 214, + 262, 20, 152, + 160, 88, 54, + 0, 165, 0, + 0, 251, 0, + 0, 346, 0, + 0, 447, 0, + 0, 555, 0, + 0, 668, 0, + 0, 786, 0, + 0, 907, 0, + 0, 1030, 0, + 0, 1156, 0, + 0, 1283, 0, + 0, 1411, 0, + 0, 1540, 0, + 0, 1670, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 515, 0, 347, + 474, 52, 302, + 413, 116, 234, + 315, 188, 122, + 139, 271, 0, + 0, 361, 0, + 0, 460, 0, + 0, 565, 0, + 0, 676, 0, + 0, 792, 0, + 0, 911, 0, + 0, 1034, 0, + 0, 1158, 0, + 0, 1285, 0, + 0, 1413, 0, + 0, 1542, 0, + 0, 1671, 0, + 0, 1802, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 686, 42, 481, + 658, 92, 447, + 618, 150, 399, + 558, 218, 324, + 463, 295, 200, + 295, 382, 0, + 0, 477, 0, + 0, 579, 0, + 0, 687, 0, + 0, 800, 0, + 0, 918, 0, + 0, 1039, 0, + 0, 1162, 0, + 0, 1288, 0, + 0, 1415, 0, + 0, 1543, 0, + 0, 1673, 0, + 0, 1802, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 844, 96, 614, + 825, 140, 589, + 798, 192, 554, + 758, 255, 502, + 700, 327, 422, + 607, 408, 287, + 444, 498, 4, + 53, 596, 0, + 0, 700, 0, + 0, 811, 0, + 0, 926, 0, + 0, 1045, 0, + 0, 1167, 0, + 0, 1291, 0, + 0, 1418, 0, + 0, 1545, 0, + 0, 1674, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 996, 158, 746, + 982, 197, 728, + 963, 244, 702, + 936, 300, 666, + 897, 365, 611, + 839, 440, 527, + 748, 525, 382, + 589, 617, 65, + 214, 718, 0, + 0, 824, 0, + 0, 936, 0, + 0, 1053, 0, + 0, 1173, 0, + 0, 1296, 0, + 0, 1421, 0, + 0, 1548, 0, + 0, 1676, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1141, 230, 879, + 1131, 263, 865, + 1118, 304, 846, + 1099, 354, 820, + 1072, 412, 782, + 1034, 481, 726, + 976, 558, 638, + 887, 645, 484, + 730, 740, 135, + 367, 842, 0, + 0, 950, 0, + 0, 1064, 0, + 0, 1181, 0, + 0, 1302, 0, + 0, 1426, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1807, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1284, 312, 1011, + 1276, 340, 1001, + 1266, 374, 987, + 1253, 417, 968, + 1234, 468, 941, + 1207, 529, 902, + 1169, 600, 844, + 1112, 679, 753, + 1024, 768, 593, + 869, 865, 214, + 514, 968, 0, + 0, 1078, 0, + 0, 1192, 0, + 0, 1311, 0, + 0, 1432, 0, + 0, 1557, 0, + 0, 1683, 0, + 0, 1810, 0, + 0, 1939, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1423, 402, 1144, + 1418, 425, 1136, + 1410, 454, 1126, + 1401, 490, 1112, + 1387, 534, 1092, + 1368, 587, 1064, + 1342, 650, 1025, + 1304, 722, 966, + 1247, 803, 872, + 1159, 893, 706, + 1006, 991, 302, + 657, 1096, 0, + 0, 1206, 0, + 0, 1322, 0, + 0, 1441, 0, + 0, 1563, 0, + 0, 1687, 0, + 0, 1814, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1561, 500, 1276, + 1557, 518, 1270, + 1551, 542, 1263, + 1544, 572, 1252, + 1534, 609, 1238, + 1521, 655, 1218, + 1502, 709, 1190, + 1476, 773, 1150, + 1438, 846, 1090, + 1382, 929, 994, + 1294, 1020, 824, + 1142, 1119, 399, + 797, 1225, 0, + 0, 1336, 0, + 0, 1452, 0, + 0, 1571, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1697, 605, 1408, + 1694, 619, 1404, + 1690, 639, 1398, + 1684, 663, 1391, + 1677, 694, 1380, + 1667, 732, 1366, + 1654, 778, 1346, + 1635, 833, 1317, + 1609, 898, 1277, + 1571, 973, 1216, + 1515, 1056, 1119, + 1428, 1148, 945, + 1277, 1248, 502, + 935, 1354, 0, + 0, 1466, 0, + 0, 1582, 0, + 0, 1702, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1832, 715, 1540, + 1830, 727, 1537, + 1827, 742, 1533, + 1823, 761, 1527, + 1817, 786, 1519, + 1810, 818, 1509, + 1800, 856, 1494, + 1787, 903, 1474, + 1768, 959, 1446, + 1742, 1025, 1405, + 1704, 1100, 1343, + 1649, 1185, 1245, + 1562, 1277, 1069, + 1411, 1378, 612, + 1071, 1484, 0, + 0, 1597, 0, + 0, 1713, 0, + 0, 1833, 0, + 0, 1956, 0, + 0, 2082, 0, + 0, 2208, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1966, 830, 1672, + 1964, 840, 1670, + 1962, 851, 1667, + 1959, 867, 1663, + 1955, 887, 1657, + 1950, 912, 1649, + 1943, 943, 1639, + 1933, 983, 1624, + 1920, 1030, 1604, + 1901, 1087, 1575, + 1875, 1153, 1534, + 1837, 1229, 1472, + 1782, 1314, 1373, + 1695, 1407, 1194, + 1544, 1508, 726, + 1206, 1615, 0, + 0, 1728, 0, + 0, 1845, 0, + 0, 1965, 0, + 0, 2088, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2100, 950, 1805, + 2099, 957, 1803, + 2097, 966, 1801, + 2095, 978, 1797, + 2092, 993, 1793, + 2088, 1013, 1787, + 2083, 1039, 1780, + 2075, 1071, 1769, + 2066, 1110, 1754, + 2052, 1159, 1734, + 2034, 1216, 1705, + 2007, 1282, 1663, + 1970, 1359, 1601, + 1914, 1444, 1502, + 1828, 1538, 1322, + 1678, 1639, 844, + 1341, 1746, 0, + 0, 1859, 0, + 0, 1976, 0, + 0, 2097, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2233, 1072, 1937, + 2232, 1077, 1935, + 2231, 1084, 1934, + 2229, 1093, 1931, + 2227, 1106, 1928, + 2224, 1121, 1924, + 2220, 1142, 1918, + 2215, 1167, 1910, + 2208, 1200, 1900, + 2198, 1239, 1885, + 2185, 1288, 1864, + 2166, 1345, 1836, + 2140, 1412, 1794, + 2103, 1489, 1731, + 2047, 1575, 1631, + 1960, 1669, 1450, + 1810, 1770, 966, + 1475, 1878, 0, + 0, 1990, 0, + 0, 2108, 0, + 0, 2228, 0, + 0, 2352, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2366, 1196, 2069, + 2365, 1200, 2068, + 2365, 1206, 2067, + 2363, 1213, 2065, + 2362, 1222, 2063, + 2360, 1234, 2059, + 2357, 1250, 2055, + 2353, 1271, 2049, + 2347, 1297, 2041, + 2340, 1329, 2031, + 2330, 1369, 2016, + 2317, 1418, 1995, + 2298, 1475, 1966, + 2272, 1543, 1925, + 2235, 1620, 1862, + 2180, 1706, 1762, + 2093, 1800, 1579, + 1943, 1901, 1090, + 1608, 2009, 0, + 0, 2122, 0, + 0, 2239, 0, + 0, 2360, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2499, 1323, 2201, + 2498, 1326, 2200, + 2498, 1330, 2199, + 2497, 1335, 2198, + 2496, 1342, 2196, + 2494, 1352, 2194, + 2492, 1364, 2191, + 2489, 1380, 2186, + 2485, 1400, 2181, + 2480, 1426, 2173, + 2473, 1459, 2162, + 2463, 1499, 2147, + 2449, 1548, 2127, + 2431, 1606, 2098, + 2405, 1674, 2056, + 2367, 1751, 1993, + 2312, 1837, 1892, + 2225, 1931, 1709, + 2076, 2033, 1216, + 1741, 2141, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1450, 2333, + 2631, 1453, 2333, + 2631, 1456, 2332, + 2630, 1460, 2331, + 2629, 1465, 2330, + 2628, 1473, 2328, + 2626, 1482, 2325, + 2624, 1494, 2322, + 2621, 1510, 2318, + 2617, 1531, 2312, + 2612, 1557, 2304, + 2605, 1590, 2294, + 2595, 1630, 2279, + 2582, 1679, 2258, + 2563, 1737, 2229, + 2537, 1805, 2187, + 2500, 1882, 2124, + 2444, 1968, 2023, + 2358, 2063, 1840, + 2208, 2164, 1343, + 1874, 2272, 0, + 0, 2386, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1579, 2465, + 2764, 1581, 2465, + 2763, 1583, 2464, + 2763, 1586, 2464, + 2762, 1590, 2463, + 2761, 1596, 2461, + 2760, 1603, 2460, + 2758, 1613, 2457, + 2756, 1625, 2454, + 2753, 1641, 2450, + 2749, 1662, 2444, + 2744, 1688, 2436, + 2737, 1721, 2425, + 2727, 1761, 2410, + 2714, 1810, 2390, + 2695, 1868, 2361, + 2669, 1936, 2319, + 2632, 2013, 2256, + 2576, 2100, 2155, + 2490, 2194, 1971, + 2341, 2296, 1472, + 2006, 2404, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1709, 2597, + 2896, 1710, 2597, + 2896, 1712, 2597, + 2895, 1714, 2596, + 2895, 1717, 2595, + 2894, 1721, 2594, + 2893, 1727, 2593, + 2892, 1734, 2591, + 2891, 1744, 2589, + 2888, 1756, 2586, + 2886, 1772, 2581, + 2882, 1793, 2576, + 2876, 1819, 2568, + 2869, 1852, 2557, + 2859, 1892, 2542, + 2846, 1942, 2522, + 2827, 2000, 2492, + 2801, 2068, 2450, + 2764, 2145, 2387, + 2709, 2232, 2286, + 2622, 2326, 2102, + 2473, 2428, 1601, + 2139, 2536, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1839, 2729, + 3029, 1840, 2729, + 3028, 1841, 2729, + 3028, 1843, 2729, + 3028, 1845, 2728, + 3027, 1849, 2727, + 3026, 1853, 2726, + 3026, 1858, 2725, + 3024, 1865, 2723, + 3023, 1875, 2721, + 3021, 1887, 2718, + 3018, 1904, 2713, + 3014, 1924, 2708, + 3009, 1950, 2700, + 3001, 1983, 2689, + 2992, 2024, 2674, + 2978, 2073, 2653, + 2960, 2132, 2624, + 2934, 2199, 2582, + 2896, 2277, 2519, + 2841, 2363, 2418, + 2754, 2458, 2234, + 2605, 2560, 1732, + 2271, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1970, 2862, + 3161, 1970, 2861, + 3161, 1971, 2861, + 3160, 1973, 2861, + 3160, 1975, 2860, + 3160, 1977, 2860, + 3159, 1980, 2859, + 3159, 1984, 2858, + 3158, 1990, 2857, + 3157, 1997, 2855, + 3155, 2006, 2853, + 3153, 2019, 2850, + 3150, 2035, 2845, + 3146, 2056, 2839, + 3141, 2082, 2832, + 3133, 2115, 2821, + 3124, 2156, 2806, + 3110, 2205, 2785, + 3092, 2263, 2756, + 3066, 2331, 2714, + 3028, 2409, 2651, + 2973, 2495, 2550, + 2887, 2590, 2365, + 2737, 2692, 1862, + 2404, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2101, 2994, + 3293, 2101, 2994, + 3293, 2102, 2993, + 3293, 2103, 2993, + 3293, 2104, 2993, + 3292, 2106, 2992, + 3292, 2109, 2992, + 3291, 2112, 2991, + 3291, 2116, 2990, + 3290, 2121, 2989, + 3289, 2129, 2987, + 3287, 2138, 2985, + 3285, 2151, 2982, + 3282, 2167, 2977, + 3278, 2187, 2971, + 3273, 2214, 2963, + 3266, 2247, 2953, + 3256, 2287, 2938, + 3242, 2337, 2917, + 3224, 2395, 2888, + 3198, 2463, 2846, + 3160, 2541, 2783, + 3105, 2627, 2681, + 3019, 2722, 2497, + 2870, 2824, 1993, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2232, 3126, + 3425, 2232, 3126, + 3425, 2233, 3126, + 3425, 2234, 3125, + 3425, 2235, 3125, + 3425, 2236, 3125, + 3424, 2238, 3124, + 3424, 2240, 3124, + 3424, 2243, 3123, + 3423, 2248, 3122, + 3422, 2253, 3121, + 3421, 2260, 3119, + 3419, 2270, 3117, + 3417, 2282, 3114, + 3414, 2299, 3109, + 3410, 2319, 3103, + 3405, 2346, 3095, + 3398, 2379, 3085, + 3388, 2419, 3070, + 3375, 2469, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2813, + 3151, 2854, 2629, + 3002, 2956, 2124, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2366, 3257, + 3557, 2367, 3257, + 3557, 2368, 3257, + 3557, 2370, 3256, + 3556, 2372, 3256, + 3556, 2375, 3255, + 3555, 2379, 3254, + 3554, 2385, 3253, + 3553, 2392, 3251, + 3551, 2402, 3249, + 3549, 2414, 3246, + 3546, 2430, 3241, + 3542, 2451, 3235, + 3537, 2477, 3228, + 3530, 2510, 3217, + 3520, 2551, 3202, + 3507, 2600, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2945, + 3283, 2986, 2761, + 3134, 3088, 2256, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2495, 3390, + 3690, 2495, 3390, + 3690, 2496, 3390, + 3689, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3389, + 3689, 2498, 3389, + 3689, 2500, 3389, + 3689, 2502, 3389, + 3688, 2504, 3388, + 3688, 2507, 3387, + 3687, 2511, 3386, + 3686, 2517, 3385, + 3685, 2524, 3383, + 3683, 2534, 3381, + 3681, 2546, 3378, + 3678, 2562, 3373, + 3674, 2583, 3367, + 3669, 2609, 3360, + 3662, 2642, 3349, + 3652, 2683, 3334, + 3639, 2732, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3502, 3023, 3077, + 3415, 3118, 2893, + 3266, 3220, 2387, + 2933, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3821, 2629, 3522, + 3821, 2629, 3522, + 3821, 2630, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2643, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3815, 2666, 3513, + 3813, 2678, 3510, + 3810, 2694, 3505, + 3807, 2715, 3500, + 3801, 2741, 3492, + 3794, 2774, 3481, + 3784, 2815, 3466, + 3771, 2864, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3209, + 3547, 3250, 3025, + 3398, 3352, 2519, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2761, 3654, + 3953, 2762, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2873, 3624, + 3926, 2906, 3613, + 3916, 2947, 3598, + 3903, 2996, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3341, + 3679, 3382, 3157, + 3530, 3484, 2651, + 3197, 3592, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4085, 2894, 3785, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4083, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3769, + 4071, 2979, 3764, + 4065, 3005, 3756, + 4058, 3038, 3745, + 4049, 3079, 3730, + 4035, 3129, 3709, + 4017, 3187, 3680, + 3991, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3473, + 3811, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3137, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3551, 3605, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 0, 36, + 0, 24, 0, + 0, 91, 0, + 0, 168, 0, + 0, 254, 0, + 0, 348, 0, + 0, 449, 0, + 0, 557, 0, + 0, 669, 0, + 0, 787, 0, + 0, 907, 0, + 0, 1031, 0, + 0, 1156, 0, + 0, 1283, 0, + 0, 1411, 0, + 0, 1541, 0, + 0, 1671, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 67, 0, 149, + 0, 42, 77, + 0, 107, 0, + 0, 181, 0, + 0, 264, 0, + 0, 356, 0, + 0, 456, 0, + 0, 562, 0, + 0, 674, 0, + 0, 790, 0, + 0, 910, 0, + 0, 1033, 0, + 0, 1158, 0, + 0, 1284, 0, + 0, 1412, 0, + 0, 1541, 0, + 0, 1671, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 303, 13, 267, + 236, 65, 212, + 127, 127, 127, + 0, 198, 0, + 0, 279, 0, + 0, 368, 0, + 0, 465, 0, + 0, 570, 0, + 0, 680, 0, + 0, 795, 0, + 0, 913, 0, + 0, 1035, 0, + 0, 1160, 0, + 0, 1286, 0, + 0, 1413, 0, + 0, 1542, 0, + 0, 1672, 0, + 0, 1802, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 500, 45, 387, + 458, 94, 346, + 394, 152, 284, + 292, 220, 186, + 105, 297, 8, + 0, 383, 0, + 0, 478, 0, + 0, 579, 0, + 0, 687, 0, + 0, 801, 0, + 0, 918, 0, + 0, 1039, 0, + 0, 1162, 0, + 0, 1288, 0, + 0, 1415, 0, + 0, 1543, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 676, 85, 511, + 647, 130, 480, + 606, 184, 434, + 545, 248, 366, + 447, 321, 254, + 271, 403, 43, + 0, 494, 0, + 0, 592, 0, + 0, 697, 0, + 0, 808, 0, + 0, 924, 0, + 0, 1044, 0, + 0, 1166, 0, + 0, 1291, 0, + 0, 1417, 0, + 0, 1545, 0, + 0, 1674, 0, + 0, 1803, 0, + 0, 1934, 0, + 0, 2064, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 837, 134, 636, + 818, 175, 613, + 790, 224, 579, + 750, 282, 531, + 690, 350, 456, + 596, 428, 332, + 427, 514, 85, + 12, 609, 0, + 0, 711, 0, + 0, 819, 0, + 0, 932, 0, + 0, 1050, 0, + 0, 1171, 0, + 0, 1294, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1675, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 991, 192, 763, + 977, 228, 746, + 957, 272, 721, + 930, 325, 686, + 891, 387, 634, + 832, 459, 554, + 740, 540, 419, + 577, 630, 136, + 186, 728, 0, + 0, 832, 0, + 0, 943, 0, + 0, 1058, 0, + 0, 1177, 0, + 0, 1299, 0, + 0, 1423, 0, + 0, 1550, 0, + 0, 1677, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1138, 259, 892, + 1128, 290, 878, + 1114, 329, 860, + 1095, 376, 834, + 1068, 432, 798, + 1029, 497, 743, + 971, 572, 659, + 880, 657, 514, + 721, 749, 197, + 347, 850, 0, + 0, 956, 0, + 0, 1068, 0, + 0, 1185, 0, + 0, 1305, 0, + 0, 1428, 0, + 0, 1553, 0, + 0, 1680, 0, + 0, 1808, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2198, 0, + 0, 2328, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1281, 336, 1021, + 1274, 362, 1011, + 1264, 395, 997, + 1250, 436, 978, + 1231, 486, 952, + 1204, 544, 914, + 1166, 613, 858, + 1109, 690, 770, + 1019, 777, 616, + 862, 872, 267, + 499, 974, 0, + 0, 1082, 0, + 0, 1196, 0, + 0, 1314, 0, + 0, 1435, 0, + 0, 1558, 0, + 0, 1684, 0, + 0, 1811, 0, + 0, 1939, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1421, 422, 1151, + 1416, 444, 1143, + 1408, 472, 1133, + 1398, 506, 1119, + 1385, 549, 1100, + 1366, 601, 1073, + 1339, 661, 1034, + 1301, 732, 976, + 1245, 811, 885, + 1156, 900, 725, + 1001, 997, 346, + 646, 1100, 0, + 0, 1210, 0, + 0, 1324, 0, + 0, 1443, 0, + 0, 1565, 0, + 0, 1689, 0, + 0, 1815, 0, + 0, 1942, 0, + 0, 2071, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1559, 516, 1281, + 1555, 534, 1276, + 1550, 557, 1268, + 1543, 586, 1258, + 1533, 622, 1244, + 1519, 666, 1224, + 1500, 719, 1197, + 1474, 782, 1157, + 1436, 854, 1098, + 1380, 935, 1004, + 1291, 1025, 838, + 1138, 1123, 434, + 789, 1228, 0, + 0, 1339, 0, + 0, 1454, 0, + 0, 1573, 0, + 0, 1695, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1696, 617, 1412, + 1693, 632, 1408, + 1689, 651, 1402, + 1683, 674, 1395, + 1676, 704, 1384, + 1666, 741, 1370, + 1653, 787, 1350, + 1634, 841, 1322, + 1608, 905, 1282, + 1570, 978, 1222, + 1514, 1061, 1126, + 1426, 1152, 956, + 1274, 1251, 531, + 929, 1357, 0, + 0, 1468, 0, + 0, 1584, 0, + 0, 1703, 0, + 0, 1826, 0, + 0, 1951, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1831, 725, 1543, + 1829, 737, 1540, + 1826, 752, 1536, + 1822, 771, 1530, + 1817, 795, 1523, + 1809, 826, 1512, + 1800, 864, 1498, + 1786, 910, 1478, + 1767, 965, 1449, + 1741, 1030, 1409, + 1703, 1105, 1348, + 1648, 1188, 1251, + 1560, 1280, 1077, + 1409, 1380, 634, + 1067, 1486, 0, + 0, 1598, 0, + 0, 1714, 0, + 0, 1834, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1965, 838, 1675, + 1964, 847, 1672, + 1962, 859, 1669, + 1959, 874, 1665, + 1955, 894, 1659, + 1949, 918, 1652, + 1942, 950, 1641, + 1932, 988, 1626, + 1919, 1035, 1606, + 1900, 1092, 1578, + 1874, 1157, 1537, + 1837, 1232, 1475, + 1781, 1317, 1377, + 1694, 1409, 1201, + 1543, 1510, 744, + 1203, 1617, 0, + 0, 1729, 0, + 0, 1845, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2099, 956, 1806, + 2098, 963, 1805, + 2097, 972, 1802, + 2094, 983, 1799, + 2091, 999, 1795, + 2087, 1019, 1789, + 2082, 1044, 1781, + 2075, 1076, 1771, + 2065, 1115, 1756, + 2052, 1162, 1736, + 2033, 1219, 1707, + 2007, 1285, 1666, + 1969, 1361, 1604, + 1914, 1446, 1505, + 1827, 1539, 1326, + 1676, 1640, 858, + 1338, 1747, 0, + 0, 1860, 0, + 0, 1977, 0, + 0, 2097, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2233, 1076, 1938, + 2232, 1082, 1937, + 2231, 1089, 1935, + 2229, 1098, 1933, + 2227, 1110, 1929, + 2224, 1125, 1925, + 2220, 1146, 1919, + 2215, 1171, 1912, + 2208, 1203, 1901, + 2198, 1243, 1886, + 2184, 1291, 1866, + 2166, 1348, 1837, + 2140, 1415, 1796, + 2102, 1491, 1733, + 2047, 1576, 1634, + 1960, 1670, 1454, + 1810, 1771, 976, + 1473, 1878, 0, + 0, 1991, 0, + 0, 2108, 0, + 0, 2229, 0, + 0, 2352, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2366, 1200, 2070, + 2365, 1204, 2069, + 2364, 1209, 2068, + 2363, 1216, 2066, + 2361, 1226, 2063, + 2359, 1238, 2060, + 2356, 1253, 2056, + 2352, 1274, 2050, + 2347, 1299, 2042, + 2340, 1332, 2032, + 2330, 1371, 2017, + 2317, 1420, 1997, + 2298, 1477, 1968, + 2272, 1544, 1926, + 2235, 1621, 1863, + 2179, 1707, 1763, + 2092, 1801, 1582, + 1943, 1902, 1098, + 1607, 2010, 0, + 0, 2123, 0, + 0, 2240, 0, + 0, 2360, 0, + 0, 2484, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2499, 1325, 2202, + 2498, 1328, 2201, + 2498, 1332, 2200, + 2497, 1338, 2199, + 2495, 1345, 2197, + 2494, 1354, 2195, + 2492, 1367, 2191, + 2489, 1382, 2187, + 2485, 1403, 2181, + 2480, 1429, 2174, + 2472, 1461, 2163, + 2463, 1501, 2148, + 2449, 1550, 2128, + 2431, 1608, 2099, + 2404, 1675, 2057, + 2367, 1752, 1994, + 2312, 1838, 1894, + 2225, 1932, 1711, + 2075, 2033, 1222, + 1740, 2141, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1452, 2334, + 2631, 1455, 2333, + 2630, 1458, 2332, + 2630, 1462, 2331, + 2629, 1467, 2330, + 2628, 1474, 2328, + 2626, 1484, 2326, + 2624, 1496, 2323, + 2621, 1512, 2319, + 2617, 1533, 2313, + 2612, 1559, 2305, + 2605, 1591, 2294, + 2595, 1631, 2279, + 2581, 1680, 2259, + 2563, 1738, 2230, + 2537, 1806, 2188, + 2499, 1883, 2125, + 2444, 1969, 2024, + 2357, 2063, 1842, + 2208, 2165, 1348, + 1873, 2273, 0, + 0, 2386, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1581, 2466, + 2764, 1582, 2465, + 2763, 1585, 2465, + 2763, 1588, 2464, + 2762, 1592, 2463, + 2761, 1597, 2462, + 2760, 1605, 2460, + 2758, 1614, 2458, + 2756, 1626, 2454, + 2753, 1642, 2450, + 2749, 1663, 2444, + 2744, 1689, 2436, + 2737, 1722, 2426, + 2727, 1762, 2411, + 2714, 1811, 2390, + 2695, 1869, 2361, + 2669, 1937, 2319, + 2632, 2014, 2256, + 2576, 2100, 2155, + 2490, 2195, 1972, + 2340, 2297, 1475, + 2006, 2405, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1710, 2598, + 2896, 1711, 2597, + 2896, 1713, 2597, + 2895, 1715, 2596, + 2895, 1718, 2596, + 2894, 1723, 2595, + 2893, 1728, 2593, + 2892, 1735, 2592, + 2891, 1745, 2589, + 2888, 1757, 2586, + 2885, 1773, 2582, + 2882, 1794, 2576, + 2876, 1820, 2568, + 2869, 1853, 2557, + 2859, 1893, 2542, + 2846, 1942, 2522, + 2827, 2001, 2493, + 2801, 2068, 2451, + 2764, 2146, 2388, + 2709, 2232, 2287, + 2622, 2326, 2103, + 2473, 2428, 1604, + 2139, 2536, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1840, 2730, + 3028, 1841, 2729, + 3028, 1842, 2729, + 3028, 1844, 2729, + 3028, 1846, 2728, + 3027, 1849, 2727, + 3026, 1854, 2726, + 3026, 1859, 2725, + 3024, 1866, 2723, + 3023, 1876, 2721, + 3021, 1888, 2718, + 3018, 1904, 2714, + 3014, 1925, 2708, + 3008, 1951, 2700, + 3001, 1984, 2689, + 2992, 2025, 2674, + 2978, 2074, 2654, + 2960, 2132, 2625, + 2933, 2200, 2582, + 2896, 2277, 2519, + 2841, 2364, 2418, + 2754, 2458, 2234, + 2605, 2560, 1733, + 2271, 2668, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1970, 2862, + 3161, 1971, 2862, + 3161, 1972, 2861, + 3160, 1973, 2861, + 3160, 1975, 2861, + 3160, 1978, 2860, + 3159, 1981, 2859, + 3159, 1985, 2858, + 3158, 1990, 2857, + 3156, 1998, 2855, + 3155, 2007, 2853, + 3153, 2020, 2850, + 3150, 2036, 2845, + 3146, 2056, 2840, + 3141, 2083, 2832, + 3133, 2115, 2821, + 3124, 2156, 2806, + 3110, 2205, 2785, + 3092, 2264, 2756, + 3066, 2332, 2714, + 3028, 2409, 2651, + 2973, 2495, 2550, + 2887, 2590, 2366, + 2737, 2692, 1864, + 2403, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2101, 2994, + 3293, 2102, 2994, + 3293, 2103, 2993, + 3293, 2104, 2993, + 3293, 2105, 2993, + 3292, 2107, 2993, + 3292, 2109, 2992, + 3291, 2112, 2991, + 3291, 2116, 2990, + 3290, 2122, 2989, + 3289, 2129, 2987, + 3287, 2139, 2985, + 3285, 2151, 2982, + 3282, 2167, 2977, + 3278, 2188, 2972, + 3273, 2214, 2964, + 3266, 2247, 2953, + 3256, 2288, 2938, + 3242, 2337, 2917, + 3224, 2395, 2888, + 3198, 2463, 2846, + 3160, 2541, 2783, + 3105, 2627, 2682, + 3019, 2722, 2497, + 2869, 2824, 1994, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2232, 3126, + 3425, 2233, 3126, + 3425, 2233, 3126, + 3425, 2234, 3125, + 3425, 2235, 3125, + 3425, 2236, 3125, + 3424, 2238, 3125, + 3424, 2241, 3124, + 3424, 2244, 3123, + 3423, 2248, 3122, + 3422, 2253, 3121, + 3421, 2261, 3119, + 3419, 2270, 3117, + 3417, 2283, 3114, + 3414, 2299, 3109, + 3410, 2320, 3103, + 3405, 2346, 3096, + 3398, 2379, 3085, + 3388, 2420, 3070, + 3375, 2469, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2814, + 3151, 2854, 2629, + 3002, 2956, 2125, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2366, 3257, + 3557, 2367, 3257, + 3557, 2368, 3257, + 3557, 2370, 3257, + 3556, 2372, 3256, + 3556, 2375, 3255, + 3555, 2380, 3254, + 3554, 2385, 3253, + 3553, 2392, 3251, + 3551, 2402, 3249, + 3549, 2414, 3246, + 3546, 2431, 3241, + 3542, 2451, 3235, + 3537, 2478, 3228, + 3530, 2511, 3217, + 3520, 2551, 3202, + 3507, 2601, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2945, + 3283, 2986, 2761, + 3134, 3088, 2256, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2495, 3390, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3689, 2496, 3390, + 3689, 2497, 3390, + 3689, 2498, 3389, + 3689, 2499, 3389, + 3689, 2500, 3389, + 3689, 2502, 3389, + 3688, 2504, 3388, + 3688, 2507, 3387, + 3687, 2511, 3386, + 3686, 2517, 3385, + 3685, 2524, 3383, + 3683, 2534, 3381, + 3681, 2546, 3378, + 3678, 2562, 3373, + 3674, 2583, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2683, 3334, + 3639, 2733, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3502, 3023, 3077, + 3415, 3118, 2893, + 3266, 3220, 2388, + 2932, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3821, 2629, 3522, + 3821, 2630, 3522, + 3821, 2631, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2643, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3815, 2666, 3513, + 3813, 2678, 3510, + 3810, 2694, 3505, + 3807, 2715, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2815, 3466, + 3771, 2865, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3209, + 3547, 3250, 3025, + 3398, 3352, 2520, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2873, 3624, + 3926, 2907, 3613, + 3916, 2947, 3598, + 3903, 2997, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3341, + 3679, 3382, 3157, + 3530, 3484, 2651, + 3197, 3592, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3785, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4083, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3770, + 4071, 2979, 3764, + 4065, 3005, 3756, + 4058, 3039, 3745, + 4049, 3079, 3730, + 4035, 3129, 3709, + 4017, 3187, 3680, + 3991, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3473, + 3811, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3551, 3606, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 33, 135, + 0, 83, 61, + 0, 142, 0, + 0, 211, 0, + 0, 290, 0, + 0, 377, 0, + 0, 473, 0, + 0, 576, 0, + 0, 684, 0, + 0, 798, 0, + 0, 916, 0, + 0, 1037, 0, + 0, 1161, 0, + 0, 1287, 0, + 0, 1414, 0, + 0, 1543, 0, + 0, 1672, 0, + 0, 1802, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 11, 50, 228, + 0, 99, 168, + 0, 156, 74, + 0, 223, 0, + 0, 300, 0, + 0, 386, 0, + 0, 480, 0, + 0, 581, 0, + 0, 689, 0, + 0, 802, 0, + 0, 919, 0, + 0, 1039, 0, + 0, 1163, 0, + 0, 1288, 0, + 0, 1415, 0, + 0, 1543, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 271, 73, 329, + 199, 119, 281, + 79, 174, 209, + 0, 239, 91, + 0, 313, 0, + 0, 397, 0, + 0, 489, 0, + 0, 588, 0, + 0, 694, 0, + 0, 806, 0, + 0, 922, 0, + 0, 1042, 0, + 0, 1165, 0, + 0, 1290, 0, + 0, 1416, 0, + 0, 1544, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1934, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 480, 102, 436, + 435, 145, 399, + 368, 197, 344, + 259, 259, 259, + 54, 330, 113, + 0, 411, 0, + 0, 500, 0, + 0, 597, 0, + 0, 702, 0, + 0, 812, 0, + 0, 927, 0, + 0, 1045, 0, + 0, 1167, 0, + 0, 1292, 0, + 0, 1418, 0, + 0, 1546, 0, + 0, 1674, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 662, 137, 548, + 632, 177, 519, + 590, 226, 478, + 526, 284, 416, + 424, 352, 318, + 237, 429, 140, + 0, 515, 0, + 0, 610, 0, + 0, 711, 0, + 0, 819, 0, + 0, 933, 0, + 0, 1050, 0, + 0, 1171, 0, + 0, 1294, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1675, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 828, 181, 665, + 808, 217, 643, + 779, 262, 612, + 738, 316, 566, + 677, 380, 498, + 579, 453, 386, + 403, 535, 175, + 0, 626, 0, + 0, 724, 0, + 0, 830, 0, + 0, 941, 0, + 0, 1056, 0, + 0, 1176, 0, + 0, 1298, 0, + 0, 1423, 0, + 0, 1549, 0, + 0, 1677, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 984, 233, 785, + 970, 266, 768, + 950, 307, 745, + 922, 356, 712, + 882, 414, 663, + 822, 482, 588, + 728, 560, 464, + 559, 646, 217, + 144, 741, 0, + 0, 843, 0, + 0, 951, 0, + 0, 1064, 0, + 0, 1182, 0, + 0, 1303, 0, + 0, 1426, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1807, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1133, 295, 908, + 1123, 324, 895, + 1109, 360, 878, + 1089, 404, 853, + 1062, 457, 818, + 1023, 519, 766, + 964, 591, 686, + 872, 672, 551, + 709, 762, 268, + 318, 860, 0, + 0, 964, 0, + 0, 1075, 0, + 0, 1190, 0, + 0, 1309, 0, + 0, 1431, 0, + 0, 1555, 0, + 0, 1682, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1277, 366, 1033, + 1270, 391, 1024, + 1260, 422, 1010, + 1246, 461, 992, + 1227, 508, 967, + 1200, 564, 930, + 1161, 629, 876, + 1103, 705, 791, + 1013, 789, 646, + 853, 882, 329, + 479, 982, 0, + 0, 1088, 0, + 0, 1201, 0, + 0, 1317, 0, + 0, 1437, 0, + 0, 1560, 0, + 0, 1685, 0, + 0, 1812, 0, + 0, 1940, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2330, 0, + 0, 2460, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1418, 447, 1160, + 1413, 468, 1153, + 1406, 494, 1143, + 1396, 528, 1129, + 1382, 568, 1111, + 1363, 618, 1084, + 1336, 677, 1046, + 1298, 745, 990, + 1241, 822, 902, + 1151, 909, 748, + 994, 1004, 399, + 631, 1106, 0, + 0, 1214, 0, + 0, 1328, 0, + 0, 1446, 0, + 0, 1567, 0, + 0, 1690, 0, + 0, 1816, 0, + 0, 1943, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1557, 537, 1288, + 1553, 554, 1283, + 1548, 576, 1275, + 1540, 604, 1265, + 1531, 639, 1251, + 1517, 681, 1232, + 1498, 733, 1205, + 1471, 793, 1166, + 1433, 864, 1108, + 1377, 944, 1017, + 1288, 1032, 857, + 1133, 1129, 478, + 778, 1232, 0, + 0, 1342, 0, + 0, 1456, 0, + 0, 1575, 0, + 0, 1697, 0, + 0, 1821, 0, + 0, 1947, 0, + 0, 2074, 0, + 0, 2203, 0, + 0, 2332, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1694, 634, 1417, + 1691, 648, 1413, + 1687, 666, 1408, + 1682, 689, 1400, + 1675, 718, 1390, + 1665, 754, 1376, + 1651, 798, 1356, + 1632, 851, 1329, + 1606, 914, 1289, + 1568, 986, 1230, + 1512, 1067, 1136, + 1424, 1157, 970, + 1270, 1255, 567, + 921, 1360, 0, + 0, 1471, 0, + 0, 1586, 0, + 0, 1705, 0, + 0, 1827, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1830, 738, 1547, + 1828, 750, 1544, + 1825, 764, 1540, + 1821, 783, 1534, + 1815, 806, 1527, + 1808, 836, 1516, + 1798, 873, 1502, + 1785, 919, 1482, + 1766, 973, 1454, + 1740, 1037, 1414, + 1702, 1110, 1354, + 1646, 1193, 1258, + 1558, 1284, 1088, + 1406, 1383, 663, + 1061, 1489, 0, + 0, 1600, 0, + 0, 1716, 0, + 0, 1836, 0, + 0, 1958, 0, + 0, 2083, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1965, 849, 1678, + 1963, 857, 1675, + 1961, 869, 1672, + 1958, 884, 1668, + 1954, 903, 1662, + 1949, 927, 1655, + 1941, 958, 1644, + 1932, 996, 1630, + 1918, 1042, 1610, + 1899, 1097, 1582, + 1873, 1162, 1541, + 1835, 1237, 1480, + 1780, 1320, 1383, + 1692, 1412, 1209, + 1541, 1512, 766, + 1199, 1618, 0, + 0, 1730, 0, + 0, 1847, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2099, 964, 1809, + 2098, 970, 1807, + 2096, 979, 1804, + 2094, 991, 1801, + 2091, 1006, 1797, + 2087, 1026, 1791, + 2082, 1051, 1784, + 2074, 1082, 1773, + 2065, 1120, 1759, + 2051, 1167, 1738, + 2032, 1224, 1710, + 2006, 1289, 1669, + 1969, 1364, 1607, + 1913, 1449, 1509, + 1826, 1542, 1333, + 1675, 1642, 876, + 1335, 1749, 0, + 0, 1861, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2232, 1083, 1940, + 2231, 1088, 1938, + 2230, 1095, 1937, + 2229, 1104, 1934, + 2226, 1116, 1931, + 2224, 1131, 1927, + 2220, 1151, 1921, + 2214, 1176, 1913, + 2207, 1208, 1903, + 2197, 1247, 1888, + 2184, 1294, 1868, + 2165, 1351, 1839, + 2139, 1417, 1798, + 2101, 1493, 1736, + 2046, 1578, 1637, + 1959, 1671, 1459, + 1809, 1772, 990, + 1470, 1879, 0, + 0, 1992, 0, + 0, 2109, 0, + 0, 2229, 0, + 0, 2352, 0, + 0, 2478, 0, + 0, 2604, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2366, 1204, 2071, + 2365, 1208, 2070, + 2364, 1214, 2069, + 2363, 1221, 2067, + 2361, 1230, 2065, + 2359, 1242, 2062, + 2356, 1258, 2057, + 2352, 1278, 2052, + 2347, 1303, 2044, + 2340, 1335, 2033, + 2330, 1375, 2018, + 2316, 1423, 1998, + 2298, 1480, 1969, + 2272, 1547, 1928, + 2234, 1623, 1865, + 2179, 1708, 1766, + 2092, 1802, 1586, + 1942, 1903, 1108, + 1605, 2010, 0, + 0, 2123, 0, + 0, 2240, 0, + 0, 2361, 0, + 0, 2484, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2498, 1329, 2203, + 2498, 1332, 2202, + 2497, 1336, 2201, + 2496, 1341, 2200, + 2495, 1348, 2198, + 2494, 1358, 2196, + 2491, 1370, 2192, + 2488, 1385, 2188, + 2485, 1406, 2182, + 2479, 1431, 2175, + 2472, 1464, 2164, + 2462, 1504, 2149, + 2449, 1552, 2129, + 2430, 1609, 2100, + 2404, 1677, 2058, + 2367, 1753, 1995, + 2311, 1839, 1896, + 2225, 1933, 1714, + 2075, 2034, 1230, + 1739, 2142, 0, + 0, 2255, 0, + 0, 2372, 0, + 0, 2492, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1455, 2334, + 2631, 1457, 2334, + 2630, 1460, 2333, + 2630, 1464, 2332, + 2629, 1470, 2331, + 2628, 1477, 2329, + 2626, 1486, 2327, + 2624, 1499, 2324, + 2621, 1514, 2319, + 2617, 1535, 2313, + 2612, 1561, 2306, + 2604, 1593, 2295, + 2595, 1633, 2280, + 2581, 1682, 2260, + 2563, 1740, 2231, + 2537, 1807, 2189, + 2499, 1884, 2126, + 2444, 1970, 2026, + 2357, 2064, 1844, + 2207, 2165, 1354, + 1872, 2273, 0, + 0, 2386, 0, + 0, 2504, 0, + 0, 2624, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1583, 2466, + 2763, 1584, 2466, + 2763, 1587, 2465, + 2763, 1590, 2464, + 2762, 1594, 2464, + 2761, 1599, 2462, + 2760, 1607, 2460, + 2758, 1616, 2458, + 2756, 1628, 2455, + 2753, 1644, 2451, + 2749, 1665, 2445, + 2744, 1691, 2437, + 2737, 1723, 2426, + 2727, 1764, 2411, + 2714, 1812, 2391, + 2695, 1870, 2362, + 2669, 1938, 2320, + 2631, 2015, 2257, + 2576, 2101, 2156, + 2490, 2195, 1974, + 2340, 2297, 1480, + 2005, 2405, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1711, 2598, + 2896, 1713, 2598, + 2896, 1714, 2597, + 2895, 1717, 2597, + 2895, 1720, 2596, + 2894, 1724, 2595, + 2893, 1730, 2594, + 2892, 1737, 2592, + 2890, 1746, 2590, + 2888, 1759, 2586, + 2885, 1775, 2582, + 2881, 1795, 2576, + 2876, 1821, 2568, + 2869, 1854, 2558, + 2859, 1894, 2543, + 2846, 1943, 2522, + 2827, 2001, 2493, + 2801, 2069, 2451, + 2764, 2146, 2388, + 2708, 2232, 2288, + 2622, 2327, 2104, + 2472, 2429, 1608, + 2138, 2537, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1841, 2730, + 3028, 1842, 2730, + 3028, 1843, 2729, + 3028, 1845, 2729, + 3028, 1847, 2728, + 3027, 1851, 2728, + 3026, 1855, 2727, + 3025, 1860, 2725, + 3024, 1867, 2724, + 3023, 1877, 2721, + 3020, 1889, 2718, + 3018, 1905, 2714, + 3014, 1926, 2708, + 3008, 1952, 2700, + 3001, 1985, 2689, + 2991, 2025, 2675, + 2978, 2074, 2654, + 2959, 2133, 2625, + 2933, 2200, 2583, + 2896, 2278, 2520, + 2841, 2364, 2419, + 2754, 2459, 2235, + 2605, 2560, 1736, + 2271, 2668, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1971, 2862, + 3161, 1972, 2862, + 3161, 1973, 2862, + 3160, 1974, 2861, + 3160, 1976, 2861, + 3160, 1978, 2860, + 3159, 1981, 2860, + 3159, 1986, 2859, + 3158, 1991, 2857, + 3156, 1998, 2856, + 3155, 2008, 2853, + 3153, 2020, 2850, + 3150, 2036, 2846, + 3146, 2057, 2840, + 3141, 2083, 2832, + 3133, 2116, 2821, + 3124, 2157, 2806, + 3110, 2206, 2786, + 3092, 2264, 2757, + 3066, 2332, 2715, + 3028, 2409, 2651, + 2973, 2496, 2550, + 2886, 2590, 2366, + 2737, 2692, 1866, + 2403, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2102, 2994, + 3293, 2102, 2994, + 3293, 2103, 2994, + 3293, 2104, 2993, + 3292, 2105, 2993, + 3292, 2107, 2993, + 3292, 2110, 2992, + 3291, 2113, 2991, + 3291, 2117, 2990, + 3290, 2122, 2989, + 3289, 2130, 2987, + 3287, 2139, 2985, + 3285, 2152, 2982, + 3282, 2168, 2978, + 3278, 2188, 2972, + 3273, 2215, 2964, + 3266, 2248, 2953, + 3256, 2288, 2938, + 3242, 2337, 2918, + 3224, 2396, 2888, + 3198, 2464, 2846, + 3160, 2541, 2783, + 3105, 2628, 2682, + 3019, 2722, 2498, + 2869, 2824, 1996, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2233, 3126, + 3425, 2233, 3126, + 3425, 2234, 3126, + 3425, 2235, 3126, + 3425, 2236, 3125, + 3425, 2237, 3125, + 3424, 2239, 3125, + 3424, 2241, 3124, + 3423, 2244, 3123, + 3423, 2248, 3122, + 3422, 2254, 3121, + 3421, 2261, 3119, + 3419, 2271, 3117, + 3417, 2283, 3114, + 3414, 2299, 3109, + 3410, 2320, 3104, + 3405, 2346, 3096, + 3398, 2379, 3085, + 3388, 2420, 3070, + 3375, 2469, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2814, + 3151, 2854, 2629, + 3002, 2956, 2126, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2366, 3258, + 3557, 2367, 3257, + 3557, 2369, 3257, + 3556, 2370, 3257, + 3556, 2373, 3256, + 3556, 2376, 3255, + 3555, 2380, 3254, + 3554, 2386, 3253, + 3553, 2393, 3251, + 3551, 2402, 3249, + 3549, 2415, 3246, + 3546, 2431, 3241, + 3542, 2452, 3236, + 3537, 2478, 3228, + 3530, 2511, 3217, + 3520, 2552, 3202, + 3507, 2601, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2946, + 3283, 2986, 2761, + 3134, 3088, 2257, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2499, 3389, + 3689, 2500, 3389, + 3689, 2502, 3389, + 3688, 2504, 3388, + 3688, 2508, 3387, + 3687, 2512, 3386, + 3686, 2517, 3385, + 3685, 2525, 3383, + 3683, 2534, 3381, + 3681, 2547, 3378, + 3678, 2563, 3373, + 3674, 2583, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2683, 3334, + 3639, 2733, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3501, 3023, 3078, + 3415, 3118, 2893, + 3266, 3220, 2389, + 2932, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3821, 2629, 3522, + 3821, 2630, 3522, + 3821, 2631, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2644, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3815, 2666, 3513, + 3813, 2678, 3510, + 3810, 2695, 3505, + 3806, 2715, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2815, 3466, + 3771, 2865, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3210, + 3547, 3250, 3025, + 3398, 3352, 2520, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2947, 3598, + 3903, 2997, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3342, + 3679, 3382, 3157, + 3530, 3484, 2652, + 3197, 3593, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3785, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4082, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3770, + 4071, 2979, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3079, 3730, + 4035, 3129, 3710, + 4017, 3187, 3680, + 3990, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3474, + 3811, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 108, 241, + 0, 151, 183, + 0, 203, 91, + 0, 264, 0, + 0, 334, 0, + 0, 414, 0, + 0, 503, 0, + 0, 600, 0, + 0, 704, 0, + 0, 813, 0, + 0, 928, 0, + 0, 1046, 0, + 0, 1168, 0, + 0, 1292, 0, + 0, 1418, 0, + 0, 1546, 0, + 0, 1674, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 123, 316, + 0, 165, 267, + 0, 215, 193, + 0, 274, 69, + 0, 343, 0, + 0, 422, 0, + 0, 509, 0, + 0, 605, 0, + 0, 708, 0, + 0, 816, 0, + 0, 930, 0, + 0, 1048, 0, + 0, 1170, 0, + 0, 1293, 0, + 0, 1419, 0, + 0, 1546, 0, + 0, 1675, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 225, 143, 400, + 144, 182, 360, + 6, 231, 300, + 0, 288, 206, + 0, 355, 37, + 0, 432, 0, + 0, 518, 0, + 0, 612, 0, + 0, 713, 0, + 0, 821, 0, + 0, 934, 0, + 0, 1051, 0, + 0, 1171, 0, + 0, 1295, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1676, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 451, 167, 493, + 403, 205, 461, + 331, 251, 413, + 211, 306, 341, + 0, 371, 223, + 0, 445, 0, + 0, 529, 0, + 0, 621, 0, + 0, 720, 0, + 0, 826, 0, + 0, 938, 0, + 0, 1054, 0, + 0, 1174, 0, + 0, 1297, 0, + 0, 1422, 0, + 0, 1548, 0, + 0, 1676, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2066, 0, + 0, 2196, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 643, 198, 593, + 612, 234, 568, + 567, 277, 531, + 500, 329, 476, + 391, 391, 391, + 186, 462, 245, + 0, 543, 0, + 0, 632, 0, + 0, 730, 0, + 0, 834, 0, + 0, 944, 0, + 0, 1059, 0, + 0, 1178, 0, + 0, 1299, 0, + 0, 1424, 0, + 0, 1550, 0, + 0, 1678, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 815, 237, 700, + 794, 269, 680, + 765, 310, 651, + 722, 358, 610, + 658, 417, 548, + 556, 484, 450, + 369, 561, 272, + 0, 647, 0, + 0, 742, 0, + 0, 844, 0, + 0, 952, 0, + 0, 1065, 0, + 0, 1182, 0, + 0, 1303, 0, + 0, 1426, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1808, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 974, 283, 813, + 960, 313, 797, + 940, 350, 775, + 911, 395, 744, + 870, 448, 699, + 809, 512, 630, + 711, 585, 518, + 535, 667, 307, + 81, 758, 0, + 0, 856, 0, + 0, 962, 0, + 0, 1073, 0, + 0, 1188, 0, + 0, 1308, 0, + 0, 1430, 0, + 0, 1555, 0, + 0, 1681, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1126, 339, 929, + 1116, 365, 917, + 1102, 398, 900, + 1082, 439, 877, + 1054, 488, 844, + 1014, 546, 795, + 954, 614, 720, + 860, 692, 596, + 691, 778, 349, + 276, 873, 0, + 0, 975, 0, + 0, 1083, 0, + 0, 1196, 0, + 0, 1314, 0, + 0, 1435, 0, + 0, 1558, 0, + 0, 1684, 0, + 0, 1811, 0, + 0, 1939, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1272, 404, 1049, + 1265, 427, 1040, + 1255, 456, 1027, + 1241, 492, 1010, + 1221, 536, 985, + 1194, 589, 950, + 1155, 651, 898, + 1096, 723, 818, + 1004, 804, 683, + 841, 894, 400, + 450, 992, 0, + 0, 1096, 0, + 0, 1207, 0, + 0, 1322, 0, + 0, 1441, 0, + 0, 1563, 0, + 0, 1688, 0, + 0, 1814, 0, + 0, 1942, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1415, 479, 1172, + 1409, 499, 1165, + 1402, 523, 1156, + 1392, 554, 1143, + 1378, 593, 1124, + 1359, 640, 1099, + 1332, 696, 1062, + 1293, 762, 1008, + 1235, 837, 923, + 1145, 921, 778, + 985, 1014, 461, + 611, 1114, 0, + 0, 1221, 0, + 0, 1333, 0, + 0, 1449, 0, + 0, 1569, 0, + 0, 1692, 0, + 0, 1817, 0, + 0, 1944, 0, + 0, 2072, 0, + 0, 2202, 0, + 0, 2331, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1555, 563, 1298, + 1551, 579, 1292, + 1545, 600, 1285, + 1538, 627, 1275, + 1528, 660, 1262, + 1514, 701, 1243, + 1495, 750, 1216, + 1468, 809, 1178, + 1430, 877, 1122, + 1373, 955, 1034, + 1283, 1041, 880, + 1127, 1136, 531, + 763, 1238, 0, + 0, 1347, 0, + 0, 1460, 0, + 0, 1578, 0, + 0, 1699, 0, + 0, 1822, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1692, 656, 1424, + 1689, 669, 1420, + 1685, 686, 1415, + 1680, 708, 1408, + 1673, 736, 1397, + 1663, 771, 1384, + 1649, 813, 1364, + 1630, 865, 1337, + 1604, 926, 1298, + 1565, 996, 1240, + 1509, 1076, 1149, + 1420, 1164, 989, + 1265, 1261, 610, + 910, 1365, 0, + 0, 1474, 0, + 0, 1589, 0, + 0, 1707, 0, + 0, 1829, 0, + 0, 1953, 0, + 0, 2079, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2595, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1828, 756, 1553, + 1826, 766, 1550, + 1823, 780, 1545, + 1819, 798, 1540, + 1814, 821, 1532, + 1807, 850, 1522, + 1797, 886, 1508, + 1783, 930, 1488, + 1764, 983, 1461, + 1738, 1046, 1421, + 1700, 1118, 1362, + 1644, 1199, 1268, + 1556, 1289, 1103, + 1402, 1387, 699, + 1053, 1492, 0, + 0, 1603, 0, + 0, 1718, 0, + 0, 1837, 0, + 0, 1959, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1964, 862, 1682, + 1962, 871, 1679, + 1960, 882, 1676, + 1957, 896, 1672, + 1953, 915, 1667, + 1948, 938, 1659, + 1940, 968, 1649, + 1930, 1006, 1634, + 1917, 1051, 1614, + 1898, 1105, 1586, + 1872, 1169, 1546, + 1834, 1243, 1486, + 1778, 1325, 1391, + 1690, 1416, 1220, + 1538, 1515, 795, + 1193, 1621, 0, + 0, 1732, 0, + 0, 1848, 0, + 0, 1968, 0, + 0, 2090, 0, + 0, 2215, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2098, 974, 1812, + 2097, 981, 1810, + 2095, 989, 1808, + 2093, 1001, 1804, + 2090, 1016, 1800, + 2086, 1035, 1795, + 2081, 1059, 1787, + 2074, 1090, 1776, + 2064, 1128, 1762, + 2050, 1174, 1742, + 2032, 1230, 1714, + 2005, 1294, 1673, + 1968, 1369, 1612, + 1912, 1452, 1515, + 1824, 1545, 1341, + 1673, 1644, 898, + 1331, 1751, 0, + 0, 1862, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2232, 1091, 1942, + 2231, 1096, 1941, + 2230, 1103, 1939, + 2228, 1111, 1937, + 2226, 1123, 1933, + 2223, 1138, 1929, + 2219, 1158, 1924, + 2214, 1183, 1916, + 2206, 1214, 1905, + 2197, 1253, 1891, + 2183, 1300, 1870, + 2165, 1356, 1842, + 2138, 1421, 1801, + 2101, 1497, 1739, + 2045, 1581, 1641, + 1958, 1674, 1465, + 1807, 1774, 1008, + 1467, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2365, 1211, 2073, + 2364, 1215, 2072, + 2364, 1220, 2071, + 2362, 1227, 2069, + 2361, 1236, 2066, + 2359, 1248, 2063, + 2356, 1263, 2059, + 2352, 1283, 2053, + 2346, 1308, 2046, + 2339, 1340, 2035, + 2329, 1379, 2020, + 2316, 1427, 2000, + 2297, 1483, 1971, + 2271, 1550, 1930, + 2234, 1625, 1868, + 2178, 1710, 1769, + 2091, 1804, 1591, + 1941, 1904, 1122, + 1603, 2011, 0, + 0, 2124, 0, + 0, 2241, 0, + 0, 2361, 0, + 0, 2484, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2498, 1334, 2204, + 2498, 1337, 2203, + 2497, 1341, 2202, + 2496, 1346, 2201, + 2495, 1353, 2199, + 2493, 1362, 2197, + 2491, 1374, 2194, + 2488, 1390, 2189, + 2484, 1410, 2184, + 2479, 1435, 2176, + 2472, 1467, 2165, + 2462, 1507, 2150, + 2449, 1555, 2130, + 2430, 1612, 2101, + 2404, 1679, 2060, + 2366, 1755, 1997, + 2311, 1840, 1898, + 2224, 1934, 1718, + 2074, 2035, 1241, + 1737, 2142, 0, + 0, 2255, 0, + 0, 2372, 0, + 0, 2493, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1459, 2335, + 2631, 1461, 2335, + 2630, 1464, 2334, + 2629, 1468, 2333, + 2628, 1473, 2332, + 2627, 1480, 2330, + 2626, 1490, 2328, + 2624, 1502, 2324, + 2621, 1518, 2320, + 2617, 1538, 2314, + 2611, 1564, 2307, + 2604, 1596, 2296, + 2594, 1636, 2281, + 2581, 1684, 2261, + 2562, 1742, 2232, + 2536, 1809, 2190, + 2499, 1885, 2128, + 2443, 1971, 2028, + 2357, 2065, 1846, + 2207, 2166, 1362, + 1871, 2274, 0, + 0, 2387, 0, + 0, 2504, 0, + 0, 2625, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1585, 2467, + 2763, 1587, 2466, + 2763, 1589, 2466, + 2762, 1593, 2465, + 2762, 1597, 2464, + 2761, 1602, 2463, + 2760, 1609, 2461, + 2758, 1618, 2459, + 2756, 1631, 2456, + 2753, 1647, 2451, + 2749, 1667, 2446, + 2744, 1693, 2438, + 2737, 1725, 2427, + 2727, 1765, 2412, + 2713, 1814, 2392, + 2695, 1872, 2363, + 2669, 1939, 2321, + 2631, 2016, 2258, + 2576, 2102, 2158, + 2489, 2196, 1976, + 2340, 2297, 1486, + 2004, 2405, 0, + 0, 2518, 0, + 0, 2636, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1713, 2599, + 2896, 1715, 2598, + 2896, 1717, 2598, + 2895, 1719, 2597, + 2895, 1722, 2597, + 2894, 1726, 2596, + 2893, 1731, 2594, + 2892, 1739, 2593, + 2890, 1748, 2590, + 2888, 1760, 2587, + 2885, 1776, 2583, + 2881, 1797, 2577, + 2876, 1823, 2569, + 2869, 1855, 2558, + 2859, 1896, 2544, + 2846, 1944, 2523, + 2827, 2002, 2494, + 2801, 2070, 2452, + 2764, 2147, 2389, + 2708, 2233, 2289, + 2622, 2327, 2106, + 2472, 2429, 1612, + 2137, 2537, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1843, 2730, + 3028, 1844, 2730, + 3028, 1845, 2730, + 3028, 1847, 2729, + 3027, 1849, 2729, + 3027, 1852, 2728, + 3026, 1856, 2727, + 3025, 1862, 2726, + 3024, 1869, 2724, + 3023, 1878, 2722, + 3020, 1891, 2719, + 3017, 1907, 2714, + 3014, 1927, 2708, + 3008, 1953, 2701, + 3001, 1986, 2690, + 2991, 2026, 2675, + 2978, 2075, 2654, + 2959, 2133, 2625, + 2933, 2201, 2583, + 2896, 2278, 2520, + 2840, 2364, 2420, + 2754, 2459, 2236, + 2605, 2561, 1740, + 2270, 2669, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1972, 2862, + 3161, 1973, 2862, + 3160, 1974, 2862, + 3160, 1975, 2862, + 3160, 1977, 2861, + 3160, 1980, 2861, + 3159, 1983, 2860, + 3158, 1987, 2859, + 3158, 1992, 2858, + 3156, 1999, 2856, + 3155, 2009, 2853, + 3153, 2021, 2850, + 3150, 2037, 2846, + 3146, 2058, 2840, + 3140, 2084, 2832, + 3133, 2117, 2821, + 3124, 2157, 2807, + 3110, 2206, 2786, + 3092, 2265, 2757, + 3065, 2333, 2715, + 3028, 2410, 2652, + 2973, 2496, 2551, + 2886, 2591, 2367, + 2737, 2692, 1868, + 2403, 2801, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2103, 2994, + 3293, 2103, 2994, + 3293, 2104, 2994, + 3293, 2105, 2994, + 3292, 2106, 2993, + 3292, 2108, 2993, + 3292, 2110, 2992, + 3291, 2114, 2992, + 3291, 2118, 2991, + 3290, 2123, 2989, + 3289, 2130, 2988, + 3287, 2140, 2985, + 3285, 2152, 2982, + 3282, 2168, 2978, + 3278, 2189, 2972, + 3273, 2215, 2964, + 3265, 2248, 2953, + 3256, 2289, 2938, + 3242, 2338, 2918, + 3224, 2396, 2889, + 3198, 2464, 2847, + 3160, 2541, 2784, + 3105, 2628, 2682, + 3019, 2722, 2498, + 2869, 2824, 1998, + 2535, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2234, 3126, + 3425, 2234, 3126, + 3425, 2235, 3126, + 3425, 2235, 3126, + 3425, 2236, 3126, + 3425, 2238, 3125, + 3424, 2239, 3125, + 3424, 2242, 3124, + 3423, 2245, 3124, + 3423, 2249, 3123, + 3422, 2255, 3121, + 3421, 2262, 3119, + 3419, 2271, 3117, + 3417, 2284, 3114, + 3414, 2300, 3110, + 3410, 2320, 3104, + 3405, 2347, 3096, + 3398, 2380, 3085, + 3388, 2420, 3070, + 3374, 2469, 3050, + 3356, 2528, 3021, + 3330, 2596, 2978, + 3292, 2673, 2915, + 3237, 2760, 2814, + 3151, 2854, 2630, + 3001, 2956, 2128, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2366, 3258, + 3557, 2367, 3258, + 3557, 2368, 3257, + 3557, 2369, 3257, + 3556, 2371, 3257, + 3556, 2373, 3256, + 3556, 2376, 3255, + 3555, 2380, 3254, + 3554, 2386, 3253, + 3553, 2393, 3251, + 3551, 2403, 3249, + 3549, 2415, 3246, + 3546, 2431, 3242, + 3542, 2452, 3236, + 3537, 2478, 3228, + 3530, 2511, 3217, + 3520, 2552, 3202, + 3507, 2601, 3182, + 3488, 2660, 3152, + 3462, 2728, 3110, + 3425, 2805, 3047, + 3369, 2892, 2946, + 3283, 2986, 2761, + 3134, 3088, 2258, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2498, 3390, + 3689, 2499, 3389, + 3689, 2501, 3389, + 3689, 2502, 3389, + 3688, 2505, 3388, + 3688, 2508, 3387, + 3687, 2512, 3386, + 3686, 2518, 3385, + 3685, 2525, 3383, + 3683, 2534, 3381, + 3681, 2547, 3378, + 3678, 2563, 3374, + 3674, 2584, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2684, 3334, + 3639, 2733, 3314, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3501, 3023, 3078, + 3415, 3118, 2893, + 3266, 3220, 2389, + 2932, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3821, 2629, 3522, + 3821, 2630, 3522, + 3821, 2631, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2637, 3520, + 3820, 2640, 3519, + 3819, 2644, 3518, + 3818, 2649, 3517, + 3817, 2657, 3515, + 3815, 2666, 3513, + 3813, 2679, 3510, + 3810, 2695, 3506, + 3806, 2716, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2816, 3466, + 3771, 2865, 3446, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3210, + 3547, 3250, 3025, + 3398, 3352, 2521, + 3064, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2772, 3651, + 3951, 2776, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2811, 3642, + 3943, 2827, 3638, + 3939, 2847, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2947, 3598, + 3903, 2997, 3578, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3342, + 3679, 3382, 3157, + 3530, 3484, 2652, + 3197, 3593, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3784, + 4083, 2908, 3783, + 4082, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2959, 3770, + 4071, 2979, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3079, 3730, + 4035, 3129, 3710, + 4017, 3187, 3680, + 3990, 3255, 3638, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3514, 3289, + 3662, 3616, 2784, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3040, 3915, + 4095, 3045, 3913, + 4095, 3052, 3912, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3091, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2916, + 4095, 3155, 4051, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3223, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3945, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 193, 352, + 0, 229, 307, + 0, 273, 239, + 0, 326, 129, + 0, 388, 0, + 0, 459, 0, + 0, 540, 0, + 0, 630, 0, + 0, 728, 0, + 0, 833, 0, + 0, 943, 0, + 0, 1058, 0, + 0, 1177, 0, + 0, 1299, 0, + 0, 1423, 0, + 0, 1550, 0, + 0, 1677, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 205, 412, + 0, 240, 373, + 0, 283, 315, + 0, 335, 223, + 0, 396, 62, + 0, 466, 0, + 0, 546, 0, + 0, 635, 0, + 0, 732, 0, + 0, 836, 0, + 0, 945, 0, + 0, 1060, 0, + 0, 1178, 0, + 0, 1300, 0, + 0, 1424, 0, + 0, 1550, 0, + 0, 1678, 0, + 0, 1807, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 154, 222, 481, + 58, 255, 448, + 0, 297, 399, + 0, 347, 325, + 0, 407, 201, + 0, 476, 0, + 0, 554, 0, + 0, 641, 0, + 0, 737, 0, + 0, 840, 0, + 0, 949, 0, + 0, 1062, 0, + 0, 1180, 0, + 0, 1302, 0, + 0, 1425, 0, + 0, 1551, 0, + 0, 1679, 0, + 0, 1807, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 409, 242, 560, + 357, 275, 532, + 276, 315, 492, + 138, 363, 433, + 0, 420, 338, + 0, 488, 170, + 0, 564, 0, + 0, 650, 0, + 0, 744, 0, + 0, 845, 0, + 0, 953, 0, + 0, 1066, 0, + 0, 1183, 0, + 0, 1304, 0, + 0, 1427, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1808, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 616, 269, 648, + 583, 299, 625, + 535, 337, 593, + 463, 383, 546, + 343, 438, 474, + 109, 503, 355, + 0, 577, 124, + 0, 661, 0, + 0, 753, 0, + 0, 852, 0, + 0, 958, 0, + 0, 1070, 0, + 0, 1186, 0, + 0, 1306, 0, + 0, 1429, 0, + 0, 1554, 0, + 0, 1681, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2067, 0, + 0, 2198, 0, + 0, 2328, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 796, 302, 744, + 775, 330, 726, + 744, 366, 700, + 700, 409, 663, + 632, 461, 608, + 523, 523, 523, + 318, 594, 377, + 0, 675, 54, + 0, 764, 0, + 0, 862, 0, + 0, 966, 0, + 0, 1076, 0, + 0, 1191, 0, + 0, 1310, 0, + 0, 1432, 0, + 0, 1556, 0, + 0, 1682, 0, + 0, 1810, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 962, 343, 847, + 947, 369, 832, + 926, 401, 812, + 897, 442, 784, + 854, 490, 742, + 790, 549, 680, + 688, 616, 582, + 501, 693, 404, + 0, 780, 0, + 0, 874, 0, + 0, 976, 0, + 0, 1084, 0, + 0, 1197, 0, + 0, 1314, 0, + 0, 1435, 0, + 0, 1559, 0, + 0, 1684, 0, + 0, 1811, 0, + 0, 1940, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1117, 392, 956, + 1107, 415, 945, + 1092, 445, 929, + 1072, 482, 907, + 1043, 527, 876, + 1002, 581, 831, + 941, 644, 762, + 843, 717, 650, + 667, 799, 439, + 213, 890, 0, + 0, 988, 0, + 0, 1094, 0, + 0, 1205, 0, + 0, 1320, 0, + 0, 1440, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1266, 450, 1070, + 1258, 471, 1061, + 1248, 497, 1049, + 1234, 530, 1032, + 1214, 571, 1009, + 1186, 620, 976, + 1146, 678, 927, + 1086, 746, 852, + 992, 824, 728, + 824, 910, 481, + 408, 1005, 0, + 0, 1107, 0, + 0, 1215, 0, + 0, 1328, 0, + 0, 1446, 0, + 0, 1567, 0, + 0, 1690, 0, + 0, 1816, 0, + 0, 1943, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1410, 519, 1188, + 1405, 536, 1182, + 1397, 559, 1172, + 1387, 588, 1160, + 1373, 624, 1142, + 1353, 668, 1117, + 1326, 721, 1082, + 1287, 783, 1030, + 1228, 855, 950, + 1136, 936, 815, + 973, 1026, 532, + 582, 1124, 0, + 0, 1229, 0, + 0, 1339, 0, + 0, 1454, 0, + 0, 1573, 0, + 0, 1695, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1551, 596, 1310, + 1547, 611, 1305, + 1542, 631, 1297, + 1534, 655, 1288, + 1524, 687, 1275, + 1510, 725, 1256, + 1491, 772, 1231, + 1464, 828, 1194, + 1425, 894, 1140, + 1367, 969, 1055, + 1277, 1053, 910, + 1117, 1146, 593, + 743, 1246, 0, + 0, 1353, 0, + 0, 1465, 0, + 0, 1581, 0, + 0, 1702, 0, + 0, 1824, 0, + 0, 1950, 0, + 0, 2076, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1690, 683, 1434, + 1687, 695, 1430, + 1683, 711, 1424, + 1677, 732, 1417, + 1670, 759, 1407, + 1660, 792, 1394, + 1646, 833, 1375, + 1627, 882, 1348, + 1600, 941, 1310, + 1562, 1009, 1254, + 1505, 1087, 1166, + 1415, 1173, 1013, + 1259, 1268, 663, + 895, 1370, 0, + 0, 1479, 0, + 0, 1592, 0, + 0, 1710, 0, + 0, 1831, 0, + 0, 1954, 0, + 0, 2080, 0, + 0, 2207, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1826, 777, 1560, + 1824, 788, 1557, + 1821, 801, 1552, + 1817, 818, 1547, + 1812, 840, 1540, + 1805, 868, 1530, + 1795, 903, 1516, + 1781, 945, 1496, + 1762, 997, 1469, + 1736, 1058, 1430, + 1697, 1128, 1372, + 1641, 1208, 1281, + 1552, 1296, 1121, + 1397, 1393, 742, + 1042, 1497, 0, + 0, 1606, 0, + 0, 1721, 0, + 0, 1839, 0, + 0, 1961, 0, + 0, 2085, 0, + 0, 2211, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1962, 880, 1687, + 1961, 888, 1685, + 1958, 898, 1682, + 1955, 912, 1678, + 1951, 930, 1672, + 1946, 953, 1664, + 1939, 982, 1654, + 1929, 1018, 1640, + 1915, 1062, 1620, + 1897, 1116, 1593, + 1870, 1178, 1553, + 1832, 1250, 1494, + 1776, 1331, 1400, + 1688, 1422, 1235, + 1534, 1520, 831, + 1185, 1624, 0, + 0, 1735, 0, + 0, 1850, 0, + 0, 1969, 0, + 0, 2091, 0, + 0, 2216, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2097, 988, 1815, + 2096, 994, 1814, + 2094, 1003, 1811, + 2092, 1014, 1808, + 2089, 1028, 1804, + 2085, 1047, 1799, + 2080, 1071, 1791, + 2072, 1100, 1781, + 2063, 1138, 1766, + 2049, 1183, 1746, + 2030, 1237, 1719, + 2004, 1301, 1678, + 1966, 1375, 1618, + 1910, 1457, 1523, + 1822, 1548, 1352, + 1670, 1647, 927, + 1325, 1753, 0, + 0, 1864, 0, + 0, 1980, 0, + 0, 2100, 0, + 0, 2222, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2231, 1101, 1945, + 2230, 1106, 1944, + 2229, 1113, 1942, + 2227, 1122, 1940, + 2225, 1133, 1936, + 2222, 1148, 1932, + 2218, 1167, 1927, + 2213, 1191, 1919, + 2206, 1222, 1908, + 2196, 1260, 1894, + 2182, 1306, 1874, + 2164, 1362, 1846, + 2137, 1427, 1805, + 2100, 1501, 1744, + 2044, 1585, 1647, + 1956, 1677, 1473, + 1805, 1776, 1031, + 1463, 1883, 0, + 0, 1994, 0, + 0, 2111, 0, + 0, 2231, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2364, 1219, 2075, + 2364, 1223, 2074, + 2363, 1228, 2073, + 2362, 1235, 2071, + 2360, 1244, 2069, + 2358, 1255, 2066, + 2355, 1270, 2061, + 2351, 1290, 2056, + 2346, 1315, 2048, + 2339, 1346, 2037, + 2329, 1385, 2023, + 2315, 1432, 2003, + 2297, 1488, 1974, + 2270, 1553, 1933, + 2233, 1629, 1871, + 2177, 1713, 1773, + 2090, 1806, 1597, + 1939, 1906, 1140, + 1599, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2498, 1340, 2206, + 2497, 1343, 2205, + 2497, 1347, 2204, + 2496, 1352, 2203, + 2494, 1359, 2201, + 2493, 1368, 2199, + 2491, 1380, 2195, + 2488, 1395, 2191, + 2484, 1415, 2185, + 2478, 1440, 2178, + 2471, 1472, 2167, + 2461, 1511, 2152, + 2448, 1559, 2132, + 2429, 1615, 2103, + 2403, 1682, 2062, + 2366, 1757, 2000, + 2310, 1842, 1901, + 2223, 1936, 1723, + 2073, 2036, 1254, + 1735, 2144, 0, + 0, 2256, 0, + 0, 2373, 0, + 0, 2493, 0, + 0, 2616, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1463, 2337, + 2630, 1466, 2336, + 2630, 1469, 2335, + 2629, 1473, 2334, + 2628, 1478, 2333, + 2627, 1485, 2331, + 2625, 1494, 2329, + 2623, 1506, 2326, + 2620, 1522, 2322, + 2616, 1542, 2316, + 2611, 1567, 2308, + 2604, 1599, 2297, + 2594, 1639, 2283, + 2581, 1687, 2262, + 2562, 1744, 2233, + 2536, 1811, 2192, + 2498, 1887, 2130, + 2443, 1972, 2030, + 2356, 2066, 1850, + 2206, 2167, 1373, + 1869, 2275, 0, + 0, 2387, 0, + 0, 2504, 0, + 0, 2625, 0, + 0, 2748, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2763, 1589, 2468, + 2763, 1591, 2467, + 2763, 1593, 2467, + 2762, 1596, 2466, + 2761, 1600, 2465, + 2761, 1605, 2464, + 2759, 1613, 2462, + 2758, 1622, 2460, + 2756, 1634, 2457, + 2753, 1650, 2452, + 2749, 1670, 2447, + 2743, 1696, 2439, + 2736, 1728, 2428, + 2727, 1768, 2413, + 2713, 1816, 2393, + 2694, 1874, 2364, + 2668, 1941, 2322, + 2631, 2017, 2260, + 2575, 2103, 2160, + 2489, 2197, 1978, + 2339, 2298, 1494, + 2003, 2406, 0, + 0, 2519, 0, + 0, 2636, 0, + 0, 2757, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1716, 2599, + 2896, 1717, 2599, + 2895, 1719, 2599, + 2895, 1722, 2598, + 2894, 1725, 2597, + 2894, 1729, 2596, + 2893, 1734, 2595, + 2892, 1741, 2593, + 2890, 1751, 2591, + 2888, 1763, 2588, + 2885, 1779, 2583, + 2881, 1799, 2578, + 2876, 1825, 2570, + 2869, 1857, 2559, + 2859, 1897, 2544, + 2845, 1946, 2524, + 2827, 2004, 2495, + 2801, 2071, 2453, + 2763, 2148, 2390, + 2708, 2234, 2290, + 2621, 2328, 2108, + 2472, 2430, 1618, + 2136, 2537, 0, + 0, 2650, 0, + 0, 2768, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1845, 2731, + 3028, 1846, 2731, + 3028, 1847, 2730, + 3028, 1849, 2730, + 3027, 1851, 2729, + 3027, 1854, 2729, + 3026, 1858, 2728, + 3025, 1864, 2726, + 3024, 1871, 2725, + 3022, 1880, 2722, + 3020, 1892, 2719, + 3017, 1908, 2715, + 3013, 1929, 2709, + 3008, 1955, 2701, + 3001, 1987, 2690, + 2991, 2028, 2676, + 2978, 2076, 2655, + 2959, 2134, 2626, + 2933, 2202, 2584, + 2896, 2279, 2521, + 2840, 2365, 2421, + 2754, 2459, 2238, + 2604, 2561, 1744, + 2269, 2669, 0, + 0, 2782, 0, + 0, 2900, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1974, 2863, + 3161, 1975, 2862, + 3160, 1976, 2862, + 3160, 1977, 2862, + 3160, 1979, 2862, + 3160, 1981, 2861, + 3159, 1984, 2860, + 3158, 1988, 2859, + 3157, 1994, 2858, + 3156, 2001, 2856, + 3155, 2010, 2854, + 3152, 2023, 2851, + 3150, 2039, 2846, + 3146, 2059, 2841, + 3140, 2085, 2833, + 3133, 2118, 2822, + 3123, 2158, 2807, + 3110, 2207, 2787, + 3091, 2266, 2758, + 3065, 2333, 2716, + 3028, 2410, 2653, + 2973, 2497, 2552, + 2886, 2591, 2368, + 2737, 2693, 1872, + 2402, 2801, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2104, 2994, + 3293, 2104, 2994, + 3293, 2105, 2994, + 3293, 2106, 2994, + 3292, 2107, 2994, + 3292, 2109, 2993, + 3292, 2112, 2993, + 3291, 2115, 2992, + 3291, 2119, 2991, + 3290, 2124, 2990, + 3288, 2132, 2988, + 3287, 2141, 2986, + 3285, 2153, 2982, + 3282, 2169, 2978, + 3278, 2190, 2972, + 3273, 2216, 2964, + 3265, 2249, 2954, + 3256, 2290, 2939, + 3242, 2339, 2918, + 3224, 2397, 2889, + 3198, 2465, 2847, + 3160, 2542, 2784, + 3105, 2628, 2683, + 3018, 2723, 2499, + 2869, 2825, 2000, + 2535, 2933, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3661, 0, + 3425, 2234, 3126, + 3425, 2235, 3126, + 3425, 2235, 3126, + 3425, 2236, 3126, + 3425, 2237, 3126, + 3425, 2238, 3125, + 3424, 2240, 3125, + 3424, 2243, 3124, + 3423, 2246, 3124, + 3423, 2250, 3123, + 3422, 2255, 3121, + 3421, 2263, 3120, + 3419, 2272, 3117, + 3417, 2284, 3114, + 3414, 2301, 3110, + 3410, 2321, 3104, + 3405, 2347, 3096, + 3398, 2380, 3085, + 3388, 2421, 3071, + 3374, 2470, 3050, + 3356, 2528, 3021, + 3330, 2596, 2979, + 3292, 2674, 2916, + 3237, 2760, 2815, + 3151, 2855, 2631, + 3001, 2956, 2130, + 2667, 3065, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2365, 3258, + 3557, 2366, 3258, + 3557, 2366, 3258, + 3557, 2367, 3258, + 3557, 2367, 3258, + 3557, 2368, 3258, + 3557, 2370, 3257, + 3556, 2371, 3257, + 3556, 2374, 3256, + 3556, 2377, 3256, + 3555, 2381, 3255, + 3554, 2387, 3253, + 3553, 2394, 3252, + 3551, 2403, 3249, + 3549, 2416, 3246, + 3546, 2432, 3242, + 3542, 2453, 3236, + 3537, 2479, 3228, + 3530, 2512, 3217, + 3520, 2552, 3202, + 3507, 2602, 3182, + 3488, 2660, 3153, + 3462, 2728, 3111, + 3425, 2805, 3047, + 3369, 2892, 2946, + 3283, 2986, 2762, + 3134, 3088, 2260, + 2800, 3197, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2497, 3390, + 3690, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2498, 3390, + 3689, 2499, 3390, + 3689, 2500, 3390, + 3689, 2501, 3389, + 3689, 2503, 3389, + 3688, 2505, 3388, + 3688, 2508, 3388, + 3687, 2513, 3387, + 3686, 2518, 3385, + 3685, 2525, 3384, + 3683, 2535, 3381, + 3681, 2547, 3378, + 3678, 2563, 3374, + 3674, 2584, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2684, 3334, + 3639, 2733, 3314, + 3620, 2792, 3285, + 3594, 2860, 3242, + 3557, 2937, 3179, + 3501, 3024, 3078, + 3415, 3118, 2894, + 3266, 3220, 2391, + 2932, 3329, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3822, 2629, 3522, + 3821, 2630, 3522, + 3821, 2630, 3522, + 3821, 2631, 3522, + 3821, 2633, 3521, + 3821, 2635, 3521, + 3820, 2637, 3520, + 3820, 2640, 3520, + 3819, 2644, 3519, + 3818, 2650, 3517, + 3817, 2657, 3515, + 3815, 2667, 3513, + 3813, 2679, 3510, + 3810, 2695, 3506, + 3806, 2716, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2816, 3466, + 3771, 2865, 3446, + 3752, 2924, 3416, + 3726, 2992, 3374, + 3689, 3069, 3311, + 3634, 3156, 3210, + 3547, 3250, 3025, + 3398, 3352, 2521, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2769, 3652, + 3952, 2772, 3652, + 3951, 2776, 3651, + 3950, 2781, 3649, + 3949, 2789, 3647, + 3948, 2798, 3645, + 3945, 2811, 3642, + 3942, 2827, 3638, + 3939, 2848, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2948, 3598, + 3903, 2997, 3578, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3288, 3342, + 3679, 3382, 3157, + 3530, 3484, 2653, + 3197, 3593, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2904, 3784, + 4083, 2908, 3783, + 4082, 2913, 3781, + 4081, 2921, 3780, + 4080, 2930, 3777, + 4078, 2943, 3774, + 4075, 2959, 3770, + 4071, 2980, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3080, 3730, + 4035, 3129, 3710, + 4017, 3187, 3680, + 3990, 3255, 3638, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3514, 3289, + 3662, 3616, 2784, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3045, 3913, + 4095, 3052, 3912, + 4095, 3062, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3862, + 4095, 3261, 3842, + 4095, 3319, 3813, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2916, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3223, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3994, + 4095, 3393, 3974, + 4095, 3451, 3945, + 4095, 3520, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 286, 468, + 0, 316, 433, + 0, 352, 383, + 0, 397, 305, + 0, 450, 175, + 0, 514, 0, + 0, 586, 0, + 0, 668, 0, + 0, 759, 0, + 0, 857, 0, + 0, 962, 0, + 0, 1073, 0, + 0, 1189, 0, + 0, 1308, 0, + 0, 1430, 0, + 0, 1555, 0, + 0, 1681, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 296, 515, + 0, 325, 484, + 0, 361, 439, + 0, 405, 371, + 0, 458, 261, + 0, 520, 54, + 0, 592, 0, + 0, 673, 0, + 0, 762, 0, + 0, 860, 0, + 0, 965, 0, + 0, 1075, 0, + 0, 1190, 0, + 0, 1309, 0, + 0, 1431, 0, + 0, 1556, 0, + 0, 1682, 0, + 0, 1810, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 38, 310, 571, + 0, 338, 544, + 0, 372, 505, + 0, 415, 447, + 0, 467, 355, + 0, 528, 195, + 0, 599, 0, + 0, 678, 0, + 0, 767, 0, + 0, 864, 0, + 0, 968, 0, + 0, 1077, 0, + 0, 1192, 0, + 0, 1311, 0, + 0, 1432, 0, + 0, 1556, 0, + 0, 1682, 0, + 0, 1810, 0, + 0, 1939, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 347, 327, 637, + 286, 354, 613, + 190, 387, 580, + 17, 429, 531, + 0, 479, 457, + 0, 539, 333, + 0, 608, 87, + 0, 686, 0, + 0, 774, 0, + 0, 869, 0, + 0, 972, 0, + 0, 1081, 0, + 0, 1194, 0, + 0, 1312, 0, + 0, 1434, 0, + 0, 1558, 0, + 0, 1683, 0, + 0, 1811, 0, + 0, 1939, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 577, 349, 712, + 541, 375, 692, + 489, 407, 664, + 408, 447, 624, + 270, 495, 565, + 0, 553, 470, + 0, 620, 302, + 0, 696, 0, + 0, 782, 0, + 0, 876, 0, + 0, 977, 0, + 0, 1085, 0, + 0, 1198, 0, + 0, 1315, 0, + 0, 1436, 0, + 0, 1559, 0, + 0, 1684, 0, + 0, 1812, 0, + 0, 1940, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 771, 377, 796, + 748, 401, 780, + 715, 431, 757, + 668, 469, 725, + 595, 515, 678, + 475, 571, 606, + 241, 635, 487, + 0, 709, 256, + 0, 793, 0, + 0, 885, 0, + 0, 984, 0, + 0, 1091, 0, + 0, 1202, 0, + 0, 1318, 0, + 0, 1438, 0, + 0, 1561, 0, + 0, 1686, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2199, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 944, 411, 889, + 928, 434, 876, + 907, 462, 858, + 876, 498, 832, + 832, 541, 795, + 764, 594, 740, + 655, 655, 655, + 450, 726, 509, + 0, 807, 186, + 0, 896, 0, + 0, 994, 0, + 0, 1098, 0, + 0, 1208, 0, + 0, 1323, 0, + 0, 1442, 0, + 0, 1564, 0, + 0, 1688, 0, + 0, 1814, 0, + 0, 1942, 0, + 0, 2071, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1105, 454, 990, + 1094, 475, 979, + 1079, 501, 965, + 1058, 533, 944, + 1029, 574, 916, + 986, 623, 874, + 922, 681, 813, + 820, 748, 714, + 633, 825, 536, + 113, 912, 73, + 0, 1006, 0, + 0, 1108, 0, + 0, 1216, 0, + 0, 1329, 0, + 0, 1446, 0, + 0, 1567, 0, + 0, 1691, 0, + 0, 1816, 0, + 0, 1943, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1257, 506, 1097, + 1249, 524, 1088, + 1239, 547, 1077, + 1224, 577, 1061, + 1204, 614, 1039, + 1175, 659, 1008, + 1134, 713, 963, + 1073, 776, 894, + 975, 849, 783, + 799, 931, 571, + 345, 1022, 0, + 0, 1121, 0, + 0, 1226, 0, + 0, 1337, 0, + 0, 1452, 0, + 0, 1572, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1404, 566, 1209, + 1398, 582, 1202, + 1390, 603, 1193, + 1380, 629, 1181, + 1366, 662, 1165, + 1346, 703, 1141, + 1318, 752, 1108, + 1278, 811, 1059, + 1218, 878, 984, + 1124, 956, 860, + 956, 1042, 613, + 540, 1137, 0, + 0, 1239, 0, + 0, 1347, 0, + 0, 1461, 0, + 0, 1578, 0, + 0, 1699, 0, + 0, 1823, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1546, 637, 1325, + 1542, 651, 1320, + 1537, 668, 1314, + 1529, 691, 1304, + 1519, 720, 1292, + 1505, 756, 1274, + 1486, 800, 1249, + 1458, 853, 1214, + 1419, 915, 1162, + 1360, 987, 1082, + 1268, 1068, 947, + 1105, 1158, 665, + 714, 1256, 0, + 0, 1361, 0, + 0, 1471, 0, + 0, 1586, 0, + 0, 1705, 0, + 0, 1827, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1686, 717, 1446, + 1683, 728, 1442, + 1679, 743, 1437, + 1674, 763, 1430, + 1666, 787, 1420, + 1656, 819, 1407, + 1642, 857, 1388, + 1623, 904, 1363, + 1596, 960, 1326, + 1557, 1026, 1272, + 1500, 1101, 1187, + 1409, 1185, 1042, + 1250, 1278, 725, + 875, 1378, 0, + 0, 1485, 0, + 0, 1597, 0, + 0, 1713, 0, + 0, 1834, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1824, 805, 1569, + 1822, 815, 1566, + 1819, 827, 1562, + 1815, 843, 1556, + 1809, 864, 1549, + 1802, 891, 1539, + 1792, 924, 1526, + 1778, 965, 1507, + 1759, 1014, 1480, + 1732, 1073, 1442, + 1694, 1141, 1386, + 1637, 1219, 1298, + 1547, 1305, 1145, + 1391, 1400, 795, + 1028, 1502, 0, + 0, 1611, 0, + 0, 1724, 0, + 0, 1842, 0, + 0, 1963, 0, + 0, 2087, 0, + 0, 2212, 0, + 0, 2339, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1960, 902, 1694, + 1959, 910, 1692, + 1956, 920, 1689, + 1953, 933, 1685, + 1949, 950, 1679, + 1944, 972, 1672, + 1937, 1000, 1662, + 1927, 1035, 1648, + 1913, 1077, 1628, + 1894, 1129, 1601, + 1868, 1190, 1562, + 1830, 1260, 1505, + 1773, 1340, 1413, + 1684, 1428, 1253, + 1530, 1525, 875, + 1174, 1629, 0, + 0, 1738, 0, + 0, 1853, 0, + 0, 1971, 0, + 0, 2093, 0, + 0, 2217, 0, + 0, 2343, 0, + 0, 2471, 0, + 0, 2599, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2095, 1005, 1821, + 2094, 1012, 1819, + 2093, 1020, 1817, + 2090, 1030, 1814, + 2087, 1044, 1810, + 2084, 1062, 1804, + 2078, 1085, 1797, + 2071, 1114, 1786, + 2061, 1150, 1772, + 2047, 1195, 1753, + 2029, 1248, 1725, + 2002, 1310, 1685, + 1964, 1382, 1626, + 1908, 1464, 1533, + 1820, 1554, 1367, + 1667, 1652, 963, + 1317, 1756, 0, + 0, 1867, 0, + 0, 1982, 0, + 0, 2101, 0, + 0, 2223, 0, + 0, 2348, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2230, 1115, 1949, + 2229, 1120, 1948, + 2228, 1126, 1946, + 2226, 1135, 1944, + 2224, 1146, 1941, + 2221, 1160, 1936, + 2217, 1179, 1931, + 2212, 1203, 1923, + 2205, 1233, 1913, + 2195, 1270, 1898, + 2181, 1315, 1879, + 2162, 1369, 1851, + 2136, 1433, 1810, + 2098, 1507, 1750, + 2042, 1589, 1655, + 1955, 1681, 1484, + 1802, 1780, 1059, + 1457, 1885, 0, + 0, 1996, 0, + 0, 2112, 0, + 0, 2232, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2364, 1229, 2078, + 2363, 1233, 2077, + 2362, 1238, 2076, + 2361, 1245, 2074, + 2359, 1254, 2072, + 2357, 1265, 2069, + 2354, 1280, 2064, + 2350, 1299, 2059, + 2345, 1323, 2051, + 2338, 1354, 2041, + 2328, 1392, 2026, + 2314, 1438, 2006, + 2296, 1494, 1978, + 2269, 1559, 1937, + 2232, 1633, 1876, + 2176, 1717, 1779, + 2089, 1809, 1606, + 1937, 1908, 1163, + 1595, 2015, 0, + 0, 2127, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2497, 1348, 2208, + 2497, 1351, 2207, + 2496, 1355, 2206, + 2495, 1360, 2205, + 2494, 1367, 2203, + 2492, 1376, 2201, + 2490, 1387, 2198, + 2487, 1402, 2193, + 2483, 1422, 2188, + 2478, 1447, 2180, + 2471, 1478, 2169, + 2461, 1517, 2155, + 2447, 1564, 2135, + 2429, 1620, 2106, + 2402, 1686, 2065, + 2365, 1761, 2004, + 2309, 1845, 1906, + 2222, 1938, 1729, + 2071, 2038, 1272, + 1731, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2630, 1470, 2338, + 2630, 1472, 2338, + 2629, 1475, 2337, + 2629, 1479, 2336, + 2628, 1484, 2335, + 2627, 1491, 2333, + 2625, 1500, 2331, + 2623, 1512, 2327, + 2620, 1527, 2323, + 2616, 1547, 2317, + 2611, 1572, 2310, + 2603, 1604, 2299, + 2594, 1643, 2284, + 2580, 1691, 2264, + 2561, 1748, 2236, + 2535, 1814, 2194, + 2498, 1890, 2132, + 2442, 1974, 2033, + 2355, 2068, 1855, + 2205, 2168, 1386, + 1867, 2276, 0, + 0, 2388, 0, + 0, 2505, 0, + 0, 2625, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2763, 1594, 2469, + 2763, 1595, 2469, + 2762, 1598, 2468, + 2762, 1601, 2467, + 2761, 1605, 2466, + 2760, 1610, 2465, + 2759, 1617, 2463, + 2757, 1626, 2461, + 2755, 1638, 2458, + 2752, 1654, 2454, + 2748, 1674, 2448, + 2743, 1699, 2440, + 2736, 1731, 2429, + 2726, 1771, 2415, + 2713, 1819, 2394, + 2694, 1876, 2366, + 2668, 1943, 2324, + 2630, 2019, 2262, + 2575, 2104, 2162, + 2488, 2198, 1982, + 2338, 2299, 1505, + 2001, 2407, 0, + 0, 2519, 0, + 0, 2637, 0, + 0, 2757, 0, + 0, 2880, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1720, 2600, + 2895, 1721, 2600, + 2895, 1723, 2600, + 2895, 1725, 2599, + 2894, 1728, 2598, + 2894, 1732, 2597, + 2893, 1738, 2596, + 2891, 1745, 2594, + 2890, 1754, 2592, + 2888, 1766, 2589, + 2885, 1782, 2584, + 2881, 1802, 2579, + 2876, 1828, 2571, + 2868, 1860, 2560, + 2859, 1900, 2545, + 2845, 1948, 2525, + 2827, 2006, 2496, + 2800, 2073, 2454, + 2763, 2149, 2392, + 2708, 2235, 2292, + 2621, 2329, 2111, + 2471, 2430, 1626, + 2135, 2538, 0, + 0, 2651, 0, + 0, 2768, 0, + 0, 2889, 0, + 0, 3012, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1847, 2732, + 3028, 1848, 2731, + 3028, 1850, 2731, + 3027, 1851, 2731, + 3027, 1854, 2730, + 3027, 1857, 2729, + 3026, 1861, 2728, + 3025, 1866, 2727, + 3024, 1873, 2725, + 3022, 1883, 2723, + 3020, 1895, 2720, + 3017, 1911, 2716, + 3013, 1931, 2710, + 3008, 1957, 2702, + 3001, 1989, 2691, + 2991, 2030, 2676, + 2978, 2078, 2656, + 2959, 2136, 2627, + 2933, 2203, 2585, + 2895, 2280, 2522, + 2840, 2366, 2422, + 2753, 2460, 2240, + 2604, 2562, 1750, + 2268, 2670, 0, + 0, 2783, 0, + 0, 2900, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1976, 2863, + 3160, 1977, 2863, + 3160, 1978, 2863, + 3160, 1979, 2862, + 3160, 1981, 2862, + 3159, 1983, 2862, + 3159, 1986, 2861, + 3158, 1990, 2860, + 3157, 1996, 2858, + 3156, 2003, 2857, + 3154, 2012, 2854, + 3152, 2025, 2851, + 3149, 2040, 2847, + 3146, 2061, 2841, + 3140, 2087, 2833, + 3133, 2120, 2822, + 3123, 2160, 2808, + 3110, 2209, 2787, + 3091, 2267, 2758, + 3065, 2334, 2716, + 3028, 2411, 2653, + 2972, 2497, 2553, + 2886, 2592, 2370, + 2736, 2693, 1876, + 2401, 2801, 0, + 0, 2914, 0, + 0, 3032, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3529, 0, + 0, 3657, 0, + 3293, 2105, 2995, + 3293, 2106, 2995, + 3293, 2107, 2995, + 3292, 2108, 2994, + 3292, 2109, 2994, + 3292, 2111, 2994, + 3292, 2113, 2993, + 3291, 2116, 2992, + 3290, 2120, 2991, + 3290, 2126, 2990, + 3288, 2133, 2988, + 3287, 2142, 2986, + 3285, 2155, 2983, + 3282, 2171, 2978, + 3278, 2191, 2973, + 3272, 2217, 2965, + 3265, 2250, 2954, + 3256, 2291, 2939, + 3242, 2339, 2919, + 3224, 2398, 2890, + 3197, 2465, 2848, + 3160, 2542, 2785, + 3105, 2629, 2684, + 3018, 2723, 2500, + 2869, 2825, 2004, + 2534, 2933, 0, + 0, 3046, 0, + 0, 3164, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3661, 0, + 3425, 2236, 3127, + 3425, 2236, 3127, + 3425, 2237, 3126, + 3425, 2237, 3126, + 3425, 2238, 3126, + 3424, 2240, 3126, + 3424, 2241, 3125, + 3424, 2244, 3125, + 3423, 2247, 3124, + 3423, 2251, 3123, + 3422, 2256, 3122, + 3421, 2264, 3120, + 3419, 2273, 3118, + 3417, 2286, 3114, + 3414, 2302, 3110, + 3410, 2322, 3104, + 3405, 2348, 3096, + 3397, 2381, 3086, + 3388, 2422, 3071, + 3374, 2471, 3050, + 3356, 2529, 3021, + 3330, 2597, 2979, + 3292, 2674, 2916, + 3237, 2760, 2815, + 3150, 2855, 2631, + 3001, 2957, 2132, + 2667, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2366, 3259, + 3557, 2367, 3258, + 3557, 2367, 3258, + 3557, 2367, 3258, + 3557, 2368, 3258, + 3557, 2369, 3258, + 3557, 2371, 3258, + 3556, 2372, 3257, + 3556, 2375, 3257, + 3555, 2378, 3256, + 3555, 2382, 3255, + 3554, 2387, 3254, + 3553, 2395, 3252, + 3551, 2404, 3249, + 3549, 2417, 3246, + 3546, 2433, 3242, + 3542, 2453, 3236, + 3537, 2480, 3228, + 3530, 2512, 3217, + 3520, 2553, 3203, + 3506, 2602, 3182, + 3488, 2660, 3153, + 3462, 2728, 3111, + 3424, 2806, 3048, + 3369, 2892, 2947, + 3283, 2987, 2763, + 3133, 3089, 2262, + 2799, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3548, 0, + 0, 3672, 0, + 3689, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2498, 3390, + 3689, 2499, 3390, + 3689, 2499, 3390, + 3689, 2500, 3390, + 3689, 2502, 3389, + 3688, 2504, 3389, + 3688, 2506, 3388, + 3688, 2509, 3388, + 3687, 2513, 3387, + 3686, 2519, 3385, + 3685, 2526, 3384, + 3683, 2535, 3381, + 3681, 2548, 3378, + 3678, 2564, 3374, + 3674, 2585, 3368, + 3669, 2611, 3360, + 3662, 2644, 3349, + 3652, 2684, 3334, + 3639, 2734, 3314, + 3620, 2792, 3285, + 3594, 2860, 3243, + 3557, 2937, 3179, + 3501, 3024, 3078, + 3415, 3119, 2894, + 3266, 3220, 2392, + 2932, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3680, 0, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3822, 2629, 3522, + 3822, 2629, 3522, + 3821, 2630, 3522, + 3821, 2630, 3522, + 3821, 2631, 3522, + 3821, 2632, 3522, + 3821, 2633, 3521, + 3821, 2635, 3521, + 3820, 2637, 3520, + 3820, 2641, 3520, + 3819, 2645, 3519, + 3818, 2650, 3517, + 3817, 2657, 3516, + 3815, 2667, 3513, + 3813, 2679, 3510, + 3810, 2696, 3506, + 3806, 2716, 3500, + 3801, 2743, 3492, + 3794, 2775, 3481, + 3784, 2816, 3466, + 3771, 2865, 3446, + 3752, 2924, 3417, + 3726, 2992, 3375, + 3689, 3069, 3311, + 3633, 3156, 3210, + 3547, 3250, 3026, + 3398, 3352, 2523, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3954, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3654, + 3953, 2765, 3653, + 3953, 2767, 3653, + 3952, 2769, 3652, + 3952, 2772, 3652, + 3951, 2776, 3651, + 3950, 2782, 3649, + 3949, 2789, 3648, + 3948, 2799, 3645, + 3945, 2811, 3642, + 3942, 2827, 3638, + 3939, 2848, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2948, 3598, + 3903, 2997, 3578, + 3884, 3056, 3549, + 3858, 3124, 3506, + 3821, 3201, 3443, + 3766, 3288, 3342, + 3679, 3382, 3157, + 3530, 3484, 2654, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2897, 3785, + 4085, 2898, 3785, + 4085, 2901, 3784, + 4084, 2904, 3784, + 4083, 2908, 3783, + 4082, 2914, 3781, + 4081, 2921, 3780, + 4080, 2930, 3777, + 4077, 2943, 3774, + 4075, 2959, 3770, + 4071, 2980, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3080, 3730, + 4035, 3129, 3710, + 4017, 3188, 3681, + 3990, 3256, 3638, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3514, 3289, + 3662, 3616, 2785, + 3329, 3725, 0, + 4095, 3023, 3919, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3033, 3916, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3045, 3913, + 4095, 3053, 3912, + 4095, 3062, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3112, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3862, + 4095, 3261, 3842, + 4095, 3319, 3813, + 4095, 3388, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2916, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3168, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3185, 4044, + 4095, 3194, 4041, + 4095, 3207, 4038, + 4095, 3223, 4034, + 4095, 3244, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3994, + 4095, 3393, 3974, + 4095, 3451, 3945, + 4095, 3520, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 387, 587, + 0, 410, 561, + 0, 440, 523, + 0, 477, 468, + 0, 523, 381, + 0, 577, 231, + 0, 641, 0, + 0, 714, 0, + 0, 797, 0, + 0, 888, 0, + 0, 987, 0, + 0, 1093, 0, + 0, 1204, 0, + 0, 1320, 0, + 0, 1439, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 395, 624, + 0, 418, 600, + 0, 448, 565, + 0, 484, 515, + 0, 529, 437, + 0, 583, 307, + 0, 646, 42, + 0, 718, 0, + 0, 800, 0, + 0, 891, 0, + 0, 989, 0, + 0, 1094, 0, + 0, 1205, 0, + 0, 1321, 0, + 0, 1440, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 406, 669, + 0, 428, 647, + 0, 457, 616, + 0, 493, 571, + 0, 537, 503, + 0, 590, 393, + 0, 652, 186, + 0, 724, 0, + 0, 805, 0, + 0, 894, 0, + 0, 992, 0, + 0, 1097, 0, + 0, 1207, 0, + 0, 1322, 0, + 0, 1441, 0, + 0, 1563, 0, + 0, 1688, 0, + 0, 1814, 0, + 0, 1942, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 247, 420, 722, + 170, 442, 703, + 41, 470, 676, + 0, 505, 637, + 0, 547, 579, + 0, 599, 487, + 0, 660, 327, + 0, 731, 0, + 0, 811, 0, + 0, 899, 0, + 0, 996, 0, + 0, 1100, 0, + 0, 1210, 0, + 0, 1324, 0, + 0, 1443, 0, + 0, 1564, 0, + 0, 1688, 0, + 0, 1815, 0, + 0, 1942, 0, + 0, 2071, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 519, 438, 786, + 479, 459, 769, + 418, 486, 745, + 322, 520, 712, + 149, 561, 663, + 0, 611, 589, + 0, 671, 465, + 0, 740, 219, + 0, 818, 0, + 0, 906, 0, + 0, 1001, 0, + 0, 1104, 0, + 0, 1213, 0, + 0, 1327, 0, + 0, 1445, 0, + 0, 1566, 0, + 0, 1690, 0, + 0, 1815, 0, + 0, 1943, 0, + 0, 2071, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 734, 461, 858, + 709, 481, 844, + 673, 507, 824, + 621, 539, 797, + 540, 579, 756, + 402, 627, 697, + 110, 685, 602, + 0, 752, 434, + 0, 828, 18, + 0, 914, 0, + 0, 1008, 0, + 0, 1109, 0, + 0, 1217, 0, + 0, 1330, 0, + 0, 1447, 0, + 0, 1568, 0, + 0, 1691, 0, + 0, 1817, 0, + 0, 1944, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2462, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 919, 490, 940, + 903, 509, 929, + 880, 533, 912, + 847, 563, 889, + 800, 601, 857, + 727, 647, 810, + 607, 703, 738, + 373, 767, 619, + 0, 842, 388, + 0, 925, 0, + 0, 1017, 0, + 0, 1116, 0, + 0, 1223, 0, + 0, 1334, 0, + 0, 1451, 0, + 0, 1570, 0, + 0, 1693, 0, + 0, 1818, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1087, 526, 1031, + 1076, 544, 1021, + 1061, 566, 1008, + 1039, 594, 990, + 1008, 630, 964, + 964, 673, 927, + 896, 726, 872, + 787, 787, 787, + 582, 859, 641, + 0, 939, 318, + 0, 1029, 0, + 0, 1126, 0, + 0, 1230, 0, + 0, 1340, 0, + 0, 1455, 0, + 0, 1574, 0, + 0, 1696, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2203, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1245, 570, 1130, + 1237, 586, 1122, + 1226, 607, 1111, + 1211, 633, 1097, + 1190, 665, 1076, + 1161, 706, 1048, + 1118, 755, 1006, + 1055, 813, 945, + 952, 880, 846, + 765, 958, 669, + 245, 1044, 205, + 0, 1138, 0, + 0, 1240, 0, + 0, 1348, 0, + 0, 1461, 0, + 0, 1578, 0, + 0, 1699, 0, + 0, 1823, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1395, 623, 1235, + 1389, 638, 1229, + 1381, 656, 1220, + 1371, 679, 1209, + 1356, 709, 1193, + 1336, 746, 1171, + 1308, 791, 1140, + 1267, 845, 1095, + 1205, 908, 1026, + 1107, 981, 915, + 932, 1063, 703, + 477, 1154, 0, + 0, 1253, 0, + 0, 1358, 0, + 0, 1469, 0, + 0, 1585, 0, + 0, 1704, 0, + 0, 1826, 0, + 0, 1951, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1540, 686, 1346, + 1536, 698, 1341, + 1530, 715, 1334, + 1522, 735, 1326, + 1512, 762, 1313, + 1498, 794, 1297, + 1478, 835, 1273, + 1450, 884, 1240, + 1410, 943, 1191, + 1351, 1011, 1116, + 1256, 1088, 993, + 1088, 1174, 745, + 672, 1269, 0, + 0, 1371, 0, + 0, 1479, 0, + 0, 1593, 0, + 0, 1710, 0, + 0, 1831, 0, + 0, 1955, 0, + 0, 2080, 0, + 0, 2207, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1681, 758, 1461, + 1678, 769, 1458, + 1674, 783, 1453, + 1669, 801, 1446, + 1661, 823, 1436, + 1651, 852, 1424, + 1637, 888, 1406, + 1618, 932, 1381, + 1590, 985, 1346, + 1551, 1047, 1295, + 1492, 1119, 1215, + 1400, 1200, 1079, + 1237, 1290, 797, + 846, 1388, 0, + 0, 1493, 0, + 0, 1603, 0, + 0, 1718, 0, + 0, 1837, 0, + 0, 1959, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1820, 840, 1581, + 1818, 849, 1578, + 1815, 860, 1574, + 1811, 875, 1569, + 1806, 895, 1562, + 1798, 920, 1552, + 1788, 951, 1539, + 1774, 989, 1521, + 1755, 1036, 1495, + 1728, 1092, 1458, + 1689, 1158, 1404, + 1632, 1233, 1319, + 1541, 1317, 1174, + 1382, 1410, 857, + 1007, 1510, 0, + 0, 1617, 0, + 0, 1729, 0, + 0, 1846, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1958, 930, 1703, + 1956, 937, 1701, + 1954, 947, 1698, + 1951, 959, 1694, + 1947, 976, 1689, + 1941, 996, 1681, + 1934, 1023, 1671, + 1924, 1056, 1658, + 1910, 1097, 1639, + 1891, 1146, 1613, + 1865, 1205, 1575, + 1826, 1273, 1518, + 1769, 1351, 1430, + 1679, 1437, 1277, + 1523, 1532, 927, + 1160, 1635, 0, + 0, 1743, 0, + 0, 1856, 0, + 0, 1974, 0, + 0, 2095, 0, + 0, 2219, 0, + 0, 2344, 0, + 0, 2471, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2094, 1028, 1828, + 2092, 1034, 1826, + 2091, 1042, 1824, + 2088, 1052, 1821, + 2086, 1065, 1817, + 2082, 1082, 1811, + 2076, 1104, 1804, + 2069, 1132, 1794, + 2059, 1167, 1780, + 2045, 1210, 1761, + 2026, 1261, 1733, + 2000, 1322, 1695, + 1962, 1392, 1637, + 1905, 1472, 1545, + 1816, 1561, 1385, + 1662, 1657, 1007, + 1307, 1761, 0, + 0, 1870, 0, + 0, 1985, 0, + 0, 2103, 0, + 0, 2225, 0, + 0, 2349, 0, + 0, 2475, 0, + 0, 2603, 0, + 0, 2731, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2228, 1133, 1954, + 2228, 1138, 1953, + 2226, 1144, 1951, + 2225, 1152, 1949, + 2223, 1163, 1946, + 2220, 1176, 1942, + 2216, 1194, 1936, + 2210, 1217, 1929, + 2203, 1246, 1918, + 2193, 1282, 1904, + 2180, 1327, 1885, + 2161, 1380, 1857, + 2134, 1442, 1817, + 2096, 1514, 1758, + 2040, 1596, 1665, + 1952, 1686, 1499, + 1799, 1784, 1095, + 1449, 1888, 0, + 0, 1999, 0, + 0, 2114, 0, + 0, 2233, 0, + 0, 2356, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2363, 1243, 2082, + 2362, 1247, 2081, + 2361, 1252, 2080, + 2360, 1258, 2078, + 2358, 1267, 2076, + 2356, 1278, 2073, + 2353, 1292, 2068, + 2349, 1311, 2063, + 2344, 1335, 2055, + 2337, 1365, 2045, + 2327, 1402, 2031, + 2313, 1447, 2011, + 2294, 1502, 1983, + 2268, 1565, 1942, + 2230, 1639, 1882, + 2174, 1721, 1787, + 2087, 1813, 1617, + 1934, 1912, 1191, + 1589, 2017, 0, + 0, 2129, 0, + 0, 2244, 0, + 0, 2364, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2496, 1359, 2211, + 2496, 1362, 2210, + 2495, 1365, 2209, + 2494, 1370, 2208, + 2493, 1377, 2206, + 2491, 1386, 2204, + 2489, 1397, 2201, + 2486, 1412, 2196, + 2482, 1431, 2191, + 2477, 1455, 2183, + 2470, 1486, 2173, + 2460, 1524, 2158, + 2446, 1570, 2138, + 2428, 1626, 2110, + 2402, 1691, 2069, + 2364, 1765, 2008, + 2308, 1849, 1911, + 2221, 1941, 1738, + 2069, 2041, 1295, + 1727, 2147, 0, + 0, 2259, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 2630, 1478, 2340, + 2629, 1480, 2340, + 2629, 1483, 2339, + 2628, 1487, 2338, + 2627, 1492, 2337, + 2626, 1499, 2335, + 2624, 1508, 2333, + 2622, 1519, 2330, + 2619, 1535, 2326, + 2615, 1554, 2320, + 2610, 1579, 2312, + 2603, 1610, 2302, + 2593, 1649, 2287, + 2579, 1696, 2267, + 2561, 1752, 2238, + 2535, 1818, 2197, + 2497, 1893, 2136, + 2441, 1977, 2038, + 2354, 2070, 1861, + 2203, 2170, 1404, + 1864, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2763, 1600, 2471, + 2762, 1602, 2470, + 2762, 1604, 2470, + 2761, 1607, 2469, + 2761, 1611, 2468, + 2760, 1616, 2467, + 2759, 1623, 2465, + 2757, 1632, 2463, + 2755, 1644, 2460, + 2752, 1659, 2455, + 2748, 1679, 2450, + 2743, 1704, 2442, + 2735, 1736, 2431, + 2726, 1775, 2417, + 2712, 1823, 2396, + 2694, 1880, 2368, + 2667, 1946, 2326, + 2630, 2022, 2264, + 2574, 2107, 2165, + 2487, 2200, 1987, + 2337, 2301, 1518, + 1999, 2408, 0, + 0, 2520, 0, + 0, 2637, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 2895, 1725, 2601, + 2895, 1726, 2601, + 2895, 1728, 2601, + 2894, 1730, 2600, + 2894, 1733, 2599, + 2893, 1737, 2599, + 2892, 1742, 2597, + 2891, 1749, 2595, + 2890, 1758, 2593, + 2887, 1770, 2590, + 2884, 1786, 2586, + 2881, 1806, 2580, + 2875, 1832, 2572, + 2868, 1864, 2561, + 2858, 1903, 2547, + 2845, 1951, 2526, + 2826, 2008, 2498, + 2800, 2075, 2456, + 2763, 2151, 2394, + 2707, 2237, 2294, + 2620, 2330, 2114, + 2470, 2431, 1637, + 2133, 2539, 0, + 0, 2652, 0, + 0, 2769, 0, + 0, 2889, 0, + 0, 3012, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1851, 2733, + 3028, 1852, 2732, + 3027, 1853, 2732, + 3027, 1855, 2732, + 3027, 1857, 2731, + 3026, 1860, 2730, + 3026, 1864, 2729, + 3025, 1870, 2728, + 3024, 1877, 2726, + 3022, 1886, 2724, + 3020, 1898, 2721, + 3017, 1914, 2717, + 3013, 1934, 2711, + 3008, 1960, 2703, + 3000, 1992, 2692, + 2991, 2032, 2677, + 2977, 2080, 2657, + 2959, 2138, 2628, + 2933, 2205, 2586, + 2895, 2282, 2524, + 2840, 2367, 2424, + 2753, 2461, 2243, + 2603, 2562, 1758, + 2267, 2670, 0, + 0, 2783, 0, + 0, 2900, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1979, 2864, + 3160, 1979, 2864, + 3160, 1980, 2863, + 3160, 1982, 2863, + 3160, 1983, 2863, + 3159, 1986, 2862, + 3159, 1989, 2861, + 3158, 1993, 2861, + 3157, 1998, 2859, + 3156, 2005, 2857, + 3154, 2015, 2855, + 3152, 2027, 2852, + 3149, 2043, 2848, + 3145, 2063, 2842, + 3140, 2089, 2834, + 3133, 2122, 2823, + 3123, 2162, 2809, + 3110, 2210, 2788, + 3091, 2268, 2759, + 3065, 2335, 2717, + 3028, 2412, 2654, + 2972, 2498, 2554, + 2886, 2592, 2372, + 2736, 2694, 1882, + 2401, 2802, 0, + 0, 2915, 0, + 0, 3032, 0, + 0, 3153, 0, + 0, 3276, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3293, 2107, 2995, + 3293, 2108, 2995, + 3292, 2109, 2995, + 3292, 2110, 2995, + 3292, 2111, 2995, + 3292, 2113, 2994, + 3291, 2115, 2994, + 3291, 2118, 2993, + 3290, 2122, 2992, + 3289, 2128, 2991, + 3288, 2135, 2989, + 3287, 2144, 2986, + 3284, 2157, 2983, + 3282, 2173, 2979, + 3278, 2193, 2973, + 3272, 2219, 2965, + 3265, 2252, 2955, + 3255, 2292, 2940, + 3242, 2341, 2919, + 3223, 2399, 2890, + 3197, 2466, 2848, + 3160, 2543, 2785, + 3104, 2629, 2685, + 3018, 2724, 2502, + 2868, 2825, 2008, + 2534, 2933, 0, + 0, 3046, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 3425, 2237, 3127, + 3425, 2238, 3127, + 3425, 2238, 3127, + 3425, 2239, 3127, + 3425, 2240, 3126, + 3424, 2241, 3126, + 3424, 2243, 3126, + 3424, 2245, 3125, + 3423, 2248, 3124, + 3423, 2252, 3123, + 3422, 2258, 3122, + 3420, 2265, 3120, + 3419, 2275, 3118, + 3417, 2287, 3115, + 3414, 2303, 3111, + 3410, 2323, 3105, + 3405, 2350, 3097, + 3397, 2382, 3086, + 3388, 2423, 3071, + 3374, 2472, 3051, + 3356, 2530, 3022, + 3330, 2597, 2980, + 3292, 2675, 2917, + 3237, 2761, 2816, + 3150, 2855, 2633, + 3001, 2957, 2136, + 2666, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2367, 3259, + 3557, 2368, 3259, + 3557, 2368, 3259, + 3557, 2369, 3259, + 3557, 2369, 3258, + 3557, 2370, 3258, + 3557, 2372, 3258, + 3556, 2373, 3257, + 3556, 2376, 3257, + 3555, 2379, 3256, + 3555, 2383, 3255, + 3554, 2389, 3254, + 3553, 2396, 3252, + 3551, 2405, 3250, + 3549, 2418, 3247, + 3546, 2434, 3242, + 3542, 2454, 3236, + 3537, 2480, 3229, + 3530, 2513, 3218, + 3520, 2554, 3203, + 3506, 2603, 3182, + 3488, 2661, 3153, + 3462, 2729, 3111, + 3424, 2806, 3048, + 3369, 2892, 2947, + 3283, 2987, 2763, + 3133, 3089, 2264, + 2799, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3548, 0, + 0, 3672, 0, + 3689, 2498, 3391, + 3689, 2498, 3391, + 3689, 2499, 3391, + 3689, 2499, 3390, + 3689, 2500, 3390, + 3689, 2500, 3390, + 3689, 2501, 3390, + 3689, 2503, 3390, + 3688, 2504, 3389, + 3688, 2507, 3389, + 3688, 2510, 3388, + 3687, 2514, 3387, + 3686, 2520, 3386, + 3685, 2527, 3384, + 3683, 2536, 3382, + 3681, 2549, 3378, + 3678, 2565, 3374, + 3674, 2585, 3368, + 3669, 2612, 3360, + 3662, 2644, 3350, + 3652, 2685, 3335, + 3639, 2734, 3314, + 3620, 2792, 3285, + 3594, 2860, 3243, + 3557, 2938, 3180, + 3501, 3024, 3079, + 3415, 3119, 2895, + 3265, 3221, 2394, + 2932, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3681, 0, + 3822, 2629, 3523, + 3822, 2629, 3523, + 3822, 2630, 3523, + 3822, 2630, 3522, + 3821, 2630, 3522, + 3821, 2631, 3522, + 3821, 2632, 3522, + 3821, 2633, 3522, + 3821, 2634, 3522, + 3821, 2636, 3521, + 3820, 2638, 3521, + 3820, 2641, 3520, + 3819, 2645, 3519, + 3818, 2651, 3518, + 3817, 2658, 3516, + 3815, 2668, 3513, + 3813, 2680, 3510, + 3810, 2696, 3506, + 3806, 2717, 3500, + 3801, 2743, 3492, + 3794, 2776, 3481, + 3784, 2817, 3467, + 3771, 2866, 3446, + 3752, 2924, 3417, + 3726, 2992, 3375, + 3689, 3069, 3312, + 3633, 3156, 3210, + 3547, 3251, 3026, + 3398, 3353, 2524, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2760, 3655, + 3954, 2761, 3655, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3954, 2762, 3654, + 3953, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3654, + 3953, 2765, 3653, + 3953, 2767, 3653, + 3952, 2769, 3652, + 3952, 2773, 3652, + 3951, 2777, 3651, + 3950, 2782, 3649, + 3949, 2790, 3648, + 3947, 2799, 3645, + 3945, 2812, 3642, + 3942, 2828, 3638, + 3939, 2848, 3632, + 3933, 2875, 3624, + 3926, 2908, 3613, + 3916, 2948, 3598, + 3903, 2997, 3578, + 3884, 3056, 3549, + 3858, 3124, 3507, + 3821, 3201, 3443, + 3766, 3288, 3342, + 3679, 3383, 3158, + 3530, 3485, 2655, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2892, 3787, + 4086, 2892, 3787, + 4086, 2892, 3787, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4086, 2895, 3786, + 4085, 2896, 3786, + 4085, 2897, 3785, + 4085, 2899, 3785, + 4084, 2901, 3784, + 4084, 2904, 3784, + 4083, 2908, 3783, + 4082, 2914, 3781, + 4081, 2921, 3780, + 4080, 2931, 3777, + 4077, 2943, 3774, + 4075, 2959, 3770, + 4071, 2980, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3080, 3730, + 4035, 3129, 3710, + 4016, 3188, 3681, + 3990, 3256, 3639, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3515, 3289, + 3662, 3617, 2786, + 3329, 3725, 0, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3029, 3917, + 4095, 3030, 3917, + 4095, 3033, 3916, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3046, 3913, + 4095, 3053, 3912, + 4095, 3062, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3112, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3862, + 4095, 3261, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3943, 3647, 3421, + 3794, 3749, 2917, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3161, 4049, + 4095, 3162, 4049, + 4095, 3165, 4048, + 4095, 3168, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3185, 4044, + 4095, 3194, 4041, + 4095, 3207, 4038, + 4095, 3223, 4034, + 4095, 3244, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3994, + 4095, 3393, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3779, 3553, + 0, 494, 709, + 0, 513, 690, + 0, 537, 662, + 0, 567, 621, + 0, 604, 561, + 0, 650, 466, + 0, 705, 295, + 0, 770, 0, + 0, 843, 0, + 0, 927, 0, + 0, 1018, 0, + 0, 1118, 0, + 0, 1223, 0, + 0, 1335, 0, + 0, 1451, 0, + 0, 1571, 0, + 0, 1693, 0, + 0, 1818, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 500, 738, + 0, 519, 719, + 0, 543, 693, + 0, 572, 655, + 0, 610, 600, + 0, 655, 513, + 0, 709, 363, + 0, 773, 25, + 0, 846, 0, + 0, 929, 0, + 0, 1020, 0, + 0, 1119, 0, + 0, 1225, 0, + 0, 1336, 0, + 0, 1452, 0, + 0, 1571, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 509, 773, + 0, 527, 756, + 0, 550, 732, + 0, 580, 697, + 0, 616, 647, + 0, 661, 569, + 0, 715, 440, + 0, 778, 174, + 0, 850, 0, + 0, 932, 0, + 0, 1023, 0, + 0, 1121, 0, + 0, 1227, 0, + 0, 1337, 0, + 0, 1453, 0, + 0, 1572, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1946, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 66, 520, 816, + 0, 538, 801, + 0, 561, 779, + 0, 589, 748, + 0, 625, 703, + 0, 669, 635, + 0, 722, 525, + 0, 784, 318, + 0, 856, 0, + 0, 937, 0, + 0, 1027, 0, + 0, 1124, 0, + 0, 1229, 0, + 0, 1339, 0, + 0, 1454, 0, + 0, 1573, 0, + 0, 1695, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 429, 534, 868, + 379, 552, 854, + 302, 574, 835, + 173, 602, 808, + 0, 637, 769, + 0, 680, 711, + 0, 731, 620, + 0, 792, 459, + 0, 863, 78, + 0, 943, 0, + 0, 1031, 0, + 0, 1128, 0, + 0, 1232, 0, + 0, 1342, 0, + 0, 1456, 0, + 0, 1575, 0, + 0, 1696, 0, + 0, 1821, 0, + 0, 1947, 0, + 0, 2074, 0, + 0, 2203, 0, + 0, 2332, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 680, 553, 930, + 652, 570, 918, + 611, 591, 901, + 550, 618, 878, + 454, 652, 844, + 281, 693, 796, + 0, 743, 721, + 0, 803, 597, + 0, 872, 351, + 0, 950, 0, + 0, 1038, 0, + 0, 1133, 0, + 0, 1236, 0, + 0, 1345, 0, + 0, 1459, 0, + 0, 1577, 0, + 0, 1698, 0, + 0, 1822, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2203, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 884, 577, 1001, + 866, 593, 990, + 841, 613, 976, + 806, 639, 956, + 753, 671, 929, + 672, 711, 889, + 534, 759, 829, + 243, 817, 734, + 0, 884, 566, + 0, 960, 150, + 0, 1046, 0, + 0, 1140, 0, + 0, 1241, 0, + 0, 1349, 0, + 0, 1462, 0, + 0, 1579, 0, + 0, 1700, 0, + 0, 1823, 0, + 0, 1949, 0, + 0, 2076, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1063, 607, 1081, + 1051, 622, 1072, + 1035, 641, 1061, + 1012, 665, 1044, + 979, 696, 1022, + 932, 733, 989, + 859, 780, 942, + 739, 835, 870, + 505, 899, 751, + 0, 974, 520, + 0, 1057, 0, + 0, 1149, 0, + 0, 1249, 0, + 0, 1355, 0, + 0, 1466, 0, + 0, 1583, 0, + 0, 1702, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1228, 644, 1170, + 1219, 658, 1163, + 1208, 676, 1153, + 1193, 698, 1140, + 1171, 727, 1122, + 1140, 762, 1096, + 1096, 805, 1059, + 1029, 858, 1005, + 919, 919, 919, + 715, 991, 773, + 63, 1071, 450, + 0, 1161, 0, + 0, 1258, 0, + 0, 1362, 0, + 0, 1472, 0, + 0, 1587, 0, + 0, 1706, 0, + 0, 1828, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1383, 690, 1267, + 1377, 702, 1262, + 1369, 718, 1254, + 1358, 739, 1243, + 1343, 765, 1229, + 1322, 798, 1208, + 1293, 838, 1180, + 1250, 887, 1139, + 1187, 945, 1077, + 1084, 1013, 978, + 897, 1090, 801, + 377, 1176, 337, + 0, 1270, 0, + 0, 1372, 0, + 0, 1480, 0, + 0, 1593, 0, + 0, 1711, 0, + 0, 1831, 0, + 0, 1955, 0, + 0, 2080, 0, + 0, 2208, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1531, 745, 1371, + 1527, 756, 1367, + 1521, 770, 1361, + 1513, 788, 1352, + 1503, 812, 1341, + 1488, 841, 1325, + 1468, 878, 1303, + 1440, 923, 1272, + 1399, 977, 1227, + 1337, 1040, 1158, + 1239, 1113, 1047, + 1064, 1195, 835, + 609, 1286, 120, + 0, 1385, 0, + 0, 1490, 0, + 0, 1601, 0, + 0, 1717, 0, + 0, 1836, 0, + 0, 1958, 0, + 0, 2083, 0, + 0, 2210, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1675, 809, 1481, + 1672, 818, 1478, + 1668, 831, 1473, + 1662, 847, 1466, + 1655, 867, 1458, + 1644, 894, 1445, + 1630, 927, 1429, + 1610, 967, 1405, + 1582, 1016, 1372, + 1542, 1075, 1323, + 1483, 1143, 1249, + 1388, 1220, 1125, + 1220, 1307, 878, + 804, 1401, 0, + 0, 1503, 0, + 0, 1611, 0, + 0, 1725, 0, + 0, 1842, 0, + 0, 1963, 0, + 0, 2087, 0, + 0, 2212, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1816, 882, 1596, + 1813, 890, 1593, + 1810, 901, 1590, + 1806, 915, 1585, + 1801, 933, 1578, + 1793, 955, 1569, + 1783, 984, 1556, + 1769, 1020, 1538, + 1750, 1064, 1514, + 1722, 1117, 1478, + 1683, 1179, 1427, + 1625, 1251, 1347, + 1532, 1333, 1212, + 1369, 1422, 929, + 978, 1520, 0, + 0, 1625, 0, + 0, 1735, 0, + 0, 1850, 0, + 0, 1969, 0, + 0, 2092, 0, + 0, 2216, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1954, 965, 1715, + 1952, 972, 1713, + 1950, 981, 1710, + 1947, 992, 1706, + 1943, 1007, 1701, + 1938, 1027, 1694, + 1930, 1052, 1684, + 1920, 1083, 1671, + 1906, 1121, 1653, + 1887, 1168, 1627, + 1860, 1224, 1590, + 1821, 1290, 1536, + 1764, 1365, 1452, + 1673, 1449, 1307, + 1514, 1542, 989, + 1139, 1642, 0, + 0, 1749, 0, + 0, 1861, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2091, 1056, 1837, + 2090, 1062, 1835, + 2088, 1069, 1833, + 2086, 1079, 1830, + 2083, 1091, 1826, + 2079, 1108, 1821, + 2073, 1129, 1813, + 2066, 1155, 1803, + 2056, 1188, 1790, + 2042, 1229, 1771, + 2023, 1278, 1745, + 1997, 1337, 1707, + 1958, 1405, 1650, + 1901, 1483, 1562, + 1812, 1570, 1409, + 1655, 1664, 1059, + 1292, 1767, 0, + 0, 1875, 0, + 0, 1988, 0, + 0, 2106, 0, + 0, 2227, 0, + 0, 2351, 0, + 0, 2476, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2227, 1156, 1961, + 2226, 1160, 1960, + 2224, 1166, 1958, + 2223, 1174, 1956, + 2221, 1184, 1953, + 2218, 1197, 1949, + 2214, 1214, 1943, + 2208, 1236, 1936, + 2201, 1264, 1926, + 2191, 1299, 1912, + 2177, 1342, 1893, + 2158, 1393, 1866, + 2132, 1454, 1827, + 2094, 1524, 1769, + 2037, 1604, 1678, + 1948, 1693, 1517, + 1794, 1789, 1139, + 1439, 1893, 0, + 0, 2002, 0, + 0, 2117, 0, + 0, 2235, 0, + 0, 2357, 0, + 0, 2481, 0, + 0, 2607, 0, + 0, 2735, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 2361, 1261, 2087, + 2361, 1265, 2086, + 2360, 1270, 2085, + 2358, 1276, 2083, + 2357, 1284, 2081, + 2355, 1295, 2078, + 2352, 1309, 2074, + 2348, 1327, 2068, + 2342, 1349, 2061, + 2335, 1378, 2050, + 2325, 1415, 2036, + 2312, 1459, 2017, + 2293, 1512, 1989, + 2266, 1574, 1949, + 2228, 1646, 1890, + 2172, 1728, 1797, + 2084, 1818, 1631, + 1931, 1916, 1227, + 1581, 2021, 0, + 0, 2131, 0, + 0, 2246, 0, + 0, 2365, 0, + 0, 2488, 0, + 0, 2612, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2495, 1373, 2215, + 2495, 1376, 2214, + 2494, 1379, 2213, + 2493, 1384, 2212, + 2492, 1391, 2210, + 2490, 1399, 2208, + 2488, 1410, 2205, + 2485, 1424, 2201, + 2481, 1443, 2195, + 2476, 1467, 2187, + 2469, 1497, 2177, + 2459, 1534, 2163, + 2445, 1579, 2143, + 2427, 1634, 2115, + 2400, 1698, 2074, + 2362, 1771, 2014, + 2306, 1854, 1919, + 2219, 1945, 1749, + 2066, 2044, 1323, + 1721, 2149, 0, + 0, 2261, 0, + 0, 2376, 0, + 0, 2496, 0, + 0, 2619, 0, + 0, 2743, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3649, 0, + 2629, 1489, 2343, + 2628, 1491, 2343, + 2628, 1494, 2342, + 2627, 1497, 2341, + 2626, 1503, 2340, + 2625, 1509, 2338, + 2623, 1518, 2336, + 2621, 1529, 2333, + 2618, 1544, 2329, + 2614, 1563, 2323, + 2609, 1588, 2315, + 2602, 1618, 2305, + 2592, 1656, 2290, + 2579, 1703, 2270, + 2560, 1758, 2242, + 2534, 1823, 2201, + 2496, 1897, 2140, + 2440, 1981, 2043, + 2353, 2073, 1870, + 2201, 2173, 1427, + 1859, 2279, 0, + 0, 2391, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2762, 1608, 2473, + 2762, 1610, 2473, + 2761, 1612, 2472, + 2761, 1615, 2471, + 2760, 1619, 2470, + 2759, 1624, 2469, + 2758, 1631, 2467, + 2756, 1640, 2465, + 2754, 1652, 2462, + 2751, 1667, 2458, + 2747, 1686, 2452, + 2742, 1711, 2444, + 2735, 1742, 2434, + 2725, 1781, 2419, + 2712, 1828, 2399, + 2693, 1884, 2370, + 2667, 1950, 2329, + 2629, 2025, 2268, + 2573, 2109, 2170, + 2486, 2202, 1993, + 2335, 2302, 1536, + 1996, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 2895, 1731, 2603, + 2895, 1732, 2603, + 2894, 1734, 2602, + 2894, 1736, 2602, + 2893, 1739, 2601, + 2893, 1743, 2600, + 2892, 1748, 2599, + 2891, 1755, 2597, + 2889, 1764, 2595, + 2887, 1776, 2592, + 2884, 1791, 2587, + 2880, 1811, 2582, + 2875, 1836, 2574, + 2868, 1868, 2563, + 2858, 1907, 2549, + 2844, 1955, 2528, + 2826, 2012, 2500, + 2800, 2078, 2458, + 2762, 2154, 2396, + 2706, 2239, 2298, + 2619, 2332, 2119, + 2469, 2433, 1651, + 2131, 2540, 0, + 0, 2652, 0, + 0, 2769, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1856, 2734, + 3027, 1857, 2734, + 3027, 1858, 2733, + 3027, 1860, 2733, + 3027, 1862, 2732, + 3026, 1865, 2732, + 3025, 1869, 2731, + 3024, 1874, 2729, + 3023, 1881, 2728, + 3022, 1890, 2725, + 3019, 1902, 2722, + 3017, 1918, 2718, + 3013, 1938, 2712, + 3007, 1964, 2704, + 3000, 1996, 2694, + 2990, 2035, 2679, + 2977, 2083, 2658, + 2958, 2140, 2630, + 2932, 2207, 2588, + 2895, 2283, 2526, + 2839, 2369, 2426, + 2752, 2462, 2246, + 2602, 2563, 1769, + 2265, 2671, 0, + 0, 2784, 0, + 0, 2901, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1982, 2865, + 3160, 1983, 2865, + 3160, 1984, 2864, + 3160, 1985, 2864, + 3159, 1987, 2864, + 3159, 1989, 2863, + 3158, 1992, 2862, + 3158, 1996, 2861, + 3157, 2002, 2860, + 3156, 2009, 2858, + 3154, 2018, 2856, + 3152, 2030, 2853, + 3149, 2046, 2849, + 3145, 2066, 2843, + 3140, 2092, 2835, + 3133, 2124, 2824, + 3123, 2164, 2810, + 3109, 2212, 2789, + 3091, 2270, 2760, + 3065, 2337, 2719, + 3027, 2414, 2656, + 2972, 2499, 2556, + 2885, 2593, 2375, + 2735, 2695, 1890, + 2399, 2802, 0, + 0, 2915, 0, + 0, 3032, 0, + 0, 3153, 0, + 0, 3276, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3292, 2110, 2996, + 3292, 2111, 2996, + 3292, 2111, 2996, + 3292, 2112, 2996, + 3292, 2114, 2995, + 3292, 2116, 2995, + 3291, 2118, 2994, + 3291, 2121, 2994, + 3290, 2125, 2993, + 3289, 2130, 2991, + 3288, 2138, 2990, + 3286, 2147, 2987, + 3284, 2159, 2984, + 3281, 2175, 2980, + 3277, 2195, 2974, + 3272, 2221, 2966, + 3265, 2254, 2955, + 3255, 2294, 2941, + 3242, 2342, 2920, + 3223, 2400, 2891, + 3197, 2467, 2849, + 3160, 2544, 2787, + 3104, 2630, 2686, + 3018, 2724, 2504, + 2868, 2826, 2015, + 2533, 2934, 0, + 0, 3047, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 3425, 2239, 3128, + 3425, 2240, 3127, + 3425, 2240, 3127, + 3425, 2241, 3127, + 3424, 2242, 3127, + 3424, 2243, 3127, + 3424, 2245, 3126, + 3424, 2247, 3126, + 3423, 2250, 3125, + 3422, 2254, 3124, + 3421, 2260, 3123, + 3420, 2267, 3121, + 3419, 2276, 3119, + 3417, 2289, 3115, + 3414, 2305, 3111, + 3410, 2325, 3105, + 3404, 2351, 3097, + 3397, 2384, 3087, + 3387, 2424, 3072, + 3374, 2473, 3051, + 3355, 2531, 3022, + 3329, 2598, 2980, + 3292, 2675, 2918, + 3237, 2761, 2817, + 3150, 2856, 2634, + 3000, 2957, 2141, + 2666, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2369, 3259, + 3557, 2369, 3259, + 3557, 2370, 3259, + 3557, 2370, 3259, + 3557, 2371, 3259, + 3557, 2372, 3259, + 3556, 2373, 3258, + 3556, 2375, 3258, + 3556, 2377, 3257, + 3555, 2380, 3257, + 3555, 2385, 3256, + 3554, 2390, 3254, + 3553, 2397, 3252, + 3551, 2407, 3250, + 3549, 2419, 3247, + 3546, 2435, 3243, + 3542, 2456, 3237, + 3537, 2482, 3229, + 3529, 2514, 3218, + 3520, 2555, 3203, + 3506, 2604, 3183, + 3488, 2662, 3154, + 3462, 2729, 3112, + 3424, 2807, 3049, + 3369, 2893, 2948, + 3282, 2987, 2765, + 3133, 3089, 2268, + 2799, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3689, 2499, 3391, + 3689, 2499, 3391, + 3689, 2500, 3391, + 3689, 2500, 3391, + 3689, 2501, 3391, + 3689, 2501, 3390, + 3689, 2502, 3390, + 3689, 2504, 3390, + 3688, 2506, 3390, + 3688, 2508, 3389, + 3687, 2511, 3388, + 3687, 2515, 3387, + 3686, 2521, 3386, + 3685, 2528, 3384, + 3683, 2537, 3382, + 3681, 2550, 3379, + 3678, 2566, 3374, + 3674, 2586, 3369, + 3669, 2613, 3361, + 3662, 2645, 3350, + 3652, 2686, 3335, + 3639, 2735, 3314, + 3620, 2793, 3285, + 3594, 2861, 3243, + 3556, 2938, 3180, + 3501, 3024, 3079, + 3415, 3119, 2896, + 3265, 3221, 2397, + 2931, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3681, 0, + 3822, 2630, 3523, + 3822, 2630, 3523, + 3821, 2630, 3523, + 3821, 2631, 3523, + 3821, 2631, 3523, + 3821, 2632, 3522, + 3821, 2632, 3522, + 3821, 2633, 3522, + 3821, 2635, 3522, + 3821, 2637, 3521, + 3820, 2639, 3521, + 3820, 2642, 3520, + 3819, 2646, 3519, + 3818, 2652, 3518, + 3817, 2659, 3516, + 3815, 2668, 3514, + 3813, 2681, 3510, + 3810, 2697, 3506, + 3806, 2717, 3500, + 3801, 2744, 3492, + 3794, 2777, 3482, + 3784, 2817, 3467, + 3771, 2866, 3446, + 3752, 2925, 3417, + 3726, 2992, 3375, + 3689, 3070, 3312, + 3633, 3156, 3211, + 3547, 3251, 3027, + 3398, 3353, 2526, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2761, 3655, + 3954, 2761, 3655, + 3954, 2761, 3655, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3654, + 3953, 2765, 3654, + 3953, 2766, 3654, + 3953, 2768, 3653, + 3952, 2770, 3653, + 3952, 2773, 3652, + 3951, 2777, 3651, + 3950, 2783, 3650, + 3949, 2790, 3648, + 3947, 2800, 3645, + 3945, 2812, 3642, + 3942, 2828, 3638, + 3938, 2849, 3632, + 3933, 2875, 3624, + 3926, 2908, 3614, + 3916, 2949, 3599, + 3903, 2998, 3578, + 3884, 3056, 3549, + 3858, 3124, 3507, + 3821, 3202, 3444, + 3766, 3288, 3343, + 3679, 3383, 3158, + 3530, 3485, 2656, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2892, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2896, 3786, + 4085, 2897, 3786, + 4085, 2899, 3785, + 4084, 2902, 3785, + 4084, 2905, 3784, + 4083, 2909, 3783, + 4082, 2914, 3782, + 4081, 2922, 3780, + 4080, 2931, 3777, + 4077, 2944, 3774, + 4075, 2960, 3770, + 4071, 2980, 3764, + 4065, 3007, 3756, + 4058, 3040, 3745, + 4048, 3080, 3731, + 4035, 3130, 3710, + 4016, 3188, 3681, + 3990, 3256, 3639, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3515, 3290, + 3662, 3617, 2787, + 3328, 3725, 0, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3025, 3919, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3918, + 4095, 3029, 3918, + 4095, 3031, 3917, + 4095, 3033, 3917, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3046, 3914, + 4095, 3053, 3912, + 4095, 3063, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3112, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3863, + 4095, 3261, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3943, 3647, 3422, + 3794, 3749, 2918, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3161, 4050, + 4095, 3163, 4049, + 4095, 3165, 4049, + 4095, 3168, 4048, + 4095, 3172, 4047, + 4095, 3178, 4046, + 4095, 3185, 4044, + 4095, 3195, 4041, + 4095, 3207, 4038, + 4095, 3223, 4034, + 4095, 3244, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3995, + 4095, 3393, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3779, 3553, + 0, 606, 834, + 0, 621, 819, + 0, 640, 798, + 0, 664, 769, + 0, 695, 726, + 0, 733, 662, + 0, 779, 559, + 0, 834, 370, + 0, 899, 0, + 0, 973, 0, + 0, 1057, 0, + 0, 1149, 0, + 0, 1248, 0, + 0, 1355, 0, + 0, 1466, 0, + 0, 1583, 0, + 0, 1702, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 611, 856, + 0, 626, 842, + 0, 645, 822, + 0, 669, 794, + 0, 699, 753, + 0, 737, 693, + 0, 782, 598, + 0, 837, 427, + 0, 902, 2, + 0, 976, 0, + 0, 1059, 0, + 0, 1150, 0, + 0, 1250, 0, + 0, 1356, 0, + 0, 1467, 0, + 0, 1583, 0, + 0, 1703, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 618, 883, + 0, 632, 870, + 0, 651, 851, + 0, 675, 825, + 0, 705, 788, + 0, 742, 732, + 0, 787, 645, + 0, 841, 495, + 0, 905, 157, + 0, 979, 0, + 0, 1061, 0, + 0, 1152, 0, + 0, 1251, 0, + 0, 1357, 0, + 0, 1468, 0, + 0, 1584, 0, + 0, 1703, 0, + 0, 1826, 0, + 0, 1951, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 627, 918, + 0, 641, 905, + 0, 659, 888, + 0, 682, 864, + 0, 712, 829, + 0, 748, 779, + 0, 793, 702, + 0, 847, 572, + 0, 910, 306, + 0, 983, 0, + 0, 1064, 0, + 0, 1155, 0, + 0, 1253, 0, + 0, 1359, 0, + 0, 1469, 0, + 0, 1585, 0, + 0, 1704, 0, + 0, 1827, 0, + 0, 1951, 0, + 0, 2078, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 271, 638, 960, + 198, 652, 948, + 78, 670, 933, + 0, 693, 911, + 0, 721, 880, + 0, 757, 835, + 0, 801, 768, + 0, 854, 657, + 0, 916, 450, + 0, 988, 0, + 0, 1069, 0, + 0, 1159, 0, + 0, 1256, 0, + 0, 1361, 0, + 0, 1471, 0, + 0, 1586, 0, + 0, 1705, 0, + 0, 1827, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 595, 653, 1011, + 561, 667, 1000, + 511, 684, 986, + 434, 706, 967, + 305, 734, 940, + 43, 769, 901, + 0, 812, 843, + 0, 863, 752, + 0, 924, 591, + 0, 995, 210, + 0, 1075, 0, + 0, 1164, 0, + 0, 1260, 0, + 0, 1364, 0, + 0, 1474, 0, + 0, 1588, 0, + 0, 1707, 0, + 0, 1829, 0, + 0, 1953, 0, + 0, 2079, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2595, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 832, 672, 1071, + 812, 685, 1062, + 784, 702, 1050, + 743, 723, 1033, + 682, 750, 1010, + 586, 784, 976, + 413, 825, 928, + 0, 875, 853, + 0, 935, 729, + 0, 1004, 483, + 0, 1082, 0, + 0, 1170, 0, + 0, 1265, 0, + 0, 1368, 0, + 0, 1477, 0, + 0, 1591, 0, + 0, 1709, 0, + 0, 1830, 0, + 0, 1954, 0, + 0, 2080, 0, + 0, 2207, 0, + 0, 2335, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1029, 697, 1140, + 1016, 709, 1133, + 998, 725, 1122, + 973, 745, 1108, + 938, 771, 1089, + 885, 803, 1061, + 804, 843, 1021, + 666, 891, 961, + 375, 949, 866, + 0, 1016, 698, + 0, 1093, 282, + 0, 1178, 0, + 0, 1272, 0, + 0, 1374, 0, + 0, 1481, 0, + 0, 1594, 0, + 0, 1711, 0, + 0, 1832, 0, + 0, 1955, 0, + 0, 2081, 0, + 0, 2208, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1204, 728, 1220, + 1195, 739, 1213, + 1183, 754, 1205, + 1167, 773, 1193, + 1144, 797, 1176, + 1111, 828, 1154, + 1064, 866, 1121, + 991, 912, 1074, + 872, 967, 1002, + 637, 1032, 883, + 0, 1106, 652, + 0, 1189, 0, + 0, 1281, 0, + 0, 1381, 0, + 0, 1487, 0, + 0, 1599, 0, + 0, 1715, 0, + 0, 1835, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1366, 766, 1308, + 1360, 777, 1302, + 1352, 790, 1295, + 1340, 808, 1286, + 1325, 830, 1272, + 1303, 859, 1254, + 1272, 894, 1228, + 1228, 938, 1191, + 1161, 990, 1137, + 1052, 1052, 1052, + 847, 1123, 905, + 195, 1203, 583, + 0, 1293, 0, + 0, 1390, 0, + 0, 1494, 0, + 0, 1604, 0, + 0, 1719, 0, + 0, 1838, 0, + 0, 1960, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2727, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1519, 813, 1404, + 1515, 822, 1399, + 1509, 834, 1394, + 1501, 850, 1386, + 1490, 871, 1375, + 1475, 897, 1361, + 1454, 930, 1341, + 1425, 970, 1312, + 1383, 1019, 1271, + 1319, 1077, 1209, + 1216, 1145, 1110, + 1029, 1222, 933, + 509, 1308, 469, + 0, 1402, 0, + 0, 1504, 0, + 0, 1612, 0, + 0, 1725, 0, + 0, 1843, 0, + 0, 1963, 0, + 0, 2087, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1666, 868, 1507, + 1663, 877, 1504, + 1659, 888, 1499, + 1653, 902, 1493, + 1645, 920, 1484, + 1635, 944, 1473, + 1620, 973, 1457, + 1600, 1010, 1435, + 1572, 1055, 1404, + 1531, 1109, 1359, + 1469, 1172, 1290, + 1372, 1245, 1179, + 1196, 1327, 967, + 741, 1418, 252, + 0, 1517, 0, + 0, 1622, 0, + 0, 1733, 0, + 0, 1849, 0, + 0, 1968, 0, + 0, 2091, 0, + 0, 2215, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1809, 933, 1616, + 1807, 941, 1613, + 1804, 950, 1610, + 1800, 963, 1605, + 1794, 979, 1599, + 1787, 999, 1590, + 1776, 1026, 1578, + 1762, 1059, 1561, + 1742, 1099, 1537, + 1715, 1148, 1504, + 1675, 1207, 1455, + 1615, 1275, 1381, + 1520, 1352, 1257, + 1352, 1439, 1010, + 936, 1533, 0, + 0, 1635, 0, + 0, 1743, 0, + 0, 1857, 0, + 0, 1974, 0, + 0, 2095, 0, + 0, 2219, 0, + 0, 2344, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1949, 1008, 1730, + 1948, 1014, 1728, + 1946, 1022, 1725, + 1943, 1033, 1722, + 1938, 1047, 1717, + 1933, 1065, 1710, + 1925, 1088, 1701, + 1915, 1116, 1688, + 1901, 1152, 1670, + 1882, 1196, 1646, + 1855, 1249, 1610, + 1815, 1312, 1559, + 1757, 1383, 1479, + 1664, 1465, 1344, + 1501, 1555, 1061, + 1110, 1652, 0, + 0, 1757, 0, + 0, 1867, 0, + 0, 1983, 0, + 0, 2102, 0, + 0, 2224, 0, + 0, 2348, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2087, 1092, 1849, + 2086, 1097, 1847, + 2085, 1104, 1845, + 2082, 1113, 1842, + 2079, 1124, 1838, + 2075, 1140, 1833, + 2070, 1159, 1826, + 2062, 1184, 1816, + 2052, 1215, 1803, + 2039, 1254, 1785, + 2019, 1300, 1759, + 1992, 1357, 1722, + 1954, 1422, 1668, + 1896, 1497, 1584, + 1805, 1581, 1439, + 1646, 1674, 1121, + 1271, 1774, 0, + 0, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2224, 1184, 1970, + 2223, 1189, 1969, + 2222, 1194, 1967, + 2220, 1201, 1965, + 2218, 1211, 1962, + 2215, 1224, 1958, + 2211, 1240, 1953, + 2206, 1261, 1945, + 2198, 1287, 1936, + 2188, 1320, 1922, + 2175, 1361, 1903, + 2156, 1410, 1877, + 2129, 1469, 1839, + 2090, 1537, 1782, + 2033, 1615, 1694, + 1944, 1702, 1541, + 1787, 1797, 1191, + 1424, 1899, 0, + 0, 2007, 0, + 0, 2121, 0, + 0, 2238, 0, + 0, 2359, 0, + 0, 2483, 0, + 0, 2608, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2359, 1284, 2094, + 2359, 1288, 2093, + 2358, 1292, 2092, + 2357, 1298, 2090, + 2355, 1306, 2088, + 2353, 1316, 2085, + 2350, 1329, 2081, + 2346, 1346, 2075, + 2340, 1368, 2068, + 2333, 1396, 2058, + 2323, 1431, 2044, + 2309, 1474, 2025, + 2291, 1525, 1998, + 2264, 1586, 1959, + 2226, 1656, 1901, + 2169, 1736, 1810, + 2080, 1825, 1649, + 1926, 1921, 1271, + 1571, 2025, 0, + 0, 2135, 0, + 0, 2249, 0, + 0, 2368, 0, + 0, 2489, 0, + 0, 2613, 0, + 0, 2739, 0, + 0, 2867, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2494, 1391, 2220, + 2493, 1393, 2219, + 2493, 1397, 2218, + 2492, 1402, 2217, + 2491, 1408, 2215, + 2489, 1416, 2213, + 2487, 1427, 2210, + 2484, 1441, 2206, + 2480, 1459, 2200, + 2474, 1482, 2193, + 2467, 1511, 2183, + 2457, 1547, 2168, + 2444, 1591, 2149, + 2425, 1644, 2121, + 2398, 1706, 2082, + 2361, 1779, 2022, + 2304, 1860, 1929, + 2216, 1950, 1763, + 2063, 2048, 1359, + 1714, 2153, 0, + 0, 2263, 0, + 0, 2378, 0, + 0, 2498, 0, + 0, 2620, 0, + 0, 2744, 0, + 0, 2871, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2628, 1503, 2347, + 2627, 1505, 2347, + 2627, 1508, 2346, + 2626, 1511, 2345, + 2625, 1516, 2344, + 2624, 1523, 2342, + 2622, 1531, 2340, + 2620, 1542, 2337, + 2617, 1557, 2333, + 2613, 1575, 2327, + 2608, 1599, 2319, + 2601, 1629, 2309, + 2591, 1666, 2295, + 2577, 1711, 2275, + 2559, 1766, 2247, + 2532, 1830, 2207, + 2495, 1903, 2146, + 2438, 1986, 2051, + 2351, 2077, 1881, + 2199, 2176, 1456, + 1853, 2281, 0, + 0, 2393, 0, + 0, 2509, 0, + 0, 2628, 0, + 0, 2751, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3650, 0, + 2761, 1619, 2476, + 2761, 1621, 2476, + 2760, 1623, 2475, + 2760, 1626, 2474, + 2759, 1630, 2473, + 2758, 1635, 2472, + 2757, 1641, 2470, + 2756, 1650, 2468, + 2753, 1661, 2465, + 2750, 1676, 2461, + 2747, 1695, 2455, + 2741, 1720, 2447, + 2734, 1750, 2437, + 2724, 1788, 2422, + 2711, 1835, 2402, + 2692, 1890, 2374, + 2666, 1955, 2333, + 2628, 2029, 2272, + 2572, 2113, 2176, + 2485, 2205, 2002, + 2333, 2305, 1559, + 1991, 2411, 0, + 0, 2523, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 2894, 1739, 2605, + 2894, 1740, 2605, + 2894, 1742, 2605, + 2893, 1744, 2604, + 2893, 1747, 2603, + 2892, 1751, 2602, + 2891, 1756, 2601, + 2890, 1763, 2599, + 2888, 1772, 2597, + 2886, 1784, 2594, + 2883, 1799, 2590, + 2879, 1818, 2584, + 2874, 1843, 2576, + 2867, 1874, 2566, + 2857, 1913, 2551, + 2844, 1960, 2531, + 2825, 2016, 2502, + 2799, 2082, 2461, + 2761, 2157, 2400, + 2705, 2241, 2302, + 2618, 2334, 2125, + 2468, 2434, 1668, + 2128, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3027, 1862, 2735, + 3027, 1863, 2735, + 3027, 1864, 2735, + 3026, 1866, 2735, + 3026, 1868, 2734, + 3026, 1871, 2733, + 3025, 1875, 2732, + 3024, 1880, 2731, + 3023, 1887, 2729, + 3021, 1896, 2727, + 3019, 1908, 2724, + 3016, 1924, 2720, + 3012, 1943, 2714, + 3007, 1969, 2706, + 3000, 2000, 2695, + 2990, 2039, 2681, + 2976, 2087, 2660, + 2958, 2144, 2632, + 2932, 2210, 2590, + 2894, 2286, 2528, + 2838, 2371, 2430, + 2752, 2464, 2251, + 2601, 2565, 1783, + 2263, 2672, 0, + 0, 2784, 0, + 0, 2901, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1987, 2866, + 3160, 1988, 2866, + 3159, 1989, 2866, + 3159, 1990, 2865, + 3159, 1992, 2865, + 3159, 1994, 2864, + 3158, 1997, 2864, + 3157, 2001, 2863, + 3157, 2006, 2861, + 3155, 2013, 2860, + 3154, 2023, 2857, + 3152, 2035, 2854, + 3149, 2050, 2850, + 3145, 2070, 2844, + 3139, 2096, 2836, + 3132, 2128, 2826, + 3122, 2167, 2811, + 3109, 2215, 2791, + 3090, 2272, 2762, + 3064, 2339, 2720, + 3027, 2415, 2658, + 2971, 2501, 2558, + 2884, 2594, 2378, + 2734, 2696, 1901, + 2397, 2803, 0, + 0, 2916, 0, + 0, 3033, 0, + 0, 3153, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3292, 2114, 2997, + 3292, 2114, 2997, + 3292, 2115, 2997, + 3292, 2116, 2997, + 3292, 2117, 2996, + 3291, 2119, 2996, + 3291, 2121, 2995, + 3291, 2124, 2995, + 3290, 2128, 2994, + 3289, 2134, 2992, + 3288, 2141, 2990, + 3286, 2150, 2988, + 3284, 2162, 2985, + 3281, 2178, 2981, + 3277, 2198, 2975, + 3272, 2224, 2967, + 3265, 2256, 2956, + 3255, 2296, 2942, + 3241, 2344, 2921, + 3223, 2402, 2892, + 3197, 2469, 2851, + 3159, 2546, 2788, + 3104, 2631, 2688, + 3017, 2725, 2507, + 2867, 2827, 2023, + 2531, 2934, 0, + 0, 3047, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 3425, 2242, 3128, + 3425, 2242, 3128, + 3425, 2243, 3128, + 3424, 2244, 3128, + 3424, 2245, 3128, + 3424, 2246, 3127, + 3424, 2248, 3127, + 3423, 2250, 3126, + 3423, 2253, 3126, + 3422, 2257, 3125, + 3421, 2262, 3123, + 3420, 2270, 3122, + 3418, 2279, 3119, + 3416, 2291, 3116, + 3413, 2307, 3112, + 3410, 2327, 3106, + 3404, 2353, 3098, + 3397, 2386, 3087, + 3387, 2426, 3073, + 3374, 2474, 3052, + 3355, 2532, 3023, + 3329, 2600, 2981, + 3292, 2676, 2919, + 3236, 2762, 2818, + 3150, 2856, 2636, + 3000, 2958, 2147, + 2665, 3066, 0, + 0, 3179, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2371, 3260, + 3557, 2371, 3260, + 3557, 2372, 3260, + 3557, 2372, 3259, + 3557, 2373, 3259, + 3557, 2374, 3259, + 3556, 2375, 3259, + 3556, 2377, 3258, + 3556, 2379, 3258, + 3555, 2382, 3257, + 3554, 2387, 3256, + 3554, 2392, 3255, + 3552, 2399, 3253, + 3551, 2409, 3251, + 3549, 2421, 3247, + 3546, 2437, 3243, + 3542, 2457, 3237, + 3537, 2483, 3230, + 3529, 2516, 3219, + 3520, 2556, 3204, + 3506, 2605, 3183, + 3488, 2663, 3154, + 3461, 2730, 3113, + 3424, 2807, 3050, + 3369, 2894, 2949, + 3282, 2988, 2766, + 3133, 3090, 2273, + 2798, 3197, 0, + 0, 3311, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3689, 2501, 3391, + 3689, 2501, 3391, + 3689, 2501, 3391, + 3689, 2502, 3391, + 3689, 2502, 3391, + 3689, 2503, 3391, + 3689, 2504, 3391, + 3689, 2505, 3390, + 3688, 2507, 3390, + 3688, 2509, 3389, + 3687, 2513, 3389, + 3687, 2517, 3388, + 3686, 2522, 3386, + 3685, 2529, 3385, + 3683, 2539, 3382, + 3681, 2551, 3379, + 3678, 2567, 3375, + 3674, 2588, 3369, + 3669, 2614, 3361, + 3662, 2646, 3350, + 3652, 2687, 3336, + 3638, 2736, 3315, + 3620, 2794, 3286, + 3594, 2862, 3244, + 3556, 2939, 3181, + 3501, 3025, 3080, + 3414, 3119, 2897, + 3265, 3221, 2400, + 2931, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3681, 0, + 3821, 2631, 3523, + 3821, 2631, 3523, + 3821, 2632, 3523, + 3821, 2632, 3523, + 3821, 2632, 3523, + 3821, 2633, 3523, + 3821, 2634, 3523, + 3821, 2635, 3522, + 3821, 2636, 3522, + 3820, 2638, 3522, + 3820, 2640, 3521, + 3820, 2643, 3520, + 3819, 2647, 3519, + 3818, 2653, 3518, + 3817, 2660, 3516, + 3815, 2669, 3514, + 3813, 2682, 3511, + 3810, 2698, 3506, + 3806, 2718, 3501, + 3801, 2745, 3493, + 3794, 2777, 3482, + 3784, 2818, 3467, + 3771, 2867, 3447, + 3752, 2925, 3418, + 3726, 2993, 3375, + 3689, 3070, 3312, + 3633, 3157, 3211, + 3547, 3251, 3028, + 3397, 3353, 2529, + 3063, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2763, 3655, + 3953, 2763, 3655, + 3953, 2764, 3655, + 3953, 2765, 3654, + 3953, 2766, 3654, + 3953, 2767, 3654, + 3953, 2769, 3653, + 3952, 2771, 3653, + 3952, 2774, 3652, + 3951, 2778, 3651, + 3950, 2784, 3650, + 3949, 2791, 3648, + 3947, 2800, 3646, + 3945, 2813, 3643, + 3942, 2829, 3638, + 3938, 2850, 3632, + 3933, 2876, 3625, + 3926, 2909, 3614, + 3916, 2949, 3599, + 3903, 2998, 3578, + 3884, 3057, 3549, + 3858, 3125, 3507, + 3821, 3202, 3444, + 3765, 3288, 3343, + 3679, 3383, 3159, + 3530, 3485, 2658, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2895, 3786, + 4085, 2896, 3786, + 4085, 2897, 3786, + 4085, 2898, 3786, + 4085, 2900, 3785, + 4084, 2902, 3785, + 4084, 2905, 3784, + 4083, 2909, 3783, + 4082, 2915, 3782, + 4081, 2922, 3780, + 4080, 2932, 3778, + 4077, 2944, 3774, + 4074, 2960, 3770, + 4071, 2981, 3764, + 4065, 3007, 3756, + 4058, 3040, 3746, + 4048, 3081, 3731, + 4035, 3130, 3710, + 4016, 3188, 3681, + 3990, 3256, 3639, + 3953, 3334, 3576, + 3898, 3420, 3475, + 3811, 3515, 3290, + 3662, 3617, 2788, + 3328, 3725, 0, + 4095, 3024, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3026, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3918, + 4095, 3030, 3918, + 4095, 3031, 3917, + 4095, 3034, 3917, + 4095, 3037, 3916, + 4095, 3041, 3915, + 4095, 3046, 3914, + 4095, 3054, 3912, + 4095, 3063, 3910, + 4095, 3076, 3906, + 4095, 3092, 3902, + 4095, 3113, 3896, + 4095, 3139, 3888, + 4095, 3172, 3878, + 4095, 3212, 3863, + 4095, 3262, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3466, 3708, + 4030, 3552, 3606, + 3943, 3647, 3422, + 3794, 3749, 2919, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3158, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4050, + 4095, 3161, 4050, + 4095, 3163, 4049, + 4095, 3165, 4049, + 4095, 3168, 4048, + 4095, 3173, 4047, + 4095, 3178, 4046, + 4095, 3185, 4044, + 4095, 3195, 4041, + 4095, 3207, 4038, + 4095, 3224, 4034, + 4095, 3244, 4028, + 4095, 3271, 4020, + 4095, 3304, 4009, + 4095, 3344, 3995, + 4095, 3393, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3779, 3554, + 0, 723, 961, + 0, 734, 949, + 0, 749, 934, + 0, 769, 912, + 0, 793, 881, + 0, 824, 837, + 0, 862, 769, + 0, 908, 660, + 0, 964, 453, + 0, 1029, 0, + 0, 1104, 0, + 0, 1187, 0, + 0, 1280, 0, + 0, 1380, 0, + 0, 1486, 0, + 0, 1598, 0, + 0, 1714, 0, + 0, 1834, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 727, 977, + 0, 738, 966, + 0, 753, 951, + 0, 772, 930, + 0, 796, 901, + 0, 827, 858, + 0, 865, 794, + 0, 911, 691, + 0, 966, 502, + 0, 1031, 0, + 0, 1105, 0, + 0, 1189, 0, + 0, 1281, 0, + 0, 1380, 0, + 0, 1487, 0, + 0, 1598, 0, + 0, 1715, 0, + 0, 1835, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 732, 998, + 0, 743, 988, + 0, 758, 974, + 0, 777, 954, + 0, 801, 926, + 0, 831, 886, + 0, 869, 825, + 0, 915, 730, + 0, 969, 560, + 0, 1034, 134, + 0, 1108, 0, + 0, 1191, 0, + 0, 1282, 0, + 0, 1382, 0, + 0, 1488, 0, + 0, 1599, 0, + 0, 1715, 0, + 0, 1835, 0, + 0, 1958, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 739, 1025, + 0, 750, 1015, + 0, 764, 1002, + 0, 783, 983, + 0, 807, 957, + 0, 837, 920, + 0, 874, 864, + 0, 919, 777, + 0, 973, 627, + 0, 1037, 289, + 0, 1111, 0, + 0, 1193, 0, + 0, 1284, 0, + 0, 1383, 0, + 0, 1489, 0, + 0, 1600, 0, + 0, 1716, 0, + 0, 1836, 0, + 0, 1958, 0, + 0, 2083, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 748, 1059, + 0, 759, 1050, + 0, 773, 1037, + 0, 791, 1020, + 0, 815, 996, + 0, 844, 962, + 0, 880, 911, + 0, 925, 834, + 0, 979, 704, + 0, 1042, 438, + 0, 1115, 0, + 0, 1197, 0, + 0, 1287, 0, + 0, 1386, 0, + 0, 1491, 0, + 0, 1602, 0, + 0, 1717, 0, + 0, 1836, 0, + 0, 1959, 0, + 0, 2083, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 450, 760, 1100, + 403, 770, 1092, + 330, 784, 1080, + 210, 802, 1065, + 0, 825, 1043, + 0, 853, 1012, + 0, 889, 967, + 0, 933, 900, + 0, 986, 790, + 0, 1048, 582, + 0, 1120, 0, + 0, 1201, 0, + 0, 1291, 0, + 0, 1388, 0, + 0, 1493, 0, + 0, 1603, 0, + 0, 1718, 0, + 0, 1837, 0, + 0, 1960, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 751, 775, 1150, + 727, 785, 1143, + 693, 799, 1132, + 643, 816, 1119, + 566, 838, 1099, + 437, 866, 1072, + 175, 901, 1033, + 0, 944, 975, + 0, 995, 884, + 0, 1056, 723, + 0, 1127, 342, + 0, 1207, 0, + 0, 1296, 0, + 0, 1392, 0, + 0, 1496, 0, + 0, 1606, 0, + 0, 1720, 0, + 0, 1839, 0, + 0, 1961, 0, + 0, 2085, 0, + 0, 2211, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 978, 795, 1209, + 964, 805, 1203, + 944, 817, 1194, + 916, 834, 1182, + 875, 855, 1165, + 814, 882, 1142, + 718, 916, 1108, + 545, 957, 1060, + 108, 1008, 985, + 0, 1067, 862, + 0, 1136, 615, + 0, 1215, 0, + 0, 1302, 0, + 0, 1397, 0, + 0, 1500, 0, + 0, 1609, 0, + 0, 1723, 0, + 0, 1841, 0, + 0, 1962, 0, + 0, 2086, 0, + 0, 2212, 0, + 0, 2339, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1170, 820, 1278, + 1161, 829, 1273, + 1148, 841, 1265, + 1130, 857, 1255, + 1105, 877, 1240, + 1070, 903, 1221, + 1017, 935, 1193, + 936, 975, 1153, + 798, 1023, 1093, + 507, 1081, 998, + 0, 1148, 830, + 0, 1225, 414, + 0, 1310, 0, + 0, 1404, 0, + 0, 1506, 0, + 0, 1613, 0, + 0, 1726, 0, + 0, 1843, 0, + 0, 1964, 0, + 0, 2087, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1343, 851, 1356, + 1336, 860, 1352, + 1327, 871, 1345, + 1316, 886, 1337, + 1299, 905, 1325, + 1276, 929, 1308, + 1244, 960, 1286, + 1196, 998, 1253, + 1123, 1044, 1206, + 1004, 1099, 1134, + 769, 1164, 1015, + 0, 1238, 784, + 0, 1321, 0, + 0, 1413, 0, + 0, 1513, 0, + 0, 1619, 0, + 0, 1731, 0, + 0, 1847, 0, + 0, 1967, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1502, 890, 1444, + 1498, 898, 1440, + 1492, 909, 1434, + 1484, 922, 1427, + 1472, 940, 1418, + 1457, 962, 1404, + 1435, 991, 1386, + 1405, 1026, 1360, + 1360, 1070, 1323, + 1293, 1122, 1269, + 1184, 1184, 1184, + 979, 1255, 1037, + 327, 1335, 715, + 0, 1425, 0, + 0, 1522, 0, + 0, 1626, 0, + 0, 1736, 0, + 0, 1851, 0, + 0, 1970, 0, + 0, 2092, 0, + 0, 2216, 0, + 0, 2343, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1654, 938, 1539, + 1651, 945, 1536, + 1647, 954, 1532, + 1641, 967, 1526, + 1633, 982, 1518, + 1622, 1003, 1507, + 1607, 1029, 1493, + 1586, 1062, 1473, + 1557, 1102, 1444, + 1515, 1151, 1403, + 1451, 1209, 1341, + 1349, 1277, 1243, + 1161, 1354, 1065, + 641, 1440, 601, + 0, 1534, 0, + 0, 1636, 0, + 0, 1744, 0, + 0, 1857, 0, + 0, 1975, 0, + 0, 2096, 0, + 0, 2219, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1801, 994, 1642, + 1798, 1000, 1639, + 1795, 1009, 1636, + 1791, 1020, 1631, + 1785, 1034, 1625, + 1778, 1052, 1617, + 1767, 1076, 1605, + 1752, 1105, 1589, + 1732, 1142, 1567, + 1704, 1187, 1536, + 1663, 1241, 1491, + 1601, 1304, 1423, + 1504, 1377, 1311, + 1328, 1459, 1099, + 874, 1550, 384, + 0, 1649, 0, + 0, 1754, 0, + 0, 1865, 0, + 0, 1981, 0, + 0, 2100, 0, + 0, 2223, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1943, 1060, 1750, + 1941, 1066, 1748, + 1939, 1073, 1746, + 1936, 1082, 1742, + 1932, 1095, 1737, + 1926, 1111, 1731, + 1919, 1132, 1722, + 1908, 1158, 1710, + 1894, 1191, 1693, + 1874, 1231, 1670, + 1847, 1281, 1636, + 1807, 1339, 1587, + 1747, 1407, 1513, + 1652, 1484, 1389, + 1484, 1571, 1142, + 1068, 1665, 0, + 0, 1767, 0, + 0, 1876, 0, + 0, 1989, 0, + 0, 2106, 0, + 0, 2227, 0, + 0, 2351, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2083, 1136, 1864, + 2082, 1140, 1862, + 2080, 1146, 1860, + 2078, 1155, 1858, + 2075, 1165, 1854, + 2071, 1179, 1849, + 2065, 1197, 1842, + 2058, 1220, 1833, + 2047, 1249, 1820, + 2033, 1284, 1802, + 2014, 1328, 1778, + 1987, 1381, 1743, + 1947, 1444, 1691, + 1889, 1516, 1611, + 1796, 1597, 1476, + 1633, 1687, 1193, + 1242, 1784, 0, + 0, 1889, 0, + 0, 1999, 0, + 0, 2115, 0, + 0, 2234, 0, + 0, 2356, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 2221, 1220, 1982, + 2220, 1224, 1981, + 2218, 1229, 1979, + 2217, 1236, 1977, + 2214, 1245, 1974, + 2211, 1257, 1970, + 2207, 1272, 1965, + 2202, 1291, 1958, + 2195, 1316, 1948, + 2185, 1347, 1935, + 2171, 1386, 1917, + 2151, 1433, 1891, + 2124, 1489, 1854, + 2086, 1554, 1800, + 2028, 1629, 1716, + 1937, 1713, 1571, + 1778, 1806, 1253, + 1403, 1906, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2357, 1313, 2103, + 2356, 1316, 2102, + 2355, 1321, 2101, + 2354, 1326, 2099, + 2352, 1334, 2097, + 2350, 1343, 2094, + 2347, 1356, 2090, + 2343, 1372, 2085, + 2338, 1393, 2078, + 2330, 1419, 2068, + 2320, 1452, 2054, + 2307, 1493, 2035, + 2288, 1543, 2009, + 2261, 1601, 1971, + 2222, 1669, 1915, + 2165, 1747, 1826, + 2076, 1834, 1673, + 1919, 1929, 1323, + 1556, 2031, 0, + 0, 2139, 0, + 0, 2253, 0, + 0, 2370, 0, + 0, 2491, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2492, 1414, 2227, + 2491, 1416, 2226, + 2491, 1420, 2225, + 2490, 1424, 2224, + 2489, 1430, 2222, + 2487, 1438, 2220, + 2485, 1448, 2217, + 2482, 1461, 2213, + 2478, 1479, 2208, + 2472, 1501, 2200, + 2465, 1528, 2190, + 2455, 1563, 2176, + 2442, 1606, 2157, + 2423, 1657, 2130, + 2396, 1718, 2091, + 2358, 1788, 2033, + 2301, 1868, 1942, + 2213, 1957, 1782, + 2058, 2053, 1403, + 1703, 2157, 0, + 0, 2267, 0, + 0, 2381, 0, + 0, 2500, 0, + 0, 2621, 0, + 0, 2745, 0, + 0, 2871, 0, + 0, 2999, 0, + 0, 3128, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2626, 1521, 2353, + 2626, 1523, 2352, + 2625, 1526, 2351, + 2625, 1529, 2350, + 2624, 1534, 2349, + 2623, 1540, 2347, + 2621, 1548, 2345, + 2619, 1559, 2342, + 2616, 1573, 2338, + 2612, 1591, 2332, + 2607, 1614, 2325, + 2599, 1643, 2315, + 2589, 1679, 2301, + 2576, 1723, 2281, + 2557, 1776, 2253, + 2531, 1839, 2214, + 2493, 1911, 2154, + 2436, 1992, 2061, + 2348, 2082, 1895, + 2195, 2180, 1491, + 1846, 2285, 0, + 0, 2395, 0, + 0, 2511, 0, + 0, 2630, 0, + 0, 2752, 0, + 0, 2876, 0, + 0, 3003, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2760, 1633, 2480, + 2760, 1635, 2479, + 2759, 1637, 2479, + 2759, 1640, 2478, + 2758, 1643, 2477, + 2757, 1648, 2476, + 2756, 1655, 2474, + 2755, 1663, 2472, + 2752, 1674, 2469, + 2749, 1689, 2465, + 2745, 1707, 2459, + 2740, 1731, 2451, + 2733, 1761, 2441, + 2723, 1798, 2427, + 2710, 1843, 2407, + 2691, 1898, 2379, + 2664, 1962, 2339, + 2627, 2035, 2278, + 2571, 2118, 2183, + 2483, 2209, 2013, + 2331, 2308, 1588, + 1986, 2414, 0, + 0, 2525, 0, + 0, 2641, 0, + 0, 2760, 0, + 0, 2883, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2893, 1750, 2608, + 2893, 1751, 2608, + 2893, 1753, 2608, + 2893, 1755, 2607, + 2892, 1758, 2606, + 2891, 1762, 2605, + 2891, 1767, 2604, + 2889, 1773, 2602, + 2888, 1782, 2600, + 2886, 1793, 2597, + 2883, 1808, 2593, + 2879, 1827, 2587, + 2873, 1852, 2579, + 2866, 1882, 2569, + 2856, 1920, 2554, + 2843, 1967, 2534, + 2824, 2022, 2506, + 2798, 2087, 2465, + 2760, 2161, 2404, + 2704, 2245, 2308, + 2617, 2337, 2134, + 2465, 2437, 1691, + 2123, 2543, 0, + 0, 2655, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3652, 0, + 3026, 1870, 2738, + 3026, 1871, 2737, + 3026, 1873, 2737, + 3026, 1874, 2737, + 3025, 1876, 2736, + 3025, 1879, 2735, + 3024, 1883, 2735, + 3023, 1888, 2733, + 3022, 1895, 2732, + 3021, 1904, 2729, + 3018, 1916, 2726, + 3015, 1931, 2722, + 3012, 1950, 2716, + 3006, 1975, 2708, + 2999, 2006, 2698, + 2989, 2045, 2683, + 2976, 2092, 2663, + 2957, 2148, 2635, + 2931, 2214, 2593, + 2893, 2289, 2532, + 2838, 2373, 2434, + 2750, 2466, 2258, + 2600, 2567, 1800, + 2260, 2673, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 3159, 1993, 2868, + 3159, 1994, 2868, + 3159, 1995, 2867, + 3159, 1996, 2867, + 3159, 1998, 2867, + 3158, 2000, 2866, + 3158, 2003, 2865, + 3157, 2007, 2864, + 3156, 2012, 2863, + 3155, 2019, 2861, + 3153, 2028, 2859, + 3151, 2040, 2856, + 3148, 2056, 2852, + 3144, 2075, 2846, + 3139, 2101, 2838, + 3132, 2132, 2827, + 3122, 2172, 2813, + 3109, 2219, 2793, + 3090, 2276, 2764, + 3064, 2342, 2723, + 3026, 2418, 2661, + 2971, 2503, 2562, + 2884, 2596, 2383, + 2733, 2697, 1915, + 2395, 2804, 0, + 0, 2917, 0, + 0, 3033, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3292, 2119, 2998, + 3292, 2119, 2998, + 3292, 2120, 2998, + 3292, 2121, 2998, + 3291, 2122, 2997, + 3291, 2124, 2997, + 3291, 2126, 2997, + 3290, 2129, 2996, + 3290, 2133, 2995, + 3289, 2138, 2994, + 3287, 2145, 2992, + 3286, 2155, 2989, + 3284, 2167, 2986, + 3281, 2182, 2982, + 3277, 2202, 2976, + 3272, 2228, 2968, + 3264, 2260, 2958, + 3255, 2299, 2943, + 3241, 2347, 2923, + 3222, 2405, 2894, + 3196, 2471, 2852, + 3159, 2548, 2790, + 3103, 2633, 2691, + 3017, 2727, 2510, + 2866, 2828, 2033, + 2530, 2935, 0, + 0, 3048, 0, + 0, 3165, 0, + 0, 3285, 0, + 0, 3409, 0, + 0, 3534, 0, + 0, 3661, 0, + 3424, 2246, 3129, + 3424, 2246, 3129, + 3424, 2246, 3129, + 3424, 2247, 3129, + 3424, 2248, 3129, + 3424, 2249, 3128, + 3424, 2251, 3128, + 3423, 2253, 3127, + 3423, 2257, 3127, + 3422, 2261, 3126, + 3421, 2266, 3124, + 3420, 2273, 3123, + 3418, 2282, 3120, + 3416, 2294, 3117, + 3413, 2310, 3113, + 3409, 2330, 3107, + 3404, 2356, 3099, + 3397, 2388, 3088, + 3387, 2428, 3074, + 3374, 2477, 3053, + 3355, 2534, 3024, + 3329, 2601, 2983, + 3291, 2678, 2920, + 3236, 2763, 2820, + 3149, 2857, 2639, + 2999, 2959, 2155, + 2663, 3066, 0, + 0, 3179, 0, + 0, 3297, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2374, 3260, + 3557, 2374, 3260, + 3557, 2374, 3260, + 3557, 2375, 3260, + 3556, 2376, 3260, + 3556, 2377, 3260, + 3556, 2378, 3259, + 3556, 2380, 3259, + 3555, 2382, 3259, + 3555, 2385, 3258, + 3554, 2389, 3257, + 3553, 2395, 3255, + 3552, 2402, 3254, + 3551, 2411, 3251, + 3548, 2423, 3248, + 3546, 2439, 3244, + 3542, 2459, 3238, + 3536, 2485, 3230, + 3529, 2518, 3220, + 3519, 2558, 3205, + 3506, 2607, 3184, + 3487, 2664, 3155, + 3461, 2732, 3114, + 3424, 2808, 3051, + 3368, 2894, 2950, + 3282, 2989, 2768, + 3132, 3090, 2279, + 2797, 3198, 0, + 0, 3311, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3689, 2503, 3392, + 3689, 2503, 3392, + 3689, 2503, 3392, + 3689, 2504, 3392, + 3689, 2504, 3392, + 3689, 2505, 3391, + 3689, 2506, 3391, + 3688, 2507, 3391, + 3688, 2509, 3390, + 3688, 2511, 3390, + 3687, 2515, 3389, + 3687, 2519, 3388, + 3686, 2524, 3387, + 3684, 2531, 3385, + 3683, 2541, 3383, + 3681, 2553, 3380, + 3678, 2569, 3375, + 3674, 2589, 3369, + 3669, 2615, 3362, + 3661, 2648, 3351, + 3652, 2688, 3336, + 3638, 2737, 3316, + 3620, 2795, 3287, + 3594, 2863, 3245, + 3556, 2940, 3182, + 3501, 3026, 3081, + 3414, 3120, 2898, + 3265, 3222, 2405, + 2930, 3330, 0, + 0, 3443, 0, + 0, 3560, 0, + 0, 3681, 0, + 3821, 2633, 3524, + 3821, 2633, 3523, + 3821, 2633, 3523, + 3821, 2633, 3523, + 3821, 2634, 3523, + 3821, 2634, 3523, + 3821, 2635, 3523, + 3821, 2636, 3523, + 3821, 2637, 3522, + 3820, 2639, 3522, + 3820, 2642, 3521, + 3819, 2645, 3521, + 3819, 2649, 3520, + 3818, 2654, 3518, + 3817, 2661, 3517, + 3815, 2671, 3514, + 3813, 2683, 3511, + 3810, 2699, 3507, + 3806, 2720, 3501, + 3801, 2746, 3493, + 3794, 2779, 3482, + 3784, 2819, 3468, + 3770, 2868, 3447, + 3752, 2926, 3418, + 3726, 2994, 3376, + 3688, 3071, 3313, + 3633, 3157, 3212, + 3547, 3252, 3029, + 3397, 3353, 2532, + 3063, 3461, 0, + 0, 3575, 0, + 0, 3692, 0, + 3954, 2763, 3655, + 3954, 2763, 3655, + 3954, 2763, 3655, + 3954, 2764, 3655, + 3953, 2764, 3655, + 3953, 2764, 3655, + 3953, 2765, 3655, + 3953, 2766, 3655, + 3953, 2767, 3654, + 3953, 2768, 3654, + 3953, 2770, 3654, + 3952, 2772, 3653, + 3952, 2775, 3652, + 3951, 2779, 3651, + 3950, 2785, 3650, + 3949, 2792, 3648, + 3947, 2802, 3646, + 3945, 2814, 3643, + 3942, 2830, 3639, + 3938, 2851, 3633, + 3933, 2877, 3625, + 3926, 2910, 3614, + 3916, 2950, 3599, + 3903, 2999, 3579, + 3884, 3057, 3550, + 3858, 3125, 3508, + 3821, 3202, 3444, + 3765, 3289, 3344, + 3679, 3383, 3160, + 3529, 3485, 2661, + 3195, 3593, 0, + 0, 3706, 0, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4085, 2896, 3787, + 4085, 2897, 3786, + 4085, 2898, 3786, + 4085, 2899, 3786, + 4085, 2901, 3786, + 4084, 2903, 3785, + 4084, 2906, 3784, + 4083, 2910, 3783, + 4082, 2916, 3782, + 4081, 2923, 3780, + 4079, 2933, 3778, + 4077, 2945, 3775, + 4074, 2961, 3770, + 4071, 2982, 3765, + 4065, 3008, 3757, + 4058, 3041, 3746, + 4048, 3081, 3731, + 4035, 3130, 3710, + 4016, 3189, 3681, + 3990, 3257, 3639, + 3953, 3334, 3576, + 3898, 3420, 3475, + 3811, 3515, 3291, + 3662, 3617, 2790, + 3328, 3725, 0, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3028, 3918, + 4095, 3029, 3918, + 4095, 3030, 3918, + 4095, 3032, 3917, + 4095, 3034, 3917, + 4095, 3037, 3916, + 4095, 3042, 3915, + 4095, 3047, 3914, + 4095, 3054, 3912, + 4095, 3064, 3910, + 4095, 3076, 3906, + 4095, 3092, 3902, + 4095, 3113, 3896, + 4095, 3139, 3888, + 4095, 3172, 3878, + 4095, 3213, 3863, + 4095, 3262, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3466, 3708, + 4030, 3552, 3607, + 3943, 3647, 3422, + 3794, 3749, 2920, + 4095, 3156, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3159, 4050, + 4095, 3159, 4050, + 4095, 3160, 4050, + 4095, 3162, 4050, + 4095, 3163, 4049, + 4095, 3166, 4049, + 4095, 3169, 4048, + 4095, 3173, 4047, + 4095, 3179, 4046, + 4095, 3186, 4044, + 4095, 3195, 4042, + 4095, 3208, 4038, + 4095, 3224, 4034, + 4095, 3245, 4028, + 4095, 3271, 4020, + 4095, 3304, 4010, + 4095, 3345, 3995, + 4095, 3394, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3598, 3840, + 4095, 3684, 3738, + 4075, 3779, 3554, + 0, 843, 1089, + 0, 852, 1080, + 0, 864, 1068, + 0, 879, 1052, + 0, 898, 1030, + 0, 923, 998, + 0, 954, 952, + 0, 992, 882, + 0, 1039, 767, + 0, 1094, 545, + 0, 1160, 0, + 0, 1234, 0, + 0, 1318, 0, + 0, 1411, 0, + 0, 1511, 0, + 0, 1617, 0, + 0, 1729, 0, + 0, 1846, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 846, 1101, + 0, 855, 1093, + 0, 867, 1082, + 0, 881, 1066, + 0, 901, 1044, + 0, 925, 1013, + 0, 956, 969, + 0, 994, 901, + 0, 1041, 792, + 0, 1096, 585, + 0, 1161, 0, + 0, 1236, 0, + 0, 1319, 0, + 0, 1412, 0, + 0, 1512, 0, + 0, 1618, 0, + 0, 1730, 0, + 0, 1846, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 850, 1117, + 0, 859, 1109, + 0, 870, 1098, + 0, 885, 1083, + 0, 904, 1063, + 0, 928, 1033, + 0, 959, 990, + 0, 997, 926, + 0, 1043, 823, + 0, 1098, 634, + 0, 1163, 101, + 0, 1237, 0, + 0, 1321, 0, + 0, 1413, 0, + 0, 1513, 0, + 0, 1619, 0, + 0, 1730, 0, + 0, 1847, 0, + 0, 1967, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 856, 1138, + 0, 864, 1130, + 0, 875, 1120, + 0, 890, 1106, + 0, 909, 1086, + 0, 933, 1058, + 0, 963, 1018, + 0, 1001, 957, + 0, 1047, 862, + 0, 1101, 692, + 0, 1166, 266, + 0, 1240, 0, + 0, 1323, 0, + 0, 1414, 0, + 0, 1514, 0, + 0, 1620, 0, + 0, 1731, 0, + 0, 1847, 0, + 0, 1967, 0, + 0, 2090, 0, + 0, 2215, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 863, 1164, + 0, 871, 1157, + 0, 882, 1147, + 0, 897, 1134, + 0, 915, 1115, + 0, 939, 1089, + 0, 969, 1052, + 0, 1006, 996, + 0, 1051, 909, + 0, 1106, 759, + 0, 1169, 421, + 0, 1243, 0, + 0, 1325, 0, + 0, 1417, 0, + 0, 1515, 0, + 0, 1621, 0, + 0, 1732, 0, + 0, 1848, 0, + 0, 1968, 0, + 0, 2090, 0, + 0, 2215, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 133, 872, 1198, + 32, 880, 1191, + 0, 891, 1182, + 0, 905, 1169, + 0, 923, 1152, + 0, 947, 1128, + 0, 976, 1094, + 0, 1013, 1043, + 0, 1057, 966, + 0, 1111, 836, + 0, 1174, 570, + 0, 1247, 0, + 0, 1329, 0, + 0, 1419, 0, + 0, 1518, 0, + 0, 1623, 0, + 0, 1734, 0, + 0, 1849, 0, + 0, 1968, 0, + 0, 2091, 0, + 0, 2215, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 615, 884, 1238, + 582, 892, 1232, + 535, 902, 1224, + 462, 916, 1213, + 342, 934, 1197, + 107, 957, 1175, + 0, 986, 1144, + 0, 1021, 1100, + 0, 1065, 1032, + 0, 1118, 922, + 0, 1180, 714, + 0, 1252, 39, + 0, 1333, 0, + 0, 1423, 0, + 0, 1521, 0, + 0, 1625, 0, + 0, 1735, 0, + 0, 1851, 0, + 0, 1970, 0, + 0, 2092, 0, + 0, 2216, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 901, 899, 1288, + 883, 907, 1282, + 859, 917, 1275, + 825, 931, 1265, + 775, 948, 1251, + 698, 970, 1231, + 569, 998, 1204, + 307, 1033, 1165, + 0, 1076, 1107, + 0, 1127, 1016, + 0, 1188, 855, + 0, 1259, 474, + 0, 1339, 0, + 0, 1428, 0, + 0, 1524, 0, + 0, 1628, 0, + 0, 1738, 0, + 0, 1852, 0, + 0, 1971, 0, + 0, 2093, 0, + 0, 2217, 0, + 0, 2343, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1121, 919, 1346, + 1110, 927, 1341, + 1096, 937, 1335, + 1076, 949, 1326, + 1048, 966, 1314, + 1007, 987, 1297, + 947, 1014, 1274, + 850, 1048, 1241, + 677, 1089, 1192, + 240, 1140, 1117, + 0, 1199, 994, + 0, 1268, 747, + 0, 1347, 0, + 0, 1434, 0, + 0, 1530, 0, + 0, 1632, 0, + 0, 1741, 0, + 0, 1855, 0, + 0, 1973, 0, + 0, 2094, 0, + 0, 2218, 0, + 0, 2344, 0, + 0, 2471, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1309, 945, 1414, + 1302, 952, 1410, + 1293, 961, 1405, + 1280, 973, 1397, + 1262, 989, 1387, + 1237, 1009, 1372, + 1202, 1035, 1353, + 1149, 1067, 1325, + 1068, 1107, 1285, + 930, 1156, 1225, + 639, 1213, 1130, + 0, 1280, 962, + 0, 1357, 546, + 0, 1442, 0, + 0, 1536, 0, + 0, 1638, 0, + 0, 1745, 0, + 0, 1858, 0, + 0, 1976, 0, + 0, 2096, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1479, 977, 1492, + 1475, 983, 1488, + 1468, 992, 1484, + 1460, 1003, 1477, + 1448, 1018, 1469, + 1431, 1037, 1457, + 1408, 1061, 1441, + 1376, 1092, 1418, + 1328, 1130, 1385, + 1255, 1176, 1338, + 1136, 1231, 1266, + 901, 1296, 1148, + 0, 1370, 916, + 0, 1453, 0, + 0, 1545, 0, + 0, 1645, 0, + 0, 1751, 0, + 0, 1863, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1638, 1016, 1579, + 1635, 1022, 1576, + 1630, 1030, 1572, + 1624, 1041, 1567, + 1616, 1054, 1559, + 1604, 1072, 1550, + 1589, 1094, 1537, + 1567, 1123, 1518, + 1537, 1158, 1492, + 1492, 1202, 1455, + 1425, 1254, 1401, + 1316, 1316, 1316, + 1111, 1387, 1169, + 459, 1468, 847, + 0, 1557, 0, + 0, 1654, 0, + 0, 1758, 0, + 0, 1869, 0, + 0, 1983, 0, + 0, 2102, 0, + 0, 2224, 0, + 0, 2348, 0, + 0, 2475, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1789, 1064, 1673, + 1786, 1070, 1671, + 1783, 1077, 1668, + 1779, 1086, 1664, + 1773, 1099, 1658, + 1765, 1115, 1650, + 1754, 1135, 1640, + 1739, 1161, 1625, + 1719, 1194, 1605, + 1689, 1234, 1576, + 1647, 1283, 1535, + 1583, 1341, 1473, + 1481, 1409, 1375, + 1293, 1486, 1197, + 773, 1572, 733, + 0, 1667, 0, + 0, 1768, 0, + 0, 1876, 0, + 0, 1989, 0, + 0, 2107, 0, + 0, 2228, 0, + 0, 2351, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1934, 1121, 1775, + 1933, 1126, 1774, + 1930, 1133, 1771, + 1927, 1141, 1768, + 1923, 1152, 1763, + 1917, 1166, 1757, + 1910, 1184, 1749, + 1899, 1208, 1737, + 1885, 1237, 1721, + 1864, 1274, 1700, + 1836, 1319, 1668, + 1795, 1373, 1623, + 1734, 1436, 1555, + 1636, 1509, 1443, + 1460, 1592, 1231, + 1006, 1682, 516, + 0, 1781, 0, + 0, 1886, 0, + 0, 1997, 0, + 0, 2113, 0, + 0, 2232, 0, + 0, 2355, 0, + 0, 2479, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2076, 1188, 1884, + 2075, 1192, 1882, + 2074, 1198, 1880, + 2071, 1205, 1878, + 2068, 1214, 1874, + 2064, 1227, 1869, + 2058, 1243, 1863, + 2051, 1264, 1854, + 2041, 1290, 1842, + 2026, 1323, 1825, + 2007, 1363, 1802, + 1979, 1413, 1768, + 1939, 1471, 1720, + 1879, 1539, 1645, + 1784, 1616, 1521, + 1616, 1703, 1274, + 1200, 1798, 0, + 0, 1899, 0, + 0, 2008, 0, + 0, 2121, 0, + 0, 2239, 0, + 0, 2359, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2216, 1264, 1997, + 2215, 1268, 1996, + 2214, 1272, 1995, + 2212, 1279, 1992, + 2210, 1287, 1990, + 2207, 1297, 1986, + 2203, 1311, 1981, + 2197, 1329, 1974, + 2190, 1352, 1965, + 2179, 1381, 1952, + 2165, 1417, 1935, + 2146, 1461, 1910, + 2119, 1513, 1875, + 2079, 1576, 1823, + 2021, 1648, 1743, + 1928, 1729, 1608, + 1765, 1819, 1325, + 1374, 1916, 0, + 0, 2021, 0, + 0, 2132, 0, + 0, 2247, 0, + 0, 2366, 0, + 0, 2488, 0, + 0, 2612, 0, + 0, 2739, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2353, 1349, 2115, + 2353, 1352, 2114, + 2352, 1356, 2113, + 2350, 1361, 2111, + 2349, 1368, 2109, + 2347, 1377, 2106, + 2344, 1389, 2102, + 2340, 1404, 2097, + 2334, 1423, 2090, + 2327, 1448, 2080, + 2317, 1479, 2067, + 2303, 1518, 2049, + 2284, 1565, 2023, + 2257, 1621, 1987, + 2218, 1686, 1932, + 2160, 1761, 1848, + 2069, 1846, 1703, + 1910, 1938, 1386, + 1535, 2039, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2489, 1443, 2236, + 2489, 1445, 2235, + 2488, 1449, 2234, + 2487, 1453, 2233, + 2486, 1458, 2231, + 2484, 1466, 2229, + 2482, 1475, 2226, + 2479, 1488, 2222, + 2475, 1504, 2217, + 2470, 1525, 2210, + 2462, 1551, 2200, + 2452, 1584, 2186, + 2439, 1625, 2167, + 2420, 1675, 2141, + 2393, 1733, 2103, + 2355, 1802, 2047, + 2297, 1879, 1958, + 2208, 1966, 1805, + 2051, 2061, 1456, + 1688, 2163, 0, + 0, 2271, 0, + 0, 2385, 0, + 0, 2502, 0, + 0, 2623, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2624, 1544, 2359, + 2624, 1546, 2359, + 2624, 1549, 2358, + 2623, 1552, 2357, + 2622, 1556, 2356, + 2621, 1562, 2354, + 2619, 1570, 2352, + 2617, 1580, 2349, + 2614, 1593, 2345, + 2610, 1611, 2340, + 2605, 1633, 2332, + 2597, 1661, 2322, + 2587, 1695, 2308, + 2574, 1738, 2289, + 2555, 1789, 2262, + 2528, 1850, 2223, + 2490, 1921, 2165, + 2433, 2000, 2074, + 2345, 2089, 1914, + 2190, 2186, 1535, + 1835, 2289, 0, + 0, 2399, 0, + 0, 2513, 0, + 0, 2632, 0, + 0, 2753, 0, + 0, 2877, 0, + 0, 3004, 0, + 0, 3131, 0, + 0, 3260, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2759, 1651, 2485, + 2758, 1653, 2485, + 2758, 1655, 2484, + 2758, 1658, 2483, + 2757, 1661, 2482, + 2756, 1666, 2481, + 2755, 1672, 2480, + 2753, 1680, 2477, + 2751, 1691, 2474, + 2748, 1705, 2470, + 2744, 1723, 2465, + 2739, 1746, 2457, + 2731, 1775, 2447, + 2721, 1811, 2433, + 2708, 1855, 2413, + 2689, 1908, 2385, + 2663, 1971, 2346, + 2625, 2043, 2287, + 2568, 2124, 2193, + 2480, 2214, 2027, + 2327, 2312, 1623, + 1978, 2417, 0, + 0, 2527, 0, + 0, 2643, 0, + 0, 2762, 0, + 0, 2884, 0, + 0, 3008, 0, + 0, 3135, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2892, 1764, 2612, + 2892, 1765, 2612, + 2892, 1767, 2612, + 2892, 1769, 2611, + 2891, 1772, 2610, + 2890, 1775, 2609, + 2889, 1780, 2608, + 2888, 1787, 2606, + 2887, 1795, 2604, + 2884, 1806, 2601, + 2882, 1821, 2597, + 2878, 1839, 2591, + 2872, 1863, 2584, + 2865, 1893, 2573, + 2855, 1930, 2559, + 2842, 1976, 2539, + 2823, 2030, 2511, + 2797, 2094, 2471, + 2759, 2167, 2411, + 2703, 2250, 2315, + 2615, 2341, 2145, + 2463, 2440, 1720, + 2118, 2546, 0, + 0, 2657, 0, + 0, 2773, 0, + 0, 2892, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 3026, 1881, 2741, + 3026, 1882, 2740, + 3025, 1883, 2740, + 3025, 1885, 2740, + 3025, 1887, 2739, + 3024, 1890, 2738, + 3024, 1894, 2737, + 3023, 1899, 2736, + 3021, 1905, 2734, + 3020, 1914, 2732, + 3018, 1926, 2729, + 3015, 1940, 2725, + 3011, 1960, 2719, + 3005, 1984, 2712, + 2998, 2015, 2701, + 2988, 2053, 2687, + 2975, 2099, 2667, + 2956, 2154, 2638, + 2930, 2219, 2598, + 2892, 2294, 2537, + 2836, 2377, 2440, + 2749, 2469, 2266, + 2598, 2569, 1823, + 2256, 2675, 0, + 0, 2787, 0, + 0, 2903, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 3159, 2002, 2870, + 3159, 2002, 2870, + 3158, 2003, 2870, + 3158, 2005, 2869, + 3158, 2006, 2869, + 3158, 2008, 2868, + 3157, 2011, 2868, + 3156, 2015, 2867, + 3156, 2020, 2865, + 3154, 2027, 2864, + 3153, 2036, 2861, + 3151, 2048, 2858, + 3148, 2063, 2854, + 3144, 2082, 2848, + 3138, 2107, 2840, + 3131, 2139, 2830, + 3121, 2177, 2815, + 3108, 2224, 2795, + 3089, 2280, 2767, + 3063, 2346, 2726, + 3025, 2421, 2664, + 2970, 2506, 2566, + 2883, 2598, 2390, + 2732, 2699, 1933, + 2392, 2805, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 3291, 2125, 3000, + 3291, 2125, 3000, + 3291, 2126, 3000, + 3291, 2127, 2999, + 3291, 2128, 2999, + 3291, 2130, 2999, + 3290, 2132, 2998, + 3290, 2135, 2997, + 3289, 2139, 2996, + 3288, 2145, 2995, + 3287, 2151, 2993, + 3285, 2161, 2991, + 3283, 2172, 2988, + 3280, 2188, 2984, + 3276, 2208, 2978, + 3271, 2233, 2970, + 3264, 2264, 2960, + 3254, 2304, 2945, + 3241, 2351, 2925, + 3222, 2408, 2896, + 3196, 2474, 2855, + 3158, 2550, 2793, + 3103, 2635, 2694, + 3016, 2728, 2515, + 2865, 2829, 2047, + 2527, 2936, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3534, 0, + 0, 3661, 0, + 3424, 2250, 3130, + 3424, 2251, 3130, + 3424, 2251, 3130, + 3424, 2252, 3130, + 3424, 2253, 3130, + 3423, 2254, 3130, + 3423, 2256, 3129, + 3423, 2258, 3129, + 3422, 2261, 3128, + 3422, 2265, 3127, + 3421, 2271, 3126, + 3420, 2278, 3124, + 3418, 2287, 3122, + 3416, 2299, 3118, + 3413, 2314, 3114, + 3409, 2334, 3108, + 3404, 2360, 3101, + 3396, 2392, 3090, + 3387, 2431, 3075, + 3373, 2479, 3055, + 3355, 2537, 3026, + 3328, 2603, 2984, + 3291, 2680, 2922, + 3235, 2765, 2823, + 3149, 2859, 2643, + 2999, 2960, 2165, + 2662, 3067, 0, + 0, 3180, 0, + 0, 3297, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3666, 0, + 3557, 2377, 3261, + 3557, 2378, 3261, + 3556, 2378, 3261, + 3556, 2379, 3261, + 3556, 2379, 3261, + 3556, 2380, 3261, + 3556, 2382, 3260, + 3556, 2383, 3260, + 3555, 2386, 3259, + 3555, 2389, 3259, + 3554, 2393, 3258, + 3553, 2398, 3256, + 3552, 2405, 3255, + 3550, 2414, 3252, + 3548, 2427, 3249, + 3545, 2442, 3245, + 3541, 2462, 3239, + 3536, 2488, 3231, + 3529, 2520, 3221, + 3519, 2560, 3206, + 3506, 2609, 3185, + 3487, 2666, 3157, + 3461, 2733, 3115, + 3423, 2810, 3052, + 3368, 2896, 2952, + 3281, 2989, 2771, + 3131, 3091, 2287, + 2795, 3198, 0, + 0, 3311, 0, + 0, 3429, 0, + 0, 3549, 0, + 0, 3673, 0, + 3689, 2506, 3393, + 3689, 2506, 3393, + 3689, 2506, 3392, + 3689, 2506, 3392, + 3689, 2507, 3392, + 3689, 2508, 3392, + 3688, 2509, 3392, + 3688, 2510, 3392, + 3688, 2512, 3391, + 3688, 2514, 3391, + 3687, 2517, 3390, + 3686, 2521, 3389, + 3686, 2527, 3388, + 3684, 2534, 3386, + 3683, 2543, 3383, + 3681, 2555, 3380, + 3678, 2571, 3376, + 3674, 2592, 3370, + 3668, 2617, 3362, + 3661, 2650, 3352, + 3651, 2690, 3337, + 3638, 2739, 3316, + 3619, 2796, 3287, + 3593, 2864, 3246, + 3556, 2941, 3183, + 3500, 3026, 3083, + 3414, 3121, 2900, + 3264, 3222, 2411, + 2929, 3330, 0, + 0, 3443, 0, + 0, 3560, 0, + 0, 3681, 0, + 3821, 2635, 3524, + 3821, 2635, 3524, + 3821, 2635, 3524, + 3821, 2635, 3524, + 3821, 2636, 3524, + 3821, 2636, 3524, + 3821, 2637, 3523, + 3821, 2638, 3523, + 3821, 2639, 3523, + 3820, 2641, 3523, + 3820, 2644, 3522, + 3819, 2647, 3521, + 3819, 2651, 3520, + 3818, 2656, 3519, + 3817, 2663, 3517, + 3815, 2673, 3515, + 3813, 2685, 3512, + 3810, 2701, 3507, + 3806, 2721, 3502, + 3801, 2747, 3494, + 3794, 2780, 3483, + 3784, 2820, 3468, + 3770, 2869, 3448, + 3752, 2927, 3419, + 3726, 2995, 3377, + 3688, 3072, 3314, + 3633, 3158, 3213, + 3546, 3252, 3030, + 3397, 3354, 2537, + 3062, 3462, 0, + 0, 3575, 0, + 0, 3692, 0, + 3953, 2765, 3656, + 3953, 2765, 3656, + 3953, 2765, 3656, + 3953, 2765, 3656, + 3953, 2765, 3655, + 3953, 2766, 3655, + 3953, 2766, 3655, + 3953, 2767, 3655, + 3953, 2768, 3655, + 3953, 2770, 3655, + 3952, 2771, 3654, + 3952, 2774, 3654, + 3952, 2777, 3653, + 3951, 2781, 3652, + 3950, 2786, 3651, + 3949, 2793, 3649, + 3947, 2803, 3646, + 3945, 2815, 3643, + 3942, 2831, 3639, + 3938, 2852, 3633, + 3933, 2878, 3625, + 3926, 2911, 3615, + 3916, 2951, 3600, + 3903, 3000, 3579, + 3884, 3058, 3550, + 3858, 3126, 3508, + 3821, 3203, 3445, + 3765, 3289, 3344, + 3679, 3384, 3161, + 3529, 3485, 2664, + 3195, 3593, 0, + 0, 3707, 0, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4086, 2896, 3787, + 4086, 2896, 3787, + 4086, 2896, 3787, + 4086, 2896, 3787, + 4085, 2897, 3787, + 4085, 2898, 3787, + 4085, 2899, 3787, + 4085, 2900, 3786, + 4085, 2902, 3786, + 4084, 2904, 3785, + 4084, 2907, 3785, + 4083, 2911, 3784, + 4082, 2917, 3782, + 4081, 2924, 3780, + 4079, 2934, 3778, + 4077, 2946, 3775, + 4074, 2962, 3771, + 4070, 2983, 3765, + 4065, 3009, 3757, + 4058, 3042, 3746, + 4048, 3082, 3731, + 4035, 3131, 3711, + 4016, 3189, 3682, + 3990, 3257, 3640, + 3953, 3334, 3577, + 3897, 3421, 3476, + 3811, 3515, 3292, + 3662, 3617, 2793, + 3327, 3725, 0, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3028, 3919, + 4095, 3029, 3919, + 4095, 3030, 3918, + 4095, 3031, 3918, + 4095, 3033, 3918, + 4095, 3035, 3917, + 4095, 3038, 3916, + 4095, 3042, 3915, + 4095, 3048, 3914, + 4095, 3055, 3912, + 4095, 3065, 3910, + 4095, 3077, 3907, + 4095, 3093, 3902, + 4095, 3114, 3897, + 4095, 3140, 3889, + 4095, 3173, 3878, + 4095, 3213, 3863, + 4095, 3263, 3843, + 4095, 3321, 3813, + 4095, 3389, 3771, + 4085, 3466, 3708, + 4030, 3552, 3607, + 3943, 3647, 3423, + 3794, 3749, 2922, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3159, 4051, + 4095, 3159, 4051, + 4095, 3160, 4050, + 4095, 3161, 4050, + 4095, 3162, 4050, + 4095, 3164, 4049, + 4095, 3166, 4049, + 4095, 3170, 4048, + 4095, 3174, 4047, + 4095, 3179, 4046, + 4095, 3186, 4044, + 4095, 3196, 4042, + 4095, 3208, 4039, + 4095, 3224, 4034, + 4095, 3245, 4028, + 4095, 3271, 4021, + 4095, 3304, 4010, + 4095, 3345, 3995, + 4095, 3394, 3974, + 4095, 3453, 3945, + 4095, 3520, 3903, + 4095, 3598, 3840, + 4095, 3684, 3739, + 4075, 3779, 3555, + 0, 966, 1218, + 0, 973, 1211, + 0, 982, 1202, + 0, 994, 1191, + 0, 1009, 1174, + 0, 1028, 1151, + 0, 1053, 1119, + 0, 1084, 1071, + 0, 1122, 999, + 0, 1169, 879, + 0, 1225, 645, + 0, 1291, 0, + 0, 1366, 0, + 0, 1450, 0, + 0, 1542, 0, + 0, 1643, 0, + 0, 1749, 0, + 0, 1861, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 969, 1227, + 0, 975, 1221, + 0, 984, 1212, + 0, 996, 1201, + 0, 1011, 1185, + 0, 1030, 1162, + 0, 1055, 1130, + 0, 1086, 1084, + 0, 1124, 1014, + 0, 1171, 899, + 0, 1226, 677, + 0, 1292, 0, + 0, 1367, 0, + 0, 1451, 0, + 0, 1543, 0, + 0, 1643, 0, + 0, 1750, 0, + 0, 1862, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 972, 1239, + 0, 978, 1233, + 0, 987, 1225, + 0, 999, 1214, + 0, 1014, 1198, + 0, 1033, 1176, + 0, 1057, 1146, + 0, 1088, 1101, + 0, 1126, 1033, + 0, 1173, 924, + 0, 1228, 717, + 0, 1293, 53, + 0, 1368, 0, + 0, 1452, 0, + 0, 1544, 0, + 0, 1644, 0, + 0, 1750, 0, + 0, 1862, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 976, 1255, + 0, 982, 1249, + 0, 991, 1241, + 0, 1002, 1230, + 0, 1017, 1215, + 0, 1036, 1195, + 0, 1061, 1165, + 0, 1091, 1122, + 0, 1129, 1058, + 0, 1175, 955, + 0, 1231, 766, + 0, 1295, 233, + 0, 1370, 0, + 0, 1453, 0, + 0, 1545, 0, + 0, 1645, 0, + 0, 1751, 0, + 0, 1863, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 981, 1276, + 0, 988, 1270, + 0, 996, 1263, + 0, 1008, 1252, + 0, 1022, 1238, + 0, 1041, 1218, + 0, 1065, 1190, + 0, 1095, 1150, + 0, 1133, 1090, + 0, 1179, 994, + 0, 1234, 824, + 0, 1298, 398, + 0, 1372, 0, + 0, 1455, 0, + 0, 1547, 0, + 0, 1646, 0, + 0, 1752, 0, + 0, 1863, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2222, 0, + 0, 2347, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 988, 1302, + 0, 995, 1297, + 0, 1003, 1289, + 0, 1014, 1280, + 0, 1029, 1266, + 0, 1047, 1247, + 0, 1071, 1221, + 0, 1101, 1184, + 0, 1138, 1128, + 0, 1183, 1041, + 0, 1238, 891, + 0, 1301, 553, + 0, 1375, 0, + 0, 1457, 0, + 0, 1549, 0, + 0, 1648, 0, + 0, 1753, 0, + 0, 1864, 0, + 0, 1980, 0, + 0, 2100, 0, + 0, 2222, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 329, 998, 1335, + 265, 1004, 1330, + 164, 1012, 1323, + 0, 1023, 1314, + 0, 1037, 1301, + 0, 1055, 1284, + 0, 1079, 1260, + 0, 1108, 1226, + 0, 1145, 1175, + 0, 1189, 1098, + 0, 1243, 968, + 0, 1306, 702, + 0, 1379, 0, + 0, 1461, 0, + 0, 1551, 0, + 0, 1650, 0, + 0, 1755, 0, + 0, 1866, 0, + 0, 1981, 0, + 0, 2101, 0, + 0, 2223, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 770, 1010, 1375, + 747, 1016, 1370, + 715, 1024, 1364, + 667, 1035, 1356, + 594, 1048, 1345, + 474, 1066, 1329, + 239, 1089, 1307, + 0, 1118, 1276, + 0, 1154, 1232, + 0, 1197, 1164, + 0, 1250, 1054, + 0, 1312, 846, + 0, 1384, 171, + 0, 1465, 0, + 0, 1555, 0, + 0, 1653, 0, + 0, 1757, 0, + 0, 1868, 0, + 0, 1983, 0, + 0, 2102, 0, + 0, 2224, 0, + 0, 2348, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1045, 1025, 1424, + 1033, 1031, 1420, + 1016, 1039, 1414, + 992, 1049, 1407, + 957, 1063, 1397, + 907, 1080, 1383, + 830, 1102, 1364, + 702, 1130, 1336, + 440, 1165, 1297, + 0, 1208, 1239, + 0, 1260, 1148, + 0, 1321, 987, + 0, 1391, 606, + 0, 1471, 0, + 0, 1560, 0, + 0, 1657, 0, + 0, 1760, 0, + 0, 1870, 0, + 0, 1985, 0, + 0, 2103, 0, + 0, 2225, 0, + 0, 2349, 0, + 0, 2475, 0, + 0, 2603, 0, + 0, 2731, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1261, 1046, 1482, + 1253, 1051, 1478, + 1242, 1059, 1473, + 1228, 1069, 1467, + 1208, 1082, 1458, + 1180, 1098, 1446, + 1139, 1119, 1429, + 1079, 1146, 1406, + 982, 1180, 1373, + 810, 1222, 1324, + 372, 1272, 1249, + 0, 1331, 1126, + 0, 1400, 879, + 0, 1479, 0, + 0, 1566, 0, + 0, 1662, 0, + 0, 1764, 0, + 0, 1873, 0, + 0, 1987, 0, + 0, 2105, 0, + 0, 2226, 0, + 0, 2350, 0, + 0, 2476, 0, + 0, 2603, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1446, 1072, 1550, + 1441, 1077, 1546, + 1434, 1084, 1542, + 1425, 1093, 1537, + 1412, 1105, 1529, + 1394, 1121, 1519, + 1370, 1141, 1505, + 1334, 1167, 1485, + 1282, 1199, 1457, + 1200, 1239, 1417, + 1063, 1288, 1357, + 771, 1345, 1263, + 0, 1412, 1094, + 0, 1489, 678, + 0, 1575, 0, + 0, 1668, 0, + 0, 1770, 0, + 0, 1877, 0, + 0, 1990, 0, + 0, 2108, 0, + 0, 2228, 0, + 0, 2352, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1615, 1104, 1627, + 1611, 1109, 1624, + 1607, 1115, 1621, + 1600, 1124, 1616, + 1592, 1135, 1609, + 1580, 1150, 1601, + 1563, 1169, 1589, + 1540, 1193, 1573, + 1508, 1224, 1550, + 1460, 1262, 1518, + 1388, 1308, 1470, + 1268, 1363, 1398, + 1033, 1428, 1280, + 0, 1502, 1048, + 0, 1585, 57, + 0, 1677, 0, + 0, 1777, 0, + 0, 1883, 0, + 0, 1995, 0, + 0, 2111, 0, + 0, 2231, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 1772, 1144, 1713, + 1770, 1148, 1711, + 1767, 1154, 1708, + 1762, 1162, 1704, + 1756, 1173, 1699, + 1748, 1186, 1692, + 1737, 1204, 1682, + 1721, 1226, 1669, + 1699, 1255, 1650, + 1669, 1290, 1624, + 1624, 1334, 1588, + 1557, 1386, 1533, + 1448, 1448, 1448, + 1243, 1519, 1301, + 591, 1600, 979, + 0, 1689, 0, + 0, 1786, 0, + 0, 1891, 0, + 0, 2001, 0, + 0, 2116, 0, + 0, 2234, 0, + 0, 2356, 0, + 0, 2481, 0, + 0, 2607, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1923, 1192, 1807, + 1921, 1196, 1805, + 1919, 1202, 1803, + 1915, 1209, 1800, + 1911, 1218, 1796, + 1905, 1231, 1790, + 1897, 1247, 1782, + 1886, 1267, 1772, + 1871, 1293, 1757, + 1851, 1326, 1737, + 1821, 1366, 1708, + 1779, 1415, 1667, + 1715, 1473, 1605, + 1613, 1541, 1507, + 1426, 1618, 1329, + 905, 1704, 865, + 0, 1799, 0, + 0, 1900, 0, + 0, 2008, 0, + 0, 2122, 0, + 0, 2239, 0, + 0, 2360, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2068, 1250, 1909, + 2067, 1253, 1908, + 2065, 1258, 1906, + 2063, 1265, 1903, + 2059, 1273, 1900, + 2055, 1284, 1895, + 2049, 1298, 1889, + 2042, 1317, 1881, + 2031, 1340, 1869, + 2017, 1370, 1854, + 1997, 1406, 1832, + 1968, 1451, 1801, + 1927, 1505, 1755, + 1866, 1569, 1687, + 1768, 1641, 1575, + 1592, 1724, 1364, + 1138, 1815, 648, + 0, 1913, 0, + 0, 2018, 0, + 0, 2129, 0, + 0, 2245, 0, + 0, 2364, 0, + 0, 2487, 0, + 0, 2612, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2210, 1317, 2017, + 2209, 1320, 2016, + 2207, 1324, 2014, + 2206, 1330, 2012, + 2203, 1337, 2010, + 2200, 1347, 2006, + 2196, 1359, 2001, + 2191, 1375, 1995, + 2183, 1396, 1986, + 2173, 1422, 1974, + 2158, 1455, 1957, + 2139, 1496, 1934, + 2111, 1545, 1900, + 2071, 1603, 1852, + 2011, 1671, 1777, + 1916, 1749, 1653, + 1748, 1835, 1406, + 1333, 1930, 0, + 0, 2032, 0, + 0, 2140, 0, + 0, 2253, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2349, 1394, 2130, + 2348, 1396, 2129, + 2347, 1400, 2128, + 2346, 1404, 2127, + 2344, 1411, 2125, + 2342, 1419, 2122, + 2339, 1429, 2118, + 2335, 1443, 2113, + 2329, 1461, 2106, + 2322, 1484, 2097, + 2312, 1513, 2084, + 2298, 1549, 2067, + 2278, 1593, 2042, + 2251, 1646, 2007, + 2211, 1708, 1955, + 2153, 1780, 1875, + 2061, 1861, 1740, + 1898, 1951, 1457, + 1507, 2049, 0, + 0, 2153, 0, + 0, 2264, 0, + 0, 2379, 0, + 0, 2498, 0, + 0, 2620, 0, + 0, 2744, 0, + 0, 2871, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2486, 1479, 2248, + 2485, 1482, 2247, + 2485, 1484, 2246, + 2484, 1488, 2245, + 2483, 1493, 2243, + 2481, 1500, 2241, + 2479, 1509, 2238, + 2476, 1521, 2234, + 2472, 1536, 2229, + 2466, 1555, 2222, + 2459, 1580, 2213, + 2449, 1611, 2199, + 2435, 1650, 2181, + 2416, 1697, 2155, + 2389, 1753, 2119, + 2350, 1818, 2064, + 2292, 1893, 1980, + 2201, 1978, 1835, + 2042, 2070, 1518, + 1668, 2171, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2622, 1573, 2368, + 2621, 1575, 2368, + 2621, 1578, 2367, + 2620, 1581, 2366, + 2619, 1585, 2365, + 2618, 1590, 2363, + 2616, 1598, 2361, + 2614, 1607, 2358, + 2611, 1620, 2354, + 2607, 1636, 2349, + 2602, 1657, 2342, + 2595, 1683, 2332, + 2585, 1716, 2318, + 2571, 1757, 2299, + 2552, 1807, 2273, + 2525, 1865, 2235, + 2487, 1934, 2179, + 2430, 2011, 2091, + 2340, 2098, 1937, + 2183, 2193, 1588, + 1820, 2295, 0, + 0, 2403, 0, + 0, 2517, 0, + 0, 2634, 0, + 0, 2755, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2757, 1675, 2492, + 2756, 1676, 2491, + 2756, 1678, 2491, + 2756, 1681, 2490, + 2755, 1684, 2489, + 2754, 1688, 2488, + 2753, 1694, 2486, + 2751, 1702, 2484, + 2749, 1712, 2481, + 2746, 1726, 2477, + 2742, 1743, 2472, + 2737, 1765, 2464, + 2729, 1793, 2454, + 2719, 1827, 2440, + 2706, 1870, 2421, + 2687, 1922, 2394, + 2660, 1982, 2355, + 2622, 2053, 2297, + 2566, 2132, 2206, + 2477, 2221, 2046, + 2322, 2318, 1667, + 1967, 2421, 0, + 0, 2531, 0, + 0, 2645, 0, + 0, 2764, 0, + 0, 2885, 0, + 0, 3010, 0, + 0, 3136, 0, + 0, 3263, 0, + 0, 3392, 0, + 0, 3521, 0, + 0, 3651, 0, + 2891, 1782, 2617, + 2891, 1784, 2617, + 2890, 1785, 2617, + 2890, 1787, 2616, + 2890, 1790, 2615, + 2889, 1793, 2615, + 2888, 1798, 2613, + 2887, 1804, 2612, + 2885, 1812, 2609, + 2883, 1823, 2606, + 2880, 1837, 2602, + 2876, 1855, 2597, + 2871, 1878, 2589, + 2863, 1907, 2579, + 2854, 1943, 2565, + 2840, 1987, 2545, + 2821, 2040, 2518, + 2795, 2103, 2478, + 2757, 2175, 2419, + 2701, 2256, 2325, + 2612, 2346, 2159, + 2459, 2444, 1755, + 2110, 2549, 0, + 0, 2659, 0, + 0, 2775, 0, + 0, 2894, 0, + 0, 3016, 0, + 0, 3140, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3523, 0, + 0, 3653, 0, + 3025, 1895, 2745, + 3024, 1896, 2744, + 3024, 1897, 2744, + 3024, 1899, 2744, + 3024, 1901, 2743, + 3023, 1904, 2742, + 3022, 1908, 2741, + 3022, 1912, 2740, + 3020, 1919, 2738, + 3019, 1927, 2736, + 3017, 1938, 2733, + 3014, 1953, 2729, + 3010, 1971, 2723, + 3004, 1995, 2716, + 2997, 2025, 2705, + 2987, 2062, 2691, + 2974, 2108, 2671, + 2955, 2162, 2643, + 2929, 2226, 2603, + 2891, 2299, 2543, + 2835, 2382, 2447, + 2747, 2473, 2277, + 2595, 2572, 1852, + 2250, 2678, 0, + 0, 2789, 0, + 0, 2905, 0, + 0, 3024, 0, + 0, 3147, 0, + 0, 3272, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 3158, 2013, 2873, + 3158, 2013, 2873, + 3158, 2014, 2872, + 3157, 2015, 2872, + 3157, 2017, 2872, + 3157, 2019, 2871, + 3156, 2022, 2871, + 3156, 2026, 2870, + 3155, 2031, 2868, + 3154, 2038, 2867, + 3152, 2046, 2864, + 3150, 2058, 2861, + 3147, 2073, 2857, + 3143, 2092, 2851, + 3138, 2116, 2844, + 3130, 2147, 2833, + 3120, 2185, 2819, + 3107, 2231, 2799, + 3088, 2286, 2770, + 3062, 2351, 2730, + 3024, 2426, 2669, + 2968, 2509, 2572, + 2881, 2601, 2398, + 2730, 2701, 1955, + 2388, 2807, 0, + 0, 2919, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 3291, 2133, 3002, + 3291, 2134, 3002, + 3291, 2135, 3002, + 3291, 2135, 3002, + 3290, 2137, 3001, + 3290, 2138, 3001, + 3290, 2141, 3000, + 3289, 2143, 3000, + 3288, 2147, 2999, + 3288, 2153, 2997, + 3286, 2159, 2996, + 3285, 2168, 2993, + 3283, 2180, 2990, + 3280, 2195, 2986, + 3276, 2215, 2980, + 3270, 2239, 2973, + 3263, 2271, 2962, + 3253, 2309, 2947, + 3240, 2356, 2927, + 3221, 2412, 2899, + 3195, 2478, 2858, + 3157, 2553, 2796, + 3102, 2638, 2698, + 3015, 2730, 2522, + 2864, 2831, 2065, + 2524, 2938, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 3424, 2257, 3132, + 3424, 2257, 3132, + 3423, 2258, 3132, + 3423, 2258, 3132, + 3423, 2259, 3132, + 3423, 2261, 3131, + 3423, 2262, 3131, + 3422, 2264, 3130, + 3422, 2267, 3130, + 3421, 2271, 3129, + 3420, 2277, 3127, + 3419, 2284, 3126, + 3417, 2293, 3123, + 3415, 2304, 3120, + 3412, 2320, 3116, + 3408, 2340, 3110, + 3403, 2365, 3102, + 3396, 2397, 3092, + 3386, 2436, 3077, + 3373, 2483, 3057, + 3354, 2540, 3028, + 3328, 2606, 2987, + 3290, 2682, 2925, + 3235, 2767, 2826, + 3148, 2860, 2647, + 2997, 2961, 2179, + 2659, 3068, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3666, 0, + 3556, 2382, 3263, + 3556, 2382, 3263, + 3556, 2383, 3262, + 3556, 2383, 3262, + 3556, 2384, 3262, + 3556, 2385, 3262, + 3556, 2386, 3262, + 3555, 2388, 3261, + 3555, 2390, 3261, + 3554, 2393, 3260, + 3554, 2397, 3259, + 3553, 2403, 3258, + 3552, 2410, 3256, + 3550, 2419, 3254, + 3548, 2431, 3250, + 3545, 2446, 3246, + 3541, 2466, 3240, + 3536, 2492, 3233, + 3529, 2524, 3222, + 3519, 2564, 3207, + 3505, 2612, 3187, + 3487, 2669, 3158, + 3461, 2736, 3117, + 3423, 2812, 3054, + 3368, 2897, 2955, + 3281, 2991, 2775, + 3131, 3092, 2297, + 2794, 3199, 0, + 0, 3312, 0, + 0, 3429, 0, + 0, 3550, 0, + 0, 3673, 0, + 3689, 2509, 3394, + 3689, 2509, 3393, + 3689, 2510, 3393, + 3689, 2510, 3393, + 3688, 2511, 3393, + 3688, 2511, 3393, + 3688, 2512, 3393, + 3688, 2514, 3392, + 3688, 2515, 3392, + 3687, 2518, 3392, + 3687, 2521, 3391, + 3686, 2525, 3390, + 3685, 2530, 3389, + 3684, 2537, 3387, + 3682, 2546, 3384, + 3680, 2559, 3381, + 3677, 2574, 3377, + 3673, 2595, 3371, + 3668, 2620, 3363, + 3661, 2653, 3353, + 3651, 2692, 3338, + 3638, 2741, 3318, + 3619, 2798, 3289, + 3593, 2865, 3247, + 3556, 2942, 3184, + 3500, 3028, 3084, + 3413, 3122, 2903, + 3264, 3223, 2419, + 2928, 3331, 0, + 0, 3443, 0, + 0, 3561, 0, + 0, 3681, 0, + 3821, 2637, 3525, + 3821, 2638, 3525, + 3821, 2638, 3525, + 3821, 2638, 3525, + 3821, 2639, 3524, + 3821, 2639, 3524, + 3821, 2640, 3524, + 3821, 2641, 3524, + 3820, 2642, 3524, + 3820, 2644, 3523, + 3820, 2646, 3523, + 3819, 2649, 3522, + 3818, 2653, 3521, + 3818, 2659, 3520, + 3816, 2666, 3518, + 3815, 2675, 3516, + 3813, 2687, 3512, + 3810, 2703, 3508, + 3806, 2724, 3502, + 3801, 2750, 3494, + 3793, 2782, 3484, + 3784, 2822, 3469, + 3770, 2871, 3448, + 3752, 2929, 3420, + 3725, 2996, 3378, + 3688, 3073, 3315, + 3633, 3159, 3215, + 3546, 3253, 3032, + 3396, 3354, 2543, + 3061, 3462, 0, + 0, 3575, 0, + 0, 3692, 0, + 3953, 2767, 3656, + 3953, 2767, 3656, + 3953, 2767, 3656, + 3953, 2767, 3656, + 3953, 2768, 3656, + 3953, 2768, 3656, + 3953, 2769, 3656, + 3953, 2769, 3656, + 3953, 2770, 3655, + 3953, 2772, 3655, + 3952, 2773, 3655, + 3952, 2776, 3654, + 3951, 2779, 3653, + 3951, 2783, 3652, + 3950, 2788, 3651, + 3949, 2795, 3649, + 3947, 2805, 3647, + 3945, 2817, 3644, + 3942, 2833, 3639, + 3938, 2854, 3634, + 3933, 2880, 3626, + 3926, 2912, 3615, + 3916, 2952, 3600, + 3902, 3001, 3580, + 3884, 3059, 3551, + 3858, 3127, 3509, + 3820, 3204, 3446, + 3765, 3290, 3345, + 3678, 3384, 3162, + 3529, 3486, 2669, + 3194, 3594, 0, + 0, 3707, 0, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4085, 2898, 3788, + 4085, 2898, 3787, + 4085, 2899, 3787, + 4085, 2899, 3787, + 4085, 2900, 3787, + 4085, 2902, 3787, + 4085, 2903, 3786, + 4084, 2906, 3786, + 4084, 2909, 3785, + 4083, 2913, 3784, + 4082, 2918, 3783, + 4081, 2926, 3781, + 4079, 2935, 3779, + 4077, 2947, 3775, + 4074, 2963, 3771, + 4070, 2984, 3765, + 4065, 3010, 3757, + 4058, 3043, 3747, + 4048, 3083, 3732, + 4035, 3132, 3711, + 4016, 3190, 3682, + 3990, 3258, 3640, + 3953, 3335, 3577, + 3897, 3421, 3476, + 3811, 3516, 3293, + 3661, 3617, 2796, + 3327, 3725, 0, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3028, 3919, + 4095, 3028, 3919, + 4095, 3028, 3919, + 4095, 3029, 3919, + 4095, 3029, 3919, + 4095, 3030, 3919, + 4095, 3031, 3919, + 4095, 3032, 3918, + 4095, 3034, 3918, + 4095, 3036, 3917, + 4095, 3039, 3917, + 4095, 3044, 3916, + 4095, 3049, 3914, + 4095, 3056, 3913, + 4095, 3066, 3910, + 4095, 3078, 3907, + 4095, 3094, 3903, + 4095, 3115, 3897, + 4095, 3141, 3889, + 4095, 3174, 3878, + 4095, 3214, 3863, + 4095, 3263, 3843, + 4095, 3321, 3814, + 4095, 3389, 3772, + 4085, 3467, 3709, + 4030, 3553, 3608, + 3943, 3647, 3424, + 3794, 3749, 2925, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3159, 4051, + 4095, 3159, 4051, + 4095, 3159, 4051, + 4095, 3160, 4051, + 4095, 3160, 4051, + 4095, 3161, 4051, + 4095, 3162, 4050, + 4095, 3163, 4050, + 4095, 3165, 4050, + 4095, 3167, 4049, + 4095, 3170, 4048, + 4095, 3175, 4047, + 4095, 3180, 4046, + 4095, 3187, 4044, + 4095, 3197, 4042, + 4095, 3209, 4039, + 4095, 3225, 4035, + 4095, 3246, 4029, + 4095, 3272, 4021, + 4095, 3305, 4010, + 4095, 3346, 3995, + 4095, 3395, 3975, + 4095, 3453, 3946, + 4095, 3521, 3903, + 4095, 3598, 3840, + 4095, 3685, 3739, + 4075, 3779, 3555, + 0, 1092, 1347, + 0, 1097, 1342, + 0, 1104, 1336, + 0, 1112, 1327, + 0, 1124, 1315, + 0, 1139, 1298, + 0, 1159, 1275, + 0, 1183, 1242, + 0, 1215, 1193, + 0, 1253, 1119, + 0, 1300, 996, + 0, 1356, 751, + 0, 1422, 0, + 0, 1497, 0, + 0, 1581, 0, + 0, 1674, 0, + 0, 1774, 0, + 0, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1093, 1354, + 0, 1098, 1350, + 0, 1105, 1343, + 0, 1114, 1335, + 0, 1126, 1323, + 0, 1141, 1306, + 0, 1160, 1283, + 0, 1185, 1251, + 0, 1216, 1203, + 0, 1254, 1131, + 0, 1301, 1011, + 0, 1357, 777, + 0, 1423, 0, + 0, 1498, 0, + 0, 1582, 0, + 0, 1674, 0, + 0, 1775, 0, + 0, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1096, 1364, + 0, 1101, 1359, + 0, 1107, 1353, + 0, 1116, 1344, + 0, 1128, 1333, + 0, 1143, 1317, + 0, 1162, 1294, + 0, 1187, 1262, + 0, 1218, 1216, + 0, 1256, 1146, + 0, 1303, 1031, + 0, 1359, 809, + 0, 1424, 0, + 0, 1499, 0, + 0, 1583, 0, + 0, 1675, 0, + 0, 1775, 0, + 0, 1882, 0, + 0, 1994, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1099, 1376, + 0, 1104, 1371, + 0, 1110, 1365, + 0, 1119, 1357, + 0, 1131, 1346, + 0, 1146, 1330, + 0, 1165, 1308, + 0, 1189, 1278, + 0, 1220, 1233, + 0, 1258, 1165, + 0, 1305, 1056, + 0, 1360, 850, + 0, 1425, 185, + 0, 1500, 0, + 0, 1584, 0, + 0, 1676, 0, + 0, 1776, 0, + 0, 1882, 0, + 0, 1994, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1103, 1392, + 0, 1108, 1387, + 0, 1114, 1381, + 0, 1123, 1373, + 0, 1135, 1363, + 0, 1149, 1348, + 0, 1168, 1327, + 0, 1193, 1297, + 0, 1223, 1255, + 0, 1261, 1190, + 0, 1307, 1087, + 0, 1363, 898, + 0, 1427, 365, + 0, 1502, 0, + 0, 1585, 0, + 0, 1677, 0, + 0, 1777, 0, + 0, 1883, 0, + 0, 1995, 0, + 0, 2111, 0, + 0, 2231, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1108, 1412, + 0, 1113, 1408, + 0, 1120, 1402, + 0, 1128, 1395, + 0, 1140, 1384, + 0, 1154, 1370, + 0, 1173, 1350, + 0, 1197, 1322, + 0, 1227, 1282, + 0, 1265, 1222, + 0, 1311, 1126, + 0, 1366, 956, + 0, 1430, 530, + 0, 1504, 0, + 0, 1587, 0, + 0, 1679, 0, + 0, 1778, 0, + 0, 1884, 0, + 0, 1995, 0, + 0, 2112, 0, + 0, 2231, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1115, 1438, + 0, 1120, 1434, + 0, 1127, 1429, + 0, 1135, 1421, + 0, 1146, 1412, + 0, 1161, 1398, + 0, 1179, 1380, + 0, 1203, 1353, + 0, 1233, 1316, + 0, 1270, 1260, + 0, 1315, 1173, + 0, 1370, 1023, + 0, 1434, 686, + 0, 1507, 0, + 0, 1590, 0, + 0, 1681, 0, + 0, 1780, 0, + 0, 1885, 0, + 0, 1996, 0, + 0, 2112, 0, + 0, 2232, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 503, 1125, 1470, + 461, 1130, 1467, + 397, 1136, 1462, + 296, 1144, 1455, + 111, 1155, 1446, + 0, 1169, 1433, + 0, 1188, 1416, + 0, 1211, 1392, + 0, 1240, 1358, + 0, 1277, 1307, + 0, 1322, 1230, + 0, 1375, 1100, + 0, 1438, 834, + 0, 1511, 0, + 0, 1593, 0, + 0, 1683, 0, + 0, 1782, 0, + 0, 1887, 0, + 0, 1998, 0, + 0, 2113, 0, + 0, 2233, 0, + 0, 2355, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 919, 1137, 1510, + 902, 1142, 1507, + 879, 1148, 1502, + 847, 1156, 1496, + 799, 1167, 1488, + 726, 1180, 1477, + 606, 1198, 1461, + 371, 1221, 1439, + 0, 1250, 1409, + 0, 1286, 1364, + 0, 1330, 1296, + 0, 1382, 1186, + 0, 1444, 978, + 0, 1516, 303, + 0, 1597, 0, + 0, 1687, 0, + 0, 1785, 0, + 0, 1889, 0, + 0, 2000, 0, + 0, 2115, 0, + 0, 2234, 0, + 0, 2356, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1186, 1153, 1559, + 1177, 1158, 1556, + 1165, 1164, 1552, + 1148, 1171, 1546, + 1124, 1182, 1539, + 1090, 1195, 1529, + 1039, 1212, 1515, + 962, 1234, 1496, + 834, 1262, 1468, + 572, 1297, 1429, + 0, 1340, 1371, + 0, 1392, 1280, + 0, 1453, 1119, + 0, 1523, 738, + 0, 1603, 0, + 0, 1692, 0, + 0, 1789, 0, + 0, 1892, 0, + 0, 2002, 0, + 0, 2117, 0, + 0, 2235, 0, + 0, 2357, 0, + 0, 2481, 0, + 0, 2607, 0, + 0, 2735, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1398, 1174, 1617, + 1393, 1178, 1614, + 1385, 1184, 1610, + 1375, 1191, 1606, + 1360, 1201, 1599, + 1340, 1214, 1590, + 1312, 1230, 1578, + 1271, 1251, 1561, + 1211, 1278, 1538, + 1114, 1312, 1505, + 942, 1354, 1456, + 504, 1404, 1382, + 0, 1463, 1258, + 0, 1532, 1012, + 0, 1611, 0, + 0, 1698, 0, + 0, 1794, 0, + 0, 1896, 0, + 0, 2005, 0, + 0, 2119, 0, + 0, 2237, 0, + 0, 2358, 0, + 0, 2482, 0, + 0, 2608, 0, + 0, 2735, 0, + 0, 2864, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1582, 1200, 1684, + 1579, 1204, 1682, + 1573, 1209, 1679, + 1567, 1216, 1674, + 1557, 1225, 1669, + 1544, 1237, 1661, + 1527, 1253, 1651, + 1502, 1273, 1637, + 1466, 1299, 1617, + 1414, 1331, 1589, + 1332, 1371, 1549, + 1195, 1420, 1489, + 903, 1477, 1395, + 0, 1544, 1226, + 0, 1621, 810, + 0, 1707, 0, + 0, 1801, 0, + 0, 1902, 0, + 0, 2010, 0, + 0, 2123, 0, + 0, 2240, 0, + 0, 2360, 0, + 0, 2484, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 1750, 1232, 1761, + 1747, 1236, 1759, + 1744, 1241, 1756, + 1739, 1248, 1753, + 1732, 1256, 1748, + 1724, 1268, 1742, + 1712, 1282, 1733, + 1695, 1301, 1721, + 1672, 1326, 1705, + 1640, 1356, 1682, + 1592, 1394, 1650, + 1520, 1440, 1602, + 1400, 1495, 1530, + 1165, 1560, 1412, + 102, 1634, 1180, + 0, 1718, 189, + 0, 1809, 0, + 0, 1909, 0, + 0, 2015, 0, + 0, 2127, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 1906, 1272, 1846, + 1905, 1276, 1845, + 1902, 1280, 1843, + 1899, 1286, 1840, + 1894, 1294, 1836, + 1888, 1305, 1831, + 1880, 1319, 1824, + 1869, 1336, 1814, + 1853, 1359, 1801, + 1831, 1387, 1782, + 1801, 1422, 1757, + 1756, 1466, 1720, + 1689, 1518, 1665, + 1580, 1580, 1580, + 1375, 1651, 1434, + 723, 1732, 1111, + 0, 1821, 0, + 0, 1918, 0, + 0, 2023, 0, + 0, 2133, 0, + 0, 2248, 0, + 0, 2366, 0, + 0, 2488, 0, + 0, 2613, 0, + 0, 2739, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2056, 1321, 1941, + 2055, 1324, 1939, + 2053, 1328, 1938, + 2051, 1334, 1935, + 2047, 1341, 1932, + 2043, 1350, 1928, + 2037, 1363, 1922, + 2029, 1379, 1914, + 2018, 1399, 1904, + 2003, 1425, 1889, + 1983, 1458, 1869, + 1953, 1498, 1840, + 1911, 1547, 1799, + 1847, 1605, 1737, + 1745, 1673, 1639, + 1558, 1750, 1461, + 1037, 1836, 997, + 0, 1931, 0, + 0, 2032, 0, + 0, 2140, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2201, 1379, 2042, + 2200, 1382, 2041, + 2199, 1386, 2040, + 2197, 1390, 2038, + 2195, 1397, 2035, + 2191, 1405, 2032, + 2187, 1416, 2027, + 2182, 1430, 2021, + 2174, 1449, 2013, + 2163, 1472, 2001, + 2149, 1502, 1986, + 2129, 1538, 1964, + 2100, 1583, 1933, + 2059, 1637, 1887, + 1998, 1701, 1819, + 1900, 1774, 1707, + 1724, 1856, 1496, + 1270, 1947, 780, + 0, 2045, 0, + 0, 2151, 0, + 0, 2262, 0, + 0, 2377, 0, + 0, 2497, 0, + 0, 2619, 0, + 0, 2744, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2342, 1447, 2150, + 2342, 1449, 2149, + 2341, 1452, 2148, + 2339, 1456, 2146, + 2338, 1462, 2145, + 2335, 1469, 2142, + 2332, 1479, 2138, + 2328, 1491, 2133, + 2323, 1507, 2127, + 2315, 1528, 2118, + 2305, 1554, 2106, + 2290, 1587, 2089, + 2271, 1628, 2066, + 2243, 1677, 2032, + 2203, 1735, 1984, + 2143, 1803, 1909, + 2049, 1881, 1785, + 1880, 1967, 1538, + 1465, 2062, 3, + 0, 2164, 0, + 0, 2272, 0, + 0, 2385, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2481, 1524, 2263, + 2481, 1526, 2262, + 2480, 1528, 2261, + 2479, 1532, 2260, + 2478, 1537, 2259, + 2476, 1543, 2257, + 2474, 1551, 2254, + 2471, 1561, 2250, + 2467, 1575, 2245, + 2461, 1593, 2238, + 2454, 1616, 2229, + 2444, 1645, 2216, + 2430, 1681, 2199, + 2410, 1725, 2174, + 2383, 1778, 2139, + 2344, 1840, 2087, + 2285, 1912, 2007, + 2193, 1993, 1872, + 2030, 2083, 1589, + 1639, 2181, 0, + 0, 2285, 0, + 0, 2396, 0, + 0, 2511, 0, + 0, 2630, 0, + 0, 2752, 0, + 0, 2876, 0, + 0, 3003, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2618, 1610, 2380, + 2618, 1611, 2380, + 2617, 1614, 2379, + 2617, 1617, 2378, + 2616, 1620, 2377, + 2615, 1626, 2375, + 2613, 1632, 2373, + 2611, 1641, 2370, + 2608, 1653, 2367, + 2604, 1668, 2361, + 2598, 1687, 2354, + 2591, 1712, 2345, + 2581, 1743, 2331, + 2567, 1782, 2313, + 2548, 1829, 2287, + 2521, 1885, 2251, + 2482, 1950, 2197, + 2424, 2026, 2112, + 2333, 2110, 1967, + 2174, 2202, 1650, + 1800, 2303, 0, + 0, 2409, 0, + 0, 2522, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 2754, 1704, 2501, + 2754, 1705, 2500, + 2754, 1707, 2500, + 2753, 1710, 2499, + 2752, 1713, 2498, + 2751, 1717, 2497, + 2750, 1723, 2496, + 2749, 1730, 2493, + 2746, 1739, 2490, + 2743, 1752, 2486, + 2739, 1768, 2481, + 2734, 1789, 2474, + 2727, 1815, 2464, + 2717, 1849, 2450, + 2703, 1889, 2432, + 2684, 1939, 2405, + 2657, 1997, 2367, + 2619, 2066, 2311, + 2562, 2143, 2223, + 2472, 2230, 2069, + 2315, 2325, 1720, + 1952, 2427, 0, + 0, 2535, 0, + 0, 2649, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3392, 0, + 0, 3522, 0, + 0, 3652, 0, + 2889, 1806, 2624, + 2889, 1807, 2624, + 2889, 1808, 2624, + 2888, 1810, 2623, + 2888, 1813, 2622, + 2887, 1816, 2621, + 2886, 1821, 2620, + 2885, 1826, 2619, + 2883, 1834, 2616, + 2881, 1844, 2613, + 2878, 1858, 2609, + 2874, 1875, 2604, + 2869, 1897, 2596, + 2861, 1925, 2586, + 2852, 1959, 2572, + 2838, 2002, 2553, + 2819, 2054, 2526, + 2792, 2114, 2487, + 2754, 2185, 2429, + 2698, 2265, 2338, + 2609, 2353, 2178, + 2454, 2450, 1799, + 2099, 2553, 0, + 0, 2663, 0, + 0, 2777, 0, + 0, 2896, 0, + 0, 3018, 0, + 0, 3142, 0, + 0, 3268, 0, + 0, 3395, 0, + 0, 3524, 0, + 0, 3653, 0, + 3023, 1914, 2750, + 3023, 1915, 2749, + 3023, 1916, 2749, + 3023, 1917, 2749, + 3022, 1919, 2748, + 3022, 1922, 2748, + 3021, 1925, 2747, + 3020, 1930, 2745, + 3019, 1936, 2744, + 3017, 1944, 2741, + 3015, 1955, 2738, + 3012, 1969, 2734, + 3008, 1987, 2729, + 3003, 2010, 2721, + 2996, 2039, 2711, + 2986, 2075, 2697, + 2972, 2119, 2677, + 2953, 2172, 2650, + 2927, 2235, 2610, + 2889, 2307, 2551, + 2833, 2388, 2457, + 2744, 2478, 2291, + 2591, 2576, 1888, + 2242, 2681, 0, + 0, 2792, 0, + 0, 2907, 0, + 0, 3026, 0, + 0, 3148, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3655, 0, + 3157, 2027, 2877, + 3157, 2028, 2877, + 3157, 2028, 2876, + 3156, 2030, 2876, + 3156, 2031, 2876, + 3156, 2033, 2875, + 3155, 2036, 2874, + 3155, 2040, 2874, + 3154, 2045, 2872, + 3152, 2051, 2871, + 3151, 2059, 2868, + 3149, 2071, 2865, + 3146, 2085, 2861, + 3142, 2104, 2855, + 3136, 2127, 2848, + 3129, 2157, 2837, + 3119, 2194, 2823, + 3106, 2240, 2803, + 3087, 2294, 2775, + 3061, 2358, 2735, + 3023, 2431, 2675, + 2967, 2514, 2579, + 2879, 2605, 2409, + 2727, 2704, 1984, + 2382, 2810, 0, + 0, 2921, 0, + 0, 3037, 0, + 0, 3157, 0, + 0, 3279, 0, + 0, 3404, 0, + 0, 3530, 0, + 0, 3658, 0, + 3290, 2144, 3005, + 3290, 2145, 3005, + 3290, 2145, 3005, + 3290, 2146, 3005, + 3290, 2148, 3004, + 3289, 2149, 3004, + 3289, 2151, 3003, + 3288, 2154, 3003, + 3288, 2158, 3002, + 3287, 2163, 3000, + 3286, 2170, 2999, + 3284, 2178, 2996, + 3282, 2190, 2993, + 3279, 2205, 2989, + 3275, 2224, 2983, + 3270, 2248, 2976, + 3262, 2279, 2965, + 3253, 2317, 2951, + 3239, 2363, 2931, + 3220, 2418, 2902, + 3194, 2483, 2862, + 3156, 2558, 2801, + 3101, 2641, 2704, + 3013, 2733, 2530, + 2862, 2833, 2087, + 2520, 2939, 0, + 0, 3051, 0, + 0, 3168, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 3423, 2265, 3134, + 3423, 2265, 3134, + 3423, 2266, 3134, + 3423, 2267, 3134, + 3423, 2268, 3134, + 3422, 2269, 3133, + 3422, 2270, 3133, + 3422, 2273, 3132, + 3421, 2276, 3132, + 3421, 2279, 3131, + 3420, 2285, 3130, + 3418, 2291, 3128, + 3417, 2300, 3125, + 3415, 2312, 3122, + 3412, 2327, 3118, + 3408, 2347, 3112, + 3403, 2371, 3105, + 3395, 2403, 3094, + 3386, 2441, 3080, + 3372, 2488, 3059, + 3353, 2545, 3031, + 3327, 2610, 2990, + 3290, 2685, 2928, + 3234, 2770, 2830, + 3147, 2863, 2654, + 2996, 2963, 2197, + 2656, 3070, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 3556, 2388, 3264, + 3556, 2389, 3264, + 3556, 2389, 3264, + 3556, 2390, 3264, + 3555, 2390, 3264, + 3555, 2391, 3264, + 3555, 2393, 3263, + 3555, 2394, 3263, + 3554, 2397, 3262, + 3554, 2400, 3262, + 3553, 2403, 3261, + 3552, 2409, 3259, + 3551, 2416, 3258, + 3550, 2425, 3255, + 3547, 2437, 3252, + 3544, 2452, 3248, + 3541, 2472, 3242, + 3535, 2497, 3234, + 3528, 2529, 3224, + 3518, 2568, 3209, + 3505, 2615, 3189, + 3486, 2672, 3160, + 3460, 2738, 3119, + 3422, 2814, 3057, + 3367, 2899, 2958, + 3280, 2992, 2780, + 3130, 3093, 2311, + 2791, 3200, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 3688, 2514, 3395, + 3688, 2514, 3395, + 3688, 2515, 3395, + 3688, 2515, 3395, + 3688, 2515, 3394, + 3688, 2516, 3394, + 3688, 2517, 3394, + 3688, 2518, 3394, + 3687, 2520, 3393, + 3687, 2522, 3393, + 3686, 2525, 3392, + 3686, 2529, 3391, + 3685, 2535, 3390, + 3684, 2542, 3388, + 3682, 2551, 3386, + 3680, 2563, 3383, + 3677, 2579, 3378, + 3673, 2599, 3373, + 3668, 2624, 3365, + 3661, 2656, 3354, + 3651, 2696, 3339, + 3637, 2744, 3319, + 3619, 2801, 3290, + 3593, 2868, 3249, + 3555, 2944, 3186, + 3500, 3029, 3087, + 3413, 3123, 2907, + 3263, 3224, 2429, + 2926, 3331, 0, + 0, 3444, 0, + 0, 3561, 0, + 0, 3682, 0, + 3821, 2641, 3526, + 3821, 2641, 3526, + 3821, 2641, 3526, + 3821, 2642, 3526, + 3821, 2642, 3525, + 3821, 2643, 3525, + 3820, 2643, 3525, + 3820, 2644, 3525, + 3820, 2646, 3525, + 3820, 2647, 3524, + 3819, 2650, 3524, + 3819, 2653, 3523, + 3818, 2657, 3522, + 3817, 2662, 3521, + 3816, 2669, 3519, + 3815, 2679, 3517, + 3812, 2691, 3513, + 3809, 2706, 3509, + 3806, 2727, 3503, + 3800, 2752, 3495, + 3793, 2785, 3485, + 3783, 2825, 3470, + 3770, 2873, 3450, + 3751, 2930, 3421, + 3725, 2998, 3379, + 3688, 3074, 3316, + 3632, 3160, 3216, + 3546, 3254, 3035, + 3396, 3355, 2551, + 3060, 3463, 0, + 0, 3576, 0, + 0, 3693, 0, + 3953, 2769, 3657, + 3953, 2770, 3657, + 3953, 2770, 3657, + 3953, 2770, 3657, + 3953, 2770, 3657, + 3953, 2771, 3657, + 3953, 2771, 3656, + 3953, 2772, 3656, + 3953, 2773, 3656, + 3952, 2774, 3656, + 3952, 2776, 3655, + 3952, 2778, 3655, + 3951, 2781, 3654, + 3951, 2785, 3653, + 3950, 2791, 3652, + 3948, 2798, 3650, + 3947, 2807, 3648, + 3945, 2820, 3644, + 3942, 2835, 3640, + 3938, 2856, 3634, + 3933, 2882, 3627, + 3925, 2914, 3616, + 3916, 2954, 3601, + 3902, 3003, 3581, + 3884, 3061, 3552, + 3858, 3128, 3510, + 3820, 3205, 3447, + 3765, 3291, 3347, + 3678, 3385, 3165, + 3528, 3486, 2675, + 3193, 3594, 0, + 0, 3707, 0, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2900, 3788, + 4085, 2900, 3788, + 4085, 2901, 3788, + 4085, 2901, 3788, + 4085, 2902, 3787, + 4085, 2904, 3787, + 4084, 2905, 3787, + 4084, 2908, 3786, + 4084, 2911, 3785, + 4083, 2915, 3784, + 4082, 2920, 3783, + 4081, 2928, 3781, + 4079, 2937, 3779, + 4077, 2949, 3776, + 4074, 2965, 3772, + 4070, 2986, 3766, + 4065, 3012, 3758, + 4058, 3044, 3747, + 4048, 3084, 3732, + 4035, 3133, 3712, + 4016, 3191, 3683, + 3990, 3259, 3641, + 3952, 3336, 3578, + 3897, 3422, 3477, + 3811, 3516, 3295, + 3661, 3618, 2801, + 3326, 3726, 0, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3030, 3920, + 4095, 3030, 3920, + 4095, 3031, 3919, + 4095, 3031, 3919, + 4095, 3032, 3919, + 4095, 3034, 3919, + 4095, 3035, 3918, + 4095, 3038, 3918, + 4095, 3041, 3917, + 4095, 3045, 3916, + 4095, 3050, 3915, + 4095, 3058, 3913, + 4095, 3067, 3911, + 4095, 3079, 3907, + 4095, 3095, 3903, + 4095, 3116, 3897, + 4095, 3142, 3889, + 4095, 3175, 3879, + 4095, 3215, 3864, + 4095, 3264, 3843, + 4095, 3322, 3814, + 4095, 3390, 3772, + 4085, 3467, 3709, + 4029, 3553, 3609, + 3943, 3648, 3425, + 3793, 3750, 2928, + 4095, 3159, 4052, + 4095, 3159, 4052, + 4095, 3159, 4052, + 4095, 3159, 4052, + 4095, 3160, 4052, + 4095, 3160, 4051, + 4095, 3160, 4051, + 4095, 3160, 4051, + 4095, 3161, 4051, + 4095, 3161, 4051, + 4095, 3162, 4051, + 4095, 3163, 4051, + 4095, 3164, 4050, + 4095, 3166, 4050, + 4095, 3168, 4049, + 4095, 3171, 4049, + 4095, 3176, 4048, + 4095, 3181, 4046, + 4095, 3188, 4045, + 4095, 3198, 4042, + 4095, 3210, 4039, + 4095, 3226, 4035, + 4095, 3247, 4029, + 4095, 3273, 4021, + 4095, 3306, 4010, + 4095, 3346, 3996, + 4095, 3395, 3975, + 4095, 3454, 3946, + 4095, 3521, 3904, + 4095, 3599, 3841, + 4095, 3685, 3740, + 4075, 3780, 3556, + 0, 1218, 1478, + 0, 1222, 1474, + 0, 1228, 1469, + 0, 1234, 1463, + 0, 1243, 1454, + 0, 1255, 1441, + 0, 1270, 1424, + 0, 1290, 1401, + 0, 1314, 1367, + 0, 1346, 1318, + 0, 1384, 1242, + 0, 1431, 1116, + 0, 1488, 863, + 0, 1553, 0, + 0, 1629, 0, + 0, 1713, 0, + 0, 1806, 0, + 0, 1906, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1220, 1483, + 0, 1224, 1479, + 0, 1229, 1475, + 0, 1236, 1468, + 0, 1245, 1459, + 0, 1256, 1447, + 0, 1271, 1430, + 0, 1291, 1407, + 0, 1316, 1374, + 0, 1347, 1325, + 0, 1385, 1251, + 0, 1432, 1128, + 0, 1488, 883, + 0, 1554, 0, + 0, 1629, 0, + 0, 1713, 0, + 0, 1806, 0, + 0, 1906, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1222, 1490, + 0, 1225, 1486, + 0, 1231, 1482, + 0, 1237, 1475, + 0, 1246, 1467, + 0, 1258, 1455, + 0, 1273, 1438, + 0, 1292, 1415, + 0, 1317, 1383, + 0, 1348, 1335, + 0, 1387, 1263, + 0, 1433, 1143, + 0, 1489, 909, + 0, 1555, 0, + 0, 1630, 0, + 0, 1714, 0, + 0, 1807, 0, + 0, 1907, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1224, 1499, + 0, 1228, 1496, + 0, 1233, 1491, + 0, 1240, 1485, + 0, 1248, 1476, + 0, 1260, 1465, + 0, 1275, 1449, + 0, 1294, 1426, + 0, 1319, 1395, + 0, 1350, 1348, + 0, 1388, 1278, + 0, 1435, 1163, + 0, 1491, 942, + 0, 1556, 111, + 0, 1631, 0, + 0, 1715, 0, + 0, 1807, 0, + 0, 1907, 0, + 0, 2014, 0, + 0, 2126, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1227, 1511, + 0, 1231, 1508, + 0, 1236, 1503, + 0, 1243, 1497, + 0, 1251, 1489, + 0, 1263, 1478, + 0, 1278, 1462, + 0, 1297, 1441, + 0, 1321, 1410, + 0, 1352, 1365, + 0, 1390, 1298, + 0, 1437, 1188, + 0, 1492, 982, + 0, 1557, 317, + 0, 1632, 0, + 0, 1716, 0, + 0, 1808, 0, + 0, 1908, 0, + 0, 2014, 0, + 0, 2126, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1231, 1527, + 0, 1235, 1524, + 0, 1240, 1519, + 0, 1247, 1514, + 0, 1255, 1506, + 0, 1267, 1495, + 0, 1281, 1480, + 0, 1300, 1459, + 0, 1325, 1429, + 0, 1355, 1387, + 0, 1393, 1322, + 0, 1439, 1219, + 0, 1495, 1030, + 0, 1559, 497, + 0, 1634, 0, + 0, 1717, 0, + 0, 1809, 0, + 0, 1909, 0, + 0, 2015, 0, + 0, 2127, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1237, 1547, + 0, 1240, 1544, + 0, 1245, 1540, + 0, 1252, 1534, + 0, 1260, 1527, + 0, 1272, 1516, + 0, 1286, 1502, + 0, 1305, 1482, + 0, 1329, 1454, + 0, 1360, 1414, + 0, 1397, 1354, + 0, 1443, 1258, + 0, 1498, 1088, + 0, 1562, 662, + 0, 1636, 0, + 0, 1719, 0, + 0, 1811, 0, + 0, 1910, 0, + 0, 2016, 0, + 0, 2128, 0, + 0, 2244, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1244, 1573, + 0, 1248, 1570, + 0, 1252, 1566, + 0, 1259, 1561, + 0, 1267, 1554, + 0, 1278, 1544, + 0, 1293, 1530, + 0, 1311, 1512, + 0, 1335, 1486, + 0, 1365, 1448, + 0, 1402, 1392, + 0, 1448, 1306, + 0, 1502, 1155, + 0, 1566, 818, + 0, 1639, 0, + 0, 1722, 0, + 0, 1813, 0, + 0, 1912, 0, + 0, 2017, 0, + 0, 2129, 0, + 0, 2244, 0, + 0, 2364, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 664, 1253, 1605, + 635, 1257, 1602, + 593, 1262, 1599, + 530, 1268, 1594, + 428, 1276, 1587, + 243, 1287, 1578, + 0, 1301, 1566, + 0, 1320, 1548, + 0, 1343, 1524, + 0, 1372, 1490, + 0, 1409, 1440, + 0, 1454, 1362, + 0, 1507, 1232, + 0, 1570, 966, + 0, 1643, 0, + 0, 1725, 0, + 0, 1816, 0, + 0, 1914, 0, + 0, 2019, 0, + 0, 2130, 0, + 0, 2245, 0, + 0, 2365, 0, + 0, 2487, 0, + 0, 2612, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3517, 0, + 0, 3648, 0, + 1063, 1266, 1645, + 1051, 1269, 1642, + 1034, 1274, 1639, + 1011, 1280, 1635, + 979, 1288, 1628, + 931, 1299, 1620, + 858, 1313, 1609, + 738, 1330, 1593, + 503, 1353, 1571, + 0, 1382, 1541, + 0, 1418, 1496, + 0, 1462, 1428, + 0, 1514, 1318, + 0, 1577, 1110, + 0, 1648, 435, + 0, 1729, 0, + 0, 1819, 0, + 0, 1917, 0, + 0, 2021, 0, + 0, 2132, 0, + 0, 2247, 0, + 0, 2366, 0, + 0, 2488, 0, + 0, 2612, 0, + 0, 2739, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1325, 1282, 1693, + 1318, 1285, 1691, + 1309, 1290, 1688, + 1297, 1296, 1684, + 1280, 1303, 1678, + 1256, 1314, 1671, + 1222, 1327, 1661, + 1172, 1344, 1647, + 1095, 1366, 1628, + 966, 1394, 1601, + 704, 1429, 1562, + 0, 1472, 1503, + 0, 1524, 1412, + 0, 1585, 1251, + 0, 1655, 870, + 0, 1735, 0, + 0, 1824, 0, + 0, 1921, 0, + 0, 2024, 0, + 0, 2134, 0, + 0, 2249, 0, + 0, 2367, 0, + 0, 2489, 0, + 0, 2613, 0, + 0, 2739, 0, + 0, 2867, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1535, 1302, 1751, + 1530, 1306, 1749, + 1525, 1310, 1746, + 1517, 1316, 1742, + 1507, 1323, 1738, + 1492, 1333, 1731, + 1472, 1346, 1722, + 1444, 1362, 1710, + 1404, 1384, 1693, + 1343, 1411, 1670, + 1246, 1444, 1637, + 1074, 1486, 1588, + 636, 1536, 1514, + 0, 1595, 1390, + 0, 1664, 1144, + 0, 1743, 0, + 0, 1830, 0, + 0, 1926, 0, + 0, 2029, 0, + 0, 2137, 0, + 0, 2251, 0, + 0, 2369, 0, + 0, 2490, 0, + 0, 2614, 0, + 0, 2740, 0, + 0, 2867, 0, + 0, 2996, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1717, 1329, 1818, + 1714, 1332, 1816, + 1711, 1336, 1814, + 1706, 1341, 1811, + 1699, 1348, 1806, + 1689, 1357, 1801, + 1676, 1370, 1793, + 1659, 1385, 1783, + 1634, 1406, 1769, + 1598, 1431, 1749, + 1546, 1464, 1721, + 1465, 1503, 1681, + 1327, 1552, 1621, + 1035, 1609, 1527, + 0, 1676, 1358, + 0, 1753, 942, + 0, 1839, 0, + 0, 1933, 0, + 0, 2034, 0, + 0, 2142, 0, + 0, 2255, 0, + 0, 2372, 0, + 0, 2492, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1884, 1361, 1894, + 1882, 1364, 1893, + 1879, 1368, 1891, + 1876, 1373, 1888, + 1871, 1380, 1885, + 1865, 1388, 1880, + 1856, 1400, 1874, + 1844, 1414, 1865, + 1827, 1433, 1853, + 1805, 1458, 1837, + 1772, 1488, 1814, + 1724, 1526, 1782, + 1652, 1572, 1734, + 1532, 1627, 1662, + 1297, 1692, 1544, + 234, 1766, 1313, + 0, 1850, 322, + 0, 1942, 0, + 0, 2041, 0, + 0, 2147, 0, + 0, 2259, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 2040, 1402, 1980, + 2038, 1405, 1979, + 2037, 1408, 1977, + 2034, 1413, 1975, + 2031, 1419, 1972, + 2026, 1427, 1968, + 2020, 1437, 1963, + 2012, 1451, 1956, + 2001, 1468, 1946, + 1985, 1491, 1933, + 1964, 1519, 1914, + 1933, 1555, 1889, + 1888, 1598, 1852, + 1821, 1650, 1797, + 1712, 1712, 1712, + 1507, 1783, 1566, + 855, 1864, 1243, + 0, 1953, 0, + 0, 2051, 0, + 0, 2155, 0, + 0, 2265, 0, + 0, 2380, 0, + 0, 2499, 0, + 0, 2620, 0, + 0, 2745, 0, + 0, 2871, 0, + 0, 2999, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2189, 1451, 2074, + 2188, 1453, 2073, + 2187, 1456, 2071, + 2185, 1461, 2070, + 2183, 1466, 2067, + 2180, 1473, 2064, + 2175, 1483, 2060, + 2169, 1495, 2054, + 2161, 1511, 2046, + 2151, 1531, 2036, + 2136, 1557, 2021, + 2115, 1590, 2001, + 2085, 1630, 1972, + 2043, 1679, 1931, + 1979, 1737, 1869, + 1877, 1805, 1771, + 1690, 1882, 1593, + 1170, 1968, 1129, + 0, 2063, 0, + 0, 2165, 0, + 0, 2273, 0, + 0, 2386, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2334, 1509, 2175, + 2333, 1511, 2174, + 2332, 1514, 2173, + 2331, 1518, 2172, + 2329, 1522, 2170, + 2327, 1529, 2167, + 2324, 1537, 2164, + 2319, 1548, 2159, + 2314, 1562, 2153, + 2306, 1581, 2145, + 2295, 1604, 2134, + 2281, 1634, 2118, + 2261, 1671, 2096, + 2232, 1716, 2065, + 2191, 1769, 2019, + 2130, 1833, 1951, + 2032, 1906, 1839, + 1856, 1988, 1628, + 1402, 2079, 912, + 0, 2177, 0, + 0, 2283, 0, + 0, 2394, 0, + 0, 2509, 0, + 0, 2629, 0, + 0, 2751, 0, + 0, 2876, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2475, 1577, 2283, + 2474, 1579, 2282, + 2474, 1581, 2281, + 2473, 1584, 2280, + 2472, 1588, 2279, + 2470, 1594, 2277, + 2468, 1601, 2274, + 2464, 1611, 2270, + 2460, 1623, 2266, + 2455, 1639, 2259, + 2447, 1660, 2250, + 2437, 1686, 2238, + 2423, 1719, 2221, + 2403, 1760, 2198, + 2375, 1809, 2165, + 2335, 1867, 2116, + 2275, 1935, 2041, + 2181, 2013, 1917, + 2012, 2099, 1670, + 1597, 2194, 135, + 0, 2296, 0, + 0, 2404, 0, + 0, 2517, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2614, 1654, 2395, + 2613, 1656, 2395, + 2613, 1658, 2394, + 2612, 1660, 2393, + 2611, 1664, 2392, + 2610, 1669, 2391, + 2608, 1675, 2389, + 2606, 1683, 2386, + 2603, 1694, 2382, + 2599, 1707, 2377, + 2593, 1725, 2370, + 2586, 1748, 2361, + 2576, 1777, 2348, + 2562, 1813, 2331, + 2542, 1857, 2306, + 2515, 1910, 2271, + 2476, 1972, 2219, + 2417, 2044, 2139, + 2325, 2125, 2004, + 2162, 2215, 1721, + 1771, 2313, 0, + 0, 2417, 0, + 0, 2528, 0, + 0, 2643, 0, + 0, 2762, 0, + 0, 2884, 0, + 0, 3009, 0, + 0, 3135, 0, + 0, 3263, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2751, 1741, 2513, + 2750, 1742, 2512, + 2750, 1744, 2512, + 2750, 1746, 2511, + 2749, 1749, 2510, + 2748, 1753, 2509, + 2747, 1758, 2507, + 2745, 1764, 2505, + 2743, 1773, 2502, + 2740, 1785, 2499, + 2736, 1800, 2493, + 2730, 1819, 2486, + 2723, 1844, 2477, + 2713, 1875, 2464, + 2699, 1914, 2445, + 2680, 1961, 2420, + 2653, 2017, 2383, + 2614, 2083, 2329, + 2556, 2158, 2244, + 2466, 2242, 2099, + 2306, 2335, 1782, + 1932, 2435, 0, + 0, 2542, 0, + 0, 2654, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2887, 1835, 2633, + 2886, 1836, 2633, + 2886, 1838, 2633, + 2886, 1839, 2632, + 2885, 1842, 2631, + 2884, 1845, 2630, + 2884, 1849, 2629, + 2882, 1855, 2628, + 2881, 1862, 2625, + 2878, 1872, 2623, + 2875, 1884, 2619, + 2871, 1900, 2613, + 2866, 1921, 2606, + 2859, 1948, 2596, + 2849, 1981, 2582, + 2835, 2021, 2564, + 2816, 2071, 2537, + 2789, 2130, 2499, + 2751, 2198, 2443, + 2694, 2275, 2355, + 2604, 2362, 2201, + 2447, 2457, 1852, + 2084, 2559, 0, + 0, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3143, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3021, 1937, 2757, + 3021, 1938, 2756, + 3021, 1939, 2756, + 3021, 1940, 2756, + 3020, 1942, 2755, + 3020, 1945, 2754, + 3019, 1948, 2754, + 3018, 1953, 2752, + 3017, 1959, 2751, + 3015, 1966, 2748, + 3013, 1977, 2745, + 3010, 1990, 2741, + 3006, 2007, 2736, + 3001, 2029, 2728, + 2994, 2057, 2718, + 2984, 2092, 2705, + 2970, 2134, 2685, + 2951, 2186, 2658, + 2924, 2247, 2619, + 2886, 2317, 2561, + 2830, 2397, 2470, + 2741, 2485, 2310, + 2586, 2582, 1931, + 2231, 2685, 0, + 0, 2795, 0, + 0, 2910, 0, + 0, 3028, 0, + 0, 3150, 0, + 0, 3274, 0, + 0, 3400, 0, + 0, 3527, 0, + 0, 3656, 0, + 3155, 2045, 2882, + 3155, 2046, 2882, + 3155, 2047, 2882, + 3155, 2048, 2881, + 3155, 2049, 2881, + 3154, 2051, 2880, + 3154, 2054, 2880, + 3153, 2057, 2879, + 3152, 2062, 2877, + 3151, 2068, 2876, + 3149, 2077, 2874, + 3147, 2087, 2870, + 3144, 2101, 2866, + 3140, 2119, 2861, + 3135, 2142, 2853, + 3128, 2171, 2843, + 3118, 2207, 2829, + 3104, 2251, 2809, + 3085, 2304, 2782, + 3059, 2367, 2742, + 3021, 2439, 2683, + 2965, 2520, 2589, + 2877, 2610, 2423, + 2723, 2708, 2020, + 2374, 2813, 0, + 0, 2924, 0, + 0, 3039, 0, + 0, 3158, 0, + 0, 3280, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 3289, 2158, 3009, + 3289, 2159, 3009, + 3289, 2160, 3009, + 3289, 2160, 3009, + 3288, 2162, 3008, + 3288, 2163, 3008, + 3288, 2165, 3007, + 3287, 2168, 3007, + 3287, 2172, 3006, + 3286, 2177, 3004, + 3285, 2183, 3003, + 3283, 2192, 3000, + 3281, 2203, 2997, + 3278, 2217, 2993, + 3274, 2236, 2988, + 3269, 2259, 2980, + 3261, 2289, 2969, + 3251, 2326, 2955, + 3238, 2372, 2935, + 3219, 2426, 2907, + 3193, 2490, 2867, + 3155, 2563, 2807, + 3099, 2646, 2711, + 3011, 2737, 2541, + 2859, 2836, 2116, + 2514, 2942, 0, + 0, 3053, 0, + 0, 3169, 0, + 0, 3289, 0, + 0, 3411, 0, + 0, 3536, 0, + 0, 3662, 0, + 3422, 2276, 3137, + 3422, 2276, 3137, + 3422, 2277, 3137, + 3422, 2278, 3137, + 3422, 2278, 3137, + 3422, 2280, 3136, + 3421, 2281, 3136, + 3421, 2283, 3135, + 3420, 2286, 3135, + 3420, 2290, 3134, + 3419, 2295, 3133, + 3418, 2302, 3131, + 3416, 2310, 3128, + 3414, 2322, 3125, + 3411, 2337, 3121, + 3407, 2356, 3115, + 3402, 2380, 3108, + 3394, 2411, 3097, + 3385, 2449, 3083, + 3371, 2495, 3063, + 3352, 2551, 3035, + 3326, 2615, 2994, + 3289, 2690, 2933, + 3233, 2773, 2836, + 3145, 2866, 2662, + 2994, 2965, 2219, + 2652, 3072, 0, + 0, 3183, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3542, 0, + 0, 3667, 0, + 3555, 2397, 3267, + 3555, 2397, 3266, + 3555, 2398, 3266, + 3555, 2398, 3266, + 3555, 2399, 3266, + 3555, 2400, 3266, + 3555, 2401, 3266, + 3554, 2403, 3265, + 3554, 2405, 3265, + 3553, 2408, 3264, + 3553, 2412, 3263, + 3552, 2417, 3262, + 3551, 2423, 3260, + 3549, 2432, 3258, + 3547, 2444, 3254, + 3544, 2459, 3250, + 3540, 2479, 3245, + 3535, 2504, 3237, + 3527, 2535, 3226, + 3518, 2573, 3212, + 3504, 2621, 3191, + 3485, 2677, 3163, + 3459, 2742, 3122, + 3422, 2818, 3060, + 3366, 2902, 2962, + 3279, 2995, 2786, + 3128, 3095, 2329, + 2788, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 3688, 2520, 3396, + 3688, 2521, 3396, + 3688, 2521, 3396, + 3688, 2521, 3396, + 3688, 2522, 3396, + 3688, 2522, 3396, + 3687, 2523, 3396, + 3687, 2525, 3395, + 3687, 2526, 3395, + 3687, 2529, 3394, + 3686, 2532, 3394, + 3685, 2536, 3393, + 3684, 2541, 3391, + 3683, 2548, 3390, + 3682, 2557, 3387, + 3679, 2569, 3384, + 3677, 2584, 3380, + 3673, 2604, 3374, + 3667, 2629, 3366, + 3660, 2661, 3356, + 3650, 2700, 3341, + 3637, 2748, 3321, + 3618, 2804, 3292, + 3592, 2871, 3251, + 3555, 2946, 3189, + 3499, 3031, 3090, + 3412, 3125, 2912, + 3262, 3225, 2443, + 2923, 3332, 0, + 0, 3445, 0, + 0, 3562, 0, + 0, 3682, 0, + 3820, 2646, 3527, + 3820, 2646, 3527, + 3820, 2646, 3527, + 3820, 2647, 3527, + 3820, 2647, 3527, + 3820, 2648, 3527, + 3820, 2648, 3526, + 3820, 2649, 3526, + 3820, 2651, 3526, + 3819, 2652, 3525, + 3819, 2654, 3525, + 3819, 2658, 3524, + 3818, 2662, 3523, + 3817, 2667, 3522, + 3816, 2674, 3520, + 3814, 2683, 3518, + 3812, 2695, 3515, + 3809, 2711, 3510, + 3805, 2731, 3505, + 3800, 2756, 3497, + 3793, 2788, 3486, + 3783, 2828, 3471, + 3769, 2876, 3451, + 3751, 2933, 3422, + 3725, 3000, 3381, + 3687, 3076, 3318, + 3632, 3161, 3219, + 3545, 3255, 3039, + 3395, 3356, 2562, + 3058, 3463, 0, + 0, 3576, 0, + 0, 3693, 0, + 3953, 2773, 3658, + 3953, 2773, 3658, + 3953, 2773, 3658, + 3953, 2774, 3658, + 3953, 2774, 3658, + 3953, 2774, 3658, + 3953, 2775, 3657, + 3953, 2776, 3657, + 3952, 2777, 3657, + 3952, 2778, 3657, + 3952, 2780, 3656, + 3952, 2782, 3656, + 3951, 2785, 3655, + 3950, 2789, 3654, + 3949, 2794, 3653, + 3948, 2801, 3651, + 3947, 2811, 3649, + 3944, 2823, 3645, + 3942, 2839, 3641, + 3938, 2859, 3635, + 3932, 2885, 3628, + 3925, 2917, 3617, + 3915, 2957, 3602, + 3902, 3005, 3582, + 3883, 3063, 3553, + 3857, 3130, 3511, + 3820, 3206, 3449, + 3764, 3292, 3349, + 3678, 3386, 3167, + 3528, 3487, 2683, + 3192, 3595, 0, + 0, 3708, 0, + 4085, 2901, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2903, 3789, + 4085, 2903, 3789, + 4085, 2904, 3788, + 4085, 2905, 3788, + 4085, 2906, 3788, + 4084, 2908, 3787, + 4084, 2910, 3787, + 4083, 2913, 3786, + 4083, 2918, 3785, + 4082, 2923, 3784, + 4081, 2930, 3782, + 4079, 2939, 3780, + 4077, 2952, 3777, + 4074, 2968, 3772, + 4070, 2988, 3767, + 4065, 3014, 3759, + 4058, 3046, 3748, + 4048, 3086, 3733, + 4034, 3135, 3713, + 4016, 3193, 3684, + 3990, 3260, 3642, + 3952, 3337, 3579, + 3897, 3423, 3479, + 3810, 3517, 3297, + 3660, 3618, 2807, + 3325, 3726, 0, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3032, 3920, + 4095, 3032, 3920, + 4095, 3033, 3920, + 4095, 3033, 3920, + 4095, 3034, 3920, + 4095, 3036, 3919, + 4095, 3037, 3919, + 4095, 3040, 3918, + 4095, 3043, 3918, + 4095, 3047, 3917, + 4095, 3052, 3915, + 4095, 3060, 3914, + 4095, 3069, 3911, + 4095, 3081, 3908, + 4095, 3097, 3904, + 4095, 3118, 3898, + 4095, 3144, 3890, + 4095, 3176, 3879, + 4095, 3217, 3864, + 4095, 3265, 3844, + 4095, 3323, 3815, + 4095, 3391, 3773, + 4085, 3468, 3710, + 4029, 3554, 3610, + 3943, 3648, 3427, + 3793, 3750, 2933, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3162, 4052, + 4095, 3162, 4052, + 4095, 3163, 4052, + 4095, 3163, 4051, + 4095, 3164, 4051, + 4095, 3166, 4051, + 4095, 3168, 4050, + 4095, 3170, 4050, + 4095, 3173, 4049, + 4095, 3177, 4048, + 4095, 3183, 4047, + 4095, 3190, 4045, + 4095, 3199, 4043, + 4095, 3212, 4040, + 4095, 3228, 4035, + 4095, 3248, 4029, + 4095, 3274, 4022, + 4095, 3307, 4011, + 4095, 3347, 3996, + 4095, 3396, 3975, + 4095, 3454, 3946, + 4095, 3522, 3904, + 4095, 3599, 3841, + 4095, 3685, 3741, + 4075, 3780, 3557, + 0, 1347, 1608, + 0, 1350, 1606, + 0, 1354, 1602, + 0, 1359, 1597, + 0, 1365, 1590, + 0, 1374, 1581, + 0, 1386, 1569, + 0, 1401, 1552, + 0, 1421, 1528, + 0, 1446, 1494, + 0, 1477, 1444, + 0, 1516, 1367, + 0, 1563, 1239, + 0, 1619, 979, + 0, 1685, 0, + 0, 1760, 0, + 0, 1845, 0, + 0, 1938, 0, + 0, 2038, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1348, 1612, + 0, 1351, 1610, + 0, 1354, 1606, + 0, 1360, 1601, + 0, 1366, 1595, + 0, 1375, 1586, + 0, 1387, 1573, + 0, 1402, 1557, + 0, 1422, 1533, + 0, 1447, 1499, + 0, 1478, 1450, + 0, 1516, 1374, + 0, 1564, 1248, + 0, 1620, 995, + 0, 1685, 0, + 0, 1761, 0, + 0, 1845, 0, + 0, 1938, 0, + 0, 2038, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1349, 1618, + 0, 1352, 1615, + 0, 1356, 1611, + 0, 1361, 1607, + 0, 1368, 1600, + 0, 1377, 1591, + 0, 1388, 1579, + 0, 1403, 1563, + 0, 1423, 1539, + 0, 1448, 1506, + 0, 1479, 1457, + 0, 1517, 1383, + 0, 1564, 1260, + 0, 1620, 1015, + 0, 1686, 0, + 0, 1761, 0, + 0, 1845, 0, + 0, 1938, 0, + 0, 2038, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1351, 1625, + 0, 1354, 1622, + 0, 1358, 1619, + 0, 1363, 1614, + 0, 1369, 1607, + 0, 1378, 1599, + 0, 1390, 1587, + 0, 1405, 1570, + 0, 1424, 1548, + 0, 1449, 1515, + 0, 1480, 1467, + 0, 1519, 1395, + 0, 1565, 1275, + 0, 1621, 1041, + 0, 1687, 0, + 0, 1762, 0, + 0, 1846, 0, + 0, 1939, 0, + 0, 2039, 0, + 0, 2145, 0, + 0, 2258, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1353, 1634, + 0, 1356, 1631, + 0, 1360, 1628, + 0, 1365, 1623, + 0, 1372, 1617, + 0, 1381, 1608, + 0, 1392, 1597, + 0, 1407, 1581, + 0, 1426, 1558, + 0, 1451, 1527, + 0, 1482, 1480, + 0, 1520, 1410, + 0, 1567, 1295, + 0, 1623, 1074, + 0, 1688, 244, + 0, 1763, 0, + 0, 1847, 0, + 0, 1939, 0, + 0, 2039, 0, + 0, 2146, 0, + 0, 2258, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1356, 1646, + 0, 1359, 1643, + 0, 1363, 1640, + 0, 1368, 1636, + 0, 1375, 1629, + 0, 1383, 1621, + 0, 1395, 1610, + 0, 1410, 1594, + 0, 1429, 1573, + 0, 1453, 1542, + 0, 1484, 1497, + 0, 1522, 1430, + 0, 1569, 1320, + 0, 1624, 1114, + 0, 1690, 449, + 0, 1764, 0, + 0, 1848, 0, + 0, 1940, 0, + 0, 2040, 0, + 0, 2146, 0, + 0, 2258, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1360, 1662, + 0, 1363, 1659, + 0, 1367, 1656, + 0, 1372, 1652, + 0, 1379, 1646, + 0, 1387, 1638, + 0, 1399, 1627, + 0, 1414, 1612, + 0, 1433, 1591, + 0, 1457, 1561, + 0, 1487, 1519, + 0, 1525, 1455, + 0, 1572, 1351, + 0, 1627, 1162, + 0, 1692, 629, + 0, 1766, 0, + 0, 1849, 0, + 0, 1941, 0, + 0, 2041, 0, + 0, 2147, 0, + 0, 2259, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1366, 1682, + 0, 1369, 1679, + 0, 1373, 1676, + 0, 1377, 1672, + 0, 1384, 1666, + 0, 1393, 1659, + 0, 1404, 1648, + 0, 1418, 1634, + 0, 1437, 1614, + 0, 1461, 1586, + 0, 1492, 1546, + 0, 1529, 1486, + 0, 1575, 1390, + 0, 1630, 1220, + 0, 1694, 795, + 0, 1768, 0, + 0, 1851, 0, + 0, 1943, 0, + 0, 2042, 0, + 0, 2148, 0, + 0, 2260, 0, + 0, 2376, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3649, 0, + 0, 1373, 1707, + 0, 1376, 1705, + 0, 1380, 1702, + 0, 1385, 1698, + 0, 1391, 1693, + 0, 1399, 1686, + 0, 1411, 1676, + 0, 1425, 1662, + 0, 1444, 1644, + 0, 1467, 1618, + 0, 1497, 1580, + 0, 1534, 1525, + 0, 1580, 1438, + 0, 1634, 1287, + 0, 1698, 950, + 0, 1771, 0, + 0, 1854, 0, + 0, 1945, 0, + 0, 2044, 0, + 0, 2149, 0, + 0, 2261, 0, + 0, 2377, 0, + 0, 2496, 0, + 0, 2619, 0, + 0, 2743, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3649, 0, + 817, 1383, 1739, + 796, 1385, 1737, + 767, 1389, 1734, + 725, 1394, 1731, + 662, 1400, 1726, + 560, 1408, 1719, + 375, 1419, 1710, + 0, 1433, 1698, + 0, 1452, 1680, + 0, 1475, 1656, + 0, 1504, 1622, + 0, 1541, 1572, + 0, 1586, 1494, + 0, 1639, 1364, + 0, 1702, 1098, + 0, 1775, 0, + 0, 1857, 0, + 0, 1948, 0, + 0, 2046, 0, + 0, 2151, 0, + 0, 2262, 0, + 0, 2378, 0, + 0, 2497, 0, + 0, 2619, 0, + 0, 2744, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1204, 1395, 1779, + 1195, 1398, 1777, + 1183, 1401, 1775, + 1166, 1406, 1771, + 1143, 1412, 1767, + 1111, 1420, 1761, + 1063, 1431, 1752, + 990, 1445, 1741, + 870, 1462, 1725, + 635, 1485, 1704, + 0, 1514, 1673, + 0, 1550, 1628, + 0, 1594, 1560, + 0, 1646, 1450, + 0, 1709, 1243, + 0, 1780, 567, + 0, 1861, 0, + 0, 1951, 0, + 0, 2049, 0, + 0, 2154, 0, + 0, 2264, 0, + 0, 2379, 0, + 0, 2498, 0, + 0, 2620, 0, + 0, 2744, 0, + 0, 2871, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1462, 1411, 1827, + 1457, 1414, 1825, + 1450, 1417, 1823, + 1441, 1422, 1820, + 1429, 1428, 1816, + 1412, 1436, 1811, + 1388, 1446, 1803, + 1354, 1459, 1793, + 1304, 1476, 1779, + 1227, 1498, 1760, + 1098, 1526, 1733, + 836, 1561, 1694, + 0, 1604, 1636, + 0, 1656, 1544, + 0, 1717, 1383, + 0, 1787, 1003, + 0, 1867, 0, + 0, 1956, 0, + 0, 2053, 0, + 0, 2157, 0, + 0, 2266, 0, + 0, 2381, 0, + 0, 2499, 0, + 0, 2621, 0, + 0, 2745, 0, + 0, 2871, 0, + 0, 2999, 0, + 0, 3128, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1670, 1432, 1884, + 1667, 1435, 1883, + 1663, 1438, 1881, + 1657, 1442, 1878, + 1649, 1448, 1875, + 1639, 1455, 1870, + 1624, 1465, 1863, + 1604, 1478, 1854, + 1576, 1494, 1842, + 1536, 1516, 1826, + 1475, 1543, 1802, + 1378, 1576, 1769, + 1206, 1618, 1720, + 769, 1668, 1646, + 0, 1728, 1522, + 0, 1797, 1276, + 0, 1875, 0, + 0, 1962, 0, + 0, 2058, 0, + 0, 2161, 0, + 0, 2270, 0, + 0, 2383, 0, + 0, 2501, 0, + 0, 2623, 0, + 0, 2746, 0, + 0, 2872, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1851, 1458, 1951, + 1849, 1461, 1950, + 1847, 1464, 1948, + 1843, 1468, 1946, + 1838, 1473, 1943, + 1831, 1480, 1939, + 1821, 1490, 1933, + 1809, 1502, 1925, + 1791, 1517, 1915, + 1766, 1538, 1901, + 1730, 1563, 1881, + 1678, 1596, 1853, + 1597, 1636, 1813, + 1459, 1684, 1753, + 1167, 1741, 1659, + 0, 1809, 1491, + 0, 1885, 1074, + 0, 1971, 0, + 0, 2065, 0, + 0, 2166, 0, + 0, 2274, 0, + 0, 2387, 0, + 0, 2504, 0, + 0, 2625, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2017, 1491, 2027, + 2016, 1494, 2026, + 2014, 1496, 2025, + 2011, 1500, 2023, + 2008, 1505, 2020, + 2003, 1512, 2017, + 1997, 1520, 2012, + 1988, 1532, 2006, + 1976, 1547, 1997, + 1960, 1566, 1985, + 1937, 1590, 1969, + 1904, 1620, 1946, + 1856, 1658, 1914, + 1784, 1704, 1867, + 1664, 1759, 1794, + 1430, 1824, 1676, + 367, 1898, 1445, + 0, 1982, 454, + 0, 2074, 0, + 0, 2173, 0, + 0, 2279, 0, + 0, 2391, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2173, 1532, 2113, + 2172, 1534, 2112, + 2171, 1537, 2111, + 2169, 1540, 2109, + 2166, 1545, 2107, + 2163, 1551, 2104, + 2158, 1559, 2100, + 2152, 1569, 2095, + 2144, 1583, 2088, + 2133, 1600, 2078, + 2117, 1623, 2065, + 2096, 1651, 2047, + 2065, 1687, 2021, + 2021, 1730, 1984, + 1953, 1782, 1929, + 1844, 1844, 1844, + 1639, 1915, 1698, + 988, 1996, 1375, + 0, 2085, 0, + 0, 2183, 0, + 0, 2287, 0, + 0, 2397, 0, + 0, 2512, 0, + 0, 2631, 0, + 0, 2753, 0, + 0, 2877, 0, + 0, 3003, 0, + 0, 3131, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2322, 1581, 2206, + 2321, 1583, 2206, + 2320, 1585, 2205, + 2319, 1588, 2204, + 2317, 1593, 2202, + 2315, 1598, 2199, + 2312, 1605, 2196, + 2307, 1615, 2192, + 2301, 1627, 2186, + 2293, 1643, 2179, + 2283, 1663, 2168, + 2268, 1690, 2153, + 2247, 1722, 2133, + 2218, 1763, 2105, + 2175, 1811, 2063, + 2111, 1870, 2001, + 2009, 1937, 1903, + 1822, 2014, 1725, + 1302, 2100, 1261, + 0, 2195, 0, + 0, 2297, 0, + 0, 2405, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2466, 1640, 2308, + 2466, 1641, 2307, + 2465, 1643, 2306, + 2464, 1646, 2305, + 2463, 1650, 2304, + 2461, 1655, 2302, + 2459, 1661, 2299, + 2456, 1669, 2296, + 2451, 1680, 2292, + 2446, 1694, 2285, + 2438, 1713, 2277, + 2427, 1736, 2266, + 2413, 1766, 2250, + 2393, 1803, 2228, + 2364, 1848, 2197, + 2323, 1902, 2152, + 2262, 1965, 2083, + 2164, 2038, 1971, + 1988, 2120, 1760, + 1534, 2211, 1044, + 0, 2309, 0, + 0, 2415, 0, + 0, 2526, 0, + 0, 2641, 0, + 0, 2761, 0, + 0, 2883, 0, + 0, 3008, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2607, 1708, 2415, + 2607, 1709, 2415, + 2607, 1711, 2414, + 2606, 1713, 2413, + 2605, 1716, 2412, + 2604, 1721, 2411, + 2602, 1726, 2409, + 2600, 1733, 2406, + 2597, 1743, 2402, + 2592, 1755, 2398, + 2587, 1771, 2391, + 2579, 1792, 2382, + 2569, 1818, 2370, + 2555, 1851, 2353, + 2535, 1892, 2330, + 2507, 1941, 2297, + 2467, 1999, 2248, + 2407, 2067, 2173, + 2313, 2145, 2049, + 2144, 2231, 1802, + 1729, 2326, 267, + 0, 2428, 0, + 0, 2536, 0, + 0, 2649, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2746, 1785, 2528, + 2746, 1786, 2528, + 2745, 1788, 2527, + 2745, 1790, 2526, + 2744, 1793, 2526, + 2743, 1796, 2524, + 2742, 1801, 2523, + 2740, 1807, 2521, + 2738, 1815, 2518, + 2735, 1826, 2514, + 2731, 1839, 2509, + 2726, 1857, 2502, + 2718, 1880, 2493, + 2708, 1909, 2480, + 2694, 1945, 2463, + 2674, 1989, 2438, + 2647, 2042, 2403, + 2608, 2104, 2351, + 2549, 2176, 2271, + 2457, 2257, 2136, + 2294, 2347, 1853, + 1903, 2445, 0, + 0, 2549, 0, + 0, 2660, 0, + 0, 2775, 0, + 0, 2894, 0, + 0, 3016, 0, + 0, 3141, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3523, 0, + 0, 3653, 0, + 2883, 1872, 2645, + 2883, 1873, 2645, + 2883, 1874, 2644, + 2882, 1876, 2644, + 2882, 1878, 2643, + 2881, 1881, 2642, + 2880, 1885, 2641, + 2879, 1890, 2640, + 2877, 1897, 2637, + 2875, 1905, 2635, + 2872, 1917, 2631, + 2868, 1932, 2625, + 2862, 1952, 2618, + 2855, 1976, 2609, + 2845, 2008, 2596, + 2831, 2046, 2577, + 2812, 2093, 2552, + 2785, 2149, 2515, + 2746, 2215, 2461, + 2688, 2290, 2376, + 2598, 2374, 2231, + 2438, 2467, 1914, + 2064, 2567, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3271, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 3019, 1967, 2766, + 3019, 1967, 2765, + 3018, 1968, 2765, + 3018, 1970, 2765, + 3018, 1971, 2764, + 3017, 1974, 2763, + 3017, 1977, 2763, + 3016, 1981, 2761, + 3014, 1987, 2760, + 3013, 1994, 2758, + 3011, 2004, 2755, + 3008, 2016, 2751, + 3004, 2032, 2745, + 2998, 2053, 2738, + 2991, 2080, 2728, + 2981, 2113, 2715, + 2967, 2154, 2696, + 2948, 2203, 2669, + 2921, 2262, 2631, + 2883, 2330, 2575, + 2826, 2408, 2487, + 2736, 2494, 2334, + 2580, 2589, 1984, + 2216, 2691, 0, + 0, 2800, 0, + 0, 2913, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3275, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3154, 2069, 2889, + 3153, 2069, 2889, + 3153, 2070, 2888, + 3153, 2071, 2888, + 3153, 2072, 2888, + 3152, 2074, 2887, + 3152, 2077, 2887, + 3151, 2080, 2886, + 3150, 2085, 2884, + 3149, 2091, 2883, + 3147, 2098, 2881, + 3145, 2109, 2878, + 3142, 2122, 2873, + 3138, 2139, 2868, + 3133, 2161, 2861, + 3126, 2189, 2850, + 3116, 2224, 2837, + 3102, 2266, 2817, + 3083, 2318, 2790, + 3057, 2379, 2751, + 3018, 2449, 2693, + 2962, 2529, 2602, + 2873, 2617, 2442, + 2718, 2714, 2063, + 2363, 2818, 0, + 0, 2927, 0, + 0, 3042, 0, + 0, 3160, 0, + 0, 3282, 0, + 0, 3406, 0, + 0, 3532, 0, + 0, 3659, 0, + 3288, 2177, 3014, + 3288, 2177, 3014, + 3287, 2178, 3014, + 3287, 2179, 3014, + 3287, 2180, 3013, + 3287, 2181, 3013, + 3286, 2183, 3012, + 3286, 2186, 3012, + 3285, 2190, 3011, + 3284, 2194, 3010, + 3283, 2200, 3008, + 3281, 2209, 3006, + 3279, 2219, 3003, + 3276, 2233, 2998, + 3272, 2251, 2993, + 3267, 2274, 2985, + 3260, 2303, 2975, + 3250, 2339, 2961, + 3236, 2383, 2941, + 3217, 2437, 2914, + 3191, 2499, 2874, + 3153, 2571, 2815, + 3097, 2652, 2721, + 3009, 2743, 2556, + 2855, 2840, 2152, + 2506, 2945, 0, + 0, 3056, 0, + 0, 3171, 0, + 0, 3290, 0, + 0, 3412, 0, + 0, 3537, 0, + 0, 3663, 0, + 3421, 2290, 3141, + 3421, 2291, 3141, + 3421, 2291, 3141, + 3421, 2292, 3141, + 3421, 2293, 3141, + 3421, 2294, 3140, + 3420, 2295, 3140, + 3420, 2297, 3139, + 3419, 2300, 3139, + 3419, 2304, 3138, + 3418, 2309, 3136, + 3417, 2315, 3135, + 3415, 2324, 3132, + 3413, 2335, 3129, + 3410, 2349, 3125, + 3406, 2368, 3120, + 3401, 2392, 3112, + 3393, 2421, 3102, + 3384, 2459, 3087, + 3370, 2504, 3067, + 3351, 2558, 3039, + 3325, 2622, 2999, + 3287, 2696, 2939, + 3231, 2778, 2844, + 3143, 2869, 2673, + 2991, 2968, 2248, + 2646, 3074, 0, + 0, 3185, 0, + 0, 3301, 0, + 0, 3421, 0, + 0, 3543, 0, + 0, 3668, 0, + 3554, 2408, 3269, + 3554, 2408, 3269, + 3554, 2408, 3269, + 3554, 2409, 3269, + 3554, 2410, 3269, + 3554, 2411, 3269, + 3554, 2412, 3268, + 3553, 2413, 3268, + 3553, 2416, 3268, + 3553, 2418, 3267, + 3552, 2422, 3266, + 3551, 2427, 3265, + 3550, 2434, 3263, + 3548, 2443, 3261, + 3546, 2454, 3257, + 3543, 2469, 3253, + 3539, 2488, 3248, + 3534, 2512, 3240, + 3527, 2543, 3229, + 3517, 2581, 3215, + 3503, 2627, 3195, + 3485, 2683, 3167, + 3458, 2747, 3126, + 3421, 2822, 3065, + 3365, 2905, 2968, + 3277, 2998, 2794, + 3126, 3097, 2352, + 2784, 3204, 0, + 0, 3315, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3674, 0, + 3687, 2529, 3399, + 3687, 2529, 3399, + 3687, 2529, 3399, + 3687, 2530, 3398, + 3687, 2530, 3398, + 3687, 2531, 3398, + 3687, 2532, 3398, + 3687, 2533, 3398, + 3686, 2535, 3397, + 3686, 2537, 3397, + 3685, 2540, 3396, + 3685, 2544, 3395, + 3684, 2549, 3394, + 3683, 2556, 3392, + 3681, 2565, 3390, + 3679, 2576, 3387, + 3676, 2591, 3382, + 3672, 2611, 3377, + 3667, 2636, 3369, + 3660, 2667, 3358, + 3650, 2706, 3344, + 3636, 2753, 3324, + 3618, 2809, 3295, + 3591, 2874, 3254, + 3554, 2950, 3192, + 3498, 3034, 3094, + 3411, 3127, 2918, + 3260, 3227, 2461, + 2920, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 3820, 2652, 3529, + 3820, 2652, 3529, + 3820, 2653, 3528, + 3820, 2653, 3528, + 3820, 2653, 3528, + 3820, 2654, 3528, + 3820, 2655, 3528, + 3820, 2656, 3528, + 3819, 2657, 3528, + 3819, 2658, 3527, + 3819, 2661, 3527, + 3818, 2664, 3526, + 3817, 2668, 3525, + 3817, 2673, 3524, + 3815, 2680, 3522, + 3814, 2689, 3519, + 3812, 2701, 3516, + 3809, 2716, 3512, + 3805, 2736, 3506, + 3799, 2761, 3499, + 3792, 2793, 3488, + 3782, 2832, 3473, + 3769, 2880, 3453, + 3750, 2936, 3424, + 3724, 3003, 3383, + 3687, 3078, 3321, + 3631, 3163, 3222, + 3544, 3257, 3044, + 3394, 3357, 2575, + 3056, 3465, 0, + 0, 3577, 0, + 0, 3694, 0, + 3953, 2778, 3659, + 3953, 2778, 3659, + 3953, 2778, 3659, + 3953, 2778, 3659, + 3952, 2779, 3659, + 3952, 2779, 3659, + 3952, 2780, 3659, + 3952, 2780, 3658, + 3952, 2781, 3658, + 3952, 2783, 3658, + 3952, 2784, 3658, + 3951, 2787, 3657, + 3951, 2790, 3656, + 3950, 2794, 3655, + 3949, 2799, 3654, + 3948, 2806, 3652, + 3946, 2815, 3650, + 3944, 2827, 3647, + 3941, 2843, 3642, + 3937, 2863, 3637, + 3932, 2888, 3629, + 3925, 2920, 3618, + 3915, 2960, 3604, + 3902, 3008, 3583, + 3883, 3065, 3554, + 3857, 3132, 3513, + 3819, 3208, 3450, + 3764, 3293, 3351, + 3677, 3387, 3171, + 3527, 3488, 2694, + 3190, 3596, 0, + 0, 3708, 0, + 4085, 2905, 3790, + 4085, 2905, 3790, + 4085, 2905, 3790, + 4085, 2905, 3790, + 4085, 2906, 3790, + 4085, 2906, 3790, + 4085, 2906, 3790, + 4085, 2907, 3789, + 4085, 2908, 3789, + 4084, 2909, 3789, + 4084, 2910, 3789, + 4084, 2912, 3788, + 4084, 2914, 3788, + 4083, 2917, 3787, + 4082, 2921, 3786, + 4082, 2926, 3785, + 4080, 2933, 3783, + 4079, 2943, 3781, + 4077, 2955, 3778, + 4074, 2971, 3773, + 4070, 2991, 3768, + 4064, 3017, 3760, + 4057, 3049, 3749, + 4047, 3089, 3734, + 4034, 3137, 3714, + 4015, 3195, 3685, + 3989, 3262, 3643, + 3952, 3338, 3581, + 3896, 3424, 3481, + 3810, 3518, 3299, + 3660, 3619, 2815, + 3324, 3727, 0, + 4095, 3033, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3035, 3921, + 4095, 3035, 3921, + 4095, 3036, 3920, + 4095, 3037, 3920, + 4095, 3038, 3920, + 4095, 3040, 3920, + 4095, 3042, 3919, + 4095, 3046, 3918, + 4095, 3050, 3917, + 4095, 3055, 3916, + 4095, 3062, 3914, + 4095, 3072, 3912, + 4095, 3084, 3909, + 4095, 3100, 3904, + 4095, 3120, 3899, + 4095, 3146, 3891, + 4095, 3178, 3880, + 4095, 3218, 3865, + 4095, 3267, 3845, + 4095, 3325, 3816, + 4095, 3392, 3774, + 4084, 3469, 3711, + 4029, 3555, 3611, + 3942, 3649, 3429, + 3793, 3751, 2939, + 4095, 3163, 4053, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3164, 4052, + 4095, 3164, 4052, + 4095, 3164, 4052, + 4095, 3165, 4052, + 4095, 3166, 4052, + 4095, 3167, 4052, + 4095, 3168, 4051, + 4095, 3170, 4051, + 4095, 3172, 4050, + 4095, 3175, 4050, + 4095, 3179, 4049, + 4095, 3185, 4047, + 4095, 3192, 4046, + 4095, 3201, 4043, + 4095, 3213, 4040, + 4095, 3229, 4036, + 4095, 3250, 4030, + 4095, 3276, 4022, + 4095, 3308, 4011, + 4095, 3349, 3997, + 4095, 3397, 3976, + 4095, 3455, 3947, + 4095, 3523, 3905, + 4095, 3600, 3842, + 4095, 3686, 3742, + 4075, 3780, 3559, + 0, 1476, 1739, + 0, 1478, 1737, + 0, 1481, 1735, + 0, 1485, 1731, + 0, 1490, 1726, + 0, 1497, 1719, + 0, 1506, 1710, + 0, 1518, 1698, + 0, 1533, 1681, + 0, 1552, 1657, + 0, 1577, 1622, + 0, 1609, 1572, + 0, 1647, 1494, + 0, 1695, 1365, + 0, 1751, 1099, + 0, 1817, 0, + 0, 1892, 0, + 0, 1976, 0, + 0, 2069, 0, + 0, 2170, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 0, 1477, 1742, + 0, 1479, 1740, + 0, 1482, 1738, + 0, 1486, 1734, + 0, 1491, 1729, + 0, 1498, 1723, + 0, 1507, 1713, + 0, 1518, 1701, + 0, 1533, 1684, + 0, 1553, 1660, + 0, 1578, 1626, + 0, 1609, 1576, + 0, 1648, 1500, + 0, 1695, 1371, + 0, 1751, 1111, + 0, 1817, 0, + 0, 1892, 0, + 0, 1977, 0, + 0, 2070, 0, + 0, 2170, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1478, 1746, + 0, 1480, 1744, + 0, 1483, 1742, + 0, 1487, 1738, + 0, 1492, 1733, + 0, 1499, 1727, + 0, 1507, 1718, + 0, 1519, 1706, + 0, 1534, 1689, + 0, 1554, 1665, + 0, 1579, 1631, + 0, 1610, 1582, + 0, 1649, 1506, + 0, 1696, 1380, + 0, 1752, 1127, + 0, 1818, 0, + 0, 1893, 0, + 0, 1977, 0, + 0, 2070, 0, + 0, 2170, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1479, 1752, + 0, 1481, 1750, + 0, 1484, 1747, + 0, 1488, 1744, + 0, 1493, 1739, + 0, 1500, 1732, + 0, 1509, 1723, + 0, 1520, 1711, + 0, 1535, 1695, + 0, 1555, 1671, + 0, 1580, 1638, + 0, 1611, 1590, + 0, 1650, 1515, + 0, 1696, 1392, + 0, 1753, 1147, + 0, 1818, 0, + 0, 1893, 0, + 0, 1978, 0, + 0, 2070, 0, + 0, 2171, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1481, 1759, + 0, 1483, 1757, + 0, 1486, 1754, + 0, 1490, 1751, + 0, 1495, 1746, + 0, 1502, 1740, + 0, 1510, 1731, + 0, 1522, 1719, + 0, 1537, 1703, + 0, 1556, 1680, + 0, 1581, 1647, + 0, 1612, 1600, + 0, 1651, 1527, + 0, 1698, 1407, + 0, 1754, 1173, + 0, 1819, 122, + 0, 1894, 0, + 0, 1978, 0, + 0, 2071, 0, + 0, 2171, 0, + 0, 2278, 0, + 0, 2390, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1483, 1768, + 0, 1485, 1766, + 0, 1488, 1763, + 0, 1492, 1760, + 0, 1497, 1755, + 0, 1504, 1749, + 0, 1513, 1741, + 0, 1524, 1729, + 0, 1539, 1713, + 0, 1558, 1691, + 0, 1583, 1659, + 0, 1614, 1612, + 0, 1652, 1542, + 0, 1699, 1427, + 0, 1755, 1206, + 0, 1820, 376, + 0, 1895, 0, + 0, 1979, 0, + 0, 2071, 0, + 0, 2171, 0, + 0, 2278, 0, + 0, 2390, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1486, 1780, + 0, 1488, 1778, + 0, 1491, 1776, + 0, 1495, 1772, + 0, 1500, 1768, + 0, 1507, 1762, + 0, 1516, 1753, + 0, 1527, 1742, + 0, 1542, 1726, + 0, 1561, 1705, + 0, 1586, 1674, + 0, 1616, 1629, + 0, 1655, 1562, + 0, 1701, 1452, + 0, 1757, 1246, + 0, 1822, 581, + 0, 1896, 0, + 0, 1980, 0, + 0, 2072, 0, + 0, 2172, 0, + 0, 2279, 0, + 0, 2390, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1490, 1795, + 0, 1493, 1794, + 0, 1495, 1791, + 0, 1499, 1788, + 0, 1504, 1784, + 0, 1511, 1778, + 0, 1519, 1770, + 0, 1531, 1759, + 0, 1546, 1744, + 0, 1565, 1723, + 0, 1589, 1694, + 0, 1620, 1651, + 0, 1657, 1587, + 0, 1704, 1484, + 0, 1759, 1294, + 0, 1824, 762, + 0, 1898, 0, + 0, 1981, 0, + 0, 2073, 0, + 0, 2173, 0, + 0, 2279, 0, + 0, 2391, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1496, 1815, + 0, 1498, 1814, + 0, 1501, 1811, + 0, 1505, 1808, + 0, 1510, 1804, + 0, 1516, 1799, + 0, 1525, 1791, + 0, 1536, 1781, + 0, 1551, 1766, + 0, 1569, 1746, + 0, 1593, 1718, + 0, 1624, 1678, + 0, 1661, 1618, + 0, 1707, 1522, + 0, 1762, 1352, + 0, 1826, 927, + 0, 1900, 0, + 0, 1983, 0, + 0, 2075, 0, + 0, 2174, 0, + 0, 2280, 0, + 0, 2392, 0, + 0, 2508, 0, + 0, 2628, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1503, 1841, + 0, 1505, 1839, + 0, 1508, 1837, + 0, 1512, 1834, + 0, 1517, 1830, + 0, 1523, 1825, + 0, 1532, 1818, + 0, 1543, 1808, + 0, 1557, 1795, + 0, 1576, 1776, + 0, 1599, 1750, + 0, 1629, 1712, + 0, 1666, 1657, + 0, 1712, 1570, + 0, 1766, 1419, + 0, 1830, 1082, + 0, 1903, 0, + 0, 1986, 0, + 0, 2077, 0, + 0, 2176, 0, + 0, 2282, 0, + 0, 2393, 0, + 0, 2509, 0, + 0, 2628, 0, + 0, 2751, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3650, 0, + 964, 1513, 1873, + 949, 1515, 1871, + 928, 1518, 1869, + 899, 1521, 1867, + 857, 1526, 1863, + 794, 1532, 1858, + 692, 1541, 1851, + 507, 1551, 1842, + 0, 1566, 1830, + 0, 1584, 1813, + 0, 1607, 1788, + 0, 1637, 1754, + 0, 1673, 1704, + 0, 1718, 1626, + 0, 1771, 1496, + 0, 1835, 1231, + 0, 1907, 0, + 0, 1989, 0, + 0, 2080, 0, + 0, 2178, 0, + 0, 2283, 0, + 0, 2394, 0, + 0, 2510, 0, + 0, 2629, 0, + 0, 2751, 0, + 0, 2876, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 1342, 1525, 1912, + 1336, 1527, 1911, + 1327, 1530, 1909, + 1315, 1533, 1907, + 1299, 1538, 1903, + 1276, 1544, 1899, + 1243, 1552, 1893, + 1195, 1563, 1884, + 1123, 1577, 1873, + 1003, 1595, 1857, + 767, 1617, 1836, + 0, 1646, 1805, + 0, 1682, 1760, + 0, 1726, 1692, + 0, 1779, 1582, + 0, 1841, 1375, + 0, 1912, 699, + 0, 1994, 0, + 0, 2083, 0, + 0, 2181, 0, + 0, 2286, 0, + 0, 2396, 0, + 0, 2511, 0, + 0, 2630, 0, + 0, 2752, 0, + 0, 2877, 0, + 0, 3003, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 1598, 1542, 1960, + 1594, 1543, 1959, + 1589, 1546, 1957, + 1582, 1549, 1955, + 1573, 1554, 1952, + 1561, 1560, 1948, + 1544, 1568, 1943, + 1520, 1578, 1935, + 1486, 1591, 1925, + 1436, 1608, 1911, + 1359, 1631, 1892, + 1230, 1659, 1865, + 968, 1693, 1826, + 0, 1736, 1768, + 0, 1788, 1676, + 0, 1849, 1516, + 0, 1919, 1135, + 0, 1999, 0, + 0, 2088, 0, + 0, 2185, 0, + 0, 2289, 0, + 0, 2398, 0, + 0, 2513, 0, + 0, 2632, 0, + 0, 2753, 0, + 0, 2877, 0, + 0, 3003, 0, + 0, 3131, 0, + 0, 3260, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 1804, 1562, 2017, + 1802, 1564, 2016, + 1799, 1567, 2015, + 1795, 1570, 2013, + 1789, 1574, 2010, + 1781, 1580, 2007, + 1771, 1587, 2002, + 1756, 1597, 1995, + 1737, 1610, 1987, + 1708, 1626, 1974, + 1668, 1648, 1958, + 1607, 1675, 1934, + 1511, 1708, 1901, + 1338, 1750, 1852, + 901, 1800, 1778, + 0, 1860, 1654, + 0, 1929, 1408, + 0, 2007, 0, + 0, 2095, 0, + 0, 2190, 0, + 0, 2293, 0, + 0, 2402, 0, + 0, 2515, 0, + 0, 2633, 0, + 0, 2755, 0, + 0, 2878, 0, + 0, 3004, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3389, 0, + 0, 3520, 0, + 0, 3650, 0, + 1985, 1589, 2084, + 1983, 1591, 2083, + 1981, 1593, 2082, + 1979, 1596, 2080, + 1975, 1600, 2078, + 1970, 1605, 2075, + 1963, 1612, 2071, + 1953, 1622, 2065, + 1941, 1634, 2058, + 1923, 1650, 2047, + 1898, 1670, 2033, + 1862, 1695, 2013, + 1810, 1728, 1985, + 1729, 1768, 1945, + 1591, 1816, 1886, + 1299, 1874, 1791, + 0, 1941, 1623, + 0, 2017, 1207, + 0, 2103, 0, + 0, 2197, 0, + 0, 2298, 0, + 0, 2406, 0, + 0, 2519, 0, + 0, 2636, 0, + 0, 2757, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2150, 1622, 2160, + 2149, 1623, 2159, + 2148, 1626, 2158, + 2146, 1628, 2157, + 2143, 1632, 2155, + 2140, 1637, 2152, + 2135, 1644, 2149, + 2129, 1653, 2144, + 2120, 1664, 2138, + 2108, 1679, 2129, + 2092, 1698, 2117, + 2069, 1722, 2101, + 2036, 1752, 2078, + 1989, 1790, 2046, + 1916, 1836, 1999, + 1796, 1892, 1927, + 1562, 1956, 1808, + 499, 2030, 1577, + 0, 2114, 586, + 0, 2206, 0, + 0, 2305, 0, + 0, 2412, 0, + 0, 2523, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 2306, 1663, 2246, + 2305, 1664, 2245, + 2304, 1666, 2244, + 2303, 1669, 2243, + 2301, 1672, 2241, + 2298, 1677, 2239, + 2295, 1683, 2236, + 2291, 1691, 2232, + 2284, 1701, 2227, + 2276, 1715, 2220, + 2265, 1732, 2210, + 2249, 1755, 2197, + 2228, 1783, 2179, + 2197, 1819, 2153, + 2153, 1862, 2116, + 2085, 1915, 2061, + 1976, 1976, 1976, + 1771, 2047, 1830, + 1120, 2128, 1507, + 0, 2217, 0, + 0, 2315, 0, + 0, 2419, 0, + 0, 2529, 0, + 0, 2644, 0, + 0, 2763, 0, + 0, 2885, 0, + 0, 3009, 0, + 0, 3135, 0, + 0, 3263, 0, + 0, 3392, 0, + 0, 3521, 0, + 0, 3651, 0, + 2455, 1712, 2339, + 2454, 1713, 2339, + 2453, 1715, 2338, + 2452, 1717, 2337, + 2451, 1721, 2336, + 2449, 1725, 2334, + 2447, 1730, 2332, + 2444, 1737, 2328, + 2439, 1747, 2324, + 2434, 1759, 2318, + 2426, 1775, 2311, + 2415, 1796, 2300, + 2400, 1822, 2285, + 2379, 1854, 2265, + 2350, 1895, 2237, + 2307, 1944, 2195, + 2243, 2002, 2134, + 2141, 2069, 2035, + 1954, 2146, 1857, + 1434, 2233, 1394, + 0, 2327, 0, + 0, 2429, 0, + 0, 2537, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2599, 1771, 2440, + 2598, 1772, 2440, + 2598, 1773, 2439, + 2597, 1775, 2438, + 2596, 1778, 2437, + 2595, 1782, 2436, + 2593, 1787, 2434, + 2591, 1793, 2432, + 2588, 1801, 2428, + 2584, 1812, 2424, + 2578, 1827, 2418, + 2570, 1845, 2409, + 2560, 1868, 2398, + 2545, 1898, 2382, + 2525, 1935, 2360, + 2496, 1980, 2329, + 2455, 2034, 2284, + 2394, 2097, 2215, + 2296, 2170, 2104, + 2120, 2252, 1892, + 1666, 2343, 1176, + 0, 2441, 0, + 0, 2547, 0, + 0, 2658, 0, + 0, 2773, 0, + 0, 2893, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 2740, 1839, 2548, + 2740, 1840, 2547, + 2739, 1841, 2547, + 2739, 1843, 2546, + 2738, 1845, 2545, + 2737, 1848, 2544, + 2736, 1853, 2543, + 2734, 1858, 2541, + 2732, 1865, 2538, + 2729, 1875, 2535, + 2725, 1887, 2530, + 2719, 1903, 2523, + 2711, 1924, 2514, + 2701, 1950, 2502, + 2687, 1983, 2486, + 2667, 2024, 2462, + 2639, 2073, 2429, + 2599, 2132, 2380, + 2539, 2199, 2305, + 2445, 2277, 2181, + 2277, 2363, 1934, + 1861, 2458, 400, + 0, 2560, 0, + 0, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 2878, 1917, 2660, + 2878, 1917, 2660, + 2878, 1919, 2660, + 2878, 1920, 2659, + 2877, 1922, 2659, + 2876, 1925, 2658, + 2875, 1928, 2657, + 2874, 1933, 2655, + 2872, 1939, 2653, + 2870, 1947, 2650, + 2867, 1958, 2646, + 2863, 1972, 2641, + 2858, 1989, 2635, + 2850, 2012, 2625, + 2840, 2041, 2613, + 2826, 2077, 2595, + 2807, 2121, 2570, + 2779, 2174, 2535, + 2740, 2236, 2483, + 2681, 2308, 2403, + 2589, 2389, 2268, + 2426, 2479, 1986, + 2035, 2577, 0, + 0, 2682, 0, + 0, 2792, 0, + 0, 2907, 0, + 0, 3026, 0, + 0, 3148, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3656, 0, + 3015, 2003, 2777, + 3015, 2004, 2777, + 3015, 2005, 2777, + 3015, 2006, 2776, + 3014, 2008, 2776, + 3014, 2010, 2775, + 3013, 2013, 2774, + 3012, 2017, 2773, + 3011, 2022, 2772, + 3009, 2029, 2770, + 3007, 2038, 2767, + 3004, 2049, 2763, + 3000, 2064, 2758, + 2995, 2084, 2751, + 2987, 2108, 2741, + 2977, 2140, 2728, + 2963, 2178, 2709, + 2944, 2225, 2684, + 2917, 2281, 2647, + 2878, 2347, 2593, + 2821, 2422, 2508, + 2730, 2506, 2363, + 2570, 2599, 2046, + 2196, 2699, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 3151, 2098, 2898, + 3151, 2099, 2898, + 3151, 2099, 2897, + 3150, 2100, 2897, + 3150, 2102, 2897, + 3150, 2104, 2896, + 3149, 2106, 2896, + 3149, 2109, 2895, + 3148, 2113, 2893, + 3147, 2119, 2892, + 3145, 2126, 2890, + 3143, 2136, 2887, + 3140, 2148, 2883, + 3136, 2164, 2877, + 3130, 2185, 2870, + 3123, 2212, 2860, + 3113, 2245, 2847, + 3099, 2286, 2828, + 3080, 2335, 2801, + 3053, 2394, 2763, + 3015, 2462, 2707, + 2958, 2540, 2619, + 2868, 2626, 2466, + 2712, 2721, 2116, + 2349, 2823, 0, + 0, 2932, 0, + 0, 3045, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3407, 0, + 0, 3533, 0, + 0, 3660, 0, + 3286, 2200, 3021, + 3286, 2201, 3021, + 3286, 2201, 3021, + 3285, 2202, 3021, + 3285, 2203, 3020, + 3285, 2205, 3020, + 3284, 2206, 3019, + 3284, 2209, 3019, + 3283, 2212, 3018, + 3282, 2217, 3016, + 3281, 2223, 3015, + 3280, 2231, 3013, + 3277, 2241, 3010, + 3274, 2254, 3006, + 3270, 2271, 3000, + 3265, 2293, 2993, + 3258, 2321, 2983, + 3248, 2356, 2969, + 3234, 2398, 2949, + 3215, 2450, 2922, + 3189, 2511, 2883, + 3151, 2581, 2825, + 3094, 2661, 2734, + 3005, 2749, 2574, + 2850, 2846, 2196, + 2495, 2950, 0, + 0, 3059, 0, + 0, 3174, 0, + 0, 3292, 0, + 0, 3414, 0, + 0, 3538, 0, + 0, 3664, 0, + 3420, 2309, 3146, + 3420, 2309, 3146, + 3420, 2309, 3146, + 3420, 2310, 3146, + 3419, 2311, 3146, + 3419, 2312, 3145, + 3419, 2313, 3145, + 3418, 2315, 3145, + 3418, 2318, 3144, + 3417, 2322, 3143, + 3416, 2326, 3142, + 3415, 2333, 3140, + 3414, 2341, 3138, + 3411, 2351, 3135, + 3408, 2365, 3131, + 3404, 2383, 3125, + 3399, 2406, 3117, + 3392, 2435, 3107, + 3382, 2471, 3093, + 3368, 2516, 3074, + 3350, 2569, 3046, + 3323, 2631, 3006, + 3285, 2703, 2947, + 3229, 2785, 2853, + 3141, 2875, 2688, + 2988, 2973, 2284, + 2638, 3077, 0, + 0, 3188, 0, + 0, 3303, 0, + 0, 3422, 0, + 0, 3544, 0, + 0, 3669, 0, + 3553, 2422, 3273, + 3553, 2422, 3273, + 3553, 2423, 3273, + 3553, 2423, 3273, + 3553, 2424, 3273, + 3553, 2425, 3273, + 3553, 2426, 3272, + 3552, 2427, 3272, + 3552, 2430, 3271, + 3552, 2432, 3271, + 3551, 2436, 3270, + 3550, 2441, 3269, + 3549, 2447, 3267, + 3547, 2456, 3265, + 3545, 2467, 3261, + 3542, 2481, 3257, + 3538, 2500, 3252, + 3533, 2524, 3244, + 3525, 2554, 3234, + 3516, 2591, 3219, + 3502, 2636, 3200, + 3483, 2690, 3172, + 3457, 2754, 3131, + 3419, 2828, 3071, + 3363, 2910, 2976, + 3275, 3002, 2805, + 3123, 3100, 2380, + 2778, 3206, 0, + 0, 3317, 0, + 0, 3433, 0, + 0, 3553, 0, + 0, 3675, 0, + 3687, 2540, 3402, + 3687, 2540, 3402, + 3686, 2540, 3401, + 3686, 2541, 3401, + 3686, 2541, 3401, + 3686, 2542, 3401, + 3686, 2543, 3401, + 3686, 2544, 3401, + 3686, 2545, 3400, + 3685, 2548, 3400, + 3685, 2550, 3399, + 3684, 2554, 3398, + 3683, 2559, 3397, + 3682, 2566, 3395, + 3680, 2575, 3393, + 3678, 2586, 3390, + 3675, 2601, 3385, + 3671, 2620, 3380, + 3666, 2644, 3372, + 3659, 2675, 3362, + 3649, 2713, 3347, + 3635, 2759, 3327, + 3617, 2815, 3299, + 3590, 2880, 3258, + 3553, 2954, 3197, + 3497, 3038, 3100, + 3410, 3130, 2926, + 3258, 3229, 2484, + 2916, 3336, 0, + 0, 3448, 0, + 0, 3564, 0, + 0, 3684, 0, + 3819, 2661, 3531, + 3819, 2661, 3531, + 3819, 2661, 3531, + 3819, 2661, 3531, + 3819, 2662, 3531, + 3819, 2662, 3530, + 3819, 2663, 3530, + 3819, 2664, 3530, + 3819, 2665, 3530, + 3818, 2667, 3529, + 3818, 2669, 3529, + 3818, 2672, 3528, + 3817, 2676, 3527, + 3816, 2681, 3526, + 3815, 2688, 3524, + 3813, 2697, 3522, + 3811, 2708, 3519, + 3808, 2723, 3514, + 3804, 2743, 3509, + 3799, 2768, 3501, + 3792, 2799, 3490, + 3782, 2838, 3476, + 3768, 2885, 3456, + 3750, 2941, 3427, + 3723, 3007, 3386, + 3686, 3082, 3325, + 3630, 3166, 3227, + 3543, 3259, 3050, + 3392, 3359, 2593, + 3052, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 3952, 2784, 3661, + 3952, 2784, 3661, + 3952, 2785, 3661, + 3952, 2785, 3661, + 3952, 2785, 3661, + 3952, 2785, 3660, + 3952, 2786, 3660, + 3952, 2787, 3660, + 3952, 2788, 3660, + 3951, 2789, 3660, + 3951, 2791, 3659, + 3951, 2793, 3659, + 3950, 2796, 3658, + 3950, 2800, 3657, + 3949, 2805, 3656, + 3947, 2812, 3654, + 3946, 2821, 3652, + 3944, 2833, 3648, + 3941, 2848, 3644, + 3937, 2868, 3638, + 3932, 2893, 3631, + 3924, 2925, 3620, + 3915, 2964, 3605, + 3901, 3012, 3585, + 3882, 3068, 3556, + 3856, 3135, 3515, + 3819, 3211, 3453, + 3763, 3295, 3354, + 3676, 3389, 3176, + 3526, 3489, 2707, + 3188, 3597, 0, + 0, 3709, 0, + 4085, 2910, 3791, + 4085, 2910, 3791, + 4085, 2910, 3791, + 4085, 2910, 3791, + 4085, 2911, 3791, + 4085, 2911, 3791, + 4085, 2911, 3791, + 4084, 2912, 3791, + 4084, 2912, 3791, + 4084, 2913, 3790, + 4084, 2915, 3790, + 4084, 2916, 3790, + 4083, 2919, 3789, + 4083, 2922, 3788, + 4082, 2926, 3787, + 4081, 2931, 3786, + 4080, 2938, 3784, + 4078, 2947, 3782, + 4076, 2959, 3779, + 4073, 2975, 3775, + 4069, 2995, 3769, + 4064, 3020, 3761, + 4057, 3052, 3750, + 4047, 3092, 3736, + 4034, 3140, 3715, + 4015, 3197, 3686, + 3989, 3264, 3645, + 3951, 3340, 3583, + 3896, 3425, 3483, + 3809, 3519, 3303, + 3659, 3620, 2826, + 3322, 3728, 0, + 4095, 3037, 3922, + 4095, 3037, 3922, + 4095, 3037, 3922, + 4095, 3037, 3922, + 4095, 3038, 3922, + 4095, 3038, 3922, + 4095, 3038, 3922, + 4095, 3039, 3922, + 4095, 3039, 3922, + 4095, 3040, 3921, + 4095, 3041, 3921, + 4095, 3042, 3921, + 4095, 3044, 3920, + 4095, 3046, 3920, + 4095, 3049, 3919, + 4095, 3053, 3918, + 4095, 3059, 3917, + 4095, 3066, 3915, + 4095, 3075, 3913, + 4095, 3087, 3910, + 4095, 3103, 3905, + 4095, 3123, 3900, + 4095, 3149, 3892, + 4095, 3181, 3881, + 4095, 3221, 3866, + 4095, 3269, 3846, + 4095, 3327, 3817, + 4095, 3394, 3775, + 4084, 3470, 3713, + 4029, 3556, 3613, + 3942, 3650, 3432, + 3792, 3751, 2947, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3167, 4053, + 4095, 3167, 4053, + 4095, 3168, 4053, + 4095, 3168, 4053, + 4095, 3169, 4052, + 4095, 3171, 4052, + 4095, 3172, 4052, + 4095, 3175, 4051, + 4095, 3178, 4050, + 4095, 3182, 4049, + 4095, 3187, 4048, + 4095, 3194, 4046, + 4095, 3204, 4044, + 4095, 3216, 4041, + 4095, 3232, 4037, + 4095, 3252, 4031, + 4095, 3278, 4023, + 4095, 3310, 4012, + 4095, 3350, 3997, + 4095, 3399, 3977, + 4095, 3457, 3948, + 4095, 3524, 3906, + 4095, 3601, 3843, + 4095, 3687, 3743, + 4074, 3781, 3561, + 0, 1606, 1871, + 0, 1607, 1869, + 0, 1610, 1867, + 0, 1612, 1864, + 0, 1616, 1861, + 0, 1622, 1856, + 0, 1628, 1849, + 0, 1637, 1840, + 0, 1649, 1827, + 0, 1664, 1810, + 0, 1684, 1786, + 0, 1709, 1751, + 0, 1740, 1701, + 0, 1779, 1623, + 0, 1826, 1491, + 0, 1883, 1222, + 0, 1949, 0, + 0, 2024, 0, + 0, 2108, 0, + 0, 2201, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1606, 1873, + 0, 1608, 1871, + 0, 1610, 1869, + 0, 1613, 1867, + 0, 1617, 1863, + 0, 1622, 1858, + 0, 1629, 1851, + 0, 1638, 1842, + 0, 1650, 1830, + 0, 1665, 1813, + 0, 1684, 1789, + 0, 1709, 1754, + 0, 1741, 1704, + 0, 1779, 1626, + 0, 1827, 1497, + 0, 1883, 1231, + 0, 1949, 0, + 0, 2024, 0, + 0, 2109, 0, + 0, 2202, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1607, 1876, + 0, 1609, 1874, + 0, 1611, 1872, + 0, 1614, 1870, + 0, 1618, 1866, + 0, 1623, 1861, + 0, 1630, 1855, + 0, 1639, 1846, + 0, 1650, 1833, + 0, 1666, 1816, + 0, 1685, 1792, + 0, 1710, 1758, + 0, 1741, 1708, + 0, 1780, 1632, + 0, 1827, 1503, + 0, 1883, 1243, + 0, 1949, 0, + 0, 2024, 0, + 0, 2109, 0, + 0, 2202, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1608, 1880, + 0, 1610, 1878, + 0, 1612, 1876, + 0, 1615, 1874, + 0, 1619, 1870, + 0, 1624, 1865, + 0, 1631, 1859, + 0, 1640, 1850, + 0, 1651, 1838, + 0, 1666, 1821, + 0, 1686, 1797, + 0, 1711, 1763, + 0, 1742, 1714, + 0, 1781, 1638, + 0, 1828, 1512, + 0, 1884, 1259, + 0, 1950, 0, + 0, 2025, 0, + 0, 2109, 0, + 0, 2202, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1609, 1885, + 0, 1611, 1884, + 0, 1613, 1882, + 0, 1616, 1879, + 0, 1620, 1876, + 0, 1625, 1871, + 0, 1632, 1864, + 0, 1641, 1855, + 0, 1652, 1843, + 0, 1668, 1827, + 0, 1687, 1803, + 0, 1712, 1770, + 0, 1743, 1722, + 0, 1782, 1647, + 0, 1829, 1524, + 0, 1885, 1280, + 0, 1950, 0, + 0, 2025, 0, + 0, 2110, 0, + 0, 2202, 0, + 0, 2303, 0, + 0, 2409, 0, + 0, 2522, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1611, 1892, + 0, 1613, 1891, + 0, 1615, 1889, + 0, 1618, 1886, + 0, 1622, 1883, + 0, 1627, 1878, + 0, 1634, 1872, + 0, 1642, 1863, + 0, 1654, 1851, + 0, 1669, 1835, + 0, 1689, 1812, + 0, 1713, 1779, + 0, 1744, 1732, + 0, 1783, 1659, + 0, 1830, 1540, + 0, 1886, 1305, + 0, 1951, 254, + 0, 2026, 0, + 0, 2110, 0, + 0, 2203, 0, + 0, 2303, 0, + 0, 2410, 0, + 0, 2522, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1614, 1901, + 0, 1615, 1900, + 0, 1617, 1898, + 0, 1620, 1896, + 0, 1624, 1892, + 0, 1629, 1887, + 0, 1636, 1881, + 0, 1645, 1873, + 0, 1656, 1861, + 0, 1671, 1845, + 0, 1691, 1823, + 0, 1715, 1791, + 0, 1746, 1745, + 0, 1784, 1674, + 0, 1831, 1559, + 0, 1887, 1338, + 0, 1952, 508, + 0, 2027, 0, + 0, 2111, 0, + 0, 2203, 0, + 0, 2304, 0, + 0, 2410, 0, + 0, 2522, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2881, 0, + 0, 3007, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1617, 1913, + 0, 1618, 1912, + 0, 1620, 1910, + 0, 1623, 1908, + 0, 1627, 1904, + 0, 1632, 1900, + 0, 1639, 1894, + 0, 1648, 1885, + 0, 1659, 1874, + 0, 1674, 1859, + 0, 1693, 1837, + 0, 1718, 1806, + 0, 1748, 1761, + 0, 1787, 1694, + 0, 1833, 1584, + 0, 1889, 1378, + 0, 1954, 713, + 0, 2028, 0, + 0, 2112, 0, + 0, 2204, 0, + 0, 2304, 0, + 0, 2411, 0, + 0, 2522, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1621, 1929, + 0, 1622, 1928, + 0, 1625, 1926, + 0, 1627, 1923, + 0, 1631, 1920, + 0, 1636, 1916, + 0, 1643, 1910, + 0, 1652, 1902, + 0, 1663, 1891, + 0, 1678, 1876, + 0, 1697, 1855, + 0, 1721, 1826, + 0, 1752, 1783, + 0, 1790, 1719, + 0, 1836, 1616, + 0, 1891, 1426, + 0, 1956, 894, + 0, 2030, 0, + 0, 2113, 0, + 0, 2206, 0, + 0, 2305, 0, + 0, 2411, 0, + 0, 2523, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1626, 1949, + 0, 1628, 1948, + 0, 1630, 1946, + 0, 1633, 1944, + 0, 1637, 1940, + 0, 1642, 1936, + 0, 1648, 1931, + 0, 1657, 1923, + 0, 1668, 1913, + 0, 1683, 1898, + 0, 1701, 1878, + 0, 1726, 1851, + 0, 1756, 1810, + 0, 1793, 1750, + 0, 1839, 1655, + 0, 1894, 1484, + 0, 1958, 1059, + 0, 2032, 0, + 0, 2115, 0, + 0, 2207, 0, + 0, 2306, 0, + 0, 2412, 0, + 0, 2524, 0, + 0, 2640, 0, + 0, 2760, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1634, 1974, + 0, 1635, 1973, + 0, 1637, 1971, + 0, 1640, 1969, + 0, 1644, 1966, + 0, 1649, 1962, + 0, 1655, 1957, + 0, 1664, 1950, + 0, 1675, 1940, + 0, 1689, 1927, + 0, 1708, 1908, + 0, 1731, 1882, + 0, 1761, 1844, + 0, 1798, 1789, + 0, 1844, 1702, + 0, 1898, 1552, + 0, 1962, 1214, + 0, 2035, 0, + 0, 2118, 0, + 0, 2209, 0, + 0, 2308, 0, + 0, 2414, 0, + 0, 2525, 0, + 0, 2641, 0, + 0, 2760, 0, + 0, 2883, 0, + 0, 3008, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 1107, 1643, 2006, + 1096, 1645, 2005, + 1081, 1647, 2003, + 1061, 1650, 2001, + 1031, 1653, 1999, + 989, 1658, 1995, + 926, 1664, 1990, + 824, 1673, 1983, + 639, 1684, 1974, + 132, 1698, 1962, + 0, 1716, 1945, + 0, 1739, 1921, + 0, 1769, 1886, + 0, 1805, 1836, + 0, 1850, 1758, + 0, 1904, 1628, + 0, 1967, 1363, + 0, 2039, 0, + 0, 2121, 0, + 0, 2212, 0, + 0, 2310, 0, + 0, 2415, 0, + 0, 2526, 0, + 0, 2642, 0, + 0, 2761, 0, + 0, 2883, 0, + 0, 3008, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 1479, 1656, 2045, + 1474, 1657, 2044, + 1468, 1659, 2043, + 1459, 1662, 2041, + 1447, 1666, 2039, + 1431, 1670, 2035, + 1408, 1676, 2031, + 1375, 1684, 2025, + 1327, 1695, 2016, + 1255, 1709, 2005, + 1135, 1727, 1989, + 899, 1749, 1968, + 0, 1778, 1937, + 0, 1814, 1892, + 0, 1858, 1824, + 0, 1911, 1714, + 0, 1973, 1507, + 0, 2045, 831, + 0, 2126, 0, + 0, 2215, 0, + 0, 2313, 0, + 0, 2418, 0, + 0, 2528, 0, + 0, 2643, 0, + 0, 2762, 0, + 0, 2884, 0, + 0, 3009, 0, + 0, 3135, 0, + 0, 3263, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 1732, 1672, 2093, + 1730, 1674, 2092, + 1726, 1676, 2091, + 1721, 1678, 2089, + 1715, 1681, 2087, + 1706, 1686, 2084, + 1693, 1692, 2080, + 1676, 1700, 2075, + 1652, 1710, 2067, + 1618, 1723, 2057, + 1568, 1741, 2043, + 1491, 1763, 2024, + 1362, 1791, 1997, + 1100, 1826, 1958, + 0, 1868, 1900, + 0, 1920, 1808, + 0, 1981, 1648, + 0, 2052, 1267, + 0, 2132, 0, + 0, 2220, 0, + 0, 2317, 0, + 0, 2421, 0, + 0, 2530, 0, + 0, 2645, 0, + 0, 2764, 0, + 0, 2885, 0, + 0, 3009, 0, + 0, 3136, 0, + 0, 3263, 0, + 0, 3392, 0, + 0, 3521, 0, + 0, 3651, 0, + 1938, 1693, 2150, + 1936, 1694, 2150, + 1934, 1696, 2148, + 1931, 1699, 2147, + 1927, 1702, 2145, + 1921, 1706, 2142, + 1913, 1712, 2139, + 1903, 1719, 2134, + 1889, 1729, 2127, + 1869, 1742, 2119, + 1840, 1759, 2106, + 1800, 1780, 2090, + 1739, 1807, 2066, + 1643, 1841, 2033, + 1470, 1882, 1984, + 1033, 1932, 1910, + 0, 1992, 1786, + 0, 2061, 1540, + 0, 2139, 54, + 0, 2227, 0, + 0, 2322, 0, + 0, 2425, 0, + 0, 2534, 0, + 0, 2648, 0, + 0, 2766, 0, + 0, 2887, 0, + 0, 3011, 0, + 0, 3136, 0, + 0, 3264, 0, + 0, 3392, 0, + 0, 3522, 0, + 0, 3652, 0, + 2118, 1720, 2217, + 2117, 1721, 2216, + 2116, 1723, 2215, + 2113, 1725, 2214, + 2111, 1728, 2212, + 2107, 1732, 2210, + 2102, 1737, 2207, + 2095, 1744, 2203, + 2086, 1754, 2197, + 2073, 1766, 2190, + 2055, 1782, 2179, + 2030, 1802, 2165, + 1994, 1828, 2145, + 1942, 1860, 2118, + 1861, 1900, 2077, + 1723, 1948, 2018, + 1431, 2006, 1923, + 0, 2073, 1755, + 0, 2149, 1339, + 0, 2235, 0, + 0, 2329, 0, + 0, 2430, 0, + 0, 2538, 0, + 0, 2651, 0, + 0, 2768, 0, + 0, 2889, 0, + 0, 3012, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2283, 1753, 2293, + 2282, 1754, 2292, + 2281, 1756, 2292, + 2280, 1758, 2290, + 2278, 1761, 2289, + 2275, 1764, 2287, + 2272, 1769, 2285, + 2267, 1776, 2281, + 2261, 1785, 2276, + 2252, 1796, 2270, + 2240, 1811, 2261, + 2224, 1830, 2249, + 2201, 1854, 2233, + 2168, 1884, 2210, + 2121, 1922, 2178, + 2048, 1968, 2131, + 1928, 2024, 2059, + 1694, 2088, 1940, + 631, 2163, 1709, + 0, 2246, 718, + 0, 2338, 0, + 0, 2437, 0, + 0, 2544, 0, + 0, 2655, 0, + 0, 2772, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 2439, 1794, 2378, + 2438, 1795, 2378, + 2437, 1796, 2377, + 2436, 1798, 2376, + 2435, 1801, 2375, + 2433, 1804, 2373, + 2430, 1809, 2371, + 2427, 1815, 2368, + 2423, 1823, 2364, + 2417, 1833, 2359, + 2408, 1847, 2352, + 2397, 1864, 2342, + 2382, 1887, 2329, + 2360, 1915, 2311, + 2329, 1951, 2285, + 2285, 1994, 2248, + 2217, 2047, 2193, + 2108, 2108, 2108, + 1903, 2180, 1962, + 1252, 2260, 1639, + 0, 2350, 0, + 0, 2447, 0, + 0, 2551, 0, + 0, 2661, 0, + 0, 2776, 0, + 0, 2895, 0, + 0, 3017, 0, + 0, 3141, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3524, 0, + 0, 3653, 0, + 2587, 1843, 2472, + 2587, 1844, 2471, + 2586, 1845, 2471, + 2585, 1847, 2470, + 2584, 1850, 2469, + 2583, 1853, 2468, + 2581, 1857, 2466, + 2579, 1862, 2464, + 2576, 1869, 2460, + 2571, 1879, 2456, + 2566, 1891, 2451, + 2558, 1907, 2443, + 2547, 1928, 2432, + 2532, 1954, 2418, + 2511, 1986, 2397, + 2482, 2027, 2369, + 2439, 2076, 2327, + 2375, 2134, 2266, + 2273, 2201, 2167, + 2086, 2279, 1990, + 1566, 2365, 1526, + 0, 2459, 0, + 0, 2561, 0, + 0, 2669, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 2731, 1902, 2573, + 2731, 1903, 2572, + 2731, 1904, 2572, + 2730, 1906, 2571, + 2729, 1908, 2570, + 2728, 1910, 2569, + 2727, 1914, 2568, + 2725, 1919, 2566, + 2723, 1925, 2564, + 2720, 1933, 2560, + 2716, 1944, 2556, + 2710, 1959, 2550, + 2702, 1977, 2541, + 2692, 2000, 2530, + 2677, 2030, 2514, + 2657, 2067, 2492, + 2629, 2112, 2461, + 2588, 2166, 2416, + 2526, 2229, 2347, + 2428, 2302, 2236, + 2252, 2384, 2024, + 1798, 2475, 1309, + 0, 2574, 0, + 0, 2679, 0, + 0, 2790, 0, + 0, 2906, 0, + 0, 3025, 0, + 0, 3147, 0, + 0, 3272, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 2872, 1970, 2680, + 2872, 1971, 2680, + 2872, 1972, 2679, + 2871, 1973, 2679, + 2871, 1975, 2678, + 2870, 1977, 2677, + 2869, 1981, 2676, + 2868, 1985, 2675, + 2866, 1990, 2673, + 2864, 1998, 2670, + 2861, 2007, 2667, + 2857, 2019, 2662, + 2851, 2036, 2655, + 2843, 2056, 2646, + 2833, 2083, 2634, + 2819, 2115, 2618, + 2799, 2156, 2594, + 2771, 2205, 2561, + 2731, 2264, 2512, + 2672, 2332, 2437, + 2577, 2409, 2314, + 2409, 2495, 2066, + 1993, 2590, 532, + 0, 2692, 0, + 0, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3011, 2048, 2793, + 3011, 2049, 2792, + 3010, 2050, 2792, + 3010, 2051, 2792, + 3010, 2052, 2791, + 3009, 2054, 2791, + 3008, 2057, 2790, + 3007, 2060, 2789, + 3006, 2065, 2787, + 3005, 2071, 2785, + 3002, 2079, 2782, + 2999, 2090, 2779, + 2995, 2104, 2774, + 2990, 2122, 2767, + 2982, 2144, 2757, + 2972, 2173, 2745, + 2958, 2209, 2727, + 2939, 2253, 2702, + 2911, 2306, 2667, + 2872, 2368, 2616, + 2813, 2440, 2536, + 2721, 2521, 2400, + 2558, 2611, 2118, + 2167, 2709, 0, + 0, 2814, 0, + 0, 2924, 0, + 0, 3039, 0, + 0, 3158, 0, + 0, 3280, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 3148, 2135, 2910, + 3147, 2135, 2909, + 3147, 2136, 2909, + 3147, 2137, 2909, + 3147, 2138, 2909, + 3146, 2140, 2908, + 3146, 2142, 2907, + 3145, 2145, 2907, + 3144, 2149, 2905, + 3143, 2154, 2904, + 3141, 2161, 2902, + 3139, 2170, 2899, + 3136, 2181, 2895, + 3132, 2196, 2890, + 3127, 2216, 2883, + 3119, 2241, 2873, + 3109, 2272, 2860, + 3095, 2310, 2842, + 3076, 2357, 2816, + 3049, 2413, 2779, + 3010, 2479, 2725, + 2953, 2554, 2640, + 2862, 2638, 2495, + 2703, 2731, 2178, + 2328, 2831, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 3283, 2230, 3030, + 3283, 2230, 3030, + 3283, 2231, 3030, + 3283, 2232, 3030, + 3283, 2233, 3029, + 3282, 2234, 3029, + 3282, 2236, 3028, + 3281, 2238, 3028, + 3281, 2241, 3027, + 3280, 2245, 3026, + 3279, 2251, 3024, + 3277, 2258, 3022, + 3275, 2268, 3019, + 3272, 2280, 3015, + 3268, 2297, 3010, + 3262, 2317, 3002, + 3255, 2344, 2992, + 3245, 2377, 2979, + 3231, 2418, 2960, + 3212, 2467, 2933, + 3186, 2526, 2896, + 3147, 2594, 2839, + 3090, 2672, 2751, + 3000, 2758, 2598, + 2844, 2853, 2248, + 2481, 2955, 0, + 0, 3064, 0, + 0, 3177, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3418, 2332, 3153, + 3418, 2332, 3153, + 3418, 2333, 3153, + 3418, 2333, 3153, + 3417, 2334, 3153, + 3417, 2335, 3152, + 3417, 2337, 3152, + 3417, 2339, 3151, + 3416, 2341, 3151, + 3415, 2344, 3150, + 3414, 2349, 3149, + 3413, 2355, 3147, + 3412, 2363, 3145, + 3409, 2373, 3142, + 3406, 2386, 3138, + 3403, 2403, 3132, + 3397, 2425, 3125, + 3390, 2453, 3115, + 3380, 2488, 3101, + 3366, 2531, 3082, + 3347, 2582, 3054, + 3321, 2643, 3016, + 3283, 2713, 2958, + 3226, 2793, 2866, + 3137, 2882, 2706, + 2983, 2978, 2328, + 2627, 3082, 0, + 0, 3191, 0, + 0, 3306, 0, + 0, 3424, 0, + 0, 3546, 0, + 0, 3670, 0, + 3552, 2440, 3279, + 3552, 2441, 3278, + 3552, 2441, 3278, + 3552, 2441, 3278, + 3552, 2442, 3278, + 3551, 2443, 3278, + 3551, 2444, 3278, + 3551, 2446, 3277, + 3551, 2448, 3277, + 3550, 2450, 3276, + 3549, 2454, 3275, + 3549, 2458, 3274, + 3547, 2465, 3272, + 3546, 2473, 3270, + 3543, 2484, 3267, + 3541, 2497, 3263, + 3537, 2515, 3257, + 3531, 2538, 3250, + 3524, 2567, 3239, + 3514, 2603, 3225, + 3500, 2648, 3206, + 3482, 2701, 3178, + 3455, 2763, 3138, + 3417, 2835, 3079, + 3361, 2917, 2986, + 3273, 3007, 2820, + 3120, 3105, 2416, + 2770, 3209, 0, + 0, 3320, 0, + 0, 3435, 0, + 0, 3554, 0, + 0, 3676, 0, + 3685, 2554, 3406, + 3685, 2554, 3405, + 3685, 2554, 3405, + 3685, 2555, 3405, + 3685, 2555, 3405, + 3685, 2556, 3405, + 3685, 2557, 3405, + 3685, 2558, 3405, + 3684, 2560, 3404, + 3684, 2562, 3404, + 3684, 2564, 3403, + 3683, 2568, 3402, + 3682, 2573, 3401, + 3681, 2579, 3399, + 3679, 2588, 3397, + 3677, 2599, 3394, + 3674, 2613, 3389, + 3670, 2632, 3384, + 3665, 2656, 3376, + 3658, 2686, 3366, + 3648, 2723, 3351, + 3634, 2768, 3332, + 3615, 2823, 3304, + 3589, 2886, 3263, + 3551, 2960, 3203, + 3495, 3042, 3108, + 3408, 3134, 2938, + 3255, 3233, 2512, + 2910, 3338, 0, + 0, 3449, 0, + 0, 3565, 0, + 0, 3685, 0, + 3819, 2672, 3534, + 3819, 2672, 3534, + 3819, 2672, 3534, + 3819, 2672, 3534, + 3818, 2673, 3533, + 3818, 2673, 3533, + 3818, 2674, 3533, + 3818, 2675, 3533, + 3818, 2676, 3533, + 3818, 2678, 3532, + 3817, 2680, 3532, + 3817, 2683, 3531, + 3816, 2686, 3530, + 3815, 2691, 3529, + 3814, 2698, 3527, + 3812, 2707, 3525, + 3810, 2718, 3522, + 3807, 2733, 3517, + 3803, 2752, 3512, + 3798, 2776, 3504, + 3791, 2807, 3494, + 3781, 2845, 3479, + 3767, 2891, 3459, + 3749, 2947, 3431, + 3722, 3012, 3390, + 3685, 3086, 3329, + 3629, 3170, 3232, + 3542, 3262, 3059, + 3390, 3362, 2616, + 3048, 3468, 0, + 0, 3580, 0, + 0, 3696, 0, + 3952, 2793, 3663, + 3952, 2793, 3663, + 3952, 2793, 3663, + 3951, 2793, 3663, + 3951, 2793, 3663, + 3951, 2794, 3663, + 3951, 2794, 3663, + 3951, 2795, 3662, + 3951, 2796, 3662, + 3951, 2797, 3662, + 3951, 2799, 3661, + 3950, 2801, 3661, + 3950, 2804, 3660, + 3949, 2808, 3659, + 3948, 2813, 3658, + 3947, 2820, 3656, + 3945, 2829, 3654, + 3943, 2840, 3651, + 3940, 2856, 3646, + 3936, 2875, 3641, + 3931, 2900, 3633, + 3924, 2931, 3622, + 3914, 2970, 3608, + 3900, 3017, 3588, + 3882, 3073, 3559, + 3856, 3139, 3518, + 3818, 3214, 3457, + 3762, 3298, 3359, + 3675, 3391, 3182, + 3524, 3491, 2725, + 3184, 3598, 0, + 0, 3710, 0, + 4084, 2916, 3793, + 4084, 2916, 3793, + 4084, 2916, 3793, + 4084, 2917, 3793, + 4084, 2917, 3793, + 4084, 2917, 3793, + 4084, 2918, 3793, + 4084, 2918, 3792, + 4084, 2919, 3792, + 4084, 2920, 3792, + 4083, 2921, 3792, + 4083, 2923, 3791, + 4083, 2925, 3791, + 4082, 2928, 3790, + 4082, 2932, 3789, + 4081, 2937, 3788, + 4080, 2944, 3786, + 4078, 2953, 3784, + 4076, 2965, 3781, + 4073, 2980, 3776, + 4069, 3000, 3771, + 4064, 3025, 3763, + 4056, 3057, 3752, + 4047, 3096, 3738, + 4033, 3144, 3717, + 4015, 3201, 3689, + 3988, 3267, 3647, + 3951, 3343, 3585, + 3895, 3428, 3486, + 3808, 3521, 3308, + 3658, 3622, 2839, + 3320, 3729, 0, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3043, 3923, + 4095, 3043, 3923, + 4095, 3043, 3923, + 4095, 3044, 3923, + 4095, 3045, 3923, + 4095, 3046, 3922, + 4095, 3047, 3922, + 4095, 3049, 3922, + 4095, 3051, 3921, + 4095, 3054, 3920, + 4095, 3058, 3919, + 4095, 3063, 3918, + 4095, 3070, 3916, + 4095, 3079, 3914, + 4095, 3091, 3911, + 4095, 3107, 3907, + 4095, 3127, 3901, + 4095, 3152, 3893, + 4095, 3184, 3882, + 4095, 3224, 3868, + 4095, 3272, 3847, + 4095, 3329, 3819, + 4095, 3396, 3777, + 4084, 3472, 3715, + 4028, 3558, 3615, + 3941, 3651, 3435, + 3791, 3752, 2958, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3170, 4054, + 4095, 3170, 4054, + 4095, 3170, 4054, + 4095, 3171, 4054, + 4095, 3171, 4054, + 4095, 3172, 4054, + 4095, 3173, 4053, + 4095, 3174, 4053, + 4095, 3176, 4053, + 4095, 3178, 4052, + 4095, 3181, 4051, + 4095, 3185, 4050, + 4095, 3191, 4049, + 4095, 3198, 4047, + 4095, 3207, 4045, + 4095, 3219, 4042, + 4095, 3235, 4037, + 4095, 3255, 4032, + 4095, 3281, 4024, + 4095, 3313, 4013, + 4095, 3353, 3998, + 4095, 3401, 3978, + 4095, 3459, 3949, + 4095, 3526, 3907, + 4095, 3602, 3845, + 4095, 3688, 3745, + 4074, 3782, 3564, + 0, 1736, 2002, + 0, 1737, 2001, + 0, 1739, 2000, + 0, 1741, 1998, + 0, 1744, 1995, + 0, 1748, 1991, + 0, 1753, 1986, + 0, 1760, 1979, + 0, 1769, 1970, + 0, 1781, 1958, + 0, 1796, 1940, + 0, 1816, 1916, + 0, 1841, 1881, + 0, 1872, 1830, + 0, 1911, 1752, + 0, 1958, 1620, + 0, 2015, 1347, + 0, 2080, 0, + 0, 2156, 0, + 0, 2240, 0, + 0, 2333, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1737, 2004, + 0, 1738, 2003, + 0, 1739, 2001, + 0, 1742, 1999, + 0, 1745, 1997, + 0, 1749, 1993, + 0, 1754, 1988, + 0, 1761, 1981, + 0, 1769, 1972, + 0, 1781, 1960, + 0, 1796, 1942, + 0, 1816, 1918, + 0, 1841, 1883, + 0, 1872, 1833, + 0, 1911, 1755, + 0, 1958, 1624, + 0, 2015, 1354, + 0, 2081, 0, + 0, 2156, 0, + 0, 2241, 0, + 0, 2333, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1737, 2006, + 0, 1738, 2005, + 0, 1740, 2004, + 0, 1742, 2002, + 0, 1745, 1999, + 0, 1749, 1995, + 0, 1754, 1990, + 0, 1761, 1984, + 0, 1770, 1974, + 0, 1782, 1962, + 0, 1797, 1945, + 0, 1817, 1921, + 0, 1841, 1886, + 0, 1873, 1836, + 0, 1912, 1759, + 0, 1959, 1629, + 0, 2015, 1363, + 0, 2081, 0, + 0, 2156, 0, + 0, 2241, 0, + 0, 2334, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1738, 2009, + 0, 1739, 2008, + 0, 1741, 2007, + 0, 1743, 2005, + 0, 1746, 2002, + 0, 1750, 1998, + 0, 1755, 1993, + 0, 1762, 1987, + 0, 1771, 1978, + 0, 1782, 1965, + 0, 1798, 1948, + 0, 1817, 1924, + 0, 1842, 1890, + 0, 1873, 1840, + 0, 1912, 1764, + 0, 1959, 1636, + 0, 2015, 1375, + 0, 2081, 0, + 0, 2157, 0, + 0, 2241, 0, + 0, 2334, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1739, 2013, + 0, 1740, 2012, + 0, 1742, 2011, + 0, 1744, 2009, + 0, 1747, 2006, + 0, 1751, 2002, + 0, 1756, 1997, + 0, 1763, 1991, + 0, 1772, 1982, + 0, 1783, 1970, + 0, 1798, 1953, + 0, 1818, 1929, + 0, 1843, 1895, + 0, 1874, 1846, + 0, 1913, 1771, + 0, 1960, 1645, + 0, 2016, 1391, + 0, 2082, 0, + 0, 2157, 0, + 0, 2241, 0, + 0, 2334, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1740, 2018, + 0, 1741, 2017, + 0, 1743, 2016, + 0, 1745, 2014, + 0, 1748, 2011, + 0, 1752, 2008, + 0, 1757, 2003, + 0, 1764, 1996, + 0, 1773, 1988, + 0, 1785, 1975, + 0, 1800, 1959, + 0, 1819, 1935, + 0, 1844, 1902, + 0, 1875, 1854, + 0, 1914, 1779, + 0, 1961, 1656, + 0, 2017, 1412, + 0, 2082, 13, + 0, 2157, 0, + 0, 2242, 0, + 0, 2334, 0, + 0, 2435, 0, + 0, 2541, 0, + 0, 2654, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1742, 2025, + 0, 1743, 2024, + 0, 1745, 2023, + 0, 1747, 2021, + 0, 1750, 2018, + 0, 1754, 2015, + 0, 1759, 2010, + 0, 1766, 2004, + 0, 1775, 1995, + 0, 1786, 1983, + 0, 1801, 1967, + 0, 1821, 1944, + 0, 1845, 1911, + 0, 1876, 1864, + 0, 1915, 1791, + 0, 1962, 1672, + 0, 2018, 1438, + 0, 2083, 386, + 0, 2158, 0, + 0, 2242, 0, + 0, 2335, 0, + 0, 2435, 0, + 0, 2542, 0, + 0, 2654, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3139, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1744, 2035, + 0, 1746, 2033, + 0, 1747, 2032, + 0, 1749, 2030, + 0, 1752, 2028, + 0, 1756, 2024, + 0, 1761, 2020, + 0, 1768, 2013, + 0, 1777, 2005, + 0, 1788, 1993, + 0, 1803, 1977, + 0, 1823, 1955, + 0, 1847, 1923, + 0, 1878, 1877, + 0, 1917, 1806, + 0, 1963, 1691, + 0, 2019, 1470, + 0, 2084, 640, + 0, 2159, 0, + 0, 2243, 0, + 0, 2336, 0, + 0, 2436, 0, + 0, 2542, 0, + 0, 2654, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1748, 2046, + 0, 1749, 2045, + 0, 1750, 2044, + 0, 1753, 2042, + 0, 1755, 2040, + 0, 1759, 2036, + 0, 1764, 2032, + 0, 1771, 2026, + 0, 1780, 2018, + 0, 1791, 2006, + 0, 1806, 1991, + 0, 1825, 1969, + 0, 1850, 1938, + 0, 1881, 1893, + 0, 1919, 1826, + 0, 1965, 1716, + 0, 2021, 1510, + 0, 2086, 846, + 0, 2160, 0, + 0, 2244, 0, + 0, 2336, 0, + 0, 2436, 0, + 0, 2543, 0, + 0, 2655, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1752, 2062, + 0, 1753, 2061, + 0, 1755, 2060, + 0, 1757, 2058, + 0, 1760, 2055, + 0, 1763, 2052, + 0, 1768, 2048, + 0, 1775, 2042, + 0, 1784, 2034, + 0, 1795, 2023, + 0, 1810, 2008, + 0, 1829, 1987, + 0, 1853, 1958, + 0, 1884, 1915, + 0, 1922, 1851, + 0, 1968, 1748, + 0, 2023, 1559, + 0, 2088, 1026, + 0, 2162, 0, + 0, 2246, 0, + 0, 2338, 0, + 0, 2437, 0, + 0, 2543, 0, + 0, 2655, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1757, 2082, + 0, 1759, 2081, + 0, 1760, 2080, + 0, 1762, 2078, + 0, 1765, 2076, + 0, 1769, 2073, + 0, 1774, 2068, + 0, 1780, 2063, + 0, 1789, 2055, + 0, 1800, 2045, + 0, 1815, 2030, + 0, 1834, 2011, + 0, 1858, 1983, + 0, 1888, 1942, + 0, 1925, 1882, + 0, 1971, 1787, + 0, 2026, 1616, + 0, 2090, 1191, + 0, 2164, 0, + 0, 2247, 0, + 0, 2339, 0, + 0, 2438, 0, + 0, 2544, 0, + 0, 2656, 0, + 0, 2772, 0, + 0, 2892, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 30, 1765, 2107, + 0, 1766, 2106, + 0, 1767, 2105, + 0, 1770, 2103, + 0, 1772, 2101, + 0, 1776, 2098, + 0, 1781, 2094, + 0, 1787, 2089, + 0, 1796, 2082, + 0, 1807, 2072, + 0, 1821, 2059, + 0, 1840, 2040, + 0, 1864, 2014, + 0, 1893, 1976, + 0, 1931, 1921, + 0, 1976, 1834, + 0, 2030, 1684, + 0, 2094, 1346, + 0, 2167, 0, + 0, 2250, 0, + 0, 2341, 0, + 0, 2440, 0, + 0, 2546, 0, + 0, 2657, 0, + 0, 2773, 0, + 0, 2892, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 1247, 1774, 2139, + 1239, 1775, 2138, + 1228, 1777, 2137, + 1213, 1779, 2136, + 1193, 1782, 2133, + 1163, 1785, 2131, + 1121, 1790, 2127, + 1058, 1796, 2122, + 956, 1805, 2116, + 771, 1816, 2106, + 265, 1830, 2094, + 0, 1848, 2077, + 0, 1871, 2053, + 0, 1901, 2018, + 0, 1937, 1968, + 0, 1982, 1890, + 0, 2036, 1760, + 0, 2099, 1495, + 0, 2171, 0, + 0, 2253, 0, + 0, 2344, 0, + 0, 2442, 0, + 0, 2547, 0, + 0, 2658, 0, + 0, 2774, 0, + 0, 2893, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3267, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 1614, 1787, 2178, + 1611, 1788, 2178, + 1606, 1790, 2177, + 1600, 1792, 2175, + 1591, 1794, 2173, + 1579, 1798, 2171, + 1563, 1802, 2167, + 1540, 1808, 2163, + 1507, 1817, 2157, + 1459, 1827, 2149, + 1387, 1841, 2137, + 1267, 1859, 2122, + 1031, 1881, 2100, + 0, 1910, 2069, + 0, 1946, 2024, + 0, 1990, 1956, + 0, 2043, 1846, + 0, 2105, 1639, + 0, 2177, 963, + 0, 2258, 0, + 0, 2348, 0, + 0, 2445, 0, + 0, 2550, 0, + 0, 2660, 0, + 0, 2775, 0, + 0, 2894, 0, + 0, 3016, 0, + 0, 3141, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3523, 0, + 0, 3653, 0, + 1867, 1803, 2226, + 1865, 1804, 2225, + 1862, 1806, 2224, + 1858, 1808, 2223, + 1853, 1810, 2222, + 1847, 1814, 2219, + 1838, 1818, 2216, + 1825, 1824, 2212, + 1808, 1832, 2207, + 1784, 1842, 2199, + 1750, 1855, 2189, + 1700, 1873, 2175, + 1623, 1895, 2156, + 1494, 1923, 2129, + 1232, 1958, 2090, + 0, 2000, 2032, + 0, 2052, 1940, + 0, 2113, 1780, + 0, 2184, 1399, + 0, 2264, 0, + 0, 2352, 0, + 0, 2449, 0, + 0, 2553, 0, + 0, 2663, 0, + 0, 2777, 0, + 0, 2896, 0, + 0, 3017, 0, + 0, 3142, 0, + 0, 3268, 0, + 0, 3395, 0, + 0, 3524, 0, + 0, 3653, 0, + 2071, 1824, 2283, + 2070, 1825, 2282, + 2068, 1827, 2282, + 2066, 1828, 2281, + 2063, 1831, 2279, + 2059, 1834, 2277, + 2053, 1838, 2274, + 2046, 1844, 2271, + 2035, 1851, 2266, + 2021, 1861, 2260, + 2001, 1874, 2251, + 1973, 1891, 2239, + 1932, 1912, 2222, + 1871, 1939, 2198, + 1775, 1973, 2165, + 1602, 2014, 2117, + 1165, 2064, 2042, + 0, 2124, 1918, + 0, 2193, 1672, + 0, 2271, 186, + 0, 2359, 0, + 0, 2454, 0, + 0, 2557, 0, + 0, 2666, 0, + 0, 2780, 0, + 0, 2898, 0, + 0, 3019, 0, + 0, 3143, 0, + 0, 3268, 0, + 0, 3396, 0, + 0, 3524, 0, + 0, 3654, 0, + 2251, 1851, 2350, + 2250, 1852, 2349, + 2249, 1853, 2348, + 2248, 1855, 2347, + 2246, 1857, 2346, + 2243, 1860, 2344, + 2239, 1864, 2342, + 2234, 1869, 2339, + 2227, 1877, 2335, + 2218, 1886, 2329, + 2205, 1898, 2322, + 2187, 1914, 2311, + 2162, 1934, 2297, + 2127, 1960, 2277, + 2074, 1992, 2250, + 1993, 2032, 2210, + 1855, 2080, 2150, + 1563, 2138, 2055, + 0, 2205, 1887, + 0, 2281, 1471, + 0, 2367, 0, + 0, 2461, 0, + 0, 2562, 0, + 0, 2670, 0, + 0, 2783, 0, + 0, 2900, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 2416, 1884, 2425, + 2415, 1885, 2425, + 2415, 1886, 2424, + 2413, 1888, 2424, + 2412, 1890, 2423, + 2410, 1893, 2421, + 2408, 1896, 2419, + 2404, 1901, 2417, + 2399, 1908, 2413, + 2393, 1917, 2408, + 2384, 1928, 2402, + 2372, 1943, 2393, + 2356, 1962, 2382, + 2333, 1986, 2365, + 2300, 2017, 2342, + 2253, 2054, 2310, + 2180, 2101, 2263, + 2060, 2156, 2191, + 1826, 2220, 2072, + 763, 2295, 1841, + 0, 2378, 850, + 0, 2470, 0, + 0, 2570, 0, + 0, 2676, 0, + 0, 2787, 0, + 0, 2904, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 2571, 1925, 2511, + 2571, 1926, 2510, + 2570, 1927, 2510, + 2569, 1928, 2509, + 2568, 1930, 2508, + 2567, 1933, 2507, + 2565, 1936, 2505, + 2563, 1941, 2503, + 2559, 1947, 2500, + 2555, 1955, 2496, + 2549, 1965, 2491, + 2540, 1979, 2484, + 2529, 1997, 2474, + 2514, 2019, 2461, + 2492, 2048, 2443, + 2461, 2083, 2417, + 2417, 2126, 2380, + 2350, 2179, 2326, + 2240, 2240, 2240, + 2036, 2312, 2094, + 1384, 2392, 1771, + 0, 2482, 0, + 0, 2579, 0, + 0, 2683, 0, + 0, 2793, 0, + 0, 2908, 0, + 0, 3027, 0, + 0, 3149, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3656, 0, + 2720, 1975, 2604, + 2719, 1975, 2604, + 2719, 1976, 2603, + 2718, 1978, 2603, + 2718, 1979, 2602, + 2717, 1982, 2601, + 2715, 1985, 2600, + 2713, 1989, 2598, + 2711, 1994, 2596, + 2708, 2002, 2593, + 2704, 2011, 2588, + 2698, 2023, 2583, + 2690, 2039, 2575, + 2679, 2060, 2564, + 2664, 2086, 2550, + 2643, 2119, 2529, + 2614, 2159, 2501, + 2571, 2208, 2460, + 2508, 2266, 2398, + 2405, 2333, 2299, + 2218, 2411, 2122, + 1698, 2497, 1658, + 0, 2591, 0, + 0, 2693, 0, + 0, 2801, 0, + 0, 2914, 0, + 0, 3032, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3529, 0, + 0, 3657, 0, + 2864, 2033, 2705, + 2863, 2034, 2705, + 2863, 2035, 2704, + 2863, 2036, 2704, + 2862, 2038, 2703, + 2861, 2040, 2703, + 2860, 2042, 2702, + 2859, 2046, 2700, + 2857, 2051, 2698, + 2855, 2057, 2696, + 2852, 2066, 2692, + 2848, 2076, 2688, + 2842, 2091, 2682, + 2834, 2109, 2673, + 2824, 2133, 2662, + 2809, 2162, 2646, + 2789, 2199, 2624, + 2761, 2244, 2593, + 2720, 2298, 2548, + 2658, 2361, 2479, + 2560, 2434, 2368, + 2385, 2516, 2156, + 1930, 2607, 1441, + 0, 2706, 0, + 0, 2811, 0, + 0, 2922, 0, + 0, 3038, 0, + 0, 3157, 0, + 0, 3279, 0, + 0, 3404, 0, + 0, 3531, 0, + 0, 3658, 0, + 3004, 2102, 2812, + 3004, 2102, 2812, + 3004, 2103, 2812, + 3004, 2104, 2811, + 3003, 2105, 2811, + 3003, 2107, 2810, + 3002, 2110, 2810, + 3001, 2113, 2808, + 3000, 2117, 2807, + 2998, 2122, 2805, + 2996, 2130, 2802, + 2993, 2139, 2799, + 2989, 2152, 2794, + 2983, 2168, 2787, + 2976, 2188, 2779, + 2965, 2215, 2766, + 2951, 2248, 2750, + 2931, 2288, 2726, + 2903, 2337, 2693, + 2863, 2396, 2644, + 2804, 2464, 2570, + 2709, 2541, 2446, + 2541, 2628, 2199, + 2125, 2722, 664, + 0, 2824, 0, + 0, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3143, 2180, 2925, + 3143, 2180, 2925, + 3143, 2181, 2924, + 3142, 2182, 2924, + 3142, 2183, 2924, + 3142, 2184, 2923, + 3141, 2186, 2923, + 3141, 2189, 2922, + 3140, 2192, 2921, + 3138, 2197, 2919, + 3137, 2203, 2917, + 3134, 2211, 2914, + 3131, 2222, 2911, + 3127, 2236, 2906, + 3122, 2254, 2899, + 3114, 2276, 2890, + 3104, 2305, 2877, + 3090, 2341, 2859, + 3071, 2385, 2835, + 3043, 2438, 2799, + 3004, 2500, 2748, + 2945, 2572, 2668, + 2853, 2653, 2532, + 2690, 2743, 2250, + 2299, 2841, 0, + 0, 2946, 0, + 0, 3056, 0, + 0, 3171, 0, + 0, 3290, 0, + 0, 3412, 0, + 0, 3537, 0, + 0, 3663, 0, + 3280, 2267, 3042, + 3280, 2267, 3042, + 3280, 2267, 3041, + 3279, 2268, 3041, + 3279, 2269, 3041, + 3279, 2270, 3041, + 3278, 2272, 3040, + 3278, 2274, 3039, + 3277, 2277, 3039, + 3276, 2281, 3037, + 3275, 2286, 3036, + 3273, 2293, 3034, + 3271, 2302, 3031, + 3268, 2313, 3027, + 3264, 2328, 3022, + 3259, 2348, 3015, + 3251, 2373, 3005, + 3241, 2404, 2992, + 3227, 2442, 2974, + 3208, 2489, 2948, + 3181, 2545, 2911, + 3142, 2611, 2857, + 3085, 2686, 2773, + 2994, 2770, 2628, + 2835, 2863, 2310, + 2460, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 3415, 2362, 3162, + 3415, 2362, 3162, + 3415, 2362, 3162, + 3415, 2363, 3162, + 3415, 2364, 3162, + 3415, 2365, 3161, + 3414, 2366, 3161, + 3414, 2368, 3160, + 3414, 2370, 3160, + 3413, 2373, 3159, + 3412, 2377, 3158, + 3411, 2383, 3156, + 3409, 2390, 3154, + 3407, 2400, 3151, + 3404, 2412, 3147, + 3400, 2429, 3142, + 3394, 2449, 3134, + 3387, 2476, 3124, + 3377, 2509, 3111, + 3363, 2550, 3092, + 3344, 2599, 3066, + 3318, 2658, 3028, + 3279, 2726, 2971, + 3222, 2804, 2883, + 3132, 2891, 2730, + 2976, 2985, 2380, + 2613, 3088, 0, + 0, 3196, 0, + 0, 3309, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3550, 2464, 3285, + 3550, 2464, 3285, + 3550, 2464, 3285, + 3550, 2465, 3285, + 3550, 2465, 3285, + 3550, 2466, 3285, + 3549, 2467, 3284, + 3549, 2469, 3284, + 3549, 2471, 3284, + 3548, 2473, 3283, + 3548, 2477, 3282, + 3547, 2481, 3281, + 3545, 2487, 3279, + 3544, 2495, 3277, + 3542, 2505, 3274, + 3539, 2518, 3270, + 3535, 2535, 3264, + 3529, 2557, 3257, + 3522, 2585, 3247, + 3512, 2620, 3233, + 3498, 2663, 3214, + 3479, 2714, 3187, + 3453, 2775, 3148, + 3415, 2845, 3090, + 3358, 2925, 2999, + 3269, 3014, 2838, + 3115, 3110, 2460, + 2760, 3214, 0, + 0, 3323, 0, + 0, 3438, 0, + 0, 3556, 0, + 0, 3678, 0, + 3684, 2572, 3411, + 3684, 2572, 3411, + 3684, 2573, 3411, + 3684, 2573, 3410, + 3684, 2574, 3410, + 3684, 2574, 3410, + 3684, 2575, 3410, + 3683, 2576, 3410, + 3683, 2578, 3409, + 3683, 2580, 3409, + 3682, 2582, 3408, + 3682, 2586, 3407, + 3681, 2591, 3406, + 3679, 2597, 3404, + 3678, 2605, 3402, + 3676, 2616, 3399, + 3673, 2630, 3395, + 3669, 2647, 3389, + 3663, 2670, 3382, + 3656, 2699, 3371, + 3646, 2736, 3357, + 3633, 2780, 3338, + 3614, 2833, 3310, + 3587, 2895, 3270, + 3549, 2967, 3211, + 3493, 3049, 3118, + 3405, 3139, 2952, + 3252, 3237, 2548, + 2902, 3342, 0, + 0, 3452, 0, + 0, 3567, 0, + 0, 3686, 0, + 3818, 2686, 3538, + 3818, 2686, 3538, + 3818, 2686, 3538, + 3818, 2686, 3537, + 3817, 2687, 3537, + 3817, 2687, 3537, + 3817, 2688, 3537, + 3817, 2689, 3537, + 3817, 2690, 3537, + 3817, 2692, 3536, + 3816, 2694, 3536, + 3816, 2696, 3535, + 3815, 2700, 3534, + 3814, 2705, 3533, + 3813, 2711, 3531, + 3811, 2720, 3529, + 3809, 2731, 3526, + 3806, 2745, 3522, + 3802, 2764, 3516, + 3797, 2788, 3508, + 3790, 2818, 3498, + 3780, 2855, 3484, + 3766, 2900, 3464, + 3748, 2955, 3436, + 3721, 3018, 3395, + 3683, 3092, 3335, + 3627, 3174, 3240, + 3540, 3266, 3070, + 3387, 3365, 2644, + 3042, 3470, 0, + 0, 3582, 0, + 0, 3697, 0, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2805, 3666, + 3951, 2805, 3665, + 3950, 2806, 3665, + 3950, 2807, 3665, + 3950, 2808, 3665, + 3950, 2810, 3664, + 3949, 2812, 3664, + 3949, 2815, 3663, + 3948, 2818, 3662, + 3947, 2823, 3661, + 3946, 2830, 3659, + 3944, 2839, 3657, + 3942, 2850, 3654, + 3939, 2865, 3650, + 3935, 2884, 3644, + 3930, 2909, 3636, + 3923, 2939, 3626, + 3913, 2977, 3611, + 3900, 3024, 3591, + 3881, 3079, 3563, + 3855, 3144, 3522, + 3817, 3218, 3461, + 3761, 3302, 3364, + 3674, 3394, 3191, + 3522, 3494, 2748, + 3180, 3600, 0, + 0, 3712, 0, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2926, 3795, + 4083, 2926, 3795, + 4083, 2926, 3795, + 4083, 2927, 3794, + 4083, 2928, 3794, + 4083, 2929, 3794, + 4083, 2931, 3794, + 4082, 2933, 3793, + 4082, 2936, 3792, + 4081, 2940, 3791, + 4080, 2945, 3790, + 4079, 2952, 3788, + 4077, 2961, 3786, + 4075, 2972, 3783, + 4072, 2988, 3779, + 4068, 3007, 3773, + 4063, 3032, 3765, + 4056, 3063, 3755, + 4046, 3102, 3740, + 4033, 3149, 3720, + 4014, 3205, 3691, + 3988, 3271, 3650, + 3950, 3346, 3589, + 3894, 3430, 3491, + 3807, 3523, 3314, + 3656, 3623, 2857, + 3317, 3730, 0, + 4095, 3048, 3925, + 4095, 3048, 3925, + 4095, 3048, 3925, + 4095, 3049, 3925, + 4095, 3049, 3925, + 4095, 3049, 3925, + 4095, 3049, 3925, + 4095, 3050, 3925, + 4095, 3050, 3924, + 4095, 3051, 3924, + 4095, 3052, 3924, + 4095, 3053, 3924, + 4095, 3055, 3923, + 4095, 3057, 3923, + 4095, 3060, 3922, + 4095, 3064, 3921, + 4095, 3069, 3920, + 4095, 3076, 3918, + 4095, 3085, 3916, + 4095, 3097, 3913, + 4095, 3112, 3908, + 4095, 3132, 3903, + 4095, 3157, 3895, + 4095, 3189, 3884, + 4095, 3228, 3870, + 4095, 3276, 3849, + 4095, 3333, 3821, + 4095, 3399, 3779, + 4083, 3475, 3717, + 4027, 3560, 3619, + 3940, 3653, 3440, + 3790, 3754, 2972, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3175, 4055, + 4095, 3175, 4055, + 4095, 3175, 4055, + 4095, 3176, 4055, + 4095, 3177, 4055, + 4095, 3178, 4055, + 4095, 3179, 4054, + 4095, 3181, 4054, + 4095, 3183, 4053, + 4095, 3186, 4053, + 4095, 3190, 4052, + 4095, 3195, 4050, + 4095, 3202, 4049, + 4095, 3211, 4046, + 4095, 3223, 4043, + 4095, 3239, 4039, + 4095, 3259, 4033, + 4095, 3285, 4025, + 4095, 3317, 4015, + 4095, 3356, 4000, + 4095, 3404, 3979, + 4095, 3461, 3951, + 4095, 3528, 3909, + 4095, 3604, 3847, + 4095, 3690, 3747, + 4073, 3783, 3567, + 0, 1867, 2134, + 0, 1868, 2133, + 0, 1869, 2132, + 0, 1871, 2130, + 0, 1873, 2128, + 0, 1876, 2126, + 0, 1880, 2122, + 0, 1885, 2117, + 0, 1892, 2110, + 0, 1901, 2101, + 0, 1913, 2088, + 0, 1928, 2071, + 0, 1948, 2047, + 0, 1973, 2012, + 0, 2004, 1961, + 0, 2043, 1882, + 0, 2090, 1749, + 0, 2146, 1473, + 0, 2212, 0, + 0, 2288, 0, + 0, 2372, 0, + 0, 2465, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 0, 1867, 2135, + 0, 1868, 2134, + 0, 1869, 2133, + 0, 1871, 2132, + 0, 1873, 2130, + 0, 1876, 2127, + 0, 1880, 2123, + 0, 1885, 2118, + 0, 1892, 2112, + 0, 1901, 2102, + 0, 1913, 2090, + 0, 1928, 2072, + 0, 1948, 2048, + 0, 1973, 2013, + 0, 2004, 1962, + 0, 2043, 1884, + 0, 2090, 1752, + 0, 2147, 1479, + 0, 2213, 0, + 0, 2288, 0, + 0, 2372, 0, + 0, 2465, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 0, 1868, 2137, + 0, 1869, 2136, + 0, 1870, 2135, + 0, 1872, 2133, + 0, 1874, 2131, + 0, 1877, 2129, + 0, 1881, 2125, + 0, 1886, 2120, + 0, 1893, 2113, + 0, 1902, 2104, + 0, 1913, 2092, + 0, 1929, 2074, + 0, 1948, 2050, + 0, 1973, 2016, + 0, 2004, 1965, + 0, 2043, 1887, + 0, 2091, 1756, + 0, 2147, 1486, + 0, 2213, 0, + 0, 2288, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1868, 2139, + 0, 1869, 2138, + 0, 1870, 2137, + 0, 1872, 2136, + 0, 1874, 2134, + 0, 1877, 2131, + 0, 1881, 2127, + 0, 1886, 2122, + 0, 1893, 2116, + 0, 1902, 2107, + 0, 1914, 2094, + 0, 1929, 2077, + 0, 1949, 2053, + 0, 1974, 2019, + 0, 2005, 1968, + 0, 2044, 1891, + 0, 2091, 1761, + 0, 2147, 1495, + 0, 2213, 0, + 0, 2288, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1869, 2142, + 0, 1870, 2141, + 0, 1871, 2140, + 0, 1873, 2139, + 0, 1875, 2137, + 0, 1878, 2134, + 0, 1882, 2130, + 0, 1887, 2125, + 0, 1894, 2119, + 0, 1903, 2110, + 0, 1915, 2097, + 0, 1930, 2080, + 0, 1949, 2056, + 0, 1974, 2022, + 0, 2005, 1973, + 0, 2044, 1896, + 0, 2091, 1768, + 0, 2148, 1508, + 0, 2213, 0, + 0, 2289, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1870, 2146, + 0, 1871, 2145, + 0, 1872, 2144, + 0, 1874, 2143, + 0, 1876, 2141, + 0, 1879, 2138, + 0, 1883, 2134, + 0, 1888, 2130, + 0, 1895, 2123, + 0, 1904, 2114, + 0, 1915, 2102, + 0, 1931, 2085, + 0, 1950, 2061, + 0, 1975, 2028, + 0, 2006, 1978, + 0, 2045, 1903, + 0, 2092, 1777, + 0, 2148, 1523, + 0, 2214, 0, + 0, 2289, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2567, 0, + 0, 2673, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1871, 2151, + 0, 1872, 2151, + 0, 1874, 2149, + 0, 1875, 2148, + 0, 1877, 2146, + 0, 1880, 2143, + 0, 1884, 2140, + 0, 1889, 2135, + 0, 1896, 2129, + 0, 1905, 2120, + 0, 1917, 2108, + 0, 1932, 2091, + 0, 1951, 2068, + 0, 1976, 2034, + 0, 2007, 1986, + 0, 2046, 1912, + 0, 2093, 1788, + 0, 2149, 1544, + 0, 2214, 145, + 0, 2290, 0, + 0, 2374, 0, + 0, 2467, 0, + 0, 2567, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3271, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1873, 2158, + 0, 1874, 2157, + 0, 1875, 2156, + 0, 1877, 2155, + 0, 1879, 2153, + 0, 1882, 2150, + 0, 1886, 2147, + 0, 1891, 2142, + 0, 1898, 2136, + 0, 1907, 2127, + 0, 1918, 2115, + 0, 1933, 2099, + 0, 1953, 2076, + 0, 1977, 2043, + 0, 2009, 1996, + 0, 2047, 1923, + 0, 2094, 1804, + 0, 2150, 1570, + 0, 2215, 518, + 0, 2290, 0, + 0, 2374, 0, + 0, 2467, 0, + 0, 2567, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3397, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1876, 2167, + 0, 1876, 2167, + 0, 1878, 2166, + 0, 1879, 2164, + 0, 1882, 2162, + 0, 1884, 2160, + 0, 1888, 2156, + 0, 1893, 2152, + 0, 1900, 2145, + 0, 1909, 2137, + 0, 1920, 2125, + 0, 1935, 2109, + 0, 1955, 2087, + 0, 1979, 2055, + 0, 2010, 2009, + 0, 2049, 1938, + 0, 2095, 1823, + 0, 2151, 1602, + 0, 2216, 772, + 0, 2291, 0, + 0, 2375, 0, + 0, 2468, 0, + 0, 2568, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2903, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1879, 2179, + 0, 1880, 2179, + 0, 1881, 2178, + 0, 1883, 2176, + 0, 1885, 2174, + 0, 1888, 2172, + 0, 1891, 2168, + 0, 1896, 2164, + 0, 1903, 2158, + 0, 1912, 2150, + 0, 1923, 2138, + 0, 1938, 2123, + 0, 1957, 2101, + 0, 1982, 2070, + 0, 2013, 2026, + 0, 2051, 1958, + 0, 2097, 1848, + 0, 2153, 1642, + 0, 2218, 978, + 0, 2293, 0, + 0, 2376, 0, + 0, 2469, 0, + 0, 2568, 0, + 0, 2675, 0, + 0, 2787, 0, + 0, 2903, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1883, 2195, + 0, 1884, 2194, + 0, 1885, 2193, + 0, 1887, 2192, + 0, 1889, 2190, + 0, 1892, 2188, + 0, 1895, 2184, + 0, 1900, 2180, + 0, 1907, 2174, + 0, 1916, 2166, + 0, 1927, 2155, + 0, 1942, 2140, + 0, 1961, 2119, + 0, 1985, 2090, + 0, 2016, 2047, + 0, 2054, 1983, + 0, 2100, 1880, + 0, 2155, 1691, + 0, 2220, 1158, + 0, 2294, 0, + 0, 2378, 0, + 0, 2470, 0, + 0, 2569, 0, + 0, 2676, 0, + 0, 2787, 0, + 0, 2904, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1889, 2215, + 0, 1889, 2214, + 0, 1891, 2213, + 0, 1892, 2212, + 0, 1894, 2210, + 0, 1897, 2208, + 0, 1901, 2205, + 0, 1906, 2200, + 0, 1912, 2195, + 0, 1921, 2187, + 0, 1932, 2177, + 0, 1947, 2163, + 0, 1966, 2143, + 0, 1990, 2115, + 0, 2020, 2074, + 0, 2058, 2014, + 0, 2103, 1919, + 0, 2158, 1748, + 0, 2223, 1323, + 0, 2296, 0, + 0, 2380, 0, + 0, 2471, 0, + 0, 2571, 0, + 0, 2677, 0, + 0, 2788, 0, + 0, 2904, 0, + 0, 3024, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 241, 1896, 2240, + 162, 1897, 2239, + 31, 1898, 2238, + 0, 1900, 2237, + 0, 1902, 2236, + 0, 1904, 2233, + 0, 1908, 2230, + 0, 1913, 2227, + 0, 1919, 2221, + 0, 1928, 2214, + 0, 1939, 2204, + 0, 1953, 2191, + 0, 1972, 2172, + 0, 1996, 2146, + 0, 2026, 2108, + 0, 2063, 2053, + 0, 2108, 1966, + 0, 2162, 1816, + 0, 2226, 1478, + 0, 2299, 0, + 0, 2382, 0, + 0, 2473, 0, + 0, 2572, 0, + 0, 2678, 0, + 0, 2789, 0, + 0, 2905, 0, + 0, 3024, 0, + 0, 3147, 0, + 0, 3272, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 1385, 1906, 2272, + 1379, 1906, 2271, + 1371, 1908, 2270, + 1360, 1909, 2269, + 1345, 1911, 2268, + 1325, 1914, 2266, + 1296, 1917, 2263, + 1253, 1922, 2259, + 1190, 1929, 2254, + 1089, 1937, 2248, + 903, 1948, 2239, + 397, 1962, 2226, + 0, 1980, 2209, + 0, 2003, 2185, + 0, 2033, 2150, + 0, 2069, 2100, + 0, 2114, 2023, + 0, 2168, 1893, + 0, 2231, 1627, + 0, 2303, 0, + 0, 2385, 0, + 0, 2476, 0, + 0, 2574, 0, + 0, 2680, 0, + 0, 2790, 0, + 0, 2906, 0, + 0, 3025, 0, + 0, 3148, 0, + 0, 3272, 0, + 0, 3399, 0, + 0, 3526, 0, + 0, 3655, 0, + 1749, 1918, 2311, + 1747, 1919, 2310, + 1743, 1920, 2310, + 1738, 1922, 2309, + 1732, 1924, 2307, + 1723, 1926, 2305, + 1711, 1930, 2303, + 1695, 1934, 2300, + 1672, 1941, 2295, + 1639, 1949, 2289, + 1592, 1959, 2281, + 1519, 1973, 2269, + 1399, 1991, 2254, + 1164, 2014, 2232, + 83, 2042, 2201, + 0, 2078, 2156, + 0, 2122, 2088, + 0, 2175, 1978, + 0, 2237, 1771, + 0, 2309, 1096, + 0, 2390, 0, + 0, 2480, 0, + 0, 2577, 0, + 0, 2682, 0, + 0, 2792, 0, + 0, 2907, 0, + 0, 3026, 0, + 0, 3148, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3656, 0, + 2000, 1935, 2359, + 1999, 1935, 2358, + 1997, 1936, 2358, + 1994, 1938, 2357, + 1990, 1940, 2355, + 1985, 1942, 2354, + 1979, 1946, 2351, + 1970, 1950, 2348, + 1957, 1956, 2344, + 1940, 1964, 2339, + 1916, 1974, 2331, + 1882, 1988, 2321, + 1832, 2005, 2307, + 1755, 2027, 2288, + 1626, 2055, 2261, + 1364, 2090, 2222, + 0, 2133, 2164, + 0, 2184, 2073, + 0, 2245, 1912, + 0, 2316, 1531, + 0, 2396, 0, + 0, 2484, 0, + 0, 2581, 0, + 0, 2685, 0, + 0, 2795, 0, + 0, 2909, 0, + 0, 3028, 0, + 0, 3149, 0, + 0, 3274, 0, + 0, 3400, 0, + 0, 3527, 0, + 0, 3656, 0, + 2205, 1955, 2416, + 2204, 1956, 2415, + 2202, 1957, 2415, + 2201, 1959, 2414, + 2198, 1960, 2413, + 2195, 1963, 2411, + 2191, 1966, 2409, + 2185, 1970, 2407, + 2178, 1976, 2403, + 2167, 1984, 2398, + 2153, 1993, 2392, + 2133, 2006, 2383, + 2105, 2023, 2371, + 2064, 2044, 2354, + 2003, 2071, 2331, + 1907, 2105, 2297, + 1734, 2146, 2249, + 1297, 2196, 2174, + 0, 2256, 2050, + 0, 2325, 1804, + 0, 2403, 318, + 0, 2491, 0, + 0, 2586, 0, + 0, 2689, 0, + 0, 2798, 0, + 0, 2912, 0, + 0, 3030, 0, + 0, 3151, 0, + 0, 3275, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3656, 0, + 2384, 1982, 2482, + 2383, 1983, 2482, + 2382, 1984, 2481, + 2381, 1985, 2480, + 2380, 1987, 2479, + 2378, 1989, 2478, + 2375, 1992, 2476, + 2371, 1996, 2474, + 2366, 2002, 2471, + 2359, 2009, 2467, + 2350, 2018, 2461, + 2337, 2030, 2454, + 2319, 2046, 2443, + 2294, 2066, 2429, + 2259, 2092, 2410, + 2206, 2124, 2382, + 2125, 2164, 2342, + 1987, 2212, 2282, + 1696, 2270, 2187, + 0, 2337, 2019, + 0, 2414, 1603, + 0, 2499, 0, + 0, 2593, 0, + 0, 2694, 0, + 0, 2802, 0, + 0, 2915, 0, + 0, 3032, 0, + 0, 3153, 0, + 0, 3276, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 2549, 2015, 2558, + 2548, 2016, 2558, + 2547, 2017, 2557, + 2547, 2018, 2557, + 2546, 2020, 2556, + 2544, 2022, 2555, + 2542, 2025, 2553, + 2540, 2029, 2551, + 2536, 2034, 2549, + 2531, 2040, 2545, + 2525, 2049, 2541, + 2516, 2060, 2534, + 2504, 2075, 2526, + 2488, 2094, 2514, + 2465, 2118, 2497, + 2432, 2149, 2475, + 2385, 2187, 2442, + 2312, 2233, 2395, + 2192, 2288, 2323, + 1958, 2352, 2204, + 895, 2427, 1973, + 0, 2510, 982, + 0, 2602, 0, + 0, 2702, 0, + 0, 2808, 0, + 0, 2919, 0, + 0, 3036, 0, + 0, 3156, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 2703, 2056, 2643, + 2703, 2057, 2643, + 2703, 2058, 2642, + 2702, 2059, 2642, + 2701, 2060, 2641, + 2700, 2062, 2640, + 2699, 2065, 2639, + 2697, 2068, 2637, + 2695, 2073, 2635, + 2691, 2079, 2632, + 2687, 2087, 2629, + 2681, 2097, 2623, + 2673, 2111, 2616, + 2661, 2129, 2607, + 2646, 2151, 2593, + 2624, 2180, 2575, + 2593, 2215, 2549, + 2549, 2259, 2512, + 2482, 2311, 2458, + 2373, 2373, 2373, + 2168, 2444, 2226, + 1516, 2524, 1903, + 0, 2614, 0, + 0, 2711, 0, + 0, 2815, 0, + 0, 2925, 0, + 0, 3040, 0, + 0, 3159, 0, + 0, 3281, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 2852, 2106, 2736, + 2852, 2107, 2736, + 2851, 2107, 2736, + 2851, 2108, 2735, + 2850, 2110, 2735, + 2850, 2111, 2734, + 2849, 2114, 2733, + 2847, 2117, 2732, + 2846, 2121, 2730, + 2843, 2126, 2728, + 2840, 2134, 2725, + 2836, 2143, 2720, + 2830, 2155, 2715, + 2822, 2171, 2707, + 2811, 2192, 2696, + 2796, 2218, 2682, + 2775, 2251, 2662, + 2746, 2291, 2633, + 2703, 2340, 2592, + 2640, 2398, 2530, + 2537, 2466, 2431, + 2350, 2543, 2254, + 1830, 2629, 1790, + 0, 2723, 0, + 0, 2825, 0, + 0, 2933, 0, + 0, 3046, 0, + 0, 3164, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3661, 0, + 2996, 2165, 2837, + 2996, 2165, 2837, + 2995, 2166, 2837, + 2995, 2167, 2836, + 2995, 2168, 2836, + 2994, 2170, 2835, + 2994, 2172, 2835, + 2993, 2174, 2834, + 2991, 2178, 2832, + 2990, 2183, 2830, + 2987, 2189, 2828, + 2984, 2198, 2825, + 2980, 2209, 2820, + 2974, 2223, 2814, + 2966, 2241, 2805, + 2956, 2265, 2794, + 2941, 2294, 2778, + 2921, 2331, 2756, + 2893, 2376, 2725, + 2852, 2430, 2680, + 2790, 2493, 2611, + 2693, 2566, 2500, + 2517, 2648, 2288, + 2062, 2739, 1573, + 0, 2838, 0, + 0, 2943, 0, + 0, 3054, 0, + 0, 3170, 0, + 0, 3289, 0, + 0, 3412, 0, + 0, 3536, 0, + 0, 3663, 0, + 3137, 2233, 2944, + 3136, 2234, 2944, + 3136, 2234, 2944, + 3136, 2235, 2944, + 3136, 2236, 2944, + 3135, 2238, 2943, + 3135, 2239, 2942, + 3134, 2242, 2942, + 3133, 2245, 2941, + 3132, 2249, 2939, + 3130, 2254, 2937, + 3128, 2262, 2934, + 3125, 2271, 2931, + 3121, 2284, 2926, + 3115, 2300, 2920, + 3108, 2320, 2911, + 3097, 2347, 2899, + 3083, 2380, 2882, + 3063, 2420, 2858, + 3036, 2469, 2825, + 2996, 2528, 2776, + 2936, 2596, 2702, + 2841, 2673, 2578, + 2673, 2760, 2331, + 2257, 2854, 796, + 0, 2956, 0, + 0, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3275, 2311, 3057, + 3275, 2312, 3057, + 3275, 2312, 3057, + 3275, 2313, 3057, + 3275, 2314, 3056, + 3274, 2315, 3056, + 3274, 2316, 3055, + 3273, 2318, 3055, + 3273, 2321, 3054, + 3272, 2324, 3053, + 3270, 2329, 3051, + 3269, 2335, 3049, + 3267, 2343, 3046, + 3263, 2354, 3043, + 3259, 2368, 3038, + 3254, 2386, 3031, + 3246, 2409, 3022, + 3236, 2437, 3009, + 3222, 2473, 2991, + 3203, 2517, 2967, + 3175, 2570, 2931, + 3136, 2633, 2880, + 3078, 2704, 2800, + 2985, 2786, 2665, + 2822, 2875, 2382, + 2431, 2973, 0, + 0, 3078, 0, + 0, 3188, 0, + 0, 3303, 0, + 0, 3422, 0, + 0, 3545, 0, + 0, 3669, 0, + 3412, 2398, 3174, + 3412, 2399, 3174, + 3412, 2399, 3174, + 3412, 2400, 3174, + 3411, 2400, 3173, + 3411, 2401, 3173, + 3411, 2402, 3173, + 3411, 2404, 3172, + 3410, 2406, 3172, + 3409, 2409, 3171, + 3408, 2413, 3170, + 3407, 2418, 3168, + 3406, 2425, 3166, + 3403, 2434, 3163, + 3400, 2445, 3159, + 3396, 2461, 3154, + 3391, 2480, 3147, + 3383, 2505, 3137, + 3373, 2536, 3124, + 3360, 2574, 3106, + 3340, 2621, 3080, + 3313, 2677, 3043, + 3275, 2743, 2989, + 3217, 2818, 2905, + 3126, 2902, 2760, + 2967, 2995, 2442, + 2592, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 3547, 2493, 3294, + 3547, 2494, 3294, + 3547, 2494, 3294, + 3547, 2494, 3294, + 3547, 2495, 3294, + 3547, 2496, 3294, + 3547, 2497, 3293, + 3547, 2498, 3293, + 3546, 2500, 3293, + 3546, 2502, 3292, + 3545, 2505, 3291, + 3544, 2510, 3290, + 3543, 2515, 3288, + 3541, 2522, 3286, + 3539, 2532, 3283, + 3536, 2545, 3279, + 3532, 2561, 3274, + 3527, 2582, 3266, + 3519, 2608, 3257, + 3509, 2641, 3243, + 3496, 2682, 3224, + 3476, 2731, 3198, + 3450, 2790, 3160, + 3411, 2858, 3103, + 3354, 2936, 3015, + 3265, 3023, 2862, + 3108, 3118, 2512, + 2745, 3220, 0, + 0, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3682, 2596, 3418, + 3682, 2596, 3417, + 3682, 2596, 3417, + 3682, 2597, 3417, + 3682, 2597, 3417, + 3682, 2598, 3417, + 3682, 2598, 3417, + 3681, 2599, 3417, + 3681, 2601, 3416, + 3681, 2603, 3416, + 3680, 2605, 3415, + 3680, 2609, 3414, + 3679, 2613, 3413, + 3677, 2619, 3411, + 3676, 2627, 3409, + 3674, 2637, 3406, + 3671, 2650, 3402, + 3667, 2667, 3396, + 3661, 2689, 3389, + 3654, 2717, 3379, + 3644, 2752, 3365, + 3630, 2795, 3346, + 3612, 2846, 3319, + 3585, 2907, 3280, + 3547, 2977, 3222, + 3490, 3057, 3131, + 3401, 3146, 2970, + 3247, 3242, 2592, + 2892, 3346, 0, + 0, 3456, 0, + 0, 3570, 0, + 0, 3689, 0, + 3816, 2704, 3543, + 3816, 2704, 3543, + 3816, 2705, 3543, + 3816, 2705, 3543, + 3816, 2705, 3543, + 3816, 2706, 3542, + 3816, 2706, 3542, + 3816, 2707, 3542, + 3815, 2708, 3542, + 3815, 2710, 3541, + 3815, 2712, 3541, + 3814, 2714, 3540, + 3814, 2718, 3539, + 3813, 2723, 3538, + 3811, 2729, 3536, + 3810, 2737, 3534, + 3808, 2748, 3531, + 3805, 2762, 3527, + 3801, 2780, 3521, + 3795, 2803, 3514, + 3788, 2832, 3504, + 3778, 2868, 3489, + 3765, 2912, 3470, + 3746, 2965, 3442, + 3719, 3027, 3403, + 3681, 3099, 3343, + 3625, 3181, 3250, + 3537, 3271, 3084, + 3384, 3369, 2680, + 3034, 3474, 0, + 0, 3584, 0, + 0, 3699, 0, + 3950, 2818, 3670, + 3950, 2818, 3670, + 3950, 2818, 3670, + 3950, 2818, 3670, + 3950, 2819, 3670, + 3950, 2819, 3669, + 3949, 2819, 3669, + 3949, 2820, 3669, + 3949, 2821, 3669, + 3949, 2822, 3669, + 3949, 2824, 3668, + 3948, 2826, 3668, + 3948, 2829, 3667, + 3947, 2832, 3666, + 3946, 2837, 3665, + 3945, 2844, 3663, + 3943, 2852, 3661, + 3941, 2863, 3658, + 3938, 2878, 3654, + 3934, 2896, 3648, + 3929, 2920, 3640, + 3922, 2950, 3630, + 3912, 2987, 3616, + 3898, 3032, 3596, + 3880, 3087, 3568, + 3853, 3151, 3528, + 3815, 3224, 3467, + 3759, 3307, 3372, + 3672, 3398, 3202, + 3520, 3497, 2776, + 3174, 3602, 0, + 0, 3714, 0, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2937, 3798, + 4083, 2937, 3798, + 4082, 2938, 3797, + 4082, 2939, 3797, + 4082, 2940, 3797, + 4082, 2942, 3796, + 4081, 2944, 3796, + 4081, 2947, 3795, + 4080, 2951, 3794, + 4079, 2956, 3793, + 4078, 2962, 3791, + 4077, 2971, 3789, + 4074, 2982, 3786, + 4071, 2997, 3782, + 4068, 3016, 3776, + 4062, 3041, 3768, + 4055, 3071, 3758, + 4045, 3109, 3743, + 4032, 3156, 3723, + 4013, 3211, 3695, + 3987, 3276, 3654, + 3949, 3350, 3593, + 3893, 3434, 3496, + 3806, 3526, 3323, + 3654, 3626, 2880, + 3312, 3732, 0, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3058, 3927, + 4095, 3058, 3927, + 4095, 3059, 3927, + 4095, 3059, 3927, + 4095, 3060, 3926, + 4095, 3061, 3926, + 4095, 3063, 3926, + 4095, 3065, 3925, + 4095, 3068, 3924, + 4095, 3072, 3923, + 4095, 3077, 3922, + 4095, 3084, 3920, + 4095, 3093, 3918, + 4095, 3105, 3915, + 4095, 3120, 3911, + 4095, 3139, 3905, + 4095, 3164, 3897, + 4095, 3195, 3887, + 4095, 3234, 3872, + 4095, 3281, 3852, + 4095, 3337, 3823, + 4095, 3403, 3782, + 4082, 3478, 3721, + 4026, 3562, 3623, + 3939, 3655, 3446, + 3788, 3755, 2989, + 4095, 3180, 4057, + 4095, 3180, 4057, + 4095, 3180, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3182, 4057, + 4095, 3182, 4057, + 4095, 3183, 4056, + 4095, 3184, 4056, + 4095, 3185, 4056, + 4095, 3187, 4055, + 4095, 3189, 4055, + 4095, 3192, 4054, + 4095, 3196, 4053, + 4095, 3201, 4052, + 4095, 3208, 4050, + 4095, 3217, 4048, + 4095, 3229, 4045, + 4095, 3245, 4040, + 4095, 3264, 4035, + 4095, 3290, 4027, + 4095, 3321, 4016, + 4095, 3360, 4002, + 4095, 3408, 3981, + 4095, 3465, 3953, + 4095, 3531, 3911, + 4095, 3607, 3849, + 4095, 3692, 3751, + 4073, 3785, 3572, + 0, 1998, 2266, + 0, 1999, 2265, + 0, 2000, 2264, + 0, 2001, 2263, + 0, 2003, 2262, + 0, 2005, 2260, + 0, 2008, 2257, + 0, 2012, 2253, + 0, 2017, 2248, + 0, 2024, 2241, + 0, 2033, 2232, + 0, 2045, 2219, + 0, 2060, 2202, + 0, 2079, 2177, + 0, 2104, 2143, + 0, 2136, 2091, + 0, 2175, 2012, + 0, 2222, 1879, + 0, 2278, 1601, + 0, 2344, 0, + 0, 2420, 0, + 0, 2504, 0, + 0, 2597, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 1998, 2267, + 0, 1999, 2266, + 0, 2000, 2265, + 0, 2001, 2264, + 0, 2003, 2263, + 0, 2005, 2260, + 0, 2008, 2258, + 0, 2012, 2254, + 0, 2017, 2249, + 0, 2024, 2242, + 0, 2033, 2233, + 0, 2045, 2220, + 0, 2060, 2203, + 0, 2080, 2179, + 0, 2105, 2144, + 0, 2136, 2093, + 0, 2175, 2014, + 0, 2222, 1881, + 0, 2279, 1606, + 0, 2344, 0, + 0, 2420, 0, + 0, 2504, 0, + 0, 2597, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 1999, 2268, + 0, 1999, 2267, + 0, 2000, 2266, + 0, 2002, 2265, + 0, 2003, 2264, + 0, 2005, 2262, + 0, 2008, 2259, + 0, 2012, 2255, + 0, 2017, 2250, + 0, 2024, 2244, + 0, 2033, 2234, + 0, 2045, 2222, + 0, 2060, 2204, + 0, 2080, 2180, + 0, 2105, 2145, + 0, 2136, 2095, + 0, 2175, 2016, + 0, 2222, 1884, + 0, 2279, 1611, + 0, 2345, 0, + 0, 2420, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 1999, 2270, + 0, 2000, 2269, + 0, 2001, 2268, + 0, 2002, 2267, + 0, 2004, 2265, + 0, 2006, 2263, + 0, 2009, 2261, + 0, 2013, 2257, + 0, 2018, 2252, + 0, 2025, 2245, + 0, 2034, 2236, + 0, 2045, 2224, + 0, 2061, 2206, + 0, 2080, 2182, + 0, 2105, 2148, + 0, 2137, 2097, + 0, 2175, 2019, + 0, 2223, 1888, + 0, 2279, 1618, + 0, 2345, 0, + 0, 2420, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 2000, 2272, + 0, 2000, 2271, + 0, 2001, 2270, + 0, 2003, 2269, + 0, 2004, 2268, + 0, 2006, 2266, + 0, 2009, 2263, + 0, 2013, 2259, + 0, 2018, 2254, + 0, 2025, 2248, + 0, 2034, 2239, + 0, 2046, 2226, + 0, 2061, 2209, + 0, 2081, 2185, + 0, 2106, 2151, + 0, 2137, 2100, + 0, 2176, 2023, + 0, 2223, 1893, + 0, 2279, 1627, + 0, 2345, 0, + 0, 2420, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 2000, 2275, + 0, 2001, 2274, + 0, 2002, 2273, + 0, 2003, 2272, + 0, 2005, 2271, + 0, 2007, 2269, + 0, 2010, 2266, + 0, 2014, 2262, + 0, 2019, 2258, + 0, 2026, 2251, + 0, 2035, 2242, + 0, 2047, 2230, + 0, 2062, 2212, + 0, 2081, 2189, + 0, 2106, 2155, + 0, 2138, 2105, + 0, 2176, 2028, + 0, 2223, 1900, + 0, 2280, 1640, + 0, 2345, 0, + 0, 2421, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 0, 2001, 2279, + 0, 2002, 2278, + 0, 2003, 2277, + 0, 2004, 2276, + 0, 2006, 2275, + 0, 2008, 2273, + 0, 2011, 2270, + 0, 2015, 2267, + 0, 2020, 2262, + 0, 2027, 2255, + 0, 2036, 2246, + 0, 2048, 2234, + 0, 2063, 2217, + 0, 2082, 2193, + 0, 2107, 2160, + 0, 2138, 2110, + 0, 2177, 2035, + 0, 2224, 1909, + 0, 2280, 1655, + 0, 2346, 0, + 0, 2421, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2699, 0, + 0, 2805, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 0, 2003, 2284, + 0, 2003, 2283, + 0, 2004, 2283, + 0, 2006, 2282, + 0, 2007, 2280, + 0, 2009, 2278, + 0, 2012, 2275, + 0, 2016, 2272, + 0, 2021, 2267, + 0, 2028, 2261, + 0, 2037, 2252, + 0, 2049, 2240, + 0, 2064, 2223, + 0, 2083, 2200, + 0, 2108, 2166, + 0, 2139, 2118, + 0, 2178, 2044, + 0, 2225, 1921, + 0, 2281, 1676, + 0, 2347, 277, + 0, 2422, 0, + 0, 2506, 0, + 0, 2599, 0, + 0, 2699, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 0, 2005, 2291, + 0, 2005, 2290, + 0, 2006, 2290, + 0, 2007, 2288, + 0, 2009, 2287, + 0, 2011, 2285, + 0, 2014, 2283, + 0, 2018, 2279, + 0, 2023, 2274, + 0, 2030, 2268, + 0, 2039, 2259, + 0, 2050, 2247, + 0, 2065, 2231, + 0, 2085, 2208, + 0, 2110, 2175, + 0, 2141, 2128, + 0, 2179, 2055, + 0, 2226, 1936, + 0, 2282, 1702, + 0, 2347, 650, + 0, 2422, 0, + 0, 2507, 0, + 0, 2599, 0, + 0, 2699, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2007, 2300, + 0, 2008, 2299, + 0, 2009, 2299, + 0, 2010, 2298, + 0, 2011, 2296, + 0, 2014, 2294, + 0, 2017, 2292, + 0, 2020, 2288, + 0, 2025, 2284, + 0, 2032, 2277, + 0, 2041, 2269, + 0, 2053, 2257, + 0, 2068, 2241, + 0, 2087, 2219, + 0, 2111, 2187, + 0, 2142, 2141, + 0, 2181, 2071, + 0, 2227, 1955, + 0, 2283, 1734, + 0, 2349, 904, + 0, 2423, 0, + 0, 2507, 0, + 0, 2600, 0, + 0, 2700, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2010, 2312, + 0, 2011, 2311, + 0, 2012, 2311, + 0, 2013, 2310, + 0, 2015, 2308, + 0, 2017, 2306, + 0, 2020, 2304, + 0, 2023, 2301, + 0, 2029, 2296, + 0, 2035, 2290, + 0, 2044, 2282, + 0, 2055, 2270, + 0, 2070, 2255, + 0, 2090, 2233, + 0, 2114, 2202, + 0, 2145, 2158, + 0, 2183, 2090, + 0, 2229, 1980, + 0, 2285, 1774, + 0, 2350, 1110, + 0, 2425, 0, + 0, 2508, 0, + 0, 2601, 0, + 0, 2700, 0, + 0, 2807, 0, + 0, 2919, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2014, 2327, + 0, 2015, 2327, + 0, 2016, 2326, + 0, 2017, 2325, + 0, 2019, 2324, + 0, 2021, 2322, + 0, 2024, 2320, + 0, 2028, 2316, + 0, 2033, 2312, + 0, 2039, 2306, + 0, 2048, 2298, + 0, 2059, 2287, + 0, 2074, 2272, + 0, 2093, 2251, + 0, 2117, 2222, + 0, 2148, 2179, + 0, 2186, 2115, + 0, 2232, 2012, + 0, 2287, 1823, + 0, 2352, 1290, + 0, 2426, 0, + 0, 2510, 0, + 0, 2602, 0, + 0, 2701, 0, + 0, 2808, 0, + 0, 2919, 0, + 0, 3036, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2020, 2347, + 0, 2021, 2347, + 0, 2022, 2346, + 0, 2023, 2345, + 0, 2024, 2344, + 0, 2026, 2342, + 0, 2029, 2340, + 0, 2033, 2337, + 0, 2038, 2333, + 0, 2044, 2327, + 0, 2053, 2319, + 0, 2064, 2309, + 0, 2079, 2295, + 0, 2098, 2275, + 0, 2122, 2247, + 0, 2152, 2206, + 0, 2190, 2146, + 0, 2235, 2051, + 0, 2290, 1881, + 0, 2355, 1455, + 0, 2429, 0, + 0, 2512, 0, + 0, 2603, 0, + 0, 2703, 0, + 0, 2809, 0, + 0, 2920, 0, + 0, 3036, 0, + 0, 3156, 0, + 0, 3279, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 423, 2027, 2373, + 373, 2028, 2372, + 295, 2029, 2371, + 163, 2030, 2370, + 0, 2032, 2369, + 0, 2034, 2368, + 0, 2036, 2365, + 0, 2040, 2363, + 0, 2045, 2359, + 0, 2051, 2353, + 0, 2060, 2346, + 0, 2071, 2336, + 0, 2085, 2323, + 0, 2104, 2304, + 0, 2128, 2278, + 0, 2158, 2241, + 0, 2195, 2185, + 0, 2240, 2098, + 0, 2294, 1948, + 0, 2358, 1610, + 0, 2432, 0, + 0, 2514, 0, + 0, 2605, 0, + 0, 2704, 0, + 0, 2810, 0, + 0, 2921, 0, + 0, 3037, 0, + 0, 3157, 0, + 0, 3279, 0, + 0, 3404, 0, + 0, 3530, 0, + 0, 3658, 0, + 1521, 2037, 2404, + 1517, 2038, 2404, + 1511, 2039, 2403, + 1503, 2040, 2402, + 1492, 2041, 2401, + 1477, 2043, 2400, + 1457, 2046, 2398, + 1428, 2050, 2395, + 1385, 2054, 2391, + 1322, 2061, 2386, + 1221, 2069, 2380, + 1036, 2080, 2371, + 529, 2094, 2358, + 0, 2112, 2341, + 0, 2135, 2317, + 0, 2165, 2283, + 0, 2201, 2232, + 0, 2246, 2155, + 0, 2300, 2025, + 0, 2363, 1759, + 0, 2436, 0, + 0, 2518, 0, + 0, 2608, 0, + 0, 2707, 0, + 0, 2812, 0, + 0, 2923, 0, + 0, 3038, 0, + 0, 3157, 0, + 0, 3280, 0, + 0, 3404, 0, + 0, 3531, 0, + 0, 3659, 0, + 1883, 2050, 2444, + 1881, 2050, 2443, + 1879, 2051, 2443, + 1875, 2052, 2442, + 1870, 2054, 2441, + 1864, 2056, 2439, + 1855, 2058, 2437, + 1843, 2062, 2435, + 1827, 2066, 2432, + 1804, 2073, 2427, + 1771, 2081, 2421, + 1724, 2091, 2413, + 1651, 2105, 2401, + 1531, 2123, 2386, + 1296, 2146, 2364, + 216, 2174, 2333, + 0, 2210, 2288, + 0, 2254, 2221, + 0, 2307, 2111, + 0, 2369, 1903, + 0, 2441, 1228, + 0, 2522, 0, + 0, 2612, 0, + 0, 2709, 0, + 0, 2814, 0, + 0, 2924, 0, + 0, 3039, 0, + 0, 3158, 0, + 0, 3280, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 2133, 2066, 2491, + 2132, 2067, 2491, + 2131, 2067, 2490, + 2129, 2068, 2490, + 2126, 2070, 2489, + 2122, 2072, 2487, + 2118, 2074, 2486, + 2111, 2078, 2484, + 2102, 2082, 2481, + 2089, 2088, 2476, + 2072, 2096, 2471, + 2048, 2106, 2464, + 2014, 2120, 2453, + 1964, 2137, 2440, + 1887, 2159, 2420, + 1758, 2187, 2393, + 1496, 2222, 2354, + 0, 2265, 2296, + 0, 2316, 2205, + 0, 2377, 2044, + 0, 2448, 1663, + 0, 2528, 0, + 0, 2617, 0, + 0, 2713, 0, + 0, 2817, 0, + 0, 2927, 0, + 0, 3041, 0, + 0, 3160, 0, + 0, 3282, 0, + 0, 3406, 0, + 0, 3532, 0, + 0, 3659, 0, + 2337, 2087, 2548, + 2337, 2088, 2548, + 2336, 2088, 2547, + 2334, 2089, 2547, + 2333, 2091, 2546, + 2330, 2093, 2545, + 2327, 2095, 2543, + 2323, 2098, 2541, + 2317, 2103, 2539, + 2310, 2108, 2535, + 2299, 2116, 2530, + 2285, 2126, 2524, + 2265, 2138, 2515, + 2237, 2155, 2503, + 2196, 2176, 2486, + 2135, 2203, 2463, + 2039, 2237, 2429, + 1866, 2278, 2381, + 1429, 2329, 2306, + 0, 2388, 2182, + 0, 2457, 1936, + 0, 2536, 450, + 0, 2623, 0, + 0, 2718, 0, + 0, 2821, 0, + 0, 2930, 0, + 0, 3044, 0, + 0, 3162, 0, + 0, 3283, 0, + 0, 3407, 0, + 0, 3533, 0, + 0, 3660, 0, + 2517, 2114, 2614, + 2516, 2114, 2614, + 2515, 2115, 2614, + 2515, 2116, 2613, + 2513, 2117, 2612, + 2512, 2119, 2612, + 2510, 2121, 2610, + 2507, 2124, 2609, + 2503, 2128, 2606, + 2498, 2134, 2603, + 2491, 2141, 2599, + 2482, 2150, 2593, + 2469, 2162, 2586, + 2451, 2178, 2576, + 2426, 2198, 2561, + 2391, 2224, 2542, + 2338, 2256, 2514, + 2257, 2296, 2474, + 2119, 2344, 2414, + 1828, 2402, 2319, + 0, 2469, 2151, + 0, 2546, 1735, + 0, 2631, 0, + 0, 2725, 0, + 0, 2827, 0, + 0, 2934, 0, + 0, 3047, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 2681, 2147, 2690, + 2681, 2147, 2690, + 2680, 2148, 2690, + 2680, 2149, 2689, + 2679, 2150, 2689, + 2678, 2152, 2688, + 2676, 2154, 2687, + 2674, 2157, 2685, + 2672, 2161, 2683, + 2668, 2166, 2681, + 2663, 2172, 2677, + 2657, 2181, 2673, + 2648, 2192, 2666, + 2636, 2207, 2658, + 2620, 2226, 2646, + 2597, 2250, 2629, + 2565, 2281, 2607, + 2517, 2319, 2574, + 2444, 2365, 2527, + 2325, 2420, 2455, + 2090, 2485, 2336, + 1027, 2559, 2105, + 0, 2642, 1114, + 0, 2734, 0, + 0, 2834, 0, + 0, 2940, 0, + 0, 3052, 0, + 0, 3168, 0, + 0, 3288, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 2836, 2188, 2775, + 2836, 2189, 2775, + 2835, 2189, 2775, + 2835, 2190, 2774, + 2834, 2191, 2774, + 2833, 2193, 2773, + 2832, 2194, 2772, + 2831, 2197, 2771, + 2829, 2201, 2770, + 2827, 2205, 2767, + 2823, 2211, 2765, + 2819, 2219, 2761, + 2813, 2230, 2755, + 2805, 2243, 2748, + 2793, 2261, 2739, + 2778, 2283, 2725, + 2756, 2312, 2707, + 2726, 2347, 2681, + 2681, 2391, 2644, + 2614, 2443, 2590, + 2505, 2505, 2505, + 2300, 2576, 2358, + 1648, 2656, 2036, + 0, 2746, 0, + 0, 2843, 0, + 0, 2947, 0, + 0, 3057, 0, + 0, 3172, 0, + 0, 3291, 0, + 0, 3413, 0, + 0, 3537, 0, + 0, 3664, 0, + 2984, 2238, 2869, + 2984, 2238, 2868, + 2984, 2239, 2868, + 2983, 2239, 2868, + 2983, 2240, 2868, + 2983, 2242, 2867, + 2982, 2244, 2866, + 2981, 2246, 2865, + 2979, 2249, 2864, + 2978, 2253, 2862, + 2975, 2259, 2860, + 2972, 2266, 2857, + 2968, 2275, 2853, + 2962, 2287, 2847, + 2954, 2303, 2839, + 2943, 2324, 2828, + 2928, 2350, 2814, + 2907, 2383, 2794, + 2878, 2423, 2765, + 2836, 2472, 2724, + 2772, 2530, 2662, + 2669, 2598, 2563, + 2482, 2675, 2386, + 1962, 2761, 1922, + 0, 2855, 0, + 0, 2957, 0, + 0, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3128, 2297, 2969, + 3128, 2297, 2969, + 3128, 2298, 2969, + 3128, 2298, 2969, + 3127, 2299, 2969, + 3127, 2300, 2968, + 3126, 2302, 2968, + 3126, 2304, 2967, + 3125, 2307, 2966, + 3123, 2310, 2964, + 3122, 2315, 2962, + 3119, 2321, 2960, + 3116, 2330, 2957, + 3112, 2341, 2952, + 3106, 2355, 2946, + 3099, 2373, 2938, + 3088, 2397, 2926, + 3073, 2426, 2910, + 3053, 2463, 2888, + 3025, 2508, 2857, + 2984, 2562, 2812, + 2922, 2625, 2744, + 2825, 2698, 2632, + 2649, 2780, 2420, + 2195, 2871, 1705, + 0, 2970, 0, + 0, 3075, 0, + 0, 3186, 0, + 0, 3302, 0, + 0, 3421, 0, + 0, 3544, 0, + 0, 3668, 0, + 3269, 2365, 3077, + 3269, 2366, 3077, + 3269, 2366, 3076, + 3268, 2367, 3076, + 3268, 2367, 3076, + 3268, 2368, 3076, + 3268, 2370, 3075, + 3267, 2371, 3075, + 3266, 2374, 3074, + 3265, 2377, 3073, + 3264, 2381, 3071, + 3262, 2387, 3069, + 3260, 2394, 3067, + 3257, 2403, 3063, + 3253, 2416, 3058, + 3247, 2432, 3052, + 3240, 2453, 3043, + 3229, 2479, 3031, + 3215, 2512, 3014, + 3195, 2552, 2990, + 3168, 2601, 2957, + 3128, 2660, 2908, + 3068, 2728, 2834, + 2973, 2805, 2710, + 2805, 2892, 2463, + 2389, 2986, 928, + 0, 3088, 0, + 0, 3197, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3407, 2443, 3189, + 3407, 2444, 3189, + 3407, 2444, 3189, + 3407, 2444, 3189, + 3407, 2445, 3189, + 3407, 2446, 3188, + 3406, 2447, 3188, + 3406, 2448, 3188, + 3405, 2450, 3187, + 3405, 2453, 3186, + 3404, 2457, 3185, + 3403, 2461, 3183, + 3401, 2467, 3181, + 3399, 2475, 3179, + 3396, 2486, 3175, + 3392, 2500, 3170, + 3386, 2518, 3163, + 3379, 2541, 3154, + 3368, 2570, 3141, + 3354, 2605, 3123, + 3335, 2649, 3099, + 3308, 2702, 3064, + 3268, 2765, 3012, + 3210, 2836, 2932, + 3117, 2918, 2797, + 2954, 3008, 2514, + 2563, 3105, 0, + 0, 3210, 0, + 0, 3320, 0, + 0, 3436, 0, + 0, 3555, 0, + 0, 3677, 0, + 3544, 2530, 3306, + 3544, 2530, 3306, + 3544, 2531, 3306, + 3544, 2531, 3306, + 3544, 2532, 3306, + 3544, 2532, 3305, + 3543, 2533, 3305, + 3543, 2534, 3305, + 3543, 2536, 3304, + 3542, 2538, 3304, + 3541, 2541, 3303, + 3541, 2545, 3302, + 3539, 2550, 3300, + 3538, 2557, 3298, + 3535, 2566, 3295, + 3532, 2578, 3291, + 3528, 2593, 3286, + 3523, 2612, 3279, + 3516, 2637, 3269, + 3505, 2668, 3256, + 3492, 2707, 3238, + 3472, 2754, 3212, + 3445, 2810, 3175, + 3407, 2875, 3121, + 3349, 2950, 3037, + 3258, 3034, 2892, + 3099, 3127, 2574, + 2724, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 3680, 2625, 3427, + 3680, 2626, 3426, + 3680, 2626, 3426, + 3679, 2626, 3426, + 3679, 2626, 3426, + 3679, 2627, 3426, + 3679, 2628, 3426, + 3679, 2629, 3426, + 3679, 2630, 3425, + 3678, 2632, 3425, + 3678, 2634, 3424, + 3677, 2637, 3423, + 3676, 2642, 3422, + 3675, 2647, 3420, + 3673, 2655, 3418, + 3671, 2664, 3415, + 3668, 2677, 3411, + 3664, 2693, 3406, + 3659, 2714, 3399, + 3651, 2740, 3389, + 3641, 2773, 3375, + 3628, 2814, 3356, + 3609, 2863, 3330, + 3582, 2922, 3292, + 3543, 2990, 3236, + 3486, 3068, 3147, + 3397, 3155, 2994, + 3240, 3250, 2644, + 2877, 3352, 0, + 0, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3814, 2728, 3550, + 3814, 2728, 3550, + 3814, 2728, 3550, + 3814, 2728, 3550, + 3814, 2729, 3549, + 3814, 2729, 3549, + 3814, 2730, 3549, + 3814, 2730, 3549, + 3814, 2732, 3549, + 3813, 2733, 3548, + 3813, 2735, 3548, + 3812, 2737, 3547, + 3812, 2741, 3546, + 3811, 2745, 3545, + 3810, 2751, 3543, + 3808, 2759, 3541, + 3806, 2769, 3538, + 3803, 2782, 3534, + 3799, 2800, 3528, + 3793, 2822, 3521, + 3786, 2849, 3511, + 3776, 2884, 3497, + 3763, 2927, 3478, + 3744, 2978, 3451, + 3717, 3039, 3412, + 3679, 3109, 3354, + 3622, 3189, 3263, + 3534, 3278, 3102, + 3379, 3374, 2724, + 3024, 3478, 0, + 0, 3588, 0, + 0, 3702, 0, + 3948, 2836, 3675, + 3948, 2836, 3675, + 3948, 2836, 3675, + 3948, 2837, 3675, + 3948, 2837, 3675, + 3948, 2837, 3675, + 3948, 2838, 3675, + 3948, 2838, 3674, + 3948, 2839, 3674, + 3948, 2840, 3674, + 3947, 2842, 3673, + 3947, 2844, 3673, + 3946, 2847, 3672, + 3946, 2850, 3671, + 3945, 2855, 3670, + 3944, 2861, 3668, + 3942, 2869, 3666, + 3940, 2880, 3663, + 3937, 2894, 3659, + 3933, 2912, 3653, + 3928, 2935, 3646, + 3920, 2964, 3636, + 3910, 3000, 3622, + 3897, 3044, 3602, + 3878, 3097, 3574, + 3852, 3160, 3535, + 3814, 3232, 3475, + 3757, 3313, 3382, + 3669, 3403, 3216, + 3516, 3501, 2812, + 3167, 3606, 0, + 0, 3716, 0, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2951, 3802, + 4082, 2951, 3802, + 4082, 2952, 3801, + 4081, 2952, 3801, + 4081, 2953, 3801, + 4081, 2954, 3801, + 4081, 2956, 3800, + 4080, 2958, 3800, + 4080, 2961, 3799, + 4079, 2964, 3798, + 4078, 2969, 3797, + 4077, 2976, 3795, + 4075, 2984, 3793, + 4073, 2995, 3790, + 4070, 3010, 3786, + 4066, 3028, 3780, + 4061, 3052, 3772, + 4054, 3082, 3762, + 4044, 3119, 3748, + 4030, 3164, 3728, + 4012, 3219, 3700, + 3985, 3283, 3660, + 3948, 3356, 3599, + 3892, 3439, 3504, + 3804, 3530, 3334, + 3652, 3629, 2909, + 3307, 3735, 0, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3069, 3930, + 4095, 3069, 3930, + 4095, 3069, 3930, + 4095, 3070, 3929, + 4095, 3071, 3929, + 4095, 3072, 3929, + 4095, 3074, 3929, + 4095, 3076, 3928, + 4095, 3079, 3927, + 4095, 3083, 3926, + 4095, 3088, 3925, + 4095, 3094, 3923, + 4095, 3103, 3921, + 4095, 3114, 3918, + 4095, 3129, 3914, + 4095, 3148, 3908, + 4095, 3173, 3900, + 4095, 3203, 3890, + 4095, 3241, 3875, + 4095, 3288, 3855, + 4095, 3343, 3827, + 4095, 3408, 3786, + 4081, 3482, 3725, + 4025, 3566, 3629, + 3938, 3658, 3455, + 3786, 3758, 3012, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3190, 4059, + 4095, 3190, 4059, + 4095, 3191, 4059, + 4095, 3191, 4059, + 4095, 3192, 4058, + 4095, 3193, 4058, + 4095, 3195, 4058, + 4095, 3197, 4057, + 4095, 3200, 4056, + 4095, 3204, 4055, + 4095, 3209, 4054, + 4095, 3216, 4052, + 4095, 3225, 4050, + 4095, 3237, 4047, + 4095, 3252, 4043, + 4095, 3271, 4037, + 4095, 3296, 4029, + 4095, 3327, 4019, + 4095, 3366, 4004, + 4095, 3413, 3984, + 4095, 3469, 3956, + 4095, 3535, 3914, + 4095, 3610, 3853, + 4095, 3694, 3755, + 4071, 3787, 3579, + 0, 2129, 2398, + 0, 2130, 2397, + 0, 2131, 2396, + 0, 2132, 2396, + 0, 2133, 2394, + 0, 2135, 2393, + 0, 2137, 2391, + 0, 2140, 2388, + 0, 2144, 2384, + 0, 2149, 2379, + 0, 2156, 2373, + 0, 2165, 2363, + 0, 2176, 2351, + 0, 2192, 2333, + 0, 2211, 2309, + 0, 2236, 2274, + 0, 2268, 2222, + 0, 2307, 2143, + 0, 2354, 2009, + 0, 2410, 1731, + 0, 2476, 0, + 0, 2552, 0, + 0, 2636, 0, + 0, 2729, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2130, 2398, + 0, 2130, 2398, + 0, 2131, 2397, + 0, 2132, 2396, + 0, 2133, 2395, + 0, 2135, 2394, + 0, 2137, 2392, + 0, 2140, 2389, + 0, 2144, 2385, + 0, 2149, 2380, + 0, 2156, 2373, + 0, 2165, 2364, + 0, 2177, 2352, + 0, 2192, 2334, + 0, 2212, 2310, + 0, 2237, 2275, + 0, 2268, 2223, + 0, 2307, 2144, + 0, 2354, 2011, + 0, 2411, 1734, + 0, 2476, 0, + 0, 2552, 0, + 0, 2636, 0, + 0, 2729, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2130, 2399, + 0, 2130, 2399, + 0, 2131, 2398, + 0, 2132, 2397, + 0, 2133, 2396, + 0, 2135, 2395, + 0, 2137, 2393, + 0, 2140, 2390, + 0, 2144, 2386, + 0, 2149, 2381, + 0, 2156, 2374, + 0, 2165, 2365, + 0, 2177, 2353, + 0, 2192, 2335, + 0, 2212, 2311, + 0, 2237, 2276, + 0, 2268, 2225, + 0, 2307, 2146, + 0, 2354, 2013, + 0, 2411, 1738, + 0, 2477, 0, + 0, 2552, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2130, 2400, + 0, 2131, 2400, + 0, 2131, 2399, + 0, 2132, 2399, + 0, 2134, 2397, + 0, 2135, 2396, + 0, 2138, 2394, + 0, 2140, 2391, + 0, 2144, 2387, + 0, 2150, 2382, + 0, 2156, 2376, + 0, 2165, 2367, + 0, 2177, 2354, + 0, 2192, 2337, + 0, 2212, 2312, + 0, 2237, 2278, + 0, 2268, 2227, + 0, 2307, 2148, + 0, 2354, 2016, + 0, 2411, 1743, + 0, 2477, 0, + 0, 2552, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2131, 2402, + 0, 2131, 2402, + 0, 2132, 2401, + 0, 2133, 2400, + 0, 2134, 2399, + 0, 2136, 2398, + 0, 2138, 2396, + 0, 2141, 2393, + 0, 2145, 2389, + 0, 2150, 2384, + 0, 2157, 2377, + 0, 2166, 2368, + 0, 2177, 2356, + 0, 2193, 2339, + 0, 2212, 2314, + 0, 2237, 2280, + 0, 2269, 2229, + 0, 2307, 2151, + 0, 2355, 2020, + 0, 2411, 1750, + 0, 2477, 0, + 0, 2552, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2131, 2404, + 0, 2132, 2404, + 0, 2132, 2403, + 0, 2133, 2402, + 0, 2135, 2401, + 0, 2136, 2400, + 0, 2139, 2398, + 0, 2141, 2395, + 0, 2145, 2391, + 0, 2151, 2387, + 0, 2157, 2380, + 0, 2166, 2371, + 0, 2178, 2358, + 0, 2193, 2341, + 0, 2213, 2317, + 0, 2238, 2283, + 0, 2269, 2232, + 0, 2308, 2155, + 0, 2355, 2025, + 0, 2411, 1760, + 0, 2477, 0, + 0, 2553, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2132, 2407, + 0, 2133, 2407, + 0, 2133, 2406, + 0, 2134, 2405, + 0, 2135, 2404, + 0, 2137, 2403, + 0, 2139, 2401, + 0, 2142, 2398, + 0, 2146, 2395, + 0, 2151, 2390, + 0, 2158, 2383, + 0, 2167, 2374, + 0, 2179, 2362, + 0, 2194, 2345, + 0, 2213, 2321, + 0, 2238, 2287, + 0, 2270, 2237, + 0, 2308, 2160, + 0, 2356, 2032, + 0, 2412, 1772, + 0, 2478, 0, + 0, 2553, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2133, 2411, + 0, 2134, 2411, + 0, 2134, 2410, + 0, 2135, 2409, + 0, 2136, 2408, + 0, 2138, 2407, + 0, 2140, 2405, + 0, 2143, 2402, + 0, 2147, 2399, + 0, 2152, 2394, + 0, 2159, 2387, + 0, 2168, 2378, + 0, 2180, 2366, + 0, 2195, 2349, + 0, 2214, 2325, + 0, 2239, 2292, + 0, 2270, 2242, + 0, 2309, 2167, + 0, 2356, 2041, + 0, 2412, 1788, + 0, 2478, 0, + 0, 2553, 0, + 0, 2638, 0, + 0, 2730, 0, + 0, 2831, 0, + 0, 2937, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2134, 2417, + 0, 2135, 2416, + 0, 2136, 2416, + 0, 2136, 2415, + 0, 2138, 2414, + 0, 2139, 2412, + 0, 2142, 2410, + 0, 2144, 2408, + 0, 2148, 2404, + 0, 2154, 2399, + 0, 2160, 2393, + 0, 2169, 2384, + 0, 2181, 2372, + 0, 2196, 2355, + 0, 2215, 2332, + 0, 2240, 2299, + 0, 2271, 2250, + 0, 2310, 2176, + 0, 2357, 2053, + 0, 2413, 1808, + 0, 2479, 410, + 0, 2554, 0, + 0, 2638, 0, + 0, 2731, 0, + 0, 2831, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2136, 2424, + 0, 2137, 2423, + 0, 2137, 2422, + 0, 2138, 2422, + 0, 2140, 2421, + 0, 2141, 2419, + 0, 2143, 2417, + 0, 2146, 2415, + 0, 2150, 2411, + 0, 2155, 2406, + 0, 2162, 2400, + 0, 2171, 2391, + 0, 2182, 2379, + 0, 2198, 2363, + 0, 2217, 2340, + 0, 2242, 2308, + 0, 2273, 2260, + 0, 2311, 2187, + 0, 2358, 2068, + 0, 2414, 1834, + 0, 2479, 782, + 0, 2554, 0, + 0, 2639, 0, + 0, 2731, 0, + 0, 2831, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2139, 2433, + 0, 2139, 2432, + 0, 2140, 2432, + 0, 2141, 2431, + 0, 2142, 2430, + 0, 2144, 2428, + 0, 2146, 2426, + 0, 2149, 2424, + 0, 2152, 2420, + 0, 2158, 2416, + 0, 2164, 2410, + 0, 2173, 2401, + 0, 2185, 2389, + 0, 2200, 2373, + 0, 2219, 2351, + 0, 2244, 2319, + 0, 2274, 2273, + 0, 2313, 2203, + 0, 2360, 2088, + 0, 2415, 1866, + 0, 2481, 1036, + 0, 2555, 0, + 0, 2639, 0, + 0, 2732, 0, + 0, 2832, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2142, 2444, + 0, 2142, 2444, + 0, 2143, 2443, + 0, 2144, 2443, + 0, 2145, 2442, + 0, 2147, 2440, + 0, 2149, 2438, + 0, 2152, 2436, + 0, 2156, 2433, + 0, 2161, 2428, + 0, 2167, 2422, + 0, 2176, 2414, + 0, 2188, 2402, + 0, 2202, 2387, + 0, 2222, 2365, + 0, 2246, 2334, + 0, 2277, 2290, + 0, 2315, 2222, + 0, 2362, 2113, + 0, 2417, 1906, + 0, 2482, 1242, + 0, 2557, 0, + 0, 2640, 0, + 0, 2733, 0, + 0, 2833, 0, + 0, 2939, 0, + 0, 3051, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2146, 2460, + 0, 2146, 2460, + 0, 2147, 2459, + 0, 2148, 2458, + 0, 2149, 2457, + 0, 2151, 2456, + 0, 2153, 2454, + 0, 2156, 2452, + 0, 2160, 2448, + 0, 2165, 2444, + 0, 2171, 2438, + 0, 2180, 2430, + 0, 2191, 2419, + 0, 2206, 2404, + 0, 2225, 2383, + 0, 2249, 2354, + 0, 2280, 2311, + 0, 2318, 2247, + 0, 2364, 2144, + 0, 2419, 1955, + 0, 2484, 1422, + 0, 2558, 0, + 0, 2642, 0, + 0, 2734, 0, + 0, 2834, 0, + 0, 2940, 0, + 0, 3051, 0, + 0, 3168, 0, + 0, 3288, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2152, 2480, + 0, 2152, 2479, + 0, 2153, 2479, + 0, 2154, 2478, + 0, 2155, 2477, + 0, 2156, 2476, + 0, 2159, 2474, + 0, 2161, 2472, + 0, 2165, 2469, + 0, 2170, 2465, + 0, 2177, 2459, + 0, 2185, 2451, + 0, 2196, 2441, + 0, 2211, 2427, + 0, 2230, 2407, + 0, 2254, 2379, + 0, 2284, 2339, + 0, 2322, 2278, + 0, 2368, 2183, + 0, 2422, 2013, + 0, 2487, 1587, + 0, 2561, 0, + 0, 2644, 0, + 0, 2735, 0, + 0, 2835, 0, + 0, 2941, 0, + 0, 3052, 0, + 0, 3168, 0, + 0, 3288, 0, + 0, 3411, 0, + 0, 3536, 0, + 0, 3662, 0, + 590, 2159, 2505, + 556, 2159, 2505, + 505, 2160, 2504, + 427, 2161, 2503, + 295, 2162, 2503, + 26, 2164, 2501, + 0, 2166, 2500, + 0, 2169, 2498, + 0, 2172, 2495, + 0, 2177, 2491, + 0, 2184, 2485, + 0, 2192, 2478, + 0, 2203, 2468, + 0, 2218, 2455, + 0, 2236, 2436, + 0, 2260, 2410, + 0, 2290, 2373, + 0, 2327, 2317, + 0, 2372, 2230, + 0, 2427, 2080, + 0, 2490, 1742, + 0, 2564, 0, + 0, 2646, 0, + 0, 2737, 0, + 0, 2836, 0, + 0, 2942, 0, + 0, 3053, 0, + 0, 3169, 0, + 0, 3289, 0, + 0, 3411, 0, + 0, 3536, 0, + 0, 3662, 0, + 1656, 2169, 2537, + 1653, 2169, 2536, + 1649, 2170, 2536, + 1643, 2171, 2535, + 1635, 2172, 2534, + 1624, 2173, 2533, + 1610, 2175, 2532, + 1589, 2178, 2530, + 1560, 2182, 2527, + 1518, 2186, 2523, + 1454, 2193, 2518, + 1353, 2201, 2512, + 1168, 2212, 2503, + 661, 2226, 2490, + 0, 2244, 2473, + 0, 2268, 2449, + 0, 2297, 2415, + 0, 2334, 2364, + 0, 2378, 2287, + 0, 2432, 2157, + 0, 2495, 1891, + 0, 2568, 0, + 0, 2650, 0, + 0, 2740, 0, + 0, 2839, 0, + 0, 2944, 0, + 0, 3055, 0, + 0, 3170, 0, + 0, 3289, 0, + 0, 3412, 0, + 0, 3536, 0, + 0, 3663, 0, + 2017, 2181, 2576, + 2015, 2182, 2576, + 2013, 2182, 2575, + 2011, 2183, 2575, + 2007, 2184, 2574, + 2002, 2186, 2573, + 1996, 2188, 2571, + 1987, 2190, 2570, + 1975, 2194, 2567, + 1959, 2199, 2564, + 1936, 2205, 2559, + 1903, 2213, 2553, + 1856, 2223, 2545, + 1783, 2237, 2533, + 1663, 2255, 2518, + 1428, 2278, 2496, + 348, 2307, 2465, + 0, 2342, 2420, + 0, 2386, 2353, + 0, 2439, 2243, + 0, 2501, 2035, + 0, 2573, 1360, + 0, 2654, 0, + 0, 2744, 0, + 0, 2842, 0, + 0, 2946, 0, + 0, 3056, 0, + 0, 3172, 0, + 0, 3291, 0, + 0, 3413, 0, + 0, 3537, 0, + 0, 3663, 0, + 2266, 2198, 2624, + 2266, 2198, 2623, + 2264, 2199, 2623, + 2263, 2200, 2622, + 2261, 2201, 2622, + 2258, 2202, 2621, + 2255, 2204, 2620, + 2250, 2206, 2618, + 2243, 2210, 2616, + 2234, 2214, 2613, + 2222, 2220, 2609, + 2204, 2228, 2603, + 2180, 2238, 2596, + 2146, 2252, 2586, + 2096, 2269, 2572, + 2019, 2291, 2552, + 1890, 2319, 2525, + 1628, 2354, 2486, + 0, 2397, 2428, + 0, 2448, 2337, + 0, 2509, 2176, + 0, 2580, 1795, + 0, 2660, 0, + 0, 2749, 0, + 0, 2845, 0, + 0, 2949, 0, + 0, 3059, 0, + 0, 3173, 0, + 0, 3292, 0, + 0, 3414, 0, + 0, 3538, 0, + 0, 3664, 0, + 2470, 2219, 2680, + 2469, 2219, 2680, + 2469, 2220, 2680, + 2468, 2220, 2679, + 2466, 2221, 2679, + 2465, 2223, 2678, + 2462, 2225, 2677, + 2459, 2227, 2675, + 2455, 2230, 2673, + 2450, 2235, 2671, + 2442, 2240, 2667, + 2431, 2248, 2662, + 2417, 2258, 2656, + 2397, 2270, 2647, + 2369, 2287, 2635, + 2328, 2308, 2618, + 2267, 2335, 2595, + 2171, 2369, 2561, + 1998, 2410, 2513, + 1561, 2461, 2438, + 0, 2520, 2315, + 0, 2589, 2068, + 0, 2668, 582, + 0, 2755, 0, + 0, 2851, 0, + 0, 2953, 0, + 0, 3062, 0, + 0, 3176, 0, + 0, 3294, 0, + 0, 3415, 0, + 0, 3539, 0, + 0, 3665, 0, + 2649, 2245, 2747, + 2649, 2246, 2746, + 2648, 2246, 2746, + 2648, 2247, 2746, + 2647, 2248, 2745, + 2646, 2249, 2745, + 2644, 2251, 2744, + 2642, 2253, 2742, + 2639, 2256, 2741, + 2635, 2260, 2738, + 2630, 2266, 2735, + 2623, 2273, 2731, + 2614, 2282, 2726, + 2601, 2294, 2718, + 2583, 2310, 2708, + 2558, 2330, 2693, + 2523, 2356, 2674, + 2470, 2388, 2646, + 2389, 2428, 2606, + 2251, 2476, 2546, + 1960, 2534, 2451, + 0, 2601, 2283, + 0, 2678, 1867, + 0, 2763, 0, + 0, 2857, 0, + 0, 2959, 0, + 0, 3066, 0, + 0, 3179, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 2813, 2279, 2823, + 2813, 2279, 2822, + 2813, 2280, 2822, + 2812, 2280, 2822, + 2812, 2281, 2821, + 2811, 2282, 2821, + 2810, 2284, 2820, + 2808, 2286, 2819, + 2806, 2289, 2817, + 2804, 2293, 2816, + 2800, 2298, 2813, + 2796, 2304, 2809, + 2789, 2313, 2805, + 2780, 2324, 2798, + 2769, 2339, 2790, + 2752, 2358, 2778, + 2729, 2382, 2762, + 2697, 2413, 2739, + 2649, 2451, 2706, + 2576, 2497, 2659, + 2457, 2552, 2587, + 2222, 2617, 2468, + 1159, 2691, 2237, + 0, 2774, 1246, + 0, 2866, 0, + 0, 2966, 0, + 0, 3072, 0, + 0, 3184, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3542, 0, + 0, 3667, 0, + 2968, 2320, 2907, + 2968, 2320, 2907, + 2968, 2321, 2907, + 2967, 2321, 2907, + 2967, 2322, 2906, + 2966, 2323, 2906, + 2966, 2325, 2905, + 2965, 2327, 2904, + 2963, 2329, 2903, + 2961, 2333, 2902, + 2959, 2337, 2900, + 2956, 2343, 2897, + 2951, 2351, 2893, + 2945, 2362, 2888, + 2937, 2375, 2880, + 2925, 2393, 2871, + 2910, 2415, 2857, + 2888, 2444, 2839, + 2858, 2479, 2813, + 2813, 2523, 2776, + 2746, 2575, 2722, + 2637, 2637, 2637, + 2432, 2708, 2490, + 1780, 2789, 2168, + 0, 2878, 0, + 0, 2975, 0, + 0, 3079, 0, + 0, 3190, 0, + 0, 3304, 0, + 0, 3423, 0, + 0, 3545, 0, + 0, 3669, 0, + 3116, 2370, 3001, + 3116, 2370, 3001, + 3116, 2370, 3001, + 3116, 2371, 3000, + 3116, 2372, 3000, + 3115, 2373, 3000, + 3115, 2374, 2999, + 3114, 2376, 2998, + 3113, 2378, 2997, + 3112, 2381, 2996, + 3110, 2385, 2994, + 3107, 2391, 2992, + 3104, 2398, 2989, + 3100, 2407, 2985, + 3094, 2420, 2979, + 3086, 2436, 2971, + 3075, 2456, 2961, + 3060, 2482, 2946, + 3039, 2515, 2926, + 3010, 2555, 2897, + 2968, 2604, 2856, + 2904, 2662, 2794, + 2802, 2730, 2696, + 2614, 2807, 2518, + 2094, 2893, 2054, + 0, 2987, 0, + 0, 3089, 0, + 0, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3260, 2429, 3102, + 3260, 2429, 3102, + 3260, 2429, 3101, + 3260, 2430, 3101, + 3260, 2430, 3101, + 3259, 2431, 3101, + 3259, 2432, 3100, + 3258, 2434, 3100, + 3258, 2436, 3099, + 3257, 2439, 3098, + 3255, 2442, 3096, + 3254, 2447, 3095, + 3251, 2453, 3092, + 3248, 2462, 3089, + 3244, 2473, 3084, + 3238, 2487, 3078, + 3231, 2505, 3070, + 3220, 2529, 3058, + 3206, 2558, 3042, + 3185, 2595, 3021, + 3157, 2640, 2989, + 3116, 2694, 2944, + 3054, 2757, 2876, + 2957, 2830, 2764, + 2781, 2913, 2552, + 2327, 3003, 1837, + 0, 3102, 0, + 0, 3207, 0, + 0, 3318, 0, + 0, 3434, 0, + 0, 3553, 0, + 0, 3676, 0, + 3401, 2497, 3209, + 3401, 2497, 3209, + 3401, 2498, 3209, + 3401, 2498, 3208, + 3401, 2499, 3208, + 3400, 2499, 3208, + 3400, 2500, 3208, + 3400, 2502, 3207, + 3399, 2503, 3207, + 3398, 2506, 3206, + 3397, 2509, 3205, + 3396, 2513, 3203, + 3394, 2519, 3201, + 3392, 2526, 3199, + 3389, 2535, 3195, + 3385, 2548, 3190, + 3379, 2564, 3184, + 3372, 2585, 3175, + 3361, 2611, 3163, + 3347, 2644, 3146, + 3328, 2684, 3123, + 3300, 2734, 3089, + 3260, 2792, 3040, + 3200, 2860, 2966, + 3105, 2937, 2842, + 2937, 3024, 2595, + 2521, 3118, 1060, + 0, 3220, 0, + 0, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3680, 0, + 3539, 2575, 3321, + 3539, 2575, 3321, + 3539, 2576, 3321, + 3539, 2576, 3321, + 3539, 2576, 3321, + 3539, 2577, 3321, + 3539, 2578, 3320, + 3538, 2579, 3320, + 3538, 2581, 3320, + 3537, 2582, 3319, + 3537, 2585, 3318, + 3536, 2589, 3317, + 3535, 2593, 3315, + 3533, 2599, 3313, + 3531, 2608, 3311, + 3528, 2618, 3307, + 3524, 2632, 3302, + 3518, 2650, 3295, + 3511, 2673, 3286, + 3500, 2702, 3273, + 3486, 2738, 3255, + 3467, 2782, 3231, + 3440, 2834, 3196, + 3400, 2897, 3144, + 3342, 2969, 3064, + 3249, 3050, 2929, + 3086, 3140, 2646, + 2695, 3237, 0, + 0, 3342, 0, + 0, 3452, 0, + 0, 3568, 0, + 0, 3687, 0, + 3676, 2662, 3438, + 3676, 2662, 3438, + 3676, 2663, 3438, + 3676, 2663, 3438, + 3676, 2663, 3438, + 3676, 2664, 3438, + 3676, 2664, 3438, + 3675, 2665, 3437, + 3675, 2667, 3437, + 3675, 2668, 3436, + 3674, 2670, 3436, + 3674, 2673, 3435, + 3673, 2677, 3434, + 3671, 2682, 3432, + 3670, 2689, 3430, + 3668, 2698, 3427, + 3665, 2710, 3423, + 3661, 2725, 3418, + 3655, 2744, 3411, + 3648, 2769, 3401, + 3638, 2800, 3388, + 3624, 2839, 3370, + 3605, 2886, 3344, + 3578, 2942, 3308, + 3539, 3007, 3253, + 3481, 3082, 3169, + 3390, 3167, 3024, + 3231, 3259, 2706, + 2856, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 3812, 2757, 3559, + 3812, 2757, 3559, + 3812, 2758, 3559, + 3812, 2758, 3558, + 3812, 2758, 3558, + 3811, 2759, 3558, + 3811, 2759, 3558, + 3811, 2760, 3558, + 3811, 2761, 3558, + 3811, 2762, 3557, + 3810, 2764, 3557, + 3810, 2766, 3556, + 3809, 2770, 3555, + 3808, 2774, 3554, + 3807, 2779, 3552, + 3805, 2787, 3550, + 3803, 2796, 3547, + 3800, 2809, 3543, + 3796, 2825, 3538, + 3791, 2846, 3531, + 3783, 2872, 3521, + 3773, 2905, 3507, + 3760, 2946, 3488, + 3741, 2996, 3462, + 3714, 3054, 3424, + 3675, 3122, 3368, + 3618, 3200, 3279, + 3529, 3287, 3126, + 3372, 3382, 2777, + 3009, 3484, 0, + 0, 3592, 0, + 0, 3706, 0, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2861, 3682, + 3946, 2861, 3681, + 3946, 2862, 3681, + 3946, 2863, 3681, + 3946, 2864, 3681, + 3945, 2865, 3680, + 3945, 2867, 3680, + 3944, 2869, 3679, + 3944, 2873, 3678, + 3943, 2877, 3677, + 3942, 2883, 3675, + 3940, 2891, 3673, + 3938, 2901, 3670, + 3935, 2914, 3666, + 3931, 2932, 3661, + 3926, 2954, 3653, + 3918, 2981, 3643, + 3908, 3016, 3629, + 3895, 3059, 3610, + 3876, 3110, 3583, + 3849, 3171, 3544, + 3811, 3242, 3486, + 3754, 3321, 3395, + 3666, 3410, 3235, + 3511, 3507, 2856, + 3156, 3610, 0, + 0, 3720, 0, + 4080, 2968, 3807, + 4080, 2968, 3807, + 4080, 2968, 3807, + 4080, 2969, 3807, + 4080, 2969, 3807, + 4080, 2969, 3807, + 4080, 2969, 3807, + 4080, 2970, 3807, + 4080, 2970, 3806, + 4080, 2971, 3806, + 4080, 2972, 3806, + 4079, 2974, 3806, + 4079, 2976, 3805, + 4078, 2979, 3804, + 4078, 2982, 3803, + 4077, 2987, 3802, + 4076, 2993, 3800, + 4074, 3001, 3798, + 4072, 3012, 3795, + 4069, 3026, 3791, + 4065, 3044, 3786, + 4060, 3067, 3778, + 4052, 3096, 3768, + 4042, 3132, 3754, + 4029, 3176, 3734, + 4010, 3229, 3706, + 3984, 3292, 3667, + 3946, 3364, 3608, + 3889, 3445, 3514, + 3801, 3535, 3348, + 3648, 3633, 2944, + 3299, 3738, 0, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3083, 3934, + 4095, 3083, 3934, + 4095, 3084, 3934, + 4095, 3084, 3933, + 4095, 3085, 3933, + 4095, 3086, 3933, + 4095, 3088, 3932, + 4095, 3090, 3932, + 4095, 3093, 3931, + 4095, 3096, 3930, + 4095, 3101, 3929, + 4095, 3108, 3927, + 4095, 3116, 3925, + 4095, 3127, 3922, + 4095, 3142, 3918, + 4095, 3160, 3912, + 4095, 3184, 3905, + 4095, 3214, 3894, + 4095, 3251, 3880, + 4095, 3297, 3860, + 4095, 3351, 3832, + 4095, 3415, 3792, + 4080, 3488, 3732, + 4024, 3571, 3636, + 3936, 3662, 3466, + 3784, 3761, 3041, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3201, 4062, + 4095, 3201, 4062, + 4095, 3202, 4062, + 4095, 3202, 4062, + 4095, 3203, 4061, + 4095, 3204, 4061, + 4095, 3206, 4061, + 4095, 3208, 4060, + 4095, 3211, 4059, + 4095, 3215, 4058, + 4095, 3220, 4057, + 4095, 3226, 4055, + 4095, 3235, 4053, + 4095, 3247, 4050, + 4095, 3261, 4046, + 4095, 3280, 4040, + 4095, 3305, 4032, + 4095, 3335, 4022, + 4095, 3374, 4008, + 4095, 3420, 3988, + 4095, 3475, 3959, + 4095, 3540, 3918, + 4095, 3614, 3858, + 4095, 3698, 3761, + 4070, 3790, 3587, + 0, 2261, 2529, + 0, 2261, 2529, + 0, 2262, 2529, + 0, 2263, 2528, + 0, 2264, 2527, + 0, 2265, 2526, + 0, 2267, 2524, + 0, 2269, 2522, + 0, 2272, 2520, + 0, 2276, 2516, + 0, 2281, 2511, + 0, 2288, 2504, + 0, 2297, 2495, + 0, 2308, 2482, + 0, 2324, 2465, + 0, 2343, 2440, + 0, 2368, 2405, + 0, 2400, 2354, + 0, 2439, 2274, + 0, 2486, 2140, + 0, 2542, 1860, + 0, 2608, 0, + 0, 2684, 0, + 0, 2768, 0, + 0, 2861, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2261, 2530, + 0, 2262, 2530, + 0, 2262, 2529, + 0, 2263, 2529, + 0, 2264, 2528, + 0, 2265, 2527, + 0, 2267, 2525, + 0, 2269, 2523, + 0, 2272, 2520, + 0, 2276, 2517, + 0, 2281, 2512, + 0, 2288, 2505, + 0, 2297, 2495, + 0, 2309, 2483, + 0, 2324, 2465, + 0, 2343, 2441, + 0, 2368, 2406, + 0, 2400, 2354, + 0, 2439, 2275, + 0, 2486, 2141, + 0, 2543, 1863, + 0, 2608, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2261, 2531, + 0, 2262, 2530, + 0, 2262, 2530, + 0, 2263, 2529, + 0, 2264, 2528, + 0, 2265, 2527, + 0, 2267, 2526, + 0, 2269, 2524, + 0, 2272, 2521, + 0, 2276, 2517, + 0, 2281, 2512, + 0, 2288, 2505, + 0, 2297, 2496, + 0, 2309, 2484, + 0, 2324, 2466, + 0, 2344, 2442, + 0, 2369, 2407, + 0, 2400, 2355, + 0, 2439, 2276, + 0, 2486, 2143, + 0, 2543, 1866, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2262, 2532, + 0, 2262, 2531, + 0, 2263, 2531, + 0, 2263, 2530, + 0, 2264, 2529, + 0, 2265, 2528, + 0, 2267, 2527, + 0, 2269, 2525, + 0, 2272, 2522, + 0, 2276, 2518, + 0, 2281, 2513, + 0, 2288, 2506, + 0, 2297, 2497, + 0, 2309, 2485, + 0, 2324, 2467, + 0, 2344, 2443, + 0, 2369, 2408, + 0, 2400, 2357, + 0, 2439, 2278, + 0, 2486, 2145, + 0, 2543, 1870, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2262, 2533, + 0, 2262, 2533, + 0, 2263, 2532, + 0, 2264, 2531, + 0, 2264, 2531, + 0, 2266, 2529, + 0, 2267, 2528, + 0, 2270, 2526, + 0, 2273, 2523, + 0, 2276, 2520, + 0, 2282, 2515, + 0, 2288, 2508, + 0, 2297, 2499, + 0, 2309, 2486, + 0, 2324, 2469, + 0, 2344, 2444, + 0, 2369, 2410, + 0, 2400, 2359, + 0, 2439, 2280, + 0, 2487, 2148, + 0, 2543, 1875, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2262, 2535, + 0, 2263, 2534, + 0, 2263, 2534, + 0, 2264, 2533, + 0, 2265, 2532, + 0, 2266, 2531, + 0, 2268, 2530, + 0, 2270, 2528, + 0, 2273, 2525, + 0, 2277, 2521, + 0, 2282, 2516, + 0, 2289, 2510, + 0, 2298, 2500, + 0, 2310, 2488, + 0, 2325, 2471, + 0, 2344, 2446, + 0, 2369, 2412, + 0, 2401, 2361, + 0, 2440, 2283, + 0, 2487, 2152, + 0, 2543, 1882, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2263, 2537, + 0, 2263, 2537, + 0, 2264, 2536, + 0, 2265, 2535, + 0, 2265, 2535, + 0, 2267, 2533, + 0, 2268, 2532, + 0, 2271, 2530, + 0, 2274, 2527, + 0, 2277, 2524, + 0, 2283, 2519, + 0, 2289, 2512, + 0, 2298, 2503, + 0, 2310, 2490, + 0, 2325, 2473, + 0, 2345, 2449, + 0, 2370, 2415, + 0, 2401, 2364, + 0, 2440, 2287, + 0, 2487, 2157, + 0, 2543, 1892, + 0, 2609, 0, + 0, 2685, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2264, 2540, + 0, 2264, 2539, + 0, 2265, 2539, + 0, 2265, 2538, + 0, 2266, 2538, + 0, 2267, 2536, + 0, 2269, 2535, + 0, 2271, 2533, + 0, 2274, 2530, + 0, 2278, 2527, + 0, 2283, 2522, + 0, 2290, 2515, + 0, 2299, 2506, + 0, 2311, 2494, + 0, 2326, 2477, + 0, 2346, 2453, + 0, 2370, 2419, + 0, 2402, 2369, + 0, 2440, 2292, + 0, 2488, 2164, + 0, 2544, 1904, + 0, 2610, 0, + 0, 2685, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2963, 0, + 0, 3069, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2265, 2544, + 0, 2265, 2543, + 0, 2266, 2543, + 0, 2266, 2542, + 0, 2267, 2542, + 0, 2268, 2540, + 0, 2270, 2539, + 0, 2272, 2537, + 0, 2275, 2534, + 0, 2279, 2531, + 0, 2284, 2526, + 0, 2291, 2519, + 0, 2300, 2510, + 0, 2312, 2498, + 0, 2327, 2481, + 0, 2346, 2458, + 0, 2371, 2424, + 0, 2402, 2375, + 0, 2441, 2299, + 0, 2488, 2173, + 0, 2544, 1920, + 0, 2610, 0, + 0, 2685, 0, + 0, 2770, 0, + 0, 2862, 0, + 0, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2266, 2549, + 0, 2266, 2549, + 0, 2267, 2548, + 0, 2268, 2548, + 0, 2269, 2547, + 0, 2270, 2546, + 0, 2271, 2544, + 0, 2274, 2542, + 0, 2277, 2540, + 0, 2280, 2536, + 0, 2286, 2531, + 0, 2292, 2525, + 0, 2301, 2516, + 0, 2313, 2504, + 0, 2328, 2487, + 0, 2348, 2464, + 0, 2372, 2431, + 0, 2403, 2382, + 0, 2442, 2308, + 0, 2489, 2185, + 0, 2545, 1940, + 0, 2611, 542, + 0, 2686, 0, + 0, 2770, 0, + 0, 2863, 0, + 0, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2268, 2556, + 0, 2268, 2556, + 0, 2269, 2555, + 0, 2269, 2555, + 0, 2270, 2554, + 0, 2272, 2553, + 0, 2273, 2551, + 0, 2275, 2549, + 0, 2278, 2547, + 0, 2282, 2543, + 0, 2287, 2538, + 0, 2294, 2532, + 0, 2303, 2523, + 0, 2315, 2512, + 0, 2330, 2495, + 0, 2349, 2472, + 0, 2374, 2440, + 0, 2405, 2392, + 0, 2443, 2320, + 0, 2490, 2200, + 0, 2546, 1966, + 0, 2612, 914, + 0, 2687, 0, + 0, 2771, 0, + 0, 2863, 0, + 0, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2270, 2565, + 0, 2271, 2565, + 0, 2271, 2564, + 0, 2272, 2564, + 0, 2273, 2563, + 0, 2274, 2562, + 0, 2276, 2560, + 0, 2278, 2559, + 0, 2281, 2556, + 0, 2285, 2553, + 0, 2290, 2548, + 0, 2296, 2542, + 0, 2305, 2533, + 0, 2317, 2522, + 0, 2332, 2505, + 0, 2351, 2483, + 0, 2376, 2451, + 0, 2407, 2405, + 0, 2445, 2335, + 0, 2492, 2220, + 0, 2547, 1998, + 0, 2613, 1168, + 0, 2688, 0, + 0, 2772, 0, + 0, 2864, 0, + 0, 2964, 0, + 0, 3071, 0, + 0, 3183, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2273, 2577, + 0, 2274, 2577, + 0, 2274, 2576, + 0, 2275, 2576, + 0, 2276, 2575, + 0, 2277, 2574, + 0, 2279, 2572, + 0, 2281, 2571, + 0, 2284, 2568, + 0, 2288, 2565, + 0, 2293, 2560, + 0, 2299, 2554, + 0, 2308, 2546, + 0, 2320, 2535, + 0, 2335, 2519, + 0, 2354, 2497, + 0, 2378, 2467, + 0, 2409, 2422, + 0, 2447, 2354, + 0, 2494, 2245, + 0, 2549, 2038, + 0, 2614, 1374, + 0, 2689, 0, + 0, 2773, 0, + 0, 2865, 0, + 0, 2965, 0, + 0, 3071, 0, + 0, 3183, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2278, 2592, + 0, 2278, 2592, + 0, 2279, 2592, + 0, 2279, 2591, + 0, 2280, 2590, + 0, 2281, 2589, + 0, 2283, 2588, + 0, 2285, 2586, + 0, 2288, 2584, + 0, 2292, 2581, + 0, 2297, 2576, + 0, 2303, 2570, + 0, 2312, 2562, + 0, 2323, 2551, + 0, 2338, 2536, + 0, 2357, 2516, + 0, 2382, 2486, + 0, 2412, 2443, + 0, 2450, 2379, + 0, 2496, 2276, + 0, 2551, 2087, + 0, 2616, 1554, + 0, 2690, 0, + 0, 2774, 0, + 0, 2866, 0, + 0, 2966, 0, + 0, 3072, 0, + 0, 3184, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2283, 2612, + 0, 2284, 2612, + 0, 2284, 2611, + 0, 2285, 2611, + 0, 2286, 2610, + 0, 2287, 2609, + 0, 2289, 2608, + 0, 2291, 2606, + 0, 2293, 2604, + 0, 2297, 2601, + 0, 2302, 2597, + 0, 2309, 2591, + 0, 2317, 2584, + 0, 2329, 2573, + 0, 2343, 2559, + 0, 2362, 2539, + 0, 2386, 2511, + 0, 2416, 2471, + 0, 2454, 2410, + 0, 2500, 2315, + 0, 2555, 2145, + 0, 2619, 1719, + 0, 2693, 0, + 0, 2776, 0, + 0, 2868, 0, + 0, 2967, 0, + 0, 3073, 0, + 0, 3184, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3543, 0, + 0, 3668, 0, + 746, 2291, 2637, + 722, 2291, 2637, + 688, 2292, 2637, + 637, 2292, 2636, + 559, 2293, 2636, + 428, 2294, 2635, + 158, 2296, 2633, + 0, 2298, 2632, + 0, 2301, 2630, + 0, 2304, 2627, + 0, 2309, 2623, + 0, 2316, 2618, + 0, 2324, 2610, + 0, 2335, 2601, + 0, 2350, 2587, + 0, 2368, 2568, + 0, 2392, 2542, + 0, 2422, 2505, + 0, 2459, 2449, + 0, 2504, 2362, + 0, 2559, 2212, + 0, 2622, 1874, + 0, 2696, 0, + 0, 2778, 0, + 0, 2870, 0, + 0, 2969, 0, + 0, 3074, 0, + 0, 3185, 0, + 0, 3301, 0, + 0, 3421, 0, + 0, 3543, 0, + 0, 3668, 0, + 1791, 2300, 2669, + 1789, 2301, 2669, + 1785, 2301, 2668, + 1781, 2302, 2668, + 1775, 2303, 2667, + 1767, 2304, 2667, + 1757, 2305, 2665, + 1742, 2307, 2664, + 1721, 2310, 2662, + 1692, 2314, 2659, + 1650, 2319, 2656, + 1586, 2325, 2651, + 1485, 2333, 2644, + 1300, 2344, 2635, + 793, 2358, 2622, + 0, 2376, 2605, + 0, 2400, 2581, + 0, 2429, 2547, + 0, 2466, 2496, + 0, 2510, 2419, + 0, 2564, 2289, + 0, 2627, 2023, + 0, 2700, 0, + 0, 2782, 0, + 0, 2872, 0, + 0, 2971, 0, + 0, 3076, 0, + 0, 3187, 0, + 0, 3302, 0, + 0, 3422, 0, + 0, 3544, 0, + 0, 3668, 0, + 2150, 2313, 2708, + 2149, 2313, 2708, + 2147, 2314, 2708, + 2145, 2314, 2707, + 2143, 2315, 2707, + 2139, 2316, 2706, + 2135, 2318, 2705, + 2128, 2320, 2704, + 2119, 2323, 2702, + 2108, 2326, 2699, + 2091, 2331, 2696, + 2068, 2337, 2691, + 2036, 2345, 2685, + 1988, 2356, 2677, + 1915, 2369, 2666, + 1795, 2387, 2650, + 1560, 2410, 2628, + 480, 2439, 2597, + 0, 2474, 2553, + 0, 2518, 2485, + 0, 2571, 2375, + 0, 2633, 2167, + 0, 2705, 1492, + 0, 2786, 0, + 0, 2876, 0, + 0, 2974, 0, + 0, 3078, 0, + 0, 3189, 0, + 0, 3304, 0, + 0, 3423, 0, + 0, 3545, 0, + 0, 3669, 0, + 2399, 2329, 2756, + 2398, 2330, 2756, + 2398, 2330, 2755, + 2396, 2331, 2755, + 2395, 2332, 2754, + 2393, 2333, 2754, + 2390, 2334, 2753, + 2387, 2336, 2752, + 2382, 2339, 2750, + 2375, 2342, 2748, + 2366, 2346, 2745, + 2354, 2352, 2741, + 2337, 2360, 2735, + 2313, 2370, 2728, + 2278, 2384, 2718, + 2228, 2401, 2704, + 2151, 2423, 2684, + 2023, 2451, 2657, + 1760, 2486, 2618, + 0, 2529, 2560, + 0, 2581, 2469, + 0, 2642, 2308, + 0, 2712, 1927, + 0, 2792, 0, + 0, 2881, 0, + 0, 2978, 0, + 0, 3081, 0, + 0, 3191, 0, + 0, 3306, 0, + 0, 3424, 0, + 0, 3546, 0, + 0, 3670, 0, + 2602, 2350, 2813, + 2602, 2351, 2812, + 2602, 2351, 2812, + 2601, 2352, 2812, + 2600, 2353, 2811, + 2599, 2354, 2811, + 2597, 2355, 2810, + 2595, 2357, 2809, + 2591, 2359, 2807, + 2587, 2362, 2805, + 2582, 2367, 2803, + 2574, 2372, 2799, + 2563, 2380, 2794, + 2549, 2390, 2788, + 2529, 2402, 2779, + 2501, 2419, 2767, + 2460, 2440, 2750, + 2400, 2467, 2727, + 2303, 2501, 2694, + 2131, 2543, 2645, + 1693, 2593, 2570, + 0, 2652, 2447, + 0, 2721, 2200, + 0, 2800, 714, + 0, 2887, 0, + 0, 2983, 0, + 0, 3085, 0, + 0, 3194, 0, + 0, 3308, 0, + 0, 3426, 0, + 0, 3547, 0, + 0, 3671, 0, + 2781, 2377, 2879, + 2781, 2377, 2879, + 2781, 2378, 2879, + 2780, 2378, 2878, + 2780, 2379, 2878, + 2779, 2380, 2877, + 2778, 2381, 2877, + 2776, 2383, 2876, + 2774, 2385, 2874, + 2771, 2388, 2873, + 2767, 2392, 2870, + 2762, 2398, 2867, + 2755, 2405, 2863, + 2746, 2414, 2858, + 2733, 2426, 2850, + 2715, 2442, 2840, + 2691, 2462, 2826, + 2655, 2488, 2806, + 2602, 2520, 2778, + 2521, 2560, 2738, + 2384, 2609, 2678, + 2092, 2666, 2584, + 0, 2733, 2415, + 0, 2810, 1999, + 0, 2895, 0, + 0, 2989, 0, + 0, 3091, 0, + 0, 3198, 0, + 0, 3311, 0, + 0, 3429, 0, + 0, 3549, 0, + 0, 3673, 0, + 2946, 2411, 2955, + 2945, 2411, 2955, + 2945, 2411, 2954, + 2945, 2412, 2954, + 2944, 2412, 2954, + 2944, 2413, 2953, + 2943, 2414, 2953, + 2942, 2416, 2952, + 2940, 2418, 2951, + 2939, 2421, 2950, + 2936, 2425, 2948, + 2932, 2430, 2945, + 2928, 2436, 2942, + 2921, 2445, 2937, + 2913, 2456, 2930, + 2901, 2471, 2922, + 2884, 2490, 2910, + 2861, 2514, 2894, + 2829, 2545, 2871, + 2781, 2583, 2838, + 2709, 2629, 2791, + 2589, 2684, 2719, + 2354, 2749, 2601, + 1291, 2823, 2369, + 0, 2906, 1378, + 0, 2998, 0, + 0, 3098, 0, + 0, 3204, 0, + 0, 3316, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3675, 0, + 3100, 2452, 3040, + 3100, 2452, 3040, + 3100, 2452, 3039, + 3100, 2453, 3039, + 3099, 2453, 3039, + 3099, 2454, 3039, + 3098, 2455, 3038, + 3098, 2457, 3037, + 3097, 2459, 3037, + 3095, 2461, 3035, + 3093, 2465, 3034, + 3091, 2469, 3032, + 3088, 2475, 3029, + 3083, 2483, 3025, + 3077, 2494, 3020, + 3069, 2507, 3013, + 3058, 2525, 3003, + 3042, 2547, 2990, + 3020, 2576, 2971, + 2990, 2611, 2945, + 2945, 2655, 2909, + 2878, 2707, 2854, + 2769, 2769, 2769, + 2564, 2840, 2622, + 1912, 2921, 2300, + 0, 3010, 0, + 0, 3107, 0, + 0, 3212, 0, + 0, 3322, 0, + 0, 3437, 0, + 0, 3555, 0, + 0, 3677, 0, + 3249, 2501, 3133, + 3248, 2502, 3133, + 3248, 2502, 3133, + 3248, 2502, 3133, + 3248, 2503, 3132, + 3248, 2504, 3132, + 3247, 2505, 3132, + 3247, 2506, 3131, + 3246, 2508, 3130, + 3245, 2510, 3129, + 3244, 2513, 3128, + 3242, 2517, 3126, + 3239, 2523, 3124, + 3236, 2530, 3121, + 3232, 2539, 3117, + 3226, 2552, 3111, + 3218, 2568, 3103, + 3207, 2588, 3093, + 3192, 2614, 3078, + 3172, 2647, 3058, + 3142, 2687, 3029, + 3100, 2736, 2988, + 3036, 2794, 2926, + 2934, 2862, 2828, + 2746, 2939, 2650, + 2226, 3025, 2186, + 0, 3120, 0, + 0, 3221, 0, + 0, 3329, 0, + 0, 3443, 0, + 0, 3560, 0, + 0, 3681, 0, + 3392, 2560, 3234, + 3392, 2561, 3234, + 3392, 2561, 3234, + 3392, 2561, 3233, + 3392, 2562, 3233, + 3392, 2562, 3233, + 3391, 2563, 3233, + 3391, 2564, 3232, + 3391, 2566, 3232, + 3390, 2568, 3231, + 3389, 2571, 3230, + 3388, 2574, 3229, + 3386, 2579, 3227, + 3383, 2586, 3224, + 3380, 2594, 3221, + 3376, 2605, 3216, + 3370, 2619, 3210, + 3363, 2637, 3202, + 3352, 2661, 3190, + 3338, 2691, 3175, + 3317, 2727, 3153, + 3289, 2772, 3121, + 3248, 2826, 3076, + 3187, 2890, 3008, + 3089, 2962, 2896, + 2913, 3045, 2685, + 2459, 3135, 1969, + 0, 3234, 0, + 0, 3339, 0, + 0, 3450, 0, + 0, 3566, 0, + 0, 3685, 0, + 3533, 2629, 3341, + 3533, 2629, 3341, + 3533, 2629, 3341, + 3533, 2630, 3341, + 3533, 2630, 3341, + 3533, 2631, 3340, + 3532, 2631, 3340, + 3532, 2632, 3340, + 3532, 2634, 3339, + 3531, 2636, 3339, + 3530, 2638, 3338, + 3530, 2641, 3337, + 3528, 2645, 3335, + 3527, 2651, 3333, + 3524, 2658, 3331, + 3521, 2668, 3327, + 3517, 2680, 3322, + 3512, 2696, 3316, + 3504, 2717, 3307, + 3494, 2743, 3295, + 3479, 2776, 3278, + 3460, 2817, 3255, + 3432, 2866, 3221, + 3392, 2924, 3173, + 3332, 2992, 3098, + 3237, 3069, 2974, + 3069, 3156, 2727, + 2654, 3251, 1192, + 0, 3353, 0, + 0, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3672, 2707, 3453, + 3672, 2707, 3453, + 3671, 2707, 3453, + 3671, 2708, 3453, + 3671, 2708, 3453, + 3671, 2709, 3453, + 3671, 2709, 3453, + 3671, 2710, 3453, + 3671, 2711, 3452, + 3670, 2713, 3452, + 3670, 2715, 3451, + 3669, 2717, 3450, + 3668, 2721, 3449, + 3667, 2725, 3448, + 3665, 2732, 3446, + 3663, 2740, 3443, + 3660, 2750, 3439, + 3656, 2764, 3434, + 3650, 2782, 3427, + 3643, 2805, 3418, + 3633, 2834, 3405, + 3619, 2870, 3388, + 3599, 2914, 3363, + 3572, 2967, 3328, + 3532, 3029, 3276, + 3474, 3101, 3196, + 3382, 3182, 3061, + 3218, 3272, 2778, + 2827, 3370, 0, + 0, 3474, 0, + 0, 3585, 0, + 0, 3700, 0, + 3808, 2794, 3570, + 3808, 2794, 3570, + 3808, 2794, 3570, + 3808, 2795, 3570, + 3808, 2795, 3570, + 3808, 2795, 3570, + 3808, 2796, 3570, + 3808, 2796, 3570, + 3808, 2797, 3569, + 3807, 2799, 3569, + 3807, 2800, 3569, + 3806, 2803, 3568, + 3806, 2805, 3567, + 3805, 2809, 3566, + 3804, 2814, 3564, + 3802, 2821, 3562, + 3800, 2830, 3559, + 3797, 2842, 3555, + 3793, 2857, 3550, + 3787, 2876, 3543, + 3780, 2901, 3533, + 3770, 2932, 3520, + 3756, 2971, 3502, + 3737, 3018, 3476, + 3710, 3074, 3440, + 3671, 3139, 3385, + 3613, 3214, 3301, + 3522, 3299, 3156, + 3363, 3391, 2839, + 2989, 3492, 0, + 0, 3598, 0, + 0, 3710, 0, + 3944, 2889, 3691, + 3944, 2889, 3691, + 3944, 2890, 3691, + 3944, 2890, 3691, + 3944, 2890, 3691, + 3944, 2890, 3691, + 3944, 2891, 3690, + 3943, 2891, 3690, + 3943, 2892, 3690, + 3943, 2893, 3690, + 3943, 2894, 3689, + 3942, 2896, 3689, + 3942, 2898, 3688, + 3941, 2902, 3687, + 3940, 2906, 3686, + 3939, 2911, 3684, + 3937, 2919, 3682, + 3935, 2928, 3679, + 3932, 2941, 3675, + 3928, 2957, 3670, + 3923, 2978, 3663, + 3916, 3004, 3653, + 3906, 3037, 3639, + 3892, 3078, 3620, + 3873, 3128, 3594, + 3846, 3186, 3556, + 3808, 3255, 3500, + 3750, 3332, 3412, + 3661, 3419, 3258, + 3504, 3514, 2909, + 3141, 3616, 0, + 0, 3724, 0, + 4079, 2992, 3814, + 4079, 2992, 3814, + 4078, 2992, 3814, + 4078, 2992, 3814, + 4078, 2992, 3814, + 4078, 2992, 3814, + 4078, 2993, 3814, + 4078, 2993, 3813, + 4078, 2994, 3813, + 4078, 2995, 3813, + 4078, 2996, 3813, + 4077, 2997, 3812, + 4077, 2999, 3812, + 4077, 3002, 3811, + 4076, 3005, 3810, + 4075, 3009, 3809, + 4074, 3015, 3807, + 4072, 3023, 3805, + 4070, 3033, 3802, + 4067, 3047, 3798, + 4063, 3064, 3793, + 4058, 3086, 3785, + 4050, 3114, 3775, + 4040, 3148, 3761, + 4027, 3191, 3742, + 4008, 3242, 3715, + 3981, 3303, 3676, + 3943, 3374, 3618, + 3886, 3453, 3527, + 3798, 3542, 3367, + 3643, 3639, 2988, + 3288, 3742, 0, + 4095, 3100, 3939, + 4095, 3100, 3939, + 4095, 3100, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3102, 3939, + 4095, 3103, 3939, + 4095, 3103, 3938, + 4095, 3105, 3938, + 4095, 3106, 3938, + 4095, 3108, 3937, + 4095, 3111, 3936, + 4095, 3114, 3936, + 4095, 3119, 3934, + 4095, 3125, 3933, + 4095, 3133, 3930, + 4095, 3144, 3927, + 4095, 3158, 3923, + 4095, 3176, 3918, + 4095, 3199, 3910, + 4095, 3228, 3900, + 4095, 3264, 3886, + 4095, 3308, 3866, + 4095, 3361, 3839, + 4095, 3424, 3799, + 4078, 3496, 3740, + 4021, 3577, 3646, + 3933, 3667, 3480, + 3780, 3765, 3076, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3215, 4066, + 4095, 3215, 4066, + 4095, 3215, 4066, + 4095, 3216, 4066, + 4095, 3216, 4066, + 4095, 3217, 4065, + 4095, 3218, 4065, + 4095, 3220, 4065, + 4095, 3222, 4064, + 4095, 3225, 4063, + 4095, 3229, 4062, + 4095, 3233, 4061, + 4095, 3240, 4059, + 4095, 3248, 4057, + 4095, 3259, 4054, + 4095, 3274, 4050, + 4095, 3292, 4044, + 4095, 3316, 4037, + 4095, 3346, 4026, + 4095, 3383, 4012, + 4095, 3429, 3992, + 4095, 3483, 3964, + 4095, 3547, 3924, + 4095, 3620, 3864, + 4095, 3703, 3768, + 4068, 3794, 3598, + 0, 2393, 2661, + 0, 2393, 2661, + 0, 2393, 2661, + 0, 2394, 2660, + 0, 2395, 2660, + 0, 2396, 2659, + 0, 2397, 2658, + 0, 2399, 2656, + 0, 2401, 2654, + 0, 2404, 2651, + 0, 2408, 2648, + 0, 2413, 2643, + 0, 2420, 2636, + 0, 2429, 2627, + 0, 2440, 2614, + 0, 2456, 2596, + 0, 2475, 2572, + 0, 2500, 2537, + 0, 2532, 2485, + 0, 2571, 2406, + 0, 2618, 2271, + 0, 2674, 1991, + 0, 2740, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 0, 2393, 2662, + 0, 2393, 2662, + 0, 2394, 2661, + 0, 2394, 2661, + 0, 2395, 2660, + 0, 2396, 2659, + 0, 2397, 2658, + 0, 2399, 2657, + 0, 2401, 2655, + 0, 2404, 2652, + 0, 2408, 2648, + 0, 2413, 2643, + 0, 2420, 2636, + 0, 2429, 2627, + 0, 2441, 2614, + 0, 2456, 2597, + 0, 2475, 2572, + 0, 2500, 2537, + 0, 2532, 2486, + 0, 2571, 2406, + 0, 2618, 2272, + 0, 2675, 1992, + 0, 2740, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 0, 2393, 2662, + 0, 2393, 2662, + 0, 2394, 2662, + 0, 2394, 2661, + 0, 2395, 2661, + 0, 2396, 2660, + 0, 2397, 2659, + 0, 2399, 2657, + 0, 2401, 2655, + 0, 2404, 2652, + 0, 2408, 2649, + 0, 2413, 2644, + 0, 2420, 2637, + 0, 2429, 2628, + 0, 2441, 2615, + 0, 2456, 2597, + 0, 2476, 2573, + 0, 2501, 2538, + 0, 2532, 2487, + 0, 2571, 2407, + 0, 2618, 2273, + 0, 2675, 1995, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 0, 2393, 2663, + 0, 2393, 2663, + 0, 2394, 2662, + 0, 2394, 2662, + 0, 2395, 2661, + 0, 2396, 2661, + 0, 2397, 2659, + 0, 2399, 2658, + 0, 2401, 2656, + 0, 2404, 2653, + 0, 2408, 2649, + 0, 2413, 2644, + 0, 2420, 2638, + 0, 2429, 2628, + 0, 2441, 2616, + 0, 2456, 2598, + 0, 2476, 2574, + 0, 2501, 2539, + 0, 2532, 2488, + 0, 2571, 2408, + 0, 2618, 2275, + 0, 2675, 1998, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3674, 0, + 0, 2393, 2664, + 0, 2394, 2664, + 0, 2394, 2663, + 0, 2395, 2663, + 0, 2395, 2662, + 0, 2396, 2661, + 0, 2398, 2660, + 0, 2399, 2659, + 0, 2401, 2657, + 0, 2404, 2654, + 0, 2408, 2650, + 0, 2413, 2645, + 0, 2420, 2639, + 0, 2429, 2629, + 0, 2441, 2617, + 0, 2456, 2599, + 0, 2476, 2575, + 0, 2501, 2540, + 0, 2532, 2489, + 0, 2571, 2410, + 0, 2618, 2277, + 0, 2675, 2002, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3674, 0, + 0, 2394, 2665, + 0, 2394, 2665, + 0, 2394, 2665, + 0, 2395, 2664, + 0, 2396, 2664, + 0, 2397, 2663, + 0, 2398, 2662, + 0, 2399, 2660, + 0, 2402, 2658, + 0, 2405, 2655, + 0, 2409, 2652, + 0, 2414, 2647, + 0, 2421, 2640, + 0, 2430, 2631, + 0, 2441, 2618, + 0, 2457, 2601, + 0, 2476, 2576, + 0, 2501, 2542, + 0, 2533, 2491, + 0, 2571, 2412, + 0, 2619, 2280, + 0, 2675, 2007, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2394, 2667, + 0, 2394, 2667, + 0, 2395, 2666, + 0, 2395, 2666, + 0, 2396, 2665, + 0, 2397, 2664, + 0, 2398, 2663, + 0, 2400, 2662, + 0, 2402, 2660, + 0, 2405, 2657, + 0, 2409, 2653, + 0, 2414, 2648, + 0, 2421, 2642, + 0, 2430, 2633, + 0, 2442, 2620, + 0, 2457, 2603, + 0, 2477, 2579, + 0, 2501, 2544, + 0, 2533, 2493, + 0, 2572, 2415, + 0, 2619, 2284, + 0, 2675, 2014, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2395, 2669, + 0, 2395, 2669, + 0, 2395, 2669, + 0, 2396, 2668, + 0, 2397, 2668, + 0, 2398, 2667, + 0, 2399, 2666, + 0, 2400, 2664, + 0, 2403, 2662, + 0, 2406, 2659, + 0, 2410, 2656, + 0, 2415, 2651, + 0, 2422, 2644, + 0, 2430, 2635, + 0, 2442, 2623, + 0, 2457, 2605, + 0, 2477, 2581, + 0, 2502, 2547, + 0, 2533, 2497, + 0, 2572, 2419, + 0, 2619, 2289, + 0, 2676, 2024, + 0, 2741, 0, + 0, 2817, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3095, 0, + 0, 3201, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2395, 2672, + 0, 2396, 2672, + 0, 2396, 2672, + 0, 2397, 2671, + 0, 2397, 2670, + 0, 2398, 2670, + 0, 2400, 2669, + 0, 2401, 2667, + 0, 2403, 2665, + 0, 2406, 2662, + 0, 2410, 2659, + 0, 2415, 2654, + 0, 2422, 2647, + 0, 2431, 2638, + 0, 2443, 2626, + 0, 2458, 2609, + 0, 2478, 2585, + 0, 2503, 2551, + 0, 2534, 2501, + 0, 2573, 2424, + 0, 2620, 2296, + 0, 2676, 2036, + 0, 2742, 0, + 0, 2817, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2397, 2676, + 0, 2397, 2676, + 0, 2397, 2676, + 0, 2398, 2675, + 0, 2398, 2674, + 0, 2399, 2674, + 0, 2401, 2673, + 0, 2402, 2671, + 0, 2404, 2669, + 0, 2407, 2666, + 0, 2411, 2663, + 0, 2416, 2658, + 0, 2423, 2651, + 0, 2432, 2642, + 0, 2444, 2630, + 0, 2459, 2613, + 0, 2478, 2590, + 0, 2503, 2556, + 0, 2535, 2507, + 0, 2573, 2431, + 0, 2620, 2305, + 0, 2677, 2052, + 0, 2742, 0, + 0, 2817, 0, + 0, 2902, 0, + 0, 2995, 0, + 0, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2398, 2681, + 0, 2398, 2681, + 0, 2399, 2681, + 0, 2399, 2680, + 0, 2400, 2680, + 0, 2401, 2679, + 0, 2402, 2678, + 0, 2404, 2676, + 0, 2406, 2674, + 0, 2409, 2672, + 0, 2413, 2668, + 0, 2418, 2663, + 0, 2424, 2657, + 0, 2433, 2648, + 0, 2445, 2636, + 0, 2460, 2619, + 0, 2480, 2596, + 0, 2504, 2563, + 0, 2536, 2514, + 0, 2574, 2440, + 0, 2621, 2317, + 0, 2677, 2072, + 0, 2743, 674, + 0, 2818, 0, + 0, 2902, 0, + 0, 2995, 0, + 0, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2400, 2688, + 0, 2400, 2688, + 0, 2400, 2688, + 0, 2401, 2687, + 0, 2402, 2687, + 0, 2402, 2686, + 0, 2404, 2685, + 0, 2405, 2683, + 0, 2408, 2681, + 0, 2410, 2679, + 0, 2414, 2675, + 0, 2419, 2671, + 0, 2426, 2664, + 0, 2435, 2656, + 0, 2447, 2644, + 0, 2462, 2627, + 0, 2481, 2604, + 0, 2506, 2572, + 0, 2537, 2524, + 0, 2575, 2452, + 0, 2622, 2332, + 0, 2678, 2098, + 0, 2744, 1046, + 0, 2819, 0, + 0, 2903, 0, + 0, 2995, 0, + 0, 3096, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2402, 2697, + 0, 2402, 2697, + 0, 2403, 2697, + 0, 2403, 2696, + 0, 2404, 2696, + 0, 2405, 2695, + 0, 2406, 2694, + 0, 2408, 2693, + 0, 2410, 2691, + 0, 2413, 2688, + 0, 2417, 2685, + 0, 2422, 2680, + 0, 2428, 2674, + 0, 2437, 2665, + 0, 2449, 2654, + 0, 2464, 2638, + 0, 2483, 2615, + 0, 2508, 2583, + 0, 2539, 2537, + 0, 2577, 2467, + 0, 2624, 2352, + 0, 2680, 2130, + 0, 2745, 1300, + 0, 2820, 0, + 0, 2904, 0, + 0, 2996, 0, + 0, 3096, 0, + 0, 3203, 0, + 0, 3315, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2405, 2709, + 0, 2406, 2709, + 0, 2406, 2709, + 0, 2406, 2708, + 0, 2407, 2708, + 0, 2408, 2707, + 0, 2409, 2706, + 0, 2411, 2705, + 0, 2413, 2703, + 0, 2416, 2700, + 0, 2420, 2697, + 0, 2425, 2692, + 0, 2431, 2686, + 0, 2440, 2678, + 0, 2452, 2667, + 0, 2467, 2651, + 0, 2486, 2629, + 0, 2510, 2599, + 0, 2541, 2554, + 0, 2579, 2486, + 0, 2626, 2377, + 0, 2681, 2170, + 0, 2746, 1506, + 0, 2821, 0, + 0, 2905, 0, + 0, 2997, 0, + 0, 3097, 0, + 0, 3203, 0, + 0, 3315, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2410, 2725, + 0, 2410, 2724, + 0, 2410, 2724, + 0, 2411, 2724, + 0, 2411, 2723, + 0, 2412, 2722, + 0, 2413, 2721, + 0, 2415, 2720, + 0, 2417, 2718, + 0, 2420, 2716, + 0, 2424, 2713, + 0, 2429, 2708, + 0, 2435, 2702, + 0, 2444, 2694, + 0, 2456, 2684, + 0, 2470, 2669, + 0, 2489, 2648, + 0, 2514, 2618, + 0, 2544, 2575, + 0, 2582, 2511, + 0, 2628, 2408, + 0, 2684, 2219, + 0, 2748, 1686, + 0, 2823, 0, + 0, 2906, 0, + 0, 2998, 0, + 0, 3098, 0, + 0, 3204, 0, + 0, 3316, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3675, 0, + 0, 2415, 2744, + 0, 2415, 2744, + 0, 2416, 2744, + 0, 2416, 2744, + 0, 2417, 2743, + 0, 2418, 2742, + 0, 2419, 2741, + 0, 2421, 2740, + 0, 2423, 2738, + 0, 2426, 2736, + 0, 2429, 2733, + 0, 2434, 2729, + 0, 2441, 2723, + 0, 2449, 2716, + 0, 2461, 2705, + 0, 2475, 2691, + 0, 2494, 2671, + 0, 2518, 2643, + 0, 2548, 2603, + 0, 2586, 2543, + 0, 2632, 2447, + 0, 2687, 2277, + 0, 2751, 1851, + 0, 2825, 0, + 0, 2908, 0, + 0, 3000, 0, + 0, 3099, 0, + 0, 3205, 0, + 0, 3316, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3675, 0, + 896, 2423, 2770, + 879, 2423, 2769, + 854, 2423, 2769, + 820, 2424, 2769, + 769, 2424, 2768, + 691, 2425, 2768, + 560, 2426, 2767, + 290, 2428, 2766, + 0, 2430, 2764, + 0, 2433, 2762, + 0, 2436, 2759, + 0, 2441, 2755, + 0, 2448, 2750, + 0, 2456, 2742, + 0, 2467, 2733, + 0, 2482, 2719, + 0, 2500, 2701, + 0, 2524, 2674, + 0, 2554, 2637, + 0, 2591, 2581, + 0, 2636, 2494, + 0, 2691, 2344, + 0, 2755, 2007, + 0, 2828, 0, + 0, 2910, 0, + 0, 3002, 0, + 0, 3101, 0, + 0, 3206, 0, + 0, 3317, 0, + 0, 3433, 0, + 0, 3553, 0, + 0, 3675, 0, + 1925, 2432, 2801, + 1923, 2432, 2801, + 1921, 2433, 2801, + 1917, 2433, 2801, + 1913, 2434, 2800, + 1907, 2435, 2799, + 1899, 2436, 2799, + 1889, 2438, 2798, + 1874, 2440, 2796, + 1853, 2442, 2794, + 1824, 2446, 2791, + 1782, 2451, 2788, + 1718, 2457, 2783, + 1617, 2465, 2776, + 1432, 2476, 2767, + 925, 2490, 2754, + 0, 2508, 2737, + 0, 2532, 2713, + 0, 2561, 2679, + 0, 2598, 2628, + 0, 2642, 2551, + 0, 2696, 2421, + 0, 2759, 2155, + 0, 2832, 0, + 0, 2914, 0, + 0, 3004, 0, + 0, 3103, 0, + 0, 3208, 0, + 0, 3319, 0, + 0, 3434, 0, + 0, 3554, 0, + 0, 3676, 0, + 2283, 2445, 2841, + 2282, 2445, 2840, + 2281, 2445, 2840, + 2279, 2446, 2840, + 2278, 2447, 2839, + 2275, 2447, 2839, + 2271, 2449, 2838, + 2267, 2450, 2837, + 2260, 2452, 2836, + 2252, 2455, 2834, + 2240, 2458, 2831, + 2223, 2463, 2828, + 2200, 2469, 2823, + 2168, 2477, 2817, + 2120, 2488, 2809, + 2047, 2501, 2798, + 1927, 2519, 2782, + 1692, 2542, 2760, + 612, 2571, 2729, + 0, 2607, 2685, + 0, 2650, 2617, + 0, 2703, 2507, + 0, 2765, 2299, + 0, 2837, 1624, + 0, 2918, 0, + 0, 3008, 0, + 0, 3106, 0, + 0, 3210, 0, + 0, 3321, 0, + 0, 3436, 0, + 0, 3555, 0, + 0, 3677, 0, + 2532, 2461, 2888, + 2531, 2462, 2888, + 2531, 2462, 2888, + 2530, 2462, 2887, + 2529, 2463, 2887, + 2527, 2464, 2887, + 2525, 2465, 2886, + 2522, 2466, 2885, + 2519, 2468, 2884, + 2514, 2471, 2882, + 2507, 2474, 2880, + 2498, 2479, 2877, + 2486, 2484, 2873, + 2469, 2492, 2867, + 2445, 2503, 2860, + 2411, 2516, 2850, + 2360, 2533, 2836, + 2283, 2555, 2817, + 2155, 2583, 2789, + 1893, 2618, 2750, + 0, 2661, 2692, + 0, 2713, 2601, + 0, 2774, 2440, + 0, 2844, 2059, + 0, 2924, 0, + 0, 3013, 0, + 0, 3110, 0, + 0, 3213, 0, + 0, 3323, 0, + 0, 3438, 0, + 0, 3556, 0, + 0, 3678, 0, + 2735, 2482, 2945, + 2735, 2483, 2945, + 2734, 2483, 2945, + 2734, 2483, 2944, + 2733, 2484, 2944, + 2732, 2485, 2944, + 2731, 2486, 2943, + 2729, 2487, 2942, + 2727, 2489, 2941, + 2724, 2491, 2940, + 2719, 2495, 2938, + 2714, 2499, 2935, + 2706, 2504, 2931, + 2696, 2512, 2927, + 2681, 2522, 2920, + 2661, 2535, 2911, + 2633, 2551, 2899, + 2592, 2572, 2882, + 2532, 2599, 2859, + 2435, 2633, 2826, + 2263, 2675, 2777, + 1825, 2725, 2702, + 0, 2784, 2579, + 0, 2853, 2332, + 0, 2932, 847, + 0, 3019, 0, + 0, 3115, 0, + 0, 3217, 0, + 0, 3326, 0, + 0, 3440, 0, + 0, 3558, 0, + 0, 3679, 0, + 2914, 2509, 3011, + 2913, 2509, 3011, + 2913, 2510, 3011, + 2913, 2510, 3011, + 2912, 2510, 3010, + 2912, 2511, 3010, + 2911, 2512, 3009, + 2910, 2513, 3009, + 2908, 2515, 3008, + 2906, 2517, 3007, + 2903, 2521, 3005, + 2900, 2525, 3003, + 2894, 2530, 3000, + 2888, 2537, 2995, + 2878, 2546, 2990, + 2865, 2558, 2982, + 2848, 2574, 2972, + 2823, 2594, 2958, + 2787, 2620, 2938, + 2735, 2652, 2910, + 2653, 2692, 2870, + 2516, 2741, 2810, + 2224, 2798, 2716, + 0, 2865, 2547, + 0, 2942, 2131, + 0, 3028, 0, + 0, 3122, 0, + 0, 3223, 0, + 0, 3331, 0, + 0, 3443, 0, + 0, 3561, 0, + 0, 3681, 0, + 3078, 2542, 3087, + 3078, 2543, 3087, + 3077, 2543, 3087, + 3077, 2543, 3087, + 3077, 2544, 3086, + 3076, 2544, 3086, + 3076, 2545, 3086, + 3075, 2547, 3085, + 3074, 2548, 3084, + 3073, 2550, 3083, + 3071, 2553, 3082, + 3068, 2557, 3080, + 3064, 2562, 3077, + 3060, 2569, 3074, + 3053, 2577, 3069, + 3045, 2589, 3063, + 3033, 2603, 3054, + 3016, 2622, 3042, + 2993, 2647, 3026, + 2961, 2677, 3003, + 2913, 2715, 2971, + 2841, 2761, 2923, + 2721, 2816, 2851, + 2486, 2881, 2733, + 1423, 2955, 2501, + 0, 3039, 1510, + 0, 3130, 0, + 0, 3230, 0, + 0, 3336, 0, + 0, 3448, 0, + 0, 3564, 0, + 0, 3684, 0, + 3232, 2584, 3172, + 3232, 2584, 3172, + 3232, 2584, 3172, + 3232, 2584, 3172, + 3232, 2585, 3171, + 3232, 2585, 3171, + 3231, 2586, 3171, + 3231, 2587, 3170, + 3230, 2589, 3170, + 3229, 2591, 3169, + 3227, 2593, 3167, + 3226, 2597, 3166, + 3223, 2601, 3164, + 3220, 2607, 3161, + 3215, 2615, 3157, + 3209, 2626, 3152, + 3201, 2639, 3145, + 3190, 2657, 3135, + 3174, 2680, 3122, + 3152, 2708, 3103, + 3122, 2743, 3078, + 3077, 2787, 3041, + 3010, 2839, 2986, + 2901, 2901, 2901, + 2696, 2972, 2754, + 2044, 3053, 2432, + 0, 3142, 0, + 0, 3239, 0, + 0, 3344, 0, + 0, 3454, 0, + 0, 3569, 0, + 0, 3687, 0, + 3381, 2633, 3265, + 3381, 2634, 3265, + 3381, 2634, 3265, + 3380, 2634, 3265, + 3380, 2634, 3265, + 3380, 2635, 3265, + 3380, 2636, 3264, + 3379, 2637, 3264, + 3379, 2638, 3263, + 3378, 2640, 3263, + 3377, 2642, 3262, + 3376, 2645, 3260, + 3374, 2649, 3259, + 3372, 2655, 3256, + 3368, 2662, 3253, + 3364, 2671, 3249, + 3358, 2684, 3243, + 3350, 2700, 3235, + 3339, 2720, 3225, + 3324, 2746, 3210, + 3304, 2779, 3190, + 3274, 2819, 3161, + 3232, 2868, 3120, + 3168, 2926, 3058, + 3066, 2994, 2960, + 2879, 3071, 2782, + 2358, 3157, 2318, + 0, 3252, 0, + 0, 3353, 0, + 0, 3461, 0, + 0, 3575, 0, + 0, 3692, 0, + 3525, 2692, 3366, + 3525, 2693, 3366, + 3524, 2693, 3366, + 3524, 2693, 3366, + 3524, 2693, 3366, + 3524, 2694, 3365, + 3524, 2695, 3365, + 3524, 2695, 3365, + 3523, 2697, 3364, + 3523, 2698, 3364, + 3522, 2700, 3363, + 3521, 2703, 3362, + 3520, 2707, 3361, + 3518, 2711, 3359, + 3516, 2718, 3356, + 3512, 2726, 3353, + 3508, 2737, 3348, + 3503, 2751, 3342, + 3495, 2770, 3334, + 3484, 2793, 3322, + 3470, 2823, 3307, + 3450, 2859, 3285, + 3421, 2904, 3254, + 3380, 2958, 3208, + 3319, 3022, 3140, + 3221, 3095, 3028, + 3045, 3177, 2817, + 2591, 3268, 2101, + 0, 3366, 0, + 0, 3471, 0, + 0, 3582, 0, + 0, 3698, 0, + 3665, 2761, 3473, + 3665, 2761, 3473, + 3665, 2761, 3473, + 3665, 2762, 3473, + 3665, 2762, 3473, + 3665, 2762, 3473, + 3665, 2763, 3472, + 3665, 2764, 3472, + 3664, 2765, 3472, + 3664, 2766, 3471, + 3663, 2768, 3471, + 3663, 2770, 3470, + 3662, 2773, 3469, + 3660, 2777, 3467, + 3659, 2783, 3465, + 3656, 2790, 3463, + 3653, 2800, 3459, + 3649, 2812, 3454, + 3644, 2828, 3448, + 3636, 2849, 3439, + 3626, 2875, 3427, + 3611, 2908, 3410, + 3592, 2949, 3387, + 3564, 2998, 3353, + 3524, 3056, 3305, + 3464, 3124, 3230, + 3370, 3202, 3106, + 3201, 3288, 2859, + 2786, 3383, 1324, + 0, 3485, 0, + 0, 3593, 0, + 0, 3706, 0, + 3804, 2839, 3586, + 3804, 2839, 3586, + 3804, 2839, 3586, + 3804, 2840, 3585, + 3803, 2840, 3585, + 3803, 2840, 3585, + 3803, 2841, 3585, + 3803, 2841, 3585, + 3803, 2842, 3585, + 3803, 2843, 3584, + 3802, 2845, 3584, + 3802, 2847, 3583, + 3801, 2849, 3582, + 3800, 2853, 3581, + 3799, 2858, 3580, + 3797, 2864, 3578, + 3795, 2872, 3575, + 3792, 2882, 3571, + 3788, 2896, 3566, + 3782, 2914, 3559, + 3775, 2937, 3550, + 3765, 2966, 3537, + 3751, 3002, 3520, + 3731, 3046, 3495, + 3704, 3099, 3460, + 3665, 3161, 3408, + 3606, 3233, 3328, + 3514, 3314, 3193, + 3351, 3404, 2910, + 2960, 3502, 0, + 0, 3606, 0, + 0, 3717, 0, + 3940, 2926, 3703, + 3940, 2926, 3702, + 3940, 2926, 3702, + 3940, 2926, 3702, + 3940, 2927, 3702, + 3940, 2927, 3702, + 3940, 2927, 3702, + 3940, 2928, 3702, + 3940, 2929, 3702, + 3940, 2930, 3702, + 3939, 2931, 3701, + 3939, 2932, 3701, + 3938, 2935, 3700, + 3938, 2938, 3699, + 3937, 2941, 3698, + 3936, 2947, 3696, + 3934, 2953, 3694, + 3932, 2962, 3691, + 3929, 2974, 3687, + 3925, 2989, 3682, + 3919, 3008, 3675, + 3912, 3033, 3666, + 3902, 3064, 3652, + 3888, 3103, 3634, + 3869, 3150, 3608, + 3842, 3206, 3572, + 3803, 3271, 3517, + 3745, 3347, 3433, + 3654, 3431, 3288, + 3495, 3523, 2971, + 3121, 3624, 0, + 0, 3730, 0, + 4076, 3021, 3823, + 4076, 3021, 3823, + 4076, 3021, 3823, + 4076, 3022, 3823, + 4076, 3022, 3823, + 4076, 3022, 3823, + 4076, 3022, 3823, + 4076, 3023, 3822, + 4076, 3023, 3822, + 4075, 3024, 3822, + 4075, 3025, 3822, + 4075, 3026, 3821, + 4075, 3028, 3821, + 4074, 3031, 3820, + 4073, 3034, 3819, + 4072, 3038, 3818, + 4071, 3043, 3817, + 4070, 3051, 3814, + 4067, 3060, 3811, + 4064, 3073, 3807, + 4060, 3089, 3802, + 4055, 3110, 3795, + 4048, 3136, 3785, + 4038, 3170, 3771, + 4024, 3210, 3753, + 4005, 3260, 3726, + 3978, 3318, 3688, + 3940, 3387, 3632, + 3883, 3464, 3544, + 3793, 3551, 3390, + 3636, 3646, 3041, + 3273, 3748, 0, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3125, 3946, + 4095, 3125, 3946, + 4095, 3125, 3946, + 4095, 3126, 3945, + 4095, 3127, 3945, + 4095, 3128, 3945, + 4095, 3129, 3945, + 4095, 3131, 3944, + 4095, 3134, 3943, + 4095, 3137, 3942, + 4095, 3142, 3941, + 4095, 3147, 3940, + 4095, 3155, 3937, + 4095, 3165, 3934, + 4095, 3179, 3930, + 4095, 3196, 3925, + 4095, 3218, 3917, + 4095, 3246, 3907, + 4095, 3280, 3893, + 4095, 3323, 3874, + 4095, 3375, 3847, + 4095, 3435, 3808, + 4075, 3506, 3750, + 4019, 3586, 3659, + 3930, 3674, 3499, + 3775, 3771, 3120, + 4095, 3232, 4071, + 4095, 3232, 4071, + 4095, 3232, 4071, + 4095, 3232, 4071, + 4095, 3233, 4071, + 4095, 3233, 4071, + 4095, 3233, 4071, + 4095, 3233, 4071, + 4095, 3234, 4071, + 4095, 3234, 4071, + 4095, 3235, 4071, + 4095, 3236, 4070, + 4095, 3237, 4070, + 4095, 3238, 4070, + 4095, 3240, 4069, + 4095, 3243, 4069, + 4095, 3246, 4068, + 4095, 3251, 4066, + 4095, 3257, 4065, + 4095, 3265, 4062, + 4095, 3276, 4059, + 4095, 3290, 4055, + 4095, 3308, 4050, + 4095, 3331, 4042, + 4095, 3360, 4032, + 4095, 3396, 4018, + 4095, 3440, 3998, + 4095, 3493, 3971, + 4095, 3556, 3931, + 4095, 3628, 3872, + 4095, 3709, 3778, + 4065, 3799, 3612, + 0, 2525, 2793, + 0, 2525, 2793, + 0, 2525, 2793, + 0, 2525, 2793, + 0, 2526, 2792, + 0, 2527, 2792, + 0, 2528, 2791, + 0, 2529, 2790, + 0, 2531, 2788, + 0, 2533, 2786, + 0, 2536, 2783, + 0, 2540, 2779, + 0, 2545, 2774, + 0, 2552, 2768, + 0, 2561, 2758, + 0, 2572, 2746, + 0, 2588, 2728, + 0, 2607, 2704, + 0, 2632, 2668, + 0, 2664, 2617, + 0, 2703, 2537, + 0, 2750, 2402, + 0, 2807, 2121, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3445, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2525, 2793, + 0, 2526, 2793, + 0, 2526, 2792, + 0, 2527, 2792, + 0, 2528, 2791, + 0, 2529, 2790, + 0, 2531, 2788, + 0, 2533, 2786, + 0, 2536, 2783, + 0, 2540, 2780, + 0, 2545, 2775, + 0, 2552, 2768, + 0, 2561, 2759, + 0, 2573, 2746, + 0, 2588, 2728, + 0, 2607, 2704, + 0, 2632, 2669, + 0, 2664, 2617, + 0, 2703, 2538, + 0, 2750, 2403, + 0, 2807, 2123, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2526, 2793, + 0, 2526, 2793, + 0, 2527, 2792, + 0, 2528, 2791, + 0, 2529, 2790, + 0, 2531, 2789, + 0, 2533, 2787, + 0, 2536, 2784, + 0, 2540, 2780, + 0, 2545, 2775, + 0, 2552, 2768, + 0, 2561, 2759, + 0, 2573, 2746, + 0, 2588, 2729, + 0, 2608, 2704, + 0, 2633, 2669, + 0, 2664, 2618, + 0, 2703, 2538, + 0, 2750, 2404, + 0, 2807, 2124, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2795, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2526, 2794, + 0, 2526, 2793, + 0, 2527, 2793, + 0, 2528, 2792, + 0, 2529, 2791, + 0, 2531, 2789, + 0, 2533, 2787, + 0, 2536, 2784, + 0, 2540, 2781, + 0, 2545, 2776, + 0, 2552, 2769, + 0, 2561, 2760, + 0, 2573, 2747, + 0, 2588, 2730, + 0, 2608, 2705, + 0, 2633, 2670, + 0, 2664, 2619, + 0, 2703, 2539, + 0, 2750, 2405, + 0, 2807, 2127, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2795, + 0, 2525, 2795, + 0, 2526, 2795, + 0, 2526, 2795, + 0, 2526, 2794, + 0, 2527, 2793, + 0, 2528, 2793, + 0, 2529, 2791, + 0, 2531, 2790, + 0, 2533, 2788, + 0, 2536, 2785, + 0, 2540, 2781, + 0, 2545, 2776, + 0, 2552, 2770, + 0, 2561, 2760, + 0, 2573, 2748, + 0, 2588, 2730, + 0, 2608, 2706, + 0, 2633, 2671, + 0, 2664, 2620, + 0, 2703, 2540, + 0, 2750, 2407, + 0, 2807, 2130, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2796, + 0, 2526, 2796, + 0, 2526, 2796, + 0, 2526, 2795, + 0, 2527, 2795, + 0, 2527, 2794, + 0, 2528, 2794, + 0, 2530, 2792, + 0, 2531, 2791, + 0, 2533, 2789, + 0, 2536, 2786, + 0, 2540, 2782, + 0, 2546, 2777, + 0, 2552, 2771, + 0, 2561, 2761, + 0, 2573, 2749, + 0, 2588, 2731, + 0, 2608, 2707, + 0, 2633, 2672, + 0, 2664, 2621, + 0, 2703, 2542, + 0, 2751, 2409, + 0, 2807, 2134, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2526, 2798, + 0, 2526, 2797, + 0, 2526, 2797, + 0, 2527, 2797, + 0, 2527, 2796, + 0, 2528, 2796, + 0, 2529, 2795, + 0, 2530, 2794, + 0, 2532, 2792, + 0, 2534, 2790, + 0, 2537, 2787, + 0, 2541, 2784, + 0, 2546, 2779, + 0, 2553, 2772, + 0, 2562, 2763, + 0, 2573, 2750, + 0, 2589, 2733, + 0, 2608, 2709, + 0, 2633, 2674, + 0, 2665, 2623, + 0, 2703, 2544, + 0, 2751, 2412, + 0, 2807, 2139, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2526, 2799, + 0, 2526, 2799, + 0, 2527, 2799, + 0, 2527, 2798, + 0, 2527, 2798, + 0, 2528, 2797, + 0, 2529, 2797, + 0, 2530, 2795, + 0, 2532, 2794, + 0, 2534, 2792, + 0, 2537, 2789, + 0, 2541, 2785, + 0, 2546, 2780, + 0, 2553, 2774, + 0, 2562, 2765, + 0, 2574, 2752, + 0, 2589, 2735, + 0, 2609, 2711, + 0, 2634, 2676, + 0, 2665, 2625, + 0, 2704, 2547, + 0, 2751, 2416, + 0, 2807, 2146, + 0, 2873, 0, + 0, 2949, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2527, 2801, + 0, 2527, 2801, + 0, 2527, 2801, + 0, 2528, 2801, + 0, 2528, 2800, + 0, 2529, 2800, + 0, 2530, 2799, + 0, 2531, 2798, + 0, 2533, 2796, + 0, 2535, 2794, + 0, 2538, 2791, + 0, 2542, 2788, + 0, 2547, 2783, + 0, 2554, 2776, + 0, 2563, 2767, + 0, 2574, 2755, + 0, 2590, 2737, + 0, 2609, 2713, + 0, 2634, 2679, + 0, 2665, 2629, + 0, 2704, 2551, + 0, 2751, 2421, + 0, 2808, 2156, + 0, 2873, 0, + 0, 2949, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3227, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2527, 2804, + 0, 2528, 2804, + 0, 2528, 2804, + 0, 2528, 2804, + 0, 2529, 2803, + 0, 2529, 2803, + 0, 2530, 2802, + 0, 2532, 2801, + 0, 2533, 2799, + 0, 2536, 2797, + 0, 2538, 2794, + 0, 2542, 2791, + 0, 2548, 2786, + 0, 2554, 2779, + 0, 2563, 2770, + 0, 2575, 2758, + 0, 2590, 2741, + 0, 2610, 2717, + 0, 2635, 2683, + 0, 2666, 2633, + 0, 2705, 2556, + 0, 2752, 2428, + 0, 2808, 2168, + 0, 2874, 0, + 0, 2949, 0, + 0, 3034, 0, + 0, 3126, 0, + 0, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2528, 2808, + 0, 2529, 2808, + 0, 2529, 2808, + 0, 2529, 2808, + 0, 2530, 2807, + 0, 2531, 2807, + 0, 2531, 2806, + 0, 2533, 2805, + 0, 2534, 2803, + 0, 2537, 2801, + 0, 2539, 2799, + 0, 2543, 2795, + 0, 2549, 2790, + 0, 2555, 2783, + 0, 2564, 2775, + 0, 2576, 2762, + 0, 2591, 2745, + 0, 2611, 2722, + 0, 2635, 2688, + 0, 2667, 2639, + 0, 2705, 2563, + 0, 2752, 2437, + 0, 2809, 2184, + 0, 2874, 0, + 0, 2949, 0, + 0, 3034, 0, + 0, 3127, 0, + 0, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2530, 2814, + 0, 2530, 2813, + 0, 2530, 2813, + 0, 2531, 2813, + 0, 2531, 2812, + 0, 2532, 2812, + 0, 2533, 2811, + 0, 2534, 2810, + 0, 2536, 2808, + 0, 2538, 2806, + 0, 2541, 2804, + 0, 2545, 2800, + 0, 2550, 2795, + 0, 2557, 2789, + 0, 2565, 2780, + 0, 2577, 2768, + 0, 2592, 2751, + 0, 2612, 2728, + 0, 2636, 2695, + 0, 2668, 2646, + 0, 2706, 2572, + 0, 2753, 2449, + 0, 2809, 2204, + 0, 2875, 806, + 0, 2950, 0, + 0, 3034, 0, + 0, 3127, 0, + 0, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2532, 2821, + 0, 2532, 2820, + 0, 2532, 2820, + 0, 2532, 2820, + 0, 2533, 2819, + 0, 2534, 2819, + 0, 2535, 2818, + 0, 2536, 2817, + 0, 2537, 2815, + 0, 2540, 2814, + 0, 2543, 2811, + 0, 2546, 2807, + 0, 2552, 2803, + 0, 2558, 2796, + 0, 2567, 2788, + 0, 2579, 2776, + 0, 2594, 2759, + 0, 2613, 2736, + 0, 2638, 2704, + 0, 2669, 2656, + 0, 2708, 2584, + 0, 2754, 2464, + 0, 2810, 2230, + 0, 2876, 1179, + 0, 2951, 0, + 0, 3035, 0, + 0, 3128, 0, + 0, 3228, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2534, 2830, + 0, 2534, 2829, + 0, 2534, 2829, + 0, 2535, 2829, + 0, 2535, 2828, + 0, 2536, 2828, + 0, 2537, 2827, + 0, 2538, 2826, + 0, 2540, 2825, + 0, 2542, 2823, + 0, 2545, 2820, + 0, 2549, 2817, + 0, 2554, 2812, + 0, 2561, 2806, + 0, 2569, 2797, + 0, 2581, 2786, + 0, 2596, 2770, + 0, 2615, 2747, + 0, 2640, 2716, + 0, 2671, 2669, + 0, 2709, 2599, + 0, 2756, 2484, + 0, 2812, 2263, + 0, 2877, 1432, + 0, 2952, 0, + 0, 3036, 0, + 0, 3128, 0, + 0, 3228, 0, + 0, 3335, 0, + 0, 3447, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2537, 2842, + 0, 2537, 2841, + 0, 2538, 2841, + 0, 2538, 2841, + 0, 2539, 2840, + 0, 2539, 2840, + 0, 2540, 2839, + 0, 2541, 2838, + 0, 2543, 2837, + 0, 2545, 2835, + 0, 2548, 2832, + 0, 2552, 2829, + 0, 2557, 2824, + 0, 2564, 2818, + 0, 2572, 2810, + 0, 2584, 2799, + 0, 2599, 2783, + 0, 2618, 2761, + 0, 2642, 2731, + 0, 2673, 2686, + 0, 2711, 2618, + 0, 2758, 2509, + 0, 2813, 2303, + 0, 2878, 1638, + 0, 2953, 0, + 0, 3037, 0, + 0, 3129, 0, + 0, 3229, 0, + 0, 3335, 0, + 0, 3447, 0, + 0, 3564, 0, + 0, 3684, 0, + 0, 2541, 2857, + 0, 2542, 2857, + 0, 2542, 2857, + 0, 2542, 2856, + 0, 2543, 2856, + 0, 2543, 2855, + 0, 2544, 2854, + 0, 2546, 2854, + 0, 2547, 2852, + 0, 2549, 2850, + 0, 2552, 2848, + 0, 2556, 2845, + 0, 2561, 2840, + 0, 2568, 2835, + 0, 2576, 2827, + 0, 2588, 2816, + 0, 2602, 2801, + 0, 2621, 2780, + 0, 2646, 2750, + 0, 2676, 2708, + 0, 2714, 2643, + 0, 2760, 2540, + 0, 2816, 2351, + 0, 2880, 1818, + 0, 2955, 0, + 0, 3038, 0, + 0, 3130, 0, + 0, 3230, 0, + 0, 3336, 0, + 0, 3448, 0, + 0, 3564, 0, + 0, 3684, 0, + 0, 2547, 2877, + 0, 2547, 2877, + 0, 2547, 2876, + 0, 2548, 2876, + 0, 2548, 2876, + 0, 2549, 2875, + 0, 2550, 2874, + 0, 2551, 2873, + 0, 2553, 2872, + 0, 2555, 2870, + 0, 2558, 2868, + 0, 2561, 2865, + 0, 2566, 2861, + 0, 2573, 2855, + 0, 2581, 2848, + 0, 2593, 2837, + 0, 2607, 2823, + 0, 2626, 2803, + 0, 2650, 2775, + 0, 2680, 2735, + 0, 2718, 2675, + 0, 2764, 2579, + 0, 2819, 2409, + 0, 2883, 1983, + 0, 2957, 0, + 0, 3040, 0, + 0, 3132, 0, + 0, 3231, 0, + 0, 3337, 0, + 0, 3449, 0, + 0, 3565, 0, + 0, 3684, 0, + 1040, 2554, 2902, + 1028, 2555, 2902, + 1011, 2555, 2902, + 986, 2555, 2901, + 952, 2556, 2901, + 901, 2556, 2900, + 823, 2557, 2900, + 692, 2558, 2899, + 422, 2560, 2898, + 0, 2562, 2896, + 0, 2565, 2894, + 0, 2569, 2891, + 0, 2573, 2887, + 0, 2580, 2882, + 0, 2588, 2875, + 0, 2599, 2865, + 0, 2614, 2851, + 0, 2632, 2833, + 0, 2656, 2806, + 0, 2686, 2769, + 0, 2723, 2713, + 0, 2768, 2627, + 0, 2823, 2476, + 0, 2887, 2139, + 0, 2960, 0, + 0, 3043, 0, + 0, 3134, 0, + 0, 3233, 0, + 0, 3338, 0, + 0, 3450, 0, + 0, 3565, 0, + 0, 3685, 0, + 2058, 2564, 2934, + 2057, 2564, 2933, + 2055, 2565, 2933, + 2053, 2565, 2933, + 2050, 2565, 2933, + 2045, 2566, 2932, + 2039, 2567, 2932, + 2032, 2568, 2931, + 2021, 2570, 2930, + 2006, 2572, 2928, + 1985, 2574, 2926, + 1956, 2578, 2923, + 1914, 2583, 2920, + 1850, 2589, 2915, + 1749, 2597, 2908, + 1564, 2608, 2899, + 1057, 2622, 2887, + 0, 2641, 2869, + 0, 2664, 2845, + 0, 2693, 2811, + 0, 2730, 2761, + 0, 2775, 2683, + 0, 2828, 2553, + 0, 2891, 2287, + 0, 2964, 0, + 0, 3046, 0, + 0, 3137, 0, + 0, 3235, 0, + 0, 3340, 0, + 0, 3451, 0, + 0, 3566, 0, + 0, 3686, 0, + 2415, 2577, 2973, + 2415, 2577, 2973, + 2414, 2577, 2972, + 2413, 2578, 2972, + 2412, 2578, 2972, + 2410, 2579, 2971, + 2407, 2580, 2971, + 2404, 2581, 2970, + 2399, 2582, 2969, + 2392, 2584, 2968, + 2384, 2587, 2966, + 2372, 2590, 2963, + 2355, 2595, 2960, + 2332, 2601, 2956, + 2300, 2609, 2949, + 2252, 2620, 2941, + 2179, 2633, 2930, + 2059, 2651, 2914, + 1824, 2674, 2892, + 744, 2703, 2862, + 0, 2739, 2817, + 0, 2783, 2749, + 0, 2835, 2639, + 0, 2898, 2431, + 0, 2969, 1756, + 0, 3050, 0, + 0, 3140, 0, + 0, 3238, 0, + 0, 3342, 0, + 0, 3453, 0, + 0, 3568, 0, + 0, 3687, 0, + 2664, 2593, 3020, + 2664, 2593, 3020, + 2663, 2594, 3020, + 2663, 2594, 3020, + 2662, 2594, 3020, + 2661, 2595, 3019, + 2659, 2596, 3019, + 2657, 2597, 3018, + 2654, 2598, 3017, + 2651, 2600, 3016, + 2646, 2603, 3014, + 2639, 2606, 3012, + 2630, 2611, 3009, + 2618, 2617, 3005, + 2601, 2624, 2999, + 2577, 2635, 2992, + 2543, 2648, 2982, + 2493, 2665, 2968, + 2416, 2687, 2949, + 2287, 2715, 2922, + 2025, 2750, 2883, + 0, 2793, 2824, + 0, 2845, 2733, + 0, 2906, 2572, + 0, 2976, 2191, + 0, 3056, 0, + 0, 3145, 0, + 0, 3242, 0, + 0, 3345, 0, + 0, 3455, 0, + 0, 3570, 0, + 0, 3688, 0, + 2867, 2614, 3077, + 2867, 2614, 3077, + 2867, 2615, 3077, + 2866, 2615, 3077, + 2866, 2615, 3076, + 2865, 2616, 3076, + 2864, 2617, 3076, + 2863, 2618, 3075, + 2861, 2619, 3074, + 2859, 2621, 3073, + 2856, 2623, 3072, + 2851, 2627, 3070, + 2846, 2631, 3067, + 2838, 2637, 3063, + 2828, 2644, 3059, + 2813, 2654, 3052, + 2793, 2667, 3043, + 2765, 2683, 3031, + 2724, 2705, 3014, + 2664, 2731, 2991, + 2567, 2765, 2958, + 2395, 2807, 2909, + 1957, 2857, 2835, + 0, 2916, 2711, + 0, 2985, 2465, + 0, 3064, 979, + 0, 3151, 0, + 0, 3247, 0, + 0, 3350, 0, + 0, 3458, 0, + 0, 3572, 0, + 0, 3690, 0, + 3046, 2641, 3143, + 3046, 2641, 3143, + 3046, 2641, 3143, + 3045, 2642, 3143, + 3045, 2642, 3143, + 3044, 2643, 3142, + 3044, 2643, 3142, + 3043, 2644, 3142, + 3042, 2646, 3141, + 3040, 2647, 3140, + 3038, 2650, 3139, + 3035, 2653, 3137, + 3032, 2657, 3135, + 3027, 2662, 3132, + 3020, 2669, 3127, + 3010, 2678, 3122, + 2997, 2691, 3114, + 2980, 2706, 3104, + 2955, 2727, 3090, + 2919, 2752, 3070, + 2867, 2785, 3042, + 2786, 2824, 3002, + 2648, 2873, 2942, + 2356, 2930, 2848, + 0, 2997, 2679, + 0, 3074, 2263, + 0, 3160, 0, + 0, 3254, 0, + 0, 3355, 0, + 0, 3463, 0, + 0, 3576, 0, + 0, 3693, 0, + 3210, 2674, 3219, + 3210, 2674, 3219, + 3210, 2675, 3219, + 3210, 2675, 3219, + 3209, 2675, 3219, + 3209, 2676, 3218, + 3209, 2677, 3218, + 3208, 2677, 3218, + 3207, 2679, 3217, + 3206, 2680, 3216, + 3205, 2682, 3215, + 3203, 2685, 3214, + 3200, 2689, 3212, + 3197, 2694, 3209, + 3192, 2701, 3206, + 3185, 2709, 3201, + 3177, 2721, 3195, + 3165, 2735, 3186, + 3148, 2754, 3174, + 3126, 2779, 3158, + 3093, 2809, 3135, + 3045, 2847, 3103, + 2973, 2893, 3055, + 2853, 2948, 2983, + 2618, 3013, 2865, + 1555, 3087, 2634, + 0, 3171, 1643, + 0, 3263, 0, + 0, 3362, 0, + 0, 3468, 0, + 0, 3580, 0, + 0, 3696, 0, + 3365, 2716, 3304, + 3365, 2716, 3304, + 3364, 2716, 3304, + 3364, 2716, 3304, + 3364, 2716, 3304, + 3364, 2717, 3303, + 3364, 2718, 3303, + 3363, 2718, 3303, + 3363, 2719, 3302, + 3362, 2721, 3302, + 3361, 2723, 3301, + 3359, 2725, 3300, + 3358, 2729, 3298, + 3355, 2734, 3296, + 3352, 2740, 3293, + 3347, 2748, 3289, + 3341, 2758, 3284, + 3333, 2772, 3277, + 3322, 2789, 3267, + 3306, 2812, 3254, + 3285, 2840, 3235, + 3254, 2876, 3210, + 3209, 2919, 3173, + 3142, 2971, 3118, + 3033, 3033, 3033, + 2828, 3104, 2887, + 2176, 3185, 2564, + 0, 3274, 0, + 0, 3372, 0, + 0, 3476, 0, + 0, 3586, 0, + 0, 3701, 0, + 3513, 2765, 3397, + 3513, 2765, 3397, + 3513, 2766, 3397, + 3513, 2766, 3397, + 3513, 2766, 3397, + 3512, 2767, 3397, + 3512, 2767, 3397, + 3512, 2768, 3396, + 3511, 2769, 3396, + 3511, 2770, 3395, + 3510, 2772, 3395, + 3509, 2774, 3394, + 3508, 2777, 3392, + 3506, 2781, 3391, + 3504, 2787, 3388, + 3500, 2794, 3385, + 3496, 2804, 3381, + 3490, 2816, 3375, + 3482, 2832, 3367, + 3471, 2852, 3357, + 3457, 2878, 3342, + 3436, 2911, 3322, + 3406, 2951, 3293, + 3364, 3000, 3252, + 3300, 3058, 3190, + 3198, 3126, 3092, + 3011, 3203, 2914, + 2491, 3289, 2450, + 0, 3384, 0, + 0, 3486, 0, + 0, 3594, 0, + 0, 3707, 0, + 3657, 2824, 3498, + 3657, 2824, 3498, + 3657, 2825, 3498, + 3657, 2825, 3498, + 3656, 2825, 3498, + 3656, 2825, 3498, + 3656, 2826, 3497, + 3656, 2827, 3497, + 3656, 2827, 3497, + 3655, 2829, 3497, + 3655, 2830, 3496, + 3654, 2832, 3495, + 3653, 2835, 3494, + 3652, 2839, 3493, + 3650, 2843, 3491, + 3648, 2850, 3488, + 3645, 2858, 3485, + 3640, 2869, 3480, + 3635, 2883, 3474, + 3627, 2902, 3466, + 3616, 2925, 3454, + 3602, 2955, 3439, + 3582, 2992, 3417, + 3553, 3036, 3386, + 3512, 3090, 3340, + 3451, 3154, 3272, + 3353, 3227, 3160, + 3177, 3309, 2949, + 2723, 3400, 2233, + 0, 3498, 0, + 0, 3604, 0, + 0, 3715, 0, + 3797, 2893, 3605, + 3797, 2893, 3605, + 3797, 2893, 3605, + 3797, 2893, 3605, + 3797, 2894, 3605, + 3797, 2894, 3605, + 3797, 2894, 3605, + 3797, 2895, 3605, + 3797, 2896, 3604, + 3796, 2897, 3604, + 3796, 2898, 3604, + 3795, 2900, 3603, + 3795, 2902, 3602, + 3794, 2905, 3601, + 3792, 2909, 3600, + 3791, 2915, 3598, + 3788, 2922, 3595, + 3785, 2932, 3591, + 3781, 2944, 3587, + 3776, 2960, 3580, + 3768, 2981, 3571, + 3758, 3007, 3559, + 3744, 3040, 3542, + 3724, 3081, 3519, + 3696, 3130, 3486, + 3656, 3188, 3437, + 3596, 3256, 3362, + 3502, 3334, 3238, + 3333, 3420, 2991, + 2918, 3515, 1456, + 0, 3617, 0, + 0, 3725, 0, + 3936, 2971, 3718, + 3936, 2971, 3718, + 3936, 2971, 3718, + 3936, 2971, 3718, + 3936, 2972, 3718, + 3936, 2972, 3717, + 3935, 2972, 3717, + 3935, 2973, 3717, + 3935, 2973, 3717, + 3935, 2974, 3717, + 3935, 2975, 3716, + 3934, 2977, 3716, + 3934, 2979, 3715, + 3933, 2981, 3714, + 3932, 2985, 3713, + 3931, 2990, 3712, + 3929, 2996, 3710, + 3927, 3004, 3707, + 3924, 3015, 3703, + 3920, 3028, 3698, + 3914, 3046, 3691, + 3907, 3069, 3682, + 3897, 3098, 3669, + 3883, 3134, 3652, + 3863, 3178, 3627, + 3836, 3231, 3592, + 3797, 3293, 3540, + 3738, 3365, 3460, + 3646, 3446, 3325, + 3483, 3536, 3042, + 3092, 3634, 0, + 0, 3738, 0, + 4073, 3058, 3835, + 4073, 3058, 3835, + 4072, 3058, 3835, + 4072, 3058, 3835, + 4072, 3059, 3834, + 4072, 3059, 3834, + 4072, 3059, 3834, + 4072, 3059, 3834, + 4072, 3060, 3834, + 4072, 3061, 3834, + 4072, 3062, 3834, + 4071, 3063, 3833, + 4071, 3064, 3833, + 4071, 3067, 3832, + 4070, 3070, 3831, + 4069, 3073, 3830, + 4068, 3079, 3828, + 4066, 3085, 3826, + 4064, 3094, 3823, + 4061, 3106, 3820, + 4057, 3121, 3814, + 4051, 3140, 3807, + 4044, 3165, 3798, + 4034, 3196, 3784, + 4020, 3235, 3766, + 4001, 3282, 3741, + 3974, 3338, 3704, + 3935, 3404, 3650, + 3877, 3479, 3565, + 3787, 3563, 3420, + 3627, 3656, 3103, + 3253, 3756, 0, + 4095, 3153, 3955, + 4095, 3153, 3955, + 4095, 3153, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3155, 3955, + 4095, 3155, 3954, + 4095, 3156, 3954, + 4095, 3157, 3954, + 4095, 3159, 3954, + 4095, 3160, 3953, + 4095, 3163, 3952, + 4095, 3166, 3951, + 4095, 3170, 3950, + 4095, 3176, 3949, + 4095, 3183, 3946, + 4095, 3192, 3943, + 4095, 3205, 3940, + 4095, 3221, 3934, + 4095, 3242, 3927, + 4095, 3269, 3917, + 4095, 3302, 3903, + 4095, 3342, 3885, + 4095, 3392, 3858, + 4095, 3451, 3820, + 4072, 3519, 3764, + 4015, 3596, 3676, + 3925, 3683, 3522, + 3768, 3778, 3173, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3257, 4078, + 4095, 3257, 4078, + 4095, 3257, 4078, + 4095, 3258, 4078, + 4095, 3259, 4077, + 4095, 3260, 4077, + 4095, 3261, 4077, + 4095, 3263, 4076, + 4095, 3266, 4075, + 4095, 3269, 4075, + 4095, 3274, 4073, + 4095, 3280, 4072, + 4095, 3287, 4069, + 4095, 3297, 4066, + 4095, 3311, 4062, + 4095, 3328, 4057, + 4095, 3350, 4049, + 4095, 3378, 4039, + 4095, 3413, 4025, + 4095, 3455, 4006, + 4095, 3507, 3979, + 4095, 3567, 3940, + 4095, 3638, 3882, + 4095, 3718, 3791, + 4062, 3806, 3631, + 0, 2656, 2925, + 0, 2657, 2925, + 0, 2657, 2925, + 0, 2657, 2925, + 0, 2658, 2924, + 0, 2658, 2924, + 0, 2659, 2923, + 0, 2660, 2923, + 0, 2661, 2921, + 0, 2663, 2920, + 0, 2665, 2918, + 0, 2668, 2915, + 0, 2672, 2911, + 0, 2677, 2906, + 0, 2684, 2899, + 0, 2693, 2890, + 0, 2705, 2878, + 0, 2720, 2860, + 0, 2739, 2835, + 0, 2764, 2800, + 0, 2796, 2749, + 0, 2835, 2669, + 0, 2882, 2534, + 0, 2939, 2253, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2925, + 0, 2657, 2925, + 0, 2658, 2925, + 0, 2658, 2924, + 0, 2659, 2924, + 0, 2660, 2923, + 0, 2661, 2922, + 0, 2663, 2920, + 0, 2665, 2918, + 0, 2668, 2915, + 0, 2672, 2912, + 0, 2677, 2907, + 0, 2684, 2900, + 0, 2693, 2890, + 0, 2705, 2878, + 0, 2720, 2860, + 0, 2739, 2836, + 0, 2765, 2801, + 0, 2796, 2749, + 0, 2835, 2669, + 0, 2882, 2535, + 0, 2939, 2254, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2925, + 0, 2658, 2925, + 0, 2658, 2925, + 0, 2659, 2924, + 0, 2660, 2923, + 0, 2661, 2922, + 0, 2663, 2920, + 0, 2665, 2918, + 0, 2668, 2916, + 0, 2672, 2912, + 0, 2677, 2907, + 0, 2684, 2900, + 0, 2693, 2891, + 0, 2705, 2878, + 0, 2720, 2861, + 0, 2740, 2836, + 0, 2765, 2801, + 0, 2796, 2749, + 0, 2835, 2670, + 0, 2882, 2535, + 0, 2939, 2255, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2658, 2925, + 0, 2658, 2925, + 0, 2659, 2924, + 0, 2660, 2923, + 0, 2661, 2922, + 0, 2663, 2921, + 0, 2665, 2919, + 0, 2668, 2916, + 0, 2672, 2912, + 0, 2677, 2907, + 0, 2684, 2900, + 0, 2693, 2891, + 0, 2705, 2879, + 0, 2720, 2861, + 0, 2740, 2836, + 0, 2765, 2801, + 0, 2796, 2750, + 0, 2835, 2670, + 0, 2882, 2536, + 0, 2939, 2257, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2927, + 0, 2657, 2927, + 0, 2657, 2927, + 0, 2657, 2926, + 0, 2658, 2926, + 0, 2658, 2925, + 0, 2659, 2925, + 0, 2660, 2924, + 0, 2661, 2923, + 0, 2663, 2921, + 0, 2665, 2919, + 0, 2668, 2917, + 0, 2672, 2913, + 0, 2677, 2908, + 0, 2684, 2901, + 0, 2693, 2892, + 0, 2705, 2879, + 0, 2720, 2862, + 0, 2740, 2837, + 0, 2765, 2802, + 0, 2796, 2751, + 0, 2835, 2671, + 0, 2882, 2537, + 0, 2939, 2259, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2928, + 0, 2657, 2927, + 0, 2657, 2927, + 0, 2658, 2927, + 0, 2658, 2927, + 0, 2659, 2926, + 0, 2659, 2926, + 0, 2660, 2925, + 0, 2661, 2924, + 0, 2663, 2922, + 0, 2665, 2920, + 0, 2668, 2917, + 0, 2672, 2914, + 0, 2677, 2909, + 0, 2684, 2902, + 0, 2693, 2893, + 0, 2705, 2880, + 0, 2720, 2862, + 0, 2740, 2838, + 0, 2765, 2803, + 0, 2796, 2752, + 0, 2835, 2673, + 0, 2882, 2539, + 0, 2939, 2262, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2929, + 0, 2657, 2928, + 0, 2658, 2928, + 0, 2658, 2928, + 0, 2658, 2928, + 0, 2659, 2927, + 0, 2660, 2926, + 0, 2660, 2926, + 0, 2662, 2925, + 0, 2663, 2923, + 0, 2666, 2921, + 0, 2669, 2918, + 0, 2672, 2915, + 0, 2678, 2910, + 0, 2684, 2903, + 0, 2693, 2894, + 0, 2705, 2881, + 0, 2720, 2864, + 0, 2740, 2839, + 0, 2765, 2804, + 0, 2796, 2753, + 0, 2835, 2674, + 0, 2883, 2541, + 0, 2939, 2266, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2658, 2930, + 0, 2658, 2930, + 0, 2658, 2929, + 0, 2658, 2929, + 0, 2659, 2929, + 0, 2659, 2928, + 0, 2660, 2928, + 0, 2661, 2927, + 0, 2662, 2926, + 0, 2664, 2924, + 0, 2666, 2922, + 0, 2669, 2919, + 0, 2673, 2916, + 0, 2678, 2911, + 0, 2685, 2904, + 0, 2694, 2895, + 0, 2706, 2882, + 0, 2721, 2865, + 0, 2740, 2841, + 0, 2765, 2806, + 0, 2797, 2755, + 0, 2836, 2676, + 0, 2883, 2544, + 0, 2939, 2271, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2658, 2931, + 0, 2658, 2931, + 0, 2658, 2931, + 0, 2659, 2931, + 0, 2659, 2931, + 0, 2660, 2930, + 0, 2660, 2929, + 0, 2661, 2929, + 0, 2662, 2927, + 0, 2664, 2926, + 0, 2666, 2924, + 0, 2669, 2921, + 0, 2673, 2918, + 0, 2678, 2913, + 0, 2685, 2906, + 0, 2694, 2897, + 0, 2706, 2884, + 0, 2721, 2867, + 0, 2741, 2843, + 0, 2766, 2808, + 0, 2797, 2757, + 0, 2836, 2679, + 0, 2883, 2548, + 0, 2939, 2279, + 0, 3005, 0, + 0, 3081, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3359, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2659, 2934, + 0, 2659, 2934, + 0, 2659, 2933, + 0, 2659, 2933, + 0, 2660, 2933, + 0, 2660, 2932, + 0, 2661, 2932, + 0, 2662, 2931, + 0, 2663, 2930, + 0, 2665, 2928, + 0, 2667, 2926, + 0, 2670, 2924, + 0, 2674, 2920, + 0, 2679, 2915, + 0, 2686, 2908, + 0, 2695, 2899, + 0, 2706, 2887, + 0, 2722, 2870, + 0, 2741, 2845, + 0, 2766, 2811, + 0, 2797, 2761, + 0, 2836, 2683, + 0, 2883, 2553, + 0, 2940, 2288, + 0, 3006, 0, + 0, 3081, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2659, 2937, + 0, 2659, 2937, + 0, 2660, 2936, + 0, 2660, 2936, + 0, 2660, 2936, + 0, 2661, 2935, + 0, 2662, 2935, + 0, 2663, 2934, + 0, 2664, 2933, + 0, 2665, 2931, + 0, 2668, 2929, + 0, 2671, 2927, + 0, 2674, 2923, + 0, 2680, 2918, + 0, 2686, 2911, + 0, 2695, 2902, + 0, 2707, 2890, + 0, 2722, 2873, + 0, 2742, 2849, + 0, 2767, 2815, + 0, 2798, 2765, + 0, 2837, 2688, + 0, 2884, 2560, + 0, 2940, 2300, + 0, 3006, 0, + 0, 3081, 0, + 0, 3166, 0, + 0, 3258, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2660, 2941, + 0, 2660, 2941, + 0, 2661, 2940, + 0, 2661, 2940, + 0, 2661, 2940, + 0, 2662, 2939, + 0, 2663, 2939, + 0, 2664, 2938, + 0, 2665, 2937, + 0, 2666, 2935, + 0, 2669, 2933, + 0, 2672, 2931, + 0, 2675, 2927, + 0, 2681, 2922, + 0, 2687, 2916, + 0, 2696, 2907, + 0, 2708, 2894, + 0, 2723, 2877, + 0, 2743, 2854, + 0, 2768, 2820, + 0, 2799, 2771, + 0, 2837, 2695, + 0, 2885, 2569, + 0, 2941, 2316, + 0, 3006, 0, + 0, 3082, 0, + 0, 3166, 0, + 0, 3259, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2662, 2946, + 0, 2662, 2946, + 0, 2662, 2946, + 0, 2662, 2945, + 0, 2663, 2945, + 0, 2663, 2945, + 0, 2664, 2944, + 0, 2665, 2943, + 0, 2666, 2942, + 0, 2668, 2941, + 0, 2670, 2939, + 0, 2673, 2936, + 0, 2677, 2932, + 0, 2682, 2928, + 0, 2689, 2921, + 0, 2698, 2912, + 0, 2709, 2900, + 0, 2724, 2883, + 0, 2744, 2860, + 0, 2769, 2827, + 0, 2800, 2778, + 0, 2838, 2704, + 0, 2885, 2581, + 0, 2941, 2336, + 0, 3007, 938, + 0, 3082, 0, + 0, 3166, 0, + 0, 3259, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2663, 2953, + 0, 2664, 2953, + 0, 2664, 2952, + 0, 2664, 2952, + 0, 2665, 2952, + 0, 2665, 2951, + 0, 2666, 2951, + 0, 2667, 2950, + 0, 2668, 2949, + 0, 2670, 2948, + 0, 2672, 2946, + 0, 2675, 2943, + 0, 2679, 2940, + 0, 2684, 2935, + 0, 2690, 2928, + 0, 2699, 2920, + 0, 2711, 2908, + 0, 2726, 2891, + 0, 2745, 2868, + 0, 2770, 2836, + 0, 2801, 2788, + 0, 2840, 2716, + 0, 2886, 2596, + 0, 2942, 2362, + 0, 3008, 1311, + 0, 3083, 0, + 0, 3167, 0, + 0, 3260, 0, + 0, 3360, 0, + 0, 3466, 0, + 0, 3579, 0, + 0, 3695, 0, + 0, 2666, 2962, + 0, 2666, 2962, + 0, 2666, 2962, + 0, 2667, 2961, + 0, 2667, 2961, + 0, 2667, 2961, + 0, 2668, 2960, + 0, 2669, 2959, + 0, 2670, 2958, + 0, 2672, 2957, + 0, 2674, 2955, + 0, 2677, 2952, + 0, 2681, 2949, + 0, 2686, 2944, + 0, 2693, 2938, + 0, 2701, 2929, + 0, 2713, 2918, + 0, 2728, 2902, + 0, 2747, 2879, + 0, 2772, 2848, + 0, 2803, 2801, + 0, 2841, 2731, + 0, 2888, 2616, + 0, 2944, 2395, + 0, 3009, 1565, + 0, 3084, 0, + 0, 3168, 0, + 0, 3260, 0, + 0, 3360, 0, + 0, 3467, 0, + 0, 3579, 0, + 0, 3695, 0, + 0, 2669, 2974, + 0, 2669, 2974, + 0, 2669, 2973, + 0, 2670, 2973, + 0, 2670, 2973, + 0, 2671, 2972, + 0, 2671, 2972, + 0, 2672, 2971, + 0, 2673, 2970, + 0, 2675, 2969, + 0, 2677, 2967, + 0, 2680, 2964, + 0, 2684, 2961, + 0, 2689, 2957, + 0, 2696, 2950, + 0, 2704, 2942, + 0, 2716, 2931, + 0, 2731, 2915, + 0, 2750, 2894, + 0, 2774, 2863, + 0, 2805, 2818, + 0, 2843, 2751, + 0, 2890, 2641, + 0, 2945, 2435, + 0, 3010, 1770, + 0, 3085, 0, + 0, 3169, 0, + 0, 3261, 0, + 0, 3361, 0, + 0, 3467, 0, + 0, 3579, 0, + 0, 3696, 0, + 0, 2673, 2989, + 0, 2673, 2989, + 0, 2674, 2989, + 0, 2674, 2989, + 0, 2674, 2988, + 0, 2675, 2988, + 0, 2676, 2987, + 0, 2676, 2987, + 0, 2678, 2986, + 0, 2679, 2984, + 0, 2681, 2982, + 0, 2684, 2980, + 0, 2688, 2977, + 0, 2693, 2973, + 0, 2700, 2967, + 0, 2708, 2959, + 0, 2720, 2948, + 0, 2735, 2933, + 0, 2754, 2912, + 0, 2778, 2882, + 0, 2808, 2840, + 0, 2846, 2775, + 0, 2893, 2672, + 0, 2948, 2483, + 0, 3013, 1950, + 0, 3087, 0, + 0, 3170, 0, + 0, 3262, 0, + 0, 3362, 0, + 0, 3468, 0, + 0, 3580, 0, + 0, 3696, 0, + 0, 2679, 3009, + 0, 2679, 3009, + 0, 2679, 3009, + 0, 2680, 3008, + 0, 2680, 3008, + 0, 2680, 3008, + 0, 2681, 3007, + 0, 2682, 3007, + 0, 2683, 3006, + 0, 2685, 3004, + 0, 2687, 3003, + 0, 2690, 3000, + 0, 2693, 2997, + 0, 2698, 2993, + 0, 2705, 2987, + 0, 2714, 2980, + 0, 2725, 2969, + 0, 2739, 2955, + 0, 2758, 2935, + 0, 2782, 2907, + 0, 2813, 2867, + 0, 2850, 2807, + 0, 2896, 2711, + 0, 2951, 2541, + 0, 3015, 2115, + 0, 3089, 0, + 0, 3172, 0, + 0, 3264, 0, + 0, 3363, 0, + 0, 3469, 0, + 0, 3581, 0, + 0, 3697, 0, + 1182, 2686, 3034, + 1173, 2686, 3034, + 1160, 2687, 3034, + 1143, 2687, 3034, + 1119, 2687, 3033, + 1084, 2688, 3033, + 1033, 2688, 3033, + 955, 2689, 3032, + 824, 2691, 3031, + 554, 2692, 3030, + 0, 2694, 3028, + 0, 2697, 3026, + 0, 2701, 3023, + 0, 2706, 3019, + 0, 2712, 3014, + 0, 2720, 3007, + 0, 2731, 2997, + 0, 2746, 2983, + 0, 2764, 2965, + 0, 2788, 2939, + 0, 2818, 2901, + 0, 2855, 2846, + 0, 2901, 2759, + 0, 2955, 2608, + 0, 3019, 2271, + 0, 3092, 0, + 0, 3175, 0, + 0, 3266, 0, + 0, 3365, 0, + 0, 3470, 0, + 0, 3582, 0, + 0, 3697, 0, + 2191, 2696, 3066, + 2190, 2696, 3066, + 2189, 2696, 3066, + 2187, 2697, 3065, + 2185, 2697, 3065, + 2182, 2698, 3065, + 2177, 2698, 3064, + 2172, 2699, 3064, + 2164, 2700, 3063, + 2153, 2702, 3062, + 2138, 2704, 3060, + 2117, 2706, 3058, + 2088, 2710, 3055, + 2046, 2715, 3052, + 1983, 2721, 3047, + 1881, 2729, 3040, + 1696, 2740, 3031, + 1189, 2754, 3019, + 0, 2773, 3001, + 0, 2796, 2977, + 0, 2825, 2943, + 0, 2862, 2893, + 0, 2907, 2815, + 0, 2960, 2685, + 0, 3023, 2419, + 0, 3096, 0, + 0, 3178, 0, + 0, 3269, 0, + 0, 3367, 0, + 0, 3472, 0, + 0, 3583, 0, + 0, 3699, 0, + 2548, 2709, 3105, + 2548, 2709, 3105, + 2547, 2709, 3105, + 2546, 2709, 3105, + 2545, 2710, 3104, + 2544, 2710, 3104, + 2542, 2711, 3104, + 2539, 2712, 3103, + 2536, 2713, 3102, + 2531, 2714, 3101, + 2524, 2716, 3100, + 2516, 2719, 3098, + 2504, 2722, 3095, + 2487, 2727, 3092, + 2464, 2733, 3088, + 2432, 2741, 3082, + 2384, 2752, 3073, + 2311, 2766, 3062, + 2191, 2783, 3046, + 1956, 2806, 3025, + 876, 2835, 2994, + 0, 2871, 2949, + 0, 2915, 2881, + 0, 2967, 2771, + 0, 3030, 2564, + 0, 3101, 1888, + 0, 3182, 0, + 0, 3272, 0, + 0, 3370, 0, + 0, 3474, 0, + 0, 3585, 0, + 0, 3700, 0, + 2796, 2725, 3153, + 2796, 2725, 3152, + 2796, 2725, 3152, + 2795, 2726, 3152, + 2795, 2726, 3152, + 2794, 2726, 3152, + 2793, 2727, 3151, + 2791, 2728, 3151, + 2789, 2729, 3150, + 2787, 2730, 3149, + 2783, 2732, 3148, + 2778, 2735, 3146, + 2771, 2738, 3144, + 2762, 2743, 3141, + 2750, 2749, 3137, + 2733, 2756, 3131, + 2709, 2767, 3124, + 2675, 2780, 3114, + 2625, 2797, 3100, + 2548, 2819, 3081, + 2419, 2847, 3054, + 2157, 2882, 3015, + 0, 2925, 2957, + 0, 2977, 2865, + 0, 3038, 2704, + 0, 3108, 2323, + 0, 3188, 0, + 0, 3277, 0, + 0, 3374, 0, + 0, 3478, 0, + 0, 3587, 0, + 0, 3702, 0, + 2999, 2746, 3209, + 2999, 2746, 3209, + 2999, 2746, 3209, + 2999, 2747, 3209, + 2998, 2747, 3209, + 2998, 2747, 3209, + 2997, 2748, 3208, + 2996, 2749, 3208, + 2995, 2750, 3207, + 2993, 2751, 3206, + 2991, 2753, 3205, + 2988, 2755, 3204, + 2984, 2759, 3202, + 2978, 2763, 3199, + 2970, 2769, 3196, + 2960, 2776, 3191, + 2945, 2786, 3184, + 2925, 2799, 3175, + 2897, 2815, 3163, + 2857, 2837, 3147, + 2796, 2864, 3123, + 2699, 2897, 3090, + 2527, 2939, 3041, + 2089, 2989, 2967, + 0, 3048, 2843, + 0, 3118, 2597, + 0, 3196, 1111, + 0, 3283, 0, + 0, 3379, 0, + 0, 3482, 0, + 0, 3590, 0, + 0, 3704, 0, + 3178, 2773, 3276, + 3178, 2773, 3275, + 3178, 2773, 3275, + 3178, 2773, 3275, + 3177, 2774, 3275, + 3177, 2774, 3275, + 3177, 2775, 3275, + 3176, 2775, 3274, + 3175, 2776, 3274, + 3174, 2778, 3273, + 3172, 2779, 3272, + 3170, 2782, 3271, + 3167, 2785, 3269, + 3164, 2789, 3267, + 3159, 2794, 3264, + 3152, 2801, 3260, + 3142, 2811, 3254, + 3130, 2823, 3246, + 3112, 2838, 3236, + 3087, 2859, 3222, + 3051, 2884, 3202, + 2999, 2917, 3174, + 2918, 2956, 3134, + 2780, 3005, 3074, + 2488, 3062, 2980, + 0, 3130, 2811, + 0, 3206, 2395, + 0, 3292, 0, + 0, 3386, 0, + 0, 3487, 0, + 0, 3595, 0, + 0, 3708, 0, + 3342, 2806, 3351, + 3342, 2806, 3351, + 3342, 2807, 3351, + 3342, 2807, 3351, + 3342, 2807, 3351, + 3341, 2807, 3351, + 3341, 2808, 3350, + 3341, 2809, 3350, + 3340, 2810, 3350, + 3339, 2811, 3349, + 3338, 2812, 3348, + 3337, 2814, 3347, + 3335, 2817, 3346, + 3332, 2821, 3344, + 3329, 2826, 3341, + 3324, 2833, 3338, + 3318, 2841, 3333, + 3309, 2853, 3327, + 3297, 2867, 3318, + 3281, 2886, 3306, + 3258, 2911, 3290, + 3225, 2941, 3267, + 3177, 2979, 3235, + 3105, 3025, 3187, + 2985, 3080, 3115, + 2750, 3145, 2997, + 1687, 3219, 2766, + 0, 3303, 1775, + 0, 3395, 0, + 0, 3494, 0, + 0, 3600, 0, + 0, 3712, 0, + 3497, 2847, 3436, + 3497, 2848, 3436, + 3497, 2848, 3436, + 3497, 2848, 3436, + 3496, 2848, 3436, + 3496, 2849, 3436, + 3496, 2849, 3436, + 3496, 2850, 3435, + 3495, 2850, 3435, + 3495, 2852, 3434, + 3494, 2853, 3434, + 3493, 2855, 3433, + 3492, 2858, 3432, + 3490, 2861, 3430, + 3487, 2866, 3428, + 3484, 2872, 3425, + 3479, 2880, 3421, + 3473, 2890, 3416, + 3465, 2904, 3409, + 3454, 2921, 3399, + 3438, 2944, 3386, + 3417, 2972, 3368, + 3386, 3008, 3342, + 3341, 3051, 3305, + 3274, 3103, 3250, + 3165, 3165, 3165, + 2960, 3236, 3019, + 2308, 3317, 2696, + 0, 3406, 0, + 0, 3504, 0, + 0, 3608, 0, + 0, 3718, 0, + 3645, 2897, 3529, + 3645, 2897, 3529, + 3645, 2898, 3529, + 3645, 2898, 3529, + 3645, 2898, 3529, + 3645, 2898, 3529, + 3644, 2899, 3529, + 3644, 2899, 3529, + 3644, 2900, 3528, + 3644, 2901, 3528, + 3643, 2902, 3527, + 3642, 2904, 3527, + 3641, 2906, 3526, + 3640, 2909, 3524, + 3638, 2914, 3523, + 3636, 2919, 3520, + 3633, 2926, 3517, + 3628, 2936, 3513, + 3622, 2948, 3507, + 3614, 2964, 3500, + 3604, 2984, 3489, + 3589, 3011, 3474, + 3568, 3043, 3454, + 3539, 3084, 3426, + 3496, 3132, 3384, + 3432, 3191, 3322, + 3330, 3258, 3224, + 3143, 3335, 3046, + 2623, 3421, 2582, + 0, 3516, 0, + 0, 3618, 0, + 0, 3726, 0, + 3789, 2956, 3630, + 3789, 2956, 3630, + 3789, 2957, 3630, + 3789, 2957, 3630, + 3789, 2957, 3630, + 3789, 2957, 3630, + 3788, 2958, 3630, + 3788, 2958, 3630, + 3788, 2959, 3629, + 3788, 2960, 3629, + 3787, 2961, 3629, + 3787, 2962, 3628, + 3786, 2964, 3627, + 3785, 2967, 3626, + 3784, 2971, 3625, + 3782, 2976, 3623, + 3780, 2982, 3620, + 3777, 2990, 3617, + 3772, 3001, 3613, + 3767, 3015, 3606, + 3759, 3034, 3598, + 3748, 3057, 3587, + 3734, 3087, 3571, + 3714, 3124, 3549, + 3685, 3169, 3518, + 3644, 3222, 3473, + 3583, 3286, 3404, + 3485, 3359, 3292, + 3309, 3441, 3081, + 2855, 3532, 2365, + 0, 3630, 0, + 0, 3736, 0, + 3929, 3025, 3737, + 3929, 3025, 3737, + 3929, 3025, 3737, + 3929, 3025, 3737, + 3929, 3026, 3737, + 3929, 3026, 3737, + 3929, 3026, 3737, + 3929, 3026, 3737, + 3929, 3027, 3737, + 3929, 3028, 3736, + 3928, 3029, 3736, + 3928, 3030, 3736, + 3927, 3032, 3735, + 3927, 3034, 3734, + 3926, 3037, 3733, + 3925, 3042, 3732, + 3923, 3047, 3730, + 3921, 3054, 3727, + 3918, 3064, 3723, + 3913, 3076, 3719, + 3908, 3092, 3712, + 3900, 3113, 3703, + 3890, 3139, 3691, + 3876, 3172, 3674, + 3856, 3213, 3651, + 3828, 3262, 3618, + 3788, 3320, 3569, + 3728, 3388, 3494, + 3634, 3466, 3370, + 3465, 3552, 3123, + 3050, 3647, 1588, + 0, 3749, 0, + 4068, 3103, 3850, + 4068, 3103, 3850, + 4068, 3103, 3850, + 4068, 3103, 3850, + 4068, 3104, 3850, + 4068, 3104, 3850, + 4068, 3104, 3850, + 4068, 3104, 3849, + 4067, 3105, 3849, + 4067, 3105, 3849, + 4067, 3106, 3849, + 4067, 3107, 3849, + 4066, 3109, 3848, + 4066, 3111, 3847, + 4065, 3114, 3847, + 4064, 3117, 3845, + 4063, 3122, 3844, + 4061, 3128, 3842, + 4059, 3136, 3839, + 4056, 3147, 3835, + 4052, 3160, 3830, + 4046, 3178, 3823, + 4039, 3201, 3814, + 4029, 3230, 3801, + 4015, 3266, 3784, + 3995, 3310, 3759, + 3968, 3363, 3724, + 3929, 3425, 3672, + 3870, 3497, 3592, + 3778, 3578, 3457, + 3615, 3668, 3174, + 3224, 3766, 0, + 4095, 3190, 3967, + 4095, 3190, 3967, + 4095, 3190, 3967, + 4095, 3190, 3967, + 4095, 3191, 3967, + 4095, 3191, 3967, + 4095, 3191, 3967, + 4095, 3191, 3966, + 4095, 3192, 3966, + 4095, 3192, 3966, + 4095, 3193, 3966, + 4095, 3194, 3966, + 4095, 3195, 3965, + 4095, 3197, 3965, + 4095, 3199, 3964, + 4095, 3202, 3963, + 4095, 3206, 3962, + 4095, 3211, 3961, + 4095, 3217, 3958, + 4095, 3226, 3956, + 4095, 3238, 3952, + 4095, 3253, 3946, + 4095, 3273, 3939, + 4095, 3297, 3930, + 4095, 3328, 3917, + 4095, 3367, 3898, + 4095, 3414, 3873, + 4095, 3470, 3836, + 4067, 3536, 3782, + 4009, 3611, 3697, + 3919, 3695, 3552, + 3759, 3788, 3235, + 4095, 3285, 4087, + 4095, 3285, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3287, 4087, + 4095, 3287, 4087, + 4095, 3288, 4087, + 4095, 3288, 4086, + 4095, 3289, 4086, + 4095, 3291, 4086, + 4095, 3292, 4085, + 4095, 3295, 4084, + 4095, 3298, 4084, + 4095, 3302, 4082, + 4095, 3308, 4081, + 4095, 3315, 4079, + 4095, 3325, 4076, + 4095, 3337, 4072, + 4095, 3353, 4066, + 4095, 3374, 4059, + 4095, 3401, 4049, + 4095, 3434, 4036, + 4095, 3475, 4017, + 4095, 3524, 3990, + 4095, 3583, 3952, + 4095, 3651, 3896, + 4095, 3729, 3808, + 4057, 3815, 3655, + 0, 2788, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2790, 3056, + 0, 2790, 3056, + 0, 2791, 3055, + 0, 2792, 3054, + 0, 2793, 3053, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3047, + 0, 2804, 3043, + 0, 2809, 3038, + 0, 2816, 3031, + 0, 2825, 3022, + 0, 2837, 3009, + 0, 2852, 2992, + 0, 2872, 2967, + 0, 2897, 2932, + 0, 2928, 2880, + 0, 2967, 2801, + 0, 3014, 2666, + 0, 3071, 2384, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2788, 3058, + 0, 2789, 3058, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2790, 3057, + 0, 2790, 3056, + 0, 2791, 3055, + 0, 2792, 3055, + 0, 2793, 3053, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3047, + 0, 2804, 3043, + 0, 2809, 3038, + 0, 2816, 3032, + 0, 2825, 3022, + 0, 2837, 3010, + 0, 2852, 2992, + 0, 2872, 2967, + 0, 2897, 2932, + 0, 2928, 2881, + 0, 2967, 2801, + 0, 3014, 2666, + 0, 3071, 2385, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2788, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2790, 3057, + 0, 2790, 3056, + 0, 2791, 3056, + 0, 2792, 3055, + 0, 2793, 3054, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3047, + 0, 2804, 3044, + 0, 2809, 3039, + 0, 2816, 3032, + 0, 2825, 3023, + 0, 2837, 3010, + 0, 2852, 2992, + 0, 2872, 2968, + 0, 2897, 2933, + 0, 2928, 2881, + 0, 2967, 2801, + 0, 3014, 2667, + 0, 3071, 2386, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3057, + 0, 2790, 3057, + 0, 2790, 3057, + 0, 2791, 3056, + 0, 2792, 3055, + 0, 2793, 3054, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3048, + 0, 2804, 3044, + 0, 2809, 3039, + 0, 2816, 3032, + 0, 2825, 3023, + 0, 2837, 3010, + 0, 2852, 2993, + 0, 2872, 2968, + 0, 2897, 2933, + 0, 2928, 2881, + 0, 2967, 2802, + 0, 3014, 2667, + 0, 3071, 2387, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3059, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2790, 3058, + 0, 2790, 3057, + 0, 2791, 3056, + 0, 2792, 3056, + 0, 2793, 3054, + 0, 2795, 3053, + 0, 2797, 3051, + 0, 2800, 3048, + 0, 2804, 3044, + 0, 2809, 3039, + 0, 2816, 3033, + 0, 2825, 3023, + 0, 2837, 3011, + 0, 2852, 2993, + 0, 2872, 2969, + 0, 2897, 2934, + 0, 2928, 2882, + 0, 2967, 2802, + 0, 3014, 2668, + 0, 3071, 2389, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3059, + 0, 2789, 3059, + 0, 2789, 3059, + 0, 2789, 3059, + 0, 2790, 3058, + 0, 2790, 3058, + 0, 2791, 3058, + 0, 2791, 3057, + 0, 2792, 3056, + 0, 2793, 3055, + 0, 2795, 3053, + 0, 2797, 3051, + 0, 2800, 3049, + 0, 2804, 3045, + 0, 2809, 3040, + 0, 2816, 3033, + 0, 2825, 3024, + 0, 2837, 3011, + 0, 2852, 2994, + 0, 2872, 2969, + 0, 2897, 2934, + 0, 2928, 2883, + 0, 2967, 2803, + 0, 3014, 2670, + 0, 3071, 2391, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3060, + 0, 2789, 3060, + 0, 2789, 3060, + 0, 2789, 3059, + 0, 2790, 3059, + 0, 2790, 3059, + 0, 2791, 3058, + 0, 2791, 3058, + 0, 2792, 3057, + 0, 2794, 3056, + 0, 2795, 3054, + 0, 2797, 3052, + 0, 2800, 3049, + 0, 2804, 3046, + 0, 2810, 3041, + 0, 2816, 3034, + 0, 2825, 3025, + 0, 2837, 3012, + 0, 2852, 2995, + 0, 2872, 2970, + 0, 2897, 2935, + 0, 2928, 2884, + 0, 2967, 2805, + 0, 3015, 2671, + 0, 3071, 2394, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3061, + 0, 2789, 3061, + 0, 2789, 3061, + 0, 2790, 3060, + 0, 2790, 3060, + 0, 2790, 3060, + 0, 2791, 3059, + 0, 2792, 3059, + 0, 2793, 3058, + 0, 2794, 3057, + 0, 2795, 3055, + 0, 2798, 3053, + 0, 2801, 3050, + 0, 2805, 3047, + 0, 2810, 3042, + 0, 2817, 3035, + 0, 2826, 3026, + 0, 2837, 3013, + 0, 2853, 2996, + 0, 2872, 2971, + 0, 2897, 2936, + 0, 2929, 2885, + 0, 2967, 2806, + 0, 3015, 2673, + 0, 3071, 2398, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2790, 3062, + 0, 2790, 3062, + 0, 2790, 3062, + 0, 2790, 3062, + 0, 2790, 3061, + 0, 2791, 3061, + 0, 2791, 3060, + 0, 2792, 3060, + 0, 2793, 3059, + 0, 2794, 3058, + 0, 2796, 3056, + 0, 2798, 3054, + 0, 2801, 3052, + 0, 2805, 3048, + 0, 2810, 3043, + 0, 2817, 3036, + 0, 2826, 3027, + 0, 2838, 3014, + 0, 2853, 2997, + 0, 2872, 2973, + 0, 2897, 2938, + 0, 2929, 2887, + 0, 2968, 2809, + 0, 3015, 2676, + 0, 3071, 2404, + 0, 3137, 0, + 0, 3213, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2790, 3064, + 0, 2790, 3064, + 0, 2790, 3063, + 0, 2790, 3063, + 0, 2791, 3063, + 0, 2791, 3063, + 0, 2792, 3062, + 0, 2792, 3062, + 0, 2793, 3061, + 0, 2795, 3060, + 0, 2796, 3058, + 0, 2798, 3056, + 0, 2801, 3053, + 0, 2805, 3050, + 0, 2810, 3045, + 0, 2817, 3038, + 0, 2826, 3029, + 0, 2838, 3016, + 0, 2853, 2999, + 0, 2873, 2975, + 0, 2898, 2940, + 0, 2929, 2890, + 0, 2968, 2811, + 0, 3015, 2680, + 0, 3072, 2411, + 0, 3137, 0, + 0, 3213, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2791, 3066, + 0, 2791, 3066, + 0, 2791, 3066, + 0, 2791, 3065, + 0, 2791, 3065, + 0, 2792, 3065, + 0, 2792, 3064, + 0, 2793, 3064, + 0, 2794, 3063, + 0, 2795, 3062, + 0, 2797, 3060, + 0, 2799, 3058, + 0, 2802, 3056, + 0, 2806, 3052, + 0, 2811, 3047, + 0, 2818, 3040, + 0, 2827, 3031, + 0, 2838, 3019, + 0, 2854, 3002, + 0, 2873, 2978, + 0, 2898, 2943, + 0, 2930, 2893, + 0, 2968, 2815, + 0, 3016, 2685, + 0, 3072, 2420, + 0, 3138, 0, + 0, 3213, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2791, 3069, + 0, 2791, 3069, + 0, 2792, 3069, + 0, 2792, 3068, + 0, 2792, 3068, + 0, 2792, 3068, + 0, 2793, 3067, + 0, 2794, 3067, + 0, 2795, 3066, + 0, 2796, 3065, + 0, 2798, 3063, + 0, 2800, 3061, + 0, 2803, 3059, + 0, 2807, 3055, + 0, 2812, 3050, + 0, 2819, 3043, + 0, 2827, 3034, + 0, 2839, 3022, + 0, 2854, 3005, + 0, 2874, 2981, + 0, 2899, 2947, + 0, 2930, 2897, + 0, 2969, 2821, + 0, 3016, 2692, + 0, 3072, 2432, + 0, 3138, 0, + 0, 3213, 0, + 0, 3298, 0, + 0, 3391, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2792, 3073, + 0, 2792, 3073, + 0, 2793, 3073, + 0, 2793, 3072, + 0, 2793, 3072, + 0, 2793, 3072, + 0, 2794, 3071, + 0, 2795, 3071, + 0, 2796, 3070, + 0, 2797, 3069, + 0, 2799, 3067, + 0, 2801, 3065, + 0, 2804, 3063, + 0, 2808, 3059, + 0, 2813, 3054, + 0, 2819, 3048, + 0, 2828, 3039, + 0, 2840, 3026, + 0, 2855, 3010, + 0, 2875, 2986, + 0, 2900, 2952, + 0, 2931, 2903, + 0, 2970, 2827, + 0, 3017, 2701, + 0, 3073, 2448, + 0, 3138, 0, + 0, 3214, 0, + 0, 3298, 0, + 0, 3391, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2794, 3078, + 0, 2794, 3078, + 0, 2794, 3078, + 0, 2794, 3078, + 0, 2794, 3077, + 0, 2795, 3077, + 0, 2795, 3077, + 0, 2796, 3076, + 0, 2797, 3075, + 0, 2798, 3074, + 0, 2800, 3073, + 0, 2802, 3071, + 0, 2805, 3068, + 0, 2809, 3064, + 0, 2814, 3060, + 0, 2821, 3053, + 0, 2830, 3044, + 0, 2841, 3032, + 0, 2856, 3016, + 0, 2876, 2992, + 0, 2901, 2959, + 0, 2932, 2911, + 0, 2970, 2836, + 0, 3017, 2713, + 0, 3074, 2468, + 0, 3139, 1070, + 0, 3214, 0, + 0, 3298, 0, + 0, 3391, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2795, 3085, + 0, 2796, 3085, + 0, 2796, 3085, + 0, 2796, 3085, + 0, 2796, 3084, + 0, 2797, 3084, + 0, 2797, 3084, + 0, 2798, 3083, + 0, 2799, 3082, + 0, 2800, 3081, + 0, 2802, 3080, + 0, 2804, 3078, + 0, 2807, 3075, + 0, 2811, 3072, + 0, 2816, 3067, + 0, 2822, 3060, + 0, 2831, 3052, + 0, 2843, 3040, + 0, 2858, 3023, + 0, 2877, 3001, + 0, 2902, 2968, + 0, 2933, 2920, + 0, 2972, 2848, + 0, 3019, 2728, + 0, 3075, 2494, + 0, 3140, 1443, + 0, 3215, 0, + 0, 3299, 0, + 0, 3392, 0, + 0, 3492, 0, + 0, 3599, 0, + 0, 3711, 0, + 0, 2798, 3094, + 0, 2798, 3094, + 0, 2798, 3094, + 0, 2798, 3094, + 0, 2799, 3093, + 0, 2799, 3093, + 0, 2800, 3093, + 0, 2800, 3092, + 0, 2801, 3091, + 0, 2802, 3090, + 0, 2804, 3089, + 0, 2806, 3087, + 0, 2809, 3084, + 0, 2813, 3081, + 0, 2818, 3076, + 0, 2825, 3070, + 0, 2834, 3062, + 0, 2845, 3050, + 0, 2860, 3034, + 0, 2879, 3011, + 0, 2904, 2980, + 0, 2935, 2933, + 0, 2973, 2863, + 0, 3020, 2748, + 0, 3076, 2527, + 0, 3141, 1697, + 0, 3216, 0, + 0, 3300, 0, + 0, 3392, 0, + 0, 3492, 0, + 0, 3599, 0, + 0, 3711, 0, + 0, 2801, 3106, + 0, 2801, 3106, + 0, 2801, 3106, + 0, 2802, 3106, + 0, 2802, 3105, + 0, 2802, 3105, + 0, 2803, 3105, + 0, 2803, 3104, + 0, 2804, 3103, + 0, 2806, 3102, + 0, 2807, 3101, + 0, 2809, 3099, + 0, 2812, 3096, + 0, 2816, 3093, + 0, 2821, 3089, + 0, 2828, 3083, + 0, 2837, 3074, + 0, 2848, 3063, + 0, 2863, 3047, + 0, 2882, 3026, + 0, 2907, 2995, + 0, 2937, 2950, + 0, 2976, 2883, + 0, 3022, 2773, + 0, 3078, 2567, + 0, 3143, 1902, + 0, 3217, 0, + 0, 3301, 0, + 0, 3393, 0, + 0, 3493, 0, + 0, 3599, 0, + 0, 3711, 0, + 0, 2805, 3121, + 0, 2805, 3121, + 0, 2806, 3121, + 0, 2806, 3121, + 0, 2806, 3121, + 0, 2806, 3120, + 0, 2807, 3120, + 0, 2808, 3119, + 0, 2809, 3119, + 0, 2810, 3118, + 0, 2811, 3116, + 0, 2814, 3115, + 0, 2816, 3112, + 0, 2820, 3109, + 0, 2825, 3105, + 0, 2832, 3099, + 0, 2840, 3091, + 0, 2852, 3080, + 0, 2867, 3065, + 0, 2886, 3044, + 0, 2910, 3014, + 0, 2940, 2972, + 0, 2978, 2908, + 0, 3025, 2805, + 0, 3080, 2615, + 0, 3145, 2083, + 0, 3219, 0, + 0, 3302, 0, + 0, 3394, 0, + 0, 3494, 0, + 0, 3600, 0, + 0, 3712, 0, + 0, 2811, 3141, + 0, 2811, 3141, + 0, 2811, 3141, + 0, 2811, 3141, + 0, 2812, 3141, + 0, 2812, 3140, + 0, 2813, 3140, + 0, 2813, 3139, + 0, 2814, 3139, + 0, 2815, 3138, + 0, 2817, 3136, + 0, 2819, 3135, + 0, 2822, 3132, + 0, 2826, 3129, + 0, 2831, 3125, + 0, 2837, 3120, + 0, 2846, 3112, + 0, 2857, 3101, + 0, 2872, 3087, + 0, 2890, 3067, + 0, 2914, 3039, + 0, 2945, 2999, + 0, 2982, 2939, + 0, 3028, 2843, + 0, 3083, 2673, + 0, 3147, 2248, + 0, 3221, 0, + 0, 3304, 0, + 0, 3396, 0, + 0, 3495, 0, + 0, 3601, 0, + 0, 3713, 0, + 1321, 2818, 3166, + 1314, 2818, 3166, + 1305, 2819, 3166, + 1292, 2819, 3166, + 1275, 2819, 3166, + 1251, 2819, 3165, + 1216, 2820, 3165, + 1165, 2821, 3165, + 1087, 2821, 3164, + 956, 2823, 3163, + 686, 2824, 3162, + 0, 2826, 3160, + 0, 2829, 3158, + 0, 2833, 3155, + 0, 2838, 3151, + 0, 2844, 3146, + 0, 2853, 3139, + 0, 2864, 3129, + 0, 2878, 3115, + 0, 2897, 3097, + 0, 2920, 3071, + 0, 2950, 3033, + 0, 2987, 2978, + 0, 3033, 2891, + 0, 3087, 2740, + 0, 3151, 2403, + 0, 3224, 0, + 0, 3307, 0, + 0, 3398, 0, + 0, 3497, 0, + 0, 3603, 0, + 0, 3714, 0, + 2324, 2828, 3198, + 2323, 2828, 3198, + 2322, 2828, 3198, + 2321, 2828, 3198, + 2319, 2829, 3197, + 2317, 2829, 3197, + 2314, 2830, 3197, + 2309, 2830, 3196, + 2304, 2831, 3196, + 2296, 2832, 3195, + 2285, 2834, 3194, + 2270, 2836, 3192, + 2249, 2839, 3190, + 2220, 2842, 3188, + 2178, 2847, 3184, + 2115, 2853, 3179, + 2013, 2862, 3172, + 1828, 2872, 3163, + 1321, 2887, 3151, + 0, 2905, 3134, + 0, 2928, 3109, + 0, 2957, 3075, + 0, 2994, 3025, + 0, 3039, 2947, + 0, 3092, 2817, + 0, 3156, 2552, + 0, 3228, 0, + 0, 3310, 0, + 0, 3401, 0, + 0, 3499, 0, + 0, 3604, 0, + 0, 3715, 0, + 2680, 2841, 3237, + 2680, 2841, 3237, + 2680, 2841, 3237, + 2679, 2841, 3237, + 2678, 2841, 3237, + 2677, 2842, 3236, + 2676, 2842, 3236, + 2674, 2843, 3236, + 2671, 2844, 3235, + 2668, 2845, 3234, + 2663, 2846, 3233, + 2657, 2848, 3232, + 2648, 2851, 3230, + 2636, 2854, 3228, + 2620, 2859, 3224, + 2597, 2865, 3220, + 2564, 2873, 3214, + 2516, 2884, 3205, + 2444, 2898, 3194, + 2324, 2915, 3178, + 2088, 2938, 3157, + 1008, 2967, 3126, + 0, 3003, 3081, + 0, 3047, 3013, + 0, 3100, 2903, + 0, 3162, 2696, + 0, 3233, 2020, + 0, 3315, 0, + 0, 3404, 0, + 0, 3502, 0, + 0, 3607, 0, + 0, 3717, 0, + 2929, 2857, 3285, + 2929, 2857, 3285, + 2928, 2857, 3285, + 2928, 2858, 3284, + 2927, 2858, 3284, + 2927, 2858, 3284, + 2926, 2859, 3284, + 2925, 2859, 3283, + 2923, 2860, 3283, + 2921, 2861, 3282, + 2919, 2863, 3281, + 2915, 2864, 3280, + 2910, 2867, 3278, + 2903, 2870, 3276, + 2894, 2875, 3273, + 2882, 2881, 3269, + 2865, 2889, 3264, + 2841, 2899, 3256, + 2807, 2912, 3246, + 2757, 2929, 3232, + 2680, 2952, 3213, + 2551, 2980, 3186, + 2289, 3014, 3147, + 0, 3057, 3089, + 0, 3109, 2997, + 0, 3170, 2837, + 0, 3240, 2456, + 0, 3320, 0, + 0, 3409, 0, + 0, 3506, 0, + 0, 3610, 0, + 0, 3719, 0, + 3132, 2878, 3341, + 3132, 2878, 3341, + 3131, 2878, 3341, + 3131, 2879, 3341, + 3131, 2879, 3341, + 3130, 2879, 3341, + 3130, 2880, 3341, + 3129, 2880, 3340, + 3128, 2881, 3340, + 3127, 2882, 3339, + 3125, 2883, 3338, + 3123, 2885, 3337, + 3120, 2888, 3336, + 3116, 2891, 3334, + 3110, 2895, 3331, + 3102, 2901, 3328, + 3092, 2908, 3323, + 3077, 2918, 3316, + 3057, 2931, 3307, + 3029, 2947, 3295, + 2989, 2969, 3279, + 2928, 2996, 3255, + 2832, 3029, 3222, + 2659, 3071, 3173, + 2222, 3121, 3099, + 0, 3181, 2975, + 0, 3250, 2729, + 0, 3328, 1243, + 0, 3415, 0, + 0, 3511, 0, + 0, 3614, 0, + 0, 3723, 0, + 3310, 2905, 3408, + 3310, 2905, 3408, + 3310, 2905, 3408, + 3310, 2905, 3407, + 3310, 2906, 3407, + 3309, 2906, 3407, + 3309, 2906, 3407, + 3309, 2907, 3407, + 3308, 2907, 3406, + 3307, 2908, 3406, + 3306, 2910, 3405, + 3304, 2911, 3404, + 3302, 2914, 3403, + 3300, 2917, 3401, + 3296, 2921, 3399, + 3291, 2926, 3396, + 3284, 2933, 3392, + 3274, 2943, 3386, + 3262, 2955, 3378, + 3244, 2970, 3368, + 3219, 2991, 3354, + 3183, 3016, 3334, + 3131, 3049, 3306, + 3050, 3089, 3266, + 2912, 3137, 3207, + 2620, 3195, 3112, + 0, 3262, 2944, + 0, 3338, 2528, + 0, 3424, 0, + 0, 3518, 0, + 0, 3619, 0, + 0, 3727, 0, + 3474, 2938, 3483, + 3474, 2938, 3483, + 3474, 2939, 3483, + 3474, 2939, 3483, + 3474, 2939, 3483, + 3474, 2939, 3483, + 3474, 2940, 3483, + 3473, 2940, 3483, + 3473, 2941, 3482, + 3472, 2942, 3482, + 3471, 2943, 3481, + 3470, 2944, 3480, + 3469, 2947, 3479, + 3467, 2949, 3478, + 3464, 2953, 3476, + 3461, 2958, 3473, + 3456, 2965, 3470, + 3450, 2973, 3465, + 3441, 2985, 3459, + 3429, 3000, 3450, + 3413, 3019, 3438, + 3390, 3043, 3422, + 3357, 3073, 3399, + 3310, 3111, 3367, + 3237, 3157, 3320, + 3117, 3213, 3248, + 2883, 3277, 3129, + 1820, 3351, 2898, + 0, 3435, 1907, + 0, 3527, 0, + 0, 3626, 0, + 0, 3732, 0, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3628, 2981, 3568, + 3628, 2981, 3568, + 3628, 2982, 3567, + 3627, 2983, 3567, + 3627, 2984, 3566, + 3626, 2985, 3566, + 3625, 2987, 3565, + 3624, 2990, 3564, + 3622, 2993, 3562, + 3619, 2998, 3560, + 3616, 3004, 3557, + 3612, 3012, 3553, + 3605, 3022, 3548, + 3597, 3036, 3541, + 3586, 3053, 3531, + 3570, 3076, 3518, + 3549, 3104, 3500, + 3518, 3140, 3474, + 3474, 3183, 3437, + 3406, 3235, 3382, + 3297, 3297, 3297, + 3092, 3368, 3151, + 2441, 3449, 2828, + 0, 3538, 0, + 0, 3636, 0, + 0, 3740, 0, + 3777, 3029, 3662, + 3777, 3029, 3662, + 3777, 3030, 3662, + 3777, 3030, 3661, + 3777, 3030, 3661, + 3777, 3030, 3661, + 3777, 3030, 3661, + 3777, 3031, 3661, + 3776, 3031, 3661, + 3776, 3032, 3660, + 3776, 3033, 3660, + 3775, 3034, 3660, + 3774, 3036, 3659, + 3773, 3038, 3658, + 3772, 3042, 3657, + 3770, 3046, 3655, + 3768, 3051, 3652, + 3765, 3058, 3649, + 3760, 3068, 3645, + 3754, 3080, 3639, + 3747, 3096, 3632, + 3736, 3117, 3621, + 3721, 3143, 3606, + 3700, 3175, 3586, + 3671, 3216, 3558, + 3628, 3265, 3516, + 3564, 3323, 3455, + 3462, 3390, 3356, + 3275, 3467, 3178, + 2755, 3554, 2715, + 0, 3648, 0, + 0, 3750, 0, + 3921, 3088, 3762, + 3921, 3088, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3090, 3762, + 3920, 3090, 3762, + 3920, 3091, 3761, + 3920, 3092, 3761, + 3919, 3093, 3761, + 3919, 3094, 3760, + 3918, 3096, 3759, + 3917, 3099, 3758, + 3916, 3103, 3757, + 3914, 3108, 3755, + 3912, 3114, 3753, + 3909, 3122, 3749, + 3905, 3133, 3745, + 3899, 3148, 3738, + 3891, 3166, 3730, + 3881, 3189, 3719, + 3866, 3219, 3703, + 3846, 3256, 3681, + 3817, 3301, 3650, + 3776, 3355, 3605, + 3715, 3418, 3536, + 3617, 3491, 3424, + 3441, 3573, 3213, + 2987, 3664, 2497, + 0, 3762, 0, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4061, 3158, 3869, + 4061, 3158, 3869, + 4061, 3158, 3869, + 4061, 3159, 3869, + 4061, 3159, 3869, + 4061, 3160, 3869, + 4060, 3161, 3868, + 4060, 3162, 3868, + 4060, 3164, 3867, + 4059, 3166, 3866, + 4058, 3169, 3865, + 4057, 3174, 3864, + 4055, 3179, 3862, + 4053, 3186, 3859, + 4050, 3196, 3856, + 4045, 3208, 3851, + 4040, 3224, 3844, + 4032, 3245, 3835, + 4022, 3271, 3823, + 4008, 3304, 3806, + 3988, 3345, 3783, + 3960, 3394, 3750, + 3920, 3452, 3701, + 3860, 3520, 3626, + 3766, 3598, 3502, + 3598, 3684, 3255, + 3182, 3779, 1720, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3236, 3982, + 4095, 3236, 3982, + 4095, 3236, 3982, + 4095, 3236, 3982, + 4095, 3237, 3981, + 4095, 3238, 3981, + 4095, 3238, 3981, + 4095, 3239, 3981, + 4095, 3241, 3980, + 4095, 3243, 3979, + 4095, 3246, 3979, + 4095, 3249, 3978, + 4095, 3254, 3976, + 4095, 3260, 3974, + 4095, 3268, 3971, + 4095, 3279, 3967, + 4095, 3293, 3962, + 4095, 3310, 3956, + 4095, 3333, 3946, + 4095, 3362, 3934, + 4095, 3398, 3916, + 4095, 3442, 3891, + 4095, 3495, 3856, + 4061, 3557, 3804, + 4002, 3629, 3724, + 3910, 3710, 3589, + 3747, 3800, 3306, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3323, 4095, + 4095, 3323, 4095, + 4095, 3323, 4095, + 4095, 3323, 4095, + 4095, 3324, 4095, + 4095, 3324, 4095, + 4095, 3325, 4095, + 4095, 3326, 4095, + 4095, 3327, 4095, + 4095, 3329, 4095, + 4095, 3331, 4095, + 4095, 3334, 4095, + 4095, 3338, 4094, + 4095, 3343, 4093, + 4095, 3350, 4090, + 4095, 3358, 4088, + 4095, 3370, 4084, + 4095, 3385, 4079, + 4095, 3405, 4071, + 4095, 3429, 4062, + 4095, 3461, 4049, + 4095, 3499, 4030, + 4095, 3546, 4005, + 4095, 3602, 3968, + 4095, 3668, 3914, + 4095, 3743, 3829, + 4051, 3827, 3684, + 0, 2920, 3190, + 0, 2920, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2922, 3188, + 0, 2922, 3188, + 0, 2923, 3187, + 0, 2924, 3186, + 0, 2925, 3185, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3175, + 0, 2941, 3170, + 0, 2948, 3163, + 0, 2957, 3154, + 0, 2969, 3141, + 0, 2984, 3124, + 0, 3004, 3099, + 0, 3029, 3064, + 0, 3060, 3012, + 0, 3099, 2932, + 0, 3146, 2798, + 0, 3203, 2515, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2920, 3190, + 0, 2920, 3190, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2922, 3189, + 0, 2922, 3188, + 0, 2923, 3187, + 0, 2924, 3187, + 0, 2925, 3185, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3175, + 0, 2941, 3170, + 0, 2948, 3163, + 0, 2957, 3154, + 0, 2969, 3142, + 0, 2984, 3124, + 0, 3004, 3099, + 0, 3029, 3064, + 0, 3060, 3013, + 0, 3099, 2933, + 0, 3146, 2798, + 0, 3203, 2516, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2920, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2922, 3189, + 0, 2922, 3188, + 0, 2923, 3188, + 0, 2924, 3187, + 0, 2925, 3186, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3176, + 0, 2941, 3170, + 0, 2948, 3164, + 0, 2957, 3154, + 0, 2969, 3142, + 0, 2984, 3124, + 0, 3004, 3100, + 0, 3029, 3064, + 0, 3060, 3013, + 0, 3099, 2933, + 0, 3146, 2798, + 0, 3203, 2517, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2920, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3189, + 0, 2922, 3189, + 0, 2922, 3188, + 0, 2923, 3188, + 0, 2924, 3187, + 0, 2925, 3186, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3176, + 0, 2941, 3171, + 0, 2948, 3164, + 0, 2957, 3155, + 0, 2969, 3142, + 0, 2984, 3124, + 0, 3004, 3100, + 0, 3029, 3065, + 0, 3060, 3013, + 0, 3099, 2933, + 0, 3146, 2799, + 0, 3203, 2518, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2922, 3189, + 0, 2922, 3189, + 0, 2923, 3188, + 0, 2924, 3187, + 0, 2925, 3186, + 0, 2927, 3185, + 0, 2929, 3183, + 0, 2932, 3180, + 0, 2936, 3176, + 0, 2941, 3171, + 0, 2948, 3164, + 0, 2957, 3155, + 0, 2969, 3142, + 0, 2984, 3125, + 0, 3004, 3100, + 0, 3029, 3065, + 0, 3060, 3014, + 0, 3099, 2934, + 0, 3146, 2799, + 0, 3203, 2519, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2922, 3190, + 0, 2922, 3190, + 0, 2922, 3189, + 0, 2923, 3188, + 0, 2924, 3188, + 0, 2925, 3187, + 0, 2927, 3185, + 0, 2929, 3183, + 0, 2932, 3180, + 0, 2936, 3176, + 0, 2941, 3171, + 0, 2948, 3165, + 0, 2957, 3155, + 0, 2969, 3143, + 0, 2984, 3125, + 0, 3004, 3101, + 0, 3029, 3066, + 0, 3060, 3014, + 0, 3099, 2935, + 0, 3146, 2800, + 0, 3203, 2521, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2922, 3190, + 0, 2922, 3190, + 0, 2923, 3190, + 0, 2923, 3189, + 0, 2924, 3188, + 0, 2925, 3187, + 0, 2927, 3186, + 0, 2929, 3183, + 0, 2932, 3181, + 0, 2936, 3177, + 0, 2941, 3172, + 0, 2948, 3165, + 0, 2957, 3156, + 0, 2969, 3143, + 0, 2984, 3126, + 0, 3004, 3101, + 0, 3029, 3066, + 0, 3060, 3015, + 0, 3099, 2936, + 0, 3147, 2802, + 0, 3203, 2523, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3729, 0, + 0, 2921, 3192, + 0, 2921, 3192, + 0, 2921, 3192, + 0, 2921, 3192, + 0, 2922, 3191, + 0, 2922, 3191, + 0, 2922, 3191, + 0, 2923, 3190, + 0, 2923, 3190, + 0, 2924, 3189, + 0, 2926, 3188, + 0, 2927, 3186, + 0, 2930, 3184, + 0, 2933, 3181, + 0, 2936, 3178, + 0, 2942, 3173, + 0, 2948, 3166, + 0, 2957, 3157, + 0, 2969, 3144, + 0, 2984, 3127, + 0, 3004, 3102, + 0, 3029, 3067, + 0, 3061, 3016, + 0, 3099, 2937, + 0, 3147, 2803, + 0, 3203, 2526, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2921, 3193, + 0, 2921, 3193, + 0, 2921, 3193, + 0, 2922, 3193, + 0, 2922, 3192, + 0, 2922, 3192, + 0, 2922, 3192, + 0, 2923, 3191, + 0, 2924, 3191, + 0, 2925, 3190, + 0, 2926, 3189, + 0, 2928, 3187, + 0, 2930, 3185, + 0, 2933, 3182, + 0, 2937, 3179, + 0, 2942, 3174, + 0, 2949, 3167, + 0, 2958, 3158, + 0, 2969, 3145, + 0, 2985, 3128, + 0, 3004, 3103, + 0, 3029, 3069, + 0, 3061, 3017, + 0, 3100, 2938, + 0, 3147, 2806, + 0, 3203, 2530, + 0, 3269, 0, + 0, 3345, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3193, + 0, 2923, 3193, + 0, 2923, 3193, + 0, 2924, 3192, + 0, 2925, 3191, + 0, 2926, 3190, + 0, 2928, 3188, + 0, 2930, 3186, + 0, 2933, 3184, + 0, 2937, 3180, + 0, 2942, 3175, + 0, 2949, 3168, + 0, 2958, 3159, + 0, 2970, 3147, + 0, 2985, 3129, + 0, 3005, 3105, + 0, 3030, 3070, + 0, 3061, 3019, + 0, 3100, 2941, + 0, 3147, 2808, + 0, 3203, 2536, + 0, 3269, 0, + 0, 3345, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2922, 3196, + 0, 2922, 3196, + 0, 2922, 3196, + 0, 2922, 3196, + 0, 2923, 3195, + 0, 2923, 3195, + 0, 2923, 3195, + 0, 2924, 3194, + 0, 2924, 3194, + 0, 2925, 3193, + 0, 2927, 3192, + 0, 2928, 3190, + 0, 2931, 3188, + 0, 2933, 3185, + 0, 2937, 3182, + 0, 2943, 3177, + 0, 2949, 3170, + 0, 2958, 3161, + 0, 2970, 3148, + 0, 2985, 3131, + 0, 3005, 3107, + 0, 3030, 3072, + 0, 3061, 3022, + 0, 3100, 2944, + 0, 3147, 2812, + 0, 3204, 2543, + 0, 3269, 0, + 0, 3345, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3197, + 0, 2924, 3197, + 0, 2924, 3197, + 0, 2925, 3196, + 0, 2926, 3195, + 0, 2927, 3194, + 0, 2929, 3192, + 0, 2931, 3190, + 0, 2934, 3188, + 0, 2938, 3184, + 0, 2943, 3179, + 0, 2950, 3172, + 0, 2959, 3163, + 0, 2971, 3151, + 0, 2986, 3134, + 0, 3005, 3110, + 0, 3030, 3075, + 0, 3062, 3025, + 0, 3100, 2947, + 0, 3148, 2818, + 0, 3204, 2552, + 0, 3270, 0, + 0, 3345, 0, + 0, 3430, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2923, 3201, + 0, 2923, 3201, + 0, 2924, 3201, + 0, 2924, 3201, + 0, 2924, 3201, + 0, 2924, 3200, + 0, 2925, 3200, + 0, 2925, 3200, + 0, 2926, 3199, + 0, 2927, 3198, + 0, 2928, 3197, + 0, 2930, 3195, + 0, 2932, 3193, + 0, 2935, 3191, + 0, 2939, 3187, + 0, 2944, 3182, + 0, 2951, 3176, + 0, 2960, 3167, + 0, 2971, 3154, + 0, 2986, 3137, + 0, 3006, 3113, + 0, 3031, 3079, + 0, 3062, 3029, + 0, 3101, 2953, + 0, 3148, 2824, + 0, 3204, 2564, + 0, 3270, 0, + 0, 3345, 0, + 0, 3430, 0, + 0, 3523, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2924, 3205, + 0, 2924, 3205, + 0, 2925, 3205, + 0, 2925, 3205, + 0, 2925, 3205, + 0, 2925, 3204, + 0, 2926, 3204, + 0, 2926, 3203, + 0, 2927, 3203, + 0, 2928, 3202, + 0, 2929, 3201, + 0, 2931, 3199, + 0, 2933, 3197, + 0, 2936, 3195, + 0, 2940, 3191, + 0, 2945, 3186, + 0, 2952, 3180, + 0, 2961, 3171, + 0, 2972, 3159, + 0, 2987, 3142, + 0, 3007, 3118, + 0, 3032, 3084, + 0, 3063, 3035, + 0, 3102, 2959, + 0, 3149, 2833, + 0, 3205, 2580, + 0, 3271, 0, + 0, 3346, 0, + 0, 3430, 0, + 0, 3523, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2927, 3210, + 0, 2927, 3209, + 0, 2927, 3209, + 0, 2928, 3208, + 0, 2929, 3207, + 0, 2930, 3206, + 0, 2932, 3205, + 0, 2934, 3203, + 0, 2937, 3200, + 0, 2941, 3197, + 0, 2946, 3192, + 0, 2953, 3185, + 0, 2962, 3176, + 0, 2973, 3164, + 0, 2989, 3148, + 0, 3008, 3124, + 0, 3033, 3091, + 0, 3064, 3043, + 0, 3103, 2968, + 0, 3150, 2845, + 0, 3206, 2601, + 0, 3271, 1202, + 0, 3346, 0, + 0, 3431, 0, + 0, 3523, 0, + 0, 3624, 0, + 0, 3730, 0, + 0, 2927, 3217, + 0, 2928, 3217, + 0, 2928, 3217, + 0, 2928, 3217, + 0, 2928, 3217, + 0, 2928, 3216, + 0, 2929, 3216, + 0, 2929, 3216, + 0, 2930, 3215, + 0, 2931, 3214, + 0, 2932, 3213, + 0, 2934, 3212, + 0, 2936, 3210, + 0, 2939, 3207, + 0, 2943, 3204, + 0, 2948, 3199, + 0, 2955, 3193, + 0, 2963, 3184, + 0, 2975, 3172, + 0, 2990, 3156, + 0, 3010, 3133, + 0, 3034, 3100, + 0, 3065, 3053, + 0, 3104, 2980, + 0, 3151, 2860, + 0, 3207, 2626, + 0, 3272, 1575, + 0, 3347, 0, + 0, 3431, 0, + 0, 3524, 0, + 0, 3624, 0, + 0, 3731, 0, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2931, 3226, + 0, 2931, 3225, + 0, 2932, 3225, + 0, 2932, 3224, + 0, 2933, 3223, + 0, 2934, 3222, + 0, 2936, 3221, + 0, 2938, 3219, + 0, 2941, 3216, + 0, 2945, 3213, + 0, 2950, 3208, + 0, 2957, 3202, + 0, 2966, 3194, + 0, 2977, 3182, + 0, 2992, 3166, + 0, 3012, 3144, + 0, 3036, 3112, + 0, 3067, 3066, + 0, 3105, 2995, + 0, 3152, 2880, + 0, 3208, 2659, + 0, 3273, 1829, + 0, 3348, 0, + 0, 3432, 0, + 0, 3524, 0, + 0, 3624, 0, + 0, 3731, 0, + 0, 2933, 3238, + 0, 2933, 3238, + 0, 2933, 3238, + 0, 2933, 3238, + 0, 2934, 3238, + 0, 2934, 3237, + 0, 2934, 3237, + 0, 2935, 3237, + 0, 2936, 3236, + 0, 2936, 3235, + 0, 2938, 3234, + 0, 2939, 3233, + 0, 2941, 3231, + 0, 2944, 3229, + 0, 2948, 3225, + 0, 2953, 3221, + 0, 2960, 3215, + 0, 2969, 3206, + 0, 2980, 3195, + 0, 2995, 3179, + 0, 3014, 3158, + 0, 3039, 3127, + 0, 3069, 3082, + 0, 3108, 3015, + 0, 3154, 2905, + 0, 3210, 2699, + 0, 3275, 2034, + 0, 3349, 0, + 0, 3433, 0, + 0, 3525, 0, + 0, 3625, 0, + 0, 3732, 0, + 0, 2937, 3254, + 0, 2937, 3253, + 0, 2938, 3253, + 0, 2938, 3253, + 0, 2938, 3253, + 0, 2938, 3253, + 0, 2939, 3252, + 0, 2939, 3252, + 0, 2940, 3252, + 0, 2941, 3251, + 0, 2942, 3250, + 0, 2943, 3248, + 0, 2946, 3247, + 0, 2948, 3244, + 0, 2952, 3241, + 0, 2957, 3237, + 0, 2964, 3231, + 0, 2973, 3223, + 0, 2984, 3212, + 0, 2999, 3197, + 0, 3018, 3176, + 0, 3042, 3147, + 0, 3073, 3104, + 0, 3110, 3040, + 0, 3157, 2937, + 0, 3212, 2747, + 0, 3277, 2215, + 0, 3351, 0, + 0, 3434, 0, + 0, 3526, 0, + 0, 3626, 0, + 0, 3732, 0, + 0, 2943, 3273, + 0, 2943, 3273, + 0, 2943, 3273, + 0, 2943, 3273, + 0, 2944, 3273, + 0, 2944, 3273, + 0, 2944, 3272, + 0, 2945, 3272, + 0, 2945, 3271, + 0, 2946, 3271, + 0, 2947, 3270, + 0, 2949, 3268, + 0, 2951, 3267, + 0, 2954, 3264, + 0, 2958, 3261, + 0, 2963, 3257, + 0, 2969, 3252, + 0, 2978, 3244, + 0, 2989, 3234, + 0, 3004, 3219, + 0, 3022, 3199, + 0, 3046, 3171, + 0, 3077, 3131, + 0, 3114, 3071, + 0, 3160, 2976, + 0, 3215, 2805, + 0, 3279, 2380, + 0, 3353, 0, + 0, 3436, 0, + 0, 3528, 0, + 0, 3627, 0, + 0, 3733, 0, + 1458, 2950, 3298, + 1453, 2950, 3298, + 1446, 2951, 3298, + 1437, 2951, 3298, + 1424, 2951, 3298, + 1407, 2951, 3298, + 1383, 2952, 3298, + 1348, 2952, 3297, + 1297, 2953, 3297, + 1219, 2954, 3296, + 1088, 2955, 3295, + 818, 2956, 3294, + 0, 2958, 3292, + 0, 2961, 3290, + 0, 2965, 3287, + 0, 2970, 3283, + 0, 2976, 3278, + 0, 2985, 3271, + 0, 2996, 3261, + 0, 3010, 3248, + 0, 3029, 3229, + 0, 3052, 3203, + 0, 3082, 3165, + 0, 3119, 3110, + 0, 3165, 3023, + 0, 3219, 2873, + 0, 3283, 2535, + 0, 3356, 0, + 0, 3439, 0, + 0, 3530, 0, + 0, 3629, 0, + 0, 3735, 0, + 2457, 2960, 3330, + 2456, 2960, 3330, + 2456, 2960, 3330, + 2455, 2960, 3330, + 2453, 2961, 3330, + 2451, 2961, 3330, + 2449, 2961, 3329, + 2446, 2962, 3329, + 2442, 2962, 3328, + 2436, 2963, 3328, + 2428, 2964, 3327, + 2417, 2966, 3326, + 2402, 2968, 3324, + 2382, 2971, 3322, + 2352, 2974, 3320, + 2310, 2979, 3316, + 2247, 2985, 3311, + 2145, 2994, 3304, + 1960, 3004, 3295, + 1453, 3019, 3283, + 0, 3037, 3266, + 0, 3060, 3242, + 0, 3090, 3207, + 0, 3126, 3157, + 0, 3171, 3079, + 0, 3225, 2949, + 0, 3288, 2684, + 0, 3360, 0, + 0, 3442, 0, + 0, 3533, 0, + 0, 3631, 0, + 0, 3736, 0, + 2813, 2973, 3369, + 2813, 2973, 3369, + 2812, 2973, 3369, + 2812, 2973, 3369, + 2811, 2973, 3369, + 2810, 2974, 3369, + 2809, 2974, 3369, + 2808, 2974, 3368, + 2806, 2975, 3368, + 2803, 2976, 3367, + 2800, 2977, 3366, + 2795, 2978, 3365, + 2789, 2980, 3364, + 2780, 2983, 3362, + 2768, 2987, 3360, + 2752, 2991, 3356, + 2729, 2997, 3352, + 2696, 3005, 3346, + 2648, 3016, 3337, + 2576, 3030, 3326, + 2456, 3048, 3310, + 2220, 3070, 3289, + 1140, 3099, 3258, + 0, 3135, 3213, + 0, 3179, 3145, + 0, 3232, 3035, + 0, 3294, 2828, + 0, 3366, 2152, + 0, 3447, 0, + 0, 3536, 0, + 0, 3634, 0, + 0, 3739, 0, + 3061, 2989, 3417, + 3061, 2989, 3417, + 3061, 2989, 3417, + 3060, 2989, 3417, + 3060, 2990, 3417, + 3060, 2990, 3416, + 3059, 2990, 3416, + 3058, 2991, 3416, + 3057, 2991, 3415, + 3055, 2992, 3415, + 3053, 2993, 3414, + 3051, 2995, 3413, + 3047, 2997, 3412, + 3042, 2999, 3410, + 3036, 3002, 3408, + 3027, 3007, 3405, + 3014, 3013, 3401, + 2997, 3021, 3396, + 2973, 3031, 3388, + 2939, 3044, 3378, + 2889, 3062, 3364, + 2812, 3084, 3345, + 2683, 3112, 3318, + 2421, 3147, 3279, + 0, 3189, 3221, + 0, 3241, 3129, + 0, 3302, 2969, + 0, 3373, 2588, + 0, 3452, 0, + 0, 3541, 0, + 0, 3638, 0, + 0, 3742, 0, + 3264, 3010, 3474, + 3264, 3010, 3474, + 3264, 3010, 3473, + 3263, 3010, 3473, + 3263, 3011, 3473, + 3263, 3011, 3473, + 3263, 3011, 3473, + 3262, 3012, 3473, + 3261, 3012, 3472, + 3260, 3013, 3472, + 3259, 3014, 3471, + 3257, 3015, 3470, + 3255, 3017, 3469, + 3252, 3020, 3468, + 3248, 3023, 3466, + 3242, 3027, 3463, + 3234, 3033, 3460, + 3224, 3040, 3455, + 3210, 3050, 3448, + 3190, 3063, 3440, + 3161, 3080, 3427, + 3121, 3101, 3411, + 3060, 3128, 3387, + 2964, 3162, 3354, + 2791, 3203, 3305, + 2354, 3253, 3231, + 0, 3313, 3107, + 0, 3382, 2861, + 0, 3460, 1375, + 0, 3548, 0, + 0, 3643, 0, + 0, 3746, 0, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3038, 3539, + 3442, 3038, 3539, + 3441, 3038, 3539, + 3441, 3039, 3539, + 3440, 3040, 3538, + 3439, 3041, 3538, + 3438, 3042, 3537, + 3437, 3044, 3536, + 3434, 3046, 3535, + 3432, 3049, 3533, + 3428, 3053, 3531, + 3423, 3058, 3528, + 3416, 3065, 3524, + 3407, 3075, 3518, + 3394, 3087, 3511, + 3376, 3103, 3500, + 3351, 3123, 3486, + 3315, 3149, 3466, + 3263, 3181, 3438, + 3182, 3221, 3398, + 3044, 3269, 3339, + 2752, 3327, 3244, + 0, 3394, 3076, + 0, 3470, 2660, + 0, 3556, 0, + 0, 3650, 0, + 0, 3751, 0, + 3606, 3070, 3616, + 3606, 3070, 3616, + 3606, 3071, 3616, + 3606, 3071, 3615, + 3606, 3071, 3615, + 3606, 3071, 3615, + 3606, 3071, 3615, + 3606, 3072, 3615, + 3605, 3072, 3615, + 3605, 3073, 3614, + 3604, 3074, 3614, + 3603, 3075, 3613, + 3602, 3077, 3613, + 3601, 3079, 3611, + 3599, 3082, 3610, + 3596, 3085, 3608, + 3593, 3090, 3605, + 3588, 3097, 3602, + 3582, 3106, 3597, + 3573, 3117, 3591, + 3561, 3132, 3582, + 3545, 3151, 3570, + 3522, 3175, 3554, + 3489, 3205, 3531, + 3442, 3243, 3499, + 3369, 3289, 3452, + 3249, 3345, 3380, + 3015, 3409, 3261, + 1952, 3483, 3030, + 0, 3567, 2039, + 0, 3659, 0, + 0, 3758, 0, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3760, 3113, 3700, + 3760, 3113, 3700, + 3760, 3114, 3699, + 3759, 3115, 3699, + 3759, 3116, 3699, + 3758, 3117, 3698, + 3757, 3119, 3697, + 3756, 3122, 3696, + 3754, 3125, 3694, + 3751, 3130, 3692, + 3748, 3136, 3689, + 3744, 3144, 3685, + 3738, 3154, 3680, + 3729, 3168, 3673, + 3718, 3185, 3663, + 3702, 3208, 3650, + 3681, 3236, 3632, + 3650, 3272, 3606, + 3606, 3315, 3569, + 3538, 3368, 3514, + 3429, 3429, 3429, + 3224, 3501, 3283, + 2573, 3581, 2960, + 0, 3671, 0, + 0, 3768, 0, + 3909, 3161, 3794, + 3909, 3161, 3794, + 3909, 3162, 3794, + 3909, 3162, 3794, + 3909, 3162, 3794, + 3909, 3162, 3794, + 3909, 3162, 3793, + 3909, 3162, 3793, + 3909, 3163, 3793, + 3908, 3163, 3793, + 3908, 3164, 3793, + 3908, 3165, 3792, + 3907, 3166, 3792, + 3906, 3168, 3791, + 3905, 3171, 3790, + 3904, 3174, 3789, + 3902, 3178, 3787, + 3900, 3183, 3785, + 3897, 3190, 3781, + 3892, 3200, 3777, + 3887, 3212, 3771, + 3879, 3228, 3764, + 3868, 3249, 3753, + 3853, 3275, 3739, + 3832, 3307, 3718, + 3803, 3348, 3690, + 3760, 3397, 3648, + 3696, 3455, 3587, + 3594, 3522, 3488, + 3407, 3599, 3311, + 2887, 3686, 2847, + 0, 3780, 0, + 4053, 3220, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3222, 3894, + 4052, 3222, 3894, + 4052, 3223, 3894, + 4052, 3224, 3893, + 4052, 3225, 3893, + 4051, 3226, 3892, + 4050, 3229, 3891, + 4049, 3231, 3890, + 4048, 3235, 3889, + 4046, 3240, 3887, + 4044, 3246, 3885, + 4041, 3254, 3881, + 4037, 3265, 3877, + 4031, 3280, 3871, + 4023, 3298, 3862, + 4013, 3321, 3851, + 3998, 3351, 3835, + 3978, 3388, 3813, + 3950, 3433, 3782, + 3908, 3487, 3737, + 3847, 3550, 3668, + 3749, 3623, 3557, + 3573, 3705, 3345, + 3119, 3796, 2630, + 4095, 3289, 4002, + 4095, 3289, 4002, + 4095, 3289, 4002, + 4095, 3289, 4002, + 4095, 3289, 4001, + 4095, 3290, 4001, + 4095, 3290, 4001, + 4095, 3290, 4001, + 4095, 3290, 4001, + 4095, 3291, 4001, + 4095, 3291, 4001, + 4095, 3292, 4001, + 4095, 3293, 4000, + 4095, 3294, 4000, + 4095, 3296, 3999, + 4095, 3298, 3998, + 4095, 3302, 3997, + 4095, 3306, 3996, + 4095, 3311, 3994, + 4095, 3318, 3991, + 4095, 3328, 3988, + 4095, 3340, 3983, + 4095, 3357, 3976, + 4095, 3377, 3967, + 4095, 3403, 3955, + 4095, 3436, 3939, + 4095, 3477, 3915, + 4092, 3526, 3882, + 4052, 3585, 3833, + 3993, 3653, 3758, + 3898, 3730, 3634, + 3730, 3816, 3387, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3368, 4095, + 4095, 3368, 4095, + 4095, 3368, 4095, + 4095, 3368, 4095, + 4095, 3369, 4095, + 4095, 3369, 4095, + 4095, 3370, 4095, + 4095, 3370, 4095, + 4095, 3372, 4095, + 4095, 3373, 4095, + 4095, 3375, 4095, + 4095, 3378, 4095, + 4095, 3381, 4095, + 4095, 3386, 4095, + 4095, 3392, 4095, + 4095, 3400, 4095, + 4095, 3411, 4095, + 4095, 3425, 4094, + 4095, 3442, 4088, + 4095, 3465, 4078, + 4095, 3494, 4066, + 4095, 3530, 4048, + 4095, 3574, 4023, + 4095, 3627, 3988, + 4095, 3689, 3936, + 4095, 3761, 3857, + 4042, 3842, 3721, + 0, 3052, 3322, + 0, 3052, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3320, + 0, 3054, 3320, + 0, 3055, 3319, + 0, 3056, 3318, + 0, 3057, 3317, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3307, + 0, 3073, 3302, + 0, 3080, 3295, + 0, 3089, 3286, + 0, 3101, 3273, + 0, 3116, 3256, + 0, 3136, 3231, + 0, 3161, 3196, + 0, 3192, 3144, + 0, 3231, 3064, + 0, 3278, 2929, + 0, 3335, 2647, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3052, 3322, + 0, 3052, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3320, + 0, 3054, 3320, + 0, 3055, 3319, + 0, 3056, 3319, + 0, 3057, 3317, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3307, + 0, 3073, 3302, + 0, 3080, 3295, + 0, 3089, 3286, + 0, 3101, 3273, + 0, 3116, 3256, + 0, 3136, 3231, + 0, 3161, 3196, + 0, 3192, 3144, + 0, 3231, 3065, + 0, 3278, 2930, + 0, 3335, 2648, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3052, 3322, + 0, 3052, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3321, + 0, 3054, 3320, + 0, 3055, 3319, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3307, + 0, 3073, 3302, + 0, 3080, 3296, + 0, 3089, 3286, + 0, 3101, 3274, + 0, 3116, 3256, + 0, 3136, 3231, + 0, 3161, 3196, + 0, 3192, 3145, + 0, 3231, 3065, + 0, 3278, 2930, + 0, 3335, 2648, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3052, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3321, + 0, 3054, 3320, + 0, 3055, 3320, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3308, + 0, 3073, 3303, + 0, 3080, 3296, + 0, 3089, 3286, + 0, 3101, 3274, + 0, 3116, 3256, + 0, 3136, 3232, + 0, 3161, 3197, + 0, 3192, 3145, + 0, 3231, 3065, + 0, 3278, 2930, + 0, 3335, 2649, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3054, 3321, + 0, 3054, 3321, + 0, 3055, 3320, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3312, + 0, 3068, 3308, + 0, 3073, 3303, + 0, 3080, 3296, + 0, 3089, 3287, + 0, 3101, 3274, + 0, 3116, 3256, + 0, 3136, 3232, + 0, 3161, 3197, + 0, 3192, 3145, + 0, 3231, 3065, + 0, 3278, 2931, + 0, 3335, 2650, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3323, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3054, 3322, + 0, 3054, 3321, + 0, 3054, 3321, + 0, 3055, 3320, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3317, + 0, 3061, 3315, + 0, 3064, 3312, + 0, 3068, 3308, + 0, 3073, 3303, + 0, 3080, 3296, + 0, 3089, 3287, + 0, 3101, 3274, + 0, 3116, 3257, + 0, 3136, 3232, + 0, 3161, 3197, + 0, 3192, 3146, + 0, 3231, 3066, + 0, 3279, 2932, + 0, 3335, 2651, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3322, + 0, 3054, 3322, + 0, 3054, 3322, + 0, 3055, 3321, + 0, 3055, 3321, + 0, 3056, 3320, + 0, 3057, 3319, + 0, 3059, 3317, + 0, 3061, 3315, + 0, 3064, 3312, + 0, 3068, 3309, + 0, 3073, 3304, + 0, 3080, 3297, + 0, 3089, 3287, + 0, 3101, 3275, + 0, 3116, 3257, + 0, 3136, 3233, + 0, 3161, 3198, + 0, 3192, 3146, + 0, 3231, 3067, + 0, 3279, 2932, + 0, 3335, 2653, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3054, 3323, + 0, 3054, 3322, + 0, 3055, 3322, + 0, 3055, 3321, + 0, 3056, 3320, + 0, 3058, 3319, + 0, 3059, 3318, + 0, 3061, 3316, + 0, 3064, 3313, + 0, 3068, 3309, + 0, 3074, 3304, + 0, 3080, 3297, + 0, 3089, 3288, + 0, 3101, 3275, + 0, 3116, 3258, + 0, 3136, 3233, + 0, 3161, 3198, + 0, 3192, 3147, + 0, 3231, 3068, + 0, 3279, 2934, + 0, 3335, 2655, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3054, 3324, + 0, 3054, 3323, + 0, 3054, 3323, + 0, 3055, 3322, + 0, 3056, 3322, + 0, 3057, 3321, + 0, 3058, 3320, + 0, 3059, 3318, + 0, 3062, 3316, + 0, 3065, 3314, + 0, 3069, 3310, + 0, 3074, 3305, + 0, 3081, 3298, + 0, 3090, 3289, + 0, 3101, 3276, + 0, 3117, 3259, + 0, 3136, 3234, + 0, 3161, 3199, + 0, 3193, 3148, + 0, 3231, 3069, + 0, 3279, 2935, + 0, 3335, 2658, + 0, 3401, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3325, + 0, 3053, 3325, + 0, 3053, 3325, + 0, 3054, 3325, + 0, 3054, 3325, + 0, 3054, 3325, + 0, 3054, 3324, + 0, 3055, 3324, + 0, 3055, 3323, + 0, 3056, 3323, + 0, 3057, 3322, + 0, 3058, 3321, + 0, 3060, 3319, + 0, 3062, 3317, + 0, 3065, 3314, + 0, 3069, 3311, + 0, 3074, 3306, + 0, 3081, 3299, + 0, 3090, 3290, + 0, 3102, 3277, + 0, 3117, 3260, + 0, 3136, 3235, + 0, 3161, 3201, + 0, 3193, 3149, + 0, 3232, 3071, + 0, 3279, 2938, + 0, 3335, 2662, + 0, 3401, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3055, 3326, + 0, 3055, 3325, + 0, 3055, 3325, + 0, 3056, 3324, + 0, 3057, 3323, + 0, 3058, 3322, + 0, 3060, 3321, + 0, 3062, 3319, + 0, 3065, 3316, + 0, 3069, 3312, + 0, 3074, 3307, + 0, 3081, 3300, + 0, 3090, 3291, + 0, 3102, 3279, + 0, 3117, 3261, + 0, 3137, 3237, + 0, 3162, 3202, + 0, 3193, 3151, + 0, 3232, 3073, + 0, 3279, 2941, + 0, 3335, 2668, + 0, 3401, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3055, 3327, + 0, 3055, 3327, + 0, 3055, 3327, + 0, 3056, 3326, + 0, 3057, 3326, + 0, 3057, 3325, + 0, 3059, 3324, + 0, 3060, 3322, + 0, 3063, 3320, + 0, 3066, 3318, + 0, 3069, 3314, + 0, 3075, 3309, + 0, 3081, 3302, + 0, 3090, 3293, + 0, 3102, 3281, + 0, 3117, 3263, + 0, 3137, 3239, + 0, 3162, 3204, + 0, 3193, 3154, + 0, 3232, 3076, + 0, 3279, 2944, + 0, 3336, 2675, + 0, 3402, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3056, 3329, + 0, 3056, 3329, + 0, 3056, 3329, + 0, 3057, 3328, + 0, 3058, 3327, + 0, 3059, 3326, + 0, 3061, 3325, + 0, 3063, 3323, + 0, 3066, 3320, + 0, 3070, 3316, + 0, 3075, 3311, + 0, 3082, 3305, + 0, 3091, 3295, + 0, 3103, 3283, + 0, 3118, 3266, + 0, 3137, 3242, + 0, 3162, 3207, + 0, 3194, 3157, + 0, 3233, 3080, + 0, 3280, 2950, + 0, 3336, 2684, + 0, 3402, 0, + 0, 3477, 0, + 0, 3562, 0, + 0, 3655, 0, + 0, 3755, 0, + 0, 3055, 3333, + 0, 3055, 3333, + 0, 3055, 3333, + 0, 3056, 3333, + 0, 3056, 3333, + 0, 3056, 3333, + 0, 3056, 3332, + 0, 3057, 3332, + 0, 3057, 3332, + 0, 3058, 3331, + 0, 3059, 3330, + 0, 3060, 3329, + 0, 3062, 3328, + 0, 3064, 3326, + 0, 3067, 3323, + 0, 3071, 3319, + 0, 3076, 3314, + 0, 3083, 3308, + 0, 3092, 3299, + 0, 3103, 3286, + 0, 3119, 3269, + 0, 3138, 3245, + 0, 3163, 3211, + 0, 3194, 3161, + 0, 3233, 3085, + 0, 3280, 2957, + 0, 3336, 2696, + 0, 3402, 0, + 0, 3477, 0, + 0, 3562, 0, + 0, 3655, 0, + 0, 3755, 0, + 0, 3056, 3337, + 0, 3056, 3337, + 0, 3056, 3337, + 0, 3057, 3337, + 0, 3057, 3337, + 0, 3057, 3337, + 0, 3057, 3336, + 0, 3058, 3336, + 0, 3058, 3336, + 0, 3059, 3335, + 0, 3060, 3334, + 0, 3061, 3333, + 0, 3063, 3332, + 0, 3065, 3330, + 0, 3068, 3327, + 0, 3072, 3323, + 0, 3077, 3318, + 0, 3084, 3312, + 0, 3093, 3303, + 0, 3104, 3291, + 0, 3119, 3274, + 0, 3139, 3250, + 0, 3164, 3216, + 0, 3195, 3167, + 0, 3234, 3092, + 0, 3281, 2966, + 0, 3337, 2712, + 0, 3403, 0, + 0, 3478, 0, + 0, 3562, 0, + 0, 3655, 0, + 0, 3755, 0, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3059, 3342, + 0, 3059, 3341, + 0, 3060, 3341, + 0, 3060, 3340, + 0, 3061, 3339, + 0, 3062, 3338, + 0, 3064, 3337, + 0, 3066, 3335, + 0, 3069, 3332, + 0, 3073, 3329, + 0, 3078, 3324, + 0, 3085, 3317, + 0, 3094, 3309, + 0, 3106, 3296, + 0, 3121, 3280, + 0, 3140, 3256, + 0, 3165, 3223, + 0, 3196, 3175, + 0, 3235, 3100, + 0, 3282, 2977, + 0, 3338, 2733, + 0, 3403, 1334, + 0, 3478, 0, + 0, 3563, 0, + 0, 3655, 0, + 0, 3756, 0, + 0, 3059, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3061, 3348, + 0, 3061, 3348, + 0, 3062, 3347, + 0, 3063, 3346, + 0, 3064, 3345, + 0, 3066, 3344, + 0, 3068, 3342, + 0, 3071, 3339, + 0, 3075, 3336, + 0, 3080, 3331, + 0, 3087, 3325, + 0, 3096, 3316, + 0, 3107, 3304, + 0, 3122, 3288, + 0, 3142, 3265, + 0, 3166, 3232, + 0, 3197, 3185, + 0, 3236, 3112, + 0, 3283, 2993, + 0, 3339, 2758, + 0, 3404, 1707, + 0, 3479, 0, + 0, 3563, 0, + 0, 3656, 0, + 0, 3756, 0, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3063, 3358, + 0, 3063, 3358, + 0, 3063, 3357, + 0, 3064, 3357, + 0, 3064, 3356, + 0, 3065, 3355, + 0, 3067, 3354, + 0, 3068, 3353, + 0, 3070, 3351, + 0, 3073, 3349, + 0, 3077, 3345, + 0, 3082, 3341, + 0, 3089, 3334, + 0, 3098, 3326, + 0, 3109, 3314, + 0, 3124, 3298, + 0, 3144, 3276, + 0, 3168, 3244, + 0, 3199, 3198, + 0, 3238, 3127, + 0, 3284, 3012, + 0, 3340, 2791, + 0, 3405, 1961, + 0, 3480, 0, + 0, 3564, 0, + 0, 3657, 0, + 0, 3757, 0, + 0, 3065, 3370, + 0, 3065, 3370, + 0, 3065, 3370, + 0, 3065, 3370, + 0, 3066, 3370, + 0, 3066, 3370, + 0, 3066, 3369, + 0, 3066, 3369, + 0, 3067, 3369, + 0, 3068, 3368, + 0, 3069, 3367, + 0, 3070, 3366, + 0, 3071, 3365, + 0, 3074, 3363, + 0, 3076, 3361, + 0, 3080, 3357, + 0, 3085, 3353, + 0, 3092, 3347, + 0, 3101, 3338, + 0, 3112, 3327, + 0, 3127, 3312, + 0, 3146, 3290, + 0, 3171, 3259, + 0, 3202, 3214, + 0, 3240, 3147, + 0, 3286, 3037, + 0, 3342, 2831, + 0, 3407, 2166, + 0, 3481, 0, + 0, 3565, 0, + 0, 3657, 0, + 0, 3757, 0, + 0, 3069, 3386, + 0, 3069, 3386, + 0, 3070, 3386, + 0, 3070, 3385, + 0, 3070, 3385, + 0, 3070, 3385, + 0, 3070, 3385, + 0, 3071, 3385, + 0, 3071, 3384, + 0, 3072, 3384, + 0, 3073, 3383, + 0, 3074, 3382, + 0, 3076, 3381, + 0, 3078, 3379, + 0, 3081, 3376, + 0, 3084, 3373, + 0, 3089, 3369, + 0, 3096, 3363, + 0, 3105, 3355, + 0, 3116, 3344, + 0, 3131, 3329, + 0, 3150, 3308, + 0, 3174, 3279, + 0, 3205, 3236, + 0, 3243, 3172, + 0, 3289, 3069, + 0, 3344, 2880, + 0, 3409, 2347, + 0, 3483, 0, + 0, 3567, 0, + 0, 3659, 0, + 0, 3758, 0, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3076, 3405, + 0, 3076, 3405, + 0, 3076, 3404, + 0, 3077, 3404, + 0, 3077, 3404, + 0, 3078, 3403, + 0, 3080, 3402, + 0, 3081, 3401, + 0, 3083, 3399, + 0, 3086, 3397, + 0, 3090, 3393, + 0, 3095, 3389, + 0, 3101, 3384, + 0, 3110, 3376, + 0, 3121, 3366, + 0, 3136, 3351, + 0, 3155, 3332, + 0, 3179, 3304, + 0, 3209, 3263, + 0, 3246, 3203, + 0, 3292, 3108, + 0, 3347, 2937, + 0, 3411, 2512, + 0, 3485, 0, + 0, 3568, 0, + 0, 3660, 0, + 0, 3759, 0, + 1593, 3082, 3431, + 1590, 3082, 3431, + 1585, 3083, 3431, + 1578, 3083, 3430, + 1569, 3083, 3430, + 1556, 3083, 3430, + 1539, 3083, 3430, + 1515, 3084, 3430, + 1480, 3084, 3429, + 1429, 3085, 3429, + 1351, 3086, 3428, + 1220, 3087, 3427, + 950, 3088, 3426, + 0, 3090, 3424, + 0, 3093, 3422, + 0, 3097, 3419, + 0, 3102, 3415, + 0, 3108, 3410, + 0, 3117, 3403, + 0, 3128, 3393, + 0, 3142, 3380, + 0, 3161, 3361, + 0, 3184, 3335, + 0, 3214, 3297, + 0, 3252, 3242, + 0, 3297, 3155, + 0, 3351, 3005, + 0, 3415, 2667, + 0, 3488, 0, + 0, 3571, 0, + 0, 3662, 0, + 0, 3761, 0, + 2589, 3092, 3462, + 2589, 3092, 3462, + 2588, 3092, 3462, + 2588, 3092, 3462, + 2587, 3092, 3462, + 2585, 3093, 3462, + 2584, 3093, 3462, + 2581, 3093, 3461, + 2578, 3094, 3461, + 2574, 3094, 3461, + 2568, 3095, 3460, + 2560, 3096, 3459, + 2549, 3098, 3458, + 2534, 3100, 3456, + 2514, 3103, 3454, + 2484, 3106, 3452, + 2442, 3111, 3448, + 2379, 3117, 3443, + 2277, 3126, 3436, + 2092, 3137, 3427, + 1586, 3151, 3415, + 0, 3169, 3398, + 0, 3192, 3374, + 0, 3222, 3339, + 0, 3258, 3289, + 0, 3303, 3211, + 0, 3357, 3081, + 0, 3420, 2816, + 0, 3492, 0, + 0, 3574, 0, + 0, 3665, 0, + 0, 3763, 0, + 2945, 3105, 3501, + 2945, 3105, 3501, + 2945, 3105, 3501, + 2944, 3105, 3501, + 2944, 3105, 3501, + 2943, 3105, 3501, + 2942, 3106, 3501, + 2941, 3106, 3501, + 2940, 3106, 3500, + 2938, 3107, 3500, + 2935, 3108, 3499, + 2932, 3109, 3499, + 2927, 3110, 3497, + 2921, 3112, 3496, + 2912, 3115, 3494, + 2900, 3119, 3492, + 2884, 3123, 3488, + 2861, 3129, 3484, + 2828, 3137, 3478, + 2780, 3148, 3470, + 2708, 3162, 3458, + 2588, 3180, 3443, + 2352, 3202, 3421, + 1272, 3231, 3390, + 0, 3267, 3345, + 0, 3311, 3277, + 0, 3364, 3167, + 0, 3426, 2960, + 0, 3498, 2284, + 0, 3579, 0, + 0, 3669, 0, + 0, 3766, 0, + 3193, 3121, 3549, + 3193, 3121, 3549, + 3193, 3121, 3549, + 3193, 3121, 3549, + 3192, 3122, 3549, + 3192, 3122, 3549, + 3192, 3122, 3548, + 3191, 3122, 3548, + 3190, 3123, 3548, + 3189, 3123, 3548, + 3188, 3124, 3547, + 3186, 3125, 3546, + 3183, 3127, 3545, + 3179, 3129, 3544, + 3174, 3131, 3543, + 3168, 3135, 3540, + 3159, 3139, 3537, + 3146, 3145, 3533, + 3129, 3153, 3528, + 3105, 3163, 3520, + 3071, 3176, 3510, + 3021, 3194, 3496, + 2944, 3216, 3477, + 2815, 3244, 3450, + 2553, 3279, 3411, + 0, 3321, 3353, + 0, 3373, 3261, + 0, 3434, 3101, + 0, 3505, 2720, + 0, 3585, 0, + 0, 3673, 0, + 0, 3770, 0, + 3396, 3142, 3606, + 3396, 3142, 3606, + 3396, 3142, 3606, + 3396, 3142, 3606, + 3396, 3143, 3605, + 3395, 3143, 3605, + 3395, 3143, 3605, + 3395, 3143, 3605, + 3394, 3144, 3605, + 3393, 3144, 3604, + 3392, 3145, 3604, + 3391, 3146, 3603, + 3389, 3148, 3603, + 3387, 3149, 3601, + 3384, 3152, 3600, + 3380, 3155, 3598, + 3374, 3159, 3595, + 3367, 3165, 3592, + 3356, 3172, 3587, + 3342, 3182, 3581, + 3322, 3195, 3572, + 3294, 3212, 3560, + 3253, 3233, 3543, + 3192, 3260, 3519, + 3096, 3294, 3486, + 2923, 3335, 3437, + 2486, 3385, 3363, + 0, 3445, 3239, + 0, 3514, 2993, + 0, 3592, 1507, + 0, 3680, 0, + 0, 3775, 0, + 3575, 3169, 3672, + 3575, 3169, 3672, + 3574, 3169, 3672, + 3574, 3169, 3672, + 3574, 3169, 3672, + 3574, 3169, 3672, + 3574, 3170, 3672, + 3574, 3170, 3671, + 3573, 3170, 3671, + 3573, 3171, 3671, + 3572, 3172, 3670, + 3571, 3173, 3670, + 3570, 3174, 3669, + 3569, 3176, 3668, + 3567, 3178, 3667, + 3564, 3181, 3665, + 3560, 3185, 3663, + 3555, 3190, 3660, + 3548, 3198, 3656, + 3539, 3207, 3650, + 3526, 3219, 3643, + 3508, 3235, 3632, + 3483, 3255, 3618, + 3448, 3281, 3598, + 3395, 3313, 3571, + 3314, 3353, 3531, + 3176, 3401, 3471, + 2884, 3459, 3376, + 0, 3526, 3208, + 0, 3602, 2792, + 0, 3688, 0, + 0, 3782, 0, + 3739, 3202, 3748, + 3739, 3202, 3748, + 3739, 3203, 3748, + 3738, 3203, 3748, + 3738, 3203, 3748, + 3738, 3203, 3747, + 3738, 3203, 3747, + 3738, 3203, 3747, + 3738, 3204, 3747, + 3737, 3204, 3747, + 3737, 3205, 3746, + 3736, 3206, 3746, + 3736, 3207, 3745, + 3734, 3209, 3745, + 3733, 3211, 3744, + 3731, 3214, 3742, + 3728, 3217, 3740, + 3725, 3222, 3738, + 3720, 3229, 3734, + 3714, 3238, 3729, + 3705, 3249, 3723, + 3693, 3264, 3714, + 3677, 3283, 3703, + 3654, 3307, 3686, + 3621, 3338, 3663, + 3574, 3375, 3631, + 3501, 3422, 3584, + 3381, 3477, 3512, + 3147, 3541, 3393, + 2084, 3616, 3162, + 0, 3699, 2171, + 0, 3791, 0, + 3893, 3244, 3833, + 3893, 3244, 3833, + 3893, 3244, 3833, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3245, 3832, + 3892, 3245, 3832, + 3892, 3246, 3832, + 3892, 3247, 3831, + 3891, 3248, 3831, + 3890, 3249, 3830, + 3889, 3251, 3829, + 3888, 3254, 3828, + 3886, 3257, 3826, + 3884, 3262, 3824, + 3880, 3268, 3821, + 3876, 3276, 3817, + 3870, 3286, 3812, + 3861, 3300, 3805, + 3850, 3318, 3795, + 3835, 3340, 3782, + 3813, 3368, 3764, + 3782, 3404, 3738, + 3738, 3447, 3701, + 3670, 3500, 3646, + 3561, 3561, 3561, + 3357, 3633, 3415, + 2705, 3713, 3092, + 0, 3803, 0, + 4041, 3293, 3926, + 4041, 3293, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3295, 3925, + 4041, 3295, 3925, + 4041, 3296, 3925, + 4040, 3296, 3925, + 4040, 3297, 3924, + 4039, 3299, 3924, + 4039, 3300, 3923, + 4038, 3303, 3922, + 4036, 3306, 3921, + 4034, 3310, 3919, + 4032, 3315, 3917, + 4029, 3322, 3914, + 4025, 3332, 3909, + 4019, 3344, 3904, + 4011, 3360, 3896, + 4000, 3381, 3885, + 3985, 3407, 3871, + 3964, 3440, 3850, + 3935, 3480, 3822, + 3892, 3529, 3781, + 3829, 3587, 3719, + 3726, 3654, 3620, + 3539, 3732, 3443, + 3019, 3818, 2979, + 4095, 3353, 4027, + 4095, 3353, 4027, + 4095, 3353, 4027, + 4095, 3353, 4027, + 4095, 3353, 4026, + 4095, 3353, 4026, + 4095, 3353, 4026, + 4095, 3353, 4026, + 4095, 3354, 4026, + 4095, 3354, 4026, + 4095, 3354, 4026, + 4095, 3355, 4026, + 4095, 3356, 4025, + 4095, 3357, 4025, + 4095, 3359, 4024, + 4095, 3361, 4024, + 4095, 3363, 4023, + 4095, 3367, 4021, + 4095, 3372, 4019, + 4095, 3378, 4017, + 4095, 3387, 4013, + 4095, 3397, 4009, + 4095, 3412, 4003, + 4095, 3430, 3994, + 4095, 3454, 3983, + 4095, 3483, 3967, + 4095, 3520, 3945, + 4082, 3565, 3914, + 4041, 3619, 3869, + 3979, 3682, 3800, + 3881, 3755, 3689, + 3706, 3837, 3477, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3422, 4095, + 4095, 3422, 4095, + 4095, 3422, 4095, + 4095, 3422, 4095, + 4095, 3423, 4095, + 4095, 3423, 4095, + 4095, 3424, 4095, + 4095, 3425, 4095, + 4095, 3426, 4095, + 4095, 3428, 4095, + 4095, 3431, 4095, + 4095, 3434, 4095, + 4095, 3438, 4095, + 4095, 3443, 4095, + 4095, 3451, 4095, + 4095, 3460, 4095, + 4095, 3473, 4095, + 4095, 3489, 4095, + 4095, 3509, 4095, + 4095, 3536, 4087, + 4095, 3568, 4071, + 4095, 3609, 4047, + 4095, 3658, 4014, + 4095, 3717, 3965, + 4095, 3785, 3891, + 4030, 3862, 3767, + 0, 3184, 3454, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3452, + 0, 3186, 3452, + 0, 3187, 3451, + 0, 3188, 3450, + 0, 3189, 3449, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3439, + 0, 3205, 3434, + 0, 3212, 3427, + 0, 3221, 3418, + 0, 3233, 3405, + 0, 3248, 3388, + 0, 3268, 3363, + 0, 3293, 3328, + 0, 3324, 3276, + 0, 3363, 3196, + 0, 3410, 3061, + 0, 3467, 2779, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3452, + 0, 3186, 3452, + 0, 3187, 3451, + 0, 3188, 3451, + 0, 3189, 3449, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3439, + 0, 3205, 3434, + 0, 3212, 3427, + 0, 3221, 3418, + 0, 3233, 3405, + 0, 3248, 3388, + 0, 3268, 3363, + 0, 3293, 3328, + 0, 3324, 3276, + 0, 3363, 3196, + 0, 3410, 3061, + 0, 3467, 2779, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3453, + 0, 3186, 3452, + 0, 3187, 3451, + 0, 3188, 3451, + 0, 3189, 3449, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3439, + 0, 3205, 3434, + 0, 3212, 3428, + 0, 3221, 3418, + 0, 3233, 3406, + 0, 3248, 3388, + 0, 3268, 3363, + 0, 3293, 3328, + 0, 3324, 3277, + 0, 3363, 3197, + 0, 3411, 3062, + 0, 3467, 2780, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3453, + 0, 3186, 3452, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3440, + 0, 3205, 3434, + 0, 3212, 3428, + 0, 3221, 3418, + 0, 3233, 3406, + 0, 3248, 3388, + 0, 3268, 3364, + 0, 3293, 3328, + 0, 3324, 3277, + 0, 3363, 3197, + 0, 3411, 3062, + 0, 3467, 2780, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3186, 3453, + 0, 3186, 3453, + 0, 3186, 3452, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3440, + 0, 3205, 3435, + 0, 3212, 3428, + 0, 3221, 3419, + 0, 3233, 3406, + 0, 3248, 3388, + 0, 3268, 3364, + 0, 3293, 3329, + 0, 3324, 3277, + 0, 3363, 3197, + 0, 3411, 3062, + 0, 3467, 2781, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3186, 3453, + 0, 3186, 3453, + 0, 3186, 3453, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3444, + 0, 3200, 3440, + 0, 3205, 3435, + 0, 3212, 3428, + 0, 3221, 3419, + 0, 3233, 3406, + 0, 3248, 3389, + 0, 3268, 3364, + 0, 3293, 3329, + 0, 3324, 3277, + 0, 3363, 3198, + 0, 3411, 3063, + 0, 3467, 2782, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3186, 3454, + 0, 3186, 3453, + 0, 3187, 3453, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3449, + 0, 3193, 3447, + 0, 3196, 3444, + 0, 3200, 3440, + 0, 3205, 3435, + 0, 3212, 3428, + 0, 3221, 3419, + 0, 3233, 3406, + 0, 3248, 3389, + 0, 3268, 3364, + 0, 3293, 3329, + 0, 3324, 3278, + 0, 3363, 3198, + 0, 3411, 3064, + 0, 3467, 2783, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3454, + 0, 3186, 3454, + 0, 3186, 3454, + 0, 3187, 3453, + 0, 3187, 3453, + 0, 3188, 3452, + 0, 3190, 3451, + 0, 3191, 3449, + 0, 3193, 3447, + 0, 3196, 3444, + 0, 3200, 3441, + 0, 3205, 3436, + 0, 3212, 3429, + 0, 3221, 3420, + 0, 3233, 3407, + 0, 3248, 3389, + 0, 3268, 3365, + 0, 3293, 3330, + 0, 3324, 3278, + 0, 3363, 3199, + 0, 3411, 3065, + 0, 3467, 2785, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3186, 3455, + 0, 3186, 3455, + 0, 3186, 3454, + 0, 3187, 3454, + 0, 3187, 3453, + 0, 3188, 3452, + 0, 3190, 3451, + 0, 3191, 3450, + 0, 3194, 3448, + 0, 3197, 3445, + 0, 3200, 3441, + 0, 3206, 3436, + 0, 3212, 3429, + 0, 3221, 3420, + 0, 3233, 3407, + 0, 3248, 3390, + 0, 3268, 3365, + 0, 3293, 3331, + 0, 3325, 3279, + 0, 3363, 3200, + 0, 3411, 3066, + 0, 3467, 2787, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3186, 3456, + 0, 3186, 3456, + 0, 3186, 3455, + 0, 3186, 3455, + 0, 3187, 3455, + 0, 3188, 3454, + 0, 3189, 3453, + 0, 3190, 3452, + 0, 3192, 3450, + 0, 3194, 3448, + 0, 3197, 3446, + 0, 3201, 3442, + 0, 3206, 3437, + 0, 3213, 3430, + 0, 3222, 3421, + 0, 3233, 3408, + 0, 3249, 3391, + 0, 3268, 3366, + 0, 3293, 3331, + 0, 3325, 3280, + 0, 3364, 3201, + 0, 3411, 3067, + 0, 3467, 2790, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3457, + 0, 3185, 3457, + 0, 3185, 3457, + 0, 3185, 3457, + 0, 3186, 3457, + 0, 3186, 3457, + 0, 3186, 3457, + 0, 3186, 3456, + 0, 3187, 3456, + 0, 3187, 3456, + 0, 3188, 3455, + 0, 3189, 3454, + 0, 3190, 3453, + 0, 3192, 3451, + 0, 3194, 3449, + 0, 3197, 3447, + 0, 3201, 3443, + 0, 3206, 3438, + 0, 3213, 3431, + 0, 3222, 3422, + 0, 3234, 3409, + 0, 3249, 3392, + 0, 3268, 3368, + 0, 3293, 3333, + 0, 3325, 3282, + 0, 3364, 3203, + 0, 3411, 3070, + 0, 3467, 2794, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3186, 3459, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3187, 3458, + 0, 3187, 3457, + 0, 3188, 3457, + 0, 3188, 3456, + 0, 3189, 3455, + 0, 3190, 3454, + 0, 3192, 3453, + 0, 3194, 3451, + 0, 3197, 3448, + 0, 3201, 3444, + 0, 3206, 3439, + 0, 3213, 3432, + 0, 3222, 3423, + 0, 3234, 3411, + 0, 3249, 3393, + 0, 3269, 3369, + 0, 3294, 3334, + 0, 3325, 3283, + 0, 3364, 3205, + 0, 3411, 3073, + 0, 3468, 2800, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3187, 3460, + 0, 3187, 3460, + 0, 3187, 3459, + 0, 3187, 3459, + 0, 3188, 3458, + 0, 3189, 3458, + 0, 3190, 3457, + 0, 3191, 3456, + 0, 3193, 3454, + 0, 3195, 3452, + 0, 3198, 3450, + 0, 3202, 3446, + 0, 3207, 3441, + 0, 3214, 3434, + 0, 3223, 3425, + 0, 3234, 3413, + 0, 3250, 3395, + 0, 3269, 3371, + 0, 3294, 3337, + 0, 3325, 3286, + 0, 3364, 3208, + 0, 3411, 3077, + 0, 3468, 2807, + 0, 3534, 0, + 0, 3609, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3188, 3462, + 0, 3188, 3461, + 0, 3189, 3461, + 0, 3189, 3460, + 0, 3190, 3459, + 0, 3191, 3458, + 0, 3193, 3457, + 0, 3195, 3455, + 0, 3198, 3452, + 0, 3202, 3448, + 0, 3207, 3443, + 0, 3214, 3437, + 0, 3223, 3428, + 0, 3235, 3415, + 0, 3250, 3398, + 0, 3270, 3374, + 0, 3295, 3339, + 0, 3326, 3289, + 0, 3365, 3212, + 0, 3412, 3082, + 0, 3468, 2816, + 0, 3534, 0, + 0, 3609, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3187, 3465, + 0, 3187, 3465, + 0, 3187, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3189, 3464, + 0, 3189, 3464, + 0, 3190, 3463, + 0, 3191, 3462, + 0, 3192, 3461, + 0, 3194, 3460, + 0, 3196, 3458, + 0, 3199, 3455, + 0, 3203, 3451, + 0, 3208, 3446, + 0, 3215, 3440, + 0, 3224, 3431, + 0, 3235, 3418, + 0, 3251, 3401, + 0, 3270, 3377, + 0, 3295, 3343, + 0, 3326, 3293, + 0, 3365, 3217, + 0, 3412, 3089, + 0, 3469, 2829, + 0, 3534, 0, + 0, 3610, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3188, 3469, + 0, 3188, 3469, + 0, 3188, 3469, + 0, 3189, 3469, + 0, 3189, 3469, + 0, 3189, 3469, + 0, 3189, 3469, + 0, 3189, 3468, + 0, 3190, 3468, + 0, 3190, 3468, + 0, 3191, 3467, + 0, 3192, 3466, + 0, 3193, 3465, + 0, 3195, 3464, + 0, 3197, 3462, + 0, 3200, 3459, + 0, 3204, 3455, + 0, 3209, 3451, + 0, 3216, 3444, + 0, 3225, 3435, + 0, 3236, 3423, + 0, 3252, 3406, + 0, 3271, 3382, + 0, 3296, 3349, + 0, 3327, 3299, + 0, 3366, 3224, + 0, 3413, 3098, + 0, 3469, 2844, + 0, 3535, 106, + 0, 3610, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3190, 3475, + 0, 3190, 3475, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3191, 3474, + 0, 3191, 3473, + 0, 3192, 3473, + 0, 3192, 3472, + 0, 3193, 3471, + 0, 3195, 3470, + 0, 3196, 3469, + 0, 3198, 3467, + 0, 3201, 3464, + 0, 3205, 3461, + 0, 3210, 3456, + 0, 3217, 3449, + 0, 3226, 3441, + 0, 3238, 3429, + 0, 3253, 3412, + 0, 3272, 3389, + 0, 3297, 3355, + 0, 3328, 3307, + 0, 3367, 3233, + 0, 3414, 3109, + 0, 3470, 2865, + 0, 3535, 1466, + 0, 3611, 0, + 0, 3695, 0, + 0, 3788, 0, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3193, 3481, + 0, 3193, 3480, + 0, 3193, 3480, + 0, 3194, 3479, + 0, 3195, 3478, + 0, 3196, 3477, + 0, 3198, 3476, + 0, 3200, 3474, + 0, 3203, 3471, + 0, 3207, 3468, + 0, 3212, 3463, + 0, 3219, 3457, + 0, 3228, 3448, + 0, 3239, 3436, + 0, 3254, 3420, + 0, 3274, 3397, + 0, 3298, 3364, + 0, 3329, 3317, + 0, 3368, 3244, + 0, 3415, 3125, + 0, 3471, 2891, + 0, 3536, 1839, + 0, 3611, 0, + 0, 3695, 0, + 0, 3788, 0, + 0, 3194, 3491, + 0, 3194, 3491, + 0, 3194, 3490, + 0, 3194, 3490, + 0, 3194, 3490, + 0, 3194, 3490, + 0, 3195, 3490, + 0, 3195, 3490, + 0, 3195, 3489, + 0, 3196, 3489, + 0, 3197, 3488, + 0, 3197, 3488, + 0, 3199, 3487, + 0, 3200, 3485, + 0, 3202, 3483, + 0, 3205, 3481, + 0, 3209, 3477, + 0, 3214, 3473, + 0, 3221, 3466, + 0, 3230, 3458, + 0, 3241, 3446, + 0, 3256, 3430, + 0, 3276, 3408, + 0, 3300, 3376, + 0, 3331, 3330, + 0, 3370, 3259, + 0, 3416, 3144, + 0, 3472, 2923, + 0, 3537, 2093, + 0, 3612, 0, + 0, 3696, 0, + 0, 3789, 0, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3198, 3502, + 0, 3198, 3502, + 0, 3198, 3502, + 0, 3199, 3501, + 0, 3199, 3501, + 0, 3200, 3500, + 0, 3201, 3500, + 0, 3202, 3498, + 0, 3203, 3497, + 0, 3206, 3495, + 0, 3209, 3493, + 0, 3212, 3489, + 0, 3217, 3485, + 0, 3224, 3479, + 0, 3233, 3471, + 0, 3244, 3459, + 0, 3259, 3444, + 0, 3278, 3422, + 0, 3303, 3391, + 0, 3334, 3347, + 0, 3372, 3279, + 0, 3418, 3169, + 0, 3474, 2963, + 0, 3539, 2299, + 0, 3613, 0, + 0, 3697, 0, + 0, 3790, 0, + 0, 3201, 3518, + 0, 3201, 3518, + 0, 3202, 3518, + 0, 3202, 3518, + 0, 3202, 3518, + 0, 3202, 3517, + 0, 3202, 3517, + 0, 3202, 3517, + 0, 3203, 3517, + 0, 3203, 3516, + 0, 3204, 3516, + 0, 3205, 3515, + 0, 3206, 3514, + 0, 3208, 3513, + 0, 3210, 3511, + 0, 3213, 3508, + 0, 3216, 3505, + 0, 3221, 3501, + 0, 3228, 3495, + 0, 3237, 3487, + 0, 3248, 3476, + 0, 3263, 3461, + 0, 3282, 3440, + 0, 3306, 3411, + 0, 3337, 3368, + 0, 3375, 3304, + 0, 3421, 3201, + 0, 3476, 3012, + 0, 3541, 2479, + 0, 3615, 0, + 0, 3699, 0, + 0, 3791, 0, + 0, 3207, 3538, + 0, 3207, 3538, + 0, 3207, 3537, + 0, 3207, 3537, + 0, 3207, 3537, + 0, 3207, 3537, + 0, 3208, 3537, + 0, 3208, 3537, + 0, 3208, 3537, + 0, 3209, 3536, + 0, 3210, 3536, + 0, 3210, 3535, + 0, 3212, 3534, + 0, 3213, 3533, + 0, 3215, 3531, + 0, 3218, 3529, + 0, 3222, 3526, + 0, 3227, 3521, + 0, 3233, 3516, + 0, 3242, 3508, + 0, 3253, 3498, + 0, 3268, 3483, + 0, 3287, 3464, + 0, 3311, 3436, + 0, 3341, 3395, + 0, 3379, 3335, + 0, 3424, 3240, + 0, 3479, 3069, + 0, 3544, 2644, + 0, 3617, 0, + 0, 3701, 0, + 0, 3792, 0, + 1728, 3214, 3563, + 1725, 3214, 3563, + 1722, 3215, 3563, + 1717, 3215, 3563, + 1710, 3215, 3563, + 1701, 3215, 3562, + 1688, 3215, 3562, + 1671, 3215, 3562, + 1647, 3216, 3562, + 1612, 3216, 3561, + 1562, 3217, 3561, + 1483, 3218, 3560, + 1352, 3219, 3559, + 1082, 3220, 3558, + 0, 3223, 3557, + 0, 3225, 3554, + 0, 3229, 3551, + 0, 3234, 3548, + 0, 3240, 3542, + 0, 3249, 3535, + 0, 3260, 3525, + 0, 3274, 3512, + 0, 3293, 3493, + 0, 3317, 3467, + 0, 3346, 3429, + 0, 3384, 3374, + 0, 3429, 3287, + 0, 3483, 3137, + 0, 3547, 2799, + 0, 3620, 0, + 0, 3703, 0, + 0, 3794, 0, + 2722, 3224, 3594, + 2721, 3224, 3594, + 2721, 3224, 3594, + 2720, 3224, 3594, + 2720, 3224, 3594, + 2719, 3225, 3594, + 2717, 3225, 3594, + 2716, 3225, 3594, + 2713, 3225, 3593, + 2710, 3226, 3593, + 2706, 3227, 3593, + 2700, 3227, 3592, + 2692, 3229, 3591, + 2681, 3230, 3590, + 2666, 3232, 3589, + 2646, 3235, 3587, + 2617, 3238, 3584, + 2574, 3243, 3580, + 2511, 3250, 3575, + 2410, 3258, 3569, + 2224, 3269, 3559, + 1718, 3283, 3547, + 0, 3301, 3530, + 0, 3324, 3506, + 0, 3354, 3471, + 0, 3390, 3421, + 0, 3435, 3343, + 0, 3489, 3214, + 0, 3552, 2948, + 0, 3624, 0, + 0, 3706, 0, + 0, 3797, 0, + 3077, 3237, 3634, + 3077, 3237, 3634, + 3077, 3237, 3633, + 3077, 3237, 3633, + 3076, 3237, 3633, + 3076, 3237, 3633, + 3075, 3237, 3633, + 3075, 3238, 3633, + 3073, 3238, 3633, + 3072, 3239, 3632, + 3070, 3239, 3632, + 3068, 3240, 3631, + 3064, 3241, 3631, + 3059, 3243, 3630, + 3053, 3245, 3628, + 3044, 3247, 3626, + 3032, 3251, 3624, + 3016, 3255, 3621, + 2993, 3262, 3616, + 2960, 3270, 3610, + 2913, 3280, 3602, + 2840, 3294, 3590, + 2720, 3312, 3575, + 2485, 3335, 3553, + 1404, 3363, 3522, + 0, 3399, 3477, + 0, 3443, 3409, + 0, 3496, 3299, + 0, 3558, 3092, + 0, 3630, 2417, + 0, 3711, 0, + 0, 3801, 0, + 3325, 3253, 3681, + 3325, 3253, 3681, + 3325, 3253, 3681, + 3325, 3253, 3681, + 3325, 3254, 3681, + 3325, 3254, 3681, + 3324, 3254, 3681, + 3324, 3254, 3681, + 3323, 3254, 3680, + 3322, 3255, 3680, + 3321, 3255, 3680, + 3320, 3256, 3679, + 3318, 3257, 3678, + 3315, 3259, 3678, + 3311, 3261, 3676, + 3306, 3263, 3675, + 3300, 3267, 3672, + 3291, 3271, 3669, + 3278, 3277, 3665, + 3261, 3285, 3660, + 3237, 3295, 3652, + 3203, 3308, 3642, + 3153, 3326, 3628, + 3076, 3348, 3609, + 2947, 3376, 3582, + 2685, 3411, 3543, + 0, 3454, 3485, + 0, 3505, 3394, + 0, 3566, 3233, + 0, 3637, 2852, + 0, 3717, 0, + 0, 3805, 0, + 3528, 3274, 3738, + 3528, 3274, 3738, + 3528, 3274, 3738, + 3528, 3274, 3738, + 3528, 3275, 3738, + 3528, 3275, 3738, + 3527, 3275, 3737, + 3527, 3275, 3737, + 3527, 3275, 3737, + 3526, 3276, 3737, + 3525, 3276, 3737, + 3525, 3277, 3736, + 3523, 3278, 3735, + 3522, 3280, 3735, + 3519, 3281, 3734, + 3516, 3284, 3732, + 3512, 3287, 3730, + 3506, 3291, 3728, + 3499, 3297, 3724, + 3488, 3305, 3719, + 3474, 3314, 3713, + 3454, 3327, 3704, + 3426, 3344, 3692, + 3385, 3365, 3675, + 3324, 3392, 3652, + 3228, 3426, 3618, + 3055, 3467, 3570, + 2618, 3517, 3495, + 0, 3577, 3371, + 0, 3646, 3125, + 0, 3724, 1639, + 0, 3812, 0, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3706, 3301, 3804, + 3706, 3302, 3804, + 3706, 3302, 3804, + 3706, 3302, 3803, + 3705, 3303, 3803, + 3705, 3303, 3803, + 3704, 3304, 3803, + 3703, 3305, 3802, + 3702, 3306, 3801, + 3701, 3308, 3800, + 3699, 3310, 3799, + 3696, 3313, 3797, + 3692, 3317, 3795, + 3687, 3323, 3792, + 3680, 3330, 3788, + 3671, 3339, 3782, + 3658, 3351, 3775, + 3640, 3367, 3764, + 3615, 3387, 3750, + 3580, 3413, 3730, + 3527, 3445, 3703, + 3446, 3485, 3663, + 3308, 3533, 3603, + 3017, 3591, 3508, + 0, 3658, 3340, + 0, 3734, 2924, + 0, 3820, 0, + 3871, 3334, 3880, + 3871, 3334, 3880, + 3871, 3335, 3880, + 3871, 3335, 3880, + 3871, 3335, 3880, + 3871, 3335, 3880, + 3870, 3335, 3880, + 3870, 3335, 3879, + 3870, 3335, 3879, + 3870, 3336, 3879, + 3869, 3336, 3879, + 3869, 3337, 3879, + 3868, 3338, 3878, + 3868, 3339, 3878, + 3867, 3341, 3877, + 3865, 3343, 3876, + 3863, 3346, 3874, + 3861, 3349, 3872, + 3857, 3354, 3870, + 3852, 3361, 3866, + 3846, 3370, 3862, + 3837, 3381, 3855, + 3825, 3396, 3846, + 3809, 3415, 3835, + 3786, 3439, 3818, + 3753, 3470, 3796, + 3706, 3507, 3763, + 3633, 3554, 3716, + 3513, 3609, 3644, + 3279, 3673, 3525, + 2216, 3748, 3294, + 0, 3831, 2303, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3964, + 4025, 3376, 3964, + 4025, 3377, 3964, + 4025, 3377, 3964, + 4024, 3377, 3964, + 4024, 3378, 3964, + 4024, 3379, 3963, + 4023, 3380, 3963, + 4022, 3381, 3962, + 4021, 3383, 3961, + 4020, 3386, 3960, + 4018, 3389, 3958, + 4016, 3394, 3956, + 4012, 3400, 3953, + 4008, 3408, 3950, + 4002, 3418, 3944, + 3993, 3432, 3937, + 3982, 3450, 3928, + 3967, 3472, 3914, + 3945, 3501, 3896, + 3914, 3536, 3870, + 3870, 3579, 3833, + 3803, 3632, 3779, + 3693, 3693, 3693, + 3489, 3765, 3547, + 2837, 3845, 3224, + 4095, 3425, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3427, 4057, + 4095, 3427, 4057, + 4095, 3428, 4057, + 4095, 3428, 4057, + 4095, 3429, 4056, + 4095, 3431, 4056, + 4095, 3432, 4055, + 4095, 3435, 4054, + 4095, 3438, 4053, + 4095, 3442, 4051, + 4095, 3447, 4049, + 4095, 3455, 4046, + 4095, 3464, 4041, + 4095, 3476, 4036, + 4095, 3492, 4028, + 4095, 3513, 4017, + 4095, 3539, 4003, + 4095, 3572, 3982, + 4067, 3612, 3954, + 4024, 3661, 3913, + 3961, 3719, 3851, + 3858, 3787, 3752, + 3671, 3864, 3575, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3486, 4095, + 4095, 3486, 4095, + 4095, 3486, 4095, + 4095, 3487, 4095, + 4095, 3488, 4095, + 4095, 3489, 4095, + 4095, 3491, 4095, + 4095, 3493, 4095, + 4095, 3495, 4095, + 4095, 3499, 4095, + 4095, 3504, 4095, + 4095, 3510, 4095, + 4095, 3519, 4095, + 4095, 3530, 4095, + 4095, 3544, 4095, + 4095, 3562, 4095, + 4095, 3586, 4095, + 4095, 3615, 4095, + 4095, 3652, 4077, + 4095, 3697, 4046, + 4095, 3751, 4001, + 4095, 3814, 3932, + 4014, 3887, 3821, + 0, 3316, 3586, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3584, + 0, 3318, 3584, + 0, 3319, 3583, + 0, 3320, 3582, + 0, 3321, 3581, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3559, + 0, 3353, 3550, + 0, 3365, 3537, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3408, + 0, 3495, 3328, + 0, 3543, 3193, + 0, 3599, 2911, + 0, 3665, 0, + 0, 3740, 0, + 0, 3825, 0, + 0, 3316, 3586, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3583, + 0, 3320, 3583, + 0, 3321, 3581, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3559, + 0, 3353, 3550, + 0, 3365, 3537, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3408, + 0, 3495, 3328, + 0, 3543, 3193, + 0, 3599, 2911, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3316, 3586, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3583, + 0, 3320, 3583, + 0, 3321, 3581, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3560, + 0, 3353, 3550, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3408, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2911, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3560, + 0, 3353, 3550, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3409, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2912, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3572, + 0, 3337, 3567, + 0, 3344, 3560, + 0, 3353, 3551, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3496, + 0, 3425, 3460, + 0, 3456, 3409, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2912, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3319, 3584, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3576, + 0, 3332, 3572, + 0, 3337, 3567, + 0, 3344, 3560, + 0, 3353, 3551, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3496, + 0, 3425, 3461, + 0, 3456, 3409, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2913, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3318, 3586, + 0, 3318, 3585, + 0, 3319, 3585, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3581, + 0, 3325, 3579, + 0, 3328, 3576, + 0, 3332, 3572, + 0, 3337, 3567, + 0, 3344, 3560, + 0, 3353, 3551, + 0, 3365, 3538, + 0, 3380, 3521, + 0, 3400, 3496, + 0, 3425, 3461, + 0, 3456, 3409, + 0, 3495, 3330, + 0, 3543, 3195, + 0, 3599, 2914, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3318, 3586, + 0, 3318, 3585, + 0, 3319, 3585, + 0, 3319, 3584, + 0, 3320, 3584, + 0, 3322, 3582, + 0, 3323, 3581, + 0, 3325, 3579, + 0, 3328, 3576, + 0, 3332, 3572, + 0, 3338, 3567, + 0, 3344, 3561, + 0, 3353, 3551, + 0, 3365, 3539, + 0, 3380, 3521, + 0, 3400, 3496, + 0, 3425, 3461, + 0, 3456, 3410, + 0, 3495, 3330, + 0, 3543, 3196, + 0, 3599, 2915, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3318, 3587, + 0, 3318, 3586, + 0, 3318, 3586, + 0, 3319, 3585, + 0, 3319, 3585, + 0, 3320, 3584, + 0, 3322, 3583, + 0, 3323, 3581, + 0, 3326, 3579, + 0, 3328, 3576, + 0, 3332, 3573, + 0, 3338, 3568, + 0, 3344, 3561, + 0, 3353, 3552, + 0, 3365, 3539, + 0, 3380, 3521, + 0, 3400, 3497, + 0, 3425, 3462, + 0, 3457, 3410, + 0, 3495, 3331, + 0, 3543, 3197, + 0, 3599, 2917, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3318, 3587, + 0, 3318, 3587, + 0, 3318, 3586, + 0, 3319, 3586, + 0, 3320, 3585, + 0, 3321, 3584, + 0, 3322, 3583, + 0, 3323, 3582, + 0, 3326, 3580, + 0, 3329, 3577, + 0, 3333, 3573, + 0, 3338, 3568, + 0, 3345, 3561, + 0, 3354, 3552, + 0, 3365, 3540, + 0, 3381, 3522, + 0, 3400, 3498, + 0, 3425, 3463, + 0, 3457, 3411, + 0, 3496, 3332, + 0, 3543, 3198, + 0, 3599, 2919, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3318, 3588, + 0, 3318, 3588, + 0, 3318, 3587, + 0, 3319, 3587, + 0, 3319, 3587, + 0, 3320, 3586, + 0, 3321, 3585, + 0, 3322, 3584, + 0, 3324, 3583, + 0, 3326, 3580, + 0, 3329, 3578, + 0, 3333, 3574, + 0, 3338, 3569, + 0, 3345, 3562, + 0, 3354, 3553, + 0, 3365, 3540, + 0, 3381, 3523, + 0, 3400, 3498, + 0, 3425, 3464, + 0, 3457, 3412, + 0, 3496, 3333, + 0, 3543, 3200, + 0, 3599, 2922, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3589, + 0, 3317, 3589, + 0, 3317, 3589, + 0, 3317, 3589, + 0, 3318, 3589, + 0, 3318, 3589, + 0, 3318, 3589, + 0, 3318, 3589, + 0, 3318, 3588, + 0, 3319, 3588, + 0, 3319, 3588, + 0, 3320, 3587, + 0, 3321, 3586, + 0, 3322, 3585, + 0, 3324, 3583, + 0, 3326, 3581, + 0, 3329, 3579, + 0, 3333, 3575, + 0, 3338, 3570, + 0, 3345, 3563, + 0, 3354, 3554, + 0, 3366, 3541, + 0, 3381, 3524, + 0, 3401, 3500, + 0, 3426, 3465, + 0, 3457, 3414, + 0, 3496, 3335, + 0, 3543, 3202, + 0, 3600, 2927, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3318, 3591, + 0, 3318, 3591, + 0, 3318, 3591, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3319, 3590, + 0, 3319, 3589, + 0, 3320, 3589, + 0, 3320, 3588, + 0, 3321, 3587, + 0, 3323, 3586, + 0, 3324, 3585, + 0, 3326, 3583, + 0, 3329, 3580, + 0, 3333, 3576, + 0, 3338, 3571, + 0, 3345, 3565, + 0, 3354, 3555, + 0, 3366, 3543, + 0, 3381, 3525, + 0, 3401, 3501, + 0, 3426, 3466, + 0, 3457, 3415, + 0, 3496, 3337, + 0, 3543, 3205, + 0, 3600, 2932, + 0, 3666, 0, + 0, 3741, 0, + 0, 3826, 0, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3319, 3592, + 0, 3319, 3592, + 0, 3319, 3591, + 0, 3320, 3591, + 0, 3320, 3591, + 0, 3321, 3590, + 0, 3322, 3589, + 0, 3323, 3588, + 0, 3325, 3586, + 0, 3327, 3584, + 0, 3330, 3582, + 0, 3334, 3578, + 0, 3339, 3573, + 0, 3346, 3566, + 0, 3355, 3557, + 0, 3366, 3545, + 0, 3382, 3527, + 0, 3401, 3503, + 0, 3426, 3469, + 0, 3458, 3418, + 0, 3496, 3340, + 0, 3544, 3209, + 0, 3600, 2939, + 0, 3666, 0, + 0, 3741, 0, + 0, 3826, 0, + 0, 3319, 3595, + 0, 3319, 3595, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3320, 3594, + 0, 3320, 3593, + 0, 3321, 3593, + 0, 3321, 3592, + 0, 3322, 3591, + 0, 3324, 3590, + 0, 3325, 3589, + 0, 3327, 3587, + 0, 3330, 3584, + 0, 3334, 3580, + 0, 3339, 3575, + 0, 3346, 3569, + 0, 3355, 3560, + 0, 3367, 3547, + 0, 3382, 3530, + 0, 3402, 3506, + 0, 3427, 3472, + 0, 3458, 3421, + 0, 3497, 3344, + 0, 3544, 3214, + 0, 3600, 2948, + 0, 3666, 0, + 0, 3741, 0, + 0, 3826, 0, + 0, 3319, 3598, + 0, 3319, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3321, 3596, + 0, 3321, 3596, + 0, 3322, 3595, + 0, 3323, 3594, + 0, 3324, 3593, + 0, 3326, 3592, + 0, 3328, 3590, + 0, 3331, 3587, + 0, 3335, 3583, + 0, 3340, 3579, + 0, 3347, 3572, + 0, 3356, 3563, + 0, 3368, 3550, + 0, 3383, 3533, + 0, 3402, 3510, + 0, 3427, 3475, + 0, 3459, 3426, + 0, 3497, 3349, + 0, 3544, 3221, + 0, 3601, 2961, + 0, 3666, 0, + 0, 3742, 0, + 0, 3826, 0, + 0, 3320, 3601, + 0, 3320, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3322, 3600, + 0, 3322, 3600, + 0, 3323, 3599, + 0, 3324, 3598, + 0, 3325, 3597, + 0, 3327, 3596, + 0, 3329, 3594, + 0, 3332, 3591, + 0, 3336, 3587, + 0, 3341, 3583, + 0, 3348, 3576, + 0, 3357, 3567, + 0, 3368, 3555, + 0, 3384, 3538, + 0, 3403, 3514, + 0, 3428, 3481, + 0, 3459, 3431, + 0, 3498, 3356, + 0, 3545, 3230, + 0, 3601, 2976, + 0, 3667, 238, + 0, 3742, 0, + 0, 3826, 0, + 0, 3322, 3607, + 0, 3322, 3607, + 0, 3322, 3607, + 0, 3322, 3607, + 0, 3322, 3606, + 0, 3322, 3606, + 0, 3322, 3606, + 0, 3323, 3606, + 0, 3323, 3606, + 0, 3323, 3605, + 0, 3324, 3605, + 0, 3324, 3604, + 0, 3325, 3604, + 0, 3327, 3603, + 0, 3328, 3601, + 0, 3330, 3599, + 0, 3333, 3596, + 0, 3337, 3593, + 0, 3342, 3588, + 0, 3349, 3582, + 0, 3358, 3573, + 0, 3370, 3561, + 0, 3385, 3544, + 0, 3404, 3521, + 0, 3429, 3487, + 0, 3460, 3439, + 0, 3499, 3365, + 0, 3546, 3241, + 0, 3602, 2997, + 0, 3668, 1599, + 0, 3743, 0, + 0, 3827, 0, + 0, 3324, 3614, + 0, 3324, 3614, + 0, 3324, 3614, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3325, 3613, + 0, 3325, 3612, + 0, 3326, 3612, + 0, 3326, 3611, + 0, 3327, 3611, + 0, 3328, 3609, + 0, 3330, 3608, + 0, 3332, 3606, + 0, 3335, 3603, + 0, 3339, 3600, + 0, 3344, 3595, + 0, 3351, 3589, + 0, 3360, 3580, + 0, 3371, 3568, + 0, 3386, 3552, + 0, 3406, 3529, + 0, 3431, 3496, + 0, 3462, 3449, + 0, 3500, 3376, + 0, 3547, 3257, + 0, 3603, 3023, + 0, 3668, 1971, + 0, 3743, 0, + 0, 3827, 0, + 0, 3326, 3623, + 0, 3326, 3623, + 0, 3326, 3623, + 0, 3326, 3623, + 0, 3326, 3622, + 0, 3326, 3622, + 0, 3327, 3622, + 0, 3327, 3622, + 0, 3327, 3622, + 0, 3327, 3621, + 0, 3328, 3621, + 0, 3329, 3620, + 0, 3330, 3620, + 0, 3331, 3619, + 0, 3332, 3617, + 0, 3335, 3615, + 0, 3337, 3613, + 0, 3341, 3609, + 0, 3346, 3605, + 0, 3353, 3598, + 0, 3362, 3590, + 0, 3374, 3578, + 0, 3388, 3562, + 0, 3408, 3540, + 0, 3432, 3508, + 0, 3463, 3462, + 0, 3502, 3392, + 0, 3548, 3276, + 0, 3604, 3055, + 0, 3669, 2225, + 0, 3744, 0, + 0, 3828, 0, + 0, 3329, 3635, + 0, 3329, 3635, + 0, 3329, 3634, + 0, 3329, 3634, + 0, 3329, 3634, + 0, 3330, 3634, + 0, 3330, 3634, + 0, 3330, 3634, + 0, 3330, 3634, + 0, 3331, 3633, + 0, 3331, 3633, + 0, 3332, 3632, + 0, 3333, 3632, + 0, 3334, 3631, + 0, 3336, 3629, + 0, 3338, 3627, + 0, 3341, 3625, + 0, 3344, 3622, + 0, 3349, 3617, + 0, 3356, 3611, + 0, 3365, 3603, + 0, 3376, 3591, + 0, 3391, 3576, + 0, 3410, 3554, + 0, 3435, 3523, + 0, 3466, 3479, + 0, 3504, 3411, + 0, 3550, 3301, + 0, 3606, 3095, + 0, 3671, 2431, + 0, 3746, 0, + 0, 3829, 0, + 0, 3333, 3650, + 0, 3333, 3650, + 0, 3334, 3650, + 0, 3334, 3650, + 0, 3334, 3650, + 0, 3334, 3650, + 0, 3334, 3649, + 0, 3334, 3649, + 0, 3334, 3649, + 0, 3335, 3649, + 0, 3335, 3648, + 0, 3336, 3648, + 0, 3337, 3647, + 0, 3338, 3646, + 0, 3340, 3645, + 0, 3342, 3643, + 0, 3345, 3641, + 0, 3349, 3637, + 0, 3354, 3633, + 0, 3360, 3627, + 0, 3369, 3619, + 0, 3380, 3608, + 0, 3395, 3593, + 0, 3414, 3572, + 0, 3438, 3543, + 0, 3469, 3500, + 0, 3507, 3436, + 0, 3553, 3333, + 0, 3608, 3144, + 0, 3673, 2611, + 0, 3747, 0, + 0, 3831, 0, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3669, + 0, 3340, 3669, + 0, 3340, 3669, + 0, 3340, 3669, + 0, 3340, 3669, + 0, 3341, 3668, + 0, 3342, 3668, + 0, 3343, 3667, + 0, 3344, 3666, + 0, 3345, 3665, + 0, 3347, 3663, + 0, 3350, 3661, + 0, 3354, 3658, + 0, 3359, 3654, + 0, 3365, 3648, + 0, 3374, 3640, + 0, 3385, 3630, + 0, 3400, 3616, + 0, 3419, 3596, + 0, 3443, 3568, + 0, 3473, 3527, + 0, 3511, 3467, + 0, 3556, 3372, + 0, 3611, 3202, + 0, 3676, 2776, + 0, 3750, 0, + 0, 3833, 0, + 1862, 3346, 3695, + 1860, 3347, 3695, + 1858, 3347, 3695, + 1854, 3347, 3695, + 1849, 3347, 3695, + 1842, 3347, 3695, + 1833, 3347, 3695, + 1821, 3347, 3694, + 1803, 3347, 3694, + 1779, 3348, 3694, + 1744, 3348, 3693, + 1694, 3349, 3693, + 1616, 3350, 3692, + 1484, 3351, 3691, + 1214, 3353, 3690, + 0, 3355, 3689, + 0, 3357, 3686, + 0, 3361, 3684, + 0, 3366, 3680, + 0, 3372, 3674, + 0, 3381, 3667, + 0, 3392, 3657, + 0, 3406, 3644, + 0, 3425, 3625, + 0, 3449, 3599, + 0, 3479, 3562, + 0, 3516, 3506, + 0, 3561, 3419, + 0, 3615, 3269, + 0, 3679, 2931, + 0, 3753, 0, + 0, 3835, 0, + 2854, 3356, 3727, + 2854, 3356, 3727, + 2853, 3356, 3726, + 2853, 3356, 3726, + 2853, 3356, 3726, + 2852, 3357, 3726, + 2851, 3357, 3726, + 2849, 3357, 3726, + 2848, 3357, 3726, + 2845, 3358, 3726, + 2842, 3358, 3725, + 2838, 3359, 3725, + 2832, 3360, 3724, + 2824, 3361, 3723, + 2813, 3362, 3722, + 2798, 3364, 3721, + 2778, 3367, 3719, + 2749, 3371, 3716, + 2706, 3375, 3712, + 2643, 3382, 3707, + 2542, 3390, 3701, + 2357, 3401, 3692, + 1850, 3415, 3679, + 0, 3433, 3662, + 0, 3456, 3638, + 0, 3486, 3604, + 0, 3522, 3553, + 0, 3567, 3476, + 0, 3621, 3346, + 0, 3684, 3080, + 0, 3757, 0, + 0, 3838, 0, + 3210, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3765, + 3208, 3369, 3765, + 3207, 3370, 3765, + 3207, 3370, 3765, + 3206, 3370, 3765, + 3204, 3371, 3764, + 3202, 3371, 3764, + 3200, 3372, 3763, + 3196, 3373, 3763, + 3191, 3375, 3762, + 3185, 3377, 3760, + 3176, 3379, 3758, + 3164, 3383, 3756, + 3148, 3387, 3753, + 3125, 3394, 3748, + 3092, 3402, 3742, + 3045, 3412, 3734, + 2972, 3426, 3722, + 2852, 3444, 3707, + 2617, 3467, 3685, + 1537, 3495, 3654, + 0, 3531, 3609, + 0, 3575, 3542, + 0, 3628, 3431, + 0, 3690, 3224, + 0, 3762, 2549, + 0, 3843, 0, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3386, 3813, + 3457, 3386, 3813, + 3456, 3386, 3813, + 3456, 3386, 3813, + 3455, 3387, 3812, + 3454, 3387, 3812, + 3453, 3388, 3812, + 3452, 3388, 3811, + 3450, 3389, 3811, + 3447, 3391, 3810, + 3443, 3393, 3808, + 3439, 3395, 3807, + 3432, 3399, 3805, + 3423, 3403, 3802, + 3410, 3409, 3797, + 3393, 3417, 3792, + 3369, 3427, 3785, + 3335, 3441, 3774, + 3285, 3458, 3761, + 3208, 3480, 3741, + 3079, 3508, 3714, + 2817, 3543, 3675, + 0, 3586, 3617, + 0, 3637, 3526, + 0, 3698, 3365, + 0, 3769, 2984, + 0, 3849, 0, + 3660, 3406, 3870, + 3660, 3406, 3870, + 3660, 3406, 3870, + 3660, 3406, 3870, + 3660, 3407, 3870, + 3660, 3407, 3870, + 3660, 3407, 3870, + 3660, 3407, 3870, + 3659, 3407, 3869, + 3659, 3408, 3869, + 3658, 3408, 3869, + 3658, 3409, 3869, + 3657, 3409, 3868, + 3655, 3410, 3868, + 3654, 3412, 3867, + 3651, 3414, 3866, + 3648, 3416, 3864, + 3644, 3419, 3862, + 3638, 3424, 3860, + 3631, 3429, 3856, + 3620, 3437, 3851, + 3606, 3446, 3845, + 3586, 3459, 3836, + 3558, 3476, 3824, + 3517, 3497, 3807, + 3456, 3524, 3784, + 3360, 3558, 3750, + 3187, 3599, 3702, + 2750, 3650, 3627, + 0, 3709, 3503, + 0, 3778, 3257, + 0, 3856, 1771, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3838, 3433, 3936, + 3838, 3434, 3936, + 3838, 3434, 3936, + 3838, 3434, 3936, + 3838, 3435, 3935, + 3837, 3435, 3935, + 3836, 3436, 3935, + 3836, 3437, 3934, + 3834, 3438, 3933, + 3833, 3440, 3932, + 3831, 3442, 3931, + 3828, 3445, 3930, + 3824, 3449, 3927, + 3819, 3455, 3924, + 3812, 3462, 3920, + 3803, 3471, 3914, + 3790, 3483, 3907, + 3772, 3499, 3897, + 3747, 3519, 3882, + 3712, 3545, 3863, + 3659, 3577, 3835, + 3578, 3617, 3795, + 3440, 3665, 3735, + 3149, 3723, 3640, + 0, 3790, 3472, + 0, 3867, 3056, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4002, 3467, 4012, + 4002, 3467, 4012, + 4002, 3468, 4011, + 4002, 3468, 4011, + 4002, 3468, 4011, + 4001, 3469, 4011, + 4001, 3470, 4010, + 4000, 3471, 4010, + 3999, 3473, 4009, + 3997, 3475, 4008, + 3995, 3478, 4006, + 3993, 3482, 4004, + 3989, 3487, 4002, + 3984, 3493, 3998, + 3978, 3502, 3994, + 3969, 3513, 3987, + 3957, 3528, 3979, + 3941, 3547, 3967, + 3918, 3571, 3950, + 3886, 3602, 3928, + 3838, 3640, 3895, + 3765, 3686, 3848, + 3646, 3741, 3776, + 3411, 3806, 3657, + 2348, 3880, 3426, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3509, 4095, + 4095, 3509, 4095, + 4095, 3509, 4095, + 4095, 3510, 4095, + 4095, 3511, 4095, + 4095, 3512, 4095, + 4095, 3513, 4094, + 4095, 3515, 4093, + 4095, 3518, 4092, + 4095, 3522, 4091, + 4095, 3526, 4088, + 4095, 3532, 4086, + 4095, 3540, 4082, + 4095, 3551, 4076, + 4095, 3564, 4069, + 4095, 3582, 4060, + 4095, 3604, 4046, + 4077, 3633, 4028, + 4046, 3668, 4002, + 4002, 3712, 3965, + 3935, 3764, 3911, + 3826, 3826, 3826, + 3621, 3897, 3679, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3559, 4095, + 4095, 3559, 4095, + 4095, 3560, 4095, + 4095, 3560, 4095, + 4095, 3561, 4095, + 4095, 3563, 4095, + 4095, 3564, 4095, + 4095, 3567, 4095, + 4095, 3570, 4095, + 4095, 3574, 4095, + 4095, 3580, 4095, + 4095, 3587, 4095, + 4095, 3596, 4095, + 4095, 3608, 4095, + 4095, 3624, 4095, + 4095, 3645, 4095, + 4095, 3671, 4095, + 4095, 3704, 4095, + 4095, 3744, 4086, + 4095, 3793, 4045, + 4093, 3851, 3983, + 3990, 3919, 3884, + 0, 3448, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3450, 3716, + 0, 3451, 3715, + 0, 3452, 3715, + 0, 3453, 3713, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3691, + 0, 3485, 3682, + 0, 3497, 3669, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3540, + 0, 3627, 3460, + 0, 3675, 3325, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3448, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3715, + 0, 3452, 3715, + 0, 3453, 3713, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3540, + 0, 3627, 3460, + 0, 3675, 3325, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3540, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3704, + 0, 3469, 3699, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3628, + 0, 3557, 3592, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3044, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3704, + 0, 3469, 3699, + 0, 3476, 3692, + 0, 3485, 3683, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3628, + 0, 3557, 3593, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3044, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3717, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3454, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3708, + 0, 3464, 3704, + 0, 3469, 3699, + 0, 3476, 3692, + 0, 3485, 3683, + 0, 3497, 3670, + 0, 3512, 3653, + 0, 3532, 3628, + 0, 3557, 3593, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3327, + 0, 3731, 3045, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3450, 3718, + 0, 3450, 3717, + 0, 3451, 3717, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3454, 3714, + 0, 3455, 3713, + 0, 3457, 3711, + 0, 3460, 3708, + 0, 3464, 3704, + 0, 3470, 3699, + 0, 3476, 3692, + 0, 3485, 3683, + 0, 3497, 3670, + 0, 3512, 3653, + 0, 3532, 3628, + 0, 3557, 3593, + 0, 3589, 3541, + 0, 3627, 3462, + 0, 3675, 3327, + 0, 3731, 3046, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3718, + 0, 3450, 3718, + 0, 3450, 3718, + 0, 3450, 3718, + 0, 3451, 3717, + 0, 3451, 3716, + 0, 3452, 3716, + 0, 3454, 3714, + 0, 3455, 3713, + 0, 3458, 3711, + 0, 3460, 3708, + 0, 3464, 3704, + 0, 3470, 3699, + 0, 3476, 3693, + 0, 3485, 3683, + 0, 3497, 3671, + 0, 3512, 3653, + 0, 3532, 3629, + 0, 3557, 3593, + 0, 3589, 3542, + 0, 3627, 3462, + 0, 3675, 3328, + 0, 3731, 3047, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3450, 3719, + 0, 3450, 3718, + 0, 3450, 3718, + 0, 3451, 3718, + 0, 3452, 3717, + 0, 3452, 3716, + 0, 3454, 3715, + 0, 3455, 3713, + 0, 3458, 3711, + 0, 3461, 3709, + 0, 3465, 3705, + 0, 3470, 3700, + 0, 3477, 3693, + 0, 3486, 3684, + 0, 3497, 3671, + 0, 3513, 3654, + 0, 3532, 3629, + 0, 3557, 3594, + 0, 3589, 3542, + 0, 3628, 3463, + 0, 3675, 3329, + 0, 3731, 3049, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3719, + 0, 3450, 3719, + 0, 3450, 3719, + 0, 3450, 3719, + 0, 3450, 3719, + 0, 3451, 3718, + 0, 3452, 3717, + 0, 3453, 3717, + 0, 3454, 3715, + 0, 3456, 3714, + 0, 3458, 3712, + 0, 3461, 3709, + 0, 3465, 3705, + 0, 3470, 3700, + 0, 3477, 3694, + 0, 3486, 3684, + 0, 3497, 3672, + 0, 3513, 3654, + 0, 3532, 3630, + 0, 3557, 3595, + 0, 3589, 3543, + 0, 3628, 3464, + 0, 3675, 3330, + 0, 3731, 3051, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3721, + 0, 3449, 3721, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3450, 3720, + 0, 3450, 3720, + 0, 3450, 3720, + 0, 3450, 3720, + 0, 3451, 3719, + 0, 3451, 3719, + 0, 3452, 3718, + 0, 3453, 3717, + 0, 3454, 3716, + 0, 3456, 3715, + 0, 3458, 3713, + 0, 3461, 3710, + 0, 3465, 3706, + 0, 3470, 3701, + 0, 3477, 3694, + 0, 3486, 3685, + 0, 3498, 3672, + 0, 3513, 3655, + 0, 3532, 3631, + 0, 3557, 3596, + 0, 3589, 3544, + 0, 3628, 3465, + 0, 3675, 3332, + 0, 3731, 3055, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3721, + 0, 3449, 3721, + 0, 3449, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3451, 3720, + 0, 3451, 3720, + 0, 3452, 3719, + 0, 3453, 3718, + 0, 3454, 3717, + 0, 3456, 3716, + 0, 3458, 3714, + 0, 3461, 3711, + 0, 3465, 3707, + 0, 3470, 3702, + 0, 3477, 3695, + 0, 3486, 3686, + 0, 3498, 3674, + 0, 3513, 3656, + 0, 3533, 3632, + 0, 3558, 3597, + 0, 3589, 3546, + 0, 3628, 3467, + 0, 3675, 3334, + 0, 3732, 3059, + 0, 3798, 0, + 0, 3873, 0, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3722, + 0, 3450, 3722, + 0, 3451, 3722, + 0, 3451, 3722, + 0, 3451, 3721, + 0, 3452, 3721, + 0, 3452, 3720, + 0, 3453, 3719, + 0, 3455, 3718, + 0, 3456, 3717, + 0, 3458, 3715, + 0, 3461, 3712, + 0, 3465, 3708, + 0, 3471, 3703, + 0, 3477, 3697, + 0, 3486, 3687, + 0, 3498, 3675, + 0, 3513, 3658, + 0, 3533, 3633, + 0, 3558, 3599, + 0, 3589, 3548, + 0, 3628, 3469, + 0, 3675, 3337, + 0, 3732, 3064, + 0, 3798, 0, + 0, 3873, 0, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3451, 3724, + 0, 3451, 3724, + 0, 3451, 3724, + 0, 3451, 3723, + 0, 3452, 3723, + 0, 3452, 3723, + 0, 3453, 3722, + 0, 3454, 3721, + 0, 3455, 3720, + 0, 3457, 3719, + 0, 3459, 3717, + 0, 3462, 3714, + 0, 3466, 3710, + 0, 3471, 3705, + 0, 3478, 3698, + 0, 3487, 3689, + 0, 3498, 3677, + 0, 3514, 3659, + 0, 3533, 3635, + 0, 3558, 3601, + 0, 3590, 3550, + 0, 3628, 3472, + 0, 3676, 3341, + 0, 3732, 3071, + 0, 3798, 0, + 0, 3873, 0, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3726, + 0, 3451, 3726, + 0, 3451, 3726, + 0, 3452, 3726, + 0, 3452, 3726, + 0, 3452, 3725, + 0, 3453, 3725, + 0, 3453, 3724, + 0, 3454, 3723, + 0, 3456, 3722, + 0, 3457, 3721, + 0, 3459, 3719, + 0, 3462, 3716, + 0, 3466, 3712, + 0, 3471, 3708, + 0, 3478, 3701, + 0, 3487, 3692, + 0, 3499, 3679, + 0, 3514, 3662, + 0, 3534, 3638, + 0, 3559, 3604, + 0, 3590, 3553, + 0, 3629, 3476, + 0, 3676, 3346, + 0, 3732, 3081, + 0, 3798, 0, + 0, 3873, 0, + 0, 3451, 3730, + 0, 3452, 3730, + 0, 3452, 3730, + 0, 3452, 3730, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3453, 3729, + 0, 3453, 3728, + 0, 3453, 3728, + 0, 3454, 3727, + 0, 3455, 3726, + 0, 3456, 3725, + 0, 3458, 3724, + 0, 3460, 3722, + 0, 3463, 3719, + 0, 3467, 3716, + 0, 3472, 3711, + 0, 3479, 3704, + 0, 3488, 3695, + 0, 3500, 3683, + 0, 3515, 3666, + 0, 3534, 3642, + 0, 3559, 3608, + 0, 3591, 3558, + 0, 3629, 3481, + 0, 3676, 3353, + 0, 3733, 3093, + 0, 3798, 0, + 0, 3874, 0, + 0, 3453, 3734, + 0, 3453, 3734, + 0, 3453, 3734, + 0, 3453, 3734, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3454, 3733, + 0, 3454, 3732, + 0, 3454, 3732, + 0, 3455, 3731, + 0, 3456, 3730, + 0, 3457, 3729, + 0, 3459, 3728, + 0, 3461, 3726, + 0, 3464, 3723, + 0, 3468, 3720, + 0, 3473, 3715, + 0, 3480, 3708, + 0, 3489, 3699, + 0, 3501, 3687, + 0, 3516, 3670, + 0, 3535, 3646, + 0, 3560, 3613, + 0, 3591, 3563, + 0, 3630, 3488, + 0, 3677, 3362, + 0, 3733, 3109, + 0, 3799, 370, + 0, 3874, 0, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3738, + 0, 3454, 3738, + 0, 3455, 3738, + 0, 3455, 3738, + 0, 3455, 3738, + 0, 3456, 3737, + 0, 3457, 3737, + 0, 3457, 3736, + 0, 3459, 3735, + 0, 3460, 3733, + 0, 3463, 3731, + 0, 3465, 3729, + 0, 3469, 3725, + 0, 3474, 3720, + 0, 3481, 3714, + 0, 3490, 3705, + 0, 3502, 3693, + 0, 3517, 3676, + 0, 3536, 3653, + 0, 3561, 3620, + 0, 3592, 3571, + 0, 3631, 3497, + 0, 3678, 3374, + 0, 3734, 3129, + 0, 3800, 1731, + 0, 3875, 0, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3745, + 0, 3456, 3745, + 0, 3456, 3745, + 0, 3456, 3745, + 0, 3457, 3745, + 0, 3457, 3744, + 0, 3458, 3744, + 0, 3458, 3743, + 0, 3459, 3743, + 0, 3460, 3742, + 0, 3462, 3740, + 0, 3464, 3738, + 0, 3467, 3736, + 0, 3471, 3732, + 0, 3476, 3727, + 0, 3483, 3721, + 0, 3492, 3712, + 0, 3503, 3700, + 0, 3518, 3684, + 0, 3538, 3661, + 0, 3563, 3629, + 0, 3594, 3581, + 0, 3632, 3508, + 0, 3679, 3389, + 0, 3735, 3155, + 0, 3800, 2103, + 0, 3875, 0, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3754, + 0, 3459, 3754, + 0, 3459, 3754, + 0, 3459, 3754, + 0, 3460, 3754, + 0, 3460, 3753, + 0, 3461, 3753, + 0, 3462, 3752, + 0, 3463, 3751, + 0, 3465, 3749, + 0, 3467, 3747, + 0, 3470, 3745, + 0, 3473, 3741, + 0, 3479, 3737, + 0, 3485, 3731, + 0, 3494, 3722, + 0, 3506, 3710, + 0, 3521, 3694, + 0, 3540, 3672, + 0, 3565, 3640, + 0, 3595, 3594, + 0, 3634, 3524, + 0, 3681, 3409, + 0, 3736, 3187, + 0, 3802, 2357, + 0, 3876, 0, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3463, 3765, + 0, 3463, 3765, + 0, 3464, 3764, + 0, 3465, 3764, + 0, 3466, 3763, + 0, 3468, 3761, + 0, 3470, 3759, + 0, 3473, 3757, + 0, 3477, 3754, + 0, 3482, 3749, + 0, 3488, 3743, + 0, 3497, 3735, + 0, 3508, 3723, + 0, 3523, 3708, + 0, 3543, 3686, + 0, 3567, 3655, + 0, 3598, 3611, + 0, 3636, 3543, + 0, 3682, 3434, + 0, 3738, 3227, + 0, 3803, 2563, + 0, 3878, 0, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3781, + 0, 3467, 3781, + 0, 3467, 3781, + 0, 3467, 3780, + 0, 3468, 3780, + 0, 3469, 3779, + 0, 3470, 3778, + 0, 3472, 3777, + 0, 3474, 3775, + 0, 3477, 3773, + 0, 3481, 3769, + 0, 3486, 3765, + 0, 3492, 3759, + 0, 3501, 3751, + 0, 3512, 3740, + 0, 3527, 3725, + 0, 3546, 3704, + 0, 3570, 3675, + 0, 3601, 3632, + 0, 3639, 3568, + 0, 3685, 3465, + 0, 3740, 3276, + 0, 3805, 2743, + 0, 3879, 0, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3472, 3802, + 0, 3472, 3801, + 0, 3472, 3801, + 0, 3472, 3801, + 0, 3473, 3801, + 0, 3473, 3800, + 0, 3474, 3800, + 0, 3475, 3799, + 0, 3476, 3798, + 0, 3477, 3797, + 0, 3480, 3795, + 0, 3482, 3793, + 0, 3486, 3790, + 0, 3491, 3786, + 0, 3498, 3780, + 0, 3506, 3772, + 0, 3517, 3762, + 0, 3532, 3748, + 0, 3551, 3728, + 0, 3575, 3700, + 0, 3605, 3660, + 0, 3643, 3599, + 0, 3689, 3504, + 0, 3743, 3334, + 0, 3808, 2908, + 0, 3882, 0, + 1996, 3479, 3827, + 1994, 3479, 3827, + 1992, 3479, 3827, + 1990, 3479, 3827, + 1986, 3479, 3827, + 1981, 3479, 3827, + 1974, 3479, 3827, + 1965, 3479, 3827, + 1953, 3479, 3826, + 1935, 3480, 3826, + 1911, 3480, 3826, + 1877, 3480, 3826, + 1826, 3481, 3825, + 1748, 3482, 3824, + 1616, 3483, 3824, + 1346, 3485, 3822, + 0, 3487, 3821, + 0, 3490, 3819, + 0, 3493, 3816, + 0, 3498, 3812, + 0, 3505, 3806, + 0, 3513, 3799, + 0, 3524, 3789, + 0, 3538, 3776, + 0, 3557, 3757, + 0, 3581, 3731, + 0, 3611, 3694, + 0, 3648, 3638, + 0, 3693, 3551, + 0, 3748, 3401, + 0, 3811, 3063, + 0, 3885, 0, + 2986, 3488, 3859, + 2986, 3488, 3859, + 2986, 3488, 3859, + 2986, 3488, 3859, + 2985, 3488, 3859, + 2985, 3489, 3858, + 2984, 3489, 3858, + 2983, 3489, 3858, + 2982, 3489, 3858, + 2980, 3489, 3858, + 2977, 3490, 3858, + 2974, 3490, 3857, + 2970, 3491, 3857, + 2964, 3492, 3856, + 2956, 3493, 3855, + 2945, 3494, 3854, + 2931, 3496, 3853, + 2910, 3499, 3851, + 2881, 3503, 3848, + 2839, 3507, 3844, + 2775, 3514, 3839, + 2674, 3522, 3833, + 2489, 3533, 3824, + 1982, 3547, 3811, + 0, 3565, 3794, + 0, 3589, 3770, + 0, 3618, 3736, + 0, 3655, 3685, + 0, 3699, 3608, + 0, 3753, 3478, + 0, 3816, 3212, + 0, 3889, 0, + 3342, 3501, 3898, + 3342, 3501, 3898, + 3342, 3501, 3898, + 3341, 3501, 3898, + 3341, 3501, 3898, + 3341, 3501, 3898, + 3341, 3501, 3898, + 3340, 3501, 3897, + 3340, 3502, 3897, + 3339, 3502, 3897, + 3338, 3502, 3897, + 3336, 3503, 3897, + 3334, 3503, 3896, + 3332, 3504, 3896, + 3328, 3505, 3895, + 3323, 3507, 3894, + 3317, 3509, 3892, + 3308, 3511, 3891, + 3296, 3515, 3888, + 3280, 3520, 3885, + 3257, 3526, 3880, + 3224, 3534, 3874, + 3177, 3544, 3866, + 3104, 3558, 3854, + 2984, 3576, 3839, + 2749, 3599, 3817, + 1669, 3628, 3786, + 0, 3663, 3741, + 0, 3707, 3674, + 0, 3760, 3564, + 0, 3822, 3356, + 0, 3894, 2681, + 3590, 3517, 3945, + 3590, 3517, 3945, + 3590, 3517, 3945, + 3589, 3517, 3945, + 3589, 3518, 3945, + 3589, 3518, 3945, + 3589, 3518, 3945, + 3589, 3518, 3945, + 3588, 3518, 3945, + 3588, 3518, 3945, + 3587, 3519, 3945, + 3586, 3519, 3944, + 3585, 3520, 3944, + 3584, 3520, 3943, + 3582, 3522, 3943, + 3579, 3523, 3942, + 3576, 3525, 3941, + 3571, 3527, 3939, + 3564, 3531, 3937, + 3555, 3535, 3934, + 3543, 3541, 3930, + 3525, 3549, 3924, + 3501, 3559, 3917, + 3467, 3573, 3907, + 3417, 3590, 3893, + 3340, 3612, 3873, + 3211, 3640, 3846, + 2949, 3675, 3807, + 0, 3718, 3749, + 0, 3769, 3658, + 0, 3830, 3497, + 0, 3901, 3116, + 3792, 3538, 4002, + 3792, 3538, 4002, + 3792, 3538, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3791, 3539, 4002, + 3791, 3540, 4001, + 3790, 3540, 4001, + 3790, 3541, 4001, + 3789, 3541, 4000, + 3787, 3542, 4000, + 3786, 3544, 3999, + 3783, 3546, 3998, + 3780, 3548, 3996, + 3776, 3551, 3994, + 3770, 3556, 3992, + 3763, 3561, 3988, + 3752, 3569, 3983, + 3738, 3579, 3977, + 3718, 3591, 3968, + 3690, 3608, 3956, + 3649, 3629, 3939, + 3588, 3656, 3916, + 3492, 3690, 3882, + 3319, 3731, 3834, + 2882, 3782, 3759, + 0, 3841, 3636, + 0, 3910, 3389, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3566, 4068, + 3970, 3566, 4068, + 3970, 3566, 4068, + 3970, 3566, 4068, + 3970, 3567, 4067, + 3969, 3567, 4067, + 3968, 3568, 4067, + 3968, 3569, 4066, + 3966, 3570, 4066, + 3965, 3572, 4065, + 3963, 3574, 4063, + 3960, 3577, 4062, + 3956, 3581, 4059, + 3951, 3587, 4056, + 3944, 3594, 4052, + 3935, 3603, 4047, + 3922, 3615, 4039, + 3904, 3631, 4029, + 3879, 3651, 4014, + 3844, 3677, 3995, + 3791, 3709, 3967, + 3710, 3749, 3927, + 3572, 3797, 3867, + 3281, 3855, 3772, + 0, 3922, 3604, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3600, 4095, + 4095, 3600, 4095, + 4095, 3601, 4095, + 4095, 3601, 4095, + 4095, 3602, 4095, + 4095, 3603, 4095, + 4095, 3605, 4095, + 4095, 3607, 4095, + 4095, 3610, 4095, + 4095, 3614, 4095, + 4095, 3619, 4095, + 4095, 3625, 4095, + 4095, 3634, 4095, + 4095, 3645, 4095, + 4090, 3660, 4095, + 4073, 3679, 4095, + 4050, 3703, 4083, + 4018, 3734, 4060, + 3970, 3772, 4027, + 3897, 3818, 3980, + 3778, 3873, 3908, + 3543, 3938, 3789, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3641, 4095, + 4095, 3641, 4095, + 4095, 3641, 4095, + 4095, 3642, 4095, + 4095, 3642, 4095, + 4095, 3643, 4095, + 4095, 3644, 4095, + 4095, 3646, 4095, + 4095, 3648, 4095, + 4095, 3650, 4095, + 4095, 3654, 4095, + 4095, 3658, 4095, + 4095, 3664, 4095, + 4095, 3672, 4095, + 4095, 3683, 4095, + 4095, 3696, 4095, + 4095, 3714, 4095, + 4095, 3736, 4095, + 4095, 3765, 4095, + 4095, 3800, 4095, + 4095, 3844, 4095, + 4067, 3896, 4043, + 3958, 3958, 3958 +] + } +} diff --git a/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/Test_3DL_32_LUT.azasset b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/Test_3DL_32_LUT.azasset new file mode 100644 index 0000000000..b643955084 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/Test_3DL_32_LUT.azasset @@ -0,0 +1,4922 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [0, 64, 128, 192, 256, 320, 384, 448, 512, 575, 639, 703, 767, 831, 895, 959, 1023], + "Values": [128, 193, 337, +96, 193, 353, +145, 241, 418, +177, 273, 514, +225, 273, 562, +337, 337, 707, +385, 385, 803, +450, 450, 883, +562, 514, 996, +594, 578, 1108, +691, 658, 1220, +739, 723, 1317, +803, 787, 1429, +915, 867, 1574, +980, 915, 1638, +1028, 996, 1766, +1092, 1044, 1847, +257, 353, 401, +289, 353, 434, +305, 369, 514, +273, 385, 594, +321, 385, 642, +353, 466, 771, +434, 482, 835, +498, 562, 964, +562, 594, 1060, +642, 658, 1140, +691, 723, 1253, +755, 787, 1349, +851, 835, 1477, +899, 899, 1574, +947, 964, 1670, +1044, 1044, 1783, +1124, 1076, 1863, +337, 530, 482, +385, 546, 530, +401, 562, 594, +401, 562, 691, +434, 594, 771, +450, 642, 867, +482, 642, 931, +562, 674, 1028, +610, 739, 1108, +658, 771, 1204, +739, 819, 1317, +851, 899, 1445, +867, 915, 1510, +947, 980, 1590, +1012, 1044, 1718, +1060, 1076, 1815, +1140, 1140, 1927, +466, 771, 642, +482, 771, 691, +482, 771, 755, +514, 787, 803, +514, 803, 915, +578, 803, 964, +626, 851, 1044, +658, 867, 1124, +707, 899, 1220, +771, 931, 1301, +787, 947, 1381, +883, 1012, 1477, +931, 1044, 1590, +1012, 1108, 1686, +1044, 1140, 1766, +1140, 1204, 1879, +1188, 1253, 1991, +691, 1012, 755, +674, 1012, 803, +674, 980, 883, +658, 980, 947, +658, 1012, 980, +642, 1012, 1092, +707, 1012, 1156, +755, 1060, 1269, +771, 1060, 1317, +835, 1108, 1397, +931, 1156, 1510, +947, 1156, 1574, +980, 1188, 1654, +1076, 1237, 1783, +1140, 1285, 1863, +1188, 1301, 1911, +1237, 1349, 2023, +851, 1220, 899, +803, 1204, 931, +835, 1204, 996, +819, 1204, 1060, +835, 1204, 1124, +867, 1204, 1156, +883, 1220, 1253, +899, 1237, 1349, +931, 1253, 1429, +996, 1269, 1510, +996, 1317, 1590, +1060, 1349, 1670, +1124, 1349, 1750, +1156, 1397, 1847, +1253, 1429, 1943, +1285, 1461, 2039, +1333, 1477, 2104, +980, 1413, 1012, +980, 1429, 1060, +980, 1413, 1108, +980, 1413, 1172, +996, 1397, 1237, +1012, 1429, 1333, +1044, 1429, 1365, +1076, 1445, 1445, +1044, 1445, 1526, +1124, 1477, 1622, +1140, 1493, 1702, +1156, 1493, 1750, +1188, 1558, 1863, +1285, 1558, 1943, +1349, 1590, 2023, +1381, 1622, 2104, +1461, 1654, 2216, +1156, 1606, 1124, +1140, 1622, 1172, +1140, 1606, 1253, +1172, 1622, 1317, +1188, 1622, 1381, +1172, 1638, 1445, +1188, 1638, 1510, +1220, 1638, 1542, +1237, 1638, 1606, +1301, 1654, 1718, +1333, 1670, 1799, +1365, 1702, 1879, +1397, 1734, 1975, +1429, 1734, 2039, +1477, 1766, 2104, +1526, 1815, 2216, +1558, 1831, 2296, +1317, 1815, 1285, +1285, 1831, 1317, +1301, 1831, 1365, +1317, 1815, 1397, +1333, 1799, 1445, +1349, 1831, 1542, +1381, 1831, 1622, +1381, 1815, 1654, +1413, 1863, 1734, +1461, 1863, 1799, +1477, 1863, 1895, +1510, 1895, 1991, +1542, 1895, 2023, +1638, 1943, 2136, +1670, 1927, 2184, +1670, 1943, 2264, +1734, 1991, 2377, +1542, 2007, 1381, +1510, 2023, 1381, +1526, 2023, 1445, +1542, 2023, 1526, +1542, 2007, 1590, +1574, 2023, 1654, +1558, 2023, 1686, +1606, 2039, 1766, +1606, 2023, 1815, +1654, 2056, 1863, +1686, 2072, 1943, +1718, 2088, 2072, +1734, 2104, 2168, +1766, 2120, 2248, +1847, 2136, 2296, +1927, 2152, 2361, +1975, 2184, 2457, +1734, 2232, 1493, +1766, 2248, 1510, +1734, 2232, 1526, +1766, 2248, 1590, +1766, 2232, 1686, +1815, 2232, 1766, +1799, 2232, 1815, +1847, 2264, 1927, +1831, 2264, 1927, +1879, 2280, 2007, +1895, 2280, 2072, +1911, 2280, 2136, +1959, 2312, 2232, +1975, 2329, 2345, +2023, 2361, 2425, +2072, 2329, 2441, +2104, 2361, 2537, +1975, 2457, 1654, +1943, 2457, 1638, +1959, 2457, 1670, +1975, 2441, 1734, +1991, 2441, 1799, +2007, 2441, 1895, +2023, 2441, 1943, +2023, 2441, 1991, +2023, 2441, 2072, +2072, 2473, 2168, +2104, 2473, 2200, +2120, 2473, 2264, +2184, 2489, 2296, +2216, 2505, 2377, +2200, 2521, 2537, +2248, 2553, 2634, +2264, 2537, 2682, +2152, 2650, 1734, +2168, 2634, 1783, +2120, 2650, 1815, +2136, 2650, 1879, +2168, 2650, 1959, +2200, 2650, 2023, +2216, 2650, 2088, +2200, 2666, 2120, +2248, 2682, 2200, +2232, 2682, 2264, +2248, 2682, 2329, +2280, 2682, 2377, +2312, 2698, 2457, +2345, 2714, 2537, +2361, 2714, 2602, +2393, 2730, 2714, +2425, 2762, 2810, +2312, 2858, 1895, +2329, 2858, 1895, +2329, 2875, 1959, +2296, 2858, 1991, +2329, 2875, 2056, +2345, 2858, 2120, +2377, 2875, 2184, +2377, 2875, 2296, +2393, 2891, 2329, +2409, 2875, 2361, +2473, 2875, 2441, +2441, 2875, 2489, +2489, 2891, 2553, +2521, 2907, 2618, +2537, 2907, 2698, +2585, 2923, 2778, +2618, 2955, 2907, +2553, 3067, 2023, +2537, 3067, 2056, +2489, 3067, 2088, +2521, 3067, 2120, +2537, 3051, 2184, +2537, 3051, 2280, +2585, 3067, 2312, +2602, 3051, 2377, +2602, 3083, 2425, +2602, 3067, 2505, +2618, 3083, 2553, +2634, 3083, 2618, +2666, 3083, 2666, +2698, 3083, 2714, +2730, 3115, 2794, +2746, 3115, 2907, +2778, 3131, 2987, +2714, 3276, 2184, +2714, 3276, 2216, +2682, 3292, 2232, +2698, 3292, 2280, +2698, 3292, 2296, +2746, 3276, 2393, +2730, 3292, 2457, +2762, 3292, 2521, +2762, 3276, 2585, +2778, 3260, 2634, +2746, 3260, 2698, +2810, 3276, 2746, +2842, 3292, 2842, +2826, 3292, 2858, +2858, 3292, 2907, +2875, 3308, 3003, +2923, 3324, 3067, +2891, 3501, 2345, +2891, 3485, 2377, +2875, 3485, 2361, +2842, 3501, 2377, +2858, 3485, 2425, +2907, 3501, 2521, +2907, 3485, 2602, +2939, 3485, 2650, +2939, 3469, 2698, +2955, 3501, 2762, +2955, 3485, 2810, +3035, 3485, 2891, +3019, 3501, 2971, +3067, 3517, 3051, +3067, 3517, 3115, +3115, 3533, 3164, +3099, 3549, 3244, +273, 225, 353, +273, 241, 385, +225, 273, 450, +257, 257, 514, +305, 321, 626, +369, 353, 707, +434, 434, 819, +498, 482, 915, +562, 562, 1028, +594, 594, 1124, +723, 658, 1220, +755, 723, 1333, +819, 819, 1445, +899, 883, 1590, +980, 915, 1638, +1060, 1012, 1750, +1108, 1060, 1863, +337, 353, 401, +337, 369, 450, +321, 401, 546, +337, 401, 594, +369, 434, 707, +418, 466, 771, +466, 514, 867, +546, 578, 996, +578, 626, 1076, +691, 674, 1156, +723, 739, 1269, +755, 803, 1365, +867, 851, 1493, +931, 915, 1558, +996, 980, 1670, +1060, 1044, 1783, +1124, 1076, 1863, +434, 546, 482, +418, 562, 546, +466, 594, 626, +466, 594, 707, +466, 642, 819, +482, 642, 867, +514, 674, 964, +578, 707, 1028, +626, 755, 1140, +707, 787, 1220, +755, 835, 1333, +835, 883, 1429, +915, 931, 1510, +947, 996, 1606, +1028, 1060, 1734, +1076, 1076, 1799, +1140, 1140, 1927, +562, 771, 594, +530, 787, 707, +546, 803, 771, +578, 803, 803, +578, 803, 867, +594, 819, 980, +642, 867, 1076, +658, 883, 1140, +739, 915, 1237, +771, 931, 1301, +787, 980, 1413, +883, 1012, 1493, +947, 1060, 1574, +996, 1108, 1670, +1060, 1140, 1783, +1140, 1204, 1879, +1220, 1237, 1991, +723, 996, 755, +691, 996, 819, +707, 996, 883, +674, 1012, 964, +707, 1012, 996, +723, 1028, 1092, +723, 1044, 1172, +787, 1060, 1253, +819, 1092, 1317, +851, 1124, 1413, +931, 1156, 1510, +964, 1172, 1590, +1012, 1172, 1654, +1076, 1237, 1783, +1140, 1285, 1863, +1220, 1333, 1943, +1285, 1349, 2039, +851, 1220, 867, +835, 1220, 931, +835, 1220, 996, +835, 1220, 1076, +851, 1204, 1140, +867, 1204, 1156, +883, 1220, 1253, +915, 1253, 1381, +980, 1269, 1445, +996, 1285, 1510, +1012, 1317, 1606, +1108, 1349, 1686, +1124, 1365, 1750, +1156, 1381, 1847, +1237, 1413, 1927, +1285, 1445, 2039, +1349, 1493, 2104, +1028, 1413, 996, +996, 1413, 1044, +1012, 1413, 1140, +1028, 1413, 1188, +1044, 1413, 1253, +1012, 1413, 1333, +1060, 1429, 1333, +1076, 1445, 1445, +1060, 1477, 1542, +1108, 1477, 1606, +1140, 1493, 1702, +1172, 1510, 1783, +1220, 1542, 1863, +1285, 1558, 1959, +1349, 1606, 2023, +1413, 1622, 2120, +1477, 1670, 2232, +1188, 1606, 1156, +1140, 1622, 1172, +1156, 1606, 1220, +1156, 1606, 1317, +1172, 1606, 1381, +1188, 1622, 1461, +1220, 1622, 1510, +1237, 1654, 1558, +1253, 1654, 1622, +1285, 1686, 1734, +1333, 1670, 1799, +1381, 1718, 1895, +1397, 1718, 1959, +1429, 1734, 2039, +1477, 1766, 2104, +1526, 1815, 2200, +1558, 1831, 2296, +1333, 1815, 1253, +1349, 1815, 1301, +1317, 1831, 1349, +1333, 1815, 1397, +1365, 1815, 1493, +1365, 1831, 1558, +1365, 1815, 1590, +1397, 1847, 1686, +1429, 1847, 1718, +1461, 1863, 1799, +1477, 1879, 1911, +1493, 1895, 2007, +1574, 1927, 2039, +1670, 1927, 2136, +1686, 1927, 2200, +1670, 1943, 2264, +1718, 1991, 2377, +1558, 2023, 1365, +1542, 2023, 1381, +1542, 2023, 1445, +1558, 2023, 1510, +1574, 2023, 1606, +1574, 2023, 1654, +1622, 2023, 1702, +1606, 2039, 1766, +1622, 2056, 1831, +1654, 2056, 1863, +1686, 2056, 1943, +1718, 2088, 2056, +1718, 2088, 2152, +1766, 2136, 2248, +1879, 2120, 2264, +1927, 2152, 2361, +1975, 2184, 2473, +1799, 2232, 1477, +1783, 2232, 1510, +1766, 2232, 1558, +1783, 2232, 1622, +1799, 2216, 1670, +1815, 2232, 1766, +1815, 2248, 1815, +1847, 2264, 1895, +1879, 2280, 1975, +1879, 2296, 2023, +1911, 2296, 2088, +1911, 2280, 2136, +2007, 2312, 2248, +1975, 2329, 2345, +2056, 2345, 2393, +2072, 2345, 2457, +2120, 2361, 2553, +2007, 2457, 1654, +1991, 2473, 1654, +1959, 2457, 1670, +1975, 2441, 1734, +1991, 2441, 1799, +2007, 2441, 1863, +2039, 2457, 1959, +2072, 2473, 2039, +2039, 2457, 2088, +2072, 2473, 2168, +2120, 2489, 2216, +2120, 2457, 2264, +2168, 2505, 2361, +2200, 2505, 2441, +2216, 2537, 2553, +2232, 2537, 2618, +2248, 2537, 2682, +2168, 2666, 1750, +2168, 2650, 1799, +2120, 2650, 1815, +2168, 2666, 1879, +2168, 2650, 1959, +2184, 2650, 2023, +2216, 2650, 2056, +2216, 2666, 2136, +2216, 2650, 2184, +2248, 2666, 2248, +2248, 2682, 2345, +2280, 2682, 2377, +2312, 2698, 2457, +2329, 2698, 2521, +2377, 2730, 2618, +2393, 2746, 2714, +2425, 2762, 2794, +2345, 2842, 1895, +2329, 2858, 1895, +2296, 2858, 1943, +2312, 2875, 1959, +2329, 2875, 2056, +2345, 2858, 2120, +2377, 2875, 2200, +2393, 2875, 2264, +2425, 2875, 2329, +2409, 2875, 2361, +2473, 2875, 2441, +2489, 2875, 2505, +2505, 2891, 2553, +2505, 2875, 2602, +2553, 2907, 2698, +2585, 2923, 2778, +2602, 2955, 2891, +2537, 3067, 2023, +2569, 3067, 2056, +2505, 3067, 2056, +2521, 3067, 2120, +2537, 3067, 2184, +2569, 3083, 2264, +2585, 3067, 2329, +2585, 3051, 2377, +2602, 3083, 2425, +2602, 3067, 2521, +2634, 3083, 2602, +2618, 3067, 2618, +2666, 3083, 2666, +2698, 3099, 2714, +2730, 3115, 2794, +2778, 3131, 2891, +2778, 3131, 2987, +2714, 3276, 2184, +2746, 3308, 2216, +2698, 3308, 2232, +2714, 3308, 2312, +2714, 3308, 2296, +2730, 3292, 2361, +2730, 3292, 2457, +2778, 3276, 2553, +2778, 3276, 2585, +2778, 3260, 2634, +2762, 3276, 2698, +2794, 3260, 2730, +2826, 3292, 2826, +2810, 3276, 2858, +2842, 3292, 2923, +2875, 3308, 3003, +2939, 3340, 3083, +2891, 3485, 2345, +2875, 3485, 2329, +2875, 3485, 2377, +2842, 3501, 2377, +2891, 3517, 2457, +2907, 3501, 2521, +2907, 3485, 2569, +2907, 3485, 2666, +2939, 3485, 2714, +2971, 3485, 2778, +3019, 3501, 2826, +3035, 3485, 2891, +3035, 3517, 2971, +3051, 3517, 3051, +3083, 3533, 3131, +3099, 3517, 3164, +3148, 3533, 3212, +385, 257, 369, +353, 289, 401, +369, 305, 482, +401, 337, 594, +401, 337, 642, +434, 401, 771, +482, 466, 835, +562, 530, 947, +578, 578, 1060, +674, 626, 1124, +723, 707, 1253, +803, 755, 1349, +883, 835, 1477, +915, 883, 1558, +1044, 947, 1670, +1076, 1012, 1766, +1108, 1060, 1863, +498, 369, 385, +450, 401, 498, +434, 434, 578, +401, 466, 626, +450, 498, 723, +514, 514, 803, +562, 594, 931, +578, 610, 996, +642, 642, 1076, +691, 707, 1188, +755, 771, 1285, +835, 835, 1413, +867, 867, 1477, +964, 915, 1574, +996, 996, 1670, +1108, 1060, 1815, +1140, 1108, 1895, +562, 594, 514, +562, 610, 578, +530, 610, 674, +514, 642, 739, +514, 626, 803, +562, 674, 883, +610, 707, 980, +658, 755, 1076, +674, 771, 1156, +755, 819, 1237, +819, 883, 1365, +851, 915, 1445, +931, 964, 1542, +980, 1012, 1622, +1076, 1076, 1766, +1076, 1092, 1799, +1172, 1172, 1959, +658, 787, 610, +642, 803, 658, +610, 803, 755, +626, 819, 819, +642, 835, 915, +674, 851, 980, +707, 883, 1092, +723, 899, 1172, +771, 947, 1269, +771, 964, 1349, +851, 996, 1445, +915, 1044, 1493, +996, 1092, 1606, +1012, 1108, 1686, +1092, 1172, 1783, +1140, 1220, 1895, +1253, 1269, 1959, +771, 1012, 755, +771, 1012, 803, +723, 1012, 899, +739, 1028, 964, +755, 1028, 1012, +771, 1044, 1108, +787, 1060, 1204, +819, 1092, 1285, +851, 1092, 1333, +915, 1140, 1429, +931, 1156, 1510, +996, 1172, 1590, +1044, 1220, 1702, +1108, 1253, 1783, +1172, 1301, 1847, +1253, 1317, 1959, +1285, 1365, 2023, +883, 1204, 835, +915, 1220, 931, +867, 1220, 1012, +883, 1220, 1060, +899, 1220, 1156, +931, 1220, 1188, +947, 1237, 1285, +947, 1253, 1365, +980, 1269, 1445, +1012, 1285, 1526, +1060, 1333, 1622, +1092, 1333, 1670, +1140, 1381, 1766, +1220, 1397, 1863, +1269, 1445, 1959, +1317, 1477, 2039, +1381, 1477, 2120, +1060, 1413, 996, +1044, 1413, 1028, +1028, 1429, 1124, +1044, 1429, 1172, +1060, 1429, 1269, +1076, 1445, 1333, +1108, 1445, 1365, +1076, 1445, 1445, +1092, 1461, 1542, +1124, 1493, 1622, +1220, 1526, 1734, +1204, 1542, 1799, +1237, 1558, 1879, +1317, 1574, 1943, +1365, 1606, 2039, +1413, 1622, 2120, +1477, 1654, 2200, +1188, 1606, 1108, +1204, 1606, 1188, +1172, 1622, 1253, +1188, 1622, 1301, +1237, 1622, 1397, +1220, 1638, 1429, +1253, 1654, 1526, +1285, 1654, 1574, +1285, 1654, 1622, +1317, 1670, 1734, +1349, 1702, 1815, +1381, 1718, 1895, +1429, 1718, 1959, +1445, 1750, 2023, +1493, 1783, 2120, +1574, 1815, 2216, +1622, 1847, 2312, +1365, 1815, 1253, +1365, 1815, 1285, +1333, 1815, 1365, +1365, 1815, 1397, +1397, 1831, 1477, +1397, 1815, 1558, +1413, 1831, 1622, +1413, 1863, 1702, +1461, 1863, 1750, +1477, 1879, 1815, +1493, 1879, 1911, +1542, 1879, 1975, +1606, 1911, 2039, +1670, 1927, 2136, +1686, 1927, 2200, +1686, 1975, 2280, +1766, 2007, 2361, +1558, 2023, 1365, +1574, 2007, 1381, +1542, 2039, 1461, +1558, 2023, 1510, +1590, 2039, 1590, +1606, 2023, 1654, +1638, 2056, 1718, +1638, 2039, 1766, +1670, 2056, 1847, +1702, 2056, 1879, +1702, 2088, 1991, +1766, 2088, 2072, +1783, 2104, 2152, +1847, 2136, 2216, +1879, 2120, 2264, +1911, 2136, 2345, +1975, 2184, 2473, +1799, 2248, 1477, +1783, 2232, 1477, +1799, 2264, 1558, +1799, 2248, 1638, +1799, 2216, 1670, +1831, 2232, 1750, +1831, 2216, 1799, +1863, 2264, 1895, +1895, 2280, 1943, +1911, 2280, 2023, +1959, 2296, 2072, +1975, 2296, 2120, +2007, 2329, 2248, +2039, 2329, 2329, +2056, 2345, 2393, +2088, 2361, 2473, +2120, 2377, 2553, +2007, 2457, 1654, +2023, 2457, 1622, +1975, 2457, 1638, +2007, 2457, 1718, +2007, 2441, 1799, +2039, 2425, 1879, +2039, 2457, 1927, +2072, 2457, 2039, +2039, 2457, 2088, +2072, 2473, 2136, +2104, 2473, 2200, +2168, 2489, 2232, +2152, 2489, 2345, +2200, 2521, 2441, +2216, 2521, 2537, +2248, 2553, 2634, +2264, 2553, 2698, +2168, 2666, 1750, +2152, 2666, 1783, +2152, 2666, 1815, +2168, 2650, 1863, +2200, 2682, 1943, +2216, 2666, 2007, +2216, 2650, 2056, +2264, 2682, 2152, +2248, 2682, 2216, +2264, 2682, 2264, +2296, 2682, 2345, +2280, 2682, 2377, +2312, 2698, 2457, +2329, 2698, 2521, +2377, 2730, 2618, +2393, 2746, 2730, +2425, 2762, 2794, +2345, 2875, 1911, +2345, 2875, 1911, +2345, 2891, 1943, +2345, 2875, 1991, +2345, 2875, 2039, +2345, 2875, 2120, +2409, 2875, 2232, +2409, 2891, 2280, +2425, 2875, 2329, +2457, 2891, 2377, +2489, 2891, 2441, +2505, 2891, 2521, +2521, 2875, 2537, +2569, 2907, 2634, +2553, 2907, 2698, +2618, 2907, 2778, +2618, 2955, 2907, +2553, 3067, 2039, +2569, 3067, 2056, +2537, 3067, 2072, +2521, 3067, 2120, +2553, 3083, 2200, +2553, 3067, 2248, +2585, 3067, 2312, +2618, 3083, 2409, +2634, 3067, 2457, +2634, 3099, 2505, +2634, 3083, 2585, +2666, 3083, 2634, +2666, 3099, 2682, +2730, 3115, 2746, +2746, 3131, 2810, +2778, 3131, 2891, +2778, 3131, 2971, +2746, 3308, 2200, +2730, 3292, 2200, +2682, 3292, 2216, +2714, 3308, 2296, +2746, 3308, 2345, +2762, 3292, 2393, +2778, 3276, 2457, +2746, 3276, 2521, +2762, 3276, 2569, +2778, 3260, 2634, +2794, 3276, 2714, +2794, 3276, 2746, +2842, 3292, 2794, +2875, 3292, 2875, +2858, 3292, 2907, +2891, 3308, 2987, +2923, 3340, 3099, +2891, 3485, 2345, +2891, 3485, 2345, +2939, 3501, 2361, +2875, 3485, 2409, +2858, 3485, 2425, +2907, 3501, 2489, +2907, 3485, 2569, +2923, 3485, 2634, +2955, 3501, 2714, +2987, 3485, 2746, +3019, 3501, 2842, +3051, 3517, 2923, +3067, 3501, 2971, +3051, 3517, 3051, +3099, 3533, 3131, +3131, 3533, 3180, +3164, 3549, 3228, +594, 321, 466, +530, 369, 498, +498, 401, 562, +530, 418, 658, +562, 450, 707, +546, 482, 787, +594, 562, 915, +642, 594, 996, +707, 626, 1076, +755, 707, 1204, +787, 755, 1285, +851, 803, 1397, +899, 867, 1493, +1012, 915, 1574, +1060, 980, 1670, +1108, 1060, 1815, +1188, 1108, 1895, +658, 450, 466, +610, 450, 546, +546, 482, 594, +578, 514, 674, +562, 562, 771, +594, 594, 867, +594, 610, 931, +642, 642, 1028, +707, 723, 1124, +739, 739, 1204, +803, 803, 1317, +899, 883, 1445, +931, 899, 1510, +996, 947, 1606, +1060, 1012, 1702, +1092, 1076, 1783, +1188, 1140, 1927, +658, 626, 514, +674, 626, 562, +642, 642, 723, +658, 658, 787, +626, 691, 851, +610, 723, 947, +658, 739, 996, +707, 787, 1092, +739, 803, 1172, +803, 867, 1301, +867, 883, 1381, +883, 915, 1445, +947, 980, 1542, +1028, 1028, 1654, +1092, 1092, 1750, +1156, 1124, 1863, +1204, 1188, 1943, +755, 835, 642, +755, 819, 674, +739, 819, 755, +739, 851, 867, +723, 867, 931, +755, 899, 1044, +787, 915, 1108, +819, 947, 1204, +819, 964, 1269, +851, 996, 1349, +899, 1012, 1413, +964, 1076, 1526, +1028, 1092, 1622, +1076, 1140, 1718, +1156, 1188, 1815, +1220, 1237, 1927, +1253, 1269, 1975, +835, 1028, 739, +835, 1012, 787, +819, 1028, 867, +803, 1044, 996, +835, 1060, 1060, +851, 1076, 1156, +883, 1092, 1188, +883, 1108, 1269, +931, 1124, 1381, +964, 1140, 1461, +980, 1172, 1526, +1028, 1204, 1622, +1092, 1253, 1702, +1140, 1285, 1799, +1220, 1301, 1863, +1285, 1349, 1975, +1349, 1397, 2072, +980, 1220, 867, +964, 1220, 915, +964, 1237, 996, +931, 1220, 1076, +947, 1220, 1156, +980, 1237, 1204, +996, 1253, 1301, +1028, 1269, 1381, +1060, 1285, 1461, +1044, 1317, 1558, +1092, 1349, 1622, +1140, 1349, 1686, +1188, 1381, 1783, +1253, 1429, 1863, +1301, 1461, 1959, +1381, 1493, 2056, +1429, 1526, 2120, +1124, 1429, 980, +1108, 1429, 1028, +1124, 1429, 1108, +1108, 1445, 1204, +1124, 1461, 1301, +1124, 1445, 1349, +1108, 1445, 1365, +1156, 1477, 1493, +1172, 1493, 1558, +1188, 1493, 1654, +1204, 1526, 1734, +1220, 1558, 1815, +1269, 1558, 1895, +1365, 1590, 1959, +1397, 1606, 2039, +1445, 1638, 2104, +1510, 1686, 2216, +1237, 1638, 1124, +1269, 1622, 1188, +1285, 1638, 1220, +1253, 1638, 1301, +1285, 1622, 1381, +1269, 1638, 1445, +1285, 1654, 1542, +1349, 1670, 1558, +1349, 1670, 1622, +1365, 1686, 1750, +1397, 1718, 1847, +1413, 1718, 1911, +1461, 1750, 1991, +1461, 1766, 2039, +1558, 1815, 2152, +1574, 1815, 2232, +1638, 1863, 2345, +1413, 1831, 1220, +1429, 1831, 1285, +1445, 1831, 1349, +1397, 1831, 1397, +1429, 1831, 1477, +1445, 1847, 1574, +1429, 1847, 1638, +1477, 1863, 1718, +1493, 1863, 1750, +1526, 1895, 1831, +1542, 1895, 1895, +1574, 1911, 1975, +1654, 1927, 2072, +1686, 1943, 2152, +1718, 1959, 2232, +1766, 1991, 2329, +1783, 1991, 2361, +1622, 2039, 1349, +1638, 2039, 1413, +1654, 2056, 1461, +1606, 2039, 1542, +1638, 2039, 1574, +1654, 2056, 1670, +1670, 2039, 1718, +1686, 2039, 1783, +1702, 2072, 1863, +1718, 2072, 1911, +1750, 2088, 1975, +1750, 2088, 2072, +1831, 2136, 2152, +1831, 2120, 2200, +1895, 2136, 2280, +1959, 2136, 2361, +1991, 2200, 2473, +1847, 2248, 1477, +1847, 2248, 1493, +1831, 2248, 1526, +1815, 2248, 1606, +1831, 2248, 1670, +1863, 2264, 1783, +1879, 2264, 1847, +1911, 2264, 1879, +1927, 2280, 1959, +1927, 2296, 2023, +1975, 2312, 2072, +1991, 2312, 2152, +2007, 2329, 2248, +2056, 2361, 2345, +2056, 2345, 2393, +2136, 2361, 2489, +2136, 2345, 2537, +2023, 2457, 1590, +2072, 2457, 1638, +2039, 2441, 1654, +2007, 2441, 1734, +2056, 2457, 1815, +2056, 2441, 1863, +2104, 2473, 1959, +2072, 2457, 2007, +2104, 2473, 2072, +2120, 2473, 2152, +2152, 2473, 2216, +2168, 2505, 2280, +2184, 2505, 2345, +2184, 2521, 2473, +2216, 2537, 2553, +2264, 2553, 2602, +2329, 2553, 2682, +2200, 2650, 1750, +2232, 2666, 1799, +2216, 2666, 1815, +2184, 2666, 1847, +2216, 2682, 1959, +2232, 2682, 2023, +2264, 2650, 2072, +2280, 2682, 2152, +2280, 2666, 2216, +2280, 2698, 2280, +2296, 2682, 2345, +2345, 2698, 2393, +2361, 2714, 2473, +2409, 2714, 2521, +2425, 2714, 2585, +2409, 2762, 2730, +2441, 2762, 2810, +2393, 2891, 1927, +2393, 2891, 1927, +2393, 2891, 1959, +2361, 2891, 2007, +2377, 2875, 2072, +2409, 2875, 2152, +2425, 2875, 2216, +2441, 2875, 2312, +2473, 2891, 2361, +2489, 2875, 2377, +2473, 2875, 2441, +2505, 2891, 2521, +2553, 2907, 2569, +2553, 2891, 2618, +2585, 2907, 2698, +2634, 2923, 2794, +2634, 2939, 2891, +2553, 3083, 2039, +2569, 3083, 2039, +2585, 3083, 2120, +2553, 3083, 2104, +2553, 3083, 2168, +2569, 3067, 2248, +2585, 3051, 2280, +2618, 3035, 2377, +2634, 3083, 2473, +2634, 3083, 2505, +2650, 3067, 2569, +2682, 3099, 2650, +2730, 3099, 2698, +2714, 3115, 2730, +2762, 3131, 2810, +2794, 3148, 2891, +2794, 3148, 2987, +2778, 3292, 2200, +2746, 3308, 2200, +2762, 3292, 2248, +2730, 3308, 2280, +2746, 3292, 2296, +2762, 3276, 2361, +2778, 3292, 2457, +2794, 3276, 2521, +2810, 3276, 2585, +2778, 3260, 2634, +2826, 3292, 2698, +2826, 3292, 2730, +2842, 3276, 2794, +2875, 3292, 2875, +2907, 3308, 2923, +2955, 3324, 3003, +2939, 3340, 3083, +2955, 3501, 2329, +2891, 3485, 2345, +2923, 3517, 2329, +2939, 3501, 2393, +2907, 3501, 2457, +2923, 3517, 2505, +2923, 3517, 2602, +2955, 3501, 2666, +2987, 3485, 2730, +3019, 3485, 2762, +3051, 3485, 2826, +3051, 3517, 2923, +3067, 3501, 2971, +3099, 3517, 3051, +3083, 3533, 3131, +3115, 3533, 3180, +3164, 3549, 3228, +771, 418, 498, +739, 450, 562, +674, 498, 642, +658, 530, 707, +707, 562, 819, +691, 578, 883, +674, 626, 964, +739, 658, 1028, +755, 707, 1124, +819, 755, 1237, +867, 819, 1333, +931, 867, 1429, +980, 899, 1510, +1076, 964, 1606, +1108, 1028, 1718, +1140, 1060, 1799, +1204, 1124, 1927, +851, 530, 530, +819, 546, 610, +723, 594, 691, +691, 610, 755, +707, 626, 835, +723, 626, 931, +755, 691, 980, +755, 723, 1060, +803, 771, 1172, +867, 819, 1269, +915, 867, 1381, +964, 899, 1461, +1012, 947, 1526, +1044, 996, 1638, +1124, 1060, 1734, +1156, 1092, 1831, +1253, 1188, 1959, +915, 674, 498, +883, 691, 562, +819, 691, 755, +739, 739, 835, +755, 755, 899, +771, 771, 980, +771, 803, 1044, +803, 835, 1140, +851, 867, 1220, +883, 899, 1317, +899, 931, 1413, +980, 980, 1493, +1028, 1044, 1606, +1092, 1076, 1686, +1140, 1108, 1766, +1188, 1172, 1879, +1285, 1220, 1991, +899, 883, 658, +899, 867, 707, +915, 883, 787, +883, 899, 947, +867, 931, 996, +835, 931, 1076, +835, 947, 1124, +867, 980, 1237, +883, 996, 1317, +947, 1044, 1397, +964, 1044, 1461, +1028, 1108, 1574, +1076, 1140, 1638, +1124, 1172, 1734, +1188, 1220, 1847, +1269, 1253, 1911, +1317, 1301, 2007, +964, 1044, 771, +947, 1060, 851, +964, 1044, 899, +947, 1076, 1012, +931, 1076, 1076, +931, 1108, 1156, +947, 1124, 1237, +996, 1156, 1333, +980, 1172, 1397, +1028, 1156, 1445, +1076, 1204, 1558, +1108, 1237, 1638, +1140, 1253, 1718, +1204, 1301, 1799, +1285, 1333, 1879, +1301, 1349, 1959, +1365, 1413, 2088, +1076, 1253, 883, +1060, 1253, 947, +1092, 1253, 996, +1076, 1269, 1092, +1044, 1269, 1172, +1092, 1285, 1269, +1060, 1285, 1349, +1108, 1317, 1429, +1092, 1317, 1493, +1140, 1349, 1558, +1156, 1365, 1622, +1172, 1397, 1702, +1237, 1413, 1799, +1317, 1445, 1895, +1349, 1477, 1975, +1397, 1510, 2088, +1477, 1558, 2136, +1220, 1445, 1012, +1204, 1445, 1028, +1188, 1461, 1124, +1188, 1445, 1204, +1156, 1445, 1269, +1156, 1477, 1381, +1172, 1477, 1397, +1204, 1493, 1510, +1220, 1493, 1574, +1253, 1526, 1654, +1237, 1542, 1750, +1301, 1558, 1847, +1349, 1574, 1847, +1413, 1622, 1975, +1445, 1654, 2056, +1510, 1670, 2152, +1542, 1686, 2232, +1333, 1654, 1092, +1349, 1638, 1156, +1333, 1654, 1204, +1349, 1654, 1301, +1317, 1654, 1381, +1333, 1654, 1477, +1365, 1686, 1542, +1381, 1670, 1574, +1413, 1686, 1686, +1429, 1702, 1750, +1461, 1734, 1879, +1461, 1750, 1911, +1493, 1766, 1991, +1526, 1799, 2072, +1558, 1815, 2168, +1622, 1847, 2232, +1686, 1895, 2312, +1461, 1847, 1220, +1493, 1847, 1269, +1510, 1847, 1333, +1493, 1847, 1397, +1461, 1847, 1461, +1526, 1863, 1574, +1510, 1863, 1638, +1526, 1879, 1702, +1558, 1879, 1750, +1590, 1895, 1783, +1574, 1911, 1927, +1606, 1927, 2007, +1686, 1927, 2072, +1718, 1927, 2152, +1718, 1975, 2232, +1783, 2007, 2312, +1815, 2023, 2393, +1670, 2039, 1333, +1686, 2056, 1381, +1670, 2056, 1445, +1670, 2056, 1493, +1686, 2072, 1574, +1702, 2056, 1686, +1734, 2072, 1766, +1718, 2072, 1815, +1750, 2088, 1879, +1799, 2104, 1943, +1831, 2104, 1975, +1815, 2136, 2088, +1863, 2136, 2152, +1927, 2136, 2232, +1943, 2136, 2296, +2007, 2184, 2409, +2023, 2232, 2505, +1895, 2280, 1461, +1879, 2280, 1493, +1895, 2264, 1558, +1895, 2280, 1622, +1895, 2280, 1702, +1911, 2280, 1815, +1927, 2264, 1863, +1975, 2296, 1911, +1943, 2296, 1975, +1975, 2296, 2039, +2007, 2312, 2088, +2039, 2329, 2168, +2088, 2361, 2296, +2088, 2345, 2345, +2104, 2361, 2409, +2136, 2361, 2489, +2184, 2393, 2585, +2088, 2473, 1622, +2088, 2489, 1622, +2088, 2473, 1654, +2104, 2473, 1718, +2072, 2473, 1799, +2072, 2457, 1895, +2136, 2473, 1991, +2136, 2489, 2039, +2136, 2473, 2088, +2152, 2489, 2136, +2184, 2505, 2216, +2216, 2521, 2264, +2248, 2521, 2329, +2264, 2537, 2473, +2296, 2537, 2505, +2312, 2537, 2585, +2329, 2569, 2698, +2264, 2682, 1750, +2264, 2682, 1783, +2248, 2666, 1799, +2248, 2698, 1879, +2216, 2682, 1927, +2264, 2666, 2023, +2280, 2682, 2088, +2312, 2682, 2152, +2280, 2682, 2216, +2312, 2682, 2280, +2345, 2698, 2377, +2377, 2698, 2409, +2377, 2714, 2489, +2409, 2730, 2569, +2441, 2746, 2650, +2473, 2778, 2762, +2473, 2762, 2778, +2409, 2891, 1911, +2393, 2891, 1927, +2425, 2891, 1927, +2425, 2891, 1991, +2409, 2907, 2072, +2473, 2891, 2136, +2473, 2891, 2232, +2489, 2891, 2296, +2505, 2891, 2361, +2537, 2875, 2393, +2521, 2891, 2457, +2521, 2875, 2505, +2585, 2891, 2569, +2569, 2907, 2634, +2618, 2939, 2730, +2634, 2939, 2810, +2634, 2939, 2891, +2602, 3067, 2007, +2618, 3099, 2056, +2602, 3067, 2072, +2585, 3083, 2120, +2602, 3083, 2216, +2618, 3083, 2280, +2650, 3083, 2312, +2650, 3067, 2361, +2666, 3067, 2473, +2682, 3099, 2521, +2682, 3083, 2569, +2698, 3115, 2666, +2730, 3115, 2714, +2762, 3115, 2746, +2778, 3115, 2810, +2842, 3148, 2923, +2794, 3148, 3003, +2746, 3292, 2168, +2778, 3292, 2216, +2778, 3292, 2216, +2762, 3292, 2264, +2762, 3308, 2312, +2762, 3292, 2361, +2778, 3276, 2425, +2794, 3260, 2489, +2794, 3260, 2569, +2826, 3276, 2650, +2858, 3308, 2682, +2842, 3276, 2762, +2875, 3292, 2842, +2891, 3308, 2891, +2939, 3324, 2939, +2955, 3324, 3019, +2987, 3340, 3083, +2907, 3501, 2329, +2923, 3501, 2329, +2939, 3501, 2361, +2987, 3517, 2409, +2923, 3517, 2473, +2955, 3517, 2537, +2955, 3501, 2585, +3003, 3501, 2634, +3035, 3501, 2746, +3035, 3501, 2778, +3067, 3501, 2842, +3099, 3517, 2923, +3067, 3517, 2987, +3083, 3517, 3051, +3131, 3533, 3131, +3131, 3533, 3180, +3164, 3549, 3228, +996, 514, 562, +947, 546, 626, +819, 578, 723, +803, 626, 771, +803, 642, 851, +819, 674, 947, +819, 707, 1012, +867, 739, 1108, +883, 787, 1188, +947, 819, 1301, +964, 851, 1365, +1012, 899, 1461, +1076, 947, 1542, +1124, 1028, 1654, +1156, 1060, 1734, +1220, 1124, 1863, +1285, 1188, 1959, +1028, 594, 562, +996, 610, 658, +899, 674, 787, +835, 723, 851, +835, 723, 883, +851, 739, 980, +851, 755, 1044, +883, 803, 1140, +883, 835, 1220, +947, 883, 1317, +980, 899, 1397, +1060, 964, 1493, +1076, 1012, 1590, +1108, 1060, 1670, +1172, 1108, 1783, +1253, 1172, 1879, +1317, 1220, 2007, +1092, 723, 514, +1028, 739, 658, +980, 755, 803, +883, 803, 883, +899, 851, 964, +915, 851, 1044, +931, 867, 1140, +931, 899, 1188, +947, 915, 1269, +964, 947, 1349, +1012, 980, 1413, +1044, 1044, 1526, +1092, 1076, 1622, +1140, 1124, 1734, +1204, 1172, 1815, +1269, 1220, 1927, +1349, 1253, 1975, +1076, 899, 642, +1108, 899, 707, +1108, 899, 771, +1028, 931, 980, +931, 947, 1028, +964, 980, 1140, +947, 996, 1204, +964, 1028, 1269, +996, 1044, 1333, +1044, 1076, 1413, +1076, 1108, 1510, +1108, 1124, 1574, +1156, 1172, 1686, +1220, 1204, 1766, +1269, 1269, 1847, +1349, 1301, 1959, +1365, 1333, 2023, +1092, 1092, 787, +1108, 1124, 851, +1108, 1124, 931, +1108, 1092, 964, +1092, 1140, 1156, +1060, 1140, 1172, +1044, 1172, 1269, +1044, 1156, 1317, +1076, 1204, 1413, +1108, 1237, 1493, +1140, 1253, 1574, +1188, 1285, 1670, +1269, 1301, 1734, +1285, 1349, 1831, +1349, 1365, 1927, +1381, 1381, 2007, +1429, 1461, 2104, +1220, 1285, 915, +1204, 1285, 964, +1204, 1301, 1060, +1188, 1285, 1124, +1172, 1301, 1220, +1172, 1333, 1317, +1156, 1333, 1381, +1172, 1333, 1445, +1188, 1365, 1477, +1220, 1397, 1606, +1204, 1397, 1654, +1253, 1413, 1734, +1301, 1445, 1831, +1333, 1477, 1927, +1365, 1493, 2007, +1461, 1542, 2056, +1526, 1590, 2184, +1285, 1477, 1044, +1301, 1477, 1076, +1253, 1477, 1108, +1269, 1477, 1204, +1285, 1477, 1301, +1237, 1493, 1349, +1253, 1510, 1445, +1269, 1526, 1558, +1301, 1542, 1622, +1269, 1542, 1670, +1381, 1574, 1750, +1397, 1590, 1831, +1445, 1622, 1911, +1477, 1654, 2007, +1510, 1670, 2088, +1558, 1702, 2184, +1622, 1734, 2232, +1429, 1686, 1140, +1461, 1670, 1172, +1445, 1686, 1237, +1429, 1686, 1317, +1429, 1686, 1397, +1413, 1702, 1493, +1413, 1702, 1574, +1445, 1702, 1622, +1477, 1718, 1718, +1526, 1750, 1783, +1542, 1750, 1831, +1542, 1766, 1927, +1574, 1799, 1991, +1622, 1815, 2088, +1638, 1831, 2168, +1702, 1863, 2232, +1750, 1879, 2312, +1558, 1863, 1237, +1558, 1879, 1285, +1574, 1879, 1349, +1542, 1863, 1381, +1574, 1863, 1477, +1558, 1895, 1590, +1590, 1879, 1654, +1606, 1895, 1718, +1638, 1911, 1750, +1638, 1911, 1847, +1654, 1927, 1943, +1686, 1927, 2023, +1750, 1943, 2104, +1766, 1991, 2200, +1799, 1991, 2232, +1847, 2023, 2345, +1895, 2039, 2393, +1750, 2088, 1397, +1750, 2088, 1381, +1734, 2088, 1413, +1750, 2072, 1493, +1750, 2072, 1558, +1750, 2088, 1654, +1783, 2072, 1766, +1783, 2088, 1799, +1799, 2088, 1863, +1847, 2104, 1927, +1879, 2120, 1975, +1847, 2136, 2104, +1911, 2136, 2168, +1975, 2152, 2264, +2023, 2184, 2345, +2023, 2216, 2441, +2056, 2232, 2521, +1959, 2312, 1510, +1943, 2296, 1493, +1959, 2296, 1558, +1991, 2296, 1622, +1959, 2296, 1702, +1959, 2280, 1783, +1991, 2280, 1863, +2023, 2296, 1943, +2023, 2329, 2007, +2039, 2329, 2072, +2072, 2345, 2120, +2104, 2345, 2200, +2104, 2329, 2280, +2104, 2361, 2361, +2120, 2361, 2425, +2136, 2377, 2505, +2264, 2393, 2602, +2136, 2473, 1638, +2088, 2473, 1622, +2136, 2489, 1638, +2120, 2489, 1702, +2120, 2473, 1783, +2152, 2489, 1895, +2152, 2473, 1975, +2168, 2489, 2039, +2184, 2473, 2104, +2200, 2505, 2152, +2232, 2505, 2232, +2264, 2521, 2264, +2296, 2521, 2345, +2312, 2537, 2457, +2329, 2537, 2521, +2361, 2553, 2602, +2393, 2585, 2682, +2264, 2682, 1750, +2264, 2682, 1750, +2296, 2682, 1831, +2296, 2666, 1863, +2296, 2682, 1943, +2280, 2682, 2007, +2312, 2682, 2072, +2377, 2714, 2200, +2361, 2698, 2248, +2377, 2698, 2312, +2361, 2714, 2345, +2393, 2714, 2425, +2457, 2746, 2457, +2473, 2746, 2553, +2473, 2746, 2650, +2521, 2762, 2730, +2537, 2778, 2810, +2457, 2891, 1879, +2457, 2907, 1895, +2505, 2907, 1927, +2521, 2907, 1991, +2521, 2891, 2072, +2489, 2907, 2120, +2521, 2891, 2200, +2537, 2891, 2296, +2569, 2891, 2345, +2553, 2891, 2409, +2569, 2907, 2473, +2602, 2907, 2553, +2618, 2923, 2602, +2618, 2923, 2666, +2650, 2923, 2730, +2698, 2955, 2794, +2714, 2971, 2939, +2650, 3083, 2023, +2650, 3083, 2039, +2650, 3083, 2056, +2682, 3099, 2136, +2666, 3099, 2216, +2634, 3099, 2264, +2666, 3099, 2345, +2682, 3099, 2393, +2698, 3083, 2457, +2730, 3099, 2537, +2714, 3115, 2602, +2746, 3115, 2682, +2778, 3115, 2714, +2794, 3148, 2778, +2826, 3148, 2842, +2826, 3148, 2907, +2875, 3180, 3035, +2826, 3292, 2184, +2794, 3308, 2184, +2778, 3292, 2200, +2794, 3276, 2232, +2810, 3276, 2296, +2762, 3276, 2329, +2826, 3292, 2441, +2842, 3292, 2537, +2842, 3276, 2585, +2858, 3292, 2650, +2875, 3292, 2714, +2907, 3292, 2778, +2907, 3308, 2826, +2939, 3324, 2907, +2955, 3308, 2939, +3003, 3340, 3035, +3003, 3356, 3099, +2939, 3517, 2312, +3019, 3517, 2361, +2971, 3517, 2345, +3035, 3517, 2393, +2971, 3517, 2441, +3003, 3517, 2521, +3003, 3501, 2618, +3035, 3501, 2682, +3051, 3501, 2746, +3083, 3501, 2778, +3115, 3517, 2875, +3099, 3517, 2939, +3131, 3533, 3019, +3148, 3517, 3067, +3164, 3549, 3131, +3180, 3549, 3164, +3212, 3549, 3228, +1188, 594, 578, +1124, 642, 674, +1044, 691, 803, +947, 739, 851, +931, 755, 931, +980, 787, 1012, +996, 819, 1092, +1028, 851, 1204, +1044, 867, 1253, +1028, 899, 1349, +1044, 931, 1413, +1108, 996, 1510, +1156, 1044, 1622, +1188, 1060, 1686, +1253, 1124, 1799, +1317, 1188, 1911, +1349, 1220, 1959, +1220, 691, 610, +1204, 691, 691, +1092, 739, 819, +996, 787, 899, +996, 819, 964, +996, 835, 1060, +1028, 883, 1124, +1028, 883, 1204, +1060, 915, 1269, +1060, 947, 1365, +1108, 1012, 1461, +1140, 1028, 1542, +1172, 1060, 1638, +1204, 1108, 1702, +1285, 1156, 1831, +1333, 1204, 1943, +1381, 1237, 1975, +1285, 771, 578, +1237, 803, 739, +1172, 835, 851, +1092, 867, 964, +1044, 899, 1012, +1044, 915, 1076, +1028, 931, 1156, +1076, 947, 1237, +1060, 1012, 1333, +1076, 1044, 1397, +1124, 1076, 1493, +1140, 1092, 1558, +1204, 1140, 1670, +1253, 1172, 1766, +1285, 1220, 1847, +1381, 1253, 1927, +1381, 1285, 2023, +1285, 931, 626, +1301, 931, 674, +1237, 947, 867, +1172, 996, 1044, +1092, 1028, 1076, +1108, 1060, 1156, +1108, 1060, 1237, +1140, 1076, 1301, +1108, 1108, 1381, +1140, 1140, 1461, +1140, 1156, 1542, +1220, 1188, 1638, +1253, 1237, 1734, +1301, 1269, 1815, +1349, 1301, 1895, +1397, 1333, 1959, +1461, 1381, 2072, +1269, 1124, 771, +1285, 1124, 819, +1253, 1124, 883, +1285, 1108, 964, +1220, 1140, 1172, +1172, 1188, 1237, +1188, 1204, 1301, +1172, 1220, 1397, +1172, 1237, 1461, +1220, 1269, 1558, +1237, 1285, 1622, +1253, 1317, 1686, +1333, 1333, 1783, +1365, 1349, 1863, +1413, 1413, 1959, +1461, 1445, 2056, +1526, 1493, 2120, +1301, 1333, 980, +1301, 1333, 980, +1317, 1333, 1028, +1317, 1317, 1108, +1333, 1317, 1188, +1301, 1333, 1317, +1285, 1365, 1381, +1269, 1381, 1461, +1237, 1397, 1526, +1253, 1429, 1606, +1317, 1429, 1686, +1349, 1445, 1766, +1397, 1493, 1863, +1429, 1510, 1943, +1493, 1542, 2023, +1542, 1590, 2120, +1622, 1638, 2200, +1397, 1526, 1076, +1429, 1510, 1108, +1413, 1526, 1156, +1397, 1526, 1253, +1397, 1526, 1333, +1381, 1542, 1413, +1365, 1542, 1493, +1349, 1558, 1558, +1365, 1558, 1622, +1397, 1574, 1686, +1445, 1606, 1766, +1477, 1622, 1879, +1493, 1638, 1943, +1542, 1670, 2039, +1574, 1686, 2120, +1654, 1734, 2184, +1686, 1750, 2264, +1574, 1718, 1204, +1558, 1702, 1220, +1558, 1718, 1253, +1526, 1718, 1333, +1542, 1718, 1413, +1558, 1718, 1510, +1542, 1718, 1590, +1558, 1750, 1654, +1558, 1750, 1734, +1558, 1734, 1783, +1574, 1766, 1863, +1622, 1815, 1975, +1638, 1815, 2023, +1670, 1831, 2120, +1734, 1879, 2200, +1783, 1879, 2264, +1815, 1895, 2345, +1686, 1895, 1285, +1670, 1895, 1285, +1670, 1879, 1333, +1654, 1895, 1397, +1670, 1895, 1493, +1670, 1911, 1558, +1670, 1911, 1686, +1686, 1911, 1734, +1734, 1927, 1799, +1734, 1927, 1879, +1766, 1943, 1959, +1815, 1975, 2023, +1815, 1975, 2088, +1847, 2007, 2168, +1863, 2039, 2264, +1911, 2039, 2345, +1943, 2056, 2425, +1847, 2088, 1349, +1863, 2104, 1397, +1831, 2104, 1413, +1847, 2088, 1493, +1847, 2104, 1574, +1863, 2104, 1670, +1847, 2104, 1783, +1911, 2120, 1831, +1879, 2136, 1895, +1927, 2136, 1943, +1959, 2120, 2023, +1975, 2120, 2088, +2023, 2152, 2184, +2023, 2184, 2296, +2056, 2216, 2393, +2072, 2232, 2441, +2120, 2280, 2537, +2039, 2312, 1493, +2039, 2312, 1526, +2007, 2296, 1542, +2023, 2329, 1622, +2056, 2312, 1702, +2056, 2329, 1783, +2023, 2329, 1863, +2088, 2329, 1975, +2072, 2329, 1991, +2104, 2345, 2104, +2136, 2345, 2136, +2136, 2329, 2168, +2136, 2377, 2312, +2152, 2377, 2377, +2184, 2393, 2457, +2232, 2393, 2537, +2280, 2409, 2634, +2216, 2505, 1606, +2200, 2489, 1606, +2200, 2505, 1670, +2216, 2505, 1734, +2200, 2505, 1783, +2232, 2521, 1895, +2200, 2505, 1943, +2232, 2505, 2072, +2264, 2505, 2120, +2264, 2521, 2184, +2296, 2537, 2264, +2329, 2537, 2312, +2345, 2537, 2377, +2312, 2537, 2457, +2361, 2569, 2553, +2393, 2585, 2634, +2425, 2602, 2714, +2345, 2698, 1718, +2345, 2714, 1766, +2361, 2714, 1815, +2345, 2698, 1879, +2377, 2714, 1943, +2393, 2714, 2007, +2377, 2714, 2104, +2393, 2714, 2184, +2409, 2714, 2232, +2441, 2714, 2312, +2425, 2730, 2377, +2473, 2746, 2441, +2505, 2762, 2473, +2521, 2762, 2569, +2537, 2762, 2666, +2521, 2778, 2746, +2569, 2810, 2842, +2521, 2907, 1879, +2489, 2891, 1895, +2537, 2907, 1943, +2521, 2891, 1959, +2537, 2891, 2023, +2553, 2891, 2120, +2537, 2907, 2216, +2553, 2907, 2280, +2585, 2907, 2329, +2602, 2907, 2425, +2618, 2907, 2489, +2634, 2923, 2537, +2666, 2939, 2618, +2698, 2939, 2666, +2730, 2955, 2746, +2714, 2971, 2842, +2746, 2955, 2907, +2682, 3099, 2023, +2682, 3099, 2023, +2682, 3115, 2056, +2682, 3099, 2104, +2714, 3115, 2184, +2698, 3099, 2248, +2714, 3131, 2296, +2714, 3099, 2409, +2746, 3099, 2473, +2778, 3099, 2553, +2778, 3131, 2634, +2794, 3131, 2698, +2810, 3148, 2746, +2826, 3131, 2778, +2842, 3131, 2842, +2907, 3180, 2939, +2939, 3180, 3003, +2810, 3276, 2136, +2826, 3292, 2152, +2858, 3292, 2232, +2842, 3292, 2264, +2842, 3292, 2248, +2858, 3292, 2361, +2842, 3308, 2457, +2858, 3308, 2521, +2907, 3324, 2602, +2907, 3308, 2666, +2939, 3308, 2698, +2955, 3340, 2794, +2955, 3324, 2858, +2987, 3324, 2923, +3003, 3356, 2987, +3019, 3356, 3051, +3067, 3388, 3148, +3051, 3517, 2329, +3051, 3517, 2361, +3051, 3517, 2361, +3083, 3517, 2393, +3035, 3517, 2425, +3003, 3517, 2489, +3035, 3517, 2569, +3083, 3517, 2666, +3099, 3501, 2762, +3131, 3517, 2810, +3131, 3533, 2891, +3148, 3533, 2955, +3131, 3533, 3003, +3164, 3533, 3067, +3196, 3549, 3131, +3244, 3565, 3180, +3212, 3565, 3244, +1365, 707, 658, +1349, 739, 739, +1237, 787, 883, +1140, 835, 980, +1108, 883, 1028, +1108, 867, 1092, +1124, 899, 1172, +1172, 947, 1269, +1156, 980, 1349, +1204, 996, 1397, +1188, 1044, 1493, +1220, 1060, 1574, +1269, 1092, 1654, +1317, 1156, 1783, +1349, 1204, 1847, +1397, 1237, 1927, +1461, 1285, 2039, +1381, 771, 658, +1397, 771, 739, +1301, 835, 899, +1188, 867, 980, +1140, 899, 1044, +1124, 915, 1108, +1124, 931, 1188, +1156, 980, 1285, +1172, 1012, 1349, +1220, 1044, 1445, +1204, 1076, 1526, +1269, 1092, 1606, +1285, 1140, 1702, +1317, 1188, 1766, +1381, 1237, 1847, +1445, 1285, 1959, +1445, 1301, 2007, +1445, 851, 642, +1413, 867, 755, +1365, 883, 899, +1237, 947, 1028, +1156, 1012, 1092, +1172, 1012, 1156, +1188, 1044, 1237, +1188, 1060, 1301, +1220, 1076, 1381, +1220, 1076, 1477, +1220, 1124, 1542, +1269, 1156, 1622, +1301, 1188, 1718, +1397, 1253, 1815, +1413, 1269, 1895, +1461, 1317, 1975, +1526, 1365, 2088, +1493, 996, 658, +1493, 980, 723, +1413, 1028, 915, +1349, 1060, 1060, +1253, 1092, 1156, +1237, 1108, 1204, +1204, 1124, 1269, +1253, 1140, 1365, +1253, 1172, 1429, +1253, 1188, 1493, +1269, 1237, 1590, +1333, 1269, 1670, +1365, 1301, 1766, +1397, 1317, 1831, +1429, 1333, 1927, +1510, 1397, 2056, +1510, 1413, 2104, +1461, 1140, 755, +1461, 1156, 819, +1510, 1140, 883, +1445, 1188, 1108, +1381, 1204, 1220, +1301, 1253, 1285, +1301, 1269, 1365, +1317, 1285, 1445, +1333, 1301, 1493, +1349, 1333, 1590, +1365, 1333, 1638, +1397, 1365, 1734, +1397, 1381, 1815, +1445, 1413, 1911, +1477, 1445, 1991, +1574, 1493, 2056, +1622, 1526, 2152, +1493, 1365, 931, +1461, 1349, 964, +1510, 1365, 1028, +1510, 1365, 1108, +1510, 1349, 1172, +1429, 1397, 1397, +1397, 1397, 1429, +1397, 1429, 1493, +1333, 1461, 1574, +1413, 1461, 1638, +1461, 1493, 1766, +1477, 1510, 1831, +1510, 1510, 1879, +1542, 1542, 1943, +1590, 1590, 2039, +1638, 1622, 2136, +1686, 1654, 2248, +1526, 1526, 1076, +1542, 1558, 1172, +1477, 1542, 1156, +1493, 1542, 1220, +1526, 1558, 1301, +1574, 1558, 1397, +1510, 1574, 1526, +1526, 1590, 1574, +1526, 1622, 1686, +1542, 1638, 1750, +1526, 1638, 1815, +1574, 1670, 1895, +1606, 1702, 1991, +1654, 1718, 2039, +1686, 1734, 2120, +1734, 1766, 2232, +1766, 1783, 2312, +1686, 1750, 1204, +1670, 1750, 1237, +1654, 1734, 1285, +1670, 1734, 1349, +1654, 1734, 1397, +1670, 1750, 1510, +1670, 1766, 1590, +1638, 1766, 1670, +1654, 1799, 1766, +1638, 1815, 1815, +1670, 1815, 1895, +1702, 1847, 1991, +1750, 1863, 2039, +1766, 1863, 2104, +1815, 1895, 2200, +1863, 1911, 2280, +1911, 1943, 2377, +1815, 1927, 1285, +1799, 1911, 1301, +1799, 1927, 1365, +1766, 1927, 1429, +1799, 1927, 1477, +1815, 1927, 1574, +1815, 1927, 1670, +1799, 1927, 1750, +1847, 1959, 1815, +1799, 1943, 1879, +1847, 1975, 1975, +1847, 2007, 2056, +1863, 1991, 2120, +1911, 2023, 2200, +1959, 2056, 2296, +1991, 2072, 2377, +2023, 2088, 2425, +1959, 2120, 1397, +1943, 2120, 1429, +1943, 2136, 1461, +1959, 2120, 1526, +1943, 2120, 1574, +1927, 2136, 1670, +1943, 2136, 1734, +1943, 2136, 1847, +1991, 2120, 1911, +2007, 2136, 1959, +2023, 2152, 2056, +2072, 2184, 2152, +2088, 2184, 2216, +2120, 2232, 2296, +2104, 2248, 2393, +2120, 2248, 2457, +2168, 2280, 2553, +2136, 2329, 1526, +2152, 2345, 1542, +2136, 2345, 1606, +2120, 2345, 1654, +2136, 2345, 1718, +2120, 2345, 1783, +2168, 2361, 1863, +2152, 2345, 1975, +2168, 2345, 2039, +2152, 2345, 2088, +2200, 2361, 2152, +2200, 2377, 2232, +2232, 2377, 2312, +2232, 2393, 2377, +2296, 2409, 2473, +2329, 2425, 2553, +2329, 2441, 2634, +2296, 2505, 1590, +2264, 2521, 1622, +2296, 2537, 1686, +2264, 2505, 1718, +2280, 2537, 1799, +2280, 2521, 1879, +2329, 2521, 1991, +2296, 2521, 2072, +2345, 2537, 2152, +2329, 2553, 2216, +2345, 2537, 2280, +2393, 2553, 2296, +2425, 2569, 2377, +2377, 2553, 2489, +2425, 2602, 2585, +2473, 2618, 2650, +2489, 2618, 2746, +2441, 2714, 1750, +2441, 2730, 1799, +2425, 2730, 1815, +2409, 2730, 1847, +2409, 2730, 1911, +2441, 2746, 1991, +2457, 2714, 2104, +2473, 2746, 2184, +2473, 2746, 2280, +2505, 2746, 2345, +2505, 2762, 2425, +2537, 2778, 2473, +2569, 2762, 2505, +2553, 2778, 2569, +2569, 2794, 2714, +2569, 2794, 2762, +2634, 2794, 2842, +2553, 2907, 1879, +2602, 2923, 1895, +2602, 2923, 1895, +2602, 2923, 1975, +2602, 2907, 2056, +2618, 2907, 2120, +2618, 2923, 2200, +2602, 2907, 2312, +2634, 2907, 2345, +2666, 2923, 2409, +2698, 2939, 2505, +2666, 2923, 2553, +2714, 2939, 2634, +2746, 2955, 2682, +2778, 2955, 2762, +2746, 2971, 2858, +2794, 2987, 2939, +2746, 3115, 2007, +2714, 3115, 2023, +2746, 3131, 2056, +2762, 3131, 2120, +2778, 3115, 2184, +2778, 3099, 2264, +2746, 3131, 2312, +2778, 3131, 2377, +2794, 3131, 2489, +2842, 3131, 2585, +2842, 3148, 2618, +2858, 3131, 2682, +2858, 3148, 2762, +2891, 3164, 2810, +2907, 3164, 2875, +2955, 3164, 2923, +2955, 3196, 3051, +2875, 3324, 2152, +2858, 3324, 2152, +2875, 3308, 2200, +2875, 3308, 2232, +2923, 3324, 2296, +2875, 3308, 2345, +2875, 3324, 2409, +2907, 3340, 2537, +2939, 3324, 2618, +2955, 3308, 2682, +2987, 3308, 2730, +2971, 3324, 2778, +3019, 3340, 2891, +2987, 3340, 2923, +3051, 3356, 2987, +3099, 3388, 3099, +3099, 3372, 3148, +3083, 3533, 2312, +3083, 3533, 2361, +3083, 3533, 2361, +3115, 3549, 2409, +3083, 3517, 2409, +3115, 3533, 2521, +3131, 3533, 2585, +3131, 3549, 2698, +3131, 3533, 2762, +3180, 3549, 2810, +3196, 3533, 2875, +3212, 3549, 2987, +3196, 3549, 3003, +3212, 3549, 3067, +3228, 3533, 3131, +3244, 3565, 3196, +3276, 3565, 3276, +1558, 771, 691, +1542, 803, 771, +1445, 867, 947, +1349, 931, 1060, +1253, 964, 1108, +1269, 996, 1156, +1253, 1012, 1237, +1253, 1028, 1301, +1285, 1044, 1381, +1301, 1076, 1461, +1333, 1092, 1542, +1349, 1140, 1638, +1381, 1188, 1734, +1445, 1220, 1815, +1461, 1269, 1879, +1510, 1285, 1959, +1542, 1349, 2088, +1574, 835, 691, +1574, 851, 803, +1477, 883, 915, +1365, 964, 1028, +1285, 1028, 1124, +1269, 1028, 1188, +1269, 1044, 1237, +1285, 1060, 1333, +1301, 1092, 1397, +1317, 1092, 1477, +1349, 1140, 1542, +1397, 1172, 1670, +1413, 1220, 1766, +1429, 1269, 1815, +1493, 1285, 1895, +1510, 1317, 1991, +1574, 1365, 2072, +1606, 931, 707, +1590, 931, 803, +1558, 964, 931, +1429, 1012, 1060, +1333, 1076, 1172, +1301, 1076, 1188, +1285, 1092, 1253, +1333, 1124, 1365, +1317, 1124, 1429, +1365, 1156, 1510, +1381, 1204, 1606, +1397, 1237, 1702, +1397, 1253, 1734, +1461, 1301, 1847, +1510, 1333, 1943, +1542, 1397, 2023, +1574, 1413, 2104, +1670, 1028, 674, +1606, 1060, 819, +1590, 1060, 964, +1510, 1076, 1076, +1397, 1156, 1220, +1349, 1188, 1269, +1333, 1204, 1349, +1365, 1220, 1429, +1397, 1220, 1493, +1413, 1253, 1542, +1429, 1269, 1638, +1429, 1317, 1718, +1461, 1349, 1799, +1510, 1365, 1879, +1558, 1413, 1975, +1606, 1445, 2088, +1654, 1493, 2136, +1702, 1204, 755, +1718, 1204, 819, +1702, 1204, 915, +1622, 1220, 1124, +1542, 1253, 1220, +1445, 1301, 1333, +1445, 1317, 1413, +1445, 1349, 1477, +1461, 1333, 1542, +1461, 1365, 1606, +1477, 1413, 1702, +1461, 1413, 1766, +1526, 1461, 1863, +1542, 1461, 1943, +1622, 1526, 2023, +1670, 1558, 2120, +1686, 1590, 2184, +1670, 1397, 931, +1686, 1381, 947, +1686, 1397, 1028, +1718, 1365, 1076, +1654, 1397, 1285, +1590, 1429, 1413, +1493, 1461, 1461, +1510, 1461, 1526, +1510, 1477, 1606, +1526, 1493, 1702, +1558, 1526, 1766, +1558, 1558, 1847, +1590, 1590, 1927, +1638, 1622, 2023, +1686, 1638, 2104, +1718, 1654, 2168, +1750, 1702, 2232, +1686, 1574, 1044, +1702, 1558, 1092, +1702, 1574, 1172, +1702, 1590, 1220, +1750, 1590, 1301, +1750, 1574, 1397, +1670, 1606, 1558, +1638, 1638, 1638, +1638, 1654, 1702, +1638, 1686, 1783, +1638, 1702, 1831, +1654, 1702, 1895, +1686, 1718, 1959, +1750, 1750, 2072, +1799, 1783, 2168, +1815, 1799, 2248, +1879, 1847, 2329, +1799, 1766, 1204, +1766, 1766, 1253, +1783, 1783, 1285, +1766, 1799, 1381, +1750, 1783, 1429, +1766, 1783, 1526, +1783, 1799, 1590, +1766, 1799, 1734, +1750, 1831, 1815, +1766, 1847, 1847, +1783, 1863, 1927, +1799, 1895, 2007, +1831, 1879, 2072, +1863, 1895, 2152, +1927, 1927, 2248, +1943, 1943, 2329, +1991, 1991, 2377, +1927, 1927, 1285, +1927, 1927, 1317, +1911, 1927, 1381, +1927, 1959, 1461, +1927, 1943, 1526, +1911, 1943, 1590, +1943, 1959, 1654, +1927, 1975, 1750, +1911, 1991, 1847, +1895, 1975, 1895, +1911, 2023, 2007, +1943, 2039, 2072, +1975, 2056, 2152, +2007, 2072, 2232, +2039, 2072, 2280, +2072, 2088, 2361, +2120, 2136, 2457, +2072, 2120, 1397, +2088, 2120, 1429, +2088, 2136, 1493, +2088, 2136, 1526, +2072, 2136, 1590, +2088, 2136, 1670, +2072, 2136, 1734, +2056, 2152, 1831, +2072, 2152, 1927, +2120, 2168, 1991, +2104, 2200, 2088, +2152, 2216, 2168, +2136, 2216, 2232, +2168, 2248, 2312, +2184, 2280, 2409, +2216, 2296, 2473, +2248, 2312, 2537, +2248, 2361, 1542, +2232, 2345, 1558, +2232, 2361, 1606, +2216, 2345, 1654, +2216, 2345, 1718, +2216, 2345, 1750, +2216, 2361, 1847, +2216, 2361, 1959, +2216, 2361, 2056, +2248, 2361, 2120, +2248, 2377, 2168, +2264, 2393, 2264, +2329, 2393, 2345, +2345, 2425, 2441, +2361, 2425, 2505, +2361, 2457, 2585, +2393, 2473, 2666, +2409, 2537, 1654, +2377, 2521, 1654, +2393, 2537, 1702, +2377, 2537, 1734, +2377, 2537, 1799, +2393, 2553, 1895, +2377, 2553, 1991, +2377, 2537, 2072, +2377, 2553, 2120, +2425, 2553, 2216, +2409, 2553, 2280, +2457, 2585, 2345, +2473, 2585, 2441, +2505, 2602, 2505, +2489, 2618, 2585, +2521, 2618, 2666, +2569, 2650, 2762, +2505, 2746, 1799, +2505, 2746, 1783, +2489, 2746, 1815, +2505, 2746, 1879, +2505, 2746, 1943, +2521, 2762, 1991, +2537, 2746, 2104, +2537, 2762, 2184, +2553, 2762, 2280, +2553, 2762, 2377, +2553, 2778, 2441, +2569, 2762, 2473, +2618, 2778, 2521, +2650, 2778, 2553, +2618, 2810, 2698, +2666, 2794, 2794, +2682, 2810, 2875, +2666, 2939, 1895, +2682, 2939, 1895, +2682, 2955, 1943, +2682, 2939, 1991, +2682, 2939, 2023, +2666, 2939, 2088, +2698, 2923, 2216, +2714, 2939, 2312, +2714, 2939, 2393, +2730, 2955, 2457, +2746, 2939, 2521, +2730, 2955, 2585, +2778, 2971, 2666, +2794, 2955, 2698, +2826, 2971, 2778, +2810, 2987, 2891, +2842, 3003, 2955, +2826, 3164, 2023, +2794, 3131, 2039, +2794, 3148, 2039, +2794, 3164, 2120, +2810, 3148, 2168, +2826, 3148, 2280, +2875, 3164, 2329, +2875, 3148, 2409, +2842, 3131, 2489, +2875, 3148, 2569, +2875, 3148, 2666, +2923, 3164, 2714, +2939, 3180, 2762, +2939, 3180, 2826, +3003, 3196, 2891, +3003, 3180, 2955, +2987, 3196, 3051, +2923, 3340, 2136, +2971, 3340, 2184, +2955, 3340, 2216, +2923, 3324, 2232, +2907, 3324, 2296, +2955, 3340, 2345, +2971, 3324, 2441, +2971, 3340, 2521, +2987, 3340, 2618, +3003, 3340, 2682, +3067, 3340, 2762, +3019, 3324, 2794, +3067, 3340, 2891, +3067, 3356, 2971, +3115, 3388, 3035, +3131, 3372, 3051, +3164, 3388, 3148, +3131, 3533, 2296, +3148, 3565, 2361, +3148, 3565, 2345, +3164, 3549, 2425, +3164, 3565, 2457, +3148, 3549, 2489, +3164, 3549, 2585, +3148, 3565, 2650, +3164, 3565, 2746, +3212, 3549, 2810, +3244, 3549, 2891, +3244, 3533, 2971, +3244, 3549, 3019, +3276, 3565, 3099, +3260, 3565, 3180, +3308, 3581, 3228, +3340, 3597, 3308, +1734, 883, 755, +1734, 867, 819, +1670, 931, 964, +1510, 996, 1076, +1429, 1028, 1140, +1381, 1060, 1204, +1397, 1108, 1301, +1413, 1124, 1365, +1429, 1140, 1461, +1429, 1156, 1542, +1477, 1188, 1622, +1510, 1237, 1702, +1542, 1253, 1766, +1542, 1301, 1831, +1558, 1333, 1927, +1622, 1381, 2039, +1654, 1397, 2120, +1734, 915, 755, +1750, 915, 819, +1654, 947, 980, +1558, 1012, 1076, +1477, 1076, 1204, +1413, 1124, 1253, +1413, 1140, 1317, +1429, 1140, 1397, +1445, 1172, 1461, +1461, 1188, 1574, +1510, 1220, 1606, +1510, 1253, 1686, +1542, 1269, 1766, +1542, 1333, 1863, +1590, 1365, 1975, +1622, 1397, 2056, +1686, 1429, 2136, +1750, 1012, 771, +1734, 1028, 883, +1718, 1028, 980, +1622, 1076, 1108, +1542, 1124, 1220, +1429, 1172, 1269, +1445, 1204, 1349, +1477, 1220, 1445, +1477, 1237, 1493, +1493, 1237, 1558, +1526, 1285, 1654, +1558, 1301, 1734, +1574, 1333, 1815, +1590, 1381, 1911, +1638, 1413, 2007, +1654, 1445, 2072, +1702, 1493, 2152, +1879, 1092, 739, +1799, 1124, 883, +1783, 1140, 1012, +1718, 1172, 1156, +1606, 1220, 1253, +1510, 1237, 1317, +1510, 1269, 1365, +1510, 1301, 1461, +1542, 1317, 1542, +1542, 1333, 1606, +1574, 1349, 1686, +1606, 1397, 1799, +1590, 1413, 1863, +1590, 1445, 1943, +1654, 1477, 2007, +1702, 1526, 2120, +1750, 1542, 2200, +1863, 1220, 771, +1895, 1237, 835, +1831, 1237, 964, +1783, 1269, 1140, +1718, 1301, 1285, +1606, 1349, 1397, +1558, 1381, 1429, +1558, 1397, 1526, +1590, 1429, 1622, +1606, 1461, 1686, +1622, 1461, 1750, +1654, 1477, 1847, +1654, 1526, 1895, +1686, 1542, 1975, +1734, 1574, 2072, +1750, 1622, 2184, +1799, 1654, 2232, +1863, 1413, 899, +1895, 1413, 931, +1879, 1413, 1028, +1879, 1397, 1124, +1815, 1429, 1317, +1734, 1477, 1461, +1670, 1510, 1526, +1654, 1542, 1574, +1670, 1558, 1670, +1670, 1574, 1750, +1686, 1574, 1815, +1702, 1622, 1895, +1718, 1654, 1991, +1734, 1654, 2039, +1766, 1670, 2104, +1847, 1734, 2232, +1911, 1734, 2312, +1879, 1606, 1028, +1895, 1606, 1092, +1895, 1622, 1156, +1943, 1638, 1237, +1927, 1606, 1301, +1911, 1622, 1477, +1831, 1654, 1590, +1734, 1686, 1638, +1766, 1702, 1750, +1766, 1718, 1783, +1799, 1750, 1895, +1799, 1766, 1975, +1831, 1783, 2056, +1879, 1799, 2120, +1911, 1831, 2200, +1959, 1847, 2296, +1959, 1863, 2329, +1959, 1815, 1220, +1943, 1815, 1237, +1927, 1815, 1269, +1927, 1815, 1365, +1927, 1815, 1445, +2007, 1815, 1493, +2023, 1831, 1590, +1943, 1847, 1783, +1879, 1863, 1815, +1911, 1879, 1895, +1911, 1895, 1959, +1911, 1911, 2023, +1943, 1927, 2072, +1975, 1943, 2168, +2023, 1959, 2248, +2023, 2007, 2329, +2104, 2023, 2441, +2056, 1991, 1365, +2039, 1975, 1381, +2039, 1975, 1413, +2039, 1991, 1445, +2023, 1991, 1526, +2007, 1991, 1590, +2039, 2007, 1702, +2039, 2007, 1783, +2023, 2023, 1911, +2023, 2039, 1975, +2007, 2056, 1991, +2056, 2072, 2104, +2072, 2072, 2152, +2104, 2088, 2232, +2168, 2136, 2345, +2216, 2168, 2441, +2232, 2168, 2505, +2248, 2184, 1461, +2248, 2184, 1445, +2216, 2184, 1510, +2216, 2184, 1558, +2200, 2184, 1622, +2200, 2168, 1702, +2200, 2184, 1799, +2232, 2200, 1895, +2232, 2232, 1959, +2216, 2232, 2039, +2216, 2248, 2120, +2216, 2264, 2200, +2232, 2280, 2264, +2264, 2280, 2345, +2264, 2312, 2425, +2280, 2312, 2489, +2312, 2312, 2553, +2329, 2377, 1574, +2329, 2377, 1574, +2312, 2361, 1606, +2329, 2361, 1686, +2329, 2361, 1718, +2312, 2377, 1783, +2312, 2361, 1863, +2329, 2393, 1991, +2329, 2377, 2039, +2361, 2393, 2152, +2377, 2393, 2216, +2361, 2409, 2312, +2393, 2425, 2393, +2393, 2441, 2457, +2409, 2473, 2553, +2425, 2489, 2634, +2457, 2489, 2666, +2457, 2553, 1638, +2457, 2553, 1670, +2489, 2553, 1718, +2457, 2537, 1750, +2473, 2569, 1847, +2441, 2553, 1895, +2457, 2553, 1991, +2505, 2585, 2072, +2473, 2553, 2104, +2489, 2585, 2248, +2505, 2585, 2312, +2505, 2602, 2361, +2537, 2618, 2473, +2553, 2618, 2537, +2553, 2634, 2618, +2602, 2666, 2714, +2602, 2682, 2794, +2618, 2778, 1799, +2634, 2762, 1831, +2618, 2762, 1847, +2618, 2794, 1911, +2618, 2778, 1959, +2602, 2778, 1991, +2618, 2762, 2072, +2602, 2778, 2184, +2602, 2762, 2248, +2618, 2778, 2377, +2666, 2794, 2409, +2666, 2810, 2489, +2682, 2794, 2521, +2730, 2794, 2618, +2730, 2810, 2698, +2762, 2826, 2778, +2778, 2826, 2842, +2762, 2955, 1895, +2762, 2939, 1895, +2778, 2971, 1943, +2730, 2939, 1975, +2778, 2955, 2056, +2762, 2971, 2136, +2746, 2971, 2184, +2810, 2971, 2296, +2794, 2971, 2361, +2810, 2971, 2473, +2810, 2955, 2537, +2794, 2971, 2618, +2826, 2971, 2682, +2858, 2971, 2730, +2907, 3003, 2778, +2875, 3019, 2923, +2939, 3051, 2987, +2907, 3148, 2039, +2923, 3180, 2056, +2907, 3164, 2088, +2891, 3164, 2104, +2891, 3164, 2184, +2891, 3164, 2264, +2939, 3180, 2312, +2923, 3148, 2393, +2939, 3164, 2505, +2939, 3180, 2618, +2955, 3164, 2666, +2987, 3180, 2714, +2987, 3196, 2794, +3003, 3196, 2858, +3019, 3180, 2891, +3051, 3196, 2971, +3019, 3196, 3051, +3019, 3340, 2168, +3019, 3340, 2168, +3035, 3340, 2200, +3003, 3356, 2232, +3035, 3356, 2312, +3035, 3356, 2345, +3035, 3356, 2441, +3051, 3340, 2505, +3051, 3372, 2650, +3051, 3356, 2714, +3099, 3372, 2762, +3131, 3404, 2875, +3148, 3388, 2939, +3148, 3388, 2971, +3164, 3388, 3035, +3196, 3404, 3099, +3228, 3404, 3164, +3212, 3565, 2345, +3212, 3565, 2345, +3212, 3565, 2345, +3244, 3581, 2425, +3228, 3565, 2441, +3244, 3565, 2521, +3228, 3581, 2585, +3276, 3565, 2682, +3228, 3565, 2730, +3228, 3549, 2794, +3260, 3565, 2875, +3276, 3549, 2971, +3308, 3565, 3051, +3324, 3581, 3115, +3308, 3581, 3180, +3356, 3581, 3228, +3404, 3613, 3292, +1927, 964, 803, +1911, 964, 899, +1847, 1012, 1028, +1766, 1092, 1172, +1654, 1140, 1269, +1574, 1204, 1333, +1574, 1220, 1365, +1558, 1220, 1429, +1574, 1253, 1510, +1606, 1269, 1622, +1606, 1285, 1654, +1638, 1301, 1766, +1670, 1349, 1831, +1702, 1365, 1911, +1686, 1413, 1991, +1766, 1461, 2088, +1783, 1510, 2184, +1959, 1012, 835, +1943, 1012, 899, +1863, 1060, 1028, +1783, 1108, 1172, +1702, 1172, 1253, +1590, 1220, 1317, +1558, 1220, 1349, +1590, 1253, 1461, +1590, 1253, 1510, +1590, 1285, 1590, +1638, 1317, 1686, +1638, 1333, 1766, +1686, 1365, 1847, +1686, 1381, 1927, +1734, 1445, 2007, +1766, 1461, 2088, +1799, 1510, 2200, +1927, 1076, 819, +1911, 1076, 899, +1911, 1092, 1012, +1799, 1140, 1140, +1750, 1220, 1301, +1638, 1253, 1365, +1606, 1301, 1413, +1606, 1301, 1493, +1622, 1333, 1542, +1654, 1349, 1654, +1638, 1349, 1718, +1686, 1381, 1799, +1702, 1413, 1895, +1734, 1429, 1943, +1734, 1493, 2039, +1799, 1526, 2136, +1831, 1574, 2216, +1991, 1156, 803, +1943, 1204, 915, +1927, 1188, 1044, +1879, 1204, 1140, +1799, 1253, 1285, +1702, 1317, 1397, +1638, 1365, 1445, +1638, 1381, 1542, +1654, 1381, 1606, +1670, 1413, 1686, +1686, 1429, 1750, +1702, 1445, 1831, +1750, 1477, 1895, +1766, 1526, 1991, +1783, 1558, 2072, +1847, 1606, 2184, +1847, 1606, 2200, +2088, 1285, 819, +2072, 1285, 883, +1975, 1333, 1092, +1959, 1333, 1220, +1879, 1365, 1349, +1766, 1413, 1461, +1686, 1445, 1510, +1702, 1477, 1590, +1702, 1477, 1622, +1750, 1510, 1718, +1750, 1542, 1799, +1783, 1558, 1879, +1799, 1590, 1959, +1815, 1622, 2056, +1815, 1638, 2088, +1895, 1670, 2200, +1943, 1702, 2280, +2056, 1461, 915, +2088, 1461, 947, +2088, 1461, 1028, +2039, 1477, 1188, +1991, 1493, 1365, +1927, 1526, 1510, +1847, 1574, 1590, +1799, 1622, 1638, +1799, 1638, 1734, +1831, 1638, 1783, +1831, 1654, 1847, +1847, 1654, 1911, +1879, 1686, 2023, +1879, 1734, 2104, +1943, 1750, 2168, +2007, 1783, 2248, +2007, 1799, 2329, +2072, 1654, 1028, +2088, 1638, 1060, +2104, 1638, 1108, +2136, 1638, 1188, +2104, 1638, 1285, +2072, 1670, 1510, +1991, 1702, 1638, +1911, 1734, 1734, +1879, 1766, 1766, +1911, 1783, 1863, +1943, 1799, 1927, +1975, 1815, 1991, +1959, 1847, 2088, +1975, 1847, 2152, +2007, 1863, 2232, +2056, 1895, 2312, +2104, 1927, 2377, +2136, 1847, 1172, +2136, 1847, 1188, +2152, 1847, 1269, +2136, 1831, 1317, +2168, 1847, 1413, +2200, 1815, 1461, +2136, 1847, 1654, +2120, 1879, 1766, +2023, 1911, 1815, +2039, 1911, 1895, +2039, 1927, 1959, +2088, 1975, 2088, +2072, 1991, 2136, +2088, 2023, 2248, +2152, 2007, 2280, +2200, 2039, 2377, +2216, 2072, 2441, +2216, 2007, 1301, +2184, 2023, 1365, +2200, 2007, 1381, +2200, 2039, 1461, +2184, 2039, 1510, +2200, 2023, 1590, +2232, 2039, 1686, +2296, 2023, 1734, +2184, 2056, 1911, +2184, 2072, 1975, +2168, 2072, 2039, +2152, 2120, 2136, +2200, 2152, 2216, +2232, 2152, 2296, +2264, 2184, 2393, +2312, 2200, 2473, +2312, 2232, 2553, +2345, 2216, 1461, +2361, 2216, 1510, +2345, 2216, 1526, +2329, 2216, 1590, +2329, 2232, 1654, +2312, 2232, 1750, +2312, 2248, 1847, +2345, 2248, 1895, +2361, 2264, 1959, +2329, 2264, 2104, +2329, 2296, 2184, +2296, 2296, 2216, +2312, 2312, 2312, +2329, 2312, 2377, +2345, 2312, 2441, +2361, 2345, 2505, +2425, 2361, 2634, +2505, 2393, 1606, +2489, 2377, 1590, +2489, 2377, 1622, +2473, 2393, 1686, +2457, 2377, 1734, +2457, 2393, 1831, +2473, 2393, 1895, +2473, 2409, 2007, +2489, 2409, 2072, +2473, 2425, 2152, +2473, 2441, 2232, +2473, 2457, 2296, +2473, 2489, 2393, +2505, 2489, 2473, +2489, 2505, 2521, +2505, 2505, 2602, +2553, 2537, 2698, +2585, 2569, 1686, +2585, 2569, 1686, +2585, 2585, 1750, +2585, 2585, 1783, +2569, 2585, 1847, +2618, 2618, 1959, +2569, 2585, 2007, +2569, 2602, 2072, +2602, 2618, 2152, +2602, 2634, 2264, +2585, 2618, 2329, +2618, 2634, 2409, +2634, 2666, 2505, +2650, 2666, 2569, +2650, 2666, 2634, +2666, 2714, 2730, +2666, 2698, 2778, +2746, 2778, 1831, +2698, 2778, 1815, +2714, 2810, 1879, +2714, 2794, 1927, +2730, 2794, 1975, +2698, 2794, 2023, +2730, 2794, 2088, +2698, 2794, 2168, +2698, 2810, 2248, +2746, 2810, 2361, +2762, 2810, 2457, +2762, 2794, 2505, +2778, 2810, 2553, +2794, 2826, 2666, +2842, 2858, 2762, +2842, 2842, 2810, +2842, 2858, 2891, +2858, 2971, 1943, +2875, 2971, 1943, +2842, 2955, 1959, +2858, 2987, 2007, +2875, 2971, 2072, +2858, 2971, 2120, +2842, 2971, 2216, +2826, 2987, 2280, +2858, 2987, 2361, +2858, 2987, 2441, +2875, 2987, 2553, +2907, 3003, 2634, +2891, 3003, 2682, +2939, 3003, 2698, +2971, 3019, 2794, +2939, 3035, 2907, +3003, 3067, 3019, +2971, 3180, 2039, +3003, 3180, 2072, +3019, 3196, 2136, +2987, 3180, 2152, +2987, 3196, 2216, +3003, 3180, 2280, +2987, 3180, 2329, +3019, 3196, 2409, +3051, 3196, 2489, +3035, 3180, 2602, +3019, 3196, 2682, +3051, 3196, 2746, +3051, 3180, 2794, +3051, 3196, 2875, +3099, 3196, 2891, +3115, 3196, 2955, +3148, 3228, 3067, +3099, 3372, 2184, +3115, 3356, 2200, +3131, 3388, 2216, +3115, 3372, 2280, +3099, 3372, 2296, +3115, 3388, 2345, +3115, 3388, 2441, +3164, 3404, 2537, +3180, 3404, 2634, +3148, 3388, 2714, +3148, 3388, 2778, +3180, 3404, 2858, +3196, 3388, 2923, +3244, 3404, 3003, +3260, 3404, 3083, +3276, 3404, 3115, +3324, 3421, 3196, +3292, 3565, 2312, +3308, 3581, 2329, +3276, 3565, 2345, +3292, 3581, 2409, +3276, 3581, 2425, +3308, 3581, 2505, +3292, 3581, 2569, +3308, 3581, 2666, +3292, 3581, 2730, +3308, 3581, 2826, +3324, 3581, 2891, +3356, 3581, 2971, +3372, 3597, 3083, +3372, 3581, 3148, +3404, 3613, 3212, +3421, 3613, 3276, +3437, 3613, 3308, +2120, 1060, 867, +2104, 1060, 931, +2056, 1092, 1044, +1943, 1140, 1188, +1831, 1204, 1285, +1750, 1269, 1381, +1718, 1301, 1445, +1702, 1317, 1510, +1734, 1349, 1606, +1750, 1365, 1670, +1750, 1381, 1734, +1766, 1381, 1799, +1815, 1429, 1879, +1831, 1477, 1975, +1879, 1493, 2072, +1911, 1558, 2168, +1927, 1590, 2264, +2088, 1108, 867, +2072, 1092, 947, +2072, 1140, 1076, +1975, 1172, 1188, +1895, 1237, 1301, +1783, 1285, 1413, +1718, 1349, 1445, +1734, 1349, 1542, +1750, 1365, 1622, +1734, 1381, 1686, +1766, 1397, 1766, +1783, 1429, 1815, +1815, 1445, 1927, +1847, 1493, 1991, +1895, 1510, 2088, +1911, 1558, 2184, +1959, 1590, 2248, +2136, 1188, 899, +2120, 1204, 1012, +2104, 1188, 1076, +2023, 1237, 1237, +1927, 1269, 1333, +1831, 1333, 1461, +1750, 1381, 1477, +1766, 1397, 1558, +1750, 1397, 1606, +1783, 1445, 1686, +1799, 1445, 1766, +1815, 1477, 1831, +1847, 1510, 1943, +1879, 1542, 2007, +1895, 1558, 2120, +1959, 1590, 2184, +1991, 1622, 2248, +2168, 1253, 915, +2120, 1253, 996, +2120, 1269, 1108, +2072, 1269, 1188, +1975, 1349, 1381, +1895, 1397, 1477, +1815, 1445, 1526, +1799, 1461, 1590, +1815, 1477, 1654, +1799, 1493, 1718, +1847, 1526, 1815, +1847, 1542, 1879, +1895, 1590, 2007, +1895, 1606, 2056, +1943, 1622, 2104, +1959, 1654, 2200, +2023, 1702, 2312, +2280, 1333, 835, +2232, 1365, 947, +2168, 1381, 1108, +2152, 1397, 1204, +2088, 1445, 1381, +1991, 1461, 1477, +1911, 1542, 1590, +1847, 1558, 1638, +1895, 1590, 1718, +1879, 1606, 1799, +1895, 1622, 1831, +1911, 1622, 1911, +1927, 1654, 1975, +1991, 1670, 2072, +2023, 1702, 2200, +2039, 1750, 2232, +2088, 1783, 2329, +2329, 1493, 931, +2312, 1493, 980, +2296, 1493, 1076, +2184, 1542, 1285, +2200, 1542, 1381, +2120, 1606, 1526, +2023, 1638, 1638, +1943, 1670, 1686, +1943, 1686, 1766, +1959, 1718, 1831, +1975, 1718, 1895, +1991, 1718, 1975, +2072, 1766, 2056, +2088, 1799, 2136, +2072, 1815, 2200, +2072, 1831, 2280, +2120, 1879, 2377, +2329, 1686, 1076, +2345, 1686, 1076, +2361, 1702, 1140, +2377, 1686, 1237, +2312, 1702, 1397, +2264, 1702, 1526, +2168, 1750, 1670, +2120, 1799, 1766, +2072, 1831, 1831, +2056, 1831, 1895, +2104, 1863, 1959, +2104, 1863, 2023, +2136, 1879, 2104, +2136, 1911, 2184, +2152, 1959, 2280, +2184, 1959, 2345, +2232, 1991, 2441, +2345, 1863, 1156, +2312, 1863, 1204, +2345, 1879, 1253, +2345, 1863, 1301, +2377, 1863, 1397, +2377, 1879, 1493, +2312, 1895, 1686, +2280, 1927, 1815, +2184, 1959, 1895, +2152, 1975, 1927, +2184, 1991, 2007, +2216, 2007, 2088, +2248, 2023, 2168, +2216, 2039, 2232, +2264, 2072, 2329, +2312, 2104, 2425, +2361, 2136, 2521, +2393, 2039, 1301, +2393, 2039, 1333, +2409, 2039, 1365, +2409, 2039, 1445, +2441, 2039, 1477, +2425, 2039, 1558, +2473, 2039, 1670, +2425, 2072, 1847, +2361, 2120, 1975, +2312, 2136, 2007, +2329, 2152, 2104, +2345, 2168, 2168, +2361, 2184, 2248, +2329, 2200, 2296, +2393, 2232, 2393, +2393, 2232, 2489, +2425, 2280, 2553, +2489, 2264, 1510, +2489, 2264, 1510, +2489, 2280, 1558, +2505, 2264, 1606, +2457, 2280, 1670, +2473, 2280, 1734, +2457, 2264, 1783, +2521, 2280, 1863, +2553, 2248, 1943, +2425, 2296, 2152, +2425, 2296, 2184, +2425, 2312, 2248, +2473, 2345, 2345, +2457, 2361, 2409, +2489, 2377, 2489, +2505, 2377, 2553, +2537, 2409, 2650, +2634, 2441, 1606, +2618, 2425, 1622, +2602, 2425, 1670, +2602, 2441, 1718, +2618, 2457, 1799, +2569, 2441, 1863, +2569, 2457, 1927, +2585, 2473, 2039, +2585, 2457, 2104, +2618, 2457, 2136, +2569, 2473, 2280, +2585, 2489, 2361, +2569, 2505, 2425, +2569, 2521, 2505, +2602, 2521, 2569, +2634, 2569, 2650, +2666, 2569, 2746, +2698, 2602, 1702, +2714, 2618, 1750, +2746, 2618, 1799, +2714, 2618, 1847, +2730, 2634, 1911, +2714, 2634, 1975, +2698, 2634, 2039, +2714, 2618, 2088, +2714, 2650, 2200, +2746, 2666, 2312, +2730, 2682, 2377, +2714, 2682, 2441, +2714, 2698, 2505, +2714, 2714, 2618, +2714, 2698, 2682, +2730, 2730, 2762, +2746, 2746, 2842, +2842, 2810, 1847, +2842, 2810, 1879, +2858, 2794, 1911, +2875, 2810, 1911, +2858, 2810, 1975, +2842, 2810, 2039, +2842, 2794, 2120, +2826, 2794, 2184, +2858, 2810, 2296, +2858, 2826, 2329, +2858, 2842, 2441, +2858, 2842, 2537, +2875, 2842, 2602, +2875, 2858, 2682, +2907, 2875, 2762, +2907, 2891, 2826, +2907, 2907, 2907, +2971, 3003, 1943, +2971, 2971, 1959, +2987, 2987, 2007, +2939, 2987, 2023, +2971, 2987, 2104, +2955, 2987, 2152, +2939, 3003, 2232, +2987, 3003, 2312, +2955, 3003, 2361, +2987, 3003, 2473, +3003, 3019, 2585, +2987, 3035, 2682, +3019, 3035, 2714, +3019, 3051, 2762, +3035, 3051, 2858, +3067, 3067, 2971, +3051, 3083, 3035, +3115, 3212, 2104, +3115, 3212, 2088, +3115, 3212, 2136, +3083, 3196, 2184, +3083, 3212, 2216, +3083, 3212, 2280, +3099, 3196, 2312, +3083, 3212, 2409, +3099, 3196, 2473, +3067, 3196, 2569, +3099, 3212, 2666, +3115, 3212, 2746, +3148, 3228, 2826, +3131, 3228, 2875, +3164, 3228, 2923, +3196, 3244, 3003, +3212, 3260, 3115, +3228, 3404, 2216, +3244, 3404, 2232, +3212, 3404, 2264, +3228, 3404, 2296, +3212, 3404, 2345, +3196, 3404, 2377, +3212, 3388, 2441, +3212, 3404, 2521, +3228, 3404, 2618, +3228, 3388, 2714, +3324, 3421, 2810, +3292, 3421, 2907, +3292, 3404, 2955, +3340, 3421, 3051, +3324, 3437, 3115, +3372, 3453, 3164, +3388, 3437, 3196, +3388, 3581, 2361, +3421, 3613, 2377, +3404, 3597, 2409, +3388, 3597, 2441, +3388, 3597, 2473, +3372, 3597, 2505, +3356, 3597, 2553, +3388, 3613, 2666, +3388, 3629, 2746, +3372, 3613, 2826, +3421, 3581, 2891, +3421, 3613, 2971, +3453, 3581, 3099, +3469, 3613, 3148, +3469, 3597, 3212, +3485, 3613, 3260, +3517, 3629, 3308, +2296, 1156, 915, +2296, 1156, 1012, +2264, 1172, 1140, +2168, 1237, 1237, +2072, 1301, 1381, +1975, 1333, 1445, +1879, 1397, 1542, +1895, 1429, 1558, +1879, 1445, 1654, +1911, 1461, 1718, +1927, 1493, 1815, +1927, 1510, 1879, +1959, 1526, 1959, +1975, 1558, 2039, +2056, 1574, 2120, +2088, 1622, 2216, +2120, 1654, 2312, +2296, 1172, 931, +2296, 1188, 1012, +2280, 1188, 1124, +2184, 1253, 1285, +2072, 1301, 1381, +1991, 1365, 1445, +1911, 1413, 1526, +1895, 1445, 1574, +1911, 1461, 1654, +1911, 1493, 1750, +1943, 1510, 1831, +1943, 1526, 1911, +1959, 1574, 1991, +2007, 1574, 2039, +2056, 1606, 2104, +2072, 1622, 2216, +2120, 1670, 2280, +2312, 1253, 947, +2329, 1237, 996, +2329, 1253, 1124, +2232, 1285, 1237, +2136, 1365, 1381, +2023, 1413, 1493, +1927, 1461, 1574, +1943, 1510, 1638, +1927, 1526, 1702, +1943, 1526, 1750, +1975, 1574, 1863, +1975, 1574, 1895, +1991, 1590, 1991, +2023, 1606, 2072, +2072, 1622, 2152, +2104, 1670, 2232, +2136, 1702, 2361, +2361, 1317, 947, +2329, 1333, 1060, +2329, 1349, 1140, +2296, 1349, 1269, +2184, 1429, 1413, +2120, 1477, 1542, +2007, 1542, 1622, +1959, 1558, 1638, +1959, 1574, 1718, +1959, 1590, 1783, +1975, 1606, 1847, +1975, 1622, 1927, +2056, 1638, 2023, +2072, 1686, 2104, +2120, 1702, 2200, +2136, 1734, 2248, +2184, 1750, 2345, +2473, 1397, 915, +2425, 1445, 1060, +2361, 1445, 1172, +2345, 1445, 1285, +2296, 1477, 1397, +2200, 1542, 1510, +2088, 1590, 1622, +2023, 1654, 1702, +2023, 1654, 1750, +2039, 1654, 1815, +2056, 1686, 1911, +2088, 1702, 1991, +2120, 1750, 2056, +2152, 1766, 2136, +2152, 1783, 2200, +2200, 1815, 2296, +2168, 1847, 2377, +2537, 1558, 947, +2505, 1526, 996, +2489, 1558, 1140, +2409, 1606, 1349, +2377, 1606, 1445, +2296, 1622, 1574, +2232, 1686, 1670, +2152, 1734, 1766, +2104, 1766, 1799, +2136, 1766, 1879, +2136, 1799, 1943, +2136, 1815, 2007, +2168, 1815, 2088, +2184, 1847, 2168, +2216, 1863, 2232, +2312, 1911, 2377, +2280, 1943, 2425, +2553, 1718, 1012, +2521, 1702, 1060, +2569, 1702, 1140, +2521, 1718, 1237, +2441, 1734, 1429, +2441, 1766, 1590, +2377, 1799, 1670, +2264, 1847, 1815, +2184, 1895, 1847, +2216, 1911, 1943, +2216, 1927, 2007, +2232, 1943, 2088, +2248, 1943, 2152, +2296, 1959, 2264, +2312, 1975, 2280, +2329, 2007, 2361, +2361, 2072, 2473, +2585, 1911, 1156, +2585, 1911, 1188, +2618, 1911, 1237, +2585, 1895, 1317, +2585, 1879, 1381, +2569, 1927, 1590, +2537, 1927, 1718, +2441, 1975, 1847, +2345, 2007, 1943, +2345, 2039, 2007, +2329, 2056, 2072, +2345, 2056, 2136, +2377, 2104, 2232, +2425, 2120, 2296, +2409, 2136, 2393, +2425, 2168, 2473, +2489, 2200, 2553, +2618, 2088, 1285, +2618, 2104, 1317, +2602, 2104, 1381, +2634, 2072, 1413, +2618, 2104, 1510, +2666, 2088, 1606, +2666, 2104, 1702, +2602, 2120, 1863, +2537, 2152, 2023, +2441, 2200, 2088, +2457, 2216, 2136, +2473, 2216, 2232, +2473, 2232, 2296, +2489, 2248, 2361, +2473, 2248, 2441, +2505, 2296, 2537, +2553, 2296, 2602, +2650, 2280, 1445, +2666, 2280, 1477, +2634, 2264, 1526, +2634, 2264, 1558, +2634, 2280, 1622, +2650, 2280, 1686, +2650, 2296, 1783, +2746, 2264, 1863, +2682, 2280, 2023, +2602, 2312, 2184, +2585, 2361, 2216, +2602, 2361, 2264, +2585, 2377, 2393, +2618, 2393, 2489, +2602, 2425, 2537, +2618, 2425, 2602, +2634, 2473, 2698, +2714, 2473, 1622, +2714, 2473, 1654, +2698, 2473, 1670, +2730, 2473, 1718, +2730, 2489, 1783, +2698, 2473, 1831, +2698, 2457, 1911, +2714, 2489, 1991, +2762, 2473, 2056, +2794, 2473, 2136, +2746, 2505, 2329, +2666, 2537, 2393, +2698, 2553, 2457, +2698, 2553, 2537, +2714, 2585, 2618, +2746, 2618, 2714, +2762, 2602, 2762, +2842, 2666, 1783, +2842, 2666, 1783, +2826, 2650, 1799, +2858, 2666, 1879, +2858, 2666, 1943, +2826, 2666, 1959, +2842, 2682, 2072, +2826, 2698, 2168, +2794, 2682, 2216, +2826, 2682, 2296, +2842, 2682, 2361, +2826, 2714, 2489, +2826, 2730, 2569, +2810, 2730, 2634, +2858, 2746, 2682, +2875, 2746, 2746, +2875, 2762, 2826, +2971, 2810, 1879, +2971, 2826, 1895, +2955, 2810, 1911, +2971, 2826, 1927, +2971, 2810, 2007, +2971, 2826, 2088, +2971, 2842, 2152, +2955, 2842, 2248, +2955, 2875, 2329, +2971, 2858, 2393, +3003, 2875, 2489, +2971, 2875, 2553, +2971, 2891, 2666, +2971, 2907, 2730, +2955, 2907, 2794, +2987, 2939, 2891, +2987, 2939, 2955, +3083, 3035, 1991, +3067, 3003, 1975, +3067, 3035, 2023, +3067, 3035, 2072, +3083, 3019, 2120, +3067, 3019, 2184, +3083, 3019, 2280, +3099, 3035, 2329, +3083, 3035, 2377, +3099, 3051, 2489, +3067, 3051, 2569, +3067, 3067, 2650, +3115, 3083, 2746, +3131, 3083, 2810, +3131, 3099, 2891, +3164, 3115, 2971, +3164, 3131, 3035, +3180, 3196, 2072, +3180, 3196, 2104, +3180, 3196, 2136, +3180, 3212, 2168, +3196, 3196, 2232, +3180, 3228, 2280, +3164, 3196, 2329, +3180, 3212, 2409, +3180, 3212, 2505, +3196, 3244, 2585, +3180, 3212, 2666, +3228, 3228, 2746, +3212, 3244, 2858, +3228, 3244, 2923, +3276, 3260, 2971, +3260, 3276, 3083, +3276, 3324, 3180, +3340, 3421, 2232, +3324, 3404, 2264, +3340, 3421, 2296, +3324, 3421, 2329, +3372, 3437, 2377, +3340, 3421, 2393, +3340, 3421, 2473, +3356, 3421, 2569, +3356, 3437, 2650, +3372, 3437, 2698, +3372, 3453, 2778, +3372, 3453, 2875, +3388, 3453, 2971, +3421, 3469, 3099, +3437, 3453, 3131, +3453, 3469, 3180, +3453, 3469, 3244, +3485, 3597, 2393, +3517, 3629, 2409, +3501, 3613, 2409, +3485, 3613, 2473, +3469, 3613, 2489, +3469, 3613, 2537, +3501, 3645, 2602, +3501, 3629, 2682, +3485, 3645, 2746, +3485, 3629, 2842, +3517, 3629, 2907, +3517, 3613, 3003, +3485, 3629, 3099, +3533, 3645, 3196, +3533, 3629, 3244, +3549, 3661, 3308, +3597, 3661, 3356, +2505, 1253, 996, +2537, 1253, 1060, +2473, 1253, 1140, +2377, 1317, 1317, +2296, 1365, 1413, +2184, 1445, 1526, +2104, 1493, 1622, +2039, 1542, 1670, +2072, 1574, 1718, +2039, 1558, 1750, +2056, 1574, 1847, +2104, 1606, 1943, +2120, 1638, 2039, +2152, 1654, 2104, +2184, 1670, 2168, +2232, 1702, 2264, +2232, 1734, 2345, +2521, 1269, 980, +2505, 1301, 1076, +2505, 1285, 1156, +2393, 1333, 1301, +2312, 1381, 1429, +2200, 1461, 1542, +2120, 1510, 1638, +2056, 1574, 1654, +2072, 1574, 1718, +2104, 1590, 1799, +2104, 1606, 1863, +2136, 1622, 1959, +2152, 1654, 2056, +2168, 1686, 2104, +2200, 1702, 2200, +2232, 1734, 2248, +2264, 1750, 2329, +2521, 1333, 1012, +2521, 1349, 1108, +2505, 1349, 1188, +2457, 1381, 1317, +2377, 1429, 1429, +2264, 1477, 1526, +2136, 1542, 1606, +2088, 1606, 1686, +2056, 1606, 1734, +2120, 1638, 1831, +2136, 1638, 1895, +2136, 1638, 1959, +2168, 1670, 2072, +2200, 1702, 2104, +2232, 1718, 2184, +2248, 1766, 2312, +2264, 1783, 2361, +2537, 1397, 1028, +2537, 1413, 1092, +2521, 1413, 1172, +2521, 1429, 1317, +2425, 1493, 1445, +2296, 1542, 1574, +2232, 1590, 1670, +2152, 1638, 1734, +2136, 1670, 1783, +2168, 1686, 1879, +2184, 1718, 1943, +2184, 1718, 2007, +2232, 1750, 2088, +2216, 1750, 2152, +2232, 1783, 2232, +2280, 1815, 2329, +2345, 1815, 2377, +2634, 1477, 1012, +2585, 1510, 1092, +2553, 1542, 1220, +2569, 1526, 1349, +2489, 1558, 1461, +2393, 1622, 1606, +2312, 1654, 1686, +2232, 1702, 1766, +2200, 1750, 1815, +2200, 1766, 1895, +2216, 1766, 1959, +2216, 1783, 2023, +2248, 1815, 2088, +2280, 1831, 2168, +2296, 1863, 2248, +2361, 1879, 2345, +2409, 1911, 2441, +2698, 1590, 980, +2682, 1590, 1028, +2650, 1638, 1188, +2569, 1654, 1317, +2585, 1654, 1461, +2489, 1686, 1590, +2409, 1734, 1718, +2312, 1799, 1799, +2248, 1847, 1847, +2280, 1863, 1927, +2264, 1863, 1975, +2329, 1895, 2072, +2345, 1895, 2136, +2377, 1911, 2248, +2393, 1943, 2312, +2425, 1959, 2345, +2425, 1975, 2441, +2794, 1734, 1044, +2778, 1718, 1092, +2778, 1734, 1172, +2730, 1766, 1285, +2650, 1799, 1477, +2618, 1799, 1606, +2569, 1847, 1734, +2505, 1895, 1847, +2393, 1943, 1927, +2393, 1975, 1975, +2361, 1975, 2023, +2409, 1991, 2104, +2409, 2007, 2184, +2457, 2039, 2280, +2457, 2072, 2361, +2489, 2088, 2441, +2553, 2136, 2569, +2778, 1911, 1140, +2794, 1927, 1188, +2794, 1911, 1237, +2826, 1943, 1333, +2826, 1959, 1429, +2714, 1991, 1654, +2730, 1991, 1766, +2634, 2039, 1879, +2537, 2072, 1959, +2473, 2120, 2039, +2473, 2136, 2104, +2505, 2152, 2184, +2505, 2168, 2248, +2553, 2200, 2361, +2569, 2184, 2409, +2602, 2200, 2489, +2585, 2200, 2553, +2810, 2136, 1317, +2810, 2152, 1349, +2810, 2120, 1365, +2810, 2136, 1429, +2842, 2120, 1493, +2842, 2120, 1590, +2778, 2152, 1799, +2746, 2152, 1895, +2682, 2184, 2056, +2602, 2248, 2152, +2553, 2248, 2184, +2553, 2264, 2248, +2602, 2280, 2345, +2634, 2296, 2425, +2666, 2312, 2489, +2682, 2345, 2553, +2666, 2361, 2666, +2826, 2280, 1429, +2826, 2296, 1477, +2858, 2296, 1526, +2842, 2296, 1574, +2858, 2296, 1606, +2907, 2296, 1686, +2891, 2312, 1783, +2923, 2312, 1879, +2842, 2312, 2072, +2778, 2361, 2200, +2698, 2409, 2280, +2714, 2441, 2361, +2682, 2425, 2409, +2730, 2441, 2489, +2746, 2441, 2553, +2730, 2489, 2650, +2746, 2489, 2714, +2875, 2505, 1622, +2891, 2489, 1622, +2891, 2505, 1654, +2875, 2505, 1718, +2907, 2489, 1750, +2891, 2489, 1847, +2907, 2489, 1943, +2923, 2505, 1975, +2955, 2489, 2039, +2939, 2505, 2232, +2842, 2537, 2377, +2794, 2569, 2425, +2810, 2602, 2505, +2810, 2602, 2602, +2858, 2634, 2698, +2842, 2666, 2746, +2858, 2666, 2810, +2939, 2682, 1799, +2939, 2682, 1799, +2923, 2682, 1815, +2939, 2698, 1895, +2923, 2698, 1927, +2955, 2698, 1991, +2939, 2698, 2056, +2971, 2714, 2136, +2971, 2714, 2200, +3003, 2714, 2296, +3083, 2682, 2361, +2971, 2730, 2553, +2923, 2746, 2569, +2955, 2746, 2650, +2923, 2778, 2730, +2971, 2794, 2810, +3019, 2826, 2907, +3083, 2842, 1911, +3099, 2875, 1927, +3083, 2858, 1943, +3115, 2858, 1991, +3115, 2875, 2072, +3099, 2875, 2120, +3083, 2875, 2216, +3083, 2891, 2280, +3083, 2907, 2329, +3067, 2907, 2409, +3067, 2891, 2457, +3099, 2907, 2569, +3099, 2891, 2698, +3083, 2939, 2794, +3035, 2955, 2810, +3067, 2955, 2891, +3115, 2987, 2987, +3228, 3051, 2023, +3228, 3051, 2023, +3228, 3067, 2088, +3212, 3051, 2120, +3212, 3067, 2184, +3180, 3051, 2232, +3212, 3067, 2312, +3212, 3067, 2345, +3196, 3083, 2441, +3212, 3067, 2505, +3212, 3099, 2618, +3244, 3115, 2698, +3228, 3115, 2762, +3228, 3131, 2875, +3212, 3131, 2939, +3180, 3131, 2987, +3212, 3148, 3067, +3308, 3244, 2136, +3292, 3228, 2152, +3292, 3244, 2168, +3324, 3228, 2232, +3276, 3244, 2248, +3292, 3228, 2329, +3292, 3228, 2345, +3292, 3260, 2457, +3308, 3244, 2521, +3308, 3260, 2634, +3308, 3244, 2682, +3308, 3260, 2762, +3308, 3292, 2842, +3324, 3292, 2939, +3372, 3324, 3035, +3340, 3308, 3099, +3372, 3308, 3164, +3469, 3437, 2280, +3485, 3437, 2280, +3469, 3437, 2312, +3469, 3437, 2345, +3485, 3469, 2425, +3469, 3469, 2425, +3485, 3453, 2521, +3469, 3453, 2585, +3453, 3453, 2634, +3485, 3469, 2762, +3485, 3485, 2810, +3485, 3469, 2891, +3501, 3469, 2987, +3469, 3469, 3067, +3517, 3501, 3180, +3501, 3501, 3212, +3533, 3501, 3324, +3597, 3629, 2409, +3549, 3629, 2425, +3581, 3613, 2425, +3581, 3613, 2457, +3597, 3645, 2489, +3565, 3629, 2521, +3549, 3629, 2585, +3581, 3629, 2698, +3581, 3645, 2746, +3565, 3645, 2842, +3581, 3645, 2875, +3565, 3645, 2971, +3581, 3661, 3083, +3597, 3677, 3228, +3613, 3661, 3292, +3677, 3677, 3324, +3677, 3694, 3356, +2682, 1333, 1028, +2666, 1333, 1108, +2666, 1349, 1188, +2602, 1413, 1333, +2505, 1445, 1461, +2441, 1510, 1574, +2329, 1590, 1702, +2264, 1638, 1766, +2216, 1638, 1783, +2232, 1654, 1831, +2264, 1686, 1943, +2280, 1718, 2023, +2280, 1718, 2056, +2312, 1750, 2184, +2329, 1766, 2232, +2377, 1799, 2329, +2409, 1815, 2409, +2682, 1365, 1044, +2698, 1365, 1092, +2714, 1381, 1220, +2634, 1429, 1349, +2521, 1493, 1493, +2441, 1526, 1590, +2361, 1574, 1686, +2264, 1638, 1766, +2264, 1686, 1799, +2264, 1686, 1863, +2264, 1702, 1927, +2280, 1734, 2007, +2312, 1750, 2120, +2312, 1766, 2168, +2361, 1783, 2248, +2409, 1815, 2312, +2457, 1847, 2441, +2698, 1429, 1076, +2698, 1397, 1108, +2714, 1413, 1220, +2682, 1461, 1365, +2569, 1526, 1493, +2473, 1558, 1590, +2377, 1622, 1686, +2312, 1670, 1783, +2280, 1718, 1831, +2248, 1718, 1879, +2296, 1734, 1943, +2296, 1750, 2023, +2329, 1783, 2088, +2361, 1799, 2168, +2361, 1831, 2248, +2425, 1831, 2329, +2457, 1879, 2441, +2730, 1493, 1092, +2746, 1493, 1156, +2746, 1493, 1237, +2698, 1510, 1333, +2634, 1574, 1493, +2553, 1622, 1590, +2457, 1686, 1718, +2345, 1702, 1783, +2296, 1766, 1831, +2329, 1766, 1863, +2329, 1799, 1975, +2329, 1799, 2007, +2361, 1831, 2136, +2393, 1831, 2200, +2425, 1879, 2264, +2457, 1895, 2377, +2489, 1927, 2409, +2842, 1558, 1044, +2730, 1574, 1156, +2746, 1606, 1269, +2730, 1606, 1365, +2698, 1622, 1477, +2569, 1670, 1606, +2521, 1734, 1718, +2425, 1766, 1799, +2361, 1815, 1863, +2345, 1847, 1927, +2393, 1879, 2023, +2425, 1895, 2104, +2441, 1879, 2168, +2457, 1927, 2216, +2441, 1927, 2280, +2505, 1959, 2377, +2521, 1991, 2473, +2907, 1638, 1012, +2891, 1670, 1140, +2826, 1718, 1269, +2778, 1702, 1349, +2794, 1718, 1510, +2730, 1766, 1638, +2634, 1799, 1766, +2553, 1879, 1847, +2489, 1895, 1927, +2473, 1959, 1991, +2441, 1959, 2039, +2473, 1959, 2104, +2473, 1975, 2200, +2521, 2023, 2280, +2553, 2039, 2361, +2553, 2072, 2457, +2602, 2104, 2537, +2987, 1766, 1044, +2955, 1783, 1108, +2939, 1799, 1204, +2875, 1831, 1365, +2842, 1863, 1493, +2826, 1863, 1638, +2746, 1911, 1783, +2634, 1943, 1879, +2585, 2007, 1975, +2521, 2056, 2007, +2553, 2072, 2088, +2553, 2088, 2152, +2602, 2120, 2248, +2602, 2136, 2329, +2618, 2168, 2409, +2602, 2152, 2489, +2682, 2168, 2553, +3019, 1991, 1204, +3003, 1975, 1237, +3003, 1991, 1269, +3019, 1991, 1365, +2955, 2007, 1526, +2891, 2039, 1670, +2923, 2056, 1815, +2810, 2088, 1943, +2730, 2136, 2039, +2634, 2168, 2120, +2618, 2200, 2168, +2602, 2200, 2232, +2666, 2216, 2312, +2682, 2232, 2393, +2682, 2232, 2441, +2698, 2264, 2537, +2730, 2280, 2618, +3003, 2136, 1285, +2987, 2136, 1301, +3035, 2136, 1349, +3067, 2136, 1429, +3051, 2104, 1493, +3035, 2152, 1638, +2939, 2168, 1831, +2955, 2168, 1959, +2875, 2216, 2088, +2746, 2264, 2200, +2714, 2312, 2200, +2714, 2329, 2280, +2746, 2345, 2361, +2746, 2361, 2473, +2794, 2377, 2521, +2762, 2377, 2602, +2794, 2409, 2698, +3051, 2345, 1461, +3035, 2345, 1477, +3067, 2345, 1526, +3067, 2345, 1558, +3051, 2345, 1606, +3051, 2329, 1686, +3067, 2312, 1783, +3019, 2345, 1991, +3003, 2345, 2072, +2939, 2393, 2216, +2858, 2457, 2345, +2810, 2457, 2361, +2826, 2489, 2457, +2842, 2505, 2537, +2858, 2521, 2618, +2891, 2521, 2682, +2907, 2569, 2778, +3083, 2553, 1622, +3067, 2537, 1638, +3051, 2521, 1622, +3067, 2521, 1686, +3083, 2537, 1766, +3099, 2537, 1831, +3115, 2537, 1927, +3180, 2537, 1991, +3148, 2521, 2056, +3083, 2553, 2264, +3035, 2602, 2441, +2955, 2634, 2473, +2955, 2650, 2505, +2939, 2666, 2602, +2955, 2666, 2714, +2971, 2682, 2730, +2987, 2698, 2875, +3148, 2714, 1783, +3131, 2714, 1799, +3131, 2714, 1831, +3115, 2714, 1863, +3099, 2714, 1911, +3131, 2714, 1959, +3131, 2714, 2023, +3148, 2714, 2088, +3212, 2714, 2200, +3212, 2698, 2248, +3164, 2730, 2457, +3115, 2762, 2569, +3067, 2794, 2618, +3067, 2810, 2698, +3099, 2826, 2778, +3099, 2826, 2842, +3099, 2858, 2923, +3212, 2891, 1911, +3180, 2907, 1943, +3212, 2907, 1975, +3164, 2907, 1991, +3196, 2907, 2072, +3196, 2923, 2136, +3180, 2907, 2200, +3180, 2907, 2248, +3228, 2907, 2296, +3212, 2907, 2361, +3276, 2923, 2473, +3276, 2907, 2537, +3228, 2939, 2698, +3180, 2987, 2778, +3196, 2987, 2891, +3164, 3019, 2955, +3212, 3035, 3051, +3356, 3099, 2056, +3324, 3083, 2072, +3340, 3099, 2104, +3356, 3115, 2152, +3340, 3115, 2216, +3340, 3099, 2280, +3340, 3099, 2296, +3340, 3131, 2425, +3324, 3115, 2473, +3292, 3115, 2553, +3292, 3131, 2634, +3292, 3115, 2682, +3324, 3115, 2762, +3292, 3115, 2875, +3292, 3148, 2955, +3292, 3196, 3035, +3308, 3180, 3083, +3421, 3276, 2152, +3421, 3276, 2184, +3453, 3260, 2216, +3437, 3276, 2248, +3404, 3276, 2312, +3437, 3292, 2361, +3421, 3292, 2425, +3404, 3292, 2489, +3453, 3308, 2585, +3437, 3324, 2682, +3453, 3308, 2778, +3453, 3324, 2810, +3453, 3308, 2891, +3453, 3324, 2971, +3485, 3340, 3083, +3485, 3372, 3164, +3453, 3356, 3228, +3597, 3469, 2329, +3581, 3469, 2329, +3597, 3485, 2377, +3581, 3469, 2393, +3581, 3485, 2425, +3581, 3485, 2473, +3549, 3469, 2521, +3565, 3469, 2618, +3565, 3453, 2682, +3581, 3469, 2746, +3597, 3469, 2826, +3597, 3501, 2907, +3613, 3501, 3019, +3581, 3517, 3067, +3597, 3517, 3180, +3613, 3517, 3244, +3629, 3549, 3340, +3677, 3661, 2425, +3677, 3661, 2457, +3677, 3661, 2441, +3694, 3645, 2473, +3694, 3645, 2505, +3677, 3645, 2537, +3694, 3677, 2634, +3710, 3677, 2730, +3677, 3661, 2778, +3710, 3677, 2907, +3694, 3677, 2923, +3710, 3677, 3019, +3710, 3694, 3115, +3726, 3694, 3212, +3694, 3694, 3308, +3758, 3726, 3404, +3806, 3758, 3517, +2923, 1445, 1108, +2907, 1429, 1156, +2907, 1445, 1285, +2842, 1477, 1381, +2730, 1526, 1510, +2634, 1590, 1606, +2553, 1638, 1718, +2441, 1686, 1799, +2409, 1766, 1847, +2409, 1783, 1911, +2441, 1783, 1975, +2473, 1799, 2056, +2473, 1815, 2120, +2489, 1847, 2216, +2521, 1863, 2280, +2553, 1895, 2361, +2553, 1927, 2441, +2923, 1429, 1076, +2923, 1445, 1156, +2907, 1445, 1237, +2842, 1461, 1349, +2778, 1526, 1493, +2650, 1606, 1622, +2585, 1654, 1718, +2489, 1718, 1783, +2409, 1766, 1831, +2425, 1783, 1911, +2425, 1815, 1991, +2457, 1815, 2072, +2489, 1831, 2152, +2489, 1847, 2216, +2537, 1879, 2329, +2553, 1895, 2361, +2569, 1943, 2441, +2939, 1477, 1108, +2923, 1477, 1188, +2907, 1477, 1269, +2875, 1493, 1365, +2794, 1574, 1526, +2714, 1622, 1638, +2602, 1702, 1734, +2521, 1750, 1815, +2441, 1799, 1863, +2409, 1815, 1927, +2489, 1831, 2023, +2489, 1847, 2104, +2489, 1879, 2168, +2537, 1879, 2216, +2537, 1911, 2296, +2569, 1943, 2393, +2602, 1959, 2473, +2955, 1558, 1156, +2939, 1558, 1204, +2923, 1558, 1285, +2923, 1574, 1397, +2858, 1638, 1526, +2778, 1670, 1622, +2666, 1734, 1766, +2602, 1783, 1831, +2537, 1847, 1927, +2505, 1863, 1959, +2521, 1879, 2007, +2537, 1911, 2088, +2505, 1911, 2136, +2553, 1927, 2264, +2553, 1943, 2296, +2634, 2007, 2425, +2650, 2039, 2521, +2987, 1654, 1172, +2987, 1654, 1204, +2971, 1654, 1253, +2971, 1670, 1381, +2907, 1702, 1526, +2826, 1750, 1686, +2762, 1799, 1750, +2682, 1863, 1879, +2553, 1895, 1943, +2537, 1911, 1975, +2553, 1943, 2072, +2569, 1975, 2136, +2569, 2007, 2232, +2618, 2023, 2312, +2618, 2039, 2393, +2666, 2056, 2473, +2666, 2088, 2553, +3099, 1702, 1092, +3035, 1766, 1220, +3003, 1783, 1333, +2987, 1783, 1413, +2971, 1783, 1526, +2907, 1815, 1670, +2826, 1863, 1783, +2762, 1959, 1927, +2682, 2007, 1991, +2618, 2039, 2023, +2634, 2056, 2104, +2650, 2072, 2184, +2650, 2088, 2248, +2666, 2088, 2312, +2682, 2120, 2393, +2714, 2136, 2505, +2746, 2152, 2569, +3228, 1847, 1124, +3164, 1847, 1156, +3180, 1879, 1269, +3083, 1927, 1445, +3067, 1927, 1590, +3051, 1927, 1702, +2939, 1975, 1831, +2875, 2039, 1959, +2778, 2088, 2056, +2714, 2136, 2120, +2682, 2152, 2152, +2666, 2152, 2200, +2746, 2184, 2345, +2730, 2168, 2361, +2762, 2200, 2473, +2778, 2232, 2569, +2794, 2248, 2618, +3260, 2007, 1172, +3244, 2007, 1204, +3228, 2007, 1285, +3196, 2007, 1365, +3115, 2056, 1590, +3083, 2039, 1686, +3099, 2072, 1815, +2987, 2104, 1959, +2923, 2168, 2088, +2826, 2200, 2168, +2778, 2264, 2232, +2810, 2264, 2264, +2778, 2264, 2361, +2794, 2296, 2441, +2810, 2312, 2553, +2842, 2345, 2602, +2858, 2345, 2698, +3244, 2168, 1285, +3228, 2168, 1317, +3260, 2168, 1349, +3228, 2152, 1429, +3244, 2168, 1542, +3212, 2200, 1702, +3131, 2232, 1879, +3099, 2232, 2007, +3051, 2280, 2152, +2955, 2345, 2248, +2858, 2377, 2296, +2842, 2377, 2312, +2858, 2393, 2409, +2891, 2409, 2521, +2891, 2425, 2553, +2923, 2457, 2682, +2939, 2473, 2730, +3228, 2377, 1461, +3244, 2393, 1510, +3228, 2377, 1493, +3276, 2361, 1526, +3276, 2361, 1606, +3292, 2361, 1686, +3276, 2361, 1815, +3196, 2409, 2023, +3196, 2425, 2168, +3099, 2473, 2312, +2987, 2489, 2377, +2939, 2537, 2425, +2955, 2553, 2505, +2971, 2553, 2585, +2971, 2585, 2666, +3003, 2585, 2730, +3019, 2618, 2826, +3260, 2569, 1590, +3260, 2569, 1622, +3260, 2569, 1654, +3244, 2569, 1718, +3260, 2569, 1766, +3308, 2537, 1799, +3292, 2537, 1895, +3324, 2553, 1975, +3260, 2569, 2152, +3244, 2585, 2345, +3164, 2634, 2441, +3131, 2666, 2537, +3067, 2698, 2585, +3099, 2698, 2650, +3099, 2714, 2730, +3115, 2714, 2794, +3115, 2730, 2875, +3292, 2746, 1766, +3324, 2746, 1783, +3324, 2746, 1815, +3308, 2746, 1879, +3308, 2746, 1911, +3324, 2730, 1927, +3324, 2746, 2039, +3356, 2746, 2104, +3404, 2746, 2184, +3388, 2762, 2312, +3356, 2762, 2457, +3292, 2810, 2618, +3196, 2842, 2682, +3196, 2842, 2714, +3180, 2858, 2794, +3228, 2891, 2907, +3228, 2907, 2955, +3372, 2939, 1927, +3388, 2939, 1927, +3372, 2939, 1959, +3372, 2939, 2023, +3388, 2955, 2072, +3372, 2955, 2120, +3356, 2923, 2200, +3388, 2939, 2248, +3404, 2955, 2312, +3404, 2939, 2377, +3469, 2939, 2457, +3404, 2971, 2682, +3372, 3003, 2778, +3324, 3035, 2826, +3324, 3051, 2907, +3372, 3083, 3003, +3340, 3067, 3051, +3404, 3115, 2072, +3404, 3115, 2072, +3404, 3115, 2104, +3404, 3115, 2136, +3404, 3131, 2216, +3421, 3131, 2280, +3404, 3115, 2296, +3388, 3115, 2361, +3404, 3115, 2425, +3404, 3131, 2537, +3437, 3131, 2618, +3453, 3131, 2682, +3517, 3131, 2714, +3421, 3180, 2955, +3404, 3212, 3003, +3437, 3212, 3067, +3437, 3228, 3148, +3565, 3308, 2216, +3597, 3324, 2232, +3581, 3308, 2248, +3565, 3308, 2280, +3565, 3324, 2345, +3565, 3324, 2393, +3581, 3324, 2457, +3581, 3324, 2521, +3549, 3324, 2618, +3533, 3324, 2666, +3565, 3340, 2762, +3581, 3356, 2842, +3581, 3356, 2891, +3613, 3356, 3003, +3597, 3372, 3148, +3597, 3404, 3228, +3581, 3421, 3276, +3694, 3485, 2329, +3694, 3485, 2361, +3694, 3485, 2361, +3694, 3501, 2409, +3710, 3501, 2489, +3710, 3501, 2489, +3710, 3501, 2553, +3694, 3501, 2650, +3677, 3517, 2714, +3694, 3517, 2778, +3677, 3517, 2875, +3710, 3517, 2955, +3694, 3533, 3019, +3710, 3533, 3131, +3710, 3549, 3196, +3694, 3549, 3260, +3710, 3581, 3356, +3838, 3694, 2473, +3806, 3677, 2457, +3822, 3677, 2505, +3822, 3694, 2553, +3806, 3694, 2569, +3790, 3677, 2602, +3790, 3694, 2666, +3806, 3677, 2730, +3790, 3694, 2842, +3790, 3710, 2907, +3838, 3742, 3003, +3854, 3774, 3131, +3854, 3758, 3196, +3854, 3790, 3340, +3822, 3774, 3388, +3838, 3790, 3533, +3854, 3806, 3645, +3115, 1526, 1172, +3099, 1526, 1253, +3099, 1542, 1285, +3067, 1542, 1413, +2971, 1590, 1542, +2891, 1670, 1670, +2794, 1750, 1783, +2730, 1799, 1847, +2650, 1831, 1943, +2618, 1879, 1991, +2602, 1879, 2039, +2618, 1879, 2104, +2634, 1911, 2184, +2650, 1959, 2280, +2666, 1991, 2361, +2698, 1991, 2441, +2746, 2056, 2553, +3099, 1558, 1172, +3115, 1542, 1204, +3099, 1542, 1285, +3083, 1574, 1445, +2971, 1622, 1558, +2891, 1670, 1670, +2826, 1766, 1783, +2746, 1815, 1863, +2634, 1863, 1959, +2618, 1879, 1959, +2585, 1879, 2023, +2602, 1911, 2120, +2634, 1911, 2184, +2666, 1959, 2280, +2698, 2007, 2393, +2730, 2023, 2473, +2730, 2039, 2553, +3131, 1590, 1172, +3148, 1590, 1220, +3115, 1574, 1301, +3067, 1590, 1413, +3019, 1654, 1574, +2955, 1718, 1686, +2842, 1783, 1799, +2746, 1815, 1879, +2650, 1879, 1943, +2618, 1911, 1975, +2650, 1927, 2056, +2666, 1959, 2136, +2682, 1991, 2248, +2666, 1991, 2312, +2714, 2023, 2409, +2730, 2056, 2489, +2762, 2072, 2569, +3131, 1638, 1172, +3115, 1638, 1253, +3131, 1654, 1317, +3115, 1622, 1413, +3035, 1670, 1542, +2987, 1734, 1654, +2875, 1815, 1799, +2810, 1863, 1895, +2730, 1943, 1975, +2682, 1975, 2007, +2682, 1991, 2072, +2698, 2007, 2152, +2682, 2023, 2216, +2730, 2056, 2345, +2762, 2088, 2409, +2794, 2088, 2473, +2810, 2088, 2537, +3148, 1718, 1237, +3180, 1750, 1301, +3164, 1750, 1349, +3180, 1750, 1477, +3180, 1750, 1574, +3051, 1831, 1702, +2987, 1895, 1863, +2875, 1943, 1927, +2778, 1991, 1991, +2714, 2072, 2072, +2730, 2072, 2152, +2730, 2072, 2200, +2762, 2104, 2296, +2794, 2104, 2361, +2794, 2120, 2441, +2810, 2120, 2505, +2826, 2152, 2585, +3324, 1799, 1204, +3276, 1831, 1285, +3228, 1831, 1365, +3228, 1847, 1477, +3212, 1847, 1590, +3148, 1879, 1734, +3083, 1943, 1831, +2955, 2023, 1975, +2907, 2056, 2072, +2794, 2120, 2136, +2762, 2120, 2152, +2810, 2136, 2248, +2794, 2152, 2312, +2826, 2152, 2377, +2842, 2200, 2473, +2842, 2200, 2537, +2891, 2232, 2634, +3404, 1895, 1188, +3372, 1895, 1204, +3324, 1943, 1349, +3228, 1991, 1526, +3228, 1991, 1654, +3212, 1991, 1734, +3148, 2023, 1847, +3067, 2072, 1991, +2987, 2136, 2088, +2891, 2200, 2184, +2842, 2216, 2216, +2858, 2232, 2296, +2858, 2248, 2361, +2858, 2248, 2425, +2907, 2280, 2553, +2907, 2296, 2618, +2907, 2329, 2666, +3437, 2056, 1204, +3421, 2039, 1253, +3388, 2056, 1317, +3372, 2056, 1397, +3276, 2120, 1638, +3260, 2120, 1766, +3244, 2136, 1911, +3164, 2184, 2039, +3067, 2232, 2152, +3019, 2296, 2232, +2907, 2312, 2280, +2923, 2345, 2329, +2923, 2361, 2393, +2939, 2361, 2489, +2955, 2377, 2553, +2955, 2409, 2618, +3003, 2441, 2746, +3404, 2200, 1301, +3469, 2216, 1365, +3453, 2216, 1397, +3437, 2200, 1461, +3421, 2232, 1574, +3340, 2248, 1734, +3292, 2280, 1927, +3308, 2296, 2056, +3228, 2312, 2136, +3099, 2377, 2280, +3019, 2425, 2345, +2987, 2473, 2409, +3003, 2457, 2489, +3035, 2505, 2569, +3035, 2521, 2634, +3051, 2537, 2746, +3051, 2537, 2778, +3437, 2393, 1445, +3469, 2409, 1461, +3469, 2409, 1493, +3485, 2409, 1574, +3469, 2393, 1622, +3469, 2409, 1750, +3437, 2409, 1895, +3388, 2457, 2088, +3340, 2457, 2200, +3292, 2521, 2345, +3164, 2553, 2457, +3083, 2585, 2473, +3099, 2602, 2521, +3099, 2618, 2602, +3115, 2634, 2714, +3164, 2650, 2762, +3164, 2650, 2891, +3469, 2585, 1590, +3469, 2585, 1606, +3453, 2585, 1654, +3485, 2569, 1686, +3469, 2569, 1750, +3533, 2569, 1847, +3549, 2553, 1927, +3501, 2569, 2007, +3421, 2602, 2216, +3437, 2602, 2345, +3340, 2666, 2489, +3260, 2714, 2585, +3212, 2746, 2634, +3212, 2762, 2698, +3228, 2762, 2762, +3244, 2794, 2858, +3260, 2778, 2907, +3485, 2778, 1750, +3485, 2778, 1799, +3469, 2762, 1815, +3469, 2778, 1847, +3485, 2762, 1895, +3533, 2778, 1959, +3517, 2746, 1991, +3565, 2762, 2088, +3565, 2746, 2168, +3549, 2778, 2345, +3517, 2794, 2505, +3421, 2810, 2634, +3356, 2875, 2714, +3308, 2907, 2762, +3324, 2923, 2875, +3324, 2939, 2939, +3356, 2939, 3019, +3533, 2971, 1895, +3533, 3003, 1943, +3549, 2987, 1927, +3533, 2971, 1991, +3581, 2987, 2039, +3581, 2955, 2088, +3549, 2987, 2184, +3565, 2987, 2264, +3613, 2971, 2329, +3645, 2971, 2361, +3645, 2987, 2505, +3581, 3019, 2730, +3533, 3035, 2810, +3404, 3067, 2875, +3404, 3051, 2923, +3404, 3067, 2971, +3437, 3083, 3083, +3581, 3164, 2056, +3565, 3148, 2072, +3565, 3164, 2120, +3581, 3131, 2136, +3549, 3148, 2216, +3581, 3148, 2248, +3581, 3164, 2329, +3597, 3164, 2377, +3597, 3180, 2457, +3613, 3164, 2521, +3645, 3164, 2602, +3661, 3164, 2698, +3645, 3180, 2858, +3597, 3228, 3003, +3549, 3260, 3051, +3549, 3260, 3115, +3565, 3276, 3196, +3710, 3356, 2248, +3694, 3340, 2280, +3694, 3340, 2280, +3694, 3372, 2361, +3710, 3372, 2393, +3694, 3372, 2425, +3677, 3372, 2489, +3694, 3356, 2537, +3694, 3372, 2618, +3694, 3388, 2682, +3694, 3372, 2794, +3742, 3388, 2826, +3758, 3388, 2907, +3790, 3372, 3003, +3710, 3404, 3196, +3677, 3437, 3244, +3710, 3437, 3308, +3854, 3533, 2409, +3854, 3533, 2409, +3806, 3517, 2393, +3854, 3533, 2473, +3806, 3549, 2505, +3822, 3533, 2537, +3822, 3549, 2602, +3806, 3533, 2666, +3822, 3533, 2730, +3790, 3533, 2810, +3806, 3549, 2858, +3790, 3549, 2955, +3790, 3581, 3051, +3806, 3581, 3148, +3822, 3581, 3212, +3822, 3597, 3324, +3806, 3597, 3388, +3983, 3758, 2553, +3983, 3774, 2602, +3950, 3758, 2618, +3967, 3774, 2634, +3967, 3774, 2698, +3950, 3774, 2762, +3934, 3758, 2746, +3950, 3758, 2891, +3934, 3758, 2955, +3918, 3774, 3019, +3950, 3774, 3131, +3934, 3790, 3196, +3950, 3806, 3340, +3934, 3790, 3404, +3950, 3854, 3613, +3918, 3854, 3661, +3902, 3870, 3806] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_clt_32_LUT.azasset b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_clt_32_LUT.azasset new file mode 100644 index 0000000000..92f5a49363 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_clt_32_LUT.azasset @@ -0,0 +1,32777 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1084, +0, 0, 1291, +0, 0, 1472, +0, 0, 1634, +361, 0, 1771, +1145, 0, 1881, +1561, 0, 2006, +1561, 0, 2154, +432, 987, 2341, +1228, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 54, +0, 0, 173, +0, 0, 295, +0, 0, 419, +0, 0, 545, +0, 0, 673, +0, 0, 802, +0, 0, 932, +0, 0, 1087, +0, 0, 1293, +0, 0, 1473, +0, 0, 1635, +370, 0, 1772, +1144, 0, 1882, +1559, 0, 2006, +1558, 0, 2154, +428, 992, 2341, +1232, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 87, +0, 0, 198, +0, 0, 315, +0, 0, 434, +0, 0, 557, +0, 0, 682, +0, 0, 809, +0, 0, 937, +0, 0, 1091, +0, 0, 1295, +0, 0, 1474, +0, 0, 1635, +381, 0, 1773, +1143, 0, 1883, +1556, 0, 2007, +1554, 0, 2155, +423, 998, 2341, +1238, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 31, +0, 0, 127, +0, 0, 230, +0, 0, 340, +0, 0, 454, +0, 0, 572, +0, 0, 693, +0, 0, 817, +0, 0, 943, +0, 0, 1095, +0, 0, 1298, +0, 0, 1476, +0, 0, 1636, +395, 0, 1774, +1142, 0, 1883, +1552, 0, 2008, +1548, 0, 2156, +416, 1005, 2342, +1246, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 31, +0, 0, 176, +0, 0, 270, +0, 0, 371, +0, 0, 478, +0, 0, 591, +0, 0, 708, +0, 0, 828, +0, 0, 952, +0, 0, 1101, +0, 0, 1302, +0, 0, 1479, +0, 0, 1637, +414, 0, 1775, +1140, 0, 1884, +1547, 0, 2010, +1540, 58, 2158, +407, 1015, 2342, +1257, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 31, +0, 7, 176, +0, 63, 318, +0, 63, 410, +0, 63, 509, +0, 63, 615, +0, 63, 727, +0, 63, 843, +0, 63, 963, +0, 103, 1109, +0, 30, 1307, +0, 30, 1482, +0, 3, 1639, +438, 0, 1777, +1137, 0, 1886, +1539, 0, 2011, +1530, 197, 2160, +394, 1028, 2343, +1270, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 23, 0, +0, 47, 0, +0, 77, 31, +0, 114, 176, +0, 159, 318, +0, 214, 457, +0, 214, 548, +0, 214, 646, +0, 214, 751, +0, 214, 862, +0, 214, 977, +0, 243, 1120, +0, 163, 1314, +0, 163, 1487, +0, 142, 1641, +468, 0, 1779, +1134, 0, 1888, +1530, 32, 2014, +1515, 333, 2163, +376, 1045, 2344, +1287, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 157, 0, +0, 175, 0, +0, 198, 31, +0, 227, 176, +0, 262, 318, +0, 306, 457, +0, 359, 595, +0, 359, 684, +0, 359, 782, +0, 359, 886, +0, 359, 996, +0, 380, 1134, +0, 295, 1323, +0, 295, 1494, +0, 280, 1644, +506, 122, 1783, +1129, 0, 1891, +1516, 164, 2017, +1495, 469, 2167, +352, 1066, 2345, +1309, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 291, 0, +0, 304, 0, +0, 322, 31, +0, 344, 176, +0, 371, 318, +0, 406, 457, +0, 449, 595, +0, 501, 730, +0, 501, 819, +0, 501, 916, +0, 501, 1020, +0, 516, 1151, +0, 426, 1335, +0, 426, 1502, +0, 415, 1648, +552, 265, 1787, +1123, 111, 1894, +1498, 296, 2021, +1467, 603, 2172, +317, 1093, 2347, +1348, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 424, 0, +0, 434, 0, +0, 447, 31, +0, 464, 176, +0, 486, 318, +0, 513, 457, +0, 547, 595, +0, 589, 730, +0, 640, 865, +0, 640, 954, +0, 640, 1050, +0, 651, 1174, +0, 570, 1350, +0, 559, 1512, +0, 550, 1653, +556, 441, 1791, +1115, 244, 1898, +1471, 428, 2027, +1426, 737, 2178, +265, 1128, 2349, +1396, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 557, 0, +0, 565, 0, +0, 575, 31, +0, 587, 176, +0, 604, 318, +0, 625, 457, +0, 652, 595, +0, 686, 730, +0, 727, 865, +0, 777, 1000, +0, 777, 1088, +0, 786, 1203, +0, 726, 1370, +0, 691, 1526, +0, 685, 1662, +556, 606, 1796, +1132, 422, 1904, +1434, 560, 2035, +1365, 871, 2187, +186, 1169, 2352, +1454, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 690, 0, +0, 696, 0, +0, 703, 31, +0, 713, 176, +0, 726, 318, +0, 742, 457, +0, 763, 595, +0, 789, 730, +0, 823, 865, +0, 864, 1000, +0, 913, 1133, +0, 920, 1239, +0, 876, 1395, +0, 823, 1544, +0, 818, 1675, +556, 761, 1803, +1160, 593, 1912, +1378, 692, 2045, +1267, 1004, 2199, +0, 1212, 2357, +1520, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 857, 100, +0, 857, 131, +0, 861, 202, +0, 866, 282, +0, 873, 371, +0, 882, 468, +0, 894, 573, +0, 909, 683, +0, 928, 797, +0, 953, 916, +0, 984, 1038, +0, 1023, 1162, +0, 1061, 1287, +0, 1030, 1430, +0, 984, 1569, +0, 971, 1697, +566, 941, 1817, +1178, 799, 1926, +1302, 849, 2057, +1119, 1137, 2212, +0, 1255, 2365, +1585, 801, 2470, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +0, 1184, 1027, +0, 1184, 1031, +0, 1184, 1036, +0, 1184, 1043, +0, 1184, 1052, +0, 1184, 1064, +0, 1184, 1080, +0, 1184, 1099, +0, 1184, 1125, +0, 1190, 1168, +0, 1209, 1242, +0, 1232, 1325, +0, 1257, 1416, +0, 1237, 1493, +0, 1209, 1617, +0, 1222, 1740, +636, 1187, 1854, +1040, 1131, 1961, +1243, 1131, 2080, +1031, 1271, 2224, +472, 1312, 2372, +1588, 1032, 2472, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +0, 1421, 1377, +0, 1421, 1379, +0, 1421, 1382, +0, 1421, 1385, +0, 1421, 1389, +0, 1421, 1395, +0, 1421, 1402, +0, 1421, 1412, +0, 1421, 1425, +0, 1421, 1442, +0, 1421, 1463, +0, 1421, 1491, +0, 1432, 1546, +0, 1418, 1604, +0, 1399, 1673, +0, 1412, 1786, +636, 1404, 1895, +1048, 1353, 1999, +1151, 1350, 2110, +878, 1405, 2240, +666, 1388, 2378, +1601, 1209, 2473, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +901, 1580, 1648, +901, 1579, 1649, +901, 1579, 1650, +901, 1579, 1652, +901, 1578, 1655, +901, 1577, 1658, +901, 1576, 1662, +901, 1574, 1668, +901, 1572, 1675, +901, 1569, 1685, +901, 1567, 1698, +901, 1567, 1714, +886, 1567, 1736, +886, 1577, 1788, +886, 1569, 1838, +890, 1552, 1888, +807, 1557, 1969, +921, 1536, 2067, +942, 1537, 2170, +810, 1524, 2268, +1125, 1501, 2382, +1680, 1435, 2473, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1449, 1705, 1856, +1448, 1705, 1856, +1447, 1705, 1857, +1446, 1705, 1859, +1444, 1705, 1860, +1441, 1705, 1862, +1438, 1705, 1865, +1433, 1705, 1868, +1427, 1705, 1873, +1426, 1703, 1880, +1426, 1700, 1888, +1426, 1696, 1899, +1423, 1691, 1913, +1400, 1685, 1931, +1400, 1696, 1976, +1370, 1702, 2022, +1371, 1685, 2062, +1192, 1672, 2128, +1127, 1678, 2221, +1173, 1647, 2295, +1519, 1631, 2386, +1775, 1634, 2475, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1785, 1818, 1978, +1786, 1818, 1978, +1786, 1818, 1979, +1786, 1818, 1980, +1786, 1818, 1981, +1787, 1818, 1982, +1788, 1818, 1983, +1789, 1818, 1986, +1790, 1818, 1988, +1792, 1818, 1992, +1788, 1818, 1998, +1781, 1818, 2007, +1772, 1818, 2018, +1752, 1824, 2037, +1733, 1818, 2052, +1727, 1802, 2080, +1685, 1816, 2123, +1705, 1809, 2166, +1657, 1793, 2234, +1664, 1793, 2304, +1754, 1797, 2389, +1874, 1790, 2475, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1958, 1958, 2028, +1957, 1958, 2029, +1957, 1958, 2029, +1957, 1958, 2030, +1956, 1958, 2031, +1956, 1958, 2031, +1956, 1958, 2033, +1955, 1958, 2035, +1954, 1958, 2037, +1953, 1958, 2041, +1951, 1958, 2045, +1948, 1958, 2051, +1946, 1958, 2058, +1941, 1962, 2068, +1935, 1968, 2081, +1927, 1969, 2115, +1913, 1965, 2153, +1905, 1963, 2189, +1920, 1969, 2243, +1881, 1969, 2320, +1929, 1954, 2391, +2032, 1964, 2481, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2119, 2119, 2068, +2119, 2119, 2068, +2119, 2119, 2068, +2119, 2120, 2069, +2119, 2120, 2069, +2119, 2120, 2071, +2119, 2120, 2072, +2119, 2121, 2073, +2119, 2122, 2076, +2119, 2122, 2079, +2119, 2124, 2083, +2119, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2115, 2131, 2133, +2108, 2133, 2164, +2103, 2131, 2206, +2110, 2135, 2256, +2119, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2369, 2356, 2125, +2369, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2367, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2368, 2358, 2163, +2370, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2383, 2356, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2654, 1964, +2681, 2654, 1965, +2681, 2654, 1966, +2681, 2654, 1968, +2681, 2654, 1967, +2681, 2654, 1965, +2680, 2653, 1964, +2680, 2653, 1961, +2679, 2652, 1961, +2678, 2653, 1968, +2677, 2654, 1989, +2676, 2653, 2013, +2675, 2649, 2032, +2677, 2655, 2124, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2667, 2410, +2715, 2678, 2527, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1088, +0, 0, 1293, +0, 0, 1473, +0, 0, 1634, +398, 0, 1772, +1148, 0, 1882, +1561, 0, 2006, +1560, 0, 2154, +428, 987, 2341, +1231, 619, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 36, +0, 0, 159, +0, 0, 285, +0, 0, 412, +0, 0, 540, +0, 0, 669, +0, 0, 799, +0, 0, 930, +0, 0, 1089, +0, 0, 1294, +0, 0, 1474, +0, 0, 1635, +378, 0, 1771, +1147, 0, 1882, +1561, 0, 2006, +1559, 0, 2154, +428, 992, 2341, +1235, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 71, +0, 0, 186, +0, 0, 305, +0, 0, 427, +0, 0, 551, +0, 0, 678, +0, 0, 805, +0, 0, 935, +0, 0, 1092, +0, 0, 1296, +0, 0, 1475, +0, 0, 1635, +389, 0, 1772, +1146, 0, 1883, +1558, 0, 2007, +1555, 0, 2155, +423, 998, 2341, +1241, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 13, +0, 0, 112, +0, 0, 219, +0, 0, 330, +0, 0, 446, +0, 0, 566, +0, 0, 689, +0, 0, 814, +0, 0, 941, +0, 0, 1097, +0, 0, 1299, +0, 0, 1477, +0, 0, 1636, +403, 0, 1773, +1145, 0, 1884, +1554, 0, 2008, +1549, 0, 2156, +416, 1005, 2342, +1249, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 13, +0, 0, 163, +0, 0, 259, +0, 0, 363, +0, 0, 472, +0, 0, 586, +0, 0, 704, +0, 0, 825, +0, 0, 949, +0, 0, 1103, +0, 0, 1303, +0, 0, 1480, +0, 0, 1637, +422, 0, 1775, +1143, 0, 1884, +1548, 0, 2010, +1541, 50, 2158, +407, 1015, 2342, +1259, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 13, +0, 0, 163, +0, 38, 309, +0, 38, 402, +0, 38, 503, +0, 38, 610, +0, 38, 723, +0, 38, 840, +0, 38, 961, +0, 102, 1111, +0, 30, 1308, +0, 30, 1483, +0, 0, 1639, +445, 0, 1776, +1140, 0, 1886, +1541, 0, 2011, +1531, 190, 2160, +394, 1028, 2343, +1272, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 20, 0, +0, 52, 13, +0, 91, 163, +0, 139, 309, +0, 195, 450, +0, 195, 542, +0, 195, 641, +0, 195, 748, +0, 195, 859, +0, 195, 975, +0, 242, 1121, +0, 163, 1315, +0, 163, 1488, +0, 135, 1641, +475, 0, 1779, +1137, 0, 1888, +1532, 32, 2014, +1516, 329, 2163, +376, 1045, 2344, +1289, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 155, 0, +0, 179, 13, +0, 209, 163, +0, 246, 309, +0, 291, 450, +0, 346, 589, +0, 346, 680, +0, 346, 778, +0, 346, 883, +0, 346, 994, +0, 380, 1135, +0, 295, 1324, +0, 295, 1494, +0, 274, 1644, +512, 108, 1782, +1133, 0, 1891, +1518, 164, 2017, +1496, 465, 2167, +352, 1066, 2345, +1311, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 289, 0, +0, 307, 13, +0, 330, 163, +0, 359, 309, +0, 394, 450, +0, 438, 589, +0, 491, 727, +0, 491, 816, +0, 491, 914, +0, 491, 1018, +0, 516, 1153, +0, 426, 1336, +0, 426, 1502, +0, 412, 1648, +557, 254, 1787, +1126, 111, 1894, +1500, 296, 2021, +1468, 601, 2172, +317, 1093, 2347, +1350, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 423, 0, +0, 437, 13, +0, 454, 163, +0, 476, 309, +0, 504, 450, +0, 539, 589, +0, 581, 727, +0, 633, 862, +0, 633, 952, +0, 633, 1049, +0, 651, 1176, +0, 570, 1351, +0, 559, 1513, +0, 547, 1653, +561, 434, 1790, +1118, 244, 1898, +1474, 428, 2027, +1427, 736, 2178, +265, 1128, 2349, +1398, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 557, 0, +0, 566, 13, +0, 579, 163, +0, 596, 309, +0, 618, 450, +0, 645, 589, +0, 679, 727, +0, 721, 862, +0, 772, 997, +0, 772, 1086, +0, 785, 1204, +0, 726, 1371, +0, 691, 1527, +0, 682, 1662, +561, 601, 1796, +1135, 422, 1904, +1436, 560, 2035, +1366, 869, 2187, +186, 1169, 2352, +1455, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 690, 0, +0, 697, 13, +0, 707, 163, +0, 720, 309, +0, 736, 450, +0, 758, 589, +0, 784, 727, +0, 818, 862, +0, 859, 997, +0, 909, 1132, +0, 919, 1240, +0, 876, 1396, +0, 823, 1545, +0, 817, 1675, +561, 758, 1802, +1163, 593, 1912, +1381, 692, 2045, +1269, 1003, 2199, +0, 1212, 2357, +1522, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 858, 201, +0, 863, 282, +0, 870, 371, +0, 879, 468, +0, 891, 572, +0, 906, 682, +0, 925, 797, +0, 950, 916, +0, 981, 1038, +0, 1020, 1162, +0, 1060, 1288, +0, 1029, 1430, +0, 983, 1570, +0, 969, 1697, +572, 942, 1817, +1182, 800, 1926, +1302, 849, 2057, +1120, 1137, 2212, +0, 1254, 2365, +1585, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +0, 1183, 1025, +0, 1183, 1031, +0, 1183, 1036, +0, 1183, 1043, +0, 1183, 1052, +0, 1183, 1064, +0, 1183, 1080, +0, 1183, 1099, +0, 1183, 1125, +0, 1188, 1168, +0, 1207, 1242, +0, 1231, 1325, +0, 1257, 1417, +0, 1236, 1493, +0, 1208, 1617, +0, 1221, 1741, +640, 1187, 1855, +1045, 1132, 1961, +1243, 1131, 2080, +1031, 1271, 2225, +498, 1311, 2371, +1589, 1031, 2471, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +0, 1421, 1376, +0, 1421, 1379, +0, 1421, 1382, +0, 1421, 1385, +0, 1421, 1389, +0, 1421, 1395, +0, 1421, 1402, +0, 1421, 1412, +0, 1421, 1425, +0, 1421, 1442, +0, 1421, 1463, +0, 1421, 1491, +0, 1431, 1546, +0, 1417, 1605, +0, 1399, 1673, +0, 1411, 1786, +640, 1405, 1896, +1052, 1353, 1999, +1151, 1350, 2110, +878, 1405, 2240, +684, 1387, 2378, +1602, 1208, 2473, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +913, 1579, 1648, +912, 1579, 1649, +912, 1579, 1651, +912, 1579, 1653, +912, 1578, 1655, +912, 1577, 1658, +912, 1576, 1662, +912, 1574, 1668, +912, 1572, 1675, +912, 1569, 1685, +912, 1567, 1698, +912, 1567, 1714, +892, 1567, 1736, +891, 1577, 1788, +891, 1569, 1838, +896, 1552, 1889, +818, 1557, 1970, +929, 1536, 2067, +946, 1537, 2170, +810, 1524, 2268, +1128, 1500, 2382, +1680, 1435, 2473, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1450, 1705, 1856, +1449, 1705, 1856, +1448, 1705, 1857, +1446, 1705, 1859, +1444, 1705, 1860, +1442, 1705, 1862, +1439, 1705, 1865, +1434, 1705, 1868, +1427, 1705, 1873, +1427, 1703, 1880, +1427, 1700, 1888, +1427, 1696, 1899, +1424, 1691, 1913, +1401, 1685, 1931, +1401, 1696, 1976, +1370, 1701, 2022, +1372, 1685, 2062, +1195, 1672, 2128, +1129, 1678, 2221, +1176, 1647, 2295, +1520, 1631, 2386, +1776, 1634, 2475, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1786, 1817, 1978, +1786, 1817, 1978, +1786, 1817, 1979, +1786, 1817, 1980, +1787, 1817, 1981, +1787, 1817, 1982, +1788, 1817, 1983, +1789, 1817, 1986, +1790, 1817, 1988, +1793, 1817, 1992, +1789, 1817, 1998, +1782, 1817, 2007, +1772, 1818, 2018, +1753, 1824, 2036, +1733, 1818, 2052, +1727, 1803, 2080, +1686, 1816, 2123, +1706, 1808, 2166, +1658, 1793, 2234, +1664, 1793, 2304, +1754, 1797, 2389, +1874, 1790, 2475, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1958, 1958, 2028, +1958, 1958, 2029, +1957, 1958, 2029, +1957, 1958, 2030, +1957, 1958, 2031, +1956, 1958, 2031, +1956, 1958, 2033, +1955, 1958, 2035, +1954, 1958, 2037, +1953, 1958, 2041, +1951, 1958, 2045, +1948, 1958, 2051, +1946, 1958, 2058, +1941, 1962, 2068, +1936, 1968, 2081, +1927, 1969, 2115, +1913, 1965, 2153, +1905, 1963, 2189, +1920, 1969, 2243, +1881, 1968, 2320, +1929, 1954, 2392, +2033, 1964, 2481, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2120, 2120, 2070, +2120, 2120, 2072, +2120, 2121, 2073, +2120, 2122, 2076, +2120, 2122, 2079, +2120, 2124, 2083, +2120, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2115, 2131, 2133, +2109, 2133, 2164, +2103, 2131, 2206, +2111, 2135, 2256, +2119, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2356, 2125, +2369, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2367, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2368, 2358, 2163, +2370, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2383, 2356, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2654, 1965, +2681, 2654, 1966, +2681, 2654, 1968, +2681, 2654, 1967, +2681, 2654, 1966, +2680, 2653, 1964, +2680, 2653, 1962, +2679, 2652, 1962, +2678, 2653, 1969, +2677, 2654, 1990, +2676, 2653, 2014, +2675, 2650, 2033, +2677, 2655, 2124, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2667, 2410, +2715, 2678, 2527, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1088, +0, 0, 1296, +0, 0, 1475, +0, 0, 1634, +445, 0, 1772, +1152, 0, 1882, +1561, 0, 2006, +1559, 0, 2155, +423, 987, 2341, +1234, 615, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 36, +0, 0, 159, +0, 0, 285, +0, 0, 412, +0, 0, 540, +0, 0, 669, +0, 0, 799, +0, 0, 930, +0, 0, 1089, +0, 0, 1297, +0, 0, 1475, +0, 0, 1635, +426, 0, 1772, +1151, 0, 1882, +1561, 0, 2007, +1558, 0, 2155, +423, 992, 2341, +1238, 618, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 48, +0, 0, 168, +0, 0, 291, +0, 0, 417, +0, 0, 544, +0, 0, 672, +0, 0, 801, +0, 0, 931, +0, 0, 1090, +0, 0, 1298, +0, 0, 1476, +0, 0, 1635, +400, 0, 1772, +1150, 0, 1883, +1560, 0, 2007, +1556, 0, 2155, +423, 998, 2341, +1244, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 92, +0, 0, 203, +0, 0, 318, +0, 0, 437, +0, 0, 559, +0, 0, 683, +0, 0, 810, +0, 0, 938, +0, 0, 1094, +0, 0, 1300, +0, 0, 1478, +0, 0, 1636, +414, 0, 1773, +1149, 0, 1884, +1556, 0, 2008, +1550, 0, 2156, +416, 1005, 2342, +1252, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 145, +0, 0, 245, +0, 0, 351, +0, 0, 462, +0, 0, 579, +0, 0, 699, +0, 0, 821, +0, 0, 946, +0, 0, 1101, +0, 0, 1304, +0, 0, 1481, +0, 0, 1637, +432, 0, 1774, +1147, 0, 1885, +1551, 0, 2010, +1543, 38, 2158, +407, 1015, 2342, +1262, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 145, +0, 1, 295, +0, 1, 391, +0, 1, 494, +0, 1, 604, +0, 1, 718, +0, 1, 836, +0, 1, 958, +0, 70, 1109, +0, 30, 1310, +0, 30, 1484, +0, 0, 1639, +455, 0, 1776, +1144, 0, 1886, +1544, 0, 2012, +1532, 182, 2160, +394, 1028, 2343, +1275, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 0, 0, +0, 16, 0, +0, 58, 145, +0, 109, 295, +0, 170, 441, +0, 170, 534, +0, 170, 635, +0, 170, 742, +0, 170, 855, +0, 170, 973, +0, 218, 1119, +0, 163, 1316, +0, 163, 1489, +0, 126, 1641, +484, 0, 1778, +1141, 0, 1888, +1534, 32, 2014, +1518, 322, 2163, +376, 1045, 2344, +1292, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 127, 0, +0, 152, 0, +0, 184, 145, +0, 223, 295, +0, 271, 441, +0, 327, 582, +0, 327, 674, +0, 327, 773, +0, 327, 879, +0, 327, 991, +0, 363, 1133, +0, 295, 1325, +0, 295, 1495, +0, 267, 1644, +520, 87, 1782, +1137, 0, 1891, +1521, 164, 2017, +1498, 461, 2167, +352, 1066, 2345, +1314, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 269, 0, +0, 287, 0, +0, 311, 145, +0, 341, 295, +0, 378, 441, +0, 423, 582, +0, 478, 721, +0, 478, 812, +0, 478, 910, +0, 478, 1016, +0, 503, 1151, +0, 426, 1337, +0, 426, 1503, +0, 406, 1648, +565, 239, 1786, +1131, 111, 1894, +1503, 296, 2022, +1470, 597, 2172, +317, 1093, 2347, +1353, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 408, 0, +0, 422, 0, +0, 439, 145, +0, 462, 295, +0, 491, 441, +0, 527, 582, +0, 570, 721, +0, 623, 859, +0, 623, 948, +0, 623, 1046, +0, 642, 1174, +0, 570, 1352, +0, 559, 1514, +0, 544, 1653, +569, 424, 1790, +1123, 244, 1899, +1477, 428, 2027, +1429, 733, 2178, +265, 1128, 2349, +1400, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 545, 0, +0, 555, 0, +0, 568, 145, +0, 586, 295, +0, 608, 441, +0, 636, 582, +0, 670, 721, +0, 713, 859, +0, 765, 995, +0, 765, 1084, +0, 778, 1202, +0, 726, 1372, +0, 691, 1528, +0, 680, 1662, +569, 594, 1795, +1139, 422, 1905, +1440, 560, 2035, +1368, 868, 2187, +186, 1169, 2352, +1457, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 681, 0, +0, 689, 0, +0, 699, 145, +0, 712, 295, +0, 729, 441, +0, 750, 582, +0, 777, 721, +0, 811, 859, +0, 854, 995, +0, 904, 1130, +0, 914, 1238, +0, 876, 1397, +0, 823, 1546, +0, 815, 1675, +569, 753, 1802, +1167, 593, 1913, +1385, 692, 2045, +1272, 1002, 2199, +0, 1212, 2357, +1524, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 852, 185, +0, 857, 268, +0, 864, 360, +0, 873, 459, +0, 885, 565, +0, 901, 676, +0, 920, 793, +0, 946, 912, +0, 977, 1035, +0, 1016, 1160, +0, 1056, 1287, +0, 1029, 1432, +0, 983, 1571, +0, 967, 1697, +579, 939, 1816, +1186, 800, 1926, +1306, 849, 2057, +1123, 1137, 2212, +0, 1254, 2365, +1587, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +0, 1181, 1022, +0, 1181, 1028, +0, 1181, 1036, +0, 1181, 1043, +0, 1181, 1052, +0, 1181, 1064, +0, 1181, 1080, +0, 1181, 1099, +0, 1181, 1125, +0, 1186, 1168, +0, 1205, 1242, +0, 1229, 1325, +0, 1255, 1417, +0, 1235, 1494, +0, 1207, 1618, +0, 1219, 1741, +647, 1188, 1855, +1051, 1133, 1961, +1243, 1131, 2080, +1031, 1271, 2225, +532, 1310, 2371, +1590, 1030, 2471, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +0, 1420, 1375, +0, 1420, 1378, +0, 1420, 1382, +0, 1420, 1385, +0, 1420, 1389, +0, 1420, 1395, +0, 1420, 1402, +0, 1420, 1412, +0, 1420, 1425, +0, 1420, 1442, +0, 1420, 1463, +0, 1420, 1491, +0, 1430, 1546, +0, 1417, 1606, +0, 1398, 1674, +0, 1410, 1786, +647, 1405, 1896, +1059, 1354, 2000, +1151, 1350, 2109, +878, 1405, 2240, +706, 1386, 2378, +1603, 1208, 2473, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +929, 1579, 1649, +928, 1579, 1650, +926, 1579, 1651, +926, 1579, 1653, +926, 1578, 1655, +926, 1577, 1658, +926, 1576, 1663, +926, 1574, 1668, +926, 1572, 1676, +926, 1569, 1685, +926, 1567, 1698, +926, 1567, 1715, +906, 1567, 1736, +898, 1576, 1787, +898, 1569, 1837, +906, 1552, 1889, +833, 1557, 1970, +939, 1536, 2067, +950, 1537, 2170, +810, 1524, 2268, +1132, 1500, 2382, +1680, 1435, 2473, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1452, 1705, 1855, +1450, 1705, 1856, +1449, 1705, 1857, +1448, 1705, 1859, +1446, 1705, 1860, +1443, 1705, 1862, +1440, 1705, 1865, +1435, 1705, 1868, +1429, 1705, 1873, +1428, 1703, 1880, +1428, 1700, 1888, +1428, 1696, 1899, +1425, 1691, 1913, +1402, 1685, 1931, +1402, 1696, 1977, +1371, 1701, 2021, +1374, 1685, 2062, +1200, 1672, 2128, +1132, 1678, 2221, +1180, 1647, 2295, +1520, 1631, 2386, +1776, 1634, 2475, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1787, 1817, 1978, +1787, 1817, 1978, +1786, 1817, 1979, +1786, 1817, 1980, +1787, 1817, 1981, +1787, 1817, 1982, +1788, 1817, 1983, +1789, 1817, 1986, +1791, 1817, 1988, +1793, 1817, 1992, +1789, 1817, 1998, +1782, 1817, 2007, +1772, 1818, 2018, +1753, 1823, 2036, +1734, 1818, 2052, +1728, 1803, 2080, +1687, 1816, 2123, +1706, 1808, 2166, +1658, 1793, 2234, +1666, 1793, 2304, +1755, 1797, 2389, +1874, 1790, 2475, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1958, 1958, 2029, +1958, 1958, 2029, +1958, 1958, 2029, +1958, 1958, 2030, +1957, 1958, 2031, +1957, 1958, 2032, +1956, 1958, 2033, +1955, 1958, 2035, +1955, 1958, 2037, +1953, 1958, 2041, +1951, 1958, 2045, +1949, 1958, 2051, +1946, 1958, 2058, +1941, 1962, 2068, +1936, 1968, 2081, +1927, 1969, 2114, +1914, 1966, 2153, +1905, 1963, 2189, +1920, 1969, 2243, +1882, 1968, 2320, +1930, 1954, 2392, +2034, 1964, 2481, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2120, 2120, 2070, +2120, 2120, 2071, +2120, 2121, 2073, +2120, 2122, 2076, +2120, 2122, 2079, +2120, 2124, 2083, +2120, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2116, 2131, 2132, +2109, 2133, 2164, +2103, 2131, 2206, +2111, 2135, 2256, +2120, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2367, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2368, 2358, 2163, +2370, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2384, 2356, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1965, +2681, 2655, 1966, +2681, 2654, 1967, +2681, 2654, 1969, +2681, 2654, 1968, +2681, 2654, 1966, +2680, 2653, 1965, +2680, 2653, 1962, +2679, 2652, 1963, +2678, 2653, 1970, +2677, 2655, 1992, +2676, 2653, 2015, +2675, 2650, 2035, +2677, 2655, 2124, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2666, 2409, +2715, 2678, 2527, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1088, +0, 0, 1300, +0, 0, 1478, +0, 0, 1634, +499, 0, 1773, +1157, 0, 1883, +1561, 0, 2007, +1557, 0, 2156, +416, 987, 2341, +1238, 611, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 36, +0, 0, 159, +0, 0, 285, +0, 0, 412, +0, 0, 540, +0, 0, 669, +0, 0, 799, +0, 0, 930, +0, 0, 1089, +0, 0, 1301, +0, 0, 1478, +0, 0, 1635, +483, 0, 1773, +1157, 0, 1883, +1561, 0, 2007, +1556, 0, 2156, +416, 992, 2341, +1243, 614, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 48, +0, 0, 168, +0, 0, 291, +0, 0, 417, +0, 0, 544, +0, 0, 672, +0, 0, 801, +0, 0, 931, +0, 0, 1090, +0, 0, 1302, +0, 0, 1479, +0, 0, 1635, +460, 0, 1772, +1156, 0, 1884, +1560, 0, 2008, +1554, 0, 2156, +416, 998, 2341, +1249, 617, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 63, +0, 0, 180, +0, 0, 300, +0, 0, 424, +0, 0, 549, +0, 0, 676, +0, 0, 804, +0, 0, 933, +0, 0, 1091, +0, 0, 1302, +0, 0, 1480, +0, 0, 1636, +427, 0, 1772, +1154, 0, 1884, +1560, 0, 2009, +1552, 0, 2156, +416, 1005, 2342, +1256, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 120, +0, 0, 224, +0, 0, 335, +0, 0, 450, +0, 0, 569, +0, 0, 691, +0, 0, 816, +0, 0, 942, +0, 0, 1097, +0, 0, 1306, +0, 0, 1482, +0, 0, 1637, +445, 0, 1774, +1153, 0, 1885, +1554, 0, 2010, +1544, 22, 2158, +407, 1015, 2342, +1266, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 120, +0, 0, 277, +0, 0, 376, +0, 0, 483, +0, 0, 594, +0, 0, 711, +0, 0, 831, +0, 0, 954, +0, 23, 1106, +0, 30, 1311, +0, 30, 1486, +0, 0, 1639, +467, 0, 1775, +1150, 0, 1887, +1547, 0, 2012, +1534, 170, 2160, +394, 1028, 2343, +1279, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 11, 120, +0, 67, 277, +0, 133, 427, +0, 133, 523, +0, 133, 627, +0, 133, 736, +0, 133, 850, +0, 133, 968, +0, 186, 1116, +0, 163, 1318, +0, 163, 1490, +0, 112, 1641, +496, 0, 1778, +1147, 0, 1888, +1538, 32, 2014, +1520, 314, 2163, +376, 1045, 2344, +1296, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 127, 0, +0, 114, 0, +0, 148, 120, +0, 190, 277, +0, 241, 427, +0, 302, 573, +0, 302, 666, +0, 302, 767, +0, 302, 875, +0, 302, 987, +0, 339, 1130, +0, 295, 1327, +0, 295, 1496, +0, 258, 1644, +531, 58, 1781, +1142, 0, 1891, +1524, 164, 2018, +1500, 455, 2167, +352, 1066, 2345, +1318, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 269, 0, +0, 259, 0, +0, 284, 120, +0, 316, 277, +0, 355, 427, +0, 403, 573, +0, 459, 714, +0, 459, 806, +0, 459, 906, +0, 459, 1012, +0, 486, 1148, +0, 426, 1339, +0, 426, 1504, +0, 399, 1648, +574, 219, 1786, +1136, 111, 1894, +1506, 296, 2022, +1472, 593, 2172, +317, 1093, 2347, +1356, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 408, 0, +0, 401, 0, +0, 419, 120, +0, 443, 277, +0, 473, 427, +0, 510, 573, +0, 556, 714, +0, 610, 854, +0, 610, 944, +0, 610, 1043, +0, 629, 1171, +0, 570, 1354, +0, 559, 1515, +0, 539, 1653, +578, 410, 1789, +1128, 244, 1899, +1481, 428, 2028, +1431, 730, 2178, +265, 1128, 2349, +1403, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 545, 0, +0, 540, 0, +0, 553, 120, +0, 571, 277, +0, 594, 427, +0, 623, 573, +0, 658, 714, +0, 702, 854, +0, 755, 991, +0, 755, 1080, +0, 769, 1200, +0, 726, 1374, +0, 691, 1529, +0, 676, 1662, +578, 585, 1795, +1145, 422, 1905, +1444, 560, 2035, +1371, 865, 2187, +186, 1169, 2352, +1460, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 681, 0, +0, 677, 0, +0, 688, 120, +0, 701, 277, +0, 718, 427, +0, 740, 573, +0, 768, 714, +0, 803, 854, +0, 845, 991, +0, 897, 1127, +0, 907, 1236, +0, 876, 1399, +0, 823, 1547, +0, 812, 1675, +578, 746, 1801, +1172, 593, 1913, +1390, 692, 2045, +1275, 1000, 2199, +0, 1212, 2357, +1526, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 852, 185, +0, 850, 248, +0, 857, 344, +0, 866, 446, +0, 878, 555, +0, 894, 669, +0, 914, 787, +0, 939, 908, +0, 971, 1032, +0, 1011, 1157, +0, 1051, 1285, +0, 1029, 1433, +0, 983, 1572, +27, 965, 1697, +589, 934, 1816, +1190, 800, 1926, +1312, 849, 2057, +1127, 1135, 2212, +0, 1254, 2365, +1589, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +0, 1178, 1018, +0, 1178, 1024, +0, 1178, 1032, +0, 1178, 1043, +0, 1178, 1052, +0, 1178, 1064, +0, 1178, 1080, +0, 1178, 1099, +0, 1178, 1125, +0, 1184, 1168, +0, 1203, 1242, +0, 1227, 1325, +0, 1253, 1417, +21, 1234, 1496, +21, 1206, 1619, +81, 1217, 1742, +655, 1189, 1855, +1060, 1135, 1962, +1243, 1131, 2080, +1031, 1271, 2225, +573, 1308, 2371, +1592, 1028, 2471, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +0, 1418, 1374, +0, 1418, 1376, +0, 1418, 1380, +0, 1418, 1385, +0, 1418, 1389, +0, 1418, 1395, +0, 1418, 1402, +0, 1418, 1412, +0, 1418, 1425, +0, 1418, 1442, +0, 1418, 1463, +0, 1418, 1491, +0, 1429, 1546, +21, 1416, 1607, +21, 1397, 1675, +81, 1409, 1787, +655, 1406, 1896, +1067, 1355, 2000, +1151, 1350, 2109, +878, 1405, 2240, +735, 1384, 2378, +1605, 1206, 2473, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +949, 1577, 1650, +947, 1578, 1651, +946, 1578, 1652, +943, 1579, 1653, +943, 1578, 1656, +943, 1577, 1659, +943, 1576, 1663, +943, 1574, 1669, +943, 1572, 1676, +943, 1569, 1686, +943, 1567, 1699, +943, 1567, 1715, +924, 1567, 1737, +908, 1576, 1787, +908, 1568, 1837, +917, 1552, 1889, +852, 1557, 1971, +951, 1536, 2066, +957, 1537, 2170, +810, 1525, 2268, +1138, 1499, 2382, +1680, 1435, 2473, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1454, 1705, 1855, +1453, 1705, 1856, +1451, 1705, 1857, +1449, 1705, 1859, +1447, 1705, 1860, +1444, 1705, 1862, +1441, 1705, 1865, +1436, 1705, 1868, +1430, 1705, 1873, +1430, 1703, 1880, +1430, 1700, 1888, +1430, 1696, 1899, +1426, 1691, 1913, +1403, 1685, 1931, +1403, 1696, 1977, +1372, 1701, 2021, +1375, 1686, 2063, +1206, 1672, 2128, +1137, 1678, 2221, +1185, 1647, 2295, +1521, 1632, 2386, +1778, 1634, 2475, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1788, 1817, 1978, +1788, 1817, 1978, +1787, 1817, 1979, +1787, 1817, 1980, +1787, 1817, 1981, +1788, 1817, 1982, +1789, 1817, 1983, +1790, 1817, 1986, +1791, 1817, 1988, +1793, 1817, 1992, +1789, 1817, 1998, +1782, 1817, 2007, +1773, 1818, 2018, +1754, 1823, 2036, +1735, 1818, 2051, +1730, 1803, 2080, +1689, 1816, 2124, +1707, 1808, 2166, +1658, 1793, 2234, +1668, 1793, 2304, +1756, 1797, 2389, +1874, 1789, 2475, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1959, 1958, 2029, +1959, 1958, 2029, +1958, 1958, 2030, +1958, 1958, 2030, +1958, 1958, 2031, +1957, 1958, 2032, +1957, 1958, 2033, +1956, 1958, 2035, +1955, 1958, 2037, +1954, 1958, 2041, +1952, 1958, 2045, +1950, 1958, 2051, +1946, 1958, 2058, +1942, 1962, 2068, +1936, 1967, 2081, +1928, 1969, 2114, +1915, 1966, 2154, +1905, 1962, 2189, +1920, 1968, 2243, +1883, 1968, 2320, +1930, 1954, 2392, +2035, 1964, 2481, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2120, 2120, 2068, +2120, 2120, 2068, +2120, 2120, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2120, 2120, 2070, +2120, 2120, 2071, +2120, 2121, 2073, +2120, 2122, 2075, +2120, 2122, 2078, +2120, 2124, 2082, +2120, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2116, 2131, 2132, +2110, 2133, 2165, +2104, 2131, 2206, +2111, 2134, 2256, +2120, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2368, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2163, +2371, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2384, 2357, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1966, +2681, 2655, 1967, +2681, 2655, 1968, +2681, 2655, 1969, +2681, 2654, 1968, +2681, 2654, 1967, +2680, 2654, 1965, +2680, 2653, 1963, +2679, 2653, 1963, +2678, 2654, 1973, +2677, 2655, 1994, +2676, 2653, 2016, +2675, 2650, 2036, +2677, 2655, 2123, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2666, 2409, +2715, 2678, 2527, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +58, 0, 0, +58, 0, 0, +58, 0, 0, +58, 0, 0, +58, 0, 28, +58, 0, 152, +58, 0, 280, +58, 0, 408, +58, 0, 537, +58, 0, 667, +58, 0, 797, +58, 0, 928, +0, 0, 1088, +0, 0, 1305, +0, 0, 1481, +28, 0, 1634, +564, 0, 1774, +1165, 0, 1884, +1561, 0, 2007, +1555, 0, 2157, +407, 987, 2341, +1245, 605, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +41, 0, 0, +50, 0, 0, +50, 0, 0, +50, 0, 0, +50, 0, 36, +50, 0, 159, +50, 0, 285, +50, 0, 412, +50, 0, 540, +50, 0, 669, +50, 0, 799, +50, 0, 930, +0, 0, 1089, +0, 0, 1306, +0, 0, 1482, +36, 0, 1635, +550, 0, 1774, +1164, 0, 1884, +1561, 0, 2008, +1554, 0, 2157, +407, 992, 2341, +1249, 608, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +17, 0, 0, +26, 0, 0, +38, 0, 0, +38, 0, 0, +38, 0, 48, +38, 0, 168, +38, 0, 291, +38, 0, 417, +38, 0, 544, +38, 0, 672, +38, 0, 801, +38, 0, 931, +0, 0, 1090, +0, 0, 1307, +0, 0, 1482, +48, 0, 1635, +530, 0, 1773, +1163, 0, 1884, +1560, 0, 2008, +1552, 0, 2157, +407, 998, 2341, +1254, 611, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +6, 0, 0, +22, 0, 0, +22, 0, 63, +22, 0, 180, +22, 0, 300, +22, 0, 424, +22, 0, 549, +22, 0, 676, +22, 0, 804, +22, 0, 933, +0, 0, 1091, +0, 0, 1308, +0, 0, 1483, +63, 0, 1636, +502, 0, 1773, +1162, 0, 1885, +1560, 0, 2009, +1550, 0, 2158, +407, 1005, 2342, +1262, 615, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 83, +0, 0, 195, +0, 0, 312, +0, 0, 433, +0, 0, 556, +0, 0, 681, +0, 0, 808, +0, 0, 936, +0, 0, 1093, +0, 0, 1309, +0, 0, 1484, +83, 0, 1637, +462, 0, 1772, +1160, 0, 1885, +1559, 0, 2010, +1547, 0, 2158, +407, 1015, 2342, +1272, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 83, +0, 0, 251, +0, 0, 356, +0, 0, 467, +0, 0, 582, +0, 0, 701, +0, 0, 823, +0, 0, 948, +0, 0, 1102, +0, 30, 1314, +0, 30, 1487, +83, 0, 1639, +483, 0, 1774, +1157, 0, 1887, +1552, 0, 2012, +1536, 154, 2160, +394, 1028, 2343, +1285, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 83, +0, 3, 251, +0, 78, 409, +0, 78, 509, +0, 78, 615, +0, 78, 727, +0, 78, 843, +0, 78, 963, +0, 137, 1112, +0, 163, 1321, +0, 163, 1492, +83, 94, 1641, +511, 0, 1777, +1154, 0, 1889, +1542, 32, 2015, +1522, 302, 2163, +376, 1045, 2344, +1302, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 127, 0, +0, 114, 0, +0, 96, 83, +0, 143, 251, +0, 199, 409, +0, 265, 559, +0, 265, 655, +0, 265, 759, +0, 265, 868, +0, 265, 982, +0, 305, 1126, +0, 295, 1330, +0, 295, 1498, +83, 244, 1644, +545, 15, 1780, +1150, 0, 1891, +1529, 164, 2018, +1502, 446, 2167, +352, 1066, 2345, +1323, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 269, 0, +0, 259, 0, +0, 246, 83, +0, 280, 251, +0, 322, 409, +0, 373, 559, +0, 434, 705, +0, 434, 798, +0, 434, 899, +0, 434, 1007, +0, 462, 1144, +0, 426, 1341, +0, 426, 1506, +83, 390, 1648, +587, 190, 1784, +1144, 111, 1895, +1511, 296, 2022, +1474, 586, 2172, +317, 1093, 2347, +1361, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 408, 0, +0, 401, 0, +0, 391, 83, +0, 416, 251, +0, 448, 409, +0, 487, 559, +0, 535, 705, +0, 591, 846, +0, 591, 938, +0, 591, 1038, +0, 611, 1167, +0, 570, 1357, +0, 559, 1517, +83, 531, 1653, +591, 391, 1789, +1136, 244, 1899, +1486, 428, 2028, +1434, 725, 2178, +265, 1128, 2349, +1407, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 545, 0, +0, 540, 0, +0, 533, 83, +0, 551, 251, +0, 575, 409, +0, 605, 559, +0, 642, 705, +0, 688, 846, +0, 742, 985, +0, 742, 1076, +0, 756, 1197, +0, 726, 1376, +0, 691, 1531, +83, 670, 1662, +591, 572, 1794, +1152, 422, 1905, +1450, 560, 2036, +1374, 862, 2187, +186, 1169, 2352, +1464, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 681, 0, +0, 677, 0, +0, 672, 83, +0, 686, 251, +0, 703, 409, +0, 726, 559, +0, 755, 705, +0, 791, 846, +0, 835, 985, +0, 887, 1123, +0, 898, 1233, +0, 876, 1401, +0, 823, 1548, +83, 808, 1675, +591, 737, 1800, +1179, 593, 1913, +1396, 692, 2046, +1279, 997, 2199, +0, 1212, 2357, +1529, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 852, 185, +0, 850, 248, +0, 846, 322, +0, 855, 429, +0, 868, 541, +0, 884, 658, +0, 904, 778, +0, 930, 901, +0, 963, 1027, +0, 1003, 1154, +69, 1044, 1282, +0, 1029, 1435, +0, 983, 1573, +141, 963, 1697, +601, 928, 1815, +1197, 800, 1927, +1320, 849, 2058, +1133, 1133, 2212, +0, 1254, 2365, +1592, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +136, 1175, 1014, +107, 1175, 1020, +65, 1175, 1028, +1, 1175, 1038, +0, 1175, 1052, +0, 1175, 1064, +0, 1175, 1080, +0, 1175, 1099, +0, 1175, 1125, +0, 1180, 1168, +0, 1200, 1242, +0, 1224, 1325, +21, 1250, 1417, +153, 1233, 1497, +153, 1204, 1620, +214, 1214, 1743, +666, 1191, 1855, +1071, 1137, 1962, +1243, 1131, 2080, +1031, 1271, 2226, +622, 1305, 2371, +1594, 1025, 2471, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +136, 1416, 1371, +107, 1416, 1374, +65, 1416, 1378, +1, 1416, 1383, +0, 1416, 1389, +0, 1416, 1395, +0, 1416, 1402, +0, 1416, 1412, +0, 1416, 1425, +0, 1416, 1442, +0, 1416, 1463, +0, 1416, 1491, +21, 1427, 1546, +153, 1415, 1608, +153, 1396, 1676, +214, 1407, 1788, +666, 1407, 1897, +1078, 1356, 2001, +1151, 1350, 2109, +878, 1405, 2241, +770, 1382, 2378, +1607, 1205, 2473, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +973, 1576, 1651, +973, 1576, 1652, +971, 1577, 1653, +969, 1577, 1654, +966, 1578, 1656, +966, 1577, 1659, +966, 1576, 1664, +966, 1574, 1669, +966, 1572, 1677, +966, 1569, 1686, +966, 1567, 1699, +966, 1567, 1716, +948, 1567, 1737, +920, 1575, 1786, +920, 1568, 1836, +932, 1552, 1890, +876, 1557, 1972, +968, 1536, 2066, +965, 1537, 2170, +810, 1526, 2268, +1145, 1498, 2382, +1680, 1435, 2473, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1457, 1704, 1855, +1456, 1704, 1856, +1454, 1705, 1857, +1452, 1705, 1858, +1449, 1705, 1860, +1446, 1705, 1862, +1443, 1705, 1865, +1438, 1705, 1868, +1432, 1705, 1873, +1431, 1703, 1880, +1431, 1700, 1888, +1431, 1696, 1899, +1428, 1691, 1913, +1405, 1685, 1932, +1405, 1696, 1977, +1373, 1700, 2021, +1378, 1686, 2063, +1214, 1672, 2128, +1142, 1679, 2221, +1192, 1647, 2295, +1522, 1633, 2386, +1779, 1634, 2475, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1790, 1816, 1977, +1790, 1816, 1978, +1789, 1816, 1978, +1789, 1816, 1979, +1788, 1816, 1981, +1788, 1816, 1982, +1789, 1816, 1983, +1790, 1816, 1986, +1792, 1816, 1988, +1793, 1816, 1992, +1790, 1816, 1998, +1783, 1816, 2007, +1773, 1817, 2018, +1755, 1823, 2036, +1736, 1817, 2051, +1731, 1804, 2079, +1691, 1816, 2124, +1708, 1807, 2166, +1659, 1793, 2234, +1670, 1794, 2305, +1757, 1797, 2389, +1873, 1789, 2475, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1960, 1958, 2029, +1960, 1958, 2029, +1959, 1958, 2030, +1959, 1958, 2030, +1958, 1958, 2031, +1958, 1958, 2032, +1957, 1958, 2034, +1956, 1958, 2035, +1956, 1958, 2038, +1954, 1958, 2041, +1952, 1958, 2046, +1950, 1958, 2051, +1947, 1958, 2059, +1942, 1961, 2068, +1936, 1967, 2081, +1928, 1969, 2113, +1916, 1966, 2154, +1905, 1962, 2189, +1920, 1968, 2242, +1884, 1968, 2319, +1930, 1954, 2392, +2036, 1964, 2481, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2120, 2120, 2068, +2120, 2120, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2070, +2121, 2120, 2071, +2121, 2121, 2073, +2121, 2122, 2075, +2121, 2122, 2078, +2121, 2124, 2082, +2121, 2125, 2087, +2120, 2127, 2094, +2119, 2127, 2101, +2119, 2127, 2110, +2116, 2131, 2132, +2110, 2134, 2165, +2104, 2130, 2206, +2111, 2134, 2256, +2120, 2134, 2316, +2148, 2131, 2395, +2213, 2146, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2370, 2356, 2126, +2369, 2356, 2127, +2369, 2356, 2129, +2369, 2357, 2131, +2368, 2357, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2162, +2371, 2358, 2193, +2370, 2358, 2226, +2372, 2356, 2273, +2384, 2357, 2337, +2410, 2367, 2406, +2466, 2384, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1968, +2681, 2655, 1969, +2681, 2655, 1970, +2681, 2655, 1969, +2681, 2654, 1968, +2680, 2654, 1966, +2680, 2653, 1964, +2679, 2653, 1964, +2678, 2654, 1975, +2677, 2655, 1997, +2676, 2654, 2018, +2675, 2650, 2038, +2677, 2655, 2123, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2666, 2409, +2715, 2678, 2527, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +197, 0, 0, +197, 0, 0, +197, 0, 0, +197, 0, 0, +197, 0, 28, +197, 0, 152, +197, 0, 280, +197, 0, 408, +197, 0, 537, +197, 0, 667, +197, 0, 797, +197, 0, 928, +71, 0, 1088, +0, 0, 1312, +0, 0, 1486, +152, 0, 1634, +638, 0, 1775, +1174, 0, 1884, +1561, 0, 2008, +1552, 0, 2159, +394, 987, 2341, +1252, 597, 2470, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +184, 0, 0, +190, 0, 0, +190, 0, 0, +190, 0, 0, +190, 0, 36, +190, 0, 159, +190, 0, 285, +190, 0, 412, +190, 0, 540, +190, 0, 669, +190, 0, 799, +190, 0, 930, +46, 0, 1089, +0, 0, 1313, +0, 0, 1486, +159, 0, 1635, +626, 0, 1775, +1173, 0, 1885, +1561, 0, 2008, +1551, 0, 2159, +394, 992, 2341, +1257, 599, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +167, 0, 0, +173, 0, 0, +182, 0, 0, +182, 0, 0, +182, 0, 48, +182, 0, 168, +182, 0, 291, +182, 0, 417, +182, 0, 544, +182, 0, 672, +182, 0, 801, +182, 0, 931, +35, 0, 1090, +0, 0, 1313, +0, 0, 1487, +168, 0, 1635, +609, 0, 1775, +1172, 0, 1885, +1560, 0, 2009, +1549, 0, 2159, +394, 998, 2341, +1262, 603, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +142, 0, 0, +149, 0, 0, +158, 0, 0, +170, 0, 0, +170, 0, 63, +170, 0, 180, +170, 0, 300, +170, 0, 424, +170, 0, 549, +170, 0, 676, +170, 0, 804, +170, 0, 933, +19, 0, 1091, +0, 0, 1315, +0, 0, 1487, +180, 0, 1636, +586, 0, 1774, +1171, 0, 1886, +1560, 0, 2010, +1547, 0, 2159, +394, 1005, 2342, +1270, 608, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +107, 0, 0, +115, 0, 0, +125, 0, 0, +138, 0, 0, +154, 0, 83, +154, 0, 195, +154, 0, 312, +154, 0, 433, +154, 0, 556, +154, 0, 681, +154, 0, 808, +154, 0, 936, +0, 0, 1093, +0, 0, 1316, +0, 0, 1489, +195, 0, 1637, +552, 0, 1774, +1169, 0, 1886, +1559, 0, 2011, +1544, 57, 2160, +394, 1015, 2342, +1279, 613, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +56, 0, 0, +65, 0, 0, +76, 0, 0, +90, 0, 0, +108, 0, 83, +132, 0, 215, +132, 0, 327, +132, 0, 444, +132, 0, 564, +132, 0, 688, +132, 0, 813, +132, 0, 940, +0, 0, 1096, +0, 30, 1317, +0, 30, 1490, +215, 0, 1639, +504, 0, 1773, +1167, 0, 1887, +1558, 0, 2012, +1540, 132, 2160, +394, 1028, 2343, +1292, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +56, 4, 0, +65, 0, 0, +76, 0, 0, +90, 0, 0, +108, 0, 83, +132, 0, 215, +132, 0, 383, +132, 0, 488, +132, 0, 599, +132, 0, 714, +132, 0, 833, +132, 0, 955, +0, 64, 1107, +0, 163, 1324, +0, 163, 1494, +215, 68, 1641, +530, 0, 1776, +1164, 0, 1889, +1548, 32, 2015, +1525, 286, 2163, +376, 1045, 2344, +1308, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +56, 144, 0, +65, 137, 0, +76, 127, 0, +90, 114, 0, +108, 96, 83, +132, 70, 215, +132, 135, 383, +132, 210, 541, +132, 210, 641, +132, 210, 747, +132, 210, 859, +132, 210, 975, +0, 255, 1121, +0, 295, 1333, +0, 295, 1500, +215, 226, 1644, +563, 0, 1779, +1159, 0, 1892, +1536, 164, 2018, +1506, 434, 2167, +352, 1066, 2345, +1329, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +56, 281, 0, +65, 276, 0, +76, 269, 0, +90, 259, 0, +108, 246, 83, +132, 227, 215, +132, 275, 383, +132, 331, 541, +132, 397, 691, +132, 397, 787, +132, 397, 891, +132, 397, 1000, +0, 427, 1139, +0, 426, 1344, +0, 426, 1508, +215, 376, 1648, +604, 147, 1783, +1154, 111, 1895, +1518, 296, 2022, +1478, 578, 2172, +317, 1093, 2347, +1367, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +56, 417, 0, +65, 413, 0, +76, 408, 0, +90, 401, 0, +108, 391, 83, +132, 378, 215, +132, 412, 383, +132, 455, 541, +132, 505, 691, +132, 566, 837, +132, 566, 930, +132, 566, 1032, +0, 587, 1163, +0, 570, 1359, +0, 559, 1519, +215, 522, 1653, +607, 365, 1787, +1146, 244, 1900, +1493, 428, 2028, +1438, 719, 2178, +265, 1128, 2349, +1413, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +56, 552, 0, +65, 549, 0, +76, 545, 0, +90, 540, 0, +108, 533, 83, +132, 523, 215, +132, 548, 383, +132, 580, 541, +132, 619, 691, +132, 667, 837, +132, 723, 978, +132, 723, 1071, +0, 738, 1192, +0, 726, 1379, +0, 691, 1532, +215, 663, 1662, +607, 554, 1792, +1162, 422, 1905, +1457, 560, 2036, +1379, 857, 2187, +186, 1169, 2352, +1468, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +56, 686, 0, +65, 684, 0, +76, 681, 0, +90, 677, 0, +108, 672, 83, +132, 665, 215, +132, 684, 383, +132, 708, 541, +132, 737, 691, +132, 774, 837, +132, 820, 978, +132, 874, 1118, +0, 885, 1229, +0, 876, 1403, +0, 823, 1550, +215, 803, 1675, +607, 725, 1799, +1188, 593, 1913, +1404, 692, 2046, +1285, 994, 2199, +0, 1212, 2357, +1533, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +63, 854, 85, +31, 854, 130, +43, 852, 185, +58, 850, 248, +78, 846, 322, +103, 841, 404, +103, 854, 522, +103, 870, 643, +103, 892, 767, +103, 918, 893, +103, 952, 1020, +103, 993, 1149, +185, 1035, 1278, +0, 1029, 1438, +0, 983, 1575, +259, 959, 1697, +617, 920, 1814, +1206, 800, 1927, +1329, 849, 2058, +1141, 1131, 2212, +0, 1254, 2365, +1596, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +289, 1170, 1007, +268, 1170, 1013, +239, 1170, 1021, +196, 1170, 1032, +132, 1170, 1046, +30, 1170, 1064, +30, 1170, 1080, +30, 1170, 1099, +30, 1170, 1125, +30, 1176, 1168, +30, 1195, 1242, +30, 1220, 1325, +125, 1246, 1417, +285, 1231, 1499, +285, 1202, 1622, +345, 1210, 1744, +680, 1193, 1856, +1086, 1139, 1963, +1243, 1131, 2080, +1031, 1271, 2226, +681, 1302, 2370, +1597, 1022, 2471, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +289, 1413, 1368, +268, 1413, 1371, +239, 1413, 1375, +196, 1413, 1380, +132, 1413, 1386, +30, 1413, 1395, +30, 1413, 1402, +30, 1413, 1412, +30, 1413, 1425, +30, 1413, 1442, +30, 1413, 1463, +30, 1413, 1491, +125, 1424, 1546, +285, 1414, 1610, +285, 1395, 1677, +345, 1404, 1789, +680, 1408, 1897, +1092, 1358, 2001, +1151, 1350, 2109, +878, 1405, 2241, +813, 1379, 2377, +1609, 1202, 2473, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1005, 1574, 1653, +1004, 1574, 1654, +1003, 1575, 1655, +1001, 1575, 1656, +998, 1576, 1658, +995, 1577, 1660, +995, 1576, 1664, +995, 1574, 1670, +995, 1572, 1678, +995, 1569, 1687, +995, 1567, 1700, +995, 1567, 1716, +977, 1567, 1738, +937, 1574, 1785, +937, 1567, 1835, +952, 1552, 1890, +906, 1557, 1973, +989, 1536, 2066, +976, 1537, 2170, +810, 1527, 2268, +1155, 1497, 2382, +1680, 1435, 2473, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1461, 1703, 1854, +1459, 1704, 1855, +1458, 1704, 1856, +1456, 1704, 1858, +1453, 1705, 1859, +1449, 1705, 1862, +1446, 1705, 1865, +1441, 1705, 1868, +1435, 1705, 1873, +1434, 1703, 1880, +1434, 1700, 1888, +1434, 1696, 1899, +1431, 1691, 1913, +1408, 1685, 1932, +1408, 1696, 1977, +1375, 1699, 2021, +1380, 1687, 2064, +1224, 1672, 2127, +1149, 1680, 2221, +1200, 1647, 2295, +1523, 1633, 2386, +1781, 1634, 2475, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1793, 1816, 1977, +1792, 1816, 1977, +1792, 1816, 1978, +1791, 1816, 1979, +1790, 1816, 1980, +1789, 1816, 1982, +1790, 1816, 1983, +1791, 1816, 1986, +1792, 1816, 1988, +1794, 1816, 1992, +1790, 1816, 1998, +1783, 1816, 2007, +1774, 1817, 2018, +1756, 1822, 2035, +1737, 1817, 2051, +1733, 1804, 2079, +1694, 1816, 2124, +1710, 1807, 2166, +1660, 1793, 2234, +1673, 1795, 2305, +1759, 1797, 2389, +1873, 1788, 2475, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1961, 1958, 2029, +1961, 1958, 2030, +1961, 1958, 2030, +1960, 1958, 2031, +1959, 1958, 2031, +1959, 1958, 2032, +1958, 1958, 2034, +1958, 1958, 2036, +1956, 1958, 2038, +1955, 1958, 2042, +1953, 1958, 2046, +1951, 1958, 2052, +1948, 1958, 2059, +1943, 1961, 2068, +1937, 1966, 2081, +1930, 1968, 2112, +1918, 1966, 2154, +1905, 1962, 2189, +1920, 1968, 2242, +1885, 1967, 2319, +1930, 1954, 2392, +2038, 1964, 2481, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2120, 2120, 2069, +2120, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2071, +2121, 2121, 2073, +2121, 2122, 2075, +2121, 2122, 2078, +2121, 2124, 2082, +2121, 2125, 2087, +2120, 2127, 2094, +2119, 2127, 2101, +2119, 2127, 2110, +2117, 2131, 2132, +2111, 2134, 2166, +2105, 2130, 2206, +2111, 2134, 2255, +2121, 2134, 2316, +2148, 2131, 2396, +2213, 2146, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2370, 2355, 2126, +2370, 2356, 2127, +2369, 2356, 2129, +2369, 2357, 2131, +2368, 2357, 2133, +2369, 2358, 2137, +2369, 2359, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2162, +2371, 2358, 2193, +2370, 2358, 2226, +2373, 2356, 2273, +2385, 2357, 2337, +2411, 2367, 2406, +2466, 2384, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1969, +2681, 2655, 1970, +2681, 2655, 1971, +2681, 2655, 1970, +2681, 2655, 1969, +2680, 2654, 1968, +2680, 2654, 1965, +2679, 2653, 1966, +2679, 2654, 1979, +2677, 2655, 2000, +2676, 2654, 2020, +2675, 2650, 2041, +2677, 2655, 2122, +2681, 2656, 2208, +2688, 2661, 2306, +2695, 2666, 2408, +2715, 2678, 2527, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +333, 0, 0, +333, 0, 0, +333, 0, 0, +333, 0, 0, +333, 0, 28, +333, 0, 152, +333, 0, 280, +333, 0, 408, +333, 0, 537, +333, 0, 667, +333, 0, 797, +333, 0, 928, +244, 0, 1088, +0, 0, 1321, +0, 0, 1492, +280, 0, 1634, +721, 0, 1777, +1186, 0, 1886, +1561, 0, 2009, +1548, 0, 2161, +376, 987, 2341, +1263, 586, 2469, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +324, 0, 0, +329, 0, 0, +329, 0, 0, +329, 0, 0, +329, 0, 36, +329, 0, 159, +329, 0, 285, +329, 0, 412, +329, 0, 540, +329, 0, 669, +329, 0, 799, +329, 0, 930, +227, 0, 1089, +0, 0, 1322, +0, 0, 1493, +285, 0, 1635, +711, 0, 1776, +1185, 0, 1886, +1561, 0, 2009, +1547, 0, 2161, +376, 992, 2341, +1267, 588, 2469, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +311, 0, 0, +316, 0, 0, +322, 0, 0, +322, 0, 0, +322, 0, 48, +322, 0, 168, +322, 0, 291, +322, 0, 417, +322, 0, 544, +322, 0, 672, +322, 0, 801, +322, 0, 931, +219, 0, 1090, +0, 0, 1323, +0, 0, 1493, +291, 0, 1635, +697, 0, 1776, +1184, 0, 1886, +1560, 0, 2010, +1545, 22, 2161, +376, 998, 2341, +1272, 592, 2469, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +294, 0, 0, +299, 0, 0, +305, 0, 0, +314, 0, 0, +314, 0, 63, +314, 0, 180, +314, 0, 300, +314, 0, 424, +314, 0, 549, +314, 0, 676, +314, 0, 804, +314, 0, 933, +209, 0, 1091, +0, 0, 1323, +0, 0, 1494, +300, 0, 1636, +678, 0, 1776, +1183, 0, 1887, +1560, 0, 2011, +1543, 69, 2161, +376, 1005, 2342, +1280, 596, 2469, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +269, 0, 0, +274, 0, 0, +281, 0, 0, +290, 0, 0, +302, 0, 83, +302, 0, 195, +302, 0, 312, +302, 0, 433, +302, 0, 556, +302, 0, 681, +302, 0, 808, +302, 0, 936, +194, 0, 1093, +0, 0, 1325, +0, 0, 1495, +312, 0, 1637, +651, 0, 1776, +1181, 0, 1887, +1559, 0, 2012, +1540, 124, 2162, +376, 1015, 2342, +1289, 603, 2469, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +234, 0, 0, +239, 0, 0, +247, 0, 0, +257, 0, 0, +270, 0, 83, +286, 0, 215, +286, 0, 327, +286, 0, 444, +286, 0, 564, +286, 0, 688, +286, 0, 813, +286, 0, 940, +173, 0, 1096, +0, 30, 1326, +0, 30, 1496, +327, 0, 1639, +613, 0, 1775, +1179, 0, 1888, +1558, 0, 2013, +1535, 189, 2162, +376, 1028, 2343, +1301, 611, 2469, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +182, 4, 0, +188, 0, 0, +197, 0, 0, +208, 0, 0, +222, 0, 83, +241, 0, 215, +264, 0, 347, +264, 0, 459, +264, 0, 576, +264, 0, 697, +264, 0, 820, +264, 0, 946, +145, 0, 1100, +0, 163, 1329, +0, 163, 1497, +347, 32, 1641, +555, 0, 1774, +1176, 0, 1890, +1557, 32, 2015, +1530, 264, 2163, +376, 1045, 2344, +1318, 621, 2469, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +182, 144, 0, +188, 137, 0, +197, 127, 0, +208, 114, 0, +222, 96, 83, +241, 70, 215, +264, 34, 347, +264, 126, 516, +264, 126, 620, +264, 126, 731, +264, 126, 846, +264, 126, 966, +145, 179, 1114, +0, 295, 1337, +0, 295, 1503, +347, 201, 1644, +586, 0, 1777, +1172, 0, 1892, +1544, 164, 2019, +1510, 418, 2167, +352, 1066, 2345, +1338, 621, 2469, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +182, 281, 0, +188, 276, 0, +197, 269, 0, +208, 259, 0, +222, 246, 83, +241, 227, 215, +264, 202, 347, +264, 267, 516, +264, 342, 673, +264, 342, 773, +264, 342, 879, +264, 342, 991, +145, 376, 1133, +0, 426, 1349, +0, 426, 1511, +347, 358, 1648, +625, 84, 1782, +1166, 111, 1896, +1526, 296, 2023, +1483, 566, 2172, +317, 1093, 2347, +1375, 639, 2469, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +182, 417, 0, +188, 413, 0, +197, 408, 0, +208, 401, 0, +222, 391, 83, +241, 378, 215, +264, 360, 347, +264, 407, 516, +264, 463, 673, +264, 529, 824, +264, 529, 920, +264, 529, 1023, +145, 552, 1156, +0, 570, 1364, +0, 559, 1522, +347, 509, 1653, +628, 326, 1786, +1159, 244, 1900, +1502, 428, 2029, +1443, 710, 2178, +265, 1128, 2349, +1420, 662, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +182, 552, 0, +188, 549, 0, +197, 545, 0, +208, 540, 0, +222, 533, 83, +241, 523, 215, +264, 510, 347, +264, 544, 516, +264, 586, 673, +264, 637, 824, +264, 698, 969, +264, 698, 1063, +145, 714, 1186, +0, 726, 1383, +0, 691, 1535, +347, 654, 1662, +628, 529, 1791, +1174, 422, 1906, +1467, 560, 2036, +1385, 851, 2187, +186, 1169, 2352, +1475, 691, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +182, 686, 0, +188, 684, 0, +197, 681, 0, +208, 677, 0, +222, 672, 83, +241, 665, 215, +264, 655, 347, +264, 681, 516, +264, 712, 673, +264, 752, 824, +264, 799, 969, +264, 856, 1111, +145, 867, 1223, +0, 876, 1407, +0, 823, 1553, +347, 796, 1675, +628, 708, 1798, +1200, 593, 1914, +1415, 692, 2046, +1292, 989, 2199, +0, 1212, 2357, +1539, 728, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +187, 854, 85, +163, 854, 130, +172, 852, 185, +183, 850, 248, +198, 846, 322, +218, 841, 404, +243, 835, 496, +243, 852, 623, +243, 874, 752, +243, 902, 881, +243, 936, 1011, +243, 979, 1142, +304, 1023, 1273, +0, 1029, 1441, +0, 983, 1578, +380, 954, 1697, +638, 909, 1812, +1217, 800, 1928, +1343, 849, 2058, +1151, 1127, 2212, +0, 1254, 2365, +1600, 800, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +436, 1164, 998, +421, 1164, 1004, +400, 1164, 1013, +371, 1164, 1024, +328, 1164, 1038, +265, 1164, 1056, +163, 1164, 1080, +163, 1164, 1099, +163, 1164, 1125, +163, 1170, 1168, +163, 1189, 1242, +163, 1214, 1325, +235, 1241, 1417, +417, 1228, 1503, +417, 1199, 1624, +478, 1204, 1746, +698, 1196, 1857, +1104, 1142, 1964, +1243, 1131, 2079, +1031, 1271, 2226, +750, 1297, 2370, +1600, 1018, 2470, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +436, 1410, 1364, +421, 1410, 1367, +400, 1410, 1371, +371, 1410, 1376, +328, 1410, 1382, +265, 1410, 1391, +163, 1410, 1402, +163, 1410, 1412, +163, 1410, 1425, +163, 1410, 1442, +163, 1410, 1463, +163, 1410, 1491, +235, 1421, 1546, +417, 1412, 1612, +417, 1393, 1679, +478, 1400, 1791, +698, 1410, 1897, +1111, 1360, 2002, +1151, 1350, 2108, +878, 1405, 2242, +865, 1375, 2377, +1613, 1200, 2472, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1044, 1572, 1655, +1043, 1572, 1656, +1042, 1572, 1657, +1040, 1573, 1658, +1038, 1573, 1660, +1034, 1574, 1662, +1030, 1576, 1666, +1030, 1574, 1671, +1030, 1572, 1679, +1030, 1569, 1688, +1030, 1567, 1701, +1030, 1567, 1717, +1014, 1567, 1739, +958, 1573, 1783, +958, 1565, 1833, +977, 1552, 1891, +944, 1557, 1974, +1016, 1536, 2066, +990, 1537, 2170, +810, 1528, 2268, +1168, 1496, 2382, +1680, 1435, 2473, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1466, 1702, 1854, +1464, 1703, 1855, +1463, 1703, 1855, +1461, 1703, 1857, +1458, 1704, 1859, +1454, 1705, 1862, +1449, 1705, 1865, +1444, 1705, 1868, +1438, 1705, 1873, +1438, 1703, 1880, +1438, 1700, 1888, +1438, 1696, 1899, +1434, 1691, 1913, +1412, 1685, 1932, +1412, 1696, 1978, +1377, 1698, 2020, +1384, 1688, 2065, +1238, 1672, 2127, +1159, 1681, 2221, +1212, 1647, 2296, +1524, 1635, 2386, +1783, 1634, 2474, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1796, 1815, 1977, +1795, 1815, 1977, +1795, 1815, 1978, +1794, 1815, 1978, +1793, 1815, 1980, +1792, 1815, 1981, +1790, 1815, 1983, +1792, 1815, 1986, +1793, 1815, 1988, +1795, 1815, 1992, +1791, 1815, 1998, +1784, 1815, 2007, +1775, 1816, 2018, +1758, 1821, 2035, +1739, 1816, 2051, +1736, 1805, 2078, +1698, 1816, 2124, +1712, 1806, 2166, +1661, 1793, 2234, +1677, 1795, 2305, +1762, 1797, 2390, +1872, 1787, 2475, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1963, 1958, 2030, +1962, 1958, 2030, +1962, 1958, 2031, +1962, 1958, 2031, +1961, 1958, 2032, +1960, 1958, 2033, +1959, 1958, 2034, +1958, 1958, 2036, +1958, 1958, 2039, +1956, 1958, 2042, +1955, 1958, 2047, +1952, 1958, 2052, +1949, 1958, 2059, +1943, 1961, 2068, +1937, 1966, 2081, +1930, 1968, 2111, +1921, 1967, 2155, +1905, 1961, 2189, +1920, 1967, 2241, +1887, 1967, 2319, +1931, 1954, 2392, +2040, 1964, 2481, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2070, +2122, 2120, 2070, +2122, 2120, 2070, +2122, 2121, 2072, +2122, 2122, 2074, +2122, 2122, 2078, +2122, 2124, 2082, +2122, 2125, 2087, +2121, 2127, 2094, +2119, 2127, 2101, +2119, 2127, 2110, +2118, 2131, 2131, +2112, 2134, 2166, +2105, 2129, 2205, +2112, 2134, 2255, +2122, 2134, 2316, +2148, 2132, 2396, +2214, 2146, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2370, 2356, 2127, +2370, 2356, 2129, +2369, 2357, 2131, +2369, 2357, 2133, +2369, 2358, 2137, +2370, 2359, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2162, +2372, 2358, 2193, +2371, 2358, 2226, +2374, 2356, 2273, +2386, 2358, 2337, +2411, 2367, 2406, +2465, 2384, 2499, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1969, +2681, 2656, 1972, +2681, 2656, 1973, +2681, 2655, 1972, +2681, 2655, 1971, +2680, 2655, 1969, +2680, 2654, 1967, +2679, 2654, 1967, +2679, 2655, 1983, +2677, 2656, 2005, +2677, 2654, 2023, +2675, 2651, 2045, +2677, 2655, 2122, +2681, 2656, 2208, +2688, 2660, 2305, +2695, 2666, 2408, +2715, 2678, 2527, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +469, 0, 0, +469, 0, 0, +469, 0, 0, +469, 0, 0, +469, 0, 28, +469, 0, 152, +469, 0, 280, +469, 0, 408, +469, 0, 537, +469, 0, 667, +469, 0, 797, +469, 0, 928, +404, 0, 1088, +100, 0, 1333, +100, 0, 1501, +408, 0, 1634, +813, 0, 1779, +1202, 0, 1887, +1561, 0, 2010, +1542, 61, 2164, +352, 987, 2341, +1276, 570, 2469, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +462, 0, 0, +465, 0, 0, +465, 0, 0, +465, 0, 0, +465, 0, 36, +465, 0, 159, +465, 0, 285, +465, 0, 412, +465, 0, 540, +465, 0, 669, +465, 0, 799, +465, 0, 930, +393, 0, 1089, +76, 0, 1333, +76, 0, 1501, +412, 0, 1635, +805, 0, 1779, +1201, 0, 1887, +1561, 0, 2011, +1541, 86, 2164, +352, 992, 2341, +1280, 573, 2469, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +453, 0, 0, +456, 0, 0, +461, 0, 0, +461, 0, 0, +461, 0, 48, +461, 0, 168, +461, 0, 291, +461, 0, 417, +461, 0, 544, +461, 0, 672, +461, 0, 801, +461, 0, 931, +387, 0, 1090, +43, 0, 1334, +43, 0, 1501, +417, 0, 1635, +793, 0, 1778, +1200, 0, 1888, +1560, 0, 2011, +1539, 116, 2164, +352, 998, 2341, +1285, 577, 2469, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +440, 0, 0, +444, 0, 0, +448, 0, 0, +455, 0, 0, +455, 0, 63, +455, 0, 180, +455, 0, 300, +455, 0, 424, +455, 0, 549, +455, 0, 676, +455, 0, 804, +455, 0, 933, +380, 0, 1091, +0, 0, 1335, +0, 0, 1502, +424, 0, 1636, +778, 0, 1778, +1199, 0, 1889, +1560, 0, 2012, +1537, 154, 2164, +352, 1005, 2342, +1292, 582, 2469, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +422, 0, 0, +426, 0, 0, +431, 0, 0, +437, 0, 0, +446, 0, 83, +446, 0, 195, +446, 0, 312, +446, 0, 433, +446, 0, 556, +446, 0, 681, +446, 0, 808, +446, 0, 936, +370, 0, 1093, +0, 0, 1336, +0, 0, 1503, +433, 0, 1637, +757, 0, 1778, +1197, 0, 1889, +1559, 0, 2013, +1534, 201, 2165, +352, 1015, 2342, +1302, 588, 2469, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +397, 0, 0, +401, 0, 0, +406, 0, 0, +413, 0, 0, +422, 0, 83, +434, 0, 215, +434, 0, 327, +434, 0, 444, +434, 0, 564, +434, 0, 688, +434, 0, 813, +434, 0, 940, +356, 0, 1096, +0, 30, 1338, +0, 30, 1504, +444, 0, 1639, +726, 0, 1777, +1195, 0, 1890, +1558, 0, 2015, +1530, 256, 2165, +352, 1028, 2343, +1314, 596, 2469, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +362, 4, 0, +366, 0, 0, +371, 0, 0, +379, 0, 0, +389, 0, 83, +402, 0, 215, +418, 0, 347, +418, 0, 459, +418, 0, 576, +418, 0, 697, +418, 0, 820, +418, 0, 946, +337, 0, 1100, +0, 163, 1340, +0, 163, 1505, +459, 32, 1641, +682, 0, 1776, +1192, 0, 1891, +1557, 32, 2017, +1524, 322, 2166, +352, 1045, 2344, +1329, 607, 2469, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +309, 144, 0, +314, 137, 0, +320, 127, 0, +329, 114, 0, +340, 96, 83, +354, 70, 215, +373, 34, 347, +396, 0, 479, +396, 0, 591, +396, 0, 708, +396, 0, 829, +396, 0, 952, +310, 52, 1105, +0, 295, 1343, +0, 295, 1507, +479, 164, 1644, +615, 0, 1775, +1188, 0, 1893, +1555, 164, 2019, +1516, 396, 2167, +352, 1066, 2345, +1349, 621, 2469, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +309, 281, 0, +314, 276, 0, +320, 269, 0, +329, 259, 0, +340, 246, 83, +354, 227, 215, +373, 202, 347, +396, 166, 479, +396, 257, 648, +396, 257, 752, +396, 257, 863, +396, 257, 978, +310, 298, 1124, +0, 426, 1354, +0, 426, 1515, +479, 333, 1648, +652, 0, 1779, +1183, 111, 1897, +1538, 296, 2024, +1489, 550, 2172, +317, 1093, 2347, +1385, 639, 2469, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +309, 417, 0, +314, 413, 0, +320, 408, 0, +329, 401, 0, +340, 391, 83, +354, 378, 215, +373, 360, 347, +396, 334, 479, +396, 399, 648, +396, 474, 805, +396, 474, 905, +396, 474, 1011, +310, 500, 1148, +0, 570, 1369, +0, 559, 1526, +479, 490, 1653, +655, 270, 1784, +1176, 244, 1901, +1514, 428, 2029, +1450, 699, 2178, +265, 1128, 2349, +1430, 662, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +309, 552, 0, +314, 549, 0, +320, 545, 0, +329, 540, 0, +340, 533, 83, +354, 523, 215, +373, 510, 347, +396, 492, 479, +396, 539, 648, +396, 595, 805, +396, 661, 955, +396, 661, 1052, +310, 678, 1178, +0, 726, 1388, +0, 691, 1539, +479, 640, 1662, +655, 494, 1789, +1191, 422, 1907, +1480, 560, 2037, +1393, 842, 2187, +186, 1169, 2352, +1483, 691, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +309, 686, 0, +314, 684, 0, +320, 681, 0, +329, 677, 0, +340, 672, 83, +354, 665, 215, +373, 655, 347, +396, 643, 479, +396, 677, 648, +396, 719, 805, +396, 770, 955, +396, 830, 1101, +310, 842, 1216, +0, 876, 1412, +0, 823, 1557, +479, 786, 1675, +655, 684, 1796, +1216, 593, 1915, +1430, 692, 2047, +1302, 983, 2199, +0, 1212, 2357, +1546, 728, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +313, 854, 85, +295, 854, 130, +302, 852, 185, +310, 850, 248, +322, 846, 322, +336, 841, 404, +356, 835, 496, +380, 826, 594, +380, 849, 730, +380, 878, 865, +380, 915, 1000, +380, 960, 1133, +426, 1005, 1267, +0, 1029, 1446, +0, 983, 1581, +504, 947, 1697, +664, 894, 1810, +1232, 800, 1928, +1359, 849, 2059, +1164, 1123, 2212, +0, 1254, 2365, +1607, 800, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +579, 1156, 985, +568, 1156, 992, +553, 1156, 1001, +532, 1156, 1012, +503, 1156, 1027, +461, 1156, 1045, +397, 1156, 1069, +295, 1156, 1099, +295, 1156, 1125, +295, 1161, 1168, +295, 1181, 1242, +295, 1207, 1325, +350, 1233, 1417, +549, 1224, 1507, +549, 1195, 1627, +610, 1196, 1748, +721, 1200, 1858, +1128, 1147, 1966, +1243, 1131, 2078, +1031, 1271, 2227, +827, 1290, 2369, +1605, 1012, 2470, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +579, 1405, 1359, +568, 1405, 1361, +553, 1405, 1365, +532, 1405, 1370, +503, 1405, 1377, +461, 1405, 1386, +397, 1405, 1397, +295, 1405, 1412, +295, 1405, 1425, +295, 1405, 1442, +295, 1405, 1463, +295, 1405, 1491, +350, 1416, 1546, +549, 1410, 1615, +549, 1390, 1682, +610, 1395, 1793, +721, 1413, 1898, +1134, 1362, 2004, +1151, 1350, 2108, +878, 1405, 2243, +927, 1369, 2376, +1617, 1196, 2472, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1091, 1568, 1658, +1091, 1569, 1659, +1089, 1569, 1660, +1088, 1569, 1661, +1086, 1570, 1663, +1083, 1571, 1665, +1079, 1572, 1668, +1074, 1574, 1673, +1074, 1572, 1680, +1074, 1569, 1690, +1074, 1567, 1702, +1074, 1567, 1718, +1060, 1567, 1740, +984, 1571, 1781, +984, 1563, 1832, +1008, 1552, 1891, +990, 1557, 1977, +1050, 1536, 2065, +1008, 1537, 2170, +810, 1530, 2268, +1184, 1494, 2382, +1680, 1435, 2473, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1472, 1701, 1853, +1471, 1701, 1854, +1469, 1702, 1855, +1467, 1702, 1856, +1464, 1703, 1858, +1461, 1703, 1861, +1456, 1704, 1864, +1449, 1705, 1868, +1443, 1705, 1873, +1442, 1703, 1880, +1442, 1700, 1888, +1442, 1696, 1899, +1439, 1691, 1913, +1417, 1685, 1933, +1417, 1696, 1979, +1379, 1697, 2020, +1390, 1690, 2066, +1256, 1672, 2126, +1172, 1682, 2221, +1227, 1647, 2296, +1526, 1636, 2386, +1786, 1634, 2474, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1800, 1814, 1976, +1800, 1814, 1976, +1799, 1814, 1977, +1799, 1814, 1978, +1797, 1814, 1979, +1796, 1814, 1981, +1795, 1814, 1983, +1793, 1814, 1986, +1794, 1814, 1988, +1796, 1814, 1992, +1792, 1814, 1998, +1785, 1814, 2007, +1776, 1815, 2018, +1760, 1821, 2034, +1741, 1815, 2050, +1739, 1806, 2078, +1704, 1816, 2125, +1714, 1805, 2166, +1662, 1793, 2234, +1683, 1796, 2305, +1765, 1797, 2390, +1871, 1786, 2475, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1965, 1958, 2031, +1965, 1958, 2031, +1964, 1958, 2031, +1964, 1958, 2032, +1963, 1958, 2032, +1962, 1958, 2034, +1961, 1958, 2035, +1960, 1958, 2037, +1959, 1958, 2039, +1958, 1958, 2042, +1956, 1958, 2047, +1953, 1958, 2053, +1951, 1958, 2060, +1944, 1960, 2068, +1938, 1965, 2081, +1932, 1967, 2110, +1924, 1968, 2156, +1905, 1961, 2189, +1920, 1966, 2240, +1890, 1966, 2318, +1932, 1954, 2393, +2043, 1964, 2481, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2121, 2121, 2069, +2121, 2121, 2070, +2121, 2121, 2070, +2122, 2121, 2070, +2122, 2121, 2070, +2122, 2121, 2071, +2122, 2121, 2071, +2123, 2121, 2071, +2123, 2122, 2074, +2123, 2122, 2077, +2123, 2124, 2081, +2123, 2125, 2086, +2122, 2127, 2093, +2119, 2127, 2101, +2119, 2127, 2110, +2119, 2131, 2131, +2114, 2135, 2167, +2107, 2129, 2205, +2112, 2133, 2255, +2123, 2133, 2316, +2148, 2132, 2397, +2215, 2145, 2485, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2356, 2129, +2370, 2356, 2131, +2369, 2357, 2133, +2369, 2358, 2137, +2370, 2359, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2161, +2372, 2358, 2193, +2371, 2358, 2227, +2375, 2356, 2273, +2387, 2359, 2337, +2411, 2367, 2406, +2465, 2384, 2499, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1969, +2681, 2656, 1972, +2681, 2656, 1975, +2681, 2656, 1974, +2681, 2656, 1973, +2680, 2655, 1971, +2680, 2655, 1969, +2679, 2654, 1969, +2679, 2655, 1990, +2678, 2657, 2010, +2677, 2655, 2027, +2675, 2651, 2050, +2677, 2656, 2121, +2681, 2656, 2208, +2688, 2660, 2305, +2695, 2665, 2407, +2715, 2678, 2527, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +603, 0, 0, +603, 0, 0, +603, 0, 0, +603, 0, 0, +603, 0, 28, +603, 0, 152, +603, 0, 280, +603, 0, 408, +603, 0, 537, +603, 0, 667, +603, 0, 797, +603, 0, 928, +556, 0, 1088, +249, 0, 1348, +249, 0, 1511, +537, 0, 1634, +912, 0, 1782, +1222, 0, 1890, +1561, 0, 2012, +1535, 174, 2167, +317, 987, 2341, +1325, 528, 2469, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +598, 0, 0, +601, 0, 0, +601, 0, 0, +601, 0, 0, +601, 0, 36, +601, 0, 159, +601, 0, 285, +601, 0, 412, +601, 0, 540, +601, 0, 669, +601, 0, 799, +601, 0, 930, +548, 0, 1089, +232, 0, 1349, +232, 0, 1511, +540, 0, 1635, +906, 0, 1782, +1221, 0, 1890, +1561, 0, 2013, +1534, 193, 2167, +317, 992, 2341, +1328, 531, 2469, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +591, 0, 0, +594, 0, 0, +597, 0, 0, +597, 0, 0, +597, 0, 48, +597, 0, 168, +597, 0, 291, +597, 0, 417, +597, 0, 544, +597, 0, 672, +597, 0, 801, +597, 0, 931, +544, 0, 1090, +208, 0, 1349, +208, 0, 1512, +544, 0, 1635, +897, 0, 1781, +1221, 0, 1891, +1560, 0, 2013, +1532, 217, 2168, +317, 998, 2341, +1333, 535, 2469, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +582, 0, 0, +585, 0, 0, +588, 0, 0, +593, 0, 0, +593, 0, 63, +593, 0, 180, +593, 0, 300, +593, 0, 424, +593, 0, 549, +593, 0, 676, +593, 0, 804, +593, 0, 933, +539, 0, 1091, +175, 0, 1351, +175, 0, 1512, +549, 0, 1636, +884, 0, 1781, +1220, 0, 1891, +1560, 0, 2014, +1530, 248, 2168, +317, 1005, 2342, +1339, 540, 2469, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +569, 0, 0, +572, 0, 0, +575, 0, 0, +580, 0, 0, +586, 0, 83, +586, 0, 195, +586, 0, 312, +586, 0, 433, +586, 0, 556, +586, 0, 681, +586, 0, 808, +586, 0, 936, +532, 0, 1093, +125, 0, 1352, +125, 0, 1513, +556, 0, 1637, +867, 0, 1781, +1218, 0, 1891, +1559, 0, 2015, +1526, 286, 2168, +317, 1015, 2342, +1348, 547, 2469, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +551, 0, 0, +554, 0, 0, +558, 0, 0, +563, 0, 0, +569, 0, 83, +578, 0, 215, +578, 0, 327, +578, 0, 444, +578, 0, 564, +578, 0, 688, +578, 0, 813, +578, 0, 940, +522, 0, 1096, +50, 30, 1353, +50, 30, 1514, +564, 0, 1639, +844, 0, 1780, +1216, 0, 1893, +1558, 0, 2017, +1522, 333, 2169, +317, 1028, 2343, +1359, 556, 2469, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +526, 4, 0, +529, 0, 0, +533, 0, 0, +538, 0, 0, +545, 0, 83, +554, 0, 215, +566, 0, 347, +566, 0, 459, +566, 0, 576, +566, 0, 697, +566, 0, 820, +566, 0, 946, +509, 0, 1100, +0, 163, 1355, +0, 163, 1516, +576, 32, 1641, +810, 0, 1779, +1213, 0, 1894, +1557, 32, 2019, +1516, 388, 2170, +317, 1045, 2344, +1373, 568, 2469, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +490, 144, 0, +494, 137, 0, +498, 127, 0, +504, 114, 0, +511, 96, 83, +521, 70, 215, +534, 34, 347, +550, 0, 479, +550, 0, 591, +550, 0, 708, +550, 0, 829, +550, 0, 952, +491, 52, 1105, +0, 295, 1358, +0, 295, 1518, +591, 164, 1644, +761, 0, 1778, +1209, 0, 1896, +1555, 164, 2021, +1508, 454, 2170, +317, 1066, 2345, +1391, 584, 2469, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +438, 281, 0, +441, 276, 0, +446, 269, 0, +452, 259, 0, +461, 246, 83, +472, 227, 215, +486, 202, 347, +505, 166, 479, +528, 111, 611, +528, 111, 723, +528, 111, 840, +528, 111, 961, +465, 167, 1111, +0, 426, 1362, +0, 426, 1520, +611, 296, 1648, +685, 0, 1777, +1204, 111, 1898, +1552, 296, 2024, +1498, 528, 2172, +317, 1093, 2347, +1405, 655, 2469, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +438, 417, 0, +441, 413, 0, +446, 408, 0, +452, 401, 0, +461, 391, 83, +472, 378, 215, +486, 360, 347, +505, 334, 479, +528, 298, 611, +528, 390, 780, +528, 390, 884, +528, 390, 995, +465, 420, 1136, +0, 570, 1376, +0, 559, 1531, +611, 465, 1653, +688, 180, 1781, +1197, 244, 1902, +1529, 428, 2030, +1459, 683, 2178, +265, 1128, 2349, +1448, 678, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +438, 552, 0, +441, 549, 0, +446, 545, 0, +452, 540, 0, +461, 533, 83, +472, 523, 215, +486, 510, 347, +505, 492, 479, +528, 466, 611, +528, 532, 780, +528, 606, 937, +528, 606, 1037, +465, 626, 1167, +0, 726, 1395, +0, 691, 1544, +611, 622, 1662, +688, 441, 1786, +1211, 422, 1908, +1496, 560, 2038, +1403, 831, 2187, +186, 1169, 2352, +1499, 706, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +438, 686, 0, +441, 684, 0, +446, 681, 0, +452, 677, 0, +461, 672, 83, +472, 665, 215, +486, 655, 347, +505, 643, 479, +528, 624, 611, +528, 671, 780, +528, 728, 937, +528, 793, 1088, +465, 806, 1206, +0, 876, 1419, +0, 823, 1561, +611, 773, 1675, +688, 651, 1793, +1235, 593, 1916, +1448, 692, 2048, +1314, 975, 2199, +0, 1212, 2357, +1560, 742, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +441, 854, 85, +427, 854, 130, +432, 852, 185, +438, 850, 248, +447, 846, 322, +458, 841, 404, +473, 835, 496, +492, 826, 594, +516, 814, 700, +516, 845, 843, +516, 884, 983, +516, 932, 1121, +551, 980, 1257, +0, 1029, 1452, +0, 983, 1586, +630, 938, 1697, +697, 873, 1807, +1251, 800, 1930, +1381, 849, 2060, +1181, 1116, 2212, +0, 1254, 2365, +1619, 811, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +719, 1144, 968, +711, 1144, 975, +700, 1144, 984, +685, 1144, 996, +664, 1144, 1011, +635, 1144, 1030, +592, 1144, 1055, +529, 1144, 1086, +426, 1144, 1125, +426, 1150, 1168, +426, 1170, 1242, +426, 1196, 1325, +469, 1224, 1417, +681, 1219, 1512, +681, 1190, 1631, +741, 1186, 1751, +750, 1205, 1859, +1158, 1153, 1968, +1243, 1131, 2078, +1031, 1271, 2228, +914, 1282, 2369, +1608, 1020, 2470, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +719, 1398, 1351, +711, 1398, 1354, +700, 1398, 1358, +685, 1398, 1363, +664, 1398, 1370, +635, 1398, 1379, +592, 1398, 1390, +529, 1398, 1406, +426, 1398, 1425, +426, 1398, 1442, +426, 1398, 1463, +426, 1398, 1491, +469, 1409, 1546, +681, 1406, 1619, +681, 1387, 1686, +741, 1388, 1796, +750, 1416, 1900, +1164, 1366, 2006, +1151, 1350, 2107, +878, 1405, 2243, +998, 1362, 2375, +1620, 1201, 2472, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1148, 1563, 1662, +1147, 1564, 1663, +1146, 1564, 1663, +1145, 1565, 1665, +1143, 1565, 1667, +1140, 1566, 1669, +1137, 1568, 1672, +1133, 1569, 1676, +1126, 1572, 1682, +1126, 1569, 1691, +1126, 1567, 1704, +1126, 1567, 1720, +1114, 1567, 1742, +1017, 1569, 1778, +1017, 1561, 1829, +1046, 1552, 1893, +1045, 1557, 1979, +1092, 1536, 2064, +1032, 1537, 2170, +810, 1533, 2268, +1205, 1491, 2382, +1680, 1432, 2474, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1481, 1699, 1851, +1480, 1700, 1852, +1478, 1700, 1853, +1476, 1700, 1855, +1473, 1701, 1857, +1470, 1702, 1859, +1465, 1703, 1863, +1458, 1704, 1867, +1449, 1705, 1873, +1448, 1703, 1880, +1448, 1700, 1888, +1448, 1696, 1899, +1445, 1691, 1913, +1423, 1685, 1934, +1423, 1696, 1979, +1383, 1695, 2019, +1396, 1691, 2067, +1278, 1672, 2126, +1188, 1684, 2221, +1246, 1647, 2296, +1529, 1638, 2386, +1793, 1636, 2474, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1805, 1813, 1975, +1805, 1813, 1975, +1805, 1813, 1976, +1804, 1813, 1977, +1803, 1813, 1978, +1802, 1813, 1979, +1800, 1813, 1982, +1798, 1813, 1984, +1796, 1813, 1988, +1797, 1813, 1992, +1793, 1813, 1998, +1787, 1813, 2007, +1777, 1813, 2018, +1763, 1819, 2033, +1745, 1813, 2049, +1744, 1807, 2077, +1710, 1816, 2126, +1718, 1804, 2166, +1664, 1793, 2234, +1690, 1798, 2306, +1770, 1797, 2390, +1871, 1786, 2475, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1968, 1958, 2031, +1968, 1958, 2031, +1967, 1958, 2032, +1967, 1958, 2032, +1966, 1958, 2033, +1965, 1958, 2034, +1964, 1958, 2036, +1963, 1958, 2038, +1961, 1958, 2040, +1960, 1958, 2043, +1958, 1958, 2048, +1955, 1958, 2054, +1953, 1958, 2061, +1945, 1959, 2068, +1939, 1964, 2081, +1934, 1966, 2107, +1928, 1969, 2157, +1905, 1959, 2189, +1920, 1965, 2239, +1893, 1965, 2317, +1933, 1954, 2393, +2043, 1964, 2481, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2122, 2122, 2070, +2122, 2122, 2070, +2122, 2122, 2071, +2122, 2122, 2071, +2122, 2122, 2071, +2123, 2122, 2071, +2123, 2122, 2072, +2124, 2122, 2072, +2124, 2122, 2073, +2124, 2122, 2076, +2124, 2124, 2080, +2124, 2125, 2086, +2124, 2127, 2093, +2119, 2127, 2101, +2119, 2127, 2110, +2120, 2131, 2130, +2116, 2135, 2169, +2108, 2128, 2204, +2113, 2132, 2254, +2124, 2133, 2316, +2148, 2133, 2397, +2216, 2146, 2485, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2355, 2129, +2371, 2356, 2131, +2370, 2357, 2133, +2370, 2357, 2137, +2371, 2358, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2370, 2358, 2161, +2373, 2358, 2193, +2372, 2358, 2227, +2376, 2357, 2273, +2388, 2360, 2337, +2411, 2367, 2406, +2465, 2385, 2499, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2680, 2654, 1962, +2680, 2655, 1962, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1966, +2681, 2655, 1968, +2681, 2656, 1970, +2681, 2656, 1974, +2681, 2656, 1972, +2681, 2655, 1970, +2680, 2655, 1969, +2680, 2654, 1966, +2679, 2654, 1967, +2679, 2655, 1987, +2677, 2657, 2008, +2677, 2656, 2029, +2675, 2652, 2050, +2677, 2656, 2121, +2681, 2656, 2208, +2688, 2660, 2306, +2695, 2665, 2407, +2715, 2678, 2527, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +737, 0, 0, +737, 0, 0, +737, 0, 0, +737, 0, 0, +737, 0, 28, +737, 0, 152, +737, 0, 280, +737, 0, 408, +737, 0, 537, +737, 0, 667, +737, 0, 797, +737, 0, 928, +703, 0, 1088, +438, 0, 1361, +394, 0, 1525, +667, 0, 1634, +977, 0, 1782, +1248, 0, 1893, +1561, 0, 2015, +1525, 291, 2172, +265, 987, 2341, +1385, 462, 2468, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +734, 0, 0, +736, 0, 0, +736, 0, 0, +736, 0, 0, +736, 0, 36, +736, 0, 159, +736, 0, 285, +736, 0, 412, +736, 0, 540, +736, 0, 669, +736, 0, 799, +736, 0, 930, +697, 0, 1089, +427, 0, 1361, +381, 0, 1525, +669, 0, 1635, +971, 0, 1782, +1248, 0, 1893, +1561, 0, 2015, +1524, 306, 2173, +265, 992, 2341, +1388, 465, 2468, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +729, 0, 0, +730, 0, 0, +733, 0, 0, +733, 0, 0, +733, 0, 48, +733, 0, 168, +733, 0, 291, +733, 0, 417, +733, 0, 544, +733, 0, 672, +733, 0, 801, +733, 0, 931, +694, 0, 1090, +412, 0, 1362, +365, 0, 1526, +672, 0, 1635, +963, 0, 1782, +1247, 0, 1894, +1560, 0, 2016, +1522, 325, 2173, +265, 998, 2341, +1392, 470, 2468, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +722, 0, 0, +723, 0, 0, +726, 0, 0, +730, 0, 0, +730, 0, 63, +730, 0, 180, +730, 0, 300, +730, 0, 424, +730, 0, 549, +730, 0, 676, +730, 0, 804, +730, 0, 933, +690, 0, 1091, +391, 0, 1363, +341, 0, 1526, +676, 0, 1636, +953, 0, 1781, +1245, 0, 1894, +1560, 0, 2017, +1519, 349, 2173, +265, 1005, 2342, +1398, 476, 2468, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +712, 0, 0, +714, 0, 0, +717, 0, 0, +720, 0, 0, +725, 0, 83, +725, 0, 195, +725, 0, 312, +725, 0, 433, +725, 0, 556, +725, 0, 681, +725, 0, 808, +725, 0, 936, +685, 0, 1093, +361, 0, 1364, +307, 0, 1527, +681, 0, 1637, +939, 0, 1781, +1244, 0, 1895, +1559, 0, 2018, +1516, 380, 2173, +265, 1015, 2342, +1405, 484, 2468, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +699, 0, 0, +701, 0, 0, +704, 0, 0, +708, 0, 0, +712, 0, 83, +719, 0, 215, +719, 0, 327, +719, 0, 444, +719, 0, 564, +719, 0, 688, +719, 0, 813, +719, 0, 940, +678, 0, 1096, +317, 30, 1365, +258, 30, 1528, +688, 0, 1639, +918, 0, 1780, +1242, 0, 1896, +1558, 0, 2019, +1512, 419, 2174, +265, 1028, 2343, +1415, 494, 2468, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +681, 4, 0, +683, 0, 0, +686, 0, 0, +690, 0, 0, +695, 0, 83, +702, 0, 215, +710, 0, 347, +710, 0, 459, +710, 0, 576, +710, 0, 697, +710, 0, 820, +710, 0, 946, +669, 0, 1100, +251, 163, 1367, +182, 163, 1530, +697, 32, 1641, +890, 0, 1779, +1239, 0, 1897, +1557, 32, 2021, +1506, 465, 2175, +265, 1045, 2344, +1427, 508, 2468, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +656, 144, 0, +658, 137, 0, +661, 127, 0, +665, 114, 0, +670, 96, 83, +678, 70, 215, +686, 34, 347, +699, 0, 479, +699, 0, 591, +699, 0, 708, +699, 0, 829, +699, 0, 952, +656, 52, 1105, +145, 295, 1370, +56, 295, 1531, +708, 164, 1644, +849, 0, 1778, +1236, 0, 1899, +1555, 164, 2023, +1498, 521, 2175, +265, 1066, 2345, +1443, 526, 2468, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +620, 281, 0, +623, 276, 0, +626, 269, 0, +630, 259, 0, +636, 246, 83, +643, 227, 215, +653, 202, 347, +666, 166, 479, +683, 111, 611, +683, 111, 723, +683, 111, 840, +683, 111, 961, +639, 167, 1111, +0, 426, 1374, +0, 426, 1534, +723, 296, 1648, +788, 0, 1777, +1231, 111, 1901, +1552, 296, 2027, +1487, 586, 2177, +265, 1093, 2347, +1456, 606, 2469, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +567, 417, 0, +570, 413, 0, +573, 408, 0, +578, 401, 0, +585, 391, 83, +593, 378, 215, +604, 360, 347, +618, 334, 479, +637, 298, 611, +660, 244, 743, +660, 244, 856, +660, 244, 973, +614, 286, 1119, +0, 536, 1379, +0, 559, 1537, +743, 428, 1653, +797, 104, 1780, +1224, 244, 1904, +1549, 428, 2031, +1472, 660, 2178, +265, 1128, 2349, +1472, 699, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +567, 552, 0, +570, 549, 0, +573, 545, 0, +578, 540, 0, +585, 533, 83, +593, 523, 215, +604, 510, 347, +618, 492, 479, +637, 466, 611, +660, 430, 743, +660, 521, 912, +660, 521, 1017, +614, 545, 1152, +0, 703, 1397, +0, 691, 1550, +743, 597, 1662, +797, 399, 1786, +1238, 422, 1910, +1518, 560, 2039, +1417, 815, 2187, +186, 1169, 2352, +1521, 727, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +567, 686, 0, +570, 684, 0, +573, 681, 0, +578, 677, 0, +585, 672, 83, +593, 665, 215, +604, 655, 347, +618, 643, 479, +637, 624, 611, +660, 599, 743, +660, 664, 912, +660, 739, 1070, +614, 754, 1192, +0, 860, 1421, +0, 823, 1568, +743, 755, 1675, +797, 625, 1792, +1261, 593, 1918, +1472, 692, 2049, +1331, 963, 2199, +0, 1212, 2357, +1579, 761, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +569, 854, 85, +559, 854, 130, +563, 852, 185, +568, 850, 248, +574, 846, 322, +583, 841, 404, +594, 835, 496, +608, 826, 594, +627, 814, 700, +651, 797, 811, +651, 841, 960, +651, 893, 1104, +678, 945, 1245, +0, 1017, 1454, +0, 983, 1592, +758, 925, 1697, +804, 857, 1807, +1275, 800, 1931, +1408, 849, 2061, +1203, 1108, 2212, +0, 1254, 2365, +1635, 828, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +834, 1134, 954, +827, 1134, 961, +819, 1134, 970, +808, 1134, 982, +792, 1134, 998, +770, 1134, 1018, +739, 1134, 1043, +693, 1134, 1075, +625, 1134, 1115, +570, 1131, 1163, +570, 1152, 1237, +570, 1179, 1321, +601, 1208, 1413, +800, 1208, 1514, +767, 1185, 1636, +863, 1174, 1754, +863, 1195, 1861, +1192, 1157, 1970, +1257, 1131, 2078, +1043, 1269, 2229, +975, 1275, 2368, +1616, 1030, 2470, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +857, 1389, 1341, +851, 1389, 1344, +843, 1389, 1348, +832, 1389, 1353, +817, 1389, 1360, +797, 1389, 1369, +767, 1389, 1381, +725, 1389, 1397, +661, 1389, 1417, +559, 1389, 1442, +559, 1389, 1463, +559, 1389, 1491, +591, 1400, 1546, +794, 1400, 1623, +813, 1382, 1691, +874, 1379, 1799, +874, 1408, 1902, +1201, 1371, 2008, +1151, 1350, 2106, +878, 1405, 2245, +1078, 1352, 2375, +1623, 1208, 2472, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1214, 1557, 1667, +1213, 1557, 1668, +1212, 1558, 1669, +1211, 1558, 1670, +1209, 1559, 1672, +1207, 1560, 1674, +1205, 1561, 1677, +1201, 1563, 1681, +1195, 1565, 1686, +1188, 1569, 1694, +1188, 1567, 1706, +1188, 1567, 1722, +1177, 1567, 1744, +1072, 1567, 1776, +1057, 1558, 1825, +1094, 1552, 1894, +1094, 1557, 1981, +1142, 1536, 2063, +1061, 1537, 2170, +810, 1536, 2268, +1232, 1487, 2382, +1680, 1427, 2474, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1512, 1695, 1855, +1511, 1695, 1855, +1510, 1695, 1856, +1508, 1696, 1858, +1505, 1696, 1860, +1502, 1697, 1862, +1497, 1698, 1866, +1491, 1699, 1870, +1482, 1701, 1876, +1478, 1703, 1881, +1478, 1700, 1889, +1478, 1696, 1900, +1475, 1691, 1914, +1446, 1684, 1934, +1440, 1693, 1977, +1405, 1695, 2020, +1418, 1691, 2069, +1312, 1672, 2125, +1209, 1684, 2221, +1248, 1649, 2296, +1541, 1636, 2386, +1794, 1633, 2475, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1813, 1811, 1973, +1812, 1811, 1974, +1812, 1811, 1975, +1811, 1811, 1976, +1810, 1811, 1977, +1809, 1811, 1978, +1808, 1811, 1981, +1806, 1811, 1983, +1803, 1811, 1987, +1799, 1811, 1992, +1795, 1811, 1998, +1789, 1811, 2007, +1779, 1812, 2018, +1767, 1817, 2033, +1749, 1812, 2048, +1751, 1809, 2076, +1717, 1818, 2125, +1722, 1802, 2166, +1667, 1793, 2234, +1699, 1800, 2306, +1776, 1797, 2391, +1871, 1786, 2475, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1972, 1958, 2032, +1972, 1958, 2033, +1971, 1958, 2033, +1971, 1958, 2034, +1970, 1958, 2034, +1969, 1958, 2036, +1968, 1958, 2037, +1967, 1958, 2039, +1965, 1958, 2041, +1962, 1958, 2045, +1961, 1958, 2049, +1958, 1958, 2055, +1955, 1958, 2062, +1947, 1958, 2069, +1940, 1963, 2081, +1937, 1965, 2105, +1931, 1968, 2155, +1905, 1958, 2189, +1920, 1964, 2238, +1898, 1964, 2316, +1934, 1954, 2393, +2043, 1964, 2481, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2123, 2122, 2071, +2123, 2122, 2071, +2123, 2122, 2071, +2123, 2122, 2072, +2124, 2122, 2072, +2124, 2122, 2072, +2124, 2122, 2073, +2125, 2122, 2073, +2125, 2122, 2074, +2126, 2122, 2075, +2126, 2124, 2079, +2126, 2125, 2085, +2125, 2127, 2092, +2119, 2127, 2101, +2119, 2127, 2110, +2122, 2131, 2129, +2118, 2135, 2168, +2110, 2127, 2203, +2114, 2132, 2254, +2126, 2132, 2316, +2148, 2134, 2399, +2218, 2147, 2485, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2355, 2129, +2372, 2355, 2131, +2371, 2356, 2133, +2372, 2357, 2137, +2372, 2358, 2143, +2371, 2358, 2146, +2369, 2356, 2148, +2370, 2358, 2160, +2373, 2358, 2193, +2373, 2358, 2228, +2377, 2357, 2273, +2391, 2362, 2337, +2412, 2367, 2407, +2466, 2386, 2499, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2680, 2654, 1961, +2680, 2654, 1961, +2680, 2654, 1962, +2680, 2654, 1963, +2680, 2655, 1965, +2680, 2655, 1966, +2681, 2655, 1969, +2681, 2656, 1973, +2681, 2655, 1970, +2680, 2654, 1966, +2680, 2654, 1965, +2679, 2653, 1962, +2679, 2653, 1963, +2678, 2655, 1982, +2677, 2657, 2003, +2678, 2657, 2033, +2676, 2653, 2053, +2678, 2656, 2122, +2681, 2656, 2208, +2688, 2660, 2306, +2695, 2665, 2407, +2715, 2678, 2527, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +871, 0, 0, +871, 0, 0, +871, 0, 0, +871, 0, 0, +871, 0, 28, +871, 0, 152, +871, 0, 280, +871, 0, 408, +871, 0, 537, +871, 0, 667, +871, 0, 797, +871, 0, 928, +845, 0, 1088, +668, 0, 1361, +535, 0, 1543, +769, 0, 1643, +1048, 0, 1782, +1313, 0, 1897, +1561, 0, 2018, +1511, 412, 2179, +186, 987, 2341, +1454, 356, 2467, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +868, 0, 0, +869, 0, 0, +869, 0, 0, +869, 0, 0, +869, 0, 36, +869, 0, 159, +869, 0, 285, +869, 0, 412, +869, 0, 540, +869, 0, 669, +869, 0, 799, +869, 0, 930, +841, 0, 1089, +662, 0, 1361, +526, 0, 1543, +770, 0, 1643, +1043, 0, 1782, +1313, 0, 1897, +1561, 0, 2018, +1510, 423, 2179, +186, 992, 2341, +1457, 360, 2467, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +864, 0, 0, +866, 0, 0, +868, 0, 0, +868, 0, 0, +868, 0, 48, +868, 0, 168, +868, 0, 291, +868, 0, 417, +868, 0, 544, +868, 0, 672, +868, 0, 801, +868, 0, 931, +839, 0, 1090, +653, 0, 1362, +513, 0, 1544, +773, 0, 1644, +1036, 0, 1782, +1312, 0, 1897, +1560, 0, 2019, +1508, 438, 2179, +186, 998, 2341, +1461, 366, 2467, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +859, 0, 0, +861, 0, 0, +862, 0, 0, +865, 0, 0, +865, 0, 63, +865, 0, 180, +865, 0, 300, +865, 0, 424, +865, 0, 549, +865, 0, 676, +865, 0, 804, +865, 0, 933, +836, 0, 1091, +640, 0, 1363, +496, 0, 1544, +776, 0, 1645, +1027, 0, 1781, +1311, 0, 1898, +1560, 0, 2020, +1505, 457, 2180, +186, 1005, 2342, +1465, 373, 2467, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +852, 0, 0, +854, 0, 0, +856, 0, 0, +858, 0, 0, +862, 0, 83, +862, 0, 195, +862, 0, 312, +862, 0, 433, +862, 0, 556, +862, 0, 681, +862, 0, 808, +862, 0, 936, +833, 0, 1093, +623, 0, 1364, +473, 0, 1545, +780, 0, 1646, +1015, 0, 1781, +1310, 0, 1899, +1559, 0, 2021, +1502, 482, 2180, +186, 1015, 2342, +1472, 383, 2467, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +843, 0, 0, +844, 0, 0, +846, 0, 0, +849, 0, 0, +852, 0, 83, +857, 0, 215, +857, 0, 327, +857, 0, 444, +857, 0, 564, +857, 0, 688, +857, 0, 813, +857, 0, 940, +827, 0, 1096, +599, 30, 1365, +439, 30, 1546, +785, 0, 1648, +998, 0, 1780, +1308, 0, 1900, +1558, 0, 2022, +1497, 512, 2180, +186, 1028, 2343, +1480, 397, 2467, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +830, 4, 0, +831, 0, 0, +833, 0, 0, +836, 0, 0, +839, 0, 83, +844, 0, 215, +851, 0, 347, +851, 0, 459, +851, 0, 576, +851, 0, 697, +851, 0, 820, +851, 0, 946, +821, 0, 1100, +565, 163, 1367, +390, 163, 1547, +793, 32, 1650, +974, 0, 1779, +1306, 0, 1901, +1557, 32, 2024, +1491, 551, 2181, +186, 1045, 2344, +1491, 413, 2467, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +812, 144, 0, +813, 137, 0, +815, 127, 0, +818, 114, 0, +822, 96, 83, +827, 70, 215, +834, 34, 347, +842, 0, 479, +842, 0, 591, +842, 0, 708, +842, 0, 829, +842, 0, 952, +812, 52, 1105, +515, 295, 1370, +314, 295, 1549, +802, 164, 1653, +940, 0, 1778, +1302, 0, 1903, +1555, 164, 2027, +1483, 597, 2182, +186, 1066, 2345, +1505, 435, 2467, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +787, 281, 0, +788, 276, 0, +790, 269, 0, +793, 259, 0, +797, 246, 83, +803, 227, 215, +809, 202, 347, +819, 166, 479, +831, 111, 611, +831, 111, 723, +831, 111, 840, +831, 111, 961, +799, 167, 1111, +438, 426, 1374, +188, 426, 1552, +814, 296, 1657, +891, 0, 1777, +1298, 111, 1905, +1552, 296, 2030, +1472, 653, 2183, +186, 1093, 2347, +1516, 532, 2467, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +750, 417, 0, +752, 413, 0, +755, 408, 0, +758, 401, 0, +762, 391, 83, +768, 378, 215, +775, 360, 347, +785, 334, 479, +798, 298, 611, +815, 244, 743, +815, 244, 856, +815, 244, 973, +782, 286, 1119, +345, 536, 1379, +0, 559, 1555, +831, 428, 1662, +899, 104, 1780, +1292, 244, 1908, +1549, 428, 2034, +1456, 718, 2185, +186, 1128, 2349, +1530, 640, 2468, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +697, 552, 0, +699, 549, 0, +702, 545, 0, +705, 540, 0, +710, 533, 83, +717, 523, 215, +725, 510, 347, +736, 492, 479, +750, 466, 611, +769, 430, 743, +792, 376, 875, +792, 376, 988, +758, 407, 1131, +280, 611, 1385, +0, 691, 1559, +799, 583, 1666, +916, 342, 1786, +1257, 324, 1907, +1545, 560, 2040, +1434, 792, 2187, +186, 1169, 2352, +1547, 752, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +697, 686, 0, +699, 684, 0, +702, 681, 0, +705, 677, 0, +710, 672, 83, +717, 665, 215, +725, 655, 347, +736, 643, 479, +750, 624, 611, +769, 599, 743, +792, 562, 875, +792, 654, 1044, +758, 672, 1172, +280, 796, 1409, +0, 823, 1576, +799, 745, 1680, +916, 591, 1792, +1279, 529, 1915, +1502, 692, 2050, +1352, 947, 2199, +0, 1212, 2357, +1603, 785, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +699, 854, 85, +691, 854, 130, +694, 852, 185, +698, 850, 248, +702, 846, 322, +709, 841, 404, +717, 835, 496, +728, 826, 594, +743, 814, 700, +762, 797, 811, +786, 774, 927, +786, 834, 1081, +805, 893, 1228, +403, 973, 1443, +0, 983, 1599, +812, 918, 1701, +921, 837, 1807, +1293, 760, 1928, +1442, 849, 2062, +1230, 1096, 2212, +0, 1254, 2365, +1657, 848, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +910, 1134, 954, +905, 1134, 961, +898, 1134, 970, +889, 1134, 982, +875, 1134, 998, +857, 1134, 1018, +832, 1134, 1043, +795, 1134, 1075, +741, 1134, 1115, +699, 1131, 1163, +726, 1120, 1220, +726, 1149, 1307, +748, 1179, 1402, +901, 1179, 1504, +767, 1185, 1644, +906, 1170, 1757, +968, 1186, 1861, +1214, 1140, 1967, +1304, 1131, 2079, +1082, 1261, 2229, +975, 1275, 2368, +1638, 1044, 2470, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +993, 1376, 1327, +989, 1376, 1330, +983, 1376, 1334, +975, 1376, 1340, +964, 1376, 1347, +949, 1376, 1356, +928, 1376, 1368, +899, 1376, 1385, +857, 1376, 1405, +793, 1376, 1431, +691, 1376, 1463, +691, 1376, 1491, +715, 1388, 1546, +877, 1388, 1623, +945, 1376, 1697, +997, 1370, 1804, +1006, 1396, 1906, +1223, 1377, 2010, +1151, 1350, 2105, +878, 1405, 2247, +1167, 1339, 2373, +1626, 1218, 2473, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1284, 1548, 1666, +1284, 1549, 1666, +1283, 1549, 1667, +1282, 1550, 1668, +1281, 1550, 1670, +1279, 1551, 1673, +1276, 1553, 1675, +1273, 1555, 1680, +1269, 1557, 1685, +1263, 1560, 1692, +1239, 1562, 1707, +1239, 1562, 1723, +1229, 1562, 1745, +1136, 1562, 1777, +1127, 1554, 1826, +1162, 1550, 1897, +1168, 1552, 1984, +1181, 1539, 2065, +1075, 1537, 2169, +810, 1538, 2270, +1285, 1479, 2381, +1681, 1429, 2475, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1553, 1689, 1859, +1552, 1689, 1860, +1551, 1689, 1861, +1549, 1690, 1862, +1547, 1690, 1864, +1544, 1691, 1867, +1539, 1692, 1870, +1534, 1693, 1874, +1526, 1695, 1880, +1522, 1697, 1885, +1517, 1700, 1891, +1517, 1696, 1902, +1515, 1691, 1916, +1488, 1684, 1935, +1461, 1690, 1974, +1430, 1693, 2019, +1446, 1691, 2070, +1360, 1672, 2128, +1236, 1684, 2221, +1248, 1653, 2296, +1559, 1632, 2386, +1794, 1630, 2475, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1821, 1809, 1972, +1820, 1809, 1972, +1820, 1809, 1973, +1819, 1809, 1974, +1818, 1809, 1975, +1817, 1809, 1977, +1816, 1809, 1979, +1813, 1809, 1982, +1811, 1809, 1986, +1807, 1809, 1990, +1800, 1811, 1998, +1793, 1811, 2007, +1784, 1811, 2018, +1772, 1817, 2033, +1754, 1811, 2049, +1756, 1809, 2076, +1721, 1816, 2124, +1728, 1804, 2168, +1675, 1795, 2234, +1712, 1800, 2308, +1779, 1799, 2391, +1880, 1789, 2475, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1977, 1958, 2034, +1977, 1958, 2034, +1976, 1958, 2035, +1976, 1958, 2035, +1975, 1958, 2036, +1974, 1958, 2037, +1973, 1958, 2038, +1972, 1958, 2040, +1970, 1958, 2043, +1968, 1958, 2046, +1964, 1958, 2050, +1962, 1958, 2056, +1959, 1958, 2063, +1950, 1958, 2070, +1942, 1961, 2081, +1940, 1963, 2103, +1935, 1966, 2152, +1912, 1959, 2190, +1920, 1962, 2236, +1904, 1962, 2314, +1936, 1954, 2394, +2043, 1964, 2481, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2124, 2124, 2073, +2124, 2124, 2073, +2124, 2124, 2073, +2125, 2124, 2073, +2125, 2124, 2073, +2125, 2124, 2074, +2125, 2124, 2074, +2126, 2124, 2075, +2126, 2124, 2076, +2127, 2124, 2076, +2129, 2124, 2078, +2129, 2125, 2083, +2128, 2127, 2090, +2122, 2127, 2100, +2119, 2127, 2110, +2123, 2131, 2129, +2120, 2135, 2167, +2113, 2128, 2205, +2115, 2130, 2253, +2128, 2131, 2316, +2148, 2135, 2400, +2220, 2148, 2485, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2355, 2129, +2372, 2355, 2131, +2372, 2355, 2133, +2373, 2356, 2137, +2374, 2357, 2143, +2372, 2357, 2146, +2369, 2356, 2148, +2370, 2358, 2159, +2374, 2358, 2192, +2374, 2358, 2228, +2379, 2358, 2273, +2393, 2364, 2337, +2413, 2367, 2408, +2467, 2387, 2498, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2680, 2654, 1959, +2680, 2654, 1959, +2680, 2654, 1960, +2680, 2654, 1961, +2680, 2654, 1963, +2680, 2655, 1965, +2680, 2655, 1968, +2680, 2655, 1971, +2680, 2655, 1969, +2680, 2654, 1965, +2679, 2653, 1959, +2679, 2652, 1957, +2678, 2652, 1958, +2678, 2654, 1977, +2677, 2657, 1996, +2678, 2657, 2031, +2677, 2654, 2057, +2678, 2657, 2122, +2682, 2656, 2208, +2688, 2660, 2307, +2695, 2665, 2407, +2715, 2678, 2527, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +1004, 0, 0, +1004, 0, 0, +1004, 0, 0, +1004, 0, 0, +1004, 0, 28, +1004, 0, 152, +1004, 0, 280, +1004, 0, 408, +1004, 0, 537, +1004, 0, 667, +1004, 0, 797, +1004, 0, 928, +985, 0, 1088, +862, 0, 1361, +674, 0, 1566, +856, 0, 1661, +1128, 0, 1782, +1394, 0, 1902, +1561, 0, 2022, +1491, 535, 2188, +220, 987, 2343, +1533, 158, 2465, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1002, 0, 0, +1003, 0, 0, +1003, 0, 0, +1003, 0, 0, +1003, 0, 36, +1003, 0, 159, +1003, 0, 285, +1003, 0, 412, +1003, 0, 540, +1003, 0, 669, +1003, 0, 799, +1003, 0, 930, +982, 0, 1089, +858, 0, 1361, +667, 0, 1566, +858, 0, 1662, +1124, 0, 1782, +1393, 0, 1903, +1561, 0, 2022, +1490, 544, 2188, +220, 992, 2343, +1536, 164, 2465, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +999, 0, 0, +1000, 0, 0, +1002, 0, 0, +1002, 0, 0, +1002, 0, 48, +1002, 0, 168, +1002, 0, 291, +1002, 0, 417, +1002, 0, 544, +1002, 0, 672, +1002, 0, 801, +1002, 0, 931, +981, 0, 1090, +852, 0, 1362, +658, 0, 1567, +860, 0, 1662, +1118, 0, 1782, +1393, 0, 1903, +1560, 0, 2023, +1488, 556, 2188, +220, 998, 2343, +1539, 173, 2465, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +996, 0, 0, +996, 0, 0, +998, 0, 0, +1000, 0, 0, +1000, 0, 63, +1000, 0, 180, +1000, 0, 300, +1000, 0, 424, +1000, 0, 549, +1000, 0, 676, +1000, 0, 804, +1000, 0, 933, +979, 0, 1091, +844, 0, 1363, +645, 0, 1567, +862, 0, 1663, +1110, 0, 1781, +1392, 0, 1903, +1560, 0, 2024, +1486, 570, 2188, +220, 1005, 2344, +1543, 185, 2465, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +990, 0, 0, +991, 0, 0, +993, 0, 0, +995, 0, 0, +997, 0, 83, +997, 0, 195, +997, 0, 312, +997, 0, 433, +997, 0, 556, +997, 0, 681, +997, 0, 808, +997, 0, 936, +976, 0, 1093, +833, 0, 1364, +629, 0, 1568, +866, 0, 1664, +1100, 0, 1781, +1391, 0, 1904, +1559, 0, 2025, +1482, 590, 2189, +220, 1015, 2344, +1548, 200, 2465, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +983, 0, 0, +985, 0, 0, +986, 0, 0, +988, 0, 0, +991, 0, 83, +994, 0, 215, +994, 0, 327, +994, 0, 444, +994, 0, 564, +994, 0, 688, +994, 0, 813, +994, 0, 940, +973, 0, 1096, +819, 30, 1365, +605, 30, 1569, +871, 0, 1666, +1086, 0, 1780, +1390, 0, 1905, +1558, 0, 2026, +1477, 614, 2189, +220, 1028, 2345, +1555, 219, 2465, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +974, 4, 0, +975, 0, 0, +977, 0, 0, +979, 0, 0, +981, 0, 83, +985, 0, 215, +989, 0, 347, +989, 0, 459, +989, 0, 576, +989, 0, 697, +989, 0, 820, +989, 0, 946, +968, 0, 1100, +798, 163, 1367, +571, 163, 1570, +876, 32, 1668, +1067, 0, 1779, +1388, 0, 1906, +1557, 32, 2028, +1471, 645, 2190, +220, 1045, 2346, +1564, 244, 2465, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +961, 144, 0, +962, 137, 0, +963, 127, 0, +966, 114, 0, +968, 96, 83, +972, 70, 215, +977, 34, 347, +983, 0, 479, +983, 0, 591, +983, 0, 708, +983, 0, 829, +983, 0, 952, +961, 52, 1105, +769, 295, 1370, +522, 295, 1572, +884, 164, 1671, +1039, 0, 1778, +1385, 0, 1908, +1555, 164, 2031, +1462, 683, 2191, +220, 1066, 2347, +1576, 275, 2465, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +943, 281, 0, +944, 276, 0, +946, 269, 0, +948, 259, 0, +951, 246, 83, +955, 227, 215, +959, 202, 347, +966, 166, 479, +975, 111, 611, +975, 111, 723, +975, 111, 840, +975, 111, 961, +952, 167, 1111, +726, 426, 1374, +446, 426, 1574, +895, 296, 1674, +1000, 0, 1777, +1382, 111, 1910, +1552, 296, 2034, +1450, 729, 2192, +220, 1093, 2349, +1586, 407, 2466, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +917, 417, 0, +919, 413, 0, +920, 408, 0, +923, 401, 0, +926, 391, 83, +930, 378, 215, +935, 360, 347, +942, 334, 479, +951, 298, 611, +963, 244, 743, +963, 244, 856, +963, 244, 973, +940, 286, 1119, +679, 536, 1379, +320, 559, 1577, +908, 428, 1679, +1006, 104, 1780, +1377, 244, 1913, +1549, 428, 2038, +1434, 785, 2194, +220, 1128, 2351, +1598, 544, 2467, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +881, 552, 0, +883, 549, 0, +884, 545, 0, +887, 540, 0, +890, 533, 83, +894, 523, 215, +900, 510, 347, +908, 492, 479, +917, 466, 611, +930, 430, 743, +947, 376, 875, +947, 376, 988, +923, 407, 1131, +649, 611, 1385, +67, 691, 1581, +882, 583, 1684, +1020, 342, 1786, +1348, 324, 1912, +1545, 560, 2044, +1411, 850, 2196, +220, 1169, 2354, +1613, 680, 2468, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +828, 686, 0, +829, 684, 0, +831, 681, 0, +834, 677, 0, +838, 672, 83, +842, 665, 215, +849, 655, 347, +857, 643, 479, +868, 624, 611, +883, 599, 743, +901, 562, 875, +925, 508, 1007, +899, 532, 1145, +605, 694, 1393, +0, 823, 1587, +799, 745, 1688, +1039, 540, 1792, +1299, 403, 1909, +1539, 692, 2052, +1379, 925, 2199, +0, 1212, 2357, +1633, 815, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +829, 854, 85, +823, 854, 130, +825, 852, 185, +828, 850, 248, +832, 846, 322, +837, 841, 404, +843, 835, 496, +852, 826, 594, +863, 814, 700, +877, 797, 811, +896, 774, 927, +920, 741, 1047, +934, 812, 1203, +669, 906, 1428, +0, 983, 1610, +812, 918, 1709, +1043, 809, 1807, +1313, 689, 1923, +1484, 849, 2064, +1265, 1080, 2212, +0, 1254, 2365, +1683, 875, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +996, 1134, 954, +992, 1134, 961, +986, 1134, 970, +979, 1134, 982, +968, 1134, 998, +953, 1134, 1018, +932, 1134, 1043, +903, 1134, 1075, +861, 1134, 1115, +829, 1131, 1163, +850, 1120, 1220, +876, 1105, 1286, +892, 1138, 1385, +1008, 1138, 1491, +767, 1185, 1653, +906, 1170, 1765, +1078, 1173, 1861, +1237, 1110, 1962, +1360, 1131, 2081, +1129, 1250, 2229, +975, 1275, 2368, +1666, 1061, 2470, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1129, 1359, 1308, +1126, 1359, 1311, +1121, 1359, 1315, +1115, 1359, 1321, +1107, 1359, 1328, +1097, 1359, 1338, +1082, 1359, 1351, +1061, 1359, 1367, +1032, 1359, 1389, +989, 1359, 1416, +926, 1359, 1449, +823, 1359, 1491, +841, 1371, 1546, +969, 1371, 1623, +1077, 1367, 1705, +1117, 1361, 1811, +1138, 1380, 1911, +1246, 1386, 2012, +1151, 1350, 2103, +878, 1405, 2249, +1204, 1332, 2374, +1631, 1230, 2474, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1361, 1536, 1656, +1360, 1537, 1657, +1360, 1537, 1658, +1359, 1538, 1659, +1358, 1539, 1661, +1356, 1540, 1663, +1354, 1541, 1667, +1351, 1543, 1671, +1347, 1545, 1676, +1342, 1549, 1684, +1323, 1550, 1699, +1283, 1550, 1723, +1274, 1550, 1745, +1190, 1550, 1777, +1220, 1548, 1833, +1249, 1544, 1903, +1265, 1540, 1988, +1206, 1545, 2067, +1075, 1537, 2167, +810, 1538, 2272, +1313, 1474, 2382, +1686, 1437, 2475, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1603, 1680, 1865, +1602, 1680, 1865, +1600, 1680, 1867, +1599, 1681, 1868, +1597, 1681, 1870, +1594, 1682, 1872, +1590, 1683, 1876, +1585, 1684, 1880, +1578, 1686, 1886, +1575, 1689, 1891, +1571, 1692, 1897, +1565, 1696, 1905, +1563, 1691, 1919, +1538, 1684, 1938, +1489, 1686, 1969, +1460, 1689, 2014, +1482, 1691, 2072, +1418, 1672, 2133, +1270, 1684, 2221, +1248, 1657, 2296, +1563, 1627, 2386, +1794, 1625, 2476, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1830, 1805, 1969, +1830, 1805, 1970, +1829, 1805, 1971, +1829, 1805, 1972, +1828, 1805, 1973, +1827, 1805, 1974, +1825, 1805, 1977, +1823, 1805, 1979, +1821, 1805, 1983, +1817, 1805, 1988, +1810, 1807, 1996, +1800, 1811, 2007, +1791, 1811, 2018, +1779, 1817, 2033, +1762, 1811, 2051, +1763, 1809, 2078, +1725, 1813, 2122, +1736, 1807, 2171, +1689, 1798, 2234, +1727, 1800, 2309, +1778, 1800, 2391, +1894, 1792, 2475, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1983, 1958, 2036, +1983, 1958, 2036, +1983, 1958, 2037, +1983, 1958, 2037, +1982, 1958, 2038, +1981, 1958, 2039, +1980, 1958, 2040, +1979, 1958, 2042, +1977, 1958, 2045, +1974, 1958, 2048, +1971, 1958, 2052, +1966, 1958, 2058, +1963, 1958, 2065, +1955, 1958, 2072, +1945, 1959, 2081, +1942, 1961, 2103, +1940, 1963, 2147, +1922, 1962, 2193, +1920, 1960, 2233, +1912, 1960, 2312, +1943, 1954, 2394, +2043, 1964, 2481, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2126, 2125, 2075, +2126, 2125, 2075, +2126, 2125, 2075, +2126, 2125, 2075, +2126, 2125, 2075, +2127, 2125, 2076, +2127, 2125, 2076, +2127, 2125, 2076, +2128, 2125, 2077, +2129, 2125, 2078, +2130, 2125, 2080, +2132, 2125, 2082, +2131, 2127, 2089, +2125, 2127, 2098, +2119, 2127, 2110, +2123, 2131, 2129, +2124, 2135, 2165, +2118, 2130, 2208, +2117, 2129, 2251, +2132, 2129, 2316, +2154, 2135, 2400, +2222, 2149, 2485, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2371, 2355, 2125, +2371, 2355, 2125, +2371, 2355, 2125, +2371, 2355, 2126, +2372, 2355, 2126, +2372, 2355, 2127, +2372, 2355, 2127, +2372, 2355, 2128, +2372, 2355, 2130, +2373, 2355, 2132, +2374, 2355, 2134, +2374, 2355, 2136, +2375, 2356, 2142, +2373, 2356, 2145, +2371, 2355, 2148, +2372, 2357, 2159, +2375, 2358, 2191, +2375, 2358, 2229, +2381, 2358, 2273, +2396, 2366, 2336, +2413, 2367, 2408, +2468, 2388, 2498, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2679, 2653, 1956, +2679, 2653, 1957, +2679, 2653, 1958, +2679, 2654, 1959, +2679, 2654, 1961, +2680, 2654, 1962, +2680, 2654, 1965, +2680, 2655, 1969, +2680, 2654, 1966, +2679, 2653, 1962, +2679, 2652, 1957, +2678, 2651, 1950, +2678, 2650, 1950, +2677, 2652, 1970, +2676, 2657, 1988, +2678, 2657, 2023, +2679, 2655, 2063, +2679, 2657, 2122, +2682, 2656, 2208, +2688, 2660, 2308, +2695, 2665, 2407, +2715, 2678, 2527, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +1146, 0, 0, +1146, 0, 0, +1146, 0, 0, +1146, 0, 46, +1146, 0, 140, +1146, 0, 240, +1146, 0, 347, +1146, 0, 460, +1146, 0, 576, +1146, 0, 697, +1146, 0, 820, +1146, 0, 946, +1143, 0, 1084, +1060, 0, 1359, +918, 0, 1574, +981, 0, 1683, +1223, 0, 1785, +1476, 0, 1909, +1569, 0, 2028, +1478, 645, 2197, +391, 989, 2347, +1611, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1146, 0, 0, +1146, 0, 0, +1146, 0, 27, +1146, 0, 101, +1146, 0, 185, +1146, 0, 277, +1146, 0, 376, +1146, 0, 482, +1146, 0, 594, +1146, 0, 710, +1146, 0, 830, +1146, 0, 953, +1142, 0, 1089, +1059, 0, 1361, +917, 0, 1576, +981, 0, 1683, +1223, 0, 1786, +1476, 0, 1910, +1569, 0, 2029, +1477, 656, 2197, +395, 992, 2347, +1611, 0, 2464, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1143, 0, 0, +1143, 0, 0, +1144, 0, 38, +1144, 0, 111, +1144, 0, 193, +1144, 0, 284, +1144, 0, 382, +1144, 0, 487, +1144, 0, 598, +1144, 0, 713, +1144, 0, 833, +1144, 0, 955, +1141, 0, 1090, +1055, 0, 1362, +911, 0, 1576, +982, 0, 1684, +1219, 0, 1785, +1475, 0, 1911, +1568, 0, 2029, +1475, 665, 2197, +395, 998, 2347, +1614, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1141, 0, 0, +1141, 0, 0, +1142, 0, 38, +1143, 0, 124, +1143, 0, 204, +1143, 0, 293, +1143, 0, 389, +1143, 0, 493, +1143, 0, 602, +1143, 0, 717, +1143, 0, 835, +1143, 0, 957, +1140, 0, 1091, +1050, 0, 1363, +904, 0, 1577, +984, 0, 1685, +1213, 0, 1785, +1474, 0, 1911, +1568, 0, 2030, +1472, 676, 2198, +395, 1005, 2348, +1617, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1137, 0, 0, +1137, 0, 0, +1138, 0, 38, +1139, 0, 124, +1141, 0, 219, +1141, 0, 305, +1141, 0, 399, +1141, 0, 501, +1141, 0, 608, +1141, 0, 722, +1141, 0, 839, +1141, 0, 960, +1138, 0, 1093, +1043, 0, 1364, +895, 0, 1577, +987, 0, 1686, +1205, 0, 1784, +1474, 0, 1912, +1567, 0, 2031, +1469, 692, 2198, +395, 1015, 2348, +1622, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1132, 0, 0, +1132, 0, 0, +1133, 0, 38, +1134, 0, 124, +1136, 0, 219, +1139, 0, 320, +1139, 0, 411, +1139, 0, 511, +1139, 0, 616, +1139, 0, 728, +1139, 0, 844, +1139, 0, 963, +1136, 0, 1096, +1034, 0, 1365, +882, 0, 1578, +990, 0, 1687, +1194, 0, 1784, +1472, 0, 1913, +1566, 0, 2032, +1464, 711, 2199, +395, 1028, 2349, +1628, 0, 2464, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1125, 13, 0, +1125, 0, 0, +1126, 0, 38, +1128, 0, 124, +1129, 0, 219, +1132, 0, 320, +1135, 0, 428, +1135, 0, 524, +1135, 0, 627, +1135, 0, 736, +1135, 0, 850, +1135, 0, 968, +1132, 0, 1100, +1021, 107, 1367, +864, 107, 1579, +995, 0, 1690, +1178, 0, 1783, +1471, 0, 1914, +1565, 97, 2034, +1457, 736, 2199, +395, 1045, 2350, +1636, 0, 2464, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1116, 150, 0, +1116, 137, 0, +1117, 127, 38, +1118, 114, 124, +1120, 96, 219, +1123, 70, 320, +1126, 34, 428, +1131, 0, 541, +1131, 0, 640, +1131, 0, 747, +1131, 0, 858, +1131, 0, 975, +1128, 0, 1105, +1003, 254, 1370, +839, 254, 1581, +1001, 137, 1692, +1157, 0, 1782, +1469, 17, 1915, +1563, 213, 2037, +1448, 768, 2200, +395, 1066, 2351, +1646, 21, 2464, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1103, 286, 0, +1103, 276, 0, +1104, 269, 38, +1106, 259, 124, +1108, 246, 219, +1110, 227, 320, +1114, 202, 428, +1118, 166, 541, +1125, 111, 658, +1125, 111, 760, +1125, 111, 869, +1125, 111, 983, +1121, 111, 1111, +979, 396, 1374, +803, 396, 1584, +1009, 276, 1696, +1127, 0, 1781, +1466, 140, 1918, +1560, 333, 2040, +1436, 807, 2201, +395, 1093, 2353, +1654, 232, 2464, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1085, 420, 0, +1085, 413, 0, +1086, 408, 38, +1088, 401, 124, +1090, 391, 219, +1093, 378, 320, +1097, 360, 428, +1102, 334, 541, +1108, 298, 658, +1116, 244, 779, +1116, 244, 884, +1116, 244, 995, +1113, 244, 1119, +952, 513, 1379, +749, 536, 1587, +1019, 413, 1700, +1132, 186, 1784, +1462, 265, 1920, +1557, 456, 2044, +1419, 854, 2202, +395, 1128, 2355, +1664, 421, 2465, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1061, 554, 0, +1061, 549, 0, +1062, 545, 38, +1064, 540, 124, +1066, 533, 219, +1069, 523, 320, +1073, 510, 428, +1078, 492, 541, +1085, 466, 658, +1093, 430, 779, +1105, 376, 902, +1105, 376, 1009, +1102, 376, 1131, +936, 591, 1385, +666, 674, 1590, +999, 572, 1705, +1142, 392, 1789, +1438, 342, 1919, +1553, 581, 2050, +1395, 910, 2205, +395, 1169, 2358, +1678, 592, 2466, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1025, 688, 0, +1025, 684, 0, +1027, 681, 38, +1028, 677, 124, +1031, 672, 219, +1034, 665, 320, +1038, 655, 428, +1044, 643, 541, +1051, 624, 658, +1061, 599, 779, +1073, 562, 902, +1089, 508, 1028, +1086, 508, 1145, +913, 678, 1393, +525, 811, 1596, +936, 738, 1709, +1157, 573, 1796, +1399, 418, 1917, +1547, 709, 2058, +1361, 976, 2207, +221, 1212, 2361, +1695, 752, 2468, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +998, 854, 247, +999, 854, 274, +1000, 852, 314, +1002, 850, 363, +1005, 846, 421, +1008, 841, 488, +1013, 835, 565, +1018, 826, 651, +1026, 814, 746, +1036, 797, 847, +1050, 774, 955, +1067, 741, 1069, +1082, 701, 1186, +907, 818, 1417, +458, 939, 1611, +854, 914, 1719, +1166, 781, 1811, +1344, 583, 1918, +1532, 855, 2069, +1306, 1062, 2213, +0, 1254, 2365, +1713, 908, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1120, 1134, 981, +1120, 1134, 987, +1116, 1134, 996, +1110, 1134, 1007, +1102, 1134, 1022, +1091, 1134, 1041, +1076, 1134, 1065, +1055, 1134, 1096, +1025, 1134, 1133, +1003, 1131, 1180, +1017, 1120, 1235, +1036, 1105, 1300, +1052, 1087, 1374, +1136, 1087, 1482, +920, 1158, 1655, +941, 1167, 1774, +1193, 1161, 1864, +1274, 1071, 1958, +1421, 1134, 2085, +1184, 1237, 2230, +980, 1275, 2368, +1697, 1083, 2471, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1244, 1351, 1313, +1244, 1351, 1315, +1241, 1351, 1320, +1236, 1351, 1325, +1230, 1351, 1332, +1222, 1351, 1342, +1211, 1351, 1355, +1195, 1351, 1371, +1174, 1351, 1392, +1143, 1351, 1419, +1099, 1351, 1452, +1031, 1351, 1493, +1008, 1345, 1543, +1101, 1345, 1620, +1200, 1345, 1706, +1180, 1356, 1819, +1250, 1368, 1917, +1282, 1376, 2010, +1214, 1352, 2106, +941, 1399, 2251, +1206, 1332, 2375, +1655, 1246, 2474, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1442, 1522, 1648, +1441, 1522, 1649, +1440, 1523, 1650, +1440, 1523, 1651, +1439, 1524, 1653, +1437, 1525, 1655, +1436, 1526, 1658, +1433, 1528, 1663, +1430, 1531, 1668, +1426, 1534, 1676, +1410, 1536, 1691, +1377, 1536, 1716, +1335, 1537, 1749, +1263, 1537, 1781, +1301, 1537, 1839, +1339, 1536, 1910, +1357, 1528, 1994, +1241, 1551, 2071, +1105, 1537, 2167, +883, 1536, 2275, +1324, 1476, 2384, +1692, 1446, 2476, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1656, 1669, 1872, +1656, 1669, 1873, +1655, 1669, 1874, +1654, 1670, 1875, +1652, 1671, 1877, +1650, 1671, 1879, +1646, 1672, 1883, +1642, 1674, 1887, +1636, 1675, 1893, +1633, 1678, 1897, +1629, 1681, 1903, +1624, 1685, 1911, +1616, 1691, 1922, +1595, 1684, 1941, +1542, 1684, 1969, +1504, 1684, 2010, +1525, 1691, 2073, +1483, 1671, 2138, +1324, 1684, 2221, +1259, 1662, 2297, +1564, 1621, 2385, +1796, 1617, 2477, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1843, 1802, 1967, +1843, 1802, 1968, +1843, 1802, 1969, +1842, 1802, 1969, +1841, 1802, 1971, +1840, 1802, 1972, +1839, 1802, 1974, +1837, 1802, 1977, +1834, 1802, 1981, +1831, 1802, 1986, +1824, 1804, 1994, +1814, 1807, 2005, +1802, 1811, 2018, +1790, 1817, 2033, +1773, 1811, 2052, +1772, 1809, 2081, +1734, 1809, 2120, +1747, 1811, 2175, +1708, 1801, 2234, +1744, 1800, 2309, +1774, 1800, 2391, +1911, 1796, 2475, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1991, 1958, 2038, +1991, 1958, 2038, +1990, 1958, 2040, +1989, 1958, 2041, +1988, 1958, 2043, +1986, 1958, 2045, +1983, 1958, 2049, +1980, 1958, 2053, +1976, 1958, 2059, +1970, 1958, 2067, +1962, 1958, 2074, +1950, 1958, 2082, +1946, 1958, 2104, +1947, 1962, 2142, +1936, 1964, 2196, +1923, 1957, 2231, +1922, 1958, 2310, +1954, 1955, 2394, +2043, 1964, 2481, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2128, 2127, 2076, +2128, 2127, 2077, +2129, 2127, 2077, +2129, 2127, 2077, +2129, 2127, 2077, +2129, 2127, 2078, +2130, 2127, 2078, +2130, 2127, 2079, +2131, 2127, 2080, +2132, 2127, 2080, +2133, 2127, 2082, +2135, 2127, 2084, +2135, 2127, 2087, +2129, 2127, 2097, +2122, 2127, 2109, +2124, 2131, 2129, +2128, 2135, 2163, +2124, 2132, 2210, +2119, 2127, 2251, +2135, 2128, 2316, +2164, 2135, 2400, +2226, 2151, 2485, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2374, 2355, 2126, +2374, 2355, 2127, +2374, 2355, 2127, +2374, 2355, 2127, +2374, 2355, 2127, +2374, 2355, 2128, +2374, 2355, 2129, +2375, 2355, 2130, +2375, 2355, 2131, +2375, 2355, 2133, +2376, 2355, 2135, +2377, 2355, 2138, +2376, 2355, 2140, +2375, 2355, 2143, +2372, 2354, 2147, +2374, 2356, 2159, +2375, 2358, 2191, +2375, 2357, 2230, +2381, 2358, 2275, +2398, 2368, 2335, +2415, 2368, 2409, +2469, 2388, 2498, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2679, 2653, 1955, +2679, 2653, 1955, +2679, 2653, 1956, +2679, 2653, 1957, +2679, 2653, 1958, +2679, 2654, 1961, +2679, 2654, 1963, +2679, 2654, 1967, +2679, 2654, 1964, +2679, 2653, 1961, +2678, 2652, 1955, +2678, 2650, 1948, +2677, 2648, 1939, +2677, 2650, 1960, +2676, 2655, 1976, +2677, 2657, 2013, +2680, 2657, 2068, +2679, 2658, 2122, +2683, 2657, 2209, +2688, 2661, 2310, +2695, 2666, 2408, +2715, 2679, 2527, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +1314, 0, 0, +1314, 0, 0, +1315, 0, 0, +1316, 0, 18, +1317, 0, 98, +1319, 0, 188, +1321, 0, 285, +1324, 0, 389, +1328, 0, 499, +1331, 0, 624, +1331, 0, 765, +1331, 0, 904, +1329, 0, 1054, +1312, 0, 1291, +1236, 0, 1533, +1269, 0, 1690, +1323, 0, 1781, +1534, 0, 1909, +1607, 0, 2039, +1502, 645, 2197, +677, 1023, 2352, +1658, 0, 2466, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1314, 0, 0, +1314, 0, 0, +1315, 0, 17, +1315, 0, 78, +1316, 0, 150, +1318, 0, 230, +1321, 0, 319, +1324, 0, 417, +1328, 0, 521, +1331, 0, 640, +1331, 0, 777, +1331, 0, 914, +1329, 0, 1059, +1311, 0, 1294, +1235, 0, 1535, +1268, 0, 1691, +1323, 0, 1782, +1533, 0, 1910, +1607, 0, 2039, +1501, 656, 2197, +679, 1026, 2352, +1659, 0, 2466, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1314, 0, 0, +1314, 0, 17, +1314, 0, 97, +1315, 0, 149, +1316, 0, 211, +1318, 0, 282, +1320, 0, 363, +1323, 0, 452, +1327, 0, 549, +1330, 0, 662, +1330, 0, 794, +1330, 0, 926, +1328, 0, 1068, +1311, 0, 1298, +1235, 0, 1537, +1267, 0, 1692, +1323, 0, 1783, +1532, 0, 1911, +1606, 0, 2040, +1500, 671, 2198, +682, 1030, 2352, +1660, 0, 2466, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1314, 0, 18, +1314, 0, 78, +1314, 0, 149, +1314, 0, 229, +1315, 0, 281, +1316, 0, 343, +1319, 0, 414, +1322, 0, 494, +1326, 0, 584, +1329, 0, 689, +1329, 0, 814, +1329, 0, 941, +1327, 0, 1079, +1310, 0, 1302, +1233, 0, 1540, +1266, 0, 1693, +1323, 0, 1784, +1531, 0, 1912, +1605, 0, 2041, +1498, 690, 2198, +686, 1035, 2353, +1661, 0, 2466, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1314, 0, 98, +1314, 0, 150, +1314, 0, 211, +1314, 0, 281, +1314, 0, 361, +1315, 0, 413, +1318, 0, 475, +1321, 0, 546, +1325, 0, 627, +1328, 0, 723, +1328, 0, 840, +1328, 0, 961, +1326, 0, 1094, +1309, 0, 1309, +1232, 0, 1544, +1265, 0, 1695, +1323, 0, 1787, +1529, 0, 1914, +1603, 0, 2042, +1497, 714, 2199, +691, 1042, 2353, +1662, 0, 2466, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1314, 0, 188, +1314, 0, 230, +1314, 0, 282, +1314, 0, 343, +1314, 0, 413, +1314, 0, 493, +1316, 0, 545, +1319, 0, 607, +1323, 0, 678, +1326, 0, 766, +1326, 0, 873, +1326, 0, 986, +1324, 0, 1113, +1307, 0, 1317, +1230, 0, 1549, +1263, 0, 1697, +1323, 30, 1790, +1527, 0, 1916, +1602, 132, 2043, +1495, 745, 2200, +698, 1051, 2354, +1663, 0, 2466, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1314, 121, 285, +1314, 106, 319, +1314, 85, 363, +1314, 56, 414, +1314, 13, 475, +1314, 0, 545, +1314, 0, 625, +1317, 0, 677, +1321, 0, 739, +1324, 0, 816, +1324, 0, 914, +1324, 0, 1018, +1322, 0, 1138, +1304, 0, 1329, +1227, 0, 1556, +1261, 0, 1700, +1323, 163, 1794, +1524, 32, 1919, +1599, 264, 2045, +1491, 783, 2201, +706, 1063, 2354, +1666, 32, 2466, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1314, 264, 389, +1314, 253, 417, +1314, 238, 452, +1314, 217, 494, +1314, 188, 546, +1314, 146, 607, +1314, 82, 677, +1314, 0, 757, +1318, 0, 809, +1321, 0, 876, +1321, 0, 963, +1321, 0, 1058, +1319, 0, 1168, +1302, 0, 1343, +1223, 0, 1565, +1257, 0, 1704, +1323, 295, 1799, +1520, 164, 1923, +1596, 396, 2047, +1487, 830, 2203, +718, 1079, 2355, +1668, 164, 2466, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1314, 404, 499, +1314, 396, 521, +1314, 385, 549, +1314, 370, 584, +1314, 349, 627, +1314, 320, 678, +1314, 277, 739, +1314, 214, 809, +1314, 111, 889, +1317, 111, 946, +1317, 111, 1021, +1317, 111, 1106, +1315, 111, 1206, +1297, 111, 1362, +1218, 111, 1576, +1252, 111, 1709, +1323, 426, 1806, +1515, 296, 1928, +1592, 528, 2051, +1482, 885, 2205, +733, 1099, 2357, +1667, 296, 2465, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1310, 530, 574, +1310, 524, 592, +1310, 516, 616, +1310, 505, 646, +1310, 490, 684, +1310, 468, 730, +1310, 438, 784, +1310, 394, 848, +1310, 328, 922, +1311, 244, 1001, +1311, 244, 1068, +1311, 244, 1145, +1310, 244, 1238, +1292, 244, 1379, +1207, 285, 1587, +1251, 265, 1716, +1322, 514, 1811, +1510, 413, 1934, +1587, 643, 2055, +1471, 941, 2208, +745, 1128, 2358, +1669, 442, 2465, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1294, 639, 574, +1294, 634, 592, +1294, 627, 616, +1294, 619, 646, +1294, 607, 684, +1294, 591, 730, +1294, 568, 784, +1294, 535, 848, +1294, 488, 922, +1297, 430, 1001, +1304, 376, 1080, +1304, 376, 1155, +1302, 376, 1246, +1284, 376, 1385, +1178, 503, 1590, +1239, 473, 1720, +1329, 626, 1816, +1488, 470, 1933, +1583, 729, 2060, +1450, 988, 2209, +745, 1169, 2362, +1682, 607, 2467, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1274, 753, 574, +1274, 749, 592, +1274, 744, 616, +1274, 737, 646, +1274, 728, 684, +1274, 716, 730, +1274, 698, 784, +1274, 674, 848, +1274, 640, 922, +1276, 599, 1001, +1284, 562, 1080, +1294, 508, 1169, +1292, 508, 1257, +1273, 508, 1393, +1137, 691, 1596, +1203, 671, 1723, +1338, 742, 1822, +1453, 529, 1930, +1577, 824, 2068, +1421, 1044, 2212, +672, 1212, 2365, +1699, 762, 2468, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1258, 900, 682, +1259, 900, 693, +1259, 896, 712, +1259, 891, 736, +1259, 885, 767, +1259, 876, 806, +1259, 864, 852, +1259, 847, 908, +1259, 824, 973, +1261, 797, 1044, +1269, 774, 1117, +1280, 741, 1199, +1289, 701, 1290, +1270, 701, 1417, +1120, 852, 1611, +1159, 869, 1734, +1344, 895, 1836, +1405, 663, 1931, +1563, 942, 2078, +1372, 1118, 2218, +602, 1254, 2368, +1718, 915, 2470, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1314, 1134, 1183, +1314, 1134, 1187, +1315, 1134, 1191, +1316, 1134, 1197, +1317, 1134, 1206, +1319, 1134, 1216, +1321, 1134, 1230, +1324, 1134, 1248, +1328, 1134, 1271, +1333, 1131, 1302, +1340, 1120, 1345, +1349, 1105, 1396, +1358, 1087, 1457, +1341, 1087, 1528, +1216, 1158, 1687, +1159, 1142, 1780, +1317, 1176, 1886, +1360, 1041, 1962, +1486, 1159, 2104, +1228, 1237, 2234, +1015, 1275, 2368, +1721, 1100, 2471, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1399, 1351, 1421, +1399, 1351, 1423, +1400, 1351, 1426, +1400, 1351, 1429, +1401, 1351, 1434, +1403, 1351, 1441, +1405, 1351, 1449, +1407, 1351, 1460, +1410, 1351, 1475, +1407, 1351, 1495, +1382, 1351, 1523, +1347, 1351, 1559, +1336, 1345, 1602, +1319, 1345, 1655, +1383, 1345, 1736, +1321, 1339, 1825, +1361, 1378, 1936, +1367, 1360, 2014, +1313, 1367, 2124, +1014, 1399, 2255, +1228, 1332, 2375, +1681, 1258, 2475, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1514, 1522, 1673, +1514, 1522, 1673, +1513, 1522, 1674, +1512, 1522, 1674, +1510, 1522, 1676, +1508, 1522, 1677, +1505, 1522, 1679, +1501, 1522, 1682, +1495, 1522, 1685, +1489, 1523, 1691, +1475, 1525, 1706, +1447, 1525, 1730, +1412, 1526, 1762, +1397, 1537, 1811, +1426, 1537, 1865, +1415, 1525, 1919, +1395, 1535, 2005, +1299, 1551, 2087, +1205, 1526, 2170, +1197, 1525, 2279, +1402, 1488, 2382, +1717, 1446, 2476, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1678, 1669, 1879, +1678, 1669, 1879, +1678, 1669, 1880, +1678, 1669, 1882, +1678, 1669, 1884, +1678, 1669, 1886, +1678, 1669, 1889, +1678, 1669, 1894, +1678, 1669, 1900, +1674, 1670, 1903, +1671, 1673, 1909, +1667, 1678, 1917, +1659, 1683, 1928, +1644, 1684, 1948, +1597, 1684, 1976, +1591, 1683, 2015, +1577, 1683, 2072, +1536, 1664, 2140, +1423, 1683, 2226, +1349, 1660, 2299, +1619, 1615, 2384, +1819, 1607, 2477, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1848, 1802, 1967, +1848, 1802, 1968, +1849, 1802, 1969, +1849, 1803, 1970, +1849, 1803, 1972, +1850, 1804, 1973, +1851, 1805, 1976, +1851, 1806, 1980, +1853, 1807, 1984, +1853, 1808, 1990, +1846, 1810, 1998, +1837, 1813, 2009, +1825, 1817, 2022, +1820, 1817, 2033, +1804, 1811, 2052, +1785, 1809, 2084, +1764, 1804, 2118, +1767, 1811, 2177, +1736, 1801, 2237, +1751, 1800, 2307, +1774, 1800, 2391, +1919, 1797, 2474, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2038, +1992, 1958, 2038, +1992, 1958, 2039, +1992, 1958, 2040, +1991, 1958, 2042, +1988, 1958, 2046, +1983, 1958, 2052, +1978, 1958, 2060, +1974, 1962, 2077, +1963, 1962, 2086, +1955, 1958, 2110, +1955, 1962, 2141, +1953, 1964, 2193, +1941, 1953, 2231, +1931, 1953, 2310, +1966, 1959, 2394, +2048, 1966, 2481, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2134, 2127, 2070, +2134, 2127, 2070, +2134, 2127, 2071, +2135, 2127, 2071, +2135, 2127, 2073, +2135, 2127, 2074, +2135, 2127, 2076, +2136, 2127, 2078, +2137, 2127, 2081, +2137, 2127, 2084, +2139, 2127, 2085, +2140, 2127, 2087, +2141, 2127, 2091, +2135, 2127, 2100, +2127, 2127, 2112, +2129, 2128, 2129, +2136, 2135, 2161, +2130, 2135, 2208, +2125, 2127, 2253, +2141, 2131, 2316, +2170, 2132, 2397, +2230, 2150, 2485, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2377, 2355, 2126, +2377, 2355, 2127, +2377, 2355, 2127, +2377, 2355, 2127, +2377, 2355, 2127, +2378, 2355, 2127, +2378, 2355, 2128, +2378, 2355, 2128, +2378, 2355, 2129, +2379, 2355, 2130, +2380, 2355, 2133, +2380, 2355, 2135, +2380, 2355, 2137, +2378, 2357, 2143, +2376, 2356, 2147, +2376, 2354, 2159, +2375, 2358, 2194, +2375, 2357, 2230, +2381, 2357, 2273, +2399, 2366, 2335, +2418, 2368, 2408, +2472, 2387, 2495, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2679, 2655, 1968, +2679, 2655, 1970, +2679, 2654, 1965, +2678, 2652, 1958, +2677, 2650, 1949, +2677, 2648, 1945, +2675, 2653, 1962, +2676, 2656, 2011, +2680, 2657, 2064, +2681, 2657, 2122, +2684, 2657, 2213, +2688, 2662, 2314, +2696, 2667, 2413, +2716, 2679, 2527, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +1471, 0, 0, +1471, 0, 0, +1472, 0, 0, +1472, 0, 18, +1473, 0, 98, +1475, 0, 188, +1476, 0, 285, +1478, 0, 389, +1481, 0, 499, +1485, 0, 614, +1490, 0, 733, +1496, 0, 855, +1498, 0, 1011, +1486, 0, 1266, +1470, 0, 1472, +1490, 0, 1659, +1524, 0, 1789, +1589, 0, 1904, +1654, 0, 2053, +1531, 645, 2197, +923, 1046, 2356, +1710, 0, 2469, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1471, 0, 0, +1471, 0, 0, +1471, 0, 17, +1472, 0, 78, +1473, 0, 150, +1474, 0, 230, +1476, 0, 319, +1478, 0, 417, +1481, 0, 521, +1485, 0, 631, +1489, 0, 746, +1496, 0, 865, +1497, 0, 1017, +1486, 0, 1269, +1469, 0, 1474, +1489, 0, 1660, +1524, 0, 1790, +1589, 0, 1905, +1653, 0, 2053, +1531, 656, 2197, +924, 1049, 2356, +1710, 0, 2469, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1471, 0, 0, +1471, 0, 17, +1471, 0, 97, +1472, 0, 149, +1472, 0, 211, +1474, 0, 282, +1475, 0, 363, +1477, 0, 452, +1480, 0, 549, +1484, 0, 653, +1489, 0, 763, +1496, 0, 878, +1497, 0, 1026, +1485, 0, 1273, +1469, 0, 1476, +1489, 0, 1661, +1524, 0, 1791, +1588, 0, 1905, +1652, 0, 2054, +1530, 671, 2198, +926, 1053, 2357, +1711, 0, 2469, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1471, 0, 18, +1471, 0, 78, +1471, 0, 149, +1471, 0, 229, +1472, 0, 281, +1473, 0, 343, +1475, 0, 414, +1477, 0, 494, +1480, 0, 584, +1483, 0, 681, +1488, 0, 785, +1495, 0, 895, +1496, 0, 1039, +1485, 0, 1278, +1468, 0, 1480, +1488, 0, 1662, +1524, 0, 1793, +1587, 0, 1907, +1651, 0, 2054, +1529, 690, 2198, +928, 1058, 2357, +1712, 0, 2469, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1471, 0, 98, +1471, 0, 150, +1471, 0, 211, +1471, 0, 281, +1471, 0, 361, +1472, 0, 413, +1474, 0, 475, +1476, 0, 546, +1479, 0, 627, +1482, 0, 716, +1487, 0, 813, +1494, 0, 917, +1495, 0, 1055, +1484, 0, 1285, +1467, 0, 1484, +1487, 0, 1664, +1524, 0, 1795, +1585, 0, 1908, +1650, 0, 2055, +1527, 714, 2199, +931, 1065, 2357, +1713, 0, 2469, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1471, 0, 188, +1471, 0, 230, +1471, 0, 282, +1471, 0, 343, +1471, 0, 413, +1471, 0, 493, +1472, 0, 545, +1475, 0, 607, +1478, 0, 678, +1481, 0, 759, +1486, 0, 848, +1493, 0, 946, +1494, 0, 1075, +1482, 0, 1294, +1466, 0, 1490, +1486, 0, 1667, +1524, 30, 1798, +1584, 0, 1911, +1648, 132, 2057, +1525, 745, 2200, +935, 1074, 2358, +1715, 0, 2469, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1471, 121, 285, +1471, 106, 319, +1471, 85, 363, +1471, 56, 414, +1471, 13, 475, +1471, 0, 545, +1471, 0, 625, +1473, 0, 677, +1476, 0, 739, +1480, 0, 810, +1485, 0, 891, +1491, 0, 980, +1493, 0, 1102, +1481, 0, 1306, +1464, 0, 1497, +1485, 0, 1670, +1524, 163, 1802, +1581, 32, 1914, +1646, 264, 2058, +1522, 783, 2201, +940, 1085, 2358, +1716, 32, 2469, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1471, 264, 389, +1471, 253, 417, +1471, 238, 452, +1471, 217, 494, +1471, 188, 546, +1471, 146, 607, +1471, 82, 677, +1471, 0, 757, +1474, 0, 809, +1478, 0, 871, +1483, 0, 942, +1489, 0, 1023, +1491, 0, 1135, +1479, 0, 1321, +1462, 0, 1507, +1482, 0, 1674, +1524, 295, 1807, +1578, 164, 1918, +1644, 396, 2061, +1518, 830, 2203, +947, 1100, 2359, +1719, 164, 2469, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1471, 404, 499, +1471, 396, 521, +1471, 385, 549, +1471, 370, 584, +1471, 349, 627, +1471, 320, 678, +1471, 277, 739, +1471, 214, 809, +1471, 111, 889, +1475, 111, 942, +1480, 111, 1003, +1486, 111, 1075, +1488, 111, 1176, +1476, 111, 1340, +1459, 111, 1520, +1480, 111, 1680, +1524, 426, 1814, +1573, 296, 1923, +1640, 528, 2064, +1513, 885, 2205, +956, 1119, 2361, +1717, 296, 2469, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1471, 542, 614, +1471, 536, 631, +1471, 528, 653, +1471, 517, 681, +1471, 502, 716, +1471, 482, 759, +1471, 452, 810, +1471, 410, 871, +1471, 346, 942, +1471, 244, 1021, +1476, 244, 1074, +1483, 244, 1135, +1484, 244, 1225, +1472, 244, 1369, +1455, 244, 1537, +1476, 244, 1687, +1520, 502, 1820, +1567, 428, 1930, +1634, 660, 2068, +1506, 950, 2208, +968, 1143, 2362, +1715, 428, 2469, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1471, 678, 733, +1471, 674, 746, +1471, 668, 763, +1471, 660, 785, +1471, 649, 813, +1471, 634, 848, +1471, 613, 891, +1471, 584, 942, +1471, 542, 1003, +1471, 478, 1074, +1471, 376, 1153, +1478, 376, 1206, +1479, 376, 1283, +1467, 376, 1412, +1450, 376, 1559, +1471, 376, 1701, +1516, 581, 1827, +1566, 591, 1940, +1627, 792, 2074, +1496, 1025, 2212, +983, 1174, 2364, +1712, 560, 2468, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1471, 814, 855, +1471, 811, 865, +1471, 806, 878, +1471, 800, 895, +1471, 792, 917, +1471, 782, 946, +1471, 767, 980, +1471, 746, 1023, +1471, 717, 1075, +1471, 674, 1135, +1471, 611, 1206, +1471, 508, 1285, +1472, 508, 1352, +1460, 508, 1465, +1443, 508, 1587, +1464, 508, 1721, +1509, 670, 1836, +1566, 751, 1952, +1617, 925, 2081, +1483, 1109, 2218, +935, 1212, 2368, +1708, 692, 2467, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1467, 954, 955, +1467, 954, 960, +1467, 951, 971, +1467, 947, 985, +1467, 941, 1004, +1467, 933, 1027, +1467, 923, 1056, +1467, 908, 1092, +1467, 888, 1137, +1467, 859, 1191, +1467, 818, 1254, +1467, 755, 1326, +1471, 701, 1400, +1458, 701, 1503, +1441, 701, 1611, +1446, 742, 1738, +1508, 833, 1851, +1542, 872, 1959, +1602, 1037, 2091, +1448, 1185, 2224, +886, 1254, 2372, +1718, 855, 2468, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1503, 1167, 1293, +1503, 1167, 1296, +1504, 1167, 1299, +1504, 1167, 1304, +1505, 1167, 1311, +1506, 1167, 1319, +1508, 1167, 1330, +1510, 1167, 1344, +1512, 1167, 1363, +1514, 1162, 1390, +1514, 1141, 1432, +1514, 1111, 1482, +1517, 1087, 1536, +1506, 1087, 1597, +1491, 1087, 1687, +1446, 1077, 1783, +1489, 1144, 1900, +1509, 1144, 1988, +1532, 1221, 2116, +1329, 1289, 2240, +1151, 1275, 2372, +1721, 1061, 2469, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1547, 1351, 1534, +1547, 1351, 1536, +1547, 1351, 1538, +1548, 1351, 1541, +1549, 1351, 1545, +1550, 1351, 1550, +1551, 1351, 1556, +1553, 1351, 1565, +1555, 1351, 1577, +1558, 1351, 1592, +1563, 1351, 1611, +1569, 1351, 1636, +1573, 1345, 1671, +1563, 1345, 1717, +1550, 1345, 1771, +1498, 1335, 1850, +1489, 1358, 1942, +1476, 1376, 2036, +1418, 1388, 2147, +1096, 1399, 2261, +1290, 1332, 2375, +1730, 1258, 2473, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1626, 1522, 1733, +1625, 1522, 1734, +1625, 1522, 1734, +1623, 1522, 1735, +1622, 1522, 1736, +1621, 1522, 1737, +1618, 1522, 1739, +1615, 1522, 1742, +1611, 1522, 1745, +1605, 1522, 1749, +1605, 1522, 1760, +1609, 1522, 1778, +1596, 1523, 1805, +1587, 1534, 1850, +1574, 1537, 1894, +1558, 1522, 1941, +1509, 1521, 2012, +1413, 1563, 2107, +1330, 1535, 2187, +1296, 1523, 2285, +1459, 1491, 2382, +1767, 1446, 2474, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1737, 1669, 1898, +1737, 1669, 1899, +1737, 1669, 1900, +1737, 1669, 1901, +1737, 1669, 1903, +1737, 1669, 1905, +1737, 1669, 1908, +1737, 1669, 1913, +1737, 1669, 1918, +1732, 1669, 1922, +1727, 1669, 1925, +1719, 1669, 1930, +1711, 1672, 1940, +1697, 1674, 1960, +1687, 1684, 2003, +1675, 1681, 2036, +1638, 1672, 2080, +1565, 1674, 2153, +1492, 1672, 2229, +1526, 1649, 2305, +1680, 1621, 2385, +1871, 1607, 2473, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1862, 1802, 1972, +1862, 1802, 1973, +1862, 1802, 1973, +1862, 1803, 1975, +1862, 1803, 1976, +1863, 1804, 1978, +1864, 1805, 1981, +1865, 1806, 1984, +1866, 1807, 1989, +1868, 1809, 1995, +1868, 1809, 2004, +1868, 1809, 2014, +1861, 1811, 2027, +1856, 1811, 2038, +1842, 1811, 2056, +1824, 1809, 2088, +1829, 1804, 2122, +1805, 1804, 2175, +1793, 1801, 2242, +1782, 1800, 2309, +1820, 1797, 2390, +1940, 1796, 2477, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2038, +1992, 1958, 2038, +1992, 1958, 2039, +1992, 1958, 2040, +1992, 1958, 2041, +1992, 1958, 2042, +1992, 1958, 2044, +1989, 1958, 2051, +1984, 1962, 2068, +1979, 1968, 2090, +1970, 1962, 2115, +1966, 1962, 2148, +1966, 1964, 2190, +1964, 1947, 2231, +1943, 1947, 2310, +1978, 1965, 2395, +2061, 1971, 2481, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2142, 2127, 2061, +2142, 2127, 2061, +2142, 2127, 2062, +2142, 2127, 2063, +2142, 2127, 2064, +2143, 2127, 2065, +2143, 2127, 2067, +2143, 2127, 2069, +2144, 2127, 2072, +2145, 2127, 2076, +2146, 2127, 2082, +2148, 2127, 2089, +2148, 2127, 2095, +2143, 2127, 2104, +2135, 2127, 2116, +2137, 2127, 2132, +2144, 2131, 2161, +2141, 2135, 2204, +2133, 2127, 2256, +2149, 2134, 2316, +2174, 2130, 2395, +2237, 2146, 2485, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2379, 2355, 2126, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2128, +2381, 2355, 2128, +2381, 2355, 2129, +2381, 2355, 2130, +2382, 2355, 2131, +2382, 2355, 2133, +2382, 2355, 2135, +2381, 2357, 2141, +2379, 2358, 2148, +2379, 2355, 2161, +2378, 2357, 2192, +2376, 2358, 2230, +2382, 2354, 2270, +2402, 2364, 2335, +2420, 2368, 2405, +2473, 2383, 2495, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2656, 1951, +2680, 2656, 1956, +2680, 2656, 1963, +2679, 2655, 1973, +2679, 2654, 1971, +2678, 2651, 1967, +2678, 2651, 1962, +2678, 2655, 2011, +2679, 2657, 2064, +2682, 2657, 2129, +2684, 2657, 2213, +2688, 2661, 2311, +2699, 2668, 2415, +2717, 2681, 2528, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +1677, 0, 708, +1676, 0, 722, +1676, 0, 740, +1675, 0, 763, +1674, 0, 792, +1672, 0, 829, +1670, 0, 873, +1667, 0, 927, +1663, 0, 989, +1658, 0, 1062, +1657, 0, 1123, +1662, 0, 1179, +1666, 0, 1250, +1649, 0, 1372, +1636, 0, 1533, +1634, 0, 1672, +1671, 0, 1828, +1667, 0, 1929, +1689, 355, 2079, +1608, 810, 2211, +1232, 994, 2359, +1771, 0, 2470, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1676, 0, 726, +1676, 0, 735, +1675, 0, 753, +1674, 0, 775, +1673, 0, 804, +1672, 0, 839, +1669, 0, 883, +1667, 0, 935, +1663, 0, 997, +1658, 0, 1068, +1657, 0, 1129, +1662, 0, 1184, +1666, 0, 1253, +1649, 0, 1375, +1636, 0, 1535, +1635, 0, 1673, +1670, 0, 1829, +1666, 0, 1930, +1689, 372, 2079, +1607, 814, 2211, +1238, 995, 2359, +1771, 0, 2470, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1676, 0, 749, +1675, 0, 758, +1675, 0, 770, +1674, 0, 791, +1673, 0, 819, +1672, 0, 853, +1669, 0, 895, +1666, 0, 946, +1663, 0, 1007, +1657, 0, 1077, +1657, 0, 1136, +1661, 0, 1191, +1665, 0, 1259, +1649, 0, 1378, +1636, 0, 1537, +1635, 0, 1674, +1669, 0, 1829, +1665, 0, 1930, +1688, 394, 2080, +1606, 821, 2211, +1245, 996, 2359, +1771, 0, 2470, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1675, 0, 777, +1674, 0, 786, +1674, 0, 797, +1674, 0, 812, +1673, 0, 838, +1671, 0, 871, +1669, 0, 912, +1666, 0, 961, +1662, 0, 1020, +1657, 0, 1088, +1656, 0, 1146, +1661, 0, 1199, +1665, 0, 1266, +1649, 0, 1383, +1636, 0, 1541, +1636, 0, 1676, +1668, 0, 1830, +1663, 0, 1932, +1687, 422, 2080, +1605, 829, 2212, +1255, 998, 2359, +1772, 0, 2470, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1674, 0, 814, +1673, 0, 822, +1673, 0, 832, +1673, 0, 845, +1672, 0, 863, +1671, 0, 894, +1668, 0, 933, +1666, 0, 980, +1662, 0, 1036, +1656, 0, 1102, +1655, 0, 1159, +1660, 0, 1210, +1664, 0, 1276, +1649, 0, 1390, +1636, 0, 1545, +1637, 0, 1679, +1667, 0, 1831, +1662, 0, 1934, +1686, 457, 2081, +1603, 840, 2212, +1268, 1001, 2360, +1772, 0, 2470, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1672, 0, 858, +1672, 0, 865, +1672, 0, 874, +1671, 0, 887, +1671, 0, 903, +1670, 0, 923, +1667, 0, 960, +1664, 0, 1004, +1661, 0, 1058, +1655, 0, 1121, +1655, 0, 1175, +1659, 0, 1225, +1663, 0, 1289, +1649, 0, 1398, +1636, 0, 1551, +1639, 0, 1683, +1666, 0, 1832, +1659, 132, 1936, +1684, 500, 2083, +1600, 854, 2213, +1285, 1004, 2360, +1773, 0, 2470, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1670, 32, 911, +1669, 32, 917, +1669, 32, 926, +1669, 32, 937, +1668, 32, 951, +1667, 32, 970, +1667, 32, 993, +1663, 32, 1035, +1660, 32, 1085, +1654, 32, 1144, +1654, 32, 1196, +1658, 32, 1244, +1662, 0, 1305, +1649, 0, 1410, +1636, 0, 1560, +1641, 32, 1688, +1663, 32, 1833, +1656, 264, 1939, +1682, 551, 2084, +1596, 873, 2214, +1306, 1009, 2361, +1773, 0, 2470, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1667, 164, 973, +1667, 164, 979, +1666, 164, 986, +1666, 164, 996, +1666, 164, 1009, +1664, 164, 1025, +1663, 164, 1046, +1662, 164, 1073, +1658, 164, 1119, +1653, 164, 1174, +1652, 164, 1223, +1657, 164, 1268, +1661, 137, 1326, +1649, 0, 1424, +1636, 0, 1570, +1644, 164, 1695, +1661, 164, 1835, +1652, 396, 1943, +1680, 612, 2086, +1591, 896, 2215, +1333, 1014, 2362, +1774, 0, 2470, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1663, 296, 1045, +1663, 296, 1050, +1663, 296, 1056, +1662, 296, 1065, +1662, 296, 1075, +1661, 296, 1090, +1660, 296, 1108, +1658, 296, 1131, +1656, 296, 1161, +1651, 296, 1212, +1650, 296, 1257, +1655, 296, 1299, +1659, 276, 1353, +1649, 111, 1443, +1636, 111, 1584, +1648, 296, 1704, +1657, 296, 1838, +1646, 528, 1948, +1676, 683, 2089, +1585, 926, 2217, +1367, 1022, 2363, +1772, 0, 2470, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1658, 428, 1127, +1658, 428, 1131, +1657, 428, 1136, +1657, 428, 1143, +1656, 428, 1152, +1655, 428, 1164, +1654, 428, 1180, +1653, 428, 1200, +1651, 428, 1225, +1648, 428, 1257, +1648, 428, 1298, +1653, 428, 1336, +1657, 413, 1387, +1648, 265, 1468, +1636, 244, 1601, +1653, 428, 1715, +1661, 428, 1846, +1638, 660, 1955, +1671, 762, 2093, +1576, 963, 2219, +1408, 1032, 2365, +1768, 91, 2470, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1655, 583, 1188, +1655, 583, 1191, +1654, 583, 1196, +1654, 583, 1202, +1654, 583, 1210, +1653, 583, 1221, +1651, 583, 1234, +1650, 583, 1252, +1648, 583, 1275, +1646, 583, 1304, +1644, 536, 1348, +1649, 536, 1383, +1653, 524, 1429, +1645, 413, 1503, +1633, 376, 1622, +1654, 536, 1730, +1662, 536, 1854, +1635, 766, 1962, +1664, 863, 2099, +1566, 1025, 2222, +1432, 1062, 2367, +1764, 309, 2470, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1655, 745, 1237, +1655, 745, 1240, +1654, 745, 1244, +1654, 745, 1249, +1654, 745, 1257, +1653, 745, 1266, +1651, 745, 1279, +1650, 745, 1295, +1648, 745, 1315, +1646, 745, 1342, +1644, 713, 1383, +1644, 633, 1439, +1648, 624, 1479, +1640, 536, 1547, +1628, 508, 1646, +1649, 633, 1749, +1657, 633, 1863, +1635, 881, 1973, +1655, 979, 2105, +1554, 1109, 2228, +1415, 1110, 2370, +1760, 519, 2469, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1655, 918, 1304, +1656, 918, 1306, +1655, 918, 1310, +1655, 918, 1314, +1654, 918, 1320, +1654, 918, 1329, +1653, 918, 1340, +1651, 918, 1354, +1649, 918, 1372, +1647, 918, 1395, +1645, 897, 1432, +1645, 845, 1482, +1643, 779, 1541, +1635, 719, 1601, +1623, 701, 1686, +1641, 772, 1775, +1650, 779, 1877, +1631, 1007, 1989, +1643, 1092, 2115, +1533, 1205, 2236, +1384, 1170, 2375, +1758, 725, 2468, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1647, 1170, 1441, +1648, 1170, 1443, +1648, 1170, 1445, +1648, 1170, 1448, +1649, 1170, 1452, +1650, 1170, 1457, +1651, 1170, 1463, +1653, 1170, 1472, +1654, 1170, 1484, +1655, 1170, 1500, +1654, 1157, 1529, +1654, 1129, 1570, +1651, 1095, 1619, +1635, 1095, 1678, +1623, 1087, 1751, +1615, 1062, 1817, +1632, 1090, 1907, +1595, 1178, 2016, +1626, 1217, 2123, +1463, 1323, 2255, +1427, 1258, 2375, +1780, 1002, 2468, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1671, 1358, 1617, +1671, 1358, 1618, +1672, 1358, 1619, +1672, 1358, 1621, +1672, 1358, 1624, +1673, 1358, 1628, +1674, 1358, 1632, +1676, 1358, 1638, +1678, 1358, 1646, +1680, 1358, 1657, +1683, 1358, 1672, +1687, 1358, 1694, +1687, 1345, 1729, +1672, 1345, 1775, +1659, 1345, 1825, +1644, 1322, 1879, +1625, 1320, 1950, +1565, 1390, 2060, +1550, 1377, 2150, +1313, 1430, 2275, +1491, 1332, 2378, +1794, 1220, 2471, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1720, 1522, 1779, +1720, 1522, 1780, +1719, 1522, 1781, +1718, 1522, 1782, +1717, 1522, 1783, +1716, 1522, 1785, +1714, 1522, 1787, +1712, 1522, 1790, +1708, 1522, 1795, +1704, 1522, 1800, +1703, 1522, 1811, +1707, 1522, 1827, +1711, 1522, 1847, +1703, 1522, 1873, +1693, 1522, 1912, +1668, 1522, 1965, +1628, 1506, 2021, +1607, 1566, 2121, +1540, 1536, 2191, +1494, 1506, 2283, +1572, 1474, 2382, +1813, 1446, 2473, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1810, 1655, 1910, +1809, 1655, 1911, +1809, 1655, 1911, +1808, 1655, 1912, +1807, 1656, 1913, +1806, 1657, 1915, +1805, 1658, 1918, +1802, 1659, 1921, +1800, 1661, 1925, +1796, 1662, 1930, +1791, 1662, 1934, +1784, 1662, 1939, +1776, 1662, 1948, +1775, 1662, 1972, +1766, 1670, 2011, +1745, 1681, 2051, +1732, 1662, 2087, +1680, 1676, 2155, +1604, 1655, 2226, +1644, 1643, 2305, +1738, 1626, 2385, +1900, 1611, 2473, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1907, 1800, 1983, +1907, 1800, 1984, +1907, 1800, 1984, +1907, 1800, 1985, +1907, 1800, 1986, +1907, 1800, 1987, +1907, 1800, 1989, +1907, 1800, 1991, +1907, 1800, 1994, +1907, 1800, 1997, +1906, 1801, 2005, +1906, 1801, 2015, +1905, 1801, 2029, +1901, 1801, 2043, +1890, 1801, 2062, +1872, 1801, 2086, +1874, 1807, 2128, +1850, 1801, 2174, +1847, 1800, 2243, +1818, 1792, 2312, +1871, 1797, 2387, +1976, 1799, 2480, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1958, 2033, +2033, 1958, 2033, +2033, 1958, 2034, +2032, 1958, 2034, +2031, 1959, 2036, +2031, 1959, 2037, +2029, 1960, 2039, +2027, 1961, 2041, +2025, 1961, 2044, +2021, 1963, 2049, +2020, 1963, 2052, +2020, 1963, 2054, +2020, 1963, 2059, +2020, 1959, 2069, +2016, 1962, 2088, +2004, 1969, 2111, +1998, 1964, 2152, +1993, 1963, 2193, +1987, 1952, 2238, +1975, 1952, 2313, +2009, 1966, 2398, +2073, 1966, 2481, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2163, 2131, 2063, +2163, 2131, 2063, +2163, 2131, 2064, +2163, 2131, 2065, +2163, 2131, 2065, +2163, 2131, 2066, +2163, 2131, 2068, +2163, 2131, 2069, +2163, 2131, 2072, +2163, 2131, 2075, +2164, 2131, 2080, +2165, 2131, 2087, +2166, 2131, 2096, +2164, 2131, 2105, +2157, 2131, 2117, +2148, 2127, 2128, +2154, 2127, 2154, +2155, 2131, 2206, +2143, 2127, 2260, +2159, 2135, 2315, +2188, 2134, 2395, +2251, 2149, 2486, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2386, 2355, 2123, +2386, 2355, 2123, +2386, 2356, 2123, +2387, 2356, 2123, +2387, 2356, 2124, +2387, 2356, 2124, +2387, 2356, 2125, +2387, 2357, 2126, +2388, 2357, 2127, +2388, 2357, 2129, +2389, 2358, 2131, +2389, 2358, 2133, +2389, 2357, 2135, +2386, 2356, 2141, +2384, 2356, 2148, +2382, 2356, 2170, +2388, 2357, 2191, +2386, 2356, 2226, +2394, 2358, 2272, +2409, 2366, 2337, +2431, 2373, 2403, +2476, 2384, 2495, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2684, 2656, 1957, +2684, 2656, 1957, +2684, 2656, 1956, +2684, 2656, 1956, +2684, 2656, 1956, +2684, 2656, 1956, +2684, 2656, 1955, +2684, 2656, 1954, +2684, 2656, 1955, +2684, 2656, 1956, +2684, 2656, 1961, +2683, 2656, 1971, +2683, 2655, 1982, +2682, 2655, 1994, +2682, 2655, 1993, +2681, 2656, 2011, +2682, 2656, 2069, +2683, 2657, 2133, +2686, 2657, 2216, +2691, 2663, 2315, +2700, 2669, 2417, +2719, 2681, 2533, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +1824, 0, 1212, +1824, 0, 1217, +1825, 0, 1223, +1825, 0, 1231, +1826, 0, 1242, +1827, 0, 1255, +1829, 0, 1273, +1831, 0, 1296, +1833, 0, 1325, +1830, 0, 1360, +1825, 0, 1405, +1819, 0, 1458, +1810, 0, 1521, +1804, 0, 1576, +1787, 0, 1659, +1777, 0, 1755, +1770, 0, 1865, +1790, 0, 1986, +1740, 750, 2108, +1692, 916, 2230, +1561, 947, 2370, +1845, 0, 2469, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1824, 0, 1216, +1824, 0, 1219, +1825, 0, 1225, +1825, 0, 1233, +1826, 0, 1243, +1827, 0, 1257, +1829, 0, 1275, +1831, 0, 1298, +1833, 0, 1326, +1830, 0, 1362, +1825, 0, 1406, +1819, 0, 1459, +1810, 0, 1523, +1804, 0, 1578, +1787, 0, 1661, +1777, 0, 1756, +1770, 0, 1866, +1790, 32, 1986, +1740, 754, 2108, +1692, 922, 2231, +1561, 949, 2370, +1845, 0, 2470, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1825, 0, 1221, +1825, 0, 1224, +1825, 0, 1228, +1825, 0, 1235, +1826, 0, 1246, +1827, 0, 1260, +1829, 0, 1277, +1831, 0, 1300, +1833, 0, 1328, +1830, 0, 1364, +1825, 0, 1408, +1819, 0, 1461, +1810, 0, 1524, +1804, 0, 1580, +1787, 0, 1663, +1777, 0, 1758, +1770, 44, 1866, +1789, 88, 1987, +1740, 759, 2109, +1692, 931, 2231, +1562, 952, 2370, +1845, 0, 2470, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1825, 0, 1228, +1825, 0, 1231, +1825, 0, 1234, +1825, 0, 1239, +1826, 0, 1249, +1827, 0, 1263, +1829, 0, 1280, +1831, 0, 1302, +1833, 0, 1331, +1830, 0, 1366, +1825, 0, 1410, +1819, 0, 1463, +1810, 0, 1526, +1804, 0, 1584, +1787, 0, 1666, +1777, 0, 1760, +1769, 102, 1867, +1788, 153, 1988, +1739, 765, 2110, +1692, 942, 2232, +1563, 957, 2370, +1845, 0, 2470, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1826, 0, 1238, +1826, 0, 1240, +1826, 0, 1243, +1826, 0, 1248, +1826, 0, 1254, +1827, 0, 1267, +1829, 0, 1284, +1831, 0, 1306, +1833, 0, 1335, +1830, 0, 1370, +1825, 0, 1413, +1819, 0, 1465, +1810, 0, 1528, +1804, 0, 1588, +1787, 0, 1669, +1777, 83, 1763, +1769, 170, 1868, +1787, 229, 1990, +1739, 774, 2111, +1692, 956, 2233, +1563, 962, 2370, +1845, 0, 2470, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1827, 0, 1250, +1827, 0, 1252, +1827, 0, 1255, +1827, 0, 1260, +1827, 1, 1265, +1827, 30, 1273, +1829, 30, 1290, +1831, 30, 1312, +1833, 30, 1339, +1830, 30, 1375, +1825, 30, 1417, +1819, 30, 1469, +1810, 64, 1531, +1804, 132, 1593, +1787, 132, 1674, +1777, 215, 1767, +1768, 247, 1870, +1785, 313, 1991, +1738, 785, 2113, +1692, 974, 2235, +1564, 970, 2370, +1845, 0, 2470, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1829, 58, 1265, +1829, 66, 1267, +1829, 77, 1270, +1829, 91, 1275, +1829, 109, 1280, +1829, 133, 1288, +1829, 163, 1297, +1831, 163, 1318, +1833, 163, 1346, +1830, 163, 1380, +1825, 163, 1423, +1819, 163, 1474, +1810, 188, 1536, +1804, 264, 1601, +1787, 264, 1680, +1777, 347, 1772, +1767, 334, 1872, +1783, 406, 1994, +1737, 799, 2115, +1692, 998, 2237, +1565, 979, 2370, +1845, 32, 2471, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1831, 183, 1285, +1831, 190, 1287, +1831, 198, 1290, +1831, 209, 1294, +1831, 223, 1299, +1831, 242, 1306, +1831, 265, 1315, +1831, 295, 1328, +1833, 295, 1354, +1830, 295, 1388, +1825, 295, 1430, +1819, 295, 1480, +1810, 314, 1541, +1804, 396, 1611, +1787, 396, 1688, +1777, 479, 1778, +1766, 428, 1875, +1779, 506, 1998, +1736, 818, 2119, +1692, 1027, 2240, +1567, 992, 2369, +1845, 164, 2471, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1833, 310, 1310, +1833, 315, 1312, +1833, 322, 1315, +1833, 330, 1319, +1833, 341, 1324, +1833, 355, 1331, +1833, 373, 1339, +1833, 397, 1351, +1833, 426, 1365, +1830, 426, 1398, +1825, 426, 1439, +1819, 426, 1489, +1810, 441, 1548, +1804, 528, 1623, +1787, 528, 1699, +1777, 611, 1787, +1765, 530, 1878, +1775, 613, 2002, +1734, 841, 2123, +1692, 1064, 2244, +1569, 1008, 2369, +1844, 330, 2472, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1830, 439, 1356, +1830, 443, 1358, +1830, 447, 1361, +1830, 454, 1364, +1830, 462, 1369, +1830, 473, 1375, +1830, 487, 1383, +1830, 506, 1393, +1830, 529, 1407, +1828, 531, 1428, +1824, 531, 1466, +1817, 531, 1513, +1809, 543, 1570, +1803, 601, 1641, +1787, 591, 1713, +1780, 686, 1796, +1768, 615, 1886, +1769, 725, 2008, +1730, 897, 2126, +1685, 1092, 2246, +1595, 1019, 2371, +1840, 422, 2472, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1825, 568, 1412, +1825, 571, 1414, +1825, 575, 1417, +1825, 579, 1420, +1825, 586, 1424, +1825, 594, 1429, +1825, 605, 1436, +1825, 619, 1445, +1825, 638, 1457, +1824, 640, 1476, +1821, 640, 1501, +1814, 640, 1545, +1806, 648, 1598, +1800, 695, 1664, +1787, 658, 1731, +1782, 751, 1810, +1774, 707, 1896, +1763, 805, 2012, +1724, 965, 2131, +1675, 1127, 2249, +1629, 1033, 2373, +1836, 515, 2472, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1819, 699, 1479, +1819, 701, 1480, +1819, 703, 1482, +1819, 707, 1485, +1819, 712, 1488, +1819, 718, 1493, +1819, 727, 1499, +1819, 737, 1507, +1819, 752, 1518, +1817, 753, 1534, +1814, 753, 1556, +1811, 753, 1584, +1803, 760, 1633, +1797, 797, 1695, +1787, 733, 1754, +1782, 813, 1830, +1781, 806, 1910, +1756, 887, 2016, +1716, 1042, 2138, +1662, 1169, 2253, +1634, 1062, 2374, +1829, 616, 2472, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1811, 848, 1553, +1811, 848, 1554, +1811, 851, 1556, +1811, 853, 1558, +1811, 857, 1561, +1811, 861, 1565, +1811, 867, 1570, +1811, 875, 1577, +1811, 886, 1586, +1809, 887, 1600, +1807, 887, 1619, +1804, 887, 1644, +1799, 892, 1675, +1793, 920, 1732, +1785, 861, 1784, +1781, 901, 1853, +1789, 932, 1929, +1748, 990, 2023, +1706, 1137, 2147, +1648, 1218, 2257, +1620, 1108, 2375, +1824, 746, 2471, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1820, 1109, 1630, +1820, 1109, 1631, +1819, 1109, 1633, +1819, 1109, 1635, +1818, 1109, 1637, +1817, 1109, 1641, +1815, 1109, 1645, +1813, 1109, 1651, +1810, 1109, 1659, +1810, 1109, 1670, +1808, 1109, 1686, +1805, 1109, 1707, +1800, 1112, 1734, +1793, 1134, 1775, +1785, 1098, 1823, +1767, 1090, 1881, +1785, 1153, 1970, +1749, 1166, 2045, +1704, 1267, 2165, +1646, 1289, 2266, +1638, 1188, 2377, +1843, 976, 2471, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1812, 1336, 1724, +1812, 1336, 1725, +1811, 1336, 1727, +1811, 1336, 1728, +1810, 1336, 1730, +1809, 1336, 1733, +1807, 1336, 1736, +1805, 1336, 1741, +1802, 1336, 1748, +1804, 1336, 1756, +1806, 1336, 1767, +1810, 1336, 1781, +1808, 1338, 1803, +1801, 1351, 1839, +1785, 1351, 1887, +1762, 1338, 1936, +1760, 1342, 2007, +1728, 1366, 2073, +1683, 1382, 2175, +1573, 1418, 2288, +1713, 1264, 2379, +1872, 1202, 2471, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1832, 1511, 1838, +1832, 1511, 1839, +1832, 1511, 1839, +1832, 1511, 1840, +1832, 1511, 1841, +1832, 1511, 1843, +1832, 1511, 1845, +1832, 1511, 1848, +1832, 1511, 1852, +1829, 1511, 1857, +1829, 1511, 1865, +1832, 1511, 1876, +1834, 1511, 1891, +1824, 1511, 1912, +1810, 1511, 1951, +1783, 1522, 2002, +1774, 1495, 2052, +1746, 1515, 2117, +1708, 1501, 2192, +1652, 1522, 2297, +1779, 1436, 2383, +1898, 1422, 2472, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1888, 1654, 1938, +1888, 1654, 1938, +1888, 1654, 1939, +1888, 1654, 1940, +1888, 1654, 1940, +1888, 1654, 1942, +1888, 1654, 1943, +1888, 1654, 1946, +1888, 1654, 1949, +1885, 1654, 1953, +1881, 1654, 1958, +1875, 1654, 1965, +1868, 1655, 1975, +1863, 1662, 1991, +1855, 1662, 2017, +1843, 1654, 2055, +1817, 1654, 2107, +1794, 1657, 2159, +1766, 1662, 2229, +1800, 1621, 2303, +1843, 1605, 2385, +1921, 1624, 2474, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +1977, 1783, 1983, +1977, 1783, 1984, +1977, 1783, 1984, +1977, 1783, 1985, +1977, 1783, 1986, +1978, 1783, 1987, +1978, 1783, 1989, +1979, 1783, 1991, +1980, 1783, 1994, +1980, 1783, 1997, +1977, 1785, 2004, +1973, 1788, 2012, +1966, 1792, 2023, +1959, 1786, 2037, +1958, 1786, 2064, +1950, 1793, 2093, +1929, 1801, 2129, +1939, 1792, 2174, +1905, 1778, 2235, +1877, 1792, 2311, +1920, 1800, 2389, +2007, 1802, 2476, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2083, 1958, 2032, +2082, 1958, 2032, +2082, 1958, 2032, +2082, 1958, 2033, +2082, 1958, 2034, +2082, 1958, 2035, +2081, 1958, 2036, +2081, 1958, 2038, +2080, 1958, 2041, +2077, 1959, 2045, +2073, 1961, 2051, +2067, 1963, 2058, +2061, 1965, 2068, +2056, 1964, 2080, +2056, 1959, 2093, +2052, 1959, 2114, +2036, 1961, 2142, +2031, 1968, 2199, +2019, 1953, 2244, +2017, 1958, 2317, +2046, 1962, 2395, +2106, 1970, 2483, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2191, 2132, 2068, +2191, 2132, 2068, +2191, 2132, 2069, +2190, 2132, 2069, +2190, 2132, 2070, +2190, 2131, 2071, +2189, 2131, 2072, +2188, 2130, 2074, +2187, 2130, 2076, +2187, 2129, 2079, +2187, 2129, 2083, +2187, 2129, 2088, +2187, 2129, 2096, +2184, 2129, 2105, +2180, 2129, 2117, +2180, 2128, 2131, +2170, 2124, 2154, +2176, 2127, 2200, +2167, 2133, 2262, +2179, 2135, 2315, +2208, 2135, 2395, +2271, 2155, 2484, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2359, 2122, +2407, 2359, 2122, +2407, 2359, 2123, +2407, 2358, 2123, +2408, 2359, 2125, +2408, 2360, 2128, +2409, 2360, 2131, +2409, 2360, 2135, +2408, 2362, 2141, +2405, 2359, 2147, +2402, 2358, 2164, +2395, 2358, 2193, +2399, 2361, 2228, +2408, 2365, 2275, +2419, 2368, 2338, +2446, 2373, 2402, +2486, 2387, 2498, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2688, 2656, 1989, +2688, 2656, 1991, +2688, 2656, 1992, +2689, 2656, 1995, +2690, 2656, 1999, +2690, 2657, 2008, +2688, 2657, 2023, +2688, 2657, 2054, +2688, 2658, 2083, +2688, 2659, 2149, +2689, 2659, 2227, +2696, 2667, 2323, +2703, 2668, 2417, +2722, 2681, 2534, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +1906, 311, 1618, +1906, 316, 1619, +1906, 322, 1620, +1906, 330, 1621, +1905, 342, 1623, +1905, 356, 1626, +1905, 374, 1630, +1904, 398, 1634, +1903, 427, 1640, +1901, 464, 1648, +1904, 471, 1670, +1909, 471, 1700, +1914, 464, 1736, +1910, 152, 1775, +1903, 63, 1817, +1900, 481, 1880, +1885, 481, 1958, +1866, 624, 2053, +1837, 927, 2156, +1786, 933, 2261, +1818, 679, 2380, +1933, 0, 2471, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1906, 330, 1619, +1907, 325, 1621, +1906, 332, 1622, +1906, 340, 1623, +1906, 351, 1625, +1905, 365, 1628, +1905, 383, 1631, +1904, 406, 1636, +1903, 435, 1642, +1901, 471, 1650, +1904, 478, 1672, +1910, 478, 1702, +1915, 478, 1736, +1910, 179, 1776, +1903, 95, 1817, +1900, 491, 1880, +1885, 491, 1958, +1866, 631, 2054, +1837, 928, 2156, +1786, 935, 2261, +1818, 681, 2380, +1933, 0, 2471, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1906, 354, 1621, +1907, 350, 1622, +1907, 344, 1624, +1907, 352, 1625, +1906, 362, 1627, +1906, 376, 1630, +1905, 393, 1633, +1904, 416, 1638, +1903, 444, 1644, +1902, 480, 1652, +1905, 486, 1674, +1910, 486, 1704, +1915, 486, 1738, +1910, 212, 1777, +1904, 135, 1818, +1900, 504, 1881, +1885, 504, 1959, +1866, 640, 2054, +1837, 930, 2156, +1787, 936, 2261, +1819, 684, 2380, +1933, 0, 2471, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1906, 384, 1623, +1907, 381, 1624, +1907, 375, 1626, +1907, 367, 1628, +1907, 377, 1630, +1906, 391, 1633, +1905, 408, 1636, +1905, 430, 1641, +1904, 457, 1647, +1902, 491, 1655, +1905, 498, 1676, +1911, 498, 1706, +1915, 498, 1740, +1910, 253, 1778, +1904, 183, 1819, +1900, 520, 1882, +1885, 520, 1960, +1866, 653, 2055, +1838, 932, 2156, +1787, 939, 2261, +1819, 688, 2381, +1933, 0, 2471, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1906, 422, 1625, +1907, 419, 1626, +1907, 413, 1628, +1907, 406, 1631, +1908, 397, 1634, +1907, 409, 1636, +1906, 426, 1640, +1905, 447, 1644, +1904, 473, 1650, +1903, 507, 1658, +1906, 513, 1680, +1911, 513, 1709, +1916, 513, 1743, +1911, 303, 1780, +1904, 241, 1821, +1899, 542, 1884, +1886, 542, 1962, +1866, 669, 2056, +1838, 935, 2156, +1788, 941, 2261, +1820, 693, 2381, +1933, 0, 2471, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1906, 468, 1629, +1907, 465, 1630, +1907, 460, 1632, +1907, 454, 1634, +1908, 445, 1637, +1908, 434, 1641, +1907, 449, 1645, +1906, 469, 1649, +1905, 495, 1655, +1904, 526, 1663, +1907, 533, 1684, +1912, 533, 1713, +1917, 533, 1747, +1911, 362, 1783, +1905, 308, 1823, +1899, 569, 1886, +1886, 569, 1964, +1866, 690, 2057, +1839, 939, 2157, +1789, 945, 2262, +1821, 700, 2381, +1933, 10, 2471, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1906, 523, 1633, +1907, 520, 1635, +1907, 516, 1636, +1907, 511, 1639, +1908, 503, 1642, +1908, 493, 1646, +1908, 479, 1651, +1908, 498, 1656, +1907, 521, 1662, +1905, 551, 1669, +1908, 557, 1690, +1913, 557, 1719, +1918, 557, 1753, +1912, 430, 1786, +1905, 384, 1826, +1898, 602, 1888, +1887, 602, 1966, +1866, 716, 2059, +1839, 944, 2157, +1791, 950, 2262, +1823, 708, 2381, +1933, 84, 2470, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1906, 588, 1640, +1907, 585, 1641, +1907, 582, 1643, +1907, 577, 1645, +1908, 570, 1648, +1908, 562, 1652, +1908, 550, 1657, +1909, 533, 1664, +1908, 555, 1670, +1907, 583, 1678, +1910, 588, 1698, +1915, 588, 1727, +1920, 588, 1759, +1913, 508, 1790, +1906, 470, 1830, +1897, 644, 1892, +1888, 644, 1970, +1866, 749, 2061, +1840, 951, 2157, +1793, 957, 2263, +1825, 720, 2382, +1933, 167, 2470, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1906, 662, 1647, +1907, 660, 1649, +1907, 657, 1650, +1907, 653, 1653, +1908, 647, 1655, +1908, 640, 1659, +1908, 629, 1665, +1909, 615, 1672, +1911, 596, 1681, +1909, 622, 1689, +1912, 627, 1708, +1917, 627, 1736, +1922, 627, 1769, +1913, 595, 1796, +1907, 563, 1835, +1896, 695, 1896, +1889, 695, 1975, +1866, 789, 2064, +1841, 960, 2158, +1796, 966, 2263, +1827, 735, 2383, +1933, 330, 2471, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1906, 745, 1658, +1907, 743, 1659, +1907, 741, 1661, +1907, 737, 1663, +1908, 733, 1666, +1908, 727, 1670, +1908, 718, 1675, +1909, 707, 1682, +1911, 691, 1691, +1912, 669, 1703, +1915, 674, 1722, +1920, 674, 1749, +1925, 674, 1780, +1915, 674, 1805, +1909, 665, 1842, +1894, 754, 1903, +1887, 754, 1980, +1866, 838, 2069, +1843, 972, 2159, +1800, 977, 2264, +1831, 754, 2384, +1933, 489, 2472, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +1910, 819, 1677, +1910, 817, 1678, +1910, 815, 1680, +1911, 812, 1682, +1911, 809, 1685, +1911, 803, 1689, +1912, 796, 1693, +1913, 787, 1700, +1914, 773, 1708, +1915, 755, 1720, +1915, 772, 1732, +1921, 772, 1758, +1925, 772, 1789, +1916, 772, 1813, +1909, 792, 1855, +1894, 863, 1914, +1887, 875, 1990, +1865, 911, 2073, +1841, 1000, 2165, +1800, 1040, 2269, +1833, 798, 2384, +1931, 640, 2472, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +1915, 898, 1703, +1915, 897, 1704, +1915, 895, 1705, +1915, 893, 1707, +1916, 890, 1710, +1916, 885, 1713, +1917, 879, 1718, +1918, 871, 1724, +1919, 860, 1732, +1920, 845, 1743, +1921, 860, 1755, +1921, 885, 1769, +1925, 885, 1799, +1916, 885, 1823, +1909, 925, 1873, +1894, 979, 1929, +1887, 1007, 2002, +1862, 997, 2078, +1838, 1037, 2174, +1800, 1121, 2277, +1843, 837, 2383, +1928, 785, 2473, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +1922, 997, 1735, +1922, 998, 1736, +1922, 997, 1737, +1922, 995, 1739, +1923, 993, 1741, +1923, 989, 1745, +1924, 984, 1749, +1925, 978, 1755, +1926, 969, 1763, +1927, 958, 1772, +1927, 969, 1783, +1927, 989, 1797, +1926, 1011, 1816, +1917, 1011, 1839, +1910, 1049, 1891, +1895, 1094, 1949, +1888, 1137, 2019, +1859, 1095, 2086, +1833, 1102, 2184, +1802, 1203, 2287, +1856, 905, 2383, +1926, 942, 2474, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +1931, 1121, 1774, +1931, 1122, 1775, +1931, 1123, 1776, +1932, 1124, 1778, +1932, 1126, 1780, +1932, 1129, 1783, +1933, 1132, 1787, +1934, 1137, 1793, +1935, 1143, 1800, +1936, 1145, 1809, +1936, 1152, 1819, +1936, 1166, 1832, +1935, 1181, 1849, +1921, 1181, 1881, +1914, 1207, 1928, +1905, 1197, 1974, +1898, 1248, 2038, +1870, 1219, 2099, +1827, 1224, 2189, +1814, 1266, 2289, +1856, 1137, 2381, +1933, 1139, 2475, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +1943, 1312, 1836, +1943, 1312, 1837, +1943, 1313, 1838, +1943, 1314, 1839, +1944, 1315, 1841, +1944, 1317, 1844, +1945, 1319, 1847, +1945, 1322, 1852, +1946, 1326, 1858, +1948, 1331, 1866, +1945, 1332, 1875, +1940, 1332, 1886, +1936, 1339, 1902, +1923, 1339, 1930, +1915, 1358, 1965, +1906, 1343, 2006, +1889, 1364, 2062, +1872, 1381, 2136, +1826, 1367, 2210, +1822, 1339, 2296, +1868, 1258, 2382, +1955, 1262, 2478, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +1969, 1458, 1884, +1969, 1458, 1884, +1968, 1458, 1885, +1968, 1458, 1887, +1968, 1458, 1888, +1968, 1458, 1890, +1967, 1458, 1892, +1966, 1458, 1896, +1965, 1458, 1900, +1964, 1458, 1906, +1962, 1458, 1913, +1957, 1458, 1924, +1950, 1459, 1938, +1941, 1472, 1960, +1934, 1487, 1991, +1937, 1461, 2031, +1908, 1472, 2078, +1899, 1508, 2159, +1871, 1507, 2226, +1869, 1459, 2304, +1906, 1424, 2382, +1989, 1433, 2480, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +1995, 1625, 1959, +1995, 1625, 1960, +1995, 1625, 1961, +1995, 1626, 1962, +1995, 1626, 1963, +1994, 1627, 1965, +1994, 1628, 1968, +1993, 1630, 1972, +1992, 1632, 1976, +1991, 1632, 1982, +1990, 1632, 1987, +1990, 1632, 1993, +1990, 1632, 2002, +1989, 1633, 2018, +1978, 1635, 2038, +1968, 1630, 2070, +1945, 1650, 2122, +1941, 1635, 2175, +1926, 1623, 2233, +1921, 1624, 2309, +1947, 1613, 2388, +2014, 1610, 2474, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2048, 1766, 1996, +2048, 1766, 1996, +2048, 1766, 1996, +2048, 1766, 1997, +2048, 1766, 1998, +2048, 1766, 1999, +2048, 1766, 2000, +2048, 1766, 2002, +2048, 1766, 2006, +2048, 1766, 2009, +2048, 1766, 2014, +2048, 1766, 2020, +2048, 1767, 2029, +2044, 1773, 2043, +2040, 1782, 2061, +2029, 1792, 2098, +2027, 1783, 2138, +1997, 1783, 2185, +1996, 1799, 2243, +1996, 1791, 2315, +2012, 1789, 2391, +2075, 1804, 2478, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2118, 1947, 2038, +2118, 1947, 2038, +2118, 1947, 2039, +2118, 1947, 2039, +2118, 1948, 2040, +2119, 1948, 2041, +2119, 1948, 2042, +2120, 1949, 2044, +2120, 1950, 2047, +2121, 1951, 2050, +2120, 1952, 2054, +2119, 1952, 2060, +2117, 1952, 2068, +2111, 1952, 2078, +2102, 1952, 2094, +2100, 1957, 2116, +2094, 1953, 2146, +2078, 1951, 2186, +2073, 1951, 2247, +2076, 1958, 2318, +2097, 1963, 2398, +2161, 1972, 2478, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2223, 2127, 2077, +2223, 2127, 2077, +2223, 2127, 2077, +2223, 2128, 2078, +2223, 2128, 2078, +2223, 2128, 2078, +2223, 2128, 2079, +2223, 2129, 2080, +2223, 2130, 2082, +2223, 2131, 2084, +2221, 2130, 2088, +2219, 2128, 2093, +2216, 2127, 2099, +2213, 2127, 2109, +2210, 2127, 2121, +2206, 2127, 2136, +2216, 2126, 2162, +2212, 2127, 2204, +2215, 2139, 2260, +2222, 2139, 2318, +2237, 2143, 2401, +2282, 2159, 2486, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2426, 2364, 2124, +2426, 2364, 2124, +2426, 2364, 2124, +2426, 2364, 2125, +2426, 2364, 2125, +2426, 2364, 2126, +2426, 2364, 2126, +2426, 2364, 2127, +2426, 2364, 2129, +2426, 2364, 2131, +2426, 2364, 2132, +2426, 2363, 2135, +2427, 2362, 2138, +2429, 2364, 2138, +2428, 2365, 2146, +2427, 2363, 2161, +2428, 2366, 2187, +2427, 2369, 2230, +2430, 2369, 2278, +2430, 2368, 2333, +2463, 2376, 2405, +2502, 2392, 2495, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2694, 2658, 1982, +2694, 2658, 1982, +2694, 2658, 1982, +2694, 2658, 1981, +2694, 2658, 1981, +2694, 2658, 1979, +2693, 2657, 1979, +2693, 2657, 1977, +2693, 2657, 1978, +2693, 2657, 1979, +2693, 2658, 1988, +2694, 2659, 2001, +2694, 2660, 2015, +2696, 2660, 2021, +2695, 2657, 2016, +2695, 2660, 2055, +2697, 2662, 2117, +2697, 2663, 2170, +2697, 2666, 2245, +2701, 2667, 2320, +2711, 2672, 2426, +2725, 2685, 2539, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2036, 810, 1881, +2036, 808, 1882, +2036, 806, 1882, +2036, 803, 1883, +2037, 799, 1884, +2037, 794, 1886, +2037, 787, 1887, +2038, 777, 1890, +2039, 763, 1894, +2040, 745, 1898, +2042, 718, 1904, +2043, 681, 1912, +2044, 657, 1923, +2037, 657, 1946, +2028, 657, 1974, +2025, 726, 2020, +2019, 820, 2081, +1994, 874, 2146, +1993, 810, 2228, +2002, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2036, 813, 1881, +2036, 813, 1882, +2036, 811, 1883, +2036, 808, 1884, +2037, 804, 1884, +2037, 799, 1886, +2037, 791, 1888, +2038, 782, 1891, +2039, 769, 1894, +2040, 750, 1898, +2042, 724, 1905, +2043, 687, 1912, +2044, 666, 1924, +2037, 666, 1946, +2028, 666, 1974, +2024, 730, 2021, +2019, 824, 2081, +1994, 876, 2146, +1994, 812, 2228, +2002, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2037, 817, 1881, +2036, 817, 1882, +2036, 817, 1883, +2036, 814, 1884, +2037, 810, 1885, +2037, 805, 1887, +2037, 798, 1888, +2038, 789, 1891, +2039, 776, 1894, +2040, 757, 1899, +2042, 732, 1905, +2043, 695, 1913, +2044, 675, 1924, +2037, 678, 1946, +2028, 678, 1974, +2024, 735, 2021, +2019, 831, 2081, +1994, 877, 2146, +1994, 814, 2228, +2002, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2037, 823, 1882, +2037, 823, 1883, +2037, 823, 1884, +2036, 823, 1885, +2037, 819, 1886, +2037, 814, 1887, +2037, 807, 1889, +2038, 797, 1892, +2039, 785, 1895, +2040, 767, 1900, +2042, 742, 1906, +2043, 706, 1914, +2044, 686, 1925, +2038, 693, 1947, +2028, 693, 1975, +2024, 742, 2022, +2020, 839, 2082, +1995, 880, 2146, +1995, 817, 2228, +2003, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2037, 830, 1882, +2037, 830, 1883, +2037, 830, 1884, +2037, 830, 1885, +2037, 830, 1887, +2037, 825, 1888, +2037, 818, 1891, +2038, 809, 1893, +2039, 797, 1897, +2040, 779, 1901, +2042, 755, 1907, +2043, 721, 1915, +2044, 701, 1926, +2038, 713, 1948, +2029, 713, 1976, +2024, 751, 2023, +2020, 850, 2082, +1995, 883, 2147, +1996, 821, 2228, +2004, 0, 2298, +2011, 0, 2383, +2069, 0, 2474, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2038, 840, 1883, +2038, 840, 1884, +2038, 840, 1884, +2037, 840, 1886, +2037, 840, 1887, +2037, 840, 1890, +2037, 833, 1892, +2038, 825, 1894, +2039, 813, 1898, +2040, 796, 1902, +2042, 772, 1908, +2043, 739, 1916, +2044, 721, 1927, +2038, 737, 1950, +2029, 737, 1977, +2023, 762, 2025, +2021, 864, 2083, +1996, 888, 2147, +1997, 826, 2228, +2005, 48, 2298, +2011, 0, 2383, +2069, 10, 2474, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2039, 853, 1883, +2039, 853, 1884, +2039, 853, 1885, +2038, 853, 1887, +2038, 853, 1888, +2038, 853, 1891, +2037, 853, 1894, +2038, 844, 1896, +2039, 833, 1900, +2040, 817, 1904, +2042, 794, 1910, +2043, 763, 1918, +2044, 745, 1929, +2039, 769, 1951, +2029, 769, 1979, +2023, 777, 2027, +2022, 882, 2084, +1997, 894, 2148, +1998, 832, 2227, +2006, 147, 2298, +2011, 89, 2384, +2069, 84, 2473, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2040, 869, 1884, +2040, 869, 1885, +2040, 869, 1886, +2040, 869, 1887, +2039, 869, 1889, +2039, 869, 1891, +2039, 869, 1894, +2038, 869, 1899, +2039, 858, 1902, +2040, 843, 1907, +2042, 822, 1913, +2043, 792, 1920, +2044, 776, 1932, +2039, 807, 1954, +2030, 807, 1981, +2022, 797, 2029, +2023, 905, 2085, +1998, 901, 2149, +2000, 841, 2227, +2007, 253, 2298, +2012, 208, 2384, +2069, 167, 2473, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2042, 890, 1885, +2042, 890, 1886, +2042, 890, 1887, +2041, 890, 1888, +2041, 890, 1890, +2041, 890, 1893, +2040, 890, 1896, +2040, 890, 1900, +2039, 890, 1905, +2040, 876, 1910, +2042, 857, 1916, +2043, 829, 1924, +2044, 814, 1935, +2040, 854, 1957, +2031, 854, 1984, +2021, 822, 2032, +2025, 934, 2086, +2000, 911, 2150, +2003, 852, 2226, +2009, 364, 2298, +2013, 329, 2385, +2069, 258, 2473, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2044, 917, 1887, +2044, 917, 1887, +2044, 917, 1889, +2043, 917, 1890, +2043, 917, 1892, +2043, 917, 1894, +2042, 917, 1897, +2042, 917, 1901, +2041, 917, 1907, +2040, 917, 1914, +2042, 899, 1920, +2043, 874, 1928, +2044, 861, 1939, +2041, 906, 1961, +2032, 910, 1988, +2020, 853, 2037, +2024, 959, 2090, +2002, 924, 2152, +2007, 867, 2226, +2011, 480, 2298, +2014, 453, 2386, +2069, 358, 2472, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2047, 951, 1889, +2047, 951, 1890, +2047, 951, 1891, +2047, 951, 1892, +2046, 951, 1894, +2046, 951, 1896, +2045, 951, 1899, +2045, 951, 1903, +2044, 951, 1909, +2043, 951, 1916, +2042, 951, 1926, +2043, 928, 1933, +2044, 916, 1944, +2041, 956, 1966, +2033, 976, 1993, +2021, 913, 2042, +2022, 990, 2095, +2006, 968, 2154, +2012, 886, 2225, +2014, 599, 2298, +2016, 579, 2387, +2069, 463, 2472, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2051, 992, 1892, +2051, 992, 1892, +2051, 992, 1894, +2050, 992, 1895, +2050, 992, 1897, +2050, 992, 1899, +2049, 992, 1902, +2049, 992, 1906, +2048, 992, 1912, +2047, 992, 1919, +2045, 992, 1928, +2043, 992, 1941, +2044, 981, 1951, +2041, 1016, 1973, +2035, 1052, 1999, +2023, 999, 2048, +2020, 1028, 2102, +2010, 1027, 2157, +2018, 910, 2223, +2019, 722, 2298, +2019, 682, 2389, +2069, 575, 2471, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2055, 1051, 1898, +2055, 1052, 1899, +2055, 1052, 1900, +2055, 1052, 1902, +2054, 1052, 1903, +2054, 1052, 1905, +2054, 1052, 1909, +2053, 1052, 1913, +2052, 1052, 1918, +2051, 1052, 1925, +2050, 1052, 1935, +2048, 1052, 1947, +2047, 1053, 1963, +2043, 1083, 1983, +2038, 1120, 2010, +2027, 1089, 2055, +2019, 1074, 2110, +2016, 1091, 2162, +2024, 958, 2224, +2023, 859, 2299, +2024, 795, 2391, +2069, 729, 2471, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2065, 1109, 1913, +2065, 1110, 1913, +2065, 1112, 1915, +2065, 1113, 1916, +2064, 1115, 1918, +2063, 1118, 1921, +2063, 1121, 1924, +2061, 1126, 1929, +2060, 1132, 1936, +2058, 1137, 1943, +2057, 1137, 1952, +2055, 1137, 1964, +2053, 1137, 1979, +2053, 1164, 1999, +2049, 1195, 2025, +2041, 1167, 2059, +2028, 1112, 2110, +2027, 1145, 2168, +2024, 1061, 2228, +2023, 1050, 2301, +2024, 973, 2387, +2069, 983, 2473, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2079, 1177, 1931, +2078, 1178, 1932, +2078, 1179, 1933, +2078, 1180, 1934, +2077, 1182, 1936, +2077, 1184, 1939, +2076, 1187, 1942, +2075, 1191, 1947, +2073, 1196, 1953, +2071, 1204, 1961, +2068, 1213, 1971, +2065, 1225, 1985, +2062, 1230, 2000, +2062, 1252, 2020, +2062, 1280, 2044, +2056, 1256, 2073, +2047, 1209, 2114, +2037, 1182, 2169, +2024, 1169, 2235, +2023, 1221, 2303, +2029, 1152, 2384, +2060, 1207, 2475, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2099, 1357, 1955, +2099, 1357, 1955, +2099, 1357, 1955, +2099, 1357, 1956, +2098, 1357, 1957, +2098, 1357, 1958, +2097, 1357, 1960, +2096, 1357, 1962, +2094, 1357, 1965, +2093, 1357, 1969, +2090, 1361, 1977, +2086, 1370, 1990, +2083, 1381, 2008, +2080, 1396, 2034, +2079, 1416, 2059, +2078, 1420, 2093, +2067, 1399, 2124, +2059, 1381, 2174, +2045, 1359, 2234, +2030, 1417, 2304, +2051, 1393, 2388, +2070, 1417, 2476, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2118, 1561, 1978, +2118, 1561, 1978, +2118, 1561, 1979, +2118, 1561, 1980, +2119, 1561, 1982, +2119, 1561, 1984, +2119, 1561, 1986, +2120, 1561, 1990, +2120, 1561, 1994, +2119, 1561, 1998, +2116, 1561, 2003, +2113, 1561, 2009, +2109, 1560, 2018, +2103, 1553, 2032, +2099, 1566, 2064, +2098, 1570, 2096, +2095, 1587, 2145, +2080, 1579, 2177, +2077, 1562, 2236, +2046, 1604, 2305, +2071, 1614, 2389, +2114, 1600, 2477, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2134, 1765, 2000, +2134, 1765, 2001, +2134, 1766, 2001, +2134, 1766, 2002, +2134, 1767, 2003, +2134, 1767, 2004, +2134, 1768, 2005, +2134, 1769, 2007, +2134, 1771, 2010, +2134, 1772, 2014, +2135, 1773, 2021, +2137, 1773, 2031, +2138, 1773, 2045, +2138, 1767, 2062, +2131, 1758, 2076, +2129, 1756, 2098, +2124, 1756, 2137, +2121, 1783, 2193, +2113, 1774, 2243, +2086, 1783, 2307, +2096, 1787, 2390, +2148, 1816, 2480, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2181, 1956, 2056, +2181, 1956, 2057, +2181, 1956, 2057, +2182, 1956, 2057, +2182, 1955, 2057, +2182, 1955, 2057, +2182, 1955, 2058, +2183, 1954, 2058, +2183, 1953, 2059, +2184, 1951, 2060, +2185, 1950, 2062, +2187, 1947, 2063, +2188, 1945, 2068, +2188, 1950, 2081, +2188, 1955, 2098, +2191, 1957, 2124, +2187, 1958, 2158, +2166, 1958, 2197, +2157, 1958, 2256, +2157, 1958, 2315, +2170, 1965, 2391, +2214, 1983, 2481, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2280, 2135, 2094, +2279, 2135, 2094, +2279, 2135, 2094, +2279, 2135, 2093, +2279, 2135, 2093, +2279, 2135, 2093, +2278, 2135, 2093, +2278, 2135, 2092, +2278, 2135, 2091, +2277, 2135, 2090, +2276, 2135, 2089, +2275, 2135, 2087, +2273, 2135, 2088, +2271, 2132, 2104, +2268, 2128, 2124, +2265, 2127, 2141, +2261, 2127, 2163, +2267, 2131, 2204, +2267, 2143, 2274, +2279, 2151, 2326, +2302, 2151, 2402, +2336, 2169, 2486, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2461, 2367, 2129, +2461, 2367, 2129, +2461, 2367, 2129, +2460, 2367, 2129, +2460, 2367, 2129, +2460, 2367, 2129, +2460, 2367, 2129, +2459, 2367, 2129, +2458, 2367, 2129, +2457, 2367, 2129, +2456, 2367, 2129, +2456, 2367, 2131, +2456, 2368, 2135, +2457, 2370, 2144, +2458, 2370, 2155, +2459, 2368, 2173, +2458, 2367, 2191, +2459, 2372, 2228, +2457, 2374, 2273, +2469, 2375, 2338, +2498, 2390, 2405, +2539, 2403, 2489, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2709, 2666, 2040, +2709, 2666, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2710, 2664, 2040, +2710, 2664, 2039, +2710, 2664, 2038, +2710, 2664, 2037, +2710, 2663, 2035, +2710, 2663, 2036, +2709, 2665, 2056, +2708, 2668, 2074, +2708, 2667, 2090, +2708, 2666, 2122, +2710, 2669, 2190, +2713, 2675, 2273, +2712, 2672, 2336, +2722, 2681, 2446, +2732, 2688, 2548, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2203, 0, 1962, +2203, 0, 1963, +2203, 0, 1963, +2203, 0, 1964, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1969, +2202, 0, 1972, +2201, 0, 1976, +2200, 0, 1981, +2199, 0, 1988, +2198, 0, 1996, +2196, 0, 2008, +2194, 0, 2027, +2190, 0, 2051, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2160, 0, 2231, +2145, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2203, 0, 1962, +2203, 0, 1963, +2203, 0, 1963, +2203, 0, 1965, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1969, +2202, 0, 1972, +2201, 0, 1976, +2200, 0, 1981, +2199, 0, 1988, +2198, 0, 1997, +2196, 0, 2008, +2194, 0, 2027, +2190, 0, 2051, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2160, 0, 2231, +2145, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2203, 0, 1962, +2203, 0, 1963, +2203, 0, 1964, +2203, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1976, +2200, 0, 1981, +2199, 0, 1988, +2198, 0, 1997, +2196, 0, 2008, +2194, 0, 2026, +2190, 0, 2051, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2161, 0, 2231, +2146, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2203, 0, 1963, +2203, 0, 1963, +2203, 0, 1964, +2203, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1977, +2200, 0, 1982, +2199, 0, 1988, +2198, 0, 1997, +2196, 0, 2008, +2194, 0, 2026, +2190, 0, 2050, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2161, 0, 2232, +2146, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2202, 0, 1963, +2202, 0, 1963, +2202, 0, 1964, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1977, +2200, 0, 1982, +2199, 0, 1989, +2198, 0, 1997, +2196, 0, 2009, +2194, 0, 2026, +2190, 0, 2050, +2188, 0, 2090, +2187, 0, 2136, +2178, 0, 2178, +2161, 0, 2232, +2147, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2202, 0, 1963, +2202, 0, 1964, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1969, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1977, +2200, 0, 1982, +2199, 0, 1989, +2198, 0, 1998, +2196, 0, 2009, +2194, 0, 2026, +2190, 0, 2050, +2188, 0, 2090, +2187, 0, 2136, +2178, 0, 2178, +2162, 0, 2232, +2148, 0, 2305, +2169, 0, 2389, +2195, 74, 2474, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2202, 0, 1964, +2202, 0, 1965, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1969, +2202, 0, 1971, +2202, 0, 1974, +2201, 0, 1978, +2200, 0, 1983, +2199, 0, 1989, +2198, 0, 1998, +2196, 0, 2010, +2194, 0, 2025, +2190, 0, 2049, +2188, 0, 2090, +2187, 0, 2137, +2178, 0, 2178, +2162, 0, 2232, +2149, 0, 2305, +2168, 0, 2389, +2196, 195, 2474, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2202, 0, 1965, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1972, +2202, 0, 1975, +2201, 0, 1979, +2200, 0, 1984, +2199, 0, 1990, +2198, 0, 1999, +2196, 0, 2010, +2194, 0, 2024, +2190, 0, 2049, +2188, 0, 2090, +2187, 0, 2138, +2178, 0, 2178, +2163, 0, 2233, +2150, 0, 2306, +2168, 0, 2388, +2196, 319, 2474, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2201, 0, 1966, +2201, 0, 1966, +2201, 0, 1967, +2201, 0, 1968, +2201, 0, 1969, +2201, 0, 1971, +2201, 0, 1973, +2201, 0, 1976, +2201, 0, 1979, +2200, 0, 1984, +2199, 0, 1991, +2198, 0, 2000, +2196, 0, 2011, +2194, 0, 2024, +2190, 0, 2048, +2187, 0, 2090, +2187, 0, 2140, +2178, 0, 2178, +2165, 0, 2233, +2152, 111, 2306, +2167, 0, 2388, +2195, 419, 2475, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2200, 0, 1967, +2200, 0, 1968, +2200, 0, 1968, +2200, 0, 1969, +2200, 0, 1970, +2200, 0, 1972, +2200, 0, 1974, +2200, 0, 1977, +2200, 0, 1981, +2200, 0, 1986, +2199, 0, 1993, +2198, 0, 2001, +2196, 0, 2012, +2194, 0, 2023, +2190, 0, 2047, +2186, 0, 2090, +2186, 0, 2140, +2178, 0, 2178, +2166, 0, 2234, +2155, 244, 2307, +2166, 0, 2388, +2195, 523, 2475, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 0, 1969, +2199, 0, 1969, +2199, 0, 1970, +2199, 0, 1971, +2199, 0, 1972, +2199, 0, 1974, +2199, 0, 1976, +2199, 0, 1979, +2199, 0, 1983, +2199, 0, 1988, +2199, 0, 1994, +2198, 0, 2003, +2196, 0, 2014, +2194, 0, 2025, +2190, 0, 2045, +2186, 0, 2089, +2185, 0, 2140, +2178, 0, 2180, +2169, 0, 2235, +2158, 376, 2308, +2165, 61, 2387, +2194, 633, 2476, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2198, 0, 1971, +2198, 0, 1972, +2198, 0, 1972, +2198, 0, 1973, +2198, 0, 1974, +2198, 0, 1976, +2198, 0, 1978, +2198, 0, 1981, +2198, 0, 1985, +2198, 0, 1990, +2198, 0, 1996, +2198, 0, 2005, +2196, 0, 2016, +2194, 0, 2027, +2190, 0, 2043, +2186, 0, 2087, +2183, 0, 2140, +2178, 0, 2183, +2172, 0, 2236, +2163, 508, 2309, +2167, 263, 2387, +2192, 748, 2476, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2197, 0, 1974, +2197, 0, 1974, +2197, 0, 1975, +2197, 0, 1976, +2197, 0, 1977, +2197, 0, 1979, +2197, 0, 1981, +2197, 0, 1984, +2197, 0, 1988, +2197, 0, 1993, +2197, 0, 1999, +2197, 0, 2008, +2196, 0, 2019, +2194, 0, 2030, +2190, 0, 2044, +2186, 0, 2085, +2183, 0, 2139, +2179, 0, 2186, +2175, 0, 2237, +2168, 643, 2310, +2170, 532, 2388, +2192, 890, 2477, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2200, 621, 1974, +2200, 621, 1974, +2200, 621, 1976, +2200, 621, 1977, +2200, 621, 1978, +2200, 621, 1980, +2201, 621, 1983, +2201, 621, 1986, +2202, 621, 1991, +2202, 621, 1997, +2202, 621, 2003, +2202, 621, 2012, +2202, 617, 2022, +2196, 529, 2033, +2193, 529, 2047, +2189, 621, 2082, +2185, 627, 2133, +2182, 413, 2189, +2177, 708, 2240, +2170, 828, 2310, +2173, 948, 2390, +2196, 1121, 2478, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2203, 974, 1974, +2203, 974, 1974, +2203, 974, 1976, +2203, 974, 1977, +2203, 974, 1978, +2204, 974, 1980, +2204, 974, 1983, +2204, 974, 1986, +2205, 974, 1991, +2206, 974, 1997, +2207, 974, 2005, +2208, 974, 2016, +2208, 973, 2027, +2203, 934, 2038, +2196, 877, 2052, +2192, 934, 2084, +2188, 977, 2129, +2185, 874, 2183, +2181, 1059, 2243, +2174, 996, 2310, +2175, 1202, 2391, +2206, 1271, 2478, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2208, 1278, 1984, +2208, 1279, 1985, +2208, 1279, 1986, +2208, 1281, 1986, +2209, 1282, 1987, +2209, 1284, 1988, +2209, 1286, 1990, +2209, 1289, 1992, +2210, 1294, 1995, +2211, 1299, 1998, +2212, 1302, 2005, +2213, 1302, 2016, +2214, 1300, 2030, +2212, 1282, 2047, +2206, 1256, 2063, +2201, 1278, 2090, +2194, 1321, 2134, +2193, 1308, 2182, +2182, 1327, 2241, +2178, 1331, 2310, +2182, 1416, 2391, +2214, 1452, 2477, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2220, 1531, 2004, +2220, 1531, 2004, +2220, 1531, 2004, +2220, 1532, 2005, +2220, 1533, 2006, +2220, 1534, 2007, +2220, 1535, 2008, +2220, 1537, 2010, +2220, 1540, 2013, +2221, 1543, 2017, +2222, 1547, 2021, +2223, 1553, 2027, +2224, 1559, 2037, +2222, 1557, 2051, +2218, 1543, 2073, +2214, 1535, 2102, +2208, 1550, 2140, +2199, 1572, 2190, +2195, 1558, 2240, +2192, 1577, 2310, +2192, 1604, 2393, +2223, 1653, 2476, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2241, 1755, 2023, +2241, 1755, 2023, +2241, 1755, 2024, +2241, 1755, 2024, +2241, 1755, 2025, +2241, 1755, 2025, +2241, 1755, 2026, +2241, 1755, 2028, +2241, 1755, 2029, +2241, 1755, 2031, +2241, 1758, 2036, +2241, 1761, 2042, +2240, 1765, 2049, +2240, 1765, 2063, +2238, 1765, 2080, +2237, 1764, 2104, +2229, 1762, 2147, +2223, 1755, 2193, +2223, 1765, 2244, +2223, 1774, 2315, +2215, 1795, 2391, +2250, 1824, 2482, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2268, 1946, 2048, +2268, 1946, 2049, +2269, 1946, 2049, +2269, 1946, 2050, +2269, 1946, 2051, +2269, 1946, 2051, +2270, 1946, 2053, +2270, 1946, 2054, +2270, 1946, 2057, +2271, 1946, 2060, +2272, 1946, 2064, +2273, 1946, 2070, +2274, 1945, 2077, +2274, 1945, 2087, +2274, 1945, 2099, +2271, 1951, 2124, +2268, 1961, 2158, +2265, 1963, 2203, +2273, 1968, 2256, +2261, 1969, 2321, +2271, 1965, 2394, +2310, 1995, 2482, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2351, 2143, 2087, +2351, 2143, 2087, +2351, 2143, 2087, +2351, 2143, 2088, +2351, 2143, 2088, +2351, 2143, 2089, +2351, 2143, 2091, +2351, 2143, 2092, +2351, 2143, 2094, +2351, 2143, 2097, +2351, 2143, 2101, +2351, 2143, 2106, +2351, 2143, 2112, +2351, 2143, 2115, +2351, 2143, 2119, +2351, 2143, 2141, +2349, 2146, 2174, +2346, 2147, 2214, +2351, 2143, 2263, +2356, 2159, 2326, +2362, 2167, 2401, +2402, 2189, 2492, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2515, 2384, 2126, +2514, 2384, 2127, +2514, 2384, 2127, +2514, 2384, 2127, +2514, 2383, 2127, +2514, 2383, 2127, +2514, 2383, 2128, +2514, 2383, 2128, +2514, 2382, 2129, +2513, 2382, 2130, +2513, 2381, 2131, +2513, 2381, 2133, +2514, 2382, 2135, +2515, 2384, 2141, +2515, 2385, 2150, +2515, 2388, 2172, +2515, 2388, 2195, +2520, 2388, 2230, +2523, 2391, 2279, +2523, 2395, 2342, +2548, 2407, 2404, +2582, 2421, 2483, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2731, 2680, 2128, +2731, 2680, 2129, +2731, 2680, 2129, +2731, 2680, 2130, +2731, 2680, 2131, +2731, 2681, 2132, +2731, 2681, 2133, +2731, 2681, 2135, +2731, 2681, 2136, +2730, 2681, 2137, +2730, 2681, 2138, +2729, 2680, 2140, +2728, 2679, 2142, +2728, 2679, 2150, +2730, 2679, 2164, +2731, 2678, 2176, +2730, 2679, 2195, +2730, 2680, 2243, +2735, 2682, 2308, +2735, 2687, 2382, +2739, 2689, 2468, +2750, 2708, 2581, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2331, 0, 2024, +2330, 0, 2034, +2326, 0, 2051, +2322, 0, 2072, +2321, 0, 2094, +2320, 0, 2138, +2314, 0, 2186, +2319, 0, 2244, +2315, 0, 2315, +2317, 0, 2391, +2334, 913, 2480, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2331, 0, 2024, +2330, 0, 2034, +2326, 0, 2051, +2322, 0, 2072, +2321, 0, 2094, +2320, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 917, 2480, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2051, +2322, 0, 2072, +2321, 0, 2095, +2320, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 922, 2479, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2052, +2322, 0, 2072, +2321, 0, 2095, +2321, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 929, 2479, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2052, +2322, 0, 2072, +2321, 0, 2095, +2321, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 938, 2479, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2330, 0, 2002, +2330, 0, 2003, +2330, 0, 2005, +2330, 0, 2007, +2330, 0, 2010, +2330, 0, 2013, +2330, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2052, +2322, 0, 2073, +2321, 0, 2095, +2322, 0, 2138, +2315, 0, 2186, +2318, 0, 2245, +2315, 30, 2315, +2317, 0, 2392, +2334, 949, 2479, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2331, 0, 2000, +2330, 0, 2000, +2330, 0, 2001, +2330, 0, 2001, +2330, 0, 2002, +2330, 0, 2003, +2330, 0, 2005, +2330, 0, 2007, +2330, 0, 2010, +2330, 0, 2013, +2330, 0, 2018, +2329, 0, 2024, +2328, 0, 2034, +2327, 0, 2053, +2323, 0, 2073, +2321, 0, 2096, +2322, 0, 2139, +2315, 0, 2186, +2318, 0, 2245, +2315, 163, 2315, +2317, 32, 2392, +2334, 964, 2478, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2330, 0, 2000, +2330, 0, 2000, +2330, 0, 2001, +2330, 0, 2001, +2330, 0, 2002, +2330, 0, 2003, +2329, 0, 2005, +2329, 0, 2007, +2329, 0, 2010, +2329, 0, 2013, +2329, 0, 2018, +2328, 0, 2024, +2327, 0, 2034, +2327, 0, 2053, +2323, 0, 2073, +2321, 0, 2096, +2323, 0, 2139, +2316, 0, 2186, +2318, 0, 2246, +2315, 295, 2315, +2317, 164, 2393, +2334, 983, 2478, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2330, 0, 2000, +2330, 0, 2000, +2330, 0, 2001, +2330, 0, 2001, +2329, 0, 2002, +2329, 0, 2003, +2329, 0, 2005, +2329, 0, 2007, +2328, 0, 2010, +2328, 0, 2013, +2328, 0, 2018, +2328, 0, 2024, +2327, 0, 2034, +2327, 0, 2054, +2323, 0, 2074, +2321, 0, 2097, +2325, 0, 2140, +2316, 0, 2186, +2317, 111, 2246, +2315, 426, 2315, +2317, 296, 2393, +2334, 993, 2478, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2329, 0, 2000, +2329, 0, 2000, +2329, 0, 2001, +2329, 0, 2001, +2329, 0, 2002, +2329, 0, 2003, +2328, 0, 2005, +2328, 0, 2007, +2328, 0, 2010, +2327, 0, 2013, +2327, 0, 2018, +2326, 0, 2024, +2325, 0, 2034, +2327, 0, 2055, +2324, 0, 2075, +2321, 0, 2098, +2325, 0, 2141, +2317, 0, 2186, +2317, 244, 2247, +2315, 559, 2315, +2317, 428, 2393, +2335, 1003, 2479, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2328, 0, 2000, +2328, 0, 2000, +2328, 0, 2001, +2328, 0, 2001, +2328, 0, 2002, +2328, 0, 2003, +2328, 0, 2005, +2327, 0, 2007, +2327, 0, 2010, +2326, 0, 2013, +2325, 0, 2018, +2325, 0, 2024, +2324, 0, 2034, +2326, 0, 2055, +2325, 61, 2077, +2322, 0, 2099, +2325, 0, 2142, +2319, 0, 2187, +2316, 376, 2248, +2315, 691, 2315, +2317, 560, 2394, +2337, 1018, 2479, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2328, 0, 2000, +2328, 0, 2000, +2328, 0, 2001, +2328, 0, 2001, +2328, 0, 2002, +2327, 0, 2003, +2327, 0, 2005, +2327, 0, 2007, +2326, 0, 2010, +2326, 0, 2013, +2325, 0, 2018, +2325, 0, 2027, +2324, 0, 2036, +2326, 0, 2057, +2327, 111, 2081, +2323, 0, 2103, +2324, 0, 2142, +2322, 0, 2190, +2315, 426, 2247, +2315, 741, 2315, +2319, 692, 2394, +2338, 1091, 2481, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2328, 0, 2000, +2328, 0, 2001, +2328, 0, 2001, +2328, 0, 2002, +2328, 0, 2003, +2328, 0, 2004, +2328, 0, 2006, +2327, 0, 2008, +2327, 0, 2011, +2326, 0, 2014, +2326, 0, 2019, +2325, 0, 2028, +2325, 0, 2040, +2327, 44, 2061, +2328, 216, 2085, +2326, 0, 2109, +2323, 0, 2139, +2324, 123, 2193, +2314, 517, 2247, +2316, 765, 2314, +2321, 843, 2393, +2340, 1204, 2482, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2332, 614, 2005, +2332, 614, 2005, +2332, 614, 2006, +2332, 614, 2007, +2332, 614, 2008, +2332, 614, 2009, +2331, 614, 2011, +2331, 614, 2014, +2331, 614, 2017, +2330, 614, 2021, +2329, 614, 2026, +2329, 614, 2035, +2329, 614, 2047, +2329, 614, 2057, +2330, 670, 2082, +2328, 727, 2109, +2321, 757, 2137, +2324, 709, 2196, +2318, 901, 2249, +2318, 868, 2316, +2319, 1072, 2391, +2342, 1300, 2483, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2336, 924, 2012, +2336, 924, 2013, +2336, 924, 2013, +2336, 924, 2014, +2335, 924, 2015, +2335, 924, 2017, +2335, 924, 2019, +2335, 924, 2021, +2335, 924, 2024, +2334, 924, 2029, +2333, 924, 2035, +2333, 924, 2042, +2333, 924, 2052, +2333, 924, 2063, +2333, 971, 2080, +2330, 1020, 2108, +2324, 1065, 2141, +2325, 1052, 2197, +2321, 1173, 2253, +2319, 1077, 2317, +2317, 1227, 2391, +2345, 1377, 2483, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2339, 1291, 2020, +2339, 1291, 2020, +2339, 1290, 2020, +2339, 1289, 2020, +2339, 1288, 2021, +2339, 1286, 2022, +2338, 1283, 2023, +2338, 1280, 2024, +2338, 1276, 2026, +2337, 1270, 2028, +2336, 1267, 2033, +2336, 1267, 2040, +2336, 1269, 2048, +2336, 1288, 2065, +2336, 1315, 2084, +2334, 1351, 2116, +2331, 1343, 2151, +2330, 1343, 2198, +2326, 1378, 2257, +2319, 1407, 2317, +2328, 1414, 2394, +2350, 1546, 2482, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2349, 1557, 2025, +2349, 1557, 2025, +2349, 1557, 2025, +2349, 1557, 2026, +2348, 1557, 2026, +2348, 1557, 2027, +2348, 1557, 2028, +2348, 1557, 2029, +2347, 1557, 2031, +2347, 1554, 2033, +2346, 1550, 2036, +2345, 1548, 2041, +2344, 1548, 2050, +2344, 1550, 2067, +2343, 1557, 2089, +2339, 1571, 2115, +2337, 1566, 2150, +2337, 1567, 2198, +2334, 1596, 2255, +2334, 1620, 2319, +2342, 1646, 2396, +2365, 1717, 2481, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2364, 1776, 2032, +2364, 1776, 2033, +2364, 1776, 2033, +2364, 1777, 2034, +2364, 1778, 2035, +2364, 1779, 2037, +2363, 1781, 2038, +2363, 1783, 2041, +2363, 1786, 2044, +2362, 1790, 2049, +2361, 1791, 2052, +2360, 1789, 2057, +2359, 1784, 2065, +2361, 1784, 2074, +2360, 1788, 2094, +2357, 1783, 2117, +2358, 1792, 2156, +2361, 1806, 2207, +2354, 1805, 2259, +2356, 1809, 2322, +2365, 1822, 2394, +2383, 1874, 2484, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2074, +2391, 1976, 2074, +2391, 1976, 2075, +2391, 1976, 2076, +2391, 1976, 2077, +2391, 1976, 2078, +2391, 1976, 2080, +2392, 1977, 2084, +2394, 1981, 2093, +2395, 1984, 2105, +2395, 1984, 2134, +2392, 1984, 2163, +2391, 1984, 2207, +2387, 1995, 2266, +2396, 1995, 2324, +2406, 2017, 2405, +2425, 2038, 2488, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2463, 2177, 2109, +2463, 2177, 2109, +2463, 2177, 2110, +2463, 2177, 2110, +2463, 2177, 2110, +2463, 2177, 2111, +2463, 2178, 2112, +2463, 2178, 2113, +2463, 2179, 2114, +2463, 2180, 2116, +2463, 2181, 2119, +2462, 2182, 2121, +2460, 2183, 2124, +2459, 2181, 2126, +2458, 2177, 2134, +2459, 2184, 2157, +2463, 2186, 2183, +2461, 2184, 2220, +2460, 2188, 2268, +2468, 2189, 2340, +2476, 2191, 2406, +2508, 2230, 2493, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2598, 2410, 2071, +2598, 2410, 2071, +2599, 2411, 2071, +2599, 2411, 2071, +2599, 2411, 2071, +2600, 2412, 2070, +2600, 2412, 2070, +2602, 2413, 2069, +2603, 2414, 2069, +2604, 2416, 2068, +2606, 2418, 2066, +2607, 2419, 2068, +2607, 2420, 2073, +2607, 2420, 2079, +2607, 2420, 2088, +2607, 2420, 2112, +2607, 2422, 2147, +2606, 2422, 2181, +2609, 2420, 2243, +2615, 2426, 2302, +2628, 2437, 2380, +2656, 2458, 2462, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2763, 2702, 2255, +2763, 2702, 2255, +2763, 2702, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2763, 2701, 2256, +2763, 2701, 2257, +2764, 2701, 2260, +2765, 2701, 2267, +2765, 2701, 2274, +2763, 2702, 2284, +2762, 2704, 2300, +2763, 2706, 2316, +2764, 2703, 2348, +2764, 2703, 2388, +2768, 2710, 2455, +2769, 2717, 2538, +2774, 2727, 2626, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2481, 974, 2044, +2481, 973, 2044, +2481, 971, 2044, +2481, 969, 2045, +2480, 967, 2045, +2480, 963, 2046, +2480, 958, 2047, +2480, 951, 2048, +2480, 951, 2051, +2480, 951, 2054, +2480, 951, 2058, +2480, 951, 2063, +2480, 955, 2072, +2479, 992, 2087, +2477, 1037, 2103, +2476, 1071, 2127, +2475, 1132, 2163, +2475, 1219, 2209, +2476, 1370, 2267, +2478, 1392, 2329, +2488, 1469, 2402, +2504, 1610, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2481, 977, 2044, +2481, 977, 2044, +2481, 976, 2044, +2480, 974, 2045, +2480, 971, 2045, +2480, 968, 2046, +2480, 963, 2047, +2480, 956, 2048, +2480, 955, 2051, +2480, 955, 2054, +2480, 955, 2058, +2480, 955, 2063, +2480, 960, 2072, +2479, 996, 2087, +2477, 1041, 2103, +2476, 1074, 2127, +2476, 1133, 2163, +2475, 1220, 2209, +2476, 1373, 2267, +2478, 1394, 2329, +2488, 1469, 2402, +2504, 1611, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2481, 982, 2044, +2481, 982, 2044, +2480, 982, 2044, +2480, 980, 2045, +2480, 977, 2045, +2480, 974, 2046, +2480, 969, 2047, +2480, 962, 2048, +2480, 962, 2051, +2480, 962, 2054, +2480, 962, 2058, +2480, 962, 2063, +2480, 966, 2072, +2479, 1002, 2087, +2477, 1046, 2103, +2476, 1079, 2127, +2476, 1136, 2162, +2475, 1221, 2209, +2476, 1377, 2267, +2478, 1397, 2329, +2488, 1469, 2402, +2504, 1611, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2481, 988, 2044, +2480, 988, 2044, +2480, 988, 2044, +2480, 988, 2045, +2480, 985, 2045, +2480, 981, 2046, +2480, 977, 2047, +2480, 970, 2048, +2480, 970, 2051, +2480, 970, 2054, +2480, 970, 2058, +2480, 970, 2063, +2480, 974, 2072, +2479, 1010, 2087, +2477, 1053, 2103, +2476, 1085, 2127, +2476, 1138, 2162, +2475, 1222, 2209, +2476, 1382, 2267, +2478, 1400, 2329, +2488, 1469, 2402, +2504, 1612, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2480, 996, 2044, +2480, 996, 2044, +2480, 996, 2044, +2480, 996, 2045, +2480, 996, 2045, +2480, 992, 2046, +2480, 987, 2047, +2480, 981, 2048, +2480, 981, 2051, +2480, 981, 2054, +2480, 981, 2058, +2480, 981, 2063, +2480, 985, 2072, +2479, 1020, 2087, +2477, 1062, 2103, +2476, 1094, 2127, +2476, 1142, 2162, +2476, 1223, 2208, +2476, 1388, 2268, +2478, 1404, 2329, +2488, 1469, 2402, +2504, 1614, 2487, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2480, 1006, 2044, +2480, 1006, 2044, +2480, 1006, 2044, +2480, 1006, 2045, +2480, 1006, 2045, +2480, 1006, 2046, +2480, 1001, 2047, +2479, 995, 2048, +2479, 995, 2051, +2479, 995, 2054, +2479, 995, 2058, +2479, 995, 2063, +2479, 999, 2072, +2479, 1032, 2087, +2477, 1074, 2103, +2476, 1105, 2127, +2476, 1147, 2162, +2476, 1225, 2208, +2476, 1397, 2268, +2478, 1409, 2329, +2488, 1469, 2401, +2503, 1615, 2487, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2480, 1019, 2044, +2480, 1019, 2044, +2480, 1019, 2044, +2480, 1019, 2045, +2480, 1019, 2045, +2480, 1019, 2046, +2479, 1019, 2047, +2479, 1013, 2048, +2479, 1013, 2051, +2479, 1013, 2054, +2479, 1013, 2058, +2479, 1013, 2063, +2479, 1017, 2072, +2479, 1049, 2087, +2477, 1089, 2103, +2475, 1119, 2127, +2476, 1154, 2161, +2476, 1228, 2208, +2477, 1408, 2268, +2477, 1417, 2329, +2488, 1469, 2401, +2503, 1618, 2486, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2480, 1036, 2044, +2480, 1036, 2044, +2480, 1036, 2044, +2480, 1036, 2045, +2480, 1036, 2045, +2479, 1036, 2046, +2479, 1036, 2047, +2479, 1036, 2048, +2479, 1036, 2051, +2479, 1036, 2054, +2479, 1036, 2058, +2479, 1036, 2063, +2479, 1039, 2072, +2478, 1070, 2087, +2476, 1108, 2103, +2475, 1137, 2127, +2477, 1162, 2161, +2476, 1232, 2207, +2477, 1423, 2268, +2477, 1426, 2329, +2488, 1469, 2401, +2503, 1621, 2486, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2480, 1071, 2044, +2480, 1071, 2044, +2480, 1071, 2044, +2480, 1071, 2045, +2480, 1071, 2045, +2479, 1071, 2046, +2479, 1071, 2047, +2479, 1071, 2048, +2479, 1044, 2051, +2479, 1044, 2054, +2479, 1044, 2058, +2479, 1044, 2063, +2479, 1048, 2072, +2479, 1085, 2087, +2477, 1122, 2103, +2476, 1149, 2126, +2478, 1179, 2161, +2476, 1241, 2208, +2477, 1424, 2268, +2478, 1436, 2329, +2488, 1480, 2401, +2504, 1627, 2485, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2480, 1115, 2044, +2480, 1115, 2044, +2480, 1115, 2044, +2480, 1115, 2045, +2480, 1115, 2045, +2479, 1115, 2046, +2479, 1115, 2047, +2479, 1115, 2048, +2479, 1091, 2051, +2479, 1054, 2054, +2479, 1054, 2058, +2479, 1054, 2063, +2479, 1058, 2072, +2479, 1099, 2087, +2478, 1138, 2103, +2476, 1165, 2125, +2478, 1193, 2160, +2477, 1254, 2209, +2477, 1424, 2266, +2479, 1448, 2329, +2488, 1495, 2401, +2504, 1635, 2485, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2480, 1169, 2044, +2480, 1169, 2044, +2480, 1169, 2044, +2480, 1169, 2045, +2480, 1169, 2045, +2479, 1169, 2046, +2479, 1169, 2047, +2479, 1169, 2048, +2479, 1147, 2051, +2479, 1114, 2054, +2479, 1067, 2058, +2479, 1067, 2063, +2479, 1070, 2072, +2479, 1111, 2087, +2479, 1159, 2103, +2478, 1185, 2125, +2480, 1212, 2159, +2478, 1278, 2209, +2477, 1424, 2264, +2480, 1464, 2329, +2488, 1514, 2402, +2505, 1646, 2485, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2480, 1231, 2044, +2480, 1231, 2044, +2480, 1231, 2044, +2480, 1231, 2045, +2480, 1231, 2045, +2479, 1231, 2046, +2479, 1231, 2047, +2479, 1231, 2048, +2479, 1212, 2051, +2479, 1184, 2054, +2479, 1144, 2058, +2479, 1083, 2063, +2479, 1087, 2072, +2479, 1126, 2087, +2481, 1186, 2103, +2479, 1210, 2125, +2481, 1236, 2158, +2479, 1308, 2209, +2477, 1424, 2262, +2481, 1485, 2329, +2488, 1542, 2402, +2507, 1660, 2485, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2480, 1299, 2045, +2480, 1299, 2045, +2480, 1299, 2045, +2480, 1299, 2046, +2480, 1299, 2046, +2480, 1299, 2047, +2480, 1299, 2048, +2479, 1299, 2049, +2479, 1283, 2051, +2479, 1259, 2054, +2479, 1225, 2059, +2479, 1174, 2064, +2479, 1114, 2072, +2480, 1151, 2087, +2481, 1213, 2103, +2481, 1244, 2125, +2483, 1268, 2156, +2481, 1346, 2209, +2477, 1430, 2260, +2483, 1511, 2329, +2489, 1583, 2403, +2509, 1680, 2486, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2482, 1385, 2049, +2482, 1385, 2049, +2482, 1384, 2049, +2482, 1384, 2050, +2482, 1382, 2050, +2482, 1381, 2051, +2482, 1379, 2052, +2481, 1376, 2053, +2482, 1366, 2055, +2482, 1349, 2058, +2482, 1321, 2063, +2482, 1281, 2068, +2482, 1235, 2076, +2482, 1263, 2087, +2484, 1312, 2103, +2484, 1330, 2127, +2485, 1346, 2157, +2483, 1386, 2211, +2480, 1472, 2262, +2483, 1568, 2328, +2492, 1634, 2404, +2509, 1714, 2486, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2484, 1508, 2049, +2484, 1507, 2049, +2484, 1507, 2049, +2484, 1506, 2050, +2484, 1506, 2050, +2484, 1504, 2051, +2483, 1503, 2052, +2483, 1501, 2053, +2483, 1493, 2055, +2484, 1482, 2058, +2485, 1467, 2063, +2485, 1445, 2068, +2485, 1416, 2076, +2486, 1436, 2087, +2488, 1470, 2103, +2487, 1479, 2127, +2487, 1478, 2157, +2484, 1484, 2208, +2487, 1547, 2268, +2485, 1642, 2328, +2495, 1671, 2406, +2509, 1751, 2486, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2490, 1632, 2052, +2490, 1632, 2052, +2490, 1632, 2053, +2490, 1632, 2054, +2490, 1632, 2054, +2490, 1632, 2056, +2490, 1632, 2057, +2490, 1632, 2060, +2490, 1628, 2062, +2491, 1623, 2066, +2491, 1613, 2070, +2492, 1598, 2075, +2493, 1580, 2082, +2492, 1580, 2091, +2493, 1600, 2105, +2492, 1613, 2131, +2491, 1631, 2162, +2489, 1632, 2206, +2493, 1658, 2265, +2493, 1730, 2328, +2499, 1742, 2404, +2518, 1813, 2489, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2502, 1784, 2071, +2502, 1784, 2071, +2502, 1784, 2071, +2502, 1784, 2072, +2502, 1784, 2073, +2502, 1784, 2073, +2502, 1784, 2075, +2502, 1784, 2077, +2502, 1779, 2078, +2502, 1774, 2081, +2503, 1769, 2085, +2503, 1762, 2090, +2504, 1754, 2098, +2504, 1757, 2107, +2503, 1757, 2115, +2502, 1754, 2140, +2499, 1757, 2175, +2500, 1778, 2215, +2501, 1806, 2266, +2500, 1817, 2326, +2509, 1832, 2402, +2528, 1891, 2490, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2516, 1927, 2075, +2516, 1928, 2075, +2516, 1928, 2075, +2516, 1928, 2076, +2516, 1928, 2076, +2517, 1929, 2077, +2517, 1929, 2078, +2517, 1930, 2079, +2517, 1930, 2081, +2516, 1930, 2084, +2516, 1924, 2087, +2515, 1913, 2090, +2514, 1901, 2096, +2516, 1900, 2105, +2517, 1912, 2120, +2515, 1910, 2143, +2514, 1921, 2180, +2513, 1918, 2218, +2516, 1938, 2272, +2518, 1938, 2333, +2528, 1977, 2406, +2552, 2008, 2491, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2547, 2073, 2093, +2547, 2073, 2093, +2547, 2073, 2093, +2546, 2073, 2093, +2546, 2073, 2094, +2546, 2073, 2094, +2545, 2073, 2095, +2545, 2073, 2096, +2545, 2073, 2098, +2545, 2073, 2100, +2545, 2073, 2102, +2545, 2073, 2106, +2545, 2073, 2111, +2545, 2075, 2119, +2543, 2075, 2127, +2543, 2078, 2149, +2543, 2075, 2180, +2546, 2089, 2222, +2546, 2091, 2274, +2551, 2098, 2337, +2558, 2115, 2411, +2588, 2155, 2491, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2602, 2259, 2099, +2602, 2258, 2099, +2602, 2258, 2099, +2602, 2258, 2099, +2602, 2258, 2099, +2601, 2258, 2099, +2600, 2258, 2099, +2600, 2257, 2099, +2600, 2257, 2101, +2600, 2257, 2104, +2600, 2257, 2108, +2600, 2257, 2113, +2600, 2257, 2120, +2603, 2257, 2132, +2606, 2257, 2144, +2606, 2263, 2161, +2611, 2270, 2190, +2606, 2266, 2226, +2612, 2277, 2289, +2615, 2277, 2347, +2621, 2290, 2414, +2651, 2318, 2497, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2722, 2488, 1839, +2722, 2488, 1839, +2722, 2488, 1841, +2722, 2488, 1843, +2723, 2488, 1845, +2723, 2489, 1848, +2724, 2489, 1852, +2724, 2489, 1858, +2724, 2489, 1862, +2724, 2489, 1867, +2724, 2488, 1873, +2723, 2488, 1876, +2723, 2488, 1878, +2722, 2488, 1891, +2722, 2486, 1913, +2722, 2485, 1956, +2723, 2487, 2015, +2723, 2486, 2070, +2727, 2489, 2159, +2732, 2495, 2242, +2745, 2509, 2352, +2763, 2528, 2453, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2811, 2738, 2425, +2811, 2738, 2425, +2811, 2738, 2426, +2811, 2738, 2426, +2811, 2738, 2426, +2811, 2738, 2426, +2811, 2738, 2427, +2811, 2738, 2427, +2811, 2739, 2428, +2811, 2739, 2430, +2811, 2739, 2431, +2811, 2740, 2434, +2811, 2740, 2437, +2811, 2740, 2440, +2810, 2740, 2444, +2810, 2740, 2448, +2811, 2742, 2464, +2810, 2743, 2483, +2810, 2745, 2522, +2810, 2748, 2564, +2811, 2752, 2623, +2810, 2762, 2701, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_hue-sat_32_LUT.azasset b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_hue-sat_32_LUT.azasset new file mode 100644 index 0000000000..82fbee2eee --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Photoshop/inv-Log2-48nits/test_hue-sat_32_LUT.azasset @@ -0,0 +1,32777 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [0, 0, 0, +97, 163, 0, +201, 318, 0, +312, 466, 0, +427, 609, 0, +545, 750, 0, +667, 888, 0, +792, 1025, 0, +918, 1160, 0, +1046, 1295, 0, +1174, 1429, 0, +1304, 1563, 0, +1434, 1696, 0, +1565, 1828, 0, +1696, 1961, 0, +1827, 2094, 0, +1959, 2226, 0, +2090, 2358, 0, +2222, 2491, 0, +2354, 2623, 0, +2486, 2755, 0, +2618, 2887, 0, +2750, 3019, 0, +2882, 3152, 0, +3014, 3284, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +163, 0, 97, +163, 42, 0, +318, 300, 0, +419, 466, 0, +512, 609, 0, +613, 750, 0, +719, 888, 0, +832, 1025, 0, +949, 1160, 0, +1069, 1295, 0, +1192, 1429, 0, +1318, 1563, 0, +1444, 1696, 0, +1572, 1828, 0, +1702, 1961, 0, +1831, 2094, 0, +1962, 2226, 0, +2093, 2358, 0, +2224, 2491, 0, +2355, 2623, 0, +2487, 2755, 0, +2619, 2887, 0, +2750, 3019, 0, +2883, 3152, 0, +3014, 3284, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +318, 0, 201, +318, 0, 13, +318, 93, 0, +466, 388, 0, +606, 609, 0, +689, 750, 0, +781, 888, 0, +881, 1025, 0, +987, 1160, 0, +1099, 1295, 0, +1215, 1429, 0, +1335, 1563, 0, +1457, 1696, 0, +1582, 1828, 0, +1709, 1961, 0, +1837, 2094, 0, +1966, 2226, 0, +2096, 2358, 0, +2226, 2491, 0, +2357, 2623, 0, +2488, 2755, 0, +2620, 2887, 0, +2751, 3019, 0, +2883, 3152, 0, +3014, 3284, 0, +3147, 3416, 0, +3279, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +466, 0, 312, +466, 0, 171, +466, 0, 0, +466, 154, 0, +609, 485, 0, +750, 723, 0, +852, 888, 0, +939, 1025, 0, +1033, 1160, 0, +1135, 1295, 0, +1244, 1429, 0, +1357, 1563, 0, +1475, 1696, 0, +1596, 1828, 0, +1719, 1961, 0, +1845, 2094, 0, +1972, 2226, 0, +2100, 2358, 0, +2230, 2491, 0, +2359, 2623, 0, +2490, 2755, 0, +2621, 2887, 0, +2752, 3019, 0, +2884, 3152, 0, +3015, 3284, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +609, 0, 427, +609, 0, 322, +609, 0, 127, +609, 0, 0, +609, 224, 0, +750, 587, 0, +888, 838, 0, +1006, 1025, 0, +1089, 1160, 0, +1181, 1295, 0, +1280, 1429, 0, +1385, 1563, 0, +1496, 1696, 0, +1612, 1828, 0, +1732, 1961, 0, +1855, 2094, 0, +1979, 2226, 0, +2106, 2358, 0, +2234, 2491, 0, +2363, 2623, 0, +2493, 2755, 0, +2623, 2887, 0, +2754, 3019, 0, +2885, 3152, 0, +3016, 3284, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +750, 0, 545, +750, 0, 467, +750, 0, 334, +750, 0, 59, +750, 0, 0, +750, 304, 0, +888, 697, 0, +1025, 957, 0, +1154, 1160, 0, +1234, 1295, 0, +1323, 1429, 0, +1421, 1563, 0, +1524, 1696, 0, +1634, 1828, 0, +1749, 1961, 0, +1867, 2094, 0, +1989, 2226, 0, +2113, 2358, 0, +2239, 2491, 0, +2367, 2623, 0, +2496, 2755, 0, +2625, 2887, 0, +2755, 3019, 0, +2886, 3152, 0, +3017, 3284, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 667, +888, 0, 608, +888, 0, 515, +888, 0, 350, +888, 0, 0, +888, 0, 0, +888, 392, 0, +1025, 811, 0, +1160, 1079, 0, +1295, 1292, 0, +1376, 1429, 0, +1463, 1563, 0, +1559, 1696, 0, +1661, 1828, 0, +1770, 1961, 0, +1884, 2094, 0, +2002, 2226, 0, +2123, 2358, 0, +2247, 2491, 0, +2372, 2623, 0, +2500, 2755, 0, +2628, 2887, 0, +2758, 3019, 0, +2888, 3152, 0, +3018, 3284, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 792, +1025, 0, 748, +1025, 0, 681, +1025, 0, 573, +1025, 0, 371, +1025, 0, 0, +1025, 0, 0, +1025, 488, 0, +1160, 929, 0, +1295, 1204, 0, +1429, 1419, 0, +1515, 1563, 0, +1601, 1696, 0, +1696, 1828, 0, +1797, 1961, 0, +1905, 2094, 0, +2018, 2226, 0, +2136, 2358, 0, +2256, 2491, 0, +2380, 2623, 0, +2505, 2755, 0, +2633, 2887, 0, +2761, 3019, 0, +2890, 3152, 0, +3020, 3284, 0, +3151, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3939, 4095, 0, +1160, 0, 918, +1160, 0, 885, +1160, 0, 836, +1160, 0, 762, +1160, 0, 640, +1160, 0, 397, +1160, 0, 0, +1160, 0, 0, +1160, 592, 0, +1295, 1051, 0, +1429, 1330, 0, +1563, 1548, 0, +1653, 1696, 0, +1738, 1828, 0, +1831, 1961, 0, +1932, 2094, 0, +2039, 2226, 0, +2152, 2358, 0, +2269, 2491, 0, +2390, 2623, 0, +2513, 2755, 0, +2638, 2887, 0, +2765, 3019, 0, +2893, 3152, 0, +3022, 3284, 0, +3152, 3416, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1046, +1295, 0, 1021, +1295, 0, 985, +1295, 0, 934, +1295, 0, 853, +1295, 0, 717, +1295, 0, 431, +1295, 0, 0, +1295, 0, 0, +1295, 702, 0, +1429, 1174, 0, +1563, 1458, 0, +1696, 1677, 0, +1789, 1828, 0, +1873, 1961, 0, +1966, 2094, 0, +2066, 2226, 0, +2173, 2358, 0, +2285, 2491, 0, +2402, 2623, 0, +2523, 2755, 0, +2646, 2887, 0, +2771, 3019, 0, +2898, 3152, 0, +3025, 3284, 0, +3155, 3416, 0, +3285, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1174, +1429, 0, 1156, +1429, 0, 1130, +1429, 0, 1092, +1429, 0, 1037, +1429, 0, 951, +1429, 0, 803, +1429, 0, 471, +1429, 0, 0, +1429, 0, 0, +1429, 816, 0, +1563, 1301, 0, +1696, 1587, 0, +1828, 1807, 0, +1923, 1961, 0, +2007, 2094, 0, +2100, 2226, 0, +2200, 2358, 0, +2306, 2491, 0, +2419, 2623, 0, +2535, 2755, 0, +2655, 2887, 0, +2778, 3019, 0, +2903, 3152, 0, +3030, 3284, 0, +3158, 3416, 0, +3287, 3548, 0, +3417, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1304, +1563, 0, 1290, +1563, 0, 1271, +1563, 0, 1244, +1563, 0, 1205, +1563, 0, 1148, +1563, 0, 1057, +1563, 0, 897, +1563, 0, 523, +1563, 0, 0, +1563, 0, 0, +1563, 934, 0, +1696, 1427, 0, +1828, 1716, 0, +1961, 1938, 0, +2058, 2094, 0, +2141, 2226, 0, +2233, 2358, 0, +2333, 2491, 0, +2440, 2623, 0, +2552, 2755, 0, +2668, 2887, 0, +2788, 3019, 0, +2911, 3152, 0, +3035, 3284, 0, +3162, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1434, +1696, 0, 1424, +1696, 0, 1410, +1696, 0, 1390, +1696, 0, 1362, +1696, 0, 1322, +1696, 0, 1262, +1696, 0, 1167, +1696, 0, 998, +1696, 0, 580, +1696, 0, 0, +1696, 0, 0, +1696, 1056, 0, +1828, 1557, 0, +1961, 1847, 0, +2094, 2069, 0, +2191, 2226, 0, +2275, 2358, 0, +2367, 2491, 0, +2466, 2623, 0, +2573, 2755, 0, +2684, 2887, 0, +2800, 3019, 0, +2920, 3152, 0, +3043, 3284, 0, +3168, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3552, 3812, 0, +3681, 3944, 0, +3812, 4076, 0, +3942, 4095, 0, +1828, 0, 1565, +1828, 0, 1557, +1828, 0, 1547, +1828, 0, 1532, +1828, 0, 1512, +1828, 0, 1484, +1828, 0, 1442, +1828, 0, 1381, +1828, 0, 1283, +1828, 0, 1106, +1828, 0, 650, +1828, 0, 0, +1828, 0, 0, +1828, 1180, 0, +1961, 1686, 0, +2094, 1977, 0, +2226, 2200, 0, +2325, 2358, 0, +2408, 2491, 0, +2500, 2623, 0, +2599, 2755, 0, +2705, 2887, 0, +2816, 3019, 0, +2933, 3152, 0, +3052, 3284, 0, +3175, 3416, 0, +3300, 3548, 0, +3427, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1696, +1961, 0, 1690, +1961, 0, 1682, +1961, 0, 1672, +1961, 0, 1657, +1961, 0, 1636, +1961, 0, 1607, +1961, 0, 1565, +1961, 0, 1503, +1961, 0, 1402, +1961, 0, 1220, +1961, 0, 726, +1961, 0, 0, +1961, 0, 0, +1961, 1306, 0, +2094, 1816, 0, +2226, 2108, 0, +2358, 2332, 0, +2458, 2491, 0, +2541, 2623, 0, +2632, 2755, 0, +2732, 2887, 0, +2837, 3019, 0, +2949, 3152, 0, +3065, 3284, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2094, 0, 1827, +2094, 0, 1823, +2094, 0, 1817, +2094, 0, 1809, +2094, 0, 1798, +2094, 0, 1783, +2094, 0, 1763, +2094, 0, 1733, +2094, 0, 1691, +2094, 0, 1626, +2094, 0, 1524, +2094, 0, 1336, +2094, 0, 814, +2094, 0, 0, +2094, 0, 0, +2094, 1433, 0, +2226, 1946, 0, +2358, 2239, 0, +2491, 2463, 0, +2590, 2623, 0, +2673, 2755, 0, +2765, 2887, 0, +2864, 3019, 0, +2970, 3152, 0, +3081, 3284, 0, +3197, 3416, 0, +3317, 3548, 0, +3440, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2226, 0, 1959, +2226, 0, 1956, +2226, 0, 1951, +2226, 0, 1945, +2226, 0, 1937, +2226, 0, 1926, +2226, 0, 1911, +2226, 0, 1890, +2226, 0, 1860, +2226, 0, 1817, +2226, 0, 1753, +2226, 0, 1648, +2226, 0, 1457, +2226, 0, 907, +2226, 0, 0, +2226, 0, 0, +2226, 1562, 0, +2358, 2078, 0, +2491, 2371, 0, +2623, 2595, 0, +2723, 2755, 0, +2806, 2887, 0, +2897, 3019, 0, +2996, 3152, 0, +3102, 3284, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3572, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2090, +2358, 0, 2088, +2358, 0, 2085, +2358, 0, 2080, +2358, 0, 2074, +2358, 0, 2066, +2358, 0, 2055, +2358, 0, 2040, +2358, 0, 2019, +2358, 0, 1989, +2358, 0, 1946, +2358, 0, 1880, +2358, 0, 1775, +2358, 0, 1580, +2358, 0, 1009, +2358, 0, 0, +2358, 0, 0, +2358, 1692, 0, +2491, 2209, 0, +2623, 2503, 0, +2755, 2727, 0, +2856, 2887, 0, +2938, 3019, 0, +3030, 3152, 0, +3128, 3284, 0, +3234, 3416, 0, +3346, 3548, 0, +3462, 3680, 0, +3581, 3812, 0, +3704, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2222, +2491, 0, 2220, +2491, 0, 2218, +2491, 0, 2215, +2491, 0, 2210, +2491, 0, 2204, +2491, 0, 2196, +2491, 0, 2185, +2491, 0, 2170, +2491, 0, 2149, +2491, 0, 2119, +2491, 0, 2075, +2491, 0, 2009, +2491, 0, 1903, +2491, 0, 1706, +2491, 0, 1120, +2491, 0, 0, +2491, 0, 0, +2491, 1822, 0, +2623, 2340, 0, +2755, 2635, 0, +2887, 2859, 0, +2988, 3019, 0, +3071, 3152, 0, +3162, 3284, 0, +3261, 3416, 0, +3367, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2354, +2623, 0, 2352, +2623, 0, 2351, +2623, 0, 2348, +2623, 0, 2345, +2623, 0, 2341, +2623, 0, 2335, +2623, 0, 2327, +2623, 0, 2315, +2623, 0, 2300, +2623, 0, 2278, +2623, 0, 2248, +2623, 0, 2205, +2623, 0, 2138, +2623, 0, 2032, +2623, 0, 1833, +2623, 0, 1232, +2623, 0, 0, +2623, 0, 0, +2623, 1952, 0, +2755, 2473, 0, +2887, 2767, 0, +3019, 2991, 0, +3120, 3152, 0, +3203, 3284, 0, +3294, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3846, 4076, 0, +3968, 4095, 0, +2755, 0, 2486, +2755, 0, 2485, +2755, 0, 2484, +2755, 0, 2482, +2755, 0, 2479, +2755, 0, 2476, +2755, 0, 2472, +2755, 0, 2466, +2755, 0, 2457, +2755, 0, 2446, +2755, 0, 2431, +2755, 0, 2409, +2755, 0, 2379, +2755, 0, 2335, +2755, 0, 2269, +2755, 0, 2162, +2755, 0, 1962, +2755, 0, 1353, +2755, 0, 0, +2755, 0, 0, +2755, 2083, 0, +2887, 2604, 0, +3019, 2898, 0, +3152, 3123, 0, +3252, 3284, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2618, +2887, 0, 2617, +2887, 0, 2616, +2887, 0, 2615, +2887, 0, 2613, +2887, 0, 2611, +2887, 0, 2607, +2887, 0, 2603, +2887, 0, 2597, +2887, 0, 2589, +2887, 0, 2577, +2887, 0, 2562, +2887, 0, 2541, +2887, 0, 2510, +2887, 0, 2466, +2887, 0, 2400, +2887, 0, 2292, +2887, 0, 2091, +2887, 0, 1472, +2887, 0, 0, +2887, 0, 0, +2887, 2215, 0, +3019, 2735, 0, +3152, 3031, 0, +3284, 3254, 0, +3385, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2748, +3019, 0, 2747, +3019, 0, 2746, +3019, 0, 2744, +3019, 0, 2742, +3019, 0, 2738, +3019, 0, 2734, +3019, 0, 2728, +3019, 0, 2720, +3019, 0, 2708, +3019, 0, 2693, +3019, 0, 2672, +3019, 0, 2641, +3019, 0, 2597, +3019, 0, 2530, +3019, 0, 2422, +3019, 0, 2220, +3019, 0, 1594, +3019, 0, 0, +3019, 0, 0, +3019, 2346, 0, +3152, 2868, 0, +3284, 3162, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3691, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4007, 4095, 0, +3152, 0, 2882, +3152, 0, 2881, +3152, 0, 2881, +3152, 0, 2880, +3152, 0, 2879, +3152, 0, 2878, +3152, 0, 2876, +3152, 0, 2873, +3152, 0, 2870, +3152, 0, 2866, +3152, 0, 2860, +3152, 0, 2851, +3152, 0, 2840, +3152, 0, 2825, +3152, 0, 2803, +3152, 0, 2773, +3152, 0, 2729, +3152, 0, 2662, +3152, 0, 2554, +3152, 0, 2352, +3152, 0, 1720, +3152, 0, 0, +3152, 0, 0, +3152, 2478, 0, +3284, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3732, 3812, 0, +3823, 3944, 0, +3922, 4076, 0, +4027, 4095, 0, +3284, 0, 3014, +3284, 0, 3014, +3284, 0, 3013, +3284, 0, 3012, +3284, 0, 3012, +3284, 0, 3011, +3284, 0, 3009, +3284, 0, 3008, +3284, 0, 3005, +3284, 0, 3002, +3284, 0, 2997, +3284, 0, 2991, +3284, 0, 2983, +3284, 0, 2972, +3284, 0, 2956, +3284, 0, 2935, +3284, 0, 2904, +3284, 0, 2860, +3284, 0, 2793, +3284, 0, 2684, +3284, 0, 2481, +3284, 0, 1844, +3284, 0, 0, +3284, 0, 0, +3284, 2609, 0, +3416, 3132, 0, +3548, 3426, 0, +3680, 3651, 0, +3781, 3812, 0, +3864, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3141, +3416, 0, 3139, +3416, 0, 3137, +3416, 0, 3134, +3416, 0, 3129, +3416, 0, 3123, +3416, 0, 3115, +3416, 0, 3104, +3416, 0, 3088, +3416, 0, 3067, +3416, 0, 3036, +3416, 0, 2992, +3416, 0, 2925, +3416, 0, 2816, +3416, 0, 2613, +3416, 0, 1977, +3416, 0, 0, +3416, 0, 0, +3416, 2741, 0, +3548, 3264, 0, +3680, 3558, 0, +3812, 3783, 0, +3913, 3944, 0, +3996, 4076, 0, +4087, 4095, 0, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3271, +3548, 0, 3269, +3548, 0, 3266, +3548, 0, 3261, +3548, 0, 3255, +3548, 0, 3247, +3548, 0, 3236, +3548, 0, 3220, +3548, 0, 3198, +3548, 0, 3168, +3548, 0, 3124, +3548, 0, 3056, +3548, 0, 2948, +3548, 0, 2745, +3548, 0, 2104, +3548, 0, 0, +3548, 0, 0, +3548, 2873, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3408, +3680, 0, 3406, +3680, 0, 3405, +3680, 0, 3403, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3393, +3680, 0, 3387, +3680, 0, 3379, +3680, 0, 3367, +3680, 0, 3352, +3680, 0, 3330, +3680, 0, 3300, +3680, 0, 3255, +3680, 0, 3188, +3680, 0, 3080, +3680, 0, 2876, +3680, 0, 2237, +3680, 0, 0, +3680, 0, 0, +3680, 3005, 0, +3812, 3528, 0, +3944, 3822, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3537, +3812, 0, 3535, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3525, +3812, 0, 3519, +3812, 0, 3511, +3812, 0, 3499, +3812, 0, 3484, +3812, 0, 3462, +3812, 0, 3432, +3812, 0, 3387, +3812, 0, 3320, +3812, 0, 3211, +3812, 0, 3008, +3812, 0, 2367, +3812, 0, 0, +3812, 0, 0, +3812, 3137, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3669, +3944, 0, 3667, +3944, 0, 3665, +3944, 0, 3661, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3631, +3944, 0, 3616, +3944, 0, 3594, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3452, +3944, 0, 3344, +3944, 0, 3140, +3944, 0, 2497, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3791, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3774, +4076, 0, 3763, +4076, 0, 3748, +4076, 0, 3726, +4076, 0, 3696, +4076, 0, 3651, +4076, 0, 3584, +4076, 0, 3475, +4076, 0, 3271, +4076, 0, 2626, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3716, +4095, 0, 3608, +4095, 0, 3404, +4095, 0, 2761, +4095, 0, 0, +4095, 0, 0, +4095, 3533, 0, +0, 97, 163, +0, 163, 42, +13, 318, 0, +171, 466, 0, +322, 609, 0, +467, 750, 0, +608, 888, 0, +748, 1025, 0, +885, 1160, 0, +1021, 1295, 0, +1156, 1429, 0, +1290, 1563, 0, +1424, 1696, 0, +1557, 1828, 0, +1690, 1961, 0, +1823, 2094, 0, +1956, 2226, 0, +2088, 2358, 0, +2220, 2491, 0, +2352, 2623, 0, +2485, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3152, 0, +3014, 3284, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +42, 0, 163, +131, 131, 131, +229, 295, 86, +333, 450, 15, +444, 598, 0, +559, 741, 0, +678, 882, 0, +800, 1020, 0, +924, 1157, 0, +1050, 1292, 0, +1178, 1427, 0, +1307, 1561, 0, +1436, 1695, 0, +1566, 1828, 0, +1697, 1961, 0, +1828, 2093, 0, +1959, 2226, 0, +2091, 2358, 0, +2223, 2491, 0, +2354, 2623, 0, +2486, 2755, 0, +2618, 2887, 0, +2750, 3019, 0, +2882, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +300, 0, 318, +295, 86, 229, +295, 174, 86, +450, 432, 15, +551, 598, 0, +644, 741, 0, +745, 882, 0, +852, 1020, 0, +964, 1157, 0, +1081, 1292, 0, +1201, 1427, 0, +1325, 1561, 0, +1450, 1695, 0, +1576, 1828, 0, +1705, 1961, 0, +1834, 2093, 0, +1963, 2226, 0, +2094, 2358, 0, +2225, 2491, 0, +2356, 2623, 0, +2488, 2755, 0, +2619, 2887, 0, +2751, 3019, 0, +2883, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +466, 0, 419, +450, 15, 333, +450, 15, 145, +450, 225, 15, +598, 520, 0, +738, 741, 0, +822, 882, 0, +914, 1020, 0, +1013, 1157, 0, +1119, 1292, 0, +1231, 1427, 0, +1347, 1561, 0, +1467, 1695, 0, +1590, 1828, 0, +1715, 1961, 0, +1841, 2093, 0, +1969, 2226, 0, +2098, 2358, 0, +2228, 2491, 0, +2358, 2623, 0, +2489, 2755, 0, +2620, 2887, 0, +2752, 3019, 0, +2883, 3152, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +609, 0, 512, +598, 0, 444, +598, 0, 303, +598, 0, 0, +598, 286, 0, +741, 616, 0, +882, 855, 0, +985, 1020, 0, +1071, 1157, 0, +1166, 1292, 0, +1267, 1427, 0, +1376, 1561, 0, +1489, 1695, 0, +1607, 1828, 0, +1728, 1961, 0, +1851, 2093, 0, +1977, 2226, 0, +2104, 2358, 0, +2233, 2491, 0, +2362, 2623, 0, +2492, 2755, 0, +2622, 2887, 0, +2753, 3019, 0, +2885, 3152, 0, +3016, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +750, 0, 613, +741, 0, 559, +741, 0, 453, +741, 0, 258, +741, 0, 0, +741, 356, 0, +882, 719, 0, +1020, 970, 0, +1139, 1157, 0, +1221, 1292, 0, +1313, 1427, 0, +1412, 1561, 0, +1517, 1695, 0, +1629, 1828, 0, +1745, 1961, 0, +1864, 2093, 0, +1987, 2226, 0, +2111, 2358, 0, +2238, 2491, 0, +2366, 2623, 0, +2495, 2755, 0, +2625, 2887, 0, +2755, 3019, 0, +2886, 3152, 0, +3017, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 719, +882, 0, 678, +882, 0, 599, +882, 0, 466, +882, 0, 190, +882, 0, 0, +882, 436, 0, +1020, 829, 0, +1157, 1089, 0, +1286, 1292, 0, +1366, 1427, 0, +1456, 1561, 0, +1552, 1695, 0, +1656, 1828, 0, +1766, 1961, 0, +1881, 2093, 0, +1999, 2226, 0, +2121, 2358, 0, +2245, 2491, 0, +2372, 2623, 0, +2499, 2755, 0, +2628, 2887, 0, +2757, 3019, 0, +2888, 3152, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 832, +1020, 0, 800, +1020, 0, 740, +1020, 0, 647, +1020, 0, 482, +1020, 0, 81, +1020, 0, 0, +1020, 524, 0, +1157, 943, 0, +1292, 1211, 0, +1427, 1424, 0, +1508, 1561, 0, +1596, 1695, 0, +1691, 1828, 0, +1793, 1961, 0, +1902, 2093, 0, +2016, 2226, 0, +2134, 2358, 0, +2255, 2491, 0, +2379, 2623, 0, +2505, 2755, 0, +2632, 2887, 0, +2760, 3019, 0, +2890, 3152, 0, +3020, 3283, 0, +3151, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 949, +1157, 0, 924, +1157, 0, 879, +1157, 0, 813, +1157, 0, 705, +1157, 0, 503, +1157, 0, 0, +1157, 0, 0, +1157, 620, 0, +1292, 1062, 0, +1427, 1336, 0, +1561, 1552, 0, +1647, 1695, 0, +1733, 1828, 0, +1828, 1961, 0, +1929, 2093, 0, +2037, 2226, 0, +2150, 2358, 0, +2268, 2491, 0, +2388, 2623, 0, +2512, 2755, 0, +2638, 2887, 0, +2765, 3019, 0, +2893, 3152, 0, +3022, 3283, 0, +3152, 3416, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1069, +1292, 0, 1050, +1292, 0, 1017, +1292, 0, 968, +1292, 0, 894, +1292, 0, 772, +1292, 0, 529, +1292, 0, 0, +1292, 0, 0, +1292, 724, 0, +1427, 1182, 0, +1561, 1463, 0, +1695, 1680, 0, +1785, 1828, 0, +1870, 1961, 0, +1963, 2093, 0, +2064, 2226, 0, +2171, 2358, 0, +2284, 2491, 0, +2401, 2623, 0, +2522, 2755, 0, +2645, 2887, 0, +2770, 3019, 0, +2897, 3152, 0, +3025, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1192, +1427, 0, 1178, +1427, 0, 1153, +1427, 0, 1118, +1427, 0, 1065, +1427, 0, 985, +1427, 0, 849, +1427, 0, 562, +1427, 0, 0, +1427, 0, 0, +1427, 833, 0, +1561, 1307, 0, +1695, 1590, 0, +1828, 1810, 0, +1920, 1961, 0, +2005, 2093, 0, +2098, 2226, 0, +2199, 2358, 0, +2305, 2491, 0, +2417, 2623, 0, +2535, 2755, 0, +2655, 2887, 0, +2777, 3019, 0, +2903, 3152, 0, +3029, 3283, 0, +3158, 3416, 0, +3287, 3548, 0, +3417, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1318, +1561, 0, 1307, +1561, 0, 1288, +1561, 0, 1262, +1561, 0, 1225, +1561, 0, 1170, +1561, 0, 1084, +1561, 0, 935, +1561, 0, 605, +1561, 0, 0, +1561, 0, 0, +1561, 948, 0, +1695, 1432, 0, +1828, 1719, 0, +1961, 1940, 0, +2056, 2093, 0, +2140, 2226, 0, +2232, 2358, 0, +2332, 2491, 0, +2439, 2623, 0, +2551, 2755, 0, +2667, 2887, 0, +2787, 3019, 0, +2910, 3152, 0, +3035, 3283, 0, +3162, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1444, +1695, 0, 1436, +1695, 0, 1422, +1695, 0, 1403, +1695, 0, 1376, +1695, 0, 1337, +1695, 0, 1279, +1695, 0, 1188, +1695, 0, 1029, +1695, 0, 653, +1695, 0, 0, +1695, 0, 0, +1695, 1066, 0, +1828, 1560, 0, +1961, 1849, 0, +2093, 2070, 0, +2190, 2226, 0, +2273, 2358, 0, +2366, 2491, 0, +2465, 2623, 0, +2572, 2755, 0, +2684, 2887, 0, +2800, 3019, 0, +2920, 3152, 0, +3042, 3283, 0, +3168, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1572, +1828, 0, 1566, +1828, 0, 1556, +1828, 0, 1542, +1828, 0, 1522, +1828, 0, 1494, +1828, 0, 1454, +1828, 0, 1394, +1828, 0, 1300, +1828, 0, 1131, +1828, 0, 713, +1828, 0, 0, +1828, 0, 0, +1828, 1188, 0, +1961, 1689, 0, +2093, 1979, 0, +2226, 2201, 0, +2324, 2358, 0, +2407, 2491, 0, +2499, 2623, 0, +2598, 2755, 0, +2705, 2887, 0, +2816, 3019, 0, +2932, 3152, 0, +3052, 3283, 0, +3175, 3416, 0, +3300, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1702, +1961, 0, 1697, +1961, 0, 1689, +1961, 0, 1679, +1961, 0, 1664, +1961, 0, 1644, +1961, 0, 1615, +1961, 0, 1574, +1961, 0, 1513, +1961, 0, 1415, +1961, 0, 1238, +1961, 0, 780, +1961, 0, 0, +1961, 0, 0, +1961, 1312, 0, +2093, 1818, 0, +2226, 2109, 0, +2358, 2332, 0, +2457, 2491, 0, +2540, 2623, 0, +2632, 2755, 0, +2731, 2887, 0, +2837, 3019, 0, +2949, 3152, 0, +3065, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2094, 0, 1831, +2093, 0, 1828, +2093, 0, 1822, +2093, 0, 1814, +2093, 0, 1804, +2093, 0, 1789, +2093, 0, 1768, +2093, 0, 1739, +2093, 0, 1698, +2093, 0, 1635, +2093, 0, 1534, +2093, 0, 1351, +2093, 0, 859, +2093, 0, 0, +2093, 0, 0, +2093, 1438, 0, +2226, 1948, 0, +2358, 2240, 0, +2491, 2464, 0, +2590, 2623, 0, +2673, 2755, 0, +2764, 2887, 0, +2863, 3019, 0, +2970, 3152, 0, +3081, 3283, 0, +3197, 3416, 0, +3317, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2226, 0, 1962, +2226, 0, 1959, +2226, 0, 1955, +2226, 0, 1949, +2226, 0, 1941, +2226, 0, 1930, +2226, 0, 1915, +2226, 0, 1894, +2226, 0, 1865, +2226, 0, 1823, +2226, 0, 1759, +2226, 0, 1656, +2226, 0, 1469, +2226, 0, 944, +2226, 0, 0, +2226, 0, 0, +2226, 1565, 0, +2358, 2079, 0, +2491, 2372, 0, +2623, 2595, 0, +2723, 2755, 0, +2805, 2887, 0, +2897, 3019, 0, +2996, 3152, 0, +3102, 3283, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3572, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2093, +2358, 0, 2091, +2358, 0, 2087, +2358, 0, 2083, +2358, 0, 2077, +2358, 0, 2069, +2358, 0, 2058, +2358, 0, 2043, +2358, 0, 2022, +2358, 0, 1993, +2358, 0, 1950, +2358, 0, 1885, +2358, 0, 1781, +2358, 0, 1589, +2358, 0, 1039, +2358, 0, 0, +2358, 0, 0, +2358, 1694, 0, +2491, 2210, 0, +2623, 2503, 0, +2755, 2727, 0, +2855, 2887, 0, +2938, 3019, 0, +3029, 3152, 0, +3128, 3283, 0, +3234, 3416, 0, +3346, 3548, 0, +3462, 3680, 0, +3581, 3812, 0, +3704, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2224, +2491, 0, 2223, +2491, 0, 2220, +2491, 0, 2217, +2491, 0, 2212, +2491, 0, 2206, +2491, 0, 2199, +2491, 0, 2187, +2491, 0, 2172, +2491, 0, 2151, +2491, 0, 2121, +2491, 0, 2078, +2491, 0, 2013, +2491, 0, 1907, +2491, 0, 1713, +2491, 0, 1143, +2491, 0, 0, +2491, 0, 0, +2491, 1824, 0, +2623, 2341, 0, +2755, 2635, 0, +2887, 2859, 0, +2987, 3019, 0, +3070, 3152, 0, +3162, 3283, 0, +3261, 3416, 0, +3367, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2355, +2623, 0, 2354, +2623, 0, 2352, +2623, 0, 2350, +2623, 0, 2347, +2623, 0, 2342, +2623, 0, 2336, +2623, 0, 2328, +2623, 0, 2317, +2623, 0, 2302, +2623, 0, 2281, +2623, 0, 2250, +2623, 0, 2207, +2623, 0, 2141, +2623, 0, 2035, +2623, 0, 1838, +2623, 0, 1251, +2623, 0, 0, +2623, 0, 0, +2623, 1954, 0, +2755, 2473, 0, +2887, 2767, 0, +3019, 2991, 0, +3120, 3152, 0, +3203, 3283, 0, +3294, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2487, +2755, 0, 2486, +2755, 0, 2485, +2755, 0, 2483, +2755, 0, 2481, +2755, 0, 2477, +2755, 0, 2473, +2755, 0, 2467, +2755, 0, 2459, +2755, 0, 2448, +2755, 0, 2432, +2755, 0, 2411, +2755, 0, 2381, +2755, 0, 2337, +2755, 0, 2271, +2755, 0, 2164, +2755, 0, 1966, +2755, 0, 1367, +2755, 0, 0, +2755, 0, 0, +2755, 2084, 0, +2887, 2604, 0, +3019, 2898, 0, +3152, 3123, 0, +3252, 3283, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2619, +2887, 0, 2618, +2887, 0, 2617, +2887, 0, 2616, +2887, 0, 2614, +2887, 0, 2612, +2887, 0, 2608, +2887, 0, 2604, +2887, 0, 2598, +2887, 0, 2589, +2887, 0, 2578, +2887, 0, 2563, +2887, 0, 2542, +2887, 0, 2511, +2887, 0, 2467, +2887, 0, 2401, +2887, 0, 2294, +2887, 0, 2094, +2887, 0, 1483, +2887, 0, 0, +2887, 0, 0, +2887, 2215, 0, +3019, 2735, 0, +3152, 3031, 0, +3283, 3254, 0, +3385, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2750, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2748, +3019, 0, 2747, +3019, 0, 2745, +3019, 0, 2742, +3019, 0, 2739, +3019, 0, 2735, +3019, 0, 2729, +3019, 0, 2720, +3019, 0, 2709, +3019, 0, 2694, +3019, 0, 2672, +3019, 0, 2642, +3019, 0, 2598, +3019, 0, 2531, +3019, 0, 2424, +3019, 0, 2222, +3019, 0, 1602, +3019, 0, 0, +3019, 0, 0, +3019, 2346, 0, +3152, 2868, 0, +3283, 3162, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3691, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2883, +3152, 0, 2882, +3152, 0, 2881, +3152, 0, 2881, +3152, 0, 2880, +3152, 0, 2878, +3152, 0, 2877, +3152, 0, 2874, +3152, 0, 2871, +3152, 0, 2866, +3152, 0, 2860, +3152, 0, 2852, +3152, 0, 2841, +3152, 0, 2825, +3152, 0, 2804, +3152, 0, 2773, +3152, 0, 2729, +3152, 0, 2663, +3152, 0, 2555, +3152, 0, 2353, +3152, 0, 1726, +3152, 0, 0, +3152, 0, 0, +3152, 2478, 0, +3283, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3731, 3812, 0, +3823, 3944, 0, +3922, 4076, 0, +4027, 4095, 0, +3284, 0, 3014, +3283, 0, 3014, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3012, +3283, 0, 3011, +3283, 0, 3010, +3283, 0, 3008, +3283, 0, 3005, +3283, 0, 3002, +3283, 0, 2998, +3283, 0, 2992, +3283, 0, 2983, +3283, 0, 2972, +3283, 0, 2957, +3283, 0, 2935, +3283, 0, 2905, +3283, 0, 2860, +3283, 0, 2793, +3283, 0, 2685, +3283, 0, 2482, +3283, 0, 1849, +3283, 0, 0, +3283, 0, 0, +3283, 2609, 0, +3416, 3132, 0, +3548, 3426, 0, +3680, 3651, 0, +3781, 3812, 0, +3864, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3141, +3416, 0, 3140, +3416, 0, 3137, +3416, 0, 3134, +3416, 0, 3129, +3416, 0, 3123, +3416, 0, 3115, +3416, 0, 3104, +3416, 0, 3088, +3416, 0, 3067, +3416, 0, 3036, +3416, 0, 2992, +3416, 0, 2925, +3416, 0, 2817, +3416, 0, 2614, +3416, 0, 1981, +3416, 0, 0, +3416, 0, 0, +3416, 2741, 0, +3548, 3264, 0, +3680, 3558, 0, +3812, 3783, 0, +3913, 3944, 0, +3996, 4076, 0, +4087, 4095, 0, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3272, +3548, 0, 3269, +3548, 0, 3266, +3548, 0, 3261, +3548, 0, 3255, +3548, 0, 3247, +3548, 0, 3236, +3548, 0, 3220, +3548, 0, 3199, +3548, 0, 3168, +3548, 0, 3124, +3548, 0, 3057, +3548, 0, 2948, +3548, 0, 2745, +3548, 0, 2107, +3548, 0, 0, +3548, 0, 0, +3548, 2873, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3405, +3680, 0, 3403, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3393, +3680, 0, 3387, +3680, 0, 3379, +3680, 0, 3368, +3680, 0, 3352, +3680, 0, 3331, +3680, 0, 3300, +3680, 0, 3256, +3680, 0, 3188, +3680, 0, 3080, +3680, 0, 2877, +3680, 0, 2239, +3680, 0, 0, +3680, 0, 0, +3680, 3005, 0, +3812, 3528, 0, +3944, 3822, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3537, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3525, +3812, 0, 3519, +3812, 0, 3511, +3812, 0, 3499, +3812, 0, 3484, +3812, 0, 3462, +3812, 0, 3432, +3812, 0, 3388, +3812, 0, 3321, +3812, 0, 3212, +3812, 0, 3009, +3812, 0, 2369, +3812, 0, 0, +3812, 0, 0, +3812, 3137, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3667, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3616, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3452, +3944, 0, 3344, +3944, 0, 3140, +3944, 0, 2498, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3763, +4076, 0, 3748, +4076, 0, 3726, +4076, 0, 3696, +4076, 0, 3651, +4076, 0, 3584, +4076, 0, 3475, +4076, 0, 3272, +4076, 0, 2627, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3404, +4095, 0, 2762, +4095, 0, 0, +4095, 0, 0, +4095, 3533, 0, +0, 201, 318, +0, 318, 300, +0, 318, 93, +0, 466, 0, +127, 609, 0, +334, 750, 0, +515, 888, 0, +681, 1025, 0, +836, 1160, 0, +985, 1295, 0, +1130, 1429, 0, +1271, 1563, 0, +1410, 1696, 0, +1547, 1828, 0, +1682, 1961, 0, +1817, 2094, 0, +1951, 2226, 0, +2085, 2358, 0, +2218, 2491, 0, +2351, 2623, 0, +2484, 2755, 0, +2616, 2887, 0, +2748, 3019, 0, +2881, 3152, 0, +3013, 3284, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 13, 318, +86, 229, 295, +86, 295, 174, +145, 450, 15, +303, 598, 0, +453, 741, 0, +599, 882, 0, +740, 1020, 0, +879, 1157, 0, +1017, 1292, 0, +1153, 1427, 0, +1288, 1561, 0, +1422, 1695, 0, +1556, 1828, 0, +1689, 1961, 0, +1822, 2093, 0, +1955, 2226, 0, +2087, 2358, 0, +2220, 2491, 0, +2352, 2623, 0, +2485, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +93, 0, 318, +174, 86, 295, +264, 264, 264, +361, 427, 218, +466, 582, 148, +576, 730, 34, +691, 873, 0, +810, 1014, 0, +932, 1152, 0, +1056, 1289, 0, +1182, 1424, 0, +1310, 1559, 0, +1439, 1693, 0, +1568, 1827, 0, +1699, 1960, 0, +1829, 2093, 0, +1960, 2225, 0, +2091, 2358, 0, +2223, 2490, 0, +2355, 2623, 0, +2486, 2755, 0, +2618, 2887, 0, +2750, 3019, 0, +2882, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +388, 0, 466, +432, 15, 450, +427, 218, 361, +427, 306, 218, +582, 564, 148, +683, 730, 34, +776, 873, 0, +877, 1014, 0, +984, 1152, 0, +1096, 1289, 0, +1213, 1424, 0, +1333, 1559, 0, +1456, 1693, 0, +1582, 1827, 0, +1708, 1960, 0, +1837, 2093, 0, +1966, 2225, 0, +2096, 2358, 0, +2226, 2490, 0, +2357, 2623, 0, +2488, 2755, 0, +2620, 2887, 0, +2751, 3019, 0, +2883, 3152, 0, +3014, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +609, 0, 606, +598, 0, 551, +582, 148, 466, +582, 148, 277, +582, 357, 148, +730, 652, 34, +870, 873, 0, +954, 1014, 0, +1045, 1152, 0, +1145, 1289, 0, +1251, 1424, 0, +1363, 1559, 0, +1479, 1693, 0, +1599, 1827, 0, +1722, 1960, 0, +1847, 2093, 0, +1973, 2225, 0, +2101, 2358, 0, +2230, 2490, 0, +2360, 2623, 0, +2491, 2755, 0, +2621, 2887, 0, +2752, 3019, 0, +2884, 3152, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +750, 0, 689, +741, 0, 644, +730, 34, 576, +730, 34, 435, +730, 34, 132, +730, 418, 34, +873, 749, 0, +1014, 987, 0, +1117, 1152, 0, +1203, 1289, 0, +1298, 1424, 0, +1400, 1559, 0, +1508, 1693, 0, +1621, 1827, 0, +1739, 1960, 0, +1860, 2093, 0, +1983, 2225, 0, +2109, 2358, 0, +2236, 2490, 0, +2364, 2623, 0, +2494, 2755, 0, +2624, 2887, 0, +2754, 3019, 0, +2885, 3152, 0, +3016, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 781, +882, 0, 745, +873, 0, 691, +873, 0, 585, +873, 0, 390, +873, 0, 0, +873, 488, 0, +1014, 852, 0, +1152, 1102, 0, +1271, 1289, 0, +1353, 1424, 0, +1445, 1559, 0, +1544, 1693, 0, +1650, 1827, 0, +1761, 1960, 0, +1877, 2093, 0, +1996, 2225, 0, +2119, 2358, 0, +2243, 2490, 0, +2370, 2623, 0, +2498, 2755, 0, +2627, 2887, 0, +2757, 3019, 0, +2887, 3152, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 881, +1020, 0, 852, +1014, 0, 810, +1014, 0, 731, +1014, 0, 598, +1014, 0, 323, +1014, 0, 0, +1014, 568, 0, +1152, 960, 0, +1289, 1221, 0, +1418, 1424, 0, +1499, 1559, 0, +1588, 1693, 0, +1684, 1827, 0, +1789, 1960, 0, +1898, 2093, 0, +2013, 2225, 0, +2132, 2358, 0, +2253, 2490, 0, +2378, 2623, 0, +2504, 2755, 0, +2631, 2887, 0, +2760, 3019, 0, +2890, 3152, 0, +3019, 3283, 0, +3150, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 987, +1157, 0, 964, +1152, 0, 932, +1152, 0, 873, +1152, 0, 779, +1152, 0, 614, +1152, 0, 214, +1152, 0, 0, +1152, 656, 0, +1289, 1075, 0, +1424, 1343, 0, +1559, 1556, 0, +1640, 1693, 0, +1727, 1827, 0, +1823, 1960, 0, +1926, 2093, 0, +2034, 2225, 0, +2148, 2358, 0, +2266, 2490, 0, +2387, 2623, 0, +2511, 2755, 0, +2637, 2887, 0, +2764, 3019, 0, +2893, 3152, 0, +3022, 3283, 0, +3152, 3416, 0, +3282, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1099, +1292, 0, 1081, +1289, 0, 1056, +1289, 0, 1012, +1289, 0, 945, +1289, 0, 837, +1289, 0, 635, +1289, 0, 9, +1289, 0, 0, +1289, 753, 0, +1424, 1193, 0, +1559, 1468, 0, +1693, 1683, 0, +1779, 1827, 0, +1865, 1960, 0, +1960, 2093, 0, +2061, 2225, 0, +2169, 2358, 0, +2283, 2490, 0, +2400, 2623, 0, +2521, 2755, 0, +2644, 2887, 0, +2770, 3019, 0, +2897, 3152, 0, +3025, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1215, +1427, 0, 1201, +1424, 0, 1182, +1424, 0, 1149, +1424, 0, 1101, +1424, 0, 1027, +1424, 0, 904, +1424, 0, 662, +1424, 0, 0, +1424, 0, 0, +1424, 856, 0, +1559, 1315, 0, +1693, 1594, 0, +1827, 1812, 0, +1917, 1960, 0, +2002, 2093, 0, +2095, 2225, 0, +2196, 2358, 0, +2304, 2490, 0, +2416, 2623, 0, +2533, 2755, 0, +2654, 2887, 0, +2777, 3019, 0, +2903, 3152, 0, +3029, 3283, 0, +3157, 3416, 0, +3287, 3548, 0, +3417, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1335, +1561, 0, 1325, +1559, 0, 1310, +1559, 0, 1285, +1559, 0, 1250, +1559, 0, 1198, +1559, 0, 1118, +1559, 0, 981, +1559, 0, 696, +1559, 0, 0, +1559, 0, 0, +1559, 966, 0, +1693, 1439, 0, +1827, 1722, 0, +1960, 1941, 0, +2053, 2093, 0, +2137, 2225, 0, +2230, 2358, 0, +2331, 2490, 0, +2437, 2623, 0, +2550, 2755, 0, +2667, 2887, 0, +2787, 3019, 0, +2910, 3152, 0, +3035, 3283, 0, +3162, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1457, +1695, 0, 1450, +1693, 0, 1439, +1693, 0, 1420, +1693, 0, 1394, +1693, 0, 1357, +1693, 0, 1302, +1693, 0, 1216, +1693, 0, 1067, +1693, 0, 736, +1693, 0, 0, +1693, 0, 0, +1693, 1080, 0, +1827, 1565, 0, +1960, 1851, 0, +2093, 2071, 0, +2188, 2225, 0, +2271, 2358, 0, +2364, 2490, 0, +2464, 2623, 0, +2571, 2755, 0, +2683, 2887, 0, +2799, 3019, 0, +2919, 3152, 0, +3042, 3283, 0, +3167, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1582, +1828, 0, 1576, +1827, 0, 1568, +1827, 0, 1554, +1827, 0, 1535, +1827, 0, 1508, +1827, 0, 1469, +1827, 0, 1412, +1827, 0, 1321, +1827, 0, 1161, +1827, 0, 786, +1827, 0, 0, +1827, 0, 0, +1827, 1198, 0, +1960, 1692, 0, +2093, 1981, 0, +2225, 2202, 0, +2322, 2358, 0, +2406, 2490, 0, +2498, 2623, 0, +2598, 2755, 0, +2704, 2887, 0, +2816, 3019, 0, +2932, 3152, 0, +3052, 3283, 0, +3175, 3416, 0, +3300, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1709, +1961, 0, 1705, +1960, 0, 1699, +1960, 0, 1688, +1960, 0, 1674, +1960, 0, 1654, +1960, 0, 1626, +1960, 0, 1586, +1960, 0, 1526, +1960, 0, 1431, +1960, 0, 1263, +1960, 0, 844, +1960, 0, 0, +1960, 0, 0, +1960, 1320, 0, +2093, 1821, 0, +2225, 2111, 0, +2358, 2333, 0, +2456, 2490, 0, +2539, 2623, 0, +2631, 2755, 0, +2731, 2887, 0, +2836, 3019, 0, +2948, 3152, 0, +3064, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3945, 4095, 0, +2094, 0, 1837, +2093, 0, 1834, +2093, 0, 1829, +2093, 0, 1821, +2093, 0, 1811, +2093, 0, 1796, +2093, 0, 1776, +2093, 0, 1748, +2093, 0, 1706, +2093, 0, 1645, +2093, 0, 1547, +2093, 0, 1370, +2093, 0, 913, +2093, 0, 0, +2093, 0, 0, +2093, 1444, 0, +2225, 1950, 0, +2358, 2241, 0, +2490, 2464, 0, +2589, 2623, 0, +2672, 2755, 0, +2764, 2887, 0, +2863, 3019, 0, +2969, 3152, 0, +3081, 3283, 0, +3197, 3416, 0, +3317, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2226, 0, 1966, +2226, 0, 1963, +2225, 0, 1960, +2225, 0, 1954, +2225, 0, 1946, +2225, 0, 1936, +2225, 0, 1921, +2225, 0, 1900, +2225, 0, 1871, +2225, 0, 1829, +2225, 0, 1767, +2225, 0, 1666, +2225, 0, 1484, +2225, 0, 990, +2225, 0, 0, +2225, 0, 0, +2225, 1570, 0, +2358, 2080, 0, +2490, 2373, 0, +2623, 2596, 0, +2722, 2755, 0, +2805, 2887, 0, +2896, 3019, 0, +2996, 3152, 0, +3101, 3283, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3572, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2096, +2358, 0, 2094, +2358, 0, 2091, +2358, 0, 2087, +2358, 0, 2081, +2358, 0, 2073, +2358, 0, 2062, +2358, 0, 2047, +2358, 0, 2027, +2358, 0, 1997, +2358, 0, 1955, +2358, 0, 1891, +2358, 0, 1788, +2358, 0, 1600, +2358, 0, 1076, +2358, 0, 0, +2358, 0, 0, +2358, 1698, 0, +2490, 2211, 0, +2623, 2504, 0, +2755, 2728, 0, +2855, 2887, 0, +2938, 3019, 0, +3029, 3152, 0, +3128, 3283, 0, +3234, 3416, 0, +3346, 3548, 0, +3462, 3680, 0, +3581, 3812, 0, +3704, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2226, +2491, 0, 2225, +2490, 0, 2223, +2490, 0, 2220, +2490, 0, 2215, +2490, 0, 2209, +2490, 0, 2202, +2490, 0, 2190, +2490, 0, 2175, +2490, 0, 2154, +2490, 0, 2125, +2490, 0, 2082, +2490, 0, 2017, +2490, 0, 1913, +2490, 0, 1722, +2490, 0, 1173, +2490, 0, 0, +2490, 0, 0, +2490, 1826, 0, +2623, 2342, 0, +2755, 2636, 0, +2887, 2859, 0, +2987, 3019, 0, +3070, 3152, 0, +3161, 3283, 0, +3260, 3416, 0, +3366, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2357, +2623, 0, 2356, +2623, 0, 2355, +2623, 0, 2352, +2623, 0, 2349, +2623, 0, 2345, +2623, 0, 2338, +2623, 0, 2331, +2623, 0, 2320, +2623, 0, 2304, +2623, 0, 2283, +2623, 0, 2253, +2623, 0, 2210, +2623, 0, 2144, +2623, 0, 2039, +2623, 0, 1845, +2623, 0, 1275, +2623, 0, 0, +2623, 0, 0, +2623, 1956, 0, +2755, 2474, 0, +2887, 2767, 0, +3019, 2991, 0, +3120, 3152, 0, +3202, 3283, 0, +3294, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2488, +2755, 0, 2488, +2755, 0, 2486, +2755, 0, 2485, +2755, 0, 2482, +2755, 0, 2479, +2755, 0, 2475, +2755, 0, 2469, +2755, 0, 2460, +2755, 0, 2449, +2755, 0, 2434, +2755, 0, 2413, +2755, 0, 2383, +2755, 0, 2339, +2755, 0, 2274, +2755, 0, 2167, +2755, 0, 1971, +2755, 0, 1386, +2755, 0, 0, +2755, 0, 0, +2755, 2086, 0, +2887, 2605, 0, +3019, 2898, 0, +3152, 3123, 0, +3252, 3283, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2620, +2887, 0, 2619, +2887, 0, 2618, +2887, 0, 2617, +2887, 0, 2615, +2887, 0, 2613, +2887, 0, 2609, +2887, 0, 2605, +2887, 0, 2599, +2887, 0, 2591, +2887, 0, 2580, +2887, 0, 2564, +2887, 0, 2543, +2887, 0, 2513, +2887, 0, 2469, +2887, 0, 2403, +2887, 0, 2296, +2887, 0, 2098, +2887, 0, 1497, +2887, 0, 0, +2887, 0, 0, +2887, 2217, 0, +3019, 2736, 0, +3152, 3031, 0, +3283, 3255, 0, +3384, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2751, +3019, 0, 2751, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2747, +3019, 0, 2746, +3019, 0, 2743, +3019, 0, 2740, +3019, 0, 2735, +3019, 0, 2729, +3019, 0, 2721, +3019, 0, 2710, +3019, 0, 2695, +3019, 0, 2673, +3019, 0, 2643, +3019, 0, 2599, +3019, 0, 2533, +3019, 0, 2426, +3019, 0, 2225, +3019, 0, 1613, +3019, 0, 0, +3019, 0, 0, +3019, 2347, 0, +3152, 2869, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2883, +3152, 0, 2883, +3152, 0, 2882, +3152, 0, 2881, +3152, 0, 2880, +3152, 0, 2879, +3152, 0, 2877, +3152, 0, 2875, +3152, 0, 2871, +3152, 0, 2867, +3152, 0, 2861, +3152, 0, 2853, +3152, 0, 2842, +3152, 0, 2826, +3152, 0, 2805, +3152, 0, 2774, +3152, 0, 2730, +3152, 0, 2664, +3152, 0, 2556, +3152, 0, 2355, +3152, 0, 1735, +3152, 0, 0, +3152, 0, 0, +3152, 2479, 0, +3283, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3731, 3812, 0, +3823, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3014, +3283, 0, 3014, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3013, +3283, 0, 3011, +3283, 0, 3010, +3283, 0, 3008, +3283, 0, 3006, +3283, 0, 3002, +3283, 0, 2998, +3283, 0, 2992, +3283, 0, 2984, +3283, 0, 2973, +3283, 0, 2957, +3283, 0, 2936, +3283, 0, 2905, +3283, 0, 2861, +3283, 0, 2794, +3283, 0, 2686, +3283, 0, 2484, +3283, 0, 1856, +3283, 0, 0, +3283, 0, 0, +3283, 2610, 0, +3416, 3132, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3142, +3416, 0, 3140, +3416, 0, 3138, +3416, 0, 3134, +3416, 0, 3130, +3416, 0, 3124, +3416, 0, 3115, +3416, 0, 3104, +3416, 0, 3089, +3416, 0, 3067, +3416, 0, 3037, +3416, 0, 2992, +3416, 0, 2926, +3416, 0, 2817, +3416, 0, 2615, +3416, 0, 1986, +3416, 0, 0, +3416, 0, 0, +3416, 2742, 0, +3548, 3264, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3996, 4076, 0, +4087, 4095, 0, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3274, +3548, 0, 3272, +3548, 0, 3269, +3548, 0, 3266, +3548, 0, 3261, +3548, 0, 3256, +3548, 0, 3247, +3548, 0, 3236, +3548, 0, 3221, +3548, 0, 3199, +3548, 0, 3168, +3548, 0, 3124, +3548, 0, 3057, +3548, 0, 2949, +3548, 0, 2746, +3548, 0, 2111, +3548, 0, 0, +3548, 0, 0, +3548, 2873, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3405, +3680, 0, 3404, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3393, +3680, 0, 3387, +3680, 0, 3379, +3680, 0, 3368, +3680, 0, 3353, +3680, 0, 3331, +3680, 0, 3300, +3680, 0, 3256, +3680, 0, 3189, +3680, 0, 3081, +3680, 0, 2877, +3680, 0, 2242, +3680, 0, 0, +3680, 0, 0, +3680, 3005, 0, +3812, 3528, 0, +3944, 3822, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3537, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3525, +3812, 0, 3519, +3812, 0, 3511, +3812, 0, 3500, +3812, 0, 3484, +3812, 0, 3463, +3812, 0, 3432, +3812, 0, 3388, +3812, 0, 3321, +3812, 0, 3212, +3812, 0, 3009, +3812, 0, 2371, +3812, 0, 0, +3812, 0, 0, +3812, 3137, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3616, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3453, +3944, 0, 3344, +3944, 0, 3140, +3944, 0, 2500, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3763, +4076, 0, 3748, +4076, 0, 3726, +4076, 0, 3696, +4076, 0, 3651, +4076, 0, 3585, +4076, 0, 3476, +4076, 0, 3272, +4076, 0, 2628, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3404, +4095, 0, 2762, +4095, 0, 0, +4095, 0, 0, +4095, 3533, 0, +0, 312, 466, +0, 419, 466, +0, 466, 388, +0, 466, 154, +0, 609, 0, +59, 750, 0, +350, 888, 0, +573, 1025, 0, +762, 1160, 0, +934, 1295, 0, +1092, 1429, 0, +1244, 1563, 0, +1390, 1696, 0, +1532, 1828, 0, +1672, 1961, 0, +1809, 2094, 0, +1945, 2226, 0, +2080, 2358, 0, +2215, 2491, 0, +2348, 2623, 0, +2482, 2755, 0, +2615, 2887, 0, +2747, 3019, 0, +2880, 3152, 0, +3012, 3284, 0, +3145, 3416, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 171, 466, +15, 333, 450, +15, 450, 432, +15, 450, 225, +0, 598, 0, +258, 741, 0, +466, 882, 0, +647, 1020, 0, +813, 1157, 0, +968, 1292, 0, +1118, 1427, 0, +1262, 1561, 0, +1403, 1695, 0, +1542, 1828, 0, +1679, 1961, 0, +1814, 2093, 0, +1949, 2226, 0, +2083, 2358, 0, +2217, 2491, 0, +2350, 2623, 0, +2483, 2755, 0, +2616, 2887, 0, +2748, 3019, 0, +2881, 3152, 0, +3013, 3283, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 466, +15, 145, 450, +218, 361, 427, +218, 427, 306, +277, 582, 148, +435, 730, 34, +585, 873, 0, +731, 1014, 0, +873, 1152, 0, +1012, 1289, 0, +1149, 1424, 0, +1285, 1559, 0, +1420, 1693, 0, +1554, 1827, 0, +1688, 1960, 0, +1821, 2093, 0, +1954, 2225, 0, +2087, 2358, 0, +2220, 2490, 0, +2352, 2623, 0, +2485, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3152, 0, +3013, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +154, 0, 466, +225, 15, 450, +306, 218, 427, +396, 396, 396, +494, 560, 350, +598, 714, 280, +708, 862, 166, +823, 1005, 0, +942, 1146, 0, +1064, 1284, 0, +1188, 1421, 0, +1315, 1557, 0, +1442, 1691, 0, +1571, 1825, 0, +1700, 1959, 0, +1830, 2092, 0, +1961, 2225, 0, +2092, 2357, 0, +2223, 2490, 0, +2355, 2622, 0, +2487, 2755, 0, +2619, 2887, 0, +2750, 3019, 0, +2882, 3151, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +485, 0, 609, +520, 0, 598, +564, 148, 582, +560, 350, 494, +560, 438, 350, +714, 696, 280, +815, 862, 166, +908, 1005, 0, +1009, 1146, 0, +1116, 1284, 0, +1228, 1421, 0, +1345, 1557, 0, +1465, 1691, 0, +1588, 1825, 0, +1714, 1959, 0, +1841, 2092, 0, +1969, 2225, 0, +2098, 2357, 0, +2228, 2490, 0, +2358, 2622, 0, +2489, 2755, 0, +2620, 2887, 0, +2751, 3019, 0, +2883, 3151, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +723, 0, 750, +741, 0, 738, +730, 34, 683, +714, 280, 598, +714, 280, 409, +714, 490, 280, +862, 784, 166, +1002, 1005, 0, +1086, 1146, 0, +1177, 1284, 0, +1277, 1421, 0, +1384, 1557, 0, +1495, 1691, 0, +1611, 1825, 0, +1731, 1959, 0, +1854, 2092, 0, +1979, 2225, 0, +2105, 2357, 0, +2234, 2490, 0, +2362, 2622, 0, +2492, 2755, 0, +2623, 2887, 0, +2753, 3019, 0, +2885, 3151, 0, +3016, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 852, +882, 0, 822, +873, 0, 776, +862, 166, 708, +862, 166, 567, +862, 166, 264, +862, 550, 166, +1005, 881, 0, +1146, 1119, 0, +1249, 1284, 0, +1335, 1421, 0, +1430, 1557, 0, +1532, 1691, 0, +1640, 1825, 0, +1754, 1959, 0, +1871, 2092, 0, +1992, 2225, 0, +2115, 2357, 0, +2241, 2490, 0, +2368, 2622, 0, +2497, 2755, 0, +2626, 2887, 0, +2756, 3019, 0, +2886, 3151, 0, +3017, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 939, +1020, 0, 914, +1014, 0, 877, +1005, 0, 823, +1005, 0, 717, +1005, 0, 523, +1005, 0, 0, +1005, 620, 0, +1146, 983, 0, +1284, 1235, 0, +1403, 1421, 0, +1486, 1557, 0, +1577, 1691, 0, +1676, 1825, 0, +1781, 1959, 0, +1893, 2092, 0, +2009, 2225, 0, +2128, 2357, 0, +2251, 2490, 0, +2375, 2622, 0, +2502, 2755, 0, +2630, 2887, 0, +2759, 3019, 0, +2889, 3151, 0, +3019, 3283, 0, +3150, 3416, 0, +3281, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 1033, +1157, 0, 1013, +1152, 0, 984, +1146, 0, 942, +1146, 0, 863, +1146, 0, 730, +1146, 0, 455, +1146, 0, 0, +1146, 700, 0, +1284, 1093, 0, +1421, 1353, 0, +1551, 1557, 0, +1631, 1691, 0, +1720, 1825, 0, +1817, 1959, 0, +1920, 2092, 0, +2030, 2225, 0, +2145, 2357, 0, +2264, 2490, 0, +2385, 2622, 0, +2510, 2755, 0, +2636, 2887, 0, +2763, 3019, 0, +2892, 3151, 0, +3021, 3283, 0, +3151, 3416, 0, +3282, 3548, 0, +3413, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1135, +1292, 0, 1119, +1289, 0, 1096, +1284, 0, 1064, +1284, 0, 1005, +1284, 0, 911, +1284, 0, 746, +1284, 0, 346, +1284, 0, 0, +1284, 788, 0, +1421, 1207, 0, +1557, 1476, 0, +1691, 1688, 0, +1772, 1825, 0, +1860, 1959, 0, +1955, 2092, 0, +2058, 2225, 0, +2166, 2357, 0, +2280, 2490, 0, +2398, 2622, 0, +2520, 2755, 0, +2643, 2887, 0, +2769, 3019, 0, +2896, 3151, 0, +3025, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3415, 3680, 0, +3545, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1244, +1427, 0, 1231, +1424, 0, 1213, +1421, 0, 1188, +1421, 0, 1144, +1421, 0, 1077, +1421, 0, 969, +1421, 0, 767, +1421, 0, 141, +1421, 0, 0, +1421, 885, 0, +1557, 1326, 0, +1691, 1600, 0, +1825, 1816, 0, +1911, 1959, 0, +1997, 2092, 0, +2092, 2225, 0, +2193, 2357, 0, +2302, 2490, 0, +2414, 2622, 0, +2532, 2755, 0, +2653, 2887, 0, +2776, 3019, 0, +2902, 3151, 0, +3029, 3283, 0, +3157, 3416, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1357, +1561, 0, 1347, +1559, 0, 1333, +1557, 0, 1315, +1557, 0, 1281, +1557, 0, 1233, +1557, 0, 1159, +1557, 0, 1037, +1557, 0, 794, +1557, 0, 0, +1557, 0, 0, +1557, 988, 0, +1691, 1447, 0, +1825, 1727, 0, +1959, 1944, 0, +2049, 2092, 0, +2134, 2225, 0, +2228, 2357, 0, +2329, 2490, 0, +2436, 2622, 0, +2549, 2755, 0, +2666, 2887, 0, +2786, 3019, 0, +2909, 3151, 0, +3034, 3283, 0, +3161, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1475, +1695, 0, 1467, +1693, 0, 1456, +1691, 0, 1442, +1691, 0, 1417, +1691, 0, 1382, +1691, 0, 1330, +1691, 0, 1249, +1691, 0, 1113, +1691, 0, 827, +1691, 0, 0, +1691, 0, 0, +1691, 1098, 0, +1825, 1571, 0, +1959, 1854, 0, +2092, 2073, 0, +2185, 2225, 0, +2269, 2357, 0, +2362, 2490, 0, +2463, 2622, 0, +2570, 2755, 0, +2682, 2887, 0, +2798, 3019, 0, +2919, 3151, 0, +3042, 3283, 0, +3167, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1596, +1828, 0, 1590, +1827, 0, 1582, +1825, 0, 1571, +1825, 0, 1552, +1825, 0, 1526, +1825, 0, 1489, +1825, 0, 1434, +1825, 0, 1348, +1825, 0, 1199, +1825, 0, 869, +1825, 0, 0, +1825, 0, 0, +1825, 1212, 0, +1959, 1697, 0, +2092, 1983, 0, +2225, 2203, 0, +2320, 2357, 0, +2404, 2490, 0, +2496, 2622, 0, +2596, 2755, 0, +2703, 2887, 0, +2815, 3019, 0, +2932, 3151, 0, +3051, 3283, 0, +3174, 3416, 0, +3299, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1719, +1961, 0, 1715, +1960, 0, 1708, +1959, 0, 1700, +1959, 0, 1686, +1959, 0, 1667, +1959, 0, 1640, +1959, 0, 1601, +1959, 0, 1544, +1959, 0, 1453, +1959, 0, 1294, +1959, 0, 917, +1959, 0, 0, +1959, 0, 0, +1959, 1331, 0, +2092, 1824, 0, +2225, 2112, 0, +2357, 2334, 0, +2454, 2490, 0, +2538, 2622, 0, +2630, 2755, 0, +2730, 2887, 0, +2836, 3019, 0, +2948, 3151, 0, +3064, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1845, +2093, 0, 1841, +2093, 0, 1837, +2092, 0, 1830, +2092, 0, 1820, +2092, 0, 1806, +2092, 0, 1786, +2092, 0, 1758, +2092, 0, 1718, +2092, 0, 1658, +2092, 0, 1564, +2092, 0, 1394, +2092, 0, 977, +2092, 0, 0, +2092, 0, 0, +2092, 1452, 0, +2225, 1953, 0, +2357, 2243, 0, +2490, 2465, 0, +2588, 2622, 0, +2671, 2755, 0, +2763, 2887, 0, +2863, 3019, 0, +2969, 3151, 0, +3080, 3283, 0, +3196, 3416, 0, +3316, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3818, 4076, 0, +3948, 4095, 0, +2226, 0, 1972, +2226, 0, 1969, +2225, 0, 1966, +2225, 0, 1961, +2225, 0, 1953, +2225, 0, 1943, +2225, 0, 1928, +2225, 0, 1908, +2225, 0, 1880, +2225, 0, 1839, +2225, 0, 1777, +2225, 0, 1679, +2225, 0, 1503, +2225, 0, 1044, +2225, 0, 0, +2225, 0, 0, +2225, 1576, 0, +2357, 2082, 0, +2490, 2374, 0, +2622, 2596, 0, +2721, 2755, 0, +2804, 2887, 0, +2896, 3019, 0, +2995, 3151, 0, +3101, 3283, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2100, +2358, 0, 2098, +2358, 0, 2096, +2357, 0, 2092, +2357, 0, 2086, +2357, 0, 2078, +2357, 0, 2068, +2357, 0, 2053, +2357, 0, 2032, +2357, 0, 2004, +2357, 0, 1962, +2357, 0, 1899, +2357, 0, 1798, +2357, 0, 1615, +2357, 0, 1122, +2357, 0, 0, +2357, 0, 0, +2357, 1702, 0, +2490, 2213, 0, +2622, 2505, 0, +2755, 2728, 0, +2854, 2887, 0, +2937, 3019, 0, +3029, 3151, 0, +3128, 3283, 0, +3234, 3416, 0, +3345, 3548, 0, +3461, 3680, 0, +3581, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2230, +2491, 0, 2228, +2490, 0, 2226, +2490, 0, 2223, +2490, 0, 2219, +2490, 0, 2213, +2490, 0, 2206, +2490, 0, 2195, +2490, 0, 2180, +2490, 0, 2159, +2490, 0, 2129, +2490, 0, 2087, +2490, 0, 2023, +2490, 0, 1920, +2490, 0, 1733, +2490, 0, 1210, +2490, 0, 0, +2490, 0, 0, +2490, 1830, 0, +2622, 2343, 0, +2755, 2636, 0, +2887, 2860, 0, +2987, 3019, 0, +3070, 3151, 0, +3161, 3283, 0, +3260, 3416, 0, +3366, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2359, +2623, 0, 2358, +2623, 0, 2357, +2622, 0, 2355, +2622, 0, 2352, +2622, 0, 2347, +2622, 0, 2341, +2622, 0, 2334, +2622, 0, 2323, +2622, 0, 2308, +2622, 0, 2287, +2622, 0, 2256, +2622, 0, 2214, +2622, 0, 2149, +2622, 0, 2045, +2622, 0, 1853, +2622, 0, 1304, +2622, 0, 0, +2622, 0, 0, +2622, 1958, 0, +2755, 2475, 0, +2887, 2768, 0, +3019, 2991, 0, +3119, 3151, 0, +3202, 3283, 0, +3293, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2490, +2755, 0, 2489, +2755, 0, 2488, +2755, 0, 2487, +2755, 0, 2484, +2755, 0, 2481, +2755, 0, 2477, +2755, 0, 2471, +2755, 0, 2463, +2755, 0, 2452, +2755, 0, 2436, +2755, 0, 2415, +2755, 0, 2386, +2755, 0, 2342, +2755, 0, 2277, +2755, 0, 2172, +2755, 0, 1977, +2755, 0, 1409, +2755, 0, 0, +2755, 0, 0, +2755, 2088, 0, +2887, 2605, 0, +3019, 2899, 0, +3151, 3123, 0, +3252, 3283, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2621, +2887, 0, 2620, +2887, 0, 2620, +2887, 0, 2619, +2887, 0, 2617, +2887, 0, 2614, +2887, 0, 2611, +2887, 0, 2607, +2887, 0, 2601, +2887, 0, 2592, +2887, 0, 2581, +2887, 0, 2566, +2887, 0, 2545, +2887, 0, 2515, +2887, 0, 2471, +2887, 0, 2406, +2887, 0, 2299, +2887, 0, 2103, +2887, 0, 1516, +2887, 0, 0, +2887, 0, 0, +2887, 2218, 0, +3019, 2736, 0, +3151, 3031, 0, +3283, 3255, 0, +3384, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2752, +3019, 0, 2752, +3019, 0, 2751, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2747, +3019, 0, 2745, +3019, 0, 2741, +3019, 0, 2737, +3019, 0, 2731, +3019, 0, 2723, +3019, 0, 2712, +3019, 0, 2696, +3019, 0, 2675, +3019, 0, 2645, +3019, 0, 2601, +3019, 0, 2535, +3019, 0, 2428, +3019, 0, 2229, +3019, 0, 1628, +3019, 0, 0, +3019, 0, 0, +3019, 2348, 0, +3151, 2869, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2884, +3152, 0, 2883, +3152, 0, 2883, +3151, 0, 2882, +3151, 0, 2881, +3151, 0, 2880, +3151, 0, 2878, +3151, 0, 2876, +3151, 0, 2872, +3151, 0, 2868, +3151, 0, 2862, +3151, 0, 2854, +3151, 0, 2842, +3151, 0, 2827, +3151, 0, 2806, +3151, 0, 2775, +3151, 0, 2732, +3151, 0, 2665, +3151, 0, 2558, +3151, 0, 2358, +3151, 0, 1746, +3151, 0, 0, +3151, 0, 0, +3151, 2480, 0, +3283, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3015, +3283, 0, 3015, +3283, 0, 3014, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3012, +3283, 0, 3011, +3283, 0, 3009, +3283, 0, 3007, +3283, 0, 3003, +3283, 0, 2999, +3283, 0, 2993, +3283, 0, 2985, +3283, 0, 2973, +3283, 0, 2958, +3283, 0, 2936, +3283, 0, 2906, +3283, 0, 2862, +3283, 0, 2795, +3283, 0, 2688, +3283, 0, 2486, +3283, 0, 1864, +3283, 0, 0, +3283, 0, 0, +3283, 2611, 0, +3416, 3132, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3142, +3416, 0, 3141, +3416, 0, 3138, +3416, 0, 3135, +3416, 0, 3130, +3416, 0, 3124, +3416, 0, 3116, +3416, 0, 3105, +3416, 0, 3089, +3416, 0, 3068, +3416, 0, 3038, +3416, 0, 2993, +3416, 0, 2927, +3416, 0, 2818, +3416, 0, 2617, +3416, 0, 1992, +3416, 0, 0, +3416, 0, 0, +3416, 2742, 0, +3548, 3264, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3275, +3548, 0, 3274, +3548, 0, 3272, +3548, 0, 3270, +3548, 0, 3267, +3548, 0, 3262, +3548, 0, 3256, +3548, 0, 3248, +3548, 0, 3237, +3548, 0, 3221, +3548, 0, 3200, +3548, 0, 3169, +3548, 0, 3125, +3548, 0, 3058, +3548, 0, 2950, +3548, 0, 2747, +3548, 0, 2115, +3548, 0, 0, +3548, 0, 0, +3548, 2874, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3406, +3680, 0, 3404, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3394, +3680, 0, 3388, +3680, 0, 3379, +3680, 0, 3368, +3680, 0, 3353, +3680, 0, 3331, +3680, 0, 3301, +3680, 0, 3256, +3680, 0, 3189, +3680, 0, 3081, +3680, 0, 2878, +3680, 0, 2246, +3680, 0, 0, +3680, 0, 0, +3680, 3006, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3538, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3526, +3812, 0, 3520, +3812, 0, 3511, +3812, 0, 3500, +3812, 0, 3485, +3812, 0, 3463, +3812, 0, 3432, +3812, 0, 3388, +3812, 0, 3321, +3812, 0, 3213, +3812, 0, 3010, +3812, 0, 2374, +3812, 0, 0, +3812, 0, 0, +3812, 3138, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3616, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3453, +3944, 0, 3344, +3944, 0, 3141, +3944, 0, 2502, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3794, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3764, +4076, 0, 3748, +4076, 0, 3727, +4076, 0, 3696, +4076, 0, 3652, +4076, 0, 3585, +4076, 0, 3476, +4076, 0, 3272, +4076, 0, 2630, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3405, +4095, 0, 2764, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 427, 609, +0, 512, 609, +0, 606, 609, +0, 609, 485, +0, 609, 224, +0, 750, 0, +0, 888, 0, +371, 1025, 0, +640, 1160, 0, +853, 1295, 0, +1037, 1429, 0, +1205, 1563, 0, +1362, 1696, 0, +1512, 1828, 0, +1657, 1961, 0, +1798, 2094, 0, +1937, 2226, 0, +2074, 2358, 0, +2210, 2491, 0, +2345, 2623, 0, +2479, 2755, 0, +2613, 2887, 0, +2746, 3019, 0, +2879, 3152, 0, +3012, 3284, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 322, 609, +0, 444, 598, +0, 551, 598, +0, 598, 520, +0, 598, 286, +0, 741, 0, +190, 882, 0, +482, 1020, 0, +705, 1157, 0, +894, 1292, 0, +1065, 1427, 0, +1225, 1561, 0, +1376, 1695, 0, +1522, 1828, 0, +1664, 1961, 0, +1804, 2093, 0, +1941, 2226, 0, +2077, 2358, 0, +2212, 2491, 0, +2347, 2623, 0, +2481, 2755, 0, +2614, 2887, 0, +2747, 3019, 0, +2880, 3152, 0, +3012, 3283, 0, +3145, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 127, 609, +0, 303, 598, +148, 466, 582, +148, 582, 564, +148, 582, 357, +132, 730, 34, +390, 873, 0, +598, 1014, 0, +779, 1152, 0, +945, 1289, 0, +1101, 1424, 0, +1250, 1559, 0, +1394, 1693, 0, +1535, 1827, 0, +1674, 1960, 0, +1811, 2093, 0, +1946, 2225, 0, +2081, 2358, 0, +2215, 2490, 0, +2349, 2623, 0, +2482, 2755, 0, +2615, 2887, 0, +2747, 3019, 0, +2880, 3152, 0, +3013, 3283, 0, +3145, 3416, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 609, +0, 0, 598, +148, 277, 582, +350, 494, 560, +350, 560, 438, +409, 714, 280, +567, 862, 166, +717, 1005, 0, +863, 1146, 0, +1005, 1284, 0, +1144, 1421, 0, +1281, 1557, 0, +1417, 1691, 0, +1552, 1825, 0, +1686, 1959, 0, +1820, 2092, 0, +1953, 2225, 0, +2086, 2357, 0, +2219, 2490, 0, +2352, 2622, 0, +2484, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3151, 0, +3013, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +224, 0, 609, +286, 0, 598, +357, 148, 582, +438, 350, 560, +528, 528, 528, +625, 691, 482, +730, 846, 412, +840, 994, 298, +955, 1137, 80, +1074, 1278, 0, +1196, 1416, 0, +1320, 1553, 0, +1446, 1689, 0, +1574, 1823, 0, +1703, 1958, 0, +1832, 2091, 0, +1963, 2224, 0, +2093, 2357, 0, +2224, 2489, 0, +2356, 2622, 0, +2487, 2755, 0, +2619, 2887, 0, +2750, 3019, 0, +2883, 3151, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +587, 0, 750, +616, 0, 741, +652, 34, 730, +696, 280, 714, +691, 482, 625, +691, 570, 482, +846, 828, 412, +947, 994, 298, +1040, 1137, 80, +1141, 1278, 0, +1248, 1416, 0, +1360, 1553, 0, +1477, 1689, 0, +1598, 1823, 0, +1721, 1958, 0, +1846, 2091, 0, +1973, 2224, 0, +2101, 2357, 0, +2230, 2489, 0, +2360, 2622, 0, +2490, 2755, 0, +2621, 2887, 0, +2752, 3019, 0, +2884, 3151, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +838, 0, 888, +855, 0, 882, +873, 0, 870, +862, 166, 815, +846, 412, 730, +846, 412, 541, +846, 622, 412, +994, 917, 298, +1134, 1137, 80, +1218, 1278, 0, +1310, 1416, 0, +1409, 1553, 0, +1515, 1689, 0, +1627, 1823, 0, +1743, 1958, 0, +1863, 2091, 0, +1986, 2224, 0, +2111, 2357, 0, +2238, 2489, 0, +2366, 2622, 0, +2495, 2755, 0, +2625, 2887, 0, +2755, 3019, 0, +2886, 3151, 0, +3016, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 1006, +1020, 0, 985, +1014, 0, 954, +1005, 0, 908, +994, 298, 840, +994, 298, 699, +994, 298, 397, +994, 682, 298, +1137, 1013, 80, +1278, 1251, 0, +1381, 1416, 0, +1467, 1553, 0, +1562, 1689, 0, +1664, 1823, 0, +1772, 1958, 0, +1885, 2091, 0, +2003, 2224, 0, +2124, 2357, 0, +2247, 2489, 0, +2373, 2622, 0, +2501, 2755, 0, +2629, 2887, 0, +2758, 3019, 0, +2888, 3151, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 1089, +1157, 0, 1071, +1152, 0, 1045, +1146, 0, 1009, +1137, 80, 955, +1137, 80, 850, +1137, 80, 655, +1137, 80, 81, +1137, 753, 80, +1278, 1116, 0, +1416, 1367, 0, +1535, 1553, 0, +1617, 1689, 0, +1709, 1823, 0, +1808, 1958, 0, +1913, 2091, 0, +2025, 2224, 0, +2141, 2357, 0, +2260, 2489, 0, +2383, 2622, 0, +2508, 2755, 0, +2635, 2887, 0, +2762, 3019, 0, +2891, 3151, 0, +3021, 3283, 0, +3151, 3416, 0, +3282, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1181, +1292, 0, 1166, +1289, 0, 1145, +1284, 0, 1116, +1278, 0, 1074, +1278, 0, 995, +1278, 0, 862, +1278, 0, 587, +1278, 0, 0, +1278, 832, 0, +1416, 1225, 0, +1553, 1486, 0, +1683, 1689, 0, +1763, 1823, 0, +1852, 1958, 0, +1949, 2091, 0, +2053, 2224, 0, +2162, 2357, 0, +2277, 2489, 0, +2396, 2622, 0, +2517, 2755, 0, +2642, 2887, 0, +2768, 3019, 0, +2895, 3151, 0, +3024, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1280, +1427, 0, 1267, +1424, 0, 1251, +1421, 0, 1228, +1416, 0, 1196, +1416, 0, 1137, +1416, 0, 1043, +1416, 0, 878, +1416, 0, 478, +1416, 0, 0, +1416, 920, 0, +1553, 1340, 0, +1689, 1608, 0, +1823, 1821, 0, +1905, 1958, 0, +1992, 2091, 0, +2087, 2224, 0, +2190, 2357, 0, +2298, 2489, 0, +2412, 2622, 0, +2530, 2755, 0, +2651, 2887, 0, +2775, 3019, 0, +2901, 3151, 0, +3028, 3283, 0, +3157, 3416, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1385, +1561, 0, 1376, +1559, 0, 1363, +1557, 0, 1345, +1553, 0, 1320, +1553, 0, 1276, +1553, 0, 1209, +1553, 0, 1102, +1553, 0, 900, +1553, 0, 275, +1553, 0, 0, +1553, 1017, 0, +1689, 1457, 0, +1823, 1732, 0, +1958, 1948, 0, +2044, 2091, 0, +2130, 2224, 0, +2224, 2357, 0, +2326, 2489, 0, +2434, 2622, 0, +2547, 2755, 0, +2664, 2887, 0, +2785, 3019, 0, +2908, 3151, 0, +3034, 3283, 0, +3161, 3416, 0, +3289, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1496, +1695, 0, 1489, +1693, 0, 1479, +1691, 0, 1465, +1689, 0, 1446, +1689, 0, 1413, +1689, 0, 1365, +1689, 0, 1291, +1689, 0, 1169, +1689, 0, 926, +1689, 0, 0, +1689, 0, 0, +1689, 1120, 0, +1823, 1579, 0, +1958, 1859, 0, +2091, 2076, 0, +2181, 2224, 0, +2266, 2357, 0, +2360, 2489, 0, +2460, 2622, 0, +2568, 2755, 0, +2681, 2887, 0, +2797, 3019, 0, +2918, 3151, 0, +3041, 3283, 0, +3166, 3416, 0, +3293, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1612, +1828, 0, 1607, +1827, 0, 1599, +1825, 0, 1588, +1823, 0, 1574, +1823, 0, 1549, +1823, 0, 1514, +1823, 0, 1462, +1823, 0, 1382, +1823, 0, 1245, +1823, 0, 960, +1823, 0, 0, +1823, 0, 0, +1823, 1230, 0, +1958, 1703, 0, +2091, 1986, 0, +2224, 2206, 0, +2317, 2357, 0, +2401, 2489, 0, +2494, 2622, 0, +2595, 2755, 0, +2702, 2887, 0, +2814, 3019, 0, +2931, 3151, 0, +3051, 3283, 0, +3174, 3416, 0, +3299, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1732, +1961, 0, 1728, +1960, 0, 1722, +1959, 0, 1714, +1958, 0, 1703, +1958, 0, 1684, +1958, 0, 1658, +1958, 0, 1621, +1958, 0, 1566, +1958, 0, 1480, +1958, 0, 1332, +1958, 0, 1000, +1958, 0, 0, +1958, 0, 0, +1958, 1344, 0, +2091, 1829, 0, +2224, 2115, 0, +2357, 2335, 0, +2452, 2489, 0, +2536, 2622, 0, +2628, 2755, 0, +2728, 2887, 0, +2835, 3019, 0, +2947, 3151, 0, +3063, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3431, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1855, +2093, 0, 1851, +2093, 0, 1847, +2092, 0, 1841, +2091, 0, 1832, +2091, 0, 1819, +2091, 0, 1799, +2091, 0, 1772, +2091, 0, 1733, +2091, 0, 1676, +2091, 0, 1585, +2091, 0, 1425, +2091, 0, 1050, +2091, 0, 0, +2091, 0, 0, +2091, 1463, 0, +2224, 1956, 0, +2357, 2245, 0, +2489, 2466, 0, +2586, 2622, 0, +2670, 2755, 0, +2762, 2887, 0, +2862, 3019, 0, +2968, 3151, 0, +3080, 3283, 0, +3196, 3416, 0, +3316, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3818, 4076, 0, +3948, 4095, 0, +2226, 0, 1979, +2226, 0, 1977, +2225, 0, 1973, +2225, 0, 1969, +2224, 0, 1963, +2224, 0, 1952, +2224, 0, 1938, +2224, 0, 1918, +2224, 0, 1891, +2224, 0, 1850, +2224, 0, 1790, +2224, 0, 1695, +2224, 0, 1527, +2224, 0, 1108, +2224, 0, 0, +2224, 0, 0, +2224, 1584, 0, +2357, 2085, 0, +2489, 2375, 0, +2622, 2597, 0, +2720, 2755, 0, +2803, 2887, 0, +2895, 3019, 0, +2995, 3151, 0, +3101, 3283, 0, +3212, 3416, 0, +3329, 3548, 0, +3448, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2106, +2358, 0, 2104, +2358, 0, 2101, +2357, 0, 2098, +2357, 0, 2093, +2357, 0, 2086, +2357, 0, 2075, +2357, 0, 2060, +2357, 0, 2040, +2357, 0, 2012, +2357, 0, 1970, +2357, 0, 1909, +2357, 0, 1811, +2357, 0, 1634, +2357, 0, 1176, +2357, 0, 0, +2357, 0, 0, +2357, 1708, 0, +2489, 2215, 0, +2622, 2506, 0, +2755, 2729, 0, +2853, 2887, 0, +2936, 3019, 0, +3028, 3151, 0, +3127, 3283, 0, +3233, 3416, 0, +3345, 3548, 0, +3461, 3680, 0, +3581, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2234, +2491, 0, 2233, +2490, 0, 2230, +2490, 0, 2228, +2489, 0, 2224, +2489, 0, 2219, +2489, 0, 2211, +2489, 0, 2200, +2489, 0, 2185, +2489, 0, 2165, +2489, 0, 2136, +2489, 0, 2094, +2489, 0, 2031, +2489, 0, 1930, +2489, 0, 1748, +2489, 0, 1255, +2489, 0, 0, +2489, 0, 0, +2489, 1834, 0, +2622, 2344, 0, +2755, 2637, 0, +2887, 2860, 0, +2986, 3019, 0, +3069, 3151, 0, +3160, 3283, 0, +3260, 3416, 0, +3366, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2363, +2623, 0, 2362, +2623, 0, 2360, +2622, 0, 2358, +2622, 0, 2356, +2622, 0, 2351, +2622, 0, 2346, +2622, 0, 2337, +2622, 0, 2327, +2622, 0, 2312, +2622, 0, 2291, +2622, 0, 2261, +2622, 0, 2219, +2622, 0, 2155, +2622, 0, 2052, +2622, 0, 1865, +2622, 0, 1342, +2622, 0, 0, +2622, 0, 0, +2622, 1962, 0, +2755, 2476, 0, +2887, 2768, 0, +3019, 2992, 0, +3119, 3151, 0, +3201, 3283, 0, +3293, 3416, 0, +3392, 3548, 0, +3498, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2493, +2755, 0, 2492, +2755, 0, 2491, +2755, 0, 2489, +2755, 0, 2487, +2755, 0, 2484, +2755, 0, 2480, +2755, 0, 2474, +2755, 0, 2466, +2755, 0, 2455, +2755, 0, 2440, +2755, 0, 2419, +2755, 0, 2389, +2755, 0, 2346, +2755, 0, 2281, +2755, 0, 2177, +2755, 0, 1986, +2755, 0, 1439, +2755, 0, 0, +2755, 0, 0, +2755, 2091, 0, +2887, 2606, 0, +3019, 2899, 0, +3151, 3123, 0, +3251, 3283, 0, +3334, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3977, 4095, 0, +2887, 0, 2623, +2887, 0, 2622, +2887, 0, 2621, +2887, 0, 2620, +2887, 0, 2619, +2887, 0, 2617, +2887, 0, 2613, +2887, 0, 2609, +2887, 0, 2603, +2887, 0, 2595, +2887, 0, 2584, +2887, 0, 2569, +2887, 0, 2548, +2887, 0, 2517, +2887, 0, 2474, +2887, 0, 2409, +2887, 0, 2304, +2887, 0, 2110, +2887, 0, 1540, +2887, 0, 0, +2887, 0, 0, +2887, 2220, 0, +3019, 2737, 0, +3151, 3031, 0, +3283, 3255, 0, +3384, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2754, +3019, 0, 2753, +3019, 0, 2752, +3019, 0, 2751, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2746, +3019, 0, 2743, +3019, 0, 2738, +3019, 0, 2732, +3019, 0, 2724, +3019, 0, 2713, +3019, 0, 2698, +3019, 0, 2677, +3019, 0, 2647, +3019, 0, 2603, +3019, 0, 2537, +3019, 0, 2431, +3019, 0, 2234, +3019, 0, 1646, +3019, 0, 0, +3019, 0, 0, +3019, 2350, 0, +3151, 2869, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2885, +3152, 0, 2885, +3152, 0, 2884, +3151, 0, 2883, +3151, 0, 2883, +3151, 0, 2881, +3151, 0, 2879, +3151, 0, 2877, +3151, 0, 2873, +3151, 0, 2869, +3151, 0, 2863, +3151, 0, 2855, +3151, 0, 2844, +3151, 0, 2829, +3151, 0, 2807, +3151, 0, 2777, +3151, 0, 2733, +3151, 0, 2667, +3151, 0, 2560, +3151, 0, 2362, +3151, 0, 1760, +3151, 0, 0, +3151, 0, 0, +3151, 2481, 0, +3283, 3000, 0, +3416, 3295, 0, +3548, 3519, 0, +3648, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3016, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3015, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3012, +3283, 0, 3010, +3283, 0, 3008, +3283, 0, 3004, +3283, 0, 3000, +3283, 0, 2994, +3283, 0, 2986, +3283, 0, 2974, +3283, 0, 2959, +3283, 0, 2938, +3283, 0, 2907, +3283, 0, 2863, +3283, 0, 2797, +3283, 0, 2690, +3283, 0, 2489, +3283, 0, 1875, +3283, 0, 0, +3283, 0, 0, +3283, 2612, 0, +3416, 3132, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3141, +3416, 0, 3139, +3416, 0, 3135, +3416, 0, 3131, +3416, 0, 3125, +3416, 0, 3117, +3416, 0, 3106, +3416, 0, 3090, +3416, 0, 3069, +3416, 0, 3038, +3416, 0, 2994, +3416, 0, 2928, +3416, 0, 2820, +3416, 0, 2619, +3416, 0, 2000, +3416, 0, 0, +3416, 0, 0, +3416, 2743, 0, +3548, 3264, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3270, +3548, 0, 3267, +3548, 0, 3262, +3548, 0, 3256, +3548, 0, 3248, +3548, 0, 3237, +3548, 0, 3222, +3548, 0, 3200, +3548, 0, 3170, +3548, 0, 3125, +3548, 0, 3059, +3548, 0, 2951, +3548, 0, 2749, +3548, 0, 2122, +3548, 0, 0, +3548, 0, 0, +3548, 2874, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3406, +3680, 0, 3404, +3680, 0, 3402, +3680, 0, 3399, +3680, 0, 3394, +3680, 0, 3388, +3680, 0, 3380, +3680, 0, 3369, +3680, 0, 3353, +3680, 0, 3332, +3680, 0, 3301, +3680, 0, 3257, +3680, 0, 3190, +3680, 0, 3082, +3680, 0, 2879, +3680, 0, 2251, +3680, 0, 0, +3680, 0, 0, +3680, 3006, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3538, +3812, 0, 3536, +3812, 0, 3534, +3812, 0, 3530, +3812, 0, 3526, +3812, 0, 3520, +3812, 0, 3511, +3812, 0, 3500, +3812, 0, 3485, +3812, 0, 3463, +3812, 0, 3433, +3812, 0, 3388, +3812, 0, 3322, +3812, 0, 3213, +3812, 0, 3011, +3812, 0, 2377, +3812, 0, 0, +3812, 0, 0, +3812, 3138, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3658, +3944, 0, 3652, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3617, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3453, +3944, 0, 3345, +3944, 0, 3142, +3944, 0, 2505, +3944, 0, 0, +3944, 0, 0, +3944, 3270, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3800, +4076, 0, 3797, +4076, 0, 3794, +4076, 0, 3790, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3764, +4076, 0, 3748, +4076, 0, 3727, +4076, 0, 3696, +4076, 0, 3652, +4076, 0, 3585, +4076, 0, 3476, +4076, 0, 3273, +4076, 0, 2632, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3405, +4095, 0, 2765, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 545, 750, +0, 613, 750, +0, 689, 750, +0, 750, 723, +0, 750, 587, +0, 750, 304, +0, 888, 0, +0, 1025, 0, +397, 1160, 0, +717, 1295, 0, +951, 1429, 0, +1148, 1563, 0, +1322, 1696, 0, +1484, 1828, 0, +1636, 1961, 0, +1783, 2094, 0, +1926, 2226, 0, +2066, 2358, 0, +2204, 2491, 0, +2341, 2623, 0, +2476, 2755, 0, +2611, 2887, 0, +2744, 3019, 0, +2878, 3152, 0, +3011, 3284, 0, +3144, 3416, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 467, 750, +0, 559, 741, +0, 644, 741, +0, 738, 741, +0, 741, 616, +0, 741, 356, +0, 882, 0, +81, 1020, 0, +503, 1157, 0, +772, 1292, 0, +985, 1427, 0, +1170, 1561, 0, +1337, 1695, 0, +1494, 1828, 0, +1644, 1961, 0, +1789, 2093, 0, +1930, 2226, 0, +2069, 2358, 0, +2206, 2491, 0, +2342, 2623, 0, +2477, 2755, 0, +2612, 2887, 0, +2745, 3019, 0, +2878, 3152, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 334, 750, +0, 453, 741, +34, 576, 730, +34, 683, 730, +34, 730, 652, +34, 730, 418, +0, 873, 0, +323, 1014, 0, +614, 1152, 0, +837, 1289, 0, +1027, 1424, 0, +1198, 1559, 0, +1357, 1693, 0, +1508, 1827, 0, +1654, 1960, 0, +1796, 2093, 0, +1936, 2225, 0, +2073, 2358, 0, +2209, 2490, 0, +2345, 2623, 0, +2479, 2755, 0, +2613, 2887, 0, +2746, 3019, 0, +2879, 3152, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 59, 750, +0, 258, 741, +34, 435, 730, +280, 598, 714, +280, 714, 696, +280, 714, 490, +264, 862, 166, +523, 1005, 0, +730, 1146, 0, +911, 1284, 0, +1077, 1421, 0, +1233, 1557, 0, +1382, 1691, 0, +1526, 1825, 0, +1667, 1959, 0, +1806, 2092, 0, +1943, 2225, 0, +2078, 2357, 0, +2213, 2490, 0, +2347, 2622, 0, +2481, 2755, 0, +2614, 2887, 0, +2747, 3019, 0, +2880, 3151, 0, +3012, 3283, 0, +3145, 3416, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 750, +0, 0, 741, +34, 132, 730, +280, 409, 714, +482, 625, 691, +482, 691, 570, +541, 846, 412, +699, 994, 298, +850, 1137, 80, +995, 1278, 0, +1137, 1416, 0, +1276, 1553, 0, +1413, 1689, 0, +1549, 1823, 0, +1684, 1958, 0, +1819, 2091, 0, +1952, 2224, 0, +2086, 2357, 0, +2219, 2489, 0, +2351, 2622, 0, +2484, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3151, 0, +3013, 3283, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +304, 0, 750, +356, 0, 741, +418, 34, 730, +490, 280, 714, +570, 482, 691, +660, 660, 660, +758, 824, 614, +862, 978, 544, +972, 1126, 430, +1087, 1270, 212, +1206, 1410, 0, +1328, 1549, 0, +1452, 1685, 0, +1579, 1821, 0, +1706, 1956, 0, +1835, 2089, 0, +1965, 2223, 0, +2095, 2356, 0, +2226, 2489, 0, +2356, 2621, 0, +2488, 2754, 0, +2619, 2887, 0, +2751, 3019, 0, +2883, 3151, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +697, 0, 888, +719, 0, 882, +749, 0, 873, +784, 166, 862, +828, 412, 846, +824, 614, 758, +824, 702, 614, +978, 960, 544, +1079, 1126, 430, +1172, 1270, 212, +1273, 1410, 0, +1380, 1549, 0, +1492, 1685, 0, +1609, 1821, 0, +1730, 1956, 0, +1853, 2089, 0, +1978, 2223, 0, +2105, 2356, 0, +2233, 2489, 0, +2362, 2621, 0, +2492, 2754, 0, +2623, 2887, 0, +2753, 3019, 0, +2885, 3151, 0, +3016, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +957, 0, 1025, +970, 0, 1020, +987, 0, 1014, +1005, 0, 1002, +994, 298, 947, +978, 544, 862, +978, 544, 673, +978, 754, 544, +1126, 1049, 430, +1266, 1270, 212, +1350, 1410, 0, +1442, 1549, 0, +1541, 1685, 0, +1648, 1821, 0, +1759, 1956, 0, +1875, 2089, 0, +1995, 2223, 0, +2118, 2356, 0, +2243, 2489, 0, +2370, 2621, 0, +2498, 2754, 0, +2627, 2887, 0, +2756, 3019, 0, +2887, 3151, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 1154, +1157, 0, 1139, +1152, 0, 1117, +1146, 0, 1086, +1137, 80, 1040, +1126, 430, 972, +1126, 430, 831, +1126, 430, 529, +1126, 814, 430, +1270, 1145, 212, +1410, 1383, 0, +1513, 1549, 0, +1599, 1685, 0, +1694, 1821, 0, +1796, 1956, 0, +1904, 2089, 0, +2018, 2223, 0, +2135, 2356, 0, +2256, 2489, 0, +2380, 2621, 0, +2505, 2754, 0, +2632, 2887, 0, +2761, 3019, 0, +2890, 3151, 0, +3020, 3283, 0, +3151, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3939, 4095, 0, +1295, 0, 1234, +1292, 0, 1221, +1289, 0, 1203, +1284, 0, 1177, +1278, 0, 1141, +1270, 212, 1087, +1270, 212, 982, +1270, 212, 787, +1270, 212, 214, +1270, 884, 212, +1410, 1248, 0, +1549, 1499, 0, +1667, 1685, 0, +1750, 1821, 0, +1841, 1956, 0, +1940, 2089, 0, +2046, 2223, 0, +2157, 2356, 0, +2273, 2489, 0, +2393, 2621, 0, +2515, 2754, 0, +2640, 2887, 0, +2766, 3019, 0, +2895, 3151, 0, +3023, 3283, 0, +3153, 3416, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1323, +1427, 0, 1313, +1424, 0, 1298, +1421, 0, 1277, +1416, 0, 1248, +1410, 0, 1206, +1410, 0, 1127, +1410, 0, 994, +1410, 0, 719, +1410, 47, 0, +1410, 964, 0, +1549, 1358, 0, +1685, 1618, 0, +1815, 1821, 0, +1895, 1956, 0, +1984, 2089, 0, +2081, 2223, 0, +2185, 2356, 0, +2294, 2489, 0, +2409, 2621, 0, +2528, 2754, 0, +2650, 2887, 0, +2774, 3019, 0, +2900, 3151, 0, +3027, 3283, 0, +3156, 3416, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3677, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1421, +1561, 0, 1412, +1559, 0, 1400, +1557, 0, 1384, +1553, 0, 1360, +1549, 0, 1328, +1549, 0, 1269, +1549, 0, 1176, +1549, 0, 1011, +1549, 0, 611, +1549, 0, 0, +1549, 1053, 0, +1685, 1471, 0, +1821, 1740, 0, +1956, 1953, 0, +2037, 2089, 0, +2124, 2223, 0, +2219, 2356, 0, +2322, 2489, 0, +2431, 2621, 0, +2545, 2754, 0, +2662, 2887, 0, +2784, 3019, 0, +2907, 3151, 0, +3033, 3283, 0, +3160, 3416, 0, +3289, 3548, 0, +3418, 3680, 0, +3548, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1524, +1695, 0, 1517, +1693, 0, 1508, +1691, 0, 1495, +1689, 0, 1477, +1685, 0, 1452, +1685, 0, 1408, +1685, 0, 1341, +1685, 0, 1233, +1685, 0, 1031, +1685, 0, 406, +1685, 0, 0, +1685, 1149, 0, +1821, 1590, 0, +1956, 1865, 0, +2089, 2080, 0, +2176, 2223, 0, +2262, 2356, 0, +2356, 2489, 0, +2458, 2621, 0, +2566, 2754, 0, +2679, 2887, 0, +2796, 3019, 0, +2917, 3151, 0, +3040, 3283, 0, +3166, 3416, 0, +3293, 3548, 0, +3421, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1634, +1828, 0, 1629, +1827, 0, 1621, +1825, 0, 1611, +1823, 0, 1598, +1821, 0, 1579, +1821, 0, 1545, +1821, 0, 1497, +1821, 0, 1423, +1821, 0, 1301, +1821, 0, 1059, +1821, 0, 0, +1821, 0, 0, +1821, 1253, 0, +1956, 1711, 0, +2089, 1991, 0, +2223, 2208, 0, +2313, 2356, 0, +2398, 2489, 0, +2492, 2621, 0, +2593, 2754, 0, +2700, 2887, 0, +2813, 3019, 0, +2930, 3151, 0, +3050, 3283, 0, +3173, 3416, 0, +3299, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1749, +1961, 0, 1745, +1960, 0, 1739, +1959, 0, 1731, +1958, 0, 1721, +1956, 0, 1706, +1956, 0, 1681, +1956, 0, 1646, +1956, 0, 1594, +1956, 0, 1514, +1956, 0, 1378, +1956, 0, 1091, +1956, 0, 0, +1956, 0, 0, +1956, 1362, 0, +2089, 1835, 0, +2223, 2118, 0, +2356, 2338, 0, +2449, 2489, 0, +2533, 2621, 0, +2627, 2754, 0, +2727, 2887, 0, +2834, 3019, 0, +2946, 3151, 0, +3062, 3283, 0, +3183, 3416, 0, +3306, 3548, 0, +3431, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1867, +2093, 0, 1864, +2093, 0, 1860, +2092, 0, 1854, +2091, 0, 1846, +2089, 0, 1835, +2089, 0, 1816, +2089, 0, 1790, +2089, 0, 1753, +2089, 0, 1698, +2089, 0, 1612, +2089, 0, 1463, +2089, 0, 1133, +2089, 0, 0, +2089, 0, 0, +2089, 1476, 0, +2223, 1961, 0, +2356, 2247, 0, +2489, 2468, 0, +2584, 2621, 0, +2668, 2754, 0, +2761, 2887, 0, +2860, 3019, 0, +2967, 3151, 0, +3079, 3283, 0, +3196, 3416, 0, +3316, 3548, 0, +3438, 3680, 0, +3564, 3812, 0, +3690, 3944, 0, +3818, 4076, 0, +3948, 4095, 0, +2226, 0, 1989, +2226, 0, 1987, +2225, 0, 1983, +2225, 0, 1979, +2224, 0, 1973, +2223, 0, 1965, +2223, 0, 1951, +2223, 0, 1931, +2223, 0, 1904, +2223, 0, 1865, +2223, 0, 1808, +2223, 0, 1717, +2223, 0, 1557, +2223, 0, 1181, +2223, 0, 0, +2223, 0, 0, +2223, 1595, 0, +2356, 2088, 0, +2489, 2377, 0, +2621, 2598, 0, +2718, 2754, 0, +2802, 2887, 0, +2894, 3019, 0, +2994, 3151, 0, +3100, 3283, 0, +3212, 3416, 0, +3328, 3548, 0, +3448, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3822, 4076, 0, +3951, 4095, 0, +2358, 0, 2113, +2358, 0, 2111, +2358, 0, 2109, +2357, 0, 2105, +2357, 0, 2101, +2356, 0, 2095, +2356, 0, 2084, +2356, 0, 2070, +2356, 0, 2050, +2356, 0, 2022, +2356, 0, 1982, +2356, 0, 1922, +2356, 0, 1828, +2356, 0, 1659, +2356, 0, 1240, +2356, 0, 0, +2356, 0, 0, +2356, 1716, 0, +2489, 2218, 0, +2621, 2507, 0, +2754, 2730, 0, +2852, 2887, 0, +2935, 3019, 0, +3027, 3151, 0, +3127, 3283, 0, +3233, 3416, 0, +3344, 3548, 0, +3461, 3680, 0, +3581, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2239, +2491, 0, 2238, +2490, 0, 2236, +2490, 0, 2234, +2489, 0, 2230, +2489, 0, 2226, +2489, 0, 2218, +2489, 0, 2207, +2489, 0, 2193, +2489, 0, 2172, +2489, 0, 2144, +2489, 0, 2103, +2489, 0, 2041, +2489, 0, 1943, +2489, 0, 1767, +2489, 0, 1310, +2489, 0, 0, +2489, 0, 0, +2489, 1840, 0, +2621, 2346, 0, +2754, 2638, 0, +2887, 2861, 0, +2985, 3019, 0, +3068, 3151, 0, +3160, 3283, 0, +3259, 3416, 0, +3365, 3548, 0, +3477, 3680, 0, +3593, 3812, 0, +3713, 3944, 0, +3835, 4076, 0, +3961, 4095, 0, +2623, 0, 2367, +2623, 0, 2366, +2623, 0, 2364, +2622, 0, 2362, +2622, 0, 2360, +2621, 0, 2356, +2621, 0, 2351, +2621, 0, 2343, +2621, 0, 2332, +2621, 0, 2317, +2621, 0, 2297, +2621, 0, 2268, +2621, 0, 2226, +2621, 0, 2163, +2621, 0, 2062, +2621, 0, 1880, +2621, 0, 1387, +2621, 0, 0, +2621, 0, 0, +2621, 1966, 0, +2754, 2477, 0, +2887, 2769, 0, +3019, 2992, 0, +3118, 3151, 0, +3201, 3283, 0, +3293, 3416, 0, +3392, 3548, 0, +3498, 3680, 0, +3609, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2496, +2755, 0, 2495, +2755, 0, 2494, +2755, 0, 2492, +2755, 0, 2490, +2754, 0, 2488, +2754, 0, 2484, +2754, 0, 2478, +2754, 0, 2470, +2754, 0, 2459, +2754, 0, 2444, +2754, 0, 2423, +2754, 0, 2394, +2754, 0, 2351, +2754, 0, 2287, +2754, 0, 2185, +2754, 0, 1997, +2754, 0, 1476, +2754, 0, 0, +2754, 0, 0, +2754, 2094, 0, +2887, 2607, 0, +3019, 2900, 0, +3151, 3124, 0, +3251, 3283, 0, +3334, 3416, 0, +3425, 3548, 0, +3525, 3680, 0, +3630, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3977, 4095, 0, +2887, 0, 2625, +2887, 0, 2625, +2887, 0, 2624, +2887, 0, 2623, +2887, 0, 2621, +2887, 0, 2619, +2887, 0, 2616, +2887, 0, 2612, +2887, 0, 2606, +2887, 0, 2598, +2887, 0, 2587, +2887, 0, 2572, +2887, 0, 2551, +2887, 0, 2521, +2887, 0, 2478, +2887, 0, 2413, +2887, 0, 2310, +2887, 0, 2118, +2887, 0, 1569, +2887, 0, 0, +2887, 0, 0, +2887, 2223, 0, +3019, 2738, 0, +3151, 3032, 0, +3283, 3255, 0, +3384, 3416, 0, +3466, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2755, +3019, 0, 2755, +3019, 0, 2754, +3019, 0, 2753, +3019, 0, 2752, +3019, 0, 2751, +3019, 0, 2748, +3019, 0, 2745, +3019, 0, 2741, +3019, 0, 2735, +3019, 0, 2727, +3019, 0, 2716, +3019, 0, 2701, +3019, 0, 2679, +3019, 0, 2649, +3019, 0, 2606, +3019, 0, 2541, +3019, 0, 2435, +3019, 0, 2241, +3019, 0, 1670, +3019, 0, 0, +3019, 0, 0, +3019, 2352, 0, +3151, 2870, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2886, +3152, 0, 2886, +3152, 0, 2885, +3151, 0, 2885, +3151, 0, 2884, +3151, 0, 2883, +3151, 0, 2881, +3151, 0, 2879, +3151, 0, 2875, +3151, 0, 2871, +3151, 0, 2865, +3151, 0, 2857, +3151, 0, 2845, +3151, 0, 2830, +3151, 0, 2809, +3151, 0, 2779, +3151, 0, 2735, +3151, 0, 2670, +3151, 0, 2564, +3151, 0, 2367, +3151, 0, 1779, +3151, 0, 0, +3151, 0, 0, +3151, 2482, 0, +3283, 3000, 0, +3416, 3295, 0, +3548, 3519, 0, +3648, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3017, +3283, 0, 3017, +3283, 0, 3016, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3011, +3283, 0, 3009, +3283, 0, 3005, +3283, 0, 3001, +3283, 0, 2995, +3283, 0, 2987, +3283, 0, 2976, +3283, 0, 2960, +3283, 0, 2939, +3283, 0, 2909, +3283, 0, 2865, +3283, 0, 2799, +3283, 0, 2692, +3283, 0, 2493, +3283, 0, 1890, +3283, 0, 0, +3283, 0, 0, +3283, 2613, 0, +3416, 3133, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4054, 4095, 0, +3416, 0, 3148, +3416, 0, 3148, +3416, 0, 3148, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3142, +3416, 0, 3140, +3416, 0, 3136, +3416, 0, 3132, +3416, 0, 3126, +3416, 0, 3118, +3416, 0, 3106, +3416, 0, 3091, +3416, 0, 3070, +3416, 0, 3039, +3416, 0, 2996, +3416, 0, 2929, +3416, 0, 2822, +3416, 0, 2621, +3416, 0, 2011, +3416, 0, 0, +3416, 0, 0, +3416, 2744, 0, +3548, 3265, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3271, +3548, 0, 3268, +3548, 0, 3263, +3548, 0, 3257, +3548, 0, 3249, +3548, 0, 3238, +3548, 0, 3222, +3548, 0, 3201, +3548, 0, 3171, +3548, 0, 3126, +3548, 0, 3060, +3548, 0, 2952, +3548, 0, 2751, +3548, 0, 2130, +3548, 0, 0, +3548, 0, 0, +3548, 2875, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3405, +3680, 0, 3402, +3680, 0, 3399, +3680, 0, 3395, +3680, 0, 3388, +3680, 0, 3380, +3680, 0, 3369, +3680, 0, 3354, +3680, 0, 3332, +3680, 0, 3302, +3680, 0, 3258, +3680, 0, 3191, +3680, 0, 3083, +3680, 0, 2881, +3680, 0, 2257, +3680, 0, 0, +3680, 0, 0, +3680, 3006, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3537, +3812, 0, 3534, +3812, 0, 3531, +3812, 0, 3526, +3812, 0, 3520, +3812, 0, 3512, +3812, 0, 3501, +3812, 0, 3485, +3812, 0, 3464, +3812, 0, 3433, +3812, 0, 3389, +3812, 0, 3322, +3812, 0, 3214, +3812, 0, 3012, +3812, 0, 2382, +3812, 0, 0, +3812, 0, 0, +3812, 3138, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3668, +3944, 0, 3666, +3944, 0, 3662, +3944, 0, 3658, +3944, 0, 3652, +3944, 0, 3644, +3944, 0, 3632, +3944, 0, 3617, +3944, 0, 3595, +3944, 0, 3565, +3944, 0, 3521, +3944, 0, 3454, +3944, 0, 3346, +3944, 0, 3143, +3944, 0, 2508, +3944, 0, 0, +3944, 0, 0, +3944, 3270, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3802, +4076, 0, 3800, +4076, 0, 3797, +4076, 0, 3794, +4076, 0, 3790, +4076, 0, 3784, +4076, 0, 3775, +4076, 0, 3764, +4076, 0, 3749, +4076, 0, 3727, +4076, 0, 3696, +4076, 0, 3652, +4076, 0, 3585, +4076, 0, 3477, +4076, 0, 3273, +4076, 0, 2635, +4076, 0, 0, +4076, 0, 0, +4076, 3402, 0, +4095, 3925, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3922, +4095, 0, 3916, +4095, 0, 3908, +4095, 0, 3896, +4095, 0, 3881, +4095, 0, 3859, +4095, 0, 3829, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3609, +4095, 0, 3405, +4095, 0, 2767, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 667, 888, +0, 719, 888, +0, 781, 888, +0, 852, 888, +0, 888, 838, +0, 888, 697, +0, 888, 392, +0, 1025, 0, +0, 1160, 0, +431, 1295, 0, +803, 1429, 0, +1057, 1563, 0, +1262, 1696, 0, +1442, 1828, 0, +1607, 1961, 0, +1763, 2094, 0, +1911, 2226, 0, +2055, 2358, 0, +2196, 2491, 0, +2335, 2623, 0, +2472, 2755, 0, +2607, 2887, 0, +2742, 3019, 0, +2876, 3152, 0, +3009, 3284, 0, +3143, 3416, 0, +3276, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 608, 888, +0, 678, 882, +0, 745, 882, +0, 822, 882, +0, 882, 855, +0, 882, 719, +0, 882, 436, +0, 1020, 0, +0, 1157, 0, +529, 1292, 0, +849, 1427, 0, +1084, 1561, 0, +1279, 1695, 0, +1454, 1828, 0, +1615, 1961, 0, +1768, 2093, 0, +1915, 2226, 0, +2058, 2358, 0, +2199, 2491, 0, +2336, 2623, 0, +2473, 2755, 0, +2608, 2887, 0, +2742, 3019, 0, +2877, 3152, 0, +3010, 3283, 0, +3143, 3416, 0, +3276, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 515, 888, +0, 599, 882, +0, 691, 873, +0, 776, 873, +0, 870, 873, +0, 873, 749, +0, 873, 488, +0, 1014, 0, +214, 1152, 0, +635, 1289, 0, +904, 1424, 0, +1118, 1559, 0, +1302, 1693, 0, +1469, 1827, 0, +1626, 1960, 0, +1776, 2093, 0, +1921, 2225, 0, +2062, 2358, 0, +2202, 2490, 0, +2338, 2623, 0, +2475, 2755, 0, +2609, 2887, 0, +2743, 3019, 0, +2877, 3152, 0, +3010, 3283, 0, +3143, 3416, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 350, 888, +0, 466, 882, +0, 585, 873, +166, 708, 862, +166, 815, 862, +166, 862, 784, +166, 862, 550, +0, 1005, 0, +455, 1146, 0, +746, 1284, 0, +969, 1421, 0, +1159, 1557, 0, +1330, 1691, 0, +1489, 1825, 0, +1640, 1959, 0, +1786, 2092, 0, +1928, 2225, 0, +2068, 2357, 0, +2206, 2490, 0, +2341, 2622, 0, +2477, 2755, 0, +2611, 2887, 0, +2745, 3019, 0, +2878, 3151, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 888, +0, 190, 882, +0, 390, 873, +166, 567, 862, +412, 730, 846, +412, 846, 828, +412, 846, 622, +397, 994, 298, +655, 1137, 80, +862, 1278, 0, +1043, 1416, 0, +1209, 1553, 0, +1365, 1689, 0, +1514, 1823, 0, +1658, 1958, 0, +1799, 2091, 0, +1938, 2224, 0, +2075, 2357, 0, +2211, 2489, 0, +2346, 2622, 0, +2480, 2755, 0, +2613, 2887, 0, +2746, 3019, 0, +2879, 3151, 0, +3012, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 888, +0, 0, 882, +0, 0, 873, +166, 264, 862, +412, 541, 846, +614, 758, 824, +614, 824, 702, +673, 978, 544, +831, 1126, 430, +982, 1270, 212, +1127, 1410, 0, +1269, 1549, 0, +1408, 1685, 0, +1545, 1821, 0, +1681, 1956, 0, +1816, 2089, 0, +1951, 2223, 0, +2084, 2356, 0, +2218, 2489, 0, +2351, 2621, 0, +2484, 2754, 0, +2616, 2887, 0, +2748, 3019, 0, +2881, 3151, 0, +3013, 3283, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +392, 0, 888, +436, 0, 882, +488, 0, 873, +550, 166, 862, +622, 412, 846, +702, 614, 824, +792, 792, 792, +890, 956, 746, +994, 1110, 676, +1104, 1258, 562, +1219, 1402, 344, +1338, 1543, 0, +1460, 1681, 0, +1585, 1817, 0, +1711, 1953, 0, +1838, 2087, 0, +1967, 2221, 0, +2096, 2355, 0, +2227, 2488, 0, +2357, 2621, 0, +2489, 2754, 0, +2620, 2886, 0, +2751, 3018, 0, +2883, 3151, 0, +3015, 3283, 0, +3147, 3415, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +811, 0, 1025, +829, 0, 1020, +852, 0, 1014, +881, 0, 1005, +917, 298, 994, +960, 544, 978, +956, 746, 890, +956, 834, 746, +1110, 1092, 676, +1211, 1258, 562, +1304, 1402, 344, +1405, 1543, 0, +1512, 1681, 0, +1625, 1817, 0, +1742, 1953, 0, +1862, 2087, 0, +1985, 2221, 0, +2110, 2355, 0, +2237, 2488, 0, +2365, 2621, 0, +2494, 2754, 0, +2624, 2886, 0, +2754, 3018, 0, +2885, 3151, 0, +3016, 3283, 0, +3148, 3415, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1079, 0, 1160, +1089, 0, 1157, +1102, 0, 1152, +1119, 0, 1146, +1137, 80, 1134, +1126, 430, 1079, +1110, 676, 994, +1110, 676, 805, +1110, 886, 676, +1258, 1181, 562, +1398, 1402, 344, +1482, 1543, 0, +1574, 1681, 0, +1673, 1817, 0, +1779, 1953, 0, +1891, 2087, 0, +2008, 2221, 0, +2127, 2355, 0, +2250, 2488, 0, +2375, 2621, 0, +2502, 2754, 0, +2630, 2886, 0, +2759, 3018, 0, +2889, 3151, 0, +3019, 3283, 0, +3150, 3415, 0, +3281, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1292, 0, 1295, +1292, 0, 1286, +1289, 0, 1271, +1284, 0, 1249, +1278, 0, 1218, +1270, 212, 1172, +1258, 562, 1104, +1258, 562, 963, +1258, 562, 661, +1258, 946, 562, +1402, 1277, 344, +1543, 1516, 0, +1645, 1681, 0, +1732, 1817, 0, +1826, 1953, 0, +1928, 2087, 0, +2036, 2221, 0, +2150, 2355, 0, +2267, 2488, 0, +2388, 2621, 0, +2512, 2754, 0, +2637, 2886, 0, +2764, 3018, 0, +2893, 3151, 0, +3022, 3283, 0, +3152, 3415, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1376, +1427, 0, 1366, +1424, 0, 1353, +1421, 0, 1335, +1416, 0, 1310, +1410, 0, 1273, +1402, 344, 1219, +1402, 344, 1114, +1402, 344, 919, +1402, 344, 345, +1402, 1017, 344, +1543, 1381, 0, +1681, 1631, 0, +1799, 1817, 0, +1882, 1953, 0, +1973, 2087, 0, +2072, 2221, 0, +2178, 2355, 0, +2289, 2488, 0, +2405, 2621, 0, +2525, 2754, 0, +2647, 2886, 0, +2772, 3018, 0, +2898, 3151, 0, +3026, 3283, 0, +3155, 3415, 0, +3285, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1563, 0, 1463, +1561, 0, 1456, +1559, 0, 1445, +1557, 0, 1430, +1553, 0, 1409, +1549, 0, 1380, +1543, 0, 1338, +1543, 0, 1259, +1543, 0, 1127, +1543, 0, 852, +1543, 172, 0, +1543, 1096, 0, +1681, 1489, 0, +1817, 1750, 0, +1947, 1953, 0, +2027, 2087, 0, +2116, 2221, 0, +2213, 2355, 0, +2317, 2488, 0, +2427, 2621, 0, +2541, 2754, 0, +2660, 2886, 0, +2782, 3018, 0, +2906, 3151, 0, +3032, 3283, 0, +3160, 3415, 0, +3288, 3548, 0, +3418, 3680, 0, +3548, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1559, +1695, 0, 1552, +1693, 0, 1544, +1691, 0, 1532, +1689, 0, 1515, +1685, 0, 1492, +1681, 0, 1460, +1681, 0, 1401, +1681, 0, 1308, +1681, 0, 1142, +1681, 0, 742, +1681, 0, 0, +1681, 1184, 0, +1817, 1604, 0, +1953, 1872, 0, +2087, 2085, 0, +2169, 2221, 0, +2256, 2355, 0, +2352, 2488, 0, +2454, 2621, 0, +2563, 2754, 0, +2677, 2886, 0, +2794, 3018, 0, +2916, 3151, 0, +3039, 3283, 0, +3165, 3415, 0, +3292, 3548, 0, +3421, 3680, 0, +3550, 3812, 0, +3680, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1661, +1828, 0, 1656, +1827, 0, 1650, +1825, 0, 1640, +1823, 0, 1627, +1821, 0, 1609, +1817, 0, 1585, +1817, 0, 1540, +1817, 0, 1474, +1817, 0, 1366, +1817, 0, 1164, +1817, 0, 536, +1817, 0, 0, +1817, 1281, 0, +1953, 1722, 0, +2087, 1996, 0, +2221, 2212, 0, +2308, 2355, 0, +2394, 2488, 0, +2488, 2621, 0, +2590, 2754, 0, +2698, 2886, 0, +2811, 3018, 0, +2928, 3151, 0, +3049, 3283, 0, +3173, 3415, 0, +3298, 3548, 0, +3425, 3680, 0, +3553, 3812, 0, +3683, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1770, +1961, 0, 1766, +1960, 0, 1761, +1959, 0, 1754, +1958, 0, 1743, +1956, 0, 1730, +1953, 0, 1711, +1953, 0, 1678, +1953, 0, 1629, +1953, 0, 1555, +1953, 0, 1433, +1953, 0, 1190, +1953, 0, 0, +1953, 0, 0, +1953, 1385, 0, +2087, 1843, 0, +2221, 2123, 0, +2355, 2340, 0, +2445, 2488, 0, +2530, 2621, 0, +2624, 2754, 0, +2725, 2886, 0, +2832, 3018, 0, +2945, 3151, 0, +3062, 3283, 0, +3182, 3415, 0, +3305, 3548, 0, +3431, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1884, +2093, 0, 1881, +2093, 0, 1877, +2092, 0, 1871, +2091, 0, 1863, +2089, 0, 1853, +2087, 0, 1838, +2087, 0, 1813, +2087, 0, 1778, +2087, 0, 1726, +2087, 0, 1646, +2087, 0, 1509, +2087, 0, 1224, +2087, 0, 0, +2087, 0, 0, +2087, 1494, 0, +2221, 1967, 0, +2355, 2251, 0, +2488, 2470, 0, +2581, 2621, 0, +2666, 2754, 0, +2759, 2886, 0, +2859, 3018, 0, +2966, 3151, 0, +3078, 3283, 0, +3195, 3415, 0, +3315, 3548, 0, +3438, 3680, 0, +3563, 3812, 0, +3690, 3944, 0, +3818, 4076, 0, +3947, 4095, 0, +2226, 0, 2002, +2226, 0, 1999, +2225, 0, 1996, +2225, 0, 1992, +2224, 0, 1986, +2223, 0, 1978, +2221, 0, 1967, +2221, 0, 1948, +2221, 0, 1922, +2221, 0, 1885, +2221, 0, 1830, +2221, 0, 1744, +2221, 0, 1596, +2221, 0, 1264, +2221, 0, 0, +2221, 0, 0, +2221, 1608, 0, +2355, 2093, 0, +2488, 2379, 0, +2621, 2600, 0, +2716, 2754, 0, +2800, 2886, 0, +2892, 3018, 0, +2993, 3151, 0, +3099, 3283, 0, +3211, 3415, 0, +3328, 3548, 0, +3448, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3822, 4076, 0, +3951, 4095, 0, +2358, 0, 2123, +2358, 0, 2121, +2358, 0, 2119, +2357, 0, 2115, +2357, 0, 2111, +2356, 0, 2105, +2355, 0, 2096, +2355, 0, 2083, +2355, 0, 2063, +2355, 0, 2037, +2355, 0, 1998, +2355, 0, 1940, +2355, 0, 1849, +2355, 0, 1689, +2355, 0, 1313, +2355, 0, 0, +2355, 0, 0, +2355, 1727, 0, +2488, 2221, 0, +2621, 2509, 0, +2754, 2731, 0, +2850, 2886, 0, +2934, 3018, 0, +3026, 3151, 0, +3126, 3283, 0, +3232, 3415, 0, +3344, 3548, 0, +3460, 3680, 0, +3580, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2247, +2491, 0, 2245, +2490, 0, 2243, +2490, 0, 2241, +2489, 0, 2238, +2489, 0, 2233, +2488, 0, 2227, +2488, 0, 2217, +2488, 0, 2202, +2488, 0, 2183, +2488, 0, 2155, +2488, 0, 2115, +2488, 0, 2055, +2488, 0, 1960, +2488, 0, 1791, +2488, 0, 1373, +2488, 0, 0, +2488, 0, 0, +2488, 1848, 0, +2621, 2349, 0, +2754, 2640, 0, +2886, 2862, 0, +2984, 3018, 0, +3067, 3151, 0, +3159, 3283, 0, +3259, 3415, 0, +3365, 3548, 0, +3477, 3680, 0, +3593, 3812, 0, +3713, 3944, 0, +3835, 4076, 0, +3961, 4095, 0, +2623, 0, 2372, +2623, 0, 2372, +2623, 0, 2370, +2622, 0, 2368, +2622, 0, 2366, +2621, 0, 2362, +2621, 0, 2357, +2621, 0, 2350, +2621, 0, 2339, +2621, 0, 2325, +2621, 0, 2304, +2621, 0, 2276, +2621, 0, 2235, +2621, 0, 2173, +2621, 0, 2075, +2621, 0, 1899, +2621, 0, 1441, +2621, 0, 0, +2621, 0, 0, +2621, 1972, 0, +2754, 2479, 0, +2886, 2770, 0, +3018, 2992, 0, +3117, 3151, 0, +3200, 3283, 0, +3292, 3415, 0, +3392, 3548, 0, +3497, 3680, 0, +3609, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2500, +2755, 0, 2499, +2755, 0, 2498, +2755, 0, 2497, +2755, 0, 2495, +2754, 0, 2492, +2754, 0, 2489, +2754, 0, 2483, +2754, 0, 2475, +2754, 0, 2464, +2754, 0, 2450, +2754, 0, 2429, +2754, 0, 2400, +2754, 0, 2358, +2754, 0, 2295, +2754, 0, 2195, +2754, 0, 2012, +2754, 0, 1521, +2754, 0, 0, +2754, 0, 0, +2754, 2099, 0, +2886, 2609, 0, +3018, 2901, 0, +3151, 3124, 0, +3250, 3283, 0, +3333, 3415, 0, +3425, 3548, 0, +3524, 3680, 0, +3630, 3812, 0, +3741, 3944, 0, +3858, 4076, 0, +3977, 4095, 0, +2887, 0, 2628, +2887, 0, 2628, +2887, 0, 2627, +2887, 0, 2626, +2887, 0, 2625, +2887, 0, 2623, +2886, 0, 2620, +2886, 0, 2616, +2886, 0, 2610, +2886, 0, 2602, +2886, 0, 2591, +2886, 0, 2576, +2886, 0, 2555, +2886, 0, 2526, +2886, 0, 2483, +2886, 0, 2419, +2886, 0, 2317, +2886, 0, 2129, +2886, 0, 1606, +2886, 0, 0, +2886, 0, 0, +2886, 2226, 0, +3018, 2739, 0, +3151, 3032, 0, +3283, 3256, 0, +3383, 3415, 0, +3466, 3548, 0, +3557, 3680, 0, +3657, 3812, 0, +3762, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2758, +3019, 0, 2757, +3019, 0, 2757, +3019, 0, 2756, +3019, 0, 2755, +3019, 0, 2753, +3018, 0, 2751, +3018, 0, 2748, +3018, 0, 2744, +3018, 0, 2738, +3018, 0, 2730, +3018, 0, 2719, +3018, 0, 2703, +3018, 0, 2683, +3018, 0, 2653, +3018, 0, 2610, +3018, 0, 2545, +3018, 0, 2441, +3018, 0, 2249, +3018, 0, 1700, +3018, 0, 0, +3018, 0, 0, +3018, 2354, 0, +3151, 2871, 0, +3283, 3164, 0, +3415, 3387, 0, +3515, 3548, 0, +3598, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2888, +3152, 0, 2888, +3152, 0, 2887, +3151, 0, 2886, +3151, 0, 2886, +3151, 0, 2885, +3151, 0, 2883, +3151, 0, 2881, +3151, 0, 2877, +3151, 0, 2873, +3151, 0, 2867, +3151, 0, 2859, +3151, 0, 2848, +3151, 0, 2833, +3151, 0, 2812, +3151, 0, 2782, +3151, 0, 2738, +3151, 0, 2673, +3151, 0, 2568, +3151, 0, 2373, +3151, 0, 1802, +3151, 0, 0, +3151, 0, 0, +3151, 2484, 0, +3283, 3001, 0, +3415, 3295, 0, +3548, 3519, 0, +3648, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3018, +3283, 0, 3018, +3283, 0, 3018, +3283, 0, 3017, +3283, 0, 3016, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3013, +3283, 0, 3010, +3283, 0, 3007, +3283, 0, 3003, +3283, 0, 2997, +3283, 0, 2988, +3283, 0, 2977, +3283, 0, 2962, +3283, 0, 2941, +3283, 0, 2911, +3283, 0, 2867, +3283, 0, 2801, +3283, 0, 2695, +3283, 0, 2498, +3283, 0, 1908, +3283, 0, 0, +3283, 0, 0, +3283, 2614, 0, +3415, 3133, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4054, 4095, 0, +3416, 0, 3149, +3416, 0, 3149, +3416, 0, 3149, +3416, 0, 3148, +3416, 0, 3148, +3416, 0, 3147, +3415, 0, 3147, +3415, 0, 3145, +3415, 0, 3144, +3415, 0, 3141, +3415, 0, 3138, +3415, 0, 3133, +3415, 0, 3127, +3415, 0, 3119, +3415, 0, 3108, +3415, 0, 3093, +3415, 0, 3071, +3415, 0, 3041, +3415, 0, 2997, +3415, 0, 2931, +3415, 0, 2824, +3415, 0, 2625, +3415, 0, 2026, +3415, 0, 0, +3415, 0, 0, +3415, 2745, 0, +3548, 3265, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3276, +3548, 0, 3274, +3548, 0, 3272, +3548, 0, 3269, +3548, 0, 3264, +3548, 0, 3258, +3548, 0, 3250, +3548, 0, 3239, +3548, 0, 3223, +3548, 0, 3202, +3548, 0, 3172, +3548, 0, 3128, +3548, 0, 3061, +3548, 0, 2954, +3548, 0, 2754, +3548, 0, 2141, +3548, 0, 0, +3548, 0, 0, +3548, 2876, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3407, +3680, 0, 3406, +3680, 0, 3403, +3680, 0, 3400, +3680, 0, 3395, +3680, 0, 3389, +3680, 0, 3381, +3680, 0, 3370, +3680, 0, 3354, +3680, 0, 3333, +3680, 0, 3303, +3680, 0, 3258, +3680, 0, 3192, +3680, 0, 3084, +3680, 0, 2883, +3680, 0, 2266, +3680, 0, 0, +3680, 0, 0, +3680, 3007, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3537, +3812, 0, 3534, +3812, 0, 3531, +3812, 0, 3527, +3812, 0, 3521, +3812, 0, 3513, +3812, 0, 3501, +3812, 0, 3486, +3812, 0, 3464, +3812, 0, 3434, +3812, 0, 3390, +3812, 0, 3323, +3812, 0, 3215, +3812, 0, 3014, +3812, 0, 2389, +3812, 0, 0, +3812, 0, 0, +3812, 3139, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3670, +3944, 0, 3668, +3944, 0, 3666, +3944, 0, 3663, +3944, 0, 3658, +3944, 0, 3652, +3944, 0, 3644, +3944, 0, 3633, +3944, 0, 3617, +3944, 0, 3596, +3944, 0, 3565, +3944, 0, 3521, +3944, 0, 3454, +3944, 0, 3346, +3944, 0, 3144, +3944, 0, 2513, +3944, 0, 0, +3944, 0, 0, +3944, 3270, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3802, +4076, 0, 3800, +4076, 0, 3798, +4076, 0, 3794, +4076, 0, 3790, +4076, 0, 3784, +4076, 0, 3776, +4076, 0, 3764, +4076, 0, 3749, +4076, 0, 3727, +4076, 0, 3697, +4076, 0, 3653, +4076, 0, 3586, +4076, 0, 3477, +4076, 0, 3274, +4076, 0, 2639, +4076, 0, 0, +4076, 0, 0, +4076, 3402, 0, +4095, 3925, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3935, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3930, +4095, 0, 3927, +4095, 0, 3922, +4095, 0, 3916, +4095, 0, 3908, +4095, 0, 3896, +4095, 0, 3881, +4095, 0, 3859, +4095, 0, 3829, +4095, 0, 3784, +4095, 0, 3718, +4095, 0, 3609, +4095, 0, 3406, +4095, 0, 2770, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 792, 1025, +0, 832, 1025, +0, 881, 1025, +0, 939, 1025, +0, 1006, 1025, +0, 1025, 957, +0, 1025, 811, +0, 1025, 488, +0, 1160, 0, +0, 1295, 0, +471, 1429, 0, +897, 1563, 0, +1167, 1696, 0, +1381, 1828, 0, +1565, 1961, 0, +1733, 2094, 0, +1890, 2226, 0, +2040, 2358, 0, +2185, 2491, 0, +2327, 2623, 0, +2466, 2755, 0, +2603, 2887, 0, +2738, 3019, 0, +2873, 3152, 0, +3008, 3284, 0, +3141, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 748, 1025, +0, 800, 1020, +0, 852, 1020, +0, 914, 1020, +0, 985, 1020, +0, 1020, 970, +0, 1020, 829, +0, 1020, 524, +0, 1157, 0, +0, 1292, 0, +562, 1427, 0, +935, 1561, 0, +1188, 1695, 0, +1394, 1828, 0, +1574, 1961, 0, +1739, 2093, 0, +1894, 2226, 0, +2043, 2358, 0, +2187, 2491, 0, +2328, 2623, 0, +2467, 2755, 0, +2604, 2887, 0, +2739, 3019, 0, +2874, 3152, 0, +3008, 3283, 0, +3141, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 681, 1025, +0, 740, 1020, +0, 810, 1014, +0, 877, 1014, +0, 954, 1014, +0, 1014, 987, +0, 1014, 852, +0, 1014, 568, +0, 1152, 0, +9, 1289, 0, +662, 1424, 0, +981, 1559, 0, +1216, 1693, 0, +1412, 1827, 0, +1586, 1960, 0, +1748, 2093, 0, +1900, 2225, 0, +2047, 2358, 0, +2190, 2490, 0, +2331, 2623, 0, +2469, 2755, 0, +2605, 2887, 0, +2740, 3019, 0, +2875, 3152, 0, +3008, 3283, 0, +3142, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 573, 1025, +0, 647, 1020, +0, 731, 1014, +0, 823, 1005, +0, 908, 1005, +0, 1002, 1005, +0, 1005, 881, +0, 1005, 620, +0, 1146, 0, +346, 1284, 0, +767, 1421, 0, +1037, 1557, 0, +1249, 1691, 0, +1434, 1825, 0, +1601, 1959, 0, +1758, 2092, 0, +1908, 2225, 0, +2053, 2357, 0, +2195, 2490, 0, +2334, 2622, 0, +2471, 2755, 0, +2607, 2887, 0, +2741, 3019, 0, +2876, 3151, 0, +3009, 3283, 0, +3142, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 371, 1025, +0, 482, 1020, +0, 598, 1014, +0, 717, 1005, +298, 840, 994, +298, 947, 994, +298, 994, 917, +298, 994, 682, +81, 1137, 80, +587, 1278, 0, +878, 1416, 0, +1102, 1553, 0, +1291, 1689, 0, +1462, 1823, 0, +1621, 1958, 0, +1772, 2091, 0, +1918, 2224, 0, +2060, 2357, 0, +2200, 2489, 0, +2337, 2622, 0, +2474, 2755, 0, +2609, 2887, 0, +2743, 3019, 0, +2877, 3151, 0, +3010, 3283, 0, +3143, 3416, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1025, +0, 81, 1020, +0, 323, 1014, +0, 523, 1005, +298, 699, 994, +544, 862, 978, +544, 978, 960, +544, 978, 754, +529, 1126, 430, +787, 1270, 212, +994, 1410, 0, +1176, 1549, 0, +1341, 1685, 0, +1497, 1821, 0, +1646, 1956, 0, +1790, 2089, 0, +1931, 2223, 0, +2070, 2356, 0, +2207, 2489, 0, +2343, 2621, 0, +2478, 2754, 0, +2612, 2887, 0, +2745, 3019, 0, +2879, 3151, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 1025, +0, 0, 1020, +0, 0, 1014, +0, 0, 1005, +298, 397, 994, +544, 673, 978, +746, 890, 956, +746, 956, 834, +805, 1110, 676, +963, 1258, 562, +1114, 1402, 344, +1259, 1543, 0, +1401, 1681, 0, +1540, 1817, 0, +1678, 1953, 0, +1813, 2087, 0, +1948, 2221, 0, +2083, 2355, 0, +2217, 2488, 0, +2350, 2621, 0, +2483, 2754, 0, +2616, 2886, 0, +2748, 3018, 0, +2881, 3151, 0, +3013, 3283, 0, +3145, 3415, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +488, 0, 1025, +524, 0, 1020, +568, 0, 1014, +620, 0, 1005, +682, 298, 994, +754, 544, 978, +834, 746, 956, +924, 924, 924, +1021, 1088, 878, +1126, 1242, 809, +1236, 1390, 695, +1351, 1534, 476, +1470, 1674, 0, +1592, 1813, 0, +1716, 1950, 0, +1843, 2085, 0, +1970, 2220, 0, +2099, 2353, 0, +2229, 2487, 0, +2359, 2620, 0, +2490, 2753, 0, +2621, 2886, 0, +2752, 3018, 0, +2883, 3151, 0, +3015, 3283, 0, +3147, 3415, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +929, 0, 1160, +943, 0, 1157, +960, 0, 1152, +983, 0, 1146, +1013, 80, 1137, +1049, 430, 1126, +1092, 676, 1110, +1088, 878, 1021, +1088, 967, 878, +1242, 1225, 809, +1343, 1390, 695, +1437, 1534, 476, +1537, 1674, 0, +1644, 1813, 0, +1757, 1950, 0, +1873, 2085, 0, +1994, 2220, 0, +2117, 2353, 0, +2242, 2487, 0, +2369, 2620, 0, +2497, 2753, 0, +2626, 2886, 0, +2756, 3018, 0, +2887, 3151, 0, +3017, 3283, 0, +3149, 3415, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1204, 0, 1295, +1211, 0, 1292, +1221, 0, 1289, +1235, 0, 1284, +1251, 0, 1278, +1270, 212, 1266, +1258, 562, 1211, +1242, 809, 1126, +1242, 809, 938, +1242, 1018, 809, +1390, 1313, 695, +1531, 1534, 476, +1614, 1674, 0, +1706, 1813, 0, +1806, 1950, 0, +1912, 2085, 0, +2023, 2220, 0, +2140, 2353, 0, +2260, 2487, 0, +2382, 2620, 0, +2507, 2753, 0, +2634, 2886, 0, +2762, 3018, 0, +2891, 3151, 0, +3021, 3283, 0, +3151, 3415, 0, +3282, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1419, 0, 1429, +1424, 0, 1427, +1424, 0, 1418, +1421, 0, 1403, +1416, 0, 1381, +1410, 0, 1350, +1402, 344, 1304, +1390, 695, 1236, +1390, 695, 1095, +1390, 695, 793, +1390, 1078, 695, +1534, 1409, 476, +1674, 1648, 0, +1777, 1813, 0, +1864, 1950, 0, +1958, 2085, 0, +2060, 2220, 0, +2168, 2353, 0, +2282, 2487, 0, +2399, 2620, 0, +2521, 2753, 0, +2644, 2886, 0, +2769, 3018, 0, +2896, 3151, 0, +3025, 3283, 0, +3154, 3415, 0, +3284, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1563, 0, 1515, +1561, 0, 1508, +1559, 0, 1499, +1557, 0, 1486, +1553, 0, 1467, +1549, 0, 1442, +1543, 0, 1405, +1534, 476, 1351, +1534, 476, 1246, +1534, 476, 1051, +1534, 476, 479, +1534, 1149, 476, +1674, 1512, 0, +1813, 1763, 0, +1931, 1950, 0, +2014, 2085, 0, +2105, 2220, 0, +2204, 2353, 0, +2310, 2487, 0, +2421, 2620, 0, +2537, 2753, 0, +2657, 2886, 0, +2779, 3018, 0, +2904, 3151, 0, +3031, 3283, 0, +3158, 3415, 0, +3287, 3548, 0, +3417, 3680, 0, +3548, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1696, 0, 1601, +1695, 0, 1596, +1693, 0, 1588, +1691, 0, 1577, +1689, 0, 1562, +1685, 0, 1541, +1681, 0, 1512, +1674, 0, 1470, +1674, 0, 1391, +1674, 0, 1258, +1674, 0, 983, +1674, 313, 0, +1674, 1228, 0, +1813, 1622, 0, +1950, 1882, 0, +2079, 2085, 0, +2159, 2220, 0, +2248, 2353, 0, +2345, 2487, 0, +2449, 2620, 0, +2559, 2753, 0, +2673, 2886, 0, +2792, 3018, 0, +2914, 3151, 0, +3038, 3283, 0, +3164, 3415, 0, +3292, 3548, 0, +3420, 3680, 0, +3550, 3812, 0, +3680, 3944, 0, +3810, 4076, 0, +3942, 4095, 0, +1828, 0, 1696, +1828, 0, 1691, +1827, 0, 1684, +1825, 0, 1676, +1823, 0, 1664, +1821, 0, 1648, +1817, 0, 1625, +1813, 0, 1592, +1813, 0, 1533, +1813, 0, 1440, +1813, 0, 1275, +1813, 0, 874, +1813, 0, 0, +1813, 1317, 0, +1950, 1736, 0, +2085, 2004, 0, +2220, 2217, 0, +2301, 2353, 0, +2388, 2487, 0, +2483, 2620, 0, +2586, 2753, 0, +2695, 2886, 0, +2808, 3018, 0, +2927, 3151, 0, +3047, 3283, 0, +3171, 3415, 0, +3297, 3548, 0, +3425, 3680, 0, +3553, 3812, 0, +3682, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1797, +1961, 0, 1793, +1960, 0, 1789, +1959, 0, 1781, +1958, 0, 1772, +1956, 0, 1759, +1953, 0, 1742, +1950, 0, 1716, +1950, 0, 1672, +1950, 0, 1606, +1950, 0, 1498, +1950, 0, 1295, +1950, 0, 670, +1950, 0, 0, +1950, 1413, 0, +2085, 1854, 0, +2220, 2128, 0, +2353, 2344, 0, +2440, 2487, 0, +2526, 2620, 0, +2620, 2753, 0, +2722, 2886, 0, +2830, 3018, 0, +2943, 3151, 0, +3060, 3283, 0, +3181, 3415, 0, +3305, 3548, 0, +3430, 3680, 0, +3557, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1905, +2093, 0, 1902, +2093, 0, 1898, +2092, 0, 1893, +2091, 0, 1885, +2089, 0, 1875, +2087, 0, 1862, +2085, 0, 1843, +2085, 0, 1810, +2085, 0, 1761, +2085, 0, 1687, +2085, 0, 1565, +2085, 0, 1322, +2085, 0, 10, +2085, 0, 0, +2085, 1517, 0, +2220, 1975, 0, +2353, 2255, 0, +2487, 2473, 0, +2577, 2620, 0, +2662, 2753, 0, +2756, 2886, 0, +2857, 3018, 0, +2964, 3151, 0, +3077, 3283, 0, +3194, 3415, 0, +3314, 3548, 0, +3437, 3680, 0, +3563, 3812, 0, +3690, 3944, 0, +3818, 4076, 0, +3947, 4095, 0, +2226, 0, 2018, +2226, 0, 2016, +2225, 0, 2013, +2225, 0, 2009, +2224, 0, 2003, +2223, 0, 1995, +2221, 0, 1985, +2220, 0, 1970, +2220, 0, 1946, +2220, 0, 1910, +2220, 0, 1858, +2220, 0, 1778, +2220, 0, 1642, +2220, 0, 1355, +2220, 0, 0, +2220, 0, 0, +2220, 1626, 0, +2353, 2099, 0, +2487, 2383, 0, +2620, 2602, 0, +2713, 2753, 0, +2798, 2886, 0, +2890, 3018, 0, +2991, 3151, 0, +3098, 3283, 0, +3210, 3415, 0, +3327, 3548, 0, +3447, 3680, 0, +3570, 3812, 0, +3695, 3944, 0, +3822, 4076, 0, +3950, 4095, 0, +2358, 0, 2136, +2358, 0, 2134, +2358, 0, 2132, +2357, 0, 2128, +2357, 0, 2124, +2356, 0, 2118, +2355, 0, 2110, +2353, 0, 2099, +2353, 0, 2081, +2353, 0, 2054, +2353, 0, 2017, +2353, 0, 1962, +2353, 0, 1876, +2353, 0, 1727, +2353, 0, 1396, +2353, 0, 0, +2353, 0, 0, +2353, 1740, 0, +2487, 2226, 0, +2620, 2511, 0, +2753, 2732, 0, +2848, 2886, 0, +2932, 3018, 0, +3025, 3151, 0, +3125, 3283, 0, +3231, 3415, 0, +3343, 3548, 0, +3460, 3680, 0, +3580, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2256, +2491, 0, 2255, +2490, 0, 2253, +2490, 0, 2251, +2489, 0, 2247, +2489, 0, 2243, +2488, 0, 2237, +2487, 0, 2229, +2487, 0, 2215, +2487, 0, 2196, +2487, 0, 2169, +2487, 0, 2130, +2487, 0, 2072, +2487, 0, 1981, +2487, 0, 1822, +2487, 0, 1446, +2487, 0, 0, +2487, 0, 0, +2487, 1859, 0, +2620, 2352, 0, +2753, 2641, 0, +2886, 2863, 0, +2982, 3018, 0, +3066, 3151, 0, +3158, 3283, 0, +3258, 3415, 0, +3364, 3548, 0, +3476, 3680, 0, +3593, 3812, 0, +3712, 3944, 0, +3835, 4076, 0, +3960, 4095, 0, +2623, 0, 2380, +2623, 0, 2379, +2623, 0, 2378, +2622, 0, 2375, +2622, 0, 2373, +2621, 0, 2370, +2621, 0, 2365, +2620, 0, 2359, +2620, 0, 2348, +2620, 0, 2334, +2620, 0, 2314, +2620, 0, 2287, +2620, 0, 2247, +2620, 0, 2187, +2620, 0, 2092, +2620, 0, 1923, +2620, 0, 1505, +2620, 0, 0, +2620, 0, 0, +2620, 1981, 0, +2753, 2482, 0, +2886, 2772, 0, +3018, 2993, 0, +3116, 3151, 0, +3199, 3283, 0, +3291, 3415, 0, +3391, 3548, 0, +3497, 3680, 0, +3609, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2505, +2755, 0, 2505, +2755, 0, 2504, +2755, 0, 2502, +2755, 0, 2501, +2754, 0, 2498, +2754, 0, 2494, +2753, 0, 2490, +2753, 0, 2482, +2753, 0, 2471, +2753, 0, 2457, +2753, 0, 2437, +2753, 0, 2408, +2753, 0, 2367, +2753, 0, 2305, +2753, 0, 2208, +2753, 0, 2031, +2753, 0, 1575, +2753, 0, 0, +2753, 0, 0, +2753, 2105, 0, +2886, 2611, 0, +3018, 2902, 0, +3151, 3125, 0, +3249, 3283, 0, +3333, 3415, 0, +3424, 3548, 0, +3524, 3680, 0, +3630, 3812, 0, +3741, 3944, 0, +3857, 4076, 0, +3977, 4095, 0, +2887, 0, 2633, +2887, 0, 2632, +2887, 0, 2631, +2887, 0, 2630, +2887, 0, 2629, +2887, 0, 2627, +2886, 0, 2624, +2886, 0, 2621, +2886, 0, 2615, +2886, 0, 2607, +2886, 0, 2596, +2886, 0, 2581, +2886, 0, 2561, +2886, 0, 2532, +2886, 0, 2490, +2886, 0, 2427, +2886, 0, 2327, +2886, 0, 2144, +2886, 0, 1651, +2886, 0, 0, +2886, 0, 0, +2886, 2231, 0, +3018, 2740, 0, +3151, 3033, 0, +3283, 3256, 0, +3382, 3415, 0, +3466, 3548, 0, +3557, 3680, 0, +3656, 3812, 0, +3762, 3944, 0, +3873, 4076, 0, +3990, 4095, 0, +3019, 0, 2761, +3019, 0, 2760, +3019, 0, 2760, +3019, 0, 2759, +3019, 0, 2758, +3019, 0, 2756, +3018, 0, 2754, +3018, 0, 2752, +3018, 0, 2747, +3018, 0, 2742, +3018, 0, 2734, +3018, 0, 2723, +3018, 0, 2708, +3018, 0, 2687, +3018, 0, 2658, +3018, 0, 2615, +3018, 0, 2551, +3018, 0, 2449, +3018, 0, 2261, +3018, 0, 1737, +3018, 0, 0, +3018, 0, 0, +3018, 2358, 0, +3151, 2872, 0, +3283, 3164, 0, +3415, 3388, 0, +3515, 3548, 0, +3598, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2890, +3152, 0, 2890, +3152, 0, 2890, +3151, 0, 2889, +3151, 0, 2888, +3151, 0, 2887, +3151, 0, 2885, +3151, 0, 2883, +3151, 0, 2880, +3151, 0, 2876, +3151, 0, 2870, +3151, 0, 2862, +3151, 0, 2851, +3151, 0, 2836, +3151, 0, 2815, +3151, 0, 2785, +3151, 0, 2742, +3151, 0, 2678, +3151, 0, 2573, +3151, 0, 2382, +3151, 0, 1832, +3151, 0, 0, +3151, 0, 0, +3151, 2487, 0, +3283, 3002, 0, +3415, 3296, 0, +3548, 3520, 0, +3648, 3680, 0, +3730, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3020, +3283, 0, 3020, +3283, 0, 3019, +3283, 0, 3019, +3283, 0, 3018, +3283, 0, 3018, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3013, +3283, 0, 3009, +3283, 0, 3005, +3283, 0, 2999, +3283, 0, 2991, +3283, 0, 2980, +3283, 0, 2965, +3283, 0, 2943, +3283, 0, 2914, +3283, 0, 2870, +3283, 0, 2805, +3283, 0, 2700, +3283, 0, 2504, +3283, 0, 1932, +3283, 0, 0, +3283, 0, 0, +3283, 2616, 0, +3415, 3134, 0, +3548, 3428, 0, +3680, 3652, 0, +3780, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4053, 4095, 0, +3416, 0, 3151, +3416, 0, 3151, +3416, 0, 3150, +3416, 0, 3150, +3416, 0, 3149, +3416, 0, 3149, +3415, 0, 3148, +3415, 0, 3147, +3415, 0, 3145, +3415, 0, 3143, +3415, 0, 3139, +3415, 0, 3135, +3415, 0, 3129, +3415, 0, 3121, +3415, 0, 3110, +3415, 0, 3094, +3415, 0, 3073, +3415, 0, 3043, +3415, 0, 2999, +3415, 0, 2934, +3415, 0, 2827, +3415, 0, 2630, +3415, 0, 2044, +3415, 0, 0, +3415, 0, 0, +3415, 2746, 0, +3548, 3265, 0, +3680, 3559, 0, +3812, 3784, 0, +3912, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3273, +3548, 0, 3270, +3548, 0, 3265, +3548, 0, 3259, +3548, 0, 3251, +3548, 0, 3240, +3548, 0, 3225, +3548, 0, 3203, +3548, 0, 3173, +3548, 0, 3129, +3548, 0, 3063, +3548, 0, 2956, +3548, 0, 2758, +3548, 0, 2156, +3548, 0, 0, +3548, 0, 0, +3548, 2877, 0, +3680, 3397, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3408, +3680, 0, 3406, +3680, 0, 3404, +3680, 0, 3401, +3680, 0, 3396, +3680, 0, 3390, +3680, 0, 3382, +3680, 0, 3371, +3680, 0, 3356, +3680, 0, 3334, +3680, 0, 3304, +3680, 0, 3260, +3680, 0, 3193, +3680, 0, 3086, +3680, 0, 2886, +3680, 0, 2277, +3680, 0, 0, +3680, 0, 0, +3680, 3008, 0, +3812, 3529, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3535, +3812, 0, 3532, +3812, 0, 3528, +3812, 0, 3521, +3812, 0, 3513, +3812, 0, 3502, +3812, 0, 3487, +3812, 0, 3465, +3812, 0, 3435, +3812, 0, 3391, +3812, 0, 3324, +3812, 0, 3216, +3812, 0, 3016, +3812, 0, 2397, +3812, 0, 0, +3812, 0, 0, +3812, 3139, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3666, +3944, 0, 3663, +3944, 0, 3659, +3944, 0, 3653, +3944, 0, 3645, +3944, 0, 3633, +3944, 0, 3618, +3944, 0, 3596, +3944, 0, 3566, +3944, 0, 3522, +3944, 0, 3455, +3944, 0, 3347, +3944, 0, 3145, +3944, 0, 2520, +3944, 0, 0, +3944, 0, 0, +3944, 3271, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3802, +4076, 0, 3801, +4076, 0, 3798, +4076, 0, 3795, +4076, 0, 3790, +4076, 0, 3784, +4076, 0, 3776, +4076, 0, 3765, +4076, 0, 3749, +4076, 0, 3728, +4076, 0, 3697, +4076, 0, 3653, +4076, 0, 3586, +4076, 0, 3478, +4076, 0, 3276, +4076, 0, 2644, +4076, 0, 0, +4076, 0, 0, +4076, 3402, 0, +4095, 3925, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3930, +4095, 0, 3927, +4095, 0, 3922, +4095, 0, 3916, +4095, 0, 3908, +4095, 0, 3897, +4095, 0, 3881, +4095, 0, 3860, +4095, 0, 3829, +4095, 0, 3785, +4095, 0, 3718, +4095, 0, 3610, +4095, 0, 3407, +4095, 0, 2773, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 918, 1160, +0, 949, 1160, +0, 987, 1160, +0, 1033, 1160, +0, 1089, 1160, +0, 1154, 1160, +0, 1160, 1079, +0, 1160, 929, +0, 1160, 592, +0, 1295, 0, +0, 1429, 0, +523, 1563, 0, +998, 1696, 0, +1283, 1828, 0, +1503, 1961, 0, +1691, 2094, 0, +1860, 2226, 0, +2019, 2358, 0, +2170, 2491, 0, +2315, 2623, 0, +2457, 2755, 0, +2597, 2887, 0, +2734, 3019, 0, +2870, 3152, 0, +3005, 3284, 0, +3139, 3416, 0, +3273, 3548, 0, +3406, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 885, 1160, +0, 924, 1157, +0, 964, 1157, +0, 1013, 1157, +0, 1071, 1157, +0, 1139, 1157, +0, 1157, 1089, +0, 1157, 943, +0, 1157, 620, +0, 1292, 0, +0, 1427, 0, +605, 1561, 0, +1029, 1695, 0, +1300, 1828, 0, +1513, 1961, 0, +1698, 2093, 0, +1865, 2226, 0, +2022, 2358, 0, +2172, 2491, 0, +2317, 2623, 0, +2459, 2755, 0, +2598, 2887, 0, +2735, 3019, 0, +2871, 3152, 0, +3005, 3283, 0, +3140, 3416, 0, +3273, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 836, 1160, +0, 879, 1157, +0, 932, 1152, +0, 984, 1152, +0, 1045, 1152, +0, 1117, 1152, +0, 1152, 1102, +0, 1152, 960, +0, 1152, 656, +0, 1289, 0, +0, 1424, 0, +696, 1559, 0, +1067, 1693, 0, +1321, 1827, 0, +1526, 1960, 0, +1706, 2093, 0, +1871, 2225, 0, +2027, 2358, 0, +2175, 2490, 0, +2320, 2623, 0, +2460, 2755, 0, +2599, 2887, 0, +2735, 3019, 0, +2871, 3152, 0, +3006, 3283, 0, +3140, 3416, 0, +3274, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 762, 1160, +0, 813, 1157, +0, 873, 1152, +0, 942, 1146, +0, 1009, 1146, +0, 1086, 1146, +0, 1146, 1119, +0, 1146, 983, +0, 1146, 700, +0, 1284, 0, +141, 1421, 0, +794, 1557, 0, +1113, 1691, 0, +1348, 1825, 0, +1544, 1959, 0, +1718, 2092, 0, +1880, 2225, 0, +2032, 2357, 0, +2180, 2490, 0, +2323, 2622, 0, +2463, 2755, 0, +2601, 2887, 0, +2737, 3019, 0, +2872, 3151, 0, +3007, 3283, 0, +3141, 3416, 0, +3274, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 640, 1160, +0, 705, 1157, +0, 779, 1152, +0, 863, 1146, +80, 955, 1137, +80, 1040, 1137, +80, 1134, 1137, +80, 1137, 1013, +80, 1137, 753, +0, 1278, 0, +478, 1416, 0, +900, 1553, 0, +1169, 1689, 0, +1382, 1823, 0, +1566, 1958, 0, +1733, 2091, 0, +1891, 2224, 0, +2040, 2357, 0, +2185, 2489, 0, +2327, 2622, 0, +2466, 2755, 0, +2603, 2887, 0, +2738, 3019, 0, +2873, 3151, 0, +3008, 3283, 0, +3141, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 397, 1160, +0, 503, 1157, +0, 614, 1152, +0, 730, 1146, +80, 850, 1137, +430, 972, 1126, +430, 1079, 1126, +430, 1126, 1049, +430, 1126, 814, +214, 1270, 212, +719, 1410, 0, +1011, 1549, 0, +1233, 1685, 0, +1423, 1821, 0, +1594, 1956, 0, +1753, 2089, 0, +1904, 2223, 0, +2050, 2356, 0, +2193, 2489, 0, +2332, 2621, 0, +2470, 2754, 0, +2606, 2887, 0, +2741, 3019, 0, +2875, 3151, 0, +3009, 3283, 0, +3142, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1160, +0, 0, 1157, +0, 214, 1152, +0, 455, 1146, +80, 655, 1137, +430, 831, 1126, +676, 994, 1110, +676, 1110, 1092, +676, 1110, 886, +661, 1258, 562, +919, 1402, 344, +1127, 1543, 0, +1308, 1681, 0, +1474, 1817, 0, +1629, 1953, 0, +1778, 2087, 0, +1922, 2221, 0, +2063, 2355, 0, +2202, 2488, 0, +2339, 2621, 0, +2475, 2754, 0, +2610, 2886, 0, +2744, 3018, 0, +2877, 3151, 0, +3010, 3283, 0, +3144, 3415, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1160, +0, 0, 1157, +0, 0, 1152, +0, 0, 1146, +80, 81, 1137, +430, 529, 1126, +676, 805, 1110, +878, 1021, 1088, +878, 1088, 967, +938, 1242, 809, +1095, 1390, 695, +1246, 1534, 476, +1391, 1674, 0, +1533, 1813, 0, +1672, 1950, 0, +1810, 2085, 0, +1946, 2220, 0, +2081, 2353, 0, +2215, 2487, 0, +2348, 2620, 0, +2482, 2753, 0, +2615, 2886, 0, +2747, 3018, 0, +2880, 3151, 0, +3013, 3283, 0, +3145, 3415, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +592, 0, 1160, +620, 0, 1157, +656, 0, 1152, +700, 0, 1146, +753, 80, 1137, +814, 430, 1126, +886, 676, 1110, +967, 878, 1088, +1056, 1056, 1056, +1154, 1220, 1010, +1258, 1374, 940, +1368, 1523, 826, +1483, 1666, 608, +1602, 1807, 0, +1724, 1945, 0, +1849, 2082, 0, +1975, 2217, 0, +2102, 2352, 0, +2231, 2486, 0, +2361, 2619, 0, +2491, 2752, 0, +2622, 2885, 0, +2752, 3018, 0, +2884, 3151, 0, +3015, 3283, 0, +3147, 3415, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1051, 0, 1295, +1062, 0, 1292, +1075, 0, 1289, +1093, 0, 1284, +1116, 0, 1278, +1145, 212, 1270, +1181, 562, 1258, +1225, 809, 1242, +1220, 1010, 1154, +1220, 1099, 1010, +1374, 1357, 940, +1476, 1523, 826, +1569, 1666, 608, +1669, 1807, 0, +1776, 1945, 0, +1889, 2082, 0, +2006, 2217, 0, +2126, 2352, 0, +2249, 2486, 0, +2374, 2619, 0, +2501, 2752, 0, +2629, 2885, 0, +2758, 3018, 0, +2888, 3151, 0, +3018, 3283, 0, +3150, 3415, 0, +3281, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1330, 0, 1429, +1336, 0, 1427, +1343, 0, 1424, +1353, 0, 1421, +1367, 0, 1416, +1383, 0, 1410, +1402, 344, 1398, +1390, 695, 1343, +1374, 940, 1258, +1374, 940, 1069, +1374, 1150, 940, +1523, 1445, 826, +1663, 1666, 608, +1746, 1807, 0, +1838, 1945, 0, +1938, 2082, 0, +2044, 2217, 0, +2155, 2352, 0, +2272, 2486, 0, +2392, 2619, 0, +2514, 2752, 0, +2639, 2885, 0, +2766, 3018, 0, +2894, 3151, 0, +3023, 3283, 0, +3153, 3415, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1548, 0, 1563, +1552, 0, 1561, +1556, 0, 1559, +1557, 0, 1551, +1553, 0, 1535, +1549, 0, 1513, +1543, 0, 1482, +1534, 476, 1437, +1523, 826, 1368, +1523, 826, 1228, +1523, 826, 926, +1523, 1211, 826, +1666, 1541, 608, +1807, 1780, 0, +1909, 1945, 0, +1996, 2082, 0, +2090, 2217, 0, +2192, 2352, 0, +2301, 2486, 0, +2414, 2619, 0, +2532, 2752, 0, +2652, 2885, 0, +2776, 3018, 0, +2902, 3151, 0, +3029, 3283, 0, +3157, 3415, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1696, 0, 1653, +1695, 0, 1647, +1693, 0, 1640, +1691, 0, 1631, +1689, 0, 1617, +1685, 0, 1599, +1681, 0, 1574, +1674, 0, 1537, +1666, 608, 1483, +1666, 608, 1378, +1666, 608, 1183, +1666, 609, 608, +1666, 1281, 608, +1807, 1644, 0, +1945, 1895, 0, +2063, 2082, 0, +2146, 2217, 0, +2237, 2352, 0, +2336, 2486, 0, +2442, 2619, 0, +2553, 2752, 0, +2669, 2885, 0, +2789, 3018, 0, +2911, 3151, 0, +3036, 3283, 0, +3163, 3415, 0, +3291, 3548, 0, +3420, 3680, 0, +3549, 3812, 0, +3680, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1828, 0, 1738, +1828, 0, 1733, +1827, 0, 1727, +1825, 0, 1720, +1823, 0, 1709, +1821, 0, 1694, +1817, 0, 1673, +1813, 0, 1644, +1807, 0, 1602, +1807, 0, 1523, +1807, 0, 1391, +1807, 0, 1115, +1807, 438, 0, +1807, 1360, 0, +1945, 1754, 0, +2082, 2014, 0, +2211, 2217, 0, +2291, 2352, 0, +2380, 2486, 0, +2477, 2619, 0, +2581, 2752, 0, +2691, 2885, 0, +2805, 3018, 0, +2924, 3151, 0, +3046, 3283, 0, +3170, 3415, 0, +3296, 3548, 0, +3424, 3680, 0, +3552, 3812, 0, +3682, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1831, +1961, 0, 1828, +1960, 0, 1823, +1959, 0, 1817, +1958, 0, 1808, +1956, 0, 1796, +1953, 0, 1779, +1950, 0, 1757, +1945, 0, 1724, +1945, 0, 1665, +1945, 0, 1572, +1945, 0, 1407, +1945, 0, 1007, +1945, 37, 0, +1945, 1449, 0, +2082, 1868, 0, +2217, 2136, 0, +2352, 2349, 0, +2433, 2486, 0, +2520, 2619, 0, +2616, 2752, 0, +2718, 2885, 0, +2827, 3018, 0, +2941, 3151, 0, +3059, 3283, 0, +3180, 3415, 0, +3303, 3548, 0, +3429, 3680, 0, +3557, 3812, 0, +3685, 3944, 0, +3814, 4076, 0, +3945, 4095, 0, +2094, 0, 1932, +2093, 0, 1929, +2093, 0, 1926, +2092, 0, 1920, +2091, 0, 1913, +2089, 0, 1904, +2087, 0, 1891, +2085, 0, 1873, +2082, 0, 1849, +2082, 0, 1804, +2082, 0, 1738, +2082, 0, 1630, +2082, 0, 1428, +2082, 0, 800, +2082, 0, 0, +2082, 1545, 0, +2217, 1986, 0, +2352, 2261, 0, +2486, 2476, 0, +2572, 2619, 0, +2658, 2752, 0, +2752, 2885, 0, +2854, 3018, 0, +2962, 3151, 0, +3075, 3283, 0, +3192, 3415, 0, +3313, 3548, 0, +3437, 3680, 0, +3562, 3812, 0, +3689, 3944, 0, +3818, 4076, 0, +3947, 4095, 0, +2226, 0, 2039, +2226, 0, 2037, +2225, 0, 2034, +2225, 0, 2030, +2224, 0, 2025, +2223, 0, 2018, +2221, 0, 2008, +2220, 0, 1994, +2217, 0, 1975, +2217, 0, 1941, +2217, 0, 1894, +2217, 0, 1819, +2217, 0, 1697, +2217, 0, 1454, +2217, 0, 140, +2217, 0, 0, +2217, 1649, 0, +2352, 2107, 0, +2486, 2387, 0, +2619, 2604, 0, +2710, 2752, 0, +2795, 2885, 0, +2888, 3018, 0, +2989, 3151, 0, +3096, 3283, 0, +3209, 3415, 0, +3326, 3548, 0, +3446, 3680, 0, +3570, 3812, 0, +3695, 3944, 0, +3822, 4076, 0, +3950, 4095, 0, +2358, 0, 2152, +2358, 0, 2150, +2358, 0, 2148, +2357, 0, 2145, +2357, 0, 2141, +2356, 0, 2135, +2355, 0, 2127, +2353, 0, 2117, +2352, 0, 2102, +2352, 0, 2078, +2352, 0, 2042, +2352, 0, 1990, +2352, 0, 1910, +2352, 0, 1773, +2352, 0, 1487, +2352, 0, 0, +2352, 0, 0, +2352, 1758, 0, +2486, 2232, 0, +2619, 2515, 0, +2752, 2734, 0, +2845, 2885, 0, +2930, 3018, 0, +3023, 3151, 0, +3123, 3283, 0, +3230, 3415, 0, +3342, 3548, 0, +3459, 3680, 0, +3579, 3812, 0, +3702, 3944, 0, +3827, 4076, 0, +3954, 4095, 0, +2491, 0, 2269, +2491, 0, 2268, +2490, 0, 2266, +2490, 0, 2264, +2489, 0, 2260, +2489, 0, 2256, +2488, 0, 2250, +2487, 0, 2242, +2486, 0, 2231, +2486, 0, 2213, +2486, 0, 2187, +2486, 0, 2149, +2486, 0, 2094, +2486, 0, 2008, +2486, 0, 1859, +2486, 0, 1529, +2486, 0, 0, +2486, 0, 0, +2486, 1873, 0, +2619, 2357, 0, +2752, 2644, 0, +2885, 2864, 0, +2980, 3018, 0, +3064, 3151, 0, +3157, 3283, 0, +3257, 3415, 0, +3363, 3548, 0, +3475, 3680, 0, +3592, 3812, 0, +3712, 3944, 0, +3835, 4076, 0, +3960, 4095, 0, +2623, 0, 2390, +2623, 0, 2388, +2623, 0, 2387, +2622, 0, 2385, +2622, 0, 2383, +2621, 0, 2380, +2621, 0, 2375, +2620, 0, 2369, +2619, 0, 2361, +2619, 0, 2347, +2619, 0, 2328, +2619, 0, 2301, +2619, 0, 2262, +2619, 0, 2204, +2619, 0, 2113, +2619, 0, 1954, +2619, 0, 1578, +2619, 0, 0, +2619, 0, 0, +2619, 1991, 0, +2752, 2485, 0, +2885, 2773, 0, +3018, 2995, 0, +3115, 3151, 0, +3198, 3283, 0, +3290, 3415, 0, +3390, 3548, 0, +3496, 3680, 0, +3608, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3967, 4095, 0, +2755, 0, 2513, +2755, 0, 2512, +2755, 0, 2511, +2755, 0, 2510, +2755, 0, 2508, +2754, 0, 2505, +2754, 0, 2502, +2753, 0, 2497, +2752, 0, 2491, +2752, 0, 2481, +2752, 0, 2467, +2752, 0, 2447, +2752, 0, 2419, +2752, 0, 2379, +2752, 0, 2319, +2752, 0, 2224, +2752, 0, 2056, +2752, 0, 1638, +2752, 0, 0, +2752, 0, 0, +2752, 2113, 0, +2885, 2613, 0, +3018, 2903, 0, +3151, 3126, 0, +3248, 3283, 0, +3331, 3415, 0, +3423, 3548, 0, +3523, 3680, 0, +3629, 3812, 0, +3741, 3944, 0, +3857, 4076, 0, +3977, 4095, 0, +2887, 0, 2638, +2887, 0, 2638, +2887, 0, 2637, +2887, 0, 2636, +2887, 0, 2635, +2887, 0, 2632, +2886, 0, 2630, +2886, 0, 2626, +2885, 0, 2622, +2885, 0, 2614, +2885, 0, 2603, +2885, 0, 2589, +2885, 0, 2569, +2885, 0, 2540, +2885, 0, 2499, +2885, 0, 2438, +2885, 0, 2340, +2885, 0, 2163, +2885, 0, 1706, +2885, 0, 0, +2885, 0, 0, +2885, 2237, 0, +3018, 2742, 0, +3151, 3034, 0, +3283, 3257, 0, +3381, 3415, 0, +3465, 3548, 0, +3556, 3680, 0, +3656, 3812, 0, +3762, 3944, 0, +3873, 4076, 0, +3989, 4095, 0, +3019, 0, 2765, +3019, 0, 2765, +3019, 0, 2764, +3019, 0, 2763, +3019, 0, 2762, +3019, 0, 2761, +3018, 0, 2759, +3018, 0, 2756, +3018, 0, 2752, +3018, 0, 2747, +3018, 0, 2739, +3018, 0, 2728, +3018, 0, 2714, +3018, 0, 2693, +3018, 0, 2664, +3018, 0, 2622, +3018, 0, 2559, +3018, 0, 2459, +3018, 0, 2276, +3018, 0, 1782, +3018, 0, 0, +3018, 0, 0, +3018, 2362, 0, +3151, 2873, 0, +3283, 3165, 0, +3415, 3388, 0, +3514, 3548, 0, +3597, 3680, 0, +3689, 3812, 0, +3788, 3944, 0, +3894, 4076, 0, +4006, 4095, 0, +3152, 0, 2893, +3152, 0, 2893, +3152, 0, 2893, +3151, 0, 2892, +3151, 0, 2891, +3151, 0, 2890, +3151, 0, 2889, +3151, 0, 2887, +3151, 0, 2884, +3151, 0, 2880, +3151, 0, 2874, +3151, 0, 2866, +3151, 0, 2855, +3151, 0, 2840, +3151, 0, 2819, +3151, 0, 2790, +3151, 0, 2747, +3151, 0, 2684, +3151, 0, 2581, +3151, 0, 2394, +3151, 0, 1869, +3151, 0, 0, +3151, 0, 0, +3151, 2490, 0, +3283, 3003, 0, +3415, 3296, 0, +3548, 3520, 0, +3647, 3680, 0, +3730, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3022, +3283, 0, 3022, +3283, 0, 3022, +3283, 0, 3021, +3283, 0, 3021, +3283, 0, 3020, +3283, 0, 3019, +3283, 0, 3017, +3283, 0, 3015, +3283, 0, 3012, +3283, 0, 3008, +3283, 0, 3002, +3283, 0, 2994, +3283, 0, 2983, +3283, 0, 2968, +3283, 0, 2947, +3283, 0, 2917, +3283, 0, 2874, +3283, 0, 2809, +3283, 0, 2705, +3283, 0, 2513, +3283, 0, 1962, +3283, 0, 0, +3283, 0, 0, +3283, 2619, 0, +3415, 3135, 0, +3548, 3428, 0, +3680, 3652, 0, +3780, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4053, 4095, 0, +3416, 0, 3152, +3416, 0, 3152, +3416, 0, 3152, +3416, 0, 3151, +3416, 0, 3151, +3416, 0, 3151, +3415, 0, 3150, +3415, 0, 3149, +3415, 0, 3147, +3415, 0, 3145, +3415, 0, 3141, +3415, 0, 3137, +3415, 0, 3131, +3415, 0, 3123, +3415, 0, 3112, +3415, 0, 3097, +3415, 0, 3076, +3415, 0, 3046, +3415, 0, 3002, +3415, 0, 2937, +3415, 0, 2832, +3415, 0, 2637, +3415, 0, 2068, +3415, 0, 0, +3415, 0, 0, +3415, 2748, 0, +3548, 3266, 0, +3680, 3560, 0, +3812, 3784, 0, +3912, 3944, 0, +3995, 4076, 0, +4086, 4095, 0, +3548, 0, 3283, +3548, 0, 3283, +3548, 0, 3282, +3548, 0, 3282, +3548, 0, 3282, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3277, +3548, 0, 3275, +3548, 0, 3271, +3548, 0, 3267, +3548, 0, 3261, +3548, 0, 3253, +3548, 0, 3242, +3548, 0, 3226, +3548, 0, 3205, +3548, 0, 3175, +3548, 0, 3132, +3548, 0, 3066, +3548, 0, 2960, +3548, 0, 2763, +3548, 0, 2174, +3548, 0, 0, +3548, 0, 0, +3548, 2878, 0, +3680, 3397, 0, +3812, 3691, 0, +3944, 3915, 0, +4044, 4076, 0, +4095, 4095, 0, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3405, +3680, 0, 3402, +3680, 0, 3397, +3680, 0, 3392, +3680, 0, 3383, +3680, 0, 3372, +3680, 0, 3357, +3680, 0, 3336, +3680, 0, 3305, +3680, 0, 3261, +3680, 0, 3195, +3680, 0, 3089, +3680, 0, 2890, +3680, 0, 2291, +3680, 0, 0, +3680, 0, 0, +3680, 3009, 0, +3812, 3529, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3528, +3812, 0, 3522, +3812, 0, 3514, +3812, 0, 3503, +3812, 0, 3488, +3812, 0, 3466, +3812, 0, 3436, +3812, 0, 3392, +3812, 0, 3326, +3812, 0, 3218, +3812, 0, 3019, +3812, 0, 2408, +3812, 0, 0, +3812, 0, 0, +3812, 3140, 0, +3944, 3661, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3667, +3944, 0, 3664, +3944, 0, 3659, +3944, 0, 3653, +3944, 0, 3645, +3944, 0, 3634, +3944, 0, 3619, +3944, 0, 3597, +3944, 0, 3567, +3944, 0, 3523, +3944, 0, 3456, +3944, 0, 3349, +3944, 0, 3147, +3944, 0, 2528, +3944, 0, 0, +3944, 0, 0, +3944, 3271, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3798, +4076, 0, 3795, +4076, 0, 3791, +4076, 0, 3785, +4076, 0, 3777, +4076, 0, 3765, +4076, 0, 3750, +4076, 0, 3728, +4076, 0, 3698, +4076, 0, 3654, +4076, 0, 3587, +4076, 0, 3479, +4076, 0, 3277, +4076, 0, 2650, +4076, 0, 0, +4076, 0, 0, +4076, 3403, 0, +4095, 3925, 0, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3930, +4095, 0, 3927, +4095, 0, 3923, +4095, 0, 3917, +4095, 0, 3908, +4095, 0, 3897, +4095, 0, 3881, +4095, 0, 3860, +4095, 0, 3830, +4095, 0, 3786, +4095, 0, 3719, +4095, 0, 3611, +4095, 0, 3408, +4095, 0, 2778, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 1046, 1295, +0, 1069, 1295, +0, 1099, 1295, +0, 1135, 1295, +0, 1181, 1295, +0, 1234, 1295, +0, 1295, 1292, +0, 1295, 1204, +0, 1295, 1051, +0, 1295, 702, +0, 1429, 0, +0, 1563, 0, +580, 1696, 0, +1106, 1828, 0, +1402, 1961, 0, +1626, 2094, 0, +1817, 2226, 0, +1989, 2358, 0, +2149, 2491, 0, +2300, 2623, 0, +2446, 2755, 0, +2589, 2887, 0, +2728, 3019, 0, +2866, 3152, 0, +3002, 3284, 0, +3137, 3416, 0, +3271, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 1021, 1295, +0, 1050, 1292, +0, 1081, 1292, +0, 1119, 1292, +0, 1166, 1292, +0, 1221, 1292, +0, 1286, 1292, +0, 1292, 1211, +0, 1292, 1062, +0, 1292, 724, +0, 1427, 0, +0, 1561, 0, +653, 1695, 0, +1131, 1828, 0, +1415, 1961, 0, +1635, 2093, 0, +1823, 2226, 0, +1993, 2358, 0, +2151, 2491, 0, +2302, 2623, 0, +2448, 2755, 0, +2589, 2887, 0, +2729, 3019, 0, +2866, 3152, 0, +3002, 3283, 0, +3137, 3416, 0, +3272, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 985, 1295, +0, 1017, 1292, +0, 1056, 1289, +0, 1096, 1289, +0, 1145, 1289, +0, 1203, 1289, +0, 1271, 1289, +0, 1289, 1221, +0, 1289, 1075, +0, 1289, 753, +0, 1424, 0, +0, 1559, 0, +736, 1693, 0, +1161, 1827, 0, +1431, 1960, 0, +1645, 2093, 0, +1829, 2225, 0, +1997, 2358, 0, +2154, 2490, 0, +2304, 2623, 0, +2449, 2755, 0, +2591, 2887, 0, +2729, 3019, 0, +2867, 3152, 0, +3002, 3283, 0, +3138, 3416, 0, +3272, 3548, 0, +3405, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 934, 1295, +0, 968, 1292, +0, 1012, 1289, +0, 1064, 1284, +0, 1116, 1284, +0, 1177, 1284, +0, 1249, 1284, +0, 1284, 1235, +0, 1284, 1093, +0, 1284, 788, +0, 1421, 0, +0, 1557, 0, +827, 1691, 0, +1199, 1825, 0, +1453, 1959, 0, +1658, 2092, 0, +1839, 2225, 0, +2004, 2357, 0, +2159, 2490, 0, +2308, 2622, 0, +2452, 2755, 0, +2592, 2887, 0, +2731, 3019, 0, +2868, 3151, 0, +3003, 3283, 0, +3138, 3416, 0, +3272, 3548, 0, +3406, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 853, 1295, +0, 894, 1292, +0, 945, 1289, +0, 1005, 1284, +0, 1074, 1278, +0, 1141, 1278, +0, 1218, 1278, +0, 1278, 1251, +0, 1278, 1116, +0, 1278, 832, +0, 1416, 0, +275, 1553, 0, +926, 1689, 0, +1245, 1823, 0, +1480, 1958, 0, +1676, 2091, 0, +1850, 2224, 0, +2012, 2357, 0, +2165, 2489, 0, +2312, 2622, 0, +2455, 2755, 0, +2595, 2887, 0, +2732, 3019, 0, +2869, 3151, 0, +3004, 3283, 0, +3139, 3416, 0, +3273, 3548, 0, +3406, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 717, 1295, +0, 772, 1292, +0, 837, 1289, +0, 911, 1284, +0, 995, 1278, +212, 1087, 1270, +212, 1172, 1270, +212, 1266, 1270, +212, 1270, 1145, +212, 1270, 884, +0, 1410, 47, +611, 1549, 0, +1031, 1685, 0, +1301, 1821, 0, +1514, 1956, 0, +1698, 2089, 0, +1865, 2223, 0, +2022, 2356, 0, +2172, 2489, 0, +2317, 2621, 0, +2459, 2754, 0, +2598, 2887, 0, +2735, 3019, 0, +2871, 3151, 0, +3005, 3283, 0, +3140, 3416, 0, +3273, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 431, 1295, +0, 529, 1292, +0, 635, 1289, +0, 746, 1284, +0, 862, 1278, +212, 982, 1270, +562, 1104, 1258, +562, 1211, 1258, +562, 1258, 1181, +562, 1258, 946, +345, 1402, 344, +852, 1543, 0, +1142, 1681, 0, +1366, 1817, 0, +1555, 1953, 0, +1726, 2087, 0, +1885, 2221, 0, +2037, 2355, 0, +2183, 2488, 0, +2325, 2621, 0, +2464, 2754, 0, +2602, 2886, 0, +2738, 3018, 0, +2873, 3151, 0, +3007, 3283, 0, +3141, 3415, 0, +3274, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1295, +0, 0, 1292, +0, 9, 1289, +0, 346, 1284, +0, 587, 1278, +212, 787, 1270, +562, 963, 1258, +809, 1126, 1242, +809, 1242, 1225, +809, 1242, 1018, +793, 1390, 695, +1051, 1534, 476, +1258, 1674, 0, +1440, 1813, 0, +1606, 1950, 0, +1761, 2085, 0, +1910, 2220, 0, +2054, 2353, 0, +2196, 2487, 0, +2334, 2620, 0, +2471, 2753, 0, +2607, 2886, 0, +2742, 3018, 0, +2876, 3151, 0, +3009, 3283, 0, +3143, 3415, 0, +3276, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1295, +0, 0, 1292, +0, 0, 1289, +0, 0, 1284, +0, 0, 1278, +212, 214, 1270, +562, 661, 1258, +809, 938, 1242, +1010, 1154, 1220, +1010, 1220, 1099, +1069, 1374, 940, +1228, 1523, 826, +1378, 1666, 608, +1523, 1807, 0, +1665, 1945, 0, +1804, 2082, 0, +1942, 2217, 0, +2078, 2352, 0, +2213, 2486, 0, +2347, 2619, 0, +2481, 2752, 0, +2614, 2885, 0, +2747, 3018, 0, +2880, 3151, 0, +3012, 3283, 0, +3145, 3415, 0, +3277, 3548, 0, +3409, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +702, 0, 1295, +724, 0, 1292, +753, 0, 1289, +788, 0, 1284, +832, 0, 1278, +884, 212, 1270, +946, 562, 1258, +1018, 809, 1242, +1099, 1010, 1220, +1188, 1188, 1188, +1286, 1352, 1142, +1390, 1507, 1073, +1500, 1654, 959, +1615, 1798, 740, +1734, 1939, 0, +1856, 2077, 0, +1981, 2214, 0, +2107, 2349, 0, +2235, 2484, 0, +2363, 2618, 0, +2493, 2751, 0, +2623, 2885, 0, +2754, 3017, 0, +2885, 3150, 0, +3016, 3282, 0, +3147, 3415, 0, +3279, 3547, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1174, 0, 1429, +1182, 0, 1427, +1193, 0, 1424, +1207, 0, 1421, +1225, 0, 1416, +1248, 0, 1410, +1277, 344, 1402, +1313, 695, 1390, +1357, 940, 1374, +1352, 1142, 1286, +1352, 1231, 1142, +1507, 1489, 1073, +1608, 1654, 959, +1701, 1798, 740, +1801, 1939, 0, +1908, 2077, 0, +2021, 2214, 0, +2138, 2349, 0, +2258, 2484, 0, +2381, 2618, 0, +2506, 2751, 0, +2633, 2885, 0, +2761, 3017, 0, +2891, 3150, 0, +3020, 3282, 0, +3151, 3415, 0, +3282, 3547, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1458, 0, 1563, +1463, 0, 1561, +1468, 0, 1559, +1476, 0, 1557, +1486, 0, 1553, +1499, 0, 1549, +1516, 0, 1543, +1534, 476, 1531, +1523, 826, 1476, +1507, 1073, 1390, +1507, 1073, 1202, +1507, 1282, 1073, +1654, 1577, 959, +1795, 1798, 740, +1878, 1939, 0, +1970, 2077, 0, +2070, 2214, 0, +2176, 2349, 0, +2288, 2484, 0, +2404, 2618, 0, +2524, 2751, 0, +2647, 2885, 0, +2771, 3017, 0, +2898, 3150, 0, +3026, 3282, 0, +3155, 3415, 0, +3285, 3547, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1677, 0, 1696, +1680, 0, 1695, +1683, 0, 1693, +1688, 0, 1691, +1689, 0, 1683, +1685, 0, 1667, +1681, 0, 1645, +1674, 0, 1614, +1666, 608, 1569, +1654, 959, 1500, +1654, 959, 1360, +1654, 959, 1056, +1654, 1343, 959, +1798, 1673, 740, +1939, 1912, 0, +2041, 2077, 0, +2128, 2214, 0, +2223, 2349, 0, +2325, 2484, 0, +2432, 2618, 0, +2546, 2751, 0, +2664, 2885, 0, +2784, 3017, 0, +2908, 3150, 0, +3033, 3282, 0, +3161, 3415, 0, +3289, 3547, 0, +3418, 3680, 0, +3548, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1828, 0, 1789, +1828, 0, 1785, +1827, 0, 1779, +1825, 0, 1772, +1823, 0, 1763, +1821, 0, 1750, +1817, 0, 1732, +1813, 0, 1706, +1807, 0, 1669, +1798, 740, 1615, +1798, 740, 1510, +1798, 740, 1315, +1798, 740, 742, +1798, 1413, 740, +1939, 1776, 0, +2077, 2027, 0, +2195, 2214, 0, +2278, 2349, 0, +2369, 2484, 0, +2469, 2618, 0, +2574, 2751, 0, +2685, 2885, 0, +2801, 3017, 0, +2921, 3150, 0, +3043, 3282, 0, +3168, 3415, 0, +3295, 3547, 0, +3423, 3680, 0, +3552, 3812, 0, +3681, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1873, +1961, 0, 1870, +1960, 0, 1865, +1959, 0, 1860, +1958, 0, 1852, +1956, 0, 1841, +1953, 0, 1826, +1950, 0, 1806, +1945, 0, 1776, +1939, 0, 1734, +1939, 0, 1655, +1939, 0, 1523, +1939, 0, 1248, +1939, 573, 0, +1939, 1492, 0, +2077, 1886, 0, +2214, 2146, 0, +2343, 2349, 0, +2423, 2484, 0, +2512, 2618, 0, +2609, 2751, 0, +2713, 2885, 0, +2823, 3017, 0, +2938, 3150, 0, +3056, 3282, 0, +3178, 3415, 0, +3302, 3547, 0, +3428, 3680, 0, +3556, 3812, 0, +3685, 3944, 0, +3814, 4076, 0, +3944, 4095, 0, +2094, 0, 1966, +2093, 0, 1963, +2093, 0, 1960, +2092, 0, 1955, +2091, 0, 1949, +2089, 0, 1940, +2087, 0, 1928, +2085, 0, 1912, +2082, 0, 1889, +2077, 0, 1856, +2077, 0, 1797, +2077, 0, 1704, +2077, 0, 1539, +2077, 0, 1138, +2077, 173, 0, +2077, 1581, 0, +2214, 2000, 0, +2349, 2268, 0, +2484, 2481, 0, +2565, 2618, 0, +2652, 2751, 0, +2748, 2885, 0, +2850, 3017, 0, +2959, 3150, 0, +3073, 3282, 0, +3191, 3415, 0, +3312, 3547, 0, +3436, 3680, 0, +3562, 3812, 0, +3689, 3944, 0, +3817, 4076, 0, +3947, 4095, 0, +2226, 0, 2066, +2226, 0, 2064, +2225, 0, 2061, +2225, 0, 2058, +2224, 0, 2053, +2223, 0, 2046, +2221, 0, 2036, +2220, 0, 2023, +2217, 0, 2006, +2214, 0, 1981, +2214, 0, 1936, +2214, 0, 1870, +2214, 0, 1762, +2214, 0, 1560, +2214, 0, 932, +2214, 0, 0, +2214, 1677, 0, +2349, 2118, 0, +2484, 2393, 0, +2618, 2608, 0, +2704, 2751, 0, +2790, 2885, 0, +2885, 3017, 0, +2986, 3150, 0, +3094, 3282, 0, +3207, 3415, 0, +3325, 3547, 0, +3445, 3680, 0, +3569, 3812, 0, +3694, 3944, 0, +3821, 4076, 0, +3950, 4095, 0, +2358, 0, 2173, +2358, 0, 2171, +2358, 0, 2169, +2357, 0, 2166, +2357, 0, 2162, +2356, 0, 2157, +2355, 0, 2150, +2353, 0, 2140, +2352, 0, 2126, +2349, 0, 2107, +2349, 0, 2074, +2349, 0, 2025, +2349, 0, 1951, +2349, 0, 1829, +2349, 0, 1586, +2349, 0, 275, +2349, 0, 0, +2349, 1781, 0, +2484, 2240, 0, +2618, 2519, 0, +2751, 2737, 0, +2842, 2885, 0, +2927, 3017, 0, +3020, 3150, 0, +3121, 3282, 0, +3228, 3415, 0, +3341, 3547, 0, +3458, 3680, 0, +3579, 3812, 0, +3702, 3944, 0, +3827, 4076, 0, +3954, 4095, 0, +2491, 0, 2285, +2491, 0, 2284, +2490, 0, 2283, +2490, 0, 2280, +2489, 0, 2277, +2489, 0, 2273, +2488, 0, 2267, +2487, 0, 2260, +2486, 0, 2249, +2484, 0, 2235, +2484, 0, 2210, +2484, 0, 2174, +2484, 0, 2122, +2484, 0, 2042, +2484, 0, 1906, +2484, 0, 1620, +2484, 0, 0, +2484, 0, 0, +2484, 1891, 0, +2618, 2363, 0, +2751, 2647, 0, +2885, 2866, 0, +2977, 3017, 0, +3062, 3150, 0, +3155, 3282, 0, +3255, 3415, 0, +3362, 3547, 0, +3475, 3680, 0, +3591, 3812, 0, +3711, 3944, 0, +3834, 4076, 0, +3960, 4095, 0, +2623, 0, 2402, +2623, 0, 2401, +2623, 0, 2400, +2622, 0, 2398, +2622, 0, 2396, +2621, 0, 2393, +2621, 0, 2388, +2620, 0, 2382, +2619, 0, 2374, +2618, 0, 2363, +2618, 0, 2345, +2618, 0, 2319, +2618, 0, 2281, +2618, 0, 2226, +2618, 0, 2140, +2618, 0, 1991, +2618, 0, 1661, +2618, 0, 0, +2618, 0, 0, +2618, 2005, 0, +2751, 2490, 0, +2885, 2776, 0, +3017, 2996, 0, +3112, 3150, 0, +3196, 3282, 0, +3289, 3415, 0, +3389, 3547, 0, +3495, 3680, 0, +3607, 3812, 0, +3724, 3944, 0, +3844, 4076, 0, +3967, 4095, 0, +2755, 0, 2523, +2755, 0, 2522, +2755, 0, 2521, +2755, 0, 2520, +2755, 0, 2517, +2754, 0, 2515, +2754, 0, 2512, +2753, 0, 2507, +2752, 0, 2501, +2751, 0, 2493, +2751, 0, 2479, +2751, 0, 2460, +2751, 0, 2433, +2751, 0, 2394, +2751, 0, 2336, +2751, 0, 2245, +2751, 0, 2086, +2751, 0, 1711, +2751, 0, 0, +2751, 0, 0, +2751, 2123, 0, +2885, 2617, 0, +3017, 2905, 0, +3150, 3127, 0, +3247, 3282, 0, +3330, 3415, 0, +3422, 3547, 0, +3522, 3680, 0, +3629, 3812, 0, +3740, 3944, 0, +3856, 4076, 0, +3977, 4095, 0, +2887, 0, 2646, +2887, 0, 2645, +2887, 0, 2644, +2887, 0, 2643, +2887, 0, 2642, +2887, 0, 2640, +2886, 0, 2637, +2886, 0, 2634, +2885, 0, 2629, +2885, 0, 2623, +2885, 0, 2613, +2885, 0, 2599, +2885, 0, 2579, +2885, 0, 2551, +2885, 0, 2511, +2885, 0, 2451, +2885, 0, 2356, +2885, 0, 2188, +2885, 0, 1769, +2885, 0, 0, +2885, 0, 0, +2885, 2245, 0, +3017, 2745, 0, +3150, 3036, 0, +3282, 3257, 0, +3380, 3415, 0, +3464, 3547, 0, +3556, 3680, 0, +3655, 3812, 0, +3761, 3944, 0, +3873, 4076, 0, +3989, 4095, 0, +3019, 0, 2771, +3019, 0, 2770, +3019, 0, 2770, +3019, 0, 2769, +3019, 0, 2768, +3019, 0, 2766, +3018, 0, 2764, +3018, 0, 2762, +3018, 0, 2758, +3017, 0, 2754, +3017, 0, 2746, +3017, 0, 2735, +3017, 0, 2721, +3017, 0, 2701, +3017, 0, 2672, +3017, 0, 2631, +3017, 0, 2570, +3017, 0, 2471, +3017, 0, 2294, +3017, 0, 1837, +3017, 0, 0, +3017, 0, 0, +3017, 2369, 0, +3150, 2875, 0, +3282, 3166, 0, +3415, 3389, 0, +3513, 3547, 0, +3597, 3680, 0, +3689, 3812, 0, +3788, 3944, 0, +3894, 4076, 0, +4005, 4095, 0, +3152, 0, 2898, +3152, 0, 2897, +3152, 0, 2897, +3151, 0, 2896, +3151, 0, 2895, +3151, 0, 2895, +3151, 0, 2893, +3151, 0, 2891, +3151, 0, 2888, +3150, 0, 2885, +3150, 0, 2879, +3150, 0, 2871, +3150, 0, 2860, +3150, 0, 2846, +3150, 0, 2825, +3150, 0, 2796, +3150, 0, 2754, +3150, 0, 2691, +3150, 0, 2591, +3150, 0, 2408, +3150, 0, 1915, +3150, 0, 0, +3150, 0, 0, +3150, 2495, 0, +3282, 3005, 0, +3415, 3297, 0, +3547, 3520, 0, +3646, 3680, 0, +3729, 3812, 0, +3821, 3944, 0, +3921, 4076, 0, +4026, 4095, 0, +3284, 0, 3025, +3283, 0, 3025, +3283, 0, 3025, +3283, 0, 3025, +3283, 0, 3024, +3283, 0, 3023, +3283, 0, 3022, +3283, 0, 3021, +3283, 0, 3018, +3282, 0, 3016, +3282, 0, 3012, +3282, 0, 3006, +3282, 0, 2998, +3282, 0, 2987, +3282, 0, 2972, +3282, 0, 2951, +3282, 0, 2922, +3282, 0, 2879, +3282, 0, 2815, +3282, 0, 2713, +3282, 0, 2524, +3282, 0, 1999, +3282, 0, 0, +3282, 0, 0, +3282, 2622, 0, +3415, 3136, 0, +3547, 3429, 0, +3680, 3652, 0, +3779, 3812, 0, +3862, 3944, 0, +3953, 4076, 0, +4053, 4095, 0, +3416, 0, 3155, +3416, 0, 3154, +3416, 0, 3154, +3416, 0, 3154, +3416, 0, 3154, +3416, 0, 3153, +3415, 0, 3152, +3415, 0, 3151, +3415, 0, 3150, +3415, 0, 3147, +3415, 0, 3144, +3415, 0, 3140, +3415, 0, 3134, +3415, 0, 3126, +3415, 0, 3115, +3415, 0, 3100, +3415, 0, 3079, +3415, 0, 3049, +3415, 0, 3006, +3415, 0, 2942, +3415, 0, 2837, +3415, 0, 2646, +3415, 0, 2098, +3415, 0, 0, +3415, 0, 0, +3415, 2751, 0, +3547, 3267, 0, +3680, 3560, 0, +3812, 3784, 0, +3912, 3944, 0, +3995, 4076, 0, +4086, 4095, 0, +3548, 0, 3285, +3548, 0, 3284, +3548, 0, 3284, +3548, 0, 3284, +3548, 0, 3284, +3548, 0, 3283, +3548, 0, 3283, +3548, 0, 3282, +3548, 0, 3281, +3547, 0, 3279, +3547, 0, 3277, +3547, 0, 3274, +3547, 0, 3269, +3547, 0, 3263, +3547, 0, 3255, +3547, 0, 3244, +3547, 0, 3229, +3547, 0, 3208, +3547, 0, 3178, +3547, 0, 3135, +3547, 0, 3069, +3547, 0, 2964, +3547, 0, 2770, +3547, 0, 2198, +3547, 0, 0, +3547, 0, 0, +3547, 2880, 0, +3680, 3398, 0, +3812, 3692, 0, +3944, 3916, 0, +4044, 4076, 0, +4095, 4095, 0, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3413, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3409, +3680, 0, 3407, +3680, 0, 3404, +3680, 0, 3399, +3680, 0, 3393, +3680, 0, 3385, +3680, 0, 3374, +3680, 0, 3359, +3680, 0, 3337, +3680, 0, 3307, +3680, 0, 3264, +3680, 0, 3198, +3680, 0, 3092, +3680, 0, 2895, +3680, 0, 2310, +3680, 0, 0, +3680, 0, 0, +3680, 3011, 0, +3812, 3530, 0, +3944, 3824, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3546, +3812, 0, 3546, +3812, 0, 3546, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3537, +3812, 0, 3534, +3812, 0, 3530, +3812, 0, 3523, +3812, 0, 3515, +3812, 0, 3504, +3812, 0, 3489, +3812, 0, 3468, +3812, 0, 3437, +3812, 0, 3394, +3812, 0, 3328, +3812, 0, 3221, +3812, 0, 3023, +3812, 0, 2422, +3812, 0, 0, +3812, 0, 0, +3812, 3141, 0, +3944, 3661, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3671, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3661, +3944, 0, 3654, +3944, 0, 3646, +3944, 0, 3635, +3944, 0, 3620, +3944, 0, 3598, +3944, 0, 3568, +3944, 0, 3524, +3944, 0, 3458, +3944, 0, 3351, +3944, 0, 3151, +3944, 0, 2539, +3944, 0, 0, +3944, 0, 0, +3944, 3272, 0, +4076, 3793, 0, +4095, 4088, 0, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3803, +4076, 0, 3802, +4076, 0, 3799, +4076, 0, 3796, +4076, 0, 3791, +4076, 0, 3785, +4076, 0, 3777, +4076, 0, 3766, +4076, 0, 3751, +4076, 0, 3729, +4076, 0, 3699, +4076, 0, 3655, +4076, 0, 3588, +4076, 0, 3480, +4076, 0, 3279, +4076, 0, 2659, +4076, 0, 0, +4076, 0, 0, +4076, 3403, 0, +4095, 3925, 0, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3931, +4095, 0, 3927, +4095, 0, 3923, +4095, 0, 3917, +4095, 0, 3909, +4095, 0, 3898, +4095, 0, 3882, +4095, 0, 3861, +4095, 0, 3830, +4095, 0, 3786, +4095, 0, 3720, +4095, 0, 3612, +4095, 0, 3410, +4095, 0, 2785, +4095, 0, 0, +4095, 0, 0, +4095, 3535, 0, +0, 1174, 1429, +0, 1192, 1429, +0, 1215, 1429, +0, 1244, 1429, +0, 1280, 1429, +0, 1323, 1429, +0, 1376, 1429, +0, 1429, 1419, +0, 1429, 1330, +0, 1429, 1174, +0, 1429, 816, +0, 1563, 0, +0, 1696, 0, +650, 1828, 0, +1220, 1961, 0, +1524, 2094, 0, +1753, 2226, 0, +1946, 2358, 0, +2119, 2491, 0, +2278, 2623, 0, +2431, 2755, 0, +2577, 2887, 0, +2720, 3019, 0, +2860, 3152, 0, +2997, 3284, 0, +3134, 3416, 0, +3269, 3548, 0, +3403, 3680, 0, +3537, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 1156, 1429, +0, 1178, 1427, +0, 1201, 1427, +0, 1231, 1427, +0, 1267, 1427, +0, 1313, 1427, +0, 1366, 1427, +0, 1427, 1424, +0, 1427, 1336, +0, 1427, 1182, +0, 1427, 833, +0, 1561, 0, +0, 1695, 0, +713, 1828, 0, +1238, 1961, 0, +1534, 2093, 0, +1759, 2226, 0, +1950, 2358, 0, +2121, 2491, 0, +2281, 2623, 0, +2432, 2755, 0, +2578, 2887, 0, +2720, 3019, 0, +2860, 3152, 0, +2998, 3283, 0, +3134, 3416, 0, +3269, 3548, 0, +3403, 3680, 0, +3537, 3812, 0, +3671, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 1130, 1429, +0, 1153, 1427, +0, 1182, 1424, +0, 1213, 1424, +0, 1251, 1424, +0, 1298, 1424, +0, 1353, 1424, +0, 1418, 1424, +0, 1424, 1343, +0, 1424, 1193, +0, 1424, 856, +0, 1559, 0, +0, 1693, 0, +786, 1827, 0, +1263, 1960, 0, +1547, 2093, 0, +1767, 2225, 0, +1955, 2358, 0, +2125, 2490, 0, +2283, 2623, 0, +2434, 2755, 0, +2580, 2887, 0, +2721, 3019, 0, +2861, 3152, 0, +2998, 3283, 0, +3134, 3416, 0, +3269, 3548, 0, +3404, 3680, 0, +3537, 3812, 0, +3671, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 1092, 1429, +0, 1118, 1427, +0, 1149, 1424, +0, 1188, 1421, +0, 1228, 1421, +0, 1277, 1421, +0, 1335, 1421, +0, 1403, 1421, +0, 1421, 1353, +0, 1421, 1207, +0, 1421, 885, +0, 1557, 0, +0, 1691, 0, +869, 1825, 0, +1294, 1959, 0, +1564, 2092, 0, +1777, 2225, 0, +1962, 2357, 0, +2129, 2490, 0, +2287, 2622, 0, +2436, 2755, 0, +2581, 2887, 0, +2723, 3019, 0, +2862, 3151, 0, +2999, 3283, 0, +3135, 3416, 0, +3270, 3548, 0, +3404, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 1037, 1429, +0, 1065, 1427, +0, 1101, 1424, +0, 1144, 1421, +0, 1196, 1416, +0, 1248, 1416, +0, 1310, 1416, +0, 1381, 1416, +0, 1416, 1367, +0, 1416, 1225, +0, 1416, 920, +0, 1553, 0, +0, 1689, 0, +960, 1823, 0, +1332, 1958, 0, +1585, 2091, 0, +1790, 2224, 0, +1970, 2357, 0, +2136, 2489, 0, +2291, 2622, 0, +2440, 2755, 0, +2584, 2887, 0, +2724, 3019, 0, +2863, 3151, 0, +3000, 3283, 0, +3135, 3416, 0, +3270, 3548, 0, +3404, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 951, 1429, +0, 985, 1427, +0, 1027, 1424, +0, 1077, 1421, +0, 1137, 1416, +0, 1206, 1410, +0, 1273, 1410, +0, 1350, 1410, +0, 1410, 1383, +0, 1410, 1248, +0, 1410, 964, +0, 1549, 0, +406, 1685, 0, +1059, 1821, 0, +1378, 1956, 0, +1612, 2089, 0, +1808, 2223, 0, +1982, 2356, 0, +2144, 2489, 0, +2297, 2621, 0, +2444, 2754, 0, +2587, 2887, 0, +2727, 3019, 0, +2865, 3151, 0, +3001, 3283, 0, +3136, 3416, 0, +3271, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 803, 1429, +0, 849, 1427, +0, 904, 1424, +0, 969, 1421, +0, 1043, 1416, +0, 1127, 1410, +344, 1219, 1402, +344, 1304, 1402, +344, 1398, 1402, +344, 1402, 1277, +344, 1402, 1017, +0, 1543, 172, +742, 1681, 0, +1164, 1817, 0, +1433, 1953, 0, +1646, 2087, 0, +1830, 2221, 0, +1998, 2355, 0, +2155, 2488, 0, +2304, 2621, 0, +2450, 2754, 0, +2591, 2886, 0, +2730, 3018, 0, +2867, 3151, 0, +3003, 3283, 0, +3138, 3415, 0, +3272, 3548, 0, +3406, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 471, 1429, +0, 562, 1427, +0, 662, 1424, +0, 767, 1421, +0, 878, 1416, +0, 994, 1410, +344, 1114, 1402, +695, 1236, 1390, +695, 1343, 1390, +695, 1390, 1313, +695, 1390, 1078, +479, 1534, 476, +983, 1674, 0, +1275, 1813, 0, +1498, 1950, 0, +1687, 2085, 0, +1858, 2220, 0, +2017, 2353, 0, +2169, 2487, 0, +2314, 2620, 0, +2457, 2753, 0, +2596, 2886, 0, +2734, 3018, 0, +2870, 3151, 0, +3005, 3283, 0, +3139, 3415, 0, +3273, 3548, 0, +3406, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 0, 1429, +0, 0, 1427, +0, 0, 1424, +0, 141, 1421, +0, 478, 1416, +0, 719, 1410, +344, 919, 1402, +695, 1095, 1390, +940, 1258, 1374, +940, 1374, 1357, +940, 1374, 1150, +926, 1523, 826, +1183, 1666, 608, +1391, 1807, 0, +1572, 1945, 0, +1738, 2082, 0, +1894, 2217, 0, +2042, 2352, 0, +2187, 2486, 0, +2328, 2619, 0, +2467, 2752, 0, +2603, 2885, 0, +2739, 3018, 0, +2874, 3151, 0, +3008, 3283, 0, +3141, 3415, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1429, +0, 0, 1427, +0, 0, 1424, +0, 0, 1421, +0, 0, 1416, +47, 0, 1410, +344, 345, 1402, +695, 793, 1390, +940, 1069, 1374, +1142, 1286, 1352, +1142, 1352, 1231, +1202, 1507, 1073, +1360, 1654, 959, +1510, 1798, 740, +1655, 1939, 0, +1797, 2077, 0, +1936, 2214, 0, +2074, 2349, 0, +2210, 2484, 0, +2345, 2618, 0, +2479, 2751, 0, +2613, 2885, 0, +2746, 3017, 0, +2879, 3150, 0, +3012, 3282, 0, +3144, 3415, 0, +3277, 3547, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +816, 0, 1429, +833, 0, 1427, +856, 0, 1424, +885, 0, 1421, +920, 0, 1416, +964, 0, 1410, +1017, 344, 1402, +1078, 695, 1390, +1150, 940, 1374, +1231, 1142, 1352, +1320, 1320, 1320, +1418, 1484, 1274, +1522, 1638, 1205, +1633, 1787, 1090, +1748, 1930, 872, +1866, 2071, 79, +1988, 2209, 0, +2113, 2346, 0, +2239, 2481, 0, +2367, 2616, 0, +2495, 2750, 0, +2625, 2883, 0, +2755, 3016, 0, +2886, 3150, 0, +3017, 3282, 0, +3148, 3414, 0, +3280, 3547, 0, +3411, 3679, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1301, 0, 1563, +1307, 0, 1561, +1315, 0, 1559, +1326, 0, 1557, +1340, 0, 1553, +1358, 0, 1549, +1381, 0, 1543, +1409, 476, 1534, +1445, 826, 1523, +1489, 1073, 1507, +1484, 1274, 1418, +1484, 1363, 1274, +1638, 1621, 1205, +1740, 1787, 1090, +1833, 1930, 872, +1934, 2071, 79, +2041, 2209, 0, +2153, 2346, 0, +2270, 2481, 0, +2390, 2616, 0, +2514, 2750, 0, +2639, 2883, 0, +2765, 3016, 0, +2894, 3150, 0, +3023, 3282, 0, +3152, 3414, 0, +3283, 3547, 0, +3414, 3679, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1587, 0, 1696, +1590, 0, 1695, +1594, 0, 1693, +1600, 0, 1691, +1608, 0, 1689, +1618, 0, 1685, +1631, 0, 1681, +1648, 0, 1674, +1666, 608, 1663, +1654, 959, 1608, +1638, 1205, 1522, +1638, 1205, 1333, +1638, 1414, 1205, +1787, 1709, 1090, +1927, 1930, 872, +2010, 2071, 79, +2102, 2209, 0, +2202, 2346, 0, +2308, 2481, 0, +2420, 2616, 0, +2536, 2750, 0, +2656, 2883, 0, +2778, 3016, 0, +2904, 3150, 0, +3030, 3282, 0, +3158, 3414, 0, +3287, 3547, 0, +3417, 3679, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1807, 0, 1828, +1810, 0, 1828, +1812, 0, 1827, +1816, 0, 1825, +1821, 0, 1823, +1821, 0, 1815, +1817, 0, 1799, +1813, 0, 1777, +1807, 0, 1746, +1798, 740, 1701, +1787, 1090, 1633, +1787, 1090, 1491, +1787, 1090, 1189, +1787, 1475, 1090, +1930, 1805, 872, +2071, 2044, 79, +2174, 2209, 0, +2260, 2346, 0, +2355, 2481, 0, +2456, 2616, 0, +2565, 2750, 0, +2678, 2883, 0, +2796, 3016, 0, +2917, 3150, 0, +3040, 3282, 0, +3165, 3414, 0, +3293, 3547, 0, +3421, 3679, 0, +3551, 3812, 0, +3680, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1961, 0, 1923, +1961, 0, 1920, +1960, 0, 1917, +1959, 0, 1911, +1958, 0, 1905, +1956, 0, 1895, +1953, 0, 1882, +1950, 0, 1864, +1945, 0, 1838, +1939, 0, 1801, +1930, 872, 1748, +1930, 872, 1642, +1930, 872, 1447, +1930, 872, 873, +1930, 1545, 872, +2071, 1908, 79, +2209, 2159, 0, +2328, 2346, 0, +2410, 2481, 0, +2501, 2616, 0, +2601, 2750, 0, +2706, 2883, 0, +2817, 3016, 0, +2933, 3150, 0, +3053, 3282, 0, +3175, 3414, 0, +3300, 3547, 0, +3427, 3679, 0, +3555, 3812, 0, +3684, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +2094, 0, 2007, +2093, 0, 2005, +2093, 0, 2002, +2092, 0, 1997, +2091, 0, 1992, +2089, 0, 1984, +2087, 0, 1973, +2085, 0, 1958, +2082, 0, 1938, +2077, 0, 1908, +2071, 79, 1866, +2071, 79, 1787, +2071, 79, 1655, +2071, 79, 1379, +2071, 706, 79, +2071, 1625, 79, +2209, 2018, 0, +2346, 2278, 0, +2475, 2481, 0, +2555, 2616, 0, +2645, 2750, 0, +2741, 2883, 0, +2845, 3016, 0, +2955, 3150, 0, +3070, 3282, 0, +3188, 3414, 0, +3310, 3547, 0, +3434, 3679, 0, +3561, 3812, 0, +3688, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2226, 0, 2100, +2226, 0, 2098, +2225, 0, 2095, +2225, 0, 2092, +2224, 0, 2087, +2223, 0, 2081, +2221, 0, 2072, +2220, 0, 2060, +2217, 0, 2044, +2214, 0, 2021, +2209, 0, 1988, +2209, 0, 1929, +2209, 0, 1836, +2209, 0, 1671, +2209, 0, 1270, +2209, 303, 0, +2209, 1713, 0, +2346, 2132, 0, +2481, 2401, 0, +2616, 2613, 0, +2697, 2750, 0, +2784, 2883, 0, +2880, 3016, 0, +2982, 3150, 0, +3091, 3282, 0, +3205, 3414, 0, +3323, 3547, 0, +3444, 3679, 0, +3568, 3812, 0, +3694, 3944, 0, +3821, 4076, 0, +3950, 4095, 0, +2358, 0, 2200, +2358, 0, 2199, +2358, 0, 2196, +2357, 0, 2193, +2357, 0, 2190, +2356, 0, 2185, +2355, 0, 2178, +2353, 0, 2168, +2352, 0, 2155, +2349, 0, 2138, +2346, 0, 2113, +2346, 0, 2069, +2346, 0, 2002, +2346, 0, 1894, +2346, 0, 1692, +2346, 0, 1064, +2346, 0, 0, +2346, 1809, 0, +2481, 2251, 0, +2616, 2525, 0, +2750, 2741, 0, +2836, 2883, 0, +2922, 3016, 0, +3017, 3150, 0, +3118, 3282, 0, +3226, 3414, 0, +3339, 3547, 0, +3457, 3679, 0, +3577, 3812, 0, +3701, 3944, 0, +3826, 4076, 0, +3954, 4095, 0, +2491, 0, 2306, +2491, 0, 2305, +2490, 0, 2304, +2490, 0, 2302, +2489, 0, 2298, +2489, 0, 2294, +2488, 0, 2289, +2487, 0, 2282, +2486, 0, 2272, +2484, 0, 2258, +2481, 0, 2239, +2481, 0, 2206, +2481, 0, 2158, +2481, 0, 2084, +2481, 0, 1961, +2481, 0, 1719, +2481, 0, 415, +2481, 0, 0, +2481, 1913, 0, +2616, 2372, 0, +2750, 2651, 0, +2883, 2869, 0, +2974, 3016, 0, +3059, 3150, 0, +3152, 3282, 0, +3253, 3414, 0, +3361, 3547, 0, +3473, 3679, 0, +3590, 3812, 0, +3711, 3944, 0, +3834, 4076, 0, +3959, 4095, 0, +2623, 0, 2419, +2623, 0, 2417, +2623, 0, 2416, +2622, 0, 2414, +2622, 0, 2412, +2621, 0, 2409, +2621, 0, 2405, +2620, 0, 2399, +2619, 0, 2392, +2618, 0, 2381, +2616, 0, 2367, +2616, 0, 2342, +2616, 0, 2306, +2616, 0, 2255, +2616, 0, 2174, +2616, 0, 2038, +2616, 0, 1752, +2616, 0, 0, +2616, 0, 0, +2616, 2022, 0, +2750, 2496, 0, +2883, 2779, 0, +3016, 2998, 0, +3110, 3150, 0, +3194, 3282, 0, +3287, 3414, 0, +3387, 3547, 0, +3494, 3679, 0, +3606, 3812, 0, +3723, 3944, 0, +3843, 4076, 0, +3967, 4095, 0, +2755, 0, 2535, +2755, 0, 2535, +2755, 0, 2533, +2755, 0, 2532, +2755, 0, 2530, +2754, 0, 2528, +2754, 0, 2525, +2753, 0, 2521, +2752, 0, 2514, +2751, 0, 2506, +2750, 0, 2495, +2750, 0, 2477, +2750, 0, 2451, +2750, 0, 2414, +2750, 0, 2359, +2750, 0, 2273, +2750, 0, 2124, +2750, 0, 1794, +2750, 0, 0, +2750, 0, 0, +2750, 2137, 0, +2883, 2621, 0, +3016, 2907, 0, +3150, 3128, 0, +3244, 3282, 0, +3329, 3414, 0, +3421, 3547, 0, +3521, 3679, 0, +3628, 3812, 0, +3740, 3944, 0, +3856, 4076, 0, +3976, 4095, 0, +2887, 0, 2655, +2887, 0, 2655, +2887, 0, 2654, +2887, 0, 2653, +2887, 0, 2651, +2887, 0, 2650, +2886, 0, 2647, +2886, 0, 2644, +2885, 0, 2639, +2885, 0, 2633, +2883, 0, 2625, +2883, 0, 2611, +2883, 0, 2592, +2883, 0, 2565, +2883, 0, 2526, +2883, 0, 2469, +2883, 0, 2378, +2883, 0, 2218, +2883, 0, 1843, +2883, 0, 0, +2883, 0, 0, +2883, 2255, 0, +3016, 2749, 0, +3150, 3038, 0, +3282, 3259, 0, +3379, 3414, 0, +3462, 3547, 0, +3554, 3679, 0, +3654, 3812, 0, +3761, 3944, 0, +3872, 4076, 0, +3989, 4095, 0, +3019, 0, 2778, +3019, 0, 2777, +3019, 0, 2777, +3019, 0, 2776, +3019, 0, 2775, +3019, 0, 2774, +3018, 0, 2772, +3018, 0, 2769, +3018, 0, 2766, +3017, 0, 2761, +3016, 0, 2755, +3016, 0, 2745, +3016, 0, 2731, +3016, 0, 2711, +3016, 0, 2683, +3016, 0, 2643, +3016, 0, 2583, +3016, 0, 2488, +3016, 0, 2319, +3016, 0, 1900, +3016, 0, 0, +3016, 0, 0, +3016, 2377, 0, +3150, 2878, 0, +3282, 3168, 0, +3414, 3390, 0, +3512, 3547, 0, +3596, 3679, 0, +3688, 3812, 0, +3787, 3944, 0, +3893, 4076, 0, +4005, 4095, 0, +3152, 0, 2903, +3152, 0, 2903, +3152, 0, 2903, +3151, 0, 2902, +3151, 0, 2901, +3151, 0, 2900, +3151, 0, 2898, +3151, 0, 2896, +3151, 0, 2894, +3150, 0, 2891, +3150, 0, 2886, +3150, 0, 2878, +3150, 0, 2868, +3150, 0, 2853, +3150, 0, 2833, +3150, 0, 2804, +3150, 0, 2763, +3150, 0, 2702, +3150, 0, 2604, +3150, 0, 2427, +3150, 0, 1969, +3150, 0, 0, +3150, 0, 0, +3150, 2501, 0, +3282, 3006, 0, +3414, 3298, 0, +3547, 3521, 0, +3646, 3679, 0, +3729, 3812, 0, +3820, 3944, 0, +3920, 4076, 0, +4026, 4095, 0, +3284, 0, 3030, +3283, 0, 3029, +3283, 0, 3029, +3283, 0, 3029, +3283, 0, 3028, +3283, 0, 3027, +3283, 0, 3026, +3283, 0, 3025, +3283, 0, 3023, +3282, 0, 3020, +3282, 0, 3017, +3282, 0, 3011, +3282, 0, 3003, +3282, 0, 2992, +3282, 0, 2977, +3282, 0, 2957, +3282, 0, 2928, +3282, 0, 2886, +3282, 0, 2823, +3282, 0, 2723, +3282, 0, 2539, +3282, 0, 2045, +3282, 0, 0, +3282, 0, 0, +3282, 2627, 0, +3414, 3137, 0, +3547, 3429, 0, +3679, 3653, 0, +3778, 3812, 0, +3862, 3944, 0, +3953, 4076, 0, +4053, 4095, 0, +3416, 0, 3158, +3416, 0, 3158, +3416, 0, 3157, +3416, 0, 3157, +3416, 0, 3157, +3416, 0, 3156, +3415, 0, 3155, +3415, 0, 3154, +3415, 0, 3153, +3415, 0, 3151, +3414, 0, 3148, +3414, 0, 3144, +3414, 0, 3138, +3414, 0, 3130, +3414, 0, 3119, +3414, 0, 3104, +3414, 0, 3083, +3414, 0, 3054, +3414, 0, 3011, +3414, 0, 2947, +3414, 0, 2845, +3414, 0, 2657, +3414, 0, 2135, +3414, 0, 0, +3414, 0, 0, +3414, 2754, 0, +3547, 3268, 0, +3679, 3561, 0, +3812, 3784, 0, +3911, 3944, 0, +3994, 4076, 0, +4086, 4095, 0, +3548, 0, 3287, +3548, 0, 3287, +3548, 0, 3287, +3548, 0, 3286, +3548, 0, 3286, +3548, 0, 3286, +3548, 0, 3285, +3548, 0, 3284, +3548, 0, 3283, +3547, 0, 3282, +3547, 0, 3280, +3547, 0, 3277, +3547, 0, 3272, +3547, 0, 3266, +3547, 0, 3258, +3547, 0, 3247, +3547, 0, 3232, +3547, 0, 3211, +3547, 0, 3181, +3547, 0, 3138, +3547, 0, 3074, +3547, 0, 2970, +3547, 0, 2778, +3547, 0, 2228, +3547, 0, 0, +3547, 0, 0, +3547, 2883, 0, +3679, 3399, 0, +3812, 3692, 0, +3944, 3916, 0, +4044, 4076, 0, +4095, 4095, 0, +3680, 0, 3417, +3680, 0, 3417, +3680, 0, 3417, +3680, 0, 3416, +3680, 0, 3416, +3680, 0, 3416, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3414, +3680, 0, 3413, +3679, 0, 3411, +3679, 0, 3409, +3679, 0, 3406, +3679, 0, 3401, +3679, 0, 3395, +3679, 0, 3387, +3679, 0, 3376, +3679, 0, 3361, +3679, 0, 3340, +3679, 0, 3310, +3679, 0, 3267, +3679, 0, 3201, +3679, 0, 3096, +3679, 0, 2901, +3679, 0, 2333, +3679, 0, 0, +3679, 0, 0, +3679, 3013, 0, +3812, 3530, 0, +3944, 3824, 0, +4076, 4048, 0, +4095, 4095, 0, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3546, +3812, 0, 3546, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3541, +3812, 0, 3539, +3812, 0, 3536, +3812, 0, 3531, +3812, 0, 3525, +3812, 0, 3517, +3812, 0, 3506, +3812, 0, 3491, +3812, 0, 3469, +3812, 0, 3439, +3812, 0, 3396, +3812, 0, 3330, +3812, 0, 3224, +3812, 0, 3027, +3812, 0, 2441, +3812, 0, 0, +3812, 0, 0, +3812, 3143, 0, +3944, 3661, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3672, +3944, 0, 3669, +3944, 0, 3666, +3944, 0, 3662, +3944, 0, 3656, +3944, 0, 3648, +3944, 0, 3636, +3944, 0, 3621, +3944, 0, 3600, +3944, 0, 3569, +3944, 0, 3526, +3944, 0, 3459, +3944, 0, 3353, +3944, 0, 3154, +3944, 0, 2553, +3944, 0, 0, +3944, 0, 0, +3944, 3273, 0, +4076, 3793, 0, +4095, 4088, 0, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3800, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3787, +4076, 0, 3778, +4076, 0, 3767, +4076, 0, 3752, +4076, 0, 3730, +4076, 0, 3700, +4076, 0, 3656, +4076, 0, 3590, +4076, 0, 3482, +4076, 0, 3282, +4076, 0, 2670, +4076, 0, 0, +4076, 0, 0, +4076, 3404, 0, +4095, 3925, 0, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3928, +4095, 0, 3924, +4095, 0, 3918, +4095, 0, 3910, +4095, 0, 3898, +4095, 0, 3883, +4095, 0, 3862, +4095, 0, 3831, +4095, 0, 3787, +4095, 0, 3721, +4095, 0, 3613, +4095, 0, 3412, +4095, 0, 2793, +4095, 0, 0, +4095, 0, 0, +4095, 3536, 0, +0, 1304, 1563, +0, 1318, 1563, +0, 1335, 1563, +0, 1357, 1563, +0, 1385, 1563, +0, 1421, 1563, +0, 1463, 1563, +0, 1515, 1563, +0, 1563, 1548, +0, 1563, 1458, +0, 1563, 1301, +0, 1563, 934, +0, 1696, 0, +0, 1828, 0, +726, 1961, 0, +1336, 2094, 0, +1648, 2226, 0, +1880, 2358, 0, +2075, 2491, 0, +2248, 2623, 0, +2409, 2755, 0, +2562, 2887, 0, +2708, 3019, 0, +2851, 3152, 0, +2991, 3284, 0, +3129, 3416, 0, +3266, 3548, 0, +3401, 3680, 0, +3535, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1290, 1563, +0, 1307, 1561, +0, 1325, 1561, +0, 1347, 1561, +0, 1376, 1561, +0, 1412, 1561, +0, 1456, 1561, +0, 1508, 1561, +0, 1561, 1552, +0, 1561, 1463, +0, 1561, 1307, +0, 1561, 948, +0, 1695, 0, +0, 1828, 0, +780, 1961, 0, +1351, 2093, 0, +1656, 2226, 0, +1885, 2358, 0, +2078, 2491, 0, +2250, 2623, 0, +2411, 2755, 0, +2563, 2887, 0, +2709, 3019, 0, +2852, 3152, 0, +2992, 3283, 0, +3129, 3416, 0, +3266, 3548, 0, +3401, 3680, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1271, 1563, +0, 1288, 1561, +0, 1310, 1559, +0, 1333, 1559, +0, 1363, 1559, +0, 1400, 1559, +0, 1445, 1559, +0, 1499, 1559, +0, 1559, 1556, +0, 1559, 1468, +0, 1559, 1315, +0, 1559, 966, +0, 1693, 0, +0, 1827, 0, +844, 1960, 0, +1370, 2093, 0, +1666, 2225, 0, +1891, 2358, 0, +2082, 2490, 0, +2253, 2623, 0, +2413, 2755, 0, +2564, 2887, 0, +2710, 3019, 0, +2853, 3152, 0, +2992, 3283, 0, +3130, 3416, 0, +3266, 3548, 0, +3401, 3680, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1244, 1563, +0, 1262, 1561, +0, 1285, 1559, +0, 1315, 1557, +0, 1345, 1557, +0, 1384, 1557, +0, 1430, 1557, +0, 1486, 1557, +0, 1551, 1557, +0, 1557, 1476, +0, 1557, 1326, +0, 1557, 988, +0, 1691, 0, +0, 1825, 0, +917, 1959, 0, +1394, 2092, 0, +1679, 2225, 0, +1899, 2357, 0, +2087, 2490, 0, +2256, 2622, 0, +2415, 2755, 0, +2566, 2887, 0, +2712, 3019, 0, +2854, 3151, 0, +2993, 3283, 0, +3130, 3416, 0, +3267, 3548, 0, +3401, 3680, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1205, 1563, +0, 1225, 1561, +0, 1250, 1559, +0, 1281, 1557, +0, 1320, 1553, +0, 1360, 1553, +0, 1409, 1553, +0, 1467, 1553, +0, 1535, 1553, +0, 1553, 1486, +0, 1553, 1340, +0, 1553, 1017, +0, 1689, 0, +0, 1823, 0, +1000, 1958, 0, +1425, 2091, 0, +1695, 2224, 0, +1909, 2357, 0, +2094, 2489, 0, +2261, 2622, 0, +2419, 2755, 0, +2569, 2887, 0, +2713, 3019, 0, +2855, 3151, 0, +2994, 3283, 0, +3131, 3416, 0, +3267, 3548, 0, +3402, 3680, 0, +3536, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1148, 1563, +0, 1170, 1561, +0, 1198, 1559, +0, 1233, 1557, +0, 1276, 1553, +0, 1328, 1549, +0, 1380, 1549, +0, 1442, 1549, +0, 1513, 1549, +0, 1549, 1499, +0, 1549, 1358, +0, 1549, 1053, +0, 1685, 0, +0, 1821, 0, +1091, 1956, 0, +1463, 2089, 0, +1717, 2223, 0, +1922, 2356, 0, +2103, 2489, 0, +2268, 2621, 0, +2423, 2754, 0, +2572, 2887, 0, +2716, 3019, 0, +2857, 3151, 0, +2995, 3283, 0, +3132, 3416, 0, +3268, 3548, 0, +3402, 3680, 0, +3537, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1057, 1563, +0, 1084, 1561, +0, 1118, 1559, +0, 1159, 1557, +0, 1209, 1553, +0, 1269, 1549, +0, 1338, 1543, +0, 1405, 1543, +0, 1482, 1543, +0, 1543, 1516, +0, 1543, 1381, +0, 1543, 1096, +0, 1681, 0, +536, 1817, 0, +1190, 1953, 0, +1509, 2087, 0, +1744, 2221, 0, +1940, 2355, 0, +2115, 2488, 0, +2276, 2621, 0, +2429, 2754, 0, +2576, 2886, 0, +2719, 3018, 0, +2859, 3151, 0, +2997, 3283, 0, +3133, 3415, 0, +3269, 3548, 0, +3403, 3680, 0, +3537, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 897, 1563, +0, 935, 1561, +0, 981, 1559, +0, 1037, 1557, +0, 1102, 1553, +0, 1176, 1549, +0, 1259, 1543, +476, 1351, 1534, +476, 1437, 1534, +476, 1531, 1534, +476, 1534, 1409, +476, 1534, 1149, +0, 1674, 313, +874, 1813, 0, +1295, 1950, 0, +1565, 2085, 0, +1778, 2220, 0, +1962, 2353, 0, +2130, 2487, 0, +2287, 2620, 0, +2437, 2753, 0, +2581, 2886, 0, +2723, 3018, 0, +2862, 3151, 0, +2999, 3283, 0, +3135, 3415, 0, +3270, 3548, 0, +3404, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 523, 1563, +0, 605, 1561, +0, 696, 1559, +0, 794, 1557, +0, 900, 1553, +0, 1011, 1549, +0, 1127, 1543, +476, 1246, 1534, +826, 1368, 1523, +826, 1476, 1523, +826, 1523, 1445, +826, 1523, 1211, +608, 1666, 609, +1115, 1807, 0, +1407, 1945, 0, +1630, 2082, 0, +1819, 2217, 0, +1990, 2352, 0, +2149, 2486, 0, +2301, 2619, 0, +2447, 2752, 0, +2589, 2885, 0, +2728, 3018, 0, +2866, 3151, 0, +3002, 3283, 0, +3137, 3415, 0, +3271, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 0, 1563, +0, 0, 1561, +0, 0, 1559, +0, 0, 1557, +0, 275, 1553, +0, 611, 1549, +0, 852, 1543, +476, 1051, 1534, +826, 1228, 1523, +1073, 1390, 1507, +1073, 1507, 1489, +1073, 1507, 1282, +1056, 1654, 959, +1315, 1798, 740, +1523, 1939, 0, +1704, 2077, 0, +1870, 2214, 0, +2025, 2349, 0, +2174, 2484, 0, +2319, 2618, 0, +2460, 2751, 0, +2599, 2885, 0, +2735, 3017, 0, +2871, 3150, 0, +3006, 3282, 0, +3140, 3415, 0, +3274, 3547, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 0, 1563, +0, 0, 1561, +0, 0, 1559, +0, 0, 1557, +0, 0, 1553, +0, 0, 1549, +172, 0, 1543, +476, 479, 1534, +826, 926, 1523, +1073, 1202, 1507, +1274, 1418, 1484, +1274, 1484, 1363, +1333, 1638, 1205, +1491, 1787, 1090, +1642, 1930, 872, +1787, 2071, 79, +1929, 2209, 0, +2069, 2346, 0, +2206, 2481, 0, +2342, 2616, 0, +2477, 2750, 0, +2611, 2883, 0, +2745, 3016, 0, +2878, 3150, 0, +3011, 3282, 0, +3144, 3414, 0, +3277, 3547, 0, +3409, 3679, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +934, 0, 1563, +948, 0, 1561, +966, 0, 1559, +988, 0, 1557, +1017, 0, 1553, +1053, 0, 1549, +1096, 0, 1543, +1149, 476, 1534, +1211, 826, 1523, +1282, 1073, 1507, +1363, 1274, 1484, +1453, 1453, 1453, +1550, 1616, 1407, +1654, 1771, 1337, +1765, 1919, 1223, +1880, 2062, 1005, +1998, 2203, 217, +2120, 2341, 0, +2245, 2478, 0, +2371, 2613, 0, +2499, 2748, 0, +2628, 2882, 0, +2757, 3015, 0, +2887, 3149, 0, +3018, 3281, 0, +3149, 3414, 0, +3280, 3547, 0, +3412, 3679, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1427, 0, 1696, +1432, 0, 1695, +1439, 0, 1693, +1447, 0, 1691, +1457, 0, 1689, +1471, 0, 1685, +1489, 0, 1681, +1512, 0, 1674, +1541, 608, 1666, +1577, 959, 1654, +1621, 1205, 1638, +1616, 1407, 1550, +1616, 1495, 1407, +1771, 1754, 1337, +1872, 1919, 1223, +1965, 2062, 1005, +2066, 2203, 217, +2173, 2341, 0, +2285, 2478, 0, +2402, 2613, 0, +2522, 2748, 0, +2645, 2882, 0, +2770, 3015, 0, +2898, 3149, 0, +3025, 3281, 0, +3155, 3414, 0, +3285, 3547, 0, +3415, 3679, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1716, 0, 1828, +1719, 0, 1828, +1722, 0, 1827, +1727, 0, 1825, +1732, 0, 1823, +1740, 0, 1821, +1750, 0, 1817, +1763, 0, 1813, +1780, 0, 1807, +1798, 740, 1795, +1787, 1090, 1740, +1771, 1337, 1654, +1771, 1337, 1466, +1771, 1546, 1337, +1919, 1841, 1223, +2059, 2062, 1005, +2142, 2203, 217, +2234, 2341, 0, +2334, 2478, 0, +2440, 2613, 0, +2552, 2748, 0, +2668, 2882, 0, +2788, 3015, 0, +2911, 3149, 0, +3035, 3281, 0, +3162, 3414, 0, +3290, 3547, 0, +3419, 3679, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1938, 0, 1961, +1940, 0, 1961, +1941, 0, 1960, +1944, 0, 1959, +1948, 0, 1958, +1953, 0, 1956, +1953, 0, 1947, +1950, 0, 1931, +1945, 0, 1909, +1939, 0, 1878, +1930, 872, 1833, +1919, 1223, 1765, +1919, 1223, 1624, +1919, 1223, 1321, +1919, 1607, 1223, +2062, 1937, 1005, +2203, 2176, 217, +2305, 2341, 0, +2392, 2478, 0, +2487, 2613, 0, +2589, 2748, 0, +2697, 2882, 0, +2810, 3015, 0, +2928, 3149, 0, +3049, 3281, 0, +3172, 3414, 0, +3298, 3547, 0, +3425, 3679, 0, +3553, 3812, 0, +3683, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +2094, 0, 2058, +2093, 0, 2056, +2093, 0, 2053, +2092, 0, 2049, +2091, 0, 2044, +2089, 0, 2037, +2087, 0, 2027, +2085, 0, 2014, +2082, 0, 1996, +2077, 0, 1970, +2071, 79, 1934, +2062, 1005, 1880, +2062, 1005, 1774, +2062, 1005, 1579, +2062, 1005, 1006, +2062, 1677, 1005, +2203, 2041, 217, +2341, 2291, 0, +2460, 2478, 0, +2542, 2613, 0, +2634, 2748, 0, +2733, 2882, 0, +2838, 3015, 0, +2950, 3149, 0, +3065, 3281, 0, +3185, 3414, 0, +3307, 3547, 0, +3432, 3679, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2226, 0, 2141, +2226, 0, 2140, +2225, 0, 2137, +2225, 0, 2134, +2224, 0, 2130, +2223, 0, 2124, +2221, 0, 2116, +2220, 0, 2105, +2217, 0, 2090, +2214, 0, 2070, +2209, 0, 2041, +2203, 217, 1998, +2203, 217, 1920, +2203, 217, 1787, +2203, 217, 1512, +2203, 838, 217, +2203, 1757, 217, +2341, 2150, 0, +2478, 2411, 0, +2607, 2613, 0, +2687, 2748, 0, +2777, 2882, 0, +2873, 3015, 0, +2977, 3149, 0, +3087, 3281, 0, +3202, 3414, 0, +3320, 3547, 0, +3442, 3679, 0, +3566, 3812, 0, +3692, 3944, 0, +3820, 4076, 0, +3949, 4095, 0, +2358, 0, 2233, +2358, 0, 2232, +2358, 0, 2230, +2357, 0, 2228, +2357, 0, 2224, +2356, 0, 2219, +2355, 0, 2213, +2353, 0, 2204, +2352, 0, 2192, +2349, 0, 2176, +2346, 0, 2153, +2341, 0, 2120, +2341, 0, 2061, +2341, 0, 1968, +2341, 0, 1803, +2341, 0, 1403, +2341, 437, 0, +2341, 1845, 0, +2478, 2264, 0, +2613, 2533, 0, +2748, 2745, 0, +2829, 2882, 0, +2916, 3015, 0, +3012, 3149, 0, +3114, 3281, 0, +3223, 3414, 0, +3337, 3547, 0, +3455, 3679, 0, +3576, 3812, 0, +3700, 3944, 0, +3826, 4076, 0, +3953, 4095, 0, +2491, 0, 2333, +2491, 0, 2332, +2490, 0, 2331, +2490, 0, 2329, +2489, 0, 2326, +2489, 0, 2322, +2488, 0, 2317, +2487, 0, 2310, +2486, 0, 2301, +2484, 0, 2288, +2481, 0, 2270, +2478, 0, 2245, +2478, 0, 2201, +2478, 0, 2134, +2478, 0, 2026, +2478, 0, 1824, +2478, 0, 1199, +2478, 0, 0, +2478, 1941, 0, +2613, 2382, 0, +2748, 2657, 0, +2882, 2873, 0, +2968, 3015, 0, +3055, 3149, 0, +3149, 3281, 0, +3250, 3414, 0, +3358, 3547, 0, +3472, 3679, 0, +3589, 3812, 0, +3710, 3944, 0, +3833, 4076, 0, +3959, 4095, 0, +2623, 0, 2440, +2623, 0, 2439, +2623, 0, 2437, +2622, 0, 2436, +2622, 0, 2434, +2621, 0, 2431, +2621, 0, 2427, +2620, 0, 2421, +2619, 0, 2414, +2618, 0, 2404, +2616, 0, 2390, +2613, 0, 2371, +2613, 0, 2338, +2613, 0, 2290, +2613, 0, 2216, +2613, 0, 2093, +2613, 0, 1851, +2613, 0, 547, +2613, 0, 0, +2613, 2045, 0, +2748, 2504, 0, +2882, 2784, 0, +3015, 3001, 0, +3106, 3149, 0, +3191, 3281, 0, +3284, 3414, 0, +3385, 3547, 0, +3493, 3679, 0, +3605, 3812, 0, +3722, 3944, 0, +3843, 4076, 0, +3966, 4095, 0, +2755, 0, 2552, +2755, 0, 2551, +2755, 0, 2550, +2755, 0, 2549, +2755, 0, 2547, +2754, 0, 2545, +2754, 0, 2541, +2753, 0, 2537, +2752, 0, 2532, +2751, 0, 2524, +2750, 0, 2514, +2748, 0, 2499, +2748, 0, 2474, +2748, 0, 2439, +2748, 0, 2387, +2748, 0, 2306, +2748, 0, 2170, +2748, 0, 1885, +2748, 0, 0, +2748, 0, 0, +2748, 2155, 0, +2882, 2628, 0, +3015, 2911, 0, +3149, 3131, 0, +3242, 3281, 0, +3326, 3414, 0, +3419, 3547, 0, +3520, 3679, 0, +3626, 3812, 0, +3739, 3944, 0, +3855, 4076, 0, +3976, 4095, 0, +2887, 0, 2668, +2887, 0, 2667, +2887, 0, 2667, +2887, 0, 2666, +2887, 0, 2664, +2887, 0, 2662, +2886, 0, 2660, +2886, 0, 2657, +2885, 0, 2652, +2885, 0, 2647, +2883, 0, 2639, +2882, 0, 2628, +2882, 0, 2609, +2882, 0, 2583, +2882, 0, 2546, +2882, 0, 2491, +2882, 0, 2405, +2882, 0, 2256, +2882, 0, 1925, +2882, 0, 0, +2882, 0, 0, +2882, 2269, 0, +3015, 2753, 0, +3149, 3040, 0, +3281, 3260, 0, +3376, 3414, 0, +3461, 3547, 0, +3553, 3679, 0, +3653, 3812, 0, +3760, 3944, 0, +3872, 4076, 0, +3988, 4095, 0, +3019, 0, 2788, +3019, 0, 2787, +3019, 0, 2787, +3019, 0, 2786, +3019, 0, 2785, +3019, 0, 2784, +3018, 0, 2782, +3018, 0, 2779, +3018, 0, 2776, +3017, 0, 2771, +3016, 0, 2765, +3015, 0, 2757, +3015, 0, 2743, +3015, 0, 2724, +3015, 0, 2697, +3015, 0, 2658, +3015, 0, 2600, +3015, 0, 2510, +3015, 0, 2350, +3015, 0, 1974, +3015, 0, 0, +3015, 0, 0, +3015, 2387, 0, +3149, 2881, 0, +3281, 3169, 0, +3414, 3391, 0, +3511, 3547, 0, +3595, 3679, 0, +3687, 3812, 0, +3786, 3944, 0, +3892, 4076, 0, +4005, 4095, 0, +3152, 0, 2911, +3152, 0, 2910, +3152, 0, 2910, +3151, 0, 2909, +3151, 0, 2908, +3151, 0, 2907, +3151, 0, 2906, +3151, 0, 2904, +3151, 0, 2902, +3150, 0, 2898, +3150, 0, 2894, +3149, 0, 2887, +3149, 0, 2877, +3149, 0, 2863, +3149, 0, 2843, +3149, 0, 2815, +3149, 0, 2775, +3149, 0, 2715, +3149, 0, 2620, +3149, 0, 2452, +3149, 0, 2033, +3149, 0, 0, +3149, 0, 0, +3149, 2509, 0, +3281, 3009, 0, +3414, 3299, 0, +3547, 3522, 0, +3644, 3679, 0, +3728, 3812, 0, +3820, 3944, 0, +3919, 4076, 0, +4026, 4095, 0, +3284, 0, 3035, +3283, 0, 3035, +3283, 0, 3035, +3283, 0, 3034, +3283, 0, 3034, +3283, 0, 3033, +3283, 0, 3032, +3283, 0, 3031, +3283, 0, 3029, +3282, 0, 3026, +3282, 0, 3023, +3281, 0, 3018, +3281, 0, 3010, +3281, 0, 2999, +3281, 0, 2985, +3281, 0, 2965, +3281, 0, 2936, +3281, 0, 2895, +3281, 0, 2833, +3281, 0, 2735, +3281, 0, 2558, +3281, 0, 2100, +3281, 0, 0, +3281, 0, 0, +3281, 2633, 0, +3414, 3139, 0, +3547, 3430, 0, +3679, 3653, 0, +3777, 3812, 0, +3861, 3944, 0, +3953, 4076, 0, +4052, 4095, 0, +3416, 0, 3162, +3416, 0, 3162, +3416, 0, 3162, +3416, 0, 3161, +3416, 0, 3161, +3416, 0, 3160, +3415, 0, 3160, +3415, 0, 3158, +3415, 0, 3157, +3415, 0, 3155, +3414, 0, 3152, +3414, 0, 3149, +3414, 0, 3143, +3414, 0, 3135, +3414, 0, 3125, +3414, 0, 3110, +3414, 0, 3089, +3414, 0, 3060, +3414, 0, 3018, +3414, 0, 2956, +3414, 0, 2855, +3414, 0, 2672, +3414, 0, 2180, +3414, 0, 0, +3414, 0, 0, +3414, 2759, 0, +3547, 3269, 0, +3679, 3562, 0, +3812, 3785, 0, +3910, 3944, 0, +3994, 4076, 0, +4085, 4095, 0, +3548, 0, 3290, +3548, 0, 3290, +3548, 0, 3290, +3548, 0, 3290, +3548, 0, 3289, +3548, 0, 3289, +3548, 0, 3288, +3548, 0, 3287, +3548, 0, 3286, +3547, 0, 3285, +3547, 0, 3283, +3547, 0, 3280, +3547, 0, 3276, +3547, 0, 3270, +3547, 0, 3262, +3547, 0, 3251, +3547, 0, 3236, +3547, 0, 3216, +3547, 0, 3186, +3547, 0, 3144, +3547, 0, 3080, +3547, 0, 2977, +3547, 0, 2790, +3547, 0, 2265, +3547, 0, 0, +3547, 0, 0, +3547, 2886, 0, +3679, 3400, 0, +3812, 3693, 0, +3944, 3916, 0, +4043, 4076, 0, +4095, 4095, 0, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3418, +3680, 0, 3418, +3680, 0, 3417, +3680, 0, 3416, +3680, 0, 3415, +3679, 0, 3414, +3679, 0, 3412, +3679, 0, 3409, +3679, 0, 3404, +3679, 0, 3398, +3679, 0, 3390, +3679, 0, 3379, +3679, 0, 3364, +3679, 0, 3343, +3679, 0, 3314, +3679, 0, 3271, +3679, 0, 3206, +3679, 0, 3102, +3679, 0, 2910, +3679, 0, 2363, +3679, 0, 0, +3679, 0, 0, +3679, 3015, 0, +3812, 3531, 0, +3944, 3824, 0, +4076, 4048, 0, +4095, 4095, 0, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3548, +3812, 0, 3548, +3812, 0, 3548, +3812, 0, 3547, +3812, 0, 3546, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3541, +3812, 0, 3538, +3812, 0, 3533, +3812, 0, 3528, +3812, 0, 3520, +3812, 0, 3508, +3812, 0, 3493, +3812, 0, 3472, +3812, 0, 3442, +3812, 0, 3399, +3812, 0, 3333, +3812, 0, 3228, +3812, 0, 3034, +3812, 0, 2465, +3812, 0, 0, +3812, 0, 0, +3812, 3145, 0, +3944, 3662, 0, +4076, 3956, 0, +4095, 4095, 0, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3673, +3944, 0, 3671, +3944, 0, 3668, +3944, 0, 3663, +3944, 0, 3657, +3944, 0, 3649, +3944, 0, 3638, +3944, 0, 3623, +3944, 0, 3602, +3944, 0, 3571, +3944, 0, 3528, +3944, 0, 3462, +3944, 0, 3356, +3944, 0, 3159, +3944, 0, 2572, +3944, 0, 0, +3944, 0, 0, +3944, 3275, 0, +4076, 3793, 0, +4095, 4088, 0, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3801, +4076, 0, 3798, +4076, 0, 3794, +4076, 0, 3787, +4076, 0, 3780, +4076, 0, 3768, +4076, 0, 3753, +4076, 0, 3732, +4076, 0, 3701, +4076, 0, 3658, +4076, 0, 3592, +4076, 0, 3485, +4076, 0, 3286, +4076, 0, 2684, +4076, 0, 0, +4076, 0, 0, +4076, 3405, 0, +4095, 3926, 0, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3935, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3925, +4095, 0, 3919, +4095, 0, 3910, +4095, 0, 3899, +4095, 0, 3884, +4095, 0, 3863, +4095, 0, 3832, +4095, 0, 3788, +4095, 0, 3722, +4095, 0, 3615, +4095, 0, 3415, +4095, 0, 2804, +4095, 0, 0, +4095, 0, 0, +4095, 3537, 0, +0, 1434, 1696, +0, 1444, 1696, +0, 1457, 1696, +0, 1475, 1696, +0, 1496, 1696, +0, 1524, 1696, +0, 1559, 1696, +0, 1601, 1696, +0, 1653, 1696, +0, 1696, 1677, +0, 1696, 1587, +0, 1696, 1427, +0, 1696, 1056, +0, 1828, 0, +0, 1961, 0, +814, 2094, 0, +1457, 2226, 0, +1775, 2358, 0, +2009, 2491, 0, +2205, 2623, 0, +2379, 2755, 0, +2541, 2887, 0, +2693, 3019, 0, +2840, 3152, 0, +2983, 3284, 0, +3123, 3416, 0, +3261, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3667, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1424, 1696, +0, 1436, 1695, +0, 1450, 1695, +0, 1467, 1695, +0, 1489, 1695, +0, 1517, 1695, +0, 1552, 1695, +0, 1596, 1695, +0, 1647, 1695, +0, 1695, 1680, +0, 1695, 1590, +0, 1695, 1432, +0, 1695, 1066, +0, 1828, 0, +0, 1961, 0, +859, 2093, 0, +1469, 2226, 0, +1781, 2358, 0, +2013, 2491, 0, +2207, 2623, 0, +2381, 2755, 0, +2542, 2887, 0, +2694, 3019, 0, +2841, 3152, 0, +2983, 3283, 0, +3123, 3416, 0, +3261, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3667, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1410, 1696, +0, 1422, 1695, +0, 1439, 1693, +0, 1456, 1693, +0, 1479, 1693, +0, 1508, 1693, +0, 1544, 1693, +0, 1588, 1693, +0, 1640, 1693, +0, 1693, 1683, +0, 1693, 1594, +0, 1693, 1439, +0, 1693, 1080, +0, 1827, 0, +0, 1960, 0, +913, 2093, 0, +1484, 2225, 0, +1788, 2358, 0, +2017, 2490, 0, +2210, 2623, 0, +2383, 2755, 0, +2543, 2887, 0, +2695, 3019, 0, +2842, 3152, 0, +2984, 3283, 0, +3124, 3416, 0, +3261, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1390, 1696, +0, 1403, 1695, +0, 1420, 1693, +0, 1442, 1691, +0, 1465, 1691, +0, 1495, 1691, +0, 1532, 1691, +0, 1577, 1691, +0, 1631, 1691, +0, 1691, 1688, +0, 1691, 1600, +0, 1691, 1447, +0, 1691, 1098, +0, 1825, 0, +0, 1959, 0, +977, 2092, 0, +1503, 2225, 0, +1798, 2357, 0, +2023, 2490, 0, +2214, 2622, 0, +2386, 2755, 0, +2545, 2887, 0, +2696, 3019, 0, +2842, 3151, 0, +2985, 3283, 0, +3124, 3416, 0, +3262, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1362, 1696, +0, 1376, 1695, +0, 1394, 1693, +0, 1417, 1691, +0, 1446, 1689, +0, 1477, 1689, +0, 1515, 1689, +0, 1562, 1689, +0, 1617, 1689, +0, 1683, 1689, +0, 1689, 1608, +0, 1689, 1457, +0, 1689, 1120, +0, 1823, 0, +0, 1958, 0, +1050, 2091, 0, +1527, 2224, 0, +1811, 2357, 0, +2031, 2489, 0, +2219, 2622, 0, +2389, 2755, 0, +2548, 2887, 0, +2698, 3019, 0, +2844, 3151, 0, +2986, 3283, 0, +3125, 3416, 0, +3262, 3548, 0, +3399, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1322, 1696, +0, 1337, 1695, +0, 1357, 1693, +0, 1382, 1691, +0, 1413, 1689, +0, 1452, 1685, +0, 1492, 1685, +0, 1541, 1685, +0, 1599, 1685, +0, 1667, 1685, +0, 1685, 1618, +0, 1685, 1471, +0, 1685, 1149, +0, 1821, 0, +0, 1956, 0, +1133, 2089, 0, +1557, 2223, 0, +1828, 2356, 0, +2041, 2489, 0, +2226, 2621, 0, +2394, 2754, 0, +2551, 2887, 0, +2701, 3019, 0, +2845, 3151, 0, +2987, 3283, 0, +3126, 3416, 0, +3263, 3548, 0, +3399, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 1262, 1696, +0, 1279, 1695, +0, 1302, 1693, +0, 1330, 1691, +0, 1365, 1689, +0, 1408, 1685, +0, 1460, 1681, +0, 1512, 1681, +0, 1574, 1681, +0, 1645, 1681, +0, 1681, 1631, +0, 1681, 1489, +0, 1681, 1184, +0, 1817, 0, +0, 1953, 0, +1224, 2087, 0, +1596, 2221, 0, +1849, 2355, 0, +2055, 2488, 0, +2235, 2621, 0, +2400, 2754, 0, +2555, 2886, 0, +2703, 3018, 0, +2848, 3151, 0, +2988, 3283, 0, +3127, 3415, 0, +3264, 3548, 0, +3400, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 1167, 1696, +0, 1188, 1695, +0, 1216, 1693, +0, 1249, 1691, +0, 1291, 1689, +0, 1341, 1685, +0, 1401, 1681, +0, 1470, 1674, +0, 1537, 1674, +0, 1614, 1674, +0, 1674, 1648, +0, 1674, 1512, +0, 1674, 1228, +0, 1813, 0, +670, 1950, 0, +1322, 2085, 0, +1642, 2220, 0, +1876, 2353, 0, +2072, 2487, 0, +2247, 2620, 0, +2408, 2753, 0, +2561, 2886, 0, +2708, 3018, 0, +2851, 3151, 0, +2991, 3283, 0, +3129, 3415, 0, +3265, 3548, 0, +3401, 3680, 0, +3535, 3812, 0, +3669, 3944, 0, +3802, 4076, 0, +3936, 4095, 0, +0, 998, 1696, +0, 1029, 1695, +0, 1067, 1693, +0, 1113, 1691, +0, 1169, 1689, +0, 1233, 1685, +0, 1308, 1681, +0, 1391, 1674, +608, 1483, 1666, +608, 1569, 1666, +608, 1663, 1666, +608, 1666, 1541, +608, 1666, 1281, +0, 1807, 438, +1007, 1945, 0, +1428, 2082, 0, +1697, 2217, 0, +1910, 2352, 0, +2094, 2486, 0, +2262, 2619, 0, +2419, 2752, 0, +2569, 2885, 0, +2714, 3018, 0, +2855, 3151, 0, +2994, 3283, 0, +3131, 3415, 0, +3267, 3548, 0, +3402, 3680, 0, +3536, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 580, 1696, +0, 653, 1695, +0, 736, 1693, +0, 827, 1691, +0, 926, 1689, +0, 1031, 1685, +0, 1142, 1681, +0, 1258, 1674, +608, 1378, 1666, +959, 1500, 1654, +959, 1608, 1654, +959, 1654, 1577, +959, 1654, 1343, +742, 1798, 740, +1248, 1939, 0, +1539, 2077, 0, +1762, 2214, 0, +1951, 2349, 0, +2122, 2484, 0, +2281, 2618, 0, +2433, 2751, 0, +2579, 2885, 0, +2721, 3017, 0, +2860, 3150, 0, +2998, 3282, 0, +3134, 3415, 0, +3269, 3547, 0, +3404, 3680, 0, +3537, 3812, 0, +3671, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 0, 1696, +0, 0, 1695, +0, 0, 1693, +0, 0, 1691, +0, 0, 1689, +0, 406, 1685, +0, 742, 1681, +0, 983, 1674, +608, 1183, 1666, +959, 1360, 1654, +1205, 1522, 1638, +1205, 1638, 1621, +1205, 1638, 1414, +1189, 1787, 1090, +1447, 1930, 872, +1655, 2071, 79, +1836, 2209, 0, +2002, 2346, 0, +2158, 2481, 0, +2306, 2616, 0, +2451, 2750, 0, +2592, 2883, 0, +2731, 3016, 0, +2868, 3150, 0, +3003, 3282, 0, +3138, 3414, 0, +3272, 3547, 0, +3406, 3679, 0, +3539, 3812, 0, +3672, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 0, 1696, +0, 0, 1695, +0, 0, 1693, +0, 0, 1691, +0, 0, 1689, +0, 0, 1685, +0, 0, 1681, +313, 0, 1674, +609, 608, 1666, +959, 1056, 1654, +1205, 1333, 1638, +1407, 1550, 1616, +1407, 1616, 1495, +1466, 1771, 1337, +1624, 1919, 1223, +1774, 2062, 1005, +1920, 2203, 217, +2061, 2341, 0, +2201, 2478, 0, +2338, 2613, 0, +2474, 2748, 0, +2609, 2882, 0, +2743, 3015, 0, +2877, 3149, 0, +3010, 3281, 0, +3143, 3414, 0, +3276, 3547, 0, +3409, 3679, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +1056, 0, 1696, +1066, 0, 1695, +1080, 0, 1693, +1098, 0, 1691, +1120, 0, 1689, +1149, 0, 1685, +1184, 0, 1681, +1228, 0, 1674, +1281, 608, 1666, +1343, 959, 1654, +1414, 1205, 1638, +1495, 1407, 1616, +1585, 1585, 1585, +1682, 1748, 1539, +1787, 1903, 1469, +1897, 2051, 1355, +2012, 2194, 1136, +2131, 2335, 345, +2253, 2473, 0, +2377, 2610, 0, +2503, 2746, 0, +2631, 2880, 0, +2759, 3014, 0, +2889, 3148, 0, +3019, 3280, 0, +3150, 3414, 0, +3281, 3546, 0, +3413, 3679, 0, +3544, 3811, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1557, 0, 1828, +1560, 0, 1828, +1565, 0, 1827, +1571, 0, 1825, +1579, 0, 1823, +1590, 0, 1821, +1604, 0, 1817, +1622, 0, 1813, +1644, 0, 1807, +1673, 740, 1798, +1709, 1090, 1787, +1754, 1337, 1771, +1748, 1539, 1682, +1748, 1627, 1539, +1903, 1885, 1469, +2004, 2051, 1355, +2097, 2194, 1136, +2198, 2335, 345, +2305, 2473, 0, +2417, 2610, 0, +2534, 2746, 0, +2654, 2880, 0, +2777, 3014, 0, +2903, 3148, 0, +3029, 3280, 0, +3158, 3414, 0, +3287, 3546, 0, +3417, 3679, 0, +3547, 3811, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1847, 0, 1961, +1849, 0, 1961, +1851, 0, 1960, +1854, 0, 1959, +1859, 0, 1958, +1865, 0, 1956, +1872, 0, 1953, +1882, 0, 1950, +1895, 0, 1945, +1912, 0, 1939, +1930, 872, 1927, +1919, 1223, 1872, +1903, 1469, 1787, +1903, 1469, 1598, +1903, 1678, 1469, +2051, 1973, 1355, +2191, 2194, 1136, +2274, 2335, 345, +2366, 2473, 0, +2466, 2610, 0, +2572, 2746, 0, +2684, 2880, 0, +2800, 3014, 0, +2920, 3148, 0, +3043, 3280, 0, +3168, 3414, 0, +3294, 3546, 0, +3422, 3679, 0, +3552, 3811, 0, +3681, 3944, 0, +3812, 4076, 0, +3942, 4095, 0, +2069, 0, 2094, +2070, 0, 2093, +2071, 0, 2093, +2073, 0, 2092, +2076, 0, 2091, +2080, 0, 2089, +2085, 0, 2087, +2085, 0, 2079, +2082, 0, 2063, +2077, 0, 2041, +2071, 79, 2010, +2062, 1005, 1965, +2051, 1355, 1897, +2051, 1355, 1756, +2051, 1355, 1453, +2051, 1739, 1355, +2194, 2069, 1136, +2335, 2308, 345, +2438, 2473, 0, +2524, 2610, 0, +2619, 2746, 0, +2721, 2880, 0, +2829, 3014, 0, +2942, 3148, 0, +3060, 3280, 0, +3181, 3414, 0, +3304, 3546, 0, +3430, 3679, 0, +3557, 3811, 0, +3685, 3944, 0, +3814, 4076, 0, +3945, 4095, 0, +2226, 0, 2191, +2226, 0, 2190, +2225, 0, 2188, +2225, 0, 2185, +2224, 0, 2181, +2223, 0, 2176, +2221, 0, 2169, +2220, 0, 2159, +2217, 0, 2146, +2214, 0, 2128, +2209, 0, 2102, +2203, 217, 2066, +2194, 1136, 2012, +2194, 1136, 1906, +2194, 1136, 1711, +2194, 1136, 1137, +2194, 1809, 1136, +2335, 2173, 345, +2473, 2423, 0, +2592, 2610, 0, +2674, 2746, 0, +2766, 2880, 0, +2865, 3014, 0, +2970, 3148, 0, +3082, 3280, 0, +3198, 3414, 0, +3317, 3546, 0, +3440, 3679, 0, +3564, 3811, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2358, 0, 2275, +2358, 0, 2273, +2358, 0, 2271, +2357, 0, 2269, +2357, 0, 2266, +2356, 0, 2262, +2355, 0, 2256, +2353, 0, 2248, +2352, 0, 2237, +2349, 0, 2223, +2346, 0, 2202, +2341, 0, 2173, +2335, 345, 2131, +2335, 345, 2052, +2335, 345, 1919, +2335, 345, 1644, +2335, 970, 345, +2335, 1889, 345, +2473, 2282, 0, +2610, 2543, 0, +2740, 2746, 0, +2820, 2880, 0, +2908, 3014, 0, +3005, 3148, 0, +3109, 3280, 0, +3219, 3414, 0, +3334, 3546, 0, +3453, 3679, 0, +3574, 3811, 0, +3699, 3944, 0, +3824, 4076, 0, +3952, 4095, 0, +2491, 0, 2367, +2491, 0, 2366, +2490, 0, 2364, +2490, 0, 2362, +2489, 0, 2360, +2489, 0, 2356, +2488, 0, 2352, +2487, 0, 2345, +2486, 0, 2336, +2484, 0, 2325, +2481, 0, 2308, +2478, 0, 2285, +2473, 0, 2253, +2473, 0, 2194, +2473, 0, 2100, +2473, 0, 1935, +2473, 0, 1535, +2473, 557, 0, +2473, 1977, 0, +2610, 2396, 0, +2746, 2665, 0, +2880, 2877, 0, +2961, 3014, 0, +3049, 3148, 0, +3144, 3280, 0, +3247, 3414, 0, +3355, 3546, 0, +3469, 3679, 0, +3587, 3811, 0, +3708, 3944, 0, +3832, 4076, 0, +3958, 4095, 0, +2623, 0, 2466, +2623, 0, 2465, +2623, 0, 2464, +2622, 0, 2463, +2622, 0, 2460, +2621, 0, 2458, +2621, 0, 2454, +2620, 0, 2449, +2619, 0, 2442, +2618, 0, 2432, +2616, 0, 2420, +2613, 0, 2402, +2610, 0, 2377, +2610, 0, 2333, +2610, 0, 2266, +2610, 0, 2158, +2610, 0, 1956, +2610, 0, 1330, +2610, 0, 0, +2610, 2073, 0, +2746, 2515, 0, +2880, 2789, 0, +3014, 3004, 0, +3100, 3148, 0, +3186, 3280, 0, +3281, 3414, 0, +3382, 3546, 0, +3490, 3679, 0, +3604, 3811, 0, +3721, 3944, 0, +3841, 4076, 0, +3965, 4095, 0, +2755, 0, 2573, +2755, 0, 2572, +2755, 0, 2571, +2755, 0, 2570, +2755, 0, 2568, +2754, 0, 2566, +2754, 0, 2563, +2753, 0, 2559, +2752, 0, 2553, +2751, 0, 2546, +2750, 0, 2536, +2748, 0, 2522, +2746, 0, 2503, +2746, 0, 2470, +2746, 0, 2422, +2746, 0, 2348, +2746, 0, 2226, +2746, 0, 1983, +2746, 0, 678, +2746, 0, 0, +2746, 2177, 0, +2880, 2636, 0, +3014, 2915, 0, +3148, 3133, 0, +3238, 3280, 0, +3323, 3414, 0, +3416, 3546, 0, +3517, 3679, 0, +3625, 3811, 0, +3737, 3944, 0, +3854, 4076, 0, +3975, 4095, 0, +2887, 0, 2684, +2887, 0, 2684, +2887, 0, 2683, +2887, 0, 2682, +2887, 0, 2681, +2887, 0, 2679, +2886, 0, 2677, +2886, 0, 2673, +2885, 0, 2669, +2885, 0, 2664, +2883, 0, 2656, +2882, 0, 2645, +2880, 0, 2631, +2880, 0, 2606, +2880, 0, 2571, +2880, 0, 2519, +2880, 0, 2439, +2880, 0, 2302, +2880, 0, 2016, +2880, 0, 0, +2880, 0, 0, +2880, 2287, 0, +3014, 2759, 0, +3148, 3043, 0, +3280, 3262, 0, +3374, 3414, 0, +3458, 3546, 0, +3551, 3679, 0, +3652, 3811, 0, +3758, 3944, 0, +3871, 4076, 0, +3988, 4095, 0, +3019, 0, 2800, +3019, 0, 2800, +3019, 0, 2799, +3019, 0, 2798, +3019, 0, 2797, +3019, 0, 2796, +3018, 0, 2794, +3018, 0, 2792, +3018, 0, 2789, +3017, 0, 2784, +3016, 0, 2778, +3015, 0, 2770, +3014, 0, 2759, +3014, 0, 2741, +3014, 0, 2715, +3014, 0, 2678, +3014, 0, 2623, +3014, 0, 2536, +3014, 0, 2388, +3014, 0, 2056, +3014, 0, 0, +3014, 0, 0, +3014, 2401, 0, +3148, 2886, 0, +3280, 3172, 0, +3414, 3393, 0, +3509, 3546, 0, +3593, 3679, 0, +3685, 3811, 0, +3785, 3944, 0, +3891, 4076, 0, +4004, 4095, 0, +3152, 0, 2920, +3152, 0, 2920, +3152, 0, 2919, +3151, 0, 2919, +3151, 0, 2918, +3151, 0, 2917, +3151, 0, 2916, +3151, 0, 2914, +3151, 0, 2911, +3150, 0, 2908, +3150, 0, 2904, +3149, 0, 2898, +3148, 0, 2889, +3148, 0, 2875, +3148, 0, 2856, +3148, 0, 2829, +3148, 0, 2790, +3148, 0, 2733, +3148, 0, 2642, +3148, 0, 2482, +3148, 0, 2106, +3148, 0, 0, +3148, 0, 0, +3148, 2520, 0, +3280, 3013, 0, +3414, 3301, 0, +3546, 3523, 0, +3643, 3679, 0, +3727, 3811, 0, +3819, 3944, 0, +3918, 4076, 0, +4025, 4095, 0, +3284, 0, 3043, +3283, 0, 3042, +3283, 0, 3042, +3283, 0, 3042, +3283, 0, 3041, +3283, 0, 3040, +3283, 0, 3039, +3283, 0, 3038, +3283, 0, 3036, +3282, 0, 3033, +3282, 0, 3030, +3281, 0, 3025, +3280, 0, 3019, +3280, 0, 3009, +3280, 0, 2995, +3280, 0, 2975, +3280, 0, 2947, +3280, 0, 2907, +3280, 0, 2847, +3280, 0, 2752, +3280, 0, 2583, +3280, 0, 2164, +3280, 0, 0, +3280, 0, 0, +3280, 2641, 0, +3414, 3142, 0, +3546, 3432, 0, +3679, 3654, 0, +3777, 3811, 0, +3860, 3944, 0, +3952, 4076, 0, +4051, 4095, 0, +3416, 0, 3168, +3416, 0, 3168, +3416, 0, 3167, +3416, 0, 3167, +3416, 0, 3166, +3416, 0, 3166, +3415, 0, 3165, +3415, 0, 3164, +3415, 0, 3163, +3415, 0, 3161, +3414, 0, 3158, +3414, 0, 3155, +3414, 0, 3150, +3414, 0, 3142, +3414, 0, 3132, +3414, 0, 3117, +3414, 0, 3097, +3414, 0, 3069, +3414, 0, 3027, +3414, 0, 2966, +3414, 0, 2867, +3414, 0, 2691, +3414, 0, 2234, +3414, 0, 0, +3414, 0, 0, +3414, 2765, 0, +3546, 3271, 0, +3679, 3563, 0, +3811, 3785, 0, +3910, 3944, 0, +3993, 4076, 0, +4085, 4095, 0, +3548, 0, 3294, +3548, 0, 3294, +3548, 0, 3294, +3548, 0, 3294, +3548, 0, 3293, +3548, 0, 3293, +3548, 0, 3292, +3548, 0, 3292, +3548, 0, 3291, +3547, 0, 3289, +3547, 0, 3287, +3547, 0, 3285, +3546, 0, 3281, +3546, 0, 3275, +3546, 0, 3268, +3546, 0, 3257, +3546, 0, 3242, +3546, 0, 3221, +3546, 0, 3192, +3546, 0, 3151, +3546, 0, 3087, +3546, 0, 2987, +3546, 0, 2804, +3546, 0, 2311, +3546, 0, 0, +3546, 0, 0, +3546, 2891, 0, +3679, 3401, 0, +3811, 3694, 0, +3944, 3917, 0, +4043, 4076, 0, +4095, 4095, 0, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3421, +3680, 0, 3421, +3680, 0, 3420, +3680, 0, 3420, +3680, 0, 3418, +3679, 0, 3417, +3679, 0, 3415, +3679, 0, 3413, +3679, 0, 3408, +3679, 0, 3402, +3679, 0, 3394, +3679, 0, 3384, +3679, 0, 3368, +3679, 0, 3348, +3679, 0, 3318, +3679, 0, 3276, +3679, 0, 3212, +3679, 0, 3110, +3679, 0, 2922, +3679, 0, 2400, +3679, 0, 0, +3679, 0, 0, +3679, 3018, 0, +3811, 3532, 0, +3944, 3825, 0, +4076, 4048, 0, +4095, 4095, 0, +3812, 0, 3552, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3550, +3812, 0, 3550, +3812, 0, 3549, +3812, 0, 3548, +3812, 0, 3547, +3812, 0, 3546, +3811, 0, 3544, +3811, 0, 3541, +3811, 0, 3536, +3811, 0, 3530, +3811, 0, 3522, +3811, 0, 3511, +3811, 0, 3496, +3811, 0, 3475, +3811, 0, 3446, +3811, 0, 3403, +3811, 0, 3338, +3811, 0, 3234, +3811, 0, 3043, +3811, 0, 2494, +3811, 0, 0, +3811, 0, 0, +3811, 3147, 0, +3944, 3663, 0, +4076, 3956, 0, +4095, 4095, 0, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3680, +3944, 0, 3680, +3944, 0, 3680, +3944, 0, 3679, +3944, 0, 3678, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3673, +3944, 0, 3670, +3944, 0, 3666, +3944, 0, 3659, +3944, 0, 3651, +3944, 0, 3640, +3944, 0, 3625, +3944, 0, 3604, +3944, 0, 3574, +3944, 0, 3531, +3944, 0, 3466, +3944, 0, 3361, +3944, 0, 3166, +3944, 0, 2596, +3944, 0, 0, +3944, 0, 0, +3944, 3277, 0, +4076, 3794, 0, +4095, 4088, 0, +4076, 0, 3812, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3805, +4076, 0, 3803, +4076, 0, 3800, +4076, 0, 3795, +4076, 0, 3789, +4076, 0, 3781, +4076, 0, 3770, +4076, 0, 3755, +4076, 0, 3734, +4076, 0, 3703, +4076, 0, 3660, +4076, 0, 3594, +4076, 0, 3488, +4076, 0, 3291, +4076, 0, 2703, +4076, 0, 0, +4076, 0, 0, +4076, 3407, 0, +4095, 3926, 0, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3936, +4095, 0, 3934, +4095, 0, 3930, +4095, 0, 3926, +4095, 0, 3920, +4095, 0, 3912, +4095, 0, 3901, +4095, 0, 3885, +4095, 0, 3864, +4095, 0, 3834, +4095, 0, 3790, +4095, 0, 3724, +4095, 0, 3617, +4095, 0, 3419, +4095, 0, 2818, +4095, 0, 0, +4095, 0, 0, +4095, 3538, 0, +0, 1565, 1828, +0, 1572, 1828, +0, 1582, 1828, +0, 1596, 1828, +0, 1612, 1828, +0, 1634, 1828, +0, 1661, 1828, +0, 1696, 1828, +0, 1738, 1828, +0, 1789, 1828, +0, 1828, 1807, +0, 1828, 1716, +0, 1828, 1557, +0, 1828, 1180, +0, 1961, 0, +0, 2094, 0, +907, 2226, 0, +1580, 2358, 0, +1903, 2491, 0, +2138, 2623, 0, +2335, 2755, 0, +2510, 2887, 0, +2672, 3019, 0, +2825, 3152, 0, +2972, 3284, 0, +3115, 3416, 0, +3255, 3548, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1557, 1828, +0, 1566, 1828, +0, 1576, 1828, +0, 1590, 1828, +0, 1607, 1828, +0, 1629, 1828, +0, 1656, 1828, +0, 1691, 1828, +0, 1733, 1828, +0, 1785, 1828, +0, 1828, 1810, +0, 1828, 1719, +0, 1828, 1560, +0, 1828, 1188, +0, 1961, 0, +0, 2093, 0, +944, 2226, 0, +1589, 2358, 0, +1907, 2491, 0, +2141, 2623, 0, +2337, 2755, 0, +2511, 2887, 0, +2672, 3019, 0, +2825, 3152, 0, +2972, 3283, 0, +3115, 3416, 0, +3255, 3548, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1547, 1828, +0, 1556, 1828, +0, 1568, 1827, +0, 1582, 1827, +0, 1599, 1827, +0, 1621, 1827, +0, 1650, 1827, +0, 1684, 1827, +0, 1727, 1827, +0, 1779, 1827, +0, 1827, 1812, +0, 1827, 1722, +0, 1827, 1565, +0, 1827, 1198, +0, 1960, 0, +0, 2093, 0, +990, 2225, 0, +1600, 2358, 0, +1913, 2490, 0, +2144, 2623, 0, +2339, 2755, 0, +2513, 2887, 0, +2673, 3019, 0, +2826, 3152, 0, +2973, 3283, 0, +3115, 3416, 0, +3256, 3548, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1532, 1828, +0, 1542, 1828, +0, 1554, 1827, +0, 1571, 1825, +0, 1588, 1825, +0, 1611, 1825, +0, 1640, 1825, +0, 1676, 1825, +0, 1720, 1825, +0, 1772, 1825, +0, 1825, 1816, +0, 1825, 1727, +0, 1825, 1571, +0, 1825, 1212, +0, 1959, 0, +0, 2092, 0, +1044, 2225, 0, +1615, 2357, 0, +1920, 2490, 0, +2149, 2622, 0, +2342, 2755, 0, +2515, 2887, 0, +2675, 3019, 0, +2827, 3151, 0, +2973, 3283, 0, +3116, 3416, 0, +3256, 3548, 0, +3394, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1512, 1828, +0, 1522, 1828, +0, 1535, 1827, +0, 1552, 1825, +0, 1574, 1823, +0, 1598, 1823, +0, 1627, 1823, +0, 1664, 1823, +0, 1709, 1823, +0, 1763, 1823, +0, 1823, 1821, +0, 1823, 1732, +0, 1823, 1579, +0, 1823, 1230, +0, 1958, 0, +0, 2091, 0, +1108, 2224, 0, +1634, 2357, 0, +1930, 2489, 0, +2155, 2622, 0, +2346, 2755, 0, +2517, 2887, 0, +2677, 3019, 0, +2829, 3151, 0, +2974, 3283, 0, +3117, 3416, 0, +3256, 3548, 0, +3394, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 1484, 1828, +0, 1494, 1828, +0, 1508, 1827, +0, 1526, 1825, +0, 1549, 1823, +0, 1579, 1821, +0, 1609, 1821, +0, 1648, 1821, +0, 1694, 1821, +0, 1750, 1821, +0, 1815, 1821, +0, 1821, 1740, +0, 1821, 1590, +0, 1821, 1253, +0, 1956, 0, +0, 2089, 0, +1181, 2223, 0, +1659, 2356, 0, +1943, 2489, 0, +2163, 2621, 0, +2351, 2754, 0, +2521, 2887, 0, +2679, 3019, 0, +2830, 3151, 0, +2976, 3283, 0, +3118, 3416, 0, +3257, 3548, 0, +3395, 3680, 0, +3531, 3812, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 1442, 1828, +0, 1454, 1828, +0, 1469, 1827, +0, 1489, 1825, +0, 1514, 1823, +0, 1545, 1821, +0, 1585, 1817, +0, 1625, 1817, +0, 1673, 1817, +0, 1732, 1817, +0, 1799, 1817, +0, 1817, 1750, +0, 1817, 1604, +0, 1817, 1281, +0, 1953, 0, +0, 2087, 0, +1264, 2221, 0, +1689, 2355, 0, +1960, 2488, 0, +2173, 2621, 0, +2358, 2754, 0, +2526, 2886, 0, +2683, 3018, 0, +2833, 3151, 0, +2977, 3283, 0, +3119, 3415, 0, +3258, 3548, 0, +3395, 3680, 0, +3531, 3812, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 1381, 1828, +0, 1394, 1828, +0, 1412, 1827, +0, 1434, 1825, +0, 1462, 1823, +0, 1497, 1821, +0, 1540, 1817, +0, 1592, 1813, +0, 1644, 1813, +0, 1706, 1813, +0, 1777, 1813, +0, 1813, 1763, +0, 1813, 1622, +0, 1813, 1317, +0, 1950, 0, +10, 2085, 0, +1355, 2220, 0, +1727, 2353, 0, +1981, 2487, 0, +2187, 2620, 0, +2367, 2753, 0, +2532, 2886, 0, +2687, 3018, 0, +2836, 3151, 0, +2980, 3283, 0, +3121, 3415, 0, +3259, 3548, 0, +3396, 3680, 0, +3532, 3812, 0, +3666, 3944, 0, +3801, 4076, 0, +3934, 4095, 0, +0, 1283, 1828, +0, 1300, 1828, +0, 1321, 1827, +0, 1348, 1825, +0, 1382, 1823, +0, 1423, 1821, +0, 1474, 1817, +0, 1533, 1813, +0, 1602, 1807, +0, 1669, 1807, +0, 1746, 1807, +0, 1807, 1780, +0, 1807, 1644, +0, 1807, 1360, +0, 1945, 37, +800, 2082, 0, +1454, 2217, 0, +1773, 2352, 0, +2008, 2486, 0, +2204, 2619, 0, +2379, 2752, 0, +2540, 2885, 0, +2693, 3018, 0, +2840, 3151, 0, +2983, 3283, 0, +3123, 3415, 0, +3261, 3548, 0, +3397, 3680, 0, +3533, 3812, 0, +3667, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1106, 1828, +0, 1131, 1828, +0, 1161, 1827, +0, 1199, 1825, +0, 1245, 1823, +0, 1301, 1821, +0, 1366, 1817, +0, 1440, 1813, +0, 1523, 1807, +740, 1615, 1798, +740, 1701, 1798, +740, 1795, 1798, +740, 1798, 1673, +740, 1798, 1413, +0, 1939, 573, +1138, 2077, 0, +1560, 2214, 0, +1829, 2349, 0, +2042, 2484, 0, +2226, 2618, 0, +2394, 2751, 0, +2551, 2885, 0, +2701, 3017, 0, +2846, 3150, 0, +2987, 3282, 0, +3126, 3415, 0, +3263, 3547, 0, +3399, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 650, 1828, +0, 713, 1828, +0, 786, 1827, +0, 869, 1825, +0, 960, 1823, +0, 1059, 1821, +0, 1164, 1817, +0, 1275, 1813, +0, 1391, 1807, +740, 1510, 1798, +1090, 1633, 1787, +1090, 1740, 1787, +1090, 1787, 1709, +1090, 1787, 1475, +873, 1930, 872, +1379, 2071, 79, +1671, 2209, 0, +1894, 2346, 0, +2084, 2481, 0, +2255, 2616, 0, +2414, 2750, 0, +2565, 2883, 0, +2711, 3016, 0, +2853, 3150, 0, +2992, 3282, 0, +3130, 3414, 0, +3266, 3547, 0, +3401, 3679, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 0, 1828, +0, 0, 1828, +0, 0, 1827, +0, 0, 1825, +0, 0, 1823, +0, 0, 1821, +0, 536, 1817, +0, 874, 1813, +0, 1115, 1807, +740, 1315, 1798, +1090, 1491, 1787, +1337, 1654, 1771, +1337, 1771, 1754, +1337, 1771, 1546, +1321, 1919, 1223, +1579, 2062, 1005, +1787, 2203, 217, +1968, 2341, 0, +2134, 2478, 0, +2290, 2613, 0, +2439, 2748, 0, +2583, 2882, 0, +2724, 3015, 0, +2863, 3149, 0, +2999, 3281, 0, +3135, 3414, 0, +3270, 3547, 0, +3404, 3679, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 0, 1828, +0, 0, 1828, +0, 0, 1827, +0, 0, 1825, +0, 0, 1823, +0, 0, 1821, +0, 0, 1817, +0, 0, 1813, +438, 0, 1807, +740, 742, 1798, +1090, 1189, 1787, +1337, 1466, 1771, +1539, 1682, 1748, +1539, 1748, 1627, +1598, 1903, 1469, +1756, 2051, 1355, +1906, 2194, 1136, +2052, 2335, 345, +2194, 2473, 0, +2333, 2610, 0, +2470, 2746, 0, +2606, 2880, 0, +2741, 3014, 0, +2875, 3148, 0, +3009, 3280, 0, +3142, 3414, 0, +3275, 3546, 0, +3408, 3679, 0, +3541, 3811, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +1180, 0, 1828, +1188, 0, 1828, +1198, 0, 1827, +1212, 0, 1825, +1230, 0, 1823, +1253, 0, 1821, +1281, 0, 1817, +1317, 0, 1813, +1360, 0, 1807, +1413, 740, 1798, +1475, 1090, 1787, +1546, 1337, 1771, +1627, 1539, 1748, +1717, 1717, 1717, +1814, 1880, 1671, +1919, 2035, 1601, +2029, 2183, 1487, +2144, 2326, 1269, +2263, 2467, 477, +2385, 2605, 0, +2509, 2742, 0, +2636, 2878, 0, +2763, 3012, 0, +2892, 3146, 0, +3021, 3280, 0, +3151, 3413, 0, +3282, 3546, 0, +3413, 3678, 0, +3545, 3811, 0, +3676, 3943, 0, +3808, 4076, 0, +3940, 4095, 0, +1686, 0, 1961, +1689, 0, 1961, +1692, 0, 1960, +1697, 0, 1959, +1703, 0, 1958, +1711, 0, 1956, +1722, 0, 1953, +1736, 0, 1950, +1754, 0, 1945, +1776, 0, 1939, +1805, 872, 1930, +1841, 1223, 1919, +1885, 1469, 1903, +1880, 1671, 1814, +1880, 1759, 1671, +2035, 2017, 1601, +2136, 2183, 1487, +2229, 2326, 1269, +2330, 2467, 477, +2437, 2605, 0, +2550, 2742, 0, +2666, 2878, 0, +2786, 3012, 0, +2910, 3146, 0, +3034, 3280, 0, +3162, 3413, 0, +3290, 3546, 0, +3419, 3678, 0, +3549, 3811, 0, +3679, 3943, 0, +3810, 4076, 0, +3941, 4095, 0, +1977, 0, 2094, +1979, 0, 2093, +1981, 0, 2093, +1983, 0, 2092, +1986, 0, 2091, +1991, 0, 2089, +1996, 0, 2087, +2004, 0, 2085, +2014, 0, 2082, +2027, 0, 2077, +2044, 79, 2071, +2062, 1005, 2059, +2051, 1355, 2004, +2035, 1601, 1919, +2035, 1601, 1730, +2035, 1811, 1601, +2183, 2105, 1487, +2323, 2326, 1269, +2407, 2467, 477, +2498, 2605, 0, +2598, 2742, 0, +2704, 2878, 0, +2816, 3012, 0, +2932, 3146, 0, +3052, 3280, 0, +3175, 3413, 0, +3300, 3546, 0, +3426, 3678, 0, +3554, 3811, 0, +3683, 3943, 0, +3813, 4076, 0, +3944, 4095, 0, +2200, 0, 2226, +2201, 0, 2226, +2202, 0, 2225, +2203, 0, 2225, +2206, 0, 2224, +2208, 0, 2223, +2212, 0, 2221, +2217, 0, 2220, +2217, 0, 2211, +2214, 0, 2195, +2209, 0, 2174, +2203, 217, 2142, +2194, 1136, 2097, +2183, 1487, 2029, +2183, 1487, 1888, +2183, 1487, 1585, +2183, 1871, 1487, +2326, 2202, 1269, +2467, 2440, 477, +2570, 2605, 0, +2656, 2742, 0, +2751, 2878, 0, +2853, 3012, 0, +2961, 3146, 0, +3074, 3280, 0, +3192, 3413, 0, +3313, 3546, 0, +3436, 3678, 0, +3562, 3811, 0, +3689, 3943, 0, +3817, 4076, 0, +3947, 4095, 0, +2358, 0, 2325, +2358, 0, 2324, +2358, 0, 2322, +2357, 0, 2320, +2357, 0, 2317, +2356, 0, 2313, +2355, 0, 2308, +2353, 0, 2301, +2352, 0, 2291, +2349, 0, 2278, +2346, 0, 2260, +2341, 0, 2234, +2335, 345, 2198, +2326, 1269, 2144, +2326, 1269, 2038, +2326, 1269, 1843, +2326, 1269, 1270, +2326, 1941, 1269, +2467, 2305, 477, +2605, 2556, 0, +2724, 2742, 0, +2807, 2878, 0, +2898, 3012, 0, +2997, 3146, 0, +3102, 3280, 0, +3214, 3413, 0, +3330, 3546, 0, +3449, 3678, 0, +3572, 3811, 0, +3697, 3943, 0, +3823, 4076, 0, +3951, 4095, 0, +2491, 0, 2408, +2491, 0, 2407, +2490, 0, 2406, +2490, 0, 2404, +2489, 0, 2401, +2489, 0, 2398, +2488, 0, 2394, +2487, 0, 2388, +2486, 0, 2380, +2484, 0, 2369, +2481, 0, 2355, +2478, 0, 2334, +2473, 0, 2305, +2467, 477, 2263, +2467, 477, 2184, +2467, 477, 2051, +2467, 477, 1776, +2467, 1099, 477, +2467, 2021, 477, +2605, 2414, 0, +2742, 2675, 0, +2872, 2878, 0, +2952, 3012, 0, +3041, 3146, 0, +3138, 3280, 0, +3242, 3413, 0, +3351, 3546, 0, +3466, 3678, 0, +3585, 3811, 0, +3706, 3943, 0, +3830, 4076, 0, +3957, 4095, 0, +2623, 0, 2500, +2623, 0, 2499, +2623, 0, 2498, +2622, 0, 2496, +2622, 0, 2494, +2621, 0, 2492, +2621, 0, 2488, +2620, 0, 2483, +2619, 0, 2477, +2618, 0, 2469, +2616, 0, 2456, +2613, 0, 2440, +2610, 0, 2417, +2605, 0, 2385, +2605, 0, 2326, +2605, 0, 2233, +2605, 0, 2067, +2605, 0, 1667, +2605, 705, 0, +2605, 2109, 0, +2742, 2529, 0, +2878, 2797, 0, +3012, 3009, 0, +3093, 3146, 0, +3180, 3280, 0, +3276, 3413, 0, +3379, 3546, 0, +3488, 3678, 0, +3601, 3811, 0, +3719, 3943, 0, +3840, 4076, 0, +3964, 4095, 0, +2755, 0, 2599, +2755, 0, 2598, +2755, 0, 2598, +2755, 0, 2596, +2755, 0, 2595, +2754, 0, 2593, +2754, 0, 2590, +2753, 0, 2586, +2752, 0, 2581, +2751, 0, 2574, +2750, 0, 2565, +2748, 0, 2552, +2746, 0, 2534, +2742, 0, 2509, +2742, 0, 2465, +2742, 0, 2398, +2742, 0, 2291, +2742, 0, 2089, +2742, 0, 1463, +2742, 0, 0, +2742, 2206, 0, +2878, 2647, 0, +3012, 2921, 0, +3146, 3137, 0, +3233, 3280, 0, +3319, 3413, 0, +3413, 3546, 0, +3515, 3678, 0, +3622, 3811, 0, +3736, 3943, 0, +3853, 4076, 0, +3974, 4095, 0, +2887, 0, 2705, +2887, 0, 2705, +2887, 0, 2704, +2887, 0, 2703, +2887, 0, 2702, +2887, 0, 2700, +2886, 0, 2698, +2886, 0, 2695, +2885, 0, 2691, +2885, 0, 2685, +2883, 0, 2678, +2882, 0, 2668, +2880, 0, 2654, +2878, 0, 2636, +2878, 0, 2602, +2878, 0, 2554, +2878, 0, 2480, +2878, 0, 2358, +2878, 0, 2115, +2878, 0, 817, +2878, 0, 0, +2878, 2309, 0, +3012, 2767, 0, +3146, 3047, 0, +3280, 3265, 0, +3370, 3413, 0, +3455, 3546, 0, +3548, 3678, 0, +3650, 3811, 0, +3757, 3943, 0, +3869, 4076, 0, +3986, 4095, 0, +3019, 0, 2816, +3019, 0, 2816, +3019, 0, 2816, +3019, 0, 2815, +3019, 0, 2814, +3019, 0, 2813, +3018, 0, 2811, +3018, 0, 2808, +3018, 0, 2805, +3017, 0, 2801, +3016, 0, 2796, +3015, 0, 2788, +3014, 0, 2777, +3012, 0, 2763, +3012, 0, 2738, +3012, 0, 2703, +3012, 0, 2651, +3012, 0, 2570, +3012, 0, 2434, +3012, 0, 2148, +3012, 0, 0, +3012, 0, 0, +3012, 2419, 0, +3146, 2892, 0, +3280, 3175, 0, +3413, 3395, 0, +3506, 3546, 0, +3590, 3678, 0, +3683, 3811, 0, +3784, 3943, 0, +3890, 4076, 0, +4003, 4095, 0, +3152, 0, 2933, +3152, 0, 2932, +3152, 0, 2932, +3151, 0, 2932, +3151, 0, 2931, +3151, 0, 2930, +3151, 0, 2928, +3151, 0, 2927, +3151, 0, 2924, +3150, 0, 2921, +3150, 0, 2917, +3149, 0, 2911, +3148, 0, 2903, +3146, 0, 2892, +3146, 0, 2873, +3146, 0, 2847, +3146, 0, 2810, +3146, 0, 2755, +3146, 0, 2669, +3146, 0, 2521, +3146, 0, 2189, +3146, 0, 0, +3146, 0, 0, +3146, 2533, 0, +3280, 3017, 0, +3413, 3304, 0, +3546, 3525, 0, +3641, 3678, 0, +3725, 3811, 0, +3817, 3943, 0, +3917, 4076, 0, +4024, 4095, 0, +3284, 0, 3052, +3283, 0, 3052, +3283, 0, 3052, +3283, 0, 3051, +3283, 0, 3051, +3283, 0, 3050, +3283, 0, 3049, +3283, 0, 3047, +3283, 0, 3046, +3282, 0, 3043, +3282, 0, 3040, +3281, 0, 3035, +3280, 0, 3029, +3280, 0, 3021, +3280, 0, 3007, +3280, 0, 2988, +3280, 0, 2961, +3280, 0, 2922, +3280, 0, 2865, +3280, 0, 2773, +3280, 0, 2613, +3280, 0, 2237, +3280, 0, 0, +3280, 0, 0, +3280, 2651, 0, +3413, 3145, 0, +3546, 3434, 0, +3678, 3655, 0, +3775, 3811, 0, +3859, 3943, 0, +3950, 4076, 0, +4051, 4095, 0, +3416, 0, 3175, +3416, 0, 3175, +3416, 0, 3175, +3416, 0, 3174, +3416, 0, 3174, +3416, 0, 3173, +3415, 0, 3173, +3415, 0, 3171, +3415, 0, 3170, +3415, 0, 3168, +3414, 0, 3165, +3414, 0, 3162, +3414, 0, 3158, +3413, 0, 3151, +3413, 0, 3141, +3413, 0, 3127, +3413, 0, 3107, +3413, 0, 3079, +3413, 0, 3039, +3413, 0, 2979, +3413, 0, 2884, +3413, 0, 2715, +3413, 0, 2298, +3413, 0, 0, +3413, 0, 0, +3413, 2773, 0, +3546, 3274, 0, +3678, 3564, 0, +3811, 3786, 0, +3909, 3943, 0, +3992, 4076, 0, +4084, 4095, 0, +3548, 0, 3300, +3548, 0, 3300, +3548, 0, 3300, +3548, 0, 3299, +3548, 0, 3299, +3548, 0, 3299, +3548, 0, 3298, +3548, 0, 3297, +3548, 0, 3296, +3547, 0, 3295, +3547, 0, 3293, +3547, 0, 3290, +3546, 0, 3287, +3546, 0, 3282, +3546, 0, 3275, +3546, 0, 3264, +3546, 0, 3249, +3546, 0, 3229, +3546, 0, 3201, +3546, 0, 3160, +3546, 0, 3098, +3546, 0, 3000, +3546, 0, 2824, +3546, 0, 2365, +3546, 0, 0, +3546, 0, 0, +3546, 2897, 0, +3678, 3403, 0, +3811, 3695, 0, +3943, 3917, 0, +4042, 4076, 0, +4095, 4095, 0, +3680, 0, 3427, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3425, +3680, 0, 3425, +3680, 0, 3424, +3680, 0, 3423, +3679, 0, 3421, +3679, 0, 3419, +3679, 0, 3417, +3678, 0, 3413, +3678, 0, 3407, +3678, 0, 3400, +3678, 0, 3389, +3678, 0, 3374, +3678, 0, 3354, +3678, 0, 3325, +3678, 0, 3282, +3678, 0, 3220, +3678, 0, 3119, +3678, 0, 2936, +3678, 0, 2445, +3678, 0, 0, +3678, 0, 0, +3678, 3023, 0, +3811, 3534, 0, +3943, 3826, 0, +4076, 4049, 0, +4095, 4095, 0, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3553, +3812, 0, 3553, +3812, 0, 3552, +3812, 0, 3552, +3812, 0, 3551, +3812, 0, 3549, +3811, 0, 3547, +3811, 0, 3545, +3811, 0, 3540, +3811, 0, 3534, +3811, 0, 3526, +3811, 0, 3516, +3811, 0, 3501, +3811, 0, 3480, +3811, 0, 3450, +3811, 0, 3408, +3811, 0, 3344, +3811, 0, 3241, +3811, 0, 3054, +3811, 0, 2531, +3811, 0, 0, +3811, 0, 0, +3811, 3151, 0, +3943, 3664, 0, +4076, 3957, 0, +4095, 4095, 0, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3682, +3944, 0, 3682, +3944, 0, 3681, +3944, 0, 3680, +3944, 0, 3679, +3944, 0, 3678, +3943, 0, 3676, +3943, 0, 3673, +3943, 0, 3668, +3943, 0, 3662, +3943, 0, 3655, +3943, 0, 3644, +3943, 0, 3628, +3943, 0, 3607, +3943, 0, 3578, +3943, 0, 3535, +3943, 0, 3470, +3943, 0, 3366, +3943, 0, 3175, +3943, 0, 2625, +3943, 0, 0, +3943, 0, 0, +3943, 3279, 0, +4076, 3795, 0, +4095, 4089, 0, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3811, +4076, 0, 3810, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3805, +4076, 0, 3802, +4076, 0, 3798, +4076, 0, 3792, +4076, 0, 3784, +4076, 0, 3773, +4076, 0, 3757, +4076, 0, 3736, +4076, 0, 3706, +4076, 0, 3663, +4076, 0, 3597, +4076, 0, 3492, +4076, 0, 3297, +4076, 0, 2726, +4076, 0, 0, +4076, 0, 0, +4076, 3409, 0, +4095, 3927, 0, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3943, +4095, 0, 3943, +4095, 0, 3943, +4095, 0, 3943, +4095, 0, 3942, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3938, +4095, 0, 3935, +4095, 0, 3932, +4095, 0, 3927, +4095, 0, 3922, +4095, 0, 3913, +4095, 0, 3903, +4095, 0, 3887, +4095, 0, 3866, +4095, 0, 3836, +4095, 0, 3792, +4095, 0, 3727, +4095, 0, 3621, +4095, 0, 3424, +4095, 0, 2837, +4095, 0, 0, +4095, 0, 0, +4095, 3539, 0, +0, 1696, 1961, +0, 1702, 1961, +0, 1709, 1961, +0, 1719, 1961, +0, 1732, 1961, +0, 1749, 1961, +0, 1770, 1961, +0, 1797, 1961, +0, 1831, 1961, +0, 1873, 1961, +0, 1923, 1961, +0, 1961, 1938, +0, 1961, 1847, +0, 1961, 1686, +0, 1961, 1306, +0, 2094, 0, +0, 2226, 0, +1009, 2358, 0, +1706, 2491, 0, +2032, 2623, 0, +2269, 2755, 0, +2466, 2887, 0, +2641, 3019, 0, +2803, 3152, 0, +2956, 3284, 0, +3104, 3416, 0, +3247, 3548, 0, +3387, 3680, 0, +3525, 3812, 0, +3661, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1690, 1961, +0, 1697, 1961, +0, 1705, 1961, +0, 1715, 1961, +0, 1728, 1961, +0, 1745, 1961, +0, 1766, 1961, +0, 1793, 1961, +0, 1828, 1961, +0, 1870, 1961, +0, 1920, 1961, +0, 1961, 1940, +0, 1961, 1849, +0, 1961, 1689, +0, 1961, 1312, +0, 2093, 0, +0, 2226, 0, +1039, 2358, 0, +1713, 2491, 0, +2035, 2623, 0, +2271, 2755, 0, +2467, 2887, 0, +2642, 3019, 0, +2804, 3152, 0, +2957, 3283, 0, +3104, 3416, 0, +3247, 3548, 0, +3387, 3680, 0, +3525, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1682, 1961, +0, 1689, 1961, +0, 1699, 1960, +0, 1708, 1960, +0, 1722, 1960, +0, 1739, 1960, +0, 1761, 1960, +0, 1789, 1960, +0, 1823, 1960, +0, 1865, 1960, +0, 1917, 1960, +0, 1960, 1941, +0, 1960, 1851, +0, 1960, 1692, +0, 1960, 1320, +0, 2093, 0, +0, 2225, 0, +1076, 2358, 0, +1722, 2490, 0, +2039, 2623, 0, +2274, 2755, 0, +2469, 2887, 0, +2643, 3019, 0, +2805, 3152, 0, +2957, 3283, 0, +3104, 3416, 0, +3247, 3548, 0, +3387, 3680, 0, +3525, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1672, 1961, +0, 1679, 1961, +0, 1688, 1960, +0, 1700, 1959, +0, 1714, 1959, +0, 1731, 1959, +0, 1754, 1959, +0, 1781, 1959, +0, 1817, 1959, +0, 1860, 1959, +0, 1911, 1959, +0, 1959, 1944, +0, 1959, 1854, +0, 1959, 1697, +0, 1959, 1331, +0, 2092, 0, +0, 2225, 0, +1122, 2357, 0, +1733, 2490, 0, +2045, 2622, 0, +2277, 2755, 0, +2471, 2887, 0, +2645, 3019, 0, +2806, 3151, 0, +2958, 3283, 0, +3105, 3416, 0, +3248, 3548, 0, +3388, 3680, 0, +3526, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1657, 1961, +0, 1664, 1961, +0, 1674, 1960, +0, 1686, 1959, +0, 1703, 1958, +0, 1721, 1958, +0, 1743, 1958, +0, 1772, 1958, +0, 1808, 1958, +0, 1852, 1958, +0, 1905, 1958, +0, 1958, 1948, +0, 1958, 1859, +0, 1958, 1703, +0, 1958, 1344, +0, 2091, 0, +0, 2224, 0, +1176, 2357, 0, +1748, 2489, 0, +2052, 2622, 0, +2281, 2755, 0, +2474, 2887, 0, +2647, 3019, 0, +2807, 3151, 0, +2959, 3283, 0, +3106, 3416, 0, +3248, 3548, 0, +3388, 3680, 0, +3526, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1636, 1961, +0, 1644, 1961, +0, 1654, 1960, +0, 1667, 1959, +0, 1684, 1958, +0, 1706, 1956, +0, 1730, 1956, +0, 1759, 1956, +0, 1796, 1956, +0, 1841, 1956, +0, 1895, 1956, +0, 1956, 1953, +0, 1956, 1865, +0, 1956, 1711, +0, 1956, 1362, +0, 2089, 0, +0, 2223, 0, +1240, 2356, 0, +1767, 2489, 0, +2062, 2621, 0, +2287, 2754, 0, +2478, 2887, 0, +2649, 3019, 0, +2809, 3151, 0, +2960, 3283, 0, +3106, 3416, 0, +3249, 3548, 0, +3388, 3680, 0, +3526, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1607, 1961, +0, 1615, 1961, +0, 1626, 1960, +0, 1640, 1959, +0, 1658, 1958, +0, 1681, 1956, +0, 1711, 1953, +0, 1742, 1953, +0, 1779, 1953, +0, 1826, 1953, +0, 1882, 1953, +0, 1947, 1953, +0, 1953, 1872, +0, 1953, 1722, +0, 1953, 1385, +0, 2087, 0, +0, 2221, 0, +1313, 2355, 0, +1791, 2488, 0, +2075, 2621, 0, +2295, 2754, 0, +2483, 2886, 0, +2653, 3018, 0, +2812, 3151, 0, +2962, 3283, 0, +3108, 3415, 0, +3250, 3548, 0, +3389, 3680, 0, +3527, 3812, 0, +3663, 3944, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 1565, 1961, +0, 1574, 1961, +0, 1586, 1960, +0, 1601, 1959, +0, 1621, 1958, +0, 1646, 1956, +0, 1678, 1953, +0, 1716, 1950, +0, 1757, 1950, +0, 1806, 1950, +0, 1864, 1950, +0, 1931, 1950, +0, 1950, 1882, +0, 1950, 1736, +0, 1950, 1413, +0, 2085, 0, +0, 2220, 0, +1396, 2353, 0, +1822, 2487, 0, +2092, 2620, 0, +2305, 2753, 0, +2490, 2886, 0, +2658, 3018, 0, +2815, 3151, 0, +2965, 3283, 0, +3110, 3415, 0, +3251, 3548, 0, +3390, 3680, 0, +3528, 3812, 0, +3663, 3944, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 1503, 1961, +0, 1513, 1961, +0, 1526, 1960, +0, 1544, 1959, +0, 1566, 1958, +0, 1594, 1956, +0, 1629, 1953, +0, 1672, 1950, +0, 1724, 1945, +0, 1776, 1945, +0, 1838, 1945, +0, 1909, 1945, +0, 1945, 1895, +0, 1945, 1754, +0, 1945, 1449, +0, 2082, 0, +140, 2217, 0, +1487, 2352, 0, +1859, 2486, 0, +2113, 2619, 0, +2319, 2752, 0, +2499, 2885, 0, +2664, 3018, 0, +2819, 3151, 0, +2968, 3283, 0, +3112, 3415, 0, +3253, 3548, 0, +3392, 3680, 0, +3528, 3812, 0, +3664, 3944, 0, +3798, 4076, 0, +3933, 4095, 0, +0, 1402, 1961, +0, 1415, 1961, +0, 1431, 1960, +0, 1453, 1959, +0, 1480, 1958, +0, 1514, 1956, +0, 1555, 1953, +0, 1606, 1950, +0, 1665, 1945, +0, 1734, 1939, +0, 1801, 1939, +0, 1878, 1939, +0, 1939, 1912, +0, 1939, 1776, +0, 1939, 1492, +0, 2077, 173, +932, 2214, 0, +1586, 2349, 0, +1906, 2484, 0, +2140, 2618, 0, +2336, 2751, 0, +2511, 2885, 0, +2672, 3017, 0, +2825, 3150, 0, +2972, 3282, 0, +3115, 3415, 0, +3255, 3547, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1220, 1961, +0, 1238, 1961, +0, 1263, 1960, +0, 1294, 1959, +0, 1332, 1958, +0, 1378, 1956, +0, 1433, 1953, +0, 1498, 1950, +0, 1572, 1945, +0, 1655, 1939, +872, 1748, 1930, +872, 1833, 1930, +872, 1927, 1930, +872, 1930, 1805, +872, 1930, 1545, +79, 2071, 706, +1270, 2209, 0, +1692, 2346, 0, +1961, 2481, 0, +2174, 2616, 0, +2359, 2750, 0, +2526, 2883, 0, +2683, 3016, 0, +2833, 3150, 0, +2977, 3282, 0, +3119, 3414, 0, +3258, 3547, 0, +3395, 3679, 0, +3531, 3812, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 726, 1961, +0, 780, 1961, +0, 844, 1960, +0, 917, 1959, +0, 1000, 1958, +0, 1091, 1956, +0, 1190, 1953, +0, 1295, 1950, +0, 1407, 1945, +0, 1523, 1939, +872, 1642, 1930, +1223, 1765, 1919, +1223, 1872, 1919, +1223, 1919, 1841, +1223, 1919, 1607, +1006, 2062, 1005, +1512, 2203, 217, +1803, 2341, 0, +2026, 2478, 0, +2216, 2613, 0, +2387, 2748, 0, +2546, 2882, 0, +2697, 3015, 0, +2843, 3149, 0, +2985, 3281, 0, +3125, 3414, 0, +3262, 3547, 0, +3398, 3679, 0, +3533, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 0, 1961, +0, 0, 1961, +0, 0, 1960, +0, 0, 1959, +0, 0, 1958, +0, 0, 1956, +0, 0, 1953, +0, 670, 1950, +0, 1007, 1945, +0, 1248, 1939, +872, 1447, 1930, +1223, 1624, 1919, +1469, 1787, 1903, +1469, 1903, 1885, +1469, 1903, 1678, +1453, 2051, 1355, +1711, 2194, 1136, +1919, 2335, 345, +2100, 2473, 0, +2266, 2610, 0, +2422, 2746, 0, +2571, 2880, 0, +2715, 3014, 0, +2856, 3148, 0, +2995, 3280, 0, +3132, 3414, 0, +3268, 3546, 0, +3402, 3679, 0, +3536, 3811, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 0, 1961, +0, 0, 1961, +0, 0, 1960, +0, 0, 1959, +0, 0, 1958, +0, 0, 1956, +0, 0, 1953, +0, 0, 1950, +37, 0, 1945, +573, 0, 1939, +872, 873, 1930, +1223, 1321, 1919, +1469, 1598, 1903, +1671, 1814, 1880, +1671, 1880, 1759, +1730, 2035, 1601, +1888, 2183, 1487, +2038, 2326, 1269, +2184, 2467, 477, +2326, 2605, 0, +2465, 2742, 0, +2602, 2878, 0, +2738, 3012, 0, +2873, 3146, 0, +3007, 3280, 0, +3141, 3413, 0, +3275, 3546, 0, +3407, 3678, 0, +3540, 3811, 0, +3673, 3943, 0, +3805, 4076, 0, +3938, 4095, 0, +1306, 0, 1961, +1312, 0, 1961, +1320, 0, 1960, +1331, 0, 1959, +1344, 0, 1958, +1362, 0, 1956, +1385, 0, 1953, +1413, 0, 1950, +1449, 0, 1945, +1492, 0, 1939, +1545, 872, 1930, +1607, 1223, 1919, +1678, 1469, 1903, +1759, 1671, 1880, +1849, 1849, 1849, +1946, 2013, 1803, +2051, 2167, 1733, +2161, 2315, 1619, +2276, 2459, 1401, +2395, 2599, 611, +2517, 2738, 0, +2641, 2874, 0, +2767, 3010, 0, +2895, 3144, 0, +3024, 3278, 0, +3154, 3412, 0, +3284, 3545, 0, +3414, 3678, 0, +3545, 3810, 0, +3677, 3943, 0, +3808, 4075, 0, +3940, 4095, 0, +1816, 0, 2094, +1818, 0, 2093, +1821, 0, 2093, +1824, 0, 2092, +1829, 0, 2091, +1835, 0, 2089, +1843, 0, 2087, +1854, 0, 2085, +1868, 0, 2082, +1886, 0, 2077, +1908, 79, 2071, +1937, 1005, 2062, +1973, 1355, 2051, +2017, 1601, 2035, +2013, 1803, 1946, +2013, 1891, 1803, +2167, 2149, 1733, +2268, 2315, 1619, +2362, 2459, 1401, +2462, 2599, 611, +2569, 2738, 0, +2681, 2874, 0, +2798, 3010, 0, +2919, 3144, 0, +3041, 3278, 0, +3167, 3412, 0, +3294, 3545, 0, +3422, 3678, 0, +3551, 3810, 0, +3681, 3943, 0, +3811, 4075, 0, +3942, 4095, 0, +2108, 0, 2226, +2109, 0, 2226, +2111, 0, 2225, +2112, 0, 2225, +2115, 0, 2224, +2118, 0, 2223, +2123, 0, 2221, +2128, 0, 2220, +2136, 0, 2217, +2146, 0, 2214, +2159, 0, 2209, +2176, 217, 2203, +2194, 1136, 2191, +2183, 1487, 2136, +2167, 1733, 2051, +2167, 1733, 1862, +2167, 1943, 1733, +2315, 2237, 1619, +2455, 2459, 1401, +2538, 2599, 611, +2631, 2738, 0, +2730, 2874, 0, +2836, 3010, 0, +2948, 3144, 0, +3064, 3278, 0, +3184, 3412, 0, +3307, 3545, 0, +3432, 3678, 0, +3559, 3810, 0, +3687, 3943, 0, +3816, 4075, 0, +3945, 4095, 0, +2332, 0, 2358, +2332, 0, 2358, +2333, 0, 2358, +2334, 0, 2357, +2335, 0, 2357, +2338, 0, 2356, +2340, 0, 2355, +2344, 0, 2353, +2349, 0, 2352, +2349, 0, 2343, +2346, 0, 2328, +2341, 0, 2305, +2335, 345, 2274, +2326, 1269, 2229, +2315, 1619, 2161, +2315, 1619, 2020, +2315, 1619, 1718, +2315, 2003, 1619, +2459, 2334, 1401, +2599, 2572, 611, +2702, 2738, 0, +2788, 2874, 0, +2883, 3010, 0, +2985, 3144, 0, +3093, 3278, 0, +3206, 3412, 0, +3324, 3545, 0, +3445, 3678, 0, +3569, 3810, 0, +3694, 3943, 0, +3821, 4075, 0, +3950, 4095, 0, +2491, 0, 2458, +2491, 0, 2457, +2490, 0, 2456, +2490, 0, 2454, +2489, 0, 2452, +2489, 0, 2449, +2488, 0, 2445, +2487, 0, 2440, +2486, 0, 2433, +2484, 0, 2423, +2481, 0, 2410, +2478, 0, 2392, +2473, 0, 2366, +2467, 477, 2330, +2459, 1401, 2276, +2459, 1401, 2171, +2459, 1401, 1976, +2459, 1401, 1403, +2459, 2073, 1401, +2599, 2437, 611, +2738, 2688, 0, +2856, 2874, 0, +2939, 3010, 0, +3030, 3144, 0, +3129, 3278, 0, +3234, 3412, 0, +3346, 3545, 0, +3462, 3678, 0, +3582, 3810, 0, +3704, 3943, 0, +3829, 4075, 0, +3955, 4095, 0, +2623, 0, 2541, +2623, 0, 2540, +2623, 0, 2539, +2622, 0, 2538, +2622, 0, 2536, +2621, 0, 2533, +2621, 0, 2530, +2620, 0, 2526, +2619, 0, 2520, +2618, 0, 2512, +2616, 0, 2501, +2613, 0, 2487, +2610, 0, 2466, +2605, 0, 2437, +2599, 611, 2395, +2599, 611, 2316, +2599, 611, 2183, +2599, 611, 1908, +2599, 1236, 611, +2599, 2153, 611, +2738, 2547, 0, +2874, 2807, 0, +3004, 3010, 0, +3084, 3144, 0, +3173, 3278, 0, +3270, 3412, 0, +3374, 3545, 0, +3483, 3678, 0, +3598, 3810, 0, +3717, 3943, 0, +3838, 4075, 0, +3963, 4095, 0, +2755, 0, 2632, +2755, 0, 2632, +2755, 0, 2631, +2755, 0, 2630, +2755, 0, 2628, +2754, 0, 2627, +2754, 0, 2624, +2753, 0, 2620, +2752, 0, 2616, +2751, 0, 2609, +2750, 0, 2601, +2748, 0, 2589, +2746, 0, 2572, +2742, 0, 2550, +2738, 0, 2517, +2738, 0, 2458, +2738, 0, 2365, +2738, 0, 2200, +2738, 0, 1799, +2738, 817, 0, +2738, 2241, 0, +2874, 2661, 0, +3010, 2928, 0, +3144, 3141, 0, +3225, 3278, 0, +3313, 3412, 0, +3408, 3545, 0, +3511, 3678, 0, +3620, 3810, 0, +3733, 3943, 0, +3851, 4075, 0, +3972, 4095, 0, +2887, 0, 2732, +2887, 0, 2731, +2887, 0, 2731, +2887, 0, 2730, +2887, 0, 2728, +2887, 0, 2727, +2886, 0, 2725, +2886, 0, 2722, +2885, 0, 2718, +2885, 0, 2713, +2883, 0, 2706, +2882, 0, 2697, +2880, 0, 2684, +2878, 0, 2666, +2874, 0, 2641, +2874, 0, 2597, +2874, 0, 2530, +2874, 0, 2423, +2874, 0, 2220, +2874, 0, 1596, +2874, 0, 0, +2874, 2338, 0, +3010, 2778, 0, +3144, 3053, 0, +3278, 3269, 0, +3365, 3412, 0, +3451, 3545, 0, +3545, 3678, 0, +3647, 3810, 0, +3755, 3943, 0, +3868, 4075, 0, +3985, 4095, 0, +3019, 0, 2837, +3019, 0, 2837, +3019, 0, 2836, +3019, 0, 2836, +3019, 0, 2835, +3019, 0, 2834, +3018, 0, 2832, +3018, 0, 2830, +3018, 0, 2827, +3017, 0, 2823, +3016, 0, 2817, +3015, 0, 2810, +3014, 0, 2800, +3012, 0, 2786, +3010, 0, 2767, +3010, 0, 2734, +3010, 0, 2686, +3010, 0, 2612, +3010, 0, 2489, +3010, 0, 2247, +3010, 0, 922, +3010, 0, 0, +3010, 2441, 0, +3144, 2901, 0, +3278, 3180, 0, +3412, 3397, 0, +3502, 3545, 0, +3587, 3678, 0, +3680, 3810, 0, +3781, 3943, 0, +3889, 4075, 0, +4002, 4095, 0, +3152, 0, 2949, +3152, 0, 2949, +3152, 0, 2948, +3151, 0, 2948, +3151, 0, 2947, +3151, 0, 2946, +3151, 0, 2945, +3151, 0, 2943, +3151, 0, 2941, +3150, 0, 2938, +3150, 0, 2933, +3149, 0, 2928, +3148, 0, 2920, +3146, 0, 2910, +3144, 0, 2895, +3144, 0, 2870, +3144, 0, 2835, +3144, 0, 2783, +3144, 0, 2703, +3144, 0, 2566, +3144, 0, 2280, +3144, 0, 0, +3144, 0, 0, +3144, 2551, 0, +3278, 3023, 0, +3412, 3307, 0, +3545, 3526, 0, +3638, 3678, 0, +3722, 3810, 0, +3815, 3943, 0, +3916, 4075, 0, +4023, 4095, 0, +3284, 0, 3065, +3283, 0, 3065, +3283, 0, 3064, +3283, 0, 3064, +3283, 0, 3063, +3283, 0, 3062, +3283, 0, 3062, +3283, 0, 3060, +3283, 0, 3059, +3282, 0, 3056, +3282, 0, 3053, +3281, 0, 3049, +3280, 0, 3043, +3280, 0, 3034, +3278, 0, 3024, +3278, 0, 3005, +3278, 0, 2979, +3278, 0, 2942, +3278, 0, 2886, +3278, 0, 2800, +3278, 0, 2651, +3278, 0, 2320, +3278, 0, 0, +3278, 0, 0, +3278, 2665, 0, +3412, 3150, 0, +3545, 3436, 0, +3678, 3657, 0, +3773, 3810, 0, +3857, 3943, 0, +3949, 4075, 0, +4049, 4095, 0, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3183, +3415, 0, 3182, +3415, 0, 3181, +3415, 0, 3180, +3415, 0, 3178, +3414, 0, 3175, +3414, 0, 3172, +3414, 0, 3168, +3413, 0, 3162, +3412, 0, 3154, +3412, 0, 3140, +3412, 0, 3120, +3412, 0, 3093, +3412, 0, 3055, +3412, 0, 2997, +3412, 0, 2906, +3412, 0, 2746, +3412, 0, 2371, +3412, 0, 0, +3412, 0, 0, +3412, 2784, 0, +3545, 3278, 0, +3678, 3566, 0, +3810, 3787, 0, +3907, 3943, 0, +3991, 4075, 0, +4083, 4095, 0, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3306, +3548, 0, 3305, +3548, 0, 3305, +3548, 0, 3303, +3547, 0, 3302, +3547, 0, 3300, +3547, 0, 3298, +3546, 0, 3294, +3546, 0, 3290, +3545, 0, 3284, +3545, 0, 3273, +3545, 0, 3259, +3545, 0, 3239, +3545, 0, 3211, +3545, 0, 3171, +3545, 0, 3111, +3545, 0, 3016, +3545, 0, 2848, +3545, 0, 2429, +3545, 0, 0, +3545, 0, 0, +3545, 2905, 0, +3678, 3406, 0, +3810, 3696, 0, +3943, 3918, 0, +4041, 4075, 0, +4095, 4095, 0, +3680, 0, 3432, +3680, 0, 3432, +3680, 0, 3432, +3680, 0, 3432, +3680, 0, 3431, +3680, 0, 3431, +3680, 0, 3431, +3680, 0, 3430, +3680, 0, 3429, +3680, 0, 3428, +3679, 0, 3427, +3679, 0, 3425, +3679, 0, 3422, +3678, 0, 3419, +3678, 0, 3414, +3678, 0, 3407, +3678, 0, 3396, +3678, 0, 3381, +3678, 0, 3361, +3678, 0, 3333, +3678, 0, 3291, +3678, 0, 3230, +3678, 0, 3132, +3678, 0, 2955, +3678, 0, 2499, +3678, 0, 0, +3678, 0, 0, +3678, 3029, 0, +3810, 3536, 0, +3943, 3827, 0, +4075, 4049, 0, +4095, 4095, 0, +3812, 0, 3559, +3812, 0, 3559, +3812, 0, 3559, +3812, 0, 3558, +3812, 0, 3558, +3812, 0, 3558, +3812, 0, 3558, +3812, 0, 3557, +3812, 0, 3557, +3812, 0, 3556, +3812, 0, 3555, +3812, 0, 3553, +3811, 0, 3552, +3811, 0, 3549, +3810, 0, 3545, +3810, 0, 3540, +3810, 0, 3532, +3810, 0, 3521, +3810, 0, 3506, +3810, 0, 3486, +3810, 0, 3457, +3810, 0, 3415, +3810, 0, 3352, +3810, 0, 3251, +3810, 0, 3069, +3810, 0, 2576, +3810, 0, 0, +3810, 0, 0, +3810, 3155, 0, +3943, 3665, 0, +4075, 3958, 0, +4095, 4095, 0, +3944, 0, 3687, +3944, 0, 3687, +3944, 0, 3687, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3685, +3944, 0, 3685, +3944, 0, 3684, +3944, 0, 3683, +3944, 0, 3681, +3943, 0, 3679, +3943, 0, 3677, +3943, 0, 3672, +3943, 0, 3666, +3943, 0, 3659, +3943, 0, 3648, +3943, 0, 3632, +3943, 0, 3612, +3943, 0, 3583, +3943, 0, 3540, +3943, 0, 3476, +3943, 0, 3374, +3943, 0, 3186, +3943, 0, 2662, +3943, 0, 0, +3943, 0, 0, +3943, 3283, 0, +4075, 3796, 0, +4095, 4089, 0, +4076, 0, 3816, +4076, 0, 3816, +4076, 0, 3816, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3814, +4076, 0, 3814, +4076, 0, 3813, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3810, +4075, 0, 3808, +4075, 0, 3805, +4075, 0, 3801, +4075, 0, 3795, +4075, 0, 3787, +4075, 0, 3776, +4075, 0, 3760, +4075, 0, 3739, +4075, 0, 3710, +4075, 0, 3667, +4075, 0, 3602, +4075, 0, 3498, +4075, 0, 3306, +4075, 0, 2756, +4075, 0, 0, +4075, 0, 0, +4075, 3411, 0, +4095, 3927, 0, +4095, 0, 3946, +4095, 0, 3946, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3943, +4095, 0, 3942, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3937, +4095, 0, 3934, +4095, 0, 3930, +4095, 0, 3924, +4095, 0, 3916, +4095, 0, 3905, +4095, 0, 3889, +4095, 0, 3868, +4095, 0, 3838, +4095, 0, 3795, +4095, 0, 3730, +4095, 0, 3625, +4095, 0, 3430, +4095, 0, 2861, +4095, 0, 0, +4095, 0, 0, +4095, 3541, 0, +0, 1827, 2094, +0, 1831, 2094, +0, 1837, 2094, +0, 1845, 2094, +0, 1855, 2094, +0, 1867, 2094, +0, 1884, 2094, +0, 1905, 2094, +0, 1932, 2094, +0, 1966, 2094, +0, 2007, 2094, +0, 2058, 2094, +0, 2094, 2069, +0, 2094, 1977, +0, 2094, 1816, +0, 2094, 1433, +0, 2226, 0, +0, 2358, 0, +1120, 2491, 0, +1833, 2623, 0, +2162, 2755, 0, +2400, 2887, 0, +2597, 3019, 0, +2773, 3152, 0, +2935, 3284, 0, +3088, 3416, 0, +3236, 3548, 0, +3379, 3680, 0, +3519, 3812, 0, +3657, 3944, 0, +3793, 4076, 0, +3929, 4095, 0, +0, 1823, 2094, +0, 1828, 2093, +0, 1834, 2093, +0, 1841, 2093, +0, 1851, 2093, +0, 1864, 2093, +0, 1881, 2093, +0, 1902, 2093, +0, 1929, 2093, +0, 1963, 2093, +0, 2005, 2093, +0, 2056, 2093, +0, 2093, 2070, +0, 2093, 1979, +0, 2093, 1818, +0, 2093, 1438, +0, 2226, 0, +0, 2358, 0, +1143, 2491, 0, +1838, 2623, 0, +2164, 2755, 0, +2401, 2887, 0, +2598, 3019, 0, +2773, 3152, 0, +2935, 3283, 0, +3088, 3416, 0, +3236, 3548, 0, +3379, 3680, 0, +3519, 3812, 0, +3657, 3944, 0, +3793, 4076, 0, +3929, 4095, 0, +0, 1817, 2094, +0, 1822, 2093, +0, 1829, 2093, +0, 1837, 2093, +0, 1847, 2093, +0, 1860, 2093, +0, 1877, 2093, +0, 1898, 2093, +0, 1926, 2093, +0, 1960, 2093, +0, 2002, 2093, +0, 2053, 2093, +0, 2093, 2071, +0, 2093, 1981, +0, 2093, 1821, +0, 2093, 1444, +0, 2225, 0, +0, 2358, 0, +1173, 2490, 0, +1845, 2623, 0, +2167, 2755, 0, +2403, 2887, 0, +2599, 3019, 0, +2774, 3152, 0, +2936, 3283, 0, +3089, 3416, 0, +3236, 3548, 0, +3379, 3680, 0, +3519, 3812, 0, +3657, 3944, 0, +3793, 4076, 0, +3929, 4095, 0, +0, 1809, 2094, +0, 1814, 2093, +0, 1821, 2093, +0, 1830, 2092, +0, 1841, 2092, +0, 1854, 2092, +0, 1871, 2092, +0, 1893, 2092, +0, 1920, 2092, +0, 1955, 2092, +0, 1997, 2092, +0, 2049, 2092, +0, 2092, 2073, +0, 2092, 1983, +0, 2092, 1824, +0, 2092, 1452, +0, 2225, 0, +0, 2357, 0, +1210, 2490, 0, +1853, 2622, 0, +2172, 2755, 0, +2406, 2887, 0, +2601, 3019, 0, +2775, 3151, 0, +2936, 3283, 0, +3089, 3416, 0, +3237, 3548, 0, +3379, 3680, 0, +3520, 3812, 0, +3657, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1798, 2094, +0, 1804, 2093, +0, 1811, 2093, +0, 1820, 2092, +0, 1832, 2091, +0, 1846, 2091, +0, 1863, 2091, +0, 1885, 2091, +0, 1913, 2091, +0, 1949, 2091, +0, 1992, 2091, +0, 2044, 2091, +0, 2091, 2076, +0, 2091, 1986, +0, 2091, 1829, +0, 2091, 1463, +0, 2224, 0, +0, 2357, 0, +1255, 2489, 0, +1865, 2622, 0, +2177, 2755, 0, +2409, 2887, 0, +2603, 3019, 0, +2777, 3151, 0, +2938, 3283, 0, +3090, 3416, 0, +3237, 3548, 0, +3380, 3680, 0, +3520, 3812, 0, +3658, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1783, 2094, +0, 1789, 2093, +0, 1796, 2093, +0, 1806, 2092, +0, 1819, 2091, +0, 1835, 2089, +0, 1853, 2089, +0, 1875, 2089, +0, 1904, 2089, +0, 1940, 2089, +0, 1984, 2089, +0, 2037, 2089, +0, 2089, 2080, +0, 2089, 1991, +0, 2089, 1835, +0, 2089, 1476, +0, 2223, 0, +0, 2356, 0, +1310, 2489, 0, +1880, 2621, 0, +2185, 2754, 0, +2413, 2887, 0, +2606, 3019, 0, +2779, 3151, 0, +2939, 3283, 0, +3091, 3416, 0, +3238, 3548, 0, +3380, 3680, 0, +3520, 3812, 0, +3658, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1763, 2094, +0, 1768, 2093, +0, 1776, 2093, +0, 1786, 2092, +0, 1799, 2091, +0, 1816, 2089, +0, 1838, 2087, +0, 1862, 2087, +0, 1891, 2087, +0, 1928, 2087, +0, 1973, 2087, +0, 2027, 2087, +0, 2087, 2085, +0, 2087, 1996, +0, 2087, 1843, +0, 2087, 1494, +0, 2221, 0, +0, 2355, 0, +1373, 2488, 0, +1899, 2621, 0, +2195, 2754, 0, +2419, 2886, 0, +2610, 3018, 0, +2782, 3151, 0, +2941, 3283, 0, +3093, 3415, 0, +3239, 3548, 0, +3381, 3680, 0, +3521, 3812, 0, +3658, 3944, 0, +3794, 4076, 0, +3930, 4095, 0, +0, 1733, 2094, +0, 1739, 2093, +0, 1748, 2093, +0, 1758, 2092, +0, 1772, 2091, +0, 1790, 2089, +0, 1813, 2087, +0, 1843, 2085, +0, 1873, 2085, +0, 1912, 2085, +0, 1958, 2085, +0, 2014, 2085, +0, 2079, 2085, +0, 2085, 2004, +0, 2085, 1854, +0, 2085, 1517, +0, 2220, 0, +0, 2353, 0, +1446, 2487, 0, +1923, 2620, 0, +2208, 2753, 0, +2427, 2886, 0, +2615, 3018, 0, +2785, 3151, 0, +2943, 3283, 0, +3094, 3415, 0, +3240, 3548, 0, +3382, 3680, 0, +3521, 3812, 0, +3659, 3944, 0, +3795, 4076, 0, +3930, 4095, 0, +0, 1691, 2094, +0, 1698, 2093, +0, 1706, 2093, +0, 1718, 2092, +0, 1733, 2091, +0, 1753, 2089, +0, 1778, 2087, +0, 1810, 2085, +0, 1849, 2082, +0, 1889, 2082, +0, 1938, 2082, +0, 1996, 2082, +0, 2063, 2082, +0, 2082, 2014, +0, 2082, 1868, +0, 2082, 1545, +0, 2217, 0, +0, 2352, 0, +1529, 2486, 0, +1954, 2619, 0, +2224, 2752, 0, +2438, 2885, 0, +2622, 3018, 0, +2790, 3151, 0, +2947, 3283, 0, +3097, 3415, 0, +3242, 3548, 0, +3383, 3680, 0, +3522, 3812, 0, +3659, 3944, 0, +3795, 4076, 0, +3930, 4095, 0, +0, 1626, 2094, +0, 1635, 2093, +0, 1645, 2093, +0, 1658, 2092, +0, 1676, 2091, +0, 1698, 2089, +0, 1726, 2087, +0, 1761, 2085, +0, 1804, 2082, +0, 1856, 2077, +0, 1908, 2077, +0, 1970, 2077, +0, 2041, 2077, +0, 2077, 2027, +0, 2077, 1886, +0, 2077, 1581, +0, 2214, 0, +275, 2349, 0, +1620, 2484, 0, +1991, 2618, 0, +2245, 2751, 0, +2451, 2885, 0, +2631, 3017, 0, +2796, 3150, 0, +2951, 3282, 0, +3100, 3415, 0, +3244, 3547, 0, +3385, 3680, 0, +3523, 3812, 0, +3661, 3944, 0, +3796, 4076, 0, +3931, 4095, 0, +0, 1524, 2094, +0, 1534, 2093, +0, 1547, 2093, +0, 1564, 2092, +0, 1585, 2091, +0, 1612, 2089, +0, 1646, 2087, +0, 1687, 2085, +0, 1738, 2082, +0, 1797, 2077, +79, 1866, 2071, +79, 1934, 2071, +79, 2010, 2071, +79, 2071, 2044, +79, 2071, 1908, +79, 2071, 1625, +0, 2209, 303, +1064, 2346, 0, +1719, 2481, 0, +2038, 2616, 0, +2273, 2750, 0, +2469, 2883, 0, +2643, 3016, 0, +2804, 3150, 0, +2957, 3282, 0, +3104, 3414, 0, +3247, 3547, 0, +3387, 3679, 0, +3525, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1336, 2094, +0, 1351, 2093, +0, 1370, 2093, +0, 1394, 2092, +0, 1425, 2091, +0, 1463, 2089, +0, 1509, 2087, +0, 1565, 2085, +0, 1630, 2082, +0, 1704, 2077, +79, 1787, 2071, +1005, 1880, 2062, +1005, 1965, 2062, +1005, 2059, 2062, +1005, 2062, 1937, +1005, 2062, 1677, +217, 2203, 838, +1403, 2341, 0, +1824, 2478, 0, +2093, 2613, 0, +2306, 2748, 0, +2491, 2882, 0, +2658, 3015, 0, +2815, 3149, 0, +2965, 3281, 0, +3110, 3414, 0, +3251, 3547, 0, +3390, 3679, 0, +3528, 3812, 0, +3663, 3944, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 814, 2094, +0, 859, 2093, +0, 913, 2093, +0, 977, 2092, +0, 1050, 2091, +0, 1133, 2089, +0, 1224, 2087, +0, 1322, 2085, +0, 1428, 2082, +0, 1539, 2077, +79, 1655, 2071, +1005, 1774, 2062, +1355, 1897, 2051, +1355, 2004, 2051, +1355, 2051, 1973, +1355, 2051, 1739, +1137, 2194, 1136, +1644, 2335, 345, +1935, 2473, 0, +2158, 2610, 0, +2348, 2746, 0, +2519, 2880, 0, +2678, 3014, 0, +2829, 3148, 0, +2975, 3280, 0, +3117, 3414, 0, +3257, 3546, 0, +3394, 3679, 0, +3530, 3811, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 0, 2094, +0, 0, 2093, +0, 0, 2093, +0, 0, 2092, +0, 0, 2091, +0, 0, 2089, +0, 0, 2087, +0, 10, 2085, +0, 800, 2082, +0, 1138, 2077, +79, 1379, 2071, +1005, 1579, 2062, +1355, 1756, 2051, +1601, 1919, 2035, +1601, 2035, 2017, +1601, 2035, 1811, +1585, 2183, 1487, +1843, 2326, 1269, +2051, 2467, 477, +2233, 2605, 0, +2398, 2742, 0, +2554, 2878, 0, +2703, 3012, 0, +2847, 3146, 0, +2988, 3280, 0, +3127, 3413, 0, +3264, 3546, 0, +3400, 3678, 0, +3534, 3811, 0, +3668, 3943, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 0, 2094, +0, 0, 2093, +0, 0, 2093, +0, 0, 2092, +0, 0, 2091, +0, 0, 2089, +0, 0, 2087, +0, 0, 2085, +0, 0, 2082, +173, 0, 2077, +706, 79, 2071, +1005, 1006, 2062, +1355, 1453, 2051, +1601, 1730, 2035, +1803, 1946, 2013, +1803, 2013, 1891, +1862, 2167, 1733, +2020, 2315, 1619, +2171, 2459, 1401, +2316, 2599, 611, +2458, 2738, 0, +2597, 2874, 0, +2734, 3010, 0, +2870, 3144, 0, +3005, 3278, 0, +3140, 3412, 0, +3273, 3545, 0, +3407, 3678, 0, +3540, 3810, 0, +3672, 3943, 0, +3805, 4075, 0, +3937, 4095, 0, +1433, 0, 2094, +1438, 0, 2093, +1444, 0, 2093, +1452, 0, 2092, +1463, 0, 2091, +1476, 0, 2089, +1494, 0, 2087, +1517, 0, 2085, +1545, 0, 2082, +1581, 0, 2077, +1625, 79, 2071, +1677, 1005, 2062, +1739, 1355, 2051, +1811, 1601, 2035, +1891, 1803, 2013, +1981, 1981, 1981, +2078, 2145, 1935, +2183, 2299, 1865, +2293, 2447, 1751, +2408, 2591, 1533, +2527, 2731, 738, +2649, 2870, 0, +2773, 3006, 0, +2900, 3142, 0, +3027, 3276, 0, +3156, 3410, 0, +3285, 3544, 0, +3416, 3677, 0, +3547, 3810, 0, +3677, 3943, 0, +3809, 4075, 0, +3940, 4095, 0, +1946, 0, 2226, +1948, 0, 2226, +1950, 0, 2225, +1953, 0, 2225, +1956, 0, 2224, +1961, 0, 2223, +1967, 0, 2221, +1975, 0, 2220, +1986, 0, 2217, +2000, 0, 2214, +2018, 0, 2209, +2041, 217, 2203, +2069, 1136, 2194, +2105, 1487, 2183, +2149, 1733, 2167, +2145, 1935, 2078, +2145, 2023, 1935, +2299, 2281, 1865, +2401, 2447, 1751, +2493, 2591, 1533, +2594, 2731, 738, +2701, 2870, 0, +2813, 3006, 0, +2931, 3142, 0, +3050, 3276, 0, +3174, 3410, 0, +3299, 3544, 0, +3426, 3677, 0, +3554, 3810, 0, +3683, 3943, 0, +3813, 4075, 0, +3944, 4095, 0, +2239, 0, 2358, +2240, 0, 2358, +2241, 0, 2358, +2243, 0, 2357, +2245, 0, 2357, +2247, 0, 2356, +2251, 0, 2355, +2255, 0, 2353, +2261, 0, 2352, +2268, 0, 2349, +2278, 0, 2346, +2291, 0, 2341, +2308, 345, 2335, +2326, 1269, 2323, +2315, 1619, 2268, +2299, 1865, 2183, +2299, 1865, 1994, +2299, 2075, 1865, +2447, 2370, 1751, +2587, 2591, 1533, +2671, 2731, 738, +2763, 2870, 0, +2862, 3006, 0, +2969, 3142, 0, +3080, 3276, 0, +3196, 3410, 0, +3316, 3544, 0, +3439, 3677, 0, +3564, 3810, 0, +3691, 3943, 0, +3818, 4075, 0, +3948, 4095, 0, +2463, 0, 2491, +2464, 0, 2491, +2464, 0, 2490, +2465, 0, 2490, +2466, 0, 2489, +2468, 0, 2489, +2470, 0, 2488, +2473, 0, 2487, +2476, 0, 2486, +2481, 0, 2484, +2481, 0, 2475, +2478, 0, 2460, +2473, 0, 2438, +2467, 477, 2407, +2459, 1401, 2362, +2447, 1751, 2293, +2447, 1751, 2152, +2447, 1751, 1850, +2447, 2135, 1751, +2591, 2466, 1533, +2731, 2705, 738, +2834, 2870, 0, +2920, 3006, 0, +3015, 3142, 0, +3117, 3276, 0, +3225, 3410, 0, +3339, 3544, 0, +3456, 3677, 0, +3577, 3810, 0, +3701, 3943, 0, +3826, 4075, 0, +3953, 4095, 0, +2623, 0, 2590, +2623, 0, 2590, +2623, 0, 2589, +2622, 0, 2588, +2622, 0, 2586, +2621, 0, 2584, +2621, 0, 2581, +2620, 0, 2577, +2619, 0, 2572, +2618, 0, 2565, +2616, 0, 2555, +2613, 0, 2542, +2610, 0, 2524, +2605, 0, 2498, +2599, 611, 2462, +2591, 1533, 2408, +2591, 1533, 2303, +2591, 1533, 2108, +2591, 1533, 1533, +2591, 2206, 1533, +2731, 2570, 738, +2870, 2820, 0, +2988, 3006, 0, +3071, 3142, 0, +3162, 3276, 0, +3261, 3410, 0, +3367, 3544, 0, +3478, 3677, 0, +3594, 3810, 0, +3713, 3943, 0, +3836, 4075, 0, +3961, 4095, 0, +2755, 0, 2673, +2755, 0, 2673, +2755, 0, 2672, +2755, 0, 2671, +2755, 0, 2670, +2754, 0, 2668, +2754, 0, 2666, +2753, 0, 2662, +2752, 0, 2658, +2751, 0, 2652, +2750, 0, 2645, +2748, 0, 2634, +2746, 0, 2619, +2742, 0, 2598, +2738, 0, 2569, +2731, 738, 2527, +2731, 738, 2448, +2731, 738, 2315, +2731, 738, 2040, +2731, 1362, 738, +2731, 2285, 738, +2870, 2678, 0, +3006, 2939, 0, +3136, 3142, 0, +3216, 3276, 0, +3305, 3410, 0, +3402, 3544, 0, +3506, 3677, 0, +3616, 3810, 0, +3730, 3943, 0, +3849, 4075, 0, +3971, 4095, 0, +2887, 0, 2765, +2887, 0, 2764, +2887, 0, 2764, +2887, 0, 2763, +2887, 0, 2762, +2887, 0, 2761, +2886, 0, 2759, +2886, 0, 2756, +2885, 0, 2752, +2885, 0, 2748, +2883, 0, 2741, +2882, 0, 2733, +2880, 0, 2721, +2878, 0, 2704, +2874, 0, 2681, +2870, 0, 2649, +2870, 0, 2590, +2870, 0, 2497, +2870, 0, 2332, +2870, 0, 1932, +2870, 963, 0, +2870, 2374, 0, +3006, 2792, 0, +3142, 3061, 0, +3276, 3273, 0, +3358, 3410, 0, +3445, 3544, 0, +3540, 3677, 0, +3643, 3810, 0, +3752, 3943, 0, +3865, 4075, 0, +3983, 4095, 0, +3019, 0, 2864, +3019, 0, 2863, +3019, 0, 2863, +3019, 0, 2863, +3019, 0, 2862, +3019, 0, 2860, +3018, 0, 2859, +3018, 0, 2857, +3018, 0, 2854, +3017, 0, 2850, +3016, 0, 2845, +3015, 0, 2838, +3014, 0, 2829, +3012, 0, 2816, +3010, 0, 2798, +3006, 0, 2773, +3006, 0, 2729, +3006, 0, 2662, +3006, 0, 2554, +3006, 0, 2352, +3006, 0, 1723, +3006, 0, 0, +3006, 2470, 0, +3142, 2911, 0, +3276, 3185, 0, +3410, 3401, 0, +3497, 3544, 0, +3583, 3677, 0, +3677, 3810, 0, +3779, 3943, 0, +3887, 4075, 0, +4000, 4095, 0, +3152, 0, 2970, +3152, 0, 2970, +3152, 0, 2969, +3151, 0, 2969, +3151, 0, 2968, +3151, 0, 2967, +3151, 0, 2966, +3151, 0, 2964, +3151, 0, 2962, +3150, 0, 2959, +3150, 0, 2955, +3149, 0, 2950, +3148, 0, 2942, +3146, 0, 2932, +3144, 0, 2919, +3142, 0, 2900, +3142, 0, 2867, +3142, 0, 2818, +3142, 0, 2744, +3142, 0, 2622, +3142, 0, 2379, +3142, 0, 1068, +3142, 0, 0, +3142, 2573, 0, +3276, 3032, 0, +3410, 3311, 0, +3544, 3529, 0, +3634, 3677, 0, +3719, 3810, 0, +3813, 3943, 0, +3913, 4075, 0, +4021, 4095, 0, +3284, 0, 3081, +3283, 0, 3081, +3283, 0, 3081, +3283, 0, 3080, +3283, 0, 3080, +3283, 0, 3079, +3283, 0, 3078, +3283, 0, 3077, +3283, 0, 3075, +3282, 0, 3073, +3282, 0, 3070, +3281, 0, 3065, +3280, 0, 3060, +3280, 0, 3052, +3278, 0, 3041, +3276, 0, 3027, +3276, 0, 3002, +3276, 0, 2967, +3276, 0, 2915, +3276, 0, 2834, +3276, 0, 2698, +3276, 0, 2411, +3276, 0, 0, +3276, 0, 0, +3276, 2683, 0, +3410, 3156, 0, +3544, 3440, 0, +3677, 3659, 0, +3770, 3810, 0, +3854, 3943, 0, +3947, 4075, 0, +4048, 4095, 0, +3416, 0, 3197, +3416, 0, 3197, +3416, 0, 3197, +3416, 0, 3196, +3416, 0, 3196, +3416, 0, 3196, +3415, 0, 3195, +3415, 0, 3194, +3415, 0, 3192, +3415, 0, 3191, +3414, 0, 3188, +3414, 0, 3185, +3414, 0, 3181, +3413, 0, 3175, +3412, 0, 3167, +3410, 0, 3156, +3410, 0, 3137, +3410, 0, 3111, +3410, 0, 3074, +3410, 0, 3019, +3410, 0, 2933, +3410, 0, 2784, +3410, 0, 2453, +3410, 0, 0, +3410, 0, 0, +3410, 2797, 0, +3544, 3282, 0, +3677, 3568, 0, +3810, 3789, 0, +3905, 3943, 0, +3989, 4075, 0, +4082, 4095, 0, +3548, 0, 3317, +3548, 0, 3317, +3548, 0, 3317, +3548, 0, 3316, +3548, 0, 3316, +3548, 0, 3316, +3548, 0, 3315, +3548, 0, 3314, +3548, 0, 3313, +3547, 0, 3312, +3547, 0, 3310, +3547, 0, 3307, +3546, 0, 3304, +3546, 0, 3300, +3545, 0, 3294, +3544, 0, 3285, +3544, 0, 3272, +3544, 0, 3253, +3544, 0, 3225, +3544, 0, 3186, +3544, 0, 3129, +3544, 0, 3038, +3544, 0, 2879, +3544, 0, 2502, +3544, 0, 0, +3544, 0, 0, +3544, 2916, 0, +3677, 3410, 0, +3810, 3698, 0, +3943, 3920, 0, +4039, 4075, 0, +4095, 4095, 0, +3680, 0, 3440, +3680, 0, 3439, +3680, 0, 3439, +3680, 0, 3439, +3680, 0, 3439, +3680, 0, 3438, +3680, 0, 3438, +3680, 0, 3437, +3680, 0, 3437, +3680, 0, 3436, +3679, 0, 3434, +3679, 0, 3432, +3679, 0, 3430, +3678, 0, 3426, +3678, 0, 3422, +3677, 0, 3416, +3677, 0, 3405, +3677, 0, 3391, +3677, 0, 3371, +3677, 0, 3344, +3677, 0, 3303, +3677, 0, 3243, +3677, 0, 3149, +3677, 0, 2980, +3677, 0, 2562, +3677, 0, 0, +3677, 0, 0, +3677, 3037, 0, +3810, 3538, 0, +3943, 3828, 0, +4075, 4050, 0, +4095, 4095, 0, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3563, +3812, 0, 3563, +3812, 0, 3562, +3812, 0, 3562, +3812, 0, 3561, +3812, 0, 3559, +3811, 0, 3557, +3811, 0, 3554, +3810, 0, 3551, +3810, 0, 3547, +3810, 0, 3539, +3810, 0, 3528, +3810, 0, 3514, +3810, 0, 3493, +3810, 0, 3465, +3810, 0, 3424, +3810, 0, 3362, +3810, 0, 3264, +3810, 0, 3088, +3810, 0, 2631, +3810, 0, 0, +3810, 0, 0, +3810, 3161, 0, +3943, 3667, 0, +4075, 3959, 0, +4095, 4095, 0, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3690, +3944, 0, 3690, +3944, 0, 3690, +3944, 0, 3689, +3944, 0, 3689, +3944, 0, 3688, +3944, 0, 3687, +3944, 0, 3685, +3943, 0, 3683, +3943, 0, 3681, +3943, 0, 3677, +3943, 0, 3672, +3943, 0, 3664, +3943, 0, 3653, +3943, 0, 3638, +3943, 0, 3618, +3943, 0, 3589, +3943, 0, 3547, +3943, 0, 3484, +3943, 0, 3384, +3943, 0, 3201, +3943, 0, 2708, +3943, 0, 0, +3943, 0, 0, +3943, 3287, 0, +4075, 3797, 0, +4095, 4090, 0, +4076, 0, 3819, +4076, 0, 3819, +4076, 0, 3819, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3817, +4076, 0, 3816, +4076, 0, 3816, +4076, 0, 3814, +4076, 0, 3813, +4075, 0, 3811, +4075, 0, 3809, +4075, 0, 3804, +4075, 0, 3798, +4075, 0, 3790, +4075, 0, 3780, +4075, 0, 3765, +4075, 0, 3744, +4075, 0, 3714, +4075, 0, 3672, +4075, 0, 3608, +4075, 0, 3505, +4075, 0, 3318, +4075, 0, 2793, +4075, 0, 0, +4075, 0, 0, +4075, 3415, 0, +4095, 3929, 0, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3947, +4095, 0, 3947, +4095, 0, 3947, +4095, 0, 3947, +4095, 0, 3946, +4095, 0, 3946, +4095, 0, 3945, +4095, 0, 3944, +4095, 0, 3942, +4095, 0, 3940, +4095, 0, 3937, +4095, 0, 3933, +4095, 0, 3927, +4095, 0, 3919, +4095, 0, 3908, +4095, 0, 3893, +4095, 0, 3872, +4095, 0, 3842, +4095, 0, 3799, +4095, 0, 3735, +4095, 0, 3630, +4095, 0, 3439, +4095, 0, 2890, +4095, 0, 0, +4095, 0, 0, +4095, 3544, 0, +0, 1959, 2226, +0, 1962, 2226, +0, 1966, 2226, +0, 1972, 2226, +0, 1979, 2226, +0, 1989, 2226, +0, 2002, 2226, +0, 2018, 2226, +0, 2039, 2226, +0, 2066, 2226, +0, 2100, 2226, +0, 2141, 2226, +0, 2191, 2226, +0, 2226, 2200, +0, 2226, 2108, +0, 2226, 1946, +0, 2226, 1562, +0, 2358, 0, +0, 2491, 0, +1232, 2623, 0, +1962, 2755, 0, +2292, 2887, 0, +2530, 3019, 0, +2729, 3152, 0, +2904, 3284, 0, +3067, 3416, 0, +3220, 3548, 0, +3367, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1956, 2226, +0, 1959, 2226, +0, 1963, 2226, +0, 1969, 2226, +0, 1977, 2226, +0, 1987, 2226, +0, 1999, 2226, +0, 2016, 2226, +0, 2037, 2226, +0, 2064, 2226, +0, 2098, 2226, +0, 2140, 2226, +0, 2190, 2226, +0, 2226, 2201, +0, 2226, 2109, +0, 2226, 1948, +0, 2226, 1565, +0, 2358, 0, +0, 2491, 0, +1251, 2623, 0, +1966, 2755, 0, +2294, 2887, 0, +2531, 3019, 0, +2729, 3152, 0, +2905, 3283, 0, +3067, 3416, 0, +3220, 3548, 0, +3368, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1951, 2226, +0, 1955, 2226, +0, 1960, 2225, +0, 1966, 2225, +0, 1973, 2225, +0, 1983, 2225, +0, 1996, 2225, +0, 2013, 2225, +0, 2034, 2225, +0, 2061, 2225, +0, 2095, 2225, +0, 2137, 2225, +0, 2188, 2225, +0, 2225, 2202, +0, 2225, 2111, +0, 2225, 1950, +0, 2225, 1570, +0, 2358, 0, +0, 2490, 0, +1275, 2623, 0, +1971, 2755, 0, +2296, 2887, 0, +2533, 3019, 0, +2730, 3152, 0, +2905, 3283, 0, +3067, 3416, 0, +3221, 3548, 0, +3368, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1945, 2226, +0, 1949, 2226, +0, 1954, 2225, +0, 1961, 2225, +0, 1969, 2225, +0, 1979, 2225, +0, 1992, 2225, +0, 2009, 2225, +0, 2030, 2225, +0, 2058, 2225, +0, 2092, 2225, +0, 2134, 2225, +0, 2185, 2225, +0, 2225, 2203, +0, 2225, 2112, +0, 2225, 1953, +0, 2225, 1576, +0, 2357, 0, +0, 2490, 0, +1304, 2622, 0, +1977, 2755, 0, +2299, 2887, 0, +2535, 3019, 0, +2732, 3151, 0, +2906, 3283, 0, +3068, 3416, 0, +3221, 3548, 0, +3368, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1937, 2226, +0, 1941, 2226, +0, 1946, 2225, +0, 1953, 2225, +0, 1963, 2224, +0, 1973, 2224, +0, 1986, 2224, +0, 2003, 2224, +0, 2025, 2224, +0, 2053, 2224, +0, 2087, 2224, +0, 2130, 2224, +0, 2181, 2224, +0, 2224, 2206, +0, 2224, 2115, +0, 2224, 1956, +0, 2224, 1584, +0, 2357, 0, +0, 2489, 0, +1342, 2622, 0, +1986, 2755, 0, +2304, 2887, 0, +2537, 3019, 0, +2733, 3151, 0, +2907, 3283, 0, +3069, 3416, 0, +3222, 3548, 0, +3369, 3680, 0, +3511, 3812, 0, +3652, 3944, 0, +3790, 4076, 0, +3926, 4095, 0, +0, 1926, 2226, +0, 1930, 2226, +0, 1936, 2225, +0, 1943, 2225, +0, 1952, 2224, +0, 1965, 2223, +0, 1978, 2223, +0, 1995, 2223, +0, 2018, 2223, +0, 2046, 2223, +0, 2081, 2223, +0, 2124, 2223, +0, 2176, 2223, +0, 2223, 2208, +0, 2223, 2118, +0, 2223, 1961, +0, 2223, 1595, +0, 2356, 0, +0, 2489, 0, +1387, 2621, 0, +1997, 2754, 0, +2310, 2887, 0, +2541, 3019, 0, +2735, 3151, 0, +2909, 3283, 0, +3070, 3416, 0, +3222, 3548, 0, +3369, 3680, 0, +3512, 3812, 0, +3652, 3944, 0, +3790, 4076, 0, +3926, 4095, 0, +0, 1911, 2226, +0, 1915, 2226, +0, 1921, 2225, +0, 1928, 2225, +0, 1938, 2224, +0, 1951, 2223, +0, 1967, 2221, +0, 1985, 2221, +0, 2008, 2221, +0, 2036, 2221, +0, 2072, 2221, +0, 2116, 2221, +0, 2169, 2221, +0, 2221, 2212, +0, 2221, 2123, +0, 2221, 1967, +0, 2221, 1608, +0, 2355, 0, +0, 2488, 0, +1441, 2621, 0, +2012, 2754, 0, +2317, 2886, 0, +2545, 3018, 0, +2738, 3151, 0, +2911, 3283, 0, +3071, 3415, 0, +3223, 3548, 0, +3370, 3680, 0, +3513, 3812, 0, +3652, 3944, 0, +3790, 4076, 0, +3927, 4095, 0, +0, 1890, 2226, +0, 1894, 2226, +0, 1900, 2225, +0, 1908, 2225, +0, 1918, 2224, +0, 1931, 2223, +0, 1948, 2221, +0, 1970, 2220, +0, 1994, 2220, +0, 2023, 2220, +0, 2060, 2220, +0, 2105, 2220, +0, 2159, 2220, +0, 2220, 2217, +0, 2220, 2128, +0, 2220, 1975, +0, 2220, 1626, +0, 2353, 0, +0, 2487, 0, +1505, 2620, 0, +2031, 2753, 0, +2327, 2886, 0, +2551, 3018, 0, +2742, 3151, 0, +2914, 3283, 0, +3073, 3415, 0, +3225, 3548, 0, +3371, 3680, 0, +3513, 3812, 0, +3653, 3944, 0, +3790, 4076, 0, +3927, 4095, 0, +0, 1860, 2226, +0, 1865, 2226, +0, 1871, 2225, +0, 1880, 2225, +0, 1891, 2224, +0, 1904, 2223, +0, 1922, 2221, +0, 1946, 2220, +0, 1975, 2217, +0, 2006, 2217, +0, 2044, 2217, +0, 2090, 2217, +0, 2146, 2217, +0, 2211, 2217, +0, 2217, 2136, +0, 2217, 1986, +0, 2217, 1649, +0, 2352, 0, +0, 2486, 0, +1578, 2619, 0, +2056, 2752, 0, +2340, 2885, 0, +2559, 3018, 0, +2747, 3151, 0, +2917, 3283, 0, +3076, 3415, 0, +3226, 3548, 0, +3372, 3680, 0, +3514, 3812, 0, +3653, 3944, 0, +3791, 4076, 0, +3927, 4095, 0, +0, 1817, 2226, +0, 1823, 2226, +0, 1829, 2225, +0, 1839, 2225, +0, 1850, 2224, +0, 1865, 2223, +0, 1885, 2221, +0, 1910, 2220, +0, 1942, 2217, +0, 1981, 2214, +0, 2021, 2214, +0, 2070, 2214, +0, 2128, 2214, +0, 2195, 2214, +0, 2214, 2146, +0, 2214, 2000, +0, 2214, 1677, +0, 2349, 0, +0, 2484, 0, +1661, 2618, 0, +2086, 2751, 0, +2356, 2885, 0, +2570, 3017, 0, +2754, 3150, 0, +2922, 3282, 0, +3079, 3415, 0, +3229, 3547, 0, +3374, 3680, 0, +3515, 3812, 0, +3654, 3944, 0, +3791, 4076, 0, +3927, 4095, 0, +0, 1753, 2226, +0, 1759, 2226, +0, 1767, 2225, +0, 1777, 2225, +0, 1790, 2224, +0, 1808, 2223, +0, 1830, 2221, +0, 1858, 2220, +0, 1894, 2217, +0, 1936, 2214, +0, 1988, 2209, +0, 2041, 2209, +0, 2102, 2209, +0, 2174, 2209, +0, 2209, 2159, +0, 2209, 2018, +0, 2209, 1713, +0, 2346, 0, +415, 2481, 0, +1752, 2616, 0, +2124, 2750, 0, +2378, 2883, 0, +2583, 3016, 0, +2763, 3150, 0, +2928, 3282, 0, +3083, 3414, 0, +3232, 3547, 0, +3376, 3679, 0, +3517, 3812, 0, +3656, 3944, 0, +3793, 4076, 0, +3928, 4095, 0, +0, 1648, 2226, +0, 1656, 2226, +0, 1666, 2225, +0, 1679, 2225, +0, 1695, 2224, +0, 1717, 2223, +0, 1744, 2221, +0, 1778, 2220, +0, 1819, 2217, +0, 1870, 2214, +0, 1929, 2209, +217, 1998, 2203, +217, 2066, 2203, +217, 2142, 2203, +217, 2203, 2176, +217, 2203, 2041, +217, 2203, 1757, +0, 2341, 437, +1199, 2478, 0, +1851, 2613, 0, +2170, 2748, 0, +2405, 2882, 0, +2600, 3015, 0, +2775, 3149, 0, +2936, 3281, 0, +3089, 3414, 0, +3236, 3547, 0, +3379, 3679, 0, +3520, 3812, 0, +3657, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1457, 2226, +0, 1469, 2226, +0, 1484, 2225, +0, 1503, 2225, +0, 1527, 2224, +0, 1557, 2223, +0, 1596, 2221, +0, 1642, 2220, +0, 1697, 2217, +0, 1762, 2214, +0, 1836, 2209, +217, 1920, 2203, +1136, 2012, 2194, +1136, 2097, 2194, +1136, 2191, 2194, +1136, 2194, 2069, +1136, 2194, 1809, +345, 2335, 970, +1535, 2473, 0, +1956, 2610, 0, +2226, 2746, 0, +2439, 2880, 0, +2623, 3014, 0, +2790, 3148, 0, +2947, 3280, 0, +3097, 3414, 0, +3242, 3546, 0, +3384, 3679, 0, +3522, 3811, 0, +3659, 3944, 0, +3795, 4076, 0, +3930, 4095, 0, +0, 907, 2226, +0, 944, 2226, +0, 990, 2225, +0, 1044, 2225, +0, 1108, 2224, +0, 1181, 2223, +0, 1264, 2221, +0, 1355, 2220, +0, 1454, 2217, +0, 1560, 2214, +0, 1671, 2209, +217, 1787, 2203, +1136, 1906, 2194, +1487, 2029, 2183, +1487, 2136, 2183, +1487, 2183, 2105, +1487, 2183, 1871, +1270, 2326, 1269, +1776, 2467, 477, +2067, 2605, 0, +2291, 2742, 0, +2480, 2878, 0, +2651, 3012, 0, +2810, 3146, 0, +2961, 3280, 0, +3107, 3413, 0, +3249, 3546, 0, +3389, 3678, 0, +3526, 3811, 0, +3662, 3943, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 0, 2226, +0, 0, 2226, +0, 0, 2225, +0, 0, 2225, +0, 0, 2224, +0, 0, 2223, +0, 0, 2221, +0, 0, 2220, +0, 140, 2217, +0, 932, 2214, +0, 1270, 2209, +217, 1512, 2203, +1136, 1711, 2194, +1487, 1888, 2183, +1733, 2051, 2167, +1733, 2167, 2149, +1733, 2167, 1943, +1718, 2315, 1619, +1976, 2459, 1401, +2183, 2599, 611, +2365, 2738, 0, +2530, 2874, 0, +2686, 3010, 0, +2835, 3144, 0, +2979, 3278, 0, +3120, 3412, 0, +3259, 3545, 0, +3396, 3678, 0, +3532, 3810, 0, +3666, 3943, 0, +3801, 4075, 0, +3934, 4095, 0, +0, 0, 2226, +0, 0, 2226, +0, 0, 2225, +0, 0, 2225, +0, 0, 2224, +0, 0, 2223, +0, 0, 2221, +0, 0, 2220, +0, 0, 2217, +0, 0, 2214, +303, 0, 2209, +838, 217, 2203, +1136, 1137, 2194, +1487, 1585, 2183, +1733, 1862, 2167, +1935, 2078, 2145, +1935, 2145, 2023, +1994, 2299, 1865, +2152, 2447, 1751, +2303, 2591, 1533, +2448, 2731, 738, +2590, 2870, 0, +2729, 3006, 0, +2867, 3142, 0, +3002, 3276, 0, +3137, 3410, 0, +3272, 3544, 0, +3405, 3677, 0, +3539, 3810, 0, +3672, 3943, 0, +3804, 4075, 0, +3937, 4095, 0, +1562, 0, 2226, +1565, 0, 2226, +1570, 0, 2225, +1576, 0, 2225, +1584, 0, 2224, +1595, 0, 2223, +1608, 0, 2221, +1626, 0, 2220, +1649, 0, 2217, +1677, 0, 2214, +1713, 0, 2209, +1757, 217, 2203, +1809, 1136, 2194, +1871, 1487, 2183, +1943, 1733, 2167, +2023, 1935, 2145, +2113, 2113, 2113, +2210, 2277, 2067, +2315, 2431, 1997, +2425, 2579, 1883, +2540, 2723, 1664, +2659, 2863, 870, +2781, 3002, 0, +2906, 3138, 0, +3031, 3274, 0, +3159, 3408, 0, +3288, 3543, 0, +3418, 3676, 0, +3548, 3809, 0, +3679, 3942, 0, +3810, 4075, 0, +3941, 4095, 0, +2078, 0, 2358, +2079, 0, 2358, +2080, 0, 2358, +2082, 0, 2357, +2085, 0, 2357, +2088, 0, 2356, +2093, 0, 2355, +2099, 0, 2353, +2107, 0, 2352, +2118, 0, 2349, +2132, 0, 2346, +2150, 0, 2341, +2173, 345, 2335, +2202, 1269, 2326, +2237, 1619, 2315, +2281, 1865, 2299, +2277, 2067, 2210, +2277, 2155, 2067, +2431, 2414, 1997, +2533, 2579, 1883, +2626, 2723, 1664, +2726, 2863, 870, +2833, 3002, 0, +2946, 3138, 0, +3062, 3274, 0, +3183, 3408, 0, +3306, 3543, 0, +3431, 3676, 0, +3558, 3809, 0, +3686, 3942, 0, +3815, 4075, 0, +3945, 4095, 0, +2371, 0, 2491, +2372, 0, 2491, +2373, 0, 2490, +2374, 0, 2490, +2375, 0, 2489, +2377, 0, 2489, +2379, 0, 2488, +2383, 0, 2487, +2387, 0, 2486, +2393, 0, 2484, +2401, 0, 2481, +2411, 0, 2478, +2423, 0, 2473, +2440, 477, 2467, +2459, 1401, 2455, +2447, 1751, 2401, +2431, 1997, 2315, +2431, 1997, 2126, +2431, 2207, 1997, +2579, 2502, 1883, +2719, 2723, 1664, +2803, 2863, 870, +2895, 3002, 0, +2995, 3138, 0, +3100, 3274, 0, +3212, 3408, 0, +3329, 3543, 0, +3448, 3676, 0, +3571, 3809, 0, +3696, 3942, 0, +3823, 4075, 0, +3951, 4095, 0, +2595, 0, 2623, +2595, 0, 2623, +2596, 0, 2623, +2596, 0, 2622, +2597, 0, 2622, +2598, 0, 2621, +2600, 0, 2621, +2602, 0, 2620, +2604, 0, 2619, +2608, 0, 2618, +2613, 0, 2616, +2613, 0, 2607, +2610, 0, 2592, +2605, 0, 2570, +2599, 611, 2538, +2591, 1533, 2493, +2579, 1883, 2425, +2579, 1883, 2284, +2579, 1883, 1981, +2579, 2267, 1883, +2723, 2598, 1664, +2863, 2837, 870, +2966, 3002, 0, +3053, 3138, 0, +3147, 3274, 0, +3249, 3408, 0, +3357, 3543, 0, +3471, 3676, 0, +3588, 3809, 0, +3709, 3942, 0, +3833, 4075, 0, +3959, 4095, 0, +2755, 0, 2723, +2755, 0, 2723, +2755, 0, 2722, +2755, 0, 2721, +2755, 0, 2720, +2754, 0, 2718, +2754, 0, 2716, +2753, 0, 2713, +2752, 0, 2710, +2751, 0, 2704, +2750, 0, 2697, +2748, 0, 2687, +2746, 0, 2674, +2742, 0, 2656, +2738, 0, 2631, +2731, 738, 2594, +2723, 1664, 2540, +2723, 1664, 2435, +2723, 1664, 2240, +2723, 1664, 1667, +2723, 2338, 1664, +2863, 2701, 870, +3002, 2952, 0, +3120, 3138, 0, +3203, 3274, 0, +3294, 3408, 0, +3393, 3543, 0, +3499, 3676, 0, +3610, 3809, 0, +3726, 3942, 0, +3846, 4075, 0, +3968, 4095, 0, +2887, 0, 2806, +2887, 0, 2805, +2887, 0, 2805, +2887, 0, 2804, +2887, 0, 2803, +2887, 0, 2802, +2886, 0, 2800, +2886, 0, 2798, +2885, 0, 2795, +2885, 0, 2790, +2883, 0, 2784, +2882, 0, 2777, +2880, 0, 2766, +2878, 0, 2751, +2874, 0, 2730, +2870, 0, 2701, +2863, 870, 2659, +2863, 870, 2580, +2863, 870, 2447, +2863, 870, 2173, +2863, 1498, 870, +2863, 2417, 870, +3002, 2810, 0, +3138, 3071, 0, +3268, 3274, 0, +3348, 3408, 0, +3437, 3543, 0, +3534, 3676, 0, +3638, 3809, 0, +3748, 3942, 0, +3862, 4075, 0, +3981, 4095, 0, +3019, 0, 2897, +3019, 0, 2897, +3019, 0, 2896, +3019, 0, 2896, +3019, 0, 2895, +3019, 0, 2894, +3018, 0, 2892, +3018, 0, 2890, +3018, 0, 2888, +3017, 0, 2885, +3016, 0, 2880, +3015, 0, 2873, +3014, 0, 2865, +3012, 0, 2853, +3010, 0, 2836, +3006, 0, 2813, +3002, 0, 2781, +3002, 0, 2722, +3002, 0, 2628, +3002, 0, 2463, +3002, 0, 2062, +3002, 1109, 0, +3002, 2505, 0, +3138, 2925, 0, +3274, 3193, 0, +3408, 3406, 0, +3490, 3543, 0, +3577, 3676, 0, +3672, 3809, 0, +3775, 3942, 0, +3884, 4075, 0, +3998, 4095, 0, +3152, 0, 2996, +3152, 0, 2996, +3152, 0, 2996, +3151, 0, 2995, +3151, 0, 2995, +3151, 0, 2994, +3151, 0, 2993, +3151, 0, 2991, +3151, 0, 2989, +3150, 0, 2986, +3150, 0, 2982, +3149, 0, 2977, +3148, 0, 2970, +3146, 0, 2961, +3144, 0, 2948, +3142, 0, 2931, +3138, 0, 2906, +3138, 0, 2861, +3138, 0, 2795, +3138, 0, 2687, +3138, 0, 2484, +3138, 0, 1857, +3138, 0, 0, +3138, 2602, 0, +3274, 3042, 0, +3408, 3317, 0, +3543, 3533, 0, +3629, 3676, 0, +3715, 3809, 0, +3809, 3942, 0, +3911, 4075, 0, +4019, 4095, 0, +3284, 0, 3102, +3283, 0, 3102, +3283, 0, 3101, +3283, 0, 3101, +3283, 0, 3101, +3283, 0, 3100, +3283, 0, 3099, +3283, 0, 3098, +3283, 0, 3096, +3282, 0, 3094, +3282, 0, 3091, +3281, 0, 3087, +3280, 0, 3082, +3280, 0, 3074, +3278, 0, 3064, +3276, 0, 3050, +3274, 0, 3031, +3274, 0, 2998, +3274, 0, 2950, +3274, 0, 2876, +3274, 0, 2753, +3274, 0, 2510, +3274, 0, 1202, +3274, 0, 0, +3274, 2706, 0, +3408, 3164, 0, +3543, 3444, 0, +3676, 3662, 0, +3766, 3809, 0, +3851, 3942, 0, +3945, 4075, 0, +4046, 4095, 0, +3416, 0, 3213, +3416, 0, 3213, +3416, 0, 3213, +3416, 0, 3213, +3416, 0, 3212, +3416, 0, 3212, +3415, 0, 3211, +3415, 0, 3210, +3415, 0, 3209, +3415, 0, 3207, +3414, 0, 3205, +3414, 0, 3202, +3414, 0, 3198, +3413, 0, 3192, +3412, 0, 3184, +3410, 0, 3174, +3408, 0, 3159, +3408, 0, 3134, +3408, 0, 3099, +3408, 0, 3047, +3408, 0, 2966, +3408, 0, 2830, +3408, 0, 2545, +3408, 0, 0, +3408, 0, 0, +3408, 2815, 0, +3543, 3288, 0, +3676, 3572, 0, +3809, 3791, 0, +3902, 3942, 0, +3986, 4075, 0, +4080, 4095, 0, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3328, +3548, 0, 3328, +3548, 0, 3327, +3548, 0, 3326, +3547, 0, 3325, +3547, 0, 3323, +3547, 0, 3320, +3546, 0, 3317, +3546, 0, 3313, +3545, 0, 3307, +3544, 0, 3299, +3543, 0, 3288, +3543, 0, 3270, +3543, 0, 3243, +3543, 0, 3206, +3543, 0, 3151, +3543, 0, 3065, +3543, 0, 2917, +3543, 0, 2585, +3543, 0, 0, +3543, 0, 0, +3543, 2929, 0, +3676, 3414, 0, +3809, 3700, 0, +3942, 3921, 0, +4037, 4075, 0, +4095, 4095, 0, +3680, 0, 3449, +3680, 0, 3449, +3680, 0, 3449, +3680, 0, 3449, +3680, 0, 3448, +3680, 0, 3448, +3680, 0, 3448, +3680, 0, 3447, +3680, 0, 3446, +3680, 0, 3445, +3679, 0, 3444, +3679, 0, 3442, +3679, 0, 3440, +3678, 0, 3436, +3678, 0, 3432, +3677, 0, 3426, +3676, 0, 3418, +3676, 0, 3404, +3676, 0, 3385, +3676, 0, 3358, +3676, 0, 3319, +3676, 0, 3261, +3676, 0, 3170, +3676, 0, 3010, +3676, 0, 2636, +3676, 0, 0, +3676, 0, 0, +3676, 3048, 0, +3809, 3542, 0, +3942, 3830, 0, +4075, 4051, 0, +4095, 4095, 0, +3812, 0, 3572, +3812, 0, 3572, +3812, 0, 3572, +3812, 0, 3571, +3812, 0, 3571, +3812, 0, 3571, +3812, 0, 3571, +3812, 0, 3570, +3812, 0, 3570, +3812, 0, 3569, +3812, 0, 3568, +3812, 0, 3566, +3811, 0, 3564, +3811, 0, 3562, +3810, 0, 3559, +3810, 0, 3554, +3809, 0, 3548, +3809, 0, 3537, +3809, 0, 3523, +3809, 0, 3503, +3809, 0, 3475, +3809, 0, 3435, +3809, 0, 3376, +3809, 0, 3281, +3809, 0, 3112, +3809, 0, 2694, +3809, 0, 0, +3809, 0, 0, +3809, 3169, 0, +3942, 3670, 0, +4075, 3960, 0, +4095, 4095, 0, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3695, +3944, 0, 3695, +3944, 0, 3694, +3944, 0, 3694, +3944, 0, 3692, +3944, 0, 3691, +3943, 0, 3689, +3943, 0, 3687, +3943, 0, 3683, +3942, 0, 3679, +3942, 0, 3671, +3942, 0, 3660, +3942, 0, 3646, +3942, 0, 3626, +3942, 0, 3597, +3942, 0, 3556, +3942, 0, 3494, +3942, 0, 3396, +3942, 0, 3220, +3942, 0, 2762, +3942, 0, 0, +3942, 0, 0, +3942, 3293, 0, +4075, 3799, 0, +4095, 4091, 0, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3822, +4076, 0, 3822, +4076, 0, 3822, +4076, 0, 3822, +4076, 0, 3821, +4076, 0, 3821, +4076, 0, 3820, +4076, 0, 3819, +4076, 0, 3817, +4075, 0, 3816, +4075, 0, 3813, +4075, 0, 3810, +4075, 0, 3803, +4075, 0, 3796, +4075, 0, 3785, +4075, 0, 3770, +4075, 0, 3750, +4075, 0, 3721, +4075, 0, 3679, +4075, 0, 3616, +4075, 0, 3515, +4075, 0, 3333, +4075, 0, 2839, +4075, 0, 0, +4075, 0, 0, +4075, 3419, 0, +4095, 3930, 0, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3950, +4095, 0, 3950, +4095, 0, 3950, +4095, 0, 3950, +4095, 0, 3949, +4095, 0, 3948, +4095, 0, 3947, +4095, 0, 3945, +4095, 0, 3944, +4095, 0, 3941, +4095, 0, 3937, +4095, 0, 3931, +4095, 0, 3923, +4095, 0, 3912, +4095, 0, 3897, +4095, 0, 3876, +4095, 0, 3847, +4095, 0, 3804, +4095, 0, 3741, +4095, 0, 3638, +4095, 0, 3450, +4095, 0, 2927, +4095, 0, 0, +4095, 0, 0, +4095, 3547, 0, +0, 2090, 2358, +0, 2093, 2358, +0, 2096, 2358, +0, 2100, 2358, +0, 2106, 2358, +0, 2113, 2358, +0, 2123, 2358, +0, 2136, 2358, +0, 2152, 2358, +0, 2173, 2358, +0, 2200, 2358, +0, 2233, 2358, +0, 2275, 2358, +0, 2325, 2358, +0, 2358, 2332, +0, 2358, 2239, +0, 2358, 2078, +0, 2358, 1692, +0, 2491, 0, +0, 2623, 0, +1353, 2755, 0, +2091, 2887, 0, +2422, 3019, 0, +2662, 3152, 0, +2860, 3284, 0, +3036, 3416, 0, +3198, 3548, 0, +3352, 3680, 0, +3499, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2088, 2358, +0, 2091, 2358, +0, 2094, 2358, +0, 2098, 2358, +0, 2104, 2358, +0, 2111, 2358, +0, 2121, 2358, +0, 2134, 2358, +0, 2150, 2358, +0, 2171, 2358, +0, 2199, 2358, +0, 2232, 2358, +0, 2273, 2358, +0, 2324, 2358, +0, 2358, 2332, +0, 2358, 2240, +0, 2358, 2079, +0, 2358, 1694, +0, 2491, 0, +0, 2623, 0, +1367, 2755, 0, +2094, 2887, 0, +2424, 3019, 0, +2663, 3152, 0, +2860, 3283, 0, +3036, 3416, 0, +3199, 3548, 0, +3352, 3680, 0, +3499, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2085, 2358, +0, 2087, 2358, +0, 2091, 2358, +0, 2096, 2358, +0, 2101, 2358, +0, 2109, 2358, +0, 2119, 2358, +0, 2132, 2358, +0, 2148, 2358, +0, 2169, 2358, +0, 2196, 2358, +0, 2230, 2358, +0, 2271, 2358, +0, 2322, 2358, +0, 2358, 2333, +0, 2358, 2241, +0, 2358, 2080, +0, 2358, 1698, +0, 2490, 0, +0, 2623, 0, +1386, 2755, 0, +2098, 2887, 0, +2426, 3019, 0, +2664, 3152, 0, +2861, 3283, 0, +3037, 3416, 0, +3199, 3548, 0, +3353, 3680, 0, +3500, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2080, 2358, +0, 2083, 2358, +0, 2087, 2358, +0, 2092, 2357, +0, 2098, 2357, +0, 2105, 2357, +0, 2115, 2357, +0, 2128, 2357, +0, 2145, 2357, +0, 2166, 2357, +0, 2193, 2357, +0, 2228, 2357, +0, 2269, 2357, +0, 2320, 2357, +0, 2357, 2334, +0, 2357, 2243, +0, 2357, 2082, +0, 2357, 1702, +0, 2490, 0, +0, 2622, 0, +1409, 2755, 0, +2103, 2887, 0, +2428, 3019, 0, +2665, 3151, 0, +2862, 3283, 0, +3038, 3416, 0, +3200, 3548, 0, +3353, 3680, 0, +3500, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2074, 2358, +0, 2077, 2358, +0, 2081, 2358, +0, 2086, 2357, +0, 2093, 2357, +0, 2101, 2357, +0, 2111, 2357, +0, 2124, 2357, +0, 2141, 2357, +0, 2162, 2357, +0, 2190, 2357, +0, 2224, 2357, +0, 2266, 2357, +0, 2317, 2357, +0, 2357, 2335, +0, 2357, 2245, +0, 2357, 2085, +0, 2357, 1708, +0, 2489, 0, +0, 2622, 0, +1439, 2755, 0, +2110, 2887, 0, +2431, 3019, 0, +2667, 3151, 0, +2863, 3283, 0, +3038, 3416, 0, +3200, 3548, 0, +3353, 3680, 0, +3500, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2066, 2358, +0, 2069, 2358, +0, 2073, 2358, +0, 2078, 2357, +0, 2086, 2357, +0, 2095, 2356, +0, 2105, 2356, +0, 2118, 2356, +0, 2135, 2356, +0, 2157, 2356, +0, 2185, 2356, +0, 2219, 2356, +0, 2262, 2356, +0, 2313, 2356, +0, 2356, 2338, +0, 2356, 2247, +0, 2356, 2088, +0, 2356, 1716, +0, 2489, 0, +0, 2621, 0, +1476, 2754, 0, +2118, 2887, 0, +2435, 3019, 0, +2670, 3151, 0, +2865, 3283, 0, +3039, 3416, 0, +3201, 3548, 0, +3354, 3680, 0, +3501, 3812, 0, +3644, 3944, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 2055, 2358, +0, 2058, 2358, +0, 2062, 2358, +0, 2068, 2357, +0, 2075, 2357, +0, 2084, 2356, +0, 2096, 2355, +0, 2110, 2355, +0, 2127, 2355, +0, 2150, 2355, +0, 2178, 2355, +0, 2213, 2355, +0, 2256, 2355, +0, 2308, 2355, +0, 2355, 2340, +0, 2355, 2251, +0, 2355, 2093, +0, 2355, 1727, +0, 2488, 0, +0, 2621, 0, +1521, 2754, 0, +2129, 2886, 0, +2441, 3018, 0, +2673, 3151, 0, +2867, 3283, 0, +3041, 3415, 0, +3202, 3548, 0, +3354, 3680, 0, +3501, 3812, 0, +3644, 3944, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 2040, 2358, +0, 2043, 2358, +0, 2047, 2358, +0, 2053, 2357, +0, 2060, 2357, +0, 2070, 2356, +0, 2083, 2355, +0, 2099, 2353, +0, 2117, 2353, +0, 2140, 2353, +0, 2168, 2353, +0, 2204, 2353, +0, 2248, 2353, +0, 2301, 2353, +0, 2353, 2344, +0, 2353, 2255, +0, 2353, 2099, +0, 2353, 1740, +0, 2487, 0, +0, 2620, 0, +1575, 2753, 0, +2144, 2886, 0, +2449, 3018, 0, +2678, 3151, 0, +2870, 3283, 0, +3043, 3415, 0, +3203, 3548, 0, +3356, 3680, 0, +3502, 3812, 0, +3645, 3944, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 2019, 2358, +0, 2022, 2358, +0, 2027, 2358, +0, 2032, 2357, +0, 2040, 2357, +0, 2050, 2356, +0, 2063, 2355, +0, 2081, 2353, +0, 2102, 2352, +0, 2126, 2352, +0, 2155, 2352, +0, 2192, 2352, +0, 2237, 2352, +0, 2291, 2352, +0, 2352, 2349, +0, 2352, 2261, +0, 2352, 2107, +0, 2352, 1758, +0, 2486, 0, +0, 2619, 0, +1638, 2752, 0, +2163, 2885, 0, +2459, 3018, 0, +2684, 3151, 0, +2874, 3283, 0, +3046, 3415, 0, +3205, 3548, 0, +3357, 3680, 0, +3503, 3812, 0, +3645, 3944, 0, +3785, 4076, 0, +3923, 4095, 0, +0, 1989, 2358, +0, 1993, 2358, +0, 1997, 2358, +0, 2004, 2357, +0, 2012, 2357, +0, 2022, 2356, +0, 2037, 2355, +0, 2054, 2353, +0, 2078, 2352, +0, 2107, 2349, +0, 2138, 2349, +0, 2176, 2349, +0, 2223, 2349, +0, 2278, 2349, +0, 2343, 2349, +0, 2349, 2268, +0, 2349, 2118, +0, 2349, 1781, +0, 2484, 0, +0, 2618, 0, +1711, 2751, 0, +2188, 2885, 0, +2471, 3017, 0, +2691, 3150, 0, +2879, 3282, 0, +3049, 3415, 0, +3208, 3547, 0, +3359, 3680, 0, +3504, 3812, 0, +3646, 3944, 0, +3785, 4076, 0, +3923, 4095, 0, +0, 1946, 2358, +0, 1950, 2358, +0, 1955, 2358, +0, 1962, 2357, +0, 1970, 2357, +0, 1982, 2356, +0, 1998, 2355, +0, 2017, 2353, +0, 2042, 2352, +0, 2074, 2349, +0, 2113, 2346, +0, 2153, 2346, +0, 2202, 2346, +0, 2260, 2346, +0, 2328, 2346, +0, 2346, 2278, +0, 2346, 2132, +0, 2346, 1809, +0, 2481, 0, +0, 2616, 0, +1794, 2750, 0, +2218, 2883, 0, +2488, 3016, 0, +2702, 3150, 0, +2886, 3282, 0, +3054, 3414, 0, +3211, 3547, 0, +3361, 3679, 0, +3506, 3812, 0, +3648, 3944, 0, +3787, 4076, 0, +3924, 4095, 0, +0, 1880, 2358, +0, 1885, 2358, +0, 1891, 2358, +0, 1899, 2357, +0, 1909, 2357, +0, 1922, 2356, +0, 1940, 2355, +0, 1962, 2353, +0, 1990, 2352, +0, 2025, 2349, +0, 2069, 2346, +0, 2120, 2341, +0, 2173, 2341, +0, 2234, 2341, +0, 2305, 2341, +0, 2341, 2291, +0, 2341, 2150, +0, 2341, 1845, +0, 2478, 0, +547, 2613, 0, +1885, 2748, 0, +2256, 2882, 0, +2510, 3015, 0, +2715, 3149, 0, +2895, 3281, 0, +3060, 3414, 0, +3216, 3547, 0, +3364, 3679, 0, +3508, 3812, 0, +3649, 3944, 0, +3787, 4076, 0, +3925, 4095, 0, +0, 1775, 2358, +0, 1781, 2358, +0, 1788, 2358, +0, 1798, 2357, +0, 1811, 2357, +0, 1828, 2356, +0, 1849, 2355, +0, 1876, 2353, +0, 1910, 2352, +0, 1951, 2349, +0, 2002, 2346, +0, 2061, 2341, +345, 2131, 2335, +345, 2198, 2335, +345, 2274, 2335, +345, 2335, 2308, +345, 2335, 2173, +345, 2335, 1889, +0, 2473, 557, +1330, 2610, 0, +1983, 2746, 0, +2302, 2880, 0, +2536, 3014, 0, +2733, 3148, 0, +2907, 3280, 0, +3069, 3414, 0, +3221, 3546, 0, +3368, 3679, 0, +3511, 3811, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1580, 2358, +0, 1589, 2358, +0, 1600, 2358, +0, 1615, 2357, +0, 1634, 2357, +0, 1659, 2356, +0, 1689, 2355, +0, 1727, 2353, +0, 1773, 2352, +0, 1829, 2349, +0, 1894, 2346, +0, 1968, 2341, +345, 2052, 2335, +1269, 2144, 2326, +1269, 2229, 2326, +1269, 2323, 2326, +1269, 2326, 2202, +1269, 2326, 1941, +477, 2467, 1099, +1667, 2605, 0, +2089, 2742, 0, +2358, 2878, 0, +2570, 3012, 0, +2755, 3146, 0, +2922, 3280, 0, +3079, 3413, 0, +3229, 3546, 0, +3374, 3678, 0, +3516, 3811, 0, +3655, 3943, 0, +3792, 4076, 0, +3927, 4095, 0, +0, 1009, 2358, +0, 1039, 2358, +0, 1076, 2358, +0, 1122, 2357, +0, 1176, 2357, +0, 1240, 2356, +0, 1313, 2355, +0, 1396, 2353, +0, 1487, 2352, +0, 1586, 2349, +0, 1692, 2346, +0, 1803, 2341, +345, 1919, 2335, +1269, 2038, 2326, +1619, 2161, 2315, +1619, 2268, 2315, +1619, 2315, 2237, +1619, 2315, 2003, +1403, 2459, 1401, +1908, 2599, 611, +2200, 2738, 0, +2423, 2874, 0, +2612, 3010, 0, +2783, 3144, 0, +2942, 3278, 0, +3093, 3412, 0, +3239, 3545, 0, +3381, 3678, 0, +3521, 3810, 0, +3659, 3943, 0, +3795, 4075, 0, +3930, 4095, 0, +0, 0, 2358, +0, 0, 2358, +0, 0, 2358, +0, 0, 2357, +0, 0, 2357, +0, 0, 2356, +0, 0, 2355, +0, 0, 2353, +0, 0, 2352, +0, 275, 2349, +0, 1064, 2346, +0, 1403, 2341, +345, 1644, 2335, +1269, 1843, 2326, +1619, 2020, 2315, +1865, 2183, 2299, +1865, 2299, 2281, +1865, 2299, 2075, +1850, 2447, 1751, +2108, 2591, 1533, +2315, 2731, 738, +2497, 2870, 0, +2662, 3006, 0, +2818, 3142, 0, +2967, 3276, 0, +3111, 3410, 0, +3253, 3544, 0, +3391, 3677, 0, +3528, 3810, 0, +3664, 3943, 0, +3798, 4075, 0, +3933, 4095, 0, +0, 0, 2358, +0, 0, 2358, +0, 0, 2358, +0, 0, 2357, +0, 0, 2357, +0, 0, 2356, +0, 0, 2355, +0, 0, 2353, +0, 0, 2352, +0, 0, 2349, +0, 0, 2346, +437, 0, 2341, +970, 345, 2335, +1269, 1270, 2326, +1619, 1718, 2315, +1865, 1994, 2299, +2067, 2210, 2277, +2067, 2277, 2155, +2126, 2431, 1997, +2284, 2579, 1883, +2435, 2723, 1664, +2580, 2863, 870, +2722, 3002, 0, +2861, 3138, 0, +2998, 3274, 0, +3134, 3408, 0, +3270, 3543, 0, +3404, 3676, 0, +3537, 3809, 0, +3671, 3942, 0, +3803, 4075, 0, +3937, 4095, 0, +1692, 0, 2358, +1694, 0, 2358, +1698, 0, 2358, +1702, 0, 2357, +1708, 0, 2357, +1716, 0, 2356, +1727, 0, 2355, +1740, 0, 2353, +1758, 0, 2352, +1781, 0, 2349, +1809, 0, 2346, +1845, 0, 2341, +1889, 345, 2335, +1941, 1269, 2326, +2003, 1619, 2315, +2075, 1865, 2299, +2155, 2067, 2277, +2245, 2245, 2245, +2343, 2409, 2199, +2447, 2563, 2129, +2557, 2711, 2015, +2672, 2855, 1796, +2791, 2995, 1006, +2913, 3134, 0, +3037, 3270, 0, +3164, 3406, 0, +3291, 3541, 0, +3420, 3675, 0, +3550, 3808, 0, +3680, 3941, 0, +3810, 4074, 0, +3942, 4095, 0, +2209, 0, 2491, +2210, 0, 2491, +2211, 0, 2490, +2213, 0, 2490, +2215, 0, 2489, +2218, 0, 2489, +2221, 0, 2488, +2226, 0, 2487, +2232, 0, 2486, +2240, 0, 2484, +2251, 0, 2481, +2264, 0, 2478, +2282, 0, 2473, +2305, 477, 2467, +2334, 1401, 2459, +2370, 1751, 2447, +2414, 1997, 2431, +2409, 2199, 2343, +2409, 2288, 2199, +2563, 2545, 2129, +2665, 2711, 2015, +2758, 2855, 1796, +2858, 2995, 1006, +2965, 3134, 0, +3078, 3270, 0, +3194, 3406, 0, +3315, 3541, 0, +3438, 3675, 0, +3563, 3808, 0, +3690, 3941, 0, +3818, 4074, 0, +3947, 4095, 0, +2503, 0, 2623, +2503, 0, 2623, +2504, 0, 2623, +2505, 0, 2622, +2506, 0, 2622, +2507, 0, 2621, +2509, 0, 2621, +2511, 0, 2620, +2515, 0, 2619, +2519, 0, 2618, +2525, 0, 2616, +2533, 0, 2613, +2543, 0, 2610, +2556, 0, 2605, +2572, 611, 2599, +2591, 1533, 2587, +2579, 1883, 2533, +2563, 2129, 2447, +2563, 2129, 2258, +2563, 2339, 2129, +2711, 2634, 2015, +2852, 2855, 1796, +2935, 2995, 1006, +3027, 3134, 0, +3126, 3270, 0, +3233, 3406, 0, +3344, 3541, 0, +3461, 3675, 0, +3581, 3808, 0, +3703, 3941, 0, +3828, 4074, 0, +3955, 4095, 0, +2727, 0, 2755, +2727, 0, 2755, +2728, 0, 2755, +2728, 0, 2755, +2729, 0, 2755, +2730, 0, 2754, +2731, 0, 2754, +2732, 0, 2753, +2734, 0, 2752, +2737, 0, 2751, +2741, 0, 2750, +2745, 0, 2748, +2746, 0, 2740, +2742, 0, 2724, +2738, 0, 2702, +2731, 738, 2671, +2723, 1664, 2626, +2711, 2015, 2557, +2711, 2015, 2416, +2711, 2015, 2114, +2711, 2400, 2015, +2855, 2730, 1796, +2995, 2968, 1006, +3098, 3134, 0, +3184, 3270, 0, +3279, 3406, 0, +3381, 3541, 0, +3490, 3675, 0, +3603, 3808, 0, +3720, 3941, 0, +3841, 4074, 0, +3965, 4095, 0, +2887, 0, 2856, +2887, 0, 2855, +2887, 0, 2855, +2887, 0, 2854, +2887, 0, 2853, +2887, 0, 2852, +2886, 0, 2850, +2886, 0, 2848, +2885, 0, 2845, +2885, 0, 2842, +2883, 0, 2836, +2882, 0, 2829, +2880, 0, 2820, +2878, 0, 2807, +2874, 0, 2788, +2870, 0, 2763, +2863, 870, 2726, +2855, 1796, 2672, +2855, 1796, 2567, +2855, 1796, 2372, +2855, 1796, 1797, +2855, 2470, 1796, +2995, 2833, 1006, +3134, 3084, 0, +3252, 3270, 0, +3335, 3406, 0, +3426, 3541, 0, +3525, 3675, 0, +3631, 3808, 0, +3742, 3941, 0, +3858, 4074, 0, +3978, 4095, 0, +3019, 0, 2938, +3019, 0, 2938, +3019, 0, 2938, +3019, 0, 2937, +3019, 0, 2936, +3019, 0, 2935, +3018, 0, 2934, +3018, 0, 2932, +3018, 0, 2930, +3017, 0, 2927, +3016, 0, 2922, +3015, 0, 2916, +3014, 0, 2908, +3012, 0, 2898, +3010, 0, 2883, +3006, 0, 2862, +3002, 0, 2833, +2995, 1006, 2791, +2995, 1006, 2712, +2995, 1006, 2579, +2995, 1006, 2303, +2995, 1635, 1006, +2995, 2549, 1006, +3134, 2943, 0, +3270, 3203, 0, +3400, 3406, 0, +3480, 3541, 0, +3569, 3675, 0, +3666, 3808, 0, +3770, 3941, 0, +3880, 4074, 0, +3994, 4095, 0, +3152, 0, 3030, +3152, 0, 3029, +3152, 0, 3029, +3151, 0, 3029, +3151, 0, 3028, +3151, 0, 3027, +3151, 0, 3026, +3151, 0, 3025, +3151, 0, 3023, +3150, 0, 3020, +3150, 0, 3017, +3149, 0, 3012, +3148, 0, 3005, +3146, 0, 2997, +3144, 0, 2985, +3142, 0, 2969, +3138, 0, 2946, +3134, 0, 2913, +3134, 0, 2854, +3134, 0, 2761, +3134, 0, 2596, +3134, 0, 2195, +3134, 1211, 0, +3134, 2638, 0, +3270, 3056, 0, +3406, 3325, 0, +3541, 3538, 0, +3622, 3675, 0, +3709, 3808, 0, +3805, 3941, 0, +3907, 4074, 0, +4016, 4095, 0, +3284, 0, 3128, +3283, 0, 3128, +3283, 0, 3128, +3283, 0, 3128, +3283, 0, 3127, +3283, 0, 3127, +3283, 0, 3126, +3283, 0, 3125, +3283, 0, 3123, +3282, 0, 3121, +3282, 0, 3118, +3281, 0, 3114, +3280, 0, 3109, +3280, 0, 3102, +3278, 0, 3093, +3276, 0, 3080, +3274, 0, 3062, +3270, 0, 3037, +3270, 0, 2993, +3270, 0, 2926, +3270, 0, 2818, +3270, 0, 2616, +3270, 0, 1990, +3270, 0, 0, +3270, 2734, 0, +3406, 3175, 0, +3541, 3450, 0, +3675, 3665, 0, +3761, 3808, 0, +3847, 3941, 0, +3941, 4074, 0, +4043, 4095, 0, +3416, 0, 3234, +3416, 0, 3234, +3416, 0, 3234, +3416, 0, 3234, +3416, 0, 3233, +3416, 0, 3233, +3415, 0, 3232, +3415, 0, 3231, +3415, 0, 3230, +3415, 0, 3228, +3414, 0, 3226, +3414, 0, 3223, +3414, 0, 3219, +3413, 0, 3214, +3412, 0, 3206, +3410, 0, 3196, +3408, 0, 3183, +3406, 0, 3164, +3406, 0, 3131, +3406, 0, 3082, +3406, 0, 3008, +3406, 0, 2886, +3406, 0, 2643, +3406, 0, 1325, +3406, 0, 0, +3406, 2838, 0, +3541, 3296, 0, +3675, 3576, 0, +3808, 3794, 0, +3898, 3941, 0, +3983, 4074, 0, +4077, 4095, 0, +3548, 0, 3346, +3548, 0, 3346, +3548, 0, 3346, +3548, 0, 3345, +3548, 0, 3345, +3548, 0, 3344, +3548, 0, 3344, +3548, 0, 3343, +3548, 0, 3342, +3547, 0, 3341, +3547, 0, 3339, +3547, 0, 3337, +3546, 0, 3334, +3546, 0, 3330, +3545, 0, 3324, +3544, 0, 3316, +3543, 0, 3306, +3541, 0, 3291, +3541, 0, 3267, +3541, 0, 3231, +3541, 0, 3179, +3541, 0, 3099, +3541, 0, 2963, +3541, 0, 2676, +3541, 0, 0, +3541, 0, 0, +3541, 2947, 0, +3675, 3420, 0, +3808, 3704, 0, +3941, 3923, 0, +4034, 4074, 0, +4095, 4095, 0, +3680, 0, 3462, +3680, 0, 3462, +3680, 0, 3462, +3680, 0, 3461, +3680, 0, 3461, +3680, 0, 3461, +3680, 0, 3460, +3680, 0, 3460, +3680, 0, 3459, +3680, 0, 3458, +3679, 0, 3457, +3679, 0, 3455, +3679, 0, 3453, +3678, 0, 3449, +3678, 0, 3445, +3677, 0, 3439, +3676, 0, 3431, +3675, 0, 3420, +3675, 0, 3402, +3675, 0, 3376, +3675, 0, 3338, +3675, 0, 3283, +3675, 0, 3197, +3675, 0, 3048, +3675, 0, 2718, +3675, 0, 0, +3675, 0, 0, +3675, 3061, 0, +3808, 3546, 0, +3941, 3832, 0, +4074, 4053, 0, +4095, 4095, 0, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3580, +3812, 0, 3580, +3812, 0, 3579, +3812, 0, 3579, +3812, 0, 3577, +3812, 0, 3576, +3811, 0, 3574, +3811, 0, 3572, +3810, 0, 3569, +3810, 0, 3564, +3809, 0, 3558, +3808, 0, 3550, +3808, 0, 3536, +3808, 0, 3517, +3808, 0, 3490, +3808, 0, 3451, +3808, 0, 3393, +3808, 0, 3302, +3808, 0, 3143, +3808, 0, 2767, +3808, 0, 0, +3808, 0, 0, +3808, 3180, 0, +3941, 3674, 0, +4074, 3962, 0, +4095, 4095, 0, +3944, 0, 3704, +3944, 0, 3704, +3944, 0, 3704, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3702, +3944, 0, 3702, +3944, 0, 3701, +3944, 0, 3700, +3944, 0, 3699, +3943, 0, 3697, +3943, 0, 3694, +3943, 0, 3691, +3942, 0, 3686, +3941, 0, 3680, +3941, 0, 3669, +3941, 0, 3655, +3941, 0, 3635, +3941, 0, 3608, +3941, 0, 3568, +3941, 0, 3507, +3941, 0, 3413, +3941, 0, 3244, +3941, 0, 2826, +3941, 0, 0, +3941, 0, 0, +3941, 3302, 0, +4074, 3802, 0, +4095, 4092, 0, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3827, +4076, 0, 3827, +4076, 0, 3826, +4076, 0, 3826, +4076, 0, 3824, +4076, 0, 3823, +4075, 0, 3821, +4075, 0, 3818, +4075, 0, 3815, +4074, 0, 3810, +4074, 0, 3803, +4074, 0, 3792, +4074, 0, 3777, +4074, 0, 3757, +4074, 0, 3729, +4074, 0, 3688, +4074, 0, 3626, +4074, 0, 3528, +4074, 0, 3351, +4074, 0, 2893, +4074, 0, 0, +4074, 0, 0, +4074, 3426, 0, +4095, 3932, 0, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3954, +4095, 0, 3954, +4095, 0, 3954, +4095, 0, 3953, +4095, 0, 3952, +4095, 0, 3951, +4095, 0, 3950, +4095, 0, 3948, +4095, 0, 3945, +4095, 0, 3942, +4095, 0, 3936, +4095, 0, 3928, +4095, 0, 3917, +4095, 0, 3903, +4095, 0, 3882, +4095, 0, 3853, +4095, 0, 3811, +4095, 0, 3748, +4095, 0, 3648, +4095, 0, 3465, +4095, 0, 2973, +4095, 0, 0, +4095, 0, 0, +4095, 3552, 0, +0, 2222, 2491, +0, 2224, 2491, +0, 2226, 2491, +0, 2230, 2491, +0, 2234, 2491, +0, 2239, 2491, +0, 2247, 2491, +0, 2256, 2491, +0, 2269, 2491, +0, 2285, 2491, +0, 2306, 2491, +0, 2333, 2491, +0, 2367, 2491, +0, 2408, 2491, +0, 2458, 2491, +0, 2491, 2463, +0, 2491, 2371, +0, 2491, 2209, +0, 2491, 1822, +0, 2623, 0, +0, 2755, 0, +1472, 2887, 0, +2220, 3019, 0, +2554, 3152, 0, +2793, 3284, 0, +2992, 3416, 0, +3168, 3548, 0, +3330, 3680, 0, +3484, 3812, 0, +3631, 3944, 0, +3774, 4076, 0, +3915, 4095, 0, +0, 2220, 2491, +0, 2223, 2491, +0, 2225, 2491, +0, 2228, 2491, +0, 2233, 2491, +0, 2238, 2491, +0, 2245, 2491, +0, 2255, 2491, +0, 2268, 2491, +0, 2284, 2491, +0, 2305, 2491, +0, 2332, 2491, +0, 2366, 2491, +0, 2407, 2491, +0, 2457, 2491, +0, 2491, 2464, +0, 2491, 2372, +0, 2491, 2210, +0, 2491, 1824, +0, 2623, 0, +0, 2755, 0, +1483, 2887, 0, +2222, 3019, 0, +2555, 3152, 0, +2793, 3283, 0, +2992, 3416, 0, +3168, 3548, 0, +3331, 3680, 0, +3484, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2218, 2491, +0, 2220, 2491, +0, 2223, 2490, +0, 2226, 2490, +0, 2230, 2490, +0, 2236, 2490, +0, 2243, 2490, +0, 2253, 2490, +0, 2266, 2490, +0, 2283, 2490, +0, 2304, 2490, +0, 2331, 2490, +0, 2364, 2490, +0, 2406, 2490, +0, 2456, 2490, +0, 2490, 2464, +0, 2490, 2373, +0, 2490, 2211, +0, 2490, 1826, +0, 2623, 0, +0, 2755, 0, +1497, 2887, 0, +2225, 3019, 0, +2556, 3152, 0, +2794, 3283, 0, +2992, 3416, 0, +3168, 3548, 0, +3331, 3680, 0, +3484, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2215, 2491, +0, 2217, 2491, +0, 2220, 2490, +0, 2223, 2490, +0, 2228, 2490, +0, 2234, 2490, +0, 2241, 2490, +0, 2251, 2490, +0, 2264, 2490, +0, 2280, 2490, +0, 2302, 2490, +0, 2329, 2490, +0, 2362, 2490, +0, 2404, 2490, +0, 2454, 2490, +0, 2490, 2465, +0, 2490, 2374, +0, 2490, 2213, +0, 2490, 1830, +0, 2622, 0, +0, 2755, 0, +1516, 2887, 0, +2229, 3019, 0, +2558, 3151, 0, +2795, 3283, 0, +2993, 3416, 0, +3169, 3548, 0, +3331, 3680, 0, +3485, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2210, 2491, +0, 2212, 2491, +0, 2215, 2490, +0, 2219, 2490, +0, 2224, 2489, +0, 2230, 2489, +0, 2238, 2489, +0, 2247, 2489, +0, 2260, 2489, +0, 2277, 2489, +0, 2298, 2489, +0, 2326, 2489, +0, 2360, 2489, +0, 2401, 2489, +0, 2452, 2489, +0, 2489, 2466, +0, 2489, 2375, +0, 2489, 2215, +0, 2489, 1834, +0, 2622, 0, +0, 2755, 0, +1540, 2887, 0, +2234, 3019, 0, +2560, 3151, 0, +2797, 3283, 0, +2994, 3416, 0, +3170, 3548, 0, +3332, 3680, 0, +3485, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2204, 2491, +0, 2206, 2491, +0, 2209, 2490, +0, 2213, 2490, +0, 2219, 2489, +0, 2226, 2489, +0, 2233, 2489, +0, 2243, 2489, +0, 2256, 2489, +0, 2273, 2489, +0, 2294, 2489, +0, 2322, 2489, +0, 2356, 2489, +0, 2398, 2489, +0, 2449, 2489, +0, 2489, 2468, +0, 2489, 2377, +0, 2489, 2218, +0, 2489, 1840, +0, 2621, 0, +0, 2754, 0, +1569, 2887, 0, +2241, 3019, 0, +2564, 3151, 0, +2799, 3283, 0, +2996, 3416, 0, +3171, 3548, 0, +3332, 3680, 0, +3485, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3916, 4095, 0, +0, 2196, 2491, +0, 2199, 2491, +0, 2202, 2490, +0, 2206, 2490, +0, 2211, 2489, +0, 2218, 2489, +0, 2227, 2488, +0, 2237, 2488, +0, 2250, 2488, +0, 2267, 2488, +0, 2289, 2488, +0, 2317, 2488, +0, 2352, 2488, +0, 2394, 2488, +0, 2445, 2488, +0, 2488, 2470, +0, 2488, 2379, +0, 2488, 2221, +0, 2488, 1848, +0, 2621, 0, +0, 2754, 0, +1606, 2886, 0, +2249, 3018, 0, +2568, 3151, 0, +2801, 3283, 0, +2997, 3415, 0, +3172, 3548, 0, +3333, 3680, 0, +3486, 3812, 0, +3633, 3944, 0, +3776, 4076, 0, +3916, 4095, 0, +0, 2185, 2491, +0, 2187, 2491, +0, 2190, 2490, +0, 2195, 2490, +0, 2200, 2489, +0, 2207, 2489, +0, 2217, 2488, +0, 2229, 2487, +0, 2242, 2487, +0, 2260, 2487, +0, 2282, 2487, +0, 2310, 2487, +0, 2345, 2487, +0, 2388, 2487, +0, 2440, 2487, +0, 2487, 2473, +0, 2487, 2383, +0, 2487, 2226, +0, 2487, 1859, +0, 2620, 0, +0, 2753, 0, +1651, 2886, 0, +2261, 3018, 0, +2573, 3151, 0, +2805, 3283, 0, +2999, 3415, 0, +3173, 3548, 0, +3334, 3680, 0, +3487, 3812, 0, +3633, 3944, 0, +3776, 4076, 0, +3916, 4095, 0, +0, 2170, 2491, +0, 2172, 2491, +0, 2175, 2490, +0, 2180, 2490, +0, 2185, 2489, +0, 2193, 2489, +0, 2202, 2488, +0, 2215, 2487, +0, 2231, 2486, +0, 2249, 2486, +0, 2272, 2486, +0, 2301, 2486, +0, 2336, 2486, +0, 2380, 2486, +0, 2433, 2486, +0, 2486, 2476, +0, 2486, 2387, +0, 2486, 2232, +0, 2486, 1873, +0, 2619, 0, +0, 2752, 0, +1706, 2885, 0, +2276, 3018, 0, +2581, 3151, 0, +2809, 3283, 0, +3002, 3415, 0, +3175, 3548, 0, +3336, 3680, 0, +3488, 3812, 0, +3634, 3944, 0, +3777, 4076, 0, +3917, 4095, 0, +0, 2149, 2491, +0, 2151, 2491, +0, 2154, 2490, +0, 2159, 2490, +0, 2165, 2489, +0, 2172, 2489, +0, 2183, 2488, +0, 2196, 2487, +0, 2213, 2486, +0, 2235, 2484, +0, 2258, 2484, +0, 2288, 2484, +0, 2325, 2484, +0, 2369, 2484, +0, 2423, 2484, +0, 2484, 2481, +0, 2484, 2393, +0, 2484, 2240, +0, 2484, 1891, +0, 2618, 0, +0, 2751, 0, +1769, 2885, 0, +2294, 3017, 0, +2591, 3150, 0, +2815, 3282, 0, +3006, 3415, 0, +3178, 3547, 0, +3337, 3680, 0, +3489, 3812, 0, +3635, 3944, 0, +3777, 4076, 0, +3917, 4095, 0, +0, 2119, 2491, +0, 2121, 2491, +0, 2125, 2490, +0, 2129, 2490, +0, 2136, 2489, +0, 2144, 2489, +0, 2155, 2488, +0, 2169, 2487, +0, 2187, 2486, +0, 2210, 2484, +0, 2239, 2481, +0, 2270, 2481, +0, 2308, 2481, +0, 2355, 2481, +0, 2410, 2481, +0, 2475, 2481, +0, 2481, 2401, +0, 2481, 2251, +0, 2481, 1913, +0, 2616, 0, +0, 2750, 0, +1843, 2883, 0, +2319, 3016, 0, +2604, 3150, 0, +2823, 3282, 0, +3011, 3414, 0, +3182, 3547, 0, +3340, 3679, 0, +3491, 3812, 0, +3636, 3944, 0, +3778, 4076, 0, +3918, 4095, 0, +0, 2075, 2491, +0, 2078, 2491, +0, 2082, 2490, +0, 2087, 2490, +0, 2094, 2489, +0, 2103, 2489, +0, 2115, 2488, +0, 2130, 2487, +0, 2149, 2486, +0, 2174, 2484, +0, 2206, 2481, +0, 2245, 2478, +0, 2285, 2478, +0, 2334, 2478, +0, 2392, 2478, +0, 2460, 2478, +0, 2478, 2411, +0, 2478, 2264, +0, 2478, 1941, +0, 2613, 0, +0, 2748, 0, +1925, 2882, 0, +2350, 3015, 0, +2620, 3149, 0, +2833, 3281, 0, +3018, 3414, 0, +3186, 3547, 0, +3343, 3679, 0, +3493, 3812, 0, +3638, 3944, 0, +3780, 4076, 0, +3919, 4095, 0, +0, 2009, 2491, +0, 2013, 2491, +0, 2017, 2490, +0, 2023, 2490, +0, 2031, 2489, +0, 2041, 2489, +0, 2055, 2488, +0, 2072, 2487, +0, 2094, 2486, +0, 2122, 2484, +0, 2158, 2481, +0, 2201, 2478, +0, 2253, 2473, +0, 2305, 2473, +0, 2366, 2473, +0, 2438, 2473, +0, 2473, 2423, +0, 2473, 2282, +0, 2473, 1977, +0, 2610, 0, +678, 2746, 0, +2016, 2880, 0, +2388, 3014, 0, +2642, 3148, 0, +2847, 3280, 0, +3027, 3414, 0, +3192, 3546, 0, +3348, 3679, 0, +3496, 3811, 0, +3640, 3944, 0, +3781, 4076, 0, +3920, 4095, 0, +0, 1903, 2491, +0, 1907, 2491, +0, 1913, 2490, +0, 1920, 2490, +0, 1930, 2489, +0, 1943, 2489, +0, 1960, 2488, +0, 1981, 2487, +0, 2008, 2486, +0, 2042, 2484, +0, 2084, 2481, +0, 2134, 2478, +0, 2194, 2473, +477, 2263, 2467, +477, 2330, 2467, +477, 2407, 2467, +477, 2467, 2440, +477, 2467, 2305, +477, 2467, 2021, +0, 2605, 705, +1463, 2742, 0, +2115, 2878, 0, +2434, 3012, 0, +2669, 3146, 0, +2865, 3280, 0, +3039, 3413, 0, +3201, 3546, 0, +3354, 3678, 0, +3501, 3811, 0, +3644, 3943, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 1706, 2491, +0, 1713, 2491, +0, 1722, 2490, +0, 1733, 2490, +0, 1748, 2489, +0, 1767, 2489, +0, 1791, 2488, +0, 1822, 2487, +0, 1859, 2486, +0, 1906, 2484, +0, 1961, 2481, +0, 2026, 2478, +0, 2100, 2473, +477, 2184, 2467, +1401, 2276, 2459, +1401, 2362, 2459, +1401, 2455, 2459, +1401, 2459, 2334, +1401, 2459, 2073, +611, 2599, 1236, +1799, 2738, 0, +2220, 2874, 0, +2489, 3010, 0, +2703, 3144, 0, +2886, 3278, 0, +3055, 3412, 0, +3211, 3545, 0, +3361, 3678, 0, +3506, 3810, 0, +3648, 3943, 0, +3787, 4075, 0, +3924, 4095, 0, +0, 1120, 2491, +0, 1143, 2491, +0, 1173, 2490, +0, 1210, 2490, +0, 1255, 2489, +0, 1310, 2489, +0, 1373, 2488, +0, 1446, 2487, +0, 1529, 2486, +0, 1620, 2484, +0, 1719, 2481, +0, 1824, 2478, +0, 1935, 2473, +477, 2051, 2467, +1401, 2171, 2459, +1751, 2293, 2447, +1751, 2401, 2447, +1751, 2447, 2370, +1751, 2447, 2135, +1533, 2591, 1533, +2040, 2731, 738, +2332, 2870, 0, +2554, 3006, 0, +2744, 3142, 0, +2915, 3276, 0, +3074, 3410, 0, +3225, 3544, 0, +3371, 3677, 0, +3514, 3810, 0, +3653, 3943, 0, +3790, 4075, 0, +3927, 4095, 0, +0, 0, 2491, +0, 0, 2491, +0, 0, 2490, +0, 0, 2490, +0, 0, 2489, +0, 0, 2489, +0, 0, 2488, +0, 0, 2487, +0, 0, 2486, +0, 0, 2484, +0, 415, 2481, +0, 1199, 2478, +0, 1535, 2473, +477, 1776, 2467, +1401, 1976, 2459, +1751, 2152, 2447, +1997, 2315, 2431, +1997, 2431, 2414, +1997, 2431, 2207, +1981, 2579, 1883, +2240, 2723, 1664, +2447, 2863, 870, +2628, 3002, 0, +2795, 3138, 0, +2950, 3274, 0, +3099, 3408, 0, +3243, 3543, 0, +3385, 3676, 0, +3523, 3809, 0, +3660, 3942, 0, +3796, 4075, 0, +3931, 4095, 0, +0, 0, 2491, +0, 0, 2491, +0, 0, 2490, +0, 0, 2490, +0, 0, 2489, +0, 0, 2489, +0, 0, 2488, +0, 0, 2487, +0, 0, 2486, +0, 0, 2484, +0, 0, 2481, +0, 0, 2478, +557, 0, 2473, +1099, 477, 2467, +1401, 1403, 2459, +1751, 1850, 2447, +1997, 2126, 2431, +2199, 2343, 2409, +2199, 2409, 2288, +2258, 2563, 2129, +2416, 2711, 2015, +2567, 2855, 1796, +2712, 2995, 1006, +2854, 3134, 0, +2993, 3270, 0, +3131, 3406, 0, +3267, 3541, 0, +3402, 3675, 0, +3536, 3808, 0, +3669, 3941, 0, +3803, 4074, 0, +3936, 4095, 0, +1822, 0, 2491, +1824, 0, 2491, +1826, 0, 2490, +1830, 0, 2490, +1834, 0, 2489, +1840, 0, 2489, +1848, 0, 2488, +1859, 0, 2487, +1873, 0, 2486, +1891, 0, 2484, +1913, 0, 2481, +1941, 0, 2478, +1977, 0, 2473, +2021, 477, 2467, +2073, 1401, 2459, +2135, 1751, 2447, +2207, 1997, 2431, +2288, 2199, 2409, +2377, 2377, 2377, +2475, 2541, 2331, +2579, 2696, 2261, +2689, 2843, 2147, +2804, 2987, 1930, +2923, 3128, 1137, +3045, 3266, 0, +3170, 3402, 0, +3296, 3538, 0, +3423, 3673, 0, +3552, 3807, 0, +3682, 3940, 0, +3812, 4073, 0, +3943, 4095, 0, +2340, 0, 2623, +2341, 0, 2623, +2342, 0, 2623, +2343, 0, 2622, +2344, 0, 2622, +2346, 0, 2621, +2349, 0, 2621, +2352, 0, 2620, +2357, 0, 2619, +2363, 0, 2618, +2372, 0, 2616, +2382, 0, 2613, +2396, 0, 2610, +2414, 0, 2605, +2437, 611, 2599, +2466, 1533, 2591, +2502, 1883, 2579, +2545, 2129, 2563, +2541, 2331, 2475, +2541, 2420, 2331, +2696, 2678, 2261, +2797, 2843, 2147, +2890, 2987, 1930, +2991, 3128, 1137, +3097, 3266, 0, +3210, 3402, 0, +3326, 3538, 0, +3447, 3673, 0, +3570, 3807, 0, +3695, 3940, 0, +3822, 4073, 0, +3950, 4095, 0, +2635, 0, 2755, +2635, 0, 2755, +2636, 0, 2755, +2636, 0, 2755, +2637, 0, 2755, +2638, 0, 2754, +2640, 0, 2754, +2641, 0, 2753, +2644, 0, 2752, +2647, 0, 2751, +2651, 0, 2750, +2657, 0, 2748, +2665, 0, 2746, +2675, 0, 2742, +2688, 0, 2738, +2705, 738, 2731, +2723, 1664, 2719, +2711, 2015, 2665, +2696, 2261, 2579, +2696, 2261, 2391, +2696, 2471, 2261, +2843, 2766, 2147, +2984, 2987, 1930, +3067, 3128, 1137, +3159, 3266, 0, +3259, 3402, 0, +3365, 3538, 0, +3477, 3673, 0, +3593, 3807, 0, +3713, 3940, 0, +3835, 4073, 0, +3961, 4095, 0, +2859, 0, 2887, +2859, 0, 2887, +2859, 0, 2887, +2860, 0, 2887, +2860, 0, 2887, +2861, 0, 2887, +2862, 0, 2886, +2863, 0, 2886, +2864, 0, 2885, +2866, 0, 2885, +2869, 0, 2883, +2873, 0, 2882, +2877, 0, 2880, +2878, 0, 2872, +2874, 0, 2856, +2870, 0, 2834, +2863, 870, 2803, +2855, 1796, 2758, +2843, 2147, 2689, +2843, 2147, 2549, +2843, 2147, 2246, +2843, 2532, 2147, +2987, 2862, 1930, +3128, 3101, 1137, +3230, 3266, 0, +3317, 3402, 0, +3411, 3538, 0, +3513, 3673, 0, +3622, 3807, 0, +3735, 3940, 0, +3852, 4073, 0, +3974, 4095, 0, +3019, 0, 2988, +3019, 0, 2987, +3019, 0, 2987, +3019, 0, 2987, +3019, 0, 2986, +3019, 0, 2985, +3018, 0, 2984, +3018, 0, 2982, +3018, 0, 2980, +3017, 0, 2977, +3016, 0, 2974, +3015, 0, 2968, +3014, 0, 2961, +3012, 0, 2952, +3010, 0, 2939, +3006, 0, 2920, +3002, 0, 2895, +2995, 1006, 2858, +2987, 1930, 2804, +2987, 1930, 2699, +2987, 1930, 2503, +2987, 1930, 1930, +2987, 2602, 1930, +3128, 2965, 1137, +3266, 3216, 0, +3384, 3402, 0, +3467, 3538, 0, +3558, 3673, 0, +3657, 3807, 0, +3763, 3940, 0, +3874, 4073, 0, +3990, 4095, 0, +3152, 0, 3071, +3152, 0, 3070, +3152, 0, 3070, +3151, 0, 3070, +3151, 0, 3069, +3151, 0, 3068, +3151, 0, 3067, +3151, 0, 3066, +3151, 0, 3064, +3150, 0, 3062, +3150, 0, 3059, +3149, 0, 3055, +3148, 0, 3049, +3146, 0, 3041, +3144, 0, 3030, +3142, 0, 3015, +3138, 0, 2995, +3134, 0, 2965, +3128, 1137, 2923, +3128, 1137, 2845, +3128, 1137, 2712, +3128, 1137, 2436, +3128, 1758, 1137, +3128, 2681, 1137, +3266, 3074, 0, +3402, 3335, 0, +3532, 3538, 0, +3612, 3673, 0, +3701, 3807, 0, +3798, 3940, 0, +3902, 4073, 0, +4012, 4095, 0, +3284, 0, 3162, +3283, 0, 3162, +3283, 0, 3161, +3283, 0, 3161, +3283, 0, 3160, +3283, 0, 3160, +3283, 0, 3159, +3283, 0, 3158, +3283, 0, 3157, +3282, 0, 3155, +3282, 0, 3152, +3281, 0, 3149, +3280, 0, 3144, +3280, 0, 3138, +3278, 0, 3129, +3276, 0, 3117, +3274, 0, 3100, +3270, 0, 3078, +3266, 0, 3045, +3266, 0, 2986, +3266, 0, 2893, +3266, 0, 2727, +3266, 0, 2327, +3266, 1375, 0, +3266, 2770, 0, +3402, 3189, 0, +3538, 3457, 0, +3673, 3670, 0, +3754, 3807, 0, +3841, 3940, 0, +3937, 4073, 0, +4039, 4095, 0, +3416, 0, 3261, +3416, 0, 3261, +3416, 0, 3260, +3416, 0, 3260, +3416, 0, 3260, +3416, 0, 3259, +3415, 0, 3259, +3415, 0, 3258, +3415, 0, 3257, +3415, 0, 3255, +3414, 0, 3253, +3414, 0, 3250, +3414, 0, 3247, +3413, 0, 3242, +3412, 0, 3234, +3410, 0, 3225, +3408, 0, 3212, +3406, 0, 3194, +3402, 0, 3170, +3402, 0, 3125, +3402, 0, 3059, +3402, 0, 2951, +3402, 0, 2749, +3402, 0, 2121, +3402, 0, 0, +3402, 2866, 0, +3538, 3307, 0, +3673, 3582, 0, +3807, 3797, 0, +3893, 3940, 0, +3979, 4073, 0, +4073, 4095, 0, +3548, 0, 3367, +3548, 0, 3367, +3548, 0, 3366, +3548, 0, 3366, +3548, 0, 3366, +3548, 0, 3365, +3548, 0, 3365, +3548, 0, 3364, +3548, 0, 3363, +3547, 0, 3362, +3547, 0, 3361, +3547, 0, 3358, +3546, 0, 3355, +3546, 0, 3351, +3545, 0, 3346, +3544, 0, 3339, +3543, 0, 3329, +3541, 0, 3315, +3538, 0, 3296, +3538, 0, 3263, +3538, 0, 3214, +3538, 0, 3140, +3538, 0, 3018, +3538, 0, 2775, +3538, 0, 1477, +3538, 0, 0, +3538, 2970, 0, +3673, 3429, 0, +3807, 3708, 0, +3940, 3926, 0, +4030, 4073, 0, +4095, 4095, 0, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3477, +3680, 0, 3477, +3680, 0, 3476, +3680, 0, 3475, +3680, 0, 3475, +3679, 0, 3473, +3679, 0, 3472, +3679, 0, 3469, +3678, 0, 3466, +3678, 0, 3462, +3677, 0, 3456, +3676, 0, 3448, +3675, 0, 3438, +3673, 0, 3423, +3673, 0, 3399, +3673, 0, 3363, +3673, 0, 3311, +3673, 0, 3231, +3673, 0, 3095, +3673, 0, 2809, +3673, 0, 0, +3673, 0, 0, +3673, 3079, 0, +3807, 3552, 0, +3940, 3836, 0, +4073, 4055, 0, +4095, 4095, 0, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3593, +3812, 0, 3593, +3812, 0, 3593, +3812, 0, 3592, +3812, 0, 3591, +3812, 0, 3590, +3812, 0, 3589, +3811, 0, 3587, +3811, 0, 3585, +3810, 0, 3582, +3810, 0, 3577, +3809, 0, 3571, +3808, 0, 3563, +3807, 0, 3552, +3807, 0, 3534, +3807, 0, 3508, +3807, 0, 3470, +3807, 0, 3415, +3807, 0, 3329, +3807, 0, 3181, +3807, 0, 2850, +3807, 0, 0, +3807, 0, 0, +3807, 3194, 0, +3940, 3678, 0, +4073, 3964, 0, +4095, 4095, 0, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3712, +3944, 0, 3712, +3944, 0, 3711, +3944, 0, 3711, +3944, 0, 3710, +3944, 0, 3708, +3943, 0, 3706, +3943, 0, 3704, +3943, 0, 3701, +3942, 0, 3696, +3941, 0, 3690, +3940, 0, 3682, +3940, 0, 3668, +3940, 0, 3649, +3940, 0, 3622, +3940, 0, 3583, +3940, 0, 3525, +3940, 0, 3434, +3940, 0, 3275, +3940, 0, 2899, +3940, 0, 0, +3940, 0, 0, +3940, 3312, 0, +4073, 3805, 0, +4095, 4094, 0, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3835, +4076, 0, 3835, +4076, 0, 3835, +4076, 0, 3835, +4076, 0, 3834, +4076, 0, 3834, +4076, 0, 3833, +4076, 0, 3832, +4076, 0, 3830, +4075, 0, 3829, +4075, 0, 3826, +4075, 0, 3823, +4074, 0, 3818, +4073, 0, 3812, +4073, 0, 3801, +4073, 0, 3787, +4073, 0, 3768, +4073, 0, 3740, +4073, 0, 3700, +4073, 0, 3640, +4073, 0, 3545, +4073, 0, 3376, +4073, 0, 2957, +4073, 0, 0, +4073, 0, 0, +4073, 3434, 0, +4095, 3935, 0, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3960, +4095, 0, 3960, +4095, 0, 3960, +4095, 0, 3959, +4095, 0, 3959, +4095, 0, 3958, +4095, 0, 3957, +4095, 0, 3955, +4095, 0, 3953, +4095, 0, 3951, +4095, 0, 3947, +4095, 0, 3943, +4095, 0, 3935, +4095, 0, 3924, +4095, 0, 3910, +4095, 0, 3890, +4095, 0, 3861, +4095, 0, 3820, +4095, 0, 3759, +4095, 0, 3661, +4095, 0, 3484, +4095, 0, 3027, +4095, 0, 0, +4095, 0, 0, +4095, 3558, 0, +0, 2354, 2623, +0, 2355, 2623, +0, 2357, 2623, +0, 2359, 2623, +0, 2363, 2623, +0, 2367, 2623, +0, 2372, 2623, +0, 2380, 2623, +0, 2390, 2623, +0, 2402, 2623, +0, 2419, 2623, +0, 2440, 2623, +0, 2466, 2623, +0, 2500, 2623, +0, 2541, 2623, +0, 2590, 2623, +0, 2623, 2595, +0, 2623, 2503, +0, 2623, 2340, +0, 2623, 1952, +0, 2755, 0, +0, 2887, 0, +1594, 3019, 0, +2352, 3152, 0, +2684, 3284, 0, +2925, 3416, 0, +3124, 3548, 0, +3300, 3680, 0, +3462, 3812, 0, +3616, 3944, 0, +3763, 4076, 0, +3907, 4095, 0, +0, 2352, 2623, +0, 2354, 2623, +0, 2356, 2623, +0, 2358, 2623, +0, 2362, 2623, +0, 2366, 2623, +0, 2372, 2623, +0, 2379, 2623, +0, 2388, 2623, +0, 2401, 2623, +0, 2417, 2623, +0, 2439, 2623, +0, 2465, 2623, +0, 2499, 2623, +0, 2540, 2623, +0, 2590, 2623, +0, 2623, 2595, +0, 2623, 2503, +0, 2623, 2341, +0, 2623, 1954, +0, 2755, 0, +0, 2887, 0, +1602, 3019, 0, +2353, 3152, 0, +2685, 3283, 0, +2925, 3416, 0, +3124, 3548, 0, +3300, 3680, 0, +3462, 3812, 0, +3616, 3944, 0, +3763, 4076, 0, +3907, 4095, 0, +0, 2351, 2623, +0, 2352, 2623, +0, 2355, 2623, +0, 2357, 2623, +0, 2360, 2623, +0, 2364, 2623, +0, 2370, 2623, +0, 2378, 2623, +0, 2387, 2623, +0, 2400, 2623, +0, 2416, 2623, +0, 2437, 2623, +0, 2464, 2623, +0, 2498, 2623, +0, 2539, 2623, +0, 2589, 2623, +0, 2623, 2596, +0, 2623, 2504, +0, 2623, 2342, +0, 2623, 1956, +0, 2755, 0, +0, 2887, 0, +1613, 3019, 0, +2355, 3152, 0, +2686, 3283, 0, +2926, 3416, 0, +3124, 3548, 0, +3300, 3680, 0, +3463, 3812, 0, +3616, 3944, 0, +3763, 4076, 0, +3907, 4095, 0, +0, 2348, 2623, +0, 2350, 2623, +0, 2352, 2623, +0, 2355, 2622, +0, 2358, 2622, +0, 2362, 2622, +0, 2368, 2622, +0, 2375, 2622, +0, 2385, 2622, +0, 2398, 2622, +0, 2414, 2622, +0, 2436, 2622, +0, 2463, 2622, +0, 2496, 2622, +0, 2538, 2622, +0, 2588, 2622, +0, 2622, 2596, +0, 2622, 2505, +0, 2622, 2343, +0, 2622, 1958, +0, 2755, 0, +0, 2887, 0, +1628, 3019, 0, +2358, 3151, 0, +2688, 3283, 0, +2927, 3416, 0, +3125, 3548, 0, +3301, 3680, 0, +3463, 3812, 0, +3616, 3944, 0, +3764, 4076, 0, +3907, 4095, 0, +0, 2345, 2623, +0, 2347, 2623, +0, 2349, 2623, +0, 2352, 2622, +0, 2356, 2622, +0, 2360, 2622, +0, 2366, 2622, +0, 2373, 2622, +0, 2383, 2622, +0, 2396, 2622, +0, 2412, 2622, +0, 2434, 2622, +0, 2460, 2622, +0, 2494, 2622, +0, 2536, 2622, +0, 2586, 2622, +0, 2622, 2597, +0, 2622, 2506, +0, 2622, 2344, +0, 2622, 1962, +0, 2755, 0, +0, 2887, 0, +1646, 3019, 0, +2362, 3151, 0, +2690, 3283, 0, +2928, 3416, 0, +3125, 3548, 0, +3301, 3680, 0, +3463, 3812, 0, +3617, 3944, 0, +3764, 4076, 0, +3907, 4095, 0, +0, 2341, 2623, +0, 2342, 2623, +0, 2345, 2623, +0, 2347, 2622, +0, 2351, 2622, +0, 2356, 2621, +0, 2362, 2621, +0, 2370, 2621, +0, 2380, 2621, +0, 2393, 2621, +0, 2409, 2621, +0, 2431, 2621, +0, 2458, 2621, +0, 2492, 2621, +0, 2533, 2621, +0, 2584, 2621, +0, 2621, 2598, +0, 2621, 2507, +0, 2621, 2346, +0, 2621, 1966, +0, 2754, 0, +0, 2887, 0, +1670, 3019, 0, +2367, 3151, 0, +2692, 3283, 0, +2929, 3416, 0, +3126, 3548, 0, +3302, 3680, 0, +3464, 3812, 0, +3617, 3944, 0, +3764, 4076, 0, +3908, 4095, 0, +0, 2335, 2623, +0, 2336, 2623, +0, 2338, 2623, +0, 2341, 2622, +0, 2346, 2622, +0, 2351, 2621, +0, 2357, 2621, +0, 2365, 2621, +0, 2375, 2621, +0, 2388, 2621, +0, 2405, 2621, +0, 2427, 2621, +0, 2454, 2621, +0, 2488, 2621, +0, 2530, 2621, +0, 2581, 2621, +0, 2621, 2600, +0, 2621, 2509, +0, 2621, 2349, +0, 2621, 1972, +0, 2754, 0, +0, 2886, 0, +1700, 3018, 0, +2373, 3151, 0, +2695, 3283, 0, +2931, 3415, 0, +3128, 3548, 0, +3303, 3680, 0, +3464, 3812, 0, +3617, 3944, 0, +3764, 4076, 0, +3908, 4095, 0, +0, 2327, 2623, +0, 2328, 2623, +0, 2331, 2623, +0, 2334, 2622, +0, 2337, 2622, +0, 2343, 2621, +0, 2350, 2621, +0, 2359, 2620, +0, 2369, 2620, +0, 2382, 2620, +0, 2399, 2620, +0, 2421, 2620, +0, 2449, 2620, +0, 2483, 2620, +0, 2526, 2620, +0, 2577, 2620, +0, 2620, 2602, +0, 2620, 2511, +0, 2620, 2352, +0, 2620, 1981, +0, 2753, 0, +0, 2886, 0, +1737, 3018, 0, +2382, 3151, 0, +2700, 3283, 0, +2934, 3415, 0, +3129, 3548, 0, +3304, 3680, 0, +3465, 3812, 0, +3618, 3944, 0, +3765, 4076, 0, +3908, 4095, 0, +0, 2315, 2623, +0, 2317, 2623, +0, 2320, 2623, +0, 2323, 2622, +0, 2327, 2622, +0, 2332, 2621, +0, 2339, 2621, +0, 2348, 2620, +0, 2361, 2619, +0, 2374, 2619, +0, 2392, 2619, +0, 2414, 2619, +0, 2442, 2619, +0, 2477, 2619, +0, 2520, 2619, +0, 2572, 2619, +0, 2619, 2604, +0, 2619, 2515, +0, 2619, 2357, +0, 2619, 1991, +0, 2752, 0, +0, 2885, 0, +1782, 3018, 0, +2394, 3151, 0, +2705, 3283, 0, +2937, 3415, 0, +3132, 3548, 0, +3305, 3680, 0, +3466, 3812, 0, +3619, 3944, 0, +3765, 4076, 0, +3908, 4095, 0, +0, 2300, 2623, +0, 2302, 2623, +0, 2304, 2623, +0, 2308, 2622, +0, 2312, 2622, +0, 2317, 2621, +0, 2325, 2621, +0, 2334, 2620, +0, 2347, 2619, +0, 2363, 2618, +0, 2381, 2618, +0, 2404, 2618, +0, 2432, 2618, +0, 2469, 2618, +0, 2512, 2618, +0, 2565, 2618, +0, 2618, 2608, +0, 2618, 2519, +0, 2618, 2363, +0, 2618, 2005, +0, 2751, 0, +0, 2885, 0, +1837, 3017, 0, +2408, 3150, 0, +2713, 3282, 0, +2942, 3415, 0, +3135, 3547, 0, +3307, 3680, 0, +3468, 3812, 0, +3620, 3944, 0, +3766, 4076, 0, +3909, 4095, 0, +0, 2278, 2623, +0, 2281, 2623, +0, 2283, 2623, +0, 2287, 2622, +0, 2291, 2622, +0, 2297, 2621, +0, 2304, 2621, +0, 2314, 2620, +0, 2328, 2619, +0, 2345, 2618, +0, 2367, 2616, +0, 2390, 2616, +0, 2420, 2616, +0, 2456, 2616, +0, 2501, 2616, +0, 2555, 2616, +0, 2616, 2613, +0, 2616, 2525, +0, 2616, 2372, +0, 2616, 2022, +0, 2750, 0, +0, 2883, 0, +1900, 3016, 0, +2427, 3150, 0, +2723, 3282, 0, +2947, 3414, 0, +3138, 3547, 0, +3310, 3679, 0, +3469, 3812, 0, +3621, 3944, 0, +3767, 4076, 0, +3910, 4095, 0, +0, 2248, 2623, +0, 2250, 2623, +0, 2253, 2623, +0, 2256, 2622, +0, 2261, 2622, +0, 2268, 2621, +0, 2276, 2621, +0, 2287, 2620, +0, 2301, 2619, +0, 2319, 2618, +0, 2342, 2616, +0, 2371, 2613, +0, 2402, 2613, +0, 2440, 2613, +0, 2487, 2613, +0, 2542, 2613, +0, 2607, 2613, +0, 2613, 2533, +0, 2613, 2382, +0, 2613, 2045, +0, 2748, 0, +0, 2882, 0, +1974, 3015, 0, +2452, 3149, 0, +2735, 3281, 0, +2956, 3414, 0, +3144, 3547, 0, +3314, 3679, 0, +3472, 3812, 0, +3623, 3944, 0, +3768, 4076, 0, +3910, 4095, 0, +0, 2205, 2623, +0, 2207, 2623, +0, 2210, 2623, +0, 2214, 2622, +0, 2219, 2622, +0, 2226, 2621, +0, 2235, 2621, +0, 2247, 2620, +0, 2262, 2619, +0, 2281, 2618, +0, 2306, 2616, +0, 2338, 2613, +0, 2377, 2610, +0, 2417, 2610, +0, 2466, 2610, +0, 2524, 2610, +0, 2592, 2610, +0, 2610, 2543, +0, 2610, 2396, +0, 2610, 2073, +0, 2746, 0, +0, 2880, 0, +2056, 3014, 0, +2482, 3148, 0, +2752, 3280, 0, +2966, 3414, 0, +3151, 3546, 0, +3318, 3679, 0, +3475, 3811, 0, +3625, 3944, 0, +3770, 4076, 0, +3912, 4095, 0, +0, 2138, 2623, +0, 2141, 2623, +0, 2144, 2623, +0, 2149, 2622, +0, 2155, 2622, +0, 2163, 2621, +0, 2173, 2621, +0, 2187, 2620, +0, 2204, 2619, +0, 2226, 2618, +0, 2255, 2616, +0, 2290, 2613, +0, 2333, 2610, +0, 2385, 2605, +0, 2437, 2605, +0, 2498, 2605, +0, 2570, 2605, +0, 2605, 2556, +0, 2605, 2414, +0, 2605, 2109, +0, 2742, 0, +817, 2878, 0, +2148, 3012, 0, +2521, 3146, 0, +2773, 3280, 0, +2979, 3413, 0, +3160, 3546, 0, +3325, 3678, 0, +3480, 3811, 0, +3628, 3943, 0, +3773, 4076, 0, +3913, 4095, 0, +0, 2032, 2623, +0, 2035, 2623, +0, 2039, 2623, +0, 2045, 2622, +0, 2052, 2622, +0, 2062, 2621, +0, 2075, 2621, +0, 2092, 2620, +0, 2113, 2619, +0, 2140, 2618, +0, 2174, 2616, +0, 2216, 2613, +0, 2266, 2610, +0, 2326, 2605, +611, 2395, 2599, +611, 2462, 2599, +611, 2538, 2599, +611, 2599, 2572, +611, 2599, 2437, +611, 2599, 2153, +0, 2738, 817, +1596, 2874, 0, +2247, 3010, 0, +2566, 3144, 0, +2800, 3278, 0, +2997, 3412, 0, +3171, 3545, 0, +3333, 3678, 0, +3486, 3810, 0, +3632, 3943, 0, +3776, 4075, 0, +3916, 4095, 0, +0, 1833, 2623, +0, 1838, 2623, +0, 1845, 2623, +0, 1853, 2622, +0, 1865, 2622, +0, 1880, 2621, +0, 1899, 2621, +0, 1923, 2620, +0, 1954, 2619, +0, 1991, 2618, +0, 2038, 2616, +0, 2093, 2613, +0, 2158, 2610, +0, 2233, 2605, +611, 2316, 2599, +1533, 2408, 2591, +1533, 2493, 2591, +1533, 2587, 2591, +1533, 2591, 2466, +1533, 2591, 2206, +738, 2731, 1362, +1932, 2870, 0, +2352, 3006, 0, +2622, 3142, 0, +2834, 3276, 0, +3019, 3410, 0, +3186, 3544, 0, +3344, 3677, 0, +3493, 3810, 0, +3638, 3943, 0, +3780, 4075, 0, +3919, 4095, 0, +0, 1232, 2623, +0, 1251, 2623, +0, 1275, 2623, +0, 1304, 2622, +0, 1342, 2622, +0, 1387, 2621, +0, 1441, 2621, +0, 1505, 2620, +0, 1578, 2619, +0, 1661, 2618, +0, 1752, 2616, +0, 1851, 2613, +0, 1956, 2610, +0, 2067, 2605, +611, 2183, 2599, +1533, 2303, 2591, +1883, 2425, 2579, +1883, 2533, 2579, +1883, 2579, 2502, +1883, 2579, 2267, +1667, 2723, 1664, +2173, 2863, 870, +2463, 3002, 0, +2687, 3138, 0, +2876, 3274, 0, +3047, 3408, 0, +3206, 3543, 0, +3358, 3676, 0, +3503, 3809, 0, +3646, 3942, 0, +3785, 4075, 0, +3923, 4095, 0, +0, 0, 2623, +0, 0, 2623, +0, 0, 2623, +0, 0, 2622, +0, 0, 2622, +0, 0, 2621, +0, 0, 2621, +0, 0, 2620, +0, 0, 2619, +0, 0, 2618, +0, 0, 2616, +0, 547, 2613, +0, 1330, 2610, +0, 1667, 2605, +611, 1908, 2599, +1533, 2108, 2591, +1883, 2284, 2579, +2129, 2447, 2563, +2129, 2563, 2545, +2129, 2563, 2339, +2114, 2711, 2015, +2372, 2855, 1796, +2579, 2995, 1006, +2761, 3134, 0, +2926, 3270, 0, +3082, 3406, 0, +3231, 3541, 0, +3376, 3675, 0, +3517, 3808, 0, +3655, 3941, 0, +3792, 4074, 0, +3928, 4095, 0, +0, 0, 2623, +0, 0, 2623, +0, 0, 2623, +0, 0, 2622, +0, 0, 2622, +0, 0, 2621, +0, 0, 2621, +0, 0, 2620, +0, 0, 2619, +0, 0, 2618, +0, 0, 2616, +0, 0, 2613, +0, 0, 2610, +705, 0, 2605, +1236, 611, 2599, +1533, 1533, 2591, +1883, 1981, 2579, +2129, 2258, 2563, +2331, 2475, 2541, +2331, 2541, 2420, +2391, 2696, 2261, +2549, 2843, 2147, +2699, 2987, 1930, +2845, 3128, 1137, +2986, 3266, 0, +3125, 3402, 0, +3263, 3538, 0, +3399, 3673, 0, +3534, 3807, 0, +3668, 3940, 0, +3801, 4073, 0, +3935, 4095, 0, +1952, 0, 2623, +1954, 0, 2623, +1956, 0, 2623, +1958, 0, 2622, +1962, 0, 2622, +1966, 0, 2621, +1972, 0, 2621, +1981, 0, 2620, +1991, 0, 2619, +2005, 0, 2618, +2022, 0, 2616, +2045, 0, 2613, +2073, 0, 2610, +2109, 0, 2605, +2153, 611, 2599, +2206, 1533, 2591, +2267, 1883, 2579, +2339, 2129, 2563, +2420, 2331, 2541, +2509, 2509, 2509, +2607, 2673, 2463, +2711, 2828, 2393, +2821, 2975, 2280, +2936, 3119, 2061, +3055, 3259, 1272, +3177, 3398, 0, +3302, 3535, 0, +3428, 3670, 0, +3556, 3805, 0, +3684, 3939, 0, +3814, 4072, 0, +3944, 4095, 0, +2473, 0, 2755, +2473, 0, 2755, +2474, 0, 2755, +2475, 0, 2755, +2476, 0, 2755, +2477, 0, 2754, +2479, 0, 2754, +2482, 0, 2753, +2485, 0, 2752, +2490, 0, 2751, +2496, 0, 2750, +2504, 0, 2748, +2515, 0, 2746, +2529, 0, 2742, +2547, 0, 2738, +2570, 738, 2731, +2598, 1664, 2723, +2634, 2015, 2711, +2678, 2261, 2696, +2673, 2463, 2607, +2673, 2552, 2463, +2828, 2810, 2393, +2929, 2975, 2280, +3022, 3119, 2061, +3122, 3259, 1272, +3230, 3398, 0, +3342, 3535, 0, +3459, 3670, 0, +3579, 3805, 0, +3702, 3939, 0, +3827, 4072, 0, +3954, 4095, 0, +2767, 0, 2887, +2767, 0, 2887, +2767, 0, 2887, +2768, 0, 2887, +2768, 0, 2887, +2769, 0, 2887, +2770, 0, 2886, +2772, 0, 2886, +2773, 0, 2885, +2776, 0, 2885, +2779, 0, 2883, +2784, 0, 2882, +2789, 0, 2880, +2797, 0, 2878, +2807, 0, 2874, +2820, 0, 2870, +2837, 870, 2863, +2855, 1796, 2852, +2843, 2147, 2797, +2828, 2393, 2711, +2828, 2393, 2522, +2828, 2603, 2393, +2975, 2898, 2280, +3116, 3119, 2061, +3199, 3259, 1272, +3291, 3398, 0, +3391, 3535, 0, +3497, 3670, 0, +3609, 3805, 0, +3725, 3939, 0, +3845, 4072, 0, +3968, 4095, 0, +2991, 0, 3019, +2991, 0, 3019, +2991, 0, 3019, +2991, 0, 3019, +2992, 0, 3019, +2992, 0, 3019, +2992, 0, 3018, +2993, 0, 3018, +2995, 0, 3018, +2996, 0, 3017, +2998, 0, 3016, +3001, 0, 3015, +3004, 0, 3014, +3009, 0, 3012, +3010, 0, 3004, +3006, 0, 2988, +3002, 0, 2966, +2995, 1006, 2935, +2987, 1930, 2890, +2975, 2280, 2821, +2975, 2280, 2680, +2975, 2280, 2377, +2975, 2664, 2280, +3119, 2995, 2061, +3259, 3233, 1272, +3362, 3398, 0, +3449, 3535, 0, +3543, 3670, 0, +3646, 3805, 0, +3754, 3939, 0, +3867, 4072, 0, +3984, 4095, 0, +3152, 0, 3120, +3152, 0, 3120, +3152, 0, 3120, +3151, 0, 3119, +3151, 0, 3119, +3151, 0, 3118, +3151, 0, 3117, +3151, 0, 3116, +3151, 0, 3115, +3150, 0, 3112, +3150, 0, 3110, +3149, 0, 3106, +3148, 0, 3100, +3146, 0, 3093, +3144, 0, 3084, +3142, 0, 3071, +3138, 0, 3053, +3134, 0, 3027, +3128, 1137, 2991, +3119, 2061, 2936, +3119, 2061, 2831, +3119, 2061, 2636, +3119, 2061, 2064, +3119, 2734, 2061, +3259, 3097, 1272, +3398, 3348, 0, +3516, 3535, 0, +3599, 3670, 0, +3690, 3805, 0, +3790, 3939, 0, +3895, 4072, 0, +4006, 4095, 0, +3284, 0, 3203, +3283, 0, 3203, +3283, 0, 3202, +3283, 0, 3202, +3283, 0, 3201, +3283, 0, 3201, +3283, 0, 3200, +3283, 0, 3199, +3283, 0, 3198, +3282, 0, 3196, +3282, 0, 3194, +3281, 0, 3191, +3280, 0, 3186, +3280, 0, 3180, +3278, 0, 3173, +3276, 0, 3162, +3274, 0, 3147, +3270, 0, 3126, +3266, 0, 3097, +3259, 1272, 3055, +3259, 1272, 2976, +3259, 1272, 2843, +3259, 1272, 2569, +3259, 1899, 1272, +3259, 2813, 1272, +3398, 3206, 0, +3535, 3467, 0, +3664, 3670, 0, +3744, 3805, 0, +3833, 3939, 0, +3930, 4072, 0, +4034, 4095, 0, +3416, 0, 3294, +3416, 0, 3294, +3416, 0, 3294, +3416, 0, 3293, +3416, 0, 3293, +3416, 0, 3293, +3415, 0, 3292, +3415, 0, 3291, +3415, 0, 3290, +3415, 0, 3289, +3414, 0, 3287, +3414, 0, 3284, +3414, 0, 3281, +3413, 0, 3276, +3412, 0, 3270, +3410, 0, 3261, +3408, 0, 3249, +3406, 0, 3233, +3402, 0, 3210, +3398, 0, 3177, +3398, 0, 3118, +3398, 0, 3025, +3398, 0, 2860, +3398, 0, 2458, +3398, 1484, 0, +3398, 2902, 0, +3535, 3321, 0, +3670, 3589, 0, +3805, 3802, 0, +3886, 3939, 0, +3973, 4072, 0, +4069, 4095, 0, +3548, 0, 3393, +3548, 0, 3393, +3548, 0, 3393, +3548, 0, 3393, +3548, 0, 3392, +3548, 0, 3392, +3548, 0, 3392, +3548, 0, 3391, +3548, 0, 3390, +3547, 0, 3389, +3547, 0, 3387, +3547, 0, 3385, +3546, 0, 3382, +3546, 0, 3379, +3545, 0, 3374, +3544, 0, 3367, +3543, 0, 3357, +3541, 0, 3344, +3538, 0, 3326, +3535, 0, 3302, +3535, 0, 3257, +3535, 0, 3190, +3535, 0, 3083, +3535, 0, 2881, +3535, 0, 2256, +3535, 0, 0, +3535, 2998, 0, +3670, 3439, 0, +3805, 3714, 0, +3939, 3929, 0, +4025, 4072, 0, +4095, 4095, 0, +3680, 0, 3499, +3680, 0, 3499, +3680, 0, 3499, +3680, 0, 3499, +3680, 0, 3498, +3680, 0, 3498, +3680, 0, 3497, +3680, 0, 3497, +3680, 0, 3496, +3680, 0, 3495, +3679, 0, 3494, +3679, 0, 3493, +3679, 0, 3490, +3678, 0, 3488, +3678, 0, 3483, +3677, 0, 3478, +3676, 0, 3471, +3675, 0, 3461, +3673, 0, 3447, +3670, 0, 3428, +3670, 0, 3395, +3670, 0, 3346, +3670, 0, 3273, +3670, 0, 3150, +3670, 0, 2908, +3670, 0, 1603, +3670, 0, 0, +3670, 3102, 0, +3805, 3561, 0, +3939, 3840, 0, +4072, 4058, 0, +4095, 4095, 0, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3609, +3812, 0, 3609, +3812, 0, 3609, +3812, 0, 3608, +3812, 0, 3607, +3812, 0, 3606, +3812, 0, 3605, +3811, 0, 3604, +3811, 0, 3601, +3810, 0, 3598, +3810, 0, 3594, +3809, 0, 3588, +3808, 0, 3581, +3807, 0, 3570, +3805, 0, 3556, +3805, 0, 3531, +3805, 0, 3495, +3805, 0, 3443, +3805, 0, 3363, +3805, 0, 3227, +3805, 0, 2941, +3805, 0, 0, +3805, 0, 0, +3805, 3211, 0, +3939, 3685, 0, +4072, 3968, 0, +4095, 4095, 0, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3725, +3944, 0, 3725, +3944, 0, 3725, +3944, 0, 3725, +3944, 0, 3724, +3944, 0, 3723, +3944, 0, 3722, +3944, 0, 3721, +3943, 0, 3719, +3943, 0, 3717, +3943, 0, 3713, +3942, 0, 3709, +3941, 0, 3703, +3940, 0, 3695, +3939, 0, 3684, +3939, 0, 3666, +3939, 0, 3640, +3939, 0, 3603, +3939, 0, 3547, +3939, 0, 3461, +3939, 0, 3313, +3939, 0, 2982, +3939, 0, 0, +3939, 0, 0, +3939, 3326, 0, +4072, 3810, 0, +4095, 4095, 0, +4076, 0, 3846, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3844, +4076, 0, 3843, +4076, 0, 3843, +4076, 0, 3841, +4076, 0, 3840, +4075, 0, 3838, +4075, 0, 3836, +4075, 0, 3833, +4074, 0, 3828, +4073, 0, 3822, +4072, 0, 3814, +4072, 0, 3800, +4072, 0, 3781, +4072, 0, 3754, +4072, 0, 3715, +4072, 0, 3657, +4072, 0, 3566, +4072, 0, 3407, +4072, 0, 3031, +4072, 0, 0, +4072, 0, 0, +4072, 3444, 0, +4095, 3938, 0, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3967, +4095, 0, 3967, +4095, 0, 3967, +4095, 0, 3966, +4095, 0, 3965, +4095, 0, 3964, +4095, 0, 3963, +4095, 0, 3961, +4095, 0, 3959, +4095, 0, 3955, +4095, 0, 3950, +4095, 0, 3944, +4095, 0, 3934, +4095, 0, 3920, +4095, 0, 3900, +4095, 0, 3872, +4095, 0, 3832, +4095, 0, 3772, +4095, 0, 3677, +4095, 0, 3509, +4095, 0, 3090, +4095, 0, 0, +4095, 0, 0, +4095, 3566, 0, +0, 2486, 2755, +0, 2487, 2755, +0, 2488, 2755, +0, 2490, 2755, +0, 2493, 2755, +0, 2496, 2755, +0, 2500, 2755, +0, 2505, 2755, +0, 2513, 2755, +0, 2523, 2755, +0, 2535, 2755, +0, 2552, 2755, +0, 2573, 2755, +0, 2599, 2755, +0, 2632, 2755, +0, 2673, 2755, +0, 2723, 2755, +0, 2755, 2727, +0, 2755, 2635, +0, 2755, 2473, +0, 2755, 2083, +0, 2887, 0, +0, 3019, 0, +1720, 3152, 0, +2481, 3284, 0, +2816, 3416, 0, +3056, 3548, 0, +3255, 3680, 0, +3432, 3812, 0, +3594, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2485, 2755, +0, 2486, 2755, +0, 2488, 2755, +0, 2489, 2755, +0, 2492, 2755, +0, 2495, 2755, +0, 2499, 2755, +0, 2505, 2755, +0, 2512, 2755, +0, 2522, 2755, +0, 2535, 2755, +0, 2551, 2755, +0, 2572, 2755, +0, 2598, 2755, +0, 2632, 2755, +0, 2673, 2755, +0, 2723, 2755, +0, 2755, 2727, +0, 2755, 2635, +0, 2755, 2473, +0, 2755, 2084, +0, 2887, 0, +0, 3019, 0, +1726, 3152, 0, +2482, 3283, 0, +2817, 3416, 0, +3057, 3548, 0, +3256, 3680, 0, +3432, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2484, 2755, +0, 2485, 2755, +0, 2486, 2755, +0, 2488, 2755, +0, 2491, 2755, +0, 2494, 2755, +0, 2498, 2755, +0, 2504, 2755, +0, 2511, 2755, +0, 2521, 2755, +0, 2533, 2755, +0, 2550, 2755, +0, 2571, 2755, +0, 2598, 2755, +0, 2631, 2755, +0, 2672, 2755, +0, 2722, 2755, +0, 2755, 2728, +0, 2755, 2636, +0, 2755, 2474, +0, 2755, 2086, +0, 2887, 0, +0, 3019, 0, +1735, 3152, 0, +2484, 3283, 0, +2817, 3416, 0, +3057, 3548, 0, +3256, 3680, 0, +3432, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2482, 2755, +0, 2483, 2755, +0, 2485, 2755, +0, 2487, 2755, +0, 2489, 2755, +0, 2492, 2755, +0, 2497, 2755, +0, 2502, 2755, +0, 2510, 2755, +0, 2520, 2755, +0, 2532, 2755, +0, 2549, 2755, +0, 2570, 2755, +0, 2596, 2755, +0, 2630, 2755, +0, 2671, 2755, +0, 2721, 2755, +0, 2755, 2728, +0, 2755, 2636, +0, 2755, 2475, +0, 2755, 2088, +0, 2887, 0, +0, 3019, 0, +1746, 3151, 0, +2486, 3283, 0, +2818, 3416, 0, +3058, 3548, 0, +3256, 3680, 0, +3432, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2479, 2755, +0, 2481, 2755, +0, 2482, 2755, +0, 2484, 2755, +0, 2487, 2755, +0, 2490, 2755, +0, 2495, 2755, +0, 2501, 2755, +0, 2508, 2755, +0, 2517, 2755, +0, 2530, 2755, +0, 2547, 2755, +0, 2568, 2755, +0, 2595, 2755, +0, 2628, 2755, +0, 2670, 2755, +0, 2720, 2755, +0, 2755, 2729, +0, 2755, 2637, +0, 2755, 2476, +0, 2755, 2091, +0, 2887, 0, +0, 3019, 0, +1760, 3151, 0, +2489, 3283, 0, +2820, 3416, 0, +3059, 3548, 0, +3257, 3680, 0, +3433, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2476, 2755, +0, 2477, 2755, +0, 2479, 2755, +0, 2481, 2755, +0, 2484, 2755, +0, 2488, 2754, +0, 2492, 2754, +0, 2498, 2754, +0, 2505, 2754, +0, 2515, 2754, +0, 2528, 2754, +0, 2545, 2754, +0, 2566, 2754, +0, 2593, 2754, +0, 2627, 2754, +0, 2668, 2754, +0, 2718, 2754, +0, 2754, 2730, +0, 2754, 2638, +0, 2754, 2477, +0, 2754, 2094, +0, 2887, 0, +0, 3019, 0, +1779, 3151, 0, +2493, 3283, 0, +2822, 3416, 0, +3060, 3548, 0, +3258, 3680, 0, +3433, 3812, 0, +3595, 3944, 0, +3749, 4076, 0, +3896, 4095, 0, +0, 2472, 2755, +0, 2473, 2755, +0, 2475, 2755, +0, 2477, 2755, +0, 2480, 2755, +0, 2484, 2754, +0, 2489, 2754, +0, 2494, 2754, +0, 2502, 2754, +0, 2512, 2754, +0, 2525, 2754, +0, 2541, 2754, +0, 2563, 2754, +0, 2590, 2754, +0, 2624, 2754, +0, 2666, 2754, +0, 2716, 2754, +0, 2754, 2731, +0, 2754, 2640, +0, 2754, 2479, +0, 2754, 2099, +0, 2886, 0, +0, 3018, 0, +1802, 3151, 0, +2498, 3283, 0, +2824, 3415, 0, +3061, 3548, 0, +3258, 3680, 0, +3434, 3812, 0, +3596, 3944, 0, +3749, 4076, 0, +3896, 4095, 0, +0, 2466, 2755, +0, 2467, 2755, +0, 2469, 2755, +0, 2471, 2755, +0, 2474, 2755, +0, 2478, 2754, +0, 2483, 2754, +0, 2490, 2753, +0, 2497, 2753, +0, 2507, 2753, +0, 2521, 2753, +0, 2537, 2753, +0, 2559, 2753, +0, 2586, 2753, +0, 2620, 2753, +0, 2662, 2753, +0, 2713, 2753, +0, 2753, 2732, +0, 2753, 2641, +0, 2753, 2482, +0, 2753, 2105, +0, 2886, 0, +0, 3018, 0, +1832, 3151, 0, +2504, 3283, 0, +2827, 3415, 0, +3063, 3548, 0, +3260, 3680, 0, +3435, 3812, 0, +3596, 3944, 0, +3749, 4076, 0, +3897, 4095, 0, +0, 2457, 2755, +0, 2459, 2755, +0, 2460, 2755, +0, 2463, 2755, +0, 2466, 2755, +0, 2470, 2754, +0, 2475, 2754, +0, 2482, 2753, +0, 2491, 2752, +0, 2501, 2752, +0, 2514, 2752, +0, 2532, 2752, +0, 2553, 2752, +0, 2581, 2752, +0, 2616, 2752, +0, 2658, 2752, +0, 2710, 2752, +0, 2752, 2734, +0, 2752, 2644, +0, 2752, 2485, +0, 2752, 2113, +0, 2885, 0, +0, 3018, 0, +1869, 3151, 0, +2513, 3283, 0, +2832, 3415, 0, +3066, 3548, 0, +3261, 3680, 0, +3436, 3812, 0, +3597, 3944, 0, +3750, 4076, 0, +3897, 4095, 0, +0, 2446, 2755, +0, 2448, 2755, +0, 2449, 2755, +0, 2452, 2755, +0, 2455, 2755, +0, 2459, 2754, +0, 2464, 2754, +0, 2471, 2753, +0, 2481, 2752, +0, 2493, 2751, +0, 2506, 2751, +0, 2524, 2751, +0, 2546, 2751, +0, 2574, 2751, +0, 2609, 2751, +0, 2652, 2751, +0, 2704, 2751, +0, 2751, 2737, +0, 2751, 2647, +0, 2751, 2490, +0, 2751, 2123, +0, 2885, 0, +0, 3017, 0, +1915, 3150, 0, +2524, 3282, 0, +2837, 3415, 0, +3069, 3547, 0, +3264, 3680, 0, +3437, 3812, 0, +3598, 3944, 0, +3751, 4076, 0, +3898, 4095, 0, +0, 2431, 2755, +0, 2432, 2755, +0, 2434, 2755, +0, 2436, 2755, +0, 2440, 2755, +0, 2444, 2754, +0, 2450, 2754, +0, 2457, 2753, +0, 2467, 2752, +0, 2479, 2751, +0, 2495, 2750, +0, 2514, 2750, +0, 2536, 2750, +0, 2565, 2750, +0, 2601, 2750, +0, 2645, 2750, +0, 2697, 2750, +0, 2750, 2741, +0, 2750, 2651, +0, 2750, 2496, +0, 2750, 2137, +0, 2883, 0, +0, 3016, 0, +1969, 3150, 0, +2539, 3282, 0, +2845, 3414, 0, +3074, 3547, 0, +3267, 3679, 0, +3439, 3812, 0, +3600, 3944, 0, +3752, 4076, 0, +3898, 4095, 0, +0, 2409, 2755, +0, 2411, 2755, +0, 2413, 2755, +0, 2415, 2755, +0, 2419, 2755, +0, 2423, 2754, +0, 2429, 2754, +0, 2437, 2753, +0, 2447, 2752, +0, 2460, 2751, +0, 2477, 2750, +0, 2499, 2748, +0, 2522, 2748, +0, 2552, 2748, +0, 2589, 2748, +0, 2634, 2748, +0, 2687, 2748, +0, 2748, 2745, +0, 2748, 2657, +0, 2748, 2504, +0, 2748, 2155, +0, 2882, 0, +0, 3015, 0, +2033, 3149, 0, +2558, 3281, 0, +2855, 3414, 0, +3080, 3547, 0, +3271, 3679, 0, +3442, 3812, 0, +3602, 3944, 0, +3753, 4076, 0, +3899, 4095, 0, +0, 2379, 2755, +0, 2381, 2755, +0, 2383, 2755, +0, 2386, 2755, +0, 2389, 2755, +0, 2394, 2754, +0, 2400, 2754, +0, 2408, 2753, +0, 2419, 2752, +0, 2433, 2751, +0, 2451, 2750, +0, 2474, 2748, +0, 2503, 2746, +0, 2534, 2746, +0, 2572, 2746, +0, 2619, 2746, +0, 2674, 2746, +0, 2740, 2746, +0, 2746, 2665, +0, 2746, 2515, +0, 2746, 2177, +0, 2880, 0, +0, 3014, 0, +2106, 3148, 0, +2583, 3280, 0, +2867, 3414, 0, +3087, 3546, 0, +3276, 3679, 0, +3446, 3811, 0, +3604, 3944, 0, +3755, 4076, 0, +3901, 4095, 0, +0, 2335, 2755, +0, 2337, 2755, +0, 2339, 2755, +0, 2342, 2755, +0, 2346, 2755, +0, 2351, 2754, +0, 2358, 2754, +0, 2367, 2753, +0, 2379, 2752, +0, 2394, 2751, +0, 2414, 2750, +0, 2439, 2748, +0, 2470, 2746, +0, 2509, 2742, +0, 2550, 2742, +0, 2598, 2742, +0, 2656, 2742, +0, 2724, 2742, +0, 2742, 2675, +0, 2742, 2529, +0, 2742, 2206, +0, 2878, 0, +0, 3012, 0, +2189, 3146, 0, +2613, 3280, 0, +2884, 3413, 0, +3098, 3546, 0, +3282, 3678, 0, +3450, 3811, 0, +3607, 3943, 0, +3757, 4076, 0, +3903, 4095, 0, +0, 2269, 2755, +0, 2271, 2755, +0, 2274, 2755, +0, 2277, 2755, +0, 2281, 2755, +0, 2287, 2754, +0, 2295, 2754, +0, 2305, 2753, +0, 2319, 2752, +0, 2336, 2751, +0, 2359, 2750, +0, 2387, 2748, +0, 2422, 2746, +0, 2465, 2742, +0, 2517, 2738, +0, 2569, 2738, +0, 2631, 2738, +0, 2702, 2738, +0, 2738, 2688, +0, 2738, 2547, +0, 2738, 2241, +0, 2874, 0, +922, 3010, 0, +2280, 3144, 0, +2651, 3278, 0, +2906, 3412, 0, +3111, 3545, 0, +3291, 3678, 0, +3457, 3810, 0, +3612, 3943, 0, +3760, 4075, 0, +3905, 4095, 0, +0, 2162, 2755, +0, 2164, 2755, +0, 2167, 2755, +0, 2172, 2755, +0, 2177, 2755, +0, 2185, 2754, +0, 2195, 2754, +0, 2208, 2753, +0, 2224, 2752, +0, 2245, 2751, +0, 2273, 2750, +0, 2306, 2748, +0, 2348, 2746, +0, 2398, 2742, +0, 2458, 2738, +738, 2527, 2731, +738, 2594, 2731, +738, 2671, 2731, +738, 2731, 2705, +738, 2731, 2570, +738, 2731, 2285, +0, 2870, 963, +1723, 3006, 0, +2379, 3142, 0, +2698, 3276, 0, +2933, 3410, 0, +3129, 3544, 0, +3303, 3677, 0, +3465, 3810, 0, +3618, 3943, 0, +3765, 4075, 0, +3908, 4095, 0, +0, 1962, 2755, +0, 1966, 2755, +0, 1971, 2755, +0, 1977, 2755, +0, 1986, 2755, +0, 1997, 2754, +0, 2012, 2754, +0, 2031, 2753, +0, 2056, 2752, +0, 2086, 2751, +0, 2124, 2750, +0, 2170, 2748, +0, 2226, 2746, +0, 2291, 2742, +0, 2365, 2738, +738, 2448, 2731, +1664, 2540, 2723, +1664, 2626, 2723, +1664, 2719, 2723, +1664, 2723, 2598, +1664, 2723, 2338, +870, 2863, 1498, +2062, 3002, 0, +2484, 3138, 0, +2753, 3274, 0, +2966, 3408, 0, +3151, 3543, 0, +3319, 3676, 0, +3475, 3809, 0, +3626, 3942, 0, +3770, 4075, 0, +3912, 4095, 0, +0, 1353, 2755, +0, 1367, 2755, +0, 1386, 2755, +0, 1409, 2755, +0, 1439, 2755, +0, 1476, 2754, +0, 1521, 2754, +0, 1575, 2753, +0, 1638, 2752, +0, 1711, 2751, +0, 1794, 2750, +0, 1885, 2748, +0, 1983, 2746, +0, 2089, 2742, +0, 2200, 2738, +738, 2315, 2731, +1664, 2435, 2723, +2015, 2557, 2711, +2015, 2665, 2711, +2015, 2711, 2634, +2015, 2711, 2400, +1797, 2855, 1796, +2303, 2995, 1006, +2596, 3134, 0, +2818, 3270, 0, +3008, 3406, 0, +3179, 3541, 0, +3338, 3675, 0, +3490, 3808, 0, +3635, 3941, 0, +3777, 4074, 0, +3917, 4095, 0, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2754, +0, 0, 2754, +0, 0, 2753, +0, 0, 2752, +0, 0, 2751, +0, 0, 2750, +0, 0, 2748, +0, 678, 2746, +0, 1463, 2742, +0, 1799, 2738, +738, 2040, 2731, +1664, 2240, 2723, +2015, 2416, 2711, +2261, 2579, 2696, +2261, 2696, 2678, +2261, 2696, 2471, +2246, 2843, 2147, +2503, 2987, 1930, +2712, 3128, 1137, +2893, 3266, 0, +3059, 3402, 0, +3214, 3538, 0, +3363, 3673, 0, +3508, 3807, 0, +3649, 3940, 0, +3787, 4073, 0, +3924, 4095, 0, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2754, +0, 0, 2754, +0, 0, 2753, +0, 0, 2752, +0, 0, 2751, +0, 0, 2750, +0, 0, 2748, +0, 0, 2746, +0, 0, 2742, +817, 0, 2738, +1362, 738, 2731, +1664, 1667, 2723, +2015, 2114, 2711, +2261, 2391, 2696, +2463, 2607, 2673, +2463, 2673, 2552, +2522, 2828, 2393, +2680, 2975, 2280, +2831, 3119, 2061, +2976, 3259, 1272, +3118, 3398, 0, +3257, 3535, 0, +3395, 3670, 0, +3531, 3805, 0, +3666, 3939, 0, +3800, 4072, 0, +3934, 4095, 0, +2083, 0, 2755, +2084, 0, 2755, +2086, 0, 2755, +2088, 0, 2755, +2091, 0, 2755, +2094, 0, 2754, +2099, 0, 2754, +2105, 0, 2753, +2113, 0, 2752, +2123, 0, 2751, +2137, 0, 2750, +2155, 0, 2748, +2177, 0, 2746, +2206, 0, 2742, +2241, 0, 2738, +2285, 738, 2731, +2338, 1664, 2723, +2400, 2015, 2711, +2471, 2261, 2696, +2552, 2463, 2673, +2642, 2642, 2642, +2739, 2805, 2596, +2843, 2959, 2526, +2954, 3108, 2412, +3069, 3251, 2194, +3187, 3392, 1406, +3309, 3530, 0, +3434, 3667, 0, +3560, 3802, 0, +3688, 3937, 0, +3816, 4071, 0, +3946, 4095, 0, +2604, 0, 2887, +2604, 0, 2887, +2605, 0, 2887, +2605, 0, 2887, +2606, 0, 2887, +2607, 0, 2887, +2609, 0, 2886, +2611, 0, 2886, +2613, 0, 2885, +2617, 0, 2885, +2621, 0, 2883, +2628, 0, 2882, +2636, 0, 2880, +2647, 0, 2878, +2661, 0, 2874, +2678, 0, 2870, +2701, 870, 2863, +2730, 1796, 2855, +2766, 2147, 2843, +2810, 2393, 2828, +2805, 2596, 2739, +2805, 2684, 2596, +2959, 2942, 2526, +3061, 3108, 2412, +3154, 3251, 2194, +3255, 3392, 1406, +3362, 3530, 0, +3474, 3667, 0, +3591, 3802, 0, +3711, 3937, 0, +3834, 4071, 0, +3960, 4095, 0, +2898, 0, 3019, +2898, 0, 3019, +2898, 0, 3019, +2899, 0, 3019, +2899, 0, 3019, +2900, 0, 3019, +2901, 0, 3018, +2902, 0, 3018, +2903, 0, 3018, +2905, 0, 3017, +2907, 0, 3016, +2911, 0, 3015, +2915, 0, 3014, +2921, 0, 3012, +2928, 0, 3010, +2939, 0, 3006, +2952, 0, 3002, +2968, 1006, 2995, +2987, 1930, 2984, +2975, 2280, 2929, +2959, 2526, 2843, +2959, 2526, 2654, +2959, 2735, 2526, +3108, 3031, 2412, +3248, 3251, 2194, +3331, 3392, 1406, +3423, 3530, 0, +3523, 3667, 0, +3629, 3802, 0, +3741, 3937, 0, +3857, 4071, 0, +3977, 4095, 0, +3123, 0, 3152, +3123, 0, 3152, +3123, 0, 3152, +3123, 0, 3151, +3123, 0, 3151, +3124, 0, 3151, +3124, 0, 3151, +3125, 0, 3151, +3126, 0, 3151, +3127, 0, 3150, +3128, 0, 3150, +3131, 0, 3149, +3133, 0, 3148, +3137, 0, 3146, +3141, 0, 3144, +3142, 0, 3136, +3138, 0, 3120, +3134, 0, 3098, +3128, 1137, 3067, +3119, 2061, 3022, +3108, 2412, 2954, +3108, 2412, 2813, +3108, 2412, 2511, +3108, 2796, 2412, +3251, 3126, 2194, +3392, 3365, 1406, +3495, 3530, 0, +3581, 3667, 0, +3676, 3802, 0, +3777, 3937, 0, +3886, 4071, 0, +3999, 4095, 0, +3284, 0, 3252, +3283, 0, 3252, +3283, 0, 3252, +3283, 0, 3252, +3283, 0, 3251, +3283, 0, 3251, +3283, 0, 3250, +3283, 0, 3249, +3283, 0, 3248, +3282, 0, 3247, +3282, 0, 3244, +3281, 0, 3242, +3280, 0, 3238, +3280, 0, 3233, +3278, 0, 3225, +3276, 0, 3216, +3274, 0, 3203, +3270, 0, 3184, +3266, 0, 3159, +3259, 1272, 3122, +3251, 2194, 3069, +3251, 2194, 2963, +3251, 2194, 2768, +3251, 2195, 2194, +3251, 2866, 2194, +3392, 3230, 1406, +3530, 3480, 0, +3648, 3667, 0, +3731, 3802, 0, +3822, 3937, 0, +3921, 4071, 0, +4027, 4095, 0, +3416, 0, 3335, +3416, 0, 3335, +3416, 0, 3335, +3416, 0, 3335, +3416, 0, 3334, +3416, 0, 3334, +3415, 0, 3333, +3415, 0, 3333, +3415, 0, 3331, +3415, 0, 3330, +3414, 0, 3329, +3414, 0, 3326, +3414, 0, 3323, +3413, 0, 3319, +3412, 0, 3313, +3410, 0, 3305, +3408, 0, 3294, +3406, 0, 3279, +3402, 0, 3259, +3398, 0, 3230, +3392, 1406, 3187, +3392, 1406, 3108, +3392, 1406, 2976, +3392, 1406, 2701, +3392, 2025, 1406, +3392, 2945, 1406, +3530, 3339, 0, +3667, 3599, 0, +3796, 3802, 0, +3876, 3937, 0, +3965, 4071, 0, +4062, 4095, 0, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3425, +3548, 0, 3425, +3548, 0, 3424, +3548, 0, 3423, +3547, 0, 3422, +3547, 0, 3421, +3547, 0, 3419, +3546, 0, 3416, +3546, 0, 3413, +3545, 0, 3408, +3544, 0, 3402, +3543, 0, 3393, +3541, 0, 3381, +3538, 0, 3365, +3535, 0, 3342, +3530, 0, 3309, +3530, 0, 3250, +3530, 0, 3157, +3530, 0, 2992, +3530, 0, 2593, +3530, 1621, 0, +3530, 3034, 0, +3667, 3453, 0, +3802, 3721, 0, +3937, 3934, 0, +4018, 4071, 0, +4095, 4095, 0, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3524, +3680, 0, 3524, +3680, 0, 3523, +3680, 0, 3522, +3679, 0, 3521, +3679, 0, 3520, +3679, 0, 3517, +3678, 0, 3515, +3678, 0, 3511, +3677, 0, 3506, +3676, 0, 3499, +3675, 0, 3490, +3673, 0, 3477, +3670, 0, 3459, +3667, 0, 3434, +3667, 0, 3389, +3667, 0, 3323, +3667, 0, 3215, +3667, 0, 3014, +3667, 0, 2388, +3667, 0, 0, +3667, 3131, 0, +3802, 3571, 0, +3937, 3846, 0, +4071, 4061, 0, +4095, 4095, 0, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3630, +3812, 0, 3630, +3812, 0, 3630, +3812, 0, 3629, +3812, 0, 3629, +3812, 0, 3628, +3812, 0, 3626, +3811, 0, 3625, +3811, 0, 3622, +3810, 0, 3620, +3810, 0, 3616, +3809, 0, 3610, +3808, 0, 3603, +3807, 0, 3593, +3805, 0, 3579, +3802, 0, 3560, +3802, 0, 3527, +3802, 0, 3479, +3802, 0, 3405, +3802, 0, 3282, +3802, 0, 3040, +3802, 0, 1737, +3802, 0, 0, +3802, 3234, 0, +3937, 3692, 0, +4071, 3972, 0, +4095, 4095, 0, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3741, +3944, 0, 3741, +3944, 0, 3741, +3944, 0, 3740, +3944, 0, 3740, +3944, 0, 3739, +3944, 0, 3737, +3943, 0, 3736, +3943, 0, 3733, +3943, 0, 3730, +3942, 0, 3726, +3941, 0, 3720, +3940, 0, 3713, +3939, 0, 3702, +3937, 0, 3688, +3937, 0, 3663, +3937, 0, 3628, +3937, 0, 3575, +3937, 0, 3495, +3937, 0, 3359, +3937, 0, 3073, +3937, 0, 0, +3937, 0, 0, +3937, 3344, 0, +4071, 3816, 0, +4095, 4095, 0, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3857, +4076, 0, 3857, +4076, 0, 3856, +4076, 0, 3856, +4076, 0, 3855, +4076, 0, 3854, +4076, 0, 3853, +4075, 0, 3851, +4075, 0, 3849, +4075, 0, 3846, +4074, 0, 3841, +4073, 0, 3835, +4072, 0, 3827, +4071, 0, 3816, +4071, 0, 3798, +4071, 0, 3772, +4071, 0, 3735, +4071, 0, 3679, +4071, 0, 3593, +4071, 0, 3445, +4071, 0, 3113, +4071, 0, 0, +4071, 0, 0, +4071, 3458, 0, +4095, 3943, 0, +4095, 0, 3978, +4095, 0, 3978, +4095, 0, 3978, +4095, 0, 3978, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3976, +4095, 0, 3976, +4095, 0, 3975, +4095, 0, 3974, +4095, 0, 3972, +4095, 0, 3971, +4095, 0, 3968, +4095, 0, 3965, +4095, 0, 3961, +4095, 0, 3954, +4095, 0, 3946, +4095, 0, 3932, +4095, 0, 3913, +4095, 0, 3886, +4095, 0, 3847, +4095, 0, 3790, +4095, 0, 3699, +4095, 0, 3539, +4095, 0, 3164, +4095, 0, 0, +4095, 0, 0, +4095, 3576, 0, +0, 2618, 2887, +0, 2619, 2887, +0, 2620, 2887, +0, 2621, 2887, +0, 2623, 2887, +0, 2625, 2887, +0, 2628, 2887, +0, 2633, 2887, +0, 2638, 2887, +0, 2646, 2887, +0, 2655, 2887, +0, 2668, 2887, +0, 2684, 2887, +0, 2705, 2887, +0, 2732, 2887, +0, 2765, 2887, +0, 2806, 2887, +0, 2856, 2887, +0, 2887, 2859, +0, 2887, 2767, +0, 2887, 2604, +0, 2887, 2215, +0, 3019, 0, +0, 3152, 0, +1844, 3284, 0, +2613, 3416, 0, +2948, 3548, 0, +3188, 3680, 0, +3387, 3812, 0, +3564, 3944, 0, +3726, 4076, 0, +3880, 4095, 0, +0, 2617, 2887, +0, 2618, 2887, +0, 2619, 2887, +0, 2620, 2887, +0, 2622, 2887, +0, 2625, 2887, +0, 2628, 2887, +0, 2632, 2887, +0, 2638, 2887, +0, 2645, 2887, +0, 2655, 2887, +0, 2667, 2887, +0, 2684, 2887, +0, 2705, 2887, +0, 2731, 2887, +0, 2764, 2887, +0, 2805, 2887, +0, 2855, 2887, +0, 2887, 2859, +0, 2887, 2767, +0, 2887, 2604, +0, 2887, 2215, +0, 3019, 0, +0, 3152, 0, +1849, 3283, 0, +2614, 3416, 0, +2948, 3548, 0, +3188, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3726, 4076, 0, +3880, 4095, 0, +0, 2616, 2887, +0, 2617, 2887, +0, 2618, 2887, +0, 2620, 2887, +0, 2621, 2887, +0, 2624, 2887, +0, 2627, 2887, +0, 2631, 2887, +0, 2637, 2887, +0, 2644, 2887, +0, 2654, 2887, +0, 2667, 2887, +0, 2683, 2887, +0, 2704, 2887, +0, 2731, 2887, +0, 2764, 2887, +0, 2805, 2887, +0, 2855, 2887, +0, 2887, 2859, +0, 2887, 2767, +0, 2887, 2605, +0, 2887, 2217, +0, 3019, 0, +0, 3152, 0, +1856, 3283, 0, +2615, 3416, 0, +2949, 3548, 0, +3189, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3726, 4076, 0, +3880, 4095, 0, +0, 2615, 2887, +0, 2616, 2887, +0, 2617, 2887, +0, 2619, 2887, +0, 2620, 2887, +0, 2623, 2887, +0, 2626, 2887, +0, 2630, 2887, +0, 2636, 2887, +0, 2643, 2887, +0, 2653, 2887, +0, 2666, 2887, +0, 2682, 2887, +0, 2703, 2887, +0, 2730, 2887, +0, 2763, 2887, +0, 2804, 2887, +0, 2854, 2887, +0, 2887, 2860, +0, 2887, 2768, +0, 2887, 2605, +0, 2887, 2218, +0, 3019, 0, +0, 3151, 0, +1864, 3283, 0, +2617, 3416, 0, +2950, 3548, 0, +3189, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3727, 4076, 0, +3880, 4095, 0, +0, 2613, 2887, +0, 2614, 2887, +0, 2615, 2887, +0, 2617, 2887, +0, 2619, 2887, +0, 2621, 2887, +0, 2625, 2887, +0, 2629, 2887, +0, 2635, 2887, +0, 2642, 2887, +0, 2651, 2887, +0, 2664, 2887, +0, 2681, 2887, +0, 2702, 2887, +0, 2728, 2887, +0, 2762, 2887, +0, 2803, 2887, +0, 2853, 2887, +0, 2887, 2860, +0, 2887, 2768, +0, 2887, 2606, +0, 2887, 2220, +0, 3019, 0, +0, 3151, 0, +1875, 3283, 0, +2619, 3416, 0, +2951, 3548, 0, +3190, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3727, 4076, 0, +3880, 4095, 0, +0, 2611, 2887, +0, 2612, 2887, +0, 2613, 2887, +0, 2614, 2887, +0, 2617, 2887, +0, 2619, 2887, +0, 2623, 2887, +0, 2627, 2887, +0, 2632, 2887, +0, 2640, 2887, +0, 2650, 2887, +0, 2662, 2887, +0, 2679, 2887, +0, 2700, 2887, +0, 2727, 2887, +0, 2761, 2887, +0, 2802, 2887, +0, 2852, 2887, +0, 2887, 2861, +0, 2887, 2769, +0, 2887, 2607, +0, 2887, 2223, +0, 3019, 0, +0, 3151, 0, +1890, 3283, 0, +2621, 3416, 0, +2952, 3548, 0, +3191, 3680, 0, +3389, 3812, 0, +3565, 3944, 0, +3727, 4076, 0, +3881, 4095, 0, +0, 2607, 2887, +0, 2608, 2887, +0, 2609, 2887, +0, 2611, 2887, +0, 2613, 2887, +0, 2616, 2887, +0, 2620, 2886, +0, 2624, 2886, +0, 2630, 2886, +0, 2637, 2886, +0, 2647, 2886, +0, 2660, 2886, +0, 2677, 2886, +0, 2698, 2886, +0, 2725, 2886, +0, 2759, 2886, +0, 2800, 2886, +0, 2850, 2886, +0, 2886, 2862, +0, 2886, 2770, +0, 2886, 2609, +0, 2886, 2226, +0, 3018, 0, +0, 3151, 0, +1908, 3283, 0, +2625, 3415, 0, +2954, 3548, 0, +3192, 3680, 0, +3390, 3812, 0, +3565, 3944, 0, +3727, 4076, 0, +3881, 4095, 0, +0, 2603, 2887, +0, 2604, 2887, +0, 2605, 2887, +0, 2607, 2887, +0, 2609, 2887, +0, 2612, 2887, +0, 2616, 2886, +0, 2621, 2886, +0, 2626, 2886, +0, 2634, 2886, +0, 2644, 2886, +0, 2657, 2886, +0, 2673, 2886, +0, 2695, 2886, +0, 2722, 2886, +0, 2756, 2886, +0, 2798, 2886, +0, 2848, 2886, +0, 2886, 2863, +0, 2886, 2772, +0, 2886, 2611, +0, 2886, 2231, +0, 3018, 0, +0, 3151, 0, +1932, 3283, 0, +2630, 3415, 0, +2956, 3548, 0, +3193, 3680, 0, +3391, 3812, 0, +3566, 3944, 0, +3728, 4076, 0, +3881, 4095, 0, +0, 2597, 2887, +0, 2598, 2887, +0, 2599, 2887, +0, 2601, 2887, +0, 2603, 2887, +0, 2606, 2887, +0, 2610, 2886, +0, 2615, 2886, +0, 2622, 2885, +0, 2629, 2885, +0, 2639, 2885, +0, 2652, 2885, +0, 2669, 2885, +0, 2691, 2885, +0, 2718, 2885, +0, 2752, 2885, +0, 2795, 2885, +0, 2845, 2885, +0, 2885, 2864, +0, 2885, 2773, +0, 2885, 2613, +0, 2885, 2237, +0, 3018, 0, +0, 3151, 0, +1962, 3283, 0, +2637, 3415, 0, +2960, 3548, 0, +3195, 3680, 0, +3392, 3812, 0, +3567, 3944, 0, +3728, 4076, 0, +3881, 4095, 0, +0, 2589, 2887, +0, 2589, 2887, +0, 2591, 2887, +0, 2592, 2887, +0, 2595, 2887, +0, 2598, 2887, +0, 2602, 2886, +0, 2607, 2886, +0, 2614, 2885, +0, 2623, 2885, +0, 2633, 2885, +0, 2647, 2885, +0, 2664, 2885, +0, 2685, 2885, +0, 2713, 2885, +0, 2748, 2885, +0, 2790, 2885, +0, 2842, 2885, +0, 2885, 2866, +0, 2885, 2776, +0, 2885, 2617, +0, 2885, 2245, +0, 3017, 0, +0, 3150, 0, +1999, 3282, 0, +2646, 3415, 0, +2964, 3547, 0, +3198, 3680, 0, +3394, 3812, 0, +3568, 3944, 0, +3729, 4076, 0, +3882, 4095, 0, +0, 2577, 2887, +0, 2578, 2887, +0, 2580, 2887, +0, 2581, 2887, +0, 2584, 2887, +0, 2587, 2887, +0, 2591, 2886, +0, 2596, 2886, +0, 2603, 2885, +0, 2613, 2885, +0, 2625, 2883, +0, 2639, 2883, +0, 2656, 2883, +0, 2678, 2883, +0, 2706, 2883, +0, 2741, 2883, +0, 2784, 2883, +0, 2836, 2883, +0, 2883, 2869, +0, 2883, 2779, +0, 2883, 2621, +0, 2883, 2255, +0, 3016, 0, +0, 3150, 0, +2045, 3282, 0, +2657, 3414, 0, +2970, 3547, 0, +3201, 3679, 0, +3396, 3812, 0, +3569, 3944, 0, +3730, 4076, 0, +3883, 4095, 0, +0, 2562, 2887, +0, 2563, 2887, +0, 2564, 2887, +0, 2566, 2887, +0, 2569, 2887, +0, 2572, 2887, +0, 2576, 2886, +0, 2581, 2886, +0, 2589, 2885, +0, 2599, 2885, +0, 2611, 2883, +0, 2628, 2882, +0, 2645, 2882, +0, 2668, 2882, +0, 2697, 2882, +0, 2733, 2882, +0, 2777, 2882, +0, 2829, 2882, +0, 2882, 2873, +0, 2882, 2784, +0, 2882, 2628, +0, 2882, 2269, +0, 3015, 0, +0, 3149, 0, +2100, 3281, 0, +2672, 3414, 0, +2977, 3547, 0, +3206, 3679, 0, +3399, 3812, 0, +3571, 3944, 0, +3732, 4076, 0, +3884, 4095, 0, +0, 2541, 2887, +0, 2542, 2887, +0, 2543, 2887, +0, 2545, 2887, +0, 2548, 2887, +0, 2551, 2887, +0, 2555, 2886, +0, 2561, 2886, +0, 2569, 2885, +0, 2579, 2885, +0, 2592, 2883, +0, 2609, 2882, +0, 2631, 2880, +0, 2654, 2880, +0, 2684, 2880, +0, 2721, 2880, +0, 2766, 2880, +0, 2820, 2880, +0, 2880, 2877, +0, 2880, 2789, +0, 2880, 2636, +0, 2880, 2287, +0, 3014, 0, +0, 3148, 0, +2164, 3280, 0, +2691, 3414, 0, +2987, 3546, 0, +3212, 3679, 0, +3403, 3811, 0, +3574, 3944, 0, +3734, 4076, 0, +3885, 4095, 0, +0, 2510, 2887, +0, 2511, 2887, +0, 2513, 2887, +0, 2515, 2887, +0, 2517, 2887, +0, 2521, 2887, +0, 2526, 2886, +0, 2532, 2886, +0, 2540, 2885, +0, 2551, 2885, +0, 2565, 2883, +0, 2583, 2882, +0, 2606, 2880, +0, 2636, 2878, +0, 2666, 2878, +0, 2704, 2878, +0, 2751, 2878, +0, 2807, 2878, +0, 2872, 2878, +0, 2878, 2797, +0, 2878, 2647, +0, 2878, 2309, +0, 3012, 0, +0, 3146, 0, +2237, 3280, 0, +2715, 3413, 0, +3000, 3546, 0, +3220, 3678, 0, +3408, 3811, 0, +3578, 3943, 0, +3736, 4076, 0, +3887, 4095, 0, +0, 2466, 2887, +0, 2467, 2887, +0, 2469, 2887, +0, 2471, 2887, +0, 2474, 2887, +0, 2478, 2887, +0, 2483, 2886, +0, 2490, 2886, +0, 2499, 2885, +0, 2511, 2885, +0, 2526, 2883, +0, 2546, 2882, +0, 2571, 2880, +0, 2602, 2878, +0, 2641, 2874, +0, 2681, 2874, +0, 2730, 2874, +0, 2788, 2874, +0, 2856, 2874, +0, 2874, 2807, +0, 2874, 2661, +0, 2874, 2338, +0, 3010, 0, +0, 3144, 0, +2320, 3278, 0, +2746, 3412, 0, +3016, 3545, 0, +3230, 3678, 0, +3415, 3810, 0, +3583, 3943, 0, +3739, 4075, 0, +3889, 4095, 0, +0, 2400, 2887, +0, 2401, 2887, +0, 2403, 2887, +0, 2406, 2887, +0, 2409, 2887, +0, 2413, 2887, +0, 2419, 2886, +0, 2427, 2886, +0, 2438, 2885, +0, 2451, 2885, +0, 2469, 2883, +0, 2491, 2882, +0, 2519, 2880, +0, 2554, 2878, +0, 2597, 2874, +0, 2649, 2870, +0, 2701, 2870, +0, 2763, 2870, +0, 2834, 2870, +0, 2870, 2820, +0, 2870, 2678, +0, 2870, 2374, +0, 3006, 0, +1068, 3142, 0, +2411, 3276, 0, +2784, 3410, 0, +3038, 3544, 0, +3243, 3677, 0, +3424, 3810, 0, +3589, 3943, 0, +3744, 4075, 0, +3893, 4095, 0, +0, 2292, 2887, +0, 2294, 2887, +0, 2296, 2887, +0, 2299, 2887, +0, 2304, 2887, +0, 2310, 2887, +0, 2317, 2886, +0, 2327, 2886, +0, 2340, 2885, +0, 2356, 2885, +0, 2378, 2883, +0, 2405, 2882, +0, 2439, 2880, +0, 2480, 2878, +0, 2530, 2874, +0, 2590, 2870, +870, 2659, 2863, +870, 2726, 2863, +870, 2803, 2863, +870, 2863, 2837, +870, 2863, 2701, +870, 2863, 2417, +0, 3002, 1109, +1857, 3138, 0, +2510, 3274, 0, +2830, 3408, 0, +3065, 3543, 0, +3261, 3676, 0, +3435, 3809, 0, +3597, 3942, 0, +3750, 4075, 0, +3897, 4095, 0, +0, 2091, 2887, +0, 2094, 2887, +0, 2098, 2887, +0, 2103, 2887, +0, 2110, 2887, +0, 2118, 2887, +0, 2129, 2886, +0, 2144, 2886, +0, 2163, 2885, +0, 2188, 2885, +0, 2218, 2883, +0, 2256, 2882, +0, 2302, 2880, +0, 2358, 2878, +0, 2423, 2874, +0, 2497, 2870, +870, 2580, 2863, +1796, 2672, 2855, +1796, 2758, 2855, +1796, 2852, 2855, +1796, 2855, 2730, +1796, 2855, 2470, +1006, 2995, 1635, +2195, 3134, 0, +2616, 3270, 0, +2886, 3406, 0, +3099, 3541, 0, +3283, 3675, 0, +3451, 3808, 0, +3608, 3941, 0, +3757, 4074, 0, +3903, 4095, 0, +0, 1472, 2887, +0, 1483, 2887, +0, 1497, 2887, +0, 1516, 2887, +0, 1540, 2887, +0, 1569, 2887, +0, 1606, 2886, +0, 1651, 2886, +0, 1706, 2885, +0, 1769, 2885, +0, 1843, 2883, +0, 1925, 2882, +0, 2016, 2880, +0, 2115, 2878, +0, 2220, 2874, +0, 2332, 2870, +870, 2447, 2863, +1796, 2567, 2855, +2147, 2689, 2843, +2147, 2797, 2843, +2147, 2843, 2766, +2147, 2843, 2532, +1930, 2987, 1930, +2436, 3128, 1137, +2727, 3266, 0, +2951, 3402, 0, +3140, 3538, 0, +3311, 3673, 0, +3470, 3807, 0, +3622, 3940, 0, +3768, 4073, 0, +3910, 4095, 0, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2886, +0, 0, 2886, +0, 0, 2885, +0, 0, 2885, +0, 0, 2883, +0, 0, 2882, +0, 0, 2880, +0, 817, 2878, +0, 1596, 2874, +0, 1932, 2870, +870, 2173, 2863, +1796, 2372, 2855, +2147, 2549, 2843, +2393, 2711, 2828, +2393, 2828, 2810, +2393, 2828, 2603, +2377, 2975, 2280, +2636, 3119, 2061, +2843, 3259, 1272, +3025, 3398, 0, +3190, 3535, 0, +3346, 3670, 0, +3495, 3805, 0, +3640, 3939, 0, +3781, 4072, 0, +3920, 4095, 0, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2886, +0, 0, 2886, +0, 0, 2885, +0, 0, 2885, +0, 0, 2883, +0, 0, 2882, +0, 0, 2880, +0, 0, 2878, +0, 0, 2874, +963, 0, 2870, +1498, 870, 2863, +1796, 1797, 2855, +2147, 2246, 2843, +2393, 2522, 2828, +2596, 2739, 2805, +2596, 2805, 2684, +2654, 2959, 2526, +2813, 3108, 2412, +2963, 3251, 2194, +3108, 3392, 1406, +3250, 3530, 0, +3389, 3667, 0, +3527, 3802, 0, +3663, 3937, 0, +3798, 4071, 0, +3932, 4095, 0, +2215, 0, 2887, +2215, 0, 2887, +2217, 0, 2887, +2218, 0, 2887, +2220, 0, 2887, +2223, 0, 2887, +2226, 0, 2886, +2231, 0, 2886, +2237, 0, 2885, +2245, 0, 2885, +2255, 0, 2883, +2269, 0, 2882, +2287, 0, 2880, +2309, 0, 2878, +2338, 0, 2874, +2374, 0, 2870, +2417, 870, 2863, +2470, 1796, 2855, +2532, 2147, 2843, +2603, 2393, 2828, +2684, 2596, 2805, +2774, 2774, 2774, +2871, 2937, 2728, +2976, 3092, 2658, +3085, 3239, 2544, +3201, 3383, 2326, +3320, 3524, 1536, +3441, 3662, 0, +3566, 3799, 0, +3692, 3934, 0, +3820, 4069, 0, +3949, 4095, 0, +2735, 0, 3019, +2735, 0, 3019, +2736, 0, 3019, +2736, 0, 3019, +2737, 0, 3019, +2738, 0, 3019, +2739, 0, 3018, +2740, 0, 3018, +2742, 0, 3018, +2745, 0, 3017, +2749, 0, 3016, +2753, 0, 3015, +2759, 0, 3014, +2767, 0, 3012, +2778, 0, 3010, +2792, 0, 3006, +2810, 0, 3002, +2833, 1006, 2995, +2862, 1930, 2987, +2898, 2280, 2975, +2942, 2526, 2959, +2937, 2728, 2871, +2937, 2816, 2728, +3092, 3074, 2658, +3193, 3239, 2544, +3286, 3383, 2326, +3387, 3524, 1536, +3494, 3662, 0, +3606, 3799, 0, +3723, 3934, 0, +3843, 4069, 0, +3966, 4095, 0, +3031, 0, 3152, +3031, 0, 3152, +3031, 0, 3152, +3031, 0, 3151, +3031, 0, 3151, +3032, 0, 3151, +3032, 0, 3151, +3033, 0, 3151, +3034, 0, 3151, +3036, 0, 3150, +3038, 0, 3150, +3040, 0, 3149, +3043, 0, 3148, +3047, 0, 3146, +3053, 0, 3144, +3061, 0, 3142, +3071, 0, 3138, +3084, 0, 3134, +3101, 1137, 3128, +3119, 2061, 3116, +3108, 2412, 3061, +3092, 2658, 2976, +3092, 2658, 2787, +3092, 2867, 2658, +3239, 3162, 2544, +3380, 3383, 2326, +3463, 3524, 1536, +3555, 3662, 0, +3655, 3799, 0, +3761, 3934, 0, +3873, 4069, 0, +3989, 4095, 0, +3254, 0, 3284, +3254, 0, 3283, +3255, 0, 3283, +3255, 0, 3283, +3255, 0, 3283, +3255, 0, 3283, +3256, 0, 3283, +3256, 0, 3283, +3257, 0, 3283, +3257, 0, 3282, +3259, 0, 3282, +3260, 0, 3281, +3262, 0, 3280, +3265, 0, 3280, +3269, 0, 3278, +3273, 0, 3276, +3274, 0, 3268, +3270, 0, 3252, +3266, 0, 3230, +3259, 1272, 3199, +3251, 2194, 3154, +3239, 2544, 3085, +3239, 2544, 2945, +3239, 2544, 2642, +3239, 2928, 2544, +3383, 3258, 2326, +3524, 3497, 1536, +3626, 3662, 0, +3713, 3799, 0, +3808, 3934, 0, +3910, 4069, 0, +4018, 4095, 0, +3416, 0, 3385, +3416, 0, 3385, +3416, 0, 3384, +3416, 0, 3384, +3416, 0, 3384, +3416, 0, 3384, +3415, 0, 3383, +3415, 0, 3382, +3415, 0, 3381, +3415, 0, 3380, +3414, 0, 3379, +3414, 0, 3376, +3414, 0, 3374, +3413, 0, 3370, +3412, 0, 3365, +3410, 0, 3358, +3408, 0, 3348, +3406, 0, 3335, +3402, 0, 3317, +3398, 0, 3291, +3392, 1406, 3255, +3383, 2326, 3201, +3383, 2326, 3095, +3383, 2326, 2900, +3383, 2326, 2328, +3383, 2998, 2326, +3524, 3362, 1536, +3662, 3612, 0, +3781, 3799, 0, +3863, 3934, 0, +3954, 4069, 0, +4054, 4095, 0, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3466, +3548, 0, 3466, +3548, 0, 3466, +3548, 0, 3465, +3547, 0, 3464, +3547, 0, 3462, +3547, 0, 3461, +3546, 0, 3458, +3546, 0, 3455, +3545, 0, 3451, +3544, 0, 3445, +3543, 0, 3437, +3541, 0, 3426, +3538, 0, 3411, +3535, 0, 3391, +3530, 0, 3362, +3524, 1536, 3320, +3524, 1536, 3241, +3524, 1536, 3108, +3524, 1536, 2833, +3524, 2158, 1536, +3524, 3078, 1536, +3662, 3471, 0, +3799, 3731, 0, +3928, 3934, 0, +4008, 4069, 0, +4095, 4095, 0, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3557, +3680, 0, 3557, +3680, 0, 3556, +3680, 0, 3556, +3679, 0, 3554, +3679, 0, 3553, +3679, 0, 3551, +3678, 0, 3548, +3678, 0, 3545, +3677, 0, 3540, +3676, 0, 3534, +3675, 0, 3525, +3673, 0, 3513, +3670, 0, 3497, +3667, 0, 3474, +3662, 0, 3441, +3662, 0, 3382, +3662, 0, 3289, +3662, 0, 3125, +3662, 0, 2724, +3662, 1753, 0, +3662, 3166, 0, +3799, 3585, 0, +3934, 3853, 0, +4069, 4066, 0, +4095, 4095, 0, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3656, +3812, 0, 3656, +3812, 0, 3655, +3812, 0, 3654, +3812, 0, 3653, +3811, 0, 3652, +3811, 0, 3650, +3810, 0, 3647, +3810, 0, 3643, +3809, 0, 3638, +3808, 0, 3631, +3807, 0, 3622, +3805, 0, 3609, +3802, 0, 3591, +3799, 0, 3566, +3799, 0, 3522, +3799, 0, 3455, +3799, 0, 3347, +3799, 0, 3145, +3799, 0, 2519, +3799, 0, 0, +3799, 3262, 0, +3934, 3703, 0, +4069, 3978, 0, +4095, 4095, 0, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3762, +3944, 0, 3762, +3944, 0, 3762, +3944, 0, 3761, +3944, 0, 3761, +3944, 0, 3760, +3944, 0, 3758, +3943, 0, 3757, +3943, 0, 3755, +3943, 0, 3752, +3942, 0, 3748, +3941, 0, 3742, +3940, 0, 3735, +3939, 0, 3725, +3937, 0, 3711, +3934, 0, 3692, +3934, 0, 3659, +3934, 0, 3611, +3934, 0, 3537, +3934, 0, 3414, +3934, 0, 3172, +3934, 0, 1863, +3934, 0, 0, +3934, 3366, 0, +4069, 3824, 0, +4095, 4095, 0, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3873, +4076, 0, 3873, +4076, 0, 3873, +4076, 0, 3872, +4076, 0, 3872, +4076, 0, 3871, +4076, 0, 3869, +4075, 0, 3868, +4075, 0, 3865, +4075, 0, 3862, +4074, 0, 3858, +4073, 0, 3852, +4072, 0, 3845, +4071, 0, 3834, +4069, 0, 3820, +4069, 0, 3795, +4069, 0, 3760, +4069, 0, 3708, +4069, 0, 3627, +4069, 0, 3491, +4069, 0, 3205, +4069, 0, 0, +4069, 0, 0, +4069, 3475, 0, +4095, 3949, 0, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3989, +4095, 0, 3989, +4095, 0, 3989, +4095, 0, 3988, +4095, 0, 3988, +4095, 0, 3986, +4095, 0, 3985, +4095, 0, 3983, +4095, 0, 3981, +4095, 0, 3978, +4095, 0, 3974, +4095, 0, 3968, +4095, 0, 3960, +4095, 0, 3949, +4095, 0, 3930, +4095, 0, 3904, +4095, 0, 3867, +4095, 0, 3812, +4095, 0, 3726, +4095, 0, 3577, +4095, 0, 3246, +4095, 0, 0, +4095, 0, 0, +4095, 3590, 0, +0, 2750, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2752, 3019, +0, 2754, 3019, +0, 2755, 3019, +0, 2758, 3019, +0, 2761, 3019, +0, 2765, 3019, +0, 2771, 3019, +0, 2778, 3019, +0, 2788, 3019, +0, 2800, 3019, +0, 2816, 3019, +0, 2837, 3019, +0, 2864, 3019, +0, 2897, 3019, +0, 2938, 3019, +0, 2988, 3019, +0, 3019, 2991, +0, 3019, 2898, +0, 3019, 2735, +0, 3019, 2346, +0, 3152, 0, +0, 3284, 0, +1977, 3416, 0, +2745, 3548, 0, +3080, 3680, 0, +3320, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2749, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2752, 3019, +0, 2753, 3019, +0, 2755, 3019, +0, 2757, 3019, +0, 2760, 3019, +0, 2765, 3019, +0, 2770, 3019, +0, 2777, 3019, +0, 2787, 3019, +0, 2800, 3019, +0, 2816, 3019, +0, 2837, 3019, +0, 2863, 3019, +0, 2897, 3019, +0, 2938, 3019, +0, 2987, 3019, +0, 3019, 2991, +0, 3019, 2898, +0, 3019, 2735, +0, 3019, 2346, +0, 3152, 0, +0, 3283, 0, +1981, 3416, 0, +2745, 3548, 0, +3080, 3680, 0, +3321, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2748, 3019, +0, 2749, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2752, 3019, +0, 2754, 3019, +0, 2757, 3019, +0, 2760, 3019, +0, 2764, 3019, +0, 2770, 3019, +0, 2777, 3019, +0, 2787, 3019, +0, 2799, 3019, +0, 2816, 3019, +0, 2836, 3019, +0, 2863, 3019, +0, 2896, 3019, +0, 2938, 3019, +0, 2987, 3019, +0, 3019, 2991, +0, 3019, 2898, +0, 3019, 2736, +0, 3019, 2347, +0, 3152, 0, +0, 3283, 0, +1986, 3416, 0, +2746, 3548, 0, +3081, 3680, 0, +3321, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2747, 3019, +0, 2748, 3019, +0, 2749, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2753, 3019, +0, 2756, 3019, +0, 2759, 3019, +0, 2763, 3019, +0, 2769, 3019, +0, 2776, 3019, +0, 2786, 3019, +0, 2798, 3019, +0, 2815, 3019, +0, 2836, 3019, +0, 2863, 3019, +0, 2896, 3019, +0, 2937, 3019, +0, 2987, 3019, +0, 3019, 2991, +0, 3019, 2899, +0, 3019, 2736, +0, 3019, 2348, +0, 3151, 0, +0, 3283, 0, +1992, 3416, 0, +2747, 3548, 0, +3081, 3680, 0, +3321, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2746, 3019, +0, 2747, 3019, +0, 2747, 3019, +0, 2749, 3019, +0, 2750, 3019, +0, 2752, 3019, +0, 2755, 3019, +0, 2758, 3019, +0, 2762, 3019, +0, 2768, 3019, +0, 2775, 3019, +0, 2785, 3019, +0, 2797, 3019, +0, 2814, 3019, +0, 2835, 3019, +0, 2862, 3019, +0, 2895, 3019, +0, 2936, 3019, +0, 2986, 3019, +0, 3019, 2992, +0, 3019, 2899, +0, 3019, 2737, +0, 3019, 2350, +0, 3151, 0, +0, 3283, 0, +2000, 3416, 0, +2749, 3548, 0, +3082, 3680, 0, +3322, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2744, 3019, +0, 2745, 3019, +0, 2746, 3019, +0, 2747, 3019, +0, 2749, 3019, +0, 2751, 3019, +0, 2753, 3019, +0, 2756, 3019, +0, 2761, 3019, +0, 2766, 3019, +0, 2774, 3019, +0, 2784, 3019, +0, 2796, 3019, +0, 2813, 3019, +0, 2834, 3019, +0, 2860, 3019, +0, 2894, 3019, +0, 2935, 3019, +0, 2985, 3019, +0, 3019, 2992, +0, 3019, 2900, +0, 3019, 2738, +0, 3019, 2352, +0, 3151, 0, +0, 3283, 0, +2011, 3416, 0, +2751, 3548, 0, +3083, 3680, 0, +3322, 3812, 0, +3521, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2742, 3019, +0, 2742, 3019, +0, 2743, 3019, +0, 2745, 3019, +0, 2746, 3019, +0, 2748, 3019, +0, 2751, 3018, +0, 2754, 3018, +0, 2759, 3018, +0, 2764, 3018, +0, 2772, 3018, +0, 2782, 3018, +0, 2794, 3018, +0, 2811, 3018, +0, 2832, 3018, +0, 2859, 3018, +0, 2892, 3018, +0, 2934, 3018, +0, 2984, 3018, +0, 3018, 2992, +0, 3018, 2901, +0, 3018, 2739, +0, 3018, 2354, +0, 3151, 0, +0, 3283, 0, +2026, 3415, 0, +2754, 3548, 0, +3084, 3680, 0, +3323, 3812, 0, +3521, 3944, 0, +3697, 4076, 0, +3859, 4095, 0, +0, 2738, 3019, +0, 2739, 3019, +0, 2740, 3019, +0, 2741, 3019, +0, 2743, 3019, +0, 2745, 3019, +0, 2748, 3018, +0, 2752, 3018, +0, 2756, 3018, +0, 2762, 3018, +0, 2769, 3018, +0, 2779, 3018, +0, 2792, 3018, +0, 2808, 3018, +0, 2830, 3018, +0, 2857, 3018, +0, 2890, 3018, +0, 2932, 3018, +0, 2982, 3018, +0, 3018, 2993, +0, 3018, 2902, +0, 3018, 2740, +0, 3018, 2358, +0, 3151, 0, +0, 3283, 0, +2044, 3415, 0, +2758, 3548, 0, +3086, 3680, 0, +3324, 3812, 0, +3522, 3944, 0, +3697, 4076, 0, +3860, 4095, 0, +0, 2734, 3019, +0, 2735, 3019, +0, 2735, 3019, +0, 2737, 3019, +0, 2738, 3019, +0, 2741, 3019, +0, 2744, 3018, +0, 2747, 3018, +0, 2752, 3018, +0, 2758, 3018, +0, 2766, 3018, +0, 2776, 3018, +0, 2789, 3018, +0, 2805, 3018, +0, 2827, 3018, +0, 2854, 3018, +0, 2888, 3018, +0, 2930, 3018, +0, 2980, 3018, +0, 3018, 2995, +0, 3018, 2903, +0, 3018, 2742, +0, 3018, 2362, +0, 3151, 0, +0, 3283, 0, +2068, 3415, 0, +2763, 3548, 0, +3089, 3680, 0, +3326, 3812, 0, +3523, 3944, 0, +3698, 4076, 0, +3860, 4095, 0, +0, 2728, 3019, +0, 2729, 3019, +0, 2729, 3019, +0, 2731, 3019, +0, 2732, 3019, +0, 2735, 3019, +0, 2738, 3018, +0, 2742, 3018, +0, 2747, 3018, +0, 2754, 3017, +0, 2761, 3017, +0, 2771, 3017, +0, 2784, 3017, +0, 2801, 3017, +0, 2823, 3017, +0, 2850, 3017, +0, 2885, 3017, +0, 2927, 3017, +0, 2977, 3017, +0, 3017, 2996, +0, 3017, 2905, +0, 3017, 2745, +0, 3017, 2369, +0, 3150, 0, +0, 3282, 0, +2098, 3415, 0, +2770, 3547, 0, +3092, 3680, 0, +3328, 3812, 0, +3524, 3944, 0, +3699, 4076, 0, +3861, 4095, 0, +0, 2720, 3019, +0, 2720, 3019, +0, 2721, 3019, +0, 2723, 3019, +0, 2724, 3019, +0, 2727, 3019, +0, 2730, 3018, +0, 2734, 3018, +0, 2739, 3018, +0, 2746, 3017, +0, 2755, 3016, +0, 2765, 3016, +0, 2778, 3016, +0, 2796, 3016, +0, 2817, 3016, +0, 2845, 3016, +0, 2880, 3016, +0, 2922, 3016, +0, 2974, 3016, +0, 3016, 2998, +0, 3016, 2907, +0, 3016, 2749, +0, 3016, 2377, +0, 3150, 0, +0, 3282, 0, +2135, 3414, 0, +2778, 3547, 0, +3096, 3679, 0, +3330, 3812, 0, +3526, 3944, 0, +3700, 4076, 0, +3862, 4095, 0, +0, 2708, 3019, +0, 2709, 3019, +0, 2710, 3019, +0, 2712, 3019, +0, 2713, 3019, +0, 2716, 3019, +0, 2719, 3018, +0, 2723, 3018, +0, 2728, 3018, +0, 2735, 3017, +0, 2745, 3016, +0, 2757, 3015, +0, 2770, 3015, +0, 2788, 3015, +0, 2810, 3015, +0, 2838, 3015, +0, 2873, 3015, +0, 2916, 3015, +0, 2968, 3015, +0, 3015, 3001, +0, 3015, 2911, +0, 3015, 2753, +0, 3015, 2387, +0, 3149, 0, +0, 3281, 0, +2180, 3414, 0, +2790, 3547, 0, +3102, 3679, 0, +3333, 3812, 0, +3528, 3944, 0, +3701, 4076, 0, +3863, 4095, 0, +0, 2693, 3019, +0, 2694, 3019, +0, 2695, 3019, +0, 2696, 3019, +0, 2698, 3019, +0, 2701, 3019, +0, 2703, 3018, +0, 2708, 3018, +0, 2714, 3018, +0, 2721, 3017, +0, 2731, 3016, +0, 2743, 3015, +0, 2759, 3014, +0, 2777, 3014, +0, 2800, 3014, +0, 2829, 3014, +0, 2865, 3014, +0, 2908, 3014, +0, 2961, 3014, +0, 3014, 3004, +0, 3014, 2915, +0, 3014, 2759, +0, 3014, 2401, +0, 3148, 0, +0, 3280, 0, +2234, 3414, 0, +2804, 3546, 0, +3110, 3679, 0, +3338, 3811, 0, +3531, 3944, 0, +3703, 4076, 0, +3864, 4095, 0, +0, 2672, 3019, +0, 2672, 3019, +0, 2673, 3019, +0, 2675, 3019, +0, 2677, 3019, +0, 2679, 3019, +0, 2683, 3018, +0, 2687, 3018, +0, 2693, 3018, +0, 2701, 3017, +0, 2711, 3016, +0, 2724, 3015, +0, 2741, 3014, +0, 2763, 3012, +0, 2786, 3012, +0, 2816, 3012, +0, 2853, 3012, +0, 2898, 3012, +0, 2952, 3012, +0, 3012, 3009, +0, 3012, 2921, +0, 3012, 2767, +0, 3012, 2419, +0, 3146, 0, +0, 3280, 0, +2298, 3413, 0, +2824, 3546, 0, +3119, 3678, 0, +3344, 3811, 0, +3535, 3943, 0, +3706, 4076, 0, +3866, 4095, 0, +0, 2641, 3019, +0, 2642, 3019, +0, 2643, 3019, +0, 2645, 3019, +0, 2647, 3019, +0, 2649, 3019, +0, 2653, 3018, +0, 2658, 3018, +0, 2664, 3018, +0, 2672, 3017, +0, 2683, 3016, +0, 2697, 3015, +0, 2715, 3014, +0, 2738, 3012, +0, 2767, 3010, +0, 2798, 3010, +0, 2836, 3010, +0, 2883, 3010, +0, 2939, 3010, +0, 3004, 3010, +0, 3010, 2928, +0, 3010, 2778, +0, 3010, 2441, +0, 3144, 0, +0, 3278, 0, +2371, 3412, 0, +2848, 3545, 0, +3132, 3678, 0, +3352, 3810, 0, +3540, 3943, 0, +3710, 4075, 0, +3868, 4095, 0, +0, 2597, 3019, +0, 2598, 3019, +0, 2599, 3019, +0, 2601, 3019, +0, 2603, 3019, +0, 2606, 3019, +0, 2610, 3018, +0, 2615, 3018, +0, 2622, 3018, +0, 2631, 3017, +0, 2643, 3016, +0, 2658, 3015, +0, 2678, 3014, +0, 2703, 3012, +0, 2734, 3010, +0, 2773, 3006, +0, 2813, 3006, +0, 2862, 3006, +0, 2920, 3006, +0, 2988, 3006, +0, 3006, 2939, +0, 3006, 2792, +0, 3006, 2470, +0, 3142, 0, +0, 3276, 0, +2453, 3410, 0, +2879, 3544, 0, +3149, 3677, 0, +3362, 3810, 0, +3547, 3943, 0, +3714, 4075, 0, +3872, 4095, 0, +0, 2530, 3019, +0, 2531, 3019, +0, 2533, 3019, +0, 2535, 3019, +0, 2537, 3019, +0, 2541, 3019, +0, 2545, 3018, +0, 2551, 3018, +0, 2559, 3018, +0, 2570, 3017, +0, 2583, 3016, +0, 2600, 3015, +0, 2623, 3014, +0, 2651, 3012, +0, 2686, 3010, +0, 2729, 3006, +0, 2781, 3002, +0, 2833, 3002, +0, 2895, 3002, +0, 2966, 3002, +0, 3002, 2952, +0, 3002, 2810, +0, 3002, 2505, +0, 3138, 0, +1202, 3274, 0, +2545, 3408, 0, +2917, 3543, 0, +3170, 3676, 0, +3376, 3809, 0, +3556, 3942, 0, +3721, 4075, 0, +3876, 4095, 0, +0, 2422, 3019, +0, 2424, 3019, +0, 2426, 3019, +0, 2428, 3019, +0, 2431, 3019, +0, 2435, 3019, +0, 2441, 3018, +0, 2449, 3018, +0, 2459, 3018, +0, 2471, 3017, +0, 2488, 3016, +0, 2510, 3015, +0, 2536, 3014, +0, 2570, 3012, +0, 2612, 3010, +0, 2662, 3006, +0, 2722, 3002, +1006, 2791, 2995, +1006, 2858, 2995, +1006, 2935, 2995, +1006, 2995, 2968, +1006, 2995, 2833, +1006, 2995, 2549, +0, 3134, 1211, +1990, 3270, 0, +2643, 3406, 0, +2963, 3541, 0, +3197, 3675, 0, +3393, 3808, 0, +3568, 3941, 0, +3729, 4074, 0, +3882, 4095, 0, +0, 2220, 3019, +0, 2222, 3019, +0, 2225, 3019, +0, 2229, 3019, +0, 2234, 3019, +0, 2241, 3019, +0, 2249, 3018, +0, 2261, 3018, +0, 2276, 3018, +0, 2294, 3017, +0, 2319, 3016, +0, 2350, 3015, +0, 2388, 3014, +0, 2434, 3012, +0, 2489, 3010, +0, 2554, 3006, +0, 2628, 3002, +1006, 2712, 2995, +1930, 2804, 2987, +1930, 2890, 2987, +1930, 2984, 2987, +1930, 2987, 2862, +1930, 2987, 2602, +1137, 3128, 1758, +2327, 3266, 0, +2749, 3402, 0, +3018, 3538, 0, +3231, 3673, 0, +3415, 3807, 0, +3583, 3940, 0, +3740, 4073, 0, +3890, 4095, 0, +0, 1594, 3019, +0, 1602, 3019, +0, 1613, 3019, +0, 1628, 3019, +0, 1646, 3019, +0, 1670, 3019, +0, 1700, 3018, +0, 1737, 3018, +0, 1782, 3018, +0, 1837, 3017, +0, 1900, 3016, +0, 1974, 3015, +0, 2056, 3014, +0, 2148, 3012, +0, 2247, 3010, +0, 2352, 3006, +0, 2463, 3002, +1006, 2579, 2995, +1930, 2699, 2987, +2280, 2821, 2975, +2280, 2929, 2975, +2280, 2975, 2898, +2280, 2975, 2664, +2064, 3119, 2061, +2569, 3259, 1272, +2860, 3398, 0, +3083, 3535, 0, +3273, 3670, 0, +3443, 3805, 0, +3603, 3939, 0, +3754, 4072, 0, +3900, 4095, 0, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3018, +0, 0, 3018, +0, 0, 3018, +0, 0, 3017, +0, 0, 3016, +0, 0, 3015, +0, 0, 3014, +0, 0, 3012, +0, 922, 3010, +0, 1723, 3006, +0, 2062, 3002, +1006, 2303, 2995, +1930, 2503, 2987, +2280, 2680, 2975, +2526, 2843, 2959, +2526, 2959, 2942, +2526, 2959, 2735, +2511, 3108, 2412, +2768, 3251, 2194, +2976, 3392, 1406, +3157, 3530, 0, +3323, 3667, 0, +3479, 3802, 0, +3628, 3937, 0, +3772, 4071, 0, +3913, 4095, 0, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3018, +0, 0, 3018, +0, 0, 3018, +0, 0, 3017, +0, 0, 3016, +0, 0, 3015, +0, 0, 3014, +0, 0, 3012, +0, 0, 3010, +0, 0, 3006, +1109, 0, 3002, +1635, 1006, 2995, +1930, 1930, 2987, +2280, 2377, 2975, +2526, 2654, 2959, +2728, 2871, 2937, +2728, 2937, 2816, +2787, 3092, 2658, +2945, 3239, 2544, +3095, 3383, 2326, +3241, 3524, 1536, +3382, 3662, 0, +3522, 3799, 0, +3659, 3934, 0, +3795, 4069, 0, +3930, 4095, 0, +2346, 0, 3019, +2346, 0, 3019, +2347, 0, 3019, +2348, 0, 3019, +2350, 0, 3019, +2352, 0, 3019, +2354, 0, 3018, +2358, 0, 3018, +2362, 0, 3018, +2369, 0, 3017, +2377, 0, 3016, +2387, 0, 3015, +2401, 0, 3014, +2419, 0, 3012, +2441, 0, 3010, +2470, 0, 3006, +2505, 0, 3002, +2549, 1006, 2995, +2602, 1930, 2987, +2664, 2280, 2975, +2735, 2526, 2959, +2816, 2728, 2937, +2906, 2906, 2906, +3003, 3069, 2860, +3107, 3223, 2790, +3218, 3372, 2676, +3333, 3515, 2457, +3452, 3656, 1663, +3574, 3794, 0, +3698, 3931, 0, +3824, 4066, 0, +3952, 4095, 0, +2868, 0, 3152, +2868, 0, 3152, +2869, 0, 3152, +2869, 0, 3151, +2869, 0, 3151, +2870, 0, 3151, +2871, 0, 3151, +2872, 0, 3151, +2873, 0, 3151, +2875, 0, 3150, +2878, 0, 3150, +2881, 0, 3149, +2886, 0, 3148, +2892, 0, 3146, +2901, 0, 3144, +2911, 0, 3142, +2925, 0, 3138, +2943, 0, 3134, +2965, 1137, 3128, +2995, 2061, 3119, +3031, 2412, 3108, +3074, 2658, 3092, +3069, 2860, 3003, +3069, 2948, 2860, +3223, 3206, 2790, +3325, 3372, 2676, +3418, 3515, 2457, +3519, 3656, 1663, +3626, 3794, 0, +3738, 3931, 0, +3855, 4066, 0, +3976, 4095, 0, +3162, 0, 3284, +3162, 0, 3283, +3163, 0, 3283, +3163, 0, 3283, +3163, 0, 3283, +3163, 0, 3283, +3164, 0, 3283, +3164, 0, 3283, +3165, 0, 3283, +3166, 0, 3282, +3168, 0, 3282, +3169, 0, 3281, +3172, 0, 3280, +3175, 0, 3280, +3180, 0, 3278, +3185, 0, 3276, +3193, 0, 3274, +3203, 0, 3270, +3216, 0, 3266, +3233, 1272, 3259, +3251, 2194, 3248, +3239, 2544, 3193, +3223, 2790, 3107, +3223, 2790, 2918, +3223, 2999, 2790, +3372, 3294, 2676, +3512, 3515, 2457, +3595, 3656, 1663, +3687, 3794, 0, +3787, 3931, 0, +3893, 4066, 0, +4005, 4095, 0, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3415, +3388, 0, 3415, +3388, 0, 3415, +3389, 0, 3415, +3390, 0, 3414, +3391, 0, 3414, +3393, 0, 3414, +3395, 0, 3413, +3397, 0, 3412, +3401, 0, 3410, +3406, 0, 3408, +3406, 0, 3400, +3402, 0, 3384, +3398, 0, 3362, +3392, 1406, 3331, +3383, 2326, 3286, +3372, 2676, 3218, +3372, 2676, 3077, +3372, 2676, 2774, +3372, 3060, 2676, +3515, 3391, 2457, +3656, 3629, 1663, +3759, 3794, 0, +3845, 3931, 0, +3940, 4066, 0, +4042, 4095, 0, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3515, +3548, 0, 3515, +3548, 0, 3514, +3547, 0, 3513, +3547, 0, 3512, +3547, 0, 3511, +3546, 0, 3509, +3546, 0, 3506, +3545, 0, 3502, +3544, 0, 3497, +3543, 0, 3490, +3541, 0, 3480, +3538, 0, 3467, +3535, 0, 3449, +3530, 0, 3423, +3524, 1536, 3387, +3515, 2457, 3333, +3515, 2457, 3227, +3515, 2457, 3032, +3515, 2457, 2459, +3515, 3130, 2457, +3656, 3494, 1663, +3794, 3745, 0, +3913, 3931, 0, +3995, 4066, 0, +4087, 4095, 0, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3598, +3680, 0, 3598, +3680, 0, 3597, +3680, 0, 3597, +3679, 0, 3596, +3679, 0, 3595, +3679, 0, 3593, +3678, 0, 3590, +3678, 0, 3587, +3677, 0, 3583, +3676, 0, 3577, +3675, 0, 3569, +3673, 0, 3558, +3670, 0, 3543, +3667, 0, 3523, +3662, 0, 3494, +3656, 1663, 3452, +3656, 1663, 3373, +3656, 1663, 3240, +3656, 1663, 2965, +3656, 2289, 1663, +3656, 3210, 1663, +3794, 3603, 0, +3931, 3863, 0, +4060, 4066, 0, +4095, 4095, 0, +3812, 0, 3691, +3812, 0, 3691, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3689, +3812, 0, 3689, +3812, 0, 3688, +3812, 0, 3687, +3811, 0, 3685, +3811, 0, 3683, +3810, 0, 3680, +3810, 0, 3677, +3809, 0, 3672, +3808, 0, 3666, +3807, 0, 3657, +3805, 0, 3646, +3802, 0, 3629, +3799, 0, 3606, +3794, 0, 3574, +3794, 0, 3515, +3794, 0, 3421, +3794, 0, 3256, +3794, 0, 2856, +3794, 1884, 0, +3794, 3298, 0, +3931, 3717, 0, +4066, 3985, 0, +4095, 4095, 0, +3944, 0, 3790, +3944, 0, 3790, +3944, 0, 3790, +3944, 0, 3790, +3944, 0, 3789, +3944, 0, 3789, +3944, 0, 3789, +3944, 0, 3789, +3944, 0, 3788, +3944, 0, 3788, +3944, 0, 3787, +3944, 0, 3786, +3944, 0, 3785, +3943, 0, 3784, +3943, 0, 3781, +3943, 0, 3779, +3942, 0, 3775, +3941, 0, 3770, +3940, 0, 3763, +3939, 0, 3754, +3937, 0, 3741, +3934, 0, 3723, +3931, 0, 3698, +3931, 0, 3654, +3931, 0, 3587, +3931, 0, 3479, +3931, 0, 3277, +3931, 0, 2650, +3931, 0, 0, +3931, 3395, 0, +4066, 3835, 0, +4095, 4095, 0, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3894, +4076, 0, 3894, +4076, 0, 3893, +4076, 0, 3892, +4076, 0, 3891, +4076, 0, 3890, +4075, 0, 3889, +4075, 0, 3887, +4075, 0, 3884, +4074, 0, 3880, +4073, 0, 3874, +4072, 0, 3867, +4071, 0, 3857, +4069, 0, 3843, +4066, 0, 3824, +4066, 0, 3791, +4066, 0, 3743, +4066, 0, 3669, +4066, 0, 3546, +4066, 0, 3303, +4066, 0, 1985, +4066, 0, 0, +4066, 3498, 0, +4095, 3957, 0, +4095, 0, 4007, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4005, +4095, 0, 4005, +4095, 0, 4005, +4095, 0, 4004, +4095, 0, 4003, +4095, 0, 4002, +4095, 0, 4000, +4095, 0, 3998, +4095, 0, 3994, +4095, 0, 3990, +4095, 0, 3984, +4095, 0, 3977, +4095, 0, 3966, +4095, 0, 3952, +4095, 0, 3927, +4095, 0, 3892, +4095, 0, 3840, +4095, 0, 3759, +4095, 0, 3623, +4095, 0, 3337, +4095, 0, 0, +4095, 0, 0, +4095, 3608, 0, +0, 2882, 3152, +0, 2883, 3152, +0, 2883, 3152, +0, 2884, 3152, +0, 2885, 3152, +0, 2886, 3152, +0, 2888, 3152, +0, 2890, 3152, +0, 2893, 3152, +0, 2898, 3152, +0, 2903, 3152, +0, 2911, 3152, +0, 2920, 3152, +0, 2933, 3152, +0, 2949, 3152, +0, 2970, 3152, +0, 2996, 3152, +0, 3030, 3152, +0, 3071, 3152, +0, 3120, 3152, +0, 3152, 3123, +0, 3152, 3031, +0, 3152, 2868, +0, 3152, 2478, +0, 3284, 0, +0, 3416, 0, +2104, 3548, 0, +2876, 3680, 0, +3211, 3812, 0, +3452, 3944, 0, +3651, 4076, 0, +3828, 4095, 0, +0, 2881, 3152, +0, 2882, 3152, +0, 2883, 3152, +0, 2883, 3152, +0, 2885, 3152, +0, 2886, 3152, +0, 2888, 3152, +0, 2890, 3152, +0, 2893, 3152, +0, 2897, 3152, +0, 2903, 3152, +0, 2910, 3152, +0, 2920, 3152, +0, 2932, 3152, +0, 2949, 3152, +0, 2970, 3152, +0, 2996, 3152, +0, 3029, 3152, +0, 3070, 3152, +0, 3120, 3152, +0, 3152, 3123, +0, 3152, 3031, +0, 3152, 2868, +0, 3152, 2478, +0, 3283, 0, +0, 3416, 0, +2107, 3548, 0, +2877, 3680, 0, +3212, 3812, 0, +3452, 3944, 0, +3651, 4076, 0, +3828, 4095, 0, +0, 2881, 3152, +0, 2881, 3152, +0, 2882, 3152, +0, 2883, 3152, +0, 2884, 3152, +0, 2885, 3152, +0, 2887, 3152, +0, 2890, 3152, +0, 2893, 3152, +0, 2897, 3152, +0, 2903, 3152, +0, 2910, 3152, +0, 2919, 3152, +0, 2932, 3152, +0, 2948, 3152, +0, 2969, 3152, +0, 2996, 3152, +0, 3029, 3152, +0, 3070, 3152, +0, 3120, 3152, +0, 3152, 3123, +0, 3152, 3031, +0, 3152, 2869, +0, 3152, 2479, +0, 3283, 0, +0, 3416, 0, +2111, 3548, 0, +2877, 3680, 0, +3212, 3812, 0, +3453, 3944, 0, +3651, 4076, 0, +3828, 4095, 0, +0, 2880, 3152, +0, 2881, 3152, +0, 2881, 3152, +0, 2882, 3151, +0, 2883, 3151, +0, 2885, 3151, +0, 2886, 3151, +0, 2889, 3151, +0, 2892, 3151, +0, 2896, 3151, +0, 2902, 3151, +0, 2909, 3151, +0, 2919, 3151, +0, 2932, 3151, +0, 2948, 3151, +0, 2969, 3151, +0, 2995, 3151, +0, 3029, 3151, +0, 3070, 3151, +0, 3119, 3151, +0, 3151, 3123, +0, 3151, 3031, +0, 3151, 2869, +0, 3151, 2480, +0, 3283, 0, +0, 3416, 0, +2115, 3548, 0, +2878, 3680, 0, +3213, 3812, 0, +3453, 3944, 0, +3652, 4076, 0, +3828, 4095, 0, +0, 2879, 3152, +0, 2880, 3152, +0, 2880, 3152, +0, 2881, 3151, +0, 2883, 3151, +0, 2884, 3151, +0, 2886, 3151, +0, 2888, 3151, +0, 2891, 3151, +0, 2895, 3151, +0, 2901, 3151, +0, 2908, 3151, +0, 2918, 3151, +0, 2931, 3151, +0, 2947, 3151, +0, 2968, 3151, +0, 2995, 3151, +0, 3028, 3151, +0, 3069, 3151, +0, 3119, 3151, +0, 3151, 3123, +0, 3151, 3031, +0, 3151, 2869, +0, 3151, 2481, +0, 3283, 0, +0, 3416, 0, +2122, 3548, 0, +2879, 3680, 0, +3213, 3812, 0, +3453, 3944, 0, +3652, 4076, 0, +3828, 4095, 0, +0, 2878, 3152, +0, 2878, 3152, +0, 2879, 3152, +0, 2880, 3151, +0, 2881, 3151, +0, 2883, 3151, +0, 2885, 3151, +0, 2887, 3151, +0, 2890, 3151, +0, 2895, 3151, +0, 2900, 3151, +0, 2907, 3151, +0, 2917, 3151, +0, 2930, 3151, +0, 2946, 3151, +0, 2967, 3151, +0, 2994, 3151, +0, 3027, 3151, +0, 3068, 3151, +0, 3118, 3151, +0, 3151, 3124, +0, 3151, 3032, +0, 3151, 2870, +0, 3151, 2482, +0, 3283, 0, +0, 3416, 0, +2130, 3548, 0, +2881, 3680, 0, +3214, 3812, 0, +3454, 3944, 0, +3652, 4076, 0, +3829, 4095, 0, +0, 2876, 3152, +0, 2877, 3152, +0, 2877, 3152, +0, 2878, 3151, +0, 2879, 3151, +0, 2881, 3151, +0, 2883, 3151, +0, 2885, 3151, +0, 2889, 3151, +0, 2893, 3151, +0, 2898, 3151, +0, 2906, 3151, +0, 2916, 3151, +0, 2928, 3151, +0, 2945, 3151, +0, 2966, 3151, +0, 2993, 3151, +0, 3026, 3151, +0, 3067, 3151, +0, 3117, 3151, +0, 3151, 3124, +0, 3151, 3032, +0, 3151, 2871, +0, 3151, 2484, +0, 3283, 0, +0, 3415, 0, +2141, 3548, 0, +2883, 3680, 0, +3215, 3812, 0, +3454, 3944, 0, +3653, 4076, 0, +3829, 4095, 0, +0, 2873, 3152, +0, 2874, 3152, +0, 2875, 3152, +0, 2876, 3151, +0, 2877, 3151, +0, 2879, 3151, +0, 2881, 3151, +0, 2883, 3151, +0, 2887, 3151, +0, 2891, 3151, +0, 2896, 3151, +0, 2904, 3151, +0, 2914, 3151, +0, 2927, 3151, +0, 2943, 3151, +0, 2964, 3151, +0, 2991, 3151, +0, 3025, 3151, +0, 3066, 3151, +0, 3116, 3151, +0, 3151, 3125, +0, 3151, 3033, +0, 3151, 2872, +0, 3151, 2487, +0, 3283, 0, +0, 3415, 0, +2156, 3548, 0, +2886, 3680, 0, +3216, 3812, 0, +3455, 3944, 0, +3653, 4076, 0, +3829, 4095, 0, +0, 2870, 3152, +0, 2871, 3152, +0, 2871, 3152, +0, 2872, 3151, +0, 2873, 3151, +0, 2875, 3151, +0, 2877, 3151, +0, 2880, 3151, +0, 2884, 3151, +0, 2888, 3151, +0, 2894, 3151, +0, 2902, 3151, +0, 2911, 3151, +0, 2924, 3151, +0, 2941, 3151, +0, 2962, 3151, +0, 2989, 3151, +0, 3023, 3151, +0, 3064, 3151, +0, 3115, 3151, +0, 3151, 3126, +0, 3151, 3034, +0, 3151, 2873, +0, 3151, 2490, +0, 3283, 0, +0, 3415, 0, +2174, 3548, 0, +2890, 3680, 0, +3218, 3812, 0, +3456, 3944, 0, +3654, 4076, 0, +3830, 4095, 0, +0, 2866, 3152, +0, 2866, 3152, +0, 2867, 3152, +0, 2868, 3151, +0, 2869, 3151, +0, 2871, 3151, +0, 2873, 3151, +0, 2876, 3151, +0, 2880, 3151, +0, 2885, 3150, +0, 2891, 3150, +0, 2898, 3150, +0, 2908, 3150, +0, 2921, 3150, +0, 2938, 3150, +0, 2959, 3150, +0, 2986, 3150, +0, 3020, 3150, +0, 3062, 3150, +0, 3112, 3150, +0, 3150, 3127, +0, 3150, 3036, +0, 3150, 2875, +0, 3150, 2495, +0, 3282, 0, +0, 3415, 0, +2198, 3547, 0, +2895, 3680, 0, +3221, 3812, 0, +3458, 3944, 0, +3655, 4076, 0, +3830, 4095, 0, +0, 2860, 3152, +0, 2860, 3152, +0, 2861, 3152, +0, 2862, 3151, +0, 2863, 3151, +0, 2865, 3151, +0, 2867, 3151, +0, 2870, 3151, +0, 2874, 3151, +0, 2879, 3150, +0, 2886, 3150, +0, 2894, 3150, +0, 2904, 3150, +0, 2917, 3150, +0, 2933, 3150, +0, 2955, 3150, +0, 2982, 3150, +0, 3017, 3150, +0, 3059, 3150, +0, 3110, 3150, +0, 3150, 3128, +0, 3150, 3038, +0, 3150, 2878, +0, 3150, 2501, +0, 3282, 0, +0, 3414, 0, +2228, 3547, 0, +2901, 3679, 0, +3224, 3812, 0, +3459, 3944, 0, +3656, 4076, 0, +3831, 4095, 0, +0, 2851, 3152, +0, 2852, 3152, +0, 2853, 3152, +0, 2854, 3151, +0, 2855, 3151, +0, 2857, 3151, +0, 2859, 3151, +0, 2862, 3151, +0, 2866, 3151, +0, 2871, 3150, +0, 2878, 3150, +0, 2887, 3149, +0, 2898, 3149, +0, 2911, 3149, +0, 2928, 3149, +0, 2950, 3149, +0, 2977, 3149, +0, 3012, 3149, +0, 3055, 3149, +0, 3106, 3149, +0, 3149, 3131, +0, 3149, 3040, +0, 3149, 2881, +0, 3149, 2509, +0, 3281, 0, +0, 3414, 0, +2265, 3547, 0, +2910, 3679, 0, +3228, 3812, 0, +3462, 3944, 0, +3658, 4076, 0, +3832, 4095, 0, +0, 2840, 3152, +0, 2841, 3152, +0, 2842, 3152, +0, 2842, 3151, +0, 2844, 3151, +0, 2845, 3151, +0, 2848, 3151, +0, 2851, 3151, +0, 2855, 3151, +0, 2860, 3150, +0, 2868, 3150, +0, 2877, 3149, +0, 2889, 3148, +0, 2903, 3148, +0, 2920, 3148, +0, 2942, 3148, +0, 2970, 3148, +0, 3005, 3148, +0, 3049, 3148, +0, 3100, 3148, +0, 3148, 3133, +0, 3148, 3043, +0, 3148, 2886, +0, 3148, 2520, +0, 3280, 0, +0, 3414, 0, +2311, 3546, 0, +2922, 3679, 0, +3234, 3811, 0, +3466, 3944, 0, +3660, 4076, 0, +3834, 4095, 0, +0, 2825, 3152, +0, 2825, 3152, +0, 2826, 3152, +0, 2827, 3151, +0, 2829, 3151, +0, 2830, 3151, +0, 2833, 3151, +0, 2836, 3151, +0, 2840, 3151, +0, 2846, 3150, +0, 2853, 3150, +0, 2863, 3149, +0, 2875, 3148, +0, 2892, 3146, +0, 2910, 3146, +0, 2932, 3146, +0, 2961, 3146, +0, 2997, 3146, +0, 3041, 3146, +0, 3093, 3146, +0, 3146, 3137, +0, 3146, 3047, +0, 3146, 2892, +0, 3146, 2533, +0, 3280, 0, +0, 3413, 0, +2365, 3546, 0, +2936, 3678, 0, +3241, 3811, 0, +3470, 3943, 0, +3663, 4076, 0, +3836, 4095, 0, +0, 2803, 3152, +0, 2804, 3152, +0, 2805, 3152, +0, 2806, 3151, +0, 2807, 3151, +0, 2809, 3151, +0, 2812, 3151, +0, 2815, 3151, +0, 2819, 3151, +0, 2825, 3150, +0, 2833, 3150, +0, 2843, 3149, +0, 2856, 3148, +0, 2873, 3146, +0, 2895, 3144, +0, 2919, 3144, +0, 2948, 3144, +0, 2985, 3144, +0, 3030, 3144, +0, 3084, 3144, +0, 3144, 3141, +0, 3144, 3053, +0, 3144, 2901, +0, 3144, 2551, +0, 3278, 0, +0, 3412, 0, +2429, 3545, 0, +2955, 3678, 0, +3251, 3810, 0, +3476, 3943, 0, +3667, 4075, 0, +3838, 4095, 0, +0, 2773, 3152, +0, 2773, 3152, +0, 2774, 3152, +0, 2775, 3151, +0, 2777, 3151, +0, 2779, 3151, +0, 2782, 3151, +0, 2785, 3151, +0, 2790, 3151, +0, 2796, 3150, +0, 2804, 3150, +0, 2815, 3149, +0, 2829, 3148, +0, 2847, 3146, +0, 2870, 3144, +0, 2900, 3142, +0, 2931, 3142, +0, 2969, 3142, +0, 3015, 3142, +0, 3071, 3142, +0, 3136, 3142, +0, 3142, 3061, +0, 3142, 2911, +0, 3142, 2573, +0, 3276, 0, +0, 3410, 0, +2502, 3544, 0, +2980, 3677, 0, +3264, 3810, 0, +3484, 3943, 0, +3672, 4075, 0, +3842, 4095, 0, +0, 2729, 3152, +0, 2729, 3152, +0, 2730, 3152, +0, 2732, 3151, +0, 2733, 3151, +0, 2735, 3151, +0, 2738, 3151, +0, 2742, 3151, +0, 2747, 3151, +0, 2754, 3150, +0, 2763, 3150, +0, 2775, 3149, +0, 2790, 3148, +0, 2810, 3146, +0, 2835, 3144, +0, 2867, 3142, +0, 2906, 3138, +0, 2946, 3138, +0, 2995, 3138, +0, 3053, 3138, +0, 3120, 3138, +0, 3138, 3071, +0, 3138, 2925, +0, 3138, 2602, +0, 3274, 0, +0, 3408, 0, +2585, 3543, 0, +3010, 3676, 0, +3281, 3809, 0, +3494, 3942, 0, +3679, 4075, 0, +3847, 4095, 0, +0, 2662, 3152, +0, 2663, 3152, +0, 2664, 3152, +0, 2665, 3151, +0, 2667, 3151, +0, 2670, 3151, +0, 2673, 3151, +0, 2678, 3151, +0, 2684, 3151, +0, 2691, 3150, +0, 2702, 3150, +0, 2715, 3149, +0, 2733, 3148, +0, 2755, 3146, +0, 2783, 3144, +0, 2818, 3142, +0, 2861, 3138, +0, 2913, 3134, +0, 2965, 3134, +0, 3027, 3134, +0, 3098, 3134, +0, 3134, 3084, +0, 3134, 2943, +0, 3134, 2638, +0, 3270, 0, +1325, 3406, 0, +2676, 3541, 0, +3048, 3675, 0, +3302, 3808, 0, +3507, 3941, 0, +3688, 4074, 0, +3853, 4095, 0, +0, 2554, 3152, +0, 2555, 3152, +0, 2556, 3152, +0, 2558, 3151, +0, 2560, 3151, +0, 2564, 3151, +0, 2568, 3151, +0, 2573, 3151, +0, 2581, 3151, +0, 2591, 3150, +0, 2604, 3150, +0, 2620, 3149, +0, 2642, 3148, +0, 2669, 3146, +0, 2703, 3144, +0, 2744, 3142, +0, 2795, 3138, +0, 2854, 3134, +1137, 2923, 3128, +1137, 2991, 3128, +1137, 3067, 3128, +1137, 3128, 3101, +1137, 3128, 2965, +1137, 3128, 2681, +0, 3266, 1375, +2121, 3402, 0, +2775, 3538, 0, +3095, 3673, 0, +3329, 3807, 0, +3525, 3940, 0, +3700, 4073, 0, +3861, 4095, 0, +0, 2352, 3152, +0, 2353, 3152, +0, 2355, 3152, +0, 2358, 3151, +0, 2362, 3151, +0, 2367, 3151, +0, 2373, 3151, +0, 2382, 3151, +0, 2394, 3151, +0, 2408, 3150, +0, 2427, 3150, +0, 2452, 3149, +0, 2482, 3148, +0, 2521, 3146, +0, 2566, 3144, +0, 2622, 3142, +0, 2687, 3138, +0, 2761, 3134, +1137, 2845, 3128, +2061, 2936, 3119, +2061, 3022, 3119, +2061, 3116, 3119, +2061, 3119, 2995, +2061, 3119, 2734, +1272, 3259, 1899, +2458, 3398, 0, +2881, 3535, 0, +3150, 3670, 0, +3363, 3805, 0, +3547, 3939, 0, +3715, 4072, 0, +3872, 4095, 0, +0, 1720, 3152, +0, 1726, 3152, +0, 1735, 3152, +0, 1746, 3151, +0, 1760, 3151, +0, 1779, 3151, +0, 1802, 3151, +0, 1832, 3151, +0, 1869, 3151, +0, 1915, 3150, +0, 1969, 3150, +0, 2033, 3149, +0, 2106, 3148, +0, 2189, 3146, +0, 2280, 3144, +0, 2379, 3142, +0, 2484, 3138, +0, 2596, 3134, +1137, 2712, 3128, +2061, 2831, 3119, +2412, 2954, 3108, +2412, 3061, 3108, +2412, 3108, 3031, +2412, 3108, 2796, +2194, 3251, 2195, +2701, 3392, 1406, +2992, 3530, 0, +3215, 3667, 0, +3405, 3802, 0, +3575, 3937, 0, +3735, 4071, 0, +3886, 4095, 0, +0, 0, 3152, +0, 0, 3152, +0, 0, 3152, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3150, +0, 0, 3150, +0, 0, 3149, +0, 0, 3148, +0, 0, 3146, +0, 0, 3144, +0, 1068, 3142, +0, 1857, 3138, +0, 2195, 3134, +1137, 2436, 3128, +2061, 2636, 3119, +2412, 2813, 3108, +2658, 2976, 3092, +2658, 3092, 3074, +2658, 3092, 2867, +2642, 3239, 2544, +2900, 3383, 2326, +3108, 3524, 1536, +3289, 3662, 0, +3455, 3799, 0, +3611, 3934, 0, +3760, 4069, 0, +3904, 4095, 0, +0, 0, 3152, +0, 0, 3152, +0, 0, 3152, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3150, +0, 0, 3150, +0, 0, 3149, +0, 0, 3148, +0, 0, 3146, +0, 0, 3144, +0, 0, 3142, +0, 0, 3138, +1211, 0, 3134, +1758, 1137, 3128, +2061, 2064, 3119, +2412, 2511, 3108, +2658, 2787, 3092, +2860, 3003, 3069, +2860, 3069, 2948, +2918, 3223, 2790, +3077, 3372, 2676, +3227, 3515, 2457, +3373, 3656, 1663, +3515, 3794, 0, +3654, 3931, 0, +3791, 4066, 0, +3927, 4095, 0, +2478, 0, 3152, +2478, 0, 3152, +2479, 0, 3152, +2480, 0, 3151, +2481, 0, 3151, +2482, 0, 3151, +2484, 0, 3151, +2487, 0, 3151, +2490, 0, 3151, +2495, 0, 3150, +2501, 0, 3150, +2509, 0, 3149, +2520, 0, 3148, +2533, 0, 3146, +2551, 0, 3144, +2573, 0, 3142, +2602, 0, 3138, +2638, 0, 3134, +2681, 1137, 3128, +2734, 2061, 3119, +2796, 2412, 3108, +2867, 2658, 3092, +2948, 2860, 3069, +3038, 3038, 3038, +3135, 3201, 2992, +3239, 3356, 2922, +3350, 3504, 2808, +3465, 3648, 2590, +3584, 3788, 1799, +3706, 3926, 0, +3830, 4063, 0, +3956, 4095, 0, +2999, 0, 3284, +2999, 0, 3283, +2999, 0, 3283, +2999, 0, 3283, +3000, 0, 3283, +3000, 0, 3283, +3001, 0, 3283, +3002, 0, 3283, +3003, 0, 3283, +3005, 0, 3282, +3006, 0, 3282, +3009, 0, 3281, +3013, 0, 3280, +3017, 0, 3280, +3023, 0, 3278, +3032, 0, 3276, +3042, 0, 3274, +3056, 0, 3270, +3074, 0, 3266, +3097, 1272, 3259, +3126, 2194, 3251, +3162, 2544, 3239, +3206, 2790, 3223, +3201, 2992, 3135, +3201, 3080, 2992, +3356, 3338, 2922, +3457, 3504, 2808, +3550, 3648, 2590, +3651, 3788, 1799, +3758, 3926, 0, +3870, 4063, 0, +3987, 4095, 0, +3294, 0, 3416, +3294, 0, 3416, +3294, 0, 3416, +3294, 0, 3416, +3295, 0, 3416, +3295, 0, 3416, +3295, 0, 3415, +3296, 0, 3415, +3296, 0, 3415, +3297, 0, 3415, +3298, 0, 3414, +3299, 0, 3414, +3301, 0, 3414, +3304, 0, 3413, +3307, 0, 3412, +3311, 0, 3410, +3317, 0, 3408, +3325, 0, 3406, +3335, 0, 3402, +3348, 0, 3398, +3365, 1406, 3392, +3383, 2326, 3380, +3372, 2676, 3325, +3356, 2922, 3239, +3356, 2922, 3051, +3356, 3132, 2922, +3504, 3426, 2808, +3644, 3648, 2590, +3728, 3788, 1799, +3820, 3926, 0, +3919, 4063, 0, +4025, 4095, 0, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3520, 0, 3548, +3520, 0, 3548, +3520, 0, 3547, +3521, 0, 3547, +3522, 0, 3547, +3523, 0, 3546, +3525, 0, 3546, +3526, 0, 3545, +3529, 0, 3544, +3533, 0, 3543, +3538, 0, 3541, +3538, 0, 3532, +3535, 0, 3516, +3530, 0, 3495, +3524, 1536, 3463, +3515, 2457, 3418, +3504, 2808, 3350, +3504, 2808, 3209, +3504, 2808, 2907, +3504, 3192, 2808, +3648, 3523, 2590, +3788, 3761, 1799, +3891, 3926, 0, +3977, 4063, 0, +4072, 4095, 0, +3680, 0, 3649, +3680, 0, 3649, +3680, 0, 3649, +3680, 0, 3649, +3680, 0, 3648, +3680, 0, 3648, +3680, 0, 3648, +3680, 0, 3648, +3680, 0, 3647, +3680, 0, 3646, +3679, 0, 3646, +3679, 0, 3644, +3679, 0, 3643, +3678, 0, 3641, +3678, 0, 3638, +3677, 0, 3634, +3676, 0, 3629, +3675, 0, 3622, +3673, 0, 3612, +3670, 0, 3599, +3667, 0, 3581, +3662, 0, 3555, +3656, 1663, 3519, +3648, 2590, 3465, +3648, 2590, 3360, +3648, 2590, 3165, +3648, 2590, 2592, +3648, 3262, 2590, +3788, 3626, 1799, +3926, 3877, 0, +4045, 4063, 0, +4095, 4095, 0, +3812, 0, 3732, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3730, +3812, 0, 3730, +3812, 0, 3729, +3812, 0, 3729, +3812, 0, 3728, +3811, 0, 3727, +3811, 0, 3725, +3810, 0, 3722, +3810, 0, 3719, +3809, 0, 3715, +3808, 0, 3709, +3807, 0, 3701, +3805, 0, 3690, +3802, 0, 3676, +3799, 0, 3655, +3794, 0, 3626, +3788, 1799, 3584, +3788, 1799, 3505, +3788, 1799, 3372, +3788, 1799, 3097, +3788, 2422, 1799, +3788, 3342, 1799, +3926, 3735, 0, +4063, 3995, 0, +4095, 4095, 0, +3944, 0, 3823, +3944, 0, 3823, +3944, 0, 3823, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3821, +3944, 0, 3820, +3944, 0, 3820, +3944, 0, 3819, +3943, 0, 3817, +3943, 0, 3815, +3943, 0, 3813, +3942, 0, 3809, +3941, 0, 3805, +3940, 0, 3798, +3939, 0, 3790, +3937, 0, 3777, +3934, 0, 3761, +3931, 0, 3738, +3926, 0, 3706, +3926, 0, 3647, +3926, 0, 3553, +3926, 0, 3388, +3926, 0, 2988, +3926, 2023, 0, +3926, 3430, 0, +4063, 3849, 0, +4095, 4095, 0, +4076, 0, 3922, +4076, 0, 3922, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3920, +4076, 0, 3919, +4076, 0, 3918, +4076, 0, 3917, +4075, 0, 3916, +4075, 0, 3913, +4075, 0, 3911, +4074, 0, 3907, +4073, 0, 3902, +4072, 0, 3895, +4071, 0, 3886, +4069, 0, 3873, +4066, 0, 3855, +4063, 0, 3830, +4063, 0, 3786, +4063, 0, 3719, +4063, 0, 3611, +4063, 0, 3409, +4063, 0, 2781, +4063, 0, 0, +4063, 3527, 0, +4095, 3968, 0, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4026, +4095, 0, 4026, +4095, 0, 4026, +4095, 0, 4025, +4095, 0, 4024, +4095, 0, 4023, +4095, 0, 4021, +4095, 0, 4019, +4095, 0, 4016, +4095, 0, 4012, +4095, 0, 4006, +4095, 0, 3999, +4095, 0, 3989, +4095, 0, 3976, +4095, 0, 3956, +4095, 0, 3923, +4095, 0, 3875, +4095, 0, 3801, +4095, 0, 3679, +4095, 0, 3436, +4095, 0, 2137, +4095, 0, 0, +4095, 3630, 0, +0, 3014, 3284, +0, 3014, 3284, +0, 3014, 3284, +0, 3015, 3284, +0, 3016, 3284, +0, 3017, 3284, +0, 3018, 3284, +0, 3020, 3284, +0, 3022, 3284, +0, 3025, 3284, +0, 3030, 3284, +0, 3035, 3284, +0, 3043, 3284, +0, 3052, 3284, +0, 3065, 3284, +0, 3081, 3284, +0, 3102, 3284, +0, 3128, 3284, +0, 3162, 3284, +0, 3203, 3284, +0, 3252, 3284, +0, 3284, 3254, +0, 3284, 3162, +0, 3284, 2999, +0, 3284, 2609, +0, 3416, 0, +0, 3548, 0, +2237, 3680, 0, +3008, 3812, 0, +3344, 3944, 0, +3584, 4076, 0, +3784, 4095, 0, +0, 3014, 3284, +0, 3014, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3017, 3283, +0, 3018, 3283, +0, 3020, 3283, +0, 3022, 3283, +0, 3025, 3283, +0, 3029, 3283, +0, 3035, 3283, +0, 3042, 3283, +0, 3052, 3283, +0, 3065, 3283, +0, 3081, 3283, +0, 3102, 3283, +0, 3128, 3283, +0, 3162, 3283, +0, 3203, 3283, +0, 3252, 3283, +0, 3283, 3254, +0, 3283, 3162, +0, 3283, 2999, +0, 3283, 2609, +0, 3416, 0, +0, 3548, 0, +2239, 3680, 0, +3009, 3812, 0, +3344, 3944, 0, +3584, 4076, 0, +3784, 4095, 0, +0, 3013, 3284, +0, 3014, 3283, +0, 3014, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3018, 3283, +0, 3019, 3283, +0, 3022, 3283, +0, 3025, 3283, +0, 3029, 3283, +0, 3035, 3283, +0, 3042, 3283, +0, 3052, 3283, +0, 3064, 3283, +0, 3081, 3283, +0, 3101, 3283, +0, 3128, 3283, +0, 3161, 3283, +0, 3202, 3283, +0, 3252, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 2999, +0, 3283, 2610, +0, 3416, 0, +0, 3548, 0, +2242, 3680, 0, +3009, 3812, 0, +3344, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3012, 3284, +0, 3013, 3283, +0, 3013, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3017, 3283, +0, 3019, 3283, +0, 3021, 3283, +0, 3025, 3283, +0, 3029, 3283, +0, 3034, 3283, +0, 3042, 3283, +0, 3051, 3283, +0, 3064, 3283, +0, 3080, 3283, +0, 3101, 3283, +0, 3128, 3283, +0, 3161, 3283, +0, 3202, 3283, +0, 3252, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 2999, +0, 3283, 2611, +0, 3416, 0, +0, 3548, 0, +2246, 3680, 0, +3010, 3812, 0, +3344, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3012, 3284, +0, 3012, 3283, +0, 3013, 3283, +0, 3013, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3018, 3283, +0, 3021, 3283, +0, 3024, 3283, +0, 3028, 3283, +0, 3034, 3283, +0, 3041, 3283, +0, 3051, 3283, +0, 3063, 3283, +0, 3080, 3283, +0, 3101, 3283, +0, 3127, 3283, +0, 3160, 3283, +0, 3201, 3283, +0, 3251, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 3000, +0, 3283, 2612, +0, 3416, 0, +0, 3548, 0, +2251, 3680, 0, +3011, 3812, 0, +3345, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3011, 3284, +0, 3011, 3283, +0, 3011, 3283, +0, 3012, 3283, +0, 3013, 3283, +0, 3014, 3283, +0, 3016, 3283, +0, 3018, 3283, +0, 3020, 3283, +0, 3023, 3283, +0, 3027, 3283, +0, 3033, 3283, +0, 3040, 3283, +0, 3050, 3283, +0, 3062, 3283, +0, 3079, 3283, +0, 3100, 3283, +0, 3127, 3283, +0, 3160, 3283, +0, 3201, 3283, +0, 3251, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 3000, +0, 3283, 2613, +0, 3416, 0, +0, 3548, 0, +2257, 3680, 0, +3012, 3812, 0, +3346, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3009, 3284, +0, 3010, 3283, +0, 3010, 3283, +0, 3011, 3283, +0, 3012, 3283, +0, 3013, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3019, 3283, +0, 3022, 3283, +0, 3026, 3283, +0, 3032, 3283, +0, 3039, 3283, +0, 3049, 3283, +0, 3062, 3283, +0, 3078, 3283, +0, 3099, 3283, +0, 3126, 3283, +0, 3159, 3283, +0, 3200, 3283, +0, 3250, 3283, +0, 3283, 3256, +0, 3283, 3164, +0, 3283, 3001, +0, 3283, 2614, +0, 3415, 0, +0, 3548, 0, +2266, 3680, 0, +3014, 3812, 0, +3346, 3944, 0, +3586, 4076, 0, +3784, 4095, 0, +0, 3008, 3284, +0, 3008, 3283, +0, 3008, 3283, +0, 3009, 3283, +0, 3010, 3283, +0, 3011, 3283, +0, 3013, 3283, +0, 3015, 3283, +0, 3017, 3283, +0, 3021, 3283, +0, 3025, 3283, +0, 3031, 3283, +0, 3038, 3283, +0, 3047, 3283, +0, 3060, 3283, +0, 3077, 3283, +0, 3098, 3283, +0, 3125, 3283, +0, 3158, 3283, +0, 3199, 3283, +0, 3249, 3283, +0, 3283, 3256, +0, 3283, 3164, +0, 3283, 3002, +0, 3283, 2616, +0, 3415, 0, +0, 3548, 0, +2277, 3680, 0, +3016, 3812, 0, +3347, 3944, 0, +3586, 4076, 0, +3785, 4095, 0, +0, 3005, 3284, +0, 3005, 3283, +0, 3006, 3283, +0, 3007, 3283, +0, 3008, 3283, +0, 3009, 3283, +0, 3010, 3283, +0, 3013, 3283, +0, 3015, 3283, +0, 3018, 3283, +0, 3023, 3283, +0, 3029, 3283, +0, 3036, 3283, +0, 3046, 3283, +0, 3059, 3283, +0, 3075, 3283, +0, 3096, 3283, +0, 3123, 3283, +0, 3157, 3283, +0, 3198, 3283, +0, 3248, 3283, +0, 3283, 3257, +0, 3283, 3165, +0, 3283, 3003, +0, 3283, 2619, +0, 3415, 0, +0, 3548, 0, +2291, 3680, 0, +3019, 3812, 0, +3349, 3944, 0, +3587, 4076, 0, +3786, 4095, 0, +0, 3002, 3284, +0, 3002, 3283, +0, 3002, 3283, +0, 3003, 3283, +0, 3004, 3283, +0, 3005, 3283, +0, 3007, 3283, +0, 3009, 3283, +0, 3012, 3283, +0, 3016, 3282, +0, 3020, 3282, +0, 3026, 3282, +0, 3033, 3282, +0, 3043, 3282, +0, 3056, 3282, +0, 3073, 3282, +0, 3094, 3282, +0, 3121, 3282, +0, 3155, 3282, +0, 3196, 3282, +0, 3247, 3282, +0, 3282, 3257, +0, 3282, 3166, +0, 3282, 3005, +0, 3282, 2622, +0, 3415, 0, +0, 3547, 0, +2310, 3680, 0, +3023, 3812, 0, +3351, 3944, 0, +3588, 4076, 0, +3786, 4095, 0, +0, 2997, 3284, +0, 2998, 3283, +0, 2998, 3283, +0, 2999, 3283, +0, 3000, 3283, +0, 3001, 3283, +0, 3003, 3283, +0, 3005, 3283, +0, 3008, 3283, +0, 3012, 3282, +0, 3017, 3282, +0, 3023, 3282, +0, 3030, 3282, +0, 3040, 3282, +0, 3053, 3282, +0, 3070, 3282, +0, 3091, 3282, +0, 3118, 3282, +0, 3152, 3282, +0, 3194, 3282, +0, 3244, 3282, +0, 3282, 3259, +0, 3282, 3168, +0, 3282, 3006, +0, 3282, 2627, +0, 3414, 0, +0, 3547, 0, +2333, 3679, 0, +3027, 3812, 0, +3353, 3944, 0, +3590, 4076, 0, +3787, 4095, 0, +0, 2991, 3284, +0, 2992, 3283, +0, 2992, 3283, +0, 2993, 3283, +0, 2994, 3283, +0, 2995, 3283, +0, 2997, 3283, +0, 2999, 3283, +0, 3002, 3283, +0, 3006, 3282, +0, 3011, 3282, +0, 3018, 3281, +0, 3025, 3281, +0, 3035, 3281, +0, 3049, 3281, +0, 3065, 3281, +0, 3087, 3281, +0, 3114, 3281, +0, 3149, 3281, +0, 3191, 3281, +0, 3242, 3281, +0, 3281, 3260, +0, 3281, 3169, +0, 3281, 3009, +0, 3281, 2633, +0, 3414, 0, +0, 3547, 0, +2363, 3679, 0, +3034, 3812, 0, +3356, 3944, 0, +3592, 4076, 0, +3788, 4095, 0, +0, 2983, 3284, +0, 2983, 3283, +0, 2984, 3283, +0, 2985, 3283, +0, 2986, 3283, +0, 2987, 3283, +0, 2988, 3283, +0, 2991, 3283, +0, 2994, 3283, +0, 2998, 3282, +0, 3003, 3282, +0, 3010, 3281, +0, 3019, 3280, +0, 3029, 3280, +0, 3043, 3280, +0, 3060, 3280, +0, 3082, 3280, +0, 3109, 3280, +0, 3144, 3280, +0, 3186, 3280, +0, 3238, 3280, +0, 3280, 3262, +0, 3280, 3172, +0, 3280, 3013, +0, 3280, 2641, +0, 3414, 0, +0, 3546, 0, +2400, 3679, 0, +3043, 3811, 0, +3361, 3944, 0, +3594, 4076, 0, +3790, 4095, 0, +0, 2972, 3284, +0, 2972, 3283, +0, 2973, 3283, +0, 2973, 3283, +0, 2974, 3283, +0, 2976, 3283, +0, 2977, 3283, +0, 2980, 3283, +0, 2983, 3283, +0, 2987, 3282, +0, 2992, 3282, +0, 2999, 3281, +0, 3009, 3280, +0, 3021, 3280, +0, 3034, 3280, +0, 3052, 3280, +0, 3074, 3280, +0, 3102, 3280, +0, 3138, 3280, +0, 3180, 3280, +0, 3233, 3280, +0, 3280, 3265, +0, 3280, 3175, +0, 3280, 3017, +0, 3280, 2651, +0, 3413, 0, +0, 3546, 0, +2445, 3678, 0, +3054, 3811, 0, +3366, 3943, 0, +3597, 4076, 0, +3792, 4095, 0, +0, 2956, 3284, +0, 2957, 3283, +0, 2957, 3283, +0, 2958, 3283, +0, 2959, 3283, +0, 2960, 3283, +0, 2962, 3283, +0, 2965, 3283, +0, 2968, 3283, +0, 2972, 3282, +0, 2977, 3282, +0, 2985, 3281, +0, 2995, 3280, +0, 3007, 3280, +0, 3024, 3278, +0, 3041, 3278, +0, 3064, 3278, +0, 3093, 3278, +0, 3129, 3278, +0, 3173, 3278, +0, 3225, 3278, +0, 3278, 3269, +0, 3278, 3180, +0, 3278, 3023, +0, 3278, 2665, +0, 3412, 0, +0, 3545, 0, +2499, 3678, 0, +3069, 3810, 0, +3374, 3943, 0, +3602, 4075, 0, +3795, 4095, 0, +0, 2935, 3284, +0, 2935, 3283, +0, 2936, 3283, +0, 2936, 3283, +0, 2938, 3283, +0, 2939, 3283, +0, 2941, 3283, +0, 2943, 3283, +0, 2947, 3283, +0, 2951, 3282, +0, 2957, 3282, +0, 2965, 3281, +0, 2975, 3280, +0, 2988, 3280, +0, 3005, 3278, +0, 3027, 3276, +0, 3050, 3276, +0, 3080, 3276, +0, 3117, 3276, +0, 3162, 3276, +0, 3216, 3276, +0, 3276, 3273, +0, 3276, 3185, +0, 3276, 3032, +0, 3276, 2683, +0, 3410, 0, +0, 3544, 0, +2562, 3677, 0, +3088, 3810, 0, +3384, 3943, 0, +3608, 4075, 0, +3799, 4095, 0, +0, 2904, 3284, +0, 2905, 3283, +0, 2905, 3283, +0, 2906, 3283, +0, 2907, 3283, +0, 2909, 3283, +0, 2911, 3283, +0, 2914, 3283, +0, 2917, 3283, +0, 2922, 3282, +0, 2928, 3282, +0, 2936, 3281, +0, 2947, 3280, +0, 2961, 3280, +0, 2979, 3278, +0, 3002, 3276, +0, 3031, 3274, +0, 3062, 3274, +0, 3100, 3274, +0, 3147, 3274, +0, 3203, 3274, +0, 3268, 3274, +0, 3274, 3193, +0, 3274, 3042, +0, 3274, 2706, +0, 3408, 0, +0, 3543, 0, +2636, 3676, 0, +3112, 3809, 0, +3396, 3942, 0, +3616, 4075, 0, +3804, 4095, 0, +0, 2860, 3284, +0, 2860, 3283, +0, 2861, 3283, +0, 2862, 3283, +0, 2863, 3283, +0, 2865, 3283, +0, 2867, 3283, +0, 2870, 3283, +0, 2874, 3283, +0, 2879, 3282, +0, 2886, 3282, +0, 2895, 3281, +0, 2907, 3280, +0, 2922, 3280, +0, 2942, 3278, +0, 2967, 3276, +0, 2998, 3274, +0, 3037, 3270, +0, 3078, 3270, +0, 3126, 3270, +0, 3184, 3270, +0, 3252, 3270, +0, 3270, 3203, +0, 3270, 3056, +0, 3270, 2734, +0, 3406, 0, +0, 3541, 0, +2718, 3675, 0, +3143, 3808, 0, +3413, 3941, 0, +3626, 4074, 0, +3811, 4095, 0, +0, 2793, 3284, +0, 2793, 3283, +0, 2794, 3283, +0, 2795, 3283, +0, 2797, 3283, +0, 2799, 3283, +0, 2801, 3283, +0, 2805, 3283, +0, 2809, 3283, +0, 2815, 3282, +0, 2823, 3282, +0, 2833, 3281, +0, 2847, 3280, +0, 2865, 3280, +0, 2886, 3278, +0, 2915, 3276, +0, 2950, 3274, +0, 2993, 3270, +0, 3045, 3266, +0, 3097, 3266, +0, 3159, 3266, +0, 3230, 3266, +0, 3266, 3216, +0, 3266, 3074, +0, 3266, 2770, +0, 3402, 0, +1477, 3538, 0, +2809, 3673, 0, +3181, 3807, 0, +3434, 3940, 0, +3640, 4073, 0, +3820, 4095, 0, +0, 2684, 3284, +0, 2685, 3283, +0, 2686, 3283, +0, 2688, 3283, +0, 2690, 3283, +0, 2692, 3283, +0, 2695, 3283, +0, 2700, 3283, +0, 2705, 3283, +0, 2713, 3282, +0, 2723, 3282, +0, 2735, 3281, +0, 2752, 3280, +0, 2773, 3280, +0, 2800, 3278, +0, 2834, 3276, +0, 2876, 3274, +0, 2926, 3270, +0, 2986, 3266, +1272, 3055, 3259, +1272, 3122, 3259, +1272, 3199, 3259, +1272, 3259, 3233, +1272, 3259, 3097, +1272, 3259, 2813, +0, 3398, 1484, +2256, 3535, 0, +2908, 3670, 0, +3227, 3805, 0, +3461, 3939, 0, +3657, 4072, 0, +3832, 4095, 0, +0, 2481, 3284, +0, 2482, 3283, +0, 2484, 3283, +0, 2486, 3283, +0, 2489, 3283, +0, 2493, 3283, +0, 2498, 3283, +0, 2504, 3283, +0, 2513, 3283, +0, 2524, 3282, +0, 2539, 3282, +0, 2558, 3281, +0, 2583, 3280, +0, 2613, 3280, +0, 2651, 3278, +0, 2698, 3276, +0, 2753, 3274, +0, 2818, 3270, +0, 2893, 3266, +1272, 2976, 3259, +2194, 3069, 3251, +2194, 3154, 3251, +2194, 3248, 3251, +2194, 3251, 3126, +2194, 3251, 2866, +1406, 3392, 2025, +2593, 3530, 0, +3014, 3667, 0, +3282, 3802, 0, +3495, 3937, 0, +3679, 4071, 0, +3847, 4095, 0, +0, 1844, 3284, +0, 1849, 3283, +0, 1856, 3283, +0, 1864, 3283, +0, 1875, 3283, +0, 1890, 3283, +0, 1908, 3283, +0, 1932, 3283, +0, 1962, 3283, +0, 1999, 3282, +0, 2045, 3282, +0, 2100, 3281, +0, 2164, 3280, +0, 2237, 3280, +0, 2320, 3278, +0, 2411, 3276, +0, 2510, 3274, +0, 2616, 3270, +0, 2727, 3266, +1272, 2843, 3259, +2194, 2963, 3251, +2544, 3085, 3239, +2544, 3193, 3239, +2544, 3239, 3162, +2544, 3239, 2928, +2328, 3383, 2326, +2833, 3524, 1536, +3125, 3662, 0, +3347, 3799, 0, +3537, 3934, 0, +3708, 4069, 0, +3867, 4095, 0, +0, 0, 3284, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3282, +0, 0, 3282, +0, 0, 3281, +0, 0, 3280, +0, 0, 3280, +0, 0, 3278, +0, 0, 3276, +0, 1202, 3274, +0, 1990, 3270, +0, 2327, 3266, +1272, 2569, 3259, +2194, 2768, 3251, +2544, 2945, 3239, +2790, 3107, 3223, +2790, 3223, 3206, +2790, 3223, 2999, +2774, 3372, 2676, +3032, 3515, 2457, +3240, 3656, 1663, +3421, 3794, 0, +3587, 3931, 0, +3743, 4066, 0, +3892, 4095, 0, +0, 0, 3284, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3282, +0, 0, 3282, +0, 0, 3281, +0, 0, 3280, +0, 0, 3280, +0, 0, 3278, +0, 0, 3276, +0, 0, 3274, +0, 0, 3270, +1375, 0, 3266, +1899, 1272, 3259, +2195, 2194, 3251, +2544, 2642, 3239, +2790, 2918, 3223, +2992, 3135, 3201, +2992, 3201, 3080, +3051, 3356, 2922, +3209, 3504, 2808, +3360, 3648, 2590, +3505, 3788, 1799, +3647, 3926, 0, +3786, 4063, 0, +3923, 4095, 0, +2609, 0, 3284, +2609, 0, 3283, +2610, 0, 3283, +2611, 0, 3283, +2612, 0, 3283, +2613, 0, 3283, +2614, 0, 3283, +2616, 0, 3283, +2619, 0, 3283, +2622, 0, 3282, +2627, 0, 3282, +2633, 0, 3281, +2641, 0, 3280, +2651, 0, 3280, +2665, 0, 3278, +2683, 0, 3276, +2706, 0, 3274, +2734, 0, 3270, +2770, 0, 3266, +2813, 1272, 3259, +2866, 2194, 3251, +2928, 2544, 3239, +2999, 2790, 3223, +3080, 2992, 3201, +3170, 3170, 3170, +3267, 3333, 3124, +3372, 3488, 3054, +3482, 3636, 2940, +3597, 3780, 2721, +3716, 3920, 1928, +3838, 4058, 0, +3962, 4095, 0, +3132, 0, 3416, +3132, 0, 3416, +3132, 0, 3416, +3132, 0, 3416, +3132, 0, 3416, +3133, 0, 3416, +3133, 0, 3415, +3134, 0, 3415, +3135, 0, 3415, +3136, 0, 3415, +3137, 0, 3414, +3139, 0, 3414, +3142, 0, 3414, +3145, 0, 3413, +3150, 0, 3412, +3156, 0, 3410, +3164, 0, 3408, +3175, 0, 3406, +3189, 0, 3402, +3206, 0, 3398, +3230, 1406, 3392, +3258, 2326, 3383, +3294, 2676, 3372, +3338, 2922, 3356, +3333, 3124, 3267, +3333, 3212, 3124, +3488, 3470, 3054, +3589, 3636, 2940, +3682, 3780, 2721, +3783, 3920, 1928, +3890, 4058, 0, +4002, 4095, 0, +3426, 0, 3548, +3426, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3428, 0, 3548, +3428, 0, 3548, +3429, 0, 3547, +3429, 0, 3547, +3430, 0, 3547, +3432, 0, 3546, +3434, 0, 3546, +3436, 0, 3545, +3440, 0, 3544, +3444, 0, 3543, +3450, 0, 3541, +3457, 0, 3538, +3467, 0, 3535, +3480, 0, 3530, +3497, 1536, 3524, +3515, 2457, 3512, +3504, 2808, 3457, +3488, 3054, 3372, +3488, 3054, 3183, +3488, 3264, 3054, +3636, 3558, 2940, +3776, 3780, 2721, +3860, 3920, 1928, +3952, 4058, 0, +4051, 4095, 0, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3652, 0, 3680, +3652, 0, 3680, +3652, 0, 3680, +3653, 0, 3679, +3653, 0, 3679, +3654, 0, 3679, +3655, 0, 3678, +3657, 0, 3678, +3659, 0, 3677, +3662, 0, 3676, +3665, 0, 3675, +3670, 0, 3673, +3670, 0, 3664, +3667, 0, 3648, +3662, 0, 3626, +3656, 1663, 3595, +3648, 2590, 3550, +3636, 2940, 3482, +3636, 2940, 3341, +3636, 2940, 3038, +3636, 3324, 2940, +3780, 3655, 2721, +3920, 3893, 1928, +4023, 4058, 0, +4095, 4095, 0, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3780, +3812, 0, 3780, +3812, 0, 3779, +3812, 0, 3778, +3812, 0, 3777, +3811, 0, 3777, +3811, 0, 3775, +3810, 0, 3773, +3810, 0, 3770, +3809, 0, 3766, +3808, 0, 3761, +3807, 0, 3754, +3805, 0, 3744, +3802, 0, 3731, +3799, 0, 3713, +3794, 0, 3687, +3788, 1799, 3651, +3780, 2721, 3597, +3780, 2721, 3492, +3780, 2721, 3296, +3780, 2721, 2722, +3780, 3394, 2721, +3920, 3758, 1928, +4058, 4008, 0, +4095, 4095, 0, +3944, 0, 3864, +3944, 0, 3864, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3862, +3944, 0, 3862, +3944, 0, 3861, +3944, 0, 3860, +3943, 0, 3859, +3943, 0, 3857, +3943, 0, 3854, +3942, 0, 3851, +3941, 0, 3847, +3940, 0, 3841, +3939, 0, 3833, +3937, 0, 3822, +3934, 0, 3808, +3931, 0, 3787, +3926, 0, 3758, +3920, 1928, 3716, +3920, 1928, 3637, +3920, 1928, 3504, +3920, 1928, 3229, +3920, 2556, 1928, +3920, 3474, 1928, +4058, 3867, 0, +4095, 4095, 0, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3954, +4076, 0, 3954, +4076, 0, 3954, +4076, 0, 3954, +4076, 0, 3953, +4076, 0, 3953, +4076, 0, 3953, +4076, 0, 3952, +4076, 0, 3950, +4075, 0, 3949, +4075, 0, 3947, +4075, 0, 3945, +4074, 0, 3941, +4073, 0, 3937, +4072, 0, 3930, +4071, 0, 3921, +4069, 0, 3910, +4066, 0, 3893, +4063, 0, 3870, +4058, 0, 3838, +4058, 0, 3779, +4058, 0, 3685, +4058, 0, 3520, +4058, 0, 3119, +4058, 2157, 0, +4058, 3562, 0, +4095, 3982, 0, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4053, +4095, 0, 4053, +4095, 0, 4053, +4095, 0, 4053, +4095, 0, 4052, +4095, 0, 4051, +4095, 0, 4051, +4095, 0, 4049, +4095, 0, 4048, +4095, 0, 4046, +4095, 0, 4043, +4095, 0, 4039, +4095, 0, 4034, +4095, 0, 4027, +4095, 0, 4018, +4095, 0, 4005, +4095, 0, 3987, +4095, 0, 3962, +4095, 0, 3918, +4095, 0, 3851, +4095, 0, 3743, +4095, 0, 3541, +4095, 0, 2915, +4095, 0, 0, +4095, 3659, 0, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3152, 3416, +0, 3155, 3416, +0, 3158, 3416, +0, 3162, 3416, +0, 3168, 3416, +0, 3175, 3416, +0, 3184, 3416, +0, 3197, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3261, 3416, +0, 3294, 3416, +0, 3335, 3416, +0, 3385, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2741, +0, 3548, 0, +0, 3680, 0, +2367, 3812, 0, +3140, 3944, 0, +3475, 4076, 0, +3716, 4095, 0, +0, 3146, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3152, 3416, +0, 3154, 3416, +0, 3158, 3416, +0, 3162, 3416, +0, 3168, 3416, +0, 3175, 3416, +0, 3184, 3416, +0, 3197, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3261, 3416, +0, 3294, 3416, +0, 3335, 3416, +0, 3385, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2741, +0, 3548, 0, +0, 3680, 0, +2369, 3812, 0, +3140, 3944, 0, +3475, 4076, 0, +3717, 4095, 0, +0, 3145, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3150, 3416, +0, 3152, 3416, +0, 3154, 3416, +0, 3157, 3416, +0, 3162, 3416, +0, 3167, 3416, +0, 3175, 3416, +0, 3184, 3416, +0, 3197, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3260, 3416, +0, 3294, 3416, +0, 3335, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2742, +0, 3548, 0, +0, 3680, 0, +2371, 3812, 0, +3140, 3944, 0, +3476, 4076, 0, +3717, 4095, 0, +0, 3145, 3416, +0, 3145, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3150, 3416, +0, 3151, 3416, +0, 3154, 3416, +0, 3157, 3416, +0, 3161, 3416, +0, 3167, 3416, +0, 3174, 3416, +0, 3184, 3416, +0, 3196, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3260, 3416, +0, 3293, 3416, +0, 3335, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2742, +0, 3548, 0, +0, 3680, 0, +2374, 3812, 0, +3141, 3944, 0, +3476, 4076, 0, +3717, 4095, 0, +0, 3144, 3416, +0, 3145, 3416, +0, 3145, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3154, 3416, +0, 3157, 3416, +0, 3161, 3416, +0, 3166, 3416, +0, 3174, 3416, +0, 3184, 3416, +0, 3196, 3416, +0, 3212, 3416, +0, 3233, 3416, +0, 3260, 3416, +0, 3293, 3416, +0, 3334, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3295, +0, 3416, 3132, +0, 3416, 2743, +0, 3548, 0, +0, 3680, 0, +2377, 3812, 0, +3142, 3944, 0, +3476, 4076, 0, +3717, 4095, 0, +0, 3144, 3416, +0, 3144, 3416, +0, 3144, 3416, +0, 3145, 3416, +0, 3145, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3153, 3416, +0, 3156, 3416, +0, 3160, 3416, +0, 3166, 3416, +0, 3173, 3416, +0, 3183, 3416, +0, 3196, 3416, +0, 3212, 3416, +0, 3233, 3416, +0, 3259, 3416, +0, 3293, 3416, +0, 3334, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3295, +0, 3416, 3133, +0, 3416, 2744, +0, 3548, 0, +0, 3680, 0, +2382, 3812, 0, +3143, 3944, 0, +3477, 4076, 0, +3717, 4095, 0, +0, 3143, 3416, +0, 3143, 3416, +0, 3143, 3416, +0, 3144, 3416, +0, 3144, 3416, +0, 3145, 3416, +0, 3147, 3415, +0, 3148, 3415, +0, 3150, 3415, +0, 3152, 3415, +0, 3155, 3415, +0, 3160, 3415, +0, 3165, 3415, +0, 3173, 3415, +0, 3182, 3415, +0, 3195, 3415, +0, 3211, 3415, +0, 3232, 3415, +0, 3259, 3415, +0, 3292, 3415, +0, 3333, 3415, +0, 3383, 3415, +0, 3415, 3387, +0, 3415, 3295, +0, 3415, 3133, +0, 3415, 2745, +0, 3548, 0, +0, 3680, 0, +2389, 3812, 0, +3144, 3944, 0, +3477, 4076, 0, +3718, 4095, 0, +0, 3141, 3416, +0, 3141, 3416, +0, 3142, 3416, +0, 3142, 3416, +0, 3143, 3416, +0, 3144, 3416, +0, 3145, 3415, +0, 3147, 3415, +0, 3149, 3415, +0, 3151, 3415, +0, 3154, 3415, +0, 3158, 3415, +0, 3164, 3415, +0, 3171, 3415, +0, 3181, 3415, +0, 3194, 3415, +0, 3210, 3415, +0, 3231, 3415, +0, 3258, 3415, +0, 3291, 3415, +0, 3333, 3415, +0, 3382, 3415, +0, 3415, 3388, +0, 3415, 3296, +0, 3415, 3134, +0, 3415, 2746, +0, 3548, 0, +0, 3680, 0, +2397, 3812, 0, +3145, 3944, 0, +3478, 4076, 0, +3718, 4095, 0, +0, 3139, 3416, +0, 3140, 3416, +0, 3140, 3416, +0, 3141, 3416, +0, 3141, 3416, +0, 3142, 3416, +0, 3144, 3415, +0, 3145, 3415, +0, 3147, 3415, +0, 3150, 3415, +0, 3153, 3415, +0, 3157, 3415, +0, 3163, 3415, +0, 3170, 3415, +0, 3180, 3415, +0, 3192, 3415, +0, 3209, 3415, +0, 3230, 3415, +0, 3257, 3415, +0, 3290, 3415, +0, 3331, 3415, +0, 3381, 3415, +0, 3415, 3388, +0, 3415, 3296, +0, 3415, 3135, +0, 3415, 2748, +0, 3548, 0, +0, 3680, 0, +2408, 3812, 0, +3147, 3944, 0, +3479, 4076, 0, +3719, 4095, 0, +0, 3137, 3416, +0, 3137, 3416, +0, 3138, 3416, +0, 3138, 3416, +0, 3139, 3416, +0, 3140, 3416, +0, 3141, 3415, +0, 3143, 3415, +0, 3145, 3415, +0, 3147, 3415, +0, 3151, 3415, +0, 3155, 3415, +0, 3161, 3415, +0, 3168, 3415, +0, 3178, 3415, +0, 3191, 3415, +0, 3207, 3415, +0, 3228, 3415, +0, 3255, 3415, +0, 3289, 3415, +0, 3330, 3415, +0, 3380, 3415, +0, 3415, 3389, +0, 3415, 3297, +0, 3415, 3136, +0, 3415, 2751, +0, 3547, 0, +0, 3680, 0, +2422, 3812, 0, +3151, 3944, 0, +3480, 4076, 0, +3720, 4095, 0, +0, 3134, 3416, +0, 3134, 3416, +0, 3134, 3416, +0, 3135, 3416, +0, 3135, 3416, +0, 3136, 3416, +0, 3138, 3415, +0, 3139, 3415, +0, 3141, 3415, +0, 3144, 3415, +0, 3148, 3414, +0, 3152, 3414, +0, 3158, 3414, +0, 3165, 3414, +0, 3175, 3414, +0, 3188, 3414, +0, 3205, 3414, +0, 3226, 3414, +0, 3253, 3414, +0, 3287, 3414, +0, 3329, 3414, +0, 3379, 3414, +0, 3414, 3390, +0, 3414, 3298, +0, 3414, 3137, +0, 3414, 2754, +0, 3547, 0, +0, 3679, 0, +2441, 3812, 0, +3154, 3944, 0, +3482, 4076, 0, +3721, 4095, 0, +0, 3129, 3416, +0, 3129, 3416, +0, 3130, 3416, +0, 3130, 3416, +0, 3131, 3416, +0, 3132, 3416, +0, 3133, 3415, +0, 3135, 3415, +0, 3137, 3415, +0, 3140, 3415, +0, 3144, 3414, +0, 3149, 3414, +0, 3155, 3414, +0, 3162, 3414, +0, 3172, 3414, +0, 3185, 3414, +0, 3202, 3414, +0, 3223, 3414, +0, 3250, 3414, +0, 3284, 3414, +0, 3326, 3414, +0, 3376, 3414, +0, 3414, 3391, +0, 3414, 3299, +0, 3414, 3139, +0, 3414, 2759, +0, 3547, 0, +0, 3679, 0, +2465, 3812, 0, +3159, 3944, 0, +3485, 4076, 0, +3722, 4095, 0, +0, 3123, 3416, +0, 3123, 3416, +0, 3124, 3416, +0, 3124, 3416, +0, 3125, 3416, +0, 3126, 3416, +0, 3127, 3415, +0, 3129, 3415, +0, 3131, 3415, +0, 3134, 3415, +0, 3138, 3414, +0, 3143, 3414, +0, 3150, 3414, +0, 3158, 3414, +0, 3168, 3414, +0, 3181, 3414, +0, 3198, 3414, +0, 3219, 3414, +0, 3247, 3414, +0, 3281, 3414, +0, 3323, 3414, +0, 3374, 3414, +0, 3414, 3393, +0, 3414, 3301, +0, 3414, 3142, +0, 3414, 2765, +0, 3546, 0, +0, 3679, 0, +2494, 3811, 0, +3166, 3944, 0, +3488, 4076, 0, +3724, 4095, 0, +0, 3115, 3416, +0, 3115, 3416, +0, 3115, 3416, +0, 3116, 3416, +0, 3117, 3416, +0, 3118, 3416, +0, 3119, 3415, +0, 3121, 3415, +0, 3123, 3415, +0, 3126, 3415, +0, 3130, 3414, +0, 3135, 3414, +0, 3142, 3414, +0, 3151, 3413, +0, 3162, 3413, +0, 3175, 3413, +0, 3192, 3413, +0, 3214, 3413, +0, 3242, 3413, +0, 3276, 3413, +0, 3319, 3413, +0, 3370, 3413, +0, 3413, 3395, +0, 3413, 3304, +0, 3413, 3145, +0, 3413, 2773, +0, 3546, 0, +0, 3678, 0, +2531, 3811, 0, +3175, 3943, 0, +3492, 4076, 0, +3727, 4095, 0, +0, 3104, 3416, +0, 3104, 3416, +0, 3104, 3416, +0, 3105, 3416, +0, 3106, 3416, +0, 3106, 3416, +0, 3108, 3415, +0, 3110, 3415, +0, 3112, 3415, +0, 3115, 3415, +0, 3119, 3414, +0, 3125, 3414, +0, 3132, 3414, +0, 3141, 3413, +0, 3154, 3412, +0, 3167, 3412, +0, 3184, 3412, +0, 3206, 3412, +0, 3234, 3412, +0, 3270, 3412, +0, 3313, 3412, +0, 3365, 3412, +0, 3412, 3397, +0, 3412, 3307, +0, 3412, 3150, +0, 3412, 2784, +0, 3545, 0, +0, 3678, 0, +2576, 3810, 0, +3186, 3943, 0, +3498, 4075, 0, +3730, 4095, 0, +0, 3088, 3416, +0, 3088, 3416, +0, 3089, 3416, +0, 3089, 3416, +0, 3090, 3416, +0, 3091, 3416, +0, 3093, 3415, +0, 3094, 3415, +0, 3097, 3415, +0, 3100, 3415, +0, 3104, 3414, +0, 3110, 3414, +0, 3117, 3414, +0, 3127, 3413, +0, 3140, 3412, +0, 3156, 3410, +0, 3174, 3410, +0, 3196, 3410, +0, 3225, 3410, +0, 3261, 3410, +0, 3305, 3410, +0, 3358, 3410, +0, 3410, 3401, +0, 3410, 3311, +0, 3410, 3156, +0, 3410, 2797, +0, 3544, 0, +0, 3677, 0, +2631, 3810, 0, +3201, 3943, 0, +3505, 4075, 0, +3735, 4095, 0, +0, 3067, 3416, +0, 3067, 3416, +0, 3067, 3416, +0, 3068, 3416, +0, 3069, 3416, +0, 3070, 3416, +0, 3071, 3415, +0, 3073, 3415, +0, 3076, 3415, +0, 3079, 3415, +0, 3083, 3414, +0, 3089, 3414, +0, 3097, 3414, +0, 3107, 3413, +0, 3120, 3412, +0, 3137, 3410, +0, 3159, 3408, +0, 3183, 3408, +0, 3212, 3408, +0, 3249, 3408, +0, 3294, 3408, +0, 3348, 3408, +0, 3408, 3406, +0, 3408, 3317, +0, 3408, 3164, +0, 3408, 2815, +0, 3543, 0, +0, 3676, 0, +2694, 3809, 0, +3220, 3942, 0, +3515, 4075, 0, +3741, 4095, 0, +0, 3036, 3416, +0, 3036, 3416, +0, 3037, 3416, +0, 3038, 3416, +0, 3038, 3416, +0, 3039, 3416, +0, 3041, 3415, +0, 3043, 3415, +0, 3046, 3415, +0, 3049, 3415, +0, 3054, 3414, +0, 3060, 3414, +0, 3069, 3414, +0, 3079, 3413, +0, 3093, 3412, +0, 3111, 3410, +0, 3134, 3408, +0, 3164, 3406, +0, 3194, 3406, +0, 3233, 3406, +0, 3279, 3406, +0, 3335, 3406, +0, 3400, 3406, +0, 3406, 3325, +0, 3406, 3175, +0, 3406, 2838, +0, 3541, 0, +0, 3675, 0, +2767, 3808, 0, +3244, 3941, 0, +3528, 4074, 0, +3748, 4095, 0, +0, 2992, 3416, +0, 2992, 3416, +0, 2992, 3416, +0, 2993, 3416, +0, 2994, 3416, +0, 2996, 3416, +0, 2997, 3415, +0, 2999, 3415, +0, 3002, 3415, +0, 3006, 3415, +0, 3011, 3414, +0, 3018, 3414, +0, 3027, 3414, +0, 3039, 3413, +0, 3055, 3412, +0, 3074, 3410, +0, 3099, 3408, +0, 3131, 3406, +0, 3170, 3402, +0, 3210, 3402, +0, 3259, 3402, +0, 3317, 3402, +0, 3384, 3402, +0, 3402, 3335, +0, 3402, 3189, +0, 3402, 2866, +0, 3538, 0, +0, 3673, 0, +2850, 3807, 0, +3275, 3940, 0, +3545, 4073, 0, +3759, 4095, 0, +0, 2925, 3416, +0, 2925, 3416, +0, 2926, 3416, +0, 2927, 3416, +0, 2928, 3416, +0, 2929, 3416, +0, 2931, 3415, +0, 2934, 3415, +0, 2937, 3415, +0, 2942, 3415, +0, 2947, 3414, +0, 2956, 3414, +0, 2966, 3414, +0, 2979, 3413, +0, 2997, 3412, +0, 3019, 3410, +0, 3047, 3408, +0, 3082, 3406, +0, 3125, 3402, +0, 3177, 3398, +0, 3230, 3398, +0, 3291, 3398, +0, 3362, 3398, +0, 3398, 3348, +0, 3398, 3206, +0, 3398, 2902, +0, 3535, 0, +1603, 3670, 0, +2941, 3805, 0, +3313, 3939, 0, +3566, 4072, 0, +3772, 4095, 0, +0, 2816, 3416, +0, 2817, 3416, +0, 2817, 3416, +0, 2818, 3416, +0, 2820, 3416, +0, 2822, 3416, +0, 2824, 3415, +0, 2827, 3415, +0, 2832, 3415, +0, 2837, 3415, +0, 2845, 3414, +0, 2855, 3414, +0, 2867, 3414, +0, 2884, 3413, +0, 2906, 3412, +0, 2933, 3410, +0, 2966, 3408, +0, 3008, 3406, +0, 3059, 3402, +0, 3118, 3398, +1406, 3187, 3392, +1406, 3255, 3392, +1406, 3331, 3392, +1406, 3392, 3365, +1406, 3392, 3230, +1406, 3392, 2945, +0, 3530, 1621, +2388, 3667, 0, +3040, 3802, 0, +3359, 3937, 0, +3593, 4071, 0, +3790, 4095, 0, +0, 2613, 3416, +0, 2614, 3416, +0, 2615, 3416, +0, 2617, 3416, +0, 2619, 3416, +0, 2621, 3416, +0, 2625, 3415, +0, 2630, 3415, +0, 2637, 3415, +0, 2646, 3415, +0, 2657, 3414, +0, 2672, 3414, +0, 2691, 3414, +0, 2715, 3413, +0, 2746, 3412, +0, 2784, 3410, +0, 2830, 3408, +0, 2886, 3406, +0, 2951, 3402, +0, 3025, 3398, +1406, 3108, 3392, +2326, 3201, 3383, +2326, 3286, 3383, +2326, 3380, 3383, +2326, 3383, 3258, +2326, 3383, 2998, +1536, 3524, 2158, +2724, 3662, 0, +3145, 3799, 0, +3414, 3934, 0, +3627, 4069, 0, +3812, 4095, 0, +0, 1977, 3416, +0, 1981, 3416, +0, 1986, 3416, +0, 1992, 3416, +0, 2000, 3416, +0, 2011, 3416, +0, 2026, 3415, +0, 2044, 3415, +0, 2068, 3415, +0, 2098, 3415, +0, 2135, 3414, +0, 2180, 3414, +0, 2234, 3414, +0, 2298, 3413, +0, 2371, 3412, +0, 2453, 3410, +0, 2545, 3408, +0, 2643, 3406, +0, 2749, 3402, +0, 2860, 3398, +1406, 2976, 3392, +2326, 3095, 3383, +2676, 3218, 3372, +2676, 3325, 3372, +2676, 3372, 3294, +2676, 3372, 3060, +2459, 3515, 2457, +2965, 3656, 1663, +3256, 3794, 0, +3479, 3931, 0, +3669, 4066, 0, +3840, 4095, 0, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3414, +0, 0, 3414, +0, 0, 3414, +0, 0, 3413, +0, 0, 3412, +0, 0, 3410, +0, 0, 3408, +0, 1325, 3406, +0, 2121, 3402, +0, 2458, 3398, +1406, 2701, 3392, +2326, 2900, 3383, +2676, 3077, 3372, +2922, 3239, 3356, +2922, 3356, 3338, +2922, 3356, 3132, +2907, 3504, 2808, +3165, 3648, 2590, +3372, 3788, 1799, +3553, 3926, 0, +3719, 4063, 0, +3875, 4095, 0, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3414, +0, 0, 3414, +0, 0, 3414, +0, 0, 3413, +0, 0, 3412, +0, 0, 3410, +0, 0, 3408, +0, 0, 3406, +0, 0, 3402, +1484, 0, 3398, +2025, 1406, 3392, +2326, 2328, 3383, +2676, 2774, 3372, +2922, 3051, 3356, +3124, 3267, 3333, +3124, 3333, 3212, +3183, 3488, 3054, +3341, 3636, 2940, +3492, 3780, 2721, +3637, 3920, 1928, +3779, 4058, 0, +3918, 4095, 0, +2741, 0, 3416, +2741, 0, 3416, +2742, 0, 3416, +2742, 0, 3416, +2743, 0, 3416, +2744, 0, 3416, +2745, 0, 3415, +2746, 0, 3415, +2748, 0, 3415, +2751, 0, 3415, +2754, 0, 3414, +2759, 0, 3414, +2765, 0, 3414, +2773, 0, 3413, +2784, 0, 3412, +2797, 0, 3410, +2815, 0, 3408, +2838, 0, 3406, +2866, 0, 3402, +2902, 0, 3398, +2945, 1406, 3392, +2998, 2326, 3383, +3060, 2676, 3372, +3132, 2922, 3356, +3212, 3124, 3333, +3302, 3302, 3302, +3399, 3466, 3256, +3504, 3620, 3186, +3614, 3768, 3072, +3729, 3912, 2854, +3848, 4052, 2063, +3970, 4095, 0, +3264, 0, 3548, +3264, 0, 3548, +3264, 0, 3548, +3264, 0, 3548, +3264, 0, 3548, +3265, 0, 3548, +3265, 0, 3548, +3265, 0, 3548, +3266, 0, 3548, +3267, 0, 3547, +3268, 0, 3547, +3269, 0, 3547, +3271, 0, 3546, +3274, 0, 3546, +3278, 0, 3545, +3282, 0, 3544, +3288, 0, 3543, +3296, 0, 3541, +3307, 0, 3538, +3321, 0, 3535, +3339, 0, 3530, +3362, 1536, 3524, +3391, 2457, 3515, +3426, 2808, 3504, +3470, 3054, 3488, +3466, 3256, 3399, +3466, 3344, 3256, +3620, 3603, 3186, +3721, 3768, 3072, +3814, 3912, 2854, +3915, 4052, 2063, +4022, 4095, 0, +3558, 0, 3680, +3558, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3560, 0, 3680, +3560, 0, 3680, +3561, 0, 3679, +3562, 0, 3679, +3563, 0, 3679, +3564, 0, 3678, +3566, 0, 3678, +3568, 0, 3677, +3572, 0, 3676, +3576, 0, 3675, +3582, 0, 3673, +3589, 0, 3670, +3599, 0, 3667, +3612, 0, 3662, +3629, 1663, 3656, +3648, 2590, 3644, +3636, 2940, 3589, +3620, 3186, 3504, +3620, 3186, 3315, +3620, 3396, 3186, +3768, 3691, 3072, +3908, 3912, 2854, +3992, 4052, 2063, +4084, 4095, 0, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3784, 0, 3812, +3784, 0, 3812, +3784, 0, 3812, +3784, 0, 3812, +3785, 0, 3812, +3785, 0, 3811, +3786, 0, 3811, +3787, 0, 3810, +3789, 0, 3810, +3791, 0, 3809, +3794, 0, 3808, +3797, 0, 3807, +3802, 0, 3805, +3802, 0, 3796, +3799, 0, 3781, +3794, 0, 3759, +3788, 1799, 3728, +3780, 2721, 3682, +3768, 3072, 3614, +3768, 3072, 3473, +3768, 3072, 3171, +3768, 3456, 3072, +3912, 3787, 2854, +4052, 4025, 2063, +4095, 4095, 0, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3912, +3944, 0, 3912, +3944, 0, 3912, +3944, 0, 3911, +3944, 0, 3910, +3944, 0, 3910, +3943, 0, 3909, +3943, 0, 3907, +3943, 0, 3905, +3942, 0, 3902, +3941, 0, 3898, +3940, 0, 3893, +3939, 0, 3886, +3937, 0, 3876, +3934, 0, 3863, +3931, 0, 3845, +3926, 0, 3820, +3920, 1928, 3783, +3912, 2854, 3729, +3912, 2854, 3624, +3912, 2854, 3428, +3912, 2854, 2854, +3912, 3526, 2854, +4052, 3890, 2063, +4095, 4095, 0, +4076, 0, 3996, +4076, 0, 3996, +4076, 0, 3996, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3994, +4076, 0, 3994, +4076, 0, 3993, +4076, 0, 3992, +4075, 0, 3991, +4075, 0, 3989, +4075, 0, 3986, +4074, 0, 3983, +4073, 0, 3979, +4072, 0, 3973, +4071, 0, 3965, +4069, 0, 3954, +4066, 0, 3940, +4063, 0, 3919, +4058, 0, 3890, +4052, 2063, 3848, +4052, 2063, 3769, +4052, 2063, 3636, +4052, 2063, 3361, +4052, 2689, 2063, +4052, 3606, 2063, +4095, 4000, 0, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4086, +4095, 0, 4086, +4095, 0, 4086, +4095, 0, 4085, +4095, 0, 4085, +4095, 0, 4084, +4095, 0, 4083, +4095, 0, 4082, +4095, 0, 4080, +4095, 0, 4077, +4095, 0, 4073, +4095, 0, 4069, +4095, 0, 4062, +4095, 0, 4054, +4095, 0, 4042, +4095, 0, 4025, +4095, 0, 4002, +4095, 0, 3970, +4095, 0, 3911, +4095, 0, 3818, +4095, 0, 3653, +4095, 0, 3253, +4095, 2266, 0, +4095, 3695, 0, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3285, 3548, +0, 3287, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3300, 3548, +0, 3307, 3548, +0, 3317, 3548, +0, 3329, 3548, +0, 3346, 3548, +0, 3367, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3426, +0, 3548, 3264, +0, 3548, 2873, +0, 3680, 0, +0, 3812, 0, +2497, 3944, 0, +3271, 4076, 0, +3608, 4095, 0, +0, 3278, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3284, 3548, +0, 3287, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3300, 3548, +0, 3307, 3548, +0, 3317, 3548, +0, 3329, 3548, +0, 3346, 3548, +0, 3367, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3426, +0, 3548, 3264, +0, 3548, 2873, +0, 3680, 0, +0, 3812, 0, +2498, 3944, 0, +3272, 4076, 0, +3608, 4095, 0, +0, 3278, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3287, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3300, 3548, +0, 3307, 3548, +0, 3317, 3548, +0, 3329, 3548, +0, 3346, 3548, +0, 3366, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3264, +0, 3548, 2873, +0, 3680, 0, +0, 3812, 0, +2500, 3944, 0, +3272, 4076, 0, +3608, 4095, 0, +0, 3277, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3286, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3299, 3548, +0, 3307, 3548, +0, 3316, 3548, +0, 3329, 3548, +0, 3345, 3548, +0, 3366, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3264, +0, 3548, 2874, +0, 3680, 0, +0, 3812, 0, +2502, 3944, 0, +3272, 4076, 0, +3608, 4095, 0, +0, 3277, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3286, 3548, +0, 3289, 3548, +0, 3293, 3548, +0, 3299, 3548, +0, 3307, 3548, +0, 3316, 3548, +0, 3329, 3548, +0, 3345, 3548, +0, 3366, 3548, +0, 3392, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3264, +0, 3548, 2874, +0, 3680, 0, +0, 3812, 0, +2505, 3944, 0, +3273, 4076, 0, +3608, 4095, 0, +0, 3276, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3286, 3548, +0, 3289, 3548, +0, 3293, 3548, +0, 3299, 3548, +0, 3306, 3548, +0, 3316, 3548, +0, 3328, 3548, +0, 3344, 3548, +0, 3365, 3548, +0, 3392, 3548, +0, 3425, 3548, +0, 3466, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3265, +0, 3548, 2875, +0, 3680, 0, +0, 3812, 0, +2508, 3944, 0, +3273, 4076, 0, +3609, 4095, 0, +0, 3276, 3548, +0, 3276, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3285, 3548, +0, 3288, 3548, +0, 3292, 3548, +0, 3298, 3548, +0, 3305, 3548, +0, 3315, 3548, +0, 3328, 3548, +0, 3344, 3548, +0, 3365, 3548, +0, 3392, 3548, +0, 3425, 3548, +0, 3466, 3548, +0, 3515, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3265, +0, 3548, 2876, +0, 3680, 0, +0, 3812, 0, +2513, 3944, 0, +3274, 4076, 0, +3609, 4095, 0, +0, 3275, 3548, +0, 3275, 3548, +0, 3275, 3548, +0, 3275, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3287, 3548, +0, 3292, 3548, +0, 3297, 3548, +0, 3305, 3548, +0, 3314, 3548, +0, 3327, 3548, +0, 3343, 3548, +0, 3364, 3548, +0, 3391, 3548, +0, 3424, 3548, +0, 3466, 3548, +0, 3515, 3548, +0, 3548, 3520, +0, 3548, 3428, +0, 3548, 3265, +0, 3548, 2877, +0, 3680, 0, +0, 3812, 0, +2520, 3944, 0, +3276, 4076, 0, +3610, 4095, 0, +0, 3273, 3548, +0, 3273, 3548, +0, 3274, 3548, +0, 3274, 3548, +0, 3275, 3548, +0, 3275, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3279, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3286, 3548, +0, 3291, 3548, +0, 3296, 3548, +0, 3303, 3548, +0, 3313, 3548, +0, 3326, 3548, +0, 3342, 3548, +0, 3363, 3548, +0, 3390, 3548, +0, 3423, 3548, +0, 3465, 3548, +0, 3514, 3548, +0, 3548, 3520, +0, 3548, 3428, +0, 3548, 3266, +0, 3548, 2878, +0, 3680, 0, +0, 3812, 0, +2528, 3944, 0, +3277, 4076, 0, +3611, 4095, 0, +0, 3271, 3548, +0, 3272, 3548, +0, 3272, 3548, +0, 3272, 3548, +0, 3273, 3548, +0, 3273, 3548, +0, 3274, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3279, 3547, +0, 3282, 3547, +0, 3285, 3547, +0, 3289, 3547, +0, 3295, 3547, +0, 3302, 3547, +0, 3312, 3547, +0, 3325, 3547, +0, 3341, 3547, +0, 3362, 3547, +0, 3389, 3547, +0, 3422, 3547, +0, 3464, 3547, +0, 3513, 3547, +0, 3547, 3520, +0, 3547, 3429, +0, 3547, 3267, +0, 3547, 2880, +0, 3680, 0, +0, 3812, 0, +2539, 3944, 0, +3279, 4076, 0, +3612, 4095, 0, +0, 3269, 3548, +0, 3269, 3548, +0, 3269, 3548, +0, 3270, 3548, +0, 3270, 3548, +0, 3271, 3548, +0, 3272, 3548, +0, 3273, 3548, +0, 3275, 3548, +0, 3277, 3547, +0, 3280, 3547, +0, 3283, 3547, +0, 3287, 3547, +0, 3293, 3547, +0, 3300, 3547, +0, 3310, 3547, +0, 3323, 3547, +0, 3339, 3547, +0, 3361, 3547, +0, 3387, 3547, +0, 3421, 3547, +0, 3462, 3547, +0, 3512, 3547, +0, 3547, 3521, +0, 3547, 3429, +0, 3547, 3268, +0, 3547, 2883, +0, 3679, 0, +0, 3812, 0, +2553, 3944, 0, +3282, 4076, 0, +3613, 4095, 0, +0, 3266, 3548, +0, 3266, 3548, +0, 3266, 3548, +0, 3267, 3548, +0, 3267, 3548, +0, 3268, 3548, +0, 3269, 3548, +0, 3270, 3548, +0, 3271, 3548, +0, 3274, 3547, +0, 3277, 3547, +0, 3280, 3547, +0, 3285, 3547, +0, 3290, 3547, +0, 3298, 3547, +0, 3307, 3547, +0, 3320, 3547, +0, 3337, 3547, +0, 3358, 3547, +0, 3385, 3547, +0, 3419, 3547, +0, 3461, 3547, +0, 3511, 3547, +0, 3547, 3522, +0, 3547, 3430, +0, 3547, 3269, +0, 3547, 2886, +0, 3679, 0, +0, 3812, 0, +2572, 3944, 0, +3286, 4076, 0, +3615, 4095, 0, +0, 3261, 3548, +0, 3261, 3548, +0, 3261, 3548, +0, 3262, 3548, +0, 3262, 3548, +0, 3263, 3548, +0, 3264, 3548, +0, 3265, 3548, +0, 3267, 3548, +0, 3269, 3547, +0, 3272, 3547, +0, 3276, 3547, +0, 3281, 3546, +0, 3287, 3546, +0, 3294, 3546, +0, 3304, 3546, +0, 3317, 3546, +0, 3334, 3546, +0, 3355, 3546, +0, 3382, 3546, +0, 3416, 3546, +0, 3458, 3546, +0, 3509, 3546, +0, 3546, 3523, +0, 3546, 3432, +0, 3546, 3271, +0, 3546, 2891, +0, 3679, 0, +0, 3811, 0, +2596, 3944, 0, +3291, 4076, 0, +3617, 4095, 0, +0, 3255, 3548, +0, 3255, 3548, +0, 3256, 3548, +0, 3256, 3548, +0, 3256, 3548, +0, 3257, 3548, +0, 3258, 3548, +0, 3259, 3548, +0, 3261, 3548, +0, 3263, 3547, +0, 3266, 3547, +0, 3270, 3547, +0, 3275, 3546, +0, 3282, 3546, +0, 3290, 3546, +0, 3300, 3546, +0, 3313, 3546, +0, 3330, 3546, +0, 3351, 3546, +0, 3379, 3546, +0, 3413, 3546, +0, 3455, 3546, +0, 3506, 3546, +0, 3546, 3525, +0, 3546, 3434, +0, 3546, 3274, +0, 3546, 2897, +0, 3678, 0, +0, 3811, 0, +2625, 3943, 0, +3297, 4076, 0, +3621, 4095, 0, +0, 3247, 3548, +0, 3247, 3548, +0, 3247, 3548, +0, 3248, 3548, +0, 3248, 3548, +0, 3249, 3548, +0, 3250, 3548, +0, 3251, 3548, +0, 3253, 3548, +0, 3255, 3547, +0, 3258, 3547, +0, 3262, 3547, +0, 3268, 3546, +0, 3275, 3546, +0, 3284, 3545, +0, 3294, 3545, +0, 3307, 3545, +0, 3324, 3545, +0, 3346, 3545, +0, 3374, 3545, +0, 3408, 3545, +0, 3451, 3545, +0, 3502, 3545, +0, 3545, 3526, +0, 3545, 3436, +0, 3545, 3278, +0, 3545, 2905, +0, 3678, 0, +0, 3810, 0, +2662, 3943, 0, +3306, 4075, 0, +3625, 4095, 0, +0, 3236, 3548, +0, 3236, 3548, +0, 3236, 3548, +0, 3237, 3548, +0, 3237, 3548, +0, 3238, 3548, +0, 3239, 3548, +0, 3240, 3548, +0, 3242, 3548, +0, 3244, 3547, +0, 3247, 3547, +0, 3251, 3547, +0, 3257, 3546, +0, 3264, 3546, +0, 3273, 3545, +0, 3285, 3544, +0, 3299, 3544, +0, 3316, 3544, +0, 3339, 3544, +0, 3367, 3544, +0, 3402, 3544, +0, 3445, 3544, +0, 3497, 3544, +0, 3544, 3529, +0, 3544, 3440, +0, 3544, 3282, +0, 3544, 2916, +0, 3677, 0, +0, 3810, 0, +2708, 3943, 0, +3318, 4075, 0, +3630, 4095, 0, +0, 3220, 3548, +0, 3220, 3548, +0, 3221, 3548, +0, 3221, 3548, +0, 3222, 3548, +0, 3222, 3548, +0, 3223, 3548, +0, 3225, 3548, +0, 3226, 3548, +0, 3229, 3547, +0, 3232, 3547, +0, 3236, 3547, +0, 3242, 3546, +0, 3249, 3546, +0, 3259, 3545, +0, 3272, 3544, +0, 3288, 3543, +0, 3306, 3543, +0, 3329, 3543, +0, 3357, 3543, +0, 3393, 3543, +0, 3437, 3543, +0, 3490, 3543, +0, 3543, 3533, +0, 3543, 3444, +0, 3543, 3288, +0, 3543, 2929, +0, 3676, 0, +0, 3809, 0, +2762, 3942, 0, +3333, 4075, 0, +3638, 4095, 0, +0, 3198, 3548, +0, 3199, 3548, +0, 3199, 3548, +0, 3200, 3548, +0, 3200, 3548, +0, 3201, 3548, +0, 3202, 3548, +0, 3203, 3548, +0, 3205, 3548, +0, 3208, 3547, +0, 3211, 3547, +0, 3216, 3547, +0, 3221, 3546, +0, 3229, 3546, +0, 3239, 3545, +0, 3253, 3544, +0, 3270, 3543, +0, 3291, 3541, +0, 3315, 3541, +0, 3344, 3541, +0, 3381, 3541, +0, 3426, 3541, +0, 3480, 3541, +0, 3541, 3538, +0, 3541, 3450, +0, 3541, 3296, +0, 3541, 2947, +0, 3675, 0, +0, 3808, 0, +2826, 3941, 0, +3351, 4074, 0, +3648, 4095, 0, +0, 3168, 3548, +0, 3168, 3548, +0, 3168, 3548, +0, 3169, 3548, +0, 3170, 3548, +0, 3171, 3548, +0, 3172, 3548, +0, 3173, 3548, +0, 3175, 3548, +0, 3178, 3547, +0, 3182, 3547, +0, 3186, 3547, +0, 3192, 3546, +0, 3201, 3546, +0, 3211, 3545, +0, 3225, 3544, +0, 3243, 3543, +0, 3267, 3541, +0, 3296, 3538, +0, 3326, 3538, +0, 3365, 3538, +0, 3411, 3538, +0, 3467, 3538, +0, 3532, 3538, +0, 3538, 3457, +0, 3538, 3307, +0, 3538, 2970, +0, 3673, 0, +0, 3807, 0, +2899, 3940, 0, +3376, 4073, 0, +3661, 4095, 0, +0, 3124, 3548, +0, 3124, 3548, +0, 3124, 3548, +0, 3125, 3548, +0, 3125, 3548, +0, 3126, 3548, +0, 3128, 3548, +0, 3129, 3548, +0, 3132, 3548, +0, 3135, 3547, +0, 3138, 3547, +0, 3144, 3547, +0, 3151, 3546, +0, 3160, 3546, +0, 3171, 3545, +0, 3186, 3544, +0, 3206, 3543, +0, 3231, 3541, +0, 3263, 3538, +0, 3302, 3535, +0, 3342, 3535, +0, 3391, 3535, +0, 3449, 3535, +0, 3516, 3535, +0, 3535, 3467, +0, 3535, 3321, +0, 3535, 2998, +0, 3670, 0, +0, 3805, 0, +2982, 3939, 0, +3407, 4072, 0, +3677, 4095, 0, +0, 3056, 3548, +0, 3057, 3548, +0, 3057, 3548, +0, 3058, 3548, +0, 3059, 3548, +0, 3060, 3548, +0, 3061, 3548, +0, 3063, 3548, +0, 3066, 3548, +0, 3069, 3547, +0, 3074, 3547, +0, 3080, 3547, +0, 3087, 3546, +0, 3098, 3546, +0, 3111, 3545, +0, 3129, 3544, +0, 3151, 3543, +0, 3179, 3541, +0, 3214, 3538, +0, 3257, 3535, +0, 3309, 3530, +0, 3362, 3530, +0, 3423, 3530, +0, 3495, 3530, +0, 3530, 3480, +0, 3530, 3339, +0, 3530, 3034, +0, 3667, 0, +1737, 3802, 0, +3073, 3937, 0, +3445, 4071, 0, +3699, 4095, 0, +0, 2948, 3548, +0, 2948, 3548, +0, 2949, 3548, +0, 2950, 3548, +0, 2951, 3548, +0, 2952, 3548, +0, 2954, 3548, +0, 2956, 3548, +0, 2960, 3548, +0, 2964, 3547, +0, 2970, 3547, +0, 2977, 3547, +0, 2987, 3546, +0, 3000, 3546, +0, 3016, 3545, +0, 3038, 3544, +0, 3065, 3543, +0, 3099, 3541, +0, 3140, 3538, +0, 3190, 3535, +0, 3250, 3530, +1536, 3320, 3524, +1536, 3387, 3524, +1536, 3463, 3524, +1536, 3524, 3497, +1536, 3524, 3362, +1536, 3524, 3078, +0, 3662, 1753, +2519, 3799, 0, +3172, 3934, 0, +3491, 4069, 0, +3726, 4095, 0, +0, 2745, 3548, +0, 2745, 3548, +0, 2746, 3548, +0, 2747, 3548, +0, 2749, 3548, +0, 2751, 3548, +0, 2754, 3548, +0, 2758, 3548, +0, 2763, 3548, +0, 2770, 3547, +0, 2778, 3547, +0, 2790, 3547, +0, 2804, 3546, +0, 2824, 3546, +0, 2848, 3545, +0, 2879, 3544, +0, 2917, 3543, +0, 2963, 3541, +0, 3018, 3538, +0, 3083, 3535, +0, 3157, 3530, +1536, 3241, 3524, +2457, 3333, 3515, +2457, 3418, 3515, +2457, 3512, 3515, +2457, 3515, 3391, +2457, 3515, 3130, +1663, 3656, 2289, +2856, 3794, 0, +3277, 3931, 0, +3546, 4066, 0, +3759, 4095, 0, +0, 2104, 3548, +0, 2107, 3548, +0, 2111, 3548, +0, 2115, 3548, +0, 2122, 3548, +0, 2130, 3548, +0, 2141, 3548, +0, 2156, 3548, +0, 2174, 3548, +0, 2198, 3547, +0, 2228, 3547, +0, 2265, 3547, +0, 2311, 3546, +0, 2365, 3546, +0, 2429, 3545, +0, 2502, 3544, +0, 2585, 3543, +0, 2676, 3541, +0, 2775, 3538, +0, 2881, 3535, +0, 2992, 3530, +1536, 3108, 3524, +2457, 3227, 3515, +2808, 3350, 3504, +2808, 3457, 3504, +2808, 3504, 3426, +2808, 3504, 3192, +2592, 3648, 2590, +3097, 3788, 1799, +3388, 3926, 0, +3611, 4063, 0, +3801, 4095, 0, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3547, +0, 0, 3547, +0, 0, 3547, +0, 0, 3546, +0, 0, 3546, +0, 0, 3545, +0, 0, 3544, +0, 0, 3543, +0, 0, 3541, +0, 1477, 3538, +0, 2256, 3535, +0, 2593, 3530, +1536, 2833, 3524, +2457, 3032, 3515, +2808, 3209, 3504, +3054, 3372, 3488, +3054, 3488, 3470, +3054, 3488, 3264, +3038, 3636, 2940, +3296, 3780, 2721, +3504, 3920, 1928, +3685, 4058, 0, +3851, 4095, 0, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3547, +0, 0, 3547, +0, 0, 3547, +0, 0, 3546, +0, 0, 3546, +0, 0, 3545, +0, 0, 3544, +0, 0, 3543, +0, 0, 3541, +0, 0, 3538, +0, 0, 3535, +1621, 0, 3530, +2158, 1536, 3524, +2457, 2459, 3515, +2808, 2907, 3504, +3054, 3183, 3488, +3256, 3399, 3466, +3256, 3466, 3344, +3315, 3620, 3186, +3473, 3768, 3072, +3624, 3912, 2854, +3769, 4052, 2063, +3911, 4095, 0, +2873, 0, 3548, +2873, 0, 3548, +2873, 0, 3548, +2874, 0, 3548, +2874, 0, 3548, +2875, 0, 3548, +2876, 0, 3548, +2877, 0, 3548, +2878, 0, 3548, +2880, 0, 3547, +2883, 0, 3547, +2886, 0, 3547, +2891, 0, 3546, +2897, 0, 3546, +2905, 0, 3545, +2916, 0, 3544, +2929, 0, 3543, +2947, 0, 3541, +2970, 0, 3538, +2998, 0, 3535, +3034, 0, 3530, +3078, 1536, 3524, +3130, 2457, 3515, +3192, 2808, 3504, +3264, 3054, 3488, +3344, 3256, 3466, +3434, 3434, 3434, +3531, 3598, 3388, +3636, 3752, 3318, +3746, 3900, 3204, +3861, 4044, 2986, +3980, 4095, 2192, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3397, 0, 3680, +3397, 0, 3680, +3398, 0, 3680, +3399, 0, 3679, +3400, 0, 3679, +3401, 0, 3679, +3403, 0, 3678, +3406, 0, 3678, +3410, 0, 3677, +3414, 0, 3676, +3420, 0, 3675, +3429, 0, 3673, +3439, 0, 3670, +3453, 0, 3667, +3471, 0, 3662, +3494, 1663, 3656, +3523, 2590, 3648, +3558, 2940, 3636, +3603, 3186, 3620, +3598, 3388, 3531, +3598, 3477, 3388, +3752, 3735, 3318, +3853, 3900, 3204, +3947, 4044, 2986, +4047, 4095, 2192, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3692, 0, 3812, +3692, 0, 3812, +3693, 0, 3812, +3694, 0, 3811, +3695, 0, 3811, +3696, 0, 3810, +3698, 0, 3810, +3700, 0, 3809, +3704, 0, 3808, +3708, 0, 3807, +3714, 0, 3805, +3721, 0, 3802, +3731, 0, 3799, +3745, 0, 3794, +3761, 1799, 3788, +3780, 2721, 3776, +3768, 3072, 3721, +3752, 3318, 3636, +3752, 3318, 3447, +3752, 3528, 3318, +3900, 3822, 3204, +4040, 4044, 2986, +4095, 4095, 2192, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3916, 0, 3944, +3916, 0, 3944, +3916, 0, 3944, +3917, 0, 3944, +3917, 0, 3943, +3918, 0, 3943, +3920, 0, 3943, +3921, 0, 3942, +3923, 0, 3941, +3926, 0, 3940, +3929, 0, 3939, +3934, 0, 3937, +3934, 0, 3928, +3931, 0, 3913, +3926, 0, 3891, +3920, 1928, 3860, +3912, 2854, 3814, +3900, 3204, 3746, +3900, 3204, 3605, +3900, 3204, 3302, +3900, 3588, 3204, +4044, 3919, 2986, +4095, 4095, 2192, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4044, +4076, 0, 4044, +4076, 0, 4044, +4076, 0, 4043, +4076, 0, 4043, +4076, 0, 4042, +4075, 0, 4041, +4075, 0, 4039, +4075, 0, 4037, +4074, 0, 4034, +4073, 0, 4030, +4072, 0, 4025, +4071, 0, 4018, +4069, 0, 4008, +4066, 0, 3995, +4063, 0, 3977, +4058, 0, 3952, +4052, 2063, 3915, +4044, 2986, 3861, +4044, 2986, 3755, +4044, 2986, 3561, +4044, 2986, 2987, +4044, 3659, 2986, +4095, 4023, 2192, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4087, +4095, 0, 4072, +4095, 0, 4051, +4095, 0, 4022, +4095, 2192, 3980, +4095, 2192, 3901, +4095, 2192, 3768, +4095, 2192, 3494, +4095, 2814, 2192, +4095, 3738, 2192, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3427, 3680, +0, 3432, 3680, +0, 3440, 3680, +0, 3449, 3680, +0, 3462, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3558, +0, 3680, 3396, +0, 3680, 3005, +0, 3812, 0, +0, 3944, 0, +2626, 4076, 0, +3404, 4095, 0, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3432, 3680, +0, 3439, 3680, +0, 3449, 3680, +0, 3462, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3558, +0, 3680, 3396, +0, 3680, 3005, +0, 3812, 0, +0, 3944, 0, +2627, 4076, 0, +3404, 4095, 0, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3432, 3680, +0, 3439, 3680, +0, 3449, 3680, +0, 3462, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3005, +0, 3812, 0, +0, 3944, 0, +2628, 4076, 0, +3404, 4095, 0, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3415, 3680, +0, 3416, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3432, 3680, +0, 3439, 3680, +0, 3449, 3680, +0, 3461, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3006, +0, 3812, 0, +0, 3944, 0, +2630, 4076, 0, +3405, 4095, 0, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3416, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3431, 3680, +0, 3439, 3680, +0, 3448, 3680, +0, 3461, 3680, +0, 3478, 3680, +0, 3498, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3648, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3006, +0, 3812, 0, +0, 3944, 0, +2632, 4076, 0, +3405, 4095, 0, +0, 3409, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3416, 3680, +0, 3418, 3680, +0, 3421, 3680, +0, 3426, 3680, +0, 3431, 3680, +0, 3438, 3680, +0, 3448, 3680, +0, 3461, 3680, +0, 3477, 3680, +0, 3498, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3648, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3006, +0, 3812, 0, +0, 3944, 0, +2635, 4076, 0, +3405, 4095, 0, +0, 3408, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3418, 3680, +0, 3421, 3680, +0, 3425, 3680, +0, 3431, 3680, +0, 3438, 3680, +0, 3448, 3680, +0, 3460, 3680, +0, 3477, 3680, +0, 3497, 3680, +0, 3524, 3680, +0, 3557, 3680, +0, 3598, 3680, +0, 3648, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3007, +0, 3812, 0, +0, 3944, 0, +2639, 4076, 0, +3406, 4095, 0, +0, 3408, 3680, +0, 3408, 3680, +0, 3408, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3420, 3680, +0, 3425, 3680, +0, 3430, 3680, +0, 3437, 3680, +0, 3447, 3680, +0, 3460, 3680, +0, 3476, 3680, +0, 3497, 3680, +0, 3524, 3680, +0, 3557, 3680, +0, 3598, 3680, +0, 3648, 3680, +0, 3680, 3652, +0, 3680, 3559, +0, 3680, 3397, +0, 3680, 3008, +0, 3812, 0, +0, 3944, 0, +2644, 4076, 0, +3407, 4095, 0, +0, 3406, 3680, +0, 3407, 3680, +0, 3407, 3680, +0, 3407, 3680, +0, 3408, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3414, 3680, +0, 3416, 3680, +0, 3420, 3680, +0, 3424, 3680, +0, 3429, 3680, +0, 3437, 3680, +0, 3446, 3680, +0, 3459, 3680, +0, 3475, 3680, +0, 3496, 3680, +0, 3523, 3680, +0, 3556, 3680, +0, 3597, 3680, +0, 3647, 3680, +0, 3680, 3652, +0, 3680, 3560, +0, 3680, 3397, +0, 3680, 3009, +0, 3812, 0, +0, 3944, 0, +2650, 4076, 0, +3408, 4095, 0, +0, 3405, 3680, +0, 3405, 3680, +0, 3405, 3680, +0, 3406, 3680, +0, 3406, 3680, +0, 3407, 3680, +0, 3407, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3411, 3680, +0, 3413, 3680, +0, 3415, 3680, +0, 3418, 3680, +0, 3423, 3680, +0, 3428, 3680, +0, 3436, 3680, +0, 3445, 3680, +0, 3458, 3680, +0, 3475, 3680, +0, 3495, 3680, +0, 3522, 3680, +0, 3556, 3680, +0, 3597, 3680, +0, 3646, 3680, +0, 3680, 3652, +0, 3680, 3560, +0, 3680, 3398, +0, 3680, 3011, +0, 3812, 0, +0, 3944, 0, +2659, 4076, 0, +3410, 4095, 0, +0, 3403, 3680, +0, 3403, 3680, +0, 3404, 3680, +0, 3404, 3680, +0, 3404, 3680, +0, 3405, 3680, +0, 3406, 3680, +0, 3406, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3411, 3679, +0, 3414, 3679, +0, 3417, 3679, +0, 3421, 3679, +0, 3427, 3679, +0, 3434, 3679, +0, 3444, 3679, +0, 3457, 3679, +0, 3473, 3679, +0, 3494, 3679, +0, 3521, 3679, +0, 3554, 3679, +0, 3596, 3679, +0, 3646, 3679, +0, 3679, 3653, +0, 3679, 3561, +0, 3679, 3399, +0, 3679, 3013, +0, 3812, 0, +0, 3944, 0, +2670, 4076, 0, +3412, 4095, 0, +0, 3401, 3680, +0, 3401, 3680, +0, 3401, 3680, +0, 3401, 3680, +0, 3402, 3680, +0, 3402, 3680, +0, 3403, 3680, +0, 3404, 3680, +0, 3405, 3680, +0, 3407, 3680, +0, 3409, 3679, +0, 3412, 3679, +0, 3415, 3679, +0, 3419, 3679, +0, 3425, 3679, +0, 3432, 3679, +0, 3442, 3679, +0, 3455, 3679, +0, 3472, 3679, +0, 3493, 3679, +0, 3520, 3679, +0, 3553, 3679, +0, 3595, 3679, +0, 3644, 3679, +0, 3679, 3653, +0, 3679, 3562, +0, 3679, 3400, +0, 3679, 3015, +0, 3812, 0, +0, 3944, 0, +2684, 4076, 0, +3415, 4095, 0, +0, 3398, 3680, +0, 3398, 3680, +0, 3398, 3680, +0, 3398, 3680, +0, 3399, 3680, +0, 3399, 3680, +0, 3400, 3680, +0, 3401, 3680, +0, 3402, 3680, +0, 3404, 3680, +0, 3406, 3679, +0, 3409, 3679, +0, 3413, 3679, +0, 3417, 3679, +0, 3422, 3679, +0, 3430, 3679, +0, 3440, 3679, +0, 3453, 3679, +0, 3469, 3679, +0, 3490, 3679, +0, 3517, 3679, +0, 3551, 3679, +0, 3593, 3679, +0, 3643, 3679, +0, 3679, 3654, +0, 3679, 3563, +0, 3679, 3401, +0, 3679, 3018, +0, 3811, 0, +0, 3944, 0, +2703, 4076, 0, +3419, 4095, 0, +0, 3393, 3680, +0, 3393, 3680, +0, 3393, 3680, +0, 3394, 3680, +0, 3394, 3680, +0, 3395, 3680, +0, 3395, 3680, +0, 3396, 3680, +0, 3397, 3680, +0, 3399, 3680, +0, 3401, 3679, +0, 3404, 3679, +0, 3408, 3679, +0, 3413, 3678, +0, 3419, 3678, +0, 3426, 3678, +0, 3436, 3678, +0, 3449, 3678, +0, 3466, 3678, +0, 3488, 3678, +0, 3515, 3678, +0, 3548, 3678, +0, 3590, 3678, +0, 3641, 3678, +0, 3678, 3655, +0, 3678, 3564, +0, 3678, 3403, +0, 3678, 3023, +0, 3811, 0, +0, 3943, 0, +2726, 4076, 0, +3424, 4095, 0, +0, 3387, 3680, +0, 3387, 3680, +0, 3387, 3680, +0, 3388, 3680, +0, 3388, 3680, +0, 3388, 3680, +0, 3389, 3680, +0, 3390, 3680, +0, 3392, 3680, +0, 3393, 3680, +0, 3395, 3679, +0, 3398, 3679, +0, 3402, 3679, +0, 3407, 3678, +0, 3414, 3678, +0, 3422, 3678, +0, 3432, 3678, +0, 3445, 3678, +0, 3462, 3678, +0, 3483, 3678, +0, 3511, 3678, +0, 3545, 3678, +0, 3587, 3678, +0, 3638, 3678, +0, 3678, 3657, +0, 3678, 3566, +0, 3678, 3406, +0, 3678, 3029, +0, 3810, 0, +0, 3943, 0, +2756, 4075, 0, +3430, 4095, 0, +0, 3379, 3680, +0, 3379, 3680, +0, 3379, 3680, +0, 3379, 3680, +0, 3380, 3680, +0, 3380, 3680, +0, 3381, 3680, +0, 3382, 3680, +0, 3383, 3680, +0, 3385, 3680, +0, 3387, 3679, +0, 3390, 3679, +0, 3394, 3679, +0, 3400, 3678, +0, 3407, 3678, +0, 3416, 3677, +0, 3426, 3677, +0, 3439, 3677, +0, 3456, 3677, +0, 3478, 3677, +0, 3506, 3677, +0, 3540, 3677, +0, 3583, 3677, +0, 3634, 3677, +0, 3677, 3659, +0, 3677, 3568, +0, 3677, 3410, +0, 3677, 3037, +0, 3810, 0, +0, 3943, 0, +2793, 4075, 0, +3439, 4095, 0, +0, 3367, 3680, +0, 3368, 3680, +0, 3368, 3680, +0, 3368, 3680, +0, 3369, 3680, +0, 3369, 3680, +0, 3370, 3680, +0, 3371, 3680, +0, 3372, 3680, +0, 3374, 3680, +0, 3376, 3679, +0, 3379, 3679, +0, 3384, 3679, +0, 3389, 3678, +0, 3396, 3678, +0, 3405, 3677, +0, 3418, 3676, +0, 3431, 3676, +0, 3448, 3676, +0, 3471, 3676, +0, 3499, 3676, +0, 3534, 3676, +0, 3577, 3676, +0, 3629, 3676, +0, 3676, 3662, +0, 3676, 3572, +0, 3676, 3414, +0, 3676, 3048, +0, 3809, 0, +0, 3942, 0, +2839, 4075, 0, +3450, 4095, 0, +0, 3352, 3680, +0, 3352, 3680, +0, 3353, 3680, +0, 3353, 3680, +0, 3353, 3680, +0, 3354, 3680, +0, 3354, 3680, +0, 3356, 3680, +0, 3357, 3680, +0, 3359, 3680, +0, 3361, 3679, +0, 3364, 3679, +0, 3368, 3679, +0, 3374, 3678, +0, 3381, 3678, +0, 3391, 3677, +0, 3404, 3676, +0, 3420, 3675, +0, 3438, 3675, +0, 3461, 3675, +0, 3490, 3675, +0, 3525, 3675, +0, 3569, 3675, +0, 3622, 3675, +0, 3675, 3665, +0, 3675, 3576, +0, 3675, 3420, +0, 3675, 3061, +0, 3808, 0, +0, 3941, 0, +2893, 4074, 0, +3465, 4095, 0, +0, 3330, 3680, +0, 3331, 3680, +0, 3331, 3680, +0, 3331, 3680, +0, 3332, 3680, +0, 3332, 3680, +0, 3333, 3680, +0, 3334, 3680, +0, 3336, 3680, +0, 3337, 3680, +0, 3340, 3679, +0, 3343, 3679, +0, 3348, 3679, +0, 3354, 3678, +0, 3361, 3678, +0, 3371, 3677, +0, 3385, 3676, +0, 3402, 3675, +0, 3423, 3673, +0, 3447, 3673, +0, 3477, 3673, +0, 3513, 3673, +0, 3558, 3673, +0, 3612, 3673, +0, 3673, 3670, +0, 3673, 3582, +0, 3673, 3429, +0, 3673, 3079, +0, 3807, 0, +0, 3940, 0, +2957, 4073, 0, +3484, 4095, 0, +0, 3300, 3680, +0, 3300, 3680, +0, 3300, 3680, +0, 3301, 3680, +0, 3301, 3680, +0, 3302, 3680, +0, 3303, 3680, +0, 3304, 3680, +0, 3305, 3680, +0, 3307, 3680, +0, 3310, 3679, +0, 3314, 3679, +0, 3318, 3679, +0, 3325, 3678, +0, 3333, 3678, +0, 3344, 3677, +0, 3358, 3676, +0, 3376, 3675, +0, 3399, 3673, +0, 3428, 3670, +0, 3459, 3670, +0, 3497, 3670, +0, 3543, 3670, +0, 3599, 3670, +0, 3664, 3670, +0, 3670, 3589, +0, 3670, 3439, +0, 3670, 3102, +0, 3805, 0, +0, 3939, 0, +3031, 4072, 0, +3509, 4095, 0, +0, 3255, 3680, +0, 3256, 3680, +0, 3256, 3680, +0, 3256, 3680, +0, 3257, 3680, +0, 3258, 3680, +0, 3258, 3680, +0, 3260, 3680, +0, 3261, 3680, +0, 3264, 3680, +0, 3267, 3679, +0, 3271, 3679, +0, 3276, 3679, +0, 3282, 3678, +0, 3291, 3678, +0, 3303, 3677, +0, 3319, 3676, +0, 3338, 3675, +0, 3363, 3673, +0, 3395, 3670, +0, 3434, 3667, +0, 3474, 3667, +0, 3523, 3667, +0, 3581, 3667, +0, 3648, 3667, +0, 3667, 3599, +0, 3667, 3453, +0, 3667, 3131, +0, 3802, 0, +0, 3937, 0, +3113, 4071, 0, +3539, 4095, 0, +0, 3188, 3680, +0, 3188, 3680, +0, 3189, 3680, +0, 3189, 3680, +0, 3190, 3680, +0, 3191, 3680, +0, 3192, 3680, +0, 3193, 3680, +0, 3195, 3680, +0, 3198, 3680, +0, 3201, 3679, +0, 3206, 3679, +0, 3212, 3679, +0, 3220, 3678, +0, 3230, 3678, +0, 3243, 3677, +0, 3261, 3676, +0, 3283, 3675, +0, 3311, 3673, +0, 3346, 3670, +0, 3389, 3667, +0, 3441, 3662, +0, 3494, 3662, +0, 3555, 3662, +0, 3626, 3662, +0, 3662, 3612, +0, 3662, 3471, +0, 3662, 3166, +0, 3799, 0, +1863, 3934, 0, +3205, 4069, 0, +3577, 4095, 0, +0, 3080, 3680, +0, 3080, 3680, +0, 3081, 3680, +0, 3081, 3680, +0, 3082, 3680, +0, 3083, 3680, +0, 3084, 3680, +0, 3086, 3680, +0, 3089, 3680, +0, 3092, 3680, +0, 3096, 3679, +0, 3102, 3679, +0, 3110, 3679, +0, 3119, 3678, +0, 3132, 3678, +0, 3149, 3677, +0, 3170, 3676, +0, 3197, 3675, +0, 3231, 3673, +0, 3273, 3670, +0, 3323, 3667, +0, 3382, 3662, +1663, 3452, 3656, +1663, 3519, 3656, +1663, 3595, 3656, +1663, 3656, 3629, +1663, 3656, 3494, +1663, 3656, 3210, +0, 3794, 1884, +2650, 3931, 0, +3303, 4066, 0, +3623, 4095, 0, +0, 2876, 3680, +0, 2877, 3680, +0, 2877, 3680, +0, 2878, 3680, +0, 2879, 3680, +0, 2881, 3680, +0, 2883, 3680, +0, 2886, 3680, +0, 2890, 3680, +0, 2895, 3680, +0, 2901, 3679, +0, 2910, 3679, +0, 2922, 3679, +0, 2936, 3678, +0, 2955, 3678, +0, 2980, 3677, +0, 3010, 3676, +0, 3048, 3675, +0, 3095, 3673, +0, 3150, 3670, +0, 3215, 3667, +0, 3289, 3662, +1663, 3373, 3656, +2590, 3465, 3648, +2590, 3550, 3648, +2590, 3644, 3648, +2590, 3648, 3523, +2590, 3648, 3262, +1799, 3788, 2422, +2988, 3926, 0, +3409, 4063, 0, +3679, 4095, 0, +0, 2237, 3680, +0, 2239, 3680, +0, 2242, 3680, +0, 2246, 3680, +0, 2251, 3680, +0, 2257, 3680, +0, 2266, 3680, +0, 2277, 3680, +0, 2291, 3680, +0, 2310, 3680, +0, 2333, 3679, +0, 2363, 3679, +0, 2400, 3679, +0, 2445, 3678, +0, 2499, 3678, +0, 2562, 3677, +0, 2636, 3676, +0, 2718, 3675, +0, 2809, 3673, +0, 2908, 3670, +0, 3014, 3667, +0, 3125, 3662, +1663, 3240, 3656, +2590, 3360, 3648, +2940, 3482, 3636, +2940, 3589, 3636, +2940, 3636, 3558, +2940, 3636, 3324, +2722, 3780, 2721, +3229, 3920, 1928, +3520, 4058, 0, +3743, 4095, 0, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3679, +0, 0, 3679, +0, 0, 3679, +0, 0, 3678, +0, 0, 3678, +0, 0, 3677, +0, 0, 3676, +0, 0, 3675, +0, 0, 3673, +0, 1603, 3670, +0, 2388, 3667, +0, 2724, 3662, +1663, 2965, 3656, +2590, 3165, 3648, +2940, 3341, 3636, +3186, 3504, 3620, +3186, 3620, 3603, +3186, 3620, 3396, +3171, 3768, 3072, +3428, 3912, 2854, +3636, 4052, 2063, +3818, 4095, 0, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3679, +0, 0, 3679, +0, 0, 3679, +0, 0, 3678, +0, 0, 3678, +0, 0, 3677, +0, 0, 3676, +0, 0, 3675, +0, 0, 3673, +0, 0, 3670, +0, 0, 3667, +1753, 0, 3662, +2289, 1663, 3656, +2590, 2592, 3648, +2940, 3038, 3636, +3186, 3315, 3620, +3388, 3531, 3598, +3388, 3598, 3477, +3447, 3752, 3318, +3605, 3900, 3204, +3755, 4044, 2986, +3901, 4095, 2192, +3005, 0, 3680, +3005, 0, 3680, +3005, 0, 3680, +3006, 0, 3680, +3006, 0, 3680, +3006, 0, 3680, +3007, 0, 3680, +3008, 0, 3680, +3009, 0, 3680, +3011, 0, 3680, +3013, 0, 3679, +3015, 0, 3679, +3018, 0, 3679, +3023, 0, 3678, +3029, 0, 3678, +3037, 0, 3677, +3048, 0, 3676, +3061, 0, 3675, +3079, 0, 3673, +3102, 0, 3670, +3131, 0, 3667, +3166, 0, 3662, +3210, 1663, 3656, +3262, 2590, 3648, +3324, 2940, 3636, +3396, 3186, 3620, +3477, 3388, 3598, +3566, 3566, 3566, +3664, 3730, 3520, +3768, 3884, 3450, +3878, 4032, 3336, +3993, 4095, 3118, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3529, 0, 3812, +3529, 0, 3812, +3530, 0, 3812, +3530, 0, 3812, +3531, 0, 3812, +3532, 0, 3811, +3534, 0, 3811, +3536, 0, 3810, +3538, 0, 3810, +3542, 0, 3809, +3546, 0, 3808, +3552, 0, 3807, +3561, 0, 3805, +3571, 0, 3802, +3585, 0, 3799, +3603, 0, 3794, +3626, 1799, 3788, +3655, 2721, 3780, +3691, 3072, 3768, +3735, 3318, 3752, +3730, 3520, 3664, +3730, 3609, 3520, +3884, 3867, 3450, +3986, 4032, 3336, +4079, 4095, 3118, +3822, 0, 3944, +3822, 0, 3944, +3822, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3824, 0, 3944, +3824, 0, 3944, +3824, 0, 3944, +3825, 0, 3944, +3826, 0, 3943, +3827, 0, 3943, +3828, 0, 3943, +3830, 0, 3942, +3832, 0, 3941, +3836, 0, 3940, +3840, 0, 3939, +3846, 0, 3937, +3853, 0, 3934, +3863, 0, 3931, +3877, 0, 3926, +3893, 1928, 3920, +3912, 2854, 3908, +3900, 3204, 3853, +3884, 3450, 3768, +3884, 3450, 3579, +3884, 3660, 3450, +4032, 3955, 3336, +4095, 4095, 3118, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4048, 0, 4076, +4048, 0, 4076, +4048, 0, 4076, +4049, 0, 4076, +4049, 0, 4075, +4050, 0, 4075, +4051, 0, 4075, +4053, 0, 4074, +4055, 0, 4073, +4058, 0, 4072, +4061, 0, 4071, +4066, 0, 4069, +4066, 0, 4060, +4063, 0, 4045, +4058, 0, 4023, +4052, 2063, 3992, +4044, 2986, 3947, +4032, 3336, 3878, +4032, 3336, 3737, +4032, 3336, 3435, +4032, 3720, 3336, +4095, 4051, 3118, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4084, +4095, 2192, 4047, +4095, 3118, 3993, +4095, 3118, 3888, +4095, 3118, 3693, +4095, 3118, 3121, +4095, 3791, 3118, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3552, 3812, +0, 3554, 3812, +0, 3559, 3812, +0, 3564, 3812, +0, 3572, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3691, 3812, +0, 3732, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3137, +0, 3944, 0, +0, 4076, 0, +2761, 4095, 0, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3559, 3812, +0, 3564, 3812, +0, 3572, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3691, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3137, +0, 3944, 0, +0, 4076, 0, +2762, 4095, 0, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3559, 3812, +0, 3564, 3812, +0, 3572, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3137, +0, 3944, 0, +0, 4076, 0, +2762, 4095, 0, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3558, 3812, +0, 3564, 3812, +0, 3571, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3138, +0, 3944, 0, +0, 4076, 0, +2764, 4095, 0, +0, 3541, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3558, 3812, +0, 3564, 3812, +0, 3571, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3138, +0, 3944, 0, +0, 4076, 0, +2765, 4095, 0, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3548, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3558, 3812, +0, 3564, 3812, +0, 3571, 3812, +0, 3581, 3812, +0, 3593, 3812, +0, 3609, 3812, +0, 3630, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3138, +0, 3944, 0, +0, 4076, 0, +2767, 4095, 0, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3548, 3812, +0, 3550, 3812, +0, 3553, 3812, +0, 3558, 3812, +0, 3563, 3812, +0, 3571, 3812, +0, 3580, 3812, +0, 3593, 3812, +0, 3609, 3812, +0, 3630, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3139, +0, 3944, 0, +0, 4076, 0, +2770, 4095, 0, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3546, 3812, +0, 3548, 3812, +0, 3550, 3812, +0, 3553, 3812, +0, 3557, 3812, +0, 3563, 3812, +0, 3570, 3812, +0, 3580, 3812, +0, 3593, 3812, +0, 3609, 3812, +0, 3630, 3812, +0, 3656, 3812, +0, 3690, 3812, +0, 3730, 3812, +0, 3780, 3812, +0, 3812, 3784, +0, 3812, 3691, +0, 3812, 3529, +0, 3812, 3139, +0, 3944, 0, +0, 4076, 0, +2773, 4095, 0, +0, 3540, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3552, 3812, +0, 3557, 3812, +0, 3562, 3812, +0, 3570, 3812, +0, 3579, 3812, +0, 3592, 3812, +0, 3608, 3812, +0, 3629, 3812, +0, 3656, 3812, +0, 3689, 3812, +0, 3730, 3812, +0, 3780, 3812, +0, 3812, 3784, +0, 3812, 3691, +0, 3812, 3529, +0, 3812, 3140, +0, 3944, 0, +0, 4076, 0, +2778, 4095, 0, +0, 3538, 3812, +0, 3538, 3812, +0, 3539, 3812, +0, 3539, 3812, +0, 3539, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3546, 3812, +0, 3548, 3812, +0, 3552, 3812, +0, 3556, 3812, +0, 3562, 3812, +0, 3569, 3812, +0, 3579, 3812, +0, 3591, 3812, +0, 3607, 3812, +0, 3629, 3812, +0, 3655, 3812, +0, 3689, 3812, +0, 3729, 3812, +0, 3779, 3812, +0, 3812, 3784, +0, 3812, 3692, +0, 3812, 3530, +0, 3812, 3141, +0, 3944, 0, +0, 4076, 0, +2785, 4095, 0, +0, 3537, 3812, +0, 3537, 3812, +0, 3537, 3812, +0, 3538, 3812, +0, 3538, 3812, +0, 3538, 3812, +0, 3539, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3543, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3551, 3812, +0, 3555, 3812, +0, 3561, 3812, +0, 3568, 3812, +0, 3577, 3812, +0, 3590, 3812, +0, 3606, 3812, +0, 3628, 3812, +0, 3654, 3812, +0, 3688, 3812, +0, 3729, 3812, +0, 3778, 3812, +0, 3812, 3784, +0, 3812, 3692, +0, 3812, 3530, +0, 3812, 3143, +0, 3944, 0, +0, 4076, 0, +2793, 4095, 0, +0, 3535, 3812, +0, 3536, 3812, +0, 3536, 3812, +0, 3536, 3812, +0, 3536, 3812, +0, 3537, 3812, +0, 3537, 3812, +0, 3538, 3812, +0, 3538, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3544, 3812, +0, 3546, 3812, +0, 3549, 3812, +0, 3553, 3812, +0, 3559, 3812, +0, 3566, 3812, +0, 3576, 3812, +0, 3589, 3812, +0, 3605, 3812, +0, 3626, 3812, +0, 3653, 3812, +0, 3687, 3812, +0, 3728, 3812, +0, 3777, 3812, +0, 3812, 3785, +0, 3812, 3693, +0, 3812, 3531, +0, 3812, 3145, +0, 3944, 0, +0, 4076, 0, +2804, 4095, 0, +0, 3533, 3812, +0, 3533, 3812, +0, 3533, 3812, +0, 3533, 3812, +0, 3534, 3812, +0, 3534, 3812, +0, 3534, 3812, +0, 3535, 3812, +0, 3536, 3812, +0, 3537, 3812, +0, 3539, 3812, +0, 3541, 3812, +0, 3544, 3811, +0, 3547, 3811, +0, 3552, 3811, +0, 3557, 3811, +0, 3564, 3811, +0, 3574, 3811, +0, 3587, 3811, +0, 3604, 3811, +0, 3625, 3811, +0, 3652, 3811, +0, 3685, 3811, +0, 3727, 3811, +0, 3777, 3811, +0, 3811, 3785, +0, 3811, 3694, +0, 3811, 3532, +0, 3811, 3147, +0, 3944, 0, +0, 4076, 0, +2818, 4095, 0, +0, 3530, 3812, +0, 3530, 3812, +0, 3530, 3812, +0, 3530, 3812, +0, 3530, 3812, +0, 3531, 3812, +0, 3531, 3812, +0, 3532, 3812, +0, 3533, 3812, +0, 3534, 3812, +0, 3536, 3812, +0, 3538, 3812, +0, 3541, 3811, +0, 3545, 3811, +0, 3549, 3811, +0, 3554, 3811, +0, 3562, 3811, +0, 3572, 3811, +0, 3585, 3811, +0, 3601, 3811, +0, 3622, 3811, +0, 3650, 3811, +0, 3683, 3811, +0, 3725, 3811, +0, 3775, 3811, +0, 3811, 3786, +0, 3811, 3695, +0, 3811, 3534, +0, 3811, 3151, +0, 3943, 0, +0, 4076, 0, +2837, 4095, 0, +0, 3525, 3812, +0, 3525, 3812, +0, 3525, 3812, +0, 3526, 3812, +0, 3526, 3812, +0, 3526, 3812, +0, 3527, 3812, +0, 3528, 3812, +0, 3528, 3812, +0, 3530, 3812, +0, 3531, 3812, +0, 3533, 3812, +0, 3536, 3811, +0, 3540, 3811, +0, 3545, 3810, +0, 3551, 3810, +0, 3559, 3810, +0, 3569, 3810, +0, 3582, 3810, +0, 3598, 3810, +0, 3620, 3810, +0, 3647, 3810, +0, 3680, 3810, +0, 3722, 3810, +0, 3773, 3810, +0, 3810, 3787, +0, 3810, 3696, +0, 3810, 3536, +0, 3810, 3155, +0, 3943, 0, +0, 4075, 0, +2861, 4095, 0, +0, 3519, 3812, +0, 3519, 3812, +0, 3519, 3812, +0, 3520, 3812, +0, 3520, 3812, +0, 3520, 3812, +0, 3521, 3812, +0, 3521, 3812, +0, 3522, 3812, +0, 3523, 3812, +0, 3525, 3812, +0, 3528, 3812, +0, 3530, 3811, +0, 3534, 3811, +0, 3540, 3810, +0, 3547, 3810, +0, 3554, 3810, +0, 3564, 3810, +0, 3577, 3810, +0, 3594, 3810, +0, 3616, 3810, +0, 3643, 3810, +0, 3677, 3810, +0, 3719, 3810, +0, 3770, 3810, +0, 3810, 3789, +0, 3810, 3698, +0, 3810, 3538, +0, 3810, 3161, +0, 3943, 0, +0, 4075, 0, +2890, 4095, 0, +0, 3511, 3812, +0, 3511, 3812, +0, 3511, 3812, +0, 3511, 3812, +0, 3511, 3812, +0, 3512, 3812, +0, 3513, 3812, +0, 3513, 3812, +0, 3514, 3812, +0, 3515, 3812, +0, 3517, 3812, +0, 3520, 3812, +0, 3522, 3811, +0, 3526, 3811, +0, 3532, 3810, +0, 3539, 3810, +0, 3548, 3809, +0, 3558, 3809, +0, 3571, 3809, +0, 3588, 3809, +0, 3610, 3809, +0, 3638, 3809, +0, 3672, 3809, +0, 3715, 3809, +0, 3766, 3809, +0, 3809, 3791, +0, 3809, 3700, +0, 3809, 3542, +0, 3809, 3169, +0, 3942, 0, +0, 4075, 0, +2927, 4095, 0, +0, 3499, 3812, +0, 3499, 3812, +0, 3500, 3812, +0, 3500, 3812, +0, 3500, 3812, +0, 3501, 3812, +0, 3501, 3812, +0, 3502, 3812, +0, 3503, 3812, +0, 3504, 3812, +0, 3506, 3812, +0, 3508, 3812, +0, 3511, 3811, +0, 3516, 3811, +0, 3521, 3810, +0, 3528, 3810, +0, 3537, 3809, +0, 3550, 3808, +0, 3563, 3808, +0, 3581, 3808, +0, 3603, 3808, +0, 3631, 3808, +0, 3666, 3808, +0, 3709, 3808, +0, 3761, 3808, +0, 3808, 3794, +0, 3808, 3704, +0, 3808, 3546, +0, 3808, 3180, +0, 3941, 0, +0, 4074, 0, +2973, 4095, 0, +0, 3484, 3812, +0, 3484, 3812, +0, 3484, 3812, +0, 3485, 3812, +0, 3485, 3812, +0, 3485, 3812, +0, 3486, 3812, +0, 3487, 3812, +0, 3488, 3812, +0, 3489, 3812, +0, 3491, 3812, +0, 3493, 3812, +0, 3496, 3811, +0, 3501, 3811, +0, 3506, 3810, +0, 3514, 3810, +0, 3523, 3809, +0, 3536, 3808, +0, 3552, 3807, +0, 3570, 3807, +0, 3593, 3807, +0, 3622, 3807, +0, 3657, 3807, +0, 3701, 3807, +0, 3754, 3807, +0, 3807, 3797, +0, 3807, 3708, +0, 3807, 3552, +0, 3807, 3194, +0, 3940, 0, +0, 4073, 0, +3027, 4095, 0, +0, 3462, 3812, +0, 3462, 3812, +0, 3463, 3812, +0, 3463, 3812, +0, 3463, 3812, +0, 3464, 3812, +0, 3464, 3812, +0, 3465, 3812, +0, 3466, 3812, +0, 3468, 3812, +0, 3469, 3812, +0, 3472, 3812, +0, 3475, 3811, +0, 3480, 3811, +0, 3486, 3810, +0, 3493, 3810, +0, 3503, 3809, +0, 3517, 3808, +0, 3534, 3807, +0, 3556, 3805, +0, 3579, 3805, +0, 3609, 3805, +0, 3646, 3805, +0, 3690, 3805, +0, 3744, 3805, +0, 3805, 3802, +0, 3805, 3714, +0, 3805, 3561, +0, 3805, 3211, +0, 3939, 0, +0, 4072, 0, +3090, 4095, 0, +0, 3432, 3812, +0, 3432, 3812, +0, 3432, 3812, +0, 3432, 3812, +0, 3433, 3812, +0, 3433, 3812, +0, 3434, 3812, +0, 3435, 3812, +0, 3436, 3812, +0, 3437, 3812, +0, 3439, 3812, +0, 3442, 3812, +0, 3446, 3811, +0, 3450, 3811, +0, 3457, 3810, +0, 3465, 3810, +0, 3475, 3809, +0, 3490, 3808, +0, 3508, 3807, +0, 3531, 3805, +0, 3560, 3802, +0, 3591, 3802, +0, 3629, 3802, +0, 3676, 3802, +0, 3731, 3802, +0, 3796, 3802, +0, 3802, 3721, +0, 3802, 3571, +0, 3802, 3234, +0, 3937, 0, +0, 4071, 0, +3164, 4095, 0, +0, 3387, 3812, +0, 3388, 3812, +0, 3388, 3812, +0, 3388, 3812, +0, 3388, 3812, +0, 3389, 3812, +0, 3390, 3812, +0, 3391, 3812, +0, 3392, 3812, +0, 3394, 3812, +0, 3396, 3812, +0, 3399, 3812, +0, 3403, 3811, +0, 3408, 3811, +0, 3415, 3810, +0, 3424, 3810, +0, 3435, 3809, +0, 3451, 3808, +0, 3470, 3807, +0, 3495, 3805, +0, 3527, 3802, +0, 3566, 3799, +0, 3606, 3799, +0, 3655, 3799, +0, 3713, 3799, +0, 3781, 3799, +0, 3799, 3731, +0, 3799, 3585, +0, 3799, 3262, +0, 3934, 0, +0, 4069, 0, +3246, 4095, 0, +0, 3320, 3812, +0, 3321, 3812, +0, 3321, 3812, +0, 3321, 3812, +0, 3322, 3812, +0, 3322, 3812, +0, 3323, 3812, +0, 3324, 3812, +0, 3326, 3812, +0, 3328, 3812, +0, 3330, 3812, +0, 3333, 3812, +0, 3338, 3811, +0, 3344, 3811, +0, 3352, 3810, +0, 3362, 3810, +0, 3376, 3809, +0, 3393, 3808, +0, 3415, 3807, +0, 3443, 3805, +0, 3479, 3802, +0, 3522, 3799, +0, 3574, 3794, +0, 3626, 3794, +0, 3687, 3794, +0, 3759, 3794, +0, 3794, 3745, +0, 3794, 3603, +0, 3794, 3298, +0, 3931, 0, +1985, 4066, 0, +3337, 4095, 0, +0, 3211, 3812, +0, 3212, 3812, +0, 3212, 3812, +0, 3213, 3812, +0, 3213, 3812, +0, 3214, 3812, +0, 3215, 3812, +0, 3216, 3812, +0, 3218, 3812, +0, 3221, 3812, +0, 3224, 3812, +0, 3228, 3812, +0, 3234, 3811, +0, 3241, 3811, +0, 3251, 3810, +0, 3264, 3810, +0, 3281, 3809, +0, 3302, 3808, +0, 3329, 3807, +0, 3363, 3805, +0, 3405, 3802, +0, 3455, 3799, +0, 3515, 3794, +1799, 3584, 3788, +1799, 3651, 3788, +1799, 3728, 3788, +1799, 3788, 3761, +1799, 3788, 3626, +1799, 3788, 3342, +0, 3926, 2023, +2781, 4063, 0, +3436, 4095, 0, +0, 3008, 3812, +0, 3009, 3812, +0, 3009, 3812, +0, 3010, 3812, +0, 3011, 3812, +0, 3012, 3812, +0, 3014, 3812, +0, 3016, 3812, +0, 3019, 3812, +0, 3023, 3812, +0, 3027, 3812, +0, 3034, 3812, +0, 3043, 3811, +0, 3054, 3811, +0, 3069, 3810, +0, 3088, 3810, +0, 3112, 3809, +0, 3143, 3808, +0, 3181, 3807, +0, 3227, 3805, +0, 3282, 3802, +0, 3347, 3799, +0, 3421, 3794, +1799, 3505, 3788, +2721, 3597, 3780, +2721, 3682, 3780, +2721, 3776, 3780, +2721, 3780, 3655, +2721, 3780, 3394, +1928, 3920, 2556, +3119, 4058, 0, +3541, 4095, 0, +0, 2367, 3812, +0, 2369, 3812, +0, 2371, 3812, +0, 2374, 3812, +0, 2377, 3812, +0, 2382, 3812, +0, 2389, 3812, +0, 2397, 3812, +0, 2408, 3812, +0, 2422, 3812, +0, 2441, 3812, +0, 2465, 3812, +0, 2494, 3811, +0, 2531, 3811, +0, 2576, 3810, +0, 2631, 3810, +0, 2694, 3809, +0, 2767, 3808, +0, 2850, 3807, +0, 2941, 3805, +0, 3040, 3802, +0, 3145, 3799, +0, 3256, 3794, +1799, 3372, 3788, +2721, 3492, 3780, +3072, 3614, 3768, +3072, 3721, 3768, +3072, 3768, 3691, +3072, 3768, 3456, +2854, 3912, 2854, +3361, 4052, 2063, +3653, 4095, 0, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3811, +0, 0, 3811, +0, 0, 3810, +0, 0, 3810, +0, 0, 3809, +0, 0, 3808, +0, 0, 3807, +0, 0, 3805, +0, 1737, 3802, +0, 2519, 3799, +0, 2856, 3794, +1799, 3097, 3788, +2721, 3296, 3780, +3072, 3473, 3768, +3318, 3636, 3752, +3318, 3752, 3735, +3318, 3752, 3528, +3302, 3900, 3204, +3561, 4044, 2986, +3768, 4095, 2192, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3811, +0, 0, 3811, +0, 0, 3810, +0, 0, 3810, +0, 0, 3809, +0, 0, 3808, +0, 0, 3807, +0, 0, 3805, +0, 0, 3802, +0, 0, 3799, +1884, 0, 3794, +2422, 1799, 3788, +2721, 2722, 3780, +3072, 3171, 3768, +3318, 3447, 3752, +3520, 3664, 3730, +3520, 3730, 3609, +3579, 3884, 3450, +3737, 4032, 3336, +3888, 4095, 3118, +3137, 0, 3812, +3137, 0, 3812, +3137, 0, 3812, +3138, 0, 3812, +3138, 0, 3812, +3138, 0, 3812, +3139, 0, 3812, +3139, 0, 3812, +3140, 0, 3812, +3141, 0, 3812, +3143, 0, 3812, +3145, 0, 3812, +3147, 0, 3811, +3151, 0, 3811, +3155, 0, 3810, +3161, 0, 3810, +3169, 0, 3809, +3180, 0, 3808, +3194, 0, 3807, +3211, 0, 3805, +3234, 0, 3802, +3262, 0, 3799, +3298, 0, 3794, +3342, 1799, 3788, +3394, 2721, 3780, +3456, 3072, 3768, +3528, 3318, 3752, +3609, 3520, 3730, +3698, 3698, 3698, +3796, 3862, 3652, +3900, 4016, 3583, +4010, 4095, 3469, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3661, 0, 3944, +3661, 0, 3944, +3661, 0, 3944, +3662, 0, 3944, +3663, 0, 3944, +3664, 0, 3943, +3665, 0, 3943, +3667, 0, 3943, +3670, 0, 3942, +3674, 0, 3941, +3678, 0, 3940, +3685, 0, 3939, +3692, 0, 3937, +3703, 0, 3934, +3717, 0, 3931, +3735, 0, 3926, +3758, 1928, 3920, +3787, 2854, 3912, +3822, 3204, 3900, +3867, 3450, 3884, +3862, 3652, 3796, +3862, 3741, 3652, +4016, 3999, 3583, +4095, 4095, 3469, +3954, 0, 4076, +3954, 0, 4076, +3954, 0, 4076, +3954, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3956, 0, 4076, +3956, 0, 4076, +3957, 0, 4076, +3958, 0, 4075, +3959, 0, 4075, +3960, 0, 4075, +3962, 0, 4074, +3964, 0, 4073, +3968, 0, 4072, +3972, 0, 4071, +3978, 0, 4069, +3985, 0, 4066, +3995, 0, 4063, +4008, 0, 4058, +4025, 2063, 4052, +4044, 2986, 4040, +4032, 3336, 3986, +4016, 3583, 3900, +4016, 3583, 3711, +4016, 3792, 3583, +4095, 4087, 3469, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 2192, 4095, +4095, 3118, 4079, +4095, 3469, 4010, +4095, 3469, 3869, +4095, 3469, 3568, +4095, 3853, 3469, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3704, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3823, 3944, +0, 3864, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3822, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3704, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3823, 3944, +0, 3864, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3822, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3704, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3823, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3822, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3270, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3690, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3725, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3270, +0, 4076, 0, +0, 4095, 0, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3680, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3690, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3725, 3944, +0, 3741, 3944, +0, 3762, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3270, +0, 4076, 0, +0, 4095, 0, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3680, 3944, +0, 3682, 3944, +0, 3686, 3944, +0, 3690, 3944, +0, 3695, 3944, +0, 3703, 3944, +0, 3712, 3944, +0, 3725, 3944, +0, 3741, 3944, +0, 3762, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3912, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3271, +0, 4076, 0, +0, 4095, 0, +0, 3672, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3678, 3944, +0, 3680, 3944, +0, 3682, 3944, +0, 3685, 3944, +0, 3689, 3944, +0, 3695, 3944, +0, 3702, 3944, +0, 3712, 3944, +0, 3725, 3944, +0, 3741, 3944, +0, 3762, 3944, +0, 3788, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3912, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3661, +0, 3944, 3271, +0, 4076, 0, +0, 4095, 0, +0, 3671, 3944, +0, 3671, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3685, 3944, +0, 3689, 3944, +0, 3694, 3944, +0, 3702, 3944, +0, 3711, 3944, +0, 3724, 3944, +0, 3740, 3944, +0, 3761, 3944, +0, 3788, 3944, +0, 3821, 3944, +0, 3862, 3944, +0, 3912, 3944, +0, 3944, 3916, +0, 3944, 3824, +0, 3944, 3661, +0, 3944, 3272, +0, 4076, 0, +0, 4095, 0, +0, 3670, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3678, 3944, +0, 3680, 3944, +0, 3684, 3944, +0, 3688, 3944, +0, 3694, 3944, +0, 3701, 3944, +0, 3711, 3944, +0, 3723, 3944, +0, 3740, 3944, +0, 3761, 3944, +0, 3787, 3944, +0, 3820, 3944, +0, 3862, 3944, +0, 3911, 3944, +0, 3944, 3916, +0, 3944, 3824, +0, 3944, 3661, +0, 3944, 3273, +0, 4076, 0, +0, 4095, 0, +0, 3669, 3944, +0, 3669, 3944, +0, 3669, 3944, +0, 3669, 3944, +0, 3670, 3944, +0, 3670, 3944, +0, 3670, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3692, 3944, +0, 3700, 3944, +0, 3710, 3944, +0, 3722, 3944, +0, 3739, 3944, +0, 3760, 3944, +0, 3786, 3944, +0, 3820, 3944, +0, 3861, 3944, +0, 3910, 3944, +0, 3944, 3916, +0, 3944, 3824, +0, 3944, 3662, +0, 3944, 3275, +0, 4076, 0, +0, 4095, 0, +0, 3667, 3944, +0, 3667, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3669, 3944, +0, 3670, 3944, +0, 3671, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3676, 3944, +0, 3678, 3944, +0, 3681, 3944, +0, 3685, 3944, +0, 3691, 3944, +0, 3699, 3944, +0, 3708, 3944, +0, 3721, 3944, +0, 3737, 3944, +0, 3758, 3944, +0, 3785, 3944, +0, 3819, 3944, +0, 3860, 3944, +0, 3910, 3944, +0, 3944, 3917, +0, 3944, 3825, +0, 3944, 3663, +0, 3944, 3277, +0, 4076, 0, +0, 4095, 0, +0, 3665, 3944, +0, 3665, 3944, +0, 3665, 3944, +0, 3665, 3944, +0, 3665, 3944, +0, 3666, 3944, +0, 3666, 3944, +0, 3666, 3944, +0, 3667, 3944, +0, 3668, 3944, +0, 3669, 3944, +0, 3671, 3944, +0, 3673, 3944, +0, 3676, 3943, +0, 3679, 3943, +0, 3683, 3943, +0, 3689, 3943, +0, 3697, 3943, +0, 3706, 3943, +0, 3719, 3943, +0, 3736, 3943, +0, 3757, 3943, +0, 3784, 3943, +0, 3817, 3943, +0, 3859, 3943, +0, 3909, 3943, +0, 3943, 3917, +0, 3943, 3826, +0, 3943, 3664, +0, 3943, 3279, +0, 4076, 0, +0, 4095, 0, +0, 3661, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3663, 3944, +0, 3663, 3944, +0, 3664, 3944, +0, 3665, 3944, +0, 3666, 3944, +0, 3668, 3944, +0, 3670, 3944, +0, 3673, 3943, +0, 3677, 3943, +0, 3681, 3943, +0, 3687, 3943, +0, 3694, 3943, +0, 3704, 3943, +0, 3717, 3943, +0, 3733, 3943, +0, 3755, 3943, +0, 3781, 3943, +0, 3815, 3943, +0, 3857, 3943, +0, 3907, 3943, +0, 3943, 3918, +0, 3943, 3827, +0, 3943, 3665, +0, 3943, 3283, +0, 4075, 0, +0, 4095, 0, +0, 3657, 3944, +0, 3657, 3944, +0, 3657, 3944, +0, 3657, 3944, +0, 3658, 3944, +0, 3658, 3944, +0, 3658, 3944, +0, 3659, 3944, +0, 3659, 3944, +0, 3661, 3944, +0, 3662, 3944, +0, 3663, 3944, +0, 3666, 3944, +0, 3668, 3943, +0, 3672, 3943, +0, 3677, 3943, +0, 3683, 3943, +0, 3691, 3943, +0, 3701, 3943, +0, 3713, 3943, +0, 3730, 3943, +0, 3752, 3943, +0, 3779, 3943, +0, 3813, 3943, +0, 3854, 3943, +0, 3905, 3943, +0, 3943, 3920, +0, 3943, 3828, +0, 3943, 3667, +0, 3943, 3287, +0, 4075, 0, +0, 4095, 0, +0, 3651, 3944, +0, 3651, 3944, +0, 3651, 3944, +0, 3651, 3944, +0, 3652, 3944, +0, 3652, 3944, +0, 3652, 3944, +0, 3653, 3944, +0, 3653, 3944, +0, 3654, 3944, +0, 3656, 3944, +0, 3657, 3944, +0, 3659, 3944, +0, 3662, 3943, +0, 3666, 3943, +0, 3672, 3943, +0, 3679, 3942, +0, 3686, 3942, +0, 3696, 3942, +0, 3709, 3942, +0, 3726, 3942, +0, 3748, 3942, +0, 3775, 3942, +0, 3809, 3942, +0, 3851, 3942, +0, 3902, 3942, +0, 3942, 3921, +0, 3942, 3830, +0, 3942, 3670, +0, 3942, 3293, +0, 4075, 0, +0, 4095, 0, +0, 3643, 3944, +0, 3643, 3944, +0, 3643, 3944, +0, 3643, 3944, +0, 3643, 3944, +0, 3644, 3944, +0, 3644, 3944, +0, 3645, 3944, +0, 3645, 3944, +0, 3646, 3944, +0, 3648, 3944, +0, 3649, 3944, +0, 3651, 3944, +0, 3655, 3943, +0, 3659, 3943, +0, 3664, 3943, +0, 3671, 3942, +0, 3680, 3941, +0, 3690, 3941, +0, 3703, 3941, +0, 3720, 3941, +0, 3742, 3941, +0, 3770, 3941, +0, 3805, 3941, +0, 3847, 3941, +0, 3898, 3941, +0, 3941, 3923, +0, 3941, 3832, +0, 3941, 3674, +0, 3941, 3302, +0, 4074, 0, +0, 4095, 0, +0, 3631, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3633, 3944, +0, 3633, 3944, +0, 3634, 3944, +0, 3635, 3944, +0, 3636, 3944, +0, 3638, 3944, +0, 3640, 3944, +0, 3644, 3943, +0, 3648, 3943, +0, 3653, 3943, +0, 3660, 3942, +0, 3669, 3941, +0, 3682, 3940, +0, 3695, 3940, +0, 3713, 3940, +0, 3735, 3940, +0, 3763, 3940, +0, 3798, 3940, +0, 3841, 3940, +0, 3893, 3940, +0, 3940, 3926, +0, 3940, 3836, +0, 3940, 3678, +0, 3940, 3312, +0, 4073, 0, +0, 4095, 0, +0, 3616, 3944, +0, 3616, 3944, +0, 3616, 3944, +0, 3616, 3944, +0, 3617, 3944, +0, 3617, 3944, +0, 3617, 3944, +0, 3618, 3944, +0, 3619, 3944, +0, 3620, 3944, +0, 3621, 3944, +0, 3623, 3944, +0, 3625, 3944, +0, 3628, 3943, +0, 3632, 3943, +0, 3638, 3943, +0, 3646, 3942, +0, 3655, 3941, +0, 3668, 3940, +0, 3684, 3939, +0, 3702, 3939, +0, 3725, 3939, +0, 3754, 3939, +0, 3790, 3939, +0, 3833, 3939, +0, 3886, 3939, +0, 3939, 3929, +0, 3939, 3840, +0, 3939, 3685, +0, 3939, 3326, +0, 4072, 0, +0, 4095, 0, +0, 3594, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3596, 3944, +0, 3596, 3944, +0, 3597, 3944, +0, 3598, 3944, +0, 3600, 3944, +0, 3602, 3944, +0, 3604, 3944, +0, 3607, 3943, +0, 3612, 3943, +0, 3618, 3943, +0, 3626, 3942, +0, 3635, 3941, +0, 3649, 3940, +0, 3666, 3939, +0, 3688, 3937, +0, 3711, 3937, +0, 3741, 3937, +0, 3777, 3937, +0, 3822, 3937, +0, 3876, 3937, +0, 3937, 3934, +0, 3937, 3846, +0, 3937, 3692, +0, 3937, 3344, +0, 4071, 0, +0, 4095, 0, +0, 3564, 3944, +0, 3564, 3944, +0, 3564, 3944, +0, 3564, 3944, +0, 3564, 3944, +0, 3565, 3944, +0, 3565, 3944, +0, 3566, 3944, +0, 3567, 3944, +0, 3568, 3944, +0, 3569, 3944, +0, 3571, 3944, +0, 3574, 3944, +0, 3578, 3943, +0, 3583, 3943, +0, 3589, 3943, +0, 3597, 3942, +0, 3608, 3941, +0, 3622, 3940, +0, 3640, 3939, +0, 3663, 3937, +0, 3692, 3934, +0, 3723, 3934, +0, 3761, 3934, +0, 3808, 3934, +0, 3863, 3934, +0, 3928, 3934, +0, 3934, 3853, +0, 3934, 3703, +0, 3934, 3366, +0, 4069, 0, +0, 4095, 0, +0, 3520, 3944, +0, 3520, 3944, +0, 3520, 3944, +0, 3520, 3944, +0, 3520, 3944, +0, 3521, 3944, +0, 3521, 3944, +0, 3522, 3944, +0, 3523, 3944, +0, 3524, 3944, +0, 3526, 3944, +0, 3528, 3944, +0, 3531, 3944, +0, 3535, 3943, +0, 3540, 3943, +0, 3547, 3943, +0, 3556, 3942, +0, 3568, 3941, +0, 3583, 3940, +0, 3603, 3939, +0, 3628, 3937, +0, 3659, 3934, +0, 3698, 3931, +0, 3738, 3931, +0, 3787, 3931, +0, 3845, 3931, +0, 3913, 3931, +0, 3931, 3863, +0, 3931, 3717, +0, 3931, 3395, +0, 4066, 0, +0, 4095, 0, +0, 3452, 3944, +0, 3452, 3944, +0, 3453, 3944, +0, 3453, 3944, +0, 3453, 3944, +0, 3454, 3944, +0, 3454, 3944, +0, 3455, 3944, +0, 3456, 3944, +0, 3458, 3944, +0, 3459, 3944, +0, 3462, 3944, +0, 3466, 3944, +0, 3470, 3943, +0, 3476, 3943, +0, 3484, 3943, +0, 3494, 3942, +0, 3507, 3941, +0, 3525, 3940, +0, 3547, 3939, +0, 3575, 3937, +0, 3611, 3934, +0, 3654, 3931, +0, 3706, 3926, +0, 3758, 3926, +0, 3820, 3926, +0, 3891, 3926, +0, 3926, 3877, +0, 3926, 3735, +0, 3926, 3430, +0, 4063, 0, +2137, 4095, 0, +0, 3344, 3944, +0, 3344, 3944, +0, 3344, 3944, +0, 3344, 3944, +0, 3345, 3944, +0, 3346, 3944, +0, 3346, 3944, +0, 3347, 3944, +0, 3349, 3944, +0, 3351, 3944, +0, 3353, 3944, +0, 3356, 3944, +0, 3361, 3944, +0, 3366, 3943, +0, 3374, 3943, +0, 3384, 3943, +0, 3396, 3942, +0, 3413, 3941, +0, 3434, 3940, +0, 3461, 3939, +0, 3495, 3937, +0, 3537, 3934, +0, 3587, 3931, +0, 3647, 3926, +1928, 3716, 3920, +1928, 3783, 3920, +1928, 3860, 3920, +1928, 3920, 3893, +1928, 3920, 3758, +1928, 3920, 3474, +0, 4058, 2157, +2915, 4095, 0, +0, 3140, 3944, +0, 3140, 3944, +0, 3140, 3944, +0, 3141, 3944, +0, 3142, 3944, +0, 3143, 3944, +0, 3144, 3944, +0, 3145, 3944, +0, 3147, 3944, +0, 3151, 3944, +0, 3154, 3944, +0, 3159, 3944, +0, 3166, 3944, +0, 3175, 3943, +0, 3186, 3943, +0, 3201, 3943, +0, 3220, 3942, +0, 3244, 3941, +0, 3275, 3940, +0, 3313, 3939, +0, 3359, 3937, +0, 3414, 3934, +0, 3479, 3931, +0, 3553, 3926, +1928, 3637, 3920, +2854, 3729, 3912, +2854, 3814, 3912, +2854, 3908, 3912, +2854, 3912, 3787, +2854, 3912, 3526, +2063, 4052, 2689, +3253, 4095, 0, +0, 2497, 3944, +0, 2498, 3944, +0, 2500, 3944, +0, 2502, 3944, +0, 2505, 3944, +0, 2508, 3944, +0, 2513, 3944, +0, 2520, 3944, +0, 2528, 3944, +0, 2539, 3944, +0, 2553, 3944, +0, 2572, 3944, +0, 2596, 3944, +0, 2625, 3943, +0, 2662, 3943, +0, 2708, 3943, +0, 2762, 3942, +0, 2826, 3941, +0, 2899, 3940, +0, 2982, 3939, +0, 3073, 3937, +0, 3172, 3934, +0, 3277, 3931, +0, 3388, 3926, +1928, 3504, 3920, +2854, 3624, 3912, +3204, 3746, 3900, +3204, 3853, 3900, +3204, 3900, 3822, +3204, 3900, 3588, +2987, 4044, 2986, +3494, 4095, 2192, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3943, +0, 0, 3943, +0, 0, 3943, +0, 0, 3942, +0, 0, 3941, +0, 0, 3940, +0, 0, 3939, +0, 0, 3937, +0, 1863, 3934, +0, 2650, 3931, +0, 2988, 3926, +1928, 3229, 3920, +2854, 3428, 3912, +3204, 3605, 3900, +3450, 3768, 3884, +3450, 3884, 3867, +3450, 3884, 3660, +3435, 4032, 3336, +3693, 4095, 3118, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3943, +0, 0, 3943, +0, 0, 3943, +0, 0, 3942, +0, 0, 3941, +0, 0, 3940, +0, 0, 3939, +0, 0, 3937, +0, 0, 3934, +0, 0, 3931, +2023, 0, 3926, +2556, 1928, 3920, +2854, 2854, 3912, +3204, 3302, 3900, +3450, 3579, 3884, +3652, 3796, 3862, +3652, 3862, 3741, +3711, 4016, 3583, +3869, 4095, 3469, +3269, 0, 3944, +3269, 0, 3944, +3269, 0, 3944, +3269, 0, 3944, +3270, 0, 3944, +3270, 0, 3944, +3270, 0, 3944, +3271, 0, 3944, +3271, 0, 3944, +3272, 0, 3944, +3273, 0, 3944, +3275, 0, 3944, +3277, 0, 3944, +3279, 0, 3943, +3283, 0, 3943, +3287, 0, 3943, +3293, 0, 3942, +3302, 0, 3941, +3312, 0, 3940, +3326, 0, 3939, +3344, 0, 3937, +3366, 0, 3934, +3395, 0, 3931, +3430, 0, 3926, +3474, 1928, 3920, +3526, 2854, 3912, +3588, 3204, 3900, +3660, 3450, 3884, +3741, 3652, 3862, +3830, 3830, 3830, +3928, 3994, 3784, +4032, 4095, 3714, +3791, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3793, 0, 4076, +3793, 0, 4076, +3793, 0, 4076, +3794, 0, 4076, +3795, 0, 4076, +3796, 0, 4075, +3797, 0, 4075, +3799, 0, 4075, +3802, 0, 4074, +3805, 0, 4073, +3810, 0, 4072, +3816, 0, 4071, +3824, 0, 4069, +3835, 0, 4066, +3849, 0, 4063, +3867, 0, 4058, +3890, 2063, 4052, +3919, 2986, 4044, +3955, 3336, 4032, +3999, 3583, 4016, +3994, 3784, 3928, +3994, 3873, 3784, +4095, 4095, 3714, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4088, 0, 4095, +4088, 0, 4095, +4088, 0, 4095, +4088, 0, 4095, +4089, 0, 4095, +4089, 0, 4095, +4090, 0, 4095, +4091, 0, 4095, +4092, 0, 4095, +4094, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 2192, 4095, +4095, 3118, 4095, +4095, 3469, 4095, +4095, 3714, 4032, +4095, 3714, 3844, +4095, 3924, 3714, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3819, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3846, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3922, 4076, +0, 3955, 4076, +0, 3996, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3791, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3819, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3922, 4076, +0, 3955, 4076, +0, 3996, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3819, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3955, 4076, +0, 3996, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3955, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3955, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3828, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3402, +0, 4095, 0, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3812, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3828, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3402, +0, 4095, 0, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3828, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3857, 4076, +0, 3873, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3402, +0, 4095, 0, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3814, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3827, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3857, 4076, +0, 3873, 4076, +0, 3894, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4044, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3403, +0, 4095, 0, +0, 3804, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3814, 4076, +0, 3817, 4076, +0, 3821, 4076, +0, 3827, 4076, +0, 3834, 4076, +0, 3844, 4076, +0, 3856, 4076, +0, 3873, 4076, +0, 3894, 4076, +0, 3921, 4076, +0, 3953, 4076, +0, 3995, 4076, +0, 4044, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3793, +0, 4076, 3403, +0, 4095, 0, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3821, 4076, +0, 3826, 4076, +0, 3834, 4076, +0, 3843, 4076, +0, 3856, 4076, +0, 3872, 4076, +0, 3893, 4076, +0, 3920, 4076, +0, 3953, 4076, +0, 3994, 4076, +0, 4044, 4076, +0, 4076, 4048, +0, 4076, 3955, +0, 4076, 3793, +0, 4076, 3404, +0, 4095, 0, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3816, 4076, +0, 3820, 4076, +0, 3826, 4076, +0, 3833, 4076, +0, 3843, 4076, +0, 3855, 4076, +0, 3872, 4076, +0, 3892, 4076, +0, 3919, 4076, +0, 3953, 4076, +0, 3994, 4076, +0, 4043, 4076, +0, 4076, 4048, +0, 4076, 3956, +0, 4076, 3793, +0, 4076, 3405, +0, 4095, 0, +0, 3801, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3802, 4076, +0, 3802, 4076, +0, 3802, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3807, 4076, +0, 3809, 4076, +0, 3812, 4076, +0, 3814, 4076, +0, 3819, 4076, +0, 3824, 4076, +0, 3832, 4076, +0, 3841, 4076, +0, 3854, 4076, +0, 3871, 4076, +0, 3891, 4076, +0, 3918, 4076, +0, 3952, 4076, +0, 3993, 4076, +0, 4043, 4076, +0, 4076, 4048, +0, 4076, 3956, +0, 4076, 3794, +0, 4076, 3407, +0, 4095, 0, +0, 3799, 4076, +0, 3799, 4076, +0, 3799, 4076, +0, 3799, 4076, +0, 3800, 4076, +0, 3800, 4076, +0, 3800, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3802, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3813, 4076, +0, 3817, 4076, +0, 3823, 4076, +0, 3830, 4076, +0, 3840, 4076, +0, 3853, 4076, +0, 3869, 4076, +0, 3890, 4076, +0, 3917, 4076, +0, 3950, 4076, +0, 3992, 4076, +0, 4042, 4076, +0, 4076, 4049, +0, 4076, 3957, +0, 4076, 3795, +0, 4076, 3409, +0, 4095, 0, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3798, 4076, +0, 3798, 4076, +0, 3798, 4076, +0, 3799, 4076, +0, 3800, 4076, +0, 3801, 4076, +0, 3803, 4076, +0, 3805, 4076, +0, 3808, 4075, +0, 3811, 4075, +0, 3816, 4075, +0, 3821, 4075, +0, 3829, 4075, +0, 3838, 4075, +0, 3851, 4075, +0, 3868, 4075, +0, 3889, 4075, +0, 3916, 4075, +0, 3949, 4075, +0, 3991, 4075, +0, 4041, 4075, +0, 4075, 4049, +0, 4075, 3958, +0, 4075, 3796, +0, 4075, 3411, +0, 4095, 0, +0, 3793, 4076, +0, 3793, 4076, +0, 3793, 4076, +0, 3794, 4076, +0, 3794, 4076, +0, 3794, 4076, +0, 3794, 4076, +0, 3795, 4076, +0, 3795, 4076, +0, 3796, 4076, +0, 3797, 4076, +0, 3798, 4076, +0, 3800, 4076, +0, 3802, 4076, +0, 3805, 4075, +0, 3809, 4075, +0, 3813, 4075, +0, 3818, 4075, +0, 3826, 4075, +0, 3836, 4075, +0, 3849, 4075, +0, 3865, 4075, +0, 3887, 4075, +0, 3913, 4075, +0, 3947, 4075, +0, 3989, 4075, +0, 4039, 4075, +0, 4075, 4050, +0, 4075, 3959, +0, 4075, 3797, +0, 4075, 3415, +0, 4095, 0, +0, 3789, 4076, +0, 3789, 4076, +0, 3789, 4076, +0, 3789, 4076, +0, 3790, 4076, +0, 3790, 4076, +0, 3790, 4076, +0, 3790, 4076, +0, 3791, 4076, +0, 3791, 4076, +0, 3793, 4076, +0, 3794, 4076, +0, 3795, 4076, +0, 3798, 4076, +0, 3801, 4075, +0, 3804, 4075, +0, 3810, 4075, +0, 3815, 4075, +0, 3823, 4075, +0, 3833, 4075, +0, 3846, 4075, +0, 3862, 4075, +0, 3884, 4075, +0, 3911, 4075, +0, 3945, 4075, +0, 3986, 4075, +0, 4037, 4075, +0, 4075, 4051, +0, 4075, 3960, +0, 4075, 3799, +0, 4075, 3419, +0, 4095, 0, +0, 3783, 4076, +0, 3783, 4076, +0, 3783, 4076, +0, 3783, 4076, +0, 3783, 4076, +0, 3784, 4076, +0, 3784, 4076, +0, 3784, 4076, +0, 3785, 4076, +0, 3785, 4076, +0, 3787, 4076, +0, 3787, 4076, +0, 3789, 4076, +0, 3792, 4076, +0, 3795, 4075, +0, 3798, 4075, +0, 3803, 4075, +0, 3810, 4074, +0, 3818, 4074, +0, 3828, 4074, +0, 3841, 4074, +0, 3858, 4074, +0, 3880, 4074, +0, 3907, 4074, +0, 3941, 4074, +0, 3983, 4074, +0, 4034, 4074, +0, 4074, 4053, +0, 4074, 3962, +0, 4074, 3802, +0, 4074, 3426, +0, 4095, 0, +0, 3774, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3776, 4076, +0, 3776, 4076, +0, 3777, 4076, +0, 3777, 4076, +0, 3778, 4076, +0, 3780, 4076, +0, 3781, 4076, +0, 3784, 4076, +0, 3787, 4075, +0, 3790, 4075, +0, 3796, 4075, +0, 3803, 4074, +0, 3812, 4073, +0, 3822, 4073, +0, 3835, 4073, +0, 3852, 4073, +0, 3874, 4073, +0, 3902, 4073, +0, 3937, 4073, +0, 3979, 4073, +0, 4030, 4073, +0, 4073, 4055, +0, 4073, 3964, +0, 4073, 3805, +0, 4073, 3434, +0, 4095, 0, +0, 3763, 4076, +0, 3763, 4076, +0, 3763, 4076, +0, 3764, 4076, +0, 3764, 4076, +0, 3764, 4076, +0, 3764, 4076, +0, 3765, 4076, +0, 3765, 4076, +0, 3766, 4076, +0, 3767, 4076, +0, 3768, 4076, +0, 3770, 4076, +0, 3773, 4076, +0, 3776, 4075, +0, 3780, 4075, +0, 3785, 4075, +0, 3792, 4074, +0, 3801, 4073, +0, 3814, 4072, +0, 3827, 4072, +0, 3845, 4072, +0, 3867, 4072, +0, 3895, 4072, +0, 3930, 4072, +0, 3973, 4072, +0, 4025, 4072, +0, 4072, 4058, +0, 4072, 3968, +0, 4072, 3810, +0, 4072, 3444, +0, 4095, 0, +0, 3748, 4076, +0, 3748, 4076, +0, 3748, 4076, +0, 3748, 4076, +0, 3748, 4076, +0, 3749, 4076, +0, 3749, 4076, +0, 3749, 4076, +0, 3750, 4076, +0, 3751, 4076, +0, 3752, 4076, +0, 3753, 4076, +0, 3755, 4076, +0, 3757, 4076, +0, 3760, 4075, +0, 3765, 4075, +0, 3770, 4075, +0, 3777, 4074, +0, 3787, 4073, +0, 3800, 4072, +0, 3816, 4071, +0, 3834, 4071, +0, 3857, 4071, +0, 3886, 4071, +0, 3921, 4071, +0, 3965, 4071, +0, 4018, 4071, +0, 4071, 4061, +0, 4071, 3972, +0, 4071, 3816, +0, 4071, 3458, +0, 4095, 0, +0, 3726, 4076, +0, 3726, 4076, +0, 3726, 4076, +0, 3727, 4076, +0, 3727, 4076, +0, 3727, 4076, +0, 3727, 4076, +0, 3728, 4076, +0, 3728, 4076, +0, 3729, 4076, +0, 3730, 4076, +0, 3732, 4076, +0, 3734, 4076, +0, 3736, 4076, +0, 3739, 4075, +0, 3744, 4075, +0, 3750, 4075, +0, 3757, 4074, +0, 3768, 4073, +0, 3781, 4072, +0, 3798, 4071, +0, 3820, 4069, +0, 3843, 4069, +0, 3873, 4069, +0, 3910, 4069, +0, 3954, 4069, +0, 4008, 4069, +0, 4069, 4066, +0, 4069, 3978, +0, 4069, 3824, +0, 4069, 3475, +0, 4095, 0, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3697, 4076, +0, 3697, 4076, +0, 3698, 4076, +0, 3699, 4076, +0, 3700, 4076, +0, 3701, 4076, +0, 3703, 4076, +0, 3706, 4076, +0, 3710, 4075, +0, 3714, 4075, +0, 3721, 4075, +0, 3729, 4074, +0, 3740, 4073, +0, 3754, 4072, +0, 3772, 4071, +0, 3795, 4069, +0, 3824, 4066, +0, 3855, 4066, +0, 3893, 4066, +0, 3940, 4066, +0, 3995, 4066, +0, 4060, 4066, +0, 4066, 3985, +0, 4066, 3835, +0, 4066, 3498, +0, 4095, 0, +0, 3651, 4076, +0, 3651, 4076, +0, 3651, 4076, +0, 3652, 4076, +0, 3652, 4076, +0, 3652, 4076, +0, 3653, 4076, +0, 3653, 4076, +0, 3654, 4076, +0, 3655, 4076, +0, 3656, 4076, +0, 3658, 4076, +0, 3660, 4076, +0, 3663, 4076, +0, 3667, 4075, +0, 3672, 4075, +0, 3679, 4075, +0, 3688, 4074, +0, 3700, 4073, +0, 3715, 4072, +0, 3735, 4071, +0, 3760, 4069, +0, 3791, 4066, +0, 3830, 4063, +0, 3870, 4063, +0, 3919, 4063, +0, 3977, 4063, +0, 4045, 4063, +0, 4063, 3995, +0, 4063, 3849, +0, 4063, 3527, +0, 4095, 0, +0, 3584, 4076, +0, 3584, 4076, +0, 3585, 4076, +0, 3585, 4076, +0, 3585, 4076, +0, 3585, 4076, +0, 3586, 4076, +0, 3586, 4076, +0, 3587, 4076, +0, 3588, 4076, +0, 3590, 4076, +0, 3592, 4076, +0, 3594, 4076, +0, 3597, 4076, +0, 3602, 4075, +0, 3608, 4075, +0, 3616, 4075, +0, 3626, 4074, +0, 3640, 4073, +0, 3657, 4072, +0, 3679, 4071, +0, 3708, 4069, +0, 3743, 4066, +0, 3786, 4063, +0, 3838, 4058, +0, 3890, 4058, +0, 3952, 4058, +0, 4023, 4058, +0, 4058, 4008, +0, 4058, 3867, +0, 4058, 3562, +0, 4095, 0, +0, 3475, 4076, +0, 3475, 4076, +0, 3476, 4076, +0, 3476, 4076, +0, 3476, 4076, +0, 3477, 4076, +0, 3477, 4076, +0, 3478, 4076, +0, 3479, 4076, +0, 3480, 4076, +0, 3482, 4076, +0, 3485, 4076, +0, 3488, 4076, +0, 3492, 4076, +0, 3498, 4075, +0, 3505, 4075, +0, 3515, 4075, +0, 3528, 4074, +0, 3545, 4073, +0, 3566, 4072, +0, 3593, 4071, +0, 3627, 4069, +0, 3669, 4066, +0, 3719, 4063, +0, 3779, 4058, +2063, 3848, 4052, +2063, 3915, 4052, +2063, 3992, 4052, +2063, 4052, 4025, +2063, 4052, 3890, +2063, 4052, 3606, +0, 4095, 2266, +0, 3271, 4076, +0, 3272, 4076, +0, 3272, 4076, +0, 3272, 4076, +0, 3273, 4076, +0, 3273, 4076, +0, 3274, 4076, +0, 3276, 4076, +0, 3277, 4076, +0, 3279, 4076, +0, 3282, 4076, +0, 3286, 4076, +0, 3291, 4076, +0, 3297, 4076, +0, 3306, 4075, +0, 3318, 4075, +0, 3333, 4075, +0, 3351, 4074, +0, 3376, 4073, +0, 3407, 4072, +0, 3445, 4071, +0, 3491, 4069, +0, 3546, 4066, +0, 3611, 4063, +0, 3685, 4058, +2063, 3769, 4052, +2986, 3861, 4044, +2986, 3947, 4044, +2986, 4040, 4044, +2986, 4044, 3919, +2986, 4044, 3659, +2192, 4095, 2814, +0, 2626, 4076, +0, 2627, 4076, +0, 2628, 4076, +0, 2630, 4076, +0, 2632, 4076, +0, 2635, 4076, +0, 2639, 4076, +0, 2644, 4076, +0, 2650, 4076, +0, 2659, 4076, +0, 2670, 4076, +0, 2684, 4076, +0, 2703, 4076, +0, 2726, 4076, +0, 2756, 4075, +0, 2793, 4075, +0, 2839, 4075, +0, 2893, 4074, +0, 2957, 4073, +0, 3031, 4072, +0, 3113, 4071, +0, 3205, 4069, +0, 3303, 4066, +0, 3409, 4063, +0, 3520, 4058, +2063, 3636, 4052, +2986, 3755, 4044, +3336, 3878, 4032, +3336, 3986, 4032, +3336, 4032, 3955, +3336, 4032, 3720, +3121, 4095, 3118, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4075, +0, 0, 4075, +0, 0, 4075, +0, 0, 4074, +0, 0, 4073, +0, 0, 4072, +0, 0, 4071, +0, 0, 4069, +0, 1985, 4066, +0, 2781, 4063, +0, 3119, 4058, +2063, 3361, 4052, +2986, 3561, 4044, +3336, 3737, 4032, +3583, 3900, 4016, +3583, 4016, 3999, +3583, 4016, 3792, +3568, 4095, 3469, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4075, +0, 0, 4075, +0, 0, 4075, +0, 0, 4074, +0, 0, 4073, +0, 0, 4072, +0, 0, 4071, +0, 0, 4069, +0, 0, 4066, +0, 0, 4063, +2157, 0, 4058, +2689, 2063, 4052, +2986, 2987, 4044, +3336, 3435, 4032, +3583, 3711, 4016, +3784, 3928, 3994, +3784, 3994, 3873, +3844, 4095, 3714, +3401, 0, 4076, +3401, 0, 4076, +3401, 0, 4076, +3401, 0, 4076, +3401, 0, 4076, +3402, 0, 4076, +3402, 0, 4076, +3402, 0, 4076, +3403, 0, 4076, +3403, 0, 4076, +3404, 0, 4076, +3405, 0, 4076, +3407, 0, 4076, +3409, 0, 4076, +3411, 0, 4075, +3415, 0, 4075, +3419, 0, 4075, +3426, 0, 4074, +3434, 0, 4073, +3444, 0, 4072, +3458, 0, 4071, +3475, 0, 4069, +3498, 0, 4066, +3527, 0, 4063, +3562, 0, 4058, +3606, 2063, 4052, +3659, 2986, 4044, +3720, 3336, 4032, +3792, 3583, 4016, +3873, 3784, 3994, +3962, 3962, 3962, +4060, 4095, 3916, +3924, 0, 4095, +3924, 0, 4095, +3924, 0, 4095, +3924, 0, 4095, +3924, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3926, 0, 4095, +3926, 0, 4095, +3927, 0, 4095, +3927, 0, 4095, +3929, 0, 4095, +3930, 0, 4095, +3932, 0, 4095, +3935, 0, 4095, +3938, 0, 4095, +3943, 0, 4095, +3949, 0, 4095, +3957, 0, 4095, +3968, 0, 4095, +3982, 0, 4095, +4000, 0, 4095, +4023, 2192, 4095, +4051, 3118, 4095, +4087, 3469, 4095, +4095, 3714, 4095, +4095, 3916, 4060, +4095, 4005, 3916, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3946, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4007, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3533, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3946, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3533, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3533, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3943, 4095, +0, 3945, 4095, +0, 3947, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3943, 4095, +0, 3945, 4095, +0, 3947, 4095, +0, 3950, 4095, +0, 3955, 4095, +0, 3960, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4053, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3943, 4095, +0, 3945, 4095, +0, 3947, 4095, +0, 3950, 4095, +0, 3954, 4095, +0, 3960, 4095, +0, 3967, 4095, +0, 3977, 4095, +0, 3989, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4053, 4095, +0, 4086, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3943, 4095, +0, 3944, 4095, +0, 3947, 4095, +0, 3950, 4095, +0, 3954, 4095, +0, 3960, 4095, +0, 3967, 4095, +0, 3977, 4095, +0, 3989, 4095, +0, 4005, 4095, +0, 4026, 4095, +0, 4053, 4095, +0, 4086, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3925, +0, 4095, 3535, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3946, 4095, +0, 3950, 4095, +0, 3954, 4095, +0, 3959, 4095, +0, 3967, 4095, +0, 3976, 4095, +0, 3989, 4095, +0, 4005, 4095, +0, 4026, 4095, +0, 4053, 4095, +0, 4086, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3925, +0, 4095, 3536, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3943, 4095, +0, 3946, 4095, +0, 3949, 4095, +0, 3953, 4095, +0, 3959, 4095, +0, 3966, 4095, +0, 3976, 4095, +0, 3988, 4095, +0, 4005, 4095, +0, 4026, 4095, +0, 4052, 4095, +0, 4085, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3926, +0, 4095, 3537, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3952, 4095, +0, 3958, 4095, +0, 3965, 4095, +0, 3975, 4095, +0, 3988, 4095, +0, 4004, 4095, +0, 4025, 4095, +0, 4051, 4095, +0, 4085, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3926, +0, 4095, 3538, +0, 3933, 4095, +0, 3933, 4095, +0, 3933, 4095, +0, 3933, 4095, +0, 3934, 4095, +0, 3934, 4095, +0, 3934, 4095, +0, 3934, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3936, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3944, 4095, +0, 3947, 4095, +0, 3951, 4095, +0, 3957, 4095, +0, 3964, 4095, +0, 3974, 4095, +0, 3986, 4095, +0, 4003, 4095, +0, 4024, 4095, +0, 4051, 4095, +0, 4084, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4089, +0, 4095, 3927, +0, 4095, 3539, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3933, 4095, +0, 3933, 4095, +0, 3934, 4095, +0, 3935, 4095, +0, 3936, 4095, +0, 3938, 4095, +0, 3940, 4095, +0, 3942, 4095, +0, 3945, 4095, +0, 3950, 4095, +0, 3955, 4095, +0, 3963, 4095, +0, 3972, 4095, +0, 3985, 4095, +0, 4002, 4095, +0, 4023, 4095, +0, 4049, 4095, +0, 4083, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4089, +0, 4095, 3927, +0, 4095, 3541, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3930, 4095, +0, 3930, 4095, +0, 3930, 4095, +0, 3931, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3934, 4095, +0, 3935, 4095, +0, 3937, 4095, +0, 3940, 4095, +0, 3944, 4095, +0, 3948, 4095, +0, 3953, 4095, +0, 3961, 4095, +0, 3971, 4095, +0, 3983, 4095, +0, 4000, 4095, +0, 4021, 4095, +0, 4048, 4095, +0, 4082, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4090, +0, 4095, 3929, +0, 4095, 3544, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3927, 4095, +0, 3927, 4095, +0, 3927, 4095, +0, 3927, 4095, +0, 3928, 4095, +0, 3929, 4095, +0, 3930, 4095, +0, 3932, 4095, +0, 3934, 4095, +0, 3937, 4095, +0, 3941, 4095, +0, 3945, 4095, +0, 3951, 4095, +0, 3959, 4095, +0, 3968, 4095, +0, 3981, 4095, +0, 3998, 4095, +0, 4019, 4095, +0, 4046, 4095, +0, 4080, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4091, +0, 4095, 3930, +0, 4095, 3547, +0, 3921, 4095, +0, 3921, 4095, +0, 3921, 4095, +0, 3921, 4095, +0, 3921, 4095, +0, 3922, 4095, +0, 3922, 4095, +0, 3922, 4095, +0, 3923, 4095, +0, 3923, 4095, +0, 3924, 4095, +0, 3925, 4095, +0, 3926, 4095, +0, 3927, 4095, +0, 3930, 4095, +0, 3933, 4095, +0, 3937, 4095, +0, 3942, 4095, +0, 3947, 4095, +0, 3955, 4095, +0, 3965, 4095, +0, 3978, 4095, +0, 3994, 4095, +0, 4016, 4095, +0, 4043, 4095, +0, 4077, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4092, +0, 4095, 3932, +0, 4095, 3552, +0, 3915, 4095, +0, 3915, 4095, +0, 3915, 4095, +0, 3915, 4095, +0, 3915, 4095, +0, 3916, 4095, +0, 3916, 4095, +0, 3916, 4095, +0, 3917, 4095, +0, 3917, 4095, +0, 3918, 4095, +0, 3919, 4095, +0, 3920, 4095, +0, 3922, 4095, +0, 3924, 4095, +0, 3927, 4095, +0, 3931, 4095, +0, 3936, 4095, +0, 3943, 4095, +0, 3950, 4095, +0, 3961, 4095, +0, 3974, 4095, +0, 3990, 4095, +0, 4012, 4095, +0, 4039, 4095, +0, 4073, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4094, +0, 4095, 3935, +0, 4095, 3558, +0, 3907, 4095, +0, 3907, 4095, +0, 3907, 4095, +0, 3907, 4095, +0, 3907, 4095, +0, 3908, 4095, +0, 3908, 4095, +0, 3908, 4095, +0, 3908, 4095, +0, 3909, 4095, +0, 3910, 4095, +0, 3910, 4095, +0, 3912, 4095, +0, 3913, 4095, +0, 3916, 4095, +0, 3919, 4095, +0, 3923, 4095, +0, 3928, 4095, +0, 3935, 4095, +0, 3944, 4095, +0, 3954, 4095, +0, 3968, 4095, +0, 3984, 4095, +0, 4006, 4095, +0, 4034, 4095, +0, 4069, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3938, +0, 4095, 3566, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3897, 4095, +0, 3897, 4095, +0, 3898, 4095, +0, 3898, 4095, +0, 3899, 4095, +0, 3901, 4095, +0, 3903, 4095, +0, 3905, 4095, +0, 3908, 4095, +0, 3912, 4095, +0, 3917, 4095, +0, 3924, 4095, +0, 3934, 4095, +0, 3946, 4095, +0, 3960, 4095, +0, 3977, 4095, +0, 3999, 4095, +0, 4027, 4095, +0, 4062, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3943, +0, 4095, 3576, +0, 3880, 4095, +0, 3880, 4095, +0, 3880, 4095, +0, 3880, 4095, +0, 3880, 4095, +0, 3881, 4095, +0, 3881, 4095, +0, 3881, 4095, +0, 3881, 4095, +0, 3882, 4095, +0, 3883, 4095, +0, 3884, 4095, +0, 3885, 4095, +0, 3887, 4095, +0, 3889, 4095, +0, 3893, 4095, +0, 3897, 4095, +0, 3903, 4095, +0, 3910, 4095, +0, 3920, 4095, +0, 3932, 4095, +0, 3949, 4095, +0, 3966, 4095, +0, 3989, 4095, +0, 4018, 4095, +0, 4054, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3949, +0, 4095, 3590, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3860, 4095, +0, 3860, 4095, +0, 3861, 4095, +0, 3862, 4095, +0, 3863, 4095, +0, 3864, 4095, +0, 3866, 4095, +0, 3868, 4095, +0, 3872, 4095, +0, 3876, 4095, +0, 3882, 4095, +0, 3890, 4095, +0, 3900, 4095, +0, 3913, 4095, +0, 3930, 4095, +0, 3952, 4095, +0, 3976, 4095, +0, 4005, 4095, +0, 4042, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3957, +0, 4095, 3608, +0, 3828, 4095, +0, 3828, 4095, +0, 3828, 4095, +0, 3828, 4095, +0, 3828, 4095, +0, 3829, 4095, +0, 3829, 4095, +0, 3829, 4095, +0, 3830, 4095, +0, 3830, 4095, +0, 3831, 4095, +0, 3832, 4095, +0, 3834, 4095, +0, 3836, 4095, +0, 3838, 4095, +0, 3842, 4095, +0, 3847, 4095, +0, 3853, 4095, +0, 3861, 4095, +0, 3872, 4095, +0, 3886, 4095, +0, 3904, 4095, +0, 3927, 4095, +0, 3956, 4095, +0, 3987, 4095, +0, 4025, 4095, +0, 4072, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3968, +0, 4095, 3630, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3785, 4095, +0, 3786, 4095, +0, 3786, 4095, +0, 3787, 4095, +0, 3788, 4095, +0, 3790, 4095, +0, 3792, 4095, +0, 3795, 4095, +0, 3799, 4095, +0, 3804, 4095, +0, 3811, 4095, +0, 3820, 4095, +0, 3832, 4095, +0, 3847, 4095, +0, 3867, 4095, +0, 3892, 4095, +0, 3923, 4095, +0, 3962, 4095, +0, 4002, 4095, +0, 4051, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3982, +0, 4095, 3659, +0, 3716, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3718, 4095, +0, 3718, 4095, +0, 3719, 4095, +0, 3720, 4095, +0, 3721, 4095, +0, 3722, 4095, +0, 3724, 4095, +0, 3727, 4095, +0, 3730, 4095, +0, 3735, 4095, +0, 3741, 4095, +0, 3748, 4095, +0, 3759, 4095, +0, 3772, 4095, +0, 3790, 4095, +0, 3812, 4095, +0, 3840, 4095, +0, 3875, 4095, +0, 3918, 4095, +0, 3970, 4095, +0, 4022, 4095, +0, 4084, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4000, +0, 4095, 3695, +0, 3608, 4095, +0, 3608, 4095, +0, 3608, 4095, +0, 3608, 4095, +0, 3608, 4095, +0, 3609, 4095, +0, 3609, 4095, +0, 3610, 4095, +0, 3611, 4095, +0, 3612, 4095, +0, 3613, 4095, +0, 3615, 4095, +0, 3617, 4095, +0, 3621, 4095, +0, 3625, 4095, +0, 3630, 4095, +0, 3638, 4095, +0, 3648, 4095, +0, 3661, 4095, +0, 3677, 4095, +0, 3699, 4095, +0, 3726, 4095, +0, 3759, 4095, +0, 3801, 4095, +0, 3851, 4095, +0, 3911, 4095, +2192, 3980, 4095, +2192, 4047, 4095, +2192, 4095, 4095, +2192, 4095, 4095, +2192, 4095, 4023, +2192, 4095, 3738, +0, 3404, 4095, +0, 3404, 4095, +0, 3404, 4095, +0, 3405, 4095, +0, 3405, 4095, +0, 3405, 4095, +0, 3406, 4095, +0, 3407, 4095, +0, 3408, 4095, +0, 3410, 4095, +0, 3412, 4095, +0, 3415, 4095, +0, 3419, 4095, +0, 3424, 4095, +0, 3430, 4095, +0, 3439, 4095, +0, 3450, 4095, +0, 3465, 4095, +0, 3484, 4095, +0, 3509, 4095, +0, 3539, 4095, +0, 3577, 4095, +0, 3623, 4095, +0, 3679, 4095, +0, 3743, 4095, +0, 3818, 4095, +2192, 3901, 4095, +3118, 3993, 4095, +3118, 4079, 4095, +3118, 4095, 4095, +3118, 4095, 4051, +3118, 4095, 3791, +0, 2761, 4095, +0, 2762, 4095, +0, 2762, 4095, +0, 2764, 4095, +0, 2765, 4095, +0, 2767, 4095, +0, 2770, 4095, +0, 2773, 4095, +0, 2778, 4095, +0, 2785, 4095, +0, 2793, 4095, +0, 2804, 4095, +0, 2818, 4095, +0, 2837, 4095, +0, 2861, 4095, +0, 2890, 4095, +0, 2927, 4095, +0, 2973, 4095, +0, 3027, 4095, +0, 3090, 4095, +0, 3164, 4095, +0, 3246, 4095, +0, 3337, 4095, +0, 3436, 4095, +0, 3541, 4095, +0, 3653, 4095, +2192, 3768, 4095, +3118, 3888, 4095, +3469, 4010, 4095, +3469, 4095, 4095, +3469, 4095, 4087, +3469, 4095, 3853, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 2137, 4095, +0, 2915, 4095, +0, 3253, 4095, +2192, 3494, 4095, +3118, 3693, 4095, +3469, 3869, 4095, +3714, 4032, 4095, +3714, 4095, 4095, +3714, 4095, 3924, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +2266, 0, 4095, +2814, 2192, 4095, +3118, 3121, 4095, +3469, 3568, 4095, +3714, 3844, 4095, +3916, 4060, 4095, +3916, 4095, 4005, +3533, 0, 4095, +3533, 0, 4095, +3533, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3535, 0, 4095, +3536, 0, 4095, +3537, 0, 4095, +3538, 0, 4095, +3539, 0, 4095, +3541, 0, 4095, +3544, 0, 4095, +3547, 0, 4095, +3552, 0, 4095, +3558, 0, 4095, +3566, 0, 4095, +3576, 0, 4095, +3590, 0, 4095, +3608, 0, 4095, +3630, 0, 4095, +3659, 0, 4095, +3695, 0, 4095, +3738, 2192, 4095, +3791, 3118, 4095, +3853, 3469, 4095, +3924, 3714, 4095, +4005, 3916, 4095, +4095, 4095, 4095] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/.gitignore b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/.gitignore new file mode 100644 index 0000000000..268cdab0c7 --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/.gitignore @@ -0,0 +1 @@ +.tmp \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py new file mode 100644 index 0000000000..af73f82b8d --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py @@ -0,0 +1,258 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +"""O3DE/Atom Color Grading Python Package""" +# ------------------------------------------------------------------------- +import sys +import os +import site +import inspect +import logging as _logging +import pathlib +from pathlib import Path +import math + +# ------------------------------------------------------------------------- +__copyright__ = "Copyright 2021, Amazon" +__credits__ = ["Jonny Galloway", "Ben Black"] +__license__ = "EULA" +__version__ = "0.0.1" +__status__ = "Prototype" + +__all__ = ['from_3dl_to_azasset', + 'capture_displaymapperpassthrough', + 'exr_to_3dl_azasset', + 'initialize', + 'lut_compositor', + 'lut_helper', + 'env_bool', + 'makedirs', + 'initialize_logger' + 'inv_shaper_transform', + 'shaper_transform', + 'get_uv_coord', + 'clamp', + 'log2', + 'is_power_of_two'] +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +_MODULE_PATH = Path(os.path.abspath(__file__)) +site.addsitedir(_MODULE_PATH.parent.absolute()) + +_PACKAGENAME = 'ColorGrading' +_MODULEENAME = 'ColorGrading.init' + +# project cache log dir path +DCCSI_LOG_PATH = Path(_MODULE_PATH.parent.absolute(), '.tmp', 'logs') +# ------------------------------------------------------------------------- + + +# -- envar util ---------------------------------------------------------- +def env_bool(envar, default=False): + """cast a env bool to a python bool""" + envar_test = os.getenv(envar, default) + # check 'False', 'false', and '0' since all are non-empty + # env comes back as string and normally coerced to True. + if envar_test in ('True', 'true', '1'): + return True + elif envar_test in ('False', 'false', '0'): + return False + else: + return envar_test +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# set these true if you want them set globally for debugging +DCCSI_GDEBUG = env_bool('DCCSI_GDEBUG', False) +DCCSI_DEV_MODE = env_bool('DCCSI_DEV_MODE', False) +DCCSI_GDEBUGGER = env_bool('DCCSI_GDEBUGGER', False) +DCCSI_LOGLEVEL = env_bool('DCCSI_LOGLEVEL', int(20)) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" + +def initialize_logger(name, + log_to_file=False, + default_log_level=_logging.NOTSET): + """Start a azpy logger""" + _logger = _logging.getLogger(name) + _logger.propagate = False + if not _logger.handlers: + + # default log level + _log_level = int(os.getenv('DCCSI_LOGLEVEL', default_log_level)) + + if DCCSI_GDEBUG: + _log_level = int(10) # force when debugging + + if _log_level: + ch = _logging.StreamHandler(sys.stdout) + ch.setLevel(_log_level) + formatter = _logging.Formatter(FRMT_LOG_LONG) + ch.setFormatter(formatter) + _logger.addHandler(ch) + _logger.setLevel(_log_level) + else: + _logger.addHandler(_logging.NullHandler()) + + _logger.debug('_log_level: {}'.format(_log_level)) + + # optionally add the log file handler (off by default) + if log_to_file: + _logger.info('DCCSI_LOG_PATH: {}'.format(DCCSI_LOG_PATH)) + try: + # exist_ok, isn't available in py2.7 pathlib + # because it doesn't exist for os.makedirs + # pathlib2 backport used instead (see above) + if sys.version_info.major >= 3: + DCCSI_LOG_PATH.mkdir(parents=True, exist_ok=True) + else: + makedirs(str(DCCSI_LOG_PATH.resolve())) # py2.7 + except FileExistsError: + # except FileExistsError: doesn't exist in py2.7 + _logger.debug("Folder is already there") + else: + _logger.debug("Folder was created") + + _log_filepath = Path(DCCSI_LOG_PATH, '{}.log'.format(name)) + try: + _log_filepath.touch(mode=0o666, exist_ok=True) + except FileExistsError: + _logger.debug("Log file is already there: {}".format(_log_filepath)) + else: + _logger.debug("Log file was created: {}".format(_log_filepath)) + + if _log_filepath.exists(): + file_formatter = _logging.Formatter(FRMT_LOG_LONG) + file_handler = _logging.FileHandler(str(_log_filepath)) + file_handler.setLevel(_logging.DEBUG) + file_handler.setFormatter(file_formatter) + _logger.addHandler(file_handler) + + return _logger +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +# _ROOT_LOGGER = _logging.getLogger() # only use this if debugging +# https://stackoverflow.com/questions/56733085/how-to-know-the-current-file-path-after-being-frozen-into-an-executable-using-cx/56748839 +#os.chdir(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) +# ------------------------------------------------------------------------- +if DCCSI_GDEBUG: + DCCSI_LOGLEVEL = int(10) + +# set up logger with both console and file _logging +if DCCSI_GDEBUG: + _LOGGER = initialize_logger(_MODULEENAME, log_to_file=True) +else: + _LOGGER = initialize_logger(_MODULEENAME, log_to_file=False) + +_LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME})) +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +def makedirs(folder, *args, **kwargs): + """a makedirs for py2.7 support""" + try: + return os.makedirs(folder, exist_ok=True, *args, **kwargs) + except TypeError: + # Unexpected arguments encountered + pass + try: + # Should work is TypeError was caused by exist_ok, eg., Py2 + return os.makedirs(folder, *args, **kwargs) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + if os.path.isfile(folder): + # folder is a file, raise OSError just like os.makedirs() in Py3 + raise +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------- +class FileExistsError(Exception): + """Implements a stand-in Exception for py2.7""" + def __init__(self, message, errors): + + # Call the base class constructor with the parameters it needs + super(FileExistsError, self).__init__(message) + + # Now for your custom code... + self.errors = errors + +if sys.version_info.major < 3: + FileExistsError = FileExistsError +# ------------------------------------------------------------------------- + + +# ------------------------------------------------------------------------ +# commonly reused utilities +AZASSET_LUT = """\ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [%s], + "Values": [%s] + } +}""" + +FLOAT_EPSILON = sys.float_info.epsilon + +# pow(f, e) won't work if f is negative, or may cause inf / NAN. +def no_nan_pow(base, power): + return pow(max(abs(base), (FLOAT_EPSILON, FLOAT_EPSILON, FLOAT_EPSILON)), power) + +# Transform from high dynamic range to normalized +def inv_shaper_transform(bias, scale, v): + return pow(2.0, (v - bias) / scale) + +# Transform from normalized range to high dynamic range +def shaper_transform(bias, scale, v, clip_threshold=FLOAT_EPSILON): + if v > 0.0: + return math.log(v, 2.0) * scale + bias + + # this is probably not correct, clamps, avoids a math domain error + elif v <= 0.0: + _LOGGER.debug(f'Clipping a value: bias={bias}, scale={scale}, v={v}') + return math.log(clip_threshold, 2.0) * scale + bias + +def get_uv_coord(size, r, g, b): + u = g * size + r + v = b + return (u, v) + +def clamp(v): + return max(0.0, min(1.0, v)) + +def log2(x): + return (math.log10(x) / + math.log10(2)) + +def is_power_of_two(n): + return (math.ceil(log2(n)) == math.floor(log2(n))) +# ------------------------------------------------------------------------ + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + + del _LOGGER \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/capture_displaymapperpassthrough.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/capture_displaymapperpassthrough.py new file mode 100644 index 0000000000..76cdd8450a --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/capture_displaymapperpassthrough.py @@ -0,0 +1,61 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +"""Frame capture of the Displaymapper Passthrough (outputs .dds image)""" +# ------------------------------------------------------------------------ +import logging as _logging +from env_bool import env_bool + +# ------------------------------------------------------------------------ +_MODULENAME = 'ColorGrading.capture_displaymapperpassthrough' + +import ColorGrading.initialize +ColorGrading.initialize.start() + +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +import azlmbr.bus +import azlmbr.atom + +default_passtree = ["Root", + "MainPipeline_0", + "MainPipeline", + "PostProcessPass", + "LightAdaptation", + "DisplayMapperPass", + "DisplayMapperPassthrough"] + +default_path = "FrameCapture\DisplayMapperPassthrough.dds" + +# To Do: we should try to set display mapper to passthrough, +# then back after capture? + +# To Do: we can wrap this, to call from a PySide2 GUI + +def capture(command="CapturePassAttachment", + passtree=default_passtree, + pass_type="Output", + output_path=default_path): + azlmbr.atom.FrameCaptureRequestBus(azlmbr.bus.Broadcast, + command, + passtree, + pass_type, + output_path, 1) +# ------------------------------------------------------------------------ + + +########################################################################### +# Main Code Block, runs this script as main +# ------------------------------------------------------------------------- +if __name__ == '__main__': + capture() diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py new file mode 100644 index 0000000000..9166ef5a44 --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py @@ -0,0 +1,120 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +""" + input: a shaped .exr representing a LUT (for instance coming out of photoshop) + output: a inverse shaped LUT as .exr + ^ as a .3DL (normalized lut file type) + ^ as a .azasset (for o3de engine) +""" + +import sys +import os +import argparse +import math +import site +import pathlib +from pathlib import Path +import logging as _logging +import numpy as np + +# ------------------------------------------------------------------------ +_MODULENAME = 'ColorGrading.exr_to_3dl_azasset' + +import ColorGrading.initialize +ColorGrading.initialize.start() + +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) + +try: + import OpenImageIO as oiio + pass +except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +from ColorGrading.from_3dl_to_azasset import write_azasset + +from ColorGrading import get_uv_coord + +def generate_lut_values(image_spec, image_buffer): + lut_size = image_spec.height + + lut_intervals = [] + lut_values = [] + + # First line contains the vertex intervals + dv = 1023.0 / float(lut_size-1) + for i in range(lut_size): + lut_intervals.append(np.uint16(dv * i)) + # Texels are in R G B per line with indices increasing first with blue, then green, and then red. + for r in range(lut_size): + for g in range(lut_size): + for b in range(lut_size): + uv = get_uv_coord(lut_size, r, g, b) + px = np.array(image_buffer.getpixel(uv[0], uv[1]), dtype='f') + px = np.clip(px, 0.0, 1.0) + px = np.uint16(px * 4095) + lut_values.append(px) + + return lut_intervals, lut_values + +# To Do: add some input file validation +# If the input file doesn't exist, you'll get a LUT with res of 0 x 0 and result in a math error +#Resolution is 0 x 0 +#writing C:\Depot\o3de-engine\Gems\AtomLyIntegration\CommonFeatures\Tools\ColorGrading\TestData\Nuke\HDR\Nuke_Post_grade_LUT.3dl... +#Traceback (most recent call last): + #File "..\..\Editor\Scripts\ColorGrading\exr_to_3dl_azasset.py", line 103, in + #dv = 1023.0 / float(lutSize) +# ZeroDivisionError: float division by zero + +def write_3DL(file_path, lut_size, lut_intervals, lut_values): + lut_file_path = f'{file_path}.3dl' + _LOGGER.info(f"Writing {lut_file_path}...") + lut_file = open(lut_file_path, 'w') + for i in range(lut_size): + lut_file.write(f"{lut_intervals[i]} ") + lut_file.write("\n") + for px in lut_values: + lut_file.write(f"{px[0]} {px[1]} {px[2]}\n") + lut_file.close() + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + parser=argparse.ArgumentParser() + parser.add_argument('--i', type=str, required=True, help='input file') + parser.add_argument('--o', type=str, required=True, help='output file') + args=parser.parse_args() + + # Read input image + # image_buffer = oiio.ImageBuf("linear_lut.exr") + image_buffer=oiio.ImageBuf(args.i) + image_spec=image_buffer.spec() + _LOGGER.info(f"Resolution is, x: {image_buffer.spec().width} and y: {image_buffer.spec().height}") + + if image_spec.width != image_spec.height * image_spec.height: + _LOGGER.info(f"invalid input file dimensions. Expect lengthwise LUT with dimension W: s*s X H: s, where s is the size of the LUT") + sys.exit(1) + + lut_intervals, lut_values = generate_lut_values(image_spec, image_buffer) + + write_3DL(args.o, image_spec.height, lut_intervals, lut_values) + write_azasset(args.o, image_spec.height, lut_intervals, lut_values) + + # example from command line + # python % DCCSI_COLORGRADING_SCRIPTS %\lut_helper.py - -i C: \Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr - -op pre - grading - -shaper Log2 - 48nits - -o C: \Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-48nits_32_LUT.exr diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py new file mode 100644 index 0000000000..e61ca33710 --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py @@ -0,0 +1,114 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +"""Takes a 3dl file and encodes it into a .azasset file that can be read by the AssetProcessor""" +# ------------------------------------------------------------------------ +import json +import sys, getopt +import logging as _logging +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +_MODULENAME = 'ColorGrading.from_3dl_to_azasset' + +import ColorGrading.initialize +ColorGrading.initialize.start() + +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) + +try: + import OpenImageIO as oiio + pass +except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +from ColorGrading import AZASSET_LUT + + +# ------------------------------------------------------------------------ +def find_first_line(alist): + for lno, line in enumerate(alist): + if line[0].isdigit(): # skip non-number metadata + return lno +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +def write_azasset(file_path, lut_intervals, lut_values, azasset_json=AZASSET_LUT): + values_str = '' + for idx, px in enumerate(lut_values): + values_str += f"{px[0]}, {px[1]}, {px[2]}" + if idx < (len(lut_values) - 1): + values_str += ",\n" + + intervals_str = ', '.join(map(str, lut_intervals)) + + azasset_json = azasset_json % (intervals_str, values_str) + + asset_file_path = f"{file_path}.azasset" + _LOGGER.info(f"Writting {asset_file_path}...") + asset_file = open(asset_file_path, 'w') + asset_file.write(azasset_json) +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +def convert_3dl_to_azasset(input_file, output_file): + lut_intervals = [] + lut_values = [] + with open(input_file) as lut_file: + alist = [line.rstrip().lstrip() for line in lut_file] + intervals_idx = find_first_line(alist) + + lut_intervals = alist[intervals_idx].split(" ") + + lut_values_range = range(intervals_idx + 1, len(alist)) + for ln in lut_values_range: + values = alist[ln].split(" ") + if values is None or len(values) < 3: + continue + lut_values.append(values) + + write_azasset(output_file, lut_intervals, lut_values) +# ------------------------------------------------------------------------ + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + input_file = '' + output_file = '' + try: + opts, args = getopt.getopt(sys.argv[1:],"hi:o:",["ifile=","ofile="]) + except getopt.GetoptError: + _LOGGER.info('test.py -i -o ') + sys.exit(2) + for opt, arg in opts: + _LOGGER.info(f"opt {opt} arg {arg}") + if opt == '-h': + _LOGGER.info('test.py -i -o ') + sys.exit() + elif opt in ("-i", "--ifile"): + input_file = arg + elif opt in ("-o", "--ofile"): + output_file = arg + _LOGGER.info(f'Input file is "{input_file}"') + _LOGGER.info(f'Output file is "{output_file}"') + if input_file == '' or output_file == '': + _LOGGER.info('test.py -i -o ') + else: + convert_3dl_to_azasset(input_file, output_file) diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py new file mode 100644 index 0000000000..536c10ed05 --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py @@ -0,0 +1,123 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +# standard imports +import sys +import os +import pathlib +import site +from pathlib import Path +import logging as _logging + +# local imports +from ColorGrading import env_bool +from ColorGrading import initialize_logger +from ColorGrading import DCCSI_GDEBUG +from ColorGrading import DCCSI_DEV_MODE +from ColorGrading import DCCSI_GDEBUGGER +from ColorGrading import DCCSI_LOGLEVEL +from ColorGrading import FRMT_LOG_LONG + +__all__ = ['start'] + +# ------------------------------------------------------------------------ +_PACKAGENAME = 'ColorGrading' +_MODULENAME = 'ColorGrading.initialize' + +if DCCSI_GDEBUG: + DCCSI_LOGLEVEL = int(10) + +# set up logger with both console and file _logging +if DCCSI_GDEBUG: + _LOGGER = initialize_logger(_PACKAGENAME, log_to_file=True, default_log_level=DCCSI_LOGLEVEL) +else: + _LOGGER = initialize_logger(_PACKAGENAME, log_to_file=False, default_log_level=DCCSI_LOGLEVEL) + +_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) + +# connect to the debugger +if DCCSI_DEV_MODE: + APP_DATA_WING = Path('C:/Users/gallowj/AppData/Roaming/Wing Pro 7') + APP_DATA_WING.resolve() + site.addsitedir(pathlib.PureWindowsPath(APP_DATA_WING).as_posix()) + import wingdbstub as debugger + try: + debugger.Ensure() + _LOGGER.info("Wing debugger attached") + except Exception as e: + _LOGGER.debug('Can not attach Wing debugger (running in IDE already?)') +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +def start(): + """set up access to OpenImageIO, within o3de or without""" + # ------------------------------------------------------------------------ + try: + # running in o3de + import azlmbr + + _O3DE_DEV = Path(os.getenv('O3DE_DEV', Path(azlmbr.paths.engroot))) + os.environ['O3DE_DEV'] = pathlib.PureWindowsPath(_O3DE_DEV).as_posix() + _LOGGER.debug(_O3DE_DEV) + + _O3DE_BIN_PATH = Path(str(_O3DE_DEV),Path(azlmbr.paths.executableFolder)) + + _O3DE_BIN = Path(os.getenv('O3DE_BIN', _O3DE_BIN_PATH.resolve())) + os.environ['O3DE_BIN'] = pathlib.PureWindowsPath(_O3DE_BIN).as_posix() + + _LOGGER.debug(_O3DE_BIN) + + site.addsitedir(_O3DE_BIN) + + except Exception as e: + # running external, start this module from: + # "C:\Depot\o3de-engine\Gems\Atom\Feature\Common\Tools\ColorGrading\cmdline\CMD_ColorGradinTools.bat" + pass + + try: + _O3DE_DEV = Path(os.getenv('O3DE_DEV')) + _O3DE_DEV = _O3DE_DEV.resolve() + os.environ['O3DE_DEV'] = pathlib.PureWindowsPath(_O3DE_DEV).as_posix() + _LOGGER.debug(f'O3DE_DEV is: {_O3DE_DEV}') + except EnvironmentError as e: + _LOGGER.error('O3DE engineroot not set or found') + raise e + + try: + _TAG_LY_BUILD_PATH = os.getenv('TAG_LY_BUILD_PATH', 'build') + _DEFAULT_BIN_PATH = Path(str(_O3DE_DEV), _TAG_LY_BUILD_PATH, 'bin', 'profile') + _O3DE_BIN_PATH = Path(os.getenv('O3DE_BIN_PATH', _DEFAULT_BIN_PATH)) + _O3DE_BIN_PATH = _O3DE_BIN_PATH.resolve() + os.environ['O3DE_BIN_PATH'] = pathlib.PureWindowsPath(_O3DE_BIN_PATH).as_posix() + _LOGGER.debug(f'O3DE_BIN_PATH is: {_O3DE_BIN_PATH}') + site.addsitedir(pathlib.PureWindowsPath(_O3DE_BIN_PATH).as_posix()) + except EnvironmentError as e: + _LOGGER.error('O3DE bin folder not set or found') + raise e +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +try: + import OpenImageIO as OpenImageIO +except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) +# ------------------------------------------------------------------------ + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + start() \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py new file mode 100644 index 0000000000..74ba44dc27 --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py @@ -0,0 +1,110 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +# lut_compositor.py + +import sys +import os +import site +import argparse +import math +import pathlib +from pathlib import Path +import logging as _logging +from env_bool import env_bool + +# ------------------------------------------------------------------------ +_MODULENAME = 'ColorGrading.lut_compositor' + +# set these true if you want them set globally for debugging +_DCCSI_GDEBUG = env_bool('DCCSI_GDEBUG', False) +_DCCSI_DEV_MODE = env_bool('DCCSI_DEV_MODE', False) +_DCCSI_GDEBUGGER = env_bool('DCCSI_GDEBUGGER', False) +_DCCSI_LOGLEVEL = env_bool('DCCSI_LOGLEVEL', int(20)) + +if _DCCSI_GDEBUG: + _DCCSI_LOGLEVEL = int(10) + +FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" +_logging.basicConfig(level=_DCCSI_LOGLEVEL, + format=FRMT_LOG_LONG, + datefmt='%m-%d %H:%M') +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) + +import ColorGrading.initialize +ColorGrading.initialize.start() + +try: + import OpenImageIO as oiio + pass +except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) +# ------------------------------------------------------------------------ + +operations = {"composite": 0, "extract": 1} +invalidOp = -1 + +parser = argparse.ArgumentParser() +parser.add_argument('--i', type=str, required=True, help='input file') +parser.add_argument('--l', type=str, required=False, help='LUT to composite with screenshot in \'composite\' mode') +parser.add_argument('--op', type=str, required=True, help='operation. Should be \'composite\' or \'extract\'') +parser.add_argument('--s', type=int, required=True, help='size of the LUT (i.e. 16)') +parser.add_argument('--o', type=str, required=True, help='output file') +args = parser.parse_args() + +op = operations.get(args.op, invalidOp) +if op == invalidOp: + print("invalid operation") + sys.exit(1) +elif op == 0: + if args.l is None: + print("no LUT file specified") + sys.exit() + +# read in the input image +inBuf = oiio.ImageBuf(args.i) +inSpec = inBuf.spec() +print("Input resolution is ", inBuf.spec().width, " x ", inBuf.spec().height) + +if op == 0: + outFileName = args.o + print("writing %s..." % (outFileName)) + lutBuf = oiio.ImageBuf(args.l) + lutSpec = lutBuf.spec() + print("Resolution is ", lutBuf.spec().width, " x ", lutBuf.spec().height) + if lutSpec.width != lutSpec.height*lutSpec.height: + print("invalid input file dimensions. Expect lengthwise LUT with dimension W: s*s X H: s, where s is the size of the LUT") + sys.exit(1) + lutSize = lutSpec.height + outSpec = oiio.ImageSpec(inSpec.width, inSpec.height, 3, oiio.TypeFloat) + outBuf = oiio.ImageBuf(outSpec) + outBuf.write(outFileName) + for y in range(outBuf.ybegin, outBuf.yend): + for x in range(outBuf.xbegin, outBuf.xend): + srcPx = inBuf.getpixel(x, y) + dstPx = (srcPx[0], srcPx[1], srcPx[2]) + if y < lutSpec.height and x < lutSpec.width: + lutPx = lutBuf.getpixel(x, y) + dstPx = (lutPx[0], lutPx[1], lutPx[2]) + outBuf.setpixel(x, y, dstPx) + outBuf.write(outFileName) +elif op == 1: + outFileName = args.o + print("writing %s..." % (outFileName)) + lutSize = args.s + lutSpec = oiio.ImageSpec(lutSize*lutSize, lutSize, 3, oiio.TypeFloat) + lutBuf = oiio.ImageBuf(lutSpec) + for y in range(lutBuf.ybegin, lutBuf.yend): + for x in range(lutBuf.xbegin, lutBuf.xend): + srcPx = inBuf.getpixel(x, y) + dstPx = (srcPx[0], srcPx[1], srcPx[2]) + lutBuf.setpixel(x, y, dstPx) + lutBuf.write(outFileName) \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py new file mode 100644 index 0000000000..459fe241fa --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py @@ -0,0 +1,186 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +# lut_helper.py + +import sys +import os +import argparse +import math +import site +import pathlib +from pathlib import Path +import logging as _logging +import numpy as np +from pathlib import Path + +# ------------------------------------------------------------------------ +_MODULENAME = 'ColorGrading.lut_helper' + +import ColorGrading.initialize +ColorGrading.initialize.start() + +_LOGGER = _logging.getLogger(_MODULENAME) +_LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) + +try: + import OpenImageIO as oiio + pass +except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) +# ------------------------------------------------------------------------ + + +# ------------------------------------------------------------------------ +# Transform from high dynamic range to normalized +from ColorGrading import inv_shaper_transform + +# Transform from normalized range to high dynamic range +from ColorGrading import shaper_transform + +# utils +from ColorGrading import get_uv_coord +from ColorGrading import log2 +from ColorGrading import is_power_of_two + +shaper_presets = {"Log2-48nits": (-6.5, 6.5), + "Log2-1000nits": (-12.0, 10.0), + "Log2-2000nits": (-12.0, 11.0), + "Log2-4000nits": (-12.0, 12.0)} + +def transform_exr(image_buffer, out_image_buffer, op, out_path, write_exr): + # Set the destination image pixels by applying the shaperfunction + for y in range(out_image_buffer.ybegin, out_image_buffer.yend): + for x in range(out_image_buffer.xbegin, out_image_buffer.xend): + src_pixel = image_buffer.getpixel(x, y) + # _LOGGER.debug(f'src_pixel is: {src_pixel}') + if op == 0: + dst_pixel = (inv_shaper_transform(bias, scale, src_pixel[0]), + inv_shaper_transform(bias, scale, src_pixel[1]), + inv_shaper_transform(bias, scale, src_pixel[2])) + out_image_buffer.setpixel(x, y, dst_pixel) + elif op == 1: + dst_pixel = (shaper_transform(bias, scale, src_pixel[0]), + shaper_transform(bias, scale, src_pixel[1]), + shaper_transform(bias, scale, src_pixel[2])) + out_image_buffer.setpixel(x, y, dst_pixel) + else: + # Unspecified operation. Just write zeroes + out_image_buffer.setpixel(x, y, 0.0, 0.0, 0.0) + + if write_exr: + _LOGGER.info(f"writing {out_path}.exr ...") + out_image_buffer.write(out_path + '.exr', "float") + + return out_image_buffer + + +########################################################################### +# Main Code Block, runs this script as main (testing) +# ------------------------------------------------------------------------- +if __name__ == '__main__': + """Run this file as main""" + + operations = {"pre-grading": 0, "post-grading": 1} + + parser = argparse.ArgumentParser() + parser.add_argument('--i', type=str, required=True, help='input file') + parser.add_argument('--shaper', type=str, required=True, + help='shaper preset. Should be one of \'Log2-48nits\', \'Log2-1000nits\', \'Log2-2000nits\', \'Log2-4000nits\'') + parser.add_argument('--op', type=str, required=True, help='operation. Should be \'pre-grading\' or \'post-grading\'') + parser.add_argument('--o', type=str, required=True, help='output file') + parser.add_argument('-e', dest='writeExr', action='store_true', help='output lut as exr file (float)') + parser.add_argument('-l', dest='write3dl', action='store_true', help='output lut as .3dl file') + parser.add_argument('-a', dest='writeAsset', action='store_true', help='write out lut as O3dE .azasset file') + args = parser.parse_args() + + # Check for valid shaper type + invalid_shaper = (0, 0) + invalid_op = -1 + + shaper_limits = shaper_presets.get(args.shaper, invalid_shaper) + if shaper_limits == invalid_shaper: + _LOGGER.error("invalid shaper") + sys.exit(1) + op = operations.get(args.op, invalid_op) + if op == invalid_op: + _LOGGER.error("invalid operation") + sys.exit(1) + + # input validation + input_file = Path(args.i) + if input_file.is_file(): + # file exists + pass + else: + FILE_ERROR_MSG = f'File does not exist: {input_file}' + _LOGGER.error(FILE_ERROR_MSG) + #raise FileNotFoundError(FILE_ERROR_MSG) + sys.exit(1) + + # Read input image + #buf = oiio.ImageBuf("linear_lut.exr") + image_buffer = oiio.ImageBuf(args.i) + image_spec = image_buffer.spec() + + _LOGGER.info(f"Resolution is x:{image_spec.height}, y:{image_spec.width}") + + if image_spec.height < 16: + _LOGGER.info(f"invalid input file dimensions: x is {image_spec.height}. Expected LUT with height dimension >= 16 pixels") + sys.exit(1) + + if not is_power_of_two(image_buffer.spec().height): + _LOGGER.info(f"invalid input file dimensions: {buf.spec().height}. Expected LUT dimensions power of 2: 16, 32, or 64 height") + sys.exit(1) + + elif image_spec.width != image_spec.height * image_spec.height: + _LOGGER.info("invalid input file dimensions. Expect lengthwise LUT with dimension W: s*s X H: s, where s is the size of the LUT") + sys.exit(1) + + lut_size = image_spec.height + + middle_grey = 0.18 + lower_stops = shaper_limits[0] + upper_stops = shaper_limits[1] + + middle_grey = math.log(middle_grey, 2.0) + log_min = middle_grey + lower_stops + log_max = middle_grey + upper_stops + + scale = 1.0 / (log_max - log_min) + bias = -scale * log_min + + _LOGGER.info("Shaper: range in stops %.1f -> %.1f (linear: %.3f -> %.3f) logMin %.3f logMax %.3f scale %.3f bias %.3f\n" % + (lower_stops, upper_stops, middle_grey * math.pow(2.0, lower_stops), middle_grey * math.pow(2.0, upper_stops), + log_min, log_max, scale, bias)) + + buffer_name = Path(args.o).name + + # Create a writing image + out_image_spec = oiio.ImageSpec(image_buffer.spec().width, image_buffer.spec().height, 3, "float") + out_image_buffer = oiio.ImageBuf(out_image_spec) + + # write out the modified exr file + write_exr = False + if args.writeExr: + write_exr = True + out_image_buffer = transform_exr(image_buffer, out_image_buffer, op, args.o, write_exr) + + from ColorGrading.exr_to_3dl_azasset import generate_lut_values + lut_intervals, lut_values = generate_lut_values(image_spec, out_image_buffer) + + if args.write3dl: + from ColorGrading.exr_to_3dl_azasset import write_3DL + write_3DL(args.o, lut_size, lut_intervals, lut_values) + + if args.writeAsset: + from ColorGrading import AZASSET_LUT + from ColorGrading.from_3dl_to_azasset import write_azasset + write_azasset(args.o, lut_intervals, lut_values, AZASSET_LUT) diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py b/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py new file mode 100644 index 0000000000..0070611592 --- /dev/null +++ b/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py @@ -0,0 +1,60 @@ +# coding:utf-8 +#!/usr/bin/python +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# +""" +Boostraps O3DE editor access to the python scripts within Atom.Feature.Commmon +Example: color grading related scripts +""" +# ------------------------------------------------------------------------ +# standard imports +import sys +import os +import inspect +import pathlib +import site +from pathlib import Path +import logging as _logging +# ------------------------------------------------------------------------ +_MODULENAME = 'Gems.Atom.Feature.Common.bootstrap' + +# print (inspect.getfile(inspect.currentframe()) # script filename (usually with path) +# script directory +_MODULE_PATH = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) +_MODULE_PATH = Path(_MODULE_PATH) +site.addsitedir(_MODULE_PATH.resolve()) + +from ColorGrading import env_bool +from ColorGrading import initialize_logger +from ColorGrading import DCCSI_GDEBUG +from ColorGrading import DCCSI_DEV_MODE +from ColorGrading import DCCSI_LOGLEVEL + +if DCCSI_GDEBUG: + DCCSI_LOGLEVEL = int(10) + +_LOGGER = initialize_logger(_MODULENAME, log_to_file=False, default_log_level=DCCSI_LOGLEVEL) +_LOGGER.info('Initializing: {0}.'.format({_MODULENAME})) +_LOGGER.info(f'site.addsitedir({_MODULE_PATH.resolve()})') + +# early connect to the debugger +if DCCSI_DEV_MODE: + APP_DATA_WING = Path('C:/Users/gallowj/AppData/Roaming/Wing Pro 7') + APP_DATA_WING.resolve() + site.addsitedir(pathlib.PureWindowsPath(APP_DATA_WING).as_posix()) + import wingdbstub as debugger + try: + debugger.Ensure() + _LOGGER.info("Wing debugger attached") + except Exception as e: + _LOGGER.debug('Can not attach Wing debugger (running in IDE already?)') + + +from ColorGrading.initialize import start +start() +# ------------------------------------------------------------------------ \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/.gitignore b/Gems/Atom/Feature/Common/Tools/ColorGrading/.gitignore new file mode 100644 index 0000000000..60fead7091 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/.gitignore @@ -0,0 +1 @@ +.solutions \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_16_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_16_LUT.exr new file mode 100644 index 0000000000..744d53464e --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_16_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c9f3506348d675c15d65e6f4a5cf1b773144cf5c8a2227c1f985806e6afe4b1 +size 1042 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_32_LUT.exr new file mode 100644 index 0000000000..588c73a0cd --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a269460a16993fce1d1973bccf53bc7f88a66ba1bad7b444b258bcd7b26527f8 +size 3326 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_64_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_64_LUT.exr new file mode 100644 index 0000000000..4a75163a96 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-1000nits_64_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:767ebd1863954ac04c16a68ec90c31c1ed15dfda26239dd0f0159fa279100661 +size 18642 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_16_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_16_LUT.exr new file mode 100644 index 0000000000..64be39f369 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_16_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05e1fb5ea519499012cfe11b4fa245396e6ae49e476fe7a5951b20bf28a367b1 +size 1063 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_32_LUT.exr new file mode 100644 index 0000000000..9e87af6e5e --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:52386c8753b282e5ff428819e79a5ad1675ad86cdf75c8402ea1ab41e630ac98 +size 3328 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_64_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_64_LUT.exr new file mode 100644 index 0000000000..00ad138501 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-2000nits_64_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6d7bc8a85561d37aaf3f5ed6547ce939759cd00db96874bc9e6107c3ee12e23 +size 18421 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_16_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_16_LUT.exr new file mode 100644 index 0000000000..4e024dad46 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_16_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:937b4d3388f27947886f49cd935663142806bce38768b83c89b8765c03bbd67b +size 1047 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_32_LUT.exr new file mode 100644 index 0000000000..39ab05ffcb --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ce932c419c11ed2366cd94e27547f65d11abcd604e5262583a36e661d4ad41b +size 3329 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_64_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_64_LUT.exr new file mode 100644 index 0000000000..6c876fd065 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-4000nits_64_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8786dc9bcf1afe914fafaac63659e3d0fcdefa453c5bee153fa915094c0df132 +size 18604 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_16_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_16_LUT.exr new file mode 100644 index 0000000000..4ae30ddf60 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_16_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:155b3ba516d77fcfc9a77a7e96acbf450759d87ee7f042730d1d75b0f2628902 +size 1038 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_32_LUT.exr new file mode 100644 index 0000000000..44355677e5 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea718b119139cc8a55b944555ab0b0ad9d012a676c5e4c63bd338f26e8290a01 +size 3309 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_64_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_64_LUT.exr new file mode 100644 index 0000000000..32a6600e64 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/base_Log2-48nits_64_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75340a9238177b5bd3b8f8a3d4864fc75a613ec29222ecf7c90bc5e3b4bc8416 +size 18349 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/from_ACEScg_to_sRGB.icc b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/from_ACEScg_to_sRGB.icc new file mode 100644 index 0000000000000000000000000000000000000000..ea10bec0b50b602ef9f107f425fb37966c1e2468 GIT binary patch literal 394128 zcmagFbyOQ$`0q_iT~2%IN+~UEfkG+n5+o$VT?io|Bm_c82!RlR;O@aSxCaX^308MM zb$3^)FX!CfyYBnPz3bg;J)iyEGSAHHwbz91oO<%6+Ec&)X`bAenI1+BYFSo;03)YFqpIVLDVDcO4HMFCDZ_pbl%H6uD4K)e-2Rbbva5 zg)#U)`*8Tr2V94z6QsjkI6hp5vtSWAARV~QVIBPiZ{Z8|F$)T`a1Ppn=OCTv|9XTj z_+Cf^B1!+>Tu0}BkClLFY4KmxqBRg5ou!Zd{Q07ghGfSh1MU04PU{8%`}~|94_+{c zaqb%;@2zoR4qecH=(=XuRo~jRW4LusmYes;I=vTeXGhq2ew(9(KU2%L$VEl5(c2ti z+5Ea4JCZo8zFn;Jx6~B9Cpq5j;~#$H3Rly*A8X0t%cj2`W4oC?(Z7HEj<8V8wZbOdE9UMbmX09f6Fqn zRIlXL#in-N(AKAi7khth8#I0ktY{Y*z4CGEFgf(q=VZspLk1vlC+#2!G}HO+KpEJz zOJw*E+}QQm(8Yc`b4%%2doT-7@Y()kNJq*;hZJs;w9b(iaaVB4DLL9K^po>#NhIU8 zD>9DhKj1c&xQIvwY)^q>lpX=;1VpH3dDb3Cjn}!HMvxtFao$VsLq2+iYdz2)lcE)F zgW!F|k6a+WyGo0lHv0Z4-{!Cr@=t}t4h&UQj@l?;jH-LqhVX6GZ!NX(zM8KVJcLc{ z!=qk^lS-AjEi#}k^oTw3M*U_pBFeYE-!v69(f~QELF+X2RkW(vJ1+vrDv zy^MQB_zV6ip$KDwc%S?iq8|Au6%P$ZO{OP-1?YxM8Bl|fXCuA5u*BR&fbX~+d8ux1 zaOd;Cx-P@V6hfUn2rCuwj@^XnqG|_wqIGeV-4mj!B*}J=WLoNHQ$gw~+h?6e-c)wo zs-7$?ms=hqU#-xy`097GV${OKk5`F1%0X!6H}U0^Bka`a2;QBs#!K(-}|rI+y~eqM1a zF;L2~_?<{^%8i8YuuT7gq#57eR8UF;sFwON^(!zTAT>SED~q-*W5{EaR+#w;u$%r@ z_FrzrbVbf;SI59bIUihf1NpfpobCqR&nt91#cAdONqJ4oY5d0@Mdno8^uI{a6o{#z0gUu70eb>n6HEf0FzqF4Xua$M zkz;gu==*T9KyPkYh&^K&e@D zU?_O-aO_+7BQ{JP2-UK0#83N9h2RqZ20aNmmSpGS8S0n}^&SmvNI`kQLVu<@d9LA5 z(l!F_aK_W_x@*GzPS0^W6&8?T?fN*ZKI5jVZrF>=7?;D`gIP!SpFu|n(?=|DfB5*Dcr^>VQ=E?4|54+ zhpNIJg;lYdxQXHYf%D-8{I-Ca@NPjCC4uKF^d)uhE=PSKtl%?5iP%#9vzX`T@CdTR z1IdWEAeF;Y1TL}?=p#W>Yy$)*_!ZX-z7q+Pr-Mo(mGM*`M&x|L0U$u=lyJivAe1J? zdtro=Nqam6QMyTLkBTVQWJkbl-YA;i(aO`J!#mpfx|pg)C7+8ERbJvhBPbN@5j@h1 z>h!t-T4&sDjdDIh3k@#-(SJW$so#+n|FUgO2 z4}U0mB%X!UO06V$P>wW8>JM?2cFWfK+Dl){y1^isNh}z|lyPEj`eeyU;#j~LQ4QjQ z3M6Voyi@s#t|RZXDq`%>xyq$6ZP@s-CE|nlru)`y^F*<|)+`nT-9ko~kx+22C-sI(kc&T7hBP73FVA3SF^tc9$b z^P3w?oXNEh*CQx$`Qd|jMQ$SxgsacJz`Kc6=lO-=P5PwxVXO|=27iHwEL|@NM%#mXIGxp}Z#3v*Jb4f&Z z`Ged!(i`c6JafOa7`wbO|G$N|@_te?A|~>w0UyF|=TFjsVU`8k19L+93wVryV0po0 z&?RPA;Tq;GMp7Z3b&P(kuqwEX=2m!}okZ0r)`xid3lzQ~^AuY}VrZ-13WbW}Mb=T= zcP44E;uV1{Usi-9ew0#+ddOihONux6 zT@^kr4)eDVtSFwL%6R@I`T+xB4@x++>!GbBL-gnD(o)^P=d7Mm0OJBvr!+aJlM!5c zoGGEdEB(W=pw*WhVLc0=m(hb2RP(Yt_CbHsG7YtrJ1p2(fu5>TFz6e>Gge2rG zDt(UnlW9{1!<3}lE$hPVOL$to2455BQ65TMEqPf!O$rfRsMtjw6n?DW`+X7kR%rc= zcxNg%P@TDDm4pBwC$+MI<{na0d7G{u{H|&T{VNMsg$kSs`ll+L5y{A{nhM$#h^zV# zG)v!Cy^Tqv?W}fXJ_y)f&1SKv_SFj3BY#45Z!nRPRsPA_V}w`!!P|3zU%dl|D=Tb( zg}tbXB%iPCyDDyhlNwAb?I9*rJ(U&EOC{GTf5C+XiYf|nZT9)9F;sE7ym~ukV{%Tl z5StMHrusDQL2PNweu9-Gz9xzoBWkEQPU;Z;uH8buDu}Q3_j|~P)izQdg}c^1^}iB^ zSMH;#LYtL-0r4Sgl?s|yaG`RF_J!rC{7A26E~_&PbYont!v!7>yjB;(K+x~hl`}5W z-qwu=p=qn??gwcCJZsE6zl@%&FgHWZv+ z^R@OQ#Hid%X#^cnd{rjEz4DxtcM#glcXduE^R%UPdFa9zyvZqOzxTYZ5_n@GrJi3q}Yf{la1Qs=&4y4gf)$j3`9AEQ4 z+_#{Y*86*29B`;_^wv{Z)qe)&ws0G~LA&bKHB^9GDxnP@AxBDfHTpt33fPTRaQ&P; zjqec28MaM88dZOf>) zSVL__0R-mhHb}tvpr>tInthN#Q#+t#!nCOw&^B?nsbPU8P1ihH2Cp{n^nBI*s5#6V z)n?H=2|Qo_sAVGvS#93J1)nTi(=r2bR4`gML+kPkTG_DQS+1?)2;a1>wzbHtWO|z) zN}GUbYev6}i*5UWT_(NL?uy$i4r!O;*NPn5$M8R*Oxr&ZZbgDR42jJVr5#ujm-nk9 zg}g63siT`b$F=LY=EvlG>-a@k6gtznpOO$V)d}?1VV~|~_)CLtcP9FOV14Usrs7#v ztuNf$Caqha|8KVK1Sp2#Z8VQFy`naimr?u8_9fosjn(Z0pY=6g+f|_0@;e>N!4HdF zI`9xc!Qzf;Xi1J<$8*@-jI2&;#Ew)zrwj>BvhLKNc=433CFqpc(Jl{+Lh8|#j7=7A z?Ha@JMJu~L<9(wJs7wieMaHVgg!2&(RH?*7K3g?N(&z0}JtPftA9pV&Bg1;T&B*6D zs&14YD0IAAiy-CZ#<*og<6 z?0ec-$S(jB0GA6@V^CCz4?Sv{>$D8qA9PZ_a$*GJh^Wj$&s7TcZAd%meU6!n{cZ8g2+{& zLw#~T-H>;x8rPTFC8~1QS6W?Fsq1U)V%3z}!07#M9rs6S!)~yLMOSrqg=axaZ1+>I zuXQhaY=HQx+dauXon^i~mqFi)^m_OCI^~0VIgqGqO>ZBxK10^01Di?}_W|M8lUn;S z5Dya8_nk&Qh^y{jg*qvV>Ia}(CEWffj4URrzYgmheYgJ{_Dhsc|94z{J{i9Kk^OAHB}ozax<8QB(ldmsmuD!nwI zMH9rI20mi`j)4y9VU9=l4}!7$D7Qf&Zdv5~U@5LlFg7@XH;Tv{yp6Bprw{26Hu1`a z^a)AfT|*9p&)nlf1R|EJ+n?mZnab;zyM#^U_DfvCr?UGiUH42Z?Z52iHAqu$bx-Sl ztEK^NwLMa|d0I9y)$hGhYFPvJ-WMxw4J7z%EEya)0rD+;F}MLN$_p7p_*P{f8Z3Ye zWEc)!g3hE8hql3{lV*mH@bLu9P#U6IZaOrHjE+4t^d1F}f`|8`=Ee2HXmo4L`e7Lc z8C^cyf_V^y8$OTa3wIBH#QqYz8QFr1jCea@i+jxfHA2Lr`I|>1_%WXKND*OIc=$k; z^XX~pfmG+S(^dmX&gZ5r2U=XBCvFeib1fbM4eocl((_=D3)t8GaB##UqA6l%k>{jR zG6eEoTKQ!tALv$kedvadplIFjeo$$C(J%u%m_reAM;~84)sQ)9MQxRzszPLU7nGu{*!whQ#z%%38CWa7>u`4F-A)ZQwlPi#^65Yuo zsLe4GlW0_pD0wmheK49ZsX&)Tkth2wONAkm=P~?9`Q$UqO+lqb7i$x7eQdFl!OWY{ z?@op@FGs&P9hiABw#jKoyKT(Z`RqvDSeonNe*D;JH;*pC_(u1n)@|ctfVRP5ywc-) z&Gh&!FO!O{i9O!Pl6Mn?R;lkKInmEL68Bf!Q7?u3ioJIo0qnZ!MvoXoqjVO$WsI^8- zNBe1UXtOA;HWFPTOxEV2e@8ZG+b{&d{c*Wt*DP~f?5LV$j7K^4%m$7ZIk{xy1MXo`AVdsthKI+81KrLF)7%7~O~0ev;5(Em()vPDlPTJGC?b)r?S-w0&(_|B4aU8i zS_!AdQl>26^U^m{7(}w9bt)41mzY0QfGmjdno^;bh`gsxqWID1smG{)qC%#ApaH^^ z>5b^hNbSTMN0-?f6VDypX0J~?b#$M-Ho4sK)RfhvyVH%)Ym;#<%ha`#Q?72RQ<{}- zqBgk(?cUzlqbUO1RDw0vJawyFwcEV*m8EJa-ZsU%wbelPf)CoeK7hPMQ`yGC%|#C;puw#J!#bR z41y(bnSO+LA>J^v2uX_BJhKxyE7~_>jWUaNn1Q1Tqlhz1)N7$agLJq!2hut;&0W};)($u7;*@-z8s(Iv`GvK7%?=sgNrVV!e)qX(R?tY|+q5Hb{`(jd_&KN*; zB)ynHK`te3pOHZ&@sgQ(n10;LnK{^StaRoX93XR;T?s!X)txm$fW+5ly%2*jH)mg>e&>CSK^u3UdZ!=qqDc5 znexWDMX-Hwc5?=>HreMn0NhNfnWMqGB*k-b#7=R=Tp1!MrhQJ0crKcqJBx%xKbm`r zY=}1a3zxY)@#9~Qv&Lhtt>@<1aT+%G7OLoqP0ErbB>L7vP9UH40p?i1R*IEL< z>u;|+=@Dmet#P+&wP8`ShZFYD&Q^1Ke`8+TYn#r)#U1fh4rZmDpN`I(N2x$Zo>*9Q zCz$@QyxP-r_^36kx81nJrn9foXt(XBe(Aw6`^{>%1E~&&)ZY#1j)w-C_M@Cu3_9-% zbh$*`lolWW6p!=6Gn*O66vAKZ?O1nC8C+ZVee9liCQ ze0AKf?LCS85wCXcO1%>-*mXK-ypFi~1g?HnWS3ckTPlJDO)~*I9(M%B<=v7iOD56)}gEiX;kf4-D`OW@1*Ekb8wGybl*+GA1+q?W&1z7d{;Z}U*S5WzP!)S z4L?9P@N;`U@MLeTyL6DI{|2yO@T9&kpm6B$p20(RIN$Qe4}A%DOz$%i2;5|wjE_bC ziD)})FVkhun_i2*Nv9p@NJ%E=9#v$FVjC@aIU+=wwN?H($QqlQiYq>A?W84g&v=Jb zWiQ+jj?t9|To_KLs_h+nTz1v|Z4YoIDv#SPa!acxS-o~IZ_rw90Ms?DJWBB>ZgxB} z=Na4rH}m(hX@!}t@%qtbV{*k?*}mLZ3-o9|V>AkU)*(N1+(+KI{@@RvKb_47EkH3{ z_6H(B@4BW9hroE1yWvK=944r=)K0^a71Y_ghdfWIaQK`1P)c*$D%d4Rb2=K$4efQ# zlJqiaU3KD`{AF(3L=U2&`>~WlOsL0(^m2r)CnSpj3G>Rxc>r4DJ(h3e^%Hor5aeO( z^SB7;mJPa5a?oWD_-g58$CthnKE*C&0)(5czCU~ z1ql9Kx&7#VM27OI`DWy`md$|D1Jlk;S$u9#zQ6-(FYrcO!jy? z(l}M;yaVZ5%XPgkGS25z0_DN$l4^XsLaQa$L1y73!56TXU?1nKFD2?2Gae!o8`Bm; z%Vn;9masngcKlQLaKbERF`_rw9U(^6rDj7tQS$U*urE3?vjJF#@y(Wb?Z@uTJp#Ca zy`MMeb{bb)aM0xu-lZ_kSs#Bv(d(E?U>2Qo*hXAbeBAB?F}9@3wvzb0G{r_v5|tsX z1*9A0tE>{qHsxx|Msi^V-r^$pZN&$R<$ku6$wy%*83j=1fvTe9)MC+VsV9oc(Z%$X z%zGGzpu$8e%+KI|Bna#)&XGt{+@o+#*aQ5P2x%~xpcPUA1;l#Mdg@w|R9s5lMD~>a z!bkY6kF&rS``w9mL>{KJCF;S#{TWFweD6_rr6@qj)X}uvKxP0bJ=H5B;915Uk7`cCyxfspNiH~Dr!ZH!WZg4P@a5?-MEW-gAtPf{_PVs7IrSZGNP z<_znzjDxZc&W-yEeuBMUo&arP_r~AzZ3{6?JOVl!QjtXTF$rCp%=1=;#-s?mtV6G) z5?hE_eg}O6}+1Wa8tJ`|NdoF1Z=(9{zY`=WC8CUl_S~T=W;}x@1et z7Nm!SD_#XZD;X2tgQZK?O4^}VDN-5@IVjDM9q=`jo|GL2+sKy2GC&BKXY3cBXjx=j z9I#s?LHt%Zi{yx(Dp!#j`KmQCW;43B_CZVA0o~oEzXcicKU&nAd)8k z_}G(D>wvnL+tOKjn~*01GphM4*#%}y*l;W&*g1q4dyf5rPPi4-kG!0y zA035gPNa#p!&?)pMLn>w#B(uF=!K-kF%KZ`lB~pm5YxCK*i=tpTnS9uqllY=%Q`;D zcOw68sE{Y3?p998e_-ww(c>j}ot)J8pG1Q+Rze)vCgEM84#h5ZMWU2?Af`NVKH!hA zFo{Q>=08e$!wBPMB$Jq{LxYn~vGRgbQ|#EfL3dJ=A&fwJ>dMd>nt3XnbCIf-st)@= zu})jbeM3%9!-qd0en_k2og@g;?(qxphtm&4ps=6QLj_qED4#2t{@;Nr{1-Xnv7$4I!T1Z+xk`eBko{PA?9-&z?hV-w|E3?(ClDiii(yr*rCKxPKeYr<_Z zk1@7zFj+=H5_WS|7V|92BcUlm9(X8B$Y# zVw?yLEvO56#3UEIVZLGT3$0l<>C=U>;0c;Z;V`>|+FAH11nW;%n1-&V7%EtyBjm4& zJPw}pMlsHLMx0l?4vQeJFWMdUgx@F8bv6On9jn?(Z4#vABtv!vmG*1RM`LQv#zs4=pOGpnqqllspTZXVsP-U_1zV zQyLVcVPHxdnK|@-O7F0|X}M+VS@QviGVkC9s(x7%+s=P?Src1BIb3!s1mfph_95f~ znNYqh)Qgl?>;xPfdi6i_2EH6r6lZ~ssJ<272G_SVme@nwl&vL|(D{m;rHkPGMV6&3 zBrEr6>1p)3Oue$BnC6sYWjQ$OgtKL@@!fHU%b~;w7g>#cD?E{FM$jUexDkQ6Nihd;cUX@PZG8VAPHt=H5i7GZDnIWsH2|60+ zUUfF;27O)CJTsKGvf7aOAz*Vgf+eIHSBqI6{Xx~G!NHWc^2^@P5oY-%Z`eps`E_sJ zaBRhPU`?-GMG$Cd+wY1Aa6!ZRNi3CnUz<$%9By2D z-2Z8qr*a8Z8>&zO0`k~Dl`W;(iJ-FqHZ|)#|BPyC)_LiSPS&jVT0e@dL3vyBJJeJG(>wKQ-h);& zfotL5>Y6*XT@c&y&C1o#lZsnPCLEKuPpL(m&%9BmhjLAQQzt;zC!y+QG4t}@^&4=W zvZwWQe4J!;eFvdk6jc9}ct-fV!HslYFw!6;pXE0-jQ9(}0 z7P_dhf;!F~X*?A`3yy94K+|P`ns(5#m|jhu^ff`KCN4dd5z>?uxHK@KsWUKwK2pEf zu+pO8GQ_oHaia-ztN`99 zhabsV*?0+2l(DDD82KtCy(t>)kZ9L*0uwDi)ciNLT?TEY<4%h^n;Y>@MHbC(2oIx{ zv{(}_34XM2NTU%OTbjseJXXs+KPdM?>)(`>Vfa=LN+)M+YqUQ&nSQb zxVH5v^);)hZCL<^IoNg};8D<}HV_RGw6-Y=&^xiODGks!VbGKSP*3PL4ST2uN1Js# zzjdEzhI-T5Ha9DQcj`|xe+5yix3!?a*GfOPG(x}%-}jvY4Sfj;oiTXe*EeY8Jna%`H(@yKoGhSuQOS*Oemnnn0I6mA;OxGCbOv#XHweP;dBozk2 z%WYQGLp!tdRL@`!)2?(|BUUA!?G_=866U+LC>uGg`#0J}_M*obb67IjBf+kX8R}7C zA4gy5d5Wu#I?}rbPmZkYg%DN?_V-2;n)o++l|(0AZSPs)sc>QMdlHx%(f1c=CQQhLksFJ&W(tKCNx_(|@jO!Q8H&vb6)aWtQ1NV38HQk3jT)UFG zrJl7d^zM`1OY1K5>;N*Vj`gs8M$4>v2EZ$emh~?4_06~JML-g>+j~o(-5KoO`>+eC zL4Akd&yo~<;fQzfzxve3H*qFIDDNU<@S^RcI^7e{=&QcyrKp7u?DW1@F*CsMF(|1WXakW7FAjVJr{tjrEq&Xw zHw=m((-|8F)zC|+o`c_D7n4*&=I}EKE<;>IhkWNy6EZP&>(CVxQffQA9KBqeKWvL0 z6#W^dVgjPmhto0dqr8UuuyWzr;p@27g1f^%aq@_JBfD`Q`L9P@@HGC?5r6zCp5aIg z!8n{c5bAtw+GHTu`TDf+0Mq%#w9!C{OX9@Tz?5tK(2>DqZufgm48j3N+fNLZd&ryc zgO5B7ZedLPyVO>yje(W$1JeT7!oauW#(|h;?{6m^L=IQQlSal6@o}V)cSw*-KDr0_OLAirhH4l4jEc~3(Us9s^rPsE(NT;b z3Nd;U^INDt`U5MB+%vWX`%GXwW`-j~IFA8wvwXrB18=}n4EZ^`O&=Q~EpTp#;OxFY ziSxtB+@T?t-@~hhe!AK8_78iz%R459^8qKCvBS4K*VToL?Dv9Ky%`DfPA3fBPuNB`8W;rQ`9gXkIsk=9hB9LN{~_7gM?)DYaiI?1AGzkL=*t`3>Gn^jax?&7 z(Bd@Of8F}Ni z5Vtg)@hedC0nE_H|+w@mb24c!4Yyzn|QI+85I~ zX@lwzMNMMSHqpSzD0FiaXi|aMEF?_!VC0d!$&;Apf~?7BSkH*#qj#N5XC98;bTXT{ zKYG>4eCFQhN2giMuQ3znTO+AsA+GECUBxn5)agOW6FK}_Dc+$}~E$#JWI3y}1VX^@VPGU@6 zhiyqyS$+I-J@Pybm8V15x7NE&Q9GAS&^dK?fHqBM!%^0EP8;T|ZX}6*-M*C`Q z(auqRS}eLr7^xLt)iq!p;_`c$#Hm=G>&r|nI(=#IzhC#;~mb_QN!`q zF4_H0CM;Y}sa8)!yRU2=oEQUmG~Auk^@ysCob>cmRx&43yrxS#CXajHDss{+2fiv; ztMT!9m%Brg2zr%;*J!~v)6Zyr_)ez=Yt0}<$zUxFN=<}m^I^Np(eqMV|QW{#lhqkuEss9(Z(jk&|EIaiI@0$ntw4!0NR z>&TpH)ucKJ#*msB=ZXOX?Gl$u-54#MxJns%uleo*m@| zQ>k8>;=!pY?^A`DQ@??y^2(;|e5SK+O^1WJGSSnG;KH=G(>HtrQm)M`g&az{K64cE zFmdUOA2cJLHIo245_fH;6?QB(bmkNsAv2nJ1-~NsFuNLo7av=Q0?fvon)ODSiEhmX zAd8|u&5DpeqBqQDqp(pht16YpRbFY_VU z&zW!^*PPUuCeWd*MKd?StJ14y*Ml#orq8+Bvs9M!p9`Za}0!$IAb9SkQY-qSAqB<8kp-vlA|xrokI3T|Gf=b zWS?QYgIJ;$ziX$m^kSsru9xMF>@#}ll>@ZB`uytG#99N9@(Ak2enmYEy68YwBMtcK zkf7PYBi8sp%R^VW$&)s*ldfrg`vLt&epr8ZO^c?`A%-XwM?I;SsW4#GXspdvlETh_eHd`1-H& zB+;h~b`^XLGucNjDrI=@KUWIyOE@5}*oe(IWLq@^k2bnoy9#V%!mVR^r60c50CcCC z88&TjE;&-x{M7+{)S|W4Hs0cFyS>$KE6bMmZnSX{w%_jA;% z@^f)?(yK9aL^?;;KCye^a=fn6rr+)F1~;p2_l=F^7AFBqnl2w*2Kdwb=}45vP|Fw7 z-=4{>Uk|r=f!ZFJ2)sVF_Zri^t2^S2=s;Mf*`X-llTPiyRv%s$?7&l>$6a?1>;uK9 z;tgX#m%4TLpLf{FMU|C1K*RM5s~kf3S*ZyQeB{?$hkHK$}h`>n>Sd!v%oM$WO0W}EHIV`X?+MKz^_oKKXpc}eZc7ps2 zwojgf&w-mJnxi`r2a>xGhRB_%Um+inzcTiLexlxFtp{SzC$b-V-oVu5mH=|G^!&YU ziMVYAxh|Es$-?JO*YJoUJx3t^ZLx*@H9~I5A-fFXU!`ko1Bl6`&urX?f64}}%}KO! zo)v&JQnAO9PTo>6Ws$w`vOqaHO`fWJc61%`AtkDA4Qe&zRPB0HT)^TYAbJgbCNmS= zA9OY0HYSd(C;o|z z+u|hX*M5Tdbi_-Fb0QCBMww4`^i}$Ir#u6BQQ>J3zys7*>9@Ts0;HLi9svPgvx42V zwAgI9n-_g)j@0D^U6@OC9;DyTb8yNFMC31Xlm<5DYaEgTzZ7uoYZ>6e^>)V@Wrba~ zUm2Ga-nP~hd*Wcz3W^VLy0M<3B6n7B{cZeL6s+>U7@$f|p=JkW$Bzf#nVI4`nju>n ziKo5e_;OFs)!Z-aYk^UGaS)qfE4WMxVLXf4NYMt>hzv;rCP=J@4`hCpe8d#7%4O}y zKfzXU2zX)eoO}+-V-pe#e52SG6C*%nA#O>Pz%L=HWVJUZ)F7qLYe}dqwcKMS^j4Yx zP{MIecXbzY3ew-WC3BuFGN?dFn+k$1-+mDSW<-C9YK&@ zfxAR#WbdHm0<+k8$a+C?+)r?s;2-%-5I)i*zSn1OWPF0e`%mPlL?iE|!c~bEy|xH_ zlLVfY!tCUg9%SLkE7WCUYOxI(ys`GQv@tPK9e$&NY_@+tUU)EMVNP-3(vx0ue3 zKF0H+W{BMQcm3{(v;qn#EXF2skl-BCDEx!76mN<)!(heHB4?CJd@9BVxlOWH>;hLx z_>zqt*o_`(90GQ|M-~?YFX=cIcLizM5GHp) z{i@8D_hSAOna5k=4RWyYgGA3Xn*;|kF+r0sNTJBCCt6b>F`UFcnxT-HbeR5}KbX|Y zDCGJlZ)IA9x+JHuhJyW*zp#yi)G5@E%s~5;na~ro<*9o(Km5O@Msc@O)}l?%AT{algbKv{ zjD1n-5cvl*>L(;Haf&V;Cgm>D2{5B{g4BoFn+y$)=7kY#m8(XlwOg0b|+?Ou5->V?4$G>Ihpvr7Il&)MHgSd~{x9gm35UqUksSLO%NCI3eF1E)hI1zQ;}f_(~tnah~A z1>LL-3~0eO)*pIJpx!fR}13d ze@g8OUL(&Hcove;MOkkOXR(MhJ%tJGXQEcIu;VmtPVtSjPrA2=Os*6iD;lOO7j_kI z_799WTg;($@%9(b1w0RHE!jX{9m+4E2ku}8mh>{Vvg9Rif))jxDLou?pJ7?bVXElE zrHw2mExhzv@QwiUvem(J{(s7x*#ye3vT*i2%9^sGkWjxpWg{W)$@XQpLs=w#u@3O$ z(2e3n|8b>{&LF=S3G!B*FRllVw8R$wh7gtV5;|-{`TLSN_}QXWrKZUE+=f9tGzVP?r13*SD>LY@;K|D4frhLDm45=?2enjLG3puqRUtv}K!d8%ps%!dRT^eS zz_Y3stc}!9)tgyG)K%5)!JGVzsu{t_6k2(iH+2MEUj82|y_1Ih%WnhKy&Ee`LA%Yr9Tf}pCnm0r-FC5p;scy$4~Y8BEZd*Qbals4V7Y8K;~jH=#??TqiQ7UBPj z4X8dxph-YA`oty?rzVp0kMLN{oZlh=yml4kZ~pdLg#U){Rka1wC1Lw(PgC!PMk<#F zbhB?NJ!yjAK&60gz}liz(oY3lQ=SdvF&dS>1Lp%9>h>|@^sYLepv5$8U09Gj;8tCJ z(CdJ$)mOd#9__5Yw!p6Hf4uZZfi*k4f&H6nn82EjuQekey(WX&9bk3MP^}08FMC~k z3Hnf>Rvv+e<^EP?B3@*wmCsP5)RT42=6M_Y0YrYzPisi=yArN!I7Vp{W~a3lP*a2Dt$hJ2S?R4; z0+N}Pt=|HE1r4?BpfMRAo3McCiNBkWfSHN)O;Etx#JZ+LkK==-O((q8b~iL{^NwnL z+sp-iuCH&N21QkUXwd_|Ej{0|u;*NHuw@o{BKKMA4*348<*i`|L0VMn7_vXvr0p-% zvjqJ%3g+)PNLvHeOxoV|7UwLsYd68$iI%l935SH=+UtnRBe%3)B3_DMb}S*4@J@GF zlVRc54jTC#cV$PCUq0tpM=QlNRMByX(iu|NG4Fqft?blf_}l zs=MTQPGa{GzlhMhZezd4A+6os6hHP+jY@7$kRfdm;e|H@dS?aJhT;88lvYs%I_6Q=;sFV)w^X_Q zasLlhcNNxF*M^I_?)uf;Xra`AmO{}GLPFey;4VQD;sOco?(Xh^5aI^Z-QC@Vx@^|J z*TLQ=_cadZHP7aFpZA#>&WfQ|WDYA)x{k7kIZx_A(J{1AmKUC$E^YOC5a%Z~QiEd2 z(%aN~G5*r8-lS;y@G9>Uw47mUpZ!te18~3`{mTI;VD7Xaz(}z{Kj|rgRPxy;Mr;$B`R=&>&h8WK68xfLr zaMp};kj}CiM$VJNnZ%J#N@TJd;SiXsn$u4x$PZYBTWV}1{$Q7-A{F84e#}Gb~$+ypq`~BcWcT-I0}|->10C&STz6 zE{-n2UQFy6b-@jYnn#&&3ZS*|hJvV*y2eFE?T)vxhkabcHC+V5_avB*M z?=+)+E*lw@}P{8!BHKo zzR+4e3vSH)EcZm*%=#ivMZU_|EkBNWnOZb91N}64`N{CiLFieKGuSZ6m1;4 zf!`|NDi-6<@}4QI30!WRf=XP-u}~xvD_9>D?WA2yli~!aI^LvsON>wEO7dK9o zLCEFUs5*%2*|Sy0iTSKqs)wXm%q6Pdr1<#l>b0c13}^KbvIAW(X5oxB$;Zr{F{aV6 zJ^vHxJf)+LrMs>edpULr0FxFeR=Jh*Rx1L4_d0A8Js`7YsA9?^xbCdd8C+F0qD+Mx zFZ-xG?fI%$s9FJ=UErZY!q?=2Rk?^wSz?t5xi0;s>IZ6Zsz`kh^(>j9_C+ftcy%sD zlE_yput!9f)Q_-_gaFMFTnhi3<_P{jUX})jZ{i{~bix777EK|ck-bebL|o1~s5wbY zWCAshh%e*)G=E7Rj4I_EC+#@$|2o%6GmcVPI(z8>%5WEkLa%If?HrC(J_CH{OHl0x z+I6m1#k&hzY*cd4XuU%9)8ln@i~1O3UHLt=(9^yoQauL66xyi2!F==VHAmn9+3}h< z1UciOrVR;6<7n=nwxp1?OHl8U2wF$9R4mZaFo6j-wME#aBCuA0?H63pKE^rli**Zd zCZ3PZ9FO20&_VE8&Ou!`VISL7mqsXMk#*I?nap_IDA6arPu1h(Jbp>l?&LClQPu1O z7(cJlIo;6TQGIuQrwmuyyY3v>tQG-6`|Z?vw~o$Rnt8xyEx$Af(3XZQO`!*}MxZ$l zW>+Y+t00A?P%Xx@wP=mD2-=&!O?wK~mqXPpgg0cK)43vY(?fM!WI(E?t_QU*89qG) zcq@t5&qG%yUeMcMfC=t;3g)5kqF#cH7Ub(Yu%Gze`cpVA&r1Iq_nd2EScJ!O+zl3Z zHQU<&ChTO14E}@!rd+en@x%l|WA1oz0;Vx@JT(E;xH)=n5!o`rK+ve_ zfBMTV&j)P`s{z}(Ul~Yl`1UP^N}!}kVYunuRyShY2r^dBGEzLQmRA@{zz<4djAtPa z3x%e+p11PUCTHkG&Jhz6)}495)DGvSkC~%24@W;_OM+`uR z%*j%Ni$nHgiQ$+-&Sa5+;JC*4$B^r^Q{8Gfu?Xxm=Ac|K4iQA zT-uB`t#r4l$C)r7Sap-Bz{9J;*>oB_9lal)5AiSBGw$L^%8wl9LS1s6jCaF!WJ$*F zz}{rgCKkg7(-;%>h^UnMiBROS$UzBrVh9BlFPylFI-hWI;u{(#Dw|x5zAU6o zT4Ml$xJe|YlP{T!#4h7iPfD;%u41wZdy4aQ$3#tD!TVj6bu%(n?EcrVK)A!)yfKd6 zZ2@n35{ zIp>aw_9|V_@=X>2u1n=Z<~v;tV-9=P0k~t@-CNyuDV)s?x``E4yX@VbDyDY&0g+1d zjzXYZ*|GgR@V4^lw%>bF%KsJ<_Rz{dXP&YES8o$l?UmH-jNfaSRrfn``@S;`*8^P+ z*fhPSt~@y2GM(VFI?#3%C9+QLsDuvMyzX-INIPQIeZy_o7SU_(;&imMufWmPuB-pO zy_bE?;6mHlV;zGZ4}%>p4&Arj?|4pn^^lvBa=7b&!1=%kdS9+{n{3hE=Pqky=PbxB z(ovTA9M|^IYkPJ9%H&6PW8A{z4Q71cqOnE0q|<5tpU zKV|bRE2!f2VaKe~g-dN-WM`zfAA#qo`5SGa1yAX7jvgr99{#}&Q(76&YoA*FfJ!`8 zU-_G$aX3|DgMQ$6rEU&9!RbT&El7>?gGLT$w#&8V#ekEpXItu>Zvv#P4;**7!P~yu zbAe_ZE=TtQzjekOF>^oHm0^Pc$-9%RhCTdyD2EPtobLVaKn?h4uW|ogu(*$Gc^&+q z@A=*~NKik=q6YGQV1fB@Pw_yB`6B4NLCZaOXzSp`-NUdsL%7`wT^K^$^v;1oge`}; zJWhC*4RZ~X%oYCy>_|Ssc>(y8s*b(j_9WwQxCD46D>rbyyFTZWcPL1a4<|7^G7I6@ zci`M&9BLLsQtAj}dhRIGLgsj0sld3uhPG6GaoYyf!nf5JoSfkGwR(q{2$#BN z_KOf-8#W$ABO4p-j+{ktnnDjt(3obLjTd^LWMV;;1AIq(o` z)<)m|5zApl8fZN!9-?A9$5LehR0*$24s<{hQGYSh?u;olvItkXvRwhKk zqj)6tbV^q+6}uSmBq2UL9jOyP4t#=wCk^;W(SX!_6dd|nx-G#8b3BuZsm69>MiF2(|wq|GJYUHV9sWm}!jl3tWAa{Q0%U4G+O z8u@v}sQrFQQst1{Dz8;ltw-m0wN+=>&ZEw%aX7My>Ra>Z@DZw_Hq|E3+pO-8b)$Dw zU5nK-JTgSs{1%@R@~`nD{$?1vd?R67gjKF1Av21Q5=2DDY@hD`Sr>PM&)ZV66yN0iJ9#gr-REhlJMxdOB7HwR z+0QD2=lRFal=&Te-9I{;3wjwaJLjtVmH=MvZ#Plk%)H-#nSnX^UtKx_zZ6V3(}RKw z2b>T=SBkP7j|JNlqZ~Ygb4q3%iwyo$GHzcRf-B|OT?-MG&9GbK3-VdkZt1(u8{Sst z%kf=WgZ10)f2-(^Uw_c9tT_LL!H<)o{NIEh5cmaLkD{^m1Ww0^Vq1eO<6x0VL2nu7 zL)Qckvi1e84~gZZ`0_&Cd8et)p_2k0c}*Bogd#x0Hzm%+j)Y6ay=cz}P?8zaEaG~y z1in9#m~s}1i#(qC12Pl^PTvo?Wg zXTNv#jqaaL{wGF%$+dBAk2#oYaC#PYmt^Sj3j0l7-W3#nkYd@$32&piRZt=veOd}; zMSSrWXZS~E2Tn=cqMSpj`M;yyhg-22wED=7I7zf8?JsS4^p{w>@WnCNbbPRPtYthr zV9xZK;y#~uaRKb-)GcxExdr4zx{$wvxRm}+kcoTD;0PaL?lN8^>_q*I$0WKUz2cQ( z82mhQwFC+CVumCgg05mJl4nC6vDPO~fX7)8DRhssthUq*p!=-HscQG1?44;8_w8)o zw0pq7xRZEouUFi8yt>z$zK-y`x>0LK|3>*&I+u~Aq3)bJvDbq3as%n9{z&eP`0YN; zJa1+_)rxnX^^-D#@4^8Rzwvvy@q`V6|9BD{M-a)+!aNY@1Y$HzxJ*bw?GXlwwj;g> zTSc$oCxrJBYGEePxpQ7Fel&-KTfnMcs_f!s3GJp z{b$17u$wWMg!YJr$PbBoqmW_O6KiO%g1?B@#LxmU;*8ike%HkB>HB>eB?Lw!wNxUF zFQN=2&0*G(XC-;Ds)(^kgX|>yucRLw9Bw4pnY$S)NS1K#V9?11o&=3enZsX;3Qw`+ zOOc|K5CIHPnNlb?2fvi~67_w^JMjbR>yV##6MC$-M9jisTW!U6@n*F|37%+C`dM<7 zjL6@R&Q7 z_Dl%l6X|MZdc2HSoq38GOJHRFWUawRW*ubp<7J+~t>-4&x~xRBn1Yp6`g*gYxAmQ60Tv*%yT&>f5wMCsDZi*5bpM9hGy7 z>#?7TSC%ZrD{|E(Tp~N;P03yI&Xj^u5Jf94EA67fgdfWmdr$Dn%VK;Fu_a}v{j%d5 z%eVVqkNaBA4_p-^DxV0lrGY9|1%o4PD}q8m;n<3%(EXuJ6_3Ieg)FGt9d;wAu+l#~ zKM+!x8vzQKSE-Ho=y$d9ePpWd#j5R5%X}VIc}7)uf3AwAZS!7MRYWVMLdu39kH++6 z(*LRU+$4vT&w&OFw3Jg|*E`YWQUtdNU9lQg!*1kp= zP#3+o=5Js{lv}N95HF&*HX#@t_On(RvMDsN_EpH4kRx@wLODS{>qudn15ei_h7AUo z>RQ4b{m;~$4%hiTtec8(^_x+@K4Q?^VjV6M`k8V9aZ9IY;aTo`&${TOQB z-C5%TJKiF%sX;L6oNIogHdTbx`lEHlyJ`(sa$acNHr(T^HFb%Ez_i_UH;LzyGV86# z)`^GfGbpLTt@Ss(PVw9t_EG<_YZ?-KESNhRjJ|gCca2N^j>bM}#QB>?|7lDQm_vg% zY6GrE4mJJ=td2O=v^NMA_NK`z=yPa)Q+9A^$n=2*L6p6x8dy+=wyB28uuBcujW&pw zDt%)T@ZXY}pBxp``f3LpPoZ`KdAuuuO)3juPe<3~#u)W4~&btddh&D~Zif?Yn?I)waO^tWv; zIwEhZje z@ac*TI2az%l^f6##_sA1+#OojbvZC6sg&sdIOXl02Jg=|u zu02|+ir&`q!8<NgpY-}}KI z5Z=+Z%D*k_VHd&ehHh>b{(s`!Zt7-rWdKi&ed@XZnk!w?z0D(}ht(YqzR_meeZmvf zP}s8-s;%bt#KQNMUFp#xGK#8u7bEZFDSL_NJ=vDMwV06fd%aJwB`KHs_Tdzg-+fH{ z`9%M|A;MkZi@vYKvwU6uLDCpk+8<0VW1s7a_d3g1GhjiDiaR$z z@}3o2I>7U;jtLy7_t_X7FmS@BkVYT)=sPPaYjBw_KeA=e()WJE?cPAZOWmJdD&V#5 zS1$qZR`;V<;&w(!=ry>{9+vbi2Kn?p?W1^{XqWZ1LF}8>_f2^=*3Rwsgw3p=^_Rja zCHDOf5UmA%12)J~}*0?bK>lz3DmS$D`^$= zUyOrv%$psJlHTxsMx#l;`#_`G1{MG|=&uaS|DUq}oAj3k4g%h&Bm=R)%_F)2xqEcK z-QYsd`OZ~?RPd4J)WI%DNu6l$o9CO#7egSJW2t(m7%nb+F?1g>ninG7hkTs9OUgmd z$=EJcVK%2?rGK$|lE#LCxZPsdFc1GSzhew7eTN$56E>i~S#*v?1mT^YeMz6-$b23}%+L(tj3^gPAw~S7G5p6$| z=Sna%4i&iK4NXJ&|8oqmPF*|n(+wc|Aaw_34sfL>jd?q5d;$N$7lg@88>KDMU=DOjJ_hlSzYp#q`S;G`5|&#yt5of ze!*~*b0}0gTwYE&85bn)^Kyz6$xnOL#EcHVb*VB24!?A%F$N4jaj7->jm&i=XmON=$9Ur`Sr24+jY#&%6JJ3ZwTI@GWR6N;%ECpX zM)>{QGx7z9Z&_#LVATBdfASpk+|*dP5i>LCxBM^Wq4>s_9d<0?>R31~P55oB67MX) zjh)25YKNVZ@MDK3)B=_eH*DKq0< zDi>0M;&#ZsI{!4ylYMdiWtuB{@BGI!dvuLUuQqWM<9b&9Y_!yE>5zEz9?-8RQEuVh z-@ZuB1pR7SFQ2{)t*soJ3rVaLjG;USOQmC_(3?eeW7lBc^ZqC{A(rIKQ1~F%X4)z0 zP%G2g75C6{Q=FCS(GQb0Dlr(Dc!M$pn~>nDl;W&~)yliLhl2U4x%hNmiOPboi3?M~ z2;H3JsuKtNf8e8nLSce#cx$YS=jpYLZrL?hYZauv$#SY-Nj)jV7kaP2Ph1?^du3b3`JY1Ep zL_+SDol_P<=MEK9KGrf# z9IgehPWUcv!J}0JVtudm6F)bOpSF~H3fITIUYTIyRK3#hX_mFo? z`y3y|U8Gxxzr$Ig+e?75x9Fe*DeI^%fVh>3(}{@u_&im#6J}hi3U|VdYg9o__;Hm= z;`C0hR4HBNDgmlruE&PIsGR``{ma$KZo1B4^>N_8mdl!DAiIWO4b~&P2B#?k=U0?y zZa}(9&9tjMb%h_aB0(fx$>zFh^dbpL zcN#5A9MJv7cqf?Yw_|<@hxA}vM4>yk+_x{9Nt|{TV!ivqS$Hf0ONC zSV(YX`51N*s+nc#H;%U_?A0$F?@ZXKpE};1u+_|RVi}McXXgy%Jx!v^*hrmb-1Td} zQM=I1wkuAH2GU#0wZ-nOjr+7$K^JPb>ehRFt_;)pKo*yN*VTA#DmtmV2i=~3UB3~w zId`p|0AHGwt%SrkQZEwuP-)C{OevY(>Uajx6 zJz6iv=!tGE$MK)xhIY_-xr(Fx{U){xXgN{2{&Fw{Z71L{E044pqVyfc8DxYPMA)?2NMN*fIn{HVrzKEO+~o* z-0P-p9E0=LWWZhLEH>T7Td_TLMu)$Xn{|f&sde}_xk-21G1o}buW_nTFVYj7CuP_5 zN1usr7HB}<0sg))Za&7Xs=>t-oWHG)L6(p`2cS8M2 z+&>j*i!3vIW`W8q9Zo{`f6yAg^(J3VVX9m{^KC$hkgYhRfirGR$?T znM^Xwbf}$_=zlrXPl^p|9W9MF4JfB$YKbA&IdGIwIB&juX%2^6=+lmt0SbT(%1U7-fC7yWNULqYrNZ669O0?cG<)PaG1v z>&E;K`~<~}ecE5>VWvplhxX`K{IJ{$-lz<*_y8JP@4E>#IFJX{d%Sau9^3<@Imw5%xrRHxlP+_r zcQFjFIdnh~#=Mao4b@y(_q)KBJ<7uP%zU!nt zvG`xjCVOCUXNiTqMTvQO`muZEv7&y5kClbY3CHu*5wt$1>$MIc-p=>xe*3;~dEan_ zf_44URF3xrd}vvX`t0_owGj3Vc)5KpB+z}Ng9_RN%Ij=%TkjFlHR0j~-r9Z6(FDHV z^Y&N-q^S419nurk_sllJ^Gbi&;VdYAz}fm0^ya{Ct4NsN;Mk%0u**Y12QI_ChNkwb z;J2m1eNx1H=~>HKgzfOQy$y)i;W!H^VsQAb`E|sP5v2JR_hsp~>o2(bW>{CPaL>-1 zoww7yCi7Zy6X;^jNB&2T%DnT8o8b5YMN|UBr^pbp*wdrL;1>a1T~^`c1$|oqAUuGb zseFyO5AUx|MtUFuYu-X1BNx@dz>~<6^)HS*93v#t^LDO3#Qb?{hLw1WK#dlHL5-l?Cpho}C6a$S- zdc%E+{*$_bo{BN0?~Gc3P03st5`eSLy5#RU-9dbcdJ$ir7fb3T5DKhtzX)#%o6-5i zs^X0Z9?8F?06I*bQTiIPhD^q^!SgWOC!^t&O{0&p z(boDV={S9B>vPgg`rhU%WE+OCaud0ZX`UZQS*8Kh zi$$-a_Ig_ueO_`tAkzn#%=V%9yhuGrsrDU6dqc$g*<_G#yZtU@UO^-MvDteN z)&65SXxI|}o4KnX)d8z>KYN4)2=f=Z3j>!FIJvzIlodt*GJ}GO(p)`)jKwZ4^Mn2s z-*qwtyO#(Zi-U7YH#?LBUnx}_>k2U|L))JV$u0YCzcgf|Jj@Q@|0~S3W5oYon03dY z0BCr8?T>)I$XO*Bfi_W3vVR6@qhF_N4swcpAiNSZLRYaV!Mo$daizgVR&!K-$U4sI z&^sY7dGUcSL(>H)zoTI*gfFS5!^8=`0&^Jt{3Z$K}aJo}=X%k&*&6u>ds zHs`G?Jerxyb_tE{%bV|<9{nb-!|7B6&R5cH9|7@o@3xA_@QZA6k6a&+UU@V!JZM3| zSfngCE8|+!jL?;m>?m1yy8ucnib`hPj$RQR6L%)sJLWuXd-O=0N7&1lAVyv=B-Vm? zDqvA;FFV2KMO-L1hPpTI2JbwXOE>4gB|M;~3m4%U7)wM9OcNtDL5Vuf_?GwrX&E0Q znGJ7`Hzm!0Sur;xee-k&ouz9TgT95iY4NN4@o6FPqCj); zLgw6H6raaD5&DJI$O?(rM?cK^9pxH*fE`1784<&o6LTwc9Va#pANZ2C_+9MdsS!aXiy$9F8Ip2{EtiX1)c=87j6?MQ;hx09 zJEypx39!avJThr{r8(~-CBIO?FZQ;~x-Qt_8=TT1$oF?mTq|4^=*ZtKYz~I76e7z| z7y7VhBHSZpO#(1-MdV1r`KT*lEs0jqZowmowK2ni3&hLg_V^Wu*>s){ReX;zNX1D& z@z*E}Nfq+}X+rXi^_^&!L}CBHpPH`ip2Vdlo#oQ7&dE!87MNwpNZuLrisWp57;0Ct zj{gtonEYN)j_^v^D%=P!N#vln4A~|opf?TKCCV{ddPBs^u{|xn#L;+c?Mm?jBBiuX z5<(W|U6Q=;YRMQ$VtZdr_DFi`dn&;@ImTbhd!PI)u!!{{B`BE8a89`wIw$6FDj}>P z>O|^fgn9VOG~3APP+(dWZAQ>U+TUnEKykWH4Bam+T^d{9Q=c&_E}!}-gG85j`Dauz zXyk_(x8rR|m65zHRKvCL`~4u3fF1nV8nHS-5M1xv^}z*&jmWchP)&?Bi+ z$Th>n)bGgE!=$wJ$ld`-8XdjA1D$pS^Rl5R9e_Js2~3w0E)WZ1(D`uYrw>(d>ZW{jpWq$3xm^V>$c67DcYeDGv7w zE6aHkQ4$i6>k%mr!spgSod}@kKBgJ`^m%)u2Yt=+;$rf>`|@P5NNQx>+qflOmic?) z#>v0(z3G9Z@A(Dv&!h$UMuvpAJ^yw53W8(7>i8TyJNp^jQ3lF>0e6sj8#oNm-ubARqiOiGO;Hx(CCdOCNCK*>Lm7eYFg6_$6EvM9A6-_z@qnG3cpu08Wt6Lp?GFE zC-`|WEFw6_vA8r66wqFLDQc^~Wy#X0JHGcyz_b#d=90wd={22_?&y2e*pjO;3@<_H zte8KPywXFlDdfIVzu0f2*M%5pu6#}*5t<{PR~QDpKXSWp0B+wmt7sm=*p^-tiQ?5q z6;x-jsEAGcX$xSNRKy1vAmPp9x6jI4c%4@M-DT2xuj+OR$Px1WAmih*= z!DTc*b$mqGM8Nzwefh3Hw-{)7Oi(CoMY%kf7dfM1P6#i2Q-w!pKxlMDT9`}l<%)^$ zr9s}6v%`&nt1Ayj@cb`VhDDnBwN#cz%6%IvPer-&wSbUe)OpTQTcO8!J+=X9`Fa zukhULyh=QAWx7M<2&q09RJDq-C9$O{)+5*X|8Y2s>RH5CRQF*A|8R37J(p5!w|rS^F&v z8(3bqBkV~)K^-hS#=oYH8~)x;TGt#A<9oU8WW-(HrBzelBIVYq&){O^ma1=Hm11eN z1LXaXygD07>E={Fg}rJ?ssSTP>K4?rqW~3FwF}Tsir&@Iu!(txYER%7Wj?6eO~^`p zUzbGuk%X_iP4-UsSAT@kCwN_-?)8PYy#AWEB|EBNj}IaKLqoK02wl}M>=zO{(D2=# z6n(PMCcuWau`w=iR%A+JZ=fk+Y2&RRc9_0tZt(U{Ns~?RcnG>FCmX zh+tC<#D=?w!m6A`XOvkfrLh7%SkTb;32T)@YJ%aKGa{R62@6xsG<_rnNQBMqr0#_9 z=2G%gL0kaaWA_HXrjjtG>-2he%)4)`PE3RER<@_rjP)w#t-8XMG!_Kk~v-YNE5MXT=|@EeK>?Y!fU zjI`~V;eREE#OKRyelXW6&l`^9yk)x+@=72);wsF1HWkQx56kFxV|UtGv)m zV-JYBDSk~4o%)#0?`ia|j+@bQ&c`WcwC9V@ooHU~245b{qZj1+J<6ju+Altm(3|e} zAtJc9dAj*0p?A{%Y}i=W9JdeJH~-g}ZlAPIyX=5Z$4+)hKs$zBc3tq0^nki8z*BAW zyG5Qc4ME*!q4%pHJzL=LvgV!`L{CvYns2 zcAKqx)H~a4uI_&CA-5Mw%U-(s_F;Ul3MA;2^)2#v-k#b=g^(Iw_H}ydYp(VEgzczs z><7aIB@6mX5EBK5`X8g_=Clv&MLTEu4e&9+Y2E`$Y;tn?;2d0`_}w4~Uzs2rln~N| zm_Z#ek`EvJLIQFlhxUIP~O3>SmCxc7C_-4|eA4FP*9_)iIu2c>Ff_aw~3_;=bh3cUa#Erb8Lw8a0vZkaK zXp8huQU=B)b+>dB>zR}%{e^>ww+|n}+loF82NBi_UJRELUh@|Yn}|JJ-{JS9F!sdA zX7Yb5%!miMhdF;Fk^*F$8p)wtp;wO#d!gcLMy`69V!KA(P#t0vvN_bg=*zNQ-piwx z4Y|3}44Ff~|BrD1D>ZLuz>O-K9Qp=q9e_(ApqX8VrIj9jEd$c$V0nH2@L|tI)!TSxk@7$K;auRq_RtC5%<_ zgOo(NnH)=b6Xz_C^zw@($dXGrlk9H$RPJ;4V&&k$!JZ`uw3xpi1LCQKknH83@_t4%F-_c{Rn+5krd59Ug z4WnA*`mDy$KPZdz%W?qPBGpaK!cJ#jc>9)IaOOFkW zujNc|KrKzKg49+b$L4rmC`}(jLBAI*9V>#b%ey>w4Y4o#x?(NzXy!5n5p_6Cq$oyP zq^wk&!OW4oSI)y+PkgU*#MURQRmS3QLZ-3`Ka2lRX~ehlVwDdG&fHz98H97}XR2*P zDod_%BVJ(2Ro)~}yivs_4KuE(^2yujpH+S21iF>H!I^K$k=Osv8fSqiTdsF8)0xTt zy1I>3jd=h>QovZD+hi|v?6&)V?e`UCAZpW;BG#k2PNiHOb;y(2eEK`)O z_QCBGd{L+2#`#I=emsr`P@lm+Q{*3j1tXO zWNO+T4H@N~vQU$O-k-EUBS(J_AJRO>)F0Z&wGXA+9lBEdFQnd*vp(n+I0A>%p|P_aXfv4_A|0J<(Fsr|v3tn=nK77uzKO>v!X<`2Xpl(|6`C^-=iUoY(psd;$B9z8n9Y zy-t6E;Kw?qze7+n>FQ?3j}tr8O^%-?wySF#KTm8`E1hx;7V59gjY^s3sLQ1hrbY<( zufI&Acf)l7wF`hbthynl3F2w$6a6T%FZq@JDJnW?t>HiPdNIdfk2WMcHTYuuL>z+{ z^GaxKXvD_ze;RbyZ@lw{`?v`1MZ*u=RnC3me|T5+l+kj!#b~wBgD``I)vj@rOq6O@ z|Ihy%lcvwsPHPRrTAH(k3aRaOA<5Qi-@6tK0CjeNGhJVGiNM)ydvxROha2_!#UN^} zN{{joRL#@pf(y&4^(P_q#W99Co-G9egDbQ?S83qF^0KWAeQkH-Af2S?$EJ3Ib5wdBx*4JswkI6*`&N=TaEqjN==iE_*`;hu>hj7YF|;w`*?@;#3CAvW^o$Fd>U#`5e!Je6}b>0kk&e z7i~_q0;<%9SG9%~P8<=n15-Qg+B>_2MaR6mcQWTVMD&QGrW{jxj|aCnb@cu5b#lHn zu$w&WdSGxr?k(Wx5E_-?<}C%ndVm{-L%|>1%|;^JO`wf36yP%G*QlAxdXMv?Zyk%l zUGm{$U4-d{Z69jT-#uvO=ATq0y% z_d*mCa=Ql#JL4(uje{gZg?*(UHq5?1%dHjmWFXdcKD==-(y0Rh7>aO6MqH6@wNF9D zNKYOeLVg?$wq1+jj?6q zu$$!W`(9zi^5%WJu|s2)mcEdof~h7ZY1I?S$8zN=Gdb)5UUFK|ImD+dhK? z?>=c~P8#b8wEaMy-}Cy2jEw1xIGje#>%D1{NIugCw$7%k=u=vCP-y+@4&9+B`eP4S zVE3iXZ*{{4r|oJ?!(K?=SQd)gpRqkB7#EarD;a~QXLky62wQSFOdGKE-hy|4Kip@APFYihm>K}D+RW9NnHNCnT%Jbed z{dQ)1*VRsdF8J)J(*w`?q}JyHZu-1$K)YJ|hBhvC?({v^sB}8!XWr!H@YOH9>G!eY ze%fZCeV*U*=C^iy|5YuaM}_{LE!S-G{EJ$xk0|^vwPqduO$`yawSS9D|Zuno$ z`s~*i5S8Ok{Sfdkx0{?5D9F1y^g2ywRRz%XN9d=D4=$5oxXOCxt}vgv=*ek2uvbhc*?pyXsXmo>p8Wi5`pDlqHL?h&3gr#Z=LwMB8Fl z#&6?rVw+iW7`(V8?BwW&aSdFjh>P_9c>2)A^kl)dzzX_ZVThkEW50;&O=XlN^if(E z9}+K+Rx{p-58+GW_lSRE!{VEgpy+(&=42-F8*?aS7?H_Zl3D{_&2mb!hbmc&G@~br zrAv>2pjdy?zkw0#V;L15K5YNY)u0G=c4of2gq@o?2CR+m3<&985uwmg{Nd$C4v^Qym z=W9`R(pAsBqBqIOkQDwguiSwzd@C=)z+1kn*Qu_P{6y-*U+QJ8-tx37w1c7NGjt%%Kfmym{+Orh^5o_|9#UxD}9h=7WF99HO-&)FsLJ~ zIJzf*l=e7A?&p>ciT&vlnBGs{O&!lz&v5esWZ>hsk~J9(%*CXHjPJ~UM0_Th^_t+2 z$z}WFEi%*CL%403O`PRe^GpMWhH=V#!?}uPr`|&SKSaItSDV@UhTBd%ZHKzMyU|j| zHAIMeh!7+p0Rjmj5P}7FcXxt^Koa5#REN5|d#CPlaz5+3&iUn9`!Cq*eV=FF_fTCjwEOLA=gVgGYe2qNl0cNdQ)>^<{M06&7v$WuC)}MJ)Q76ADLa@zbf;6&Jv1U z>Z%+(6_r??b1`76usU}mJu>EMZff8i9xrcNaBE~pUOdAoyddu-^Iz8Md^U^1Ov|rh z9}YQ`f0F$>Xl}vg@cHyz1>A_gX(-bk^8ftLC8SmWDf@++E4ru>fnDXy zfH~3jm3X>ml(_QbXc!)J#)f^&aKB#)YsA3$d-oi`|ZmbRqWd-f5 zma^>WPpc{XNtwFSPz>Yue`zQ;9FYKwhus~*-~04h3~y4X5k9;Owdo^&QChrNa#~P(1}78$vM0ayl9;*wG9{<68XA z)a8u=LVl99@n7OSk+f-}|F*bGO#(7S;Lvo6k`}FPo=+|3W;SDKRguEx>VTYxvgS!T zGweaj%s@vrq{S=nSLpc`K~NtvyQMuC$AGk44*n9dx^;R;YVfL7d&Z2Q?X4(AZlF_Z zEOQne-&(^I1{5`300e5ujhAesG+qY?H0PVv_%@H^H?e`g`a_!ZU~y+|^Gd%p&8wT^ zq3T*x^Hn&aVol2t#EoJ`OBITgzpmva`rqvRt*+Q3>E*4(xFWG<>s|bfq&;o+#N{G% zTN249PTF?DKU8qEeF-_7Z`Y2Yu(;pb%ctLgPp+O?ZFeBVZm)d4?FWh76h$oJ@2zk*V=l~ z#ced_thx#3@=eBo1O;uj)f8ZXar5$*L zyb#gRgIb##+BqE^n|Y}di5X8z@9e@&OA&Uy#ycf8bh#5K@qfB9h{Cw6u9KuV0ZFpJ zpT$Q>{K!aNgd~fyCdw)qr`(NnkbI}sMX0)W)7-8v)E_d=+e&10Ort& zu5G^Odjh(|AWZwht}EaxjdY2cPJ)x??V*k$9Jb9Z)ZR2zJ%V8 z(cH5QgHNsOiN~fSkM$UF4T)QNr{ZPt{k^V)fw;upSYopvvR6hD^YeQj`9pbk`j(Ox za((+iFY9|l+Y+{{e>ts*y|sUTz*^R!e!qaKP*{IN zz%OQ2cemGE!`bd0uQ@h$d(AT(@4oFlP1V%1#m7sg?1=%i_s#D)4P4oAzIO|#xY@op z7BanVVXxJXSIOyH1U+ARsE-2QS%~TDLGW|O`aU9uvPAvvsQc;M{!GkFaee<8?AoM1 z19NbD6LJPn_;vC0foy_Z9CkoYcq-ryd?ohqPYv!Mg-0J8#M#Wh>cMn>T@-&%PR2&M z3|=9>=KM4Gi^7SRA>B%O6uw-Fpc29yq+IGLHbPoJb6{ol4STLLj`t0DuD7wrbEDDP zciC&E`bYm#Z_kkp{Q*Ap{o?*XU%M{Ez!adUWn=&edQ{&s&<63Xo;C2!ud(d%pbPX> z(T~A=_?~?J;CVzy&Ti=jWM1ZWX%MO}4I}MEYf?1Qml#VDXlOTfC}I5&2UilmW~d#{ zj&mNmPS`0Zm(3?Uh?ypHC6-0!%UC3Pp0})=G{&`)sr`wOH)YrTuW_!(K9MmIcZZkQ zntwhHAEY>kFBryA8p2?MK^{<3^I(7n%+xeU@qn8eZGU}Rw0j0mdEwUS8$T$zb;rE7Kx@Vdr zhhF^ulr8sw>ku-Er%+KVlXzLAYh|B&HuOvz1^`mplZT6ZZ#0R9uY&f~z8KjE7FC)? z*bq(Wed_<39tvgK$Rp2R zL%ZbmwuR^#d907Lqd{);{kyqMVFyIluTo$@RaKuAb>MU5yA_Whzl-~oTcKMEqLdt% zYc5aO2Zv>~EB`~lG8T>QK!Q`-MuSniQc^}6(NmL>N6(>@DXMF>VhGdlW++Ge!#)pFM%H%}P(N+P?M5LhqNI{mN?q#}@7A zCSP%b^JqBGP_uS)81%jZKl%-_rsSr|)z77{O_c^k=1Ejm7&-fndIp@3iBN+OkhCXi zF>;64svbrDOtz|Dp~ezlXjY&T5_~ism_6}QO&I39&{dOL9If2AtN`#_geb=gPMI_4$rboJOWLAOqan;FxiyMq((wYpEZN70k|xp)-sg?=}_ zpSMH3$92lsKk9uhf5zC^v3gY+ttlxnKHFSPY( zZUGiF9oBC21=MZO1_Jq2RBaomqU@>m9(b^LNVfr^D;U+0{mi-VbhXgY>=4}~tUKeI zekNR;c2j>0ffC=;vye+u{?gYXElDAI6N;N~UjGEWNJKL%KsUv&H5|2>f1et#n4ws; zAqKlepfQwVOJhzOMzG)cj}5167K5pVCpdGot7g(gJXWAN?UFi{ubFU38_Ux?a@}MK z*RFAMRX^9#-1#H5+E$Ozfnn`4&mY}*-9B&U_IRDZN6}Gl6a#L7fq;HQun9e{H!g^tCvnX*C8CYc@Gyl!EgnB6dT}3sVd> zD`vJS7yF3stwX!mjnCAC<_xC7?Zj~mi`9ctzpjsqbTEyh_Oaw*>k1_u_2jTsPHzR_s% zL*yPYeuo~*I&azsv&&GLLSPrubfyY;srZ@6jBrf>nO-6uC27rzk>W&{`7mm3!b~$3 zRTY2E9F1Nr>@XLj3*x%W67-MQ5wigkDmY=jf;k)W#QYAsBW8}L2q!b z8yD&Cx*RYU7*@ObXg3>ZZqf1=hIaP>=~BaUj~6{BjP_oeI=&cVyfH1M#!;WdhCJg> zKz+?slbf%sl4D8+8p}LQYS36Q-1Gr#EGRPXfDGkLGgJL)vK!4s(6G!jvmSOZJHX*D=gVaX2KPV1o=kPWSOvSF=8x_QTK#G>r}K~T#j|Q z?P_hb?!~MVXssYjT+CPFPUk)2uZ%mK_m00bZu=j7oDG&u#$=asTBXt8`b!};{&7Dl zm6<#}c)ek!G|#Ti2Gf|=#@HO>S&{SDZj@`h#~1|FA;gS@py$LzjET@Ou{mR9=re+GQ<&4K36zQH zbY=o+3Uc~)0%1yVrdo$k z5AV#zOO_Oyzj&*~1Q@C^S-$&f%B!tMf$EZ8Yb0o>@Qt+xT$3MRy$wmqwHsUD2g>?5 z<_VpX@oOvsI+4C>tQy8iEgCbz=ZU9}J%me=tHx&__9YRqFpbcf-d{V()u<4*ep7)K*-uLCC6sMUVab7y-)hlnhl4^+ks z0s}mU!zfL@ppi&IKhRYkf^h}eE6@l}u$^+BUjz8Vs2zw5(T!dN!2R-6RbDwziW=uJ z4Yoit&9wp6r)hHL!{OQ^j*0M}+A~L0h$0>0$Ts9m-T0w;q*#CS-~r@YeS^byRIp*{ z{>!La2F5;{Xxd<~zlAO_{=N4N`nnOicMfKYv3SoBOt|s%?gTG%%XrIm&(AIUYL|KK zZmBDH;+@vknf4iQqVu=t5pb8}1%DH0VUJt*1n6;ZGQ$(B>zfG3hqUy6_Rsa>58C1F zpx)9ws9(_UL)+orunV#^kZ0-qFDKD{u!i z1N+Y7_?p-DFK}w@Ui*c(*V^d45U4{nr~MOjRrSm!Z@=eN=CT0j?rK5Kd{{}{+LUsH zQ{yz@O5~!ZBJL^V#pbVJ5L97na7ZcIudOdYjG5Vf&Ho!l(>Viw4;$RI9kT^DSK@^* z;Rd@yp{;mu4-jm`-|9VJdq1Dlx5`IC_|f;kD~cG?U++ODz8na4OC*s7H@aLRT^}?! zqx}y_4?14)Pn9+v%k{rJwC*T|ymzSWh&?$$w&Ab?`M9j^5STJw_Vpl(;x~NYKn^8g zINZUA3oaCQ)!=dpliD8QOogAT&){wr9W5NfuPS<;(N732y`8j}7*H`?@PRb1k{=}^ z>8kFskNXpA4umYk1Mhd0 zxhxLaFInUCA}B`E>i9HB)xG)Hw_v;OvSS;A;oaAd0)wM^<{lBy4y2QM=F!mU36g2F z>I_^%8tru^w(M4bZ`Ovql>r^uQ_|+qhjRN876c;m55=?v-Yn>jd>%wEn$JER^rkq8 z;T+5<84FwxGP7(xl@O9qzLoTVF}(tWS1|G_LojCRYbfw?WAAR9>G72OU{AJns{ShC{q%DrdQ8=D;j9I5eiMvRi}q)6aN%X zVYw&AX76L2v28Jau|cUR@g;0y+FSmOFvpCbNOPDb^Fr96@IBdUnE!+imls=g#AA}z zSEcosZ7WDwJx~@Iz*{j;71_*t(P4@F%AZ+35=D<8mXo8#1&aJy?vc3t8C-6MuseA^ zZ;@!FFoc(z(8wq9z9&tOJP{q5ObBa>zM3Lq-sZ!^FN3-Kk+h|Bml#{K3)MfSJ|oJ% zGv-TX0&#@^k`;_QC+N(EV>E)tIqOim*d;k8#K%}fZZO<0wmfe+^knRvyjyX9)MUI*Lvff5};0B!QbOh$QKPvTwX zxAJvK7*1zD4JI6jkfJPj|}M);8yBr3o= zril~&!nUQU5^6B$bi2ev^rm!b5(+gnosblbxSWo+?KMp4;Yqh)W9hBQNzkY1cT-kE zcc%_e`bHL}swl%F%Tn)CQG>hFHq)4$)--xRYUBB|Zu;>mYTC!3^~J1oKyYgAzVr^p z-|0Q+Uzh>OJsDd=;i7pN7ulh)yE1*koAyOP>Xf{K1@_ zCE>aTr)R}+chlczm2tH+P1euoDU|!!k^CcMXwI^j3DVmfxFCxdkt2@XLs*%kik-yW z$ax}L z8}E?!PY7AS%Y!mvd0+ERg|3Z!kD80gdXPf`e4Qr3$e0PRkb#Y!IP?s%u9?zRi8tnf^(}KSo?zJRA;ak(=S)|vik#ys?UeH z&0)xW}SQ#@wNh*0%hv5+HNy=v8f~;tFEbC3H*CtLmdzK;Gu+A^e)mn>CvWw^D6s zNm4>Gspf7N5|D_?LQFWUGN~5mT;pr4kMO|5-OSri1aZnJu zwf;yjJM>R|MhK0`ua`0whrFr(z<3=z(BRCR2uf*453LFeXvhh@MfYf^WNi;{YLKw_ zG|z@f)?+HI;Ts!EsjDpn(KSnIslXxi_gY6FLN!sF1?rOp)INt$de_y_ppNZF>a4K$ z4Z8YOh}f#z^-;)|rRDX5==BBWhB+8XPILnS`#dAIVH{s9e%!d7I47yPv6xgSDr~&% zKNdIG1Zpsq^2jdvyslt_5r2{Vl#{05Z2w?87N>cZhjQx6580Z zD(D*%-+~S{GS;=^g`@<3Y8hi}4*K5mAEPVipO$Zo4}r5=?U+9FHLVUzbpXDx$=6$p zv(eSYV&7#NRpW^7^$}9zFVN=x-A#eu^PRY+vwrPOZ=2mruN$bzr(h6%%+#Iu6K9_9t>^m2n)Q#!NY!Z{LI`}`n&TtYm9*CQJl55;mifHVdAGI$(iOg~ zkA24mx3(Pvxk)f>Mc{v1KDNE^W7i*PN5a-tEodKxt4o<3e<9ZwuIunYA#?Y1G@vD! z)g5oJGt!`)9=Jm(E}gmfu*9Iwn}mY+iLR~0t~g{Dmoy^S+GX_D@warnCa3X^N_JDI zQN@yQ>K@K-NelHwM7HEOEhXGh@?XF*_V@190mH0Q-5zwO(D80MUB{g476&>r?svBa zj)eT~J{hzs#JS^>_db1V$8T?>zN>SZcbs0_>EJ_AKJDZIa;5h>O}<}xwsoxlCA3}c z;(>oRZs|JZmsm4RvKjieoGM9zvx+xMt|89l1G~4Q)?~}OlhK@v$ZiWJBbCy#2s@aZ z(?h^bCOqqDz(0uR_uM4hiSzDVPMj1R>&1}<`GnqV|0G^-uZj%iF6w z;QE}XZV?On0;pHR?)2r*{Monr}xOg(*5cx5B3g2 zf0TUh{S8MKuIYmzT5=2f>X5IpfPJ^o^U{y@Z^9fF2lafwNH0wr*t0m7kj02H!XyP>Vtc_8aw+Sp6r z{JQ^dpR@h&ez@>h~!c5|U-yY#M{_uz}i3fLj0yIAc!@Y!Zhe3t+seumZEP#U~SxWM)X?-p2 z0sd%sB>e`)*Pw@hkj{$jL)CsSORz%^U|S2$%J#vrxy3ROA}*^yW^#9Ch1 z$W787u9N&PQdg9-e5?QJNU+@9zm!9f`;(_f#L45y%y8LIv3si-^?xk1osmNtj|ko7 zp`6II-4@%V|DCml! z!y}b2pS+JF*Wtn0@8qiy@tK?D6r?zuB?fX8N-^+02p4fU$K?<=;V?DyzZ+{JHG2BF}GYalGOb6k6b{Tnr1zbycF^u~}SY zIU+9owsI25PmLP2Lt#>2qX6`-Bzf-7822fkFl*fHL8fK0z1U{^O zK1u;Euh=r$0r4p59ew5(SQxFchYIpyRgo}p_JC>to|3sn^#;LD8&PjVqQoU?I%;cj zsk#dFDp8|0q1zJ{sb6An@nX$#%va%j%`t3Y?6`)ATQA7f2yuNe6ipp|BcG}n##cs% zYEBVm@)9(U2r=9$?KHxHHcN$l!7Xg>m{-vgX0F|EVMsP&wg!&#NyQoC7#;+m2R6~Sz z=A6`&z}m8oYL3IJ(@$xBA^54?+Pz3nN|%;~nxAw=TYxer?$RpIJW;jw7G_EOR^3cY zTigTPcC16JLt^~r$u--?UbnLk>EdB$GfwDa@UFBz-2;SB+^b)R zbWJ|5_eQ=;GV`$L1S0VxfXUgEw|GrrE&2 zZQyGRiMagetA;Avv*<+{flK`uPs4L*7~^UpT$;urHTkX{Hh;mm8(FQ<&T=mu3Dd$n zt_-AV%e>ZfZ_{4&rnUoh>wK!4F6)8-CvE=X4&V3Hvvkiu^UJICTfy5(7nOtyo{FT~oE?dW5 zYCpSd8+&0h7jGYXu3O|XX1b(<+Wf_2U7^iiyi|9|<}W^?U*lQa{ZJq5b-H7YzT4-o z<`(@cz`ptl!+u|E^=(5mFtUPckb%Udo`(0}%p!zwKO{ZB$jI@F$(>>BhElRRjCW!7 z89An9u+M2FCJt~S8j{~dg6sPMGwsWsg6^6EHY-0aP72{y8P8XBm^et@o~+xXn~vdv$-9r&nh zz9|Uwym*bN9{jj~YPtxyoO{7+=cmi&n%$s)}gMv&`dgW6Bfr3j`~f zXjzDymiXLq$kzOC`v5^L74a<5sG4|Ro4`yzxX`j1;+vOmLHg~<*=fo2 z`T8fvTBhZMf0uK zQNi(xtzS{6h1sXfrsYnLCXSjGJ3XE_Vw&glWa5x%r?bcs zVhVD}(@in8xGEKsriX5?hh~|#d2H!DVGj4icl~AV_eyQ;Fu(ThYV5G=@v+o?vTy(w zt4b^q-`nLZ%Ol{el0@rT(8WTNl?c}5yIO4%-<(@kgC8er-1-{okTE&768bXj=NJH1 zni@0~2|r}>7ni}$*!;z#2u#xMv70u3@%OPGNWAF6_zL7${N?dOsJ+6c;|NrlaOyY< z^(Ai8xEPI$4RBBGpW0&b5cS)Jpk9-M8w-Viw?lI?+CX4gLt-U(V)$gtGsx+YaZaP3 zQmzc$0xeTC1V+Kal}Qvj95PC_z29D@+J(7@c&GY~+>ex~6}I==3{4bRgWjawiKeMaU{C}Eb-bYvER zZd!imJV9%UJlIcMXwn`SCbG;k9L^FgX5{{Fq_yVS{q`iH`NF<%_ZR&~TfTaD_2<+i zc%}^`7M${dN!dLLV;q;hH2!5o5gYt8ciwV^9rt4fi+cDj`OYUMUM9*-| z!=BJTa_+*p8Hi4Q;naqc#}e>PM#rPe@KR&r;YavC#&?Ih2{@DQK{27-RB}K}_+Yy3 zP)7usH|{qPTg+kmJ`%r}2lfGczjkeH=ljY!o9mzW{_0v){1UWPV#<62q4jE#Za@J8 zi(_M9^g(fy7u-==$r^`$9Fhc2Ll|U()K5tMu!_V$?HTF8`JqnA`%&p=ks=Si3A0Q| zg#5(xjrxL?Vu7mpfGF%!mDKAOj;UsQjNz_m4!cS5aND-_6yB;m>b#ZUrR{cXCXDNr z9CIc5=y*pL5&Lzg4?iP*({DVaA$jYg4ys87dhLNp(pkeYhv)w54Gf3n{_%#U{cNP5 zvAhd{^lbRk(t(`X&|mQYiEU)(4WbI047CAhZO3 zrQ1FzognTxK>bME)9XpPPPFzp;TMzG{m0N!(%XTp2(f?pz$a)2dC%Y#$P{v~v;>$) z*)jwIcu_irzIr=SSILGwvDD~cH}@v$^(Q41g9_Y{j{#p4Ek~Bnfr@8`z3F+%gNL$7ffeHJlccZ;Nas>gOa-lO3Mr%l zSNwpasN9(K(f?6(eF}==SBDlRQkU0Xj9x|6HqMV=(nw99P!#P|GbczJkkL{_tE1bs z*7%>J_qNp%A_EV$7h!z@bse!Na*%gt5PUF5({&8GD|m%uD)?S-s>A|375uw98t^)V z*fZb9Ii$Cz#;cJrt#_U0CI+&%+5H-$qi>yCJL5xNyK4e-W&aG95T(4!o5=vu|JI^(togN5DXy%tx;do9 z?7!=N;y1GS_5Wd5?8gnakdML+HFm-kqG<3n0!$Nv=*Tyr}8NBuBZM^4$SB#k0)1UvPpHx7qiw98dDZ!jo}`p_-Bi;z?8zAjc8rU zKu#%&l5#osFXVjjjNEwmRk35=J#6MlD`)6POQpDLe?g8!oCk* zv+?op)#R*jlC8Sb8UgJ%m@p^1!O}XGx6# z#Ec!ufz+cJxa3#l0~z%xYLYnPl{la9GSfX3jgQUrN=?8`&lIJt!Hi|9(oE>8%GA3tcEDO=dLo@aN49v{}m{qB0L;aXBWjbC%xLi>1t7!d)KMl+ETj@$Y1t zql387Idk|S9Jd^9OidUmM=FR6t;(Gho6T69%Ze)tx|=&BKgOJAq&e-=3QZg z6b|IuGZi_9^6OX!(sB78*$K(_3y@(Z(dB}|@QJv&1@|M~^VOz>ZP{U=i<`+%np&4h3sL`z8<3*HcNnl@586O+)zUW?z2aR5QSg?iiwm4t#ojh8s zh!y)s7hjD1LOM|VDvm^4Q!+PBN7ztuNVp#FP!cR0#-U5d!mHTuqP_m;QRgCif1gpO zA}9Y;`O+dWxuSnd(M8Jjj{M@q)US=OVr;<9ss=5Ha>vMZAt%cBMWTY9l^>3*4BS~B66F=pUf#o9MGGo_$~{lrRk4~!Cx5Hh!E5xt zQvr)!M|x5rif$wRtkCd*#GRE>`8IE4nF;qtl~X3iT~ei%4dCu59m?+F&4b|bwS>to zb9oT)PjhW~hrfNzgYqxrtg^=yF;rk-Q-zL}nq#c^5>T1pSLsY261!Hi0&8rSN>fl# z{LISH;9~+yWk+yWbYs=>kmuZ4Rb9*?j;!ioXr#^myOTv{)2nmXiJ>{wC&S>38@4%r zcgVWxC*jM2a%&ccw*@-Ypd+H_f7c{)=F-mB@HwlflA2J?DoSyUh{GmV)$~OEQ)D6g~GaN0Z#?EIw1W~ zbbH-sP%ziM?o7~K&eOV&!A0TY^*$l(>?ieIj7b)%VP~j4^KpY~sDy!TV6vP;rZkkZ zP6wGAuCT>{jSVU`kIrsTv)cp64OaGJ8nxk4m_3!#@G?w5X{eLH(lna7QkbJ=&_Eo%U3FN)Ml7dnT7wVHw{Sy4Ildw1WWyzb zA>()>oFqtfZ#0tUCH-t#LV=2&G~uZ5xIaxvv;_jMrcv7KXl>J_fEsR8(*7#a;8q(m>APE3hV}-ani3#&+M7)w5Ri7V$s7DqyR~T(_`*niQ<+~`e_Hb#SWKs; zIT3NNnb>?8*<^ATZ3lZ!P)QlB}OC*KqgKX{}^}T)eZjjd(X{ zLEB7!u*jzkOJ>Klw23Khf@N(tsr2X%Z6Bx~xM$k!X#B{3+jr7laTc~S15Sh|xA)SO zVRPG`1oBv?I<^IE4Xy3)3oXs(Do1Tg6>J{1)zs6qE!RLDR8ZSK&^vE+pv)J5=NWJ?@jCC_HD4ndP;i+Vpr9H z_S?wD(zNz3C|cp_jzc!D$+iv#hMFnr7{lI4JKVVlKO<#JC!GLDgm<1HO5-hEt4P;v z^Zx+ZR?2+7eb+-u5ARsl2kMNd7|C*KA?LgVMFU4rB=NLc;qxSI0V4K!$yNGM zR=4CUT^ZWay&(|89PEY#eqx;LP7bOLdD}f2ygS6Pa|-~gpX@vasL)^Q+zUvtZ2=Ad zt|(u1QhZg?Yn>IqJ3aF{UxBG@`Yx*9*2a}xr=ibkW=M9zBg;c12?$H^R>@7&-h8O! z6Y5%aP4_YMlMGh_k2n3soQfrf(xHILy@NNK>#!`fvf$S(?7+0CDJ< zzH0gs=Bqvny_&hVd!KipLDdcSHrQVN)4hM#QUJw17gVX;DnOSkwfnL!wO83Q7s&1i z=@EdBHl66X2)R)!?{$DiR<7)=g)b_3(|ZSjEu7uA9vPDx+Xq7hX07fkN2jLG>pP3d z7a#0jfXz)R>&M_)64v)u;Y);{`>zs8W8V#|A{Ggj4$w(FzHlJhe>v~gK&QWLK{N1x z%#2z+xPh{c^Lh|MnTRkAlBr9=hXy04n6Tl&BC48wVo*lg%X&I^j#kFn&^O!jjIp|J zjn`6ROW!sxlu^>>?+sRu^_BY2hHv$a0T}(e`hNIkbw2Ayfo8P8`-{N`>i74*hN!EW z20&2vvY3H7SY1)mz!&)M{B?ud5bv{34yL038Iyx1G$!@S;3v$^6s*(x{# zoE#aLd@~}=rg7L6o-gB58p9;AD#~y6qk%S$GE>Mvmxsi}92oJqZ;Bjv?Rj5wZ}5=! z2Kmy#cpv6K+Moq6BEd@+1DCgsOCg|*4Fl3TaAM6G=}X9&@^?d?&=n<{hALtFg0`U- za9u82=7#u_6(K7|*{65N`ce19pJlJn&yzEUH)2jFl7?+Rcp~_47A{g4HLS$j$4(62 z$3GYBADK_6;%i1+i1yL3BMjm#p36uPDTBLkMCZROYT3wr|DwokBai*hadwYlxqVGm(}w zs@x5wPkA9vL3bq`mk(fs33~Z$tY`df#S-i{p|iprHx%2YVB@KR{fbKbJN_$$iI5tt zRNN;n=4C2p5c9d2N(a)ss5&KuR1&FDGD&wir<57~K+cTe0{5ln_rn?Pv&{bui{0(a zuZKI`&*(l6KlJ#b^cXqh6(T(`lHq-$M>jGFIMm@PpXbYHc9LU&4Rum^J?KGIf&3X{ zPnlI=?*}XPQE;I#1v3;XSV69x;tRYf%SGvqkfaYNg~--accmPam9j?p4jq`Zc62pn zbAq#N*mFI;W>k#L721vV;10%Cj9$b|2vDQH@YtBus_pnY(eG7Y0)h8d6+t+`o2tqu z9_6l7braj8j;buAxsg11lUt;vR$k-Av{cJ$-C`^?a;^IY{YCkA58u%}3J=emA)}(u z>sGHyamUBE6Rg}1=xXs-M*5ztzo68BmQ;_9&IZ%UKaBz*>=MCffnQFc>*xh&W1g34 z39LI?q$0pOGhV1_5VdLPs*6aWI8eO^6_6aN2B3E)7OF$hlcIa-B8)g5rdDIO#obWf zz-nVl)!%VY0YS3{cQt0G#tRSS@6nL)rs$&@0l|R>)f5t%xGYUS;YU=bvc`4N>Zq)B zy=-+-wzz(@x+yhoiH1()H}`tgf>95T>$1Voe6JmS^3m(wf-XPRb{~CfkSfl1VZ#g6 zIFL|tMZEx2Te(c_2`(=!Ri{E^MgD4o-*`S%{S!KwQ=vHuJC!v}69qS<*J!#Bb*Vzl zRU|hhRyzxIG^t*D1ob@OyOx5k6EU^v7&qYu?I7k%+_3gvEG1T`eT9800PE)AC^3Gz zgSZoXn$8b@EIL{ji0|YT>XHb5aZjqmt}fP#szTQY>kUX&zrSpeRrp4>>5zS(ePK#tDx9VP@7AH;9FGCp< zV)Sn4K+#k^6a7YL)E8pn;_~&q*r~BJ{b{T~5TJi$Ycb*)=HmSLd4|n6WptOp4ZoQ8 zK(oe0Ifm1$a?y=pZM-~&*EqP+Ov^OkZX$JoX24xGa#Zu)*(bsd9M|Fi`y4# zCw$aR?Ye&euj|TmaNx44E4p&f(Q=mV92in^P`?<0E%eaC{0Mmo`g|xP`<>nbJC>QJ z{|29%9%Xn5}Uv zqYzUQ%Q9AC{}u?1!`P^p660y?HNMn%4|gQ`nYQJB&f-QF&#_5uor~Alzgo4+eN&(I zlk0cQKHX7w`;o`GWDoA(blsSztb0gr=k=!jnjY!1wK+;(3Bc3`>u>nRRreXz0ZS{~ z4Rlaj=|V#bxTk1?;Wk8)PdBdetI4@y#6!hd0%I-=mq9Wb;Oo-p#y9ZW;(XHzL|*a> zlRNTI62-(qo=bRR%0baYJ*HmNlX$-A6gpf8F}*;~|$Yvx`33HAQnuKkO!z=jp$@e;ia8+&y>qunZYq zAvS-(Y46Gw2jfB?W5aGE4sfp~&RFLAt@0n^1<eaRCPENmX~&G)HcH9Pf#b^mW1@4=xWeW#{%SsJ zxZpZROEE5Tb5?9H;@p#@C}X9^aPLgxRnO<0PNr4fD_gFbs5XDWMN=JsUc1qB(^pWb zGOq-tmKB-tHh)30xd@zGaNm3a5}rpj|MWv;f44Y5*JnPo&}?t-o>}r??P*IbD!89G z!Ey)wF8Q@}IwC(Q#kv!@IMKrjLDnS9v9eIB;~!WvQF+40);83~xGz=%njE*#dKqnw z-EaL5vr51*>i_2~&^S+-SY=c?Pn}p{yyRSIaW>6!k!UZPV6K-G&8A}aInryU^Bz9E z)#fFhah>PP1h4ki7<0AviN+Z7HJ?Yd<2HZ6=c+&p4mhR!n57gnr37j@3Hn-CY@G(a zpFhuf3^JB8U=8;x&8oIGLU9?b))TM=X=kk;Van7)V{750l)f=9`1@qHF$O}E_am|Fb=;-#W$3lBU&i;LV`C2jI;E@I|MSg}O6!%N z_@S32xBckD{n@|aGvrwDL4;LNCe$I{D$9A*s9U3P;akx%6^s#siBT`7Q?Q5Cx5*c< z?==ks4NjuPVyEH*bTg1`gvGiMSRO&DM?*S^X#E?|G~#DN7NCM8Fxq*ONI#7Eo=E>p z(?9O97I)R`Han_e4Mh|T<4fYDKNi3Mxgv>0UbR?b+?opaiS(z&K?F( z)z-O(sMMcU=)qK)t2Oh0)px2C+_BD=C2g#K3QQm3moUIrW&dTbfSwyMr^FyuDSU)* zq)18S0Z}odps@RBU)4IsKFmzjGx|!*N%bJP9Gj(yA|&8^wYxBd+(~c?5|VVL)2}*pcekl~fBu`Z-o+JM0p~n> zKO@L}RpIEKzuIqvAL>bL%nGmUxl}e3(cZT^XDq5r)h*4B=~ssdCB8O5NW&Sfc~;2YiPyflcZ=Q(3_BC7W*84aD%_X-yZ?eBkz zvcdvY=U@uh%>ftq0-QXkh)2QyQzysmMPzFBL`NehYVJf-BQvzhu%*b~I(YD16j}E= z@FeP-Ugm!tz1uL?Z#!CHsP?Hwzco(tUV}Mm#Cx8@aGfgeWP}oTG zw4*F+p*i+Q0d~xsez*tw$!t1wA3m!#vgZWsN6m}QMQ%T#y?zGlubS@Cukf|CDY+{U z+v-^|BJxI4hG-0RwK=j2G#((JB7`Bc8>FWyFPZ;Pw7$ham>K_ew zPNb`1{Q1NVmCI6x`3=RS^FYEjB@d8N-P@8YV%cX$NG zC7LPiU&{pJhseaHl=QOF}XsFz6 zZN)TY?&-Q{+U-12*$91F-rc-2^w|8?^pxbVqWLLA#^mCs{6`FF=~C7u#(!m-=>AMf zxfgjo^O9m8K7kco;emO|(o`--4zgEQ&4W4Fc~u`1XR#kuTR{?zS5030Ax>j$3}8Ly zP3`O0-P{9pInivcynaLE74Fq~T?CT1z2QjsN*<`8JMi?1BFU1UA=R`_DgSR+x>8q|aoKrG$(`N2Uc|+x8E-SsL zcm;PPgOUB5wtdQz~1-+ENZyEeW7X;g(`?gLrQ(T{2D*TXt1KOv%naC%Ke5mRXPz^8Z(i zlor`0(fgF&a(^B%6`2lX1*hsV@br|l`I!XDv@~)Sm2fG|mK~UMOS&Y-1G8C5%$<*{ zlJ@4>;o;IRd4GK)3>8OWwocjLEOlCmC+7+p1mnE z8oDPtD)TBtnw^@30Da02E8RTgD~lS69uWNR4dWidH_ zFzp3fb4aXrSsgi}oDDKc73k$W!B zZ^NI`Zpwd3F!fF@*iO{8h7~YKBXyq(?Bq8UTMB1Wmln?`gwhV@78Ul;kr~ZJ6O${Y zdy7Kc*P|sx?aUJbLeYIzH|I^U2YZZpsyL0)LcdgemfJzyRI;7dPUo{;3PJ%bc#@jE-u|8nvZ;38X=M+fTb+aTiB0MrC10xmtK~vNX#q!F3E?al>U-v z!Su4}lG`A9*|rqFg!Hnw6ifV2NhCVmL@bFwGfnuC7<8TfU`Yms-5**qie5ml>=3y#EG0a*@-lVw7${@V2Sk6Y_Cs&|2yORNwXi_KIHa z9`vS)*WB00dzFWIoru9oIDZ9PP?^P7z?hZA{98~$Wu;(YBCfJU5CvgWS_Gxw289{+ z-Ku_HAX7`+&5%~$3@^y=C@%sa^c zYRRk=#K+n!)+PAYS`w=tcDJ^k9R!CQ; zsqsjx?HON_33au6t+@qXSWm89f!I;WsZB)smoBYUq6h^6wf~}{vj44HiXo<-uLEMC z(p7a;NjQn6?kvt%SX{pWPvoiV_u((H@4HFUHr8tT*brfv>HX>T7^kEv@w@;#;(P>c1zH^xkba3aV{;*dPQO8X*lf z$lYpQ;}qzO@|}$&n6QZ5XooxU);In{oXA?=v=iATr!_HA+O&C1MQFJATGJTDNARlY zHFi92U(yu4EVH$fio_-V)k#FU zY4c7Q@*6e1(}DVz64*5zJxpHN1;(h{{Xb;PFT#IaSy&1FYgaq=3w~DD=_Dy`SNAHM zUs8HUad^1BzC#+m%wFC>3wvP)cI1ZV8@oH&BMuIhc3g?v+kLWgc@(Ub(OD6*t>JR# zhuFGmOV^ILM#Y4#L_l`&K$jdCop0zW1K!O3)m0ZCl9Ao@E}=js@Ad$-rS^4af-gzt zb^n(bB-HjCg!=KbdtlISTxL%V>Js60Zvz^L|Jr*E{S6<`ogV6L@9h?b+;FhFp&>Fy zQa2&wsp)&SD3qyw)14PKu6JE`SJ=t6;hwD#uBL-M@~EKNwLSNv|E|dF^^Dz93hX7v zZ7fXcEr@%PJJg#Ch|CJ?y$BSid-N@c&vx_w>*If zq9G(Ciz*9om3UFriv$zr^t`zxl#5n}ITe^52Y z{hjehbqS!CPgC6jE=UUbCp5Oc zd!X9==WXTS_z0+C{9sDd;*!w8(P+PdQT5IkO|C+XidAG~s(a#k(=F=qxPPS2)h&R~ zRJi&!@TlZ~W_^5!=#U1Quu+hxktLkt^=a%N3wND%9JrBf(jJ3ASQ2eCSK-8u(cF zm(CS`T=0kPZTvT$M875BZ|-b83Y5mapsxV$WVPt~!QD)n{x&3t!8I&_yi6`L028a| zRs%TkihKW`1f50ws=;|b8-A-1`}ht2(3JSJx~6NizEIml?RY=40jLEB>>0SJEenkA z9?_l-;%*ANupr zgsg3b-7!7sorc(0lx&9~Gj4C%WW!~^@s#<7Uv3NY9^*9NQ6by74XEW`Hv;3~JiIY2 z{tb7%QJql6erJ3F@@Abk%>n(7`LD?fjAOhs5y3wgGfWCdMe=@A7vvS4s7vvVb=B(R z-egyUF4H^HrPLL8U$r@Pw|tKnSL^rswGSHfB?0?;Ecyq5_3aUc?Ln86AVYL;XPwJX z8}hQM!*DM2X8A?q_%KIFq|qzeH*W=miyYGW*)D@wT4HCUK`nP;|4YfSPI6nA?^$QW z-4GqM?f{Sk!&V632VZW@0QT`>tOM~N?slsqzJ{~bdL#ZFd$;vN0*2*3G&|u86E(C8 zw4c#nD)Mr=$^U#W^~eho+UwBBWs|?xTt|#a>V4Q`G@bQn(ICvL{Ql@mHq-niopa1X z0e4#VSf&T))LmuOW)?#Mc8 zJr%V&13xs|?IDXE3XFa)1rAAK&ZkO;46#*`$3y4imW!i?9>wJg&)HT0jtQ!4(SZAW zicR3oVg%YUfdAtjvnk?daeQqCcZ(6sb}s%7OKf|QaGa^PO!quF3U{|-oEU|gpLt3~ zqs$LII~{K=TfA`KiLI7D3@IFuXO;r16_3>zt2X`3H@E)Qxu5W&oL+Gvr;%tTvT)PZy_+s&xovLO4M z=#y#5_Q05;luK@NafBq+UK4v!blv{HIH^!+{{`44;5haJF7QE)EV5A@ z`DpvE57B)ubV-Nw{(rP~*`@@LngVQqz`i;UTYb>&svO&+klBhg_O0&x!h1U%b5W()khC%&r@{=&@() zz|eJ%Ah*Bxo(E;j!#34(`S3Pdu$PC$U`zLg=vcOXpTnv=+cV$r?!)%Ie(7y^yU^d@ z_7^wn3Wp10u8Sjw2V$wBrNfuvrU>2* z|A@=ue|N2n`@x^%S_Rm}TkJXrP;d{rq5-ctEc-6Ev!KE5b=)!5VGnWp7kcf<9_nGM zz0dQaHPrsl>!p6GV}|!%16v%vK3BW1I^=#c+NV2C_#abtIHw0->RX*5f%59N&fK8J zid^Tp;4@|T;khB#iiN|mq0b5&!?LiUyo19X;r#5A!#Caj0*z~CuBUD*%KEr zN+^wT6-RGO9d_xW?I}RlrI=%q1+LFAcF~=Y#j$=u{m6mXL4kQBF>W{i+z2nOiuYn9 zJ?<%Q(ntfqm+R|DKEC_JL}a4bEj=NqV_6%p2qG zFOvE&dPq*EZ&kZ;c!uA#=HTH#|K|+>!|8!jYZSwyLCY%ly2b@>ET87`4cT6@#w86s zQiyjAhaJj$=6V?RJSTNzX}BSaG!hk&nZX+oM*7NIM%p5u$)=5*jVex)j=YcFp1NRk zesrtk!sx-6_2Q<{_?T9aV3Zv@Pbe8Jjui=tM*CxL^Ls}Bj`QQ49(@qk%9|M;tA5!r z7O_IZXtYIYwSw~hV*K?J^S;M@F?6Me0e={ON@gaY%(J-*Kv455x(>Y4VkAugzqSgo zpCGkEJCWGLh@o51pu~5!EKmlt#=aA{8n)X$7V{ob4GA>vXD}M<@>CT9a35N|O+{qxi z(MCT9jxx2A{siAOmnThva4l3MK5>FI8hR+P$@&q*hQq$92E zIjF89sfG`p)H$`74}R8#&-y1((epHo1jF>p1SjD613s)eMEoFv`VH|xeSmNmnXOrf z4MnZcJVS0kwP|fo2--s@0lh-o^lm5$6QX|_dl7TNoq*hi^*07YG-3OUSHqx5t4+j^ z@T7Xv>mXXvTQecRT|8wz@4p(?X7TiG!M(S1`atlZ);Zpr@NzeR{0iT19rCz_zcV!L z_+7%vp{Qfu2#BHbV`~Z3LpP2hQ2eIdeKn}K#=)*OlNdmuf;1=m_fi|QTm2?dhqZE_7u1j1Q{EqGf9mFX&!Hvj;=T6MI&^iO z3?ifQv8sbesvPVqCDJOLE&fDirMkL_$geaO|Bra9sx12&mdW&+bK3P1GIa?FS2zU zV9<+q*MDJ@7pE)8jMidx0gdt7Eur1T8ejG>Z9VIb;+4?M7FR+!!|YF0P{vUXqB@E? zhjXFEj~Kx{P`fJWEVrrlGrEcUv+f+CgBM?40)5OgHzY!k{27f)L5ukDjaJ}$eqU1z zU=sgR(}&n-!BJ&ubgzJ?d=<4(pl*(fxFC4h{8xC1a7Rl(7+Q#E=?_g1%33~#fP}rR z$Aj_0>#g!2nea#J{XjK;QdW)z#$S-d)1dg_SwFi6_@&t@<@WXUGRQt{r>)zo-#QRy$@P4TO;+qf=C zWVsz5Vdc_|_47jiP9dfJ zsT-HVOxvoPkW!VV>>EnCE=9D>O5G$oQuij6FJGsCq@GNlQy7}IApK6(r!-84RR)yK z&+3!NrL1fN|C{t&j+%W#wma9rSSriStE0Bb?&fEcSn}Wk20mL}T6h@ym;71L4768z zK+zfG#PsxHG3;)-qhw{`qx7F81CX5=zNNvSqKxFyGYR7|6lI>k)(n>$`GaSCE?*M2 zEpu~uaqODR*z#{Nn=>g2@95o``3hN-UuK`e8Ocfa6fpI&^dJFMpOKCeTpbXlw+lNu zr>4IVl{C%G2oM)kRb@0w+Dke!C!~z!@iK|2k22n7p8fwThC5XSS%1kt zvn#V#q`zit%1+7{qrS>EXKG15vwvo#6FhPPv;C6#a*A>mV8}V=a>h`Rxzlq2h`8K< z+}E(`+>AU$;`dx<{sxFJ_hEhtcvarq{C5eL^ZeX*jpjT~!82fOUUwlF(35wfup&;E z_n`1`?1}t|Mcy%Aa#Sp;;eE~!i)Q$obCq>UGd}kZc47BWZVZRs{4}?QOR3Gvea@4X zcjbBUYYSz0WddW)guLg%)9G{bJwzu`%kmZCn<8ocJ;@l)QE)uv6dP0^O>JUqD7chX zPCHz%soSE zR6x&?I}7)|Eo<>BuhTqaG>ZS<7p+Ocn51n38*-ey(jN!@l8%t z)`XJn+yq%+iHMh&l2T&k`wOk5(*(zOv86%6W$aa@xx!bB?WGq*w`jbw8R7!+y|PeA zD6z4uIAsMsugsp(lT=jpGIbB;eEFu-Yv}#un6y-+zPupqjhmnEl7_+;mS2>fhTc+4 zkOd}QR_vFVAdeIz`8LRSMXp>1UaF{)kAi&45(v-C*=1g`-5%Z-WzWmM)29~76#mK6bLtdDjF}m`75A9yrCTaCv1UkU z6+HH0;misv`#tw=*q>Dcq9}~0>YnHYdRNs4u?O;c^&D{_qNaMc_%S@c8Z1eIRaIw5?m|`7eJLS{ z|Et!e5Fl?W>##nS{>nz|A@@{b0jAi>D@m&crB#b@GrOl(q48^)KU576JnLerCle_Z zi0UvBzxYRW9$ApTy80|7B}-p3k4l&K)Wp&7sh?^}>0#o6nv2Pv0z&PyBDQ`=poAyapA_7MRn?l1`>f|`b;uRg)3v?G zm6l1hSCH2<)Vf(HQ}4{W2(+%$5U?cA2lAQw!8cDxil%Or?HN{oPlZlAKgI@ zZknE4LPa!fWK1U4HF+|Uh_9L`%t-`VQzNqtzp?2b)|R9PO~b5x*y5(AtbRRN9VC5prsBIafw9>mS(HZ(E*HJ1M@c zlW7Y{hSpuQQX;VxNk2l^-HM~LagSQr^zNiHt-17P*mJD|$u!L4)+@=+F_YUSFfizV z=KnxVw!fQSg0gL6&38al+me>q;9dH^TY?~qRShj!iK{vtEf=5x&2g>kVC=f=Rx-S# zGNM(9C@jrry@t#!+|@P>MakXK7KY|z=C;u>JLRj|2C>`ICbeD1K9nqMpO-W!#J9t6 zX5QO&4t^`At-S?*i&fbEkf3AqcC031k|%VmAy(5uJ18U}<#tCuc|Td%ae>@QLUp{L z%q4E>_&|vy%<3FR$-qzRoJ}#~=5(&3{7Tx;8Augk;qB2tsom1<3q;$s?c0GK_Fe4} zz?a5|c1ir{!9Uyk6Lj6c_E(^DE&p}=34YbEyMqS#Q1z*!FY#-+XUA9AuA;A<$Km_) zXLJ@LAlZUWBXWJl!p_&o_tMW@t5JWa&g}|CbHs2rvF|0g+0}-5z-#EzV?8*$uKU=h zteox*Ne0HFuHQ)o$xFIkBxTT;-N$iKs%N+R9!go+{e-|G&**+k$R@t(SwP%C_}vpg z93rgh0g)Eq_x3PIFdV+?&seS_y=#B0$dTcmGDkueH13G0vnvZQMcve;2fXOH+4Tze zs7=t2;5_OifvLwc88xp!*cqTB7Lw0O1tW_4p??CwUf^2Xj- z@Qk#7dl3kAif6A3i52O3`%tR{;$8zPhZom-8aHUQ^uvC3hFbf$!d!L|xCdc*7 z!EoqP+{Kp|>g~R&qyrRtUwsms+|egX+Da>Aujnb}8@-;uRw4YDg=!N*!SGeP5ORTpW+|2IrB77aLI znT(>@lQ2Hjtf3^ll$2^*;H{!&&2Pv=!3pgQ2!cONdo*zcm#Y;ee&Ec~UWWc+J=VT} zB{P+}iLiSNif%U?mz=Ca!e7y|bOG?&G=c62{5@5y^Fgenbf~St7}q-WyO4=456!d? zKUc73c}V}zYt7-%IKwIpDs0U_u0|4euN$bT3U6!GXih}bH#Td|My{)QrQILZT5(aE z8#A$Nj@Ax##vywtr*5Q;zQ zw}GNX%k+~#^8}vyRiJWSqdp#tkPtU`kU5R@_AU<0(vIEI_R{b}CDg}^T<-o}7R8iFLU%@HnW;Ikn{n85+ntdin?69zbfrE&VE)Kq zeRBX}#7{5qe>Ad7kMuud->d&SkYrRE)&*TvdmA_*yL!D1ouOOW9fq;cJ4&75aacqB zD&yMlj;b%ljS-U-GmM~!S0(Aj?8vi)KE{{P2l61M=$O*%c2ikwS>{sHuejIpQ|6U` zRB4Ub8@M>N&My3XLCJkHO`PD7jt-M92sLAVy1aRcztPx zIW&S;UDkaO4Fw0Rxsh*jQ>}$j zp6>nsKhZuJU2m?i*!>7vKg$jO&HaAXl>vax`&LolzpeAESAwG&2ZsI#f!5Xx z1%<}D`G0YkS2<#+KI~`7@}a-NjfG2X^CO<*A#95y_hzeY-jVMz{cKrLAJg~PuExxk zh1jRXTuNivBVsKnckQ)t1_{}&0<00evY!Ri2)pe+fV%`Dhd1yeALrN$e8UTKYyv*x z`Z(6d&)@_)w#FZ0gB?Nf9jprLQ}4mC#n$KEuCb-ov)a?V!c^S3V5R_D7xCAFRQTh+bUzR5qY4QZDL zj#o~z-wP7f&vP6KzEDkautV-CzB^oDt4pstZiLy2{&mg@uPT`1o_E~-; zK2uTTyb$uXj66Iu^ii>3_+VIHfqIx6o|m_Mm>d2*dtkUb;;+o=;U|&i^e)%JD30us zYhBccbgL^enw#3_lEiFJIppey85Vzcor;YR{o{HPdrH_eGA9lo=o;~id&)mCLU4CU zJsrUU%DJCLxPZIdKOG8>7bmtlvONAdvCdKMInMp8_iT0TcRcZ`uns%7dJpUK-R1(; zK(7<;8`J}JcKFfTOP$aBYnl%YZwb&h>>maNHq}UmyMrE8t{;99{Hg4R>rm*LlI1RB z=$pa>mnM95-UHWYcvDWY>pypkRKm!?$e0Yu2r6o-yn2KX6(W5)k`;9_4KmUjjZJwm zawhtrq;KSN3{RXkx+Lb42t4W;D;1(giE(oUlF^E|c7DsK6|j+aYV;I<%9|J?)N#54 zVvp)xH;dxZ^(QOsK!USswfWA(p~hx+MtkGGykIF^F{cB1%b6XDQ_(IdBF`g8@|u-Ij~Tg|<(KlM44nSd%ob>Xap z>87Qb2f!8P&eX`nLdyrf5qjPFj#&vC9nn(Ew=M5bvOhzml`h;O4ls1d|{U5cH6H}4@IHrPTp_Vw_0L-X7XLpPPy<&KE z)FSl7VS2a`0~&rAnvNNDB?Kp9qg`!*71)ceH~znqkRyBi(vuoSN_{>h-5Gh}-HP)V z-Ri~0DM#_1ApC^U1`j-b!{~?O7<|as@naM`dra!~w`PxBJJJEA^gQd^2;JF(@3;tE z+LKV13(fEOR@wqX_wC5}1i!C}kjas~gC|7~(6cl;&K>km?bl=&W>EK*48$JQJ8&lK zm_d#%PVzCv!0kzY8Gj~*<2+0%&?21Gj0SGO?>E1RW#F4E@1$lmxQX9F|46 zG_)?Hp15g98T5$Av26|vB06o^{w~r~+hsov31VOG>q+XdvwRkjF54e?Pb5!rczI1H zA9v6_SCe^;dJk`MzvF+$#n{Z&1l2KYe9M`h3haiKf+jO|c}rczC2U43s&GkCLYp}= z26wJ=XKDo@p}SpRb~lDbu)~Sp`Z)9ulCVFV)KB`UT8_&hi&a^E;-B#?t0S$!KS_KO#!#8+6HGx9AMr`%rJXO-~56 z(?9D+f{4k74J!k;B&Ql!{$G>ThD(00l3yBk`~G08GE#j1U_==ke6}-$#(%w$6hK|p z-~r0KQXze zwTFde%xlZ0U18+66G>XekB;rQr%YDIFAR@)sndk?VEJ~X!opa}ZZAka>sR-KgzxUY z*dm~gZS36|r{qlUZH(#R0Q(k3z2`LcDI()JZ~GU9U*m4*=Y`3*u>P~5o?M0M&ycCy z5mi;tSMEpE*Psc!Jp%!OD|xU1X22m{#(>hF#2PNo(9B_tlt-#btXt*jom$qHa#N#_ zJ-Pg5#bfqT#k|7zY>wh(mYEY)c}7~rWz}HBDBjN6SG+V{f8A^5cm9g{TePeEw1y7y zEdGneOni+Xswn`A6R4DPQOUx2%FA%0kkBlKZWiiWc7kt;X182Q7!^TV zfz{v8`n2+z0py0X>$PCmRq6KH?}>IPt*#n8CRNt20Zo$Lsc(u$%QiPG1>ASk zWEl-#V*_QH#`u_7vOA64QNQGK8$UXy0bZ0}Wa^q^V z)2m*@DznwqVKMsbN7Zf7S8}FQ-;SQ1S)IDya4NGYb+h4rnZ{K4peysgw8LHCtV7a? zNlp5 zKT`AsCdmIyXZ*y`6c>XFk)iKqug6C zP3ej}6qH-)lV?agR*KB~0@+$B%ZGz^mUiYlKwhQ)7OYKxmHsXe$5$2)vHH!V;=fq~ zW?J!O)=NFDWG1`0A6^p1;kFNy6mk)bl#&}fSXE2uRzAG6xRftQELd4OCPZW(EL$Q% z$;Zl2V&7DCnOfo}`c?KJun~|uH(!~SW3THC7^Jm3m zMxgRs1&|r#=I7g35XGvBPwb>3b7d%pntQ9Vmw0t2I3CY zq^9byJvBXP$1%{Fn`sU=Kfh4w=jP|POT~zrwIR~m@Vm8CnGft;ZMjSdn_D|1`wk7O zE+DP4+N<+ObF4$vIiyYIglY@vrn;#59l5_}WzC8IaLq1#n|MJ;^yVQqN2>4~^Edl1^EE)OX;D zwDkIiczWNmhV2AW`-+BSBDFEMVSq%eZfJN%PAZRRJW9b9r8IJ=0eMRr^|WJIOB+AX z7s*LY2kAf4rZpuekBaX#85nxO@1}=L5HCQvjLR3@=LGV_! zXDR<{-p6H-4>iYgpA!32KR$v>KOxA`Hz7kj1oHUBy0T=P%C4)m3l zc>)^hS<6mAA8Ms?GwO+LOt}$t)i$DBfx0+UrVK^r=vOJF7Ax6Y&7PhH#^LDh@* zv`T19fw;AszLfj6^*;SR+t@ZES<0+!+nxM9xup%sXrjGqt6)Y^p>1lWmVB=5ENc!) z-1eEJARceuz+OR^*&fHPz|Uw$v7NZ7?J1nKNlV(BIJwvZ?I$>IG0CkRaJ1drIshlz zZLQ7l82hBwf8bvY_SWwR*FbsO0c3xdu`L;*kFKugwY|aARUK>JfmM_V+LPP? zw6*PhxRSj6?GNyTtlW;B1X}u$4is^(ba6*3X;sRRj{Bt7qT)KB@lEb>g<5aTR(K(MhF{scP&Si=_4+)v$X!AYr{jJt>JH?UWuTG^WYaI}L`a zt?Z406DwZz79!xK-MwST!-clq�++tNM1L&SZ`CC8BH7d-|l9P^q)ef%QpU+jkM` z5*PPROkxYc{oc4}eoTKH&d5#Z7vn?OZT)@tUv7T>4xx=v)BligBKfFl3Nf7aMYWfB zhk8ndC($V9Rpq2RMSBKCvIRSa&xBtz;5JKdEx*L)sSW!kfD82_6&5Q{}p{4xP~bZJRA6d-OT$o zxBx5T`VQ{Jeq<{L5lM}#t%G9R1jf}tCT?7E%3vlAP7fH=;a<>!2cO{iRHS+pVH`z1 z_zABibJRNsfh5boxY*~z7gfJwU%Th0*!#oh2A0NUSpPTR4G7Ua8=wK#sr&|-;}>^L z8@QY>y#+rwGvR$h=%6p?c6Iw;D)^3qKG*~4DajnXlPE2Cr=ACe<~FONUML!05|Q#j8<-S9nX5h)-R@$j_eB@E zsOt66L>EpS5dCvVtro@H(LYrW#l9LqXeIzAbsyCn0z7L~YDmDdjfI-pcva0C&H04t z3XA5w`y2h7b{BYSQJ^*)Y|eYGEr*=Qey&v{F3)(Uy$RhVM`>R}d(tlJ*1)K4eqIc( z5nFTy1W9;LH-zXFtkwNMX7j4`^N}C83-yOlboT%B$5DD#iheKZB6FWU5WSMIS&v31 zC-2keW2Vug_1zdLjjk`pAgNheY-HKUbZtT;d1Rv2FLJl*ixw8yYg1|qq6CH;T3d9& zV6^sU46A3K&Of%ktxuN|H`3IvI|;a0w_5iJ*kAcnza&1ne1bkA0a7f`qZ3{itkTzm zZsji3_kj^vJN0)V+tN!6D-)N=HX8m+Oig`kNPupUTs0IzKZ<@EFwj2XS_2(6kuNl; zVGno)u^o;H%Lj|%@{r|Ja}r;G!7Wn`^-tNvzGSMOrO(&&M9g&`=WSXpG? z#!~CP8?139RW}XK0eHnEV+gRnq{4`c2Nwnys}k1dc^I_`W7$yS9S}RiW?BJ;$pNO# zV7+v{=}+*_l#eD1#35O3B0xTiV5Zd&tUziy2D#0jWRfOoxED-+L$f$)vlq<9Hkt8o zUzXJ@g?BPfn5z-98Q0B!A=(&|%~ui6laCs=hk1@JH|`0G8C_*u9JX+Do^e~4%(2B7 z6CPj^8YONrbb?V8Il1?}@p9ya4yI{*RC_bibSPR;|I~zv!BksKgc!TxoXH+Hz7%Wv zFYZ#&I&(B|N&aDTYrIEJiuvF8Z3TccS*JV8kME!7dj5xtm-l||`*#D8 zDa*CnfMeX9+6YiivQ#?@w20NAc@LVzT%g?x8l#VCS>V5DI_;gP&q*4sK1xH)(mJBP zQnI!GLd4{D-J=w8wvYL$<#JyqT9bHtvaZuQw}=cpg~{AaqYS>gLYb4KIi zr|G%s^7HfBhBbKsXB&exy1*GV5t>(l&&w}re+%Lk7inh)|6ZWddW8IzdqhhLxtRG$ zYYm&3F~z0oZw5~a5p)y~0Dd>9MeEsy`OIf${$3yBfZt8`h7Wry@a41gdug?uj z7QN8F2(J=6G#rX(;(s#4L|=&{fQI?aa0M8^IA>e{ z+C=X)d~xd>FW5nsq64ea{zP|o-jwS%hm7e@YVHr zJ~lts-SyJA`1upP`MqECt9-V%|EH(;rZqL|&-wjZdrLp=Z?A+J<_BO)4;qdH9w@{a zz=30VPYs1ZPqI~pw%|BLli_}dkNmzt8?roYrQxrTY;n19X=sTs%P0%`nW{JH!yPIA z7(Ye0Sfr-ok#U@BCXdMaK%fteV(l{mrz?Q@? zMFGxHQ%p?YF^b->#G}$-Hca(kIyCwp9tcODYgb#~hIO8y+A9VxuhlO7{InOegJ$4+ zbDGx~9{7BygBXwa`BnZfrubt^KNR-yS`q?w7cEC#?CT=O%)N;=GZ88DXyHah`}lj6*G0T^njk#cs>xy1-STjN}B z3_6Q+E-?n2&9K}t!aNr1!i=dNm-;6dQ$7FeoNO%hbT(HS-*_*tyKai{>8eUMY5W$K z<(c05FDx1}ZwZ)GfHNZkr?~omiGj4NJ!XF3=M1npBM2c=nMpx$()H%*;GN>B=JAji z;h&Zxp+2cl%h6D7O1&i^YzJ?pr6TN`i~n;aygpfMc@eRS?Pr}5k;7VR-4(flxz$RE zyw3=;21M4=-K~2gr8IZz=}5EdvuJVeck)f0?xRkjDcwEENj0UpS6CxWC1>~O&Y4ta z@AdOcPLHI{T+`p46IyngH+cEgqslO#neVp3*<~(vW4QJ{_X$?5dBk0*KWTn+_H_S8%kLhOyH;D~dx%<$mT=F;`Y#rR zS4*|h(&Qako@(j!9xd*-uJesi;;pfM=sX{*&3`nTX1y0cP&C@s2Ex*}+vWyx(yDB` zf~HDRZ1AAJMG9M4aIe5-69t#@f7w!l4JpyK_7EcXgY8M^Hjc%$Q|?(kvmm}Rz~DM1N&;<1HKKsDh>v{(yYrq z1PRq~pYA6lYzoHH%`dh`oiHTQjvm=%ufHp;FB4X4&CFl;)+s+QCM4IjY`sJfmIRbo2Q4B}D z*E7`L&fh#k(Z`(Nv$xTFXO+7gZFfF#^TW&-+;(O;CU_8idJ!gXu>RB*%(cOLCq1we zhUTA$!tNY8eOwUE#8IgSIa?@wx*1f1U= zTYnaa=>J)K542JBGV2{!p_s%& z>3*}3OYL`k{y>r)N4<#1za0{fJE(An`YaRWbi8!;MtyXiIWvy-a8gg7N9Q@KPF+O* z>$IJGiwSmKKe++Z?EG*7jAa37| zgq`aq2xHL3~$ZJ5A@j z>Dd3wM?K%+PMa${YH>pIi?fNiVaq1>gSZbCrrUb_63c}%>+o*Y4X1bEN!FxOzW7RO z-AO(I*EqS;j5yH1YTJgG)Nr&KiTJ%CqOcf|(zqb=HPX8&M7j-?)e^&x#B6E1%TB|F zbac^<;+A#3CI#YDUH7nm;dghJAgl0gJrN1F2y1#L!eE5FUKMl?;Y%Md>HsmieVk3h)I7BYz`_RZyZnrJR+k8zWSdccc>A*8uDxPMIQ`huV%0J z4hmYs@cc+A(&#*%P#oIHXJ1ghX#L%PQTJ&x-T$B_YA?G*6XsQBcQ@kSRIcmH!{4fS zS|5iWsxX#b#$T(rmAB00bJVB15vNuk6zwK?)n@Tdk-7DMvwo+%nhrm5l@a}z6}Y7SM)I#>0YsAQk0)?%-*l{LvI5c_NG zk;Ki(;k9q#cP2O1mB!*ZQ|mpWA9Dih|B1@y6g4D)7@SuPUjP#Bfkr{ZB`&t{UHBGm zV-qB_iuWbq$>+9A*@oYG97+csx90X_gVU-&>VX$?Pw7Q zI+n&MdKA4iO;-$wlBYc{z6AOqTUK%!*eDAqX#pT)X{GZbkH~sTkr6vwOsJmlt+JP; zKf(^m7nXU32FZ_`o`K@#&dq?`#j6ga%ouyby8BaGV9uln? z^E2CUmotL1;xO|vin8Y*g&Fs<&57=cB{|^+#rp=VlKC!FHmuoceHK2B9%8@2T=^BoG+i2xq#oJ+?5GU&B>mTSuO~ZOEMn{ z7mG8qwhFJN&dXAX$=r?E6C@{DiP@pjm9($f1=4Gjq3lO#EySBSTV!DT+8m60J|;J( zQ|>^8<-AM>A`a!QPk#wNnG4R~#*1^6ikYzIxef&@HZJ#-;-8qAc`Gs_qKEQ=GEI=e zJZ{#?sH{9?76F`{*OsLM73K|Q{RFn;J$vGzGWECstGqa{b|p&u3O!F*AfX_aD2F94 z5@VF#rNRV#;r6uO;|~`Gq(NbK3#n-Xu|U_)ES6f-YJi z$3=094#-X5Hsub=16`f+0OgLZL3xBaQJthjQCqu;l+{V(=K0FUw20~#g*)hHOOF-O z8HWmv6k3?uvaS_PXU&#>Dhgx0lgNw8*!KjYqI=1WymQ6dIGM?qVhq=pd8)Xbw}uv0 z{DJq7QeCn=C6lzM1jBd7Un^%s?$Jbra+u7^PIK2v;kZZ~rrNxx;!nD#SRAuggvdu{;is&*7 z4W2e$)=o7h^eGHt^<#Q((xaLMj1WpyjW^>3DZPfmlo1MR@|nMIw`=q) zI`(MIGxh}ZK~TXPCo)^V$bfuc3Os_93^R+DQ!VggHx zYWHFHE5mBZxK%kBwY~TmiX*kJ@V8{g>vj-y;)1$FqEK+KuAT%-alNIHXLEMcFD2h+ z3F`eR8T23Z9O}U&Q++@61*Nn8RZ<4Y*|2~%lQ_HKG_4d*ZlKUNV?Q;N(aSK+4ej(# z=;#I;BM7y+;U1$LIltj2<0WEw<60&laYy5RW-a`5<7wu#1Wf(Dc!H^*es4U?lwZFk zKE!yb9vJ_9pr~GvFxbVcABHzIS2fH|tg1cQ5RND=CpRdO`9((?ZlkjE_>C*jysSNq z{+Q781C3(rE@@6kp4(& zXssbfuc4Q>97#Hb z+R~Dc)POwOl9u!fks_e zZIcl?i09fmiKhwtw(~?4{#4ry;wS94wl}1sm{;v{Nge1f?fb|Z(X-n@MP5EZunL|jYl={SUJPMOm| zM~OMb9i`~y?3j)b^awMk^EZs^OW(N#J26Suc^pfoF6fNJj*&AuS-7(#x6X3hC~;C} zJ$@11+^NO`ab2C4@Wohl=WF~|%wJtI325}wt__49^s4sPV6f#)`%AE|VGcFcbvduSZ)x{p#DU~{-G>nd)<`!B zNnkwfE=SFxyLESN))fPIU@htj1X!%uU3efsFX<`+{n6jjbs0Rlb5{2> z@T;c3yWOMi)*kQXLC#fd?zTo>D9-Bs3LPi__MC`m%;ENsW0{H{?y^5UKgun$sc z@1!`BsH1mFJWw#X7mzR^Mb;}wXySr;%ixQW-FoftIu^M1OQJucuWx2zF@0{|s>Ihx zl0GkllzOI*id;{b(WgMBk^b&0L)wVWJ_G6$;cDM)R1^N+zVGNo`04$d&|I8~kO7sceI-RcL%3M8}pnXqlb#QqZ4dH&OW zXB?NO>c18DkyFb7Fs1E$pFJ$gwZ9DCWTf>k z3BNJW+wT_9+P$?O7b$7|y}ty2u4nX*0>i3^{XaqbN^hvPfW8#gsN%tI@-C>dqXx3w zR6~%;j325m(Q&eO1AC!orRxX6p_fFQ0dY*FVETYP7Mt>H;A!l4?oIVgFQr58d7c#P^m*Vo3^T+hK{Ql1M9;6?fGpWI{c|iKbJ*V z8wdls$l7Ycz%u}`?6!Il(7mW#9R%8)e^*Thjpc->yTBJS7pl)k0p-6m6Cr!jc4_{E z7{%!t-)NX{p+*GV!GEvGg|c}!HTsy}6)CmJgFKR%(l3 z4{3L_U2zAJnze&*xzrl1HLjmh>Y8KZO06S)I;lf@Cmu|EswM_6wqI1EgQwd^)sUcP zcBh&U9B#UzE(}?q*`Xc{`PO6BObi`s8_=8x8*Oyg@Wb!aL~2YCH_ESS-bJ<*cWO5Q z1O*SYA;8nQQCdD|a@KNf6{s|0hIR<-Ejyt70Ddni(M^kjh*s!MLe`~z)`1|cDbI9J z$Sdx9U2e3R6RA4~<+IQ0v`{|lkbYuJ40D?P&zOJc7xn(J6k3Cx6Z z7=fbI%V4GCVSPF5HtCmkOJJ2FP`f%%?C{Y}3k-0a)GiBbGV`@(f}%AKwB+FZy&P?Q z$f9D2v-bV=^|9RO+eG<_g&f5vw` z4tQ0*QLhB$OBMPC@O1G^{RME7;IaO{s2Kiz{nw~6-oJ)FAX~Yf1`y;;veCeZCbGQ@ zlxPm~nL!@?oY87%hf?W$!!77Hn%rQ8jwZ1TcIZcHis4m^(8bT+61#!?S$848*Wu9V z0@gY7x+?$YjxJqmfTv}HZZzPBR;v3Pc&=}QeoK(1W0xKjT-9XLOG5ayf4jIn(Ul;*Z8?5K8!$ zQ4U_4dfu1`My1>`c7pHm4j6AmC36~$zaaCI4;nv1ma?uHKR`A!(@b+9<%}rP(ddoz zc$1$isf0Dngj`SZGfjoOp#n@Nqs5eJ!xFz+&eewbepj3;4AcCEol6ZX{SR204JZAd z=~fsL13LQ*hP=S6j*A9s5UH79cpL0pCo!%M*-$md2nd~1`qh{m>L}V{tPG>%cN))y zpU$BhUxi=KB%78+e_QK3nj%rw_s z32p@VikwuVzc0>7FrM`FcOs3Ez9#Epquj4vS7IFYZ|(;eKL_wTNv4f~z?Ma(@SxrG z2VCy`2~{RjTkz$w7Lzk1q3EvZL+JJbqbq1w&2-oIOTX2;-hW!>TQe!(NK1#gIdEJ3ZS#e|r`0I)cu;S7q-Ab!K(Wkn zJY=PEvBf{6Aoqer6e`WSYvF|&GR7^2uwFUCq7Hi@edluW7l=TWWwAzj%*t19HD zqR#p}bU1yDZBiK6#m`?Cc3YBWgNL6JxxCI1e8H&AJ^XL}Q(I)jnUo+~dgNs8OWSDV z1($w4A5fWGYu^C)$)?%^fdUrKo(!7DEVY+`xD2hG0y;+TvhzVq+EdGz7iy4f8Sy$i zh_du~O&W}Gk$e(u!IoFvJN0+0%e;T6Dy<;j`CVf!p3nW(9BYGLeS^t5;vZWRX`2(k ztcbGh4*a8})Rq&(D-5@OoHa5g#CM|LI8a`*!FvzIuM z0D9JbM>Wu!8RfVJyw6B?Tn4_T4}b;gtL?O?1Ddl9yCJJJPf8o2FK9pIierB0z2seS zCk?eiRl;uLeeNE3h3NrfZ(@tNhpap*lVcyU!w{n8#@Z2*E1m3XcX+1$b%szFO@L{;^ z)GBb9`awHCYL;eKLrm0|X0WsvGOo?coeRCGGsq{xHX8mAPKl2&@;Ei{Nv2ZzUx^3J zDP#g-wdEvEg1BONh?S{VtCkUwnGU>i{!ng@BMg_}D#&o>?yH3;)I;2H+oy^i8O41V@_jdvS5dA1*) zHpF*N!|R3y+*tT`Lod&y61ER-I9*6U41-T;2-U;#lV75=>gDaDQ8x9|Mt8`5wWw?n zgA2W>xZeh2J>TN|2Ae!;aQTBD&!TZphEBS>;a3gO-45V`hnmlvz$=HG zr=#%?h8~}i5_SyzJb5v$u$$Hy6G!Qu+Y%JV?p{_I5cjIPt3Vvz-P4otG-0Igh}bO= zqzdPW5O35lW*h2|<|h@2UZFci5Tm>FbJ71{PV0vg|HgC~lH(^~w-^`4$gsu6R!9VP z+yn)M<8Y?Sk!84h=E(3R_`T+jA%pk=OK4CxVS=S4V33eto#MZSAh#C!A_)(yH@%+| z584)c)e#l8P){oHxh>rzoV3<9de)nC+`h=&jTCK+AZvo_UP0%xctsK&Qkot?r!=c!kym3 zlodo_-$Hy9X?ovNbSg>EFH2OD-l&eopCU)8uEb6yI|ew>3n?4a^T44Lg}MkZM0usz z7$K&*X$r$o)DrE45IXg>787JoI;OoJ_-7JRcf`LWsY|Eu^G43du594Yr9 z1=Pgk7mp3OBf*?!|}Hms?Ma?r_32$E1(;g=&q(HCDYb@7!<);)U5&>V!?YhM7Xm$d$PhZ zSf6^Qg}h|%>%|2puoHUiK{ME8eJcWn*kgTo|DxpSeV6=X$p`uu`er4^_IvqMCTI0C zz4giZ{x+`hDX4D-qp~!lC4o^|>QlX+QCR9()WT4g=478|t|_C)YMCSD zcZDR@<;w589qey4`&jwO{k2Nkan7l_Ch{&$WjzQF=T2x?gMQ78Zm=Q-xC4#U1PgCY z)5^HXJa|)U42{>(92mWg_r3W>)Vvgr7H`nf6j6%?5R+nSJshFqPi(CXKg2)S`rg%e zMrd;jso+<%)deH@qwN!eApEcGk%0-RYuYmc2&um9CVy!vp?%y>%k#=FS9$Z?^Al8? zc#-+?_9`AR-(2V53G?5UF?qQK%kz79T?L5>cFKHZpmaw{f8k%LYJP9=SMI{pywVZo zEy1d?@uaH)PPvIZUvRrZh_4jxtK5UZ3MG|Kk#yl$RW4jF+ETqEe!GZVJrw&;WUh&Y z{w4Zea~(1&K2RGGHBX#WI|3q$wRI-|AH+}V6pPI$`m!e77b>OSKbl5 z&w>BRhK&Ms+n!DZ&Dv}wwbBypOn7nHm> zt-Z(-e?RTJ%Y*zv7F^tbIv~p|@l33gT`Res0G6*TCB>bVhnJ4Wy2~YHIH*W&E4u@E zEdN>#i;7L(Q0@dzN%yZ<4K$>4Du@7SdQ*itlAC_Ma&3el{X-=oJSSsbWkXn9#;(fS zp;u*Br3TG%*-dGSW`*pH^h56=`5$TA7M&a-TT*jXUMka%Kozu6YY~7Sg4Nr zl}#;L1GZ-u7qLJC*^Z*~Kx_7=;thZsIrED_kuP#K7nesa&AgdAoZ#ikoifl zv_CRyr=Yw2P!?7QuV-d;h_+O0%^DYt7lvn_5D(<+$)-pG)0?szC1aA7?1xf{U`tN2 zY%cF??nF6;-Ig1ezK?Mxw=#V^X<6=AMhkge-bMw4fXPe9oPxcRSCmTg8&AVH0I2D#jET9PH%lHMI0=sy6!CPT6|D%#D8t294@wtv zi9T9*Lb`=|vydx&MBY$nPRl2h7Jinw7+FQTWhTtABBDGR6;MlGDHW${0XkI`)<3o<<+f0eAsOpSV1 z_?#it7Z<)^@b#sI zl&ul%CcG~T7a4HZ%Vgpx%+sPm(^5 z-&3BKwli*hd3Tx=wz>Rj+SAx0<=&cr>!qEppIbIgUtK{hKSBRlBq~p3Jj&Z$KFA!(jH#H#s+E1O2x61O;}vBXMWysN5lprmlo{ z292#7Yk>|M0~3MEd`kPq<(Em5BycV8-Eu3w|WFWF=0)827e$vsuqd4Y|3`c zK~q*O4C6FL)Mj9js()(DxDB0swcl}{nl9Fz#9yuf)TIyx%7k@hVnv}x{Zv;ky`K2VL>=&qg@pGpwB6!GSzvrZ${I9x&4zMvwj+g~Kg%fdUhA`pem9SG#{Jak7p zYF(DB;~&(&>F+ytpdD$Aoe>z0Sl%hb?iVz5wqqZq{OG)b6L8sGlkl69y}JIy>sY(G zJPC&xC%fjJE72DR#hiIMye0&Y>7S95AVDKThO8I znh*QX#P0HTC1#<>%u!no@Ve^>Rdne;&GPd;Y#HG`+d%bW! zT>KdrK9r*EO~zM|S-pjXDJ0KcErCWn+dD|8Bb@EMM!1L%?EQ!E6PM68kqE#RcMrNs zyNV#jOA!1up_nqjK2H&1}(N9(M9&f0r^Ii`prlh%}r!$sWx1i?{ETG~??~=IH zCDFYBai5ic_6p;Na(#OH5(JsOz0ctx>FB;?@c+^PeZGmkVoo0)ffwBCt3!G+W!@sOSY+& zVqcMrsy}h3iDuPy9G&1)9l&+sud94<&+#*Rzk^}6FTLa7VB4qOf51CzuluHgJB>T~ z4oBe!Fnt7wPuHWqw&;B=w!Rn8mGwvax5Z4Z+SiYad0JZ0UmDwAi0>bT(etwVf5z?4 zo}}6p_cUWb1&VK!HK=$A0g@qAFMN$?m+Cy+1)x%WN%Tlb9@vKXjY}IijX)*~2jGZ* zS=R@$kaDKSfEu-!K007Wou$zS?xWO6hX;P4cTuORH>3a0pYcY&A}>{gF~>=p)Obu5 z@syf}86l8WYk>at4Am0g9($VVci(S>r%1R93_raK<3>n+ATw9?khfy$?29F{X}%+2xnisc{(TCv{)^ zT5+`cQhdMQj`~Z2JHJh{Dd8orLE{d`a9jy<_?6_@8bM+ti>_%-e8Tvp(IPg}+cd)n z2o0%uj5wEcP&*xYf_hN92iZjN)9yv~k%P1+kuON`S}4kgSfQR5neJGso)k%S%pZ6a z>F=28+Kr~$>g@ogW}6xWJk!&mmV?%}RjJM3iH#f7AHican>Aaaddf>QFi3GRQF!GtsVAQG)en!94+;lZc+T?lnc6p z@!8zxy5RUvoTEBS0*GCy%SgD&+M=t6?_u25^}vzze4Q0uLyOVfO`Mk$rTdjArDFBd z6P*;gep2EMa*BR2Vlk;#qYWQ$q-h4iyB!iuM|h<}pt%^a)tsgI5^-1aQoGUBWs{-> z0vPQqZ5lABX|h%a`lEJ^_66u&MVf9sc&G%W^NAuUb9H=(Pu^l(J>*5!1>K`)d&U+0 zM5w>)KmDngWm1ejF{Vj0uFr{$5?s&^!Pf9E>p#H^ym7;lI3I4HVP~8nx!d3qzm~Id*q639Zc8u%7 zLf<+*>Rc+BR!MUX>&_#l+vD7Md^#(<#IHry)!yTz@kJ?u^k7h4?yw`g!JhAPvUmdIOeZ$yrd$_?{RI^ zVWUrQxO32WJouQ?V%!$I!l^Z$3>H~EjOY*_o!(dyx~3mv918u=nPU7BHqx@rv?aW< z{*(z8A*>oTXVDk)WZ;Sdxp@!pdTyvW7Np3EGz-87GQ{Q<@MYNt^X;fi zX}b9%WP&)>G7EwgMq2hq|DKv`35>?2T($tC>v{VuROkYZ&QcC7PfoFPL!YwUEH%)Z z%&!((Od#XCrntI*D}&AsZZqWuZ5-TSN)7xqxYCpt z1hX1UhTv6tH`BA=C;gwy3qzW_=9|xiCbbNhiD8~D{k%SWOEuYiA^dT9l=(lGU9`w@ zBvPo{X^92w%>8Jo1}@2-Vz~;urZ{U|0BVyPtw+HgX_3}&uv4YqVFWnu)c`C&9Yj*Lzgr4whhn<##LKj%ntfz z8#6{t|HFojX`*?VuLe#Smi~x6AqxEp$Y{OwIG;mb)*(wam>0W1T4TiK{wq6g}*6_fgX^$Hi|A_GWWUQpi*3L8ogZ3c{m*Z3XufTl|3=#<+kXEihIAV; zV0a+PRvOsTooD+iD7`Jz_Bj~TD6+2!SzNou?h$gaa-p3TT3Z@tFAfVVeCuNJ{E_dp zzYf>uoO7&;NY9$<*c0(4gW-sb%#+V^hylLRZw@{HC4S;)1uhb~m`T7vfxyuNr1Kq) zXP`YP3C>-hpSl9Pn(@Hn9_tVMe9+p*C3PEG!yijZ9jI zIcb|i+=Y2zYjw4#DeUfuJltHnGkyqH=A;xP)U3?RO0`H%I1o0mDB% zCy`4=j(Pk>K0iV@JDvP}q}+WeW&6me+g=KIZ zB7o*HW<2tzrGgrUo@7lWq@eHEc4Agwgtl{tDcG6zi1^dkJo~Mfi@13X5TpVpcU%H> z;HNl!BfsNGPE|Mw|8#JE=ph1Z5F5OUP&Rlka3kUE&`y6c(S-r`y+N!UI_DEhygNMC zdpc>waJZ+P1Q{;y$Rm{vUpkvfx;rw%y_!60(geIJxgk*EM)( z@AK9%IJj?8)ff11Uv;5JBB#GBvj#y>J(0XbUROK#YtdxwDBB@zE2>4ZAVA5b9SKZ`jkl<4Zj2Ido8*Tu*=r1`esuwIfY z#So%!srSc&3dz&#!hnCsdmPjK_mV-5T;C#cwd1l+5cxmHXYUo10O$Ju`{$hj9$zRo zoMMj|)Ok+r**~Z!olo44QE`K_-ALHB_R~FFEW6FtIUO6-R#C^pvf6AVcd;MaS-IZ0 z#*R$66kp!8K$u4O+Ow5gK?3z1V=~FEXb06uIiY$*Or+QbbXZ@ihZ={JP+K)~;4_jI zYuaGfk{H@!&|68Dw09sYX!~`pU?)wk8v%IIZs`LeHq&?LHDP<{G{b@rCf#VD1YM_p zH{1&hW*ju0^8d!b8wGy-j1HsDSIl^6eDA|&&Nq2^3z;WOO0PU7(q!>$WoDROd5ls1 zZ8*}mpJK1?=-EZ7uO~IFq7>IhRkTwE>T{KIsaqRJnLgBujjhtXNw#K8>T>$@*8Jo* zjQ#BtMi_HR$0O=YW?83|@QJmeOMyMg;&$&v8d+oA_uy&lBR%9e1zX;`EM|oLthY4! zO!Be5`QY(nXEL%lN@fX&kis9UK?C{E-^hxZGRlh{%lAqPwOW|{;)s3^C@Fq8m&ufe9JPHTfe)v2LvcOWIHHSJ(< zYwEpr9q^4{X~$-Ok07EWGr}Us?syqa6AX493fm`m+bIqCBwX5gJ@}FEOxK2>=R#r^ zKJdG+x~nO0wb0UaJ|KXfROCNE;Ny#a9|+?!ik5W@^F>8_>&N-BqBG?!{EVW=f+zge zqT0;v)CI+gG+gRH$#=mIL1Eb~o{zAp;wO8z=y=s}`d*Q>+Jhn&FRXq?oF^vLlw%)= zwY46or;-`9_YhkpkUBv^xkOn%BQ8)fR-X~OSGuWTKJ=6n(jbBGr8x~Rz_+BMje(%Z zv?-0Qez~-LP4gm6Y2YSkgdmOIR2xoBYi)WGmYjC8d2?u1+V|#^kOtY3W<&55NqEi` z^;JnkPJ{ZQ1etTWyHFy_UEe%I(wa-D`XaIC_7}%UZsoqoJtg^&w=eykG&p~WBwYHs zAS;!h_E({t8z$oyZ)Z{D(@H?J3-Z{~`4pJEv(!o4E&pDI#~n@gDxZSpre~FRBHpE6 ztT+U3%$Q#>5HHUNsq}{BWymYdF}E{}RqLP!Gu~7wAgziuRbQh(ity?<@G?bmbsca_ zQC(kZADWTtR=PMkAUC0u2AP|iQfdT$&8;Y#4EmXCEAs=* z$$eR-0B*~hQT7-Roo$ya(Lu8>N@nU{*-s_@s`#8Gk}DlPIe}7QLuO7|+S1B1IgT`I z5h~}KEGpM6ca!XVhAI~<50`3kh4LZc?!3hrktx1;{fc|Z*8C-zkC}=2(5!6Q;r!a{ zK#F(%gY3t|^nwjJ8Tj7{;&QiO3s81%1%3g})WNiGEhNMtKPGqVS|r67^qUobp=K!a{N3TCiUMkZ;wq z3u5^LdQJh3|4dCRC{Io9VinvF{Lyq@xk7Nix=R@+Y%F=NY!Kn{|4}{_ug_u@E)v(u zMTNeS!;8@-f%u?!= z-4)wb8k_wgroEJxa}cU6t;(TCUn|w+j6_c@ZcBb>$ShVR-!tSCTR1bckm3)V+McYE zZQRh-#U)tYqT2D2cHV>Xppthf-GyPL2l?!r_oejI!-|Ea?Wqsa>PnvqL?UI`2H`Fj zhpSMO&MhvxCf>^?mM;~5V2H{?Bsodv%H`4n6pwPJ^cHDq`R6n+{&~gbG}kkx0whCV z&Q!=`k5JVWo$}+zWffQC^@+BM@9A^k0#^eKJt4F*AYC8tS(%tIG0wY^pAiO&sI1PY zh$U3oGX9CFE3akv7}Lv}7;eUl@>T{!Kdbx><6~cZ#S&&i`|lM%7Oi1&MH$<#5?}E+ zd1JA#au;WE{((vg=Xw^rQpIgZpIkMO$B|B}I+Joz2(FU<|B6v%(gzgk#^*P}cQh4+;VB(Wh6VYqIDMOVevEF*M4vwF{Wy9A<4eD^jth zwt&4wwyE|adrZu#TbSG?SW_3kiQxTLC*>~WEUdF}bu2{PI1fs{SHFk%E2+L7o+78@ z)MxP*lFI81d?n#U{rl8q_^^f*sZ#9uhNG#^G3*AQzzcn#A=!1y_|;G@_=Om6Xcu}U zerm7?h45buH-vWh;)eI4-x7T4{v~cSBkJA||3}d|M#r`GQM|mhja%Ec+q6lV#!hA? zW7|e-+s1^$jE$(adu!Wz=l!zRv(C5YtTSh3_Ot){x5$k2te2XWH7+2U)P}}j60Jc+R*ePib3W)V}C zu)bNzLW;*XzhX}lEN@xP?&q>vf;d3d+ZGAu2Se^D;3%Wjw%p`RqO`Y;X1HT{$fR82fpl5gN<9d|(kRqH>vX9PYLkU7 z#iPvHDrp&-CNGhm#q4gs+&&gNrAgF&9Q&-Mubq$6lvlQ^@To;F+dmN?9)9Zv;_@tQ z2a@C;|4h z^QLiqy@B-`y|r@|e2dl9IUBy#qZ8n>tht@L;T^h*op=OF@wBrExx4d_$J?LT z{IhEb>Tz8_R}@-Sxv?u3BPxmS8p8S)cy*7!jm(Md-j8!{&%RBna*aB=z&=_Xx=}&ZM43@-NoX9v219AojeZyrNx{&7=~k5wcxW z2W7m>pSGCflwoP9#9Ubx?I|HsrludmSIaKZvv4xmJ^CfAP4<>C5%aOT7ZPXVbgLnO zHdc3=hYSYpz6dcGM)eGXa#Txuw!uzxv3s!a6|F~mnh>MwYkKY@{;Nun%|~iWpUNUp zC57FxOf)R_tjvYkm~~M09&PZBC`!)FSw$bP*jPkAVKf_kky z0er4ISFVH9x54F~p!|k&ighr*YNG-QUs}FWQ4arF^j>ieA7=alWHM$ir8Ou7+WZuqe9^p@W-q2ajo3ds&@Q%HdW=qQ<;}l zkMVaIVd}922z`QjCZU6BQLi9;rzEQn5|5FE>L_9xDNW5J%_P>S1*B7iE_Eh}jK8l8 z1SsrsWe`B-QC~oEnX0)O>E_~ab78UgRgWUI>&329`t4Y@M8K>Z2%AmMB8dQ^=hxz``P zN)*z|MB4>Ey$u);58Z3Woa1PFA7ca9OEmvr9n1#JTHG22P_qvgPoJwfg}Xq#tpVWY zQZ8vcm1*RAnmoLf^hr}om_!<<=^*U$^v^`ca2y9cigO%L2gZarcB?5d=S}C-^|85{ zdFmSgoUFWeDlniux%Vh&Me~SWGU!9?pWeDSYbBxg99Ud>sP`AdyAY|_44sgBPZJ5% zXBB8tVa)UljU2uzMX7lJw8`9sBG>%tr7K^ zb4>dHO=tD#CZb<4lXdGbM;U&)BbW;M99{oJ>&Wu}0 zO496!Dt8z(TcdIuTFvq(u0x?Y5cSb4)?lN%HPC_+t5B-foHzZ=_lk2r#B7QmdXx~P>bnejJk2vexsQnhX z-?Cn}Jo1$`OBWm^Q>@X&M{_$@>Qpg4EppxK*njJ7`c<)CtG)E$fZpcQ&)ZfCHy{{PS$cqLf1hHAJ2`Xt)mbj;}JjgIdJd#woCa!gk|M z*cHJ)#^dnyJcKb4p1^r(WWv9B_^qV~9t&fvLui?sjS9qP#!BN^WFURJ@fFfQ^D~V> zEv8~kb5OyQDt%Kp%h{!`4u?6V`ke41&IWyBc#Y+zekj6QcT)c=a=hY+VMF9#=W7En zs-QLAkQa?;C^1-K_SDQbyo~u${?)iRcCcid@eCllKyKs%gL7HNF3{{Ow(&9Ozw~a? zm^fDIY|{?#x}+8p1nfviGR1o)dW5DL$VE}P$q5Y>d^25zs`$~S=dfwqo92IDcuu}~ zHS9k&z`Ps2kF~~p3QlJ(GRMN@jJ0M8VkG^LIRycx#hB|5UDP7ulF)wFbmOAXbFOK| z*`aRNWaEageO9_LIP8_~v5_C%txPpGMX@Ji|(a}FpanQXSkZA}a@--s)Z zKV=yX-X_Lbwt^kP^Oiu!cELdl8PdgbThgJExgtv|6vy$gSfS_G^DXCK6IfF%_hBcP z^DOUROvXCv2$+HHWnB!POOu#rA&D-ci4-Dn5lnF*2p7V0WzhP>R2`bEhnX&g0abI& zL)aH+}P+~Xb z46{_nKFQo;u>eSEb(Y7#;VC<;bAVk*bFCXe6A~s_{XyB1EmmIKa#6muJT6l>(%KpK zfS+W&4hHgkY$L(9xbtmWAOQ9cn-@gJ`fLk;d|>{xMM5_+$JyXeEMuvS169+b&Bove zSD#rPe8gop*9Omb={;+PEzEo;WR3ooWlG2oRf*+9=(%o#g&o!+#am?IDNQAoXAyCA zo2`o?w^c2-21I@+Ls{8Tbw%&3jnU!x2CFOjS&rWNE+!@OqiuHV(sZb8M{I@1KL-JP zlP=p>0BgdKEd#hp^1`M9TE%BL0?X~dhwkZ?*Fk%21J+qV zPYmJK6TwpTY%427+~Z}HhK5RiSnq}{Z(ePi685>yXgd);Sf#XyBednCZC#Pv;sV?K zsG|i4`|zlHxhVUJXnt0u-8W`&#uPg=rY5z@o)Wt|S!8dDH75$}TEL3Zpx#GsO-I zcs0Xn+Yq?K&9E&D9Ofq4#s*w-!)>zyH`;gE_66QG*lh5i8g-JbFqqw=vpGTn+Ud5> zp^KWE>?=cG)E~1)hgqu++0(-dJTWl2XO?Q7{c+^Pg4d48k*eIUj)PIO?A;D>^wtc8 zBQ;u{cEZsSb0lSz<6O+yq&1EQv0D;OI)}y9N*bN30Gq`NoqGWp!g^;Q;GO{Jj03Lp z_~%?;A@`fJ2>6-v!8S1FEII_aH z6%!rG@D(K$j)&oo3n|XA5u!YMT^Y0x!1 z=5)eq*P<9*yr1iE>?X0r6%$)83Unc39|}jg=zwK>mn#`S;g!0Y0Qb1nu2#S=PMxb2 zIGx?@Y6os$SzK;lDr-3SfIhMNGx)jwP1_imxwF3xf!eR#r70(2m$ZdfqP3F<}jho5%Zkh@M)w;P8+y{lXrTupLE*H{#V|a{a zp!bb?Gq1y=OvEHOGSF-iK0rrV{&IY<<7_kO$8gcMAEY{bkX?og#s75pp-vDg9k*e* z#F@@W@LXcP^Ag}CX}HTP`ZI~-QbZmgJ$A1M(~yt4<3os^5b=LO5tPw=M*`54@V=Zg za!OU-O}}ZB7yZk9GpRfK5k6j2UVpRqSZZhg!;?eQ`vY^mjI`MUekb}oI}#p$KuaFz zIX;rsJ#g#TF66(eOR^ov=_+AIG;*7&sIC-Qsoq=i8RgZxE++~-S93C@5EHBYDpp~y z>u+%{<4+h%7*c|tc^UZ`ag}8yK8@(MyhO7}$E{L$4@qU)1=&OPvekfQk&yb$dKdGwfCg|~@m)d7 zcW?8)M?3EZos!b0y5mna(tX`sUUItF{oup^-O)GZ_$T_6KH%{=gqdBRi0<=3I-$9(x6PYoF_*T}E@Rz(*kt7`JL7ocPcd5?az4TMGb`6O1 zogSh+gZoH-pc{@p$OzQcz?}@Oek&x8xkPUOl`}~O-`LB{^9EU&Z|U(z~R8Abcik}8j;-E9eM1<hBr#Vk55o0v-zkQpBYA#` zO2iUgr*bEB1Mip85{Kl+styD0@?|PjOez1XdUX_2a7n3u2J|82yL2|XEeg6+BJSU(R3~J^nmE7w#@gr2(P{3yM#BU zZmH@E_gQVH>NNLiZF0Mg>#il$*L##zzM1>6_EJ8K2d~N_BOH?Q&h@Ynk`J9dU}pT0 zu0x=$@uIFSz~p#$_rjPt2~)b`qu>c%-5(5>w>=1RxXD^8NmaiO=QuGiC{_T++*sgq3gVjg*9zZ|J%ti7MaT zJXR80ez3|c!IdM5$4YX_joG&)pDSup%iOA`+psCEU|V+w0FT8A-~9 z!_EMdPoQCwLm2u3G8IY=2sx(7d^^?TP z_*GqtPt5eL*?}3%Os(lh9mu>`8wvlGHNEyC^mdj{T_E^=mblIqw>ryQza5yC^`<^2 z_D}ZA`ZqBR*~c1AMuW4N4JA=qvYQ(`G_!0=o$eeu*AF?*&R91?!{BqtEC1=5MH{~47;^kt~ zsTMUibw)SX@|y zM_w$p7d=AEE&f>?3FDM(Db_*0mIRl~0#}u=OUQ9iB@HEgpp_*TO6LO?m3%IZ1FR^W zTv{KyxpYnG!|qZt>&gmZOfP$v^_L1NU!9#vI#&+KnL)@ZFU@JkG0R=K%Q5`&FS%(bd&P>pk;vs0 zp?Q3Gbp<`IALdkhA2H;6$NWpo) z>~e3R!$>L*5bBJS@-X3D-LCQk5kXEW*Ndk~znA|M+Z*my9F!zg?W+*RdzBokFvNe) zdrUi#VrFXTCSJ&~r`U^k0>3z*E!O|LF4O8%}j9#M>N(-0Od=w#bf@(L2C#JuyMT#}a zPispgfeG7dFG${q2I~$cZ0Eb`=m|rd8+BcY9M-zJCrLBt_4V_T3aOBKzvNA1zj}Uh zH!-HZF=Yn6uKsLFCT@8B&(zTvQNxl{FnV*t(bQJtvxc~|35f0naT*lf*wB>L3+ryM zr+tN*8*Zj=fn08QpH72}tb56vU=FK$%N%76uY1FsZWPupVm7OO*N3t~yL9#0>?tko z`U{>ZjMELXIGq)gh6padcw<93?^GVD;XZ#(*38Dm{L5+c8)1Tc&!kh8&@X;=SZHS(u4`H4?*z)d3YW9IE9sf0i;ZMq}*NKI^>7%wIlG;fT5LA=!*nh-+R*DOe| z;d+~E6Srbf&DumEW^wcN#6i^4=5I;!k+)iACovEYTXrP%!9Ta0O!@^M+Y*z!0k*q| zNZo1K*F>hSx9n}gP}iGYG!;_yy=hHu8oUSA^q0P*Ev5M&{dvQjWlJH&$)*aC%1Z-GvZIJvAkm8#MWHCHxJy}&ws^! z(E3F{W7f5;7LK9kv;l-g)aEvk@DKT2Ta$=R3U0e3dPcY;9U%_Hr%UIHn{g+k+r>Yy zm5fQD;M2U5rr?!r79q(E5EK^#qkS1%# zw@o1FW#8LQkp=Br+L9@OjhEUi)Fm}j+rCp@m)()>plOO$O7V1V?lox*<3Q#k>21c3 zH1GCF%$B5=?cS`|_>1jK_6X6d_I7re;CTCg9Dh%KegenMPU+ao^=C3W(A)>~^o~rP z5A}LS4^K+j+i{J*g4Embm!C@{b}r`MCv5E8Cs>F3+!-#AV4rs~1lKU1I!lG?F%vpv zLJWF&r&ZX53T|)5ZM2?kZ^NzeXccaWby>R|*QpC{|AYr9B0AO+7I&0&AP6s;eLHH2 zy4s?Sd!*C~Qs-iFY_X#=in2Uk+*wHZFT1q!3biR?WY;8GY)V&`4}EfCMHh#zkm$PF z7-vM&yY4Yw@r%31FsWQX_ZH?`wr@9xMP-7!#jIEK&h83!2yH^Qo~@>&bl>J|B=7J3 z#>pdo>zTm0L(uoE%L3aRqEd}oA9P^ zQcn=EHFsT43JI54(4!?UOgq~1hI})5lWZ9!B_T)_MBO58l_gN`2)D|*X>i^z*)`f1 z&I|cJ^aS=u`3}Y~X0+UoL7=PTD8?1qcF(Z?R?0KElvz%0m1~&KNqG5r)&?S2{(^-k zU=*WSy?CBtF?$}aNU@3SgLTLzBB1sivT2A|`%c+d#3}n6*%riQgI)$fW~lDT@=$@@ zhh;YO+_ryYU(t^m5b}+fp6UQO6w52?kmuv}6p`dk+@HKG`A>XL)=$NH0zSQ60VK{$ zDO2PS&nB7`dQxQkLd8q+Xi=SVE;&y?Q6BV=*1<{yrGmp&7Ezb5E-HJd6y|p21?p3} zT=|_AM8m08&~((Dssr><6MrA!v?aa}xVCDBRlkKutc*DqgN>#~%<*)ePd5{8gHdgza2`b`qh9 z{Xn~dIGhF29wUY`XKLe!ee`Qu9%&n`Nt;Q+QcJb9q#8=CR!Mq8mTL#eUZk_y7vy5n zxZXBUiQ`jm6DY~?p|=PW=XlZE4H`7FdauQ?HD=9d@ILu*jfW!Gu|#CYsXX1k=$NGYx>J~u z2{;`OQztp8tHdr9?bF$@?Scs1d)x+|LO&H(&RwWqj{D9o(I3GFu>AEvd=qnqo==!V zf2>a<1kU9WfTD<-#GAj9{VKVYXBGYgfl@=dlfTI40eGKtvfe>cs!i?Zs z47V^s-gd(W%q5P(I2(J2O*9_FHna8_A-MU>X+{bT%J|2~#Z}YC8k2DMXtRt3_$Abh zMkyXlf$5jVJaBqi24XHdZ|Wz-^g1u=SI4fj^y$N5FYC7JQvel;OL_~C)Okz)6Lg}L zahGdG7(9WJ^8XBOhdVCF8F*C8I}j+e{5;1P5ZWp>MI* znI2%gn7>WmF&T_+=6^6Q`XBRr>|FX(^A;?Yw$U7b)le}8Q}iL1pP@H;t;@&I7Cpvw z%wUbiSZRj0F|%|JjZ0!KDU*$nu{9q5JR3l0+hMc<4>tN4KZ7RKoHMNl-K$WWKye)< zA5B?cjK@FMKo;ihGu?w&vv-6S@I4zI|v66xfgu^dD#<4m(eqB2+yEezB%<|B&`J(ls*l8HV_ z|7xj07tm)|4Cu$S0MqG6t4nP<6xr>Pnbt?v1S!$d1Y@Gq~Ntj|?3zJLMSbgA&L=r0wULg2rO-792^Q>iv z)4a{rPDB>xgVl+6&9+&eAcI*>>wBbtIcWWbtYh4?O+enHf3&Sct*37`H$-H)=a|bQ zMD7{pln9`Eyty<&XOo!CktoA3^Q)*OsvgUNsOR11Eq>7oDci!2;WU+7I${sit+(6- zjINq*9Ruhti?Hqj!i)a1fa(QlHWEpv|kLcU4!ir4%)uJ>IG5u(XdDS3HG`0HQclI^>8Yu((VPn#;&jj zBNnk5?2(Am%x*gf!DBe=RD_QH+j2X6w;OG_8otSmundMTa6>Fl!;@{_tTQ7H8YI?3 z5g*lutoTTE58PTA#cQ8w9gIHIe9-zm`fJ^J+qxJ{mE9H;8(u!rCIU<^&a*WGItyZK zH-PY5r0o~*byk^uE2u7Grad5Td1|Ab8D~gNv^Rj^i5Yey_)-$!dGO(EjH3v?nMHS0z(LFuM+dx!VYW>S z{p{A*Mu$FfE3H35``q2O>0w*!DBIDnr-pAfT6l+AZ|jIi>UnQ_92wo-Zl4@Aqxrgh zZ`8SZf*lr}UJbD)$LuJtw<}{ll|tP=)N^0zqo(D}U4 z&Pu3&JHcs&KHw~K4#AeNw>vMvf>_?p|6nOhfqiSp`M$CC)gh+7QTBNuE$-j;O`((Q z{r0F(rx9RJ3CrwVWjBVSWnla3h+Q3v9E&1{wS+i=BG1-;bi_xMRljpIM|)N5a$Jr6 zT{7VK5>r@M;9MDdCa=MHEcQnB4JRJJ%nWko0%xVYaCQT;Qu>_NK`WEaJAZ@Z2|rzv zL4V_eU2Edd9{=1Y?ujVa6$joYob1AYG5jHy7<`sj=c<8h<2JjjkRp!3<$}oAgRZNP z@2sb;570BLm5#%~&-+3hJA$wD1vpj(Yx}$%`$FbB{&m1Y&KWh1+|c~qREIe%TIO=R z4qx1n?pzrDu*L2?6CrKDI0cc68kAESwW&hw{4eTPX_#wLw6tiAYky31{$5v1%&Q!- zOB|b!`P|h4SdpIOasnz+5w7RJg~@pLM4&XW*u4<=HU6!83&>j%>ka@}M6ccWxV6Gg zH!Ut)fOm`I^7#kc)p1{WN8KiHEH~194qU*&y9dDKY@YiO_%%xdQy4eMB=9(6p7a*{ zooQrk2XdClUXp_9Hal`sF`1Ue;(t_fa}ay=9a-Rr+b;q!Bf6`re-j~$B+4VQ0cvgHErJbH| zTqyOC`vm|_^X?0duBUbN^+wL4&+A_pc9V|lr-t;>P5tg5Gh^n!+`uUe@Bq}G#Hbx; z_It#5F!1DbK6Az33g2)hdJyWfmRT}b;5~=w7_^;Q$ow?;;p9fv@}VVO-mLH;zY`*u z)3{TX2D@uK*q#7CW$dYSBj%dUlpIHVGJVcgpy=kllrxw;)`{Y7+&bF{-emk&JA}E2 z7~}A#WRgJ6i3DHrL8l4>B%gO3MATDYE(`Ps<-B`a+*s;ycRgS>wWV)TbTn;pA2ni# z#_GEomPI?;za@lBU)G-x#HKU)F9$g3?tx|g8yVvU5Pr1`pMl2H!HkT7N4_%{R|gk* zKWB~{3_o>^xqeV`@&+?vu*>T?Ghy(K*GQ&nX#9zT=sL|Vxd5Ht`@K_*mTFctOu#JA z7|NKKv)ba^XV@|wFKspMy#9UsF~T8ZGe4SGWu~zb zJCQ)@LPrDi9JS8zE3Sp+=iCmsK@&J1M*pVWb_GWg=p{fl|3@0M=|liI)Dhr*Qh!@beWC;j|WOxC~sl_xV; z;r#}$P8MKb-ibjHT831-ARU&C>M0;??RnRHh!iE;P-!9c%dQvhBa`JfGewjw%F#&} z>KRqHD2`Uqo6p@zf1o|isAb&Ld60$761|*2WUVmZF=|$saWT?|J>1v|o59AKR)d$Y z%_cbz#93lq5Oa|u^31g5aqQ;b5k&3`OL!QA3$(O{ShzCFpWt=e=hmpea^7NVb-*cJ zr1if4C|<5@iQffYzb)=`KktJr$9IT7**4&FnZMaS%KIrl*nY_KTpg5pK!?mZ(!~lk z<5%0;whWKHt3AqGB|TPRU>3Ab$sNwx(&1@NXT9&F#2Yx1yY~o0+|#lJ?DxFWawFZ! zpRM>yzRj;!-Xm-f%vY6QtOAyLA2L&LRc(S53)lCCfv*ciy;jg^;Wf<`z!=eDO-J-I z5nMYV^0lZ*i;CDOdZ~4W6^fVY)`pH3`|B9NU1Et&AA}Pdbw305i@)j*1niV7)C>Ig zNRH{HXHH7+`Wt>=Ns(dP=>q8)4d6^Qy$EMt5f1$kjyZDL7)_RM7O6-=J*~=x>9sB8i@q0T@lH20jx+W7&Buwnm zU}q;ly1h_~6J*_w;LyZjJu#3AiQYYz<5ChcW#K?v;#rwGmYg(2J|$X{bX?Alnw}(( zKa5CEk}6h(?@YR{K!v_fo~Gyt(I)RvjtOo{1}VdWx|1bJNuVKFs_YE7ntWM#Ens58 zsVcIDny{m4ng*1xzVdJP<%D&W-&>~re_eesVQZ!}g4aorVyvjNhFRbRr4dSJW{pleSNc6AK0UU4SA1K>qzaV~mhrW! zh1-%Tui3|1pS7lTIqiH_PVFCZPu8`%9D+7`W&JYT$ZUAM5>3gjYuJWdoBgao3ZItq zZ{r5&tQ^0_9B@QVeB)b?B1h8{4&0pcph*#XBX?}mpP2029nB}BqjMq6Nl}5hiOn}6 z!*lCf7DYgEO)a6}^xQiwiD8Y|r}HZHmAzcqWqPOx3ksx zlq!7orF?ZUE&F-?2Ty;_$buc|xjEp%1xc+r_lwR*&g51Ve-QBUAf+zuguEwZkC?{% z!16n^ru>2mEV(EDTID#xw}OS0r8q)CMAZz;%7UD#64dyDq3T(P*#&>9@vxY}_0=~Z zib6om3Gk-E%$i!z-9kmpLtt^?_1awkK;h5Y->=F#3A1?bGS?v({aSxZ_d1XzO@xO zt1*qW?wmyQ(%LsUZ;)wl$o4Xrhwg*?^N+I6CNoyJ<2$klAGtrLrCx7R+D>?`-L zTPk^1_@^#5zASfBT~@-z3|E~op*zJ`_abq7;+Xn{iM`^=`kdsEf~xv2DKoj}8aAY~ zv;S>CrTQ|;8p>1MwAhBev@?|B4ZqSZkU|@`q#q;HH-@IS;r=%AGG<}9jZGO0%%;Z6 z8JAEW8ee6uLMoa@WfBneO-nN6@YbdynO|YLrnszQ&?`;EEDm&71Da#DtY{!{^p;f( zWX_=JbVDr{pdM_v&Ku#$&(GqiTALb!__X@9jhTWSl|hYzf)6E=n!?j#T3D_e)9?7;cAu1P7!PHFW@d5FH&8kf2Z)z`{R zr6A9>mZX{y_gmFz6XCyFFQy%bZ*CrBT(kUWzQ8zV`RQ3-GS@bLXM!}oEgP7BJ^6VQ zODhd;X=HO6p0#);(yNzvy#4W|FIth@bA?-58+hqC4_cq_Pi4GoTf+aH8qfw3bR>Rj zD;7pcZna(e|0#xan5dZVE8Qwy&v8njVjU|}nk?DHph;ztE?T_wUi>=B73rV&0`j)@ z#ql4A?d>NLP7#3Z$b?S(qIOB*80?ew(!`UPYwhyHc=Vn2p+qO@b^Ft#*{FXyMkaxg z2c%P}Ue+P$bm~5jj;C(3^h>u=Ra%D>LJOBGrKR*q?eC=*=@*;w+9xu~Yc99@FcIZV z?IPC7qBreY*1f#?_Rs9bEOo~QPC)vc4mfvQvbCd>+mz7Uae)^uc6W~C-4!nC+`$*{ zDm(FlSsYwvfgp($-f0w0V4yqS2@`3?uDQaO)MZ_JMPcNsE|5q`3hqi4&m_+2l8T9* zWQJZW!(Hw=FaChN-t|nf8S}L3uY~N$&(D<@(c3#mdRiXSI!6(o+0r|{6Yp7{bS@)d z^;0^-$g`AlIk%U~2h}~7 z@hhXhJBTSy<#vl$r;@Gl(7YVglt*5AP1i>s}-l|(nXL6(rD7+mhV4`U*ppcc6e4y$L!>BSzovaxs5u9y?TV|M zG74VtnLCEOUpaw$inLj|n9C&YQ10S(5WJMW+`sr(C6ad){A+(E55-KhKarn8 zzqKpmNDRdYk>_IPtCQqb?3M1P@^84BHnn0C9^1G;0V8a#`A1PgcwLTEoFjG>dwyG! zDET4Ez2v#sCMBMHDTAi0q!3e~%CppelTuWpsH*svs!g;&F;NAkJrW*MWzkXmy(&5V zIoDrxn*m_gtN&s2vnHz-GB+_&)O(mh`hImd^8)pkn#Ni|8B}L@s?aRz3RW}8q3&Vb zB3@BD*s}<))i>Et!ct`|vcVxz)*x#=T8PYX5S41wG*hVZ0ZQ4Mp_+!q^!!ns!fcRU zSMf0Kn!Hur*v{Gmsz*3{MT2@iep3lueFlHGpj0g+BH!15JfF0=zT|B!jo!dQmZ+CHJ)dZjnzccM9fzjI_)u| zQj<+TMF(j*=uNcEnsfA@)Qy_^jH4bZ*eiyJd{Fa~VJ3xWr!#&Llhr!-8RvMl7Jl40 zPTdJ#=NzHF0BicM%a1z z6D=5C)p1>0guu1{wEf5(^>Mmk$gfpbbvseIvThv=O)0vgE5WSIkJh;{cXDRyeq+-z zXXuyWR;KOMhv00<^?E8kIB~7M6n{zbQ|}OVMrklW8@o}$sl^3!AP#6RTzfIPHLOsF8L3|X81<&CjZh^f&*Mr zb%o&Lu1UHC@LJbsT@|?0V$-=GM|DedpCMlqUHUapU1x_r7A9`pr_Y8TZ}8Gv;D4&k z`Y#Aud97hN5?6fQ5Q$n=5M)R|4dzZU=+L~ZsfI_GdFcm@3ozD{cB2Q1Q(+e~pd5d`p`c>jT=6#r?_|awnc7%AP*)w@B@iW-Z&A;(bmeMjC-@)v$Y$c3gSS-5<2j~NqBLoWVo+X&jM4M^6 z3%KigVY~&n?0Rmz2r#-H8{Y!g*=CrQ0I%tjOyQtH)izUR9H9H8Ne`ahcHi^_eAeTi z&xEAca?D4d$0~tl6!b%BzPSX}Q#9YKgP+d3VSbJHC;N_N3Zf`;yyXCLUmD8-MP5%C zXGui)C*HSoqMpa!w_HY(B_ln_MYAZvIu^4_V70ErNcsNOlbFA}vDPT8FQ?B+!nUwW zt=YJdtTL+%2Vizt?YL5g#d-zzfPTyR6hEIn%^VdQ^xKEm6Vry(= z=0rex1+aW6?>n}>uYC~Sw2ZzMNtp{N7m zjWz%M#vTE!TVU&z% z_Py}QscrTMcw(}|&VqkV6x+)YtoUZT9C1$k$3B2uCc@aCArl3k9g~pX_$tQ&)E1A$ zzXnD2^tT*FxjBa&G3X8KAO{Vd$U-}q=oTi=k%+#<=&^o|dfYe4`a0@z-!SXFD2@Av z^<(rbyT~>_T4kJUI~jvfpR-Y87x#R#)yCdvZ?#>FsQe@ z*n_UmRJ~7woz6-2UAj9wj!W+eOh^dxPv9(GO)} z`>mMrj=hetvA`CLV-H|y!)QkwV5s_=BNLcXanzv$9WJ@-cnEr2Sm&G(SDM%9JPbaZ z{nCj7-^qkH3n1}nf1NVO*Oc4N%TRvOUFUb$KZ#>q^I(j4v}*_Kq4=sR0PZ7#y0GwO z;WC#H{+s{Qm5MmTlex+fVs4j9hH!CAt^wo<_6^r{B!uSVR-5C-*&b?h8lvJ#hMkn;orAdIa9&>uikN zqFLs=8u?icca4j(bZ&I*isrYXU2!p68Yj3?WA4?Caj9a9DSND}e@A5zNsbPC~pZl)B@^};aKEvK{*Y(eWdvk*Nm%~Nu z6y$r8LjDm|W}erk*iLEt|@`u{qXxc}MVPY#Y)S5m(v+5^6~QIpBh4lo)3e zyN@bzt)$PUQCwF^ee|tvGH#IWbbmt6V)*nC;f)M^-+c(3xyl1M5HO4TRk3d7`+-@} zJ6M4Ol!(`??t!7OYpmac|AyRPdk><5m$C~6djciwyMy2Se{-e}Z9UV-@g2hWfjIF) zb*I;IY(qDEmvcUy9p|%wJMZjv?_J!ZX91`DxVW>4Cq>AYrXKlwRIurDM*(`OnN!b0 zcbb2c&B9!?SaL7n5LQcC4q>P5zl8CmiH=bMFuC11fgMHp?tD%&)5f@3NXfJzw-+vp zPIjL|-KT%;I}K+rsC{P0X~y;bwV+_;>HfmlDrQsv=je&7kpsaI4i4tdI3j+F0B- zTTncLaM8}-Ye>s2qA|-$?i>`t?3OWH{qU z-xJU{hO9p%Hk>)FUlHYE;s>Tih?oNd*f1<>;ebAb%z_R66QuSaUIPN>u)Yiy_~)~? z44yx8gbg1Wd-^-OV(6%^jeUKH>7(P!9+G+wagGdKJ9UeLJUjg4drtP*wI^5L=IcTg zy}0SRRo#CypZ-cd6#vK|O)nt4HH}OtC3(oaf;w`pHJnYR4!4!i z-qKdv2S`qu!(qj#=|pETdK%r}@`5KY_IN&{F$}wV4v52e;H1b&3-d*+>g$gF_3+FJLlxU zpzkVFwLR4dzLtRY_HU`)BVZJayi z%_s}k&wLkN!0oo2hE#F?SgwI?@WQPDfYUswwJl~O@3n1dG{T8gTp9^de039O&V1iP|R{yPnD-Ot+4Z^98BEJK|WsZ-h4+;I8b9}>v z4Cg_gG`3gAZ#A2}vO}y)Vo&V|m-et{c7W^H?BgBUvSI9=PD!3G$EPbleGlhPcW>fo z-Y}WJP{&`Zn895x*rRka{tBn6r%{&*O}(3lX`=1DH*t$Z6`Fk1N6`=M47ew0qAi0S z64&VF#L2{Obxh#@SUStFCKvyW+aBYn$L>CMcefrz6h#36=~#DnvS7i0F<>y*7$ZjK zf_0CyTaVq{anwJ*>-xXBUq9FLV!NLEzQ6Ye#9q_!?Cd{mf+Zp*jNND{KaB_FCx>f&7w+YlZ3|DzIPYwcCxqOIw$d;$cbDz)aTPbkKK@uMmuuf1 z`jGLUGT!)!;i!0E+`-USwANo^s4FzOTa4NYtBTI}w{k(An|Y%0m$a4npn8me#ggk! za3-+@HDBofPEOq|@?kEnArVi?SkqXJev?t%ghohs6Ps5-fjnfh4TR?zTEfy>`J-Dd zq%P-&weCo|%@?-TC7Ag=ZBydhg3)c@v!et%+uSk90z~_qGnWOG?Zhaa;6}SS@__J< z_RkTcgi8$jPJI?0GYG?f2uX&{@G(M-;pfSvLbq}Di5T9Wni=NAjL+&8b7;m>b$*jC z`VKqEA6z7Dd)9LbQo$YkHwx(Z|{-@E_tswYLBaF{3UzZMC?g&XY1$GO&JG z(k#j5`kaJhNqYT@IFqEfVb9rhk}D0_F^{E#8lFb0rHdL@o=KG+ZA3<$lHwZcB4edx zjn5)b(qPld)0xuSO(~~ZM6E?DIvPZJ<^7IwQI+y$D^k>|d|UHLWGxz|eI*JOEiR51 z-6@LA3l)zla%Bw>!;8y=Jn?f?D_19xmri2FO3~^!)WWQTWyPfBSr@f#+Z@&dG9 zrqG>0+>+hVorlfOo>P$m&drXixB)zxU0As{eP#B!N^|P^oMBbVlc_nIs~Cxwb3j#> z6OQHNR&S2`mgBDOCxhiYtL}@X=l-Q19)rwXuRj`%%RQ}^pJC^c`>z{Rxj8k%BfDg8 z^5m9hvR8SjmWQ(UdFb}r*`xES>if6s^X^tSvUe&bm7dOyP#i0W&4wvBIWw}e6*tBF z?DzRDet8bO-~s2K+`p9nFaWu?i|0`OlZ#YY#BTZP5(2I}U0H#qR8cvcZbvY(vp91wH$B-T;L%=btQs!kCktiOnCDdzv>ipDAau zCl;(wjHDM9^yRB5kiz2y24YHKLtzDuU-(S94Bf3Me(STV8XiM zMWy58cNgz3jfjgZPA$zpD^#u(h1#bnH;Xp+>u%9$^A{yhWNDe9RERg!WGVgP)^d>Y zyJVZHzG#u8Hovs!AL)Rc#YM@|P|2F2Olg~-rRYKykXut6Dyw8oD}J6ckM>-Zm>WWV zpt>ZFAx#p>Ejf{wfxc0atr&|eEwL&%aAwI{#W$#^ba6fye5>?y{&~>0QbNHR zKwW8Z0YCk0X`tYC+RW0|g_}|ytA`X)lFzAU6&jN+sJ9lrOT4R&RxVBWrY0)k39CvH zd3BB%C2718$IKD{uhnv)M8;p*HnqgbZ>-aod>0(4P?W9{JS_cE3KWu*14;{pzvZgZ zU?wfgR(dbfC)%f;AUet4sNN=O;o#H_;-Ad*nhnx}w5=L#7MKjvJeAERILqeBw79Kh zXR^1Tf0XgE^~if=?Kv~xugV_gD79O2PlG3D&*nA&9a@%rEP$@9k;BrD zY5j6-+79i%^6RO)wO{gPrW`Gwke860T)rW%EUBPu6??mLaM^nHO6QQWjqE+Pl(H1I zt^G=wf^(`tPyF#zJMlH{K(n~`Ll9fmK4-oc_8aOFuyWZwh_RqM9LuP{7Rv$G%c^P zTy`zBuF{(QcgnxI9{L>TBV8Z;uYT>KPjw8^eW4c_Gb)xbHZ&cpNMYR8r&g$$`P!Ei zcUWO1(<*1M2NYbXjAGZy|Ed&oLbJ@3MoyQ=Q2C5|LNKywEZ4Y;oTbx!q0{#Q~#HAEmFBvh+}!*Iu{y+R5my84~)EviyKKQj$EMt>;N0vGDjMAKlK z^#TzN@=0GW3V=QObK*ZiX8i;4F<^)OyI2ee)=Urw)9==-mJCauRK1+M*JZ3;OWx`- zRj(rNaz<6hll|u5)j1Sk^ULa9>h#(<`ah{xbq0M1EvNLoo zU_<>Rfe_@WUnb}S-mE_)oCF+K8;&n@GioF8(tbUG&vf-$VT5rV_}V%`Lo2-Y5i!25 zx^6CML1lPdZ2uZmL7jrEFNW4#paAks^<$~?a&h$ssOPh|^$Z$W^sK&(zEF@`|Ca8{ zpf@aFq_K+|QvR1>Gzged8ll0+`iru=;W?{-w61X^djw%u? zjc!zMWT@GVEu5=}Ta6dE^Wl|^Z@ElZNz-7i394zD#C;8^Yg(GI80>D^lK}*MZa9jG z^6Y8|!Gw8sHtfXw)8C>`!E{^94Kgge&D-F?&1@Lg@C$dn%HOyJU#Oklh#^F%zBJYl z#}poKd`R@=jcuAn0%b33I!T@+ku-71ZJFDe?37sk(x$hR*W4q`%c;5j{rPCxc*gQ( z0j-q!x!KasA9~&VfUY17Xc@{FM>yWHk|DsgwnQ*KV7InFnfuWXTe!?Zl%_?^eB0lj z_po*&fGyWp8E|;ZLzV-EZ+Xx92^F@EWN(64o4z2!JkOebAVWOQo8BRJcuJdRAwAaT z%_mVn!^mbKdR8N}*@?cQU)%fxBP-8pS&uzZN@xLNzbG%ZXmOPaWy>Y}k(`#+VfbHJ zvs*V1ibb8R0AiTH)G8z1&A8U;Ch<6%TVIl=FimY!$hmZG+kVP&DzObf(U3)LnbZNq zTWvK|GGTAqIqGwqr|mgyDHhv4goeeeZJ$Z&Mg7;li@vbGKOawrB8Rr4=yJq_b{72> zd`Y{KF&h@&N{6AnqE;3R=oPmTU}wAsS_@#e?1NjqaISG>>o>%s{1mg5h``=8-ypVOZkj)kCZHd83?xOO zK6Ly^%0vz8m`AcAw;A68gT7|t2cX~AVtfd!^HrM$gXTFdnbv@8=DDUMFtSBw%7x6W zlbZaHb5$cv-=Q4s2=f})wi22-4faSGZdSm>3YxhS5t8%8`~mSWtEOWSvPi7!2t%#y z-=CqPF7nrQ=+QW?y`vZXiY@8*f?+UumbutL{rfZ9u#wb{mME;75@R9Z){yR6R5%H- z$kK$nNr<)t@ayo4EKl)V+yd(#`19EH)|rGUn1j~831R3c>m~vlB{V-v=lj>2U#7GA z^+7t^zq(^U`ZH%;$0|Tx$KZ}c;IURohYU2Tp55U9`KpI^yam(BM_cAYHkYz3VUPz! z(H1H+FP~?rhaHd)v0Q;Yky))H;1Y?^x)!lK^MN%1VGyPsTA8u^asj78xa%V|3xRl$cc2D26LYfVzXj5TIsK{)TZkEm6p=fT))O*P8;evZF!Vd(P6YsOpj^{ zvmOGBZa8Ko0Rq*xt#!bR@|V^}pb#~}HW~D@IMj9&++4u6u_3^`;kFv+h-{DT7PLz0 zwhxCL6uq~vg8ao9F6EZIHtpl8HbfSx-eTY0b4@y*T4+h z+2l8YX}06Z*8&r4z?2=X&o*hw1xvckn#yV)WqX~ruCd=yPkW}<+fS$KbWXbvkfJ$k zHv`A0mfPO|t%d21g&<7cOGgBFVotL|2zF$(IV_NP@k__Eey++H=On0#|I)b$Hlu&^ z%gsgIJfGA~=S*%vlQWp-Y_x#4_3h=T(G^((8PQctMsqza!U>VqD{pC}M0r7HNR>)JX$aNnIV%NJzK(DaIxaYz4FbM8F zuqyfhcLIC})#@g}6De#r7p^5Aa~HrLlMcBX5le}u-JJ+L0qVYu@ZtIHXNdPWvlEwa zF7U#MPPiO+?o3Ir1RgkviL*T`ovK8OwaV#Ff*7KmACl)cVO(>QZ`MwAg{9Cf5#`wd?&MHBX^?}g+a5AR#ysdzKz`7BJ!WVsP3pM|4N~JhZ(*Y-%e|vu zvE-%RrLbDk4(}n@S7MYm5x$>5^n&0}e5K10&j{{wwZ@}@yIke*r-PeZruYU=q3eFa zDcgMagv8N?yY7RDUCqPXA zn%0sx&|^$LlrzlpApKF+9`6u9ytu}@1aLQVuQwbB7tHg*fZe=VUI}O)cdyp~aW5{vEC=(G)94M1h|JD?OOraPFv*L2BAM#TkC(Tvm6` z^Dyy66~Q|tsl0rwHzYYuJ>1JlnN=L+ZA$SKJn`O3h36T4LsLKHSbeM0xLIF(Vd*0! z={`hyX6ARF0x+-NKd%Mwd6#_wzNGiaL{ks zReu`zIJL@;2lFUpelhq8xyi4CtRZ#!O%N*anLh|=AkOtJkNp{Z_I5UH10DrQy zK@=dFnG_TO42)I5O5i;DuwWZ7hBhGR0t%=jgXe&4l-a?1z#ru8!SA4>B$7WW`a>tx ze%f)75G5x#An{#(Oz`g{nmjFdEO~miE{IRA&6*cfq^uNo1f41F zOkMD9>Uu#<@ONr0?_%fTv}GAPI*+AkIBlJ2X+PQfJGtp8tf8IibPMA`r=|ZcsixBp zI8M`bUg*D0s_(o5sGvAIUjeR=?{p0YE+$V0e|IiuI|?ax^6Ec9CpaJI20?$gI7Khv zq3*M}w-FCLvEl|)xfjJ-iaFzBGLhKJek>&lKRFPBHxb4Kexh-N^T9kgnaJ;41incc z)Tso3NZhV*sryMUyNF50$WdK);&aK4?)_)~q)g~8h_+E6-LIpx6noF!h+4{jJ)Bc7 zsXKan;RmSH-ak&5sIK0B!jRMty|m+h(-!tNg+8an^gcLxo0i)*Iph_sukUckaN4In z)R7tVseO5eL%?sGv)c|qPCFADCP2qI@9Snj3tf>#c9_;ZCYOO2ff4w4d|tqhUP3?yA@E(qWx=1|GGb#V5wMlCrSnbdR8mD(Ow!-v zKfCPlP%^Q5LF^-PXE!;zfHJMSD~d#c_RNatA3E+yJ>{dk?$L$Mp|0t9dLoZX>|Gpo zj9TBDczihZR&P#d7j0ax=ctu-u=is~kVftM`^Y_-zVGDWpR}Gn{Nd%`$Ij_(`yd0H zn;Rq$oKvA&1l{FYRuqKZceUhhhYxi#M9m19hmkP=73$4l9K;OtX~>~ixnG6*7v~Ou zQ5|@5a60S(ff;NDA16-iT$lcuSk$Rc=^~BmnwofrMChW&|4q8zbw5^3-qO7-I)cpY z7Da6!U+lgav4b+JXW=O>u|?!TUAz0ApVbu+b(;LE3mZYCEa`fAs-6_}RT1Y`_7im8EhJ7dYD<$B-p%zf-&eO0=+IZJw@ERJ)WlaA~d+I)vI)T2{ZA}WL z(>-hA+v$Ct?6U~Q7|-jN!;Hh;s51u{5^q2DlhNn>bovEzgm34mMCLkQLHJN+vhVE) zJ2Th6FigM<_>Ui_u?G5y$Hc6uet)QpwInd@sFD>DI1Y^#cX%za~fe`bHiEc?O8ri>7~Dk3(6X@7lsYDTMLarmQ*hmP=**LcGnk`p(1 zOB|hH{VV5=-^YLQP|nTA*RoXA^`@IFTJ>hr99DYu*#4ehQuW}9e_5F7#U+_6eRa0t zI(vpbC99XMuSpS>a1PWGxr?}K>IXBh8LJwCl;gZbO<01I_iu9*b||0K(t)(|pSA*E z`GQkzgTal0!Zrcmwct_P*R&+zrgnJBY$2@ueBxJOondYKZ{bISBrYs-h2cqTb!Mz_ zYs}0{sgZZ4Gt+Cl5S5wv(=;VAMl{6~8?i^U$&`0`pD4-{ICWe^GkpmMh^ov>PnPnV zwcL&!{Cw@SjzxTa*{9|jKC|pu^*27R?2{(QFVU`0F6Lj;R^?6+>@FvX?+KhbJRc-H zTT#T8W$vgtN>3Io(2pgTiayn_2+PFDq>x^y5-!V2T(+{4v+z~Nkqep1@e z+y*^6B`5c}{&~_T`Lvp~i4gg&8ezf&Ii%)x+&Q_jcIDX;xxF?qRwBPqn-wFKf2i$@ z&d(cHH|R`l-iEqeQTKA#1xKyc9BRQRYikavV3a|hBQ99ifXpc^I9pkm(^Qb5UYQdp zFcfafxmWN$=XdUi!f**P7pPn-5a-@4I>22c#}%`fNAfn6?4n-H`(1jIWKzJ?xA5hP z^O`b@KYwmn1ZqltY*{Z{kgw7nh91tpp!I>57Yr$10bEnCvpg%ET7WG7m3pfnUl)~f zqQIfkCH+_MTK7KDTsWy>PXecKeT6U{U3j#@8iyY z75%I7!ao*vpsODBU?7uS`t0NKU2O0T4kRt;1yN;Rk!s0k@Z)nT3wYw#ya4F&Ts?$UP!#VEFVY2hLSLVc=G3d5?| zh3_GDb&E0%JWqW~=>-<5e-w=Y?AOdG3Qzl~*;}Mc^=VRy-ldo{K%(Mzh9}2&>ol{TDB-Mk|M@2&_qtpyhw%Vv} z6i-sR)wjihykyN_@iQ4iGflEsJVdikQow(&p-7i-cWa(yg)zUDVPzHcA!QGS~WrxoO$!q3xo~lJ`1sR*1 zZf#LUsC|akm*FJtwurc}@2-4t|I@8<8# zNT`PMo7vl|&kK4ONc{of7wR*;JhO{T*1JTuMB8lYqt z@?MQhl7dL8(Myc*(KRl~Z>YQGU+F=JxOR{<6U?ohD}4Zx)UL^z3RKkY&pHaIu05N@ zOuwZ^(<0qqJ)U-~Us1Gh=TE(gcEQ}B@1uiS3TuWk{;KV(*~@TOfNCgAgu1+@g*BxJ zS@WD_RkYR4VMpbp)t+X*lp<@%oP|Xq~e#?rw9yKd_7k<8-2OHM#w=$)}IqzME+6#EOQ#%)i5*@ z1QRtZ$}~XP4I!c-knDz3(KfKA0WTteS{o#yR^XGm9Fp0yqE1O_^Q^ARCmG!{>pbKg zmIZZR$v4{O)vu?B>Qn2X)csXs>owFbWs&t)X%(ua4P)u23y2K|=-=e48*q$5+3p5C zbG=yGaEWOX{?j;ub&R*VaW$)(bEq+eeS%ri*v^TdZ)v>C>7x8>8pl0EdegL>>n9Fw zipiLUKi)*ofMOe)N;9rtRyTQg8&MCMZt~DbRnr$-_P-RPCBS6TTrKaIZz;{K(^&vgpmjZ~i}+XTG4@hCq7}~0z`kjfvfp5| zt!mB|bZl!Yhk=^cdY~*0)t7mELDP1`q=p?`m7DLScn zNBbGfU$tY}g&1!IvE7CxYe4PqaVv{^4fAoA3lxS3JYQ}y2nkEGmm3U(^OAoJFNu)M z3&t6wzxdybA*B3_Xd{ulmVMt?LM~_48{L%AbdB*DMNBoB#!%i;#+X)6caqSi5UQ5& z!Gxp@$Jdy$Xs2;VQw2?g-DYyqZerG%?$Vc`_nLmwsi-sN33L+@WnMskgU}cr!dLk0 z|F75JvwekzFK~&2X`GK(U~(EG5a(L<7==h?-5jF>wW(5J{Dyi{mTOvzt|%F7O2L7H5Wf}E2%4yk7B_cnV2SJ|skM`?Be~9Tl#O2>-9tU0FOf+wY+RXK4X#c{| z7PA^Yx&CkS6?mYkqGK$Ap{?mSh+I`Vr-O{Vto+i^gc9d3?YN8Hnp2%6f*doK|Cn5V+J)Ru16~ zS!69IZX_MDx{1Za(bn_CfAJTrPe^ldLE9iwBKC@H2B{YF!nU3~4D*L=FL^b3t7R;x z+ke3_3S{)3>-Y-F_xmkl!2?`dEgQjw9a2jY1+ET5we1yTv%dHFH zv(z)Jr{Ud2AFX_ZpkS%hfLtsuw?0MQ$WFISMxmt%wgc!1BB>3G77E_kWSE&ehRuf2 zaHDLuv45~b?E|nJCeXeT`-AScAI62zR@qZ=&6FlPA3uQ%x7Xvbq-}OD-bVbxeuprE zFwp*)a1{TiV;n(@Tj*FuxPaa7*hKh^!CHNQJAr*xC*WdWkF^=l5!h<&0WNagw|)nD zEFrdKAZ*(sTP%1Os;*4ZR3F;ds%Hc$VSUAUX^!MI7za;`R}yI;}Vbezo%=?lvye`2_zb zmSs;%9~Y>xC!`MyRM}6aJq&2<(DXxYx?Pce&+^Xh2V}J??LUD>8*3aJ`uF3GIKZHO z6tANcjL|%IT!Ac6U2=|wTv3j9Zi5mPawixzG54%93sxkHa+=|bB|_(IxFPeM^A}>X zfZOrrk!dx%VC6tZs!RYVg zVeZM8^~7K9l^8s6lzTVEPMGBm#}3DDb3?F)aahOK)P&#!$NSWy!Eug#jy{ zUw(q?HiRHw>>dUkoxRw-7FsEdbH~B9iMrhsm{}O@*1~u2H@j`{=8RSD>xh}0Q1>rH z221amf%wjx>RF8pr7Jy0kt$k*2Z;PZo$cYEQpxWS`ka={R_(o z3iY@53*si_vTrzYBDu#m3Au-K*|!J@CqDIUL28IYd?%4F2)p~;je=mW+mw_Y>~>cs z;e#HxIjPS(*L^P;Vyp6uPMK&-_v}dNY?gYUsqDJFp5nAkRZvfN+RO5Ro}cOJ($C(- zfbGRwz2SgM1zs-|h|0_M>Occ?^1a=l?5tkz5AYJnA>T}Japra3KagdD4j&9s#!OdW3IMYGt|Bw=eCOy2uAf`?vV6FE5>5i1OJ0qZPY-&j8xo zBmS|#Mg9Hr9l&nMH-8jpw@Botfx3h+e;GJ}kM^6vEg3ofTaZL zRzD_np=P~bk!n$q{r0qY0lP;&)^2|LzXgl6tbeff1cP+VVo5tKrZ(8&$FQO zsULy`(EXI}K^>Gr`7_uKwUL(w`(VRK0RP6gE1j+W6>*)NjsDqj?VWo6`uIt{Xn$OM zhy9aZm;f{R{2hs_T1WX`C%&z}5SWovs{b=^I5||;*zfHR(liB1Q_5671AVDSmHC0M zsW0*&!9{5zIW>4NeSCIn5Sd<)wKgaQ{4EXy8vv!5HNh*urGmELYhV`dTIXoshm5VA zD?w?ThR&m)i|jp}G2l_mFP%{EVTQGn30BdwJ5}J%w7kv=$V_TUXCq_}rJ>Ufp_02g zuRuKHKLR_>KJNSxSawimeySj|v#ncmBF7QbTxa%sokX#PC;-a>T;SATE##s1W z_xg%{#HHJ-!Xxi_BzY<5NH0mc1oOqm;LCAJKZkXdFe^Z!dWnGG3F2xJv~w8d1NnGo z4RSpBTh}Hilv2=T1Wlrj>t3Apj4JNVOBqOg(ETBCCv8_xSX?bl*;5${p#9tPF?tVu zN$;MheROhfW`vAx?Cn1Foc^J2WOy87UEjfze=;zA%&&%#qhoyLh;tJ{ zWz22o_8iqR)6RiIEKK>i+#?@h9v8Nq3t#MNX~e?s^*_G~an`L;g(DAp{>l3jmF=A? zX~N9%&ESv0y8R1SC-I4ah14)YXK)muoA@f&htZK@Dq@u~!b()~$(8QITsk{m)0^cM1%m|~xb*@iphFQ=IB z=K@N?5#rP!60@1KzH=3VNc!CAhTJDNc7+2~lto?r(LY7my)v0g`Q4qB&_#{vejc}t z+TL?8<|}PbkNnJ4+R>i7kvD0@y~`t((Vq5VPD$vqd+YoA=VyDLpQxu7^(_oT(r@)8 z9N*9QqfdNnEn|6KYv@|W$-di1cQQ!lhJ~DFRGnLMM2v*lVeRjbD0^r#7^$)|s|KTH z*uRz(qFfHEVlEoyjFiS>LR=vJN$g4YCDtZfKUJIZ2H);GM>tKm6c~qDMp_rBM&ywH z42DBTlkWukfR`xSI+1CG6j9g6g?`;ahs^=-GrFO)XwhKGnZ+by01jO zp~d%vM*L07?CCg#r#XARoqSAR)I0Pta6%&NzONGb9*t>;`8{Fe~&PXJxQEbS(8}^EOi) z^|0m+ypBZlEw|%h5;!VOKb&c{{AEVA1NC%{Px7e z_q@OCUGZ0WVU9UxukmCKV(fh04M$hBfIr?jJ?a;KixV1I#!qwVBhK>W&ikkT=KEbU zPR-;$a_tMB!T;sLoSY|^;nJMgAlT`;5|+j}TH`jiahBJdFn#7sty$G*t|8UBX%Ogyi?DW7_fU)8dbm?40-vT#F% z6WcOTE}^(R8D1s)(Ebi$%M39TfJSD@j04k&nYWFg)D5DU#;3`XMG>Z5iBm**rkwZ` z(FN0+vo7&q^YPd%;?-tp^j&eH*>|Q`EI0p%0*g%@A(7GI%N_KHXz_=Rs?#Zw$sOlU zktKUOeuOs(59;bHBZW(KyE{Gzr|V|7aD|g~Q}nlmb95`pjKb}@w4#|plJ1dwyzp*C ztK?p0N@bk@n)$k_i6ap;=~pwt#EP056p;j47e|~S9aAsC-jWtH2vFyw?;DrFA7+I% zUV?7S%4_-uRF!q1$pMIyO={khc0hKrS((|{6WSs#tHFZ%8L%~v zfKhp~YEPuc<%QO^rfTxob>mV7=9%jfljwQZ>#7nLZ@Ya3Q_&dmZDdtG_f2Ftyyj5Ma@K2hQu*W`Xv7F8w4 zM=O2m@A3u8@5&MKJw@AdFUjFWI%%l9vzRUf=WSF$Glu0kO0rnf6)5!*nmT`n#zJQ2 zU(`+}WEO1DUcl-LMCB6npn?m!`3PF!I9(QOOW~1846#%;McIBG1 zZsmwdY3c#x>dLFhua&2&#wS%O300>O;mZ6fO+viVQuR6>puAi?Ee@r8U%lrnuV{QV zBGy!(%;VXm{TgG>EGW)PHM0uZ^R&&Jf{S@i^*0JWC{}9ag<}-ZVte62g+@_WxLfgW z_QXO!{$}y4LPxVa16(-Y*KDvt}jX|>ZXk@{!0~3UQ|pf*-i*6zF0a4TdP`B zT8&<#idO%Pc&5r#m%uKn&S}O%9;!ZSz~DtCb2Kg>yCke^O8T!7d>J6Ewj{f(HZ`fF zvFvTi;*u-c^~p0z2WYWLOG>9`8xq%*F4I0p*k5{}d}=(p_>-)|kyHFlR^*Ts|0k=n zB&+6T4{lYc4riy;O;EwJ{kpfRyqra)n^Y}1*uurC?wr=#M%DA&K~j6ksNBfR{UxX6 zBYC?@+VcjpOG`r(F$_rQqx>sWhB~R>6Um_V7G5XJ(o9hHpHyfL7Y#=zY3M~9WQeAr z=m-3a=1TEVXtCy3aVhv)+25)GAXM3LRSa-`8B8Tlzg{L$T})G#=}YFPW|wuBz*CfE zFG^~X_1eKD7n1DS*`)&$-)aVm*E=&b!^Ly^b+mYcZM|lbSk=zaq)H|=%-1L+xmA-i z9_c6zUh_&yEMk<6mtIuNC|jL1J$qBx-mEaOsSKKB7U;|BWr-OBwDYq$EUUIY=O(?g zd|vJk>Y(xr`3Dlb{AJ#4!cg5bMGV%VJFMtJSM_`NTaZRwaehAhr_P@L1{SS*UT^?% zxng`l8JJ(Otl%kVXT_nyWxzodz(Qz0e^yjjpFXIfvhY{h_zHt^b?W?zUS(2BczJ;T z)&(i=+G#xJ^9Axu9^Cl&tCQgqHtj;cWSI`enI;fl#3 zU@o>|hp0PiR7IqCeCGFx46%ZLw4zD!2j^bpROwvi%}RMzJbhNx02!1btxC*JCM~MU z%f5$yUS-cYjlEFyCdZGyUp+Nr&JSlqm6%I5 zJ*cvBe>b;Pea?Rw(2BrDqC1u%GDfi-t32)r5-|)ADNCC95gxYhFk^#Ba5er7Q6dYWGP?upeuI zS$|;m)bg`pP^#LxtUBcM+H?JkiSF9hvNV{W?hly;dZKQz><;8$-Tv&A;A3@3*)&jM z9WmPoB-BZ=9|0MnAed42jMu>ZP(P7B zn?14~DOkiH)n68FrcG~{A$&o8)37fyfq1!R>7@_0K}78m^0;qo+3f z7Vky&G|m+(5R%3X;v4Yr#^aJ%u!D_INdh#iQ6$koQX9)8FTvEt7U^tIb-kae^<1p) zrWSiH)w`)VZd?5`+AxcyVG1p)&C+m$zNY?X1C4&WO5f1T$SnKV@SM3t)zvtMd9!eO z<7pOEezB3qo-BLPXkwR3jx^rpOclOt8p|o-U1-|C9m9Fvl*pyB_B0tXnDiUXgLucN zZOzMg4dk-saQ-4G29e3x+W;C%2`XQ6T-%a+&$J zsJe9+vq>QD_x6`(w6?~uia8@&`RuVwN$UmnJ36%W6DNuq-8O^cBtzTwaQ6^xZ82OW zVOAS~`wFLQQ)GluuC!0#^}wIDujS8y4{kre zKLp#@x)UGcThh7NmhB>d!LJ#%hiQ$unBGLlC9LKJIq-`F0P6?+doOF$AB#y&044gSVf< zTz4#O|BgkNVhu}i6PkU7I9z9~+K`QBR*p4z32Vy+8NL&4sldk7L~-F}V;X5sUV^cJ zbTj*$v6IY|3XI< z6DU^mA^LgpVsjE>1yN__FnIm_c|GGUezCcSxdQv${E&&oyy+OoG@}3On8^H&9^J8+ zwGp+jV+RY1j4^&e{pF7|enyS(pEf@0XV$GVjYh$oV@=!8gUyj9U_XlKqNx}YQD-up z#}2JpZyt(m)vhsb!zGoJn&J3yO02mYZ&0Ys7YX6HlRAbFo@e!StRrH?u8u_FFX77$ z35m}?*|}4#%9ZuAn!e!PX=64=8QNAb6YqYQI+bub4l= zrT)H-$?#v!XB`I+xg9$@@W?H#fsO{`i+XFvQ&eg7KFd6GczK8=1~aJCZINS|iqsZA zHYvZ)@(%k`e#kl#mnZveJ%C>-`DlgW+eNdi3c_Il+iD6QuBIQXA!WmYNN z*HCJ8A(;9V)=$Vyx~;aQ$mi--TRf_ySZ))c_Y`<+X7shZeYPhUQqBPTBi78n;@gu;<}g`Sa}_{8sJ{`%8Qa`>SI(VHRtwV>yA%069()Uem5Q(us$tXB=!| z9%ZaUO?*VU;;@i*6002NNMu5(<1R^uuW-C4UBnrj!^uOi7oBs+A=pti2e>}aWix}d zfq<n3%Oi#)tL&-sCe(pfh{Q`Io+_Hl4R!__*rG4Yc~8x{#;iGf|vWiMMBP% zJ$98K%cPTCov6d24A(Q1T{zx77JZQS+`Sonk^91Z60?>w)Q!eyS&42rb{6BDy9rCD zN4vYQ-L!G;d$_rji|(&D9J$;x5oaf9J@awTh?kJ_9TZ z<~yGN<^&ba+kg?lZ09!s#G`X90S>h-bj1Q243}M5AZXKjmm9pIw!rlPe5caro(mCb z54c02Yf4wS(a^3UfLjHF<-c(|VZY=}?l*8%cDrXBVxjbrXBVPFe8v-p+%A0LVI!OP zE>AUTPlns$LFqVmJ&(~t*}J^M(R5~=cMN zd+gXvB$2lSn?zK3>#=17gV%?Bh=1pfOe+h1cArQq4t{X&O%n%SxzD7%@h)()(q*9#y^d zwg9us1>Sq0t!kQYH0XS>!?y=aFO2Y|Lq;j)_>_>Q+*LjsbfYZQ_XgS{x#gb*<6hF}~g9kHs{(8i6&I5lJg2O)Te}=fjyyyRhoX=1MMj+Ga(SaFAJ#ATF zU4Is{B(M*)kFq`xfbnfZpl z)C~lHcthQ}fNz|!ZX*!N+UgzzUS|m1Z$W!#zdaK`WmJJ@Dd;ujgl7kM4|$>|7)&ER z@B~~cg!>*OWGeox2M;-f`{7|gV7O_Xe25Br+BH7@vG<*8T>Sk&4v!!3zH-e^*zCl+ zjwd)fX1O4V@usJ)!ldE4g)UoCUHv`R+vJFvY3{ix!z*>}!zmRNwQfM_;gYZJg4EYV z0=GF0CyjBxN?()<^h``wiK{$2Gxi1c&*L-t_*M@!^ANAhqsr{&RC#=WU{=590U(FD z-t!;eE4|n|6L^KT*1Hi{MS0;p1bj`d^Iin)BT>9iP&Sd_6@cy&3cZEkiTE0CHTWdX z>9v44xIf&B;tam+?s;)~UyyrBT%B*Tdv*Mu&VKjV_^J-Ln~-p}HP~I9@KeWk-$<-) zxaj#K=~9izvmyD9s_mYO$tChF9#YEwQi?~Na!)qL(~}C9zV>`io0$94yD+UJXSX*v zeYsHYg{609U-F7FHfQbhHfLzK2fWuZm$NgyFEW8lhi^!xjj`P~53q*j@a+JQsZ8H7 zKqKX(FB0&RJl_WobgV7%34s;FAYU=iM+o*+1ApQZeHPFGT#08?XJPp@2msqn{6e5xe~* z05#!>UkUKzfB5yl3HTrg-DWWup^NOZ8!Mm`J3#e3U|juJ`UHN)QIp?|sB!XyeAGr4 zh4U8O;U>`6VE1@3NHcJ3?_XFJUhNx(j3cmpN+^N2&%XtDk9fnc&0vxuyO*RUlDfLt zNnrBU?laz%8s75QC_~!(cWL`hPfPpz6bdKoI8b!k*Tf~90clZsnw=Y7;YeY3+*R6t)y=z3~tALZ<4>h->+ zGq0#W`fi83rOoXha{7O?J^d?AkD(>^pFXt@a>k}KltZ94d()=C%wa(3TQEU5N zobpqz_fI-C1SaX6X!s5*>iFKwfZ03utApT6JA2CfaBY`bdKR(Cc1egs?y%3|Fi&zkU!IZlG!||1|oB!4x<-(_Fsb0UwMER|Hqi@(OoEF9P&Iqe}R$YT@*HrA@W9rj$qil z!gEs@FTC|<7c$;@-r zQui`XPyWzyOVC8Y>gzdB>TbhT`Y76B(*aTleQv7*w}>&_yc!k7xNX6}t~2TF;a~x4 zxHSlXW`V7i^lVm7$H|mi?8P1aq;qUg=c7AcG079 zIP$LE$gv#1ZT_Vu&R5%+@C@#18}Z^cZmg~L!aAW?18CVi+ z8f!Z{q_LU`;H+)lLfp=srE9=KxX<+qkY9Kb!&;arK=>De)mc1aC%~C?-*h=+GJm`2 zWh$RfZatQKly7P^B`)XxuWd>Ey6p9BNwJXZgtnR(UpC)7Py}qS>S53;A+-ewT2td2i6D}#O(E&pOpRCKk7&Xkl<>= zFzgT^LAx925KV0ihINVPO_RV+MSnMGf!oAE&BrtJVra82EmN%4%}Y5g{zpeh3eTCX zb0-w#9BP>t_bvz00*Fn{scJD^nU&Ms^5$}1&P)BKXrW}H9v(%OY}YqNawPHk*Ac}M ziec=fCP}{GQ21TZdimt`VWN2z2Fpj$l!^+yTQsvmRi7zZT+v#E5(QN}E&VRKC|@o8 zPn0cJh#jKW3K0K{I93_X28-`jo}f?65m$AQcStT*pTN6vC#ba;X|As3DN>QQMB{^b z@<_En$ilq7x+%c2{Bd>6%uD&l>K>=>%_r8MPCcBju2(0s@~_u_N_;3C+psqwTDq+v zKYon#Qp4>)e-2JNEzqAM*M`JkrG72zGDG@Gdo?k+AJSJ0u;a%Wc-Q3amqeSSfQly5t3i{qACaWsA#up4Vd>-GDFRbgdEx5H6ig4vd=ZS zaYu`1*4&CcUA#{-_eyN>70sy_Off+NzN{{MDedbx7|8OD-GwitRc#v!e@U-4?;!I1XS0eLN`qHMHc0-(NZs{)_# zr7Tk6Nk3OcSI$WFlr;ndZ1}RPN^A0tvbV|~iQmd6Rqjl9RlcJV9{<1cOO>thqsn2G zzvAYXv#Zv}o+{lYnbx_tbVts=ox211#WJ+?f@Dw2zEY%wQ`cIWEBU)hT58N)SN5>< zdM>K)TIt7JOKwuxq`WagMA?qKMBeu@ZvH0L@3QC8Y4q6gw1T~qMHNE})x<3orLs9V zYQ-MTkrd(JO1m7k%mlQ&0%3qd_0xwZ4D1`vwiX)|_%x*<$+0=}~3PD*$ z+DC=C%#x~C+$#H+LQs4x-<_PHoKj9nf+~Z`yAtWj=!&5UawVc-Rs4Ybn4qC+i#%8$ z?%EW%E@-r3VGVYM(e5$6)=#Ls?36a z;7L_Qg(so#Do3FOY^{1xGzBzQ^=DBmAXgPs)SP)t6(yUTF+zowoloqJR?JRXQ29Szrfq!XH(sc1T;&&DRL8lh`8O zY?ii0S*79cR4%Hz%h#74RE^ADUhqz}CYzo+M|CFP%5GAn2^M52Rk;EQ`(M?da2rEf zy;-!D%CD{yCzE>AGjh@i2h|YCDeP6XH+KPAtNu5ajm)o^pZgK6s5z5&8TzFLnWu+b zs>#cr0P3kR=O+NEHBa)J1OC}R@_%KH*UXY0O#iOgCZ(ni)tr}hq)pSnq@PkZYUl+U zQexBu7Q*&OO=iW}9;&gdgw7}GGFERZLhWatX+Ej`&AwHeQ4_=gSAMHW=l)T?uBMpF zD|%hy=S|FCRr8()7yC6cc-OOinyp!jdDAsXSsIo>!{iU6XK5Z}523Wzh6v`8w$(NW zr{VkS{t&*$YU(zL0?wYgNRbz*s-ubb!oSqjhzns+b$;<<$Y9;;oP%IS{iK{C(6Rch zIWK_I>d#6R0!G%SOOi7u)KetNjCu8e)5YmQ_4?ddX_>VaTD@IW+eIr2q=i;)TUz@M zeMZ}}y4my+-SxUNjG+3dbsWYmm9EalBv*W``^j2R?5W?zG89a!Ph}sLIP3G+ox=Wl zEoUZwX?+hTiDRjM&2chw8^&=L(3A}cylDadY**HNqE@?@KOUd2J;yJ?vb3n|A?Q4< zB0CxRLhH=#N1WC^5iEi^8b=F2P;BE`feo^!@sw~ecuZrw@G|gQBTgs;4r$C0S^$$8 ztAxKZS2lKt{>q4M=q1l{BsN?nPYk4wJlcMw;Uk%7IjLPj8KXa?Jx{4@5NJ8nQ1u~g z2la)&V^vpnsd3g(B@`4?;vV*^L<_pLZSPE_W~ZS zTamRNHdl8#D;x4g7n{`$zM}*2M}Y3>DExiES2_tF2^^}c=QjX$Hr3%@J7)y)k#l-e zIsT?2vdKvZZ6`H-B-}UTHZLRMwXd5mla|%gHRqCgD#tea$>_3ox?z<0vJl-aibXm} z2cVvitkKD+eZm}_opy}BPxqFl=PqxVMPJD}+;V^}rWdtj(Ep>(YiVUXCH-#s!Bi9f z&@W_-#ZS>6Vv(_l`c&3Ov`Bpa&!=e zVGidLSZvt9-3qEUoZ^Ck4_p4iJax9T9K+lW{U_=7De*yDly`F!jRqrb(E!!!ly zN8^{*j?o{*U#mjssRUX@ir!3ITkO}rC3*{T4RcBHxmrUo>5F)t0YPSF`wTM57@po> zqwv_*4X>#qncIxxsTf+baVPaTg<{0fI!H{Tl)jvhZ|tDcaj%V!>EEyyjlUTe&;zCg zj1m;vw4d<`dCGK=c@Qzf1Yy$P6HGLw1~%1H$h-z!W~yOLgX}TcSQo%hLn~^G>s%m* zxy~ADk>8yU4Sp1)Lv8qq9%XuDT!XG@4mDm0v`B3-=3=L)DvW-tU0!4wf=dhR&j;bB z6b_n_@anuTrb5DBIY5(xa9g<8^n(cC&uU#k{LbCqdWFPiRkbq6V;SpP8_68%uhwV( zKgDPpLIIE_wk@ah5E9!$sGD$oZ5dQCHnfdFy@wgzR!&=ha*xfRc-nO|Ix{9U5gO54z@-k zx9K8UMaT#B2U}ezQFVLkcXW`#(zYIbvutBqJccM6-X_LQkgjjDW9uYUZU5qSiQ>#F zaRb>=<}iF1k7{P(pRr$=wS)*J+I*XEgMPv?nix$zW(l-@l4C5vq|HRF1wc{|=2-;f zQ8>9pNj`_YU}+_nVWwKHlHZ~pT0T*BA@8@32%Not+CGg^1OM2*l=2ilu6;LkF6@wb z2sGRsZypK_bH}%RgC2CpnCC+qyTIm?u)}Q*GamM|<)XO(E^0VsevAlG_gQ8j29-A~ zCy;Pt-ZF^3klSndj(#X+wXeg_1+?~a*pXT4b`n;`ozgDHEo2q9 zdvOv5r2Sv~0$QeZ3Z6@$TZ8b=Nq4N52$zY+t!P3AzT3(te8o|$a^imMA*+!n!c4T@ zAl^lfv%VosM9r}NB<(@2=onAJA@+4FBkAEt%RBH4_pLxq3FHIt2=}1nCm3xD3K0Hj z=DhZ3h*iI?oeza**S1?=b81ZOZ(+7dmvu25SaHM}hL~Ei%t}Et7KU3Jk)e4vtk;nb za>N~DP{kzak!*T2|f(Ft+N4Nf!WmQ#NR{j?YvGHjym1>g0K#m+WCtB zK$KXO!2O<+RylBw=Y&-PT(ohI|6x{>3AQ;H3Te1)9j1?9ux>N_uG z_S$`;y& zLX)J`whhpixgc9Sj3-9gSn$aLrA-Uh@Tb~tA@*{sZNCsLY>Isuaxar&KZ$In%k7D% zan!GNA__=Jvdd82q_=iGdLFUb?nS2&GVFKJP57Pm|DnI&f*g}E2eHQ-voUZ?m}3b> ziB59_Vg5#yblpwA=bhj6ApN#?LD#i(k9T(0`-~Ni#kQFlwe4lLqnXEy=WU?OS4{w0 z0U)<-lFb3!U%lD(5%^MJwa*7J%2f7X@M_sJI|}S8fY@b_D|tb7FXU&=Ui*6}PY7|$ zh0WkUa2$ix^RSL|_*_nygAbRn!W<2VDGap3jfkT4I36O5)Lo8W$T?)2a~={vqBu7p ztB8l4hmoHNQ=GA=L-;99B8rb&?i8R**j-K;>Jui^*@)hZ=GqUWo%5pXd(+Mba&y{A zFVuc4P2ni81Jk!#7u$={ZyE2{-5Jd0q4uwtTkDz}%QJ6P-*lV@P?SIi0l1(%+Mxor z7neG&fg%gnIeviN=Y4jr1=DhV1@`l2incikkfLmrvkJO3>#)-em2>AiU%*DP=ex$j zD9pcH%V6DfnQK3M4sDDp5>5;>4&dN7$md;Ih;gJDt}?_a!ZVi_=1xRC}l#W+W# zPj2QqgVNjT4>?mZ($p}gG;@08c&8&%Uoq7A1rS|w+O-PstMI<-JTN!E-bDeel$c!A zAie0Ls~@~akmmXccJN08c>X5t1NRbxlZ}Wcu5+Csn8W)0L5Sx!&)RrH`r^?((JAR?1!9 zG6L={_u7otB`@7knOQ{?HwUmtdckc3m~#`|Pk?|9Uuf>@3{ne!OQhP z!C@SUM+i2vT0JVr0_IGQ83Lu#JXawO+62#g=n_h|cL)?f7I`N^Ye;e4Wzd(zE8ab@ z?F6tl493N?y^*kHT!}Xg_85EB^(Kkq%XB?Sg85QigGpz7v94!HMb3xriODNF$nHJK zj@EPTloY5=;1;LOYY209qG1s&$^3>67HEJ;&19OK~1(MzritPjSXK=@XAD zGdK66=QChyPLOvtpi!vt?g#G54)(?ZE3?*k380zWwcZjCkA2Z=0lj7#y@TLj#!Byd za3xLWn+O>~#rT#$PEii{HbA)K3BJP+A8DK~3Oa!}KR{Ze2s?auC?9{$$AMaK4A00! zuutdyo*3h6aKA`A;8VH3C1$(!corlr?6~VWo@8xp@*t8kb>BT@DbpJ49)C)QW`yT! zYC@ITyCiM6yv7@r)>!)6i%&l$%lE3%Ulc&R{TcW?iuXt6%$zRY+)TP?m+v58T=sQe z0)Ud$>LURjbK89-z)S3Zd{&^972+ENjc1sBZ$TOKQ~rq{H*KPS6?g{awtp8mid^dt z1uIE)egODAvCGef>?1tz=Rptwey)Hh@LN6K6C!>8dOjwc^1bssP1xpp;rW)pb8);& z6PI;v_nt}gv`zQolVB|=-m2s|+92;ha;FC8{h5-aTIO4oI#RLP7m?anM)gtBjug-J z)uufw_~N^o4$2?p`!D^sHYOy>vtahaXG5Ptz+GY8{01LUmx z{$9XS=2`!9;6D1D?vX$lt-O0F@Dml%y$Q60a;Q5P1SB8sP5>E6;oSuAXdVtoGNYvXARn95p2as~7rC=56p(|T-A9L1?=Iz8fJV}gn z{5tOm@@WFnHxJiJ%<;lYkMO>f{| z9Afo3M7ra1`5NRJCsXVsBmDLiqIMB~ z`h#Jaq&xm+pjTu{cUoovWp4N5G!8}Fb0)crI;5vD;XM`DJ2ehMwe%)kSw@@Q+j4mV zEv0W*)J&SJ?_k75+CU#Myp}$(&vbDyJ*4mB`9V6We`y$-F7H1ddWt^SPdm4tF{WR8 z_B3Nh|LrrejEnuhL%&qGqY(2PedT))1ufnpiw zW6?^K)K$+tg?{H2(i5;T9t`O?&f~p;^$_OxwjnzLQ>k~b;iTpMT#$ftt9xN)aNsV= z()Lq^^-N5T349lbggVNzo*QwSsoQ&3$2_CbdePAyYIkpEWIt_e-yadvXovd_gac@l zKEj2Ew9Y>Lc`5C6-}A5#`mFw$p_Az+`;VU+MyK?n&Q7K`^~=w!qIdT@LUzzU^#5}@ z6;akDHU1CL(nZrr5O=$JYc3<#+5qL>k!t(d0upMR{ky0X^}|uYEkplys_883U#>b* zD30OwVO#Mc?-V4LVDP?%4id9{S3&0jw4a|joIK1QFd~o@-4~J%QnqwU6BLx5?w+_q z)Tuq2W8PDb_XHH{)bgI*$ZJ$j@5YGn)ZX5z@T1gEz5iXPr5)&7cRr2A>pK*-mDbyL zA#^0|eP7<$cl0rRkI%fKZ|GkV@|Av~|4hheI;lVA^kLi?bCl@~?zDNK{ub_vc~|XQ zT%K8|u;6}MmdGOUGRp^vp0J?3j4vkKw&tdJ?z9mw^C@P#4so7} zbKHQ~Y1^EQKnAVGMaW2?FLEzUCDCc_k|Yn^?%9^Gg)z;O9s7a-^tfWKG1%VY(VdK5 zFF$G`bD>uofnp|lABKNm5`D)mikK2#>4m*am#^#mNY)77Ls_@{pfe0gc+0)EiIkHqfp<1aa0|Pki4xz^P*qPU)=w#orjFCs<+oBR3}Rs` zZMiX&i>2K#MKVUywXIF$U`DZdF@7qOYaydgu+Fu2!tLy_Rv(1N=693;5uAyg;TbYc zX6Lok=Nv;-i*+)d@@>bf9M2+K}wHHJ* z^9c3_mq5HK$Jp>7-VMk0i>tH7JK`_w%v#~7Ie#eYu;WG8#jGUf#83t+zJX>AW}R$U z*jC9p&@ieA$qH_mtX8qo8je>$Sk(=+g;&|rw7{He?9#??zJ@ciX%TxR$Jcz07R@cy z8AywGB>i06`K(h03hEYrys;6k=8H_lkb>-atuUZBJH7Q==AYSyHbNRpFuLtU$}zzn zb8ylk0nA*PuvE}!84?E(Jhkk-;t`Is@MCrecUf*nKNSMoS41g=()M$a0HL{^84)GC z+3vn{S@_*LIy}I}tw%00MTf1)7xer^>MRS5KT5sWl9u&NJ*;I?)_>|@wIu#n^QzHcGt!*!v(0i8tMe$)`oG!ZKAPSHr6S!H9kg3 z#gR?V;JM<5&3zD8&Nf{-XnGD;_bM|d=V}Wi{k&vUi!XJP;EtoYjAD9%(!+sni;3Y-Bej#CgC76(2NsWywLiuN+IxK=rcBP&X>$$_siM zpT(vZd}^9?C8}^i)5)0R!re`R%h19LO`d3GA*AVBlrEoE>aY&xqe_uhXMSdBjLDdf zEDfxWgZO%)S{#jNpd?p2!ld{H2Z&#$VY75TDqiDK< ze-&2p_CiJFO2W9JomENL$wgij7ZoPkR2>O#4lK33hi;a6)D+MU*$?$=z`f#iHD@xO z7AMx!rf)6I(F_gr=d@_TQid1b*Hk1mmQ2vRPK1~2s@;@uuq3P&8o#ClQri%>u_U|p zaqRw*`nt(iE|pxZI}npCn^M@*aa%UNP~0&f8(GM0bI9fvHaGXnHWfau-5@(zG*kIX zmRxkPbdii&R8TNNrYL%v!<7xlPG%PtuPFHfqB$TXLWDvcTQ%MF#k z(sIflRUJ<~QZcfsG-XJ|`l=5}{)$tom5FT?0M*5W&I+cA9p6(SQ`zDkRTx#j+5tIS>cv&#_6~JWmx%T&`u?zybVyIlvj+;oTPMC#H6$`Hwz9EuVmi5E;&=1Mwv!<093 z(^%1!>+|-~M^!5GqbOsl)=JBWAyw*v+c>XkY+(&1R&};02DMJbFM5Mms4~fp!q%xC z$+Qr3^`zq2pxf2kij#mBs-ueQ0mG~DB_lFAt4m8RrDs>SmGILj)z?aNsr2d>C9hKi z>LH~ol9lRtrEy6&R1^48Te)fqpJFQuB&XwvYA64t37|^Oj&9nZl4K8R{!%#v7nSX* zPXb@*!|FN0O@-p>-9mbb6kV)N6@K9#tQLvVIKpbL=nHd`dX@MkZKb+gGMk)Q zGb{Hf;c*QxZxIezW6yhqIj0$upN~4J*^vJgaX}L$jf5#QEU5)LTB9nM38re?1xcVy zn%4z&fcLfI3qEDG)h;jGouR4SRhW@pS9`8dn$}jES!hoktfdtVO&wW7;*{BeH8f6k zAjuqYS7uEm=V$BpngK4R`MPEV_gC!?%`P6limw4?%?QZlO0%RghQ`Gok#E&J;h)cm zuN}@;3NF_!dFOD5`-HaE3bTeMss_Nb|qs*ZCh0HrGiS?l@ zKz&6$n?0iXXni}oRL-e?$5~wx(J-G=Sy0w+f;&6+Tmyv55M64>=HBAhHdOKEa}PHR z@>Hx94Ig-)=|S3~Sw1> zd(mMyqG`N{3|rc?T4aShXgVyO0Iq3D5J!S4n$Thfu(C-Yt^>3*m5ZNcdYcS6%QAjy z`=}X?H`?peSjSs!KQ-3gul-IPu=F*qrp4>8H^$I@X%{u-(5uwf8a<5T$`y@28TZQm zXxhR=6ooe>vWDhQY7($0Ig6V*Sic19rW@?jS<9M!u`4+vo2RqCGG{dJ<6NKtnt9w^ zl%dT}d8>)fb%(OX;lJttSrXhtojB_wCRW$R4@J3k_xW1n3EgM@2l(ffN!goWO)VR< z!B9%eiEIl5)e@Ec1B`7+7i<7ATJVBcU{Oo1Kn&<@E+*}C7BrWVHaiOggnymmVRIWv z(f+OZ1$nb^rfxpDw-KegKmluZ=s46dmASfhs-m2r`@^T`e0CS8;}(SBlkNZ#xTG;3SVvb$m7A58Yl9c&<)0Uyx)*r#x+?% z;1J`XtPBuUe;9w(bx?l{e=LxD@q3(heImZTV~Jiw*kd}UcMz^Nne|_Zz*>P}18G#% zS3?p>Uh$8iki5U-jKM>`UO3(GKMF8!n{gR+h`7RdhRPI#8WGf=S$mBIGz2Hw*g<>F zG#Ve!!|1zAW9UZe2vaCSMxJ02G9!rFOifHRo^9%7jmEw*y=SFiK&=y4YV?xUm8{3e zhpl_rTM(MoNHzhkY{jt6u%^~5_I+qqtBf-P@^@<^CloT?*nok#28~(_+;z=ZiGjEP zMi=Iv&Q-?GSW;`UX*q6Y^G(wwTx*@t#KXr|uQPQJMk$t?z7Xn4C9Nxor-~9=!-@DCGeTc43d{OY#Rl(Ae-+YSnwy}m7)@*hLjMxiFrC~Y-?mt}0*3tApY zZXQW{LilK2Mc;zIY(7R8VDFg|>9;WwGoCRWeZid1IEz|hZe&Q2^UPkxOT>|7 zR`XNl3D^nqe@qgT*gA+B>5gu_h8iA75Av&fOY0jHuxn`B4Aj4EXWNdU`MT?E7|fb_ zYg;YGr{3T85DQfvGS9@#Dl?daagDMpGYNk}YBD$BpXY8jKO`VUA1t$o)b>InnP;nwTK zW3>OQ--$-*td6;)5oA!uHc~Qiup^ArNr>z~k!Rp%ba2TR0{inNfhmT(!$f|DF6sE2 zvJO?>@t%^5w0HcZ6eDhRPNobX{%n5;&GlRfWKkdoplnY>`zz>co5nf`hPI5i?uAd$ zE3D~oy;fn(N5p8hTHVN@RY$B}k;;nBj%BF7N=iGBeW#)^$F^KcLXNh7s10-gGS_ zWD#LqhX~II8@nQj^Kt)n0g0Ef)-D#Y64TnHAihTXy4p!=P>;KMNT-lLx*n0}$SoZ_ zu+ih{V1pYy&JHwK>S^x~gTL61ceFwn7GuXt=u$&$=Uk|(5zu)C2B{s@NrTT)E$(cA zTji?Gr--=H?5-JzUq$Y&qezJ~qzj5#l{>ks45b%O?((C91;@I+pxs$bw#AsE++()G zm?ri-TQYVkbEb`rCD3=+RM@|%B3l=3DfzqY9u7sK*}ma!6ZhE19fZXPN1LJGYD|h4?B@iirU<@9QfY5p=%NFfp=}!WT4HvtZNNuzWr&} z1(2#eu8RsjVw}{a1OL;sy6YK)U+cHcg>F;5v7LqvDzG*Z3|f|GYl2UaRoNcHYYH~n zXCU_HezzY%{4M@vha+La?e=`+H-5R@f+FyO?DtXcITP&P(2=YWj@jr=#&XAY%nBOC zaT0^4Ja;5wddNTr6}ybI#*vFf5#Bfy*cQCe(Te?qYjzCcwqtFM7dSTNrsEUNjQ-#p zfqR8sZfgYW^NMY?fYn}strRfM%eLtOu?~jq0pOW+w0%5~VQjVU25oA(ZBGN;s-xTU z!OZGvyA85N8DxJC@suxhEP`T-Qyr&ae-^xR;9w1TZ4M>;NKS{NAAVQ(pW`#)Y<8-1 zHsUJpyYnFODCckIWn=?u&`ClqWPEWdP&9g^vlVrd+T|QXZ=;-Y{tul+9`BllzC*n3 zT8vphsBmq^#NdlvXEDXNT30&eF4o~fVdr7)yBOG0n5m9=8C~9Yj;R?s?<>b288Yu< z$Fz)(&OaQxGpSatBMGq3bkrdRc$%S(4j`<4iQ_G3mim-)F36y~?>r8UDere;AtOuX zIF*pR!YXG!bWc9o`2*T6AqLofs7UWR0qYd3Z~@?lvdk_C+{7(*H6o_5i(GvO2GipD zf_TqZ;{Fr4jh5|Rg%nX|xPy`ZkgvPbQF}=WHx30S!rdZND*@`(poie8ZV&nxuGIYy zO~zW?pU^tY|C|@nFZ=d6&!mU?b~_KH@AYkSMx^IE!A@$%>W&f4h77;S@4TOh)D3Y> z1k9;#b?pVTt6#d(fpL{|S3c;E3WCc8l9#w$|AKcGMYtD(uSwUsk3r7mZgztqe~W=` z3G|HMzS{`xs^Qn!`8cKX(N3c7b*3tkLiM> zKJZaothDXUn=Wmds{`e_m!8&o)IBLAUJyrZoEc+|rbMpVwWN@{jAd`$j6Z_rnvPj%=`bL>Y@Ue|W4Jo~laE+f10e%DWJ-u=JbvI6x~CcwxX}1<771us09l zwSq3^GX1jXe01XGgv{*kbIB#wU`d@ixjzZsrDX!0L{SK|l#q42BtQJ(f>rGKuc zC0Xj9>8VPl`X_r@ldrpqJr7bcI}drsrH*Zz?cJ4X2=Mc?v?T2|Z+`kj4a)0C*QpkI zKV`%zR`?cX{8xtY9nWMI|LKDO<`+Ekd z@`r$@@(%hlz+_IEUjTl|>hsq@PBV}Bt&k#mum2|GB~9r62;EJM=^g{+Qnq%_fjY<= zyEnjwk`8nqg6$$kbceza1XOndtQueMwIe(c6}E%k|3pC>hjQ z;2WPZz76Bsozl|c^QEQ6Y0G^1X`?jHefG3^Ri5vCdZ?nrKRf+l*}win8Ia;^e|pC6 z!c@N?laY_{>i`oZCjT9PSiIZ+12|l8BS7^T{Lb#bfUkMp?pV-y&c|*lsGS|%T>)Oq z9PBoLA&mI$YhV|BS@%cCBI>7}$q*Q&zh^n5h1}P(3-W>Vpyw!bIq`GPMQ9XpYEKF@ zpAdpfagH+GKz?#YH@`()a@N)$P_JAID`;r1tF15<^TLhKnTp%u3Cp@1ptW0>6v7+d zWJ)4wo9{8cpB&~dN7qu$b%($oP^Wj_gM?CDJ;}f^w8);@=^ts&dP7p@(ogkjk`n3F zeIw#;(tq?t#EKYy^_9nf7`(n0(J;n9|N2M^b7X&7#AN2a{)%uK6Wf3D;x=aUz@+n^ zn0E&DhqbWA4rGQZSvv>v&egHf2RhGovGN99p1H>|T%B-cJo2RDKa&rsa0clnqK-Hf zHB3~UYiI=+9pPdXuELylZxy#-@$TQe*SLPq9p-q#Rz>%@#!S1KMoy6?(d!s z&!yCKH$Wy+K|T8c*J#6g^Z~C(LGQYhceF3P?4%%ic<-b5TDrDxM{GL%Qy(Sf7-Mgr zJNhJp(?2n?kkQ_M;?g_Dzx~wkIOfKF)5Xb5VE>2ngG|Z5!mvDM$H1vjI`jPi`dl_^ z@qqlSf^}h_=ZuYo9{3RQ5joHC#AHAoc8<{DkyXyf8UZTY`F8~t<#Qb^9FER%1^Nsz zx$Zn38GF@}&d9=V@t!1S5ORF0anFgjecw=b$fNvi@O9)*-Lc>ninseSfJsg7fu*CV z-+P{=$Z5&F!HMr^&R#`)8huso_t>@c^uEI}Bk8q$+~_g%Z+*Ry5sWSU<1c9$Y5m8- zmoOClqzi+L2mLMQrOXNaPs3uEy9XwRo@Qna>^m3EEFQ=>3t;vRBz8`Wh$tVuyHx3|h?qpKXkLM7%8XOP&7F*`r=ny>=*Fa{NO-`!8XNLc0Z z<7`Bb*ND=SB)%&6P;!jF5R4-K>@EVVpvZfsrq87Ud%{xEsMmX}i7mAAJ>TOG&<1;V z#Ll4o>@B*BM$|jHy6?}(VEXO8=u5@)?|n7lLl~R;{<+Y=;PwwYPh(u`pB)y% zc;6op`WJIZfAzVY%qjg}&hBO|7&vt15cAkTd-!t$uqP8e>fF&GKcES|c%gwyQ{ zl}3WLy{R~Yc*07|)f3w~R%8oEiJgD4FOc_jt)RZ6Y_x%h+o|*HR?K(WO2@%qBf_4r#ofZtuk68YS?Daz zxbDVtdpN^;CZ9b|y=OqS4N&_HOIn9h2MjBJa(@s$} zy~6a0m&`cb`k3)AbGCUYWgYXA1&M#ldfe{9EN9nt3_&P3h|aN4IOlig-=G98zAGz} z$^FN+DD5t9v#l^Cgh#bcN*c%W*;C>_@V?u-V&7zKbu7HHH4E$rJSwtOj*93pSzgEc z$oj00&OH%n{KZbnrLFukPF46)KGEsExREb$e!mdJuXb%ce}wOHWrV@mw#ND9|JZd} zllc<6MqAswgKgB>YEbOEjl<+8IP)6;MOqH4X}P4CJE3_(b{3b~?B=vZ{^+B zuO+?CvKT1%1$?6M8oDGqxOEr;k=@t&6`CTr)Yb};2&`sc<{RNe^Rx6MVTvUpb+u4s zu_ga0yw^TEak6MZduDvBD6!ob>ku)lL$7QS)mu+rz9qV66-P_OldSzwsp25(@5qbd z6CGP4LdEeNNtYtTqz-X7P+ZYry;z=|s#)2-GCQ=UqkU9%aE+#=EBj21u5MR$a?QQU z4cR=+vXaW|K8+^7PO!Z;UBnb<>rQ7)6E3cw&RQolHteI`6hX91;&<_;#z#1+_+|4} z^!Xf`E*Nn^GOlG6lqEs7dD4!nc6R(&UAMN-Ebj^yJi59#=ifaaH2Wu{obAZxwPSJE{^T z36cWUitP8fW2;ATr{}_}2N-pEV`@fF?0E)FF!5-9N^K)V0k-BE~WN>45*R5sNoO)m5`eNM0x zzHdGpk13kkOp7~Ew5!<=ySXT``PP-7B8YB$%>E*#?%?HfMG74%nkto*V>(i#!tym8 zky2Lq^w!hTobu&O8>AKGM{0o5z|ktj9O;en#^T)tLo3GS&nh@rArh4r6v{7V*$RFs zR=s)Q`LK^+rc zBJWq{#`Tngq{F*X%YpgVx)RDW^9S3PmeZvZ^=ai5(sT81%dOIU)j;`u>HUgD<=+by z%jQ(fEQrt3RO~5e5jiSS3a9ZeROku^IhW)UiWCgJ94{-Ug5+O{og|1NyL2JGO*yaZ z0``CsUcMUTQ(DTMh=R)D6<1)Q%B>ZB5LsoMd@bmCrC3e_hEy8lk24*WR~3shz?B~r zSJGEk%~D8HKUW1Q9;H01I<1_W{7+S)@_5pxDuNQ0G_EQjIZiyNjLxaHg(zckn6{IF zYo7JC5}$L!ctBYu*`R%hh_{oa#RXIri1nQv`VXs_MxCN@rsAHo+a!yXq^#qk;Y$ zj<8ANt8Nl4s61YMOGGP6ul^~zT{K(0K)gOLSiMV}DY~Z)71#6o)Rdgn++}J*j-F|+ z87*PbbT#-~Ir-n3k9iIvSQD537(XchKvkF*nqLKxsOPmo1y2#bYOfUThM%gX6=p#- zwUvd>AuDQaMH@hawGWF@fuh>qMOA>Py17N~Gehcj%C=>M*M-Pp(i7@ZWQ;Uy9YNNX zs@9Ns4fg+O=)BTEQhCa*hZ=R(gf@!iS{7XwTRS}KdmX2CD<7+xT^q;$P!Uqg&yFvi zRNIu@B|Tm17mUq$UHd|CUhq%d2!SLksBV*R6nn4^AS_^*>jMAi)VK9P;&O6&eOZo@ zIKKXs1crOmuqSsL=6M4(_YQhYLuuX?WLSXYGvG}P&-1RqHfx9FuYf$z&dpB&7ixFp zSAvqXm-3$gqqGR=IzY0PF1?Zo(&kI~88mI3v^~A0-oPH=Fw|REUmeDJ6YINuPW?l6 zhWT~FIQE^EhYh;me>#w1yLEp^#u~+9Ha?nVPWTiI@jX z#o`F`hNd=gBT~?GFJ~-bLi5m^OR%oy`8gsexj883IwZI`OfnC=uNf|h1D$N-HrLsQXrU(4sS6Dpvb|NI|4U? z*YZg?6nfeq3w(OxnH2M}8eN5G?78PAtF|_42BVZ-bPhdC- zR_G5i&*dJ~LzzBNy}ppOGyAgM%o6eb(m!OqV#gYWvX3%!hPCWc+D-$AlR}viVEac% zbB&{T(+MYy>v#fOvGEx1Ddwj!DQg#+Xk=yyQQM3KS=SM7jT-)JxZddIhr{ZO&-i)J zR^vDReTdgIB6||}u4zv80q~!OrNn?P+OUEM4CHKLq$|jZlrMxWta+KJV+^(rx{_?Kns&mPVFwtHTKg|@(jkGw0AknO{?fg!FAJV`s1t) z6Nqt|^S~rw7+HHwTIO_mo9QYulgenF{(l^uWl)<7*LK@Jb$6Fj_fmIP>V@KkQYghG z?(RlH2$nzy5D4ypK-^uh_S8?^-MwGl@6R>&Tt znaURWLlj!+VeCcxRDNRQz&llw7#wS+kxdQi2G83oy)ie(mq162g(El|9Q%Nh-Y zt14Lg0JYr`l-eHFU5skBhjg=0WwyuNHRw@>!fqehzdzso8?#J)QW=1;HLX*|VUuer zl>*!-sYGePNhM>HpYVG`w^YmU*9wQJA_xfrq>4y*le1pcPW00f|G(P1tU%Qt(ph?~ zdOoRzx=y{9Jc{(qPx#{quhmk@D*R0KZHgabs((_)q91BzQsYopG`px>$oZN`>Tmc% z4T!b@)}mq3U{IMxLNh^HHC^-xV5`PX-w(R2xlPXiO;pJd`|MX$?TAhGew7R{-!4LYTZO0QmwtnE0djzXPj-mT`L-qmWNb(?qnmX>au2DjtInHakp*I{sntG_tu}|ZMEioO}e1p}gE43@(`#QI4W8n{4wrcYc zv=dkm91~YZzdD;J@`_hSpVbyrWl6tgh<>a!!kkx=APjg;U~J-kU%_( zx@-UuxyaQ9I?;_-Y^WfOgl{ltNP)291}`Zadf9N7q=w|_8o>&OM^_DQa=3JPV4WnE4UxExYVeoem;U*#BA2`sY zAjHB1CI^8JwHcy;_nkWoQNSC{?S|7pi*utP5wy(QYT$xev`Y=$;NuFH;U)NG>uuv) zNKOOFcpAE)T42ON`=zsujWCF0i18kLQt^J%1b9`U#k32tIgf2hK(z3gCN6RdS8Y-t zn>Z`|Y=1seWgdwtp%WeBzeb=)!o`wSUsS&Q3@NV6Qp;o&SxC{7B~7+(R#Iz`48fWc0o@lMtY zr@;6FaME(dv<&dC)@2IyJHK!yCTM0`u}KTkHXb&81SixanU_OGNWYk)AXSpbW)5^; z$ue^n)KS!Eegr$454VhjUC)JD0^rfSYD+NuUiMTA7!l5@v41z_D+)YDUdXZv^ z(DDH_lJvzo7L`nlw=P0;;GbCcp@-rstdZ!;*feVb1ZqF$jSzb1w5!sVtEf1m)y6`fvgdxTaQ4r1zW9I(4&H#)&i(6 z2Vm91g0ml4AHY0pgl#nZpx-~U9Ns_=u^mKAq=IaT2mra?MnLqD4%qUM3keom3o--m z$6!be?zHU@Y7%yV?F;H8W~O}{ih^EYUxMmJ?Xz!2{Xkx@A3?7}&SrZAw1qX@j)6^Q z%(e?*1ln%97WSA@YJUJfOrC204lg7YJ7&UP5H2{jB6i}JIf4*$>~F_qgc0-A0Ym)2 z40SM&E6}qYCCG5p4o3?z2MM&zN~5`IY?ITlt}5Hmv}BjWHaksk_1X@mpVcSYGSXiv z*V#%kc=9VYcjmU{g|=Urx9h^}tFy3GAMN3Q>E$o&M1Z7pv%MY|AhOs8fL(?8_P?Ng zd1a1eAT9rvBN%*?7wUk3TR5*A#gH{DuR{+hU|e4Gx^mOz~0uUXdOA2`|YSvZxm6dsCII2+(RjKQgfJJDC29>g%zN9Pm7LDYJCVCq)a zC;QRVb*_*0U8(b3Z|tF|{w7yDK5exAuDw33O4)3`nSR{wZyA&Ry1C77T1-I@>b1(wWYGGv`UJxCUjm6#sH9 z&DvJvb)Ctw=HGQ?0S*gh`Hy0JIfbqc;6ZMH>jtouGtKo26u_G2o(5tw_PaNOp3$W4 z^WX^TYwP&ZG!aRhq!wo-*DsI_n@n=OWbdv$(a3~ zVbCfx#^1MUcN3kUB!e68ypq)BMmf>RV{G4?(&P$*)Y+4AR7G$NO8L;?b*)b2x0Jdf z($>}AbCJ@V)ofRDda5+Xbv^y3^5)?)5^$3fCD^IXtGr`zPpOfkN%dI>->Az-KWX@I2dCr2{e979oG*-`=RIXCS`WCs#<3X1i2G_cQY-!A8tb=TZ(B zd)E1r#>Yuq{lpCXZMOt-gYegL5z$Q=gR z)Zsm;R|wRLJ-YahRAukfORcmKy_YWL(N6SMMd#D2rntL+|V#eEu!{UjORgTZ|F?=Y#GsR`eszyMJTe7MA* z>Us}c1kwieQlo*iz+QWlhL+PeCUP;&)ORSHPy5}63_C#I($^R|h@RE=;JlAs*grN{ zP4DX85TvHx><>R@qyOqhpS{gk)?apZ5`2^Ou2KSzwEpdYz}2>(dMP5==BW@P?%H>V zwjgVUIr(T&c1)JDu_*AxN~cf|D^{T0u2EBwFKl^!5u15xCi0Wgq~yfqnY z@)Y07R64oTCrWChEbSR_Wg>;p6B|#Z-0SJM6iD6CJN)7nD!TVn^j4~&H#>?*8`awr z@r1UwZ&Y|V4cfOiY&fl<4;*5pJ?fL47tqJ{^#l{>Yx_P25$I?8XP;x!LH+yBmeY&- zubjDtm}6lo+YqxXg`H7|bW3}~ImA2b5b0bb&)Oi;BcI#Ca$lm@_StMV`jBH8m5WJn z{2-jdnw(u|D}JHt3fxARF$&L9-dDqh)J&1a=cSKYewXJtSL=W{{Z%FuY+SFcg=qp-6Z&!$t zR@!^(Jd@_=8y$?K+519*uFzb4qH{5{{=U0s<7i*|N1hR2i*yH6Osq^dqKkr6>jL~5 z%g;J?RTVBmzfgPz_d@?NzXcy|;Bpywzh{|of}k*gNOy=-a}91H>4N1M(ngN6{)7#s zEV0i9p((HJpR$fpp^lsB>#6=;mXuH$*ZDlrM7!s@n6Q<;*5!$NL#Mbm#NMXM-He!P z^f&IC(X$zIJX@oHjB_4L#A62C(-fZ1pm`^UZDMe|nIR7uajZx*r$uDD_G` zpHH2uN@Jg)%GKwoeY7MEfbf^TUMs_NGN$MrAs#aZ40EAz%tGS=&^p#8)6}e${*!)H z`dRj7b4*G*n_|A7w2FPhax&osXRDRm zZR?^cvM<Z*|oMC;bXGce9-uli=(1E;S#lEcaykCm{GFIdt>k3bOmQU~cH@Pq0+Py3BZo%Mg z%9T|GtGn-9CKZG!*TsD;ASe?qRTR`Ib7Nx*T*{t{iwa((2Wf(-0+dOHlqR{r;DMk^lU64FnRMY-nVw~u@e0jo6(O>zM z%k<*ea%udo;$8Cp;szDRb$h+=t%EM{i0x8vXFV?~V>ll32q zq~#X<)1s2{Hsy_?+Hz}~xkz39tbTOSK*da{w&-I;Sjj!%{EDUmy)at3iGNzyE`84d zh^AF`GscNfRUFDh(RW!X0aGllevCa)vaNOlDy+m_7XmL7AFn?L9V2dNSn02>{n}6m zh%epM7?63s6xP_79$#A4_&K$v)Yr5tWn}56rracqWLDG7#FdiW%@Y$ING>-YzT6-o zG&ABw5=pZ=u0o<{{&J~N($_LK)+qVda`@sG@jh{&;iq_~c(mbzcvHzA^?%|c;(z2{ z#bM$DjnU#vah7a}m?o~0M2ltO=fdM+U+DqCzonx}HQdjoF%m3GP^vCFMH5N>DPKzZ zC6QJH;?-q4q&$qh%vPyGjVnJ?)e9$<8)QD{(uyI~v7l!ahpYW9c@?ypOPL=k>S|gt zwpRFR2dD8Xe$<{x9V=Z{%TLxx_to|#L8Q@j6BBnzadl^|tdUCV7zx{@y1I_b$E3Y= zkK-ex&+BK!(aKYcl*X6kDMf7K^N~_-)wg_|_^xb5!O$X-Y*WDzL8UCD zAfLBGMk^f6-XiNQ)X@ditBP_dN2+;3DsgYk5Rw1%u!dUPgZ^4OrsOBGsy0k4hr?=f zOAkR)Yp<3%!PMH{lJ&sex&;yfAfWDu#FJT92Pm7JajA}07Mnh!uB@yi^-i6>>_$pY z-GlO}$+zqNl%G#}T|c3mkodQLX?bhnx|%;ZDdw8mK{+SPvYH<`M+~=WXXo&h$+i1( zUbe5Ty~01$aHy8cZ>uuZcIHl&JgvQvn<^@<{gK<1@2s1i`<0(iw?hz;9b0!SK-aqpH)Fpv>@P|}mo}6N47mQ2iC-}s^ASo*i7u_c_e=S?e1e5oIrPKYO_j%d0h z-kdV82`avve5L`(kyy|TC=SVjXaI4rrt=K~&NbE724(gh`L%{8+09Ku8mDrXR~I(! z;}({C8dG>fO8AW|-i1O}V->GLklASEed1*`-pL7IE1SmUG%+qV9p&$$9&Y024kH1Y zeha4HpEM`uO~bO9b@{{5DJ>)O70A?ElckmbLug zK=aSH&gD4x(XHFEXJj|GhGfUEPPY=W|D&&O?c}CXf?NOa)({nKmvT1ZBir=+>Dc}4 zL-;-Dz3qXy1Z0Ar=TC-P+hu}8*wS{ZKmn;}f1Ni194ViacMdd9zAP^X@JPNduP5tY zd365x%m;Ez{)vola$Y_uW4v6F-;utjO-4mopSRUg6RpqMB-AL2ugyp`YdhLr(Dp0z z?K5e%)^Y8}>5+A|b|n2-)!g=421xR~{U+l}@frCLW=7!%`3h#gV7B}`YcCHg&tS1Q z^W_{?FXOkL_D9j?$#1b`WI)Fv4uJT-4ovn%+>4Gr?kddJ&dJ>S=sBI|d2}S96Uy_# zA9f0I7Qilb%5xyl>7D=Pn87zY-{*V^lRF~Qtw_jS zm+`kFg%oMa=}0G?^k*FDptYxiL2A+c*C8iw=>A{FW3sL-xpNLBtYKs4Im!!JekX~F zEhlug(?*s2*ZGjfDXLV=pijs%EB4Sa{{GoS`lIX{3Or*ut6NddK>GbT21Y-1t>PYY z9;vQtA@ebT(v{BA;y7L1Y$it8^_jC9J->T0rvypp4&c0i|LqRS-T~|APR}lY!n+CC z*C6}5i?|cOTe>^BfuMukPOboWzWYA+HXyV66K{ByMDZRUZC|PQj6dbim-xLlPS-@d zO#icMA7QyNpbJQlw@bQeh-VwoUH6F3s$X``AQ39=cL$Q^lpgEGklRGlx@#!M3buD& zqj+*<-M^_vcoE8ZR4He_avSvvGg=uzJ4@?O0%&EFjY|$ z<_?TlmCbBIk5tK6gOF5}oplPaSM`!r03W9M!@3Xks;98$L5%8k>Qh8dzD|IbAc8a*r6N38RYfOic;x0``l>N4t(m)4ZZDMZMIHr6Z71Z2;Yd zNY|cb42SR4#xVk68?{gd54uasVO)cp)k>Mu!RgvA=5A1#nugluII5j+)k2igJR3eGs~HzJD((EUSvPy4CcLkgzYbrGZ{l2QjFk0A8w zn#l(I4&8s0i`YipH%c{Tt$sS?JL<81Jv9Vbt3OVaB2fBE)EjW19!{G9!|0i`XlS;+ zm{tU-*0<7Z;5%9({H8;zCBb|BiG*t%6J?AXn!CNbXMv%A|JHKbSWrG z{dQd$dZ{c>*N=9VTlK>+Y2qsVM$8}KHGK@0Q*d5S#Z47V)HmXaaz^U=@iVeF>wn-m ztYX7#{BOom!y!Tn^`{}4U?aaZz=?}UBMc%Uf)HZWl!ISyHGJVh2F%8dzR54_2UBL9RLjSR{T=q+O@1q_|6Pl47rx9Ah0Qs*XpIJCey zOAmtnF=yzDVQkHS-T_~x0P4TP-K}WD8U&NusQV(b zaSl4YFwl4y{WEW*U!Q~Lk1~p|L%G|HPArvOV|?v*No_UF#DVA&P5W`Ts1r>W@dwGP zO%!}3kzr~i48#9283-XbjOh+Rg57HRNqCO_W1daiff_KcAwrQ(^Il>FV!#|s^ueE* zQ;0v|!_64dF4%744Df(cVw?i@IK{?cV3m_+TnJfU8EZTNsne2-2F)d-(kA$C=Ox%7v!9u|m;kH}K zaPR#6t!jKAdce|yN25HJJ9s&A!14Ygu1W#_dWL*hvsij-PAg8M4Sc#AaeL89z<)D2lN=%a5&!N5%ciU6Z z`|#iFBs2l1w-=zjSiZdhGZvF=S7SD#i|jtk1yqy$4yFKUvwy_&AqQKTnFFqFD>bv% zrLZD1O|CX;PS#>;msOc1*PpaL1B5BZ+ol0N$oJR|0J%*cZCRj|b&G6bzXeNabAT_F zx7t2|--y53mq5rOmi;7jTw$0U3oXvOVlRWuc#$@1u&F^rH1@Fjx>)H&q-bBBR~QU>`_Z+&kbq3BTN@{p}<@?qs+F z*XKsSe`5c0QxKalAKU^&8fJpK79mBSaIQ=n?5=XIO#SVybS_MN=Pq|{OWSWB;*3r+ z7;2oP^avH+S)cx{!{WS}!EVX+bN&_eZr7Sjb2Y>jk`*R}xUg9-BxY9)fLIdias!78 zH@dz7MFof5b3ii%1ot6ONzNa4GI%~$>}G(O9D=(6@;?^S?S=pt?e1p~3w@erFmxf6 z=9vq{P^Np4jDDDs5C_7So?Suh$N=pn+oaRd(+_86PzDS^+&G<#a$k?0q$ z4Jo(XPhD&M`NXv-#p}NB+LAioe%5s%wc7B@MNK=Py5nk1yW6?ObtfIy^2a?oV{XG? z_tuQg>i6!L%s}Z!H#PHCS)jWmE2HF*`)bx_p~^D|Kq~NgmH>z4P4JuqlK5N?5Hymv z-opohv!{C6K@ZsrJXgVC%#)s1;4*rhcNq8`ZGm?I4;pltj+Z!WYIx4|oc-ou{pw!`LN=|IC@8y^KG9k+eQXdJDg_rv{kRqJTR|qj< zANpz`zp(R>dA6S_8ETyUaK}wlraiZTi+W@KF6}@!I4H$pjMN#BcL-~BzRxD${XATlax$M@SMSVNLcR(WDObYZG>K@1p5L(F_b?(XVw&IMbEMHv9tv}Eh(#L<-M~K z8T9}4f)oBnkLoqYY3TC4X|WCTAAJ{Mni+fhiZ6U)Q2K61MKi4Zvm>rDKJ=dm$1>;j zBf~Z_1N&tmUzv#h{`1e7!v1f;FPL2ebAvuHuMg}C8o~TM5PxnvGR^i>B|xg}^E!T@ z&e+Kfeg(AszO)*B&JkIhg<0(QDEN+D?X1gQj63H7(AVKf?j6LRgig;O>}BG8j{$jt z^u!B*lF9%2CWEF@1is?TtJJ`r1!>o*_8w;PH`?i*Pl-`9MQ`xsoAimjm2n01wBFCL zH2+)diQ&+{_F*qvW9;fvN9|ys`@ToCF{=7khDR`Z`Xj<7Fn;z^Lk5_u`diOindkbi z2RoUW{Xc{Hn4E$6=bkXz1`eK^iCkxMsZhvp+pEsY$Zq?dhFVmty;ItXy5U$<9EQd^ zWP&bCtn&=V>@N==PE+A>TrMI3Z*mJTj|o3KQHWmBWbY*C3_mT`0Ncn9e5W(96shl8 z8jZT4Cos90s_1D?oJ?EQJN0rAjnbPO7eRZ_+Z}tHzOip;Oeh`JcjQ7TUC~F5{6l}& zr-^_v=JdS|pUXJhKPR-8k=cJdq<|srhn;6I?ER&|e8!W0Ly(X;y#LX;M&{~)k!Sxy zYOD?w7OA%Wr&y1gWc|~)8P#apR5=r!VQVbzN58i(&YOz~bByNvhk555N6W)Lay};R z@LR!Tm;yqyI|9KYMtY7zOeC!5DG*4W>b;#ghy2TTGHowK?JG>CQhxQsUC~gHJ=V)7 zs8@Su$Bm|K>CL?Oi^l0y#f+z2?|pgUqJK6qG}1vQ^!*cYj$YY!DeM#7-Ny~BWen+S z4uSc@qTAh{68achJv-vXj7AUSQW-PABf98eUi93H z8Ox-5S6ql?wtF)peatsrQ3Q$k!TTou(zAr|fX^tgJ`uo925N6F3(w z$W$n&!@4@@L-q(O?@CMdCF|SE71=`Dg}AEh0h=)PHFu(|_u^^pDf`H1I~Qp`bphtz zIKV`$<~r;(5udo9>^H+7`#WUDguUk-c5Dd!!wYuAg^uE-I&wocvo5y(&>m%lwO46s z{LeCZISbNmtpCO;k&lqxVBM3WOM=*kIu_-JvW*?TcmbScomI>lPOXARv1Fg=sw4op zBf8xf9#^9pj~v6ps5d}w+@dJ)arqGw`+p*ad~|;JGxK!pAWZ=%6nInRJ$gBa!qBqGyh2KXwlPrdTn-|CI5ci zUS4Ry+4`|8R6%pSjW)4xwcma{r_j;(0GC^o*t{GaDV)+0gGd*OTd~k;(Tuim@MICA zeF30ak{jVZp_0lY#k8Qq~s*jBQl<7fPv zlEBW5acw0ToynIfOA0$hu`MOa&Z`%VC0@mlnEsMyiuEyrg-U6z0V`~f?lEKvE2N86 z7yZv0+s_HL(xCc6;dLpgGDtK?+9$?})>m#SOb`JoRs4@4a}^+aTJdt(PDV#Dt$Gke zQ8Kt@2ytPFpmr7ZiFjRII_iViP%lAjD?Ql2ht`%>Hl~7imi}lO0~{&Y(S*zVECDoq z$`~S%HHW1IOZuA&Qd%Tmnx7^wE}P%7EwQicNDKT*PFYGzRYGJLwdKL(V`UYsOX5$L znOfuGE|%SGWn6-m{c3H9m6dKTbsJHot4nD{Km*+i72VoCK>#KelynxW8^ijOr$FiE<$b`KCB&8Th8qDsr_{>k`PYOYI9-ynTe zCr_=ZoL%=l$Vvj$## zKt+V;s41!9ylAW`w&IlVk8W;7oM?sON(D+3)BLWYKqRcWUZD`(uL!8PQM|fjQ^oIM zbb(j8wD>CjwKTM3cQ#2{D;~|vmi`u-sV^!cONAt1rB_mhFRVIS){D7bb*ua>DoS>! z;vM{>tWs)+_Q;-89tWGN=TzE(SF1y+_5;>bW2?xStZH#pf5xC{qiji9YxN5mAQfCQ zN+wC!S+hiTJ9$;j{_1&2>uWAnM<*Vt!Bq3E#MBg4%M-Y={RLypCuMu{@0gFsw&f4# zEwb|k6T3Ic00p6~cVxVR(z-h`dBNMt6SAv?J4<6_p9=B9q1BTL?Rl%JcNVSWnXA)_ zL~LVqr!a`Iux7YuJjGjcMf8qns&N zDq95^Q+KPZ78Fdf ztonNu?qp*9cj=@gVZ%7-o|wEx31ts-Mc&}|7rd7ysOzy>JR51VePD^=f9>s zuJ;v)$-ah_g*d|B27VC;2WcEC6k%pJ!bCFE@J3DXDa6pm&&AhabDGwdT!6rvVoKzo z+f69(FkncNSR4Wv(PS1&GM!Bi#WyqZn|_wgNvAYVFO5vgZr)OwpIX)&R_aU9HK&z+ zO@7mOkh{V1xbZM|s^wwhZtg^rvN4vMsE%!c(padn?~eJuh`eL zAqOoU+7z7AS9Gum#9t(M-X!3Id9Rw9_#K>GO}BFc73MT|UML}| zWq$r??C%y*K|K0#OJCt)B32U{_kbj&u_aV8c1tygNS~o-fID~gjQ(_f<>}cw18N6 z^N*GS);*1*#lSw-X>EDScC?IYUC23I+tGTSqHA$ecX}xy{#{} zXZioO{^fGHtJ^AwYFo*};}&hcRgfFgshg}qd8 zawk9~il*FX$Q4CTZVh;=;&JXH&-JX&^3{{ox8tlHIu+z(shbyXYB7nv5rwCT>=(|JiDuh9Z2}l zy@0b4_oq9J^B%jpTb5ml=62uZ9!3rA{?5(z_ejm=UW0E_ZsG+%zbeo1$Pk+{m8S%& zl|UOEe_rFO?hbNiOmjiWp0%T)g`ruijl`x%!=sVW?E4k1%zW`CAl&GhUeAed%NHUU_# znv1*SSf-kTi*hVgO~8fN%T)n5oiSV$g+Hb$Q8DqiI_9X<1XS}-)jQ&>TB3R(v91!Y z4kqo8yj2rOwqldIo_wP4h59zxofoeeL^;5pu31m%rVD5B!1r_jmH|9Nvj_dhQLEXD{^HLK=w}Y3<~%0E6rjOl zZm8*+CTv#cEX@Pl=$7%?X*h9Rp7sbnpsH94!|TeYYO4sRO5SMyC3uDNbi;^Y`9j@# zqBl2G7efl z4{;0hI$AuYL4S)@kG`z;PYX~>4I}A?5T6W-=veq0!)AIl?2F+b{XT4%;XGp&biN^- zaTXG$3q&fND|M%k?ao!YL&z%Uc-+YQ6;iwZgoYw%J5*bqionUiHe5z4ZQ3=-l*_8^0n zh+wb`kBE0^mkfVMJ1AksStK4Q!?=rdk6<%`$+`H0#xlxsY@bm@xq@LD2PhTjGsb6> z*QmLsA=LHAnWkyfFvLRBN-7q<#k7s8fSod(roM-g3`^iNr^vAQ|L1f#)=4yM_7irS z;UWT|-Qt&ij8$ASbR#QU?-`z<_B9}lvryNoxyF-dpmdrMff-r)-6+Ep6>l)!#I7mq zHVwl1OTbMVaNGG9Q!uWLD>D)B>o_w^W%y!drO8YfN=KVs`llFZ^H73;EHE!7P9?rF zA0;LcV$3koP~2NHo3s~OX_k@@m^8D7BuDQtUnBiS?Jz$juRtC&{~!k;LM`LTC^*ov zfUJO38J*B3*ASxvTIU*U)Ii0~&&FG@p_a?0p)i*AKht{n?5=E6EWEL;%)~_;Zaiet zB5v2jncgDd(%0sBsF9MZ=2NJ=k||~!dSy|mS%$95zihsN*^!%O8H{P;mG}w&mh1_Z zXl#w&rb@)k@$b(!;8--Wr5E>xBC~wNpCbRyItAZE1X(xy-z|o9KOqp;WDO#)u>k88 zf(LWJiX)Ck@3At8$5Dr^c|;8IytTsL_nmH45bwgJ<^=FtSF%5!`!fQ3-4$$3oEsjPQ>D}2FnvfbIBX)4CDbJ z*1892DL7FUbbR(}>mBrcHrdbigP0d>OE3<9f9p}~W-7^+fXyM_ zwPCR@{PSBO?hs+X)`G*}xi%BdgbTL)iyw_$Wcz?WgIQ=Fg~y@S+o$0>Q2XtR@h|=T ztvd*d5V@9jpd&7qi!hCb2VS6#79BAxk^jrr6w;Hw8A;w)sX4wt^jPCiieE_q2o-F{-;GS+f z0vuu+XG;Sz^yRh!(0paG%>?R_3vKVgVSa!6Lh#2riv0|PEn8qmK<8CVwO2q}N~8Up zf3N6`{R_-isB$cUpUty7j>G$N2RXoqGdzStgy_qj>QEzhv)(%%AS)T)oP$x5=<}R& zP*GH*a~rCH{K6T8`bmO1)6n~g8=ZJG9RJOkk8Z)aoek(OSeMg+*@n689Kb}Q-#H&+ z2t84fylhD_mT2iH}!IUYfFO9ne9Lwv=B&OOk`qBLhZ^l?7gSpZAP?RM&6 zPjfaoU%?Zy2V7&}K6aZc0I`ADMXlYDD%DKe;rh ziG(hf7j+iTay>%va17UX)NO2$dnkGgrq(?Hy#sA>FGQ!HemZJ1XSo%Qip&x2c1K>u zD|dtclU=s^j-E`7f#Ud;6{Nc0T$S~#L*k4C5L%L)bl}|jN~Z$YT7AO#2y{St!Zj5% zAQ8I`f-jeBb)|t{3&*(fAcTV1e!@Ro5aoIV<>U;w$HAs@VeWM>JSWV3684l8y}bfg>Izn!Y|O7|CMPx?FiY3Jt*gyDm0e&#rp+jSzd zu5*S9nsuz@p{qRWNyAc?3xKP3yS@M?Nqz3cz=pCV?o*&WCH~VfkV}~FmVm*PS%A=ZI?{ zt;uu1WlqcU>~vjAdt@(h{YXzUo^UTo|D#^*KATb8iFczix3>nnW&Z18k-Il5rRJ#n zXV%}!Q=a7jVOfGiB=MF5 z*B5qpoj`5gFYimxid>{`97vQi*S8itlsm+C9DI>8#+L*(vbOoD{v1Y$PY8*pPxQ4y zTB#DB7do7B#rFVun7rQi35p;M>lp=A5r_B8hYcmn?AZhh#Bb`^1Ixml={W@}$I{R^ zzc&zp{@_^Jsm6plpp6WS*YR(q8jEm-msH?FoFDV|;iFtNTmS*#PG+EqV$Uk_L6Xt) z99KpD*DFC0C_djYSR1v~_W-<;mfn++^^-oa=W+Tcy0|wqbv|QuuQCb6DC}EsWd!48 zUsk-HxxY_+sh*kLKkQ-$)7-y5`YZEiKkC9c*4F;^NDC{Y|7ir2B^a0*zJjG1*dO|m z^>iRDQvC#v6g0`T~+nwq}wA3-E^EM{Hak)`|DRgKm z8?m#UYf2#4tIqDc&p4wifjiAVNt?%*PI%|OO}a&z?J33WBk%TJKrNyi@r{PXQ8)SO zKyPV-dUj?hX-z%KbQS$rZ$Qc$x~;b$=@jE=@2`Yg3~ArF_+rMpKH()Ib5GxciyZ%K zVnK8-v#~$o!YbzD{+viLYhk}NBA6A}|1o?R3ox)C)X6FxI2EE|c?MwTt*p-jCBawO zlLj=q{=uM7LvH9A{^ z`|9eZHxfp>q5k>HCeJpkopizT1=&Ofc;BN%ag7cT8%H1}0rJjHn5_b57_xvYO))Ej0@e^_KZQ`FCn zn87slcZYeIFZv&c=CGy@Obj8gjt=ZP&t`!J5`rZx&Hy>6h1E1rb?zSeg6)NRKRVhz zSn(U(VxQGC8MDWJuJRk^w!Ock27BHSnD-X@%5gut7gy<&(o67}u58k30@9s~MH1Pb z{m65qT<>Hko7~`)gEmo0d=XhwsSw{l`Wo7~p0z178nx$pqW`YGH!a~1{bH{negwU# zZ(Qs<`rp2YnBR=!eS+vS3{syps+OVY`w{sM<46Dc@T<(#{V`!V{x?F0USQ_+3qyjL zzJA5|E3DD|SA&VHCH-H5_^kB<0q5j|Ov79CX9Ct>=>9<{Hau-P=coN!t4|RR8QV+$ z5WS{^!er7u)7zXAq&{;AYb+UPVNf`f}kHz$fNA@K6Atvc0|wgux>V@=S--SUDE>#X<^^)DLHTFOzDvYzvRs5c@jLD z`c=iz+@gM0olsAujZ#IonP?kTIkj(T2-UlCHSIq&L9~{ht_c)uq4#MXaNaY5wXO6l z##>!IDTgW5YjFEmQHJ}daP~aYFxUXwYn}}jaiIQ-$zsk=%j*nBHqwesTbe5mvzi& zC}Dd#Vk>E!X&qki5DumjR4|V7S8<&8COcm7f|Zi}q{~L7bMf6aVgPTs@(%V0?}mCZ zQk%olY=qJI%d~sI48B~q4xq_ht-F=EFqf<+r{<&ohLO3E)?e(O`a%8-YxTl$U6Uq z&d~^6{tR<+_`94t%~y0!a(vBWbb5adRfux#HP3Bc!ynWfRK1PAp;;m^@X;;Himvf* zv<&2SxfUZN$Q;mUyImk;^m~GF10m& zM$vQ4@Jly@<1{;BCBhXN=tYJwP}3O06{cw(L`#G@+Nl@R!ZvL{)Z6^$wXgK=@^94& z^!M_w)snk?`44LgS_|@j*BWb$1^?6yskl-QUYAu&Ehwq`oS$0orC!SWSs32{WG^h# zHZJ$~SZ-{ZK++ajn&;s+2t!)}(eH&{ThkD~M5HzvY=`J)dn&lHI77YyxTDx0znwL# zWN63f^p7Qh9gS&2OHiHjQi4jVIsr*dC4HSuiA%*pI$tMT7cWulyDShNR-oe}#Yu{W zxZ~n%#qCQW;Gpiq1ML z&Bg8Gi{ILHoz+?QS@(8UXWg4lUAnoco6e@YyG1}z1XNUP0l}cV!CH5BcfP#;-2Zc3 z&vOBv`+I-BeUwLVW(leKG#XtprUr+=m&j|Yp*HF4x>E2uDXAU|a7&*xtjv+imNaOx z__CzNxfvxgNh9~tJ6TubgS2?rr>4ahJ@Sc7@Cy+6_9k=68hLutx8%NZs%pvkck(h- z`ngYXi>mxwKlxqNmBgv?pQ^8C4@*bM{=WLdV9BfBoXC^gF0=l_xZlv}tnWrs_#45v(4wt?c4{VDrSoGZUregk_| z{!;N1b+Z&!ISnzj^ljBLXkJ;Wate5PnM?TwIJkUBH9qH0`JU=`*`vy_HHn!i<+U}g zbXSDx55Bai{8#OP)OU*MwFMU&6kBWWU4SXh)Qw9?RbcD(BYzy^g|4pQe1RfR zcki65Y;DB-daZ0_QHHIfY*A5yiC(s~h^)I@cCx6gF|`a@^jR5KR#3dDw7yJVOe=0K zyI*`;6jwe%@?Rdje78i)9#@`Ul1ZOj{#ZJjj8JTlJ|)ail*>ZcDHXHiKTxMD6lGEH z>y^XH2SP!Wkn$Jc*h-&52#l}%T`@8@rD|0LF}tlQv*KmeoGMo3stj>eLnSVKZ`I{W z@1?<2f2xM1URO@2+J4caTwaB}5LE82YDl@EJYRJ)`GXRt9F)AEa+oOB-dq_a+GcO8 z>@QkpnO`|g1ZWjkZWd`(dn?b1{?r_8}e(b#uv)C z`>M7U{$_5gqKnnkva0T)1kyp}!s5mFO-in0Bqpc2SIH9OlWMGV7d)@}vFu+csAi4q zHyBa_lp}$h8m0VG?xUI;r5QPgYJQcfvRt*ZOFv~IYIl_F$XH*SQpQj3UyCdArhTa` zE_D?d6Nxw^hI4ztW7X z8I!-OZc)vK{IZIsn#BBXvKuvc!LA~HjZ{Dr+G|XLKweVKZQ*owLhT5lfUd1QB3es1 zTPqR0BOb2(Sm4E>>kb!6(9i3vVhfU2zpTg&N7ZwRtDv+9;a>_assAOZ1Ac8-TQVDv z)(~HU$hqGDEwN|w8;Yb+S+NZkX>{hChRae`#^{FUQbYRq#@^EBm*zB1l#NT<+_*}% zI~7;I2{GrUIhC)7q7Ts_)e;j#J>z0CMaJ*#+X`V#e~;+RWGP3xI+T~SS&m?K<6n$|Ff zIF2=)WTqPbX(BSabPJmrS$i4*O?O$2>c3S{>{aEds+H^_>A$Mu>~CVS3e7nrT&K$C z@bfmQG@K`Fk;=`T#8|5O#x12zP|xE{A+1)Y@m%;KwJlGJU8|YJ7ow+W(D_2-QjJBh z10K`dPjCaOYhEWzfy`|_EA)Ys%~;V0;OS<$=pbNPbE`;@^Srr3)SZ2+`LXCv*8S#R z1@kgLXh#(s%N(MeTacHrQL~b2a_KeesdX-cW(l?0$@{i^!TGaWJoQf7}ep|M>r91z5mbc}NU_w?e?GsXs z`;7KENgA2=NChs6u0OetS*%-5j%YA+XUKol%XAzHuJ(t{O#NTwIo(?-zVuMbWa@WG zW6Lhu#X@ikh}JFOx8&33^S-y}=va0|%VoNc!EE`+h@w`u&SJ30gIaeo-V*4oSY|Qq zY-^B(!(_BgVjn<>+m5k6A^x)m#Xdkms!d&iZ6bK3`UAAvTt&*jYl zu4&)Q+Y8v*zMqH9JHyA_Uak63i1gc%lNtB)XV z``Y@0I8l?;wumUL-`{qIG%wOW%OI)CRBbx)2I-`>hh&5Jar;2ZDpCLTC6sbLxcv}y z5O-F4E;W@kqMbyor_XO!(gst=?Oqy$G^G70&4BOJ&!lH#d-RtW|6%&-)r|M3Z2cRi z2=Ux7jkN#{HLPcygDo_~vkD-u4e6{q;5Gx9JrkrhNZ3b!27{Un280Ywc6sho!wvS0 z+{x`%u;V=R_N&-Ykr}`a^NeYKgN0kw`f=Eg?cep=ahPV59*7^_kfJZg%a!-_mkBG% z9~cG^?6PBqRmAMUCyp)YFd?%wBBI87|kNVlTmNJ8k zGDcG_5qB5?6g7T>v5tBcd(QZlHU=Fqt)S^p2TbYoLx_7OGQ9vUFv;j0uwy12V>ooK zDaeR}{B63;$Oq3hy!sInxG@7ups^1ykVVe~{OtWyiVcZ;kx8*xd!R@e4#sAIvW!;XaGLo%{_$So2 zRuW-1*={W%NQo_09pMGOBf|NY;O5!-6a5&eZ6gVQUS&%mT|s`fp~xc;Z8i=$9!{|- z$ptXH%|Y&l=Gm^1KSLC@N0dcigY7#d5%j@w8y4&9Ww{PJ;Qej!!q#~oSsud*9h0q5 z@QFs6bq&0#+M-=KPz<=Q5qc+yzgZuE>IjtzpYE*N8z zV3y@ywgoXwylb|1*u|WI_9@s>CfL3aH;CTfeg>CLxo#)moTTgaLi{Mgd%Ff7kKbeO zz!zaPj=qGom_3dqgnIN)#}2|nWQQYxI2lpu01*@65(kGUht)euiEgOHp(4J8+;CV) z^C81+a7d=_oDBj=^qsX`gzWXj*a#8#t;$vtdGeOpu0nM!_w0jUhg9F~8(@#?O6=)y zT$Lq~=O15w(C$MhW$W#KkQ<7TjwMJ>VL!)dRE!|#V4$w%bvd-?IPPG_9dv*NcSd3U zV~ln#z{sgjo%=CA$d8>F*u$iOPCT}dkl-x9KEk=2D%?`+LFYAGD`uqg8SWdZ!}$Zh z7AbR$!2=`y`FVIFTJX#XtG{Wx| z-gZ7mWC)e6(THFCdecd<}Z##>h%>J`o7@}XlXPS;CxE9rTJ>JKCC zbWg*a$2YnE#b|LG+zJ1`#c*H3?m+9^NGuV>aOYtyNQ%1_`wLO%ZjW4K)VLkERG8I$ z1t)@jb+Q0Y{L`Hbz-9kbCmPV^|H~-^j&MG6wgUy`T<1g3yoi5hB*>{b>DmN7-!RN| z3H+yeol6K2D1t64bb;LLdINQq402C`9Ttn+J7D)k$?hC@YJP@W4FAllbXyVWoXPG- zh(}DdX8>{!o$Hy6R8l#f9jK9HwI>O6jx^eXLNyVv9s#;Pevqdb9T&;Z`_arue*P9Z zj6U!Aj2VSW^p3zBK?1zccSa6Qbe za-DDw0xUAWa<2dw+BEJ&;Bn0hHw*Z&p~Bq`Vpd;uKLt;(0C+}&b*1T^{~(7;T09w$ z%SC%VB4}#CB##aHOfc8;3I@wd_Kt$x<6QBsg2%FQy~p5sMzj}(7)^_fuzffM=50oF zkgj<{$Z^Dd-lxb^e7A1^vK1%rO+|jfp7E_fEx;`I?L}pvm-x=3>QMjrkf^7~Q$8Ac zC<5v$KyQcFdj858;ACZ(X88+pE#(XSPC$YT=YI=$DVY+O3`7=w4Qv5^67>%x zgCP040#wjbo;6SnPT-sigunsT-U!=Y%s3bv2;tEn!G)0blsmz#&~4A?b6GVb4C4NQjJ5VXKP=w$II2PIFPtQ0K;QNy@ zb_KZp*o@@?x<4(0?0)FyWDd9T{jHg$dZ7Pt))uWV(l2|fsWh-98(#Y|kdZU8swhyH zQ&V0MaOQ54_X@np^-3hc@qnXZSa1WtBccTpf&26QK_aj{Z(pz+w3PEa=mnLrx`U5E zKNvSceZgnx{X?_B7HU@LU&s*h{m@a!X;OA58&XGH5n@7q68eRTp{sCLLnN zHe+6d?n6If28BMu7NZx0{|7sbN(`i=9|?2^&ZO@Mgae1umj=9nP`kPW)D;j5Aw516;p!7oMm!&@KKJsWI`w^cb)iC zXjyJ!!QfCFV6os(2o5OC3x>qNVceXM2}od{4&4CWU?zvYg4WZy;lDt|)bHVCpeK~< zaOBF7^gEmc#uKe!EVzrn5Az@c@oC|5$R1p3xD~>}BEmsP7e*L<03C&H4ZnkKLA^um z@~92}qUt;!bQJU;@8N(Jr=vG} zu?il#)%#p>8k6P&2<~Ec`^T_<;&%G&)Gzqs0W?8N00q}!#u914*YNiweyA9-oQw_s z3oubmhdZ(hr~^9=XNahZ4o8}wHnnrX#d$PtCoQ>-_Pz7oc^G|r*Mh{;bXHgPnUu(< zP@isL4DWh*Y6RoI?inYrk*!4h@f8epH!c1X<7&4iPRH!ieLGgcT-G!2Xang;i1eKUPpM_l= zDQixp3US!LWWqkYFwlc8C)5X-a2(MT+7!v3>qCzK3FN9UE_*ZORLB1^wo?0bVAIf4 zYRA(Hcd0)*cPC$`}a(Zu4c~e*?i zF=IkEWyDvi>(@fXW6bv z^@O2zdckZ0%JCO(0I`?DMRyS8P8n$r>9|XX1&|lHNyvZ5A0pqnyC_v&DNskD7oM4Lm=Pb& zJ5|6Cg>@%KGhT$l$1gJvhA$seGlk*j@hoP0$K*IT^G(O*SPE-)$C;yYR%{10#==VO zsEK|;nX6YCBX=$OEPVxKi=L)ViP(p2)nZD6VSZ@_b(Eo9e2-daMDw4~`kKbEs%Zq% zW$FU@6tju2pYFG4(O(&Os~<6vx!iUcLSSCE-v@4Ip&ZVfZLD9;vdj!N&UN%s5Bs+3 zX=*HIl^b$l0*B_lkvxbK@GLt&I>Pqz6Hjv2c%GhVjj;WR2}`(g@1axoxq5HuNj~?M z_wk8iyn()<$M^8o`IaAx=Vkbg#Aor~K4u(($MdyE-V2#F!<51-)=o8AnHAav%^ggO zHl}VJ^Mh8dSioAZ`%6;CD$%tGTi8=t=v*-y+q#G`p8d7;CwV!C)OH`&#a+_=81;7kpbZ zy_Er+CK9wkbEu*p?NhVH6eP84)1MVo=y#=EE_k4?xOlg4j{eVuRfP$L#N@(4qCt@~ zq)=sebgsSdk#SlgT0GWx`s_jR3Zv-EI`I*sC1ImD%lP#4UNPGgbt*}$HZ4C{AiP^M z!E#A>x!P_yCG4zjYuhh;P~EATBI;H1zv{!H`85Yizl+Y*=!>U`l(oBr0}J}re&!Yz zq}R1Y{Q0K(^OU&4g$=6+#|vv3=U~j@^-VjF7;!*#3`QtArOp7Gi>_&!s9f=}wzSAmu}X2F=zRsFq^Nj7#kT@hae5`1KeO0WwSc`>GNbA#?S%xa6p@}v zZd9k@_mrHe$;JGyeJY7xnx|%-=ap8e zTh2*Jt?K)U>eBm~p=X~+U&<3~C#6s16K&DbyYfNCmC|?ex!TjRLGq*ZU9x#{PGybk zp!~Y*gA82ykNCB$yp%4W$nKYo=GMxWlv$Vu<&<&|^{D)s;vZst>E?=FxP(%52_;|Ie8mN69lc1=Dmzd9SrH|l9`Wa2l)u1=DxQ>$LS3m$DW8alsSGJ5 zKwnp_QhWgis>Brz;PtAG%0s!YlmjXaIa`%mtL9|YDKo1mng1wRRsQsA%39^XO9Ev` zxjF5e^0g9?8du#*S$#3CdaUxwg>%)5tNWzDs}EE!O0KKCTHtg{jZBeaVr6Fm+d{2; zQQ&CnQ#H77fJ$4npm2YUscL^AU$M9jws=6V*%C#tm6m4M| zl<`GBXw#LlVkya|d@DJNZ>^3lS%Z02ZIT{DovB$XJC5jIBbD!q`18M&&IZ4){jbyn z8dVD|TLDO|tthL=>8QP2J}f(?_DlKJtiE+4%W)Zox_`>8>7=^-ie8rxb;*i(Y1lfH z;&3Xbj;+97EUi;0v=_Q+a`LY_-qrx}HI7#`nfdj$s2WE8$96?conWg5QWF;N>hfzo z2p&}aRXa|&T>f9}Y9XrVXYDbePqe%iBpRF-u8l<6+2PuN=q_VH-OvJT#GfBqxR7Y6 zt1A2v@#psu+b}2V(~GVnf7V|wz6pQQuvy}Perv#&z#tPE+DhJoavMHMlL7Y|CrLYU z6C2mahUE-zjFs)m@;8EI=uB}VTV{`39+%6$q;nfvwUbx zotpX}ueVcG@8SNor`JE{9Wcyn7{Zfjhcqnb{cPCMa5C?7)s+Tpo~~?ELpgt_W-=UW98+3xpxu_DBV&1bwIJ zX@LUiR2?Xkz^|#Q#F?JgSZ_9u4TH&MH2dV^-6OdD%>L zRdFB-ueKNe&Sa{)B}+33)K4U5)9ciKB%Dk4n%=U6uFR%SEUYV|=?x3vP^pHqyhc)l z^Uv3jRj1j!#-NJA=~WF^sW_L)9jY6gkhDnMo4ZK-R6UD}5sKBDxxTzI^;zC@_8&Er zcaBk{R`MQEN$Oj9>7)wHWPTK3uqKUv3oF-n@>|iA=9vN&Qq&9+3gE8h7SS}={N|^k zVu(mPreHXDvUYXBabSlwrho+m!cjR#w9>+T*(bG{!kny2T2En7qoz3DD?9uLIJa}P#kab2YVQcBzv|i3?N|N?Br;%va z{mYHV$LjKU>#*x|&+~?$_qJ@vdx3;SI6oYIwWTh<5A0ye{d_FsdTa0et6)y+1i@I) z!PaGhBftr*dj&ke@YXYeE4kxZGll(gX11b*E3?Uflq zuB$o?CCmIqcaw6XZ9>aHYP_1w`P*P@3+8H@ zox?!)Yx~WehrHOnl&gndYft9wf?aIq^J<{;+ZDVw;79H4dCNeJ?N{?MfmQ9_@+ttW z`hj`ZbDjDz{HUDk`uY3~Im6oK5|4O}x6LQ6_Z(}RN}T5ww{0cjtwY<=i67f{w~0wP z8dF<<^rc?j_KS>Fj%{B+8B`wC9!p_Jf$do8;G+N9%c)4w`F1b$DZiur8Eq#Qs~ zvoiHFX)ozC{SNw8%42;d-Ac;QGZ|5Yb$Sb<0=LdEfCND4KJqW#EhC6>f!%53QrZ|FjrG*Nv}j`o^*s5e@fEd^ zs4xwrzQ7llHqoe9y$M5Kg_&zI(YsL!(|1N1a=m#0<2n4dc?)wE%w&#bo`o{amzXjL z-i&2F1GCIL)(lXIS;{&D)R>!DFu-%85VP8w9GP>xNk$rGly{!78UwOjG4^2I7?zs) zU}0LjX*F(0qs5epE3P?UD#9{5j?p z(n{`B^COasbHk zKJng)%*)=JW@^N6EiqT2rr2xE-6)}Pw52clZ(W^b4Z5*OXGz8Es6Aj2VQy3=SnSxW z(p#4I*xw~4>r@<1{Mot>KTZU)g7C%pYplhDalGYLJAunSXMIR`!EjoC5ZBWV+9nZc zl-*hViG0bt^Dnqc1 z9abN5atp}%1F2C_Yzt5a>gL!^pzc*|wo%c5GKWor=_jqTJ;aELp4&%ZClzGbH(<*J zEA45xX?d&dOdOw+Vprq7F+1!*{9$^6{Uu&bUG5l;|3F^qm_hiLxXZDb5D`&1P7utv zCdoBE``k?(5BCGDRV<@t( za=c>$Qdq8Vq@m`@_>N*!bMa+|8@;jcjN>!fDO}*3irL8j$GHnr&rOVQ{_(7!Garj) zq&OR~9kdP3$c~1x&iM`pC7p2f!`TRpu8H_4`~=r>dgll@~IGRO%3Xh%Nyhkux(2@>y= zIBr6&nrAu(Lz7!?IyXXpYWh2~Vfm5#d?|ckBtPE`H%9XF0}w~#>8=fk2NI3z0um(N z;>tty77cajP}uz8uG^7Tvz@L#=q$F{Jr#Y6xyQW~vyDF6eF7t+PIW^fTa3+aKK39{ z;#Ocqg#PY!>>V7#eGNAgyVw02SBaVA8H#&=dghshpNxFy*@!=i_~bc)FGLLSoWXa( z=XkR5zhNg`(?N;;T-P+vQGd2;3}~Z2&Giqc(6!VR1Drb< z@Bd(NMRM;yup0%r-dOk%0n&?rhw^mZQp8s760aRm&vJWTAg42Gd{IaUt-&`Rd6m-X z+mBj9Uh7LmVTsi~EGj@)>64%*Me_4{^hK=A*MTm^2z^h`*CQQ`e=y@w3jYMmQKZ?w z1j9w#^KZmh5#u~fx#GYWPi-zYFv=szMFoaNfgw;dj}%w{ea@L4H~>4r>K{mjnHYlu zMEFG7vOp;uP7wt3@GkPeKnG$9F)#1}kwQ2c?2Bl_PYaGi_Qrk;E{E%wHkk2F1v~1zX@1W8wv~r7^@J06~IH~xWEbERatic4>~K!2`E7i#Crmr;1toR zz$fsX{G#9_$cem3!F3QPM;AN|UCt^A!l4BWMUW5uK=TJxumjW;!2qm^Tot?r`#@SA z`~lxU_!t@kC*!T5dGJnLL1;ZvjQ`-%B@!ehqBk}jR92l72Wtibq=`cUEp%=;JS^$Ub&*G zm%)XAh2>v^(SQc|!5|X2Qt~<|2eyh`5zfCxbSwA@q!COFjR!ByD+{d#mvFa*PC|yU z{|TWW0Oq=o2+~DQ47EU)Q9YrnP&#FM=moTg6b$!;O(Al^Q(!5Cv*DGn2K>744%k!N z>hN*+bnLEhIy@S4HjIMf(bzB@u0rVouQM(Orv;v61cQGEZe{3$e+52dj`Cy#CuNFl z^MgCHmK**G0<-)&SWudMPIWBk$$nQ?8T^ogRh|k>$sMUk3vJKMliNa>fJr46LwNvk z(Y8=KaB{)P&>bLOP!dV+kLJ$~&jZ1^&hS3ab9Q4m6MUFy3RA&K`txuVWFRdj?17|E zLg71*8uIDzx5zEYw2m>*9fWrsOQAe`uwyGUi1T+u!vQJMgeF z^g;A(Z;s(P=09&k%SMdM`=engwx2Ji0*Ed2xk}FAPW$78zwx{LKe=-W+XL0~dBnrP zGsMTFgwSa0W^zi%f*eOV9!`etrY;SC1A3^RJBT^?G;znDOb&fvXVxV>y{_|e>Qu&G zUCUEs3_=$zDV=e(>+-o{%qiUy&z@o?cb`nCVODk*oF2x!-W@oJW{v9UePRh~U(c#z zZ&~P`On8PmgFb9qY4|In4*V}>sDYcHkc3?|ik zuVEFY+xKrp8g`FQUa|rE+CNKZ!CCw!&UL&dkVfky=zG>V~2p#8LZfHPbywNQN^fj-fVP~ZAV?aeJ=9(|FWHvUzcTdQ~ zjrHen*tqwBQ8Xz2dB8xNM|c^`z(9#FLlY3YNpC}T2!VVzoD3XGF^7LA}bVISjm_tsMy=7?_a z$=S?Z-O31mMt9#lCS+=QhQ?oD-sxEr7su+;b1L>2Yeo;|XfkVSk1PhxO6jpi*PyW; zkf9hY_CQ;+&^;b)gA((%cTEKgL-al?S%DqmJ0zrHL%u=|4OitKM$5oc{Y}K7goFSB zvz7RFFdhD!)F-q9GMe-?^a4;p=@m}T7E)?DW@QK>TO?-MUE17^*B39)V4cY1>$Df0 zSI$?{AnfO> z^n_0PGZ{GY3sF{Zo2YWG;8{rvoOc;0Qj4pG^o4xf&Bl$PO!r(sIw()QC!zPLB3~Tn z2rb&bF?SrjcVJM~1p2AK$MpI17eP^~fN?N1`@&d8K}eGnV)hUJbuPq=4ac6n#XJ+f zdu9;xLid$NJ)?|673lQpg5%kix&VaK&&Ygxw5KJjx{;m*}@Q(2EYQ(|Yc zM|C2O{>MJlNr)j*j~KMZKh#qOf?*Xk+fb_MO)WA!sM$)rXWUmdk+#M7uqcmaHkIZV z&}W-hvrp0s&5x)(j2RX!;T6MW6=3q2IksX%1#6qQS9I1; z4%R&)9m;v+u1)>LUGG_Y!Ne7KbjdpIZSRotHr_CA=DC5qtzP%p3p}WAXu=&{qi@~m ze4g7!IJKR3&u2f`H?N=X^YOQN%luKtzUQ6sPdhdu59B`(KRu5YX*%A^YKp92Ua~a0 ze@&}dX59hpS=MbGs;-kgQWsWu*(X{KmBg}JTb_%~a+b8#@-}gpZ95rloUd(v$U!cq zy%V3oo22)lQM@`s82&i#r13VSHt&_`9#F|gnw>d!@`qZuSx58Jth>^$=6kIjY2|`t zwnG;cf^?fcrA|<5AC>e=@Y} zh8*=LzYA|W?w$B8eCHf-VyI}C^WWne^X@lQnjhueY&v1?%6rgsuBANhM-#d60Dnf4 zyDFJ~Ts2SLi(jHD6_4Y8Rqx<`$-k%>%4XynG<7tYU`}&7X|qqkz6`rfV!aP=}YJgLoi6=E~BfJpvnr34U7fn*FMnx4V)SKW#ikE8kKz0?^ zHU9_HN#<+E$N)EMbPQ#R7TjUq-l{B?{ypT|Gy>&)P zRLSSovq?7TsMezM6zQtg?sG6{T^mv8hbIZazWkS#g&zp6pxBKD~;00l0j8-3x`SeSJm??BobvDJ1F^8 zJ&c}HaPzEPof%Q3EcKjAz|wX#HuX*E4Yl>6xb(OB>xKBT8JdMD)5~^h5|hW2 zozfI0jW5g9SkKQWV`!e8TU%D$JTfs|W-VpgTry+nKAS)p}&NO5qLL zWZz3wRa52DO25fd<$KEx6{X5iWm;i>xxRcGZ%OH(^5@KO>3M~mdbLzl5lvcNHmY(0 z?rs^bY8?7nc|YYudP(-tnk#|NVQcwXqa%3R@tW^_5z}EMgt{mT;mf7Rw$m##UhEJPNoXSh|}ywQ_#hK-}=k!t$}`T~*^0 z6A+dve8o)I*{UZMzaX2H2P<8m{mT3*I3P`FtGbcXs{Eo{lRdL~mQoO@8Q7_Om~o^! zsd{qy&}u^Uk+dt-<<-as~t?H*WlTtp^{I6zv%G@fcILbk+DlY7C zV5;&8t(N;$RfVtH&Q@8)bJXLi?ut`trz`u38x#WNJn=WFN_n7Yk2p!0TO<|mm6GDV zyp_tXVjycx^%ThhT48mXq?^2}T35m$tgIO+J&aAP!N|^`F4w%4pF_ZE<4X_15^8J9 zWKQ6E!Lo;tHWwW8-@Ozj-uWapvUIf7Tty|q&Ww{1zaYlIWpe?j`_#5it3Y46!b;QEajKVrs zp@F)yewg?SX=VM1qN(_VdUerVjHh92@pIJ028`qZ;!wkb5*sYBafy@-AvIo*4FTP0 zERy8{_cz*P*K>W1&*iIg@J;>Y>Dil`=E$X4QB9lWcQbx99WR}p(Z4CH^icY^CSob* z(xN6=X>nR&11T@vHMW7Ax6?JU0hPDTZfGdX!x$h9`n<6Ae8WBd{D#8DL42xmP2*zz zoib2kbpDExO^w<4s6tF5JK`f-(5MkiO-dmfmf+-6yFB6X$DBP0w9_x z5^U~r&1y+&_D{`G$@{E#8eqwS%-#w)6;oRhk1>fRi4(+u?@?myMt>Ub_+F++{vewKb!m-CJk?NmE?Wy0_3 z$Gornftr4KyEx}GbMuOr12nPxvDDWZ4!@o}R^!j#Mu0Yt7WBalZcY)HBmVq$p%VF3 zJ4(bs%+sDKSPSE7nFWoIKU!_!G%!K?u#g1Ws{3D|1=v?NvG7lBK(|7?DaWikEJkDp zbeF_+S@(2UaaZOy9j|CW=KN*>gX)GxX0{vLOkpIs)-+czjOM?az0A3-E1N$u3sg+) zG}g%4L)v{TVnvM>#QG>_YfIRtil1nW?B;?p?L*GU{B~V$PCRd-ZU(2GWz%ityre61 z04{>!*U7n0N%M8rc~HErWoF)bY<>%b-wR#Z;^N;xcC<$2=ONa$?iBn5t8YaJ_|Ofl zrNUm|&#ijlL6Ek!OGpOdT3-n*07zSJ(STe`+j!CL9A4X8QEql++a^(A*7cUHRIF!Q z%QkA7XKc$_>S_0kmXp*r%a#@bZC+b?O9M@&zTR?=KBKO_brfAzHK}zgV?tR}YX*Z> zlHDp~yc4f&wK9(ikGI}o%JPhDeVDH}nQfCH3}ge<1ty$M|XBv3dYs z4vNzA_*a0F^p*J&0Za7i{C&CG^sanp4yesS5_ziIB2r0@vaOv2a^GsZO$u3$w+|w3 zX&1DwBeyjVYfqISn(J3kf1aEVBidZxFKx7>nT^dnI~_aWdP3 ztTOK7#35E1F`O{$o3Wa^6zVn_xfu|?@iJElrWxOJAAkx>BYBg6O{O`#odCaSEf13W z+b{|L&b!Vq5&zJ;#xMkb)l+6zKv-|vWr!xI^n3$~xJLVzp_XWG9B8;nims*`qewRt zY~u!UqP(v$nS8hSx{*gYUfAELr}zbE<4x*W`ViL?HQQE%PfP-h7*t37>6#&r(3& zSq88kK%Q78vFCx`S(dRcMf^G2*iz6`OFY{Jj4`dm=6hRAYp|5ajNB!AlT8P(H|^6+ zFx)W%)}+AQ(Tz1-!Dlv&HV?x8tSL2bAkZor%$JCxOBb2NL{Z65bAU8K{Ga&~i6t~x zrjfq#k(U3+aok)>8d=3Ev0%tQ=szrc$`&ftqN2#ihb=bBJ>n+Ib?P*Hv~>_wjcvAW zrJcbnvBGITQFdzsorGjruP_E7PFbHacEab`dNI(jX|{{!)6Yd>slZHaXy zZd;|wdLDPVY?U<+e^ENoYQTRgI%0i7$QFfdLkZ9GxwhrR<2<_UDACH++90H9%&9g8 zDV3(MRg=^dn9WG~LQ1!Fk=GHhw#c0^?z(*nr62aNJ({9GKeW@R%TWz>6SW0NwRh6` zBI4{%XdB@N9ldEl*lEXPS~V2xSWJ5k;W;+Z$Aj&*-pIMW66+u2R9~_69de8>!4`!C zI?8P;k)KR|+0LQ}Ek+v$JyF$ZGohR60Jb-nT~!?WG|aW~iS|R-Oj$oW4Ewrxlf4|5 zR$#Y#agPKP`)7Q79@Q}pZ{uhqgnuDxPK5BI=_&_=;H8osBH~|UqNAF4nkaTSi6!`t zj{C%0k^b2cq>GsM&K;yLXoC|;#-c<{2|0kwajGao5UEZdWhWf!d`Q7Zn(cm2tk4G6 zV9E!`1A7(xsK1}R0>01xKYJm3z3-j98D8kzV!wl!V6r-fASzp-j(?H=s)Z3ndPn_M zhXi#&nc@hbzL$S-{6G_AkDc={y(P1q(HLxDy%UM~CWJT@*epK6>BrvW);mAocCn|s zCgPL~t!p*zD~;)j#qXxjT>yLmN$Dct?-P5u#DoR-ORgqDCiac%CgBT4;~q?;q3P}g z#Mh{E?yaPm$kXl^QVJr~okCK=(QX9k1x(^*kcUG%o$H`Xe~NQGlo**ypa6fO^B}at zdCv)l9W`e-m9PhG3!T^D5KWvb3K7*X(6tF6t6t?wM=n(OTt&!6xyfZmEidWqdV$i3 zneI{OH4*>(8gz613HM3NLLSGB#z;B6-4g6zX1?2m&7kMFuVC%e4EKB7Br?M@9CwNM z+%prWA;fyt;=bXodyeAQVMQJ^-i}H4ND1rEJ3Sgg7HW&fPbftm@!TOiL|pK^B~F7A zyuFBfVJ$8dIOI1)radw%!5V*?%M2Og%62`46kB?^$3U02S>69ZLz<87Tv$d!y}Jb7 zr~0s1 zvsuaB#putB?cV*ESlUi+GNz7_;w52wkz8IW_7HKMSA`Ye4c-9uG7jN=iW`UB_2(>uH9(Yuw_w2gTNay~AKbE5~}*!-^vL`Sb9p(vw~` zyu9dbB+oy)!0f$`kPAY-{>aJvLB178A(!ksiu}W#>Vu;)n7w^cRG2=**N$F9UF5ro zrjWV*-sroeA^yKG3kiAtl^7sC#vhH*$p~YZ1?x&Hh`+Xu8G!4XL0$4va$$r0fo?LZy<7fqkeZ;-0{HbZkQWk7=&idF~gm~AL`pbG;-J`Oy?)FP+*(sGS~YTt$2=77?7GPf*H z<^$$_cWZpb0E{)!=K&7aZ}xoxinUb#bkN+UIR8PAsw45BG`j^i_Qu@ zM9)Prf?v_6kWN1-2M~A@ndy;<%sCx+?&s&UdM5bwxjU?0|D)VaeNA9EAW8cxunzF4 zDHJ#dB-M=zFhOIhYyl0Zq}(020iG+L66^ZN6Q-E`Igdhd*LAg5E2*fJ32Cst# z%L_vTK!TD@p@raaMdL%qz(obiLQu#EK~6{tq2_%InIYe}g3w*)IW{uB{YUr@K<X(O5zF0RoAs z4Szr=(f*G9h&$;1L1@;YV0wh`?+c~{Q?oV(lY{6imZvf(&mLmC5cFmj7>)-&<;>Bw zgr?V&kgRA7c>pg;hlM@?p(UE|MBv9FZg?jMQBV_31-%u# z4fDVmd~moKe3LghdnMbAh&wv!U;)D49VU1beoBWIz5zGC;|e?tySd{Lya1EX@fq$z7hscpbB#Q#!*{;r z6>hGtvEeEHP^dpo723!1Tyy1(mbYC6^1 zeL5*f+tpp4aET`C84|aUKDs9&W;Xp?kNC<$dQs2qs2uv;;GdWK7&C)sFP&tZ4iY1N zGqAyy3+)V5@X>iZ<9hGt@Epdc-c{$anG<_YorN*i_GX8%m}h(Q&lpfE-J^97RIYn_ z+j!IqH>ds+I>P;?ax2>DIbAXi6X)^q_}C@htE?K_Kwp1KG48ET7V>XD@}EF)3HSV; zVR6KsKoN*fYVF(rSV$&xnzKGo4tE{N7)ZI-)t3yJsnXeLwE7>ax?vAaLc8&j1j@4h`WsSLGA?}BQj_>AH^UCpNF4d z$a_bhJHfE`t~wjR__y~|SO#-sZ_XJB@|x?h?ksAMduUq*D%yQoISlp0-B!6NGHgGFfPYRVi zXYt5|o!`@|DLc9VDUT`FyPhOnpkC}g8vl}N@0P~4($;lY2+sg&FTjU>(NTJr60< zu|jVqt{F%14M2XyZ}I(t3J7!jnmjXcYT#UM1Zip@nDsYF-&ve~fSlbmJ%vb_(#1;r zO_6o|h%cf}?hcPlqSCuducp(6cDthsXlr^_LAn9yRXqHqS_JHmPwx9VXnq zehp`FT5D8QDt@H(PU&Ji&_)w5@VD&K^0Np>?9H?#1g|5HP(qAx9z(Z~R=Os`Q%N@W z9B>9X$1?$NlQP0PDVs*=^;$E^s3&}aR15Wue_`@AT9&^h!B1-m9Ec;(#|BzrAoTN{ z3$768d7Ydn9X+#a_T|rXNGQuFjPB?vyEu_Cy{r7fV+OekbH0yJ*wq={%%FC!J||{W zbcdgnF#_H3VHW0y?#!@(Qm&h3hGu z23Elq>PF)N#t&+#(L)B%=9$B%2{4buG2qtHar{{uz^N;7rc?BocJ2>3TL3y{Gd&$tZ5)A1K zQ|lpp2gBETq4_D}Wh=fehB>n}D2rrXX*(`{#?-ex<$YnT*2vhsEV_0N?JVnq_6;$K z4Qy}44$2?UAw`bP=jtR-AZN9{9JG#OGl&6exkruk>{#w?)0vEG1-s3ErNtD8&B~OO zg##_il2#P%w=^YeD@0j-#1RV()}1kLc>S#Ks~NmGR>zeoygk+*Q9fRxZCNCbS6~af zOygN?&`UyIr>*9qnD@YTEkeQjVIOee2B)h*Z@kR$H)I%3aIQ6EwawwYYhWt9+^G$2 z`7`c`#=lC5TtTC}sDk^x=^rkoAWA)sIlG`qT~AqGIK4Rm?1F^o+Q_ij(xgm>b1xL;tIV#d^bES7M8A8RDZ)7Jo97MTH5+8XS?)!WD+6 zm-B?DjKeNf^QE=tO~?7d+99Sre39a}b|b%`c1GiPepl^@niKqAwT04tf-QAJMJol! zItp*PpeK}Vq$=7`|D1NSh@qsCGK$`*4&XA2lN;utdWxSk&V*BixlMB+G~pNZ>^!R| zuXzGsqv%WX`|NAt(=FwhGI2@krgX9RO{+dtQ?j6KZpyHd<87d%_!2~$BjH|&QZpu= zSK`qeh&x{LM1zbSFBz&)$Mlyh*F3#CN^)E~;>s+^743%Tm6AMdT+}7edihcF4$<<; zALccpC6%u_7K*mYhpAVJ&dE2_(nVl7NER-tmiLtuiXK)S6wt+stGwL5#K7uw<_U3c z%@WFok_9z>!n+cbf`C0*@}@Qu`CF1!7jjrg{;ki1tS!w{rsOF~Z>p{U4uo9&f96at z<2AHq%__Ur7?!cNd~BmG4HqK(f22Gw&uxlLjxQHBX_Kaww>P~@=q|sbo*OTe4pN_r zV@YSI*|A*dI<+~bRQiwl>D6Xwa`Wgb&q^`nBFmCeSos;t%+lQQUAm8@gz}3m%Subi z@%2@ux^kVIRQgOhy7YS4RB2N2-LhlSoX7i0aq7PyeM&$|By|P z%oLB2?T~=@&9XGfEzW(Jtn>mCBm1vx6qQ!FzpRP)s*+J2iz}@BS2_)ilOL%VgJ_l; zWkX>rtCm#`1Usu}mG|>1t6s}X0IKSZRmXEek$qLYp*}Qe^~y|kb!RmxV{G-8>PKmo znrStQQZY4~YtE+}tGQ4^P2OFTS>sMRSVK_^Ner(ME0!gs)@T%`<3&|Ri>Fy{RUIz6 zZw*%ME((~|SA`e-&@@%$6mMwEtYQ`CDiBrbVnfBJs++c50-1;45z zM2pzcYK}-quc^KzK0z5%vrPPr&{30DqQX|y*d*ssor)Eu5r};XUfFTzL&fLv8cj0fFSYaxBXKq&9;Vo-FuK2~v zQZJ~T$J5mvtUb)1SlL~h#!oC8RLkPG2~D+4g5kWMwKoKpInufjf=*^_-PWRQw4rsV zqL-xBI#V$QUtT{%xEkZAKQFw8T3xReU4y%o6UBOHtrA)y1nZSnNnG9|)tJ)pz$2E%DYtDeHUY5O2Pj47pz9tRWFsD2fb~K|Qf#XGXkwX$dMlPrb9GDUG2%Q*t*|*SL)}z%jjX2lIhrO5+A* z&~~cv9BYAoK_irfYF*k`&U&Zm7Hlhke^gs)|8ar!HZ}j zaQ@&VG*xns^`pjKKKBZpCZ6*NKsRc){*VW3x!RS==*TP!l-_0j@ba+^E z1wRvtYyKkG1pd&nN}vTLw45(m0({mIY5@euT2w{Pb8}l9#S3zFwA?MelD)d+dvQ_L zw$^FIotdXv*9iw^q_^%Du1^;>FQ?TzY|YDPe21lZCXHc-HSeH3F~l`rr5|rYHdE*w z4cD5R8S50H=KG9t*^ib{%(0~pTGlfGq8%;a%mDvK3zW5}V0;UomCOdVw6Z!Fvs(IC z->Lmu2eHAV1+AOeAMyCsjC?qDLTf!|IqGFwKhAT+*S1q!9ei<{uz(8Xw%smV2pOXp zUnl|QG@|3o2+P3n@ zw%;_l*rZuP|D%YeIYEyptk$H`6`Tng8vPy9ppi2+(PSDEBa3X(ykvYL&eKj{#^Wlr z2bga$P%Vk2Mq#v_Y!ITZeMp`Q>?qig!{|6wfXc4wh%2bhx~YvIbUD9iBMJJDo((lJuF*n>qfI4R zDG{N)s|^yrs4uq@nog{HPFf=1!Mn^q;8TNI@zjPz|oo*R}jQUfT!`y_R z=<1n4_z>MKRuq(_AH(W}oYn7P9|kYcN3%=wzUzVPo4_}EM*euf4}Eq1LBK@4Egzn{ zP9F@lGsJetajRUoj!N8o7q+7aH_iE_LxY2wi5(Ac@7u5G#^Cdsuj+OY1}M+yG6=Nl zKAo62sp5{#MP!$T>HZ@P7A@0HCuIskzeoxexb;!wW%(#QmW*Zs^g^IfrKE8 z48}w7Ib%6<2IwE7ni-iFW^^${z(nI6W-kD1e9!!r+p0IC``m-|7PQMfNZ*R?a5d(JLkzZBb} zm%!o;F$xJ^I98*cc#73-d_=6JKQVqM{-7Q*{XyD6a+{Wucm#pz5a}b1Wx5>d5-T^6 z$r|)vlZld!#F)NQhaskz*HW3V`{oO@vCuj*f`$#{=WuB)V3fIz_6$Tf>*$N~O3Xfb zG_cM5fKCOxG3rCx;RvG%Nern533ab9-bP-xZZQo!$_JW0V5gMh&2z9tCCTOkxT(cLb2^UApJis@2Xb$j)%XndHFGyUz#L%yL|8>j zvkW6-lmD~KCo~aFmR-bA_;$-F;t{Ohl1jv3mRJO&@hGvyM^Yl!SqGE1!hczJkae&= z>lMmQsLBeY03mWKjUof9t!0z|$YX7!4#|6BwNp3e%{0^DVE1z~4W8qEW=6u3-72#X z?y){JTM;Mpm(1@GciM(n<{`5hXIf4mf7W(b;3%T}rlkfwPMTopMGGV+t^F`lL;bTW zF@=H&)-%}A1-(`j7M*{?D#1Qu4YN9NXXp^?BV0LksP#AQCF#0t4t_o1x@|2Uh6nV^1R~z)$Q5 z(jD+XJCi&Cw8gp_TJAYvT?G|-j$7wL>7KpTJ_U@$8Jfp&*-v5mvwqq^ zm^4PFU5xS2hT7Y()5y2%eb^Y{P5XOnBmS#nF!n3%gkw5xH%8-FgF~ZtIU?`_QG*;r zJQs1@(M*^P*E%{0F|anrT>=kka=a#ZAwkD4;sEeF=Op4f@G_ef{I5q9(mNq-1A9F+ zwm!%*`)vCFNR6S^z7o1hlV-mRZD}gBQ(=4SkJvRZS9PBKIXq1Ehhr+dw``zeH{z1` zpd$(KsHn$5M@I34jwa+it~A8?PqVK%zN0M6qs|%VRkZug9cTun-5G|yN76XcG3yD} zoMa3dA46uo#(j=*Fhe`c;e*UpZ*_cu z)Yrdv&V%l%neRLS^~m&25bSK3+F1g-CH~=b!()n>&e!le{EM#Xh^T@@*EU2~z9_`` z53r`Vut*iX)+IwtrqV(l{!B8IdG)ghCKx1x_hxusLK5uTL*dWBm#BbOHMpc>%Hg%16AI0 zPIlgK$24bi9^TmEyayVqCAda|L~5gJGkBE}x@nPn5>VRS-@P~Q|Ni-m zJe_KcTL?O)IOcYOZdZPAe*njX`djCM|CJmJx%xAO_dI!!XM!eAIW)Dq2w zPDbecSCL2HxBNgP3_jUAF8h{mn|D;U%eUF{BfHVJ#yd7=p!1Y>T@KpZ&wD9%bo&D@ zK3CMT$y*Ot)iBC?9bl*p^9=%?s2b>70qm<7?mL$kTYANZ%zG~G=PLhUstL9ckP zeeb{t1*`m1!FTfO{o5fISZDl~AzH>3KLWahwm(Gp>6A==EA%$0$KMHCMLg_(4nyOw z`G3K*xWd2$*hlQuz(V*I%;v!MP}297z%jTCbvSSt?hEKd+My@V^HgFK7)+0~tBn0z1IlS@#2%!4if& zfPxIB1p{J8I(0yx8PZIS4+J2;iMIpKpkaixz%M8ZzoK(I)Q_Z_^qzjTlMg;cWp~zti^v~49pFc# zw9W^R)r8-jUm#g{L)QpM6^`2VC*(0Uwrdr15hk{4H#8az=sF6ep~zhqpl!&?u4L#l z!~^tgcTm3;v&}QMtsr#nBbBw7_a23O05;1zvE)5&l9$7$;BNYsu;utxpN%RcNc>5J zqeOOK47z}X4>Z7I$Vr{Y!3@f-&U?V|)InXz*|(@|UC%Qfg=l$X+BDjYZfi1veyL|^ z;&{5D2N`#bv9Ko)69^IhSy!Gi^udVe)r@b!{743KL(p}32s1AD{bB=?(YrVzh1u47 z=E7R$lV14w`K&R$W#LO%%X-b{*0KKXeR%dDE52`FST4H4t<_IMKXX58Yr}+lwks7F zy@ylz2|L&Gro@L;cw_meaZ%nk>?`<{J|gvKh?y_OeSz3DN$+36JTSJs0EZ=-oYvm`cW)o^Mz5 zjEvx>=%EZnFgr4d@jO_4=>c(ny=yLvVHWg8g#Tn3d(q*;n74b& z&W&S!>ouKS!1}ZIVc1#pF?YW10~+8~X(pg;?k`F$W{>AW(&x?-fEaRD=fmu66n$pdJBZc9Q*h>g#ROQ#>{$%;v&%X{=!Q1qug-=o}&`N0j5%NbF@^h;7k zVNi1MeCWA&BK}}J34S>rWRCBh8*XLp>^*!gz`WF(eD)?2)Jq9_%@p)jhs{RExcYS0 z(0G?mqebi7BUCfd-`zy{M9e17KP3$qqo<5N3A@KTne`p(^tMu(aTUJh`15#@PlqZX z9P!g&dx-l(XB13Y73csABQNRPn)NQUvoI?C2?f=~NL@>v*F7kyimLAhBpj!0=nllq zp^1B@#muBn>N$R8KYd?MWfY!{>bZOQU%DYU=~4{+SMboq>5SPy_ysRxPq6+xlaU&{ z7LH38Rp(eXT^-iy(_|+nFD&yoOy`fX#K1|gpaa1+E3%z*5?fm@ZGiz)dL7? zY_d`Zfp0%mw2tt@{)jV;c-4WV1&DW@8;J)j^GFPNhxpUraklQ~Mt!Yw6*EsKi)$Q{YzoUyMPWhhnENj&?R(UBEzhjg3xW z^@iU8cdz zBAU!3ql~A|3vKQ$qBmOBpe&5d)_E{9p7cpBo(>$xM@HuBZ>CqE8Oph$m%Tapn zUB+^(-dUG+a~^w7UtG!^ZT(_1c}Cl=tFL(f+Sph4{Gqna=u`Yhey6=NB9U9wSYxzt<&BX>CAYCLp^d@yHPTeOxnCLsRj~zYnpTtz zEkHEY7B4Bdq5h{}T;bo%qnYwTNwb_{;tg&ICq(cdt+7UM$x)CH55G*MCjeA{=Ts z5mzHzZxF^t3a=RYVrB`chM!lS3+2Z3(Y->WF*EAA@U~GF`9%1|XuteRG~M|4@@heP z-5!%tkW~A@R3S*O{h%!p;OeF{A_Vff(={eRu&!7NEE-ooS|l&JP|xM@i)xkY^H zQ2s~1R2-+uC;eA!Y}k!^D_q|=34KN=Yy5#2BwE?@3EE#&qkaO~D4yFK0F;WwEfqO? z#6Mb-vnG}tY5kHhs-&n5p0>E;R@?U!lw_FZc+wroW=(P81xcFbUcxvDSGzc_Q=-&f zjxCUMX_+y2$rr8uDyww1_Qe%h>8AF{(c02~+V@BOEBa8i!CWkQBY$dUieAa@c3{Q* z<-gP%@tmr)wO_=4SAk@9F{J9IWQ15Y-IAudC={f0S^Zvkc4@J48>Fmknrb0vN*ShM9H6%B--i1+#PYq3&@6H}u4zI> zNx7}5DD7+ckEU0t(b8q=oyj+)r`4P!niQ(X#E*3oW>^a4AJOybLUL%HNb# zRQy@CudJ^ED*UH>OvTH>x8)~f;QU$TqRM%6OZnHzAlWb7FNYHTk``3`i3v!5R`*9* zDpIR&!9G_6Yl4ti*Z1{*Tg^+#!!u4NpSLQL0^u+453VP6AwRRh7lF<@Z%xaW(Q!4gF%T$(Bi$ zSue`|DtT!=Bb#4x+we`cRWh(GLUvBFRrOs4mO!gN$s`i5G+O2?T_^_1zLeqwb1RpX zzU7{(OfJh~eyMCMpF`^}?_X{rU6CJ<#^MLdxfO%aZ{;5R`oQJ9ii6k8QP5*>=OwQCa|Dl%%%CQPh)CY)$nS@pE|wrz3M{bHX9QT3(x zr*=^FWZ|YpbM;0cOwm^zDRjxsRO3Z6C7|kBQEu_7>g%H3!i1VJ;v@NEYxann7!zs; zC6_6Hnn1}n;#|dKNf~aGBBpdNdaa_p>@S39=<-TE>) zIr(FKtK5-1y51}Ql(aoW^*7i)hIFXyU2Qz?tNBMQn!mPPR9ngis)4mOzNN0X_N8E& ze0kk?L26la-DZJ7G_NkYXcGTQ9kD2#JF-q$)Xf@O_n>$eEvap zv;e!T{)5PYVku9Gn-R;DiV_}dwCWE@I%KBmLg_ltUR7!7ePE^PQCS8cly6@a$PqTI zD_@o!)^NEToi(EYU2e{J*&rzYk$$T|DczLzxWOe2CHplzkyfNmZ0sksryNu^b7}TQ zWh*z%Uazd@MpzFieO#e#r1A~-W%Do9q=J3QZK_=blB(OPgn}Q^xhiVm8Sz_HU153A zW>t6Lw}R)YkG$RNcMY?7m5h@ONBQF^pBl(~1@TdXU9cTLym7eTUrbtKcu@hWe`7^) z3jB8CPvJk%=S`PH^B^;uB%+%jOw(;K6!=9wQhWyhS8poWn!8zjp@f(HLk%f;n&nY* zB{MSh>ITWt43F9&A*J6|-;o&7KB@ncJWpHPc#S>7k0$rx;?YW~DXZnL$_X7n{KY&pt2qIl5)U^Z1A zYY~Q8nAf!!S(%|mmisKD;8^Pb_8$dTTNkn;*pAk{>`+r!Ya;s#^+GErKaB)!_2z%U zKWH1k0b|qK_HskH>1`yg2YI6HdVv5A*DNTEgFe?}@fJW*HF91F=$ppLACafhyyj;C zA=-)jF2E`6D#75~gWBDKeK|+9rv%{ai`qCrbrwL26a+J?+hQqQPGws>Mdz$*yG&_t zRJI|hqm7QXN@||wds`RvMJPXi04=8Opk@`VQ{JSxK;KqgsX@_&C8IQQ`q!dfjhAt( z@PpFht|t_h4HlyVHcx1L(Kmo z;%9pSXCgeQy^nJj`ftZ5ZaM_ev6p)XytN~?;0S0y2fjcB?CX#eya0GRS_>!SUhnV} z?$3GNajOuPGoa(YLPhpw?Hf{m*J14k;+v4ZB0h9d+Q*Z2n;y6CBGtDqZO7(B&i)6soBEq9br^I|8hqjZ5h|wL8E1{Asw|eGb6b} zPy0p1c08aTAwAL!r5g!px;2cya65HZ84Ao!os^l0O42=NO+y6rD_BnWS$z~c9{Nzv zWZ!_u^rrlOz!3fOd^IS{&@cZ(-eJRJ&TL?qVHM{PAjxoulbuU2T;x>dXmsoGS6qJG z2K+gfPqzer)OAXC7_T%tblHR@9W!*rg!1M}os&3U$=7`%me$PH&nL~2Ez%z+6_yJ1 z0P<4X*+ zwCPx};TEk3tvAl1A4V-RUZKB5D2yTo4!+-LXAXo7GQMLXAl;_v%-7&r(`MFIP?hN* zD#yp8cm6;AmFA6#U2QlU^t8&?mlMt2lFeWyD)EEzYJHgVU|(@8EerEFsN~R zT119NIFm|foPgh_SZUmgH&yO5W)OCkbr_2YjbfqEL0niAFuoyDdB;stiEp{1O?MNfO3NQ#R=}m1!c9*O4cgq+}A|k;zW}h`VdLOWBI~XdX^!L!UM8qoyD`&2ZXi zM54Kg#)hvoU!xC){xbih!ywlzv*})NpJfC6J?N2TA7g3W2g_+jblzx7B7+IsZ#s(V zbUREZQMQmC40T>YP4Vb)R*;E_M(G}#bm-r$B-1ktp@CzbgdJPE!n_O1m+v(v<7SoH z%p9DkL~d@wPc6P{zK>_{uUH1*e-_NP{6&b%|I>1iU}7G$B!{}BRTcy>p0d@#BUX?` zSei+L2}3Mi(rMgG%Tp2s1F%jYk3qe#9w9d&QC1{n6XJ-qk)njpvj(XPq2H~asW`}Y z+em5+WT#J*e#*_oF=SV5N*ANTT(dR zHV{|DS!|n&`^h?M`x_rcx7cFvN@|!5ihoC5XyX&s5$D_L2`Kyyn~k8sa%}erA29vx zqlmdEwtYMC6Eeb{PRc>7u}etL;S=pv@)_7vdytHV&a*!xt03#_@5%SUCme$*6F^w2 z8urw~3+Y`?p;ZQRdPr6?e7>#C`W!AW?6gfn%x?Q?+mDbp&9LPl*Vfr>rO1w|H?{!k z?+UE#2g*^JV_%LA^&r{9(V;zFI|{QSl%J!(G;$}|yRoy_N9^CQct*Qp9`*?>+_4?E zCe%NB9tR;Ub!6jgghLK2egsbFD8L^H<>yr6F=(2@hyQ>&?)XZ8Am=(45WXY&J5LkS z;3J)}#A?_SXD0DBbcqu|8Uxwq%qMLJL+uBki#%WK`=FCOpX?hUzdVoaXP{yBa61(0 zG(5Cd!j5Yy?7gtQrf$a&_?3E+VsyWP15x?7#&OojTDE1f)8 zbj=l~3HCzv)A&x`m2jMY?{V zy!21*S?HD2pnE$SPwsPvp?ip5-IE>>=Q(*XBBQO-0RtcI}dy4IfWy@`gvk-t#er@V(=folwC ztK+0=1E|IL#uW|Tr!}}};I8KWE)66`X>mP)ysP=`9uI|8O5EFFgUUtjL>RT?m75J8 zEyTE6;WWWn_ans6!Z^=x1d=21tVX)1=Di~GD^PDlMCTWw}fc_3<<;IgGxk8LazSVMg6>sU?ScG?4Y=V1U|nfx9N5YS%hd6qY@rN4Jd9!u5jJph_jJKdWDlF4meF?gla>ve(KOBZ_o zgX|OOebXVfBED}g^f0g5mkhOYU-=lY-T5g#HB7_$!`B11iYEOvv534xh^MMLWrM}PLY2tnU*&fG+uYLSp9eVHpz|6qMg#7b+U}H%0JI}+S2&&F(SQS366A!zM+uO;5Pr**>RKU+-rgfU&O!SJ*Znze8 zu=64O0Wz-hJz^q4x zWffvO37~7-!JTsOKDMIM4wf+sIv<07(aX99LL#W0U9%w7lr3EwA@4$ct|y>diF>+| zpg6*iE(lbQ>+GUHzhJAnM6eB*sxBoAh}L%LVb!SaE;p#2tofr+5uvd{}JIWNff|gHj{Ck z^WncKF`Zh-U)0TA$AJp!&#t~4Fs;7(Tqcr!vD=@fr{C$>m@=PnzNa8j#W3}}jE6J- z3~r6hU;=}ehU7KTEkk|yZ*9_mC&1T=^`t?mveCEtvMTH zFYG&Yb`XZ)S)zwy)SkaJ66_EURTYj!c%I8S*mvIJl7!G*H1WG}?|p08e!SGzPOT=S z`A-oJ5)b)bqH&}Z0W$nBd3@(0a31+nrw-Vk;^{h>eVxkc>dSaW`@8#G+G^VMZgaAj z9@DcdaTEP!4>5ieV@pqOY<~tfIREMt#?xS8bQW`7P!btp`@w6M4>1dSM_v5IboOqK zXlK6djlY0qP3>iz&tmQAZ3>65l6!BQqqFe6-_A-{6@Amf{FpemTpy01xXZPhFx~D> zRb^=MvQ@6cQaxr#5^kz@8b64mdO7S?+*jWbYBIhov_JBWfbwUdR}xQ$<`<7ikpU!l z33*%Rd_X;ARi`k!kYWtYFG$qft}m$`+W79&C?!JV(^u;}!g&*-HLSTHP-%xDdgE)QgU4z`8(`O4sn2n6$3@5~E3nR&hY&#z!s^u~m5V+MQC z=gu&{_7MSh4BcxZ5q9WkYZ!C2M8>isWFD&wNI`l5*ORaWoL+d$KoOjX`-Wy zqai_^o9RH(d*?Iab27>$#|{X!&>#_f3d4hd(5d^p$MgD8si9dVo_5r~EHj_>*#98S zLC*<5Q#LUE2)szV&N$s!9?xRPx(3Cfnf*#VbkW#~#X<3HXF-k1| zp~IOAtT*A|OpC1%Y+~)PR{>L4j~u|9RCa_jGLy}|>6)1KH9y)_pTfy+bVntf=ZtsT z5>9fGJWJvdIbx3}ril~qytz7#JIuR0n!^3Z8yR(o3-n4O2XhO(y_cL^i}%~b4(@y3 z>4x2=^6)=6ZO|8RIb)O*7uWVwGx^wggxS64vS7bs{AIo%(sB4wg&@O0y4WP3JE|fc z7eJdxrWFP7roE~laZ66C{O;A;RL06Nh>RRDw_2M#gVT4*Z6t7gW`4fw=s#W=Q#s8{a(QgPhG!V#HLQ3O& ze2VaG;}f(^6xq~)0Eqh3QfP|!Tr&eC5nEb-z~LpkT94$&N+fOLvS1}|+Zr-}lHHmO zX)Fm&Q=jr&(yX16d_wYAo08}#ovN)(K$Y&-evaQ)dbNE=-0)INds@twQdxU(%)nA# zyXES%(wFU@udFNU-!VTrS}d=gZvH5)tm-nq5X-AP9XG{>syFJ7;)m4>>!M2jsLra~ zP;#KUM*=Is*8EchFLBpgE0`sjt^l$QOLA(LP+v(jwFcso(lK?BxZS1c^~+JuORv}e zgx@YZtb7k0Q>ImQg5c$g8(M*r$|;ScoY&>gn>J>BkgjZUWsa0)s86KFO6%3;)NbkB z<}oQJDh4)RP5M=_thqkXP;t8XZ33eL*fK31RY7Yx9fzx^Xd%aPDhw@}n3{?kEw``U zD!WyYX9otx9Yl#{a0oH8jLet}1MJ6t_9rEg9%8Lcgh}d+vL;A6IjvmDCuBY zg1kNy)8mxCt2l&Dui8;@4|Be%NM=Fes=ig`!`@cM$}tdnwWTT!lv1;>dR3@DH?#VB zZb6NzCNuj(&BvObSxJgTim;4lio=TP^dd!u;zwGff>(Pub&aC67MQX?;jOJpUZQwV zdpBvL;#=M5#N)M->NX{ys&S%0Hh6WYc;1#*jS`wn)@r`+Kkb?7me3SyQuPfHxOR0- zf0090TeCzwMbcGsQk+sutAU9_pZhh6l1=$(HTO%TjBLeX$uUY$ktz8%)HSLqCE-#O zKgt%MS+&Q@J|jNYHkIFlaqA{awUE5Jq>2I%yskrb3@EK1A$tuNS--C`6qj6|RrxaO zN4-eCBU4>(l`}J-^-tuF)BjNpsG6O&T{*MraOwf&wyMmO^U4!dWyu-J*s9(namc;D z%6_nJq@cfjPu*btN6VhNxq=n#&+GOGvedS^M1ijET^+e-q#RYJC^}!JuInt4i9mIq zi@x$(>Sq_9;KtM+EpBC{)}w_hXr6kb&`Sm@hlx@MNy@|Gu~?dtDORA~DW8?l5ERt` zNeV1A#QZlwAgbr3-$0^`C*Y>qD_NS$Q@@trb1pUiA?eFr(Y&H`V%EIoze~4eE^m$~P0QHU zoK{+re!3Z3>QBQp#pM6#XlzPg|8%IDqS*i0`kIjWyY#B2vV2ynw#k|QqG5E?Th8Gc zlX@zrTsB3$gY#YTpE{a*TDV`0;ui6~t3}*b+!1O^!C_Xq`f))qeSGuO!l{&g&BqGM zi3>u^e-)10?Bw0VOm7*(MZl5K(IOtF}Ky{H%{{>qO?Pp>4-RFESUjMT_TVoNYPIxa*8+ zImxg)FSi_E80?>0VwmF%FI#ZTG|kACYG$A@wWXW2xpr;KcUEyFr*$6dYZn@mx zF40UXP$4TcQH2@sPE9p$BW$PU6Yo7luiefs0*7la@_&OyYoUURz;3Nb&B9YIq|Z;^l2^f6|aztsF@pi08Dix}67XKIfzSMYXfGnpt(jh4kU zup+dLthw|tCX!eIYv@f2#cq`#yGVJ0+itUeNC0Y(gIG7|(eQZ|Ml* zHo!J?a0?P4t`1v)56tLzQn(s)PB*xa7Rt|GQg{crP`8IS2(UWz!nrn-pC8Lh2<7L4 zd4-|;d?0z6i`fn#4-9E$C|BCq&L;0Q&u(ucSG32qKc-AoKj;`uVb?oDw0~svzK%#L zvSN1!p88r++fhY3D};AAX^nhI$1D2ig7Lb+^b2f*ZZW-vq0;T3zo+_iQH)LGRXP%* zgV3&1GUwrFy8Fx$3{^jabqv*@k7m6`&eoT)g>bR{c78Z)ond6Y1@h6bjk64FGhE@& zKqUqg=RsbPfyW&Wlo{%{TL4-^=;bK)n&CP(KX;_AgFtXk)wL6H-IH~7gcuiB=OySY z19b0+p%!8NOkzdzBmGg*eC16&h$N|r(M!pH%2M@yGOP5V{sZ}!NMo2qi4W!H@1>Xv zuNb1K6FE~17-|e_q@jo^qpviyP@jeVQrBr)NHYw-X%hTP<5K#-P=5X;ItlZKv52u2 z1u$Vx!;P>%hXQO4)QE#>`8lZguPJ<~qYjN&P#WD=6cF>y%uxo1r(@;dfWQ-Dlm08CHFebk`2 zA7vgn%KRrKo4CTfgK`VM#2iK4jy+(;QRV1TvzB%eHPieb?KPsovXq`0iVHtVzXv;H z$zq&@&a?0sD#$`hE8{=#W{Z`%5Om1W!@Q7p#qx|v02Z38=zl#UOm=jSXSk^yZE%;F zZeb=`Yt4f(Sp5w1I&8nz4s#@y)ZjG}apP+f%?&ud9A&KS6qI!YiA6eT{fqR1aMXH;d=!^# zjU+=bIxCL+0=?GSN}(cc)>qWA2v&&m6XA)r{nT%;y|yG;6m*}BOsj#Mw~1+faJsFI z_8Ua98R@I?IxI!Vdmf0T5ZUbkS%^rpXPu=KHOqF+Vn=cHotAg#DQyVrEVQJt$a(~` zv~HIbgi%#RTg$NY_p`-`Wd%QG}$%}S1l0P4&tX5#@I6PL{5T@fq%j(ur(46 zG6vha2*p&M?HS=FImteVIEff%pG(ZdW9%D=W!UTXoq9dZ2=Uct z=_d#m)C{@>ze8Qe*oix+9$=JU&#NCY?qDL+@0erIY|Rj+D@vwp#JcL&11{08RhD5V z>nAH!*bpU0`4M|xHd8ehccJ-~${qKne!Pl+kFD%cRp9@Yd{f;ekP8H0w0}$vRlNpE z%rL0EiPKVj)FfhJvXi=yWSi)sHjwC|%j%D$&-^=@iDYkXv}P5#l6_3Gll+-^P;;8H zjvk_kphQx;H4vqYvO*)EJR#L+il|eGVHz!!1Z~rNrVS;`)y|_u;~lk!X!me?wEpyI zSRd^b`T%-I=(K3~t`YdLftXNIQC|bhRHCV6u zV)Z@j^QudlQMl;RRLwfvzrqcgvv@}C8V!puITO;<5%_77G`FG2$&akqPXy22;Oatvdax|H%n@TPu z9n?9K2Z@t)9+drr54u=N3;w$0P&wEmy4%!N3`K)O&Cx&5piqh*>#zh-{1aUk;hWH3*9H0Ve(4@T4V>Hhp~SJQ zM_?xZDduqfT4Dk{Q14E>LA{~BNSaEyphuDRljrHVBn%zL8SE*}*u&bg*cQW5ZE^svvgu~L773w=~wlUxNVZXdI_!} z$x|=KFG)z&Kg07ylMLhV|MBY$%L&K1Nrr=jQg*r_7#hY@7|_r`#zF%Ril-$Q@}XPQ z`Gy9f9r><7LG&Qy8U~0oVyxj6u?dPcjwUT8aEyycM0~N)g;a)97tp@dIL8JzJuj}lW`e#AwX^)R{tZf3 zY-5;?KAk_oup9j>`;y@*=32&3LlWjc$pb?R_FB?=!z1jo#5KlYxKm*MydzF7IA%P6 zU&3=UUc^&5Ta6I@J}cOmLRiVrf)RcceT%W1AOkCs--Cuw*v2=|Ch|$+FDQz%*fbt0 zBrY^9fNnzTP1}fD2&YU3iI?%=rZdDuT%rD5^ejWI{$=z;L$&^P)IUS1{$unhb**7q zbiX{vus!B%+X2Ism`@FPhNM_>4Z+YAH>F%_co&ybj5p3it;%N__n_LcpBlr^J2I$7 zF}gc7z}SM>kQ`%tfT>ArG7ZDdiQi~igyjhCn)YKq@_I}caYr}?6ND>a{V-+X{xJhg z_4tGI0h1mtrd>3>z~7}VHT@&ZCVw;A5`0KH^Fl%*QDfdj&_nml$KhWw%)ZbX!Zh<0 z=p5d|@G{EA@X_!j^0(ogp+EAq;f3K%)Hd}mvGn4PrYUjL3am}rtBq^jOyzT zjf;#ABG+nmnMOp`bdNBtjM~!n+vF3aZwxZgqWx-*m};WmROFfN#$Za$n@7dk6hxcX z#Ikb+%-(UMGO=c`sY{xlxghRmO0-#v3KzGT-=pp%?6gco?-IVWtU;Ia2P{W1L%5GE z*DyXDTQI_3!@^o}Fh3ZdEzQ`ibh5>QrP20VUSf^Z>6Rb3;pBI{V{qF@?|SFp@Fc5V z7hE%OR_|8aOK4NCJAN`DigHOmv~xYBLGRjJNu91IRo|lq>2<|>skaR-**j?whJutk z^o7P%qVM!~Mg`{uqs!z^7cw(V-${KeoLPt$v(H$TpgTBAEDf|r?IbpD#))xgEG2I2gH z6#tzS}#m@n)*PFfMyOZIS_-QbMaY{1r9Q!;EZB7Gtw%K7BWH zs;QYoVSX~7#P4Gn&9BiB>~sqz<|F4~@6gB&?u=e?xRTr5`zI9aUEg>4N-S@nPZu(Z z@6o>`=mEc?KknjyU|7HG!VAIaf#K(Of)V~5XA1?EfjIxU!m$ITz82x$fxA9Q!tlXS z-e-l0gDcM*61EMVI(<_3co6LsBpN-K?g@#O47Q%CAj@^qPAl?j-9XDy$|n8H>bI0C zeO&Px>LUH^?D60%wx>X}`G#f@j;1zl=XlcTMkDP#!^;#%TFP8u`h|PO8fg}x$FuHO z7RCtJC6?;Q08Vi4+VC*$wBD*~HQf3>hbv2YTlyH6I(aR9&x0iV`TZL%Ch*bV_m^V6 zv0r_DxM14A$g^RBqXXOgo(fn4k-ic^*Fc`nS-}TTmP>_p1K-Zr2{#YUIXzbxFu2pp zMaUWq@;odo8Kj=Vl7n<19TqY}cdezGd`Bm!aiMJ1Julu%(d)NnPooCv*(rRg!7v)E zpR>{+=h)M_jaR|?IV96CqK%hMHJ7zqLf^VeA-th|;-G!Ju)fz9_wqFTt{43H3;PM@TKL!dJI*fQm-K)0%LIQd zvc%U*uyEkC&s@RD0s5Jj0?a_^=|Mr^fZFS^pl{&0=MSOv;4se_!r6n4r}ofyE3bEM zrUxrM+xF8LN`CD_dYAH5={PXvADDB45vv}Xx{vWvosh7R>8qK>{lomI0fRd%jP@}2 zL;L^0nt6-aF?uV^Y|bRTIu_zwHav-%z@2PNjIia_n|6jC;w>{ec%n5%ly8@f#`}*0{K%6fNXE)D~_*hM#mfuMz&o#o>MNPm4|Zv zlfBOO;~wjZPJhT%$mfXP@m%DUf_9#ydkcFre@ypXng^etNFv_n|LqCG-4Sq=Zs={o zF)GKH7s3qH=g0@5nQBYKXi=gjIW#-0Re}R$EqJMbaI^nlr;@OtOHHHKJP~t{Ig`Znuu)*xRG%>~S)@Ng)**L`8OFYgv z_6#ImY+QS~Oz7XTKvplj)cmURlaSD2)3{xj-?FpPEWF<$DSRMW(rTB57SUQuQ-q=~ zZ9ehQ@yFXiuixii_$?N)C&kO6_ufC9RT*)8;498l1$VlU_935o9HAZM@EI zPEKeVPCt_TuSrTilybQlA{3;&YVpE)OMF}1PzNLr+UCaKQ@z?gN4`w$Y;TW1r#W|o zg`G%ablP1zo~G}Nzj86%PG%j_o*p0zy0j`?C~FBSPH*WN7I-H8Mc4j|vofZ2(J#Eo zaO-M3e>>w)*UNJ^GtSGWoqdvlmhbTYnUO3H_FpdfT=_{JCiz-fDGyGys%&cYPMur% ztj;}kch%Cev{Y0TIsa^GP1XAhQR=tqh-7No{u-P3`DuAIt-M2NA8U^@AEfWCeL=mQ zo?DkgT9+}g{yP3q22OeyW6t=~;DQ>N8QeHECM@%ADF&2L>D;+idMjS7C7{k~NiRGl-SZA2g@XGPoQiy=84ZRZ27 z=Ui_iT_EQO+KSF+2MT6M4M4$JhPx`s*>_(fL#B|AgxEPfO#j zZOs=-2d~KTYa5na4$r^Y5EbH*|F1zB{I6h9!_%P81sfYD2mV*!-nc8!x*(`A{Nl6% zs4+R4i>C^I} z3wx6~^6HEHL?7~g7kvWz=N>PXu+sCzCF^Kk^PiR|$Y}+eN(B(3Ag}BKuCZ`f`7X@- z!qAGvaV>>6D!#|06**NZqSA{{RhO@~74=koh_EmEU5yH37q6^-5jw8ew`TQKc`>sl z@(Q!Kpr+&U$>Q#se<6E{@7FqBI$Zpx_DHZ_$?V$5AXLf9+JeCR!tm^0ia&+dvpW^v zfZZTVETm`OYql!P13MuX7OHbjmX;KL$jQl{Rx~r`d*O0NrT4aEl)7h( zt~*~Emf>EGD^1KuEBIa7p7Az&ap{Z91F4V8re&5V%`MxPHASQ>gRV_8@BO7@!a zaoH;RgYv^U!4!3QLe5{}yYeTwD#FQ%?Rn|gHx=3W(P%@(mjd^=zRClI<756*CKZ-P z2UZ%3c1QMAjV#h#_p4e}JSAdE)#+m2u$xs;#U-J6RSCr(uSu#ZN@iWnsnV2ezfxay zza;#!w(4_9cF3=aWXVh=uR@aYTFI&qrQGVKRFq1_wk@yFNDfNJRJ@ajD%Vv`mOL&} zSGuOI$+fOLn@USpR?<>$r;MsBPg|2vUwJnzUm&ZRls=j3P<1@Lo@uH|%5bN3R`qAR zCqJ&9ok=I|tG<$T6o03>Cwm#TrN$xqKeW2$YK|=KeNA2N<=B%ofAU5~8*AP2Qlflo zee&K$POOFUH$?Q;7Uo0YMYTQos<6!3Tls%O^J?E0ECYMa+7z6+s;`@0fV*m4eOpXW z9Rxh4+EZ;2Z&!3zzZIj}MK$BZ?G4PDl}Tf(G&NpH0VR<&xFl&_V@*!-=uA$HGTC2p zqvlO=m6%;?mtrH5)b36}^ZwLEr#xjB*49WUjHKF6sgtQ4b*oZq$qsdqX&z8*U1$1K zJg0tQ`b)5XZcs)wy1Tw2GYI8e|2k__Y>sqUR!+6xrQQ6HtT*~cPlq>0&C*GbaG z?B@|!X@Ac2aJuwG&c3ij>Cc?l(DDY`oV;uI>t4o>Q~juWEqbQG>+6dF*bRRbYY@7;f(a4 zc&VU88YX6N1EpEwKdj@@!6ZICu3>Vr9p!Grkz^_9T7xjf3)<6gOEMmRxN(u>E;gny zDpibr+}N778+D=aOWM=e_f7WcU>;7>{`Ab~n5HY~AEFL4(KEJ2Zg0xYKwm%H)R2)K z;n!r&P=%wK9%uXtD{dIz532JT`uPoNFcifvQmtxu%>OD|+&Em|-n_qYnV_<^xbdWL zYI$@cRv24&voS~5pVQT-5IJScZG0laq}*>BEz&3cYFZXQU38(zBR-rzp(!q2$p-7~ zB;?qYn?11M}KPFATdOJ0Qo{&TCXAVZMfx>E3)D`<5Wy0fZVQ9>WhuaSrNkdtj1vTwXgV$u~Bx zJuj&=CaPVT^gf!_emi-3RC4>v?F{R$bVeJ*j;$KnR?L1|0=1bqXY=uG-#OZ>H|?{zE@`dpTfr{OkK504 zpC@{@V|g1zHtp#=I`3P16Yl|MX8TS4945MBIKPBGs$-?VmU64ZM?fGAc5sE$p&uPO zVHF{ubAreN_qg*wybU&{lNg_Z+1^r=ylz09akCi+PEDFjKqdHU~d1U z>Zu)X!4Pm}=M2`+g5u5{tmvHiox!a8=|4L8?7b4F&T4k1IIGjl{u=My`H8bb;4YiQ ziRZ@3mUDVp{W1^kJVt;ln#-WAm8EhYQdY^7yyIZ~d~4n-sJUw!pF(i!!U|^N3|*xH z88)HIBwU3#-}OzHiryrjC;WlhB3~yu8h22>M?{PDk)IOP#YD+3i|$4j%XU!hwPrA@ zf1K7RbEW*&ddWPgCl$6b0=26>QdUCS)Hp$Qlh#}_t!os0Ls?mu8@;x$v+E+mDR)Pg zfRUEDu&a$ZD%H2^5%Y4=4f$B6Iw4i=$eJzW%lEJ%c+GMjRwHMoJc9L;nJee8chj%S zOW65f{d_HF2$?Sb#)&1q>|V~D4Fz^z&!<0rY1LaH4m|4AKPp548O$}MW{_MlD3+un_$v9cVyGw4Io&Ug3FuO~n1eonuc zn5P)a*euFcI5I?honk-Z5!Y4W%UsOrR75k+GlU8Ovx3G}RIx{Uu=`P9hB?O?HKQk=FiJnIClCKeZ`YH8f1`WZBPHxt zF6_BaXb0=(jD~hJUsAe3syd-En0TymmokAkSQ4s~k$ek=D&LXrWPel5A$wP7wC0?ob2yyVO?HX3lN(4C-H2wR$OSGox6&l@>=+s87)} z)OqRv+CMT)9Zg?D8m$)7Ga;Q?##l_qQom;8;vvm6<|G_lvw<0h&D5M=_F7BuivfOii=jZs)BK^Wge<{d}zx=RX6@y{a)371Y(u7 zdJ#0LbglX%Bq%Vd3B;K>J?bK2PUd*EnY17^L;Zu4nH;K_O}0&p)NCh1qEgLy@?*hV z4S}+oTd&EYq_E>PRg_yyu!;_K2E9acmwJpgQuC5Zr-W<1Q(H-&wBxC-h!t8F+DV9@ zJx%K+_-P^fZhWA&lwOJ>X$=fpY>xIOV>_l*`-*V|{ZXBVVe573Obl7CQ427!`fPO( z#;Dq<)?<&zZmGXv`&zO!4!Dc;cQqck&sFIf3?3@&*Ax=Q6h><-1aWQznA<-mvt8>5 zC8r(N9wtssS)h#~lEf>tiNr5p|Jhd38NoyC4N?mat^G-!%JBgs{O4G{x+UZ+23og+ ze4BPlcbYPtdO#OUaVP6_SPFr})QKqN#8bLD>NLnjcZbR#xao&eKjBa5U1+CqSp6;< z2P@H^q%~nony2VRhMAg&=-GzpnqKr6!%)o|^hH&fb`tu2*HP_eOmOQ$Z3yOz^pZ9a zOR8R_?ZQnc3)8;GNs6ZGX5km*P1Ehg7i0zN!U*NGhBi&FBE6+#>Ti?hk$v?a z$sQy}gAJJg{V{-f!O#%HVajpBEJHY@6Ti(srdr|78AMcPY=UlXoWT&Jn-$k>xTqT! zS8eduIif~__2=DDq^@pV9C~zXwk{u?Bz>pr#VoAu0AnSU<-_zVuwag;-Ww~+lj>=> z&Dmr06}X1iCm1fGUl#8*a4=!{;BN{rAF^`|H?iRv+YSG)uTp0i7vL@=I~n)k z`V+4jL-4yruZ#?QxqxLXCfM>KjB>&iPMq-`LB`55{(#0ahnvPiC+V@K`A`aNh-o8q zgVJp}K%7YCnobkO1F)Ix34PG&h zhBt--G1Cpt4CiCQ)prfFnD_DoLscxM4QIF$H?HBPaa3GpjnudfwW?yc@f@nDxXH*w z@5t{lR-xrN^NhDJJ2N^>R+!GzG?OFNExFco2wRc()f9o78;>ywaZIrOd>!sR-^OIY zyK^U+-r)<`o6KYI-ebKHcA2$N@=xWvf>q2?8AG8LdQa+1IrK65fRo4%q`(q@9u ze%q8a<{cQS7-bH|{1^Y%Ovj!T=9-JK3O?7Y#?9rXnV;Y=>>kSyoB`~OIu}2aQEFL- z52SCjxZ_Kxe=L{q?X7D|DI!YKy~ZSo_H18n>WO~Zm~8qO6HyD9XUF`gxM|)K z3zdk?VR0i1O3g`el-#lA4%G0>TJtj$AuZlA4)ryq(y|I2BK~UeLf=Y&EGW!Yk)tIA zlP{QLX~J6b7FhbRo}8nWPuNmcQ}1}}Pv*Mb#kehWMek-Dg~sSTfzwmHdoSU~Qr7mO z@Vm*YdzpBMw7WMA-%LE$TZ#VmhW{+PCLY0Peunc>9Zn*+!f*?#8#2=h2AEHunc&imf+u`S$^ zUQrZ@x2JDJ1cvvj4;R|Vhx%S!b>e^S-xpFR29fZ`!R?n z8}1I~7E?U^4r{1+A$c;(Y?k5;>}<<^^hZvJr8hR5yQ0@OYBTq7@9l`aJWk)qPzrxZ zpZv;Ceo_D85T3xkpBQ{m!0R6j3=%vZun&k8t{n(CZxoUSa?foQwhr9#uNQt99P1Y% zavt33>nsWw4D<;3)kj(osf)5{Hi$9>p0GISM>+K0VT%D3%%9I}_s>E97NS76E3mEP&oQ|txl8&`h7LE)N|nXi+i+T`nv3P zTAu!wWEbt50g9gmRtQ_e>82};cjy}!VWv=$4|A{SG2V_f%1l77Vwo&s!QYRRSh$fC zPHeADxP)ulTYAmNZS7ld#hvHb$GY^9*W33#NXvKcKX|bpWF+yz8*nan&L0qX4%nY< z5hM-x_-_!H2e`iPgkuIed}@U51CPDg!mz=KXJUlH!4;>m!rH;ZUTopOV2Ed)@HhDV z;s#@<%D%Ij;j6N3Yh++mC+f~Is#SHRJjNgOx?DfzN%f7?9%i@3JE4iSMx*CpSu*Wz zrWJdG_8nzBTLZQPE##cghhuU$_Y7{a|F}Dh+oR&SgT|i`EFNS^3)S%6n***c=0}=8 zhqUsw7EUmc|E+gVpub>$Z&5%P_=BN`+paj`u6#ii^lfF`9_PD z_ci%!5bf*x?LANA((iL-sAy4tiPtxgL;nZQ@1mUplRTGlmvs%7d2zSP?sc%Z=eov9 z$=vv^)8((ZH@cehZ}3*gH)WjVrO0n2UE*7J2MXQz0o^azwS29DOp^=t^{fNmZj?R0 z@TY|*mCfiTp+%J$dr{=Az7pjn8r1BFfZ~s8Z9<>M_iBr-5)xMG4qe`tfYZIWv?;-; z_Y69kXs4H6%un2ESaIQBVyJ<0J|?l$(0XoV;#~u zOfZVQ)#55+;h8sLy-{~&mS|1Oi>_IsEiHAj3nH(Un~minLhID3-J-hIkfM{KpRISY z-o~G3yDS+N-`qYS{&~WT_H15wLR5z{laz3$LrtBQxWAK6oR}z=dEmmt+qzuPv&G7; zZ?RL7w#x5BZA+4MXGWAIuTgl1ZBOR+48Jxu`EyU&mGLS2l`}&eQ;14-aBNDm@>}4Y zl&`827yTrQRqTKXk{znP^WBp3>gnfL5}MlMEKX9TzT{7r^s1?TDU$o@Hs1otSM_Tj zOOma0QP+p0srAphEJ=>_f1BHq_DY>=C`l30sFJ#*66vknz@#q?U>oq{{SB|g=;VS% ziEu*l@1~WUWhp0`TIp>m_05;b&5}7SPS6xde9I4PSL%>f3#uv=-&P&-AoW{26y=`g z-Ek`7cABDdNLX#UV`srNY5En})+_4t8d=e0hxET)V=pCStnR`DPs;G`Y6$Gg;C8*g zNX=-HFAng`cp~??a46%aoO%9m=45%zxigu|<+sj;Wge9O_0LQ#tkTF;spVBPxh%D@ zirZS3+E-OqSCaax>SNijv=!C6^TCd~)zuk4(`swhC4WpGR-=vQrk}0F^BU7j>n5{2 z(*M@w(+*~wsrMsgXUL>;3GSIr(l6M}nK=y_R9M!S#z$)}5R+yp-Bb&ze_SDlN#`S^A{X zE-SRmrSM}`URh%HwycNcHmSR^7nZXVpJs1O2LF!SRM$m-`E%8|Q>16r?u#T)J4GXcPte6g+5D1YIcj-1s^0YT>A+ zxfh9r3!C-^)Z{r9&R3xF78Tr4gy$_RFn7A;Z7TTMNXqjrTvlzHM<|Re8JbsFXvhu7 zdsMV4Ju-hzQDL%uzHhN}{IUGp;x68Q`QJ;fvaJiYmJXwP7cff&6sv-}Wnjmp!mZ`g z@zV>_%RghF!ao&SlwHx~%9NOIMa@+~QQwQlRnLu_RqR!r5rHk{)XWWgUM#B-hh8au zSM%bUL&?nAg;$=JY^V*rTwUT-TOE>H5>xx^QhAA}Zgg;aNe$T7_*O}Goqy1XqMzQc-QLDU(+8ByXK$Q}Oh? zw8XIDllk+7(~2ee9oz-QuL{mFX(h`Fe$bptq6?X1yON%wqtMpUMa464#ida3Gq7&! z-I6ZUtg@}8>{!P#e%ayZ!)1oD8<9ojw&i};XO*8Q9}F)lkEz%Y<_kvnq0rgoEfrl? z-;_V9_UU8Ut24a$k7Wf?f-=+c6WtMX%D zoL}7XsPuM*v97T6Pv(^J?lQ;Bpu&S?$1_{Ay=e4#g>R`RgX%hg|DvqR}v8Vw|Z_#(X~(2+e)5Y z{a5W>I{NCw>afyvSC&>2O9L-^RnC??Rhj{-mD+L#nbe5*D$<$>sJtx4j}KUz0jB4_`r+m(8b@xG3l`iVB9t}9JI z#?)Jnt-|0MGqX0mii)+iKO8kkiY`(B!xy(o*#<Bfs2C8;cId*joztr(}Km1!?g#Z5u!j5yb(w2Y}Sznc^p!O@DQ7a8?YDa}JOheYz4 z9WwV{PjB9wiH@jlKAD*ju5S*?)QA0P+%G6oKLF&a?>24};8lT*UIMkurx7KzZzeRR z3!&OajVj@j@`}dyqP<0SP18g)2svM=c={z3~gIUTEMF{PZu z9Bj3dSfd`a?v{w-vRi{BKVw6{2){?n=GM~Gr05N;^3*3$yITj+7DRfsK2JM(J+$>t zT5Lpi^K)*q2HpIUo2H3tzQ<*&y_)}VZ*`$t7V_L$Dq0Tn(&`trp!hbG!&>tAp~dJH z1K*ez(ej_bIrCQQ9057CsCBnsFiF=MEL@zhsg*5^6})dP5}LU;TD77jtlzDlMQIHG zw)ye1sju2j#3zwE+Gq)Di0y5y2@1l)wjYV7@cY|c#gnn}_E@n3bEds9$sfI>{Xvp0 z?sNN}zd!#ewmw{?bOcY4Nv>s zUdancS=ipoYf4ON|G=LlI?`dwKf~YLv65fIIp1-F|CZU&5hJ)pKhlvSxI=a5&vmH<;FK9i7(9 z=!T=6E1B=B4|RI8f=dTFDXcpMk2=fQhjM&7d)c)auARR*(O^~xhJz)L(?D$z={ru+mYq14#b-W~|U4A!S7X4Y) zK%1zWAZw!j)s2^xQ{QRhWd_<_#SYn5T5Wq_mjiuSV^ zu3OAWxsZG~lb9JOcVWItO_iTy?Mt31$FR~8Zp($N*FuB5lvd%DkXSCbsOIa~{r)!oIrN?6|5U%ESKzw>b2FX^#afr|0;7isB=b&O*v z_KFjX%EU)toPU()o`TCf4c5=EVCHe76*A^i)*r=f)_kxX;#byHnx3wd`@ zj>-o9=r|um7}216tGGt&(!Eyr6YF$o3Jl4%2W&4xB6qqdG~{7T4;A0ZtUBwSg%sP0 z(w<|K#9~tqj%t^GuBU)1%J%3n(uSsUd%n>kBzDT_w0`j&<#zh|`1?vFqjDneFW96yMV95PR1qob zGon<5l>AgHm6>XrWKeyjMke&CXH$Dcqt%;ei}+ZzKMlp5tOkp2v0kXDv_Fi8>J+*w z?T@;a&ZT;*d+0`TH<;mXP1>ve#t0&g)HpCc5$LZDiPj6Pf}IkQOZ}UTln`fNIjAe*|Jx?f$*~) zuf7bCt2U`6#4)8|>TV*haE$sb$u@VWW)g{$xnJW(9+o<&@gt*?^ED9p8CX9ji*j7_ zNYhEF5}elDp^o9c(fp$Nvo+eW)HG(db`Eur{y@8)W=q?qJwWrKl!DQICV7SSDosj! zq23a{wqJEkvk3=w*VY8#ZngAkg!mBYBuyLsTUDRtB>^fMr=1E7D=gP;ftb0a z+Cbun%&%Gj5lZ7|>xkb|{IqvTA>u3AzofzVT%99%tI%GzlbptD&;^jcaFTTd%63+& zPDmjznsmh!DSd{ngYu5b)ETG_lySO;)T1Po?kg2f6zQi?A3|aJt+eBWXnhc^2`|+1 z=yP!m`f56aeW>rGmtyU-M=*;F$F&DBa}3A8X#aS_HmxV-lB!>e!#wW7X$!E|T2E>F zu-~N;ofVE)9jJ50+mz+%yzrc&!#apyn|DN4LSSX3>-wM(>8`q85Kb~izX*DlG+V!) z=$mjxA4cpJ4uW-i7V@L@l_Wg(l-^7-vd`*Ykf$&q{a^AC`a{DsGM(mWa3*(B?i#j{ zKaf)lCn@ttfriVJ!^BMnI;9laYAB)3CU_YPR5~7Q_(c7P%QFt6Ex_K<5m9~dGV0Jpg4vAz{o znD-K_=QBThn_&_@J^hYhBVnSX&TxT1Nm3e^gb#_M43&_Nh+*i3S_DppkHqP`vBq)4 zNX}H_QeqElvvDKIhLLP^C+(w;F$R#B)I?)6Nk%ztB$K|8XBb7~WyE*Je6kPp$|xtd zLe|D76eq$0(+G+P?{1n+QQ;W+$~cPQnZ7&@ZFs8Bj=N;IuWyZOQloNCh+D3f*5hUJB;VE74WO z?~NZZuKB-B(=iP>UZx$`^%*}+f!NB_UK1PVnEb|6j!O}*F!kbX;%iNx@DajO=E-;y zf2-Mru!4Kge1Je^UpEI6%*X?M(pPzp7}+zt&=Ld`njIPz}u9pYBf zHuDGKHR3UgH8ByoVwp?)k07$RlD6Z`#^#ts#*0R2%sk@-V@Zsy(a+cw6Qc1jzKD6) zZEKnsd#QbxX;bXS#t>6r90tsv7odh!GeaKVx1JbGuPtJ`sDdw!(~$ zeOo!&Toe~mqBfi3eiYm@|3by(?yxLE{mguAIf#x((^w+WZ&F@b5;49>E|yk|KB38S z54%PbVEG63@^!n-A8KQunstyQwL? z7Q!e>Z0{4oR&q@5C&G0Swa=Q6OU&q-Na%+;`xe2!VuYW+e%|W;eOOyr{ZG%Wz%l>7 z$N%vBf9mi5e*N0c9rkelLx;k!>IVN3z`u*&*-`M%{{KGye|m0jZx7z~|2>8v=B6-t zu$9%uG4*UKE4QA)yH-}NnUeEXR_o)r)2yu46+^aGR%>rYE(Kf=6mMmllm zClr(gl-%)N0qE@>0&Cdm2FO_tG`s9s26}UuWIrAFdNaijP(92V5Ye`h0baCPc?sbj zg!2)CBdn}eJVe-rP=YW9A&3!pbv?ofFqgkaXhc{E(@iLk0?KFBCj-s0!Z$!OU2+|0 z4&gch&Ee1@pjHsM9ca@9RRAvV-UgJUxT68*?{o+KD_n;IqL+c_uGnpV7;xs4eBkTn zFe2ap;!BE9j4%S>A%viJa10V*XCx!eEpUr7au&{Ui0z4RIl?h8m%T(Nhv_;|jsnUB z^_f8V^1{zR^D_z1wyKM}2B>X;T!2nf)58mtSHU;$KY&Yx+@bwY#rA1hbkdE*?!i@+)rCM1zfujLIEdnB0b0Q~W?q;C&GXy-Wu#WTsYL^G8fvPy~ zvq04&_iVuPJ8_`T->zF>kITXVuh>@rZkq~nRxi8+j3^-5E3hRFS>IfS%{>wSfLR4m`hXBb5ZEAgfFL?R`C&Ow>ylm% z^sJmvGzw_WlK@rDo?K85%T_`jK=Z;#(BIN6L63o|2yZ-4WpM8S+_19*crm!f0ERDX z1za&7+<6xLnW_i0i~vd(fxH5OJOQ3UxD@6>kZC|9k_(Fw8-oy3Drlbva{*FO3lPl< zQjwNx2zMbws?J3$2T@sZs~$vX`Q{=}U&}fq;8>>sE~uHMOCUJ56C*+2jx&Qk!7=d$ zmA@$2{T86r&Q9Qq=?czw;lgG2fX6%Y!JThGk)0hNVZ;l-V~8&#`wk!sRNq9&%Z#k zF9hzv^G8O4n9sW#JQL^{^zHz9{&;{&o3mvX@G!f?71YV>rOt;y&&K&6X0y0k)dmRi3V0Raa+ou~`2*G>1pa`%2Ill{2%8b25Uz(g4QZbS^Z^_BbXYn; z4qt;`>U-gOE?NPUFP4Bf%@5~df#w?!sKL3{BEd0p9D~8x%^u@zfK_>bXwTfYYc}wh z;|r? zG2fi;0`7F+SXqs(nf3v2C+uxh7wl!!Hkcz-2$5>BF#xqMY}`RF?jvr4-Wl+x#k5(& zfju*QII!omz~4XYQ-%?NTFOvhFZuv~qg}FoD9DAA*ANoi+q@h(i0$lq_2BGhIu;!U zeb6M}9z5kUHw)Gbl>*IkB0+VHyBT~ID6I4u5A+y4LV=zkyJCO}nOl^V)$k(cKUP-5 zUO0fd80Is5CHTsJd$b178}>5fAvnS?Bp94+x%G26w${M5OR)M3ypFSifZ7xAarP{j z3zorLlm^og91YYWuR0@rtvCd?xH!QC%B$qy{xl<{{y(_CB5>Sfss!ZO7Q-zDngbwE zU86lBpIKSi_yk{r75dDD^>~1@w|3mcgZpq3!d&hE)8RGD>5(I3a5nx|eN1`+x7mTn z0=0OUa}ZVbX4qbUs9FRf1Y&y;rV|^cGt&189BjM9!(8nNb1jHI_}*3t6Da4(L2cOC z)&B-j5fp*G#y^$30lr6YYk}rjP$!6CUF0WlXlF16euvKrm>!8RcOloMTZy#<=-)pU z0%~SY(gOXp@EvqaQjSw$kf1k+*L zXA4Y^LYTXnhJz@%$tRBm`Y+Eo0`%>hvkU0|U=Ok}cBTWkRzM{nRpF?BZ71Lds0DW~ zpcd)LWddxk0vQHsO)%HR!E~Jn(=8L`Mt7K-+F@=%DrYOwCs4jg4)QuKKspjc`$bU* zsEr;8$c2>^7x4#yv$L{_0-x5C!x{z~9wo ztbx^zWjoD*k9FP*bH#j^|648MVGX$QfLd@>0ky+nx^=?bxC7>EkyHDEH98_n2KT z?Lo%f{wziT{WVS_fc{Kpkfj-sD?on7es=+91b@ecxdvnvsLhAzifDF2K20}XhFdnh zfVl;!(5*LNd;2PwJ0O@l-^1L!9Oj-tn0vw95q=Dp$&q(Tr@_yPfDWL4JWMXq3k0qO zpdX1{a5ZfEgiQlIdpvRgSK{uWOF{NG%vug=e))il8tAvI2In=Sd2JTRYUp}@_#H^G zSZzS6V&h-9Wiub^08t5oxjPf)9;EX3Im7n;lQ0j&z&t312|wh> zxk-_C7LnkV)afv}$Xx^a4%<;KFoV0M?gjcu@IBJw$FgO>$2=D%(7$CZ7u1Kf>tgVE zIBvrjaF?;!NCW!cZAPN91*z4oci=v@Z-==9WDThO0dqGJ=RL^h?p_t#vJc7B0Xx_} zxDn=|XqbnA7b~kH=`h`qih?aUqENaNwu?A0Qy0SI!uK32;z*cLyC#A93Labl^6Qi0 z{2C15Oj(l)d~b7G1oQ`PN&))UZ@CBbAKAtR`p<2@1?~s?JHwz`MHl&*tWgj^M= zYharPu1TPO)`aCi|LKL`vp4v|N|1LS>3R^!qpq95y?Xbh?dyU5B=~#KipV`Hf&Q$$ zAht6N`z+v7+Vuc9>;Dr&y3vTC49wr0&S1bVM7ZvIPs`S#R4KslLzHOkI zj-J^CuD;#;eV`^cXb*r&UQv6f8|eRZ1jKFDHg^!W2~RzcC>=co_jl|V%;TOgPaxOe zNrb16s`f;p>U9Es_4F2)XOPHyBf0Py0k`-d73~XDSy}lZk%q1ASumwQABevcW-8JP zZ?Qe_NZbkEL!xLK(}4a(JD!1FzU%`%AH^R6N_Mxq|38eqd0bb;8^??Lii#-6zVG|K z?+A*50t$)(3IYl$C@3nZsA!;}qJ_C)p}B-5?qP~+VTq*{mS|$RXKIm^nRVaK*z4Zc z@4oK6ulxPu?RdWDJI`mHd1lU>nRA9@`nxWpX%WtUi8ia)MEW0thB0Ma!?%wmjo%gu zlQV_mR9VI=YbpM6WP*<3OX0*{gsEQ$(^UISpCjo>lZ2D;8&o|&hH5GD|8pwxkEBU@ z_h-V**@l#0b%09;`o{-cME~|kee_4fpmySrxZlvfE8!#b|1vg1`s-v`sLQbN{MPEj z6k5NbR|nCy-Da_=vssRu|b#7Uo3rB(U~}EY3j7Z64XQ_SD^o9 z%D1#ew^ZWJ|IKs{^zWU7x2>%vFGv5k8MK#yV>0dE_E z;j}_wu8Sgdt)Y>(RXAN;BW4&&dd8Q+nM;K7IX7H*q`dzc^gnav{LOC#4?_RUVRh(# zYxG+5|CqEL8*3(z&%}asT1@%u%uVKA&9t~1qt{)nW;e|IPy$By_Xe_2>L6uvXYCDXKPF>{p zK@(55a8)0)|8JtAkXGv3GK@8<}?;A`cxgB#)hov?scN=LyKjr4ozYz9Pwp7%( zQq$PotEjx~N}O_Jn4-NRIntNiRm69scPTDWRBgp2Or=$CIA~|xMyQ_FwQPs=qdqn3{b;MgyN9gpsBDs)OZNh1dN~3@yDrdi-i$9=z z|4E7Mum(Le|5}IlJWkYTqIpjR-?}xFe2vcQ`NV^(X$IfAEJ<34lHX$-;G4l8LKkNS zBi=~b2i;>5QPLQE8z#HofLb!&VRy}N3jAmQrM7!R*~(B1QdC~GB}eYyRsUnF{BJv7 z9Z@x9Yo*cx4VyN_dc_rrs*E;%lJ?wxu>)_vIQatQQyQpYm#1~rXs)TDEKV5}|Drj% zgi<(+&Bwm|;tcB0?u#V6ZRZ#>6%7Z1@uh9FJ2}|=ZA%NXIc-Q8Z8m5HK-vQgQ>1T_ zxmLx`6>Alha_d-?HWgZt7gV+L-wMb)btGPqIAEmvQs^<@q9`AE@*kA%Y9Q{Mjp{a{ z`B;q$nu{uXp?Op(XWGT)$Dnh1#v%0VPr3xV#gw3DdB{Mh?SVS0^S0h_g&~%$QnXe> zXR)H($!xr&Eom*VOff-`XyeWk1@MBRDwoAvl^&_6D||h>WPVDe@iNM1T@>Y8o4Voc zI}LcuaYP;UY5z@)51N-%qRnZg9<E$ zN~_-*U6ZuY4#iyNr^1YUCGB*l1>ZW{Ya(v#yEhDzNUozlu-;um+RC|-ShHv;H9>7{ z{!DaMWwfJecM|QwMaJ>AM2FEUqq*?nzzVotSsbruBQ$)bcvx|X zVyq$xWZqj*#g760;)s)|)qlc#-avhn4cM+v=>}`*hsw7OKer4ZPOdc#!P{*OqtN`S z?kL`ltQjr!Ug?bHz)}ZvcH|T7#?2Xc-so~NzcPFta}kDxpw{3650o1C*;3p3w~hA0 zx`D)wzKREZG%%~8TJHa>w)o5OA+Ho073a&`-w%q{2-e+_h=4x9(a}DZ6r%i0>Y*titq0?W|gFltoRaq_W zeR41{Kj5XTwhYda=MVJs;YEyfLSkpF=IdYlPg^TfR+(37HTc>ps-v(%v^ZOz#j_Ae8)xz-EfD&wfJAg>J}Gxbn)KACb2tQgS~6(u2`;JFPR&zNy|ViyZ18FPNW7uqMf z-0!!(Q%>){`iXC+YJSJ>duh%T-)eTjMoHiIP@CE}5Va0{KEt^@0FBw z(9Y6i)V`O$4;2S8@lF4(GSi_sbA%DIoK_*=#HdVVu# z@Ze8-#&^1}w_a9T43GDifZ7wX+G4(^J83JQZVym9M?EKTR90IYyLQDYPp))A?REA1 z&@NeR@u-p27OxkS9I!x=!$P)gIfW$ZoSEwahff}botwt!my^3iK2Rw^fA_=wh1o-w#p~niL7i|@_EkfVb zLjOL(0M%y&{w!&H?$yG127{WYL)~W$)XboZb$5x1JvGE;zeSbQVIS|(>9Sgse-5>t znGxL6K20XJH9AIw_aeSRyXp>NBoZsVvt5&1lZ@|MZkBqpv5>VIJ0b?P1wyAXq05^> zw;Z8dxA`@7j@mk*ucy%Os4#%I;Qs1@FxWvDLa&U?>q3-wYVno!*c3@r-)x|T4X~-B zY<;b2sHGmyE2)vLHl@X!dOu%zEi*xWm%O6aVdg8x>EV-5Lo>8_=2`QN-A{H+M2V3+ zV>IY5XWB=X92fc|)E*OhEEIah2)#RmzLGa{V8Q@Az&)Yrn}St&L%xtBVNt^HRl*2W zQ$xvFK00r;gb*iVn((9M#|@ON=lZ%opwO8s&>h z)S&+@Vg7I3!q8u0=!O16HtFbJEvqV_lRZq)|B1}@+mG_4u1)s&PegxH05#e5bkJn^ zbujhCxhh)1mP0E+XV`%V@qj z)r4&gjfO449h$;gz>k9 z3G{!=QGYEQqsle*hNP2JI$51RPI+36wy0j9NyS#fF*&kBMPZHledTHWYV==r?1O$k z@AuLFc@W=>(~6jirhlR-edxWICFsu>Nm(2$;wTHx*O04j)M)Cu$DDZ8?h-f$RZE3q z)(Xd}<4J{*PF5<$QG?8!tCFU8OL_txV9rd{+Qi3_PW@Dv_J8SDzi(14wBa-PZby)? z=AI7asJtdm5SBjjC2kAGguadbhf&n{I4@b#8R-!BE3HmH9?yI2Ogw=8d1IYr43gx4 z{u{~U&~wE&W64j2fW~;GA*Ef8OgJx`xK)_CNSHQLm>waVq@#FWIJrfbu}PRYML5Mt zD4!PPm!`KQ-SDk&$LN0KR`XJxWvqPS*NwTnuHoCzKU-S;6wOhbGcGML68+DnP#p?>wEoaAwG!z9m0m6ggdh2?s~&Ozbp-nl|3Uf(Qh`AQWw0H z@Fw~_lJW4kl_~$Ce@*Ho^sk>p?RW=IMyI1&#?LaE$)rZ~tfy?`>eoF>+0C|)yt9>s z99k3esj4TL<|FB8zYB9!Y~-oq(>>(K^asKj4Z@lDie6B~QvNAP%cn&tZ)%kEfzGy* z(7(w4PxL!S(?VC;j6%=C$fQH)KQU1g{gWr5WZdb@Rp`H*O>SYgr&^(Z>on9l*5`hV z{_}bB(f`+UBC&7T^gkr;8Op;m(CR;bp8oiquXrSa%^G|r4KKgOU^zS#mCUkpL9e2Kl2l1Bs>2V zV^yC8v>mJ~B_&rRt;Qo73zd?EDz+De%kf1jS{5&qbeSrtJb%P2exzcnaH;ac(hf<> zs%}fWH{Uk>J&ZPWAZE-#^tYthpuZxEdR)0G4=y}XKn%|cE=ocFAH}oLpTA(B^y8(( zSopPtc*Ez5MOT@9F(xZ zJXF5`%^SAeL32&@TGW16J{Fz#il>U&Tx|N(rcp*8{dhd+eIRNG953TtZ(V0pc(t2P zgvaHs*K14nIdF-xsA}FTTBVg=y@*Oi9!jC7DwpR$b!5F_u_AeKj%v-GMk+1%Zv`YI zzcn7^9nBsn-_S_C1|-&(q1TX#ZTx*`6-C)S zFZfXw&vIv!ddA9AaGut>2Czr>=h)&r__<=eVwK_y#nFl=;G6+M_YOrB@BgiUD4)B} zSI1R}+yf*XY}}fR@-5AND0gohhUQ20#EkFpZNH&;U-i4FJyxEJ&i3LmQJZ@ZRd1xN z!PZ~#f5OTr>fFQLkLYm!(V5b@?~x}w+?VNQ!pt7{-(AJKyQQ+;UHJNWCAae`y-TrD zaf%`_%{exT-Gu-1zR3=CWVtZ#LMx>S2xtyLd2{0^lo!{pMtShIzfo>oy%)_6<%Qza zVj|yTMeb?z+>_OD_oM{s-|fdJ+LGI18PB0c`Rv{3yP{NE)^=Br8rd4OtF*D`KICtVZgN3$tb_vj1PUsG!p0Dzt_Kw=EJpI z4?H(i(_%cTu`_C2d@OWfUwQV{ z`9aS-cwSlDsaURvRgTlzp^9p!SCamJc;AHje6T72W)QB5Sc-79|soqra;2W@h%i_WwY*lkT9@|{znR*?TwdFspQU6;Nv z!y+2G4Y7rNWX{9!CuQ+-MOBK|&+9p=tMTjS%N%v&+yB@1O;Xjjsuern9Y*TJH_BJH zPDlBTW?HdVbYlkIzFJ?0@`bh9D37YfbFOaX)#BA+eD0i*i-(C;M2=oQuSn6{$te zq5Uww(x!MwakZjq(XUrqYzE4a|K2w_EorZ+R(e^FQ_VzdUl8qAej4yOmMrpr$|8Z1%g*(ru>5Duj*e5R}_=>rKwq zN|m)zWvx_M^GlBVDE1Rt-B&!SxJFUcj#Yq4t8*;xO4?GLW2y4-__?)IlsD6!Tt_v| z#oHg%<7X$QS_d?LS$zx5Ysx=DZE^7>bk5JyMAhyzdQR*637l`85Jg>BUGU!n^IU46 zfyE1~+|_duTQV1DS*h%%E4nLo5n5bRBrZuWR-{HrTMPg1@0&0amdE`>h;+v`uEJiZn?c0X3*72E3akI_7}7@gMXdBl~~!t|b^ErHmy z)QNh6#d3dY!NSl5ADdsWw1m}qM85fCnbDN-1ner5Hyq%*imGohi&kkB8>a1&Ha*DG z$z`ULsArlyMb&?#DXl~MXL&nO_l61nH5g%1A!oY2*}4Md70okIzO!*D-o9D?8Or@? zsW+QL)xU^`%ZVH--Qs&Fe354hd#3A(s)S7_Sr*+5i;w(o!38dO)YM3xmNU7j_deV$ z^Rg!M#Foi0MWyq<)fVM>W4`TdV;qHVZx~a%{hMU9WssWB8{%SAfZ7*E?#$}_VMOej zH5#_ywGde&M0soLn<#H;CT{J|G*Twpd-cSLjZJMhn%7iIBp8(Q3-j~El*MdAo+k=7 zrdy$BU&3B;{WV%2#>+jA(KVOfVS!~Cbkb{Q4EnsUo6Ox}O2hCC#YB92%1{g6{$S9? z9A%r#glV5Jn8qEanXI<3(e!WRxK95t_9n^`-6r(ZeJ5zvxv-ZjMh| ztNGu_=J|ZHvypaVy}$k&esQgK1b((&*O@%lm5W!+i(irJ%{mdOl0|M0^uX zbQlZ`7$kQru6i(5))@6Q^i8=3JJt8S&MA6j__nuRG`>xe8OK3mhoE6d!Vv1-VB-)h z86O+c7fV-kPh)$6F2}78=~5%MPjvnzn&Whi(I!Xe(B52Jqn^ znkl9Ay2iKpbxHjVy!}Qkelk6{t~YtVD!+~9x$`K!p;jL8tbbkR2=q=Re2I#-=t!s? zfai1g>@^>EBgnl4cj}n>xlEJv5kn4TcV0C%zqwHnW1kc*o+|pcB~6 z88ibO_XZK?4qdfdP|K72#K%+ZAfo)GJcIB4$-s?VS!WI$$rY=g7Ukj>zqW4S*Grl? z*V3tRE4e`Ucu`JS^`qx$qw`?iM6^sur*t|x36yKFp3DIavI-d1 zGhTa+>v-+110P#;8{#ssLVv44+dy~CnZ|#}YKz(XvL0+1DXT5kR|e24*%_!O3>?&R z629tbj}-OHii3Lc=An9iXp^kAc<0J$i_a^~WsG%}Xj(8ne%Y5cNlu4a-y>I(=2cjD zw{Zu`-RtSw4e!)uqWSPTJU3)}`E%4Bn`eT~pYn)P?Xl?@%(350=#UxI=vkT{_g@h( zWr$0^U9O9aQ#GGhxtl%LoT-1^@_=R+&F^eX`clVsVbT&DW=MN>S|`1d%W~;k-G<9L zi-)$Xvv@w2tF`x98FToW$U2MPPFZIO7$KwBz>j;74mRwLA42AL?efcuqrr>%Ux|%LwRvcMxXuR63zyUG2fEL5KyB|la_!eIy-?=Z6MOW#+k0trrNQl< zuL72sZ|>3Ny4}XJ`*W*I`+nUg80b4jcWdi6!g)kD>eAJ)>jTtw$O?Q&-F`}ujse7$XMSX-xCY{zVbROmVCm5zVrm>#0UK1cVW;NVekoIXpk@r z|DyA%Fj8Ci-_zZ7l8(M497Z|iW2oDDln5zo=DR_M8_8wBxqUtHZB1>ts9lHEE^W(+ zB8|{_aq^42Z3D5G{;pgL6N4P+HKIRr3rEeDa%bq)*_X4de)Nw(|Am0-^f-kVH>0Uq8AAMGi47)Fkq5oi>b(nBux-fQ@FpmC4J~~#dr}1-n z^M`1TZv342;;H)v(?e_25>Xl&>k@>^=^>e&nLIER{YPY`DE+webo5X3qF$pP`_nQ4 z{s}5We+YHWd$eJA$u2hxbNl2 zsC&YARSLOV!e)2HS3+5pYyCprzi9qg{@3`8aG$xb_Fdt+4B_%{%@^pOYl*77ORluT z^zVF!l2>U^6KV#9Q_F!avZmu!8Xb%Ng~Ny0{HdfH?+Ev~3u_Mu z*Ugptr{&4=9L&76?(`#hKLyaor@sh8VPahrkvuFS#vA>)BU{jaChiLQTSwc`s&wNc zq;CIvVqfVWqvB-jaLGFR^dCr}O$9!iScd*-X`E?uNX8e&UXv(=w%4Q%+EdPCazl@bfy`V< zPw`WHAk7fvMR$9T#(V%X1V^L%?r=l?7$*eskC zt@w*jKGy~bFVObT?{S|U&;9)bp82vkEOy){nIFp(h+<7KG>^dQTnOG?BQB>Avy(j6}!xWYO z3L7L{G)@ukF<-r1I9HW=E;Y`4^+w@5m5-#Z*$FQg>s>|vQ14*$Zh)RB(y z+(vr1uwtb_#;{nYPRTDuQMJF3Y>NIb z=38=oie9jR5zK%R%3^o5bUFH;E~NH#%@@*Ud-h+HEY=qNDqO63k}|$!p8TkA31x>* zg-gqX%QO{Lizp9}bUAU0FB24R3gvSx!L=3rBZuOXC-S>6sJ@jX1;j8r_(<#e} zfLX-V{OY;pM5osLRp^hCIsCC+i$3HEWKy;U{U0phSDq`EQp@&v%MLKAIxO?nLtM(S z)w}<4Vhro5w^&gr={Iy0mBI=Y1r?{{NTrIXN-Q#euhg!5An8@p6`u*;oGp|&qiea5 z73j|%L)$sNE}eMT*D;lt*pq%{H_gDa zzE!=6@4Uqw^pZzs{|?Qw$t7UJ_{-2f_BJE33t_|IGOyz>N}llbHi(jEOsjxHJKF;0`UB|a$>s0J>I5CVC>!+BhQ6@VTp~O6Q|I?NhCe6e*5ZR4u?qdEEyE+$B5^ zhF`taj`FdW>rmctmfr<`a2O8-E!!o2F5a{d%}c7dmiX6~^+e&%g_>|g_9s|BIUW!B zj)?0a8p7tnjb4<+XS_V0wi{WYSfWZMM}=Mk%}rtyvdPRe60AD z;sM3=it`jzt%bdFi_(V{gmSxG;_X43R-jzJid_AI%BTh31%-Id z=W6!nFjz(^-k-_4Ro-bbYWLRi9)#VmWERuwJ>v?vNS@L2%1{=g6>SxXNLstT;g-4j9T!1QAk<5M`wSFs>3M*pnse*O1=tvA1?CdOwS;DBdBS70xS3B-uHjr zbE#6+X;&PNRdiL<7XJ613-w3(h~h>?YL_FbM6Xv~+*OG}`rdkm^1{pbJmAGyqR4;a z;nOHj-rX1Fo|~v=AG<07)jO=r2DLK_-OzR_n_Ba!hf97?%f<{-2c>rOhQv9UrP_CUpKsk-8+^sJKZOIQiBK zlpng>gmTNX`%%9C@Rul`u$!p%vf3n3(Yq=J&6;I_Xm%?k?KVdW?|LC66o$v~AD0VZ zc-y7G8~ZL+_G@J3#v}orANVzVSEB_k5sR`y34;_>3^@HIX{YZL4=AovoTWHQ(Mqwa z@b$`zBZ^V}&#iw^9&z~`%6H3NBHng~@ucU4-IUv7#iozYoLQBK=E-H$t?RtPu_!#0 z(+_q_p@(svD|?YS{T1FBZj~npokrLngac)U)$zVO?d$kir&zdCS*JcorzjGaq;-V< zv+| zc-2JIHk6Gmu2-C?7^X-}FuMI+o=UU5B57Zv_FgEDx%?%{ z*Pq3L`-{UrpnUOeV%ybb6MCEh}tcU{cd45!+A0fS3ajGK9yYH5j z7fnA|c^Np;`aGlBxz@@L-tV{fL;0tdiBb=Zv&|?^Is6cBf3=&sb)LHEQ?PvVe3?wKik|dTY%d0g=@*9MfTFMe3-Hwy2pJ>-c{jq;XogE#+~~dhsIKV6rwN_@Dj8fZ8+fiE}`(caTCd0ah4YW6*ZgdtIqeMT&cpqvv8ZYGRYl-fVddSG#5RaKU$;yj`raTF2wcdc1Z*xgjUhI3z%8O%yyyxOPOx|;GwUGB* z+#c(PqV_tS8)GRw?D^>Gt)So8p+{~K=k4@f4m&UZg7Vq2mxxXJ5w49^IlI%avu+c| z&2Cq1!*YBXE#CNt!XxP1pRG_+P zn>`!yZ176U$|3u@#aUk&Qiu&xdAG$OOLk9jnkD;8xr~%|TihIE&o2)n*>}hDqU^us zoue}ewXbw^=;c2g+`{U!vb(TDuG0{{8Zwc)RxOQ@oviWDtJ# z-#r!0KAT>mIa&5HGJL0u*fi)=_!-fo>)atNvNuGDL;u(#y7D7<~DJy?2% zEA&am_s?}kvzF|Iq8Ggz-{`!#nYz&arV5{HMV4J)Hou{emeMydr_n&a*YgPm)+c&A z7&Xm#O?TS}Ymc>E+kE@@Bz8INxXkZz=T~Nb1?=jaqVs8xVW;~&<^&gZ!fzqh<$WHW z=O-P$K@>z>77is!P)H4-aFcLYlW_QL;RrL~NIzlh2w@y0l#j{2_Tgv_yFv^PIVF3E z40b(&SF}oYSJ5kP+>Ez+6;^#GJzv@P%%f=(b(Xi&a=x*rz9$68TbrY*;>xv!u&@Gp1)P zGH?n+e}}x8G9fj{6H7Ej}n4?T$f#lvROGIe6e!~FON?CSn7lG^LFB$o5hc1Ji` zDUa_f>4YA_#9qQNroyrKlG*8QioXeyX@$&Ds}aU{qJTN-y+Smnx8s*ytFJiW+t_n< za_k5tVlRt*!p$+l)t!uvFuT;p8NU^I%PuZcwL-b-PFNDfFGjV?^XCyqV^^X77>v(1L7|uuAIbqUyVe&EIxXr@xmBJKyMsm#&P7D{Onh4Xh6z>bu zj|(SZOMR@{r^~-r@F{y)_zI6q5$--E+?*~~i`DwB_UN|>#8*XQBN^RH^^94Gr9Gq2 zKYBm{nj?N4Oa1zFOa21==f>lIi_Iw+)Ue5f5v-nlHql)2OYN#iuZ*gT!gLkwlL{q0 zd4ezlTd+fzc|tfv#X{C(NoQLr-V@5Fy;OK5R(K9e=wBe*{jDKh-8|nt8~xrPcwk6J!BUYOS_CW(BGapj+Uf1#XxeM z!WD+ua-}MpZ;8Y(;nePm)D&~ns$J)fl5}2A#czbuRUOTszhM@Q>&NR)`mEY?Q+MKX^SaQZ=ue0t_LgKPP!~nD<0fIRB9(}n*k{ri^e@Z&6#Waco}mB3 z9OBM->(n36e_+}rdf%~!>3OdP^5Kb`D_ z{=->I(H}AuC8N*eEkyt4Gm5#N>ytl#Yij=jN@q1}7G5>ToJHH|zj3yTjl$kyr%?5c zMY)omqmIm>?K4k4O<3GV@dM$!7)4d;`5Ps@0PB$J#OqJ{NAmBLa^blOdH(UpCvq>o z$1H9I`o9=Q4X$1<>+MTE%8Ew+vuSPUzc=F)`sWv5H@;gTc@EW|Lu~ucn7au5Zx-`g zs~_j#NkgxBMEih;^H++61rCZ|3rn~{GDF@&affhWoZ>yB7VPP58;kUvi zs-%)?KQFwpMeeT8)kTz{|GW4k^oLJakN#(w@1p;BE}mR+Gd~c2Sr(2VM$PA5Lx0nJ z;yga7qy_yY3+JK#heceCCmGMYf31cOvCEARYvzO3scgk7nDb|(}SIm%4R(vd! zCp4Lz)>qsqT;ZzND0~Bp@P@ErisDZ~`LwsmuGUu$g};yfPZG?~|9fgF`X^_P(9qa2 zaK=>h|4?X&)n3Klqd%!+Gx}2&QAeqrmf+#|x@9xa|84o7j0qBDM%s1n8z`}fd*f5C z>O(3LxP~9D;QTI2Dyc_i$hodDH%{r`E8!~qz^pj&3CW+CYC}azjeQqI6)9^}dJV0N z9&RrBe+?sIuUtx)iT-cX{?gDmI%q0Uv1eI95&FI7e$DK5pVDsV_bD5P{x_F>j{c1+ z(3Toq$#3I-U)4)SCvVP2|Ai{N=N7)2wqUEd20bP{)}Uvw)><8|;iuQWBX+Ct5~OCC z6{n<7Xb_Nd`p$(En+}J<81@Qw}dr)6qgBkIzr=ip9CNDKb$le{lDj)M88+z zQ1tJTcOSN-FJ^?W#<%nqklL!c@oh)=1OAQ5|AI|x~^MWFwmn-K7_prj7LAT{C_Mp$?S(qSI|3Pny-Pb!E z22D}vk&5n$y23yeQ-P=2?zTM)Ygw zjqs=i0wk|gr*0z9HvtN4auzGA$hucC=!S7Ef#!!ne=+lH?q z!!G`U=2s_a+hJE5i0sf$WiOqOuioZJ@bij&(4(Xhoon)m!oa^W`or?Ezd`-sj#xhz zG#4&$(}!_Z_&mU7$b8tV7y0;826#=8cqFY_fIm5sE>KiDrEI=?S@3;N{q zZNQcc`iKB?87cZV3=f0pL2IDCTLAgrwb}_Ahcv>i@^qCSmY}M4zc`gvF(czaMt&-0 zeA`u;zJVk73sx%@DW)i@8uV2)7fe=8W=hE|N!R`AJF<64OBGgPmnBogf$4 ziz#qq#c9+oE}=*Bzao3-_RXnb^T^OS#sUOE9+YPzEKe#PfdSN8Jq%aXlxe9vb1!|)^c-F)9 zDF333hzp5r>4owKO{fjr(cpyg`LdUef3EDsN%qq5iOd*=s*_26 zFnai6@_!t318#BK3bU;7fR~Tn0;tz#0{81mq312J>v>ACPEo~`r&8!STph7j#47jt zs?~V3sPukC6my)GM$9-q+<@|mwqTUMYN3V$-)icO@`wfxlxxXeI=-)JbYQoN@6l{6 zdwF^1%3eBNCo__vo9rFwd1UxHI6kNY_Hg4Ij~44#xJ9oKE|jMZJtm1ok5ENZMfzN3 zq*OoYu43N(eRYId=lC>5)w{Z@61n4Ft}gVF@JnIHorhb9bFa1t@p+3j%3Yg?IKOKR z)Vpu3?4{$gxW*XGi!1J3cvM*=fVIr&#=N&FH*J?@(N>I9ZW6;2iwLUBo|%*AvxVRJ#>-wV-gg_K@pere5$8Fz#s$qu6)(lNvX__J z`uqa)T+N`*aP>_p#o~v358T&O=Aj?yGDoyi4q<=_tUfnu}b zZbj7!oYGX9+LBoSMob2dzcXJ`<9LNRk*^)=8Hx0FT*Y18K}Qu`0lz=oOPpJ^C7`^h zg%;<1qX{2+Wi^aKxu)!;<9=24VsblHNxODEUh)$<@5){}F2?dSmGgq6Ds25U{4OjD zrbRdz%L=FCP1#G(ai=~t=(t#RJ^Al#9d&JT)E0&Rtr@9EcHq2j{bbFk&sB$1)Ve$P zGwxd_Z|msolQkp5NAgCs$rXDd)qL6OzYgQSDImKctoTc(q~CE2~A~uf*oZm03>k`@T zyw56Ie55tamRtsZBX8^I&9Fg%;b%50WvnW@N|+yzw{@)SY{=1Op*7{Vdun|Gdw*N6 zL&2}sv^STptRqFgPtn6hl+SC+K>5ZNZ@m4T?B(L>+b{*q2kWR?r^K3gH21GWiTy97 zeWmpIv`0Jbj8D)uF6j(*_QzO3S9!|T`n3DjE@9S1HghyTwstqj)V8wj)~`W#kQLt6 z|H$ef_cYp8D^UBwifFf3Y=u3mS602qYq{kO@rb-X;8<@-i*Vj#IRP~vS`riP1+sSI zX<x^Kzvw;JlguCCGv3)4$! zn>JJO8_-#haS6+Nlddt>@Q3WhXE`JIOutVpese#oyTYQ@rq1wNixh(oOnX{5^tUkI zEW5c|Ih*qvn|kwFa{S3WAFuvwjwhXdHK%r6`iJ&A9oQ@BX?HKP@R$j@QKq|t@0n_vn!7)#Y{ ziqW~KawId=JxeKt$(elW#duxD-+c;=)+hHd$}-#^v(UPm!M`E>9sV}R^ssQbsQ;U- zmHT%64Tfo+3-nV4jP%yhH$~xoy>=8P>upEjEqOyJFk0TT3OYLEAqs=!owv~S^5$OH z_wxQ>goQ50BP--x(4n8m8?8}K*i%bm*brIipx&Gw;t%_e+LjU<5iR4<{96;fm&Nf0 zN@?~%9d&N9uZCzfx>3n-L%UMSsJ|!w=YC0gp_w|Sc|)|5?d(6&`7`ES*XKIMApu@H z2d8?Z_P5$UpkGF%R6MKbr8i_QTu6#_+Z`(Y&sO z8Z&*=l#6duWiJH1dEHxAY+&FX(e+o+(2_(Q{-yV%VV`572f? z-l~XsE^k$g)a_1v#}1db&Ev**BRy(zH~OE^*f+8H zh<=M54}V5;b{pRqnYR#+dhJc~=!xHIsAtw==nhln&f027_f4y;(C*uFU+H3-72TE; zSbI$Cyft%dfUZVL@|-YokNImT^&PT%7^U~PAF~JF7|5;{M#p2<$ox;-+cN(%isLe4 zCyf6>m~cv%s5s`Tq{m(mCeenOqkdO7j_6^IdbKbmUpQg3ka+m^;R{*0Xyc4QGh{E3 z{>@F5%y-XiI4P?DJ3QsAn$ucbwJNvUbueGH*_$XUh?IT%GfRe2i^kLzdafx|F)eMw!9~7 zsuwogmHp>;q|3gjHNX15h5lI7zi4nt+Y*WcQ`&VI(^6*r8ZswCzJ?D0nw9G*C!cOBN(0?p- z2R`aF8Ly7>&(cBvBUw`oy)bPPSDo0r-spcQ)=h2YN$J5aX3(ei2%o9qCtvwI|AN>o zP<1iOLejG+JG14gjtW(Y3h8T@Gk#k*$6t{?i<#<0Lis%M5w<-NwxAFHe`oK?UL3l? zgV0|y!U+AYW8P(^(qJN`UT8b{FjjxeCWk2=xqLfr&J1jgbjvTM*EX3o7X8O&@8o(i zqi{d^+lsR34}O``P2M4#^O0DXt74;=$Yr)%)%kzBbN?Yn=2KtHRHFf^h$@*c=~7}C z?iDT!6UygNjIiw=VN1L974-iSjI9Iive(m&gR;})hSBLR=nu)l+Y94!kK-wAnE{$I zZ8rWKcX*CH`b&!g(LaCQZ(L37WS-pN?-En4Asb}(W!-0`sq_jzl)e-@3#kic$Z0R| zbK&df$>j-CX2_{QX1g5~KM^iXQ>3S4*1AMkuFjOyBl6YIxG~7=Hv0dRx3Nz3iCvEV zxbf!bzmfqr6iy35e@;FgTezt3E%Zkfm!W^hf@SD`vCt6xEsH62*mZfzz^iPn zO0AhsT*hzpx-R>SKKNMqII&j#Ot`#ExT1%m^7$KhiFxv4!irEuensR?QoJi%IZg4Y zP(F|5m}H{gIXFf`4i);I^Rd~rFdKLYdeyGfi_xt2c<@qWnv0T+4 z{BLgjprqHRs91AG(rZH$PYA2g20s<93s*cTlxK?`RR!v!KYCO<`dw2$M*py>@#wEE zAWn7~NqlbjOf;`NzvM6UKUj`$XPvCX+gUEFs?oo>ikxGs*5H}&Q)?-&&nMO7@AT`s zaz;;<>w9x0PhG#1RhV+Bj?Y^hXI8wEBCUorQAamk`MtI#$G@|M!)gv&eY00s8;0wn2aK z`sL_<`Zls+f7!tC2=8|?$Tx1|2u6iFH+5w^)oT+mX86V?`pkh5n^o;^z9-hVOi=t> zxHVW&d3&3xoo!p>NNr!mN=4PWw`WUw`&D6_75bafb!k4U>TeGcvS)T%{9%Yp0V z=g>c64ikq#w+W_IY&_FmrEMi0KPHHLA_{AP2;R;i5^jI+|~CovwJv#o)#;m+#ejA0)v zbxP#$0_Ek@^L?za32sMZ6J-Um`+%-C$owREFO+F@k5b0^mNe|N5zo@G_O2 zs+gciE9YA?MdkId-z6QU$`MBHr0I|0CPm_rT2JjTM)|LI>QG+WIvVAf&9*2X+K8{C zL+h~+HEJ8JVrWTqB5F^TcZP=YHcmukE-@4_AQfMS*Nx^17(P1k0qh~~aE4uVEP(IJ zb82C4$h*s7vz6V6ijj)cD#r&4L;qF0qexA1MFyr=k;qEZ{8)XE-;oRhDp)P|_q39(j3 zRP6*mm-L9J4vr0Pxl@nwf>v5ov|}@>qB=MFp!t{jxoCc|tr;3t6ZhfC<#;P>Uoqth z8=M=Co(-vgLd(&wu-GEc@q{e%rB#Q-I39VSVqjEVyhaQ5Wpt`yLkmbi4^K$et5H zdu1={pmp*DQ_wtRJzX(c(M55PFz_$M+lm(yQO5DN6iXHHBS%IGhnsW|C()bk96`Br zYZl6HHHV;lS7QXqSJf{=bLF;g(Y&LYx(NBE+zwh60cbZV%+Bys6b7e21Ft5hZDDP8`&fr(uh=Jg~ z)e-}q<-}EBY4K*XeVIE4My25!{|oVy+CO(F9`M)o{S8~!E{k0sjzV&Wln`bpMk*4c9O)zc|K2q&a&t#G%74Fe z0p&AVOHlrAvnc$jtP;gSMhHeB<*Zo>=m! z7+M2e{Ak7AKg(YW@jhnS4%f;q=H7F=+=t_pssKe(Mb#F(RA1`#nH=$=H-uG+vlJ5* zJ-G)xf+a{Q4yIP(I`KB=S!l+thEf~dt@)8p!mj2ln<)kh3045{zdK2)$hU1 zvS3q5}3jjl~=B zc*}Fm8$s8QnV^3!2rs3gr))r%IeO z7NFd|{xF*VsO^v1AF2(iq?jaJ~HAO9{I_6)rahx;vpyc5G* z?0K{KaFaZ(>{cp&SJo{>?7E?<`)XOI=dVP*l#!`CGoka)^%(aGvt2hb;#==JkGszT z*YVs#WXirUR##jHGfOzwg;LlD%1%SlD|S%IpsG9Hqx`z;rQ;vfj6&awjr`hYRy}dz z?Or=XG|QOYb3i$9;^A6+8-E zpKC2qd#d^ie%DaG5{2iBeW30oeub&@4d+>!#Q!#RwrY# z=X(1bpAJ51_^som?z>HH${LpWDfug%RGn~wGpI|d9?KB=b7XP?wk%N1br;e5VNxz?s?d)@$ zD=g;Po0*4L@3-sFv9kTa?#mui9R}F#;+MX5^qDRmcGSJ=pLXQ#{;6FbtnRTT4!mP* z8&Pw^_HC49*wX(5^tFwkH(6k7gvY?NoSiCNnN)wDC4gmNrc+s$*K{`=*b@<)*@(_UKXT8vC^bMi9Z z5mn)#Z?5g1GFlXuN4#uaUv$P3h4>edP_8u(hVqX#2{P z))lEQ+u)4}%fnv|s)~9X^;mnW|Chr*82H#_*NAHaM_M$+j?lV0 zBs(riYeS#HQ8{uaIeMAATM=I+s}c#zWK|-uTvjEWxSF>A|3C9k#xy9J(17N7p6Am% z&!xE(&4yGYN+p`8s7OjkD3n=-%oPfu3?V}<8A9FuulM@g-~aLW_ITXqW8dwZy`Jm6 z-fQi(*V$(u*A2+pFb^6pR(fS)WQp*>yBFW|^}(?p_{n0Oe$am^mFoY27;ureB7+#{ zMhwzm93=){B8F@xhT;fVGZ$v;CWaRfu`c;+2zfp?v)>rD=3Qg-nME6mOACw9QG3xL ztirUYPQl7ooZ(mao6)`8Yi>C5z`xzi2L5ec==V;Gd|_pNC}0Qt&jlvH|9;RPw5>zP zM4VH1h9DnjEeb_T!i3p|3(4@$8 z(_S#oC^>wz=Q&1G|B;3Y$P?lJO{^Xv7 z*UWjI#4=~iE-Gg&vI|56uudLJTra|iBV(Q1fsws_Lm_RaFuRlsw4Lfmq`#r}#QqJ$ zZoT>b@L#SG4}Wt@wA#@s7u32^z*issJ;BlNKO2dBSj$;;2mTRpYv8{&5pC-9a}CTb zs@DC4|3As7qmtbQj4x8ADX!>Yx+y4!S2lGMKJ)QR6Q|PBP7^nxUSJP#(|Th1bjIDp z&8($pB@iX!ECjOnZ^7~Z_cz4yyuV=PZ}_{=HP1~mt8wrTqLu%nR|0UfO3knrxG#C! zDnu;fUA!**Q`VrBSMFPn`1m)cJiypzoQ9UN7}?a0^QhnEMey&+P=)_+#y5NlCbMNN z=4~6cPNloJx9*{`Gg&+{57Ty*8Y3GMw>i=FHkMu4UbLP44>2c>@jEd$kw|~vSnD~!vfw^-L z{Z^i(-?j$$cV&OVSv@=l`7C`Zw}eLJ?SdHFo^9WYYm$3;QdDvtO2Ilgi|`KQ7*@zt z7;yx&HtP}jY+Nl+qCExm#6niAh-Lkb70t=>xK5cnI4McpRHMqIMj2~ zOusUF18QC1lRg*zHuNdO+OOMgVRVqnEyFnIyn`41!#iPX`LF;vpchzJiTRXJQ4Y@J zyNWS#ikTNzVYG|bC4#%S3wBjd$-7Y_5U;_iIC2u)%E&UJbQNuvz9yEjY$-#8v1)C> z*i2MF?tM3=Z;*#lTZ|;wU?b(~_XTo1`;~n^)+Uf)UoSYf(PtSXd{w7x- z2mh#|yYN3iCN6FzotO=nlv%=mV2>yKFYVR9>?w5beVk|9%8_+~H_A`o`bw=rhDxtM zTj1EpC~zI)58}Q+M!buQYd_uvHW8~N7;_na6X`SD?>^qq@E?spw7YL6sKfti3e3-b z$#90hXLdY}{$|H^_+Kb|3IB7ugW(@tmInV*d%wYdxKaTAXZM|ge@oRo%x>2n;KST7 z^1xe~o6vf=L}c|doCUNFqINUt51ysc|631d@vj-CJ+&(t9}o{|GO|3WL;G@Z)vaah zB_1{*dW*q-ZKMkq*IVHv#H9N}8jgJPeda+fu50|9$T+`2Vha z4*wHXS8+y}cn~eJ!l4#<9F7SvCNq8@HrOy8B_2m4LF6Qe2;g%GZN@Spvesz?dmVoa8eu-w(0h;O zRvj6b_eHm&6>a01Hef!OU4!~?E|$&*r{wH`WoYU(#JW2cd1>Vrj2yN6M)xRK?&YL_ zj{11LrLZzu+TtU9Q{UpIU7N5}WskDj>3IX@M+I?Y^WtgxAVvs~Ws12g+eYlLM~)GF z5!>U5W`m568Lu$H1N&L*&0q%e*pYrje)^y_%+L2efq7=f4w#3x!i^Ksgg99z)lgp}V8F_d`Dy$uZEpcTx8^dF&=7xcV;vwFJc&MbHSd@zoF zbL)TKL;c?`N|`A!AB;)Z&-$?`Vu9-zWGILug2x$48MiR5X7naHq>Kz8^0No+V1BL_ zxo)$uqX^~!t%)#qZ`uj-uo}eEa(k&FY;WfvYb~Tx-@r3B7RNK66~cqk_qwA-W=5Q5 zl=xjAkuyD``~ln|Nqd6lV>~jonXU%nKM;KaR&L$_=HjA?fb2dRV@k)0_ zV@7$Rea6UVM4orh8RpHs$YjpC4!qCWu{9ay7EQZh?pSjb&WWX(usxP@8Jv=ecbP@d zFSVF{2oVP3-N{yna~GxDGMEVF(khyXrzDPPqBb9SWg{*IDHOtRIR+zp?9R`hKE8ufE1S6M;h5K)m`;mj*WW2{<0qCuQ(u}3)E>7b~^mII< z58TKUBjgr%p79_f@)dj5Fa|Ipo3Tfg5y!$dB7!UCFO1!ch$ChD2wKmEd(ao=HNA+c zl}`tbYPq~M6XyI)=&k00H7MOorPK<}p*h$#Ih{5ETUbFh(avT}BB;mRANpXxo70l>ssU+eaC36l|vw zZ8ApwAo3Fi17W_q_Z!SDIu65pZtHe9|8Byz>CYOpv+0ad2RLixJcI4lv>7mb8H>JP zv#vECtnUPz(K+1|eXD3d+Q4TOk`dE!Cz zcFZu)PT&(pHa6-VV%vF)ESL0<6L^g|qa33EQFoN_Ezvq@bUe)84MxH|ws!>C!ry_Y zns&9K-X;xA&2X-&!5C$9taJrzALR^!3)9ff22rv1;L{s|2D!KTFyGr+3G>*di!k@C`3mQ-Qq<8PD+m2lzby@(`U0^% zFw6*vhSit{2i#?229&=3567ku&4_P#2Tp4rGO~d20>K zd7Ey)`A^Ls*p8G^>kH(fj(QGhn(*8ki+0hSLU&^6qAzOHTG?Cu|k2KLQ zgiSTC;Y!F&6Ma&Ap(blP^U_h&-t_ArTHGXno@He8x#Je1UC;^#1GlDjI4jpqfU{g_ zDr}8%XTvjzzDum#9E+G~i-zok&rXj7P=cP$ta-@*W0Yos>U2;;S`XwFF2H){;7n_< z6L)ZUYBbSvB{bkai=%<#&g0WSZx>uiPc;_4ud$5oThy2X&wTY?Sc8dD@4}VzEp=pu z^uOx+F{>3;$M^{I&!gyxCK`jAV7{l1pK`kcCFq}SMXdCqo6w%RMzyGyj!J0`Y;|)N z!ZRWban{@)#|@4TsfJaI2mV!k)Fu}!rjbwGN>v4%D!rC_soE3a&vRnc&dluLd#1J* zt3h|w;Ji>mEdW<$Lu!bH#0jEE9QaqgJYE%)TUGeHBdO9I$r1G31BPJh?WHPm+`5v~0#?zsa6AOjDjA>#O=&?H^fg znGnsa<(&&Pv^AC=nf+I%kv@6RQ>IT|^h=lPpw(Y37lM`QvSC=2FGJK!o-I3q(PS2V z@?x&L3@vSuvkcCb_4LV$)h+tu#rnP~$IaE?d%<6AJTA7RUX z3VleSpq2wq`BJpJ?8n>)w0URRk%{k@-HwYEeZKT-DF5&Euk3eA%3!Wsx?~hH{^BKQZ>PK^_2jR9Z4|vnb?YE{iE>~c zJQaO9(Oc!?TK~ZI@F@xOp<#L!)6!L?Z_um8=Wd*IPwHCQ^+o?mmc?Z&JXo?XR8#ZA z;?thm`o9+aYwKrnd6B2#R|_GDXKHa)Z4&WI#X0*VBt;Bty2XFY-ETW6ew8cDe!6%* zeE7vf;4@QP9X_+gF~&K|h;`sfT0{)l;L0P0I=cQ9Gs1fH1hJ{$C(*}PwQd(h?L3eF z?>9}9Wk;Q<-wdL+$~pCUA-3F|BJk|J%7c-h^OPz^h2GkDjA1iMN2U)-c;}W$g^Bf~ z^{bv0jf$(+>lD!n4KV$@P{1?7>g57?+alZd!ahbC4mX6(s@-rF6jENA=h8I)u1L4* zwfVWc8E!4}ZN|NGZ<>#B#$&%AqV1U~Sb+8OP(eprkNeQCc=%`vv|;^xwm=TpFMyeo z-$Q}PSZ6xOe-Wz%3H&Lz<~HEhrufU6jIN;A4kBr!YUx=ni@$ZEM@ZOS6~owe{uBq} zoN;Z=On;$wWdh4y2v+8{XwBiz**Mk2V%~@eHd=`Xup8ST@`D6}ORSrr*Qqx8`N|ADwPDVS7OCH01dT|7kdSpyX6!a^R1t zXyc#Gzr^b4U-VZ@RgI$CnJ_j+(`bC0;4goJv8_l zwz7T5IN`&cIJXP(UPa{R1)mC>F>`iqZMAGCPg`@uJMZS`RCaf1OauMte_;Zt*gHWAOhH6o(9$6M7c@UJ+_8$7E31v1*J@iE$W}a6ALXeqzElV&ZZ}L>Fu3 zn}}-=6YvrdbE3zi=t&dezaVyamIcOIJPTqK@#+e>W$-Vi-%751VT*W{#kt`)+r|Cn z!+%{cMud3J@at$-$*2qPccf>b*d3zhvl?e4Ov0GHA~BQBPf5Em4``xip$Jscvrwjv zuH8c=tkY$DNc`_vC<|#j`4n*j@*ZS$Ny(w@R8hu8VwxF|{zh3#d|~hGJ5PH$vlM2* zKg}c^{!NY;qYsVq4uXGaP$>LuB1++Zbkzs==f{tOe@Idu{L9yAV5A$DydM7FQkKAf zAQg3&bxK2vNEB~ejCStX*n;&#+fA-i&ZYrkI@%8FOWHwO$mJg_;U+(eG)`u-(R@ zwe294nJvY5jF@A{c#W9LB1}&{Lz(W3-NZa(H`qm_ztMK$7t5t+-@eZ#@a#PA0>i5< z0Vw^{_sH?^w}>r)|NAvhajXLy9wT zKY1%KD(~B&iBZjF2YQXL6x~Ta%V=i@m6`9rc#BwI$;kE>a%j8oDzQk95y!;c-MWlT z#9hek|NV`=TY|Rxvcg0V&qA5%>H+_rzykO`jl$7R3nU`z4n-%UUVC^qA)mKD+KP7B zWR?vk7;Z-^gv;+ht9fS@%*8or9<7&}>KCJSS}D6=BJZ}F59bi=-DMapd`srhojoNu zKGw!@4gisF;5TAf9OGN!9v0_4H)(sX1>+fFxill|N+F;hRgX;s0q5a>gNR zZ$JERRfu73B2_7gbE9l!AI53ReZDx8T;6w|#<~5J)p7ezf?QQBm#UCgxQlxt<0{4{ z#A=rR)h)Dra1kSW<-s4cZS)2H3*7OqU-r`PO}sRZ8|C79Ai7~E{1<0L!ap)+3jA;F z%!dD(Vi@L`mh!;=>fTuRcT|eQ|Iz-0Dfmh!PmV_>kD7#E95p8_tNF9sFIA%;5iYQw;pGviHM3 ztiT2S@g*Jbzf$3kPY#wI;D!I|TC{cEg~NzUI;TDu{*eur;h%m2dFadEh`KoTH=*6l zSDxy{41U4sbC|2;y-Bd7c@wT42b%k!z}2G3Sj_mBcowCD$B5@x zw9iGc?Hk1NVvK8vIP3o&8^cVh=2stDBXYnNcT8A3eS>+Q_MLs037TKPah*dO$}mIR zvmgD+@m-NVXq~BtTxnT{NI4ir;RyB*{d2(-XN=wUisq=N-7mUQw`-Mk0xRgruXbBz z!_O|3%C+-hSoOKaS_{y~rGN&IIkRtZN1>qS4ZJkNr_cyG``_I(91N zsD$LI$>gt%$a0t$4_J4=%-y#RlD-*Q4vF<9! zi55V)PyNv;Z8te10=6pV$Vi(X+LOV{vL#>{-NkLQaSmF+CX$tonqb?MQJGPck@a29 zFWTlHrr-m{^NfcXaYXFjN^}oq{!@P;wk}r&5EbYAr|@)Idk1AXCSM@)9Ssd|zOa83 z99QH4XTMA@cwS$359CB6ayH%m&EN*-U{KZ^$Kia@h7sqiEK24S(X)g(Yvv$U^qpGJ zj!~OYh7nP~evDYS8e^Gb-NUwTGP1~9SFr6I#`i>_<;wvuR!T1T>9SLb)COH^6vjWD94Jc?=xhYQxU@ znCx>flkVcSj-2ZZy0X%Z7-boS8K)AhzB2YQ-eF{CEi0DuRy)|94U8D=U|vc7E?U2S z!u;bvD9lej#U6*kJBXY8_6tpL-rIm}+v`<4;J6};Xf__1(eS*u?hU9LjlOJs!@nC0 zcSfsP^P7WK-P$m<+9x*-TuXOxTlvgIKe9q@fv7Vm%829QI+*2*f=qBzij z=6}}5=^J9!veDKsIpvSh$;!>S1e|D&UT=9>dli@^w-^i%>jTZ^A~P+~w?RS1Nkj{@ zJ;=rxiyLgak+Fi2Ws5~3+YV&3Wn{hH`9AqO`3_^3K=P=`L#?6e#MeKKH#Idl=B47?1n7<@{$H?J{i2Td}WUt+= zo|!POxN{HY*%#VizO$hd&PS^j!S-blj%uZpnGM^V^>~-%q-aFNVq3s?P|~>t$G>NO z4b0U(06NPdPtBLoZ?u|o^J2_1`$50OVD^GaH^b3EfPQL~Q?(4XEk$s!oRV1t z+ko|RVD&H>t!C~TfC!rnIo|=x%zHpr?F*og9NORX3*E(S+QHiows5@ztC$0hg>C#B zh$w(Ij2euH7xv5`{`VOr>m4Sy*dA7EhkfL4FE&guKQ)jB^WYw|3`hPB^3i(k1@uZQ zo`zR&7Ohf+vvmTs zoM!YQrZu=T;fO_GA&V!t`e*GThW`y*wP6q60i06rF_IVCF?obG;Ev_C@2^MtlLzSYfSo5e6+Sw6Lx@ zq61HZbMi~T?GmEM*h}3!;2B^40;xsg-{R5HEX*= z&UqJp!a3&nB-pO1@`C5)BE-Y6C9{JJ*SmlL(Wr}ld%!Bt+Xd!&Kj@AOy+b+yQ+@S9 zM2W9%-7PJgS+To=nhZ#E;d0I{a4}=eHOMvPWK3|54P*VQ|4d#cH44pUA$jz zoGv`&U(#n`im&OjFy#{ZEKJpyJ_}Rp)wx6dR&4%YacWo&(H0-r59fnD`fxVAI}y%Y z7m=ZckB;-g^Ey4t5zj(=1h>DLZ)p{IeH3QNdGz~mI>Q0EV5*Bh&n%sJ7CAy8+Lv`o zC5p9^7g5P2JJMGDn#>xGmxt+punxQHcXr0Cyx0BW$SjlK@#JbTr ztx#M&8)%`;w9e5t!gRdpvn1Wi^jVVr0{S&8gILWr@;CoN@i$vGtPbb&fuo4p2auB?92v%It=)@PuEglM#p=EHzvg7TUUE*Xo@ zY4lmNEF0Fy)_I_4si80bQ>9&F(xNDJG4)>luNqI)uS^!!TBBY~N1@MvbludWQN|^8 zCzNMEzu#cEoqmPF=z-b@ocPsx5z|<;%do6gI|$=;dXAsPPc_62|Ne;ljs6as;C;IE zEGGS3Jsvn7&s{Ot9=M3UtnGAM4W1HJJK)J(gx6~bWbq+Rs_Uz`Mbr{k2}%^J-UxUk z8>Oo2a#EFFrPbn_mYT{6T>(8+mDvh*27i3hBjfsZxmMLMTnaUyXxvGo| zF@LKpi`<>3JOkO_LEq@Hj#Fw!W@jliU`#1dDnKu7qi^)swJSMd#CfQsiV^>z62=HP z`;otX=rBem-OK^BiT2f=FtWX?2+xv>=nLx0k6R+|`l@Qs&JD$a$i#zL3VhR)j;y~d zU9I?Rm9|QfqR1?k$p5jFGkq&xpc`PRAg`=YZ@pgb%i?ewZn?{X{O4ynWyoK%J9%QA0*j*Ql0a_O^ z<}6=*93?EhRn@&>AjCT@Opa0!oUwi`hjQ}zFoFd>meNM5Wg+8YU%ofwZ z`gsI>P7$m?pHl>X6UAr}a#|Fb6Phcki*+)NC~_=(x=1(JDpE`SO0DFtAU2Hp$>!0s zbe7HT*^9BZ{%!=u-N1`@_hO~vd19^-;#EJ?#KdHaqm90cL}e9ljxK0QR&c5j)?C%% zv2Om|6$L)cf(Kpm11tqfEyn`;`LFBwhRop~r}#Uxf-hcDEbKVn9HFP-o9A7d5goyq zhloT@pNDfpP|jaAQ=K?7^!v)~UeZFr8c+JPp{Zzce z{^hLUtTXOCJg<|zecPrDtojuAaPp58cS3hgY;=7Tad!M+D~G5#FHSVNUzd_YXdAtuT*wiA=kHdrlR%-Bj?>&J-kkNzZf zlE27?;eB*><_A%%E;aPrz&(y<@0N(la?ibZQ1j`;%g1k6q8}Vkat_2Q7)FY1Jkfk8`)n+ZyxJ}CJp8TKUWb2JvOh+^ z@hLFZFHQXiW7U?8VrXHdjo4n;uxTg0EipTN8H(Xb$Gfm*ZqA5|$C`OOBaE<;|a!|1F2Dm zu<|=Kt_}WrYjNb{pBt3nUq;VD3EZ7t0RO8Q@U)JiXQ3D@$ijP76tppAC&1X5JIndRee!}-cl!z7b1&qisw5=%P zF5<2kjEEub@t)3@!uXw75>BMQv9W3Bsl%h%SK*)T5DI@4e@{G1WL6|{>XLLkTK0rn zvOfIVH$~yNL0g02U!9Fs*bttlhY>*}AMpuNF06%rLNTJsG2N|(bE9ZU8qOp!rO5N8 zHD&ym^?omd8-LFpUd-mp_H3o{_xvR8jbI!gmZNm=Cb2@D5hl0`8+{){27)YWXlrbY zzODOPkiNhBp)%kR{2im0!(TD!7yNC~roumE3nF}AG{+qN#XBCt|9Rna_}A^81^>{} z5AffzR}lV>%SYkgTnQh;!}}_5ZV}s`ig9i$T|G+(R3XO%S00!`zZr5Mk;*@S<6xcK zit!Th;8I4s65E&q;ZE;Z#wWyDLq^03XWTsUcS5`TRu4jbKU|K%(VitG<6L;pV{-@m z*Jl5Q|FNCO>T2a(6XD-khTfMgR^A8ypZhxDf9^m6{68FAhqEcCRu{7t<3os&kz-v0 z{68N?`!3HuG8dmB1s+MqI44ElO60kB)Ri2Lo+j2WWMt!K{UB{0Lz{vpi4Ee6n;2gc zkDCx35rMI>VC2ki=eQm4f0crM{H!c<68uy1>fyh?82#(S^Rh$m52^G(E^^Z|;j;Z| zYVeI3-MTQGOJ*H;iSwmpJ;oo8mImaQ%{6-ZozdqLXE7f+dJ^%MO>UfqGhu!sA}M^n z@hQ#%aZOs}&{WL$lXwc50G=nFp3ewFY$K{%TxT>Hix|HWgSU}?d>{Pd>DwzGCv1BM z|4Rk3@UJOd4F7wT=wByiR3qlqWrw!H-<C_zeHxCVd?1$Z2Gn=khb~ zv9)hTZ!+H50%|0kMf=LdogKp&^5(ffjH0&ZuHg!H@H~s^`6Mzqk9OqZx}eIqow1*I z5v>VUFe0B}WXo7hOt?e-n-GoPMY*Z)mo5%~|GT~K;oo@xS#)XiP&@n$>e24i4^JQ` zcV{%A?%4xpaI}=iXG7qB@jRSE_%52lzxvVz_`kS}W147P!SOZC=uTw$B>HVAsYzE| zF^ayrdID!2(`#sv35M6a$mAOKaB*Fq&4@Z;`xNm8HzQgZ+h|REJ8dST9}%-B7aBhU zW)uBhenVdRUVjsW+27Si*yH`^2Ks>4NOJ?Ic^LiHb4&RoWXb0p@bmCX7ebGHm#71- z4J!mCyeHrs@Q~K&-FDG+xm$qBW>8DA3ltG70jEy5hk5Z&D&3XE*!2RU9^MQ&xKEk#&`4*h7ABL41cR6y#HDbpoJRhYSfgXtw zDE)QVZ7_>|HOg6)KEHDMX@uVHbe^8`;Z#7^PfiK*k^fGBC{->C=Zu}0jX8fzw*jLQ6W}l$_82Vnb^tBxP&As51BNTHp`W~HA`A$KQ{Q{6QLhyLsoV=;A|t*+P+KG6+A>&q(1rf0KVI~|#))(wqkG4k*@vkiYc3)`Q z?gb+<7~5wUYZ!}&UMHBjJ<(&r5Z>)}{|$UxPjoGV^N}`Wvh%s-x3GPEgkmmIZU)=< zov58dS9&zrCYGVZ$Kl9a`$X>yP{aOdMqY?x6UCUn3udMfO%3EMiS@fHngNu zQZpjqSat-N?9f?`k;GxiP6c?Tr(+DT8%?YO)4~P7h2Eto>xx|zm}1Ne8maCFd8Pd^ zD;lC-*R**ubq&pssC1j-j1`QC8ulbHvh1=!6tIV7mkpwcZ5V)4i1bYr#QcBejpXm@ zP0xaJ5qYx*&fmMxs*e3_aB%q0{2QElWC@(L%l+WFZKocr-lU^UTd%|mIOdb^3yKFFnTvfhVDA#@G%F%|NXS|D%->A_1~wZ+t{82+_kP^ z9f*0ifVDkle~YYZXH4^J0-uVhPh3bDV){YMBuF6g50pPJAxLmO)f`l zZLaOK1%=ZQIZj?;C&(Rc43mA{_dz4OBe;hDV;lgs&~MROZIea@T7?Op207EwyR9^+ zbgM;-vx%0Y_*R7>{fYqhTuU5r_94rQxK^8QiP2`hjb$OO{&Oui;u>y)C9+mR)zX9B z<#L*ts}db=4=KYr`OPsn8_}}_?UuBmMz+E&b78ye2wIZkP>vk5F5Kyl()-g-f=-Da zQ2NbqKhVefE7n&3*r9xj2IHMzw3-R1C!;wb)IxB9D$g175pI#WA?BzL{~_~sx*9M) zhdF74IXuP6&GDW^dgdr&Nu7BFW_-i+9mA!5<`^}WhnvGj&eNP9D^@Dzq|fEVGRIMp z{Oykq;Z=5SZ<^uE+vN@0k8SF(ebOQh&zDC~Bg?V!JWzXQ9IP_ZZ({xRQ_=*`FMI=5 zWCwjvQ?qQlzo4e^rMV%dKh-t~A2+=$lPA`1TDqWN@p{t@JVH`)O+#@_>}l$NE3*K) ze@ZsWR2s9?9Mf5J2eS!AJ!JtC)KTTSNe8ZhicQdR8cR&jmo#flkhR(pCg??owmzBL zRTFK+hb-ZI`ptDXhjyX%R!VJVu$|YU2-~?wR={&f`2o1O)BQ}QyVGA|mOPv!1_p*# zV8%b_qs2eYc$57y@ju4$#v?Kpjozx=l{;p1OlC;&lTp?}4HbK%h#7KfLPn0bvS~Kb zf{%vLVyqWmG~%IkenX5|x|ivhllmfth>k&mVFRv2-_y6ojAacsp`-{yn3?V~bRmCR zmj4{~DS)-t5ZcP}H9ZT58slo#qhHPO&W($7^F(h=2nUh1Z|OJ8Q;9fJh@DKiZX zU+ZBcGFH+=W+B}y@M#}U%hQ8TUrmTYiXs246s_Mhkj^XqlebvoY$L!Jie=o z*0Fs|YdrWDXNtUKKGFRBP!PrT4Mp{BR~Aahp=V(kS+}^sQ-(c@PqZAlt*=4PlG5|t zyg+cRZcS3)(&sv3;U86g=p^|R>a5cK*S^?rhjxWYs_8LpYxP8nVr`zKomRWGdPUZ7 z#I?@NO1811=kM8uYHdN=hihR(uus%NE;;PhQbRv1)>?qf&PC&JIcI3TM=#x_c^l*7 z7JB}kTZ|_9vb(1y&MR;}N#>>xh$gd!P;aB)H)unHM_py`3~Ixx^rpA0MB8>8LFQ=J zmw!TQH|~5U)~DIFSzl3Ab9_>kj-iG{gn)5@`bnP~mci=s_FXo4YFABe+5c6GP=DYQ zttPq5)@6z6H&F@KIMrLT54o+OC%n0b(G%W0tW;xg9#W z(zlp=PpVwPTsf1jCHy^Aw&J=)MkSK`joJFM;Z^e2e>Rj3+gbe+VH?nO6rOk5b|6EY zTab6^qesr7Cta?XyjV^3$j(1%i&PG7_BWiSd_Aeba=p^;2ot*~C0C!n&i0BI9p<{d zP_#7V_k5(#r=jTmTcKdtZQr#DKBAp|`xF%CJoL|0;D&>*JYumzO8yQwEMJE;uqX1F zSjniAN2>=1$s=<@Wa#tD(DCx)z{_&av5KB5hkOgymfK7IdQZq)=Lk`&a0o4TSKV*^(sT#U6^b%{Ov8h2$)svjgw)H3E%ywYApJtDB%DXOj+ZC=sq{wNH&-I< zj`eeEX(gEhFy8@(qiidi!&pj|>M;$(=3xQ_4o@atj@4u@B!itaYO6@6Fao96u08${MD{~2>k zL_|CxwrpYdyx=(Jg%$WE;c@f}7xDWR!au>9eqlUu9R0#YV$}lVRg&of)Gn!i!9uK` z?-qWEm2(y0!(gZID%|@WC9FyQifhPRE|0kE%n({e`dhyV*6X#qhHxe+YwMBk7oXbl z$XHDz|EQq7*#h~BD37N3fAUubBnz}{eiiD=_h^mr%2?j#5reDs=W6?2ic6n;$YC_$ z$1GPfg*DtW7iku*&7UDByLVj;PrQWf`c&>-zKh9H+@TW#mjBQP+!KS3TPc1xM# zm^b-c6>u*mUqB#M`g|kwv7&k|Mhf>{w6az3Dgnoii}9I3A;C zn43?^!Z}21-!?eQeaWuJ`rF)`5UhXt=U{}JCXl<1403-FwZ5Z_;FXr;V|3n`4I4#(@0{&a`5p!+h!sX~s7mM)TC5wyDF7x|}6){Wu zRg9WqJyndcl(<`zv4~hQjWLB-ioOA24hp^}mU$8B@BjJJx81&rSv`S&1Fhn8hlbsU zzZZSS^lZR-MCRzpjqO;up1;)y_q#94!D}*F@?N7ysTWvb?3h;c4x{tb-DoeT%_X04 z9vxp63IFGNaF$ZowAT*3YQbLY7d9MQ&)}IKa~M+@{}A`1 z?Z5}bDqSM|jg2kaOSIYme;pr~^xum_%)2ua`r)6Nat{7k8HnW37de6`!;-Fj3sw}N z^)rTdqxIIN>{$YTk8+H@{=t=v@c*{o3H}*X%@~_g4`57D`GYBc-M z!EaQ4jTnpsU~yFe4?);{5_+P1O0<*PQm~1 zrbY0t-ZmcoC+Ybu^)rga;J=}?0sec+uc6mz?w9m{x=RGhR&gNsI}#c zBhxV(lRApbQ4%|fdP&RG>tp?sw;q`@_t`Ou@VjF%WOD2gvB8)TR#+jQ%oxhZVtzuI zwrLF(WOcVfZj6o5ou^}CtC3ybQ<7WpEEm2lSKV~0 zARE6|X6=H%7CpDWdxUz;&9TZTdKOJJj$gmF4t1~mS)Yh+cZeS!hJSnGP57@qjZ&iG znjPU^cNTSYS$!@9b4QEwxj4fgybuQe(Tfvt9kTUeD#mGvi#VEq*(EJ}7b)@*S{Ccv z=sR3omn|797}2I&Tvx0a4-;GA1G+M@J+Z!Io>ofC5r%(j(INQz??rEVEOnrWi|f|% zx-|G(9Ls@!!^uzRSIVdJ;2+%b7$fz9^YB@B<6=MjyDy{dRxD_Rt;^4=IKI`pYuKY7 zejWL#^63WhbJ>v_C`+R32HfVGx515PNn08DwEaW8$zf#qf0OOGWk`E&?PVM!-qvT_ zLEQK+nQwO>?#_n)`+dvdpIHmr$IkW7@J{bWclaka^T7YZ`6cj=r-&8Sw<1foMqOWw z?`|z>i@;39;FcWx3vVOyUDNNNEbHxee_euiBkhL(?*V#b&E84(FC z?B&Ny@M!yW%nF}gNe34+ronI3LDVzgafv#}$ws{VyHhZp`iHGXPxGH0h+6qwb`=BD zEmwjZ?X94M>}7BQJV?_VM_F+b}54I6MFokh7qaPz8jr}MOR3e6( zGk6^8R*`)zRkl}wnsH^L;K?jT|jFtwwtq^!5Jyma4TOO z51Iy^#F2lv;@G~YEK|W0?R}uL>`PEp^gXy>#!L_+6K3};>OP;?_6x>4j29S>F;*}l zXYu-tjBLd6SwY)j?EZ&PN9HdxVgrBv&j;Yo-zx_5@8EAVSO)A|- zno)?6o9NAI|F};1MP@`|BWjY^Kp%PV9q&M3)_Yg4^SijXR(-36&;KlO6E0+1NeDFd9@vnFVsLZ&CaSr1I zqUU$Uequ-<^A{loej4$D`Tfr)V1Bb#9?nnOU%~m$m3^R6V-=h?9BhDXZ%F`XmAxK@ z_fwKUuhr3Ih1>kveW)0ZL9Pl1&qjkY8jCd!u zQGXD539{DlRAt*s82K5e5QEwMw?S+bC~*3SKg>UV#wg+cvR4hxpWEMqJXa{@MvWNh ze6kPXU%fw+Am-jq*%@%_PT2&mSPdhuiGiai@tEs2Fxv71s7%i|@tiDIfGhQWG3@cU zO;3mQI7OvvbPh;b0x(}`|>84(3+_YeaE zm^u6W$iICAt?XC#`5MeidT9*V+dd5E(^r~d`?eAF@{&4u54Pzg>2Mp!t^`9>x={)%7fn|J4f7ayzLL4{nzG2?mO<1ubSvfyz|6n*`%r#&JZ~FO0p6?Tl>X zaXrem_cCTPvbwLBPyYTFiGCYK;$ZIZ`7X@0dJ#8oosRKvw!eayd#9GWJJwp2fx)_yKxKKv+;OHv4%P_&nJW(VQ0We6QSc1zgLvlvf9_NV z^r+c?9X4Wq?cxxFS>AjHUtIBAcCe;-w}U2Te*q52(Z$ak`02ggon-FiPxPETf|hi@ z_W2W>clAcYc5??_>$3F<_BdBIqQ#tU(>G(C_)8Eu$H?qKGD$(S9h_ryu!=blgfoTx zRySmhy|&dItZx3$H6J&_?y|zHSrhH>3$FZ!?2_kx5|*_K#dVAueNHAm!_EjR6Q}Hu zVUjEDgmINqXNTUp^tvsMyZn~z8(jSl*|y^v^rkKPf>M_4Va#WBZA-}C^AMSP$PwMz zMi4RAr;a>iA_-n+Je)QgG}J)rz&Hvd^9F) z@=R;>paGFwt2=I0GNx8*t#uTxSSjc}R6S$)OW~U449nY#{?#tAJTz~wZlonzTJNFd z2AGJ`Q%DWh)A!Mg-dn=fWU1v+tSJXrB16myEzz&c-&lOa_1rXz$GEDHvABlvOe{{2 zzl$lEJF!-9lpZ+++Y5tyu#N6TCfI6qxWZPTl{|Ty(8AV>YB)HCQ|T-mZ+ng&uF?lm zodsT5IK~{5ZZUrt%%^N)9^%%mC2h`ay;eWd?1G-SF~@A9;xf|@X3mSV%)go`@TFTu znDKMjSmm2xbhEB9{fwhuHtnL8Grfqi@o4}&CYcr@f>TXX5lw0OyvAvfDO$u?$P{&S znN7b`gnxfX{`O0VwmU{pGn+Ysk`&M0qwoyuKx{0PTGimWu*m|E5Us(H%nV9p5uxau z0EwF>7gCdznoR^_I(0b4MZuQF`;3L$c`a@lowdGdGr=fKZ=L;2BT2;rj>?8Vm&iH2 zHf-n5a1k>+F@A=t0R57e>li&D!|ki#DrCcV`c%cE#}I~|XANc0Gs_Hl(Mt;qeqnr! zGI)g%$Hd?^#`^gNEdI7L$ehDk!K!fN5j_7L)PU#a-b?UY)RBhveAa4n| zn$6RG7#=O=bJ84O$Z;DQjK#pIY&bbNS{lj$jW4@xKvkm9|$vUy%2OVTlV51Jkf}nLe zi!r}3p!rkC0&TQW$P1dwhVIoqhk3sjT~{EsqvUVFPc*X}c?;XZK`VIv?R|i(+(6IL zG!SYHrfh9Wo;{#jS5ql>MCU+hlwP6sp`2QacUs-4w;d$4=ETam&C*;QeA4S*jXw8$ zziN$Wj@OD7jj8$?!Q<4Mm5M{E)l((oL;q2?7t9TNrM`SpPk6OD`c;Ix+7MRn1k|2@ zuhq_AC1$tUUR+Oe)HZ=*YH081tMrVoRdMu;uhkN2bHID5tpA$)A#$^>h% zAU0^lJ*BMRuc31k``n*L7%O^mPOcnLc%y%C)p&(0WwF&s3Z_!aW6Bj~%|95sR=$7g z_&7;g^NYJFUxQWjczI+|!ZLcoRYE&G;VLnPo^X}KEB7yWLk_)TO{m-{tTs)MD+c$; zB~twLTF6`{f~ci1IveBG%t4%k)TZ=J#3(D)aZ~uWl4EPR#v_FTO=m5a$j_>I=j<(e zthB`^Xt`@HSJ2{RN@?=p-4~P11{%z|)JTlD~QenX7aWm9$6EbLATcaXeX*K9PkyOTTu!)xINL z-+F=bS~9=sxyRzgS+zVXbR(7;6bxPDREhxTyVMlE5nuZ0rAt}k+!ag3G zQc8qEY?9J$&rdVhvnfXKo{C3$m7uls_02^B&lXI|uoTGQY0Y>{&sN&vColv2%zqv0 z8C&VuN}03xwZUROWJuORz6P+74;j2oix1=fwhQyn3$l&o<&wYLPcmP|KE;+^JBog@ z#9**y{sW0=eHuF3M7ldC*vSi5w7&2*5?t9d7UIXJP^%ohbncY0nek6&?#=aEH;dag ztt6#p%9XeUo1`bc54oD5KHkQoYill-fz9)*0`wulY<@)OM~(v4-*)99cNa?KBBnFj zx1%(yoHrBmbQv+SVC5YB4@7;ia*kOr*iOvH$PKm;3yg`FO|X$)gpES;B}ZKZ^m&^G zujoyh5!mPAaBtG(&P9G*coxdIh^@FURw`}@R#$!3e#QE=ek#VY+@j5hLRwemN#ya0 zZ1nz6zU?P4_NngZ#&~R-k8Q(!g@QP(9df{jpq(3T_Q*$XT}r_y|lsj=Y-k<2c#~tL0CKCs?+hsHW|c6B&aT?-Ltk8PVd{ z{z%luabWI23~zz|?W6+8$LYdTvB_QU^RsWAMXRUAU3qz<6p?Gdf@g8$CL zN8tahz8?Muk57Sr_DQ_bYoPHIW+e`%L~uS7JdJWSnobX4v~WGM6LaMQ&3L8YKr?E} z9oKx3Oj=N15UmEX$e%?`v1Y!5@h9<|9V4QO`@P2zJy7?tv6Xj-^j*@?uUi+xKVk=3 z_9f45oWVLjRCK|=r}`A`V&|*73IEXgQTPX+xDEflre2K2oHKPe>u|RqhT&Z2ZehL> za{(=A|Lr33%H-*#-S`ZD|7EnV{Km`gFv7`Palw5*f36(G`t8L3R>cuRtc^Dlug+u) zV8lp;ySw=qBN#6bud_^xav<{!+{COxJd0*t!2tYsP(Hs@t@?%4Uj90idyVH9qI8-AR54Y#%-N~XDOUvX~Sc(W2S z{ybWvmdvG`j_;RMEAN~RLXsHM0jX2IV{btnebjJBV@PBo=2L7L~j=_J;4YbRq zpSN)Qg!^|E!T-hG7nms~+*ie{cTqcPYGz5-5ZXZ^KwHnt zeSpzm;=Knfst@Op)k7BfhiDyaqeL#QM=Wz5m9cGBN4mQZRr$^UgB;KvVatutS3}3>j+oFF zQrHuEg>OB`q8nOH4xu|4H!~(NhBKmm_*a};Km$g0W(bvJ+c+Zbv#XaUJ7I zMpnBR_RWRWZ2lk3=F(ALf1$Nj{(XM~6n^RgbL-oKaLzlAJ>mVw4uN+2{2N5u+ORBPYOPjQfeJ+4Cz_MYG7WyNIJqexZ-8w0VzsL`FPCHb<1)##j^n{QNyo z;TU2QR=QsePpeR^~qJjb{Dkx&_bIttz=e#&C&hf?fGv4fd&oyh-teIJN>_JCpp6EfZ zI_U_~aN821!8V5ypGG-=(wP$dha<2BC`l3Aq0HJ7~78>4DC!Qj80GksMiQyPCiXDhDq^Efa3r!8}W-u+`By z1+J6BD71MejB#Oea~J%|rhFrM#3r58ZWBofe?=KbL48VUbDKl7yql8R+y-$CJAN8L zt*1!Y?F+RzwY*ClDLZ@2ra-ytIMg~u48oTj%6is9?ThR1ZTnp{=oh=>Qfp|N$Rd-%J#znnCqy=aLA#gLz5W+Euhxu$ zY^7dM7?Z;Q=O-M1lC)s>lJ#CUw21MDT+3yo>%0cF?+5FmtC}K6VNe%2E zwOch((y?H5oR%>k;&=$93#B$?GqjvbnLrs#=tTGLjt7Zy z`&mM}hqJJU?Tv{AP}?zB0JSfA;1$+OThYS|)!KPbSX!C|&dZ61hNuKfa9*$jYCqwY z1j<^X@63Pd?gyL5Z=RUPilG0^E%-t~$<6K{_Z)I$J<(vkkkITqn7stG4<}YbZQtNo=p5})1edk$f=-26 zjC+g1QXDs*%|TC@dnE*-u1~@6G_wS^N|4WL1NM-^x@ebafqVvNFN$xOO7lGj+1b!9 zrt{~{nfu!08`eJQCU3Eht}=Oq)m(=OY`&?$q#pN2Oq#&Mw@sSB=3Mhl;*j%CGV#Ug zb=brXYp9JT`lMZU5k$EyeTv_@kCYijvu#itI>8CGK7*H`Hmt`8I#0DqK-v{YC@-Utu#~}EgeA4 z^;yn+P%)tnS=g3foYhd>4PIa{ZsoPU*WkGBogKCYnhG2CY&6&?+9tS6|HJOqgV*&t zw|I)U=vU4ECdRE_2qmZWQ?S0~)(^rewN>8{IkoNju$Oe0K6+iIPhW`S0Q50h<&NsZ zC*<4ppi<$R-Y25p%AIJo_(o`+MQEltJ4Dn@NJHnh!KYC8u_p}Lez&6E3^{9YZUaUs zJY2sr2j|dVozRcmc2w|(bwhf~+;{Nq&@Hn%BgoX%&|4&?tjnTcD=DwjCB`Mwq*J&@ zQO;e*Z>zY1tB&!)^NKfg6tKR2P1boTtU6Grs;9FOxo=NxL^}1O+K8VTx!QxsWZc$< z9kqJ2VRP+1?Go&b`m{5Ne)A}z*_4i46FQcS_s&j2=lcmA=)5`j0Sc>njzM8B_Jumd8n+g^>NaZB;JoKFPN0r68W@!ZjT-)_`>Y1$GNVilC@>Dz zkVLPCYrwBetu)|QW-=OxAm;4qQ$)YPp2`#w%6si2XG+R>|9IZ7!(d!T!-AM@4gKjAg8fC_F$%1re69M+LFedaW|N-Fig% zEj;_8@dq+Ixwjhk zD7J2k)D{v^f+eXMgI^=5~B!6n}U&pob-rF8Jsmg0E_j6{K7sGu2kjxM+ z$K=tMt_(8UxviIb0p1}qw|lr;Jytmia>d|`+)=F9%H%w;Zq}AFCHl4L^+&DwM85`Y zh1$g*JkZHEk&f#E?au|^q2Afp|nIuNB+Z2QWzJ3N2C^jBa#?zK{1k#kw0gb zY$5v9=*n58h3HorCRE(|Ljt4RcLF_jv+bx2r0!T*Zb4W&bYuf*&R`v?1p zaq+8#w2F>%)`vEWwy?5?S&N<`?;sI{Rl~DH5#u5biK>G4ME4?pZY#PPoDo4piz*O- z=IFg5*T5E$)5sZUh~Qg@L-hGsxkE&`EH9xn-w#7vzfhWh&xpr8cij8=&|vQ-xd&pJ zZL4(aM273uSr`lFmECaQ60*vD=GJ>qJ8{sb=zwl0Tj2ctF&+^iPX*ho#lyP=IudTf^Tkuqy5;f5!Izj$Y$8T*De~z<&^#^C9x)s08PI)5w{#?8C|< zF=^igDBlQ%~t@7*T@){!?yr3jNZN2Ofd`;6$9qED`gQ~Mt>BKk!a|A2o9 zJ)U?eAa&r%^P@@@g3Y~$3KboteU_*v)9yqimRy2*t3q4tIjS^ zmwl*wQ~0+nX?fzYyEjKAsV3ap=p9;+V!OV?b5(lE+PBtkGk>q~Fu0VxZS{QRGdXRm zo=ZsN&aA|9FnLoe_w9Ih{L+f_^#%FDD|XBq%Rj&T7P94>%k{vrWy45jZCd6FrY!vh z{#%N1SQJH`ZYY{2Pd60XEMM`SC5i)D{(%Ip3`ASgazl*s4kU@xBlRui7tM2XQ({%sH<%2)1SGWYk-gMLkn>K|R!8}Kd>DGx-4=aa!0C%qS9Fs|Ba zl1h;&?#Rf)8RK%^LVrU6VqemO;-46Y2Ty&6{x*`gx2Y?yf&S97h}0@wB%3E$ejfdO zz`UXh*3zhS$DJ7(l`rSaS=xO;hUmCZL0H8`8A17m@FJ`MUM8&GOo>?(WqkL4|Cmhv zuO$Db1+QWz81Cxv1U;zXdQ_ z-$!&bpf|xHO85=li(*7cm6JR+^50>UPYIhu2>E7-W=(vH$+Tl3^hGT{7e{`8{Ra}Ym;p^FoUY)w10yBCpYgPT5P@r-{2d&y#y_DtXp4F2Q)4FmM7!!!{V2m9mGror~ zYcBK~7TH7p(=uJ?&#l}I{Wcg1b8ZARu800oa-aN};OqOKzw?GRV)49Ng3y1g!w>mL zjV|=EUDTbm(BIk}g4KuK-3+XQ+j=aqfVcR_cjAH+L(L~R^ zLBjidl;~NMsm=R1NVyNb2VNt501M#GcV42IJe|a3=5!FAyb1jg=OoFybgH3b=vD)I z=U(nr#EKg=t)HR))lJy^OiO1ht{1Z2K`kjpJ(w@UKi|`W{wsaxH9O`5)MBF5zY2ZK zGOz)2W99&~i5_@_7VXV@G=pfj_OS}~TEUOAaTVs;<5xt_6Jg3I%DaS5VKLB|vVrm+ z;WK5zA2ic9CoqN9x z`WX)q@lt9ZL1Bd6ldZ^S?|wRoHDb&le9UCxIlNk9}&L7*+5&$ddi=KuVpCVIhZeS9wxKAg0LFLnas

L*}XwHEBnxBwMzo0n?HfUn}&SceW0;4o5 zL55}y(QiU$UPePiv!M>50ga;dO7TXNXkANWbeHLf&%RV~&_46&fYB>0zE{?^9hypy z_1(ENJR7V1V%6_gd= zRn)G`=8UTB5^Bq{RUYMH%g~9ooj?z$l}6>onSDI&r!dR_ll&cVMNnrQ9b;7 zfn}n~{7+Y1*_9?#OM%JhF#{V=D_}CQh8IYLvOdeC$S$Ov2jnY7Vka zQC%#fi_G~_nd_jIj40SBa}t^JgEIR;Pniwipv(ef{!U3x5&h~^zv^M4Tp1%T_a?<= z?4RGFaFoH&pT3T9!S1KrmEVWG`eYY>at*1Le)_5>rutg#<7dgkS4;1*WtLrOtu)ME zAT^rxv{*ojHCDZR*JWG(V^!Re!;U|0u9m!RTw5b2F`~AkmPx|*nn+!Z#EJ9T^=rgG zoxIwxUcCB1UBgrHpbgcH`r@$p#zAp-y1QKB7@O|;i^I>{9TeYzY&pL;?5ZhBY#RJ1 zHiWlmoE3XQ^vl!vube8B>&h52VByy=i!t7FkxwNlIshQFv}#BbTiP>F4y3X(2} z-5Ok&X>rNn$>RKP7e(%Bl=6x4Ru)w46XDL@d~5jyrP$Ki^z%Xf0reijgH8%}S%goU za5P^ODp$+C_ftst+Smh2!Ql%WE!Bcy-14n?f)XqoZ3=?BHlJzxDDVq8b6J5tFjt@% z{3TF=ocToo_@alI0n^C*)bYSJz24CLu z+1kwqcsS!0J+M2)>i?&pbYI;;eM)lSr=HBFmnlici@- z%Q`;GdbdmbcNw)OZtvspHr-E-Gb3BP<2Yt6J?5Mr!8*zHO^HsJ<26@^#);)bi_JTWatY4ZbaCg*VK3X*YKoiF^ z#Qs$Qy=(A`nl*h~@X-$j;0FWl4PqR1Zg`Unf805wN>(+8?;<8U@a``n$nnu7$R7@l zJ|n*Zc&~%~!*%ap&6%_O=!a7fJLiKlWdq?ys01Y`5oe&>O*ls94EC?LBialST(5;) z=!_-%kokvIAs3xOc-x1NyuJU=R`M%}&(4o=wZZZ3wRo4#+!yf0P1Xa59jjiD9r8K4 z!$KHWm`C6V0*`%w*Kpw-6U0is;yC=cCdcQq(Eok{{^ert7cG)M{0g6PB>HO^-k~`& z$wa;dJZVp~O`@(r^ardw&?owaF&O1WLh5$rO!1R)h!;_qj5@)d{~p2{b%bPIgg~@wwni}83FWg`qvw{A*pP@EB;7c#`XHI^F{@YVS z(EsJTHT1vyQH5x@?B^5gLT~>CC1?3(@K;9<%;4_(4$bP#nX^7>ww9NaCYEZdFY=Vb%TEMu@BH6 z@de{Y^QLdGlN)~DOYttIL%*buPnt6eZ9y!5pv3hu1Al9tNXM28!s~QCBu2-4zBF>= zUtd0FP9WvYu7vY3W)f}xFRZ{5A@l!;ux$n5Q$*DaMjz@Bx#)VrQK z5pN(8Cuiiz5$4iZE{ED;_A_!Mdoy7ct;fvv>7$7IxJNiizv=A(Pqy4coY-Cy4XPJd zfyyG8)afK&FfBL_RCLAh)NN)4SY>#p9!XaCuEC?FgbP7eirG;_nklkd zFM#k{AnX@}PX%{S;%QM{NeOR(Y(H!n{7yMRm8H1f|HB?>cX&&=FK zHA_*=VT5V4Pp0uq%Ry(xh%&hS`2r|RXu&;G*lN)KlN$?gy=0xFTi}}D*SJeN`J!%; zpIH@nMSUD(zJ~sv_(urOo7jI0t&rHbtqepw113`9X;DTm1f40ZDUB($D4_uVD?^y& zN|n=|lMzKVS5nQiN2M{5aw_6d=xm+V1rLpwKw*{0Bw-sRyg16J9gKy4 zDA7VFk5l4KD8r+GU4$9b7o^jgPp8?EH0l{srKx6G|H;&kCm)-(h0f>^jA2R3pR+@o zPwQTALk;eekW(-UiY0x+m8U|`+v1DdI6*ygJVpEwjcedMY5Y~(3-T`XxGM4%&$##< zBA^#h5@$)NLrH5mj@EFT1U({5d4`gU@(^JP_=2Wd0Rhvf`*H5{PFxFtY653iu-~(b#KF9T<3tCYt(VVxh;+hSG=RuWZw0zV* zA@Nwdx#?C5nwl4ZT$<1vxj<$$GWLDsR{#-}$8kI&cK2eC)^h}{;RvcNg4S)sWuh)N&$FU$6=#qAfv;FrG3_o~oteYfLUFN7KF>eRR4F+5$%Uq2&8>)KH{e zYY?vanfyXE!mbc?6R{x~wj6$od^0TEz-p)W9Fhz)&A&X4;< z)%Fm^Jf>=25JpW=?j($){URb|8eTbkY6PQ4xbpLS-0NX0>M-o`?P#pj^c2E!L(P-R z!F3@sh|Qbb4}x|U@Gc>|BwG`*Sf*(;M{xfImE8itRa_$n%Y$R~t~@+H*k!Kx(eJ^A zh~|cZ(PvI%1fxZ{j|N}DE|uzF0nBw2gJGAaTZ8eWXW4=eVCLu@yo>0Mp<{0JMXL5J zRVzdoK_iNAXHpI;B@CUO{sW4Pu7#4K=Plso)=tD~vA1u7+Y4(DH&-POf>+7!w}a-n ztFI^ytg`k+OEv5C6@f zI)~r*-E+@6{lw48qVD`MKTfTyVnMzP*-)tuzK=xIWX||zoxE^e%h!7!pF)MN@ggpz zKwo)eaAtikVz0`uFF$sCRQR66{#1A0!(_L-FB9gVM}46{W7c;K=0lCXi-`U(sz3B! zYL8I0n9)P$VZuPn>!FbLZvUL`C&>EIs1zvnVg=R?irTh-%(W|)viPJIZ906;hbu*x zuiU#cH1%Sew~hPA)mz@omW$=3yoR(2Rd~D#WM?(>yzE8ZX}|KieDaT;i5JIyd4p?S z8<*-C_Iu64ezp~!U%^gK^biv#&sUf|vw3!b>aed-ClC%?lhcpoG0qV)28!HHFakv5?NS3IxR^74s$JSn;)e$GQB z#YK+E{aff;)fMjX9vs@w-OpPp8Lo7nqrJv-nOlpTrG>Lwq^N_nnwt)Ht8IXrFmt#) zv)iE+!4Bqb7)2cI+|YBKcDbVGI^A%^vp8RJ#j`knbM41`)Z6t5W_4R!AAkj}bwt0v z231Sr1fTCzC-s?LPe|F5mOUm(*<;6dSfab^Xv{xL-LhX?=bCW+(`GE{rYx_@_Abzygjtwt=@C8(jul_P+es4Nc^6aJx6A0Zc3Eh+lT@?vk3<;eBz9%ucIMt0d2yAtl|HA9q8^4x@jqBpP%x}f!&@n%+NK^?wLo2mx`T@)q1}pb}ZWO16ggyuUiDS+E!ky z37co@$zvK`W~;)oC}Pr9VBPY_AGWOUdM&oF$mol<%fUw5x$rOCHb1~SHh7{~PMbk6 z&juD1x6=ks1fA(rC$)3uzohKcO6W*uP!6=`+G9t}k$St*?{_cN+V+lqP#m@0_@Z22 z-bTLdk)^uz&Dt)fUDn%+raYcnC8YBDJ+Rstb|cua(mh*KKV((cr zU!O_XW8rs6EorxfG_O>0w#8xAODU}ut2czF-Z1}(NY}y~z98*`c`qUxY4e9*qj@8u zG+y%xFvmO>QSw@IM5>vN=AlHt<1A6@5K3r&lF;@Wp-m&9btZ#xg53)GrA#a{zQ5Oy zv#5K&##G7t%ZmYrOXjR?43B0r*Sf_4mreVN4~HE$y`1V8?PAgqJ~zI~M9tGW+28n= zRc~5~ai-40%%#RE@^0D3jQ5Bw$z5#p@ia@Gp-}^yPri*&>ZV5pSBwxd7tS#<1C5Q~ zCkvk%p}!TKFuDY08Dab_UTg&4S8QOk59~17O!V7O4{t@E!jkq`ixWh-86uxElBSrQ z$}KQKTj=#0C;wPu<71Tj{;c~R!;ZdH0SX4c+K-2q7zox0#YyRh7n>#r>HSH)mm#ia z7JfBni|(xF)BGsiKx@GwEnN=XizNvMMkFbkA(64AkLae^KS3vw7=* z8)DkOk;xd>euw$=742@4OV@_axw%XmQOHd*?P9P)I~DnJ7Hy0Xx4g7{h<-CVLo}fl zPF6AIP8pgo7{bd8*5HjO5B1uxf4)^05uLNIj?E7~zuVdd?@hz2wVe8d<8Nt3x0|G~ zX*{a)%2}teqWES(tGa&L#?tj_kHU*9eAOhqxNqE4?Y6GDC8}zw+jIM>>Q054x_v5L z;y!oER3gr9uYawgc37yPS%r7ITcfkec4W)fsr&<)Dt`m-E8|(3wkxCmHaRHY2cIb4 zM9yQsGOVcCPC1_F*I!3!TlXr1vAjqdF`KBR7LI6SYDD9`BJb4?c6gtbc2dc*&puZ{(W>Mr>uX*##>Uss7(d}m7TkylFN zJGt{V9L?utyY!Urv&z~kDm>_y-7g{0Dk1ZdZ+n}rOy-fC_A@f}JImY0WMt<~J+zYH zMV`Dvh6Ne&?K0@g9fmSX!28nhOPw2~;Y&NUq|rM%E2Z&77}>%YjD-hPVIdbs$(K8{ zuPPxYVrQ$MkN1l3U5D~W1vxe37`0^Q{Yc23m9BpOw0O(4;J(tzn5%~EBe&jPF~76$ zPM?%>iOAiq%OzlA-KX%SbFT>Xqm zdy8&QT{zvdO-vGba$_+(MbAz0&duHhVjIBgV$j-~d1)M+ zxPoR!fe~2s_EWDTO&U8w?x)E>A`6GpzkF$}4@(hMJ+NE$&-K_NvWUS5 z?-hpSq*Mu>!h1#R`KR$l@rJX=rQEJKUHNn2-2$G<4;NYjxQF_Wbj+Mw|IqxY1DC^{ zl%5LC;gYX?yN-FMn-5$(dNh)2aDZd2_vBlF!!x$k!(4|~8SH=8bVyR!bo3y5{N=9q z^6Ya2q(2C;`EY*wFwMrcf8R$h)`2xbAAhl?AUA%F)duurMO%#BXJyAXH`lN(1h26S zg3&Cu!RKWEpJ_86YToN9FJ`#WeB7|5j501{v`Xe3TaNdNCT4zQXky9IQNS7o4h!;YtzFU16JF2+!=eLxA{Zq`Qg+Jlj)B}(plDD zQ(C4`+Fw`_RN#&vlz^Fp3GGB%KAswxf1HEb4kK*C*o<5>#%b(}#x)s?*GHkh_#MW= z4}U+pL;uw0Y4`<^NnF1^@cR+y|M?3wmJv031Nt5R3?VXAXQ02?(@4Z<74dVb`Gi;L zm?KQ*cHAQ52-_yYZ8Tc^C!UnaJ^wpPg2{Qcii8g+A0y6yW>_9H7ZQ&05q?6C`Z+m? zn)!I)dk)^^B0TdL`qTbOK>rxIR~d~2GnbNbH2wnmzZ3rJ+j>UNNLek2@LylZIsc24 z|MlhbLzhT-C!Gua|Li}nPa@jd_Y!t96AsYYeur^_!5EJsoUA4MiMIQ7?9X!O4He%6Jlrst}(3MtBrngnUDeaDyS?KXm?0?);yg;^k{{ z#)vQB#0EmL5(Lc-gye7kcmBFbj*RUf95_VSnM~L?m#{pFFpJi349z6@)8}&hLXMmM zL#Vl)P}ZODViMt5TS881{|6S3@)lRZWwfry{r{7Gyn$$#oKX%x55nib4roo4x{z{7 z3nf)t?D{tgk>KYEFVOf6{BhyeC!L^I6P~tkXC-=g!ToHE_5~Kvv*2N0_`&>7cIw~_ zvKJ=bPvI-5cIgRt_7vjE{Jl)|Ao@Kr`S=?UJsx~Z`I54mvV-zICH@BIz{a7OT5VZ3 z(OF8{vUC^Ke4VhE)?g8Rx+2-X<0H(WoazcTuC**qTEPWMCV_H#iU%g>Td(oI!vI?tpxS$;Kg!}=|flU0!3-8HT07hC#U)pGFLhA`w(O1c+KGl zEr^~R4N7^+tCVOb92cZKP02-hn6Q+CXe;5Rny*pK)OHKYNx9$$CGCOv*?-|N^H)z) zL1(}l=*(OCbP-e~G}V9{l~%Y*Z#Gfr79$0o@Rs3doWZn6x0!m0|j_g zK<544;Hr60lJ%SD$wHffLzL8hvbt%xgOavU)*V`=EmchGyr_=oETo>LfclOC>P_;E z$??29lw1G8Dsw$1TA=Os8wt?v>2`2Q(^F_jszlpn3uL1fv&LcwGyLR06?@z)i`ifs zeA7?zMZU}qu~9IWrxgrfMlEJq&BshPlh%ADt@BJ#qA>FuC29&~v?$0*$wY~J!$PQ? z6mBC53us&9U!`iPkIQW$!*@!ro3%&KVKyBRvrm$8RtRG;w0)cS3hKRafRdr7 zXoU=uW*pC$Q;8N%PtQj5kbW_y9E~IA#eYO7iXpp z9)Rl97V<@`)Jmc!mBuxx@w6OH89?bliM!$)v@U2!n5RKCt5MB#EX)p|YO4q{Cn)Kt zlM%?+0d1eZKyA9}n@A{m{?q`}Y(`&BovfSy!?XKA?wAi)Y5L?h0A|}Kfcgecz*9;& z;0p0+{ugxtDpI0FQP1az!fbx3 zS(K`!Pn1E&`}BHpB>f-4G#Lgbv{ioD1MYuQ3MC0o(atGM&F68=(yDc!WX^o7CVY#9 zcTLLnho4MRv`1{3wA&Cz5+{^qz`Nvk?TPWHn?VN_VNi1gdO_l4q9>7`5_X9)JLP^# zYVC>ZX?X?Z0>Uh6+nMu;!VDUFrPI+W?HoChN=LyI+7>DE7-CSU@`V?AI^H}4`JbXb z6Yn?cf>Kr7h-W|N90EgQp(;Uue33T(hXbA~{+6K%S;0|;=Zu$=fES79I3oqFVMUw9 z{aPinsy=QQ5p-PKGrUD-dmQ@q?iF#3fn(a z1!Tw`$J&7|{;niv=795KrVLA#Y>H`AF4>(M6E1m{T`xxW%oonmmlAilGR+=eJgBN8nqCmD%5U6+cSi@kcNV5VnNOLri&20K#|Ld%ffkqOPip4xq(DPVtS3}$knp&@v0h)}3E(I3}9)h1B2 zzJ$?Ugi+yyk<^Puyd>p_&5U}i9BF*PxEI#=_A1Eyj0Y<+$@iA+8VKE9HO@U1Qj#+* zk{5D5j``~G;E4c1g%81rj;GYkgJq3w=%@$pRv9(O2pYe9$K-fW1K($};h@ArlNRrT z+%~0Jg$2RGSicW~wb?WUp{Lnu2MJ>K`A-n;VOJG|QN&&{=pgtpXeVYBo_;0*N4zXFA830&DN_i1Y<=-PkKV z9?+c2p=uBy8>gpx%>Qpdi1D<4u49-bx4)Y44%-X<%&JNb&-}hhNjZ1>HSw3a?e8l#~ za@>&BKj?Ei*TCG?=TcmO?F;YE0e#NC-cgS4Jr;UjGwfu9H`M z;(A=`1q2c@Tw{;&B{E#?cK9UkbybBoS?P+WNXcIf zPV09?k4_hHfhOpTBHDZf34Q1&;6;11Cym)WZjj^dD4&&dgGI?myDj)Ct$oS$!rQ+V zoGziyrX6RUzutT973VB-<58f9Q+Mvya6u>ec)^%?j^6@36XYC2oeGn?9nYF*r$syb zR(qSd!lC{uTQ-}6pWud^hYl*owDT4_@b5CpU*iDV$bav!0x^v_8F&l&?57Y@^4Wg` zOY8>`tF5!|0&VQuz!&xnME}3O)8s*|$Q@ZAthvyb*`<@gSRLaGza$jqgr`vCalFr9 z7*066`|4t+@33Qt&2x>tV%NbyeY>jrDIwf5X?*)b!fTUQ=fEpEYA9udg}RR+(f9wcOccVs-ph z{eF|nOxqh4nsCg2-*CrdGv?D=CX2ve<5_T+d_U!`kTGKSyYa?7;1}}!lqTVSe?MiA zXtudbXa%)www7jiBg$5b-N@+vGQ;R*|I`$%;QNnB4zi7>dd$H+@8&(ebwr;f;Y@9{USUvD{ck-^=P!4&bvsN4njh%eYsB9# z)jcA8u0>AglW=`&s?N<5^V{Ne!uGFiH`Fm*s`qfC&NXE9ymZciJvzscVPe+7h}Pk% zgXijatg{R`gI(It+G(skN$TJ13sG(g`{!siF2K(J7e?sOCc6!8p|*MT)v>#HL=Vpr zx1PLFDm_H|`Q(OtHLd=k&N3&>k*>aKNzFC)AJ0q{UB=}3&6FGBXWsLpLgOw4-Jb$5lo#@y1gz}HN7<1+4Yh#{n zE}$ijHH%#uwW#fL>H^68&m-#>InPysu~YY|vdrX#YHg*{!}IHg6j{4BH1R5&d9b#H zNB-(f_J@MkL-WlaG31^lOg>vG#~G~G{aQBBrSJJs*_~#e`c}wPYj*eFlDRHZJ8(#5 z!G+{k;?noI-3M8v!w;4ZzLnNlJN(*K8j;`Y7t)AF-|UgbIQ2$X8lLk_^|cxB@3jxe zoC{rp6}=6(hLM_+Q_Y#dP&%h#fp6v>Q9>{FjaNYA79&hnE;5wlFpDh8lZixj)P$@K z+}U`wVA8eO`-;x+xi&kggWYnEbS|%bpwP8Ia^6kH-un_;^4t3b#Ca2CUTqO`4Sw;u z;ZldI{M%2LxXfLL3oh1Zxs9B?C?Xp$njrd4B<+2^X!NNkAM8aHSOY#D5Iwlj`D2yH zZ)BL(h+w1~lNRX&V?_{4j17roAZN}jf?3eGj))VOFQSipUW)Vse5au5ss`Siqc63d z!AR1Q=)<1>7h=_Tqqxe&BIKgoMBsn!sh)p@cXV79-Z5GK^r)cMuy=3Hxli30FFE-G z9u#54f%#_7(2p}S1xH3tobE}y|KTO?V2IqfEYBC$vCpbJ2Q3bKnRm)rTi~lB_lTVN zWHYylXydo0lT*Csr+iMPvjbhrV!GtyZsf)np1=t8{rrhR(CY*&>U;YM=>M_w zgfA#^!U*&^f%$^d4-w?l!d!$Ad8X|U_=r9KoB6lmojH5XC^8s#6L?@(ZDZVHHqVG|eqHo;=FWkOZGWP7t~;IhS8|8-VWqzxw}08O zkfBHR^D%C3M|8;exeZUjU~Frmbfd)Rh9m0_PADE!eS~!FZ*(sgc1LzOts~8}|pprNQr(d_FdJs^{3`F}%x2bQ;!q z%kvjT$AZtZ-!WrI{3}iN+7RF1_J`0Co&fP>38DNx!b>j*&rtut0iS_ANlytEP%lmt zlK%OhnR9JR5Z*uIvWf|re?M||`xnCQg@iBRf1!C5;Ya%96NC5_f$dZ--lZe?iy3Qd z&cDZ@pT-xrUXyzjUL#CiK^Te=52JSoq16&XU1LIp#e`xLgnU;BkA5fI>qEHwDj~V& ze`gIwV$?SLEZ#Z)jj&&ya43uLBWe=4Xm`RNVuZiZir<>ZmEWZj_Rv_Ph1PJ*C32*Y z&ViC?^c|)^j(D6Pw4%rL#7S9kC7}cz?fmSi(q~`MY!=R;aqA_)(r>8k7+i()<)2CL#ID{_AaMe$8q1}l+^20TK%+uwr?Mv zgO+{pM-_`6u7;k(TKKGTA@W7bvd<|TU{2_JP}7YZVKcvoT>Wni)LH41s~AyB3(rAU zY0#k%&}NMus6q6UqIJOwlzf!jlt(F9DVZoSBZFpYXE&*Lu0B9?-ndHDVq8G2c2Uyf z6+Wa~{_UqXXz~F)r|e5#4CwaoAh@x%0r#yf#`syPoq`!g>8>!$rAl77VO%LmB~z*r zGfi?t_!>r(lAQvJz`2L_V3p_N+9t4@=qW~1i{dzKg<{$Y#k3Wwsa4#t zpqlAOQ;CQIwMzR%1sB!qO<4AhQt~HkptR-VJW!;s7#eyX3V?>SFTvHt3FPi6R-kDZ z7s%!YEk$3=VG%`*n&M#8HMB^Pv49D9`EVV`y?#GPYqbcy1!X)N#*)93@Qx@?P=25s zqU z{Ke2y_&x>oRG1v53d*{Tf!oc|UIk;C;b8qW)N4VUz#wRML=9BkK#rq7fIO6kDKWz1 z$Sz9U59KwK=q)It=Rh+ZUCN(RwVx^1QMJNUEoKK$_?VK8RYhUsyD3GB$d`2r-TQ{Y zRSz9;wbZ)ppg{3k%)&pU+y|4xLO>b!-QZTT3p($ECfX>kR(d5EDJTb8a;yavH!TFI z&F3K&K$(RSe~B`BK1h}4Eu-as2y=fEmUU3I)c=$WQO*BQwZ{mHObH9AMHQ|lioqnQIl+0J6DXN0$Dxg&|n01zkD8(#D{+ zU=Mhn11*?yXtN!-iRj5$K$ty4IZ64E67_=P)Mm1u(Q*f2Ni0=MS(HuH(lMrhwnYK$ zx&K}TYbO7j$Mo|TR7HK%1DE&j#vLOc-U0X4Y2*5hC7hsUDvoDw44X!N{-Jv`7;I4m zDrh-_?9$!fJRwD_j|?4!*UfC*0#Bb=LG)y%QASbX|8T^M(vi}N63>t0I)p|4in^$^ z{Ch1)m+A~9%)LiRy;F`nDQ8#z+5jH-=mQN2{pY~F58vQwg>^)UXbJj4##riQFfp7R zyiDFMld;C)4{}ZeTBy17BAK(GhtT^)0_keUu57MIzpzbXPfPkyL_mY-JFy$ZG#yrT zs3#q5dE{m~JjK!aG_(k(MH*U!YgZat>eqPWGYX@rDO`boRLg%<75?>lcKYITKHxPo>`ci?WxlXd9J$pIzx;K9_oB_EQy!||QGBrgv&9_}PT%QV5-q!rpx zm(C~l%d$vaNGv(OSvo&4@c10L(L}SIMhd}+@_0*VRiZFv%41?+s5MgO^?PtLQdyO>|N}T-xZ4%HE)eA z#cyzZV$t4~Y_X}}BLb(Ka!U97&)vy#yM&$7}t< zU&q}aTMx4J!ym+Eb@&~!i)FfVLBJ@cs`Sw1KQUry+zLCRry@8svZB*G=j!i|mbbcY zvMqYIj-iEV)VSPXn=Mgw7xeAkMa6OTIQ|pmu*cV_JxU$fz;jU&$YAnB@qr(sxG?*4 zh&qfp+|HF9s2^kaas zzhwG~&_{lsB6meK`-OO|jcf4Zw~kJH@5|7Am2$_o>H0)Ehi`~zR^}#OE$*SLAYWl- z`Rq1dmIb*vkI8Raa$S7kGjnHseqg*&_xS|&_`qA{pZ4hk(|jId99`t|faninCOSiq zn?k!$UmD~_%7Mm&0fr35zJ31o*j=pRmw+!te)nyi;Wb(2yK?NlgNKj&%OtO@-gTYI zLFwN6>W@ZV^2#XVh!^uZn0`HFvu9(Zb%wjAvX@oPI?rV`i}S`kTJ+Ql9XL^U$36>U(Pu;c2!Z% zDtaT;6V5vn4&Rz}8oG4yc7#(E&ur}@r!W?mx))C7E6eWObdtq>Mlq-J;0-5u(S{XH zM?e#&{osA4t;neFa9RagkT1euRftADUUba$Ttk$*!*g=oal>3jHq{kvVL0OgzvS5B z?7(37**HbaL`Q@>HjT3+1~~i}SdwwiLA3K(zMg$jeML#N{fe?Xm63KH=`%OI>{dmw z)E=@;^%ksWwH37a(HLs;L*J&U#->!E?_QFPx!Ae~n{D_{?`q+-*}}G~^_ca{+R(N+ z)&qDqu%C51IBpG3(SF7ntLur!p7AL*(`4iTquvV`1NSh%@7Oz z`oDGZ=9%Sd8y}dj%8^ao`^A? zJ~2r+bM4uni8=d=uKOku8~1m6nV`0N7MNhn?ol;a2^N~nMV?@;F(RbiOUCHSz0t-m z!8gX}1z1@%BFb$ZW1Z--?{dC#(2&+zvtQSGsZdlkI!D?;`YA3*IIMUIagfk5^8xUrz6nU znk0Ans7_nF+`?_T?Js1%EE4G8k*&o1d6H~0X3M9^V&v6%MHZId=__jizLV9(%=u1P zM9|kNvNEJ!33DH(TpkL;!aqC+$Nu@5_ZMKz;^#eNq^_=aF^UPCDUVzzDqYTn=5=Ki zfA7iKEOYxqO+k>fcxz7CU$<2&J*sEja?G-=-yqc#6W=%}wZ?CH%iNo04iaq~$)V?d zozjx(YA?F3NX}O{-!oq#Nn*+yFA13oWp7_ftUeadn=Afx$GkoZ@w}xA-W?S8#17LC zapX_$ev3ordv0-Q&_rAaEEPY6ne%Dl`@u`%$Scm++(A^j>mrAm*S#Y15Nj6cw?lDq zPOB8=$ijSXqF*FrNxa1w9rwgBzf(9~Y}4=iIi5+;bgP@!>YA!Zt7FKGRa zXg(t_>EqRo{BuriLOnOmUadOZ7tKFEo9E+^Gk?V@e=+AnUf+NEG?(M~?{%ln7{?5K zJ!$zY?`Ht-&--z|_wwGCj32f+@%d8Ih~Ejb6DR(to#5W>z}a&A_sSYh-tp`)RvgZ8 z*bJz{c$X3Nk1K~5kxQVA-eFQLh*>08aJFCSZmd{*3U>;4_Fby3FZhWjMV13f-5{TFxrKPLh`6tZxQ>mMW>`|06#g?~ zMr}F=+m2mx2etip8NRVTWIhzM`AnUGebMMe(2SUeQ_v9?F-M9%KYWj#FZi^EzQ3J~ zlB>5;IS1c_sEH_z(a&b06Ydy0CWMF@o660A642Yz%^97?h<0WHZgD`(HXr8xe0s#BIH!!BX-x)E2%89mv{!g4ZG-B zYi>iEWA_{TM9lq2OpqZ4vHEvmW9t{p=C#%7`eVdKoW(Srcuj?P&YyV9 zn7GS?xH^wGH=j64hwnN#~QADLm*1y7u@wjMJ9>8bfjpmgFma7JJ#G!!}?0QF1|Ez|g)odOr% zgU-}XH=ct9{J59Yz`fr=i)FaqR5j9*D#wVrKv|HHpOKgG2;)A+9mHH_uelSMX66U8 zC7D_erk1rx=5Z=#u-Uncc~nlf>&M(w`n)d8KcofMW6mkgh+G1HjbjWa z<{;W(G{CGg%adtl^`FUXCPRd&4P|64lEyxn`m_H8v_0!80jJiZo>RQ?gTd2@=uydE z0zZR+bgoRYlnLx2dEGPAeA0J?m0*z=+AhiK>>f~OA3R->>>agTgrn#J$@riLMQ_Ga6u{%obrz@$PKR?8=wdn*lz8?U+)8iWOW=sz0bibV1rzsMgYH~todj4F zsLUwKh@OKhB8(Rq(Q|MGbq6wA`df24^XchJNL$)zrdEsTWWFGU*-WxBT}f(Xyw(qE zPpt34Oa?Z^pqwz6-wV1V8iU8_6vFsH=N1~dnxaPImDHDmJPK%q_}O9^h|_)NCW3_r z5FO(pR_cR}q$ zF`<(2Oh2qWKCgQzC|GZU?|)q|1=LT3wa0A?LJh~Zx=aJ@P0>$duc}LcYZTC1V+O?+ zfu-lPz>ovzDKS>7&=xVQ|HiPIkGW3TVlFW9G4e1TWZcb&9tcZlB0b5kiAgMGB(0!w zq9D`BqI*26^Z0#qCC-g;RzIvg)~x#wIKMs?zvWMFq>VY1_!4UheL)VOn+y6vw2)~G zI9J^lD>xnZPl7Sx&p@Mdzd)ITs^GcR2_RDywSrVd&0=I04kN^Wkv|x}GQMMEJw1u} z!$hVt!H=}X7chkbj5~?3tSw@ys2sD07#+}G2rlowf!_+Ohqs8@Q-HROtVtRRJ_*8K zBiFe=TST)delx;V{XHmm-x=I5-U&`QkNOYqJ+u|9pr??+aSxymqaC9Op2NEku7@)P ze}${#EFJT3^p1IB!eLhn3&a2JBkM^|JYyWI;aJvBW0?I%vs^7|ggz5>nHU+xxU&BZ zG}w2;??o)DhYtx4EYJl{C2hxgO;6BI(B1`A7k0*MC-|4fUd%bw-2Vc4OYl#U4Sgao zc6m{#;Gv!kC82xQP2Qdpx(w&%d=H(3Y;;e^Z@eE#Hw2$PvN)s<`9)Yr2cq=kkS3f| zFA-9UJ@%m?rF4(6nA<_EGA|nakm+QxJTj8X5#5YyiQz2Xht*IyjAvjnltgvIDnj?Y zT#H$;^nyt6T9OoI%Z7rXIXJ)tUNrcs*|T|3!E-fCHhm3hdmy+!HYh|QgQp@$OTdwD zWzhA*5$B?VxYwV(C>OK_V}g4@Gw^(>e9&m*r_F&w$nv@ZKOtB85QzG^Ru|Zgz4S?e zjo3rv99T{IqdZ7YB+F?coSDurrjSJeIDY&!^awG8WhcR`rv#rHK<^1k?k)z8yu65v zEvujvyq;u>?Eic4-4*=-KCavL6$S{JW%GUtn5NNkzS;lfgV-x;{e2{NiB9)dzOYT= zssDu|DpI-rJ2&V`8~86AV`okre+6zpl0MmJc7|d!r$d}52&5Wyv0Z)nkEdy6TzHayvzk-*rB0s*u znX4c9wj`AusrFR~4mo$$m&^5uh`Ue4i`f#rKE|2{WmfoHR9t>n&1aEh{Da@#eHUt! z9(d<*UwtyoJ78n8%4u)22^DHw-cPYZUdkJ`tuEk=-laa|ErijJkM~)OAr5+<0IR(Z zBOjOb-b4CBSXL7}o+)H@9ypHaWU;`XWe$GK^ZO>yb>9g@ANc|J5bw&K<+J8{^S=x` zSnX9<$a{XX*Y)JF*K0k$1oz%{@^o}fz4ycO#EaWX4?TWqI;cGG$Wk;_uk|pwxlh~4 ziX!dCcCt!pPfwX!0-PgYF#|m0xs6J)16e&j%yi(=mqNb&mrJ+{2KM z^Sk?jW$x~zKY-P?|6x+)$3}g=TbRN_L~l`|ml4r3mvIWw)Q|ameNF%{)tG zmwlJkTMxNRKeouW*ZI>H4SO5sn(03shMZHd((v9n1fx$6XAg{lxSZjOoqe2NU_7zF z*#I3szJ|XsYv(Ni}u!o=YE4050>%3!+nCIVSFN|8g zLhqFcNVn&OHLtUW{REoZ?;`ykEc0}$V+vWe@8U^iXLq6#>&uSC9L}a$4nsK0J=I|s z-Ye>4ulIel;#a$do)~peyORy)3@_Nm7WTgwwmpzsVB2Do8>jiVuGVIa}|N`V_js>X)Ef_-3oh#YSkRfG`Hyr`xOyQ9-GfWW$v*w$=2Jf4~BSEJj)488$4cow) z3-j=n$*_|ei&*UZ_czDAJUm0=K<&$BfADtB(Pl@#-?Be!s{dw*`)!lXh77+3lM_Xc zLh_AMQZ7gBF+LP37U%rD++8#&>bZ;sciN=qQ?(N_QjKySak94?>D*qID`Lbev^;;J z(cBZi3q%b+?wU}jWmvXkTG10jM3Lg6G`qck2g@@9vtCl!w?Fi>BS(qB6E*^96l6;aP- zdaSBhq2_GKRX3!zTPLOAglfm*&982#+DMx;?@_&QrM@Ltb^fU>traTo_D*gqR>|WM zY4=irZ|vBmf|~E}P=TN6_^5(9?>s_pf$!8;L0;NfqJq5i^-LAS0<5pXH!gdsjm%Sc zvKB`B52G{}Va-BC9W`(J;h72MqT|)zV?(7?Phm&5iwZZ+yEyw)aBy0#*pqv2>WlX( z`!yO@L_cmXzEr#J@xfHS1_33Wx|deUmIK{JWVf#wp*cWl_(A3uX6$S7p(=2km7SfpxO5E790TFJR&C6ytH` z&+GdG*gt<);S6ef>Rl*LFuJpw!^u*S%ZKKPvX3yY>nO7wJG#e8PaiaF`E%>r+iRU8 zQomj;c#|YGzWCEShnxFS2R`kUydS>x>n@30PpN^i5-Y5X2d|6U>0SMCOq}b<*q_5< ziL!~mjl_hnY7b|KO*->@B=$zxL9IVVH=Nc>a}M6PJ81zY{sz1~hjRlN0=SxS7UNi= zD0~r!oLjR-))>8VNE+IFGjAdPjP}22fSG?K3FM!J_F`Y5S>p!osF9oACDFe68tkX% zFOfHc|?cWA`-h4&jl|sLj(CL!1Lz^!Pq>28r5EKpf91*=_=Go5qb1~O?A$rvk zz2A64vc;1OaFU!g&P=kshF=!g&5y`)zVGl>FmU5r@ZpReke?LN+ZI9eVvs36hm0D} z6*V&=cXXH{nu;|G)oaMy;@=4O!$LL)h2lAd3_%UdMGsuOjk)Nh0^-no>f93!=Y1%@ zH}>mpLf;TjqmT=B9%yNa4XBj7^Nlf^fx$(TMRr zvbW&#d$Fn&MsM^ixPST}=AxB(k&8AjxHy~vWbSvF0>S_4lBYIxHDngiIdDFXj`oh0pHSz}_e4sQkjVt^W6X``}?!{It| z2jvxGMAhIqM$RMhEZce%-?Q||HgHMhLS*Pm;M+lrAMu<*HX|}0lm!^)5*J|Ge|L>Xqcg(^DkTbzHUjLue{=e_y z$5HzJK9+Yhb5Xf$BQZmk7>PcJ+?JJXzfswUeNs)4%J>e{IH;J?lUJgYZ1%fRiM9t7=?Zh{j81bEU9eNNBsMQ zMFnOp5(RWc@DcH3B5_|Yaa}WUUMBIM^pBkS@0I_37eCM^pr8F>a|e~nm{nw+r*ahX z4vf`UU$BR7zwth^{I3Rz5% zst@wtqTM!_ohbZ4J7NlplrgVR=z1ID!otUb@Q8(%kNScKHeiffxRR6>P9qlJH$cQG z5ZM~|hOvVYzl|&P#7gD`Dx67GIqQLC!&ENgVQOud+K-G^h{deci}{8zt5H<;5&o>` zW}7{Jcc|hO=#h0AB+ZcG-Om`e8h+m8U8B6D9L!8SpJh#mCqxV9V3>)ccX5ZMV7GkF1|@uikR{u zR{wX4Z>JoTyw}#yE{> zX1=eGd5XdXbfv(6aqI|uZoc71ZE!&wB6(hDC8A2+C3??&?yqQQ$&L1bUFFKtJ9~4t z=!;;j;kR-uSSIZPV%saI%QFv@p;H5M&`#h%#?6dejA$WTpUF6xaU3xlYEaM2+ZHox zFJdvKXf!D-WNlHvdQpBmUCBQ|%tKxTZW-AFRbd~YB$vDGExy015?6ARv!FI-X*9~& zH9oQO5Wq>%BB=DJx3|pULv%@doubD}(n&?*?(7;2FjvjQAX`Y++o_ z$a+c^Y7kZt!PGJ@P{6!)!5pR*Sp;-C5_8`(o+IWk-;uL(1hthN^)UfF){Z!zRb6=% zRL;W8P1fRQNsLx2e9$8@jcj4(nP>DXz8zi~A>KusfgZl-mFZV((Z|#08KC{sI_SCfv?v)5(16}W zk|uQ=_my^PD-XEkFL{tzOBy^E)+2@)2N*vxqF>>92P0|+H7w86K4of|x5-YSa@H5d z-Na1h$1_@~oNi5~)fKVsvA)V|>Ag-i5#FFsc!A#*m)u zDa5Qb#LP3q40U2UyO(t4h0-MHN@_0S{t?)AO5~?S;6XZ%GP$4<{W1A=HpWcJ6QVz1 zH6+0ozmRmtwiw)K06S0Yf4URQrk!7jcEV_pL`B}k;N|W6!2{FBO--Wp%LQK&VH?XA zCQiVaf}DgAoXqzr;X8KMb0>U8d{d$|=FQI&x=4Q}^CuaspQf{%GA)xS{KUA4n4&~X zE@EU^PLj(AshatT8^7z+?gXx?9Kz~SX0{F}83Ppw(|zG>;o7x>k{t(Lj}Zqa_`-5y66}Q6d&Vdk9^d~U=J3<^CtPAC$nl<= z9^D|aT5xrA^hteTuV~wy{MWBVtIjbOdl(Jn5+>1t*g3yA`XqMFAB#SW9XH#e(U))i zjNXd<^EuJ@C25oB6{J78lWJm zgxkj=5=7$U!XqqC9ltj%;?b___uoYb&!714N(5T;(QpL3@7h5sV`3Cc|8U8eIs)2U62@gznwj}*;%M-hpPr+&C!}(>zK&T)>_S^T(-2qejekccsu~Q0Xkgrs6rzOeRWtY3i_Ua-LCJo3%6UQ3_9xW$2Q4FQTAhd}<*ZRVc>H|+7X90;7exXC&q;2TD4uLC+T?kT3{jO?BUpr_f7 z4afpD0+PXjfEbM26#_ybe^exksu8SLhI28Ue=9sl!a@jUVWZ-G4t?qS{v}nv6s!EN=eVgE`+bO&)E)0<1Tu%&Q`U6=%4Y)v8{8<$9i{@}Pw)+lY z{$ho%;GcBKcRmrHPdzy0!_|@WOvKxvdYAqq@0B^tX4+m+vHsRgUYGoDIR<)uxBu=Y z>KXKWsn;S;S+(iDI-VQvln1DJ^k3%>s`Ds3;}jC+;kSQc*eMUg71zQ8JYXjgt{zuW zvmze+V21~MPSjPoev_oT&Nc_GB)2*%tqe$A zO79Fx9d2g=W4>Ep~L@beV*=bIx=Y=BzX?aq|Bh>-d+`l+Nv*a*j``69OhX ze9yfbw%9>E?qu{BhdBXr;%)3B95Rvx?XMe;P7|@8^K4$`V!P^lW3tWc97OYT)$L@@ zYUYoz<2mS3aMf=4>heNO3bsZ3wulx*J+>{#hOgTqqbg3eEkLe0*){_dvrPcQZ6ip( zJF^+r9#ZZC3&DzpC1zf>I%#62EQ8L0m3MG3#VIr|?Qs_-d+i!p)oNfAuRdm4JoQ+mz9l7$IEx#H+D!OGE_{_fK zi>1^(m-3yKt8Qpjj97d*CsTFDqUcafwV#Fm+VYwN3)p$>QwwAjb$?k%f{*E4Fm+`X zu%-Hi7CfM|#Q`wNVms+~WUBwy|q@jBP&x&U(EbJ zv&iRg0(O{>a7-fx&5wLpo3Q+aZD&YYzS)Nw?wqw|61kj0F4LEBeWiO$r2|STCz=d6 zn%C?$aWMW^mv3@LeRabs<39>KuMQfgik)fdF@Antwq?Ju*pcP>dceRNb!$R7p zKSw>b+tHIF?LVJ)U>5!S^Lo(sc^TOB9PzSqizKI*kHUS@ zi?P1C3iFaPjD4{4U;p`j?4RFgh<<7rY=ArRP|=sh>D=vlh{Ey0x_fZ`jDpTy%rwr> zzKnClmuV?|39R|08TI-=qmIUxn#R^~8t3zZJCCSG#s_pKs&5K(?H&Cr*y-83v}cD+ zet#HJ>(IFRd90e*{opSRYRAMm-_EOzx?t3=tXgsO{lHUIzb(tZi>PW&yZ!x}>MhKW z%d1`hvsK}Lh9;|`FAwpnV*E1nTy+^(pgJ3;7whSL;Be&5=t7T9k~VS)+iIyM%dNT~%%lr&d$t6n01detP-Kn|App+OIXc&6Fc**YsvR z9?l#25c~L2!kEuPN*O_8`==`Ha{Bn)^HGYa=1|h3s~R7F20r}x;QDW=hyD_k!#NKn zFTNOg^>8x}_n&gbU)!c|d=#r@%ffPz`GIbXFBr8Ll^Eq1MKKe0=o$RK;YL+g*h$jU zuXul}<`Z0rk9gdOng1@Odzc*!eKZT2*D03cy_}&BJg}pC-hK4wxAPU$zi#=k{GP?@ z;xBLR`q!!s)ZJ;%zxLz#9j*kq-;VO?L684v$+bA&M-2&^O~(@wJ(|{_hT?p1xg;!6 zrs`54XmcE%Pey#lY;fEB*WgrADE*DGoe^FLSF#zABchBLXC|x&tM;6AKMb`!_a5p$ z&EU=mPRpMpe;RYq9N8dfE|Xcp;k?$l?a$%#N!>!tf98|=3%jH1B+I^P{M436>RK@} zARbs-kG0B-eB`hCSm30vtTFa z&$|zl*@gahb;}ZX#H-^-p-2y71!Ec`at2&Sjs%*)`x{D&;Aw?Lw@@S56D0AyWk1C6 z+YRD3;3qqju0uhu*|lZR942xbC!);0l8*hl_Cm+e?Ky(^U*U}|J?&D&3dP2{ZSc5L z3YKH7p+E5?I6hbov3ik<4xSzpe1ZGs57znyPI(xIsG=?92Tl?igVoN^ljwhZqI+-` ze6yFM&Q7`JZZaLD+c<--TYRRurCpfPK;H z&rZdOC_#LvsbPUrdZd|Gl6V|8iWLflZ)kCDzpiYoL^RbIW8L9=0b=-pti))nd*2K0 zfLB}WiniMG{RPUqN3@}H_smCH9L}x-x9stBgV7b#_KqK?XMn2oF4P?pSH8hB4oPEi zkK38eZ@)-tw<8LJ$e*#|(94*Q829A$I$R?`uarEA2*~ z#lK1=Zdpa#ph;ZwiMVpvHz}+>-0fa~)dZosw;awq;etLqzwk0?4OR-)hDhMuAiA#5 zIXci>oBZ_OPiraRTQLs7Z(^5{Fp|2^{dI; zcn;^6^M-i{~5YMvvJ+hI?o8c|6KhK=_Px^mp{`Z>yANudmuk@hb zVMTuhvFI4_@6&6-P#?&!;DZt2t%-W9&Y!UBvT1bXIxG#Nan>$JXHj|UOX4#0JnTLc zCI08T_*XsuZMi>>zQ4zb_|lA6gnow^3wAGI%)&jU&=o8AAB+rHi#&mcz*$~pL{T}S zKq&FpFmVU7#+3`HJhhSd@AYHtEr34ps+8Es{(U2}*9Q0zXkvBoaxazZy%<>^t8=7s z-LgSlWQ(zH{lIe#Ie3!cTk&MjJ^3am9O4bmaB;yCCbedm?Wy+BI0!zz_XXs?{u5l! z#{*8?C4!ZRZ`0kuR?=Hl&WLD*GRD|oG$R``R{68C7xC3rQqssgLW4GyUnVn-Ce~je z*2OR~yR2n)Sqpy$ZFYlB;KsL^(2&&tpIt3m3_n*rD_IY}SQt_W>bm5Cr_7Fnb2J`f z#i3ha511^9?55IzFOt?EcHv$sZ_P9Z&y%W3ZpIyq$a!#ui*XU-T*ev126#7UhUbCW zF2<$AI(SCZDpOuNoys+=?W)RrJA2u#r#DTv+PPwx>C7v5czmT?AsxbuW=c^ z^J6i7r`$dnF~9t5=n`;@>l&;wR2P{u=sUx3TTqD8ay1T4uAB`)e4M#0i8vfn&|IE0{77i zidNi!)fN8cPXOEYegN|p;I0e9NL3+n9?+7}kWrISmGKdy0gC|lhV`X6=6!ljSOz$Wvkbi;N zF4(PE368#BjTMJFF<47};9YKiCD{6oaMb9ylb#Z06~)JxPI+RXJJZ?0$b4+RF_rT^GTtKQHV-`jWqJefo!=T; zLCX>zaA!&~))YF!R)V%}sNrlu^U>g9Ewq1D&jTkgLHs0WbqgrV0}I^YXY*oBU#XWFe~#H{x_`dfEA%$FtMJ4$AS}O}ARH>ipPr6`Yf^h|WS1 zyqA6rPpPg>$G^OylYR=h>LWViNkl6B5b~xA>AOjPKJ)*1uB0kAf+?(E3YmpuAE0uU z7BRDiaVIgun{nPyI%dUOdVhnfULD4qSy~BNHSK!pCU8QS=hADbac)g}YEvJY`<>uR z-K)Lx{PWaNichZCrc_E?5!Fr!JpWeWTZ+*k>08k$ce#Gbw543a{`pxc$FP4sBL(s6 z-sqHd*fT#W1=g+*pRxeE59Cu|qYoCRpuSM6ZloleSxXknLNW`Pwy%sEi0OBUX{n5? zkEgO0N$DSYgIwonA7W7Q?^o~#$+jgeD<39rO_e!(A*nH}^IU0?q5Ima(~^#v|ByV8 zG)~)Ac1vQp;#&ngS0&N@P&M(ffb-*biGqj4p0*|KSrwxum$(?aB(^3_#GZMR1Vm*` z+k{WpEiawW1O7-rjMp|#Xv9cjc|r~8&)m**viv)J7gKnKn5sZb@gOF*GO~L~(xGx< zFQdp0*k(dqpXiF-gsZQ7j=qY2U%E(8C*CkMSYk~4*6>a858@i!)gDU4Sz26ssu?Gw zGfKTPZZQr|FpPa8sb#PxHtm9p(T`ZyBMK%8v6^da%*-5;Y zV0J8egw@elw1rh#>~icCKJ@o_iK#iHBqf0mAga|O!8j($ zQ%Av^J4)tZkM)kI9XIFOU5FZgajipE-b&LBN21mrbeP)xzC7%=XbA* zRKuLCQshIhGx9F>@n4F>+Jk3iBzhNWvYshqcM+e?v@!dMZKHB5i*7Nj7e}+W994ud zBySYF>$x$J=0B7rBqPW7<=oec&~BQmY7{ZO)Lw6TxOdtvlV{;4!}G27hV^-@v-b*f zw_N7jA10>L>E0T)^3g-@3!!~Cv;8K9W?cLoup`vv=!>8^q3Rn}1}BF~VBGdP^ejd{ zMRb;3m}=-&tnQ2pT?5L~Gd|&^q38t>+d^lO{#fQ!VzNkWG|SziSX)FE(3QXUu|=?) zIb0B<^tEBmn7J?xMZCKc5-Rk=Uqv*eu=5pzi!UYy7nRoAjSs$>rsi@pXfR@q z*Zv@94;{Z>L1!)XgUW*@>I#RQ4J>~2BT^#JT1qy$Ht_bPlGyyfqsP4Cp9L=4*qksJ z2tS)NKHvlRGN1*v`!t{u91K9TNVyb{0fq)7!oJ4`M3Mf;{Y>X9V%TpYX+s_SVTAoG z3=hWY#@V8vhuG2WLht2K_6i)2d0oE%i65=z3jSs9_Bu}U=Wep`aP!M8Tkfy!Cy-Ve zI?nffghJFtUlWg>xZA$_Ee8`Te7@CoV`0n>*QN{Q_L3dP60c-5v>ZZc>92X-pDHoe|g)&?+bXFk^Yd|q%)ZH+@RT1 z4rG~sz$l!{AnQL9`=WjPw%`<+_rBM$qkE-~4ffAp^hR8B$nxIxbG~Pbm&-e)pv_+6 zn(8A;J&nrbb92mP`0+kY+y~qA#-(@1K~p3GhOk731;zhJDc%o~Uhud=K~^8xMEfg?p5n7k0f` zyT1P^5NYQs@Gd-I*d?lYepk2%$QhF9b{sarKxdpqsW zYpUaOeD^r>rH^CqZSzJW$0tH6O_LnY@vdwZb6mT9e~XdhxM^ywq7Ja1R*pl{s8Ma2 z^q!ZtPKPYarEhdVTyKBq5Dg|epr@lBvuNePvKn`O?47N5vkE1ebL99 zQFh^ST7ezi`HrVB(5mL9PESoWvtgsp6PPMxgH zw@B^Ai#7&ci<&KL)>vO@+h<*`FWV7pZKf>!`jz!*>C4^j)-$dsycuWJbyD>0ajVpw zV|uSzIn7q-TWY0^y>$szXoYuMti(Z6D?zZ_3K{wPnN~cYkkx+D@61Ov@Aw}6WUGTG z>_psN2DV*ccNps|qim5E`7E$miaq}o*6T6z|Jn*Im36@qeW7T&h5yg;if88i?+?@& znxAZrc=hB(WVvwLoEOV8R&{on`9=2iXq#>IvhLM2EwpZa_rp|4pY!pU>FOu*KJ%M2 z%WU}a(ZpN$@wX!;4^M^k%b4)(dNXjxglm4^_f;knu=6~|_$%hmxr{qNRpVMP(YOR0 zG|tBS`5xmW(r@zs^O*as&~ufhS|S!32Ux(jyKFN@j}B5cL!63xVTv}&sHfAV3agE) zIGjrP=di1nPo6LQHKRquNc6o<=UYRM=HWLg2AuNHcUcCvGjuFS>D{}Zb#v?qZRth;4#B+kN_ zPIC@AKNyjrqKudeBEtsr7}2|h^vsa$KRIKP3Og~Uw|IDX7{T+0%hP_@5YZvF*@iSEkAW8VRy8e_Of4>dOvDidSCEqsit8I|2IjE#_~Udw>7qBwEj#| z_lim$?oyxc{fuMs%+uyI?D2>p;=Ee>Q?#C%nJhfC+UcvPKeef6;2~67_aRSFjaoJY zT9ZOmL@rR85i=AhpJPN{MtL7jUvk!~#rg9WXdtBJ!@yGk|Ulljdk^-5i ziARyqQ2S^u`Gbd6wvWJ7hGkflNKwIcMKL*laQZd)j|Wx!+Mv^cBcSX`B64dG9tK2? z0*)cxA7XsZh+N1qSrz^yM2b%LPA*W6!`e{&V|=b==_8D=nm;LG{;1pk0m>gP+#iE^ z-Ocynaf-|QyC&Ej9ehXX7wk*^#s}1!oM_7kRwcA55Xof%G7$r%KSu|GN9YN;+rDc}q=MLT>yW$$ha=T-9XX?v)7kIf)kFKhWozJ}Z}yMj0qaQT%~VF@wJ19? znlfr2zOK2i2-}`=tK81Ti72|aW<#^vO?3|bllVat zcP5G*`Hj*1jY%J1eb-;M;ybQYSFXnDLsiyFMCpN;<=|4^DTpC5cDR=-MbD9UT-mRh zi8q8q-GR>&Iw6Yk<#*@Lfv$&tgCgq{z_pVD&@YjfgRP8+zbMBs`ZC%eZ*IEjfd1Gl zf!}NXaU%=6&>gNn#%jfntBAQjP6;o9%nTt|JO1r_;>CSL0Zrn$!rwZG%sd}wU?n1{ zH5#iAvX!Xq(+jgKaUR%@7<@Nxt1s&F#2b5VaKZC>tQ`ocK{=1--TUAqS|>SXBj5|J z;m*YK4mq1PfSR*lzeo8<=TT&vSY;St>|#Vjz!ls}?a(DHhA@J2iHKjO37h1zfzTh~^8!cz=iv+?~K z24m;oDTV>R6&%jmZT77k&T3au|Vsb9PbN*)#h zPcKKjYT8D6o0c-pU>r|;HOx53h`b0_kfTDgG%4vcC3d6{+tFvilf*VwYpwA4(0QBK z!s@Q&I+dH-If~%pFDl^Vj;HwDsA?}zG#lAU(@c5`!K-2)lwX6XdLg0 zxsZk;+xwuMffaaLSpeL3OADNJ=`dCwz8|p!UvYVW$SpxOHhhUO7s^hI_yo!(jQWiD z_fY$ul(fOyLNoIbEv#QPGdpgc!gMm9_^N`+uZ|HLGZ~L_5Y-#%zQllcIugNY)xG$Y zxSaLio!Bej3STI!@3h5eqdwdKS#Z6&vMYGuRvWnSQam`7o5odNS9XH0NL5`SBStGI zM=<&`dNR5&qP|eK%&J>htu~)#YBib8EXJ8kC-V*sh*eN{l=zZa+DmQ@TED*X3#q!* z(F9JYLFQW*mU9`r8EXK}^L>OkS#SFW^fp`sDk^^hd2XKqmk931NO6Q4_EXcjdIwlc zs%lUdU@#+E1!bnT2JMG3S{*bbHnBe6G=Ztz&eXCV(ZFKQOV+zz^3(PDaK^>N|5?AA z&*_E+|1aoOwfj0p<2##b4uIM@I^fP&sHpDoMgOh#r}t`BD;i3J-1O$R>KV6TBUOEZ znPAD$05Eb5{#6yzS%o`C`3d7)#+!_YytppRc!}5;L3$bri7!7gGA~>&&U6M5YgrrB zBHlw)F(WUr8W9=1_;oS9v%Pa8s9hriuFiqB%KF%kpouRms*=wRW5LRqhOo4X)+fGT zgf#MkiszTnqbuZ(;jb0v*S3SZNmT_G<7~#ih~?-};1J_CMtnOo3y_BTTf{m;Vr?9; z<})Mn@6{$$uIgpHM64`fWU;EE`s;E0;>}L@z;aHF4d|WI1q#Nk1IPKH=F4*I;z3iR z@u2Y2ao{>>qCqD5vx0kJV}4`9MVv=l32-2tYG$E z?!>e;GqU`qRENqX>|RQ)Qn{FUq+;Q(@SjB;o$wPy>NVfN#ksJG!lF1&P{j|wT)5l* z(wx?UpGFB=y$f=m)*bFIu$Hkub+JJH%Gz^Z3eFtw6cjDkv}v+%bHPlUlhdD%$Z_LR zJ}g9hMScgeJcs-SNp5OT~Fi=QLsw zv$4V)Di`h{7O?E9V9VDWtRuvA;&<{d)Na8V&3k&IeV#*H*B1S}lYYa;`f~r+2b}*a zH~0A>;gDQ26+ZF%xz}a6Zu8{sxKb|{l{@`J**&$KFPon~NXx0i{`v7a**Gh)GzWLC zyeS8@{e(XUKKIG59N5)Uw;aR*7494s3rfe6l9I{9VrCUZhnYforqG+1-@|x-n8z}b zys=cyeN4<5`uYV_e?14BTPwXICp#jy>{NI5wfJ>chO@`|pOK8oO0^%B^U2bAuKqwX zi%%t4Ss-h!Y?x|AX0Ncm#-+>x-YD%GnSoor>5a~Ofn5@vnJU;he=SoUd*(GVZ(z6l zy-c*|b57=2ocQoO^CU9y>6u5V{tNX<1MQlEP8M_Xn9s>&-adC6Q+Se?ZA;8zeI!em z%9**0yx-RBh{(u$eU9HEL$uaM)GPgK-b~pS>CW*=4kgj2OPAy3x#3Dr(y) zG1U-rRr^!5z_3(R>=j;-%6fF(-wH=aNe-*k?1fC{A*PK*t_*)Fr+;GPC8mX7yp)=T zzQg+|)$*Ij^|I9Iul3{)r+C-4DsM{JmnW#XH@P`J)$nApzW*1qsO0?)$yNnPL&ie( zl1XW*3C{9KhH@=#?n&20IG*d0_MGzemQI?xeb84dad5n=Uv6S2^6vITSbIQfB0NIi zqeR5wz^=p??2kW}7zV~9!md!C%ziQknYO>l?kJ5#fm9Z`Qncx>$$5;>eBf)+6O73d z6Op6Jxh4vIvwS)yq5O50PI1DGx|OC|;y>oOS-*(4PMGGz7r!^)yn9;QTgO#COXC8J zivyO#$*b`M`^N2%*9%jL8*{ZhA|bZrbVO84Y|2iPn8&ehQ_N!HVvR6*h>3lI99%6H zR+O+L7P(!5ZY;96gx1&#ShqMFdxrF<{w7r^%)e_hA|+*qM!Fdg=RiKV`P?-{a`;WzJ9XEj92+x2Os&t3$-Tu z@grj%?Z->{!<9*G7>li;i>MreUVO$h2t8VUP0(Mc?eM^5IE7|Gz$u)FuIK*@`{zYz zP9bWk-*n8P&+t|1*UnV-Y3M4?eyDtA#rH!{-;=S4~uMr&2r{U$})YkOC zOV~8Kb)(lbb>ntd&+>amI~_b7Z>;ay;(71vk8Vd#-u-Dkjhx1ZK zpW+SuzB|0&ks=&CrD^8h!ymKge(t@Pk>`^kO{ggGjov$P-q5 zW4(tvW_3@x!)KcBal^g12f7}>SuTPuu=a!!XViaIs?%+pDWpIC4Y6a`Q_X(z-1F));*|UBck!@ zhnvk5g{oh|)|KKjekWSH3)~nUuzqxS#-C}{XIFCmG+J-Nm|e|!0XS$qp2qL=wh<5+ z1=!7q-mztz3$kLVtxiK&+gk7Fh5hrq4ma?$!X$h2=;(Gkj0@7^ZTeBq4b}tDoM8>? zYCLbX31_)nwL}!_;kIxY5PtX4{B?KKXC?EKFOT+@z6dS&IwbdEW0KdeMzfIM?IUSs zM_gn$9MjGhXlGM1&FA3Z`)=5B`db3OU{Y`ap3KDYNHlnVO$&&+1@|znWSq_T7t#0+ z<9F$%Nwlf zgqvf8t#?UlD}M9W16ZPNoCIQy?z4-@;OV10;G*?vv~n@}Er=Qhix?9b;d5}shY{mq zBPmmS&h42AJWRy$=h@glUuJX`7IN7D*Xy|SVJEFYde-reB*_UXXnJ0P-XFq09ZIF!8@k?*36{LOc{jt5qVK4~?e zwre!k!a}Uo4KWuTp!O5>d`(p!nn&o=nD1^+VC}=I%C^wVp|?vQf}vfoLLv2?7d>9S z2Q8-P(13e=P*k)LT#yW_ysr=vg;lkeZn$rS>lU!qd)?ajzSLw8t zXFPyK_75tcW`FnJyFxne;2z;q?-Auz5oKD5(&^vrur}fK23hv4poSFmr{p4Bx%nYQ z0bCin8&3r(xdmYDpxtsjD58V55P$h-2B>fgwJknh2sS2G%qs=zZ^vK7E-knXZXlgv zh{EtLh-e_YiyQ1NZe(HXBy|V(+%!f`8MXad<``CmL~e7zHaw&d#qhgmdwl&3)thlnDmS>!>NzxQD!;>#Pf_~o2N)Tf|R@n}5P;E)2Fzvvp8Oiz-zbA#h8Be8ZM zth*OaH^e^r25!9#-*ztJ3M}W`jZ+iAF*{#jO(AE=N6>;apOs-e!AO3Ia~9bJI1y3o zs%Qw-S$wX-+P|v^qoz3XFI$nSiv*4UYzg1FhmA52U|9UeFqb_(kS{q9Y8t4x!XBvuW|bpPNfhH@pe-mah00^oU( z!&pa%IF0()xoi*WW=9+s>|)1F(z%0+xV@JVSp>>{jED|jXP$)R3~%LGKuV4*B_5bX z+zs2sCzGS`44vnGDzjY(Ng3V(*_mG&TMhw>=dctO)|20vcsa0lW*$BFF9d(AM0C$B9=ZNrdtvtqKRG>L|Yl6 zAyfObjmme%5^vNH1^kKJfy8aB6_(^u`QPiu+7-M1kMI|GrVtj4oe}Ue*eg-U$VKea zBldn~lqJ4}Uj>=sw-bK)VyP$hkxa#9MllLz)!4wVT z0^Kj}t_S6=c7gmSO~I|3e8IV-w|fk+tDo^LBRnUrAfkaajL1cyc^4^pFGhUF+O@Bm z%6-d-z3{8h$?owjyeJeVFdiiKWH1W-#B4`*U!MnP*%SmGC`rSwd`is%{X^A2IaiEd zyLP=Gj?zFb|GM_B1{iVe5@>m98TfcJ?)NqR2A*cbTq??27?A~`49^M9XT(eqG_#)8 z=SWI=OBg2;-!eOR6HMhd@MTb|MC@k1qg#&3UCe`YY5(j%d0t-@zB#1{weni3qz7D( zifpm7JQR_?)7_a@WJGoc&CD*}#xkAVjLc?wSTE{MWt!ptp^#b8>wYS~X6@36+zWb4evJl~^}!N4 zvYQ4#`O+ES(zK;m8L0{F0Il7&f@0?Q{q{{7$Q;{#-$U)T)m`TX<4=o#PFvkUEmGBX zk5P<~>2G8D+nD|~roU}3{q>CrY3KZxSoNx1QhUT`jrBKy6k|qGgge|0zAMFThJ#79Q{7Vx(qNVYk2N-=l6|_G6 z2UOmM?6QT;khk!WwwC>jn;4n>v@Bv})<;@UM^G!p)c#$!%oleu3+Y5&0<|i{_9{k1 zdT8@wTuE&8V%+%)zt)oTZU=a~naUGOp|&|WO%J>uCIoJAi-d3bZe9y!Y5IUx3b@~< zJEA-wKVLYwWjms46SL}9Bc$yW><{c@tY@rbEMd$izMerEI=2!#go*8@#I{n#g~V3o z4O>{hZsDdY%`5^nvpZ_a|MdXBd*vN!?$to^6VS2L6FifK*@DJjVb)-h+aRc8u?jq= ziP~;lqM(j-hknrtu;z?B7`FrCss?9L)nLeo??U+wqc|h%3|BCU2hS7RotaK%|E-No z?G$3m8K%>Q*z|^xkN7H@aTBqT`Rm4=ztHa*GT*^-Hb^x4gQH7P&;J*3ZynX;_U-$- zjcs>rySu@}z!n=53qer{Q9)D`1Oy2I=@cYI0qO4U?(XjHzVEsA9(RoUJLi1Ix#yno zJNu82m&G|>QJ5#?jvU^udq0dEJKad=gv@V6+=S0%NUo>7FOEZ38bo+do)CK?h>S;Ikz7!ZvJ2)*-XlWW|gr^#5Sm%T# z(k5Y*o|xKC@2yP5EG!n4iu#_*rq+@Eyj7$jcRMlXEHRr|dzKB;##%U&wSUHEI+D)j z*!0^}{wIsXJG2aWguJG|K*{3M;LPODOEpsbLwvXnr#y9WzEF^|!gAm3amf`rUj?=% zJ1W>c^G|;B@{PE3@_Bx4iQ43i7xmu+B~RMt^L~C({p{N^Z^-^W-b%uFmdi{+zbee4 zyplpek`3;hmrOFplc3}O&M{@d^F(`2W@?ucGmaC}nU9j@MCDXwW2x-wQrP^HGM|no zt1wO;x&)8sYtyAA_mb8Xe>}D`F(f&H_j96f$lyb@#JMg5BFPB}mR}__629uROJ7O2 z_GzKqiiBk^M-(07+xhEMj>IQj68rKn{`dYa%{B2_^CxPph?mCw^B(a}ap!zTJRk0v zABw*S@6{n5{i?q?9;<-=YX${F5d$Q5*{`SACSz`PPgyWGGhDdkQa zffK_Hc&rHc>2}{|B;cm?(txgjS$ZBJ=Kd*4tHR6u^(CK2srm~Fmd4ooALQK;r|rMs z$hCx%ex0jcB+C0?hD?(4i-moh^Fy2@xzo=PmM!RK4SM>SVNCwvXGr?P*nAS2NIFAU z`v=3Sv3F$_6^N00S|bp>AhbK+4x&q4{uYR$U-j!n6#b)LJu#w-&Up%ex}MDb z1A9nqKqk>Ygy`poHwbk4h9Lq{=7Z7k;-2>)Mfbch$Le-^VWeB!_QaJs-10=fcpUPO z8~zpW(!HTMHhiYLcR~PE5e4SEu$R*~nX2nF8Z`aRMTDeGab5_rBxw5{zW`zsZ;F=znmGCcrxXgq%ztq>GgdU@m!J(fmn5PWyv?;Pp5GDQ5%GYvzggxE>-xgs7K7+$oohSd zx^1o-asRxoixlqH<#0w%MJ#pRI9wess!uGAlb=xBB<2RjX z54MLt*P&_;zoc`Ey$a}I56`1(sy$|*u8a1Vg}OBDnMdS)gp|8sCgHf`l7raUWM^3Z z$4O4O7M%=={aN`qLZ@@ALnY$6-41i0`IJ2@Cn56}X4>?|pFJa6^2~nTY`Ix7&n~Id zt8%~HnY7)tAAV$oJ2tBR5ON=AY56hUrnx=X*25sQ>z?fsW!atp+ZAv2^*Pv7JvlmX z(8l|w;Gnh5my;8Rs%;)^2^&tc!74bSZL@vcxY3O^OTeEt)4+Z#U*pF1S@(mI)>w=2 zi-5c$7h1J5UMtqp7@^SSj! zMD3PasUhB|VOcctrq<4KcgxQv2MepR8SPIj=BDX&-}-JEv7mp^_thS+hmM;E+P)qs zF@I`^Ilz3r$|l^QA5U)~Fw=O-0rK6#+G4i(6y}d_W82Sx6_ekB@Z3Nz#vhEPjJk|p z@ZJkw+hW9Cui7XeBLCVN=d!$PiLvSW!~zx-l>HsvX50(&UwFHSsF@2iAN_{DsE9Oe z#(PncOtD_K`j|W!3F*FT?AFpdFy44Unb3%s(Z{q-jPKzHIZ)1{4xD3)vl{pqV)Zk4 zsFDHBd=&a#>$wNq%6## zQ(MRkbBk@XX+PfOa@oWI7P8k^43Yl@M#qq0`DnNn?W|+47@B|RufW~W`g&Y=>&0KX z_YvJS(=i$S6X(cjJp=A4^GEjPE8V@KH9n#SPZh{`-UBE7z)nch*60J}Emcw0XnUst z+6zwsU+_VN#-X#S;MCoPn3Zc6;40J;NT)iyWzdRIpAjvOBMOMe@EUxr*!()k9fPtdrcl_j?~zU_loaPN4t!ee_1nz|I~I7Rqu`7Lat1; z6(e3bvmAe|ygD6o*k_H%+sIb*dgg&|?IwcLjPcisKh(B?r=Todsl#s#t!2}GIVQT*ydYwHNOwp;@DJm7Jnf;S)(ftCe-SfWqA2?FjnX~%DQ}LS4+AIe`;PoV!OG*H59yR* zHZS#wmEn=&2vz|Q`@QIM3ailCo8`D+AroXJ5&1v;0T$46@cleIp)l_zb;+Yz3?qtMMx0BVVH6+c78?;B50k zZemph{*HfkCamSbx~OPm4UT!g#9Nr&{7gjdAc?+{b9aln1XdVbnepI)=deURmj{6$ z?UiRjJY8b@u(dZccH(+6>nJ5rFUKM+>bsEUvHiF z5T0mQ^b1yWW|t{uuhUmF_Tj!2B^k_1C$q%SawpI6<2NUwuRH>;99fJRy=QYR=rRrC z@;G+!AUuC?4I}n=c;2CF+_<3*URWgZ6tEoBzJYkQf_Mt!pZ=D3l-Uf|4k{m*OWeDf zxMvP=C%d|B9PO}y&61TH@w9?zChA?=6P=0Y2oCs|BVS-={}-M_xb_Xb_gA|n6fXKI z+lucsKYj6dY;2x_fG~U(YhKhpEA|-boOxwC`e?@N`6-C%50ctxY%EWGM&&7$jL(Vt znUdYVNy%1>H@sU(nz-U9ae*9hvJa7d{jb=L_C!3!h?w<;7z4Y)-7Dx-xz5#_RpuS|%K{~+GDMLdbN#8V6c#Fcr(|DW`SQe9Q(F~k61kGLxhqXhme zEChZE<}-XlEQF}V`ba*N$`XM@A*TE$yXw;sbY$Ni;<|gpKZ}U}-c^hn*KbY#)|bXO zmDqcQ*n<&`dnNiA9}v4RuYo6tovckeFH^arno+h(8RfOrh?cb{X5R!q#bD>ue!x2n zUu*8S%LAi~5PxdZRXG4YlDY(PJ;HC=mR^A`**dac0j!*aJyvT9>21X>5_D&@W5iw( zM@$&87DFww#a_&7(0qy5txN1GVcbvbG-aGb?2sk4k1{GVE+w|Pcl`u!Rb$W5I+Be& zN2_NHsS@#S2RHx3Zm*@ws0R#J`2^}p*@B{v%)#?lu*SA*J8%P>GX=hL^9X5cZe}cH z%w$YrjA0BX_RON%yAKh&Fy_hECU%T4V*Z3$Z^kvmHrDrTi>XW=1Be+A^+tEagQC^& z7F*_I|3dB2F`A%^&wB9C&-35}W3+rznhILC$w~?uo1`Dl0Qs)UfQJt51Xs?$RWwZ{ zZH)trO^juX=tUgQU}SyNwUBD>JVxx0BDORAZEU2q@zRl2cSiUR(Ds#aCb60IR5Sb) z)acjM3f`|S2FGQiwHm!*fww{mfsF7jpmu<2Z^tZ(w!KDd)giXzGGZ-;PBmgv8>1kx zkqv+yQn zIgNiS%x5~;sH_)b+9DaTvO<+UBfE+kb`>?t=t%YNZZYsejS%M0<{V+rB31yr;tSiT zn)(YfQe}n-JjY5iwXLAYTPyI`lbPW1>r;?}7(UzrmM(4p6G>YI>xBwOR<>Y7U*fnn zqdKvH&4l$;q~V|TWHV%~A|0t=b94=}@M;x0Qq|5VO02A9e9btn8?#!4WsM=oonwh? zNJ}hcyK)QPTj1Sa*5E1=cSq2ReAT?;mpZCUzkty&rS zX=_IrtZ=tSDaOLS&84+?GOVez6#4nQQjFrmS4z>Z==Uj9d+l0c4G*#U1F_1NSc&Bq zyiTlOsL(D16w`xsZp|m~s!I8qlrmxQR6^{SHe`9Gu ziu8>8TMMk8#y#RJ_;~a1v)cvtxo3#Q6&zW$_(glcMy$+I1@mziy;Q+OdJBDiAMQ9f zlaD#>-TeG|&?mo&^jEMox11>{JH!+UF>T+7#YK#piAA4?g>1DgWb6IkZ|y5!vsQk7 z&rW2NBx^C+@@M2;-{q0#8~6C!v%JTC9JjaUEwMKhG|eqG%@P&JwfT}J5t=J5ZTRk0 z?y+YtWh!!)+?pXDlhb#6kJ7%J{55Zt-E$&vZ<|YwEAEy*n`4E$<$vYq;ps`OoG-oH@0x zFCNKu%+d@*WdPiYR=lPeo{3kbL{;x&6}AS!gI9; zGo5bb>F>={KXK7$VW#LhE0Z0W*Kp5#Y34C_d`B|TF6JVctMOi%otcZlP|7Y@?8=-@ z`U_dx7VIVs`KO3^Pl>rqc}_CZHkX+Fn3%;puq?JNWTKC@3T0wMTr$Wo>#-Kl%-B`y z{qjkAY;OLCyXoR_y-FkL3;gmmEYsp0Zs|9e#Pb%4OPJO?j&Y?e55cdJUO1+4;u~?-Z#yvzoQ+MD_oa?FU!1UDR*tzdb z#kD}E5>v?LmTW_&(2bbMX3m>l|M{X*0+mxH5|eQi9KA_a*h%Up;mGs8MEJ+DjtLkM>Jt+L zdY2mPi*Kzv^!-M>eBSdP-{V)uoBX~T7v-<%Ru%W!ahbPJ+%7X!fA!c_jp*Q0v7R3) z!_LQk5K@#j?*nM^|5od?u~mG(~Hc6R!jx*J)dLJky*JDgAtKf6XS=t z`lT3m&?4qH=}+Cm6mDP&HxZNAjFiaiKS7R;#Cu`a`Y^5+_ZKF|p|#)rh_yr9$36B> zM9O+%J|ZGr7v0r+_m@(%e4U)@{pcBaKHdRQzvCMMU7{}d*M(U|_B(!#`W5MEHW2qT z@|7k}Vss>jjC_i6#HeUTT4+S}UEz%I2-mZ#v-Bb~wja-~kC4E)8jZlJoLe4o9yVV%!O0EDtdT{j%m-v;tatCB2vIRZwITVp0<# z_acht8ljCyqewW8IB14HKomVIETz{v;8fVHy2SAHp=J5gV({*qgtJLYLKg>IN&6BK z?%12PJ>52v9aIK>4k{r1(ae6Lj+5p{))x^N%lrMqk0LT65q1YL zsfbWq#n)#cK8U@F2BR13rGhWwO&v#rF!KjZ3Yvv`U-tyc_SPn(2aMD&N*fONoc}Oq zVZf3E+kz&4&j6p2e*b&FMJlfP&oUpbe&rYURif^+pNecjgQ4H$=ekYOeyi_4ZQ17A z%M;b==bN@$y{*{SYx>IeL|XYeG=1SGbaMKB0Dt(t0K0vk!PnpGD?s|gnB|AExiJJ@ z{c(|Cj9KC2pg9P+Sq830r1gEkNkm7#_)8-4&*A5c$iJ2E05q@ny?}`Hh>trW()>P) z`?lpj_BN`2R65OjVZM81pqE3!aNQoSqk&5rJ3Y&P=eN%AH2D6Zz1x#VYh0I!=lG9` zJrN!W;&=K~JcSs`dLHLEJ`CA;Y@NGhSlI)f)5szBQ83RPdzn#gcZ`V9 zukQI^ygTzB0`#cm{m}~-rTq>f7QNqh9dZ_yJ}c1L+};=$zdv~$M&y5=Cq{SV4iA02 zse|7=4^g{f_tl6ucDSK;D(qa#`lRbNx$@O}HQ#Z`D45>v zmy5MyE~0i99T(u<*FcBoh}{+2NAxB3wAk-ym^tYG>u14>(STpu6BF^qBcH%A@TyZG zvNr=3rr=NQbKqTh)NHr(@DGt?lR?a!-~mQ>&M0Hf2WK(D zFXA_IhP5lm{w_g=h~Lo+SGdwa1QudskF_lJ=PwS}#`vE*a7TBs9Tzlz|8Wy{&i`eL z^`dKyjX&-*o@+A^kRsjvqz_s+Ow&jncec<|_x0s*&ozcS<_bs=96SdoL z&%395H2CTj=CJPv1hDdapLk^_`aI_#jWe%R<3VH6X|BKs?;K@*#_Nn&-9B^v#QJOg z<3}WN7R9zN@UoK-8yrbKY}Jj(f01P--aNnDA{24m#ovRVd9`^Q0*y1w8qug@W*8&L zk6a^~8uX(dOxhcQLEb`Kv2k1y?8Nv)P(7YONpUU(#Vm0Sqv<-ZK|>z}tel1~U)6wn z1Z^`<*?bf143{*&`0kal^+pK(!@dzU)a`eUDhj9PAm^pqOZAp4E#Z7Vj zrB6&mk*z48ucdcxH<}8~!UkQWQ@@$0H_AAlsC$~IBi)ZS(2i|f3N9@~dupj9V`lo= z6^tJF`pyMAp|8`eFk5Ka(O+nu{RG?8=#$6?eIG@EGQ92JsUvpavJEJ!!)FG|7~>eR ze&L8S;}5LMN(Qqr9?SJ4@I8exok~2XFkKtE1yT9Xz*5W zuiZ+*X9k)5OEN2xWL6{zE2?@dXHWP1%Ys9ZA3{lqG+G3;qcu^ZH1RdN3dws^e#QRv zr3sZ^@DRmU5yg53@GH^Yrc2083>Bd#Mb@T##7c58WEi;vJvS(P+F^4Ayr&OqeUhwH z4c?Y2K{lc1DIaKlO9<0gmdue7T?0GtVrL+ zyd@Q?igzxl(fbr{gwVUNu8$aSgXccO=C8TG!8xvRJX1%uKm2wfcA?K&-alamH+i8{s^MoHlh(M9Q#{y;(K;POo+<&)ri#3_!a}K4tGfw z5vRdg|KqFpuc`gFe>K!dwX`S`OPS`s-)a!vKu0{qiFT~zjkT$)#`pntg1ZSFiTtyP zmtc>03V@ZjvEG~?LP!3+UicSn{gD1~x>aYTplPvY=bMyy}Rp|QG$jt^s;4c4|G zS~aL$vKl;*eL`p_`7!MOiG>F3(3m^}1$cJ$UanOSi;~Gkm86OXO zpgg%n24{9F!JeuAaq0~4uMh>~NAg_YKlWK$UIoRqu$K05$s&H!H&3(&If!;XBQWE{ zCeV8YeB@p$($=fRh`&c!l2L>a^CynL7lLLhs(plM7{OZhzttL3d9aO*eA7xKvkEk3;wn1tz{v2 zTw55N_0a}VSXzYAN+B#Vacf$Tq=4L#=xQh|10MtIF+6Od= z{b9sDm=wrtrq_bXJwuF7h~2r2w~1Zs>bgX!+&MIYm>+KQ8~{(2WMSvmm5QtA_!SC! z?s)9V4Q{pCfLueDHu|DHT<%ZM$_U)QZVkAaw6(*}M^*y+FR-1l zj@sJZKCmwfE7k$tC9{@&Q@MISaj=#=egkcyPcT1Do*2HTO!vN zgYYoHZ;aUgqWqEZHRE$eoEK^hNkcbVW4f>kLhWi|=ToN5mvIiU9ex7zR57yIskMa4 ztAVBo$)jvi7Ke>A3EndY zxz9WR*KD)`r;)bCK1SB&jRmZn#u(2SMeJlY-?@M^bZ`^frHO59jcH@EWh+zL63%pP zCpOzNt|KMx1_4weeFY~^l)?}e5WCblqZX@&;_og0`o_%6`Hjx?U4azhX!8|n3I)YM-b!E9ew z-x>j`mb!tQX|U(o^00m2H#hWoEx+}7L;1s%eo=KT%i{@k0LMz8dofP>06 zla^Iwhsks9uhMi2KJ%vPigo7oq^kM4j{JKnOB60XX{dC2IZrI9QvHG7tFlUAo+EFr zSDxLLE3HuduiqxFvk0 ztZcEZyM$6p@nah^b;IHfdfGZqi<&>(F`QZy{OYDjSdr1gljgIEBrjaDoLY2s*CT7L zqW!pAeo_%;(jOm-(64q;G+F+%E$qd+DtHQ8!SKR*YX8bUQc^jdDO^G1xrl)?UrXKu-ru>@72ZU?yK@H?K$W< zIgfL^u9s;ZMy_{7-gMl<@<;A47?az9`$70}VLyK1xy*jbPB5M4n8LeE8=HTMY^hvW z#JGa^_mjQ((Rh;iO8!plku>wnursvETZ}ztX0GvQpR!=?=C)3qYdJw>BPNYG0vQvm z;&Ud3C;#Hi_VM6w63TvU`^J51_8$E&-mkNI6lMKdvZ5s10>iS*1X@BaWxcs1A7++y zjiWu{de;7_cOwI`R^#6NiY%;R(Y2Xa#bS&zyAWSqn%M|`$gH9EFPg>_G8QbPGHFA^ z`X(_~m6#L7I15p99?HTzI-3=Toq2cGF2o&LGtozS6`AYD4w_eFc(ot0tI0TBe$jb- zdUXb$XLY)2#5Vu;>3coChfGRqw{40zmgZ_OGiGL*gwnG3EosLjpC@{x%@fQ_9!hPx z?3gw;HEwT0x@D^K?97a+RLozQ?WwT*tm0IxT-kD|ShKQwQy)Up#Z=~z=B6=i(1U+T zC1#Z~jw5Em+gurv0ng#amh|7)C-*Kq75NF7uyvk<1kf}g zlG;C`k#wdrJ4s{yOll1sNg0N1-$+@9oxgZ8`a;Gq$p8_kjKmVe-MSMGA&M@TfH}(J ze!^6Iqf;whb}S;IH-3D3a(rRj*Yf7n&v6?wr({*cMn<&dKZ#F%{+sJRyNX7c{ov?jXt;L~Qw=!7N5TU4Umu_lQ|f5&Rd z5v>UZMayHwS{IG=yInl`73oi|Ahk&e#6+|wG8z%st0%^1qP0)PVdN@*iCac-z}Opz zx5mamv%5Nd#U^M=^ch6aOQO6GZyXo38nHX8$R8a`^Rps1SDYy6iwMnpR#_au7s*#U z6h7?P(D)?W-A8Q4D_z9RUYIyW#O4qjeoQmkiPz%Y1+sbJ)qDXk)~EjG`XtN|gb6+rl}pf;ln;|oS1#s{RI-Z{4Tet0hK`&>eif{z`c4v3jrg#1L* z`*ASZ)_YS>3htjb2<$yMsJ-3-n1z0v+9_Fnj9O{ORGx4ftCeRMT?U@aJ&=l*OApSX0(B~Q@pLM3d? zH6u$GydPzQ^L2Y;#JgDj#OQaqV62Y*99G>32EO9}Rh}7uH*QS^H*nj56E^KeMx&N= zI;AoOFgh_>Gk(L}mj}Et&wst<1s}lH!4r1wZS39#tJZVN!m|~(T`?~eeRhe5=9A8a z(A?qFkNb5+oVMew7ZUXCjIl9CPe!bO$mTuoe1VajTZt>P=gS(x%v2El7x=;(E%9s4 zudnD;Ka*YHQ`K5{-no=W25JC4#Tb>iralW<5K3()r^T(KekC zEj~78gSBsL%-X*b>znnmDjc&i$i}>DH7i;ZSqw8De(<3E5{#z;6O1_vMKx>ikThn3 z??WP1U=$zbhVMEQOZzTDZ=w0lGocQI7Y#0Cg#U~=yPpxhoU`LkHDrix*`dC)3ASj- zVp*FLX?> z+3Xx-E1F`af-ijej^$@Ba8N`;_9%1!Ge*k;2~-~Cw_JA(!spdSp_AU*XZku8Xhsm;3i)cWDq>*IUDtp-%cZs zkgt9jRQym59uPw>sCD0a1^S-DC{R=5hy?`~YJkj&)YvFiW20E@57Ms+U#{q+UOm1_ zd|7uNtopmQK2yRhSyP$H8cT^^!ij2VQ~cFgq6+#LD+4SWIg7PKCA0vt6?eMOW1rNk zA0TUxo0AA`h{dnuHT)KVlN~1_6QS`9wjsAbV>xC!Pnk^cp*Y(7X$uFYGt=D&SPY=kPP&KYX>L~Q|+I(5fw24Q7^L=d8YH@Z#p7-gh=g$ zYz0OQyf$ItyQ{>vtasj=>*hml;%+s1|FuT$DdZi(Vlg%)XZhhA5^o(HkU^-X@65mA z*FYb=Y?4Jgzto~<4qoo%--I=@>Vg$$e*o?JLTXhd$n?Kp?f+sb=@*A`5MJDvhYVT- zN=k`ulZa9&M9B)G#7yGL^F(pzK#pJ%QB;R0!g}W!`#sIz$VUitM<8Etyyh7E4xZdF z_@3pphK)?RPiiL$6DQa+ZX_O9O||d2LEJWjxE`w*>Y7BH8%X?vSqS}_e5HTQ zzhjEE0rboK`^5NGV&Ea7^GBjZIZ+!|ggtpL@%3b)(0Jl?)Q@j5v=DdUdhr$@Rxi~| z9?$=m|60%g?Z5Ww(fR9`+Wa~yCww6WRuWw>%JD8K52B6|QE>`U3L_nF(}U&UDF$}E zr_l@J#&M#z@hxLk{&ndcIfHxOSV z>Vi3AGx35NahpH!KhQtQj${7BZ?KoAU;a1i*QImTo(6kzTR_Lyv*0sdPH@LB)H&K` zEC5C;e+JE7BhoV}E$9i}zIYrwxMMQ7nzW71B#sO-V$MOiiV;1EGUgwg^Z!M^6}$F5 z#8J$vpm1+6IHMMkb5@wh8RQbu!eFqC?K^BJpAYcxbzad zv!S7#i0BUC-@r7+Fh=YpapV`HC8H_vKc!!cX@f@%ZSWtUCyo*88tN@%6la`8Uj!cV zs6{@&C{tN*YE-82{F3##Hq&3J~dwJ0Rv|QpL!Q542Hv zK&Njh$WdE}%tA$;KBylHo9(~sOPptqKJP0uc>?}Y@d7`*!6@jv^%(ut$9dTToVRB+ zGCPB$t+$qu*-39KE2DRD9DfPA5J#Dwk$$RuWHWL2DRIb&ILNML5GxQ=v8x-{LFIm| zJs|sipD&gB&JcU6`!0bhbr_+&oO$qkd#d7K8$A|&7r;jjTfogG(a1P-sjdfO-~0w` zgcgJHSKfmUIn=?kq^)}oT)i-g*hRPWGn;vhT^ z=yV|VH!~h4_OX?wmtAA;6FSmU#>m#E?s_VBzh#`)ho0~9th)#b%e`f38yvX!R)F4f+rOzg#)3xz|B=ZM|#F`#6WQH0o8 z!T5mKQOo$6ab_RvyxqADn%nvEuYwcf(kXJ|*YHPoo4iBO&Wg5Ern)Dh+h(ZEyPVQm z`ZnhFgI3=slKgL54S2bQR9au}dnugLdUtZ<^Yg8zvBO=^%7J_7Kew*MD!sE6^Rkpg z>nz++&) zyRRM8t&0H<=j(6y-dr2M^u*fc@BW8*^P3+!9^hZxyw-H!Sx-}=+SixjO+oMY-f%V< zJYDLOq&X^8U7Z?uD6NJNKNdD8d;AtzVF|$dv)Xd z`pFke8-ntS9z--ejejm`*s#>!SZYOmp`(TDi+YQ1;!1|~Prl6ia3Y@GU0-K-sV?TAh;dil?|BN}*47!~{`uBACEPQwRwoI+$-3?-ypQ*Fm|?9J)!ioj zZKg~i8?7ygOdI@XDBMnLVk4rFSybaZI@0ilSYOS^#&ul@*33tBkKi|#)%Ny_2^!Su z)L(d+T)V$uolIFxNqn#}ca5HZyQWDE@9%N?oHcX5m6%Sg&ii8WJ)ruRw1KsJwcIn? zA63!#b=Ez;WWYJfrHS`uiXOAkhx$AAB9*J*W38A`%@3cYv8oh%727I7_yWC^-Tkhg zlq)sr4K+$DcNV-g+*y&Gu*lrKLM7m)jc>)N->>WsS4=Q_;Jl+ePJN5}u5zRIC%h!e zp9@R*J}y6Vb3?$~^3{i>gXWb_S}GnKRE9M-bZHq@+pt?@3AmGGS6K*{Q|67g%v>vD z^Jo1Zq^E8wQ@Dy)bAl;kEnnq8$jzQ3Zfj&mt-f1yZV%<1bBP3l$`io3n|-+unMPMD1!2|*+m|peUUvP z&Wnqzsr{?iXsrxp+LDRo^^9|f|9r&>^U^Aw5{%R9DJ2`RljJY{iXC!bQ8%IwONw40 zp5jx8abfqR@cqC67ktsQVXL=WfkWYvpw|WG6Otol<@W}zjB&_!ce<9)mH)#0K}v4^ zPK_HGQ}PBrSY`dpOBG#``)A(I+b8q)A1+nBEk+dN);YKWkZ5%pV_!m4x!2+za@7?m<5tTTc zkFoG=VIF>O7n%!Oa=V#}RnIRrr+q*^OgBfaK{}=*XKCS!r2g!H#4Q;Uv!4X2lH0o9HOn&E3&5W@z$=+tT?{B&Nee@-DrJPrW3|n zd!{k$yDalFY+W_;9Y*G)OmXlDeJKYDx)sUKZJT1F0x!5V~ zRia)6SK42JgEiw*Q=HG#Yp1GwmuyN(J*jEbDw8@*c5%B)N|9Jmr+bR~9ocTp6txox zJ?$x?n=LMyyrpDSv@uDVYBU`BGT>=ZKKn>|4aFE7&)l%S8G9 zrVQBghs){c3!MpR{)ht(q;?@1J16xZB8?^~y0~9=ZZd2p*)y3B(cRRf7(_~6Ch-ie zsBlb7XX*YVr$+JfUxK~Y@QmOLG*ok=p;C@9c0QcwCo?{lCys%DH^9 zPu_*rUX^qn(NW$+Sh$aL0?r;`5?_fZx^Mhmyzd&G0pg9>v2BRm?TN))+ITW1Z&0*t zB<4<|ba!lYW0CT}!)Uprha;z=R|l1#m(pFZT1I`g&;bvBg%1)r_R$PX7Pkj2?*)O9 zr#rxF+aH1OFhQ(h;8bD+{5r6Wv5xd7%Fu|hwft}1HrzMIp>|f5bo&i^Lq%}81hBA)yfCQ`;L2m$KC!OUidvS zBj^R>LGT;o@!S}f4M|~St2LQ{Q;N}7ZkoyHAGehuum{&jdIy!Oh!y4u*9AJWP-m*b z2GH=81NiVE{?=vN1*|PDllGoM7Nce!+RPa%7sy6|vo$LlFsj3^sPRR=d%p5c#CTlj zh1E7|yyuOvv9fxPorwHzaz|_SY;~Ip%@bUgl0ui=M0y$lnGuX`Jn_J;<@YiwJIW5h zLL4fZ2EltJTQPcaQecnvk3!1Pw_|SdppEr>kVgk&_UDK~KNv1y1F8!A1bHtSgPZmf zC;cUe*{*@q+NCjK6+_vL@h6^pS>uXxCC+wsLTmFlL3!=l-!l;TpX2}w9zJOALaKfl z5`StF?O6GT2bFCz7^f3$&JwM^4{yg@)zgd~vwBv7zOu|q!8t4+gg!^MqSO5^P}4dB z+^(yMoI>%ZGVq%udhh#v!8UNsWy~4oy@z0r<{2xLKh@SHlkD zr@Ya&4i<9SMhda$N!D{niDfv^;uG;ZEET`!AeyZseuGNb-9e&>Adzxfi0q^f!@n?E z(u~>9@M9_Z#Gowo5XcwyCo%|C?$O{I8>rHsrYDLq=c!l@ioPxaH$J|H%tGzeO`y+V zJ5Xyau3Gmwsnxy2cz_XW0ghn*Qqyb}h1uihw^gV-*hGso7&EIjw4$=XNupjaQ8$#R zV?@+eBWlSKzv>V*VF6f~vxi|h8Z%m8z3LB3^^rSpPYnW>hQS`x%skL9YAbCqPF0=s z_k!n@lCU=ROSOQ`La-l|XT0cnmEA|XzzG}05hp4owaVD}f_990j93Nw^>xQnz1lbz zl*kY@GKuO(iS%A3)Pgwze~aEl)C_eXTk(#lh@Qq;ah#~IpD52eB8c3?ixyAhBOJ=6 zA!|^bb^_!I-+~;zqvs@Wxos2H#%~4_!7ZNy;gzJkg^KsmPoVkzrt1ob=Qke5`J{cf zt^hSjt+Ws$475M%c5BS$j4rFxGPQC~AcA!^`-#F8#HUQBP&1Vuv(X`VkID~WqsTriCEou^ytixgG@fF}Z~cvYfkXLXJjEcB z4m-ak5g~zCy{6X-eLs0$W=Gv6ap76IR79wDwdKwLUVoWFxO75z=#-#^?ySk6Sj+Hyem+sAf%v?Sc>gT%qArn3 zkGKIX_ivTck^e`n|K1fMPKmXofLQjBn5s<-y-sv(Bw8Y(gV}C3QHIUyB4??51KvG) z9($DkNbkRQoR0mswLY9dI$Im|7SPX>r$$pbREy}ggJ`Kh{0jdC`u&I^%+tRSN#z4< zzMOc4%73@;zvh3lejBQ{jd|{65mZhcA%><9-Pp=+$;RT>S~?=To+x^ic$59>LF~>k zsyEI7)B7Kooe{>NbZ9p3XJgQ>^9@j4B9 zElapnFld3*tb0%cPlhQEV&xU+8bsvhQQ9DUIU&wLTnqIP)%br9Yb%Z%C62Q7W~73t z!m1A?Zj76WL$-`qg%OWoE9l@2Di5@`D}vuEwu9%=wc+QEhHGw+>kspIdhBlhXPfa? zIQlQ@yt})gf0_KYM~nKp#CwIS`cm(1f05Yd#9jS*R-fKVhqs^m(DLu^^gYA+R@`?B z_tKm9@nFx}+lO7S{9qsU0?^4?Y!p5W+K{dB!}U}i{#&6G(+2+s3fVe3z`TJ0_`y&m z$M`3)kFA$|Td3R{(;f!CtdKb1(7PnP@bb5w)bNt~zCGF=5yCrquG@%9*!KK|chNU= z*U1OUnRkc1uu-z={&sJ&+KTSCCpKxk=)SjxPiu2GdQnHL8=j}0ME453bH0eONCw^A zlW`Y)LKkX+PNrmN71cXUuR>{cLlB{OaycEYDe&ImpwC{Ao|hsSw=p6=nxYlk-| z7S(3k!Snt^8&BoL&&{oE8FE@nTWul?4Ii`$dTN?=wyw72wN7fO*6shP+Tx+m?)acZ z_0>Y>>=wcMCGN=DoXYSNY+1Qc#rs|hW+mV8&7HVgUa`3hyLIj6OuUyyusI(0Q;cg4 zC;i<4q@gR3*vTxXb1u`y`l4Nh%57xr$Oi7g#?nwP8PG5q_e<|^z}mNh@cT&U92 zkDZ%IlU9d;fp^pHO1|$^jky_lc6S<8Bl>?oY&_*T=+@LY-Zs^{u_0Pd!+)ef_mg?> zwT7p!%ERt89DPt0xvpXH8Sd!A^@Ceh#|+h1;QnB#`efY05?3F9J3;*Foe^<+U2lUs zp2yW=7C`Hvb|^#}f>W46c;QgUPi!_NHkC5&8XKFg(1;Oz@q0rre3nTKLhxTw>M^=C z#OnpIbLOh+L<}ONPPwDVab4ZU%Af8nwegv|{2tUwN8SzoUc1NZS%gAO>kpoo<{A(E zMF~1J9~HTiHEXU)*rlDR*}$Kj5nnxa)-=ndx?YXU?;hw2IE@&Lp63i zCO4{Y<9<-PDtPuTyj8dg-z}Bxo!dhmRO(cYM6apbovE7;S5Xuho%*uE$g3nXp@R2E zN^V5OY<-WyDdh!<-Ngar&XO`^9Oa4+ODbf_@AAy7+FQ=GqpkW^`5HtRO3J4r_tQ_l zNL_dtX5{(@W!TZzXO`uX{(9__@h^I=>fLN_atimY1G_JA@yUOIsgV-$}uE6fX zprgD6(Vy$(*P%JE4Er7bt@Ip6xO!b<&E1vY4r$w}=K%k;cxya+ZM8}FEz1@2|rHbHr zbQu&0!pgrDVYTYHUUU?!D%yildaY;+>94|092ugW#0pMg`C06>B+8y(S1D79Sy9Hc zBo=WKxss`{jSUpjba_*Rl`G(3(E`Mg=NDo`C$A~MOqC^HfO)C#X~Fc)jPh0ac2yoV zCi&c1e2x3_YNM=MXXKfCXLLB{UAL>~9?P3)(9#!~oBjFe;Iv#jsa?bCa-{`_M;GQ^ zy3jwSox6?08u#DK9gmuG255cCsb*xJM@|AOhmro$g`~OUPh#;z#G-qOFhh!_6mCSs zq`%+-VpZb#GKdTY<@q5RE18R>E;1~a4>8ieaxiP3x2a!^N?0NJx!z|;j z&22?l+pFhvmt;m~g$=C86pdau?3lUKhZk>BPyHzgelauzFDYYI%UJpbb4GgeV`xba zzw{ck+}jK)&6of(FDm^8X{NOt#99vSB>nlFq&yEhx^u?48Hk2x1DHz^ zo997GBIZmmn9+&RiV^DqaxROpZ*$D(g`HTYS0d^clZL-{=uWMGg$SkKc-+I3MX(KC zii4MABwHHlxSXy+P^cR15!*p;HH+28q%aoC z<$DYFlhyw+1}*3g<(LO5zrl@f3lKl;Y&_r#E7?ABg@sHr9VJ z3d+WsqVOC1R+1Qz%6Nhp?%RC~Mb18k(1e9wBWM$H#fhi9z{{+lYY*#DGS|yWKW8Utx_C z$e#nt@oSHr3>x@-01w$?J@KtExd&RP-3K2_XMtOvxgeL(dtDPuJ&Kvk$BEv8?xRD> zecm#{XF!>a1s@)~)p&JiC^VUdNMWD)Js9m=vM~trOhaM-#!q*-e+eT034UlDoWFq) zV;pDLOZ0w5^l~S94l+I@dPMd70dm*Q$Brc^rw`VQ6X+ir?}ajp2W z6|{XH0}2bHS6z4BL=CPJxr;H+m2b!d*{m;ZxqI3lFw7LwwX7^ zfBR?89NhC?=kbe_xMOZaU2lo5=p&p#k?8z`=oHWRC-L`bqN4@Tp}*%j_`DXjVPBGq zzqWrAHy3$?et%0)-*F?zX_}6lLZ$k2(CR}HC@4AuTz?CFYu9@cS7DdF1%2^Pwt~f+ z?LLxnJM02L0nC_hT=v6|MV&%mA@aX(v)Tz`_I|`)n9p%e^f7*ahWO(s(H7$cISWCe zwHDDTm~j%(@?{-4FlJoLqP(>P~vLjYzhb6>|=@X9wQWD|NdaP?-+GA*F6 z*fVe=A0OuIp3@J&q#aadE&olGG=F==h@A_{SK$3v{qTo{%(Puc^;%mIt#%OU`xmHD zj%dy_o6V-OX*I@v(`l4PWy2Fhef$k-yiC+V>)`h`M6D;pucwHb>xmj0i0X`A(7wnTyy^`>*1)r_ z2RVq|e2iR`Yw^jL=VAh3kIF}!F2EBBGUo=bYQkETy5!IXN|xg27p1HBFgldx@O(y8 zznJqE=r$kqE3)=i6eZ1yZ2T&oq_P$l)u?%us4h)Z^CYSe#*`lul~4!%il0dLTO&{5 zN|X~Jemp~zT}_l>SM*_X-)>|LuF@A#rQhc3A}HsZfa`uYKWHa12ydOC_D%WsdEjHZ zi(aZm5$|&n@1j=hS_oq|;d@Zjm3VC* z@v0W_a#cSxUlMD84P0m`fF+(cOT@MEyrXsF+-(;#Jj-y}q72V6+|kAid0OYwYvd8K zBs#z~0_ggaCRe(_RYx!@oCw~4YdP_V)SkdD7&}yW(O?AewjI@YV-E2uyOxV=Cg;H! zapo@K38tSiYRC?}B_3En%e*xfZM7IqhQV=Ib9 zs0auah@ya~lprNasDy%~beD8@cgJ^K%e~Lp`<#8gv-dgUH{bm6bIrs1KI>Zdy4PCw zisyOBiRkI@jw5&get$u$&KkeJFudSrJh^ZW$GJLhjB1NQKW3lu@W@EkpH zUA-%>T*CS}#x&8cSH5I=tf;R)OMk;SYA6srOnf5K0hZ*)?WC1A`Bc<``a`BKFCh$?V{obxz$JcSfE6XS53HVfX9%Q}-QF-GG3aEN2@mNgfW-{QZ2G#jLO&w@fSVI&zK zTIfgNKh|RgRzbhqEKfvR{g-3Zzns1i5zt{tDU6Y;WA`I!ndp7Eh02aqlcz9mYt!aT z5qS>L2Ts&)B>#Bjyem!-nURH4$OM^wP!hO)es9b;e_B5ca~-Wch&i5CNDqhpS7)3N z+1mE$reMH`~C%>EitkHVVe`#eh z^tXwJ`?r)H$$4bl60mNl zPTQ6@Q!Vr&TChU$YiWa(Q)ywVcNG=D>G z(zs^CmmB9dt2d56Y|uQh&{MWcQ*>hY>y}No16$Pfnc<)%`r`HTzWLX!mM%ddMRs#hL-78HgOHvI5{8N5RTLGRt;GHv9D=(i#HMC z>2SO^Iix}V|Em9@P$gPP3*uMo&Kx0|M6EW>Wtz|U3~6petiS$E1KQb9g@)De<{)1O(<@jwyJOUPPb{~FOss)c_3I?{|IRhF0uEUfBzU$k^mf zi8NMK?2FT}GBvmO99G$yidvea{Kgl(DDD_iS@e6-)hN@#+~E6hI|~in)RTM*cfHx2 z7KQgokII@_ka~Y#PF;bmLP7rBf?Fq)3yTYOZ8=ozUNC>YV(IFFA-y}4JuN`AS00j& z*sj7lKOOpZ=SPEC`557FZJ1DqddF&n@SMN=iV%9-F-MEvASzTYD#Xn8ha&XT4`K@M zVSVIF0cy?WZNXM(j?E9k8shN$W$0sM@+tFW zxgW4D)0l&KnRRszMo6cOY%8q%Yi0k0_2p4n_)P3DzVRVhE>jMx=!Y}gHnkLt%y?G( zxzsviX7b{yUFq>5C+e1_YkpR2tVv(?_Dt)cv}S|-IAP$W;RimvhSrmI=#)A*Ydf^0 z^;(49BDMP0Phb+&rhXB8FDPQx)ECsBn@!C*2_)Z^w(VRNyh1KJs{>X~OfyjyvxGo@M!v2{#g$aw)L-x$oiQnx>6OT#yKk-XO1{-B)$n8Tz>*=Y z1Cs2LQP!lbA-H!^`_HgJqSM?``%19)xU9%0!r(2=`j!VIq z8XFLb)*mb9eiXo8zQ$D!w2)glQ($p*=L|XrjwL2Rx~p?bBy*GwHXvqRJ4eb zqHnM)(K3QZak9)L=__^;2PL8ucdsW{qdh*2hrQmr#i2j<(f&$*o)Syn$c-Hi&C6p@ z>*d3vp|AdO6zqtdfrDh^7eNU!;!_JeD`Hhi8rI;yrYM0IL*XakL)@Ej9wpdr2zbM2 zJ-AQ{dcry=jlueH#90f_XxA`Me)&*v*VtHa0o8_%5EOBCXj`U3YA|D76^mB+xO)t2 zWNjIRsLIVaG7o=KjQ|t-gxA71+JvKxl%EcpkGRGy6t#=LzaxVi1$U7_j)LRKK;sq} zaBL|Q2H2*;VxCbG>4DG;T`1A7sSiXL906vYp zU^U!x73r%+ei1hRGLUH>C`Ox35nR_2i9RW`^dq=A6~6766&41ndqSt@M4p27_-gza zeDDyS>#<3>C)i&Gxw)tBg$j44Rk*AB<0;DEWvX@GDY#q^<1(&{#_qhl|4mq@+;0(D z$Sz-uzj;bNnP`KV-oa23%BMw;qc7=^K)TlpP9i@;2WrfgbQN{sdWh*y0j)DY$+D4% z_`OoG9`kWSIO@Ws$n!O*Vc!ByGdYj>d^X>F@BB&`p6Gny0`hmBvQHLlx4I1dT=Mi| zpj(HTpb<4Y-4m1(JcXxsdU`xYZ{_B`5c^r9-0HCMAIRTNNAAzak1C`KdPUq5{Uq+7 zMLIf>AJPPelkY`Y-od8W(HPunfE^93GF`BJ+5yz?-S9YYnAbAyXgI*n?e@H!0(RDh zU)g%Az$&)4WZ?z2EB0fwvF*1u3p)-av-X0)-KT&}#^Yb@?eaib{t>=1L z5qB;kU{&+mUhqou{_mu*r(kdTBe?VN67ZK>Xkli47ga&EgAc&X_*K|ev(a;}fo=O= z#J)ocHJgf2z|>BpO%P3LzX@SpHY-VMcr7%XB`pV#=CS0fm!z2zX?lu$37K`2Sb{azf1MDEWsz3+mj-}l0JSZ^8#K6?WDJzJ%QEBcL> z-huB9qh0GOZbbi~zxH=T1p2=Xk-}`JiJG4xegMVX_~}Pciu=sV1hoYvn@B@ZA_Gwu z&xKb%v*vYuQLd+GDcCO`PHG|8fo~I(hpl5u*=}P z_$sJ9rVczrwKoIou8K^3$gsfAr-4hh2x}LJ$Y4=ydp_n zLJxvZQ>!%+u zeNy=O@i$CMi!vS^&GcdM*Mp)Sxpt3rz(M5R#7dNV&+|+RJXvrf8tr%2UEf)FzChQh z3(jiUTa3c$eX(9CD0%l3POn(klXzw6dvY;6 zxV3fBy{f@D4{|$eK6VZ4V^A0K`ugT#??B!u9H+PPE!*N*2F<6qGGpI8d}I3Wis*%= zjXW8NJq5{KDD{*(t6=}h$unnzOYlcL(Ll|Ugy&BZrC4*Dd9C=FTylwA@R^*GN=`?u z)XyUCo08Y| zk*5!nd(cB;ttyb5^Nt*NjARb~&cDy^Z}a{m(iKa1|8z0hhhr9qkzCl!ZW+^tVlJYw ziD`w$lgM+&!v(GG3I!+W!io|X(VDvO{_v;4|yPYVk)`uCOI8zB!9O4%3;)yAuJpb z%(R#Ac6(uABT+lwP61pKb#y}1$R=5Sa^~v)5A=)OmJH$lk$r`JQ_{YSH10z_ctBnk zs|zP}ncghg$gDJ`|B?Un>ci`U&;RwW{P+8`-%2CiIpZA}DaK5%2BsahlE!MJR(JAx zRR3Cxu3M%iu-kc+P*`0b!?@lB6UHd;38Dto+lW%l#Gs1KjfwS#ReFNU5+dU-2xdx&IG1_u&~JtR3`_nu9~h5W&!At>_E>XZpv$_h6@N zQU)y%Gn4zRu-QY6)+LxLMzq9W=BeHySG~tpv1L$}fn!p0K(w-JRL zyO=2*8-u{oM#NI7uNocx3H`1tacg_B1+nbP#m$a*s=2&*1p18nCRjzww5c0nfqsqX z53Dvc{tEAqYd~2(y>Hl9{l;6SzAURIAhX^eIx}om{f;j#(KG6Md^jHGQx|5|Iq6ZI z-s2&uAL@>)XlEGI{eFIE_O`knyT|38s4ZL8Ie$`Z^oYF$cD0|dzTCeS@lf%vwHWz| z%WKu~9EEay~&g5#xlVPIMcJfK?bX%)9O7i+qu9!4$akdDwv<= z)S@j~XVxCadWua=CRT|0)SSmUS70@2B&@R9pytO|_v!`NQb}@EIWZg3=T#Z_PRVwv z+VP<<|7%rGGn3+#mGO^*%SKjOs_v}_s8qbryIQhx)1DKx6Dub#53CES>@g~#VM+yd zUK5C^~EO%Ez?T3O&c&yyhZ5hVq;hGMnP^#aOWqP6!Kc$Vi6OE!+J z0cX+6OGG?f@-x%LVnit}r~c|Zs{Qs3x=I)hI~!fmhV(0@BPy3DKaBbOsWP;=SN%&d z(|E5@Is;MU?{d`@FyT^_yK8Y3S-bKkcBYlET!4z*VEXG;%p@r%-pX=-jhvp1# zK3m`uI}!WYSN+hZ6ijeL`^nFGg;ttxp)(b{e5)Q@ez61CcV7Wk0V`HXf>9GEfzH&N zXDle9jXWihzDWIL_S9U8K50zb5WtN^{)G#%R=BP}33lF< z9{|mg`OuMeC=Xtg7sY2@%98p1v09ZJl(9J~2PMK@NlWce@JY^na89fVdZHXZGf>}2 z1KemX4|dmq+RQ|?FwpwakD$T zDL9ATw>AGPe0xfs9M-C4_Is5Z<=)wnx!+*ip$k9QB(DE zGN1$g0*?ZZkZC9dc)3;)?39DvGu7g2cW}G^P_Tn@Z`{enf|S=qn@d@u4nIxldZ`iX z^hpO#gN|#_BPZ)liv{JWIr)I#TEX81r{F|{N;W(}u5H#etO51Tgag`mWL&~3?a*}C zHdHAMo|71!>VsAE-6?g@{5)k2R?&|qt5ac8oFHlkpL!`cm`r#oIHooOr)S>h9tJmm zh0Ws{{LMjg=hxs)3wN-O-T~}!B;8g5Ev|F|FCN16uWQ$%6ko^BGzPo;upV^|ZwHeE z(TgJe8RzC~QeYh;!{ku3$Lu6$^d7?#;Za{7CA>%NCdT{0H+18&p*b@S7Q|mxkg=#8 z?3D=pF(?tnCtbmx$f%owo$59r?$pl32oyOkt_S8YVF7bNc^Bx37;PzsS!L?eX`tDi z^Wd4Qqrurn#(=+UT!lWYU=HjW7TC2tC{BKaJ*Dz6F;5Fay_h@1;XAI)v9-9mD+aZd zQWfouU--Qd<%$#CQjxGc@W)8FlYh#QV**^xSPivD)$g8KOUkjcx=R5-i8M3!#R-+{wQtz zG2ck$`$Z`CQDNE}^@_aUi@5V;(gS{s_TfZ+&Jr9)x}7Cmg9Rs$pN#5}`={RdOR!*5hbT&cAI#K2CKKuz*w4aP)0X zh!#M7K{4}jx`MubyT=dA>$9*kPsc)o@ZpcB3*6sKnJmwfb%cC!U zOG3@)&9HTCh{YL&R~%3pQc&i%)(s~&jO zhUtDUj&oN+6Ln-Ne=Q1}dJ47kvSugR?@Qn1u;|O@;~hbaR^Sdnu?qcif+!2x81#%G zt%N6AirP2#$0FN3l{qq9}tmHdhZv>@JqlWcH@BSG*dijdCpyy;= zP|WRh;WJ3@5nMr+hKNbmlMik;s$)F#EJO>_?2(v{Ie}sba=V}Jh8nxS@6BiIBjoZI$?qv^EeA&^ zjmIvu|5+%%tGoxLzPo%ia=zPb`f9B6CsXYm5lh^8F4AH}NgGx`zQVRzqF2#e$t(A7 zlXsKJJBvwm;W=uOOsk6CMunYUtFknCb2`blp&_z{-(yW-N>g8~Os(L%$P}+8=^&o^ z5(3)F zFCb6-+5}HH(Nc65GlrIA)Xec=?4ggXa=(K(OTktFr=J4&J10k{Ke~?7d#1{$ks|}n zkH&ib+XFAbE$eH+cJpwDL(cut-Vce$?a&q~KZN)JyA?vixoYNkW;J=zo;*H=Jo=72 zyn#GGwC?jF_q--|Js_n-tJ!YN^wuJB%S3XMVe?R|2L4oxHnH9)IRd)|N5gL6>F04C z$Y*t{-Bz68sx#>g4%B{#xzP$0c)<#}3s5c@dkCH@xqcIDzC2=qC%AX$2~gO4nKzX$ z(;#;e1?jG3+t$L&{~$#$Sfd=9@u0yW)2iPTEh!Z!4U5`3s(081vYYQSdE{zc|w{ zf;=KYZh__T6hjg@3ayF}=iie5$N&F6Y?R=g3wo3BV$2DMW!gEFG#6*2pNO>TJYJCz zGnE~fDPsMlfc%eo|IwB2sQ)rG6kwc({x4*pm_@k=&$Z~uD>|!4Rm=sUKa7+TJ^g}- zOt<$W|L>*vj{3z4bAj;Fgw9kFc${=mB`su09Y^xkZ1VgWa;GTKLQ#sJ#CqwUreCc5 z7X(vPf~bW+VP}^FUg5jwF{+3)#&2)eyCBwbca7xrMK~$h+S>g9`Df{G`i;34b|Vu+ z5nr>%Y~$_F{!qaynvMw^e7$4#r??M(d3_||1fhe+(ss3lR>-5kJ_ZA1*tcP zR1@u5_7u~*#Y}6-C8qm(@YzSaK`n=z*o~Yn(sRE2wOsu7`}99eq9-X7XBHBL&4V16 z*T*W-N?2I$1y84|pPe3$v2plPL~467*6CsGCT1Jd4&J#7BN(0&M=y^jtAu9hS4$JlHA1Y_!mP(2Xm+%OK~6g|dKoT3-{ z88>|&{UevNHdn*8&2k5kd(o})(3UhqQ3d(~)nGT*Ne`w#zoJfGMANgLp%iyk8=-WU z51S#f*dJ@*hmpUhHR8ol@7_pIr>zcYzlwCgCvkp0fc&F8XOxJ6HoylEIrSi~Dnq}o z8X~`<_=jtt|It%Klp)iM4WZw}LKFI1-@u0YA@-rrU+35n5#=lwSpGnsYcXOXZTG8q zipRv$lsdgpkNEx8-$>uxq#vTEKSKX%#9xRhJxF;G_uM_fw9YQ90`y{ZSv=V?1^SC^ zOQ2uRQ66*Uo~}nQXS(SLuXuLw%L>HlX8!dkbGzU(cnYZ^3>H|^K4LR|S73A066%cU zPR1T3zv2#f?*{JwKh-a>mkN*mNGj|gHBOWIMdYh2(pDDwPdLL$#rNG&}Sw#oEL%FQlG*Q%ws;6JjV=ReAyR7+`m*9;T(-w)g0=qb|P!S z$y$-FyYSEIUz$f%r`wZ!+bhPLi=@RRl5Zr%dWu79HP)fpw4#khn75*~w)Rea z(Xy^&RrZ1Anv{_R6Pj&83rn1uk9>YmQP4c(&7_)hO<6D2*6(X_xS!P2uSr$jy2Yw# z$5AP~k7W7=wCbi_GvHf|^=ze$X@VhwSUJQM`~S}V+mE!OR^?8%q+^CD)q+05v{$nl zRz?b&3ZQvH(`IO{ZbVNI-JubFnl!&580*F5{Jookef1TsXUgu@YnE76`_<1%(QKGd zmmjvjMXJuo9W_z6>x~CE_(cWQtqU|@_gWW)2jG2aIq(>Nm9BQ>EC+BR)z*q=wFdUb zJ6B2tGpPSBzrPd1+GxtgxfQLZw&+808b@PPG-!Zd7%ZySfj^I^OGeHAR)6*q>skDY-4{~5>Z@%9>^#|}mSSmQu9eq$m z5}(4ZFf_o7r{bih3^-Tu9@z01{G&W`Gb~Z=HFp(g&XZ&1_o=!3s^D=!#3I;p(W3G? z4b0qruhqpE^1j9zs|hyMf$)$ERketAr&LYCT48PFdDz*j0-l?yUNHbW4R_1Y8p_Mc zaH2CX$l%=Rmx0e{jv#7Z+T+l-hu?Tivw&BFYg-VPY*UBr_pgry`hs|vV zm7)Le2q@LZT5WgJ`PCqU7f^F=xz^@4BI za^EITFEtlj#@~6)t@L;gzOsD*9x*~&$(^9}6LxQ^ucJ-oc%OuAa-MI)=X2y2pjGAU z=?m-TNKkXmIKlpcm<#V;T!KDT-KcmI)~6N~LBEq*A<_Zo3t*SH6Zto>cOsXE(W5Lj zHw~JbbB9q?4sya@d<4gnSq}w&CNpmf_8~J~mcc?9i_&nv^xO#YvFBQFshuQtH(HD$ zKyNM7VVdTROW@8^=wZ{Q?6?E|EP?N)77bPev2zEC^`BG`xuzl_f7p`yneSoAF@m-0 zveAAbA7$Oc-JfS_qt;C`puAybI_!_T!IyYvGF6^T5&Ba`F`cYNCN&6((k0e0ov2)f zR*=}A&z&TEj(|@k9P=y!d)hT(RvFCkI9}@^N)f+Z=`J|rv^^|Wv2zI+vIHYU+?(O( zTjRveSDYM65hpFU1F=MN8rq=$T)smrzC7g(yn0l!5!&GCB*clx7y6Nx2N|C&*qh{- zgT0LBWUTP>*mX?Dd=#8OM!yxDUM`6p4e#`m;IT+$u(KB|6lrg71D-I!^~f=g;O7yA zH}ydKGcDk)UHRa?<%7WmqfsLfVxADup31|;`JwPM?8U1k!2eR8#3i8Z4fyJSe#1KU zsnBp=d!{4sNl=s`d;`;A#$;%@AleS11TR4eGT5!$1zeL3`v>Jjbph4A z5yu2gaDb}7q?Z#xeQop{fxDGqkH8`4@V$W2Jqn=jiWT6?@hd@PDi07nPrz1@UW#$K zPvl&jQ-}>mEkMa9GW0PSB1bYFL0*D^icANfFGY5o9xQX8XM}MK*PgvMj*z-#-=If0Xh5P%Ho~T{i!I5Dx-?dJgL0Waft{k)VD;yj56bF1{T=+#Dc-aY)O?~1 zu23xk+gyN0I0o*A7dgIIiyRy;O&<@gr_CLw2@Vkak#tXFE}w;k-F{*ElN9q@fnku7g1lv)rU8OZW|AP znsbA}gWQEQ7CRTlBdFh4?BZFYokPhY(!!K9A4Hm&kfy@7|MGN$A+H$0I@q&VM;eGS zzL?4M^V#Gx(SG%X<)41$6}^_KP2jdHSFDwI#*P4I_`E)|qXN&pwIdEb+f=Mdmw}V}!G4cBQMtC5S8I#0_=WJ~=N*`r{#=nGY=Jv} zC7&!MwUIYs3gJsyqDCIP;uXz9q=p1}UzD1^3602lD0ycIdHZNpF-OR3SX-?+HW}RL zw-=GDy%XB+t+5tLTs?eh1g^OA0w;-*ub>sH+>_1)mu-c2sI-@W=O_mZJqrq-Q5I2< z@-CL;!Bys>v4_03k-W2mR6kGNG9p!yNM+&eO1ezn5NfX(Gp#7Z*r%Rjf|U{ZxEWaAk@b(oD%BIOZNcFLh1+KF)Sko`l!!xVCcv*h>I5Cd7 zNF#+EjZAWX1i2@K+!;@9hX-J90#?JW#2RwF@SioJ)T_?$iewnM>wE5<)>O`%tQRXQK1?0#@VMkznV01CLdfU6-8N&u3>uJ zoS|>f>rCMjz<66eMr{11I!2NK$1_!ksoS)X89-hrC;1CT|Bv)% z2>r)++eujCP39UF9`1kcGis^T+K+;1ax zz}s?iNKFM&OP74Kn&h4N@Au+N#8TDMH({j8`h3V0^UGN>P~~$~0pp^BnJR2+B6$yS z#>3SQF@jw`qI(jf`Y(LmbyHiz#TePzm>{OXTjhZYgvP+YUmqd=x?!~gf*R&oL$Tu z?HEX%E_29FKaj4X74WI`KTiJwBdXoInUsZBBib`0wc0{|oc?3zzhu$`{moWyG0WU; z2Y-HN?6?p!fTJHX5ZgX>9}E3O-lK5-qMh$doMm|BAB9-sXi#tJ3_;w4UvWhp;hA@| z7yPQyQ1XA{Ig>h4;m)5(*%joiPUPbbq@fXMHH~kGwvUGX2xmktu}9pGK)>IYZJ09+ z3tR;K)uD*gw11C;PNfeqDD_FPy0Nt;!3GhNQj!C8rXXU%o6Uv&(@{Hk@5b=|iT-v% z?Pj6#{8lQw1*>9Cg5ChL9keOT*@#wWcrqe|+0cLA{~lJn=7qxMvC+{>G1p%nkJ<8j z+hoLirh4gTpuZ{$UU&0RZY6xKcY!owM(LuPi2GbikW0HuWnHMYd<$7|n5;zW_*d*d ze=7Aze| z=-DN(t=aVQM%>H1`e*pu;o5SX;u+L11yS?oCVY26L~~GU>n~kf4^b`e`1kz#|NGB> z=aucKcg#uhNi7S~<5VU&^;8oZq`5zO8+mX^ULaWflwD<_qrVCiHo!00M%@K`*vD4t*poshi)fe%5^?S*>R6+DH zu)Am(wVHJ|k)E6fYu6;j!~QiI{`geQVy74ATU*TwKtEj%P+JXcp!(o>%uTE3?&V+m zNWwd-YDOaes(5Oy@)2|pG^PIL1@MzcO|Zhfq{iP-pW_I)vtwj z=gh190d_uCvj*j_uQsK^swTmcWM#DAcCtcPqT(3S<+XLFzj9r^S*mPRM8$t8lGST;xp^kA)cw`BzhE?`4WU=s; z;?7JLK@HfGEHtX$3C_=7jopo`gvsE80F=96p>q;eyX!2sfv!(cJNc^W#o&6`8gRsc zJE-U8)$qr>qzM_I8Mrni zaFLfAnO`C}mdwLv&?aFi@Ha9?mCP1ClYO4)ta?G^`bebv=Z9hr;F{nL9u0f}c6UMD zX82kS1@G!F2RGbq0Q+2$K<|}*2zO2QT5ALvO?e9{QFHonL3lpWOYuJ7ru+z4ds80T zRhD9|F8p9CpI3nrO)|@n%yc3%QU!aE>D$RPlpXCD_5ww(k>bvD$}}?hz2KY%SUxF` zr=XKgC9VU137U_cg%2N>fG7Db_r!6}5H}yDr@eE$}?we+4BNEujJShlbl^(o-@~lp-OG>4d>#{4SDx3VQYy zLD3dsVR4MLo5`4v2Gm~6o&wlEx-Kym)C+>mqJRHb1j`jzn}Zgt=BVR$o58VHY%$NT zJ31Z=-DnM3&YlaZQFG*JK{02JT!N>M>Jmlmf7@G$6Bhfb&3t38kukzgq7|5q5;YR} zn(2rnK~WdsyO|C{uLX+OClu`yBXEk~Hueg^iG@<&#iTP}m*A`LR_jl%K&jX8*`RLE z3(;Ey-R}zCy9&Px+#&4_j@#@Cwws4>Js_!_GU!450ak)yUKCNvT*8H)gzaHERJ6yC zwoC^Vkb$XWKql#5DcGO%lOTOXNx!%-{iQqUBlLU2*64kgHu|Gi@GL9?Hz)T(Oq3Ne z8B}zY1xMJR<$A=tfC>*y4V2VlrTkH_`*B6A?Wb-R<3vnNpZB45X z%>@))2e%}@L2r>15(l1jn*w%uGYup0CxcY*tmZ~=gn}(%i`>iK{&Zp)NLj^mFQp{qGZq6j1WJT`i#V`Vh8gV|zv=ef|ox73mVG&T&&buF(b`bSt zzk+GITcoY0ps1s_=bC~Mcf=KU0e7UJE!%tzRR#CEm0&la`fW$hz%U$K^#FciU8~pt zI-W8Hm878Gdi~N1;Lu_4WveD?wn`QBBfq`3%0bxBeu2o>gM7P#v=M4w+cRw~M_R2X zEm6~mEXI-M!UC@(m^Ksb*Hnk;mx+SIn$g3XC>BGHaZyS>crXm#FiQN4)@F3#Z8rF$ zQ6OdvR$3^%;l}G5z)ol8A_@rH4Lcb;k(>`67~Kz?N6iNP$rsI}xv-TP+6-dxrKHIV zl5c0jebh;Vp5$}%W!RxOOzKY}_3B7n(JpjCn0}H#KF$;DO=?Rt!}A}hmY{AQrl!6G zCBl)fmIZ%NT5E)D23AiTj8TdQD<1}6B`Ea<>OxcVTqkhlUMSM+#AhKjf+yI4#?-7K zRxvd8GW`_aga*MULeJx0dF2tThWi_ln&P^Kup-6m3DC@Hs< zykbTE<(*6DDX>#eL7sn3$}Azz^&rnAwW8ge4l0GupGr)t#{94>;tJS}bF&j`>>V&; zfB6z^;rI`a2VwQ(n6d^Uvcd~!_0l&FN`fQSV?;gbJM%QC+SL~nD_lnh(f*f3+mt=P zyktb1J%iFBuXW^c4^nzDdH5@N@CLbG{FQIY!%oDHq*N)nLwMS@sZ4KCCN~APzQQvF zi^@h}O)8!5iClL(at_Xi&GPyMr`) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +Root { + inputs 0 + name C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk + project_directory "\"C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/" + format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" + proxy_type scale + proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" + colorManagement OCIO + OCIO_config aces_1.0.3 + defaultViewerLUT "OCIO LUTs" + workingSpaceLUT scene_linear + monitorLut ACES/Rec.709 + monitorOutLUT "sRGB (ACES)" + int8Lut matte_paint + int16Lut texture_paint + logLut compositing_log + floatLut scene_linear +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr + format "1024 32 0 0 1024 32 1 " + origset true + colorspace data + name Read_Linear_LUT_32 + xpos -846 + ypos 10 +} +set Nb1e9800 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer1 + xpos -847 + ypos 135 +} +push $Nb1e9800 +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + working_space scene_linear + name Log2_48_nits_Shaper_to_linear + xpos -710 + ypos 46 +} +set Nb1e9000 [stack 0] +Transform { + center {1024 778} + name Transform_Position_LUT + xpos -579 + ypos 3 +} +set Nb1e8c00 [stack 0] +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr + format "2802 1854 0 0 2802 1854 1 " + origset true + name Read_DisplayMapperPassthrough + xpos -577 + ypos -119 +} +ZMerge { + inputs 2 + name ZMerge_Combine + xpos -413 + ypos -83 +} +set Nb18fc00 [stack 0] +HueShift { + ingray 0.136 + outgray 0.31 + saturation 2 + color_saturation 0.3 + hue_rotation -150 + brightness 0.81 + name HueShift1 + xpos -256 + ypos -83 +} +set Nb18f800 [stack 0] +OCIOCDLTransform { + saturation 1.23 + working_space scene_linear + name INV_Log2_48_nits_Shaper_to_linear + xpos -86 + ypos -83 +} +set Nb18f400 [stack 0] +Crop { + box {0 0 1024 32} + reformat true + crop false + name Crop1 + xpos -86 + ypos 32 +} +set Nb18f000 [stack 0] +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + direction inverse + working_space reference + name OCIOFileTransform2 + xpos 84 + ypos 32 +} +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr + colorspace data + raw true + file_type exr + write_ACES_compliant_EXR true + datatype "32 bit float" + first_part rgba + version 8 + in_colorspace scene_linear + out_colorspace scene_linear + name Write_RAW_LUT + xpos 242 + ypos 20 +} +Viewer { + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer7 + xpos 242 + ypos 135 +} +push $Nb18f400 +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr + colorspace compositing_linear + file_type exr + write_ACES_compliant_EXR true + datatype "32 bit float" + first_part rgba + version 9 + name Write_Shot_Grade_Comp + selected true + xpos 353 + ypos -95 +} +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer8 + xpos 357 + ypos 135 +} +push $Nb1e9000 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer2 + xpos -710 + ypos 137 +} +push $Nb1e8c00 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer3 + xpos -579 + ypos 135 +} +push $Nb18fc00 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer4 + xpos -413 + ypos 133 +} +push $Nb18f800 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer5 + xpos -254 + ypos 133 +} +push $Nb18f000 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer6 + xpos -86 + ypos 134 +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ new file mode 100644 index 0000000000..a7c1f478b2 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ @@ -0,0 +1,232 @@ +#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx +version 13.0 v3 +define_window_layout_xml { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +Root { + inputs 0 + name C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk + project_directory "\"C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/" + format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" + proxy_type scale + proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" + colorManagement OCIO + OCIO_config aces_1.0.3 + defaultViewerLUT "OCIO LUTs" + workingSpaceLUT scene_linear + monitorLut ACES/Rec.709 + monitorOutLUT "sRGB (ACES)" + int8Lut matte_paint + int16Lut texture_paint + logLut compositing_log + floatLut scene_linear +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr + format "1024 32 0 0 1024 32 1 " + origset true + colorspace data + name Read_Linear_LUT_32 + xpos -846 + ypos 10 +} +set Ncf69800 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer1 + xpos -847 + ypos 135 +} +push $Ncf69800 +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + working_space scene_linear + name Log2_48_nits_Shaper_to_linear + xpos -710 + ypos 46 +} +set Ncf69000 [stack 0] +Transform { + center {1024 778} + name Transform_Position_LUT + xpos -579 + ypos 3 +} +set Ncf68c00 [stack 0] +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr + format "2802 1854 0 0 2802 1854 1 " + origset true + name Read_DisplayMapperPassthrough + xpos -577 + ypos -119 +} +ZMerge { + inputs 2 + name ZMerge_Combine + xpos -413 + ypos -83 +} +set Ncef7c00 [stack 0] +HueShift { + ingray 0.136 + outgray 0.31 + saturation 2 + color_saturation 0.3 + hue_rotation -150 + brightness 0.81 + name HueShift1 + xpos -256 + ypos -83 +} +set Ncef7800 [stack 0] +OCIOCDLTransform { + saturation 1.23 + working_space scene_linear + name INV_Log2_48_nits_Shaper_to_linear + xpos -86 + ypos -83 +} +set Ncef7400 [stack 0] +Crop { + box {0 0 1024 32} + reformat true + crop false + name Crop1 + xpos -86 + ypos 32 +} +set Ncef7000 [stack 0] +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + direction inverse + working_space reference + name OCIOFileTransform2 + xpos 84 + ypos 32 +} +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr + colorspace data + raw true + file_type exr + write_ACES_compliant_EXR true + datatype "32 bit float" + first_part rgba + version 8 + name Write_RAW_LUT + xpos 242 + ypos 20 +} +Viewer { + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer7 + xpos 242 + ypos 135 +} +push $Ncef7400 +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-extreme-grade.exr + colorspace compositing_linear + file_type exr + write_ACES_compliant_EXR true + datatype "32 bit float" + first_part rgba + version 7 + name Write_Shot_Grade_Comp + xpos 353 + ypos -95 +} +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer8 + xpos 357 + ypos 135 +} +push $Ncf69000 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer2 + xpos -710 + ypos 137 +} +push $Ncf68c00 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer3 + xpos -579 + ypos 135 +} +push $Ncef7c00 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer4 + xpos -413 + ypos 133 +} +push $Ncef7800 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer5 + xpos -254 + ypos 133 +} +push $Ncef7000 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer6 + xpos -86 + ypos 134 +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr new file mode 100644 index 0000000000..f9235dac3a --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ea4288b55725bfa89d7add69ea45b0ac9315cfffd6acfba66082f4d21c1ac1a +size 31227624 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.3dl b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.3dl new file mode 100644 index 0000000000..00a68043ad --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.3dl @@ -0,0 +1,32769 @@ +0 33 66 99 132 165 198 231 264 297 330 363 396 429 462 495 528 561 594 627 660 693 726 759 792 825 858 891 924 957 990 1023 +0 0 0 +0 40 0 +0 176 0 +0 310 0 +0 444 0 +0 578 0 +0 711 0 +0 844 0 +0 976 0 +0 1109 0 +0 1241 0 +0 1374 0 +0 1506 0 +0 1638 0 +0 1770 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +235 0 150 +0 22 0 +0 162 0 +0 300 0 +0 437 0 +0 572 0 +0 707 0 +0 841 0 +0 974 0 +0 1107 0 +0 1240 0 +0 1373 0 +0 1505 0 +0 1638 0 +0 1770 0 +0 1902 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +474 0 352 +349 0 225 +98 143 0 +0 286 0 +0 427 0 +0 565 0 +0 701 0 +0 836 0 +0 971 0 +0 1105 0 +0 1238 0 +0 1371 0 +0 1504 0 +0 1637 0 +0 1769 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +672 0 529 +595 0 448 +467 117 309 +205 267 14 +0 412 0 +0 554 0 +0 693 0 +0 831 0 +0 967 0 +0 1102 0 +0 1236 0 +0 1370 0 +0 1503 0 +0 1636 0 +0 1769 0 +0 1901 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +848 0 693 +797 0 638 +719 78 551 +588 240 402 +318 393 67 +0 540 0 +0 683 0 +0 823 0 +0 961 0 +0 1097 0 +0 1233 0 +0 1367 0 +0 1501 0 +0 1635 0 +0 1768 0 +0 1901 0 +0 2033 0 +0 2165 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1010 0 848 +975 0 809 +924 22 751 +845 201 661 +712 365 502 +435 520 130 +0 669 0 +0 813 0 +0 953 0 +0 1092 0 +0 1228 0 +0 1364 0 +0 1499 0 +0 1633 0 +0 1766 0 +0 1900 0 +0 2033 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1163 0 996 +1139 0 968 +1104 0 928 +1052 143 869 +972 326 775 +837 493 609 +555 649 202 +0 798 0 +0 943 0 +0 1084 0 +0 1223 0 +0 1360 0 +0 1496 0 +0 1631 0 +0 1765 0 +0 1898 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1311 0 1139 +1293 0 1119 +1269 0 1091 +1233 52 1050 +1181 267 990 +1101 452 893 +965 621 721 +678 778 283 +0 928 0 +0 1073 0 +0 1215 0 +0 1354 0 +0 1491 0 +0 1627 0 +0 1762 0 +0 1897 0 +0 2030 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1454 0 1280 +1441 0 1265 +1424 0 1245 +1399 0 1216 +1363 174 1175 +1311 393 1113 +1230 580 1015 +1093 750 837 +804 908 374 +0 1059 0 +0 1204 0 +0 1346 0 +0 1486 0 +0 1623 0 +0 1759 0 +0 1894 0 +0 2029 0 +0 2163 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1595 0 1418 +1585 0 1407 +1572 0 1393 +1554 0 1372 +1530 9 1343 +1494 298 1301 +1441 520 1239 +1360 709 1139 +1222 880 957 +931 1039 472 +0 1190 0 +0 1336 0 +0 1478 0 +0 1617 0 +0 1755 0 +0 1891 0 +0 2026 0 +0 2161 0 +0 2295 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1733 0 1555 +1726 0 1547 +1716 0 1536 +1703 0 1521 +1686 0 1501 +1661 130 1471 +1625 424 1429 +1572 649 1366 +1491 839 1265 +1352 1011 1080 +1059 1170 577 +0 1321 0 +0 1467 0 +0 1610 0 +0 1749 0 +0 1887 0 +0 2023 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1869 0 1690 +1864 0 1684 +1857 0 1676 +1848 0 1666 +1835 0 1651 +1817 0 1630 +1792 254 1601 +1756 552 1558 +1704 778 1494 +1622 970 1392 +1483 1141 1205 +1188 1301 687 +0 1453 0 +0 1599 0 +0 1741 0 +0 1881 0 +0 2019 0 +0 2155 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2005 0 1825 +2001 0 1821 +1996 0 1815 +1989 0 1807 +1979 0 1796 +1966 0 1781 +1949 0 1760 +1924 379 1731 +1888 681 1688 +1835 908 1624 +1753 1100 1521 +1614 1272 1332 +1318 1432 803 +0 1584 0 +0 1731 0 +0 1873 0 +0 2013 0 +0 2151 0 +0 2287 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2139 0 1959 +2137 0 1956 +2133 0 1951 +2127 0 1945 +2121 0 1937 +2111 0 1927 +2099 0 1912 +2081 0 1891 +2055 506 1861 +2019 810 1818 +1967 1038 1754 +1885 1231 1650 +1745 1404 1460 +1448 1564 922 +0 1716 0 +0 1863 0 +0 2005 0 +0 2145 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2273 0 2093 +2271 0 2091 +2269 0 2087 +2265 0 2083 +2259 0 2077 +2253 0 2069 +2243 0 2057 +2231 0 2043 +2213 60 2022 +2187 635 1992 +2151 941 1949 +2099 1169 1884 +2016 1363 1781 +1877 1536 1589 +1579 1696 1044 +0 1848 0 +0 1995 0 +0 2137 0 +0 2277 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2407 0 2225 +2405 0 2223 +2403 0 2221 +2401 0 2219 +2397 0 2213 +2391 0 2207 +2385 0 2199 +2375 0 2189 +2361 0 2173 +2345 182 2153 +2319 764 2123 +2283 1071 2081 +2231 1301 2015 +2149 1494 1911 +2008 1667 1719 +1710 1828 1168 +0 1980 0 +0 2127 0 +0 2269 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2539 0 2359 +2539 0 2357 +2537 0 2355 +2535 0 2353 +2533 0 2349 +2529 0 2345 +2523 0 2339 +2517 0 2331 +2507 0 2321 +2493 0 2305 +2475 306 2285 +2451 894 2255 +2415 1202 2211 +2363 1432 2147 +2279 1626 2042 +2141 1799 1850 +1842 1960 1295 +0 2113 0 +0 2259 0 +0 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2673 0 2491 +2671 0 2491 +2671 0 2489 +2669 0 2487 +2667 0 2485 +2665 0 2481 +2661 0 2477 +2655 0 2471 +2649 0 2463 +2639 0 2453 +2625 0 2437 +2607 433 2415 +2583 1025 2387 +2547 1334 2343 +2493 1564 2279 +2411 1758 2173 +2273 1931 1981 +1973 2091 1423 +0 2245 0 +0 2391 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2805 0 2623 +2805 0 2623 +2803 0 2623 +2803 0 2621 +2801 0 2619 +2799 0 2617 +2797 0 2613 +2793 0 2609 +2787 0 2603 +2781 0 2595 +2771 0 2583 +2757 0 2569 +2741 560 2547 +2715 1155 2517 +2679 1465 2475 +2625 1696 2409 +2543 1890 2305 +2403 2063 2111 +2105 2223 1552 +0 2377 0 +0 2523 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2937 0 2757 +2937 0 2755 +2937 0 2755 +2935 0 2755 +2935 0 2753 +2933 0 2751 +2931 0 2749 +2929 0 2745 +2925 0 2741 +2919 0 2735 +2913 0 2727 +2903 0 2715 +2891 0 2701 +2873 689 2679 +2847 1287 2649 +2811 1597 2607 +2759 1828 2541 +2675 2022 2437 +2535 2195 2243 +2237 2355 1681 +0 2509 0 +0 2655 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2889 +3069 0 2889 +3069 0 2887 +3069 0 2887 +3067 0 2885 +3067 0 2885 +3065 0 2883 +3063 0 2881 +3061 0 2877 +3057 0 2873 +3051 0 2867 +3045 0 2859 +3035 0 2847 +3023 0 2833 +3005 819 2811 +2979 1418 2781 +2943 1729 2739 +2891 1959 2673 +2807 2153 2569 +2667 2327 2375 +2369 2487 1811 +0 2641 0 +0 2787 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3021 +3203 0 3021 +3203 0 3021 +3201 0 3019 +3201 0 3019 +3201 0 3017 +3199 0 3017 +3197 0 3015 +3195 0 3013 +3193 0 3009 +3189 0 3005 +3183 0 2999 +3177 0 2991 +3167 0 2979 +3155 0 2965 +3137 949 2943 +3111 1550 2913 +3075 1860 2871 +3023 2091 2805 +2939 2285 2701 +2801 2459 2507 +2501 2619 1942 +0 2773 0 +0 2919 0 +0 3061 0 +0 3201 0 +0 3339 0 +0 3475 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3333 0 3151 +3333 0 3151 +3333 0 3151 +3331 0 3149 +3329 0 3147 +3327 0 3145 +3325 0 3141 +3321 0 3137 +3315 0 3131 +3309 0 3123 +3299 0 3111 +3287 0 3097 +3269 1080 3075 +3243 1682 3045 +3207 1992 3003 +3155 2223 2937 +3073 2417 2833 +2933 2591 2639 +2633 2751 2073 +0 2905 0 +0 3051 0 +0 3193 0 +0 3333 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3283 +3465 0 3283 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3273 +3453 0 3269 +3447 0 3263 +3441 0 3255 +3431 0 3243 +3419 0 3229 +3401 1211 3207 +3375 1813 3177 +3339 2125 3135 +3287 2355 3069 +3205 2549 2965 +3065 2723 2771 +2765 2885 2205 +0 3037 0 +0 3183 0 +0 3327 0 +0 3465 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4009 0 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3415 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3405 +3585 0 3401 +3579 0 3395 +3573 0 3387 +3563 0 3375 +3551 0 3361 +3533 1342 3339 +3507 1945 3309 +3471 2257 3267 +3419 2487 3201 +3337 2681 3097 +3197 2855 2903 +2897 3017 2337 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3735 0 +0 3873 0 +0 4007 0 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3547 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3711 0 3527 +3705 0 3519 +3695 0 3507 +3683 0 3493 +3665 1474 3471 +3639 2077 3441 +3603 2389 3399 +3551 2619 3333 +3469 2813 3229 +3329 2987 3035 +3029 3149 2467 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3857 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1605 3603 +3771 2209 3573 +3735 2521 3531 +3683 2751 3465 +3601 2947 3361 +3461 3119 3167 +3161 3281 2599 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3987 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1737 3735 +3903 2341 3705 +3867 2653 3663 +3815 2883 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2731 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4091 0 3905 +4079 0 3889 +4061 1869 3867 +4035 2473 3839 +3999 2785 3795 +3947 3015 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2863 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4065 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2001 4001 +4095 2605 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3515 3563 +3557 3677 2995 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2133 4095 +4095 2737 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3127 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2265 4095 +4095 2869 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3259 +0 0 13 +0 54 0 +0 186 0 +0 318 0 +0 450 0 +0 582 0 +0 714 0 +0 846 0 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +258 0 216 +36 36 36 +0 172 0 +0 308 0 +0 442 0 +0 576 0 +0 710 0 +0 843 0 +0 976 0 +0 1108 0 +0 1241 0 +0 1373 0 +0 1506 0 +0 1638 0 +0 1770 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +488 0 395 +367 11 282 +129 154 65 +0 294 0 +0 432 0 +0 569 0 +0 704 0 +0 839 0 +0 973 0 +0 1106 0 +0 1239 0 +0 1372 0 +0 1505 0 +0 1637 0 +0 1770 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +681 0 560 +606 0 484 +481 128 357 +230 275 101 +0 418 0 +0 559 0 +0 697 0 +0 833 0 +0 969 0 +0 1103 0 +0 1237 0 +0 1370 0 +0 1503 0 +0 1636 0 +0 1769 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +854 0 714 +804 0 662 +727 91 580 +599 249 441 +337 399 146 +0 544 0 +0 686 0 +0 826 0 +0 963 0 +0 1099 0 +0 1234 0 +0 1368 0 +0 1502 0 +0 1635 0 +0 1768 0 +0 1901 0 +0 2033 0 +0 2165 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1015 0 863 +980 0 825 +929 36 770 +851 210 683 +720 372 534 +450 525 199 +0 672 0 +0 815 0 +0 955 0 +0 1093 0 +0 1229 0 +0 1365 0 +0 1499 0 +0 1633 0 +0 1767 0 +0 1900 0 +0 2033 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1167 0 1007 +1142 0 980 +1107 0 941 +1056 154 883 +977 333 793 +844 498 634 +567 652 262 +0 801 0 +0 945 0 +0 1085 0 +0 1224 0 +0 1361 0 +0 1496 0 +0 1631 0 +0 1765 0 +0 1899 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1313 0 1147 +1296 0 1128 +1271 0 1100 +1236 65 1060 +1184 275 1001 +1104 458 907 +969 625 741 +687 781 334 +0 930 0 +0 1075 0 +0 1216 0 +0 1355 0 +0 1492 0 +0 1628 0 +0 1763 0 +0 1897 0 +0 2030 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1456 0 1286 +1443 0 1271 +1425 0 1251 +1401 0 1223 +1365 184 1182 +1313 399 1122 +1233 584 1025 +1097 753 853 +810 910 416 +0 1060 0 +0 1206 0 +0 1347 0 +0 1486 0 +0 1624 0 +0 1760 0 +0 1894 0 +0 2029 0 +0 2163 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1596 0 1422 +1586 0 1412 +1574 0 1397 +1556 0 1377 +1531 23 1348 +1495 306 1307 +1443 525 1245 +1362 712 1147 +1225 882 969 +936 1040 506 +0 1191 0 +0 1337 0 +0 1479 0 +0 1618 0 +0 1755 0 +0 1891 0 +0 2026 0 +0 2161 0 +0 2295 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1734 0 1558 +1727 0 1550 +1717 0 1539 +1704 0 1525 +1687 0 1504 +1662 141 1475 +1626 430 1434 +1574 652 1371 +1492 841 1271 +1354 1012 1089 +1063 1171 604 +0 1322 0 +0 1468 0 +0 1610 0 +0 1750 0 +0 1887 0 +0 2023 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1870 0 1693 +1865 0 1687 +1858 0 1679 +1848 0 1668 +1836 0 1653 +1818 0 1633 +1793 262 1604 +1757 556 1561 +1704 781 1498 +1623 971 1397 +1485 1142 1212 +1191 1302 709 +0 1453 0 +0 1599 0 +0 1742 0 +0 1881 0 +0 2019 0 +0 2155 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2005 0 1827 +2001 0 1822 +1996 0 1817 +1989 0 1809 +1980 0 1798 +1967 0 1783 +1949 0 1762 +1924 386 1733 +1888 684 1690 +1836 910 1627 +1754 1101 1524 +1615 1273 1337 +1320 1433 819 +0 1585 0 +0 1731 0 +0 1874 0 +0 2013 0 +0 2151 0 +0 2287 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2139 0 1960 +2137 0 1957 +2133 0 1953 +2127 0 1947 +2121 0 1939 +2111 0 1928 +2099 0 1913 +2081 0 1892 +2055 511 1863 +2020 813 1820 +1967 1040 1756 +1885 1232 1653 +1746 1405 1464 +1450 1565 935 +0 1717 0 +0 1863 0 +0 2005 0 +0 2145 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2273 0 2093 +2271 0 2091 +2269 0 2087 +2265 0 2083 +2259 0 2077 +2253 0 2069 +2243 0 2059 +2231 0 2044 +2213 72 2023 +2187 638 1993 +2151 943 1950 +2099 1171 1886 +2017 1363 1783 +1877 1536 1592 +1580 1696 1054 +0 1848 0 +0 1995 0 +0 2137 0 +0 2277 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2407 0 2227 +2405 0 2225 +2403 0 2223 +2401 0 2219 +2397 0 2215 +2391 0 2209 +2385 0 2201 +2375 0 2189 +2363 0 2175 +2345 192 2153 +2319 767 2125 +2283 1073 2081 +2231 1302 2017 +2149 1495 1913 +2009 1668 1722 +1711 1828 1176 +0 1980 0 +0 2127 0 +0 2269 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2539 0 2359 +2539 0 2357 +2537 0 2357 +2535 0 2353 +2533 0 2351 +2529 0 2345 +2523 0 2341 +2517 0 2333 +2507 0 2321 +2495 0 2305 +2477 314 2285 +2451 896 2255 +2415 1203 2213 +2363 1433 2147 +2281 1626 2043 +2141 1799 1851 +1842 1960 1301 +0 2113 0 +0 2259 0 +0 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2673 0 2491 +2671 0 2491 +2671 0 2489 +2669 0 2487 +2667 0 2485 +2665 0 2481 +2661 0 2477 +2655 0 2471 +2649 0 2463 +2639 0 2453 +2627 0 2437 +2609 438 2417 +2583 1026 2387 +2547 1334 2343 +2495 1564 2279 +2413 1758 2175 +2273 1931 1982 +1974 2091 1427 +0 2245 0 +0 2391 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2805 0 2625 +2805 0 2623 +2803 0 2623 +2803 0 2621 +2801 0 2619 +2799 0 2617 +2797 0 2613 +2793 0 2609 +2787 0 2603 +2781 0 2595 +2771 0 2585 +2759 0 2569 +2741 565 2549 +2715 1157 2519 +2679 1466 2475 +2627 1696 2411 +2543 1890 2305 +2405 2063 2113 +2105 2223 1555 +0 2377 0 +0 2523 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2937 0 2757 +2937 0 2755 +2937 0 2755 +2935 0 2755 +2935 0 2753 +2933 0 2751 +2931 0 2749 +2929 0 2745 +2925 0 2741 +2919 0 2735 +2913 0 2727 +2903 0 2717 +2891 0 2701 +2873 693 2679 +2847 1288 2651 +2811 1597 2607 +2759 1828 2541 +2675 2022 2437 +2537 2195 2243 +2237 2355 1684 +0 2509 0 +0 2655 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2889 +3071 0 2889 +3069 0 2887 +3069 0 2887 +3069 0 2887 +3067 0 2885 +3065 0 2883 +3063 0 2881 +3061 0 2877 +3057 0 2873 +3051 0 2867 +3045 0 2859 +3035 0 2847 +3023 0 2833 +3005 821 2811 +2979 1419 2781 +2943 1729 2739 +2891 1960 2673 +2807 2153 2569 +2669 2327 2375 +2369 2487 1813 +0 2641 0 +0 2787 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3021 +3203 0 3021 +3203 0 3021 +3201 0 3019 +3201 0 3019 +3201 0 3019 +3199 0 3017 +3197 0 3015 +3195 0 3013 +3193 0 3009 +3189 0 3005 +3183 0 2999 +3177 0 2991 +3167 0 2979 +3155 0 2965 +3137 951 2943 +3111 1550 2913 +3075 1861 2871 +3023 2091 2805 +2941 2285 2701 +2801 2459 2507 +2501 2619 1944 +0 2773 0 +0 2919 0 +0 3061 0 +0 3201 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3333 0 3151 +3333 0 3151 +3333 0 3151 +3331 0 3149 +3329 0 3147 +3327 0 3145 +3325 0 3141 +3321 0 3137 +3315 0 3131 +3309 0 3123 +3299 0 3111 +3287 0 3097 +3269 1081 3075 +3243 1682 3045 +3207 1993 3003 +3155 2223 2937 +3073 2417 2833 +2933 2591 2639 +2633 2753 2075 +0 2905 0 +0 3051 0 +0 3193 0 +0 3333 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3283 +3465 0 3283 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3273 +3453 0 3269 +3447 0 3263 +3441 0 3255 +3431 0 3243 +3419 0 3229 +3401 1212 3207 +3375 1814 3177 +3339 2125 3135 +3287 2355 3069 +3205 2549 2965 +3065 2723 2771 +2765 2885 2205 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4009 0 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3415 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3405 +3585 0 3401 +3579 0 3395 +3573 0 3387 +3563 0 3375 +3551 0 3361 +3533 1343 3339 +3507 1946 3309 +3471 2257 3267 +3419 2487 3201 +3337 2681 3097 +3197 2855 2903 +2897 3017 2337 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3735 0 +0 3873 0 +0 4007 0 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3711 0 3527 +3705 0 3519 +3695 0 3507 +3683 0 3493 +3665 1474 3471 +3639 2077 3441 +3603 2389 3399 +3551 2619 3333 +3469 2813 3229 +3329 2987 3035 +3029 3149 2469 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3857 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1606 3603 +3771 2209 3573 +3735 2521 3531 +3683 2751 3465 +3601 2947 3361 +3461 3119 3167 +3161 3281 2601 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3987 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1738 3735 +3903 2341 3707 +3867 2653 3663 +3815 2883 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2731 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4091 0 3905 +4079 0 3889 +4061 1869 3867 +4035 2473 3839 +3999 2785 3795 +3947 3015 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2863 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4065 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2001 4001 +4095 2605 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3515 3563 +3557 3677 2995 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2133 4095 +4095 2737 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3127 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2265 4095 +4095 2869 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3259 +7 0 127 +0 71 0 +0 199 0 +0 328 0 +0 457 0 +0 587 0 +0 718 0 +0 849 0 +0 980 0 +0 1112 0 +0 1243 0 +0 1375 0 +0 1507 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +287 0 292 +83 54 145 +0 186 0 +0 318 0 +0 450 0 +0 582 0 +0 714 0 +0 846 0 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +506 0 448 +390 30 348 +168 168 168 +0 304 0 +0 440 0 +0 574 0 +0 708 0 +0 842 0 +0 975 0 +0 1108 0 +0 1240 0 +0 1373 0 +0 1505 0 +0 1638 0 +0 1770 0 +0 1902 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +693 0 597 +620 0 527 +499 143 414 +261 286 197 +0 426 0 +0 564 0 +0 701 0 +0 836 0 +0 971 0 +0 1105 0 +0 1238 0 +0 1371 0 +0 1504 0 +0 1637 0 +0 1769 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +862 0 741 +813 0 692 +738 107 616 +613 260 489 +362 407 233 +0 550 0 +0 691 0 +0 829 0 +0 965 0 +0 1100 0 +0 1235 0 +0 1369 0 +0 1502 0 +0 1636 0 +0 1768 0 +0 1901 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1020 0 882 +986 0 846 +936 54 794 +859 223 712 +731 381 573 +469 531 278 +0 677 0 +0 818 0 +0 958 0 +0 1095 0 +0 1231 0 +0 1366 0 +0 1500 0 +0 1634 0 +0 1767 0 +0 1900 0 +0 2033 0 +0 2165 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1171 0 1021 +1146 0 995 +1112 0 957 +1061 168 902 +983 343 815 +852 504 666 +582 657 331 +0 804 0 +0 947 0 +0 1087 0 +0 1225 0 +0 1362 0 +0 1497 0 +0 1632 0 +0 1765 0 +0 1899 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1316 0 1158 +1299 0 1139 +1274 0 1112 +1239 82 1073 +1188 286 1015 +1109 465 925 +976 630 766 +699 784 394 +0 933 0 +0 1077 0 +0 1217 0 +0 1356 0 +0 1493 0 +0 1628 0 +0 1763 0 +0 1897 0 +0 2031 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1458 0 1293 +1445 0 1279 +1428 0 1260 +1403 0 1232 +1368 197 1192 +1316 407 1133 +1236 590 1039 +1101 757 873 +819 913 466 +0 1062 0 +0 1207 0 +0 1348 0 +0 1487 0 +0 1624 0 +0 1760 0 +0 1895 0 +0 2029 0 +0 2163 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1597 0 1428 +1588 0 1418 +1575 0 1403 +1558 0 1383 +1533 42 1355 +1497 316 1315 +1445 531 1254 +1365 717 1157 +1229 885 985 +943 1042 548 +0 1192 0 +0 1338 0 +0 1479 0 +0 1618 0 +0 1756 0 +0 1892 0 +0 2027 0 +0 2161 0 +0 2295 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1735 0 1562 +1728 0 1555 +1718 0 1544 +1706 0 1529 +1688 0 1509 +1663 155 1480 +1628 438 1439 +1575 657 1377 +1494 845 1279 +1357 1014 1101 +1068 1172 638 +0 1323 0 +0 1469 0 +0 1611 0 +0 1750 0 +0 1887 0 +0 2023 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1871 0 1696 +1866 0 1690 +1859 0 1682 +1849 0 1672 +1837 0 1657 +1819 0 1636 +1794 273 1607 +1758 562 1566 +1706 784 1503 +1624 974 1403 +1487 1144 1221 +1195 1303 736 +0 1454 0 +0 1600 0 +0 1742 0 +0 1882 0 +0 2019 0 +0 2155 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2006 0 1829 +2002 0 1825 +1997 0 1819 +1990 0 1811 +1981 0 1800 +1968 0 1785 +1950 0 1765 +1925 394 1736 +1889 689 1694 +1837 913 1630 +1755 1103 1529 +1617 1275 1344 +1323 1434 841 +0 1585 0 +0 1732 0 +0 1874 0 +0 2013 0 +0 2151 0 +0 2287 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2141 0 1962 +2137 0 1959 +2133 0 1955 +2129 0 1949 +2121 0 1941 +2113 0 1930 +2099 0 1915 +2081 0 1894 +2057 518 1865 +2020 816 1822 +1968 1042 1759 +1886 1234 1657 +1747 1405 1470 +1452 1565 952 +0 1717 0 +0 1863 0 +0 2006 0 +0 2145 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2273 0 2095 +2271 0 2093 +2269 0 2089 +2265 0 2085 +2259 0 2079 +2253 0 2071 +2243 0 2061 +2231 0 2045 +2213 89 2024 +2187 643 1995 +2151 945 1952 +2099 1172 1888 +2017 1364 1785 +1878 1537 1596 +1582 1697 1067 +0 1849 0 +0 1995 0 +0 2137 0 +0 2277 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2407 0 2227 +2405 0 2225 +2403 0 2223 +2401 0 2219 +2397 0 2215 +2391 0 2209 +2385 0 2201 +2375 0 2191 +2363 0 2175 +2345 205 2155 +2319 771 2125 +2283 1074 2083 +2231 1303 2018 +2149 1495 1915 +2010 1668 1725 +1713 1828 1186 +0 1980 0 +0 2127 0 +0 2269 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2541 0 2359 +2539 0 2359 +2537 0 2357 +2535 0 2355 +2533 0 2351 +2529 0 2347 +2523 0 2341 +2517 0 2333 +2507 0 2321 +2495 0 2307 +2477 324 2285 +2451 899 2257 +2415 1205 2213 +2363 1434 2149 +2281 1627 2045 +2141 1800 1854 +1843 1960 1308 +0 2113 0 +0 2259 0 +0 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2673 0 2493 +2673 0 2491 +2671 0 2489 +2669 0 2489 +2667 0 2485 +2665 0 2483 +2661 0 2479 +2655 0 2473 +2649 0 2465 +2639 0 2453 +2627 0 2439 +2609 446 2417 +2583 1028 2387 +2547 1335 2345 +2495 1565 2279 +2413 1758 2175 +2273 1932 1984 +1975 2093 1433 +0 2245 0 +0 2391 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2805 0 2625 +2805 0 2623 +2805 0 2623 +2803 0 2621 +2801 0 2619 +2799 0 2617 +2797 0 2615 +2793 0 2609 +2787 0 2603 +2781 0 2595 +2771 0 2585 +2759 0 2569 +2741 570 2549 +2715 1158 2519 +2679 1467 2475 +2627 1697 2411 +2545 1890 2307 +2405 2063 2113 +2107 2223 1559 +0 2377 0 +0 2523 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2757 +2937 0 2757 +2937 0 2755 +2937 0 2755 +2935 0 2753 +2933 0 2751 +2931 0 2749 +2929 0 2745 +2925 0 2741 +2919 0 2735 +2913 0 2727 +2903 0 2717 +2891 0 2701 +2873 697 2681 +2847 1289 2651 +2811 1598 2607 +2759 1828 2543 +2677 2022 2437 +2537 2195 2245 +2237 2355 1687 +0 2509 0 +0 2655 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2889 +3071 0 2889 +3069 0 2889 +3069 0 2887 +3069 0 2887 +3067 0 2885 +3065 0 2883 +3063 0 2881 +3061 0 2877 +3057 0 2873 +3051 0 2867 +3045 0 2859 +3035 0 2849 +3023 0 2833 +3005 825 2811 +2979 1420 2783 +2943 1729 2739 +2891 1960 2673 +2809 2153 2569 +2669 2327 2377 +2369 2487 1816 +0 2641 0 +0 2787 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3021 +3203 0 3021 +3203 0 3021 +3201 0 3021 +3201 0 3019 +3201 0 3019 +3199 0 3017 +3197 0 3015 +3195 0 3013 +3193 0 3009 +3189 0 3005 +3183 0 2999 +3177 0 2991 +3167 0 2981 +3155 0 2965 +3137 954 2943 +3111 1551 2913 +3075 1861 2871 +3023 2091 2805 +2941 2285 2701 +2801 2459 2507 +2501 2621 1945 +0 2773 0 +0 2919 0 +0 3061 0 +0 3201 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3333 0 3151 +3333 0 3151 +3333 0 3151 +3331 0 3149 +3329 0 3147 +3327 0 3145 +3325 0 3141 +3321 0 3137 +3315 0 3131 +3309 0 3123 +3299 0 3111 +3287 0 3097 +3269 1083 3075 +3243 1682 3045 +3207 1993 3003 +3155 2223 2937 +3073 2417 2833 +2933 2591 2639 +2633 2753 2075 +0 2905 0 +0 3051 0 +0 3193 0 +0 3333 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3283 +3465 0 3283 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3273 +3453 0 3269 +3447 0 3263 +3441 0 3255 +3431 0 3243 +3419 0 3229 +3401 1213 3207 +3375 1814 3177 +3339 2125 3135 +3287 2355 3069 +3205 2549 2965 +3065 2723 2771 +2765 2885 2207 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4009 0 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3417 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3405 +3585 0 3401 +3579 0 3395 +3573 0 3387 +3563 0 3377 +3551 0 3361 +3533 1344 3339 +3507 1946 3309 +3471 2257 3267 +3419 2487 3201 +3337 2681 3097 +3197 2855 2903 +2897 3017 2337 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3711 0 3527 +3705 0 3519 +3695 0 3509 +3683 0 3493 +3665 1475 3471 +3639 2077 3441 +3603 2389 3399 +3551 2619 3333 +3469 2813 3229 +3329 2987 3035 +3029 3149 2469 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3857 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1606 3603 +3771 2209 3573 +3735 2521 3531 +3683 2751 3465 +3601 2947 3361 +3461 3119 3167 +3161 3281 2601 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3987 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1738 3735 +3903 2341 3707 +3867 2653 3663 +3815 2883 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2733 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4091 0 3905 +4079 0 3889 +4061 1870 3869 +4035 2473 3839 +3999 2785 3795 +3947 3017 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2863 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4065 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2002 4001 +4095 2605 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3515 3563 +3557 3677 2995 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2133 4095 +4095 2737 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3127 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2265 4095 +4095 2869 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3259 +73 0 245 +0 93 78 +0 216 0 +0 340 0 +0 467 0 +0 595 0 +0 724 0 +0 853 0 +0 984 0 +0 1114 0 +0 1245 0 +0 1377 0 +0 1508 0 +0 1640 0 +0 1772 0 +0 1904 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +324 0 378 +139 77 259 +0 203 27 +0 331 0 +0 460 0 +0 589 0 +0 719 0 +0 850 0 +0 981 0 +0 1112 0 +0 1244 0 +0 1376 0 +0 1507 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +528 0 510 +420 54 424 +215 186 277 +0 318 0 +0 450 0 +0 582 0 +0 714 0 +0 846 0 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +708 0 642 +638 21 580 +522 162 481 +300 300 300 +0 437 0 +0 572 0 +0 707 0 +0 841 0 +0 974 0 +0 1107 0 +0 1240 0 +0 1373 0 +0 1505 0 +0 1638 0 +0 1770 0 +0 1902 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +873 0 775 +825 0 729 +752 127 659 +631 275 546 +393 418 329 +0 558 0 +0 696 0 +0 833 0 +0 968 0 +0 1103 0 +0 1237 0 +0 1370 0 +0 1503 0 +0 1636 0 +0 1769 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1028 0 907 +994 0 873 +945 77 824 +870 239 748 +745 392 621 +494 539 365 +0 683 0 +0 823 0 +0 961 0 +0 1097 0 +0 1233 0 +0 1367 0 +0 1501 0 +0 1635 0 +0 1768 0 +0 1901 0 +0 2033 0 +0 2165 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1176 0 1039 +1152 0 1014 +1118 0 979 +1068 186 926 +991 355 844 +863 513 705 +601 663 410 +0 809 0 +0 951 0 +0 1090 0 +0 1227 0 +0 1363 0 +0 1498 0 +0 1632 0 +0 1766 0 +0 1899 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1320 0 1171 +1303 0 1153 +1279 0 1127 +1244 103 1089 +1193 300 1034 +1115 475 948 +984 636 798 +714 789 463 +0 936 0 +0 1079 0 +0 1219 0 +0 1357 0 +0 1494 0 +0 1629 0 +0 1764 0 +0 1898 0 +0 2031 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1461 0 1304 +1448 0 1290 +1431 0 1271 +1406 0 1244 +1371 214 1205 +1320 418 1147 +1241 597 1057 +1108 762 898 +831 917 526 +0 1065 0 +0 1209 0 +0 1350 0 +0 1488 0 +0 1625 0 +0 1760 0 +0 1895 0 +0 2029 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1599 0 1436 +1590 0 1426 +1577 0 1411 +1560 0 1392 +1535 65 1364 +1500 329 1324 +1448 539 1265 +1368 722 1171 +1233 889 1005 +952 1045 598 +0 1194 0 +0 1339 0 +0 1480 0 +0 1619 0 +0 1756 0 +0 1892 0 +0 2027 0 +0 2161 0 +0 2295 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1736 0 1568 +1729 0 1560 +1720 0 1550 +1707 0 1535 +1690 0 1515 +1665 174 1487 +1630 448 1447 +1578 663 1386 +1497 849 1289 +1361 1017 1117 +1074 1174 680 +0 1325 0 +0 1470 0 +0 1611 0 +0 1751 0 +0 1888 0 +0 2024 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1872 0 1700 +1867 0 1694 +1860 0 1687 +1851 0 1676 +1838 0 1661 +1820 0 1641 +1795 287 1613 +1760 570 1571 +1707 789 1510 +1627 977 1411 +1489 1146 1233 +1200 1304 770 +0 1455 0 +0 1601 0 +0 1743 0 +0 1882 0 +0 2020 0 +0 2155 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2007 0 1832 +2003 0 1828 +1998 0 1822 +1991 0 1814 +1982 0 1804 +1969 0 1789 +1951 0 1768 +1926 405 1740 +1890 694 1698 +1838 916 1635 +1757 1105 1535 +1619 1276 1354 +1327 1435 868 +0 1586 0 +0 1732 0 +0 1874 0 +0 2014 0 +0 2151 0 +0 2287 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2141 0 1964 +2137 0 1961 +2135 0 1957 +2129 0 1951 +2123 0 1943 +2113 0 1932 +2099 0 1918 +2083 6 1897 +2057 526 1868 +2021 821 1826 +1969 1045 1762 +1887 1235 1661 +1749 1407 1477 +1455 1566 973 +0 1718 0 +0 1864 0 +0 2006 0 +0 2145 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2275 0 2097 +2273 0 2095 +2269 0 2091 +2265 0 2087 +2261 0 2081 +2253 0 2073 +2245 0 2063 +2231 0 2047 +2213 111 2026 +2189 650 1997 +2153 948 1955 +2099 1174 1891 +2018 1366 1789 +1879 1538 1602 +1584 1697 1083 +0 1849 0 +0 1995 0 +0 2137 0 +0 2277 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2407 0 2229 +2405 0 2227 +2403 0 2225 +2401 0 2221 +2397 0 2217 +2393 0 2211 +2385 0 2203 +2375 0 2193 +2363 0 2177 +2345 221 2157 +2319 775 2127 +2285 1077 2085 +2231 1304 2020 +2149 1496 1917 +2010 1669 1729 +1714 1829 1199 +0 1981 0 +0 2127 0 +0 2269 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2541 0 2361 +2539 0 2359 +2537 0 2357 +2535 0 2355 +2533 0 2353 +2529 0 2347 +2523 0 2341 +2517 0 2333 +2507 0 2323 +2495 0 2307 +2477 337 2287 +2451 903 2257 +2415 1207 2215 +2363 1435 2151 +2281 1628 2047 +2141 1800 1857 +1845 1961 1318 +0 2113 0 +0 2259 0 +0 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2673 0 2493 +2673 0 2493 +2671 0 2491 +2669 0 2489 +2667 0 2487 +2665 0 2483 +2661 0 2479 +2655 0 2473 +2649 0 2465 +2639 0 2453 +2627 0 2439 +2609 456 2417 +2583 1031 2389 +2547 1337 2345 +2495 1566 2281 +2413 1759 2177 +2273 1932 1986 +1976 2093 1440 +0 2245 0 +0 2391 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2805 0 2625 +2805 0 2625 +2805 0 2623 +2803 0 2623 +2801 0 2621 +2799 0 2617 +2797 0 2615 +2793 0 2611 +2787 0 2605 +2781 0 2597 +2771 0 2585 +2759 0 2571 +2741 578 2549 +2715 1160 2519 +2679 1468 2477 +2627 1697 2411 +2545 1891 2307 +2405 2063 2115 +2107 2225 1565 +0 2377 0 +0 2523 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2757 +2937 0 2757 +2937 0 2755 +2937 0 2755 +2935 0 2753 +2933 0 2751 +2931 0 2749 +2929 0 2747 +2925 0 2741 +2919 0 2735 +2913 0 2727 +2903 0 2717 +2891 0 2701 +2873 703 2681 +2847 1290 2651 +2811 1599 2607 +2759 1829 2543 +2677 2022 2439 +2537 2195 2247 +2239 2357 1691 +0 2509 0 +0 2655 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2889 +3071 0 2889 +3069 0 2889 +3069 0 2887 +3069 0 2887 +3067 0 2885 +3065 0 2883 +3063 0 2881 +3061 0 2877 +3057 0 2873 +3051 0 2867 +3045 0 2859 +3035 0 2849 +3023 0 2833 +3005 829 2813 +2979 1421 2783 +2943 1730 2739 +2891 1960 2675 +2809 2155 2569 +2669 2327 2377 +2369 2489 1819 +0 2641 0 +0 2787 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3021 +3203 0 3021 +3203 0 3021 +3201 0 3021 +3201 0 3019 +3201 0 3019 +3199 0 3017 +3197 0 3015 +3195 0 3013 +3193 0 3009 +3189 0 3005 +3183 0 2999 +3177 0 2991 +3167 0 2981 +3155 0 2965 +3137 957 2945 +3111 1552 2915 +3075 1862 2871 +3023 2093 2807 +2941 2285 2701 +2801 2459 2509 +2501 2621 1948 +0 2773 0 +0 2919 0 +0 3061 0 +0 3201 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3333 0 3153 +3333 0 3151 +3333 0 3151 +3331 0 3149 +3329 0 3147 +3327 0 3145 +3325 0 3141 +3321 0 3137 +3315 0 3131 +3309 0 3123 +3299 0 3113 +3287 0 3097 +3269 1085 3075 +3243 1683 3047 +3207 1993 3003 +3155 2223 2937 +3073 2417 2833 +2933 2591 2639 +2633 2753 2077 +0 2905 0 +0 3051 0 +0 3195 0 +0 3333 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3285 +3465 0 3283 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3273 +3453 0 3269 +3447 0 3263 +3441 0 3255 +3431 0 3245 +3419 0 3229 +3401 1215 3207 +3375 1815 3179 +3339 2125 3135 +3287 2355 3069 +3205 2549 2965 +3065 2723 2771 +2765 2885 2207 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4011 0 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3417 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3405 +3585 0 3401 +3579 0 3395 +3573 0 3387 +3563 0 3377 +3551 0 3361 +3533 1345 3339 +3507 1946 3309 +3471 2257 3267 +3419 2487 3201 +3337 2681 3097 +3197 2855 2903 +2897 3017 2339 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3731 0 3551 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3713 0 3527 +3705 0 3519 +3695 0 3509 +3683 0 3493 +3665 1476 3471 +3639 2077 3441 +3603 2389 3399 +3551 2619 3333 +3469 2815 3229 +3329 2987 3035 +3029 3149 2469 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3857 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1607 3603 +3771 2209 3575 +3735 2521 3531 +3683 2751 3465 +3601 2947 3361 +3461 3119 3167 +3161 3281 2601 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3987 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1739 3735 +3903 2341 3707 +3867 2653 3663 +3815 2883 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2733 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4091 0 3905 +4079 0 3889 +4061 1870 3869 +4035 2473 3839 +3999 2785 3795 +3947 3017 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2865 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4065 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2002 4001 +4095 2605 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3515 3563 +3557 3677 2997 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2133 4095 +4095 2737 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3127 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2265 4095 +4095 2869 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3259 +148 10 366 +0 122 244 +0 237 2 +0 357 0 +0 479 0 +0 604 0 +0 731 0 +0 859 0 +0 988 0 +0 1117 0 +0 1247 0 +0 1378 0 +0 1509 0 +0 1641 0 +0 1772 0 +0 1904 0 +0 2036 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +369 0 471 +205 106 377 +0 225 210 +0 348 0 +0 473 0 +0 599 0 +0 727 0 +0 856 0 +0 985 0 +0 1115 0 +0 1246 0 +0 1377 0 +0 1509 0 +0 1640 0 +0 1772 0 +0 1904 0 +0 2036 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +558 0 582 +456 85 510 +271 209 391 +0 335 159 +0 463 0 +0 592 0 +0 721 0 +0 852 0 +0 982 0 +0 1113 0 +0 1245 0 +0 1376 0 +0 1508 0 +0 1640 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +728 0 697 +661 54 642 +552 186 556 +347 318 409 +0 450 82 +0 582 0 +0 714 0 +0 846 0 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +887 0 816 +840 10 775 +770 153 712 +654 294 613 +432 432 432 +0 569 0 +0 704 0 +0 839 0 +0 973 0 +0 1106 0 +0 1239 0 +0 1372 0 +0 1505 0 +0 1637 0 +0 1770 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1037 0 938 +1005 0 907 +957 106 861 +884 259 792 +763 407 678 +525 550 461 +0 690 0 +0 829 0 +0 965 0 +0 1100 0 +0 1235 0 +0 1369 0 +0 1502 0 +0 1636 0 +0 1768 0 +0 1901 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1183 0 1063 +1160 0 1039 +1126 33 1005 +1077 209 956 +1002 371 880 +877 524 753 +626 672 498 +0 815 0 +0 955 0 +0 1093 0 +0 1229 0 +0 1365 0 +0 1499 0 +0 1633 0 +0 1767 0 +0 1900 0 +0 2033 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1325 0 1189 +1308 0 1171 +1284 0 1146 +1250 131 1110 +1200 318 1058 +1123 487 976 +995 645 837 +734 795 542 +0 941 0 +0 1082 0 +0 1222 0 +0 1359 0 +0 1495 0 +0 1630 0 +0 1764 0 +0 1898 0 +0 2031 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1465 0 1317 +1452 0 1304 +1435 0 1285 +1411 0 1259 +1376 236 1221 +1325 432 1166 +1247 607 1079 +1116 768 930 +846 921 595 +0 1068 0 +0 1211 0 +0 1351 0 +0 1489 0 +0 1626 0 +0 1761 0 +0 1896 0 +0 2030 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1602 0 1446 +1593 0 1436 +1580 0 1422 +1563 0 1403 +1538 95 1376 +1504 346 1337 +1452 550 1279 +1373 729 1189 +1240 894 1030 +963 1048 658 +0 1197 0 +0 1341 0 +0 1482 0 +0 1620 0 +0 1757 0 +0 1893 0 +0 2027 0 +0 2161 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1738 0 1575 +1732 0 1568 +1722 0 1558 +1710 0 1544 +1692 0 1524 +1667 198 1496 +1632 461 1456 +1580 671 1397 +1501 854 1303 +1366 1021 1137 +1083 1177 730 +0 1327 0 +0 1471 0 +0 1612 0 +0 1751 0 +0 1888 0 +0 2024 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1873 0 1706 +1868 0 1700 +1862 0 1692 +1852 0 1682 +1839 0 1668 +1822 0 1648 +1797 306 1619 +1762 580 1579 +1710 795 1518 +1629 981 1422 +1493 1149 1249 +1207 1307 812 +0 1457 0 +0 1602 0 +0 1744 0 +0 1883 0 +0 2020 0 +0 2155 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2008 0 1837 +2004 0 1832 +1999 0 1827 +1992 0 1819 +1983 0 1808 +1970 0 1794 +1952 0 1773 +1927 419 1745 +1892 702 1703 +1840 921 1642 +1759 1109 1543 +1621 1278 1366 +1332 1437 902 +0 1587 0 +0 1733 0 +0 1875 0 +0 2014 0 +0 2151 0 +0 2287 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2141 0 1968 +2139 0 1964 +2135 0 1960 +2129 0 1954 +2123 0 1947 +2113 0 1936 +2101 0 1921 +2083 39 1901 +2059 537 1872 +2022 826 1830 +1970 1048 1767 +1889 1238 1667 +1751 1408 1486 +1459 1567 1000 +0 1718 0 +0 1864 0 +0 2006 0 +0 2145 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2275 0 2099 +2273 0 2097 +2271 0 2093 +2267 0 2089 +2261 0 2083 +2255 0 2075 +2245 0 2065 +2231 0 2049 +2215 138 2029 +2189 658 2000 +2153 953 1958 +2101 1177 1895 +2019 1367 1793 +1881 1539 1609 +1587 1698 1105 +0 1850 0 +0 1996 0 +0 2139 0 +0 2277 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2407 0 2231 +2407 0 2229 +2405 0 2227 +2401 0 2223 +2397 0 2219 +2393 0 2213 +2385 0 2205 +2377 0 2195 +2363 0 2179 +2345 243 2159 +2321 782 2129 +2285 1080 2087 +2233 1306 2023 +2151 1498 1921 +2012 1670 1734 +1716 1830 1216 +0 1981 0 +0 2127 0 +0 2269 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2541 0 2363 +2539 0 2361 +2539 0 2359 +2535 0 2357 +2533 0 2353 +2529 0 2349 +2525 0 2343 +2517 0 2335 +2507 0 2325 +2495 0 2309 +2477 353 2289 +2453 908 2259 +2417 1209 2217 +2363 1436 2153 +2281 1629 2049 +2143 1801 1861 +1846 1961 1331 +0 2113 0 +0 2259 0 +0 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2673 0 2493 +2673 0 2493 +2671 0 2491 +2669 0 2489 +2667 0 2487 +2665 0 2485 +2661 0 2479 +2657 0 2475 +2649 0 2465 +2639 0 2455 +2627 0 2441 +2609 469 2419 +2583 1035 2389 +2547 1339 2347 +2495 1567 2283 +2413 1760 2179 +2273 1932 1989 +1977 2093 1450 +0 2245 0 +0 2391 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2805 0 2625 +2805 0 2625 +2805 0 2625 +2803 0 2623 +2801 0 2621 +2799 0 2619 +2797 0 2615 +2793 0 2611 +2787 0 2605 +2781 0 2597 +2771 0 2587 +2759 0 2571 +2741 588 2551 +2715 1163 2521 +2679 1469 2477 +2627 1698 2413 +2545 1891 2309 +2405 2065 2117 +2107 2225 1572 +0 2377 0 +0 2523 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2757 +2937 0 2757 +2937 0 2757 +2937 0 2755 +2935 0 2755 +2933 0 2753 +2931 0 2749 +2929 0 2747 +2925 0 2743 +2919 0 2737 +2913 0 2729 +2903 0 2717 +2891 0 2703 +2873 710 2681 +2847 1292 2651 +2811 1600 2609 +2759 1829 2543 +2677 2023 2439 +2537 2195 2247 +2239 2357 1697 +0 2509 0 +0 2655 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2889 +3071 0 2889 +3069 0 2889 +3069 0 2889 +3069 0 2887 +3067 0 2885 +3065 0 2883 +3063 0 2881 +3061 0 2879 +3057 0 2873 +3051 0 2869 +3045 0 2859 +3035 0 2849 +3023 0 2833 +3005 835 2813 +2979 1422 2783 +2943 1731 2739 +2891 1961 2675 +2809 2155 2571 +2669 2327 2379 +2371 2489 1823 +0 2641 0 +0 2787 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3021 +3203 0 3021 +3203 0 3021 +3201 0 3021 +3201 0 3019 +3201 0 3019 +3199 0 3017 +3197 0 3015 +3195 0 3013 +3193 0 3011 +3189 0 3005 +3183 0 2999 +3177 0 2991 +3167 0 2981 +3155 0 2965 +3137 961 2945 +3111 1553 2915 +3075 1862 2871 +3023 2093 2807 +2941 2287 2703 +2801 2459 2509 +2501 2621 1951 +0 2773 0 +0 2919 0 +0 3061 0 +0 3201 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3333 0 3153 +3333 0 3151 +3333 0 3151 +3331 0 3149 +3329 0 3147 +3327 0 3145 +3325 0 3141 +3321 0 3137 +3315 0 3131 +3309 0 3123 +3299 0 3113 +3287 0 3097 +3269 1089 3077 +3243 1684 3047 +3207 1994 3003 +3155 2225 2939 +3073 2419 2833 +2933 2591 2641 +2633 2753 2081 +0 2905 0 +0 3051 0 +0 3195 0 +0 3333 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3285 +3465 0 3283 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3273 +3453 0 3269 +3447 0 3263 +3441 0 3255 +3431 0 3245 +3419 0 3229 +3401 1218 3209 +3375 1815 3179 +3339 2125 3135 +3287 2357 3069 +3205 2551 2965 +3065 2723 2771 +2765 2885 2209 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4011 0 +3599 0 3419 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3405 +3585 0 3401 +3579 0 3395 +3573 0 3387 +3563 0 3377 +3551 0 3361 +3533 1347 3339 +3507 1947 3311 +3471 2257 3267 +3419 2487 3201 +3337 2683 3097 +3197 2855 2903 +2897 3017 2339 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3731 0 3551 +3731 0 3551 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3713 0 3527 +3705 0 3519 +3695 0 3509 +3683 0 3493 +3665 1478 3471 +3639 2079 3443 +3603 2389 3399 +3551 2619 3333 +3469 2815 3229 +3329 2987 3035 +3029 3149 2471 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3857 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1608 3603 +3771 2211 3575 +3735 2521 3531 +3683 2751 3465 +3601 2947 3361 +3461 3119 3167 +3161 3281 2601 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3987 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1739 3737 +3903 2341 3707 +3867 2653 3663 +3815 2885 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2733 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4091 0 3905 +4079 0 3889 +4061 1871 3869 +4035 2473 3839 +3999 2785 3795 +3947 3017 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2865 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4065 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2002 4001 +4095 2605 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3515 3563 +3557 3677 2997 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2133 4095 +4095 2737 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3129 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2265 4095 +4095 2869 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3261 +232 55 490 +0 157 400 +0 265 243 +0 378 0 +0 496 0 +0 617 0 +0 740 0 +0 866 0 +0 993 0 +0 1121 0 +0 1251 0 +0 1381 0 +0 1511 0 +0 1642 0 +0 1773 0 +0 1905 0 +0 2036 0 +0 2169 0 +0 2301 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +422 37 572 +280 142 498 +0 254 376 +0 369 134 +0 489 0 +0 611 0 +0 736 0 +0 863 0 +0 991 0 +0 1120 0 +0 1249 0 +0 1380 0 +0 1510 0 +0 1642 0 +0 1773 0 +0 1904 0 +0 2036 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +594 12 663 +501 123 603 +337 238 509 +0 358 342 +0 480 0 +0 605 0 +0 731 0 +0 859 0 +0 988 0 +0 1117 0 +0 1248 0 +0 1378 0 +0 1509 0 +0 1641 0 +0 1772 0 +0 1904 0 +0 2036 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +753 0 761 +690 95 714 +588 217 642 +403 341 523 +0 467 291 +0 595 0 +0 724 0 +0 853 0 +0 984 0 +0 1114 0 +0 1245 0 +0 1377 0 +0 1508 0 +0 1640 0 +0 1772 0 +0 1904 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +905 0 866 +860 54 829 +793 186 774 +684 318 689 +479 450 541 +0 582 214 +0 714 0 +0 846 0 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1050 0 977 +1019 0 948 +972 142 907 +902 286 844 +786 426 745 +564 564 564 +0 701 84 +0 836 0 +0 971 0 +0 1105 0 +0 1238 0 +0 1371 0 +0 1504 0 +0 1637 0 +0 1769 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1193 0 1093 +1170 0 1070 +1137 76 1039 +1089 238 993 +1016 392 924 +895 539 810 +658 682 593 +0 823 0 +0 961 0 +0 1097 0 +0 1232 0 +0 1367 0 +0 1501 0 +0 1635 0 +0 1768 0 +0 1901 0 +0 2033 0 +0 2165 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1332 0 1212 +1315 0 1195 +1292 0 1171 +1258 165 1137 +1209 341 1088 +1134 503 1012 +1009 656 885 +758 804 630 +0 947 0 +0 1087 0 +0 1225 0 +0 1361 0 +0 1497 0 +0 1631 0 +0 1765 0 +0 1899 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1470 0 1334 +1457 0 1321 +1440 0 1303 +1416 46 1278 +1382 263 1243 +1332 450 1190 +1255 619 1108 +1127 777 970 +866 928 674 +0 1073 0 +0 1215 0 +0 1354 0 +0 1491 0 +0 1627 0 +0 1762 0 +0 1896 0 +0 2030 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1606 0 1459 +1597 0 1449 +1584 0 1436 +1567 0 1417 +1543 132 1391 +1508 368 1354 +1458 564 1298 +1379 739 1212 +1248 900 1062 +978 1053 727 +0 1200 0 +0 1343 0 +0 1484 0 +0 1622 0 +0 1758 0 +0 1893 0 +0 2028 0 +0 2161 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1741 0 1585 +1734 0 1578 +1725 0 1568 +1713 0 1554 +1695 0 1535 +1671 227 1508 +1636 478 1469 +1584 682 1412 +1505 861 1321 +1372 1026 1162 +1095 1181 790 +0 1329 0 +0 1473 0 +0 1614 0 +0 1752 0 +0 1889 0 +0 2025 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1876 0 1713 +1871 0 1708 +1864 0 1700 +1854 0 1690 +1842 0 1676 +1824 0 1656 +1799 330 1628 +1764 593 1589 +1713 803 1529 +1633 986 1435 +1498 1153 1269 +1216 1309 862 +0 1459 0 +0 1603 0 +0 1745 0 +0 1883 0 +0 2021 0 +0 2157 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2009 0 1842 +2006 0 1838 +2001 0 1832 +1994 0 1825 +1984 0 1814 +1972 0 1800 +1954 0 1780 +1929 438 1752 +1894 712 1711 +1842 927 1650 +1761 1113 1554 +1625 1281 1381 +1339 1439 944 +0 1589 0 +0 1734 0 +0 1876 0 +0 2015 0 +0 2153 0 +0 2289 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2143 0 1972 +2139 0 1969 +2137 0 1964 +2131 0 1959 +2125 0 1951 +2115 0 1940 +2103 0 1926 +2085 81 1905 +2059 551 1877 +2024 834 1836 +1972 1053 1774 +1891 1241 1675 +1754 1410 1498 +1464 1569 1034 +0 1720 0 +0 1865 0 +0 2007 0 +0 2147 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2275 0 2103 +2273 0 2099 +2271 0 2097 +2267 0 2093 +2263 0 2087 +2255 0 2079 +2245 0 2067 +2233 0 2053 +2215 172 2033 +2191 669 2004 +2155 959 1962 +2103 1180 1899 +2021 1370 1799 +1883 1540 1618 +1591 1699 1132 +0 1851 0 +0 1996 0 +0 2139 0 +0 2279 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2409 0 2233 +2407 0 2231 +2405 0 2229 +2403 0 2225 +2399 0 2221 +2393 0 2215 +2387 0 2207 +2377 0 2197 +2365 0 2181 +2347 270 2161 +2321 790 2133 +2285 1085 2089 +2233 1309 2027 +2151 1500 1925 +2013 1671 1741 +1719 1830 1237 +0 1982 0 +0 2127 0 +0 2271 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2541 0 2363 +2541 0 2363 +2539 0 2361 +2537 0 2359 +2533 0 2355 +2529 0 2351 +2525 0 2345 +2517 0 2337 +2509 0 2327 +2495 0 2311 +2477 375 2291 +2453 914 2261 +2417 1212 2219 +2365 1438 2155 +2283 1630 2053 +2143 1802 1866 +1849 1962 1348 +0 2113 0 +0 2259 0 +0 2403 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2673 0 2495 +2673 0 2495 +2671 0 2493 +2671 0 2491 +2669 0 2489 +2665 0 2485 +2661 0 2481 +2657 0 2475 +2649 0 2467 +2641 0 2457 +2627 0 2441 +2609 485 2421 +2585 1039 2391 +2549 1341 2349 +2495 1569 2285 +2413 1761 2181 +2275 1933 1993 +1978 2093 1463 +0 2245 0 +0 2391 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2807 0 2627 +2805 0 2627 +2805 0 2625 +2803 0 2623 +2801 0 2623 +2799 0 2619 +2797 0 2617 +2793 0 2613 +2789 0 2607 +2781 0 2599 +2771 0 2587 +2759 0 2573 +2741 601 2551 +2715 1167 2521 +2681 1471 2479 +2627 1699 2415 +2545 1892 2311 +2405 2065 2121 +2109 2225 1582 +0 2377 0 +0 2523 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2759 +2939 0 2759 +2937 0 2757 +2937 0 2757 +2935 0 2755 +2933 0 2753 +2931 0 2751 +2929 0 2747 +2925 0 2743 +2919 0 2737 +2913 0 2729 +2903 0 2719 +2891 0 2703 +2873 720 2683 +2847 1295 2653 +2811 1601 2609 +2759 1830 2545 +2677 2023 2441 +2537 2197 2251 +2239 2357 1705 +0 2509 0 +0 2655 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2891 +3071 0 2889 +3069 0 2889 +3069 0 2889 +3069 0 2887 +3067 0 2887 +3065 0 2885 +3063 0 2883 +3061 0 2879 +3057 0 2875 +3051 0 2869 +3045 0 2861 +3035 0 2849 +3023 0 2835 +3005 842 2813 +2979 1425 2783 +2943 1732 2741 +2891 1961 2675 +2809 2155 2571 +2669 2327 2379 +2371 2489 1829 +0 2641 0 +0 2787 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3023 +3203 0 3021 +3203 0 3021 +3201 0 3021 +3201 0 3021 +3201 0 3019 +3199 0 3017 +3197 0 3017 +3195 0 3013 +3193 0 3011 +3189 0 3007 +3183 0 3001 +3177 0 2993 +3167 0 2981 +3155 0 2965 +3137 967 2945 +3111 1555 2915 +3075 1863 2873 +3023 2093 2807 +2941 2287 2703 +2801 2459 2511 +2503 2621 1956 +0 2773 0 +0 2919 0 +0 3063 0 +0 3201 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3155 +3335 0 3153 +3335 0 3153 +3335 0 3153 +3333 0 3153 +3333 0 3151 +3333 0 3151 +3331 0 3149 +3329 0 3147 +3327 0 3145 +3325 0 3143 +3321 0 3137 +3315 0 3131 +3309 0 3123 +3299 0 3113 +3287 0 3097 +3269 1093 3077 +3243 1685 3047 +3207 1994 3003 +3155 2225 2939 +3073 2419 2835 +2933 2591 2641 +2635 2753 2083 +0 2905 0 +0 3051 0 +0 3195 0 +0 3333 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3287 +3467 0 3287 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3285 +3465 0 3283 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3273 +3453 0 3269 +3447 0 3263 +3441 0 3255 +3431 0 3245 +3419 0 3229 +3401 1221 3209 +3375 1816 3179 +3339 2125 3135 +3287 2357 3071 +3205 2551 2965 +3065 2723 2773 +2765 2885 2213 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4011 0 +3599 0 3419 +3599 0 3419 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3405 +3585 0 3401 +3581 0 3395 +3573 0 3387 +3563 0 3377 +3551 0 3361 +3533 1350 3341 +3507 1947 3311 +3471 2257 3267 +3419 2489 3203 +3337 2683 3097 +3197 2855 2903 +2897 3017 2341 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3713 0 3527 +3705 0 3519 +3695 0 3509 +3683 0 3493 +3665 1479 3473 +3639 2079 3443 +3603 2389 3399 +3551 2621 3333 +3469 2815 3229 +3329 2987 3035 +3029 3149 2473 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3859 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1610 3605 +3771 2211 3575 +3735 2521 3531 +3683 2753 3465 +3601 2947 3361 +3461 3119 3167 +3161 3281 2603 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3989 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1740 3737 +3903 2343 3707 +3867 2653 3663 +3815 2885 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2733 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4091 0 3905 +4079 0 3889 +4061 1872 3869 +4035 2475 3839 +3999 2785 3795 +3947 3017 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2865 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4065 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2003 4001 +4095 2607 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3517 3563 +3557 3677 2997 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2135 4095 +4095 2737 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3129 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2267 4095 +4095 2869 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3261 +325 108 616 +140 200 549 +0 299 442 +0 405 242 +0 517 0 +0 633 0 +0 753 0 +0 875 0 +0 1000 0 +0 1127 0 +0 1255 0 +0 1384 0 +0 1513 0 +0 1644 0 +0 1775 0 +0 1906 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +486 92 679 +364 187 622 +125 289 532 +0 397 375 +0 510 9 +0 628 0 +0 749 0 +0 872 0 +0 998 0 +0 1125 0 +0 1253 0 +0 1383 0 +0 1513 0 +0 1643 0 +0 1774 0 +0 1905 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +638 70 752 +554 169 704 +412 274 630 +103 386 508 +0 502 267 +0 621 0 +0 744 0 +0 868 0 +0 995 0 +0 1123 0 +0 1252 0 +0 1381 0 +0 1512 0 +0 1643 0 +0 1774 0 +0 1905 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +785 38 835 +726 144 795 +633 255 735 +469 370 641 +73 490 474 +0 612 63 +0 737 0 +0 863 0 +0 991 0 +0 1120 0 +0 1249 0 +0 1380 0 +0 1510 0 +0 1642 0 +0 1773 0 +0 1905 0 +0 2036 0 +0 2169 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +927 0 926 +885 108 893 +822 227 846 +720 349 774 +535 473 655 +29 599 424 +0 727 0 +0 856 0 +0 986 0 +0 1116 0 +0 1246 0 +0 1377 0 +0 1509 0 +0 1640 0 +0 1772 0 +0 1904 0 +0 2036 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1067 0 1024 +1036 55 998 +992 187 961 +925 318 906 +816 450 821 +611 582 673 +0 714 346 +0 846 0 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1205 0 1129 +1182 0 1109 +1151 127 1080 +1104 274 1039 +1034 418 976 +919 558 877 +696 696 696 +0 833 216 +0 968 0 +0 1103 0 +0 1237 0 +0 1370 0 +0 1503 0 +0 1636 0 +0 1769 0 +0 1902 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1341 0 1241 +1325 0 1225 +1302 31 1202 +1269 208 1171 +1221 370 1125 +1148 524 1056 +1027 671 942 +790 814 725 +0 955 0 +0 1093 0 +0 1229 0 +0 1365 0 +0 1499 0 +0 1633 0 +0 1767 0 +0 1900 0 +0 2033 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1477 0 1356 +1464 0 1344 +1447 0 1327 +1424 100 1303 +1390 297 1269 +1341 473 1220 +1266 635 1144 +1141 788 1017 +891 936 762 +0 1079 0 +0 1219 0 +0 1357 0 +0 1494 0 +0 1629 0 +0 1764 0 +0 1897 0 +0 2031 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1611 0 1476 +1602 0 1466 +1590 0 1453 +1572 0 1436 +1549 178 1411 +1514 395 1375 +1464 582 1322 +1388 751 1240 +1259 909 1101 +998 1059 806 +0 1205 0 +0 1347 0 +0 1486 0 +0 1623 0 +0 1759 0 +0 1894 0 +0 2029 0 +0 2163 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1745 0 1598 +1738 0 1591 +1729 0 1581 +1716 0 1568 +1699 0 1549 +1675 264 1523 +1640 500 1486 +1590 696 1430 +1511 871 1344 +1380 1032 1194 +1110 1185 859 +0 1332 0 +0 1476 0 +0 1616 0 +0 1754 0 +0 1890 0 +0 2025 0 +0 2161 0 +0 2293 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1878 0 1723 +1873 0 1717 +1867 0 1710 +1857 0 1700 +1845 0 1686 +1827 0 1667 +1803 359 1640 +1768 610 1601 +1717 814 1544 +1637 994 1453 +1504 1158 1294 +1227 1313 922 +0 1461 0 +0 1605 0 +0 1746 0 +0 1884 0 +0 2021 0 +0 2157 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2011 0 1849 +2008 0 1845 +2003 0 1840 +1996 0 1832 +1987 0 1822 +1974 0 1808 +1956 59 1788 +1932 462 1761 +1896 725 1721 +1845 936 1661 +1765 1118 1568 +1630 1285 1401 +1348 1441 994 +0 1591 0 +0 1735 0 +0 1877 0 +0 2016 0 +0 2153 0 +0 2289 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2145 0 1977 +2141 0 1974 +2137 0 1970 +2133 0 1964 +2125 0 1957 +2117 0 1946 +2103 0 1932 +2087 132 1912 +2061 570 1884 +2026 844 1843 +1974 1059 1782 +1893 1245 1686 +1757 1413 1513 +1471 1571 1076 +0 1721 0 +0 1866 0 +0 2008 0 +0 2147 0 +0 2285 0 +0 2421 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2277 0 2107 +2275 0 2103 +2273 0 2101 +2269 0 2097 +2263 0 2091 +2257 0 2083 +2247 0 2073 +2235 0 2057 +2217 213 2038 +2191 684 2009 +2157 966 1968 +2103 1185 1906 +2023 1373 1807 +1886 1543 1630 +1596 1701 1166 +0 1852 0 +0 1997 0 +0 2139 0 +0 2279 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2409 0 2235 +2407 0 2235 +2405 0 2231 +2403 0 2229 +2399 0 2225 +2395 0 2219 +2387 0 2211 +2377 0 2201 +2365 0 2185 +2347 304 2165 +2323 801 2135 +2287 1090 2095 +2235 1313 2032 +2153 1502 1932 +2015 1673 1750 +1723 1831 1264 +0 1983 0 +0 2129 0 +0 2271 0 +0 2411 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2541 0 2367 +2541 0 2365 +2539 0 2363 +2537 0 2361 +2535 0 2357 +2531 0 2353 +2525 0 2347 +2519 0 2339 +2509 0 2329 +2497 0 2313 +2479 402 2293 +2453 922 2265 +2417 1217 2223 +2365 1441 2159 +2283 1632 2057 +2145 1803 1873 +1851 1962 1369 +0 2115 0 +0 2261 0 +0 2403 0 +0 2543 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2675 0 2497 +2673 0 2497 +2673 0 2495 +2671 0 2493 +2669 0 2491 +2665 0 2487 +2661 0 2483 +2657 0 2477 +2649 0 2469 +2641 0 2459 +2627 0 2443 +2609 507 2423 +2585 1046 2393 +2549 1345 2351 +2497 1571 2287 +2415 1762 2185 +2275 1934 1998 +1981 2093 1480 +0 2245 0 +0 2391 0 +0 2535 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2807 0 2629 +2805 0 2627 +2805 0 2627 +2803 0 2625 +2803 0 2623 +2801 0 2621 +2797 0 2617 +2793 0 2613 +2789 0 2607 +2781 0 2599 +2773 0 2589 +2759 0 2573 +2741 617 2553 +2717 1172 2523 +2681 1473 2481 +2627 1701 2417 +2545 1893 2313 +2407 2065 2125 +2111 2225 1595 +0 2377 0 +0 2523 0 +0 2667 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2759 +2939 0 2759 +2937 0 2759 +2937 0 2757 +2935 0 2755 +2935 0 2755 +2931 0 2751 +2929 0 2749 +2925 0 2745 +2921 0 2739 +2913 0 2731 +2903 0 2719 +2891 0 2705 +2873 733 2683 +2849 1299 2653 +2813 1603 2611 +2759 1831 2547 +2677 2024 2443 +2539 2197 2253 +2241 2357 1714 +0 2509 0 +0 2655 0 +0 2799 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2891 +3071 0 2891 +3071 0 2891 +3069 0 2889 +3069 0 2889 +3067 0 2887 +3065 0 2885 +3063 0 2883 +3061 0 2879 +3057 0 2875 +3053 0 2869 +3045 0 2861 +3035 0 2851 +3023 0 2835 +3005 852 2815 +2979 1427 2785 +2943 1733 2741 +2891 1962 2677 +2809 2155 2573 +2669 2329 2383 +2371 2489 1837 +0 2641 0 +0 2787 0 +0 2931 0 +0 3069 0 +0 3207 0 +0 3345 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3023 +3203 0 3023 +3203 0 3023 +3203 0 3021 +3201 0 3021 +3201 0 3019 +3199 0 3019 +3197 0 3017 +3195 0 3015 +3193 0 3011 +3189 0 3007 +3185 0 3001 +3177 0 2993 +3167 0 2981 +3155 0 2967 +3137 974 2945 +3111 1557 2915 +3075 1864 2873 +3023 2093 2809 +2941 2287 2703 +2801 2461 2513 +2503 2621 1961 +0 2773 0 +0 2919 0 +0 3063 0 +0 3201 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3335 0 3153 +3335 0 3153 +3333 0 3153 +3333 0 3151 +3331 0 3151 +3329 0 3149 +3327 0 3145 +3325 0 3143 +3321 0 3139 +3317 0 3133 +3309 0 3125 +3299 0 3113 +3287 0 3099 +3269 1099 3077 +3243 1687 3047 +3207 1995 3005 +3155 2225 2939 +3073 2419 2835 +2933 2591 2643 +2635 2753 2087 +0 2905 0 +0 3051 0 +0 3195 0 +0 3335 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3285 +3467 0 3285 +3467 0 3285 +3465 0 3285 +3465 0 3283 +3463 0 3281 +3461 0 3279 +3459 0 3277 +3457 0 3275 +3453 0 3269 +3449 0 3263 +3441 0 3255 +3431 0 3245 +3419 0 3229 +3401 1225 3209 +3375 1817 3179 +3339 2127 3135 +3287 2357 3071 +3205 2551 2967 +3065 2723 2773 +2767 2885 2215 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4011 0 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3415 +3597 0 3415 +3595 0 3413 +3593 0 3411 +3591 0 3409 +3589 0 3407 +3585 0 3401 +3581 0 3395 +3573 0 3387 +3563 0 3377 +3551 0 3361 +3533 1353 3341 +3507 1948 3311 +3471 2257 3267 +3419 2489 3203 +3337 2683 3097 +3197 2855 2905 +2897 3017 2345 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3547 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3723 0 3541 +3721 0 3537 +3717 0 3533 +3713 0 3527 +3705 0 3519 +3695 0 3509 +3683 0 3493 +3665 1482 3473 +3639 2079 3443 +3603 2389 3399 +3551 2621 3335 +3469 2815 3229 +3329 2987 3035 +3029 3149 2473 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3859 0 3675 +3855 0 3673 +3853 0 3669 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1612 3605 +3771 2211 3575 +3735 2521 3531 +3683 2753 3467 +3601 2947 3361 +3461 3119 3167 +3161 3281 2605 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3989 0 3805 +3985 0 3801 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1742 3737 +3903 2343 3707 +3867 2653 3663 +3815 2885 3597 +3733 3079 3493 +3593 3251 3299 +3293 3413 2735 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4093 0 3905 +4079 0 3889 +4061 1873 3869 +4035 2475 3839 +4001 2785 3795 +3947 3017 3729 +3865 3211 3625 +3725 3383 3431 +3425 3545 2867 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4067 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2004 4001 +4095 2607 3971 +4095 2917 3927 +4079 3149 3861 +3997 3343 3757 +3857 3517 3563 +3557 3677 2997 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2135 4095 +4095 2739 4095 +4095 3049 4059 +4095 3281 3993 +4095 3475 3889 +3989 3649 3695 +3689 3809 3129 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2267 4095 +4095 2871 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3261 +425 171 743 +284 251 694 +0 341 618 +0 439 493 +0 543 240 +0 653 0 +0 769 0 +0 887 0 +0 1009 0 +0 1134 0 +0 1260 0 +0 1388 0 +0 1516 0 +0 1646 0 +0 1776 0 +0 1907 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +558 157 792 +457 240 748 +272 332 682 +0 431 574 +0 537 374 +0 649 0 +0 765 0 +0 885 0 +0 1007 0 +0 1132 0 +0 1259 0 +0 1387 0 +0 1516 0 +0 1646 0 +0 1776 0 +0 1907 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +691 138 850 +618 224 811 +496 319 754 +257 421 664 +0 529 507 +0 642 141 +0 760 0 +0 881 0 +0 1004 0 +0 1130 0 +0 1257 0 +0 1385 0 +0 1515 0 +0 1645 0 +0 1775 0 +0 1906 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +824 111 918 +770 202 885 +687 301 836 +544 407 762 +235 518 640 +0 634 399 +0 753 0 +0 876 0 +0 1001 0 +0 1127 0 +0 1255 0 +0 1384 0 +0 1514 0 +0 1644 0 +0 1775 0 +0 1906 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +956 72 995 +917 170 967 +858 276 927 +765 387 867 +601 502 773 +205 622 606 +0 744 196 +0 869 0 +0 995 0 +0 1123 0 +0 1252 0 +0 1382 0 +0 1512 0 +0 1643 0 +0 1774 0 +0 1905 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1088 14 1080 +1059 125 1058 +1017 240 1025 +954 359 978 +852 481 906 +667 605 787 +161 732 556 +0 859 0 +0 988 0 +0 1117 0 +0 1248 0 +0 1378 0 +0 1510 0 +0 1641 0 +0 1772 0 +0 1904 0 +0 2036 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1221 0 1175 +1199 55 1156 +1169 187 1130 +1124 319 1093 +1057 450 1038 +948 582 953 +743 714 805 +94 846 478 +0 978 0 +0 1110 0 +0 1242 0 +0 1374 0 +0 1506 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1353 0 1276 +1337 0 1262 +1315 105 1241 +1283 259 1212 +1236 406 1171 +1166 550 1108 +1050 690 1009 +828 828 828 +0 965 349 +0 1100 0 +0 1235 0 +0 1369 0 +0 1502 0 +0 1636 0 +0 1768 0 +0 1901 0 +0 2034 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1485 0 1384 +1473 0 1373 +1457 0 1357 +1434 164 1335 +1401 340 1303 +1353 502 1257 +1280 656 1188 +1159 803 1074 +922 947 858 +0 1087 83 +0 1225 0 +0 1361 0 +0 1497 0 +0 1631 0 +0 1765 0 +0 1899 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1618 0 1497 +1609 0 1488 +1596 0 1476 +1580 0 1459 +1556 232 1435 +1523 430 1402 +1473 605 1352 +1398 767 1276 +1273 921 1149 +1023 1068 894 +0 1211 0 +0 1351 0 +0 1489 0 +0 1626 0 +0 1761 0 +0 1896 0 +0 2030 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1750 0 1615 +1743 0 1608 +1734 0 1598 +1722 0 1586 +1705 31 1568 +1681 310 1543 +1647 527 1507 +1597 714 1454 +1520 883 1372 +1391 1041 1234 +1130 1192 938 +0 1337 0 +0 1479 0 +0 1618 0 +0 1755 0 +0 1891 0 +0 2026 0 +0 2161 0 +0 2295 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1882 0 1736 +1877 0 1730 +1870 0 1723 +1861 0 1713 +1849 0 1700 +1831 75 1681 +1807 397 1655 +1773 632 1618 +1722 828 1562 +1644 1003 1476 +1512 1164 1326 +1242 1317 992 +0 1465 0 +0 1608 0 +0 1748 0 +0 1886 0 +0 2022 0 +0 2157 0 +0 2293 0 +0 2427 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2014 0 1859 +2010 0 1855 +2005 0 1850 +1999 0 1842 +1989 0 1832 +1977 0 1818 +1959 128 1799 +1935 492 1772 +1900 742 1733 +1849 946 1676 +1770 1125 1585 +1636 1290 1426 +1359 1445 1054 +0 1593 0 +0 1737 0 +0 1878 0 +0 2017 0 +0 2153 0 +0 2289 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2147 0 1985 +2143 0 1982 +2139 0 1977 +2135 0 1972 +2127 0 1964 +2119 0 1954 +2105 0 1940 +2089 191 1920 +2063 594 1893 +2029 857 1853 +1977 1067 1793 +1897 1250 1700 +1762 1417 1533 +1480 1573 1126 +0 1723 0 +0 1868 0 +0 2009 0 +0 2147 0 +0 2285 0 +0 2421 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2279 0 2111 +2277 0 2109 +2273 0 2107 +2269 0 2103 +2265 0 2097 +2257 0 2089 +2249 0 2079 +2235 0 2063 +2219 264 2044 +2193 702 2016 +2159 976 1975 +2107 1191 1914 +2026 1377 1818 +1889 1545 1645 +1603 1703 1208 +0 1853 0 +0 1998 0 +0 2139 0 +0 2279 0 +0 2417 0 +0 2553 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2411 0 2241 +2409 0 2239 +2407 0 2237 +2405 0 2233 +2401 0 2229 +2395 0 2223 +2389 0 2215 +2379 0 2205 +2367 0 2189 +2349 345 2169 +2323 816 2141 +2289 1098 2099 +2235 1317 2038 +2155 1505 1940 +2018 1675 1762 +1728 1833 1298 +0 1984 0 +0 2129 0 +0 2271 0 +0 2411 0 +0 2549 0 +0 2685 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2543 0 2369 +2541 0 2369 +2541 0 2367 +2537 0 2363 +2535 0 2361 +2531 0 2357 +2527 0 2351 +2519 0 2343 +2511 0 2333 +2497 0 2317 +2479 436 2297 +2455 933 2269 +2419 1223 2227 +2367 1445 2163 +2285 1634 2063 +2147 1805 1882 +1855 1964 1396 +0 2115 0 +0 2261 0 +0 2403 0 +0 2543 0 +0 2679 0 +0 2817 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2675 0 2499 +2675 0 2499 +2673 0 2497 +2671 0 2495 +2669 0 2493 +2667 0 2489 +2663 0 2485 +2657 0 2479 +2651 0 2471 +2641 0 2461 +2629 0 2447 +2611 534 2425 +2585 1054 2397 +2549 1349 2355 +2497 1573 2291 +2415 1764 2189 +2277 1935 2005 +1984 2095 1501 +0 2247 0 +0 2393 0 +0 2535 0 +0 2675 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2807 0 2629 +2807 0 2629 +2805 0 2629 +2805 0 2627 +2803 0 2625 +2801 0 2623 +2797 0 2619 +2795 0 2615 +2789 0 2609 +2783 0 2601 +2773 0 2591 +2759 0 2575 +2741 639 2555 +2717 1178 2525 +2681 1477 2483 +2629 1703 2419 +2547 1894 2317 +2407 2067 2131 +2113 2225 1612 +0 2377 0 +0 2523 0 +0 2667 0 +0 2807 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2761 +2939 0 2761 +2939 0 2759 +2937 0 2759 +2935 0 2757 +2935 0 2755 +2933 0 2753 +2929 0 2749 +2925 0 2745 +2921 0 2739 +2913 0 2731 +2905 0 2721 +2891 0 2705 +2873 750 2685 +2849 1304 2655 +2813 1605 2613 +2759 1833 2549 +2679 2025 2445 +2539 2197 2257 +2243 2357 1727 +0 2509 0 +0 2655 0 +0 2799 0 +0 2937 0 +0 3075 0 +0 3213 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2893 +3071 0 2891 +3071 0 2891 +3069 0 2891 +3069 0 2889 +3067 0 2889 +3067 0 2887 +3065 0 2883 +3061 0 2881 +3057 0 2877 +3053 0 2871 +3045 0 2863 +3037 0 2851 +3023 0 2837 +3005 865 2815 +2981 1431 2785 +2945 1735 2743 +2891 1963 2679 +2809 2157 2575 +2671 2329 2385 +2373 2489 1847 +0 2641 0 +0 2787 0 +0 2931 0 +0 3069 0 +0 3207 0 +0 3345 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3023 +3203 0 3023 +3203 0 3023 +3203 0 3023 +3201 0 3021 +3201 0 3021 +3199 0 3019 +3199 0 3017 +3195 0 3015 +3193 0 3011 +3189 0 3007 +3185 0 3001 +3177 0 2993 +3167 0 2983 +3155 0 2967 +3137 984 2947 +3111 1559 2917 +3077 1865 2873 +3023 2095 2809 +2941 2287 2705 +2801 2461 2515 +2505 2621 1969 +0 2773 0 +0 2919 0 +0 3063 0 +0 3203 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3335 0 3153 +3333 0 3153 +3333 0 3151 +3331 0 3151 +3329 0 3149 +3327 0 3147 +3325 0 3143 +3321 0 3139 +3317 0 3133 +3309 0 3125 +3299 0 3113 +3287 0 3099 +3269 1106 3077 +3243 1689 3049 +3207 1996 3005 +3155 2225 2941 +3073 2419 2837 +2933 2593 2645 +2635 2753 2093 +0 2905 0 +0 3051 0 +0 3195 0 +0 3335 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3285 +3467 0 3285 +3465 0 3285 +3465 0 3283 +3463 0 3283 +3461 0 3281 +3459 0 3277 +3457 0 3275 +3453 0 3271 +3449 0 3265 +3441 0 3257 +3431 0 3245 +3419 0 3231 +3401 1231 3209 +3375 1819 3179 +3339 2127 3137 +3287 2357 3071 +3205 2551 2967 +3065 2725 2775 +2767 2885 2219 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3603 0 +0 3741 0 +0 3875 0 +0 4011 0 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3417 +3599 0 3417 +3599 0 3417 +3597 0 3417 +3597 0 3415 +3595 0 3413 +3593 0 3413 +3591 0 3409 +3589 0 3407 +3585 0 3403 +3581 0 3397 +3573 0 3389 +3563 0 3377 +3551 0 3361 +3533 1357 3341 +3507 1949 3311 +3471 2259 3267 +3419 2489 3203 +3337 2683 3099 +3197 2855 2905 +2899 3017 2347 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3549 +3731 0 3549 +3731 0 3549 +3729 0 3549 +3729 0 3547 +3727 0 3545 +3727 0 3543 +3723 0 3541 +3721 0 3539 +3717 0 3533 +3713 0 3527 +3705 0 3519 +3695 0 3509 +3683 0 3493 +3665 1485 3473 +3639 2081 3443 +3603 2391 3399 +3551 2621 3335 +3469 2815 3229 +3329 2987 3037 +3031 3149 2477 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3679 +3861 0 3679 +3859 0 3677 +3859 0 3675 +3855 0 3673 +3853 0 3671 +3849 0 3665 +3845 0 3659 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1614 3605 +3771 2211 3575 +3735 2521 3531 +3683 2753 3467 +3601 2947 3361 +3461 3119 3169 +3161 3281 2607 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3811 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3989 0 3805 +3985 0 3803 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1744 3737 +3903 2343 3707 +3867 2653 3663 +3815 2885 3599 +3733 3079 3493 +3593 3251 3299 +3293 3413 2737 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3935 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4093 0 3905 +4079 0 3889 +4061 1874 3869 +4037 2475 3839 +4001 2785 3795 +3947 3017 3731 +3865 3211 3625 +3725 3385 3431 +3425 3545 2867 +0 3697 0 +0 3843 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4067 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2005 4001 +4095 2607 3971 +4095 2917 3927 +4079 3149 3863 +3997 3343 3757 +3857 3517 3563 +3557 3677 2999 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2135 4095 +4095 2739 4095 +4095 3049 4059 +4095 3281 3995 +4095 3475 3889 +3989 3649 3695 +3689 3809 3129 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2267 4095 +4095 2871 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3261 +532 243 872 +424 313 835 +222 392 781 +0 480 697 +0 576 552 +0 680 237 +0 789 0 +0 903 0 +0 1022 0 +0 1143 0 +0 1267 0 +0 1393 0 +0 1520 0 +0 1649 0 +0 1779 0 +0 1909 0 +0 2039 0 +0 2171 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +640 231 909 +557 303 875 +416 384 826 +111 473 750 +0 571 625 +0 675 372 +0 786 0 +0 901 0 +0 1020 0 +0 1141 0 +0 1266 0 +0 1392 0 +0 1520 0 +0 1649 0 +0 1778 0 +0 1908 0 +0 2039 0 +0 2171 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +754 215 955 +690 289 924 +589 372 880 +404 464 814 +0 563 706 +0 669 506 +0 781 0 +0 897 0 +0 1017 0 +0 1139 0 +0 1264 0 +0 1391 0 +0 1519 0 +0 1648 0 +0 1778 0 +0 1908 0 +0 2039 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +871 192 1009 +823 270 982 +750 356 944 +628 451 886 +389 553 796 +0 661 639 +0 774 273 +0 892 0 +0 1013 0 +0 1136 0 +0 1262 0 +0 1389 0 +0 1518 0 +0 1647 0 +0 1777 0 +0 1908 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +992 160 1073 +956 243 1049 +902 334 1017 +819 433 968 +676 539 895 +367 650 772 +0 766 531 +0 885 0 +0 1008 0 +0 1132 0 +0 1259 0 +0 1387 0 +0 1516 0 +0 1646 0 +0 1776 0 +0 1907 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1116 113 1146 +1088 204 1126 +1049 302 1099 +990 408 1059 +897 519 1000 +733 634 905 +337 754 738 +0 876 328 +0 1001 0 +0 1127 0 +0 1255 0 +0 1384 0 +0 1514 0 +0 1644 0 +0 1775 0 +0 1906 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1241 42 1229 +1221 146 1212 +1191 257 1190 +1149 372 1157 +1086 491 1110 +985 613 1038 +799 737 919 +293 864 688 +0 991 0 +0 1120 0 +0 1250 0 +0 1380 0 +0 1511 0 +0 1642 0 +0 1773 0 +0 1905 0 +0 2036 0 +0 2169 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1368 0 1320 +1353 56 1307 +1331 187 1288 +1301 319 1262 +1256 451 1225 +1189 582 1170 +1080 714 1085 +875 846 937 +226 978 610 +0 1110 0 +0 1242 0 +0 1374 0 +0 1507 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1497 0 1419 +1485 0 1408 +1469 74 1394 +1447 237 1373 +1415 391 1345 +1369 538 1303 +1298 682 1240 +1183 822 1141 +960 960 960 +118 1097 481 +0 1232 0 +0 1367 0 +0 1501 0 +0 1634 0 +0 1768 0 +0 1901 0 +0 2033 0 +0 2165 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1626 0 1525 +1617 0 1516 +1606 0 1505 +1589 97 1489 +1566 296 1467 +1533 472 1435 +1485 634 1389 +1412 788 1320 +1291 935 1206 +1054 1078 990 +0 1219 216 +0 1357 0 +0 1493 0 +0 1629 0 +0 1763 0 +0 1897 0 +0 2031 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1756 0 1636 +1750 0 1630 +1741 0 1621 +1729 0 1608 +1712 126 1591 +1688 364 1568 +1655 562 1534 +1606 737 1484 +1530 899 1408 +1405 1052 1281 +1155 1200 1026 +0 1343 0 +0 1483 0 +0 1621 0 +0 1758 0 +0 1893 0 +0 2028 0 +0 2161 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1887 0 1752 +1882 0 1747 +1875 0 1740 +1866 0 1731 +1854 0 1718 +1837 163 1700 +1813 442 1675 +1779 659 1639 +1729 846 1586 +1652 1015 1505 +1523 1173 1366 +1262 1324 1070 +0 1469 0 +0 1611 0 +0 1750 0 +0 1888 0 +0 2024 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2018 0 1872 +2014 0 1868 +2009 0 1862 +2002 0 1855 +1993 0 1845 +1981 0 1832 +1963 207 1813 +1939 529 1787 +1905 764 1750 +1854 960 1695 +1776 1135 1608 +1644 1297 1458 +1374 1450 1123 +0 1597 0 +0 1740 0 +0 1880 0 +0 2018 0 +0 2155 0 +0 2289 0 +0 2425 0 +0 2559 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2149 0 1994 +2147 0 1991 +2143 0 1987 +2137 0 1982 +2131 0 1974 +2121 0 1964 +2109 0 1950 +2091 260 1931 +2067 624 1904 +2032 874 1866 +1981 1078 1808 +1902 1258 1717 +1768 1422 1559 +1491 1577 1186 +0 1725 0 +0 1869 0 +0 2010 0 +0 2149 0 +0 2285 0 +0 2421 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2281 0 2119 +2279 0 2117 +2275 0 2113 +2271 0 2109 +2267 0 2105 +2261 0 2097 +2251 0 2087 +2239 0 2073 +2221 323 2053 +2195 726 2025 +2161 989 1985 +2109 1200 1926 +2029 1382 1832 +1894 1549 1665 +1612 1706 1258 +0 1855 0 +0 2000 0 +0 2141 0 +0 2279 0 +0 2417 0 +0 2553 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2413 0 2245 +2411 0 2243 +2409 0 2241 +2405 0 2239 +2401 0 2235 +2397 0 2229 +2391 0 2221 +2381 0 2211 +2367 0 2197 +2351 396 2177 +2325 834 2147 +2291 1108 2107 +2239 1323 2047 +2157 1509 1950 +2021 1678 1777 +1735 1835 1340 +0 1985 0 +0 2131 0 +0 2273 0 +0 2411 0 +0 2549 0 +0 2685 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2543 0 2373 +2543 0 2373 +2541 0 2371 +2539 0 2369 +2537 0 2365 +2533 0 2361 +2527 0 2355 +2521 0 2347 +2511 0 2337 +2499 0 2323 +2481 477 2301 +2455 948 2273 +2421 1230 2231 +2369 1449 2171 +2287 1637 2071 +2149 1807 1894 +1860 1965 1430 +0 2115 0 +0 2261 0 +0 2403 0 +0 2543 0 +0 2681 0 +0 2817 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2675 0 2503 +2675 0 2501 +2673 0 2501 +2673 0 2499 +2671 0 2497 +2667 0 2493 +2663 0 2489 +2659 0 2483 +2651 0 2475 +2643 0 2465 +2629 0 2449 +2611 568 2429 +2587 1065 2401 +2551 1355 2359 +2499 1577 2295 +2417 1766 2195 +2279 1937 2014 +1987 2095 1528 +0 2247 0 +0 2393 0 +0 2535 0 +0 2675 0 +0 2813 0 +0 2949 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2807 0 2633 +2807 0 2631 +2807 0 2631 +2805 0 2629 +2803 0 2627 +2801 0 2625 +2799 0 2621 +2795 0 2617 +2789 0 2611 +2783 0 2603 +2773 0 2593 +2761 0 2579 +2743 666 2557 +2717 1186 2529 +2681 1481 2487 +2629 1705 2423 +2547 1896 2321 +2409 2067 2137 +2115 2227 1633 +0 2379 0 +0 2525 0 +0 2667 0 +0 2807 0 +0 2943 0 +0 3081 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2939 0 2763 +2939 0 2763 +2939 0 2761 +2937 0 2761 +2937 0 2759 +2935 0 2757 +2933 0 2755 +2931 0 2751 +2927 0 2747 +2921 0 2741 +2915 0 2733 +2905 0 2723 +2891 0 2707 +2875 771 2687 +2849 1310 2657 +2813 1609 2615 +2761 1835 2551 +2679 2026 2449 +2541 2199 2263 +2245 2359 1744 +0 2509 0 +0 2657 0 +0 2799 0 +0 2939 0 +0 3075 0 +0 3213 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3071 0 2893 +3071 0 2893 +3071 0 2893 +3071 0 2891 +3069 0 2891 +3069 0 2889 +3067 0 2887 +3065 0 2885 +3061 0 2881 +3057 0 2877 +3053 0 2871 +3045 0 2863 +3037 0 2853 +3023 0 2837 +3005 882 2817 +2981 1436 2787 +2945 1738 2745 +2891 1965 2681 +2811 2157 2577 +2671 2329 2389 +2375 2489 1860 +0 2641 0 +0 2787 0 +0 2931 0 +0 3071 0 +0 3207 0 +0 3345 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3203 0 3025 +3203 0 3025 +3203 0 3023 +3203 0 3023 +3201 0 3023 +3201 0 3021 +3199 0 3021 +3199 0 3019 +3197 0 3015 +3193 0 3013 +3189 0 3009 +3185 0 3003 +3177 0 2995 +3169 0 2983 +3155 0 2969 +3137 997 2947 +3113 1563 2919 +3077 1867 2875 +3023 2095 2811 +2941 2289 2707 +2803 2461 2517 +2505 2621 1979 +0 2773 0 +0 2919 0 +0 3063 0 +0 3203 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3333 0 3153 +3333 0 3153 +3331 0 3151 +3331 0 3149 +3329 0 3147 +3325 0 3143 +3321 0 3139 +3317 0 3133 +3309 0 3125 +3301 0 3115 +3287 0 3099 +3269 1116 3079 +3245 1692 3049 +3209 1997 3007 +3155 2227 2941 +3073 2419 2837 +2933 2593 2647 +2637 2753 2101 +0 2905 0 +0 3051 0 +0 3195 0 +0 3335 0 +0 3471 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3285 +3465 0 3285 +3465 0 3285 +3463 0 3283 +3463 0 3281 +3461 0 3279 +3457 0 3275 +3453 0 3271 +3449 0 3265 +3441 0 3257 +3431 0 3245 +3419 0 3231 +3401 1238 3209 +3375 1821 3181 +3341 2129 3137 +3287 2357 3073 +3205 2551 2969 +3065 2725 2777 +2767 2885 2225 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3875 0 +0 4011 0 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3417 +3599 0 3417 +3597 0 3417 +3597 0 3415 +3595 0 3415 +3595 0 3413 +3591 0 3411 +3589 0 3407 +3585 0 3403 +3581 0 3397 +3573 0 3389 +3563 0 3377 +3551 0 3363 +3533 1363 3341 +3507 1951 3311 +3471 2259 3269 +3419 2489 3203 +3337 2683 3099 +3197 2857 2907 +2899 3017 2351 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3733 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3549 +3731 0 3549 +3729 0 3549 +3729 0 3547 +3727 0 3545 +3727 0 3545 +3725 0 3541 +3721 0 3539 +3717 0 3535 +3713 0 3529 +3705 0 3521 +3695 0 3509 +3683 0 3495 +3665 1489 3473 +3639 2081 3443 +3603 2391 3401 +3551 2621 3335 +3469 2815 3231 +3329 2989 3037 +3031 3149 2479 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3683 +3865 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3863 0 3681 +3861 0 3681 +3861 0 3679 +3859 0 3677 +3859 0 3677 +3857 0 3673 +3853 0 3671 +3849 0 3665 +3845 0 3661 +3837 0 3651 +3827 0 3641 +3815 0 3625 +3797 1617 3605 +3771 2213 3575 +3735 2523 3531 +3683 2753 3467 +3601 2947 3363 +3461 3121 3169 +3163 3281 2609 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3995 0 3813 +3993 0 3813 +3993 0 3811 +3991 0 3809 +3991 0 3807 +3989 0 3805 +3985 0 3803 +3981 0 3797 +3977 0 3791 +3969 0 3783 +3959 0 3773 +3947 0 3757 +3929 1746 3737 +3903 2343 3707 +3869 2653 3663 +3815 2885 3599 +3733 3079 3493 +3593 3253 3301 +3295 3413 2739 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3937 +4095 0 3935 +4095 0 3929 +4095 0 3923 +4095 0 3915 +4093 0 3905 +4079 0 3889 +4061 1876 3869 +4037 2475 3839 +4001 2785 3795 +3947 3017 3731 +3865 3211 3625 +3725 3385 3431 +3425 3545 2869 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4067 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2006 4001 +4095 2607 3971 +4095 2917 3927 +4079 3149 3863 +3997 3343 3757 +3857 3517 3563 +3557 3677 2999 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2137 4095 +4095 2739 4095 +4095 3049 4059 +4095 3281 3995 +4095 3475 3889 +3989 3649 3695 +3689 3809 3131 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2267 4095 +4095 2871 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3821 3941 3261 +644 324 1001 +562 383 974 +422 452 935 +123 530 876 +0 617 784 +0 713 622 +0 815 233 +0 924 0 +0 1037 0 +0 1155 0 +0 1276 0 +0 1400 0 +0 1526 0 +0 1653 0 +0 1782 0 +0 1911 0 +0 2041 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +731 315 1029 +664 375 1004 +556 445 967 +354 524 913 +0 612 829 +0 708 684 +0 812 369 +0 921 0 +0 1035 0 +0 1154 0 +0 1275 0 +0 1399 0 +0 1525 0 +0 1653 0 +0 1781 0 +0 1911 0 +0 2041 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +826 301 1065 +772 363 1041 +689 435 1008 +548 516 958 +243 605 883 +0 703 757 +0 807 504 +0 918 0 +0 1033 0 +0 1151 0 +0 1273 0 +0 1398 0 +0 1524 0 +0 1652 0 +0 1781 0 +0 1910 0 +0 2041 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +928 282 1108 +886 347 1086 +822 421 1056 +721 504 1012 +536 596 946 +32 695 838 +0 801 638 +0 913 23 +0 1029 0 +0 1149 0 +0 1271 0 +0 1396 0 +0 1523 0 +0 1651 0 +0 1780 0 +0 1910 0 +0 2040 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1036 256 1160 +1003 324 1141 +955 402 1114 +882 488 1075 +760 583 1018 +521 685 929 +0 793 771 +0 907 406 +0 1024 0 +0 1145 0 +0 1268 0 +0 1394 0 +0 1521 0 +0 1650 0 +0 1779 0 +0 1909 0 +0 2040 0 +0 2171 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1150 219 1221 +1124 292 1205 +1088 375 1182 +1034 466 1149 +951 565 1100 +808 671 1026 +500 782 905 +0 898 663 +0 1017 0 +0 1140 0 +0 1265 0 +0 1391 0 +0 1519 0 +0 1648 0 +0 1778 0 +0 1908 0 +0 2039 0 +0 2171 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1267 163 1292 +1248 245 1278 +1220 336 1259 +1181 435 1231 +1122 540 1191 +1029 651 1131 +865 767 1037 +469 886 870 +0 1008 460 +0 1133 0 +0 1259 0 +0 1387 0 +0 1516 0 +0 1646 0 +0 1776 0 +0 1907 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1388 76 1373 +1373 174 1361 +1353 278 1345 +1324 389 1322 +1281 504 1289 +1218 623 1242 +1116 745 1170 +932 870 1051 +425 996 820 +0 1123 0 +0 1252 0 +0 1382 0 +0 1512 0 +0 1643 0 +0 1774 0 +0 1905 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2563 0 +0 2695 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1512 0 1462 +1501 57 1452 +1485 188 1439 +1463 319 1420 +1433 451 1395 +1388 583 1357 +1321 715 1303 +1212 847 1217 +1008 979 1069 +358 1110 742 +0 1242 0 +0 1374 0 +0 1507 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1638 0 1559 +1629 0 1551 +1617 29 1541 +1601 206 1526 +1579 369 1505 +1547 523 1477 +1501 670 1435 +1430 814 1373 +1315 954 1273 +1092 1092 1092 +250 1229 613 +0 1364 0 +0 1499 0 +0 1633 0 +0 1767 0 +0 1900 0 +0 2033 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1765 0 1663 +1758 0 1657 +1750 0 1649 +1738 0 1637 +1721 229 1621 +1698 428 1599 +1665 604 1567 +1617 766 1522 +1544 920 1452 +1423 1067 1338 +1186 1211 1122 +47 1351 348 +0 1489 0 +0 1626 0 +0 1761 0 +0 1896 0 +0 2030 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1893 0 1773 +1888 0 1768 +1882 0 1762 +1873 0 1753 +1861 0 1740 +1844 258 1723 +1820 496 1700 +1787 694 1666 +1738 869 1616 +1662 1031 1540 +1537 1185 1414 +1287 1332 1158 +0 1475 0 +0 1615 0 +0 1753 0 +0 1890 0 +0 2025 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2023 0 1888 +2019 0 1884 +2014 0 1879 +2007 0 1872 +1998 0 1863 +1986 0 1850 +1969 295 1832 +1945 574 1807 +1911 791 1771 +1861 978 1718 +1784 1147 1637 +1655 1305 1498 +1394 1456 1202 +0 1601 0 +0 1743 0 +0 1882 0 +0 2020 0 +0 2155 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2153 0 2007 +2149 0 2004 +2147 0 2000 +2141 0 1995 +2135 0 1987 +2125 0 1978 +2113 0 1964 +2095 339 1946 +2071 661 1920 +2037 896 1882 +1986 1092 1827 +1908 1267 1740 +1777 1429 1590 +1507 1582 1256 +0 1729 0 +0 1872 0 +0 2012 0 +0 2151 0 +0 2287 0 +0 2421 0 +0 2557 0 +0 2691 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2283 0 2129 +2281 0 2127 +2279 0 2123 +2275 0 2119 +2269 0 2113 +2263 0 2107 +2253 0 2097 +2241 0 2083 +2223 393 2063 +2199 756 2036 +2165 1006 1998 +2113 1210 1940 +2034 1390 1850 +1900 1554 1691 +1624 1709 1318 +0 1858 0 +0 2002 0 +0 2143 0 +0 2281 0 +0 2417 0 +0 2553 0 +0 2687 0 +0 2823 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2415 0 2253 +2413 0 2251 +2411 0 2249 +2407 0 2245 +2405 0 2241 +2399 0 2237 +2393 0 2229 +2383 0 2219 +2371 0 2205 +2353 455 2185 +2329 858 2157 +2293 1121 2117 +2241 1332 2057 +2161 1515 1964 +2026 1681 1797 +1744 1838 1391 +0 1987 0 +0 2131 0 +0 2273 0 +0 2411 0 +0 2549 0 +0 2685 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2545 0 2379 +2545 0 2377 +2543 0 2377 +2541 0 2373 +2537 0 2371 +2535 0 2367 +2529 0 2361 +2523 0 2353 +2513 0 2343 +2501 0 2329 +2483 528 2309 +2457 966 2281 +2423 1240 2239 +2371 1456 2179 +2289 1641 2083 +2153 1810 1910 +1867 1967 1472 +0 2117 0 +0 2263 0 +0 2405 0 +0 2543 0 +0 2681 0 +0 2817 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2677 0 2507 +2675 0 2505 +2675 0 2505 +2673 0 2503 +2671 0 2501 +2669 0 2497 +2665 0 2493 +2659 0 2487 +2653 0 2479 +2643 0 2469 +2631 0 2455 +2613 609 2433 +2587 1080 2405 +2553 1362 2365 +2501 1582 2303 +2419 1769 2203 +2283 1939 2026 +1993 2097 1562 +0 2249 0 +0 2393 0 +0 2535 0 +0 2675 0 +0 2813 0 +0 2949 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2809 0 2635 +2807 0 2635 +2807 0 2633 +2805 0 2633 +2805 0 2631 +2803 0 2629 +2799 0 2625 +2795 0 2621 +2791 0 2615 +2783 0 2607 +2775 0 2597 +2761 0 2581 +2743 700 2561 +2719 1198 2533 +2683 1487 2491 +2631 1709 2427 +2549 1898 2327 +2411 2069 2147 +2119 2227 1661 +0 2379 0 +0 2525 0 +0 2667 0 +0 2807 0 +0 2945 0 +0 3081 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2941 0 2765 +2939 0 2765 +2939 0 2763 +2939 0 2763 +2937 0 2761 +2935 0 2759 +2933 0 2757 +2931 0 2755 +2927 0 2749 +2921 0 2743 +2915 0 2737 +2905 0 2725 +2893 0 2711 +2875 798 2689 +2849 1319 2661 +2815 1613 2619 +2761 1837 2555 +2681 2028 2453 +2541 2199 2269 +2247 2359 1766 +0 2511 0 +0 2657 0 +0 2799 0 +0 2939 0 +0 3077 0 +0 3213 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3073 0 2895 +3071 0 2895 +3071 0 2895 +3071 0 2893 +3069 0 2893 +3069 0 2891 +3067 0 2889 +3065 0 2887 +3063 0 2883 +3059 0 2879 +3053 0 2873 +3047 0 2865 +3037 0 2855 +3025 0 2839 +3007 903 2819 +2981 1442 2789 +2945 1741 2747 +2893 1967 2683 +2811 2159 2581 +2673 2331 2395 +2377 2491 1876 +0 2641 0 +0 2789 0 +0 2931 0 +0 3071 0 +0 3207 0 +0 3345 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3205 0 3025 +3203 0 3025 +3203 0 3025 +3203 0 3025 +3203 0 3023 +3201 0 3023 +3201 0 3021 +3199 0 3019 +3197 0 3017 +3193 0 3015 +3191 0 3009 +3185 0 3003 +3177 0 2995 +3169 0 2985 +3155 0 2971 +3137 1014 2949 +3113 1568 2919 +3077 1870 2877 +3025 2097 2813 +2943 2289 2711 +2803 2461 2521 +2507 2621 1992 +0 2773 0 +0 2919 0 +0 3063 0 +0 3203 0 +0 3339 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3335 0 3157 +3335 0 3157 +3335 0 3157 +3335 0 3155 +3335 0 3155 +3335 0 3155 +3333 0 3153 +3333 0 3153 +3331 0 3151 +3329 0 3149 +3325 0 3145 +3321 0 3141 +3317 0 3135 +3309 0 3127 +3301 0 3115 +3287 0 3101 +3269 1129 3079 +3245 1695 3051 +3209 1999 3007 +3155 2227 2943 +3073 2421 2839 +2935 2593 2649 +2637 2753 2111 +0 2905 0 +0 3051 0 +0 3195 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3743 0 +0 3877 0 +0 4011 0 +3469 0 3289 +3467 0 3289 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3467 0 3287 +3465 0 3285 +3465 0 3285 +3463 0 3283 +3463 0 3281 +3461 0 3279 +3457 0 3277 +3453 0 3271 +3449 0 3265 +3441 0 3257 +3433 0 3247 +3419 0 3231 +3401 1248 3211 +3377 1824 3181 +3341 2129 3139 +3287 2359 3073 +3205 2551 2969 +3065 2725 2779 +2769 2885 2233 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3875 0 +0 4011 0 +3601 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3417 +3597 0 3417 +3597 0 3417 +3595 0 3415 +3595 0 3413 +3593 0 3411 +3589 0 3407 +3585 0 3403 +3581 0 3397 +3573 0 3389 +3565 0 3379 +3551 0 3363 +3533 1371 3341 +3509 1953 3313 +3473 2261 3269 +3419 2489 3205 +3337 2683 3101 +3197 2857 2909 +2899 3017 2357 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3733 0 3551 +3733 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3549 +3729 0 3549 +3729 0 3547 +3727 0 3547 +3727 0 3545 +3725 0 3543 +3721 0 3539 +3717 0 3535 +3713 0 3529 +3705 0 3521 +3697 0 3509 +3683 0 3495 +3665 1495 3473 +3641 2083 3443 +3605 2391 3401 +3551 2621 3335 +3469 2815 3231 +3329 2989 3039 +3031 3149 2485 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3683 +3865 0 3683 +3865 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3863 0 3681 +3861 0 3681 +3861 0 3679 +3859 0 3679 +3859 0 3677 +3857 0 3673 +3853 0 3671 +3849 0 3667 +3845 0 3661 +3837 0 3653 +3829 0 3641 +3815 0 3627 +3797 1622 3605 +3773 2213 3575 +3737 2523 3533 +3683 2753 3467 +3601 2947 3363 +3461 3121 3169 +3163 3281 2611 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3993 0 3813 +3993 0 3811 +3991 0 3809 +3991 0 3809 +3989 0 3805 +3985 0 3803 +3981 0 3799 +3977 0 3793 +3969 0 3785 +3961 0 3773 +3947 0 3757 +3929 1749 3737 +3905 2345 3707 +3869 2655 3663 +3815 2885 3599 +3733 3079 3495 +3593 3253 3301 +3295 3413 2741 +0 3565 0 +0 3711 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3941 +4095 0 3941 +4095 0 3937 +4095 0 3935 +4095 0 3929 +4095 0 3925 +4095 0 3915 +4093 0 3905 +4079 0 3889 +4061 1878 3869 +4037 2475 3839 +4001 2785 3795 +3947 3017 3731 +3865 3211 3625 +3725 3385 3433 +3427 3545 2871 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4067 +4095 0 4061 +4095 0 4055 +4095 0 4047 +4095 0 4037 +4095 0 4021 +4095 2008 4001 +4095 2607 3971 +4095 2917 3927 +4079 3149 3863 +3997 3343 3757 +3857 3517 3563 +3559 3677 3001 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2139 4095 +4095 2739 4095 +4095 3049 4059 +4095 3281 3995 +4095 3475 3889 +3989 3649 3695 +3691 3809 3131 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2269 4095 +4095 2871 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3823 3941 3263 +761 415 1131 +699 464 1111 +599 522 1082 +420 590 1041 +0 667 979 +0 753 880 +0 848 701 +0 950 229 +0 1058 0 +0 1171 0 +0 1288 0 +0 1409 0 +0 1533 0 +0 1658 0 +0 1786 0 +0 1914 0 +0 2043 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +829 407 1153 +776 456 1133 +694 515 1106 +554 584 1067 +255 662 1008 +0 749 916 +0 845 754 +0 947 365 +0 1056 0 +0 1169 0 +0 1287 0 +0 1408 0 +0 1532 0 +0 1658 0 +0 1785 0 +0 1914 0 +0 2043 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +907 396 1180 +863 447 1161 +796 507 1136 +688 577 1099 +486 656 1045 +0 744 961 +0 841 817 +0 944 501 +0 1053 0 +0 1167 0 +0 1286 0 +0 1407 0 +0 1531 0 +0 1657 0 +0 1785 0 +0 1913 0 +0 2043 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +994 381 1214 +958 433 1197 +904 495 1173 +821 567 1139 +680 648 1090 +375 737 1015 +0 835 889 +0 939 636 +0 1050 0 +0 1165 0 +0 1284 0 +0 1406 0 +0 1530 0 +0 1656 0 +0 1784 0 +0 1913 0 +0 2042 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1089 360 1255 +1060 415 1240 +1018 479 1219 +955 553 1188 +853 636 1144 +669 728 1078 +164 827 970 +0 933 770 +0 1045 155 +0 1161 0 +0 1281 0 +0 1403 0 +0 1528 0 +0 1655 0 +0 1783 0 +0 1912 0 +0 2042 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1191 330 1306 +1168 388 1292 +1135 456 1273 +1087 534 1246 +1014 620 1208 +893 715 1150 +653 817 1060 +0 925 903 +0 1038 538 +0 1156 0 +0 1277 0 +0 1401 0 +0 1526 0 +0 1653 0 +0 1782 0 +0 1911 0 +0 2041 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1300 287 1366 +1282 351 1353 +1256 424 1337 +1220 507 1314 +1166 598 1281 +1083 697 1232 +940 803 1159 +632 914 1036 +0 1030 795 +0 1149 0 +0 1272 0 +0 1397 0 +0 1523 0 +0 1651 0 +0 1780 0 +0 1910 0 +0 2040 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1413 222 1435 +1399 295 1425 +1380 377 1410 +1352 468 1391 +1313 567 1363 +1254 672 1323 +1161 783 1264 +997 899 1169 +601 1018 1002 +0 1140 592 +0 1265 0 +0 1391 0 +0 1519 0 +0 1648 0 +0 1778 0 +0 1908 0 +0 2039 0 +0 2171 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1531 118 1514 +1520 208 1505 +1505 306 1493 +1485 411 1477 +1456 521 1454 +1413 636 1421 +1350 755 1374 +1249 877 1302 +1063 1002 1183 +557 1128 952 +0 1255 0 +0 1384 0 +0 1514 0 +0 1644 0 +0 1775 0 +0 1906 0 +0 2037 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1652 0 1601 +1644 58 1594 +1633 189 1584 +1617 320 1571 +1596 451 1553 +1565 583 1527 +1520 715 1490 +1453 847 1435 +1344 979 1349 +1139 1110 1201 +490 1242 875 +0 1375 0 +0 1507 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1776 0 1697 +1770 0 1691 +1761 0 1683 +1749 161 1673 +1733 338 1658 +1711 501 1638 +1679 655 1609 +1633 803 1567 +1562 946 1505 +1447 1086 1405 +1225 1225 1225 +382 1361 745 +0 1497 0 +0 1631 0 +0 1765 0 +0 1899 0 +0 2032 0 +0 2165 0 +0 2297 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1902 0 1800 +1897 0 1795 +1890 0 1789 +1882 0 1781 +1870 122 1769 +1853 361 1753 +1830 560 1731 +1797 736 1700 +1750 898 1654 +1676 1052 1584 +1556 1199 1471 +1318 1343 1254 +179 1483 480 +0 1621 0 +0 1758 0 +0 1893 0 +0 2028 0 +0 2161 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2029 0 1909 +2025 0 1905 +2021 0 1900 +2014 0 1894 +2005 0 1885 +1993 63 1873 +1976 390 1856 +1952 628 1832 +1919 826 1798 +1870 1001 1748 +1795 1163 1672 +1669 1317 1546 +1419 1464 1290 +0 1607 0 +0 1747 0 +0 1886 0 +0 2022 0 +0 2157 0 +0 2293 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2157 0 2023 +2155 0 2020 +2151 0 2016 +2147 0 2011 +2139 0 2004 +2131 0 1995 +2119 0 1982 +2101 427 1964 +2077 706 1939 +2043 924 1903 +1993 1110 1851 +1916 1279 1769 +1787 1437 1630 +1526 1588 1334 +0 1733 0 +0 1875 0 +0 2014 0 +0 2151 0 +0 2287 0 +0 2423 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2287 0 2141 +2285 0 2139 +2283 0 2135 +2279 0 2131 +2273 0 2127 +2267 0 2119 +2257 0 2109 +2245 0 2097 +2227 471 2077 +2203 793 2051 +2169 1028 2014 +2119 1224 1959 +2040 1399 1872 +1909 1561 1723 +1639 1714 1388 +0 1861 0 +0 2004 0 +0 2145 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2417 0 2263 +2415 0 2261 +2413 0 2259 +2411 0 2255 +2407 0 2251 +2401 0 2245 +2395 0 2239 +2385 0 2229 +2373 0 2215 +2355 525 2195 +2331 888 2169 +2297 1138 2129 +2245 1342 2073 +2165 1522 1982 +2033 1686 1823 +1756 1841 1450 +0 1990 0 +0 2133 0 +0 2275 0 +0 2413 0 +0 2549 0 +0 2685 0 +0 2821 0 +0 2955 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2547 0 2387 +2547 0 2385 +2545 0 2383 +2543 0 2381 +2539 0 2377 +2537 0 2373 +2531 0 2369 +2525 0 2361 +2515 0 2351 +2503 0 2337 +2485 587 2317 +2461 990 2289 +2425 1253 2249 +2373 1464 2189 +2293 1647 2097 +2159 1813 1930 +1876 1970 1523 +0 2119 0 +0 2263 0 +0 2405 0 +0 2545 0 +0 2681 0 +0 2817 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2679 0 2513 +2677 0 2511 +2677 0 2509 +2675 0 2509 +2673 0 2505 +2669 0 2503 +2667 0 2499 +2661 0 2493 +2655 0 2485 +2645 0 2475 +2633 0 2461 +2615 660 2441 +2589 1098 2413 +2555 1372 2371 +2503 1588 2311 +2421 1773 2215 +2285 1942 2042 +1999 2099 1604 +0 2249 0 +0 2395 0 +0 2537 0 +0 2675 0 +0 2813 0 +0 2949 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2809 0 2639 +2809 0 2639 +2809 0 2637 +2807 0 2637 +2805 0 2635 +2803 0 2633 +2801 0 2629 +2797 0 2625 +2791 0 2619 +2785 0 2611 +2775 0 2601 +2763 0 2587 +2745 742 2567 +2721 1212 2537 +2685 1495 2497 +2633 1714 2435 +2551 1901 2335 +2415 2071 2159 +2125 2229 1695 +0 2381 0 +0 2525 0 +0 2667 0 +0 2807 0 +0 2945 0 +0 3081 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +2941 0 2769 +2941 0 2767 +2939 0 2767 +2939 0 2765 +2937 0 2765 +2937 0 2763 +2935 0 2761 +2931 0 2757 +2927 0 2753 +2923 0 2747 +2915 0 2739 +2907 0 2729 +2893 0 2713 +2875 832 2693 +2851 1330 2665 +2815 1619 2623 +2763 1841 2561 +2681 2030 2461 +2543 2201 2279 +2251 2361 1793 +0 2511 0 +0 2657 0 +0 2799 0 +0 2939 0 +0 3077 0 +0 3213 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3883 0 +0 4015 0 +3073 0 2897 +3073 0 2897 +3071 0 2897 +3071 0 2895 +3071 0 2895 +3069 0 2893 +3067 0 2891 +3065 0 2889 +3063 0 2887 +3059 0 2881 +3053 0 2877 +3047 0 2869 +3037 0 2857 +3025 0 2843 +3007 930 2821 +2981 1451 2793 +2947 1745 2751 +2893 1970 2687 +2813 2161 2587 +2673 2331 2401 +2379 2491 1898 +0 2643 0 +0 2789 0 +0 2931 0 +0 3071 0 +0 3209 0 +0 3345 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3205 0 3027 +3205 0 3027 +3203 0 3027 +3203 0 3027 +3203 0 3025 +3201 0 3025 +3201 0 3023 +3199 0 3021 +3197 0 3019 +3195 0 3015 +3191 0 3011 +3185 0 3005 +3179 0 2997 +3169 0 2987 +3157 0 2973 +3139 1035 2951 +3113 1574 2921 +3077 1873 2879 +3025 2099 2815 +2943 2291 2713 +2805 2463 2527 +2509 2623 2008 +0 2775 0 +0 2921 0 +0 3063 0 +0 3203 0 +0 3341 0 +0 3477 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3337 0 3159 +3337 0 3157 +3335 0 3157 +3335 0 3157 +3335 0 3157 +3335 0 3155 +3333 0 3155 +3333 0 3153 +3331 0 3151 +3329 0 3149 +3325 0 3147 +3323 0 3141 +3317 0 3137 +3311 0 3129 +3301 0 3117 +3287 0 3103 +3269 1146 3081 +3245 1700 3051 +3209 2002 3009 +3157 2229 2945 +3075 2421 2843 +2935 2593 2653 +2639 2753 2123 +0 2905 0 +0 3053 0 +0 3195 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3743 0 +0 3879 0 +0 4011 0 +3469 0 3289 +3469 0 3289 +3467 0 3289 +3467 0 3289 +3467 0 3289 +3467 0 3287 +3467 0 3287 +3465 0 3285 +3465 0 3285 +3463 0 3283 +3461 0 3281 +3457 0 3277 +3453 0 3273 +3449 0 3267 +3441 0 3259 +3433 0 3247 +3419 0 3233 +3401 1261 3211 +3377 1827 3183 +3341 2131 3139 +3287 2359 3075 +3205 2553 2971 +3067 2725 2781 +2769 2885 2243 +0 3037 0 +0 3183 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3875 0 +0 4011 0 +3601 0 3421 +3601 0 3421 +3599 0 3421 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3419 +3599 0 3417 +3597 0 3417 +3595 0 3415 +3595 0 3413 +3593 0 3411 +3589 0 3409 +3585 0 3403 +3581 0 3397 +3573 0 3389 +3565 0 3379 +3551 0 3363 +3533 1380 3343 +3509 1956 3313 +3473 2261 3271 +3419 2491 3205 +3337 2683 3101 +3199 2857 2911 +2901 3017 2365 +0 3169 0 +0 3315 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3733 0 3551 +3733 0 3551 +3733 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3729 0 3549 +3729 0 3549 +3727 0 3547 +3727 0 3545 +3725 0 3543 +3721 0 3539 +3717 0 3535 +3713 0 3529 +3705 0 3521 +3697 0 3511 +3683 0 3495 +3665 1503 3475 +3641 2085 3445 +3605 2393 3401 +3551 2623 3337 +3469 2815 3233 +3329 2989 3041 +3031 3149 2489 +0 3301 0 +0 3447 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3683 +3865 0 3683 +3865 0 3683 +3865 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3861 0 3681 +3861 0 3679 +3859 0 3679 +3859 0 3677 +3857 0 3675 +3853 0 3671 +3849 0 3667 +3845 0 3661 +3837 0 3653 +3829 0 3641 +3815 0 3627 +3797 1627 3605 +3773 2215 3575 +3737 2523 3533 +3683 2753 3467 +3601 2947 3363 +3461 3121 3171 +3163 3281 2617 +0 3433 0 +0 3579 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3993 0 3813 +3993 0 3811 +3991 0 3811 +3991 0 3809 +3989 0 3807 +3985 0 3803 +3981 0 3799 +3977 0 3793 +3969 0 3785 +3961 0 3773 +3947 0 3759 +3929 1754 3737 +3905 2345 3707 +3869 2655 3665 +3815 2885 3599 +3733 3079 3495 +3593 3253 3301 +3295 3413 2743 +0 3565 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3937 +4095 0 3935 +4095 0 3931 +4095 0 3925 +4095 0 3917 +4093 0 3905 +4079 0 3891 +4061 1881 3869 +4037 2477 3839 +4001 2787 3795 +3947 3017 3731 +3865 3211 3627 +3725 3385 3433 +3427 3545 2873 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4073 +4095 0 4069 +4095 0 4067 +4095 0 4063 +4095 0 4057 +4095 0 4049 +4095 0 4037 +4095 0 4021 +4095 2010 4001 +4095 2609 3971 +4095 2919 3927 +4079 3149 3863 +3997 3343 3757 +3857 3517 3565 +3559 3677 3003 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2141 4095 +4095 2739 4095 +4095 3049 4059 +4095 3281 3995 +4095 3475 3889 +3989 3649 3697 +3691 3809 3133 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2271 4095 +4095 2871 4095 +4095 3181 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3827 +3823 3941 3263 +881 513 1262 +834 553 1247 +762 601 1225 +645 659 1196 +417 726 1152 +0 802 1087 +0 888 982 +0 982 788 +0 1083 222 +0 1191 0 +0 1304 0 +0 1421 0 +0 1542 0 +0 1665 0 +0 1791 0 +0 1918 0 +0 2046 0 +0 2175 0 +0 2305 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +934 506 1278 +893 547 1263 +831 596 1243 +731 654 1214 +552 722 1173 +77 799 1111 +0 885 1012 +0 980 833 +0 1082 361 +0 1190 0 +0 1303 0 +0 1421 0 +0 1541 0 +0 1665 0 +0 1791 0 +0 1918 0 +0 2046 0 +0 2175 0 +0 2305 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +997 497 1299 +961 539 1285 +908 588 1265 +826 648 1238 +686 716 1199 +387 794 1140 +0 882 1048 +0 977 886 +0 1079 498 +0 1188 0 +0 1302 0 +0 1419 0 +0 1541 0 +0 1664 0 +0 1790 0 +0 1917 0 +0 2046 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1070 485 1325 +1039 528 1312 +995 579 1294 +928 639 1268 +820 709 1231 +618 788 1177 +0 876 1093 +0 973 949 +0 1076 633 +0 1185 0 +0 1299 0 +0 1418 0 +0 1539 0 +0 1663 0 +0 1789 0 +0 1917 0 +0 2045 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1151 469 1358 +1126 513 1346 +1090 565 1329 +1036 627 1305 +954 699 1272 +812 780 1222 +507 870 1147 +0 967 1021 +0 1071 768 +0 1182 0 +0 1297 0 +0 1416 0 +0 1538 0 +0 1662 0 +0 1788 0 +0 1916 0 +0 2045 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1242 446 1399 +1221 492 1387 +1192 547 1372 +1150 611 1351 +1086 685 1320 +985 768 1276 +801 860 1210 +296 960 1102 +0 1065 902 +0 1177 287 +0 1293 0 +0 1413 0 +0 1536 0 +0 1661 0 +0 1787 0 +0 1915 0 +0 2044 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1340 413 1448 +1323 462 1438 +1300 520 1424 +1267 588 1405 +1219 666 1378 +1146 752 1340 +1024 847 1283 +785 949 1193 +0 1057 1035 +0 1171 670 +0 1288 0 +0 1409 0 +0 1533 0 +0 1658 0 +0 1786 0 +0 1914 0 +0 2043 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1445 365 1506 +1432 419 1498 +1414 483 1486 +1388 556 1469 +1352 639 1446 +1298 730 1413 +1215 829 1365 +1072 935 1291 +764 1046 1169 +0 1162 927 +0 1281 0 +0 1404 0 +0 1529 0 +0 1655 0 +0 1783 0 +0 1912 0 +0 2042 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1556 291 1575 +1546 354 1567 +1531 427 1557 +1512 509 1542 +1485 600 1523 +1445 699 1495 +1386 804 1455 +1293 915 1396 +1129 1031 1301 +733 1150 1134 +0 1272 724 +0 1397 0 +0 1524 0 +0 1651 0 +0 1780 0 +0 1910 0 +0 2040 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1671 169 1652 +1663 250 1646 +1652 340 1637 +1638 438 1625 +1617 543 1609 +1588 653 1586 +1546 768 1554 +1482 887 1506 +1381 1009 1434 +1196 1134 1315 +689 1260 1084 +0 1388 87 +0 1516 0 +0 1646 0 +0 1776 0 +0 1907 0 +0 2038 0 +0 2169 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1790 0 1739 +1784 59 1733 +1776 190 1726 +1765 321 1716 +1749 452 1703 +1728 583 1685 +1697 715 1659 +1653 847 1622 +1585 979 1567 +1476 1111 1481 +1272 1243 1334 +622 1375 1007 +0 1507 0 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1913 0 1833 +1908 0 1829 +1902 0 1823 +1893 93 1816 +1882 293 1805 +1866 470 1790 +1843 633 1770 +1811 787 1741 +1765 935 1699 +1694 1078 1637 +1579 1218 1537 +1357 1357 1357 +514 1493 877 +0 1629 0 +0 1763 0 +0 1897 0 +0 2031 0 +0 2165 0 +0 2297 0 +0 2429 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2037 0 1935 +2034 0 1932 +2029 0 1927 +2023 0 1921 +2014 0 1913 +2002 254 1901 +1985 493 1885 +1962 692 1863 +1930 868 1832 +1882 1030 1786 +1809 1184 1716 +1688 1331 1603 +1450 1475 1386 +311 1615 612 +0 1753 0 +0 1890 0 +0 2025 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2163 0 2044 +2161 0 2041 +2157 0 2037 +2153 0 2033 +2147 0 2026 +2137 0 2017 +2125 195 2005 +2109 522 1988 +2085 760 1964 +2051 958 1930 +2002 1133 1881 +1927 1295 1805 +1802 1449 1678 +1551 1596 1422 +0 1739 0 +0 1880 0 +0 2018 0 +0 2155 0 +0 2289 0 +0 2425 0 +0 2559 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2291 0 2157 +2289 0 2155 +2287 0 2153 +2283 0 2149 +2279 0 2143 +2271 0 2137 +2263 0 2127 +2251 102 2115 +2233 559 2097 +2209 838 2071 +2175 1055 2035 +2125 1242 1983 +2049 1412 1901 +1920 1570 1762 +1658 1720 1466 +0 1866 0 +0 2007 0 +0 2147 0 +0 2283 0 +0 2419 0 +0 2555 0 +0 2689 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2421 0 2275 +2419 0 2273 +2417 0 2271 +2415 0 2269 +2411 0 2265 +2405 0 2259 +2399 0 2251 +2389 0 2241 +2377 0 2229 +2359 603 2209 +2335 925 2183 +2301 1160 2147 +2251 1356 2091 +2173 1531 2004 +2041 1693 1855 +1771 1846 1520 +0 1993 0 +0 2137 0 +0 2277 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2551 0 2395 +2549 0 2395 +2547 0 2393 +2545 0 2391 +2543 0 2387 +2539 0 2383 +2533 0 2379 +2527 0 2371 +2517 0 2361 +2505 0 2347 +2487 657 2327 +2463 1020 2301 +2429 1270 2261 +2377 1475 2205 +2299 1654 2113 +2165 1818 1955 +1888 1973 1583 +0 2121 0 +0 2265 0 +0 2407 0 +0 2545 0 +0 2681 0 +0 2817 0 +0 2953 0 +0 3087 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2681 0 2519 +2679 0 2519 +2679 0 2517 +2677 0 2515 +2675 0 2513 +2673 0 2511 +2669 0 2505 +2663 0 2501 +2657 0 2493 +2647 0 2483 +2635 0 2469 +2617 720 2449 +2593 1122 2421 +2557 1386 2381 +2505 1596 2321 +2425 1779 2229 +2291 1946 2061 +2008 2101 1655 +0 2251 0 +0 2397 0 +0 2537 0 +0 2677 0 +0 2813 0 +0 2949 0 +0 3083 0 +0 3219 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2811 0 2645 +2811 0 2645 +2809 0 2643 +2809 0 2641 +2807 0 2641 +2805 0 2637 +2803 0 2635 +2799 0 2631 +2793 0 2625 +2787 0 2617 +2777 0 2607 +2765 0 2593 +2747 792 2573 +2721 1230 2545 +2687 1505 2503 +2635 1720 2443 +2555 1906 2347 +2417 2073 2173 +2131 2231 1736 +0 2381 0 +0 2527 0 +0 2669 0 +0 2807 0 +0 2945 0 +0 3081 0 +0 3215 0 +0 3351 0 +0 3483 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2943 0 2773 +2941 0 2771 +2941 0 2771 +2941 0 2769 +2939 0 2769 +2937 0 2767 +2935 0 2765 +2933 0 2761 +2929 0 2757 +2923 0 2751 +2917 0 2743 +2907 0 2733 +2895 0 2719 +2877 874 2699 +2853 1344 2669 +2817 1627 2629 +2765 1846 2567 +2683 2034 2469 +2547 2203 2291 +2257 2361 1827 +0 2513 0 +0 2657 0 +0 2799 0 +0 2939 0 +0 3077 0 +0 3213 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3883 0 +0 4015 0 +3073 0 2901 +3073 0 2901 +3073 0 2899 +3073 0 2899 +3071 0 2897 +3071 0 2897 +3069 0 2895 +3067 0 2893 +3063 0 2889 +3059 0 2885 +3055 0 2879 +3047 0 2871 +3039 0 2861 +3025 0 2847 +3007 964 2825 +2983 1462 2797 +2947 1751 2755 +2895 1973 2693 +2813 2163 2593 +2675 2333 2411 +2383 2493 1925 +0 2643 0 +0 2789 0 +0 2931 0 +0 3071 0 +0 3209 0 +0 3345 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4015 0 +3205 0 3029 +3205 0 3029 +3205 0 3029 +3205 0 3029 +3203 0 3027 +3203 0 3027 +3201 0 3025 +3199 0 3023 +3197 0 3021 +3195 0 3019 +3191 0 3013 +3187 0 3009 +3179 0 3001 +3169 0 2989 +3157 0 2975 +3139 1062 2955 +3115 1583 2925 +3079 1877 2883 +3025 2101 2819 +2945 2293 2719 +2805 2463 2533 +2513 2623 2030 +0 2775 0 +0 2921 0 +0 3063 0 +0 3203 0 +0 3341 0 +0 3477 0 +0 3611 0 +0 3747 0 +0 3879 0 +0 4013 0 +3337 0 3159 +3337 0 3159 +3337 0 3159 +3335 0 3159 +3335 0 3159 +3335 0 3157 +3335 0 3157 +3333 0 3155 +3331 0 3153 +3329 0 3151 +3327 0 3149 +3323 0 3143 +3317 0 3137 +3311 0 3129 +3301 0 3119 +3289 0 3105 +3271 1167 3083 +3245 1707 3055 +3209 2005 3011 +3157 2231 2947 +3075 2423 2845 +2937 2595 2659 +2641 2755 2141 +0 2907 0 +0 3053 0 +0 3195 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3743 0 +0 3879 0 +0 4011 0 +3469 0 3291 +3469 0 3291 +3469 0 3291 +3469 0 3289 +3467 0 3289 +3467 0 3289 +3467 0 3289 +3465 0 3287 +3465 0 3285 +3463 0 3283 +3461 0 3281 +3459 0 3279 +3455 0 3275 +3449 0 3269 +3443 0 3261 +3433 0 3249 +3419 0 3235 +3403 1278 3213 +3377 1832 3183 +3341 2133 3141 +3289 2361 3077 +3207 2553 2975 +3067 2725 2785 +2771 2885 2255 +0 3037 0 +0 3185 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3875 0 +0 4011 0 +3601 0 3421 +3601 0 3421 +3601 0 3421 +3601 0 3421 +3599 0 3421 +3599 0 3421 +3599 0 3419 +3599 0 3419 +3597 0 3417 +3597 0 3417 +3595 0 3415 +3593 0 3413 +3589 0 3409 +3587 0 3405 +3581 0 3399 +3573 0 3391 +3565 0 3379 +3551 0 3365 +3533 1393 3345 +3509 1959 3315 +3473 2263 3271 +3419 2491 3207 +3339 2685 3103 +3199 2857 2913 +2901 3017 2375 +0 3169 0 +0 3317 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3733 0 3553 +3733 0 3553 +3733 0 3553 +3733 0 3553 +3731 0 3553 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3731 0 3551 +3729 0 3549 +3729 0 3547 +3727 0 3545 +3725 0 3543 +3721 0 3541 +3717 0 3535 +3713 0 3531 +3705 0 3521 +3697 0 3511 +3683 0 3495 +3665 1513 3475 +3641 2087 3445 +3605 2393 3403 +3551 2623 3337 +3469 2817 3233 +3331 2989 3043 +3033 3149 2497 +0 3301 0 +0 3449 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3685 +3865 0 3685 +3865 0 3683 +3865 0 3683 +3865 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3681 +3861 0 3681 +3861 0 3679 +3859 0 3677 +3857 0 3675 +3853 0 3671 +3849 0 3667 +3845 0 3661 +3837 0 3653 +3829 0 3643 +3815 0 3627 +3797 1635 3607 +3773 2217 3577 +3737 2525 3533 +3683 2755 3469 +3601 2947 3365 +3461 3121 3173 +3163 3281 2621 +0 3433 0 +0 3581 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3995 0 3813 +3993 0 3813 +3993 0 3811 +3991 0 3809 +3989 0 3807 +3985 0 3803 +3981 0 3799 +3977 0 3793 +3969 0 3785 +3961 0 3773 +3947 0 3759 +3929 1759 3737 +3905 2347 3707 +3869 2655 3665 +3815 2885 3599 +3733 3079 3495 +3593 3253 3303 +3295 3413 2749 +0 3565 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3935 +4095 0 3931 +4095 0 3925 +4095 0 3917 +4093 0 3905 +4079 0 3891 +4061 1886 3869 +4037 2477 3839 +4001 2787 3797 +3947 3017 3731 +3865 3211 3627 +3725 3385 3435 +3427 3545 2877 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4069 +4095 0 4067 +4095 0 4063 +4095 0 4057 +4095 0 4049 +4095 0 4037 +4095 0 4023 +4095 2014 4001 +4095 2609 3971 +4095 2919 3929 +4079 3149 3863 +3997 3343 3759 +3857 3517 3565 +3559 3677 3005 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2143 4095 +4095 2741 4095 +4095 3051 4059 +4095 3281 3995 +4095 3475 3891 +3989 3649 3697 +3691 3809 3135 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2273 4095 +4095 2871 4095 +4095 3183 4095 +4095 3413 4095 +4095 3607 4021 +4095 3781 3829 +3823 3941 3265 +1004 617 1393 +969 649 1381 +916 689 1366 +836 737 1344 +699 794 1313 +412 861 1269 +0 937 1201 +0 1022 1091 +0 1116 884 +0 1217 213 +0 1324 0 +0 1437 0 +0 1554 0 +0 1675 0 +0 1798 0 +0 1923 0 +0 2051 0 +0 2179 0 +0 2307 0 +0 2437 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1045 612 1405 +1013 645 1394 +966 685 1379 +895 733 1358 +777 791 1328 +549 858 1284 +0 935 1219 +0 1020 1114 +0 1114 920 +0 1216 354 +0 1323 0 +0 1436 0 +0 1554 0 +0 1674 0 +0 1798 0 +0 1923 0 +0 2051 0 +0 2179 0 +0 2307 0 +0 2437 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1095 605 1421 +1066 638 1410 +1025 679 1395 +963 728 1375 +864 786 1346 +684 854 1305 +209 931 1243 +0 1018 1144 +0 1112 965 +0 1214 493 +0 1322 0 +0 1435 0 +0 1553 0 +0 1674 0 +0 1797 0 +0 1923 0 +0 2049 0 +0 2179 0 +0 2307 0 +0 2437 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1154 596 1441 +1129 629 1431 +1093 671 1417 +1040 721 1397 +958 780 1370 +818 848 1331 +519 927 1272 +0 1014 1180 +0 1109 1018 +0 1211 630 +0 1320 0 +0 1434 0 +0 1552 0 +0 1673 0 +0 1796 0 +0 1922 0 +0 2049 0 +0 2179 0 +0 2307 0 +0 2437 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1223 583 1467 +1202 617 1457 +1171 660 1444 +1127 711 1426 +1060 771 1400 +952 841 1363 +750 920 1309 +121 1009 1225 +0 1105 1081 +0 1208 765 +0 1317 0 +0 1432 0 +0 1550 0 +0 1671 0 +0 1796 0 +0 1922 0 +0 2049 0 +0 2177 0 +0 2307 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1301 565 1499 +1283 601 1490 +1258 645 1478 +1222 697 1461 +1168 759 1437 +1085 831 1404 +944 912 1354 +639 1002 1279 +0 1099 1153 +0 1204 900 +0 1314 0 +0 1429 0 +0 1548 0 +0 1670 0 +0 1794 0 +0 1921 0 +0 2049 0 +0 2177 0 +0 2307 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1389 540 1539 +1374 578 1531 +1353 624 1520 +1324 679 1504 +1282 743 1483 +1219 817 1452 +1117 900 1408 +933 992 1342 +429 1091 1234 +0 1197 1034 +0 1309 419 +0 1425 0 +0 1545 0 +0 1668 0 +0 1793 0 +0 1919 0 +0 2047 0 +0 2177 0 +0 2307 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1484 504 1587 +1472 545 1580 +1456 594 1570 +1432 652 1556 +1400 721 1537 +1351 798 1510 +1278 885 1472 +1157 979 1415 +917 1081 1325 +0 1189 1167 +0 1303 802 +0 1420 0 +0 1541 0 +0 1665 0 +0 1790 0 +0 1918 0 +0 2046 0 +0 2175 0 +0 2305 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1587 451 1645 +1577 497 1639 +1564 551 1630 +1546 615 1618 +1520 688 1601 +1484 771 1578 +1430 862 1545 +1347 961 1497 +1204 1067 1423 +896 1178 1301 +0 1294 1059 +0 1414 0 +0 1536 0 +0 1661 0 +0 1788 0 +0 1915 0 +0 2044 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1695 369 1712 +1688 423 1707 +1678 486 1699 +1664 559 1689 +1644 641 1675 +1617 732 1655 +1577 831 1627 +1518 936 1587 +1425 1047 1528 +1261 1163 1434 +865 1282 1266 +0 1404 856 +0 1529 0 +0 1656 0 +0 1784 0 +0 1912 0 +0 2042 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1809 230 1789 +1803 301 1784 +1795 382 1778 +1785 472 1769 +1770 570 1757 +1749 675 1741 +1720 785 1718 +1678 900 1686 +1614 1019 1638 +1513 1141 1566 +1328 1266 1448 +821 1392 1216 +0 1520 219 +0 1649 0 +0 1778 0 +0 1908 0 +0 2039 0 +0 2171 0 +0 2301 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1927 0 1875 +1923 61 1871 +1917 191 1865 +1908 322 1858 +1897 453 1849 +1881 584 1835 +1860 716 1817 +1829 847 1791 +1785 979 1754 +1717 1111 1699 +1608 1243 1613 +1404 1375 1466 +754 1507 1139 +0 1639 0 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2049 0 1969 +2045 0 1966 +2040 0 1961 +2034 0 1955 +2025 225 1948 +2014 425 1937 +1998 602 1922 +1975 765 1902 +1943 919 1873 +1897 1067 1831 +1827 1210 1769 +1711 1351 1669 +1489 1489 1489 +646 1625 1009 +0 1761 0 +0 1896 0 +0 2029 0 +0 2163 0 +0 2297 0 +0 2429 0 +0 2561 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2173 0 2071 +2169 0 2067 +2165 0 2065 +2161 0 2059 +2155 0 2053 +2145 53 2045 +2135 386 2033 +2117 625 2017 +2095 824 1995 +2061 1000 1964 +2014 1162 1918 +1941 1316 1848 +1820 1464 1735 +1582 1607 1518 +443 1747 744 +0 1885 0 +0 2022 0 +0 2157 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2297 0 2177 +2295 0 2175 +2293 0 2173 +2289 0 2169 +2285 0 2165 +2279 0 2159 +2269 0 2149 +2257 327 2137 +2241 655 2119 +2217 892 2097 +2183 1090 2063 +2135 1265 2013 +2059 1428 1937 +1934 1581 1810 +1683 1728 1554 +0 1871 0 +0 2012 0 +0 2149 0 +0 2287 0 +0 2421 0 +0 2557 0 +0 2691 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2425 0 2291 +2423 0 2289 +2421 0 2287 +2419 0 2285 +2415 0 2281 +2411 0 2275 +2403 0 2269 +2395 0 2259 +2383 234 2247 +2365 691 2229 +2341 970 2203 +2307 1188 2167 +2257 1374 2115 +2181 1544 2033 +2051 1702 1894 +1790 1852 1599 +0 1998 0 +0 2139 0 +0 2279 0 +0 2417 0 +0 2553 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2553 0 2409 +2553 0 2407 +2551 0 2405 +2549 0 2403 +2547 0 2401 +2543 0 2397 +2537 0 2391 +2531 0 2383 +2521 0 2375 +2509 69 2361 +2491 735 2343 +2467 1057 2315 +2433 1292 2279 +2383 1489 2223 +2305 1663 2137 +2173 1825 1987 +1903 1978 1652 +0 2125 0 +0 2269 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2683 0 2529 +2683 0 2527 +2681 0 2527 +2679 0 2525 +2677 0 2523 +2675 0 2519 +2671 0 2515 +2667 0 2511 +2659 0 2503 +2651 0 2493 +2637 0 2479 +2619 789 2459 +2595 1152 2433 +2561 1403 2395 +2509 1607 2337 +2431 1786 2245 +2297 1951 2087 +2020 2105 1715 +0 2253 0 +0 2397 0 +0 2539 0 +0 2677 0 +0 2815 0 +0 2949 0 +0 3085 0 +0 3219 0 +0 3351 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2813 0 2653 +2813 0 2651 +2811 0 2651 +2811 0 2649 +2809 0 2647 +2807 0 2645 +2805 0 2643 +2801 0 2639 +2795 0 2633 +2789 0 2625 +2779 0 2615 +2767 0 2601 +2749 852 2581 +2725 1254 2553 +2689 1518 2513 +2637 1728 2455 +2557 1911 2361 +2423 2077 2193 +2141 2235 1787 +0 2383 0 +0 2529 0 +0 2669 0 +0 2809 0 +0 2945 0 +0 3081 0 +0 3217 0 +0 3351 0 +0 3483 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2943 0 2777 +2943 0 2777 +2943 0 2777 +2941 0 2775 +2941 0 2775 +2939 0 2773 +2937 0 2771 +2935 0 2767 +2931 0 2763 +2925 0 2757 +2919 0 2749 +2909 0 2739 +2897 0 2725 +2879 924 2705 +2855 1363 2677 +2819 1637 2635 +2767 1852 2575 +2687 2038 2479 +2549 2207 2305 +2263 2363 1869 +0 2513 0 +0 2659 0 +0 2801 0 +0 2939 0 +0 3077 0 +0 3213 0 +0 3347 0 +0 3483 0 +0 3615 0 +0 3749 0 +0 3883 0 +0 4015 0 +3075 0 2905 +3075 0 2905 +3073 0 2903 +3073 0 2903 +3073 0 2903 +3071 0 2901 +3069 0 2899 +3067 0 2897 +3065 0 2893 +3061 0 2889 +3055 0 2883 +3049 0 2875 +3039 0 2865 +3027 0 2851 +3009 1006 2831 +2985 1476 2801 +2949 1759 2761 +2897 1978 2699 +2815 2165 2601 +2679 2335 2423 +2389 2493 1959 +0 2645 0 +0 2791 0 +0 2931 0 +0 3071 0 +0 3209 0 +0 3345 0 +0 3479 0 +0 3615 0 +0 3747 0 +0 3881 0 +0 4015 0 +3205 0 3033 +3205 0 3033 +3205 0 3033 +3205 0 3031 +3205 0 3031 +3203 0 3031 +3203 0 3029 +3201 0 3027 +3199 0 3025 +3195 0 3021 +3193 0 3017 +3187 0 3011 +3181 0 3003 +3171 0 2993 +3157 0 2979 +3141 1096 2957 +3115 1594 2929 +3079 1883 2887 +3027 2105 2825 +2945 2295 2725 +2807 2465 2543 +2515 2625 2057 +0 2775 0 +0 2921 0 +0 3063 0 +0 3203 0 +0 3341 0 +0 3477 0 +0 3611 0 +0 3747 0 +0 3879 0 +0 4013 0 +3337 0 3163 +3337 0 3163 +3337 0 3161 +3337 0 3161 +3337 0 3161 +3335 0 3161 +3335 0 3159 +3333 0 3157 +3331 0 3155 +3329 0 3153 +3327 0 3151 +3323 0 3147 +3319 0 3141 +3311 0 3133 +3301 0 3121 +3289 0 3107 +3271 1194 3087 +3247 1715 3057 +3211 2010 3015 +3157 2233 2951 +3077 2425 2851 +2937 2595 2665 +2645 2755 2161 +0 2907 0 +0 3053 0 +0 3195 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3743 0 +0 3879 0 +0 4011 0 +3469 0 3293 +3469 0 3293 +3469 0 3291 +3469 0 3291 +3469 0 3291 +3467 0 3291 +3467 0 3289 +3467 0 3289 +3465 0 3287 +3463 0 3285 +3461 0 3283 +3459 0 3281 +3455 0 3275 +3449 0 3269 +3443 0 3263 +3433 0 3251 +3421 0 3237 +3403 1299 3215 +3377 1839 3187 +3341 2137 3143 +3289 2363 3079 +3207 2555 2977 +3069 2727 2791 +2773 2887 2273 +0 3039 0 +0 3185 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3875 0 +0 4011 0 +3601 0 3423 +3601 0 3423 +3601 0 3423 +3601 0 3423 +3601 0 3421 +3599 0 3421 +3599 0 3421 +3599 0 3421 +3597 0 3419 +3597 0 3417 +3595 0 3417 +3593 0 3413 +3591 0 3411 +3587 0 3407 +3581 0 3401 +3575 0 3393 +3565 0 3381 +3553 0 3367 +3535 1410 3345 +3509 1964 3317 +3473 2267 3273 +3421 2493 3209 +3339 2685 3107 +3199 2857 2917 +2903 3019 2389 +0 3169 0 +0 3317 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3733 0 3553 +3733 0 3553 +3733 0 3553 +3733 0 3553 +3733 0 3553 +3731 0 3553 +3731 0 3553 +3731 0 3551 +3731 0 3551 +3729 0 3551 +3729 0 3549 +3727 0 3547 +3725 0 3545 +3721 0 3541 +3719 0 3537 +3713 0 3531 +3707 0 3523 +3697 0 3513 +3683 0 3497 +3665 1525 3477 +3641 2091 3447 +3605 2395 3403 +3553 2625 3339 +3471 2817 3235 +3331 2989 3045 +3033 3149 2507 +0 3301 0 +0 3449 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3863 0 3683 +3861 0 3681 +3861 0 3679 +3859 0 3679 +3857 0 3675 +3853 0 3673 +3851 0 3669 +3845 0 3663 +3837 0 3655 +3829 0 3643 +3815 0 3629 +3797 1645 3607 +3773 2221 3577 +3737 2527 3535 +3683 2755 3469 +3601 2949 3367 +3463 3121 3175 +3165 3281 2629 +0 3433 0 +0 3581 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3815 +3997 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3995 0 3813 +3993 0 3813 +3993 0 3811 +3991 0 3809 +3989 0 3807 +3985 0 3803 +3981 0 3799 +3977 0 3793 +3969 0 3785 +3961 0 3775 +3947 0 3759 +3929 1767 3739 +3905 2349 3709 +3869 2657 3665 +3815 2887 3601 +3733 3079 3497 +3593 3253 3305 +3295 3413 2755 +0 3565 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3935 +4095 0 3931 +4095 0 3925 +4095 0 3917 +4093 0 3907 +4079 0 3891 +4061 1892 3869 +4037 2479 3841 +4001 2787 3797 +3947 3017 3733 +3865 3211 3627 +3725 3385 3435 +3427 3545 2881 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4067 +4095 0 4063 +4095 0 4057 +4095 0 4049 +4095 0 4037 +4095 0 4023 +4095 2018 4001 +4095 2611 3971 +4095 2919 3929 +4079 3149 3863 +3997 3343 3759 +3857 3517 3567 +3559 3677 3009 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2145 4095 +4095 2741 4095 +4095 3051 4061 +4095 3281 3995 +4095 3475 3891 +3989 3649 3697 +3691 3809 3137 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2275 4095 +4095 2873 4095 +4095 3183 4095 +4095 3413 4095 +4095 3607 4023 +4095 3781 3829 +3823 3941 3267 +1129 728 1524 +1102 753 1516 +1064 785 1504 +1008 824 1488 +919 872 1466 +763 929 1434 +407 995 1388 +0 1071 1319 +0 1156 1205 +0 1249 987 +0 1350 201 +0 1457 0 +0 1570 0 +0 1687 0 +0 1807 0 +0 1930 0 +0 2055 0 +0 2183 0 +0 2311 0 +0 2441 0 +0 2571 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1161 724 1533 +1136 750 1525 +1100 782 1514 +1048 821 1498 +968 869 1476 +832 926 1445 +544 993 1401 +0 1069 1333 +0 1154 1223 +0 1248 1016 +0 1349 345 +0 1456 0 +0 1569 0 +0 1686 0 +0 1807 0 +0 1930 0 +0 2055 0 +0 2183 0 +0 2311 0 +0 2441 0 +0 2569 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1200 719 1545 +1177 745 1537 +1145 777 1526 +1098 817 1511 +1026 865 1490 +909 923 1460 +681 990 1417 +0 1066 1351 +0 1152 1246 +0 1246 1052 +0 1348 486 +0 1455 0 +0 1568 0 +0 1686 0 +0 1806 0 +0 1930 0 +0 2055 0 +0 2183 0 +0 2311 0 +0 2439 0 +0 2569 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1248 711 1561 +1227 738 1553 +1198 770 1542 +1157 811 1528 +1095 860 1507 +996 918 1478 +816 986 1437 +341 1063 1375 +0 1149 1276 +0 1244 1097 +0 1346 625 +0 1454 0 +0 1567 0 +0 1685 0 +0 1806 0 +0 1929 0 +0 2055 0 +0 2183 0 +0 2311 0 +0 2439 0 +0 2569 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1304 701 1581 +1286 728 1573 +1261 762 1563 +1225 803 1549 +1172 853 1530 +1090 912 1502 +951 981 1463 +651 1058 1405 +0 1146 1312 +0 1241 1150 +0 1343 762 +0 1452 0 +0 1566 0 +0 1684 0 +0 1805 0 +0 1929 0 +0 2055 0 +0 2181 0 +0 2311 0 +0 2439 0 +0 2569 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1371 688 1606 +1355 715 1599 +1334 750 1589 +1303 792 1576 +1259 843 1558 +1192 903 1532 +1084 973 1496 +882 1052 1441 +253 1140 1357 +0 1237 1213 +0 1340 897 +0 1449 0 +0 1564 0 +0 1682 0 +0 1804 0 +0 1928 0 +0 2053 0 +0 2181 0 +0 2309 0 +0 2439 0 +0 2569 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1447 669 1638 +1434 697 1631 +1416 733 1622 +1390 777 1610 +1354 829 1593 +1301 891 1569 +1218 963 1536 +1076 1044 1486 +771 1134 1411 +0 1231 1285 +0 1336 1032 +0 1446 0 +0 1561 0 +0 1680 0 +0 1802 0 +0 1926 0 +0 2053 0 +0 2181 0 +0 2309 0 +0 2439 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1532 642 1677 +1521 672 1671 +1506 710 1663 +1485 756 1652 +1456 811 1636 +1414 875 1615 +1351 949 1585 +1249 1032 1541 +1065 1124 1474 +561 1224 1367 +0 1330 1166 +0 1441 551 +0 1557 0 +0 1677 0 +0 1800 0 +0 1925 0 +0 2051 0 +0 2179 0 +0 2309 0 +0 2439 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1625 603 1725 +1616 636 1720 +1604 677 1712 +1588 726 1702 +1565 785 1688 +1532 853 1669 +1484 930 1643 +1410 1017 1604 +1289 1111 1547 +1049 1213 1457 +0 1321 1300 +0 1435 934 +0 1552 0 +0 1673 0 +0 1797 0 +0 1923 0 +0 2049 0 +0 2179 0 +0 2307 0 +0 2437 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1726 546 1782 +1719 583 1777 +1709 629 1771 +1696 683 1762 +1678 747 1750 +1653 820 1733 +1616 903 1710 +1563 994 1677 +1479 1093 1629 +1336 1199 1555 +1028 1310 1433 +0 1426 1191 +0 1546 0 +0 1668 0 +0 1793 0 +0 1920 0 +0 2047 0 +0 2177 0 +0 2307 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1833 456 1848 +1827 501 1844 +1820 555 1839 +1810 618 1831 +1796 691 1821 +1776 774 1807 +1749 864 1787 +1709 963 1759 +1650 1068 1719 +1558 1179 1660 +1393 1295 1566 +997 1414 1398 +0 1537 988 +0 1661 0 +0 1788 0 +0 1916 0 +0 2045 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1946 299 1925 +1941 362 1921 +1935 433 1916 +1928 514 1910 +1917 604 1901 +1902 702 1889 +1881 807 1873 +1852 917 1850 +1810 1032 1818 +1746 1151 1771 +1645 1273 1698 +1460 1398 1580 +953 1524 1348 +0 1652 351 +0 1781 0 +0 1910 0 +0 2041 0 +0 2171 0 +0 2303 0 +0 2433 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2063 0 2010 +2059 63 2007 +2055 193 2003 +2049 323 1998 +2040 454 1990 +2029 585 1981 +2014 716 1967 +1992 848 1949 +1961 979 1923 +1917 1111 1886 +1850 1243 1831 +1740 1375 1745 +1536 1507 1598 +886 1639 1271 +0 1771 0 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2183 0 2103 +2181 0 2101 +2177 0 2097 +2173 0 2093 +2167 115 2087 +2157 358 2079 +2145 557 2069 +2129 734 2055 +2107 897 2034 +2075 1051 2005 +2029 1199 1964 +1959 1342 1901 +1843 1483 1801 +1621 1621 1621 +778 1758 1141 +0 1893 0 +0 2028 0 +0 2161 0 +0 2295 0 +0 2429 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2307 0 2205 +2305 0 2203 +2301 0 2199 +2299 0 2197 +2293 0 2191 +2287 0 2185 +2279 185 2177 +2267 518 2165 +2249 757 2149 +2227 956 2127 +2193 1132 2095 +2145 1295 2051 +2073 1448 1981 +1952 1596 1867 +1714 1739 1650 +575 1879 876 +0 2018 0 +0 2155 0 +0 2289 0 +0 2425 0 +0 2559 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2431 0 2311 +2429 0 2309 +2427 0 2307 +2425 0 2305 +2421 0 2301 +2417 0 2297 +2411 0 2291 +2401 0 2281 +2389 459 2269 +2373 787 2251 +2349 1024 2229 +2315 1222 2195 +2267 1398 2145 +2191 1560 2069 +2065 1713 1942 +1815 1860 1686 +0 2004 0 +0 2143 0 +0 2281 0 +0 2419 0 +0 2553 0 +0 2689 0 +0 2823 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2559 0 2425 +2557 0 2423 +2555 0 2421 +2553 0 2419 +2551 0 2417 +2547 0 2413 +2543 0 2407 +2535 0 2401 +2527 0 2391 +2515 366 2379 +2497 823 2361 +2473 1102 2335 +2439 1320 2299 +2389 1507 2247 +2313 1676 2165 +2183 1834 2026 +1923 1984 1731 +0 2129 0 +0 2271 0 +0 2411 0 +0 2549 0 +0 2685 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2687 0 2541 +2685 0 2541 +2685 0 2539 +2683 0 2537 +2681 0 2535 +2679 0 2533 +2675 0 2529 +2669 0 2523 +2663 0 2515 +2653 0 2507 +2641 201 2493 +2625 868 2475 +2599 1189 2449 +2565 1424 2411 +2515 1621 2355 +2437 1796 2269 +2305 1957 2119 +2035 2111 1784 +0 2257 0 +0 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2815 0 2661 +2815 0 2661 +2815 0 2659 +2813 0 2659 +2811 0 2657 +2809 0 2655 +2807 0 2651 +2803 0 2647 +2799 0 2643 +2791 0 2635 +2783 0 2625 +2769 0 2611 +2753 921 2591 +2727 1284 2565 +2693 1535 2527 +2641 1739 2469 +2563 1918 2379 +2429 2083 2219 +2153 2237 1847 +0 2387 0 +0 2531 0 +0 2671 0 +0 2809 0 +0 2947 0 +0 3081 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2945 0 2785 +2945 0 2785 +2945 0 2783 +2943 0 2783 +2943 0 2781 +2941 0 2779 +2939 0 2777 +2937 0 2775 +2933 0 2771 +2927 0 2765 +2921 0 2757 +2911 0 2747 +2899 0 2733 +2881 984 2713 +2857 1386 2685 +2821 1650 2645 +2769 1860 2587 +2689 2043 2493 +2555 2209 2325 +2273 2367 1919 +0 2515 0 +0 2661 0 +0 2801 0 +0 2941 0 +0 3077 0 +0 3213 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3077 0 2911 +3075 0 2909 +3075 0 2909 +3075 0 2909 +3073 0 2907 +3073 0 2907 +3071 0 2905 +3069 0 2903 +3067 0 2899 +3063 0 2895 +3057 0 2889 +3051 0 2881 +3041 0 2871 +3029 0 2857 +3011 1056 2837 +2987 1495 2809 +2951 1769 2767 +2899 1984 2707 +2819 2169 2611 +2683 2339 2439 +2395 2495 2001 +0 2645 0 +0 2791 0 +0 2933 0 +0 3071 0 +0 3209 0 +0 3345 0 +0 3481 0 +0 3615 0 +0 3747 0 +0 3881 0 +0 4015 0 +3207 0 3037 +3207 0 3037 +3207 0 3037 +3207 0 3035 +3205 0 3035 +3205 0 3035 +3203 0 3033 +3201 0 3031 +3199 0 3029 +3197 0 3025 +3193 0 3021 +3189 0 3015 +3181 0 3007 +3171 0 2997 +3159 0 2983 +3141 1138 2963 +3117 1608 2933 +3081 1891 2893 +3029 2111 2831 +2947 2297 2733 +2811 2467 2555 +2521 2625 2091 +0 2777 0 +0 2923 0 +0 3065 0 +0 3203 0 +0 3341 0 +0 3477 0 +0 3611 0 +0 3747 0 +0 3879 0 +0 4013 0 +3339 0 3165 +3339 0 3165 +3337 0 3165 +3337 0 3165 +3337 0 3163 +3337 0 3163 +3335 0 3163 +3335 0 3161 +3333 0 3159 +3331 0 3157 +3327 0 3153 +3325 0 3149 +3319 0 3143 +3313 0 3135 +3303 0 3125 +3289 0 3111 +3273 1228 3089 +3247 1726 3061 +3211 2015 3019 +3159 2237 2957 +3077 2427 2857 +2941 2597 2675 +2649 2757 2189 +0 2907 0 +0 3053 0 +0 3195 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3743 0 +0 3879 0 +0 4013 0 +3469 0 3295 +3469 0 3295 +3469 0 3295 +3469 0 3293 +3469 0 3293 +3469 0 3293 +3467 0 3293 +3467 0 3291 +3465 0 3289 +3465 0 3289 +3461 0 3285 +3459 0 3283 +3455 0 3279 +3451 0 3273 +3443 0 3265 +3435 0 3253 +3421 0 3239 +3403 1326 3219 +3379 1847 3189 +3343 2141 3147 +3291 2365 3083 +3209 2557 2983 +3071 2727 2797 +2777 2887 2295 +0 3039 0 +0 3185 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3875 0 +0 4011 0 +3601 0 3425 +3601 0 3425 +3601 0 3425 +3601 0 3423 +3601 0 3423 +3601 0 3423 +3599 0 3423 +3599 0 3421 +3599 0 3421 +3597 0 3419 +3595 0 3417 +3593 0 3415 +3591 0 3413 +3587 0 3407 +3581 0 3403 +3575 0 3395 +3565 0 3383 +3553 0 3369 +3535 1431 3347 +3509 1971 3319 +3473 2269 3275 +3421 2495 3213 +3339 2687 3109 +3201 2859 2923 +2905 3019 2405 +0 3171 0 +0 3317 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4007 0 +3733 0 3555 +3733 0 3555 +3733 0 3555 +3733 0 3555 +3733 0 3555 +3733 0 3555 +3731 0 3553 +3731 0 3553 +3731 0 3553 +3729 0 3551 +3729 0 3551 +3727 0 3549 +3725 0 3545 +3723 0 3543 +3719 0 3539 +3713 0 3533 +3707 0 3525 +3697 0 3513 +3685 0 3499 +3667 1542 3477 +3641 2097 3449 +3605 2399 3405 +3553 2625 3341 +3471 2817 3239 +3331 2991 3049 +3035 3151 2521 +0 3303 0 +0 3449 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3865 0 3685 +3863 0 3685 +3863 0 3683 +3863 0 3683 +3861 0 3683 +3861 0 3681 +3859 0 3679 +3857 0 3677 +3855 0 3673 +3851 0 3669 +3845 0 3663 +3839 0 3655 +3829 0 3645 +3815 0 3629 +3797 1658 3609 +3773 2223 3579 +3737 2527 3535 +3685 2757 3471 +3603 2949 3369 +3463 3121 3177 +3165 3281 2639 +0 3433 0 +0 3581 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3995 0 3817 +3995 0 3815 +3995 0 3815 +3995 0 3815 +3993 0 3813 +3993 0 3811 +3991 0 3811 +3989 0 3807 +3985 0 3805 +3983 0 3801 +3977 0 3795 +3971 0 3787 +3961 0 3775 +3947 0 3761 +3929 1777 3739 +3905 2353 3709 +3869 2659 3667 +3815 2887 3603 +3733 3081 3499 +3595 3253 3307 +3297 3413 2761 +0 3565 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3941 +4095 0 3939 +4095 0 3935 +4095 0 3931 +4095 0 3925 +4095 0 3917 +4093 0 3907 +4079 0 3891 +4061 1899 3871 +4037 2481 3841 +4001 2789 3797 +3947 3019 3733 +3865 3211 3629 +3727 3385 3437 +3429 3545 2887 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4067 +4095 0 4063 +4095 0 4057 +4095 0 4049 +4095 0 4039 +4095 0 4023 +4095 2024 4001 +4095 2611 3973 +4095 2919 3929 +4079 3149 3865 +3997 3343 3759 +3857 3517 3567 +3559 3677 3013 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2151 4095 +4095 2743 4095 +4095 3051 4061 +4095 3281 3995 +4095 3475 3891 +3989 3649 3699 +3691 3809 3141 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2277 4095 +4095 2873 4095 +4095 3183 4095 +4095 3413 4095 +4095 3607 4023 +4095 3781 3829 +3823 3941 3269 +1256 844 1656 +1236 863 1649 +1208 888 1641 +1167 920 1629 +1106 959 1613 +1010 1006 1590 +837 1063 1558 +399 1129 1511 +0 1204 1440 +0 1289 1323 +0 1382 1096 +0 1483 185 +0 1590 0 +0 1702 0 +0 1819 0 +0 1940 0 +0 2063 0 +0 2189 0 +0 2315 0 +0 2443 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1280 840 1662 +1261 860 1656 +1234 886 1648 +1196 917 1636 +1139 957 1620 +1050 1004 1598 +896 1061 1566 +539 1127 1520 +0 1203 1451 +0 1288 1337 +0 1381 1119 +0 1482 333 +0 1589 0 +0 1702 0 +0 1819 0 +0 1939 0 +0 2063 0 +0 2187 0 +0 2315 0 +0 2443 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1310 836 1671 +1293 856 1665 +1268 882 1657 +1233 914 1646 +1180 953 1630 +1100 1001 1608 +964 1058 1578 +676 1125 1533 +0 1201 1465 +0 1286 1355 +0 1380 1148 +0 1481 478 +0 1589 0 +0 1701 0 +0 1818 0 +0 1939 0 +0 2063 0 +0 2187 0 +0 2315 0 +0 2443 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1348 831 1683 +1332 851 1677 +1309 877 1669 +1277 909 1658 +1230 949 1643 +1159 997 1622 +1041 1055 1592 +813 1122 1549 +0 1199 1483 +0 1284 1378 +0 1378 1184 +0 1480 618 +0 1588 0 +0 1701 0 +0 1818 0 +0 1938 0 +0 2061 0 +0 2187 0 +0 2315 0 +0 2443 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1394 823 1698 +1380 844 1693 +1359 870 1685 +1331 903 1674 +1289 943 1660 +1227 992 1639 +1128 1050 1611 +948 1118 1569 +474 1195 1507 +0 1282 1408 +0 1376 1229 +0 1478 757 +0 1586 0 +0 1699 0 +0 1817 0 +0 1938 0 +0 2061 0 +0 2187 0 +0 2315 0 +0 2443 0 +0 2571 0 +0 2701 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1449 812 1718 +1437 834 1713 +1419 860 1705 +1393 894 1695 +1358 935 1681 +1305 985 1662 +1222 1044 1634 +1082 1112 1595 +784 1191 1537 +0 1278 1445 +0 1373 1282 +0 1476 894 +0 1584 0 +0 1698 0 +0 1816 0 +0 1937 0 +0 2061 0 +0 2187 0 +0 2313 0 +0 2443 0 +0 2571 0 +0 2701 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1514 798 1743 +1503 820 1738 +1487 847 1731 +1466 882 1721 +1435 924 1708 +1391 975 1690 +1324 1035 1664 +1216 1105 1628 +1014 1184 1574 +385 1273 1489 +0 1369 1345 +0 1472 1029 +0 1582 0 +0 1696 0 +0 1814 0 +0 1936 0 +0 2059 0 +0 2185 0 +0 2313 0 +0 2441 0 +0 2571 0 +0 2701 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1588 778 1775 +1579 801 1770 +1566 829 1763 +1548 865 1754 +1522 909 1742 +1486 962 1725 +1433 1023 1702 +1350 1095 1668 +1208 1176 1619 +903 1266 1543 +0 1363 1417 +0 1468 1164 +0 1578 0 +0 1693 0 +0 1812 0 +0 1934 0 +0 2059 0 +0 2185 0 +0 2313 0 +0 2441 0 +0 2571 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1672 750 1814 +1664 774 1809 +1653 804 1803 +1638 842 1795 +1617 888 1784 +1588 943 1768 +1546 1007 1747 +1483 1081 1717 +1382 1164 1673 +1197 1256 1606 +693 1356 1499 +0 1462 1298 +0 1573 683 +0 1689 0 +0 1809 0 +0 1932 0 +0 2057 0 +0 2183 0 +0 2311 0 +0 2441 0 +0 2571 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1764 709 1861 +1757 735 1857 +1748 768 1852 +1736 809 1844 +1720 858 1834 +1697 917 1821 +1664 985 1801 +1616 1062 1775 +1542 1149 1736 +1421 1243 1679 +1181 1345 1589 +0 1454 1432 +0 1567 1066 +0 1685 0 +0 1805 0 +0 1929 0 +0 2055 0 +0 2181 0 +0 2311 0 +0 2439 0 +0 2569 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1863 648 1918 +1858 678 1914 +1851 715 1909 +1841 761 1903 +1828 815 1894 +1810 879 1882 +1785 953 1865 +1748 1035 1842 +1695 1126 1809 +1611 1225 1761 +1469 1331 1687 +1160 1442 1565 +0 1558 1323 +0 1678 55 +0 1800 0 +0 1925 0 +0 2051 0 +0 2179 0 +0 2309 0 +0 2439 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1969 552 1984 +1965 588 1981 +1960 633 1976 +1952 687 1971 +1942 751 1963 +1928 824 1953 +1908 906 1939 +1881 997 1919 +1841 1095 1891 +1783 1200 1852 +1690 1311 1792 +1526 1427 1698 +1129 1546 1531 +0 1669 1120 +0 1793 0 +0 1920 0 +0 2047 0 +0 2177 0 +0 2307 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2081 379 2059 +2077 431 2057 +2073 494 2053 +2067 565 2049 +2059 647 2042 +2049 737 2033 +2034 834 2022 +2013 939 2005 +1984 1049 1982 +1942 1164 1950 +1879 1283 1903 +1777 1405 1831 +1592 1530 1712 +1085 1656 1480 +0 1784 483 +0 1913 0 +0 2042 0 +0 2173 0 +0 2303 0 +0 2435 0 +0 2565 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2197 0 2143 +2195 67 2141 +2191 195 2139 +2187 325 2135 +2181 455 2129 +2173 586 2123 +2161 717 2113 +2145 848 2099 +2125 980 2081 +2093 1111 2055 +2049 1243 2018 +1982 1375 1963 +1873 1507 1878 +1668 1639 1730 +1018 1771 1403 +0 1903 0 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2317 0 2237 +2315 0 2235 +2313 0 2233 +2309 0 2229 +2305 0 2225 +2299 247 2219 +2289 490 2211 +2279 689 2201 +2261 866 2187 +2239 1029 2167 +2207 1183 2137 +2161 1331 2095 +2091 1474 2033 +1975 1615 1934 +1753 1753 1753 +910 1890 1273 +0 2025 0 +0 2159 0 +0 2293 0 +0 2427 0 +0 2561 0 +0 2693 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2439 0 2337 +2439 0 2337 +2437 0 2335 +2433 0 2331 +2431 0 2329 +2425 0 2323 +2419 0 2317 +2411 317 2309 +2399 650 2297 +2381 890 2281 +2359 1088 2259 +2325 1264 2229 +2279 1427 2183 +2205 1580 2113 +2085 1728 1999 +1846 1871 1782 +707 2011 1008 +0 2149 0 +0 2287 0 +0 2421 0 +0 2557 0 +0 2691 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2565 0 2445 +2563 0 2443 +2563 0 2443 +2561 0 2441 +2557 0 2437 +2553 0 2433 +2549 0 2429 +2543 0 2423 +2533 0 2413 +2521 591 2401 +2505 919 2385 +2481 1156 2361 +2447 1354 2327 +2399 1530 2277 +2323 1692 2201 +2199 1845 2075 +1947 1993 1818 +74 2135 0 +0 2275 0 +0 2415 0 +0 2551 0 +0 2687 0 +0 2821 0 +0 2955 0 +0 3087 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2691 0 2557 +2691 0 2557 +2689 0 2555 +2687 0 2553 +2685 0 2551 +2683 0 2549 +2679 0 2545 +2675 0 2539 +2669 0 2533 +2659 0 2523 +2647 498 2511 +2629 955 2493 +2605 1234 2467 +2571 1452 2431 +2521 1639 2379 +2445 1808 2297 +2315 1966 2159 +2055 2117 1863 +0 2261 0 +0 2403 0 +0 2543 0 +0 2681 0 +0 2817 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2819 0 2673 +2819 0 2673 +2817 0 2673 +2817 0 2671 +2815 0 2669 +2813 0 2667 +2811 0 2665 +2807 0 2661 +2801 0 2655 +2795 0 2649 +2787 0 2639 +2773 333 2625 +2757 1000 2607 +2731 1321 2581 +2697 1556 2543 +2647 1753 2487 +2569 1928 2401 +2437 2089 2251 +2167 2243 1916 +0 2389 0 +0 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2949 0 2795 +2947 0 2793 +2947 0 2793 +2947 0 2793 +2945 0 2791 +2943 0 2789 +2941 0 2787 +2939 0 2783 +2935 0 2779 +2931 0 2775 +2923 0 2767 +2915 0 2757 +2901 0 2743 +2885 1053 2725 +2859 1416 2697 +2825 1667 2659 +2773 1871 2601 +2695 2051 2511 +2561 2215 2351 +2285 2369 1979 +0 2519 0 +0 2663 0 +0 2803 0 +0 2941 0 +0 3079 0 +0 3213 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3079 0 2917 +3077 0 2917 +3077 0 2917 +3077 0 2915 +3075 0 2915 +3075 0 2913 +3073 0 2911 +3071 0 2909 +3069 0 2907 +3065 0 2903 +3059 0 2897 +3053 0 2889 +3043 0 2879 +3031 0 2865 +3013 1116 2845 +2989 1518 2817 +2953 1782 2777 +2901 1992 2719 +2821 2175 2625 +2687 2341 2459 +2405 2499 2051 +0 2647 0 +0 2793 0 +0 2933 0 +0 3073 0 +0 3209 0 +0 3345 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3209 0 3043 +3209 0 3043 +3209 0 3041 +3207 0 3041 +3207 0 3041 +3207 0 3039 +3205 0 3039 +3203 0 3037 +3201 0 3035 +3199 0 3031 +3195 0 3027 +3189 0 3021 +3183 0 3013 +3173 0 3003 +3161 0 2989 +3143 1188 2969 +3119 1627 2941 +3083 1901 2901 +3031 2117 2839 +2951 2301 2743 +2815 2471 2571 +2527 2627 2133 +0 2777 0 +0 2923 0 +0 3065 0 +0 3203 0 +0 3341 0 +0 3477 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3339 0 3169 +3339 0 3169 +3339 0 3169 +3339 0 3169 +3339 0 3169 +3337 0 3167 +3337 0 3167 +3335 0 3165 +3333 0 3163 +3331 0 3161 +3329 0 3157 +3325 0 3153 +3321 0 3147 +3313 0 3141 +3305 0 3129 +3291 0 3115 +3273 1270 3095 +3249 1740 3067 +3213 2023 3025 +3161 2243 2963 +3079 2429 2865 +2943 2599 2687 +2653 2757 2223 +0 2909 0 +0 3055 0 +0 3197 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3745 0 +0 3879 0 +0 4013 0 +3471 0 3297 +3471 0 3297 +3471 0 3297 +3469 0 3297 +3469 0 3297 +3469 0 3297 +3469 0 3295 +3467 0 3295 +3467 0 3293 +3465 0 3291 +3463 0 3289 +3461 0 3285 +3457 0 3281 +3451 0 3275 +3445 0 3267 +3435 0 3257 +3423 0 3243 +3405 1360 3221 +3379 1858 3193 +3343 2147 3151 +3291 2369 3089 +3211 2559 2989 +3073 2729 2807 +2781 2889 2321 +0 3039 0 +0 3185 0 +0 3327 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3877 0 +0 4011 0 +3601 0 3427 +3601 0 3427 +3601 0 3427 +3601 0 3427 +3601 0 3427 +3601 0 3425 +3601 0 3425 +3599 0 3425 +3599 0 3423 +3597 0 3423 +3597 0 3421 +3595 0 3417 +3591 0 3415 +3587 0 3411 +3583 0 3405 +3575 0 3397 +3567 0 3385 +3553 0 3371 +3535 1458 3351 +3511 1979 3321 +3475 2273 3279 +3423 2499 3215 +3341 2689 3115 +3203 2861 2929 +2909 3019 2427 +0 3171 0 +0 3317 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4009 0 +3733 0 3557 +3733 0 3557 +3733 0 3557 +3733 0 3557 +3733 0 3557 +3733 0 3555 +3733 0 3555 +3731 0 3555 +3731 0 3555 +3731 0 3553 +3729 0 3551 +3727 0 3551 +3725 0 3547 +3723 0 3545 +3719 0 3541 +3713 0 3535 +3707 0 3527 +3697 0 3515 +3685 0 3501 +3667 1564 3479 +3641 2103 3451 +3607 2401 3409 +3553 2627 3345 +3471 2819 3243 +3333 2991 3055 +3037 3151 2537 +0 3303 0 +0 3449 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3687 +3865 0 3687 +3865 0 3687 +3865 0 3687 +3865 0 3687 +3865 0 3687 +3865 0 3687 +3865 0 3685 +3863 0 3685 +3863 0 3685 +3863 0 3683 +3861 0 3683 +3859 0 3681 +3857 0 3677 +3855 0 3675 +3851 0 3671 +3845 0 3665 +3839 0 3657 +3829 0 3645 +3817 0 3631 +3799 1674 3609 +3773 2229 3581 +3737 2531 3537 +3685 2757 3473 +3603 2949 3371 +3463 3123 3181 +3167 3283 2653 +0 3435 0 +0 3581 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3819 +3997 0 3819 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3997 0 3817 +3995 0 3817 +3995 0 3817 +3995 0 3815 +3993 0 3815 +3993 0 3813 +3991 0 3811 +3989 0 3809 +3987 0 3805 +3983 0 3801 +3977 0 3795 +3971 0 3787 +3961 0 3777 +3949 0 3761 +3931 1790 3741 +3905 2355 3711 +3869 2661 3669 +3817 2889 3603 +3735 3081 3501 +3595 3253 3311 +3299 3413 2771 +0 3567 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3945 +4095 0 3943 +4095 0 3939 +4095 0 3937 +4095 0 3933 +4095 0 3927 +4095 0 3919 +4093 0 3907 +4079 0 3893 +4061 1909 3871 +4037 2485 3841 +4001 2791 3799 +3949 3019 3735 +3867 3213 3631 +3727 3385 3439 +3429 3545 2893 +0 3697 0 +0 3845 0 +0 3987 0 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4071 +4095 0 4069 +4095 0 4063 +4095 0 4057 +4095 0 4049 +4095 0 4039 +4095 0 4023 +4095 2031 4003 +4095 2613 3973 +4095 2921 3929 +4079 3151 3865 +3997 3343 3761 +3859 3517 3569 +3561 3677 3019 +0 3829 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2155 4095 +4095 2743 4095 +4095 3053 4061 +4095 3283 3997 +4095 3475 3893 +3989 3649 3699 +3691 3809 3145 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2283 4095 +4095 2875 4095 +4095 3183 4095 +4095 3413 4095 +4095 3607 4023 +4095 3781 3831 +3823 3941 3273 +1384 963 1787 +1369 978 1782 +1348 998 1776 +1319 1023 1767 +1276 1054 1755 +1212 1093 1739 +1109 1140 1716 +920 1196 1684 +388 1262 1636 +0 1338 1564 +0 1422 1444 +0 1515 1210 +0 1616 161 +0 1723 0 +0 1835 0 +0 1952 0 +0 2071 0 +0 2195 0 +0 2321 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1402 960 1792 +1388 976 1788 +1368 995 1781 +1340 1020 1773 +1299 1052 1761 +1238 1091 1745 +1142 1138 1722 +969 1195 1690 +531 1261 1643 +0 1337 1572 +0 1421 1455 +0 1514 1228 +0 1615 317 +0 1722 0 +0 1835 0 +0 1951 0 +0 2071 0 +0 2195 0 +0 2321 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1426 957 1799 +1412 973 1795 +1393 992 1788 +1367 1018 1780 +1328 1049 1768 +1272 1088 1752 +1183 1136 1730 +1027 1193 1699 +671 1259 1653 +0 1335 1583 +0 1420 1469 +0 1513 1251 +0 1614 465 +0 1722 0 +0 1834 0 +0 1951 0 +0 2071 0 +0 2195 0 +0 2319 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1455 953 1808 +1443 968 1804 +1425 988 1797 +1400 1014 1789 +1365 1046 1778 +1313 1085 1762 +1232 1133 1740 +1096 1190 1710 +809 1257 1665 +0 1333 1597 +0 1419 1487 +0 1512 1280 +0 1613 610 +0 1721 0 +0 1834 0 +0 1951 0 +0 2071 0 +0 2195 0 +0 2319 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1492 947 1820 +1480 963 1815 +1464 983 1809 +1441 1009 1801 +1409 1041 1790 +1362 1081 1775 +1291 1129 1754 +1173 1187 1724 +945 1254 1681 +8 1331 1616 +0 1416 1511 +0 1511 1317 +0 1612 750 +0 1720 0 +0 1833 0 +0 1950 0 +0 2071 0 +0 2195 0 +0 2319 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1537 939 1835 +1526 955 1831 +1512 976 1825 +1491 1002 1817 +1463 1034 1806 +1421 1075 1792 +1359 1124 1771 +1260 1182 1743 +1080 1250 1701 +606 1327 1639 +0 1414 1540 +0 1508 1361 +0 1610 889 +0 1718 0 +0 1832 0 +0 1949 0 +0 2069 0 +0 2193 0 +0 2319 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1591 928 1854 +1582 945 1850 +1569 966 1845 +1551 992 1837 +1526 1026 1827 +1490 1067 1813 +1437 1117 1794 +1354 1176 1767 +1215 1245 1727 +916 1323 1669 +0 1410 1577 +0 1505 1414 +0 1608 1026 +0 1716 0 +0 1830 0 +0 1948 0 +0 2069 0 +0 2193 0 +0 2319 0 +0 2445 0 +0 2575 0 +0 2703 0 +0 2833 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1654 913 1879 +1646 930 1875 +1635 952 1870 +1620 979 1863 +1598 1014 1854 +1568 1056 1840 +1523 1107 1822 +1457 1167 1796 +1348 1237 1760 +1146 1317 1706 +517 1405 1621 +0 1501 1477 +0 1604 1161 +0 1714 0 +0 1828 0 +0 1946 0 +0 2067 0 +0 2191 0 +0 2317 0 +0 2445 0 +0 2575 0 +0 2703 0 +0 2833 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1727 892 1910 +1720 910 1907 +1711 933 1902 +1698 962 1895 +1680 997 1886 +1654 1041 1874 +1618 1093 1857 +1565 1156 1834 +1482 1227 1800 +1340 1308 1751 +1035 1398 1675 +0 1495 1549 +0 1600 1296 +0 1710 0 +0 1825 0 +0 1944 0 +0 2067 0 +0 2191 0 +0 2317 0 +0 2445 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1810 863 1949 +1804 882 1946 +1796 906 1941 +1785 936 1935 +1770 974 1927 +1750 1020 1916 +1720 1075 1901 +1678 1139 1879 +1615 1213 1849 +1514 1297 1805 +1329 1388 1738 +825 1488 1631 +0 1594 1430 +0 1705 815 +0 1822 0 +0 1941 0 +0 2065 0 +0 2189 0 +0 2315 0 +0 2443 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1900 820 1996 +1896 841 1993 +1889 868 1989 +1880 900 1984 +1868 941 1976 +1852 990 1966 +1829 1049 1953 +1796 1117 1934 +1748 1194 1907 +1674 1281 1868 +1553 1375 1811 +1314 1477 1721 +121 1586 1564 +0 1699 1198 +0 1817 0 +0 1938 0 +0 2061 0 +0 2187 0 +0 2315 0 +0 2443 0 +0 2571 0 +0 2701 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1999 757 2053 +1995 780 2049 +1990 810 2046 +1983 848 2041 +1973 893 2035 +1960 947 2026 +1942 1011 2014 +1917 1084 1998 +1881 1167 1974 +1827 1258 1941 +1743 1357 1893 +1601 1463 1819 +1292 1574 1697 +0 1690 1455 +0 1810 187 +0 1932 0 +0 2057 0 +0 2183 0 +0 2311 0 +0 2441 0 +0 2571 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2105 654 2119 +2101 684 2115 +2097 721 2113 +2091 765 2109 +2085 819 2103 +2075 883 2095 +2059 956 2085 +2040 1038 2071 +2013 1128 2051 +1974 1227 2024 +1915 1332 1984 +1822 1443 1924 +1658 1559 1830 +1261 1678 1663 +0 1801 1252 +0 1926 0 +0 2053 0 +0 2179 0 +0 2309 0 +0 2439 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2215 467 2193 +2213 511 2191 +2209 563 2189 +2205 626 2185 +2199 698 2181 +2191 779 2175 +2181 869 2165 +2167 966 2153 +2145 1071 2137 +2117 1181 2115 +2075 1296 2083 +2011 1415 2035 +1909 1538 1963 +1724 1662 1844 +1217 1788 1612 +0 1916 615 +0 2045 0 +0 2175 0 +0 2305 0 +0 2435 0 +0 2567 0 +0 2697 0 +0 2829 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2331 0 2277 +2329 71 2277 +2327 199 2273 +2323 327 2271 +2319 457 2267 +2313 587 2261 +2305 718 2255 +2293 849 2245 +2277 980 2231 +2257 1112 2213 +2225 1243 2187 +2181 1375 2151 +2113 1507 2095 +2005 1639 2010 +1800 1771 1862 +1150 1903 1535 +0 2035 0 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2451 0 2371 +2449 0 2369 +2447 0 2367 +2445 0 2365 +2441 0 2361 +2437 40 2357 +2431 379 2351 +2421 622 2345 +2411 822 2333 +2395 999 2319 +2371 1161 2299 +2339 1315 2269 +2293 1463 2227 +2223 1606 2165 +2107 1747 2065 +1885 1885 1885 +1042 2022 1405 +0 2157 0 +0 2291 0 +0 2425 0 +0 2559 0 +0 2693 0 +0 2825 0 +0 2959 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2573 0 2471 +2571 0 2469 +2571 0 2469 +2569 0 2467 +2565 0 2463 +2563 0 2461 +2557 0 2455 +2551 0 2449 +2543 449 2441 +2531 782 2429 +2513 1022 2413 +2491 1220 2391 +2459 1396 2361 +2411 1559 2315 +2337 1712 2245 +2217 1860 2131 +1979 2003 1914 +839 2143 1140 +0 2281 0 +0 2419 0 +0 2553 0 +0 2689 0 +0 2823 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2697 0 2577 +2697 0 2577 +2695 0 2575 +2695 0 2575 +2693 0 2573 +2689 0 2569 +2687 0 2565 +2681 0 2561 +2675 0 2555 +2665 12 2545 +2653 723 2533 +2637 1051 2517 +2613 1289 2493 +2579 1486 2459 +2531 1662 2409 +2455 1824 2333 +2331 1977 2207 +2079 2125 1951 +206 2267 0 +0 2409 0 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2825 0 2689 +2823 0 2689 +2823 0 2689 +2821 0 2687 +2821 0 2685 +2819 0 2683 +2815 0 2681 +2811 0 2677 +2807 0 2671 +2801 0 2665 +2791 0 2655 +2779 630 2643 +2761 1087 2625 +2737 1366 2599 +2703 1584 2563 +2653 1771 2511 +2577 1940 2429 +2449 2099 2291 +2187 2249 1995 +0 2395 0 +0 2535 0 +0 2675 0 +0 2813 0 +0 2949 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +2953 0 2807 +2951 0 2807 +2951 0 2805 +2951 0 2805 +2949 0 2803 +2947 0 2801 +2945 0 2799 +2943 0 2797 +2939 0 2793 +2935 0 2787 +2927 0 2781 +2919 0 2771 +2905 465 2757 +2889 1132 2739 +2865 1453 2713 +2829 1689 2675 +2779 1885 2619 +2701 2059 2533 +2569 2221 2383 +2299 2375 2049 +0 2521 0 +0 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3081 0 2927 +3081 0 2927 +3081 0 2925 +3079 0 2925 +3079 0 2925 +3077 0 2923 +3075 0 2921 +3073 0 2919 +3071 0 2917 +3067 0 2913 +3063 0 2907 +3055 0 2899 +3047 0 2889 +3033 66 2875 +3017 1185 2857 +2991 1548 2829 +2957 1799 2791 +2905 2003 2733 +2827 2183 2643 +2693 2347 2483 +2417 2501 2111 +0 2651 0 +0 2795 0 +0 2935 0 +0 3073 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3211 0 3049 +3211 0 3049 +3211 0 3049 +3209 0 3049 +3209 0 3047 +3209 0 3047 +3207 0 3045 +3205 0 3043 +3203 0 3041 +3201 0 3039 +3197 0 3035 +3191 0 3029 +3185 0 3021 +3175 0 3011 +3163 0 2997 +3145 1248 2977 +3121 1651 2949 +3085 1914 2909 +3033 2125 2851 +2955 2307 2757 +2819 2475 2591 +2537 2631 2183 +0 2779 0 +0 2925 0 +0 3065 0 +0 3205 0 +0 3341 0 +0 3477 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3341 0 3175 +3341 0 3175 +3341 0 3175 +3341 0 3173 +3339 0 3173 +3339 0 3173 +3339 0 3171 +3337 0 3171 +3335 0 3169 +3333 0 3167 +3331 0 3163 +3327 0 3159 +3321 0 3153 +3315 0 3145 +3305 0 3135 +3293 0 3121 +3275 1320 3101 +3251 1759 3073 +3215 2033 3033 +3163 2249 2971 +3083 2435 2875 +2947 2603 2703 +2661 2759 2265 +0 2911 0 +0 3055 0 +0 3197 0 +0 3337 0 +0 3473 0 +0 3609 0 +0 3745 0 +0 3879 0 +0 4013 0 +3471 0 3301 +3471 0 3301 +3471 0 3301 +3471 0 3301 +3471 0 3301 +3471 0 3301 +3469 0 3299 +3469 0 3299 +3467 0 3297 +3467 0 3295 +3463 0 3293 +3461 0 3289 +3457 0 3285 +3453 0 3279 +3445 0 3273 +3437 0 3261 +3423 0 3247 +3405 1402 3227 +3381 1873 3199 +3345 2155 3157 +3293 2375 3095 +3213 2563 2997 +3075 2731 2819 +2785 2891 2355 +0 3041 0 +0 3187 0 +0 3329 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3877 0 +0 4011 0 +3603 0 3429 +3603 0 3429 +3603 0 3429 +3603 0 3429 +3603 0 3429 +3601 0 3429 +3601 0 3429 +3601 0 3427 +3599 0 3427 +3599 0 3425 +3597 0 3423 +3595 0 3421 +3593 0 3417 +3589 0 3413 +3583 0 3407 +3577 0 3399 +3567 0 3389 +3555 0 3375 +3537 1492 3355 +3511 1990 3325 +3475 2279 3283 +3423 2501 3221 +3343 2691 3121 +3205 2861 2939 +2913 3021 2453 +0 3171 0 +0 3317 0 +0 3459 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4009 0 +3735 0 3559 +3735 0 3559 +3735 0 3559 +3733 0 3559 +3733 0 3559 +3733 0 3559 +3733 0 3557 +3733 0 3557 +3731 0 3557 +3731 0 3555 +3729 0 3555 +3729 0 3553 +3727 0 3551 +3723 0 3547 +3719 0 3543 +3715 0 3537 +3707 0 3529 +3699 0 3517 +3685 0 3503 +3667 1591 3483 +3643 2111 3453 +3607 2405 3411 +3555 2631 3347 +3473 2821 3247 +3335 2993 3063 +3041 3151 2559 +0 3303 0 +0 3449 0 +0 3591 0 +0 3731 0 +0 3869 0 +0 4005 0 +3865 0 3689 +3865 0 3689 +3865 0 3689 +3865 0 3689 +3865 0 3689 +3865 0 3689 +3865 0 3687 +3865 0 3687 +3865 0 3687 +3863 0 3687 +3863 0 3685 +3861 0 3683 +3859 0 3683 +3857 0 3679 +3855 0 3677 +3851 0 3673 +3847 0 3667 +3839 0 3659 +3829 0 3647 +3817 0 3633 +3799 1696 3611 +3773 2235 3583 +3739 2533 3541 +3685 2759 3477 +3603 2951 3375 +3465 3123 3187 +3169 3283 2669 +0 3435 0 +0 3581 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3819 +3997 0 3819 +3997 0 3819 +3997 0 3819 +3997 0 3819 +3997 0 3819 +3997 0 3819 +3997 0 3819 +3997 0 3817 +3995 0 3817 +3995 0 3817 +3995 0 3815 +3993 0 3815 +3991 0 3813 +3989 0 3811 +3987 0 3807 +3983 0 3803 +3977 0 3797 +3971 0 3789 +3961 0 3777 +3949 0 3763 +3931 1806 3741 +3905 2361 3713 +3869 2663 3669 +3817 2889 3605 +3735 3083 3503 +3595 3255 3315 +3299 3415 2785 +0 3567 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3949 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3943 +4095 0 3941 +4095 0 3937 +4095 0 3933 +4095 0 3927 +4095 0 3919 +4093 0 3909 +4081 0 3893 +4063 1922 3873 +4037 2487 3843 +4001 2793 3801 +3949 3021 3735 +3867 3213 3633 +3727 3385 3443 +3431 3547 2903 +0 3699 0 +0 3845 0 +0 3987 0 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4079 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4069 +4095 0 4065 +4095 0 4059 +4095 0 4051 +4095 0 4039 +4095 0 4025 +4095 2041 4003 +4095 2617 3973 +4095 2923 3931 +4081 3151 3867 +3999 3345 3763 +3859 3517 3571 +3561 3677 3025 +0 3831 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2163 4095 +4095 2745 4095 +4095 3053 4063 +4095 3283 3997 +4095 3477 3893 +3991 3649 3701 +3693 3809 3151 +0 3961 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2287 4095 +4095 2875 4095 +4095 3185 4095 +4095 3415 4095 +4095 3607 4025 +4095 3781 3831 +3823 3941 3277 +1513 1085 1919 +1502 1096 1915 +1486 1112 1911 +1465 1131 1904 +1434 1156 1895 +1390 1187 1883 +1323 1226 1867 +1214 1273 1844 +1011 1329 1811 +373 1395 1763 +0 1470 1689 +0 1555 1568 +0 1648 1328 +0 1748 128 +0 1855 0 +0 1967 0 +0 2085 0 +0 2205 0 +0 2327 0 +0 2453 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +1527 1083 1923 +1516 1095 1919 +1501 1110 1915 +1480 1129 1908 +1451 1154 1899 +1408 1186 1888 +1344 1225 1871 +1241 1272 1848 +1052 1328 1816 +520 1394 1768 +0 1470 1696 +0 1554 1576 +0 1647 1342 +0 1748 294 +0 1855 0 +0 1967 0 +0 2083 0 +0 2205 0 +0 2327 0 +0 2453 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +1545 1080 1928 +1534 1092 1924 +1520 1108 1920 +1500 1127 1913 +1472 1152 1905 +1431 1184 1893 +1370 1223 1877 +1274 1270 1854 +1101 1327 1822 +663 1393 1775 +0 1469 1704 +0 1553 1587 +0 1647 1360 +0 1747 449 +0 1854 0 +0 1967 0 +0 2083 0 +0 2203 0 +0 2327 0 +0 2453 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +1568 1077 1935 +1558 1089 1931 +1544 1104 1927 +1525 1124 1920 +1499 1150 1912 +1460 1181 1900 +1404 1221 1884 +1315 1268 1862 +1160 1325 1831 +803 1391 1785 +0 1467 1715 +0 1552 1601 +0 1646 1383 +0 1746 597 +0 1854 0 +0 1966 0 +0 2083 0 +0 2203 0 +0 2327 0 +0 2453 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +1597 1073 1944 +1588 1085 1940 +1575 1100 1936 +1557 1120 1930 +1532 1146 1921 +1497 1178 1910 +1445 1217 1894 +1364 1265 1873 +1228 1322 1842 +941 1389 1797 +0 1465 1729 +0 1551 1619 +0 1644 1412 +0 1745 742 +0 1853 0 +0 1966 0 +0 2083 0 +0 2203 0 +0 2327 0 +0 2451 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +1633 1067 1955 +1624 1079 1952 +1613 1095 1947 +1596 1115 1942 +1574 1141 1933 +1541 1173 1922 +1494 1213 1907 +1423 1261 1886 +1305 1319 1856 +1077 1386 1813 +140 1463 1748 +0 1549 1643 +0 1643 1449 +0 1744 883 +0 1852 0 +0 1965 0 +0 2083 0 +0 2203 0 +0 2327 0 +0 2451 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1677 1058 1970 +1669 1071 1967 +1659 1087 1963 +1644 1108 1957 +1624 1134 1949 +1595 1167 1939 +1553 1207 1924 +1491 1256 1904 +1392 1314 1875 +1212 1382 1833 +738 1459 1771 +0 1546 1672 +0 1640 1493 +0 1742 1021 +0 1850 0 +0 1964 0 +0 2081 0 +0 2203 0 +0 2325 0 +0 2451 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1730 1047 1990 +1723 1060 1987 +1714 1076 1982 +1701 1098 1977 +1683 1124 1969 +1658 1158 1959 +1622 1199 1945 +1569 1249 1926 +1487 1308 1899 +1347 1377 1859 +1048 1455 1801 +0 1542 1709 +0 1637 1546 +0 1740 1158 +0 1848 0 +0 1962 0 +0 2081 0 +0 2201 0 +0 2325 0 +0 2451 0 +0 2579 0 +0 2707 0 +0 2835 0 +0 2965 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1793 1032 2014 +1787 1045 2011 +1778 1062 2008 +1767 1084 2002 +1752 1111 1995 +1730 1146 1986 +1700 1188 1972 +1655 1239 1954 +1589 1299 1929 +1481 1369 1892 +1278 1449 1838 +650 1537 1754 +0 1633 1609 +0 1736 1294 +0 1846 0 +0 1960 0 +0 2079 0 +0 2201 0 +0 2325 0 +0 2451 0 +0 2577 0 +0 2707 0 +0 2835 0 +0 2965 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1865 1011 2045 +1860 1024 2043 +1853 1042 2039 +1843 1065 2034 +1830 1093 2028 +1812 1129 2019 +1787 1173 2006 +1750 1226 1989 +1697 1288 1966 +1614 1359 1932 +1472 1440 1883 +1167 1530 1807 +0 1628 1681 +0 1732 1428 +0 1842 0 +0 1957 0 +0 2077 0 +0 2199 0 +0 2323 0 +0 2449 0 +0 2577 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +1946 980 2083 +1942 995 2081 +1936 1014 2077 +1928 1038 2073 +1917 1068 2067 +1902 1106 2059 +1882 1152 2049 +1853 1207 2033 +1810 1271 2011 +1747 1345 1981 +1646 1429 1937 +1461 1520 1870 +957 1620 1763 +0 1726 1562 +0 1838 947 +0 1954 0 +0 2073 0 +0 2197 0 +0 2321 0 +0 2447 0 +0 2575 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2036 936 2131 +2033 953 2129 +2028 973 2125 +2021 1000 2121 +2013 1032 2115 +2001 1073 2109 +1984 1122 2099 +1961 1181 2085 +1928 1249 2065 +1880 1326 2039 +1807 1413 2000 +1685 1508 1943 +1446 1610 1853 +253 1718 1696 +0 1831 1330 +0 1949 0 +0 2069 0 +0 2193 0 +0 2319 0 +0 2447 0 +0 2575 0 +0 2703 0 +0 2833 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2135 870 2187 +2131 889 2185 +2127 913 2181 +2123 942 2179 +2115 980 2173 +2105 1025 2167 +2093 1079 2159 +2075 1143 2147 +2049 1217 2129 +2013 1299 2107 +1959 1391 2073 +1876 1490 2025 +1733 1595 1951 +1424 1707 1829 +0 1822 1587 +0 1942 319 +0 2065 0 +0 2189 0 +0 2317 0 +0 2443 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2239 763 2251 +2237 786 2251 +2233 816 2247 +2229 853 2245 +2223 898 2241 +2217 952 2235 +2207 1015 2227 +2193 1088 2217 +2173 1170 2203 +2145 1261 2183 +2105 1359 2155 +2047 1464 2115 +1954 1575 2057 +1790 1691 1962 +1394 1811 1795 +0 1933 1384 +0 2057 0 +0 2185 0 +0 2313 0 +0 2441 0 +0 2571 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2349 563 2327 +2347 599 2325 +2345 643 2323 +2341 696 2321 +2337 758 2317 +2331 830 2313 +2323 911 2307 +2313 1001 2297 +2299 1098 2285 +2277 1203 2269 +2249 1313 2247 +2207 1429 2215 +2143 1548 2167 +2041 1670 2095 +1856 1794 1976 +1349 1920 1745 +0 2049 747 +0 2177 0 +0 2307 0 +0 2437 0 +0 2567 0 +0 2699 0 +0 2831 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2465 0 2411 +2463 77 2409 +2461 203 2409 +2459 331 2407 +2455 460 2403 +2451 589 2399 +2445 719 2393 +2437 850 2387 +2425 981 2377 +2409 1112 2363 +2389 1244 2345 +2357 1376 2319 +2313 1507 2283 +2245 1639 2227 +2137 1771 2141 +1932 1903 1994 +1282 2035 1667 +0 2167 0 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2583 0 2503 +2583 0 2503 +2581 0 2501 +2579 0 2499 +2577 0 2497 +2573 0 2495 +2569 172 2489 +2563 511 2483 +2553 754 2477 +2543 954 2465 +2527 1130 2451 +2503 1293 2431 +2471 1447 2401 +2425 1595 2359 +2355 1739 2297 +2239 1879 2197 +2017 2017 2017 +1174 2153 1537 +0 2289 0 +0 2425 0 +0 2557 0 +0 2691 0 +0 2825 0 +0 2957 0 +0 3091 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2705 0 2603 +2705 0 2603 +2703 0 2601 +2703 0 2601 +2701 0 2599 +2697 0 2597 +2695 0 2593 +2689 0 2589 +2683 0 2581 +2675 581 2573 +2663 914 2561 +2647 1154 2545 +2623 1352 2523 +2591 1528 2493 +2543 1691 2447 +2469 1845 2377 +2349 1992 2263 +2111 2135 2046 +972 2275 1272 +0 2413 0 +0 2551 0 +0 2685 0 +0 2821 0 +0 2955 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2831 0 2711 +2829 0 2709 +2829 0 2709 +2827 0 2707 +2827 0 2707 +2825 0 2705 +2821 0 2701 +2819 0 2699 +2813 0 2693 +2807 0 2687 +2797 144 2677 +2785 855 2665 +2769 1183 2649 +2745 1421 2625 +2711 1618 2591 +2663 1794 2541 +2587 1956 2465 +2463 2109 2339 +2211 2257 2083 +338 2401 0 +0 2541 0 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +2957 0 2823 +2957 0 2821 +2955 0 2821 +2955 0 2821 +2953 0 2819 +2953 0 2817 +2951 0 2815 +2947 0 2813 +2943 0 2809 +2939 0 2803 +2933 0 2797 +2923 0 2787 +2911 762 2775 +2893 1219 2757 +2869 1499 2731 +2835 1716 2697 +2785 1903 2643 +2709 2073 2561 +2581 2231 2423 +2319 2381 2127 +0 2527 0 +0 2667 0 +0 2807 0 +0 2945 0 +0 3081 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3085 0 2939 +3085 0 2939 +3083 0 2939 +3083 0 2937 +3083 0 2937 +3081 0 2935 +3079 0 2933 +3077 0 2931 +3075 0 2929 +3071 0 2925 +3067 0 2919 +3059 0 2913 +3051 0 2903 +3037 597 2889 +3021 1264 2871 +2997 1585 2845 +2961 1821 2807 +2911 2017 2751 +2833 2191 2665 +2701 2353 2515 +2431 2507 2181 +0 2653 0 +0 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3213 0 3059 +3213 0 3059 +3213 0 3059 +3213 0 3057 +3211 0 3057 +3211 0 3057 +3209 0 3055 +3209 0 3053 +3207 0 3051 +3203 0 3049 +3199 0 3045 +3195 0 3039 +3187 0 3031 +3179 0 3021 +3165 198 3007 +3149 1317 2989 +3125 1680 2961 +3089 1931 2923 +3037 2135 2865 +2959 2315 2775 +2825 2479 2615 +2549 2635 2243 +0 2783 0 +0 2927 0 +0 3067 0 +0 3205 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3343 0 3183 +3343 0 3181 +3343 0 3181 +3343 0 3181 +3341 0 3181 +3341 0 3179 +3341 0 3179 +3339 0 3177 +3337 0 3177 +3335 0 3173 +3333 0 3171 +3329 0 3167 +3323 0 3161 +3317 0 3153 +3307 0 3143 +3295 0 3129 +3277 1380 3109 +3253 1783 3081 +3217 2046 3041 +3167 2257 2983 +3087 2439 2889 +2951 2607 2723 +2669 2763 2315 +0 2913 0 +0 3057 0 +0 3197 0 +0 3337 0 +0 3473 0 +0 3609 0 +0 3745 0 +0 3879 0 +0 4013 0 +3473 0 3307 +3473 0 3307 +3473 0 3307 +3473 0 3307 +3473 0 3307 +3471 0 3305 +3471 0 3305 +3471 0 3303 +3469 0 3303 +3467 0 3301 +3465 0 3299 +3463 0 3295 +3459 0 3291 +3453 0 3285 +3447 0 3277 +3437 0 3267 +3425 0 3253 +3407 1452 3233 +3383 1891 3205 +3347 2165 3165 +3295 2381 3103 +3215 2567 3007 +3079 2735 2835 +2793 2893 2397 +0 3043 0 +0 3187 0 +0 3329 0 +0 3469 0 +0 3605 0 +0 3741 0 +0 3877 0 +0 4011 0 +3603 0 3435 +3603 0 3433 +3603 0 3433 +3603 0 3433 +3603 0 3433 +3603 0 3433 +3603 0 3433 +3601 0 3431 +3601 0 3431 +3599 0 3429 +3599 0 3427 +3597 0 3425 +3593 0 3423 +3589 0 3417 +3585 0 3413 +3577 0 3405 +3569 0 3393 +3555 0 3379 +3537 1534 3359 +3513 2005 3331 +3477 2287 3289 +3425 2507 3227 +3345 2695 3129 +3207 2863 2951 +2917 3023 2487 +0 3173 0 +0 3319 0 +0 3461 0 +0 3599 0 +0 3737 0 +0 3873 0 +0 4009 0 +3735 0 3563 +3735 0 3563 +3735 0 3561 +3735 0 3561 +3735 0 3561 +3735 0 3561 +3733 0 3561 +3733 0 3561 +3733 0 3559 +3731 0 3559 +3731 0 3557 +3729 0 3555 +3727 0 3553 +3725 0 3549 +3721 0 3545 +3715 0 3539 +3709 0 3533 +3699 0 3521 +3687 0 3507 +3669 1625 3487 +3643 2123 3457 +3607 2411 3415 +3555 2633 3353 +3475 2823 3253 +3337 2993 3071 +3045 3153 2585 +0 3303 0 +0 3449 0 +0 3593 0 +0 3731 0 +0 3869 0 +0 4005 0 +3867 0 3691 +3867 0 3691 +3867 0 3691 +3867 0 3691 +3865 0 3691 +3865 0 3691 +3865 0 3691 +3865 0 3689 +3865 0 3689 +3865 0 3689 +3863 0 3687 +3863 0 3687 +3861 0 3685 +3859 0 3683 +3855 0 3679 +3851 0 3675 +3847 0 3669 +3839 0 3661 +3831 0 3651 +3817 0 3635 +3799 1723 3615 +3775 2243 3585 +3739 2539 3543 +3687 2763 3481 +3605 2953 3379 +3467 3125 3195 +3173 3283 2691 +0 3435 0 +0 3581 0 +0 3723 0 +0 3863 0 +0 4001 0 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3997 0 3819 +3997 0 3819 +3995 0 3819 +3995 0 3817 +3993 0 3817 +3991 0 3815 +3989 0 3811 +3987 0 3809 +3983 0 3805 +3979 0 3799 +3971 0 3791 +3961 0 3779 +3949 0 3765 +3931 1828 3745 +3907 2367 3715 +3871 2665 3673 +3817 2891 3609 +3735 3083 3507 +3597 3255 3319 +3301 3415 2801 +0 3567 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3949 +4095 0 3949 +4095 0 3947 +4095 0 3947 +4095 0 3945 +4095 0 3943 +4095 0 3939 +4095 0 3935 +4095 0 3929 +4095 0 3921 +4093 0 3909 +4081 0 3895 +4063 1938 3875 +4037 2493 3845 +4001 2795 3801 +3949 3021 3737 +3867 3215 3635 +3729 3387 3447 +3431 3547 2917 +0 3699 0 +0 3845 0 +0 3987 0 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4081 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4075 +4095 0 4073 +4095 0 4069 +4095 0 4065 +4095 0 4059 +4095 0 4051 +4095 0 4041 +4095 0 4025 +4095 2053 4005 +4095 2621 3975 +4095 2925 3933 +4081 3153 3867 +3999 3345 3765 +3859 3517 3575 +3563 3679 3035 +0 3831 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2173 4095 +4095 2749 4095 +4095 3055 4063 +4095 3283 3999 +4095 3477 3895 +3991 3649 3703 +3693 3809 3157 +0 3963 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2295 4095 +4095 2877 4095 +4095 3185 4095 +4095 3415 4095 +4095 3609 4025 +4095 3781 3833 +3825 3941 3283 +1643 1209 2051 +1635 1218 2049 +1623 1230 2045 +1607 1245 2040 +1585 1264 2033 +1554 1289 2025 +1508 1321 2012 +1439 1359 1996 +1326 1406 1972 +1110 1462 1939 +353 1528 1891 +0 1603 1817 +0 1688 1694 +0 1780 1449 +0 1881 80 +0 1987 0 +0 2099 0 +0 2217 0 +0 2337 0 +0 2459 0 +0 2585 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1653 1208 2053 +1645 1217 2051 +1634 1229 2047 +1618 1244 2043 +1597 1263 2036 +1566 1288 2028 +1522 1319 2016 +1455 1358 1999 +1346 1405 1976 +1143 1462 1943 +505 1527 1895 +0 1603 1821 +0 1687 1700 +0 1780 1460 +0 1880 260 +0 1987 0 +0 2099 0 +0 2217 0 +0 2337 0 +0 2459 0 +0 2585 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1667 1206 2057 +1659 1215 2055 +1648 1227 2051 +1633 1242 2047 +1612 1262 2040 +1583 1287 2032 +1540 1318 2020 +1476 1357 2003 +1373 1404 1980 +1184 1461 1948 +652 1526 1900 +0 1602 1828 +0 1686 1708 +0 1779 1474 +0 1880 426 +0 1987 0 +0 2099 0 +0 2215 0 +0 2337 0 +0 2459 0 +0 2585 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1685 1204 2063 +1677 1213 2061 +1667 1224 2057 +1652 1240 2051 +1632 1259 2046 +1604 1284 2037 +1563 1316 2025 +1503 1355 2009 +1406 1403 1986 +1233 1459 1954 +795 1525 1907 +0 1601 1836 +0 1686 1719 +0 1779 1492 +0 1879 581 +0 1986 0 +0 2099 0 +0 2215 0 +0 2337 0 +0 2459 0 +0 2585 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1707 1200 2069 +1700 1209 2067 +1690 1221 2063 +1676 1237 2059 +1657 1256 2053 +1631 1282 2044 +1593 1313 2033 +1536 1353 2017 +1447 1400 1994 +1292 1457 1963 +935 1524 1917 +0 1599 1847 +0 1684 1733 +0 1778 1515 +0 1879 730 +0 1986 0 +0 2099 0 +0 2215 0 +0 2335 0 +0 2459 0 +0 2585 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1736 1196 2079 +1729 1205 2075 +1720 1217 2073 +1707 1232 2067 +1689 1252 2061 +1664 1278 2053 +1629 1310 2042 +1577 1349 2026 +1496 1397 2005 +1360 1455 1974 +1073 1521 1929 +0 1598 1861 +0 1683 1752 +0 1776 1545 +0 1878 874 +0 1985 0 +0 2097 0 +0 2215 0 +0 2335 0 +0 2459 0 +0 2585 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1771 1189 2089 +1765 1199 2087 +1756 1211 2083 +1745 1227 2079 +1728 1247 2073 +1706 1273 2065 +1674 1305 2055 +1627 1345 2039 +1555 1393 2018 +1437 1451 1988 +1209 1518 1945 +272 1595 1880 +0 1681 1775 +0 1775 1581 +0 1876 1015 +0 1984 0 +0 2097 0 +0 2215 0 +0 2335 0 +0 2459 0 +0 2583 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1815 1181 2105 +1809 1191 2103 +1801 1203 2099 +1791 1219 2095 +1776 1240 2089 +1756 1266 2081 +1727 1299 2071 +1685 1339 2057 +1623 1388 2036 +1524 1446 2007 +1344 1514 1966 +870 1592 1903 +0 1678 1804 +0 1772 1625 +0 1874 1153 +0 1982 0 +0 2095 0 +0 2213 0 +0 2335 0 +0 2457 0 +0 2583 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1867 1170 2123 +1862 1179 2121 +1855 1192 2119 +1846 1209 2115 +1833 1230 2109 +1815 1256 2101 +1790 1290 2091 +1754 1331 2077 +1701 1381 2059 +1619 1440 2031 +1479 1509 1992 +1180 1587 1933 +0 1674 1841 +0 1769 1678 +0 1872 1290 +0 1981 0 +0 2095 0 +0 2213 0 +0 2333 0 +0 2457 0 +0 2583 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +1929 1154 2149 +1925 1164 2147 +1919 1177 2143 +1910 1194 2139 +1899 1216 2135 +1884 1243 2127 +1862 1278 2117 +1832 1320 2105 +1788 1371 2087 +1721 1432 2061 +1613 1501 2024 +1410 1581 1970 +782 1669 1886 +0 1765 1741 +0 1869 1426 +0 1978 0 +0 2093 0 +0 2211 0 +0 2333 0 +0 2457 0 +0 2583 0 +0 2709 0 +0 2839 0 +0 2967 0 +0 3097 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +2001 1132 2179 +1997 1143 2177 +1992 1156 2175 +1985 1174 2171 +1975 1197 2167 +1962 1226 2159 +1944 1261 2151 +1919 1305 2139 +1883 1358 2121 +1829 1420 2097 +1746 1491 2065 +1604 1572 2015 +1299 1662 1939 +0 1760 1813 +0 1864 1560 +0 1974 0 +0 2089 0 +0 2209 0 +0 2331 0 +0 2455 0 +0 2581 0 +0 2709 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +2081 1101 2217 +2079 1112 2215 +2073 1127 2213 +2069 1146 2211 +2061 1170 2205 +2049 1200 2199 +2034 1238 2191 +2014 1284 2181 +1985 1339 2165 +1943 1404 2143 +1879 1478 2113 +1778 1561 2069 +1593 1653 2003 +1089 1752 1895 +0 1858 1695 +0 1970 1079 +0 2085 0 +0 2205 0 +0 2329 0 +0 2453 0 +0 2579 0 +0 2709 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +2171 1056 2265 +2169 1068 2263 +2165 1084 2261 +2159 1105 2257 +2153 1132 2253 +2145 1164 2249 +2133 1205 2241 +2117 1254 2231 +2093 1313 2217 +2061 1381 2197 +2012 1458 2171 +1939 1545 2133 +1817 1640 2075 +1578 1742 1985 +385 1850 1828 +0 1963 1462 +0 2081 0 +0 2201 0 +0 2325 0 +0 2451 0 +0 2579 0 +0 2707 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2269 988 2321 +2267 1002 2319 +2263 1021 2317 +2259 1044 2315 +2255 1074 2311 +2247 1112 2305 +2237 1157 2299 +2225 1211 2291 +2207 1275 2279 +2181 1349 2261 +2145 1431 2239 +2091 1523 2205 +2008 1622 2157 +1865 1727 2083 +1556 1839 1961 +0 1955 1720 +0 2075 451 +0 2197 0 +0 2321 0 +0 2449 0 +0 2577 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2373 877 2385 +2371 895 2385 +2369 918 2383 +2365 948 2381 +2361 985 2377 +2357 1029 2373 +2349 1083 2367 +2339 1147 2359 +2325 1220 2349 +2305 1302 2335 +2277 1393 2315 +2237 1491 2287 +2179 1597 2247 +2087 1708 2189 +1922 1823 2095 +1526 1943 1927 +0 2065 1516 +0 2189 0 +0 2317 0 +0 2445 0 +0 2573 0 +0 2703 0 +0 2833 0 +0 2963 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2483 666 2461 +2481 695 2459 +2479 731 2457 +2477 775 2455 +2475 828 2453 +2469 890 2449 +2463 962 2445 +2457 1043 2439 +2445 1133 2429 +2431 1230 2417 +2409 1335 2401 +2381 1445 2379 +2339 1561 2347 +2275 1680 2299 +2173 1802 2227 +1988 1926 2109 +1481 2053 1877 +0 2181 879 +0 2309 0 +0 2439 0 +0 2569 0 +0 2699 0 +0 2831 0 +0 2963 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2597 0 2543 +2597 84 2543 +2595 209 2541 +2593 335 2541 +2591 463 2539 +2587 592 2535 +2583 721 2531 +2577 852 2527 +2569 982 2519 +2557 1113 2509 +2543 1244 2495 +2521 1376 2477 +2489 1508 2451 +2445 1640 2415 +2379 1771 2359 +2269 1903 2273 +2065 2035 2127 +1415 2167 1799 +0 2299 0 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3091 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2717 0 2637 +2715 0 2635 +2715 0 2635 +2713 0 2633 +2711 0 2631 +2709 0 2629 +2705 0 2627 +2701 304 2621 +2695 644 2617 +2687 886 2609 +2675 1086 2597 +2659 1263 2583 +2635 1426 2563 +2605 1580 2533 +2557 1727 2493 +2487 1871 2429 +2371 2011 2329 +2149 2149 2149 +1306 2287 1669 +0 2421 0 +0 2557 0 +0 2691 0 +0 2823 0 +0 2957 0 +0 3089 0 +0 3223 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3753 0 +0 3885 0 +0 4017 0 +2839 0 2737 +2837 0 2735 +2837 0 2735 +2837 0 2735 +2835 0 2733 +2833 0 2731 +2831 0 2729 +2827 0 2725 +2821 0 2721 +2815 0 2713 +2807 713 2705 +2795 1046 2693 +2779 1286 2679 +2755 1484 2655 +2723 1661 2625 +2675 1823 2579 +2601 1977 2509 +2481 2125 2395 +2243 2267 2179 +1103 2407 1404 +0 2547 0 +0 2683 0 +0 2819 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +2963 0 2843 +2963 0 2843 +2961 0 2841 +2961 0 2841 +2959 0 2839 +2959 0 2839 +2957 0 2837 +2953 0 2833 +2951 0 2831 +2945 0 2825 +2939 0 2819 +2929 276 2809 +2917 987 2797 +2901 1315 2781 +2877 1553 2757 +2843 1750 2723 +2795 1926 2673 +2719 2089 2597 +2595 2241 2471 +2343 2389 2215 +471 2533 0 +0 2673 0 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +3089 0 2955 +3089 0 2955 +3089 0 2955 +3087 0 2953 +3087 0 2953 +3085 0 2951 +3085 0 2949 +3083 0 2947 +3079 0 2945 +3075 0 2941 +3071 0 2937 +3065 0 2929 +3055 0 2919 +3043 894 2907 +3025 1351 2889 +3001 1631 2863 +2967 1848 2829 +2917 2035 2775 +2841 2205 2693 +2713 2363 2555 +2451 2513 2259 +0 2659 0 +0 2801 0 +0 2939 0 +0 3077 0 +0 3213 0 +0 3347 0 +0 3483 0 +0 3615 0 +0 3749 0 +0 3883 0 +0 4015 0 +3217 0 3071 +3217 0 3071 +3217 0 3071 +3215 0 3071 +3215 0 3069 +3215 0 3069 +3213 0 3067 +3211 0 3065 +3209 0 3063 +3207 0 3061 +3203 0 3057 +3199 0 3051 +3191 0 3045 +3183 0 3035 +3169 729 3021 +3153 1396 3003 +3129 1717 2977 +3093 1953 2939 +3043 2149 2883 +2965 2325 2797 +2833 2485 2647 +2563 2639 2313 +0 2785 0 +0 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3345 0 3191 +3345 0 3191 +3345 0 3191 +3345 0 3191 +3345 0 3191 +3343 0 3189 +3343 0 3189 +3341 0 3187 +3341 0 3185 +3339 0 3183 +3335 0 3181 +3331 0 3177 +3327 0 3171 +3319 0 3163 +3311 0 3153 +3299 330 3139 +3281 1449 3121 +3257 1813 3093 +3221 2063 3055 +3169 2267 2997 +3091 2447 2907 +2957 2611 2747 +2681 2767 2375 +0 2915 0 +0 3059 0 +0 3199 0 +0 3337 0 +0 3475 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3475 0 3315 +3475 0 3315 +3475 0 3313 +3475 0 3313 +3475 0 3313 +3473 0 3313 +3473 0 3313 +3473 0 3311 +3471 0 3309 +3469 0 3309 +3467 0 3305 +3465 0 3303 +3461 0 3299 +3457 0 3293 +3449 0 3285 +3439 0 3275 +3427 0 3261 +3409 1512 3241 +3385 1915 3213 +3349 2179 3175 +3299 2389 3115 +3219 2571 3021 +3083 2739 2855 +2801 2895 2447 +0 3045 0 +0 3189 0 +0 3331 0 +0 3469 0 +0 3607 0 +0 3741 0 +0 3877 0 +0 4011 0 +3605 0 3439 +3605 0 3439 +3605 0 3439 +3605 0 3439 +3605 0 3439 +3605 0 3439 +3603 0 3437 +3603 0 3437 +3603 0 3437 +3601 0 3435 +3599 0 3433 +3597 0 3431 +3595 0 3427 +3591 0 3423 +3587 0 3417 +3579 0 3411 +3569 0 3399 +3557 0 3385 +3539 1585 3365 +3515 2023 3337 +3479 2297 3297 +3427 2513 3235 +3347 2699 3139 +3211 2867 2967 +2925 3025 2529 +0 3175 0 +0 3319 0 +0 3461 0 +0 3601 0 +0 3737 0 +0 3873 0 +0 4009 0 +3737 0 3567 +3737 0 3567 +3735 0 3567 +3735 0 3565 +3735 0 3565 +3735 0 3565 +3735 0 3565 +3735 0 3565 +3733 0 3563 +3733 0 3563 +3731 0 3561 +3731 0 3559 +3729 0 3557 +3725 0 3555 +3721 0 3549 +3717 0 3545 +3709 0 3537 +3701 0 3525 +3687 0 3511 +3669 1666 3491 +3645 2137 3463 +3609 2419 3421 +3557 2639 3359 +3477 2827 3261 +3339 2995 3083 +3049 3155 2619 +0 3305 0 +0 3451 0 +0 3593 0 +0 3731 0 +0 3869 0 +0 4005 0 +3867 0 3695 +3867 0 3695 +3867 0 3695 +3867 0 3695 +3867 0 3693 +3867 0 3693 +3867 0 3693 +3867 0 3693 +3865 0 3693 +3865 0 3691 +3865 0 3691 +3863 0 3689 +3861 0 3687 +3859 0 3685 +3857 0 3683 +3853 0 3677 +3847 0 3673 +3841 0 3665 +3831 0 3653 +3819 0 3639 +3801 1757 3619 +3775 2255 3589 +3741 2543 3547 +3687 2765 3485 +3607 2955 3385 +3469 3125 3203 +3177 3285 2717 +0 3437 0 +0 3581 0 +0 3725 0 +0 3863 0 +0 4001 0 +3999 0 3823 +3999 0 3823 +3999 0 3823 +3999 0 3823 +3999 0 3823 +3999 0 3823 +3997 0 3823 +3997 0 3823 +3997 0 3821 +3997 0 3821 +3997 0 3821 +3995 0 3819 +3995 0 3819 +3993 0 3817 +3991 0 3815 +3987 0 3811 +3983 0 3807 +3979 0 3801 +3971 0 3793 +3963 0 3783 +3949 0 3767 +3931 1855 3747 +3907 2375 3717 +3871 2671 3675 +3819 2895 3613 +3737 3085 3511 +3599 3257 3327 +3305 3415 2823 +0 3567 0 +0 3713 0 +0 3855 0 +0 3995 0 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3953 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3949 +4095 0 3949 +4095 0 3947 +4095 0 3945 +4095 0 3941 +4095 0 3937 +4095 0 3931 +4095 0 3923 +4093 0 3911 +4081 0 3897 +4063 1960 3877 +4039 2499 3847 +4003 2797 3805 +3949 3023 3741 +3869 3215 3639 +3729 3387 3451 +3435 3547 2933 +0 3699 0 +0 3845 0 +0 3987 0 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4081 +4095 0 4081 +4095 0 4079 +4095 0 4079 +4095 0 4077 +4095 0 4075 +4095 0 4071 +4095 0 4067 +4095 0 4061 +4095 0 4053 +4095 0 4043 +4095 0 4027 +4095 2071 4007 +4095 2625 3977 +4095 2927 3935 +4081 3155 3869 +3999 3347 3767 +3861 3519 3579 +3563 3679 3049 +0 3831 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2187 4095 +4095 2753 4095 +4095 3057 4065 +4095 3285 4001 +4095 3477 3897 +3991 3651 3707 +3695 3811 3167 +0 3963 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2305 4095 +4095 2881 4095 +4095 3187 4095 +4095 3415 4095 +4095 3609 4027 +4095 3781 3835 +3825 3943 3291 +1773 1336 2183 +1767 1342 2181 +1759 1351 2179 +1747 1363 2175 +1731 1378 2169 +1708 1398 2163 +1676 1422 2155 +1629 1453 2143 +1558 1492 2125 +1442 1539 2101 +1216 1595 2069 +324 1661 2020 +0 1736 1945 +0 1820 1821 +0 1913 1573 +0 2013 6 +0 2119 0 +0 2231 0 +0 2349 0 +0 2469 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1781 1335 2185 +1775 1341 2183 +1767 1350 2181 +1755 1362 2177 +1739 1377 2171 +1717 1397 2165 +1686 1421 2157 +1640 1453 2145 +1571 1491 2127 +1458 1538 2105 +1242 1594 2071 +485 1660 2023 +0 1735 1949 +0 1820 1826 +0 1912 1582 +0 2013 212 +0 2119 0 +0 2231 0 +0 2349 0 +0 2469 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1792 1333 2187 +1786 1340 2185 +1777 1349 2183 +1766 1361 2179 +1751 1376 2175 +1729 1395 2169 +1699 1420 2159 +1654 1452 2147 +1587 1490 2131 +1479 1537 2107 +1275 1594 2075 +637 1659 2027 +0 1735 1954 +0 1819 1832 +0 1912 1592 +0 2012 393 +0 2119 0 +0 2231 0 +0 2349 0 +0 2469 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1805 1331 2191 +1799 1338 2189 +1791 1347 2187 +1780 1359 2183 +1765 1374 2179 +1744 1394 2173 +1715 1419 2163 +1672 1450 2151 +1608 1489 2135 +1505 1536 2113 +1316 1593 2079 +784 1659 2032 +0 1734 1960 +0 1819 1840 +0 1912 1606 +0 2012 558 +0 2119 0 +0 2231 0 +0 2349 0 +0 2469 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1823 1329 2197 +1817 1336 2195 +1809 1345 2193 +1799 1356 2189 +1784 1372 2185 +1764 1392 2177 +1736 1417 2169 +1695 1448 2157 +1635 1487 2141 +1538 1535 2119 +1365 1591 2087 +927 1657 2040 +0 1733 1968 +0 1818 1851 +0 1911 1624 +0 2011 713 +0 2119 0 +0 2231 0 +0 2347 0 +0 2469 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1845 1325 2203 +1839 1332 2201 +1832 1341 2199 +1822 1353 2195 +1809 1369 2191 +1790 1389 2185 +1763 1414 2177 +1725 1446 2165 +1668 1485 2149 +1579 1532 2127 +1424 1589 2095 +1067 1656 2049 +0 1732 1979 +0 1817 1865 +0 1910 1647 +0 2011 862 +0 2117 0 +0 2231 0 +0 2347 0 +0 2467 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1873 1321 2213 +1868 1328 2211 +1861 1337 2207 +1852 1349 2205 +1839 1365 2199 +1821 1385 2193 +1797 1410 2185 +1761 1442 2175 +1709 1482 2159 +1628 1530 2137 +1492 1587 2107 +1205 1653 2061 +0 1730 1994 +0 1815 1884 +0 1909 1677 +0 2010 1006 +0 2117 0 +0 2229 0 +0 2347 0 +0 2467 0 +0 2591 0 +0 2717 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +1908 1315 2223 +1904 1322 2221 +1897 1331 2219 +1889 1343 2217 +1877 1359 2211 +1861 1379 2205 +1838 1405 2197 +1806 1437 2187 +1759 1477 2171 +1687 1526 2151 +1570 1583 2121 +1341 1650 2077 +404 1727 2012 +0 1813 1907 +0 1907 1713 +0 2008 1147 +0 2117 0 +0 2229 0 +0 2347 0 +0 2467 0 +0 2591 0 +0 2715 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +1951 1306 2239 +1947 1313 2237 +1941 1323 2235 +1934 1335 2231 +1923 1351 2227 +1908 1372 2221 +1888 1398 2213 +1859 1431 2203 +1818 1471 2189 +1755 1520 2167 +1656 1579 2139 +1476 1646 2097 +1002 1724 2036 +0 1810 1936 +0 1905 1757 +0 2007 1285 +0 2115 0 +0 2227 0 +0 2345 0 +0 2467 0 +0 2589 0 +0 2715 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +2003 1294 2257 +2000 1302 2257 +1994 1312 2253 +1987 1324 2251 +1978 1341 2247 +1965 1362 2241 +1947 1389 2233 +1922 1422 2223 +1886 1463 2209 +1833 1513 2191 +1751 1572 2163 +1611 1641 2123 +1312 1719 2065 +0 1806 1973 +0 1902 1811 +0 2004 1422 +0 2113 0 +0 2227 0 +0 2345 0 +0 2465 0 +0 2589 0 +0 2715 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +2065 1278 2283 +2061 1286 2281 +2057 1296 2279 +2051 1309 2275 +2043 1326 2271 +2031 1348 2267 +2016 1376 2259 +1994 1410 2249 +1964 1452 2237 +1920 1503 2219 +1853 1564 2193 +1745 1634 2157 +1543 1713 2103 +914 1801 2018 +0 1897 1873 +0 2001 1558 +0 2111 0 +0 2225 0 +0 2343 0 +0 2465 0 +0 2589 0 +0 2715 0 +0 2841 0 +0 2971 0 +0 3099 0 +0 3231 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +2135 1256 2313 +2133 1264 2311 +2129 1275 2309 +2123 1289 2307 +2117 1306 2303 +2107 1329 2299 +2095 1358 2291 +2077 1393 2283 +2051 1437 2271 +2015 1490 2253 +1961 1552 2231 +1878 1624 2197 +1737 1704 2147 +1431 1794 2071 +0 1892 1946 +0 1996 1693 +0 2107 0 +0 2221 0 +0 2341 0 +0 2463 0 +0 2587 0 +0 2713 0 +0 2841 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +2215 1225 2351 +2213 1233 2349 +2211 1244 2347 +2205 1259 2345 +2201 1278 2343 +2193 1302 2337 +2181 1333 2331 +2167 1370 2323 +2145 1416 2313 +2117 1471 2297 +2075 1536 2275 +2011 1610 2245 +1910 1693 2201 +1725 1785 2135 +1221 1884 2027 +0 1990 1827 +0 2101 1211 +0 2219 0 +0 2337 0 +0 2461 0 +0 2585 0 +0 2713 0 +0 2841 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +2305 1179 2397 +2303 1188 2397 +2301 1200 2395 +2297 1217 2393 +2293 1237 2389 +2285 1264 2385 +2277 1297 2381 +2265 1337 2373 +2249 1387 2363 +2225 1445 2349 +2193 1513 2329 +2145 1591 2303 +2071 1677 2265 +1949 1772 2207 +1710 1874 2117 +517 1982 1960 +0 2095 1594 +0 2213 0 +0 2335 0 +0 2457 0 +0 2583 0 +0 2711 0 +0 2839 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +2401 1109 2453 +2401 1120 2453 +2399 1134 2451 +2395 1153 2449 +2391 1177 2447 +2387 1206 2443 +2379 1244 2437 +2369 1289 2431 +2357 1344 2423 +2339 1407 2411 +2313 1481 2393 +2277 1564 2371 +2223 1655 2337 +2139 1754 2289 +1997 1860 2215 +1688 1971 2093 +0 2087 1852 +0 2207 583 +0 2329 0 +0 2453 0 +0 2581 0 +0 2709 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +2505 995 2519 +2505 1009 2517 +2503 1027 2517 +2501 1050 2515 +2497 1080 2513 +2493 1117 2509 +2489 1162 2505 +2481 1216 2499 +2471 1279 2491 +2457 1352 2481 +2437 1434 2467 +2409 1525 2447 +2369 1623 2419 +2311 1729 2381 +2219 1840 2321 +2055 1955 2227 +1658 2075 2059 +0 2197 1649 +0 2321 0 +0 2449 0 +0 2577 0 +0 2705 0 +0 2835 0 +0 2965 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2615 775 2593 +2615 798 2593 +2613 827 2591 +2611 863 2589 +2609 907 2587 +2607 960 2585 +2601 1022 2581 +2597 1094 2577 +2589 1175 2571 +2577 1265 2561 +2563 1363 2551 +2541 1467 2533 +2513 1578 2511 +2471 1693 2479 +2407 1812 2431 +2305 1934 2359 +2121 2059 2241 +1614 2185 2009 +0 2313 1012 +0 2441 0 +0 2571 0 +0 2701 0 +0 2831 0 +0 2963 0 +0 3095 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2731 0 2677 +2729 94 2677 +2729 216 2675 +2727 341 2675 +2725 467 2673 +2723 595 2671 +2719 724 2667 +2715 853 2663 +2709 984 2659 +2701 1114 2651 +2689 1245 2641 +2675 1377 2629 +2653 1508 2609 +2621 1640 2583 +2577 1772 2547 +2511 1904 2491 +2401 2035 2407 +2197 2167 2259 +1547 2299 1931 +0 2431 0 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2849 0 2769 +2849 0 2769 +2847 0 2767 +2847 0 2767 +2845 0 2765 +2843 0 2763 +2841 0 2761 +2837 0 2759 +2833 436 2755 +2827 776 2749 +2819 1018 2741 +2807 1218 2729 +2791 1395 2715 +2769 1558 2695 +2737 1712 2665 +2689 1859 2625 +2619 2003 2561 +2503 2143 2463 +2281 2281 2281 +1438 2419 1802 +0 2553 0 +0 2689 0 +0 2823 0 +0 2955 0 +0 3089 0 +0 3221 0 +0 3355 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +2971 0 2869 +2971 0 2869 +2971 0 2867 +2969 0 2867 +2969 0 2867 +2967 0 2865 +2965 0 2863 +2963 0 2861 +2959 0 2857 +2953 0 2853 +2947 96 2847 +2939 845 2837 +2927 1178 2827 +2911 1418 2811 +2887 1617 2789 +2855 1793 2757 +2807 1955 2711 +2733 2109 2641 +2613 2257 2527 +2375 2399 2311 +1236 2539 1536 +0 2679 0 +0 2815 0 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +3095 0 2975 +3095 0 2975 +3095 0 2975 +3095 0 2973 +3093 0 2973 +3093 0 2973 +3091 0 2971 +3089 0 2969 +3085 0 2965 +3083 0 2963 +3077 0 2957 +3071 0 2951 +3063 409 2941 +3049 1119 2929 +3033 1447 2913 +3009 1685 2889 +2975 1883 2855 +2927 2059 2805 +2851 2221 2729 +2727 2373 2603 +2475 2521 2347 +602 2665 0 +0 2805 0 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3221 0 3087 +3221 0 3087 +3221 0 3087 +3221 0 3087 +3219 0 3085 +3219 0 3085 +3217 0 3083 +3217 0 3083 +3215 0 3079 +3211 0 3077 +3209 0 3073 +3203 0 3069 +3197 0 3061 +3187 0 3051 +3175 1026 3039 +3159 1483 3021 +3135 1763 2997 +3099 1980 2961 +3049 2167 2907 +2973 2337 2825 +2845 2495 2687 +2583 2645 2391 +0 2791 0 +0 2933 0 +0 3071 0 +0 3209 0 +0 3345 0 +0 3479 0 +0 3615 0 +0 3747 0 +0 3881 0 +0 4015 0 +3349 0 3203 +3349 0 3203 +3349 0 3203 +3349 0 3203 +3347 0 3203 +3347 0 3201 +3347 0 3201 +3345 0 3199 +3343 0 3199 +3341 0 3195 +3339 0 3193 +3335 0 3189 +3331 0 3183 +3323 0 3177 +3315 0 3167 +3303 861 3153 +3285 1528 3135 +3261 1850 3109 +3225 2085 3071 +3175 2281 3015 +3097 2457 2929 +2965 2617 2779 +2695 2771 2445 +0 2919 0 +0 3061 0 +0 3201 0 +0 3339 0 +0 3475 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3477 0 3323 +3477 0 3323 +3477 0 3323 +3477 0 3323 +3477 0 3323 +3477 0 3323 +3475 0 3321 +3475 0 3321 +3473 0 3319 +3473 0 3317 +3471 0 3315 +3467 0 3313 +3463 0 3309 +3459 0 3303 +3453 0 3295 +3443 0 3285 +3431 462 3271 +3413 1581 3253 +3389 1945 3225 +3353 2195 3187 +3303 2399 3129 +3223 2579 3039 +3089 2743 2879 +2813 2899 2507 +0 3047 0 +0 3191 0 +0 3331 0 +0 3469 0 +0 3607 0 +0 3743 0 +0 3877 0 +0 4011 0 +3607 0 3447 +3607 0 3447 +3607 0 3447 +3607 0 3447 +3607 0 3445 +3607 0 3445 +3605 0 3445 +3605 0 3445 +3605 0 3443 +3603 0 3441 +3601 0 3441 +3599 0 3439 +3597 0 3435 +3593 0 3431 +3589 0 3425 +3581 0 3417 +3573 0 3407 +3559 0 3393 +3541 1644 3373 +3517 2047 3347 +3483 2311 3307 +3431 2521 3247 +3351 2703 3153 +3215 2871 2987 +2933 3027 2579 +0 3177 0 +0 3321 0 +0 3463 0 +0 3601 0 +0 3739 0 +0 3875 0 +0 4009 0 +3737 0 3571 +3737 0 3571 +3737 0 3571 +3737 0 3571 +3737 0 3571 +3737 0 3571 +3737 0 3571 +3737 0 3569 +3735 0 3569 +3735 0 3569 +3733 0 3567 +3731 0 3565 +3729 0 3563 +3727 0 3559 +3723 0 3555 +3719 0 3549 +3711 0 3543 +3703 0 3531 +3689 0 3517 +3671 1717 3497 +3647 2155 3469 +3611 2429 3429 +3559 2645 3367 +3479 2831 3271 +3343 2999 3099 +3057 3157 2661 +0 3307 0 +0 3451 0 +0 3593 0 +0 3733 0 +0 3869 0 +0 4005 0 +3869 0 3699 +3869 0 3699 +3869 0 3699 +3869 0 3699 +3867 0 3697 +3867 0 3697 +3867 0 3697 +3867 0 3697 +3867 0 3697 +3867 0 3695 +3865 0 3695 +3865 0 3693 +3863 0 3691 +3861 0 3689 +3857 0 3687 +3853 0 3683 +3849 0 3677 +3841 0 3669 +3833 0 3657 +3819 0 3643 +3801 1798 3623 +3777 2269 3595 +3741 2551 3553 +3689 2771 3491 +3609 2959 3393 +3471 3129 3215 +3181 3287 2751 +0 3437 0 +0 3583 0 +0 3725 0 +0 3865 0 +0 4001 0 +3999 0 3827 +3999 0 3827 +3999 0 3827 +3999 0 3827 +3999 0 3827 +3999 0 3827 +3999 0 3825 +3999 0 3825 +3999 0 3825 +3997 0 3825 +3997 0 3823 +3997 0 3823 +3995 0 3821 +3993 0 3819 +3991 0 3817 +3989 0 3815 +3985 0 3809 +3979 0 3805 +3973 0 3797 +3963 0 3785 +3951 0 3771 +3933 1889 3751 +3907 2387 3721 +3873 2677 3679 +3819 2899 3617 +3739 3087 3517 +3601 3259 3335 +3309 3417 2849 +0 3569 0 +0 3715 0 +0 3857 0 +0 3995 0 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3953 +4095 0 3953 +4095 0 3951 +4095 0 3951 +4095 0 3949 +4095 0 3947 +4095 0 3943 +4095 0 3939 +4095 0 3933 +4095 0 3925 +4095 0 3915 +4081 0 3899 +4063 1987 3879 +4039 2507 3849 +4003 2803 3807 +3951 3027 3745 +3869 3217 3643 +3731 3389 3459 +3437 3549 2955 +0 3699 0 +0 3845 0 +0 3987 0 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4085 +4095 0 4083 +4095 0 4083 +4095 0 4083 +4095 0 4081 +4095 0 4081 +4095 0 4079 +4095 0 4077 +4095 0 4073 +4095 0 4069 +4095 0 4063 +4095 0 4055 +4095 0 4043 +4095 0 4029 +4095 2093 4009 +4095 2631 3979 +4095 2931 3937 +4081 3157 3873 +4001 3347 3771 +3861 3519 3583 +3567 3679 3065 +0 3831 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2203 4095 +4095 2757 4095 +4095 3059 4067 +4095 3287 4003 +4095 3479 3899 +3993 3651 3711 +3697 3811 3181 +0 3963 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2319 4095 +4095 2885 4095 +4095 3189 4095 +4095 3417 4095 +4095 3609 4029 +4095 3783 3839 +3827 3943 3299 +1904 1463 2315 +1900 1469 2313 +1893 1475 2311 +1884 1484 2309 +1873 1496 2305 +1856 1511 2301 +1833 1530 2293 +1801 1555 2285 +1753 1586 2273 +1681 1625 2255 +1561 1672 2233 +1327 1728 2199 +282 1793 2149 +0 1868 2075 +0 1952 1949 +0 2045 1699 +0 2145 0 +0 2253 0 +0 2365 0 +0 2481 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3105 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +1910 1463 2317 +1906 1468 2315 +1899 1475 2313 +1891 1483 2311 +1879 1495 2307 +1863 1510 2301 +1840 1530 2295 +1808 1554 2287 +1761 1586 2275 +1690 1624 2257 +1574 1671 2235 +1348 1727 2201 +456 1793 2151 +0 1868 2077 +0 1952 1953 +0 2045 1706 +0 2145 138 +0 2251 0 +0 2365 0 +0 2481 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +1918 1462 2319 +1913 1467 2317 +1907 1474 2315 +1899 1482 2313 +1887 1494 2309 +1871 1509 2305 +1849 1529 2297 +1818 1554 2289 +1772 1585 2277 +1703 1623 2261 +1590 1670 2237 +1374 1727 2203 +617 1792 2155 +0 1867 2081 +0 1952 1958 +0 2045 1714 +0 2145 344 +0 2251 0 +0 2363 0 +0 2481 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +1928 1460 2321 +1924 1465 2319 +1918 1472 2317 +1909 1481 2315 +1898 1493 2311 +1883 1508 2307 +1861 1528 2301 +1831 1552 2291 +1786 1584 2279 +1719 1622 2263 +1611 1670 2241 +1407 1726 2207 +769 1792 2159 +0 1867 2085 +0 1951 1964 +0 2044 1724 +0 2145 525 +0 2251 0 +0 2363 0 +0 2481 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +1942 1458 2325 +1937 1463 2323 +1931 1470 2321 +1923 1479 2319 +1912 1491 2315 +1897 1506 2311 +1877 1526 2305 +1847 1551 2295 +1804 1582 2283 +1740 1621 2267 +1637 1668 2245 +1448 1725 2213 +916 1791 2165 +0 1866 2093 +0 1951 1972 +0 2044 1738 +0 2145 690 +0 2251 0 +0 2363 0 +0 2481 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +1959 1456 2331 +1955 1461 2329 +1949 1468 2327 +1941 1477 2325 +1931 1489 2321 +1916 1504 2317 +1896 1524 2309 +1868 1549 2301 +1828 1580 2289 +1767 1619 2273 +1670 1667 2251 +1497 1723 2219 +1059 1789 2171 +0 1865 2101 +0 1950 1983 +0 2043 1757 +0 2143 845 +0 2251 0 +0 2363 0 +0 2479 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +1981 1452 2337 +1977 1457 2335 +1972 1464 2333 +1964 1474 2331 +1954 1485 2327 +1941 1501 2323 +1922 1521 2317 +1895 1546 2309 +1857 1578 2297 +1800 1617 2281 +1711 1665 2259 +1556 1721 2227 +1199 1788 2181 +0 1864 2111 +0 1949 1998 +0 2042 1780 +0 2143 994 +0 2251 0 +0 2363 0 +0 2479 0 +0 2601 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2009 1448 2345 +2005 1453 2345 +2000 1460 2343 +1993 1469 2339 +1984 1481 2337 +1971 1497 2333 +1953 1517 2325 +1929 1542 2317 +1893 1574 2307 +1841 1614 2291 +1761 1662 2269 +1624 1719 2239 +1337 1786 2193 +0 1862 2125 +0 1947 2016 +0 2041 1809 +0 2141 1138 +0 2249 0 +0 2363 0 +0 2479 0 +0 2599 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2044 1441 2357 +2040 1447 2355 +2036 1454 2353 +2029 1463 2351 +2021 1475 2349 +2009 1491 2343 +1993 1511 2337 +1970 1537 2329 +1938 1569 2319 +1891 1609 2303 +1819 1658 2283 +1702 1715 2253 +1473 1783 2209 +536 1859 2145 +0 1945 2039 +0 2039 1845 +0 2141 1279 +0 2249 0 +0 2361 0 +0 2479 0 +0 2599 0 +0 2723 0 +0 2849 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2087 1433 2371 +2083 1438 2371 +2079 1445 2369 +2073 1455 2367 +2065 1467 2363 +2055 1483 2359 +2040 1504 2353 +2020 1530 2345 +1991 1563 2335 +1950 1603 2321 +1887 1652 2299 +1788 1711 2271 +1609 1779 2229 +1134 1856 2167 +0 1942 2069 +0 2037 1889 +0 2139 1417 +0 2247 0 +0 2361 0 +0 2477 0 +0 2599 0 +0 2723 0 +0 2847 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2139 1421 2391 +2135 1427 2389 +2131 1434 2389 +2127 1444 2385 +2119 1456 2383 +2111 1473 2379 +2097 1494 2373 +2079 1521 2365 +2055 1554 2355 +2018 1595 2341 +1965 1645 2323 +1883 1704 2295 +1743 1773 2255 +1444 1851 2197 +0 1938 2105 +0 2034 1943 +0 2137 1554 +0 2245 0 +0 2359 0 +0 2477 0 +0 2597 0 +0 2721 0 +0 2847 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +2199 1405 2415 +2197 1411 2415 +2193 1418 2413 +2189 1428 2411 +2183 1441 2407 +2175 1458 2403 +2163 1480 2399 +2149 1508 2391 +2127 1542 2383 +2097 1584 2369 +2051 1635 2351 +1985 1696 2325 +1877 1766 2289 +1675 1845 2235 +1046 1933 2149 +0 2030 2005 +0 2133 1690 +0 2243 0 +0 2357 0 +0 2475 0 +0 2597 0 +0 2721 0 +0 2847 0 +0 2973 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +2269 1382 2447 +2267 1388 2445 +2265 1396 2443 +2261 1407 2441 +2255 1421 2439 +2249 1438 2435 +2239 1461 2431 +2227 1490 2423 +2209 1526 2415 +2183 1569 2403 +2147 1622 2385 +2093 1684 2363 +2010 1756 2329 +1869 1837 2279 +1564 1926 2203 +0 2024 2077 +0 2129 1825 +0 2239 0 +0 2353 0 +0 2473 0 +0 2595 0 +0 2719 0 +0 2845 0 +0 2973 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +2349 1350 2485 +2347 1357 2483 +2345 1365 2481 +2343 1377 2481 +2339 1391 2477 +2333 1410 2475 +2325 1434 2469 +2313 1465 2463 +2299 1502 2455 +2279 1548 2445 +2249 1603 2429 +2207 1668 2407 +2143 1742 2377 +2042 1825 2333 +1857 1917 2267 +1353 2016 2159 +0 2123 1959 +0 2233 1343 +0 2351 0 +0 2469 0 +0 2593 0 +0 2717 0 +0 2845 0 +0 2973 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +2439 1303 2531 +2437 1311 2529 +2435 1320 2529 +2433 1333 2527 +2429 1349 2525 +2425 1369 2521 +2417 1396 2517 +2409 1429 2513 +2397 1469 2505 +2381 1519 2495 +2357 1577 2481 +2325 1645 2463 +2277 1723 2435 +2203 1809 2397 +2081 1904 2339 +1842 2006 2249 +650 2115 2093 +0 2227 1726 +0 2345 0 +0 2467 0 +0 2589 0 +0 2715 0 +0 2843 0 +0 2971 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +2535 1232 2587 +2535 1241 2585 +2533 1252 2585 +2531 1266 2583 +2527 1285 2581 +2523 1309 2579 +2519 1339 2575 +2511 1376 2569 +2503 1421 2563 +2489 1476 2555 +2471 1540 2543 +2445 1613 2527 +2409 1696 2503 +2355 1787 2469 +2271 1886 2421 +2129 1992 2347 +1820 2103 2225 +0 2219 1984 +0 2339 715 +0 2461 0 +0 2585 0 +0 2713 0 +0 2841 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3885 0 +0 4017 0 +2639 1115 2651 +2639 1126 2651 +2637 1141 2649 +2635 1159 2649 +2633 1182 2647 +2629 1212 2645 +2625 1249 2641 +2621 1294 2637 +2613 1348 2631 +2603 1411 2623 +2589 1484 2613 +2569 1566 2599 +2541 1657 2579 +2503 1756 2553 +2443 1861 2513 +2351 1972 2453 +2187 2087 2359 +1790 2207 2191 +0 2329 1781 +0 2455 0 +0 2581 0 +0 2709 0 +0 2837 0 +0 2967 0 +0 3097 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +2749 890 2725 +2749 908 2725 +2747 930 2725 +2745 959 2723 +2743 995 2721 +2741 1039 2719 +2739 1092 2717 +2735 1154 2713 +2729 1226 2709 +2721 1307 2703 +2709 1397 2695 +2695 1495 2683 +2673 1599 2665 +2645 1710 2643 +2603 1825 2611 +2539 1944 2563 +2437 2067 2491 +2253 2191 2373 +1746 2317 2141 +0 2445 1143 +0 2573 0 +0 2703 0 +0 2833 0 +0 2965 0 +0 3095 0 +0 3227 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2863 0 2809 +2863 107 2809 +2863 226 2809 +2861 348 2807 +2859 473 2807 +2857 599 2805 +2855 727 2803 +2851 856 2799 +2847 986 2795 +2841 1116 2791 +2833 1246 2783 +2821 1377 2773 +2807 1509 2761 +2785 1640 2741 +2755 1772 2715 +2709 1904 2679 +2643 2036 2623 +2533 2167 2539 +2329 2299 2391 +1679 2431 2063 +0 2563 0 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2981 0 2901 +2981 0 2901 +2981 0 2901 +2981 0 2899 +2979 0 2899 +2977 0 2897 +2975 0 2895 +2973 0 2893 +2969 0 2891 +2965 568 2887 +2959 908 2881 +2951 1150 2873 +2939 1350 2861 +2923 1527 2847 +2901 1690 2827 +2869 1844 2797 +2821 1992 2757 +2751 2135 2693 +2635 2275 2595 +2413 2413 2413 +1570 2551 1934 +0 2685 0 +0 2821 0 +0 2955 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3885 0 +0 4017 0 +3103 0 3001 +3103 0 3001 +3103 0 3001 +3103 0 3001 +3101 0 2999 +3101 0 2999 +3099 0 2997 +3097 0 2995 +3095 0 2993 +3091 0 2989 +3087 0 2985 +3079 228 2979 +3071 978 2969 +3059 1310 2959 +3043 1550 2943 +3019 1749 2921 +2987 1925 2889 +2939 2087 2843 +2865 2241 2773 +2745 2389 2659 +2507 2531 2443 +1368 2673 1669 +0 2811 0 +0 2947 0 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +3227 0 3107 +3227 0 3107 +3227 0 3107 +3227 0 3107 +3227 0 3107 +3225 0 3105 +3225 0 3105 +3223 0 3103 +3221 0 3101 +3219 0 3099 +3215 0 3095 +3209 0 3089 +3203 0 3083 +3195 541 3073 +3183 1251 3061 +3165 1579 3045 +3141 1817 3021 +3109 2015 2987 +3059 2191 2937 +2983 2353 2861 +2859 2505 2735 +2609 2653 2479 +735 2797 0 +0 2937 0 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3353 0 3219 +3353 0 3219 +3353 0 3219 +3353 0 3219 +3353 0 3219 +3353 0 3217 +3351 0 3217 +3351 0 3215 +3349 0 3215 +3347 0 3213 +3343 0 3209 +3341 0 3205 +3335 0 3201 +3329 0 3193 +3319 0 3185 +3307 1158 3171 +3291 1616 3153 +3267 1895 3129 +3233 2113 3093 +3183 2299 3039 +3105 2469 2957 +2977 2627 2819 +2715 2777 2523 +0 2923 0 +0 3065 0 +0 3203 0 +0 3341 0 +0 3477 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3481 0 3337 +3481 0 3335 +3481 0 3335 +3481 0 3335 +3481 0 3335 +3481 0 3335 +3479 0 3333 +3479 0 3333 +3477 0 3331 +3475 0 3331 +3473 0 3327 +3471 0 3325 +3467 0 3321 +3463 0 3315 +3455 0 3309 +3447 0 3299 +3435 994 3285 +3417 1660 3267 +3393 1982 3241 +3359 2217 3203 +3307 2413 3147 +3229 2589 3061 +3097 2749 2911 +2827 2903 2577 +0 3051 0 +0 3193 0 +0 3333 0 +0 3471 0 +0 3607 0 +0 3743 0 +0 3877 0 +0 4011 0 +3611 0 3457 +3611 0 3455 +3609 0 3455 +3609 0 3455 +3609 0 3455 +3609 0 3455 +3609 0 3455 +3607 0 3453 +3607 0 3453 +3605 0 3451 +3605 0 3449 +3603 0 3447 +3599 0 3445 +3595 0 3441 +3591 0 3435 +3585 0 3427 +3575 0 3417 +3563 594 3403 +3545 1714 3385 +3521 2077 3357 +3485 2327 3319 +3435 2531 3261 +3355 2711 3171 +3221 2875 3011 +2945 3031 2639 +0 3179 0 +0 3323 0 +0 3463 0 +0 3603 0 +0 3739 0 +0 3875 0 +0 4009 0 +3739 0 3579 +3739 0 3579 +3739 0 3579 +3739 0 3579 +3739 0 3579 +3739 0 3577 +3739 0 3577 +3739 0 3577 +3737 0 3577 +3737 0 3575 +3735 0 3575 +3733 0 3573 +3731 0 3571 +3729 0 3567 +3725 0 3563 +3721 0 3557 +3713 0 3549 +3705 0 3539 +3691 0 3525 +3673 1776 3505 +3649 2179 3479 +3615 2443 3439 +3563 2653 3379 +3483 2835 3285 +3347 3003 3119 +3065 3159 2711 +0 3309 0 +0 3453 0 +0 3595 0 +0 3733 0 +0 3871 0 +0 4007 0 +3869 0 3703 +3869 0 3703 +3869 0 3703 +3869 0 3703 +3869 0 3703 +3869 0 3703 +3869 0 3703 +3869 0 3703 +3869 0 3701 +3867 0 3701 +3867 0 3701 +3865 0 3699 +3863 0 3697 +3861 0 3695 +3859 0 3691 +3855 0 3687 +3851 0 3683 +3843 0 3675 +3835 0 3663 +3821 0 3649 +3803 1849 3629 +3779 2287 3601 +3743 2561 3561 +3691 2777 3499 +3611 2963 3403 +3475 3131 3231 +3189 3289 2793 +0 3439 0 +0 3583 0 +0 3725 0 +0 3865 0 +0 4001 0 +4001 0 3831 +4001 0 3831 +4001 0 3831 +4001 0 3831 +4001 0 3831 +4001 0 3831 +3999 0 3829 +3999 0 3829 +3999 0 3829 +3999 0 3829 +3999 0 3827 +3997 0 3827 +3997 0 3825 +3995 0 3823 +3993 0 3821 +3989 0 3819 +3985 0 3815 +3981 0 3809 +3975 0 3801 +3965 0 3791 +3951 0 3775 +3935 1931 3755 +3909 2401 3727 +3873 2683 3685 +3821 2903 3623 +3741 3091 3525 +3603 3261 3347 +3313 3419 2883 +0 3569 0 +0 3715 0 +0 3857 0 +0 3997 0 +4095 0 3959 +4095 0 3959 +4095 0 3959 +4095 0 3959 +4095 0 3959 +4095 0 3959 +4095 0 3959 +4095 0 3957 +4095 0 3957 +4095 0 3957 +4095 0 3957 +4095 0 3955 +4095 0 3955 +4095 0 3953 +4095 0 3951 +4095 0 3949 +4095 0 3947 +4095 0 3943 +4095 0 3937 +4095 0 3929 +4095 0 3917 +4083 0 3903 +4065 2021 3883 +4041 2519 3853 +4005 2809 3811 +3951 3031 3749 +3871 3219 3649 +3733 3391 3467 +3441 3549 2981 +0 3701 0 +0 3847 0 +0 3989 0 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4085 +4095 0 4085 +4095 0 4083 +4095 0 4083 +4095 0 4081 +4095 0 4079 +4095 0 4075 +4095 0 4071 +4095 0 4065 +4095 0 4057 +4095 0 4047 +4095 0 4031 +4095 2119 4011 +4095 2639 3981 +4095 2935 3939 +4083 3159 3877 +4001 3349 3775 +3863 3521 3591 +3569 3681 3087 +0 3831 0 +0 3977 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2225 4095 +4095 2763 4095 +4095 3063 4069 +4095 3289 4005 +4095 3479 3903 +3993 3651 3715 +3699 3811 3197 +0 3963 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2335 4095 +4095 2889 4095 +4095 3191 4095 +4095 3419 4095 +4095 3611 4031 +4095 3783 3843 +3829 3943 3313 +2035 1592 2447 +2032 1596 2445 +2027 1601 2445 +2021 1608 2443 +2012 1617 2439 +2000 1629 2435 +1983 1644 2431 +1960 1663 2425 +1927 1688 2415 +1879 1719 2403 +1805 1757 2387 +1684 1804 2363 +1443 1860 2329 +219 1926 2281 +0 2001 2205 +0 2085 2079 +0 2177 1827 +0 2277 0 +0 2385 0 +0 2497 0 +0 2613 0 +0 2733 0 +0 2857 0 +0 2981 0 +0 3109 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2040 1592 2447 +2036 1596 2447 +2032 1601 2445 +2025 1607 2443 +2017 1616 2441 +2005 1628 2437 +1988 1643 2433 +1965 1662 2425 +1933 1687 2417 +1885 1718 2405 +1813 1757 2387 +1693 1804 2365 +1459 1860 2331 +414 1925 2281 +0 2000 2207 +0 2085 2081 +0 2177 1831 +0 2277 16 +0 2385 0 +0 2497 0 +0 2613 0 +0 2733 0 +0 2857 0 +0 2981 0 +0 3109 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2046 1591 2449 +2042 1595 2449 +2038 1600 2447 +2031 1607 2445 +2023 1616 2443 +2011 1627 2439 +1995 1642 2433 +1972 1662 2427 +1940 1687 2419 +1894 1718 2407 +1822 1756 2389 +1706 1803 2367 +1480 1859 2333 +588 1925 2285 +0 2000 2209 +0 2085 2085 +0 2177 1838 +0 2277 270 +0 2385 0 +0 2497 0 +0 2613 0 +0 2733 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2053 1590 2451 +2051 1594 2451 +2046 1599 2449 +2039 1606 2447 +2031 1615 2445 +2019 1626 2441 +2004 1641 2437 +1981 1661 2429 +1950 1686 2421 +1904 1717 2409 +1835 1756 2393 +1722 1803 2369 +1507 1859 2335 +749 1924 2287 +0 2000 2213 +0 2083 2089 +0 2177 1846 +0 2277 476 +0 2383 0 +0 2497 0 +0 2613 0 +0 2733 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2063 1588 2455 +2061 1592 2453 +2055 1597 2453 +2049 1604 2451 +2042 1613 2447 +2030 1625 2443 +2015 1640 2439 +1993 1660 2433 +1963 1685 2423 +1918 1716 2411 +1851 1755 2395 +1743 1802 2373 +1540 1858 2339 +902 1924 2291 +0 1999 2217 +0 2083 2097 +0 2177 1857 +0 2277 657 +0 2383 0 +0 2495 0 +0 2613 0 +0 2733 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2077 1586 2459 +2073 1590 2457 +2069 1596 2455 +2063 1602 2453 +2055 1611 2451 +2045 1623 2447 +2030 1638 2443 +2009 1658 2437 +1979 1683 2429 +1937 1714 2417 +1872 1753 2399 +1769 1801 2377 +1580 1857 2345 +1048 1923 2297 +0 1998 2225 +0 2083 2105 +0 2175 1871 +0 2277 822 +0 2383 0 +0 2495 0 +0 2613 0 +0 2733 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2095 1584 2463 +2091 1588 2463 +2087 1593 2461 +2081 1600 2459 +2073 1609 2457 +2063 1621 2453 +2049 1636 2449 +2029 1656 2441 +2000 1681 2433 +1960 1712 2421 +1899 1751 2405 +1802 1799 2383 +1630 1855 2351 +1191 1922 2303 +0 1997 2233 +0 2081 2115 +0 2175 1889 +0 2275 977 +0 2383 0 +0 2495 0 +0 2613 0 +0 2733 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2117 1580 2471 +2113 1584 2469 +2109 1590 2467 +2103 1597 2465 +2097 1606 2463 +2087 1618 2459 +2073 1633 2455 +2053 1653 2449 +2027 1678 2441 +1989 1710 2429 +1932 1749 2413 +1843 1797 2391 +1688 1854 2359 +1331 1920 2313 +0 1996 2243 +0 2081 2129 +0 2175 1912 +0 2275 1126 +0 2383 0 +0 2495 0 +0 2611 0 +0 2733 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2143 1576 2479 +2141 1580 2477 +2137 1585 2477 +2133 1592 2475 +2125 1601 2473 +2117 1613 2469 +2103 1629 2465 +2085 1649 2459 +2061 1674 2449 +2025 1706 2439 +1973 1746 2423 +1893 1794 2401 +1756 1851 2371 +1469 1918 2325 +0 1994 2257 +0 2079 2147 +0 2173 1941 +0 2273 1270 +0 2381 0 +0 2495 0 +0 2611 0 +0 2731 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2179 1569 2491 +2175 1573 2489 +2173 1579 2487 +2167 1586 2487 +2161 1595 2483 +2153 1607 2481 +2141 1623 2475 +2125 1643 2471 +2103 1669 2461 +2069 1701 2451 +2023 1741 2435 +1951 1790 2415 +1834 1848 2385 +1605 1915 2341 +668 1991 2277 +0 2077 2171 +0 2171 1977 +0 2273 1411 +0 2381 0 +0 2493 0 +0 2611 0 +0 2731 0 +0 2855 0 +0 2981 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2221 1561 2505 +2219 1565 2505 +2215 1570 2503 +2211 1578 2501 +2205 1587 2499 +2197 1599 2495 +2187 1615 2491 +2173 1636 2485 +2153 1662 2477 +2123 1695 2467 +2081 1736 2453 +2020 1785 2433 +1920 1843 2403 +1741 1911 2361 +1266 1988 2299 +0 2075 2201 +0 2169 2022 +0 2271 1549 +0 2379 0 +0 2493 0 +0 2609 0 +0 2731 0 +0 2855 0 +0 2979 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2273 1549 2525 +2271 1553 2523 +2267 1559 2521 +2263 1566 2521 +2259 1576 2519 +2251 1589 2515 +2243 1605 2511 +2229 1626 2505 +2211 1653 2497 +2187 1686 2487 +2151 1727 2473 +2097 1777 2455 +2015 1837 2427 +1875 1905 2387 +1576 1983 2329 +0 2071 2237 +0 2165 2075 +0 2269 1686 +0 2377 0 +0 2491 0 +0 2609 0 +0 2729 0 +0 2853 0 +0 2979 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2333 1532 2549 +2331 1537 2547 +2329 1543 2547 +2325 1550 2545 +2321 1560 2543 +2315 1574 2539 +2307 1591 2537 +2295 1612 2531 +2281 1640 2523 +2259 1674 2515 +2229 1717 2501 +2183 1768 2483 +2117 1828 2457 +2009 1898 2421 +1807 1977 2367 +1178 2065 2283 +0 2161 2137 +0 2265 1822 +0 2375 0 +0 2489 0 +0 2607 0 +0 2729 0 +0 2853 0 +0 2979 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2403 1510 2579 +2401 1514 2579 +2399 1520 2577 +2397 1528 2575 +2393 1539 2573 +2389 1553 2571 +2381 1571 2567 +2371 1593 2563 +2359 1622 2557 +2341 1658 2547 +2315 1701 2535 +2279 1754 2517 +2225 1816 2495 +2143 1888 2461 +2001 1969 2411 +1696 2059 2335 +0 2157 2209 +0 2261 1957 +0 2371 0 +0 2485 0 +0 2605 0 +0 2727 0 +0 2851 0 +0 2977 0 +0 3105 0 +0 3235 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2483 1477 2617 +2481 1482 2617 +2481 1489 2615 +2477 1497 2615 +2475 1509 2613 +2471 1523 2609 +2465 1542 2607 +2457 1566 2603 +2445 1597 2597 +2431 1634 2587 +2411 1680 2577 +2381 1735 2561 +2339 1800 2539 +2275 1874 2509 +2175 1957 2465 +1990 2049 2399 +1485 2149 2291 +0 2255 2091 +0 2367 1476 +0 2483 0 +0 2603 0 +0 2725 0 +0 2849 0 +0 2977 0 +0 3105 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2571 1430 2663 +2571 1435 2663 +2569 1443 2661 +2567 1452 2661 +2565 1465 2659 +2561 1481 2657 +2557 1502 2653 +2549 1528 2649 +2541 1561 2645 +2529 1602 2637 +2513 1651 2627 +2489 1709 2613 +2457 1777 2595 +2409 1855 2567 +2335 1941 2529 +2213 2036 2471 +1974 2139 2381 +782 2247 2225 +0 2359 1859 +0 2477 0 +0 2599 0 +0 2721 0 +0 2847 0 +0 2975 0 +0 3103 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2669 1358 2719 +2667 1364 2719 +2667 1373 2717 +2665 1384 2717 +2663 1398 2715 +2659 1417 2713 +2655 1441 2711 +2651 1471 2707 +2643 1508 2703 +2635 1553 2695 +2621 1608 2687 +2603 1672 2675 +2577 1745 2659 +2541 1828 2635 +2487 1919 2601 +2405 2018 2553 +2261 2123 2479 +1953 2235 2357 +0 2351 2115 +0 2471 847 +0 2593 0 +0 2717 0 +0 2845 0 +0 2973 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +2771 1239 2783 +2771 1248 2783 +2771 1259 2783 +2769 1273 2781 +2767 1291 2781 +2765 1315 2779 +2763 1344 2777 +2757 1381 2773 +2753 1426 2769 +2745 1480 2763 +2735 1543 2757 +2721 1616 2745 +2701 1698 2731 +2673 1789 2711 +2635 1888 2685 +2575 1993 2645 +2483 2105 2585 +2319 2219 2491 +1922 2339 2323 +0 2461 1913 +0 2587 0 +0 2713 0 +0 2841 0 +0 2969 0 +0 3099 0 +0 3229 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +2881 1008 2859 +2881 1022 2857 +2881 1039 2857 +2879 1062 2857 +2877 1091 2855 +2877 1127 2853 +2873 1171 2851 +2871 1224 2849 +2867 1286 2845 +2861 1358 2841 +2853 1439 2835 +2841 1529 2827 +2827 1627 2815 +2807 1731 2799 +2777 1842 2775 +2735 1957 2743 +2671 2077 2695 +2569 2199 2623 +2385 2323 2505 +1878 2449 2273 +0 2577 1276 +0 2705 0 +0 2835 0 +0 2965 0 +0 3097 0 +0 3227 0 +0 3359 0 +0 3491 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +2995 13 2941 +2995 124 2941 +2995 239 2941 +2995 358 2941 +2993 481 2939 +2991 605 2939 +2989 731 2937 +2987 859 2935 +2985 988 2931 +2979 1117 2927 +2973 1248 2923 +2965 1378 2915 +2955 1510 2905 +2939 1641 2893 +2917 1772 2873 +2887 1904 2847 +2841 2036 2811 +2775 2167 2755 +2665 2299 2671 +2461 2431 2523 +1811 2563 2195 +0 2695 0 +0 2827 0 +0 2959 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3115 0 3035 +3115 0 3033 +3113 0 3033 +3113 0 3033 +3113 0 3033 +3111 0 3031 +3109 0 3029 +3107 0 3029 +3105 0 3025 +3101 0 3023 +3097 700 3019 +3091 1040 3013 +3083 1282 3005 +3071 1482 2993 +3055 1659 2979 +3033 1822 2959 +3001 1976 2931 +2955 2123 2889 +2883 2267 2825 +2769 2407 2727 +2545 2545 2545 +1703 2683 2065 +0 2817 0 +0 2953 0 +0 3087 0 +0 3221 0 +0 3353 0 +0 3487 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4017 0 +3237 0 3133 +3235 0 3133 +3235 0 3133 +3235 0 3133 +3235 0 3133 +3233 0 3131 +3233 0 3131 +3231 0 3129 +3229 0 3127 +3227 0 3125 +3223 0 3121 +3219 0 3117 +3211 360 3111 +3203 1109 3101 +3191 1442 3091 +3175 1682 3075 +3151 1881 3053 +3119 2057 3021 +3071 2219 2975 +2997 2373 2905 +2877 2521 2791 +2639 2663 2575 +1500 2805 1801 +0 2943 0 +0 3079 0 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3361 0 3241 +3359 0 3239 +3359 0 3239 +3359 0 3239 +3359 0 3239 +3359 0 3239 +3357 0 3237 +3357 0 3237 +3355 0 3235 +3353 0 3233 +3351 0 3231 +3347 0 3227 +3341 0 3221 +3335 0 3215 +3327 673 3207 +3315 1383 3193 +3297 1711 3177 +3273 1949 3153 +3241 2147 3119 +3191 2323 3069 +3115 2485 2993 +2991 2637 2867 +2741 2785 2611 +867 2929 0 +0 3069 0 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3487 0 3351 +3487 0 3351 +3485 0 3351 +3485 0 3351 +3485 0 3351 +3485 0 3351 +3485 0 3349 +3483 0 3349 +3483 0 3347 +3481 0 3347 +3479 0 3345 +3475 0 3341 +3473 0 3337 +3467 0 3333 +3461 0 3325 +3451 0 3317 +3439 1290 3303 +3423 1748 3285 +3399 2027 3261 +3365 2245 3225 +3315 2431 3171 +3237 2601 3091 +3109 2759 2951 +2847 2909 2655 +0 3055 0 +0 3197 0 +0 3335 0 +0 3473 0 +0 3609 0 +0 3745 0 +0 3879 0 +0 4013 0 +3613 0 3469 +3613 0 3469 +3613 0 3469 +3613 0 3467 +3613 0 3467 +3613 0 3467 +3613 0 3467 +3611 0 3465 +3611 0 3465 +3609 0 3463 +3609 0 3463 +3607 0 3461 +3603 0 3457 +3599 0 3453 +3595 0 3447 +3587 0 3441 +3579 0 3431 +3567 1125 3417 +3549 1792 3399 +3525 2113 3373 +3491 2349 3335 +3439 2545 3281 +3361 2721 3193 +3231 2883 3043 +2961 3035 2709 +0 3183 0 +0 3325 0 +0 3465 0 +0 3603 0 +0 3739 0 +0 3875 0 +0 4009 0 +3743 0 3589 +3743 0 3589 +3743 0 3589 +3743 0 3587 +3741 0 3587 +3741 0 3587 +3741 0 3587 +3741 0 3587 +3741 0 3585 +3739 0 3585 +3739 0 3583 +3737 0 3581 +3735 0 3579 +3731 0 3577 +3729 0 3573 +3723 0 3567 +3717 0 3559 +3707 0 3549 +3695 726 3537 +3677 1846 3517 +3653 2209 3489 +3617 2459 3451 +3567 2663 3393 +3487 2843 3303 +3353 3007 3145 +3077 3163 2771 +0 3311 0 +0 3455 0 +0 3595 0 +0 3735 0 +0 3871 0 +0 4007 0 +3871 0 3711 +3871 0 3711 +3871 0 3711 +3871 0 3711 +3871 0 3711 +3871 0 3711 +3871 0 3711 +3871 0 3709 +3871 0 3709 +3869 0 3709 +3869 0 3707 +3867 0 3707 +3867 0 3705 +3863 0 3703 +3861 0 3699 +3857 0 3695 +3853 0 3689 +3845 0 3683 +3837 0 3671 +3823 0 3657 +3807 1909 3637 +3781 2311 3611 +3747 2575 3571 +3695 2785 3511 +3615 2969 3417 +3479 3135 3251 +3197 3291 2843 +0 3441 0 +0 3585 0 +0 3727 0 +0 3865 0 +0 4003 0 +4003 0 3837 +4003 0 3835 +4001 0 3835 +4001 0 3835 +4001 0 3835 +4001 0 3835 +4001 0 3835 +4001 0 3835 +4001 0 3835 +4001 0 3835 +3999 0 3833 +3999 0 3833 +3997 0 3831 +3997 0 3829 +3995 0 3827 +3991 0 3825 +3987 0 3819 +3983 0 3815 +3975 0 3807 +3967 0 3797 +3953 0 3781 +3935 1981 3761 +3911 2419 3733 +3875 2693 3693 +3823 2909 3633 +3743 3095 3535 +3607 3263 3363 +3321 3421 2925 +0 3571 0 +0 3715 0 +0 3857 0 +0 3997 0 +4095 0 3963 +4095 0 3963 +4095 0 3963 +4095 0 3963 +4095 0 3963 +4095 0 3963 +4095 0 3963 +4095 0 3963 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3959 +4095 0 3957 +4095 0 3957 +4095 0 3953 +4095 0 3951 +4095 0 3947 +4095 0 3941 +4095 0 3933 +4095 0 3923 +4083 0 3907 +4067 2063 3887 +4041 2533 3859 +4005 2815 3817 +3953 3035 3755 +3873 3223 3657 +3735 3393 3479 +3447 3551 3015 +0 3701 0 +0 3847 0 +0 3989 0 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4089 +4095 0 4089 +4095 0 4089 +4095 0 4089 +4095 0 4087 +4095 0 4085 +4095 0 4085 +4095 0 4081 +4095 0 4079 +4095 0 4075 +4095 0 4069 +4095 0 4061 +4095 0 4049 +4095 0 4035 +4095 2153 4015 +4095 2651 3985 +4095 2941 3945 +4085 3163 3881 +4003 3351 3781 +3865 3523 3599 +3573 3681 3115 +0 3833 0 +0 3979 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2251 4095 +4095 2771 4095 +4095 3067 4071 +4095 3291 4009 +4095 3481 3907 +3995 3653 3723 +3701 3813 3219 +0 3963 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2357 4095 +4095 2895 4095 +4095 3195 4095 +4095 3421 4095 +4095 3611 4035 +4095 3783 3847 +3831 3943 3329 +2167 1722 2579 +2165 1725 2577 +2161 1729 2577 +2155 1734 2575 +2149 1741 2573 +2141 1749 2571 +2129 1761 2567 +2111 1776 2563 +2089 1795 2555 +2055 1820 2547 +2006 1851 2535 +1932 1890 2517 +1809 1937 2493 +1563 1992 2461 +119 2057 2411 +0 2133 2335 +0 2217 2209 +0 2309 1955 +0 2409 0 +0 2517 0 +0 2629 0 +0 2745 0 +0 2865 0 +0 2989 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2171 1722 2579 +2167 1724 2579 +2165 1728 2577 +2159 1733 2577 +2153 1740 2575 +2145 1749 2571 +2133 1761 2569 +2115 1776 2563 +2093 1795 2557 +2059 1820 2547 +2011 1851 2535 +1938 1889 2519 +1816 1936 2495 +1575 1992 2461 +351 2057 2413 +0 2133 2337 +0 2217 2211 +0 2309 1959 +0 2409 0 +0 2517 0 +0 2629 0 +0 2745 0 +0 2865 0 +0 2989 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2175 1721 2581 +2173 1724 2581 +2169 1728 2579 +2163 1733 2577 +2157 1740 2575 +2149 1748 2573 +2137 1760 2569 +2121 1775 2565 +2097 1795 2557 +2065 1819 2549 +2017 1850 2537 +1945 1889 2519 +1825 1936 2497 +1592 1992 2463 +546 2057 2413 +0 2133 2339 +0 2217 2213 +0 2309 1964 +0 2409 148 +0 2517 0 +0 2629 0 +0 2745 0 +0 2865 0 +0 2989 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2181 1720 2583 +2177 1723 2581 +2175 1727 2581 +2169 1732 2579 +2163 1739 2577 +2155 1748 2575 +2143 1759 2571 +2127 1774 2567 +2105 1794 2559 +2073 1819 2551 +2026 1850 2539 +1955 1888 2521 +1838 1935 2499 +1612 1991 2465 +720 2057 2417 +0 2133 2341 +0 2217 2217 +0 2309 1970 +0 2409 403 +0 2517 0 +0 2629 0 +0 2745 0 +0 2865 0 +0 2989 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2189 1719 2585 +2185 1722 2583 +2183 1726 2583 +2177 1731 2581 +2171 1738 2579 +2163 1747 2577 +2151 1758 2573 +2135 1774 2569 +2113 1793 2561 +2083 1818 2553 +2036 1849 2541 +1967 1888 2525 +1854 1935 2501 +1639 1991 2467 +881 2057 2419 +0 2131 2345 +0 2217 2223 +0 2309 1978 +0 2409 608 +0 2515 0 +0 2629 0 +0 2745 0 +0 2865 0 +0 2989 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2199 1718 2587 +2195 1721 2587 +2193 1724 2585 +2189 1730 2585 +2181 1736 2583 +2173 1745 2579 +2163 1757 2577 +2147 1772 2571 +2125 1792 2565 +2095 1817 2557 +2051 1848 2545 +1984 1887 2527 +1875 1934 2505 +1672 1990 2471 +1033 2055 2423 +0 2131 2349 +0 2215 2229 +0 2309 1989 +0 2409 789 +0 2515 0 +0 2627 0 +0 2745 0 +0 2865 0 +0 2987 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2211 1716 2591 +2209 1719 2591 +2205 1723 2589 +2201 1728 2587 +2195 1735 2587 +2187 1744 2583 +2177 1755 2579 +2161 1771 2575 +2141 1790 2569 +2111 1815 2561 +2069 1847 2549 +2004 1885 2531 +1901 1933 2509 +1712 1989 2477 +1180 2055 2429 +0 2131 2357 +0 2215 2237 +0 2307 2003 +0 2409 954 +0 2515 0 +0 2627 0 +0 2745 0 +0 2865 0 +0 2987 0 +0 3113 0 +0 3239 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2229 1713 2597 +2227 1716 2595 +2223 1720 2595 +2219 1725 2593 +2213 1732 2591 +2205 1741 2589 +2195 1753 2585 +2181 1768 2581 +2161 1788 2575 +2133 1813 2565 +2091 1845 2553 +2031 1884 2537 +1935 1931 2515 +1762 1988 2483 +1323 2053 2435 +0 2129 2365 +0 2215 2247 +0 2307 2021 +0 2407 1109 +0 2515 0 +0 2627 0 +0 2745 0 +0 2865 0 +0 2987 0 +0 3113 0 +0 3239 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2251 1710 2603 +2249 1713 2603 +2245 1716 2601 +2241 1722 2599 +2235 1729 2597 +2229 1738 2595 +2219 1750 2591 +2205 1765 2587 +2185 1785 2581 +2159 1810 2573 +2121 1842 2561 +2065 1881 2545 +1975 1929 2523 +1820 1986 2491 +1463 2053 2445 +0 2127 2375 +0 2213 2261 +0 2307 2044 +0 2407 1258 +0 2515 0 +0 2627 0 +0 2743 0 +0 2865 0 +0 2987 0 +0 3113 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2279 1705 2611 +2275 1708 2611 +2273 1712 2609 +2269 1717 2609 +2265 1724 2607 +2257 1733 2605 +2249 1745 2601 +2235 1761 2597 +2217 1781 2591 +2193 1806 2581 +2157 1838 2571 +2105 1878 2555 +2025 1926 2533 +1888 1983 2503 +1601 2049 2457 +0 2127 2389 +0 2211 2281 +0 2305 2073 +0 2407 1402 +0 2513 0 +0 2627 0 +0 2743 0 +0 2863 0 +0 2987 0 +0 3113 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2313 1698 2623 +2311 1701 2623 +2309 1706 2621 +2305 1711 2619 +2299 1718 2619 +2293 1727 2615 +2285 1739 2613 +2273 1755 2609 +2257 1776 2603 +2235 1801 2595 +2203 1834 2583 +2155 1874 2567 +2083 1922 2547 +1966 1980 2517 +1738 2047 2473 +801 2123 2409 +0 2209 2303 +0 2303 2109 +0 2405 1543 +0 2513 0 +0 2625 0 +0 2743 0 +0 2863 0 +0 2987 0 +0 3113 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2355 1690 2637 +2353 1693 2637 +2351 1697 2637 +2347 1702 2635 +2343 1710 2633 +2337 1719 2631 +2329 1732 2627 +2319 1748 2623 +2305 1768 2617 +2285 1794 2609 +2255 1827 2599 +2213 1868 2585 +2151 1917 2565 +2053 1975 2535 +1873 2043 2495 +1398 2121 2431 +0 2207 2333 +0 2301 2153 +0 2403 1682 +0 2511 0 +0 2625 0 +0 2741 0 +0 2863 0 +0 2987 0 +0 3111 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2407 1678 2657 +2405 1681 2657 +2403 1685 2655 +2399 1691 2655 +2395 1698 2653 +2391 1708 2651 +2383 1721 2647 +2375 1737 2643 +2361 1758 2637 +2343 1785 2631 +2319 1818 2619 +2283 1860 2605 +2229 1909 2587 +2147 1969 2559 +2007 2037 2521 +1708 2115 2461 +0 2203 2369 +0 2297 2207 +0 2401 1818 +0 2509 0 +0 2623 0 +0 2741 0 +0 2861 0 +0 2985 0 +0 3111 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2467 1661 2681 +2465 1665 2681 +2463 1669 2679 +2461 1675 2679 +2457 1683 2677 +2453 1693 2675 +2447 1706 2673 +2439 1723 2669 +2427 1744 2663 +2413 1772 2655 +2391 1806 2647 +2361 1849 2633 +2317 1900 2615 +2249 1960 2589 +2141 2030 2553 +1939 2109 2499 +1310 2197 2415 +0 2293 2269 +0 2397 1954 +0 2507 0 +0 2621 0 +0 2739 0 +0 2861 0 +0 2985 0 +0 3111 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2537 1638 2711 +2535 1642 2711 +2535 1646 2711 +2531 1653 2709 +2529 1661 2707 +2525 1671 2705 +2521 1685 2703 +2513 1703 2699 +2503 1725 2695 +2491 1754 2689 +2473 1790 2679 +2447 1834 2667 +2411 1886 2651 +2357 1948 2627 +2275 2020 2593 +2133 2101 2543 +1828 2191 2467 +0 2289 2341 +0 2393 2089 +0 2503 0 +0 2619 0 +0 2737 0 +0 2859 0 +0 2983 0 +0 3109 0 +0 3237 0 +0 3367 0 +0 3495 0 +0 3627 0 +0 3757 0 +0 3887 0 +0 4019 0 +2617 1606 2749 +2615 1609 2749 +2613 1614 2749 +2613 1621 2747 +2609 1630 2747 +2607 1641 2745 +2603 1656 2741 +2597 1674 2739 +2589 1699 2735 +2577 1729 2729 +2563 1767 2719 +2543 1813 2709 +2513 1868 2693 +2471 1932 2671 +2407 2006 2641 +2307 2089 2597 +2121 2181 2531 +1617 2281 2423 +0 2387 2223 +0 2499 1608 +0 2615 0 +0 2735 0 +0 2857 0 +0 2981 0 +0 3109 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2705 1558 2797 +2703 1562 2795 +2703 1568 2795 +2701 1575 2795 +2699 1584 2793 +2697 1597 2791 +2693 1613 2789 +2689 1634 2787 +2683 1660 2781 +2673 1693 2777 +2661 1734 2769 +2645 1783 2759 +2621 1841 2745 +2589 1909 2727 +2541 1987 2699 +2467 2073 2661 +2345 2169 2603 +2107 2271 2513 +914 2379 2357 +0 2491 1991 +0 2609 0 +0 2731 0 +0 2853 0 +0 2979 0 +0 3107 0 +0 3235 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +2801 1485 2851 +2801 1490 2851 +2799 1496 2851 +2799 1505 2849 +2797 1516 2849 +2795 1531 2847 +2791 1549 2845 +2787 1573 2843 +2783 1603 2839 +2775 1640 2835 +2767 1686 2827 +2753 1740 2819 +2735 1804 2807 +2709 1877 2791 +2673 1960 2767 +2619 2051 2735 +2537 2151 2685 +2393 2255 2613 +2085 2367 2489 +0 2483 2249 +0 2603 980 +0 2725 0 +0 2851 0 +0 2977 0 +0 3105 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +2905 1365 2917 +2903 1371 2915 +2903 1380 2915 +2903 1391 2915 +2901 1405 2913 +2899 1423 2913 +2897 1447 2911 +2895 1476 2909 +2891 1513 2905 +2885 1558 2901 +2877 1612 2895 +2867 1675 2889 +2853 1748 2877 +2833 1830 2863 +2805 1921 2845 +2767 2020 2817 +2707 2125 2777 +2615 2237 2717 +2451 2351 2623 +2055 2471 2455 +0 2593 2045 +0 2719 0 +0 2845 0 +0 2973 0 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +3013 1129 2991 +3013 1140 2991 +3013 1154 2989 +3013 1172 2989 +3011 1194 2989 +3009 1223 2987 +3009 1259 2987 +3005 1303 2985 +3003 1356 2981 +2999 1418 2979 +2993 1490 2973 +2985 1571 2967 +2973 1661 2959 +2959 1759 2947 +2939 1864 2931 +2909 1974 2907 +2867 2089 2875 +2803 2209 2827 +2701 2331 2755 +2517 2455 2637 +2010 2581 2405 +0 2709 1408 +0 2837 0 +0 2967 0 +0 3097 0 +0 3229 0 +0 3359 0 +0 3491 0 +0 3623 0 +0 3753 0 +0 3885 0 +0 4017 0 +3129 41 3075 +3129 145 3075 +3127 256 3073 +3127 371 3073 +3127 491 3073 +3125 613 3071 +3123 737 3071 +3123 864 3069 +3119 991 3067 +3117 1120 3063 +3111 1250 3059 +3105 1380 3055 +3097 1511 3047 +3087 1642 3037 +3071 1773 3025 +3049 1905 3007 +3019 2036 2981 +2973 2169 2943 +2907 2299 2889 +2797 2431 2803 +2593 2563 2655 +1943 2695 2327 +0 2827 0 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3247 0 3167 +3247 0 3167 +3247 0 3165 +3245 0 3165 +3245 0 3165 +3245 0 3165 +3243 0 3163 +3241 0 3161 +3239 0 3161 +3237 0 3157 +3233 22 3155 +3229 832 3151 +3223 1172 3145 +3215 1414 3137 +3203 1614 3127 +3187 1791 3111 +3165 1954 3091 +3133 2109 3063 +3087 2255 3021 +3015 2399 2959 +2901 2539 2859 +2677 2677 2677 +1835 2815 2197 +0 2951 0 +0 3085 0 +0 3219 0 +0 3353 0 +0 3485 0 +0 3619 0 +0 3751 0 +0 3883 0 +0 4015 0 +3369 0 3267 +3369 0 3265 +3367 0 3265 +3367 0 3265 +3367 0 3265 +3367 0 3265 +3365 0 3263 +3365 0 3263 +3363 0 3261 +3361 0 3259 +3359 0 3257 +3355 0 3253 +3351 0 3249 +3343 492 3243 +3335 1242 3235 +3323 1575 3223 +3307 1814 3207 +3283 2013 3185 +3251 2189 3153 +3203 2351 3107 +3129 2505 3037 +3009 2653 2925 +2771 2797 2707 +1632 2937 1933 +0 3075 0 +0 3211 0 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3493 0 3373 +3493 0 3373 +3493 0 3373 +3491 0 3371 +3491 0 3371 +3491 0 3371 +3491 0 3371 +3489 0 3369 +3489 0 3369 +3487 0 3367 +3485 0 3365 +3483 0 3363 +3479 0 3359 +3473 0 3353 +3467 0 3347 +3459 805 3339 +3447 1516 3325 +3429 1844 3309 +3405 2081 3285 +3373 2279 3251 +3323 2455 3201 +3249 2617 3125 +3123 2771 2999 +2873 2917 2743 +999 3061 0 +0 3201 0 +0 3339 0 +0 3475 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3619 0 3485 +3619 0 3485 +3619 0 3483 +3617 0 3483 +3617 0 3483 +3617 0 3483 +3617 0 3483 +3617 0 3481 +3615 0 3481 +3615 0 3479 +3613 0 3479 +3611 0 3477 +3609 0 3473 +3605 0 3469 +3599 0 3465 +3593 0 3457 +3583 0 3449 +3571 1422 3435 +3555 1880 3417 +3531 2159 3393 +3497 2377 3357 +3447 2563 3303 +3369 2733 3223 +3241 2891 3083 +2979 3041 2787 +0 3187 0 +0 3329 0 +0 3467 0 +0 3605 0 +0 3741 0 +0 3877 0 +0 4011 0 +3745 0 3601 +3745 0 3601 +3745 0 3601 +3745 0 3601 +3745 0 3599 +3745 0 3599 +3745 0 3599 +3745 0 3599 +3743 0 3599 +3743 0 3597 +3741 0 3597 +3741 0 3595 +3739 0 3593 +3735 0 3589 +3731 0 3585 +3727 0 3581 +3721 0 3573 +3711 0 3563 +3699 1258 3549 +3681 1924 3531 +3657 2245 3505 +3623 2481 3467 +3571 2677 3413 +3493 2853 3325 +3363 3015 3177 +3093 3167 2841 +0 3315 0 +0 3457 0 +0 3597 0 +0 3735 0 +0 3873 0 +0 4007 0 +3875 0 3721 +3875 0 3721 +3875 0 3721 +3875 0 3721 +3875 0 3719 +3873 0 3719 +3873 0 3719 +3873 0 3719 +3873 0 3719 +3873 0 3717 +3871 0 3717 +3871 0 3715 +3869 0 3715 +3867 0 3711 +3863 0 3709 +3861 0 3705 +3855 0 3699 +3849 0 3693 +3839 0 3681 +3827 858 3669 +3809 1978 3649 +3785 2341 3623 +3749 2591 3583 +3699 2795 3525 +3619 2975 3435 +3485 3139 3277 +3209 3295 2903 +0 3443 0 +0 3587 0 +0 3727 0 +0 3867 0 +0 4003 0 +4005 0 3843 +4005 0 3843 +4003 0 3843 +4003 0 3843 +4003 0 3843 +4003 0 3843 +4003 0 3843 +4003 0 3843 +4003 0 3841 +4003 0 3841 +4001 0 3841 +4001 0 3839 +3999 0 3839 +3999 0 3837 +3997 0 3835 +3993 0 3831 +3989 0 3827 +3985 0 3821 +3977 0 3815 +3969 0 3803 +3955 0 3789 +3939 2041 3771 +3913 2443 3743 +3879 2707 3703 +3827 2917 3643 +3747 3101 3549 +3611 3267 3383 +3329 3423 2977 +0 3573 0 +0 3717 0 +0 3859 0 +0 3997 0 +4095 0 3969 +4095 0 3969 +4095 0 3969 +4095 0 3969 +4095 0 3967 +4095 0 3967 +4095 0 3967 +4095 0 3967 +4095 0 3967 +4095 0 3967 +4095 0 3967 +4095 0 3965 +4095 0 3965 +4095 0 3963 +4095 0 3961 +4095 0 3959 +4095 0 3957 +4095 0 3951 +4095 0 3947 +4095 0 3939 +4095 0 3929 +4085 0 3913 +4067 2113 3893 +4043 2551 3865 +4007 2825 3825 +3955 3041 3765 +3875 3227 3667 +3739 3395 3495 +3453 3553 3057 +0 3703 0 +0 3849 0 +0 3989 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4093 +4095 0 4093 +4095 0 4093 +4095 0 4093 +4095 0 4091 +4095 0 4089 +4095 0 4089 +4095 0 4085 +4095 0 4083 +4095 0 4079 +4095 0 4073 +4095 0 4065 +4095 0 4055 +4095 0 4039 +4095 2195 4019 +4095 2665 3991 +4095 2947 3949 +4085 3167 3887 +4005 3355 3789 +3867 3525 3611 +3579 3683 3149 +0 3833 0 +0 3979 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2285 4095 +4095 2783 4095 +4095 3073 4077 +4095 3295 4013 +4095 3483 3913 +3997 3655 3731 +3705 3813 3247 +0 3965 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2383 4095 +4095 2905 4095 +4095 3199 4095 +4095 3423 4095 +4095 3613 4039 +4095 3785 3855 +3833 3945 3351 +2299 1852 2711 +2297 1854 2711 +2293 1857 2709 +2291 1861 2709 +2285 1866 2707 +2279 1873 2705 +2269 1882 2703 +2257 1893 2699 +2241 1909 2693 +2217 1928 2687 +2183 1953 2679 +2135 1984 2665 +2059 2022 2649 +1935 2069 2625 +1685 2125 2591 +0 2191 2541 +0 2265 2467 +0 2349 2339 +0 2441 2085 +0 2543 0 +0 2649 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2301 1852 2711 +2299 1854 2711 +2297 1857 2711 +2293 1861 2709 +2287 1866 2707 +2281 1873 2705 +2273 1882 2703 +2261 1893 2699 +2243 1908 2695 +2221 1928 2687 +2187 1952 2679 +2139 1983 2667 +2065 2022 2649 +1941 2069 2627 +1695 2125 2593 +251 2191 2543 +0 2265 2467 +0 2349 2341 +0 2441 2087 +0 2541 0 +0 2649 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2305 1851 2713 +2303 1854 2711 +2299 1857 2711 +2297 1860 2709 +2291 1866 2709 +2285 1872 2707 +2277 1881 2703 +2265 1893 2701 +2247 1908 2695 +2225 1927 2689 +2191 1952 2679 +2143 1983 2667 +2069 2022 2651 +1948 2069 2627 +1708 2125 2593 +483 2189 2545 +0 2265 2469 +0 2349 2343 +0 2441 2091 +0 2541 0 +0 2649 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2309 1851 2713 +2307 1853 2713 +2305 1856 2713 +2301 1860 2711 +2295 1865 2709 +2289 1872 2707 +2281 1881 2705 +2269 1892 2701 +2253 1907 2697 +2229 1927 2691 +2197 1951 2681 +2149 1983 2669 +2077 2021 2653 +1958 2069 2629 +1724 2125 2595 +678 2189 2547 +0 2265 2471 +0 2349 2345 +0 2441 2095 +0 2541 280 +0 2649 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2315 1850 2715 +2313 1852 2715 +2311 1855 2713 +2307 1859 2713 +2301 1864 2711 +2295 1871 2709 +2287 1880 2707 +2275 1891 2703 +2259 1907 2699 +2237 1926 2691 +2205 1951 2683 +2157 1982 2671 +2087 2021 2653 +1970 2067 2631 +1744 2123 2597 +852 2189 2549 +0 2265 2473 +0 2349 2349 +0 2441 2101 +0 2541 535 +0 2649 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2323 1849 2717 +2321 1851 2717 +2317 1854 2715 +2315 1858 2715 +2309 1863 2713 +2303 1870 2711 +2295 1879 2709 +2283 1890 2705 +2267 1906 2701 +2245 1925 2693 +2215 1950 2685 +2169 1981 2673 +2099 2020 2657 +1986 2067 2633 +1771 2123 2599 +1013 2189 2551 +0 2263 2477 +0 2349 2355 +0 2441 2111 +0 2541 741 +0 2649 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2333 1848 2721 +2331 1850 2719 +2327 1853 2719 +2325 1857 2717 +2321 1862 2717 +2315 1869 2715 +2305 1877 2711 +2295 1889 2709 +2279 1904 2703 +2257 1924 2697 +2227 1949 2689 +2183 1980 2677 +2115 2019 2659 +2007 2065 2637 +1804 2123 2603 +1166 2187 2555 +0 2263 2483 +0 2347 2361 +0 2441 2121 +0 2541 921 +0 2647 0 +0 2761 0 +0 2877 0 +0 2997 0 +0 3121 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2345 1846 2725 +2343 1848 2723 +2341 1851 2723 +2337 1855 2721 +2333 1860 2721 +2327 1867 2719 +2319 1876 2715 +2309 1887 2713 +2293 1903 2707 +2273 1922 2701 +2243 1947 2693 +2201 1979 2681 +2137 2017 2663 +2034 2065 2641 +1845 2121 2609 +1312 2187 2561 +0 2263 2489 +0 2347 2369 +0 2441 2135 +0 2541 1086 +0 2647 0 +0 2759 0 +0 2877 0 +0 2997 0 +0 3119 0 +0 3245 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2363 1843 2729 +2361 1845 2729 +2359 1848 2727 +2355 1852 2727 +2351 1857 2725 +2345 1864 2723 +2337 1873 2721 +2327 1885 2717 +2313 1900 2713 +2293 1920 2707 +2265 1945 2697 +2223 1977 2685 +2163 2016 2669 +2067 2063 2647 +1894 2119 2615 +1455 2185 2569 +0 2261 2497 +0 2347 2379 +0 2439 2153 +0 2539 1241 +0 2647 0 +0 2759 0 +0 2877 0 +0 2997 0 +0 3119 0 +0 3245 0 +0 3371 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2385 1839 2735 +2383 1842 2735 +2381 1845 2735 +2377 1849 2733 +2373 1854 2731 +2367 1861 2729 +2361 1870 2727 +2351 1882 2725 +2337 1897 2719 +2319 1917 2713 +2291 1942 2705 +2253 1974 2693 +2197 2013 2677 +2107 2061 2655 +1952 2117 2623 +1595 2185 2577 +0 2261 2507 +0 2345 2393 +0 2439 2175 +0 2539 1390 +0 2647 0 +0 2759 0 +0 2875 0 +0 2997 0 +0 3119 0 +0 3245 0 +0 3371 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2411 1835 2745 +2411 1837 2743 +2409 1840 2743 +2405 1844 2743 +2401 1849 2741 +2397 1856 2739 +2389 1865 2737 +2381 1877 2733 +2367 1893 2729 +2349 1913 2723 +2325 1939 2715 +2289 1971 2703 +2237 2010 2687 +2157 2059 2665 +2020 2115 2635 +1733 2181 2589 +0 2259 2523 +0 2343 2413 +0 2437 2205 +0 2539 1534 +0 2645 0 +0 2759 0 +0 2875 0 +0 2997 0 +0 3119 0 +0 3245 0 +0 3371 0 +0 3499 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2447 1828 2755 +2445 1831 2755 +2443 1834 2755 +2441 1838 2753 +2437 1843 2753 +2433 1850 2751 +2425 1859 2747 +2417 1872 2745 +2405 1887 2741 +2389 1908 2735 +2367 1933 2727 +2335 1966 2715 +2287 2006 2701 +2215 2055 2679 +2099 2111 2649 +1870 2179 2605 +933 2255 2541 +0 2341 2435 +0 2435 2241 +0 2537 1675 +0 2645 0 +0 2757 0 +0 2875 0 +0 2995 0 +0 3119 0 +0 3245 0 +0 3371 0 +0 3499 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2489 1819 2771 +2487 1822 2771 +2485 1825 2769 +2483 1829 2769 +2479 1835 2767 +2475 1842 2765 +2469 1851 2763 +2463 1864 2759 +2451 1880 2755 +2437 1900 2749 +2417 1926 2741 +2387 1959 2731 +2347 2000 2717 +2283 2049 2697 +2185 2107 2667 +2005 2175 2627 +1530 2253 2565 +0 2339 2465 +0 2433 2285 +0 2535 1814 +0 2643 0 +0 2757 0 +0 2873 0 +0 2995 0 +0 3119 0 +0 3245 0 +0 3371 0 +0 3499 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2539 1807 2789 +2539 1810 2789 +2537 1813 2789 +2535 1817 2787 +2531 1823 2787 +2529 1830 2785 +2523 1840 2783 +2515 1853 2779 +2507 1869 2775 +2493 1890 2769 +2475 1917 2763 +2451 1951 2753 +2415 1992 2739 +2361 2042 2719 +2279 2101 2691 +2139 2169 2653 +1840 2247 2593 +0 2335 2501 +0 2431 2339 +0 2533 1951 +0 2641 0 +0 2755 0 +0 2873 0 +0 2993 0 +0 3117 0 +0 3243 0 +0 3371 0 +0 3499 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2599 1791 2813 +2599 1793 2813 +2597 1797 2813 +2595 1801 2811 +2593 1807 2811 +2589 1815 2809 +2585 1825 2807 +2579 1838 2805 +2571 1855 2801 +2559 1877 2795 +2545 1904 2789 +2523 1938 2779 +2493 1981 2765 +2449 2032 2747 +2381 2093 2721 +2273 2163 2685 +2071 2241 2631 +1442 2329 2547 +0 2425 2401 +0 2529 2087 +0 2639 0 +0 2753 0 +0 2871 0 +0 2993 0 +0 3117 0 +0 3243 0 +0 3371 0 +0 3499 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2669 1768 2845 +2669 1770 2845 +2667 1774 2843 +2667 1779 2843 +2665 1785 2841 +2661 1793 2841 +2657 1803 2839 +2653 1817 2835 +2645 1835 2831 +2635 1857 2827 +2623 1886 2821 +2605 1922 2811 +2579 1966 2799 +2543 2018 2783 +2489 2081 2759 +2407 2153 2725 +2265 2233 2675 +1960 2323 2601 +0 2421 2475 +0 2525 2221 +0 2635 0 +0 2751 0 +0 2869 0 +0 2991 0 +0 3115 0 +0 3241 0 +0 3369 0 +0 3499 0 +0 3627 0 +0 3759 0 +0 3889 0 +0 4021 0 +2749 1735 2883 +2749 1738 2883 +2747 1742 2881 +2747 1747 2881 +2745 1753 2879 +2741 1762 2879 +2739 1773 2877 +2735 1788 2875 +2729 1807 2871 +2721 1831 2867 +2709 1861 2861 +2695 1899 2853 +2675 1945 2841 +2645 2000 2825 +2603 2065 2805 +2539 2139 2773 +2439 2221 2729 +2253 2313 2663 +1749 2413 2555 +0 2519 2355 +0 2631 1740 +0 2747 0 +0 2867 0 +0 2989 0 +0 3113 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2837 1687 2929 +2837 1690 2929 +2835 1694 2927 +2835 1700 2927 +2833 1707 2927 +2831 1717 2925 +2829 1729 2923 +2825 1745 2921 +2821 1766 2919 +2815 1792 2915 +2805 1825 2909 +2793 1866 2901 +2777 1915 2891 +2753 1974 2877 +2721 2042 2859 +2673 2119 2831 +2599 2205 2793 +2477 2301 2735 +2239 2403 2647 +1046 2511 2489 +0 2623 2123 +0 2741 0 +0 2863 0 +0 2987 0 +0 3111 0 +0 3239 0 +0 3367 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +2933 1614 2983 +2933 1617 2983 +2933 1622 2983 +2931 1629 2983 +2931 1637 2981 +2929 1648 2981 +2927 1663 2979 +2923 1681 2977 +2921 1705 2975 +2915 1735 2971 +2907 1772 2967 +2899 1818 2959 +2885 1872 2951 +2867 1936 2939 +2841 2009 2923 +2805 2093 2899 +2751 2183 2867 +2669 2283 2817 +2525 2389 2745 +2217 2499 2621 +0 2615 2381 +0 2735 1111 +0 2857 0 +0 2983 0 +0 3109 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +3037 1492 3049 +3037 1497 3049 +3037 1503 3049 +3035 1512 3047 +3035 1523 3047 +3033 1537 3045 +3031 1555 3045 +3029 1579 3043 +3027 1608 3041 +3023 1645 3037 +3017 1690 3033 +3009 1744 3027 +2999 1807 3021 +2985 1880 3011 +2965 1962 2995 +2937 2053 2977 +2899 2151 2949 +2839 2257 2909 +2747 2369 2849 +2583 2483 2755 +2187 2603 2587 +0 2725 2177 +0 2851 0 +0 2977 0 +0 3105 0 +0 3233 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +3147 1253 3123 +3147 1261 3123 +3145 1272 3123 +3145 1286 3123 +3145 1304 3121 +3143 1327 3121 +3143 1355 3119 +3141 1391 3119 +3137 1435 3117 +3135 1488 3113 +3131 1550 3111 +3125 1622 3105 +3117 1703 3099 +3105 1793 3091 +3091 1891 3079 +3071 1996 3063 +3041 2107 3039 +2999 2221 3007 +2935 2341 2959 +2835 2463 2887 +2649 2587 2769 +2143 2713 2537 +0 2841 1540 +0 2969 0 +0 3099 0 +0 3229 0 +0 3361 0 +0 3491 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4017 0 +3261 75 3207 +3261 173 3207 +3261 278 3207 +3259 388 3205 +3259 504 3205 +3259 623 3205 +3257 745 3203 +3255 869 3203 +3255 996 3201 +3251 1123 3199 +3249 1252 3195 +3243 1382 3193 +3237 1512 3187 +3229 1643 3179 +3219 1774 3169 +3203 1905 3157 +3181 2037 3139 +3151 2169 3113 +3105 2301 3075 +3039 2433 3021 +2929 2563 2935 +2725 2695 2787 +2075 2829 2459 +0 2961 0 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3379 0 3299 +3379 0 3299 +3379 0 3299 +3379 0 3299 +3377 0 3297 +3377 0 3297 +3377 0 3297 +3375 0 3295 +3375 0 3295 +3373 0 3293 +3369 0 3289 +3367 154 3287 +3361 964 3283 +3355 1304 3277 +3347 1546 3269 +3335 1746 3259 +3319 1923 3243 +3297 2087 3223 +3265 2241 3195 +3219 2387 3153 +3147 2531 3091 +3033 2671 2991 +2811 2811 2811 +1967 2947 2331 +0 3083 0 +0 3217 0 +0 3351 0 +0 3485 0 +0 3617 0 +0 3751 0 +0 3883 0 +0 4015 0 +3501 0 3399 +3501 0 3399 +3501 0 3399 +3501 0 3397 +3499 0 3397 +3499 0 3397 +3499 0 3397 +3497 0 3395 +3497 0 3395 +3495 0 3393 +3493 0 3391 +3491 0 3389 +3487 0 3385 +3483 0 3381 +3477 624 3375 +3467 1374 3367 +3455 1707 3355 +3439 1946 3339 +3415 2145 3317 +3383 2321 3285 +3335 2483 3239 +3261 2637 3169 +3141 2785 3057 +2903 2929 2839 +1764 3069 2065 +0 3207 0 +0 3343 0 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3625 0 3505 +3625 0 3505 +3625 0 3505 +3625 0 3505 +3623 0 3503 +3623 0 3503 +3623 0 3503 +3623 0 3503 +3621 0 3501 +3621 0 3501 +3619 0 3499 +3617 0 3497 +3615 0 3495 +3611 0 3491 +3607 0 3485 +3599 0 3479 +3591 937 3471 +3579 1648 3459 +3561 1976 3441 +3539 2213 3417 +3505 2411 3383 +3455 2587 3335 +3381 2749 3259 +3255 2903 3131 +3005 3049 2875 +1131 3193 0 +0 3333 0 +0 3471 0 +0 3607 0 +0 3743 0 +0 3877 0 +0 4011 0 +3751 0 3617 +3751 0 3617 +3751 0 3617 +3751 0 3617 +3751 0 3615 +3749 0 3615 +3749 0 3615 +3749 0 3615 +3749 0 3615 +3747 0 3613 +3747 0 3613 +3745 0 3611 +3743 0 3609 +3741 0 3605 +3737 0 3601 +3731 0 3597 +3725 0 3589 +3717 0 3581 +3703 1555 3567 +3687 2012 3549 +3663 2291 3525 +3629 2509 3489 +3579 2695 3437 +3501 2865 3355 +3373 3023 3215 +3111 3173 2919 +0 3319 0 +0 3461 0 +0 3601 0 +0 3737 0 +0 3873 0 +0 4009 0 +3879 0 3733 +3879 0 3733 +3877 0 3733 +3877 0 3733 +3877 0 3733 +3877 0 3733 +3877 0 3731 +3877 0 3731 +3877 0 3731 +3875 0 3731 +3875 0 3729 +3873 0 3729 +3873 0 3727 +3871 0 3725 +3867 0 3721 +3863 0 3717 +3859 0 3713 +3853 0 3705 +3843 0 3695 +3831 1390 3681 +3813 2057 3663 +3789 2379 3637 +3755 2613 3599 +3703 2809 3545 +3625 2985 3457 +3495 3147 3309 +3225 3299 2973 +0 3447 0 +0 3589 0 +0 3729 0 +0 3867 0 +0 4005 0 +4007 0 3853 +4007 0 3853 +4007 0 3853 +4007 0 3853 +4007 0 3853 +4007 0 3853 +4007 0 3851 +4005 0 3851 +4005 0 3851 +4005 0 3851 +4005 0 3851 +4003 0 3849 +4003 0 3847 +4001 0 3847 +3999 0 3843 +3997 0 3841 +3993 0 3837 +3987 0 3831 +3981 0 3825 +3971 0 3815 +3959 990 3801 +3941 2109 3781 +3917 2473 3755 +3881 2723 3715 +3831 2927 3657 +3751 3107 3567 +3619 3271 3409 +3341 3427 3035 +0 3575 0 +0 3719 0 +0 3861 0 +0 3999 0 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3975 +4095 0 3973 +4095 0 3973 +4095 0 3973 +4095 0 3971 +4095 0 3971 +4095 0 3969 +4095 0 3967 +4095 0 3963 +4095 0 3959 +4095 0 3953 +4095 0 3947 +4095 0 3935 +4087 0 3921 +4071 2173 3903 +4045 2575 3875 +4011 2839 3835 +3959 3049 3775 +3879 3233 3681 +3743 3399 3515 +3461 3555 3109 +0 3705 0 +0 3849 0 +0 3991 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4093 +4095 0 4091 +4095 0 4089 +4095 0 4085 +4095 0 4079 +4095 0 4071 +4095 0 4061 +4095 0 4045 +4095 2245 4025 +4095 2683 3997 +4095 2959 3957 +4087 3173 3897 +4007 3359 3799 +3871 3527 3627 +3585 3685 3189 +0 3835 0 +0 3981 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2327 4095 +4095 2797 4095 +4095 3081 4081 +4095 3299 4019 +4095 3487 3921 +3999 3657 3743 +3711 3815 3281 +0 3965 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2417 4095 +4095 2915 4095 +4095 3205 4095 +4095 3427 4095 +4095 3615 4045 +4095 3787 3865 +3837 3945 3379 +2431 1983 2843 +2429 1985 2843 +2427 1987 2841 +2425 1990 2841 +2421 1994 2839 +2415 1999 2839 +2409 2005 2837 +2401 2014 2833 +2387 2026 2831 +2371 2041 2825 +2347 2061 2819 +2313 2085 2809 +2265 2115 2797 +2189 2155 2781 +2063 2201 2757 +1810 2257 2723 +0 2323 2673 +0 2397 2597 +0 2481 2471 +0 2575 2215 +0 2675 0 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2433 1983 2843 +2431 1984 2843 +2429 1987 2843 +2425 1989 2841 +2423 1993 2841 +2417 1998 2839 +2411 2005 2837 +2403 2014 2835 +2389 2026 2831 +2373 2041 2825 +2349 2061 2819 +2317 2085 2811 +2267 2115 2797 +2193 2155 2781 +2067 2201 2757 +1818 2257 2723 +69 2323 2675 +0 2397 2599 +0 2481 2471 +0 2575 2217 +0 2675 0 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2435 1982 2845 +2433 1984 2843 +2431 1986 2843 +2429 1989 2843 +2425 1993 2841 +2421 1998 2839 +2413 2005 2837 +2405 2014 2835 +2393 2025 2831 +2375 2040 2827 +2353 2059 2819 +2319 2085 2811 +2271 2115 2799 +2197 2153 2781 +2073 2201 2759 +1827 2257 2725 +383 2323 2675 +0 2397 2599 +0 2481 2473 +0 2573 2219 +0 2675 0 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2437 1982 2845 +2437 1984 2845 +2435 1986 2843 +2431 1989 2843 +2429 1993 2843 +2423 1998 2841 +2417 2004 2839 +2409 2013 2835 +2397 2025 2833 +2379 2040 2827 +2357 2059 2821 +2323 2085 2811 +2275 2115 2799 +2201 2153 2783 +2081 2201 2759 +1840 2257 2725 +615 2321 2677 +0 2397 2601 +0 2481 2475 +0 2573 2223 +0 2673 39 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2443 1981 2847 +2441 1983 2845 +2439 1985 2845 +2437 1988 2845 +2433 1992 2843 +2429 1997 2841 +2421 2004 2839 +2413 2013 2837 +2401 2024 2833 +2385 2039 2829 +2361 2059 2823 +2329 2083 2813 +2281 2115 2801 +2209 2153 2785 +2089 2201 2761 +1856 2257 2727 +810 2321 2679 +0 2397 2603 +0 2481 2477 +0 2573 2227 +0 2673 413 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2449 1981 2847 +2447 1982 2847 +2445 1984 2847 +2443 1987 2845 +2439 1991 2845 +2435 1996 2843 +2427 2003 2841 +2419 2012 2839 +2407 2024 2835 +2391 2039 2831 +2369 2059 2823 +2337 2083 2815 +2289 2115 2803 +2219 2153 2787 +2103 2199 2763 +1877 2255 2729 +984 2321 2681 +0 2397 2605 +0 2481 2481 +0 2573 2235 +0 2673 667 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2455 1979 2849 +2455 1981 2849 +2453 1983 2849 +2449 1986 2849 +2447 1990 2847 +2441 1995 2845 +2435 2002 2843 +2427 2011 2841 +2415 2023 2837 +2399 2038 2833 +2377 2057 2827 +2347 2083 2817 +2301 2113 2805 +2231 2151 2789 +2119 2199 2765 +1903 2255 2733 +1145 2321 2683 +0 2395 2609 +0 2481 2487 +0 2573 2243 +0 2673 873 +0 2781 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2465 1978 2853 +2465 1980 2853 +2463 1982 2851 +2461 1985 2851 +2457 1989 2849 +2453 1994 2849 +2447 2001 2847 +2437 2010 2843 +2427 2021 2841 +2411 2036 2835 +2389 2057 2829 +2359 2081 2821 +2315 2113 2809 +2247 2151 2791 +2139 2199 2769 +1936 2255 2735 +1298 2321 2687 +0 2395 2615 +0 2479 2493 +0 2573 2253 +0 2673 1053 +0 2779 0 +0 2893 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2479 1976 2857 +2477 1978 2857 +2475 1980 2855 +2473 1983 2855 +2471 1987 2853 +2465 1992 2853 +2459 1999 2851 +2451 2008 2847 +2441 2020 2845 +2425 2035 2839 +2405 2055 2833 +2375 2079 2825 +2333 2111 2813 +2269 2149 2797 +2165 2197 2773 +1977 2253 2741 +1445 2319 2693 +0 2395 2621 +0 2479 2501 +0 2573 2267 +0 2673 1218 +0 2779 0 +0 2891 0 +0 3009 0 +0 3129 0 +0 3253 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2495 1973 2861 +2495 1975 2861 +2493 1977 2861 +2491 1980 2859 +2487 1984 2859 +2483 1989 2857 +2477 1996 2855 +2469 2005 2853 +2459 2017 2849 +2445 2032 2845 +2425 2053 2839 +2397 2077 2829 +2357 2109 2819 +2295 2147 2801 +2199 2195 2779 +2026 2251 2747 +1587 2317 2701 +0 2393 2629 +0 2479 2511 +0 2571 2285 +0 2673 1373 +0 2779 0 +0 2891 0 +0 3009 0 +0 3129 0 +0 3251 0 +0 3377 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2517 1970 2869 +2517 1972 2867 +2515 1974 2867 +2513 1977 2867 +2509 1981 2865 +2505 1986 2863 +2501 1993 2863 +2493 2002 2859 +2483 2014 2857 +2469 2029 2851 +2451 2049 2845 +2423 2075 2837 +2385 2107 2825 +2329 2145 2809 +2239 2193 2787 +2085 2249 2755 +1727 2317 2709 +0 2393 2639 +0 2477 2527 +0 2571 2309 +0 2671 1522 +0 2779 0 +0 2891 0 +0 3009 0 +0 3129 0 +0 3251 0 +0 3377 0 +0 3503 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2545 1965 2877 +2543 1967 2877 +2543 1969 2875 +2541 1972 2875 +2537 1976 2875 +2533 1981 2873 +2529 1988 2871 +2521 1998 2869 +2513 2010 2865 +2499 2025 2861 +2481 2045 2855 +2457 2071 2847 +2421 2103 2835 +2369 2143 2819 +2289 2191 2797 +2153 2247 2767 +1865 2315 2721 +0 2391 2655 +0 2475 2545 +0 2569 2337 +0 2671 1666 +0 2777 0 +0 2891 0 +0 3007 0 +0 3129 0 +0 3251 0 +0 3377 0 +0 3503 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4021 0 +2579 1959 2889 +2579 1960 2887 +2577 1963 2887 +2575 1966 2887 +2573 1970 2885 +2569 1975 2885 +2565 1982 2883 +2557 1992 2881 +2549 2004 2877 +2537 2019 2873 +2521 2040 2867 +2499 2065 2859 +2467 2097 2847 +2419 2137 2833 +2347 2187 2811 +2231 2243 2781 +2002 2311 2737 +1065 2387 2673 +0 2473 2567 +0 2567 2373 +0 2669 1807 +0 2777 0 +0 2889 0 +0 3007 0 +0 3127 0 +0 3251 0 +0 3377 0 +0 3503 0 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +2621 1950 2903 +2621 1952 2903 +2619 1954 2903 +2617 1957 2901 +2615 1961 2901 +2611 1967 2899 +2607 1974 2897 +2601 1983 2895 +2595 1996 2891 +2583 2012 2887 +2569 2032 2881 +2549 2059 2875 +2519 2091 2863 +2479 2131 2849 +2415 2181 2829 +2317 2239 2799 +2137 2307 2759 +1662 2385 2697 +0 2471 2597 +0 2565 2417 +0 2667 1946 +0 2775 0 +0 2889 0 +0 3007 0 +0 3127 0 +0 3251 0 +0 3377 0 +0 3503 0 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +2673 1938 2923 +2671 1940 2921 +2671 1942 2921 +2669 1945 2921 +2667 1949 2919 +2663 1955 2919 +2661 1962 2917 +2655 1972 2915 +2649 1985 2911 +2639 2001 2907 +2625 2022 2901 +2607 2049 2895 +2583 2083 2885 +2547 2123 2871 +2493 2173 2851 +2411 2233 2823 +2271 2301 2785 +1972 2379 2725 +0 2467 2633 +0 2563 2471 +0 2665 2083 +0 2773 0 +0 2887 0 +0 3005 0 +0 3127 0 +0 3249 0 +0 3375 0 +0 3503 0 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +2733 1921 2947 +2731 1923 2947 +2731 1926 2945 +2729 1929 2945 +2727 1933 2945 +2725 1939 2943 +2721 1947 2941 +2717 1957 2939 +2711 1970 2937 +2703 1987 2933 +2693 2009 2927 +2677 2036 2921 +2655 2071 2911 +2625 2113 2897 +2581 2163 2879 +2513 2225 2853 +2405 2295 2817 +2203 2373 2763 +1574 2461 2679 +0 2559 2533 +0 2661 2219 +0 2771 0 +0 2885 0 +0 3003 0 +0 3125 0 +0 3249 0 +0 3375 0 +0 3503 0 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +2803 1898 2977 +2801 1900 2977 +2801 1903 2977 +2799 1906 2975 +2799 1911 2975 +2797 1917 2973 +2793 1925 2973 +2789 1935 2971 +2785 1949 2967 +2777 1967 2963 +2767 1990 2959 +2755 2018 2953 +2737 2055 2943 +2711 2097 2931 +2675 2151 2915 +2621 2213 2891 +2539 2285 2857 +2397 2365 2807 +2093 2455 2733 +0 2553 2607 +0 2657 2353 +0 2767 0 +0 2883 0 +0 3001 0 +0 3123 0 +0 3247 0 +0 3375 0 +0 3501 0 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +2881 1865 3015 +2881 1867 3015 +2881 1870 3015 +2879 1874 3013 +2879 1879 3013 +2877 1885 3011 +2875 1894 3011 +2871 1905 3009 +2867 1920 3007 +2861 1939 3003 +2853 1963 2999 +2843 1993 2993 +2827 2031 2985 +2807 2077 2973 +2777 2131 2957 +2735 2197 2937 +2673 2271 2905 +2571 2353 2861 +2387 2445 2795 +1882 2545 2687 +0 2651 2487 +0 2763 1872 +0 2879 0 +0 2999 0 +0 3121 0 +0 3247 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +2969 1817 3061 +2969 1819 3061 +2969 1822 3061 +2969 1826 3059 +2967 1832 3059 +2965 1839 3059 +2963 1849 3057 +2961 1861 3055 +2957 1877 3053 +2953 1898 3051 +2947 1924 3047 +2937 1957 3041 +2925 1998 3033 +2909 2047 3023 +2885 2105 3009 +2853 2173 2991 +2805 2251 2963 +2731 2337 2925 +2611 2433 2869 +2371 2535 2779 +1178 2643 2621 +0 2757 2255 +0 2873 0 +0 2995 0 +0 3119 0 +0 3243 0 +0 3371 0 +0 3499 0 +0 3629 0 +0 3759 0 +0 3889 0 +0 4021 0 +3067 1743 3117 +3065 1746 3117 +3065 1749 3115 +3065 1754 3115 +3063 1761 3115 +3063 1769 3113 +3061 1780 3113 +3059 1795 3111 +3057 1813 3109 +3053 1837 3107 +3047 1867 3103 +3041 1904 3099 +3031 1950 3093 +3017 2004 3083 +2999 2069 3071 +2973 2141 3055 +2937 2225 3031 +2883 2315 2999 +2801 2415 2951 +2657 2521 2877 +2349 2631 2755 +0 2747 2513 +0 2867 1244 +0 2989 0 +0 3115 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3757 0 +0 3889 0 +0 4019 0 +3169 1621 3181 +3169 1624 3181 +3169 1629 3181 +3169 1636 3181 +3167 1644 3179 +3167 1655 3179 +3165 1669 3179 +3163 1687 3177 +3161 1711 3175 +3159 1741 3173 +3155 1777 3169 +3149 1822 3165 +3141 1876 3161 +3131 1940 3153 +3117 2012 3143 +3097 2095 3129 +3071 2185 3109 +3031 2285 3081 +2971 2389 3041 +2879 2501 2981 +2715 2617 2887 +2319 2735 2719 +0 2857 2309 +0 2983 0 +0 3109 0 +0 3237 0 +0 3365 0 +0 3495 0 +0 3625 0 +0 3757 0 +0 3887 0 +0 4019 0 +3279 1379 3255 +3279 1385 3255 +3279 1394 3255 +3277 1404 3255 +3277 1418 3255 +3277 1436 3253 +3275 1459 3253 +3275 1487 3251 +3273 1523 3251 +3271 1567 3249 +3267 1620 3245 +3263 1683 3243 +3257 1754 3237 +3249 1836 3231 +3239 1925 3223 +3223 2023 3211 +3203 2127 3195 +3173 2239 3171 +3131 2353 3139 +3067 2473 3091 +2967 2595 3019 +2781 2719 2901 +2275 2845 2669 +0 2973 1672 +0 3101 0 +0 3231 0 +0 3361 0 +0 3493 0 +0 3623 0 +0 3755 0 +0 3887 0 +0 4019 0 +3393 117 3339 +3393 207 3339 +3393 305 3339 +3393 410 3339 +3391 520 3337 +3391 636 3337 +3391 755 3337 +3389 877 3335 +3389 1001 3335 +3387 1128 3333 +3383 1255 3331 +3381 1384 3329 +3375 1514 3325 +3369 1644 3319 +3361 1775 3311 +3351 1906 3303 +3335 2037 3289 +3313 2169 3271 +3283 2301 3245 +3239 2433 3207 +3171 2565 3153 +3061 2697 3067 +2857 2829 2919 +2207 2961 2591 +0 3093 0 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3511 0 3431 +3511 0 3431 +3511 0 3431 +3511 0 3431 +3511 0 3431 +3509 0 3429 +3509 0 3429 +3509 0 3429 +3507 0 3427 +3507 0 3427 +3505 0 3425 +3501 0 3423 +3499 286 3419 +3493 1096 3415 +3487 1436 3409 +3479 1678 3401 +3467 1878 3391 +3451 2055 3375 +3429 2219 3355 +3397 2373 3327 +3351 2521 3285 +3279 2663 3223 +3165 2803 3123 +2943 2943 2943 +2099 3079 2463 +0 3215 0 +0 3349 0 +0 3483 0 +0 3617 0 +0 3749 0 +0 3883 0 +0 4015 0 +3633 0 3531 +3633 0 3531 +3633 0 3531 +3633 0 3531 +3633 0 3529 +3631 0 3529 +3631 0 3529 +3631 0 3529 +3629 0 3527 +3629 0 3527 +3627 0 3525 +3625 0 3523 +3623 0 3521 +3619 0 3517 +3615 0 3513 +3609 756 3507 +3599 1506 3499 +3587 1839 3487 +3571 2079 3471 +3547 2277 3449 +3515 2453 3417 +3467 2615 3371 +3395 2769 3301 +3273 2917 3189 +3035 3061 2971 +1896 3201 2197 +0 3339 0 +0 3475 0 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +3757 0 3637 +3757 0 3637 +3757 0 3637 +3757 0 3637 +3757 0 3637 +3757 0 3637 +3755 0 3635 +3755 0 3635 +3755 0 3635 +3753 0 3633 +3753 0 3633 +3751 0 3631 +3749 0 3629 +3747 0 3627 +3743 0 3623 +3739 0 3619 +3731 0 3611 +3723 1069 3603 +3711 1780 3591 +3693 2107 3573 +3671 2345 3549 +3637 2543 3515 +3587 2719 3467 +3513 2881 3391 +3387 3035 3263 +3137 3181 3007 +1263 3325 0 +0 3465 0 +0 3603 0 +0 3739 0 +0 3875 0 +0 4009 0 +3883 0 3749 +3883 0 3749 +3883 0 3749 +3883 0 3749 +3883 0 3749 +3883 0 3747 +3881 0 3747 +3881 0 3747 +3881 0 3747 +3881 0 3747 +3879 0 3745 +3879 0 3745 +3877 0 3743 +3875 0 3741 +3873 0 3737 +3869 0 3733 +3863 0 3729 +3857 0 3721 +3849 0 3713 +3835 1687 3699 +3819 2145 3681 +3795 2423 3657 +3761 2641 3621 +3711 2827 3569 +3633 2997 3487 +3505 3155 3347 +3243 3305 3053 +0 3451 0 +0 3593 0 +0 3733 0 +0 3869 0 +0 4005 0 +4011 0 3865 +4011 0 3865 +4011 0 3865 +4011 0 3865 +4009 0 3865 +4009 0 3865 +4009 0 3865 +4009 0 3863 +4009 0 3863 +4009 0 3863 +4007 0 3863 +4007 0 3861 +4005 0 3861 +4005 0 3859 +4003 0 3857 +3999 0 3853 +3997 0 3849 +3991 0 3845 +3985 0 3837 +3975 0 3827 +3963 1522 3815 +3945 2189 3795 +3921 2511 3769 +3887 2745 3731 +3835 2941 3677 +3757 3117 3589 +3627 3279 3441 +3357 3431 3105 +0 3579 0 +0 3721 0 +0 3861 0 +0 3999 0 +4095 0 3985 +4095 0 3985 +4095 0 3985 +4095 0 3985 +4095 0 3985 +4095 0 3985 +4095 0 3985 +4095 0 3985 +4095 0 3983 +4095 0 3983 +4095 0 3983 +4095 0 3983 +4095 0 3981 +4095 0 3981 +4095 0 3979 +4095 0 3977 +4095 0 3973 +4095 0 3969 +4095 0 3963 +4095 0 3957 +4095 0 3947 +4091 1122 3933 +4073 2243 3913 +4049 2605 3887 +4015 2855 3847 +3963 3061 3789 +3883 3239 3699 +3751 3405 3541 +3473 3559 3169 +0 3707 0 +0 3851 0 +0 3993 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4091 +4095 0 4085 +4095 0 4079 +4095 0 4069 +4095 0 4053 +4095 2305 4035 +4095 2707 4007 +4095 2971 3967 +4091 3181 3907 +4011 3365 3813 +3877 3531 3647 +3593 3687 3241 +0 3837 0 +0 3981 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2377 4095 +4095 2815 4095 +4095 3091 4089 +4095 3305 4029 +4095 3491 3933 +4003 3659 3759 +3717 3817 3321 +0 3967 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2459 4095 +4095 2929 4095 +4095 3213 4095 +4095 3431 4095 +4095 3619 4053 +4095 3789 3877 +3843 3947 3413 +2563 2115 2975 +2561 2115 2975 +2559 2117 2975 +2557 2119 2973 +2555 2123 2973 +2551 2125 2971 +2547 2131 2971 +2539 2137 2969 +2531 2147 2965 +2519 2159 2961 +2501 2173 2957 +2477 2193 2951 +2445 2217 2941 +2395 2249 2929 +2319 2287 2913 +2193 2333 2889 +1937 2389 2855 +0 2455 2805 +0 2529 2729 +0 2613 2601 +0 2707 2345 +0 2807 0 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2563 2113 2975 +2563 2115 2975 +2561 2117 2975 +2559 2119 2973 +2557 2121 2973 +2553 2125 2973 +2547 2131 2971 +2541 2137 2969 +2533 2147 2965 +2519 2157 2963 +2503 2173 2957 +2479 2193 2951 +2445 2217 2941 +2397 2249 2929 +2321 2287 2913 +2195 2333 2889 +1942 2389 2855 +0 2455 2805 +0 2529 2729 +0 2613 2603 +0 2707 2347 +0 2807 0 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2565 2113 2975 +2565 2115 2975 +2563 2117 2975 +2561 2119 2975 +2559 2121 2973 +2555 2125 2973 +2549 2131 2971 +2543 2137 2969 +2535 2147 2967 +2523 2157 2963 +2505 2173 2957 +2481 2193 2951 +2449 2217 2943 +2399 2247 2931 +2325 2287 2913 +2199 2333 2889 +1950 2389 2855 +201 2455 2807 +0 2529 2731 +0 2613 2603 +0 2707 2349 +0 2807 0 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2567 2113 2977 +2567 2115 2977 +2565 2117 2975 +2563 2119 2975 +2561 2121 2975 +2557 2125 2973 +2553 2131 2971 +2545 2137 2969 +2537 2145 2967 +2525 2157 2963 +2509 2173 2959 +2485 2191 2953 +2451 2217 2943 +2403 2247 2931 +2329 2287 2913 +2205 2333 2891 +1959 2389 2857 +515 2455 2807 +0 2529 2731 +0 2613 2605 +0 2707 2351 +0 2807 0 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2571 2113 2977 +2569 2115 2977 +2569 2115 2977 +2567 2117 2977 +2563 2121 2975 +2561 2125 2975 +2555 2129 2973 +2549 2137 2971 +2541 2145 2969 +2529 2157 2965 +2511 2173 2959 +2489 2191 2953 +2455 2217 2945 +2407 2247 2931 +2333 2285 2915 +2213 2333 2891 +1972 2389 2857 +748 2455 2809 +0 2529 2733 +0 2613 2607 +0 2705 2355 +0 2807 171 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2575 2113 2979 +2575 2113 2979 +2573 2115 2977 +2571 2117 2977 +2569 2121 2977 +2565 2125 2975 +2561 2129 2973 +2553 2135 2971 +2545 2145 2969 +2533 2157 2965 +2517 2171 2961 +2493 2191 2955 +2461 2215 2945 +2413 2247 2933 +2341 2285 2917 +2221 2333 2893 +1988 2389 2859 +942 2453 2811 +0 2529 2735 +0 2613 2611 +0 2705 2359 +0 2805 544 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2581 2111 2981 +2581 2113 2979 +2579 2115 2979 +2577 2117 2979 +2575 2119 2979 +2571 2123 2977 +2567 2129 2975 +2559 2135 2973 +2551 2145 2971 +2539 2155 2967 +2523 2171 2963 +2501 2191 2955 +2469 2215 2947 +2423 2247 2935 +2351 2285 2919 +2235 2331 2895 +2009 2387 2861 +1116 2453 2813 +0 2529 2737 +0 2613 2613 +0 2705 2367 +0 2805 799 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2589 2111 2983 +2587 2111 2983 +2587 2113 2981 +2585 2115 2981 +2583 2119 2981 +2579 2123 2979 +2575 2127 2977 +2567 2135 2975 +2559 2143 2973 +2547 2155 2969 +2533 2169 2965 +2509 2189 2959 +2479 2215 2949 +2433 2245 2937 +2363 2285 2921 +2251 2331 2897 +2035 2387 2865 +1277 2453 2815 +0 2529 2741 +0 2613 2619 +0 2705 2375 +0 2805 1005 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2599 2109 2985 +2597 2111 2985 +2597 2111 2985 +2595 2113 2983 +2593 2117 2983 +2589 2121 2983 +2585 2125 2981 +2579 2133 2979 +2571 2141 2975 +2559 2153 2973 +2543 2169 2967 +2521 2189 2961 +2491 2213 2953 +2447 2245 2941 +2379 2283 2923 +2271 2331 2901 +2069 2387 2867 +1430 2453 2819 +0 2527 2747 +0 2611 2625 +0 2705 2385 +0 2805 1185 +0 2913 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2611 2107 2989 +2611 2109 2989 +2609 2109 2989 +2607 2113 2987 +2605 2115 2987 +2603 2119 2985 +2597 2125 2985 +2593 2131 2983 +2585 2139 2979 +2573 2151 2977 +2559 2167 2971 +2537 2187 2965 +2507 2211 2957 +2465 2243 2945 +2401 2281 2929 +2297 2329 2905 +2109 2385 2873 +1577 2451 2825 +0 2527 2753 +0 2611 2633 +0 2705 2399 +0 2805 1350 +0 2911 0 +0 3025 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2629 2105 2995 +2627 2105 2993 +2627 2107 2993 +2625 2109 2993 +2623 2113 2991 +2619 2117 2991 +2615 2121 2989 +2609 2129 2987 +2601 2137 2985 +2591 2149 2981 +2577 2165 2977 +2557 2185 2971 +2529 2209 2961 +2489 2241 2951 +2427 2279 2933 +2331 2327 2911 +2159 2383 2879 +1720 2451 2833 +0 2525 2761 +0 2611 2645 +0 2703 2417 +0 2805 1506 +0 2911 0 +0 3023 0 +0 3141 0 +0 3261 0 +0 3385 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2651 2101 3001 +2649 2101 3001 +2649 2103 2999 +2647 2105 2999 +2645 2109 2999 +2641 2113 2997 +2637 2119 2997 +2633 2125 2995 +2625 2135 2991 +2615 2147 2989 +2601 2161 2983 +2583 2181 2977 +2555 2207 2969 +2517 2239 2957 +2461 2277 2941 +2371 2325 2919 +2217 2383 2887 +1860 2449 2841 +0 2525 2773 +0 2609 2659 +0 2703 2441 +0 2803 1654 +0 2911 0 +0 3023 0 +0 3141 0 +0 3261 0 +0 3383 0 +0 3509 0 +0 3637 0 +0 3765 0 +0 3893 0 +0 4023 0 +2677 2095 3009 +2677 2097 3009 +2675 2099 3009 +2675 2101 3009 +2673 2105 3007 +2669 2109 3007 +2665 2113 3005 +2661 2121 3003 +2653 2129 3001 +2645 2141 2997 +2631 2157 2993 +2615 2177 2987 +2589 2203 2979 +2553 2235 2967 +2501 2275 2951 +2421 2323 2929 +2285 2379 2899 +1998 2447 2855 +0 2523 2787 +0 2607 2677 +0 2701 2469 +0 2803 1798 +0 2909 0 +0 3023 0 +0 3139 0 +0 3261 0 +0 3383 0 +0 3509 0 +0 3635 0 +0 3765 0 +0 3893 0 +0 4023 0 +2713 2089 3021 +2711 2091 3021 +2711 2093 3021 +2709 2095 3019 +2707 2097 3019 +2705 2101 3017 +2701 2107 3017 +2697 2115 3015 +2689 2123 3013 +2681 2135 3009 +2669 2151 3005 +2653 2171 2999 +2631 2197 2991 +2599 2231 2979 +2551 2269 2965 +2479 2319 2943 +2363 2377 2913 +2133 2443 2869 +1197 2519 2805 +0 2605 2699 +0 2699 2505 +0 2801 1939 +0 2909 0 +0 3021 0 +0 3139 0 +0 3259 0 +0 3383 0 +0 3509 0 +0 3635 0 +0 3765 0 +0 3893 0 +0 4023 0 +2755 2081 3035 +2753 2081 3035 +2753 2083 3035 +2751 2087 3035 +2749 2089 3033 +2747 2093 3033 +2745 2099 3031 +2739 2107 3029 +2735 2115 3027 +2727 2127 3025 +2715 2143 3019 +2701 2165 3015 +2681 2191 3007 +2651 2223 2995 +2611 2265 2981 +2549 2313 2961 +2449 2371 2931 +2269 2439 2891 +1794 2517 2829 +0 2603 2729 +0 2697 2551 +0 2799 2077 +0 2907 0 +0 3021 0 +0 3139 0 +0 3259 0 +0 3383 0 +0 3509 0 +0 3635 0 +0 3763 0 +0 3893 0 +0 4023 0 +2805 2069 3055 +2805 2069 3055 +2803 2071 3053 +2803 2075 3053 +2801 2077 3053 +2799 2081 3051 +2797 2087 3051 +2793 2095 3049 +2787 2105 3047 +2781 2117 3043 +2771 2133 3039 +2757 2155 3033 +2739 2181 3027 +2715 2215 3017 +2679 2257 3003 +2625 2305 2983 +2543 2365 2955 +2403 2433 2917 +2105 2511 2857 +0 2599 2765 +0 2695 2603 +0 2797 2215 +0 2905 0 +0 3019 0 +0 3137 0 +0 3259 0 +0 3381 0 +0 3507 0 +0 3635 0 +0 3763 0 +0 3893 0 +0 4023 0 +2865 2051 3079 +2865 2053 3079 +2865 2055 3079 +2863 2057 3077 +2861 2061 3077 +2859 2065 3077 +2857 2071 3075 +2855 2079 3073 +2849 2089 3071 +2843 2103 3069 +2835 2119 3065 +2825 2141 3059 +2809 2169 3053 +2787 2203 3043 +2757 2245 3029 +2713 2297 3011 +2645 2357 2985 +2537 2427 2949 +2335 2505 2895 +1706 2593 2811 +0 2691 2667 +0 2793 2351 +0 2903 0 +0 3017 0 +0 3135 0 +0 3257 0 +0 3381 0 +0 3507 0 +0 3635 0 +0 3763 0 +0 3893 0 +0 4023 0 +2935 2029 3109 +2935 2030 3109 +2935 2032 3109 +2933 2035 3109 +2933 2038 3107 +2931 2043 3107 +2929 2049 3105 +2925 2057 3105 +2921 2067 3103 +2917 2081 3099 +2909 2099 3097 +2901 2121 3091 +2887 2151 3085 +2869 2187 3075 +2843 2229 3063 +2807 2283 3047 +2753 2345 3023 +2671 2417 2989 +2529 2497 2939 +2225 2587 2865 +0 2685 2739 +0 2789 2485 +0 2899 0 +0 3015 0 +0 3133 0 +0 3255 0 +0 3379 0 +0 3507 0 +0 3633 0 +0 3763 0 +0 3893 0 +0 4023 0 +3015 1995 3147 +3013 1997 3147 +3013 1999 3147 +3013 2002 3147 +3011 2006 3145 +3011 2011 3145 +3009 2017 3143 +3007 2026 3143 +3003 2037 3141 +2999 2051 3139 +2993 2071 3135 +2985 2095 3131 +2975 2125 3125 +2959 2163 3117 +2939 2209 3105 +2909 2263 3089 +2867 2329 3069 +2805 2403 3037 +2703 2485 2993 +2519 2577 2927 +2014 2677 2819 +0 2783 2619 +0 2895 2004 +0 3011 0 +0 3131 0 +0 3253 0 +0 3379 0 +0 3505 0 +0 3633 0 +0 3761 0 +0 3891 0 +0 4023 0 +3103 1947 3193 +3103 1949 3193 +3101 1951 3193 +3101 1954 3193 +3101 1958 3193 +3099 1964 3191 +3097 1971 3191 +3095 1981 3189 +3093 1993 3187 +3089 2009 3185 +3085 2030 3183 +3079 2057 3179 +3069 2089 3173 +3057 2131 3165 +3041 2179 3155 +3017 2237 3141 +2985 2305 3123 +2937 2383 3095 +2863 2469 3057 +2743 2565 3001 +2503 2667 2911 +1310 2775 2753 +0 2889 2387 +0 3005 0 +0 3127 0 +0 3251 0 +0 3377 0 +0 3503 0 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +3199 1873 3249 +3199 1875 3249 +3197 1878 3249 +3197 1882 3247 +3197 1886 3247 +3195 1893 3247 +3195 1901 3247 +3193 1912 3245 +3191 1927 3243 +3189 1946 3241 +3185 1969 3239 +3179 1999 3235 +3173 2036 3231 +3163 2081 3225 +3149 2137 3215 +3131 2201 3203 +3107 2273 3187 +3069 2357 3163 +3015 2447 3131 +2933 2547 3083 +2789 2653 3009 +2481 2763 2887 +0 2879 2645 +0 2999 1376 +0 3121 0 +0 3247 0 +0 3373 0 +0 3501 0 +0 3629 0 +0 3759 0 +0 3891 0 +0 4021 0 +3301 1750 3313 +3301 1753 3313 +3301 1757 3313 +3301 1761 3313 +3301 1768 3313 +3299 1776 3311 +3299 1787 3311 +3297 1801 3311 +3295 1820 3309 +3293 1843 3307 +3291 1873 3305 +3287 1909 3301 +3281 1954 3297 +3273 2008 3293 +3263 2071 3285 +3249 2145 3275 +3229 2227 3261 +3203 2317 3241 +3163 2417 3213 +3103 2521 3173 +3011 2633 3113 +2847 2749 3019 +2451 2867 2851 +0 2991 2441 +0 3115 0 +0 3241 0 +0 3369 0 +0 3497 0 +0 3627 0 +0 3759 0 +0 3889 0 +0 4019 0 +3411 1507 3387 +3411 1511 3387 +3411 1518 3387 +3411 1526 3387 +3409 1536 3387 +3409 1550 3387 +3409 1568 3385 +3407 1591 3385 +3407 1620 3383 +3405 1656 3383 +3403 1700 3381 +3399 1752 3377 +3395 1815 3375 +3389 1886 3369 +3381 1968 3363 +3371 2057 3355 +3355 2155 3343 +3335 2259 3327 +3305 2371 3303 +3263 2485 3271 +3199 2605 3223 +3099 2727 3151 +2913 2851 3033 +2407 2977 2801 +0 3105 1804 +0 3235 0 +0 3363 0 +0 3493 0 +0 3625 0 +0 3755 0 +0 3887 0 +0 4019 0 +3525 167 3471 +3525 249 3471 +3525 339 3471 +3525 437 3471 +3525 542 3471 +3523 652 3471 +3523 768 3469 +3523 887 3469 +3521 1009 3467 +3521 1133 3467 +3519 1260 3465 +3515 1387 3463 +3513 1516 3461 +3509 1646 3457 +3503 1776 3451 +3493 1907 3443 +3483 2038 3435 +3467 2169 3421 +3445 2301 3403 +3415 2433 3377 +3371 2565 3339 +3303 2697 3285 +3193 2829 3199 +2989 2961 3051 +2339 3093 2725 +0 3225 0 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3643 0 3563 +3643 0 3563 +3643 0 3563 +3643 0 3563 +3643 0 3563 +3643 0 3563 +3643 0 3561 +3641 0 3561 +3641 0 3561 +3639 0 3559 +3639 0 3559 +3637 0 3557 +3633 0 3555 +3631 418 3551 +3625 1228 3547 +3619 1568 3541 +3611 1811 3533 +3599 2011 3523 +3583 2187 3507 +3561 2351 3487 +3529 2505 3459 +3483 2653 3417 +3413 2795 3355 +3297 2937 3255 +3075 3075 3075 +2231 3211 2595 +0 3347 0 +0 3481 0 +0 3615 0 +0 3749 0 +0 3881 0 +0 4015 0 +3765 0 3663 +3765 0 3663 +3765 0 3663 +3765 0 3663 +3765 0 3663 +3765 0 3663 +3763 0 3661 +3763 0 3661 +3763 0 3661 +3763 0 3659 +3761 0 3659 +3759 0 3657 +3757 0 3655 +3755 0 3653 +3751 0 3649 +3747 0 3645 +3741 888 3639 +3731 1638 3631 +3719 1971 3619 +3703 2211 3603 +3681 2409 3581 +3647 2585 3549 +3599 2749 3503 +3527 2901 3433 +3405 3049 3321 +3167 3193 3103 +2028 3333 2329 +0 3471 0 +0 3607 0 +0 3743 0 +0 3877 0 +0 4011 0 +3889 0 3769 +3889 0 3769 +3889 0 3769 +3889 0 3769 +3889 0 3769 +3889 0 3769 +3889 0 3769 +3887 0 3767 +3887 0 3767 +3887 0 3767 +3885 0 3765 +3885 0 3765 +3883 0 3763 +3881 0 3761 +3879 0 3759 +3875 0 3755 +3871 0 3751 +3863 0 3743 +3855 1201 3735 +3843 1912 3723 +3825 2239 3705 +3803 2477 3681 +3769 2675 3647 +3719 2851 3599 +3645 3013 3523 +3519 3167 3395 +3269 3313 3139 +1395 3457 0 +0 3597 0 +0 3735 0 +0 3871 0 +0 4007 0 +4015 0 3881 +4015 0 3881 +4015 0 3881 +4015 0 3881 +4015 0 3881 +4015 0 3881 +4015 0 3881 +4015 0 3879 +4013 0 3879 +4013 0 3879 +4013 0 3879 +4011 0 3877 +4011 0 3877 +4009 0 3875 +4007 0 3873 +4005 0 3869 +4001 0 3867 +3995 0 3861 +3989 0 3855 +3981 0 3845 +3967 1819 3831 +3951 2277 3813 +3927 2555 3789 +3893 2773 3753 +3843 2961 3701 +3765 3129 3619 +3637 3287 3479 +3375 3437 3185 +0 3583 0 +0 3725 0 +0 3865 0 +0 4001 0 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3997 +4095 0 3995 +4095 0 3995 +4095 0 3995 +4095 0 3993 +4095 0 3993 +4095 0 3991 +4095 0 3989 +4095 0 3985 +4095 0 3981 +4095 0 3977 +4095 0 3969 +4095 0 3959 +4095 1654 3947 +4077 2321 3927 +4053 2643 3901 +4019 2877 3865 +3967 3075 3809 +3889 3249 3723 +3759 3411 3573 +3489 3563 3237 +0 3711 0 +0 3853 0 +0 3993 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4089 +4095 0 4079 +4095 1254 4065 +4095 2375 4045 +4095 2737 4019 +4095 2989 3979 +4095 3193 3923 +4015 3371 3831 +3883 3537 3673 +3605 3691 3301 +0 3839 0 +0 3983 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2437 4095 +4095 2839 4095 +4095 3103 4095 +4095 3313 4039 +4095 3497 3945 +4009 3663 3779 +3725 3819 3373 +0 3969 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2509 4095 +4095 2949 4095 +4095 3223 4095 +4095 3437 4095 +4095 3623 4065 +4095 3791 3891 +3849 3949 3455 +2693 2245 3107 +2693 2247 3107 +2691 2247 3107 +2691 2249 3107 +2689 2251 3105 +2685 2255 3105 +2683 2259 3103 +2677 2263 3103 +2671 2269 3101 +2661 2279 3097 +2649 2291 3093 +2633 2305 3089 +2609 2325 3083 +2575 2349 3073 +2525 2381 3061 +2449 2419 3043 +2321 2465 3021 +2065 2521 2987 +0 2587 2937 +0 2661 2861 +0 2745 2733 +0 2839 2477 +0 2939 0 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2695 2245 3107 +2695 2247 3107 +2693 2247 3107 +2691 2249 3107 +2689 2251 3105 +2687 2255 3105 +2683 2259 3103 +2679 2263 3103 +2671 2269 3101 +2663 2279 3097 +2651 2291 3095 +2633 2305 3089 +2609 2325 3083 +2577 2349 3073 +2527 2381 3061 +2451 2419 3045 +2325 2465 3021 +2069 2521 2987 +0 2587 2937 +0 2661 2861 +0 2745 2733 +0 2839 2477 +0 2939 0 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2697 2245 3107 +2695 2247 3107 +2695 2247 3107 +2693 2249 3107 +2691 2251 3107 +2689 2253 3105 +2685 2257 3105 +2679 2263 3103 +2673 2269 3101 +2665 2279 3099 +2653 2291 3095 +2635 2305 3089 +2611 2325 3083 +2577 2349 3073 +2529 2381 3061 +2453 2419 3045 +2327 2465 3021 +2075 2521 2987 +0 2587 2937 +0 2661 2861 +0 2745 2735 +0 2839 2479 +0 2939 0 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2699 2245 3109 +2697 2245 3109 +2697 2247 3107 +2695 2249 3107 +2693 2251 3107 +2691 2253 3105 +2687 2257 3105 +2681 2263 3103 +2675 2269 3101 +2667 2279 3099 +2655 2289 3095 +2637 2305 3091 +2613 2325 3083 +2581 2349 3075 +2531 2381 3063 +2457 2419 3045 +2331 2465 3021 +2081 2521 2987 +333 2587 2939 +0 2661 2863 +0 2745 2735 +0 2839 2481 +0 2939 0 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2701 2245 3109 +2699 2245 3109 +2699 2247 3109 +2697 2249 3107 +2695 2251 3107 +2693 2253 3107 +2689 2257 3105 +2685 2263 3103 +2677 2269 3101 +2669 2277 3099 +2657 2289 3095 +2641 2305 3091 +2617 2325 3085 +2583 2349 3075 +2535 2379 3063 +2461 2419 3047 +2337 2465 3023 +2091 2521 2989 +647 2587 2939 +0 2661 2863 +0 2745 2737 +0 2839 2483 +0 2939 0 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2705 2245 3109 +2703 2245 3109 +2703 2247 3109 +2701 2247 3109 +2699 2251 3109 +2697 2253 3107 +2693 2257 3107 +2687 2261 3105 +2681 2269 3103 +2673 2277 3101 +2661 2289 3097 +2643 2305 3091 +2621 2323 3085 +2587 2349 3077 +2539 2379 3063 +2467 2417 3047 +2345 2465 3023 +2103 2521 2989 +880 2587 2941 +0 2661 2865 +0 2745 2739 +0 2839 2487 +0 2939 303 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2709 2243 3111 +2707 2245 3111 +2707 2245 3111 +2705 2247 3111 +2703 2249 3109 +2701 2253 3109 +2697 2257 3107 +2693 2261 3107 +2685 2269 3105 +2677 2277 3101 +2665 2289 3097 +2649 2303 3093 +2627 2323 3087 +2593 2347 3077 +2545 2379 3065 +2473 2417 3049 +2353 2465 3025 +2121 2521 2991 +1074 2585 2943 +0 2661 2867 +0 2745 2743 +0 2837 2493 +0 2939 677 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2715 2243 3113 +2713 2243 3113 +2713 2245 3113 +2711 2247 3111 +2709 2249 3111 +2707 2251 3111 +2703 2255 3109 +2699 2261 3107 +2693 2267 3105 +2683 2277 3103 +2671 2287 3099 +2655 2303 3095 +2633 2323 3089 +2601 2347 3079 +2555 2379 3067 +2483 2417 3051 +2367 2463 3027 +2141 2519 2993 +1248 2585 2945 +0 2661 2869 +0 2745 2745 +0 2837 2499 +0 2937 931 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2721 2241 3115 +2721 2243 3115 +2719 2243 3115 +2719 2245 3113 +2717 2247 3113 +2715 2251 3113 +2711 2255 3111 +2707 2259 3109 +2701 2267 3107 +2691 2275 3105 +2681 2287 3101 +2665 2303 3097 +2643 2321 3091 +2611 2347 3081 +2565 2377 3069 +2495 2417 3053 +2383 2463 3029 +2167 2519 2997 +1409 2585 2947 +0 2661 2873 +0 2745 2751 +0 2837 2507 +0 2937 1137 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2731 2241 3117 +2731 2241 3117 +2731 2243 3117 +2729 2243 3117 +2727 2247 3117 +2725 2249 3115 +2721 2253 3115 +2717 2259 3113 +2711 2265 3111 +2703 2273 3109 +2691 2285 3105 +2675 2301 3099 +2653 2321 3093 +2623 2345 3085 +2579 2377 3073 +2513 2415 3057 +2403 2463 3033 +2201 2519 3001 +1562 2585 2951 +0 2659 2879 +0 2745 2757 +0 2837 2517 +0 2937 1317 +0 3045 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2745 2239 3121 +2745 2239 3121 +2743 2241 3121 +2741 2241 3121 +2739 2245 3119 +2737 2247 3119 +2735 2251 3117 +2731 2257 3117 +2725 2263 3115 +2717 2273 3111 +2705 2283 3109 +2691 2299 3103 +2669 2319 3097 +2639 2343 3089 +2597 2375 3077 +2533 2413 3061 +2429 2461 3037 +2241 2517 3005 +1709 2583 2957 +0 2659 2885 +0 2743 2765 +0 2837 2531 +0 2937 1482 +0 3043 0 +0 3157 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2761 2235 3127 +2761 2237 3127 +2761 2237 3125 +2759 2239 3125 +2757 2241 3125 +2755 2245 3125 +2751 2249 3123 +2747 2253 3121 +2741 2261 3119 +2735 2269 3117 +2723 2281 3113 +2709 2297 3109 +2689 2317 3103 +2661 2341 3095 +2621 2373 3083 +2559 2413 3067 +2463 2459 3043 +2291 2517 3011 +1852 2583 2965 +0 2657 2893 +0 2743 2777 +0 2835 2549 +0 2937 1638 +0 3043 0 +0 3155 0 +0 3273 0 +0 3393 0 +0 3517 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2783 2231 3133 +2783 2233 3133 +2781 2235 3133 +2781 2235 3133 +2779 2239 3131 +2777 2241 3131 +2773 2245 3129 +2769 2251 3129 +2765 2257 3127 +2757 2267 3123 +2747 2279 3121 +2733 2293 3115 +2715 2313 3109 +2687 2339 3101 +2649 2371 3089 +2593 2409 3073 +2503 2457 3051 +2349 2515 3019 +1992 2581 2973 +0 2657 2905 +0 2741 2791 +0 2835 2573 +0 2935 1786 +0 3043 0 +0 3155 0 +0 3273 0 +0 3393 0 +0 3515 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2811 2227 3141 +2811 2229 3141 +2809 2229 3141 +2809 2231 3141 +2807 2233 3141 +2805 2237 3139 +2801 2241 3139 +2797 2245 3137 +2793 2253 3135 +2787 2261 3133 +2777 2273 3129 +2763 2289 3125 +2747 2309 3119 +2721 2335 3111 +2687 2367 3099 +2633 2407 3083 +2553 2455 3061 +2417 2511 3031 +2129 2579 2987 +0 2655 2919 +0 2739 2809 +0 2833 2601 +0 2935 1931 +0 3043 0 +0 3155 0 +0 3271 0 +0 3393 0 +0 3515 0 +0 3641 0 +0 3769 0 +0 3897 0 +0 4025 0 +2845 2221 3153 +2845 2221 3153 +2843 2223 3153 +2843 2225 3153 +2841 2227 3151 +2839 2229 3151 +2837 2235 3149 +2833 2239 3149 +2829 2247 3147 +2823 2255 3145 +2813 2267 3141 +2801 2283 3137 +2785 2305 3131 +2763 2329 3123 +2731 2363 3111 +2683 2403 3097 +2613 2451 3075 +2495 2509 3045 +2267 2575 3003 +1329 2653 2937 +0 2737 2831 +0 2831 2637 +0 2933 2071 +0 3041 0 +0 3153 0 +0 3271 0 +0 3391 0 +0 3515 0 +0 3641 0 +0 3767 0 +0 3897 0 +0 4025 0 +2887 2211 3167 +2887 2213 3167 +2885 2215 3167 +2885 2215 3167 +2883 2219 3167 +2881 2221 3165 +2879 2225 3165 +2877 2231 3163 +2873 2239 3161 +2867 2247 3159 +2859 2261 3157 +2847 2277 3151 +2833 2297 3147 +2813 2323 3139 +2785 2355 3127 +2743 2397 3113 +2681 2445 3093 +2581 2503 3065 +2401 2571 3023 +1927 2649 2961 +0 2735 2861 +0 2829 2683 +0 2931 2211 +0 3039 0 +0 3153 0 +0 3271 0 +0 3391 0 +0 3515 0 +0 3641 0 +0 3767 0 +0 3895 0 +0 4025 0 +2937 2199 3187 +2937 2201 3187 +2937 2203 3187 +2935 2203 3185 +2935 2207 3185 +2933 2209 3185 +2931 2213 3183 +2929 2219 3183 +2925 2227 3181 +2919 2237 3179 +2913 2249 3175 +2903 2265 3171 +2889 2287 3167 +2873 2313 3159 +2847 2347 3149 +2811 2389 3135 +2757 2439 3115 +2675 2497 3087 +2535 2565 3049 +2237 2645 2991 +0 2731 2897 +0 2827 2735 +0 2929 2347 +0 3037 0 +0 3151 0 +0 3269 0 +0 3391 0 +0 3515 0 +0 3639 0 +0 3767 0 +0 3895 0 +0 4025 0 +2997 2183 3211 +2997 2185 3211 +2997 2185 3211 +2997 2187 3211 +2995 2189 3209 +2993 2193 3209 +2993 2197 3209 +2989 2203 3207 +2987 2211 3205 +2981 2221 3203 +2975 2235 3201 +2967 2251 3197 +2957 2273 3191 +2941 2301 3185 +2919 2335 3175 +2889 2377 3161 +2845 2429 3143 +2777 2489 3117 +2669 2559 3081 +2467 2637 3027 +1839 2727 2943 +0 2823 2799 +0 2925 2483 +0 3035 0 +0 3149 0 +0 3267 0 +0 3389 0 +0 3513 0 +0 3639 0 +0 3767 0 +0 3895 0 +0 4025 0 +3067 2159 3241 +3067 2161 3241 +3067 2163 3241 +3067 2165 3241 +3065 2167 3241 +3065 2171 3239 +3063 2175 3239 +3061 2181 3237 +3057 2189 3237 +3053 2199 3235 +3049 2213 3231 +3041 2231 3229 +3033 2253 3223 +3019 2283 3217 +3001 2319 3207 +2975 2363 3195 +2939 2415 3179 +2887 2477 3155 +2803 2549 3121 +2661 2629 3073 +2357 2719 2997 +0 2817 2871 +0 2921 2617 +0 3031 83 +0 3147 0 +0 3265 0 +0 3387 0 +0 3511 0 +0 3639 0 +0 3765 0 +0 3895 0 +0 4025 0 +3147 2127 3279 +3147 2127 3279 +3147 2129 3279 +3145 2131 3279 +3145 2135 3279 +3143 2137 3277 +3143 2143 3277 +3141 2149 3277 +3139 2159 3275 +3135 2169 3273 +3131 2185 3271 +3125 2203 3267 +3117 2227 3263 +3107 2257 3257 +3091 2295 3249 +3071 2341 3237 +3041 2397 3221 +2999 2461 3201 +2937 2535 3171 +2835 2617 3127 +2651 2709 3059 +2145 2809 2953 +0 2915 2751 +0 3027 2137 +0 3143 0 +0 3263 0 +0 3385 0 +0 3511 0 +0 3637 0 +0 3765 0 +0 3895 0 +0 4023 0 +3235 2077 3325 +3235 2079 3325 +3235 2081 3325 +3233 2083 3325 +3233 2087 3325 +3233 2091 3325 +3231 2097 3323 +3229 2103 3323 +3227 2113 3321 +3225 2125 3319 +3221 2141 3317 +3217 2163 3315 +3211 2189 3311 +3201 2221 3305 +3189 2263 3297 +3173 2311 3287 +3151 2369 3273 +3117 2437 3255 +3069 2515 3229 +2995 2601 3189 +2875 2697 3133 +2635 2799 3043 +1442 2907 2885 +0 3021 2519 +0 3137 0 +0 3259 0 +0 3383 0 +0 3509 0 +0 3635 0 +0 3763 0 +0 3893 0 +0 4023 0 +3331 2004 3381 +3331 2005 3381 +3331 2007 3381 +3331 2010 3381 +3329 2014 3381 +3329 2019 3379 +3329 2025 3379 +3327 2033 3379 +3325 2045 3377 +3323 2059 3375 +3321 2077 3373 +3317 2101 3371 +3311 2131 3367 +3305 2169 3363 +3295 2215 3357 +3281 2269 3347 +3263 2333 3335 +3239 2405 3319 +3201 2489 3295 +3149 2579 3263 +3065 2679 3215 +2923 2785 3141 +2613 2895 3019 +0 3011 2777 +0 3131 1508 +0 3253 0 +0 3379 0 +0 3505 0 +0 3633 0 +0 3763 0 +0 3891 0 +0 4023 0 +3435 1880 3445 +3433 1882 3445 +3433 1885 3445 +3433 1889 3445 +3433 1894 3445 +3433 1900 3445 +3431 1908 3443 +3431 1919 3443 +3429 1933 3443 +3427 1952 3441 +3425 1975 3439 +3423 2005 3437 +3419 2042 3435 +3413 2087 3429 +3405 2141 3425 +3395 2203 3417 +3381 2277 3407 +3361 2359 3393 +3335 2449 3373 +3295 2549 3345 +3237 2653 3305 +3143 2765 3245 +2979 2881 3151 +2583 2999 2985 +0 3123 2573 +0 3247 0 +0 3373 0 +0 3501 0 +0 3631 0 +0 3759 0 +0 3891 0 +0 4021 0 +3543 1635 3519 +3543 1639 3519 +3543 1644 3519 +3543 1650 3519 +3543 1658 3519 +3543 1668 3519 +3541 1682 3519 +3541 1700 3517 +3539 1723 3517 +3539 1752 3517 +3537 1788 3515 +3535 1832 3513 +3531 1885 3511 +3527 1947 3507 +3521 2019 3501 +3513 2099 3495 +3503 2189 3487 +3487 2287 3475 +3467 2393 3459 +3437 2503 3435 +3395 2617 3403 +3331 2737 3357 +3231 2859 3285 +3045 2983 3165 +2539 3109 2933 +0 3237 1936 +0 3367 0 +0 3495 0 +0 3627 0 +0 3757 0 +0 3887 0 +0 4019 0 +3657 227 3603 +3657 299 3603 +3657 381 3603 +3657 471 3603 +3657 569 3603 +3657 674 3603 +3657 784 3603 +3655 900 3601 +3655 1019 3601 +3653 1141 3601 +3653 1265 3599 +3651 1392 3597 +3649 1520 3595 +3645 1648 3593 +3641 1778 3589 +3635 1908 3583 +3625 2039 3577 +3615 2171 3567 +3599 2301 3553 +3577 2433 3535 +3547 2565 3509 +3503 2697 3471 +3435 2829 3417 +3327 2961 3331 +3121 3093 3183 +2471 3225 2857 +0 3357 0 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3775 0 3695 +3775 0 3695 +3775 0 3695 +3775 0 3695 +3775 0 3695 +3775 0 3695 +3775 0 3695 +3775 0 3693 +3773 0 3693 +3773 0 3693 +3771 0 3691 +3771 0 3691 +3769 0 3689 +3765 0 3687 +3763 550 3683 +3757 1360 3679 +3751 1700 3673 +3743 1943 3665 +3731 2143 3655 +3715 2319 3639 +3693 2483 3619 +3661 2637 3591 +3615 2785 3549 +3545 2927 3487 +3429 3069 3387 +3207 3207 3207 +2363 3343 2727 +0 3479 0 +0 3613 0 +0 3747 0 +0 3881 0 +0 4013 0 +3897 0 3795 +3897 0 3795 +3897 0 3795 +3897 0 3795 +3897 0 3795 +3897 0 3795 +3897 0 3795 +3897 0 3793 +3895 0 3793 +3895 0 3793 +3895 0 3793 +3893 0 3791 +3891 0 3789 +3889 0 3787 +3887 0 3785 +3883 0 3781 +3879 0 3777 +3873 1021 3771 +3863 1770 3763 +3851 2103 3751 +3835 2343 3735 +3813 2541 3713 +3779 2717 3681 +3731 2881 3635 +3659 3033 3567 +3537 3181 3453 +3299 3325 3235 +2161 3465 2461 +0 3603 0 +0 3739 0 +0 3875 0 +0 4009 0 +4021 0 3901 +4021 0 3901 +4021 0 3901 +4021 0 3901 +4021 0 3901 +4021 0 3901 +4021 0 3901 +4021 0 3901 +4019 0 3899 +4019 0 3899 +4019 0 3899 +4019 0 3899 +4017 0 3897 +4015 0 3895 +4013 0 3893 +4011 0 3891 +4007 0 3887 +4003 0 3883 +3995 0 3875 +3987 1333 3867 +3975 2044 3855 +3957 2373 3837 +3935 2609 3813 +3901 2807 3779 +3851 2983 3731 +3777 3145 3655 +3651 3299 3527 +3401 3445 3271 +1527 3589 0 +0 3729 0 +0 3867 0 +0 4005 0 +4095 0 4013 +4095 0 4013 +4095 0 4013 +4095 0 4013 +4095 0 4013 +4095 0 4013 +4095 0 4013 +4095 0 4013 +4095 0 4011 +4095 0 4011 +4095 0 4011 +4095 0 4011 +4095 0 4009 +4095 0 4009 +4095 0 4007 +4095 0 4005 +4095 0 4003 +4095 0 3999 +4095 0 3993 +4095 0 3987 +4095 0 3977 +4095 1951 3963 +4083 2409 3947 +4059 2687 3921 +4025 2905 3885 +3975 3093 3833 +3897 3261 3751 +3769 3419 3611 +3509 3569 3317 +0 3715 0 +0 3857 0 +0 3997 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4091 +4095 1786 4079 +4095 2453 4059 +4095 2775 4033 +4095 3009 3997 +4095 3207 3941 +4021 3381 3855 +3891 3543 3705 +3621 3695 3369 +0 3843 0 +0 3985 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1387 4095 +4095 2507 4095 +4095 2869 4095 +4095 3121 4095 +4095 3325 4055 +4095 3503 3963 +4015 3669 3805 +3737 3823 3433 +0 3971 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2569 4095 +4095 2971 4095 +4095 3235 4095 +4095 3445 4095 +4095 3629 4077 +4095 3795 3911 +3859 3951 3505 +2825 2377 3239 +2825 2377 3239 +2825 2379 3239 +2823 2379 3239 +2821 2381 3237 +2819 2383 3237 +2817 2387 3237 +2813 2391 3235 +2809 2395 3233 +2803 2403 3231 +2793 2411 3229 +2781 2423 3225 +2763 2437 3221 +2739 2457 3215 +2705 2481 3205 +2657 2513 3193 +2579 2551 3175 +2453 2597 3153 +2193 2653 3119 +0 2719 3069 +0 2793 2993 +0 2879 2865 +0 2971 2607 +0 3071 0 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3775 0 +0 3901 0 +0 4029 0 +2827 2377 3239 +2827 2377 3239 +2825 2379 3239 +2825 2379 3239 +2823 2381 3239 +2821 2383 3237 +2817 2387 3237 +2815 2391 3235 +2809 2395 3235 +2803 2403 3233 +2793 2411 3229 +2781 2423 3225 +2765 2437 3221 +2741 2457 3215 +2707 2481 3205 +2657 2513 3193 +2581 2551 3177 +2453 2597 3153 +2197 2653 3119 +0 2719 3069 +0 2793 2993 +0 2877 2865 +0 2971 2609 +0 3071 0 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3775 0 +0 3901 0 +0 4029 0 +2827 2377 3239 +2827 2377 3239 +2827 2379 3239 +2825 2379 3239 +2823 2381 3239 +2821 2383 3237 +2819 2387 3237 +2815 2391 3235 +2811 2395 3235 +2803 2401 3233 +2795 2411 3229 +2783 2423 3227 +2765 2437 3221 +2743 2457 3215 +2709 2481 3205 +2659 2513 3193 +2583 2551 3177 +2457 2597 3153 +2201 2653 3119 +0 2719 3069 +0 2793 2993 +0 2877 2867 +0 2971 2609 +0 3071 0 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3775 0 +0 3901 0 +0 4029 0 +2829 2377 3241 +2829 2377 3239 +2827 2379 3239 +2827 2379 3239 +2825 2381 3239 +2823 2383 3239 +2821 2387 3237 +2817 2389 3237 +2811 2395 3235 +2805 2401 3233 +2797 2411 3231 +2785 2423 3227 +2767 2437 3221 +2743 2457 3215 +2711 2481 3207 +2661 2513 3193 +2585 2551 3177 +2459 2597 3153 +2207 2653 3119 +0 2719 3069 +0 2793 2993 +0 2877 2867 +0 2971 2611 +0 3071 0 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3775 0 +0 3901 0 +0 4029 0 +2831 2377 3241 +2831 2377 3241 +2829 2377 3241 +2829 2379 3239 +2827 2381 3239 +2825 2383 3239 +2823 2385 3237 +2819 2389 3237 +2813 2395 3235 +2807 2401 3233 +2799 2411 3231 +2787 2421 3227 +2769 2437 3223 +2745 2457 3215 +2713 2481 3207 +2663 2513 3195 +2589 2551 3177 +2463 2597 3153 +2213 2653 3119 +465 2719 3071 +0 2793 2995 +0 2877 2869 +0 2971 2613 +0 3071 0 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3775 0 +0 3901 0 +0 4029 0 +2833 2375 3241 +2833 2377 3241 +2833 2377 3241 +2831 2379 3241 +2829 2381 3241 +2827 2383 3239 +2825 2385 3239 +2821 2389 3237 +2817 2395 3237 +2809 2401 3235 +2801 2411 3231 +2789 2421 3227 +2773 2437 3223 +2749 2457 3217 +2715 2481 3207 +2667 2511 3195 +2593 2551 3179 +2469 2597 3155 +2223 2653 3121 +779 2719 3071 +0 2793 2995 +0 2877 2869 +0 2971 2615 +0 3071 0 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2837 2375 3243 +2837 2377 3243 +2835 2377 3241 +2835 2379 3241 +2833 2379 3241 +2831 2383 3241 +2829 2385 3239 +2825 2389 3239 +2819 2395 3237 +2813 2401 3235 +2805 2409 3233 +2793 2421 3229 +2777 2437 3223 +2753 2455 3217 +2719 2481 3209 +2671 2511 3197 +2599 2551 3179 +2477 2597 3155 +2237 2653 3123 +1012 2719 3073 +0 2793 2997 +0 2877 2871 +0 2971 2619 +0 3071 435 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2841 2375 3243 +2841 2375 3243 +2839 2377 3243 +2839 2377 3243 +2837 2379 3243 +2835 2381 3241 +2833 2385 3241 +2829 2389 3239 +2825 2393 3239 +2819 2401 3237 +2809 2409 3233 +2797 2421 3229 +2781 2435 3225 +2759 2455 3219 +2725 2479 3209 +2679 2511 3197 +2605 2549 3181 +2487 2597 3157 +2253 2653 3123 +1206 2719 3075 +0 2793 2999 +0 2877 2875 +0 2971 2625 +0 3071 809 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2847 2375 3245 +2847 2375 3245 +2845 2375 3245 +2845 2377 3245 +2843 2379 3243 +2841 2381 3243 +2839 2383 3243 +2835 2387 3241 +2831 2393 3239 +2825 2399 3237 +2815 2409 3235 +2803 2419 3231 +2787 2435 3227 +2765 2455 3221 +2733 2479 3211 +2687 2511 3199 +2615 2549 3183 +2499 2597 3159 +2273 2653 3125 +1380 2717 3077 +0 2793 3003 +0 2877 2877 +0 2969 2631 +0 3071 1063 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2855 2373 3247 +2853 2373 3247 +2853 2375 3247 +2853 2375 3247 +2851 2377 3245 +2849 2379 3245 +2847 2383 3245 +2843 2387 3243 +2839 2391 3241 +2833 2399 3239 +2823 2407 3237 +2813 2419 3233 +2797 2435 3229 +2775 2453 3223 +2743 2479 3213 +2697 2509 3201 +2627 2549 3185 +2515 2595 3161 +2299 2651 3129 +1541 2717 3079 +0 2793 3005 +0 2877 2883 +0 2969 2639 +0 3069 1269 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2865 2371 3249 +2863 2373 3249 +2863 2373 3249 +2863 2375 3249 +2861 2377 3249 +2859 2379 3249 +2857 2381 3247 +2853 2385 3247 +2849 2391 3245 +2843 2397 3243 +2835 2405 3241 +2823 2417 3237 +2807 2433 3231 +2787 2453 3225 +2755 2477 3217 +2711 2509 3205 +2645 2547 3189 +2535 2595 3165 +2333 2651 3133 +1694 2717 3085 +0 2791 3011 +0 2877 2889 +0 2969 2649 +0 3069 1449 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2877 2369 3253 +2877 2371 3253 +2877 2371 3253 +2875 2373 3253 +2873 2375 3253 +2873 2377 3251 +2869 2379 3251 +2867 2383 3251 +2863 2389 3249 +2857 2395 3247 +2849 2405 3245 +2837 2415 3241 +2823 2431 3235 +2801 2451 3229 +2773 2475 3221 +2729 2507 3209 +2665 2547 3193 +2563 2593 3169 +2373 2649 3137 +1841 2715 3089 +0 2791 3017 +0 2875 2897 +0 2969 2663 +0 3069 1614 +0 3177 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2895 2367 3259 +2893 2367 3259 +2893 2369 3259 +2893 2369 3259 +2891 2371 3257 +2889 2373 3257 +2887 2377 3257 +2883 2381 3255 +2879 2385 3253 +2873 2393 3251 +2867 2401 3249 +2855 2413 3245 +2841 2429 3241 +2821 2449 3235 +2793 2473 3227 +2753 2505 3215 +2691 2545 3199 +2595 2591 3175 +2423 2649 3143 +1984 2715 3097 +0 2789 3025 +0 2875 2909 +0 2967 2681 +0 3069 1770 +0 3175 0 +0 3289 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2915 2363 3265 +2915 2365 3265 +2915 2365 3265 +2913 2367 3265 +2913 2367 3265 +2911 2371 3263 +2909 2373 3263 +2905 2377 3261 +2901 2383 3261 +2897 2389 3259 +2889 2399 3255 +2879 2411 3253 +2865 2425 3247 +2847 2445 3241 +2819 2471 3233 +2781 2503 3221 +2725 2541 3205 +2637 2589 3183 +2481 2647 3151 +2123 2713 3107 +0 2789 3037 +0 2873 2923 +0 2967 2705 +0 3067 1919 +0 3175 0 +0 3287 0 +0 3405 0 +0 3525 0 +0 3649 0 +0 3773 0 +0 3901 0 +0 4029 0 +2943 2359 3275 +2943 2359 3273 +2943 2361 3273 +2941 2361 3273 +2941 2363 3273 +2939 2365 3273 +2937 2369 3271 +2933 2373 3271 +2931 2377 3269 +2925 2385 3267 +2919 2393 3265 +2909 2405 3261 +2897 2421 3257 +2879 2441 3251 +2853 2467 3243 +2819 2499 3231 +2767 2539 3215 +2685 2587 3193 +2549 2643 3163 +2261 2711 3119 +0 2787 3051 +0 2871 2941 +0 2965 2733 +0 3067 2063 +0 3175 0 +0 3287 0 +0 3405 0 +0 3525 0 +0 3647 0 +0 3773 0 +0 3901 0 +0 4029 0 +2977 2353 3285 +2977 2353 3285 +2977 2353 3285 +2975 2355 3285 +2975 2357 3285 +2973 2359 3283 +2971 2363 3283 +2969 2367 3281 +2965 2371 3281 +2961 2379 3279 +2955 2387 3277 +2945 2401 3273 +2933 2415 3269 +2917 2437 3263 +2895 2461 3255 +2863 2495 3243 +2815 2535 3229 +2745 2583 3207 +2627 2641 3177 +2399 2707 3135 +1461 2785 3069 +0 2869 2965 +0 2963 2769 +0 3065 2203 +0 3173 0 +0 3287 0 +0 3403 0 +0 3525 0 +0 3647 0 +0 3773 0 +0 3901 0 +0 4029 0 +3019 2343 3301 +3019 2343 3299 +3019 2345 3299 +3017 2347 3299 +3017 2347 3299 +3015 2351 3299 +3013 2353 3297 +3011 2357 3297 +3009 2363 3295 +3005 2371 3293 +2999 2379 3291 +2991 2393 3289 +2979 2409 3285 +2965 2429 3279 +2945 2455 3271 +2917 2487 3259 +2875 2529 3245 +2813 2577 3225 +2713 2635 3197 +2533 2703 3155 +2059 2781 3093 +0 2867 2993 +0 2961 2815 +0 3063 2343 +0 3171 0 +0 3285 0 +0 3403 0 +0 3523 0 +0 3647 0 +0 3773 0 +0 3899 0 +0 4029 0 +3071 2331 3319 +3069 2331 3319 +3069 2333 3319 +3069 2335 3319 +3067 2335 3319 +3067 2339 3317 +3065 2341 3317 +3063 2345 3315 +3061 2351 3315 +3057 2359 3313 +3051 2369 3311 +3045 2381 3307 +3035 2397 3303 +3023 2419 3299 +3005 2445 3291 +2979 2479 3281 +2943 2521 3267 +2891 2571 3247 +2807 2629 3219 +2667 2699 3181 +2369 2777 3123 +0 2863 3031 +0 2959 2867 +0 3061 2479 +0 3169 0 +0 3283 0 +0 3401 0 +0 3523 0 +0 3647 0 +0 3773 0 +0 3899 0 +0 4027 0 +3131 2315 3343 +3131 2315 3343 +3129 2317 3343 +3129 2317 3343 +3129 2319 3343 +3127 2321 3341 +3125 2325 3341 +3125 2329 3341 +3121 2335 3339 +3119 2343 3337 +3113 2353 3335 +3107 2367 3333 +3099 2383 3329 +3089 2405 3323 +3073 2433 3317 +3051 2467 3307 +3021 2509 3293 +2977 2561 3275 +2909 2621 3249 +2801 2691 3213 +2599 2769 3159 +1971 2859 3075 +0 2955 2931 +0 3057 2615 +0 3167 0 +0 3281 0 +0 3399 0 +0 3521 0 +0 3645 0 +0 3771 0 +0 3899 0 +0 4027 0 +3201 2291 3373 +3199 2291 3373 +3199 2293 3373 +3199 2295 3373 +3199 2297 3373 +3197 2299 3373 +3197 2303 3371 +3195 2307 3371 +3193 2313 3371 +3189 2321 3369 +3185 2331 3367 +3181 2345 3363 +3173 2363 3361 +3165 2387 3355 +3151 2415 3349 +3133 2451 3339 +3107 2495 3327 +3071 2547 3311 +3019 2609 3287 +2935 2681 3253 +2793 2761 3205 +2489 2851 3129 +0 2949 3003 +0 3053 2749 +0 3163 215 +0 3279 0 +0 3397 0 +0 3519 0 +0 3645 0 +0 3771 0 +0 3899 0 +0 4027 0 +3279 2257 3411 +3279 2259 3411 +3279 2259 3411 +3279 2261 3411 +3277 2263 3411 +3277 2267 3411 +3275 2271 3409 +3275 2275 3409 +3273 2281 3409 +3271 2291 3407 +3267 2301 3405 +3263 2317 3403 +3257 2335 3399 +3249 2359 3395 +3239 2389 3389 +3223 2427 3381 +3203 2473 3369 +3173 2529 3355 +3131 2593 3333 +3069 2667 3303 +2967 2749 3259 +2783 2841 3191 +2277 2941 3085 +0 3047 2883 +0 3159 2269 +0 3275 0 +0 3395 0 +0 3517 0 +0 3643 0 +0 3769 0 +0 3897 0 +0 4027 0 +3367 2209 3457 +3367 2209 3457 +3367 2211 3457 +3367 2213 3457 +3365 2215 3457 +3365 2219 3457 +3365 2223 3457 +3363 2229 3455 +3361 2235 3455 +3361 2245 3453 +3357 2257 3451 +3353 2273 3449 +3349 2295 3447 +3343 2321 3443 +3333 2353 3437 +3321 2395 3429 +3305 2443 3419 +3283 2503 3407 +3249 2571 3387 +3201 2647 3361 +3127 2735 3321 +3007 2829 3265 +2767 2931 3175 +1574 3039 3017 +0 3153 2651 +0 3271 0 +0 3391 0 +0 3515 0 +0 3641 0 +0 3767 0 +0 3895 0 +0 4025 0 +3463 2135 3513 +3463 2135 3513 +3463 2137 3513 +3463 2139 3513 +3463 2143 3513 +3461 2145 3513 +3461 2151 3511 +3461 2157 3511 +3459 2165 3511 +3457 2177 3509 +3455 2191 3507 +3453 2209 3505 +3449 2233 3503 +3443 2263 3499 +3437 2301 3495 +3427 2347 3489 +3413 2401 3479 +3395 2465 3467 +3371 2537 3451 +3333 2621 3427 +3281 2711 3395 +3197 2811 3347 +3055 2917 3273 +2745 3027 3151 +0 3143 2909 +0 3263 1640 +0 3385 0 +0 3511 0 +0 3637 0 +0 3765 0 +0 3895 0 +0 4023 0 +3567 2011 3577 +3567 2012 3577 +3567 2014 3577 +3565 2017 3577 +3565 2021 3577 +3565 2026 3577 +3565 2032 3577 +3563 2040 3577 +3563 2051 3575 +3561 2065 3575 +3561 2083 3573 +3557 2107 3571 +3555 2137 3569 +3551 2173 3567 +3545 2219 3563 +3537 2273 3557 +3527 2335 3549 +3513 2409 3539 +3493 2491 3525 +3467 2581 3505 +3427 2681 3477 +3369 2785 3437 +3275 2897 3377 +3111 3013 3283 +2715 3131 3117 +0 3255 2705 +0 3379 0 +0 3505 0 +0 3633 0 +0 3763 0 +0 3891 0 +0 4023 0 +3675 1765 3653 +3675 1767 3653 +3675 1771 3651 +3675 1776 3651 +3675 1782 3651 +3675 1790 3651 +3675 1801 3651 +3673 1814 3651 +3673 1832 3651 +3671 1855 3649 +3671 1884 3649 +3669 1920 3647 +3667 1964 3645 +3663 2017 3643 +3659 2079 3639 +3653 2151 3633 +3645 2231 3627 +3635 2321 3619 +3619 2419 3607 +3599 2525 3591 +3569 2635 3567 +3527 2749 3535 +3465 2869 3489 +3363 2991 3417 +3177 3115 3297 +2671 3241 3065 +0 3369 2069 +0 3499 0 +0 3627 0 +0 3759 0 +0 3889 0 +0 4021 0 +3789 297 3735 +3789 359 3735 +3789 432 3735 +3789 513 3735 +3789 603 3735 +3789 701 3735 +3789 806 3735 +3789 917 3735 +3787 1032 3733 +3787 1151 3733 +3785 1273 3733 +3785 1398 3731 +3783 1524 3729 +3781 1652 3727 +3777 1781 3725 +3773 1910 3721 +3767 2040 3715 +3759 2171 3709 +3747 2303 3699 +3731 2433 3685 +3709 2565 3667 +3679 2697 3641 +3635 2829 3603 +3567 2961 3549 +3459 3093 3463 +3253 3225 3315 +2603 3357 2989 +0 3489 0 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3907 0 3827 +3905 0 3825 +3905 0 3825 +3903 0 3823 +3903 0 3823 +3901 0 3821 +3899 0 3819 +3895 682 3815 +3891 1493 3811 +3883 1832 3805 +3875 2075 3797 +3863 2275 3787 +3847 2451 3773 +3825 2615 3751 +3793 2769 3723 +3747 2917 3681 +3677 3059 3619 +3561 3201 3519 +3339 3339 3339 +2495 3475 2859 +0 3611 0 +0 3745 0 +0 3879 0 +0 4013 0 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4029 0 3927 +4027 0 3925 +4027 0 3925 +4027 0 3925 +4025 0 3923 +4023 0 3921 +4021 0 3919 +4019 0 3917 +4015 0 3913 +4011 0 3909 +4005 1152 3903 +3995 1902 3895 +3983 2235 3883 +3967 2475 3867 +3945 2673 3845 +3911 2849 3813 +3863 3013 3767 +3791 3165 3699 +3669 3313 3585 +3433 3457 3367 +2293 3597 2593 +0 3735 0 +0 3871 0 +0 4007 0 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4033 +4095 0 4031 +4095 0 4031 +4095 0 4031 +4095 0 4029 +4095 0 4027 +4095 0 4025 +4095 0 4023 +4095 0 4019 +4095 0 4015 +4095 0 4007 +4095 1465 3999 +4095 2177 3987 +4091 2505 3969 +4067 2741 3945 +4033 2939 3913 +3983 3115 3863 +3909 3277 3787 +3783 3431 3659 +3533 3579 3405 +1659 3721 0 +0 3861 0 +0 3999 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2083 4095 +4095 2541 4079 +4095 2819 4053 +4095 3037 4017 +4095 3225 3965 +4031 3393 3883 +3901 3551 3743 +3641 3703 3449 +0 3847 0 +0 3989 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1918 4095 +4095 2585 4095 +4095 2907 4095 +4095 3141 4095 +4095 3339 4073 +4095 3513 3987 +4023 3675 3837 +3753 3827 3501 +0 3975 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1519 4095 +4095 2639 4095 +4095 3001 4095 +4095 3253 4095 +4095 3457 4095 +4095 3635 4095 +4095 3801 3937 +3869 3955 3565 +2957 2509 3371 +2957 2509 3371 +2957 2509 3371 +2955 2511 3371 +2955 2513 3371 +2953 2513 3369 +2951 2515 3369 +2949 2519 3369 +2945 2523 3367 +2941 2527 3365 +2933 2535 3363 +2925 2543 3361 +2913 2555 3357 +2895 2569 3353 +2871 2589 3347 +2837 2613 3337 +2787 2645 3325 +2711 2683 3307 +2583 2731 3283 +2323 2785 3251 +0 2851 3201 +0 2927 3125 +0 3011 2997 +0 3103 2739 +0 3203 0 +0 3309 0 +0 3421 0 +0 3539 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2959 2509 3371 +2959 2509 3371 +2957 2509 3371 +2957 2511 3371 +2955 2511 3371 +2953 2513 3371 +2951 2515 3369 +2949 2519 3369 +2945 2523 3367 +2941 2527 3367 +2935 2535 3365 +2925 2543 3361 +2913 2555 3357 +2895 2569 3353 +2871 2589 3347 +2839 2613 3337 +2789 2645 3325 +2711 2683 3307 +2585 2729 3285 +2327 2785 3251 +0 2851 3201 +0 2927 3125 +0 3011 2997 +0 3103 2739 +0 3203 0 +0 3309 0 +0 3421 0 +0 3539 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2959 2509 3371 +2959 2509 3371 +2959 2509 3371 +2957 2511 3371 +2957 2511 3371 +2955 2513 3371 +2953 2515 3369 +2951 2519 3369 +2947 2523 3367 +2941 2527 3367 +2935 2535 3365 +2925 2543 3361 +2913 2555 3357 +2897 2569 3353 +2873 2589 3347 +2839 2613 3337 +2789 2645 3325 +2713 2683 3309 +2587 2729 3285 +2329 2785 3251 +0 2851 3201 +0 2927 3125 +0 3011 2997 +0 3103 2741 +0 3203 0 +0 3309 0 +0 3421 0 +0 3539 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2961 2509 3373 +2959 2509 3371 +2959 2509 3371 +2959 2511 3371 +2957 2511 3371 +2955 2513 3371 +2953 2515 3369 +2951 2519 3369 +2947 2523 3369 +2943 2527 3367 +2937 2535 3365 +2927 2543 3361 +2915 2555 3359 +2897 2569 3353 +2875 2589 3347 +2841 2613 3337 +2791 2645 3325 +2715 2683 3309 +2589 2729 3285 +2333 2785 3251 +0 2851 3201 +0 2925 3125 +0 3011 2999 +0 3103 2741 +0 3203 0 +0 3309 0 +0 3421 0 +0 3537 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2961 2509 3373 +2961 2509 3373 +2961 2509 3373 +2959 2511 3371 +2959 2511 3371 +2957 2513 3371 +2955 2515 3371 +2953 2519 3369 +2949 2523 3369 +2945 2527 3367 +2937 2533 3365 +2929 2543 3363 +2917 2555 3359 +2899 2569 3353 +2875 2589 3347 +2843 2613 3339 +2793 2645 3325 +2717 2683 3309 +2591 2729 3285 +2339 2785 3251 +0 2851 3201 +0 2925 3125 +0 3011 2999 +0 3103 2743 +0 3203 0 +0 3309 0 +0 3421 0 +0 3537 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2963 2507 3373 +2963 2509 3373 +2963 2509 3373 +2961 2511 3373 +2961 2511 3371 +2959 2513 3371 +2957 2515 3371 +2955 2517 3371 +2951 2521 3369 +2947 2527 3367 +2939 2533 3365 +2931 2543 3363 +2919 2555 3359 +2901 2569 3355 +2879 2589 3347 +2845 2613 3339 +2795 2645 3327 +2721 2683 3309 +2595 2729 3285 +2347 2785 3253 +597 2851 3203 +0 2925 3127 +0 3009 3001 +0 3103 2745 +0 3203 0 +0 3309 0 +0 3421 0 +0 3537 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2967 2507 3373 +2965 2509 3373 +2965 2509 3373 +2965 2509 3373 +2963 2511 3373 +2961 2513 3373 +2959 2515 3371 +2957 2517 3371 +2953 2521 3369 +2949 2527 3369 +2943 2533 3367 +2933 2543 3363 +2921 2553 3359 +2905 2569 3355 +2881 2589 3349 +2847 2613 3339 +2799 2645 3327 +2725 2683 3311 +2601 2729 3287 +2355 2785 3253 +912 2851 3203 +0 2925 3127 +0 3009 3001 +0 3103 2749 +0 3203 0 +0 3309 0 +0 3421 0 +0 3537 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2969 2507 3375 +2969 2507 3375 +2969 2509 3375 +2967 2509 3373 +2967 2511 3373 +2965 2513 3373 +2963 2515 3373 +2961 2517 3371 +2957 2521 3371 +2953 2527 3369 +2945 2533 3367 +2937 2541 3365 +2925 2553 3361 +2909 2569 3355 +2885 2587 3349 +2853 2613 3341 +2803 2643 3329 +2731 2683 3311 +2609 2729 3287 +2369 2785 3255 +1144 2851 3205 +0 2925 3129 +0 3009 3003 +0 3103 2751 +0 3203 567 +0 3309 0 +0 3421 0 +0 3537 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +2973 2507 3375 +2973 2507 3375 +2973 2507 3375 +2971 2509 3375 +2971 2509 3375 +2969 2511 3375 +2967 2513 3373 +2965 2517 3373 +2961 2521 3371 +2957 2525 3371 +2951 2533 3369 +2941 2541 3365 +2929 2553 3363 +2913 2567 3357 +2891 2587 3351 +2857 2613 3341 +2811 2643 3329 +2737 2681 3313 +2619 2729 3289 +2385 2785 3255 +1339 2851 3207 +0 2925 3131 +0 3009 3007 +0 3103 2757 +0 3203 941 +0 3309 0 +0 3421 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3907 0 +0 4033 0 +2979 2505 3377 +2979 2507 3377 +2979 2507 3377 +2977 2507 3377 +2977 2509 3377 +2975 2511 3375 +2973 2513 3375 +2971 2515 3375 +2967 2519 3373 +2963 2525 3371 +2957 2531 3369 +2947 2541 3367 +2935 2553 3363 +2919 2567 3359 +2897 2587 3353 +2865 2611 3343 +2819 2643 3331 +2747 2681 3315 +2631 2729 3291 +2405 2785 3257 +1513 2849 3209 +0 2925 3135 +0 3009 3011 +0 3101 2763 +0 3203 1195 +0 3309 0 +0 3421 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3907 0 +0 4033 0 +2987 2505 3379 +2987 2505 3379 +2987 2505 3379 +2985 2507 3379 +2985 2507 3379 +2983 2509 3379 +2981 2511 3377 +2979 2515 3377 +2975 2519 3375 +2971 2523 3375 +2965 2531 3373 +2955 2539 3369 +2945 2551 3365 +2929 2567 3361 +2907 2585 3355 +2875 2611 3345 +2829 2641 3333 +2759 2681 3317 +2647 2727 3293 +2431 2783 3261 +1674 2849 3213 +0 2925 3137 +0 3009 3015 +0 3101 2771 +0 3201 1401 +0 3309 0 +0 3421 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3905 0 +0 4033 0 +2997 2503 3383 +2997 2503 3383 +2997 2505 3381 +2995 2505 3381 +2995 2507 3381 +2993 2509 3381 +2991 2511 3381 +2989 2513 3379 +2985 2517 3379 +2981 2523 3377 +2975 2529 3375 +2967 2539 3373 +2955 2549 3369 +2939 2565 3365 +2919 2585 3357 +2887 2609 3349 +2843 2641 3337 +2777 2679 3321 +2667 2727 3297 +2465 2783 3265 +1826 2849 3217 +0 2923 3143 +0 3009 3021 +0 3101 2781 +0 3201 1581 +0 3309 0 +0 3421 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3905 0 +0 4033 0 +3011 2501 3387 +3009 2501 3385 +3009 2503 3385 +3009 2503 3385 +3007 2505 3385 +3007 2507 3385 +3005 2509 3385 +3001 2511 3383 +2999 2515 3383 +2995 2521 3381 +2989 2527 3379 +2981 2537 3377 +2969 2549 3373 +2955 2563 3369 +2933 2583 3361 +2905 2607 3353 +2861 2639 3341 +2797 2679 3325 +2695 2725 3301 +2505 2781 3269 +1973 2847 3221 +0 2923 3149 +0 3007 3029 +0 3101 2795 +0 3201 1747 +0 3309 0 +0 3421 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3905 0 +0 4033 0 +3027 2499 3391 +3027 2499 3391 +3025 2499 3391 +3025 2501 3391 +3025 2501 3391 +3023 2503 3389 +3021 2505 3389 +3019 2509 3389 +3015 2513 3387 +3011 2517 3385 +3007 2525 3383 +2999 2533 3381 +2987 2545 3377 +2973 2561 3373 +2953 2581 3367 +2925 2605 3359 +2885 2637 3347 +2823 2677 3331 +2727 2723 3307 +2555 2781 3275 +2115 2847 3229 +0 2923 3157 +0 3007 3041 +0 3099 2813 +0 3201 1902 +0 3307 0 +0 3421 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3905 0 +0 4033 0 +3049 2495 3397 +3049 2495 3397 +3047 2497 3397 +3047 2497 3397 +3045 2499 3397 +3045 2501 3397 +3043 2503 3395 +3041 2505 3395 +3037 2509 3393 +3033 2515 3393 +3029 2521 3391 +3021 2531 3389 +3011 2543 3385 +2997 2557 3381 +2979 2577 3373 +2953 2603 3365 +2913 2635 3353 +2857 2673 3337 +2769 2721 3315 +2613 2779 3285 +2255 2845 3239 +0 2921 3169 +0 3005 3055 +0 3099 2837 +0 3199 2051 +0 3307 0 +0 3419 0 +0 3537 0 +0 3657 0 +0 3781 0 +0 3905 0 +0 4033 0 +3075 2491 3407 +3075 2491 3407 +3075 2491 3405 +3075 2493 3405 +3073 2493 3405 +3073 2495 3405 +3071 2497 3405 +3069 2501 3403 +3065 2505 3403 +3063 2509 3401 +3057 2517 3399 +3051 2527 3397 +3041 2539 3393 +3029 2553 3389 +3011 2573 3383 +2985 2599 3375 +2951 2631 3363 +2899 2671 3347 +2817 2719 3327 +2681 2775 3295 +2393 2843 3251 +0 2919 3183 +0 3005 3073 +0 3097 2865 +0 3199 2195 +0 3307 0 +0 3419 0 +0 3537 0 +0 3657 0 +0 3779 0 +0 3905 0 +0 4033 0 +3109 2483 3417 +3109 2485 3417 +3109 2485 3417 +3109 2485 3417 +3107 2487 3417 +3107 2489 3417 +3105 2491 3415 +3103 2495 3415 +3101 2499 3415 +3097 2503 3413 +3093 2511 3411 +3087 2521 3409 +3077 2533 3405 +3065 2549 3401 +3049 2569 3395 +3027 2595 3387 +2995 2627 3375 +2947 2667 3361 +2877 2715 3339 +2759 2773 3309 +2531 2839 3267 +1593 2917 3201 +0 3003 3097 +0 3097 2903 +0 3197 2335 +0 3305 0 +0 3419 0 +0 3535 0 +0 3657 0 +0 3779 0 +0 3905 0 +0 4033 0 +3153 2475 3433 +3151 2475 3433 +3151 2477 3433 +3151 2477 3431 +3151 2479 3431 +3149 2481 3431 +3147 2483 3431 +3147 2485 3429 +3143 2489 3429 +3141 2495 3427 +3137 2503 3425 +3131 2511 3423 +3123 2525 3421 +3113 2541 3417 +3097 2561 3411 +3077 2587 3403 +3049 2619 3391 +3007 2661 3377 +2945 2709 3357 +2845 2767 3329 +2665 2835 3287 +2191 2913 3225 +0 2999 3125 +0 3093 2947 +0 3195 2475 +0 3303 0 +0 3417 0 +0 3535 0 +0 3655 0 +0 3779 0 +0 3905 0 +0 4031 0 +3203 2463 3451 +3203 2463 3451 +3203 2463 3451 +3201 2465 3451 +3201 2467 3451 +3201 2469 3451 +3199 2471 3449 +3197 2473 3449 +3195 2477 3449 +3193 2483 3447 +3189 2491 3445 +3183 2501 3443 +3177 2513 3439 +3167 2529 3435 +3155 2551 3431 +3137 2577 3423 +3111 2611 3413 +3075 2653 3399 +3023 2703 3379 +2941 2761 3353 +2801 2831 3313 +2501 2909 3255 +0 2995 3163 +0 3091 2999 +0 3193 2611 +0 3301 0 +0 3415 0 +0 3533 0 +0 3655 0 +0 3779 0 +0 3905 0 +0 4031 0 +3263 2445 3475 +3263 2447 3475 +3263 2447 3475 +3261 2449 3475 +3261 2449 3475 +3261 2451 3475 +3259 2455 3475 +3259 2457 3473 +3257 2461 3473 +3253 2467 3471 +3251 2475 3469 +3247 2485 3467 +3239 2499 3465 +3231 2515 3461 +3221 2537 3455 +3205 2565 3449 +3183 2599 3439 +3153 2641 3425 +3109 2693 3407 +3043 2753 3383 +2933 2823 3345 +2731 2903 3291 +2103 2991 3207 +0 3087 3063 +0 3189 2747 +0 3299 0 +0 3413 0 +0 3531 0 +0 3653 0 +0 3777 0 +0 3903 0 +0 4031 0 +3333 2423 3507 +3333 2423 3507 +3331 2423 3505 +3331 2425 3505 +3331 2427 3505 +3331 2429 3505 +3329 2431 3505 +3329 2435 3505 +3327 2439 3503 +3325 2445 3503 +3321 2453 3501 +3319 2463 3499 +3313 2477 3497 +3305 2495 3493 +3297 2519 3487 +3283 2547 3481 +3265 2583 3473 +3241 2627 3459 +3203 2679 3443 +3151 2741 3419 +3067 2813 3385 +2925 2893 3337 +2621 2983 3261 +0 3081 3135 +0 3185 2881 +0 3295 347 +0 3411 0 +0 3529 0 +0 3651 0 +0 3777 0 +0 3903 0 +0 4031 0 +3411 2389 3545 +3411 2389 3543 +3411 2391 3543 +3411 2391 3543 +3411 2393 3543 +3409 2395 3543 +3409 2399 3543 +3409 2403 3543 +3407 2407 3541 +3405 2413 3541 +3403 2423 3539 +3399 2433 3537 +3395 2449 3535 +3389 2467 3531 +3381 2491 3527 +3371 2521 3521 +3355 2559 3513 +3335 2605 3501 +3305 2661 3487 +3263 2725 3465 +3201 2799 3435 +3099 2883 3391 +2915 2973 3323 +2411 3073 3217 +0 3179 3015 +0 3291 2401 +0 3407 0 +0 3527 0 +0 3649 0 +0 3775 0 +0 3901 0 +0 4029 0 +3499 2341 3591 +3499 2341 3591 +3499 2343 3589 +3499 2343 3589 +3499 2345 3589 +3499 2347 3589 +3497 2351 3589 +3497 2355 3589 +3495 2361 3587 +3495 2367 3587 +3493 2377 3585 +3489 2389 3583 +3485 2405 3581 +3481 2427 3579 +3475 2453 3575 +3467 2485 3569 +3455 2527 3563 +3437 2575 3551 +3415 2635 3539 +3381 2703 3519 +3333 2779 3493 +3259 2867 3453 +3139 2961 3397 +2899 3063 3307 +1706 3171 3149 +0 3285 2783 +0 3403 0 +0 3523 0 +0 3647 0 +0 3773 0 +0 3899 0 +0 4029 0 +3595 2265 3645 +3595 2267 3645 +3595 2267 3645 +3595 2269 3645 +3595 2271 3645 +3595 2275 3645 +3593 2277 3645 +3593 2283 3643 +3593 2289 3643 +3591 2297 3643 +3589 2309 3641 +3587 2323 3639 +3585 2341 3637 +3581 2365 3635 +3575 2395 3631 +3569 2433 3627 +3559 2479 3621 +3545 2533 3611 +3527 2597 3599 +3503 2671 3583 +3467 2753 3559 +3413 2845 3527 +3329 2943 3479 +3187 3049 3405 +2877 3161 3283 +0 3275 3041 +0 3395 1772 +0 3519 0 +0 3643 0 +0 3769 0 +0 3897 0 +0 4027 0 +3699 2141 3711 +3699 2143 3711 +3699 2145 3709 +3699 2147 3709 +3697 2149 3709 +3697 2153 3709 +3697 2157 3709 +3697 2165 3709 +3697 2173 3709 +3695 2183 3707 +3693 2197 3707 +3693 2217 3705 +3689 2239 3703 +3687 2269 3701 +3683 2305 3699 +3677 2351 3695 +3669 2405 3689 +3659 2469 3681 +3645 2541 3671 +3627 2623 3657 +3599 2713 3637 +3559 2813 3609 +3501 2917 3569 +3407 3029 3509 +3243 3145 3415 +2847 3263 3249 +0 3387 2837 +0 3511 0 +0 3637 0 +0 3765 0 +0 3895 0 +0 4025 0 +3807 1895 3785 +3807 1897 3785 +3807 1900 3785 +3807 1903 3785 +3807 1908 3783 +3807 1914 3783 +3807 1922 3783 +3807 1933 3783 +3805 1946 3783 +3805 1964 3783 +3805 1987 3781 +3803 2016 3781 +3801 2051 3779 +3799 2095 3777 +3795 2149 3775 +3791 2211 3771 +3785 2283 3767 +3777 2365 3759 +3767 2453 3751 +3751 2551 3739 +3731 2657 3723 +3701 2767 3701 +3659 2881 3667 +3597 3001 3621 +3495 3123 3549 +3309 3247 3429 +2803 3373 3197 +0 3501 2201 +0 3631 0 +0 3761 0 +0 3891 0 +0 4021 0 +3921 376 3867 +3921 429 3867 +3921 491 3867 +3921 564 3867 +3921 645 3867 +3921 735 3867 +3921 833 3867 +3921 938 3867 +3921 1048 3867 +3919 1164 3865 +3919 1283 3865 +3919 1405 3865 +3917 1530 3863 +3915 1656 3861 +3913 1784 3859 +3909 1913 3857 +3905 2042 3853 +3899 2173 3847 +3891 2303 3841 +3879 2435 3831 +3863 2565 3817 +3841 2697 3799 +3811 2829 3773 +3767 2961 3735 +3699 3093 3681 +3591 3225 3595 +3385 3357 3447 +2735 3489 3121 +0 3621 0 +0 3753 0 +0 3885 0 +0 4017 0 +4041 0 3959 +4041 0 3959 +4041 0 3959 +4039 0 3959 +4039 0 3959 +4039 0 3959 +4039 0 3959 +4039 0 3959 +4039 0 3959 +4039 0 3959 +4037 0 3957 +4037 0 3957 +4037 0 3957 +4035 0 3955 +4033 0 3953 +4031 0 3951 +4027 815 3947 +4023 1625 3943 +4015 1965 3937 +4007 2207 3929 +3995 2407 3919 +3979 2583 3905 +3957 2747 3883 +3925 2901 3855 +3879 3049 3813 +3809 3193 3751 +3693 3333 3651 +3471 3471 3471 +2627 3607 2991 +0 3743 0 +0 3877 0 +0 4011 0 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4059 +4095 0 4057 +4095 0 4057 +4095 0 4057 +4095 0 4055 +4095 0 4053 +4095 0 4053 +4095 0 4049 +4095 0 4047 +4095 0 4041 +4095 1285 4035 +4095 2034 4027 +4095 2367 4015 +4095 2607 3999 +4077 2805 3977 +4043 2981 3945 +3995 3145 3899 +3923 3297 3831 +3801 3445 3717 +3565 3589 3499 +2425 3729 2725 +0 3867 0 +0 4003 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1597 4095 +4095 2309 4095 +4095 2637 4095 +4095 2875 4079 +4095 3071 4045 +4095 3247 3995 +4041 3409 3919 +3915 3563 3791 +3665 3711 3537 +1791 3853 0 +0 3993 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2215 4095 +4095 2673 4095 +4095 2951 4095 +4095 3169 4095 +4095 3357 4095 +4095 3525 4015 +4033 3683 3877 +3773 3835 3581 +0 3979 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2051 4095 +4095 2717 4095 +4095 3039 4095 +4095 3275 4095 +4095 3471 4095 +4095 3645 4095 +4095 3807 3969 +3885 3961 3633 +3089 2641 3503 +3089 2641 3503 +3089 2641 3503 +3089 2643 3503 +3087 2643 3503 +3087 2645 3503 +3085 2645 3501 +3083 2649 3501 +3081 2651 3501 +3077 2655 3499 +3071 2659 3497 +3065 2667 3495 +3057 2675 3493 +3043 2687 3489 +3027 2703 3485 +3003 2721 3479 +2969 2747 3469 +2919 2777 3457 +2843 2815 3439 +2715 2863 3415 +2453 2919 3383 +0 2983 3333 +0 3059 3257 +0 3143 3129 +0 3235 2871 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3091 2641 3503 +3091 2641 3503 +3089 2641 3503 +3089 2641 3503 +3089 2643 3503 +3087 2645 3503 +3085 2645 3503 +3083 2647 3501 +3081 2651 3501 +3077 2655 3499 +3073 2659 3499 +3065 2667 3497 +3057 2675 3493 +3045 2687 3489 +3027 2701 3485 +3003 2721 3479 +2969 2745 3469 +2919 2777 3457 +2843 2815 3439 +2715 2863 3417 +2455 2919 3383 +0 2983 3333 +0 3059 3257 +0 3143 3129 +0 3235 2871 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3091 2641 3503 +3091 2641 3503 +3091 2641 3503 +3089 2641 3503 +3089 2643 3503 +3087 2645 3503 +3087 2645 3503 +3085 2647 3501 +3081 2651 3501 +3077 2655 3499 +3073 2659 3499 +3067 2667 3497 +3057 2675 3493 +3045 2687 3489 +3027 2701 3485 +3005 2721 3479 +2971 2745 3469 +2921 2777 3457 +2843 2815 3441 +2717 2863 3417 +2459 2917 3383 +0 2983 3333 +0 3059 3257 +0 3143 3129 +0 3235 2871 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3091 2641 3503 +3091 2641 3503 +3091 2641 3503 +3091 2641 3503 +3089 2643 3503 +3089 2643 3503 +3087 2645 3503 +3085 2647 3501 +3083 2651 3501 +3079 2655 3499 +3073 2659 3499 +3067 2667 3497 +3059 2675 3493 +3045 2687 3491 +3029 2701 3485 +3005 2721 3479 +2971 2745 3469 +2921 2777 3457 +2845 2815 3441 +2719 2863 3417 +2461 2917 3383 +0 2983 3333 +0 3059 3257 +0 3143 3129 +0 3235 2873 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3093 2641 3505 +3093 2641 3505 +3091 2641 3503 +3091 2641 3503 +3091 2643 3503 +3089 2643 3503 +3087 2645 3503 +3085 2647 3503 +3083 2651 3501 +3079 2655 3501 +3075 2659 3499 +3069 2667 3497 +3059 2675 3495 +3047 2687 3491 +3031 2701 3485 +3007 2721 3479 +2973 2745 3469 +2923 2777 3457 +2847 2815 3441 +2721 2861 3417 +2465 2917 3383 +0 2983 3333 +0 3059 3257 +0 3143 3131 +0 3235 2873 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3095 2639 3505 +3093 2641 3505 +3093 2641 3505 +3093 2641 3505 +3091 2643 3503 +3091 2643 3503 +3089 2645 3503 +3087 2647 3503 +3085 2651 3501 +3081 2655 3501 +3077 2659 3499 +3069 2667 3497 +3061 2675 3495 +3049 2687 3491 +3031 2701 3485 +3007 2721 3479 +2975 2745 3471 +2925 2777 3459 +2849 2815 3441 +2723 2861 3417 +2471 2917 3383 +108 2983 3335 +0 3059 3257 +0 3143 3131 +0 3235 2875 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3097 2639 3505 +3095 2641 3505 +3095 2641 3505 +3095 2641 3505 +3093 2643 3505 +3093 2643 3505 +3091 2645 3503 +3089 2647 3503 +3087 2651 3503 +3083 2653 3501 +3079 2659 3499 +3071 2665 3497 +3063 2675 3495 +3051 2687 3491 +3033 2701 3487 +3011 2721 3479 +2977 2745 3471 +2927 2777 3459 +2853 2815 3441 +2727 2861 3417 +2479 2917 3385 +729 2983 3335 +0 3057 3259 +0 3143 3133 +0 3235 2877 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3099 2639 3505 +3099 2639 3505 +3097 2641 3505 +3097 2641 3505 +3097 2641 3505 +3095 2643 3505 +3093 2645 3505 +3091 2647 3503 +3089 2649 3503 +3085 2653 3501 +3081 2659 3501 +3075 2665 3499 +3065 2675 3495 +3053 2685 3493 +3037 2701 3487 +3013 2721 3481 +2979 2745 3471 +2931 2777 3459 +2857 2815 3443 +2733 2861 3419 +2487 2917 3385 +1043 2983 3335 +0 3057 3261 +0 3141 3133 +0 3235 2881 +0 3335 0 +0 3441 0 +0 3553 0 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3101 2639 3507 +3101 2639 3507 +3101 2639 3507 +3101 2641 3507 +3099 2641 3507 +3099 2643 3505 +3097 2645 3505 +3095 2647 3505 +3093 2649 3503 +3089 2653 3503 +3085 2659 3501 +3077 2665 3499 +3069 2673 3497 +3057 2685 3493 +3041 2701 3489 +3017 2721 3481 +2985 2745 3473 +2937 2775 3461 +2863 2815 3443 +2741 2861 3419 +2501 2917 3387 +1276 2983 3337 +0 3057 3261 +0 3141 3135 +0 3235 2883 +0 3335 699 +0 3441 0 +0 3553 0 +0 3669 0 +0 3791 0 +0 3913 0 +0 4039 0 +3107 2639 3507 +3105 2639 3507 +3105 2639 3507 +3105 2639 3507 +3103 2641 3507 +3103 2641 3507 +3101 2643 3507 +3099 2645 3505 +3097 2649 3505 +3093 2653 3503 +3089 2657 3503 +3083 2665 3501 +3073 2673 3497 +3061 2685 3495 +3045 2701 3489 +3023 2719 3483 +2989 2745 3473 +2943 2775 3461 +2869 2813 3445 +2751 2861 3421 +2517 2917 3387 +1471 2983 3339 +0 3057 3263 +0 3141 3139 +0 3235 2889 +0 3335 1073 +0 3441 0 +0 3553 0 +0 3669 0 +0 3791 0 +0 3913 0 +0 4039 0 +3111 2637 3509 +3111 2637 3509 +3111 2639 3509 +3111 2639 3509 +3109 2639 3509 +3109 2641 3509 +3107 2643 3509 +3105 2645 3507 +3103 2647 3507 +3099 2651 3505 +3095 2657 3505 +3089 2663 3503 +3079 2673 3499 +3069 2685 3495 +3051 2699 3491 +3029 2719 3485 +2997 2743 3475 +2951 2775 3463 +2879 2813 3447 +2763 2861 3423 +2537 2917 3389 +1645 2981 3341 +0 3057 3267 +0 3141 3143 +0 3235 2895 +0 3335 1327 +0 3441 0 +0 3553 0 +0 3669 0 +0 3791 0 +0 3913 0 +0 4039 0 +3119 2637 3511 +3119 2637 3511 +3119 2637 3511 +3119 2637 3511 +3117 2639 3511 +3117 2641 3511 +3115 2641 3511 +3113 2643 3509 +3111 2647 3509 +3107 2651 3507 +3103 2655 3507 +3097 2663 3505 +3087 2671 3501 +3077 2683 3499 +3061 2699 3493 +3039 2717 3487 +3007 2743 3477 +2961 2773 3465 +2893 2813 3449 +2779 2859 3425 +2563 2915 3393 +1806 2981 3345 +0 3057 3271 +0 3141 3147 +0 3233 2903 +0 3335 1533 +0 3441 0 +0 3553 0 +0 3669 0 +0 3789 0 +0 3913 0 +0 4039 0 +3129 2635 3515 +3129 2635 3515 +3129 2635 3515 +3129 2637 3515 +3127 2637 3513 +3127 2639 3513 +3125 2641 3513 +3123 2643 3513 +3121 2645 3511 +3117 2649 3511 +3113 2655 3509 +3107 2661 3507 +3099 2671 3505 +3087 2681 3501 +3071 2697 3497 +3051 2717 3489 +3019 2741 3481 +2975 2773 3469 +2909 2811 3453 +2799 2859 3429 +2597 2915 3397 +1958 2981 3349 +0 3057 3275 +0 3141 3153 +0 3233 2913 +0 3333 1714 +0 3441 0 +0 3553 0 +0 3669 0 +0 3789 0 +0 3913 0 +0 4039 0 +3143 2633 3519 +3143 2633 3519 +3141 2633 3519 +3141 2635 3517 +3141 2635 3517 +3139 2637 3517 +3139 2639 3517 +3137 2641 3517 +3133 2643 3515 +3131 2647 3515 +3127 2653 3513 +3121 2659 3511 +3113 2669 3509 +3101 2681 3505 +3087 2695 3501 +3065 2715 3493 +3037 2741 3485 +2993 2771 3473 +2929 2811 3457 +2827 2857 3433 +2637 2913 3401 +2105 2979 3353 +0 3055 3281 +0 3139 3161 +0 3233 2927 +0 3333 1879 +0 3441 0 +0 3553 0 +0 3669 0 +0 3789 0 +0 3913 0 +0 4037 0 +3159 2631 3523 +3159 2631 3523 +3159 2631 3523 +3159 2631 3523 +3157 2633 3523 +3157 2635 3523 +3155 2635 3521 +3153 2637 3521 +3151 2641 3521 +3149 2645 3519 +3143 2651 3517 +3139 2657 3517 +3131 2665 3513 +3121 2677 3511 +3105 2693 3505 +3085 2713 3499 +3057 2737 3491 +3017 2769 3479 +2955 2809 3463 +2859 2855 3439 +2687 2913 3407 +2249 2979 3361 +0 3055 3289 +0 3139 3173 +0 3233 2945 +0 3333 2034 +0 3439 0 +0 3553 0 +0 3669 0 +0 3789 0 +0 3913 0 +0 4037 0 +3181 2627 3529 +3181 2627 3529 +3181 2627 3529 +3179 2629 3529 +3179 2629 3529 +3179 2631 3529 +3177 2633 3529 +3175 2635 3527 +3173 2637 3527 +3171 2641 3527 +3167 2647 3525 +3161 2653 3523 +3153 2663 3521 +3143 2675 3517 +3129 2689 3513 +3111 2709 3505 +3085 2735 3497 +3047 2767 3485 +2989 2807 3469 +2901 2853 3447 +2745 2911 3417 +2389 2977 3371 +0 3053 3301 +0 3137 3187 +0 3231 2969 +0 3333 2183 +0 3439 0 +0 3551 0 +0 3669 0 +0 3789 0 +0 3913 0 +0 4037 0 +3209 2621 3539 +3207 2623 3539 +3207 2623 3539 +3207 2623 3539 +3207 2625 3537 +3205 2625 3537 +3205 2627 3537 +3203 2629 3537 +3201 2633 3535 +3199 2637 3535 +3195 2643 3533 +3189 2649 3531 +3183 2659 3529 +3173 2671 3525 +3161 2685 3521 +3143 2705 3515 +3117 2731 3507 +3083 2763 3495 +3031 2803 3479 +2949 2851 3459 +2813 2909 3427 +2527 2975 3383 +0 3051 3315 +0 3137 3205 +0 3229 2997 +0 3331 2327 +0 3439 0 +0 3551 0 +0 3669 0 +0 3789 0 +0 3913 0 +0 4037 0 +3243 2615 3549 +3243 2615 3549 +3241 2617 3549 +3241 2617 3549 +3241 2617 3549 +3239 2619 3549 +3239 2621 3549 +3237 2623 3547 +3235 2627 3547 +3233 2631 3547 +3229 2635 3545 +3225 2643 3543 +3219 2653 3541 +3209 2665 3537 +3199 2681 3533 +3181 2701 3527 +3159 2727 3519 +3127 2759 3507 +3079 2799 3493 +3009 2847 3471 +2891 2905 3441 +2663 2971 3399 +1725 3049 3333 +0 3135 3229 +0 3229 3035 +0 3329 2467 +0 3437 0 +0 3551 0 +0 3667 0 +0 3789 0 +0 3911 0 +0 4037 0 +3285 2607 3565 +3285 2607 3565 +3283 2607 3565 +3283 2609 3565 +3283 2609 3565 +3283 2611 3563 +3281 2613 3563 +3279 2615 3563 +3279 2617 3563 +3275 2621 3561 +3273 2627 3559 +3269 2635 3559 +3263 2645 3555 +3255 2657 3553 +3245 2673 3549 +3229 2693 3543 +3209 2719 3535 +3181 2753 3525 +3139 2793 3509 +3077 2841 3489 +2977 2899 3461 +2797 2967 3419 +2323 3045 3357 +0 3131 3257 +0 3225 3079 +0 3327 2607 +0 3435 0 +0 3549 0 +0 3667 0 +0 3787 0 +0 3911 0 +0 4037 0 +3335 2595 3583 +3335 2595 3583 +3335 2595 3583 +3335 2597 3583 +3333 2597 3583 +3333 2599 3583 +3333 2601 3583 +3331 2603 3581 +3329 2605 3581 +3327 2611 3581 +3325 2615 3579 +3321 2623 3577 +3315 2633 3575 +3309 2645 3573 +3299 2661 3567 +3287 2683 3563 +3269 2709 3555 +3243 2743 3545 +3207 2785 3531 +3155 2835 3511 +3073 2893 3485 +2933 2963 3445 +2633 3041 3387 +0 3127 3295 +0 3223 3131 +0 3325 2743 +0 3433 0 +0 3547 0 +0 3665 0 +0 3787 0 +0 3911 0 +0 4037 0 +3395 2577 3607 +3395 2577 3607 +3395 2579 3607 +3395 2579 3607 +3393 2581 3607 +3393 2581 3607 +3393 2583 3607 +3391 2587 3607 +3391 2589 3605 +3389 2593 3605 +3385 2599 3603 +3383 2607 3601 +3379 2617 3599 +3373 2631 3597 +3363 2647 3593 +3353 2669 3587 +3337 2697 3581 +3315 2731 3571 +3285 2773 3559 +3241 2825 3539 +3175 2885 3515 +3067 2955 3477 +2863 3035 3423 +2235 3123 3339 +0 3219 3195 +0 3323 2879 +0 3431 0 +0 3545 0 +0 3665 0 +0 3785 0 +0 3909 0 +0 4035 0 +3465 2555 3639 +3465 2555 3639 +3465 2555 3639 +3465 2557 3639 +3463 2557 3637 +3463 2559 3637 +3463 2561 3637 +3461 2563 3637 +3461 2567 3637 +3459 2571 3635 +3457 2577 3635 +3455 2585 3633 +3451 2597 3631 +3445 2609 3629 +3439 2627 3625 +3429 2651 3619 +3415 2679 3613 +3397 2715 3605 +3373 2759 3591 +3335 2811 3575 +3283 2873 3551 +3199 2945 3517 +3057 3025 3469 +2753 3115 3393 +0 3213 3267 +0 3317 3013 +0 3427 479 +0 3543 0 +0 3661 0 +0 3783 0 +0 3909 0 +0 4035 0 +3543 2521 3677 +3543 2521 3677 +3543 2521 3677 +3543 2523 3675 +3543 2525 3675 +3543 2525 3675 +3541 2527 3675 +3541 2531 3675 +3541 2535 3675 +3539 2539 3673 +3537 2545 3673 +3535 2555 3671 +3531 2565 3669 +3527 2581 3667 +3521 2599 3663 +3513 2623 3659 +3503 2653 3653 +3487 2691 3645 +3467 2737 3633 +3439 2793 3619 +3395 2857 3597 +3333 2931 3567 +3231 3015 3523 +3047 3107 3455 +2543 3205 3349 +0 3311 3147 +0 3423 2533 +0 3539 0 +0 3659 0 +0 3781 0 +0 3907 0 +0 4033 0 +3631 2471 3723 +3631 2473 3723 +3631 2473 3723 +3631 2475 3723 +3631 2475 3721 +3631 2477 3721 +3631 2479 3721 +3629 2483 3721 +3629 2487 3721 +3627 2493 3719 +3627 2499 3719 +3625 2509 3717 +3621 2521 3717 +3619 2537 3713 +3613 2559 3711 +3607 2585 3707 +3599 2617 3701 +3587 2659 3695 +3569 2707 3685 +3547 2767 3671 +3513 2835 3651 +3465 2911 3625 +3393 2999 3585 +3271 3093 3529 +3031 3195 3439 +1838 3303 3281 +0 3417 2915 +0 3535 0 +0 3655 0 +0 3779 0 +0 3905 0 +0 4031 0 +3727 2397 3777 +3727 2397 3777 +3727 2399 3777 +3727 2399 3777 +3727 2401 3777 +3727 2403 3777 +3727 2407 3777 +3725 2411 3777 +3725 2415 3775 +3725 2421 3775 +3723 2429 3775 +3721 2441 3773 +3719 2455 3773 +3717 2475 3771 +3713 2497 3767 +3707 2527 3763 +3701 2565 3759 +3691 2611 3753 +3679 2665 3743 +3659 2729 3731 +3635 2803 3715 +3599 2885 3691 +3545 2977 3659 +3461 3075 3611 +3319 3181 3537 +3009 3293 3415 +0 3409 3173 +0 3527 1904 +0 3651 0 +0 3775 0 +0 3901 0 +0 4029 0 +3831 2273 3843 +3831 2273 3843 +3831 2275 3843 +3831 2277 3843 +3831 2279 3841 +3831 2281 3841 +3829 2285 3841 +3829 2289 3841 +3829 2297 3841 +3829 2305 3841 +3827 2315 3839 +3827 2329 3839 +3825 2349 3837 +3823 2371 3835 +3819 2401 3833 +3815 2437 3831 +3809 2483 3827 +3801 2537 3821 +3791 2601 3813 +3777 2673 3803 +3759 2755 3789 +3731 2847 3769 +3691 2945 3741 +3633 3051 3701 +3539 3161 3641 +3375 3277 3547 +2979 3397 3381 +0 3519 2969 +0 3643 0 +0 3769 0 +0 3897 0 +0 4027 0 +3939 2026 3917 +3939 2027 3917 +3939 2029 3917 +3939 2032 3917 +3939 2035 3917 +3939 2040 3917 +3939 2046 3915 +3939 2055 3915 +3939 2065 3915 +3937 2079 3915 +3937 2097 3915 +3937 2119 3913 +3935 2149 3913 +3933 2185 3911 +3931 2229 3909 +3927 2281 3907 +3923 2343 3903 +3917 2415 3899 +3909 2497 3891 +3899 2587 3883 +3883 2683 3871 +3863 2789 3855 +3833 2899 3833 +3791 3015 3799 +3729 3133 3753 +3627 3255 3681 +3441 3379 3561 +2935 3507 3331 +0 3633 2333 +0 3763 0 +0 3893 0 +0 4023 0 +4055 463 3999 +4055 508 3999 +4053 561 3999 +4053 623 3999 +4053 696 3999 +4053 777 3999 +4053 867 3999 +4053 965 3999 +4053 1070 3999 +4053 1181 3999 +4051 1296 3999 +4051 1415 3997 +4051 1537 3997 +4049 1662 3995 +4047 1788 3993 +4045 1916 3991 +4041 2045 3989 +4037 2175 3985 +4031 2305 3979 +4023 2435 3973 +4011 2567 3963 +3995 2697 3949 +3973 2829 3931 +3943 2961 3905 +3899 3093 3867 +3831 3225 3813 +3723 3357 3727 +3517 3489 3579 +2867 3621 3253 +0 3753 0 +0 3885 0 +0 4017 0 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4091 +4095 0 4089 +4095 0 4089 +4095 0 4089 +4095 0 4087 +4095 0 4085 +4095 0 4083 +4095 947 4079 +4095 1757 4075 +4095 2097 4069 +4095 2339 4061 +4095 2539 4051 +4095 2717 4037 +4089 2879 4015 +4057 3033 3987 +4011 3181 3945 +3941 3325 3883 +3825 3465 3783 +3603 3603 3603 +2759 3739 3123 +0 3875 0 +0 4009 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1417 4095 +4095 2167 4095 +4095 2499 4095 +4095 2739 4095 +4095 2937 4095 +4095 3115 4077 +4095 3277 4033 +4055 3431 3963 +3933 3577 3849 +3697 3721 3631 +2557 3861 2857 +0 3999 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1729 4095 +4095 2441 4095 +4095 2769 4095 +4095 3007 4095 +4095 3203 4095 +4095 3379 4095 +4095 3541 4051 +4047 3695 3923 +3797 3843 3669 +1924 3985 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2347 4095 +4095 2805 4095 +4095 3085 4095 +4095 3301 4095 +4095 3489 4095 +4095 3657 4095 +4095 3815 4009 +3905 3967 3713 +3221 2773 3635 +3221 2773 3635 +3221 2773 3635 +3221 2773 3635 +3221 2775 3635 +3219 2775 3635 +3219 2777 3635 +3217 2779 3635 +3215 2781 3633 +3213 2783 3633 +3209 2787 3631 +3203 2793 3629 +3197 2799 3627 +3187 2807 3625 +3175 2819 3621 +3159 2835 3617 +3135 2853 3611 +3101 2879 3601 +3051 2909 3589 +2973 2947 3571 +2845 2995 3547 +2585 3051 3515 +0 3115 3465 +0 3191 3387 +0 3275 3261 +0 3367 3003 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3223 2773 3635 +3223 2773 3635 +3221 2773 3635 +3221 2773 3635 +3221 2775 3635 +3219 2775 3635 +3219 2777 3635 +3217 2777 3635 +3215 2781 3633 +3213 2783 3633 +3209 2787 3631 +3203 2791 3631 +3197 2799 3629 +3189 2807 3625 +3175 2819 3621 +3159 2835 3617 +3135 2853 3611 +3101 2879 3601 +3051 2909 3589 +2975 2947 3571 +2847 2995 3549 +2587 3051 3515 +0 3115 3465 +0 3191 3389 +0 3275 3261 +0 3367 3003 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3223 2773 3635 +3223 2773 3635 +3223 2773 3635 +3221 2773 3635 +3221 2775 3635 +3221 2775 3635 +3219 2777 3635 +3217 2777 3635 +3215 2781 3633 +3213 2783 3633 +3209 2787 3631 +3205 2791 3631 +3197 2799 3629 +3189 2807 3625 +3177 2819 3621 +3159 2835 3617 +3135 2853 3611 +3101 2879 3601 +3051 2909 3589 +2975 2947 3573 +2847 2995 3549 +2587 3051 3515 +0 3115 3465 +0 3191 3389 +0 3275 3261 +0 3367 3003 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3223 2773 3635 +3223 2773 3635 +3223 2773 3635 +3223 2773 3635 +3221 2775 3635 +3221 2775 3635 +3219 2777 3635 +3219 2777 3635 +3217 2781 3633 +3213 2783 3633 +3209 2787 3631 +3205 2791 3631 +3199 2799 3629 +3189 2807 3625 +3177 2819 3623 +3161 2835 3617 +3137 2853 3611 +3103 2879 3601 +3053 2909 3589 +2977 2947 3573 +2849 2995 3549 +2591 3051 3515 +0 3115 3465 +0 3191 3389 +0 3275 3261 +0 3367 3005 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3225 2773 3637 +3223 2773 3637 +3223 2773 3635 +3223 2773 3635 +3223 2773 3635 +3221 2775 3635 +3221 2777 3635 +3219 2777 3635 +3217 2779 3633 +3215 2783 3633 +3211 2787 3633 +3205 2791 3631 +3199 2799 3629 +3191 2807 3625 +3177 2819 3623 +3161 2833 3617 +3137 2853 3611 +3103 2877 3601 +3053 2909 3589 +2977 2947 3573 +2851 2995 3549 +2593 3051 3515 +0 3115 3465 +0 3191 3389 +0 3275 3261 +0 3367 3005 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3225 2771 3637 +3225 2773 3637 +3225 2773 3637 +3225 2773 3637 +3223 2773 3635 +3223 2775 3635 +3221 2775 3635 +3221 2777 3635 +3219 2779 3635 +3215 2783 3633 +3211 2787 3633 +3207 2791 3631 +3201 2799 3629 +3191 2807 3627 +3179 2819 3623 +3163 2833 3617 +3139 2853 3611 +3105 2877 3603 +3055 2909 3589 +2979 2947 3573 +2853 2995 3549 +2597 3049 3515 +0 3115 3465 +0 3191 3389 +0 3275 3263 +0 3367 3007 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3227 2771 3637 +3227 2773 3637 +3225 2773 3637 +3225 2773 3637 +3225 2773 3637 +3225 2775 3637 +3223 2775 3635 +3221 2777 3635 +3219 2779 3635 +3217 2783 3633 +3213 2787 3633 +3209 2791 3631 +3201 2799 3629 +3193 2807 3627 +3181 2819 3623 +3163 2833 3619 +3141 2853 3611 +3107 2877 3603 +3057 2909 3591 +2981 2947 3573 +2855 2993 3549 +2603 3049 3515 +240 3115 3467 +0 3191 3391 +0 3275 3263 +0 3367 3007 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3229 2771 3637 +3229 2771 3637 +3227 2773 3637 +3227 2773 3637 +3227 2773 3637 +3225 2775 3637 +3225 2775 3637 +3223 2777 3635 +3221 2779 3635 +3219 2783 3635 +3215 2787 3633 +3211 2791 3631 +3203 2797 3629 +3195 2807 3627 +3183 2819 3623 +3165 2833 3619 +3143 2853 3611 +3109 2877 3603 +3059 2909 3591 +2985 2947 3573 +2861 2993 3551 +2611 3049 3517 +861 3115 3467 +0 3191 3391 +0 3275 3265 +0 3367 3009 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3231 2771 3639 +3231 2771 3637 +3231 2771 3637 +3229 2773 3637 +3229 2773 3637 +3229 2773 3637 +3227 2775 3637 +3225 2777 3637 +3223 2779 3635 +3221 2781 3635 +3217 2785 3633 +3213 2791 3633 +3207 2797 3631 +3197 2807 3627 +3185 2819 3625 +3169 2833 3619 +3145 2853 3613 +3113 2877 3603 +3063 2909 3591 +2989 2947 3575 +2865 2993 3551 +2619 3049 3517 +1175 3115 3467 +0 3189 3393 +0 3275 3267 +0 3367 3013 +0 3467 0 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3235 2771 3639 +3233 2771 3639 +3233 2771 3639 +3233 2771 3639 +3233 2773 3639 +3231 2773 3639 +3231 2775 3637 +3229 2777 3637 +3227 2779 3637 +3225 2781 3635 +3221 2785 3635 +3217 2791 3633 +3209 2797 3631 +3201 2807 3629 +3189 2817 3625 +3173 2833 3621 +3149 2853 3613 +3117 2877 3605 +3069 2907 3593 +2995 2947 3575 +2873 2993 3553 +2633 3049 3519 +1408 3115 3469 +0 3189 3393 +0 3273 3269 +0 3367 3015 +0 3467 831 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3239 2771 3641 +3239 2771 3641 +3237 2771 3639 +3237 2771 3639 +3237 2771 3639 +3237 2773 3639 +3235 2775 3639 +3233 2775 3639 +3231 2777 3637 +3229 2781 3637 +3225 2785 3637 +3221 2789 3635 +3215 2797 3633 +3205 2805 3629 +3193 2817 3627 +3177 2833 3621 +3155 2851 3615 +3123 2877 3607 +3075 2907 3593 +3001 2947 3577 +2883 2993 3553 +2649 3049 3519 +1603 3115 3471 +0 3189 3395 +0 3273 3271 +0 3367 3021 +0 3467 1205 +0 3573 0 +0 3685 0 +0 3803 0 +0 3923 0 +0 4045 0 +3245 2769 3641 +3245 2769 3641 +3243 2769 3641 +3243 2771 3641 +3243 2771 3641 +3241 2773 3641 +3241 2773 3641 +3239 2775 3641 +3237 2777 3639 +3235 2781 3639 +3231 2783 3637 +3227 2789 3637 +3221 2795 3635 +3211 2805 3631 +3201 2817 3627 +3185 2831 3623 +3161 2851 3617 +3129 2875 3607 +3083 2907 3595 +3011 2945 3579 +2895 2993 3555 +2669 3049 3523 +1777 3115 3473 +0 3189 3399 +0 3273 3275 +0 3367 3027 +0 3467 1459 +0 3573 0 +0 3685 0 +0 3801 0 +0 3923 0 +0 4045 0 +3251 2769 3643 +3251 2769 3643 +3251 2769 3643 +3251 2769 3643 +3251 2771 3643 +3249 2771 3643 +3249 2773 3643 +3247 2773 3643 +3245 2777 3641 +3243 2779 3641 +3239 2783 3639 +3235 2789 3639 +3229 2795 3637 +3221 2803 3633 +3209 2815 3631 +3193 2831 3625 +3171 2851 3619 +3139 2875 3611 +3093 2907 3597 +3025 2945 3581 +2911 2991 3557 +2695 3047 3525 +1938 3113 3477 +0 3189 3403 +0 3273 3279 +0 3365 3035 +0 3467 1665 +0 3573 0 +0 3685 0 +0 3801 0 +0 3923 0 +0 4045 0 +3261 2767 3647 +3261 2767 3647 +3261 2767 3647 +3261 2767 3647 +3261 2769 3647 +3259 2769 3645 +3259 2771 3645 +3257 2773 3645 +3255 2775 3645 +3253 2777 3643 +3249 2781 3643 +3245 2787 3641 +3239 2793 3639 +3231 2803 3637 +3219 2815 3633 +3205 2829 3629 +3183 2849 3621 +3151 2873 3613 +3107 2905 3601 +3041 2943 3585 +2933 2991 3561 +2729 3047 3529 +2091 3113 3481 +0 3189 3407 +0 3273 3285 +0 3365 3045 +0 3465 1846 +0 3573 0 +0 3685 0 +0 3801 0 +0 3921 0 +0 4045 0 +3275 2765 3651 +3275 2765 3651 +3275 2765 3651 +3273 2765 3651 +3273 2767 3649 +3273 2767 3649 +3271 2769 3649 +3271 2771 3649 +3269 2773 3649 +3267 2775 3647 +3263 2779 3647 +3259 2785 3645 +3253 2791 3643 +3245 2801 3641 +3233 2813 3637 +3219 2827 3633 +3197 2847 3625 +3169 2873 3617 +3125 2903 3605 +3061 2943 3589 +2959 2989 3565 +2769 3047 3533 +2237 3111 3485 +0 3187 3413 +0 3271 3293 +0 3365 3059 +0 3465 2011 +0 3573 0 +0 3685 0 +0 3801 0 +0 3921 0 +0 4045 0 +3291 2763 3655 +3291 2763 3655 +3291 2763 3655 +3291 2763 3655 +3291 2763 3655 +3289 2765 3655 +3289 2767 3655 +3287 2767 3653 +3285 2771 3653 +3283 2773 3653 +3281 2777 3651 +3275 2783 3651 +3271 2789 3649 +3263 2799 3645 +3253 2809 3643 +3237 2825 3637 +3217 2845 3631 +3189 2871 3623 +3149 2901 3611 +3089 2941 3595 +2991 2989 3571 +2819 3045 3539 +2381 3111 3493 +0 3187 3421 +0 3271 3305 +0 3365 3077 +0 3465 2167 +0 3571 0 +0 3685 0 +0 3801 0 +0 3921 0 +0 4045 0 +3313 2759 3663 +3313 2759 3661 +3313 2759 3661 +3313 2759 3661 +3311 2761 3661 +3311 2761 3661 +3311 2763 3661 +3309 2765 3661 +3307 2767 3659 +3305 2769 3659 +3303 2773 3659 +3299 2779 3657 +3293 2785 3655 +3285 2795 3653 +3275 2807 3649 +3261 2823 3645 +3243 2841 3639 +3217 2867 3629 +3179 2899 3619 +3121 2939 3603 +3033 2985 3579 +2877 3043 3549 +2521 3109 3503 +0 3185 3433 +0 3269 3319 +0 3363 3101 +0 3465 2315 +0 3571 0 +0 3683 0 +0 3801 0 +0 3921 0 +0 4045 0 +3341 2753 3671 +3341 2753 3671 +3341 2755 3671 +3339 2755 3671 +3339 2755 3671 +3339 2757 3671 +3337 2757 3669 +3337 2759 3669 +3335 2761 3669 +3333 2765 3667 +3331 2769 3667 +3327 2775 3665 +3321 2781 3663 +3315 2791 3661 +3305 2803 3657 +3293 2817 3653 +3275 2837 3647 +3249 2863 3639 +3215 2895 3627 +3163 2935 3613 +3081 2983 3591 +2945 3041 3559 +2659 3107 3515 +0 3183 3447 +0 3269 3337 +0 3363 3131 +0 3463 2459 +0 3571 0 +0 3683 0 +0 3801 0 +0 3921 0 +0 4045 0 +3375 2747 3683 +3375 2747 3683 +3375 2747 3681 +3373 2749 3681 +3373 2749 3681 +3373 2751 3681 +3373 2751 3681 +3371 2753 3681 +3369 2755 3681 +3367 2759 3679 +3365 2763 3679 +3361 2767 3677 +3357 2775 3675 +3351 2785 3673 +3341 2797 3669 +3331 2813 3665 +3313 2833 3659 +3291 2859 3651 +3259 2891 3641 +3213 2931 3625 +3141 2979 3603 +3023 3037 3573 +2795 3103 3531 +1857 3181 3465 +0 3267 3361 +0 3361 3167 +0 3461 2601 +0 3569 0 +0 3683 0 +0 3799 0 +0 3921 0 +0 4043 0 +3417 2739 3697 +3417 2739 3697 +3417 2739 3697 +3415 2739 3697 +3415 2741 3697 +3415 2741 3697 +3415 2743 3695 +3413 2745 3695 +3413 2747 3695 +3411 2749 3695 +3407 2753 3693 +3405 2759 3691 +3401 2767 3691 +3395 2777 3687 +3387 2789 3685 +3377 2805 3681 +3361 2825 3675 +3341 2851 3667 +3313 2885 3657 +3271 2925 3641 +3209 2973 3621 +3109 3033 3593 +2929 3099 3551 +2455 3177 3489 +0 3263 3389 +0 3359 3211 +0 3459 2739 +0 3569 0 +0 3681 0 +0 3799 0 +0 3919 0 +0 4043 0 +3467 2727 3715 +3467 2727 3715 +3467 2727 3715 +3467 2727 3715 +3467 2729 3715 +3465 2729 3715 +3465 2731 3715 +3465 2733 3715 +3463 2735 3713 +3461 2737 3713 +3459 2743 3713 +3457 2747 3711 +3453 2755 3709 +3447 2765 3707 +3441 2777 3705 +3431 2795 3701 +3419 2815 3695 +3401 2841 3687 +3375 2875 3677 +3339 2917 3663 +3287 2967 3643 +3205 3025 3617 +3065 3095 3577 +2765 3173 3519 +0 3259 3427 +0 3355 3265 +0 3457 2875 +0 3567 0 +0 3679 0 +0 3797 0 +0 3919 0 +0 4043 0 +3527 2709 3741 +3527 2709 3741 +3527 2711 3739 +3527 2711 3739 +3527 2711 3739 +3527 2713 3739 +3525 2713 3739 +3525 2715 3739 +3523 2719 3739 +3523 2721 3737 +3521 2727 3737 +3519 2731 3735 +3515 2739 3735 +3511 2749 3731 +3505 2763 3729 +3497 2779 3725 +3485 2801 3719 +3469 2829 3713 +3447 2863 3703 +3417 2905 3691 +3373 2957 3671 +3307 3017 3647 +3199 3087 3609 +2997 3167 3555 +2367 3255 3471 +0 3351 3327 +0 3455 3011 +0 3563 0 +0 3677 0 +0 3797 0 +0 3917 0 +0 4041 0 +3597 2685 3771 +3597 2687 3771 +3597 2687 3771 +3597 2687 3771 +3597 2689 3771 +3595 2689 3771 +3595 2691 3769 +3595 2693 3769 +3593 2695 3769 +3593 2699 3769 +3591 2703 3767 +3589 2709 3767 +3587 2717 3765 +3583 2729 3763 +3577 2741 3761 +3571 2759 3757 +3561 2783 3751 +3547 2811 3745 +3529 2847 3737 +3505 2891 3725 +3469 2943 3707 +3415 3005 3683 +3331 3077 3649 +3191 3157 3601 +2885 3247 3525 +0 3345 3399 +0 3449 3145 +0 3559 611 +0 3675 0 +0 3795 0 +0 3917 0 +0 4041 0 +3675 2653 3809 +3675 2653 3809 +3675 2653 3809 +3675 2655 3809 +3675 2655 3809 +3675 2657 3807 +3675 2657 3807 +3675 2659 3807 +3673 2663 3807 +3673 2667 3807 +3671 2671 3805 +3669 2677 3805 +3667 2687 3803 +3663 2697 3801 +3659 2713 3799 +3653 2731 3795 +3645 2755 3791 +3635 2785 3785 +3621 2823 3777 +3599 2869 3765 +3571 2925 3751 +3529 2989 3729 +3465 3063 3699 +3363 3147 3655 +3179 3239 3589 +2675 3337 3481 +0 3443 3281 +0 3555 2665 +0 3671 0 +0 3791 0 +0 3913 0 +0 4039 0 +3763 2603 3855 +3763 2605 3855 +3763 2605 3855 +3763 2605 3855 +3763 2607 3855 +3763 2607 3855 +3763 2609 3853 +3763 2611 3853 +3761 2615 3853 +3761 2619 3853 +3759 2625 3853 +3759 2631 3851 +3757 2641 3849 +3753 2653 3849 +3751 2671 3847 +3745 2691 3843 +3739 2717 3839 +3731 2751 3833 +3719 2791 3827 +3701 2839 3817 +3679 2899 3803 +3645 2967 3783 +3597 3043 3757 +3525 3131 3719 +3403 3225 3661 +3163 3327 3571 +1971 3435 3413 +0 3549 3047 +0 3667 0 +0 3787 0 +0 3911 0 +0 4037 0 +3859 2529 3909 +3859 2529 3909 +3859 2531 3909 +3859 2531 3909 +3859 2533 3909 +3859 2533 3909 +3859 2535 3909 +3859 2539 3909 +3859 2543 3909 +3857 2547 3909 +3857 2553 3907 +3855 2561 3907 +3853 2573 3905 +3851 2587 3905 +3849 2607 3903 +3845 2629 3899 +3839 2659 3897 +3833 2697 3891 +3823 2743 3885 +3811 2797 3875 +3793 2861 3863 +3767 2935 3847 +3731 3017 3825 +3677 3109 3791 +3593 3207 3743 +3451 3313 3669 +3141 3425 3547 +0 3541 3305 +0 3659 2036 +0 3783 0 +0 3907 0 +0 4033 0 +3963 2405 3975 +3963 2405 3975 +3963 2407 3975 +3963 2407 3975 +3963 2409 3975 +3963 2411 3975 +3963 2413 3973 +3961 2417 3973 +3961 2423 3973 +3961 2429 3973 +3961 2437 3973 +3959 2447 3971 +3959 2461 3971 +3957 2481 3969 +3955 2503 3967 +3951 2533 3965 +3947 2571 3963 +3941 2615 3959 +3935 2669 3953 +3923 2733 3945 +3909 2805 3935 +3891 2887 3921 +3863 2979 3901 +3823 3077 3873 +3765 3183 3833 +3671 3293 3773 +3507 3409 3679 +3111 3529 3513 +0 3651 3101 +0 3775 0 +0 3901 0 +0 4029 0 +4073 2157 4049 +4073 2157 4049 +4071 2159 4049 +4071 2161 4049 +4071 2163 4049 +4071 2167 4049 +4071 2173 4049 +4071 2179 4049 +4071 2187 4047 +4071 2197 4047 +4071 2211 4047 +4069 2229 4047 +4069 2251 4045 +4067 2281 4045 +4065 2317 4043 +4063 2361 4041 +4059 2413 4039 +4055 2475 4035 +4049 2547 4031 +4041 2629 4025 +4031 2719 4015 +4015 2815 4003 +3995 2921 3987 +3967 3031 3965 +3923 3147 3931 +3861 3265 3885 +3759 3387 3813 +3573 3511 3693 +3067 3639 3463 +0 3765 2465 +0 3895 0 +0 4025 0 +4095 559 4095 +4095 596 4095 +4095 640 4095 +4095 693 4095 +4095 756 4095 +4095 828 4095 +4095 909 4095 +4095 999 4095 +4095 1097 4095 +4095 1202 4095 +4095 1313 4095 +4095 1428 4095 +4095 1547 4095 +4095 1669 4095 +4095 1794 4095 +4095 1920 4095 +4095 2049 4095 +4095 2177 4095 +4095 2307 4095 +4095 2437 4095 +4095 2567 4095 +4095 2699 4095 +4095 2831 4081 +4095 2961 4063 +4075 3093 4037 +4031 3225 4001 +3963 3357 3945 +3855 3489 3859 +3649 3621 3711 +3001 3753 3385 +0 3885 0 +0 4017 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1079 4095 +4095 1889 4095 +4095 2229 4095 +4095 2471 4095 +4095 2671 4095 +4095 2849 4095 +4095 3011 4095 +4095 3165 4095 +4095 3313 4077 +4073 3457 4015 +3957 3597 3915 +3735 3735 3735 +2891 3871 3255 +0 4007 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1549 4095 +4095 2299 4095 +4095 2631 4095 +4095 2871 4095 +4095 3069 4095 +4095 3247 4095 +4095 3409 4095 +4095 3563 4095 +4067 3709 3981 +3829 3853 3765 +2689 3993 2989 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1862 4095 +4095 2573 4095 +4095 2901 4095 +4095 3139 4095 +4095 3337 4095 +4095 3511 4095 +4095 3673 4095 +4095 3827 4057 +3929 3975 3801 +3355 2905 3767 +3353 2905 3767 +3353 2905 3767 +3353 2905 3767 +3353 2905 3767 +3353 2907 3767 +3351 2907 3767 +3351 2909 3767 +3349 2911 3767 +3347 2913 3765 +3345 2915 3765 +3341 2919 3763 +3335 2925 3763 +3329 2931 3761 +3319 2939 3757 +3307 2951 3753 +3291 2967 3749 +3267 2985 3743 +3233 3011 3733 +3183 3041 3721 +3105 3079 3703 +2977 3127 3681 +2715 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3393 +0 3499 3135 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3355 2905 3767 +3355 2905 3767 +3353 2905 3767 +3353 2905 3767 +3353 2905 3767 +3353 2907 3767 +3351 2907 3767 +3351 2909 3767 +3349 2911 3767 +3347 2913 3765 +3345 2915 3765 +3341 2919 3763 +3335 2925 3763 +3329 2931 3761 +3321 2939 3757 +3307 2951 3753 +3291 2967 3749 +3267 2985 3743 +3233 3011 3733 +3183 3041 3721 +3105 3079 3703 +2977 3127 3681 +2717 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3393 +0 3499 3135 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3355 2905 3767 +3355 2905 3767 +3355 2905 3767 +3353 2905 3767 +3353 2905 3767 +3353 2907 3767 +3351 2907 3767 +3351 2909 3767 +3349 2911 3767 +3347 2913 3765 +3345 2915 3765 +3341 2919 3763 +3337 2925 3763 +3329 2931 3761 +3321 2939 3757 +3309 2951 3753 +3291 2967 3749 +3267 2985 3743 +3233 3011 3733 +3183 3041 3721 +3107 3079 3705 +2979 3127 3681 +2719 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3393 +0 3499 3135 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3355 2905 3767 +3355 2905 3767 +3355 2905 3767 +3355 2905 3767 +3353 2905 3767 +3353 2907 3767 +3353 2907 3767 +3351 2909 3767 +3349 2911 3767 +3347 2913 3765 +3345 2915 3765 +3341 2919 3763 +3337 2925 3763 +3329 2931 3761 +3321 2939 3757 +3309 2951 3753 +3291 2967 3749 +3267 2985 3743 +3233 3011 3733 +3183 3041 3721 +3107 3079 3705 +2979 3127 3681 +2721 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3393 +0 3499 3135 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3355 2905 3769 +3355 2905 3769 +3355 2905 3769 +3355 2905 3767 +3355 2905 3767 +3353 2907 3767 +3353 2907 3767 +3351 2909 3767 +3351 2909 3767 +3349 2913 3765 +3345 2915 3765 +3343 2919 3763 +3337 2923 3763 +3331 2931 3761 +3321 2939 3757 +3309 2951 3755 +3293 2967 3749 +3269 2985 3743 +3235 3011 3733 +3185 3041 3721 +3109 3079 3705 +2981 3127 3681 +2723 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3393 +0 3499 3137 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3357 2903 3769 +3357 2905 3769 +3355 2905 3769 +3355 2905 3769 +3355 2905 3767 +3355 2907 3767 +3353 2907 3767 +3353 2909 3767 +3351 2909 3767 +3349 2913 3767 +3347 2915 3765 +3343 2919 3765 +3337 2923 3763 +3331 2931 3761 +3323 2939 3757 +3311 2951 3755 +3293 2967 3749 +3269 2985 3743 +3235 3011 3733 +3185 3041 3721 +3109 3079 3705 +2983 3127 3681 +2725 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3393 +0 3499 3137 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3357 2903 3769 +3357 2905 3769 +3357 2905 3769 +3357 2905 3769 +3357 2905 3769 +3355 2905 3769 +3355 2907 3767 +3353 2909 3767 +3353 2909 3767 +3351 2911 3767 +3347 2915 3765 +3343 2919 3765 +3339 2923 3763 +3333 2931 3761 +3323 2939 3759 +3311 2951 3755 +3295 2965 3749 +3271 2985 3743 +3237 3009 3735 +3187 3041 3721 +3111 3079 3705 +2985 3127 3681 +2729 3183 3647 +0 3247 3597 +0 3323 3521 +0 3407 3395 +0 3499 3139 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3359 2903 3769 +3359 2903 3769 +3359 2905 3769 +3359 2905 3769 +3357 2905 3769 +3357 2905 3769 +3357 2907 3769 +3355 2907 3767 +3353 2909 3767 +3351 2911 3767 +3349 2915 3765 +3345 2919 3765 +3341 2923 3763 +3333 2931 3761 +3325 2939 3759 +3313 2951 3755 +3295 2965 3751 +3273 2985 3743 +3239 3009 3735 +3189 3041 3723 +3113 3079 3705 +2987 3127 3681 +2735 3181 3647 +372 3247 3599 +0 3323 3523 +0 3407 3395 +0 3499 3139 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3361 2903 3769 +3361 2903 3769 +3361 2903 3769 +3359 2905 3769 +3359 2905 3769 +3359 2905 3769 +3359 2907 3769 +3357 2907 3769 +3355 2909 3767 +3353 2911 3767 +3351 2915 3767 +3347 2919 3765 +3343 2923 3763 +3335 2931 3761 +3327 2939 3759 +3315 2951 3755 +3297 2965 3751 +3275 2985 3745 +3241 3009 3735 +3193 3041 3723 +3117 3079 3705 +2993 3125 3683 +2743 3181 3649 +994 3247 3599 +0 3323 3523 +0 3407 3397 +0 3499 3141 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3363 2903 3771 +3363 2903 3771 +3363 2903 3771 +3363 2903 3769 +3361 2905 3769 +3361 2905 3769 +3361 2907 3769 +3359 2907 3769 +3357 2909 3769 +3357 2911 3767 +3353 2915 3767 +3349 2917 3767 +3345 2923 3765 +3339 2929 3763 +3329 2939 3759 +3317 2951 3757 +3301 2965 3751 +3277 2985 3745 +3245 3009 3735 +3195 3041 3723 +3121 3079 3707 +2997 3125 3683 +2753 3181 3649 +1308 3247 3599 +0 3323 3525 +0 3407 3399 +0 3499 3145 +0 3599 0 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3367 2903 3771 +3367 2903 3771 +3367 2903 3771 +3365 2903 3771 +3365 2903 3771 +3365 2905 3771 +3363 2905 3771 +3363 2907 3769 +3361 2909 3769 +3359 2911 3769 +3357 2913 3769 +3353 2917 3767 +3349 2923 3765 +3341 2929 3763 +3333 2939 3761 +3321 2949 3757 +3305 2965 3753 +3281 2985 3745 +3249 3009 3737 +3201 3041 3725 +3127 3079 3707 +3005 3125 3685 +2765 3181 3651 +1540 3247 3601 +0 3321 3525 +0 3407 3401 +0 3499 3147 +0 3599 963 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3371 2901 3773 +3371 2903 3773 +3371 2903 3773 +3371 2903 3773 +3369 2903 3771 +3369 2905 3771 +3369 2905 3771 +3367 2907 3771 +3365 2907 3771 +3363 2911 3771 +3361 2913 3769 +3357 2917 3769 +3353 2921 3767 +3347 2929 3765 +3337 2937 3763 +3325 2949 3759 +3309 2965 3753 +3287 2983 3747 +3255 3009 3739 +3207 3039 3725 +3135 3079 3709 +3015 3125 3685 +2781 3181 3653 +1735 3247 3603 +0 3321 3527 +0 3405 3403 +0 3499 3153 +0 3599 1337 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3377 2901 3773 +3377 2901 3773 +3377 2901 3773 +3375 2903 3773 +3375 2903 3773 +3375 2903 3773 +3375 2905 3773 +3373 2905 3773 +3371 2907 3773 +3369 2909 3771 +3367 2913 3771 +3363 2917 3769 +3359 2921 3769 +3353 2927 3767 +3345 2937 3763 +3333 2949 3761 +3317 2963 3755 +3293 2983 3749 +3261 3007 3739 +3215 3039 3727 +3143 3077 3711 +3027 3125 3687 +2801 3181 3655 +1909 3247 3605 +0 3321 3531 +0 3405 3407 +0 3499 3159 +0 3599 1591 +0 3705 0 +0 3817 0 +0 3935 0 +0 4055 0 +3385 2901 3777 +3385 2901 3775 +3383 2901 3775 +3383 2901 3775 +3383 2901 3775 +3383 2903 3775 +3381 2903 3775 +3381 2905 3775 +3379 2905 3775 +3377 2909 3773 +3375 2911 3773 +3371 2915 3771 +3367 2921 3771 +3361 2927 3769 +3353 2935 3765 +3341 2947 3763 +3325 2963 3757 +3303 2983 3751 +3271 3007 3743 +3225 3039 3731 +3157 3077 3713 +3043 3123 3691 +2827 3181 3657 +2071 3245 3609 +0 3321 3535 +0 3405 3411 +0 3499 3167 +0 3599 1797 +0 3705 0 +0 3817 0 +0 3933 0 +0 4055 0 +3395 2899 3779 +3393 2899 3779 +3393 2899 3779 +3393 2899 3779 +3393 2901 3779 +3393 2901 3779 +3391 2901 3779 +3391 2903 3777 +3389 2905 3777 +3387 2907 3777 +3385 2909 3775 +3381 2913 3775 +3377 2919 3773 +3371 2925 3771 +3363 2935 3769 +3351 2947 3765 +3337 2961 3761 +3315 2981 3755 +3285 3005 3745 +3239 3037 3733 +3173 3075 3717 +3065 3123 3693 +2861 3179 3661 +2223 3245 3613 +0 3321 3539 +0 3405 3417 +0 3497 3177 +0 3599 1978 +0 3705 0 +0 3817 0 +0 3933 0 +0 4055 0 +3407 2897 3783 +3407 2897 3783 +3407 2897 3783 +3407 2897 3783 +3407 2899 3783 +3405 2899 3783 +3405 2899 3781 +3403 2901 3781 +3403 2903 3781 +3401 2905 3781 +3399 2907 3779 +3395 2911 3779 +3391 2917 3777 +3385 2923 3775 +3377 2933 3773 +3365 2945 3769 +3351 2959 3765 +3331 2979 3757 +3301 3005 3749 +3257 3035 3737 +3193 3075 3721 +3091 3121 3699 +2901 3179 3665 +2369 3245 3617 +0 3319 3545 +0 3405 3425 +0 3497 3191 +0 3597 2143 +0 3705 0 +0 3817 0 +0 3933 0 +0 4053 0 +3423 2893 3787 +3423 2895 3787 +3423 2895 3787 +3423 2895 3787 +3423 2895 3787 +3423 2897 3787 +3421 2897 3787 +3421 2899 3787 +3419 2899 3787 +3417 2903 3785 +3415 2905 3785 +3413 2909 3783 +3409 2915 3783 +3403 2921 3781 +3395 2931 3777 +3385 2943 3775 +3369 2957 3769 +3349 2977 3763 +3321 3003 3755 +3281 3033 3743 +3221 3073 3727 +3123 3121 3705 +2951 3177 3671 +2513 3243 3625 +0 3319 3553 +0 3403 3437 +0 3497 3209 +0 3597 2299 +0 3705 0 +0 3817 0 +0 3933 0 +0 4053 0 +3445 2891 3795 +3445 2891 3795 +3445 2891 3795 +3445 2891 3795 +3445 2891 3793 +3443 2893 3793 +3443 2893 3793 +3443 2895 3793 +3441 2897 3793 +3439 2899 3793 +3437 2901 3791 +3435 2905 3791 +3431 2911 3789 +3425 2917 3787 +3417 2927 3785 +3407 2939 3781 +3395 2955 3777 +3375 2975 3771 +3349 2999 3761 +3311 3031 3751 +3253 3071 3735 +3165 3119 3713 +3009 3175 3681 +2653 3241 3635 +0 3317 3565 +0 3403 3451 +0 3495 3233 +0 3597 2447 +0 3703 0 +0 3817 0 +0 3933 0 +0 4053 0 +3473 2885 3803 +3473 2885 3803 +3473 2887 3803 +3473 2887 3803 +3471 2887 3803 +3471 2887 3803 +3471 2889 3803 +3469 2889 3801 +3469 2891 3801 +3467 2893 3801 +3465 2897 3801 +3463 2901 3799 +3459 2907 3797 +3453 2913 3795 +3447 2923 3793 +3437 2935 3789 +3425 2951 3785 +3407 2971 3779 +3383 2995 3771 +3347 3027 3759 +3295 3067 3745 +3213 3115 3723 +3077 3173 3691 +2791 3239 3647 +0 3315 3579 +0 3401 3469 +0 3495 3263 +0 3595 2591 +0 3703 0 +0 3815 0 +0 3933 0 +0 4053 0 +3507 2879 3815 +3507 2879 3815 +3507 2879 3815 +3507 2879 3815 +3507 2881 3813 +3505 2881 3813 +3505 2883 3813 +3505 2883 3813 +3503 2885 3813 +3501 2887 3813 +3499 2891 3811 +3497 2895 3811 +3493 2901 3809 +3489 2907 3807 +3483 2917 3805 +3475 2929 3801 +3463 2945 3797 +3447 2965 3791 +3423 2991 3783 +3391 3023 3773 +3345 3063 3757 +3273 3111 3735 +3155 3169 3707 +2927 3235 3663 +1989 3313 3597 +0 3399 3493 +0 3493 3299 +0 3593 2733 +0 3701 0 +0 3815 0 +0 3931 0 +0 4053 0 +3549 2871 3829 +3549 2871 3829 +3549 2871 3829 +3549 2871 3829 +3549 2871 3829 +3547 2873 3829 +3547 2873 3829 +3547 2875 3827 +3545 2877 3827 +3545 2879 3827 +3543 2881 3827 +3541 2887 3825 +3537 2891 3825 +3533 2899 3823 +3527 2909 3819 +3519 2921 3817 +3509 2937 3813 +3493 2957 3807 +3473 2983 3799 +3445 3017 3789 +3403 3057 3773 +3341 3105 3753 +3241 3165 3725 +3061 3231 3683 +2587 3309 3621 +0 3395 3521 +0 3491 3343 +0 3593 2871 +0 3701 0 +0 3813 0 +0 3931 0 +0 4051 0 +3599 2857 3849 +3599 2859 3847 +3599 2859 3847 +3599 2859 3847 +3599 2859 3847 +3599 2861 3847 +3599 2861 3847 +3597 2863 3847 +3597 2865 3847 +3595 2867 3847 +3593 2871 3845 +3591 2875 3845 +3589 2879 3843 +3585 2887 3841 +3579 2897 3839 +3573 2909 3837 +3563 2927 3833 +3551 2947 3827 +3533 2975 3819 +3507 3007 3809 +3471 3049 3795 +3419 3099 3775 +3337 3157 3749 +3197 3227 3709 +2897 3305 3651 +0 3391 3559 +0 3487 3397 +0 3589 3007 +0 3699 0 +0 3811 0 +0 3929 0 +0 4051 0 +3659 2841 3873 +3659 2841 3873 +3659 2841 3873 +3659 2843 3873 +3659 2843 3871 +3659 2843 3871 +3659 2845 3871 +3657 2847 3871 +3657 2847 3871 +3655 2851 3871 +3655 2853 3869 +3653 2859 3869 +3651 2865 3867 +3647 2871 3867 +3643 2881 3865 +3637 2895 3861 +3629 2911 3857 +3617 2933 3853 +3601 2961 3845 +3579 2995 3835 +3549 3037 3823 +3505 3089 3805 +3439 3149 3779 +3331 3219 3741 +3129 3299 3687 +2499 3387 3603 +0 3483 3459 +0 3587 3143 +0 3695 0 +0 3809 0 +0 3929 0 +0 4049 0 +3729 2817 3903 +3729 2819 3903 +3729 2819 3903 +3729 2819 3903 +3729 2819 3903 +3729 2821 3903 +3727 2821 3903 +3727 2823 3901 +3727 2825 3901 +3725 2827 3901 +3725 2831 3901 +3723 2835 3899 +3721 2841 3899 +3719 2849 3897 +3715 2861 3895 +3709 2875 3893 +3703 2891 3889 +3693 2915 3883 +3679 2943 3877 +3661 2979 3869 +3637 3023 3857 +3601 3075 3839 +3547 3137 3815 +3463 3209 3781 +3323 3291 3733 +3017 3379 3657 +0 3477 3531 +0 3581 3279 +0 3693 744 +0 3807 0 +0 3927 0 +0 4049 0 +3809 2785 3941 +3809 2785 3941 +3807 2785 3941 +3807 2785 3941 +3807 2787 3941 +3807 2787 3941 +3807 2789 3941 +3807 2789 3939 +3807 2791 3939 +3805 2795 3939 +3805 2799 3939 +3803 2803 3937 +3801 2811 3937 +3799 2819 3935 +3795 2831 3933 +3791 2845 3931 +3785 2863 3927 +3777 2887 3923 +3767 2919 3917 +3753 2955 3909 +3731 3001 3897 +3703 3057 3883 +3661 3121 3861 +3597 3195 3831 +3495 3279 3787 +3311 3371 3721 +2807 3469 3613 +0 3575 3413 +0 3687 2797 +0 3803 0 +0 3923 0 +0 4047 0 +3897 2735 3987 +3895 2735 3987 +3895 2737 3987 +3895 2737 3987 +3895 2737 3987 +3895 2739 3987 +3895 2739 3987 +3895 2741 3987 +3895 2743 3985 +3893 2747 3985 +3893 2751 3985 +3891 2757 3985 +3891 2765 3983 +3889 2773 3983 +3885 2787 3981 +3883 2803 3979 +3877 2823 3975 +3871 2849 3971 +3863 2883 3965 +3851 2923 3959 +3833 2973 3949 +3811 3031 3935 +3777 3099 3915 +3729 3177 3889 +3657 3263 3851 +3535 3357 3793 +3295 3459 3703 +2103 3567 3545 +0 3681 3179 +0 3799 0 +0 3919 0 +0 4043 0 +3993 2661 4041 +3991 2661 4041 +3991 2661 4041 +3991 2663 4041 +3991 2663 4041 +3991 2665 4041 +3991 2665 4041 +3991 2667 4041 +3991 2671 4041 +3991 2675 4041 +3989 2679 4041 +3989 2685 4039 +3987 2695 4039 +3985 2705 4037 +3983 2719 4037 +3981 2739 4035 +3977 2763 4031 +3971 2793 4029 +3965 2829 4023 +3955 2875 4017 +3943 2929 4009 +3925 2993 3997 +3899 3067 3979 +3863 3149 3957 +3809 3241 3923 +3725 3339 3875 +3583 3445 3801 +3273 3557 3679 +0 3673 3437 +0 3791 2169 +0 3915 0 +0 4039 0 +4095 2537 4095 +4095 2537 4095 +4095 2537 4095 +4095 2539 4095 +4095 2539 4095 +4095 2541 4095 +4095 2543 4095 +4095 2545 4095 +4095 2549 4095 +4093 2555 4095 +4093 2561 4095 +4093 2569 4095 +4091 2579 4095 +4091 2595 4095 +4089 2613 4095 +4087 2635 4095 +4083 2665 4095 +4079 2703 4095 +4073 2747 4091 +4067 2801 4085 +4055 2865 4077 +4041 2937 4067 +4023 3019 4053 +3995 3111 4033 +3955 3209 4005 +3897 3315 3965 +3803 3425 3907 +3639 3541 3811 +3243 3661 3645 +0 3783 3235 +0 3907 0 +0 4033 0 +4095 2287 4095 +4095 2289 4095 +4095 2289 4095 +4095 2291 4095 +4095 2293 4095 +4095 2295 4095 +4095 2299 4095 +4095 2305 4095 +4095 2311 4095 +4095 2319 4095 +4095 2329 4095 +4095 2343 4095 +4095 2361 4095 +4095 2383 4095 +4095 2413 4095 +4095 2449 4095 +4095 2493 4095 +4095 2545 4095 +4095 2607 4095 +4095 2679 4095 +4095 2761 4095 +4095 2851 4095 +4095 2949 4095 +4095 3053 4095 +4095 3163 4095 +4057 3279 4065 +3993 3397 4017 +3891 3519 3945 +3707 3643 3825 +3199 3771 3595 +0 3899 2597 +0 4027 0 +4095 662 4095 +4095 691 4095 +4095 728 4095 +4095 772 4095 +4095 825 4095 +4095 888 4095 +4095 960 4095 +4095 1041 4095 +4095 1131 4095 +4095 1229 4095 +4095 1334 4095 +4095 1445 4095 +4095 1560 4095 +4095 1679 4095 +4095 1802 4095 +4095 1926 4095 +4095 2053 4095 +4095 2181 4095 +4095 2309 4095 +4095 2439 4095 +4095 2569 4095 +4095 2699 4095 +4095 2831 4095 +4095 2963 4095 +4095 3093 4095 +4095 3225 4095 +4095 3357 4095 +4095 3489 4077 +3987 3621 3991 +3783 3753 3843 +3133 3885 3517 +0 4017 0 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1211 4095 +4095 2021 4095 +4095 2361 4095 +4095 2603 4095 +4095 2803 4095 +4095 2981 4095 +4095 3143 4095 +4095 3297 4095 +4095 3445 4095 +4095 3589 4095 +4089 3729 4047 +3867 3867 3867 +3023 4003 3387 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1681 4095 +4095 2431 4095 +4095 2763 4095 +4095 3003 4095 +4095 3203 4095 +4095 3379 4095 +4095 3541 4095 +4095 3695 4095 +4095 3841 4095 +3961 3985 3897 +3487 3037 3899 +3487 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3039 3899 +3483 3039 3899 +3483 3041 3899 +3481 3043 3899 +3479 3045 3897 +3475 3047 3897 +3473 3051 3895 +3467 3057 3895 +3461 3063 3893 +3451 3071 3889 +3439 3083 3885 +3423 3099 3881 +3399 3117 3875 +3365 3143 3865 +3315 3173 3853 +3237 3211 3835 +3109 3259 3813 +2847 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3525 +0 3631 3267 +0 3731 0 +0 3837 0 +0 3951 0 +0 4067 0 +3487 3037 3899 +3487 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3039 3899 +3483 3039 3899 +3483 3041 3899 +3481 3043 3899 +3479 3045 3897 +3477 3047 3897 +3473 3051 3895 +3467 3057 3895 +3461 3063 3893 +3451 3071 3889 +3439 3083 3885 +3423 3099 3881 +3399 3117 3875 +3365 3143 3865 +3315 3173 3853 +3237 3211 3835 +3109 3259 3813 +2849 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3525 +0 3631 3267 +0 3731 0 +0 3837 0 +0 3951 0 +0 4067 0 +3487 3037 3899 +3487 3037 3899 +3487 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3039 3899 +3483 3039 3899 +3483 3041 3899 +3481 3043 3899 +3479 3045 3897 +3477 3047 3897 +3473 3051 3895 +3467 3057 3895 +3461 3063 3893 +3453 3071 3889 +3439 3083 3885 +3423 3099 3881 +3399 3117 3875 +3365 3143 3865 +3315 3173 3853 +3239 3211 3837 +3109 3259 3813 +2849 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3525 +0 3631 3267 +0 3731 0 +0 3837 0 +0 3951 0 +0 4067 0 +3487 3037 3901 +3487 3037 3899 +3487 3037 3899 +3487 3037 3899 +3485 3037 3899 +3485 3037 3899 +3485 3039 3899 +3485 3039 3899 +3483 3041 3899 +3481 3043 3899 +3479 3045 3897 +3477 3047 3897 +3473 3051 3895 +3469 3057 3895 +3461 3063 3893 +3453 3071 3889 +3441 3083 3885 +3423 3099 3881 +3399 3117 3875 +3365 3143 3865 +3315 3173 3853 +3239 3211 3837 +3111 3259 3813 +2851 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3525 +0 3631 3267 +0 3731 0 +0 3837 0 +0 3951 0 +0 4067 0 +3487 3037 3901 +3487 3037 3901 +3487 3037 3901 +3487 3037 3899 +3487 3037 3899 +3485 3037 3899 +3485 3039 3899 +3485 3039 3899 +3483 3041 3899 +3481 3043 3899 +3479 3045 3897 +3477 3047 3897 +3473 3051 3895 +3469 3057 3895 +3463 3063 3893 +3453 3071 3889 +3441 3083 3887 +3423 3099 3881 +3399 3117 3875 +3365 3143 3865 +3315 3173 3853 +3239 3211 3837 +3111 3259 3813 +2853 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3525 +0 3631 3267 +0 3731 0 +0 3837 0 +0 3951 0 +0 4067 0 +3487 3037 3901 +3487 3037 3901 +3487 3037 3901 +3487 3037 3901 +3487 3037 3901 +3487 3037 3899 +3485 3039 3899 +3485 3039 3899 +3483 3041 3899 +3483 3043 3899 +3481 3045 3899 +3477 3047 3897 +3475 3051 3897 +3469 3057 3895 +3463 3063 3893 +3453 3071 3889 +3441 3083 3887 +3425 3099 3881 +3401 3117 3875 +3367 3143 3865 +3317 3173 3853 +3241 3211 3837 +3113 3259 3813 +2855 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3525 +0 3631 3269 +0 3731 0 +0 3837 0 +0 3951 0 +0 4067 0 +3489 3035 3901 +3489 3037 3901 +3489 3037 3901 +3489 3037 3901 +3487 3037 3901 +3487 3037 3901 +3487 3039 3899 +3485 3039 3899 +3485 3041 3899 +3483 3041 3899 +3481 3045 3899 +3479 3047 3897 +3475 3051 3897 +3471 3057 3895 +3463 3063 3893 +3455 3071 3891 +3443 3083 3887 +3425 3099 3881 +3401 3117 3875 +3367 3143 3867 +3317 3173 3853 +3241 3211 3837 +3115 3259 3813 +2857 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3527 +0 3631 3269 +0 3731 0 +0 3837 0 +0 3949 0 +0 4067 0 +3489 3035 3901 +3489 3035 3901 +3489 3037 3901 +3489 3037 3901 +3489 3037 3901 +3489 3037 3901 +3487 3039 3901 +3487 3039 3899 +3485 3041 3899 +3485 3041 3899 +3483 3045 3899 +3479 3047 3897 +3477 3051 3897 +3471 3055 3895 +3465 3063 3893 +3455 3071 3891 +3443 3083 3887 +3427 3099 3881 +3403 3117 3875 +3369 3143 3867 +3319 3173 3855 +3243 3211 3837 +3117 3259 3813 +2861 3315 3779 +0 3379 3729 +0 3455 3653 +0 3539 3527 +0 3631 3271 +0 3731 0 +0 3837 0 +0 3949 0 +0 4067 0 +3491 3035 3901 +3491 3035 3901 +3491 3035 3901 +3491 3037 3901 +3491 3037 3901 +3489 3037 3901 +3489 3037 3901 +3489 3039 3901 +3487 3041 3899 +3485 3041 3899 +3483 3043 3899 +3481 3047 3899 +3477 3051 3897 +3473 3055 3895 +3467 3063 3893 +3457 3071 3891 +3445 3083 3887 +3427 3097 3883 +3405 3117 3875 +3371 3141 3867 +3321 3173 3855 +3245 3211 3837 +3121 3259 3813 +2867 3315 3779 +504 3379 3731 +0 3455 3655 +0 3539 3527 +0 3631 3271 +0 3731 0 +0 3837 0 +0 3949 0 +0 4067 0 +3493 3035 3901 +3493 3035 3901 +3493 3035 3901 +3493 3037 3901 +3493 3037 3901 +3491 3037 3901 +3491 3037 3901 +3491 3039 3901 +3489 3039 3901 +3487 3041 3901 +3485 3043 3899 +3483 3047 3899 +3479 3051 3897 +3475 3055 3895 +3469 3063 3893 +3459 3071 3891 +3447 3083 3887 +3431 3097 3883 +3407 3117 3877 +3373 3141 3867 +3325 3173 3855 +3249 3211 3839 +3125 3259 3815 +2875 3313 3781 +1125 3379 3731 +0 3455 3655 +0 3539 3529 +0 3631 3273 +0 3731 0 +0 3837 0 +0 3949 0 +0 4067 0 +3495 3035 3903 +3495 3035 3903 +3495 3035 3903 +3495 3035 3903 +3495 3037 3903 +3495 3037 3901 +3493 3037 3901 +3493 3039 3901 +3491 3039 3901 +3491 3041 3901 +3489 3043 3901 +3485 3047 3899 +3481 3051 3899 +3477 3055 3897 +3471 3061 3895 +3461 3071 3893 +3449 3083 3889 +3433 3097 3883 +3409 3117 3877 +3377 3141 3869 +3327 3173 3855 +3253 3211 3839 +3129 3257 3815 +2885 3313 3781 +1440 3379 3733 +0 3455 3657 +0 3539 3531 +0 3631 3277 +0 3731 0 +0 3837 0 +0 3949 0 +0 4067 0 +3499 3035 3903 +3499 3035 3903 +3499 3035 3903 +3499 3035 3903 +3497 3035 3903 +3497 3037 3903 +3497 3037 3903 +3495 3037 3903 +3495 3039 3903 +3493 3041 3901 +3491 3043 3901 +3489 3045 3901 +3485 3049 3899 +3481 3055 3897 +3475 3061 3895 +3465 3071 3893 +3453 3081 3889 +3437 3097 3885 +3413 3117 3877 +3381 3141 3869 +3333 3173 3857 +3259 3211 3839 +3137 3257 3817 +2897 3313 3783 +1672 3379 3733 +0 3455 3657 +0 3539 3533 +0 3631 3281 +0 3731 1095 +0 3837 0 +0 3949 0 +0 4067 0 +3503 3033 3905 +3503 3035 3905 +3503 3035 3905 +3503 3035 3905 +3503 3035 3905 +3501 3035 3905 +3501 3037 3903 +3501 3037 3903 +3499 3039 3903 +3497 3041 3903 +3495 3043 3903 +3493 3045 3901 +3489 3049 3901 +3485 3055 3899 +3479 3061 3897 +3471 3069 3895 +3459 3081 3891 +3441 3097 3885 +3419 3115 3879 +3387 3141 3871 +3339 3171 3859 +3267 3211 3841 +3147 3257 3817 +2913 3313 3785 +1867 3379 3735 +0 3453 3661 +0 3537 3535 +0 3631 3285 +0 3731 1469 +0 3837 0 +0 3949 0 +0 4067 0 +3509 3033 3907 +3509 3033 3907 +3509 3033 3905 +3509 3033 3905 +3507 3035 3905 +3507 3035 3905 +3507 3035 3905 +3507 3037 3905 +3505 3037 3905 +3503 3039 3905 +3501 3041 3903 +3499 3045 3903 +3495 3049 3901 +3491 3053 3901 +3485 3061 3899 +3477 3069 3895 +3465 3081 3893 +3449 3095 3887 +3425 3115 3881 +3393 3139 3873 +3347 3171 3859 +3275 3209 3843 +3159 3257 3819 +2933 3313 3787 +2041 3379 3737 +0 3453 3663 +0 3537 3539 +0 3631 3291 +0 3731 1724 +0 3837 0 +0 3949 0 +0 4067 0 +3517 3033 3909 +3517 3033 3909 +3517 3033 3909 +3515 3033 3909 +3515 3033 3907 +3515 3033 3907 +3515 3035 3907 +3513 3035 3907 +3513 3037 3907 +3511 3039 3907 +3509 3041 3905 +3507 3043 3905 +3503 3047 3905 +3499 3053 3903 +3493 3059 3901 +3485 3067 3897 +3473 3079 3895 +3457 3095 3889 +3435 3115 3883 +3403 3139 3875 +3357 3171 3863 +3289 3209 3845 +3175 3257 3823 +2959 3313 3789 +2203 3377 3741 +0 3453 3667 +0 3537 3543 +0 3631 3299 +0 3731 1929 +0 3837 0 +0 3949 0 +0 4067 0 +3527 3031 3911 +3527 3031 3911 +3527 3031 3911 +3525 3031 3911 +3525 3031 3911 +3525 3033 3911 +3525 3033 3911 +3523 3033 3911 +3523 3035 3909 +3521 3037 3909 +3519 3039 3909 +3517 3041 3907 +3513 3045 3907 +3509 3051 3905 +3503 3057 3903 +3495 3067 3901 +3483 3079 3897 +3469 3093 3893 +3447 3113 3887 +3417 3137 3877 +3371 3169 3865 +3305 3207 3849 +3197 3255 3825 +2993 3311 3793 +2355 3377 3745 +0 3453 3671 +0 3537 3549 +0 3629 3311 +0 3731 2109 +0 3837 0 +0 3949 0 +0 4065 0 +3539 3029 3915 +3539 3029 3915 +3539 3029 3915 +3539 3029 3915 +3539 3029 3915 +3539 3031 3915 +3537 3031 3915 +3537 3031 3913 +3535 3033 3913 +3535 3035 3913 +3533 3037 3913 +3531 3039 3911 +3527 3043 3911 +3523 3049 3909 +3517 3055 3907 +3509 3065 3905 +3499 3077 3901 +3483 3091 3897 +3463 3111 3891 +3433 3137 3881 +3389 3167 3869 +3325 3207 3853 +3223 3253 3831 +3033 3311 3797 +2501 3377 3751 +0 3451 3677 +0 3537 3559 +0 3629 3325 +0 3729 2275 +0 3837 0 +0 3949 0 +0 4065 0 +3557 3025 3919 +3557 3027 3919 +3555 3027 3919 +3555 3027 3919 +3555 3027 3919 +3555 3027 3919 +3555 3029 3919 +3553 3029 3919 +3553 3031 3919 +3551 3033 3919 +3549 3035 3917 +3547 3037 3917 +3545 3041 3915 +3541 3047 3915 +3535 3053 3913 +3527 3063 3909 +3517 3075 3907 +3501 3089 3901 +3483 3109 3895 +3453 3135 3887 +3413 3165 3875 +3353 3205 3859 +3255 3253 3837 +3083 3309 3805 +2645 3375 3757 +0 3451 3685 +0 3535 3569 +0 3629 3343 +0 3729 2431 +0 3837 0 +0 3949 0 +0 4065 0 +3577 3023 3927 +3577 3023 3927 +3577 3023 3927 +3577 3023 3927 +3577 3023 3927 +3577 3023 3927 +3577 3025 3925 +3575 3025 3925 +3575 3027 3925 +3573 3029 3925 +3571 3031 3925 +3569 3033 3923 +3567 3037 3923 +3563 3043 3921 +3557 3049 3919 +3549 3059 3917 +3539 3071 3913 +3527 3087 3909 +3507 3107 3903 +3481 3131 3893 +3443 3163 3883 +3385 3203 3867 +3297 3251 3845 +3141 3307 3813 +2785 3373 3767 +0 3449 3697 +0 3535 3583 +0 3627 3365 +0 3729 2579 +0 3835 0 +0 3949 0 +0 4065 0 +3605 3017 3935 +3605 3017 3935 +3605 3017 3935 +3605 3019 3935 +3605 3019 3935 +3603 3019 3935 +3603 3019 3935 +3603 3021 3935 +3601 3023 3933 +3601 3023 3933 +3599 3027 3933 +3597 3029 3933 +3595 3033 3931 +3591 3039 3929 +3585 3045 3927 +3579 3055 3925 +3569 3067 3923 +3557 3083 3917 +3539 3103 3911 +3515 3127 3903 +3479 3159 3891 +3427 3199 3877 +3347 3247 3855 +3209 3305 3823 +2923 3371 3779 +0 3447 3711 +0 3533 3601 +0 3627 3395 +0 3727 2723 +0 3835 0 +0 3947 0 +0 4065 0 +3639 3011 3947 +3639 3011 3947 +3639 3011 3947 +3639 3011 3947 +3639 3013 3947 +3639 3013 3947 +3637 3013 3945 +3637 3015 3945 +3637 3015 3945 +3635 3017 3945 +3633 3019 3945 +3631 3023 3943 +3629 3027 3943 +3625 3033 3941 +3621 3039 3939 +3615 3049 3937 +3607 3061 3933 +3595 3077 3929 +3579 3097 3923 +3555 3123 3915 +3523 3155 3905 +3477 3195 3889 +3405 3243 3869 +3287 3301 3839 +3059 3369 3795 +2121 3445 3729 +0 3531 3625 +0 3625 3431 +0 3727 2865 +0 3833 0 +0 3947 0 +0 4065 0 +3681 3003 3961 +3681 3003 3961 +3681 3003 3961 +3681 3003 3961 +3681 3003 3961 +3681 3003 3961 +3679 3005 3961 +3679 3005 3961 +3679 3007 3961 +3677 3009 3959 +3677 3011 3959 +3675 3015 3959 +3673 3019 3957 +3669 3023 3957 +3665 3031 3955 +3659 3041 3953 +3651 3053 3949 +3641 3069 3945 +3625 3089 3939 +3605 3115 3931 +3577 3149 3921 +3535 3189 3905 +3473 3237 3885 +3373 3297 3857 +3195 3365 3815 +2719 3441 3753 +0 3527 3655 +0 3623 3475 +0 3725 3003 +0 3833 0 +0 3945 0 +0 4063 0 +3731 2989 3981 +3731 2991 3981 +3731 2991 3981 +3731 2991 3981 +3731 2991 3979 +3731 2991 3979 +3731 2993 3979 +3731 2993 3979 +3729 2995 3979 +3729 2997 3979 +3727 2999 3979 +3725 3003 3977 +3723 3007 3977 +3721 3013 3975 +3717 3019 3973 +3713 3029 3971 +3705 3041 3969 +3695 3059 3965 +3683 3079 3959 +3665 3107 3951 +3639 3139 3941 +3603 3181 3927 +3551 3231 3907 +3469 3289 3881 +3329 3359 3841 +3029 3437 3783 +0 3523 3691 +0 3619 3529 +0 3721 3139 +0 3831 0 +0 3945 0 +0 4061 0 +3791 2973 4005 +3791 2973 4005 +3791 2973 4005 +3791 2973 4005 +3791 2975 4005 +3791 2975 4005 +3791 2975 4003 +3791 2977 4003 +3789 2979 4003 +3789 2981 4003 +3787 2983 4003 +3787 2985 4001 +3785 2991 4001 +3783 2997 3999 +3779 3003 3999 +3775 3013 3997 +3769 3027 3993 +3761 3043 3989 +3749 3065 3985 +3733 3093 3977 +3713 3127 3967 +3681 3169 3955 +3637 3221 3937 +3571 3281 3911 +3463 3351 3873 +3261 3431 3819 +2631 3519 3735 +0 3615 3591 +0 3719 3275 +0 3827 0 +0 3943 0 +0 4061 0 +3861 2949 4035 +3861 2949 4035 +3861 2951 4035 +3861 2951 4035 +3861 2951 4035 +3861 2951 4035 +3861 2953 4035 +3861 2953 4035 +3859 2955 4035 +3859 2957 4033 +3859 2959 4033 +3857 2963 4033 +3855 2967 4031 +3853 2973 4031 +3851 2981 4029 +3847 2993 4027 +3841 3007 4025 +3835 3023 4021 +3825 3047 4017 +3811 3075 4009 +3793 3111 4001 +3769 3155 3989 +3733 3207 3971 +3679 3269 3947 +3595 3341 3915 +3455 3423 3865 +3149 3511 3789 +0 3609 3663 +0 3713 3411 +0 3825 876 +0 3939 0 +0 4059 0 +3941 2917 4073 +3941 2917 4073 +3941 2917 4073 +3941 2917 4073 +3939 2917 4073 +3939 2919 4073 +3939 2919 4073 +3939 2921 4073 +3939 2921 4071 +3939 2925 4071 +3937 2927 4071 +3937 2931 4071 +3935 2935 4069 +3933 2943 4069 +3931 2951 4067 +3927 2963 4065 +3923 2977 4063 +3917 2995 4059 +3909 3019 4055 +3899 3051 4049 +3885 3087 4041 +3863 3133 4031 +3835 3189 4015 +3793 3253 3993 +3729 3327 3963 +3627 3411 3919 +3443 3503 3853 +2939 3601 3745 +0 3707 3545 +0 3819 2929 +0 3935 0 +0 4055 0 +4029 2867 4095 +4029 2867 4095 +4029 2867 4095 +4029 2869 4095 +4027 2869 4095 +4027 2869 4095 +4027 2871 4095 +4027 2871 4095 +4027 2873 4095 +4027 2877 4095 +4025 2879 4095 +4025 2883 4095 +4025 2889 4095 +4023 2897 4095 +4021 2905 4095 +4019 2919 4095 +4015 2935 4095 +4009 2955 4095 +4003 2981 4095 +3995 3015 4095 +3983 3055 4091 +3965 3105 4081 +3943 3163 4067 +3909 3231 4047 +3861 3309 4021 +3789 3395 3983 +3667 3489 3925 +3427 3591 3835 +2235 3699 3677 +0 3813 3313 +0 3931 0 +0 4051 0 +4095 2793 4095 +4095 2793 4095 +4095 2793 4095 +4095 2793 4095 +4095 2795 4095 +4095 2795 4095 +4095 2797 4095 +4095 2797 4095 +4095 2799 4095 +4095 2803 4095 +4095 2807 4095 +4095 2811 4095 +4095 2817 4095 +4095 2827 4095 +4095 2837 4095 +4095 2851 4095 +4095 2871 4095 +4095 2895 4095 +4095 2925 4095 +4095 2961 4095 +4087 3007 4095 +4075 3061 4095 +4057 3125 4095 +4031 3199 4095 +3995 3281 4089 +3941 3373 4055 +3857 3471 4007 +3715 3577 3933 +3407 3689 3811 +0 3805 3569 +0 3925 2301 +0 4047 0 +4095 2667 4095 +4095 2669 4095 +4095 2669 4095 +4095 2669 4095 +4095 2671 4095 +4095 2671 4095 +4095 2673 4095 +4095 2675 4095 +4095 2677 4095 +4095 2681 4095 +4095 2687 4095 +4095 2693 4095 +4095 2701 4095 +4095 2711 4095 +4095 2727 4095 +4095 2745 4095 +4095 2767 4095 +4095 2797 4095 +4095 2835 4095 +4095 2879 4095 +4095 2933 4095 +4095 2997 4095 +4095 3069 4095 +4095 3151 4095 +4095 3243 4095 +4087 3341 4095 +4029 3447 4095 +3935 3557 4039 +3771 3673 3945 +3375 3793 3777 +0 3915 3367 +0 4039 0 +4095 2419 4095 +4095 2421 4095 +4095 2421 4095 +4095 2421 4095 +4095 2423 4095 +4095 2425 4095 +4095 2429 4095 +4095 2431 4095 +4095 2437 4095 +4095 2443 4095 +4095 2451 4095 +4095 2461 4095 +4095 2475 4095 +4095 2493 4095 +4095 2515 4095 +4095 2545 4095 +4095 2581 4095 +4095 2625 4095 +4095 2677 4095 +4095 2739 4095 +4095 2811 4095 +4095 2893 4095 +4095 2983 4095 +4095 3081 4095 +4095 3185 4095 +4095 3295 4095 +4095 3411 4095 +4095 3529 4095 +4023 3651 4077 +3839 3777 3959 +3331 3903 3727 +0 4031 2729 +4095 771 4095 +4095 795 4095 +4095 824 4095 +4095 860 4095 +4095 904 4095 +4095 957 4095 +4095 1020 4095 +4095 1092 4095 +4095 1173 4095 +4095 1263 4095 +4095 1361 4095 +4095 1466 4095 +4095 1577 4095 +4095 1692 4095 +4095 1811 4095 +4095 1934 4095 +4095 2059 4095 +4095 2185 4095 +4095 2313 4095 +4095 2441 4095 +4095 2571 4095 +4095 2701 4095 +4095 2831 4095 +4095 2963 4095 +4095 3095 4095 +4095 3225 4095 +4095 3357 4095 +4095 3489 4095 +4095 3621 4095 +4095 3753 4095 +3915 3885 3977 +3265 4017 3649 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 1343 4095 +4095 2153 4095 +4095 2493 4095 +4095 2735 4095 +4095 2935 4095 +4095 3113 4095 +4095 3275 4095 +4095 3429 4095 +4095 3577 4095 +4095 3721 4095 +4095 3861 4095 +3999 3999 3999 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset new file mode 100644 index 0000000000..66f3b57564 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.azasset @@ -0,0 +1,32780 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [ + 0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [ + 0, 0, 0, + 0, 40, 0, + 0, 176, 0, + 0, 310, 0, + 0, 444, 0, + 0, 578, 0, + 0, 711, 0, + 0, 844, 0, + 0, 976, 0, + 0, 1109, 0, + 0, 1241, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 235, 0, 150, + 0, 22, 0, + 0, 162, 0, + 0, 300, 0, + 0, 437, 0, + 0, 572, 0, + 0, 707, 0, + 0, 841, 0, + 0, 974, 0, + 0, 1107, 0, + 0, 1240, 0, + 0, 1373, 0, + 0, 1505, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 474, 0, 352, + 349, 0, 225, + 98, 143, 0, + 0, 286, 0, + 0, 427, 0, + 0, 565, 0, + 0, 701, 0, + 0, 836, 0, + 0, 971, 0, + 0, 1105, 0, + 0, 1238, 0, + 0, 1371, 0, + 0, 1504, 0, + 0, 1637, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 672, 0, 529, + 595, 0, 448, + 467, 117, 309, + 205, 267, 14, + 0, 412, 0, + 0, 554, 0, + 0, 693, 0, + 0, 831, 0, + 0, 967, 0, + 0, 1102, 0, + 0, 1236, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 848, 0, 693, + 797, 0, 638, + 719, 78, 551, + 588, 240, 402, + 318, 393, 67, + 0, 540, 0, + 0, 683, 0, + 0, 823, 0, + 0, 961, 0, + 0, 1097, 0, + 0, 1233, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1010, 0, 848, + 975, 0, 809, + 924, 22, 751, + 845, 201, 661, + 712, 365, 502, + 435, 520, 130, + 0, 669, 0, + 0, 813, 0, + 0, 953, 0, + 0, 1092, 0, + 0, 1228, 0, + 0, 1364, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1766, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1163, 0, 996, + 1139, 0, 968, + 1104, 0, 928, + 1052, 143, 869, + 972, 326, 775, + 837, 493, 609, + 555, 649, 202, + 0, 798, 0, + 0, 943, 0, + 0, 1084, 0, + 0, 1223, 0, + 0, 1360, 0, + 0, 1496, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1898, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1311, 0, 1139, + 1293, 0, 1119, + 1269, 0, 1091, + 1233, 52, 1050, + 1181, 267, 990, + 1101, 452, 893, + 965, 621, 721, + 678, 778, 283, + 0, 928, 0, + 0, 1073, 0, + 0, 1215, 0, + 0, 1354, 0, + 0, 1491, 0, + 0, 1627, 0, + 0, 1762, 0, + 0, 1897, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1454, 0, 1280, + 1441, 0, 1265, + 1424, 0, 1245, + 1399, 0, 1216, + 1363, 174, 1175, + 1311, 393, 1113, + 1230, 580, 1015, + 1093, 750, 837, + 804, 908, 374, + 0, 1059, 0, + 0, 1204, 0, + 0, 1346, 0, + 0, 1486, 0, + 0, 1623, 0, + 0, 1759, 0, + 0, 1894, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1595, 0, 1418, + 1585, 0, 1407, + 1572, 0, 1393, + 1554, 0, 1372, + 1530, 9, 1343, + 1494, 298, 1301, + 1441, 520, 1239, + 1360, 709, 1139, + 1222, 880, 957, + 931, 1039, 472, + 0, 1190, 0, + 0, 1336, 0, + 0, 1478, 0, + 0, 1617, 0, + 0, 1755, 0, + 0, 1891, 0, + 0, 2026, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1733, 0, 1555, + 1726, 0, 1547, + 1716, 0, 1536, + 1703, 0, 1521, + 1686, 0, 1501, + 1661, 130, 1471, + 1625, 424, 1429, + 1572, 649, 1366, + 1491, 839, 1265, + 1352, 1011, 1080, + 1059, 1170, 577, + 0, 1321, 0, + 0, 1467, 0, + 0, 1610, 0, + 0, 1749, 0, + 0, 1887, 0, + 0, 2023, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1869, 0, 1690, + 1864, 0, 1684, + 1857, 0, 1676, + 1848, 0, 1666, + 1835, 0, 1651, + 1817, 0, 1630, + 1792, 254, 1601, + 1756, 552, 1558, + 1704, 778, 1494, + 1622, 970, 1392, + 1483, 1141, 1205, + 1188, 1301, 687, + 0, 1453, 0, + 0, 1599, 0, + 0, 1741, 0, + 0, 1881, 0, + 0, 2019, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2005, 0, 1825, + 2001, 0, 1821, + 1996, 0, 1815, + 1989, 0, 1807, + 1979, 0, 1796, + 1966, 0, 1781, + 1949, 0, 1760, + 1924, 379, 1731, + 1888, 681, 1688, + 1835, 908, 1624, + 1753, 1100, 1521, + 1614, 1272, 1332, + 1318, 1432, 803, + 0, 1584, 0, + 0, 1731, 0, + 0, 1873, 0, + 0, 2013, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2139, 0, 1959, + 2137, 0, 1956, + 2133, 0, 1951, + 2127, 0, 1945, + 2121, 0, 1937, + 2111, 0, 1927, + 2099, 0, 1912, + 2081, 0, 1891, + 2055, 506, 1861, + 2019, 810, 1818, + 1967, 1038, 1754, + 1885, 1231, 1650, + 1745, 1404, 1460, + 1448, 1564, 922, + 0, 1716, 0, + 0, 1863, 0, + 0, 2005, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2273, 0, 2093, + 2271, 0, 2091, + 2269, 0, 2087, + 2265, 0, 2083, + 2259, 0, 2077, + 2253, 0, 2069, + 2243, 0, 2057, + 2231, 0, 2043, + 2213, 60, 2022, + 2187, 635, 1992, + 2151, 941, 1949, + 2099, 1169, 1884, + 2016, 1363, 1781, + 1877, 1536, 1589, + 1579, 1696, 1044, + 0, 1848, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2225, + 2405, 0, 2223, + 2403, 0, 2221, + 2401, 0, 2219, + 2397, 0, 2213, + 2391, 0, 2207, + 2385, 0, 2199, + 2375, 0, 2189, + 2361, 0, 2173, + 2345, 182, 2153, + 2319, 764, 2123, + 2283, 1071, 2081, + 2231, 1301, 2015, + 2149, 1494, 1911, + 2008, 1667, 1719, + 1710, 1828, 1168, + 0, 1980, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2539, 0, 2359, + 2539, 0, 2357, + 2537, 0, 2355, + 2535, 0, 2353, + 2533, 0, 2349, + 2529, 0, 2345, + 2523, 0, 2339, + 2517, 0, 2331, + 2507, 0, 2321, + 2493, 0, 2305, + 2475, 306, 2285, + 2451, 894, 2255, + 2415, 1202, 2211, + 2363, 1432, 2147, + 2279, 1626, 2042, + 2141, 1799, 1850, + 1842, 1960, 1295, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2491, + 2671, 0, 2491, + 2671, 0, 2489, + 2669, 0, 2487, + 2667, 0, 2485, + 2665, 0, 2481, + 2661, 0, 2477, + 2655, 0, 2471, + 2649, 0, 2463, + 2639, 0, 2453, + 2625, 0, 2437, + 2607, 433, 2415, + 2583, 1025, 2387, + 2547, 1334, 2343, + 2493, 1564, 2279, + 2411, 1758, 2173, + 2273, 1931, 1981, + 1973, 2091, 1423, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2623, + 2805, 0, 2623, + 2803, 0, 2623, + 2803, 0, 2621, + 2801, 0, 2619, + 2799, 0, 2617, + 2797, 0, 2613, + 2793, 0, 2609, + 2787, 0, 2603, + 2781, 0, 2595, + 2771, 0, 2583, + 2757, 0, 2569, + 2741, 560, 2547, + 2715, 1155, 2517, + 2679, 1465, 2475, + 2625, 1696, 2409, + 2543, 1890, 2305, + 2403, 2063, 2111, + 2105, 2223, 1552, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2745, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2715, + 2891, 0, 2701, + 2873, 689, 2679, + 2847, 1287, 2649, + 2811, 1597, 2607, + 2759, 1828, 2541, + 2675, 2022, 2437, + 2535, 2195, 2243, + 2237, 2355, 1681, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2847, + 3023, 0, 2833, + 3005, 819, 2811, + 2979, 1418, 2781, + 2943, 1729, 2739, + 2891, 1959, 2673, + 2807, 2153, 2569, + 2667, 2327, 2375, + 2369, 2487, 1811, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3201, 0, 3017, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2979, + 3155, 0, 2965, + 3137, 949, 2943, + 3111, 1550, 2913, + 3075, 1860, 2871, + 3023, 2091, 2805, + 2939, 2285, 2701, + 2801, 2459, 2507, + 2501, 2619, 1942, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3111, + 3287, 0, 3097, + 3269, 1080, 3075, + 3243, 1682, 3045, + 3207, 1992, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2751, 2073, + 0, 2905, 0, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3243, + 3419, 0, 3229, + 3401, 1211, 3207, + 3375, 1813, 3177, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2205, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3465, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4009, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3375, + 3551, 0, 3361, + 3533, 1342, 3339, + 3507, 1945, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2337, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3735, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3547, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3711, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3507, + 3683, 0, 3493, + 3665, 1474, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2813, 3229, + 3329, 2987, 3035, + 3029, 3149, 2467, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1605, 3603, + 3771, 2209, 3573, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2599, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1737, 3735, + 3903, 2341, 3705, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2731, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1869, 3867, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3015, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2863, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2001, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2995, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 0, 0, 13, + 0, 54, 0, + 0, 186, 0, + 0, 318, 0, + 0, 450, 0, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 258, 0, 216, + 36, 36, 36, + 0, 172, 0, + 0, 308, 0, + 0, 442, 0, + 0, 576, 0, + 0, 710, 0, + 0, 843, 0, + 0, 976, 0, + 0, 1108, 0, + 0, 1241, 0, + 0, 1373, 0, + 0, 1506, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 488, 0, 395, + 367, 11, 282, + 129, 154, 65, + 0, 294, 0, + 0, 432, 0, + 0, 569, 0, + 0, 704, 0, + 0, 839, 0, + 0, 973, 0, + 0, 1106, 0, + 0, 1239, 0, + 0, 1372, 0, + 0, 1505, 0, + 0, 1637, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 681, 0, 560, + 606, 0, 484, + 481, 128, 357, + 230, 275, 101, + 0, 418, 0, + 0, 559, 0, + 0, 697, 0, + 0, 833, 0, + 0, 969, 0, + 0, 1103, 0, + 0, 1237, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 854, 0, 714, + 804, 0, 662, + 727, 91, 580, + 599, 249, 441, + 337, 399, 146, + 0, 544, 0, + 0, 686, 0, + 0, 826, 0, + 0, 963, 0, + 0, 1099, 0, + 0, 1234, 0, + 0, 1368, 0, + 0, 1502, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1015, 0, 863, + 980, 0, 825, + 929, 36, 770, + 851, 210, 683, + 720, 372, 534, + 450, 525, 199, + 0, 672, 0, + 0, 815, 0, + 0, 955, 0, + 0, 1093, 0, + 0, 1229, 0, + 0, 1365, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1167, 0, 1007, + 1142, 0, 980, + 1107, 0, 941, + 1056, 154, 883, + 977, 333, 793, + 844, 498, 634, + 567, 652, 262, + 0, 801, 0, + 0, 945, 0, + 0, 1085, 0, + 0, 1224, 0, + 0, 1361, 0, + 0, 1496, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1313, 0, 1147, + 1296, 0, 1128, + 1271, 0, 1100, + 1236, 65, 1060, + 1184, 275, 1001, + 1104, 458, 907, + 969, 625, 741, + 687, 781, 334, + 0, 930, 0, + 0, 1075, 0, + 0, 1216, 0, + 0, 1355, 0, + 0, 1492, 0, + 0, 1628, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1456, 0, 1286, + 1443, 0, 1271, + 1425, 0, 1251, + 1401, 0, 1223, + 1365, 184, 1182, + 1313, 399, 1122, + 1233, 584, 1025, + 1097, 753, 853, + 810, 910, 416, + 0, 1060, 0, + 0, 1206, 0, + 0, 1347, 0, + 0, 1486, 0, + 0, 1624, 0, + 0, 1760, 0, + 0, 1894, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1596, 0, 1422, + 1586, 0, 1412, + 1574, 0, 1397, + 1556, 0, 1377, + 1531, 23, 1348, + 1495, 306, 1307, + 1443, 525, 1245, + 1362, 712, 1147, + 1225, 882, 969, + 936, 1040, 506, + 0, 1191, 0, + 0, 1337, 0, + 0, 1479, 0, + 0, 1618, 0, + 0, 1755, 0, + 0, 1891, 0, + 0, 2026, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1734, 0, 1558, + 1727, 0, 1550, + 1717, 0, 1539, + 1704, 0, 1525, + 1687, 0, 1504, + 1662, 141, 1475, + 1626, 430, 1434, + 1574, 652, 1371, + 1492, 841, 1271, + 1354, 1012, 1089, + 1063, 1171, 604, + 0, 1322, 0, + 0, 1468, 0, + 0, 1610, 0, + 0, 1750, 0, + 0, 1887, 0, + 0, 2023, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1870, 0, 1693, + 1865, 0, 1687, + 1858, 0, 1679, + 1848, 0, 1668, + 1836, 0, 1653, + 1818, 0, 1633, + 1793, 262, 1604, + 1757, 556, 1561, + 1704, 781, 1498, + 1623, 971, 1397, + 1485, 1142, 1212, + 1191, 1302, 709, + 0, 1453, 0, + 0, 1599, 0, + 0, 1742, 0, + 0, 1881, 0, + 0, 2019, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2005, 0, 1827, + 2001, 0, 1822, + 1996, 0, 1817, + 1989, 0, 1809, + 1980, 0, 1798, + 1967, 0, 1783, + 1949, 0, 1762, + 1924, 386, 1733, + 1888, 684, 1690, + 1836, 910, 1627, + 1754, 1101, 1524, + 1615, 1273, 1337, + 1320, 1433, 819, + 0, 1585, 0, + 0, 1731, 0, + 0, 1874, 0, + 0, 2013, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2139, 0, 1960, + 2137, 0, 1957, + 2133, 0, 1953, + 2127, 0, 1947, + 2121, 0, 1939, + 2111, 0, 1928, + 2099, 0, 1913, + 2081, 0, 1892, + 2055, 511, 1863, + 2020, 813, 1820, + 1967, 1040, 1756, + 1885, 1232, 1653, + 1746, 1405, 1464, + 1450, 1565, 935, + 0, 1717, 0, + 0, 1863, 0, + 0, 2005, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2273, 0, 2093, + 2271, 0, 2091, + 2269, 0, 2087, + 2265, 0, 2083, + 2259, 0, 2077, + 2253, 0, 2069, + 2243, 0, 2059, + 2231, 0, 2044, + 2213, 72, 2023, + 2187, 638, 1993, + 2151, 943, 1950, + 2099, 1171, 1886, + 2017, 1363, 1783, + 1877, 1536, 1592, + 1580, 1696, 1054, + 0, 1848, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2227, + 2405, 0, 2225, + 2403, 0, 2223, + 2401, 0, 2219, + 2397, 0, 2215, + 2391, 0, 2209, + 2385, 0, 2201, + 2375, 0, 2189, + 2363, 0, 2175, + 2345, 192, 2153, + 2319, 767, 2125, + 2283, 1073, 2081, + 2231, 1302, 2017, + 2149, 1495, 1913, + 2009, 1668, 1722, + 1711, 1828, 1176, + 0, 1980, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2539, 0, 2359, + 2539, 0, 2357, + 2537, 0, 2357, + 2535, 0, 2353, + 2533, 0, 2351, + 2529, 0, 2345, + 2523, 0, 2341, + 2517, 0, 2333, + 2507, 0, 2321, + 2495, 0, 2305, + 2477, 314, 2285, + 2451, 896, 2255, + 2415, 1203, 2213, + 2363, 1433, 2147, + 2281, 1626, 2043, + 2141, 1799, 1851, + 1842, 1960, 1301, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2491, + 2671, 0, 2491, + 2671, 0, 2489, + 2669, 0, 2487, + 2667, 0, 2485, + 2665, 0, 2481, + 2661, 0, 2477, + 2655, 0, 2471, + 2649, 0, 2463, + 2639, 0, 2453, + 2627, 0, 2437, + 2609, 438, 2417, + 2583, 1026, 2387, + 2547, 1334, 2343, + 2495, 1564, 2279, + 2413, 1758, 2175, + 2273, 1931, 1982, + 1974, 2091, 1427, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2623, + 2803, 0, 2623, + 2803, 0, 2621, + 2801, 0, 2619, + 2799, 0, 2617, + 2797, 0, 2613, + 2793, 0, 2609, + 2787, 0, 2603, + 2781, 0, 2595, + 2771, 0, 2585, + 2759, 0, 2569, + 2741, 565, 2549, + 2715, 1157, 2519, + 2679, 1466, 2475, + 2627, 1696, 2411, + 2543, 1890, 2305, + 2405, 2063, 2113, + 2105, 2223, 1555, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2745, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2717, + 2891, 0, 2701, + 2873, 693, 2679, + 2847, 1288, 2651, + 2811, 1597, 2607, + 2759, 1828, 2541, + 2675, 2022, 2437, + 2537, 2195, 2243, + 2237, 2355, 1684, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2847, + 3023, 0, 2833, + 3005, 821, 2811, + 2979, 1419, 2781, + 2943, 1729, 2739, + 2891, 1960, 2673, + 2807, 2153, 2569, + 2669, 2327, 2375, + 2369, 2487, 1813, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2979, + 3155, 0, 2965, + 3137, 951, 2943, + 3111, 1550, 2913, + 3075, 1861, 2871, + 3023, 2091, 2805, + 2941, 2285, 2701, + 2801, 2459, 2507, + 2501, 2619, 1944, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3111, + 3287, 0, 3097, + 3269, 1081, 3075, + 3243, 1682, 3045, + 3207, 1993, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2753, 2075, + 0, 2905, 0, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3243, + 3419, 0, 3229, + 3401, 1212, 3207, + 3375, 1814, 3177, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2205, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4009, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3375, + 3551, 0, 3361, + 3533, 1343, 3339, + 3507, 1946, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2337, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3735, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3711, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3507, + 3683, 0, 3493, + 3665, 1474, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2813, 3229, + 3329, 2987, 3035, + 3029, 3149, 2469, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1606, 3603, + 3771, 2209, 3573, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1738, 3735, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2731, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1869, 3867, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3015, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2863, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2001, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2995, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 7, 0, 127, + 0, 71, 0, + 0, 199, 0, + 0, 328, 0, + 0, 457, 0, + 0, 587, 0, + 0, 718, 0, + 0, 849, 0, + 0, 980, 0, + 0, 1112, 0, + 0, 1243, 0, + 0, 1375, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 287, 0, 292, + 83, 54, 145, + 0, 186, 0, + 0, 318, 0, + 0, 450, 0, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 506, 0, 448, + 390, 30, 348, + 168, 168, 168, + 0, 304, 0, + 0, 440, 0, + 0, 574, 0, + 0, 708, 0, + 0, 842, 0, + 0, 975, 0, + 0, 1108, 0, + 0, 1240, 0, + 0, 1373, 0, + 0, 1505, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 693, 0, 597, + 620, 0, 527, + 499, 143, 414, + 261, 286, 197, + 0, 426, 0, + 0, 564, 0, + 0, 701, 0, + 0, 836, 0, + 0, 971, 0, + 0, 1105, 0, + 0, 1238, 0, + 0, 1371, 0, + 0, 1504, 0, + 0, 1637, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 862, 0, 741, + 813, 0, 692, + 738, 107, 616, + 613, 260, 489, + 362, 407, 233, + 0, 550, 0, + 0, 691, 0, + 0, 829, 0, + 0, 965, 0, + 0, 1100, 0, + 0, 1235, 0, + 0, 1369, 0, + 0, 1502, 0, + 0, 1636, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1020, 0, 882, + 986, 0, 846, + 936, 54, 794, + 859, 223, 712, + 731, 381, 573, + 469, 531, 278, + 0, 677, 0, + 0, 818, 0, + 0, 958, 0, + 0, 1095, 0, + 0, 1231, 0, + 0, 1366, 0, + 0, 1500, 0, + 0, 1634, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1171, 0, 1021, + 1146, 0, 995, + 1112, 0, 957, + 1061, 168, 902, + 983, 343, 815, + 852, 504, 666, + 582, 657, 331, + 0, 804, 0, + 0, 947, 0, + 0, 1087, 0, + 0, 1225, 0, + 0, 1362, 0, + 0, 1497, 0, + 0, 1632, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1316, 0, 1158, + 1299, 0, 1139, + 1274, 0, 1112, + 1239, 82, 1073, + 1188, 286, 1015, + 1109, 465, 925, + 976, 630, 766, + 699, 784, 394, + 0, 933, 0, + 0, 1077, 0, + 0, 1217, 0, + 0, 1356, 0, + 0, 1493, 0, + 0, 1628, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1458, 0, 1293, + 1445, 0, 1279, + 1428, 0, 1260, + 1403, 0, 1232, + 1368, 197, 1192, + 1316, 407, 1133, + 1236, 590, 1039, + 1101, 757, 873, + 819, 913, 466, + 0, 1062, 0, + 0, 1207, 0, + 0, 1348, 0, + 0, 1487, 0, + 0, 1624, 0, + 0, 1760, 0, + 0, 1895, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1597, 0, 1428, + 1588, 0, 1418, + 1575, 0, 1403, + 1558, 0, 1383, + 1533, 42, 1355, + 1497, 316, 1315, + 1445, 531, 1254, + 1365, 717, 1157, + 1229, 885, 985, + 943, 1042, 548, + 0, 1192, 0, + 0, 1338, 0, + 0, 1479, 0, + 0, 1618, 0, + 0, 1756, 0, + 0, 1892, 0, + 0, 2027, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1735, 0, 1562, + 1728, 0, 1555, + 1718, 0, 1544, + 1706, 0, 1529, + 1688, 0, 1509, + 1663, 155, 1480, + 1628, 438, 1439, + 1575, 657, 1377, + 1494, 845, 1279, + 1357, 1014, 1101, + 1068, 1172, 638, + 0, 1323, 0, + 0, 1469, 0, + 0, 1611, 0, + 0, 1750, 0, + 0, 1887, 0, + 0, 2023, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1871, 0, 1696, + 1866, 0, 1690, + 1859, 0, 1682, + 1849, 0, 1672, + 1837, 0, 1657, + 1819, 0, 1636, + 1794, 273, 1607, + 1758, 562, 1566, + 1706, 784, 1503, + 1624, 974, 1403, + 1487, 1144, 1221, + 1195, 1303, 736, + 0, 1454, 0, + 0, 1600, 0, + 0, 1742, 0, + 0, 1882, 0, + 0, 2019, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2006, 0, 1829, + 2002, 0, 1825, + 1997, 0, 1819, + 1990, 0, 1811, + 1981, 0, 1800, + 1968, 0, 1785, + 1950, 0, 1765, + 1925, 394, 1736, + 1889, 689, 1694, + 1837, 913, 1630, + 1755, 1103, 1529, + 1617, 1275, 1344, + 1323, 1434, 841, + 0, 1585, 0, + 0, 1732, 0, + 0, 1874, 0, + 0, 2013, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2141, 0, 1962, + 2137, 0, 1959, + 2133, 0, 1955, + 2129, 0, 1949, + 2121, 0, 1941, + 2113, 0, 1930, + 2099, 0, 1915, + 2081, 0, 1894, + 2057, 518, 1865, + 2020, 816, 1822, + 1968, 1042, 1759, + 1886, 1234, 1657, + 1747, 1405, 1470, + 1452, 1565, 952, + 0, 1717, 0, + 0, 1863, 0, + 0, 2006, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2273, 0, 2095, + 2271, 0, 2093, + 2269, 0, 2089, + 2265, 0, 2085, + 2259, 0, 2079, + 2253, 0, 2071, + 2243, 0, 2061, + 2231, 0, 2045, + 2213, 89, 2024, + 2187, 643, 1995, + 2151, 945, 1952, + 2099, 1172, 1888, + 2017, 1364, 1785, + 1878, 1537, 1596, + 1582, 1697, 1067, + 0, 1849, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2227, + 2405, 0, 2225, + 2403, 0, 2223, + 2401, 0, 2219, + 2397, 0, 2215, + 2391, 0, 2209, + 2385, 0, 2201, + 2375, 0, 2191, + 2363, 0, 2175, + 2345, 205, 2155, + 2319, 771, 2125, + 2283, 1074, 2083, + 2231, 1303, 2018, + 2149, 1495, 1915, + 2010, 1668, 1725, + 1713, 1828, 1186, + 0, 1980, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2359, + 2539, 0, 2359, + 2537, 0, 2357, + 2535, 0, 2355, + 2533, 0, 2351, + 2529, 0, 2347, + 2523, 0, 2341, + 2517, 0, 2333, + 2507, 0, 2321, + 2495, 0, 2307, + 2477, 324, 2285, + 2451, 899, 2257, + 2415, 1205, 2213, + 2363, 1434, 2149, + 2281, 1627, 2045, + 2141, 1800, 1854, + 1843, 1960, 1308, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2493, + 2673, 0, 2491, + 2671, 0, 2489, + 2669, 0, 2489, + 2667, 0, 2485, + 2665, 0, 2483, + 2661, 0, 2479, + 2655, 0, 2473, + 2649, 0, 2465, + 2639, 0, 2453, + 2627, 0, 2439, + 2609, 446, 2417, + 2583, 1028, 2387, + 2547, 1335, 2345, + 2495, 1565, 2279, + 2413, 1758, 2175, + 2273, 1932, 1984, + 1975, 2093, 1433, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2623, + 2805, 0, 2623, + 2803, 0, 2621, + 2801, 0, 2619, + 2799, 0, 2617, + 2797, 0, 2615, + 2793, 0, 2609, + 2787, 0, 2603, + 2781, 0, 2595, + 2771, 0, 2585, + 2759, 0, 2569, + 2741, 570, 2549, + 2715, 1158, 2519, + 2679, 1467, 2475, + 2627, 1697, 2411, + 2545, 1890, 2307, + 2405, 2063, 2113, + 2107, 2223, 1559, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2745, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2717, + 2891, 0, 2701, + 2873, 697, 2681, + 2847, 1289, 2651, + 2811, 1598, 2607, + 2759, 1828, 2543, + 2677, 2022, 2437, + 2537, 2195, 2245, + 2237, 2355, 1687, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2849, + 3023, 0, 2833, + 3005, 825, 2811, + 2979, 1420, 2783, + 2943, 1729, 2739, + 2891, 1960, 2673, + 2809, 2153, 2569, + 2669, 2327, 2377, + 2369, 2487, 1816, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 954, 2943, + 3111, 1551, 2913, + 3075, 1861, 2871, + 3023, 2091, 2805, + 2941, 2285, 2701, + 2801, 2459, 2507, + 2501, 2621, 1945, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3111, + 3287, 0, 3097, + 3269, 1083, 3075, + 3243, 1682, 3045, + 3207, 1993, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2753, 2075, + 0, 2905, 0, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3243, + 3419, 0, 3229, + 3401, 1213, 3207, + 3375, 1814, 3177, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2207, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4009, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1344, 3339, + 3507, 1946, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2337, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3711, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1475, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2813, 3229, + 3329, 2987, 3035, + 3029, 3149, 2469, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1606, 3603, + 3771, 2209, 3573, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1738, 3735, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1870, 3869, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2863, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2002, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2995, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 73, 0, 245, + 0, 93, 78, + 0, 216, 0, + 0, 340, 0, + 0, 467, 0, + 0, 595, 0, + 0, 724, 0, + 0, 853, 0, + 0, 984, 0, + 0, 1114, 0, + 0, 1245, 0, + 0, 1377, 0, + 0, 1508, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 324, 0, 378, + 139, 77, 259, + 0, 203, 27, + 0, 331, 0, + 0, 460, 0, + 0, 589, 0, + 0, 719, 0, + 0, 850, 0, + 0, 981, 0, + 0, 1112, 0, + 0, 1244, 0, + 0, 1376, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 528, 0, 510, + 420, 54, 424, + 215, 186, 277, + 0, 318, 0, + 0, 450, 0, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 708, 0, 642, + 638, 21, 580, + 522, 162, 481, + 300, 300, 300, + 0, 437, 0, + 0, 572, 0, + 0, 707, 0, + 0, 841, 0, + 0, 974, 0, + 0, 1107, 0, + 0, 1240, 0, + 0, 1373, 0, + 0, 1505, 0, + 0, 1638, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 873, 0, 775, + 825, 0, 729, + 752, 127, 659, + 631, 275, 546, + 393, 418, 329, + 0, 558, 0, + 0, 696, 0, + 0, 833, 0, + 0, 968, 0, + 0, 1103, 0, + 0, 1237, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1028, 0, 907, + 994, 0, 873, + 945, 77, 824, + 870, 239, 748, + 745, 392, 621, + 494, 539, 365, + 0, 683, 0, + 0, 823, 0, + 0, 961, 0, + 0, 1097, 0, + 0, 1233, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1176, 0, 1039, + 1152, 0, 1014, + 1118, 0, 979, + 1068, 186, 926, + 991, 355, 844, + 863, 513, 705, + 601, 663, 410, + 0, 809, 0, + 0, 951, 0, + 0, 1090, 0, + 0, 1227, 0, + 0, 1363, 0, + 0, 1498, 0, + 0, 1632, 0, + 0, 1766, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1320, 0, 1171, + 1303, 0, 1153, + 1279, 0, 1127, + 1244, 103, 1089, + 1193, 300, 1034, + 1115, 475, 948, + 984, 636, 798, + 714, 789, 463, + 0, 936, 0, + 0, 1079, 0, + 0, 1219, 0, + 0, 1357, 0, + 0, 1494, 0, + 0, 1629, 0, + 0, 1764, 0, + 0, 1898, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1461, 0, 1304, + 1448, 0, 1290, + 1431, 0, 1271, + 1406, 0, 1244, + 1371, 214, 1205, + 1320, 418, 1147, + 1241, 597, 1057, + 1108, 762, 898, + 831, 917, 526, + 0, 1065, 0, + 0, 1209, 0, + 0, 1350, 0, + 0, 1488, 0, + 0, 1625, 0, + 0, 1760, 0, + 0, 1895, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1599, 0, 1436, + 1590, 0, 1426, + 1577, 0, 1411, + 1560, 0, 1392, + 1535, 65, 1364, + 1500, 329, 1324, + 1448, 539, 1265, + 1368, 722, 1171, + 1233, 889, 1005, + 952, 1045, 598, + 0, 1194, 0, + 0, 1339, 0, + 0, 1480, 0, + 0, 1619, 0, + 0, 1756, 0, + 0, 1892, 0, + 0, 2027, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1736, 0, 1568, + 1729, 0, 1560, + 1720, 0, 1550, + 1707, 0, 1535, + 1690, 0, 1515, + 1665, 174, 1487, + 1630, 448, 1447, + 1578, 663, 1386, + 1497, 849, 1289, + 1361, 1017, 1117, + 1074, 1174, 680, + 0, 1325, 0, + 0, 1470, 0, + 0, 1611, 0, + 0, 1751, 0, + 0, 1888, 0, + 0, 2024, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1872, 0, 1700, + 1867, 0, 1694, + 1860, 0, 1687, + 1851, 0, 1676, + 1838, 0, 1661, + 1820, 0, 1641, + 1795, 287, 1613, + 1760, 570, 1571, + 1707, 789, 1510, + 1627, 977, 1411, + 1489, 1146, 1233, + 1200, 1304, 770, + 0, 1455, 0, + 0, 1601, 0, + 0, 1743, 0, + 0, 1882, 0, + 0, 2020, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2007, 0, 1832, + 2003, 0, 1828, + 1998, 0, 1822, + 1991, 0, 1814, + 1982, 0, 1804, + 1969, 0, 1789, + 1951, 0, 1768, + 1926, 405, 1740, + 1890, 694, 1698, + 1838, 916, 1635, + 1757, 1105, 1535, + 1619, 1276, 1354, + 1327, 1435, 868, + 0, 1586, 0, + 0, 1732, 0, + 0, 1874, 0, + 0, 2014, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2141, 0, 1964, + 2137, 0, 1961, + 2135, 0, 1957, + 2129, 0, 1951, + 2123, 0, 1943, + 2113, 0, 1932, + 2099, 0, 1918, + 2083, 6, 1897, + 2057, 526, 1868, + 2021, 821, 1826, + 1969, 1045, 1762, + 1887, 1235, 1661, + 1749, 1407, 1477, + 1455, 1566, 973, + 0, 1718, 0, + 0, 1864, 0, + 0, 2006, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2275, 0, 2097, + 2273, 0, 2095, + 2269, 0, 2091, + 2265, 0, 2087, + 2261, 0, 2081, + 2253, 0, 2073, + 2245, 0, 2063, + 2231, 0, 2047, + 2213, 111, 2026, + 2189, 650, 1997, + 2153, 948, 1955, + 2099, 1174, 1891, + 2018, 1366, 1789, + 1879, 1538, 1602, + 1584, 1697, 1083, + 0, 1849, 0, + 0, 1995, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2229, + 2405, 0, 2227, + 2403, 0, 2225, + 2401, 0, 2221, + 2397, 0, 2217, + 2393, 0, 2211, + 2385, 0, 2203, + 2375, 0, 2193, + 2363, 0, 2177, + 2345, 221, 2157, + 2319, 775, 2127, + 2285, 1077, 2085, + 2231, 1304, 2020, + 2149, 1496, 1917, + 2010, 1669, 1729, + 1714, 1829, 1199, + 0, 1981, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2361, + 2539, 0, 2359, + 2537, 0, 2357, + 2535, 0, 2355, + 2533, 0, 2353, + 2529, 0, 2347, + 2523, 0, 2341, + 2517, 0, 2333, + 2507, 0, 2323, + 2495, 0, 2307, + 2477, 337, 2287, + 2451, 903, 2257, + 2415, 1207, 2215, + 2363, 1435, 2151, + 2281, 1628, 2047, + 2141, 1800, 1857, + 1845, 1961, 1318, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2493, + 2673, 0, 2493, + 2671, 0, 2491, + 2669, 0, 2489, + 2667, 0, 2487, + 2665, 0, 2483, + 2661, 0, 2479, + 2655, 0, 2473, + 2649, 0, 2465, + 2639, 0, 2453, + 2627, 0, 2439, + 2609, 456, 2417, + 2583, 1031, 2389, + 2547, 1337, 2345, + 2495, 1566, 2281, + 2413, 1759, 2177, + 2273, 1932, 1986, + 1976, 2093, 1440, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2625, + 2805, 0, 2623, + 2803, 0, 2623, + 2801, 0, 2621, + 2799, 0, 2617, + 2797, 0, 2615, + 2793, 0, 2611, + 2787, 0, 2605, + 2781, 0, 2597, + 2771, 0, 2585, + 2759, 0, 2571, + 2741, 578, 2549, + 2715, 1160, 2519, + 2679, 1468, 2477, + 2627, 1697, 2411, + 2545, 1891, 2307, + 2405, 2063, 2115, + 2107, 2225, 1565, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2755, + 2937, 0, 2755, + 2935, 0, 2753, + 2933, 0, 2751, + 2931, 0, 2749, + 2929, 0, 2747, + 2925, 0, 2741, + 2919, 0, 2735, + 2913, 0, 2727, + 2903, 0, 2717, + 2891, 0, 2701, + 2873, 703, 2681, + 2847, 1290, 2651, + 2811, 1599, 2607, + 2759, 1829, 2543, + 2677, 2022, 2439, + 2537, 2195, 2247, + 2239, 2357, 1691, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2877, + 3057, 0, 2873, + 3051, 0, 2867, + 3045, 0, 2859, + 3035, 0, 2849, + 3023, 0, 2833, + 3005, 829, 2813, + 2979, 1421, 2783, + 2943, 1730, 2739, + 2891, 1960, 2675, + 2809, 2155, 2569, + 2669, 2327, 2377, + 2369, 2489, 1819, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3009, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 957, 2945, + 3111, 1552, 2915, + 3075, 1862, 2871, + 3023, 2093, 2807, + 2941, 2285, 2701, + 2801, 2459, 2509, + 2501, 2621, 1948, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3113, + 3287, 0, 3097, + 3269, 1085, 3075, + 3243, 1683, 3047, + 3207, 1993, 3003, + 3155, 2223, 2937, + 3073, 2417, 2833, + 2933, 2591, 2639, + 2633, 2753, 2077, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1215, 3207, + 3375, 1815, 3179, + 3339, 2125, 3135, + 3287, 2355, 3069, + 3205, 2549, 2965, + 3065, 2723, 2771, + 2765, 2885, 2207, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1345, 3339, + 3507, 1946, 3309, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2681, 3097, + 3197, 2855, 2903, + 2897, 3017, 2339, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1476, 3471, + 3639, 2077, 3441, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2469, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1607, 3603, + 3771, 2209, 3575, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1739, 3735, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2883, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1870, 3869, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2865, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2002, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3127, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3259, + 148, 10, 366, + 0, 122, 244, + 0, 237, 2, + 0, 357, 0, + 0, 479, 0, + 0, 604, 0, + 0, 731, 0, + 0, 859, 0, + 0, 988, 0, + 0, 1117, 0, + 0, 1247, 0, + 0, 1378, 0, + 0, 1509, 0, + 0, 1641, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 369, 0, 471, + 205, 106, 377, + 0, 225, 210, + 0, 348, 0, + 0, 473, 0, + 0, 599, 0, + 0, 727, 0, + 0, 856, 0, + 0, 985, 0, + 0, 1115, 0, + 0, 1246, 0, + 0, 1377, 0, + 0, 1509, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 558, 0, 582, + 456, 85, 510, + 271, 209, 391, + 0, 335, 159, + 0, 463, 0, + 0, 592, 0, + 0, 721, 0, + 0, 852, 0, + 0, 982, 0, + 0, 1113, 0, + 0, 1245, 0, + 0, 1376, 0, + 0, 1508, 0, + 0, 1640, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 728, 0, 697, + 661, 54, 642, + 552, 186, 556, + 347, 318, 409, + 0, 450, 82, + 0, 582, 0, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 887, 0, 816, + 840, 10, 775, + 770, 153, 712, + 654, 294, 613, + 432, 432, 432, + 0, 569, 0, + 0, 704, 0, + 0, 839, 0, + 0, 973, 0, + 0, 1106, 0, + 0, 1239, 0, + 0, 1372, 0, + 0, 1505, 0, + 0, 1637, 0, + 0, 1770, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1037, 0, 938, + 1005, 0, 907, + 957, 106, 861, + 884, 259, 792, + 763, 407, 678, + 525, 550, 461, + 0, 690, 0, + 0, 829, 0, + 0, 965, 0, + 0, 1100, 0, + 0, 1235, 0, + 0, 1369, 0, + 0, 1502, 0, + 0, 1636, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1183, 0, 1063, + 1160, 0, 1039, + 1126, 33, 1005, + 1077, 209, 956, + 1002, 371, 880, + 877, 524, 753, + 626, 672, 498, + 0, 815, 0, + 0, 955, 0, + 0, 1093, 0, + 0, 1229, 0, + 0, 1365, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1325, 0, 1189, + 1308, 0, 1171, + 1284, 0, 1146, + 1250, 131, 1110, + 1200, 318, 1058, + 1123, 487, 976, + 995, 645, 837, + 734, 795, 542, + 0, 941, 0, + 0, 1082, 0, + 0, 1222, 0, + 0, 1359, 0, + 0, 1495, 0, + 0, 1630, 0, + 0, 1764, 0, + 0, 1898, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1465, 0, 1317, + 1452, 0, 1304, + 1435, 0, 1285, + 1411, 0, 1259, + 1376, 236, 1221, + 1325, 432, 1166, + 1247, 607, 1079, + 1116, 768, 930, + 846, 921, 595, + 0, 1068, 0, + 0, 1211, 0, + 0, 1351, 0, + 0, 1489, 0, + 0, 1626, 0, + 0, 1761, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1602, 0, 1446, + 1593, 0, 1436, + 1580, 0, 1422, + 1563, 0, 1403, + 1538, 95, 1376, + 1504, 346, 1337, + 1452, 550, 1279, + 1373, 729, 1189, + 1240, 894, 1030, + 963, 1048, 658, + 0, 1197, 0, + 0, 1341, 0, + 0, 1482, 0, + 0, 1620, 0, + 0, 1757, 0, + 0, 1893, 0, + 0, 2027, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1738, 0, 1575, + 1732, 0, 1568, + 1722, 0, 1558, + 1710, 0, 1544, + 1692, 0, 1524, + 1667, 198, 1496, + 1632, 461, 1456, + 1580, 671, 1397, + 1501, 854, 1303, + 1366, 1021, 1137, + 1083, 1177, 730, + 0, 1327, 0, + 0, 1471, 0, + 0, 1612, 0, + 0, 1751, 0, + 0, 1888, 0, + 0, 2024, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1873, 0, 1706, + 1868, 0, 1700, + 1862, 0, 1692, + 1852, 0, 1682, + 1839, 0, 1668, + 1822, 0, 1648, + 1797, 306, 1619, + 1762, 580, 1579, + 1710, 795, 1518, + 1629, 981, 1422, + 1493, 1149, 1249, + 1207, 1307, 812, + 0, 1457, 0, + 0, 1602, 0, + 0, 1744, 0, + 0, 1883, 0, + 0, 2020, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2008, 0, 1837, + 2004, 0, 1832, + 1999, 0, 1827, + 1992, 0, 1819, + 1983, 0, 1808, + 1970, 0, 1794, + 1952, 0, 1773, + 1927, 419, 1745, + 1892, 702, 1703, + 1840, 921, 1642, + 1759, 1109, 1543, + 1621, 1278, 1366, + 1332, 1437, 902, + 0, 1587, 0, + 0, 1733, 0, + 0, 1875, 0, + 0, 2014, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2141, 0, 1968, + 2139, 0, 1964, + 2135, 0, 1960, + 2129, 0, 1954, + 2123, 0, 1947, + 2113, 0, 1936, + 2101, 0, 1921, + 2083, 39, 1901, + 2059, 537, 1872, + 2022, 826, 1830, + 1970, 1048, 1767, + 1889, 1238, 1667, + 1751, 1408, 1486, + 1459, 1567, 1000, + 0, 1718, 0, + 0, 1864, 0, + 0, 2006, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2275, 0, 2099, + 2273, 0, 2097, + 2271, 0, 2093, + 2267, 0, 2089, + 2261, 0, 2083, + 2255, 0, 2075, + 2245, 0, 2065, + 2231, 0, 2049, + 2215, 138, 2029, + 2189, 658, 2000, + 2153, 953, 1958, + 2101, 1177, 1895, + 2019, 1367, 1793, + 1881, 1539, 1609, + 1587, 1698, 1105, + 0, 1850, 0, + 0, 1996, 0, + 0, 2139, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2407, 0, 2231, + 2407, 0, 2229, + 2405, 0, 2227, + 2401, 0, 2223, + 2397, 0, 2219, + 2393, 0, 2213, + 2385, 0, 2205, + 2377, 0, 2195, + 2363, 0, 2179, + 2345, 243, 2159, + 2321, 782, 2129, + 2285, 1080, 2087, + 2233, 1306, 2023, + 2151, 1498, 1921, + 2012, 1670, 1734, + 1716, 1830, 1216, + 0, 1981, 0, + 0, 2127, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2363, + 2539, 0, 2361, + 2539, 0, 2359, + 2535, 0, 2357, + 2533, 0, 2353, + 2529, 0, 2349, + 2525, 0, 2343, + 2517, 0, 2335, + 2507, 0, 2325, + 2495, 0, 2309, + 2477, 353, 2289, + 2453, 908, 2259, + 2417, 1209, 2217, + 2363, 1436, 2153, + 2281, 1629, 2049, + 2143, 1801, 1861, + 1846, 1961, 1331, + 0, 2113, 0, + 0, 2259, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2493, + 2673, 0, 2493, + 2671, 0, 2491, + 2669, 0, 2489, + 2667, 0, 2487, + 2665, 0, 2485, + 2661, 0, 2479, + 2657, 0, 2475, + 2649, 0, 2465, + 2639, 0, 2455, + 2627, 0, 2441, + 2609, 469, 2419, + 2583, 1035, 2389, + 2547, 1339, 2347, + 2495, 1567, 2283, + 2413, 1760, 2179, + 2273, 1932, 1989, + 1977, 2093, 1450, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2805, 0, 2625, + 2805, 0, 2625, + 2805, 0, 2625, + 2803, 0, 2623, + 2801, 0, 2621, + 2799, 0, 2619, + 2797, 0, 2615, + 2793, 0, 2611, + 2787, 0, 2605, + 2781, 0, 2597, + 2771, 0, 2587, + 2759, 0, 2571, + 2741, 588, 2551, + 2715, 1163, 2521, + 2679, 1469, 2477, + 2627, 1698, 2413, + 2545, 1891, 2309, + 2405, 2065, 2117, + 2107, 2225, 1572, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2757, + 2937, 0, 2755, + 2935, 0, 2755, + 2933, 0, 2753, + 2931, 0, 2749, + 2929, 0, 2747, + 2925, 0, 2743, + 2919, 0, 2737, + 2913, 0, 2729, + 2903, 0, 2717, + 2891, 0, 2703, + 2873, 710, 2681, + 2847, 1292, 2651, + 2811, 1600, 2609, + 2759, 1829, 2543, + 2677, 2023, 2439, + 2537, 2195, 2247, + 2239, 2357, 1697, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2889, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3067, 0, 2885, + 3065, 0, 2883, + 3063, 0, 2881, + 3061, 0, 2879, + 3057, 0, 2873, + 3051, 0, 2869, + 3045, 0, 2859, + 3035, 0, 2849, + 3023, 0, 2833, + 3005, 835, 2813, + 2979, 1422, 2783, + 2943, 1731, 2739, + 2891, 1961, 2675, + 2809, 2155, 2571, + 2669, 2327, 2379, + 2371, 2489, 1823, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3021, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3015, + 3195, 0, 3013, + 3193, 0, 3011, + 3189, 0, 3005, + 3183, 0, 2999, + 3177, 0, 2991, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 961, 2945, + 3111, 1553, 2915, + 3075, 1862, 2871, + 3023, 2093, 2807, + 2941, 2287, 2703, + 2801, 2459, 2509, + 2501, 2621, 1951, + 0, 2773, 0, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3141, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3113, + 3287, 0, 3097, + 3269, 1089, 3077, + 3243, 1684, 3047, + 3207, 1994, 3003, + 3155, 2225, 2939, + 3073, 2419, 2833, + 2933, 2591, 2641, + 2633, 2753, 2081, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1218, 3209, + 3375, 1815, 3179, + 3339, 2125, 3135, + 3287, 2357, 3069, + 3205, 2551, 2965, + 3065, 2723, 2771, + 2765, 2885, 2209, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3579, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1347, 3339, + 3507, 1947, 3311, + 3471, 2257, 3267, + 3419, 2487, 3201, + 3337, 2683, 3097, + 3197, 2855, 2903, + 2897, 3017, 2339, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1478, 3471, + 3639, 2079, 3443, + 3603, 2389, 3399, + 3551, 2619, 3333, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2471, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1608, 3603, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2751, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2601, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3987, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1739, 3737, + 3903, 2341, 3707, + 3867, 2653, 3663, + 3815, 2885, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1871, 3869, + 4035, 2473, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2865, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2002, 4001, + 4095, 2605, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3515, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2133, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2265, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 232, 55, 490, + 0, 157, 400, + 0, 265, 243, + 0, 378, 0, + 0, 496, 0, + 0, 617, 0, + 0, 740, 0, + 0, 866, 0, + 0, 993, 0, + 0, 1121, 0, + 0, 1251, 0, + 0, 1381, 0, + 0, 1511, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1905, 0, + 0, 2036, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 422, 37, 572, + 280, 142, 498, + 0, 254, 376, + 0, 369, 134, + 0, 489, 0, + 0, 611, 0, + 0, 736, 0, + 0, 863, 0, + 0, 991, 0, + 0, 1120, 0, + 0, 1249, 0, + 0, 1380, 0, + 0, 1510, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 594, 12, 663, + 501, 123, 603, + 337, 238, 509, + 0, 358, 342, + 0, 480, 0, + 0, 605, 0, + 0, 731, 0, + 0, 859, 0, + 0, 988, 0, + 0, 1117, 0, + 0, 1248, 0, + 0, 1378, 0, + 0, 1509, 0, + 0, 1641, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 753, 0, 761, + 690, 95, 714, + 588, 217, 642, + 403, 341, 523, + 0, 467, 291, + 0, 595, 0, + 0, 724, 0, + 0, 853, 0, + 0, 984, 0, + 0, 1114, 0, + 0, 1245, 0, + 0, 1377, 0, + 0, 1508, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 905, 0, 866, + 860, 54, 829, + 793, 186, 774, + 684, 318, 689, + 479, 450, 541, + 0, 582, 214, + 0, 714, 0, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1050, 0, 977, + 1019, 0, 948, + 972, 142, 907, + 902, 286, 844, + 786, 426, 745, + 564, 564, 564, + 0, 701, 84, + 0, 836, 0, + 0, 971, 0, + 0, 1105, 0, + 0, 1238, 0, + 0, 1371, 0, + 0, 1504, 0, + 0, 1637, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1193, 0, 1093, + 1170, 0, 1070, + 1137, 76, 1039, + 1089, 238, 993, + 1016, 392, 924, + 895, 539, 810, + 658, 682, 593, + 0, 823, 0, + 0, 961, 0, + 0, 1097, 0, + 0, 1232, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1635, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1332, 0, 1212, + 1315, 0, 1195, + 1292, 0, 1171, + 1258, 165, 1137, + 1209, 341, 1088, + 1134, 503, 1012, + 1009, 656, 885, + 758, 804, 630, + 0, 947, 0, + 0, 1087, 0, + 0, 1225, 0, + 0, 1361, 0, + 0, 1497, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1470, 0, 1334, + 1457, 0, 1321, + 1440, 0, 1303, + 1416, 46, 1278, + 1382, 263, 1243, + 1332, 450, 1190, + 1255, 619, 1108, + 1127, 777, 970, + 866, 928, 674, + 0, 1073, 0, + 0, 1215, 0, + 0, 1354, 0, + 0, 1491, 0, + 0, 1627, 0, + 0, 1762, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1606, 0, 1459, + 1597, 0, 1449, + 1584, 0, 1436, + 1567, 0, 1417, + 1543, 132, 1391, + 1508, 368, 1354, + 1458, 564, 1298, + 1379, 739, 1212, + 1248, 900, 1062, + 978, 1053, 727, + 0, 1200, 0, + 0, 1343, 0, + 0, 1484, 0, + 0, 1622, 0, + 0, 1758, 0, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1741, 0, 1585, + 1734, 0, 1578, + 1725, 0, 1568, + 1713, 0, 1554, + 1695, 0, 1535, + 1671, 227, 1508, + 1636, 478, 1469, + 1584, 682, 1412, + 1505, 861, 1321, + 1372, 1026, 1162, + 1095, 1181, 790, + 0, 1329, 0, + 0, 1473, 0, + 0, 1614, 0, + 0, 1752, 0, + 0, 1889, 0, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1876, 0, 1713, + 1871, 0, 1708, + 1864, 0, 1700, + 1854, 0, 1690, + 1842, 0, 1676, + 1824, 0, 1656, + 1799, 330, 1628, + 1764, 593, 1589, + 1713, 803, 1529, + 1633, 986, 1435, + 1498, 1153, 1269, + 1216, 1309, 862, + 0, 1459, 0, + 0, 1603, 0, + 0, 1745, 0, + 0, 1883, 0, + 0, 2021, 0, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2009, 0, 1842, + 2006, 0, 1838, + 2001, 0, 1832, + 1994, 0, 1825, + 1984, 0, 1814, + 1972, 0, 1800, + 1954, 0, 1780, + 1929, 438, 1752, + 1894, 712, 1711, + 1842, 927, 1650, + 1761, 1113, 1554, + 1625, 1281, 1381, + 1339, 1439, 944, + 0, 1589, 0, + 0, 1734, 0, + 0, 1876, 0, + 0, 2015, 0, + 0, 2153, 0, + 0, 2289, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2143, 0, 1972, + 2139, 0, 1969, + 2137, 0, 1964, + 2131, 0, 1959, + 2125, 0, 1951, + 2115, 0, 1940, + 2103, 0, 1926, + 2085, 81, 1905, + 2059, 551, 1877, + 2024, 834, 1836, + 1972, 1053, 1774, + 1891, 1241, 1675, + 1754, 1410, 1498, + 1464, 1569, 1034, + 0, 1720, 0, + 0, 1865, 0, + 0, 2007, 0, + 0, 2147, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2275, 0, 2103, + 2273, 0, 2099, + 2271, 0, 2097, + 2267, 0, 2093, + 2263, 0, 2087, + 2255, 0, 2079, + 2245, 0, 2067, + 2233, 0, 2053, + 2215, 172, 2033, + 2191, 669, 2004, + 2155, 959, 1962, + 2103, 1180, 1899, + 2021, 1370, 1799, + 1883, 1540, 1618, + 1591, 1699, 1132, + 0, 1851, 0, + 0, 1996, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2409, 0, 2233, + 2407, 0, 2231, + 2405, 0, 2229, + 2403, 0, 2225, + 2399, 0, 2221, + 2393, 0, 2215, + 2387, 0, 2207, + 2377, 0, 2197, + 2365, 0, 2181, + 2347, 270, 2161, + 2321, 790, 2133, + 2285, 1085, 2089, + 2233, 1309, 2027, + 2151, 1500, 1925, + 2013, 1671, 1741, + 1719, 1830, 1237, + 0, 1982, 0, + 0, 2127, 0, + 0, 2271, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2363, + 2541, 0, 2363, + 2539, 0, 2361, + 2537, 0, 2359, + 2533, 0, 2355, + 2529, 0, 2351, + 2525, 0, 2345, + 2517, 0, 2337, + 2509, 0, 2327, + 2495, 0, 2311, + 2477, 375, 2291, + 2453, 914, 2261, + 2417, 1212, 2219, + 2365, 1438, 2155, + 2283, 1630, 2053, + 2143, 1802, 1866, + 1849, 1962, 1348, + 0, 2113, 0, + 0, 2259, 0, + 0, 2403, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2673, 0, 2495, + 2673, 0, 2495, + 2671, 0, 2493, + 2671, 0, 2491, + 2669, 0, 2489, + 2665, 0, 2485, + 2661, 0, 2481, + 2657, 0, 2475, + 2649, 0, 2467, + 2641, 0, 2457, + 2627, 0, 2441, + 2609, 485, 2421, + 2585, 1039, 2391, + 2549, 1341, 2349, + 2495, 1569, 2285, + 2413, 1761, 2181, + 2275, 1933, 1993, + 1978, 2093, 1463, + 0, 2245, 0, + 0, 2391, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2627, + 2805, 0, 2627, + 2805, 0, 2625, + 2803, 0, 2623, + 2801, 0, 2623, + 2799, 0, 2619, + 2797, 0, 2617, + 2793, 0, 2613, + 2789, 0, 2607, + 2781, 0, 2599, + 2771, 0, 2587, + 2759, 0, 2573, + 2741, 601, 2551, + 2715, 1167, 2521, + 2681, 1471, 2479, + 2627, 1699, 2415, + 2545, 1892, 2311, + 2405, 2065, 2121, + 2109, 2225, 1582, + 0, 2377, 0, + 0, 2523, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2759, + 2939, 0, 2759, + 2937, 0, 2757, + 2937, 0, 2757, + 2935, 0, 2755, + 2933, 0, 2753, + 2931, 0, 2751, + 2929, 0, 2747, + 2925, 0, 2743, + 2919, 0, 2737, + 2913, 0, 2729, + 2903, 0, 2719, + 2891, 0, 2703, + 2873, 720, 2683, + 2847, 1295, 2653, + 2811, 1601, 2609, + 2759, 1830, 2545, + 2677, 2023, 2441, + 2537, 2197, 2251, + 2239, 2357, 1705, + 0, 2509, 0, + 0, 2655, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2891, + 3071, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2889, + 3069, 0, 2887, + 3067, 0, 2887, + 3065, 0, 2885, + 3063, 0, 2883, + 3061, 0, 2879, + 3057, 0, 2875, + 3051, 0, 2869, + 3045, 0, 2861, + 3035, 0, 2849, + 3023, 0, 2835, + 3005, 842, 2813, + 2979, 1425, 2783, + 2943, 1732, 2741, + 2891, 1961, 2675, + 2809, 2155, 2571, + 2669, 2327, 2379, + 2371, 2489, 1829, + 0, 2641, 0, + 0, 2787, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3023, + 3203, 0, 3021, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3199, 0, 3017, + 3197, 0, 3017, + 3195, 0, 3013, + 3193, 0, 3011, + 3189, 0, 3007, + 3183, 0, 3001, + 3177, 0, 2993, + 3167, 0, 2981, + 3155, 0, 2965, + 3137, 967, 2945, + 3111, 1555, 2915, + 3075, 1863, 2873, + 3023, 2093, 2807, + 2941, 2287, 2703, + 2801, 2459, 2511, + 2503, 2621, 1956, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3153, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3333, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3327, 0, 3145, + 3325, 0, 3143, + 3321, 0, 3137, + 3315, 0, 3131, + 3309, 0, 3123, + 3299, 0, 3113, + 3287, 0, 3097, + 3269, 1093, 3077, + 3243, 1685, 3047, + 3207, 1994, 3003, + 3155, 2225, 2939, + 3073, 2419, 2835, + 2933, 2591, 2641, + 2635, 2753, 2083, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3273, + 3453, 0, 3269, + 3447, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1221, 3209, + 3375, 1816, 3179, + 3339, 2125, 3135, + 3287, 2357, 3071, + 3205, 2551, 2965, + 3065, 2723, 2773, + 2765, 2885, 2213, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3405, + 3585, 0, 3401, + 3581, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1350, 3341, + 3507, 1947, 3311, + 3471, 2257, 3267, + 3419, 2489, 3203, + 3337, 2683, 3097, + 3197, 2855, 2903, + 2897, 3017, 2341, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1479, 3473, + 3639, 2079, 3443, + 3603, 2389, 3399, + 3551, 2621, 3333, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2473, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1610, 3605, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2753, 3465, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2603, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1740, 3737, + 3903, 2343, 3707, + 3867, 2653, 3663, + 3815, 2885, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2733, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4091, 0, 3905, + 4079, 0, 3889, + 4061, 1872, 3869, + 4035, 2475, 3839, + 3999, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2865, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2003, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2135, 4095, + 4095, 2737, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2869, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 325, 108, 616, + 140, 200, 549, + 0, 299, 442, + 0, 405, 242, + 0, 517, 0, + 0, 633, 0, + 0, 753, 0, + 0, 875, 0, + 0, 1000, 0, + 0, 1127, 0, + 0, 1255, 0, + 0, 1384, 0, + 0, 1513, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 486, 92, 679, + 364, 187, 622, + 125, 289, 532, + 0, 397, 375, + 0, 510, 9, + 0, 628, 0, + 0, 749, 0, + 0, 872, 0, + 0, 998, 0, + 0, 1125, 0, + 0, 1253, 0, + 0, 1383, 0, + 0, 1513, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 638, 70, 752, + 554, 169, 704, + 412, 274, 630, + 103, 386, 508, + 0, 502, 267, + 0, 621, 0, + 0, 744, 0, + 0, 868, 0, + 0, 995, 0, + 0, 1123, 0, + 0, 1252, 0, + 0, 1381, 0, + 0, 1512, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 785, 38, 835, + 726, 144, 795, + 633, 255, 735, + 469, 370, 641, + 73, 490, 474, + 0, 612, 63, + 0, 737, 0, + 0, 863, 0, + 0, 991, 0, + 0, 1120, 0, + 0, 1249, 0, + 0, 1380, 0, + 0, 1510, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1905, 0, + 0, 2036, 0, + 0, 2169, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 927, 0, 926, + 885, 108, 893, + 822, 227, 846, + 720, 349, 774, + 535, 473, 655, + 29, 599, 424, + 0, 727, 0, + 0, 856, 0, + 0, 986, 0, + 0, 1116, 0, + 0, 1246, 0, + 0, 1377, 0, + 0, 1509, 0, + 0, 1640, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1067, 0, 1024, + 1036, 55, 998, + 992, 187, 961, + 925, 318, 906, + 816, 450, 821, + 611, 582, 673, + 0, 714, 346, + 0, 846, 0, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1205, 0, 1129, + 1182, 0, 1109, + 1151, 127, 1080, + 1104, 274, 1039, + 1034, 418, 976, + 919, 558, 877, + 696, 696, 696, + 0, 833, 216, + 0, 968, 0, + 0, 1103, 0, + 0, 1237, 0, + 0, 1370, 0, + 0, 1503, 0, + 0, 1636, 0, + 0, 1769, 0, + 0, 1902, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1341, 0, 1241, + 1325, 0, 1225, + 1302, 31, 1202, + 1269, 208, 1171, + 1221, 370, 1125, + 1148, 524, 1056, + 1027, 671, 942, + 790, 814, 725, + 0, 955, 0, + 0, 1093, 0, + 0, 1229, 0, + 0, 1365, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1477, 0, 1356, + 1464, 0, 1344, + 1447, 0, 1327, + 1424, 100, 1303, + 1390, 297, 1269, + 1341, 473, 1220, + 1266, 635, 1144, + 1141, 788, 1017, + 891, 936, 762, + 0, 1079, 0, + 0, 1219, 0, + 0, 1357, 0, + 0, 1494, 0, + 0, 1629, 0, + 0, 1764, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1611, 0, 1476, + 1602, 0, 1466, + 1590, 0, 1453, + 1572, 0, 1436, + 1549, 178, 1411, + 1514, 395, 1375, + 1464, 582, 1322, + 1388, 751, 1240, + 1259, 909, 1101, + 998, 1059, 806, + 0, 1205, 0, + 0, 1347, 0, + 0, 1486, 0, + 0, 1623, 0, + 0, 1759, 0, + 0, 1894, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1745, 0, 1598, + 1738, 0, 1591, + 1729, 0, 1581, + 1716, 0, 1568, + 1699, 0, 1549, + 1675, 264, 1523, + 1640, 500, 1486, + 1590, 696, 1430, + 1511, 871, 1344, + 1380, 1032, 1194, + 1110, 1185, 859, + 0, 1332, 0, + 0, 1476, 0, + 0, 1616, 0, + 0, 1754, 0, + 0, 1890, 0, + 0, 2025, 0, + 0, 2161, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1878, 0, 1723, + 1873, 0, 1717, + 1867, 0, 1710, + 1857, 0, 1700, + 1845, 0, 1686, + 1827, 0, 1667, + 1803, 359, 1640, + 1768, 610, 1601, + 1717, 814, 1544, + 1637, 994, 1453, + 1504, 1158, 1294, + 1227, 1313, 922, + 0, 1461, 0, + 0, 1605, 0, + 0, 1746, 0, + 0, 1884, 0, + 0, 2021, 0, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2011, 0, 1849, + 2008, 0, 1845, + 2003, 0, 1840, + 1996, 0, 1832, + 1987, 0, 1822, + 1974, 0, 1808, + 1956, 59, 1788, + 1932, 462, 1761, + 1896, 725, 1721, + 1845, 936, 1661, + 1765, 1118, 1568, + 1630, 1285, 1401, + 1348, 1441, 994, + 0, 1591, 0, + 0, 1735, 0, + 0, 1877, 0, + 0, 2016, 0, + 0, 2153, 0, + 0, 2289, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2145, 0, 1977, + 2141, 0, 1974, + 2137, 0, 1970, + 2133, 0, 1964, + 2125, 0, 1957, + 2117, 0, 1946, + 2103, 0, 1932, + 2087, 132, 1912, + 2061, 570, 1884, + 2026, 844, 1843, + 1974, 1059, 1782, + 1893, 1245, 1686, + 1757, 1413, 1513, + 1471, 1571, 1076, + 0, 1721, 0, + 0, 1866, 0, + 0, 2008, 0, + 0, 2147, 0, + 0, 2285, 0, + 0, 2421, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2277, 0, 2107, + 2275, 0, 2103, + 2273, 0, 2101, + 2269, 0, 2097, + 2263, 0, 2091, + 2257, 0, 2083, + 2247, 0, 2073, + 2235, 0, 2057, + 2217, 213, 2038, + 2191, 684, 2009, + 2157, 966, 1968, + 2103, 1185, 1906, + 2023, 1373, 1807, + 1886, 1543, 1630, + 1596, 1701, 1166, + 0, 1852, 0, + 0, 1997, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2409, 0, 2235, + 2407, 0, 2235, + 2405, 0, 2231, + 2403, 0, 2229, + 2399, 0, 2225, + 2395, 0, 2219, + 2387, 0, 2211, + 2377, 0, 2201, + 2365, 0, 2185, + 2347, 304, 2165, + 2323, 801, 2135, + 2287, 1090, 2095, + 2235, 1313, 2032, + 2153, 1502, 1932, + 2015, 1673, 1750, + 1723, 1831, 1264, + 0, 1983, 0, + 0, 2129, 0, + 0, 2271, 0, + 0, 2411, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2541, 0, 2367, + 2541, 0, 2365, + 2539, 0, 2363, + 2537, 0, 2361, + 2535, 0, 2357, + 2531, 0, 2353, + 2525, 0, 2347, + 2519, 0, 2339, + 2509, 0, 2329, + 2497, 0, 2313, + 2479, 402, 2293, + 2453, 922, 2265, + 2417, 1217, 2223, + 2365, 1441, 2159, + 2283, 1632, 2057, + 2145, 1803, 1873, + 1851, 1962, 1369, + 0, 2115, 0, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2675, 0, 2497, + 2673, 0, 2497, + 2673, 0, 2495, + 2671, 0, 2493, + 2669, 0, 2491, + 2665, 0, 2487, + 2661, 0, 2483, + 2657, 0, 2477, + 2649, 0, 2469, + 2641, 0, 2459, + 2627, 0, 2443, + 2609, 507, 2423, + 2585, 1046, 2393, + 2549, 1345, 2351, + 2497, 1571, 2287, + 2415, 1762, 2185, + 2275, 1934, 1998, + 1981, 2093, 1480, + 0, 2245, 0, + 0, 2391, 0, + 0, 2535, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2629, + 2805, 0, 2627, + 2805, 0, 2627, + 2803, 0, 2625, + 2803, 0, 2623, + 2801, 0, 2621, + 2797, 0, 2617, + 2793, 0, 2613, + 2789, 0, 2607, + 2781, 0, 2599, + 2773, 0, 2589, + 2759, 0, 2573, + 2741, 617, 2553, + 2717, 1172, 2523, + 2681, 1473, 2481, + 2627, 1701, 2417, + 2545, 1893, 2313, + 2407, 2065, 2125, + 2111, 2225, 1595, + 0, 2377, 0, + 0, 2523, 0, + 0, 2667, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2759, + 2939, 0, 2759, + 2937, 0, 2759, + 2937, 0, 2757, + 2935, 0, 2755, + 2935, 0, 2755, + 2931, 0, 2751, + 2929, 0, 2749, + 2925, 0, 2745, + 2921, 0, 2739, + 2913, 0, 2731, + 2903, 0, 2719, + 2891, 0, 2705, + 2873, 733, 2683, + 2849, 1299, 2653, + 2813, 1603, 2611, + 2759, 1831, 2547, + 2677, 2024, 2443, + 2539, 2197, 2253, + 2241, 2357, 1714, + 0, 2509, 0, + 0, 2655, 0, + 0, 2799, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2891, + 3071, 0, 2891, + 3071, 0, 2891, + 3069, 0, 2889, + 3069, 0, 2889, + 3067, 0, 2887, + 3065, 0, 2885, + 3063, 0, 2883, + 3061, 0, 2879, + 3057, 0, 2875, + 3053, 0, 2869, + 3045, 0, 2861, + 3035, 0, 2851, + 3023, 0, 2835, + 3005, 852, 2815, + 2979, 1427, 2785, + 2943, 1733, 2741, + 2891, 1962, 2677, + 2809, 2155, 2573, + 2669, 2329, 2383, + 2371, 2489, 1837, + 0, 2641, 0, + 0, 2787, 0, + 0, 2931, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3021, + 3201, 0, 3021, + 3201, 0, 3019, + 3199, 0, 3019, + 3197, 0, 3017, + 3195, 0, 3015, + 3193, 0, 3011, + 3189, 0, 3007, + 3185, 0, 3001, + 3177, 0, 2993, + 3167, 0, 2981, + 3155, 0, 2967, + 3137, 974, 2945, + 3111, 1557, 2915, + 3075, 1864, 2873, + 3023, 2093, 2809, + 2941, 2287, 2703, + 2801, 2461, 2513, + 2503, 2621, 1961, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3153, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3331, 0, 3151, + 3329, 0, 3149, + 3327, 0, 3145, + 3325, 0, 3143, + 3321, 0, 3139, + 3317, 0, 3133, + 3309, 0, 3125, + 3299, 0, 3113, + 3287, 0, 3099, + 3269, 1099, 3077, + 3243, 1687, 3047, + 3207, 1995, 3005, + 3155, 2225, 2939, + 3073, 2419, 2835, + 2933, 2591, 2643, + 2635, 2753, 2087, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3459, 0, 3277, + 3457, 0, 3275, + 3453, 0, 3269, + 3449, 0, 3263, + 3441, 0, 3255, + 3431, 0, 3245, + 3419, 0, 3229, + 3401, 1225, 3209, + 3375, 1817, 3179, + 3339, 2127, 3135, + 3287, 2357, 3071, + 3205, 2551, 2967, + 3065, 2723, 2773, + 2767, 2885, 2215, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3415, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3591, 0, 3409, + 3589, 0, 3407, + 3585, 0, 3401, + 3581, 0, 3395, + 3573, 0, 3387, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1353, 3341, + 3507, 1948, 3311, + 3471, 2257, 3267, + 3419, 2489, 3203, + 3337, 2683, 3097, + 3197, 2855, 2905, + 2897, 3017, 2345, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3547, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3537, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1482, 3473, + 3639, 2079, 3443, + 3603, 2389, 3399, + 3551, 2621, 3335, + 3469, 2815, 3229, + 3329, 2987, 3035, + 3029, 3149, 2473, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3669, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1612, 3605, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2753, 3467, + 3601, 2947, 3361, + 3461, 3119, 3167, + 3161, 3281, 2605, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3801, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1742, 3737, + 3903, 2343, 3707, + 3867, 2653, 3663, + 3815, 2885, 3597, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2735, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1873, 3869, + 4035, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3729, + 3865, 3211, 3625, + 3725, 3383, 3431, + 3425, 3545, 2867, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2004, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3861, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2997, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2135, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3993, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 425, 171, 743, + 284, 251, 694, + 0, 341, 618, + 0, 439, 493, + 0, 543, 240, + 0, 653, 0, + 0, 769, 0, + 0, 887, 0, + 0, 1009, 0, + 0, 1134, 0, + 0, 1260, 0, + 0, 1388, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 558, 157, 792, + 457, 240, 748, + 272, 332, 682, + 0, 431, 574, + 0, 537, 374, + 0, 649, 0, + 0, 765, 0, + 0, 885, 0, + 0, 1007, 0, + 0, 1132, 0, + 0, 1259, 0, + 0, 1387, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 691, 138, 850, + 618, 224, 811, + 496, 319, 754, + 257, 421, 664, + 0, 529, 507, + 0, 642, 141, + 0, 760, 0, + 0, 881, 0, + 0, 1004, 0, + 0, 1130, 0, + 0, 1257, 0, + 0, 1385, 0, + 0, 1515, 0, + 0, 1645, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 824, 111, 918, + 770, 202, 885, + 687, 301, 836, + 544, 407, 762, + 235, 518, 640, + 0, 634, 399, + 0, 753, 0, + 0, 876, 0, + 0, 1001, 0, + 0, 1127, 0, + 0, 1255, 0, + 0, 1384, 0, + 0, 1514, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 956, 72, 995, + 917, 170, 967, + 858, 276, 927, + 765, 387, 867, + 601, 502, 773, + 205, 622, 606, + 0, 744, 196, + 0, 869, 0, + 0, 995, 0, + 0, 1123, 0, + 0, 1252, 0, + 0, 1382, 0, + 0, 1512, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1088, 14, 1080, + 1059, 125, 1058, + 1017, 240, 1025, + 954, 359, 978, + 852, 481, 906, + 667, 605, 787, + 161, 732, 556, + 0, 859, 0, + 0, 988, 0, + 0, 1117, 0, + 0, 1248, 0, + 0, 1378, 0, + 0, 1510, 0, + 0, 1641, 0, + 0, 1772, 0, + 0, 1904, 0, + 0, 2036, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1221, 0, 1175, + 1199, 55, 1156, + 1169, 187, 1130, + 1124, 319, 1093, + 1057, 450, 1038, + 948, 582, 953, + 743, 714, 805, + 94, 846, 478, + 0, 978, 0, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1506, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1353, 0, 1276, + 1337, 0, 1262, + 1315, 105, 1241, + 1283, 259, 1212, + 1236, 406, 1171, + 1166, 550, 1108, + 1050, 690, 1009, + 828, 828, 828, + 0, 965, 349, + 0, 1100, 0, + 0, 1235, 0, + 0, 1369, 0, + 0, 1502, 0, + 0, 1636, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2034, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1485, 0, 1384, + 1473, 0, 1373, + 1457, 0, 1357, + 1434, 164, 1335, + 1401, 340, 1303, + 1353, 502, 1257, + 1280, 656, 1188, + 1159, 803, 1074, + 922, 947, 858, + 0, 1087, 83, + 0, 1225, 0, + 0, 1361, 0, + 0, 1497, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1618, 0, 1497, + 1609, 0, 1488, + 1596, 0, 1476, + 1580, 0, 1459, + 1556, 232, 1435, + 1523, 430, 1402, + 1473, 605, 1352, + 1398, 767, 1276, + 1273, 921, 1149, + 1023, 1068, 894, + 0, 1211, 0, + 0, 1351, 0, + 0, 1489, 0, + 0, 1626, 0, + 0, 1761, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1750, 0, 1615, + 1743, 0, 1608, + 1734, 0, 1598, + 1722, 0, 1586, + 1705, 31, 1568, + 1681, 310, 1543, + 1647, 527, 1507, + 1597, 714, 1454, + 1520, 883, 1372, + 1391, 1041, 1234, + 1130, 1192, 938, + 0, 1337, 0, + 0, 1479, 0, + 0, 1618, 0, + 0, 1755, 0, + 0, 1891, 0, + 0, 2026, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1882, 0, 1736, + 1877, 0, 1730, + 1870, 0, 1723, + 1861, 0, 1713, + 1849, 0, 1700, + 1831, 75, 1681, + 1807, 397, 1655, + 1773, 632, 1618, + 1722, 828, 1562, + 1644, 1003, 1476, + 1512, 1164, 1326, + 1242, 1317, 992, + 0, 1465, 0, + 0, 1608, 0, + 0, 1748, 0, + 0, 1886, 0, + 0, 2022, 0, + 0, 2157, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2014, 0, 1859, + 2010, 0, 1855, + 2005, 0, 1850, + 1999, 0, 1842, + 1989, 0, 1832, + 1977, 0, 1818, + 1959, 128, 1799, + 1935, 492, 1772, + 1900, 742, 1733, + 1849, 946, 1676, + 1770, 1125, 1585, + 1636, 1290, 1426, + 1359, 1445, 1054, + 0, 1593, 0, + 0, 1737, 0, + 0, 1878, 0, + 0, 2017, 0, + 0, 2153, 0, + 0, 2289, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2147, 0, 1985, + 2143, 0, 1982, + 2139, 0, 1977, + 2135, 0, 1972, + 2127, 0, 1964, + 2119, 0, 1954, + 2105, 0, 1940, + 2089, 191, 1920, + 2063, 594, 1893, + 2029, 857, 1853, + 1977, 1067, 1793, + 1897, 1250, 1700, + 1762, 1417, 1533, + 1480, 1573, 1126, + 0, 1723, 0, + 0, 1868, 0, + 0, 2009, 0, + 0, 2147, 0, + 0, 2285, 0, + 0, 2421, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2279, 0, 2111, + 2277, 0, 2109, + 2273, 0, 2107, + 2269, 0, 2103, + 2265, 0, 2097, + 2257, 0, 2089, + 2249, 0, 2079, + 2235, 0, 2063, + 2219, 264, 2044, + 2193, 702, 2016, + 2159, 976, 1975, + 2107, 1191, 1914, + 2026, 1377, 1818, + 1889, 1545, 1645, + 1603, 1703, 1208, + 0, 1853, 0, + 0, 1998, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2411, 0, 2241, + 2409, 0, 2239, + 2407, 0, 2237, + 2405, 0, 2233, + 2401, 0, 2229, + 2395, 0, 2223, + 2389, 0, 2215, + 2379, 0, 2205, + 2367, 0, 2189, + 2349, 345, 2169, + 2323, 816, 2141, + 2289, 1098, 2099, + 2235, 1317, 2038, + 2155, 1505, 1940, + 2018, 1675, 1762, + 1728, 1833, 1298, + 0, 1984, 0, + 0, 2129, 0, + 0, 2271, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2543, 0, 2369, + 2541, 0, 2369, + 2541, 0, 2367, + 2537, 0, 2363, + 2535, 0, 2361, + 2531, 0, 2357, + 2527, 0, 2351, + 2519, 0, 2343, + 2511, 0, 2333, + 2497, 0, 2317, + 2479, 436, 2297, + 2455, 933, 2269, + 2419, 1223, 2227, + 2367, 1445, 2163, + 2285, 1634, 2063, + 2147, 1805, 1882, + 1855, 1964, 1396, + 0, 2115, 0, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2679, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2675, 0, 2499, + 2675, 0, 2499, + 2673, 0, 2497, + 2671, 0, 2495, + 2669, 0, 2493, + 2667, 0, 2489, + 2663, 0, 2485, + 2657, 0, 2479, + 2651, 0, 2471, + 2641, 0, 2461, + 2629, 0, 2447, + 2611, 534, 2425, + 2585, 1054, 2397, + 2549, 1349, 2355, + 2497, 1573, 2291, + 2415, 1764, 2189, + 2277, 1935, 2005, + 1984, 2095, 1501, + 0, 2247, 0, + 0, 2393, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2629, + 2807, 0, 2629, + 2805, 0, 2629, + 2805, 0, 2627, + 2803, 0, 2625, + 2801, 0, 2623, + 2797, 0, 2619, + 2795, 0, 2615, + 2789, 0, 2609, + 2783, 0, 2601, + 2773, 0, 2591, + 2759, 0, 2575, + 2741, 639, 2555, + 2717, 1178, 2525, + 2681, 1477, 2483, + 2629, 1703, 2419, + 2547, 1894, 2317, + 2407, 2067, 2131, + 2113, 2225, 1612, + 0, 2377, 0, + 0, 2523, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2761, + 2939, 0, 2761, + 2939, 0, 2759, + 2937, 0, 2759, + 2935, 0, 2757, + 2935, 0, 2755, + 2933, 0, 2753, + 2929, 0, 2749, + 2925, 0, 2745, + 2921, 0, 2739, + 2913, 0, 2731, + 2905, 0, 2721, + 2891, 0, 2705, + 2873, 750, 2685, + 2849, 1304, 2655, + 2813, 1605, 2613, + 2759, 1833, 2549, + 2679, 2025, 2445, + 2539, 2197, 2257, + 2243, 2357, 1727, + 0, 2509, 0, + 0, 2655, 0, + 0, 2799, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2893, + 3071, 0, 2891, + 3071, 0, 2891, + 3069, 0, 2891, + 3069, 0, 2889, + 3067, 0, 2889, + 3067, 0, 2887, + 3065, 0, 2883, + 3061, 0, 2881, + 3057, 0, 2877, + 3053, 0, 2871, + 3045, 0, 2863, + 3037, 0, 2851, + 3023, 0, 2837, + 3005, 865, 2815, + 2981, 1431, 2785, + 2945, 1735, 2743, + 2891, 1963, 2679, + 2809, 2157, 2575, + 2671, 2329, 2385, + 2373, 2489, 1847, + 0, 2641, 0, + 0, 2787, 0, + 0, 2931, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3023, + 3203, 0, 3023, + 3201, 0, 3021, + 3201, 0, 3021, + 3199, 0, 3019, + 3199, 0, 3017, + 3195, 0, 3015, + 3193, 0, 3011, + 3189, 0, 3007, + 3185, 0, 3001, + 3177, 0, 2993, + 3167, 0, 2983, + 3155, 0, 2967, + 3137, 984, 2947, + 3111, 1559, 2917, + 3077, 1865, 2873, + 3023, 2095, 2809, + 2941, 2287, 2705, + 2801, 2461, 2515, + 2505, 2621, 1969, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3153, + 3333, 0, 3153, + 3333, 0, 3151, + 3331, 0, 3151, + 3329, 0, 3149, + 3327, 0, 3147, + 3325, 0, 3143, + 3321, 0, 3139, + 3317, 0, 3133, + 3309, 0, 3125, + 3299, 0, 3113, + 3287, 0, 3099, + 3269, 1106, 3077, + 3243, 1689, 3049, + 3207, 1996, 3005, + 3155, 2225, 2941, + 3073, 2419, 2837, + 2933, 2593, 2645, + 2635, 2753, 2093, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3283, + 3463, 0, 3283, + 3461, 0, 3281, + 3459, 0, 3277, + 3457, 0, 3275, + 3453, 0, 3271, + 3449, 0, 3265, + 3441, 0, 3257, + 3431, 0, 3245, + 3419, 0, 3231, + 3401, 1231, 3209, + 3375, 1819, 3179, + 3339, 2127, 3137, + 3287, 2357, 3071, + 3205, 2551, 2967, + 3065, 2725, 2775, + 2767, 2885, 2219, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3603, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3413, + 3591, 0, 3409, + 3589, 0, 3407, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3563, 0, 3377, + 3551, 0, 3361, + 3533, 1357, 3341, + 3507, 1949, 3311, + 3471, 2259, 3267, + 3419, 2489, 3203, + 3337, 2683, 3099, + 3197, 2855, 2905, + 2899, 3017, 2347, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3545, + 3727, 0, 3543, + 3723, 0, 3541, + 3721, 0, 3539, + 3717, 0, 3533, + 3713, 0, 3527, + 3705, 0, 3519, + 3695, 0, 3509, + 3683, 0, 3493, + 3665, 1485, 3473, + 3639, 2081, 3443, + 3603, 2391, 3399, + 3551, 2621, 3335, + 3469, 2815, 3229, + 3329, 2987, 3037, + 3031, 3149, 2477, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3679, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3675, + 3855, 0, 3673, + 3853, 0, 3671, + 3849, 0, 3665, + 3845, 0, 3659, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1614, 3605, + 3771, 2211, 3575, + 3735, 2521, 3531, + 3683, 2753, 3467, + 3601, 2947, 3361, + 3461, 3119, 3169, + 3161, 3281, 2607, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3811, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3803, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1744, 3737, + 3903, 2343, 3707, + 3867, 2653, 3663, + 3815, 2885, 3599, + 3733, 3079, 3493, + 3593, 3251, 3299, + 3293, 3413, 2737, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1874, 3869, + 4037, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3731, + 3865, 3211, 3625, + 3725, 3385, 3431, + 3425, 3545, 2867, + 0, 3697, 0, + 0, 3843, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2005, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2999, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2135, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3129, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 532, 243, 872, + 424, 313, 835, + 222, 392, 781, + 0, 480, 697, + 0, 576, 552, + 0, 680, 237, + 0, 789, 0, + 0, 903, 0, + 0, 1022, 0, + 0, 1143, 0, + 0, 1267, 0, + 0, 1393, 0, + 0, 1520, 0, + 0, 1649, 0, + 0, 1779, 0, + 0, 1909, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 640, 231, 909, + 557, 303, 875, + 416, 384, 826, + 111, 473, 750, + 0, 571, 625, + 0, 675, 372, + 0, 786, 0, + 0, 901, 0, + 0, 1020, 0, + 0, 1141, 0, + 0, 1266, 0, + 0, 1392, 0, + 0, 1520, 0, + 0, 1649, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 754, 215, 955, + 690, 289, 924, + 589, 372, 880, + 404, 464, 814, + 0, 563, 706, + 0, 669, 506, + 0, 781, 0, + 0, 897, 0, + 0, 1017, 0, + 0, 1139, 0, + 0, 1264, 0, + 0, 1391, 0, + 0, 1519, 0, + 0, 1648, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 871, 192, 1009, + 823, 270, 982, + 750, 356, 944, + 628, 451, 886, + 389, 553, 796, + 0, 661, 639, + 0, 774, 273, + 0, 892, 0, + 0, 1013, 0, + 0, 1136, 0, + 0, 1262, 0, + 0, 1389, 0, + 0, 1518, 0, + 0, 1647, 0, + 0, 1777, 0, + 0, 1908, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 992, 160, 1073, + 956, 243, 1049, + 902, 334, 1017, + 819, 433, 968, + 676, 539, 895, + 367, 650, 772, + 0, 766, 531, + 0, 885, 0, + 0, 1008, 0, + 0, 1132, 0, + 0, 1259, 0, + 0, 1387, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1116, 113, 1146, + 1088, 204, 1126, + 1049, 302, 1099, + 990, 408, 1059, + 897, 519, 1000, + 733, 634, 905, + 337, 754, 738, + 0, 876, 328, + 0, 1001, 0, + 0, 1127, 0, + 0, 1255, 0, + 0, 1384, 0, + 0, 1514, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1241, 42, 1229, + 1221, 146, 1212, + 1191, 257, 1190, + 1149, 372, 1157, + 1086, 491, 1110, + 985, 613, 1038, + 799, 737, 919, + 293, 864, 688, + 0, 991, 0, + 0, 1120, 0, + 0, 1250, 0, + 0, 1380, 0, + 0, 1511, 0, + 0, 1642, 0, + 0, 1773, 0, + 0, 1905, 0, + 0, 2036, 0, + 0, 2169, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1368, 0, 1320, + 1353, 56, 1307, + 1331, 187, 1288, + 1301, 319, 1262, + 1256, 451, 1225, + 1189, 582, 1170, + 1080, 714, 1085, + 875, 846, 937, + 226, 978, 610, + 0, 1110, 0, + 0, 1242, 0, + 0, 1374, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1497, 0, 1419, + 1485, 0, 1408, + 1469, 74, 1394, + 1447, 237, 1373, + 1415, 391, 1345, + 1369, 538, 1303, + 1298, 682, 1240, + 1183, 822, 1141, + 960, 960, 960, + 118, 1097, 481, + 0, 1232, 0, + 0, 1367, 0, + 0, 1501, 0, + 0, 1634, 0, + 0, 1768, 0, + 0, 1901, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1626, 0, 1525, + 1617, 0, 1516, + 1606, 0, 1505, + 1589, 97, 1489, + 1566, 296, 1467, + 1533, 472, 1435, + 1485, 634, 1389, + 1412, 788, 1320, + 1291, 935, 1206, + 1054, 1078, 990, + 0, 1219, 216, + 0, 1357, 0, + 0, 1493, 0, + 0, 1629, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1756, 0, 1636, + 1750, 0, 1630, + 1741, 0, 1621, + 1729, 0, 1608, + 1712, 126, 1591, + 1688, 364, 1568, + 1655, 562, 1534, + 1606, 737, 1484, + 1530, 899, 1408, + 1405, 1052, 1281, + 1155, 1200, 1026, + 0, 1343, 0, + 0, 1483, 0, + 0, 1621, 0, + 0, 1758, 0, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1887, 0, 1752, + 1882, 0, 1747, + 1875, 0, 1740, + 1866, 0, 1731, + 1854, 0, 1718, + 1837, 163, 1700, + 1813, 442, 1675, + 1779, 659, 1639, + 1729, 846, 1586, + 1652, 1015, 1505, + 1523, 1173, 1366, + 1262, 1324, 1070, + 0, 1469, 0, + 0, 1611, 0, + 0, 1750, 0, + 0, 1888, 0, + 0, 2024, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2018, 0, 1872, + 2014, 0, 1868, + 2009, 0, 1862, + 2002, 0, 1855, + 1993, 0, 1845, + 1981, 0, 1832, + 1963, 207, 1813, + 1939, 529, 1787, + 1905, 764, 1750, + 1854, 960, 1695, + 1776, 1135, 1608, + 1644, 1297, 1458, + 1374, 1450, 1123, + 0, 1597, 0, + 0, 1740, 0, + 0, 1880, 0, + 0, 2018, 0, + 0, 2155, 0, + 0, 2289, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2149, 0, 1994, + 2147, 0, 1991, + 2143, 0, 1987, + 2137, 0, 1982, + 2131, 0, 1974, + 2121, 0, 1964, + 2109, 0, 1950, + 2091, 260, 1931, + 2067, 624, 1904, + 2032, 874, 1866, + 1981, 1078, 1808, + 1902, 1258, 1717, + 1768, 1422, 1559, + 1491, 1577, 1186, + 0, 1725, 0, + 0, 1869, 0, + 0, 2010, 0, + 0, 2149, 0, + 0, 2285, 0, + 0, 2421, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2281, 0, 2119, + 2279, 0, 2117, + 2275, 0, 2113, + 2271, 0, 2109, + 2267, 0, 2105, + 2261, 0, 2097, + 2251, 0, 2087, + 2239, 0, 2073, + 2221, 323, 2053, + 2195, 726, 2025, + 2161, 989, 1985, + 2109, 1200, 1926, + 2029, 1382, 1832, + 1894, 1549, 1665, + 1612, 1706, 1258, + 0, 1855, 0, + 0, 2000, 0, + 0, 2141, 0, + 0, 2279, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2413, 0, 2245, + 2411, 0, 2243, + 2409, 0, 2241, + 2405, 0, 2239, + 2401, 0, 2235, + 2397, 0, 2229, + 2391, 0, 2221, + 2381, 0, 2211, + 2367, 0, 2197, + 2351, 396, 2177, + 2325, 834, 2147, + 2291, 1108, 2107, + 2239, 1323, 2047, + 2157, 1509, 1950, + 2021, 1678, 1777, + 1735, 1835, 1340, + 0, 1985, 0, + 0, 2131, 0, + 0, 2273, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2543, 0, 2373, + 2543, 0, 2373, + 2541, 0, 2371, + 2539, 0, 2369, + 2537, 0, 2365, + 2533, 0, 2361, + 2527, 0, 2355, + 2521, 0, 2347, + 2511, 0, 2337, + 2499, 0, 2323, + 2481, 477, 2301, + 2455, 948, 2273, + 2421, 1230, 2231, + 2369, 1449, 2171, + 2287, 1637, 2071, + 2149, 1807, 1894, + 1860, 1965, 1430, + 0, 2115, 0, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2675, 0, 2503, + 2675, 0, 2501, + 2673, 0, 2501, + 2673, 0, 2499, + 2671, 0, 2497, + 2667, 0, 2493, + 2663, 0, 2489, + 2659, 0, 2483, + 2651, 0, 2475, + 2643, 0, 2465, + 2629, 0, 2449, + 2611, 568, 2429, + 2587, 1065, 2401, + 2551, 1355, 2359, + 2499, 1577, 2295, + 2417, 1766, 2195, + 2279, 1937, 2014, + 1987, 2095, 1528, + 0, 2247, 0, + 0, 2393, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2807, 0, 2633, + 2807, 0, 2631, + 2807, 0, 2631, + 2805, 0, 2629, + 2803, 0, 2627, + 2801, 0, 2625, + 2799, 0, 2621, + 2795, 0, 2617, + 2789, 0, 2611, + 2783, 0, 2603, + 2773, 0, 2593, + 2761, 0, 2579, + 2743, 666, 2557, + 2717, 1186, 2529, + 2681, 1481, 2487, + 2629, 1705, 2423, + 2547, 1896, 2321, + 2409, 2067, 2137, + 2115, 2227, 1633, + 0, 2379, 0, + 0, 2525, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2943, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2939, 0, 2763, + 2939, 0, 2763, + 2939, 0, 2761, + 2937, 0, 2761, + 2937, 0, 2759, + 2935, 0, 2757, + 2933, 0, 2755, + 2931, 0, 2751, + 2927, 0, 2747, + 2921, 0, 2741, + 2915, 0, 2733, + 2905, 0, 2723, + 2891, 0, 2707, + 2875, 771, 2687, + 2849, 1310, 2657, + 2813, 1609, 2615, + 2761, 1835, 2551, + 2679, 2026, 2449, + 2541, 2199, 2263, + 2245, 2359, 1744, + 0, 2509, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3075, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3071, 0, 2893, + 3071, 0, 2893, + 3071, 0, 2893, + 3071, 0, 2891, + 3069, 0, 2891, + 3069, 0, 2889, + 3067, 0, 2887, + 3065, 0, 2885, + 3061, 0, 2881, + 3057, 0, 2877, + 3053, 0, 2871, + 3045, 0, 2863, + 3037, 0, 2853, + 3023, 0, 2837, + 3005, 882, 2817, + 2981, 1436, 2787, + 2945, 1738, 2745, + 2891, 1965, 2681, + 2811, 2157, 2577, + 2671, 2329, 2389, + 2375, 2489, 1860, + 0, 2641, 0, + 0, 2787, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3203, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3023, + 3203, 0, 3023, + 3201, 0, 3023, + 3201, 0, 3021, + 3199, 0, 3021, + 3199, 0, 3019, + 3197, 0, 3015, + 3193, 0, 3013, + 3189, 0, 3009, + 3185, 0, 3003, + 3177, 0, 2995, + 3169, 0, 2983, + 3155, 0, 2969, + 3137, 997, 2947, + 3113, 1563, 2919, + 3077, 1867, 2875, + 3023, 2095, 2811, + 2941, 2289, 2707, + 2803, 2461, 2517, + 2505, 2621, 1979, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3333, 0, 3153, + 3333, 0, 3153, + 3331, 0, 3151, + 3331, 0, 3149, + 3329, 0, 3147, + 3325, 0, 3143, + 3321, 0, 3139, + 3317, 0, 3133, + 3309, 0, 3125, + 3301, 0, 3115, + 3287, 0, 3099, + 3269, 1116, 3079, + 3245, 1692, 3049, + 3209, 1997, 3007, + 3155, 2227, 2941, + 3073, 2419, 2837, + 2933, 2593, 2647, + 2637, 2753, 2101, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3471, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3285, + 3465, 0, 3285, + 3465, 0, 3285, + 3463, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3457, 0, 3275, + 3453, 0, 3271, + 3449, 0, 3265, + 3441, 0, 3257, + 3431, 0, 3245, + 3419, 0, 3231, + 3401, 1238, 3209, + 3375, 1821, 3181, + 3341, 2129, 3137, + 3287, 2357, 3073, + 3205, 2551, 2969, + 3065, 2725, 2777, + 2767, 2885, 2225, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3415, + 3595, 0, 3415, + 3595, 0, 3413, + 3591, 0, 3411, + 3589, 0, 3407, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3563, 0, 3377, + 3551, 0, 3363, + 3533, 1363, 3341, + 3507, 1951, 3311, + 3471, 2259, 3269, + 3419, 2489, 3203, + 3337, 2683, 3099, + 3197, 2857, 2907, + 2899, 3017, 2351, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3731, 0, 3549, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3545, + 3727, 0, 3545, + 3725, 0, 3541, + 3721, 0, 3539, + 3717, 0, 3535, + 3713, 0, 3529, + 3705, 0, 3521, + 3695, 0, 3509, + 3683, 0, 3495, + 3665, 1489, 3473, + 3639, 2081, 3443, + 3603, 2391, 3401, + 3551, 2621, 3335, + 3469, 2815, 3231, + 3329, 2989, 3037, + 3031, 3149, 2479, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3677, + 3859, 0, 3677, + 3857, 0, 3673, + 3853, 0, 3671, + 3849, 0, 3665, + 3845, 0, 3661, + 3837, 0, 3651, + 3827, 0, 3641, + 3815, 0, 3625, + 3797, 1617, 3605, + 3771, 2213, 3575, + 3735, 2523, 3531, + 3683, 2753, 3467, + 3601, 2947, 3363, + 3461, 3121, 3169, + 3163, 3281, 2609, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3807, + 3989, 0, 3805, + 3985, 0, 3803, + 3981, 0, 3797, + 3977, 0, 3791, + 3969, 0, 3783, + 3959, 0, 3773, + 3947, 0, 3757, + 3929, 1746, 3737, + 3903, 2343, 3707, + 3869, 2653, 3663, + 3815, 2885, 3599, + 3733, 3079, 3493, + 3593, 3253, 3301, + 3295, 3413, 2739, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3923, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1876, 3869, + 4037, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3731, + 3865, 3211, 3625, + 3725, 3385, 3431, + 3425, 3545, 2869, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2006, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3557, 3677, 2999, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2137, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3689, 3809, 3131, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2267, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3821, 3941, 3261, + 644, 324, 1001, + 562, 383, 974, + 422, 452, 935, + 123, 530, 876, + 0, 617, 784, + 0, 713, 622, + 0, 815, 233, + 0, 924, 0, + 0, 1037, 0, + 0, 1155, 0, + 0, 1276, 0, + 0, 1400, 0, + 0, 1526, 0, + 0, 1653, 0, + 0, 1782, 0, + 0, 1911, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 731, 315, 1029, + 664, 375, 1004, + 556, 445, 967, + 354, 524, 913, + 0, 612, 829, + 0, 708, 684, + 0, 812, 369, + 0, 921, 0, + 0, 1035, 0, + 0, 1154, 0, + 0, 1275, 0, + 0, 1399, 0, + 0, 1525, 0, + 0, 1653, 0, + 0, 1781, 0, + 0, 1911, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 826, 301, 1065, + 772, 363, 1041, + 689, 435, 1008, + 548, 516, 958, + 243, 605, 883, + 0, 703, 757, + 0, 807, 504, + 0, 918, 0, + 0, 1033, 0, + 0, 1151, 0, + 0, 1273, 0, + 0, 1398, 0, + 0, 1524, 0, + 0, 1652, 0, + 0, 1781, 0, + 0, 1910, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 928, 282, 1108, + 886, 347, 1086, + 822, 421, 1056, + 721, 504, 1012, + 536, 596, 946, + 32, 695, 838, + 0, 801, 638, + 0, 913, 23, + 0, 1029, 0, + 0, 1149, 0, + 0, 1271, 0, + 0, 1396, 0, + 0, 1523, 0, + 0, 1651, 0, + 0, 1780, 0, + 0, 1910, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1036, 256, 1160, + 1003, 324, 1141, + 955, 402, 1114, + 882, 488, 1075, + 760, 583, 1018, + 521, 685, 929, + 0, 793, 771, + 0, 907, 406, + 0, 1024, 0, + 0, 1145, 0, + 0, 1268, 0, + 0, 1394, 0, + 0, 1521, 0, + 0, 1650, 0, + 0, 1779, 0, + 0, 1909, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1150, 219, 1221, + 1124, 292, 1205, + 1088, 375, 1182, + 1034, 466, 1149, + 951, 565, 1100, + 808, 671, 1026, + 500, 782, 905, + 0, 898, 663, + 0, 1017, 0, + 0, 1140, 0, + 0, 1265, 0, + 0, 1391, 0, + 0, 1519, 0, + 0, 1648, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1267, 163, 1292, + 1248, 245, 1278, + 1220, 336, 1259, + 1181, 435, 1231, + 1122, 540, 1191, + 1029, 651, 1131, + 865, 767, 1037, + 469, 886, 870, + 0, 1008, 460, + 0, 1133, 0, + 0, 1259, 0, + 0, 1387, 0, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1388, 76, 1373, + 1373, 174, 1361, + 1353, 278, 1345, + 1324, 389, 1322, + 1281, 504, 1289, + 1218, 623, 1242, + 1116, 745, 1170, + 932, 870, 1051, + 425, 996, 820, + 0, 1123, 0, + 0, 1252, 0, + 0, 1382, 0, + 0, 1512, 0, + 0, 1643, 0, + 0, 1774, 0, + 0, 1905, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1512, 0, 1462, + 1501, 57, 1452, + 1485, 188, 1439, + 1463, 319, 1420, + 1433, 451, 1395, + 1388, 583, 1357, + 1321, 715, 1303, + 1212, 847, 1217, + 1008, 979, 1069, + 358, 1110, 742, + 0, 1242, 0, + 0, 1374, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1638, 0, 1559, + 1629, 0, 1551, + 1617, 29, 1541, + 1601, 206, 1526, + 1579, 369, 1505, + 1547, 523, 1477, + 1501, 670, 1435, + 1430, 814, 1373, + 1315, 954, 1273, + 1092, 1092, 1092, + 250, 1229, 613, + 0, 1364, 0, + 0, 1499, 0, + 0, 1633, 0, + 0, 1767, 0, + 0, 1900, 0, + 0, 2033, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1765, 0, 1663, + 1758, 0, 1657, + 1750, 0, 1649, + 1738, 0, 1637, + 1721, 229, 1621, + 1698, 428, 1599, + 1665, 604, 1567, + 1617, 766, 1522, + 1544, 920, 1452, + 1423, 1067, 1338, + 1186, 1211, 1122, + 47, 1351, 348, + 0, 1489, 0, + 0, 1626, 0, + 0, 1761, 0, + 0, 1896, 0, + 0, 2030, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1893, 0, 1773, + 1888, 0, 1768, + 1882, 0, 1762, + 1873, 0, 1753, + 1861, 0, 1740, + 1844, 258, 1723, + 1820, 496, 1700, + 1787, 694, 1666, + 1738, 869, 1616, + 1662, 1031, 1540, + 1537, 1185, 1414, + 1287, 1332, 1158, + 0, 1475, 0, + 0, 1615, 0, + 0, 1753, 0, + 0, 1890, 0, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2023, 0, 1888, + 2019, 0, 1884, + 2014, 0, 1879, + 2007, 0, 1872, + 1998, 0, 1863, + 1986, 0, 1850, + 1969, 295, 1832, + 1945, 574, 1807, + 1911, 791, 1771, + 1861, 978, 1718, + 1784, 1147, 1637, + 1655, 1305, 1498, + 1394, 1456, 1202, + 0, 1601, 0, + 0, 1743, 0, + 0, 1882, 0, + 0, 2020, 0, + 0, 2155, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2153, 0, 2007, + 2149, 0, 2004, + 2147, 0, 2000, + 2141, 0, 1995, + 2135, 0, 1987, + 2125, 0, 1978, + 2113, 0, 1964, + 2095, 339, 1946, + 2071, 661, 1920, + 2037, 896, 1882, + 1986, 1092, 1827, + 1908, 1267, 1740, + 1777, 1429, 1590, + 1507, 1582, 1256, + 0, 1729, 0, + 0, 1872, 0, + 0, 2012, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2283, 0, 2129, + 2281, 0, 2127, + 2279, 0, 2123, + 2275, 0, 2119, + 2269, 0, 2113, + 2263, 0, 2107, + 2253, 0, 2097, + 2241, 0, 2083, + 2223, 393, 2063, + 2199, 756, 2036, + 2165, 1006, 1998, + 2113, 1210, 1940, + 2034, 1390, 1850, + 1900, 1554, 1691, + 1624, 1709, 1318, + 0, 1858, 0, + 0, 2002, 0, + 0, 2143, 0, + 0, 2281, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2415, 0, 2253, + 2413, 0, 2251, + 2411, 0, 2249, + 2407, 0, 2245, + 2405, 0, 2241, + 2399, 0, 2237, + 2393, 0, 2229, + 2383, 0, 2219, + 2371, 0, 2205, + 2353, 455, 2185, + 2329, 858, 2157, + 2293, 1121, 2117, + 2241, 1332, 2057, + 2161, 1515, 1964, + 2026, 1681, 1797, + 1744, 1838, 1391, + 0, 1987, 0, + 0, 2131, 0, + 0, 2273, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2545, 0, 2379, + 2545, 0, 2377, + 2543, 0, 2377, + 2541, 0, 2373, + 2537, 0, 2371, + 2535, 0, 2367, + 2529, 0, 2361, + 2523, 0, 2353, + 2513, 0, 2343, + 2501, 0, 2329, + 2483, 528, 2309, + 2457, 966, 2281, + 2423, 1240, 2239, + 2371, 1456, 2179, + 2289, 1641, 2083, + 2153, 1810, 1910, + 1867, 1967, 1472, + 0, 2117, 0, + 0, 2263, 0, + 0, 2405, 0, + 0, 2543, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2677, 0, 2507, + 2675, 0, 2505, + 2675, 0, 2505, + 2673, 0, 2503, + 2671, 0, 2501, + 2669, 0, 2497, + 2665, 0, 2493, + 2659, 0, 2487, + 2653, 0, 2479, + 2643, 0, 2469, + 2631, 0, 2455, + 2613, 609, 2433, + 2587, 1080, 2405, + 2553, 1362, 2365, + 2501, 1582, 2303, + 2419, 1769, 2203, + 2283, 1939, 2026, + 1993, 2097, 1562, + 0, 2249, 0, + 0, 2393, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2809, 0, 2635, + 2807, 0, 2635, + 2807, 0, 2633, + 2805, 0, 2633, + 2805, 0, 2631, + 2803, 0, 2629, + 2799, 0, 2625, + 2795, 0, 2621, + 2791, 0, 2615, + 2783, 0, 2607, + 2775, 0, 2597, + 2761, 0, 2581, + 2743, 700, 2561, + 2719, 1198, 2533, + 2683, 1487, 2491, + 2631, 1709, 2427, + 2549, 1898, 2327, + 2411, 2069, 2147, + 2119, 2227, 1661, + 0, 2379, 0, + 0, 2525, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2941, 0, 2765, + 2939, 0, 2765, + 2939, 0, 2763, + 2939, 0, 2763, + 2937, 0, 2761, + 2935, 0, 2759, + 2933, 0, 2757, + 2931, 0, 2755, + 2927, 0, 2749, + 2921, 0, 2743, + 2915, 0, 2737, + 2905, 0, 2725, + 2893, 0, 2711, + 2875, 798, 2689, + 2849, 1319, 2661, + 2815, 1613, 2619, + 2761, 1837, 2555, + 2681, 2028, 2453, + 2541, 2199, 2269, + 2247, 2359, 1766, + 0, 2511, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3073, 0, 2895, + 3071, 0, 2895, + 3071, 0, 2895, + 3071, 0, 2893, + 3069, 0, 2893, + 3069, 0, 2891, + 3067, 0, 2889, + 3065, 0, 2887, + 3063, 0, 2883, + 3059, 0, 2879, + 3053, 0, 2873, + 3047, 0, 2865, + 3037, 0, 2855, + 3025, 0, 2839, + 3007, 903, 2819, + 2981, 1442, 2789, + 2945, 1741, 2747, + 2893, 1967, 2683, + 2811, 2159, 2581, + 2673, 2331, 2395, + 2377, 2491, 1876, + 0, 2641, 0, + 0, 2789, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3207, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3025, + 3203, 0, 3023, + 3201, 0, 3023, + 3201, 0, 3021, + 3199, 0, 3019, + 3197, 0, 3017, + 3193, 0, 3015, + 3191, 0, 3009, + 3185, 0, 3003, + 3177, 0, 2995, + 3169, 0, 2985, + 3155, 0, 2971, + 3137, 1014, 2949, + 3113, 1568, 2919, + 3077, 1870, 2877, + 3025, 2097, 2813, + 2943, 2289, 2711, + 2803, 2461, 2521, + 2507, 2621, 1992, + 0, 2773, 0, + 0, 2919, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3339, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3155, + 3335, 0, 3155, + 3335, 0, 3155, + 3333, 0, 3153, + 3333, 0, 3153, + 3331, 0, 3151, + 3329, 0, 3149, + 3325, 0, 3145, + 3321, 0, 3141, + 3317, 0, 3135, + 3309, 0, 3127, + 3301, 0, 3115, + 3287, 0, 3101, + 3269, 1129, 3079, + 3245, 1695, 3051, + 3209, 1999, 3007, + 3155, 2227, 2943, + 3073, 2421, 2839, + 2935, 2593, 2649, + 2637, 2753, 2111, + 0, 2905, 0, + 0, 3051, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3469, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3467, 0, 3287, + 3465, 0, 3285, + 3465, 0, 3285, + 3463, 0, 3283, + 3463, 0, 3281, + 3461, 0, 3279, + 3457, 0, 3277, + 3453, 0, 3271, + 3449, 0, 3265, + 3441, 0, 3257, + 3433, 0, 3247, + 3419, 0, 3231, + 3401, 1248, 3211, + 3377, 1824, 3181, + 3341, 2129, 3139, + 3287, 2359, 3073, + 3205, 2551, 2969, + 3065, 2725, 2779, + 2769, 2885, 2233, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3597, 0, 3417, + 3597, 0, 3417, + 3595, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3589, 0, 3407, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3565, 0, 3379, + 3551, 0, 3363, + 3533, 1371, 3341, + 3509, 1953, 3313, + 3473, 2261, 3269, + 3419, 2489, 3205, + 3337, 2683, 3101, + 3197, 2857, 2909, + 2899, 3017, 2357, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3551, + 3733, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3549, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3721, 0, 3539, + 3717, 0, 3535, + 3713, 0, 3529, + 3705, 0, 3521, + 3697, 0, 3509, + 3683, 0, 3495, + 3665, 1495, 3473, + 3641, 2083, 3443, + 3605, 2391, 3401, + 3551, 2621, 3335, + 3469, 2815, 3231, + 3329, 2989, 3039, + 3031, 3149, 2485, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3673, + 3853, 0, 3671, + 3849, 0, 3667, + 3845, 0, 3661, + 3837, 0, 3653, + 3829, 0, 3641, + 3815, 0, 3627, + 3797, 1622, 3605, + 3773, 2213, 3575, + 3737, 2523, 3533, + 3683, 2753, 3467, + 3601, 2947, 3363, + 3461, 3121, 3169, + 3163, 3281, 2611, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3991, 0, 3809, + 3989, 0, 3805, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3773, + 3947, 0, 3757, + 3929, 1749, 3737, + 3905, 2345, 3707, + 3869, 2655, 3663, + 3815, 2885, 3599, + 3733, 3079, 3495, + 3593, 3253, 3301, + 3295, 3413, 2741, + 0, 3565, 0, + 0, 3711, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3925, + 4095, 0, 3915, + 4093, 0, 3905, + 4079, 0, 3889, + 4061, 1878, 3869, + 4037, 2475, 3839, + 4001, 2785, 3795, + 3947, 3017, 3731, + 3865, 3211, 3625, + 3725, 3385, 3433, + 3427, 3545, 2871, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4055, + 4095, 0, 4047, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2008, 4001, + 4095, 2607, 3971, + 4095, 2917, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3563, + 3559, 3677, 3001, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2139, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3695, + 3691, 3809, 3131, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2269, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3823, 3941, 3263, + 761, 415, 1131, + 699, 464, 1111, + 599, 522, 1082, + 420, 590, 1041, + 0, 667, 979, + 0, 753, 880, + 0, 848, 701, + 0, 950, 229, + 0, 1058, 0, + 0, 1171, 0, + 0, 1288, 0, + 0, 1409, 0, + 0, 1533, 0, + 0, 1658, 0, + 0, 1786, 0, + 0, 1914, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 829, 407, 1153, + 776, 456, 1133, + 694, 515, 1106, + 554, 584, 1067, + 255, 662, 1008, + 0, 749, 916, + 0, 845, 754, + 0, 947, 365, + 0, 1056, 0, + 0, 1169, 0, + 0, 1287, 0, + 0, 1408, 0, + 0, 1532, 0, + 0, 1658, 0, + 0, 1785, 0, + 0, 1914, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 907, 396, 1180, + 863, 447, 1161, + 796, 507, 1136, + 688, 577, 1099, + 486, 656, 1045, + 0, 744, 961, + 0, 841, 817, + 0, 944, 501, + 0, 1053, 0, + 0, 1167, 0, + 0, 1286, 0, + 0, 1407, 0, + 0, 1531, 0, + 0, 1657, 0, + 0, 1785, 0, + 0, 1913, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 994, 381, 1214, + 958, 433, 1197, + 904, 495, 1173, + 821, 567, 1139, + 680, 648, 1090, + 375, 737, 1015, + 0, 835, 889, + 0, 939, 636, + 0, 1050, 0, + 0, 1165, 0, + 0, 1284, 0, + 0, 1406, 0, + 0, 1530, 0, + 0, 1656, 0, + 0, 1784, 0, + 0, 1913, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1089, 360, 1255, + 1060, 415, 1240, + 1018, 479, 1219, + 955, 553, 1188, + 853, 636, 1144, + 669, 728, 1078, + 164, 827, 970, + 0, 933, 770, + 0, 1045, 155, + 0, 1161, 0, + 0, 1281, 0, + 0, 1403, 0, + 0, 1528, 0, + 0, 1655, 0, + 0, 1783, 0, + 0, 1912, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1191, 330, 1306, + 1168, 388, 1292, + 1135, 456, 1273, + 1087, 534, 1246, + 1014, 620, 1208, + 893, 715, 1150, + 653, 817, 1060, + 0, 925, 903, + 0, 1038, 538, + 0, 1156, 0, + 0, 1277, 0, + 0, 1401, 0, + 0, 1526, 0, + 0, 1653, 0, + 0, 1782, 0, + 0, 1911, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1300, 287, 1366, + 1282, 351, 1353, + 1256, 424, 1337, + 1220, 507, 1314, + 1166, 598, 1281, + 1083, 697, 1232, + 940, 803, 1159, + 632, 914, 1036, + 0, 1030, 795, + 0, 1149, 0, + 0, 1272, 0, + 0, 1397, 0, + 0, 1523, 0, + 0, 1651, 0, + 0, 1780, 0, + 0, 1910, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1413, 222, 1435, + 1399, 295, 1425, + 1380, 377, 1410, + 1352, 468, 1391, + 1313, 567, 1363, + 1254, 672, 1323, + 1161, 783, 1264, + 997, 899, 1169, + 601, 1018, 1002, + 0, 1140, 592, + 0, 1265, 0, + 0, 1391, 0, + 0, 1519, 0, + 0, 1648, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1531, 118, 1514, + 1520, 208, 1505, + 1505, 306, 1493, + 1485, 411, 1477, + 1456, 521, 1454, + 1413, 636, 1421, + 1350, 755, 1374, + 1249, 877, 1302, + 1063, 1002, 1183, + 557, 1128, 952, + 0, 1255, 0, + 0, 1384, 0, + 0, 1514, 0, + 0, 1644, 0, + 0, 1775, 0, + 0, 1906, 0, + 0, 2037, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1652, 0, 1601, + 1644, 58, 1594, + 1633, 189, 1584, + 1617, 320, 1571, + 1596, 451, 1553, + 1565, 583, 1527, + 1520, 715, 1490, + 1453, 847, 1435, + 1344, 979, 1349, + 1139, 1110, 1201, + 490, 1242, 875, + 0, 1375, 0, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1776, 0, 1697, + 1770, 0, 1691, + 1761, 0, 1683, + 1749, 161, 1673, + 1733, 338, 1658, + 1711, 501, 1638, + 1679, 655, 1609, + 1633, 803, 1567, + 1562, 946, 1505, + 1447, 1086, 1405, + 1225, 1225, 1225, + 382, 1361, 745, + 0, 1497, 0, + 0, 1631, 0, + 0, 1765, 0, + 0, 1899, 0, + 0, 2032, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1902, 0, 1800, + 1897, 0, 1795, + 1890, 0, 1789, + 1882, 0, 1781, + 1870, 122, 1769, + 1853, 361, 1753, + 1830, 560, 1731, + 1797, 736, 1700, + 1750, 898, 1654, + 1676, 1052, 1584, + 1556, 1199, 1471, + 1318, 1343, 1254, + 179, 1483, 480, + 0, 1621, 0, + 0, 1758, 0, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2029, 0, 1909, + 2025, 0, 1905, + 2021, 0, 1900, + 2014, 0, 1894, + 2005, 0, 1885, + 1993, 63, 1873, + 1976, 390, 1856, + 1952, 628, 1832, + 1919, 826, 1798, + 1870, 1001, 1748, + 1795, 1163, 1672, + 1669, 1317, 1546, + 1419, 1464, 1290, + 0, 1607, 0, + 0, 1747, 0, + 0, 1886, 0, + 0, 2022, 0, + 0, 2157, 0, + 0, 2293, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2157, 0, 2023, + 2155, 0, 2020, + 2151, 0, 2016, + 2147, 0, 2011, + 2139, 0, 2004, + 2131, 0, 1995, + 2119, 0, 1982, + 2101, 427, 1964, + 2077, 706, 1939, + 2043, 924, 1903, + 1993, 1110, 1851, + 1916, 1279, 1769, + 1787, 1437, 1630, + 1526, 1588, 1334, + 0, 1733, 0, + 0, 1875, 0, + 0, 2014, 0, + 0, 2151, 0, + 0, 2287, 0, + 0, 2423, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2287, 0, 2141, + 2285, 0, 2139, + 2283, 0, 2135, + 2279, 0, 2131, + 2273, 0, 2127, + 2267, 0, 2119, + 2257, 0, 2109, + 2245, 0, 2097, + 2227, 471, 2077, + 2203, 793, 2051, + 2169, 1028, 2014, + 2119, 1224, 1959, + 2040, 1399, 1872, + 1909, 1561, 1723, + 1639, 1714, 1388, + 0, 1861, 0, + 0, 2004, 0, + 0, 2145, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2417, 0, 2263, + 2415, 0, 2261, + 2413, 0, 2259, + 2411, 0, 2255, + 2407, 0, 2251, + 2401, 0, 2245, + 2395, 0, 2239, + 2385, 0, 2229, + 2373, 0, 2215, + 2355, 525, 2195, + 2331, 888, 2169, + 2297, 1138, 2129, + 2245, 1342, 2073, + 2165, 1522, 1982, + 2033, 1686, 1823, + 1756, 1841, 1450, + 0, 1990, 0, + 0, 2133, 0, + 0, 2275, 0, + 0, 2413, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2547, 0, 2387, + 2547, 0, 2385, + 2545, 0, 2383, + 2543, 0, 2381, + 2539, 0, 2377, + 2537, 0, 2373, + 2531, 0, 2369, + 2525, 0, 2361, + 2515, 0, 2351, + 2503, 0, 2337, + 2485, 587, 2317, + 2461, 990, 2289, + 2425, 1253, 2249, + 2373, 1464, 2189, + 2293, 1647, 2097, + 2159, 1813, 1930, + 1876, 1970, 1523, + 0, 2119, 0, + 0, 2263, 0, + 0, 2405, 0, + 0, 2545, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2679, 0, 2513, + 2677, 0, 2511, + 2677, 0, 2509, + 2675, 0, 2509, + 2673, 0, 2505, + 2669, 0, 2503, + 2667, 0, 2499, + 2661, 0, 2493, + 2655, 0, 2485, + 2645, 0, 2475, + 2633, 0, 2461, + 2615, 660, 2441, + 2589, 1098, 2413, + 2555, 1372, 2371, + 2503, 1588, 2311, + 2421, 1773, 2215, + 2285, 1942, 2042, + 1999, 2099, 1604, + 0, 2249, 0, + 0, 2395, 0, + 0, 2537, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2809, 0, 2639, + 2809, 0, 2639, + 2809, 0, 2637, + 2807, 0, 2637, + 2805, 0, 2635, + 2803, 0, 2633, + 2801, 0, 2629, + 2797, 0, 2625, + 2791, 0, 2619, + 2785, 0, 2611, + 2775, 0, 2601, + 2763, 0, 2587, + 2745, 742, 2567, + 2721, 1212, 2537, + 2685, 1495, 2497, + 2633, 1714, 2435, + 2551, 1901, 2335, + 2415, 2071, 2159, + 2125, 2229, 1695, + 0, 2381, 0, + 0, 2525, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 2941, 0, 2769, + 2941, 0, 2767, + 2939, 0, 2767, + 2939, 0, 2765, + 2937, 0, 2765, + 2937, 0, 2763, + 2935, 0, 2761, + 2931, 0, 2757, + 2927, 0, 2753, + 2923, 0, 2747, + 2915, 0, 2739, + 2907, 0, 2729, + 2893, 0, 2713, + 2875, 832, 2693, + 2851, 1330, 2665, + 2815, 1619, 2623, + 2763, 1841, 2561, + 2681, 2030, 2461, + 2543, 2201, 2279, + 2251, 2361, 1793, + 0, 2511, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3073, 0, 2897, + 3073, 0, 2897, + 3071, 0, 2897, + 3071, 0, 2895, + 3071, 0, 2895, + 3069, 0, 2893, + 3067, 0, 2891, + 3065, 0, 2889, + 3063, 0, 2887, + 3059, 0, 2881, + 3053, 0, 2877, + 3047, 0, 2869, + 3037, 0, 2857, + 3025, 0, 2843, + 3007, 930, 2821, + 2981, 1451, 2793, + 2947, 1745, 2751, + 2893, 1970, 2687, + 2813, 2161, 2587, + 2673, 2331, 2401, + 2379, 2491, 1898, + 0, 2643, 0, + 0, 2789, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3027, + 3205, 0, 3027, + 3203, 0, 3027, + 3203, 0, 3027, + 3203, 0, 3025, + 3201, 0, 3025, + 3201, 0, 3023, + 3199, 0, 3021, + 3197, 0, 3019, + 3195, 0, 3015, + 3191, 0, 3011, + 3185, 0, 3005, + 3179, 0, 2997, + 3169, 0, 2987, + 3157, 0, 2973, + 3139, 1035, 2951, + 3113, 1574, 2921, + 3077, 1873, 2879, + 3025, 2099, 2815, + 2943, 2291, 2713, + 2805, 2463, 2527, + 2509, 2623, 2008, + 0, 2775, 0, + 0, 2921, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3337, 0, 3159, + 3337, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3157, + 3335, 0, 3155, + 3333, 0, 3155, + 3333, 0, 3153, + 3331, 0, 3151, + 3329, 0, 3149, + 3325, 0, 3147, + 3323, 0, 3141, + 3317, 0, 3137, + 3311, 0, 3129, + 3301, 0, 3117, + 3287, 0, 3103, + 3269, 1146, 3081, + 3245, 1700, 3051, + 3209, 2002, 3009, + 3157, 2229, 2945, + 3075, 2421, 2843, + 2935, 2593, 2653, + 2639, 2753, 2123, + 0, 2905, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4011, 0, + 3469, 0, 3289, + 3469, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3287, + 3467, 0, 3287, + 3465, 0, 3285, + 3465, 0, 3285, + 3463, 0, 3283, + 3461, 0, 3281, + 3457, 0, 3277, + 3453, 0, 3273, + 3449, 0, 3267, + 3441, 0, 3259, + 3433, 0, 3247, + 3419, 0, 3233, + 3401, 1261, 3211, + 3377, 1827, 3183, + 3341, 2131, 3139, + 3287, 2359, 3075, + 3205, 2553, 2971, + 3067, 2725, 2781, + 2769, 2885, 2243, + 0, 3037, 0, + 0, 3183, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3421, + 3601, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3419, + 3599, 0, 3417, + 3597, 0, 3417, + 3595, 0, 3415, + 3595, 0, 3413, + 3593, 0, 3411, + 3589, 0, 3409, + 3585, 0, 3403, + 3581, 0, 3397, + 3573, 0, 3389, + 3565, 0, 3379, + 3551, 0, 3363, + 3533, 1380, 3343, + 3509, 1956, 3313, + 3473, 2261, 3271, + 3419, 2491, 3205, + 3337, 2683, 3101, + 3199, 2857, 2911, + 2901, 3017, 2365, + 0, 3169, 0, + 0, 3315, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3551, + 3733, 0, 3551, + 3733, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3729, 0, 3549, + 3729, 0, 3549, + 3727, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3721, 0, 3539, + 3717, 0, 3535, + 3713, 0, 3529, + 3705, 0, 3521, + 3697, 0, 3511, + 3683, 0, 3495, + 3665, 1503, 3475, + 3641, 2085, 3445, + 3605, 2393, 3401, + 3551, 2623, 3337, + 3469, 2815, 3233, + 3329, 2989, 3041, + 3031, 3149, 2489, + 0, 3301, 0, + 0, 3447, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3853, 0, 3671, + 3849, 0, 3667, + 3845, 0, 3661, + 3837, 0, 3653, + 3829, 0, 3641, + 3815, 0, 3627, + 3797, 1627, 3605, + 3773, 2215, 3575, + 3737, 2523, 3533, + 3683, 2753, 3467, + 3601, 2947, 3363, + 3461, 3121, 3171, + 3163, 3281, 2617, + 0, 3433, 0, + 0, 3579, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3811, + 3991, 0, 3809, + 3989, 0, 3807, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3773, + 3947, 0, 3759, + 3929, 1754, 3737, + 3905, 2345, 3707, + 3869, 2655, 3665, + 3815, 2885, 3599, + 3733, 3079, 3495, + 3593, 3253, 3301, + 3295, 3413, 2743, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3905, + 4079, 0, 3891, + 4061, 1881, 3869, + 4037, 2477, 3839, + 4001, 2787, 3795, + 3947, 3017, 3731, + 3865, 3211, 3627, + 3725, 3385, 3433, + 3427, 3545, 2873, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4037, + 4095, 0, 4021, + 4095, 2010, 4001, + 4095, 2609, 3971, + 4095, 2919, 3927, + 4079, 3149, 3863, + 3997, 3343, 3757, + 3857, 3517, 3565, + 3559, 3677, 3003, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2141, 4095, + 4095, 2739, 4095, + 4095, 3049, 4059, + 4095, 3281, 3995, + 4095, 3475, 3889, + 3989, 3649, 3697, + 3691, 3809, 3133, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2271, 4095, + 4095, 2871, 4095, + 4095, 3181, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3827, + 3823, 3941, 3263, + 881, 513, 1262, + 834, 553, 1247, + 762, 601, 1225, + 645, 659, 1196, + 417, 726, 1152, + 0, 802, 1087, + 0, 888, 982, + 0, 982, 788, + 0, 1083, 222, + 0, 1191, 0, + 0, 1304, 0, + 0, 1421, 0, + 0, 1542, 0, + 0, 1665, 0, + 0, 1791, 0, + 0, 1918, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 934, 506, 1278, + 893, 547, 1263, + 831, 596, 1243, + 731, 654, 1214, + 552, 722, 1173, + 77, 799, 1111, + 0, 885, 1012, + 0, 980, 833, + 0, 1082, 361, + 0, 1190, 0, + 0, 1303, 0, + 0, 1421, 0, + 0, 1541, 0, + 0, 1665, 0, + 0, 1791, 0, + 0, 1918, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 997, 497, 1299, + 961, 539, 1285, + 908, 588, 1265, + 826, 648, 1238, + 686, 716, 1199, + 387, 794, 1140, + 0, 882, 1048, + 0, 977, 886, + 0, 1079, 498, + 0, 1188, 0, + 0, 1302, 0, + 0, 1419, 0, + 0, 1541, 0, + 0, 1664, 0, + 0, 1790, 0, + 0, 1917, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1070, 485, 1325, + 1039, 528, 1312, + 995, 579, 1294, + 928, 639, 1268, + 820, 709, 1231, + 618, 788, 1177, + 0, 876, 1093, + 0, 973, 949, + 0, 1076, 633, + 0, 1185, 0, + 0, 1299, 0, + 0, 1418, 0, + 0, 1539, 0, + 0, 1663, 0, + 0, 1789, 0, + 0, 1917, 0, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1151, 469, 1358, + 1126, 513, 1346, + 1090, 565, 1329, + 1036, 627, 1305, + 954, 699, 1272, + 812, 780, 1222, + 507, 870, 1147, + 0, 967, 1021, + 0, 1071, 768, + 0, 1182, 0, + 0, 1297, 0, + 0, 1416, 0, + 0, 1538, 0, + 0, 1662, 0, + 0, 1788, 0, + 0, 1916, 0, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1242, 446, 1399, + 1221, 492, 1387, + 1192, 547, 1372, + 1150, 611, 1351, + 1086, 685, 1320, + 985, 768, 1276, + 801, 860, 1210, + 296, 960, 1102, + 0, 1065, 902, + 0, 1177, 287, + 0, 1293, 0, + 0, 1413, 0, + 0, 1536, 0, + 0, 1661, 0, + 0, 1787, 0, + 0, 1915, 0, + 0, 2044, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1340, 413, 1448, + 1323, 462, 1438, + 1300, 520, 1424, + 1267, 588, 1405, + 1219, 666, 1378, + 1146, 752, 1340, + 1024, 847, 1283, + 785, 949, 1193, + 0, 1057, 1035, + 0, 1171, 670, + 0, 1288, 0, + 0, 1409, 0, + 0, 1533, 0, + 0, 1658, 0, + 0, 1786, 0, + 0, 1914, 0, + 0, 2043, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1445, 365, 1506, + 1432, 419, 1498, + 1414, 483, 1486, + 1388, 556, 1469, + 1352, 639, 1446, + 1298, 730, 1413, + 1215, 829, 1365, + 1072, 935, 1291, + 764, 1046, 1169, + 0, 1162, 927, + 0, 1281, 0, + 0, 1404, 0, + 0, 1529, 0, + 0, 1655, 0, + 0, 1783, 0, + 0, 1912, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1556, 291, 1575, + 1546, 354, 1567, + 1531, 427, 1557, + 1512, 509, 1542, + 1485, 600, 1523, + 1445, 699, 1495, + 1386, 804, 1455, + 1293, 915, 1396, + 1129, 1031, 1301, + 733, 1150, 1134, + 0, 1272, 724, + 0, 1397, 0, + 0, 1524, 0, + 0, 1651, 0, + 0, 1780, 0, + 0, 1910, 0, + 0, 2040, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1671, 169, 1652, + 1663, 250, 1646, + 1652, 340, 1637, + 1638, 438, 1625, + 1617, 543, 1609, + 1588, 653, 1586, + 1546, 768, 1554, + 1482, 887, 1506, + 1381, 1009, 1434, + 1196, 1134, 1315, + 689, 1260, 1084, + 0, 1388, 87, + 0, 1516, 0, + 0, 1646, 0, + 0, 1776, 0, + 0, 1907, 0, + 0, 2038, 0, + 0, 2169, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1790, 0, 1739, + 1784, 59, 1733, + 1776, 190, 1726, + 1765, 321, 1716, + 1749, 452, 1703, + 1728, 583, 1685, + 1697, 715, 1659, + 1653, 847, 1622, + 1585, 979, 1567, + 1476, 1111, 1481, + 1272, 1243, 1334, + 622, 1375, 1007, + 0, 1507, 0, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1913, 0, 1833, + 1908, 0, 1829, + 1902, 0, 1823, + 1893, 93, 1816, + 1882, 293, 1805, + 1866, 470, 1790, + 1843, 633, 1770, + 1811, 787, 1741, + 1765, 935, 1699, + 1694, 1078, 1637, + 1579, 1218, 1537, + 1357, 1357, 1357, + 514, 1493, 877, + 0, 1629, 0, + 0, 1763, 0, + 0, 1897, 0, + 0, 2031, 0, + 0, 2165, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2037, 0, 1935, + 2034, 0, 1932, + 2029, 0, 1927, + 2023, 0, 1921, + 2014, 0, 1913, + 2002, 254, 1901, + 1985, 493, 1885, + 1962, 692, 1863, + 1930, 868, 1832, + 1882, 1030, 1786, + 1809, 1184, 1716, + 1688, 1331, 1603, + 1450, 1475, 1386, + 311, 1615, 612, + 0, 1753, 0, + 0, 1890, 0, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2163, 0, 2044, + 2161, 0, 2041, + 2157, 0, 2037, + 2153, 0, 2033, + 2147, 0, 2026, + 2137, 0, 2017, + 2125, 195, 2005, + 2109, 522, 1988, + 2085, 760, 1964, + 2051, 958, 1930, + 2002, 1133, 1881, + 1927, 1295, 1805, + 1802, 1449, 1678, + 1551, 1596, 1422, + 0, 1739, 0, + 0, 1880, 0, + 0, 2018, 0, + 0, 2155, 0, + 0, 2289, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2291, 0, 2157, + 2289, 0, 2155, + 2287, 0, 2153, + 2283, 0, 2149, + 2279, 0, 2143, + 2271, 0, 2137, + 2263, 0, 2127, + 2251, 102, 2115, + 2233, 559, 2097, + 2209, 838, 2071, + 2175, 1055, 2035, + 2125, 1242, 1983, + 2049, 1412, 1901, + 1920, 1570, 1762, + 1658, 1720, 1466, + 0, 1866, 0, + 0, 2007, 0, + 0, 2147, 0, + 0, 2283, 0, + 0, 2419, 0, + 0, 2555, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2421, 0, 2275, + 2419, 0, 2273, + 2417, 0, 2271, + 2415, 0, 2269, + 2411, 0, 2265, + 2405, 0, 2259, + 2399, 0, 2251, + 2389, 0, 2241, + 2377, 0, 2229, + 2359, 603, 2209, + 2335, 925, 2183, + 2301, 1160, 2147, + 2251, 1356, 2091, + 2173, 1531, 2004, + 2041, 1693, 1855, + 1771, 1846, 1520, + 0, 1993, 0, + 0, 2137, 0, + 0, 2277, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2551, 0, 2395, + 2549, 0, 2395, + 2547, 0, 2393, + 2545, 0, 2391, + 2543, 0, 2387, + 2539, 0, 2383, + 2533, 0, 2379, + 2527, 0, 2371, + 2517, 0, 2361, + 2505, 0, 2347, + 2487, 657, 2327, + 2463, 1020, 2301, + 2429, 1270, 2261, + 2377, 1475, 2205, + 2299, 1654, 2113, + 2165, 1818, 1955, + 1888, 1973, 1583, + 0, 2121, 0, + 0, 2265, 0, + 0, 2407, 0, + 0, 2545, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2681, 0, 2519, + 2679, 0, 2519, + 2679, 0, 2517, + 2677, 0, 2515, + 2675, 0, 2513, + 2673, 0, 2511, + 2669, 0, 2505, + 2663, 0, 2501, + 2657, 0, 2493, + 2647, 0, 2483, + 2635, 0, 2469, + 2617, 720, 2449, + 2593, 1122, 2421, + 2557, 1386, 2381, + 2505, 1596, 2321, + 2425, 1779, 2229, + 2291, 1946, 2061, + 2008, 2101, 1655, + 0, 2251, 0, + 0, 2397, 0, + 0, 2537, 0, + 0, 2677, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3219, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2811, 0, 2645, + 2811, 0, 2645, + 2809, 0, 2643, + 2809, 0, 2641, + 2807, 0, 2641, + 2805, 0, 2637, + 2803, 0, 2635, + 2799, 0, 2631, + 2793, 0, 2625, + 2787, 0, 2617, + 2777, 0, 2607, + 2765, 0, 2593, + 2747, 792, 2573, + 2721, 1230, 2545, + 2687, 1505, 2503, + 2635, 1720, 2443, + 2555, 1906, 2347, + 2417, 2073, 2173, + 2131, 2231, 1736, + 0, 2381, 0, + 0, 2527, 0, + 0, 2669, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3351, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2943, 0, 2773, + 2941, 0, 2771, + 2941, 0, 2771, + 2941, 0, 2769, + 2939, 0, 2769, + 2937, 0, 2767, + 2935, 0, 2765, + 2933, 0, 2761, + 2929, 0, 2757, + 2923, 0, 2751, + 2917, 0, 2743, + 2907, 0, 2733, + 2895, 0, 2719, + 2877, 874, 2699, + 2853, 1344, 2669, + 2817, 1627, 2629, + 2765, 1846, 2567, + 2683, 2034, 2469, + 2547, 2203, 2291, + 2257, 2361, 1827, + 0, 2513, 0, + 0, 2657, 0, + 0, 2799, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3073, 0, 2901, + 3073, 0, 2901, + 3073, 0, 2899, + 3073, 0, 2899, + 3071, 0, 2897, + 3071, 0, 2897, + 3069, 0, 2895, + 3067, 0, 2893, + 3063, 0, 2889, + 3059, 0, 2885, + 3055, 0, 2879, + 3047, 0, 2871, + 3039, 0, 2861, + 3025, 0, 2847, + 3007, 964, 2825, + 2983, 1462, 2797, + 2947, 1751, 2755, + 2895, 1973, 2693, + 2813, 2163, 2593, + 2675, 2333, 2411, + 2383, 2493, 1925, + 0, 2643, 0, + 0, 2789, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3029, + 3205, 0, 3029, + 3205, 0, 3029, + 3205, 0, 3029, + 3203, 0, 3027, + 3203, 0, 3027, + 3201, 0, 3025, + 3199, 0, 3023, + 3197, 0, 3021, + 3195, 0, 3019, + 3191, 0, 3013, + 3187, 0, 3009, + 3179, 0, 3001, + 3169, 0, 2989, + 3157, 0, 2975, + 3139, 1062, 2955, + 3115, 1583, 2925, + 3079, 1877, 2883, + 3025, 2101, 2819, + 2945, 2293, 2719, + 2805, 2463, 2533, + 2513, 2623, 2030, + 0, 2775, 0, + 0, 2921, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3747, 0, + 0, 3879, 0, + 0, 4013, 0, + 3337, 0, 3159, + 3337, 0, 3159, + 3337, 0, 3159, + 3335, 0, 3159, + 3335, 0, 3159, + 3335, 0, 3157, + 3335, 0, 3157, + 3333, 0, 3155, + 3331, 0, 3153, + 3329, 0, 3151, + 3327, 0, 3149, + 3323, 0, 3143, + 3317, 0, 3137, + 3311, 0, 3129, + 3301, 0, 3119, + 3289, 0, 3105, + 3271, 1167, 3083, + 3245, 1707, 3055, + 3209, 2005, 3011, + 3157, 2231, 2947, + 3075, 2423, 2845, + 2937, 2595, 2659, + 2641, 2755, 2141, + 0, 2907, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4011, 0, + 3469, 0, 3291, + 3469, 0, 3291, + 3469, 0, 3291, + 3469, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3467, 0, 3289, + 3465, 0, 3287, + 3465, 0, 3285, + 3463, 0, 3283, + 3461, 0, 3281, + 3459, 0, 3279, + 3455, 0, 3275, + 3449, 0, 3269, + 3443, 0, 3261, + 3433, 0, 3249, + 3419, 0, 3235, + 3403, 1278, 3213, + 3377, 1832, 3183, + 3341, 2133, 3141, + 3289, 2361, 3077, + 3207, 2553, 2975, + 3067, 2725, 2785, + 2771, 2885, 2255, + 0, 3037, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3421, + 3601, 0, 3421, + 3601, 0, 3421, + 3601, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3419, + 3599, 0, 3419, + 3597, 0, 3417, + 3597, 0, 3417, + 3595, 0, 3415, + 3593, 0, 3413, + 3589, 0, 3409, + 3587, 0, 3405, + 3581, 0, 3399, + 3573, 0, 3391, + 3565, 0, 3379, + 3551, 0, 3365, + 3533, 1393, 3345, + 3509, 1959, 3315, + 3473, 2263, 3271, + 3419, 2491, 3207, + 3339, 2685, 3103, + 3199, 2857, 2913, + 2901, 3017, 2375, + 0, 3169, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3731, 0, 3551, + 3729, 0, 3549, + 3729, 0, 3547, + 3727, 0, 3545, + 3725, 0, 3543, + 3721, 0, 3541, + 3717, 0, 3535, + 3713, 0, 3531, + 3705, 0, 3521, + 3697, 0, 3511, + 3683, 0, 3495, + 3665, 1513, 3475, + 3641, 2087, 3445, + 3605, 2393, 3403, + 3551, 2623, 3337, + 3469, 2817, 3233, + 3331, 2989, 3043, + 3033, 3149, 2497, + 0, 3301, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3683, + 3865, 0, 3683, + 3865, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3681, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3677, + 3857, 0, 3675, + 3853, 0, 3671, + 3849, 0, 3667, + 3845, 0, 3661, + 3837, 0, 3653, + 3829, 0, 3643, + 3815, 0, 3627, + 3797, 1635, 3607, + 3773, 2217, 3577, + 3737, 2525, 3533, + 3683, 2755, 3469, + 3601, 2947, 3365, + 3461, 3121, 3173, + 3163, 3281, 2621, + 0, 3433, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3989, 0, 3807, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3773, + 3947, 0, 3759, + 3929, 1759, 3737, + 3905, 2347, 3707, + 3869, 2655, 3665, + 3815, 2885, 3599, + 3733, 3079, 3495, + 3593, 3253, 3303, + 3295, 3413, 2749, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3905, + 4079, 0, 3891, + 4061, 1886, 3869, + 4037, 2477, 3839, + 4001, 2787, 3797, + 3947, 3017, 3731, + 3865, 3211, 3627, + 3725, 3385, 3435, + 3427, 3545, 2877, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4037, + 4095, 0, 4023, + 4095, 2014, 4001, + 4095, 2609, 3971, + 4095, 2919, 3929, + 4079, 3149, 3863, + 3997, 3343, 3759, + 3857, 3517, 3565, + 3559, 3677, 3005, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2143, 4095, + 4095, 2741, 4095, + 4095, 3051, 4059, + 4095, 3281, 3995, + 4095, 3475, 3891, + 3989, 3649, 3697, + 3691, 3809, 3135, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2273, 4095, + 4095, 2871, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4021, + 4095, 3781, 3829, + 3823, 3941, 3265, + 1004, 617, 1393, + 969, 649, 1381, + 916, 689, 1366, + 836, 737, 1344, + 699, 794, 1313, + 412, 861, 1269, + 0, 937, 1201, + 0, 1022, 1091, + 0, 1116, 884, + 0, 1217, 213, + 0, 1324, 0, + 0, 1437, 0, + 0, 1554, 0, + 0, 1675, 0, + 0, 1798, 0, + 0, 1923, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1045, 612, 1405, + 1013, 645, 1394, + 966, 685, 1379, + 895, 733, 1358, + 777, 791, 1328, + 549, 858, 1284, + 0, 935, 1219, + 0, 1020, 1114, + 0, 1114, 920, + 0, 1216, 354, + 0, 1323, 0, + 0, 1436, 0, + 0, 1554, 0, + 0, 1674, 0, + 0, 1798, 0, + 0, 1923, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1095, 605, 1421, + 1066, 638, 1410, + 1025, 679, 1395, + 963, 728, 1375, + 864, 786, 1346, + 684, 854, 1305, + 209, 931, 1243, + 0, 1018, 1144, + 0, 1112, 965, + 0, 1214, 493, + 0, 1322, 0, + 0, 1435, 0, + 0, 1553, 0, + 0, 1674, 0, + 0, 1797, 0, + 0, 1923, 0, + 0, 2049, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1154, 596, 1441, + 1129, 629, 1431, + 1093, 671, 1417, + 1040, 721, 1397, + 958, 780, 1370, + 818, 848, 1331, + 519, 927, 1272, + 0, 1014, 1180, + 0, 1109, 1018, + 0, 1211, 630, + 0, 1320, 0, + 0, 1434, 0, + 0, 1552, 0, + 0, 1673, 0, + 0, 1796, 0, + 0, 1922, 0, + 0, 2049, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1223, 583, 1467, + 1202, 617, 1457, + 1171, 660, 1444, + 1127, 711, 1426, + 1060, 771, 1400, + 952, 841, 1363, + 750, 920, 1309, + 121, 1009, 1225, + 0, 1105, 1081, + 0, 1208, 765, + 0, 1317, 0, + 0, 1432, 0, + 0, 1550, 0, + 0, 1671, 0, + 0, 1796, 0, + 0, 1922, 0, + 0, 2049, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1301, 565, 1499, + 1283, 601, 1490, + 1258, 645, 1478, + 1222, 697, 1461, + 1168, 759, 1437, + 1085, 831, 1404, + 944, 912, 1354, + 639, 1002, 1279, + 0, 1099, 1153, + 0, 1204, 900, + 0, 1314, 0, + 0, 1429, 0, + 0, 1548, 0, + 0, 1670, 0, + 0, 1794, 0, + 0, 1921, 0, + 0, 2049, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1389, 540, 1539, + 1374, 578, 1531, + 1353, 624, 1520, + 1324, 679, 1504, + 1282, 743, 1483, + 1219, 817, 1452, + 1117, 900, 1408, + 933, 992, 1342, + 429, 1091, 1234, + 0, 1197, 1034, + 0, 1309, 419, + 0, 1425, 0, + 0, 1545, 0, + 0, 1668, 0, + 0, 1793, 0, + 0, 1919, 0, + 0, 2047, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1484, 504, 1587, + 1472, 545, 1580, + 1456, 594, 1570, + 1432, 652, 1556, + 1400, 721, 1537, + 1351, 798, 1510, + 1278, 885, 1472, + 1157, 979, 1415, + 917, 1081, 1325, + 0, 1189, 1167, + 0, 1303, 802, + 0, 1420, 0, + 0, 1541, 0, + 0, 1665, 0, + 0, 1790, 0, + 0, 1918, 0, + 0, 2046, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1587, 451, 1645, + 1577, 497, 1639, + 1564, 551, 1630, + 1546, 615, 1618, + 1520, 688, 1601, + 1484, 771, 1578, + 1430, 862, 1545, + 1347, 961, 1497, + 1204, 1067, 1423, + 896, 1178, 1301, + 0, 1294, 1059, + 0, 1414, 0, + 0, 1536, 0, + 0, 1661, 0, + 0, 1788, 0, + 0, 1915, 0, + 0, 2044, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1695, 369, 1712, + 1688, 423, 1707, + 1678, 486, 1699, + 1664, 559, 1689, + 1644, 641, 1675, + 1617, 732, 1655, + 1577, 831, 1627, + 1518, 936, 1587, + 1425, 1047, 1528, + 1261, 1163, 1434, + 865, 1282, 1266, + 0, 1404, 856, + 0, 1529, 0, + 0, 1656, 0, + 0, 1784, 0, + 0, 1912, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1809, 230, 1789, + 1803, 301, 1784, + 1795, 382, 1778, + 1785, 472, 1769, + 1770, 570, 1757, + 1749, 675, 1741, + 1720, 785, 1718, + 1678, 900, 1686, + 1614, 1019, 1638, + 1513, 1141, 1566, + 1328, 1266, 1448, + 821, 1392, 1216, + 0, 1520, 219, + 0, 1649, 0, + 0, 1778, 0, + 0, 1908, 0, + 0, 2039, 0, + 0, 2171, 0, + 0, 2301, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1927, 0, 1875, + 1923, 61, 1871, + 1917, 191, 1865, + 1908, 322, 1858, + 1897, 453, 1849, + 1881, 584, 1835, + 1860, 716, 1817, + 1829, 847, 1791, + 1785, 979, 1754, + 1717, 1111, 1699, + 1608, 1243, 1613, + 1404, 1375, 1466, + 754, 1507, 1139, + 0, 1639, 0, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2049, 0, 1969, + 2045, 0, 1966, + 2040, 0, 1961, + 2034, 0, 1955, + 2025, 225, 1948, + 2014, 425, 1937, + 1998, 602, 1922, + 1975, 765, 1902, + 1943, 919, 1873, + 1897, 1067, 1831, + 1827, 1210, 1769, + 1711, 1351, 1669, + 1489, 1489, 1489, + 646, 1625, 1009, + 0, 1761, 0, + 0, 1896, 0, + 0, 2029, 0, + 0, 2163, 0, + 0, 2297, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2173, 0, 2071, + 2169, 0, 2067, + 2165, 0, 2065, + 2161, 0, 2059, + 2155, 0, 2053, + 2145, 53, 2045, + 2135, 386, 2033, + 2117, 625, 2017, + 2095, 824, 1995, + 2061, 1000, 1964, + 2014, 1162, 1918, + 1941, 1316, 1848, + 1820, 1464, 1735, + 1582, 1607, 1518, + 443, 1747, 744, + 0, 1885, 0, + 0, 2022, 0, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2297, 0, 2177, + 2295, 0, 2175, + 2293, 0, 2173, + 2289, 0, 2169, + 2285, 0, 2165, + 2279, 0, 2159, + 2269, 0, 2149, + 2257, 327, 2137, + 2241, 655, 2119, + 2217, 892, 2097, + 2183, 1090, 2063, + 2135, 1265, 2013, + 2059, 1428, 1937, + 1934, 1581, 1810, + 1683, 1728, 1554, + 0, 1871, 0, + 0, 2012, 0, + 0, 2149, 0, + 0, 2287, 0, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2425, 0, 2291, + 2423, 0, 2289, + 2421, 0, 2287, + 2419, 0, 2285, + 2415, 0, 2281, + 2411, 0, 2275, + 2403, 0, 2269, + 2395, 0, 2259, + 2383, 234, 2247, + 2365, 691, 2229, + 2341, 970, 2203, + 2307, 1188, 2167, + 2257, 1374, 2115, + 2181, 1544, 2033, + 2051, 1702, 1894, + 1790, 1852, 1599, + 0, 1998, 0, + 0, 2139, 0, + 0, 2279, 0, + 0, 2417, 0, + 0, 2553, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2553, 0, 2409, + 2553, 0, 2407, + 2551, 0, 2405, + 2549, 0, 2403, + 2547, 0, 2401, + 2543, 0, 2397, + 2537, 0, 2391, + 2531, 0, 2383, + 2521, 0, 2375, + 2509, 69, 2361, + 2491, 735, 2343, + 2467, 1057, 2315, + 2433, 1292, 2279, + 2383, 1489, 2223, + 2305, 1663, 2137, + 2173, 1825, 1987, + 1903, 1978, 1652, + 0, 2125, 0, + 0, 2269, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2683, 0, 2529, + 2683, 0, 2527, + 2681, 0, 2527, + 2679, 0, 2525, + 2677, 0, 2523, + 2675, 0, 2519, + 2671, 0, 2515, + 2667, 0, 2511, + 2659, 0, 2503, + 2651, 0, 2493, + 2637, 0, 2479, + 2619, 789, 2459, + 2595, 1152, 2433, + 2561, 1403, 2395, + 2509, 1607, 2337, + 2431, 1786, 2245, + 2297, 1951, 2087, + 2020, 2105, 1715, + 0, 2253, 0, + 0, 2397, 0, + 0, 2539, 0, + 0, 2677, 0, + 0, 2815, 0, + 0, 2949, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2813, 0, 2653, + 2813, 0, 2651, + 2811, 0, 2651, + 2811, 0, 2649, + 2809, 0, 2647, + 2807, 0, 2645, + 2805, 0, 2643, + 2801, 0, 2639, + 2795, 0, 2633, + 2789, 0, 2625, + 2779, 0, 2615, + 2767, 0, 2601, + 2749, 852, 2581, + 2725, 1254, 2553, + 2689, 1518, 2513, + 2637, 1728, 2455, + 2557, 1911, 2361, + 2423, 2077, 2193, + 2141, 2235, 1787, + 0, 2383, 0, + 0, 2529, 0, + 0, 2669, 0, + 0, 2809, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2943, 0, 2777, + 2943, 0, 2777, + 2943, 0, 2777, + 2941, 0, 2775, + 2941, 0, 2775, + 2939, 0, 2773, + 2937, 0, 2771, + 2935, 0, 2767, + 2931, 0, 2763, + 2925, 0, 2757, + 2919, 0, 2749, + 2909, 0, 2739, + 2897, 0, 2725, + 2879, 924, 2705, + 2855, 1363, 2677, + 2819, 1637, 2635, + 2767, 1852, 2575, + 2687, 2038, 2479, + 2549, 2207, 2305, + 2263, 2363, 1869, + 0, 2513, 0, + 0, 2659, 0, + 0, 2801, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3483, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3075, 0, 2905, + 3075, 0, 2905, + 3073, 0, 2903, + 3073, 0, 2903, + 3073, 0, 2903, + 3071, 0, 2901, + 3069, 0, 2899, + 3067, 0, 2897, + 3065, 0, 2893, + 3061, 0, 2889, + 3055, 0, 2883, + 3049, 0, 2875, + 3039, 0, 2865, + 3027, 0, 2851, + 3009, 1006, 2831, + 2985, 1476, 2801, + 2949, 1759, 2761, + 2897, 1978, 2699, + 2815, 2165, 2601, + 2679, 2335, 2423, + 2389, 2493, 1959, + 0, 2645, 0, + 0, 2791, 0, + 0, 2931, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3615, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3205, 0, 3033, + 3205, 0, 3033, + 3205, 0, 3033, + 3205, 0, 3031, + 3205, 0, 3031, + 3203, 0, 3031, + 3203, 0, 3029, + 3201, 0, 3027, + 3199, 0, 3025, + 3195, 0, 3021, + 3193, 0, 3017, + 3187, 0, 3011, + 3181, 0, 3003, + 3171, 0, 2993, + 3157, 0, 2979, + 3141, 1096, 2957, + 3115, 1594, 2929, + 3079, 1883, 2887, + 3027, 2105, 2825, + 2945, 2295, 2725, + 2807, 2465, 2543, + 2515, 2625, 2057, + 0, 2775, 0, + 0, 2921, 0, + 0, 3063, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3747, 0, + 0, 3879, 0, + 0, 4013, 0, + 3337, 0, 3163, + 3337, 0, 3163, + 3337, 0, 3161, + 3337, 0, 3161, + 3337, 0, 3161, + 3335, 0, 3161, + 3335, 0, 3159, + 3333, 0, 3157, + 3331, 0, 3155, + 3329, 0, 3153, + 3327, 0, 3151, + 3323, 0, 3147, + 3319, 0, 3141, + 3311, 0, 3133, + 3301, 0, 3121, + 3289, 0, 3107, + 3271, 1194, 3087, + 3247, 1715, 3057, + 3211, 2010, 3015, + 3157, 2233, 2951, + 3077, 2425, 2851, + 2937, 2595, 2665, + 2645, 2755, 2161, + 0, 2907, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4011, 0, + 3469, 0, 3293, + 3469, 0, 3293, + 3469, 0, 3291, + 3469, 0, 3291, + 3469, 0, 3291, + 3467, 0, 3291, + 3467, 0, 3289, + 3467, 0, 3289, + 3465, 0, 3287, + 3463, 0, 3285, + 3461, 0, 3283, + 3459, 0, 3281, + 3455, 0, 3275, + 3449, 0, 3269, + 3443, 0, 3263, + 3433, 0, 3251, + 3421, 0, 3237, + 3403, 1299, 3215, + 3377, 1839, 3187, + 3341, 2137, 3143, + 3289, 2363, 3079, + 3207, 2555, 2977, + 3069, 2727, 2791, + 2773, 2887, 2273, + 0, 3039, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3421, + 3599, 0, 3421, + 3597, 0, 3419, + 3597, 0, 3417, + 3595, 0, 3417, + 3593, 0, 3413, + 3591, 0, 3411, + 3587, 0, 3407, + 3581, 0, 3401, + 3575, 0, 3393, + 3565, 0, 3381, + 3553, 0, 3367, + 3535, 1410, 3345, + 3509, 1964, 3317, + 3473, 2267, 3273, + 3421, 2493, 3209, + 3339, 2685, 3107, + 3199, 2857, 2917, + 2903, 3019, 2389, + 0, 3169, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3733, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3551, + 3731, 0, 3551, + 3729, 0, 3551, + 3729, 0, 3549, + 3727, 0, 3547, + 3725, 0, 3545, + 3721, 0, 3541, + 3719, 0, 3537, + 3713, 0, 3531, + 3707, 0, 3523, + 3697, 0, 3513, + 3683, 0, 3497, + 3665, 1525, 3477, + 3641, 2091, 3447, + 3605, 2395, 3403, + 3553, 2625, 3339, + 3471, 2817, 3235, + 3331, 2989, 3045, + 3033, 3149, 2507, + 0, 3301, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3863, 0, 3683, + 3861, 0, 3681, + 3861, 0, 3679, + 3859, 0, 3679, + 3857, 0, 3675, + 3853, 0, 3673, + 3851, 0, 3669, + 3845, 0, 3663, + 3837, 0, 3655, + 3829, 0, 3643, + 3815, 0, 3629, + 3797, 1645, 3607, + 3773, 2221, 3577, + 3737, 2527, 3535, + 3683, 2755, 3469, + 3601, 2949, 3367, + 3463, 3121, 3175, + 3165, 3281, 2629, + 0, 3433, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3815, + 3997, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3813, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3809, + 3989, 0, 3807, + 3985, 0, 3803, + 3981, 0, 3799, + 3977, 0, 3793, + 3969, 0, 3785, + 3961, 0, 3775, + 3947, 0, 3759, + 3929, 1767, 3739, + 3905, 2349, 3709, + 3869, 2657, 3665, + 3815, 2887, 3601, + 3733, 3079, 3497, + 3593, 3253, 3305, + 3295, 3413, 2755, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3907, + 4079, 0, 3891, + 4061, 1892, 3869, + 4037, 2479, 3841, + 4001, 2787, 3797, + 3947, 3017, 3733, + 3865, 3211, 3627, + 3725, 3385, 3435, + 3427, 3545, 2881, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4037, + 4095, 0, 4023, + 4095, 2018, 4001, + 4095, 2611, 3971, + 4095, 2919, 3929, + 4079, 3149, 3863, + 3997, 3343, 3759, + 3857, 3517, 3567, + 3559, 3677, 3009, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2145, 4095, + 4095, 2741, 4095, + 4095, 3051, 4061, + 4095, 3281, 3995, + 4095, 3475, 3891, + 3989, 3649, 3697, + 3691, 3809, 3137, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2275, 4095, + 4095, 2873, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4023, + 4095, 3781, 3829, + 3823, 3941, 3267, + 1129, 728, 1524, + 1102, 753, 1516, + 1064, 785, 1504, + 1008, 824, 1488, + 919, 872, 1466, + 763, 929, 1434, + 407, 995, 1388, + 0, 1071, 1319, + 0, 1156, 1205, + 0, 1249, 987, + 0, 1350, 201, + 0, 1457, 0, + 0, 1570, 0, + 0, 1687, 0, + 0, 1807, 0, + 0, 1930, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1161, 724, 1533, + 1136, 750, 1525, + 1100, 782, 1514, + 1048, 821, 1498, + 968, 869, 1476, + 832, 926, 1445, + 544, 993, 1401, + 0, 1069, 1333, + 0, 1154, 1223, + 0, 1248, 1016, + 0, 1349, 345, + 0, 1456, 0, + 0, 1569, 0, + 0, 1686, 0, + 0, 1807, 0, + 0, 1930, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1200, 719, 1545, + 1177, 745, 1537, + 1145, 777, 1526, + 1098, 817, 1511, + 1026, 865, 1490, + 909, 923, 1460, + 681, 990, 1417, + 0, 1066, 1351, + 0, 1152, 1246, + 0, 1246, 1052, + 0, 1348, 486, + 0, 1455, 0, + 0, 1568, 0, + 0, 1686, 0, + 0, 1806, 0, + 0, 1930, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1248, 711, 1561, + 1227, 738, 1553, + 1198, 770, 1542, + 1157, 811, 1528, + 1095, 860, 1507, + 996, 918, 1478, + 816, 986, 1437, + 341, 1063, 1375, + 0, 1149, 1276, + 0, 1244, 1097, + 0, 1346, 625, + 0, 1454, 0, + 0, 1567, 0, + 0, 1685, 0, + 0, 1806, 0, + 0, 1929, 0, + 0, 2055, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1304, 701, 1581, + 1286, 728, 1573, + 1261, 762, 1563, + 1225, 803, 1549, + 1172, 853, 1530, + 1090, 912, 1502, + 951, 981, 1463, + 651, 1058, 1405, + 0, 1146, 1312, + 0, 1241, 1150, + 0, 1343, 762, + 0, 1452, 0, + 0, 1566, 0, + 0, 1684, 0, + 0, 1805, 0, + 0, 1929, 0, + 0, 2055, 0, + 0, 2181, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1371, 688, 1606, + 1355, 715, 1599, + 1334, 750, 1589, + 1303, 792, 1576, + 1259, 843, 1558, + 1192, 903, 1532, + 1084, 973, 1496, + 882, 1052, 1441, + 253, 1140, 1357, + 0, 1237, 1213, + 0, 1340, 897, + 0, 1449, 0, + 0, 1564, 0, + 0, 1682, 0, + 0, 1804, 0, + 0, 1928, 0, + 0, 2053, 0, + 0, 2181, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1447, 669, 1638, + 1434, 697, 1631, + 1416, 733, 1622, + 1390, 777, 1610, + 1354, 829, 1593, + 1301, 891, 1569, + 1218, 963, 1536, + 1076, 1044, 1486, + 771, 1134, 1411, + 0, 1231, 1285, + 0, 1336, 1032, + 0, 1446, 0, + 0, 1561, 0, + 0, 1680, 0, + 0, 1802, 0, + 0, 1926, 0, + 0, 2053, 0, + 0, 2181, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1532, 642, 1677, + 1521, 672, 1671, + 1506, 710, 1663, + 1485, 756, 1652, + 1456, 811, 1636, + 1414, 875, 1615, + 1351, 949, 1585, + 1249, 1032, 1541, + 1065, 1124, 1474, + 561, 1224, 1367, + 0, 1330, 1166, + 0, 1441, 551, + 0, 1557, 0, + 0, 1677, 0, + 0, 1800, 0, + 0, 1925, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1625, 603, 1725, + 1616, 636, 1720, + 1604, 677, 1712, + 1588, 726, 1702, + 1565, 785, 1688, + 1532, 853, 1669, + 1484, 930, 1643, + 1410, 1017, 1604, + 1289, 1111, 1547, + 1049, 1213, 1457, + 0, 1321, 1300, + 0, 1435, 934, + 0, 1552, 0, + 0, 1673, 0, + 0, 1797, 0, + 0, 1923, 0, + 0, 2049, 0, + 0, 2179, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1726, 546, 1782, + 1719, 583, 1777, + 1709, 629, 1771, + 1696, 683, 1762, + 1678, 747, 1750, + 1653, 820, 1733, + 1616, 903, 1710, + 1563, 994, 1677, + 1479, 1093, 1629, + 1336, 1199, 1555, + 1028, 1310, 1433, + 0, 1426, 1191, + 0, 1546, 0, + 0, 1668, 0, + 0, 1793, 0, + 0, 1920, 0, + 0, 2047, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1833, 456, 1848, + 1827, 501, 1844, + 1820, 555, 1839, + 1810, 618, 1831, + 1796, 691, 1821, + 1776, 774, 1807, + 1749, 864, 1787, + 1709, 963, 1759, + 1650, 1068, 1719, + 1558, 1179, 1660, + 1393, 1295, 1566, + 997, 1414, 1398, + 0, 1537, 988, + 0, 1661, 0, + 0, 1788, 0, + 0, 1916, 0, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1946, 299, 1925, + 1941, 362, 1921, + 1935, 433, 1916, + 1928, 514, 1910, + 1917, 604, 1901, + 1902, 702, 1889, + 1881, 807, 1873, + 1852, 917, 1850, + 1810, 1032, 1818, + 1746, 1151, 1771, + 1645, 1273, 1698, + 1460, 1398, 1580, + 953, 1524, 1348, + 0, 1652, 351, + 0, 1781, 0, + 0, 1910, 0, + 0, 2041, 0, + 0, 2171, 0, + 0, 2303, 0, + 0, 2433, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2063, 0, 2010, + 2059, 63, 2007, + 2055, 193, 2003, + 2049, 323, 1998, + 2040, 454, 1990, + 2029, 585, 1981, + 2014, 716, 1967, + 1992, 848, 1949, + 1961, 979, 1923, + 1917, 1111, 1886, + 1850, 1243, 1831, + 1740, 1375, 1745, + 1536, 1507, 1598, + 886, 1639, 1271, + 0, 1771, 0, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2183, 0, 2103, + 2181, 0, 2101, + 2177, 0, 2097, + 2173, 0, 2093, + 2167, 115, 2087, + 2157, 358, 2079, + 2145, 557, 2069, + 2129, 734, 2055, + 2107, 897, 2034, + 2075, 1051, 2005, + 2029, 1199, 1964, + 1959, 1342, 1901, + 1843, 1483, 1801, + 1621, 1621, 1621, + 778, 1758, 1141, + 0, 1893, 0, + 0, 2028, 0, + 0, 2161, 0, + 0, 2295, 0, + 0, 2429, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2307, 0, 2205, + 2305, 0, 2203, + 2301, 0, 2199, + 2299, 0, 2197, + 2293, 0, 2191, + 2287, 0, 2185, + 2279, 185, 2177, + 2267, 518, 2165, + 2249, 757, 2149, + 2227, 956, 2127, + 2193, 1132, 2095, + 2145, 1295, 2051, + 2073, 1448, 1981, + 1952, 1596, 1867, + 1714, 1739, 1650, + 575, 1879, 876, + 0, 2018, 0, + 0, 2155, 0, + 0, 2289, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2431, 0, 2311, + 2429, 0, 2309, + 2427, 0, 2307, + 2425, 0, 2305, + 2421, 0, 2301, + 2417, 0, 2297, + 2411, 0, 2291, + 2401, 0, 2281, + 2389, 459, 2269, + 2373, 787, 2251, + 2349, 1024, 2229, + 2315, 1222, 2195, + 2267, 1398, 2145, + 2191, 1560, 2069, + 2065, 1713, 1942, + 1815, 1860, 1686, + 0, 2004, 0, + 0, 2143, 0, + 0, 2281, 0, + 0, 2419, 0, + 0, 2553, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2559, 0, 2425, + 2557, 0, 2423, + 2555, 0, 2421, + 2553, 0, 2419, + 2551, 0, 2417, + 2547, 0, 2413, + 2543, 0, 2407, + 2535, 0, 2401, + 2527, 0, 2391, + 2515, 366, 2379, + 2497, 823, 2361, + 2473, 1102, 2335, + 2439, 1320, 2299, + 2389, 1507, 2247, + 2313, 1676, 2165, + 2183, 1834, 2026, + 1923, 1984, 1731, + 0, 2129, 0, + 0, 2271, 0, + 0, 2411, 0, + 0, 2549, 0, + 0, 2685, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2687, 0, 2541, + 2685, 0, 2541, + 2685, 0, 2539, + 2683, 0, 2537, + 2681, 0, 2535, + 2679, 0, 2533, + 2675, 0, 2529, + 2669, 0, 2523, + 2663, 0, 2515, + 2653, 0, 2507, + 2641, 201, 2493, + 2625, 868, 2475, + 2599, 1189, 2449, + 2565, 1424, 2411, + 2515, 1621, 2355, + 2437, 1796, 2269, + 2305, 1957, 2119, + 2035, 2111, 1784, + 0, 2257, 0, + 0, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2815, 0, 2661, + 2815, 0, 2661, + 2815, 0, 2659, + 2813, 0, 2659, + 2811, 0, 2657, + 2809, 0, 2655, + 2807, 0, 2651, + 2803, 0, 2647, + 2799, 0, 2643, + 2791, 0, 2635, + 2783, 0, 2625, + 2769, 0, 2611, + 2753, 921, 2591, + 2727, 1284, 2565, + 2693, 1535, 2527, + 2641, 1739, 2469, + 2563, 1918, 2379, + 2429, 2083, 2219, + 2153, 2237, 1847, + 0, 2387, 0, + 0, 2531, 0, + 0, 2671, 0, + 0, 2809, 0, + 0, 2947, 0, + 0, 3081, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2945, 0, 2785, + 2945, 0, 2785, + 2945, 0, 2783, + 2943, 0, 2783, + 2943, 0, 2781, + 2941, 0, 2779, + 2939, 0, 2777, + 2937, 0, 2775, + 2933, 0, 2771, + 2927, 0, 2765, + 2921, 0, 2757, + 2911, 0, 2747, + 2899, 0, 2733, + 2881, 984, 2713, + 2857, 1386, 2685, + 2821, 1650, 2645, + 2769, 1860, 2587, + 2689, 2043, 2493, + 2555, 2209, 2325, + 2273, 2367, 1919, + 0, 2515, 0, + 0, 2661, 0, + 0, 2801, 0, + 0, 2941, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3077, 0, 2911, + 3075, 0, 2909, + 3075, 0, 2909, + 3075, 0, 2909, + 3073, 0, 2907, + 3073, 0, 2907, + 3071, 0, 2905, + 3069, 0, 2903, + 3067, 0, 2899, + 3063, 0, 2895, + 3057, 0, 2889, + 3051, 0, 2881, + 3041, 0, 2871, + 3029, 0, 2857, + 3011, 1056, 2837, + 2987, 1495, 2809, + 2951, 1769, 2767, + 2899, 1984, 2707, + 2819, 2169, 2611, + 2683, 2339, 2439, + 2395, 2495, 2001, + 0, 2645, 0, + 0, 2791, 0, + 0, 2933, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3207, 0, 3037, + 3207, 0, 3037, + 3207, 0, 3037, + 3207, 0, 3035, + 3205, 0, 3035, + 3205, 0, 3035, + 3203, 0, 3033, + 3201, 0, 3031, + 3199, 0, 3029, + 3197, 0, 3025, + 3193, 0, 3021, + 3189, 0, 3015, + 3181, 0, 3007, + 3171, 0, 2997, + 3159, 0, 2983, + 3141, 1138, 2963, + 3117, 1608, 2933, + 3081, 1891, 2893, + 3029, 2111, 2831, + 2947, 2297, 2733, + 2811, 2467, 2555, + 2521, 2625, 2091, + 0, 2777, 0, + 0, 2923, 0, + 0, 3065, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3611, 0, + 0, 3747, 0, + 0, 3879, 0, + 0, 4013, 0, + 3339, 0, 3165, + 3339, 0, 3165, + 3337, 0, 3165, + 3337, 0, 3165, + 3337, 0, 3163, + 3337, 0, 3163, + 3335, 0, 3163, + 3335, 0, 3161, + 3333, 0, 3159, + 3331, 0, 3157, + 3327, 0, 3153, + 3325, 0, 3149, + 3319, 0, 3143, + 3313, 0, 3135, + 3303, 0, 3125, + 3289, 0, 3111, + 3273, 1228, 3089, + 3247, 1726, 3061, + 3211, 2015, 3019, + 3159, 2237, 2957, + 3077, 2427, 2857, + 2941, 2597, 2675, + 2649, 2757, 2189, + 0, 2907, 0, + 0, 3053, 0, + 0, 3195, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3743, 0, + 0, 3879, 0, + 0, 4013, 0, + 3469, 0, 3295, + 3469, 0, 3295, + 3469, 0, 3295, + 3469, 0, 3293, + 3469, 0, 3293, + 3469, 0, 3293, + 3467, 0, 3293, + 3467, 0, 3291, + 3465, 0, 3289, + 3465, 0, 3289, + 3461, 0, 3285, + 3459, 0, 3283, + 3455, 0, 3279, + 3451, 0, 3273, + 3443, 0, 3265, + 3435, 0, 3253, + 3421, 0, 3239, + 3403, 1326, 3219, + 3379, 1847, 3189, + 3343, 2141, 3147, + 3291, 2365, 3083, + 3209, 2557, 2983, + 3071, 2727, 2797, + 2777, 2887, 2295, + 0, 3039, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3875, 0, + 0, 4011, 0, + 3601, 0, 3425, + 3601, 0, 3425, + 3601, 0, 3425, + 3601, 0, 3423, + 3601, 0, 3423, + 3601, 0, 3423, + 3599, 0, 3423, + 3599, 0, 3421, + 3599, 0, 3421, + 3597, 0, 3419, + 3595, 0, 3417, + 3593, 0, 3415, + 3591, 0, 3413, + 3587, 0, 3407, + 3581, 0, 3403, + 3575, 0, 3395, + 3565, 0, 3383, + 3553, 0, 3369, + 3535, 1431, 3347, + 3509, 1971, 3319, + 3473, 2269, 3275, + 3421, 2495, 3213, + 3339, 2687, 3109, + 3201, 2859, 2923, + 2905, 3019, 2405, + 0, 3171, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4007, 0, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3733, 0, 3555, + 3731, 0, 3553, + 3731, 0, 3553, + 3731, 0, 3553, + 3729, 0, 3551, + 3729, 0, 3551, + 3727, 0, 3549, + 3725, 0, 3545, + 3723, 0, 3543, + 3719, 0, 3539, + 3713, 0, 3533, + 3707, 0, 3525, + 3697, 0, 3513, + 3685, 0, 3499, + 3667, 1542, 3477, + 3641, 2097, 3449, + 3605, 2399, 3405, + 3553, 2625, 3341, + 3471, 2817, 3239, + 3331, 2991, 3049, + 3035, 3151, 2521, + 0, 3303, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3865, 0, 3685, + 3863, 0, 3685, + 3863, 0, 3683, + 3863, 0, 3683, + 3861, 0, 3683, + 3861, 0, 3681, + 3859, 0, 3679, + 3857, 0, 3677, + 3855, 0, 3673, + 3851, 0, 3669, + 3845, 0, 3663, + 3839, 0, 3655, + 3829, 0, 3645, + 3815, 0, 3629, + 3797, 1658, 3609, + 3773, 2223, 3579, + 3737, 2527, 3535, + 3685, 2757, 3471, + 3603, 2949, 3369, + 3463, 3121, 3177, + 3165, 3281, 2639, + 0, 3433, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3815, + 3995, 0, 3815, + 3995, 0, 3815, + 3993, 0, 3813, + 3993, 0, 3811, + 3991, 0, 3811, + 3989, 0, 3807, + 3985, 0, 3805, + 3983, 0, 3801, + 3977, 0, 3795, + 3971, 0, 3787, + 3961, 0, 3775, + 3947, 0, 3761, + 3929, 1777, 3739, + 3905, 2353, 3709, + 3869, 2659, 3667, + 3815, 2887, 3603, + 3733, 3081, 3499, + 3595, 3253, 3307, + 3297, 3413, 2761, + 0, 3565, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3931, + 4095, 0, 3925, + 4095, 0, 3917, + 4093, 0, 3907, + 4079, 0, 3891, + 4061, 1899, 3871, + 4037, 2481, 3841, + 4001, 2789, 3797, + 3947, 3019, 3733, + 3865, 3211, 3629, + 3727, 3385, 3437, + 3429, 3545, 2887, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4067, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4039, + 4095, 0, 4023, + 4095, 2024, 4001, + 4095, 2611, 3973, + 4095, 2919, 3929, + 4079, 3149, 3865, + 3997, 3343, 3759, + 3857, 3517, 3567, + 3559, 3677, 3013, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2151, 4095, + 4095, 2743, 4095, + 4095, 3051, 4061, + 4095, 3281, 3995, + 4095, 3475, 3891, + 3989, 3649, 3699, + 3691, 3809, 3141, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2277, 4095, + 4095, 2873, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4023, + 4095, 3781, 3829, + 3823, 3941, 3269, + 1256, 844, 1656, + 1236, 863, 1649, + 1208, 888, 1641, + 1167, 920, 1629, + 1106, 959, 1613, + 1010, 1006, 1590, + 837, 1063, 1558, + 399, 1129, 1511, + 0, 1204, 1440, + 0, 1289, 1323, + 0, 1382, 1096, + 0, 1483, 185, + 0, 1590, 0, + 0, 1702, 0, + 0, 1819, 0, + 0, 1940, 0, + 0, 2063, 0, + 0, 2189, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1280, 840, 1662, + 1261, 860, 1656, + 1234, 886, 1648, + 1196, 917, 1636, + 1139, 957, 1620, + 1050, 1004, 1598, + 896, 1061, 1566, + 539, 1127, 1520, + 0, 1203, 1451, + 0, 1288, 1337, + 0, 1381, 1119, + 0, 1482, 333, + 0, 1589, 0, + 0, 1702, 0, + 0, 1819, 0, + 0, 1939, 0, + 0, 2063, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1310, 836, 1671, + 1293, 856, 1665, + 1268, 882, 1657, + 1233, 914, 1646, + 1180, 953, 1630, + 1100, 1001, 1608, + 964, 1058, 1578, + 676, 1125, 1533, + 0, 1201, 1465, + 0, 1286, 1355, + 0, 1380, 1148, + 0, 1481, 478, + 0, 1589, 0, + 0, 1701, 0, + 0, 1818, 0, + 0, 1939, 0, + 0, 2063, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1348, 831, 1683, + 1332, 851, 1677, + 1309, 877, 1669, + 1277, 909, 1658, + 1230, 949, 1643, + 1159, 997, 1622, + 1041, 1055, 1592, + 813, 1122, 1549, + 0, 1199, 1483, + 0, 1284, 1378, + 0, 1378, 1184, + 0, 1480, 618, + 0, 1588, 0, + 0, 1701, 0, + 0, 1818, 0, + 0, 1938, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1394, 823, 1698, + 1380, 844, 1693, + 1359, 870, 1685, + 1331, 903, 1674, + 1289, 943, 1660, + 1227, 992, 1639, + 1128, 1050, 1611, + 948, 1118, 1569, + 474, 1195, 1507, + 0, 1282, 1408, + 0, 1376, 1229, + 0, 1478, 757, + 0, 1586, 0, + 0, 1699, 0, + 0, 1817, 0, + 0, 1938, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1449, 812, 1718, + 1437, 834, 1713, + 1419, 860, 1705, + 1393, 894, 1695, + 1358, 935, 1681, + 1305, 985, 1662, + 1222, 1044, 1634, + 1082, 1112, 1595, + 784, 1191, 1537, + 0, 1278, 1445, + 0, 1373, 1282, + 0, 1476, 894, + 0, 1584, 0, + 0, 1698, 0, + 0, 1816, 0, + 0, 1937, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2313, 0, + 0, 2443, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1514, 798, 1743, + 1503, 820, 1738, + 1487, 847, 1731, + 1466, 882, 1721, + 1435, 924, 1708, + 1391, 975, 1690, + 1324, 1035, 1664, + 1216, 1105, 1628, + 1014, 1184, 1574, + 385, 1273, 1489, + 0, 1369, 1345, + 0, 1472, 1029, + 0, 1582, 0, + 0, 1696, 0, + 0, 1814, 0, + 0, 1936, 0, + 0, 2059, 0, + 0, 2185, 0, + 0, 2313, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1588, 778, 1775, + 1579, 801, 1770, + 1566, 829, 1763, + 1548, 865, 1754, + 1522, 909, 1742, + 1486, 962, 1725, + 1433, 1023, 1702, + 1350, 1095, 1668, + 1208, 1176, 1619, + 903, 1266, 1543, + 0, 1363, 1417, + 0, 1468, 1164, + 0, 1578, 0, + 0, 1693, 0, + 0, 1812, 0, + 0, 1934, 0, + 0, 2059, 0, + 0, 2185, 0, + 0, 2313, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1672, 750, 1814, + 1664, 774, 1809, + 1653, 804, 1803, + 1638, 842, 1795, + 1617, 888, 1784, + 1588, 943, 1768, + 1546, 1007, 1747, + 1483, 1081, 1717, + 1382, 1164, 1673, + 1197, 1256, 1606, + 693, 1356, 1499, + 0, 1462, 1298, + 0, 1573, 683, + 0, 1689, 0, + 0, 1809, 0, + 0, 1932, 0, + 0, 2057, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1764, 709, 1861, + 1757, 735, 1857, + 1748, 768, 1852, + 1736, 809, 1844, + 1720, 858, 1834, + 1697, 917, 1821, + 1664, 985, 1801, + 1616, 1062, 1775, + 1542, 1149, 1736, + 1421, 1243, 1679, + 1181, 1345, 1589, + 0, 1454, 1432, + 0, 1567, 1066, + 0, 1685, 0, + 0, 1805, 0, + 0, 1929, 0, + 0, 2055, 0, + 0, 2181, 0, + 0, 2311, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1863, 648, 1918, + 1858, 678, 1914, + 1851, 715, 1909, + 1841, 761, 1903, + 1828, 815, 1894, + 1810, 879, 1882, + 1785, 953, 1865, + 1748, 1035, 1842, + 1695, 1126, 1809, + 1611, 1225, 1761, + 1469, 1331, 1687, + 1160, 1442, 1565, + 0, 1558, 1323, + 0, 1678, 55, + 0, 1800, 0, + 0, 1925, 0, + 0, 2051, 0, + 0, 2179, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1969, 552, 1984, + 1965, 588, 1981, + 1960, 633, 1976, + 1952, 687, 1971, + 1942, 751, 1963, + 1928, 824, 1953, + 1908, 906, 1939, + 1881, 997, 1919, + 1841, 1095, 1891, + 1783, 1200, 1852, + 1690, 1311, 1792, + 1526, 1427, 1698, + 1129, 1546, 1531, + 0, 1669, 1120, + 0, 1793, 0, + 0, 1920, 0, + 0, 2047, 0, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2081, 379, 2059, + 2077, 431, 2057, + 2073, 494, 2053, + 2067, 565, 2049, + 2059, 647, 2042, + 2049, 737, 2033, + 2034, 834, 2022, + 2013, 939, 2005, + 1984, 1049, 1982, + 1942, 1164, 1950, + 1879, 1283, 1903, + 1777, 1405, 1831, + 1592, 1530, 1712, + 1085, 1656, 1480, + 0, 1784, 483, + 0, 1913, 0, + 0, 2042, 0, + 0, 2173, 0, + 0, 2303, 0, + 0, 2435, 0, + 0, 2565, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2197, 0, 2143, + 2195, 67, 2141, + 2191, 195, 2139, + 2187, 325, 2135, + 2181, 455, 2129, + 2173, 586, 2123, + 2161, 717, 2113, + 2145, 848, 2099, + 2125, 980, 2081, + 2093, 1111, 2055, + 2049, 1243, 2018, + 1982, 1375, 1963, + 1873, 1507, 1878, + 1668, 1639, 1730, + 1018, 1771, 1403, + 0, 1903, 0, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2317, 0, 2237, + 2315, 0, 2235, + 2313, 0, 2233, + 2309, 0, 2229, + 2305, 0, 2225, + 2299, 247, 2219, + 2289, 490, 2211, + 2279, 689, 2201, + 2261, 866, 2187, + 2239, 1029, 2167, + 2207, 1183, 2137, + 2161, 1331, 2095, + 2091, 1474, 2033, + 1975, 1615, 1934, + 1753, 1753, 1753, + 910, 1890, 1273, + 0, 2025, 0, + 0, 2159, 0, + 0, 2293, 0, + 0, 2427, 0, + 0, 2561, 0, + 0, 2693, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2439, 0, 2337, + 2439, 0, 2337, + 2437, 0, 2335, + 2433, 0, 2331, + 2431, 0, 2329, + 2425, 0, 2323, + 2419, 0, 2317, + 2411, 317, 2309, + 2399, 650, 2297, + 2381, 890, 2281, + 2359, 1088, 2259, + 2325, 1264, 2229, + 2279, 1427, 2183, + 2205, 1580, 2113, + 2085, 1728, 1999, + 1846, 1871, 1782, + 707, 2011, 1008, + 0, 2149, 0, + 0, 2287, 0, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2565, 0, 2445, + 2563, 0, 2443, + 2563, 0, 2443, + 2561, 0, 2441, + 2557, 0, 2437, + 2553, 0, 2433, + 2549, 0, 2429, + 2543, 0, 2423, + 2533, 0, 2413, + 2521, 591, 2401, + 2505, 919, 2385, + 2481, 1156, 2361, + 2447, 1354, 2327, + 2399, 1530, 2277, + 2323, 1692, 2201, + 2199, 1845, 2075, + 1947, 1993, 1818, + 74, 2135, 0, + 0, 2275, 0, + 0, 2415, 0, + 0, 2551, 0, + 0, 2687, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2691, 0, 2557, + 2691, 0, 2557, + 2689, 0, 2555, + 2687, 0, 2553, + 2685, 0, 2551, + 2683, 0, 2549, + 2679, 0, 2545, + 2675, 0, 2539, + 2669, 0, 2533, + 2659, 0, 2523, + 2647, 498, 2511, + 2629, 955, 2493, + 2605, 1234, 2467, + 2571, 1452, 2431, + 2521, 1639, 2379, + 2445, 1808, 2297, + 2315, 1966, 2159, + 2055, 2117, 1863, + 0, 2261, 0, + 0, 2403, 0, + 0, 2543, 0, + 0, 2681, 0, + 0, 2817, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2819, 0, 2673, + 2819, 0, 2673, + 2817, 0, 2673, + 2817, 0, 2671, + 2815, 0, 2669, + 2813, 0, 2667, + 2811, 0, 2665, + 2807, 0, 2661, + 2801, 0, 2655, + 2795, 0, 2649, + 2787, 0, 2639, + 2773, 333, 2625, + 2757, 1000, 2607, + 2731, 1321, 2581, + 2697, 1556, 2543, + 2647, 1753, 2487, + 2569, 1928, 2401, + 2437, 2089, 2251, + 2167, 2243, 1916, + 0, 2389, 0, + 0, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2949, 0, 2795, + 2947, 0, 2793, + 2947, 0, 2793, + 2947, 0, 2793, + 2945, 0, 2791, + 2943, 0, 2789, + 2941, 0, 2787, + 2939, 0, 2783, + 2935, 0, 2779, + 2931, 0, 2775, + 2923, 0, 2767, + 2915, 0, 2757, + 2901, 0, 2743, + 2885, 1053, 2725, + 2859, 1416, 2697, + 2825, 1667, 2659, + 2773, 1871, 2601, + 2695, 2051, 2511, + 2561, 2215, 2351, + 2285, 2369, 1979, + 0, 2519, 0, + 0, 2663, 0, + 0, 2803, 0, + 0, 2941, 0, + 0, 3079, 0, + 0, 3213, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3079, 0, 2917, + 3077, 0, 2917, + 3077, 0, 2917, + 3077, 0, 2915, + 3075, 0, 2915, + 3075, 0, 2913, + 3073, 0, 2911, + 3071, 0, 2909, + 3069, 0, 2907, + 3065, 0, 2903, + 3059, 0, 2897, + 3053, 0, 2889, + 3043, 0, 2879, + 3031, 0, 2865, + 3013, 1116, 2845, + 2989, 1518, 2817, + 2953, 1782, 2777, + 2901, 1992, 2719, + 2821, 2175, 2625, + 2687, 2341, 2459, + 2405, 2499, 2051, + 0, 2647, 0, + 0, 2793, 0, + 0, 2933, 0, + 0, 3073, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3209, 0, 3043, + 3209, 0, 3043, + 3209, 0, 3041, + 3207, 0, 3041, + 3207, 0, 3041, + 3207, 0, 3039, + 3205, 0, 3039, + 3203, 0, 3037, + 3201, 0, 3035, + 3199, 0, 3031, + 3195, 0, 3027, + 3189, 0, 3021, + 3183, 0, 3013, + 3173, 0, 3003, + 3161, 0, 2989, + 3143, 1188, 2969, + 3119, 1627, 2941, + 3083, 1901, 2901, + 3031, 2117, 2839, + 2951, 2301, 2743, + 2815, 2471, 2571, + 2527, 2627, 2133, + 0, 2777, 0, + 0, 2923, 0, + 0, 3065, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3339, 0, 3169, + 3339, 0, 3169, + 3339, 0, 3169, + 3339, 0, 3169, + 3339, 0, 3169, + 3337, 0, 3167, + 3337, 0, 3167, + 3335, 0, 3165, + 3333, 0, 3163, + 3331, 0, 3161, + 3329, 0, 3157, + 3325, 0, 3153, + 3321, 0, 3147, + 3313, 0, 3141, + 3305, 0, 3129, + 3291, 0, 3115, + 3273, 1270, 3095, + 3249, 1740, 3067, + 3213, 2023, 3025, + 3161, 2243, 2963, + 3079, 2429, 2865, + 2943, 2599, 2687, + 2653, 2757, 2223, + 0, 2909, 0, + 0, 3055, 0, + 0, 3197, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3471, 0, 3297, + 3471, 0, 3297, + 3471, 0, 3297, + 3469, 0, 3297, + 3469, 0, 3297, + 3469, 0, 3297, + 3469, 0, 3295, + 3467, 0, 3295, + 3467, 0, 3293, + 3465, 0, 3291, + 3463, 0, 3289, + 3461, 0, 3285, + 3457, 0, 3281, + 3451, 0, 3275, + 3445, 0, 3267, + 3435, 0, 3257, + 3423, 0, 3243, + 3405, 1360, 3221, + 3379, 1858, 3193, + 3343, 2147, 3151, + 3291, 2369, 3089, + 3211, 2559, 2989, + 3073, 2729, 2807, + 2781, 2889, 2321, + 0, 3039, 0, + 0, 3185, 0, + 0, 3327, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3427, + 3601, 0, 3425, + 3601, 0, 3425, + 3599, 0, 3425, + 3599, 0, 3423, + 3597, 0, 3423, + 3597, 0, 3421, + 3595, 0, 3417, + 3591, 0, 3415, + 3587, 0, 3411, + 3583, 0, 3405, + 3575, 0, 3397, + 3567, 0, 3385, + 3553, 0, 3371, + 3535, 1458, 3351, + 3511, 1979, 3321, + 3475, 2273, 3279, + 3423, 2499, 3215, + 3341, 2689, 3115, + 3203, 2861, 2929, + 2909, 3019, 2427, + 0, 3171, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3557, + 3733, 0, 3555, + 3733, 0, 3555, + 3731, 0, 3555, + 3731, 0, 3555, + 3731, 0, 3553, + 3729, 0, 3551, + 3727, 0, 3551, + 3725, 0, 3547, + 3723, 0, 3545, + 3719, 0, 3541, + 3713, 0, 3535, + 3707, 0, 3527, + 3697, 0, 3515, + 3685, 0, 3501, + 3667, 1564, 3479, + 3641, 2103, 3451, + 3607, 2401, 3409, + 3553, 2627, 3345, + 3471, 2819, 3243, + 3333, 2991, 3055, + 3037, 3151, 2537, + 0, 3303, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3685, + 3863, 0, 3685, + 3863, 0, 3685, + 3863, 0, 3683, + 3861, 0, 3683, + 3859, 0, 3681, + 3857, 0, 3677, + 3855, 0, 3675, + 3851, 0, 3671, + 3845, 0, 3665, + 3839, 0, 3657, + 3829, 0, 3645, + 3817, 0, 3631, + 3799, 1674, 3609, + 3773, 2229, 3581, + 3737, 2531, 3537, + 3685, 2757, 3473, + 3603, 2949, 3371, + 3463, 3123, 3181, + 3167, 3283, 2653, + 0, 3435, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3997, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3815, + 3993, 0, 3815, + 3993, 0, 3813, + 3991, 0, 3811, + 3989, 0, 3809, + 3987, 0, 3805, + 3983, 0, 3801, + 3977, 0, 3795, + 3971, 0, 3787, + 3961, 0, 3777, + 3949, 0, 3761, + 3931, 1790, 3741, + 3905, 2355, 3711, + 3869, 2661, 3669, + 3817, 2889, 3603, + 3735, 3081, 3501, + 3595, 3253, 3311, + 3299, 3413, 2771, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3939, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3927, + 4095, 0, 3919, + 4093, 0, 3907, + 4079, 0, 3893, + 4061, 1909, 3871, + 4037, 2485, 3841, + 4001, 2791, 3799, + 3949, 3019, 3735, + 3867, 3213, 3631, + 3727, 3385, 3439, + 3429, 3545, 2893, + 0, 3697, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4071, + 4095, 0, 4069, + 4095, 0, 4063, + 4095, 0, 4057, + 4095, 0, 4049, + 4095, 0, 4039, + 4095, 0, 4023, + 4095, 2031, 4003, + 4095, 2613, 3973, + 4095, 2921, 3929, + 4079, 3151, 3865, + 3997, 3343, 3761, + 3859, 3517, 3569, + 3561, 3677, 3019, + 0, 3829, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2155, 4095, + 4095, 2743, 4095, + 4095, 3053, 4061, + 4095, 3283, 3997, + 4095, 3475, 3893, + 3989, 3649, 3699, + 3691, 3809, 3145, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2283, 4095, + 4095, 2875, 4095, + 4095, 3183, 4095, + 4095, 3413, 4095, + 4095, 3607, 4023, + 4095, 3781, 3831, + 3823, 3941, 3273, + 1384, 963, 1787, + 1369, 978, 1782, + 1348, 998, 1776, + 1319, 1023, 1767, + 1276, 1054, 1755, + 1212, 1093, 1739, + 1109, 1140, 1716, + 920, 1196, 1684, + 388, 1262, 1636, + 0, 1338, 1564, + 0, 1422, 1444, + 0, 1515, 1210, + 0, 1616, 161, + 0, 1723, 0, + 0, 1835, 0, + 0, 1952, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2321, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1402, 960, 1792, + 1388, 976, 1788, + 1368, 995, 1781, + 1340, 1020, 1773, + 1299, 1052, 1761, + 1238, 1091, 1745, + 1142, 1138, 1722, + 969, 1195, 1690, + 531, 1261, 1643, + 0, 1337, 1572, + 0, 1421, 1455, + 0, 1514, 1228, + 0, 1615, 317, + 0, 1722, 0, + 0, 1835, 0, + 0, 1951, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2321, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1426, 957, 1799, + 1412, 973, 1795, + 1393, 992, 1788, + 1367, 1018, 1780, + 1328, 1049, 1768, + 1272, 1088, 1752, + 1183, 1136, 1730, + 1027, 1193, 1699, + 671, 1259, 1653, + 0, 1335, 1583, + 0, 1420, 1469, + 0, 1513, 1251, + 0, 1614, 465, + 0, 1722, 0, + 0, 1834, 0, + 0, 1951, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1455, 953, 1808, + 1443, 968, 1804, + 1425, 988, 1797, + 1400, 1014, 1789, + 1365, 1046, 1778, + 1313, 1085, 1762, + 1232, 1133, 1740, + 1096, 1190, 1710, + 809, 1257, 1665, + 0, 1333, 1597, + 0, 1419, 1487, + 0, 1512, 1280, + 0, 1613, 610, + 0, 1721, 0, + 0, 1834, 0, + 0, 1951, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1492, 947, 1820, + 1480, 963, 1815, + 1464, 983, 1809, + 1441, 1009, 1801, + 1409, 1041, 1790, + 1362, 1081, 1775, + 1291, 1129, 1754, + 1173, 1187, 1724, + 945, 1254, 1681, + 8, 1331, 1616, + 0, 1416, 1511, + 0, 1511, 1317, + 0, 1612, 750, + 0, 1720, 0, + 0, 1833, 0, + 0, 1950, 0, + 0, 2071, 0, + 0, 2195, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1537, 939, 1835, + 1526, 955, 1831, + 1512, 976, 1825, + 1491, 1002, 1817, + 1463, 1034, 1806, + 1421, 1075, 1792, + 1359, 1124, 1771, + 1260, 1182, 1743, + 1080, 1250, 1701, + 606, 1327, 1639, + 0, 1414, 1540, + 0, 1508, 1361, + 0, 1610, 889, + 0, 1718, 0, + 0, 1832, 0, + 0, 1949, 0, + 0, 2069, 0, + 0, 2193, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1591, 928, 1854, + 1582, 945, 1850, + 1569, 966, 1845, + 1551, 992, 1837, + 1526, 1026, 1827, + 1490, 1067, 1813, + 1437, 1117, 1794, + 1354, 1176, 1767, + 1215, 1245, 1727, + 916, 1323, 1669, + 0, 1410, 1577, + 0, 1505, 1414, + 0, 1608, 1026, + 0, 1716, 0, + 0, 1830, 0, + 0, 1948, 0, + 0, 2069, 0, + 0, 2193, 0, + 0, 2319, 0, + 0, 2445, 0, + 0, 2575, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1654, 913, 1879, + 1646, 930, 1875, + 1635, 952, 1870, + 1620, 979, 1863, + 1598, 1014, 1854, + 1568, 1056, 1840, + 1523, 1107, 1822, + 1457, 1167, 1796, + 1348, 1237, 1760, + 1146, 1317, 1706, + 517, 1405, 1621, + 0, 1501, 1477, + 0, 1604, 1161, + 0, 1714, 0, + 0, 1828, 0, + 0, 1946, 0, + 0, 2067, 0, + 0, 2191, 0, + 0, 2317, 0, + 0, 2445, 0, + 0, 2575, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1727, 892, 1910, + 1720, 910, 1907, + 1711, 933, 1902, + 1698, 962, 1895, + 1680, 997, 1886, + 1654, 1041, 1874, + 1618, 1093, 1857, + 1565, 1156, 1834, + 1482, 1227, 1800, + 1340, 1308, 1751, + 1035, 1398, 1675, + 0, 1495, 1549, + 0, 1600, 1296, + 0, 1710, 0, + 0, 1825, 0, + 0, 1944, 0, + 0, 2067, 0, + 0, 2191, 0, + 0, 2317, 0, + 0, 2445, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1810, 863, 1949, + 1804, 882, 1946, + 1796, 906, 1941, + 1785, 936, 1935, + 1770, 974, 1927, + 1750, 1020, 1916, + 1720, 1075, 1901, + 1678, 1139, 1879, + 1615, 1213, 1849, + 1514, 1297, 1805, + 1329, 1388, 1738, + 825, 1488, 1631, + 0, 1594, 1430, + 0, 1705, 815, + 0, 1822, 0, + 0, 1941, 0, + 0, 2065, 0, + 0, 2189, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1900, 820, 1996, + 1896, 841, 1993, + 1889, 868, 1989, + 1880, 900, 1984, + 1868, 941, 1976, + 1852, 990, 1966, + 1829, 1049, 1953, + 1796, 1117, 1934, + 1748, 1194, 1907, + 1674, 1281, 1868, + 1553, 1375, 1811, + 1314, 1477, 1721, + 121, 1586, 1564, + 0, 1699, 1198, + 0, 1817, 0, + 0, 1938, 0, + 0, 2061, 0, + 0, 2187, 0, + 0, 2315, 0, + 0, 2443, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1999, 757, 2053, + 1995, 780, 2049, + 1990, 810, 2046, + 1983, 848, 2041, + 1973, 893, 2035, + 1960, 947, 2026, + 1942, 1011, 2014, + 1917, 1084, 1998, + 1881, 1167, 1974, + 1827, 1258, 1941, + 1743, 1357, 1893, + 1601, 1463, 1819, + 1292, 1574, 1697, + 0, 1690, 1455, + 0, 1810, 187, + 0, 1932, 0, + 0, 2057, 0, + 0, 2183, 0, + 0, 2311, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2105, 654, 2119, + 2101, 684, 2115, + 2097, 721, 2113, + 2091, 765, 2109, + 2085, 819, 2103, + 2075, 883, 2095, + 2059, 956, 2085, + 2040, 1038, 2071, + 2013, 1128, 2051, + 1974, 1227, 2024, + 1915, 1332, 1984, + 1822, 1443, 1924, + 1658, 1559, 1830, + 1261, 1678, 1663, + 0, 1801, 1252, + 0, 1926, 0, + 0, 2053, 0, + 0, 2179, 0, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2215, 467, 2193, + 2213, 511, 2191, + 2209, 563, 2189, + 2205, 626, 2185, + 2199, 698, 2181, + 2191, 779, 2175, + 2181, 869, 2165, + 2167, 966, 2153, + 2145, 1071, 2137, + 2117, 1181, 2115, + 2075, 1296, 2083, + 2011, 1415, 2035, + 1909, 1538, 1963, + 1724, 1662, 1844, + 1217, 1788, 1612, + 0, 1916, 615, + 0, 2045, 0, + 0, 2175, 0, + 0, 2305, 0, + 0, 2435, 0, + 0, 2567, 0, + 0, 2697, 0, + 0, 2829, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2331, 0, 2277, + 2329, 71, 2277, + 2327, 199, 2273, + 2323, 327, 2271, + 2319, 457, 2267, + 2313, 587, 2261, + 2305, 718, 2255, + 2293, 849, 2245, + 2277, 980, 2231, + 2257, 1112, 2213, + 2225, 1243, 2187, + 2181, 1375, 2151, + 2113, 1507, 2095, + 2005, 1639, 2010, + 1800, 1771, 1862, + 1150, 1903, 1535, + 0, 2035, 0, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2451, 0, 2371, + 2449, 0, 2369, + 2447, 0, 2367, + 2445, 0, 2365, + 2441, 0, 2361, + 2437, 40, 2357, + 2431, 379, 2351, + 2421, 622, 2345, + 2411, 822, 2333, + 2395, 999, 2319, + 2371, 1161, 2299, + 2339, 1315, 2269, + 2293, 1463, 2227, + 2223, 1606, 2165, + 2107, 1747, 2065, + 1885, 1885, 1885, + 1042, 2022, 1405, + 0, 2157, 0, + 0, 2291, 0, + 0, 2425, 0, + 0, 2559, 0, + 0, 2693, 0, + 0, 2825, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2573, 0, 2471, + 2571, 0, 2469, + 2571, 0, 2469, + 2569, 0, 2467, + 2565, 0, 2463, + 2563, 0, 2461, + 2557, 0, 2455, + 2551, 0, 2449, + 2543, 449, 2441, + 2531, 782, 2429, + 2513, 1022, 2413, + 2491, 1220, 2391, + 2459, 1396, 2361, + 2411, 1559, 2315, + 2337, 1712, 2245, + 2217, 1860, 2131, + 1979, 2003, 1914, + 839, 2143, 1140, + 0, 2281, 0, + 0, 2419, 0, + 0, 2553, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2697, 0, 2577, + 2697, 0, 2577, + 2695, 0, 2575, + 2695, 0, 2575, + 2693, 0, 2573, + 2689, 0, 2569, + 2687, 0, 2565, + 2681, 0, 2561, + 2675, 0, 2555, + 2665, 12, 2545, + 2653, 723, 2533, + 2637, 1051, 2517, + 2613, 1289, 2493, + 2579, 1486, 2459, + 2531, 1662, 2409, + 2455, 1824, 2333, + 2331, 1977, 2207, + 2079, 2125, 1951, + 206, 2267, 0, + 0, 2409, 0, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2825, 0, 2689, + 2823, 0, 2689, + 2823, 0, 2689, + 2821, 0, 2687, + 2821, 0, 2685, + 2819, 0, 2683, + 2815, 0, 2681, + 2811, 0, 2677, + 2807, 0, 2671, + 2801, 0, 2665, + 2791, 0, 2655, + 2779, 630, 2643, + 2761, 1087, 2625, + 2737, 1366, 2599, + 2703, 1584, 2563, + 2653, 1771, 2511, + 2577, 1940, 2429, + 2449, 2099, 2291, + 2187, 2249, 1995, + 0, 2395, 0, + 0, 2535, 0, + 0, 2675, 0, + 0, 2813, 0, + 0, 2949, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2953, 0, 2807, + 2951, 0, 2807, + 2951, 0, 2805, + 2951, 0, 2805, + 2949, 0, 2803, + 2947, 0, 2801, + 2945, 0, 2799, + 2943, 0, 2797, + 2939, 0, 2793, + 2935, 0, 2787, + 2927, 0, 2781, + 2919, 0, 2771, + 2905, 465, 2757, + 2889, 1132, 2739, + 2865, 1453, 2713, + 2829, 1689, 2675, + 2779, 1885, 2619, + 2701, 2059, 2533, + 2569, 2221, 2383, + 2299, 2375, 2049, + 0, 2521, 0, + 0, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3081, 0, 2927, + 3081, 0, 2927, + 3081, 0, 2925, + 3079, 0, 2925, + 3079, 0, 2925, + 3077, 0, 2923, + 3075, 0, 2921, + 3073, 0, 2919, + 3071, 0, 2917, + 3067, 0, 2913, + 3063, 0, 2907, + 3055, 0, 2899, + 3047, 0, 2889, + 3033, 66, 2875, + 3017, 1185, 2857, + 2991, 1548, 2829, + 2957, 1799, 2791, + 2905, 2003, 2733, + 2827, 2183, 2643, + 2693, 2347, 2483, + 2417, 2501, 2111, + 0, 2651, 0, + 0, 2795, 0, + 0, 2935, 0, + 0, 3073, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3211, 0, 3049, + 3211, 0, 3049, + 3211, 0, 3049, + 3209, 0, 3049, + 3209, 0, 3047, + 3209, 0, 3047, + 3207, 0, 3045, + 3205, 0, 3043, + 3203, 0, 3041, + 3201, 0, 3039, + 3197, 0, 3035, + 3191, 0, 3029, + 3185, 0, 3021, + 3175, 0, 3011, + 3163, 0, 2997, + 3145, 1248, 2977, + 3121, 1651, 2949, + 3085, 1914, 2909, + 3033, 2125, 2851, + 2955, 2307, 2757, + 2819, 2475, 2591, + 2537, 2631, 2183, + 0, 2779, 0, + 0, 2925, 0, + 0, 3065, 0, + 0, 3205, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3341, 0, 3175, + 3341, 0, 3175, + 3341, 0, 3175, + 3341, 0, 3173, + 3339, 0, 3173, + 3339, 0, 3173, + 3339, 0, 3171, + 3337, 0, 3171, + 3335, 0, 3169, + 3333, 0, 3167, + 3331, 0, 3163, + 3327, 0, 3159, + 3321, 0, 3153, + 3315, 0, 3145, + 3305, 0, 3135, + 3293, 0, 3121, + 3275, 1320, 3101, + 3251, 1759, 3073, + 3215, 2033, 3033, + 3163, 2249, 2971, + 3083, 2435, 2875, + 2947, 2603, 2703, + 2661, 2759, 2265, + 0, 2911, 0, + 0, 3055, 0, + 0, 3197, 0, + 0, 3337, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3471, 0, 3301, + 3469, 0, 3299, + 3469, 0, 3299, + 3467, 0, 3297, + 3467, 0, 3295, + 3463, 0, 3293, + 3461, 0, 3289, + 3457, 0, 3285, + 3453, 0, 3279, + 3445, 0, 3273, + 3437, 0, 3261, + 3423, 0, 3247, + 3405, 1402, 3227, + 3381, 1873, 3199, + 3345, 2155, 3157, + 3293, 2375, 3095, + 3213, 2563, 2997, + 3075, 2731, 2819, + 2785, 2891, 2355, + 0, 3041, 0, + 0, 3187, 0, + 0, 3329, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3603, 0, 3429, + 3603, 0, 3429, + 3603, 0, 3429, + 3603, 0, 3429, + 3603, 0, 3429, + 3601, 0, 3429, + 3601, 0, 3429, + 3601, 0, 3427, + 3599, 0, 3427, + 3599, 0, 3425, + 3597, 0, 3423, + 3595, 0, 3421, + 3593, 0, 3417, + 3589, 0, 3413, + 3583, 0, 3407, + 3577, 0, 3399, + 3567, 0, 3389, + 3555, 0, 3375, + 3537, 1492, 3355, + 3511, 1990, 3325, + 3475, 2279, 3283, + 3423, 2501, 3221, + 3343, 2691, 3121, + 3205, 2861, 2939, + 2913, 3021, 2453, + 0, 3171, 0, + 0, 3317, 0, + 0, 3459, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3735, 0, 3559, + 3735, 0, 3559, + 3735, 0, 3559, + 3733, 0, 3559, + 3733, 0, 3559, + 3733, 0, 3559, + 3733, 0, 3557, + 3733, 0, 3557, + 3731, 0, 3557, + 3731, 0, 3555, + 3729, 0, 3555, + 3729, 0, 3553, + 3727, 0, 3551, + 3723, 0, 3547, + 3719, 0, 3543, + 3715, 0, 3537, + 3707, 0, 3529, + 3699, 0, 3517, + 3685, 0, 3503, + 3667, 1591, 3483, + 3643, 2111, 3453, + 3607, 2405, 3411, + 3555, 2631, 3347, + 3473, 2821, 3247, + 3335, 2993, 3063, + 3041, 3151, 2559, + 0, 3303, 0, + 0, 3449, 0, + 0, 3591, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3687, + 3865, 0, 3687, + 3865, 0, 3687, + 3863, 0, 3687, + 3863, 0, 3685, + 3861, 0, 3683, + 3859, 0, 3683, + 3857, 0, 3679, + 3855, 0, 3677, + 3851, 0, 3673, + 3847, 0, 3667, + 3839, 0, 3659, + 3829, 0, 3647, + 3817, 0, 3633, + 3799, 1696, 3611, + 3773, 2235, 3583, + 3739, 2533, 3541, + 3685, 2759, 3477, + 3603, 2951, 3375, + 3465, 3123, 3187, + 3169, 3283, 2669, + 0, 3435, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3819, + 3997, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3817, + 3995, 0, 3815, + 3993, 0, 3815, + 3991, 0, 3813, + 3989, 0, 3811, + 3987, 0, 3807, + 3983, 0, 3803, + 3977, 0, 3797, + 3971, 0, 3789, + 3961, 0, 3777, + 3949, 0, 3763, + 3931, 1806, 3741, + 3905, 2361, 3713, + 3869, 2663, 3669, + 3817, 2889, 3605, + 3735, 3083, 3503, + 3595, 3255, 3315, + 3299, 3415, 2785, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3933, + 4095, 0, 3927, + 4095, 0, 3919, + 4093, 0, 3909, + 4081, 0, 3893, + 4063, 1922, 3873, + 4037, 2487, 3843, + 4001, 2793, 3801, + 3949, 3021, 3735, + 3867, 3213, 3633, + 3727, 3385, 3443, + 3431, 3547, 2903, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4059, + 4095, 0, 4051, + 4095, 0, 4039, + 4095, 0, 4025, + 4095, 2041, 4003, + 4095, 2617, 3973, + 4095, 2923, 3931, + 4081, 3151, 3867, + 3999, 3345, 3763, + 3859, 3517, 3571, + 3561, 3677, 3025, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2163, 4095, + 4095, 2745, 4095, + 4095, 3053, 4063, + 4095, 3283, 3997, + 4095, 3477, 3893, + 3991, 3649, 3701, + 3693, 3809, 3151, + 0, 3961, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2287, 4095, + 4095, 2875, 4095, + 4095, 3185, 4095, + 4095, 3415, 4095, + 4095, 3607, 4025, + 4095, 3781, 3831, + 3823, 3941, 3277, + 1513, 1085, 1919, + 1502, 1096, 1915, + 1486, 1112, 1911, + 1465, 1131, 1904, + 1434, 1156, 1895, + 1390, 1187, 1883, + 1323, 1226, 1867, + 1214, 1273, 1844, + 1011, 1329, 1811, + 373, 1395, 1763, + 0, 1470, 1689, + 0, 1555, 1568, + 0, 1648, 1328, + 0, 1748, 128, + 0, 1855, 0, + 0, 1967, 0, + 0, 2085, 0, + 0, 2205, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1527, 1083, 1923, + 1516, 1095, 1919, + 1501, 1110, 1915, + 1480, 1129, 1908, + 1451, 1154, 1899, + 1408, 1186, 1888, + 1344, 1225, 1871, + 1241, 1272, 1848, + 1052, 1328, 1816, + 520, 1394, 1768, + 0, 1470, 1696, + 0, 1554, 1576, + 0, 1647, 1342, + 0, 1748, 294, + 0, 1855, 0, + 0, 1967, 0, + 0, 2083, 0, + 0, 2205, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1545, 1080, 1928, + 1534, 1092, 1924, + 1520, 1108, 1920, + 1500, 1127, 1913, + 1472, 1152, 1905, + 1431, 1184, 1893, + 1370, 1223, 1877, + 1274, 1270, 1854, + 1101, 1327, 1822, + 663, 1393, 1775, + 0, 1469, 1704, + 0, 1553, 1587, + 0, 1647, 1360, + 0, 1747, 449, + 0, 1854, 0, + 0, 1967, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1568, 1077, 1935, + 1558, 1089, 1931, + 1544, 1104, 1927, + 1525, 1124, 1920, + 1499, 1150, 1912, + 1460, 1181, 1900, + 1404, 1221, 1884, + 1315, 1268, 1862, + 1160, 1325, 1831, + 803, 1391, 1785, + 0, 1467, 1715, + 0, 1552, 1601, + 0, 1646, 1383, + 0, 1746, 597, + 0, 1854, 0, + 0, 1966, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1597, 1073, 1944, + 1588, 1085, 1940, + 1575, 1100, 1936, + 1557, 1120, 1930, + 1532, 1146, 1921, + 1497, 1178, 1910, + 1445, 1217, 1894, + 1364, 1265, 1873, + 1228, 1322, 1842, + 941, 1389, 1797, + 0, 1465, 1729, + 0, 1551, 1619, + 0, 1644, 1412, + 0, 1745, 742, + 0, 1853, 0, + 0, 1966, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1633, 1067, 1955, + 1624, 1079, 1952, + 1613, 1095, 1947, + 1596, 1115, 1942, + 1574, 1141, 1933, + 1541, 1173, 1922, + 1494, 1213, 1907, + 1423, 1261, 1886, + 1305, 1319, 1856, + 1077, 1386, 1813, + 140, 1463, 1748, + 0, 1549, 1643, + 0, 1643, 1449, + 0, 1744, 883, + 0, 1852, 0, + 0, 1965, 0, + 0, 2083, 0, + 0, 2203, 0, + 0, 2327, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1677, 1058, 1970, + 1669, 1071, 1967, + 1659, 1087, 1963, + 1644, 1108, 1957, + 1624, 1134, 1949, + 1595, 1167, 1939, + 1553, 1207, 1924, + 1491, 1256, 1904, + 1392, 1314, 1875, + 1212, 1382, 1833, + 738, 1459, 1771, + 0, 1546, 1672, + 0, 1640, 1493, + 0, 1742, 1021, + 0, 1850, 0, + 0, 1964, 0, + 0, 2081, 0, + 0, 2203, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1730, 1047, 1990, + 1723, 1060, 1987, + 1714, 1076, 1982, + 1701, 1098, 1977, + 1683, 1124, 1969, + 1658, 1158, 1959, + 1622, 1199, 1945, + 1569, 1249, 1926, + 1487, 1308, 1899, + 1347, 1377, 1859, + 1048, 1455, 1801, + 0, 1542, 1709, + 0, 1637, 1546, + 0, 1740, 1158, + 0, 1848, 0, + 0, 1962, 0, + 0, 2081, 0, + 0, 2201, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1793, 1032, 2014, + 1787, 1045, 2011, + 1778, 1062, 2008, + 1767, 1084, 2002, + 1752, 1111, 1995, + 1730, 1146, 1986, + 1700, 1188, 1972, + 1655, 1239, 1954, + 1589, 1299, 1929, + 1481, 1369, 1892, + 1278, 1449, 1838, + 650, 1537, 1754, + 0, 1633, 1609, + 0, 1736, 1294, + 0, 1846, 0, + 0, 1960, 0, + 0, 2079, 0, + 0, 2201, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2577, 0, + 0, 2707, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1865, 1011, 2045, + 1860, 1024, 2043, + 1853, 1042, 2039, + 1843, 1065, 2034, + 1830, 1093, 2028, + 1812, 1129, 2019, + 1787, 1173, 2006, + 1750, 1226, 1989, + 1697, 1288, 1966, + 1614, 1359, 1932, + 1472, 1440, 1883, + 1167, 1530, 1807, + 0, 1628, 1681, + 0, 1732, 1428, + 0, 1842, 0, + 0, 1957, 0, + 0, 2077, 0, + 0, 2199, 0, + 0, 2323, 0, + 0, 2449, 0, + 0, 2577, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 1946, 980, 2083, + 1942, 995, 2081, + 1936, 1014, 2077, + 1928, 1038, 2073, + 1917, 1068, 2067, + 1902, 1106, 2059, + 1882, 1152, 2049, + 1853, 1207, 2033, + 1810, 1271, 2011, + 1747, 1345, 1981, + 1646, 1429, 1937, + 1461, 1520, 1870, + 957, 1620, 1763, + 0, 1726, 1562, + 0, 1838, 947, + 0, 1954, 0, + 0, 2073, 0, + 0, 2197, 0, + 0, 2321, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2036, 936, 2131, + 2033, 953, 2129, + 2028, 973, 2125, + 2021, 1000, 2121, + 2013, 1032, 2115, + 2001, 1073, 2109, + 1984, 1122, 2099, + 1961, 1181, 2085, + 1928, 1249, 2065, + 1880, 1326, 2039, + 1807, 1413, 2000, + 1685, 1508, 1943, + 1446, 1610, 1853, + 253, 1718, 1696, + 0, 1831, 1330, + 0, 1949, 0, + 0, 2069, 0, + 0, 2193, 0, + 0, 2319, 0, + 0, 2447, 0, + 0, 2575, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2135, 870, 2187, + 2131, 889, 2185, + 2127, 913, 2181, + 2123, 942, 2179, + 2115, 980, 2173, + 2105, 1025, 2167, + 2093, 1079, 2159, + 2075, 1143, 2147, + 2049, 1217, 2129, + 2013, 1299, 2107, + 1959, 1391, 2073, + 1876, 1490, 2025, + 1733, 1595, 1951, + 1424, 1707, 1829, + 0, 1822, 1587, + 0, 1942, 319, + 0, 2065, 0, + 0, 2189, 0, + 0, 2317, 0, + 0, 2443, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2239, 763, 2251, + 2237, 786, 2251, + 2233, 816, 2247, + 2229, 853, 2245, + 2223, 898, 2241, + 2217, 952, 2235, + 2207, 1015, 2227, + 2193, 1088, 2217, + 2173, 1170, 2203, + 2145, 1261, 2183, + 2105, 1359, 2155, + 2047, 1464, 2115, + 1954, 1575, 2057, + 1790, 1691, 1962, + 1394, 1811, 1795, + 0, 1933, 1384, + 0, 2057, 0, + 0, 2185, 0, + 0, 2313, 0, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2349, 563, 2327, + 2347, 599, 2325, + 2345, 643, 2323, + 2341, 696, 2321, + 2337, 758, 2317, + 2331, 830, 2313, + 2323, 911, 2307, + 2313, 1001, 2297, + 2299, 1098, 2285, + 2277, 1203, 2269, + 2249, 1313, 2247, + 2207, 1429, 2215, + 2143, 1548, 2167, + 2041, 1670, 2095, + 1856, 1794, 1976, + 1349, 1920, 1745, + 0, 2049, 747, + 0, 2177, 0, + 0, 2307, 0, + 0, 2437, 0, + 0, 2567, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2465, 0, 2411, + 2463, 77, 2409, + 2461, 203, 2409, + 2459, 331, 2407, + 2455, 460, 2403, + 2451, 589, 2399, + 2445, 719, 2393, + 2437, 850, 2387, + 2425, 981, 2377, + 2409, 1112, 2363, + 2389, 1244, 2345, + 2357, 1376, 2319, + 2313, 1507, 2283, + 2245, 1639, 2227, + 2137, 1771, 2141, + 1932, 1903, 1994, + 1282, 2035, 1667, + 0, 2167, 0, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2583, 0, 2503, + 2583, 0, 2503, + 2581, 0, 2501, + 2579, 0, 2499, + 2577, 0, 2497, + 2573, 0, 2495, + 2569, 172, 2489, + 2563, 511, 2483, + 2553, 754, 2477, + 2543, 954, 2465, + 2527, 1130, 2451, + 2503, 1293, 2431, + 2471, 1447, 2401, + 2425, 1595, 2359, + 2355, 1739, 2297, + 2239, 1879, 2197, + 2017, 2017, 2017, + 1174, 2153, 1537, + 0, 2289, 0, + 0, 2425, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2825, 0, + 0, 2957, 0, + 0, 3091, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2705, 0, 2603, + 2705, 0, 2603, + 2703, 0, 2601, + 2703, 0, 2601, + 2701, 0, 2599, + 2697, 0, 2597, + 2695, 0, 2593, + 2689, 0, 2589, + 2683, 0, 2581, + 2675, 581, 2573, + 2663, 914, 2561, + 2647, 1154, 2545, + 2623, 1352, 2523, + 2591, 1528, 2493, + 2543, 1691, 2447, + 2469, 1845, 2377, + 2349, 1992, 2263, + 2111, 2135, 2046, + 972, 2275, 1272, + 0, 2413, 0, + 0, 2551, 0, + 0, 2685, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2831, 0, 2711, + 2829, 0, 2709, + 2829, 0, 2709, + 2827, 0, 2707, + 2827, 0, 2707, + 2825, 0, 2705, + 2821, 0, 2701, + 2819, 0, 2699, + 2813, 0, 2693, + 2807, 0, 2687, + 2797, 144, 2677, + 2785, 855, 2665, + 2769, 1183, 2649, + 2745, 1421, 2625, + 2711, 1618, 2591, + 2663, 1794, 2541, + 2587, 1956, 2465, + 2463, 2109, 2339, + 2211, 2257, 2083, + 338, 2401, 0, + 0, 2541, 0, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 2957, 0, 2823, + 2957, 0, 2821, + 2955, 0, 2821, + 2955, 0, 2821, + 2953, 0, 2819, + 2953, 0, 2817, + 2951, 0, 2815, + 2947, 0, 2813, + 2943, 0, 2809, + 2939, 0, 2803, + 2933, 0, 2797, + 2923, 0, 2787, + 2911, 762, 2775, + 2893, 1219, 2757, + 2869, 1499, 2731, + 2835, 1716, 2697, + 2785, 1903, 2643, + 2709, 2073, 2561, + 2581, 2231, 2423, + 2319, 2381, 2127, + 0, 2527, 0, + 0, 2667, 0, + 0, 2807, 0, + 0, 2945, 0, + 0, 3081, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3085, 0, 2939, + 3085, 0, 2939, + 3083, 0, 2939, + 3083, 0, 2937, + 3083, 0, 2937, + 3081, 0, 2935, + 3079, 0, 2933, + 3077, 0, 2931, + 3075, 0, 2929, + 3071, 0, 2925, + 3067, 0, 2919, + 3059, 0, 2913, + 3051, 0, 2903, + 3037, 597, 2889, + 3021, 1264, 2871, + 2997, 1585, 2845, + 2961, 1821, 2807, + 2911, 2017, 2751, + 2833, 2191, 2665, + 2701, 2353, 2515, + 2431, 2507, 2181, + 0, 2653, 0, + 0, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3213, 0, 3059, + 3213, 0, 3059, + 3213, 0, 3059, + 3213, 0, 3057, + 3211, 0, 3057, + 3211, 0, 3057, + 3209, 0, 3055, + 3209, 0, 3053, + 3207, 0, 3051, + 3203, 0, 3049, + 3199, 0, 3045, + 3195, 0, 3039, + 3187, 0, 3031, + 3179, 0, 3021, + 3165, 198, 3007, + 3149, 1317, 2989, + 3125, 1680, 2961, + 3089, 1931, 2923, + 3037, 2135, 2865, + 2959, 2315, 2775, + 2825, 2479, 2615, + 2549, 2635, 2243, + 0, 2783, 0, + 0, 2927, 0, + 0, 3067, 0, + 0, 3205, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3343, 0, 3183, + 3343, 0, 3181, + 3343, 0, 3181, + 3343, 0, 3181, + 3341, 0, 3181, + 3341, 0, 3179, + 3341, 0, 3179, + 3339, 0, 3177, + 3337, 0, 3177, + 3335, 0, 3173, + 3333, 0, 3171, + 3329, 0, 3167, + 3323, 0, 3161, + 3317, 0, 3153, + 3307, 0, 3143, + 3295, 0, 3129, + 3277, 1380, 3109, + 3253, 1783, 3081, + 3217, 2046, 3041, + 3167, 2257, 2983, + 3087, 2439, 2889, + 2951, 2607, 2723, + 2669, 2763, 2315, + 0, 2913, 0, + 0, 3057, 0, + 0, 3197, 0, + 0, 3337, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3473, 0, 3307, + 3473, 0, 3307, + 3473, 0, 3307, + 3473, 0, 3307, + 3473, 0, 3307, + 3471, 0, 3305, + 3471, 0, 3305, + 3471, 0, 3303, + 3469, 0, 3303, + 3467, 0, 3301, + 3465, 0, 3299, + 3463, 0, 3295, + 3459, 0, 3291, + 3453, 0, 3285, + 3447, 0, 3277, + 3437, 0, 3267, + 3425, 0, 3253, + 3407, 1452, 3233, + 3383, 1891, 3205, + 3347, 2165, 3165, + 3295, 2381, 3103, + 3215, 2567, 3007, + 3079, 2735, 2835, + 2793, 2893, 2397, + 0, 3043, 0, + 0, 3187, 0, + 0, 3329, 0, + 0, 3469, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3603, 0, 3435, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3603, 0, 3433, + 3601, 0, 3431, + 3601, 0, 3431, + 3599, 0, 3429, + 3599, 0, 3427, + 3597, 0, 3425, + 3593, 0, 3423, + 3589, 0, 3417, + 3585, 0, 3413, + 3577, 0, 3405, + 3569, 0, 3393, + 3555, 0, 3379, + 3537, 1534, 3359, + 3513, 2005, 3331, + 3477, 2287, 3289, + 3425, 2507, 3227, + 3345, 2695, 3129, + 3207, 2863, 2951, + 2917, 3023, 2487, + 0, 3173, 0, + 0, 3319, 0, + 0, 3461, 0, + 0, 3599, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3735, 0, 3563, + 3735, 0, 3563, + 3735, 0, 3561, + 3735, 0, 3561, + 3735, 0, 3561, + 3735, 0, 3561, + 3733, 0, 3561, + 3733, 0, 3561, + 3733, 0, 3559, + 3731, 0, 3559, + 3731, 0, 3557, + 3729, 0, 3555, + 3727, 0, 3553, + 3725, 0, 3549, + 3721, 0, 3545, + 3715, 0, 3539, + 3709, 0, 3533, + 3699, 0, 3521, + 3687, 0, 3507, + 3669, 1625, 3487, + 3643, 2123, 3457, + 3607, 2411, 3415, + 3555, 2633, 3353, + 3475, 2823, 3253, + 3337, 2993, 3071, + 3045, 3153, 2585, + 0, 3303, 0, + 0, 3449, 0, + 0, 3593, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3867, 0, 3691, + 3867, 0, 3691, + 3867, 0, 3691, + 3867, 0, 3691, + 3865, 0, 3691, + 3865, 0, 3691, + 3865, 0, 3691, + 3865, 0, 3689, + 3865, 0, 3689, + 3865, 0, 3689, + 3863, 0, 3687, + 3863, 0, 3687, + 3861, 0, 3685, + 3859, 0, 3683, + 3855, 0, 3679, + 3851, 0, 3675, + 3847, 0, 3669, + 3839, 0, 3661, + 3831, 0, 3651, + 3817, 0, 3635, + 3799, 1723, 3615, + 3775, 2243, 3585, + 3739, 2539, 3543, + 3687, 2763, 3481, + 3605, 2953, 3379, + 3467, 3125, 3195, + 3173, 3283, 2691, + 0, 3435, 0, + 0, 3581, 0, + 0, 3723, 0, + 0, 3863, 0, + 0, 4001, 0, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3819, + 3997, 0, 3819, + 3995, 0, 3819, + 3995, 0, 3817, + 3993, 0, 3817, + 3991, 0, 3815, + 3989, 0, 3811, + 3987, 0, 3809, + 3983, 0, 3805, + 3979, 0, 3799, + 3971, 0, 3791, + 3961, 0, 3779, + 3949, 0, 3765, + 3931, 1828, 3745, + 3907, 2367, 3715, + 3871, 2665, 3673, + 3817, 2891, 3609, + 3735, 3083, 3507, + 3597, 3255, 3319, + 3301, 3415, 2801, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3943, + 4095, 0, 3939, + 4095, 0, 3935, + 4095, 0, 3929, + 4095, 0, 3921, + 4093, 0, 3909, + 4081, 0, 3895, + 4063, 1938, 3875, + 4037, 2493, 3845, + 4001, 2795, 3801, + 3949, 3021, 3737, + 3867, 3215, 3635, + 3729, 3387, 3447, + 3431, 3547, 2917, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4065, + 4095, 0, 4059, + 4095, 0, 4051, + 4095, 0, 4041, + 4095, 0, 4025, + 4095, 2053, 4005, + 4095, 2621, 3975, + 4095, 2925, 3933, + 4081, 3153, 3867, + 3999, 3345, 3765, + 3859, 3517, 3575, + 3563, 3679, 3035, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2173, 4095, + 4095, 2749, 4095, + 4095, 3055, 4063, + 4095, 3283, 3999, + 4095, 3477, 3895, + 3991, 3649, 3703, + 3693, 3809, 3157, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2295, 4095, + 4095, 2877, 4095, + 4095, 3185, 4095, + 4095, 3415, 4095, + 4095, 3609, 4025, + 4095, 3781, 3833, + 3825, 3941, 3283, + 1643, 1209, 2051, + 1635, 1218, 2049, + 1623, 1230, 2045, + 1607, 1245, 2040, + 1585, 1264, 2033, + 1554, 1289, 2025, + 1508, 1321, 2012, + 1439, 1359, 1996, + 1326, 1406, 1972, + 1110, 1462, 1939, + 353, 1528, 1891, + 0, 1603, 1817, + 0, 1688, 1694, + 0, 1780, 1449, + 0, 1881, 80, + 0, 1987, 0, + 0, 2099, 0, + 0, 2217, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1653, 1208, 2053, + 1645, 1217, 2051, + 1634, 1229, 2047, + 1618, 1244, 2043, + 1597, 1263, 2036, + 1566, 1288, 2028, + 1522, 1319, 2016, + 1455, 1358, 1999, + 1346, 1405, 1976, + 1143, 1462, 1943, + 505, 1527, 1895, + 0, 1603, 1821, + 0, 1687, 1700, + 0, 1780, 1460, + 0, 1880, 260, + 0, 1987, 0, + 0, 2099, 0, + 0, 2217, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1667, 1206, 2057, + 1659, 1215, 2055, + 1648, 1227, 2051, + 1633, 1242, 2047, + 1612, 1262, 2040, + 1583, 1287, 2032, + 1540, 1318, 2020, + 1476, 1357, 2003, + 1373, 1404, 1980, + 1184, 1461, 1948, + 652, 1526, 1900, + 0, 1602, 1828, + 0, 1686, 1708, + 0, 1779, 1474, + 0, 1880, 426, + 0, 1987, 0, + 0, 2099, 0, + 0, 2215, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1685, 1204, 2063, + 1677, 1213, 2061, + 1667, 1224, 2057, + 1652, 1240, 2051, + 1632, 1259, 2046, + 1604, 1284, 2037, + 1563, 1316, 2025, + 1503, 1355, 2009, + 1406, 1403, 1986, + 1233, 1459, 1954, + 795, 1525, 1907, + 0, 1601, 1836, + 0, 1686, 1719, + 0, 1779, 1492, + 0, 1879, 581, + 0, 1986, 0, + 0, 2099, 0, + 0, 2215, 0, + 0, 2337, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1707, 1200, 2069, + 1700, 1209, 2067, + 1690, 1221, 2063, + 1676, 1237, 2059, + 1657, 1256, 2053, + 1631, 1282, 2044, + 1593, 1313, 2033, + 1536, 1353, 2017, + 1447, 1400, 1994, + 1292, 1457, 1963, + 935, 1524, 1917, + 0, 1599, 1847, + 0, 1684, 1733, + 0, 1778, 1515, + 0, 1879, 730, + 0, 1986, 0, + 0, 2099, 0, + 0, 2215, 0, + 0, 2335, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1736, 1196, 2079, + 1729, 1205, 2075, + 1720, 1217, 2073, + 1707, 1232, 2067, + 1689, 1252, 2061, + 1664, 1278, 2053, + 1629, 1310, 2042, + 1577, 1349, 2026, + 1496, 1397, 2005, + 1360, 1455, 1974, + 1073, 1521, 1929, + 0, 1598, 1861, + 0, 1683, 1752, + 0, 1776, 1545, + 0, 1878, 874, + 0, 1985, 0, + 0, 2097, 0, + 0, 2215, 0, + 0, 2335, 0, + 0, 2459, 0, + 0, 2585, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1771, 1189, 2089, + 1765, 1199, 2087, + 1756, 1211, 2083, + 1745, 1227, 2079, + 1728, 1247, 2073, + 1706, 1273, 2065, + 1674, 1305, 2055, + 1627, 1345, 2039, + 1555, 1393, 2018, + 1437, 1451, 1988, + 1209, 1518, 1945, + 272, 1595, 1880, + 0, 1681, 1775, + 0, 1775, 1581, + 0, 1876, 1015, + 0, 1984, 0, + 0, 2097, 0, + 0, 2215, 0, + 0, 2335, 0, + 0, 2459, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1815, 1181, 2105, + 1809, 1191, 2103, + 1801, 1203, 2099, + 1791, 1219, 2095, + 1776, 1240, 2089, + 1756, 1266, 2081, + 1727, 1299, 2071, + 1685, 1339, 2057, + 1623, 1388, 2036, + 1524, 1446, 2007, + 1344, 1514, 1966, + 870, 1592, 1903, + 0, 1678, 1804, + 0, 1772, 1625, + 0, 1874, 1153, + 0, 1982, 0, + 0, 2095, 0, + 0, 2213, 0, + 0, 2335, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1867, 1170, 2123, + 1862, 1179, 2121, + 1855, 1192, 2119, + 1846, 1209, 2115, + 1833, 1230, 2109, + 1815, 1256, 2101, + 1790, 1290, 2091, + 1754, 1331, 2077, + 1701, 1381, 2059, + 1619, 1440, 2031, + 1479, 1509, 1992, + 1180, 1587, 1933, + 0, 1674, 1841, + 0, 1769, 1678, + 0, 1872, 1290, + 0, 1981, 0, + 0, 2095, 0, + 0, 2213, 0, + 0, 2333, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 1929, 1154, 2149, + 1925, 1164, 2147, + 1919, 1177, 2143, + 1910, 1194, 2139, + 1899, 1216, 2135, + 1884, 1243, 2127, + 1862, 1278, 2117, + 1832, 1320, 2105, + 1788, 1371, 2087, + 1721, 1432, 2061, + 1613, 1501, 2024, + 1410, 1581, 1970, + 782, 1669, 1886, + 0, 1765, 1741, + 0, 1869, 1426, + 0, 1978, 0, + 0, 2093, 0, + 0, 2211, 0, + 0, 2333, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2709, 0, + 0, 2839, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2001, 1132, 2179, + 1997, 1143, 2177, + 1992, 1156, 2175, + 1985, 1174, 2171, + 1975, 1197, 2167, + 1962, 1226, 2159, + 1944, 1261, 2151, + 1919, 1305, 2139, + 1883, 1358, 2121, + 1829, 1420, 2097, + 1746, 1491, 2065, + 1604, 1572, 2015, + 1299, 1662, 1939, + 0, 1760, 1813, + 0, 1864, 1560, + 0, 1974, 0, + 0, 2089, 0, + 0, 2209, 0, + 0, 2331, 0, + 0, 2455, 0, + 0, 2581, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2081, 1101, 2217, + 2079, 1112, 2215, + 2073, 1127, 2213, + 2069, 1146, 2211, + 2061, 1170, 2205, + 2049, 1200, 2199, + 2034, 1238, 2191, + 2014, 1284, 2181, + 1985, 1339, 2165, + 1943, 1404, 2143, + 1879, 1478, 2113, + 1778, 1561, 2069, + 1593, 1653, 2003, + 1089, 1752, 1895, + 0, 1858, 1695, + 0, 1970, 1079, + 0, 2085, 0, + 0, 2205, 0, + 0, 2329, 0, + 0, 2453, 0, + 0, 2579, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2171, 1056, 2265, + 2169, 1068, 2263, + 2165, 1084, 2261, + 2159, 1105, 2257, + 2153, 1132, 2253, + 2145, 1164, 2249, + 2133, 1205, 2241, + 2117, 1254, 2231, + 2093, 1313, 2217, + 2061, 1381, 2197, + 2012, 1458, 2171, + 1939, 1545, 2133, + 1817, 1640, 2075, + 1578, 1742, 1985, + 385, 1850, 1828, + 0, 1963, 1462, + 0, 2081, 0, + 0, 2201, 0, + 0, 2325, 0, + 0, 2451, 0, + 0, 2579, 0, + 0, 2707, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2269, 988, 2321, + 2267, 1002, 2319, + 2263, 1021, 2317, + 2259, 1044, 2315, + 2255, 1074, 2311, + 2247, 1112, 2305, + 2237, 1157, 2299, + 2225, 1211, 2291, + 2207, 1275, 2279, + 2181, 1349, 2261, + 2145, 1431, 2239, + 2091, 1523, 2205, + 2008, 1622, 2157, + 1865, 1727, 2083, + 1556, 1839, 1961, + 0, 1955, 1720, + 0, 2075, 451, + 0, 2197, 0, + 0, 2321, 0, + 0, 2449, 0, + 0, 2577, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2373, 877, 2385, + 2371, 895, 2385, + 2369, 918, 2383, + 2365, 948, 2381, + 2361, 985, 2377, + 2357, 1029, 2373, + 2349, 1083, 2367, + 2339, 1147, 2359, + 2325, 1220, 2349, + 2305, 1302, 2335, + 2277, 1393, 2315, + 2237, 1491, 2287, + 2179, 1597, 2247, + 2087, 1708, 2189, + 1922, 1823, 2095, + 1526, 1943, 1927, + 0, 2065, 1516, + 0, 2189, 0, + 0, 2317, 0, + 0, 2445, 0, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2483, 666, 2461, + 2481, 695, 2459, + 2479, 731, 2457, + 2477, 775, 2455, + 2475, 828, 2453, + 2469, 890, 2449, + 2463, 962, 2445, + 2457, 1043, 2439, + 2445, 1133, 2429, + 2431, 1230, 2417, + 2409, 1335, 2401, + 2381, 1445, 2379, + 2339, 1561, 2347, + 2275, 1680, 2299, + 2173, 1802, 2227, + 1988, 1926, 2109, + 1481, 2053, 1877, + 0, 2181, 879, + 0, 2309, 0, + 0, 2439, 0, + 0, 2569, 0, + 0, 2699, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2597, 0, 2543, + 2597, 84, 2543, + 2595, 209, 2541, + 2593, 335, 2541, + 2591, 463, 2539, + 2587, 592, 2535, + 2583, 721, 2531, + 2577, 852, 2527, + 2569, 982, 2519, + 2557, 1113, 2509, + 2543, 1244, 2495, + 2521, 1376, 2477, + 2489, 1508, 2451, + 2445, 1640, 2415, + 2379, 1771, 2359, + 2269, 1903, 2273, + 2065, 2035, 2127, + 1415, 2167, 1799, + 0, 2299, 0, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3091, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2717, 0, 2637, + 2715, 0, 2635, + 2715, 0, 2635, + 2713, 0, 2633, + 2711, 0, 2631, + 2709, 0, 2629, + 2705, 0, 2627, + 2701, 304, 2621, + 2695, 644, 2617, + 2687, 886, 2609, + 2675, 1086, 2597, + 2659, 1263, 2583, + 2635, 1426, 2563, + 2605, 1580, 2533, + 2557, 1727, 2493, + 2487, 1871, 2429, + 2371, 2011, 2329, + 2149, 2149, 2149, + 1306, 2287, 1669, + 0, 2421, 0, + 0, 2557, 0, + 0, 2691, 0, + 0, 2823, 0, + 0, 2957, 0, + 0, 3089, 0, + 0, 3223, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2839, 0, 2737, + 2837, 0, 2735, + 2837, 0, 2735, + 2837, 0, 2735, + 2835, 0, 2733, + 2833, 0, 2731, + 2831, 0, 2729, + 2827, 0, 2725, + 2821, 0, 2721, + 2815, 0, 2713, + 2807, 713, 2705, + 2795, 1046, 2693, + 2779, 1286, 2679, + 2755, 1484, 2655, + 2723, 1661, 2625, + 2675, 1823, 2579, + 2601, 1977, 2509, + 2481, 2125, 2395, + 2243, 2267, 2179, + 1103, 2407, 1404, + 0, 2547, 0, + 0, 2683, 0, + 0, 2819, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 2963, 0, 2843, + 2963, 0, 2843, + 2961, 0, 2841, + 2961, 0, 2841, + 2959, 0, 2839, + 2959, 0, 2839, + 2957, 0, 2837, + 2953, 0, 2833, + 2951, 0, 2831, + 2945, 0, 2825, + 2939, 0, 2819, + 2929, 276, 2809, + 2917, 987, 2797, + 2901, 1315, 2781, + 2877, 1553, 2757, + 2843, 1750, 2723, + 2795, 1926, 2673, + 2719, 2089, 2597, + 2595, 2241, 2471, + 2343, 2389, 2215, + 471, 2533, 0, + 0, 2673, 0, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3089, 0, 2955, + 3089, 0, 2955, + 3089, 0, 2955, + 3087, 0, 2953, + 3087, 0, 2953, + 3085, 0, 2951, + 3085, 0, 2949, + 3083, 0, 2947, + 3079, 0, 2945, + 3075, 0, 2941, + 3071, 0, 2937, + 3065, 0, 2929, + 3055, 0, 2919, + 3043, 894, 2907, + 3025, 1351, 2889, + 3001, 1631, 2863, + 2967, 1848, 2829, + 2917, 2035, 2775, + 2841, 2205, 2693, + 2713, 2363, 2555, + 2451, 2513, 2259, + 0, 2659, 0, + 0, 2801, 0, + 0, 2939, 0, + 0, 3077, 0, + 0, 3213, 0, + 0, 3347, 0, + 0, 3483, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3217, 0, 3071, + 3217, 0, 3071, + 3217, 0, 3071, + 3215, 0, 3071, + 3215, 0, 3069, + 3215, 0, 3069, + 3213, 0, 3067, + 3211, 0, 3065, + 3209, 0, 3063, + 3207, 0, 3061, + 3203, 0, 3057, + 3199, 0, 3051, + 3191, 0, 3045, + 3183, 0, 3035, + 3169, 729, 3021, + 3153, 1396, 3003, + 3129, 1717, 2977, + 3093, 1953, 2939, + 3043, 2149, 2883, + 2965, 2325, 2797, + 2833, 2485, 2647, + 2563, 2639, 2313, + 0, 2785, 0, + 0, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3345, 0, 3191, + 3345, 0, 3191, + 3345, 0, 3191, + 3345, 0, 3191, + 3345, 0, 3191, + 3343, 0, 3189, + 3343, 0, 3189, + 3341, 0, 3187, + 3341, 0, 3185, + 3339, 0, 3183, + 3335, 0, 3181, + 3331, 0, 3177, + 3327, 0, 3171, + 3319, 0, 3163, + 3311, 0, 3153, + 3299, 330, 3139, + 3281, 1449, 3121, + 3257, 1813, 3093, + 3221, 2063, 3055, + 3169, 2267, 2997, + 3091, 2447, 2907, + 2957, 2611, 2747, + 2681, 2767, 2375, + 0, 2915, 0, + 0, 3059, 0, + 0, 3199, 0, + 0, 3337, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3475, 0, 3315, + 3475, 0, 3315, + 3475, 0, 3313, + 3475, 0, 3313, + 3475, 0, 3313, + 3473, 0, 3313, + 3473, 0, 3313, + 3473, 0, 3311, + 3471, 0, 3309, + 3469, 0, 3309, + 3467, 0, 3305, + 3465, 0, 3303, + 3461, 0, 3299, + 3457, 0, 3293, + 3449, 0, 3285, + 3439, 0, 3275, + 3427, 0, 3261, + 3409, 1512, 3241, + 3385, 1915, 3213, + 3349, 2179, 3175, + 3299, 2389, 3115, + 3219, 2571, 3021, + 3083, 2739, 2855, + 2801, 2895, 2447, + 0, 3045, 0, + 0, 3189, 0, + 0, 3331, 0, + 0, 3469, 0, + 0, 3607, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3605, 0, 3439, + 3603, 0, 3437, + 3603, 0, 3437, + 3603, 0, 3437, + 3601, 0, 3435, + 3599, 0, 3433, + 3597, 0, 3431, + 3595, 0, 3427, + 3591, 0, 3423, + 3587, 0, 3417, + 3579, 0, 3411, + 3569, 0, 3399, + 3557, 0, 3385, + 3539, 1585, 3365, + 3515, 2023, 3337, + 3479, 2297, 3297, + 3427, 2513, 3235, + 3347, 2699, 3139, + 3211, 2867, 2967, + 2925, 3025, 2529, + 0, 3175, 0, + 0, 3319, 0, + 0, 3461, 0, + 0, 3601, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3737, 0, 3567, + 3737, 0, 3567, + 3735, 0, 3567, + 3735, 0, 3565, + 3735, 0, 3565, + 3735, 0, 3565, + 3735, 0, 3565, + 3735, 0, 3565, + 3733, 0, 3563, + 3733, 0, 3563, + 3731, 0, 3561, + 3731, 0, 3559, + 3729, 0, 3557, + 3725, 0, 3555, + 3721, 0, 3549, + 3717, 0, 3545, + 3709, 0, 3537, + 3701, 0, 3525, + 3687, 0, 3511, + 3669, 1666, 3491, + 3645, 2137, 3463, + 3609, 2419, 3421, + 3557, 2639, 3359, + 3477, 2827, 3261, + 3339, 2995, 3083, + 3049, 3155, 2619, + 0, 3305, 0, + 0, 3451, 0, + 0, 3593, 0, + 0, 3731, 0, + 0, 3869, 0, + 0, 4005, 0, + 3867, 0, 3695, + 3867, 0, 3695, + 3867, 0, 3695, + 3867, 0, 3695, + 3867, 0, 3693, + 3867, 0, 3693, + 3867, 0, 3693, + 3867, 0, 3693, + 3865, 0, 3693, + 3865, 0, 3691, + 3865, 0, 3691, + 3863, 0, 3689, + 3861, 0, 3687, + 3859, 0, 3685, + 3857, 0, 3683, + 3853, 0, 3677, + 3847, 0, 3673, + 3841, 0, 3665, + 3831, 0, 3653, + 3819, 0, 3639, + 3801, 1757, 3619, + 3775, 2255, 3589, + 3741, 2543, 3547, + 3687, 2765, 3485, + 3607, 2955, 3385, + 3469, 3125, 3203, + 3177, 3285, 2717, + 0, 3437, 0, + 0, 3581, 0, + 0, 3725, 0, + 0, 3863, 0, + 0, 4001, 0, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3999, 0, 3823, + 3997, 0, 3823, + 3997, 0, 3823, + 3997, 0, 3821, + 3997, 0, 3821, + 3997, 0, 3821, + 3995, 0, 3819, + 3995, 0, 3819, + 3993, 0, 3817, + 3991, 0, 3815, + 3987, 0, 3811, + 3983, 0, 3807, + 3979, 0, 3801, + 3971, 0, 3793, + 3963, 0, 3783, + 3949, 0, 3767, + 3931, 1855, 3747, + 3907, 2375, 3717, + 3871, 2671, 3675, + 3819, 2895, 3613, + 3737, 3085, 3511, + 3599, 3257, 3327, + 3305, 3415, 2823, + 0, 3567, 0, + 0, 3713, 0, + 0, 3855, 0, + 0, 3995, 0, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3945, + 4095, 0, 3941, + 4095, 0, 3937, + 4095, 0, 3931, + 4095, 0, 3923, + 4093, 0, 3911, + 4081, 0, 3897, + 4063, 1960, 3877, + 4039, 2499, 3847, + 4003, 2797, 3805, + 3949, 3023, 3741, + 3869, 3215, 3639, + 3729, 3387, 3451, + 3435, 3547, 2933, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4075, + 4095, 0, 4071, + 4095, 0, 4067, + 4095, 0, 4061, + 4095, 0, 4053, + 4095, 0, 4043, + 4095, 0, 4027, + 4095, 2071, 4007, + 4095, 2625, 3977, + 4095, 2927, 3935, + 4081, 3155, 3869, + 3999, 3347, 3767, + 3861, 3519, 3579, + 3563, 3679, 3049, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2187, 4095, + 4095, 2753, 4095, + 4095, 3057, 4065, + 4095, 3285, 4001, + 4095, 3477, 3897, + 3991, 3651, 3707, + 3695, 3811, 3167, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2305, 4095, + 4095, 2881, 4095, + 4095, 3187, 4095, + 4095, 3415, 4095, + 4095, 3609, 4027, + 4095, 3781, 3835, + 3825, 3943, 3291, + 1773, 1336, 2183, + 1767, 1342, 2181, + 1759, 1351, 2179, + 1747, 1363, 2175, + 1731, 1378, 2169, + 1708, 1398, 2163, + 1676, 1422, 2155, + 1629, 1453, 2143, + 1558, 1492, 2125, + 1442, 1539, 2101, + 1216, 1595, 2069, + 324, 1661, 2020, + 0, 1736, 1945, + 0, 1820, 1821, + 0, 1913, 1573, + 0, 2013, 6, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1781, 1335, 2185, + 1775, 1341, 2183, + 1767, 1350, 2181, + 1755, 1362, 2177, + 1739, 1377, 2171, + 1717, 1397, 2165, + 1686, 1421, 2157, + 1640, 1453, 2145, + 1571, 1491, 2127, + 1458, 1538, 2105, + 1242, 1594, 2071, + 485, 1660, 2023, + 0, 1735, 1949, + 0, 1820, 1826, + 0, 1912, 1582, + 0, 2013, 212, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1792, 1333, 2187, + 1786, 1340, 2185, + 1777, 1349, 2183, + 1766, 1361, 2179, + 1751, 1376, 2175, + 1729, 1395, 2169, + 1699, 1420, 2159, + 1654, 1452, 2147, + 1587, 1490, 2131, + 1479, 1537, 2107, + 1275, 1594, 2075, + 637, 1659, 2027, + 0, 1735, 1954, + 0, 1819, 1832, + 0, 1912, 1592, + 0, 2012, 393, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1805, 1331, 2191, + 1799, 1338, 2189, + 1791, 1347, 2187, + 1780, 1359, 2183, + 1765, 1374, 2179, + 1744, 1394, 2173, + 1715, 1419, 2163, + 1672, 1450, 2151, + 1608, 1489, 2135, + 1505, 1536, 2113, + 1316, 1593, 2079, + 784, 1659, 2032, + 0, 1734, 1960, + 0, 1819, 1840, + 0, 1912, 1606, + 0, 2012, 558, + 0, 2119, 0, + 0, 2231, 0, + 0, 2349, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1823, 1329, 2197, + 1817, 1336, 2195, + 1809, 1345, 2193, + 1799, 1356, 2189, + 1784, 1372, 2185, + 1764, 1392, 2177, + 1736, 1417, 2169, + 1695, 1448, 2157, + 1635, 1487, 2141, + 1538, 1535, 2119, + 1365, 1591, 2087, + 927, 1657, 2040, + 0, 1733, 1968, + 0, 1818, 1851, + 0, 1911, 1624, + 0, 2011, 713, + 0, 2119, 0, + 0, 2231, 0, + 0, 2347, 0, + 0, 2469, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1845, 1325, 2203, + 1839, 1332, 2201, + 1832, 1341, 2199, + 1822, 1353, 2195, + 1809, 1369, 2191, + 1790, 1389, 2185, + 1763, 1414, 2177, + 1725, 1446, 2165, + 1668, 1485, 2149, + 1579, 1532, 2127, + 1424, 1589, 2095, + 1067, 1656, 2049, + 0, 1732, 1979, + 0, 1817, 1865, + 0, 1910, 1647, + 0, 2011, 862, + 0, 2117, 0, + 0, 2231, 0, + 0, 2347, 0, + 0, 2467, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1873, 1321, 2213, + 1868, 1328, 2211, + 1861, 1337, 2207, + 1852, 1349, 2205, + 1839, 1365, 2199, + 1821, 1385, 2193, + 1797, 1410, 2185, + 1761, 1442, 2175, + 1709, 1482, 2159, + 1628, 1530, 2137, + 1492, 1587, 2107, + 1205, 1653, 2061, + 0, 1730, 1994, + 0, 1815, 1884, + 0, 1909, 1677, + 0, 2010, 1006, + 0, 2117, 0, + 0, 2229, 0, + 0, 2347, 0, + 0, 2467, 0, + 0, 2591, 0, + 0, 2717, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1908, 1315, 2223, + 1904, 1322, 2221, + 1897, 1331, 2219, + 1889, 1343, 2217, + 1877, 1359, 2211, + 1861, 1379, 2205, + 1838, 1405, 2197, + 1806, 1437, 2187, + 1759, 1477, 2171, + 1687, 1526, 2151, + 1570, 1583, 2121, + 1341, 1650, 2077, + 404, 1727, 2012, + 0, 1813, 1907, + 0, 1907, 1713, + 0, 2008, 1147, + 0, 2117, 0, + 0, 2229, 0, + 0, 2347, 0, + 0, 2467, 0, + 0, 2591, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 1951, 1306, 2239, + 1947, 1313, 2237, + 1941, 1323, 2235, + 1934, 1335, 2231, + 1923, 1351, 2227, + 1908, 1372, 2221, + 1888, 1398, 2213, + 1859, 1431, 2203, + 1818, 1471, 2189, + 1755, 1520, 2167, + 1656, 1579, 2139, + 1476, 1646, 2097, + 1002, 1724, 2036, + 0, 1810, 1936, + 0, 1905, 1757, + 0, 2007, 1285, + 0, 2115, 0, + 0, 2227, 0, + 0, 2345, 0, + 0, 2467, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2003, 1294, 2257, + 2000, 1302, 2257, + 1994, 1312, 2253, + 1987, 1324, 2251, + 1978, 1341, 2247, + 1965, 1362, 2241, + 1947, 1389, 2233, + 1922, 1422, 2223, + 1886, 1463, 2209, + 1833, 1513, 2191, + 1751, 1572, 2163, + 1611, 1641, 2123, + 1312, 1719, 2065, + 0, 1806, 1973, + 0, 1902, 1811, + 0, 2004, 1422, + 0, 2113, 0, + 0, 2227, 0, + 0, 2345, 0, + 0, 2465, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2065, 1278, 2283, + 2061, 1286, 2281, + 2057, 1296, 2279, + 2051, 1309, 2275, + 2043, 1326, 2271, + 2031, 1348, 2267, + 2016, 1376, 2259, + 1994, 1410, 2249, + 1964, 1452, 2237, + 1920, 1503, 2219, + 1853, 1564, 2193, + 1745, 1634, 2157, + 1543, 1713, 2103, + 914, 1801, 2018, + 0, 1897, 1873, + 0, 2001, 1558, + 0, 2111, 0, + 0, 2225, 0, + 0, 2343, 0, + 0, 2465, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2841, 0, + 0, 2971, 0, + 0, 3099, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2135, 1256, 2313, + 2133, 1264, 2311, + 2129, 1275, 2309, + 2123, 1289, 2307, + 2117, 1306, 2303, + 2107, 1329, 2299, + 2095, 1358, 2291, + 2077, 1393, 2283, + 2051, 1437, 2271, + 2015, 1490, 2253, + 1961, 1552, 2231, + 1878, 1624, 2197, + 1737, 1704, 2147, + 1431, 1794, 2071, + 0, 1892, 1946, + 0, 1996, 1693, + 0, 2107, 0, + 0, 2221, 0, + 0, 2341, 0, + 0, 2463, 0, + 0, 2587, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2215, 1225, 2351, + 2213, 1233, 2349, + 2211, 1244, 2347, + 2205, 1259, 2345, + 2201, 1278, 2343, + 2193, 1302, 2337, + 2181, 1333, 2331, + 2167, 1370, 2323, + 2145, 1416, 2313, + 2117, 1471, 2297, + 2075, 1536, 2275, + 2011, 1610, 2245, + 1910, 1693, 2201, + 1725, 1785, 2135, + 1221, 1884, 2027, + 0, 1990, 1827, + 0, 2101, 1211, + 0, 2219, 0, + 0, 2337, 0, + 0, 2461, 0, + 0, 2585, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 2305, 1179, 2397, + 2303, 1188, 2397, + 2301, 1200, 2395, + 2297, 1217, 2393, + 2293, 1237, 2389, + 2285, 1264, 2385, + 2277, 1297, 2381, + 2265, 1337, 2373, + 2249, 1387, 2363, + 2225, 1445, 2349, + 2193, 1513, 2329, + 2145, 1591, 2303, + 2071, 1677, 2265, + 1949, 1772, 2207, + 1710, 1874, 2117, + 517, 1982, 1960, + 0, 2095, 1594, + 0, 2213, 0, + 0, 2335, 0, + 0, 2457, 0, + 0, 2583, 0, + 0, 2711, 0, + 0, 2839, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 2401, 1109, 2453, + 2401, 1120, 2453, + 2399, 1134, 2451, + 2395, 1153, 2449, + 2391, 1177, 2447, + 2387, 1206, 2443, + 2379, 1244, 2437, + 2369, 1289, 2431, + 2357, 1344, 2423, + 2339, 1407, 2411, + 2313, 1481, 2393, + 2277, 1564, 2371, + 2223, 1655, 2337, + 2139, 1754, 2289, + 1997, 1860, 2215, + 1688, 1971, 2093, + 0, 2087, 1852, + 0, 2207, 583, + 0, 2329, 0, + 0, 2453, 0, + 0, 2581, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2505, 995, 2519, + 2505, 1009, 2517, + 2503, 1027, 2517, + 2501, 1050, 2515, + 2497, 1080, 2513, + 2493, 1117, 2509, + 2489, 1162, 2505, + 2481, 1216, 2499, + 2471, 1279, 2491, + 2457, 1352, 2481, + 2437, 1434, 2467, + 2409, 1525, 2447, + 2369, 1623, 2419, + 2311, 1729, 2381, + 2219, 1840, 2321, + 2055, 1955, 2227, + 1658, 2075, 2059, + 0, 2197, 1649, + 0, 2321, 0, + 0, 2449, 0, + 0, 2577, 0, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2615, 775, 2593, + 2615, 798, 2593, + 2613, 827, 2591, + 2611, 863, 2589, + 2609, 907, 2587, + 2607, 960, 2585, + 2601, 1022, 2581, + 2597, 1094, 2577, + 2589, 1175, 2571, + 2577, 1265, 2561, + 2563, 1363, 2551, + 2541, 1467, 2533, + 2513, 1578, 2511, + 2471, 1693, 2479, + 2407, 1812, 2431, + 2305, 1934, 2359, + 2121, 2059, 2241, + 1614, 2185, 2009, + 0, 2313, 1012, + 0, 2441, 0, + 0, 2571, 0, + 0, 2701, 0, + 0, 2831, 0, + 0, 2963, 0, + 0, 3095, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2731, 0, 2677, + 2729, 94, 2677, + 2729, 216, 2675, + 2727, 341, 2675, + 2725, 467, 2673, + 2723, 595, 2671, + 2719, 724, 2667, + 2715, 853, 2663, + 2709, 984, 2659, + 2701, 1114, 2651, + 2689, 1245, 2641, + 2675, 1377, 2629, + 2653, 1508, 2609, + 2621, 1640, 2583, + 2577, 1772, 2547, + 2511, 1904, 2491, + 2401, 2035, 2407, + 2197, 2167, 2259, + 1547, 2299, 1931, + 0, 2431, 0, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2849, 0, 2769, + 2849, 0, 2769, + 2847, 0, 2767, + 2847, 0, 2767, + 2845, 0, 2765, + 2843, 0, 2763, + 2841, 0, 2761, + 2837, 0, 2759, + 2833, 436, 2755, + 2827, 776, 2749, + 2819, 1018, 2741, + 2807, 1218, 2729, + 2791, 1395, 2715, + 2769, 1558, 2695, + 2737, 1712, 2665, + 2689, 1859, 2625, + 2619, 2003, 2561, + 2503, 2143, 2463, + 2281, 2281, 2281, + 1438, 2419, 1802, + 0, 2553, 0, + 0, 2689, 0, + 0, 2823, 0, + 0, 2955, 0, + 0, 3089, 0, + 0, 3221, 0, + 0, 3355, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 2971, 0, 2869, + 2971, 0, 2869, + 2971, 0, 2867, + 2969, 0, 2867, + 2969, 0, 2867, + 2967, 0, 2865, + 2965, 0, 2863, + 2963, 0, 2861, + 2959, 0, 2857, + 2953, 0, 2853, + 2947, 96, 2847, + 2939, 845, 2837, + 2927, 1178, 2827, + 2911, 1418, 2811, + 2887, 1617, 2789, + 2855, 1793, 2757, + 2807, 1955, 2711, + 2733, 2109, 2641, + 2613, 2257, 2527, + 2375, 2399, 2311, + 1236, 2539, 1536, + 0, 2679, 0, + 0, 2815, 0, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3095, 0, 2975, + 3095, 0, 2975, + 3095, 0, 2975, + 3095, 0, 2973, + 3093, 0, 2973, + 3093, 0, 2973, + 3091, 0, 2971, + 3089, 0, 2969, + 3085, 0, 2965, + 3083, 0, 2963, + 3077, 0, 2957, + 3071, 0, 2951, + 3063, 409, 2941, + 3049, 1119, 2929, + 3033, 1447, 2913, + 3009, 1685, 2889, + 2975, 1883, 2855, + 2927, 2059, 2805, + 2851, 2221, 2729, + 2727, 2373, 2603, + 2475, 2521, 2347, + 602, 2665, 0, + 0, 2805, 0, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3221, 0, 3087, + 3221, 0, 3087, + 3221, 0, 3087, + 3221, 0, 3087, + 3219, 0, 3085, + 3219, 0, 3085, + 3217, 0, 3083, + 3217, 0, 3083, + 3215, 0, 3079, + 3211, 0, 3077, + 3209, 0, 3073, + 3203, 0, 3069, + 3197, 0, 3061, + 3187, 0, 3051, + 3175, 1026, 3039, + 3159, 1483, 3021, + 3135, 1763, 2997, + 3099, 1980, 2961, + 3049, 2167, 2907, + 2973, 2337, 2825, + 2845, 2495, 2687, + 2583, 2645, 2391, + 0, 2791, 0, + 0, 2933, 0, + 0, 3071, 0, + 0, 3209, 0, + 0, 3345, 0, + 0, 3479, 0, + 0, 3615, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4015, 0, + 3349, 0, 3203, + 3349, 0, 3203, + 3349, 0, 3203, + 3349, 0, 3203, + 3347, 0, 3203, + 3347, 0, 3201, + 3347, 0, 3201, + 3345, 0, 3199, + 3343, 0, 3199, + 3341, 0, 3195, + 3339, 0, 3193, + 3335, 0, 3189, + 3331, 0, 3183, + 3323, 0, 3177, + 3315, 0, 3167, + 3303, 861, 3153, + 3285, 1528, 3135, + 3261, 1850, 3109, + 3225, 2085, 3071, + 3175, 2281, 3015, + 3097, 2457, 2929, + 2965, 2617, 2779, + 2695, 2771, 2445, + 0, 2919, 0, + 0, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3477, 0, 3323, + 3475, 0, 3321, + 3475, 0, 3321, + 3473, 0, 3319, + 3473, 0, 3317, + 3471, 0, 3315, + 3467, 0, 3313, + 3463, 0, 3309, + 3459, 0, 3303, + 3453, 0, 3295, + 3443, 0, 3285, + 3431, 462, 3271, + 3413, 1581, 3253, + 3389, 1945, 3225, + 3353, 2195, 3187, + 3303, 2399, 3129, + 3223, 2579, 3039, + 3089, 2743, 2879, + 2813, 2899, 2507, + 0, 3047, 0, + 0, 3191, 0, + 0, 3331, 0, + 0, 3469, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3607, 0, 3447, + 3607, 0, 3447, + 3607, 0, 3447, + 3607, 0, 3447, + 3607, 0, 3445, + 3607, 0, 3445, + 3605, 0, 3445, + 3605, 0, 3445, + 3605, 0, 3443, + 3603, 0, 3441, + 3601, 0, 3441, + 3599, 0, 3439, + 3597, 0, 3435, + 3593, 0, 3431, + 3589, 0, 3425, + 3581, 0, 3417, + 3573, 0, 3407, + 3559, 0, 3393, + 3541, 1644, 3373, + 3517, 2047, 3347, + 3483, 2311, 3307, + 3431, 2521, 3247, + 3351, 2703, 3153, + 3215, 2871, 2987, + 2933, 3027, 2579, + 0, 3177, 0, + 0, 3321, 0, + 0, 3463, 0, + 0, 3601, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3571, + 3737, 0, 3569, + 3735, 0, 3569, + 3735, 0, 3569, + 3733, 0, 3567, + 3731, 0, 3565, + 3729, 0, 3563, + 3727, 0, 3559, + 3723, 0, 3555, + 3719, 0, 3549, + 3711, 0, 3543, + 3703, 0, 3531, + 3689, 0, 3517, + 3671, 1717, 3497, + 3647, 2155, 3469, + 3611, 2429, 3429, + 3559, 2645, 3367, + 3479, 2831, 3271, + 3343, 2999, 3099, + 3057, 3157, 2661, + 0, 3307, 0, + 0, 3451, 0, + 0, 3593, 0, + 0, 3733, 0, + 0, 3869, 0, + 0, 4005, 0, + 3869, 0, 3699, + 3869, 0, 3699, + 3869, 0, 3699, + 3869, 0, 3699, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3697, + 3867, 0, 3695, + 3865, 0, 3695, + 3865, 0, 3693, + 3863, 0, 3691, + 3861, 0, 3689, + 3857, 0, 3687, + 3853, 0, 3683, + 3849, 0, 3677, + 3841, 0, 3669, + 3833, 0, 3657, + 3819, 0, 3643, + 3801, 1798, 3623, + 3777, 2269, 3595, + 3741, 2551, 3553, + 3689, 2771, 3491, + 3609, 2959, 3393, + 3471, 3129, 3215, + 3181, 3287, 2751, + 0, 3437, 0, + 0, 3583, 0, + 0, 3725, 0, + 0, 3865, 0, + 0, 4001, 0, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3827, + 3999, 0, 3825, + 3999, 0, 3825, + 3999, 0, 3825, + 3997, 0, 3825, + 3997, 0, 3823, + 3997, 0, 3823, + 3995, 0, 3821, + 3993, 0, 3819, + 3991, 0, 3817, + 3989, 0, 3815, + 3985, 0, 3809, + 3979, 0, 3805, + 3973, 0, 3797, + 3963, 0, 3785, + 3951, 0, 3771, + 3933, 1889, 3751, + 3907, 2387, 3721, + 3873, 2677, 3679, + 3819, 2899, 3617, + 3739, 3087, 3517, + 3601, 3259, 3335, + 3309, 3417, 2849, + 0, 3569, 0, + 0, 3715, 0, + 0, 3857, 0, + 0, 3995, 0, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3953, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3943, + 4095, 0, 3939, + 4095, 0, 3933, + 4095, 0, 3925, + 4095, 0, 3915, + 4081, 0, 3899, + 4063, 1987, 3879, + 4039, 2507, 3849, + 4003, 2803, 3807, + 3951, 3027, 3745, + 3869, 3217, 3643, + 3731, 3389, 3459, + 3437, 3549, 2955, + 0, 3699, 0, + 0, 3845, 0, + 0, 3987, 0, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4077, + 4095, 0, 4073, + 4095, 0, 4069, + 4095, 0, 4063, + 4095, 0, 4055, + 4095, 0, 4043, + 4095, 0, 4029, + 4095, 2093, 4009, + 4095, 2631, 3979, + 4095, 2931, 3937, + 4081, 3157, 3873, + 4001, 3347, 3771, + 3861, 3519, 3583, + 3567, 3679, 3065, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2203, 4095, + 4095, 2757, 4095, + 4095, 3059, 4067, + 4095, 3287, 4003, + 4095, 3479, 3899, + 3993, 3651, 3711, + 3697, 3811, 3181, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2319, 4095, + 4095, 2885, 4095, + 4095, 3189, 4095, + 4095, 3417, 4095, + 4095, 3609, 4029, + 4095, 3783, 3839, + 3827, 3943, 3299, + 1904, 1463, 2315, + 1900, 1469, 2313, + 1893, 1475, 2311, + 1884, 1484, 2309, + 1873, 1496, 2305, + 1856, 1511, 2301, + 1833, 1530, 2293, + 1801, 1555, 2285, + 1753, 1586, 2273, + 1681, 1625, 2255, + 1561, 1672, 2233, + 1327, 1728, 2199, + 282, 1793, 2149, + 0, 1868, 2075, + 0, 1952, 1949, + 0, 2045, 1699, + 0, 2145, 0, + 0, 2253, 0, + 0, 2365, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1910, 1463, 2317, + 1906, 1468, 2315, + 1899, 1475, 2313, + 1891, 1483, 2311, + 1879, 1495, 2307, + 1863, 1510, 2301, + 1840, 1530, 2295, + 1808, 1554, 2287, + 1761, 1586, 2275, + 1690, 1624, 2257, + 1574, 1671, 2235, + 1348, 1727, 2201, + 456, 1793, 2151, + 0, 1868, 2077, + 0, 1952, 1953, + 0, 2045, 1706, + 0, 2145, 138, + 0, 2251, 0, + 0, 2365, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1918, 1462, 2319, + 1913, 1467, 2317, + 1907, 1474, 2315, + 1899, 1482, 2313, + 1887, 1494, 2309, + 1871, 1509, 2305, + 1849, 1529, 2297, + 1818, 1554, 2289, + 1772, 1585, 2277, + 1703, 1623, 2261, + 1590, 1670, 2237, + 1374, 1727, 2203, + 617, 1792, 2155, + 0, 1867, 2081, + 0, 1952, 1958, + 0, 2045, 1714, + 0, 2145, 344, + 0, 2251, 0, + 0, 2363, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1928, 1460, 2321, + 1924, 1465, 2319, + 1918, 1472, 2317, + 1909, 1481, 2315, + 1898, 1493, 2311, + 1883, 1508, 2307, + 1861, 1528, 2301, + 1831, 1552, 2291, + 1786, 1584, 2279, + 1719, 1622, 2263, + 1611, 1670, 2241, + 1407, 1726, 2207, + 769, 1792, 2159, + 0, 1867, 2085, + 0, 1951, 1964, + 0, 2044, 1724, + 0, 2145, 525, + 0, 2251, 0, + 0, 2363, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1942, 1458, 2325, + 1937, 1463, 2323, + 1931, 1470, 2321, + 1923, 1479, 2319, + 1912, 1491, 2315, + 1897, 1506, 2311, + 1877, 1526, 2305, + 1847, 1551, 2295, + 1804, 1582, 2283, + 1740, 1621, 2267, + 1637, 1668, 2245, + 1448, 1725, 2213, + 916, 1791, 2165, + 0, 1866, 2093, + 0, 1951, 1972, + 0, 2044, 1738, + 0, 2145, 690, + 0, 2251, 0, + 0, 2363, 0, + 0, 2481, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1959, 1456, 2331, + 1955, 1461, 2329, + 1949, 1468, 2327, + 1941, 1477, 2325, + 1931, 1489, 2321, + 1916, 1504, 2317, + 1896, 1524, 2309, + 1868, 1549, 2301, + 1828, 1580, 2289, + 1767, 1619, 2273, + 1670, 1667, 2251, + 1497, 1723, 2219, + 1059, 1789, 2171, + 0, 1865, 2101, + 0, 1950, 1983, + 0, 2043, 1757, + 0, 2143, 845, + 0, 2251, 0, + 0, 2363, 0, + 0, 2479, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 1981, 1452, 2337, + 1977, 1457, 2335, + 1972, 1464, 2333, + 1964, 1474, 2331, + 1954, 1485, 2327, + 1941, 1501, 2323, + 1922, 1521, 2317, + 1895, 1546, 2309, + 1857, 1578, 2297, + 1800, 1617, 2281, + 1711, 1665, 2259, + 1556, 1721, 2227, + 1199, 1788, 2181, + 0, 1864, 2111, + 0, 1949, 1998, + 0, 2042, 1780, + 0, 2143, 994, + 0, 2251, 0, + 0, 2363, 0, + 0, 2479, 0, + 0, 2601, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2009, 1448, 2345, + 2005, 1453, 2345, + 2000, 1460, 2343, + 1993, 1469, 2339, + 1984, 1481, 2337, + 1971, 1497, 2333, + 1953, 1517, 2325, + 1929, 1542, 2317, + 1893, 1574, 2307, + 1841, 1614, 2291, + 1761, 1662, 2269, + 1624, 1719, 2239, + 1337, 1786, 2193, + 0, 1862, 2125, + 0, 1947, 2016, + 0, 2041, 1809, + 0, 2141, 1138, + 0, 2249, 0, + 0, 2363, 0, + 0, 2479, 0, + 0, 2599, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2044, 1441, 2357, + 2040, 1447, 2355, + 2036, 1454, 2353, + 2029, 1463, 2351, + 2021, 1475, 2349, + 2009, 1491, 2343, + 1993, 1511, 2337, + 1970, 1537, 2329, + 1938, 1569, 2319, + 1891, 1609, 2303, + 1819, 1658, 2283, + 1702, 1715, 2253, + 1473, 1783, 2209, + 536, 1859, 2145, + 0, 1945, 2039, + 0, 2039, 1845, + 0, 2141, 1279, + 0, 2249, 0, + 0, 2361, 0, + 0, 2479, 0, + 0, 2599, 0, + 0, 2723, 0, + 0, 2849, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2087, 1433, 2371, + 2083, 1438, 2371, + 2079, 1445, 2369, + 2073, 1455, 2367, + 2065, 1467, 2363, + 2055, 1483, 2359, + 2040, 1504, 2353, + 2020, 1530, 2345, + 1991, 1563, 2335, + 1950, 1603, 2321, + 1887, 1652, 2299, + 1788, 1711, 2271, + 1609, 1779, 2229, + 1134, 1856, 2167, + 0, 1942, 2069, + 0, 2037, 1889, + 0, 2139, 1417, + 0, 2247, 0, + 0, 2361, 0, + 0, 2477, 0, + 0, 2599, 0, + 0, 2723, 0, + 0, 2847, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2139, 1421, 2391, + 2135, 1427, 2389, + 2131, 1434, 2389, + 2127, 1444, 2385, + 2119, 1456, 2383, + 2111, 1473, 2379, + 2097, 1494, 2373, + 2079, 1521, 2365, + 2055, 1554, 2355, + 2018, 1595, 2341, + 1965, 1645, 2323, + 1883, 1704, 2295, + 1743, 1773, 2255, + 1444, 1851, 2197, + 0, 1938, 2105, + 0, 2034, 1943, + 0, 2137, 1554, + 0, 2245, 0, + 0, 2359, 0, + 0, 2477, 0, + 0, 2597, 0, + 0, 2721, 0, + 0, 2847, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2199, 1405, 2415, + 2197, 1411, 2415, + 2193, 1418, 2413, + 2189, 1428, 2411, + 2183, 1441, 2407, + 2175, 1458, 2403, + 2163, 1480, 2399, + 2149, 1508, 2391, + 2127, 1542, 2383, + 2097, 1584, 2369, + 2051, 1635, 2351, + 1985, 1696, 2325, + 1877, 1766, 2289, + 1675, 1845, 2235, + 1046, 1933, 2149, + 0, 2030, 2005, + 0, 2133, 1690, + 0, 2243, 0, + 0, 2357, 0, + 0, 2475, 0, + 0, 2597, 0, + 0, 2721, 0, + 0, 2847, 0, + 0, 2973, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2269, 1382, 2447, + 2267, 1388, 2445, + 2265, 1396, 2443, + 2261, 1407, 2441, + 2255, 1421, 2439, + 2249, 1438, 2435, + 2239, 1461, 2431, + 2227, 1490, 2423, + 2209, 1526, 2415, + 2183, 1569, 2403, + 2147, 1622, 2385, + 2093, 1684, 2363, + 2010, 1756, 2329, + 1869, 1837, 2279, + 1564, 1926, 2203, + 0, 2024, 2077, + 0, 2129, 1825, + 0, 2239, 0, + 0, 2353, 0, + 0, 2473, 0, + 0, 2595, 0, + 0, 2719, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2349, 1350, 2485, + 2347, 1357, 2483, + 2345, 1365, 2481, + 2343, 1377, 2481, + 2339, 1391, 2477, + 2333, 1410, 2475, + 2325, 1434, 2469, + 2313, 1465, 2463, + 2299, 1502, 2455, + 2279, 1548, 2445, + 2249, 1603, 2429, + 2207, 1668, 2407, + 2143, 1742, 2377, + 2042, 1825, 2333, + 1857, 1917, 2267, + 1353, 2016, 2159, + 0, 2123, 1959, + 0, 2233, 1343, + 0, 2351, 0, + 0, 2469, 0, + 0, 2593, 0, + 0, 2717, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2439, 1303, 2531, + 2437, 1311, 2529, + 2435, 1320, 2529, + 2433, 1333, 2527, + 2429, 1349, 2525, + 2425, 1369, 2521, + 2417, 1396, 2517, + 2409, 1429, 2513, + 2397, 1469, 2505, + 2381, 1519, 2495, + 2357, 1577, 2481, + 2325, 1645, 2463, + 2277, 1723, 2435, + 2203, 1809, 2397, + 2081, 1904, 2339, + 1842, 2006, 2249, + 650, 2115, 2093, + 0, 2227, 1726, + 0, 2345, 0, + 0, 2467, 0, + 0, 2589, 0, + 0, 2715, 0, + 0, 2843, 0, + 0, 2971, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2535, 1232, 2587, + 2535, 1241, 2585, + 2533, 1252, 2585, + 2531, 1266, 2583, + 2527, 1285, 2581, + 2523, 1309, 2579, + 2519, 1339, 2575, + 2511, 1376, 2569, + 2503, 1421, 2563, + 2489, 1476, 2555, + 2471, 1540, 2543, + 2445, 1613, 2527, + 2409, 1696, 2503, + 2355, 1787, 2469, + 2271, 1886, 2421, + 2129, 1992, 2347, + 1820, 2103, 2225, + 0, 2219, 1984, + 0, 2339, 715, + 0, 2461, 0, + 0, 2585, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3885, 0, + 0, 4017, 0, + 2639, 1115, 2651, + 2639, 1126, 2651, + 2637, 1141, 2649, + 2635, 1159, 2649, + 2633, 1182, 2647, + 2629, 1212, 2645, + 2625, 1249, 2641, + 2621, 1294, 2637, + 2613, 1348, 2631, + 2603, 1411, 2623, + 2589, 1484, 2613, + 2569, 1566, 2599, + 2541, 1657, 2579, + 2503, 1756, 2553, + 2443, 1861, 2513, + 2351, 1972, 2453, + 2187, 2087, 2359, + 1790, 2207, 2191, + 0, 2329, 1781, + 0, 2455, 0, + 0, 2581, 0, + 0, 2709, 0, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2749, 890, 2725, + 2749, 908, 2725, + 2747, 930, 2725, + 2745, 959, 2723, + 2743, 995, 2721, + 2741, 1039, 2719, + 2739, 1092, 2717, + 2735, 1154, 2713, + 2729, 1226, 2709, + 2721, 1307, 2703, + 2709, 1397, 2695, + 2695, 1495, 2683, + 2673, 1599, 2665, + 2645, 1710, 2643, + 2603, 1825, 2611, + 2539, 1944, 2563, + 2437, 2067, 2491, + 2253, 2191, 2373, + 1746, 2317, 2141, + 0, 2445, 1143, + 0, 2573, 0, + 0, 2703, 0, + 0, 2833, 0, + 0, 2965, 0, + 0, 3095, 0, + 0, 3227, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2863, 0, 2809, + 2863, 107, 2809, + 2863, 226, 2809, + 2861, 348, 2807, + 2859, 473, 2807, + 2857, 599, 2805, + 2855, 727, 2803, + 2851, 856, 2799, + 2847, 986, 2795, + 2841, 1116, 2791, + 2833, 1246, 2783, + 2821, 1377, 2773, + 2807, 1509, 2761, + 2785, 1640, 2741, + 2755, 1772, 2715, + 2709, 1904, 2679, + 2643, 2036, 2623, + 2533, 2167, 2539, + 2329, 2299, 2391, + 1679, 2431, 2063, + 0, 2563, 0, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2981, 0, 2901, + 2981, 0, 2901, + 2981, 0, 2901, + 2981, 0, 2899, + 2979, 0, 2899, + 2977, 0, 2897, + 2975, 0, 2895, + 2973, 0, 2893, + 2969, 0, 2891, + 2965, 568, 2887, + 2959, 908, 2881, + 2951, 1150, 2873, + 2939, 1350, 2861, + 2923, 1527, 2847, + 2901, 1690, 2827, + 2869, 1844, 2797, + 2821, 1992, 2757, + 2751, 2135, 2693, + 2635, 2275, 2595, + 2413, 2413, 2413, + 1570, 2551, 1934, + 0, 2685, 0, + 0, 2821, 0, + 0, 2955, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3885, 0, + 0, 4017, 0, + 3103, 0, 3001, + 3103, 0, 3001, + 3103, 0, 3001, + 3103, 0, 3001, + 3101, 0, 2999, + 3101, 0, 2999, + 3099, 0, 2997, + 3097, 0, 2995, + 3095, 0, 2993, + 3091, 0, 2989, + 3087, 0, 2985, + 3079, 228, 2979, + 3071, 978, 2969, + 3059, 1310, 2959, + 3043, 1550, 2943, + 3019, 1749, 2921, + 2987, 1925, 2889, + 2939, 2087, 2843, + 2865, 2241, 2773, + 2745, 2389, 2659, + 2507, 2531, 2443, + 1368, 2673, 1669, + 0, 2811, 0, + 0, 2947, 0, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3227, 0, 3107, + 3227, 0, 3107, + 3227, 0, 3107, + 3227, 0, 3107, + 3227, 0, 3107, + 3225, 0, 3105, + 3225, 0, 3105, + 3223, 0, 3103, + 3221, 0, 3101, + 3219, 0, 3099, + 3215, 0, 3095, + 3209, 0, 3089, + 3203, 0, 3083, + 3195, 541, 3073, + 3183, 1251, 3061, + 3165, 1579, 3045, + 3141, 1817, 3021, + 3109, 2015, 2987, + 3059, 2191, 2937, + 2983, 2353, 2861, + 2859, 2505, 2735, + 2609, 2653, 2479, + 735, 2797, 0, + 0, 2937, 0, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3219, + 3353, 0, 3217, + 3351, 0, 3217, + 3351, 0, 3215, + 3349, 0, 3215, + 3347, 0, 3213, + 3343, 0, 3209, + 3341, 0, 3205, + 3335, 0, 3201, + 3329, 0, 3193, + 3319, 0, 3185, + 3307, 1158, 3171, + 3291, 1616, 3153, + 3267, 1895, 3129, + 3233, 2113, 3093, + 3183, 2299, 3039, + 3105, 2469, 2957, + 2977, 2627, 2819, + 2715, 2777, 2523, + 0, 2923, 0, + 0, 3065, 0, + 0, 3203, 0, + 0, 3341, 0, + 0, 3477, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3481, 0, 3337, + 3481, 0, 3335, + 3481, 0, 3335, + 3481, 0, 3335, + 3481, 0, 3335, + 3481, 0, 3335, + 3479, 0, 3333, + 3479, 0, 3333, + 3477, 0, 3331, + 3475, 0, 3331, + 3473, 0, 3327, + 3471, 0, 3325, + 3467, 0, 3321, + 3463, 0, 3315, + 3455, 0, 3309, + 3447, 0, 3299, + 3435, 994, 3285, + 3417, 1660, 3267, + 3393, 1982, 3241, + 3359, 2217, 3203, + 3307, 2413, 3147, + 3229, 2589, 3061, + 3097, 2749, 2911, + 2827, 2903, 2577, + 0, 3051, 0, + 0, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3611, 0, 3457, + 3611, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3609, 0, 3455, + 3607, 0, 3453, + 3607, 0, 3453, + 3605, 0, 3451, + 3605, 0, 3449, + 3603, 0, 3447, + 3599, 0, 3445, + 3595, 0, 3441, + 3591, 0, 3435, + 3585, 0, 3427, + 3575, 0, 3417, + 3563, 594, 3403, + 3545, 1714, 3385, + 3521, 2077, 3357, + 3485, 2327, 3319, + 3435, 2531, 3261, + 3355, 2711, 3171, + 3221, 2875, 3011, + 2945, 3031, 2639, + 0, 3179, 0, + 0, 3323, 0, + 0, 3463, 0, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3579, + 3739, 0, 3577, + 3739, 0, 3577, + 3739, 0, 3577, + 3737, 0, 3577, + 3737, 0, 3575, + 3735, 0, 3575, + 3733, 0, 3573, + 3731, 0, 3571, + 3729, 0, 3567, + 3725, 0, 3563, + 3721, 0, 3557, + 3713, 0, 3549, + 3705, 0, 3539, + 3691, 0, 3525, + 3673, 1776, 3505, + 3649, 2179, 3479, + 3615, 2443, 3439, + 3563, 2653, 3379, + 3483, 2835, 3285, + 3347, 3003, 3119, + 3065, 3159, 2711, + 0, 3309, 0, + 0, 3453, 0, + 0, 3595, 0, + 0, 3733, 0, + 0, 3871, 0, + 0, 4007, 0, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3703, + 3869, 0, 3701, + 3867, 0, 3701, + 3867, 0, 3701, + 3865, 0, 3699, + 3863, 0, 3697, + 3861, 0, 3695, + 3859, 0, 3691, + 3855, 0, 3687, + 3851, 0, 3683, + 3843, 0, 3675, + 3835, 0, 3663, + 3821, 0, 3649, + 3803, 1849, 3629, + 3779, 2287, 3601, + 3743, 2561, 3561, + 3691, 2777, 3499, + 3611, 2963, 3403, + 3475, 3131, 3231, + 3189, 3289, 2793, + 0, 3439, 0, + 0, 3583, 0, + 0, 3725, 0, + 0, 3865, 0, + 0, 4001, 0, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 4001, 0, 3831, + 3999, 0, 3829, + 3999, 0, 3829, + 3999, 0, 3829, + 3999, 0, 3829, + 3999, 0, 3827, + 3997, 0, 3827, + 3997, 0, 3825, + 3995, 0, 3823, + 3993, 0, 3821, + 3989, 0, 3819, + 3985, 0, 3815, + 3981, 0, 3809, + 3975, 0, 3801, + 3965, 0, 3791, + 3951, 0, 3775, + 3935, 1931, 3755, + 3909, 2401, 3727, + 3873, 2683, 3685, + 3821, 2903, 3623, + 3741, 3091, 3525, + 3603, 3261, 3347, + 3313, 3419, 2883, + 0, 3569, 0, + 0, 3715, 0, + 0, 3857, 0, + 0, 3997, 0, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3959, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3955, + 4095, 0, 3955, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3949, + 4095, 0, 3947, + 4095, 0, 3943, + 4095, 0, 3937, + 4095, 0, 3929, + 4095, 0, 3917, + 4083, 0, 3903, + 4065, 2021, 3883, + 4041, 2519, 3853, + 4005, 2809, 3811, + 3951, 3031, 3749, + 3871, 3219, 3649, + 3733, 3391, 3467, + 3441, 3549, 2981, + 0, 3701, 0, + 0, 3847, 0, + 0, 3989, 0, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4087, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 0, 4083, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4075, + 4095, 0, 4071, + 4095, 0, 4065, + 4095, 0, 4057, + 4095, 0, 4047, + 4095, 0, 4031, + 4095, 2119, 4011, + 4095, 2639, 3981, + 4095, 2935, 3939, + 4083, 3159, 3877, + 4001, 3349, 3775, + 3863, 3521, 3591, + 3569, 3681, 3087, + 0, 3831, 0, + 0, 3977, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2225, 4095, + 4095, 2763, 4095, + 4095, 3063, 4069, + 4095, 3289, 4005, + 4095, 3479, 3903, + 3993, 3651, 3715, + 3699, 3811, 3197, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2335, 4095, + 4095, 2889, 4095, + 4095, 3191, 4095, + 4095, 3419, 4095, + 4095, 3611, 4031, + 4095, 3783, 3843, + 3829, 3943, 3313, + 2035, 1592, 2447, + 2032, 1596, 2445, + 2027, 1601, 2445, + 2021, 1608, 2443, + 2012, 1617, 2439, + 2000, 1629, 2435, + 1983, 1644, 2431, + 1960, 1663, 2425, + 1927, 1688, 2415, + 1879, 1719, 2403, + 1805, 1757, 2387, + 1684, 1804, 2363, + 1443, 1860, 2329, + 219, 1926, 2281, + 0, 2001, 2205, + 0, 2085, 2079, + 0, 2177, 1827, + 0, 2277, 0, + 0, 2385, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2857, 0, + 0, 2981, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2040, 1592, 2447, + 2036, 1596, 2447, + 2032, 1601, 2445, + 2025, 1607, 2443, + 2017, 1616, 2441, + 2005, 1628, 2437, + 1988, 1643, 2433, + 1965, 1662, 2425, + 1933, 1687, 2417, + 1885, 1718, 2405, + 1813, 1757, 2387, + 1693, 1804, 2365, + 1459, 1860, 2331, + 414, 1925, 2281, + 0, 2000, 2207, + 0, 2085, 2081, + 0, 2177, 1831, + 0, 2277, 16, + 0, 2385, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2857, 0, + 0, 2981, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2046, 1591, 2449, + 2042, 1595, 2449, + 2038, 1600, 2447, + 2031, 1607, 2445, + 2023, 1616, 2443, + 2011, 1627, 2439, + 1995, 1642, 2433, + 1972, 1662, 2427, + 1940, 1687, 2419, + 1894, 1718, 2407, + 1822, 1756, 2389, + 1706, 1803, 2367, + 1480, 1859, 2333, + 588, 1925, 2285, + 0, 2000, 2209, + 0, 2085, 2085, + 0, 2177, 1838, + 0, 2277, 270, + 0, 2385, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2053, 1590, 2451, + 2051, 1594, 2451, + 2046, 1599, 2449, + 2039, 1606, 2447, + 2031, 1615, 2445, + 2019, 1626, 2441, + 2004, 1641, 2437, + 1981, 1661, 2429, + 1950, 1686, 2421, + 1904, 1717, 2409, + 1835, 1756, 2393, + 1722, 1803, 2369, + 1507, 1859, 2335, + 749, 1924, 2287, + 0, 2000, 2213, + 0, 2083, 2089, + 0, 2177, 1846, + 0, 2277, 476, + 0, 2383, 0, + 0, 2497, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2063, 1588, 2455, + 2061, 1592, 2453, + 2055, 1597, 2453, + 2049, 1604, 2451, + 2042, 1613, 2447, + 2030, 1625, 2443, + 2015, 1640, 2439, + 1993, 1660, 2433, + 1963, 1685, 2423, + 1918, 1716, 2411, + 1851, 1755, 2395, + 1743, 1802, 2373, + 1540, 1858, 2339, + 902, 1924, 2291, + 0, 1999, 2217, + 0, 2083, 2097, + 0, 2177, 1857, + 0, 2277, 657, + 0, 2383, 0, + 0, 2495, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2077, 1586, 2459, + 2073, 1590, 2457, + 2069, 1596, 2455, + 2063, 1602, 2453, + 2055, 1611, 2451, + 2045, 1623, 2447, + 2030, 1638, 2443, + 2009, 1658, 2437, + 1979, 1683, 2429, + 1937, 1714, 2417, + 1872, 1753, 2399, + 1769, 1801, 2377, + 1580, 1857, 2345, + 1048, 1923, 2297, + 0, 1998, 2225, + 0, 2083, 2105, + 0, 2175, 1871, + 0, 2277, 822, + 0, 2383, 0, + 0, 2495, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2095, 1584, 2463, + 2091, 1588, 2463, + 2087, 1593, 2461, + 2081, 1600, 2459, + 2073, 1609, 2457, + 2063, 1621, 2453, + 2049, 1636, 2449, + 2029, 1656, 2441, + 2000, 1681, 2433, + 1960, 1712, 2421, + 1899, 1751, 2405, + 1802, 1799, 2383, + 1630, 1855, 2351, + 1191, 1922, 2303, + 0, 1997, 2233, + 0, 2081, 2115, + 0, 2175, 1889, + 0, 2275, 977, + 0, 2383, 0, + 0, 2495, 0, + 0, 2613, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2117, 1580, 2471, + 2113, 1584, 2469, + 2109, 1590, 2467, + 2103, 1597, 2465, + 2097, 1606, 2463, + 2087, 1618, 2459, + 2073, 1633, 2455, + 2053, 1653, 2449, + 2027, 1678, 2441, + 1989, 1710, 2429, + 1932, 1749, 2413, + 1843, 1797, 2391, + 1688, 1854, 2359, + 1331, 1920, 2313, + 0, 1996, 2243, + 0, 2081, 2129, + 0, 2175, 1912, + 0, 2275, 1126, + 0, 2383, 0, + 0, 2495, 0, + 0, 2611, 0, + 0, 2733, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2143, 1576, 2479, + 2141, 1580, 2477, + 2137, 1585, 2477, + 2133, 1592, 2475, + 2125, 1601, 2473, + 2117, 1613, 2469, + 2103, 1629, 2465, + 2085, 1649, 2459, + 2061, 1674, 2449, + 2025, 1706, 2439, + 1973, 1746, 2423, + 1893, 1794, 2401, + 1756, 1851, 2371, + 1469, 1918, 2325, + 0, 1994, 2257, + 0, 2079, 2147, + 0, 2173, 1941, + 0, 2273, 1270, + 0, 2381, 0, + 0, 2495, 0, + 0, 2611, 0, + 0, 2731, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2179, 1569, 2491, + 2175, 1573, 2489, + 2173, 1579, 2487, + 2167, 1586, 2487, + 2161, 1595, 2483, + 2153, 1607, 2481, + 2141, 1623, 2475, + 2125, 1643, 2471, + 2103, 1669, 2461, + 2069, 1701, 2451, + 2023, 1741, 2435, + 1951, 1790, 2415, + 1834, 1848, 2385, + 1605, 1915, 2341, + 668, 1991, 2277, + 0, 2077, 2171, + 0, 2171, 1977, + 0, 2273, 1411, + 0, 2381, 0, + 0, 2493, 0, + 0, 2611, 0, + 0, 2731, 0, + 0, 2855, 0, + 0, 2981, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2221, 1561, 2505, + 2219, 1565, 2505, + 2215, 1570, 2503, + 2211, 1578, 2501, + 2205, 1587, 2499, + 2197, 1599, 2495, + 2187, 1615, 2491, + 2173, 1636, 2485, + 2153, 1662, 2477, + 2123, 1695, 2467, + 2081, 1736, 2453, + 2020, 1785, 2433, + 1920, 1843, 2403, + 1741, 1911, 2361, + 1266, 1988, 2299, + 0, 2075, 2201, + 0, 2169, 2022, + 0, 2271, 1549, + 0, 2379, 0, + 0, 2493, 0, + 0, 2609, 0, + 0, 2731, 0, + 0, 2855, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2273, 1549, 2525, + 2271, 1553, 2523, + 2267, 1559, 2521, + 2263, 1566, 2521, + 2259, 1576, 2519, + 2251, 1589, 2515, + 2243, 1605, 2511, + 2229, 1626, 2505, + 2211, 1653, 2497, + 2187, 1686, 2487, + 2151, 1727, 2473, + 2097, 1777, 2455, + 2015, 1837, 2427, + 1875, 1905, 2387, + 1576, 1983, 2329, + 0, 2071, 2237, + 0, 2165, 2075, + 0, 2269, 1686, + 0, 2377, 0, + 0, 2491, 0, + 0, 2609, 0, + 0, 2729, 0, + 0, 2853, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2333, 1532, 2549, + 2331, 1537, 2547, + 2329, 1543, 2547, + 2325, 1550, 2545, + 2321, 1560, 2543, + 2315, 1574, 2539, + 2307, 1591, 2537, + 2295, 1612, 2531, + 2281, 1640, 2523, + 2259, 1674, 2515, + 2229, 1717, 2501, + 2183, 1768, 2483, + 2117, 1828, 2457, + 2009, 1898, 2421, + 1807, 1977, 2367, + 1178, 2065, 2283, + 0, 2161, 2137, + 0, 2265, 1822, + 0, 2375, 0, + 0, 2489, 0, + 0, 2607, 0, + 0, 2729, 0, + 0, 2853, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2403, 1510, 2579, + 2401, 1514, 2579, + 2399, 1520, 2577, + 2397, 1528, 2575, + 2393, 1539, 2573, + 2389, 1553, 2571, + 2381, 1571, 2567, + 2371, 1593, 2563, + 2359, 1622, 2557, + 2341, 1658, 2547, + 2315, 1701, 2535, + 2279, 1754, 2517, + 2225, 1816, 2495, + 2143, 1888, 2461, + 2001, 1969, 2411, + 1696, 2059, 2335, + 0, 2157, 2209, + 0, 2261, 1957, + 0, 2371, 0, + 0, 2485, 0, + 0, 2605, 0, + 0, 2727, 0, + 0, 2851, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3235, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2483, 1477, 2617, + 2481, 1482, 2617, + 2481, 1489, 2615, + 2477, 1497, 2615, + 2475, 1509, 2613, + 2471, 1523, 2609, + 2465, 1542, 2607, + 2457, 1566, 2603, + 2445, 1597, 2597, + 2431, 1634, 2587, + 2411, 1680, 2577, + 2381, 1735, 2561, + 2339, 1800, 2539, + 2275, 1874, 2509, + 2175, 1957, 2465, + 1990, 2049, 2399, + 1485, 2149, 2291, + 0, 2255, 2091, + 0, 2367, 1476, + 0, 2483, 0, + 0, 2603, 0, + 0, 2725, 0, + 0, 2849, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2571, 1430, 2663, + 2571, 1435, 2663, + 2569, 1443, 2661, + 2567, 1452, 2661, + 2565, 1465, 2659, + 2561, 1481, 2657, + 2557, 1502, 2653, + 2549, 1528, 2649, + 2541, 1561, 2645, + 2529, 1602, 2637, + 2513, 1651, 2627, + 2489, 1709, 2613, + 2457, 1777, 2595, + 2409, 1855, 2567, + 2335, 1941, 2529, + 2213, 2036, 2471, + 1974, 2139, 2381, + 782, 2247, 2225, + 0, 2359, 1859, + 0, 2477, 0, + 0, 2599, 0, + 0, 2721, 0, + 0, 2847, 0, + 0, 2975, 0, + 0, 3103, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2669, 1358, 2719, + 2667, 1364, 2719, + 2667, 1373, 2717, + 2665, 1384, 2717, + 2663, 1398, 2715, + 2659, 1417, 2713, + 2655, 1441, 2711, + 2651, 1471, 2707, + 2643, 1508, 2703, + 2635, 1553, 2695, + 2621, 1608, 2687, + 2603, 1672, 2675, + 2577, 1745, 2659, + 2541, 1828, 2635, + 2487, 1919, 2601, + 2405, 2018, 2553, + 2261, 2123, 2479, + 1953, 2235, 2357, + 0, 2351, 2115, + 0, 2471, 847, + 0, 2593, 0, + 0, 2717, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2771, 1239, 2783, + 2771, 1248, 2783, + 2771, 1259, 2783, + 2769, 1273, 2781, + 2767, 1291, 2781, + 2765, 1315, 2779, + 2763, 1344, 2777, + 2757, 1381, 2773, + 2753, 1426, 2769, + 2745, 1480, 2763, + 2735, 1543, 2757, + 2721, 1616, 2745, + 2701, 1698, 2731, + 2673, 1789, 2711, + 2635, 1888, 2685, + 2575, 1993, 2645, + 2483, 2105, 2585, + 2319, 2219, 2491, + 1922, 2339, 2323, + 0, 2461, 1913, + 0, 2587, 0, + 0, 2713, 0, + 0, 2841, 0, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 2881, 1008, 2859, + 2881, 1022, 2857, + 2881, 1039, 2857, + 2879, 1062, 2857, + 2877, 1091, 2855, + 2877, 1127, 2853, + 2873, 1171, 2851, + 2871, 1224, 2849, + 2867, 1286, 2845, + 2861, 1358, 2841, + 2853, 1439, 2835, + 2841, 1529, 2827, + 2827, 1627, 2815, + 2807, 1731, 2799, + 2777, 1842, 2775, + 2735, 1957, 2743, + 2671, 2077, 2695, + 2569, 2199, 2623, + 2385, 2323, 2505, + 1878, 2449, 2273, + 0, 2577, 1276, + 0, 2705, 0, + 0, 2835, 0, + 0, 2965, 0, + 0, 3097, 0, + 0, 3227, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 2995, 13, 2941, + 2995, 124, 2941, + 2995, 239, 2941, + 2995, 358, 2941, + 2993, 481, 2939, + 2991, 605, 2939, + 2989, 731, 2937, + 2987, 859, 2935, + 2985, 988, 2931, + 2979, 1117, 2927, + 2973, 1248, 2923, + 2965, 1378, 2915, + 2955, 1510, 2905, + 2939, 1641, 2893, + 2917, 1772, 2873, + 2887, 1904, 2847, + 2841, 2036, 2811, + 2775, 2167, 2755, + 2665, 2299, 2671, + 2461, 2431, 2523, + 1811, 2563, 2195, + 0, 2695, 0, + 0, 2827, 0, + 0, 2959, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3115, 0, 3035, + 3115, 0, 3033, + 3113, 0, 3033, + 3113, 0, 3033, + 3113, 0, 3033, + 3111, 0, 3031, + 3109, 0, 3029, + 3107, 0, 3029, + 3105, 0, 3025, + 3101, 0, 3023, + 3097, 700, 3019, + 3091, 1040, 3013, + 3083, 1282, 3005, + 3071, 1482, 2993, + 3055, 1659, 2979, + 3033, 1822, 2959, + 3001, 1976, 2931, + 2955, 2123, 2889, + 2883, 2267, 2825, + 2769, 2407, 2727, + 2545, 2545, 2545, + 1703, 2683, 2065, + 0, 2817, 0, + 0, 2953, 0, + 0, 3087, 0, + 0, 3221, 0, + 0, 3353, 0, + 0, 3487, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4017, 0, + 3237, 0, 3133, + 3235, 0, 3133, + 3235, 0, 3133, + 3235, 0, 3133, + 3235, 0, 3133, + 3233, 0, 3131, + 3233, 0, 3131, + 3231, 0, 3129, + 3229, 0, 3127, + 3227, 0, 3125, + 3223, 0, 3121, + 3219, 0, 3117, + 3211, 360, 3111, + 3203, 1109, 3101, + 3191, 1442, 3091, + 3175, 1682, 3075, + 3151, 1881, 3053, + 3119, 2057, 3021, + 3071, 2219, 2975, + 2997, 2373, 2905, + 2877, 2521, 2791, + 2639, 2663, 2575, + 1500, 2805, 1801, + 0, 2943, 0, + 0, 3079, 0, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3361, 0, 3241, + 3359, 0, 3239, + 3359, 0, 3239, + 3359, 0, 3239, + 3359, 0, 3239, + 3359, 0, 3239, + 3357, 0, 3237, + 3357, 0, 3237, + 3355, 0, 3235, + 3353, 0, 3233, + 3351, 0, 3231, + 3347, 0, 3227, + 3341, 0, 3221, + 3335, 0, 3215, + 3327, 673, 3207, + 3315, 1383, 3193, + 3297, 1711, 3177, + 3273, 1949, 3153, + 3241, 2147, 3119, + 3191, 2323, 3069, + 3115, 2485, 2993, + 2991, 2637, 2867, + 2741, 2785, 2611, + 867, 2929, 0, + 0, 3069, 0, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3487, 0, 3351, + 3487, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3351, + 3485, 0, 3349, + 3483, 0, 3349, + 3483, 0, 3347, + 3481, 0, 3347, + 3479, 0, 3345, + 3475, 0, 3341, + 3473, 0, 3337, + 3467, 0, 3333, + 3461, 0, 3325, + 3451, 0, 3317, + 3439, 1290, 3303, + 3423, 1748, 3285, + 3399, 2027, 3261, + 3365, 2245, 3225, + 3315, 2431, 3171, + 3237, 2601, 3091, + 3109, 2759, 2951, + 2847, 2909, 2655, + 0, 3055, 0, + 0, 3197, 0, + 0, 3335, 0, + 0, 3473, 0, + 0, 3609, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3613, 0, 3469, + 3613, 0, 3469, + 3613, 0, 3469, + 3613, 0, 3467, + 3613, 0, 3467, + 3613, 0, 3467, + 3613, 0, 3467, + 3611, 0, 3465, + 3611, 0, 3465, + 3609, 0, 3463, + 3609, 0, 3463, + 3607, 0, 3461, + 3603, 0, 3457, + 3599, 0, 3453, + 3595, 0, 3447, + 3587, 0, 3441, + 3579, 0, 3431, + 3567, 1125, 3417, + 3549, 1792, 3399, + 3525, 2113, 3373, + 3491, 2349, 3335, + 3439, 2545, 3281, + 3361, 2721, 3193, + 3231, 2883, 3043, + 2961, 3035, 2709, + 0, 3183, 0, + 0, 3325, 0, + 0, 3465, 0, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3743, 0, 3589, + 3743, 0, 3589, + 3743, 0, 3589, + 3743, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3587, + 3741, 0, 3585, + 3739, 0, 3585, + 3739, 0, 3583, + 3737, 0, 3581, + 3735, 0, 3579, + 3731, 0, 3577, + 3729, 0, 3573, + 3723, 0, 3567, + 3717, 0, 3559, + 3707, 0, 3549, + 3695, 726, 3537, + 3677, 1846, 3517, + 3653, 2209, 3489, + 3617, 2459, 3451, + 3567, 2663, 3393, + 3487, 2843, 3303, + 3353, 3007, 3145, + 3077, 3163, 2771, + 0, 3311, 0, + 0, 3455, 0, + 0, 3595, 0, + 0, 3735, 0, + 0, 3871, 0, + 0, 4007, 0, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3711, + 3871, 0, 3709, + 3871, 0, 3709, + 3869, 0, 3709, + 3869, 0, 3707, + 3867, 0, 3707, + 3867, 0, 3705, + 3863, 0, 3703, + 3861, 0, 3699, + 3857, 0, 3695, + 3853, 0, 3689, + 3845, 0, 3683, + 3837, 0, 3671, + 3823, 0, 3657, + 3807, 1909, 3637, + 3781, 2311, 3611, + 3747, 2575, 3571, + 3695, 2785, 3511, + 3615, 2969, 3417, + 3479, 3135, 3251, + 3197, 3291, 2843, + 0, 3441, 0, + 0, 3585, 0, + 0, 3727, 0, + 0, 3865, 0, + 0, 4003, 0, + 4003, 0, 3837, + 4003, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 4001, 0, 3835, + 3999, 0, 3833, + 3999, 0, 3833, + 3997, 0, 3831, + 3997, 0, 3829, + 3995, 0, 3827, + 3991, 0, 3825, + 3987, 0, 3819, + 3983, 0, 3815, + 3975, 0, 3807, + 3967, 0, 3797, + 3953, 0, 3781, + 3935, 1981, 3761, + 3911, 2419, 3733, + 3875, 2693, 3693, + 3823, 2909, 3633, + 3743, 3095, 3535, + 3607, 3263, 3363, + 3321, 3421, 2925, + 0, 3571, 0, + 0, 3715, 0, + 0, 3857, 0, + 0, 3997, 0, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3963, + 4095, 0, 3961, + 4095, 0, 3961, + 4095, 0, 3961, + 4095, 0, 3961, + 4095, 0, 3959, + 4095, 0, 3957, + 4095, 0, 3957, + 4095, 0, 3953, + 4095, 0, 3951, + 4095, 0, 3947, + 4095, 0, 3941, + 4095, 0, 3933, + 4095, 0, 3923, + 4083, 0, 3907, + 4067, 2063, 3887, + 4041, 2533, 3859, + 4005, 2815, 3817, + 3953, 3035, 3755, + 3873, 3223, 3657, + 3735, 3393, 3479, + 3447, 3551, 3015, + 0, 3701, 0, + 0, 3847, 0, + 0, 3989, 0, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4087, + 4095, 0, 4085, + 4095, 0, 4085, + 4095, 0, 4081, + 4095, 0, 4079, + 4095, 0, 4075, + 4095, 0, 4069, + 4095, 0, 4061, + 4095, 0, 4049, + 4095, 0, 4035, + 4095, 2153, 4015, + 4095, 2651, 3985, + 4095, 2941, 3945, + 4085, 3163, 3881, + 4003, 3351, 3781, + 3865, 3523, 3599, + 3573, 3681, 3115, + 0, 3833, 0, + 0, 3979, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2251, 4095, + 4095, 2771, 4095, + 4095, 3067, 4071, + 4095, 3291, 4009, + 4095, 3481, 3907, + 3995, 3653, 3723, + 3701, 3813, 3219, + 0, 3963, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2357, 4095, + 4095, 2895, 4095, + 4095, 3195, 4095, + 4095, 3421, 4095, + 4095, 3611, 4035, + 4095, 3783, 3847, + 3831, 3943, 3329, + 2167, 1722, 2579, + 2165, 1725, 2577, + 2161, 1729, 2577, + 2155, 1734, 2575, + 2149, 1741, 2573, + 2141, 1749, 2571, + 2129, 1761, 2567, + 2111, 1776, 2563, + 2089, 1795, 2555, + 2055, 1820, 2547, + 2006, 1851, 2535, + 1932, 1890, 2517, + 1809, 1937, 2493, + 1563, 1992, 2461, + 119, 2057, 2411, + 0, 2133, 2335, + 0, 2217, 2209, + 0, 2309, 1955, + 0, 2409, 0, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2171, 1722, 2579, + 2167, 1724, 2579, + 2165, 1728, 2577, + 2159, 1733, 2577, + 2153, 1740, 2575, + 2145, 1749, 2571, + 2133, 1761, 2569, + 2115, 1776, 2563, + 2093, 1795, 2557, + 2059, 1820, 2547, + 2011, 1851, 2535, + 1938, 1889, 2519, + 1816, 1936, 2495, + 1575, 1992, 2461, + 351, 2057, 2413, + 0, 2133, 2337, + 0, 2217, 2211, + 0, 2309, 1959, + 0, 2409, 0, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2175, 1721, 2581, + 2173, 1724, 2581, + 2169, 1728, 2579, + 2163, 1733, 2577, + 2157, 1740, 2575, + 2149, 1748, 2573, + 2137, 1760, 2569, + 2121, 1775, 2565, + 2097, 1795, 2557, + 2065, 1819, 2549, + 2017, 1850, 2537, + 1945, 1889, 2519, + 1825, 1936, 2497, + 1592, 1992, 2463, + 546, 2057, 2413, + 0, 2133, 2339, + 0, 2217, 2213, + 0, 2309, 1964, + 0, 2409, 148, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2181, 1720, 2583, + 2177, 1723, 2581, + 2175, 1727, 2581, + 2169, 1732, 2579, + 2163, 1739, 2577, + 2155, 1748, 2575, + 2143, 1759, 2571, + 2127, 1774, 2567, + 2105, 1794, 2559, + 2073, 1819, 2551, + 2026, 1850, 2539, + 1955, 1888, 2521, + 1838, 1935, 2499, + 1612, 1991, 2465, + 720, 2057, 2417, + 0, 2133, 2341, + 0, 2217, 2217, + 0, 2309, 1970, + 0, 2409, 403, + 0, 2517, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2189, 1719, 2585, + 2185, 1722, 2583, + 2183, 1726, 2583, + 2177, 1731, 2581, + 2171, 1738, 2579, + 2163, 1747, 2577, + 2151, 1758, 2573, + 2135, 1774, 2569, + 2113, 1793, 2561, + 2083, 1818, 2553, + 2036, 1849, 2541, + 1967, 1888, 2525, + 1854, 1935, 2501, + 1639, 1991, 2467, + 881, 2057, 2419, + 0, 2131, 2345, + 0, 2217, 2223, + 0, 2309, 1978, + 0, 2409, 608, + 0, 2515, 0, + 0, 2629, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2199, 1718, 2587, + 2195, 1721, 2587, + 2193, 1724, 2585, + 2189, 1730, 2585, + 2181, 1736, 2583, + 2173, 1745, 2579, + 2163, 1757, 2577, + 2147, 1772, 2571, + 2125, 1792, 2565, + 2095, 1817, 2557, + 2051, 1848, 2545, + 1984, 1887, 2527, + 1875, 1934, 2505, + 1672, 1990, 2471, + 1033, 2055, 2423, + 0, 2131, 2349, + 0, 2215, 2229, + 0, 2309, 1989, + 0, 2409, 789, + 0, 2515, 0, + 0, 2627, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2211, 1716, 2591, + 2209, 1719, 2591, + 2205, 1723, 2589, + 2201, 1728, 2587, + 2195, 1735, 2587, + 2187, 1744, 2583, + 2177, 1755, 2579, + 2161, 1771, 2575, + 2141, 1790, 2569, + 2111, 1815, 2561, + 2069, 1847, 2549, + 2004, 1885, 2531, + 1901, 1933, 2509, + 1712, 1989, 2477, + 1180, 2055, 2429, + 0, 2131, 2357, + 0, 2215, 2237, + 0, 2307, 2003, + 0, 2409, 954, + 0, 2515, 0, + 0, 2627, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2229, 1713, 2597, + 2227, 1716, 2595, + 2223, 1720, 2595, + 2219, 1725, 2593, + 2213, 1732, 2591, + 2205, 1741, 2589, + 2195, 1753, 2585, + 2181, 1768, 2581, + 2161, 1788, 2575, + 2133, 1813, 2565, + 2091, 1845, 2553, + 2031, 1884, 2537, + 1935, 1931, 2515, + 1762, 1988, 2483, + 1323, 2053, 2435, + 0, 2129, 2365, + 0, 2215, 2247, + 0, 2307, 2021, + 0, 2407, 1109, + 0, 2515, 0, + 0, 2627, 0, + 0, 2745, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2251, 1710, 2603, + 2249, 1713, 2603, + 2245, 1716, 2601, + 2241, 1722, 2599, + 2235, 1729, 2597, + 2229, 1738, 2595, + 2219, 1750, 2591, + 2205, 1765, 2587, + 2185, 1785, 2581, + 2159, 1810, 2573, + 2121, 1842, 2561, + 2065, 1881, 2545, + 1975, 1929, 2523, + 1820, 1986, 2491, + 1463, 2053, 2445, + 0, 2127, 2375, + 0, 2213, 2261, + 0, 2307, 2044, + 0, 2407, 1258, + 0, 2515, 0, + 0, 2627, 0, + 0, 2743, 0, + 0, 2865, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2279, 1705, 2611, + 2275, 1708, 2611, + 2273, 1712, 2609, + 2269, 1717, 2609, + 2265, 1724, 2607, + 2257, 1733, 2605, + 2249, 1745, 2601, + 2235, 1761, 2597, + 2217, 1781, 2591, + 2193, 1806, 2581, + 2157, 1838, 2571, + 2105, 1878, 2555, + 2025, 1926, 2533, + 1888, 1983, 2503, + 1601, 2049, 2457, + 0, 2127, 2389, + 0, 2211, 2281, + 0, 2305, 2073, + 0, 2407, 1402, + 0, 2513, 0, + 0, 2627, 0, + 0, 2743, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2313, 1698, 2623, + 2311, 1701, 2623, + 2309, 1706, 2621, + 2305, 1711, 2619, + 2299, 1718, 2619, + 2293, 1727, 2615, + 2285, 1739, 2613, + 2273, 1755, 2609, + 2257, 1776, 2603, + 2235, 1801, 2595, + 2203, 1834, 2583, + 2155, 1874, 2567, + 2083, 1922, 2547, + 1966, 1980, 2517, + 1738, 2047, 2473, + 801, 2123, 2409, + 0, 2209, 2303, + 0, 2303, 2109, + 0, 2405, 1543, + 0, 2513, 0, + 0, 2625, 0, + 0, 2743, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3113, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2355, 1690, 2637, + 2353, 1693, 2637, + 2351, 1697, 2637, + 2347, 1702, 2635, + 2343, 1710, 2633, + 2337, 1719, 2631, + 2329, 1732, 2627, + 2319, 1748, 2623, + 2305, 1768, 2617, + 2285, 1794, 2609, + 2255, 1827, 2599, + 2213, 1868, 2585, + 2151, 1917, 2565, + 2053, 1975, 2535, + 1873, 2043, 2495, + 1398, 2121, 2431, + 0, 2207, 2333, + 0, 2301, 2153, + 0, 2403, 1682, + 0, 2511, 0, + 0, 2625, 0, + 0, 2741, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2407, 1678, 2657, + 2405, 1681, 2657, + 2403, 1685, 2655, + 2399, 1691, 2655, + 2395, 1698, 2653, + 2391, 1708, 2651, + 2383, 1721, 2647, + 2375, 1737, 2643, + 2361, 1758, 2637, + 2343, 1785, 2631, + 2319, 1818, 2619, + 2283, 1860, 2605, + 2229, 1909, 2587, + 2147, 1969, 2559, + 2007, 2037, 2521, + 1708, 2115, 2461, + 0, 2203, 2369, + 0, 2297, 2207, + 0, 2401, 1818, + 0, 2509, 0, + 0, 2623, 0, + 0, 2741, 0, + 0, 2861, 0, + 0, 2985, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2467, 1661, 2681, + 2465, 1665, 2681, + 2463, 1669, 2679, + 2461, 1675, 2679, + 2457, 1683, 2677, + 2453, 1693, 2675, + 2447, 1706, 2673, + 2439, 1723, 2669, + 2427, 1744, 2663, + 2413, 1772, 2655, + 2391, 1806, 2647, + 2361, 1849, 2633, + 2317, 1900, 2615, + 2249, 1960, 2589, + 2141, 2030, 2553, + 1939, 2109, 2499, + 1310, 2197, 2415, + 0, 2293, 2269, + 0, 2397, 1954, + 0, 2507, 0, + 0, 2621, 0, + 0, 2739, 0, + 0, 2861, 0, + 0, 2985, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2537, 1638, 2711, + 2535, 1642, 2711, + 2535, 1646, 2711, + 2531, 1653, 2709, + 2529, 1661, 2707, + 2525, 1671, 2705, + 2521, 1685, 2703, + 2513, 1703, 2699, + 2503, 1725, 2695, + 2491, 1754, 2689, + 2473, 1790, 2679, + 2447, 1834, 2667, + 2411, 1886, 2651, + 2357, 1948, 2627, + 2275, 2020, 2593, + 2133, 2101, 2543, + 1828, 2191, 2467, + 0, 2289, 2341, + 0, 2393, 2089, + 0, 2503, 0, + 0, 2619, 0, + 0, 2737, 0, + 0, 2859, 0, + 0, 2983, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3367, 0, + 0, 3495, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2617, 1606, 2749, + 2615, 1609, 2749, + 2613, 1614, 2749, + 2613, 1621, 2747, + 2609, 1630, 2747, + 2607, 1641, 2745, + 2603, 1656, 2741, + 2597, 1674, 2739, + 2589, 1699, 2735, + 2577, 1729, 2729, + 2563, 1767, 2719, + 2543, 1813, 2709, + 2513, 1868, 2693, + 2471, 1932, 2671, + 2407, 2006, 2641, + 2307, 2089, 2597, + 2121, 2181, 2531, + 1617, 2281, 2423, + 0, 2387, 2223, + 0, 2499, 1608, + 0, 2615, 0, + 0, 2735, 0, + 0, 2857, 0, + 0, 2981, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2705, 1558, 2797, + 2703, 1562, 2795, + 2703, 1568, 2795, + 2701, 1575, 2795, + 2699, 1584, 2793, + 2697, 1597, 2791, + 2693, 1613, 2789, + 2689, 1634, 2787, + 2683, 1660, 2781, + 2673, 1693, 2777, + 2661, 1734, 2769, + 2645, 1783, 2759, + 2621, 1841, 2745, + 2589, 1909, 2727, + 2541, 1987, 2699, + 2467, 2073, 2661, + 2345, 2169, 2603, + 2107, 2271, 2513, + 914, 2379, 2357, + 0, 2491, 1991, + 0, 2609, 0, + 0, 2731, 0, + 0, 2853, 0, + 0, 2979, 0, + 0, 3107, 0, + 0, 3235, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 2801, 1485, 2851, + 2801, 1490, 2851, + 2799, 1496, 2851, + 2799, 1505, 2849, + 2797, 1516, 2849, + 2795, 1531, 2847, + 2791, 1549, 2845, + 2787, 1573, 2843, + 2783, 1603, 2839, + 2775, 1640, 2835, + 2767, 1686, 2827, + 2753, 1740, 2819, + 2735, 1804, 2807, + 2709, 1877, 2791, + 2673, 1960, 2767, + 2619, 2051, 2735, + 2537, 2151, 2685, + 2393, 2255, 2613, + 2085, 2367, 2489, + 0, 2483, 2249, + 0, 2603, 980, + 0, 2725, 0, + 0, 2851, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 2905, 1365, 2917, + 2903, 1371, 2915, + 2903, 1380, 2915, + 2903, 1391, 2915, + 2901, 1405, 2913, + 2899, 1423, 2913, + 2897, 1447, 2911, + 2895, 1476, 2909, + 2891, 1513, 2905, + 2885, 1558, 2901, + 2877, 1612, 2895, + 2867, 1675, 2889, + 2853, 1748, 2877, + 2833, 1830, 2863, + 2805, 1921, 2845, + 2767, 2020, 2817, + 2707, 2125, 2777, + 2615, 2237, 2717, + 2451, 2351, 2623, + 2055, 2471, 2455, + 0, 2593, 2045, + 0, 2719, 0, + 0, 2845, 0, + 0, 2973, 0, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3013, 1129, 2991, + 3013, 1140, 2991, + 3013, 1154, 2989, + 3013, 1172, 2989, + 3011, 1194, 2989, + 3009, 1223, 2987, + 3009, 1259, 2987, + 3005, 1303, 2985, + 3003, 1356, 2981, + 2999, 1418, 2979, + 2993, 1490, 2973, + 2985, 1571, 2967, + 2973, 1661, 2959, + 2959, 1759, 2947, + 2939, 1864, 2931, + 2909, 1974, 2907, + 2867, 2089, 2875, + 2803, 2209, 2827, + 2701, 2331, 2755, + 2517, 2455, 2637, + 2010, 2581, 2405, + 0, 2709, 1408, + 0, 2837, 0, + 0, 2967, 0, + 0, 3097, 0, + 0, 3229, 0, + 0, 3359, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3129, 41, 3075, + 3129, 145, 3075, + 3127, 256, 3073, + 3127, 371, 3073, + 3127, 491, 3073, + 3125, 613, 3071, + 3123, 737, 3071, + 3123, 864, 3069, + 3119, 991, 3067, + 3117, 1120, 3063, + 3111, 1250, 3059, + 3105, 1380, 3055, + 3097, 1511, 3047, + 3087, 1642, 3037, + 3071, 1773, 3025, + 3049, 1905, 3007, + 3019, 2036, 2981, + 2973, 2169, 2943, + 2907, 2299, 2889, + 2797, 2431, 2803, + 2593, 2563, 2655, + 1943, 2695, 2327, + 0, 2827, 0, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3247, 0, 3167, + 3247, 0, 3167, + 3247, 0, 3165, + 3245, 0, 3165, + 3245, 0, 3165, + 3245, 0, 3165, + 3243, 0, 3163, + 3241, 0, 3161, + 3239, 0, 3161, + 3237, 0, 3157, + 3233, 22, 3155, + 3229, 832, 3151, + 3223, 1172, 3145, + 3215, 1414, 3137, + 3203, 1614, 3127, + 3187, 1791, 3111, + 3165, 1954, 3091, + 3133, 2109, 3063, + 3087, 2255, 3021, + 3015, 2399, 2959, + 2901, 2539, 2859, + 2677, 2677, 2677, + 1835, 2815, 2197, + 0, 2951, 0, + 0, 3085, 0, + 0, 3219, 0, + 0, 3353, 0, + 0, 3485, 0, + 0, 3619, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3369, 0, 3267, + 3369, 0, 3265, + 3367, 0, 3265, + 3367, 0, 3265, + 3367, 0, 3265, + 3367, 0, 3265, + 3365, 0, 3263, + 3365, 0, 3263, + 3363, 0, 3261, + 3361, 0, 3259, + 3359, 0, 3257, + 3355, 0, 3253, + 3351, 0, 3249, + 3343, 492, 3243, + 3335, 1242, 3235, + 3323, 1575, 3223, + 3307, 1814, 3207, + 3283, 2013, 3185, + 3251, 2189, 3153, + 3203, 2351, 3107, + 3129, 2505, 3037, + 3009, 2653, 2925, + 2771, 2797, 2707, + 1632, 2937, 1933, + 0, 3075, 0, + 0, 3211, 0, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3493, 0, 3373, + 3493, 0, 3373, + 3493, 0, 3373, + 3491, 0, 3371, + 3491, 0, 3371, + 3491, 0, 3371, + 3491, 0, 3371, + 3489, 0, 3369, + 3489, 0, 3369, + 3487, 0, 3367, + 3485, 0, 3365, + 3483, 0, 3363, + 3479, 0, 3359, + 3473, 0, 3353, + 3467, 0, 3347, + 3459, 805, 3339, + 3447, 1516, 3325, + 3429, 1844, 3309, + 3405, 2081, 3285, + 3373, 2279, 3251, + 3323, 2455, 3201, + 3249, 2617, 3125, + 3123, 2771, 2999, + 2873, 2917, 2743, + 999, 3061, 0, + 0, 3201, 0, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3619, 0, 3485, + 3619, 0, 3485, + 3619, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3483, + 3617, 0, 3481, + 3615, 0, 3481, + 3615, 0, 3479, + 3613, 0, 3479, + 3611, 0, 3477, + 3609, 0, 3473, + 3605, 0, 3469, + 3599, 0, 3465, + 3593, 0, 3457, + 3583, 0, 3449, + 3571, 1422, 3435, + 3555, 1880, 3417, + 3531, 2159, 3393, + 3497, 2377, 3357, + 3447, 2563, 3303, + 3369, 2733, 3223, + 3241, 2891, 3083, + 2979, 3041, 2787, + 0, 3187, 0, + 0, 3329, 0, + 0, 3467, 0, + 0, 3605, 0, + 0, 3741, 0, + 0, 3877, 0, + 0, 4011, 0, + 3745, 0, 3601, + 3745, 0, 3601, + 3745, 0, 3601, + 3745, 0, 3601, + 3745, 0, 3599, + 3745, 0, 3599, + 3745, 0, 3599, + 3745, 0, 3599, + 3743, 0, 3599, + 3743, 0, 3597, + 3741, 0, 3597, + 3741, 0, 3595, + 3739, 0, 3593, + 3735, 0, 3589, + 3731, 0, 3585, + 3727, 0, 3581, + 3721, 0, 3573, + 3711, 0, 3563, + 3699, 1258, 3549, + 3681, 1924, 3531, + 3657, 2245, 3505, + 3623, 2481, 3467, + 3571, 2677, 3413, + 3493, 2853, 3325, + 3363, 3015, 3177, + 3093, 3167, 2841, + 0, 3315, 0, + 0, 3457, 0, + 0, 3597, 0, + 0, 3735, 0, + 0, 3873, 0, + 0, 4007, 0, + 3875, 0, 3721, + 3875, 0, 3721, + 3875, 0, 3721, + 3875, 0, 3721, + 3875, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3719, + 3873, 0, 3717, + 3871, 0, 3717, + 3871, 0, 3715, + 3869, 0, 3715, + 3867, 0, 3711, + 3863, 0, 3709, + 3861, 0, 3705, + 3855, 0, 3699, + 3849, 0, 3693, + 3839, 0, 3681, + 3827, 858, 3669, + 3809, 1978, 3649, + 3785, 2341, 3623, + 3749, 2591, 3583, + 3699, 2795, 3525, + 3619, 2975, 3435, + 3485, 3139, 3277, + 3209, 3295, 2903, + 0, 3443, 0, + 0, 3587, 0, + 0, 3727, 0, + 0, 3867, 0, + 0, 4003, 0, + 4005, 0, 3843, + 4005, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3843, + 4003, 0, 3841, + 4003, 0, 3841, + 4001, 0, 3841, + 4001, 0, 3839, + 3999, 0, 3839, + 3999, 0, 3837, + 3997, 0, 3835, + 3993, 0, 3831, + 3989, 0, 3827, + 3985, 0, 3821, + 3977, 0, 3815, + 3969, 0, 3803, + 3955, 0, 3789, + 3939, 2041, 3771, + 3913, 2443, 3743, + 3879, 2707, 3703, + 3827, 2917, 3643, + 3747, 3101, 3549, + 3611, 3267, 3383, + 3329, 3423, 2977, + 0, 3573, 0, + 0, 3717, 0, + 0, 3859, 0, + 0, 3997, 0, + 4095, 0, 3969, + 4095, 0, 3969, + 4095, 0, 3969, + 4095, 0, 3969, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3967, + 4095, 0, 3965, + 4095, 0, 3965, + 4095, 0, 3963, + 4095, 0, 3961, + 4095, 0, 3959, + 4095, 0, 3957, + 4095, 0, 3951, + 4095, 0, 3947, + 4095, 0, 3939, + 4095, 0, 3929, + 4085, 0, 3913, + 4067, 2113, 3893, + 4043, 2551, 3865, + 4007, 2825, 3825, + 3955, 3041, 3765, + 3875, 3227, 3667, + 3739, 3395, 3495, + 3453, 3553, 3057, + 0, 3703, 0, + 0, 3849, 0, + 0, 3989, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4093, + 4095, 0, 4093, + 4095, 0, 4093, + 4095, 0, 4093, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 0, 4079, + 4095, 0, 4073, + 4095, 0, 4065, + 4095, 0, 4055, + 4095, 0, 4039, + 4095, 2195, 4019, + 4095, 2665, 3991, + 4095, 2947, 3949, + 4085, 3167, 3887, + 4005, 3355, 3789, + 3867, 3525, 3611, + 3579, 3683, 3149, + 0, 3833, 0, + 0, 3979, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2285, 4095, + 4095, 2783, 4095, + 4095, 3073, 4077, + 4095, 3295, 4013, + 4095, 3483, 3913, + 3997, 3655, 3731, + 3705, 3813, 3247, + 0, 3965, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2383, 4095, + 4095, 2905, 4095, + 4095, 3199, 4095, + 4095, 3423, 4095, + 4095, 3613, 4039, + 4095, 3785, 3855, + 3833, 3945, 3351, + 2299, 1852, 2711, + 2297, 1854, 2711, + 2293, 1857, 2709, + 2291, 1861, 2709, + 2285, 1866, 2707, + 2279, 1873, 2705, + 2269, 1882, 2703, + 2257, 1893, 2699, + 2241, 1909, 2693, + 2217, 1928, 2687, + 2183, 1953, 2679, + 2135, 1984, 2665, + 2059, 2022, 2649, + 1935, 2069, 2625, + 1685, 2125, 2591, + 0, 2191, 2541, + 0, 2265, 2467, + 0, 2349, 2339, + 0, 2441, 2085, + 0, 2543, 0, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2301, 1852, 2711, + 2299, 1854, 2711, + 2297, 1857, 2711, + 2293, 1861, 2709, + 2287, 1866, 2707, + 2281, 1873, 2705, + 2273, 1882, 2703, + 2261, 1893, 2699, + 2243, 1908, 2695, + 2221, 1928, 2687, + 2187, 1952, 2679, + 2139, 1983, 2667, + 2065, 2022, 2649, + 1941, 2069, 2627, + 1695, 2125, 2593, + 251, 2191, 2543, + 0, 2265, 2467, + 0, 2349, 2341, + 0, 2441, 2087, + 0, 2541, 0, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2305, 1851, 2713, + 2303, 1854, 2711, + 2299, 1857, 2711, + 2297, 1860, 2709, + 2291, 1866, 2709, + 2285, 1872, 2707, + 2277, 1881, 2703, + 2265, 1893, 2701, + 2247, 1908, 2695, + 2225, 1927, 2689, + 2191, 1952, 2679, + 2143, 1983, 2667, + 2069, 2022, 2651, + 1948, 2069, 2627, + 1708, 2125, 2593, + 483, 2189, 2545, + 0, 2265, 2469, + 0, 2349, 2343, + 0, 2441, 2091, + 0, 2541, 0, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2309, 1851, 2713, + 2307, 1853, 2713, + 2305, 1856, 2713, + 2301, 1860, 2711, + 2295, 1865, 2709, + 2289, 1872, 2707, + 2281, 1881, 2705, + 2269, 1892, 2701, + 2253, 1907, 2697, + 2229, 1927, 2691, + 2197, 1951, 2681, + 2149, 1983, 2669, + 2077, 2021, 2653, + 1958, 2069, 2629, + 1724, 2125, 2595, + 678, 2189, 2547, + 0, 2265, 2471, + 0, 2349, 2345, + 0, 2441, 2095, + 0, 2541, 280, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2315, 1850, 2715, + 2313, 1852, 2715, + 2311, 1855, 2713, + 2307, 1859, 2713, + 2301, 1864, 2711, + 2295, 1871, 2709, + 2287, 1880, 2707, + 2275, 1891, 2703, + 2259, 1907, 2699, + 2237, 1926, 2691, + 2205, 1951, 2683, + 2157, 1982, 2671, + 2087, 2021, 2653, + 1970, 2067, 2631, + 1744, 2123, 2597, + 852, 2189, 2549, + 0, 2265, 2473, + 0, 2349, 2349, + 0, 2441, 2101, + 0, 2541, 535, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2323, 1849, 2717, + 2321, 1851, 2717, + 2317, 1854, 2715, + 2315, 1858, 2715, + 2309, 1863, 2713, + 2303, 1870, 2711, + 2295, 1879, 2709, + 2283, 1890, 2705, + 2267, 1906, 2701, + 2245, 1925, 2693, + 2215, 1950, 2685, + 2169, 1981, 2673, + 2099, 2020, 2657, + 1986, 2067, 2633, + 1771, 2123, 2599, + 1013, 2189, 2551, + 0, 2263, 2477, + 0, 2349, 2355, + 0, 2441, 2111, + 0, 2541, 741, + 0, 2649, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2333, 1848, 2721, + 2331, 1850, 2719, + 2327, 1853, 2719, + 2325, 1857, 2717, + 2321, 1862, 2717, + 2315, 1869, 2715, + 2305, 1877, 2711, + 2295, 1889, 2709, + 2279, 1904, 2703, + 2257, 1924, 2697, + 2227, 1949, 2689, + 2183, 1980, 2677, + 2115, 2019, 2659, + 2007, 2065, 2637, + 1804, 2123, 2603, + 1166, 2187, 2555, + 0, 2263, 2483, + 0, 2347, 2361, + 0, 2441, 2121, + 0, 2541, 921, + 0, 2647, 0, + 0, 2761, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3121, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2345, 1846, 2725, + 2343, 1848, 2723, + 2341, 1851, 2723, + 2337, 1855, 2721, + 2333, 1860, 2721, + 2327, 1867, 2719, + 2319, 1876, 2715, + 2309, 1887, 2713, + 2293, 1903, 2707, + 2273, 1922, 2701, + 2243, 1947, 2693, + 2201, 1979, 2681, + 2137, 2017, 2663, + 2034, 2065, 2641, + 1845, 2121, 2609, + 1312, 2187, 2561, + 0, 2263, 2489, + 0, 2347, 2369, + 0, 2441, 2135, + 0, 2541, 1086, + 0, 2647, 0, + 0, 2759, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2363, 1843, 2729, + 2361, 1845, 2729, + 2359, 1848, 2727, + 2355, 1852, 2727, + 2351, 1857, 2725, + 2345, 1864, 2723, + 2337, 1873, 2721, + 2327, 1885, 2717, + 2313, 1900, 2713, + 2293, 1920, 2707, + 2265, 1945, 2697, + 2223, 1977, 2685, + 2163, 2016, 2669, + 2067, 2063, 2647, + 1894, 2119, 2615, + 1455, 2185, 2569, + 0, 2261, 2497, + 0, 2347, 2379, + 0, 2439, 2153, + 0, 2539, 1241, + 0, 2647, 0, + 0, 2759, 0, + 0, 2877, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2385, 1839, 2735, + 2383, 1842, 2735, + 2381, 1845, 2735, + 2377, 1849, 2733, + 2373, 1854, 2731, + 2367, 1861, 2729, + 2361, 1870, 2727, + 2351, 1882, 2725, + 2337, 1897, 2719, + 2319, 1917, 2713, + 2291, 1942, 2705, + 2253, 1974, 2693, + 2197, 2013, 2677, + 2107, 2061, 2655, + 1952, 2117, 2623, + 1595, 2185, 2577, + 0, 2261, 2507, + 0, 2345, 2393, + 0, 2439, 2175, + 0, 2539, 1390, + 0, 2647, 0, + 0, 2759, 0, + 0, 2875, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2411, 1835, 2745, + 2411, 1837, 2743, + 2409, 1840, 2743, + 2405, 1844, 2743, + 2401, 1849, 2741, + 2397, 1856, 2739, + 2389, 1865, 2737, + 2381, 1877, 2733, + 2367, 1893, 2729, + 2349, 1913, 2723, + 2325, 1939, 2715, + 2289, 1971, 2703, + 2237, 2010, 2687, + 2157, 2059, 2665, + 2020, 2115, 2635, + 1733, 2181, 2589, + 0, 2259, 2523, + 0, 2343, 2413, + 0, 2437, 2205, + 0, 2539, 1534, + 0, 2645, 0, + 0, 2759, 0, + 0, 2875, 0, + 0, 2997, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2447, 1828, 2755, + 2445, 1831, 2755, + 2443, 1834, 2755, + 2441, 1838, 2753, + 2437, 1843, 2753, + 2433, 1850, 2751, + 2425, 1859, 2747, + 2417, 1872, 2745, + 2405, 1887, 2741, + 2389, 1908, 2735, + 2367, 1933, 2727, + 2335, 1966, 2715, + 2287, 2006, 2701, + 2215, 2055, 2679, + 2099, 2111, 2649, + 1870, 2179, 2605, + 933, 2255, 2541, + 0, 2341, 2435, + 0, 2435, 2241, + 0, 2537, 1675, + 0, 2645, 0, + 0, 2757, 0, + 0, 2875, 0, + 0, 2995, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2489, 1819, 2771, + 2487, 1822, 2771, + 2485, 1825, 2769, + 2483, 1829, 2769, + 2479, 1835, 2767, + 2475, 1842, 2765, + 2469, 1851, 2763, + 2463, 1864, 2759, + 2451, 1880, 2755, + 2437, 1900, 2749, + 2417, 1926, 2741, + 2387, 1959, 2731, + 2347, 2000, 2717, + 2283, 2049, 2697, + 2185, 2107, 2667, + 2005, 2175, 2627, + 1530, 2253, 2565, + 0, 2339, 2465, + 0, 2433, 2285, + 0, 2535, 1814, + 0, 2643, 0, + 0, 2757, 0, + 0, 2873, 0, + 0, 2995, 0, + 0, 3119, 0, + 0, 3245, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2539, 1807, 2789, + 2539, 1810, 2789, + 2537, 1813, 2789, + 2535, 1817, 2787, + 2531, 1823, 2787, + 2529, 1830, 2785, + 2523, 1840, 2783, + 2515, 1853, 2779, + 2507, 1869, 2775, + 2493, 1890, 2769, + 2475, 1917, 2763, + 2451, 1951, 2753, + 2415, 1992, 2739, + 2361, 2042, 2719, + 2279, 2101, 2691, + 2139, 2169, 2653, + 1840, 2247, 2593, + 0, 2335, 2501, + 0, 2431, 2339, + 0, 2533, 1951, + 0, 2641, 0, + 0, 2755, 0, + 0, 2873, 0, + 0, 2993, 0, + 0, 3117, 0, + 0, 3243, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2599, 1791, 2813, + 2599, 1793, 2813, + 2597, 1797, 2813, + 2595, 1801, 2811, + 2593, 1807, 2811, + 2589, 1815, 2809, + 2585, 1825, 2807, + 2579, 1838, 2805, + 2571, 1855, 2801, + 2559, 1877, 2795, + 2545, 1904, 2789, + 2523, 1938, 2779, + 2493, 1981, 2765, + 2449, 2032, 2747, + 2381, 2093, 2721, + 2273, 2163, 2685, + 2071, 2241, 2631, + 1442, 2329, 2547, + 0, 2425, 2401, + 0, 2529, 2087, + 0, 2639, 0, + 0, 2753, 0, + 0, 2871, 0, + 0, 2993, 0, + 0, 3117, 0, + 0, 3243, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2669, 1768, 2845, + 2669, 1770, 2845, + 2667, 1774, 2843, + 2667, 1779, 2843, + 2665, 1785, 2841, + 2661, 1793, 2841, + 2657, 1803, 2839, + 2653, 1817, 2835, + 2645, 1835, 2831, + 2635, 1857, 2827, + 2623, 1886, 2821, + 2605, 1922, 2811, + 2579, 1966, 2799, + 2543, 2018, 2783, + 2489, 2081, 2759, + 2407, 2153, 2725, + 2265, 2233, 2675, + 1960, 2323, 2601, + 0, 2421, 2475, + 0, 2525, 2221, + 0, 2635, 0, + 0, 2751, 0, + 0, 2869, 0, + 0, 2991, 0, + 0, 3115, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3499, 0, + 0, 3627, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2749, 1735, 2883, + 2749, 1738, 2883, + 2747, 1742, 2881, + 2747, 1747, 2881, + 2745, 1753, 2879, + 2741, 1762, 2879, + 2739, 1773, 2877, + 2735, 1788, 2875, + 2729, 1807, 2871, + 2721, 1831, 2867, + 2709, 1861, 2861, + 2695, 1899, 2853, + 2675, 1945, 2841, + 2645, 2000, 2825, + 2603, 2065, 2805, + 2539, 2139, 2773, + 2439, 2221, 2729, + 2253, 2313, 2663, + 1749, 2413, 2555, + 0, 2519, 2355, + 0, 2631, 1740, + 0, 2747, 0, + 0, 2867, 0, + 0, 2989, 0, + 0, 3113, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2837, 1687, 2929, + 2837, 1690, 2929, + 2835, 1694, 2927, + 2835, 1700, 2927, + 2833, 1707, 2927, + 2831, 1717, 2925, + 2829, 1729, 2923, + 2825, 1745, 2921, + 2821, 1766, 2919, + 2815, 1792, 2915, + 2805, 1825, 2909, + 2793, 1866, 2901, + 2777, 1915, 2891, + 2753, 1974, 2877, + 2721, 2042, 2859, + 2673, 2119, 2831, + 2599, 2205, 2793, + 2477, 2301, 2735, + 2239, 2403, 2647, + 1046, 2511, 2489, + 0, 2623, 2123, + 0, 2741, 0, + 0, 2863, 0, + 0, 2987, 0, + 0, 3111, 0, + 0, 3239, 0, + 0, 3367, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 2933, 1614, 2983, + 2933, 1617, 2983, + 2933, 1622, 2983, + 2931, 1629, 2983, + 2931, 1637, 2981, + 2929, 1648, 2981, + 2927, 1663, 2979, + 2923, 1681, 2977, + 2921, 1705, 2975, + 2915, 1735, 2971, + 2907, 1772, 2967, + 2899, 1818, 2959, + 2885, 1872, 2951, + 2867, 1936, 2939, + 2841, 2009, 2923, + 2805, 2093, 2899, + 2751, 2183, 2867, + 2669, 2283, 2817, + 2525, 2389, 2745, + 2217, 2499, 2621, + 0, 2615, 2381, + 0, 2735, 1111, + 0, 2857, 0, + 0, 2983, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 3037, 1492, 3049, + 3037, 1497, 3049, + 3037, 1503, 3049, + 3035, 1512, 3047, + 3035, 1523, 3047, + 3033, 1537, 3045, + 3031, 1555, 3045, + 3029, 1579, 3043, + 3027, 1608, 3041, + 3023, 1645, 3037, + 3017, 1690, 3033, + 3009, 1744, 3027, + 2999, 1807, 3021, + 2985, 1880, 3011, + 2965, 1962, 2995, + 2937, 2053, 2977, + 2899, 2151, 2949, + 2839, 2257, 2909, + 2747, 2369, 2849, + 2583, 2483, 2755, + 2187, 2603, 2587, + 0, 2725, 2177, + 0, 2851, 0, + 0, 2977, 0, + 0, 3105, 0, + 0, 3233, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3147, 1253, 3123, + 3147, 1261, 3123, + 3145, 1272, 3123, + 3145, 1286, 3123, + 3145, 1304, 3121, + 3143, 1327, 3121, + 3143, 1355, 3119, + 3141, 1391, 3119, + 3137, 1435, 3117, + 3135, 1488, 3113, + 3131, 1550, 3111, + 3125, 1622, 3105, + 3117, 1703, 3099, + 3105, 1793, 3091, + 3091, 1891, 3079, + 3071, 1996, 3063, + 3041, 2107, 3039, + 2999, 2221, 3007, + 2935, 2341, 2959, + 2835, 2463, 2887, + 2649, 2587, 2769, + 2143, 2713, 2537, + 0, 2841, 1540, + 0, 2969, 0, + 0, 3099, 0, + 0, 3229, 0, + 0, 3361, 0, + 0, 3491, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4017, 0, + 3261, 75, 3207, + 3261, 173, 3207, + 3261, 278, 3207, + 3259, 388, 3205, + 3259, 504, 3205, + 3259, 623, 3205, + 3257, 745, 3203, + 3255, 869, 3203, + 3255, 996, 3201, + 3251, 1123, 3199, + 3249, 1252, 3195, + 3243, 1382, 3193, + 3237, 1512, 3187, + 3229, 1643, 3179, + 3219, 1774, 3169, + 3203, 1905, 3157, + 3181, 2037, 3139, + 3151, 2169, 3113, + 3105, 2301, 3075, + 3039, 2433, 3021, + 2929, 2563, 2935, + 2725, 2695, 2787, + 2075, 2829, 2459, + 0, 2961, 0, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3379, 0, 3299, + 3379, 0, 3299, + 3379, 0, 3299, + 3379, 0, 3299, + 3377, 0, 3297, + 3377, 0, 3297, + 3377, 0, 3297, + 3375, 0, 3295, + 3375, 0, 3295, + 3373, 0, 3293, + 3369, 0, 3289, + 3367, 154, 3287, + 3361, 964, 3283, + 3355, 1304, 3277, + 3347, 1546, 3269, + 3335, 1746, 3259, + 3319, 1923, 3243, + 3297, 2087, 3223, + 3265, 2241, 3195, + 3219, 2387, 3153, + 3147, 2531, 3091, + 3033, 2671, 2991, + 2811, 2811, 2811, + 1967, 2947, 2331, + 0, 3083, 0, + 0, 3217, 0, + 0, 3351, 0, + 0, 3485, 0, + 0, 3617, 0, + 0, 3751, 0, + 0, 3883, 0, + 0, 4015, 0, + 3501, 0, 3399, + 3501, 0, 3399, + 3501, 0, 3399, + 3501, 0, 3397, + 3499, 0, 3397, + 3499, 0, 3397, + 3499, 0, 3397, + 3497, 0, 3395, + 3497, 0, 3395, + 3495, 0, 3393, + 3493, 0, 3391, + 3491, 0, 3389, + 3487, 0, 3385, + 3483, 0, 3381, + 3477, 624, 3375, + 3467, 1374, 3367, + 3455, 1707, 3355, + 3439, 1946, 3339, + 3415, 2145, 3317, + 3383, 2321, 3285, + 3335, 2483, 3239, + 3261, 2637, 3169, + 3141, 2785, 3057, + 2903, 2929, 2839, + 1764, 3069, 2065, + 0, 3207, 0, + 0, 3343, 0, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3625, 0, 3505, + 3625, 0, 3505, + 3625, 0, 3505, + 3625, 0, 3505, + 3623, 0, 3503, + 3623, 0, 3503, + 3623, 0, 3503, + 3623, 0, 3503, + 3621, 0, 3501, + 3621, 0, 3501, + 3619, 0, 3499, + 3617, 0, 3497, + 3615, 0, 3495, + 3611, 0, 3491, + 3607, 0, 3485, + 3599, 0, 3479, + 3591, 937, 3471, + 3579, 1648, 3459, + 3561, 1976, 3441, + 3539, 2213, 3417, + 3505, 2411, 3383, + 3455, 2587, 3335, + 3381, 2749, 3259, + 3255, 2903, 3131, + 3005, 3049, 2875, + 1131, 3193, 0, + 0, 3333, 0, + 0, 3471, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3751, 0, 3617, + 3751, 0, 3617, + 3751, 0, 3617, + 3751, 0, 3617, + 3751, 0, 3615, + 3749, 0, 3615, + 3749, 0, 3615, + 3749, 0, 3615, + 3749, 0, 3615, + 3747, 0, 3613, + 3747, 0, 3613, + 3745, 0, 3611, + 3743, 0, 3609, + 3741, 0, 3605, + 3737, 0, 3601, + 3731, 0, 3597, + 3725, 0, 3589, + 3717, 0, 3581, + 3703, 1555, 3567, + 3687, 2012, 3549, + 3663, 2291, 3525, + 3629, 2509, 3489, + 3579, 2695, 3437, + 3501, 2865, 3355, + 3373, 3023, 3215, + 3111, 3173, 2919, + 0, 3319, 0, + 0, 3461, 0, + 0, 3601, 0, + 0, 3737, 0, + 0, 3873, 0, + 0, 4009, 0, + 3879, 0, 3733, + 3879, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3733, + 3877, 0, 3731, + 3877, 0, 3731, + 3877, 0, 3731, + 3875, 0, 3731, + 3875, 0, 3729, + 3873, 0, 3729, + 3873, 0, 3727, + 3871, 0, 3725, + 3867, 0, 3721, + 3863, 0, 3717, + 3859, 0, 3713, + 3853, 0, 3705, + 3843, 0, 3695, + 3831, 1390, 3681, + 3813, 2057, 3663, + 3789, 2379, 3637, + 3755, 2613, 3599, + 3703, 2809, 3545, + 3625, 2985, 3457, + 3495, 3147, 3309, + 3225, 3299, 2973, + 0, 3447, 0, + 0, 3589, 0, + 0, 3729, 0, + 0, 3867, 0, + 0, 4005, 0, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3853, + 4007, 0, 3851, + 4005, 0, 3851, + 4005, 0, 3851, + 4005, 0, 3851, + 4005, 0, 3851, + 4003, 0, 3849, + 4003, 0, 3847, + 4001, 0, 3847, + 3999, 0, 3843, + 3997, 0, 3841, + 3993, 0, 3837, + 3987, 0, 3831, + 3981, 0, 3825, + 3971, 0, 3815, + 3959, 990, 3801, + 3941, 2109, 3781, + 3917, 2473, 3755, + 3881, 2723, 3715, + 3831, 2927, 3657, + 3751, 3107, 3567, + 3619, 3271, 3409, + 3341, 3427, 3035, + 0, 3575, 0, + 0, 3719, 0, + 0, 3861, 0, + 0, 3999, 0, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3975, + 4095, 0, 3973, + 4095, 0, 3973, + 4095, 0, 3973, + 4095, 0, 3971, + 4095, 0, 3971, + 4095, 0, 3969, + 4095, 0, 3967, + 4095, 0, 3963, + 4095, 0, 3959, + 4095, 0, 3953, + 4095, 0, 3947, + 4095, 0, 3935, + 4087, 0, 3921, + 4071, 2173, 3903, + 4045, 2575, 3875, + 4011, 2839, 3835, + 3959, 3049, 3775, + 3879, 3233, 3681, + 3743, 3399, 3515, + 3461, 3555, 3109, + 0, 3705, 0, + 0, 3849, 0, + 0, 3991, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4093, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4085, + 4095, 0, 4079, + 4095, 0, 4071, + 4095, 0, 4061, + 4095, 0, 4045, + 4095, 2245, 4025, + 4095, 2683, 3997, + 4095, 2959, 3957, + 4087, 3173, 3897, + 4007, 3359, 3799, + 3871, 3527, 3627, + 3585, 3685, 3189, + 0, 3835, 0, + 0, 3981, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2327, 4095, + 4095, 2797, 4095, + 4095, 3081, 4081, + 4095, 3299, 4019, + 4095, 3487, 3921, + 3999, 3657, 3743, + 3711, 3815, 3281, + 0, 3965, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2417, 4095, + 4095, 2915, 4095, + 4095, 3205, 4095, + 4095, 3427, 4095, + 4095, 3615, 4045, + 4095, 3787, 3865, + 3837, 3945, 3379, + 2431, 1983, 2843, + 2429, 1985, 2843, + 2427, 1987, 2841, + 2425, 1990, 2841, + 2421, 1994, 2839, + 2415, 1999, 2839, + 2409, 2005, 2837, + 2401, 2014, 2833, + 2387, 2026, 2831, + 2371, 2041, 2825, + 2347, 2061, 2819, + 2313, 2085, 2809, + 2265, 2115, 2797, + 2189, 2155, 2781, + 2063, 2201, 2757, + 1810, 2257, 2723, + 0, 2323, 2673, + 0, 2397, 2597, + 0, 2481, 2471, + 0, 2575, 2215, + 0, 2675, 0, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2433, 1983, 2843, + 2431, 1984, 2843, + 2429, 1987, 2843, + 2425, 1989, 2841, + 2423, 1993, 2841, + 2417, 1998, 2839, + 2411, 2005, 2837, + 2403, 2014, 2835, + 2389, 2026, 2831, + 2373, 2041, 2825, + 2349, 2061, 2819, + 2317, 2085, 2811, + 2267, 2115, 2797, + 2193, 2155, 2781, + 2067, 2201, 2757, + 1818, 2257, 2723, + 69, 2323, 2675, + 0, 2397, 2599, + 0, 2481, 2471, + 0, 2575, 2217, + 0, 2675, 0, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2435, 1982, 2845, + 2433, 1984, 2843, + 2431, 1986, 2843, + 2429, 1989, 2843, + 2425, 1993, 2841, + 2421, 1998, 2839, + 2413, 2005, 2837, + 2405, 2014, 2835, + 2393, 2025, 2831, + 2375, 2040, 2827, + 2353, 2059, 2819, + 2319, 2085, 2811, + 2271, 2115, 2799, + 2197, 2153, 2781, + 2073, 2201, 2759, + 1827, 2257, 2725, + 383, 2323, 2675, + 0, 2397, 2599, + 0, 2481, 2473, + 0, 2573, 2219, + 0, 2675, 0, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2437, 1982, 2845, + 2437, 1984, 2845, + 2435, 1986, 2843, + 2431, 1989, 2843, + 2429, 1993, 2843, + 2423, 1998, 2841, + 2417, 2004, 2839, + 2409, 2013, 2835, + 2397, 2025, 2833, + 2379, 2040, 2827, + 2357, 2059, 2821, + 2323, 2085, 2811, + 2275, 2115, 2799, + 2201, 2153, 2783, + 2081, 2201, 2759, + 1840, 2257, 2725, + 615, 2321, 2677, + 0, 2397, 2601, + 0, 2481, 2475, + 0, 2573, 2223, + 0, 2673, 39, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2443, 1981, 2847, + 2441, 1983, 2845, + 2439, 1985, 2845, + 2437, 1988, 2845, + 2433, 1992, 2843, + 2429, 1997, 2841, + 2421, 2004, 2839, + 2413, 2013, 2837, + 2401, 2024, 2833, + 2385, 2039, 2829, + 2361, 2059, 2823, + 2329, 2083, 2813, + 2281, 2115, 2801, + 2209, 2153, 2785, + 2089, 2201, 2761, + 1856, 2257, 2727, + 810, 2321, 2679, + 0, 2397, 2603, + 0, 2481, 2477, + 0, 2573, 2227, + 0, 2673, 413, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2449, 1981, 2847, + 2447, 1982, 2847, + 2445, 1984, 2847, + 2443, 1987, 2845, + 2439, 1991, 2845, + 2435, 1996, 2843, + 2427, 2003, 2841, + 2419, 2012, 2839, + 2407, 2024, 2835, + 2391, 2039, 2831, + 2369, 2059, 2823, + 2337, 2083, 2815, + 2289, 2115, 2803, + 2219, 2153, 2787, + 2103, 2199, 2763, + 1877, 2255, 2729, + 984, 2321, 2681, + 0, 2397, 2605, + 0, 2481, 2481, + 0, 2573, 2235, + 0, 2673, 667, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2455, 1979, 2849, + 2455, 1981, 2849, + 2453, 1983, 2849, + 2449, 1986, 2849, + 2447, 1990, 2847, + 2441, 1995, 2845, + 2435, 2002, 2843, + 2427, 2011, 2841, + 2415, 2023, 2837, + 2399, 2038, 2833, + 2377, 2057, 2827, + 2347, 2083, 2817, + 2301, 2113, 2805, + 2231, 2151, 2789, + 2119, 2199, 2765, + 1903, 2255, 2733, + 1145, 2321, 2683, + 0, 2395, 2609, + 0, 2481, 2487, + 0, 2573, 2243, + 0, 2673, 873, + 0, 2781, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2465, 1978, 2853, + 2465, 1980, 2853, + 2463, 1982, 2851, + 2461, 1985, 2851, + 2457, 1989, 2849, + 2453, 1994, 2849, + 2447, 2001, 2847, + 2437, 2010, 2843, + 2427, 2021, 2841, + 2411, 2036, 2835, + 2389, 2057, 2829, + 2359, 2081, 2821, + 2315, 2113, 2809, + 2247, 2151, 2791, + 2139, 2199, 2769, + 1936, 2255, 2735, + 1298, 2321, 2687, + 0, 2395, 2615, + 0, 2479, 2493, + 0, 2573, 2253, + 0, 2673, 1053, + 0, 2779, 0, + 0, 2893, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2479, 1976, 2857, + 2477, 1978, 2857, + 2475, 1980, 2855, + 2473, 1983, 2855, + 2471, 1987, 2853, + 2465, 1992, 2853, + 2459, 1999, 2851, + 2451, 2008, 2847, + 2441, 2020, 2845, + 2425, 2035, 2839, + 2405, 2055, 2833, + 2375, 2079, 2825, + 2333, 2111, 2813, + 2269, 2149, 2797, + 2165, 2197, 2773, + 1977, 2253, 2741, + 1445, 2319, 2693, + 0, 2395, 2621, + 0, 2479, 2501, + 0, 2573, 2267, + 0, 2673, 1218, + 0, 2779, 0, + 0, 2891, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3253, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2495, 1973, 2861, + 2495, 1975, 2861, + 2493, 1977, 2861, + 2491, 1980, 2859, + 2487, 1984, 2859, + 2483, 1989, 2857, + 2477, 1996, 2855, + 2469, 2005, 2853, + 2459, 2017, 2849, + 2445, 2032, 2845, + 2425, 2053, 2839, + 2397, 2077, 2829, + 2357, 2109, 2819, + 2295, 2147, 2801, + 2199, 2195, 2779, + 2026, 2251, 2747, + 1587, 2317, 2701, + 0, 2393, 2629, + 0, 2479, 2511, + 0, 2571, 2285, + 0, 2673, 1373, + 0, 2779, 0, + 0, 2891, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2517, 1970, 2869, + 2517, 1972, 2867, + 2515, 1974, 2867, + 2513, 1977, 2867, + 2509, 1981, 2865, + 2505, 1986, 2863, + 2501, 1993, 2863, + 2493, 2002, 2859, + 2483, 2014, 2857, + 2469, 2029, 2851, + 2451, 2049, 2845, + 2423, 2075, 2837, + 2385, 2107, 2825, + 2329, 2145, 2809, + 2239, 2193, 2787, + 2085, 2249, 2755, + 1727, 2317, 2709, + 0, 2393, 2639, + 0, 2477, 2527, + 0, 2571, 2309, + 0, 2671, 1522, + 0, 2779, 0, + 0, 2891, 0, + 0, 3009, 0, + 0, 3129, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2545, 1965, 2877, + 2543, 1967, 2877, + 2543, 1969, 2875, + 2541, 1972, 2875, + 2537, 1976, 2875, + 2533, 1981, 2873, + 2529, 1988, 2871, + 2521, 1998, 2869, + 2513, 2010, 2865, + 2499, 2025, 2861, + 2481, 2045, 2855, + 2457, 2071, 2847, + 2421, 2103, 2835, + 2369, 2143, 2819, + 2289, 2191, 2797, + 2153, 2247, 2767, + 1865, 2315, 2721, + 0, 2391, 2655, + 0, 2475, 2545, + 0, 2569, 2337, + 0, 2671, 1666, + 0, 2777, 0, + 0, 2891, 0, + 0, 3007, 0, + 0, 3129, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2579, 1959, 2889, + 2579, 1960, 2887, + 2577, 1963, 2887, + 2575, 1966, 2887, + 2573, 1970, 2885, + 2569, 1975, 2885, + 2565, 1982, 2883, + 2557, 1992, 2881, + 2549, 2004, 2877, + 2537, 2019, 2873, + 2521, 2040, 2867, + 2499, 2065, 2859, + 2467, 2097, 2847, + 2419, 2137, 2833, + 2347, 2187, 2811, + 2231, 2243, 2781, + 2002, 2311, 2737, + 1065, 2387, 2673, + 0, 2473, 2567, + 0, 2567, 2373, + 0, 2669, 1807, + 0, 2777, 0, + 0, 2889, 0, + 0, 3007, 0, + 0, 3127, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2621, 1950, 2903, + 2621, 1952, 2903, + 2619, 1954, 2903, + 2617, 1957, 2901, + 2615, 1961, 2901, + 2611, 1967, 2899, + 2607, 1974, 2897, + 2601, 1983, 2895, + 2595, 1996, 2891, + 2583, 2012, 2887, + 2569, 2032, 2881, + 2549, 2059, 2875, + 2519, 2091, 2863, + 2479, 2131, 2849, + 2415, 2181, 2829, + 2317, 2239, 2799, + 2137, 2307, 2759, + 1662, 2385, 2697, + 0, 2471, 2597, + 0, 2565, 2417, + 0, 2667, 1946, + 0, 2775, 0, + 0, 2889, 0, + 0, 3007, 0, + 0, 3127, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2673, 1938, 2923, + 2671, 1940, 2921, + 2671, 1942, 2921, + 2669, 1945, 2921, + 2667, 1949, 2919, + 2663, 1955, 2919, + 2661, 1962, 2917, + 2655, 1972, 2915, + 2649, 1985, 2911, + 2639, 2001, 2907, + 2625, 2022, 2901, + 2607, 2049, 2895, + 2583, 2083, 2885, + 2547, 2123, 2871, + 2493, 2173, 2851, + 2411, 2233, 2823, + 2271, 2301, 2785, + 1972, 2379, 2725, + 0, 2467, 2633, + 0, 2563, 2471, + 0, 2665, 2083, + 0, 2773, 0, + 0, 2887, 0, + 0, 3005, 0, + 0, 3127, 0, + 0, 3249, 0, + 0, 3375, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2733, 1921, 2947, + 2731, 1923, 2947, + 2731, 1926, 2945, + 2729, 1929, 2945, + 2727, 1933, 2945, + 2725, 1939, 2943, + 2721, 1947, 2941, + 2717, 1957, 2939, + 2711, 1970, 2937, + 2703, 1987, 2933, + 2693, 2009, 2927, + 2677, 2036, 2921, + 2655, 2071, 2911, + 2625, 2113, 2897, + 2581, 2163, 2879, + 2513, 2225, 2853, + 2405, 2295, 2817, + 2203, 2373, 2763, + 1574, 2461, 2679, + 0, 2559, 2533, + 0, 2661, 2219, + 0, 2771, 0, + 0, 2885, 0, + 0, 3003, 0, + 0, 3125, 0, + 0, 3249, 0, + 0, 3375, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2803, 1898, 2977, + 2801, 1900, 2977, + 2801, 1903, 2977, + 2799, 1906, 2975, + 2799, 1911, 2975, + 2797, 1917, 2973, + 2793, 1925, 2973, + 2789, 1935, 2971, + 2785, 1949, 2967, + 2777, 1967, 2963, + 2767, 1990, 2959, + 2755, 2018, 2953, + 2737, 2055, 2943, + 2711, 2097, 2931, + 2675, 2151, 2915, + 2621, 2213, 2891, + 2539, 2285, 2857, + 2397, 2365, 2807, + 2093, 2455, 2733, + 0, 2553, 2607, + 0, 2657, 2353, + 0, 2767, 0, + 0, 2883, 0, + 0, 3001, 0, + 0, 3123, 0, + 0, 3247, 0, + 0, 3375, 0, + 0, 3501, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 2881, 1865, 3015, + 2881, 1867, 3015, + 2881, 1870, 3015, + 2879, 1874, 3013, + 2879, 1879, 3013, + 2877, 1885, 3011, + 2875, 1894, 3011, + 2871, 1905, 3009, + 2867, 1920, 3007, + 2861, 1939, 3003, + 2853, 1963, 2999, + 2843, 1993, 2993, + 2827, 2031, 2985, + 2807, 2077, 2973, + 2777, 2131, 2957, + 2735, 2197, 2937, + 2673, 2271, 2905, + 2571, 2353, 2861, + 2387, 2445, 2795, + 1882, 2545, 2687, + 0, 2651, 2487, + 0, 2763, 1872, + 0, 2879, 0, + 0, 2999, 0, + 0, 3121, 0, + 0, 3247, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 2969, 1817, 3061, + 2969, 1819, 3061, + 2969, 1822, 3061, + 2969, 1826, 3059, + 2967, 1832, 3059, + 2965, 1839, 3059, + 2963, 1849, 3057, + 2961, 1861, 3055, + 2957, 1877, 3053, + 2953, 1898, 3051, + 2947, 1924, 3047, + 2937, 1957, 3041, + 2925, 1998, 3033, + 2909, 2047, 3023, + 2885, 2105, 3009, + 2853, 2173, 2991, + 2805, 2251, 2963, + 2731, 2337, 2925, + 2611, 2433, 2869, + 2371, 2535, 2779, + 1178, 2643, 2621, + 0, 2757, 2255, + 0, 2873, 0, + 0, 2995, 0, + 0, 3119, 0, + 0, 3243, 0, + 0, 3371, 0, + 0, 3499, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 3067, 1743, 3117, + 3065, 1746, 3117, + 3065, 1749, 3115, + 3065, 1754, 3115, + 3063, 1761, 3115, + 3063, 1769, 3113, + 3061, 1780, 3113, + 3059, 1795, 3111, + 3057, 1813, 3109, + 3053, 1837, 3107, + 3047, 1867, 3103, + 3041, 1904, 3099, + 3031, 1950, 3093, + 3017, 2004, 3083, + 2999, 2069, 3071, + 2973, 2141, 3055, + 2937, 2225, 3031, + 2883, 2315, 2999, + 2801, 2415, 2951, + 2657, 2521, 2877, + 2349, 2631, 2755, + 0, 2747, 2513, + 0, 2867, 1244, + 0, 2989, 0, + 0, 3115, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3889, 0, + 0, 4019, 0, + 3169, 1621, 3181, + 3169, 1624, 3181, + 3169, 1629, 3181, + 3169, 1636, 3181, + 3167, 1644, 3179, + 3167, 1655, 3179, + 3165, 1669, 3179, + 3163, 1687, 3177, + 3161, 1711, 3175, + 3159, 1741, 3173, + 3155, 1777, 3169, + 3149, 1822, 3165, + 3141, 1876, 3161, + 3131, 1940, 3153, + 3117, 2012, 3143, + 3097, 2095, 3129, + 3071, 2185, 3109, + 3031, 2285, 3081, + 2971, 2389, 3041, + 2879, 2501, 2981, + 2715, 2617, 2887, + 2319, 2735, 2719, + 0, 2857, 2309, + 0, 2983, 0, + 0, 3109, 0, + 0, 3237, 0, + 0, 3365, 0, + 0, 3495, 0, + 0, 3625, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 3279, 1379, 3255, + 3279, 1385, 3255, + 3279, 1394, 3255, + 3277, 1404, 3255, + 3277, 1418, 3255, + 3277, 1436, 3253, + 3275, 1459, 3253, + 3275, 1487, 3251, + 3273, 1523, 3251, + 3271, 1567, 3249, + 3267, 1620, 3245, + 3263, 1683, 3243, + 3257, 1754, 3237, + 3249, 1836, 3231, + 3239, 1925, 3223, + 3223, 2023, 3211, + 3203, 2127, 3195, + 3173, 2239, 3171, + 3131, 2353, 3139, + 3067, 2473, 3091, + 2967, 2595, 3019, + 2781, 2719, 2901, + 2275, 2845, 2669, + 0, 2973, 1672, + 0, 3101, 0, + 0, 3231, 0, + 0, 3361, 0, + 0, 3493, 0, + 0, 3623, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3393, 117, 3339, + 3393, 207, 3339, + 3393, 305, 3339, + 3393, 410, 3339, + 3391, 520, 3337, + 3391, 636, 3337, + 3391, 755, 3337, + 3389, 877, 3335, + 3389, 1001, 3335, + 3387, 1128, 3333, + 3383, 1255, 3331, + 3381, 1384, 3329, + 3375, 1514, 3325, + 3369, 1644, 3319, + 3361, 1775, 3311, + 3351, 1906, 3303, + 3335, 2037, 3289, + 3313, 2169, 3271, + 3283, 2301, 3245, + 3239, 2433, 3207, + 3171, 2565, 3153, + 3061, 2697, 3067, + 2857, 2829, 2919, + 2207, 2961, 2591, + 0, 3093, 0, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3511, 0, 3431, + 3511, 0, 3431, + 3511, 0, 3431, + 3511, 0, 3431, + 3511, 0, 3431, + 3509, 0, 3429, + 3509, 0, 3429, + 3509, 0, 3429, + 3507, 0, 3427, + 3507, 0, 3427, + 3505, 0, 3425, + 3501, 0, 3423, + 3499, 286, 3419, + 3493, 1096, 3415, + 3487, 1436, 3409, + 3479, 1678, 3401, + 3467, 1878, 3391, + 3451, 2055, 3375, + 3429, 2219, 3355, + 3397, 2373, 3327, + 3351, 2521, 3285, + 3279, 2663, 3223, + 3165, 2803, 3123, + 2943, 2943, 2943, + 2099, 3079, 2463, + 0, 3215, 0, + 0, 3349, 0, + 0, 3483, 0, + 0, 3617, 0, + 0, 3749, 0, + 0, 3883, 0, + 0, 4015, 0, + 3633, 0, 3531, + 3633, 0, 3531, + 3633, 0, 3531, + 3633, 0, 3531, + 3633, 0, 3529, + 3631, 0, 3529, + 3631, 0, 3529, + 3631, 0, 3529, + 3629, 0, 3527, + 3629, 0, 3527, + 3627, 0, 3525, + 3625, 0, 3523, + 3623, 0, 3521, + 3619, 0, 3517, + 3615, 0, 3513, + 3609, 756, 3507, + 3599, 1506, 3499, + 3587, 1839, 3487, + 3571, 2079, 3471, + 3547, 2277, 3449, + 3515, 2453, 3417, + 3467, 2615, 3371, + 3395, 2769, 3301, + 3273, 2917, 3189, + 3035, 3061, 2971, + 1896, 3201, 2197, + 0, 3339, 0, + 0, 3475, 0, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3757, 0, 3637, + 3755, 0, 3635, + 3755, 0, 3635, + 3755, 0, 3635, + 3753, 0, 3633, + 3753, 0, 3633, + 3751, 0, 3631, + 3749, 0, 3629, + 3747, 0, 3627, + 3743, 0, 3623, + 3739, 0, 3619, + 3731, 0, 3611, + 3723, 1069, 3603, + 3711, 1780, 3591, + 3693, 2107, 3573, + 3671, 2345, 3549, + 3637, 2543, 3515, + 3587, 2719, 3467, + 3513, 2881, 3391, + 3387, 3035, 3263, + 3137, 3181, 3007, + 1263, 3325, 0, + 0, 3465, 0, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3749, + 3883, 0, 3747, + 3881, 0, 3747, + 3881, 0, 3747, + 3881, 0, 3747, + 3881, 0, 3747, + 3879, 0, 3745, + 3879, 0, 3745, + 3877, 0, 3743, + 3875, 0, 3741, + 3873, 0, 3737, + 3869, 0, 3733, + 3863, 0, 3729, + 3857, 0, 3721, + 3849, 0, 3713, + 3835, 1687, 3699, + 3819, 2145, 3681, + 3795, 2423, 3657, + 3761, 2641, 3621, + 3711, 2827, 3569, + 3633, 2997, 3487, + 3505, 3155, 3347, + 3243, 3305, 3053, + 0, 3451, 0, + 0, 3593, 0, + 0, 3733, 0, + 0, 3869, 0, + 0, 4005, 0, + 4011, 0, 3865, + 4011, 0, 3865, + 4011, 0, 3865, + 4011, 0, 3865, + 4009, 0, 3865, + 4009, 0, 3865, + 4009, 0, 3865, + 4009, 0, 3863, + 4009, 0, 3863, + 4009, 0, 3863, + 4007, 0, 3863, + 4007, 0, 3861, + 4005, 0, 3861, + 4005, 0, 3859, + 4003, 0, 3857, + 3999, 0, 3853, + 3997, 0, 3849, + 3991, 0, 3845, + 3985, 0, 3837, + 3975, 0, 3827, + 3963, 1522, 3815, + 3945, 2189, 3795, + 3921, 2511, 3769, + 3887, 2745, 3731, + 3835, 2941, 3677, + 3757, 3117, 3589, + 3627, 3279, 3441, + 3357, 3431, 3105, + 0, 3579, 0, + 0, 3721, 0, + 0, 3861, 0, + 0, 3999, 0, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3985, + 4095, 0, 3983, + 4095, 0, 3983, + 4095, 0, 3983, + 4095, 0, 3983, + 4095, 0, 3981, + 4095, 0, 3981, + 4095, 0, 3979, + 4095, 0, 3977, + 4095, 0, 3973, + 4095, 0, 3969, + 4095, 0, 3963, + 4095, 0, 3957, + 4095, 0, 3947, + 4091, 1122, 3933, + 4073, 2243, 3913, + 4049, 2605, 3887, + 4015, 2855, 3847, + 3963, 3061, 3789, + 3883, 3239, 3699, + 3751, 3405, 3541, + 3473, 3559, 3169, + 0, 3707, 0, + 0, 3851, 0, + 0, 3993, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4091, + 4095, 0, 4085, + 4095, 0, 4079, + 4095, 0, 4069, + 4095, 0, 4053, + 4095, 2305, 4035, + 4095, 2707, 4007, + 4095, 2971, 3967, + 4091, 3181, 3907, + 4011, 3365, 3813, + 3877, 3531, 3647, + 3593, 3687, 3241, + 0, 3837, 0, + 0, 3981, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2377, 4095, + 4095, 2815, 4095, + 4095, 3091, 4089, + 4095, 3305, 4029, + 4095, 3491, 3933, + 4003, 3659, 3759, + 3717, 3817, 3321, + 0, 3967, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2459, 4095, + 4095, 2929, 4095, + 4095, 3213, 4095, + 4095, 3431, 4095, + 4095, 3619, 4053, + 4095, 3789, 3877, + 3843, 3947, 3413, + 2563, 2115, 2975, + 2561, 2115, 2975, + 2559, 2117, 2975, + 2557, 2119, 2973, + 2555, 2123, 2973, + 2551, 2125, 2971, + 2547, 2131, 2971, + 2539, 2137, 2969, + 2531, 2147, 2965, + 2519, 2159, 2961, + 2501, 2173, 2957, + 2477, 2193, 2951, + 2445, 2217, 2941, + 2395, 2249, 2929, + 2319, 2287, 2913, + 2193, 2333, 2889, + 1937, 2389, 2855, + 0, 2455, 2805, + 0, 2529, 2729, + 0, 2613, 2601, + 0, 2707, 2345, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2563, 2113, 2975, + 2563, 2115, 2975, + 2561, 2117, 2975, + 2559, 2119, 2973, + 2557, 2121, 2973, + 2553, 2125, 2973, + 2547, 2131, 2971, + 2541, 2137, 2969, + 2533, 2147, 2965, + 2519, 2157, 2963, + 2503, 2173, 2957, + 2479, 2193, 2951, + 2445, 2217, 2941, + 2397, 2249, 2929, + 2321, 2287, 2913, + 2195, 2333, 2889, + 1942, 2389, 2855, + 0, 2455, 2805, + 0, 2529, 2729, + 0, 2613, 2603, + 0, 2707, 2347, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2565, 2113, 2975, + 2565, 2115, 2975, + 2563, 2117, 2975, + 2561, 2119, 2975, + 2559, 2121, 2973, + 2555, 2125, 2973, + 2549, 2131, 2971, + 2543, 2137, 2969, + 2535, 2147, 2967, + 2523, 2157, 2963, + 2505, 2173, 2957, + 2481, 2193, 2951, + 2449, 2217, 2943, + 2399, 2247, 2931, + 2325, 2287, 2913, + 2199, 2333, 2889, + 1950, 2389, 2855, + 201, 2455, 2807, + 0, 2529, 2731, + 0, 2613, 2603, + 0, 2707, 2349, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2567, 2113, 2977, + 2567, 2115, 2977, + 2565, 2117, 2975, + 2563, 2119, 2975, + 2561, 2121, 2975, + 2557, 2125, 2973, + 2553, 2131, 2971, + 2545, 2137, 2969, + 2537, 2145, 2967, + 2525, 2157, 2963, + 2509, 2173, 2959, + 2485, 2191, 2953, + 2451, 2217, 2943, + 2403, 2247, 2931, + 2329, 2287, 2913, + 2205, 2333, 2891, + 1959, 2389, 2857, + 515, 2455, 2807, + 0, 2529, 2731, + 0, 2613, 2605, + 0, 2707, 2351, + 0, 2807, 0, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2571, 2113, 2977, + 2569, 2115, 2977, + 2569, 2115, 2977, + 2567, 2117, 2977, + 2563, 2121, 2975, + 2561, 2125, 2975, + 2555, 2129, 2973, + 2549, 2137, 2971, + 2541, 2145, 2969, + 2529, 2157, 2965, + 2511, 2173, 2959, + 2489, 2191, 2953, + 2455, 2217, 2945, + 2407, 2247, 2931, + 2333, 2285, 2915, + 2213, 2333, 2891, + 1972, 2389, 2857, + 748, 2455, 2809, + 0, 2529, 2733, + 0, 2613, 2607, + 0, 2705, 2355, + 0, 2807, 171, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2575, 2113, 2979, + 2575, 2113, 2979, + 2573, 2115, 2977, + 2571, 2117, 2977, + 2569, 2121, 2977, + 2565, 2125, 2975, + 2561, 2129, 2973, + 2553, 2135, 2971, + 2545, 2145, 2969, + 2533, 2157, 2965, + 2517, 2171, 2961, + 2493, 2191, 2955, + 2461, 2215, 2945, + 2413, 2247, 2933, + 2341, 2285, 2917, + 2221, 2333, 2893, + 1988, 2389, 2859, + 942, 2453, 2811, + 0, 2529, 2735, + 0, 2613, 2611, + 0, 2705, 2359, + 0, 2805, 544, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2581, 2111, 2981, + 2581, 2113, 2979, + 2579, 2115, 2979, + 2577, 2117, 2979, + 2575, 2119, 2979, + 2571, 2123, 2977, + 2567, 2129, 2975, + 2559, 2135, 2973, + 2551, 2145, 2971, + 2539, 2155, 2967, + 2523, 2171, 2963, + 2501, 2191, 2955, + 2469, 2215, 2947, + 2423, 2247, 2935, + 2351, 2285, 2919, + 2235, 2331, 2895, + 2009, 2387, 2861, + 1116, 2453, 2813, + 0, 2529, 2737, + 0, 2613, 2613, + 0, 2705, 2367, + 0, 2805, 799, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2589, 2111, 2983, + 2587, 2111, 2983, + 2587, 2113, 2981, + 2585, 2115, 2981, + 2583, 2119, 2981, + 2579, 2123, 2979, + 2575, 2127, 2977, + 2567, 2135, 2975, + 2559, 2143, 2973, + 2547, 2155, 2969, + 2533, 2169, 2965, + 2509, 2189, 2959, + 2479, 2215, 2949, + 2433, 2245, 2937, + 2363, 2285, 2921, + 2251, 2331, 2897, + 2035, 2387, 2865, + 1277, 2453, 2815, + 0, 2529, 2741, + 0, 2613, 2619, + 0, 2705, 2375, + 0, 2805, 1005, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2599, 2109, 2985, + 2597, 2111, 2985, + 2597, 2111, 2985, + 2595, 2113, 2983, + 2593, 2117, 2983, + 2589, 2121, 2983, + 2585, 2125, 2981, + 2579, 2133, 2979, + 2571, 2141, 2975, + 2559, 2153, 2973, + 2543, 2169, 2967, + 2521, 2189, 2961, + 2491, 2213, 2953, + 2447, 2245, 2941, + 2379, 2283, 2923, + 2271, 2331, 2901, + 2069, 2387, 2867, + 1430, 2453, 2819, + 0, 2527, 2747, + 0, 2611, 2625, + 0, 2705, 2385, + 0, 2805, 1185, + 0, 2913, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2611, 2107, 2989, + 2611, 2109, 2989, + 2609, 2109, 2989, + 2607, 2113, 2987, + 2605, 2115, 2987, + 2603, 2119, 2985, + 2597, 2125, 2985, + 2593, 2131, 2983, + 2585, 2139, 2979, + 2573, 2151, 2977, + 2559, 2167, 2971, + 2537, 2187, 2965, + 2507, 2211, 2957, + 2465, 2243, 2945, + 2401, 2281, 2929, + 2297, 2329, 2905, + 2109, 2385, 2873, + 1577, 2451, 2825, + 0, 2527, 2753, + 0, 2611, 2633, + 0, 2705, 2399, + 0, 2805, 1350, + 0, 2911, 0, + 0, 3025, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2629, 2105, 2995, + 2627, 2105, 2993, + 2627, 2107, 2993, + 2625, 2109, 2993, + 2623, 2113, 2991, + 2619, 2117, 2991, + 2615, 2121, 2989, + 2609, 2129, 2987, + 2601, 2137, 2985, + 2591, 2149, 2981, + 2577, 2165, 2977, + 2557, 2185, 2971, + 2529, 2209, 2961, + 2489, 2241, 2951, + 2427, 2279, 2933, + 2331, 2327, 2911, + 2159, 2383, 2879, + 1720, 2451, 2833, + 0, 2525, 2761, + 0, 2611, 2645, + 0, 2703, 2417, + 0, 2805, 1506, + 0, 2911, 0, + 0, 3023, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3385, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2651, 2101, 3001, + 2649, 2101, 3001, + 2649, 2103, 2999, + 2647, 2105, 2999, + 2645, 2109, 2999, + 2641, 2113, 2997, + 2637, 2119, 2997, + 2633, 2125, 2995, + 2625, 2135, 2991, + 2615, 2147, 2989, + 2601, 2161, 2983, + 2583, 2181, 2977, + 2555, 2207, 2969, + 2517, 2239, 2957, + 2461, 2277, 2941, + 2371, 2325, 2919, + 2217, 2383, 2887, + 1860, 2449, 2841, + 0, 2525, 2773, + 0, 2609, 2659, + 0, 2703, 2441, + 0, 2803, 1654, + 0, 2911, 0, + 0, 3023, 0, + 0, 3141, 0, + 0, 3261, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2677, 2095, 3009, + 2677, 2097, 3009, + 2675, 2099, 3009, + 2675, 2101, 3009, + 2673, 2105, 3007, + 2669, 2109, 3007, + 2665, 2113, 3005, + 2661, 2121, 3003, + 2653, 2129, 3001, + 2645, 2141, 2997, + 2631, 2157, 2993, + 2615, 2177, 2987, + 2589, 2203, 2979, + 2553, 2235, 2967, + 2501, 2275, 2951, + 2421, 2323, 2929, + 2285, 2379, 2899, + 1998, 2447, 2855, + 0, 2523, 2787, + 0, 2607, 2677, + 0, 2701, 2469, + 0, 2803, 1798, + 0, 2909, 0, + 0, 3023, 0, + 0, 3139, 0, + 0, 3261, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2713, 2089, 3021, + 2711, 2091, 3021, + 2711, 2093, 3021, + 2709, 2095, 3019, + 2707, 2097, 3019, + 2705, 2101, 3017, + 2701, 2107, 3017, + 2697, 2115, 3015, + 2689, 2123, 3013, + 2681, 2135, 3009, + 2669, 2151, 3005, + 2653, 2171, 2999, + 2631, 2197, 2991, + 2599, 2231, 2979, + 2551, 2269, 2965, + 2479, 2319, 2943, + 2363, 2377, 2913, + 2133, 2443, 2869, + 1197, 2519, 2805, + 0, 2605, 2699, + 0, 2699, 2505, + 0, 2801, 1939, + 0, 2909, 0, + 0, 3021, 0, + 0, 3139, 0, + 0, 3259, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3765, 0, + 0, 3893, 0, + 0, 4023, 0, + 2755, 2081, 3035, + 2753, 2081, 3035, + 2753, 2083, 3035, + 2751, 2087, 3035, + 2749, 2089, 3033, + 2747, 2093, 3033, + 2745, 2099, 3031, + 2739, 2107, 3029, + 2735, 2115, 3027, + 2727, 2127, 3025, + 2715, 2143, 3019, + 2701, 2165, 3015, + 2681, 2191, 3007, + 2651, 2223, 2995, + 2611, 2265, 2981, + 2549, 2313, 2961, + 2449, 2371, 2931, + 2269, 2439, 2891, + 1794, 2517, 2829, + 0, 2603, 2729, + 0, 2697, 2551, + 0, 2799, 2077, + 0, 2907, 0, + 0, 3021, 0, + 0, 3139, 0, + 0, 3259, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 2805, 2069, 3055, + 2805, 2069, 3055, + 2803, 2071, 3053, + 2803, 2075, 3053, + 2801, 2077, 3053, + 2799, 2081, 3051, + 2797, 2087, 3051, + 2793, 2095, 3049, + 2787, 2105, 3047, + 2781, 2117, 3043, + 2771, 2133, 3039, + 2757, 2155, 3033, + 2739, 2181, 3027, + 2715, 2215, 3017, + 2679, 2257, 3003, + 2625, 2305, 2983, + 2543, 2365, 2955, + 2403, 2433, 2917, + 2105, 2511, 2857, + 0, 2599, 2765, + 0, 2695, 2603, + 0, 2797, 2215, + 0, 2905, 0, + 0, 3019, 0, + 0, 3137, 0, + 0, 3259, 0, + 0, 3381, 0, + 0, 3507, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 2865, 2051, 3079, + 2865, 2053, 3079, + 2865, 2055, 3079, + 2863, 2057, 3077, + 2861, 2061, 3077, + 2859, 2065, 3077, + 2857, 2071, 3075, + 2855, 2079, 3073, + 2849, 2089, 3071, + 2843, 2103, 3069, + 2835, 2119, 3065, + 2825, 2141, 3059, + 2809, 2169, 3053, + 2787, 2203, 3043, + 2757, 2245, 3029, + 2713, 2297, 3011, + 2645, 2357, 2985, + 2537, 2427, 2949, + 2335, 2505, 2895, + 1706, 2593, 2811, + 0, 2691, 2667, + 0, 2793, 2351, + 0, 2903, 0, + 0, 3017, 0, + 0, 3135, 0, + 0, 3257, 0, + 0, 3381, 0, + 0, 3507, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 2935, 2029, 3109, + 2935, 2030, 3109, + 2935, 2032, 3109, + 2933, 2035, 3109, + 2933, 2038, 3107, + 2931, 2043, 3107, + 2929, 2049, 3105, + 2925, 2057, 3105, + 2921, 2067, 3103, + 2917, 2081, 3099, + 2909, 2099, 3097, + 2901, 2121, 3091, + 2887, 2151, 3085, + 2869, 2187, 3075, + 2843, 2229, 3063, + 2807, 2283, 3047, + 2753, 2345, 3023, + 2671, 2417, 2989, + 2529, 2497, 2939, + 2225, 2587, 2865, + 0, 2685, 2739, + 0, 2789, 2485, + 0, 2899, 0, + 0, 3015, 0, + 0, 3133, 0, + 0, 3255, 0, + 0, 3379, 0, + 0, 3507, 0, + 0, 3633, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 3015, 1995, 3147, + 3013, 1997, 3147, + 3013, 1999, 3147, + 3013, 2002, 3147, + 3011, 2006, 3145, + 3011, 2011, 3145, + 3009, 2017, 3143, + 3007, 2026, 3143, + 3003, 2037, 3141, + 2999, 2051, 3139, + 2993, 2071, 3135, + 2985, 2095, 3131, + 2975, 2125, 3125, + 2959, 2163, 3117, + 2939, 2209, 3105, + 2909, 2263, 3089, + 2867, 2329, 3069, + 2805, 2403, 3037, + 2703, 2485, 2993, + 2519, 2577, 2927, + 2014, 2677, 2819, + 0, 2783, 2619, + 0, 2895, 2004, + 0, 3011, 0, + 0, 3131, 0, + 0, 3253, 0, + 0, 3379, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4023, 0, + 3103, 1947, 3193, + 3103, 1949, 3193, + 3101, 1951, 3193, + 3101, 1954, 3193, + 3101, 1958, 3193, + 3099, 1964, 3191, + 3097, 1971, 3191, + 3095, 1981, 3189, + 3093, 1993, 3187, + 3089, 2009, 3185, + 3085, 2030, 3183, + 3079, 2057, 3179, + 3069, 2089, 3173, + 3057, 2131, 3165, + 3041, 2179, 3155, + 3017, 2237, 3141, + 2985, 2305, 3123, + 2937, 2383, 3095, + 2863, 2469, 3057, + 2743, 2565, 3001, + 2503, 2667, 2911, + 1310, 2775, 2753, + 0, 2889, 2387, + 0, 3005, 0, + 0, 3127, 0, + 0, 3251, 0, + 0, 3377, 0, + 0, 3503, 0, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 3199, 1873, 3249, + 3199, 1875, 3249, + 3197, 1878, 3249, + 3197, 1882, 3247, + 3197, 1886, 3247, + 3195, 1893, 3247, + 3195, 1901, 3247, + 3193, 1912, 3245, + 3191, 1927, 3243, + 3189, 1946, 3241, + 3185, 1969, 3239, + 3179, 1999, 3235, + 3173, 2036, 3231, + 3163, 2081, 3225, + 3149, 2137, 3215, + 3131, 2201, 3203, + 3107, 2273, 3187, + 3069, 2357, 3163, + 3015, 2447, 3131, + 2933, 2547, 3083, + 2789, 2653, 3009, + 2481, 2763, 2887, + 0, 2879, 2645, + 0, 2999, 1376, + 0, 3121, 0, + 0, 3247, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3629, 0, + 0, 3759, 0, + 0, 3891, 0, + 0, 4021, 0, + 3301, 1750, 3313, + 3301, 1753, 3313, + 3301, 1757, 3313, + 3301, 1761, 3313, + 3301, 1768, 3313, + 3299, 1776, 3311, + 3299, 1787, 3311, + 3297, 1801, 3311, + 3295, 1820, 3309, + 3293, 1843, 3307, + 3291, 1873, 3305, + 3287, 1909, 3301, + 3281, 1954, 3297, + 3273, 2008, 3293, + 3263, 2071, 3285, + 3249, 2145, 3275, + 3229, 2227, 3261, + 3203, 2317, 3241, + 3163, 2417, 3213, + 3103, 2521, 3173, + 3011, 2633, 3113, + 2847, 2749, 3019, + 2451, 2867, 2851, + 0, 2991, 2441, + 0, 3115, 0, + 0, 3241, 0, + 0, 3369, 0, + 0, 3497, 0, + 0, 3627, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4019, 0, + 3411, 1507, 3387, + 3411, 1511, 3387, + 3411, 1518, 3387, + 3411, 1526, 3387, + 3409, 1536, 3387, + 3409, 1550, 3387, + 3409, 1568, 3385, + 3407, 1591, 3385, + 3407, 1620, 3383, + 3405, 1656, 3383, + 3403, 1700, 3381, + 3399, 1752, 3377, + 3395, 1815, 3375, + 3389, 1886, 3369, + 3381, 1968, 3363, + 3371, 2057, 3355, + 3355, 2155, 3343, + 3335, 2259, 3327, + 3305, 2371, 3303, + 3263, 2485, 3271, + 3199, 2605, 3223, + 3099, 2727, 3151, + 2913, 2851, 3033, + 2407, 2977, 2801, + 0, 3105, 1804, + 0, 3235, 0, + 0, 3363, 0, + 0, 3493, 0, + 0, 3625, 0, + 0, 3755, 0, + 0, 3887, 0, + 0, 4019, 0, + 3525, 167, 3471, + 3525, 249, 3471, + 3525, 339, 3471, + 3525, 437, 3471, + 3525, 542, 3471, + 3523, 652, 3471, + 3523, 768, 3469, + 3523, 887, 3469, + 3521, 1009, 3467, + 3521, 1133, 3467, + 3519, 1260, 3465, + 3515, 1387, 3463, + 3513, 1516, 3461, + 3509, 1646, 3457, + 3503, 1776, 3451, + 3493, 1907, 3443, + 3483, 2038, 3435, + 3467, 2169, 3421, + 3445, 2301, 3403, + 3415, 2433, 3377, + 3371, 2565, 3339, + 3303, 2697, 3285, + 3193, 2829, 3199, + 2989, 2961, 3051, + 2339, 3093, 2725, + 0, 3225, 0, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3563, + 3643, 0, 3561, + 3641, 0, 3561, + 3641, 0, 3561, + 3639, 0, 3559, + 3639, 0, 3559, + 3637, 0, 3557, + 3633, 0, 3555, + 3631, 418, 3551, + 3625, 1228, 3547, + 3619, 1568, 3541, + 3611, 1811, 3533, + 3599, 2011, 3523, + 3583, 2187, 3507, + 3561, 2351, 3487, + 3529, 2505, 3459, + 3483, 2653, 3417, + 3413, 2795, 3355, + 3297, 2937, 3255, + 3075, 3075, 3075, + 2231, 3211, 2595, + 0, 3347, 0, + 0, 3481, 0, + 0, 3615, 0, + 0, 3749, 0, + 0, 3881, 0, + 0, 4015, 0, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3765, 0, 3663, + 3763, 0, 3661, + 3763, 0, 3661, + 3763, 0, 3661, + 3763, 0, 3659, + 3761, 0, 3659, + 3759, 0, 3657, + 3757, 0, 3655, + 3755, 0, 3653, + 3751, 0, 3649, + 3747, 0, 3645, + 3741, 888, 3639, + 3731, 1638, 3631, + 3719, 1971, 3619, + 3703, 2211, 3603, + 3681, 2409, 3581, + 3647, 2585, 3549, + 3599, 2749, 3503, + 3527, 2901, 3433, + 3405, 3049, 3321, + 3167, 3193, 3103, + 2028, 3333, 2329, + 0, 3471, 0, + 0, 3607, 0, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3889, 0, 3769, + 3887, 0, 3767, + 3887, 0, 3767, + 3887, 0, 3767, + 3885, 0, 3765, + 3885, 0, 3765, + 3883, 0, 3763, + 3881, 0, 3761, + 3879, 0, 3759, + 3875, 0, 3755, + 3871, 0, 3751, + 3863, 0, 3743, + 3855, 1201, 3735, + 3843, 1912, 3723, + 3825, 2239, 3705, + 3803, 2477, 3681, + 3769, 2675, 3647, + 3719, 2851, 3599, + 3645, 3013, 3523, + 3519, 3167, 3395, + 3269, 3313, 3139, + 1395, 3457, 0, + 0, 3597, 0, + 0, 3735, 0, + 0, 3871, 0, + 0, 4007, 0, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3881, + 4015, 0, 3879, + 4013, 0, 3879, + 4013, 0, 3879, + 4013, 0, 3879, + 4011, 0, 3877, + 4011, 0, 3877, + 4009, 0, 3875, + 4007, 0, 3873, + 4005, 0, 3869, + 4001, 0, 3867, + 3995, 0, 3861, + 3989, 0, 3855, + 3981, 0, 3845, + 3967, 1819, 3831, + 3951, 2277, 3813, + 3927, 2555, 3789, + 3893, 2773, 3753, + 3843, 2961, 3701, + 3765, 3129, 3619, + 3637, 3287, 3479, + 3375, 3437, 3185, + 0, 3583, 0, + 0, 3725, 0, + 0, 3865, 0, + 0, 4001, 0, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3997, + 4095, 0, 3995, + 4095, 0, 3995, + 4095, 0, 3995, + 4095, 0, 3993, + 4095, 0, 3993, + 4095, 0, 3991, + 4095, 0, 3989, + 4095, 0, 3985, + 4095, 0, 3981, + 4095, 0, 3977, + 4095, 0, 3969, + 4095, 0, 3959, + 4095, 1654, 3947, + 4077, 2321, 3927, + 4053, 2643, 3901, + 4019, 2877, 3865, + 3967, 3075, 3809, + 3889, 3249, 3723, + 3759, 3411, 3573, + 3489, 3563, 3237, + 0, 3711, 0, + 0, 3853, 0, + 0, 3993, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4089, + 4095, 0, 4079, + 4095, 1254, 4065, + 4095, 2375, 4045, + 4095, 2737, 4019, + 4095, 2989, 3979, + 4095, 3193, 3923, + 4015, 3371, 3831, + 3883, 3537, 3673, + 3605, 3691, 3301, + 0, 3839, 0, + 0, 3983, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2437, 4095, + 4095, 2839, 4095, + 4095, 3103, 4095, + 4095, 3313, 4039, + 4095, 3497, 3945, + 4009, 3663, 3779, + 3725, 3819, 3373, + 0, 3969, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2509, 4095, + 4095, 2949, 4095, + 4095, 3223, 4095, + 4095, 3437, 4095, + 4095, 3623, 4065, + 4095, 3791, 3891, + 3849, 3949, 3455, + 2693, 2245, 3107, + 2693, 2247, 3107, + 2691, 2247, 3107, + 2691, 2249, 3107, + 2689, 2251, 3105, + 2685, 2255, 3105, + 2683, 2259, 3103, + 2677, 2263, 3103, + 2671, 2269, 3101, + 2661, 2279, 3097, + 2649, 2291, 3093, + 2633, 2305, 3089, + 2609, 2325, 3083, + 2575, 2349, 3073, + 2525, 2381, 3061, + 2449, 2419, 3043, + 2321, 2465, 3021, + 2065, 2521, 2987, + 0, 2587, 2937, + 0, 2661, 2861, + 0, 2745, 2733, + 0, 2839, 2477, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2695, 2245, 3107, + 2695, 2247, 3107, + 2693, 2247, 3107, + 2691, 2249, 3107, + 2689, 2251, 3105, + 2687, 2255, 3105, + 2683, 2259, 3103, + 2679, 2263, 3103, + 2671, 2269, 3101, + 2663, 2279, 3097, + 2651, 2291, 3095, + 2633, 2305, 3089, + 2609, 2325, 3083, + 2577, 2349, 3073, + 2527, 2381, 3061, + 2451, 2419, 3045, + 2325, 2465, 3021, + 2069, 2521, 2987, + 0, 2587, 2937, + 0, 2661, 2861, + 0, 2745, 2733, + 0, 2839, 2477, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2697, 2245, 3107, + 2695, 2247, 3107, + 2695, 2247, 3107, + 2693, 2249, 3107, + 2691, 2251, 3107, + 2689, 2253, 3105, + 2685, 2257, 3105, + 2679, 2263, 3103, + 2673, 2269, 3101, + 2665, 2279, 3099, + 2653, 2291, 3095, + 2635, 2305, 3089, + 2611, 2325, 3083, + 2577, 2349, 3073, + 2529, 2381, 3061, + 2453, 2419, 3045, + 2327, 2465, 3021, + 2075, 2521, 2987, + 0, 2587, 2937, + 0, 2661, 2861, + 0, 2745, 2735, + 0, 2839, 2479, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2699, 2245, 3109, + 2697, 2245, 3109, + 2697, 2247, 3107, + 2695, 2249, 3107, + 2693, 2251, 3107, + 2691, 2253, 3105, + 2687, 2257, 3105, + 2681, 2263, 3103, + 2675, 2269, 3101, + 2667, 2279, 3099, + 2655, 2289, 3095, + 2637, 2305, 3091, + 2613, 2325, 3083, + 2581, 2349, 3075, + 2531, 2381, 3063, + 2457, 2419, 3045, + 2331, 2465, 3021, + 2081, 2521, 2987, + 333, 2587, 2939, + 0, 2661, 2863, + 0, 2745, 2735, + 0, 2839, 2481, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2701, 2245, 3109, + 2699, 2245, 3109, + 2699, 2247, 3109, + 2697, 2249, 3107, + 2695, 2251, 3107, + 2693, 2253, 3107, + 2689, 2257, 3105, + 2685, 2263, 3103, + 2677, 2269, 3101, + 2669, 2277, 3099, + 2657, 2289, 3095, + 2641, 2305, 3091, + 2617, 2325, 3085, + 2583, 2349, 3075, + 2535, 2379, 3063, + 2461, 2419, 3047, + 2337, 2465, 3023, + 2091, 2521, 2989, + 647, 2587, 2939, + 0, 2661, 2863, + 0, 2745, 2737, + 0, 2839, 2483, + 0, 2939, 0, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2705, 2245, 3109, + 2703, 2245, 3109, + 2703, 2247, 3109, + 2701, 2247, 3109, + 2699, 2251, 3109, + 2697, 2253, 3107, + 2693, 2257, 3107, + 2687, 2261, 3105, + 2681, 2269, 3103, + 2673, 2277, 3101, + 2661, 2289, 3097, + 2643, 2305, 3091, + 2621, 2323, 3085, + 2587, 2349, 3077, + 2539, 2379, 3063, + 2467, 2417, 3047, + 2345, 2465, 3023, + 2103, 2521, 2989, + 880, 2587, 2941, + 0, 2661, 2865, + 0, 2745, 2739, + 0, 2839, 2487, + 0, 2939, 303, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2709, 2243, 3111, + 2707, 2245, 3111, + 2707, 2245, 3111, + 2705, 2247, 3111, + 2703, 2249, 3109, + 2701, 2253, 3109, + 2697, 2257, 3107, + 2693, 2261, 3107, + 2685, 2269, 3105, + 2677, 2277, 3101, + 2665, 2289, 3097, + 2649, 2303, 3093, + 2627, 2323, 3087, + 2593, 2347, 3077, + 2545, 2379, 3065, + 2473, 2417, 3049, + 2353, 2465, 3025, + 2121, 2521, 2991, + 1074, 2585, 2943, + 0, 2661, 2867, + 0, 2745, 2743, + 0, 2837, 2493, + 0, 2939, 677, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2715, 2243, 3113, + 2713, 2243, 3113, + 2713, 2245, 3113, + 2711, 2247, 3111, + 2709, 2249, 3111, + 2707, 2251, 3111, + 2703, 2255, 3109, + 2699, 2261, 3107, + 2693, 2267, 3105, + 2683, 2277, 3103, + 2671, 2287, 3099, + 2655, 2303, 3095, + 2633, 2323, 3089, + 2601, 2347, 3079, + 2555, 2379, 3067, + 2483, 2417, 3051, + 2367, 2463, 3027, + 2141, 2519, 2993, + 1248, 2585, 2945, + 0, 2661, 2869, + 0, 2745, 2745, + 0, 2837, 2499, + 0, 2937, 931, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2721, 2241, 3115, + 2721, 2243, 3115, + 2719, 2243, 3115, + 2719, 2245, 3113, + 2717, 2247, 3113, + 2715, 2251, 3113, + 2711, 2255, 3111, + 2707, 2259, 3109, + 2701, 2267, 3107, + 2691, 2275, 3105, + 2681, 2287, 3101, + 2665, 2303, 3097, + 2643, 2321, 3091, + 2611, 2347, 3081, + 2565, 2377, 3069, + 2495, 2417, 3053, + 2383, 2463, 3029, + 2167, 2519, 2997, + 1409, 2585, 2947, + 0, 2661, 2873, + 0, 2745, 2751, + 0, 2837, 2507, + 0, 2937, 1137, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2731, 2241, 3117, + 2731, 2241, 3117, + 2731, 2243, 3117, + 2729, 2243, 3117, + 2727, 2247, 3117, + 2725, 2249, 3115, + 2721, 2253, 3115, + 2717, 2259, 3113, + 2711, 2265, 3111, + 2703, 2273, 3109, + 2691, 2285, 3105, + 2675, 2301, 3099, + 2653, 2321, 3093, + 2623, 2345, 3085, + 2579, 2377, 3073, + 2513, 2415, 3057, + 2403, 2463, 3033, + 2201, 2519, 3001, + 1562, 2585, 2951, + 0, 2659, 2879, + 0, 2745, 2757, + 0, 2837, 2517, + 0, 2937, 1317, + 0, 3045, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2745, 2239, 3121, + 2745, 2239, 3121, + 2743, 2241, 3121, + 2741, 2241, 3121, + 2739, 2245, 3119, + 2737, 2247, 3119, + 2735, 2251, 3117, + 2731, 2257, 3117, + 2725, 2263, 3115, + 2717, 2273, 3111, + 2705, 2283, 3109, + 2691, 2299, 3103, + 2669, 2319, 3097, + 2639, 2343, 3089, + 2597, 2375, 3077, + 2533, 2413, 3061, + 2429, 2461, 3037, + 2241, 2517, 3005, + 1709, 2583, 2957, + 0, 2659, 2885, + 0, 2743, 2765, + 0, 2837, 2531, + 0, 2937, 1482, + 0, 3043, 0, + 0, 3157, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2761, 2235, 3127, + 2761, 2237, 3127, + 2761, 2237, 3125, + 2759, 2239, 3125, + 2757, 2241, 3125, + 2755, 2245, 3125, + 2751, 2249, 3123, + 2747, 2253, 3121, + 2741, 2261, 3119, + 2735, 2269, 3117, + 2723, 2281, 3113, + 2709, 2297, 3109, + 2689, 2317, 3103, + 2661, 2341, 3095, + 2621, 2373, 3083, + 2559, 2413, 3067, + 2463, 2459, 3043, + 2291, 2517, 3011, + 1852, 2583, 2965, + 0, 2657, 2893, + 0, 2743, 2777, + 0, 2835, 2549, + 0, 2937, 1638, + 0, 3043, 0, + 0, 3155, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3517, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2783, 2231, 3133, + 2783, 2233, 3133, + 2781, 2235, 3133, + 2781, 2235, 3133, + 2779, 2239, 3131, + 2777, 2241, 3131, + 2773, 2245, 3129, + 2769, 2251, 3129, + 2765, 2257, 3127, + 2757, 2267, 3123, + 2747, 2279, 3121, + 2733, 2293, 3115, + 2715, 2313, 3109, + 2687, 2339, 3101, + 2649, 2371, 3089, + 2593, 2409, 3073, + 2503, 2457, 3051, + 2349, 2515, 3019, + 1992, 2581, 2973, + 0, 2657, 2905, + 0, 2741, 2791, + 0, 2835, 2573, + 0, 2935, 1786, + 0, 3043, 0, + 0, 3155, 0, + 0, 3273, 0, + 0, 3393, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2811, 2227, 3141, + 2811, 2229, 3141, + 2809, 2229, 3141, + 2809, 2231, 3141, + 2807, 2233, 3141, + 2805, 2237, 3139, + 2801, 2241, 3139, + 2797, 2245, 3137, + 2793, 2253, 3135, + 2787, 2261, 3133, + 2777, 2273, 3129, + 2763, 2289, 3125, + 2747, 2309, 3119, + 2721, 2335, 3111, + 2687, 2367, 3099, + 2633, 2407, 3083, + 2553, 2455, 3061, + 2417, 2511, 3031, + 2129, 2579, 2987, + 0, 2655, 2919, + 0, 2739, 2809, + 0, 2833, 2601, + 0, 2935, 1931, + 0, 3043, 0, + 0, 3155, 0, + 0, 3271, 0, + 0, 3393, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4025, 0, + 2845, 2221, 3153, + 2845, 2221, 3153, + 2843, 2223, 3153, + 2843, 2225, 3153, + 2841, 2227, 3151, + 2839, 2229, 3151, + 2837, 2235, 3149, + 2833, 2239, 3149, + 2829, 2247, 3147, + 2823, 2255, 3145, + 2813, 2267, 3141, + 2801, 2283, 3137, + 2785, 2305, 3131, + 2763, 2329, 3123, + 2731, 2363, 3111, + 2683, 2403, 3097, + 2613, 2451, 3075, + 2495, 2509, 3045, + 2267, 2575, 3003, + 1329, 2653, 2937, + 0, 2737, 2831, + 0, 2831, 2637, + 0, 2933, 2071, + 0, 3041, 0, + 0, 3153, 0, + 0, 3271, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3767, 0, + 0, 3897, 0, + 0, 4025, 0, + 2887, 2211, 3167, + 2887, 2213, 3167, + 2885, 2215, 3167, + 2885, 2215, 3167, + 2883, 2219, 3167, + 2881, 2221, 3165, + 2879, 2225, 3165, + 2877, 2231, 3163, + 2873, 2239, 3161, + 2867, 2247, 3159, + 2859, 2261, 3157, + 2847, 2277, 3151, + 2833, 2297, 3147, + 2813, 2323, 3139, + 2785, 2355, 3127, + 2743, 2397, 3113, + 2681, 2445, 3093, + 2581, 2503, 3065, + 2401, 2571, 3023, + 1927, 2649, 2961, + 0, 2735, 2861, + 0, 2829, 2683, + 0, 2931, 2211, + 0, 3039, 0, + 0, 3153, 0, + 0, 3271, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 2937, 2199, 3187, + 2937, 2201, 3187, + 2937, 2203, 3187, + 2935, 2203, 3185, + 2935, 2207, 3185, + 2933, 2209, 3185, + 2931, 2213, 3183, + 2929, 2219, 3183, + 2925, 2227, 3181, + 2919, 2237, 3179, + 2913, 2249, 3175, + 2903, 2265, 3171, + 2889, 2287, 3167, + 2873, 2313, 3159, + 2847, 2347, 3149, + 2811, 2389, 3135, + 2757, 2439, 3115, + 2675, 2497, 3087, + 2535, 2565, 3049, + 2237, 2645, 2991, + 0, 2731, 2897, + 0, 2827, 2735, + 0, 2929, 2347, + 0, 3037, 0, + 0, 3151, 0, + 0, 3269, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3639, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 2997, 2183, 3211, + 2997, 2185, 3211, + 2997, 2185, 3211, + 2997, 2187, 3211, + 2995, 2189, 3209, + 2993, 2193, 3209, + 2993, 2197, 3209, + 2989, 2203, 3207, + 2987, 2211, 3205, + 2981, 2221, 3203, + 2975, 2235, 3201, + 2967, 2251, 3197, + 2957, 2273, 3191, + 2941, 2301, 3185, + 2919, 2335, 3175, + 2889, 2377, 3161, + 2845, 2429, 3143, + 2777, 2489, 3117, + 2669, 2559, 3081, + 2467, 2637, 3027, + 1839, 2727, 2943, + 0, 2823, 2799, + 0, 2925, 2483, + 0, 3035, 0, + 0, 3149, 0, + 0, 3267, 0, + 0, 3389, 0, + 0, 3513, 0, + 0, 3639, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 3067, 2159, 3241, + 3067, 2161, 3241, + 3067, 2163, 3241, + 3067, 2165, 3241, + 3065, 2167, 3241, + 3065, 2171, 3239, + 3063, 2175, 3239, + 3061, 2181, 3237, + 3057, 2189, 3237, + 3053, 2199, 3235, + 3049, 2213, 3231, + 3041, 2231, 3229, + 3033, 2253, 3223, + 3019, 2283, 3217, + 3001, 2319, 3207, + 2975, 2363, 3195, + 2939, 2415, 3179, + 2887, 2477, 3155, + 2803, 2549, 3121, + 2661, 2629, 3073, + 2357, 2719, 2997, + 0, 2817, 2871, + 0, 2921, 2617, + 0, 3031, 83, + 0, 3147, 0, + 0, 3265, 0, + 0, 3387, 0, + 0, 3511, 0, + 0, 3639, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4025, 0, + 3147, 2127, 3279, + 3147, 2127, 3279, + 3147, 2129, 3279, + 3145, 2131, 3279, + 3145, 2135, 3279, + 3143, 2137, 3277, + 3143, 2143, 3277, + 3141, 2149, 3277, + 3139, 2159, 3275, + 3135, 2169, 3273, + 3131, 2185, 3271, + 3125, 2203, 3267, + 3117, 2227, 3263, + 3107, 2257, 3257, + 3091, 2295, 3249, + 3071, 2341, 3237, + 3041, 2397, 3221, + 2999, 2461, 3201, + 2937, 2535, 3171, + 2835, 2617, 3127, + 2651, 2709, 3059, + 2145, 2809, 2953, + 0, 2915, 2751, + 0, 3027, 2137, + 0, 3143, 0, + 0, 3263, 0, + 0, 3385, 0, + 0, 3511, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4023, 0, + 3235, 2077, 3325, + 3235, 2079, 3325, + 3235, 2081, 3325, + 3233, 2083, 3325, + 3233, 2087, 3325, + 3233, 2091, 3325, + 3231, 2097, 3323, + 3229, 2103, 3323, + 3227, 2113, 3321, + 3225, 2125, 3319, + 3221, 2141, 3317, + 3217, 2163, 3315, + 3211, 2189, 3311, + 3201, 2221, 3305, + 3189, 2263, 3297, + 3173, 2311, 3287, + 3151, 2369, 3273, + 3117, 2437, 3255, + 3069, 2515, 3229, + 2995, 2601, 3189, + 2875, 2697, 3133, + 2635, 2799, 3043, + 1442, 2907, 2885, + 0, 3021, 2519, + 0, 3137, 0, + 0, 3259, 0, + 0, 3383, 0, + 0, 3509, 0, + 0, 3635, 0, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 3331, 2004, 3381, + 3331, 2005, 3381, + 3331, 2007, 3381, + 3331, 2010, 3381, + 3329, 2014, 3381, + 3329, 2019, 3379, + 3329, 2025, 3379, + 3327, 2033, 3379, + 3325, 2045, 3377, + 3323, 2059, 3375, + 3321, 2077, 3373, + 3317, 2101, 3371, + 3311, 2131, 3367, + 3305, 2169, 3363, + 3295, 2215, 3357, + 3281, 2269, 3347, + 3263, 2333, 3335, + 3239, 2405, 3319, + 3201, 2489, 3295, + 3149, 2579, 3263, + 3065, 2679, 3215, + 2923, 2785, 3141, + 2613, 2895, 3019, + 0, 3011, 2777, + 0, 3131, 1508, + 0, 3253, 0, + 0, 3379, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3763, 0, + 0, 3891, 0, + 0, 4023, 0, + 3435, 1880, 3445, + 3433, 1882, 3445, + 3433, 1885, 3445, + 3433, 1889, 3445, + 3433, 1894, 3445, + 3433, 1900, 3445, + 3431, 1908, 3443, + 3431, 1919, 3443, + 3429, 1933, 3443, + 3427, 1952, 3441, + 3425, 1975, 3439, + 3423, 2005, 3437, + 3419, 2042, 3435, + 3413, 2087, 3429, + 3405, 2141, 3425, + 3395, 2203, 3417, + 3381, 2277, 3407, + 3361, 2359, 3393, + 3335, 2449, 3373, + 3295, 2549, 3345, + 3237, 2653, 3305, + 3143, 2765, 3245, + 2979, 2881, 3151, + 2583, 2999, 2985, + 0, 3123, 2573, + 0, 3247, 0, + 0, 3373, 0, + 0, 3501, 0, + 0, 3631, 0, + 0, 3759, 0, + 0, 3891, 0, + 0, 4021, 0, + 3543, 1635, 3519, + 3543, 1639, 3519, + 3543, 1644, 3519, + 3543, 1650, 3519, + 3543, 1658, 3519, + 3543, 1668, 3519, + 3541, 1682, 3519, + 3541, 1700, 3517, + 3539, 1723, 3517, + 3539, 1752, 3517, + 3537, 1788, 3515, + 3535, 1832, 3513, + 3531, 1885, 3511, + 3527, 1947, 3507, + 3521, 2019, 3501, + 3513, 2099, 3495, + 3503, 2189, 3487, + 3487, 2287, 3475, + 3467, 2393, 3459, + 3437, 2503, 3435, + 3395, 2617, 3403, + 3331, 2737, 3357, + 3231, 2859, 3285, + 3045, 2983, 3165, + 2539, 3109, 2933, + 0, 3237, 1936, + 0, 3367, 0, + 0, 3495, 0, + 0, 3627, 0, + 0, 3757, 0, + 0, 3887, 0, + 0, 4019, 0, + 3657, 227, 3603, + 3657, 299, 3603, + 3657, 381, 3603, + 3657, 471, 3603, + 3657, 569, 3603, + 3657, 674, 3603, + 3657, 784, 3603, + 3655, 900, 3601, + 3655, 1019, 3601, + 3653, 1141, 3601, + 3653, 1265, 3599, + 3651, 1392, 3597, + 3649, 1520, 3595, + 3645, 1648, 3593, + 3641, 1778, 3589, + 3635, 1908, 3583, + 3625, 2039, 3577, + 3615, 2171, 3567, + 3599, 2301, 3553, + 3577, 2433, 3535, + 3547, 2565, 3509, + 3503, 2697, 3471, + 3435, 2829, 3417, + 3327, 2961, 3331, + 3121, 3093, 3183, + 2471, 3225, 2857, + 0, 3357, 0, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3695, + 3775, 0, 3693, + 3773, 0, 3693, + 3773, 0, 3693, + 3771, 0, 3691, + 3771, 0, 3691, + 3769, 0, 3689, + 3765, 0, 3687, + 3763, 550, 3683, + 3757, 1360, 3679, + 3751, 1700, 3673, + 3743, 1943, 3665, + 3731, 2143, 3655, + 3715, 2319, 3639, + 3693, 2483, 3619, + 3661, 2637, 3591, + 3615, 2785, 3549, + 3545, 2927, 3487, + 3429, 3069, 3387, + 3207, 3207, 3207, + 2363, 3343, 2727, + 0, 3479, 0, + 0, 3613, 0, + 0, 3747, 0, + 0, 3881, 0, + 0, 4013, 0, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3795, + 3897, 0, 3793, + 3895, 0, 3793, + 3895, 0, 3793, + 3895, 0, 3793, + 3893, 0, 3791, + 3891, 0, 3789, + 3889, 0, 3787, + 3887, 0, 3785, + 3883, 0, 3781, + 3879, 0, 3777, + 3873, 1021, 3771, + 3863, 1770, 3763, + 3851, 2103, 3751, + 3835, 2343, 3735, + 3813, 2541, 3713, + 3779, 2717, 3681, + 3731, 2881, 3635, + 3659, 3033, 3567, + 3537, 3181, 3453, + 3299, 3325, 3235, + 2161, 3465, 2461, + 0, 3603, 0, + 0, 3739, 0, + 0, 3875, 0, + 0, 4009, 0, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4021, 0, 3901, + 4019, 0, 3899, + 4019, 0, 3899, + 4019, 0, 3899, + 4019, 0, 3899, + 4017, 0, 3897, + 4015, 0, 3895, + 4013, 0, 3893, + 4011, 0, 3891, + 4007, 0, 3887, + 4003, 0, 3883, + 3995, 0, 3875, + 3987, 1333, 3867, + 3975, 2044, 3855, + 3957, 2373, 3837, + 3935, 2609, 3813, + 3901, 2807, 3779, + 3851, 2983, 3731, + 3777, 3145, 3655, + 3651, 3299, 3527, + 3401, 3445, 3271, + 1527, 3589, 0, + 0, 3729, 0, + 0, 3867, 0, + 0, 4005, 0, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4013, + 4095, 0, 4011, + 4095, 0, 4011, + 4095, 0, 4011, + 4095, 0, 4011, + 4095, 0, 4009, + 4095, 0, 4009, + 4095, 0, 4007, + 4095, 0, 4005, + 4095, 0, 4003, + 4095, 0, 3999, + 4095, 0, 3993, + 4095, 0, 3987, + 4095, 0, 3977, + 4095, 1951, 3963, + 4083, 2409, 3947, + 4059, 2687, 3921, + 4025, 2905, 3885, + 3975, 3093, 3833, + 3897, 3261, 3751, + 3769, 3419, 3611, + 3509, 3569, 3317, + 0, 3715, 0, + 0, 3857, 0, + 0, 3997, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4091, + 4095, 1786, 4079, + 4095, 2453, 4059, + 4095, 2775, 4033, + 4095, 3009, 3997, + 4095, 3207, 3941, + 4021, 3381, 3855, + 3891, 3543, 3705, + 3621, 3695, 3369, + 0, 3843, 0, + 0, 3985, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1387, 4095, + 4095, 2507, 4095, + 4095, 2869, 4095, + 4095, 3121, 4095, + 4095, 3325, 4055, + 4095, 3503, 3963, + 4015, 3669, 3805, + 3737, 3823, 3433, + 0, 3971, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2569, 4095, + 4095, 2971, 4095, + 4095, 3235, 4095, + 4095, 3445, 4095, + 4095, 3629, 4077, + 4095, 3795, 3911, + 3859, 3951, 3505, + 2825, 2377, 3239, + 2825, 2377, 3239, + 2825, 2379, 3239, + 2823, 2379, 3239, + 2821, 2381, 3237, + 2819, 2383, 3237, + 2817, 2387, 3237, + 2813, 2391, 3235, + 2809, 2395, 3233, + 2803, 2403, 3231, + 2793, 2411, 3229, + 2781, 2423, 3225, + 2763, 2437, 3221, + 2739, 2457, 3215, + 2705, 2481, 3205, + 2657, 2513, 3193, + 2579, 2551, 3175, + 2453, 2597, 3153, + 2193, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2879, 2865, + 0, 2971, 2607, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2827, 2377, 3239, + 2827, 2377, 3239, + 2825, 2379, 3239, + 2825, 2379, 3239, + 2823, 2381, 3239, + 2821, 2383, 3237, + 2817, 2387, 3237, + 2815, 2391, 3235, + 2809, 2395, 3235, + 2803, 2403, 3233, + 2793, 2411, 3229, + 2781, 2423, 3225, + 2765, 2437, 3221, + 2741, 2457, 3215, + 2707, 2481, 3205, + 2657, 2513, 3193, + 2581, 2551, 3177, + 2453, 2597, 3153, + 2197, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2877, 2865, + 0, 2971, 2609, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2827, 2377, 3239, + 2827, 2377, 3239, + 2827, 2379, 3239, + 2825, 2379, 3239, + 2823, 2381, 3239, + 2821, 2383, 3237, + 2819, 2387, 3237, + 2815, 2391, 3235, + 2811, 2395, 3235, + 2803, 2401, 3233, + 2795, 2411, 3229, + 2783, 2423, 3227, + 2765, 2437, 3221, + 2743, 2457, 3215, + 2709, 2481, 3205, + 2659, 2513, 3193, + 2583, 2551, 3177, + 2457, 2597, 3153, + 2201, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2877, 2867, + 0, 2971, 2609, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2829, 2377, 3241, + 2829, 2377, 3239, + 2827, 2379, 3239, + 2827, 2379, 3239, + 2825, 2381, 3239, + 2823, 2383, 3239, + 2821, 2387, 3237, + 2817, 2389, 3237, + 2811, 2395, 3235, + 2805, 2401, 3233, + 2797, 2411, 3231, + 2785, 2423, 3227, + 2767, 2437, 3221, + 2743, 2457, 3215, + 2711, 2481, 3207, + 2661, 2513, 3193, + 2585, 2551, 3177, + 2459, 2597, 3153, + 2207, 2653, 3119, + 0, 2719, 3069, + 0, 2793, 2993, + 0, 2877, 2867, + 0, 2971, 2611, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2831, 2377, 3241, + 2831, 2377, 3241, + 2829, 2377, 3241, + 2829, 2379, 3239, + 2827, 2381, 3239, + 2825, 2383, 3239, + 2823, 2385, 3237, + 2819, 2389, 3237, + 2813, 2395, 3235, + 2807, 2401, 3233, + 2799, 2411, 3231, + 2787, 2421, 3227, + 2769, 2437, 3223, + 2745, 2457, 3215, + 2713, 2481, 3207, + 2663, 2513, 3195, + 2589, 2551, 3177, + 2463, 2597, 3153, + 2213, 2653, 3119, + 465, 2719, 3071, + 0, 2793, 2995, + 0, 2877, 2869, + 0, 2971, 2613, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 2833, 2375, 3241, + 2833, 2377, 3241, + 2833, 2377, 3241, + 2831, 2379, 3241, + 2829, 2381, 3241, + 2827, 2383, 3239, + 2825, 2385, 3239, + 2821, 2389, 3237, + 2817, 2395, 3237, + 2809, 2401, 3235, + 2801, 2411, 3231, + 2789, 2421, 3227, + 2773, 2437, 3223, + 2749, 2457, 3217, + 2715, 2481, 3207, + 2667, 2511, 3195, + 2593, 2551, 3179, + 2469, 2597, 3155, + 2223, 2653, 3121, + 779, 2719, 3071, + 0, 2793, 2995, + 0, 2877, 2869, + 0, 2971, 2615, + 0, 3071, 0, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2837, 2375, 3243, + 2837, 2377, 3243, + 2835, 2377, 3241, + 2835, 2379, 3241, + 2833, 2379, 3241, + 2831, 2383, 3241, + 2829, 2385, 3239, + 2825, 2389, 3239, + 2819, 2395, 3237, + 2813, 2401, 3235, + 2805, 2409, 3233, + 2793, 2421, 3229, + 2777, 2437, 3223, + 2753, 2455, 3217, + 2719, 2481, 3209, + 2671, 2511, 3197, + 2599, 2551, 3179, + 2477, 2597, 3155, + 2237, 2653, 3123, + 1012, 2719, 3073, + 0, 2793, 2997, + 0, 2877, 2871, + 0, 2971, 2619, + 0, 3071, 435, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2841, 2375, 3243, + 2841, 2375, 3243, + 2839, 2377, 3243, + 2839, 2377, 3243, + 2837, 2379, 3243, + 2835, 2381, 3241, + 2833, 2385, 3241, + 2829, 2389, 3239, + 2825, 2393, 3239, + 2819, 2401, 3237, + 2809, 2409, 3233, + 2797, 2421, 3229, + 2781, 2435, 3225, + 2759, 2455, 3219, + 2725, 2479, 3209, + 2679, 2511, 3197, + 2605, 2549, 3181, + 2487, 2597, 3157, + 2253, 2653, 3123, + 1206, 2719, 3075, + 0, 2793, 2999, + 0, 2877, 2875, + 0, 2971, 2625, + 0, 3071, 809, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2847, 2375, 3245, + 2847, 2375, 3245, + 2845, 2375, 3245, + 2845, 2377, 3245, + 2843, 2379, 3243, + 2841, 2381, 3243, + 2839, 2383, 3243, + 2835, 2387, 3241, + 2831, 2393, 3239, + 2825, 2399, 3237, + 2815, 2409, 3235, + 2803, 2419, 3231, + 2787, 2435, 3227, + 2765, 2455, 3221, + 2733, 2479, 3211, + 2687, 2511, 3199, + 2615, 2549, 3183, + 2499, 2597, 3159, + 2273, 2653, 3125, + 1380, 2717, 3077, + 0, 2793, 3003, + 0, 2877, 2877, + 0, 2969, 2631, + 0, 3071, 1063, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2855, 2373, 3247, + 2853, 2373, 3247, + 2853, 2375, 3247, + 2853, 2375, 3247, + 2851, 2377, 3245, + 2849, 2379, 3245, + 2847, 2383, 3245, + 2843, 2387, 3243, + 2839, 2391, 3241, + 2833, 2399, 3239, + 2823, 2407, 3237, + 2813, 2419, 3233, + 2797, 2435, 3229, + 2775, 2453, 3223, + 2743, 2479, 3213, + 2697, 2509, 3201, + 2627, 2549, 3185, + 2515, 2595, 3161, + 2299, 2651, 3129, + 1541, 2717, 3079, + 0, 2793, 3005, + 0, 2877, 2883, + 0, 2969, 2639, + 0, 3069, 1269, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2865, 2371, 3249, + 2863, 2373, 3249, + 2863, 2373, 3249, + 2863, 2375, 3249, + 2861, 2377, 3249, + 2859, 2379, 3249, + 2857, 2381, 3247, + 2853, 2385, 3247, + 2849, 2391, 3245, + 2843, 2397, 3243, + 2835, 2405, 3241, + 2823, 2417, 3237, + 2807, 2433, 3231, + 2787, 2453, 3225, + 2755, 2477, 3217, + 2711, 2509, 3205, + 2645, 2547, 3189, + 2535, 2595, 3165, + 2333, 2651, 3133, + 1694, 2717, 3085, + 0, 2791, 3011, + 0, 2877, 2889, + 0, 2969, 2649, + 0, 3069, 1449, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2877, 2369, 3253, + 2877, 2371, 3253, + 2877, 2371, 3253, + 2875, 2373, 3253, + 2873, 2375, 3253, + 2873, 2377, 3251, + 2869, 2379, 3251, + 2867, 2383, 3251, + 2863, 2389, 3249, + 2857, 2395, 3247, + 2849, 2405, 3245, + 2837, 2415, 3241, + 2823, 2431, 3235, + 2801, 2451, 3229, + 2773, 2475, 3221, + 2729, 2507, 3209, + 2665, 2547, 3193, + 2563, 2593, 3169, + 2373, 2649, 3137, + 1841, 2715, 3089, + 0, 2791, 3017, + 0, 2875, 2897, + 0, 2969, 2663, + 0, 3069, 1614, + 0, 3177, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2895, 2367, 3259, + 2893, 2367, 3259, + 2893, 2369, 3259, + 2893, 2369, 3259, + 2891, 2371, 3257, + 2889, 2373, 3257, + 2887, 2377, 3257, + 2883, 2381, 3255, + 2879, 2385, 3253, + 2873, 2393, 3251, + 2867, 2401, 3249, + 2855, 2413, 3245, + 2841, 2429, 3241, + 2821, 2449, 3235, + 2793, 2473, 3227, + 2753, 2505, 3215, + 2691, 2545, 3199, + 2595, 2591, 3175, + 2423, 2649, 3143, + 1984, 2715, 3097, + 0, 2789, 3025, + 0, 2875, 2909, + 0, 2967, 2681, + 0, 3069, 1770, + 0, 3175, 0, + 0, 3289, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2915, 2363, 3265, + 2915, 2365, 3265, + 2915, 2365, 3265, + 2913, 2367, 3265, + 2913, 2367, 3265, + 2911, 2371, 3263, + 2909, 2373, 3263, + 2905, 2377, 3261, + 2901, 2383, 3261, + 2897, 2389, 3259, + 2889, 2399, 3255, + 2879, 2411, 3253, + 2865, 2425, 3247, + 2847, 2445, 3241, + 2819, 2471, 3233, + 2781, 2503, 3221, + 2725, 2541, 3205, + 2637, 2589, 3183, + 2481, 2647, 3151, + 2123, 2713, 3107, + 0, 2789, 3037, + 0, 2873, 2923, + 0, 2967, 2705, + 0, 3067, 1919, + 0, 3175, 0, + 0, 3287, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3649, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2943, 2359, 3275, + 2943, 2359, 3273, + 2943, 2361, 3273, + 2941, 2361, 3273, + 2941, 2363, 3273, + 2939, 2365, 3273, + 2937, 2369, 3271, + 2933, 2373, 3271, + 2931, 2377, 3269, + 2925, 2385, 3267, + 2919, 2393, 3265, + 2909, 2405, 3261, + 2897, 2421, 3257, + 2879, 2441, 3251, + 2853, 2467, 3243, + 2819, 2499, 3231, + 2767, 2539, 3215, + 2685, 2587, 3193, + 2549, 2643, 3163, + 2261, 2711, 3119, + 0, 2787, 3051, + 0, 2871, 2941, + 0, 2965, 2733, + 0, 3067, 2063, + 0, 3175, 0, + 0, 3287, 0, + 0, 3405, 0, + 0, 3525, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 2977, 2353, 3285, + 2977, 2353, 3285, + 2977, 2353, 3285, + 2975, 2355, 3285, + 2975, 2357, 3285, + 2973, 2359, 3283, + 2971, 2363, 3283, + 2969, 2367, 3281, + 2965, 2371, 3281, + 2961, 2379, 3279, + 2955, 2387, 3277, + 2945, 2401, 3273, + 2933, 2415, 3269, + 2917, 2437, 3263, + 2895, 2461, 3255, + 2863, 2495, 3243, + 2815, 2535, 3229, + 2745, 2583, 3207, + 2627, 2641, 3177, + 2399, 2707, 3135, + 1461, 2785, 3069, + 0, 2869, 2965, + 0, 2963, 2769, + 0, 3065, 2203, + 0, 3173, 0, + 0, 3287, 0, + 0, 3403, 0, + 0, 3525, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3901, 0, + 0, 4029, 0, + 3019, 2343, 3301, + 3019, 2343, 3299, + 3019, 2345, 3299, + 3017, 2347, 3299, + 3017, 2347, 3299, + 3015, 2351, 3299, + 3013, 2353, 3297, + 3011, 2357, 3297, + 3009, 2363, 3295, + 3005, 2371, 3293, + 2999, 2379, 3291, + 2991, 2393, 3289, + 2979, 2409, 3285, + 2965, 2429, 3279, + 2945, 2455, 3271, + 2917, 2487, 3259, + 2875, 2529, 3245, + 2813, 2577, 3225, + 2713, 2635, 3197, + 2533, 2703, 3155, + 2059, 2781, 3093, + 0, 2867, 2993, + 0, 2961, 2815, + 0, 3063, 2343, + 0, 3171, 0, + 0, 3285, 0, + 0, 3403, 0, + 0, 3523, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3899, 0, + 0, 4029, 0, + 3071, 2331, 3319, + 3069, 2331, 3319, + 3069, 2333, 3319, + 3069, 2335, 3319, + 3067, 2335, 3319, + 3067, 2339, 3317, + 3065, 2341, 3317, + 3063, 2345, 3315, + 3061, 2351, 3315, + 3057, 2359, 3313, + 3051, 2369, 3311, + 3045, 2381, 3307, + 3035, 2397, 3303, + 3023, 2419, 3299, + 3005, 2445, 3291, + 2979, 2479, 3281, + 2943, 2521, 3267, + 2891, 2571, 3247, + 2807, 2629, 3219, + 2667, 2699, 3181, + 2369, 2777, 3123, + 0, 2863, 3031, + 0, 2959, 2867, + 0, 3061, 2479, + 0, 3169, 0, + 0, 3283, 0, + 0, 3401, 0, + 0, 3523, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3899, 0, + 0, 4027, 0, + 3131, 2315, 3343, + 3131, 2315, 3343, + 3129, 2317, 3343, + 3129, 2317, 3343, + 3129, 2319, 3343, + 3127, 2321, 3341, + 3125, 2325, 3341, + 3125, 2329, 3341, + 3121, 2335, 3339, + 3119, 2343, 3337, + 3113, 2353, 3335, + 3107, 2367, 3333, + 3099, 2383, 3329, + 3089, 2405, 3323, + 3073, 2433, 3317, + 3051, 2467, 3307, + 3021, 2509, 3293, + 2977, 2561, 3275, + 2909, 2621, 3249, + 2801, 2691, 3213, + 2599, 2769, 3159, + 1971, 2859, 3075, + 0, 2955, 2931, + 0, 3057, 2615, + 0, 3167, 0, + 0, 3281, 0, + 0, 3399, 0, + 0, 3521, 0, + 0, 3645, 0, + 0, 3771, 0, + 0, 3899, 0, + 0, 4027, 0, + 3201, 2291, 3373, + 3199, 2291, 3373, + 3199, 2293, 3373, + 3199, 2295, 3373, + 3199, 2297, 3373, + 3197, 2299, 3373, + 3197, 2303, 3371, + 3195, 2307, 3371, + 3193, 2313, 3371, + 3189, 2321, 3369, + 3185, 2331, 3367, + 3181, 2345, 3363, + 3173, 2363, 3361, + 3165, 2387, 3355, + 3151, 2415, 3349, + 3133, 2451, 3339, + 3107, 2495, 3327, + 3071, 2547, 3311, + 3019, 2609, 3287, + 2935, 2681, 3253, + 2793, 2761, 3205, + 2489, 2851, 3129, + 0, 2949, 3003, + 0, 3053, 2749, + 0, 3163, 215, + 0, 3279, 0, + 0, 3397, 0, + 0, 3519, 0, + 0, 3645, 0, + 0, 3771, 0, + 0, 3899, 0, + 0, 4027, 0, + 3279, 2257, 3411, + 3279, 2259, 3411, + 3279, 2259, 3411, + 3279, 2261, 3411, + 3277, 2263, 3411, + 3277, 2267, 3411, + 3275, 2271, 3409, + 3275, 2275, 3409, + 3273, 2281, 3409, + 3271, 2291, 3407, + 3267, 2301, 3405, + 3263, 2317, 3403, + 3257, 2335, 3399, + 3249, 2359, 3395, + 3239, 2389, 3389, + 3223, 2427, 3381, + 3203, 2473, 3369, + 3173, 2529, 3355, + 3131, 2593, 3333, + 3069, 2667, 3303, + 2967, 2749, 3259, + 2783, 2841, 3191, + 2277, 2941, 3085, + 0, 3047, 2883, + 0, 3159, 2269, + 0, 3275, 0, + 0, 3395, 0, + 0, 3517, 0, + 0, 3643, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4027, 0, + 3367, 2209, 3457, + 3367, 2209, 3457, + 3367, 2211, 3457, + 3367, 2213, 3457, + 3365, 2215, 3457, + 3365, 2219, 3457, + 3365, 2223, 3457, + 3363, 2229, 3455, + 3361, 2235, 3455, + 3361, 2245, 3453, + 3357, 2257, 3451, + 3353, 2273, 3449, + 3349, 2295, 3447, + 3343, 2321, 3443, + 3333, 2353, 3437, + 3321, 2395, 3429, + 3305, 2443, 3419, + 3283, 2503, 3407, + 3249, 2571, 3387, + 3201, 2647, 3361, + 3127, 2735, 3321, + 3007, 2829, 3265, + 2767, 2931, 3175, + 1574, 3039, 3017, + 0, 3153, 2651, + 0, 3271, 0, + 0, 3391, 0, + 0, 3515, 0, + 0, 3641, 0, + 0, 3767, 0, + 0, 3895, 0, + 0, 4025, 0, + 3463, 2135, 3513, + 3463, 2135, 3513, + 3463, 2137, 3513, + 3463, 2139, 3513, + 3463, 2143, 3513, + 3461, 2145, 3513, + 3461, 2151, 3511, + 3461, 2157, 3511, + 3459, 2165, 3511, + 3457, 2177, 3509, + 3455, 2191, 3507, + 3453, 2209, 3505, + 3449, 2233, 3503, + 3443, 2263, 3499, + 3437, 2301, 3495, + 3427, 2347, 3489, + 3413, 2401, 3479, + 3395, 2465, 3467, + 3371, 2537, 3451, + 3333, 2621, 3427, + 3281, 2711, 3395, + 3197, 2811, 3347, + 3055, 2917, 3273, + 2745, 3027, 3151, + 0, 3143, 2909, + 0, 3263, 1640, + 0, 3385, 0, + 0, 3511, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4023, 0, + 3567, 2011, 3577, + 3567, 2012, 3577, + 3567, 2014, 3577, + 3565, 2017, 3577, + 3565, 2021, 3577, + 3565, 2026, 3577, + 3565, 2032, 3577, + 3563, 2040, 3577, + 3563, 2051, 3575, + 3561, 2065, 3575, + 3561, 2083, 3573, + 3557, 2107, 3571, + 3555, 2137, 3569, + 3551, 2173, 3567, + 3545, 2219, 3563, + 3537, 2273, 3557, + 3527, 2335, 3549, + 3513, 2409, 3539, + 3493, 2491, 3525, + 3467, 2581, 3505, + 3427, 2681, 3477, + 3369, 2785, 3437, + 3275, 2897, 3377, + 3111, 3013, 3283, + 2715, 3131, 3117, + 0, 3255, 2705, + 0, 3379, 0, + 0, 3505, 0, + 0, 3633, 0, + 0, 3763, 0, + 0, 3891, 0, + 0, 4023, 0, + 3675, 1765, 3653, + 3675, 1767, 3653, + 3675, 1771, 3651, + 3675, 1776, 3651, + 3675, 1782, 3651, + 3675, 1790, 3651, + 3675, 1801, 3651, + 3673, 1814, 3651, + 3673, 1832, 3651, + 3671, 1855, 3649, + 3671, 1884, 3649, + 3669, 1920, 3647, + 3667, 1964, 3645, + 3663, 2017, 3643, + 3659, 2079, 3639, + 3653, 2151, 3633, + 3645, 2231, 3627, + 3635, 2321, 3619, + 3619, 2419, 3607, + 3599, 2525, 3591, + 3569, 2635, 3567, + 3527, 2749, 3535, + 3465, 2869, 3489, + 3363, 2991, 3417, + 3177, 3115, 3297, + 2671, 3241, 3065, + 0, 3369, 2069, + 0, 3499, 0, + 0, 3627, 0, + 0, 3759, 0, + 0, 3889, 0, + 0, 4021, 0, + 3789, 297, 3735, + 3789, 359, 3735, + 3789, 432, 3735, + 3789, 513, 3735, + 3789, 603, 3735, + 3789, 701, 3735, + 3789, 806, 3735, + 3789, 917, 3735, + 3787, 1032, 3733, + 3787, 1151, 3733, + 3785, 1273, 3733, + 3785, 1398, 3731, + 3783, 1524, 3729, + 3781, 1652, 3727, + 3777, 1781, 3725, + 3773, 1910, 3721, + 3767, 2040, 3715, + 3759, 2171, 3709, + 3747, 2303, 3699, + 3731, 2433, 3685, + 3709, 2565, 3667, + 3679, 2697, 3641, + 3635, 2829, 3603, + 3567, 2961, 3549, + 3459, 3093, 3463, + 3253, 3225, 3315, + 2603, 3357, 2989, + 0, 3489, 0, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3907, 0, 3827, + 3905, 0, 3825, + 3905, 0, 3825, + 3903, 0, 3823, + 3903, 0, 3823, + 3901, 0, 3821, + 3899, 0, 3819, + 3895, 682, 3815, + 3891, 1493, 3811, + 3883, 1832, 3805, + 3875, 2075, 3797, + 3863, 2275, 3787, + 3847, 2451, 3773, + 3825, 2615, 3751, + 3793, 2769, 3723, + 3747, 2917, 3681, + 3677, 3059, 3619, + 3561, 3201, 3519, + 3339, 3339, 3339, + 2495, 3475, 2859, + 0, 3611, 0, + 0, 3745, 0, + 0, 3879, 0, + 0, 4013, 0, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4029, 0, 3927, + 4027, 0, 3925, + 4027, 0, 3925, + 4027, 0, 3925, + 4025, 0, 3923, + 4023, 0, 3921, + 4021, 0, 3919, + 4019, 0, 3917, + 4015, 0, 3913, + 4011, 0, 3909, + 4005, 1152, 3903, + 3995, 1902, 3895, + 3983, 2235, 3883, + 3967, 2475, 3867, + 3945, 2673, 3845, + 3911, 2849, 3813, + 3863, 3013, 3767, + 3791, 3165, 3699, + 3669, 3313, 3585, + 3433, 3457, 3367, + 2293, 3597, 2593, + 0, 3735, 0, + 0, 3871, 0, + 0, 4007, 0, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4033, + 4095, 0, 4031, + 4095, 0, 4031, + 4095, 0, 4031, + 4095, 0, 4029, + 4095, 0, 4027, + 4095, 0, 4025, + 4095, 0, 4023, + 4095, 0, 4019, + 4095, 0, 4015, + 4095, 0, 4007, + 4095, 1465, 3999, + 4095, 2177, 3987, + 4091, 2505, 3969, + 4067, 2741, 3945, + 4033, 2939, 3913, + 3983, 3115, 3863, + 3909, 3277, 3787, + 3783, 3431, 3659, + 3533, 3579, 3405, + 1659, 3721, 0, + 0, 3861, 0, + 0, 3999, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2083, 4095, + 4095, 2541, 4079, + 4095, 2819, 4053, + 4095, 3037, 4017, + 4095, 3225, 3965, + 4031, 3393, 3883, + 3901, 3551, 3743, + 3641, 3703, 3449, + 0, 3847, 0, + 0, 3989, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1918, 4095, + 4095, 2585, 4095, + 4095, 2907, 4095, + 4095, 3141, 4095, + 4095, 3339, 4073, + 4095, 3513, 3987, + 4023, 3675, 3837, + 3753, 3827, 3501, + 0, 3975, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1519, 4095, + 4095, 2639, 4095, + 4095, 3001, 4095, + 4095, 3253, 4095, + 4095, 3457, 4095, + 4095, 3635, 4095, + 4095, 3801, 3937, + 3869, 3955, 3565, + 2957, 2509, 3371, + 2957, 2509, 3371, + 2957, 2509, 3371, + 2955, 2511, 3371, + 2955, 2513, 3371, + 2953, 2513, 3369, + 2951, 2515, 3369, + 2949, 2519, 3369, + 2945, 2523, 3367, + 2941, 2527, 3365, + 2933, 2535, 3363, + 2925, 2543, 3361, + 2913, 2555, 3357, + 2895, 2569, 3353, + 2871, 2589, 3347, + 2837, 2613, 3337, + 2787, 2645, 3325, + 2711, 2683, 3307, + 2583, 2731, 3283, + 2323, 2785, 3251, + 0, 2851, 3201, + 0, 2927, 3125, + 0, 3011, 2997, + 0, 3103, 2739, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2957, 2509, 3371, + 2957, 2511, 3371, + 2955, 2511, 3371, + 2953, 2513, 3371, + 2951, 2515, 3369, + 2949, 2519, 3369, + 2945, 2523, 3367, + 2941, 2527, 3367, + 2935, 2535, 3365, + 2925, 2543, 3361, + 2913, 2555, 3357, + 2895, 2569, 3353, + 2871, 2589, 3347, + 2839, 2613, 3337, + 2789, 2645, 3325, + 2711, 2683, 3307, + 2585, 2729, 3285, + 2327, 2785, 3251, + 0, 2851, 3201, + 0, 2927, 3125, + 0, 3011, 2997, + 0, 3103, 2739, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2957, 2511, 3371, + 2957, 2511, 3371, + 2955, 2513, 3371, + 2953, 2515, 3369, + 2951, 2519, 3369, + 2947, 2523, 3367, + 2941, 2527, 3367, + 2935, 2535, 3365, + 2925, 2543, 3361, + 2913, 2555, 3357, + 2897, 2569, 3353, + 2873, 2589, 3347, + 2839, 2613, 3337, + 2789, 2645, 3325, + 2713, 2683, 3309, + 2587, 2729, 3285, + 2329, 2785, 3251, + 0, 2851, 3201, + 0, 2927, 3125, + 0, 3011, 2997, + 0, 3103, 2741, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2961, 2509, 3373, + 2959, 2509, 3371, + 2959, 2509, 3371, + 2959, 2511, 3371, + 2957, 2511, 3371, + 2955, 2513, 3371, + 2953, 2515, 3369, + 2951, 2519, 3369, + 2947, 2523, 3369, + 2943, 2527, 3367, + 2937, 2535, 3365, + 2927, 2543, 3361, + 2915, 2555, 3359, + 2897, 2569, 3353, + 2875, 2589, 3347, + 2841, 2613, 3337, + 2791, 2645, 3325, + 2715, 2683, 3309, + 2589, 2729, 3285, + 2333, 2785, 3251, + 0, 2851, 3201, + 0, 2925, 3125, + 0, 3011, 2999, + 0, 3103, 2741, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2961, 2509, 3373, + 2961, 2509, 3373, + 2961, 2509, 3373, + 2959, 2511, 3371, + 2959, 2511, 3371, + 2957, 2513, 3371, + 2955, 2515, 3371, + 2953, 2519, 3369, + 2949, 2523, 3369, + 2945, 2527, 3367, + 2937, 2533, 3365, + 2929, 2543, 3363, + 2917, 2555, 3359, + 2899, 2569, 3353, + 2875, 2589, 3347, + 2843, 2613, 3339, + 2793, 2645, 3325, + 2717, 2683, 3309, + 2591, 2729, 3285, + 2339, 2785, 3251, + 0, 2851, 3201, + 0, 2925, 3125, + 0, 3011, 2999, + 0, 3103, 2743, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2963, 2507, 3373, + 2963, 2509, 3373, + 2963, 2509, 3373, + 2961, 2511, 3373, + 2961, 2511, 3371, + 2959, 2513, 3371, + 2957, 2515, 3371, + 2955, 2517, 3371, + 2951, 2521, 3369, + 2947, 2527, 3367, + 2939, 2533, 3365, + 2931, 2543, 3363, + 2919, 2555, 3359, + 2901, 2569, 3355, + 2879, 2589, 3347, + 2845, 2613, 3339, + 2795, 2645, 3327, + 2721, 2683, 3309, + 2595, 2729, 3285, + 2347, 2785, 3253, + 597, 2851, 3203, + 0, 2925, 3127, + 0, 3009, 3001, + 0, 3103, 2745, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2967, 2507, 3373, + 2965, 2509, 3373, + 2965, 2509, 3373, + 2965, 2509, 3373, + 2963, 2511, 3373, + 2961, 2513, 3373, + 2959, 2515, 3371, + 2957, 2517, 3371, + 2953, 2521, 3369, + 2949, 2527, 3369, + 2943, 2533, 3367, + 2933, 2543, 3363, + 2921, 2553, 3359, + 2905, 2569, 3355, + 2881, 2589, 3349, + 2847, 2613, 3339, + 2799, 2645, 3327, + 2725, 2683, 3311, + 2601, 2729, 3287, + 2355, 2785, 3253, + 912, 2851, 3203, + 0, 2925, 3127, + 0, 3009, 3001, + 0, 3103, 2749, + 0, 3203, 0, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2969, 2507, 3375, + 2969, 2507, 3375, + 2969, 2509, 3375, + 2967, 2509, 3373, + 2967, 2511, 3373, + 2965, 2513, 3373, + 2963, 2515, 3373, + 2961, 2517, 3371, + 2957, 2521, 3371, + 2953, 2527, 3369, + 2945, 2533, 3367, + 2937, 2541, 3365, + 2925, 2553, 3361, + 2909, 2569, 3355, + 2885, 2587, 3349, + 2853, 2613, 3341, + 2803, 2643, 3329, + 2731, 2683, 3311, + 2609, 2729, 3287, + 2369, 2785, 3255, + 1144, 2851, 3205, + 0, 2925, 3129, + 0, 3009, 3003, + 0, 3103, 2751, + 0, 3203, 567, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2973, 2507, 3375, + 2973, 2507, 3375, + 2973, 2507, 3375, + 2971, 2509, 3375, + 2971, 2509, 3375, + 2969, 2511, 3375, + 2967, 2513, 3373, + 2965, 2517, 3373, + 2961, 2521, 3371, + 2957, 2525, 3371, + 2951, 2533, 3369, + 2941, 2541, 3365, + 2929, 2553, 3363, + 2913, 2567, 3357, + 2891, 2587, 3351, + 2857, 2613, 3341, + 2811, 2643, 3329, + 2737, 2681, 3313, + 2619, 2729, 3289, + 2385, 2785, 3255, + 1339, 2851, 3207, + 0, 2925, 3131, + 0, 3009, 3007, + 0, 3103, 2757, + 0, 3203, 941, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2979, 2505, 3377, + 2979, 2507, 3377, + 2979, 2507, 3377, + 2977, 2507, 3377, + 2977, 2509, 3377, + 2975, 2511, 3375, + 2973, 2513, 3375, + 2971, 2515, 3375, + 2967, 2519, 3373, + 2963, 2525, 3371, + 2957, 2531, 3369, + 2947, 2541, 3367, + 2935, 2553, 3363, + 2919, 2567, 3359, + 2897, 2587, 3353, + 2865, 2611, 3343, + 2819, 2643, 3331, + 2747, 2681, 3315, + 2631, 2729, 3291, + 2405, 2785, 3257, + 1513, 2849, 3209, + 0, 2925, 3135, + 0, 3009, 3011, + 0, 3101, 2763, + 0, 3203, 1195, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 2987, 2505, 3379, + 2987, 2505, 3379, + 2987, 2505, 3379, + 2985, 2507, 3379, + 2985, 2507, 3379, + 2983, 2509, 3379, + 2981, 2511, 3377, + 2979, 2515, 3377, + 2975, 2519, 3375, + 2971, 2523, 3375, + 2965, 2531, 3373, + 2955, 2539, 3369, + 2945, 2551, 3365, + 2929, 2567, 3361, + 2907, 2585, 3355, + 2875, 2611, 3345, + 2829, 2641, 3333, + 2759, 2681, 3317, + 2647, 2727, 3293, + 2431, 2783, 3261, + 1674, 2849, 3213, + 0, 2925, 3137, + 0, 3009, 3015, + 0, 3101, 2771, + 0, 3201, 1401, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 2997, 2503, 3383, + 2997, 2503, 3383, + 2997, 2505, 3381, + 2995, 2505, 3381, + 2995, 2507, 3381, + 2993, 2509, 3381, + 2991, 2511, 3381, + 2989, 2513, 3379, + 2985, 2517, 3379, + 2981, 2523, 3377, + 2975, 2529, 3375, + 2967, 2539, 3373, + 2955, 2549, 3369, + 2939, 2565, 3365, + 2919, 2585, 3357, + 2887, 2609, 3349, + 2843, 2641, 3337, + 2777, 2679, 3321, + 2667, 2727, 3297, + 2465, 2783, 3265, + 1826, 2849, 3217, + 0, 2923, 3143, + 0, 3009, 3021, + 0, 3101, 2781, + 0, 3201, 1581, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3011, 2501, 3387, + 3009, 2501, 3385, + 3009, 2503, 3385, + 3009, 2503, 3385, + 3007, 2505, 3385, + 3007, 2507, 3385, + 3005, 2509, 3385, + 3001, 2511, 3383, + 2999, 2515, 3383, + 2995, 2521, 3381, + 2989, 2527, 3379, + 2981, 2537, 3377, + 2969, 2549, 3373, + 2955, 2563, 3369, + 2933, 2583, 3361, + 2905, 2607, 3353, + 2861, 2639, 3341, + 2797, 2679, 3325, + 2695, 2725, 3301, + 2505, 2781, 3269, + 1973, 2847, 3221, + 0, 2923, 3149, + 0, 3007, 3029, + 0, 3101, 2795, + 0, 3201, 1747, + 0, 3309, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3027, 2499, 3391, + 3027, 2499, 3391, + 3025, 2499, 3391, + 3025, 2501, 3391, + 3025, 2501, 3391, + 3023, 2503, 3389, + 3021, 2505, 3389, + 3019, 2509, 3389, + 3015, 2513, 3387, + 3011, 2517, 3385, + 3007, 2525, 3383, + 2999, 2533, 3381, + 2987, 2545, 3377, + 2973, 2561, 3373, + 2953, 2581, 3367, + 2925, 2605, 3359, + 2885, 2637, 3347, + 2823, 2677, 3331, + 2727, 2723, 3307, + 2555, 2781, 3275, + 2115, 2847, 3229, + 0, 2923, 3157, + 0, 3007, 3041, + 0, 3099, 2813, + 0, 3201, 1902, + 0, 3307, 0, + 0, 3421, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3049, 2495, 3397, + 3049, 2495, 3397, + 3047, 2497, 3397, + 3047, 2497, 3397, + 3045, 2499, 3397, + 3045, 2501, 3397, + 3043, 2503, 3395, + 3041, 2505, 3395, + 3037, 2509, 3393, + 3033, 2515, 3393, + 3029, 2521, 3391, + 3021, 2531, 3389, + 3011, 2543, 3385, + 2997, 2557, 3381, + 2979, 2577, 3373, + 2953, 2603, 3365, + 2913, 2635, 3353, + 2857, 2673, 3337, + 2769, 2721, 3315, + 2613, 2779, 3285, + 2255, 2845, 3239, + 0, 2921, 3169, + 0, 3005, 3055, + 0, 3099, 2837, + 0, 3199, 2051, + 0, 3307, 0, + 0, 3419, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3781, 0, + 0, 3905, 0, + 0, 4033, 0, + 3075, 2491, 3407, + 3075, 2491, 3407, + 3075, 2491, 3405, + 3075, 2493, 3405, + 3073, 2493, 3405, + 3073, 2495, 3405, + 3071, 2497, 3405, + 3069, 2501, 3403, + 3065, 2505, 3403, + 3063, 2509, 3401, + 3057, 2517, 3399, + 3051, 2527, 3397, + 3041, 2539, 3393, + 3029, 2553, 3389, + 3011, 2573, 3383, + 2985, 2599, 3375, + 2951, 2631, 3363, + 2899, 2671, 3347, + 2817, 2719, 3327, + 2681, 2775, 3295, + 2393, 2843, 3251, + 0, 2919, 3183, + 0, 3005, 3073, + 0, 3097, 2865, + 0, 3199, 2195, + 0, 3307, 0, + 0, 3419, 0, + 0, 3537, 0, + 0, 3657, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4033, 0, + 3109, 2483, 3417, + 3109, 2485, 3417, + 3109, 2485, 3417, + 3109, 2485, 3417, + 3107, 2487, 3417, + 3107, 2489, 3417, + 3105, 2491, 3415, + 3103, 2495, 3415, + 3101, 2499, 3415, + 3097, 2503, 3413, + 3093, 2511, 3411, + 3087, 2521, 3409, + 3077, 2533, 3405, + 3065, 2549, 3401, + 3049, 2569, 3395, + 3027, 2595, 3387, + 2995, 2627, 3375, + 2947, 2667, 3361, + 2877, 2715, 3339, + 2759, 2773, 3309, + 2531, 2839, 3267, + 1593, 2917, 3201, + 0, 3003, 3097, + 0, 3097, 2903, + 0, 3197, 2335, + 0, 3305, 0, + 0, 3419, 0, + 0, 3535, 0, + 0, 3657, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4033, 0, + 3153, 2475, 3433, + 3151, 2475, 3433, + 3151, 2477, 3433, + 3151, 2477, 3431, + 3151, 2479, 3431, + 3149, 2481, 3431, + 3147, 2483, 3431, + 3147, 2485, 3429, + 3143, 2489, 3429, + 3141, 2495, 3427, + 3137, 2503, 3425, + 3131, 2511, 3423, + 3123, 2525, 3421, + 3113, 2541, 3417, + 3097, 2561, 3411, + 3077, 2587, 3403, + 3049, 2619, 3391, + 3007, 2661, 3377, + 2945, 2709, 3357, + 2845, 2767, 3329, + 2665, 2835, 3287, + 2191, 2913, 3225, + 0, 2999, 3125, + 0, 3093, 2947, + 0, 3195, 2475, + 0, 3303, 0, + 0, 3417, 0, + 0, 3535, 0, + 0, 3655, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4031, 0, + 3203, 2463, 3451, + 3203, 2463, 3451, + 3203, 2463, 3451, + 3201, 2465, 3451, + 3201, 2467, 3451, + 3201, 2469, 3451, + 3199, 2471, 3449, + 3197, 2473, 3449, + 3195, 2477, 3449, + 3193, 2483, 3447, + 3189, 2491, 3445, + 3183, 2501, 3443, + 3177, 2513, 3439, + 3167, 2529, 3435, + 3155, 2551, 3431, + 3137, 2577, 3423, + 3111, 2611, 3413, + 3075, 2653, 3399, + 3023, 2703, 3379, + 2941, 2761, 3353, + 2801, 2831, 3313, + 2501, 2909, 3255, + 0, 2995, 3163, + 0, 3091, 2999, + 0, 3193, 2611, + 0, 3301, 0, + 0, 3415, 0, + 0, 3533, 0, + 0, 3655, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4031, 0, + 3263, 2445, 3475, + 3263, 2447, 3475, + 3263, 2447, 3475, + 3261, 2449, 3475, + 3261, 2449, 3475, + 3261, 2451, 3475, + 3259, 2455, 3475, + 3259, 2457, 3473, + 3257, 2461, 3473, + 3253, 2467, 3471, + 3251, 2475, 3469, + 3247, 2485, 3467, + 3239, 2499, 3465, + 3231, 2515, 3461, + 3221, 2537, 3455, + 3205, 2565, 3449, + 3183, 2599, 3439, + 3153, 2641, 3425, + 3109, 2693, 3407, + 3043, 2753, 3383, + 2933, 2823, 3345, + 2731, 2903, 3291, + 2103, 2991, 3207, + 0, 3087, 3063, + 0, 3189, 2747, + 0, 3299, 0, + 0, 3413, 0, + 0, 3531, 0, + 0, 3653, 0, + 0, 3777, 0, + 0, 3903, 0, + 0, 4031, 0, + 3333, 2423, 3507, + 3333, 2423, 3507, + 3331, 2423, 3505, + 3331, 2425, 3505, + 3331, 2427, 3505, + 3331, 2429, 3505, + 3329, 2431, 3505, + 3329, 2435, 3505, + 3327, 2439, 3503, + 3325, 2445, 3503, + 3321, 2453, 3501, + 3319, 2463, 3499, + 3313, 2477, 3497, + 3305, 2495, 3493, + 3297, 2519, 3487, + 3283, 2547, 3481, + 3265, 2583, 3473, + 3241, 2627, 3459, + 3203, 2679, 3443, + 3151, 2741, 3419, + 3067, 2813, 3385, + 2925, 2893, 3337, + 2621, 2983, 3261, + 0, 3081, 3135, + 0, 3185, 2881, + 0, 3295, 347, + 0, 3411, 0, + 0, 3529, 0, + 0, 3651, 0, + 0, 3777, 0, + 0, 3903, 0, + 0, 4031, 0, + 3411, 2389, 3545, + 3411, 2389, 3543, + 3411, 2391, 3543, + 3411, 2391, 3543, + 3411, 2393, 3543, + 3409, 2395, 3543, + 3409, 2399, 3543, + 3409, 2403, 3543, + 3407, 2407, 3541, + 3405, 2413, 3541, + 3403, 2423, 3539, + 3399, 2433, 3537, + 3395, 2449, 3535, + 3389, 2467, 3531, + 3381, 2491, 3527, + 3371, 2521, 3521, + 3355, 2559, 3513, + 3335, 2605, 3501, + 3305, 2661, 3487, + 3263, 2725, 3465, + 3201, 2799, 3435, + 3099, 2883, 3391, + 2915, 2973, 3323, + 2411, 3073, 3217, + 0, 3179, 3015, + 0, 3291, 2401, + 0, 3407, 0, + 0, 3527, 0, + 0, 3649, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 3499, 2341, 3591, + 3499, 2341, 3591, + 3499, 2343, 3589, + 3499, 2343, 3589, + 3499, 2345, 3589, + 3499, 2347, 3589, + 3497, 2351, 3589, + 3497, 2355, 3589, + 3495, 2361, 3587, + 3495, 2367, 3587, + 3493, 2377, 3585, + 3489, 2389, 3583, + 3485, 2405, 3581, + 3481, 2427, 3579, + 3475, 2453, 3575, + 3467, 2485, 3569, + 3455, 2527, 3563, + 3437, 2575, 3551, + 3415, 2635, 3539, + 3381, 2703, 3519, + 3333, 2779, 3493, + 3259, 2867, 3453, + 3139, 2961, 3397, + 2899, 3063, 3307, + 1706, 3171, 3149, + 0, 3285, 2783, + 0, 3403, 0, + 0, 3523, 0, + 0, 3647, 0, + 0, 3773, 0, + 0, 3899, 0, + 0, 4029, 0, + 3595, 2265, 3645, + 3595, 2267, 3645, + 3595, 2267, 3645, + 3595, 2269, 3645, + 3595, 2271, 3645, + 3595, 2275, 3645, + 3593, 2277, 3645, + 3593, 2283, 3643, + 3593, 2289, 3643, + 3591, 2297, 3643, + 3589, 2309, 3641, + 3587, 2323, 3639, + 3585, 2341, 3637, + 3581, 2365, 3635, + 3575, 2395, 3631, + 3569, 2433, 3627, + 3559, 2479, 3621, + 3545, 2533, 3611, + 3527, 2597, 3599, + 3503, 2671, 3583, + 3467, 2753, 3559, + 3413, 2845, 3527, + 3329, 2943, 3479, + 3187, 3049, 3405, + 2877, 3161, 3283, + 0, 3275, 3041, + 0, 3395, 1772, + 0, 3519, 0, + 0, 3643, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4027, 0, + 3699, 2141, 3711, + 3699, 2143, 3711, + 3699, 2145, 3709, + 3699, 2147, 3709, + 3697, 2149, 3709, + 3697, 2153, 3709, + 3697, 2157, 3709, + 3697, 2165, 3709, + 3697, 2173, 3709, + 3695, 2183, 3707, + 3693, 2197, 3707, + 3693, 2217, 3705, + 3689, 2239, 3703, + 3687, 2269, 3701, + 3683, 2305, 3699, + 3677, 2351, 3695, + 3669, 2405, 3689, + 3659, 2469, 3681, + 3645, 2541, 3671, + 3627, 2623, 3657, + 3599, 2713, 3637, + 3559, 2813, 3609, + 3501, 2917, 3569, + 3407, 3029, 3509, + 3243, 3145, 3415, + 2847, 3263, 3249, + 0, 3387, 2837, + 0, 3511, 0, + 0, 3637, 0, + 0, 3765, 0, + 0, 3895, 0, + 0, 4025, 0, + 3807, 1895, 3785, + 3807, 1897, 3785, + 3807, 1900, 3785, + 3807, 1903, 3785, + 3807, 1908, 3783, + 3807, 1914, 3783, + 3807, 1922, 3783, + 3807, 1933, 3783, + 3805, 1946, 3783, + 3805, 1964, 3783, + 3805, 1987, 3781, + 3803, 2016, 3781, + 3801, 2051, 3779, + 3799, 2095, 3777, + 3795, 2149, 3775, + 3791, 2211, 3771, + 3785, 2283, 3767, + 3777, 2365, 3759, + 3767, 2453, 3751, + 3751, 2551, 3739, + 3731, 2657, 3723, + 3701, 2767, 3701, + 3659, 2881, 3667, + 3597, 3001, 3621, + 3495, 3123, 3549, + 3309, 3247, 3429, + 2803, 3373, 3197, + 0, 3501, 2201, + 0, 3631, 0, + 0, 3761, 0, + 0, 3891, 0, + 0, 4021, 0, + 3921, 376, 3867, + 3921, 429, 3867, + 3921, 491, 3867, + 3921, 564, 3867, + 3921, 645, 3867, + 3921, 735, 3867, + 3921, 833, 3867, + 3921, 938, 3867, + 3921, 1048, 3867, + 3919, 1164, 3865, + 3919, 1283, 3865, + 3919, 1405, 3865, + 3917, 1530, 3863, + 3915, 1656, 3861, + 3913, 1784, 3859, + 3909, 1913, 3857, + 3905, 2042, 3853, + 3899, 2173, 3847, + 3891, 2303, 3841, + 3879, 2435, 3831, + 3863, 2565, 3817, + 3841, 2697, 3799, + 3811, 2829, 3773, + 3767, 2961, 3735, + 3699, 3093, 3681, + 3591, 3225, 3595, + 3385, 3357, 3447, + 2735, 3489, 3121, + 0, 3621, 0, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 4041, 0, 3959, + 4041, 0, 3959, + 4041, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4039, 0, 3959, + 4037, 0, 3957, + 4037, 0, 3957, + 4037, 0, 3957, + 4035, 0, 3955, + 4033, 0, 3953, + 4031, 0, 3951, + 4027, 815, 3947, + 4023, 1625, 3943, + 4015, 1965, 3937, + 4007, 2207, 3929, + 3995, 2407, 3919, + 3979, 2583, 3905, + 3957, 2747, 3883, + 3925, 2901, 3855, + 3879, 3049, 3813, + 3809, 3193, 3751, + 3693, 3333, 3651, + 3471, 3471, 3471, + 2627, 3607, 2991, + 0, 3743, 0, + 0, 3877, 0, + 0, 4011, 0, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4059, + 4095, 0, 4057, + 4095, 0, 4057, + 4095, 0, 4057, + 4095, 0, 4055, + 4095, 0, 4053, + 4095, 0, 4053, + 4095, 0, 4049, + 4095, 0, 4047, + 4095, 0, 4041, + 4095, 1285, 4035, + 4095, 2034, 4027, + 4095, 2367, 4015, + 4095, 2607, 3999, + 4077, 2805, 3977, + 4043, 2981, 3945, + 3995, 3145, 3899, + 3923, 3297, 3831, + 3801, 3445, 3717, + 3565, 3589, 3499, + 2425, 3729, 2725, + 0, 3867, 0, + 0, 4003, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1597, 4095, + 4095, 2309, 4095, + 4095, 2637, 4095, + 4095, 2875, 4079, + 4095, 3071, 4045, + 4095, 3247, 3995, + 4041, 3409, 3919, + 3915, 3563, 3791, + 3665, 3711, 3537, + 1791, 3853, 0, + 0, 3993, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2215, 4095, + 4095, 2673, 4095, + 4095, 2951, 4095, + 4095, 3169, 4095, + 4095, 3357, 4095, + 4095, 3525, 4015, + 4033, 3683, 3877, + 3773, 3835, 3581, + 0, 3979, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2051, 4095, + 4095, 2717, 4095, + 4095, 3039, 4095, + 4095, 3275, 4095, + 4095, 3471, 4095, + 4095, 3645, 4095, + 4095, 3807, 3969, + 3885, 3961, 3633, + 3089, 2641, 3503, + 3089, 2641, 3503, + 3089, 2641, 3503, + 3089, 2643, 3503, + 3087, 2643, 3503, + 3087, 2645, 3503, + 3085, 2645, 3501, + 3083, 2649, 3501, + 3081, 2651, 3501, + 3077, 2655, 3499, + 3071, 2659, 3497, + 3065, 2667, 3495, + 3057, 2675, 3493, + 3043, 2687, 3489, + 3027, 2703, 3485, + 3003, 2721, 3479, + 2969, 2747, 3469, + 2919, 2777, 3457, + 2843, 2815, 3439, + 2715, 2863, 3415, + 2453, 2919, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2871, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3089, 2641, 3503, + 3089, 2641, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3085, 2645, 3503, + 3083, 2647, 3501, + 3081, 2651, 3501, + 3077, 2655, 3499, + 3073, 2659, 3499, + 3065, 2667, 3497, + 3057, 2675, 3493, + 3045, 2687, 3489, + 3027, 2701, 3485, + 3003, 2721, 3479, + 2969, 2745, 3469, + 2919, 2777, 3457, + 2843, 2815, 3439, + 2715, 2863, 3417, + 2455, 2919, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2871, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3089, 2641, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3087, 2645, 3503, + 3085, 2647, 3501, + 3081, 2651, 3501, + 3077, 2655, 3499, + 3073, 2659, 3499, + 3067, 2667, 3497, + 3057, 2675, 3493, + 3045, 2687, 3489, + 3027, 2701, 3485, + 3005, 2721, 3479, + 2971, 2745, 3469, + 2921, 2777, 3457, + 2843, 2815, 3441, + 2717, 2863, 3417, + 2459, 2917, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2871, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3089, 2643, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3085, 2647, 3501, + 3083, 2651, 3501, + 3079, 2655, 3499, + 3073, 2659, 3499, + 3067, 2667, 3497, + 3059, 2675, 3493, + 3045, 2687, 3491, + 3029, 2701, 3485, + 3005, 2721, 3479, + 2971, 2745, 3469, + 2921, 2777, 3457, + 2845, 2815, 3441, + 2719, 2863, 3417, + 2461, 2917, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3129, + 0, 3235, 2873, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3093, 2641, 3505, + 3093, 2641, 3505, + 3091, 2641, 3503, + 3091, 2641, 3503, + 3091, 2643, 3503, + 3089, 2643, 3503, + 3087, 2645, 3503, + 3085, 2647, 3503, + 3083, 2651, 3501, + 3079, 2655, 3501, + 3075, 2659, 3499, + 3069, 2667, 3497, + 3059, 2675, 3495, + 3047, 2687, 3491, + 3031, 2701, 3485, + 3007, 2721, 3479, + 2973, 2745, 3469, + 2923, 2777, 3457, + 2847, 2815, 3441, + 2721, 2861, 3417, + 2465, 2917, 3383, + 0, 2983, 3333, + 0, 3059, 3257, + 0, 3143, 3131, + 0, 3235, 2873, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3095, 2639, 3505, + 3093, 2641, 3505, + 3093, 2641, 3505, + 3093, 2641, 3505, + 3091, 2643, 3503, + 3091, 2643, 3503, + 3089, 2645, 3503, + 3087, 2647, 3503, + 3085, 2651, 3501, + 3081, 2655, 3501, + 3077, 2659, 3499, + 3069, 2667, 3497, + 3061, 2675, 3495, + 3049, 2687, 3491, + 3031, 2701, 3485, + 3007, 2721, 3479, + 2975, 2745, 3471, + 2925, 2777, 3459, + 2849, 2815, 3441, + 2723, 2861, 3417, + 2471, 2917, 3383, + 108, 2983, 3335, + 0, 3059, 3257, + 0, 3143, 3131, + 0, 3235, 2875, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3097, 2639, 3505, + 3095, 2641, 3505, + 3095, 2641, 3505, + 3095, 2641, 3505, + 3093, 2643, 3505, + 3093, 2643, 3505, + 3091, 2645, 3503, + 3089, 2647, 3503, + 3087, 2651, 3503, + 3083, 2653, 3501, + 3079, 2659, 3499, + 3071, 2665, 3497, + 3063, 2675, 3495, + 3051, 2687, 3491, + 3033, 2701, 3487, + 3011, 2721, 3479, + 2977, 2745, 3471, + 2927, 2777, 3459, + 2853, 2815, 3441, + 2727, 2861, 3417, + 2479, 2917, 3385, + 729, 2983, 3335, + 0, 3057, 3259, + 0, 3143, 3133, + 0, 3235, 2877, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3099, 2639, 3505, + 3099, 2639, 3505, + 3097, 2641, 3505, + 3097, 2641, 3505, + 3097, 2641, 3505, + 3095, 2643, 3505, + 3093, 2645, 3505, + 3091, 2647, 3503, + 3089, 2649, 3503, + 3085, 2653, 3501, + 3081, 2659, 3501, + 3075, 2665, 3499, + 3065, 2675, 3495, + 3053, 2685, 3493, + 3037, 2701, 3487, + 3013, 2721, 3481, + 2979, 2745, 3471, + 2931, 2777, 3459, + 2857, 2815, 3443, + 2733, 2861, 3419, + 2487, 2917, 3385, + 1043, 2983, 3335, + 0, 3057, 3261, + 0, 3141, 3133, + 0, 3235, 2881, + 0, 3335, 0, + 0, 3441, 0, + 0, 3553, 0, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3101, 2639, 3507, + 3101, 2639, 3507, + 3101, 2639, 3507, + 3101, 2641, 3507, + 3099, 2641, 3507, + 3099, 2643, 3505, + 3097, 2645, 3505, + 3095, 2647, 3505, + 3093, 2649, 3503, + 3089, 2653, 3503, + 3085, 2659, 3501, + 3077, 2665, 3499, + 3069, 2673, 3497, + 3057, 2685, 3493, + 3041, 2701, 3489, + 3017, 2721, 3481, + 2985, 2745, 3473, + 2937, 2775, 3461, + 2863, 2815, 3443, + 2741, 2861, 3419, + 2501, 2917, 3387, + 1276, 2983, 3337, + 0, 3057, 3261, + 0, 3141, 3135, + 0, 3235, 2883, + 0, 3335, 699, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3107, 2639, 3507, + 3105, 2639, 3507, + 3105, 2639, 3507, + 3105, 2639, 3507, + 3103, 2641, 3507, + 3103, 2641, 3507, + 3101, 2643, 3507, + 3099, 2645, 3505, + 3097, 2649, 3505, + 3093, 2653, 3503, + 3089, 2657, 3503, + 3083, 2665, 3501, + 3073, 2673, 3497, + 3061, 2685, 3495, + 3045, 2701, 3489, + 3023, 2719, 3483, + 2989, 2745, 3473, + 2943, 2775, 3461, + 2869, 2813, 3445, + 2751, 2861, 3421, + 2517, 2917, 3387, + 1471, 2983, 3339, + 0, 3057, 3263, + 0, 3141, 3139, + 0, 3235, 2889, + 0, 3335, 1073, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3111, 2637, 3509, + 3111, 2637, 3509, + 3111, 2639, 3509, + 3111, 2639, 3509, + 3109, 2639, 3509, + 3109, 2641, 3509, + 3107, 2643, 3509, + 3105, 2645, 3507, + 3103, 2647, 3507, + 3099, 2651, 3505, + 3095, 2657, 3505, + 3089, 2663, 3503, + 3079, 2673, 3499, + 3069, 2685, 3495, + 3051, 2699, 3491, + 3029, 2719, 3485, + 2997, 2743, 3475, + 2951, 2775, 3463, + 2879, 2813, 3447, + 2763, 2861, 3423, + 2537, 2917, 3389, + 1645, 2981, 3341, + 0, 3057, 3267, + 0, 3141, 3143, + 0, 3235, 2895, + 0, 3335, 1327, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3119, 2637, 3511, + 3119, 2637, 3511, + 3119, 2637, 3511, + 3119, 2637, 3511, + 3117, 2639, 3511, + 3117, 2641, 3511, + 3115, 2641, 3511, + 3113, 2643, 3509, + 3111, 2647, 3509, + 3107, 2651, 3507, + 3103, 2655, 3507, + 3097, 2663, 3505, + 3087, 2671, 3501, + 3077, 2683, 3499, + 3061, 2699, 3493, + 3039, 2717, 3487, + 3007, 2743, 3477, + 2961, 2773, 3465, + 2893, 2813, 3449, + 2779, 2859, 3425, + 2563, 2915, 3393, + 1806, 2981, 3345, + 0, 3057, 3271, + 0, 3141, 3147, + 0, 3233, 2903, + 0, 3335, 1533, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4039, 0, + 3129, 2635, 3515, + 3129, 2635, 3515, + 3129, 2635, 3515, + 3129, 2637, 3515, + 3127, 2637, 3513, + 3127, 2639, 3513, + 3125, 2641, 3513, + 3123, 2643, 3513, + 3121, 2645, 3511, + 3117, 2649, 3511, + 3113, 2655, 3509, + 3107, 2661, 3507, + 3099, 2671, 3505, + 3087, 2681, 3501, + 3071, 2697, 3497, + 3051, 2717, 3489, + 3019, 2741, 3481, + 2975, 2773, 3469, + 2909, 2811, 3453, + 2799, 2859, 3429, + 2597, 2915, 3397, + 1958, 2981, 3349, + 0, 3057, 3275, + 0, 3141, 3153, + 0, 3233, 2913, + 0, 3333, 1714, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4039, 0, + 3143, 2633, 3519, + 3143, 2633, 3519, + 3141, 2633, 3519, + 3141, 2635, 3517, + 3141, 2635, 3517, + 3139, 2637, 3517, + 3139, 2639, 3517, + 3137, 2641, 3517, + 3133, 2643, 3515, + 3131, 2647, 3515, + 3127, 2653, 3513, + 3121, 2659, 3511, + 3113, 2669, 3509, + 3101, 2681, 3505, + 3087, 2695, 3501, + 3065, 2715, 3493, + 3037, 2741, 3485, + 2993, 2771, 3473, + 2929, 2811, 3457, + 2827, 2857, 3433, + 2637, 2913, 3401, + 2105, 2979, 3353, + 0, 3055, 3281, + 0, 3139, 3161, + 0, 3233, 2927, + 0, 3333, 1879, + 0, 3441, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3159, 2631, 3523, + 3159, 2631, 3523, + 3159, 2631, 3523, + 3159, 2631, 3523, + 3157, 2633, 3523, + 3157, 2635, 3523, + 3155, 2635, 3521, + 3153, 2637, 3521, + 3151, 2641, 3521, + 3149, 2645, 3519, + 3143, 2651, 3517, + 3139, 2657, 3517, + 3131, 2665, 3513, + 3121, 2677, 3511, + 3105, 2693, 3505, + 3085, 2713, 3499, + 3057, 2737, 3491, + 3017, 2769, 3479, + 2955, 2809, 3463, + 2859, 2855, 3439, + 2687, 2913, 3407, + 2249, 2979, 3361, + 0, 3055, 3289, + 0, 3139, 3173, + 0, 3233, 2945, + 0, 3333, 2034, + 0, 3439, 0, + 0, 3553, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3181, 2627, 3529, + 3181, 2627, 3529, + 3181, 2627, 3529, + 3179, 2629, 3529, + 3179, 2629, 3529, + 3179, 2631, 3529, + 3177, 2633, 3529, + 3175, 2635, 3527, + 3173, 2637, 3527, + 3171, 2641, 3527, + 3167, 2647, 3525, + 3161, 2653, 3523, + 3153, 2663, 3521, + 3143, 2675, 3517, + 3129, 2689, 3513, + 3111, 2709, 3505, + 3085, 2735, 3497, + 3047, 2767, 3485, + 2989, 2807, 3469, + 2901, 2853, 3447, + 2745, 2911, 3417, + 2389, 2977, 3371, + 0, 3053, 3301, + 0, 3137, 3187, + 0, 3231, 2969, + 0, 3333, 2183, + 0, 3439, 0, + 0, 3551, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3209, 2621, 3539, + 3207, 2623, 3539, + 3207, 2623, 3539, + 3207, 2623, 3539, + 3207, 2625, 3537, + 3205, 2625, 3537, + 3205, 2627, 3537, + 3203, 2629, 3537, + 3201, 2633, 3535, + 3199, 2637, 3535, + 3195, 2643, 3533, + 3189, 2649, 3531, + 3183, 2659, 3529, + 3173, 2671, 3525, + 3161, 2685, 3521, + 3143, 2705, 3515, + 3117, 2731, 3507, + 3083, 2763, 3495, + 3031, 2803, 3479, + 2949, 2851, 3459, + 2813, 2909, 3427, + 2527, 2975, 3383, + 0, 3051, 3315, + 0, 3137, 3205, + 0, 3229, 2997, + 0, 3331, 2327, + 0, 3439, 0, + 0, 3551, 0, + 0, 3669, 0, + 0, 3789, 0, + 0, 3913, 0, + 0, 4037, 0, + 3243, 2615, 3549, + 3243, 2615, 3549, + 3241, 2617, 3549, + 3241, 2617, 3549, + 3241, 2617, 3549, + 3239, 2619, 3549, + 3239, 2621, 3549, + 3237, 2623, 3547, + 3235, 2627, 3547, + 3233, 2631, 3547, + 3229, 2635, 3545, + 3225, 2643, 3543, + 3219, 2653, 3541, + 3209, 2665, 3537, + 3199, 2681, 3533, + 3181, 2701, 3527, + 3159, 2727, 3519, + 3127, 2759, 3507, + 3079, 2799, 3493, + 3009, 2847, 3471, + 2891, 2905, 3441, + 2663, 2971, 3399, + 1725, 3049, 3333, + 0, 3135, 3229, + 0, 3229, 3035, + 0, 3329, 2467, + 0, 3437, 0, + 0, 3551, 0, + 0, 3667, 0, + 0, 3789, 0, + 0, 3911, 0, + 0, 4037, 0, + 3285, 2607, 3565, + 3285, 2607, 3565, + 3283, 2607, 3565, + 3283, 2609, 3565, + 3283, 2609, 3565, + 3283, 2611, 3563, + 3281, 2613, 3563, + 3279, 2615, 3563, + 3279, 2617, 3563, + 3275, 2621, 3561, + 3273, 2627, 3559, + 3269, 2635, 3559, + 3263, 2645, 3555, + 3255, 2657, 3553, + 3245, 2673, 3549, + 3229, 2693, 3543, + 3209, 2719, 3535, + 3181, 2753, 3525, + 3139, 2793, 3509, + 3077, 2841, 3489, + 2977, 2899, 3461, + 2797, 2967, 3419, + 2323, 3045, 3357, + 0, 3131, 3257, + 0, 3225, 3079, + 0, 3327, 2607, + 0, 3435, 0, + 0, 3549, 0, + 0, 3667, 0, + 0, 3787, 0, + 0, 3911, 0, + 0, 4037, 0, + 3335, 2595, 3583, + 3335, 2595, 3583, + 3335, 2595, 3583, + 3335, 2597, 3583, + 3333, 2597, 3583, + 3333, 2599, 3583, + 3333, 2601, 3583, + 3331, 2603, 3581, + 3329, 2605, 3581, + 3327, 2611, 3581, + 3325, 2615, 3579, + 3321, 2623, 3577, + 3315, 2633, 3575, + 3309, 2645, 3573, + 3299, 2661, 3567, + 3287, 2683, 3563, + 3269, 2709, 3555, + 3243, 2743, 3545, + 3207, 2785, 3531, + 3155, 2835, 3511, + 3073, 2893, 3485, + 2933, 2963, 3445, + 2633, 3041, 3387, + 0, 3127, 3295, + 0, 3223, 3131, + 0, 3325, 2743, + 0, 3433, 0, + 0, 3547, 0, + 0, 3665, 0, + 0, 3787, 0, + 0, 3911, 0, + 0, 4037, 0, + 3395, 2577, 3607, + 3395, 2577, 3607, + 3395, 2579, 3607, + 3395, 2579, 3607, + 3393, 2581, 3607, + 3393, 2581, 3607, + 3393, 2583, 3607, + 3391, 2587, 3607, + 3391, 2589, 3605, + 3389, 2593, 3605, + 3385, 2599, 3603, + 3383, 2607, 3601, + 3379, 2617, 3599, + 3373, 2631, 3597, + 3363, 2647, 3593, + 3353, 2669, 3587, + 3337, 2697, 3581, + 3315, 2731, 3571, + 3285, 2773, 3559, + 3241, 2825, 3539, + 3175, 2885, 3515, + 3067, 2955, 3477, + 2863, 3035, 3423, + 2235, 3123, 3339, + 0, 3219, 3195, + 0, 3323, 2879, + 0, 3431, 0, + 0, 3545, 0, + 0, 3665, 0, + 0, 3785, 0, + 0, 3909, 0, + 0, 4035, 0, + 3465, 2555, 3639, + 3465, 2555, 3639, + 3465, 2555, 3639, + 3465, 2557, 3639, + 3463, 2557, 3637, + 3463, 2559, 3637, + 3463, 2561, 3637, + 3461, 2563, 3637, + 3461, 2567, 3637, + 3459, 2571, 3635, + 3457, 2577, 3635, + 3455, 2585, 3633, + 3451, 2597, 3631, + 3445, 2609, 3629, + 3439, 2627, 3625, + 3429, 2651, 3619, + 3415, 2679, 3613, + 3397, 2715, 3605, + 3373, 2759, 3591, + 3335, 2811, 3575, + 3283, 2873, 3551, + 3199, 2945, 3517, + 3057, 3025, 3469, + 2753, 3115, 3393, + 0, 3213, 3267, + 0, 3317, 3013, + 0, 3427, 479, + 0, 3543, 0, + 0, 3661, 0, + 0, 3783, 0, + 0, 3909, 0, + 0, 4035, 0, + 3543, 2521, 3677, + 3543, 2521, 3677, + 3543, 2521, 3677, + 3543, 2523, 3675, + 3543, 2525, 3675, + 3543, 2525, 3675, + 3541, 2527, 3675, + 3541, 2531, 3675, + 3541, 2535, 3675, + 3539, 2539, 3673, + 3537, 2545, 3673, + 3535, 2555, 3671, + 3531, 2565, 3669, + 3527, 2581, 3667, + 3521, 2599, 3663, + 3513, 2623, 3659, + 3503, 2653, 3653, + 3487, 2691, 3645, + 3467, 2737, 3633, + 3439, 2793, 3619, + 3395, 2857, 3597, + 3333, 2931, 3567, + 3231, 3015, 3523, + 3047, 3107, 3455, + 2543, 3205, 3349, + 0, 3311, 3147, + 0, 3423, 2533, + 0, 3539, 0, + 0, 3659, 0, + 0, 3781, 0, + 0, 3907, 0, + 0, 4033, 0, + 3631, 2471, 3723, + 3631, 2473, 3723, + 3631, 2473, 3723, + 3631, 2475, 3723, + 3631, 2475, 3721, + 3631, 2477, 3721, + 3631, 2479, 3721, + 3629, 2483, 3721, + 3629, 2487, 3721, + 3627, 2493, 3719, + 3627, 2499, 3719, + 3625, 2509, 3717, + 3621, 2521, 3717, + 3619, 2537, 3713, + 3613, 2559, 3711, + 3607, 2585, 3707, + 3599, 2617, 3701, + 3587, 2659, 3695, + 3569, 2707, 3685, + 3547, 2767, 3671, + 3513, 2835, 3651, + 3465, 2911, 3625, + 3393, 2999, 3585, + 3271, 3093, 3529, + 3031, 3195, 3439, + 1838, 3303, 3281, + 0, 3417, 2915, + 0, 3535, 0, + 0, 3655, 0, + 0, 3779, 0, + 0, 3905, 0, + 0, 4031, 0, + 3727, 2397, 3777, + 3727, 2397, 3777, + 3727, 2399, 3777, + 3727, 2399, 3777, + 3727, 2401, 3777, + 3727, 2403, 3777, + 3727, 2407, 3777, + 3725, 2411, 3777, + 3725, 2415, 3775, + 3725, 2421, 3775, + 3723, 2429, 3775, + 3721, 2441, 3773, + 3719, 2455, 3773, + 3717, 2475, 3771, + 3713, 2497, 3767, + 3707, 2527, 3763, + 3701, 2565, 3759, + 3691, 2611, 3753, + 3679, 2665, 3743, + 3659, 2729, 3731, + 3635, 2803, 3715, + 3599, 2885, 3691, + 3545, 2977, 3659, + 3461, 3075, 3611, + 3319, 3181, 3537, + 3009, 3293, 3415, + 0, 3409, 3173, + 0, 3527, 1904, + 0, 3651, 0, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 3831, 2273, 3843, + 3831, 2273, 3843, + 3831, 2275, 3843, + 3831, 2277, 3843, + 3831, 2279, 3841, + 3831, 2281, 3841, + 3829, 2285, 3841, + 3829, 2289, 3841, + 3829, 2297, 3841, + 3829, 2305, 3841, + 3827, 2315, 3839, + 3827, 2329, 3839, + 3825, 2349, 3837, + 3823, 2371, 3835, + 3819, 2401, 3833, + 3815, 2437, 3831, + 3809, 2483, 3827, + 3801, 2537, 3821, + 3791, 2601, 3813, + 3777, 2673, 3803, + 3759, 2755, 3789, + 3731, 2847, 3769, + 3691, 2945, 3741, + 3633, 3051, 3701, + 3539, 3161, 3641, + 3375, 3277, 3547, + 2979, 3397, 3381, + 0, 3519, 2969, + 0, 3643, 0, + 0, 3769, 0, + 0, 3897, 0, + 0, 4027, 0, + 3939, 2026, 3917, + 3939, 2027, 3917, + 3939, 2029, 3917, + 3939, 2032, 3917, + 3939, 2035, 3917, + 3939, 2040, 3917, + 3939, 2046, 3915, + 3939, 2055, 3915, + 3939, 2065, 3915, + 3937, 2079, 3915, + 3937, 2097, 3915, + 3937, 2119, 3913, + 3935, 2149, 3913, + 3933, 2185, 3911, + 3931, 2229, 3909, + 3927, 2281, 3907, + 3923, 2343, 3903, + 3917, 2415, 3899, + 3909, 2497, 3891, + 3899, 2587, 3883, + 3883, 2683, 3871, + 3863, 2789, 3855, + 3833, 2899, 3833, + 3791, 3015, 3799, + 3729, 3133, 3753, + 3627, 3255, 3681, + 3441, 3379, 3561, + 2935, 3507, 3331, + 0, 3633, 2333, + 0, 3763, 0, + 0, 3893, 0, + 0, 4023, 0, + 4055, 463, 3999, + 4055, 508, 3999, + 4053, 561, 3999, + 4053, 623, 3999, + 4053, 696, 3999, + 4053, 777, 3999, + 4053, 867, 3999, + 4053, 965, 3999, + 4053, 1070, 3999, + 4053, 1181, 3999, + 4051, 1296, 3999, + 4051, 1415, 3997, + 4051, 1537, 3997, + 4049, 1662, 3995, + 4047, 1788, 3993, + 4045, 1916, 3991, + 4041, 2045, 3989, + 4037, 2175, 3985, + 4031, 2305, 3979, + 4023, 2435, 3973, + 4011, 2567, 3963, + 3995, 2697, 3949, + 3973, 2829, 3931, + 3943, 2961, 3905, + 3899, 3093, 3867, + 3831, 3225, 3813, + 3723, 3357, 3727, + 3517, 3489, 3579, + 2867, 3621, 3253, + 0, 3753, 0, + 0, 3885, 0, + 0, 4017, 0, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4091, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4089, + 4095, 0, 4087, + 4095, 0, 4085, + 4095, 0, 4083, + 4095, 947, 4079, + 4095, 1757, 4075, + 4095, 2097, 4069, + 4095, 2339, 4061, + 4095, 2539, 4051, + 4095, 2717, 4037, + 4089, 2879, 4015, + 4057, 3033, 3987, + 4011, 3181, 3945, + 3941, 3325, 3883, + 3825, 3465, 3783, + 3603, 3603, 3603, + 2759, 3739, 3123, + 0, 3875, 0, + 0, 4009, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1417, 4095, + 4095, 2167, 4095, + 4095, 2499, 4095, + 4095, 2739, 4095, + 4095, 2937, 4095, + 4095, 3115, 4077, + 4095, 3277, 4033, + 4055, 3431, 3963, + 3933, 3577, 3849, + 3697, 3721, 3631, + 2557, 3861, 2857, + 0, 3999, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1729, 4095, + 4095, 2441, 4095, + 4095, 2769, 4095, + 4095, 3007, 4095, + 4095, 3203, 4095, + 4095, 3379, 4095, + 4095, 3541, 4051, + 4047, 3695, 3923, + 3797, 3843, 3669, + 1924, 3985, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 2347, 4095, + 4095, 2805, 4095, + 4095, 3085, 4095, + 4095, 3301, 4095, + 4095, 3489, 4095, + 4095, 3657, 4095, + 4095, 3815, 4009, + 3905, 3967, 3713, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2775, 3635, + 3219, 2775, 3635, + 3219, 2777, 3635, + 3217, 2779, 3635, + 3215, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3203, 2793, 3629, + 3197, 2799, 3627, + 3187, 2807, 3625, + 3175, 2819, 3621, + 3159, 2835, 3617, + 3135, 2853, 3611, + 3101, 2879, 3601, + 3051, 2909, 3589, + 2973, 2947, 3571, + 2845, 2995, 3547, + 2585, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3387, + 0, 3275, 3261, + 0, 3367, 3003, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2773, 3635, + 3221, 2773, 3635, + 3221, 2775, 3635, + 3219, 2775, 3635, + 3219, 2777, 3635, + 3217, 2777, 3635, + 3215, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3203, 2791, 3631, + 3197, 2799, 3629, + 3189, 2807, 3625, + 3175, 2819, 3621, + 3159, 2835, 3617, + 3135, 2853, 3611, + 3101, 2879, 3601, + 3051, 2909, 3589, + 2975, 2947, 3571, + 2847, 2995, 3549, + 2587, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3003, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2773, 3635, + 3221, 2775, 3635, + 3221, 2775, 3635, + 3219, 2777, 3635, + 3217, 2777, 3635, + 3215, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3205, 2791, 3631, + 3197, 2799, 3629, + 3189, 2807, 3625, + 3177, 2819, 3621, + 3159, 2835, 3617, + 3135, 2853, 3611, + 3101, 2879, 3601, + 3051, 2909, 3589, + 2975, 2947, 3573, + 2847, 2995, 3549, + 2587, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3003, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2775, 3635, + 3221, 2775, 3635, + 3219, 2777, 3635, + 3219, 2777, 3635, + 3217, 2781, 3633, + 3213, 2783, 3633, + 3209, 2787, 3631, + 3205, 2791, 3631, + 3199, 2799, 3629, + 3189, 2807, 3625, + 3177, 2819, 3623, + 3161, 2835, 3617, + 3137, 2853, 3611, + 3103, 2879, 3601, + 3053, 2909, 3589, + 2977, 2947, 3573, + 2849, 2995, 3549, + 2591, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3005, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3225, 2773, 3637, + 3223, 2773, 3637, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3223, 2773, 3635, + 3221, 2775, 3635, + 3221, 2777, 3635, + 3219, 2777, 3635, + 3217, 2779, 3633, + 3215, 2783, 3633, + 3211, 2787, 3633, + 3205, 2791, 3631, + 3199, 2799, 3629, + 3191, 2807, 3625, + 3177, 2819, 3623, + 3161, 2833, 3617, + 3137, 2853, 3611, + 3103, 2877, 3601, + 3053, 2909, 3589, + 2977, 2947, 3573, + 2851, 2995, 3549, + 2593, 3051, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3261, + 0, 3367, 3005, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3225, 2771, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3223, 2773, 3635, + 3223, 2775, 3635, + 3221, 2775, 3635, + 3221, 2777, 3635, + 3219, 2779, 3635, + 3215, 2783, 3633, + 3211, 2787, 3633, + 3207, 2791, 3631, + 3201, 2799, 3629, + 3191, 2807, 3627, + 3179, 2819, 3623, + 3163, 2833, 3617, + 3139, 2853, 3611, + 3105, 2877, 3603, + 3055, 2909, 3589, + 2979, 2947, 3573, + 2853, 2995, 3549, + 2597, 3049, 3515, + 0, 3115, 3465, + 0, 3191, 3389, + 0, 3275, 3263, + 0, 3367, 3007, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3227, 2771, 3637, + 3227, 2773, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3225, 2773, 3637, + 3225, 2775, 3637, + 3223, 2775, 3635, + 3221, 2777, 3635, + 3219, 2779, 3635, + 3217, 2783, 3633, + 3213, 2787, 3633, + 3209, 2791, 3631, + 3201, 2799, 3629, + 3193, 2807, 3627, + 3181, 2819, 3623, + 3163, 2833, 3619, + 3141, 2853, 3611, + 3107, 2877, 3603, + 3057, 2909, 3591, + 2981, 2947, 3573, + 2855, 2993, 3549, + 2603, 3049, 3515, + 240, 3115, 3467, + 0, 3191, 3391, + 0, 3275, 3263, + 0, 3367, 3007, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3229, 2771, 3637, + 3229, 2771, 3637, + 3227, 2773, 3637, + 3227, 2773, 3637, + 3227, 2773, 3637, + 3225, 2775, 3637, + 3225, 2775, 3637, + 3223, 2777, 3635, + 3221, 2779, 3635, + 3219, 2783, 3635, + 3215, 2787, 3633, + 3211, 2791, 3631, + 3203, 2797, 3629, + 3195, 2807, 3627, + 3183, 2819, 3623, + 3165, 2833, 3619, + 3143, 2853, 3611, + 3109, 2877, 3603, + 3059, 2909, 3591, + 2985, 2947, 3573, + 2861, 2993, 3551, + 2611, 3049, 3517, + 861, 3115, 3467, + 0, 3191, 3391, + 0, 3275, 3265, + 0, 3367, 3009, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3231, 2771, 3639, + 3231, 2771, 3637, + 3231, 2771, 3637, + 3229, 2773, 3637, + 3229, 2773, 3637, + 3229, 2773, 3637, + 3227, 2775, 3637, + 3225, 2777, 3637, + 3223, 2779, 3635, + 3221, 2781, 3635, + 3217, 2785, 3633, + 3213, 2791, 3633, + 3207, 2797, 3631, + 3197, 2807, 3627, + 3185, 2819, 3625, + 3169, 2833, 3619, + 3145, 2853, 3613, + 3113, 2877, 3603, + 3063, 2909, 3591, + 2989, 2947, 3575, + 2865, 2993, 3551, + 2619, 3049, 3517, + 1175, 3115, 3467, + 0, 3189, 3393, + 0, 3275, 3267, + 0, 3367, 3013, + 0, 3467, 0, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3235, 2771, 3639, + 3233, 2771, 3639, + 3233, 2771, 3639, + 3233, 2771, 3639, + 3233, 2773, 3639, + 3231, 2773, 3639, + 3231, 2775, 3637, + 3229, 2777, 3637, + 3227, 2779, 3637, + 3225, 2781, 3635, + 3221, 2785, 3635, + 3217, 2791, 3633, + 3209, 2797, 3631, + 3201, 2807, 3629, + 3189, 2817, 3625, + 3173, 2833, 3621, + 3149, 2853, 3613, + 3117, 2877, 3605, + 3069, 2907, 3593, + 2995, 2947, 3575, + 2873, 2993, 3553, + 2633, 3049, 3519, + 1408, 3115, 3469, + 0, 3189, 3393, + 0, 3273, 3269, + 0, 3367, 3015, + 0, 3467, 831, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3239, 2771, 3641, + 3239, 2771, 3641, + 3237, 2771, 3639, + 3237, 2771, 3639, + 3237, 2771, 3639, + 3237, 2773, 3639, + 3235, 2775, 3639, + 3233, 2775, 3639, + 3231, 2777, 3637, + 3229, 2781, 3637, + 3225, 2785, 3637, + 3221, 2789, 3635, + 3215, 2797, 3633, + 3205, 2805, 3629, + 3193, 2817, 3627, + 3177, 2833, 3621, + 3155, 2851, 3615, + 3123, 2877, 3607, + 3075, 2907, 3593, + 3001, 2947, 3577, + 2883, 2993, 3553, + 2649, 3049, 3519, + 1603, 3115, 3471, + 0, 3189, 3395, + 0, 3273, 3271, + 0, 3367, 3021, + 0, 3467, 1205, + 0, 3573, 0, + 0, 3685, 0, + 0, 3803, 0, + 0, 3923, 0, + 0, 4045, 0, + 3245, 2769, 3641, + 3245, 2769, 3641, + 3243, 2769, 3641, + 3243, 2771, 3641, + 3243, 2771, 3641, + 3241, 2773, 3641, + 3241, 2773, 3641, + 3239, 2775, 3641, + 3237, 2777, 3639, + 3235, 2781, 3639, + 3231, 2783, 3637, + 3227, 2789, 3637, + 3221, 2795, 3635, + 3211, 2805, 3631, + 3201, 2817, 3627, + 3185, 2831, 3623, + 3161, 2851, 3617, + 3129, 2875, 3607, + 3083, 2907, 3595, + 3011, 2945, 3579, + 2895, 2993, 3555, + 2669, 3049, 3523, + 1777, 3115, 3473, + 0, 3189, 3399, + 0, 3273, 3275, + 0, 3367, 3027, + 0, 3467, 1459, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3923, 0, + 0, 4045, 0, + 3251, 2769, 3643, + 3251, 2769, 3643, + 3251, 2769, 3643, + 3251, 2769, 3643, + 3251, 2771, 3643, + 3249, 2771, 3643, + 3249, 2773, 3643, + 3247, 2773, 3643, + 3245, 2777, 3641, + 3243, 2779, 3641, + 3239, 2783, 3639, + 3235, 2789, 3639, + 3229, 2795, 3637, + 3221, 2803, 3633, + 3209, 2815, 3631, + 3193, 2831, 3625, + 3171, 2851, 3619, + 3139, 2875, 3611, + 3093, 2907, 3597, + 3025, 2945, 3581, + 2911, 2991, 3557, + 2695, 3047, 3525, + 1938, 3113, 3477, + 0, 3189, 3403, + 0, 3273, 3279, + 0, 3365, 3035, + 0, 3467, 1665, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3923, 0, + 0, 4045, 0, + 3261, 2767, 3647, + 3261, 2767, 3647, + 3261, 2767, 3647, + 3261, 2767, 3647, + 3261, 2769, 3647, + 3259, 2769, 3645, + 3259, 2771, 3645, + 3257, 2773, 3645, + 3255, 2775, 3645, + 3253, 2777, 3643, + 3249, 2781, 3643, + 3245, 2787, 3641, + 3239, 2793, 3639, + 3231, 2803, 3637, + 3219, 2815, 3633, + 3205, 2829, 3629, + 3183, 2849, 3621, + 3151, 2873, 3613, + 3107, 2905, 3601, + 3041, 2943, 3585, + 2933, 2991, 3561, + 2729, 3047, 3529, + 2091, 3113, 3481, + 0, 3189, 3407, + 0, 3273, 3285, + 0, 3365, 3045, + 0, 3465, 1846, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3275, 2765, 3651, + 3275, 2765, 3651, + 3275, 2765, 3651, + 3273, 2765, 3651, + 3273, 2767, 3649, + 3273, 2767, 3649, + 3271, 2769, 3649, + 3271, 2771, 3649, + 3269, 2773, 3649, + 3267, 2775, 3647, + 3263, 2779, 3647, + 3259, 2785, 3645, + 3253, 2791, 3643, + 3245, 2801, 3641, + 3233, 2813, 3637, + 3219, 2827, 3633, + 3197, 2847, 3625, + 3169, 2873, 3617, + 3125, 2903, 3605, + 3061, 2943, 3589, + 2959, 2989, 3565, + 2769, 3047, 3533, + 2237, 3111, 3485, + 0, 3187, 3413, + 0, 3271, 3293, + 0, 3365, 3059, + 0, 3465, 2011, + 0, 3573, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3291, 2763, 3655, + 3289, 2765, 3655, + 3289, 2767, 3655, + 3287, 2767, 3653, + 3285, 2771, 3653, + 3283, 2773, 3653, + 3281, 2777, 3651, + 3275, 2783, 3651, + 3271, 2789, 3649, + 3263, 2799, 3645, + 3253, 2809, 3643, + 3237, 2825, 3637, + 3217, 2845, 3631, + 3189, 2871, 3623, + 3149, 2901, 3611, + 3089, 2941, 3595, + 2991, 2989, 3571, + 2819, 3045, 3539, + 2381, 3111, 3493, + 0, 3187, 3421, + 0, 3271, 3305, + 0, 3365, 3077, + 0, 3465, 2167, + 0, 3571, 0, + 0, 3685, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3313, 2759, 3663, + 3313, 2759, 3661, + 3313, 2759, 3661, + 3313, 2759, 3661, + 3311, 2761, 3661, + 3311, 2761, 3661, + 3311, 2763, 3661, + 3309, 2765, 3661, + 3307, 2767, 3659, + 3305, 2769, 3659, + 3303, 2773, 3659, + 3299, 2779, 3657, + 3293, 2785, 3655, + 3285, 2795, 3653, + 3275, 2807, 3649, + 3261, 2823, 3645, + 3243, 2841, 3639, + 3217, 2867, 3629, + 3179, 2899, 3619, + 3121, 2939, 3603, + 3033, 2985, 3579, + 2877, 3043, 3549, + 2521, 3109, 3503, + 0, 3185, 3433, + 0, 3269, 3319, + 0, 3363, 3101, + 0, 3465, 2315, + 0, 3571, 0, + 0, 3683, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3341, 2753, 3671, + 3341, 2753, 3671, + 3341, 2755, 3671, + 3339, 2755, 3671, + 3339, 2755, 3671, + 3339, 2757, 3671, + 3337, 2757, 3669, + 3337, 2759, 3669, + 3335, 2761, 3669, + 3333, 2765, 3667, + 3331, 2769, 3667, + 3327, 2775, 3665, + 3321, 2781, 3663, + 3315, 2791, 3661, + 3305, 2803, 3657, + 3293, 2817, 3653, + 3275, 2837, 3647, + 3249, 2863, 3639, + 3215, 2895, 3627, + 3163, 2935, 3613, + 3081, 2983, 3591, + 2945, 3041, 3559, + 2659, 3107, 3515, + 0, 3183, 3447, + 0, 3269, 3337, + 0, 3363, 3131, + 0, 3463, 2459, + 0, 3571, 0, + 0, 3683, 0, + 0, 3801, 0, + 0, 3921, 0, + 0, 4045, 0, + 3375, 2747, 3683, + 3375, 2747, 3683, + 3375, 2747, 3681, + 3373, 2749, 3681, + 3373, 2749, 3681, + 3373, 2751, 3681, + 3373, 2751, 3681, + 3371, 2753, 3681, + 3369, 2755, 3681, + 3367, 2759, 3679, + 3365, 2763, 3679, + 3361, 2767, 3677, + 3357, 2775, 3675, + 3351, 2785, 3673, + 3341, 2797, 3669, + 3331, 2813, 3665, + 3313, 2833, 3659, + 3291, 2859, 3651, + 3259, 2891, 3641, + 3213, 2931, 3625, + 3141, 2979, 3603, + 3023, 3037, 3573, + 2795, 3103, 3531, + 1857, 3181, 3465, + 0, 3267, 3361, + 0, 3361, 3167, + 0, 3461, 2601, + 0, 3569, 0, + 0, 3683, 0, + 0, 3799, 0, + 0, 3921, 0, + 0, 4043, 0, + 3417, 2739, 3697, + 3417, 2739, 3697, + 3417, 2739, 3697, + 3415, 2739, 3697, + 3415, 2741, 3697, + 3415, 2741, 3697, + 3415, 2743, 3695, + 3413, 2745, 3695, + 3413, 2747, 3695, + 3411, 2749, 3695, + 3407, 2753, 3693, + 3405, 2759, 3691, + 3401, 2767, 3691, + 3395, 2777, 3687, + 3387, 2789, 3685, + 3377, 2805, 3681, + 3361, 2825, 3675, + 3341, 2851, 3667, + 3313, 2885, 3657, + 3271, 2925, 3641, + 3209, 2973, 3621, + 3109, 3033, 3593, + 2929, 3099, 3551, + 2455, 3177, 3489, + 0, 3263, 3389, + 0, 3359, 3211, + 0, 3459, 2739, + 0, 3569, 0, + 0, 3681, 0, + 0, 3799, 0, + 0, 3919, 0, + 0, 4043, 0, + 3467, 2727, 3715, + 3467, 2727, 3715, + 3467, 2727, 3715, + 3467, 2727, 3715, + 3467, 2729, 3715, + 3465, 2729, 3715, + 3465, 2731, 3715, + 3465, 2733, 3715, + 3463, 2735, 3713, + 3461, 2737, 3713, + 3459, 2743, 3713, + 3457, 2747, 3711, + 3453, 2755, 3709, + 3447, 2765, 3707, + 3441, 2777, 3705, + 3431, 2795, 3701, + 3419, 2815, 3695, + 3401, 2841, 3687, + 3375, 2875, 3677, + 3339, 2917, 3663, + 3287, 2967, 3643, + 3205, 3025, 3617, + 3065, 3095, 3577, + 2765, 3173, 3519, + 0, 3259, 3427, + 0, 3355, 3265, + 0, 3457, 2875, + 0, 3567, 0, + 0, 3679, 0, + 0, 3797, 0, + 0, 3919, 0, + 0, 4043, 0, + 3527, 2709, 3741, + 3527, 2709, 3741, + 3527, 2711, 3739, + 3527, 2711, 3739, + 3527, 2711, 3739, + 3527, 2713, 3739, + 3525, 2713, 3739, + 3525, 2715, 3739, + 3523, 2719, 3739, + 3523, 2721, 3737, + 3521, 2727, 3737, + 3519, 2731, 3735, + 3515, 2739, 3735, + 3511, 2749, 3731, + 3505, 2763, 3729, + 3497, 2779, 3725, + 3485, 2801, 3719, + 3469, 2829, 3713, + 3447, 2863, 3703, + 3417, 2905, 3691, + 3373, 2957, 3671, + 3307, 3017, 3647, + 3199, 3087, 3609, + 2997, 3167, 3555, + 2367, 3255, 3471, + 0, 3351, 3327, + 0, 3455, 3011, + 0, 3563, 0, + 0, 3677, 0, + 0, 3797, 0, + 0, 3917, 0, + 0, 4041, 0, + 3597, 2685, 3771, + 3597, 2687, 3771, + 3597, 2687, 3771, + 3597, 2687, 3771, + 3597, 2689, 3771, + 3595, 2689, 3771, + 3595, 2691, 3769, + 3595, 2693, 3769, + 3593, 2695, 3769, + 3593, 2699, 3769, + 3591, 2703, 3767, + 3589, 2709, 3767, + 3587, 2717, 3765, + 3583, 2729, 3763, + 3577, 2741, 3761, + 3571, 2759, 3757, + 3561, 2783, 3751, + 3547, 2811, 3745, + 3529, 2847, 3737, + 3505, 2891, 3725, + 3469, 2943, 3707, + 3415, 3005, 3683, + 3331, 3077, 3649, + 3191, 3157, 3601, + 2885, 3247, 3525, + 0, 3345, 3399, + 0, 3449, 3145, + 0, 3559, 611, + 0, 3675, 0, + 0, 3795, 0, + 0, 3917, 0, + 0, 4041, 0, + 3675, 2653, 3809, + 3675, 2653, 3809, + 3675, 2653, 3809, + 3675, 2655, 3809, + 3675, 2655, 3809, + 3675, 2657, 3807, + 3675, 2657, 3807, + 3675, 2659, 3807, + 3673, 2663, 3807, + 3673, 2667, 3807, + 3671, 2671, 3805, + 3669, 2677, 3805, + 3667, 2687, 3803, + 3663, 2697, 3801, + 3659, 2713, 3799, + 3653, 2731, 3795, + 3645, 2755, 3791, + 3635, 2785, 3785, + 3621, 2823, 3777, + 3599, 2869, 3765, + 3571, 2925, 3751, + 3529, 2989, 3729, + 3465, 3063, 3699, + 3363, 3147, 3655, + 3179, 3239, 3589, + 2675, 3337, 3481, + 0, 3443, 3281, + 0, 3555, 2665, + 0, 3671, 0, + 0, 3791, 0, + 0, 3913, 0, + 0, 4039, 0, + 3763, 2603, 3855, + 3763, 2605, 3855, + 3763, 2605, 3855, + 3763, 2605, 3855, + 3763, 2607, 3855, + 3763, 2607, 3855, + 3763, 2609, 3853, + 3763, 2611, 3853, + 3761, 2615, 3853, + 3761, 2619, 3853, + 3759, 2625, 3853, + 3759, 2631, 3851, + 3757, 2641, 3849, + 3753, 2653, 3849, + 3751, 2671, 3847, + 3745, 2691, 3843, + 3739, 2717, 3839, + 3731, 2751, 3833, + 3719, 2791, 3827, + 3701, 2839, 3817, + 3679, 2899, 3803, + 3645, 2967, 3783, + 3597, 3043, 3757, + 3525, 3131, 3719, + 3403, 3225, 3661, + 3163, 3327, 3571, + 1971, 3435, 3413, + 0, 3549, 3047, + 0, 3667, 0, + 0, 3787, 0, + 0, 3911, 0, + 0, 4037, 0, + 3859, 2529, 3909, + 3859, 2529, 3909, + 3859, 2531, 3909, + 3859, 2531, 3909, + 3859, 2533, 3909, + 3859, 2533, 3909, + 3859, 2535, 3909, + 3859, 2539, 3909, + 3859, 2543, 3909, + 3857, 2547, 3909, + 3857, 2553, 3907, + 3855, 2561, 3907, + 3853, 2573, 3905, + 3851, 2587, 3905, + 3849, 2607, 3903, + 3845, 2629, 3899, + 3839, 2659, 3897, + 3833, 2697, 3891, + 3823, 2743, 3885, + 3811, 2797, 3875, + 3793, 2861, 3863, + 3767, 2935, 3847, + 3731, 3017, 3825, + 3677, 3109, 3791, + 3593, 3207, 3743, + 3451, 3313, 3669, + 3141, 3425, 3547, + 0, 3541, 3305, + 0, 3659, 2036, + 0, 3783, 0, + 0, 3907, 0, + 0, 4033, 0, + 3963, 2405, 3975, + 3963, 2405, 3975, + 3963, 2407, 3975, + 3963, 2407, 3975, + 3963, 2409, 3975, + 3963, 2411, 3975, + 3963, 2413, 3973, + 3961, 2417, 3973, + 3961, 2423, 3973, + 3961, 2429, 3973, + 3961, 2437, 3973, + 3959, 2447, 3971, + 3959, 2461, 3971, + 3957, 2481, 3969, + 3955, 2503, 3967, + 3951, 2533, 3965, + 3947, 2571, 3963, + 3941, 2615, 3959, + 3935, 2669, 3953, + 3923, 2733, 3945, + 3909, 2805, 3935, + 3891, 2887, 3921, + 3863, 2979, 3901, + 3823, 3077, 3873, + 3765, 3183, 3833, + 3671, 3293, 3773, + 3507, 3409, 3679, + 3111, 3529, 3513, + 0, 3651, 3101, + 0, 3775, 0, + 0, 3901, 0, + 0, 4029, 0, + 4073, 2157, 4049, + 4073, 2157, 4049, + 4071, 2159, 4049, + 4071, 2161, 4049, + 4071, 2163, 4049, + 4071, 2167, 4049, + 4071, 2173, 4049, + 4071, 2179, 4049, + 4071, 2187, 4047, + 4071, 2197, 4047, + 4071, 2211, 4047, + 4069, 2229, 4047, + 4069, 2251, 4045, + 4067, 2281, 4045, + 4065, 2317, 4043, + 4063, 2361, 4041, + 4059, 2413, 4039, + 4055, 2475, 4035, + 4049, 2547, 4031, + 4041, 2629, 4025, + 4031, 2719, 4015, + 4015, 2815, 4003, + 3995, 2921, 3987, + 3967, 3031, 3965, + 3923, 3147, 3931, + 3861, 3265, 3885, + 3759, 3387, 3813, + 3573, 3511, 3693, + 3067, 3639, 3463, + 0, 3765, 2465, + 0, 3895, 0, + 0, 4025, 0, + 4095, 559, 4095, + 4095, 596, 4095, + 4095, 640, 4095, + 4095, 693, 4095, + 4095, 756, 4095, + 4095, 828, 4095, + 4095, 909, 4095, + 4095, 999, 4095, + 4095, 1097, 4095, + 4095, 1202, 4095, + 4095, 1313, 4095, + 4095, 1428, 4095, + 4095, 1547, 4095, + 4095, 1669, 4095, + 4095, 1794, 4095, + 4095, 1920, 4095, + 4095, 2049, 4095, + 4095, 2177, 4095, + 4095, 2307, 4095, + 4095, 2437, 4095, + 4095, 2567, 4095, + 4095, 2699, 4095, + 4095, 2831, 4081, + 4095, 2961, 4063, + 4075, 3093, 4037, + 4031, 3225, 4001, + 3963, 3357, 3945, + 3855, 3489, 3859, + 3649, 3621, 3711, + 3001, 3753, 3385, + 0, 3885, 0, + 0, 4017, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1079, 4095, + 4095, 1889, 4095, + 4095, 2229, 4095, + 4095, 2471, 4095, + 4095, 2671, 4095, + 4095, 2849, 4095, + 4095, 3011, 4095, + 4095, 3165, 4095, + 4095, 3313, 4077, + 4073, 3457, 4015, + 3957, 3597, 3915, + 3735, 3735, 3735, + 2891, 3871, 3255, + 0, 4007, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1549, 4095, + 4095, 2299, 4095, + 4095, 2631, 4095, + 4095, 2871, 4095, + 4095, 3069, 4095, + 4095, 3247, 4095, + 4095, 3409, 4095, + 4095, 3563, 4095, + 4067, 3709, 3981, + 3829, 3853, 3765, + 2689, 3993, 2989, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1862, 4095, + 4095, 2573, 4095, + 4095, 2901, 4095, + 4095, 3139, 4095, + 4095, 3337, 4095, + 4095, 3511, 4095, + 4095, 3673, 4095, + 4095, 3827, 4057, + 3929, 3975, 3801, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3351, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3335, 2925, 3763, + 3329, 2931, 3761, + 3319, 2939, 3757, + 3307, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3105, 3079, 3703, + 2977, 3127, 3681, + 2715, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3351, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3335, 2925, 3763, + 3329, 2931, 3761, + 3321, 2939, 3757, + 3307, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3105, 3079, 3703, + 2977, 3127, 3681, + 2717, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3351, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3337, 2925, 3763, + 3329, 2931, 3761, + 3321, 2939, 3757, + 3309, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3107, 3079, 3705, + 2979, 3127, 3681, + 2719, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2905, 3767, + 3353, 2907, 3767, + 3353, 2907, 3767, + 3351, 2909, 3767, + 3349, 2911, 3767, + 3347, 2913, 3765, + 3345, 2915, 3765, + 3341, 2919, 3763, + 3337, 2925, 3763, + 3329, 2931, 3761, + 3321, 2939, 3757, + 3309, 2951, 3753, + 3291, 2967, 3749, + 3267, 2985, 3743, + 3233, 3011, 3733, + 3183, 3041, 3721, + 3107, 3079, 3705, + 2979, 3127, 3681, + 2721, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3135, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3355, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3767, + 3355, 2905, 3767, + 3353, 2907, 3767, + 3353, 2907, 3767, + 3351, 2909, 3767, + 3351, 2909, 3767, + 3349, 2913, 3765, + 3345, 2915, 3765, + 3343, 2919, 3763, + 3337, 2923, 3763, + 3331, 2931, 3761, + 3321, 2939, 3757, + 3309, 2951, 3755, + 3293, 2967, 3749, + 3269, 2985, 3743, + 3235, 3011, 3733, + 3185, 3041, 3721, + 3109, 3079, 3705, + 2981, 3127, 3681, + 2723, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3137, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3357, 2903, 3769, + 3357, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3769, + 3355, 2905, 3767, + 3355, 2907, 3767, + 3353, 2907, 3767, + 3353, 2909, 3767, + 3351, 2909, 3767, + 3349, 2913, 3767, + 3347, 2915, 3765, + 3343, 2919, 3765, + 3337, 2923, 3763, + 3331, 2931, 3761, + 3323, 2939, 3757, + 3311, 2951, 3755, + 3293, 2967, 3749, + 3269, 2985, 3743, + 3235, 3011, 3733, + 3185, 3041, 3721, + 3109, 3079, 3705, + 2983, 3127, 3681, + 2725, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3393, + 0, 3499, 3137, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3357, 2903, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3355, 2905, 3769, + 3355, 2907, 3767, + 3353, 2909, 3767, + 3353, 2909, 3767, + 3351, 2911, 3767, + 3347, 2915, 3765, + 3343, 2919, 3765, + 3339, 2923, 3763, + 3333, 2931, 3761, + 3323, 2939, 3759, + 3311, 2951, 3755, + 3295, 2965, 3749, + 3271, 2985, 3743, + 3237, 3009, 3735, + 3187, 3041, 3721, + 3111, 3079, 3705, + 2985, 3127, 3681, + 2729, 3183, 3647, + 0, 3247, 3597, + 0, 3323, 3521, + 0, 3407, 3395, + 0, 3499, 3139, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3359, 2903, 3769, + 3359, 2903, 3769, + 3359, 2905, 3769, + 3359, 2905, 3769, + 3357, 2905, 3769, + 3357, 2905, 3769, + 3357, 2907, 3769, + 3355, 2907, 3767, + 3353, 2909, 3767, + 3351, 2911, 3767, + 3349, 2915, 3765, + 3345, 2919, 3765, + 3341, 2923, 3763, + 3333, 2931, 3761, + 3325, 2939, 3759, + 3313, 2951, 3755, + 3295, 2965, 3751, + 3273, 2985, 3743, + 3239, 3009, 3735, + 3189, 3041, 3723, + 3113, 3079, 3705, + 2987, 3127, 3681, + 2735, 3181, 3647, + 372, 3247, 3599, + 0, 3323, 3523, + 0, 3407, 3395, + 0, 3499, 3139, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3361, 2903, 3769, + 3361, 2903, 3769, + 3361, 2903, 3769, + 3359, 2905, 3769, + 3359, 2905, 3769, + 3359, 2905, 3769, + 3359, 2907, 3769, + 3357, 2907, 3769, + 3355, 2909, 3767, + 3353, 2911, 3767, + 3351, 2915, 3767, + 3347, 2919, 3765, + 3343, 2923, 3763, + 3335, 2931, 3761, + 3327, 2939, 3759, + 3315, 2951, 3755, + 3297, 2965, 3751, + 3275, 2985, 3745, + 3241, 3009, 3735, + 3193, 3041, 3723, + 3117, 3079, 3705, + 2993, 3125, 3683, + 2743, 3181, 3649, + 994, 3247, 3599, + 0, 3323, 3523, + 0, 3407, 3397, + 0, 3499, 3141, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3363, 2903, 3771, + 3363, 2903, 3771, + 3363, 2903, 3771, + 3363, 2903, 3769, + 3361, 2905, 3769, + 3361, 2905, 3769, + 3361, 2907, 3769, + 3359, 2907, 3769, + 3357, 2909, 3769, + 3357, 2911, 3767, + 3353, 2915, 3767, + 3349, 2917, 3767, + 3345, 2923, 3765, + 3339, 2929, 3763, + 3329, 2939, 3759, + 3317, 2951, 3757, + 3301, 2965, 3751, + 3277, 2985, 3745, + 3245, 3009, 3735, + 3195, 3041, 3723, + 3121, 3079, 3707, + 2997, 3125, 3683, + 2753, 3181, 3649, + 1308, 3247, 3599, + 0, 3323, 3525, + 0, 3407, 3399, + 0, 3499, 3145, + 0, 3599, 0, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3367, 2903, 3771, + 3367, 2903, 3771, + 3367, 2903, 3771, + 3365, 2903, 3771, + 3365, 2903, 3771, + 3365, 2905, 3771, + 3363, 2905, 3771, + 3363, 2907, 3769, + 3361, 2909, 3769, + 3359, 2911, 3769, + 3357, 2913, 3769, + 3353, 2917, 3767, + 3349, 2923, 3765, + 3341, 2929, 3763, + 3333, 2939, 3761, + 3321, 2949, 3757, + 3305, 2965, 3753, + 3281, 2985, 3745, + 3249, 3009, 3737, + 3201, 3041, 3725, + 3127, 3079, 3707, + 3005, 3125, 3685, + 2765, 3181, 3651, + 1540, 3247, 3601, + 0, 3321, 3525, + 0, 3407, 3401, + 0, 3499, 3147, + 0, 3599, 963, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3371, 2901, 3773, + 3371, 2903, 3773, + 3371, 2903, 3773, + 3371, 2903, 3773, + 3369, 2903, 3771, + 3369, 2905, 3771, + 3369, 2905, 3771, + 3367, 2907, 3771, + 3365, 2907, 3771, + 3363, 2911, 3771, + 3361, 2913, 3769, + 3357, 2917, 3769, + 3353, 2921, 3767, + 3347, 2929, 3765, + 3337, 2937, 3763, + 3325, 2949, 3759, + 3309, 2965, 3753, + 3287, 2983, 3747, + 3255, 3009, 3739, + 3207, 3039, 3725, + 3135, 3079, 3709, + 3015, 3125, 3685, + 2781, 3181, 3653, + 1735, 3247, 3603, + 0, 3321, 3527, + 0, 3405, 3403, + 0, 3499, 3153, + 0, 3599, 1337, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3377, 2901, 3773, + 3377, 2901, 3773, + 3377, 2901, 3773, + 3375, 2903, 3773, + 3375, 2903, 3773, + 3375, 2903, 3773, + 3375, 2905, 3773, + 3373, 2905, 3773, + 3371, 2907, 3773, + 3369, 2909, 3771, + 3367, 2913, 3771, + 3363, 2917, 3769, + 3359, 2921, 3769, + 3353, 2927, 3767, + 3345, 2937, 3763, + 3333, 2949, 3761, + 3317, 2963, 3755, + 3293, 2983, 3749, + 3261, 3007, 3739, + 3215, 3039, 3727, + 3143, 3077, 3711, + 3027, 3125, 3687, + 2801, 3181, 3655, + 1909, 3247, 3605, + 0, 3321, 3531, + 0, 3405, 3407, + 0, 3499, 3159, + 0, 3599, 1591, + 0, 3705, 0, + 0, 3817, 0, + 0, 3935, 0, + 0, 4055, 0, + 3385, 2901, 3777, + 3385, 2901, 3775, + 3383, 2901, 3775, + 3383, 2901, 3775, + 3383, 2901, 3775, + 3383, 2903, 3775, + 3381, 2903, 3775, + 3381, 2905, 3775, + 3379, 2905, 3775, + 3377, 2909, 3773, + 3375, 2911, 3773, + 3371, 2915, 3771, + 3367, 2921, 3771, + 3361, 2927, 3769, + 3353, 2935, 3765, + 3341, 2947, 3763, + 3325, 2963, 3757, + 3303, 2983, 3751, + 3271, 3007, 3743, + 3225, 3039, 3731, + 3157, 3077, 3713, + 3043, 3123, 3691, + 2827, 3181, 3657, + 2071, 3245, 3609, + 0, 3321, 3535, + 0, 3405, 3411, + 0, 3499, 3167, + 0, 3599, 1797, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4055, 0, + 3395, 2899, 3779, + 3393, 2899, 3779, + 3393, 2899, 3779, + 3393, 2899, 3779, + 3393, 2901, 3779, + 3393, 2901, 3779, + 3391, 2901, 3779, + 3391, 2903, 3777, + 3389, 2905, 3777, + 3387, 2907, 3777, + 3385, 2909, 3775, + 3381, 2913, 3775, + 3377, 2919, 3773, + 3371, 2925, 3771, + 3363, 2935, 3769, + 3351, 2947, 3765, + 3337, 2961, 3761, + 3315, 2981, 3755, + 3285, 3005, 3745, + 3239, 3037, 3733, + 3173, 3075, 3717, + 3065, 3123, 3693, + 2861, 3179, 3661, + 2223, 3245, 3613, + 0, 3321, 3539, + 0, 3405, 3417, + 0, 3497, 3177, + 0, 3599, 1978, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4055, 0, + 3407, 2897, 3783, + 3407, 2897, 3783, + 3407, 2897, 3783, + 3407, 2897, 3783, + 3407, 2899, 3783, + 3405, 2899, 3783, + 3405, 2899, 3781, + 3403, 2901, 3781, + 3403, 2903, 3781, + 3401, 2905, 3781, + 3399, 2907, 3779, + 3395, 2911, 3779, + 3391, 2917, 3777, + 3385, 2923, 3775, + 3377, 2933, 3773, + 3365, 2945, 3769, + 3351, 2959, 3765, + 3331, 2979, 3757, + 3301, 3005, 3749, + 3257, 3035, 3737, + 3193, 3075, 3721, + 3091, 3121, 3699, + 2901, 3179, 3665, + 2369, 3245, 3617, + 0, 3319, 3545, + 0, 3405, 3425, + 0, 3497, 3191, + 0, 3597, 2143, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4053, 0, + 3423, 2893, 3787, + 3423, 2895, 3787, + 3423, 2895, 3787, + 3423, 2895, 3787, + 3423, 2895, 3787, + 3423, 2897, 3787, + 3421, 2897, 3787, + 3421, 2899, 3787, + 3419, 2899, 3787, + 3417, 2903, 3785, + 3415, 2905, 3785, + 3413, 2909, 3783, + 3409, 2915, 3783, + 3403, 2921, 3781, + 3395, 2931, 3777, + 3385, 2943, 3775, + 3369, 2957, 3769, + 3349, 2977, 3763, + 3321, 3003, 3755, + 3281, 3033, 3743, + 3221, 3073, 3727, + 3123, 3121, 3705, + 2951, 3177, 3671, + 2513, 3243, 3625, + 0, 3319, 3553, + 0, 3403, 3437, + 0, 3497, 3209, + 0, 3597, 2299, + 0, 3705, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4053, 0, + 3445, 2891, 3795, + 3445, 2891, 3795, + 3445, 2891, 3795, + 3445, 2891, 3795, + 3445, 2891, 3793, + 3443, 2893, 3793, + 3443, 2893, 3793, + 3443, 2895, 3793, + 3441, 2897, 3793, + 3439, 2899, 3793, + 3437, 2901, 3791, + 3435, 2905, 3791, + 3431, 2911, 3789, + 3425, 2917, 3787, + 3417, 2927, 3785, + 3407, 2939, 3781, + 3395, 2955, 3777, + 3375, 2975, 3771, + 3349, 2999, 3761, + 3311, 3031, 3751, + 3253, 3071, 3735, + 3165, 3119, 3713, + 3009, 3175, 3681, + 2653, 3241, 3635, + 0, 3317, 3565, + 0, 3403, 3451, + 0, 3495, 3233, + 0, 3597, 2447, + 0, 3703, 0, + 0, 3817, 0, + 0, 3933, 0, + 0, 4053, 0, + 3473, 2885, 3803, + 3473, 2885, 3803, + 3473, 2887, 3803, + 3473, 2887, 3803, + 3471, 2887, 3803, + 3471, 2887, 3803, + 3471, 2889, 3803, + 3469, 2889, 3801, + 3469, 2891, 3801, + 3467, 2893, 3801, + 3465, 2897, 3801, + 3463, 2901, 3799, + 3459, 2907, 3797, + 3453, 2913, 3795, + 3447, 2923, 3793, + 3437, 2935, 3789, + 3425, 2951, 3785, + 3407, 2971, 3779, + 3383, 2995, 3771, + 3347, 3027, 3759, + 3295, 3067, 3745, + 3213, 3115, 3723, + 3077, 3173, 3691, + 2791, 3239, 3647, + 0, 3315, 3579, + 0, 3401, 3469, + 0, 3495, 3263, + 0, 3595, 2591, + 0, 3703, 0, + 0, 3815, 0, + 0, 3933, 0, + 0, 4053, 0, + 3507, 2879, 3815, + 3507, 2879, 3815, + 3507, 2879, 3815, + 3507, 2879, 3815, + 3507, 2881, 3813, + 3505, 2881, 3813, + 3505, 2883, 3813, + 3505, 2883, 3813, + 3503, 2885, 3813, + 3501, 2887, 3813, + 3499, 2891, 3811, + 3497, 2895, 3811, + 3493, 2901, 3809, + 3489, 2907, 3807, + 3483, 2917, 3805, + 3475, 2929, 3801, + 3463, 2945, 3797, + 3447, 2965, 3791, + 3423, 2991, 3783, + 3391, 3023, 3773, + 3345, 3063, 3757, + 3273, 3111, 3735, + 3155, 3169, 3707, + 2927, 3235, 3663, + 1989, 3313, 3597, + 0, 3399, 3493, + 0, 3493, 3299, + 0, 3593, 2733, + 0, 3701, 0, + 0, 3815, 0, + 0, 3931, 0, + 0, 4053, 0, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3549, 2871, 3829, + 3547, 2873, 3829, + 3547, 2873, 3829, + 3547, 2875, 3827, + 3545, 2877, 3827, + 3545, 2879, 3827, + 3543, 2881, 3827, + 3541, 2887, 3825, + 3537, 2891, 3825, + 3533, 2899, 3823, + 3527, 2909, 3819, + 3519, 2921, 3817, + 3509, 2937, 3813, + 3493, 2957, 3807, + 3473, 2983, 3799, + 3445, 3017, 3789, + 3403, 3057, 3773, + 3341, 3105, 3753, + 3241, 3165, 3725, + 3061, 3231, 3683, + 2587, 3309, 3621, + 0, 3395, 3521, + 0, 3491, 3343, + 0, 3593, 2871, + 0, 3701, 0, + 0, 3813, 0, + 0, 3931, 0, + 0, 4051, 0, + 3599, 2857, 3849, + 3599, 2859, 3847, + 3599, 2859, 3847, + 3599, 2859, 3847, + 3599, 2859, 3847, + 3599, 2861, 3847, + 3599, 2861, 3847, + 3597, 2863, 3847, + 3597, 2865, 3847, + 3595, 2867, 3847, + 3593, 2871, 3845, + 3591, 2875, 3845, + 3589, 2879, 3843, + 3585, 2887, 3841, + 3579, 2897, 3839, + 3573, 2909, 3837, + 3563, 2927, 3833, + 3551, 2947, 3827, + 3533, 2975, 3819, + 3507, 3007, 3809, + 3471, 3049, 3795, + 3419, 3099, 3775, + 3337, 3157, 3749, + 3197, 3227, 3709, + 2897, 3305, 3651, + 0, 3391, 3559, + 0, 3487, 3397, + 0, 3589, 3007, + 0, 3699, 0, + 0, 3811, 0, + 0, 3929, 0, + 0, 4051, 0, + 3659, 2841, 3873, + 3659, 2841, 3873, + 3659, 2841, 3873, + 3659, 2843, 3873, + 3659, 2843, 3871, + 3659, 2843, 3871, + 3659, 2845, 3871, + 3657, 2847, 3871, + 3657, 2847, 3871, + 3655, 2851, 3871, + 3655, 2853, 3869, + 3653, 2859, 3869, + 3651, 2865, 3867, + 3647, 2871, 3867, + 3643, 2881, 3865, + 3637, 2895, 3861, + 3629, 2911, 3857, + 3617, 2933, 3853, + 3601, 2961, 3845, + 3579, 2995, 3835, + 3549, 3037, 3823, + 3505, 3089, 3805, + 3439, 3149, 3779, + 3331, 3219, 3741, + 3129, 3299, 3687, + 2499, 3387, 3603, + 0, 3483, 3459, + 0, 3587, 3143, + 0, 3695, 0, + 0, 3809, 0, + 0, 3929, 0, + 0, 4049, 0, + 3729, 2817, 3903, + 3729, 2819, 3903, + 3729, 2819, 3903, + 3729, 2819, 3903, + 3729, 2819, 3903, + 3729, 2821, 3903, + 3727, 2821, 3903, + 3727, 2823, 3901, + 3727, 2825, 3901, + 3725, 2827, 3901, + 3725, 2831, 3901, + 3723, 2835, 3899, + 3721, 2841, 3899, + 3719, 2849, 3897, + 3715, 2861, 3895, + 3709, 2875, 3893, + 3703, 2891, 3889, + 3693, 2915, 3883, + 3679, 2943, 3877, + 3661, 2979, 3869, + 3637, 3023, 3857, + 3601, 3075, 3839, + 3547, 3137, 3815, + 3463, 3209, 3781, + 3323, 3291, 3733, + 3017, 3379, 3657, + 0, 3477, 3531, + 0, 3581, 3279, + 0, 3693, 744, + 0, 3807, 0, + 0, 3927, 0, + 0, 4049, 0, + 3809, 2785, 3941, + 3809, 2785, 3941, + 3807, 2785, 3941, + 3807, 2785, 3941, + 3807, 2787, 3941, + 3807, 2787, 3941, + 3807, 2789, 3941, + 3807, 2789, 3939, + 3807, 2791, 3939, + 3805, 2795, 3939, + 3805, 2799, 3939, + 3803, 2803, 3937, + 3801, 2811, 3937, + 3799, 2819, 3935, + 3795, 2831, 3933, + 3791, 2845, 3931, + 3785, 2863, 3927, + 3777, 2887, 3923, + 3767, 2919, 3917, + 3753, 2955, 3909, + 3731, 3001, 3897, + 3703, 3057, 3883, + 3661, 3121, 3861, + 3597, 3195, 3831, + 3495, 3279, 3787, + 3311, 3371, 3721, + 2807, 3469, 3613, + 0, 3575, 3413, + 0, 3687, 2797, + 0, 3803, 0, + 0, 3923, 0, + 0, 4047, 0, + 3897, 2735, 3987, + 3895, 2735, 3987, + 3895, 2737, 3987, + 3895, 2737, 3987, + 3895, 2737, 3987, + 3895, 2739, 3987, + 3895, 2739, 3987, + 3895, 2741, 3987, + 3895, 2743, 3985, + 3893, 2747, 3985, + 3893, 2751, 3985, + 3891, 2757, 3985, + 3891, 2765, 3983, + 3889, 2773, 3983, + 3885, 2787, 3981, + 3883, 2803, 3979, + 3877, 2823, 3975, + 3871, 2849, 3971, + 3863, 2883, 3965, + 3851, 2923, 3959, + 3833, 2973, 3949, + 3811, 3031, 3935, + 3777, 3099, 3915, + 3729, 3177, 3889, + 3657, 3263, 3851, + 3535, 3357, 3793, + 3295, 3459, 3703, + 2103, 3567, 3545, + 0, 3681, 3179, + 0, 3799, 0, + 0, 3919, 0, + 0, 4043, 0, + 3993, 2661, 4041, + 3991, 2661, 4041, + 3991, 2661, 4041, + 3991, 2663, 4041, + 3991, 2663, 4041, + 3991, 2665, 4041, + 3991, 2665, 4041, + 3991, 2667, 4041, + 3991, 2671, 4041, + 3991, 2675, 4041, + 3989, 2679, 4041, + 3989, 2685, 4039, + 3987, 2695, 4039, + 3985, 2705, 4037, + 3983, 2719, 4037, + 3981, 2739, 4035, + 3977, 2763, 4031, + 3971, 2793, 4029, + 3965, 2829, 4023, + 3955, 2875, 4017, + 3943, 2929, 4009, + 3925, 2993, 3997, + 3899, 3067, 3979, + 3863, 3149, 3957, + 3809, 3241, 3923, + 3725, 3339, 3875, + 3583, 3445, 3801, + 3273, 3557, 3679, + 0, 3673, 3437, + 0, 3791, 2169, + 0, 3915, 0, + 0, 4039, 0, + 4095, 2537, 4095, + 4095, 2537, 4095, + 4095, 2537, 4095, + 4095, 2539, 4095, + 4095, 2539, 4095, + 4095, 2541, 4095, + 4095, 2543, 4095, + 4095, 2545, 4095, + 4095, 2549, 4095, + 4093, 2555, 4095, + 4093, 2561, 4095, + 4093, 2569, 4095, + 4091, 2579, 4095, + 4091, 2595, 4095, + 4089, 2613, 4095, + 4087, 2635, 4095, + 4083, 2665, 4095, + 4079, 2703, 4095, + 4073, 2747, 4091, + 4067, 2801, 4085, + 4055, 2865, 4077, + 4041, 2937, 4067, + 4023, 3019, 4053, + 3995, 3111, 4033, + 3955, 3209, 4005, + 3897, 3315, 3965, + 3803, 3425, 3907, + 3639, 3541, 3811, + 3243, 3661, 3645, + 0, 3783, 3235, + 0, 3907, 0, + 0, 4033, 0, + 4095, 2287, 4095, + 4095, 2289, 4095, + 4095, 2289, 4095, + 4095, 2291, 4095, + 4095, 2293, 4095, + 4095, 2295, 4095, + 4095, 2299, 4095, + 4095, 2305, 4095, + 4095, 2311, 4095, + 4095, 2319, 4095, + 4095, 2329, 4095, + 4095, 2343, 4095, + 4095, 2361, 4095, + 4095, 2383, 4095, + 4095, 2413, 4095, + 4095, 2449, 4095, + 4095, 2493, 4095, + 4095, 2545, 4095, + 4095, 2607, 4095, + 4095, 2679, 4095, + 4095, 2761, 4095, + 4095, 2851, 4095, + 4095, 2949, 4095, + 4095, 3053, 4095, + 4095, 3163, 4095, + 4057, 3279, 4065, + 3993, 3397, 4017, + 3891, 3519, 3945, + 3707, 3643, 3825, + 3199, 3771, 3595, + 0, 3899, 2597, + 0, 4027, 0, + 4095, 662, 4095, + 4095, 691, 4095, + 4095, 728, 4095, + 4095, 772, 4095, + 4095, 825, 4095, + 4095, 888, 4095, + 4095, 960, 4095, + 4095, 1041, 4095, + 4095, 1131, 4095, + 4095, 1229, 4095, + 4095, 1334, 4095, + 4095, 1445, 4095, + 4095, 1560, 4095, + 4095, 1679, 4095, + 4095, 1802, 4095, + 4095, 1926, 4095, + 4095, 2053, 4095, + 4095, 2181, 4095, + 4095, 2309, 4095, + 4095, 2439, 4095, + 4095, 2569, 4095, + 4095, 2699, 4095, + 4095, 2831, 4095, + 4095, 2963, 4095, + 4095, 3093, 4095, + 4095, 3225, 4095, + 4095, 3357, 4095, + 4095, 3489, 4077, + 3987, 3621, 3991, + 3783, 3753, 3843, + 3133, 3885, 3517, + 0, 4017, 0, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1211, 4095, + 4095, 2021, 4095, + 4095, 2361, 4095, + 4095, 2603, 4095, + 4095, 2803, 4095, + 4095, 2981, 4095, + 4095, 3143, 4095, + 4095, 3297, 4095, + 4095, 3445, 4095, + 4095, 3589, 4095, + 4089, 3729, 4047, + 3867, 3867, 3867, + 3023, 4003, 3387, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1681, 4095, + 4095, 2431, 4095, + 4095, 2763, 4095, + 4095, 3003, 4095, + 4095, 3203, 4095, + 4095, 3379, 4095, + 4095, 3541, 4095, + 4095, 3695, 4095, + 4095, 3841, 4095, + 3961, 3985, 3897, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3483, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3475, 3047, 3897, + 3473, 3051, 3895, + 3467, 3057, 3895, + 3461, 3063, 3893, + 3451, 3071, 3889, + 3439, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3237, 3211, 3835, + 3109, 3259, 3813, + 2847, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3483, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3467, 3057, 3895, + 3461, 3063, 3893, + 3451, 3071, 3889, + 3439, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3237, 3211, 3835, + 3109, 3259, 3813, + 2849, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3483, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3467, 3057, 3895, + 3461, 3063, 3893, + 3453, 3071, 3889, + 3439, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3239, 3211, 3837, + 3109, 3259, 3813, + 2849, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3901, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3485, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3469, 3057, 3895, + 3461, 3063, 3893, + 3453, 3071, 3889, + 3441, 3083, 3885, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3239, 3211, 3837, + 3111, 3259, 3813, + 2851, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3899, + 3487, 3037, 3899, + 3485, 3037, 3899, + 3485, 3039, 3899, + 3485, 3039, 3899, + 3483, 3041, 3899, + 3481, 3043, 3899, + 3479, 3045, 3897, + 3477, 3047, 3897, + 3473, 3051, 3895, + 3469, 3057, 3895, + 3463, 3063, 3893, + 3453, 3071, 3889, + 3441, 3083, 3887, + 3423, 3099, 3881, + 3399, 3117, 3875, + 3365, 3143, 3865, + 3315, 3173, 3853, + 3239, 3211, 3837, + 3111, 3259, 3813, + 2853, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3267, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3899, + 3485, 3039, 3899, + 3485, 3039, 3899, + 3483, 3041, 3899, + 3483, 3043, 3899, + 3481, 3045, 3899, + 3477, 3047, 3897, + 3475, 3051, 3897, + 3469, 3057, 3895, + 3463, 3063, 3893, + 3453, 3071, 3889, + 3441, 3083, 3887, + 3425, 3099, 3881, + 3401, 3117, 3875, + 3367, 3143, 3865, + 3317, 3173, 3853, + 3241, 3211, 3837, + 3113, 3259, 3813, + 2855, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3525, + 0, 3631, 3269, + 0, 3731, 0, + 0, 3837, 0, + 0, 3951, 0, + 0, 4067, 0, + 3489, 3035, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3487, 3037, 3901, + 3487, 3037, 3901, + 3487, 3039, 3899, + 3485, 3039, 3899, + 3485, 3041, 3899, + 3483, 3041, 3899, + 3481, 3045, 3899, + 3479, 3047, 3897, + 3475, 3051, 3897, + 3471, 3057, 3895, + 3463, 3063, 3893, + 3455, 3071, 3891, + 3443, 3083, 3887, + 3425, 3099, 3881, + 3401, 3117, 3875, + 3367, 3143, 3867, + 3317, 3173, 3853, + 3241, 3211, 3837, + 3115, 3259, 3813, + 2857, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3527, + 0, 3631, 3269, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3489, 3035, 3901, + 3489, 3035, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3487, 3039, 3901, + 3487, 3039, 3899, + 3485, 3041, 3899, + 3485, 3041, 3899, + 3483, 3045, 3899, + 3479, 3047, 3897, + 3477, 3051, 3897, + 3471, 3055, 3895, + 3465, 3063, 3893, + 3455, 3071, 3891, + 3443, 3083, 3887, + 3427, 3099, 3881, + 3403, 3117, 3875, + 3369, 3143, 3867, + 3319, 3173, 3855, + 3243, 3211, 3837, + 3117, 3259, 3813, + 2861, 3315, 3779, + 0, 3379, 3729, + 0, 3455, 3653, + 0, 3539, 3527, + 0, 3631, 3271, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3491, 3035, 3901, + 3491, 3035, 3901, + 3491, 3035, 3901, + 3491, 3037, 3901, + 3491, 3037, 3901, + 3489, 3037, 3901, + 3489, 3037, 3901, + 3489, 3039, 3901, + 3487, 3041, 3899, + 3485, 3041, 3899, + 3483, 3043, 3899, + 3481, 3047, 3899, + 3477, 3051, 3897, + 3473, 3055, 3895, + 3467, 3063, 3893, + 3457, 3071, 3891, + 3445, 3083, 3887, + 3427, 3097, 3883, + 3405, 3117, 3875, + 3371, 3141, 3867, + 3321, 3173, 3855, + 3245, 3211, 3837, + 3121, 3259, 3813, + 2867, 3315, 3779, + 504, 3379, 3731, + 0, 3455, 3655, + 0, 3539, 3527, + 0, 3631, 3271, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3493, 3035, 3901, + 3493, 3035, 3901, + 3493, 3035, 3901, + 3493, 3037, 3901, + 3493, 3037, 3901, + 3491, 3037, 3901, + 3491, 3037, 3901, + 3491, 3039, 3901, + 3489, 3039, 3901, + 3487, 3041, 3901, + 3485, 3043, 3899, + 3483, 3047, 3899, + 3479, 3051, 3897, + 3475, 3055, 3895, + 3469, 3063, 3893, + 3459, 3071, 3891, + 3447, 3083, 3887, + 3431, 3097, 3883, + 3407, 3117, 3877, + 3373, 3141, 3867, + 3325, 3173, 3855, + 3249, 3211, 3839, + 3125, 3259, 3815, + 2875, 3313, 3781, + 1125, 3379, 3731, + 0, 3455, 3655, + 0, 3539, 3529, + 0, 3631, 3273, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3495, 3035, 3903, + 3495, 3035, 3903, + 3495, 3035, 3903, + 3495, 3035, 3903, + 3495, 3037, 3903, + 3495, 3037, 3901, + 3493, 3037, 3901, + 3493, 3039, 3901, + 3491, 3039, 3901, + 3491, 3041, 3901, + 3489, 3043, 3901, + 3485, 3047, 3899, + 3481, 3051, 3899, + 3477, 3055, 3897, + 3471, 3061, 3895, + 3461, 3071, 3893, + 3449, 3083, 3889, + 3433, 3097, 3883, + 3409, 3117, 3877, + 3377, 3141, 3869, + 3327, 3173, 3855, + 3253, 3211, 3839, + 3129, 3257, 3815, + 2885, 3313, 3781, + 1440, 3379, 3733, + 0, 3455, 3657, + 0, 3539, 3531, + 0, 3631, 3277, + 0, 3731, 0, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3499, 3035, 3903, + 3499, 3035, 3903, + 3499, 3035, 3903, + 3499, 3035, 3903, + 3497, 3035, 3903, + 3497, 3037, 3903, + 3497, 3037, 3903, + 3495, 3037, 3903, + 3495, 3039, 3903, + 3493, 3041, 3901, + 3491, 3043, 3901, + 3489, 3045, 3901, + 3485, 3049, 3899, + 3481, 3055, 3897, + 3475, 3061, 3895, + 3465, 3071, 3893, + 3453, 3081, 3889, + 3437, 3097, 3885, + 3413, 3117, 3877, + 3381, 3141, 3869, + 3333, 3173, 3857, + 3259, 3211, 3839, + 3137, 3257, 3817, + 2897, 3313, 3783, + 1672, 3379, 3733, + 0, 3455, 3657, + 0, 3539, 3533, + 0, 3631, 3281, + 0, 3731, 1095, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3503, 3033, 3905, + 3503, 3035, 3905, + 3503, 3035, 3905, + 3503, 3035, 3905, + 3503, 3035, 3905, + 3501, 3035, 3905, + 3501, 3037, 3903, + 3501, 3037, 3903, + 3499, 3039, 3903, + 3497, 3041, 3903, + 3495, 3043, 3903, + 3493, 3045, 3901, + 3489, 3049, 3901, + 3485, 3055, 3899, + 3479, 3061, 3897, + 3471, 3069, 3895, + 3459, 3081, 3891, + 3441, 3097, 3885, + 3419, 3115, 3879, + 3387, 3141, 3871, + 3339, 3171, 3859, + 3267, 3211, 3841, + 3147, 3257, 3817, + 2913, 3313, 3785, + 1867, 3379, 3735, + 0, 3453, 3661, + 0, 3537, 3535, + 0, 3631, 3285, + 0, 3731, 1469, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3509, 3033, 3907, + 3509, 3033, 3907, + 3509, 3033, 3905, + 3509, 3033, 3905, + 3507, 3035, 3905, + 3507, 3035, 3905, + 3507, 3035, 3905, + 3507, 3037, 3905, + 3505, 3037, 3905, + 3503, 3039, 3905, + 3501, 3041, 3903, + 3499, 3045, 3903, + 3495, 3049, 3901, + 3491, 3053, 3901, + 3485, 3061, 3899, + 3477, 3069, 3895, + 3465, 3081, 3893, + 3449, 3095, 3887, + 3425, 3115, 3881, + 3393, 3139, 3873, + 3347, 3171, 3859, + 3275, 3209, 3843, + 3159, 3257, 3819, + 2933, 3313, 3787, + 2041, 3379, 3737, + 0, 3453, 3663, + 0, 3537, 3539, + 0, 3631, 3291, + 0, 3731, 1724, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3517, 3033, 3909, + 3517, 3033, 3909, + 3517, 3033, 3909, + 3515, 3033, 3909, + 3515, 3033, 3907, + 3515, 3033, 3907, + 3515, 3035, 3907, + 3513, 3035, 3907, + 3513, 3037, 3907, + 3511, 3039, 3907, + 3509, 3041, 3905, + 3507, 3043, 3905, + 3503, 3047, 3905, + 3499, 3053, 3903, + 3493, 3059, 3901, + 3485, 3067, 3897, + 3473, 3079, 3895, + 3457, 3095, 3889, + 3435, 3115, 3883, + 3403, 3139, 3875, + 3357, 3171, 3863, + 3289, 3209, 3845, + 3175, 3257, 3823, + 2959, 3313, 3789, + 2203, 3377, 3741, + 0, 3453, 3667, + 0, 3537, 3543, + 0, 3631, 3299, + 0, 3731, 1929, + 0, 3837, 0, + 0, 3949, 0, + 0, 4067, 0, + 3527, 3031, 3911, + 3527, 3031, 3911, + 3527, 3031, 3911, + 3525, 3031, 3911, + 3525, 3031, 3911, + 3525, 3033, 3911, + 3525, 3033, 3911, + 3523, 3033, 3911, + 3523, 3035, 3909, + 3521, 3037, 3909, + 3519, 3039, 3909, + 3517, 3041, 3907, + 3513, 3045, 3907, + 3509, 3051, 3905, + 3503, 3057, 3903, + 3495, 3067, 3901, + 3483, 3079, 3897, + 3469, 3093, 3893, + 3447, 3113, 3887, + 3417, 3137, 3877, + 3371, 3169, 3865, + 3305, 3207, 3849, + 3197, 3255, 3825, + 2993, 3311, 3793, + 2355, 3377, 3745, + 0, 3453, 3671, + 0, 3537, 3549, + 0, 3629, 3311, + 0, 3731, 2109, + 0, 3837, 0, + 0, 3949, 0, + 0, 4065, 0, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3029, 3915, + 3539, 3031, 3915, + 3537, 3031, 3915, + 3537, 3031, 3913, + 3535, 3033, 3913, + 3535, 3035, 3913, + 3533, 3037, 3913, + 3531, 3039, 3911, + 3527, 3043, 3911, + 3523, 3049, 3909, + 3517, 3055, 3907, + 3509, 3065, 3905, + 3499, 3077, 3901, + 3483, 3091, 3897, + 3463, 3111, 3891, + 3433, 3137, 3881, + 3389, 3167, 3869, + 3325, 3207, 3853, + 3223, 3253, 3831, + 3033, 3311, 3797, + 2501, 3377, 3751, + 0, 3451, 3677, + 0, 3537, 3559, + 0, 3629, 3325, + 0, 3729, 2275, + 0, 3837, 0, + 0, 3949, 0, + 0, 4065, 0, + 3557, 3025, 3919, + 3557, 3027, 3919, + 3555, 3027, 3919, + 3555, 3027, 3919, + 3555, 3027, 3919, + 3555, 3027, 3919, + 3555, 3029, 3919, + 3553, 3029, 3919, + 3553, 3031, 3919, + 3551, 3033, 3919, + 3549, 3035, 3917, + 3547, 3037, 3917, + 3545, 3041, 3915, + 3541, 3047, 3915, + 3535, 3053, 3913, + 3527, 3063, 3909, + 3517, 3075, 3907, + 3501, 3089, 3901, + 3483, 3109, 3895, + 3453, 3135, 3887, + 3413, 3165, 3875, + 3353, 3205, 3859, + 3255, 3253, 3837, + 3083, 3309, 3805, + 2645, 3375, 3757, + 0, 3451, 3685, + 0, 3535, 3569, + 0, 3629, 3343, + 0, 3729, 2431, + 0, 3837, 0, + 0, 3949, 0, + 0, 4065, 0, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3023, 3927, + 3577, 3025, 3925, + 3575, 3025, 3925, + 3575, 3027, 3925, + 3573, 3029, 3925, + 3571, 3031, 3925, + 3569, 3033, 3923, + 3567, 3037, 3923, + 3563, 3043, 3921, + 3557, 3049, 3919, + 3549, 3059, 3917, + 3539, 3071, 3913, + 3527, 3087, 3909, + 3507, 3107, 3903, + 3481, 3131, 3893, + 3443, 3163, 3883, + 3385, 3203, 3867, + 3297, 3251, 3845, + 3141, 3307, 3813, + 2785, 3373, 3767, + 0, 3449, 3697, + 0, 3535, 3583, + 0, 3627, 3365, + 0, 3729, 2579, + 0, 3835, 0, + 0, 3949, 0, + 0, 4065, 0, + 3605, 3017, 3935, + 3605, 3017, 3935, + 3605, 3017, 3935, + 3605, 3019, 3935, + 3605, 3019, 3935, + 3603, 3019, 3935, + 3603, 3019, 3935, + 3603, 3021, 3935, + 3601, 3023, 3933, + 3601, 3023, 3933, + 3599, 3027, 3933, + 3597, 3029, 3933, + 3595, 3033, 3931, + 3591, 3039, 3929, + 3585, 3045, 3927, + 3579, 3055, 3925, + 3569, 3067, 3923, + 3557, 3083, 3917, + 3539, 3103, 3911, + 3515, 3127, 3903, + 3479, 3159, 3891, + 3427, 3199, 3877, + 3347, 3247, 3855, + 3209, 3305, 3823, + 2923, 3371, 3779, + 0, 3447, 3711, + 0, 3533, 3601, + 0, 3627, 3395, + 0, 3727, 2723, + 0, 3835, 0, + 0, 3947, 0, + 0, 4065, 0, + 3639, 3011, 3947, + 3639, 3011, 3947, + 3639, 3011, 3947, + 3639, 3011, 3947, + 3639, 3013, 3947, + 3639, 3013, 3947, + 3637, 3013, 3945, + 3637, 3015, 3945, + 3637, 3015, 3945, + 3635, 3017, 3945, + 3633, 3019, 3945, + 3631, 3023, 3943, + 3629, 3027, 3943, + 3625, 3033, 3941, + 3621, 3039, 3939, + 3615, 3049, 3937, + 3607, 3061, 3933, + 3595, 3077, 3929, + 3579, 3097, 3923, + 3555, 3123, 3915, + 3523, 3155, 3905, + 3477, 3195, 3889, + 3405, 3243, 3869, + 3287, 3301, 3839, + 3059, 3369, 3795, + 2121, 3445, 3729, + 0, 3531, 3625, + 0, 3625, 3431, + 0, 3727, 2865, + 0, 3833, 0, + 0, 3947, 0, + 0, 4065, 0, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3681, 3003, 3961, + 3679, 3005, 3961, + 3679, 3005, 3961, + 3679, 3007, 3961, + 3677, 3009, 3959, + 3677, 3011, 3959, + 3675, 3015, 3959, + 3673, 3019, 3957, + 3669, 3023, 3957, + 3665, 3031, 3955, + 3659, 3041, 3953, + 3651, 3053, 3949, + 3641, 3069, 3945, + 3625, 3089, 3939, + 3605, 3115, 3931, + 3577, 3149, 3921, + 3535, 3189, 3905, + 3473, 3237, 3885, + 3373, 3297, 3857, + 3195, 3365, 3815, + 2719, 3441, 3753, + 0, 3527, 3655, + 0, 3623, 3475, + 0, 3725, 3003, + 0, 3833, 0, + 0, 3945, 0, + 0, 4063, 0, + 3731, 2989, 3981, + 3731, 2991, 3981, + 3731, 2991, 3981, + 3731, 2991, 3981, + 3731, 2991, 3979, + 3731, 2991, 3979, + 3731, 2993, 3979, + 3731, 2993, 3979, + 3729, 2995, 3979, + 3729, 2997, 3979, + 3727, 2999, 3979, + 3725, 3003, 3977, + 3723, 3007, 3977, + 3721, 3013, 3975, + 3717, 3019, 3973, + 3713, 3029, 3971, + 3705, 3041, 3969, + 3695, 3059, 3965, + 3683, 3079, 3959, + 3665, 3107, 3951, + 3639, 3139, 3941, + 3603, 3181, 3927, + 3551, 3231, 3907, + 3469, 3289, 3881, + 3329, 3359, 3841, + 3029, 3437, 3783, + 0, 3523, 3691, + 0, 3619, 3529, + 0, 3721, 3139, + 0, 3831, 0, + 0, 3945, 0, + 0, 4061, 0, + 3791, 2973, 4005, + 3791, 2973, 4005, + 3791, 2973, 4005, + 3791, 2973, 4005, + 3791, 2975, 4005, + 3791, 2975, 4005, + 3791, 2975, 4003, + 3791, 2977, 4003, + 3789, 2979, 4003, + 3789, 2981, 4003, + 3787, 2983, 4003, + 3787, 2985, 4001, + 3785, 2991, 4001, + 3783, 2997, 3999, + 3779, 3003, 3999, + 3775, 3013, 3997, + 3769, 3027, 3993, + 3761, 3043, 3989, + 3749, 3065, 3985, + 3733, 3093, 3977, + 3713, 3127, 3967, + 3681, 3169, 3955, + 3637, 3221, 3937, + 3571, 3281, 3911, + 3463, 3351, 3873, + 3261, 3431, 3819, + 2631, 3519, 3735, + 0, 3615, 3591, + 0, 3719, 3275, + 0, 3827, 0, + 0, 3943, 0, + 0, 4061, 0, + 3861, 2949, 4035, + 3861, 2949, 4035, + 3861, 2951, 4035, + 3861, 2951, 4035, + 3861, 2951, 4035, + 3861, 2951, 4035, + 3861, 2953, 4035, + 3861, 2953, 4035, + 3859, 2955, 4035, + 3859, 2957, 4033, + 3859, 2959, 4033, + 3857, 2963, 4033, + 3855, 2967, 4031, + 3853, 2973, 4031, + 3851, 2981, 4029, + 3847, 2993, 4027, + 3841, 3007, 4025, + 3835, 3023, 4021, + 3825, 3047, 4017, + 3811, 3075, 4009, + 3793, 3111, 4001, + 3769, 3155, 3989, + 3733, 3207, 3971, + 3679, 3269, 3947, + 3595, 3341, 3915, + 3455, 3423, 3865, + 3149, 3511, 3789, + 0, 3609, 3663, + 0, 3713, 3411, + 0, 3825, 876, + 0, 3939, 0, + 0, 4059, 0, + 3941, 2917, 4073, + 3941, 2917, 4073, + 3941, 2917, 4073, + 3941, 2917, 4073, + 3939, 2917, 4073, + 3939, 2919, 4073, + 3939, 2919, 4073, + 3939, 2921, 4073, + 3939, 2921, 4071, + 3939, 2925, 4071, + 3937, 2927, 4071, + 3937, 2931, 4071, + 3935, 2935, 4069, + 3933, 2943, 4069, + 3931, 2951, 4067, + 3927, 2963, 4065, + 3923, 2977, 4063, + 3917, 2995, 4059, + 3909, 3019, 4055, + 3899, 3051, 4049, + 3885, 3087, 4041, + 3863, 3133, 4031, + 3835, 3189, 4015, + 3793, 3253, 3993, + 3729, 3327, 3963, + 3627, 3411, 3919, + 3443, 3503, 3853, + 2939, 3601, 3745, + 0, 3707, 3545, + 0, 3819, 2929, + 0, 3935, 0, + 0, 4055, 0, + 4029, 2867, 4095, + 4029, 2867, 4095, + 4029, 2867, 4095, + 4029, 2869, 4095, + 4027, 2869, 4095, + 4027, 2869, 4095, + 4027, 2871, 4095, + 4027, 2871, 4095, + 4027, 2873, 4095, + 4027, 2877, 4095, + 4025, 2879, 4095, + 4025, 2883, 4095, + 4025, 2889, 4095, + 4023, 2897, 4095, + 4021, 2905, 4095, + 4019, 2919, 4095, + 4015, 2935, 4095, + 4009, 2955, 4095, + 4003, 2981, 4095, + 3995, 3015, 4095, + 3983, 3055, 4091, + 3965, 3105, 4081, + 3943, 3163, 4067, + 3909, 3231, 4047, + 3861, 3309, 4021, + 3789, 3395, 3983, + 3667, 3489, 3925, + 3427, 3591, 3835, + 2235, 3699, 3677, + 0, 3813, 3313, + 0, 3931, 0, + 0, 4051, 0, + 4095, 2793, 4095, + 4095, 2793, 4095, + 4095, 2793, 4095, + 4095, 2793, 4095, + 4095, 2795, 4095, + 4095, 2795, 4095, + 4095, 2797, 4095, + 4095, 2797, 4095, + 4095, 2799, 4095, + 4095, 2803, 4095, + 4095, 2807, 4095, + 4095, 2811, 4095, + 4095, 2817, 4095, + 4095, 2827, 4095, + 4095, 2837, 4095, + 4095, 2851, 4095, + 4095, 2871, 4095, + 4095, 2895, 4095, + 4095, 2925, 4095, + 4095, 2961, 4095, + 4087, 3007, 4095, + 4075, 3061, 4095, + 4057, 3125, 4095, + 4031, 3199, 4095, + 3995, 3281, 4089, + 3941, 3373, 4055, + 3857, 3471, 4007, + 3715, 3577, 3933, + 3407, 3689, 3811, + 0, 3805, 3569, + 0, 3925, 2301, + 0, 4047, 0, + 4095, 2667, 4095, + 4095, 2669, 4095, + 4095, 2669, 4095, + 4095, 2669, 4095, + 4095, 2671, 4095, + 4095, 2671, 4095, + 4095, 2673, 4095, + 4095, 2675, 4095, + 4095, 2677, 4095, + 4095, 2681, 4095, + 4095, 2687, 4095, + 4095, 2693, 4095, + 4095, 2701, 4095, + 4095, 2711, 4095, + 4095, 2727, 4095, + 4095, 2745, 4095, + 4095, 2767, 4095, + 4095, 2797, 4095, + 4095, 2835, 4095, + 4095, 2879, 4095, + 4095, 2933, 4095, + 4095, 2997, 4095, + 4095, 3069, 4095, + 4095, 3151, 4095, + 4095, 3243, 4095, + 4087, 3341, 4095, + 4029, 3447, 4095, + 3935, 3557, 4039, + 3771, 3673, 3945, + 3375, 3793, 3777, + 0, 3915, 3367, + 0, 4039, 0, + 4095, 2419, 4095, + 4095, 2421, 4095, + 4095, 2421, 4095, + 4095, 2421, 4095, + 4095, 2423, 4095, + 4095, 2425, 4095, + 4095, 2429, 4095, + 4095, 2431, 4095, + 4095, 2437, 4095, + 4095, 2443, 4095, + 4095, 2451, 4095, + 4095, 2461, 4095, + 4095, 2475, 4095, + 4095, 2493, 4095, + 4095, 2515, 4095, + 4095, 2545, 4095, + 4095, 2581, 4095, + 4095, 2625, 4095, + 4095, 2677, 4095, + 4095, 2739, 4095, + 4095, 2811, 4095, + 4095, 2893, 4095, + 4095, 2983, 4095, + 4095, 3081, 4095, + 4095, 3185, 4095, + 4095, 3295, 4095, + 4095, 3411, 4095, + 4095, 3529, 4095, + 4023, 3651, 4077, + 3839, 3777, 3959, + 3331, 3903, 3727, + 0, 4031, 2729, + 4095, 771, 4095, + 4095, 795, 4095, + 4095, 824, 4095, + 4095, 860, 4095, + 4095, 904, 4095, + 4095, 957, 4095, + 4095, 1020, 4095, + 4095, 1092, 4095, + 4095, 1173, 4095, + 4095, 1263, 4095, + 4095, 1361, 4095, + 4095, 1466, 4095, + 4095, 1577, 4095, + 4095, 1692, 4095, + 4095, 1811, 4095, + 4095, 1934, 4095, + 4095, 2059, 4095, + 4095, 2185, 4095, + 4095, 2313, 4095, + 4095, 2441, 4095, + 4095, 2571, 4095, + 4095, 2701, 4095, + 4095, 2831, 4095, + 4095, 2963, 4095, + 4095, 3095, 4095, + 4095, 3225, 4095, + 4095, 3357, 4095, + 4095, 3489, 4095, + 4095, 3621, 4095, + 4095, 3753, 4095, + 3915, 3885, 3977, + 3265, 4017, 3649, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 0, 4095, + 4095, 1343, 4095, + 4095, 2153, 4095, + 4095, 2493, 4095, + 4095, 2735, 4095, + 4095, 2935, 4095, + 4095, 3113, 4095, + 4095, 3275, 4095, + 4095, 3429, 4095, + 4095, 3577, 4095, + 4095, 3721, 4095, + 4095, 3861, 4095, + 3999, 3999, 3999 +] + } +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr new file mode 100644 index 0000000000..bf06ce0bed --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad9a024034bfc356f7c6fd4c19d617a7321306c68b7f824fb44b73ad57613244 +size 197689 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr new file mode 100644 index 0000000000..49e0460826 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ff499c054a259a3cd389b613382066f258287215f61da56115b3e958733dbe6 +size 31227639 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk new file mode 100644 index 0000000000..9643c9edbc --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk @@ -0,0 +1,225 @@ +#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx +version 13.0 v3 +define_window_layout_xml { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +Root { + inputs 0 + name C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk + project_directory "\"C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/" + format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" + proxy_type scale + proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" + colorManagement OCIO + OCIO_config aces_1.0.3 + defaultViewerLUT "OCIO LUTs" + workingSpaceLUT scene_linear + monitorLut ACES/Rec.709 + monitorOutLUT "sRGB (ACES)" + int8Lut matte_paint + int16Lut texture_paint + logLut compositing_log + floatLut scene_linear +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr + format "1024 32 0 0 1024 32 1 " + origset true + colorspace data + raw true + name Read_Linear_LUT_32 + xpos -846 + ypos 10 +} +set N16319800 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer1 + xpos -846 + ypos 135 +} +push $N16319800 +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + working_space rendering + name Log2_48_nits_Shaper_to_linear + xpos -710 + ypos 46 +} +set N16319000 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer2 + xpos -710 + ypos 137 +} +push $N16319000 +Transform { + center {1024 778} + name Transform_Position_LUT + xpos -579 + ypos 3 +} +set N16318c00 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer3 + xpos -579 + ypos 135 +} +push $N16318c00 +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr + format "2802 1854 0 0 2802 1854 1 " + origset true + name Read_DisplayMapperPassthrough + xpos -580 + ypos -146 +} +ZMerge { + inputs 2 + name ZMerge_Combine + xpos -413 + ypos -83 +} +set N16297c00 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer4 + xpos -413 + ypos 128 +} +push $N16297c00 +HueShift { + ingray {0.18 0.18 0.18} + outgray {0.18 0.18 0.18} + saturation 1.26 + color {0.12 0.12 0.12} + color_saturation 0.78 + hue_rotation -150 + brightness 0.74 + name HueShift1 + xpos -256 + ypos -83 +} +set N16297800 [stack 0] +Crop { + box {0 0 1024 32} + reformat true + crop false + name Crop1 + xpos -86 + ypos 32 +} +set N16297400 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer6 + xpos -86 + ypos 134 +} +push $N16297800 +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr + colorspace compositing_linear + file_type exr + write_ACES_compliant_EXR true + datatype "32 bit float" + first_part rgba + version 11 + name Write_Shot_Grade_Comp + xpos 353 + ypos -95 +} +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer8 + xpos 353 + ypos 135 +} +push $N16297400 +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + direction inverse + working_space data + name invLog2_48_nits_Shaper_to_linear + xpos 74 + ypos -14 +} +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr + colorspace data + file_type exr + datatype "32 bit float" + first_part rgba + version 11 + name Write_RAW_LUT + xpos 242 + ypos 20 +} +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer7 + xpos 242 + ypos 135 +} +push $N16297800 +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer5 + xpos -256 + ypos 130 +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ new file mode 100644 index 0000000000..084ba1495d --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ @@ -0,0 +1,227 @@ +#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx +version 13.0 v3 +define_window_layout_xml { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +Root { + inputs 0 + name C:/Depot/o3de/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk + project_directory "\"C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/" + format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" + proxy_type scale + proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" + colorManagement OCIO + OCIO_config aces_1.0.3 + defaultViewerLUT "OCIO LUTs" + workingSpaceLUT scene_linear + monitorLut ACES/Rec.709 + monitorOutLUT "sRGB (ACES)" + int8Lut matte_paint + int16Lut texture_paint + logLut compositing_log + floatLut scene_linear +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr + format "1024 32 0 0 1024 32 1 " + origset true + colorspace data + raw true + name Read_Linear_LUT_32 + xpos -846 + ypos 10 +} +set N3bfa9800 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer1 + xpos -846 + ypos 135 +} +push $N3bfa9800 +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + working_space rendering + name Log2_48_nits_Shaper_to_linear + xpos -710 + ypos 46 +} +set N3bfa9000 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer2 + xpos -710 + ypos 137 +} +push $N3bfa9000 +Transform { + center {1024 778} + name Transform_Position_LUT + xpos -579 + ypos 3 +} +set N3bfa8c00 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer3 + xpos -579 + ypos 135 +} +push $N3bfa8c00 +Read { + inputs 0 + file_type exr + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr + format "2802 1854 0 0 2802 1854 1 " + origset true + name Read_DisplayMapperPassthrough + xpos -580 + ypos -146 +} +ZMerge { + inputs 2 + name ZMerge_Combine + xpos -413 + ypos -83 +} +set N3bf5bc00 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer4 + xpos -413 + ypos 128 +} +push $N3bf5bc00 +HueShift { + ingray {0.18 0.18 0.18} + outgray {0.18 0.18 0.18} + saturation 1.26 + color {0.12 0.12 0.12} + color_saturation 0.78 + hue_rotation -150 + brightness 0.74 + name HueShift1 + xpos -256 + ypos -83 +} +set N3bf5b800 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer5 + xpos -256 + ypos 130 +} +push $N3bf5b800 +Crop { + box {0 0 1024 32} + reformat true + crop false + name Crop1 + xpos -86 + ypos 32 +} +set N3bf5ac00 [stack 0] +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer6 + xpos -86 + ypos 134 +} +push $N3bf5b800 +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Nuke_Shot_post_grade.exr + colorspace compositing_linear + file_type exr + write_ACES_compliant_EXR true + datatype "32 bit float" + first_part rgba + version 10 + name Write_Shot_Grade_Comp + selected true + xpos 353 + ypos -95 +} +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer8 + xpos 353 + ypos 135 +} +push $N3bf5ac00 +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + direction inverse + working_space data + name invLog2_48_nits_Shaper_to_linear + xpos 74 + ypos -14 +} +Write { + file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr + colorspace data + file_type exr + datatype "32 bit float" + first_part rgba + version 10 + name Write_RAW_LUT + xpos 242 + ypos 20 +} +Viewer { + frame 1 + frame_range 1-100 + viewerProcess "sRGB (ACES)" + name Viewer7 + xpos 242 + ypos 135 +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.3dl b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.3dl new file mode 100644 index 0000000000..674cf4d9ce --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.3dl @@ -0,0 +1,32769 @@ +0 33 66 99 132 165 198 231 264 297 330 363 396 429 462 495 528 561 594 627 660 693 726 759 792 825 858 891 924 957 990 1023 +0 0 0 +0 0 0 +0 15 0 +0 104 0 +0 201 0 +0 305 0 +0 415 0 +0 530 0 +0 649 0 +0 771 0 +0 895 0 +0 1022 0 +0 1149 0 +0 1278 0 +0 1408 0 +0 1538 0 +0 1668 0 +0 1799 0 +0 1931 0 +0 2062 0 +0 2194 0 +0 2326 0 +0 2457 0 +0 2589 0 +0 2721 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3381 0 +0 3514 0 +0 3646 0 +130 0 20 +28 0 0 +0 33 0 +0 119 0 +0 213 0 +0 315 0 +0 423 0 +0 536 0 +0 654 0 +0 775 0 +0 898 0 +0 1024 0 +0 1151 0 +0 1279 0 +0 1408 0 +0 1538 0 +0 1669 0 +0 1800 0 +0 1931 0 +0 2062 0 +0 2194 0 +0 2326 0 +0 2458 0 +0 2589 0 +0 2721 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3381 0 +0 3514 0 +0 3646 0 +342 0 170 +280 0 102 +183 56 0 +7 139 0 +0 229 0 +0 328 0 +0 433 0 +0 544 0 +0 660 0 +0 779 0 +0 902 0 +0 1026 0 +0 1153 0 +0 1281 0 +0 1410 0 +0 1539 0 +0 1670 0 +0 1800 0 +0 1931 0 +0 2063 0 +0 2194 0 +0 2326 0 +0 2458 0 +0 2589 0 +0 2721 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3381 0 +0 3514 0 +0 3646 0 +526 0 315 +486 18 266 +426 86 192 +331 163 68 +163 250 0 +0 344 0 +0 446 0 +0 555 0 +0 668 0 +0 785 0 +0 906 0 +0 1030 0 +0 1156 0 +0 1283 0 +0 1411 0 +0 1540 0 +0 1670 0 +0 1801 0 +0 1932 0 +0 2063 0 +0 2194 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3382 0 +0 3514 0 +0 3646 0 +693 8 457 +666 60 422 +626 123 370 +568 195 290 +475 276 155 +312 366 0 +0 463 0 +0 568 0 +0 678 0 +0 794 0 +0 913 0 +0 1035 0 +0 1159 0 +0 1285 0 +0 1413 0 +0 1542 0 +0 1672 0 +0 1802 0 +0 1932 0 +0 2064 0 +0 2195 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3382 0 +0 3514 0 +0 3646 0 +850 65 596 +831 112 570 +804 168 534 +765 233 479 +707 308 395 +616 393 250 +457 485 0 +82 585 0 +0 692 0 +0 804 0 +0 921 0 +0 1041 0 +0 1164 0 +0 1289 0 +0 1416 0 +0 1544 0 +0 1673 0 +0 1803 0 +0 1933 0 +0 2064 0 +0 2195 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +999 131 733 +986 172 714 +967 222 688 +940 280 650 +901 348 594 +844 426 505 +755 513 352 +598 608 3 +235 710 0 +0 818 0 +0 932 0 +0 1049 0 +0 1170 0 +0 1294 0 +0 1420 0 +0 1547 0 +0 1675 0 +0 1805 0 +0 1935 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1144 207 869 +1134 242 855 +1121 285 836 +1102 336 809 +1075 397 770 +1037 468 712 +980 547 621 +892 636 461 +737 732 82 +382 836 0 +0 946 0 +0 1060 0 +0 1179 0 +0 1300 0 +0 1424 0 +0 1550 0 +0 1678 0 +0 1807 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1286 293 1004 +1278 322 994 +1268 358 980 +1255 402 960 +1236 455 932 +1210 518 893 +1172 590 833 +1115 671 740 +1027 761 574 +874 859 170 +525 964 0 +0 1074 0 +0 1190 0 +0 1309 0 +0 1431 0 +0 1555 0 +0 1682 0 +0 1809 0 +0 1938 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1424 386 1138 +1419 410 1131 +1412 440 1120 +1402 477 1106 +1389 523 1086 +1370 577 1058 +1343 641 1018 +1306 714 958 +1250 797 862 +1162 888 692 +1010 987 267 +665 1093 0 +0 1204 0 +0 1320 0 +0 1439 0 +0 1562 0 +0 1687 0 +0 1813 0 +0 1941 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1562 487 1272 +1558 506 1266 +1552 531 1258 +1545 561 1248 +1535 599 1234 +1522 646 1213 +1503 701 1185 +1477 766 1144 +1439 840 1084 +1383 924 987 +1296 1016 813 +1145 1116 370 +802 1222 0 +0 1334 0 +0 1450 0 +0 1570 0 +0 1693 0 +0 1818 0 +0 1945 0 +0 2073 0 +0 2202 0 +0 2331 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1697 595 1405 +1695 610 1401 +1691 629 1395 +1685 654 1387 +1678 685 1377 +1668 724 1362 +1655 771 1342 +1636 827 1314 +1610 893 1273 +1572 968 1211 +1517 1053 1113 +1430 1145 937 +1279 1246 479 +939 1352 0 +0 1465 0 +0 1581 0 +0 1701 0 +0 1824 0 +0 1950 0 +0 2076 0 +0 2204 0 +0 2334 0 +0 2463 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1832 707 1538 +1830 719 1535 +1827 735 1531 +1823 755 1525 +1818 780 1517 +1811 811 1507 +1801 851 1492 +1788 898 1472 +1769 955 1443 +1743 1021 1402 +1705 1097 1340 +1650 1182 1241 +1563 1275 1062 +1412 1376 594 +1074 1483 0 +0 1596 0 +0 1712 0 +0 1833 0 +0 1956 0 +0 2081 0 +0 2208 0 +0 2336 0 +0 2466 0 +0 2595 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1966 824 1671 +1965 834 1668 +1963 846 1665 +1960 861 1661 +1956 881 1655 +1951 907 1647 +1943 939 1637 +1934 978 1622 +1920 1026 1602 +1902 1084 1573 +1875 1150 1531 +1838 1227 1469 +1782 1312 1370 +1696 1406 1190 +1545 1507 712 +1209 1614 0 +0 1727 0 +0 1844 0 +0 1964 0 +0 2088 0 +0 2213 0 +0 2340 0 +0 2468 0 +0 2597 0 +0 2727 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +2100 945 1803 +2099 952 1802 +2097 961 1799 +2095 973 1796 +2092 989 1792 +2088 1009 1786 +2083 1035 1778 +2076 1067 1768 +2066 1107 1753 +2053 1156 1732 +2034 1213 1703 +2008 1280 1662 +1970 1357 1599 +1915 1442 1499 +1828 1536 1318 +1678 1638 834 +1342 1745 0 +0 1858 0 +0 1976 0 +0 2096 0 +0 2220 0 +0 2345 0 +0 2472 0 +0 2600 0 +0 2730 0 +0 2859 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2233 1068 1936 +2232 1074 1935 +2231 1081 1933 +2230 1090 1930 +2227 1102 1927 +2225 1118 1923 +2221 1139 1917 +2215 1164 1909 +2208 1197 1899 +2198 1237 1884 +2185 1286 1863 +2166 1343 1834 +2140 1411 1793 +2103 1488 1730 +2047 1573 1629 +1961 1668 1447 +1811 1769 958 +1476 1877 0 +0 1990 0 +0 2107 0 +0 2228 0 +0 2351 0 +0 2477 0 +0 2604 0 +0 2732 0 +0 2862 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +2366 1194 2068 +2366 1198 2067 +2365 1203 2066 +2364 1210 2064 +2362 1220 2062 +2360 1232 2059 +2357 1248 2054 +2353 1268 2049 +2348 1294 2041 +2340 1327 2030 +2331 1367 2015 +2317 1416 1995 +2299 1474 1966 +2273 1542 1924 +2235 1619 1861 +2180 1705 1760 +2093 1799 1577 +1944 1901 1084 +1609 2009 0 +0 2122 0 +0 2239 0 +0 2360 0 +0 2483 0 +0 2609 0 +0 2736 0 +0 2864 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2499 1321 2200 +2499 1324 2200 +2498 1328 2199 +2497 1333 2197 +2496 1340 2196 +2494 1350 2193 +2492 1362 2190 +2489 1378 2186 +2485 1399 2180 +2480 1425 2172 +2473 1458 2161 +2463 1498 2147 +2450 1547 2126 +2431 1605 2097 +2405 1673 2055 +2367 1750 1992 +2312 1836 1891 +2226 1931 1708 +2076 2032 1211 +1742 2140 0 +0 2254 0 +0 2371 0 +0 2492 0 +0 2615 0 +0 2741 0 +0 2868 0 +0 2996 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2632 1449 2333 +2631 1451 2332 +2631 1454 2331 +2630 1458 2330 +2629 1464 2329 +2628 1471 2327 +2626 1481 2325 +2624 1493 2322 +2621 1509 2318 +2617 1530 2312 +2612 1556 2304 +2605 1589 2293 +2595 1629 2278 +2582 1678 2258 +2563 1736 2229 +2537 1804 2187 +2500 1881 2123 +2444 1968 2023 +2358 2062 1839 +2208 2164 1340 +1874 2272 0 +0 2385 0 +0 2503 0 +0 2624 0 +0 2747 0 +0 2873 0 +0 3000 0 +0 3128 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2764 1578 2465 +2764 1580 2465 +2763 1582 2464 +2763 1585 2463 +2762 1589 2462 +2761 1595 2461 +2760 1602 2459 +2759 1612 2457 +2756 1624 2454 +2753 1640 2449 +2750 1661 2444 +2744 1687 2436 +2737 1720 2425 +2727 1760 2410 +2714 1809 2389 +2695 1868 2360 +2669 1936 2318 +2632 2013 2255 +2577 2099 2154 +2490 2194 1970 +2341 2296 1469 +2007 2404 0 +0 2517 0 +0 2635 0 +0 2756 0 +0 2879 0 +0 3005 0 +0 3132 0 +0 3260 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1708 2597 +2896 1709 2597 +2896 1711 2596 +2896 1713 2596 +2895 1716 2595 +2894 1721 2594 +2893 1726 2593 +2892 1733 2591 +2891 1743 2589 +2889 1755 2586 +2886 1771 2581 +2882 1792 2575 +2876 1818 2568 +2869 1851 2557 +2859 1892 2542 +2846 1941 2521 +2828 1999 2492 +2801 2067 2450 +2764 2145 2387 +2709 2231 2286 +2622 2326 2101 +2473 2428 1599 +2139 2536 0 +0 2649 0 +0 2767 0 +0 2888 0 +0 3011 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +3029 1838 2729 +3029 1839 2729 +3028 1841 2729 +3028 1842 2728 +3028 1845 2728 +3027 1848 2727 +3027 1852 2726 +3026 1858 2725 +3024 1865 2723 +3023 1874 2721 +3021 1887 2717 +3018 1903 2713 +3014 1924 2707 +3009 1950 2699 +3001 1983 2689 +2992 2024 2674 +2978 2073 2653 +2960 2131 2624 +2934 2199 2582 +2896 2277 2519 +2841 2363 2418 +2755 2458 2233 +2605 2560 1730 +2272 2668 0 +0 2781 0 +0 2899 0 +0 3020 0 +0 3143 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3161 1969 2861 +3161 1970 2861 +3161 1971 2861 +3160 1972 2861 +3160 1974 2860 +3160 1976 2860 +3159 1980 2859 +3159 1984 2858 +3158 1989 2857 +3157 1996 2855 +3155 2006 2853 +3153 2018 2849 +3150 2035 2845 +3146 2055 2839 +3141 2082 2831 +3134 2115 2821 +3124 2155 2806 +3110 2205 2785 +3092 2263 2756 +3066 2331 2714 +3028 2409 2651 +2973 2495 2549 +2887 2590 2365 +2737 2692 1861 +2404 2800 0 +0 2913 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3293 2100 2994 +3293 2101 2993 +3293 2102 2993 +3293 2103 2993 +3293 2104 2993 +3292 2106 2992 +3292 2108 2992 +3291 2111 2991 +3291 2115 2990 +3290 2121 2989 +3289 2128 2987 +3287 2138 2985 +3285 2150 2981 +3282 2166 2977 +3278 2187 2971 +3273 2213 2963 +3266 2246 2953 +3256 2287 2938 +3242 2336 2917 +3224 2395 2888 +3198 2463 2846 +3161 2541 2783 +3105 2627 2681 +3019 2722 2497 +2870 2824 1992 +2536 2932 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3660 0 +3425 2232 3126 +3425 2232 3126 +3425 2233 3125 +3425 2233 3125 +3425 2234 3125 +3425 2236 3125 +3424 2238 3124 +3424 2240 3124 +3424 2243 3123 +3423 2247 3122 +3422 2253 3121 +3421 2260 3119 +3419 2270 3117 +3417 2282 3113 +3414 2298 3109 +3410 2319 3103 +3405 2345 3095 +3398 2378 3085 +3388 2419 3070 +3375 2468 3049 +3356 2527 3020 +3330 2595 2978 +3293 2673 2915 +3237 2759 2813 +3151 2854 2629 +3002 2956 2124 +2668 3064 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2363 3258 +3557 2364 3258 +3557 2364 3258 +3557 2365 3258 +3557 2365 3257 +3557 2366 3257 +3557 2368 3257 +3557 2370 3256 +3556 2372 3256 +3556 2375 3255 +3555 2379 3254 +3554 2385 3253 +3553 2392 3251 +3551 2402 3249 +3549 2414 3245 +3546 2430 3241 +3542 2451 3235 +3537 2477 3227 +3530 2510 3217 +3520 2551 3202 +3507 2600 3181 +3488 2659 3152 +3462 2727 3110 +3425 2805 3047 +3369 2891 2945 +3283 2986 2760 +3134 3088 2255 +2800 3196 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3690 2495 3390 +3690 2495 3390 +3690 2496 3390 +3689 2496 3390 +3689 2497 3390 +3689 2497 3389 +3689 2498 3389 +3689 2500 3389 +3689 2501 3388 +3688 2504 3388 +3688 2507 3387 +3687 2511 3386 +3686 2517 3385 +3685 2524 3383 +3683 2534 3381 +3681 2546 3378 +3678 2562 3373 +3674 2583 3367 +3669 2609 3360 +3662 2642 3349 +3652 2683 3334 +3639 2732 3313 +3620 2791 3284 +3594 2859 3242 +3557 2937 3179 +3502 3023 3077 +3415 3118 2892 +3266 3220 2387 +2933 3328 0 +0 3442 0 +0 3559 0 +0 3680 0 +3822 2627 3522 +3822 2627 3522 +3822 2627 3522 +3822 2628 3522 +3822 2628 3522 +3822 2629 3522 +3821 2629 3521 +3821 2630 3521 +3821 2632 3521 +3821 2633 3521 +3820 2636 3520 +3820 2639 3519 +3819 2643 3518 +3818 2649 3517 +3817 2656 3515 +3816 2666 3513 +3813 2678 3510 +3810 2694 3505 +3807 2715 3499 +3801 2741 3492 +3794 2774 3481 +3784 2815 3466 +3771 2864 3445 +3752 2923 3416 +3726 2991 3374 +3689 3069 3311 +3634 3155 3209 +3547 3250 3024 +3398 3352 2519 +3065 3460 0 +0 3574 0 +0 3691 0 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3953 2761 3654 +3953 2762 3653 +3953 2764 3653 +3953 2765 3653 +3952 2768 3652 +3952 2771 3651 +3951 2775 3650 +3950 2781 3649 +3949 2788 3647 +3948 2798 3645 +3945 2810 3642 +3943 2826 3637 +3939 2847 3632 +3933 2873 3624 +3926 2906 3613 +3916 2947 3598 +3903 2996 3577 +3884 3055 3548 +3858 3123 3506 +3821 3201 3443 +3766 3287 3341 +3679 3382 3156 +3530 3484 2651 +3197 3592 0 +0 3706 0 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2893 3786 +4085 2894 3785 +4085 2896 3785 +4085 2897 3785 +4085 2900 3784 +4084 2903 3783 +4083 2907 3782 +4083 2913 3781 +4081 2920 3779 +4080 2930 3777 +4078 2942 3774 +4075 2958 3769 +4071 2979 3764 +4065 3005 3756 +4058 3038 3745 +4049 3079 3730 +4035 3128 3709 +4017 3187 3680 +3991 3255 3638 +3953 3333 3575 +3898 3419 3473 +3812 3514 3289 +3662 3616 2783 +3329 3725 0 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3025 3918 +4095 3026 3917 +4095 3028 3917 +4095 3030 3917 +4095 3032 3916 +4095 3035 3915 +4095 3039 3915 +4095 3045 3913 +4095 3052 3911 +4095 3062 3909 +4095 3074 3906 +4095 3090 3902 +4095 3111 3896 +4095 3137 3888 +4095 3170 3877 +4095 3211 3862 +4095 3261 3842 +4095 3319 3812 +4095 3387 3770 +4085 3465 3707 +4030 3551 3605 +3944 3646 3421 +3794 3748 2915 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3157 4050 +4095 3158 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3167 4048 +4095 3171 4047 +4095 3177 4045 +4095 3184 4044 +4095 3194 4041 +4095 3206 4038 +4095 3222 4034 +4095 3243 4028 +4095 3270 4020 +4095 3303 4009 +4095 3343 3994 +4095 3393 3974 +4095 3451 3944 +4095 3519 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 0 0 +0 0 0 +0 49 0 +0 132 0 +0 224 0 +0 324 0 +0 430 0 +0 542 0 +0 658 0 +0 778 0 +0 901 0 +0 1025 0 +0 1152 0 +0 1280 0 +0 1409 0 +0 1539 0 +0 1669 0 +0 1800 0 +0 1931 0 +0 2063 0 +0 2194 0 +0 2326 0 +0 2458 0 +0 2589 0 +0 2721 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3381 0 +0 3514 0 +0 3646 0 +104 0 80 +0 0 0 +0 66 0 +0 147 0 +0 236 0 +0 333 0 +0 438 0 +0 548 0 +0 662 0 +0 781 0 +0 903 0 +0 1028 0 +0 1154 0 +0 1281 0 +0 1410 0 +0 1540 0 +0 1670 0 +0 1800 0 +0 1931 0 +0 2063 0 +0 2194 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2721 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3381 0 +0 3514 0 +0 3646 0 +326 0 214 +262 20 152 +160 88 54 +0 165 0 +0 251 0 +0 346 0 +0 447 0 +0 555 0 +0 668 0 +0 786 0 +0 907 0 +0 1030 0 +0 1156 0 +0 1283 0 +0 1411 0 +0 1540 0 +0 1670 0 +0 1801 0 +0 1932 0 +0 2063 0 +0 2194 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3382 0 +0 3514 0 +0 3646 0 +515 0 347 +474 52 302 +413 116 234 +315 188 122 +139 271 0 +0 361 0 +0 460 0 +0 565 0 +0 676 0 +0 792 0 +0 911 0 +0 1034 0 +0 1158 0 +0 1285 0 +0 1413 0 +0 1542 0 +0 1671 0 +0 1802 0 +0 1932 0 +0 2063 0 +0 2195 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3382 0 +0 3514 0 +0 3646 0 +686 42 481 +658 92 447 +618 150 399 +558 218 324 +463 295 200 +295 382 0 +0 477 0 +0 579 0 +0 687 0 +0 800 0 +0 918 0 +0 1039 0 +0 1162 0 +0 1288 0 +0 1415 0 +0 1543 0 +0 1673 0 +0 1802 0 +0 1933 0 +0 2064 0 +0 2195 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +844 96 614 +825 140 589 +798 192 554 +758 255 502 +700 327 422 +607 408 287 +444 498 4 +53 596 0 +0 700 0 +0 811 0 +0 926 0 +0 1045 0 +0 1167 0 +0 1291 0 +0 1418 0 +0 1545 0 +0 1674 0 +0 1804 0 +0 1934 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +996 158 746 +982 197 728 +963 244 702 +936 300 666 +897 365 611 +839 440 527 +748 525 382 +589 617 65 +214 718 0 +0 824 0 +0 936 0 +0 1053 0 +0 1173 0 +0 1296 0 +0 1421 0 +0 1548 0 +0 1676 0 +0 1805 0 +0 1935 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1141 230 879 +1131 263 865 +1118 304 846 +1099 354 820 +1072 412 782 +1034 481 726 +976 558 638 +887 645 484 +730 740 135 +367 842 0 +0 950 0 +0 1064 0 +0 1181 0 +0 1302 0 +0 1426 0 +0 1552 0 +0 1679 0 +0 1807 0 +0 1937 0 +0 2067 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1284 312 1011 +1276 340 1001 +1266 374 987 +1253 417 968 +1234 468 941 +1207 529 902 +1169 600 844 +1112 679 753 +1024 768 593 +869 865 214 +514 968 0 +0 1078 0 +0 1192 0 +0 1311 0 +0 1432 0 +0 1557 0 +0 1683 0 +0 1810 0 +0 1939 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1423 402 1144 +1418 425 1136 +1410 454 1126 +1401 490 1112 +1387 534 1092 +1368 587 1064 +1342 650 1025 +1304 722 966 +1247 803 872 +1159 893 706 +1006 991 302 +657 1096 0 +0 1206 0 +0 1322 0 +0 1441 0 +0 1563 0 +0 1687 0 +0 1814 0 +0 1941 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1561 500 1276 +1557 518 1270 +1551 542 1263 +1544 572 1252 +1534 609 1238 +1521 655 1218 +1502 709 1190 +1476 773 1150 +1438 846 1090 +1382 929 994 +1294 1020 824 +1142 1119 399 +797 1225 0 +0 1336 0 +0 1452 0 +0 1571 0 +0 1694 0 +0 1819 0 +0 1945 0 +0 2073 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1697 605 1408 +1694 619 1404 +1690 639 1398 +1684 663 1391 +1677 694 1380 +1667 732 1366 +1654 778 1346 +1635 833 1317 +1609 898 1277 +1571 973 1216 +1515 1056 1119 +1428 1148 945 +1277 1248 502 +935 1354 0 +0 1466 0 +0 1582 0 +0 1702 0 +0 1825 0 +0 1950 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1832 715 1540 +1830 727 1537 +1827 742 1533 +1823 761 1527 +1817 786 1519 +1810 818 1509 +1800 856 1494 +1787 903 1474 +1768 959 1446 +1742 1025 1405 +1704 1100 1343 +1649 1185 1245 +1562 1277 1069 +1411 1378 612 +1071 1484 0 +0 1597 0 +0 1713 0 +0 1833 0 +0 1956 0 +0 2082 0 +0 2208 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1966 830 1672 +1964 840 1670 +1962 851 1667 +1959 867 1663 +1955 887 1657 +1950 912 1649 +1943 943 1639 +1933 983 1624 +1920 1030 1604 +1901 1087 1575 +1875 1153 1534 +1837 1229 1472 +1782 1314 1373 +1695 1407 1194 +1544 1508 726 +1206 1615 0 +0 1728 0 +0 1845 0 +0 1965 0 +0 2088 0 +0 2213 0 +0 2340 0 +0 2468 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +2100 950 1805 +2099 957 1803 +2097 966 1801 +2095 978 1797 +2092 993 1793 +2088 1013 1787 +2083 1039 1780 +2075 1071 1769 +2066 1110 1754 +2052 1159 1734 +2034 1216 1705 +2007 1282 1663 +1970 1359 1601 +1914 1444 1502 +1828 1538 1322 +1678 1639 844 +1341 1746 0 +0 1859 0 +0 1976 0 +0 2097 0 +0 2220 0 +0 2345 0 +0 2472 0 +0 2600 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2233 1072 1937 +2232 1077 1935 +2231 1084 1934 +2229 1093 1931 +2227 1106 1928 +2224 1121 1924 +2220 1142 1918 +2215 1167 1910 +2208 1200 1900 +2198 1239 1885 +2185 1288 1864 +2166 1345 1836 +2140 1412 1794 +2103 1489 1731 +2047 1575 1631 +1960 1669 1450 +1810 1770 966 +1475 1878 0 +0 1990 0 +0 2108 0 +0 2228 0 +0 2352 0 +0 2477 0 +0 2604 0 +0 2732 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +2366 1196 2069 +2365 1200 2068 +2365 1206 2067 +2363 1213 2065 +2362 1222 2063 +2360 1234 2059 +2357 1250 2055 +2353 1271 2049 +2347 1297 2041 +2340 1329 2031 +2330 1369 2016 +2317 1418 1995 +2298 1475 1966 +2272 1543 1925 +2235 1620 1862 +2180 1706 1762 +2093 1800 1579 +1943 1901 1090 +1608 2009 0 +0 2122 0 +0 2239 0 +0 2360 0 +0 2483 0 +0 2609 0 +0 2736 0 +0 2864 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2499 1323 2201 +2498 1326 2200 +2498 1330 2199 +2497 1335 2198 +2496 1342 2196 +2494 1352 2194 +2492 1364 2191 +2489 1380 2186 +2485 1400 2181 +2480 1426 2173 +2473 1459 2162 +2463 1499 2147 +2449 1548 2127 +2431 1606 2098 +2405 1674 2056 +2367 1751 1993 +2312 1837 1892 +2225 1931 1709 +2076 2033 1216 +1741 2141 0 +0 2254 0 +0 2371 0 +0 2492 0 +0 2615 0 +0 2741 0 +0 2868 0 +0 2996 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2631 1450 2333 +2631 1453 2333 +2631 1456 2332 +2630 1460 2331 +2629 1465 2330 +2628 1473 2328 +2626 1482 2325 +2624 1494 2322 +2621 1510 2318 +2617 1531 2312 +2612 1557 2304 +2605 1590 2294 +2595 1630 2279 +2582 1679 2258 +2563 1737 2229 +2537 1805 2187 +2500 1882 2124 +2444 1968 2023 +2358 2063 1840 +2208 2164 1343 +1874 2272 0 +0 2386 0 +0 2503 0 +0 2624 0 +0 2747 0 +0 2873 0 +0 3000 0 +0 3128 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2764 1579 2465 +2764 1581 2465 +2763 1583 2464 +2763 1586 2464 +2762 1590 2463 +2761 1596 2461 +2760 1603 2460 +2758 1613 2457 +2756 1625 2454 +2753 1641 2450 +2749 1662 2444 +2744 1688 2436 +2737 1721 2425 +2727 1761 2410 +2714 1810 2390 +2695 1868 2361 +2669 1936 2319 +2632 2013 2256 +2576 2100 2155 +2490 2194 1971 +2341 2296 1472 +2006 2404 0 +0 2518 0 +0 2635 0 +0 2756 0 +0 2879 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1709 2597 +2896 1710 2597 +2896 1712 2597 +2895 1714 2596 +2895 1717 2595 +2894 1721 2594 +2893 1727 2593 +2892 1734 2591 +2891 1744 2589 +2888 1756 2586 +2886 1772 2581 +2882 1793 2576 +2876 1819 2568 +2869 1852 2557 +2859 1892 2542 +2846 1942 2522 +2827 2000 2492 +2801 2068 2450 +2764 2145 2387 +2709 2232 2286 +2622 2326 2102 +2473 2428 1601 +2139 2536 0 +0 2650 0 +0 2767 0 +0 2888 0 +0 3011 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +3029 1839 2729 +3029 1840 2729 +3028 1841 2729 +3028 1843 2729 +3028 1845 2728 +3027 1849 2727 +3026 1853 2726 +3026 1858 2725 +3024 1865 2723 +3023 1875 2721 +3021 1887 2718 +3018 1904 2713 +3014 1924 2708 +3009 1950 2700 +3001 1983 2689 +2992 2024 2674 +2978 2073 2653 +2960 2132 2624 +2934 2199 2582 +2896 2277 2519 +2841 2363 2418 +2754 2458 2234 +2605 2560 1732 +2271 2668 0 +0 2781 0 +0 2899 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3161 1970 2862 +3161 1970 2861 +3161 1971 2861 +3160 1973 2861 +3160 1975 2860 +3160 1977 2860 +3159 1980 2859 +3159 1984 2858 +3158 1990 2857 +3157 1997 2855 +3155 2006 2853 +3153 2019 2850 +3150 2035 2845 +3146 2056 2839 +3141 2082 2832 +3133 2115 2821 +3124 2156 2806 +3110 2205 2785 +3092 2263 2756 +3066 2331 2714 +3028 2409 2651 +2973 2495 2550 +2887 2590 2365 +2737 2692 1862 +2404 2800 0 +0 2914 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3293 2101 2994 +3293 2101 2994 +3293 2102 2993 +3293 2103 2993 +3293 2104 2993 +3292 2106 2992 +3292 2109 2992 +3291 2112 2991 +3291 2116 2990 +3290 2121 2989 +3289 2129 2987 +3287 2138 2985 +3285 2151 2982 +3282 2167 2977 +3278 2187 2971 +3273 2214 2963 +3266 2247 2953 +3256 2287 2938 +3242 2337 2917 +3224 2395 2888 +3198 2463 2846 +3160 2541 2783 +3105 2627 2681 +3019 2722 2497 +2870 2824 1993 +2536 2932 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3660 0 +3425 2232 3126 +3425 2232 3126 +3425 2233 3126 +3425 2234 3125 +3425 2235 3125 +3425 2236 3125 +3424 2238 3124 +3424 2240 3124 +3424 2243 3123 +3423 2248 3122 +3422 2253 3121 +3421 2260 3119 +3419 2270 3117 +3417 2282 3114 +3414 2299 3109 +3410 2319 3103 +3405 2346 3095 +3398 2379 3085 +3388 2419 3070 +3375 2469 3049 +3356 2527 3020 +3330 2595 2978 +3293 2673 2915 +3237 2759 2813 +3151 2854 2629 +3002 2956 2124 +2668 3064 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2364 3258 +3557 2364 3258 +3557 2364 3258 +3557 2365 3258 +3557 2366 3257 +3557 2367 3257 +3557 2368 3257 +3557 2370 3256 +3556 2372 3256 +3556 2375 3255 +3555 2379 3254 +3554 2385 3253 +3553 2392 3251 +3551 2402 3249 +3549 2414 3246 +3546 2430 3241 +3542 2451 3235 +3537 2477 3228 +3530 2510 3217 +3520 2551 3202 +3507 2600 3181 +3488 2659 3152 +3462 2727 3110 +3425 2805 3047 +3369 2891 2945 +3283 2986 2761 +3134 3088 2256 +2800 3196 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3690 2495 3390 +3690 2495 3390 +3690 2496 3390 +3689 2496 3390 +3689 2497 3390 +3689 2497 3389 +3689 2498 3389 +3689 2500 3389 +3689 2502 3389 +3688 2504 3388 +3688 2507 3387 +3687 2511 3386 +3686 2517 3385 +3685 2524 3383 +3683 2534 3381 +3681 2546 3378 +3678 2562 3373 +3674 2583 3367 +3669 2609 3360 +3662 2642 3349 +3652 2683 3334 +3639 2732 3313 +3620 2791 3284 +3594 2859 3242 +3557 2937 3179 +3502 3023 3077 +3415 3118 2893 +3266 3220 2387 +2933 3328 0 +0 3442 0 +0 3559 0 +0 3680 0 +3822 2627 3522 +3822 2627 3522 +3822 2627 3522 +3822 2628 3522 +3822 2628 3522 +3821 2629 3522 +3821 2629 3522 +3821 2630 3521 +3821 2632 3521 +3821 2634 3521 +3820 2636 3520 +3820 2639 3519 +3819 2643 3518 +3818 2649 3517 +3817 2656 3515 +3815 2666 3513 +3813 2678 3510 +3810 2694 3505 +3807 2715 3500 +3801 2741 3492 +3794 2774 3481 +3784 2815 3466 +3771 2864 3445 +3752 2923 3416 +3726 2991 3374 +3689 3069 3311 +3634 3155 3209 +3547 3250 3025 +3398 3352 2519 +3065 3460 0 +0 3574 0 +0 3691 0 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3953 2761 3654 +3953 2762 3653 +3953 2764 3653 +3953 2766 3653 +3952 2768 3652 +3952 2771 3651 +3951 2775 3650 +3950 2781 3649 +3949 2788 3647 +3948 2798 3645 +3945 2810 3642 +3943 2826 3637 +3939 2847 3632 +3933 2873 3624 +3926 2906 3613 +3916 2947 3598 +3903 2996 3577 +3884 3055 3548 +3858 3123 3506 +3821 3201 3443 +3766 3287 3341 +3679 3382 3157 +3530 3484 2651 +3197 3592 0 +0 3706 0 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2893 3786 +4085 2894 3785 +4085 2896 3785 +4085 2898 3785 +4085 2900 3784 +4084 2903 3783 +4083 2907 3782 +4083 2913 3781 +4081 2920 3779 +4080 2930 3777 +4078 2942 3774 +4075 2958 3769 +4071 2979 3764 +4065 3005 3756 +4058 3038 3745 +4049 3079 3730 +4035 3129 3709 +4017 3187 3680 +3991 3255 3638 +3953 3333 3575 +3898 3419 3473 +3811 3514 3289 +3662 3616 2783 +3329 3725 0 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3025 3918 +4095 3026 3918 +4095 3028 3917 +4095 3030 3917 +4095 3032 3916 +4095 3035 3916 +4095 3039 3915 +4095 3045 3913 +4095 3052 3911 +4095 3062 3909 +4095 3074 3906 +4095 3090 3902 +4095 3111 3896 +4095 3137 3888 +4095 3171 3877 +4095 3211 3862 +4095 3261 3842 +4095 3319 3812 +4095 3387 3770 +4085 3465 3707 +4030 3551 3605 +3944 3646 3421 +3794 3748 2915 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3167 4048 +4095 3171 4047 +4095 3177 4045 +4095 3184 4044 +4095 3194 4041 +4095 3206 4038 +4095 3222 4034 +4095 3243 4028 +4095 3270 4020 +4095 3303 4009 +4095 3343 3994 +4095 3393 3974 +4095 3451 3944 +4095 3519 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 0 36 +0 24 0 +0 91 0 +0 168 0 +0 254 0 +0 348 0 +0 449 0 +0 557 0 +0 669 0 +0 787 0 +0 907 0 +0 1031 0 +0 1156 0 +0 1283 0 +0 1411 0 +0 1541 0 +0 1671 0 +0 1801 0 +0 1932 0 +0 2063 0 +0 2195 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3382 0 +0 3514 0 +0 3646 0 +67 0 149 +0 42 77 +0 107 0 +0 181 0 +0 264 0 +0 356 0 +0 456 0 +0 562 0 +0 674 0 +0 790 0 +0 910 0 +0 1033 0 +0 1158 0 +0 1284 0 +0 1412 0 +0 1541 0 +0 1671 0 +0 1801 0 +0 1932 0 +0 2063 0 +0 2195 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2853 0 +0 2985 0 +0 3117 0 +0 3249 0 +0 3382 0 +0 3514 0 +0 3646 0 +303 13 267 +236 65 212 +127 127 127 +0 198 0 +0 279 0 +0 368 0 +0 465 0 +0 570 0 +0 680 0 +0 795 0 +0 913 0 +0 1035 0 +0 1160 0 +0 1286 0 +0 1413 0 +0 1542 0 +0 1672 0 +0 1802 0 +0 1933 0 +0 2064 0 +0 2195 0 +0 2326 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2985 0 +0 3117 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +500 45 387 +458 94 346 +394 152 284 +292 220 186 +105 297 8 +0 383 0 +0 478 0 +0 579 0 +0 687 0 +0 801 0 +0 918 0 +0 1039 0 +0 1162 0 +0 1288 0 +0 1415 0 +0 1543 0 +0 1673 0 +0 1803 0 +0 1933 0 +0 2064 0 +0 2195 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +676 85 511 +647 130 480 +606 184 434 +545 248 366 +447 321 254 +271 403 43 +0 494 0 +0 592 0 +0 697 0 +0 808 0 +0 924 0 +0 1044 0 +0 1166 0 +0 1291 0 +0 1417 0 +0 1545 0 +0 1674 0 +0 1803 0 +0 1934 0 +0 2064 0 +0 2196 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +837 134 636 +818 175 613 +790 224 579 +750 282 531 +690 350 456 +596 428 332 +427 514 85 +12 609 0 +0 711 0 +0 819 0 +0 932 0 +0 1050 0 +0 1171 0 +0 1294 0 +0 1420 0 +0 1547 0 +0 1675 0 +0 1805 0 +0 1935 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +991 192 763 +977 228 746 +957 272 721 +930 325 686 +891 387 634 +832 459 554 +740 540 419 +577 630 136 +186 728 0 +0 832 0 +0 943 0 +0 1058 0 +0 1177 0 +0 1299 0 +0 1423 0 +0 1550 0 +0 1677 0 +0 1806 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1138 259 892 +1128 290 878 +1114 329 860 +1095 376 834 +1068 432 798 +1029 497 743 +971 572 659 +880 657 514 +721 749 197 +347 850 0 +0 956 0 +0 1068 0 +0 1185 0 +0 1305 0 +0 1428 0 +0 1553 0 +0 1680 0 +0 1808 0 +0 1937 0 +0 2067 0 +0 2198 0 +0 2328 0 +0 2460 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1281 336 1021 +1274 362 1011 +1264 395 997 +1250 436 978 +1231 486 952 +1204 544 914 +1166 613 858 +1109 690 770 +1019 777 616 +862 872 267 +499 974 0 +0 1082 0 +0 1196 0 +0 1314 0 +0 1435 0 +0 1558 0 +0 1684 0 +0 1811 0 +0 1939 0 +0 2069 0 +0 2199 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1421 422 1151 +1416 444 1143 +1408 472 1133 +1398 506 1119 +1385 549 1100 +1366 601 1073 +1339 661 1034 +1301 732 976 +1245 811 885 +1156 900 725 +1001 997 346 +646 1100 0 +0 1210 0 +0 1324 0 +0 1443 0 +0 1565 0 +0 1689 0 +0 1815 0 +0 1942 0 +0 2071 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1559 516 1281 +1555 534 1276 +1550 557 1268 +1543 586 1258 +1533 622 1244 +1519 666 1224 +1500 719 1197 +1474 782 1157 +1436 854 1098 +1380 935 1004 +1291 1025 838 +1138 1123 434 +789 1228 0 +0 1339 0 +0 1454 0 +0 1573 0 +0 1695 0 +0 1820 0 +0 1946 0 +0 2074 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1696 617 1412 +1693 632 1408 +1689 651 1402 +1683 674 1395 +1676 704 1384 +1666 741 1370 +1653 787 1350 +1634 841 1322 +1608 905 1282 +1570 978 1222 +1514 1061 1126 +1426 1152 956 +1274 1251 531 +929 1357 0 +0 1468 0 +0 1584 0 +0 1703 0 +0 1826 0 +0 1951 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1831 725 1543 +1829 737 1540 +1826 752 1536 +1822 771 1530 +1817 795 1523 +1809 826 1512 +1800 864 1498 +1786 910 1478 +1767 965 1449 +1741 1030 1409 +1703 1105 1348 +1648 1188 1251 +1560 1280 1077 +1409 1380 634 +1067 1486 0 +0 1598 0 +0 1714 0 +0 1834 0 +0 1957 0 +0 2082 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1965 838 1675 +1964 847 1672 +1962 859 1669 +1959 874 1665 +1955 894 1659 +1949 918 1652 +1942 950 1641 +1932 988 1626 +1919 1035 1606 +1900 1092 1578 +1874 1157 1537 +1837 1232 1475 +1781 1317 1377 +1694 1409 1201 +1543 1510 744 +1203 1617 0 +0 1729 0 +0 1845 0 +0 1966 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +2099 956 1806 +2098 963 1805 +2097 972 1802 +2094 983 1799 +2091 999 1795 +2087 1019 1789 +2082 1044 1781 +2075 1076 1771 +2065 1115 1756 +2052 1162 1736 +2033 1219 1707 +2007 1285 1666 +1969 1361 1604 +1914 1446 1505 +1827 1539 1326 +1676 1640 858 +1338 1747 0 +0 1860 0 +0 1977 0 +0 2097 0 +0 2220 0 +0 2345 0 +0 2472 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2233 1076 1938 +2232 1082 1937 +2231 1089 1935 +2229 1098 1933 +2227 1110 1929 +2224 1125 1925 +2220 1146 1919 +2215 1171 1912 +2208 1203 1901 +2198 1243 1886 +2184 1291 1866 +2166 1348 1837 +2140 1415 1796 +2102 1491 1733 +2047 1576 1634 +1960 1670 1454 +1810 1771 976 +1473 1878 0 +0 1991 0 +0 2108 0 +0 2229 0 +0 2352 0 +0 2477 0 +0 2604 0 +0 2732 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2366 1200 2070 +2365 1204 2069 +2364 1209 2068 +2363 1216 2066 +2361 1226 2063 +2359 1238 2060 +2356 1253 2056 +2352 1274 2050 +2347 1299 2042 +2340 1332 2032 +2330 1371 2017 +2317 1420 1997 +2298 1477 1968 +2272 1544 1926 +2235 1621 1863 +2179 1707 1763 +2092 1801 1582 +1943 1902 1098 +1607 2010 0 +0 2123 0 +0 2240 0 +0 2360 0 +0 2484 0 +0 2609 0 +0 2736 0 +0 2864 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2499 1325 2202 +2498 1328 2201 +2498 1332 2200 +2497 1338 2199 +2495 1345 2197 +2494 1354 2195 +2492 1367 2191 +2489 1382 2187 +2485 1403 2181 +2480 1429 2174 +2472 1461 2163 +2463 1501 2148 +2449 1550 2128 +2431 1608 2099 +2404 1675 2057 +2367 1752 1994 +2312 1838 1894 +2225 1932 1711 +2075 2033 1222 +1740 2141 0 +0 2254 0 +0 2371 0 +0 2492 0 +0 2616 0 +0 2741 0 +0 2868 0 +0 2996 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2631 1452 2334 +2631 1455 2333 +2630 1458 2332 +2630 1462 2331 +2629 1467 2330 +2628 1474 2328 +2626 1484 2326 +2624 1496 2323 +2621 1512 2319 +2617 1533 2313 +2612 1559 2305 +2605 1591 2294 +2595 1631 2279 +2581 1680 2259 +2563 1738 2230 +2537 1806 2188 +2499 1883 2125 +2444 1969 2024 +2357 2063 1842 +2208 2165 1348 +1873 2273 0 +0 2386 0 +0 2503 0 +0 2624 0 +0 2748 0 +0 2873 0 +0 3000 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2764 1581 2466 +2764 1582 2465 +2763 1585 2465 +2763 1588 2464 +2762 1592 2463 +2761 1597 2462 +2760 1605 2460 +2758 1614 2458 +2756 1626 2454 +2753 1642 2450 +2749 1663 2444 +2744 1689 2436 +2737 1722 2426 +2727 1762 2411 +2714 1811 2390 +2695 1869 2361 +2669 1937 2319 +2632 2014 2256 +2576 2100 2155 +2490 2195 1972 +2340 2297 1475 +2006 2405 0 +0 2518 0 +0 2635 0 +0 2756 0 +0 2880 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1710 2598 +2896 1711 2597 +2896 1713 2597 +2895 1715 2596 +2895 1718 2596 +2894 1723 2595 +2893 1728 2593 +2892 1735 2592 +2891 1745 2589 +2888 1757 2586 +2885 1773 2582 +2882 1794 2576 +2876 1820 2568 +2869 1853 2557 +2859 1893 2542 +2846 1942 2522 +2827 2001 2493 +2801 2068 2451 +2764 2146 2388 +2709 2232 2287 +2622 2326 2103 +2473 2428 1604 +2139 2536 0 +0 2650 0 +0 2767 0 +0 2888 0 +0 3012 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +3029 1840 2730 +3028 1841 2729 +3028 1842 2729 +3028 1844 2729 +3028 1846 2728 +3027 1849 2727 +3026 1854 2726 +3026 1859 2725 +3024 1866 2723 +3023 1876 2721 +3021 1888 2718 +3018 1904 2714 +3014 1925 2708 +3008 1951 2700 +3001 1984 2689 +2992 2025 2674 +2978 2074 2654 +2960 2132 2625 +2933 2200 2582 +2896 2277 2519 +2841 2364 2418 +2754 2458 2234 +2605 2560 1733 +2271 2668 0 +0 2782 0 +0 2899 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3161 1970 2862 +3161 1971 2862 +3161 1972 2861 +3160 1973 2861 +3160 1975 2861 +3160 1978 2860 +3159 1981 2859 +3159 1985 2858 +3158 1990 2857 +3156 1998 2855 +3155 2007 2853 +3153 2020 2850 +3150 2036 2845 +3146 2056 2840 +3141 2083 2832 +3133 2115 2821 +3124 2156 2806 +3110 2205 2785 +3092 2264 2756 +3066 2332 2714 +3028 2409 2651 +2973 2495 2550 +2887 2590 2366 +2737 2692 1864 +2403 2800 0 +0 2914 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3293 2101 2994 +3293 2102 2994 +3293 2103 2993 +3293 2104 2993 +3293 2105 2993 +3292 2107 2993 +3292 2109 2992 +3291 2112 2991 +3291 2116 2990 +3290 2122 2989 +3289 2129 2987 +3287 2139 2985 +3285 2151 2982 +3282 2167 2977 +3278 2188 2972 +3273 2214 2964 +3266 2247 2953 +3256 2288 2938 +3242 2337 2917 +3224 2395 2888 +3198 2463 2846 +3160 2541 2783 +3105 2627 2682 +3019 2722 2497 +2869 2824 1994 +2536 2932 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3660 0 +3425 2232 3126 +3425 2233 3126 +3425 2233 3126 +3425 2234 3125 +3425 2235 3125 +3425 2236 3125 +3424 2238 3125 +3424 2241 3124 +3424 2244 3123 +3423 2248 3122 +3422 2253 3121 +3421 2261 3119 +3419 2270 3117 +3417 2283 3114 +3414 2299 3109 +3410 2320 3103 +3405 2346 3096 +3398 2379 3085 +3388 2420 3070 +3375 2469 3049 +3356 2527 3020 +3330 2595 2978 +3293 2673 2915 +3237 2759 2814 +3151 2854 2629 +3002 2956 2125 +2668 3064 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2364 3258 +3557 2364 3258 +3557 2365 3258 +3557 2365 3258 +3557 2366 3257 +3557 2367 3257 +3557 2368 3257 +3557 2370 3257 +3556 2372 3256 +3556 2375 3255 +3555 2380 3254 +3554 2385 3253 +3553 2392 3251 +3551 2402 3249 +3549 2414 3246 +3546 2431 3241 +3542 2451 3235 +3537 2478 3228 +3530 2511 3217 +3520 2551 3202 +3507 2601 3181 +3488 2659 3152 +3462 2727 3110 +3425 2805 3047 +3369 2891 2945 +3283 2986 2761 +3134 3088 2256 +2800 3196 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3690 2495 3390 +3690 2496 3390 +3690 2496 3390 +3689 2496 3390 +3689 2497 3390 +3689 2498 3389 +3689 2499 3389 +3689 2500 3389 +3689 2502 3389 +3688 2504 3388 +3688 2507 3387 +3687 2511 3386 +3686 2517 3385 +3685 2524 3383 +3683 2534 3381 +3681 2546 3378 +3678 2562 3373 +3674 2583 3368 +3669 2610 3360 +3662 2643 3349 +3652 2683 3334 +3639 2733 3313 +3620 2791 3284 +3594 2859 3242 +3557 2937 3179 +3502 3023 3077 +3415 3118 2893 +3266 3220 2388 +2932 3328 0 +0 3442 0 +0 3559 0 +0 3680 0 +3822 2627 3522 +3822 2627 3522 +3822 2628 3522 +3822 2628 3522 +3822 2628 3522 +3821 2629 3522 +3821 2630 3522 +3821 2631 3521 +3821 2632 3521 +3821 2634 3521 +3820 2636 3520 +3820 2639 3519 +3819 2643 3518 +3818 2649 3517 +3817 2656 3515 +3815 2666 3513 +3813 2678 3510 +3810 2694 3505 +3807 2715 3500 +3801 2742 3492 +3794 2775 3481 +3784 2815 3466 +3771 2865 3445 +3752 2923 3416 +3726 2991 3374 +3689 3069 3311 +3634 3155 3209 +3547 3250 3025 +3398 3352 2520 +3065 3460 0 +0 3574 0 +0 3691 0 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3953 2762 3654 +3953 2763 3653 +3953 2764 3653 +3953 2766 3653 +3952 2768 3652 +3952 2771 3651 +3951 2775 3650 +3950 2781 3649 +3949 2788 3647 +3948 2798 3645 +3945 2810 3642 +3943 2826 3637 +3939 2847 3632 +3933 2873 3624 +3926 2907 3613 +3916 2947 3598 +3903 2997 3577 +3884 3055 3548 +3858 3123 3506 +3821 3201 3443 +3766 3287 3341 +3679 3382 3157 +3530 3484 2651 +3197 3592 0 +0 3706 0 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2894 3786 +4085 2895 3785 +4085 2896 3785 +4085 2898 3785 +4085 2900 3784 +4084 2903 3783 +4083 2907 3782 +4083 2913 3781 +4081 2920 3779 +4080 2930 3777 +4078 2942 3774 +4075 2958 3770 +4071 2979 3764 +4065 3005 3756 +4058 3039 3745 +4049 3079 3730 +4035 3129 3709 +4017 3187 3680 +3991 3255 3638 +3953 3333 3575 +3898 3419 3473 +3811 3514 3289 +3662 3616 2783 +3329 3725 0 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3917 +4095 3030 3917 +4095 3032 3916 +4095 3035 3916 +4095 3039 3915 +4095 3045 3913 +4095 3052 3911 +4095 3062 3909 +4095 3074 3906 +4095 3090 3902 +4095 3111 3896 +4095 3138 3888 +4095 3171 3877 +4095 3211 3862 +4095 3261 3842 +4095 3319 3812 +4095 3387 3770 +4085 3465 3707 +4030 3551 3606 +3944 3646 3421 +3794 3748 2915 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3156 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3167 4048 +4095 3171 4047 +4095 3177 4045 +4095 3184 4044 +4095 3194 4041 +4095 3206 4038 +4095 3222 4034 +4095 3243 4028 +4095 3270 4020 +4095 3303 4009 +4095 3343 3994 +4095 3393 3974 +4095 3451 3944 +4095 3519 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 33 135 +0 83 61 +0 142 0 +0 211 0 +0 290 0 +0 377 0 +0 473 0 +0 576 0 +0 684 0 +0 798 0 +0 916 0 +0 1037 0 +0 1161 0 +0 1287 0 +0 1414 0 +0 1543 0 +0 1672 0 +0 1802 0 +0 1933 0 +0 2064 0 +0 2195 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +11 50 228 +0 99 168 +0 156 74 +0 223 0 +0 300 0 +0 386 0 +0 480 0 +0 581 0 +0 689 0 +0 802 0 +0 919 0 +0 1039 0 +0 1163 0 +0 1288 0 +0 1415 0 +0 1543 0 +0 1673 0 +0 1803 0 +0 1933 0 +0 2064 0 +0 2195 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +271 73 329 +199 119 281 +79 174 209 +0 239 91 +0 313 0 +0 397 0 +0 489 0 +0 588 0 +0 694 0 +0 806 0 +0 922 0 +0 1042 0 +0 1165 0 +0 1290 0 +0 1416 0 +0 1544 0 +0 1673 0 +0 1803 0 +0 1934 0 +0 2064 0 +0 2195 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +480 102 436 +435 145 399 +368 197 344 +259 259 259 +54 330 113 +0 411 0 +0 500 0 +0 597 0 +0 702 0 +0 812 0 +0 927 0 +0 1045 0 +0 1167 0 +0 1292 0 +0 1418 0 +0 1546 0 +0 1674 0 +0 1804 0 +0 1934 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2458 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +662 137 548 +632 177 519 +590 226 478 +526 284 416 +424 352 318 +237 429 140 +0 515 0 +0 610 0 +0 711 0 +0 819 0 +0 933 0 +0 1050 0 +0 1171 0 +0 1294 0 +0 1420 0 +0 1547 0 +0 1675 0 +0 1805 0 +0 1935 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +828 181 665 +808 217 643 +779 262 612 +738 316 566 +677 380 498 +579 453 386 +403 535 175 +0 626 0 +0 724 0 +0 830 0 +0 941 0 +0 1056 0 +0 1176 0 +0 1298 0 +0 1423 0 +0 1549 0 +0 1677 0 +0 1806 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +984 233 785 +970 266 768 +950 307 745 +922 356 712 +882 414 663 +822 482 588 +728 560 464 +559 646 217 +144 741 0 +0 843 0 +0 951 0 +0 1064 0 +0 1182 0 +0 1303 0 +0 1426 0 +0 1552 0 +0 1679 0 +0 1807 0 +0 1937 0 +0 2067 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1133 295 908 +1123 324 895 +1109 360 878 +1089 404 853 +1062 457 818 +1023 519 766 +964 591 686 +872 672 551 +709 762 268 +318 860 0 +0 964 0 +0 1075 0 +0 1190 0 +0 1309 0 +0 1431 0 +0 1555 0 +0 1682 0 +0 1809 0 +0 1938 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1277 366 1033 +1270 391 1024 +1260 422 1010 +1246 461 992 +1227 508 967 +1200 564 930 +1161 629 876 +1103 705 791 +1013 789 646 +853 882 329 +479 982 0 +0 1088 0 +0 1201 0 +0 1317 0 +0 1437 0 +0 1560 0 +0 1685 0 +0 1812 0 +0 1940 0 +0 2069 0 +0 2199 0 +0 2330 0 +0 2460 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1418 447 1160 +1413 468 1153 +1406 494 1143 +1396 528 1129 +1382 568 1111 +1363 618 1084 +1336 677 1046 +1298 745 990 +1241 822 902 +1151 909 748 +994 1004 399 +631 1106 0 +0 1214 0 +0 1328 0 +0 1446 0 +0 1567 0 +0 1690 0 +0 1816 0 +0 1943 0 +0 2072 0 +0 2201 0 +0 2331 0 +0 2461 0 +0 2592 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1557 537 1288 +1553 554 1283 +1548 576 1275 +1540 604 1265 +1531 639 1251 +1517 681 1232 +1498 733 1205 +1471 793 1166 +1433 864 1108 +1377 944 1017 +1288 1032 857 +1133 1129 478 +778 1232 0 +0 1342 0 +0 1456 0 +0 1575 0 +0 1697 0 +0 1821 0 +0 1947 0 +0 2074 0 +0 2203 0 +0 2332 0 +0 2463 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1694 634 1417 +1691 648 1413 +1687 666 1408 +1682 689 1400 +1675 718 1390 +1665 754 1376 +1651 798 1356 +1632 851 1329 +1606 914 1289 +1568 986 1230 +1512 1067 1136 +1424 1157 970 +1270 1255 567 +921 1360 0 +0 1471 0 +0 1586 0 +0 1705 0 +0 1827 0 +0 1952 0 +0 2078 0 +0 2206 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1830 738 1547 +1828 750 1544 +1825 764 1540 +1821 783 1534 +1815 806 1527 +1808 836 1516 +1798 873 1502 +1785 919 1482 +1766 973 1454 +1740 1037 1414 +1702 1110 1354 +1646 1193 1258 +1558 1284 1088 +1406 1383 663 +1061 1489 0 +0 1600 0 +0 1716 0 +0 1836 0 +0 1958 0 +0 2083 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1965 849 1678 +1963 857 1675 +1961 869 1672 +1958 884 1668 +1954 903 1662 +1949 927 1655 +1941 958 1644 +1932 996 1630 +1918 1042 1610 +1899 1097 1582 +1873 1162 1541 +1835 1237 1480 +1780 1320 1383 +1692 1412 1209 +1541 1512 766 +1199 1618 0 +0 1730 0 +0 1847 0 +0 1966 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +2099 964 1809 +2098 970 1807 +2096 979 1804 +2094 991 1801 +2091 1006 1797 +2087 1026 1791 +2082 1051 1784 +2074 1082 1773 +2065 1120 1759 +2051 1167 1738 +2032 1224 1710 +2006 1289 1669 +1969 1364 1607 +1913 1449 1509 +1826 1542 1333 +1675 1642 876 +1335 1749 0 +0 1861 0 +0 1978 0 +0 2098 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2232 1083 1940 +2231 1088 1938 +2230 1095 1937 +2229 1104 1934 +2226 1116 1931 +2224 1131 1927 +2220 1151 1921 +2214 1176 1913 +2207 1208 1903 +2197 1247 1888 +2184 1294 1868 +2165 1351 1839 +2139 1417 1798 +2101 1493 1736 +2046 1578 1637 +1959 1671 1459 +1809 1772 990 +1470 1879 0 +0 1992 0 +0 2109 0 +0 2229 0 +0 2352 0 +0 2478 0 +0 2604 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2366 1204 2071 +2365 1208 2070 +2364 1214 2069 +2363 1221 2067 +2361 1230 2065 +2359 1242 2062 +2356 1258 2057 +2352 1278 2052 +2347 1303 2044 +2340 1335 2033 +2330 1375 2018 +2316 1423 1998 +2298 1480 1969 +2272 1547 1928 +2234 1623 1865 +2179 1708 1766 +2092 1802 1586 +1942 1903 1108 +1605 2010 0 +0 2123 0 +0 2240 0 +0 2361 0 +0 2484 0 +0 2609 0 +0 2736 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2498 1329 2203 +2498 1332 2202 +2497 1336 2201 +2496 1341 2200 +2495 1348 2198 +2494 1358 2196 +2491 1370 2192 +2488 1385 2188 +2485 1406 2182 +2479 1431 2175 +2472 1464 2164 +2462 1504 2149 +2449 1552 2129 +2430 1609 2100 +2404 1677 2058 +2367 1753 1995 +2311 1839 1896 +2225 1933 1714 +2075 2034 1230 +1739 2142 0 +0 2255 0 +0 2372 0 +0 2492 0 +0 2616 0 +0 2741 0 +0 2868 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2631 1455 2334 +2631 1457 2334 +2630 1460 2333 +2630 1464 2332 +2629 1470 2331 +2628 1477 2329 +2626 1486 2327 +2624 1499 2324 +2621 1514 2319 +2617 1535 2313 +2612 1561 2306 +2604 1593 2295 +2595 1633 2280 +2581 1682 2260 +2563 1740 2231 +2537 1807 2189 +2499 1884 2126 +2444 1970 2026 +2357 2064 1844 +2207 2165 1354 +1872 2273 0 +0 2386 0 +0 2504 0 +0 2624 0 +0 2748 0 +0 2873 0 +0 3000 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2764 1583 2466 +2763 1584 2466 +2763 1587 2465 +2763 1590 2464 +2762 1594 2464 +2761 1599 2462 +2760 1607 2460 +2758 1616 2458 +2756 1628 2455 +2753 1644 2451 +2749 1665 2445 +2744 1691 2437 +2737 1723 2426 +2727 1764 2411 +2714 1812 2391 +2695 1870 2362 +2669 1938 2320 +2631 2015 2257 +2576 2101 2156 +2490 2195 1974 +2340 2297 1480 +2005 2405 0 +0 2518 0 +0 2635 0 +0 2756 0 +0 2880 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1711 2598 +2896 1713 2598 +2896 1714 2597 +2895 1717 2597 +2895 1720 2596 +2894 1724 2595 +2893 1730 2594 +2892 1737 2592 +2890 1746 2590 +2888 1759 2586 +2885 1775 2582 +2881 1795 2576 +2876 1821 2568 +2869 1854 2558 +2859 1894 2543 +2846 1943 2522 +2827 2001 2493 +2801 2069 2451 +2764 2146 2388 +2708 2232 2288 +2622 2327 2104 +2472 2429 1608 +2138 2537 0 +0 2650 0 +0 2767 0 +0 2888 0 +0 3012 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +3029 1841 2730 +3028 1842 2730 +3028 1843 2729 +3028 1845 2729 +3028 1847 2728 +3027 1851 2728 +3026 1855 2727 +3025 1860 2725 +3024 1867 2724 +3023 1877 2721 +3020 1889 2718 +3018 1905 2714 +3014 1926 2708 +3008 1952 2700 +3001 1985 2689 +2991 2025 2675 +2978 2074 2654 +2959 2133 2625 +2933 2200 2583 +2896 2278 2520 +2841 2364 2419 +2754 2459 2235 +2605 2560 1736 +2271 2668 0 +0 2782 0 +0 2899 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3161 1971 2862 +3161 1972 2862 +3161 1973 2862 +3160 1974 2861 +3160 1976 2861 +3160 1978 2860 +3159 1981 2860 +3159 1986 2859 +3158 1991 2857 +3156 1998 2856 +3155 2008 2853 +3153 2020 2850 +3150 2036 2846 +3146 2057 2840 +3141 2083 2832 +3133 2116 2821 +3124 2157 2806 +3110 2206 2786 +3092 2264 2757 +3066 2332 2715 +3028 2409 2651 +2973 2496 2550 +2886 2590 2366 +2737 2692 1866 +2403 2800 0 +0 2914 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3293 2102 2994 +3293 2102 2994 +3293 2103 2994 +3293 2104 2993 +3292 2105 2993 +3292 2107 2993 +3292 2110 2992 +3291 2113 2991 +3291 2117 2990 +3290 2122 2989 +3289 2130 2987 +3287 2139 2985 +3285 2152 2982 +3282 2168 2978 +3278 2188 2972 +3273 2215 2964 +3266 2248 2953 +3256 2288 2938 +3242 2337 2918 +3224 2396 2888 +3198 2464 2846 +3160 2541 2783 +3105 2628 2682 +3019 2722 2498 +2869 2824 1996 +2536 2932 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3660 0 +3425 2233 3126 +3425 2233 3126 +3425 2234 3126 +3425 2235 3126 +3425 2236 3125 +3425 2237 3125 +3424 2239 3125 +3424 2241 3124 +3423 2244 3123 +3423 2248 3122 +3422 2254 3121 +3421 2261 3119 +3419 2271 3117 +3417 2283 3114 +3414 2299 3109 +3410 2320 3104 +3405 2346 3096 +3398 2379 3085 +3388 2420 3070 +3375 2469 3049 +3356 2527 3020 +3330 2595 2978 +3293 2673 2915 +3237 2759 2814 +3151 2854 2629 +3002 2956 2126 +2668 3064 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2364 3258 +3557 2365 3258 +3557 2365 3258 +3557 2365 3258 +3557 2366 3258 +3557 2367 3257 +3557 2369 3257 +3556 2370 3257 +3556 2373 3256 +3556 2376 3255 +3555 2380 3254 +3554 2386 3253 +3553 2393 3251 +3551 2402 3249 +3549 2415 3246 +3546 2431 3241 +3542 2452 3236 +3537 2478 3228 +3530 2511 3217 +3520 2552 3202 +3507 2601 3181 +3488 2659 3152 +3462 2727 3110 +3425 2805 3047 +3369 2891 2946 +3283 2986 2761 +3134 3088 2257 +2800 3196 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3690 2496 3390 +3690 2496 3390 +3690 2496 3390 +3689 2497 3390 +3689 2497 3390 +3689 2498 3390 +3689 2499 3389 +3689 2500 3389 +3689 2502 3389 +3688 2504 3388 +3688 2508 3387 +3687 2512 3386 +3686 2517 3385 +3685 2525 3383 +3683 2534 3381 +3681 2547 3378 +3678 2563 3373 +3674 2583 3368 +3669 2610 3360 +3662 2643 3349 +3652 2683 3334 +3639 2733 3313 +3620 2791 3284 +3594 2859 3242 +3557 2937 3179 +3501 3023 3078 +3415 3118 2893 +3266 3220 2389 +2932 3328 0 +0 3442 0 +0 3559 0 +0 3680 0 +3822 2627 3522 +3822 2628 3522 +3822 2628 3522 +3822 2628 3522 +3822 2628 3522 +3821 2629 3522 +3821 2630 3522 +3821 2631 3521 +3821 2632 3521 +3821 2634 3521 +3820 2636 3520 +3820 2639 3519 +3819 2644 3518 +3818 2649 3517 +3817 2656 3515 +3815 2666 3513 +3813 2678 3510 +3810 2695 3505 +3806 2715 3500 +3801 2742 3492 +3794 2775 3481 +3784 2815 3466 +3771 2865 3445 +3752 2923 3416 +3726 2991 3374 +3689 3069 3311 +3634 3155 3210 +3547 3250 3025 +3398 3352 2520 +3065 3460 0 +0 3574 0 +0 3691 0 +3954 2759 3654 +3954 2759 3654 +3954 2759 3654 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3953 2762 3654 +3953 2763 3653 +3953 2764 3653 +3953 2766 3653 +3952 2768 3652 +3952 2771 3651 +3951 2775 3650 +3950 2781 3649 +3949 2788 3647 +3948 2798 3645 +3945 2810 3642 +3943 2826 3637 +3939 2847 3632 +3933 2874 3624 +3926 2907 3613 +3916 2947 3598 +3903 2997 3577 +3884 3055 3548 +3858 3123 3506 +3821 3201 3443 +3766 3287 3342 +3679 3382 3157 +3530 3484 2652 +3197 3593 0 +0 3706 0 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2894 3786 +4085 2895 3785 +4085 2896 3785 +4085 2898 3785 +4085 2900 3784 +4084 2903 3783 +4083 2907 3782 +4082 2913 3781 +4081 2920 3779 +4080 2930 3777 +4078 2942 3774 +4075 2958 3770 +4071 2979 3764 +4065 3006 3756 +4058 3039 3745 +4048 3079 3730 +4035 3129 3710 +4017 3187 3680 +3990 3255 3638 +3953 3333 3575 +3898 3419 3474 +3811 3514 3289 +3662 3616 2783 +3329 3725 0 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3917 +4095 3030 3917 +4095 3032 3916 +4095 3035 3916 +4095 3039 3915 +4095 3045 3913 +4095 3052 3911 +4095 3062 3909 +4095 3074 3906 +4095 3090 3902 +4095 3111 3896 +4095 3138 3888 +4095 3171 3877 +4095 3211 3862 +4095 3261 3842 +4095 3319 3812 +4095 3387 3770 +4085 3465 3707 +4030 3552 3606 +3944 3646 3421 +3794 3748 2915 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3156 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3167 4048 +4095 3171 4047 +4095 3177 4045 +4095 3184 4044 +4095 3194 4041 +4095 3206 4038 +4095 3222 4034 +4095 3243 4028 +4095 3270 4020 +4095 3303 4009 +4095 3343 3994 +4095 3393 3974 +4095 3451 3944 +4095 3519 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 108 241 +0 151 183 +0 203 91 +0 264 0 +0 334 0 +0 414 0 +0 503 0 +0 600 0 +0 704 0 +0 813 0 +0 928 0 +0 1046 0 +0 1168 0 +0 1292 0 +0 1418 0 +0 1546 0 +0 1674 0 +0 1804 0 +0 1934 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 123 316 +0 165 267 +0 215 193 +0 274 69 +0 343 0 +0 422 0 +0 509 0 +0 605 0 +0 708 0 +0 816 0 +0 930 0 +0 1048 0 +0 1170 0 +0 1293 0 +0 1419 0 +0 1546 0 +0 1675 0 +0 1804 0 +0 1934 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +225 143 400 +144 182 360 +6 231 300 +0 288 206 +0 355 37 +0 432 0 +0 518 0 +0 612 0 +0 713 0 +0 821 0 +0 934 0 +0 1051 0 +0 1171 0 +0 1295 0 +0 1420 0 +0 1547 0 +0 1676 0 +0 1805 0 +0 1935 0 +0 2065 0 +0 2196 0 +0 2327 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +451 167 493 +403 205 461 +331 251 413 +211 306 341 +0 371 223 +0 445 0 +0 529 0 +0 621 0 +0 720 0 +0 826 0 +0 938 0 +0 1054 0 +0 1174 0 +0 1297 0 +0 1422 0 +0 1548 0 +0 1676 0 +0 1805 0 +0 1935 0 +0 2066 0 +0 2196 0 +0 2328 0 +0 2459 0 +0 2590 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +643 198 593 +612 234 568 +567 277 531 +500 329 476 +391 391 391 +186 462 245 +0 543 0 +0 632 0 +0 730 0 +0 834 0 +0 944 0 +0 1059 0 +0 1178 0 +0 1299 0 +0 1424 0 +0 1550 0 +0 1678 0 +0 1806 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +815 237 700 +794 269 680 +765 310 651 +722 358 610 +658 417 548 +556 484 450 +369 561 272 +0 647 0 +0 742 0 +0 844 0 +0 952 0 +0 1065 0 +0 1182 0 +0 1303 0 +0 1426 0 +0 1552 0 +0 1679 0 +0 1808 0 +0 1937 0 +0 2067 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +974 283 813 +960 313 797 +940 350 775 +911 395 744 +870 448 699 +809 512 630 +711 585 518 +535 667 307 +81 758 0 +0 856 0 +0 962 0 +0 1073 0 +0 1188 0 +0 1308 0 +0 1430 0 +0 1555 0 +0 1681 0 +0 1809 0 +0 1938 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1126 339 929 +1116 365 917 +1102 398 900 +1082 439 877 +1054 488 844 +1014 546 795 +954 614 720 +860 692 596 +691 778 349 +276 873 0 +0 975 0 +0 1083 0 +0 1196 0 +0 1314 0 +0 1435 0 +0 1558 0 +0 1684 0 +0 1811 0 +0 1939 0 +0 2069 0 +0 2199 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1272 404 1049 +1265 427 1040 +1255 456 1027 +1241 492 1010 +1221 536 985 +1194 589 950 +1155 651 898 +1096 723 818 +1004 804 683 +841 894 400 +450 992 0 +0 1096 0 +0 1207 0 +0 1322 0 +0 1441 0 +0 1563 0 +0 1688 0 +0 1814 0 +0 1942 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1415 479 1172 +1409 499 1165 +1402 523 1156 +1392 554 1143 +1378 593 1124 +1359 640 1099 +1332 696 1062 +1293 762 1008 +1235 837 923 +1145 921 778 +985 1014 461 +611 1114 0 +0 1221 0 +0 1333 0 +0 1449 0 +0 1569 0 +0 1692 0 +0 1817 0 +0 1944 0 +0 2072 0 +0 2202 0 +0 2331 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1555 563 1298 +1551 579 1292 +1545 600 1285 +1538 627 1275 +1528 660 1262 +1514 701 1243 +1495 750 1216 +1468 809 1178 +1430 877 1122 +1373 955 1034 +1283 1041 880 +1127 1136 531 +763 1238 0 +0 1347 0 +0 1460 0 +0 1578 0 +0 1699 0 +0 1822 0 +0 1948 0 +0 2075 0 +0 2204 0 +0 2333 0 +0 2463 0 +0 2593 0 +0 2724 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1692 656 1424 +1689 669 1420 +1685 686 1415 +1680 708 1408 +1673 736 1397 +1663 771 1384 +1649 813 1364 +1630 865 1337 +1604 926 1298 +1565 996 1240 +1509 1076 1149 +1420 1164 989 +1265 1261 610 +910 1365 0 +0 1474 0 +0 1589 0 +0 1707 0 +0 1829 0 +0 1953 0 +0 2079 0 +0 2206 0 +0 2335 0 +0 2464 0 +0 2595 0 +0 2725 0 +0 2856 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1828 756 1553 +1826 766 1550 +1823 780 1545 +1819 798 1540 +1814 821 1532 +1807 850 1522 +1797 886 1508 +1783 930 1488 +1764 983 1461 +1738 1046 1421 +1700 1118 1362 +1644 1199 1268 +1556 1289 1103 +1402 1387 699 +1053 1492 0 +0 1603 0 +0 1718 0 +0 1837 0 +0 1959 0 +0 2084 0 +0 2210 0 +0 2338 0 +0 2467 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1964 862 1682 +1962 871 1679 +1960 882 1676 +1957 896 1672 +1953 915 1667 +1948 938 1659 +1940 968 1649 +1930 1006 1634 +1917 1051 1614 +1898 1105 1586 +1872 1169 1546 +1834 1243 1486 +1778 1325 1391 +1690 1416 1220 +1538 1515 795 +1193 1621 0 +0 1732 0 +0 1848 0 +0 1968 0 +0 2090 0 +0 2215 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3646 0 +2098 974 1812 +2097 981 1810 +2095 989 1808 +2093 1001 1804 +2090 1016 1800 +2086 1035 1795 +2081 1059 1787 +2074 1090 1776 +2064 1128 1762 +2050 1174 1742 +2032 1230 1714 +2005 1294 1673 +1968 1369 1612 +1912 1452 1515 +1824 1545 1341 +1673 1644 898 +1331 1751 0 +0 1862 0 +0 1979 0 +0 2099 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +2232 1091 1942 +2231 1096 1941 +2230 1103 1939 +2228 1111 1937 +2226 1123 1933 +2223 1138 1929 +2219 1158 1924 +2214 1183 1916 +2206 1214 1905 +2197 1253 1891 +2183 1300 1870 +2165 1356 1842 +2138 1421 1801 +2101 1497 1739 +2045 1581 1641 +1958 1674 1465 +1807 1774 1008 +1467 1881 0 +0 1993 0 +0 2110 0 +0 2230 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2365 1211 2073 +2364 1215 2072 +2364 1220 2071 +2362 1227 2069 +2361 1236 2066 +2359 1248 2063 +2356 1263 2059 +2352 1283 2053 +2346 1308 2046 +2339 1340 2035 +2329 1379 2020 +2316 1427 2000 +2297 1483 1971 +2271 1550 1930 +2234 1625 1868 +2178 1710 1769 +2091 1804 1591 +1941 1904 1122 +1603 2011 0 +0 2124 0 +0 2241 0 +0 2361 0 +0 2484 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2498 1334 2204 +2498 1337 2203 +2497 1341 2202 +2496 1346 2201 +2495 1353 2199 +2493 1362 2197 +2491 1374 2194 +2488 1390 2189 +2484 1410 2184 +2479 1435 2176 +2472 1467 2165 +2462 1507 2150 +2449 1555 2130 +2430 1612 2101 +2404 1679 2060 +2366 1755 1997 +2311 1840 1898 +2224 1934 1718 +2074 2035 1241 +1737 2142 0 +0 2255 0 +0 2372 0 +0 2493 0 +0 2616 0 +0 2741 0 +0 2868 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2631 1459 2335 +2631 1461 2335 +2630 1464 2334 +2629 1468 2333 +2628 1473 2332 +2627 1480 2330 +2626 1490 2328 +2624 1502 2324 +2621 1518 2320 +2617 1538 2314 +2611 1564 2307 +2604 1596 2296 +2594 1636 2281 +2581 1684 2261 +2562 1742 2232 +2536 1809 2190 +2499 1885 2128 +2443 1971 2028 +2357 2065 1846 +2207 2166 1362 +1871 2274 0 +0 2387 0 +0 2504 0 +0 2625 0 +0 2748 0 +0 2873 0 +0 3000 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2764 1585 2467 +2763 1587 2466 +2763 1589 2466 +2762 1593 2465 +2762 1597 2464 +2761 1602 2463 +2760 1609 2461 +2758 1618 2459 +2756 1631 2456 +2753 1647 2451 +2749 1667 2446 +2744 1693 2438 +2737 1725 2427 +2727 1765 2412 +2713 1814 2392 +2695 1872 2363 +2669 1939 2321 +2631 2016 2258 +2576 2102 2158 +2489 2196 1976 +2340 2297 1486 +2004 2405 0 +0 2518 0 +0 2636 0 +0 2756 0 +0 2880 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1713 2599 +2896 1715 2598 +2896 1717 2598 +2895 1719 2597 +2895 1722 2597 +2894 1726 2596 +2893 1731 2594 +2892 1739 2593 +2890 1748 2590 +2888 1760 2587 +2885 1776 2583 +2881 1797 2577 +2876 1823 2569 +2869 1855 2558 +2859 1896 2544 +2846 1944 2523 +2827 2002 2494 +2801 2070 2452 +2764 2147 2389 +2708 2233 2289 +2622 2327 2106 +2472 2429 1612 +2137 2537 0 +0 2650 0 +0 2767 0 +0 2888 0 +0 3012 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +3028 1843 2730 +3028 1844 2730 +3028 1845 2730 +3028 1847 2729 +3027 1849 2729 +3027 1852 2728 +3026 1856 2727 +3025 1862 2726 +3024 1869 2724 +3023 1878 2722 +3020 1891 2719 +3017 1907 2714 +3014 1927 2708 +3008 1953 2701 +3001 1986 2690 +2991 2026 2675 +2978 2075 2654 +2959 2133 2625 +2933 2201 2583 +2896 2278 2520 +2840 2364 2420 +2754 2459 2236 +2605 2561 1740 +2270 2669 0 +0 2782 0 +0 2899 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3161 1972 2862 +3161 1973 2862 +3160 1974 2862 +3160 1975 2862 +3160 1977 2861 +3160 1980 2861 +3159 1983 2860 +3158 1987 2859 +3158 1992 2858 +3156 1999 2856 +3155 2009 2853 +3153 2021 2850 +3150 2037 2846 +3146 2058 2840 +3140 2084 2832 +3133 2117 2821 +3124 2157 2807 +3110 2206 2786 +3092 2265 2757 +3065 2333 2715 +3028 2410 2652 +2973 2496 2551 +2886 2591 2367 +2737 2692 1868 +2403 2801 0 +0 2914 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3293 2103 2994 +3293 2103 2994 +3293 2104 2994 +3293 2105 2994 +3292 2106 2993 +3292 2108 2993 +3292 2110 2992 +3291 2114 2992 +3291 2118 2991 +3290 2123 2989 +3289 2130 2988 +3287 2140 2985 +3285 2152 2982 +3282 2168 2978 +3278 2189 2972 +3273 2215 2964 +3265 2248 2953 +3256 2289 2938 +3242 2338 2918 +3224 2396 2889 +3198 2464 2847 +3160 2541 2784 +3105 2628 2682 +3019 2722 2498 +2869 2824 1998 +2535 2932 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3660 0 +3425 2234 3126 +3425 2234 3126 +3425 2235 3126 +3425 2235 3126 +3425 2236 3126 +3425 2238 3125 +3424 2239 3125 +3424 2242 3124 +3423 2245 3124 +3423 2249 3123 +3422 2255 3121 +3421 2262 3119 +3419 2271 3117 +3417 2284 3114 +3414 2300 3110 +3410 2320 3104 +3405 2347 3096 +3398 2380 3085 +3388 2420 3070 +3374 2469 3050 +3356 2528 3021 +3330 2596 2978 +3292 2673 2915 +3237 2760 2814 +3151 2854 2630 +3001 2956 2128 +2668 3064 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2365 3258 +3557 2365 3258 +3557 2365 3258 +3557 2366 3258 +3557 2367 3258 +3557 2368 3257 +3557 2369 3257 +3556 2371 3257 +3556 2373 3256 +3556 2376 3255 +3555 2380 3254 +3554 2386 3253 +3553 2393 3251 +3551 2403 3249 +3549 2415 3246 +3546 2431 3242 +3542 2452 3236 +3537 2478 3228 +3530 2511 3217 +3520 2552 3202 +3507 2601 3182 +3488 2660 3152 +3462 2728 3110 +3425 2805 3047 +3369 2892 2946 +3283 2986 2761 +3134 3088 2258 +2800 3196 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3690 2496 3390 +3690 2496 3390 +3689 2497 3390 +3689 2497 3390 +3689 2498 3390 +3689 2498 3390 +3689 2499 3389 +3689 2501 3389 +3689 2502 3389 +3688 2505 3388 +3688 2508 3387 +3687 2512 3386 +3686 2518 3385 +3685 2525 3383 +3683 2534 3381 +3681 2547 3378 +3678 2563 3374 +3674 2584 3368 +3669 2610 3360 +3662 2643 3349 +3652 2684 3334 +3639 2733 3314 +3620 2791 3284 +3594 2859 3242 +3557 2937 3179 +3501 3023 3078 +3415 3118 2893 +3266 3220 2389 +2932 3328 0 +0 3442 0 +0 3559 0 +0 3680 0 +3822 2628 3522 +3822 2628 3522 +3822 2628 3522 +3822 2628 3522 +3822 2629 3522 +3821 2629 3522 +3821 2630 3522 +3821 2631 3521 +3821 2632 3521 +3821 2634 3521 +3820 2637 3520 +3820 2640 3519 +3819 2644 3518 +3818 2649 3517 +3817 2657 3515 +3815 2666 3513 +3813 2679 3510 +3810 2695 3506 +3806 2716 3500 +3801 2742 3492 +3794 2775 3481 +3784 2816 3466 +3771 2865 3446 +3752 2923 3416 +3726 2991 3374 +3689 3069 3311 +3634 3155 3210 +3547 3250 3025 +3398 3352 2521 +3064 3460 0 +0 3574 0 +0 3691 0 +3954 2759 3654 +3954 2759 3654 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3954 2761 3654 +3953 2762 3654 +3953 2763 3653 +3953 2764 3653 +3953 2766 3653 +3952 2768 3652 +3952 2772 3651 +3951 2776 3650 +3950 2781 3649 +3949 2788 3647 +3948 2798 3645 +3945 2811 3642 +3943 2827 3638 +3939 2847 3632 +3933 2874 3624 +3926 2907 3613 +3916 2947 3598 +3903 2997 3578 +3884 3055 3548 +3858 3123 3506 +3821 3201 3443 +3766 3287 3342 +3679 3382 3157 +3530 3484 2652 +3197 3593 0 +0 3706 0 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2891 3786 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2894 3786 +4085 2895 3786 +4085 2896 3785 +4085 2898 3785 +4085 2900 3784 +4084 2903 3784 +4083 2908 3783 +4082 2913 3781 +4081 2920 3779 +4080 2930 3777 +4078 2942 3774 +4075 2959 3770 +4071 2979 3764 +4065 3006 3756 +4058 3039 3745 +4048 3079 3730 +4035 3129 3710 +4017 3187 3680 +3990 3255 3638 +3953 3333 3575 +3898 3420 3474 +3811 3514 3289 +3662 3616 2784 +3329 3725 0 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3917 +4095 3030 3917 +4095 3032 3916 +4095 3035 3916 +4095 3040 3915 +4095 3045 3913 +4095 3052 3912 +4095 3062 3909 +4095 3074 3906 +4095 3091 3902 +4095 3111 3896 +4095 3138 3888 +4095 3171 3877 +4095 3211 3862 +4095 3261 3842 +4095 3319 3812 +4095 3387 3770 +4085 3465 3707 +4030 3552 3606 +3944 3646 3421 +3794 3748 2916 +4095 3155 4051 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3155 4050 +4095 3156 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3167 4048 +4095 3172 4047 +4095 3177 4045 +4095 3184 4044 +4095 3194 4041 +4095 3206 4038 +4095 3223 4034 +4095 3243 4028 +4095 3270 4020 +4095 3303 4009 +4095 3343 3994 +4095 3393 3974 +4095 3451 3945 +4095 3519 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 193 352 +0 229 307 +0 273 239 +0 326 129 +0 388 0 +0 459 0 +0 540 0 +0 630 0 +0 728 0 +0 833 0 +0 943 0 +0 1058 0 +0 1177 0 +0 1299 0 +0 1423 0 +0 1550 0 +0 1677 0 +0 1806 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 205 412 +0 240 373 +0 283 315 +0 335 223 +0 396 62 +0 466 0 +0 546 0 +0 635 0 +0 732 0 +0 836 0 +0 945 0 +0 1060 0 +0 1178 0 +0 1300 0 +0 1424 0 +0 1550 0 +0 1678 0 +0 1807 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +154 222 481 +58 255 448 +0 297 399 +0 347 325 +0 407 201 +0 476 0 +0 554 0 +0 641 0 +0 737 0 +0 840 0 +0 949 0 +0 1062 0 +0 1180 0 +0 1302 0 +0 1425 0 +0 1551 0 +0 1679 0 +0 1807 0 +0 1936 0 +0 2066 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +409 242 560 +357 275 532 +276 315 492 +138 363 433 +0 420 338 +0 488 170 +0 564 0 +0 650 0 +0 744 0 +0 845 0 +0 953 0 +0 1066 0 +0 1183 0 +0 1304 0 +0 1427 0 +0 1552 0 +0 1679 0 +0 1808 0 +0 1937 0 +0 2067 0 +0 2197 0 +0 2328 0 +0 2459 0 +0 2591 0 +0 2722 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +616 269 648 +583 299 625 +535 337 593 +463 383 546 +343 438 474 +109 503 355 +0 577 124 +0 661 0 +0 753 0 +0 852 0 +0 958 0 +0 1070 0 +0 1186 0 +0 1306 0 +0 1429 0 +0 1554 0 +0 1681 0 +0 1809 0 +0 1938 0 +0 2067 0 +0 2198 0 +0 2328 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +796 302 744 +775 330 726 +744 366 700 +700 409 663 +632 461 608 +523 523 523 +318 594 377 +0 675 54 +0 764 0 +0 862 0 +0 966 0 +0 1076 0 +0 1191 0 +0 1310 0 +0 1432 0 +0 1556 0 +0 1682 0 +0 1810 0 +0 1938 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +962 343 847 +947 369 832 +926 401 812 +897 442 784 +854 490 742 +790 549 680 +688 616 582 +501 693 404 +0 780 0 +0 874 0 +0 976 0 +0 1084 0 +0 1197 0 +0 1314 0 +0 1435 0 +0 1559 0 +0 1684 0 +0 1811 0 +0 1940 0 +0 2069 0 +0 2199 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1117 392 956 +1107 415 945 +1092 445 929 +1072 482 907 +1043 527 876 +1002 581 831 +941 644 762 +843 717 650 +667 799 439 +213 890 0 +0 988 0 +0 1094 0 +0 1205 0 +0 1320 0 +0 1440 0 +0 1562 0 +0 1687 0 +0 1813 0 +0 1941 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1266 450 1070 +1258 471 1061 +1248 497 1049 +1234 530 1032 +1214 571 1009 +1186 620 976 +1146 678 927 +1086 746 852 +992 824 728 +824 910 481 +408 1005 0 +0 1107 0 +0 1215 0 +0 1328 0 +0 1446 0 +0 1567 0 +0 1690 0 +0 1816 0 +0 1943 0 +0 2072 0 +0 2201 0 +0 2331 0 +0 2461 0 +0 2592 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1410 519 1188 +1405 536 1182 +1397 559 1172 +1387 588 1160 +1373 624 1142 +1353 668 1117 +1326 721 1082 +1287 783 1030 +1228 855 950 +1136 936 815 +973 1026 532 +582 1124 0 +0 1229 0 +0 1339 0 +0 1454 0 +0 1573 0 +0 1695 0 +0 1820 0 +0 1946 0 +0 2074 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1551 596 1310 +1547 611 1305 +1542 631 1297 +1534 655 1288 +1524 687 1275 +1510 725 1256 +1491 772 1231 +1464 828 1194 +1425 894 1140 +1367 969 1055 +1277 1053 910 +1117 1146 593 +743 1246 0 +0 1353 0 +0 1465 0 +0 1581 0 +0 1702 0 +0 1824 0 +0 1950 0 +0 2076 0 +0 2205 0 +0 2334 0 +0 2463 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1690 683 1434 +1687 695 1430 +1683 711 1424 +1677 732 1417 +1670 759 1407 +1660 792 1394 +1646 833 1375 +1627 882 1348 +1600 941 1310 +1562 1009 1254 +1505 1087 1166 +1415 1173 1013 +1259 1268 663 +895 1370 0 +0 1479 0 +0 1592 0 +0 1710 0 +0 1831 0 +0 1954 0 +0 2080 0 +0 2207 0 +0 2336 0 +0 2465 0 +0 2595 0 +0 2726 0 +0 2856 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1826 777 1560 +1824 788 1557 +1821 801 1552 +1817 818 1547 +1812 840 1540 +1805 868 1530 +1795 903 1516 +1781 945 1496 +1762 997 1469 +1736 1058 1430 +1697 1128 1372 +1641 1208 1281 +1552 1296 1121 +1397 1393 742 +1042 1497 0 +0 1606 0 +0 1721 0 +0 1839 0 +0 1961 0 +0 2085 0 +0 2211 0 +0 2338 0 +0 2467 0 +0 2597 0 +0 2727 0 +0 2857 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1962 880 1687 +1961 888 1685 +1958 898 1682 +1955 912 1678 +1951 930 1672 +1946 953 1664 +1939 982 1654 +1929 1018 1640 +1915 1062 1620 +1897 1116 1593 +1870 1178 1553 +1832 1250 1494 +1776 1331 1400 +1688 1422 1235 +1534 1520 831 +1185 1624 0 +0 1735 0 +0 1850 0 +0 1969 0 +0 2091 0 +0 2216 0 +0 2342 0 +0 2470 0 +0 2599 0 +0 2728 0 +0 2859 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2097 988 1815 +2096 994 1814 +2094 1003 1811 +2092 1014 1808 +2089 1028 1804 +2085 1047 1799 +2080 1071 1791 +2072 1100 1781 +2063 1138 1766 +2049 1183 1746 +2030 1237 1719 +2004 1301 1678 +1966 1375 1618 +1910 1457 1523 +1822 1548 1352 +1670 1647 927 +1325 1753 0 +0 1864 0 +0 1980 0 +0 2100 0 +0 2222 0 +0 2347 0 +0 2474 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +2231 1101 1945 +2230 1106 1944 +2229 1113 1942 +2227 1122 1940 +2225 1133 1936 +2222 1148 1932 +2218 1167 1927 +2213 1191 1919 +2206 1222 1908 +2196 1260 1894 +2182 1306 1874 +2164 1362 1846 +2137 1427 1805 +2100 1501 1744 +2044 1585 1647 +1956 1677 1473 +1805 1776 1031 +1463 1883 0 +0 1994 0 +0 2111 0 +0 2231 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2364 1219 2075 +2364 1223 2074 +2363 1228 2073 +2362 1235 2071 +2360 1244 2069 +2358 1255 2066 +2355 1270 2061 +2351 1290 2056 +2346 1315 2048 +2339 1346 2037 +2329 1385 2023 +2315 1432 2003 +2297 1488 1974 +2270 1553 1933 +2233 1629 1871 +2177 1713 1773 +2090 1806 1597 +1939 1906 1140 +1599 2013 0 +0 2125 0 +0 2242 0 +0 2362 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2498 1340 2206 +2497 1343 2205 +2497 1347 2204 +2496 1352 2203 +2494 1359 2201 +2493 1368 2199 +2491 1380 2195 +2488 1395 2191 +2484 1415 2185 +2478 1440 2178 +2471 1472 2167 +2461 1511 2152 +2448 1559 2132 +2429 1615 2103 +2403 1682 2062 +2366 1757 2000 +2310 1842 1901 +2223 1936 1723 +2073 2036 1254 +1735 2144 0 +0 2256 0 +0 2373 0 +0 2493 0 +0 2616 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2631 1463 2337 +2630 1466 2336 +2630 1469 2335 +2629 1473 2334 +2628 1478 2333 +2627 1485 2331 +2625 1494 2329 +2623 1506 2326 +2620 1522 2322 +2616 1542 2316 +2611 1567 2308 +2604 1599 2297 +2594 1639 2283 +2581 1687 2262 +2562 1744 2233 +2536 1811 2192 +2498 1887 2130 +2443 1972 2030 +2356 2066 1850 +2206 2167 1373 +1869 2275 0 +0 2387 0 +0 2504 0 +0 2625 0 +0 2748 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2763 1589 2468 +2763 1591 2467 +2763 1593 2467 +2762 1596 2466 +2761 1600 2465 +2761 1605 2464 +2759 1613 2462 +2758 1622 2460 +2756 1634 2457 +2753 1650 2452 +2749 1670 2447 +2743 1696 2439 +2736 1728 2428 +2727 1768 2413 +2713 1816 2393 +2694 1874 2364 +2668 1941 2322 +2631 2017 2260 +2575 2103 2160 +2489 2197 1978 +2339 2298 1494 +2003 2406 0 +0 2519 0 +0 2636 0 +0 2757 0 +0 2880 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1716 2599 +2896 1717 2599 +2895 1719 2599 +2895 1722 2598 +2894 1725 2597 +2894 1729 2596 +2893 1734 2595 +2892 1741 2593 +2890 1751 2591 +2888 1763 2588 +2885 1779 2583 +2881 1799 2578 +2876 1825 2570 +2869 1857 2559 +2859 1897 2544 +2845 1946 2524 +2827 2004 2495 +2801 2071 2453 +2763 2148 2390 +2708 2234 2290 +2621 2328 2108 +2472 2430 1618 +2136 2537 0 +0 2650 0 +0 2768 0 +0 2888 0 +0 3012 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +3028 1845 2731 +3028 1846 2731 +3028 1847 2730 +3028 1849 2730 +3027 1851 2729 +3027 1854 2729 +3026 1858 2728 +3025 1864 2726 +3024 1871 2725 +3022 1880 2722 +3020 1892 2719 +3017 1908 2715 +3013 1929 2709 +3008 1955 2701 +3001 1987 2690 +2991 2028 2676 +2978 2076 2655 +2959 2134 2626 +2933 2202 2584 +2896 2279 2521 +2840 2365 2421 +2754 2459 2238 +2604 2561 1744 +2269 2669 0 +0 2782 0 +0 2900 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3161 1974 2863 +3161 1975 2862 +3160 1976 2862 +3160 1977 2862 +3160 1979 2862 +3160 1981 2861 +3159 1984 2860 +3158 1988 2859 +3157 1994 2858 +3156 2001 2856 +3155 2010 2854 +3152 2023 2851 +3150 2039 2846 +3146 2059 2841 +3140 2085 2833 +3133 2118 2822 +3123 2158 2807 +3110 2207 2787 +3091 2266 2758 +3065 2333 2716 +3028 2410 2653 +2973 2497 2552 +2886 2591 2368 +2737 2693 1872 +2402 2801 0 +0 2914 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3293 2104 2994 +3293 2104 2994 +3293 2105 2994 +3293 2106 2994 +3292 2107 2994 +3292 2109 2993 +3292 2112 2993 +3291 2115 2992 +3291 2119 2991 +3290 2124 2990 +3288 2132 2988 +3287 2141 2986 +3285 2153 2982 +3282 2169 2978 +3278 2190 2972 +3273 2216 2964 +3265 2249 2954 +3256 2290 2939 +3242 2339 2918 +3224 2397 2889 +3198 2465 2847 +3160 2542 2784 +3105 2628 2683 +3018 2723 2499 +2869 2825 2000 +2535 2933 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3661 0 +3425 2234 3126 +3425 2235 3126 +3425 2235 3126 +3425 2236 3126 +3425 2237 3126 +3425 2238 3125 +3424 2240 3125 +3424 2243 3124 +3423 2246 3124 +3423 2250 3123 +3422 2255 3121 +3421 2263 3120 +3419 2272 3117 +3417 2284 3114 +3414 2301 3110 +3410 2321 3104 +3405 2347 3096 +3398 2380 3085 +3388 2421 3071 +3374 2470 3050 +3356 2528 3021 +3330 2596 2979 +3292 2674 2916 +3237 2760 2815 +3151 2855 2631 +3001 2956 2130 +2667 3065 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2365 3258 +3557 2366 3258 +3557 2366 3258 +3557 2367 3258 +3557 2367 3258 +3557 2368 3258 +3557 2370 3257 +3556 2371 3257 +3556 2374 3256 +3556 2377 3256 +3555 2381 3255 +3554 2387 3253 +3553 2394 3252 +3551 2403 3249 +3549 2416 3246 +3546 2432 3242 +3542 2453 3236 +3537 2479 3228 +3530 2512 3217 +3520 2552 3202 +3507 2602 3182 +3488 2660 3153 +3462 2728 3111 +3425 2805 3047 +3369 2892 2946 +3283 2986 2762 +3134 3088 2260 +2800 3197 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3690 2497 3390 +3690 2497 3390 +3689 2497 3390 +3689 2498 3390 +3689 2498 3390 +3689 2499 3390 +3689 2500 3390 +3689 2501 3389 +3689 2503 3389 +3688 2505 3388 +3688 2508 3388 +3687 2513 3387 +3686 2518 3385 +3685 2525 3384 +3683 2535 3381 +3681 2547 3378 +3678 2563 3374 +3674 2584 3368 +3669 2610 3360 +3662 2643 3349 +3652 2684 3334 +3639 2733 3314 +3620 2792 3285 +3594 2860 3242 +3557 2937 3179 +3501 3024 3078 +3415 3118 2894 +3266 3220 2391 +2932 3329 0 +0 3442 0 +0 3559 0 +0 3680 0 +3822 2628 3522 +3822 2628 3522 +3822 2628 3522 +3822 2629 3522 +3822 2629 3522 +3821 2630 3522 +3821 2630 3522 +3821 2631 3522 +3821 2633 3521 +3821 2635 3521 +3820 2637 3520 +3820 2640 3520 +3819 2644 3519 +3818 2650 3517 +3817 2657 3515 +3815 2667 3513 +3813 2679 3510 +3810 2695 3506 +3806 2716 3500 +3801 2742 3492 +3794 2775 3481 +3784 2816 3466 +3771 2865 3446 +3752 2924 3416 +3726 2992 3374 +3689 3069 3311 +3634 3156 3210 +3547 3250 3025 +3398 3352 2521 +3064 3461 0 +0 3574 0 +0 3692 0 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3954 2761 3654 +3953 2762 3654 +3953 2763 3654 +3953 2764 3653 +3953 2766 3653 +3952 2769 3652 +3952 2772 3652 +3951 2776 3651 +3950 2781 3649 +3949 2789 3647 +3948 2798 3645 +3945 2811 3642 +3942 2827 3638 +3939 2848 3632 +3933 2874 3624 +3926 2907 3613 +3916 2948 3598 +3903 2997 3578 +3884 3055 3548 +3858 3123 3506 +3821 3201 3443 +3766 3288 3342 +3679 3382 3157 +3530 3484 2653 +3197 3593 0 +0 3706 0 +4086 2891 3786 +4086 2891 3786 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2893 3786 +4086 2894 3786 +4085 2895 3786 +4085 2896 3785 +4085 2898 3785 +4085 2900 3784 +4084 2904 3784 +4083 2908 3783 +4082 2913 3781 +4081 2921 3780 +4080 2930 3777 +4078 2943 3774 +4075 2959 3770 +4071 2980 3764 +4065 3006 3756 +4058 3039 3745 +4048 3080 3730 +4035 3129 3710 +4017 3187 3680 +3990 3255 3638 +3953 3333 3575 +3898 3420 3474 +3811 3514 3289 +3662 3616 2784 +3329 3725 0 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3025 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3917 +4095 3030 3917 +4095 3032 3916 +4095 3036 3916 +4095 3040 3915 +4095 3045 3913 +4095 3052 3912 +4095 3062 3909 +4095 3075 3906 +4095 3091 3902 +4095 3111 3896 +4095 3138 3888 +4095 3171 3877 +4095 3212 3862 +4095 3261 3842 +4095 3319 3813 +4095 3387 3770 +4085 3465 3707 +4030 3552 3606 +3944 3646 3421 +3794 3748 2916 +4095 3155 4051 +4095 3155 4051 +4095 3155 4051 +4095 3155 4050 +4095 3155 4050 +4095 3156 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3167 4048 +4095 3172 4047 +4095 3177 4045 +4095 3184 4044 +4095 3194 4041 +4095 3206 4038 +4095 3223 4034 +4095 3243 4028 +4095 3270 4020 +4095 3303 4009 +4095 3344 3994 +4095 3393 3974 +4095 3451 3945 +4095 3520 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 286 468 +0 316 433 +0 352 383 +0 397 305 +0 450 175 +0 514 0 +0 586 0 +0 668 0 +0 759 0 +0 857 0 +0 962 0 +0 1073 0 +0 1189 0 +0 1308 0 +0 1430 0 +0 1555 0 +0 1681 0 +0 1809 0 +0 1938 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 296 515 +0 325 484 +0 361 439 +0 405 371 +0 458 261 +0 520 54 +0 592 0 +0 673 0 +0 762 0 +0 860 0 +0 965 0 +0 1075 0 +0 1190 0 +0 1309 0 +0 1431 0 +0 1556 0 +0 1682 0 +0 1810 0 +0 1938 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +38 310 571 +0 338 544 +0 372 505 +0 415 447 +0 467 355 +0 528 195 +0 599 0 +0 678 0 +0 767 0 +0 864 0 +0 968 0 +0 1077 0 +0 1192 0 +0 1311 0 +0 1432 0 +0 1556 0 +0 1682 0 +0 1810 0 +0 1939 0 +0 2068 0 +0 2198 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +347 327 637 +286 354 613 +190 387 580 +17 429 531 +0 479 457 +0 539 333 +0 608 87 +0 686 0 +0 774 0 +0 869 0 +0 972 0 +0 1081 0 +0 1194 0 +0 1312 0 +0 1434 0 +0 1558 0 +0 1683 0 +0 1811 0 +0 1939 0 +0 2069 0 +0 2199 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +577 349 712 +541 375 692 +489 407 664 +408 447 624 +270 495 565 +0 553 470 +0 620 302 +0 696 0 +0 782 0 +0 876 0 +0 977 0 +0 1085 0 +0 1198 0 +0 1315 0 +0 1436 0 +0 1559 0 +0 1684 0 +0 1812 0 +0 1940 0 +0 2069 0 +0 2199 0 +0 2329 0 +0 2460 0 +0 2591 0 +0 2723 0 +0 2854 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +771 377 796 +748 401 780 +715 431 757 +668 469 725 +595 515 678 +475 571 606 +241 635 487 +0 709 256 +0 793 0 +0 885 0 +0 984 0 +0 1091 0 +0 1202 0 +0 1318 0 +0 1438 0 +0 1561 0 +0 1686 0 +0 1813 0 +0 1941 0 +0 2070 0 +0 2199 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +944 411 889 +928 434 876 +907 462 858 +876 498 832 +832 541 795 +764 594 740 +655 655 655 +450 726 509 +0 807 186 +0 896 0 +0 994 0 +0 1098 0 +0 1208 0 +0 1323 0 +0 1442 0 +0 1564 0 +0 1688 0 +0 1814 0 +0 1942 0 +0 2071 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1105 454 990 +1094 475 979 +1079 501 965 +1058 533 944 +1029 574 916 +986 623 874 +922 681 813 +820 748 714 +633 825 536 +113 912 73 +0 1006 0 +0 1108 0 +0 1216 0 +0 1329 0 +0 1446 0 +0 1567 0 +0 1691 0 +0 1816 0 +0 1943 0 +0 2072 0 +0 2201 0 +0 2331 0 +0 2461 0 +0 2592 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1257 506 1097 +1249 524 1088 +1239 547 1077 +1224 577 1061 +1204 614 1039 +1175 659 1008 +1134 713 963 +1073 776 894 +975 849 783 +799 931 571 +345 1022 0 +0 1121 0 +0 1226 0 +0 1337 0 +0 1452 0 +0 1572 0 +0 1694 0 +0 1819 0 +0 1945 0 +0 2073 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1404 566 1209 +1398 582 1202 +1390 603 1193 +1380 629 1181 +1366 662 1165 +1346 703 1141 +1318 752 1108 +1278 811 1059 +1218 878 984 +1124 956 860 +956 1042 613 +540 1137 0 +0 1239 0 +0 1347 0 +0 1461 0 +0 1578 0 +0 1699 0 +0 1823 0 +0 1948 0 +0 2075 0 +0 2204 0 +0 2333 0 +0 2463 0 +0 2593 0 +0 2724 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1546 637 1325 +1542 651 1320 +1537 668 1314 +1529 691 1304 +1519 720 1292 +1505 756 1274 +1486 800 1249 +1458 853 1214 +1419 915 1162 +1360 987 1082 +1268 1068 947 +1105 1158 665 +714 1256 0 +0 1361 0 +0 1471 0 +0 1586 0 +0 1705 0 +0 1827 0 +0 1952 0 +0 2078 0 +0 2206 0 +0 2335 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1686 717 1446 +1683 728 1442 +1679 743 1437 +1674 763 1430 +1666 787 1420 +1656 819 1407 +1642 857 1388 +1623 904 1363 +1596 960 1326 +1557 1026 1272 +1500 1101 1187 +1409 1185 1042 +1250 1278 725 +875 1378 0 +0 1485 0 +0 1597 0 +0 1713 0 +0 1834 0 +0 1957 0 +0 2082 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1824 805 1569 +1822 815 1566 +1819 827 1562 +1815 843 1556 +1809 864 1549 +1802 891 1539 +1792 924 1526 +1778 965 1507 +1759 1014 1480 +1732 1073 1442 +1694 1141 1386 +1637 1219 1298 +1547 1305 1145 +1391 1400 795 +1028 1502 0 +0 1611 0 +0 1724 0 +0 1842 0 +0 1963 0 +0 2087 0 +0 2212 0 +0 2339 0 +0 2468 0 +0 2597 0 +0 2727 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1960 902 1694 +1959 910 1692 +1956 920 1689 +1953 933 1685 +1949 950 1679 +1944 972 1672 +1937 1000 1662 +1927 1035 1648 +1913 1077 1628 +1894 1129 1601 +1868 1190 1562 +1830 1260 1505 +1773 1340 1413 +1684 1428 1253 +1530 1525 875 +1174 1629 0 +0 1738 0 +0 1853 0 +0 1971 0 +0 2093 0 +0 2217 0 +0 2343 0 +0 2471 0 +0 2599 0 +0 2729 0 +0 2859 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2095 1005 1821 +2094 1012 1819 +2093 1020 1817 +2090 1030 1814 +2087 1044 1810 +2084 1062 1804 +2078 1085 1797 +2071 1114 1786 +2061 1150 1772 +2047 1195 1753 +2029 1248 1725 +2002 1310 1685 +1964 1382 1626 +1908 1464 1533 +1820 1554 1367 +1667 1652 963 +1317 1756 0 +0 1867 0 +0 1982 0 +0 2101 0 +0 2223 0 +0 2348 0 +0 2474 0 +0 2602 0 +0 2731 0 +0 2860 0 +0 2991 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +2230 1115 1949 +2229 1120 1948 +2228 1126 1946 +2226 1135 1944 +2224 1146 1941 +2221 1160 1936 +2217 1179 1931 +2212 1203 1923 +2205 1233 1913 +2195 1270 1898 +2181 1315 1879 +2162 1369 1851 +2136 1433 1810 +2098 1507 1750 +2042 1589 1655 +1955 1681 1484 +1802 1780 1059 +1457 1885 0 +0 1996 0 +0 2112 0 +0 2232 0 +0 2354 0 +0 2479 0 +0 2606 0 +0 2734 0 +0 2862 0 +0 2992 0 +0 3123 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2364 1229 2078 +2363 1233 2077 +2362 1238 2076 +2361 1245 2074 +2359 1254 2072 +2357 1265 2069 +2354 1280 2064 +2350 1299 2059 +2345 1323 2051 +2338 1354 2041 +2328 1392 2026 +2314 1438 2006 +2296 1494 1978 +2269 1559 1937 +2232 1633 1876 +2176 1717 1779 +2089 1809 1606 +1937 1908 1163 +1595 2015 0 +0 2127 0 +0 2243 0 +0 2363 0 +0 2486 0 +0 2611 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2497 1348 2208 +2497 1351 2207 +2496 1355 2206 +2495 1360 2205 +2494 1367 2203 +2492 1376 2201 +2490 1387 2198 +2487 1402 2193 +2483 1422 2188 +2478 1447 2180 +2471 1478 2169 +2461 1517 2155 +2447 1564 2135 +2429 1620 2106 +2402 1686 2065 +2365 1761 2004 +2309 1845 1906 +2222 1938 1729 +2071 2038 1272 +1731 2145 0 +0 2257 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2630 1470 2338 +2630 1472 2338 +2629 1475 2337 +2629 1479 2336 +2628 1484 2335 +2627 1491 2333 +2625 1500 2331 +2623 1512 2327 +2620 1527 2323 +2616 1547 2317 +2611 1572 2310 +2603 1604 2299 +2594 1643 2284 +2580 1691 2264 +2561 1748 2236 +2535 1814 2194 +2498 1890 2132 +2442 1974 2033 +2355 2068 1855 +2205 2168 1386 +1867 2276 0 +0 2388 0 +0 2505 0 +0 2625 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2763 1594 2469 +2763 1595 2469 +2762 1598 2468 +2762 1601 2467 +2761 1605 2466 +2760 1610 2465 +2759 1617 2463 +2757 1626 2461 +2755 1638 2458 +2752 1654 2454 +2748 1674 2448 +2743 1699 2440 +2736 1731 2429 +2726 1771 2415 +2713 1819 2394 +2694 1876 2366 +2668 1943 2324 +2630 2019 2262 +2575 2104 2162 +2488 2198 1982 +2338 2299 1505 +2001 2407 0 +0 2519 0 +0 2637 0 +0 2757 0 +0 2880 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2896 1720 2600 +2895 1721 2600 +2895 1723 2600 +2895 1725 2599 +2894 1728 2598 +2894 1732 2597 +2893 1738 2596 +2891 1745 2594 +2890 1754 2592 +2888 1766 2589 +2885 1782 2584 +2881 1802 2579 +2876 1828 2571 +2868 1860 2560 +2859 1900 2545 +2845 1948 2525 +2827 2006 2496 +2800 2073 2454 +2763 2149 2392 +2708 2235 2292 +2621 2329 2111 +2471 2430 1626 +2135 2538 0 +0 2651 0 +0 2768 0 +0 2889 0 +0 3012 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +3028 1847 2732 +3028 1848 2731 +3028 1850 2731 +3027 1851 2731 +3027 1854 2730 +3027 1857 2729 +3026 1861 2728 +3025 1866 2727 +3024 1873 2725 +3022 1883 2723 +3020 1895 2720 +3017 1911 2716 +3013 1931 2710 +3008 1957 2702 +3001 1989 2691 +2991 2030 2676 +2978 2078 2656 +2959 2136 2627 +2933 2203 2585 +2895 2280 2522 +2840 2366 2422 +2753 2460 2240 +2604 2562 1750 +2268 2670 0 +0 2783 0 +0 2900 0 +0 3021 0 +0 3144 0 +0 3269 0 +0 3397 0 +0 3525 0 +0 3654 0 +3160 1976 2863 +3160 1977 2863 +3160 1978 2863 +3160 1979 2862 +3160 1981 2862 +3159 1983 2862 +3159 1986 2861 +3158 1990 2860 +3157 1996 2858 +3156 2003 2857 +3154 2012 2854 +3152 2025 2851 +3149 2040 2847 +3146 2061 2841 +3140 2087 2833 +3133 2120 2822 +3123 2160 2808 +3110 2209 2787 +3091 2267 2758 +3065 2334 2716 +3028 2411 2653 +2972 2497 2553 +2886 2592 2370 +2736 2693 1876 +2401 2801 0 +0 2914 0 +0 3032 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3529 0 +0 3657 0 +3293 2105 2995 +3293 2106 2995 +3293 2107 2995 +3292 2108 2994 +3292 2109 2994 +3292 2111 2994 +3292 2113 2993 +3291 2116 2992 +3290 2120 2991 +3290 2126 2990 +3288 2133 2988 +3287 2142 2986 +3285 2155 2983 +3282 2171 2978 +3278 2191 2973 +3272 2217 2965 +3265 2250 2954 +3256 2291 2939 +3242 2339 2919 +3224 2398 2890 +3197 2465 2848 +3160 2542 2785 +3105 2629 2684 +3018 2723 2500 +2869 2825 2004 +2534 2933 0 +0 3046 0 +0 3164 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3661 0 +3425 2236 3127 +3425 2236 3127 +3425 2237 3126 +3425 2237 3126 +3425 2238 3126 +3424 2240 3126 +3424 2241 3125 +3424 2244 3125 +3423 2247 3124 +3423 2251 3123 +3422 2256 3122 +3421 2264 3120 +3419 2273 3118 +3417 2286 3114 +3414 2302 3110 +3410 2322 3104 +3405 2348 3096 +3397 2381 3086 +3388 2422 3071 +3374 2471 3050 +3356 2529 3021 +3330 2597 2979 +3292 2674 2916 +3237 2760 2815 +3150 2855 2631 +3001 2957 2132 +2667 3065 0 +0 3178 0 +0 3296 0 +0 3416 0 +0 3540 0 +0 3665 0 +3557 2366 3259 +3557 2367 3258 +3557 2367 3258 +3557 2367 3258 +3557 2368 3258 +3557 2369 3258 +3557 2371 3258 +3556 2372 3257 +3556 2375 3257 +3555 2378 3256 +3555 2382 3255 +3554 2387 3254 +3553 2395 3252 +3551 2404 3249 +3549 2417 3246 +3546 2433 3242 +3542 2453 3236 +3537 2480 3228 +3530 2512 3217 +3520 2553 3203 +3506 2602 3182 +3488 2660 3153 +3462 2728 3111 +3424 2806 3048 +3369 2892 2947 +3283 2987 2763 +3133 3089 2262 +2799 3197 0 +0 3310 0 +0 3428 0 +0 3548 0 +0 3672 0 +3689 2497 3390 +3689 2497 3390 +3689 2498 3390 +3689 2498 3390 +3689 2499 3390 +3689 2499 3390 +3689 2500 3390 +3689 2502 3389 +3688 2504 3389 +3688 2506 3388 +3688 2509 3388 +3687 2513 3387 +3686 2519 3385 +3685 2526 3384 +3683 2535 3381 +3681 2548 3378 +3678 2564 3374 +3674 2585 3368 +3669 2611 3360 +3662 2644 3349 +3652 2684 3334 +3639 2734 3314 +3620 2792 3285 +3594 2860 3243 +3557 2937 3179 +3501 3024 3078 +3415 3119 2894 +3266 3220 2392 +2932 3329 0 +0 3442 0 +0 3560 0 +0 3680 0 +3822 2628 3522 +3822 2629 3522 +3822 2629 3522 +3822 2629 3522 +3821 2630 3522 +3821 2630 3522 +3821 2631 3522 +3821 2632 3522 +3821 2633 3521 +3821 2635 3521 +3820 2637 3520 +3820 2641 3520 +3819 2645 3519 +3818 2650 3517 +3817 2657 3516 +3815 2667 3513 +3813 2679 3510 +3810 2696 3506 +3806 2716 3500 +3801 2743 3492 +3794 2775 3481 +3784 2816 3466 +3771 2865 3446 +3752 2924 3417 +3726 2992 3375 +3689 3069 3311 +3633 3156 3210 +3547 3250 3026 +3398 3352 2523 +3064 3461 0 +0 3574 0 +0 3692 0 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2760 3654 +3954 2761 3654 +3954 2761 3654 +3954 2762 3654 +3953 2763 3654 +3953 2764 3654 +3953 2765 3653 +3953 2767 3653 +3952 2769 3652 +3952 2772 3652 +3951 2776 3651 +3950 2782 3649 +3949 2789 3648 +3948 2799 3645 +3945 2811 3642 +3942 2827 3638 +3939 2848 3632 +3933 2874 3624 +3926 2907 3613 +3916 2948 3598 +3903 2997 3578 +3884 3056 3549 +3858 3124 3506 +3821 3201 3443 +3766 3288 3342 +3679 3382 3157 +3530 3484 2654 +3196 3593 0 +0 3706 0 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2892 3786 +4086 2893 3786 +4086 2893 3786 +4086 2894 3786 +4086 2894 3786 +4085 2895 3786 +4085 2897 3785 +4085 2898 3785 +4085 2901 3784 +4084 2904 3784 +4083 2908 3783 +4082 2914 3781 +4081 2921 3780 +4080 2930 3777 +4077 2943 3774 +4075 2959 3770 +4071 2980 3764 +4065 3006 3756 +4058 3039 3745 +4048 3080 3730 +4035 3129 3710 +4017 3188 3681 +3990 3256 3638 +3953 3333 3575 +3898 3420 3474 +3811 3514 3289 +3662 3616 2785 +3329 3725 0 +4095 3023 3919 +4095 3023 3918 +4095 3023 3918 +4095 3024 3918 +4095 3024 3918 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3025 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3917 +4095 3030 3917 +4095 3033 3916 +4095 3036 3916 +4095 3040 3915 +4095 3045 3913 +4095 3053 3912 +4095 3062 3909 +4095 3075 3906 +4095 3091 3902 +4095 3112 3896 +4095 3138 3888 +4095 3171 3877 +4095 3212 3862 +4095 3261 3842 +4095 3319 3813 +4095 3388 3770 +4085 3465 3707 +4030 3552 3606 +3944 3646 3421 +3794 3748 2916 +4095 3155 4051 +4095 3155 4051 +4095 3155 4051 +4095 3155 4051 +4095 3156 4050 +4095 3156 4050 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4049 +4095 3162 4049 +4095 3164 4048 +4095 3168 4048 +4095 3172 4047 +4095 3177 4045 +4095 3185 4044 +4095 3194 4041 +4095 3207 4038 +4095 3223 4034 +4095 3244 4028 +4095 3270 4020 +4095 3303 4009 +4095 3344 3994 +4095 3393 3974 +4095 3451 3945 +4095 3520 3902 +4095 3597 3839 +4095 3684 3738 +4076 3778 3553 +0 387 587 +0 410 561 +0 440 523 +0 477 468 +0 523 381 +0 577 231 +0 641 0 +0 714 0 +0 797 0 +0 888 0 +0 987 0 +0 1093 0 +0 1204 0 +0 1320 0 +0 1439 0 +0 1562 0 +0 1687 0 +0 1813 0 +0 1941 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 395 624 +0 418 600 +0 448 565 +0 484 515 +0 529 437 +0 583 307 +0 646 42 +0 718 0 +0 800 0 +0 891 0 +0 989 0 +0 1094 0 +0 1205 0 +0 1321 0 +0 1440 0 +0 1562 0 +0 1687 0 +0 1813 0 +0 1941 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 406 669 +0 428 647 +0 457 616 +0 493 571 +0 537 503 +0 590 393 +0 652 186 +0 724 0 +0 805 0 +0 894 0 +0 992 0 +0 1097 0 +0 1207 0 +0 1322 0 +0 1441 0 +0 1563 0 +0 1688 0 +0 1814 0 +0 1942 0 +0 2070 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +247 420 722 +170 442 703 +41 470 676 +0 505 637 +0 547 579 +0 599 487 +0 660 327 +0 731 0 +0 811 0 +0 899 0 +0 996 0 +0 1100 0 +0 1210 0 +0 1324 0 +0 1443 0 +0 1564 0 +0 1688 0 +0 1815 0 +0 1942 0 +0 2071 0 +0 2200 0 +0 2330 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2986 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +519 438 786 +479 459 769 +418 486 745 +322 520 712 +149 561 663 +0 611 589 +0 671 465 +0 740 219 +0 818 0 +0 906 0 +0 1001 0 +0 1104 0 +0 1213 0 +0 1327 0 +0 1445 0 +0 1566 0 +0 1690 0 +0 1815 0 +0 1943 0 +0 2071 0 +0 2201 0 +0 2331 0 +0 2461 0 +0 2592 0 +0 2723 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +734 461 858 +709 481 844 +673 507 824 +621 539 797 +540 579 756 +402 627 697 +110 685 602 +0 752 434 +0 828 18 +0 914 0 +0 1008 0 +0 1109 0 +0 1217 0 +0 1330 0 +0 1447 0 +0 1568 0 +0 1691 0 +0 1817 0 +0 1944 0 +0 2072 0 +0 2201 0 +0 2331 0 +0 2462 0 +0 2592 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +919 490 940 +903 509 929 +880 533 912 +847 563 889 +800 601 857 +727 647 810 +607 703 738 +373 767 619 +0 842 388 +0 925 0 +0 1017 0 +0 1116 0 +0 1223 0 +0 1334 0 +0 1451 0 +0 1570 0 +0 1693 0 +0 1818 0 +0 1945 0 +0 2073 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1087 526 1031 +1076 544 1021 +1061 566 1008 +1039 594 990 +1008 630 964 +964 673 927 +896 726 872 +787 787 787 +582 859 641 +0 939 318 +0 1029 0 +0 1126 0 +0 1230 0 +0 1340 0 +0 1455 0 +0 1574 0 +0 1696 0 +0 1820 0 +0 1946 0 +0 2074 0 +0 2203 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1245 570 1130 +1237 586 1122 +1226 607 1111 +1211 633 1097 +1190 665 1076 +1161 706 1048 +1118 755 1006 +1055 813 945 +952 880 846 +765 958 669 +245 1044 205 +0 1138 0 +0 1240 0 +0 1348 0 +0 1461 0 +0 1578 0 +0 1699 0 +0 1823 0 +0 1948 0 +0 2075 0 +0 2204 0 +0 2333 0 +0 2463 0 +0 2594 0 +0 2724 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1395 623 1235 +1389 638 1229 +1381 656 1220 +1371 679 1209 +1356 709 1193 +1336 746 1171 +1308 791 1140 +1267 845 1095 +1205 908 1026 +1107 981 915 +932 1063 703 +477 1154 0 +0 1253 0 +0 1358 0 +0 1469 0 +0 1585 0 +0 1704 0 +0 1826 0 +0 1951 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1540 686 1346 +1536 698 1341 +1530 715 1334 +1522 735 1326 +1512 762 1313 +1498 794 1297 +1478 835 1273 +1450 884 1240 +1410 943 1191 +1351 1011 1116 +1256 1088 993 +1088 1174 745 +672 1269 0 +0 1371 0 +0 1479 0 +0 1593 0 +0 1710 0 +0 1831 0 +0 1955 0 +0 2080 0 +0 2207 0 +0 2336 0 +0 2465 0 +0 2595 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1681 758 1461 +1678 769 1458 +1674 783 1453 +1669 801 1446 +1661 823 1436 +1651 852 1424 +1637 888 1406 +1618 932 1381 +1590 985 1346 +1551 1047 1295 +1492 1119 1215 +1400 1200 1079 +1237 1290 797 +846 1388 0 +0 1493 0 +0 1603 0 +0 1718 0 +0 1837 0 +0 1959 0 +0 2084 0 +0 2210 0 +0 2338 0 +0 2467 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1820 840 1581 +1818 849 1578 +1815 860 1574 +1811 875 1569 +1806 895 1562 +1798 920 1552 +1788 951 1539 +1774 989 1521 +1755 1036 1495 +1728 1092 1458 +1689 1158 1404 +1632 1233 1319 +1541 1317 1174 +1382 1410 857 +1007 1510 0 +0 1617 0 +0 1729 0 +0 1846 0 +0 1966 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1958 930 1703 +1956 937 1701 +1954 947 1698 +1951 959 1694 +1947 976 1689 +1941 996 1681 +1934 1023 1671 +1924 1056 1658 +1910 1097 1639 +1891 1146 1613 +1865 1205 1575 +1826 1273 1518 +1769 1351 1430 +1679 1437 1277 +1523 1532 927 +1160 1635 0 +0 1743 0 +0 1856 0 +0 1974 0 +0 2095 0 +0 2219 0 +0 2344 0 +0 2471 0 +0 2600 0 +0 2729 0 +0 2859 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2094 1028 1828 +2092 1034 1826 +2091 1042 1824 +2088 1052 1821 +2086 1065 1817 +2082 1082 1811 +2076 1104 1804 +2069 1132 1794 +2059 1167 1780 +2045 1210 1761 +2026 1261 1733 +2000 1322 1695 +1962 1392 1637 +1905 1472 1545 +1816 1561 1385 +1662 1657 1007 +1307 1761 0 +0 1870 0 +0 1985 0 +0 2103 0 +0 2225 0 +0 2349 0 +0 2475 0 +0 2603 0 +0 2731 0 +0 2861 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +2228 1133 1954 +2228 1138 1953 +2226 1144 1951 +2225 1152 1949 +2223 1163 1946 +2220 1176 1942 +2216 1194 1936 +2210 1217 1929 +2203 1246 1918 +2193 1282 1904 +2180 1327 1885 +2161 1380 1857 +2134 1442 1817 +2096 1514 1758 +2040 1596 1665 +1952 1686 1499 +1799 1784 1095 +1449 1888 0 +0 1999 0 +0 2114 0 +0 2233 0 +0 2356 0 +0 2480 0 +0 2606 0 +0 2734 0 +0 2863 0 +0 2992 0 +0 3123 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2363 1243 2082 +2362 1247 2081 +2361 1252 2080 +2360 1258 2078 +2358 1267 2076 +2356 1278 2073 +2353 1292 2068 +2349 1311 2063 +2344 1335 2055 +2337 1365 2045 +2327 1402 2031 +2313 1447 2011 +2294 1502 1983 +2268 1565 1942 +2230 1639 1882 +2174 1721 1787 +2087 1813 1617 +1934 1912 1191 +1589 2017 0 +0 2129 0 +0 2244 0 +0 2364 0 +0 2486 0 +0 2611 0 +0 2738 0 +0 2866 0 +0 2995 0 +0 3124 0 +0 3255 0 +0 3385 0 +0 3516 0 +0 3648 0 +2496 1359 2211 +2496 1362 2210 +2495 1365 2209 +2494 1370 2208 +2493 1377 2206 +2491 1386 2204 +2489 1397 2201 +2486 1412 2196 +2482 1431 2191 +2477 1455 2183 +2470 1486 2173 +2460 1524 2158 +2446 1570 2138 +2428 1626 2110 +2402 1691 2069 +2364 1765 2008 +2308 1849 1911 +2221 1941 1738 +2069 2041 1295 +1727 2147 0 +0 2259 0 +0 2375 0 +0 2495 0 +0 2618 0 +0 2743 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3648 0 +2630 1478 2340 +2629 1480 2340 +2629 1483 2339 +2628 1487 2338 +2627 1492 2337 +2626 1499 2335 +2624 1508 2333 +2622 1519 2330 +2619 1535 2326 +2615 1554 2320 +2610 1579 2312 +2603 1610 2302 +2593 1649 2287 +2579 1696 2267 +2561 1752 2238 +2535 1818 2197 +2497 1893 2136 +2441 1977 2038 +2354 2070 1861 +2203 2170 1404 +1864 2277 0 +0 2389 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +2763 1600 2471 +2762 1602 2470 +2762 1604 2470 +2761 1607 2469 +2761 1611 2468 +2760 1616 2467 +2759 1623 2465 +2757 1632 2463 +2755 1644 2460 +2752 1659 2455 +2748 1679 2450 +2743 1704 2442 +2735 1736 2431 +2726 1775 2417 +2712 1823 2396 +2694 1880 2368 +2667 1946 2326 +2630 2022 2264 +2574 2107 2165 +2487 2200 1987 +2337 2301 1518 +1999 2408 0 +0 2520 0 +0 2637 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +2895 1725 2601 +2895 1726 2601 +2895 1728 2601 +2894 1730 2600 +2894 1733 2599 +2893 1737 2599 +2892 1742 2597 +2891 1749 2595 +2890 1758 2593 +2887 1770 2590 +2884 1786 2586 +2881 1806 2580 +2875 1832 2572 +2868 1864 2561 +2858 1903 2547 +2845 1951 2526 +2826 2008 2498 +2800 2075 2456 +2763 2151 2394 +2707 2237 2294 +2620 2330 2114 +2470 2431 1637 +2133 2539 0 +0 2652 0 +0 2769 0 +0 2889 0 +0 3012 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +3028 1851 2733 +3028 1852 2732 +3027 1853 2732 +3027 1855 2732 +3027 1857 2731 +3026 1860 2730 +3026 1864 2729 +3025 1870 2728 +3024 1877 2726 +3022 1886 2724 +3020 1898 2721 +3017 1914 2717 +3013 1934 2711 +3008 1960 2703 +3000 1992 2692 +2991 2032 2677 +2977 2080 2657 +2959 2138 2628 +2933 2205 2586 +2895 2282 2524 +2840 2367 2424 +2753 2461 2243 +2603 2562 1758 +2267 2670 0 +0 2783 0 +0 2900 0 +0 3021 0 +0 3144 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3654 0 +3160 1979 2864 +3160 1979 2864 +3160 1980 2863 +3160 1982 2863 +3160 1983 2863 +3159 1986 2862 +3159 1989 2861 +3158 1993 2861 +3157 1998 2859 +3156 2005 2857 +3154 2015 2855 +3152 2027 2852 +3149 2043 2848 +3145 2063 2842 +3140 2089 2834 +3133 2122 2823 +3123 2162 2809 +3110 2210 2788 +3091 2268 2759 +3065 2335 2717 +3028 2412 2654 +2972 2498 2554 +2886 2592 2372 +2736 2694 1882 +2401 2802 0 +0 2915 0 +0 3032 0 +0 3153 0 +0 3276 0 +0 3402 0 +0 3529 0 +0 3657 0 +3293 2107 2995 +3293 2108 2995 +3292 2109 2995 +3292 2110 2995 +3292 2111 2995 +3292 2113 2994 +3291 2115 2994 +3291 2118 2993 +3290 2122 2992 +3289 2128 2991 +3288 2135 2989 +3287 2144 2986 +3284 2157 2983 +3282 2173 2979 +3278 2193 2973 +3272 2219 2965 +3265 2252 2955 +3255 2292 2940 +3242 2341 2919 +3223 2399 2890 +3197 2466 2848 +3160 2543 2785 +3104 2629 2685 +3018 2724 2502 +2868 2825 2008 +2534 2933 0 +0 3046 0 +0 3164 0 +0 3285 0 +0 3408 0 +0 3534 0 +0 3661 0 +3425 2237 3127 +3425 2238 3127 +3425 2238 3127 +3425 2239 3127 +3425 2240 3126 +3424 2241 3126 +3424 2243 3126 +3424 2245 3125 +3423 2248 3124 +3423 2252 3123 +3422 2258 3122 +3420 2265 3120 +3419 2275 3118 +3417 2287 3115 +3414 2303 3111 +3410 2323 3105 +3405 2350 3097 +3397 2382 3086 +3388 2423 3071 +3374 2472 3051 +3356 2530 3022 +3330 2597 2980 +3292 2675 2917 +3237 2761 2816 +3150 2855 2633 +3001 2957 2136 +2666 3065 0 +0 3178 0 +0 3296 0 +0 3417 0 +0 3540 0 +0 3666 0 +3557 2367 3259 +3557 2368 3259 +3557 2368 3259 +3557 2369 3259 +3557 2369 3258 +3557 2370 3258 +3557 2372 3258 +3556 2373 3257 +3556 2376 3257 +3555 2379 3256 +3555 2383 3255 +3554 2389 3254 +3553 2396 3252 +3551 2405 3250 +3549 2418 3247 +3546 2434 3242 +3542 2454 3236 +3537 2480 3229 +3530 2513 3218 +3520 2554 3203 +3506 2603 3182 +3488 2661 3153 +3462 2729 3111 +3424 2806 3048 +3369 2892 2947 +3283 2987 2763 +3133 3089 2264 +2799 3197 0 +0 3310 0 +0 3428 0 +0 3548 0 +0 3672 0 +3689 2498 3391 +3689 2498 3391 +3689 2499 3391 +3689 2499 3390 +3689 2500 3390 +3689 2500 3390 +3689 2501 3390 +3689 2503 3390 +3688 2504 3389 +3688 2507 3389 +3688 2510 3388 +3687 2514 3387 +3686 2520 3386 +3685 2527 3384 +3683 2536 3382 +3681 2549 3378 +3678 2565 3374 +3674 2585 3368 +3669 2612 3360 +3662 2644 3350 +3652 2685 3335 +3639 2734 3314 +3620 2792 3285 +3594 2860 3243 +3557 2938 3180 +3501 3024 3079 +3415 3119 2895 +3265 3221 2394 +2932 3329 0 +0 3442 0 +0 3560 0 +0 3681 0 +3822 2629 3523 +3822 2629 3523 +3822 2630 3523 +3822 2630 3522 +3821 2630 3522 +3821 2631 3522 +3821 2632 3522 +3821 2633 3522 +3821 2634 3522 +3821 2636 3521 +3820 2638 3521 +3820 2641 3520 +3819 2645 3519 +3818 2651 3518 +3817 2658 3516 +3815 2668 3513 +3813 2680 3510 +3810 2696 3506 +3806 2717 3500 +3801 2743 3492 +3794 2776 3481 +3784 2817 3467 +3771 2866 3446 +3752 2924 3417 +3726 2992 3375 +3689 3069 3312 +3633 3156 3210 +3547 3251 3026 +3398 3353 2524 +3064 3461 0 +0 3574 0 +0 3692 0 +3954 2760 3655 +3954 2761 3655 +3954 2761 3654 +3954 2761 3654 +3954 2761 3654 +3954 2762 3654 +3953 2762 3654 +3953 2763 3654 +3953 2764 3654 +3953 2765 3653 +3953 2767 3653 +3952 2769 3652 +3952 2773 3652 +3951 2777 3651 +3950 2782 3649 +3949 2790 3648 +3947 2799 3645 +3945 2812 3642 +3942 2828 3638 +3939 2848 3632 +3933 2875 3624 +3926 2908 3613 +3916 2948 3598 +3903 2997 3578 +3884 3056 3549 +3858 3124 3507 +3821 3201 3443 +3766 3288 3342 +3679 3383 3158 +3530 3485 2655 +3196 3593 0 +0 3706 0 +4086 2892 3787 +4086 2892 3787 +4086 2892 3787 +4086 2892 3786 +4086 2893 3786 +4086 2893 3786 +4086 2893 3786 +4086 2894 3786 +4086 2895 3786 +4085 2896 3786 +4085 2897 3785 +4085 2899 3785 +4084 2901 3784 +4084 2904 3784 +4083 2908 3783 +4082 2914 3781 +4081 2921 3780 +4080 2931 3777 +4077 2943 3774 +4075 2959 3770 +4071 2980 3764 +4065 3006 3756 +4058 3039 3745 +4048 3080 3730 +4035 3129 3710 +4016 3188 3681 +3990 3256 3639 +3953 3333 3575 +3898 3420 3474 +3811 3515 3289 +3662 3617 2786 +3329 3725 0 +4095 3024 3919 +4095 3024 3919 +4095 3024 3919 +4095 3024 3919 +4095 3024 3918 +4095 3024 3918 +4095 3025 3918 +4095 3025 3918 +4095 3026 3918 +4095 3026 3918 +4095 3027 3918 +4095 3029 3917 +4095 3030 3917 +4095 3033 3916 +4095 3036 3916 +4095 3040 3915 +4095 3046 3913 +4095 3053 3912 +4095 3062 3909 +4095 3075 3906 +4095 3091 3902 +4095 3112 3896 +4095 3138 3888 +4095 3171 3877 +4095 3212 3862 +4095 3261 3842 +4095 3320 3813 +4095 3388 3771 +4085 3465 3707 +4030 3552 3606 +3943 3647 3421 +3794 3749 2917 +4095 3155 4051 +4095 3155 4051 +4095 3155 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4050 +4095 3156 4050 +4095 3157 4050 +4095 3157 4050 +4095 3158 4050 +4095 3159 4050 +4095 3161 4049 +4095 3162 4049 +4095 3165 4048 +4095 3168 4048 +4095 3172 4047 +4095 3177 4045 +4095 3185 4044 +4095 3194 4041 +4095 3207 4038 +4095 3223 4034 +4095 3244 4028 +4095 3270 4020 +4095 3303 4009 +4095 3344 3994 +4095 3393 3974 +4095 3452 3945 +4095 3520 3903 +4095 3597 3839 +4095 3684 3738 +4076 3779 3553 +0 494 709 +0 513 690 +0 537 662 +0 567 621 +0 604 561 +0 650 466 +0 705 295 +0 770 0 +0 843 0 +0 927 0 +0 1018 0 +0 1118 0 +0 1223 0 +0 1335 0 +0 1451 0 +0 1571 0 +0 1693 0 +0 1818 0 +0 1945 0 +0 2073 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 500 738 +0 519 719 +0 543 693 +0 572 655 +0 610 600 +0 655 513 +0 709 363 +0 773 25 +0 846 0 +0 929 0 +0 1020 0 +0 1119 0 +0 1225 0 +0 1336 0 +0 1452 0 +0 1571 0 +0 1694 0 +0 1819 0 +0 1945 0 +0 2073 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 509 773 +0 527 756 +0 550 732 +0 580 697 +0 616 647 +0 661 569 +0 715 440 +0 778 174 +0 850 0 +0 932 0 +0 1023 0 +0 1121 0 +0 1227 0 +0 1337 0 +0 1453 0 +0 1572 0 +0 1694 0 +0 1819 0 +0 1946 0 +0 2073 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +66 520 816 +0 538 801 +0 561 779 +0 589 748 +0 625 703 +0 669 635 +0 722 525 +0 784 318 +0 856 0 +0 937 0 +0 1027 0 +0 1124 0 +0 1229 0 +0 1339 0 +0 1454 0 +0 1573 0 +0 1695 0 +0 1820 0 +0 1946 0 +0 2074 0 +0 2202 0 +0 2332 0 +0 2462 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3118 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +429 534 868 +379 552 854 +302 574 835 +173 602 808 +0 637 769 +0 680 711 +0 731 620 +0 792 459 +0 863 78 +0 943 0 +0 1031 0 +0 1128 0 +0 1232 0 +0 1342 0 +0 1456 0 +0 1575 0 +0 1696 0 +0 1821 0 +0 1947 0 +0 2074 0 +0 2203 0 +0 2332 0 +0 2463 0 +0 2593 0 +0 2724 0 +0 2855 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +680 553 930 +652 570 918 +611 591 901 +550 618 878 +454 652 844 +281 693 796 +0 743 721 +0 803 597 +0 872 351 +0 950 0 +0 1038 0 +0 1133 0 +0 1236 0 +0 1345 0 +0 1459 0 +0 1577 0 +0 1698 0 +0 1822 0 +0 1948 0 +0 2075 0 +0 2203 0 +0 2333 0 +0 2463 0 +0 2593 0 +0 2724 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +884 577 1001 +866 593 990 +841 613 976 +806 639 956 +753 671 929 +672 711 889 +534 759 829 +243 817 734 +0 884 566 +0 960 150 +0 1046 0 +0 1140 0 +0 1241 0 +0 1349 0 +0 1462 0 +0 1579 0 +0 1700 0 +0 1823 0 +0 1949 0 +0 2076 0 +0 2204 0 +0 2333 0 +0 2463 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1063 607 1081 +1051 622 1072 +1035 641 1061 +1012 665 1044 +979 696 1022 +932 733 989 +859 780 942 +739 835 870 +505 899 751 +0 974 520 +0 1057 0 +0 1149 0 +0 1249 0 +0 1355 0 +0 1466 0 +0 1583 0 +0 1702 0 +0 1825 0 +0 1950 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +1228 644 1170 +1219 658 1163 +1208 676 1153 +1193 698 1140 +1171 727 1122 +1140 762 1096 +1096 805 1059 +1029 858 1005 +919 919 919 +715 991 773 +63 1071 450 +0 1161 0 +0 1258 0 +0 1362 0 +0 1472 0 +0 1587 0 +0 1706 0 +0 1828 0 +0 1952 0 +0 2078 0 +0 2206 0 +0 2335 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1383 690 1267 +1377 702 1262 +1369 718 1254 +1358 739 1243 +1343 765 1229 +1322 798 1208 +1293 838 1180 +1250 887 1139 +1187 945 1077 +1084 1013 978 +897 1090 801 +377 1176 337 +0 1270 0 +0 1372 0 +0 1480 0 +0 1593 0 +0 1711 0 +0 1831 0 +0 1955 0 +0 2080 0 +0 2208 0 +0 2336 0 +0 2465 0 +0 2595 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1531 745 1371 +1527 756 1367 +1521 770 1361 +1513 788 1352 +1503 812 1341 +1488 841 1325 +1468 878 1303 +1440 923 1272 +1399 977 1227 +1337 1040 1158 +1239 1113 1047 +1064 1195 835 +609 1286 120 +0 1385 0 +0 1490 0 +0 1601 0 +0 1717 0 +0 1836 0 +0 1958 0 +0 2083 0 +0 2210 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1675 809 1481 +1672 818 1478 +1668 831 1473 +1662 847 1466 +1655 867 1458 +1644 894 1445 +1630 927 1429 +1610 967 1405 +1582 1016 1372 +1542 1075 1323 +1483 1143 1249 +1388 1220 1125 +1220 1307 878 +804 1401 0 +0 1503 0 +0 1611 0 +0 1725 0 +0 1842 0 +0 1963 0 +0 2087 0 +0 2212 0 +0 2340 0 +0 2468 0 +0 2597 0 +0 2727 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1816 882 1596 +1813 890 1593 +1810 901 1590 +1806 915 1585 +1801 933 1578 +1793 955 1569 +1783 984 1556 +1769 1020 1538 +1750 1064 1514 +1722 1117 1478 +1683 1179 1427 +1625 1251 1347 +1532 1333 1212 +1369 1422 929 +978 1520 0 +0 1625 0 +0 1735 0 +0 1850 0 +0 1969 0 +0 2092 0 +0 2216 0 +0 2342 0 +0 2470 0 +0 2599 0 +0 2728 0 +0 2859 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1954 965 1715 +1952 972 1713 +1950 981 1710 +1947 992 1706 +1943 1007 1701 +1938 1027 1694 +1930 1052 1684 +1920 1083 1671 +1906 1121 1653 +1887 1168 1627 +1860 1224 1590 +1821 1290 1536 +1764 1365 1452 +1673 1449 1307 +1514 1542 989 +1139 1642 0 +0 1749 0 +0 1861 0 +0 1978 0 +0 2098 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +2091 1056 1837 +2090 1062 1835 +2088 1069 1833 +2086 1079 1830 +2083 1091 1826 +2079 1108 1821 +2073 1129 1813 +2066 1155 1803 +2056 1188 1790 +2042 1229 1771 +2023 1278 1745 +1997 1337 1707 +1958 1405 1650 +1901 1483 1562 +1812 1570 1409 +1655 1664 1059 +1292 1767 0 +0 1875 0 +0 1988 0 +0 2106 0 +0 2227 0 +0 2351 0 +0 2476 0 +0 2604 0 +0 2732 0 +0 2861 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +2227 1156 1961 +2226 1160 1960 +2224 1166 1958 +2223 1174 1956 +2221 1184 1953 +2218 1197 1949 +2214 1214 1943 +2208 1236 1936 +2201 1264 1926 +2191 1299 1912 +2177 1342 1893 +2158 1393 1866 +2132 1454 1827 +2094 1524 1769 +2037 1604 1678 +1948 1693 1517 +1794 1789 1139 +1439 1893 0 +0 2002 0 +0 2117 0 +0 2235 0 +0 2357 0 +0 2481 0 +0 2607 0 +0 2735 0 +0 2863 0 +0 2993 0 +0 3123 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3647 0 +2361 1261 2087 +2361 1265 2086 +2360 1270 2085 +2358 1276 2083 +2357 1284 2081 +2355 1295 2078 +2352 1309 2074 +2348 1327 2068 +2342 1349 2061 +2335 1378 2050 +2325 1415 2036 +2312 1459 2017 +2293 1512 1989 +2266 1574 1949 +2228 1646 1890 +2172 1728 1797 +2084 1818 1631 +1931 1916 1227 +1581 2021 0 +0 2131 0 +0 2246 0 +0 2365 0 +0 2488 0 +0 2612 0 +0 2738 0 +0 2866 0 +0 2995 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +2495 1373 2215 +2495 1376 2214 +2494 1379 2213 +2493 1384 2212 +2492 1391 2210 +2490 1399 2208 +2488 1410 2205 +2485 1424 2201 +2481 1443 2195 +2476 1467 2187 +2469 1497 2177 +2459 1534 2163 +2445 1579 2143 +2427 1634 2115 +2400 1698 2074 +2362 1771 2014 +2306 1854 1919 +2219 1945 1749 +2066 2044 1323 +1721 2149 0 +0 2261 0 +0 2376 0 +0 2496 0 +0 2619 0 +0 2743 0 +0 2870 0 +0 2998 0 +0 3127 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3649 0 +2629 1489 2343 +2628 1491 2343 +2628 1494 2342 +2627 1497 2341 +2626 1503 2340 +2625 1509 2338 +2623 1518 2336 +2621 1529 2333 +2618 1544 2329 +2614 1563 2323 +2609 1588 2315 +2602 1618 2305 +2592 1656 2290 +2579 1703 2270 +2560 1758 2242 +2534 1823 2201 +2496 1897 2140 +2440 1981 2043 +2353 2073 1870 +2201 2173 1427 +1859 2279 0 +0 2391 0 +0 2507 0 +0 2627 0 +0 2750 0 +0 2875 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +2762 1608 2473 +2762 1610 2473 +2761 1612 2472 +2761 1615 2471 +2760 1619 2470 +2759 1624 2469 +2758 1631 2467 +2756 1640 2465 +2754 1652 2462 +2751 1667 2458 +2747 1686 2452 +2742 1711 2444 +2735 1742 2434 +2725 1781 2419 +2712 1828 2399 +2693 1884 2370 +2667 1950 2329 +2629 2025 2268 +2573 2109 2170 +2486 2202 1993 +2335 2302 1536 +1996 2409 0 +0 2521 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +2895 1731 2603 +2895 1732 2603 +2894 1734 2602 +2894 1736 2602 +2893 1739 2601 +2893 1743 2600 +2892 1748 2599 +2891 1755 2597 +2889 1764 2595 +2887 1776 2592 +2884 1791 2587 +2880 1811 2582 +2875 1836 2574 +2868 1868 2563 +2858 1907 2549 +2844 1955 2528 +2826 2012 2500 +2800 2078 2458 +2762 2154 2396 +2706 2239 2298 +2619 2332 2119 +2469 2433 1651 +2131 2540 0 +0 2652 0 +0 2769 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +3028 1856 2734 +3027 1857 2734 +3027 1858 2733 +3027 1860 2733 +3027 1862 2732 +3026 1865 2732 +3025 1869 2731 +3024 1874 2729 +3023 1881 2728 +3022 1890 2725 +3019 1902 2722 +3017 1918 2718 +3013 1938 2712 +3007 1964 2704 +3000 1996 2694 +2990 2035 2679 +2977 2083 2658 +2958 2140 2630 +2932 2207 2588 +2895 2283 2526 +2839 2369 2426 +2752 2462 2246 +2602 2563 1769 +2265 2671 0 +0 2784 0 +0 2901 0 +0 3021 0 +0 3144 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3654 0 +3160 1982 2865 +3160 1983 2865 +3160 1984 2864 +3160 1985 2864 +3159 1987 2864 +3159 1989 2863 +3158 1992 2862 +3158 1996 2861 +3157 2002 2860 +3156 2009 2858 +3154 2018 2856 +3152 2030 2853 +3149 2046 2849 +3145 2066 2843 +3140 2092 2835 +3133 2124 2824 +3123 2164 2810 +3109 2212 2789 +3091 2270 2760 +3065 2337 2719 +3027 2414 2656 +2972 2499 2556 +2885 2593 2375 +2735 2695 1890 +2399 2802 0 +0 2915 0 +0 3032 0 +0 3153 0 +0 3276 0 +0 3402 0 +0 3529 0 +0 3657 0 +3292 2110 2996 +3292 2111 2996 +3292 2111 2996 +3292 2112 2996 +3292 2114 2995 +3292 2116 2995 +3291 2118 2994 +3291 2121 2994 +3290 2125 2993 +3289 2130 2991 +3288 2138 2990 +3286 2147 2987 +3284 2159 2984 +3281 2175 2980 +3277 2195 2974 +3272 2221 2966 +3265 2254 2955 +3255 2294 2941 +3242 2342 2920 +3223 2400 2891 +3197 2467 2849 +3160 2544 2787 +3104 2630 2686 +3018 2724 2504 +2868 2826 2015 +2533 2934 0 +0 3047 0 +0 3164 0 +0 3285 0 +0 3408 0 +0 3534 0 +0 3661 0 +3425 2239 3128 +3425 2240 3127 +3425 2240 3127 +3425 2241 3127 +3424 2242 3127 +3424 2243 3127 +3424 2245 3126 +3424 2247 3126 +3423 2250 3125 +3422 2254 3124 +3421 2260 3123 +3420 2267 3121 +3419 2276 3119 +3417 2289 3115 +3414 2305 3111 +3410 2325 3105 +3404 2351 3097 +3397 2384 3087 +3387 2424 3072 +3374 2473 3051 +3355 2531 3022 +3329 2598 2980 +3292 2675 2918 +3237 2761 2817 +3150 2856 2634 +3000 2957 2141 +2666 3065 0 +0 3178 0 +0 3296 0 +0 3417 0 +0 3540 0 +0 3666 0 +3557 2369 3259 +3557 2369 3259 +3557 2370 3259 +3557 2370 3259 +3557 2371 3259 +3557 2372 3259 +3556 2373 3258 +3556 2375 3258 +3556 2377 3257 +3555 2380 3257 +3555 2385 3256 +3554 2390 3254 +3553 2397 3252 +3551 2407 3250 +3549 2419 3247 +3546 2435 3243 +3542 2456 3237 +3537 2482 3229 +3529 2514 3218 +3520 2555 3203 +3506 2604 3183 +3488 2662 3154 +3462 2729 3112 +3424 2807 3049 +3369 2893 2948 +3282 2987 2765 +3133 3089 2268 +2799 3197 0 +0 3310 0 +0 3428 0 +0 3549 0 +0 3672 0 +3689 2499 3391 +3689 2499 3391 +3689 2500 3391 +3689 2500 3391 +3689 2501 3391 +3689 2501 3390 +3689 2502 3390 +3689 2504 3390 +3688 2506 3390 +3688 2508 3389 +3687 2511 3388 +3687 2515 3387 +3686 2521 3386 +3685 2528 3384 +3683 2537 3382 +3681 2550 3379 +3678 2566 3374 +3674 2586 3369 +3669 2613 3361 +3662 2645 3350 +3652 2686 3335 +3639 2735 3314 +3620 2793 3285 +3594 2861 3243 +3556 2938 3180 +3501 3024 3079 +3415 3119 2896 +3265 3221 2397 +2931 3329 0 +0 3442 0 +0 3560 0 +0 3681 0 +3822 2630 3523 +3822 2630 3523 +3821 2630 3523 +3821 2631 3523 +3821 2631 3523 +3821 2632 3522 +3821 2632 3522 +3821 2633 3522 +3821 2635 3522 +3821 2637 3521 +3820 2639 3521 +3820 2642 3520 +3819 2646 3519 +3818 2652 3518 +3817 2659 3516 +3815 2668 3514 +3813 2681 3510 +3810 2697 3506 +3806 2717 3500 +3801 2744 3492 +3794 2777 3482 +3784 2817 3467 +3771 2866 3446 +3752 2925 3417 +3726 2992 3375 +3689 3070 3312 +3633 3156 3211 +3547 3251 3027 +3398 3353 2526 +3064 3461 0 +0 3574 0 +0 3692 0 +3954 2761 3655 +3954 2761 3655 +3954 2761 3655 +3954 2762 3655 +3954 2762 3655 +3954 2762 3654 +3953 2763 3654 +3953 2764 3654 +3953 2765 3654 +3953 2766 3654 +3953 2768 3653 +3952 2770 3653 +3952 2773 3652 +3951 2777 3651 +3950 2783 3650 +3949 2790 3648 +3947 2800 3645 +3945 2812 3642 +3942 2828 3638 +3938 2849 3632 +3933 2875 3624 +3926 2908 3614 +3916 2949 3599 +3903 2998 3578 +3884 3056 3549 +3858 3124 3507 +3821 3202 3444 +3766 3288 3343 +3679 3383 3158 +3530 3485 2656 +3196 3593 0 +0 3706 0 +4086 2892 3787 +4086 2893 3787 +4086 2893 3787 +4086 2893 3787 +4086 2893 3787 +4086 2893 3786 +4086 2894 3786 +4086 2894 3786 +4085 2895 3786 +4085 2896 3786 +4085 2897 3786 +4085 2899 3785 +4084 2902 3785 +4084 2905 3784 +4083 2909 3783 +4082 2914 3782 +4081 2922 3780 +4080 2931 3777 +4077 2944 3774 +4075 2960 3770 +4071 2980 3764 +4065 3007 3756 +4058 3040 3745 +4048 3080 3731 +4035 3130 3710 +4016 3188 3681 +3990 3256 3639 +3953 3333 3575 +3898 3420 3474 +3811 3515 3290 +3662 3617 2787 +3328 3725 0 +4095 3024 3919 +4095 3024 3919 +4095 3024 3919 +4095 3024 3919 +4095 3024 3919 +4095 3025 3919 +4095 3025 3918 +4095 3025 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3918 +4095 3029 3918 +4095 3031 3917 +4095 3033 3917 +4095 3036 3916 +4095 3040 3915 +4095 3046 3914 +4095 3053 3912 +4095 3063 3909 +4095 3075 3906 +4095 3091 3902 +4095 3112 3896 +4095 3138 3888 +4095 3171 3877 +4095 3212 3863 +4095 3261 3842 +4095 3320 3813 +4095 3388 3771 +4085 3465 3707 +4030 3552 3606 +3943 3647 3422 +3794 3749 2918 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3157 4050 +4095 3157 4050 +4095 3158 4050 +4095 3158 4050 +4095 3159 4050 +4095 3161 4050 +4095 3163 4049 +4095 3165 4049 +4095 3168 4048 +4095 3172 4047 +4095 3178 4046 +4095 3185 4044 +4095 3195 4041 +4095 3207 4038 +4095 3223 4034 +4095 3244 4028 +4095 3270 4020 +4095 3303 4009 +4095 3344 3995 +4095 3393 3974 +4095 3452 3945 +4095 3520 3903 +4095 3597 3839 +4095 3684 3738 +4076 3779 3553 +0 606 834 +0 621 819 +0 640 798 +0 664 769 +0 695 726 +0 733 662 +0 779 559 +0 834 370 +0 899 0 +0 973 0 +0 1057 0 +0 1149 0 +0 1248 0 +0 1355 0 +0 1466 0 +0 1583 0 +0 1702 0 +0 1825 0 +0 1950 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3250 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 611 856 +0 626 842 +0 645 822 +0 669 794 +0 699 753 +0 737 693 +0 782 598 +0 837 427 +0 902 2 +0 976 0 +0 1059 0 +0 1150 0 +0 1250 0 +0 1356 0 +0 1467 0 +0 1583 0 +0 1703 0 +0 1825 0 +0 1950 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 618 883 +0 632 870 +0 651 851 +0 675 825 +0 705 788 +0 742 732 +0 787 645 +0 841 495 +0 905 157 +0 979 0 +0 1061 0 +0 1152 0 +0 1251 0 +0 1357 0 +0 1468 0 +0 1584 0 +0 1703 0 +0 1826 0 +0 1951 0 +0 2077 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +0 627 918 +0 641 905 +0 659 888 +0 682 864 +0 712 829 +0 748 779 +0 793 702 +0 847 572 +0 910 306 +0 983 0 +0 1064 0 +0 1155 0 +0 1253 0 +0 1359 0 +0 1469 0 +0 1585 0 +0 1704 0 +0 1827 0 +0 1951 0 +0 2078 0 +0 2205 0 +0 2334 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +271 638 960 +198 652 948 +78 670 933 +0 693 911 +0 721 880 +0 757 835 +0 801 768 +0 854 657 +0 916 450 +0 988 0 +0 1069 0 +0 1159 0 +0 1256 0 +0 1361 0 +0 1471 0 +0 1586 0 +0 1705 0 +0 1827 0 +0 1952 0 +0 2078 0 +0 2206 0 +0 2335 0 +0 2464 0 +0 2594 0 +0 2725 0 +0 2856 0 +0 2987 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +595 653 1011 +561 667 1000 +511 684 986 +434 706 967 +305 734 940 +43 769 901 +0 812 843 +0 863 752 +0 924 591 +0 995 210 +0 1075 0 +0 1164 0 +0 1260 0 +0 1364 0 +0 1474 0 +0 1588 0 +0 1707 0 +0 1829 0 +0 1953 0 +0 2079 0 +0 2206 0 +0 2335 0 +0 2464 0 +0 2595 0 +0 2725 0 +0 2856 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +832 672 1071 +812 685 1062 +784 702 1050 +743 723 1033 +682 750 1010 +586 784 976 +413 825 928 +0 875 853 +0 935 729 +0 1004 483 +0 1082 0 +0 1170 0 +0 1265 0 +0 1368 0 +0 1477 0 +0 1591 0 +0 1709 0 +0 1830 0 +0 1954 0 +0 2080 0 +0 2207 0 +0 2335 0 +0 2465 0 +0 2595 0 +0 2725 0 +0 2856 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3382 0 +0 3514 0 +0 3646 0 +1029 697 1140 +1016 709 1133 +998 725 1122 +973 745 1108 +938 771 1089 +885 803 1061 +804 843 1021 +666 891 961 +375 949 866 +0 1016 698 +0 1093 282 +0 1178 0 +0 1272 0 +0 1374 0 +0 1481 0 +0 1594 0 +0 1711 0 +0 1832 0 +0 1955 0 +0 2081 0 +0 2208 0 +0 2336 0 +0 2465 0 +0 2595 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1204 728 1220 +1195 739 1213 +1183 754 1205 +1167 773 1193 +1144 797 1176 +1111 828 1154 +1064 866 1121 +991 912 1074 +872 967 1002 +637 1032 883 +0 1106 652 +0 1189 0 +0 1281 0 +0 1381 0 +0 1487 0 +0 1599 0 +0 1715 0 +0 1835 0 +0 1957 0 +0 2082 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1366 766 1308 +1360 777 1302 +1352 790 1295 +1340 808 1286 +1325 830 1272 +1303 859 1254 +1272 894 1228 +1228 938 1191 +1161 990 1137 +1052 1052 1052 +847 1123 905 +195 1203 583 +0 1293 0 +0 1390 0 +0 1494 0 +0 1604 0 +0 1719 0 +0 1838 0 +0 1960 0 +0 2084 0 +0 2210 0 +0 2338 0 +0 2467 0 +0 2596 0 +0 2727 0 +0 2857 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +1519 813 1404 +1515 822 1399 +1509 834 1394 +1501 850 1386 +1490 871 1375 +1475 897 1361 +1454 930 1341 +1425 970 1312 +1383 1019 1271 +1319 1077 1209 +1216 1145 1110 +1029 1222 933 +509 1308 469 +0 1402 0 +0 1504 0 +0 1612 0 +0 1725 0 +0 1843 0 +0 1963 0 +0 2087 0 +0 2213 0 +0 2340 0 +0 2468 0 +0 2597 0 +0 2727 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1666 868 1507 +1663 877 1504 +1659 888 1499 +1653 902 1493 +1645 920 1484 +1635 944 1473 +1620 973 1457 +1600 1010 1435 +1572 1055 1404 +1531 1109 1359 +1469 1172 1290 +1372 1245 1179 +1196 1327 967 +741 1418 252 +0 1517 0 +0 1622 0 +0 1733 0 +0 1849 0 +0 1968 0 +0 2091 0 +0 2215 0 +0 2342 0 +0 2470 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1809 933 1616 +1807 941 1613 +1804 950 1610 +1800 963 1605 +1794 979 1599 +1787 999 1590 +1776 1026 1578 +1762 1059 1561 +1742 1099 1537 +1715 1148 1504 +1675 1207 1455 +1615 1275 1381 +1520 1352 1257 +1352 1439 1010 +936 1533 0 +0 1635 0 +0 1743 0 +0 1857 0 +0 1974 0 +0 2095 0 +0 2219 0 +0 2344 0 +0 2472 0 +0 2600 0 +0 2729 0 +0 2859 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1949 1008 1730 +1948 1014 1728 +1946 1022 1725 +1943 1033 1722 +1938 1047 1717 +1933 1065 1710 +1925 1088 1701 +1915 1116 1688 +1901 1152 1670 +1882 1196 1646 +1855 1249 1610 +1815 1312 1559 +1757 1383 1479 +1664 1465 1344 +1501 1555 1061 +1110 1652 0 +0 1757 0 +0 1867 0 +0 1983 0 +0 2102 0 +0 2224 0 +0 2348 0 +0 2474 0 +0 2602 0 +0 2731 0 +0 2860 0 +0 2991 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +2087 1092 1849 +2086 1097 1847 +2085 1104 1845 +2082 1113 1842 +2079 1124 1838 +2075 1140 1833 +2070 1159 1826 +2062 1184 1816 +2052 1215 1803 +2039 1254 1785 +2019 1300 1759 +1992 1357 1722 +1954 1422 1668 +1896 1497 1584 +1805 1581 1439 +1646 1674 1121 +1271 1774 0 +0 1881 0 +0 1993 0 +0 2110 0 +0 2230 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2224 1184 1970 +2223 1189 1969 +2222 1194 1967 +2220 1201 1965 +2218 1211 1962 +2215 1224 1958 +2211 1240 1953 +2206 1261 1945 +2198 1287 1936 +2188 1320 1922 +2175 1361 1903 +2156 1410 1877 +2129 1469 1839 +2090 1537 1782 +2033 1615 1694 +1944 1702 1541 +1787 1797 1191 +1424 1899 0 +0 2007 0 +0 2121 0 +0 2238 0 +0 2359 0 +0 2483 0 +0 2608 0 +0 2736 0 +0 2864 0 +0 2993 0 +0 3123 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2359 1284 2094 +2359 1288 2093 +2358 1292 2092 +2357 1298 2090 +2355 1306 2088 +2353 1316 2085 +2350 1329 2081 +2346 1346 2075 +2340 1368 2068 +2333 1396 2058 +2323 1431 2044 +2309 1474 2025 +2291 1525 1998 +2264 1586 1959 +2226 1656 1901 +2169 1736 1810 +2080 1825 1649 +1926 1921 1271 +1571 2025 0 +0 2135 0 +0 2249 0 +0 2368 0 +0 2489 0 +0 2613 0 +0 2739 0 +0 2867 0 +0 2995 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +2494 1391 2220 +2493 1393 2219 +2493 1397 2218 +2492 1402 2217 +2491 1408 2215 +2489 1416 2213 +2487 1427 2210 +2484 1441 2206 +2480 1459 2200 +2474 1482 2193 +2467 1511 2183 +2457 1547 2168 +2444 1591 2149 +2425 1644 2121 +2398 1706 2082 +2361 1779 2022 +2304 1860 1929 +2216 1950 1763 +2063 2048 1359 +1714 2153 0 +0 2263 0 +0 2378 0 +0 2498 0 +0 2620 0 +0 2744 0 +0 2871 0 +0 2998 0 +0 3127 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +2628 1503 2347 +2627 1505 2347 +2627 1508 2346 +2626 1511 2345 +2625 1516 2344 +2624 1523 2342 +2622 1531 2340 +2620 1542 2337 +2617 1557 2333 +2613 1575 2327 +2608 1599 2319 +2601 1629 2309 +2591 1666 2295 +2577 1711 2275 +2559 1766 2247 +2532 1830 2207 +2495 1903 2146 +2438 1986 2051 +2351 2077 1881 +2199 2176 1456 +1853 2281 0 +0 2393 0 +0 2509 0 +0 2628 0 +0 2751 0 +0 2875 0 +0 3002 0 +0 3130 0 +0 3259 0 +0 3388 0 +0 3519 0 +0 3650 0 +2761 1619 2476 +2761 1621 2476 +2760 1623 2475 +2760 1626 2474 +2759 1630 2473 +2758 1635 2472 +2757 1641 2470 +2756 1650 2468 +2753 1661 2465 +2750 1676 2461 +2747 1695 2455 +2741 1720 2447 +2734 1750 2437 +2724 1788 2422 +2711 1835 2402 +2692 1890 2374 +2666 1955 2333 +2628 2029 2272 +2572 2113 2176 +2485 2205 2002 +2333 2305 1559 +1991 2411 0 +0 2523 0 +0 2639 0 +0 2759 0 +0 2882 0 +0 3007 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3520 0 +0 3651 0 +2894 1739 2605 +2894 1740 2605 +2894 1742 2605 +2893 1744 2604 +2893 1747 2603 +2892 1751 2602 +2891 1756 2601 +2890 1763 2599 +2888 1772 2597 +2886 1784 2594 +2883 1799 2590 +2879 1818 2584 +2874 1843 2576 +2867 1874 2566 +2857 1913 2551 +2844 1960 2531 +2825 2016 2502 +2799 2082 2461 +2761 2157 2400 +2705 2241 2302 +2618 2334 2125 +2468 2434 1668 +2128 2541 0 +0 2653 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +3027 1862 2735 +3027 1863 2735 +3027 1864 2735 +3026 1866 2735 +3026 1868 2734 +3026 1871 2733 +3025 1875 2732 +3024 1880 2731 +3023 1887 2729 +3021 1896 2727 +3019 1908 2724 +3016 1924 2720 +3012 1943 2714 +3007 1969 2706 +3000 2000 2695 +2990 2039 2681 +2976 2087 2660 +2958 2144 2632 +2932 2210 2590 +2894 2286 2528 +2838 2371 2430 +2752 2464 2251 +2601 2565 1783 +2263 2672 0 +0 2784 0 +0 2901 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3654 0 +3160 1987 2866 +3160 1988 2866 +3159 1989 2866 +3159 1990 2865 +3159 1992 2865 +3159 1994 2864 +3158 1997 2864 +3157 2001 2863 +3157 2006 2861 +3155 2013 2860 +3154 2023 2857 +3152 2035 2854 +3149 2050 2850 +3145 2070 2844 +3139 2096 2836 +3132 2128 2826 +3122 2167 2811 +3109 2215 2791 +3090 2272 2762 +3064 2339 2720 +3027 2415 2658 +2971 2501 2558 +2884 2594 2378 +2734 2696 1901 +2397 2803 0 +0 2916 0 +0 3033 0 +0 3153 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +3292 2114 2997 +3292 2114 2997 +3292 2115 2997 +3292 2116 2997 +3292 2117 2996 +3291 2119 2996 +3291 2121 2995 +3291 2124 2995 +3290 2128 2994 +3289 2134 2992 +3288 2141 2990 +3286 2150 2988 +3284 2162 2985 +3281 2178 2981 +3277 2198 2975 +3272 2224 2967 +3265 2256 2956 +3255 2296 2942 +3241 2344 2921 +3223 2402 2892 +3197 2469 2851 +3159 2546 2788 +3104 2631 2688 +3017 2725 2507 +2867 2827 2023 +2531 2934 0 +0 3047 0 +0 3164 0 +0 3285 0 +0 3408 0 +0 3534 0 +0 3661 0 +3425 2242 3128 +3425 2242 3128 +3425 2243 3128 +3424 2244 3128 +3424 2245 3128 +3424 2246 3127 +3424 2248 3127 +3423 2250 3126 +3423 2253 3126 +3422 2257 3125 +3421 2262 3123 +3420 2270 3122 +3418 2279 3119 +3416 2291 3116 +3413 2307 3112 +3410 2327 3106 +3404 2353 3098 +3397 2386 3087 +3387 2426 3073 +3374 2474 3052 +3355 2532 3023 +3329 2600 2981 +3292 2676 2919 +3236 2762 2818 +3150 2856 2636 +3000 2958 2147 +2665 3066 0 +0 3179 0 +0 3296 0 +0 3417 0 +0 3540 0 +0 3666 0 +3557 2371 3260 +3557 2371 3260 +3557 2372 3260 +3557 2372 3259 +3557 2373 3259 +3557 2374 3259 +3556 2375 3259 +3556 2377 3258 +3556 2379 3258 +3555 2382 3257 +3554 2387 3256 +3554 2392 3255 +3552 2399 3253 +3551 2409 3251 +3549 2421 3247 +3546 2437 3243 +3542 2457 3237 +3537 2483 3230 +3529 2516 3219 +3520 2556 3204 +3506 2605 3183 +3488 2663 3154 +3461 2730 3113 +3424 2807 3050 +3369 2894 2949 +3282 2988 2766 +3133 3090 2273 +2798 3197 0 +0 3311 0 +0 3428 0 +0 3549 0 +0 3672 0 +3689 2501 3391 +3689 2501 3391 +3689 2501 3391 +3689 2502 3391 +3689 2502 3391 +3689 2503 3391 +3689 2504 3391 +3689 2505 3390 +3688 2507 3390 +3688 2509 3389 +3687 2513 3389 +3687 2517 3388 +3686 2522 3386 +3685 2529 3385 +3683 2539 3382 +3681 2551 3379 +3678 2567 3375 +3674 2588 3369 +3669 2614 3361 +3662 2646 3350 +3652 2687 3336 +3638 2736 3315 +3620 2794 3286 +3594 2862 3244 +3556 2939 3181 +3501 3025 3080 +3414 3119 2897 +3265 3221 2400 +2931 3329 0 +0 3442 0 +0 3560 0 +0 3681 0 +3821 2631 3523 +3821 2631 3523 +3821 2632 3523 +3821 2632 3523 +3821 2632 3523 +3821 2633 3523 +3821 2634 3523 +3821 2635 3522 +3821 2636 3522 +3820 2638 3522 +3820 2640 3521 +3820 2643 3520 +3819 2647 3519 +3818 2653 3518 +3817 2660 3516 +3815 2669 3514 +3813 2682 3511 +3810 2698 3506 +3806 2718 3501 +3801 2745 3493 +3794 2777 3482 +3784 2818 3467 +3771 2867 3447 +3752 2925 3418 +3726 2993 3375 +3689 3070 3312 +3633 3157 3211 +3547 3251 3028 +3397 3353 2529 +3063 3461 0 +0 3574 0 +0 3692 0 +3954 2762 3655 +3954 2762 3655 +3954 2762 3655 +3954 2762 3655 +3954 2763 3655 +3953 2763 3655 +3953 2764 3655 +3953 2765 3654 +3953 2766 3654 +3953 2767 3654 +3953 2769 3653 +3952 2771 3653 +3952 2774 3652 +3951 2778 3651 +3950 2784 3650 +3949 2791 3648 +3947 2800 3646 +3945 2813 3643 +3942 2829 3638 +3938 2850 3632 +3933 2876 3625 +3926 2909 3614 +3916 2949 3599 +3903 2998 3578 +3884 3057 3549 +3858 3125 3507 +3821 3202 3444 +3765 3288 3343 +3679 3383 3159 +3530 3485 2658 +3196 3593 0 +0 3706 0 +4086 2893 3787 +4086 2893 3787 +4086 2893 3787 +4086 2893 3787 +4086 2894 3787 +4086 2894 3787 +4086 2894 3787 +4086 2895 3786 +4085 2896 3786 +4085 2897 3786 +4085 2898 3786 +4085 2900 3785 +4084 2902 3785 +4084 2905 3784 +4083 2909 3783 +4082 2915 3782 +4081 2922 3780 +4080 2932 3778 +4077 2944 3774 +4074 2960 3770 +4071 2981 3764 +4065 3007 3756 +4058 3040 3746 +4048 3081 3731 +4035 3130 3710 +4016 3188 3681 +3990 3256 3639 +3953 3334 3576 +3898 3420 3475 +3811 3515 3290 +3662 3617 2788 +3328 3725 0 +4095 3024 3919 +4095 3025 3919 +4095 3025 3919 +4095 3025 3919 +4095 3025 3919 +4095 3025 3919 +4095 3025 3919 +4095 3026 3918 +4095 3026 3918 +4095 3027 3918 +4095 3028 3918 +4095 3030 3918 +4095 3031 3917 +4095 3034 3917 +4095 3037 3916 +4095 3041 3915 +4095 3046 3914 +4095 3054 3912 +4095 3063 3910 +4095 3076 3906 +4095 3092 3902 +4095 3113 3896 +4095 3139 3888 +4095 3172 3878 +4095 3212 3863 +4095 3262 3842 +4095 3320 3813 +4095 3388 3771 +4085 3466 3708 +4030 3552 3606 +3943 3647 3422 +3794 3749 2919 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3156 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3158 4050 +4095 3158 4050 +4095 3159 4050 +4095 3160 4050 +4095 3161 4050 +4095 3163 4049 +4095 3165 4049 +4095 3168 4048 +4095 3173 4047 +4095 3178 4046 +4095 3185 4044 +4095 3195 4041 +4095 3207 4038 +4095 3224 4034 +4095 3244 4028 +4095 3271 4020 +4095 3304 4009 +4095 3344 3995 +4095 3393 3974 +4095 3452 3945 +4095 3520 3903 +4095 3597 3839 +4095 3684 3738 +4076 3779 3554 +0 723 961 +0 734 949 +0 749 934 +0 769 912 +0 793 881 +0 824 837 +0 862 769 +0 908 660 +0 964 453 +0 1029 0 +0 1104 0 +0 1187 0 +0 1280 0 +0 1380 0 +0 1486 0 +0 1598 0 +0 1714 0 +0 1834 0 +0 1957 0 +0 2082 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +0 727 977 +0 738 966 +0 753 951 +0 772 930 +0 796 901 +0 827 858 +0 865 794 +0 911 691 +0 966 502 +0 1031 0 +0 1105 0 +0 1189 0 +0 1281 0 +0 1380 0 +0 1487 0 +0 1598 0 +0 1715 0 +0 1835 0 +0 1957 0 +0 2082 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +0 732 998 +0 743 988 +0 758 974 +0 777 954 +0 801 926 +0 831 886 +0 869 825 +0 915 730 +0 969 560 +0 1034 134 +0 1108 0 +0 1191 0 +0 1282 0 +0 1382 0 +0 1488 0 +0 1599 0 +0 1715 0 +0 1835 0 +0 1958 0 +0 2082 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +0 739 1025 +0 750 1015 +0 764 1002 +0 783 983 +0 807 957 +0 837 920 +0 874 864 +0 919 777 +0 973 627 +0 1037 289 +0 1111 0 +0 1193 0 +0 1284 0 +0 1383 0 +0 1489 0 +0 1600 0 +0 1716 0 +0 1836 0 +0 1958 0 +0 2083 0 +0 2209 0 +0 2337 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +0 748 1059 +0 759 1050 +0 773 1037 +0 791 1020 +0 815 996 +0 844 962 +0 880 911 +0 925 834 +0 979 704 +0 1042 438 +0 1115 0 +0 1197 0 +0 1287 0 +0 1386 0 +0 1491 0 +0 1602 0 +0 1717 0 +0 1836 0 +0 1959 0 +0 2083 0 +0 2210 0 +0 2338 0 +0 2466 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3119 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +450 760 1100 +403 770 1092 +330 784 1080 +210 802 1065 +0 825 1043 +0 853 1012 +0 889 967 +0 933 900 +0 986 790 +0 1048 582 +0 1120 0 +0 1201 0 +0 1291 0 +0 1388 0 +0 1493 0 +0 1603 0 +0 1718 0 +0 1837 0 +0 1960 0 +0 2084 0 +0 2210 0 +0 2338 0 +0 2467 0 +0 2596 0 +0 2726 0 +0 2857 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +751 775 1150 +727 785 1143 +693 799 1132 +643 816 1119 +566 838 1099 +437 866 1072 +175 901 1033 +0 944 975 +0 995 884 +0 1056 723 +0 1127 342 +0 1207 0 +0 1296 0 +0 1392 0 +0 1496 0 +0 1606 0 +0 1720 0 +0 1839 0 +0 1961 0 +0 2085 0 +0 2211 0 +0 2338 0 +0 2467 0 +0 2597 0 +0 2727 0 +0 2857 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3514 0 +0 3646 0 +978 795 1209 +964 805 1203 +944 817 1194 +916 834 1182 +875 855 1165 +814 882 1142 +718 916 1108 +545 957 1060 +108 1008 985 +0 1067 862 +0 1136 615 +0 1215 0 +0 1302 0 +0 1397 0 +0 1500 0 +0 1609 0 +0 1723 0 +0 1841 0 +0 1962 0 +0 2086 0 +0 2212 0 +0 2339 0 +0 2468 0 +0 2597 0 +0 2727 0 +0 2858 0 +0 2988 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1170 820 1278 +1161 829 1273 +1148 841 1265 +1130 857 1255 +1105 877 1240 +1070 903 1221 +1017 935 1193 +936 975 1153 +798 1023 1093 +507 1081 998 +0 1148 830 +0 1225 414 +0 1310 0 +0 1404 0 +0 1506 0 +0 1613 0 +0 1726 0 +0 1843 0 +0 1964 0 +0 2087 0 +0 2213 0 +0 2340 0 +0 2468 0 +0 2597 0 +0 2727 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1343 851 1356 +1336 860 1352 +1327 871 1345 +1316 886 1337 +1299 905 1325 +1276 929 1308 +1244 960 1286 +1196 998 1253 +1123 1044 1206 +1004 1099 1134 +769 1164 1015 +0 1238 784 +0 1321 0 +0 1413 0 +0 1513 0 +0 1619 0 +0 1731 0 +0 1847 0 +0 1967 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +1502 890 1444 +1498 898 1440 +1492 909 1434 +1484 922 1427 +1472 940 1418 +1457 962 1404 +1435 991 1386 +1405 1026 1360 +1360 1070 1323 +1293 1122 1269 +1184 1184 1184 +979 1255 1037 +327 1335 715 +0 1425 0 +0 1522 0 +0 1626 0 +0 1736 0 +0 1851 0 +0 1970 0 +0 2092 0 +0 2216 0 +0 2343 0 +0 2470 0 +0 2599 0 +0 2728 0 +0 2859 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1654 938 1539 +1651 945 1536 +1647 954 1532 +1641 967 1526 +1633 982 1518 +1622 1003 1507 +1607 1029 1493 +1586 1062 1473 +1557 1102 1444 +1515 1151 1403 +1451 1209 1341 +1349 1277 1243 +1161 1354 1065 +641 1440 601 +0 1534 0 +0 1636 0 +0 1744 0 +0 1857 0 +0 1975 0 +0 2096 0 +0 2219 0 +0 2345 0 +0 2472 0 +0 2600 0 +0 2729 0 +0 2859 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1801 994 1642 +1798 1000 1639 +1795 1009 1636 +1791 1020 1631 +1785 1034 1625 +1778 1052 1617 +1767 1076 1605 +1752 1105 1589 +1732 1142 1567 +1704 1187 1536 +1663 1241 1491 +1601 1304 1423 +1504 1377 1311 +1328 1459 1099 +874 1550 384 +0 1649 0 +0 1754 0 +0 1865 0 +0 1981 0 +0 2100 0 +0 2223 0 +0 2347 0 +0 2474 0 +0 2602 0 +0 2731 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +1943 1060 1750 +1941 1066 1748 +1939 1073 1746 +1936 1082 1742 +1932 1095 1737 +1926 1111 1731 +1919 1132 1722 +1908 1158 1710 +1894 1191 1693 +1874 1231 1670 +1847 1281 1636 +1807 1339 1587 +1747 1407 1513 +1652 1484 1389 +1484 1571 1142 +1068 1665 0 +0 1767 0 +0 1876 0 +0 1989 0 +0 2106 0 +0 2227 0 +0 2351 0 +0 2477 0 +0 2604 0 +0 2732 0 +0 2861 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +2083 1136 1864 +2082 1140 1862 +2080 1146 1860 +2078 1155 1858 +2075 1165 1854 +2071 1179 1849 +2065 1197 1842 +2058 1220 1833 +2047 1249 1820 +2033 1284 1802 +2014 1328 1778 +1987 1381 1743 +1947 1444 1691 +1889 1516 1611 +1796 1597 1476 +1633 1687 1193 +1242 1784 0 +0 1889 0 +0 1999 0 +0 2115 0 +0 2234 0 +0 2356 0 +0 2480 0 +0 2606 0 +0 2734 0 +0 2863 0 +0 2993 0 +0 3123 0 +0 3253 0 +0 3385 0 +0 3516 0 +0 3647 0 +2221 1220 1982 +2220 1224 1981 +2218 1229 1979 +2217 1236 1977 +2214 1245 1974 +2211 1257 1970 +2207 1272 1965 +2202 1291 1958 +2195 1316 1948 +2185 1347 1935 +2171 1386 1917 +2151 1433 1891 +2124 1489 1854 +2086 1554 1800 +2028 1629 1716 +1937 1713 1571 +1778 1806 1253 +1403 1906 0 +0 2013 0 +0 2125 0 +0 2242 0 +0 2362 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2357 1313 2103 +2356 1316 2102 +2355 1321 2101 +2354 1326 2099 +2352 1334 2097 +2350 1343 2094 +2347 1356 2090 +2343 1372 2085 +2338 1393 2078 +2330 1419 2068 +2320 1452 2054 +2307 1493 2035 +2288 1543 2009 +2261 1601 1971 +2222 1669 1915 +2165 1747 1826 +2076 1834 1673 +1919 1929 1323 +1556 2031 0 +0 2139 0 +0 2253 0 +0 2370 0 +0 2491 0 +0 2615 0 +0 2741 0 +0 2868 0 +0 2996 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2492 1414 2227 +2491 1416 2226 +2491 1420 2225 +2490 1424 2224 +2489 1430 2222 +2487 1438 2220 +2485 1448 2217 +2482 1461 2213 +2478 1479 2208 +2472 1501 2200 +2465 1528 2190 +2455 1563 2176 +2442 1606 2157 +2423 1657 2130 +2396 1718 2091 +2358 1788 2033 +2301 1868 1942 +2213 1957 1782 +2058 2053 1403 +1703 2157 0 +0 2267 0 +0 2381 0 +0 2500 0 +0 2621 0 +0 2745 0 +0 2871 0 +0 2999 0 +0 3128 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +2626 1521 2353 +2626 1523 2352 +2625 1526 2351 +2625 1529 2350 +2624 1534 2349 +2623 1540 2347 +2621 1548 2345 +2619 1559 2342 +2616 1573 2338 +2612 1591 2332 +2607 1614 2325 +2599 1643 2315 +2589 1679 2301 +2576 1723 2281 +2557 1776 2253 +2531 1839 2214 +2493 1911 2154 +2436 1992 2061 +2348 2082 1895 +2195 2180 1491 +1846 2285 0 +0 2395 0 +0 2511 0 +0 2630 0 +0 2752 0 +0 2876 0 +0 3003 0 +0 3130 0 +0 3259 0 +0 3389 0 +0 3519 0 +0 3650 0 +2760 1633 2480 +2760 1635 2479 +2759 1637 2479 +2759 1640 2478 +2758 1643 2477 +2757 1648 2476 +2756 1655 2474 +2755 1663 2472 +2752 1674 2469 +2749 1689 2465 +2745 1707 2459 +2740 1731 2451 +2733 1761 2441 +2723 1798 2427 +2710 1843 2407 +2691 1898 2379 +2664 1962 2339 +2627 2035 2278 +2571 2118 2183 +2483 2209 2013 +2331 2308 1588 +1986 2414 0 +0 2525 0 +0 2641 0 +0 2760 0 +0 2883 0 +0 3007 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3521 0 +0 3651 0 +2893 1750 2608 +2893 1751 2608 +2893 1753 2608 +2893 1755 2607 +2892 1758 2606 +2891 1762 2605 +2891 1767 2604 +2889 1773 2602 +2888 1782 2600 +2886 1793 2597 +2883 1808 2593 +2879 1827 2587 +2873 1852 2579 +2866 1882 2569 +2856 1920 2554 +2843 1967 2534 +2824 2022 2506 +2798 2087 2465 +2760 2161 2404 +2704 2245 2308 +2617 2337 2134 +2465 2437 1691 +2123 2543 0 +0 2655 0 +0 2771 0 +0 2891 0 +0 3014 0 +0 3139 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3652 0 +3026 1870 2738 +3026 1871 2737 +3026 1873 2737 +3026 1874 2737 +3025 1876 2736 +3025 1879 2735 +3024 1883 2735 +3023 1888 2733 +3022 1895 2732 +3021 1904 2729 +3018 1916 2726 +3015 1931 2722 +3012 1950 2716 +3006 1975 2708 +2999 2006 2698 +2989 2045 2683 +2976 2092 2663 +2957 2148 2635 +2931 2214 2593 +2893 2289 2532 +2838 2373 2434 +2750 2466 2258 +2600 2567 1800 +2260 2673 0 +0 2786 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3655 0 +3159 1993 2868 +3159 1994 2868 +3159 1995 2867 +3159 1996 2867 +3159 1998 2867 +3158 2000 2866 +3158 2003 2865 +3157 2007 2864 +3156 2012 2863 +3155 2019 2861 +3153 2028 2859 +3151 2040 2856 +3148 2056 2852 +3144 2075 2846 +3139 2101 2838 +3132 2132 2827 +3122 2172 2813 +3109 2219 2793 +3090 2276 2764 +3064 2342 2723 +3026 2418 2661 +2971 2503 2562 +2884 2596 2383 +2733 2697 1915 +2395 2804 0 +0 2917 0 +0 3033 0 +0 3154 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +3292 2119 2998 +3292 2119 2998 +3292 2120 2998 +3292 2121 2998 +3291 2122 2997 +3291 2124 2997 +3291 2126 2997 +3290 2129 2996 +3290 2133 2995 +3289 2138 2994 +3287 2145 2992 +3286 2155 2989 +3284 2167 2986 +3281 2182 2982 +3277 2202 2976 +3272 2228 2968 +3264 2260 2958 +3255 2299 2943 +3241 2347 2923 +3222 2405 2894 +3196 2471 2852 +3159 2548 2790 +3103 2633 2691 +3017 2727 2510 +2866 2828 2033 +2530 2935 0 +0 3048 0 +0 3165 0 +0 3285 0 +0 3409 0 +0 3534 0 +0 3661 0 +3424 2246 3129 +3424 2246 3129 +3424 2246 3129 +3424 2247 3129 +3424 2248 3129 +3424 2249 3128 +3424 2251 3128 +3423 2253 3127 +3423 2257 3127 +3422 2261 3126 +3421 2266 3124 +3420 2273 3123 +3418 2282 3120 +3416 2294 3117 +3413 2310 3113 +3409 2330 3107 +3404 2356 3099 +3397 2388 3088 +3387 2428 3074 +3374 2477 3053 +3355 2534 3024 +3329 2601 2983 +3291 2678 2920 +3236 2763 2820 +3149 2857 2639 +2999 2959 2155 +2663 3066 0 +0 3179 0 +0 3297 0 +0 3417 0 +0 3540 0 +0 3666 0 +3557 2374 3260 +3557 2374 3260 +3557 2374 3260 +3557 2375 3260 +3556 2376 3260 +3556 2377 3260 +3556 2378 3259 +3556 2380 3259 +3555 2382 3259 +3555 2385 3258 +3554 2389 3257 +3553 2395 3255 +3552 2402 3254 +3551 2411 3251 +3548 2423 3248 +3546 2439 3244 +3542 2459 3238 +3536 2485 3230 +3529 2518 3220 +3519 2558 3205 +3506 2607 3184 +3487 2664 3155 +3461 2732 3114 +3424 2808 3051 +3368 2894 2950 +3282 2989 2768 +3132 3090 2279 +2797 3198 0 +0 3311 0 +0 3428 0 +0 3549 0 +0 3672 0 +3689 2503 3392 +3689 2503 3392 +3689 2503 3392 +3689 2504 3392 +3689 2504 3392 +3689 2505 3391 +3689 2506 3391 +3688 2507 3391 +3688 2509 3390 +3688 2511 3390 +3687 2515 3389 +3687 2519 3388 +3686 2524 3387 +3684 2531 3385 +3683 2541 3383 +3681 2553 3380 +3678 2569 3375 +3674 2589 3369 +3669 2615 3362 +3661 2648 3351 +3652 2688 3336 +3638 2737 3316 +3620 2795 3287 +3594 2863 3245 +3556 2940 3182 +3501 3026 3081 +3414 3120 2898 +3265 3222 2405 +2930 3330 0 +0 3443 0 +0 3560 0 +0 3681 0 +3821 2633 3524 +3821 2633 3523 +3821 2633 3523 +3821 2633 3523 +3821 2634 3523 +3821 2634 3523 +3821 2635 3523 +3821 2636 3523 +3821 2637 3522 +3820 2639 3522 +3820 2642 3521 +3819 2645 3521 +3819 2649 3520 +3818 2654 3518 +3817 2661 3517 +3815 2671 3514 +3813 2683 3511 +3810 2699 3507 +3806 2720 3501 +3801 2746 3493 +3794 2779 3482 +3784 2819 3468 +3770 2868 3447 +3752 2926 3418 +3726 2994 3376 +3688 3071 3313 +3633 3157 3212 +3547 3252 3029 +3397 3353 2532 +3063 3461 0 +0 3575 0 +0 3692 0 +3954 2763 3655 +3954 2763 3655 +3954 2763 3655 +3954 2764 3655 +3953 2764 3655 +3953 2764 3655 +3953 2765 3655 +3953 2766 3655 +3953 2767 3654 +3953 2768 3654 +3953 2770 3654 +3952 2772 3653 +3952 2775 3652 +3951 2779 3651 +3950 2785 3650 +3949 2792 3648 +3947 2802 3646 +3945 2814 3643 +3942 2830 3639 +3938 2851 3633 +3933 2877 3625 +3926 2910 3614 +3916 2950 3599 +3903 2999 3579 +3884 3057 3550 +3858 3125 3508 +3821 3202 3444 +3765 3289 3344 +3679 3383 3160 +3529 3485 2661 +3195 3593 0 +0 3706 0 +4086 2894 3787 +4086 2894 3787 +4086 2894 3787 +4086 2894 3787 +4086 2895 3787 +4086 2895 3787 +4086 2895 3787 +4085 2896 3787 +4085 2897 3786 +4085 2898 3786 +4085 2899 3786 +4085 2901 3786 +4084 2903 3785 +4084 2906 3784 +4083 2910 3783 +4082 2916 3782 +4081 2923 3780 +4079 2933 3778 +4077 2945 3775 +4074 2961 3770 +4071 2982 3765 +4065 3008 3757 +4058 3041 3746 +4048 3081 3731 +4035 3130 3710 +4016 3189 3681 +3990 3257 3639 +3953 3334 3576 +3898 3420 3475 +3811 3515 3291 +3662 3617 2790 +3328 3725 0 +4095 3025 3919 +4095 3025 3919 +4095 3025 3919 +4095 3025 3919 +4095 3026 3919 +4095 3026 3919 +4095 3026 3919 +4095 3027 3919 +4095 3027 3919 +4095 3028 3918 +4095 3029 3918 +4095 3030 3918 +4095 3032 3917 +4095 3034 3917 +4095 3037 3916 +4095 3042 3915 +4095 3047 3914 +4095 3054 3912 +4095 3064 3910 +4095 3076 3906 +4095 3092 3902 +4095 3113 3896 +4095 3139 3888 +4095 3172 3878 +4095 3213 3863 +4095 3262 3842 +4095 3320 3813 +4095 3388 3771 +4085 3466 3708 +4030 3552 3607 +3943 3647 3422 +3794 3749 2920 +4095 3156 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3158 4051 +4095 3158 4051 +4095 3159 4050 +4095 3159 4050 +4095 3160 4050 +4095 3162 4050 +4095 3163 4049 +4095 3166 4049 +4095 3169 4048 +4095 3173 4047 +4095 3179 4046 +4095 3186 4044 +4095 3195 4042 +4095 3208 4038 +4095 3224 4034 +4095 3245 4028 +4095 3271 4020 +4095 3304 4010 +4095 3345 3995 +4095 3394 3974 +4095 3452 3945 +4095 3520 3903 +4095 3598 3840 +4095 3684 3738 +4075 3779 3554 +0 843 1089 +0 852 1080 +0 864 1068 +0 879 1052 +0 898 1030 +0 923 998 +0 954 952 +0 992 882 +0 1039 767 +0 1094 545 +0 1160 0 +0 1234 0 +0 1318 0 +0 1411 0 +0 1511 0 +0 1617 0 +0 1729 0 +0 1846 0 +0 1966 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +0 846 1101 +0 855 1093 +0 867 1082 +0 881 1066 +0 901 1044 +0 925 1013 +0 956 969 +0 994 901 +0 1041 792 +0 1096 585 +0 1161 0 +0 1236 0 +0 1319 0 +0 1412 0 +0 1512 0 +0 1618 0 +0 1730 0 +0 1846 0 +0 1966 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +0 850 1117 +0 859 1109 +0 870 1098 +0 885 1083 +0 904 1063 +0 928 1033 +0 959 990 +0 997 926 +0 1043 823 +0 1098 634 +0 1163 101 +0 1237 0 +0 1321 0 +0 1413 0 +0 1513 0 +0 1619 0 +0 1730 0 +0 1847 0 +0 1967 0 +0 2089 0 +0 2214 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +0 856 1138 +0 864 1130 +0 875 1120 +0 890 1106 +0 909 1086 +0 933 1058 +0 963 1018 +0 1001 957 +0 1047 862 +0 1101 692 +0 1166 266 +0 1240 0 +0 1323 0 +0 1414 0 +0 1514 0 +0 1620 0 +0 1731 0 +0 1847 0 +0 1967 0 +0 2090 0 +0 2215 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3251 0 +0 3383 0 +0 3515 0 +0 3646 0 +0 863 1164 +0 871 1157 +0 882 1147 +0 897 1134 +0 915 1115 +0 939 1089 +0 969 1052 +0 1006 996 +0 1051 909 +0 1106 759 +0 1169 421 +0 1243 0 +0 1325 0 +0 1417 0 +0 1515 0 +0 1621 0 +0 1732 0 +0 1848 0 +0 1968 0 +0 2090 0 +0 2215 0 +0 2341 0 +0 2469 0 +0 2598 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3646 0 +133 872 1198 +32 880 1191 +0 891 1182 +0 905 1169 +0 923 1152 +0 947 1128 +0 976 1094 +0 1013 1043 +0 1057 966 +0 1111 836 +0 1174 570 +0 1247 0 +0 1329 0 +0 1419 0 +0 1518 0 +0 1623 0 +0 1734 0 +0 1849 0 +0 1968 0 +0 2091 0 +0 2215 0 +0 2342 0 +0 2470 0 +0 2599 0 +0 2728 0 +0 2858 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +615 884 1238 +582 892 1232 +535 902 1224 +462 916 1213 +342 934 1197 +107 957 1175 +0 986 1144 +0 1021 1100 +0 1065 1032 +0 1118 922 +0 1180 714 +0 1252 39 +0 1333 0 +0 1423 0 +0 1521 0 +0 1625 0 +0 1735 0 +0 1851 0 +0 1970 0 +0 2092 0 +0 2216 0 +0 2342 0 +0 2470 0 +0 2599 0 +0 2728 0 +0 2859 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +901 899 1288 +883 907 1282 +859 917 1275 +825 931 1265 +775 948 1251 +698 970 1231 +569 998 1204 +307 1033 1165 +0 1076 1107 +0 1127 1016 +0 1188 855 +0 1259 474 +0 1339 0 +0 1428 0 +0 1524 0 +0 1628 0 +0 1738 0 +0 1852 0 +0 1971 0 +0 2093 0 +0 2217 0 +0 2343 0 +0 2470 0 +0 2599 0 +0 2729 0 +0 2859 0 +0 2989 0 +0 3120 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1121 919 1346 +1110 927 1341 +1096 937 1335 +1076 949 1326 +1048 966 1314 +1007 987 1297 +947 1014 1274 +850 1048 1241 +677 1089 1192 +240 1140 1117 +0 1199 994 +0 1268 747 +0 1347 0 +0 1434 0 +0 1530 0 +0 1632 0 +0 1741 0 +0 1855 0 +0 1973 0 +0 2094 0 +0 2218 0 +0 2344 0 +0 2471 0 +0 2600 0 +0 2729 0 +0 2859 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1309 945 1414 +1302 952 1410 +1293 961 1405 +1280 973 1397 +1262 989 1387 +1237 1009 1372 +1202 1035 1353 +1149 1067 1325 +1068 1107 1285 +930 1156 1225 +639 1213 1130 +0 1280 962 +0 1357 546 +0 1442 0 +0 1536 0 +0 1638 0 +0 1745 0 +0 1858 0 +0 1976 0 +0 2096 0 +0 2220 0 +0 2345 0 +0 2472 0 +0 2600 0 +0 2729 0 +0 2859 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +1479 977 1492 +1475 983 1488 +1468 992 1484 +1460 1003 1477 +1448 1018 1469 +1431 1037 1457 +1408 1061 1441 +1376 1092 1418 +1328 1130 1385 +1255 1176 1338 +1136 1231 1266 +901 1296 1148 +0 1370 916 +0 1453 0 +0 1545 0 +0 1645 0 +0 1751 0 +0 1863 0 +0 1979 0 +0 2099 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +1638 1016 1579 +1635 1022 1576 +1630 1030 1572 +1624 1041 1567 +1616 1054 1559 +1604 1072 1550 +1589 1094 1537 +1567 1123 1518 +1537 1158 1492 +1492 1202 1455 +1425 1254 1401 +1316 1316 1316 +1111 1387 1169 +459 1468 847 +0 1557 0 +0 1654 0 +0 1758 0 +0 1869 0 +0 1983 0 +0 2102 0 +0 2224 0 +0 2348 0 +0 2475 0 +0 2602 0 +0 2731 0 +0 2861 0 +0 2991 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +1789 1064 1673 +1786 1070 1671 +1783 1077 1668 +1779 1086 1664 +1773 1099 1658 +1765 1115 1650 +1754 1135 1640 +1739 1161 1625 +1719 1194 1605 +1689 1234 1576 +1647 1283 1535 +1583 1341 1473 +1481 1409 1375 +1293 1486 1197 +773 1572 733 +0 1667 0 +0 1768 0 +0 1876 0 +0 1989 0 +0 2107 0 +0 2228 0 +0 2351 0 +0 2477 0 +0 2604 0 +0 2732 0 +0 2861 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +1934 1121 1775 +1933 1126 1774 +1930 1133 1771 +1927 1141 1768 +1923 1152 1763 +1917 1166 1757 +1910 1184 1749 +1899 1208 1737 +1885 1237 1721 +1864 1274 1700 +1836 1319 1668 +1795 1373 1623 +1734 1436 1555 +1636 1509 1443 +1460 1592 1231 +1006 1682 516 +0 1781 0 +0 1886 0 +0 1997 0 +0 2113 0 +0 2232 0 +0 2355 0 +0 2479 0 +0 2606 0 +0 2734 0 +0 2863 0 +0 2992 0 +0 3123 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +2076 1188 1884 +2075 1192 1882 +2074 1198 1880 +2071 1205 1878 +2068 1214 1874 +2064 1227 1869 +2058 1243 1863 +2051 1264 1854 +2041 1290 1842 +2026 1323 1825 +2007 1363 1802 +1979 1413 1768 +1939 1471 1720 +1879 1539 1645 +1784 1616 1521 +1616 1703 1274 +1200 1798 0 +0 1899 0 +0 2008 0 +0 2121 0 +0 2239 0 +0 2359 0 +0 2483 0 +0 2609 0 +0 2736 0 +0 2864 0 +0 2993 0 +0 3123 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2216 1264 1997 +2215 1268 1996 +2214 1272 1995 +2212 1279 1992 +2210 1287 1990 +2207 1297 1986 +2203 1311 1981 +2197 1329 1974 +2190 1352 1965 +2179 1381 1952 +2165 1417 1935 +2146 1461 1910 +2119 1513 1875 +2079 1576 1823 +2021 1648 1743 +1928 1729 1608 +1765 1819 1325 +1374 1916 0 +0 2021 0 +0 2132 0 +0 2247 0 +0 2366 0 +0 2488 0 +0 2612 0 +0 2739 0 +0 2866 0 +0 2995 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +2353 1349 2115 +2353 1352 2114 +2352 1356 2113 +2350 1361 2111 +2349 1368 2109 +2347 1377 2106 +2344 1389 2102 +2340 1404 2097 +2334 1423 2090 +2327 1448 2080 +2317 1479 2067 +2303 1518 2049 +2284 1565 2023 +2257 1621 1987 +2218 1686 1932 +2160 1761 1848 +2069 1846 1703 +1910 1938 1386 +1535 2039 0 +0 2145 0 +0 2257 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2489 1443 2236 +2489 1445 2235 +2488 1449 2234 +2487 1453 2233 +2486 1458 2231 +2484 1466 2229 +2482 1475 2226 +2479 1488 2222 +2475 1504 2217 +2470 1525 2210 +2462 1551 2200 +2452 1584 2186 +2439 1625 2167 +2420 1675 2141 +2393 1733 2103 +2355 1802 2047 +2297 1879 1958 +2208 1966 1805 +2051 2061 1456 +1688 2163 0 +0 2271 0 +0 2385 0 +0 2502 0 +0 2623 0 +0 2747 0 +0 2873 0 +0 3000 0 +0 3128 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2624 1544 2359 +2624 1546 2359 +2624 1549 2358 +2623 1552 2357 +2622 1556 2356 +2621 1562 2354 +2619 1570 2352 +2617 1580 2349 +2614 1593 2345 +2610 1611 2340 +2605 1633 2332 +2597 1661 2322 +2587 1695 2308 +2574 1738 2289 +2555 1789 2262 +2528 1850 2223 +2490 1921 2165 +2433 2000 2074 +2345 2089 1914 +2190 2186 1535 +1835 2289 0 +0 2399 0 +0 2513 0 +0 2632 0 +0 2753 0 +0 2877 0 +0 3004 0 +0 3131 0 +0 3260 0 +0 3389 0 +0 3519 0 +0 3650 0 +2759 1651 2485 +2758 1653 2485 +2758 1655 2484 +2758 1658 2483 +2757 1661 2482 +2756 1666 2481 +2755 1672 2480 +2753 1680 2477 +2751 1691 2474 +2748 1705 2470 +2744 1723 2465 +2739 1746 2457 +2731 1775 2447 +2721 1811 2433 +2708 1855 2413 +2689 1908 2385 +2663 1971 2346 +2625 2043 2287 +2568 2124 2193 +2480 2214 2027 +2327 2312 1623 +1978 2417 0 +0 2527 0 +0 2643 0 +0 2762 0 +0 2884 0 +0 3008 0 +0 3135 0 +0 3262 0 +0 3391 0 +0 3521 0 +0 3651 0 +2892 1764 2612 +2892 1765 2612 +2892 1767 2612 +2892 1769 2611 +2891 1772 2610 +2890 1775 2609 +2889 1780 2608 +2888 1787 2606 +2887 1795 2604 +2884 1806 2601 +2882 1821 2597 +2878 1839 2591 +2872 1863 2584 +2865 1893 2573 +2855 1930 2559 +2842 1976 2539 +2823 2030 2511 +2797 2094 2471 +2759 2167 2411 +2703 2250 2315 +2615 2341 2145 +2463 2440 1720 +2118 2546 0 +0 2657 0 +0 2773 0 +0 2892 0 +0 3015 0 +0 3140 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3653 0 +3026 1881 2741 +3026 1882 2740 +3025 1883 2740 +3025 1885 2740 +3025 1887 2739 +3024 1890 2738 +3024 1894 2737 +3023 1899 2736 +3021 1905 2734 +3020 1914 2732 +3018 1926 2729 +3015 1940 2725 +3011 1960 2719 +3005 1984 2712 +2998 2015 2701 +2988 2053 2687 +2975 2099 2667 +2956 2154 2638 +2930 2219 2598 +2892 2294 2537 +2836 2377 2440 +2749 2469 2266 +2598 2569 1823 +2256 2675 0 +0 2787 0 +0 2903 0 +0 3023 0 +0 3146 0 +0 3271 0 +0 3398 0 +0 3526 0 +0 3655 0 +3159 2002 2870 +3159 2002 2870 +3158 2003 2870 +3158 2005 2869 +3158 2006 2869 +3158 2008 2868 +3157 2011 2868 +3156 2015 2867 +3156 2020 2865 +3154 2027 2864 +3153 2036 2861 +3151 2048 2858 +3148 2063 2854 +3144 2082 2848 +3138 2107 2840 +3131 2139 2830 +3121 2177 2815 +3108 2224 2795 +3089 2280 2767 +3063 2346 2726 +3025 2421 2664 +2970 2506 2566 +2883 2598 2390 +2732 2699 1933 +2392 2805 0 +0 2918 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3403 0 +0 3529 0 +0 3658 0 +3291 2125 3000 +3291 2125 3000 +3291 2126 3000 +3291 2127 2999 +3291 2128 2999 +3291 2130 2999 +3290 2132 2998 +3290 2135 2997 +3289 2139 2996 +3288 2145 2995 +3287 2151 2993 +3285 2161 2991 +3283 2172 2988 +3280 2188 2984 +3276 2208 2978 +3271 2233 2970 +3264 2264 2960 +3254 2304 2945 +3241 2351 2925 +3222 2408 2896 +3196 2474 2855 +3158 2550 2793 +3103 2635 2694 +3016 2728 2515 +2865 2829 2047 +2527 2936 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3534 0 +0 3661 0 +3424 2250 3130 +3424 2251 3130 +3424 2251 3130 +3424 2252 3130 +3424 2253 3130 +3423 2254 3130 +3423 2256 3129 +3423 2258 3129 +3422 2261 3128 +3422 2265 3127 +3421 2271 3126 +3420 2278 3124 +3418 2287 3122 +3416 2299 3118 +3413 2314 3114 +3409 2334 3108 +3404 2360 3101 +3396 2392 3090 +3387 2431 3075 +3373 2479 3055 +3355 2537 3026 +3328 2603 2984 +3291 2680 2922 +3235 2765 2823 +3149 2859 2643 +2999 2960 2165 +2662 3067 0 +0 3180 0 +0 3297 0 +0 3418 0 +0 3541 0 +0 3666 0 +3557 2377 3261 +3557 2378 3261 +3556 2378 3261 +3556 2379 3261 +3556 2379 3261 +3556 2380 3261 +3556 2382 3260 +3556 2383 3260 +3555 2386 3259 +3555 2389 3259 +3554 2393 3258 +3553 2398 3256 +3552 2405 3255 +3550 2414 3252 +3548 2427 3249 +3545 2442 3245 +3541 2462 3239 +3536 2488 3231 +3529 2520 3221 +3519 2560 3206 +3506 2609 3185 +3487 2666 3157 +3461 2733 3115 +3423 2810 3052 +3368 2896 2952 +3281 2989 2771 +3131 3091 2287 +2795 3198 0 +0 3311 0 +0 3429 0 +0 3549 0 +0 3673 0 +3689 2506 3393 +3689 2506 3393 +3689 2506 3392 +3689 2506 3392 +3689 2507 3392 +3689 2508 3392 +3688 2509 3392 +3688 2510 3392 +3688 2512 3391 +3688 2514 3391 +3687 2517 3390 +3686 2521 3389 +3686 2527 3388 +3684 2534 3386 +3683 2543 3383 +3681 2555 3380 +3678 2571 3376 +3674 2592 3370 +3668 2617 3362 +3661 2650 3352 +3651 2690 3337 +3638 2739 3316 +3619 2796 3287 +3593 2864 3246 +3556 2941 3183 +3500 3026 3083 +3414 3121 2900 +3264 3222 2411 +2929 3330 0 +0 3443 0 +0 3560 0 +0 3681 0 +3821 2635 3524 +3821 2635 3524 +3821 2635 3524 +3821 2635 3524 +3821 2636 3524 +3821 2636 3524 +3821 2637 3523 +3821 2638 3523 +3821 2639 3523 +3820 2641 3523 +3820 2644 3522 +3819 2647 3521 +3819 2651 3520 +3818 2656 3519 +3817 2663 3517 +3815 2673 3515 +3813 2685 3512 +3810 2701 3507 +3806 2721 3502 +3801 2747 3494 +3794 2780 3483 +3784 2820 3468 +3770 2869 3448 +3752 2927 3419 +3726 2995 3377 +3688 3072 3314 +3633 3158 3213 +3546 3252 3030 +3397 3354 2537 +3062 3462 0 +0 3575 0 +0 3692 0 +3953 2765 3656 +3953 2765 3656 +3953 2765 3656 +3953 2765 3656 +3953 2765 3655 +3953 2766 3655 +3953 2766 3655 +3953 2767 3655 +3953 2768 3655 +3953 2770 3655 +3952 2771 3654 +3952 2774 3654 +3952 2777 3653 +3951 2781 3652 +3950 2786 3651 +3949 2793 3649 +3947 2803 3646 +3945 2815 3643 +3942 2831 3639 +3938 2852 3633 +3933 2878 3625 +3926 2911 3615 +3916 2951 3600 +3903 3000 3579 +3884 3058 3550 +3858 3126 3508 +3821 3203 3445 +3765 3289 3344 +3679 3384 3161 +3529 3485 2664 +3195 3593 0 +0 3707 0 +4086 2895 3787 +4086 2895 3787 +4086 2895 3787 +4086 2896 3787 +4086 2896 3787 +4086 2896 3787 +4086 2896 3787 +4085 2897 3787 +4085 2898 3787 +4085 2899 3787 +4085 2900 3786 +4085 2902 3786 +4084 2904 3785 +4084 2907 3785 +4083 2911 3784 +4082 2917 3782 +4081 2924 3780 +4079 2934 3778 +4077 2946 3775 +4074 2962 3771 +4070 2983 3765 +4065 3009 3757 +4058 3042 3746 +4048 3082 3731 +4035 3131 3711 +4016 3189 3682 +3990 3257 3640 +3953 3334 3577 +3897 3421 3476 +3811 3515 3292 +3662 3617 2793 +3327 3725 0 +4095 3026 3919 +4095 3026 3919 +4095 3026 3919 +4095 3026 3919 +4095 3026 3919 +4095 3027 3919 +4095 3027 3919 +4095 3027 3919 +4095 3028 3919 +4095 3029 3919 +4095 3030 3918 +4095 3031 3918 +4095 3033 3918 +4095 3035 3917 +4095 3038 3916 +4095 3042 3915 +4095 3048 3914 +4095 3055 3912 +4095 3065 3910 +4095 3077 3907 +4095 3093 3902 +4095 3114 3897 +4095 3140 3889 +4095 3173 3878 +4095 3213 3863 +4095 3263 3843 +4095 3321 3813 +4095 3389 3771 +4085 3466 3708 +4030 3552 3607 +3943 3647 3423 +3794 3749 2922 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3157 4051 +4095 3158 4051 +4095 3158 4051 +4095 3158 4051 +4095 3159 4051 +4095 3159 4051 +4095 3160 4050 +4095 3161 4050 +4095 3162 4050 +4095 3164 4049 +4095 3166 4049 +4095 3170 4048 +4095 3174 4047 +4095 3179 4046 +4095 3186 4044 +4095 3196 4042 +4095 3208 4039 +4095 3224 4034 +4095 3245 4028 +4095 3271 4021 +4095 3304 4010 +4095 3345 3995 +4095 3394 3974 +4095 3453 3945 +4095 3520 3903 +4095 3598 3840 +4095 3684 3739 +4075 3779 3555 +0 966 1218 +0 973 1211 +0 982 1202 +0 994 1191 +0 1009 1174 +0 1028 1151 +0 1053 1119 +0 1084 1071 +0 1122 999 +0 1169 879 +0 1225 645 +0 1291 0 +0 1366 0 +0 1450 0 +0 1542 0 +0 1643 0 +0 1749 0 +0 1861 0 +0 1978 0 +0 2098 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3383 0 +0 3515 0 +0 3647 0 +0 969 1227 +0 975 1221 +0 984 1212 +0 996 1201 +0 1011 1185 +0 1030 1162 +0 1055 1130 +0 1086 1084 +0 1124 1014 +0 1171 899 +0 1226 677 +0 1292 0 +0 1367 0 +0 1451 0 +0 1543 0 +0 1643 0 +0 1750 0 +0 1862 0 +0 1978 0 +0 2098 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +0 972 1239 +0 978 1233 +0 987 1225 +0 999 1214 +0 1014 1198 +0 1033 1176 +0 1057 1146 +0 1088 1101 +0 1126 1033 +0 1173 924 +0 1228 717 +0 1293 53 +0 1368 0 +0 1452 0 +0 1544 0 +0 1644 0 +0 1750 0 +0 1862 0 +0 1978 0 +0 2098 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +0 976 1255 +0 982 1249 +0 991 1241 +0 1002 1230 +0 1017 1215 +0 1036 1195 +0 1061 1165 +0 1091 1122 +0 1129 1058 +0 1175 955 +0 1231 766 +0 1295 233 +0 1370 0 +0 1453 0 +0 1545 0 +0 1645 0 +0 1751 0 +0 1863 0 +0 1979 0 +0 2099 0 +0 2221 0 +0 2346 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +0 981 1276 +0 988 1270 +0 996 1263 +0 1008 1252 +0 1022 1238 +0 1041 1218 +0 1065 1190 +0 1095 1150 +0 1133 1090 +0 1179 994 +0 1234 824 +0 1298 398 +0 1372 0 +0 1455 0 +0 1547 0 +0 1646 0 +0 1752 0 +0 1863 0 +0 1979 0 +0 2099 0 +0 2222 0 +0 2347 0 +0 2473 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +0 988 1302 +0 995 1297 +0 1003 1289 +0 1014 1280 +0 1029 1266 +0 1047 1247 +0 1071 1221 +0 1101 1184 +0 1138 1128 +0 1183 1041 +0 1238 891 +0 1301 553 +0 1375 0 +0 1457 0 +0 1549 0 +0 1648 0 +0 1753 0 +0 1864 0 +0 1980 0 +0 2100 0 +0 2222 0 +0 2347 0 +0 2474 0 +0 2601 0 +0 2730 0 +0 2860 0 +0 2990 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +329 998 1335 +265 1004 1330 +164 1012 1323 +0 1023 1314 +0 1037 1301 +0 1055 1284 +0 1079 1260 +0 1108 1226 +0 1145 1175 +0 1189 1098 +0 1243 968 +0 1306 702 +0 1379 0 +0 1461 0 +0 1551 0 +0 1650 0 +0 1755 0 +0 1866 0 +0 1981 0 +0 2101 0 +0 2223 0 +0 2347 0 +0 2474 0 +0 2602 0 +0 2731 0 +0 2860 0 +0 2991 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +770 1010 1375 +747 1016 1370 +715 1024 1364 +667 1035 1356 +594 1048 1345 +474 1066 1329 +239 1089 1307 +0 1118 1276 +0 1154 1232 +0 1197 1164 +0 1250 1054 +0 1312 846 +0 1384 171 +0 1465 0 +0 1555 0 +0 1653 0 +0 1757 0 +0 1868 0 +0 1983 0 +0 2102 0 +0 2224 0 +0 2348 0 +0 2474 0 +0 2602 0 +0 2731 0 +0 2860 0 +0 2991 0 +0 3121 0 +0 3252 0 +0 3384 0 +0 3515 0 +0 3647 0 +1045 1025 1424 +1033 1031 1420 +1016 1039 1414 +992 1049 1407 +957 1063 1397 +907 1080 1383 +830 1102 1364 +702 1130 1336 +440 1165 1297 +0 1208 1239 +0 1260 1148 +0 1321 987 +0 1391 606 +0 1471 0 +0 1560 0 +0 1657 0 +0 1760 0 +0 1870 0 +0 1985 0 +0 2103 0 +0 2225 0 +0 2349 0 +0 2475 0 +0 2603 0 +0 2731 0 +0 2861 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +1261 1046 1482 +1253 1051 1478 +1242 1059 1473 +1228 1069 1467 +1208 1082 1458 +1180 1098 1446 +1139 1119 1429 +1079 1146 1406 +982 1180 1373 +810 1222 1324 +372 1272 1249 +0 1331 1126 +0 1400 879 +0 1479 0 +0 1566 0 +0 1662 0 +0 1764 0 +0 1873 0 +0 1987 0 +0 2105 0 +0 2226 0 +0 2350 0 +0 2476 0 +0 2603 0 +0 2732 0 +0 2861 0 +0 2991 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +1446 1072 1550 +1441 1077 1546 +1434 1084 1542 +1425 1093 1537 +1412 1105 1529 +1394 1121 1519 +1370 1141 1505 +1334 1167 1485 +1282 1199 1457 +1200 1239 1417 +1063 1288 1357 +771 1345 1263 +0 1412 1094 +0 1489 678 +0 1575 0 +0 1668 0 +0 1770 0 +0 1877 0 +0 1990 0 +0 2108 0 +0 2228 0 +0 2352 0 +0 2477 0 +0 2604 0 +0 2732 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3515 0 +0 3647 0 +1615 1104 1627 +1611 1109 1624 +1607 1115 1621 +1600 1124 1616 +1592 1135 1609 +1580 1150 1601 +1563 1169 1589 +1540 1193 1573 +1508 1224 1550 +1460 1262 1518 +1388 1308 1470 +1268 1363 1398 +1033 1428 1280 +0 1502 1048 +0 1585 57 +0 1677 0 +0 1777 0 +0 1883 0 +0 1995 0 +0 2111 0 +0 2231 0 +0 2354 0 +0 2479 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +1772 1144 1713 +1770 1148 1711 +1767 1154 1708 +1762 1162 1704 +1756 1173 1699 +1748 1186 1692 +1737 1204 1682 +1721 1226 1669 +1699 1255 1650 +1669 1290 1624 +1624 1334 1588 +1557 1386 1533 +1448 1448 1448 +1243 1519 1301 +591 1600 979 +0 1689 0 +0 1786 0 +0 1891 0 +0 2001 0 +0 2116 0 +0 2234 0 +0 2356 0 +0 2481 0 +0 2607 0 +0 2734 0 +0 2863 0 +0 2993 0 +0 3123 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3647 0 +1923 1192 1807 +1921 1196 1805 +1919 1202 1803 +1915 1209 1800 +1911 1218 1796 +1905 1231 1790 +1897 1247 1782 +1886 1267 1772 +1871 1293 1757 +1851 1326 1737 +1821 1366 1708 +1779 1415 1667 +1715 1473 1605 +1613 1541 1507 +1426 1618 1329 +905 1704 865 +0 1799 0 +0 1900 0 +0 2008 0 +0 2122 0 +0 2239 0 +0 2360 0 +0 2483 0 +0 2609 0 +0 2736 0 +0 2864 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +2068 1250 1909 +2067 1253 1908 +2065 1258 1906 +2063 1265 1903 +2059 1273 1900 +2055 1284 1895 +2049 1298 1889 +2042 1317 1881 +2031 1340 1869 +2017 1370 1854 +1997 1406 1832 +1968 1451 1801 +1927 1505 1755 +1866 1569 1687 +1768 1641 1575 +1592 1724 1364 +1138 1815 648 +0 1913 0 +0 2018 0 +0 2129 0 +0 2245 0 +0 2364 0 +0 2487 0 +0 2612 0 +0 2738 0 +0 2866 0 +0 2995 0 +0 3124 0 +0 3255 0 +0 3385 0 +0 3516 0 +0 3648 0 +2210 1317 2017 +2209 1320 2016 +2207 1324 2014 +2206 1330 2012 +2203 1337 2010 +2200 1347 2006 +2196 1359 2001 +2191 1375 1995 +2183 1396 1986 +2173 1422 1974 +2158 1455 1957 +2139 1496 1934 +2111 1545 1900 +2071 1603 1852 +2011 1671 1777 +1916 1749 1653 +1748 1835 1406 +1333 1930 0 +0 2032 0 +0 2140 0 +0 2253 0 +0 2371 0 +0 2492 0 +0 2615 0 +0 2741 0 +0 2868 0 +0 2996 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2349 1394 2130 +2348 1396 2129 +2347 1400 2128 +2346 1404 2127 +2344 1411 2125 +2342 1419 2122 +2339 1429 2118 +2335 1443 2113 +2329 1461 2106 +2322 1484 2097 +2312 1513 2084 +2298 1549 2067 +2278 1593 2042 +2251 1646 2007 +2211 1708 1955 +2153 1780 1875 +2061 1861 1740 +1898 1951 1457 +1507 2049 0 +0 2153 0 +0 2264 0 +0 2379 0 +0 2498 0 +0 2620 0 +0 2744 0 +0 2871 0 +0 2998 0 +0 3127 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +2486 1479 2248 +2485 1482 2247 +2485 1484 2246 +2484 1488 2245 +2483 1493 2243 +2481 1500 2241 +2479 1509 2238 +2476 1521 2234 +2472 1536 2229 +2466 1555 2222 +2459 1580 2213 +2449 1611 2199 +2435 1650 2181 +2416 1697 2155 +2389 1753 2119 +2350 1818 2064 +2292 1893 1980 +2201 1978 1835 +2042 2070 1518 +1668 2171 0 +0 2277 0 +0 2389 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +2622 1573 2368 +2621 1575 2368 +2621 1578 2367 +2620 1581 2366 +2619 1585 2365 +2618 1590 2363 +2616 1598 2361 +2614 1607 2358 +2611 1620 2354 +2607 1636 2349 +2602 1657 2342 +2595 1683 2332 +2585 1716 2318 +2571 1757 2299 +2552 1807 2273 +2525 1865 2235 +2487 1934 2179 +2430 2011 2091 +2340 2098 1937 +2183 2193 1588 +1820 2295 0 +0 2403 0 +0 2517 0 +0 2634 0 +0 2755 0 +0 2879 0 +0 3005 0 +0 3132 0 +0 3260 0 +0 3390 0 +0 3520 0 +0 3650 0 +2757 1675 2492 +2756 1676 2491 +2756 1678 2491 +2756 1681 2490 +2755 1684 2489 +2754 1688 2488 +2753 1694 2486 +2751 1702 2484 +2749 1712 2481 +2746 1726 2477 +2742 1743 2472 +2737 1765 2464 +2729 1793 2454 +2719 1827 2440 +2706 1870 2421 +2687 1922 2394 +2660 1982 2355 +2622 2053 2297 +2566 2132 2206 +2477 2221 2046 +2322 2318 1667 +1967 2421 0 +0 2531 0 +0 2645 0 +0 2764 0 +0 2885 0 +0 3010 0 +0 3136 0 +0 3263 0 +0 3392 0 +0 3521 0 +0 3651 0 +2891 1782 2617 +2891 1784 2617 +2890 1785 2617 +2890 1787 2616 +2890 1790 2615 +2889 1793 2615 +2888 1798 2613 +2887 1804 2612 +2885 1812 2609 +2883 1823 2606 +2880 1837 2602 +2876 1855 2597 +2871 1878 2589 +2863 1907 2579 +2854 1943 2565 +2840 1987 2545 +2821 2040 2518 +2795 2103 2478 +2757 2175 2419 +2701 2256 2325 +2612 2346 2159 +2459 2444 1755 +2110 2549 0 +0 2659 0 +0 2775 0 +0 2894 0 +0 3016 0 +0 3140 0 +0 3267 0 +0 3395 0 +0 3523 0 +0 3653 0 +3025 1895 2745 +3024 1896 2744 +3024 1897 2744 +3024 1899 2744 +3024 1901 2743 +3023 1904 2742 +3022 1908 2741 +3022 1912 2740 +3020 1919 2738 +3019 1927 2736 +3017 1938 2733 +3014 1953 2729 +3010 1971 2723 +3004 1995 2716 +2997 2025 2705 +2987 2062 2691 +2974 2108 2671 +2955 2162 2643 +2929 2226 2603 +2891 2299 2543 +2835 2382 2447 +2747 2473 2277 +2595 2572 1852 +2250 2678 0 +0 2789 0 +0 2905 0 +0 3024 0 +0 3147 0 +0 3272 0 +0 3398 0 +0 3526 0 +0 3655 0 +3158 2013 2873 +3158 2013 2873 +3158 2014 2872 +3157 2015 2872 +3157 2017 2872 +3157 2019 2871 +3156 2022 2871 +3156 2026 2870 +3155 2031 2868 +3154 2038 2867 +3152 2046 2864 +3150 2058 2861 +3147 2073 2857 +3143 2092 2851 +3138 2116 2844 +3130 2147 2833 +3120 2185 2819 +3107 2231 2799 +3088 2286 2770 +3062 2351 2730 +3024 2426 2669 +2968 2509 2572 +2881 2601 2398 +2730 2701 1955 +2388 2807 0 +0 2919 0 +0 3035 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3530 0 +0 3658 0 +3291 2133 3002 +3291 2134 3002 +3291 2135 3002 +3291 2135 3002 +3290 2137 3001 +3290 2138 3001 +3290 2141 3000 +3289 2143 3000 +3288 2147 2999 +3288 2153 2997 +3286 2159 2996 +3285 2168 2993 +3283 2180 2990 +3280 2195 2986 +3276 2215 2980 +3270 2239 2973 +3263 2271 2962 +3253 2309 2947 +3240 2356 2927 +3221 2412 2899 +3195 2478 2858 +3157 2553 2796 +3102 2638 2698 +3015 2730 2522 +2864 2831 2065 +2524 2938 0 +0 3050 0 +0 3166 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +3424 2257 3132 +3424 2257 3132 +3423 2258 3132 +3423 2258 3132 +3423 2259 3132 +3423 2261 3131 +3423 2262 3131 +3422 2264 3130 +3422 2267 3130 +3421 2271 3129 +3420 2277 3127 +3419 2284 3126 +3417 2293 3123 +3415 2304 3120 +3412 2320 3116 +3408 2340 3110 +3403 2365 3102 +3396 2397 3092 +3386 2436 3077 +3373 2483 3057 +3354 2540 3028 +3328 2606 2987 +3290 2682 2925 +3235 2767 2826 +3148 2860 2647 +2997 2961 2179 +2659 3068 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3666 0 +3556 2382 3263 +3556 2382 3263 +3556 2383 3262 +3556 2383 3262 +3556 2384 3262 +3556 2385 3262 +3556 2386 3262 +3555 2388 3261 +3555 2390 3261 +3554 2393 3260 +3554 2397 3259 +3553 2403 3258 +3552 2410 3256 +3550 2419 3254 +3548 2431 3250 +3545 2446 3246 +3541 2466 3240 +3536 2492 3233 +3529 2524 3222 +3519 2564 3207 +3505 2612 3187 +3487 2669 3158 +3461 2736 3117 +3423 2812 3054 +3368 2897 2955 +3281 2991 2775 +3131 3092 2297 +2794 3199 0 +0 3312 0 +0 3429 0 +0 3550 0 +0 3673 0 +3689 2509 3394 +3689 2509 3393 +3689 2510 3393 +3689 2510 3393 +3688 2511 3393 +3688 2511 3393 +3688 2512 3393 +3688 2514 3392 +3688 2515 3392 +3687 2518 3392 +3687 2521 3391 +3686 2525 3390 +3685 2530 3389 +3684 2537 3387 +3682 2546 3384 +3680 2559 3381 +3677 2574 3377 +3673 2595 3371 +3668 2620 3363 +3661 2653 3353 +3651 2692 3338 +3638 2741 3318 +3619 2798 3289 +3593 2865 3247 +3556 2942 3184 +3500 3028 3084 +3413 3122 2903 +3264 3223 2419 +2928 3331 0 +0 3443 0 +0 3561 0 +0 3681 0 +3821 2637 3525 +3821 2638 3525 +3821 2638 3525 +3821 2638 3525 +3821 2639 3524 +3821 2639 3524 +3821 2640 3524 +3821 2641 3524 +3820 2642 3524 +3820 2644 3523 +3820 2646 3523 +3819 2649 3522 +3818 2653 3521 +3818 2659 3520 +3816 2666 3518 +3815 2675 3516 +3813 2687 3512 +3810 2703 3508 +3806 2724 3502 +3801 2750 3494 +3793 2782 3484 +3784 2822 3469 +3770 2871 3448 +3752 2929 3420 +3725 2996 3378 +3688 3073 3315 +3633 3159 3215 +3546 3253 3032 +3396 3354 2543 +3061 3462 0 +0 3575 0 +0 3692 0 +3953 2767 3656 +3953 2767 3656 +3953 2767 3656 +3953 2767 3656 +3953 2768 3656 +3953 2768 3656 +3953 2769 3656 +3953 2769 3656 +3953 2770 3655 +3953 2772 3655 +3952 2773 3655 +3952 2776 3654 +3951 2779 3653 +3951 2783 3652 +3950 2788 3651 +3949 2795 3649 +3947 2805 3647 +3945 2817 3644 +3942 2833 3639 +3938 2854 3634 +3933 2880 3626 +3926 2912 3615 +3916 2952 3600 +3902 3001 3580 +3884 3059 3551 +3858 3127 3509 +3820 3204 3446 +3765 3290 3345 +3678 3384 3162 +3529 3486 2669 +3194 3594 0 +0 3707 0 +4086 2897 3788 +4086 2897 3788 +4086 2897 3788 +4086 2897 3788 +4086 2897 3788 +4085 2898 3788 +4085 2898 3787 +4085 2899 3787 +4085 2899 3787 +4085 2900 3787 +4085 2902 3787 +4085 2903 3786 +4084 2906 3786 +4084 2909 3785 +4083 2913 3784 +4082 2918 3783 +4081 2926 3781 +4079 2935 3779 +4077 2947 3775 +4074 2963 3771 +4070 2984 3765 +4065 3010 3757 +4058 3043 3747 +4048 3083 3732 +4035 3132 3711 +4016 3190 3682 +3990 3258 3640 +3953 3335 3577 +3897 3421 3476 +3811 3516 3293 +3661 3617 2796 +3327 3725 0 +4095 3027 3919 +4095 3027 3919 +4095 3027 3919 +4095 3027 3919 +4095 3028 3919 +4095 3028 3919 +4095 3028 3919 +4095 3029 3919 +4095 3029 3919 +4095 3030 3919 +4095 3031 3919 +4095 3032 3918 +4095 3034 3918 +4095 3036 3917 +4095 3039 3917 +4095 3044 3916 +4095 3049 3914 +4095 3056 3913 +4095 3066 3910 +4095 3078 3907 +4095 3094 3903 +4095 3115 3897 +4095 3141 3889 +4095 3174 3878 +4095 3214 3863 +4095 3263 3843 +4095 3321 3814 +4095 3389 3772 +4085 3467 3709 +4030 3553 3608 +3943 3647 3424 +3794 3749 2925 +4095 3158 4051 +4095 3158 4051 +4095 3158 4051 +4095 3158 4051 +4095 3158 4051 +4095 3159 4051 +4095 3159 4051 +4095 3159 4051 +4095 3160 4051 +4095 3160 4051 +4095 3161 4051 +4095 3162 4050 +4095 3163 4050 +4095 3165 4050 +4095 3167 4049 +4095 3170 4048 +4095 3175 4047 +4095 3180 4046 +4095 3187 4044 +4095 3197 4042 +4095 3209 4039 +4095 3225 4035 +4095 3246 4029 +4095 3272 4021 +4095 3305 4010 +4095 3346 3995 +4095 3395 3975 +4095 3453 3946 +4095 3521 3903 +4095 3598 3840 +4095 3685 3739 +4075 3779 3555 +0 1092 1347 +0 1097 1342 +0 1104 1336 +0 1112 1327 +0 1124 1315 +0 1139 1298 +0 1159 1275 +0 1183 1242 +0 1215 1193 +0 1253 1119 +0 1300 996 +0 1356 751 +0 1422 0 +0 1497 0 +0 1581 0 +0 1674 0 +0 1774 0 +0 1881 0 +0 1993 0 +0 2110 0 +0 2230 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +0 1093 1354 +0 1098 1350 +0 1105 1343 +0 1114 1335 +0 1126 1323 +0 1141 1306 +0 1160 1283 +0 1185 1251 +0 1216 1203 +0 1254 1131 +0 1301 1011 +0 1357 777 +0 1423 0 +0 1498 0 +0 1582 0 +0 1674 0 +0 1775 0 +0 1881 0 +0 1993 0 +0 2110 0 +0 2230 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +0 1096 1364 +0 1101 1359 +0 1107 1353 +0 1116 1344 +0 1128 1333 +0 1143 1317 +0 1162 1294 +0 1187 1262 +0 1218 1216 +0 1256 1146 +0 1303 1031 +0 1359 809 +0 1424 0 +0 1499 0 +0 1583 0 +0 1675 0 +0 1775 0 +0 1882 0 +0 1994 0 +0 2110 0 +0 2230 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +0 1099 1376 +0 1104 1371 +0 1110 1365 +0 1119 1357 +0 1131 1346 +0 1146 1330 +0 1165 1308 +0 1189 1278 +0 1220 1233 +0 1258 1165 +0 1305 1056 +0 1360 850 +0 1425 185 +0 1500 0 +0 1584 0 +0 1676 0 +0 1776 0 +0 1882 0 +0 1994 0 +0 2110 0 +0 2230 0 +0 2353 0 +0 2478 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +0 1103 1392 +0 1108 1387 +0 1114 1381 +0 1123 1373 +0 1135 1363 +0 1149 1348 +0 1168 1327 +0 1193 1297 +0 1223 1255 +0 1261 1190 +0 1307 1087 +0 1363 898 +0 1427 365 +0 1502 0 +0 1585 0 +0 1677 0 +0 1777 0 +0 1883 0 +0 1995 0 +0 2111 0 +0 2231 0 +0 2354 0 +0 2479 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +0 1108 1412 +0 1113 1408 +0 1120 1402 +0 1128 1395 +0 1140 1384 +0 1154 1370 +0 1173 1350 +0 1197 1322 +0 1227 1282 +0 1265 1222 +0 1311 1126 +0 1366 956 +0 1430 530 +0 1504 0 +0 1587 0 +0 1679 0 +0 1778 0 +0 1884 0 +0 1995 0 +0 2112 0 +0 2231 0 +0 2354 0 +0 2479 0 +0 2605 0 +0 2733 0 +0 2862 0 +0 2992 0 +0 3122 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +0 1115 1438 +0 1120 1434 +0 1127 1429 +0 1135 1421 +0 1146 1412 +0 1161 1398 +0 1179 1380 +0 1203 1353 +0 1233 1316 +0 1270 1260 +0 1315 1173 +0 1370 1023 +0 1434 686 +0 1507 0 +0 1590 0 +0 1681 0 +0 1780 0 +0 1885 0 +0 1996 0 +0 2112 0 +0 2232 0 +0 2354 0 +0 2479 0 +0 2606 0 +0 2734 0 +0 2862 0 +0 2992 0 +0 3123 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +503 1125 1470 +461 1130 1467 +397 1136 1462 +296 1144 1455 +111 1155 1446 +0 1169 1433 +0 1188 1416 +0 1211 1392 +0 1240 1358 +0 1277 1307 +0 1322 1230 +0 1375 1100 +0 1438 834 +0 1511 0 +0 1593 0 +0 1683 0 +0 1782 0 +0 1887 0 +0 1998 0 +0 2113 0 +0 2233 0 +0 2355 0 +0 2480 0 +0 2606 0 +0 2734 0 +0 2863 0 +0 2992 0 +0 3123 0 +0 3253 0 +0 3384 0 +0 3516 0 +0 3647 0 +919 1137 1510 +902 1142 1507 +879 1148 1502 +847 1156 1496 +799 1167 1488 +726 1180 1477 +606 1198 1461 +371 1221 1439 +0 1250 1409 +0 1286 1364 +0 1330 1296 +0 1382 1186 +0 1444 978 +0 1516 303 +0 1597 0 +0 1687 0 +0 1785 0 +0 1889 0 +0 2000 0 +0 2115 0 +0 2234 0 +0 2356 0 +0 2480 0 +0 2606 0 +0 2734 0 +0 2863 0 +0 2993 0 +0 3123 0 +0 3253 0 +0 3385 0 +0 3516 0 +0 3647 0 +1186 1153 1559 +1177 1158 1556 +1165 1164 1552 +1148 1171 1546 +1124 1182 1539 +1090 1195 1529 +1039 1212 1515 +962 1234 1496 +834 1262 1468 +572 1297 1429 +0 1340 1371 +0 1392 1280 +0 1453 1119 +0 1523 738 +0 1603 0 +0 1692 0 +0 1789 0 +0 1892 0 +0 2002 0 +0 2117 0 +0 2235 0 +0 2357 0 +0 2481 0 +0 2607 0 +0 2735 0 +0 2863 0 +0 2993 0 +0 3123 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3647 0 +1398 1174 1617 +1393 1178 1614 +1385 1184 1610 +1375 1191 1606 +1360 1201 1599 +1340 1214 1590 +1312 1230 1578 +1271 1251 1561 +1211 1278 1538 +1114 1312 1505 +942 1354 1456 +504 1404 1382 +0 1463 1258 +0 1532 1012 +0 1611 0 +0 1698 0 +0 1794 0 +0 1896 0 +0 2005 0 +0 2119 0 +0 2237 0 +0 2358 0 +0 2482 0 +0 2608 0 +0 2735 0 +0 2864 0 +0 2993 0 +0 3123 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3647 0 +1582 1200 1684 +1579 1204 1682 +1573 1209 1679 +1567 1216 1674 +1557 1225 1669 +1544 1237 1661 +1527 1253 1651 +1502 1273 1637 +1466 1299 1617 +1414 1331 1589 +1332 1371 1549 +1195 1420 1489 +903 1477 1395 +0 1544 1226 +0 1621 810 +0 1707 0 +0 1801 0 +0 1902 0 +0 2010 0 +0 2123 0 +0 2240 0 +0 2360 0 +0 2484 0 +0 2609 0 +0 2736 0 +0 2864 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +1750 1232 1761 +1747 1236 1759 +1744 1241 1756 +1739 1248 1753 +1732 1256 1748 +1724 1268 1742 +1712 1282 1733 +1695 1301 1721 +1672 1326 1705 +1640 1356 1682 +1592 1394 1650 +1520 1440 1602 +1400 1495 1530 +1165 1560 1412 +102 1634 1180 +0 1718 189 +0 1809 0 +0 1909 0 +0 2015 0 +0 2127 0 +0 2243 0 +0 2363 0 +0 2486 0 +0 2611 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +1906 1272 1846 +1905 1276 1845 +1902 1280 1843 +1899 1286 1840 +1894 1294 1836 +1888 1305 1831 +1880 1319 1824 +1869 1336 1814 +1853 1359 1801 +1831 1387 1782 +1801 1422 1757 +1756 1466 1720 +1689 1518 1665 +1580 1580 1580 +1375 1651 1434 +723 1732 1111 +0 1821 0 +0 1918 0 +0 2023 0 +0 2133 0 +0 2248 0 +0 2366 0 +0 2488 0 +0 2613 0 +0 2739 0 +0 2866 0 +0 2995 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +2056 1321 1941 +2055 1324 1939 +2053 1328 1938 +2051 1334 1935 +2047 1341 1932 +2043 1350 1928 +2037 1363 1922 +2029 1379 1914 +2018 1399 1904 +2003 1425 1889 +1983 1458 1869 +1953 1498 1840 +1911 1547 1799 +1847 1605 1737 +1745 1673 1639 +1558 1750 1461 +1037 1836 997 +0 1931 0 +0 2032 0 +0 2140 0 +0 2254 0 +0 2371 0 +0 2492 0 +0 2615 0 +0 2741 0 +0 2868 0 +0 2996 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +2201 1379 2042 +2200 1382 2041 +2199 1386 2040 +2197 1390 2038 +2195 1397 2035 +2191 1405 2032 +2187 1416 2027 +2182 1430 2021 +2174 1449 2013 +2163 1472 2001 +2149 1502 1986 +2129 1538 1964 +2100 1583 1933 +2059 1637 1887 +1998 1701 1819 +1900 1774 1707 +1724 1856 1496 +1270 1947 780 +0 2045 0 +0 2151 0 +0 2262 0 +0 2377 0 +0 2497 0 +0 2619 0 +0 2744 0 +0 2870 0 +0 2998 0 +0 3127 0 +0 3256 0 +0 3387 0 +0 3518 0 +0 3649 0 +2342 1447 2150 +2342 1449 2149 +2341 1452 2148 +2339 1456 2146 +2338 1462 2145 +2335 1469 2142 +2332 1479 2138 +2328 1491 2133 +2323 1507 2127 +2315 1528 2118 +2305 1554 2106 +2290 1587 2089 +2271 1628 2066 +2243 1677 2032 +2203 1735 1984 +2143 1803 1909 +2049 1881 1785 +1880 1967 1538 +1465 2062 3 +0 2164 0 +0 2272 0 +0 2385 0 +0 2503 0 +0 2624 0 +0 2747 0 +0 2873 0 +0 3000 0 +0 3128 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2481 1524 2263 +2481 1526 2262 +2480 1528 2261 +2479 1532 2260 +2478 1537 2259 +2476 1543 2257 +2474 1551 2254 +2471 1561 2250 +2467 1575 2245 +2461 1593 2238 +2454 1616 2229 +2444 1645 2216 +2430 1681 2199 +2410 1725 2174 +2383 1778 2139 +2344 1840 2087 +2285 1912 2007 +2193 1993 1872 +2030 2083 1589 +1639 2181 0 +0 2285 0 +0 2396 0 +0 2511 0 +0 2630 0 +0 2752 0 +0 2876 0 +0 3003 0 +0 3130 0 +0 3259 0 +0 3389 0 +0 3519 0 +0 3650 0 +2618 1610 2380 +2618 1611 2380 +2617 1614 2379 +2617 1617 2378 +2616 1620 2377 +2615 1626 2375 +2613 1632 2373 +2611 1641 2370 +2608 1653 2367 +2604 1668 2361 +2598 1687 2354 +2591 1712 2345 +2581 1743 2331 +2567 1782 2313 +2548 1829 2287 +2521 1885 2251 +2482 1950 2197 +2424 2026 2112 +2333 2110 1967 +2174 2202 1650 +1800 2303 0 +0 2409 0 +0 2522 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +2754 1704 2501 +2754 1705 2500 +2754 1707 2500 +2753 1710 2499 +2752 1713 2498 +2751 1717 2497 +2750 1723 2496 +2749 1730 2493 +2746 1739 2490 +2743 1752 2486 +2739 1768 2481 +2734 1789 2474 +2727 1815 2464 +2717 1849 2450 +2703 1889 2432 +2684 1939 2405 +2657 1997 2367 +2619 2066 2311 +2562 2143 2223 +2472 2230 2069 +2315 2325 1720 +1952 2427 0 +0 2535 0 +0 2649 0 +0 2767 0 +0 2888 0 +0 3011 0 +0 3137 0 +0 3264 0 +0 3392 0 +0 3522 0 +0 3652 0 +2889 1806 2624 +2889 1807 2624 +2889 1808 2624 +2888 1810 2623 +2888 1813 2622 +2887 1816 2621 +2886 1821 2620 +2885 1826 2619 +2883 1834 2616 +2881 1844 2613 +2878 1858 2609 +2874 1875 2604 +2869 1897 2596 +2861 1925 2586 +2852 1959 2572 +2838 2002 2553 +2819 2054 2526 +2792 2114 2487 +2754 2185 2429 +2698 2265 2338 +2609 2353 2178 +2454 2450 1799 +2099 2553 0 +0 2663 0 +0 2777 0 +0 2896 0 +0 3018 0 +0 3142 0 +0 3268 0 +0 3395 0 +0 3524 0 +0 3653 0 +3023 1914 2750 +3023 1915 2749 +3023 1916 2749 +3023 1917 2749 +3022 1919 2748 +3022 1922 2748 +3021 1925 2747 +3020 1930 2745 +3019 1936 2744 +3017 1944 2741 +3015 1955 2738 +3012 1969 2734 +3008 1987 2729 +3003 2010 2721 +2996 2039 2711 +2986 2075 2697 +2972 2119 2677 +2953 2172 2650 +2927 2235 2610 +2889 2307 2551 +2833 2388 2457 +2744 2478 2291 +2591 2576 1888 +2242 2681 0 +0 2792 0 +0 2907 0 +0 3026 0 +0 3148 0 +0 3273 0 +0 3399 0 +0 3527 0 +0 3655 0 +3157 2027 2877 +3157 2028 2877 +3157 2028 2876 +3156 2030 2876 +3156 2031 2876 +3156 2033 2875 +3155 2036 2874 +3155 2040 2874 +3154 2045 2872 +3152 2051 2871 +3151 2059 2868 +3149 2071 2865 +3146 2085 2861 +3142 2104 2855 +3136 2127 2848 +3129 2157 2837 +3119 2194 2823 +3106 2240 2803 +3087 2294 2775 +3061 2358 2735 +3023 2431 2675 +2967 2514 2579 +2879 2605 2409 +2727 2704 1984 +2382 2810 0 +0 2921 0 +0 3037 0 +0 3157 0 +0 3279 0 +0 3404 0 +0 3530 0 +0 3658 0 +3290 2144 3005 +3290 2145 3005 +3290 2145 3005 +3290 2146 3005 +3290 2148 3004 +3289 2149 3004 +3289 2151 3003 +3288 2154 3003 +3288 2158 3002 +3287 2163 3000 +3286 2170 2999 +3284 2178 2996 +3282 2190 2993 +3279 2205 2989 +3275 2224 2983 +3270 2248 2976 +3262 2279 2965 +3253 2317 2951 +3239 2363 2931 +3220 2418 2902 +3194 2483 2862 +3156 2558 2801 +3101 2641 2704 +3013 2733 2530 +2862 2833 2087 +2520 2939 0 +0 3051 0 +0 3168 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +3423 2265 3134 +3423 2265 3134 +3423 2266 3134 +3423 2267 3134 +3423 2268 3134 +3422 2269 3133 +3422 2270 3133 +3422 2273 3132 +3421 2276 3132 +3421 2279 3131 +3420 2285 3130 +3418 2291 3128 +3417 2300 3125 +3415 2312 3122 +3412 2327 3118 +3408 2347 3112 +3403 2371 3105 +3395 2403 3094 +3386 2441 3080 +3372 2488 3059 +3353 2545 3031 +3327 2610 2990 +3290 2685 2928 +3234 2770 2830 +3147 2863 2654 +2996 2963 2197 +2656 3070 0 +0 3182 0 +0 3298 0 +0 3419 0 +0 3542 0 +0 3667 0 +3556 2388 3264 +3556 2389 3264 +3556 2389 3264 +3556 2390 3264 +3555 2390 3264 +3555 2391 3264 +3555 2393 3263 +3555 2394 3263 +3554 2397 3262 +3554 2400 3262 +3553 2403 3261 +3552 2409 3259 +3551 2416 3258 +3550 2425 3255 +3547 2437 3252 +3544 2452 3248 +3541 2472 3242 +3535 2497 3234 +3528 2529 3224 +3518 2568 3209 +3505 2615 3189 +3486 2672 3160 +3460 2738 3119 +3422 2814 3057 +3367 2899 2958 +3280 2992 2780 +3130 3093 2311 +2791 3200 0 +0 3313 0 +0 3430 0 +0 3550 0 +0 3673 0 +3688 2514 3395 +3688 2514 3395 +3688 2515 3395 +3688 2515 3395 +3688 2515 3394 +3688 2516 3394 +3688 2517 3394 +3688 2518 3394 +3687 2520 3393 +3687 2522 3393 +3686 2525 3392 +3686 2529 3391 +3685 2535 3390 +3684 2542 3388 +3682 2551 3386 +3680 2563 3383 +3677 2579 3378 +3673 2599 3373 +3668 2624 3365 +3661 2656 3354 +3651 2696 3339 +3637 2744 3319 +3619 2801 3290 +3593 2868 3249 +3555 2944 3186 +3500 3029 3087 +3413 3123 2907 +3263 3224 2429 +2926 3331 0 +0 3444 0 +0 3561 0 +0 3682 0 +3821 2641 3526 +3821 2641 3526 +3821 2641 3526 +3821 2642 3526 +3821 2642 3525 +3821 2643 3525 +3820 2643 3525 +3820 2644 3525 +3820 2646 3525 +3820 2647 3524 +3819 2650 3524 +3819 2653 3523 +3818 2657 3522 +3817 2662 3521 +3816 2669 3519 +3815 2679 3517 +3812 2691 3513 +3809 2706 3509 +3806 2727 3503 +3800 2752 3495 +3793 2785 3485 +3783 2825 3470 +3770 2873 3450 +3751 2930 3421 +3725 2998 3379 +3688 3074 3316 +3632 3160 3216 +3546 3254 3035 +3396 3355 2551 +3060 3463 0 +0 3576 0 +0 3693 0 +3953 2769 3657 +3953 2770 3657 +3953 2770 3657 +3953 2770 3657 +3953 2770 3657 +3953 2771 3657 +3953 2771 3656 +3953 2772 3656 +3953 2773 3656 +3952 2774 3656 +3952 2776 3655 +3952 2778 3655 +3951 2781 3654 +3951 2785 3653 +3950 2791 3652 +3948 2798 3650 +3947 2807 3648 +3945 2820 3644 +3942 2835 3640 +3938 2856 3634 +3933 2882 3627 +3925 2914 3616 +3916 2954 3601 +3902 3003 3581 +3884 3061 3552 +3858 3128 3510 +3820 3205 3447 +3765 3291 3347 +3678 3385 3165 +3528 3486 2675 +3193 3594 0 +0 3707 0 +4085 2899 3788 +4085 2899 3788 +4085 2899 3788 +4085 2899 3788 +4085 2899 3788 +4085 2900 3788 +4085 2900 3788 +4085 2901 3788 +4085 2901 3788 +4085 2902 3787 +4085 2904 3787 +4084 2905 3787 +4084 2908 3786 +4084 2911 3785 +4083 2915 3784 +4082 2920 3783 +4081 2928 3781 +4079 2937 3779 +4077 2949 3776 +4074 2965 3772 +4070 2986 3766 +4065 3012 3758 +4058 3044 3747 +4048 3084 3732 +4035 3133 3712 +4016 3191 3683 +3990 3259 3641 +3952 3336 3578 +3897 3422 3477 +3811 3516 3295 +3661 3618 2801 +3326 3726 0 +4095 3029 3920 +4095 3029 3920 +4095 3029 3920 +4095 3029 3920 +4095 3029 3920 +4095 3029 3920 +4095 3030 3920 +4095 3030 3920 +4095 3031 3919 +4095 3031 3919 +4095 3032 3919 +4095 3034 3919 +4095 3035 3918 +4095 3038 3918 +4095 3041 3917 +4095 3045 3916 +4095 3050 3915 +4095 3058 3913 +4095 3067 3911 +4095 3079 3907 +4095 3095 3903 +4095 3116 3897 +4095 3142 3889 +4095 3175 3879 +4095 3215 3864 +4095 3264 3843 +4095 3322 3814 +4095 3390 3772 +4085 3467 3709 +4029 3553 3609 +3943 3648 3425 +3793 3750 2928 +4095 3159 4052 +4095 3159 4052 +4095 3159 4052 +4095 3159 4052 +4095 3160 4052 +4095 3160 4051 +4095 3160 4051 +4095 3160 4051 +4095 3161 4051 +4095 3161 4051 +4095 3162 4051 +4095 3163 4051 +4095 3164 4050 +4095 3166 4050 +4095 3168 4049 +4095 3171 4049 +4095 3176 4048 +4095 3181 4046 +4095 3188 4045 +4095 3198 4042 +4095 3210 4039 +4095 3226 4035 +4095 3247 4029 +4095 3273 4021 +4095 3306 4010 +4095 3346 3996 +4095 3395 3975 +4095 3454 3946 +4095 3521 3904 +4095 3599 3841 +4095 3685 3740 +4075 3780 3556 +0 1218 1478 +0 1222 1474 +0 1228 1469 +0 1234 1463 +0 1243 1454 +0 1255 1441 +0 1270 1424 +0 1290 1401 +0 1314 1367 +0 1346 1318 +0 1384 1242 +0 1431 1116 +0 1488 863 +0 1553 0 +0 1629 0 +0 1713 0 +0 1806 0 +0 1906 0 +0 2013 0 +0 2125 0 +0 2242 0 +0 2362 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1220 1483 +0 1224 1479 +0 1229 1475 +0 1236 1468 +0 1245 1459 +0 1256 1447 +0 1271 1430 +0 1291 1407 +0 1316 1374 +0 1347 1325 +0 1385 1251 +0 1432 1128 +0 1488 883 +0 1554 0 +0 1629 0 +0 1713 0 +0 1806 0 +0 1906 0 +0 2013 0 +0 2125 0 +0 2242 0 +0 2362 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1222 1490 +0 1225 1486 +0 1231 1482 +0 1237 1475 +0 1246 1467 +0 1258 1455 +0 1273 1438 +0 1292 1415 +0 1317 1383 +0 1348 1335 +0 1387 1263 +0 1433 1143 +0 1489 909 +0 1555 0 +0 1630 0 +0 1714 0 +0 1807 0 +0 1907 0 +0 2013 0 +0 2125 0 +0 2242 0 +0 2362 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1224 1499 +0 1228 1496 +0 1233 1491 +0 1240 1485 +0 1248 1476 +0 1260 1465 +0 1275 1449 +0 1294 1426 +0 1319 1395 +0 1350 1348 +0 1388 1278 +0 1435 1163 +0 1491 942 +0 1556 111 +0 1631 0 +0 1715 0 +0 1807 0 +0 1907 0 +0 2014 0 +0 2126 0 +0 2242 0 +0 2362 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1227 1511 +0 1231 1508 +0 1236 1503 +0 1243 1497 +0 1251 1489 +0 1263 1478 +0 1278 1462 +0 1297 1441 +0 1321 1410 +0 1352 1365 +0 1390 1298 +0 1437 1188 +0 1492 982 +0 1557 317 +0 1632 0 +0 1716 0 +0 1808 0 +0 1908 0 +0 2014 0 +0 2126 0 +0 2243 0 +0 2363 0 +0 2485 0 +0 2610 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1231 1527 +0 1235 1524 +0 1240 1519 +0 1247 1514 +0 1255 1506 +0 1267 1495 +0 1281 1480 +0 1300 1459 +0 1325 1429 +0 1355 1387 +0 1393 1322 +0 1439 1219 +0 1495 1030 +0 1559 497 +0 1634 0 +0 1717 0 +0 1809 0 +0 1909 0 +0 2015 0 +0 2127 0 +0 2243 0 +0 2363 0 +0 2486 0 +0 2611 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3254 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1237 1547 +0 1240 1544 +0 1245 1540 +0 1252 1534 +0 1260 1527 +0 1272 1516 +0 1286 1502 +0 1305 1482 +0 1329 1454 +0 1360 1414 +0 1397 1354 +0 1443 1258 +0 1498 1088 +0 1562 662 +0 1636 0 +0 1719 0 +0 1811 0 +0 1910 0 +0 2016 0 +0 2128 0 +0 2244 0 +0 2363 0 +0 2486 0 +0 2611 0 +0 2737 0 +0 2865 0 +0 2994 0 +0 3124 0 +0 3255 0 +0 3385 0 +0 3516 0 +0 3648 0 +0 1244 1573 +0 1248 1570 +0 1252 1566 +0 1259 1561 +0 1267 1554 +0 1278 1544 +0 1293 1530 +0 1311 1512 +0 1335 1486 +0 1365 1448 +0 1402 1392 +0 1448 1306 +0 1502 1155 +0 1566 818 +0 1639 0 +0 1722 0 +0 1813 0 +0 1912 0 +0 2017 0 +0 2129 0 +0 2244 0 +0 2364 0 +0 2486 0 +0 2611 0 +0 2738 0 +0 2866 0 +0 2995 0 +0 3124 0 +0 3255 0 +0 3385 0 +0 3516 0 +0 3648 0 +664 1253 1605 +635 1257 1602 +593 1262 1599 +530 1268 1594 +428 1276 1587 +243 1287 1578 +0 1301 1566 +0 1320 1548 +0 1343 1524 +0 1372 1490 +0 1409 1440 +0 1454 1362 +0 1507 1232 +0 1570 966 +0 1643 0 +0 1725 0 +0 1816 0 +0 1914 0 +0 2019 0 +0 2130 0 +0 2245 0 +0 2365 0 +0 2487 0 +0 2612 0 +0 2738 0 +0 2866 0 +0 2995 0 +0 3124 0 +0 3255 0 +0 3385 0 +0 3517 0 +0 3648 0 +1063 1266 1645 +1051 1269 1642 +1034 1274 1639 +1011 1280 1635 +979 1288 1628 +931 1299 1620 +858 1313 1609 +738 1330 1593 +503 1353 1571 +0 1382 1541 +0 1418 1496 +0 1462 1428 +0 1514 1318 +0 1577 1110 +0 1648 435 +0 1729 0 +0 1819 0 +0 1917 0 +0 2021 0 +0 2132 0 +0 2247 0 +0 2366 0 +0 2488 0 +0 2612 0 +0 2739 0 +0 2866 0 +0 2995 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +1325 1282 1693 +1318 1285 1691 +1309 1290 1688 +1297 1296 1684 +1280 1303 1678 +1256 1314 1671 +1222 1327 1661 +1172 1344 1647 +1095 1366 1628 +966 1394 1601 +704 1429 1562 +0 1472 1503 +0 1524 1412 +0 1585 1251 +0 1655 870 +0 1735 0 +0 1824 0 +0 1921 0 +0 2024 0 +0 2134 0 +0 2249 0 +0 2367 0 +0 2489 0 +0 2613 0 +0 2739 0 +0 2867 0 +0 2995 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +1535 1302 1751 +1530 1306 1749 +1525 1310 1746 +1517 1316 1742 +1507 1323 1738 +1492 1333 1731 +1472 1346 1722 +1444 1362 1710 +1404 1384 1693 +1343 1411 1670 +1246 1444 1637 +1074 1486 1588 +636 1536 1514 +0 1595 1390 +0 1664 1144 +0 1743 0 +0 1830 0 +0 1926 0 +0 2029 0 +0 2137 0 +0 2251 0 +0 2369 0 +0 2490 0 +0 2614 0 +0 2740 0 +0 2867 0 +0 2996 0 +0 3125 0 +0 3255 0 +0 3386 0 +0 3517 0 +0 3648 0 +1717 1329 1818 +1714 1332 1816 +1711 1336 1814 +1706 1341 1811 +1699 1348 1806 +1689 1357 1801 +1676 1370 1793 +1659 1385 1783 +1634 1406 1769 +1598 1431 1749 +1546 1464 1721 +1465 1503 1681 +1327 1552 1621 +1035 1609 1527 +0 1676 1358 +0 1753 942 +0 1839 0 +0 1933 0 +0 2034 0 +0 2142 0 +0 2255 0 +0 2372 0 +0 2492 0 +0 2616 0 +0 2741 0 +0 2868 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +1884 1361 1894 +1882 1364 1893 +1879 1368 1891 +1876 1373 1888 +1871 1380 1885 +1865 1388 1880 +1856 1400 1874 +1844 1414 1865 +1827 1433 1853 +1805 1458 1837 +1772 1488 1814 +1724 1526 1782 +1652 1572 1734 +1532 1627 1662 +1297 1692 1544 +234 1766 1313 +0 1850 322 +0 1942 0 +0 2041 0 +0 2147 0 +0 2259 0 +0 2375 0 +0 2495 0 +0 2618 0 +0 2743 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3648 0 +2040 1402 1980 +2038 1405 1979 +2037 1408 1977 +2034 1413 1975 +2031 1419 1972 +2026 1427 1968 +2020 1437 1963 +2012 1451 1956 +2001 1468 1946 +1985 1491 1933 +1964 1519 1914 +1933 1555 1889 +1888 1598 1852 +1821 1650 1797 +1712 1712 1712 +1507 1783 1566 +855 1864 1243 +0 1953 0 +0 2051 0 +0 2155 0 +0 2265 0 +0 2380 0 +0 2499 0 +0 2620 0 +0 2745 0 +0 2871 0 +0 2999 0 +0 3127 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +2189 1451 2074 +2188 1453 2073 +2187 1456 2071 +2185 1461 2070 +2183 1466 2067 +2180 1473 2064 +2175 1483 2060 +2169 1495 2054 +2161 1511 2046 +2151 1531 2036 +2136 1557 2021 +2115 1590 2001 +2085 1630 1972 +2043 1679 1931 +1979 1737 1869 +1877 1805 1771 +1690 1882 1593 +1170 1968 1129 +0 2063 0 +0 2165 0 +0 2273 0 +0 2386 0 +0 2503 0 +0 2624 0 +0 2747 0 +0 2873 0 +0 3000 0 +0 3128 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2334 1509 2175 +2333 1511 2174 +2332 1514 2173 +2331 1518 2172 +2329 1522 2170 +2327 1529 2167 +2324 1537 2164 +2319 1548 2159 +2314 1562 2153 +2306 1581 2145 +2295 1604 2134 +2281 1634 2118 +2261 1671 2096 +2232 1716 2065 +2191 1769 2019 +2130 1833 1951 +2032 1906 1839 +1856 1988 1628 +1402 2079 912 +0 2177 0 +0 2283 0 +0 2394 0 +0 2509 0 +0 2629 0 +0 2751 0 +0 2876 0 +0 3002 0 +0 3130 0 +0 3259 0 +0 3389 0 +0 3519 0 +0 3650 0 +2475 1577 2283 +2474 1579 2282 +2474 1581 2281 +2473 1584 2280 +2472 1588 2279 +2470 1594 2277 +2468 1601 2274 +2464 1611 2270 +2460 1623 2266 +2455 1639 2259 +2447 1660 2250 +2437 1686 2238 +2423 1719 2221 +2403 1760 2198 +2375 1809 2165 +2335 1867 2116 +2275 1935 2041 +2181 2013 1917 +2012 2099 1670 +1597 2194 135 +0 2296 0 +0 2404 0 +0 2517 0 +0 2635 0 +0 2756 0 +0 2879 0 +0 3005 0 +0 3132 0 +0 3260 0 +0 3390 0 +0 3520 0 +0 3650 0 +2614 1654 2395 +2613 1656 2395 +2613 1658 2394 +2612 1660 2393 +2611 1664 2392 +2610 1669 2391 +2608 1675 2389 +2606 1683 2386 +2603 1694 2382 +2599 1707 2377 +2593 1725 2370 +2586 1748 2361 +2576 1777 2348 +2562 1813 2331 +2542 1857 2306 +2515 1910 2271 +2476 1972 2219 +2417 2044 2139 +2325 2125 2004 +2162 2215 1721 +1771 2313 0 +0 2417 0 +0 2528 0 +0 2643 0 +0 2762 0 +0 2884 0 +0 3009 0 +0 3135 0 +0 3263 0 +0 3391 0 +0 3521 0 +0 3651 0 +2751 1741 2513 +2750 1742 2512 +2750 1744 2512 +2750 1746 2511 +2749 1749 2510 +2748 1753 2509 +2747 1758 2507 +2745 1764 2505 +2743 1773 2502 +2740 1785 2499 +2736 1800 2493 +2730 1819 2486 +2723 1844 2477 +2713 1875 2464 +2699 1914 2445 +2680 1961 2420 +2653 2017 2383 +2614 2083 2329 +2556 2158 2244 +2466 2242 2099 +2306 2335 1782 +1932 2435 0 +0 2542 0 +0 2654 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +2887 1835 2633 +2886 1836 2633 +2886 1838 2633 +2886 1839 2632 +2885 1842 2631 +2884 1845 2630 +2884 1849 2629 +2882 1855 2628 +2881 1862 2625 +2878 1872 2623 +2875 1884 2619 +2871 1900 2613 +2866 1921 2606 +2859 1948 2596 +2849 1981 2582 +2835 2021 2564 +2816 2071 2537 +2789 2130 2499 +2751 2198 2443 +2694 2275 2355 +2604 2362 2201 +2447 2457 1852 +2084 2559 0 +0 2668 0 +0 2781 0 +0 2899 0 +0 3020 0 +0 3143 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +3021 1937 2757 +3021 1938 2756 +3021 1939 2756 +3021 1940 2756 +3020 1942 2755 +3020 1945 2754 +3019 1948 2754 +3018 1953 2752 +3017 1959 2751 +3015 1966 2748 +3013 1977 2745 +3010 1990 2741 +3006 2007 2736 +3001 2029 2728 +2994 2057 2718 +2984 2092 2705 +2970 2134 2685 +2951 2186 2658 +2924 2247 2619 +2886 2317 2561 +2830 2397 2470 +2741 2485 2310 +2586 2582 1931 +2231 2685 0 +0 2795 0 +0 2910 0 +0 3028 0 +0 3150 0 +0 3274 0 +0 3400 0 +0 3527 0 +0 3656 0 +3155 2045 2882 +3155 2046 2882 +3155 2047 2882 +3155 2048 2881 +3155 2049 2881 +3154 2051 2880 +3154 2054 2880 +3153 2057 2879 +3152 2062 2877 +3151 2068 2876 +3149 2077 2874 +3147 2087 2870 +3144 2101 2866 +3140 2119 2861 +3135 2142 2853 +3128 2171 2843 +3118 2207 2829 +3104 2251 2809 +3085 2304 2782 +3059 2367 2742 +3021 2439 2683 +2965 2520 2589 +2877 2610 2423 +2723 2708 2020 +2374 2813 0 +0 2924 0 +0 3039 0 +0 3158 0 +0 3280 0 +0 3405 0 +0 3531 0 +0 3659 0 +3289 2158 3009 +3289 2159 3009 +3289 2160 3009 +3289 2160 3009 +3288 2162 3008 +3288 2163 3008 +3288 2165 3007 +3287 2168 3007 +3287 2172 3006 +3286 2177 3004 +3285 2183 3003 +3283 2192 3000 +3281 2203 2997 +3278 2217 2993 +3274 2236 2988 +3269 2259 2980 +3261 2289 2969 +3251 2326 2955 +3238 2372 2935 +3219 2426 2907 +3193 2490 2867 +3155 2563 2807 +3099 2646 2711 +3011 2737 2541 +2859 2836 2116 +2514 2942 0 +0 3053 0 +0 3169 0 +0 3289 0 +0 3411 0 +0 3536 0 +0 3662 0 +3422 2276 3137 +3422 2276 3137 +3422 2277 3137 +3422 2278 3137 +3422 2278 3137 +3422 2280 3136 +3421 2281 3136 +3421 2283 3135 +3420 2286 3135 +3420 2290 3134 +3419 2295 3133 +3418 2302 3131 +3416 2310 3128 +3414 2322 3125 +3411 2337 3121 +3407 2356 3115 +3402 2380 3108 +3394 2411 3097 +3385 2449 3083 +3371 2495 3063 +3352 2551 3035 +3326 2615 2994 +3289 2690 2933 +3233 2773 2836 +3145 2866 2662 +2994 2965 2219 +2652 3072 0 +0 3183 0 +0 3300 0 +0 3420 0 +0 3542 0 +0 3667 0 +3555 2397 3267 +3555 2397 3266 +3555 2398 3266 +3555 2398 3266 +3555 2399 3266 +3555 2400 3266 +3555 2401 3266 +3554 2403 3265 +3554 2405 3265 +3553 2408 3264 +3553 2412 3263 +3552 2417 3262 +3551 2423 3260 +3549 2432 3258 +3547 2444 3254 +3544 2459 3250 +3540 2479 3245 +3535 2504 3237 +3527 2535 3226 +3518 2573 3212 +3504 2621 3191 +3485 2677 3163 +3459 2742 3122 +3422 2818 3060 +3366 2902 2962 +3279 2995 2786 +3128 3095 2329 +2788 3202 0 +0 3314 0 +0 3431 0 +0 3551 0 +0 3674 0 +3688 2520 3396 +3688 2521 3396 +3688 2521 3396 +3688 2521 3396 +3688 2522 3396 +3688 2522 3396 +3687 2523 3396 +3687 2525 3395 +3687 2526 3395 +3687 2529 3394 +3686 2532 3394 +3685 2536 3393 +3684 2541 3391 +3683 2548 3390 +3682 2557 3387 +3679 2569 3384 +3677 2584 3380 +3673 2604 3374 +3667 2629 3366 +3660 2661 3356 +3650 2700 3341 +3637 2748 3321 +3618 2804 3292 +3592 2871 3251 +3555 2946 3189 +3499 3031 3090 +3412 3125 2912 +3262 3225 2443 +2923 3332 0 +0 3445 0 +0 3562 0 +0 3682 0 +3820 2646 3527 +3820 2646 3527 +3820 2646 3527 +3820 2647 3527 +3820 2647 3527 +3820 2648 3527 +3820 2648 3526 +3820 2649 3526 +3820 2651 3526 +3819 2652 3525 +3819 2654 3525 +3819 2658 3524 +3818 2662 3523 +3817 2667 3522 +3816 2674 3520 +3814 2683 3518 +3812 2695 3515 +3809 2711 3510 +3805 2731 3505 +3800 2756 3497 +3793 2788 3486 +3783 2828 3471 +3769 2876 3451 +3751 2933 3422 +3725 3000 3381 +3687 3076 3318 +3632 3161 3219 +3545 3255 3039 +3395 3356 2562 +3058 3463 0 +0 3576 0 +0 3693 0 +3953 2773 3658 +3953 2773 3658 +3953 2773 3658 +3953 2774 3658 +3953 2774 3658 +3953 2774 3658 +3953 2775 3657 +3953 2776 3657 +3952 2777 3657 +3952 2778 3657 +3952 2780 3656 +3952 2782 3656 +3951 2785 3655 +3950 2789 3654 +3949 2794 3653 +3948 2801 3651 +3947 2811 3649 +3944 2823 3645 +3942 2839 3641 +3938 2859 3635 +3932 2885 3628 +3925 2917 3617 +3915 2957 3602 +3902 3005 3582 +3883 3063 3553 +3857 3130 3511 +3820 3206 3449 +3764 3292 3349 +3678 3386 3167 +3528 3487 2683 +3192 3595 0 +0 3708 0 +4085 2901 3789 +4085 2902 3789 +4085 2902 3789 +4085 2902 3789 +4085 2902 3789 +4085 2902 3789 +4085 2903 3789 +4085 2903 3789 +4085 2904 3788 +4085 2905 3788 +4085 2906 3788 +4084 2908 3787 +4084 2910 3787 +4083 2913 3786 +4083 2918 3785 +4082 2923 3784 +4081 2930 3782 +4079 2939 3780 +4077 2952 3777 +4074 2968 3772 +4070 2988 3767 +4065 3014 3759 +4058 3046 3748 +4048 3086 3733 +4034 3135 3713 +4016 3193 3684 +3990 3260 3642 +3952 3337 3579 +3897 3423 3479 +3810 3517 3297 +3660 3618 2807 +3325 3726 0 +4095 3031 3920 +4095 3031 3920 +4095 3031 3920 +4095 3031 3920 +4095 3031 3920 +4095 3031 3920 +4095 3032 3920 +4095 3032 3920 +4095 3033 3920 +4095 3033 3920 +4095 3034 3920 +4095 3036 3919 +4095 3037 3919 +4095 3040 3918 +4095 3043 3918 +4095 3047 3917 +4095 3052 3915 +4095 3060 3914 +4095 3069 3911 +4095 3081 3908 +4095 3097 3904 +4095 3118 3898 +4095 3144 3890 +4095 3176 3879 +4095 3217 3864 +4095 3265 3844 +4095 3323 3815 +4095 3391 3773 +4085 3468 3710 +4029 3554 3610 +3943 3648 3427 +3793 3750 2933 +4095 3161 4052 +4095 3161 4052 +4095 3161 4052 +4095 3161 4052 +4095 3161 4052 +4095 3161 4052 +4095 3161 4052 +4095 3162 4052 +4095 3162 4052 +4095 3163 4052 +4095 3163 4051 +4095 3164 4051 +4095 3166 4051 +4095 3168 4050 +4095 3170 4050 +4095 3173 4049 +4095 3177 4048 +4095 3183 4047 +4095 3190 4045 +4095 3199 4043 +4095 3212 4040 +4095 3228 4035 +4095 3248 4029 +4095 3274 4022 +4095 3307 4011 +4095 3347 3996 +4095 3396 3975 +4095 3454 3946 +4095 3522 3904 +4095 3599 3841 +4095 3685 3741 +4075 3780 3557 +0 1347 1608 +0 1350 1606 +0 1354 1602 +0 1359 1597 +0 1365 1590 +0 1374 1581 +0 1386 1569 +0 1401 1552 +0 1421 1528 +0 1446 1494 +0 1477 1444 +0 1516 1367 +0 1563 1239 +0 1619 979 +0 1685 0 +0 1760 0 +0 1845 0 +0 1938 0 +0 2038 0 +0 2145 0 +0 2257 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +0 1348 1612 +0 1351 1610 +0 1354 1606 +0 1360 1601 +0 1366 1595 +0 1375 1586 +0 1387 1573 +0 1402 1557 +0 1422 1533 +0 1447 1499 +0 1478 1450 +0 1516 1374 +0 1564 1248 +0 1620 995 +0 1685 0 +0 1761 0 +0 1845 0 +0 1938 0 +0 2038 0 +0 2145 0 +0 2257 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +0 1349 1618 +0 1352 1615 +0 1356 1611 +0 1361 1607 +0 1368 1600 +0 1377 1591 +0 1388 1579 +0 1403 1563 +0 1423 1539 +0 1448 1506 +0 1479 1457 +0 1517 1383 +0 1564 1260 +0 1620 1015 +0 1686 0 +0 1761 0 +0 1845 0 +0 1938 0 +0 2038 0 +0 2145 0 +0 2257 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +0 1351 1625 +0 1354 1622 +0 1358 1619 +0 1363 1614 +0 1369 1607 +0 1378 1599 +0 1390 1587 +0 1405 1570 +0 1424 1548 +0 1449 1515 +0 1480 1467 +0 1519 1395 +0 1565 1275 +0 1621 1041 +0 1687 0 +0 1762 0 +0 1846 0 +0 1939 0 +0 2039 0 +0 2145 0 +0 2258 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +0 1353 1634 +0 1356 1631 +0 1360 1628 +0 1365 1623 +0 1372 1617 +0 1381 1608 +0 1392 1597 +0 1407 1581 +0 1426 1558 +0 1451 1527 +0 1482 1480 +0 1520 1410 +0 1567 1295 +0 1623 1074 +0 1688 244 +0 1763 0 +0 1847 0 +0 1939 0 +0 2039 0 +0 2146 0 +0 2258 0 +0 2374 0 +0 2494 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3386 0 +0 3517 0 +0 3648 0 +0 1356 1646 +0 1359 1643 +0 1363 1640 +0 1368 1636 +0 1375 1629 +0 1383 1621 +0 1395 1610 +0 1410 1594 +0 1429 1573 +0 1453 1542 +0 1484 1497 +0 1522 1430 +0 1569 1320 +0 1624 1114 +0 1690 449 +0 1764 0 +0 1848 0 +0 1940 0 +0 2040 0 +0 2146 0 +0 2258 0 +0 2375 0 +0 2495 0 +0 2617 0 +0 2742 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3648 0 +0 1360 1662 +0 1363 1659 +0 1367 1656 +0 1372 1652 +0 1379 1646 +0 1387 1638 +0 1399 1627 +0 1414 1612 +0 1433 1591 +0 1457 1561 +0 1487 1519 +0 1525 1455 +0 1572 1351 +0 1627 1162 +0 1692 629 +0 1766 0 +0 1849 0 +0 1941 0 +0 2041 0 +0 2147 0 +0 2259 0 +0 2375 0 +0 2495 0 +0 2618 0 +0 2743 0 +0 2869 0 +0 2997 0 +0 3126 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3648 0 +0 1366 1682 +0 1369 1679 +0 1373 1676 +0 1377 1672 +0 1384 1666 +0 1393 1659 +0 1404 1648 +0 1418 1634 +0 1437 1614 +0 1461 1586 +0 1492 1546 +0 1529 1486 +0 1575 1390 +0 1630 1220 +0 1694 795 +0 1768 0 +0 1851 0 +0 1943 0 +0 2042 0 +0 2148 0 +0 2260 0 +0 2376 0 +0 2495 0 +0 2618 0 +0 2743 0 +0 2870 0 +0 2998 0 +0 3127 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3649 0 +0 1373 1707 +0 1376 1705 +0 1380 1702 +0 1385 1698 +0 1391 1693 +0 1399 1686 +0 1411 1676 +0 1425 1662 +0 1444 1644 +0 1467 1618 +0 1497 1580 +0 1534 1525 +0 1580 1438 +0 1634 1287 +0 1698 950 +0 1771 0 +0 1854 0 +0 1945 0 +0 2044 0 +0 2149 0 +0 2261 0 +0 2377 0 +0 2496 0 +0 2619 0 +0 2743 0 +0 2870 0 +0 2998 0 +0 3127 0 +0 3256 0 +0 3387 0 +0 3517 0 +0 3649 0 +817 1383 1739 +796 1385 1737 +767 1389 1734 +725 1394 1731 +662 1400 1726 +560 1408 1719 +375 1419 1710 +0 1433 1698 +0 1452 1680 +0 1475 1656 +0 1504 1622 +0 1541 1572 +0 1586 1494 +0 1639 1364 +0 1702 1098 +0 1775 0 +0 1857 0 +0 1948 0 +0 2046 0 +0 2151 0 +0 2262 0 +0 2378 0 +0 2497 0 +0 2619 0 +0 2744 0 +0 2870 0 +0 2998 0 +0 3127 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +1204 1395 1779 +1195 1398 1777 +1183 1401 1775 +1166 1406 1771 +1143 1412 1767 +1111 1420 1761 +1063 1431 1752 +990 1445 1741 +870 1462 1725 +635 1485 1704 +0 1514 1673 +0 1550 1628 +0 1594 1560 +0 1646 1450 +0 1709 1243 +0 1780 567 +0 1861 0 +0 1951 0 +0 2049 0 +0 2154 0 +0 2264 0 +0 2379 0 +0 2498 0 +0 2620 0 +0 2744 0 +0 2871 0 +0 2998 0 +0 3127 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +1462 1411 1827 +1457 1414 1825 +1450 1417 1823 +1441 1422 1820 +1429 1428 1816 +1412 1436 1811 +1388 1446 1803 +1354 1459 1793 +1304 1476 1779 +1227 1498 1760 +1098 1526 1733 +836 1561 1694 +0 1604 1636 +0 1656 1544 +0 1717 1383 +0 1787 1003 +0 1867 0 +0 1956 0 +0 2053 0 +0 2157 0 +0 2266 0 +0 2381 0 +0 2499 0 +0 2621 0 +0 2745 0 +0 2871 0 +0 2999 0 +0 3128 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +1670 1432 1884 +1667 1435 1883 +1663 1438 1881 +1657 1442 1878 +1649 1448 1875 +1639 1455 1870 +1624 1465 1863 +1604 1478 1854 +1576 1494 1842 +1536 1516 1826 +1475 1543 1802 +1378 1576 1769 +1206 1618 1720 +769 1668 1646 +0 1728 1522 +0 1797 1276 +0 1875 0 +0 1962 0 +0 2058 0 +0 2161 0 +0 2270 0 +0 2383 0 +0 2501 0 +0 2623 0 +0 2746 0 +0 2872 0 +0 3000 0 +0 3128 0 +0 3257 0 +0 3387 0 +0 3518 0 +0 3649 0 +1851 1458 1951 +1849 1461 1950 +1847 1464 1948 +1843 1468 1946 +1838 1473 1943 +1831 1480 1939 +1821 1490 1933 +1809 1502 1925 +1791 1517 1915 +1766 1538 1901 +1730 1563 1881 +1678 1596 1853 +1597 1636 1813 +1459 1684 1753 +1167 1741 1659 +0 1809 1491 +0 1885 1074 +0 1971 0 +0 2065 0 +0 2166 0 +0 2274 0 +0 2387 0 +0 2504 0 +0 2625 0 +0 2748 0 +0 2873 0 +0 3000 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +2017 1491 2027 +2016 1494 2026 +2014 1496 2025 +2011 1500 2023 +2008 1505 2020 +2003 1512 2017 +1997 1520 2012 +1988 1532 2006 +1976 1547 1997 +1960 1566 1985 +1937 1590 1969 +1904 1620 1946 +1856 1658 1914 +1784 1704 1867 +1664 1759 1794 +1430 1824 1676 +367 1898 1445 +0 1982 454 +0 2074 0 +0 2173 0 +0 2279 0 +0 2391 0 +0 2507 0 +0 2627 0 +0 2750 0 +0 2875 0 +0 3002 0 +0 3130 0 +0 3259 0 +0 3388 0 +0 3519 0 +0 3649 0 +2173 1532 2113 +2172 1534 2112 +2171 1537 2111 +2169 1540 2109 +2166 1545 2107 +2163 1551 2104 +2158 1559 2100 +2152 1569 2095 +2144 1583 2088 +2133 1600 2078 +2117 1623 2065 +2096 1651 2047 +2065 1687 2021 +2021 1730 1984 +1953 1782 1929 +1844 1844 1844 +1639 1915 1698 +988 1996 1375 +0 2085 0 +0 2183 0 +0 2287 0 +0 2397 0 +0 2512 0 +0 2631 0 +0 2753 0 +0 2877 0 +0 3003 0 +0 3131 0 +0 3259 0 +0 3389 0 +0 3519 0 +0 3650 0 +2322 1581 2206 +2321 1583 2206 +2320 1585 2205 +2319 1588 2204 +2317 1593 2202 +2315 1598 2199 +2312 1605 2196 +2307 1615 2192 +2301 1627 2186 +2293 1643 2179 +2283 1663 2168 +2268 1690 2153 +2247 1722 2133 +2218 1763 2105 +2175 1811 2063 +2111 1870 2001 +2009 1937 1903 +1822 2014 1725 +1302 2100 1261 +0 2195 0 +0 2297 0 +0 2405 0 +0 2518 0 +0 2635 0 +0 2756 0 +0 2880 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2466 1640 2308 +2466 1641 2307 +2465 1643 2306 +2464 1646 2305 +2463 1650 2304 +2461 1655 2302 +2459 1661 2299 +2456 1669 2296 +2451 1680 2292 +2446 1694 2285 +2438 1713 2277 +2427 1736 2266 +2413 1766 2250 +2393 1803 2228 +2364 1848 2197 +2323 1902 2152 +2262 1965 2083 +2164 2038 1971 +1988 2120 1760 +1534 2211 1044 +0 2309 0 +0 2415 0 +0 2526 0 +0 2641 0 +0 2761 0 +0 2883 0 +0 3008 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3521 0 +0 3651 0 +2607 1708 2415 +2607 1709 2415 +2607 1711 2414 +2606 1713 2413 +2605 1716 2412 +2604 1721 2411 +2602 1726 2409 +2600 1733 2406 +2597 1743 2402 +2592 1755 2398 +2587 1771 2391 +2579 1792 2382 +2569 1818 2370 +2555 1851 2353 +2535 1892 2330 +2507 1941 2297 +2467 1999 2248 +2407 2067 2173 +2313 2145 2049 +2144 2231 1802 +1729 2326 267 +0 2428 0 +0 2536 0 +0 2649 0 +0 2767 0 +0 2888 0 +0 3011 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +2746 1785 2528 +2746 1786 2528 +2745 1788 2527 +2745 1790 2526 +2744 1793 2526 +2743 1796 2524 +2742 1801 2523 +2740 1807 2521 +2738 1815 2518 +2735 1826 2514 +2731 1839 2509 +2726 1857 2502 +2718 1880 2493 +2708 1909 2480 +2694 1945 2463 +2674 1989 2438 +2647 2042 2403 +2608 2104 2351 +2549 2176 2271 +2457 2257 2136 +2294 2347 1853 +1903 2445 0 +0 2549 0 +0 2660 0 +0 2775 0 +0 2894 0 +0 3016 0 +0 3141 0 +0 3267 0 +0 3395 0 +0 3523 0 +0 3653 0 +2883 1872 2645 +2883 1873 2645 +2883 1874 2644 +2882 1876 2644 +2882 1878 2643 +2881 1881 2642 +2880 1885 2641 +2879 1890 2640 +2877 1897 2637 +2875 1905 2635 +2872 1917 2631 +2868 1932 2625 +2862 1952 2618 +2855 1976 2609 +2845 2008 2596 +2831 2046 2577 +2812 2093 2552 +2785 2149 2515 +2746 2215 2461 +2688 2290 2376 +2598 2374 2231 +2438 2467 1914 +2064 2567 0 +0 2674 0 +0 2786 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3271 0 +0 3397 0 +0 3525 0 +0 3655 0 +3019 1967 2766 +3019 1967 2765 +3018 1968 2765 +3018 1970 2765 +3018 1971 2764 +3017 1974 2763 +3017 1977 2763 +3016 1981 2761 +3014 1987 2760 +3013 1994 2758 +3011 2004 2755 +3008 2016 2751 +3004 2032 2745 +2998 2053 2738 +2991 2080 2728 +2981 2113 2715 +2967 2154 2696 +2948 2203 2669 +2921 2262 2631 +2883 2330 2575 +2826 2408 2487 +2736 2494 2334 +2580 2589 1984 +2216 2691 0 +0 2800 0 +0 2913 0 +0 3031 0 +0 3152 0 +0 3275 0 +0 3401 0 +0 3528 0 +0 3657 0 +3154 2069 2889 +3153 2069 2889 +3153 2070 2888 +3153 2071 2888 +3153 2072 2888 +3152 2074 2887 +3152 2077 2887 +3151 2080 2886 +3150 2085 2884 +3149 2091 2883 +3147 2098 2881 +3145 2109 2878 +3142 2122 2873 +3138 2139 2868 +3133 2161 2861 +3126 2189 2850 +3116 2224 2837 +3102 2266 2817 +3083 2318 2790 +3057 2379 2751 +3018 2449 2693 +2962 2529 2602 +2873 2617 2442 +2718 2714 2063 +2363 2818 0 +0 2927 0 +0 3042 0 +0 3160 0 +0 3282 0 +0 3406 0 +0 3532 0 +0 3659 0 +3288 2177 3014 +3288 2177 3014 +3287 2178 3014 +3287 2179 3014 +3287 2180 3013 +3287 2181 3013 +3286 2183 3012 +3286 2186 3012 +3285 2190 3011 +3284 2194 3010 +3283 2200 3008 +3281 2209 3006 +3279 2219 3003 +3276 2233 2998 +3272 2251 2993 +3267 2274 2985 +3260 2303 2975 +3250 2339 2961 +3236 2383 2941 +3217 2437 2914 +3191 2499 2874 +3153 2571 2815 +3097 2652 2721 +3009 2743 2556 +2855 2840 2152 +2506 2945 0 +0 3056 0 +0 3171 0 +0 3290 0 +0 3412 0 +0 3537 0 +0 3663 0 +3421 2290 3141 +3421 2291 3141 +3421 2291 3141 +3421 2292 3141 +3421 2293 3141 +3421 2294 3140 +3420 2295 3140 +3420 2297 3139 +3419 2300 3139 +3419 2304 3138 +3418 2309 3136 +3417 2315 3135 +3415 2324 3132 +3413 2335 3129 +3410 2349 3125 +3406 2368 3120 +3401 2392 3112 +3393 2421 3102 +3384 2459 3087 +3370 2504 3067 +3351 2558 3039 +3325 2622 2999 +3287 2696 2939 +3231 2778 2844 +3143 2869 2673 +2991 2968 2248 +2646 3074 0 +0 3185 0 +0 3301 0 +0 3421 0 +0 3543 0 +0 3668 0 +3554 2408 3269 +3554 2408 3269 +3554 2408 3269 +3554 2409 3269 +3554 2410 3269 +3554 2411 3269 +3554 2412 3268 +3553 2413 3268 +3553 2416 3268 +3553 2418 3267 +3552 2422 3266 +3551 2427 3265 +3550 2434 3263 +3548 2443 3261 +3546 2454 3257 +3543 2469 3253 +3539 2488 3248 +3534 2512 3240 +3527 2543 3229 +3517 2581 3215 +3503 2627 3195 +3485 2683 3167 +3458 2747 3126 +3421 2822 3065 +3365 2905 2968 +3277 2998 2794 +3126 3097 2352 +2784 3204 0 +0 3315 0 +0 3432 0 +0 3552 0 +0 3674 0 +3687 2529 3399 +3687 2529 3399 +3687 2529 3399 +3687 2530 3398 +3687 2530 3398 +3687 2531 3398 +3687 2532 3398 +3687 2533 3398 +3686 2535 3397 +3686 2537 3397 +3685 2540 3396 +3685 2544 3395 +3684 2549 3394 +3683 2556 3392 +3681 2565 3390 +3679 2576 3387 +3676 2591 3382 +3672 2611 3377 +3667 2636 3369 +3660 2667 3358 +3650 2706 3344 +3636 2753 3324 +3618 2809 3295 +3591 2874 3254 +3554 2950 3192 +3498 3034 3094 +3411 3127 2918 +3260 3227 2461 +2920 3334 0 +0 3446 0 +0 3563 0 +0 3683 0 +3820 2652 3529 +3820 2652 3529 +3820 2653 3528 +3820 2653 3528 +3820 2653 3528 +3820 2654 3528 +3820 2655 3528 +3820 2656 3528 +3819 2657 3528 +3819 2658 3527 +3819 2661 3527 +3818 2664 3526 +3817 2668 3525 +3817 2673 3524 +3815 2680 3522 +3814 2689 3519 +3812 2701 3516 +3809 2716 3512 +3805 2736 3506 +3799 2761 3499 +3792 2793 3488 +3782 2832 3473 +3769 2880 3453 +3750 2936 3424 +3724 3003 3383 +3687 3078 3321 +3631 3163 3222 +3544 3257 3044 +3394 3357 2575 +3056 3465 0 +0 3577 0 +0 3694 0 +3953 2778 3659 +3953 2778 3659 +3953 2778 3659 +3953 2778 3659 +3952 2779 3659 +3952 2779 3659 +3952 2780 3659 +3952 2780 3658 +3952 2781 3658 +3952 2783 3658 +3952 2784 3658 +3951 2787 3657 +3951 2790 3656 +3950 2794 3655 +3949 2799 3654 +3948 2806 3652 +3946 2815 3650 +3944 2827 3647 +3941 2843 3642 +3937 2863 3637 +3932 2888 3629 +3925 2920 3618 +3915 2960 3604 +3902 3008 3583 +3883 3065 3554 +3857 3132 3513 +3819 3208 3450 +3764 3293 3351 +3677 3387 3171 +3527 3488 2694 +3190 3596 0 +0 3708 0 +4085 2905 3790 +4085 2905 3790 +4085 2905 3790 +4085 2905 3790 +4085 2906 3790 +4085 2906 3790 +4085 2906 3790 +4085 2907 3789 +4085 2908 3789 +4084 2909 3789 +4084 2910 3789 +4084 2912 3788 +4084 2914 3788 +4083 2917 3787 +4082 2921 3786 +4082 2926 3785 +4080 2933 3783 +4079 2943 3781 +4077 2955 3778 +4074 2971 3773 +4070 2991 3768 +4064 3017 3760 +4057 3049 3749 +4047 3089 3734 +4034 3137 3714 +4015 3195 3685 +3989 3262 3643 +3952 3338 3581 +3896 3424 3481 +3810 3518 3299 +3660 3619 2815 +3324 3727 0 +4095 3033 3921 +4095 3034 3921 +4095 3034 3921 +4095 3034 3921 +4095 3034 3921 +4095 3034 3921 +4095 3034 3921 +4095 3035 3921 +4095 3035 3921 +4095 3036 3920 +4095 3037 3920 +4095 3038 3920 +4095 3040 3920 +4095 3042 3919 +4095 3046 3918 +4095 3050 3917 +4095 3055 3916 +4095 3062 3914 +4095 3072 3912 +4095 3084 3909 +4095 3100 3904 +4095 3120 3899 +4095 3146 3891 +4095 3178 3880 +4095 3218 3865 +4095 3267 3845 +4095 3325 3816 +4095 3392 3774 +4084 3469 3711 +4029 3555 3611 +3942 3649 3429 +3793 3751 2939 +4095 3163 4053 +4095 3163 4052 +4095 3163 4052 +4095 3163 4052 +4095 3163 4052 +4095 3163 4052 +4095 3164 4052 +4095 3164 4052 +4095 3164 4052 +4095 3165 4052 +4095 3166 4052 +4095 3167 4052 +4095 3168 4051 +4095 3170 4051 +4095 3172 4050 +4095 3175 4050 +4095 3179 4049 +4095 3185 4047 +4095 3192 4046 +4095 3201 4043 +4095 3213 4040 +4095 3229 4036 +4095 3250 4030 +4095 3276 4022 +4095 3308 4011 +4095 3349 3997 +4095 3397 3976 +4095 3455 3947 +4095 3523 3905 +4095 3600 3842 +4095 3686 3742 +4075 3780 3559 +0 1476 1739 +0 1478 1737 +0 1481 1735 +0 1485 1731 +0 1490 1726 +0 1497 1719 +0 1506 1710 +0 1518 1698 +0 1533 1681 +0 1552 1657 +0 1577 1622 +0 1609 1572 +0 1647 1494 +0 1695 1365 +0 1751 1099 +0 1817 0 +0 1892 0 +0 1976 0 +0 2069 0 +0 2170 0 +0 2277 0 +0 2389 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3518 0 +0 3649 0 +0 1477 1742 +0 1479 1740 +0 1482 1738 +0 1486 1734 +0 1491 1729 +0 1498 1723 +0 1507 1713 +0 1518 1701 +0 1533 1684 +0 1553 1660 +0 1578 1626 +0 1609 1576 +0 1648 1500 +0 1695 1371 +0 1751 1111 +0 1817 0 +0 1892 0 +0 1977 0 +0 2070 0 +0 2170 0 +0 2277 0 +0 2389 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1478 1746 +0 1480 1744 +0 1483 1742 +0 1487 1738 +0 1492 1733 +0 1499 1727 +0 1507 1718 +0 1519 1706 +0 1534 1689 +0 1554 1665 +0 1579 1631 +0 1610 1582 +0 1649 1506 +0 1696 1380 +0 1752 1127 +0 1818 0 +0 1893 0 +0 1977 0 +0 2070 0 +0 2170 0 +0 2277 0 +0 2389 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1479 1752 +0 1481 1750 +0 1484 1747 +0 1488 1744 +0 1493 1739 +0 1500 1732 +0 1509 1723 +0 1520 1711 +0 1535 1695 +0 1555 1671 +0 1580 1638 +0 1611 1590 +0 1650 1515 +0 1696 1392 +0 1753 1147 +0 1818 0 +0 1893 0 +0 1978 0 +0 2070 0 +0 2171 0 +0 2277 0 +0 2389 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1481 1759 +0 1483 1757 +0 1486 1754 +0 1490 1751 +0 1495 1746 +0 1502 1740 +0 1510 1731 +0 1522 1719 +0 1537 1703 +0 1556 1680 +0 1581 1647 +0 1612 1600 +0 1651 1527 +0 1698 1407 +0 1754 1173 +0 1819 122 +0 1894 0 +0 1978 0 +0 2071 0 +0 2171 0 +0 2278 0 +0 2390 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1483 1768 +0 1485 1766 +0 1488 1763 +0 1492 1760 +0 1497 1755 +0 1504 1749 +0 1513 1741 +0 1524 1729 +0 1539 1713 +0 1558 1691 +0 1583 1659 +0 1614 1612 +0 1652 1542 +0 1699 1427 +0 1755 1206 +0 1820 376 +0 1895 0 +0 1979 0 +0 2071 0 +0 2171 0 +0 2278 0 +0 2390 0 +0 2506 0 +0 2626 0 +0 2749 0 +0 2874 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1486 1780 +0 1488 1778 +0 1491 1776 +0 1495 1772 +0 1500 1768 +0 1507 1762 +0 1516 1753 +0 1527 1742 +0 1542 1726 +0 1561 1705 +0 1586 1674 +0 1616 1629 +0 1655 1562 +0 1701 1452 +0 1757 1246 +0 1822 581 +0 1896 0 +0 1980 0 +0 2072 0 +0 2172 0 +0 2279 0 +0 2390 0 +0 2507 0 +0 2627 0 +0 2750 0 +0 2875 0 +0 3001 0 +0 3129 0 +0 3258 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1490 1795 +0 1493 1794 +0 1495 1791 +0 1499 1788 +0 1504 1784 +0 1511 1778 +0 1519 1770 +0 1531 1759 +0 1546 1744 +0 1565 1723 +0 1589 1694 +0 1620 1651 +0 1657 1587 +0 1704 1484 +0 1759 1294 +0 1824 762 +0 1898 0 +0 1981 0 +0 2073 0 +0 2173 0 +0 2279 0 +0 2391 0 +0 2507 0 +0 2627 0 +0 2750 0 +0 2875 0 +0 3001 0 +0 3129 0 +0 3259 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1496 1815 +0 1498 1814 +0 1501 1811 +0 1505 1808 +0 1510 1804 +0 1516 1799 +0 1525 1791 +0 1536 1781 +0 1551 1766 +0 1569 1746 +0 1593 1718 +0 1624 1678 +0 1661 1618 +0 1707 1522 +0 1762 1352 +0 1826 927 +0 1900 0 +0 1983 0 +0 2075 0 +0 2174 0 +0 2280 0 +0 2392 0 +0 2508 0 +0 2628 0 +0 2750 0 +0 2875 0 +0 3002 0 +0 3130 0 +0 3259 0 +0 3388 0 +0 3519 0 +0 3649 0 +0 1503 1841 +0 1505 1839 +0 1508 1837 +0 1512 1834 +0 1517 1830 +0 1523 1825 +0 1532 1818 +0 1543 1808 +0 1557 1795 +0 1576 1776 +0 1599 1750 +0 1629 1712 +0 1666 1657 +0 1712 1570 +0 1766 1419 +0 1830 1082 +0 1903 0 +0 1986 0 +0 2077 0 +0 2176 0 +0 2282 0 +0 2393 0 +0 2509 0 +0 2628 0 +0 2751 0 +0 2875 0 +0 3002 0 +0 3130 0 +0 3259 0 +0 3388 0 +0 3519 0 +0 3650 0 +964 1513 1873 +949 1515 1871 +928 1518 1869 +899 1521 1867 +857 1526 1863 +794 1532 1858 +692 1541 1851 +507 1551 1842 +0 1566 1830 +0 1584 1813 +0 1607 1788 +0 1637 1754 +0 1673 1704 +0 1718 1626 +0 1771 1496 +0 1835 1231 +0 1907 0 +0 1989 0 +0 2080 0 +0 2178 0 +0 2283 0 +0 2394 0 +0 2510 0 +0 2629 0 +0 2751 0 +0 2876 0 +0 3002 0 +0 3130 0 +0 3259 0 +0 3389 0 +0 3519 0 +0 3650 0 +1342 1525 1912 +1336 1527 1911 +1327 1530 1909 +1315 1533 1907 +1299 1538 1903 +1276 1544 1899 +1243 1552 1893 +1195 1563 1884 +1123 1577 1873 +1003 1595 1857 +767 1617 1836 +0 1646 1805 +0 1682 1760 +0 1726 1692 +0 1779 1582 +0 1841 1375 +0 1912 699 +0 1994 0 +0 2083 0 +0 2181 0 +0 2286 0 +0 2396 0 +0 2511 0 +0 2630 0 +0 2752 0 +0 2877 0 +0 3003 0 +0 3130 0 +0 3259 0 +0 3389 0 +0 3519 0 +0 3650 0 +1598 1542 1960 +1594 1543 1959 +1589 1546 1957 +1582 1549 1955 +1573 1554 1952 +1561 1560 1948 +1544 1568 1943 +1520 1578 1935 +1486 1591 1925 +1436 1608 1911 +1359 1631 1892 +1230 1659 1865 +968 1693 1826 +0 1736 1768 +0 1788 1676 +0 1849 1516 +0 1919 1135 +0 1999 0 +0 2088 0 +0 2185 0 +0 2289 0 +0 2398 0 +0 2513 0 +0 2632 0 +0 2753 0 +0 2877 0 +0 3003 0 +0 3131 0 +0 3260 0 +0 3389 0 +0 3519 0 +0 3650 0 +1804 1562 2017 +1802 1564 2016 +1799 1567 2015 +1795 1570 2013 +1789 1574 2010 +1781 1580 2007 +1771 1587 2002 +1756 1597 1995 +1737 1610 1987 +1708 1626 1974 +1668 1648 1958 +1607 1675 1934 +1511 1708 1901 +1338 1750 1852 +901 1800 1778 +0 1860 1654 +0 1929 1408 +0 2007 0 +0 2095 0 +0 2190 0 +0 2293 0 +0 2402 0 +0 2515 0 +0 2633 0 +0 2755 0 +0 2878 0 +0 3004 0 +0 3132 0 +0 3260 0 +0 3389 0 +0 3520 0 +0 3650 0 +1985 1589 2084 +1983 1591 2083 +1981 1593 2082 +1979 1596 2080 +1975 1600 2078 +1970 1605 2075 +1963 1612 2071 +1953 1622 2065 +1941 1634 2058 +1923 1650 2047 +1898 1670 2033 +1862 1695 2013 +1810 1728 1985 +1729 1768 1945 +1591 1816 1886 +1299 1874 1791 +0 1941 1623 +0 2017 1207 +0 2103 0 +0 2197 0 +0 2298 0 +0 2406 0 +0 2519 0 +0 2636 0 +0 2757 0 +0 2880 0 +0 3005 0 +0 3132 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3650 0 +2150 1622 2160 +2149 1623 2159 +2148 1626 2158 +2146 1628 2157 +2143 1632 2155 +2140 1637 2152 +2135 1644 2149 +2129 1653 2144 +2120 1664 2138 +2108 1679 2129 +2092 1698 2117 +2069 1722 2101 +2036 1752 2078 +1989 1790 2046 +1916 1836 1999 +1796 1892 1927 +1562 1956 1808 +499 2030 1577 +0 2114 586 +0 2206 0 +0 2305 0 +0 2412 0 +0 2523 0 +0 2639 0 +0 2759 0 +0 2882 0 +0 3007 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3520 0 +0 3651 0 +2306 1663 2246 +2305 1664 2245 +2304 1666 2244 +2303 1669 2243 +2301 1672 2241 +2298 1677 2239 +2295 1683 2236 +2291 1691 2232 +2284 1701 2227 +2276 1715 2220 +2265 1732 2210 +2249 1755 2197 +2228 1783 2179 +2197 1819 2153 +2153 1862 2116 +2085 1915 2061 +1976 1976 1976 +1771 2047 1830 +1120 2128 1507 +0 2217 0 +0 2315 0 +0 2419 0 +0 2529 0 +0 2644 0 +0 2763 0 +0 2885 0 +0 3009 0 +0 3135 0 +0 3263 0 +0 3392 0 +0 3521 0 +0 3651 0 +2455 1712 2339 +2454 1713 2339 +2453 1715 2338 +2452 1717 2337 +2451 1721 2336 +2449 1725 2334 +2447 1730 2332 +2444 1737 2328 +2439 1747 2324 +2434 1759 2318 +2426 1775 2311 +2415 1796 2300 +2400 1822 2285 +2379 1854 2265 +2350 1895 2237 +2307 1944 2195 +2243 2002 2134 +2141 2069 2035 +1954 2146 1857 +1434 2233 1394 +0 2327 0 +0 2429 0 +0 2537 0 +0 2650 0 +0 2767 0 +0 2888 0 +0 3012 0 +0 3137 0 +0 3264 0 +0 3393 0 +0 3522 0 +0 3652 0 +2599 1771 2440 +2598 1772 2440 +2598 1773 2439 +2597 1775 2438 +2596 1778 2437 +2595 1782 2436 +2593 1787 2434 +2591 1793 2432 +2588 1801 2428 +2584 1812 2424 +2578 1827 2418 +2570 1845 2409 +2560 1868 2398 +2545 1898 2382 +2525 1935 2360 +2496 1980 2329 +2455 2034 2284 +2394 2097 2215 +2296 2170 2104 +2120 2252 1892 +1666 2343 1176 +0 2441 0 +0 2547 0 +0 2658 0 +0 2773 0 +0 2893 0 +0 3015 0 +0 3140 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3653 0 +2740 1839 2548 +2740 1840 2547 +2739 1841 2547 +2739 1843 2546 +2738 1845 2545 +2737 1848 2544 +2736 1853 2543 +2734 1858 2541 +2732 1865 2538 +2729 1875 2535 +2725 1887 2530 +2719 1903 2523 +2711 1924 2514 +2701 1950 2502 +2687 1983 2486 +2667 2024 2462 +2639 2073 2429 +2599 2132 2380 +2539 2199 2305 +2445 2277 2181 +2277 2363 1934 +1861 2458 400 +0 2560 0 +0 2668 0 +0 2781 0 +0 2899 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +2878 1917 2660 +2878 1917 2660 +2878 1919 2660 +2878 1920 2659 +2877 1922 2659 +2876 1925 2658 +2875 1928 2657 +2874 1933 2655 +2872 1939 2653 +2870 1947 2650 +2867 1958 2646 +2863 1972 2641 +2858 1989 2635 +2850 2012 2625 +2840 2041 2613 +2826 2077 2595 +2807 2121 2570 +2779 2174 2535 +2740 2236 2483 +2681 2308 2403 +2589 2389 2268 +2426 2479 1986 +2035 2577 0 +0 2682 0 +0 2792 0 +0 2907 0 +0 3026 0 +0 3148 0 +0 3273 0 +0 3399 0 +0 3527 0 +0 3656 0 +3015 2003 2777 +3015 2004 2777 +3015 2005 2777 +3015 2006 2776 +3014 2008 2776 +3014 2010 2775 +3013 2013 2774 +3012 2017 2773 +3011 2022 2772 +3009 2029 2770 +3007 2038 2767 +3004 2049 2763 +3000 2064 2758 +2995 2084 2751 +2987 2108 2741 +2977 2140 2728 +2963 2178 2709 +2944 2225 2684 +2917 2281 2647 +2878 2347 2593 +2821 2422 2508 +2730 2506 2363 +2570 2599 2046 +2196 2699 0 +0 2806 0 +0 2918 0 +0 3034 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3529 0 +0 3658 0 +3151 2098 2898 +3151 2099 2898 +3151 2099 2897 +3150 2100 2897 +3150 2102 2897 +3150 2104 2896 +3149 2106 2896 +3149 2109 2895 +3148 2113 2893 +3147 2119 2892 +3145 2126 2890 +3143 2136 2887 +3140 2148 2883 +3136 2164 2877 +3130 2185 2870 +3123 2212 2860 +3113 2245 2847 +3099 2286 2828 +3080 2335 2801 +3053 2394 2763 +3015 2462 2707 +2958 2540 2619 +2868 2626 2466 +2712 2721 2116 +2349 2823 0 +0 2932 0 +0 3045 0 +0 3163 0 +0 3284 0 +0 3407 0 +0 3533 0 +0 3660 0 +3286 2200 3021 +3286 2201 3021 +3286 2201 3021 +3285 2202 3021 +3285 2203 3020 +3285 2205 3020 +3284 2206 3019 +3284 2209 3019 +3283 2212 3018 +3282 2217 3016 +3281 2223 3015 +3280 2231 3013 +3277 2241 3010 +3274 2254 3006 +3270 2271 3000 +3265 2293 2993 +3258 2321 2983 +3248 2356 2969 +3234 2398 2949 +3215 2450 2922 +3189 2511 2883 +3151 2581 2825 +3094 2661 2734 +3005 2749 2574 +2850 2846 2196 +2495 2950 0 +0 3059 0 +0 3174 0 +0 3292 0 +0 3414 0 +0 3538 0 +0 3664 0 +3420 2309 3146 +3420 2309 3146 +3420 2309 3146 +3420 2310 3146 +3419 2311 3146 +3419 2312 3145 +3419 2313 3145 +3418 2315 3145 +3418 2318 3144 +3417 2322 3143 +3416 2326 3142 +3415 2333 3140 +3414 2341 3138 +3411 2351 3135 +3408 2365 3131 +3404 2383 3125 +3399 2406 3117 +3392 2435 3107 +3382 2471 3093 +3368 2516 3074 +3350 2569 3046 +3323 2631 3006 +3285 2703 2947 +3229 2785 2853 +3141 2875 2688 +2988 2973 2284 +2638 3077 0 +0 3188 0 +0 3303 0 +0 3422 0 +0 3544 0 +0 3669 0 +3553 2422 3273 +3553 2422 3273 +3553 2423 3273 +3553 2423 3273 +3553 2424 3273 +3553 2425 3273 +3553 2426 3272 +3552 2427 3272 +3552 2430 3271 +3552 2432 3271 +3551 2436 3270 +3550 2441 3269 +3549 2447 3267 +3547 2456 3265 +3545 2467 3261 +3542 2481 3257 +3538 2500 3252 +3533 2524 3244 +3525 2554 3234 +3516 2591 3219 +3502 2636 3200 +3483 2690 3172 +3457 2754 3131 +3419 2828 3071 +3363 2910 2976 +3275 3002 2805 +3123 3100 2380 +2778 3206 0 +0 3317 0 +0 3433 0 +0 3553 0 +0 3675 0 +3687 2540 3402 +3687 2540 3402 +3686 2540 3401 +3686 2541 3401 +3686 2541 3401 +3686 2542 3401 +3686 2543 3401 +3686 2544 3401 +3686 2545 3400 +3685 2548 3400 +3685 2550 3399 +3684 2554 3398 +3683 2559 3397 +3682 2566 3395 +3680 2575 3393 +3678 2586 3390 +3675 2601 3385 +3671 2620 3380 +3666 2644 3372 +3659 2675 3362 +3649 2713 3347 +3635 2759 3327 +3617 2815 3299 +3590 2880 3258 +3553 2954 3197 +3497 3038 3100 +3410 3130 2926 +3258 3229 2484 +2916 3336 0 +0 3448 0 +0 3564 0 +0 3684 0 +3819 2661 3531 +3819 2661 3531 +3819 2661 3531 +3819 2661 3531 +3819 2662 3531 +3819 2662 3530 +3819 2663 3530 +3819 2664 3530 +3819 2665 3530 +3818 2667 3529 +3818 2669 3529 +3818 2672 3528 +3817 2676 3527 +3816 2681 3526 +3815 2688 3524 +3813 2697 3522 +3811 2708 3519 +3808 2723 3514 +3804 2743 3509 +3799 2768 3501 +3792 2799 3490 +3782 2838 3476 +3768 2885 3456 +3750 2941 3427 +3723 3007 3386 +3686 3082 3325 +3630 3166 3227 +3543 3259 3050 +3392 3359 2593 +3052 3466 0 +0 3578 0 +0 3695 0 +3952 2784 3661 +3952 2784 3661 +3952 2785 3661 +3952 2785 3661 +3952 2785 3661 +3952 2785 3660 +3952 2786 3660 +3952 2787 3660 +3952 2788 3660 +3951 2789 3660 +3951 2791 3659 +3951 2793 3659 +3950 2796 3658 +3950 2800 3657 +3949 2805 3656 +3947 2812 3654 +3946 2821 3652 +3944 2833 3648 +3941 2848 3644 +3937 2868 3638 +3932 2893 3631 +3924 2925 3620 +3915 2964 3605 +3901 3012 3585 +3882 3068 3556 +3856 3135 3515 +3819 3211 3453 +3763 3295 3354 +3676 3389 3176 +3526 3489 2707 +3188 3597 0 +0 3709 0 +4085 2910 3791 +4085 2910 3791 +4085 2910 3791 +4085 2910 3791 +4085 2911 3791 +4085 2911 3791 +4085 2911 3791 +4084 2912 3791 +4084 2912 3791 +4084 2913 3790 +4084 2915 3790 +4084 2916 3790 +4083 2919 3789 +4083 2922 3788 +4082 2926 3787 +4081 2931 3786 +4080 2938 3784 +4078 2947 3782 +4076 2959 3779 +4073 2975 3775 +4069 2995 3769 +4064 3020 3761 +4057 3052 3750 +4047 3092 3736 +4034 3140 3715 +4015 3197 3686 +3989 3264 3645 +3951 3340 3583 +3896 3425 3483 +3809 3519 3303 +3659 3620 2826 +3322 3728 0 +4095 3037 3922 +4095 3037 3922 +4095 3037 3922 +4095 3037 3922 +4095 3038 3922 +4095 3038 3922 +4095 3038 3922 +4095 3039 3922 +4095 3039 3922 +4095 3040 3921 +4095 3041 3921 +4095 3042 3921 +4095 3044 3920 +4095 3046 3920 +4095 3049 3919 +4095 3053 3918 +4095 3059 3917 +4095 3066 3915 +4095 3075 3913 +4095 3087 3910 +4095 3103 3905 +4095 3123 3900 +4095 3149 3892 +4095 3181 3881 +4095 3221 3866 +4095 3269 3846 +4095 3327 3817 +4095 3394 3775 +4084 3470 3713 +4029 3556 3613 +3942 3650 3432 +3792 3751 2947 +4095 3166 4053 +4095 3166 4053 +4095 3166 4053 +4095 3166 4053 +4095 3166 4053 +4095 3166 4053 +4095 3166 4053 +4095 3167 4053 +4095 3167 4053 +4095 3168 4053 +4095 3168 4053 +4095 3169 4052 +4095 3171 4052 +4095 3172 4052 +4095 3175 4051 +4095 3178 4050 +4095 3182 4049 +4095 3187 4048 +4095 3194 4046 +4095 3204 4044 +4095 3216 4041 +4095 3232 4037 +4095 3252 4031 +4095 3278 4023 +4095 3310 4012 +4095 3350 3997 +4095 3399 3977 +4095 3457 3948 +4095 3524 3906 +4095 3601 3843 +4095 3687 3743 +4074 3781 3561 +0 1606 1871 +0 1607 1869 +0 1610 1867 +0 1612 1864 +0 1616 1861 +0 1622 1856 +0 1628 1849 +0 1637 1840 +0 1649 1827 +0 1664 1810 +0 1684 1786 +0 1709 1751 +0 1740 1701 +0 1779 1623 +0 1826 1491 +0 1883 1222 +0 1949 0 +0 2024 0 +0 2108 0 +0 2201 0 +0 2302 0 +0 2409 0 +0 2521 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1606 1873 +0 1608 1871 +0 1610 1869 +0 1613 1867 +0 1617 1863 +0 1622 1858 +0 1629 1851 +0 1638 1842 +0 1650 1830 +0 1665 1813 +0 1684 1789 +0 1709 1754 +0 1741 1704 +0 1779 1626 +0 1827 1497 +0 1883 1231 +0 1949 0 +0 2024 0 +0 2109 0 +0 2202 0 +0 2302 0 +0 2409 0 +0 2521 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1607 1876 +0 1609 1874 +0 1611 1872 +0 1614 1870 +0 1618 1866 +0 1623 1861 +0 1630 1855 +0 1639 1846 +0 1650 1833 +0 1666 1816 +0 1685 1792 +0 1710 1758 +0 1741 1708 +0 1780 1632 +0 1827 1503 +0 1883 1243 +0 1949 0 +0 2024 0 +0 2109 0 +0 2202 0 +0 2302 0 +0 2409 0 +0 2521 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1608 1880 +0 1610 1878 +0 1612 1876 +0 1615 1874 +0 1619 1870 +0 1624 1865 +0 1631 1859 +0 1640 1850 +0 1651 1838 +0 1666 1821 +0 1686 1797 +0 1711 1763 +0 1742 1714 +0 1781 1638 +0 1828 1512 +0 1884 1259 +0 1950 0 +0 2025 0 +0 2109 0 +0 2202 0 +0 2302 0 +0 2409 0 +0 2521 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1609 1885 +0 1611 1884 +0 1613 1882 +0 1616 1879 +0 1620 1876 +0 1625 1871 +0 1632 1864 +0 1641 1855 +0 1652 1843 +0 1668 1827 +0 1687 1803 +0 1712 1770 +0 1743 1722 +0 1782 1647 +0 1829 1524 +0 1885 1280 +0 1950 0 +0 2025 0 +0 2110 0 +0 2202 0 +0 2303 0 +0 2409 0 +0 2522 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1611 1892 +0 1613 1891 +0 1615 1889 +0 1618 1886 +0 1622 1883 +0 1627 1878 +0 1634 1872 +0 1642 1863 +0 1654 1851 +0 1669 1835 +0 1689 1812 +0 1713 1779 +0 1744 1732 +0 1783 1659 +0 1830 1540 +0 1886 1305 +0 1951 254 +0 2026 0 +0 2110 0 +0 2203 0 +0 2303 0 +0 2410 0 +0 2522 0 +0 2638 0 +0 2758 0 +0 2881 0 +0 3006 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1614 1901 +0 1615 1900 +0 1617 1898 +0 1620 1896 +0 1624 1892 +0 1629 1887 +0 1636 1881 +0 1645 1873 +0 1656 1861 +0 1671 1845 +0 1691 1823 +0 1715 1791 +0 1746 1745 +0 1784 1674 +0 1831 1559 +0 1887 1338 +0 1952 508 +0 2027 0 +0 2111 0 +0 2203 0 +0 2304 0 +0 2410 0 +0 2522 0 +0 2639 0 +0 2759 0 +0 2881 0 +0 3007 0 +0 3133 0 +0 3261 0 +0 3390 0 +0 3520 0 +0 3651 0 +0 1617 1913 +0 1618 1912 +0 1620 1910 +0 1623 1908 +0 1627 1904 +0 1632 1900 +0 1639 1894 +0 1648 1885 +0 1659 1874 +0 1674 1859 +0 1693 1837 +0 1718 1806 +0 1748 1761 +0 1787 1694 +0 1833 1584 +0 1889 1378 +0 1954 713 +0 2028 0 +0 2112 0 +0 2204 0 +0 2304 0 +0 2411 0 +0 2522 0 +0 2639 0 +0 2759 0 +0 2882 0 +0 3007 0 +0 3133 0 +0 3261 0 +0 3391 0 +0 3520 0 +0 3651 0 +0 1621 1929 +0 1622 1928 +0 1625 1926 +0 1627 1923 +0 1631 1920 +0 1636 1916 +0 1643 1910 +0 1652 1902 +0 1663 1891 +0 1678 1876 +0 1697 1855 +0 1721 1826 +0 1752 1783 +0 1790 1719 +0 1836 1616 +0 1891 1426 +0 1956 894 +0 2030 0 +0 2113 0 +0 2206 0 +0 2305 0 +0 2411 0 +0 2523 0 +0 2639 0 +0 2759 0 +0 2882 0 +0 3007 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3520 0 +0 3651 0 +0 1626 1949 +0 1628 1948 +0 1630 1946 +0 1633 1944 +0 1637 1940 +0 1642 1936 +0 1648 1931 +0 1657 1923 +0 1668 1913 +0 1683 1898 +0 1701 1878 +0 1726 1851 +0 1756 1810 +0 1793 1750 +0 1839 1655 +0 1894 1484 +0 1958 1059 +0 2032 0 +0 2115 0 +0 2207 0 +0 2306 0 +0 2412 0 +0 2524 0 +0 2640 0 +0 2760 0 +0 2882 0 +0 3007 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3520 0 +0 3651 0 +0 1634 1974 +0 1635 1973 +0 1637 1971 +0 1640 1969 +0 1644 1966 +0 1649 1962 +0 1655 1957 +0 1664 1950 +0 1675 1940 +0 1689 1927 +0 1708 1908 +0 1731 1882 +0 1761 1844 +0 1798 1789 +0 1844 1702 +0 1898 1552 +0 1962 1214 +0 2035 0 +0 2118 0 +0 2209 0 +0 2308 0 +0 2414 0 +0 2525 0 +0 2641 0 +0 2760 0 +0 2883 0 +0 3008 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3521 0 +0 3651 0 +1107 1643 2006 +1096 1645 2005 +1081 1647 2003 +1061 1650 2001 +1031 1653 1999 +989 1658 1995 +926 1664 1990 +824 1673 1983 +639 1684 1974 +132 1698 1962 +0 1716 1945 +0 1739 1921 +0 1769 1886 +0 1805 1836 +0 1850 1758 +0 1904 1628 +0 1967 1363 +0 2039 0 +0 2121 0 +0 2212 0 +0 2310 0 +0 2415 0 +0 2526 0 +0 2642 0 +0 2761 0 +0 2883 0 +0 3008 0 +0 3134 0 +0 3262 0 +0 3391 0 +0 3521 0 +0 3651 0 +1479 1656 2045 +1474 1657 2044 +1468 1659 2043 +1459 1662 2041 +1447 1666 2039 +1431 1670 2035 +1408 1676 2031 +1375 1684 2025 +1327 1695 2016 +1255 1709 2005 +1135 1727 1989 +899 1749 1968 +0 1778 1937 +0 1814 1892 +0 1858 1824 +0 1911 1714 +0 1973 1507 +0 2045 831 +0 2126 0 +0 2215 0 +0 2313 0 +0 2418 0 +0 2528 0 +0 2643 0 +0 2762 0 +0 2884 0 +0 3009 0 +0 3135 0 +0 3263 0 +0 3391 0 +0 3521 0 +0 3651 0 +1732 1672 2093 +1730 1674 2092 +1726 1676 2091 +1721 1678 2089 +1715 1681 2087 +1706 1686 2084 +1693 1692 2080 +1676 1700 2075 +1652 1710 2067 +1618 1723 2057 +1568 1741 2043 +1491 1763 2024 +1362 1791 1997 +1100 1826 1958 +0 1868 1900 +0 1920 1808 +0 1981 1648 +0 2052 1267 +0 2132 0 +0 2220 0 +0 2317 0 +0 2421 0 +0 2530 0 +0 2645 0 +0 2764 0 +0 2885 0 +0 3009 0 +0 3136 0 +0 3263 0 +0 3392 0 +0 3521 0 +0 3651 0 +1938 1693 2150 +1936 1694 2150 +1934 1696 2148 +1931 1699 2147 +1927 1702 2145 +1921 1706 2142 +1913 1712 2139 +1903 1719 2134 +1889 1729 2127 +1869 1742 2119 +1840 1759 2106 +1800 1780 2090 +1739 1807 2066 +1643 1841 2033 +1470 1882 1984 +1033 1932 1910 +0 1992 1786 +0 2061 1540 +0 2139 54 +0 2227 0 +0 2322 0 +0 2425 0 +0 2534 0 +0 2648 0 +0 2766 0 +0 2887 0 +0 3011 0 +0 3136 0 +0 3264 0 +0 3392 0 +0 3522 0 +0 3652 0 +2118 1720 2217 +2117 1721 2216 +2116 1723 2215 +2113 1725 2214 +2111 1728 2212 +2107 1732 2210 +2102 1737 2207 +2095 1744 2203 +2086 1754 2197 +2073 1766 2190 +2055 1782 2179 +2030 1802 2165 +1994 1828 2145 +1942 1860 2118 +1861 1900 2077 +1723 1948 2018 +1431 2006 1923 +0 2073 1755 +0 2149 1339 +0 2235 0 +0 2329 0 +0 2430 0 +0 2538 0 +0 2651 0 +0 2768 0 +0 2889 0 +0 3012 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +2283 1753 2293 +2282 1754 2292 +2281 1756 2292 +2280 1758 2290 +2278 1761 2289 +2275 1764 2287 +2272 1769 2285 +2267 1776 2281 +2261 1785 2276 +2252 1796 2270 +2240 1811 2261 +2224 1830 2249 +2201 1854 2233 +2168 1884 2210 +2121 1922 2178 +2048 1968 2131 +1928 2024 2059 +1694 2088 1940 +631 2163 1709 +0 2246 718 +0 2338 0 +0 2437 0 +0 2544 0 +0 2655 0 +0 2772 0 +0 2891 0 +0 3014 0 +0 3139 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3653 0 +2439 1794 2378 +2438 1795 2378 +2437 1796 2377 +2436 1798 2376 +2435 1801 2375 +2433 1804 2373 +2430 1809 2371 +2427 1815 2368 +2423 1823 2364 +2417 1833 2359 +2408 1847 2352 +2397 1864 2342 +2382 1887 2329 +2360 1915 2311 +2329 1951 2285 +2285 1994 2248 +2217 2047 2193 +2108 2108 2108 +1903 2180 1962 +1252 2260 1639 +0 2350 0 +0 2447 0 +0 2551 0 +0 2661 0 +0 2776 0 +0 2895 0 +0 3017 0 +0 3141 0 +0 3267 0 +0 3395 0 +0 3524 0 +0 3653 0 +2587 1843 2472 +2587 1844 2471 +2586 1845 2471 +2585 1847 2470 +2584 1850 2469 +2583 1853 2468 +2581 1857 2466 +2579 1862 2464 +2576 1869 2460 +2571 1879 2456 +2566 1891 2451 +2558 1907 2443 +2547 1928 2432 +2532 1954 2418 +2511 1986 2397 +2482 2027 2369 +2439 2076 2327 +2375 2134 2266 +2273 2201 2167 +2086 2279 1990 +1566 2365 1526 +0 2459 0 +0 2561 0 +0 2669 0 +0 2782 0 +0 2899 0 +0 3020 0 +0 3144 0 +0 3269 0 +0 3396 0 +0 3525 0 +0 3654 0 +2731 1902 2573 +2731 1903 2572 +2731 1904 2572 +2730 1906 2571 +2729 1908 2570 +2728 1910 2569 +2727 1914 2568 +2725 1919 2566 +2723 1925 2564 +2720 1933 2560 +2716 1944 2556 +2710 1959 2550 +2702 1977 2541 +2692 2000 2530 +2677 2030 2514 +2657 2067 2492 +2629 2112 2461 +2588 2166 2416 +2526 2229 2347 +2428 2302 2236 +2252 2384 2024 +1798 2475 1309 +0 2574 0 +0 2679 0 +0 2790 0 +0 2906 0 +0 3025 0 +0 3147 0 +0 3272 0 +0 3398 0 +0 3526 0 +0 3655 0 +2872 1970 2680 +2872 1971 2680 +2872 1972 2679 +2871 1973 2679 +2871 1975 2678 +2870 1977 2677 +2869 1981 2676 +2868 1985 2675 +2866 1990 2673 +2864 1998 2670 +2861 2007 2667 +2857 2019 2662 +2851 2036 2655 +2843 2056 2646 +2833 2083 2634 +2819 2115 2618 +2799 2156 2594 +2771 2205 2561 +2731 2264 2512 +2672 2332 2437 +2577 2409 2314 +2409 2495 2066 +1993 2590 532 +0 2692 0 +0 2800 0 +0 2914 0 +0 3031 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3528 0 +0 3657 0 +3011 2048 2793 +3011 2049 2792 +3010 2050 2792 +3010 2051 2792 +3010 2052 2791 +3009 2054 2791 +3008 2057 2790 +3007 2060 2789 +3006 2065 2787 +3005 2071 2785 +3002 2079 2782 +2999 2090 2779 +2995 2104 2774 +2990 2122 2767 +2982 2144 2757 +2972 2173 2745 +2958 2209 2727 +2939 2253 2702 +2911 2306 2667 +2872 2368 2616 +2813 2440 2536 +2721 2521 2400 +2558 2611 2118 +2167 2709 0 +0 2814 0 +0 2924 0 +0 3039 0 +0 3158 0 +0 3280 0 +0 3405 0 +0 3531 0 +0 3659 0 +3148 2135 2910 +3147 2135 2909 +3147 2136 2909 +3147 2137 2909 +3147 2138 2909 +3146 2140 2908 +3146 2142 2907 +3145 2145 2907 +3144 2149 2905 +3143 2154 2904 +3141 2161 2902 +3139 2170 2899 +3136 2181 2895 +3132 2196 2890 +3127 2216 2883 +3119 2241 2873 +3109 2272 2860 +3095 2310 2842 +3076 2357 2816 +3049 2413 2779 +3010 2479 2725 +2953 2554 2640 +2862 2638 2495 +2703 2731 2178 +2328 2831 0 +0 2938 0 +0 3050 0 +0 3167 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +3283 2230 3030 +3283 2230 3030 +3283 2231 3030 +3283 2232 3030 +3283 2233 3029 +3282 2234 3029 +3282 2236 3028 +3281 2238 3028 +3281 2241 3027 +3280 2245 3026 +3279 2251 3024 +3277 2258 3022 +3275 2268 3019 +3272 2280 3015 +3268 2297 3010 +3262 2317 3002 +3255 2344 2992 +3245 2377 2979 +3231 2418 2960 +3212 2467 2933 +3186 2526 2896 +3147 2594 2839 +3090 2672 2751 +3000 2758 2598 +2844 2853 2248 +2481 2955 0 +0 3064 0 +0 3177 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3418 2332 3153 +3418 2332 3153 +3418 2333 3153 +3418 2333 3153 +3417 2334 3153 +3417 2335 3152 +3417 2337 3152 +3417 2339 3151 +3416 2341 3151 +3415 2344 3150 +3414 2349 3149 +3413 2355 3147 +3412 2363 3145 +3409 2373 3142 +3406 2386 3138 +3403 2403 3132 +3397 2425 3125 +3390 2453 3115 +3380 2488 3101 +3366 2531 3082 +3347 2582 3054 +3321 2643 3016 +3283 2713 2958 +3226 2793 2866 +3137 2882 2706 +2983 2978 2328 +2627 3082 0 +0 3191 0 +0 3306 0 +0 3424 0 +0 3546 0 +0 3670 0 +3552 2440 3279 +3552 2441 3278 +3552 2441 3278 +3552 2441 3278 +3552 2442 3278 +3551 2443 3278 +3551 2444 3278 +3551 2446 3277 +3551 2448 3277 +3550 2450 3276 +3549 2454 3275 +3549 2458 3274 +3547 2465 3272 +3546 2473 3270 +3543 2484 3267 +3541 2497 3263 +3537 2515 3257 +3531 2538 3250 +3524 2567 3239 +3514 2603 3225 +3500 2648 3206 +3482 2701 3178 +3455 2763 3138 +3417 2835 3079 +3361 2917 2986 +3273 3007 2820 +3120 3105 2416 +2770 3209 0 +0 3320 0 +0 3435 0 +0 3554 0 +0 3676 0 +3685 2554 3406 +3685 2554 3405 +3685 2554 3405 +3685 2555 3405 +3685 2555 3405 +3685 2556 3405 +3685 2557 3405 +3685 2558 3405 +3684 2560 3404 +3684 2562 3404 +3684 2564 3403 +3683 2568 3402 +3682 2573 3401 +3681 2579 3399 +3679 2588 3397 +3677 2599 3394 +3674 2613 3389 +3670 2632 3384 +3665 2656 3376 +3658 2686 3366 +3648 2723 3351 +3634 2768 3332 +3615 2823 3304 +3589 2886 3263 +3551 2960 3203 +3495 3042 3108 +3408 3134 2938 +3255 3233 2512 +2910 3338 0 +0 3449 0 +0 3565 0 +0 3685 0 +3819 2672 3534 +3819 2672 3534 +3819 2672 3534 +3819 2672 3534 +3818 2673 3533 +3818 2673 3533 +3818 2674 3533 +3818 2675 3533 +3818 2676 3533 +3818 2678 3532 +3817 2680 3532 +3817 2683 3531 +3816 2686 3530 +3815 2691 3529 +3814 2698 3527 +3812 2707 3525 +3810 2718 3522 +3807 2733 3517 +3803 2752 3512 +3798 2776 3504 +3791 2807 3494 +3781 2845 3479 +3767 2891 3459 +3749 2947 3431 +3722 3012 3390 +3685 3086 3329 +3629 3170 3232 +3542 3262 3059 +3390 3362 2616 +3048 3468 0 +0 3580 0 +0 3696 0 +3952 2793 3663 +3952 2793 3663 +3952 2793 3663 +3951 2793 3663 +3951 2793 3663 +3951 2794 3663 +3951 2794 3663 +3951 2795 3662 +3951 2796 3662 +3951 2797 3662 +3951 2799 3661 +3950 2801 3661 +3950 2804 3660 +3949 2808 3659 +3948 2813 3658 +3947 2820 3656 +3945 2829 3654 +3943 2840 3651 +3940 2856 3646 +3936 2875 3641 +3931 2900 3633 +3924 2931 3622 +3914 2970 3608 +3900 3017 3588 +3882 3073 3559 +3856 3139 3518 +3818 3214 3457 +3762 3298 3359 +3675 3391 3182 +3524 3491 2725 +3184 3598 0 +0 3710 0 +4084 2916 3793 +4084 2916 3793 +4084 2916 3793 +4084 2917 3793 +4084 2917 3793 +4084 2917 3793 +4084 2918 3793 +4084 2918 3792 +4084 2919 3792 +4084 2920 3792 +4083 2921 3792 +4083 2923 3791 +4083 2925 3791 +4082 2928 3790 +4082 2932 3789 +4081 2937 3788 +4080 2944 3786 +4078 2953 3784 +4076 2965 3781 +4073 2980 3776 +4069 3000 3771 +4064 3025 3763 +4056 3057 3752 +4047 3096 3738 +4033 3144 3717 +4015 3201 3689 +3988 3267 3647 +3951 3343 3585 +3895 3428 3486 +3808 3521 3308 +3658 3622 2839 +3320 3729 0 +4095 3042 3923 +4095 3042 3923 +4095 3042 3923 +4095 3042 3923 +4095 3042 3923 +4095 3043 3923 +4095 3043 3923 +4095 3043 3923 +4095 3044 3923 +4095 3045 3923 +4095 3046 3922 +4095 3047 3922 +4095 3049 3922 +4095 3051 3921 +4095 3054 3920 +4095 3058 3919 +4095 3063 3918 +4095 3070 3916 +4095 3079 3914 +4095 3091 3911 +4095 3107 3907 +4095 3127 3901 +4095 3152 3893 +4095 3184 3882 +4095 3224 3868 +4095 3272 3847 +4095 3329 3819 +4095 3396 3777 +4084 3472 3715 +4028 3558 3615 +3941 3651 3435 +3791 3752 2958 +4095 3169 4054 +4095 3169 4054 +4095 3169 4054 +4095 3169 4054 +4095 3169 4054 +4095 3170 4054 +4095 3170 4054 +4095 3170 4054 +4095 3171 4054 +4095 3171 4054 +4095 3172 4054 +4095 3173 4053 +4095 3174 4053 +4095 3176 4053 +4095 3178 4052 +4095 3181 4051 +4095 3185 4050 +4095 3191 4049 +4095 3198 4047 +4095 3207 4045 +4095 3219 4042 +4095 3235 4037 +4095 3255 4032 +4095 3281 4024 +4095 3313 4013 +4095 3353 3998 +4095 3401 3978 +4095 3459 3949 +4095 3526 3907 +4095 3602 3845 +4095 3688 3745 +4074 3782 3564 +0 1736 2002 +0 1737 2001 +0 1739 2000 +0 1741 1998 +0 1744 1995 +0 1748 1991 +0 1753 1986 +0 1760 1979 +0 1769 1970 +0 1781 1958 +0 1796 1940 +0 1816 1916 +0 1841 1881 +0 1872 1830 +0 1911 1752 +0 1958 1620 +0 2015 1347 +0 2080 0 +0 2156 0 +0 2240 0 +0 2333 0 +0 2434 0 +0 2541 0 +0 2653 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +0 1737 2004 +0 1738 2003 +0 1739 2001 +0 1742 1999 +0 1745 1997 +0 1749 1993 +0 1754 1988 +0 1761 1981 +0 1769 1972 +0 1781 1960 +0 1796 1942 +0 1816 1918 +0 1841 1883 +0 1872 1833 +0 1911 1755 +0 1958 1624 +0 2015 1354 +0 2081 0 +0 2156 0 +0 2241 0 +0 2333 0 +0 2434 0 +0 2541 0 +0 2653 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +0 1737 2006 +0 1738 2005 +0 1740 2004 +0 1742 2002 +0 1745 1999 +0 1749 1995 +0 1754 1990 +0 1761 1984 +0 1770 1974 +0 1782 1962 +0 1797 1945 +0 1817 1921 +0 1841 1886 +0 1873 1836 +0 1912 1759 +0 1959 1629 +0 2015 1363 +0 2081 0 +0 2156 0 +0 2241 0 +0 2334 0 +0 2434 0 +0 2541 0 +0 2653 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +0 1738 2009 +0 1739 2008 +0 1741 2007 +0 1743 2005 +0 1746 2002 +0 1750 1998 +0 1755 1993 +0 1762 1987 +0 1771 1978 +0 1782 1965 +0 1798 1948 +0 1817 1924 +0 1842 1890 +0 1873 1840 +0 1912 1764 +0 1959 1636 +0 2015 1375 +0 2081 0 +0 2157 0 +0 2241 0 +0 2334 0 +0 2434 0 +0 2541 0 +0 2653 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +0 1739 2013 +0 1740 2012 +0 1742 2011 +0 1744 2009 +0 1747 2006 +0 1751 2002 +0 1756 1997 +0 1763 1991 +0 1772 1982 +0 1783 1970 +0 1798 1953 +0 1818 1929 +0 1843 1895 +0 1874 1846 +0 1913 1771 +0 1960 1645 +0 2016 1391 +0 2082 0 +0 2157 0 +0 2241 0 +0 2334 0 +0 2434 0 +0 2541 0 +0 2653 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +0 1740 2018 +0 1741 2017 +0 1743 2016 +0 1745 2014 +0 1748 2011 +0 1752 2008 +0 1757 2003 +0 1764 1996 +0 1773 1988 +0 1785 1975 +0 1800 1959 +0 1819 1935 +0 1844 1902 +0 1875 1854 +0 1914 1779 +0 1961 1656 +0 2017 1412 +0 2082 13 +0 2157 0 +0 2242 0 +0 2334 0 +0 2435 0 +0 2541 0 +0 2654 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3138 0 +0 3265 0 +0 3393 0 +0 3522 0 +0 3652 0 +0 1742 2025 +0 1743 2024 +0 1745 2023 +0 1747 2021 +0 1750 2018 +0 1754 2015 +0 1759 2010 +0 1766 2004 +0 1775 1995 +0 1786 1983 +0 1801 1967 +0 1821 1944 +0 1845 1911 +0 1876 1864 +0 1915 1791 +0 1962 1672 +0 2018 1438 +0 2083 386 +0 2158 0 +0 2242 0 +0 2335 0 +0 2435 0 +0 2542 0 +0 2654 0 +0 2770 0 +0 2890 0 +0 3013 0 +0 3139 0 +0 3265 0 +0 3393 0 +0 3523 0 +0 3652 0 +0 1744 2035 +0 1746 2033 +0 1747 2032 +0 1749 2030 +0 1752 2028 +0 1756 2024 +0 1761 2020 +0 1768 2013 +0 1777 2005 +0 1788 1993 +0 1803 1977 +0 1823 1955 +0 1847 1923 +0 1878 1877 +0 1917 1806 +0 1963 1691 +0 2019 1470 +0 2084 640 +0 2159 0 +0 2243 0 +0 2336 0 +0 2436 0 +0 2542 0 +0 2654 0 +0 2771 0 +0 2891 0 +0 3014 0 +0 3139 0 +0 3265 0 +0 3393 0 +0 3523 0 +0 3652 0 +0 1748 2046 +0 1749 2045 +0 1750 2044 +0 1753 2042 +0 1755 2040 +0 1759 2036 +0 1764 2032 +0 1771 2026 +0 1780 2018 +0 1791 2006 +0 1806 1991 +0 1825 1969 +0 1850 1938 +0 1881 1893 +0 1919 1826 +0 1965 1716 +0 2021 1510 +0 2086 846 +0 2160 0 +0 2244 0 +0 2336 0 +0 2436 0 +0 2543 0 +0 2655 0 +0 2771 0 +0 2891 0 +0 3014 0 +0 3139 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3652 0 +0 1752 2062 +0 1753 2061 +0 1755 2060 +0 1757 2058 +0 1760 2055 +0 1763 2052 +0 1768 2048 +0 1775 2042 +0 1784 2034 +0 1795 2023 +0 1810 2008 +0 1829 1987 +0 1853 1958 +0 1884 1915 +0 1922 1851 +0 1968 1748 +0 2023 1559 +0 2088 1026 +0 2162 0 +0 2246 0 +0 2338 0 +0 2437 0 +0 2543 0 +0 2655 0 +0 2771 0 +0 2891 0 +0 3014 0 +0 3139 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3652 0 +0 1757 2082 +0 1759 2081 +0 1760 2080 +0 1762 2078 +0 1765 2076 +0 1769 2073 +0 1774 2068 +0 1780 2063 +0 1789 2055 +0 1800 2045 +0 1815 2030 +0 1834 2011 +0 1858 1983 +0 1888 1942 +0 1925 1882 +0 1971 1787 +0 2026 1616 +0 2090 1191 +0 2164 0 +0 2247 0 +0 2339 0 +0 2438 0 +0 2544 0 +0 2656 0 +0 2772 0 +0 2892 0 +0 3014 0 +0 3139 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3653 0 +30 1765 2107 +0 1766 2106 +0 1767 2105 +0 1770 2103 +0 1772 2101 +0 1776 2098 +0 1781 2094 +0 1787 2089 +0 1796 2082 +0 1807 2072 +0 1821 2059 +0 1840 2040 +0 1864 2014 +0 1893 1976 +0 1931 1921 +0 1976 1834 +0 2030 1684 +0 2094 1346 +0 2167 0 +0 2250 0 +0 2341 0 +0 2440 0 +0 2546 0 +0 2657 0 +0 2773 0 +0 2892 0 +0 3015 0 +0 3140 0 +0 3266 0 +0 3394 0 +0 3523 0 +0 3653 0 +1247 1774 2139 +1239 1775 2138 +1228 1777 2137 +1213 1779 2136 +1193 1782 2133 +1163 1785 2131 +1121 1790 2127 +1058 1796 2122 +956 1805 2116 +771 1816 2106 +265 1830 2094 +0 1848 2077 +0 1871 2053 +0 1901 2018 +0 1937 1968 +0 1982 1890 +0 2036 1760 +0 2099 1495 +0 2171 0 +0 2253 0 +0 2344 0 +0 2442 0 +0 2547 0 +0 2658 0 +0 2774 0 +0 2893 0 +0 3015 0 +0 3140 0 +0 3267 0 +0 3394 0 +0 3523 0 +0 3653 0 +1614 1787 2178 +1611 1788 2178 +1606 1790 2177 +1600 1792 2175 +1591 1794 2173 +1579 1798 2171 +1563 1802 2167 +1540 1808 2163 +1507 1817 2157 +1459 1827 2149 +1387 1841 2137 +1267 1859 2122 +1031 1881 2100 +0 1910 2069 +0 1946 2024 +0 1990 1956 +0 2043 1846 +0 2105 1639 +0 2177 963 +0 2258 0 +0 2348 0 +0 2445 0 +0 2550 0 +0 2660 0 +0 2775 0 +0 2894 0 +0 3016 0 +0 3141 0 +0 3267 0 +0 3395 0 +0 3523 0 +0 3653 0 +1867 1803 2226 +1865 1804 2225 +1862 1806 2224 +1858 1808 2223 +1853 1810 2222 +1847 1814 2219 +1838 1818 2216 +1825 1824 2212 +1808 1832 2207 +1784 1842 2199 +1750 1855 2189 +1700 1873 2175 +1623 1895 2156 +1494 1923 2129 +1232 1958 2090 +0 2000 2032 +0 2052 1940 +0 2113 1780 +0 2184 1399 +0 2264 0 +0 2352 0 +0 2449 0 +0 2553 0 +0 2663 0 +0 2777 0 +0 2896 0 +0 3017 0 +0 3142 0 +0 3268 0 +0 3395 0 +0 3524 0 +0 3653 0 +2071 1824 2283 +2070 1825 2282 +2068 1827 2282 +2066 1828 2281 +2063 1831 2279 +2059 1834 2277 +2053 1838 2274 +2046 1844 2271 +2035 1851 2266 +2021 1861 2260 +2001 1874 2251 +1973 1891 2239 +1932 1912 2222 +1871 1939 2198 +1775 1973 2165 +1602 2014 2117 +1165 2064 2042 +0 2124 1918 +0 2193 1672 +0 2271 186 +0 2359 0 +0 2454 0 +0 2557 0 +0 2666 0 +0 2780 0 +0 2898 0 +0 3019 0 +0 3143 0 +0 3268 0 +0 3396 0 +0 3524 0 +0 3654 0 +2251 1851 2350 +2250 1852 2349 +2249 1853 2348 +2248 1855 2347 +2246 1857 2346 +2243 1860 2344 +2239 1864 2342 +2234 1869 2339 +2227 1877 2335 +2218 1886 2329 +2205 1898 2322 +2187 1914 2311 +2162 1934 2297 +2127 1960 2277 +2074 1992 2250 +1993 2032 2210 +1855 2080 2150 +1563 2138 2055 +0 2205 1887 +0 2281 1471 +0 2367 0 +0 2461 0 +0 2562 0 +0 2670 0 +0 2783 0 +0 2900 0 +0 3021 0 +0 3144 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3654 0 +2416 1884 2425 +2415 1885 2425 +2415 1886 2424 +2413 1888 2424 +2412 1890 2423 +2410 1893 2421 +2408 1896 2419 +2404 1901 2417 +2399 1908 2413 +2393 1917 2408 +2384 1928 2402 +2372 1943 2393 +2356 1962 2382 +2333 1986 2365 +2300 2017 2342 +2253 2054 2310 +2180 2101 2263 +2060 2156 2191 +1826 2220 2072 +763 2295 1841 +0 2378 850 +0 2470 0 +0 2570 0 +0 2676 0 +0 2787 0 +0 2904 0 +0 3023 0 +0 3146 0 +0 3271 0 +0 3398 0 +0 3526 0 +0 3655 0 +2571 1925 2511 +2571 1926 2510 +2570 1927 2510 +2569 1928 2509 +2568 1930 2508 +2567 1933 2507 +2565 1936 2505 +2563 1941 2503 +2559 1947 2500 +2555 1955 2496 +2549 1965 2491 +2540 1979 2484 +2529 1997 2474 +2514 2019 2461 +2492 2048 2443 +2461 2083 2417 +2417 2126 2380 +2350 2179 2326 +2240 2240 2240 +2036 2312 2094 +1384 2392 1771 +0 2482 0 +0 2579 0 +0 2683 0 +0 2793 0 +0 2908 0 +0 3027 0 +0 3149 0 +0 3273 0 +0 3399 0 +0 3527 0 +0 3656 0 +2720 1975 2604 +2719 1975 2604 +2719 1976 2603 +2718 1978 2603 +2718 1979 2602 +2717 1982 2601 +2715 1985 2600 +2713 1989 2598 +2711 1994 2596 +2708 2002 2593 +2704 2011 2588 +2698 2023 2583 +2690 2039 2575 +2679 2060 2564 +2664 2086 2550 +2643 2119 2529 +2614 2159 2501 +2571 2208 2460 +2508 2266 2398 +2405 2333 2299 +2218 2411 2122 +1698 2497 1658 +0 2591 0 +0 2693 0 +0 2801 0 +0 2914 0 +0 3032 0 +0 3152 0 +0 3276 0 +0 3401 0 +0 3529 0 +0 3657 0 +2864 2033 2705 +2863 2034 2705 +2863 2035 2704 +2863 2036 2704 +2862 2038 2703 +2861 2040 2703 +2860 2042 2702 +2859 2046 2700 +2857 2051 2698 +2855 2057 2696 +2852 2066 2692 +2848 2076 2688 +2842 2091 2682 +2834 2109 2673 +2824 2133 2662 +2809 2162 2646 +2789 2199 2624 +2761 2244 2593 +2720 2298 2548 +2658 2361 2479 +2560 2434 2368 +2385 2516 2156 +1930 2607 1441 +0 2706 0 +0 2811 0 +0 2922 0 +0 3038 0 +0 3157 0 +0 3279 0 +0 3404 0 +0 3531 0 +0 3658 0 +3004 2102 2812 +3004 2102 2812 +3004 2103 2812 +3004 2104 2811 +3003 2105 2811 +3003 2107 2810 +3002 2110 2810 +3001 2113 2808 +3000 2117 2807 +2998 2122 2805 +2996 2130 2802 +2993 2139 2799 +2989 2152 2794 +2983 2168 2787 +2976 2188 2779 +2965 2215 2766 +2951 2248 2750 +2931 2288 2726 +2903 2337 2693 +2863 2396 2644 +2804 2464 2570 +2709 2541 2446 +2541 2628 2199 +2125 2722 664 +0 2824 0 +0 2932 0 +0 3046 0 +0 3163 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3660 0 +3143 2180 2925 +3143 2180 2925 +3143 2181 2924 +3142 2182 2924 +3142 2183 2924 +3142 2184 2923 +3141 2186 2923 +3141 2189 2922 +3140 2192 2921 +3138 2197 2919 +3137 2203 2917 +3134 2211 2914 +3131 2222 2911 +3127 2236 2906 +3122 2254 2899 +3114 2276 2890 +3104 2305 2877 +3090 2341 2859 +3071 2385 2835 +3043 2438 2799 +3004 2500 2748 +2945 2572 2668 +2853 2653 2532 +2690 2743 2250 +2299 2841 0 +0 2946 0 +0 3056 0 +0 3171 0 +0 3290 0 +0 3412 0 +0 3537 0 +0 3663 0 +3280 2267 3042 +3280 2267 3042 +3280 2267 3041 +3279 2268 3041 +3279 2269 3041 +3279 2270 3041 +3278 2272 3040 +3278 2274 3039 +3277 2277 3039 +3276 2281 3037 +3275 2286 3036 +3273 2293 3034 +3271 2302 3031 +3268 2313 3027 +3264 2328 3022 +3259 2348 3015 +3251 2373 3005 +3241 2404 2992 +3227 2442 2974 +3208 2489 2948 +3181 2545 2911 +3142 2611 2857 +3085 2686 2773 +2994 2770 2628 +2835 2863 2310 +2460 2963 0 +0 3070 0 +0 3182 0 +0 3299 0 +0 3419 0 +0 3542 0 +0 3667 0 +3415 2362 3162 +3415 2362 3162 +3415 2362 3162 +3415 2363 3162 +3415 2364 3162 +3415 2365 3161 +3414 2366 3161 +3414 2368 3160 +3414 2370 3160 +3413 2373 3159 +3412 2377 3158 +3411 2383 3156 +3409 2390 3154 +3407 2400 3151 +3404 2412 3147 +3400 2429 3142 +3394 2449 3134 +3387 2476 3124 +3377 2509 3111 +3363 2550 3092 +3344 2599 3066 +3318 2658 3028 +3279 2726 2971 +3222 2804 2883 +3132 2891 2730 +2976 2985 2380 +2613 3088 0 +0 3196 0 +0 3309 0 +0 3427 0 +0 3548 0 +0 3672 0 +3550 2464 3285 +3550 2464 3285 +3550 2464 3285 +3550 2465 3285 +3550 2465 3285 +3550 2466 3285 +3549 2467 3284 +3549 2469 3284 +3549 2471 3284 +3548 2473 3283 +3548 2477 3282 +3547 2481 3281 +3545 2487 3279 +3544 2495 3277 +3542 2505 3274 +3539 2518 3270 +3535 2535 3264 +3529 2557 3257 +3522 2585 3247 +3512 2620 3233 +3498 2663 3214 +3479 2714 3187 +3453 2775 3148 +3415 2845 3090 +3358 2925 2999 +3269 3014 2838 +3115 3110 2460 +2760 3214 0 +0 3323 0 +0 3438 0 +0 3556 0 +0 3678 0 +3684 2572 3411 +3684 2572 3411 +3684 2573 3411 +3684 2573 3410 +3684 2574 3410 +3684 2574 3410 +3684 2575 3410 +3683 2576 3410 +3683 2578 3409 +3683 2580 3409 +3682 2582 3408 +3682 2586 3407 +3681 2591 3406 +3679 2597 3404 +3678 2605 3402 +3676 2616 3399 +3673 2630 3395 +3669 2647 3389 +3663 2670 3382 +3656 2699 3371 +3646 2736 3357 +3633 2780 3338 +3614 2833 3310 +3587 2895 3270 +3549 2967 3211 +3493 3049 3118 +3405 3139 2952 +3252 3237 2548 +2902 3342 0 +0 3452 0 +0 3567 0 +0 3686 0 +3818 2686 3538 +3818 2686 3538 +3818 2686 3538 +3818 2686 3537 +3817 2687 3537 +3817 2687 3537 +3817 2688 3537 +3817 2689 3537 +3817 2690 3537 +3817 2692 3536 +3816 2694 3536 +3816 2696 3535 +3815 2700 3534 +3814 2705 3533 +3813 2711 3531 +3811 2720 3529 +3809 2731 3526 +3806 2745 3522 +3802 2764 3516 +3797 2788 3508 +3790 2818 3498 +3780 2855 3484 +3766 2900 3464 +3748 2955 3436 +3721 3018 3395 +3683 3092 3335 +3627 3174 3240 +3540 3266 3070 +3387 3365 2644 +3042 3470 0 +0 3582 0 +0 3697 0 +3951 2804 3666 +3951 2804 3666 +3951 2804 3666 +3951 2804 3666 +3951 2804 3666 +3951 2805 3666 +3951 2805 3665 +3950 2806 3665 +3950 2807 3665 +3950 2808 3665 +3950 2810 3664 +3949 2812 3664 +3949 2815 3663 +3948 2818 3662 +3947 2823 3661 +3946 2830 3659 +3944 2839 3657 +3942 2850 3654 +3939 2865 3650 +3935 2884 3644 +3930 2909 3636 +3923 2939 3626 +3913 2977 3611 +3900 3024 3591 +3881 3079 3563 +3855 3144 3522 +3817 3218 3461 +3761 3302 3364 +3674 3394 3191 +3522 3494 2748 +3180 3600 0 +0 3712 0 +4084 2925 3795 +4084 2925 3795 +4084 2925 3795 +4084 2925 3795 +4084 2925 3795 +4084 2926 3795 +4083 2926 3795 +4083 2926 3795 +4083 2927 3794 +4083 2928 3794 +4083 2929 3794 +4083 2931 3794 +4082 2933 3793 +4082 2936 3792 +4081 2940 3791 +4080 2945 3790 +4079 2952 3788 +4077 2961 3786 +4075 2972 3783 +4072 2988 3779 +4068 3007 3773 +4063 3032 3765 +4056 3063 3755 +4046 3102 3740 +4033 3149 3720 +4014 3205 3691 +3988 3271 3650 +3950 3346 3589 +3894 3430 3491 +3807 3523 3314 +3656 3623 2857 +3317 3730 0 +4095 3048 3925 +4095 3048 3925 +4095 3048 3925 +4095 3049 3925 +4095 3049 3925 +4095 3049 3925 +4095 3049 3925 +4095 3050 3925 +4095 3050 3924 +4095 3051 3924 +4095 3052 3924 +4095 3053 3924 +4095 3055 3923 +4095 3057 3923 +4095 3060 3922 +4095 3064 3921 +4095 3069 3920 +4095 3076 3918 +4095 3085 3916 +4095 3097 3913 +4095 3112 3908 +4095 3132 3903 +4095 3157 3895 +4095 3189 3884 +4095 3228 3870 +4095 3276 3849 +4095 3333 3821 +4095 3399 3779 +4083 3475 3717 +4027 3560 3619 +3940 3653 3440 +3790 3754 2972 +4095 3174 4055 +4095 3174 4055 +4095 3174 4055 +4095 3174 4055 +4095 3174 4055 +4095 3174 4055 +4095 3175 4055 +4095 3175 4055 +4095 3175 4055 +4095 3176 4055 +4095 3177 4055 +4095 3178 4055 +4095 3179 4054 +4095 3181 4054 +4095 3183 4053 +4095 3186 4053 +4095 3190 4052 +4095 3195 4050 +4095 3202 4049 +4095 3211 4046 +4095 3223 4043 +4095 3239 4039 +4095 3259 4033 +4095 3285 4025 +4095 3317 4015 +4095 3356 4000 +4095 3404 3979 +4095 3461 3951 +4095 3528 3909 +4095 3604 3847 +4095 3690 3747 +4073 3783 3567 +0 1867 2134 +0 1868 2133 +0 1869 2132 +0 1871 2130 +0 1873 2128 +0 1876 2126 +0 1880 2122 +0 1885 2117 +0 1892 2110 +0 1901 2101 +0 1913 2088 +0 1928 2071 +0 1948 2047 +0 1973 2012 +0 2004 1961 +0 2043 1882 +0 2090 1749 +0 2146 1473 +0 2212 0 +0 2288 0 +0 2372 0 +0 2465 0 +0 2566 0 +0 2673 0 +0 2785 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3654 0 +0 1867 2135 +0 1868 2134 +0 1869 2133 +0 1871 2132 +0 1873 2130 +0 1876 2127 +0 1880 2123 +0 1885 2118 +0 1892 2112 +0 1901 2102 +0 1913 2090 +0 1928 2072 +0 1948 2048 +0 1973 2013 +0 2004 1962 +0 2043 1884 +0 2090 1752 +0 2147 1479 +0 2213 0 +0 2288 0 +0 2372 0 +0 2465 0 +0 2566 0 +0 2673 0 +0 2785 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3654 0 +0 1868 2137 +0 1869 2136 +0 1870 2135 +0 1872 2133 +0 1874 2131 +0 1877 2129 +0 1881 2125 +0 1886 2120 +0 1893 2113 +0 1902 2104 +0 1913 2092 +0 1929 2074 +0 1948 2050 +0 1973 2016 +0 2004 1965 +0 2043 1887 +0 2091 1756 +0 2147 1486 +0 2213 0 +0 2288 0 +0 2373 0 +0 2466 0 +0 2566 0 +0 2673 0 +0 2785 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3655 0 +0 1868 2139 +0 1869 2138 +0 1870 2137 +0 1872 2136 +0 1874 2134 +0 1877 2131 +0 1881 2127 +0 1886 2122 +0 1893 2116 +0 1902 2107 +0 1914 2094 +0 1929 2077 +0 1949 2053 +0 1974 2019 +0 2005 1968 +0 2044 1891 +0 2091 1761 +0 2147 1495 +0 2213 0 +0 2288 0 +0 2373 0 +0 2466 0 +0 2566 0 +0 2673 0 +0 2785 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3655 0 +0 1869 2142 +0 1870 2141 +0 1871 2140 +0 1873 2139 +0 1875 2137 +0 1878 2134 +0 1882 2130 +0 1887 2125 +0 1894 2119 +0 1903 2110 +0 1915 2097 +0 1930 2080 +0 1949 2056 +0 1974 2022 +0 2005 1973 +0 2044 1896 +0 2091 1768 +0 2148 1508 +0 2213 0 +0 2289 0 +0 2373 0 +0 2466 0 +0 2566 0 +0 2673 0 +0 2785 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3655 0 +0 1870 2146 +0 1871 2145 +0 1872 2144 +0 1874 2143 +0 1876 2141 +0 1879 2138 +0 1883 2134 +0 1888 2130 +0 1895 2123 +0 1904 2114 +0 1915 2102 +0 1931 2085 +0 1950 2061 +0 1975 2028 +0 2006 1978 +0 2045 1903 +0 2092 1777 +0 2148 1523 +0 2214 0 +0 2289 0 +0 2373 0 +0 2466 0 +0 2567 0 +0 2673 0 +0 2786 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3270 0 +0 3397 0 +0 3525 0 +0 3655 0 +0 1871 2151 +0 1872 2151 +0 1874 2149 +0 1875 2148 +0 1877 2146 +0 1880 2143 +0 1884 2140 +0 1889 2135 +0 1896 2129 +0 1905 2120 +0 1917 2108 +0 1932 2091 +0 1951 2068 +0 1976 2034 +0 2007 1986 +0 2046 1912 +0 2093 1788 +0 2149 1544 +0 2214 145 +0 2290 0 +0 2374 0 +0 2467 0 +0 2567 0 +0 2674 0 +0 2786 0 +0 2902 0 +0 3022 0 +0 3145 0 +0 3271 0 +0 3397 0 +0 3525 0 +0 3655 0 +0 1873 2158 +0 1874 2157 +0 1875 2156 +0 1877 2155 +0 1879 2153 +0 1882 2150 +0 1886 2147 +0 1891 2142 +0 1898 2136 +0 1907 2127 +0 1918 2115 +0 1933 2099 +0 1953 2076 +0 1977 2043 +0 2009 1996 +0 2047 1923 +0 2094 1804 +0 2150 1570 +0 2215 518 +0 2290 0 +0 2374 0 +0 2467 0 +0 2567 0 +0 2674 0 +0 2786 0 +0 2902 0 +0 3023 0 +0 3146 0 +0 3271 0 +0 3397 0 +0 3526 0 +0 3655 0 +0 1876 2167 +0 1876 2167 +0 1878 2166 +0 1879 2164 +0 1882 2162 +0 1884 2160 +0 1888 2156 +0 1893 2152 +0 1900 2145 +0 1909 2137 +0 1920 2125 +0 1935 2109 +0 1955 2087 +0 1979 2055 +0 2010 2009 +0 2049 1938 +0 2095 1823 +0 2151 1602 +0 2216 772 +0 2291 0 +0 2375 0 +0 2468 0 +0 2568 0 +0 2674 0 +0 2786 0 +0 2903 0 +0 3023 0 +0 3146 0 +0 3271 0 +0 3398 0 +0 3526 0 +0 3655 0 +0 1879 2179 +0 1880 2179 +0 1881 2178 +0 1883 2176 +0 1885 2174 +0 1888 2172 +0 1891 2168 +0 1896 2164 +0 1903 2158 +0 1912 2150 +0 1923 2138 +0 1938 2123 +0 1957 2101 +0 1982 2070 +0 2013 2026 +0 2051 1958 +0 2097 1848 +0 2153 1642 +0 2218 978 +0 2293 0 +0 2376 0 +0 2469 0 +0 2568 0 +0 2675 0 +0 2787 0 +0 2903 0 +0 3023 0 +0 3146 0 +0 3271 0 +0 3398 0 +0 3526 0 +0 3655 0 +0 1883 2195 +0 1884 2194 +0 1885 2193 +0 1887 2192 +0 1889 2190 +0 1892 2188 +0 1895 2184 +0 1900 2180 +0 1907 2174 +0 1916 2166 +0 1927 2155 +0 1942 2140 +0 1961 2119 +0 1985 2090 +0 2016 2047 +0 2054 1983 +0 2100 1880 +0 2155 1691 +0 2220 1158 +0 2294 0 +0 2378 0 +0 2470 0 +0 2569 0 +0 2676 0 +0 2787 0 +0 2904 0 +0 3023 0 +0 3146 0 +0 3271 0 +0 3398 0 +0 3526 0 +0 3655 0 +0 1889 2215 +0 1889 2214 +0 1891 2213 +0 1892 2212 +0 1894 2210 +0 1897 2208 +0 1901 2205 +0 1906 2200 +0 1912 2195 +0 1921 2187 +0 1932 2177 +0 1947 2163 +0 1966 2143 +0 1990 2115 +0 2020 2074 +0 2058 2014 +0 2103 1919 +0 2158 1748 +0 2223 1323 +0 2296 0 +0 2380 0 +0 2471 0 +0 2571 0 +0 2677 0 +0 2788 0 +0 2904 0 +0 3024 0 +0 3146 0 +0 3271 0 +0 3398 0 +0 3526 0 +0 3655 0 +241 1896 2240 +162 1897 2239 +31 1898 2238 +0 1900 2237 +0 1902 2236 +0 1904 2233 +0 1908 2230 +0 1913 2227 +0 1919 2221 +0 1928 2214 +0 1939 2204 +0 1953 2191 +0 1972 2172 +0 1996 2146 +0 2026 2108 +0 2063 2053 +0 2108 1966 +0 2162 1816 +0 2226 1478 +0 2299 0 +0 2382 0 +0 2473 0 +0 2572 0 +0 2678 0 +0 2789 0 +0 2905 0 +0 3024 0 +0 3147 0 +0 3272 0 +0 3398 0 +0 3526 0 +0 3655 0 +1385 1906 2272 +1379 1906 2271 +1371 1908 2270 +1360 1909 2269 +1345 1911 2268 +1325 1914 2266 +1296 1917 2263 +1253 1922 2259 +1190 1929 2254 +1089 1937 2248 +903 1948 2239 +397 1962 2226 +0 1980 2209 +0 2003 2185 +0 2033 2150 +0 2069 2100 +0 2114 2023 +0 2168 1893 +0 2231 1627 +0 2303 0 +0 2385 0 +0 2476 0 +0 2574 0 +0 2680 0 +0 2790 0 +0 2906 0 +0 3025 0 +0 3148 0 +0 3272 0 +0 3399 0 +0 3526 0 +0 3655 0 +1749 1918 2311 +1747 1919 2310 +1743 1920 2310 +1738 1922 2309 +1732 1924 2307 +1723 1926 2305 +1711 1930 2303 +1695 1934 2300 +1672 1941 2295 +1639 1949 2289 +1592 1959 2281 +1519 1973 2269 +1399 1991 2254 +1164 2014 2232 +83 2042 2201 +0 2078 2156 +0 2122 2088 +0 2175 1978 +0 2237 1771 +0 2309 1096 +0 2390 0 +0 2480 0 +0 2577 0 +0 2682 0 +0 2792 0 +0 2907 0 +0 3026 0 +0 3148 0 +0 3273 0 +0 3399 0 +0 3527 0 +0 3656 0 +2000 1935 2359 +1999 1935 2358 +1997 1936 2358 +1994 1938 2357 +1990 1940 2355 +1985 1942 2354 +1979 1946 2351 +1970 1950 2348 +1957 1956 2344 +1940 1964 2339 +1916 1974 2331 +1882 1988 2321 +1832 2005 2307 +1755 2027 2288 +1626 2055 2261 +1364 2090 2222 +0 2133 2164 +0 2184 2073 +0 2245 1912 +0 2316 1531 +0 2396 0 +0 2484 0 +0 2581 0 +0 2685 0 +0 2795 0 +0 2909 0 +0 3028 0 +0 3149 0 +0 3274 0 +0 3400 0 +0 3527 0 +0 3656 0 +2205 1955 2416 +2204 1956 2415 +2202 1957 2415 +2201 1959 2414 +2198 1960 2413 +2195 1963 2411 +2191 1966 2409 +2185 1970 2407 +2178 1976 2403 +2167 1984 2398 +2153 1993 2392 +2133 2006 2383 +2105 2023 2371 +2064 2044 2354 +2003 2071 2331 +1907 2105 2297 +1734 2146 2249 +1297 2196 2174 +0 2256 2050 +0 2325 1804 +0 2403 318 +0 2491 0 +0 2586 0 +0 2689 0 +0 2798 0 +0 2912 0 +0 3030 0 +0 3151 0 +0 3275 0 +0 3401 0 +0 3528 0 +0 3656 0 +2384 1982 2482 +2383 1983 2482 +2382 1984 2481 +2381 1985 2480 +2380 1987 2479 +2378 1989 2478 +2375 1992 2476 +2371 1996 2474 +2366 2002 2471 +2359 2009 2467 +2350 2018 2461 +2337 2030 2454 +2319 2046 2443 +2294 2066 2429 +2259 2092 2410 +2206 2124 2382 +2125 2164 2342 +1987 2212 2282 +1696 2270 2187 +0 2337 2019 +0 2414 1603 +0 2499 0 +0 2593 0 +0 2694 0 +0 2802 0 +0 2915 0 +0 3032 0 +0 3153 0 +0 3276 0 +0 3402 0 +0 3529 0 +0 3657 0 +2549 2015 2558 +2548 2016 2558 +2547 2017 2557 +2547 2018 2557 +2546 2020 2556 +2544 2022 2555 +2542 2025 2553 +2540 2029 2551 +2536 2034 2549 +2531 2040 2545 +2525 2049 2541 +2516 2060 2534 +2504 2075 2526 +2488 2094 2514 +2465 2118 2497 +2432 2149 2475 +2385 2187 2442 +2312 2233 2395 +2192 2288 2323 +1958 2352 2204 +895 2427 1973 +0 2510 982 +0 2602 0 +0 2702 0 +0 2808 0 +0 2919 0 +0 3036 0 +0 3156 0 +0 3278 0 +0 3403 0 +0 3530 0 +0 3658 0 +2703 2056 2643 +2703 2057 2643 +2703 2058 2642 +2702 2059 2642 +2701 2060 2641 +2700 2062 2640 +2699 2065 2639 +2697 2068 2637 +2695 2073 2635 +2691 2079 2632 +2687 2087 2629 +2681 2097 2623 +2673 2111 2616 +2661 2129 2607 +2646 2151 2593 +2624 2180 2575 +2593 2215 2549 +2549 2259 2512 +2482 2311 2458 +2373 2373 2373 +2168 2444 2226 +1516 2524 1903 +0 2614 0 +0 2711 0 +0 2815 0 +0 2925 0 +0 3040 0 +0 3159 0 +0 3281 0 +0 3405 0 +0 3531 0 +0 3659 0 +2852 2106 2736 +2852 2107 2736 +2851 2107 2736 +2851 2108 2735 +2850 2110 2735 +2850 2111 2734 +2849 2114 2733 +2847 2117 2732 +2846 2121 2730 +2843 2126 2728 +2840 2134 2725 +2836 2143 2720 +2830 2155 2715 +2822 2171 2707 +2811 2192 2696 +2796 2218 2682 +2775 2251 2662 +2746 2291 2633 +2703 2340 2592 +2640 2398 2530 +2537 2466 2431 +2350 2543 2254 +1830 2629 1790 +0 2723 0 +0 2825 0 +0 2933 0 +0 3046 0 +0 3164 0 +0 3284 0 +0 3408 0 +0 3533 0 +0 3661 0 +2996 2165 2837 +2996 2165 2837 +2995 2166 2837 +2995 2167 2836 +2995 2168 2836 +2994 2170 2835 +2994 2172 2835 +2993 2174 2834 +2991 2178 2832 +2990 2183 2830 +2987 2189 2828 +2984 2198 2825 +2980 2209 2820 +2974 2223 2814 +2966 2241 2805 +2956 2265 2794 +2941 2294 2778 +2921 2331 2756 +2893 2376 2725 +2852 2430 2680 +2790 2493 2611 +2693 2566 2500 +2517 2648 2288 +2062 2739 1573 +0 2838 0 +0 2943 0 +0 3054 0 +0 3170 0 +0 3289 0 +0 3412 0 +0 3536 0 +0 3663 0 +3137 2233 2944 +3136 2234 2944 +3136 2234 2944 +3136 2235 2944 +3136 2236 2944 +3135 2238 2943 +3135 2239 2942 +3134 2242 2942 +3133 2245 2941 +3132 2249 2939 +3130 2254 2937 +3128 2262 2934 +3125 2271 2931 +3121 2284 2926 +3115 2300 2920 +3108 2320 2911 +3097 2347 2899 +3083 2380 2882 +3063 2420 2858 +3036 2469 2825 +2996 2528 2776 +2936 2596 2702 +2841 2673 2578 +2673 2760 2331 +2257 2854 796 +0 2956 0 +0 3064 0 +0 3178 0 +0 3295 0 +0 3416 0 +0 3540 0 +0 3665 0 +3275 2311 3057 +3275 2312 3057 +3275 2312 3057 +3275 2313 3057 +3275 2314 3056 +3274 2315 3056 +3274 2316 3055 +3273 2318 3055 +3273 2321 3054 +3272 2324 3053 +3270 2329 3051 +3269 2335 3049 +3267 2343 3046 +3263 2354 3043 +3259 2368 3038 +3254 2386 3031 +3246 2409 3022 +3236 2437 3009 +3222 2473 2991 +3203 2517 2967 +3175 2570 2931 +3136 2633 2880 +3078 2704 2800 +2985 2786 2665 +2822 2875 2382 +2431 2973 0 +0 3078 0 +0 3188 0 +0 3303 0 +0 3422 0 +0 3545 0 +0 3669 0 +3412 2398 3174 +3412 2399 3174 +3412 2399 3174 +3412 2400 3174 +3411 2400 3173 +3411 2401 3173 +3411 2402 3173 +3411 2404 3172 +3410 2406 3172 +3409 2409 3171 +3408 2413 3170 +3407 2418 3168 +3406 2425 3166 +3403 2434 3163 +3400 2445 3159 +3396 2461 3154 +3391 2480 3147 +3383 2505 3137 +3373 2536 3124 +3360 2574 3106 +3340 2621 3080 +3313 2677 3043 +3275 2743 2989 +3217 2818 2905 +3126 2902 2760 +2967 2995 2442 +2592 3095 0 +0 3202 0 +0 3314 0 +0 3431 0 +0 3551 0 +0 3674 0 +3547 2493 3294 +3547 2494 3294 +3547 2494 3294 +3547 2494 3294 +3547 2495 3294 +3547 2496 3294 +3547 2497 3293 +3547 2498 3293 +3546 2500 3293 +3546 2502 3292 +3545 2505 3291 +3544 2510 3290 +3543 2515 3288 +3541 2522 3286 +3539 2532 3283 +3536 2545 3279 +3532 2561 3274 +3527 2582 3266 +3519 2608 3257 +3509 2641 3243 +3496 2682 3224 +3476 2731 3198 +3450 2790 3160 +3411 2858 3103 +3354 2936 3015 +3265 3023 2862 +3108 3118 2512 +2745 3220 0 +0 3328 0 +0 3442 0 +0 3559 0 +0 3680 0 +3682 2596 3418 +3682 2596 3417 +3682 2596 3417 +3682 2597 3417 +3682 2597 3417 +3682 2598 3417 +3682 2598 3417 +3681 2599 3417 +3681 2601 3416 +3681 2603 3416 +3680 2605 3415 +3680 2609 3414 +3679 2613 3413 +3677 2619 3411 +3676 2627 3409 +3674 2637 3406 +3671 2650 3402 +3667 2667 3396 +3661 2689 3389 +3654 2717 3379 +3644 2752 3365 +3630 2795 3346 +3612 2846 3319 +3585 2907 3280 +3547 2977 3222 +3490 3057 3131 +3401 3146 2970 +3247 3242 2592 +2892 3346 0 +0 3456 0 +0 3570 0 +0 3689 0 +3816 2704 3543 +3816 2704 3543 +3816 2705 3543 +3816 2705 3543 +3816 2705 3543 +3816 2706 3542 +3816 2706 3542 +3816 2707 3542 +3815 2708 3542 +3815 2710 3541 +3815 2712 3541 +3814 2714 3540 +3814 2718 3539 +3813 2723 3538 +3811 2729 3536 +3810 2737 3534 +3808 2748 3531 +3805 2762 3527 +3801 2780 3521 +3795 2803 3514 +3788 2832 3504 +3778 2868 3489 +3765 2912 3470 +3746 2965 3442 +3719 3027 3403 +3681 3099 3343 +3625 3181 3250 +3537 3271 3084 +3384 3369 2680 +3034 3474 0 +0 3584 0 +0 3699 0 +3950 2818 3670 +3950 2818 3670 +3950 2818 3670 +3950 2818 3670 +3950 2819 3670 +3950 2819 3669 +3949 2819 3669 +3949 2820 3669 +3949 2821 3669 +3949 2822 3669 +3949 2824 3668 +3948 2826 3668 +3948 2829 3667 +3947 2832 3666 +3946 2837 3665 +3945 2844 3663 +3943 2852 3661 +3941 2863 3658 +3938 2878 3654 +3934 2896 3648 +3929 2920 3640 +3922 2950 3630 +3912 2987 3616 +3898 3032 3596 +3880 3087 3568 +3853 3151 3528 +3815 3224 3467 +3759 3307 3372 +3672 3398 3202 +3520 3497 2776 +3174 3602 0 +0 3714 0 +4083 2936 3798 +4083 2936 3798 +4083 2936 3798 +4083 2936 3798 +4083 2936 3798 +4083 2936 3798 +4083 2937 3798 +4083 2937 3798 +4082 2938 3797 +4082 2939 3797 +4082 2940 3797 +4082 2942 3796 +4081 2944 3796 +4081 2947 3795 +4080 2951 3794 +4079 2956 3793 +4078 2962 3791 +4077 2971 3789 +4074 2982 3786 +4071 2997 3782 +4068 3016 3776 +4062 3041 3768 +4055 3071 3758 +4045 3109 3743 +4032 3156 3723 +4013 3211 3695 +3987 3276 3654 +3949 3350 3593 +3893 3434 3496 +3806 3526 3323 +3654 3626 2880 +3312 3732 0 +4095 3057 3927 +4095 3057 3927 +4095 3057 3927 +4095 3057 3927 +4095 3057 3927 +4095 3057 3927 +4095 3058 3927 +4095 3058 3927 +4095 3059 3927 +4095 3059 3927 +4095 3060 3926 +4095 3061 3926 +4095 3063 3926 +4095 3065 3925 +4095 3068 3924 +4095 3072 3923 +4095 3077 3922 +4095 3084 3920 +4095 3093 3918 +4095 3105 3915 +4095 3120 3911 +4095 3139 3905 +4095 3164 3897 +4095 3195 3887 +4095 3234 3872 +4095 3281 3852 +4095 3337 3823 +4095 3403 3782 +4082 3478 3721 +4026 3562 3623 +3939 3655 3446 +3788 3755 2989 +4095 3180 4057 +4095 3180 4057 +4095 3180 4057 +4095 3181 4057 +4095 3181 4057 +4095 3181 4057 +4095 3181 4057 +4095 3181 4057 +4095 3182 4057 +4095 3182 4057 +4095 3183 4056 +4095 3184 4056 +4095 3185 4056 +4095 3187 4055 +4095 3189 4055 +4095 3192 4054 +4095 3196 4053 +4095 3201 4052 +4095 3208 4050 +4095 3217 4048 +4095 3229 4045 +4095 3245 4040 +4095 3264 4035 +4095 3290 4027 +4095 3321 4016 +4095 3360 4002 +4095 3408 3981 +4095 3465 3953 +4095 3531 3911 +4095 3607 3849 +4095 3692 3751 +4073 3785 3572 +0 1998 2266 +0 1999 2265 +0 2000 2264 +0 2001 2263 +0 2003 2262 +0 2005 2260 +0 2008 2257 +0 2012 2253 +0 2017 2248 +0 2024 2241 +0 2033 2232 +0 2045 2219 +0 2060 2202 +0 2079 2177 +0 2104 2143 +0 2136 2091 +0 2175 2012 +0 2222 1879 +0 2278 1601 +0 2344 0 +0 2420 0 +0 2504 0 +0 2597 0 +0 2698 0 +0 2805 0 +0 2917 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +0 1998 2267 +0 1999 2266 +0 2000 2265 +0 2001 2264 +0 2003 2263 +0 2005 2260 +0 2008 2258 +0 2012 2254 +0 2017 2249 +0 2024 2242 +0 2033 2233 +0 2045 2220 +0 2060 2203 +0 2080 2179 +0 2105 2144 +0 2136 2093 +0 2175 2014 +0 2222 1881 +0 2279 1606 +0 2344 0 +0 2420 0 +0 2504 0 +0 2597 0 +0 2698 0 +0 2805 0 +0 2917 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +0 1999 2268 +0 1999 2267 +0 2000 2266 +0 2002 2265 +0 2003 2264 +0 2005 2262 +0 2008 2259 +0 2012 2255 +0 2017 2250 +0 2024 2244 +0 2033 2234 +0 2045 2222 +0 2060 2204 +0 2080 2180 +0 2105 2145 +0 2136 2095 +0 2175 2016 +0 2222 1884 +0 2279 1611 +0 2345 0 +0 2420 0 +0 2505 0 +0 2598 0 +0 2698 0 +0 2805 0 +0 2917 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +0 1999 2270 +0 2000 2269 +0 2001 2268 +0 2002 2267 +0 2004 2265 +0 2006 2263 +0 2009 2261 +0 2013 2257 +0 2018 2252 +0 2025 2245 +0 2034 2236 +0 2045 2224 +0 2061 2206 +0 2080 2182 +0 2105 2148 +0 2137 2097 +0 2175 2019 +0 2223 1888 +0 2279 1618 +0 2345 0 +0 2420 0 +0 2505 0 +0 2598 0 +0 2698 0 +0 2805 0 +0 2917 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +0 2000 2272 +0 2000 2271 +0 2001 2270 +0 2003 2269 +0 2004 2268 +0 2006 2266 +0 2009 2263 +0 2013 2259 +0 2018 2254 +0 2025 2248 +0 2034 2239 +0 2046 2226 +0 2061 2209 +0 2081 2185 +0 2106 2151 +0 2137 2100 +0 2176 2023 +0 2223 1893 +0 2279 1627 +0 2345 0 +0 2420 0 +0 2505 0 +0 2598 0 +0 2698 0 +0 2805 0 +0 2917 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3402 0 +0 3529 0 +0 3657 0 +0 2000 2275 +0 2001 2274 +0 2002 2273 +0 2003 2272 +0 2005 2271 +0 2007 2269 +0 2010 2266 +0 2014 2262 +0 2019 2258 +0 2026 2251 +0 2035 2242 +0 2047 2230 +0 2062 2212 +0 2081 2189 +0 2106 2155 +0 2138 2105 +0 2176 2028 +0 2223 1900 +0 2280 1640 +0 2345 0 +0 2421 0 +0 2505 0 +0 2598 0 +0 2698 0 +0 2805 0 +0 2917 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3403 0 +0 3529 0 +0 3658 0 +0 2001 2279 +0 2002 2278 +0 2003 2277 +0 2004 2276 +0 2006 2275 +0 2008 2273 +0 2011 2270 +0 2015 2267 +0 2020 2262 +0 2027 2255 +0 2036 2246 +0 2048 2234 +0 2063 2217 +0 2082 2193 +0 2107 2160 +0 2138 2110 +0 2177 2035 +0 2224 1909 +0 2280 1655 +0 2346 0 +0 2421 0 +0 2505 0 +0 2598 0 +0 2699 0 +0 2805 0 +0 2918 0 +0 3034 0 +0 3154 0 +0 3277 0 +0 3403 0 +0 3529 0 +0 3658 0 +0 2003 2284 +0 2003 2283 +0 2004 2283 +0 2006 2282 +0 2007 2280 +0 2009 2278 +0 2012 2275 +0 2016 2272 +0 2021 2267 +0 2028 2261 +0 2037 2252 +0 2049 2240 +0 2064 2223 +0 2083 2200 +0 2108 2166 +0 2139 2118 +0 2178 2044 +0 2225 1921 +0 2281 1676 +0 2347 277 +0 2422 0 +0 2506 0 +0 2599 0 +0 2699 0 +0 2806 0 +0 2918 0 +0 3034 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3529 0 +0 3658 0 +0 2005 2291 +0 2005 2290 +0 2006 2290 +0 2007 2288 +0 2009 2287 +0 2011 2285 +0 2014 2283 +0 2018 2279 +0 2023 2274 +0 2030 2268 +0 2039 2259 +0 2050 2247 +0 2065 2231 +0 2085 2208 +0 2110 2175 +0 2141 2128 +0 2179 2055 +0 2226 1936 +0 2282 1702 +0 2347 650 +0 2422 0 +0 2507 0 +0 2599 0 +0 2699 0 +0 2806 0 +0 2918 0 +0 3035 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3530 0 +0 3658 0 +0 2007 2300 +0 2008 2299 +0 2009 2299 +0 2010 2298 +0 2011 2296 +0 2014 2294 +0 2017 2292 +0 2020 2288 +0 2025 2284 +0 2032 2277 +0 2041 2269 +0 2053 2257 +0 2068 2241 +0 2087 2219 +0 2111 2187 +0 2142 2141 +0 2181 2071 +0 2227 1955 +0 2283 1734 +0 2349 904 +0 2423 0 +0 2507 0 +0 2600 0 +0 2700 0 +0 2806 0 +0 2918 0 +0 3035 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3530 0 +0 3658 0 +0 2010 2312 +0 2011 2311 +0 2012 2311 +0 2013 2310 +0 2015 2308 +0 2017 2306 +0 2020 2304 +0 2023 2301 +0 2029 2296 +0 2035 2290 +0 2044 2282 +0 2055 2270 +0 2070 2255 +0 2090 2233 +0 2114 2202 +0 2145 2158 +0 2183 2090 +0 2229 1980 +0 2285 1774 +0 2350 1110 +0 2425 0 +0 2508 0 +0 2601 0 +0 2700 0 +0 2807 0 +0 2919 0 +0 3035 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3530 0 +0 3658 0 +0 2014 2327 +0 2015 2327 +0 2016 2326 +0 2017 2325 +0 2019 2324 +0 2021 2322 +0 2024 2320 +0 2028 2316 +0 2033 2312 +0 2039 2306 +0 2048 2298 +0 2059 2287 +0 2074 2272 +0 2093 2251 +0 2117 2222 +0 2148 2179 +0 2186 2115 +0 2232 2012 +0 2287 1823 +0 2352 1290 +0 2426 0 +0 2510 0 +0 2602 0 +0 2701 0 +0 2808 0 +0 2919 0 +0 3036 0 +0 3155 0 +0 3278 0 +0 3403 0 +0 3530 0 +0 3658 0 +0 2020 2347 +0 2021 2347 +0 2022 2346 +0 2023 2345 +0 2024 2344 +0 2026 2342 +0 2029 2340 +0 2033 2337 +0 2038 2333 +0 2044 2327 +0 2053 2319 +0 2064 2309 +0 2079 2295 +0 2098 2275 +0 2122 2247 +0 2152 2206 +0 2190 2146 +0 2235 2051 +0 2290 1881 +0 2355 1455 +0 2429 0 +0 2512 0 +0 2603 0 +0 2703 0 +0 2809 0 +0 2920 0 +0 3036 0 +0 3156 0 +0 3279 0 +0 3403 0 +0 3530 0 +0 3658 0 +423 2027 2373 +373 2028 2372 +295 2029 2371 +163 2030 2370 +0 2032 2369 +0 2034 2368 +0 2036 2365 +0 2040 2363 +0 2045 2359 +0 2051 2353 +0 2060 2346 +0 2071 2336 +0 2085 2323 +0 2104 2304 +0 2128 2278 +0 2158 2241 +0 2195 2185 +0 2240 2098 +0 2294 1948 +0 2358 1610 +0 2432 0 +0 2514 0 +0 2605 0 +0 2704 0 +0 2810 0 +0 2921 0 +0 3037 0 +0 3157 0 +0 3279 0 +0 3404 0 +0 3530 0 +0 3658 0 +1521 2037 2404 +1517 2038 2404 +1511 2039 2403 +1503 2040 2402 +1492 2041 2401 +1477 2043 2400 +1457 2046 2398 +1428 2050 2395 +1385 2054 2391 +1322 2061 2386 +1221 2069 2380 +1036 2080 2371 +529 2094 2358 +0 2112 2341 +0 2135 2317 +0 2165 2283 +0 2201 2232 +0 2246 2155 +0 2300 2025 +0 2363 1759 +0 2436 0 +0 2518 0 +0 2608 0 +0 2707 0 +0 2812 0 +0 2923 0 +0 3038 0 +0 3157 0 +0 3280 0 +0 3404 0 +0 3531 0 +0 3659 0 +1883 2050 2444 +1881 2050 2443 +1879 2051 2443 +1875 2052 2442 +1870 2054 2441 +1864 2056 2439 +1855 2058 2437 +1843 2062 2435 +1827 2066 2432 +1804 2073 2427 +1771 2081 2421 +1724 2091 2413 +1651 2105 2401 +1531 2123 2386 +1296 2146 2364 +216 2174 2333 +0 2210 2288 +0 2254 2221 +0 2307 2111 +0 2369 1903 +0 2441 1228 +0 2522 0 +0 2612 0 +0 2709 0 +0 2814 0 +0 2924 0 +0 3039 0 +0 3158 0 +0 3280 0 +0 3405 0 +0 3531 0 +0 3659 0 +2133 2066 2491 +2132 2067 2491 +2131 2067 2490 +2129 2068 2490 +2126 2070 2489 +2122 2072 2487 +2118 2074 2486 +2111 2078 2484 +2102 2082 2481 +2089 2088 2476 +2072 2096 2471 +2048 2106 2464 +2014 2120 2453 +1964 2137 2440 +1887 2159 2420 +1758 2187 2393 +1496 2222 2354 +0 2265 2296 +0 2316 2205 +0 2377 2044 +0 2448 1663 +0 2528 0 +0 2617 0 +0 2713 0 +0 2817 0 +0 2927 0 +0 3041 0 +0 3160 0 +0 3282 0 +0 3406 0 +0 3532 0 +0 3659 0 +2337 2087 2548 +2337 2088 2548 +2336 2088 2547 +2334 2089 2547 +2333 2091 2546 +2330 2093 2545 +2327 2095 2543 +2323 2098 2541 +2317 2103 2539 +2310 2108 2535 +2299 2116 2530 +2285 2126 2524 +2265 2138 2515 +2237 2155 2503 +2196 2176 2486 +2135 2203 2463 +2039 2237 2429 +1866 2278 2381 +1429 2329 2306 +0 2388 2182 +0 2457 1936 +0 2536 450 +0 2623 0 +0 2718 0 +0 2821 0 +0 2930 0 +0 3044 0 +0 3162 0 +0 3283 0 +0 3407 0 +0 3533 0 +0 3660 0 +2517 2114 2614 +2516 2114 2614 +2515 2115 2614 +2515 2116 2613 +2513 2117 2612 +2512 2119 2612 +2510 2121 2610 +2507 2124 2609 +2503 2128 2606 +2498 2134 2603 +2491 2141 2599 +2482 2150 2593 +2469 2162 2586 +2451 2178 2576 +2426 2198 2561 +2391 2224 2542 +2338 2256 2514 +2257 2296 2474 +2119 2344 2414 +1828 2402 2319 +0 2469 2151 +0 2546 1735 +0 2631 0 +0 2725 0 +0 2827 0 +0 2934 0 +0 3047 0 +0 3164 0 +0 3285 0 +0 3408 0 +0 3534 0 +0 3661 0 +2681 2147 2690 +2681 2147 2690 +2680 2148 2690 +2680 2149 2689 +2679 2150 2689 +2678 2152 2688 +2676 2154 2687 +2674 2157 2685 +2672 2161 2683 +2668 2166 2681 +2663 2172 2677 +2657 2181 2673 +2648 2192 2666 +2636 2207 2658 +2620 2226 2646 +2597 2250 2629 +2565 2281 2607 +2517 2319 2574 +2444 2365 2527 +2325 2420 2455 +2090 2485 2336 +1027 2559 2105 +0 2642 1114 +0 2734 0 +0 2834 0 +0 2940 0 +0 3052 0 +0 3168 0 +0 3288 0 +0 3410 0 +0 3535 0 +0 3662 0 +2836 2188 2775 +2836 2189 2775 +2835 2189 2775 +2835 2190 2774 +2834 2191 2774 +2833 2193 2773 +2832 2194 2772 +2831 2197 2771 +2829 2201 2770 +2827 2205 2767 +2823 2211 2765 +2819 2219 2761 +2813 2230 2755 +2805 2243 2748 +2793 2261 2739 +2778 2283 2725 +2756 2312 2707 +2726 2347 2681 +2681 2391 2644 +2614 2443 2590 +2505 2505 2505 +2300 2576 2358 +1648 2656 2036 +0 2746 0 +0 2843 0 +0 2947 0 +0 3057 0 +0 3172 0 +0 3291 0 +0 3413 0 +0 3537 0 +0 3664 0 +2984 2238 2869 +2984 2238 2868 +2984 2239 2868 +2983 2239 2868 +2983 2240 2868 +2983 2242 2867 +2982 2244 2866 +2981 2246 2865 +2979 2249 2864 +2978 2253 2862 +2975 2259 2860 +2972 2266 2857 +2968 2275 2853 +2962 2287 2847 +2954 2303 2839 +2943 2324 2828 +2928 2350 2814 +2907 2383 2794 +2878 2423 2765 +2836 2472 2724 +2772 2530 2662 +2669 2598 2563 +2482 2675 2386 +1962 2761 1922 +0 2855 0 +0 2957 0 +0 3065 0 +0 3178 0 +0 3296 0 +0 3417 0 +0 3540 0 +0 3666 0 +3128 2297 2969 +3128 2297 2969 +3128 2298 2969 +3128 2298 2969 +3127 2299 2969 +3127 2300 2968 +3126 2302 2968 +3126 2304 2967 +3125 2307 2966 +3123 2310 2964 +3122 2315 2962 +3119 2321 2960 +3116 2330 2957 +3112 2341 2952 +3106 2355 2946 +3099 2373 2938 +3088 2397 2926 +3073 2426 2910 +3053 2463 2888 +3025 2508 2857 +2984 2562 2812 +2922 2625 2744 +2825 2698 2632 +2649 2780 2420 +2195 2871 1705 +0 2970 0 +0 3075 0 +0 3186 0 +0 3302 0 +0 3421 0 +0 3544 0 +0 3668 0 +3269 2365 3077 +3269 2366 3077 +3269 2366 3076 +3268 2367 3076 +3268 2367 3076 +3268 2368 3076 +3268 2370 3075 +3267 2371 3075 +3266 2374 3074 +3265 2377 3073 +3264 2381 3071 +3262 2387 3069 +3260 2394 3067 +3257 2403 3063 +3253 2416 3058 +3247 2432 3052 +3240 2453 3043 +3229 2479 3031 +3215 2512 3014 +3195 2552 2990 +3168 2601 2957 +3128 2660 2908 +3068 2728 2834 +2973 2805 2710 +2805 2892 2463 +2389 2986 928 +0 3088 0 +0 3197 0 +0 3310 0 +0 3427 0 +0 3548 0 +0 3672 0 +3407 2443 3189 +3407 2444 3189 +3407 2444 3189 +3407 2444 3189 +3407 2445 3189 +3407 2446 3188 +3406 2447 3188 +3406 2448 3188 +3405 2450 3187 +3405 2453 3186 +3404 2457 3185 +3403 2461 3183 +3401 2467 3181 +3399 2475 3179 +3396 2486 3175 +3392 2500 3170 +3386 2518 3163 +3379 2541 3154 +3368 2570 3141 +3354 2605 3123 +3335 2649 3099 +3308 2702 3064 +3268 2765 3012 +3210 2836 2932 +3117 2918 2797 +2954 3008 2514 +2563 3105 0 +0 3210 0 +0 3320 0 +0 3436 0 +0 3555 0 +0 3677 0 +3544 2530 3306 +3544 2530 3306 +3544 2531 3306 +3544 2531 3306 +3544 2532 3306 +3544 2532 3305 +3543 2533 3305 +3543 2534 3305 +3543 2536 3304 +3542 2538 3304 +3541 2541 3303 +3541 2545 3302 +3539 2550 3300 +3538 2557 3298 +3535 2566 3295 +3532 2578 3291 +3528 2593 3286 +3523 2612 3279 +3516 2637 3269 +3505 2668 3256 +3492 2707 3238 +3472 2754 3212 +3445 2810 3175 +3407 2875 3121 +3349 2950 3037 +3258 3034 2892 +3099 3127 2574 +2724 3227 0 +0 3334 0 +0 3446 0 +0 3563 0 +0 3683 0 +3680 2625 3427 +3680 2626 3426 +3680 2626 3426 +3679 2626 3426 +3679 2626 3426 +3679 2627 3426 +3679 2628 3426 +3679 2629 3426 +3679 2630 3425 +3678 2632 3425 +3678 2634 3424 +3677 2637 3423 +3676 2642 3422 +3675 2647 3420 +3673 2655 3418 +3671 2664 3415 +3668 2677 3411 +3664 2693 3406 +3659 2714 3399 +3651 2740 3389 +3641 2773 3375 +3628 2814 3356 +3609 2863 3330 +3582 2922 3292 +3543 2990 3236 +3486 3068 3147 +3397 3155 2994 +3240 3250 2644 +2877 3352 0 +0 3460 0 +0 3574 0 +0 3691 0 +3814 2728 3550 +3814 2728 3550 +3814 2728 3550 +3814 2728 3550 +3814 2729 3549 +3814 2729 3549 +3814 2730 3549 +3814 2730 3549 +3814 2732 3549 +3813 2733 3548 +3813 2735 3548 +3812 2737 3547 +3812 2741 3546 +3811 2745 3545 +3810 2751 3543 +3808 2759 3541 +3806 2769 3538 +3803 2782 3534 +3799 2800 3528 +3793 2822 3521 +3786 2849 3511 +3776 2884 3497 +3763 2927 3478 +3744 2978 3451 +3717 3039 3412 +3679 3109 3354 +3622 3189 3263 +3534 3278 3102 +3379 3374 2724 +3024 3478 0 +0 3588 0 +0 3702 0 +3948 2836 3675 +3948 2836 3675 +3948 2836 3675 +3948 2837 3675 +3948 2837 3675 +3948 2837 3675 +3948 2838 3675 +3948 2838 3674 +3948 2839 3674 +3948 2840 3674 +3947 2842 3673 +3947 2844 3673 +3946 2847 3672 +3946 2850 3671 +3945 2855 3670 +3944 2861 3668 +3942 2869 3666 +3940 2880 3663 +3937 2894 3659 +3933 2912 3653 +3928 2935 3646 +3920 2964 3636 +3910 3000 3622 +3897 3044 3602 +3878 3097 3574 +3852 3160 3535 +3814 3232 3475 +3757 3313 3382 +3669 3403 3216 +3516 3501 2812 +3167 3606 0 +0 3716 0 +4082 2950 3802 +4082 2950 3802 +4082 2950 3802 +4082 2950 3802 +4082 2950 3802 +4082 2951 3802 +4082 2951 3802 +4082 2952 3801 +4081 2952 3801 +4081 2953 3801 +4081 2954 3801 +4081 2956 3800 +4080 2958 3800 +4080 2961 3799 +4079 2964 3798 +4078 2969 3797 +4077 2976 3795 +4075 2984 3793 +4073 2995 3790 +4070 3010 3786 +4066 3028 3780 +4061 3052 3772 +4054 3082 3762 +4044 3119 3748 +4030 3164 3728 +4012 3219 3700 +3985 3283 3660 +3948 3356 3599 +3892 3439 3504 +3804 3530 3334 +3652 3629 2909 +3307 3735 0 +4095 3068 3930 +4095 3068 3930 +4095 3068 3930 +4095 3068 3930 +4095 3068 3930 +4095 3068 3930 +4095 3069 3930 +4095 3069 3930 +4095 3069 3930 +4095 3070 3929 +4095 3071 3929 +4095 3072 3929 +4095 3074 3929 +4095 3076 3928 +4095 3079 3927 +4095 3083 3926 +4095 3088 3925 +4095 3094 3923 +4095 3103 3921 +4095 3114 3918 +4095 3129 3914 +4095 3148 3908 +4095 3173 3900 +4095 3203 3890 +4095 3241 3875 +4095 3288 3855 +4095 3343 3827 +4095 3408 3786 +4081 3482 3725 +4025 3566 3629 +3938 3658 3455 +3786 3758 3012 +4095 3189 4059 +4095 3189 4059 +4095 3189 4059 +4095 3189 4059 +4095 3189 4059 +4095 3189 4059 +4095 3189 4059 +4095 3190 4059 +4095 3190 4059 +4095 3191 4059 +4095 3191 4059 +4095 3192 4058 +4095 3193 4058 +4095 3195 4058 +4095 3197 4057 +4095 3200 4056 +4095 3204 4055 +4095 3209 4054 +4095 3216 4052 +4095 3225 4050 +4095 3237 4047 +4095 3252 4043 +4095 3271 4037 +4095 3296 4029 +4095 3327 4019 +4095 3366 4004 +4095 3413 3984 +4095 3469 3956 +4095 3535 3914 +4095 3610 3853 +4095 3694 3755 +4071 3787 3579 +0 2129 2398 +0 2130 2397 +0 2131 2396 +0 2132 2396 +0 2133 2394 +0 2135 2393 +0 2137 2391 +0 2140 2388 +0 2144 2384 +0 2149 2379 +0 2156 2373 +0 2165 2363 +0 2176 2351 +0 2192 2333 +0 2211 2309 +0 2236 2274 +0 2268 2222 +0 2307 2143 +0 2354 2009 +0 2410 1731 +0 2476 0 +0 2552 0 +0 2636 0 +0 2729 0 +0 2830 0 +0 2937 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2130 2398 +0 2130 2398 +0 2131 2397 +0 2132 2396 +0 2133 2395 +0 2135 2394 +0 2137 2392 +0 2140 2389 +0 2144 2385 +0 2149 2380 +0 2156 2373 +0 2165 2364 +0 2177 2352 +0 2192 2334 +0 2212 2310 +0 2237 2275 +0 2268 2223 +0 2307 2144 +0 2354 2011 +0 2411 1734 +0 2476 0 +0 2552 0 +0 2636 0 +0 2729 0 +0 2830 0 +0 2937 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2130 2399 +0 2130 2399 +0 2131 2398 +0 2132 2397 +0 2133 2396 +0 2135 2395 +0 2137 2393 +0 2140 2390 +0 2144 2386 +0 2149 2381 +0 2156 2374 +0 2165 2365 +0 2177 2353 +0 2192 2335 +0 2212 2311 +0 2237 2276 +0 2268 2225 +0 2307 2146 +0 2354 2013 +0 2411 1738 +0 2477 0 +0 2552 0 +0 2637 0 +0 2730 0 +0 2830 0 +0 2937 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2130 2400 +0 2131 2400 +0 2131 2399 +0 2132 2399 +0 2134 2397 +0 2135 2396 +0 2138 2394 +0 2140 2391 +0 2144 2387 +0 2150 2382 +0 2156 2376 +0 2165 2367 +0 2177 2354 +0 2192 2337 +0 2212 2312 +0 2237 2278 +0 2268 2227 +0 2307 2148 +0 2354 2016 +0 2411 1743 +0 2477 0 +0 2552 0 +0 2637 0 +0 2730 0 +0 2830 0 +0 2937 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2131 2402 +0 2131 2402 +0 2132 2401 +0 2133 2400 +0 2134 2399 +0 2136 2398 +0 2138 2396 +0 2141 2393 +0 2145 2389 +0 2150 2384 +0 2157 2377 +0 2166 2368 +0 2177 2356 +0 2193 2339 +0 2212 2314 +0 2237 2280 +0 2269 2229 +0 2307 2151 +0 2355 2020 +0 2411 1750 +0 2477 0 +0 2552 0 +0 2637 0 +0 2730 0 +0 2830 0 +0 2937 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2131 2404 +0 2132 2404 +0 2132 2403 +0 2133 2402 +0 2135 2401 +0 2136 2400 +0 2139 2398 +0 2141 2395 +0 2145 2391 +0 2151 2387 +0 2157 2380 +0 2166 2371 +0 2178 2358 +0 2193 2341 +0 2213 2317 +0 2238 2283 +0 2269 2232 +0 2308 2155 +0 2355 2025 +0 2411 1760 +0 2477 0 +0 2553 0 +0 2637 0 +0 2730 0 +0 2830 0 +0 2937 0 +0 3049 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2132 2407 +0 2133 2407 +0 2133 2406 +0 2134 2405 +0 2135 2404 +0 2137 2403 +0 2139 2401 +0 2142 2398 +0 2146 2395 +0 2151 2390 +0 2158 2383 +0 2167 2374 +0 2179 2362 +0 2194 2345 +0 2213 2321 +0 2238 2287 +0 2270 2237 +0 2308 2160 +0 2356 2032 +0 2412 1772 +0 2478 0 +0 2553 0 +0 2637 0 +0 2730 0 +0 2830 0 +0 2937 0 +0 3050 0 +0 3166 0 +0 3286 0 +0 3409 0 +0 3535 0 +0 3661 0 +0 2133 2411 +0 2134 2411 +0 2134 2410 +0 2135 2409 +0 2136 2408 +0 2138 2407 +0 2140 2405 +0 2143 2402 +0 2147 2399 +0 2152 2394 +0 2159 2387 +0 2168 2378 +0 2180 2366 +0 2195 2349 +0 2214 2325 +0 2239 2292 +0 2270 2242 +0 2309 2167 +0 2356 2041 +0 2412 1788 +0 2478 0 +0 2553 0 +0 2638 0 +0 2730 0 +0 2831 0 +0 2937 0 +0 3050 0 +0 3166 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +0 2134 2417 +0 2135 2416 +0 2136 2416 +0 2136 2415 +0 2138 2414 +0 2139 2412 +0 2142 2410 +0 2144 2408 +0 2148 2404 +0 2154 2399 +0 2160 2393 +0 2169 2384 +0 2181 2372 +0 2196 2355 +0 2215 2332 +0 2240 2299 +0 2271 2250 +0 2310 2176 +0 2357 2053 +0 2413 1808 +0 2479 410 +0 2554 0 +0 2638 0 +0 2731 0 +0 2831 0 +0 2938 0 +0 3050 0 +0 3166 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +0 2136 2424 +0 2137 2423 +0 2137 2422 +0 2138 2422 +0 2140 2421 +0 2141 2419 +0 2143 2417 +0 2146 2415 +0 2150 2411 +0 2155 2406 +0 2162 2400 +0 2171 2391 +0 2182 2379 +0 2198 2363 +0 2217 2340 +0 2242 2308 +0 2273 2260 +0 2311 2187 +0 2358 2068 +0 2414 1834 +0 2479 782 +0 2554 0 +0 2639 0 +0 2731 0 +0 2831 0 +0 2938 0 +0 3050 0 +0 3167 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +0 2139 2433 +0 2139 2432 +0 2140 2432 +0 2141 2431 +0 2142 2430 +0 2144 2428 +0 2146 2426 +0 2149 2424 +0 2152 2420 +0 2158 2416 +0 2164 2410 +0 2173 2401 +0 2185 2389 +0 2200 2373 +0 2219 2351 +0 2244 2319 +0 2274 2273 +0 2313 2203 +0 2360 2088 +0 2415 1866 +0 2481 1036 +0 2555 0 +0 2639 0 +0 2732 0 +0 2832 0 +0 2938 0 +0 3050 0 +0 3167 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +0 2142 2444 +0 2142 2444 +0 2143 2443 +0 2144 2443 +0 2145 2442 +0 2147 2440 +0 2149 2438 +0 2152 2436 +0 2156 2433 +0 2161 2428 +0 2167 2422 +0 2176 2414 +0 2188 2402 +0 2202 2387 +0 2222 2365 +0 2246 2334 +0 2277 2290 +0 2315 2222 +0 2362 2113 +0 2417 1906 +0 2482 1242 +0 2557 0 +0 2640 0 +0 2733 0 +0 2833 0 +0 2939 0 +0 3051 0 +0 3167 0 +0 3287 0 +0 3410 0 +0 3535 0 +0 3662 0 +0 2146 2460 +0 2146 2460 +0 2147 2459 +0 2148 2458 +0 2149 2457 +0 2151 2456 +0 2153 2454 +0 2156 2452 +0 2160 2448 +0 2165 2444 +0 2171 2438 +0 2180 2430 +0 2191 2419 +0 2206 2404 +0 2225 2383 +0 2249 2354 +0 2280 2311 +0 2318 2247 +0 2364 2144 +0 2419 1955 +0 2484 1422 +0 2558 0 +0 2642 0 +0 2734 0 +0 2834 0 +0 2940 0 +0 3051 0 +0 3168 0 +0 3288 0 +0 3410 0 +0 3535 0 +0 3662 0 +0 2152 2480 +0 2152 2479 +0 2153 2479 +0 2154 2478 +0 2155 2477 +0 2156 2476 +0 2159 2474 +0 2161 2472 +0 2165 2469 +0 2170 2465 +0 2177 2459 +0 2185 2451 +0 2196 2441 +0 2211 2427 +0 2230 2407 +0 2254 2379 +0 2284 2339 +0 2322 2278 +0 2368 2183 +0 2422 2013 +0 2487 1587 +0 2561 0 +0 2644 0 +0 2735 0 +0 2835 0 +0 2941 0 +0 3052 0 +0 3168 0 +0 3288 0 +0 3411 0 +0 3536 0 +0 3662 0 +590 2159 2505 +556 2159 2505 +505 2160 2504 +427 2161 2503 +295 2162 2503 +26 2164 2501 +0 2166 2500 +0 2169 2498 +0 2172 2495 +0 2177 2491 +0 2184 2485 +0 2192 2478 +0 2203 2468 +0 2218 2455 +0 2236 2436 +0 2260 2410 +0 2290 2373 +0 2327 2317 +0 2372 2230 +0 2427 2080 +0 2490 1742 +0 2564 0 +0 2646 0 +0 2737 0 +0 2836 0 +0 2942 0 +0 3053 0 +0 3169 0 +0 3289 0 +0 3411 0 +0 3536 0 +0 3662 0 +1656 2169 2537 +1653 2169 2536 +1649 2170 2536 +1643 2171 2535 +1635 2172 2534 +1624 2173 2533 +1610 2175 2532 +1589 2178 2530 +1560 2182 2527 +1518 2186 2523 +1454 2193 2518 +1353 2201 2512 +1168 2212 2503 +661 2226 2490 +0 2244 2473 +0 2268 2449 +0 2297 2415 +0 2334 2364 +0 2378 2287 +0 2432 2157 +0 2495 1891 +0 2568 0 +0 2650 0 +0 2740 0 +0 2839 0 +0 2944 0 +0 3055 0 +0 3170 0 +0 3289 0 +0 3412 0 +0 3536 0 +0 3663 0 +2017 2181 2576 +2015 2182 2576 +2013 2182 2575 +2011 2183 2575 +2007 2184 2574 +2002 2186 2573 +1996 2188 2571 +1987 2190 2570 +1975 2194 2567 +1959 2199 2564 +1936 2205 2559 +1903 2213 2553 +1856 2223 2545 +1783 2237 2533 +1663 2255 2518 +1428 2278 2496 +348 2307 2465 +0 2342 2420 +0 2386 2353 +0 2439 2243 +0 2501 2035 +0 2573 1360 +0 2654 0 +0 2744 0 +0 2842 0 +0 2946 0 +0 3056 0 +0 3172 0 +0 3291 0 +0 3413 0 +0 3537 0 +0 3663 0 +2266 2198 2624 +2266 2198 2623 +2264 2199 2623 +2263 2200 2622 +2261 2201 2622 +2258 2202 2621 +2255 2204 2620 +2250 2206 2618 +2243 2210 2616 +2234 2214 2613 +2222 2220 2609 +2204 2228 2603 +2180 2238 2596 +2146 2252 2586 +2096 2269 2572 +2019 2291 2552 +1890 2319 2525 +1628 2354 2486 +0 2397 2428 +0 2448 2337 +0 2509 2176 +0 2580 1795 +0 2660 0 +0 2749 0 +0 2845 0 +0 2949 0 +0 3059 0 +0 3173 0 +0 3292 0 +0 3414 0 +0 3538 0 +0 3664 0 +2470 2219 2680 +2469 2219 2680 +2469 2220 2680 +2468 2220 2679 +2466 2221 2679 +2465 2223 2678 +2462 2225 2677 +2459 2227 2675 +2455 2230 2673 +2450 2235 2671 +2442 2240 2667 +2431 2248 2662 +2417 2258 2656 +2397 2270 2647 +2369 2287 2635 +2328 2308 2618 +2267 2335 2595 +2171 2369 2561 +1998 2410 2513 +1561 2461 2438 +0 2520 2315 +0 2589 2068 +0 2668 582 +0 2755 0 +0 2851 0 +0 2953 0 +0 3062 0 +0 3176 0 +0 3294 0 +0 3415 0 +0 3539 0 +0 3665 0 +2649 2245 2747 +2649 2246 2746 +2648 2246 2746 +2648 2247 2746 +2647 2248 2745 +2646 2249 2745 +2644 2251 2744 +2642 2253 2742 +2639 2256 2741 +2635 2260 2738 +2630 2266 2735 +2623 2273 2731 +2614 2282 2726 +2601 2294 2718 +2583 2310 2708 +2558 2330 2693 +2523 2356 2674 +2470 2388 2646 +2389 2428 2606 +2251 2476 2546 +1960 2534 2451 +0 2601 2283 +0 2678 1867 +0 2763 0 +0 2857 0 +0 2959 0 +0 3066 0 +0 3179 0 +0 3296 0 +0 3417 0 +0 3540 0 +0 3666 0 +2813 2279 2823 +2813 2279 2822 +2813 2280 2822 +2812 2280 2822 +2812 2281 2821 +2811 2282 2821 +2810 2284 2820 +2808 2286 2819 +2806 2289 2817 +2804 2293 2816 +2800 2298 2813 +2796 2304 2809 +2789 2313 2805 +2780 2324 2798 +2769 2339 2790 +2752 2358 2778 +2729 2382 2762 +2697 2413 2739 +2649 2451 2706 +2576 2497 2659 +2457 2552 2587 +2222 2617 2468 +1159 2691 2237 +0 2774 1246 +0 2866 0 +0 2966 0 +0 3072 0 +0 3184 0 +0 3300 0 +0 3420 0 +0 3542 0 +0 3667 0 +2968 2320 2907 +2968 2320 2907 +2968 2321 2907 +2967 2321 2907 +2967 2322 2906 +2966 2323 2906 +2966 2325 2905 +2965 2327 2904 +2963 2329 2903 +2961 2333 2902 +2959 2337 2900 +2956 2343 2897 +2951 2351 2893 +2945 2362 2888 +2937 2375 2880 +2925 2393 2871 +2910 2415 2857 +2888 2444 2839 +2858 2479 2813 +2813 2523 2776 +2746 2575 2722 +2637 2637 2637 +2432 2708 2490 +1780 2789 2168 +0 2878 0 +0 2975 0 +0 3079 0 +0 3190 0 +0 3304 0 +0 3423 0 +0 3545 0 +0 3669 0 +3116 2370 3001 +3116 2370 3001 +3116 2370 3001 +3116 2371 3000 +3116 2372 3000 +3115 2373 3000 +3115 2374 2999 +3114 2376 2998 +3113 2378 2997 +3112 2381 2996 +3110 2385 2994 +3107 2391 2992 +3104 2398 2989 +3100 2407 2985 +3094 2420 2979 +3086 2436 2971 +3075 2456 2961 +3060 2482 2946 +3039 2515 2926 +3010 2555 2897 +2968 2604 2856 +2904 2662 2794 +2802 2730 2696 +2614 2807 2518 +2094 2893 2054 +0 2987 0 +0 3089 0 +0 3197 0 +0 3310 0 +0 3428 0 +0 3549 0 +0 3672 0 +3260 2429 3102 +3260 2429 3102 +3260 2429 3101 +3260 2430 3101 +3260 2430 3101 +3259 2431 3101 +3259 2432 3100 +3258 2434 3100 +3258 2436 3099 +3257 2439 3098 +3255 2442 3096 +3254 2447 3095 +3251 2453 3092 +3248 2462 3089 +3244 2473 3084 +3238 2487 3078 +3231 2505 3070 +3220 2529 3058 +3206 2558 3042 +3185 2595 3021 +3157 2640 2989 +3116 2694 2944 +3054 2757 2876 +2957 2830 2764 +2781 2913 2552 +2327 3003 1837 +0 3102 0 +0 3207 0 +0 3318 0 +0 3434 0 +0 3553 0 +0 3676 0 +3401 2497 3209 +3401 2497 3209 +3401 2498 3209 +3401 2498 3208 +3401 2499 3208 +3400 2499 3208 +3400 2500 3208 +3400 2502 3207 +3399 2503 3207 +3398 2506 3206 +3397 2509 3205 +3396 2513 3203 +3394 2519 3201 +3392 2526 3199 +3389 2535 3195 +3385 2548 3190 +3379 2564 3184 +3372 2585 3175 +3361 2611 3163 +3347 2644 3146 +3328 2684 3123 +3300 2734 3089 +3260 2792 3040 +3200 2860 2966 +3105 2937 2842 +2937 3024 2595 +2521 3118 1060 +0 3220 0 +0 3329 0 +0 3442 0 +0 3560 0 +0 3680 0 +3539 2575 3321 +3539 2575 3321 +3539 2576 3321 +3539 2576 3321 +3539 2576 3321 +3539 2577 3321 +3539 2578 3320 +3538 2579 3320 +3538 2581 3320 +3537 2582 3319 +3537 2585 3318 +3536 2589 3317 +3535 2593 3315 +3533 2599 3313 +3531 2608 3311 +3528 2618 3307 +3524 2632 3302 +3518 2650 3295 +3511 2673 3286 +3500 2702 3273 +3486 2738 3255 +3467 2782 3231 +3440 2834 3196 +3400 2897 3144 +3342 2969 3064 +3249 3050 2929 +3086 3140 2646 +2695 3237 0 +0 3342 0 +0 3452 0 +0 3568 0 +0 3687 0 +3676 2662 3438 +3676 2662 3438 +3676 2663 3438 +3676 2663 3438 +3676 2663 3438 +3676 2664 3438 +3676 2664 3438 +3675 2665 3437 +3675 2667 3437 +3675 2668 3436 +3674 2670 3436 +3674 2673 3435 +3673 2677 3434 +3671 2682 3432 +3670 2689 3430 +3668 2698 3427 +3665 2710 3423 +3661 2725 3418 +3655 2744 3411 +3648 2769 3401 +3638 2800 3388 +3624 2839 3370 +3605 2886 3344 +3578 2942 3308 +3539 3007 3253 +3481 3082 3169 +3390 3167 3024 +3231 3259 2706 +2856 3359 0 +0 3466 0 +0 3578 0 +0 3695 0 +3812 2757 3559 +3812 2757 3559 +3812 2758 3559 +3812 2758 3558 +3812 2758 3558 +3811 2759 3558 +3811 2759 3558 +3811 2760 3558 +3811 2761 3558 +3811 2762 3557 +3810 2764 3557 +3810 2766 3556 +3809 2770 3555 +3808 2774 3554 +3807 2779 3552 +3805 2787 3550 +3803 2796 3547 +3800 2809 3543 +3796 2825 3538 +3791 2846 3531 +3783 2872 3521 +3773 2905 3507 +3760 2946 3488 +3741 2996 3462 +3714 3054 3424 +3675 3122 3368 +3618 3200 3279 +3529 3287 3126 +3372 3382 2777 +3009 3484 0 +0 3592 0 +0 3706 0 +3946 2860 3682 +3946 2860 3682 +3946 2860 3682 +3946 2860 3682 +3946 2860 3682 +3946 2861 3682 +3946 2861 3681 +3946 2862 3681 +3946 2863 3681 +3946 2864 3681 +3945 2865 3680 +3945 2867 3680 +3944 2869 3679 +3944 2873 3678 +3943 2877 3677 +3942 2883 3675 +3940 2891 3673 +3938 2901 3670 +3935 2914 3666 +3931 2932 3661 +3926 2954 3653 +3918 2981 3643 +3908 3016 3629 +3895 3059 3610 +3876 3110 3583 +3849 3171 3544 +3811 3242 3486 +3754 3321 3395 +3666 3410 3235 +3511 3507 2856 +3156 3610 0 +0 3720 0 +4080 2968 3807 +4080 2968 3807 +4080 2968 3807 +4080 2969 3807 +4080 2969 3807 +4080 2969 3807 +4080 2969 3807 +4080 2970 3807 +4080 2970 3806 +4080 2971 3806 +4080 2972 3806 +4079 2974 3806 +4079 2976 3805 +4078 2979 3804 +4078 2982 3803 +4077 2987 3802 +4076 2993 3800 +4074 3001 3798 +4072 3012 3795 +4069 3026 3791 +4065 3044 3786 +4060 3067 3778 +4052 3096 3768 +4042 3132 3754 +4029 3176 3734 +4010 3229 3706 +3984 3292 3667 +3946 3364 3608 +3889 3445 3514 +3801 3535 3348 +3648 3633 2944 +3299 3738 0 +4095 3082 3934 +4095 3082 3934 +4095 3082 3934 +4095 3082 3934 +4095 3082 3934 +4095 3082 3934 +4095 3083 3934 +4095 3083 3934 +4095 3084 3934 +4095 3084 3933 +4095 3085 3933 +4095 3086 3933 +4095 3088 3932 +4095 3090 3932 +4095 3093 3931 +4095 3096 3930 +4095 3101 3929 +4095 3108 3927 +4095 3116 3925 +4095 3127 3922 +4095 3142 3918 +4095 3160 3912 +4095 3184 3905 +4095 3214 3894 +4095 3251 3880 +4095 3297 3860 +4095 3351 3832 +4095 3415 3792 +4080 3488 3732 +4024 3571 3636 +3936 3662 3466 +3784 3761 3041 +4095 3200 4062 +4095 3200 4062 +4095 3200 4062 +4095 3200 4062 +4095 3200 4062 +4095 3200 4062 +4095 3200 4062 +4095 3201 4062 +4095 3201 4062 +4095 3202 4062 +4095 3202 4062 +4095 3203 4061 +4095 3204 4061 +4095 3206 4061 +4095 3208 4060 +4095 3211 4059 +4095 3215 4058 +4095 3220 4057 +4095 3226 4055 +4095 3235 4053 +4095 3247 4050 +4095 3261 4046 +4095 3280 4040 +4095 3305 4032 +4095 3335 4022 +4095 3374 4008 +4095 3420 3988 +4095 3475 3959 +4095 3540 3918 +4095 3614 3858 +4095 3698 3761 +4070 3790 3587 +0 2261 2529 +0 2261 2529 +0 2262 2529 +0 2263 2528 +0 2264 2527 +0 2265 2526 +0 2267 2524 +0 2269 2522 +0 2272 2520 +0 2276 2516 +0 2281 2511 +0 2288 2504 +0 2297 2495 +0 2308 2482 +0 2324 2465 +0 2343 2440 +0 2368 2405 +0 2400 2354 +0 2439 2274 +0 2486 2140 +0 2542 1860 +0 2608 0 +0 2684 0 +0 2768 0 +0 2861 0 +0 2962 0 +0 3069 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3667 0 +0 2261 2530 +0 2262 2530 +0 2262 2529 +0 2263 2529 +0 2264 2528 +0 2265 2527 +0 2267 2525 +0 2269 2523 +0 2272 2520 +0 2276 2517 +0 2281 2512 +0 2288 2505 +0 2297 2495 +0 2309 2483 +0 2324 2465 +0 2343 2441 +0 2368 2406 +0 2400 2354 +0 2439 2275 +0 2486 2141 +0 2543 1863 +0 2608 0 +0 2684 0 +0 2769 0 +0 2862 0 +0 2962 0 +0 3069 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3667 0 +0 2261 2531 +0 2262 2530 +0 2262 2530 +0 2263 2529 +0 2264 2528 +0 2265 2527 +0 2267 2526 +0 2269 2524 +0 2272 2521 +0 2276 2517 +0 2281 2512 +0 2288 2505 +0 2297 2496 +0 2309 2484 +0 2324 2466 +0 2344 2442 +0 2369 2407 +0 2400 2355 +0 2439 2276 +0 2486 2143 +0 2543 1866 +0 2609 0 +0 2684 0 +0 2769 0 +0 2862 0 +0 2962 0 +0 3069 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3667 0 +0 2262 2532 +0 2262 2531 +0 2263 2531 +0 2263 2530 +0 2264 2529 +0 2265 2528 +0 2267 2527 +0 2269 2525 +0 2272 2522 +0 2276 2518 +0 2281 2513 +0 2288 2506 +0 2297 2497 +0 2309 2485 +0 2324 2467 +0 2344 2443 +0 2369 2408 +0 2400 2357 +0 2439 2278 +0 2486 2145 +0 2543 1870 +0 2609 0 +0 2684 0 +0 2769 0 +0 2862 0 +0 2962 0 +0 3069 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3667 0 +0 2262 2533 +0 2262 2533 +0 2263 2532 +0 2264 2531 +0 2264 2531 +0 2266 2529 +0 2267 2528 +0 2270 2526 +0 2273 2523 +0 2276 2520 +0 2282 2515 +0 2288 2508 +0 2297 2499 +0 2309 2486 +0 2324 2469 +0 2344 2444 +0 2369 2410 +0 2400 2359 +0 2439 2280 +0 2487 2148 +0 2543 1875 +0 2609 0 +0 2684 0 +0 2769 0 +0 2862 0 +0 2962 0 +0 3069 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3667 0 +0 2262 2535 +0 2263 2534 +0 2263 2534 +0 2264 2533 +0 2265 2532 +0 2266 2531 +0 2268 2530 +0 2270 2528 +0 2273 2525 +0 2277 2521 +0 2282 2516 +0 2289 2510 +0 2298 2500 +0 2310 2488 +0 2325 2471 +0 2344 2446 +0 2369 2412 +0 2401 2361 +0 2440 2283 +0 2487 2152 +0 2543 1882 +0 2609 0 +0 2684 0 +0 2769 0 +0 2862 0 +0 2962 0 +0 3069 0 +0 3181 0 +0 3298 0 +0 3418 0 +0 3541 0 +0 3667 0 +0 2263 2537 +0 2263 2537 +0 2264 2536 +0 2265 2535 +0 2265 2535 +0 2267 2533 +0 2268 2532 +0 2271 2530 +0 2274 2527 +0 2277 2524 +0 2283 2519 +0 2289 2512 +0 2298 2503 +0 2310 2490 +0 2325 2473 +0 2345 2449 +0 2370 2415 +0 2401 2364 +0 2440 2287 +0 2487 2157 +0 2543 1892 +0 2609 0 +0 2685 0 +0 2769 0 +0 2862 0 +0 2962 0 +0 3069 0 +0 3182 0 +0 3298 0 +0 3418 0 +0 3542 0 +0 3667 0 +0 2264 2540 +0 2264 2539 +0 2265 2539 +0 2265 2538 +0 2266 2538 +0 2267 2536 +0 2269 2535 +0 2271 2533 +0 2274 2530 +0 2278 2527 +0 2283 2522 +0 2290 2515 +0 2299 2506 +0 2311 2494 +0 2326 2477 +0 2346 2453 +0 2370 2419 +0 2402 2369 +0 2440 2292 +0 2488 2164 +0 2544 1904 +0 2610 0 +0 2685 0 +0 2769 0 +0 2862 0 +0 2963 0 +0 3069 0 +0 3182 0 +0 3298 0 +0 3419 0 +0 3542 0 +0 3667 0 +0 2265 2544 +0 2265 2543 +0 2266 2543 +0 2266 2542 +0 2267 2542 +0 2268 2540 +0 2270 2539 +0 2272 2537 +0 2275 2534 +0 2279 2531 +0 2284 2526 +0 2291 2519 +0 2300 2510 +0 2312 2498 +0 2327 2481 +0 2346 2458 +0 2371 2424 +0 2402 2375 +0 2441 2299 +0 2488 2173 +0 2544 1920 +0 2610 0 +0 2685 0 +0 2770 0 +0 2862 0 +0 2963 0 +0 3070 0 +0 3182 0 +0 3298 0 +0 3419 0 +0 3542 0 +0 3667 0 +0 2266 2549 +0 2266 2549 +0 2267 2548 +0 2268 2548 +0 2269 2547 +0 2270 2546 +0 2271 2544 +0 2274 2542 +0 2277 2540 +0 2280 2536 +0 2286 2531 +0 2292 2525 +0 2301 2516 +0 2313 2504 +0 2328 2487 +0 2348 2464 +0 2372 2431 +0 2403 2382 +0 2442 2308 +0 2489 2185 +0 2545 1940 +0 2611 542 +0 2686 0 +0 2770 0 +0 2863 0 +0 2963 0 +0 3070 0 +0 3182 0 +0 3299 0 +0 3419 0 +0 3542 0 +0 3667 0 +0 2268 2556 +0 2268 2556 +0 2269 2555 +0 2269 2555 +0 2270 2554 +0 2272 2553 +0 2273 2551 +0 2275 2549 +0 2278 2547 +0 2282 2543 +0 2287 2538 +0 2294 2532 +0 2303 2523 +0 2315 2512 +0 2330 2495 +0 2349 2472 +0 2374 2440 +0 2405 2392 +0 2443 2320 +0 2490 2200 +0 2546 1966 +0 2612 914 +0 2687 0 +0 2771 0 +0 2863 0 +0 2963 0 +0 3070 0 +0 3182 0 +0 3299 0 +0 3419 0 +0 3542 0 +0 3667 0 +0 2270 2565 +0 2271 2565 +0 2271 2564 +0 2272 2564 +0 2273 2563 +0 2274 2562 +0 2276 2560 +0 2278 2559 +0 2281 2556 +0 2285 2553 +0 2290 2548 +0 2296 2542 +0 2305 2533 +0 2317 2522 +0 2332 2505 +0 2351 2483 +0 2376 2451 +0 2407 2405 +0 2445 2335 +0 2492 2220 +0 2547 1998 +0 2613 1168 +0 2688 0 +0 2772 0 +0 2864 0 +0 2964 0 +0 3071 0 +0 3183 0 +0 3299 0 +0 3419 0 +0 3542 0 +0 3667 0 +0 2273 2577 +0 2274 2577 +0 2274 2576 +0 2275 2576 +0 2276 2575 +0 2277 2574 +0 2279 2572 +0 2281 2571 +0 2284 2568 +0 2288 2565 +0 2293 2560 +0 2299 2554 +0 2308 2546 +0 2320 2535 +0 2335 2519 +0 2354 2497 +0 2378 2467 +0 2409 2422 +0 2447 2354 +0 2494 2245 +0 2549 2038 +0 2614 1374 +0 2689 0 +0 2773 0 +0 2865 0 +0 2965 0 +0 3071 0 +0 3183 0 +0 3299 0 +0 3419 0 +0 3542 0 +0 3667 0 +0 2278 2592 +0 2278 2592 +0 2279 2592 +0 2279 2591 +0 2280 2590 +0 2281 2589 +0 2283 2588 +0 2285 2586 +0 2288 2584 +0 2292 2581 +0 2297 2576 +0 2303 2570 +0 2312 2562 +0 2323 2551 +0 2338 2536 +0 2357 2516 +0 2382 2486 +0 2412 2443 +0 2450 2379 +0 2496 2276 +0 2551 2087 +0 2616 1554 +0 2690 0 +0 2774 0 +0 2866 0 +0 2966 0 +0 3072 0 +0 3184 0 +0 3300 0 +0 3420 0 +0 3542 0 +0 3667 0 +0 2283 2612 +0 2284 2612 +0 2284 2611 +0 2285 2611 +0 2286 2610 +0 2287 2609 +0 2289 2608 +0 2291 2606 +0 2293 2604 +0 2297 2601 +0 2302 2597 +0 2309 2591 +0 2317 2584 +0 2329 2573 +0 2343 2559 +0 2362 2539 +0 2386 2511 +0 2416 2471 +0 2454 2410 +0 2500 2315 +0 2555 2145 +0 2619 1719 +0 2693 0 +0 2776 0 +0 2868 0 +0 2967 0 +0 3073 0 +0 3184 0 +0 3300 0 +0 3420 0 +0 3543 0 +0 3668 0 +746 2291 2637 +722 2291 2637 +688 2292 2637 +637 2292 2636 +559 2293 2636 +428 2294 2635 +158 2296 2633 +0 2298 2632 +0 2301 2630 +0 2304 2627 +0 2309 2623 +0 2316 2618 +0 2324 2610 +0 2335 2601 +0 2350 2587 +0 2368 2568 +0 2392 2542 +0 2422 2505 +0 2459 2449 +0 2504 2362 +0 2559 2212 +0 2622 1874 +0 2696 0 +0 2778 0 +0 2870 0 +0 2969 0 +0 3074 0 +0 3185 0 +0 3301 0 +0 3421 0 +0 3543 0 +0 3668 0 +1791 2300 2669 +1789 2301 2669 +1785 2301 2668 +1781 2302 2668 +1775 2303 2667 +1767 2304 2667 +1757 2305 2665 +1742 2307 2664 +1721 2310 2662 +1692 2314 2659 +1650 2319 2656 +1586 2325 2651 +1485 2333 2644 +1300 2344 2635 +793 2358 2622 +0 2376 2605 +0 2400 2581 +0 2429 2547 +0 2466 2496 +0 2510 2419 +0 2564 2289 +0 2627 2023 +0 2700 0 +0 2782 0 +0 2872 0 +0 2971 0 +0 3076 0 +0 3187 0 +0 3302 0 +0 3422 0 +0 3544 0 +0 3668 0 +2150 2313 2708 +2149 2313 2708 +2147 2314 2708 +2145 2314 2707 +2143 2315 2707 +2139 2316 2706 +2135 2318 2705 +2128 2320 2704 +2119 2323 2702 +2108 2326 2699 +2091 2331 2696 +2068 2337 2691 +2036 2345 2685 +1988 2356 2677 +1915 2369 2666 +1795 2387 2650 +1560 2410 2628 +480 2439 2597 +0 2474 2553 +0 2518 2485 +0 2571 2375 +0 2633 2167 +0 2705 1492 +0 2786 0 +0 2876 0 +0 2974 0 +0 3078 0 +0 3189 0 +0 3304 0 +0 3423 0 +0 3545 0 +0 3669 0 +2399 2329 2756 +2398 2330 2756 +2398 2330 2755 +2396 2331 2755 +2395 2332 2754 +2393 2333 2754 +2390 2334 2753 +2387 2336 2752 +2382 2339 2750 +2375 2342 2748 +2366 2346 2745 +2354 2352 2741 +2337 2360 2735 +2313 2370 2728 +2278 2384 2718 +2228 2401 2704 +2151 2423 2684 +2023 2451 2657 +1760 2486 2618 +0 2529 2560 +0 2581 2469 +0 2642 2308 +0 2712 1927 +0 2792 0 +0 2881 0 +0 2978 0 +0 3081 0 +0 3191 0 +0 3306 0 +0 3424 0 +0 3546 0 +0 3670 0 +2602 2350 2813 +2602 2351 2812 +2602 2351 2812 +2601 2352 2812 +2600 2353 2811 +2599 2354 2811 +2597 2355 2810 +2595 2357 2809 +2591 2359 2807 +2587 2362 2805 +2582 2367 2803 +2574 2372 2799 +2563 2380 2794 +2549 2390 2788 +2529 2402 2779 +2501 2419 2767 +2460 2440 2750 +2400 2467 2727 +2303 2501 2694 +2131 2543 2645 +1693 2593 2570 +0 2652 2447 +0 2721 2200 +0 2800 714 +0 2887 0 +0 2983 0 +0 3085 0 +0 3194 0 +0 3308 0 +0 3426 0 +0 3547 0 +0 3671 0 +2781 2377 2879 +2781 2377 2879 +2781 2378 2879 +2780 2378 2878 +2780 2379 2878 +2779 2380 2877 +2778 2381 2877 +2776 2383 2876 +2774 2385 2874 +2771 2388 2873 +2767 2392 2870 +2762 2398 2867 +2755 2405 2863 +2746 2414 2858 +2733 2426 2850 +2715 2442 2840 +2691 2462 2826 +2655 2488 2806 +2602 2520 2778 +2521 2560 2738 +2384 2609 2678 +2092 2666 2584 +0 2733 2415 +0 2810 1999 +0 2895 0 +0 2989 0 +0 3091 0 +0 3198 0 +0 3311 0 +0 3429 0 +0 3549 0 +0 3673 0 +2946 2411 2955 +2945 2411 2955 +2945 2411 2954 +2945 2412 2954 +2944 2412 2954 +2944 2413 2953 +2943 2414 2953 +2942 2416 2952 +2940 2418 2951 +2939 2421 2950 +2936 2425 2948 +2932 2430 2945 +2928 2436 2942 +2921 2445 2937 +2913 2456 2930 +2901 2471 2922 +2884 2490 2910 +2861 2514 2894 +2829 2545 2871 +2781 2583 2838 +2709 2629 2791 +2589 2684 2719 +2354 2749 2601 +1291 2823 2369 +0 2906 1378 +0 2998 0 +0 3098 0 +0 3204 0 +0 3316 0 +0 3432 0 +0 3552 0 +0 3675 0 +3100 2452 3040 +3100 2452 3040 +3100 2452 3039 +3100 2453 3039 +3099 2453 3039 +3099 2454 3039 +3098 2455 3038 +3098 2457 3037 +3097 2459 3037 +3095 2461 3035 +3093 2465 3034 +3091 2469 3032 +3088 2475 3029 +3083 2483 3025 +3077 2494 3020 +3069 2507 3013 +3058 2525 3003 +3042 2547 2990 +3020 2576 2971 +2990 2611 2945 +2945 2655 2909 +2878 2707 2854 +2769 2769 2769 +2564 2840 2622 +1912 2921 2300 +0 3010 0 +0 3107 0 +0 3212 0 +0 3322 0 +0 3437 0 +0 3555 0 +0 3677 0 +3249 2501 3133 +3248 2502 3133 +3248 2502 3133 +3248 2502 3133 +3248 2503 3132 +3248 2504 3132 +3247 2505 3132 +3247 2506 3131 +3246 2508 3130 +3245 2510 3129 +3244 2513 3128 +3242 2517 3126 +3239 2523 3124 +3236 2530 3121 +3232 2539 3117 +3226 2552 3111 +3218 2568 3103 +3207 2588 3093 +3192 2614 3078 +3172 2647 3058 +3142 2687 3029 +3100 2736 2988 +3036 2794 2926 +2934 2862 2828 +2746 2939 2650 +2226 3025 2186 +0 3120 0 +0 3221 0 +0 3329 0 +0 3443 0 +0 3560 0 +0 3681 0 +3392 2560 3234 +3392 2561 3234 +3392 2561 3234 +3392 2561 3233 +3392 2562 3233 +3392 2562 3233 +3391 2563 3233 +3391 2564 3232 +3391 2566 3232 +3390 2568 3231 +3389 2571 3230 +3388 2574 3229 +3386 2579 3227 +3383 2586 3224 +3380 2594 3221 +3376 2605 3216 +3370 2619 3210 +3363 2637 3202 +3352 2661 3190 +3338 2691 3175 +3317 2727 3153 +3289 2772 3121 +3248 2826 3076 +3187 2890 3008 +3089 2962 2896 +2913 3045 2685 +2459 3135 1969 +0 3234 0 +0 3339 0 +0 3450 0 +0 3566 0 +0 3685 0 +3533 2629 3341 +3533 2629 3341 +3533 2629 3341 +3533 2630 3341 +3533 2630 3341 +3533 2631 3340 +3532 2631 3340 +3532 2632 3340 +3532 2634 3339 +3531 2636 3339 +3530 2638 3338 +3530 2641 3337 +3528 2645 3335 +3527 2651 3333 +3524 2658 3331 +3521 2668 3327 +3517 2680 3322 +3512 2696 3316 +3504 2717 3307 +3494 2743 3295 +3479 2776 3278 +3460 2817 3255 +3432 2866 3221 +3392 2924 3173 +3332 2992 3098 +3237 3069 2974 +3069 3156 2727 +2654 3251 1192 +0 3353 0 +0 3461 0 +0 3574 0 +0 3692 0 +3672 2707 3453 +3672 2707 3453 +3671 2707 3453 +3671 2708 3453 +3671 2708 3453 +3671 2709 3453 +3671 2709 3453 +3671 2710 3453 +3671 2711 3452 +3670 2713 3452 +3670 2715 3451 +3669 2717 3450 +3668 2721 3449 +3667 2725 3448 +3665 2732 3446 +3663 2740 3443 +3660 2750 3439 +3656 2764 3434 +3650 2782 3427 +3643 2805 3418 +3633 2834 3405 +3619 2870 3388 +3599 2914 3363 +3572 2967 3328 +3532 3029 3276 +3474 3101 3196 +3382 3182 3061 +3218 3272 2778 +2827 3370 0 +0 3474 0 +0 3585 0 +0 3700 0 +3808 2794 3570 +3808 2794 3570 +3808 2794 3570 +3808 2795 3570 +3808 2795 3570 +3808 2795 3570 +3808 2796 3570 +3808 2796 3570 +3808 2797 3569 +3807 2799 3569 +3807 2800 3569 +3806 2803 3568 +3806 2805 3567 +3805 2809 3566 +3804 2814 3564 +3802 2821 3562 +3800 2830 3559 +3797 2842 3555 +3793 2857 3550 +3787 2876 3543 +3780 2901 3533 +3770 2932 3520 +3756 2971 3502 +3737 3018 3476 +3710 3074 3440 +3671 3139 3385 +3613 3214 3301 +3522 3299 3156 +3363 3391 2839 +2989 3492 0 +0 3598 0 +0 3710 0 +3944 2889 3691 +3944 2889 3691 +3944 2890 3691 +3944 2890 3691 +3944 2890 3691 +3944 2890 3691 +3944 2891 3690 +3943 2891 3690 +3943 2892 3690 +3943 2893 3690 +3943 2894 3689 +3942 2896 3689 +3942 2898 3688 +3941 2902 3687 +3940 2906 3686 +3939 2911 3684 +3937 2919 3682 +3935 2928 3679 +3932 2941 3675 +3928 2957 3670 +3923 2978 3663 +3916 3004 3653 +3906 3037 3639 +3892 3078 3620 +3873 3128 3594 +3846 3186 3556 +3808 3255 3500 +3750 3332 3412 +3661 3419 3258 +3504 3514 2909 +3141 3616 0 +0 3724 0 +4079 2992 3814 +4079 2992 3814 +4078 2992 3814 +4078 2992 3814 +4078 2992 3814 +4078 2992 3814 +4078 2993 3814 +4078 2993 3813 +4078 2994 3813 +4078 2995 3813 +4078 2996 3813 +4077 2997 3812 +4077 2999 3812 +4077 3002 3811 +4076 3005 3810 +4075 3009 3809 +4074 3015 3807 +4072 3023 3805 +4070 3033 3802 +4067 3047 3798 +4063 3064 3793 +4058 3086 3785 +4050 3114 3775 +4040 3148 3761 +4027 3191 3742 +4008 3242 3715 +3981 3303 3676 +3943 3374 3618 +3886 3453 3527 +3798 3542 3367 +3643 3639 2988 +3288 3742 0 +4095 3100 3939 +4095 3100 3939 +4095 3100 3939 +4095 3101 3939 +4095 3101 3939 +4095 3101 3939 +4095 3101 3939 +4095 3101 3939 +4095 3102 3939 +4095 3103 3939 +4095 3103 3938 +4095 3105 3938 +4095 3106 3938 +4095 3108 3937 +4095 3111 3936 +4095 3114 3936 +4095 3119 3934 +4095 3125 3933 +4095 3133 3930 +4095 3144 3927 +4095 3158 3923 +4095 3176 3918 +4095 3199 3910 +4095 3228 3900 +4095 3264 3886 +4095 3308 3866 +4095 3361 3839 +4095 3424 3799 +4078 3496 3740 +4021 3577 3646 +3933 3667 3480 +3780 3765 3076 +4095 3214 4066 +4095 3214 4066 +4095 3214 4066 +4095 3214 4066 +4095 3214 4066 +4095 3214 4066 +4095 3215 4066 +4095 3215 4066 +4095 3215 4066 +4095 3216 4066 +4095 3216 4066 +4095 3217 4065 +4095 3218 4065 +4095 3220 4065 +4095 3222 4064 +4095 3225 4063 +4095 3229 4062 +4095 3233 4061 +4095 3240 4059 +4095 3248 4057 +4095 3259 4054 +4095 3274 4050 +4095 3292 4044 +4095 3316 4037 +4095 3346 4026 +4095 3383 4012 +4095 3429 3992 +4095 3483 3964 +4095 3547 3924 +4095 3620 3864 +4095 3703 3768 +4068 3794 3598 +0 2393 2661 +0 2393 2661 +0 2393 2661 +0 2394 2660 +0 2395 2660 +0 2396 2659 +0 2397 2658 +0 2399 2656 +0 2401 2654 +0 2404 2651 +0 2408 2648 +0 2413 2643 +0 2420 2636 +0 2429 2627 +0 2440 2614 +0 2456 2596 +0 2475 2572 +0 2500 2537 +0 2532 2485 +0 2571 2406 +0 2618 2271 +0 2674 1991 +0 2740 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3313 0 +0 3430 0 +0 3550 0 +0 3673 0 +0 2393 2662 +0 2393 2662 +0 2394 2661 +0 2394 2661 +0 2395 2660 +0 2396 2659 +0 2397 2658 +0 2399 2657 +0 2401 2655 +0 2404 2652 +0 2408 2648 +0 2413 2643 +0 2420 2636 +0 2429 2627 +0 2441 2614 +0 2456 2597 +0 2475 2572 +0 2500 2537 +0 2532 2486 +0 2571 2406 +0 2618 2272 +0 2675 1992 +0 2740 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3313 0 +0 3430 0 +0 3550 0 +0 3673 0 +0 2393 2662 +0 2393 2662 +0 2394 2662 +0 2394 2661 +0 2395 2661 +0 2396 2660 +0 2397 2659 +0 2399 2657 +0 2401 2655 +0 2404 2652 +0 2408 2649 +0 2413 2644 +0 2420 2637 +0 2429 2628 +0 2441 2615 +0 2456 2597 +0 2476 2573 +0 2501 2538 +0 2532 2487 +0 2571 2407 +0 2618 2273 +0 2675 1995 +0 2741 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3313 0 +0 3430 0 +0 3550 0 +0 3673 0 +0 2393 2663 +0 2393 2663 +0 2394 2662 +0 2394 2662 +0 2395 2661 +0 2396 2661 +0 2397 2659 +0 2399 2658 +0 2401 2656 +0 2404 2653 +0 2408 2649 +0 2413 2644 +0 2420 2638 +0 2429 2628 +0 2441 2616 +0 2456 2598 +0 2476 2574 +0 2501 2539 +0 2532 2488 +0 2571 2408 +0 2618 2275 +0 2675 1998 +0 2741 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3313 0 +0 3430 0 +0 3550 0 +0 3674 0 +0 2393 2664 +0 2394 2664 +0 2394 2663 +0 2395 2663 +0 2395 2662 +0 2396 2661 +0 2398 2660 +0 2399 2659 +0 2401 2657 +0 2404 2654 +0 2408 2650 +0 2413 2645 +0 2420 2639 +0 2429 2629 +0 2441 2617 +0 2456 2599 +0 2476 2575 +0 2501 2540 +0 2532 2489 +0 2571 2410 +0 2618 2277 +0 2675 2002 +0 2741 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3313 0 +0 3430 0 +0 3550 0 +0 3674 0 +0 2394 2665 +0 2394 2665 +0 2394 2665 +0 2395 2664 +0 2396 2664 +0 2397 2663 +0 2398 2662 +0 2399 2660 +0 2402 2658 +0 2405 2655 +0 2409 2652 +0 2414 2647 +0 2421 2640 +0 2430 2631 +0 2441 2618 +0 2457 2601 +0 2476 2576 +0 2501 2542 +0 2533 2491 +0 2571 2412 +0 2619 2280 +0 2675 2007 +0 2741 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3314 0 +0 3430 0 +0 3551 0 +0 3674 0 +0 2394 2667 +0 2394 2667 +0 2395 2666 +0 2395 2666 +0 2396 2665 +0 2397 2664 +0 2398 2663 +0 2400 2662 +0 2402 2660 +0 2405 2657 +0 2409 2653 +0 2414 2648 +0 2421 2642 +0 2430 2633 +0 2442 2620 +0 2457 2603 +0 2477 2579 +0 2501 2544 +0 2533 2493 +0 2572 2415 +0 2619 2284 +0 2675 2014 +0 2741 0 +0 2816 0 +0 2901 0 +0 2994 0 +0 3094 0 +0 3201 0 +0 3314 0 +0 3430 0 +0 3551 0 +0 3674 0 +0 2395 2669 +0 2395 2669 +0 2395 2669 +0 2396 2668 +0 2397 2668 +0 2398 2667 +0 2399 2666 +0 2400 2664 +0 2403 2662 +0 2406 2659 +0 2410 2656 +0 2415 2651 +0 2422 2644 +0 2430 2635 +0 2442 2623 +0 2457 2605 +0 2477 2581 +0 2502 2547 +0 2533 2497 +0 2572 2419 +0 2619 2289 +0 2676 2024 +0 2741 0 +0 2817 0 +0 2901 0 +0 2994 0 +0 3095 0 +0 3201 0 +0 3314 0 +0 3430 0 +0 3551 0 +0 3674 0 +0 2395 2672 +0 2396 2672 +0 2396 2672 +0 2397 2671 +0 2397 2670 +0 2398 2670 +0 2400 2669 +0 2401 2667 +0 2403 2665 +0 2406 2662 +0 2410 2659 +0 2415 2654 +0 2422 2647 +0 2431 2638 +0 2443 2626 +0 2458 2609 +0 2478 2585 +0 2503 2551 +0 2534 2501 +0 2573 2424 +0 2620 2296 +0 2676 2036 +0 2742 0 +0 2817 0 +0 2901 0 +0 2994 0 +0 3095 0 +0 3202 0 +0 3314 0 +0 3430 0 +0 3551 0 +0 3674 0 +0 2397 2676 +0 2397 2676 +0 2397 2676 +0 2398 2675 +0 2398 2674 +0 2399 2674 +0 2401 2673 +0 2402 2671 +0 2404 2669 +0 2407 2666 +0 2411 2663 +0 2416 2658 +0 2423 2651 +0 2432 2642 +0 2444 2630 +0 2459 2613 +0 2478 2590 +0 2503 2556 +0 2535 2507 +0 2573 2431 +0 2620 2305 +0 2677 2052 +0 2742 0 +0 2817 0 +0 2902 0 +0 2995 0 +0 3095 0 +0 3202 0 +0 3314 0 +0 3431 0 +0 3551 0 +0 3674 0 +0 2398 2681 +0 2398 2681 +0 2399 2681 +0 2399 2680 +0 2400 2680 +0 2401 2679 +0 2402 2678 +0 2404 2676 +0 2406 2674 +0 2409 2672 +0 2413 2668 +0 2418 2663 +0 2424 2657 +0 2433 2648 +0 2445 2636 +0 2460 2619 +0 2480 2596 +0 2504 2563 +0 2536 2514 +0 2574 2440 +0 2621 2317 +0 2677 2072 +0 2743 674 +0 2818 0 +0 2902 0 +0 2995 0 +0 3095 0 +0 3202 0 +0 3314 0 +0 3431 0 +0 3551 0 +0 3674 0 +0 2400 2688 +0 2400 2688 +0 2400 2688 +0 2401 2687 +0 2402 2687 +0 2402 2686 +0 2404 2685 +0 2405 2683 +0 2408 2681 +0 2410 2679 +0 2414 2675 +0 2419 2671 +0 2426 2664 +0 2435 2656 +0 2447 2644 +0 2462 2627 +0 2481 2604 +0 2506 2572 +0 2537 2524 +0 2575 2452 +0 2622 2332 +0 2678 2098 +0 2744 1046 +0 2819 0 +0 2903 0 +0 2995 0 +0 3096 0 +0 3202 0 +0 3314 0 +0 3431 0 +0 3551 0 +0 3674 0 +0 2402 2697 +0 2402 2697 +0 2403 2697 +0 2403 2696 +0 2404 2696 +0 2405 2695 +0 2406 2694 +0 2408 2693 +0 2410 2691 +0 2413 2688 +0 2417 2685 +0 2422 2680 +0 2428 2674 +0 2437 2665 +0 2449 2654 +0 2464 2638 +0 2483 2615 +0 2508 2583 +0 2539 2537 +0 2577 2467 +0 2624 2352 +0 2680 2130 +0 2745 1300 +0 2820 0 +0 2904 0 +0 2996 0 +0 3096 0 +0 3203 0 +0 3315 0 +0 3431 0 +0 3551 0 +0 3674 0 +0 2405 2709 +0 2406 2709 +0 2406 2709 +0 2406 2708 +0 2407 2708 +0 2408 2707 +0 2409 2706 +0 2411 2705 +0 2413 2703 +0 2416 2700 +0 2420 2697 +0 2425 2692 +0 2431 2686 +0 2440 2678 +0 2452 2667 +0 2467 2651 +0 2486 2629 +0 2510 2599 +0 2541 2554 +0 2579 2486 +0 2626 2377 +0 2681 2170 +0 2746 1506 +0 2821 0 +0 2905 0 +0 2997 0 +0 3097 0 +0 3203 0 +0 3315 0 +0 3431 0 +0 3551 0 +0 3674 0 +0 2410 2725 +0 2410 2724 +0 2410 2724 +0 2411 2724 +0 2411 2723 +0 2412 2722 +0 2413 2721 +0 2415 2720 +0 2417 2718 +0 2420 2716 +0 2424 2713 +0 2429 2708 +0 2435 2702 +0 2444 2694 +0 2456 2684 +0 2470 2669 +0 2489 2648 +0 2514 2618 +0 2544 2575 +0 2582 2511 +0 2628 2408 +0 2684 2219 +0 2748 1686 +0 2823 0 +0 2906 0 +0 2998 0 +0 3098 0 +0 3204 0 +0 3316 0 +0 3432 0 +0 3552 0 +0 3675 0 +0 2415 2744 +0 2415 2744 +0 2416 2744 +0 2416 2744 +0 2417 2743 +0 2418 2742 +0 2419 2741 +0 2421 2740 +0 2423 2738 +0 2426 2736 +0 2429 2733 +0 2434 2729 +0 2441 2723 +0 2449 2716 +0 2461 2705 +0 2475 2691 +0 2494 2671 +0 2518 2643 +0 2548 2603 +0 2586 2543 +0 2632 2447 +0 2687 2277 +0 2751 1851 +0 2825 0 +0 2908 0 +0 3000 0 +0 3099 0 +0 3205 0 +0 3316 0 +0 3432 0 +0 3552 0 +0 3675 0 +896 2423 2770 +879 2423 2769 +854 2423 2769 +820 2424 2769 +769 2424 2768 +691 2425 2768 +560 2426 2767 +290 2428 2766 +0 2430 2764 +0 2433 2762 +0 2436 2759 +0 2441 2755 +0 2448 2750 +0 2456 2742 +0 2467 2733 +0 2482 2719 +0 2500 2701 +0 2524 2674 +0 2554 2637 +0 2591 2581 +0 2636 2494 +0 2691 2344 +0 2755 2007 +0 2828 0 +0 2910 0 +0 3002 0 +0 3101 0 +0 3206 0 +0 3317 0 +0 3433 0 +0 3553 0 +0 3675 0 +1925 2432 2801 +1923 2432 2801 +1921 2433 2801 +1917 2433 2801 +1913 2434 2800 +1907 2435 2799 +1899 2436 2799 +1889 2438 2798 +1874 2440 2796 +1853 2442 2794 +1824 2446 2791 +1782 2451 2788 +1718 2457 2783 +1617 2465 2776 +1432 2476 2767 +925 2490 2754 +0 2508 2737 +0 2532 2713 +0 2561 2679 +0 2598 2628 +0 2642 2551 +0 2696 2421 +0 2759 2155 +0 2832 0 +0 2914 0 +0 3004 0 +0 3103 0 +0 3208 0 +0 3319 0 +0 3434 0 +0 3554 0 +0 3676 0 +2283 2445 2841 +2282 2445 2840 +2281 2445 2840 +2279 2446 2840 +2278 2447 2839 +2275 2447 2839 +2271 2449 2838 +2267 2450 2837 +2260 2452 2836 +2252 2455 2834 +2240 2458 2831 +2223 2463 2828 +2200 2469 2823 +2168 2477 2817 +2120 2488 2809 +2047 2501 2798 +1927 2519 2782 +1692 2542 2760 +612 2571 2729 +0 2607 2685 +0 2650 2617 +0 2703 2507 +0 2765 2299 +0 2837 1624 +0 2918 0 +0 3008 0 +0 3106 0 +0 3210 0 +0 3321 0 +0 3436 0 +0 3555 0 +0 3677 0 +2532 2461 2888 +2531 2462 2888 +2531 2462 2888 +2530 2462 2887 +2529 2463 2887 +2527 2464 2887 +2525 2465 2886 +2522 2466 2885 +2519 2468 2884 +2514 2471 2882 +2507 2474 2880 +2498 2479 2877 +2486 2484 2873 +2469 2492 2867 +2445 2503 2860 +2411 2516 2850 +2360 2533 2836 +2283 2555 2817 +2155 2583 2789 +1893 2618 2750 +0 2661 2692 +0 2713 2601 +0 2774 2440 +0 2844 2059 +0 2924 0 +0 3013 0 +0 3110 0 +0 3213 0 +0 3323 0 +0 3438 0 +0 3556 0 +0 3678 0 +2735 2482 2945 +2735 2483 2945 +2734 2483 2945 +2734 2483 2944 +2733 2484 2944 +2732 2485 2944 +2731 2486 2943 +2729 2487 2942 +2727 2489 2941 +2724 2491 2940 +2719 2495 2938 +2714 2499 2935 +2706 2504 2931 +2696 2512 2927 +2681 2522 2920 +2661 2535 2911 +2633 2551 2899 +2592 2572 2882 +2532 2599 2859 +2435 2633 2826 +2263 2675 2777 +1825 2725 2702 +0 2784 2579 +0 2853 2332 +0 2932 847 +0 3019 0 +0 3115 0 +0 3217 0 +0 3326 0 +0 3440 0 +0 3558 0 +0 3679 0 +2914 2509 3011 +2913 2509 3011 +2913 2510 3011 +2913 2510 3011 +2912 2510 3010 +2912 2511 3010 +2911 2512 3009 +2910 2513 3009 +2908 2515 3008 +2906 2517 3007 +2903 2521 3005 +2900 2525 3003 +2894 2530 3000 +2888 2537 2995 +2878 2546 2990 +2865 2558 2982 +2848 2574 2972 +2823 2594 2958 +2787 2620 2938 +2735 2652 2910 +2653 2692 2870 +2516 2741 2810 +2224 2798 2716 +0 2865 2547 +0 2942 2131 +0 3028 0 +0 3122 0 +0 3223 0 +0 3331 0 +0 3443 0 +0 3561 0 +0 3681 0 +3078 2542 3087 +3078 2543 3087 +3077 2543 3087 +3077 2543 3087 +3077 2544 3086 +3076 2544 3086 +3076 2545 3086 +3075 2547 3085 +3074 2548 3084 +3073 2550 3083 +3071 2553 3082 +3068 2557 3080 +3064 2562 3077 +3060 2569 3074 +3053 2577 3069 +3045 2589 3063 +3033 2603 3054 +3016 2622 3042 +2993 2647 3026 +2961 2677 3003 +2913 2715 2971 +2841 2761 2923 +2721 2816 2851 +2486 2881 2733 +1423 2955 2501 +0 3039 1510 +0 3130 0 +0 3230 0 +0 3336 0 +0 3448 0 +0 3564 0 +0 3684 0 +3232 2584 3172 +3232 2584 3172 +3232 2584 3172 +3232 2584 3172 +3232 2585 3171 +3232 2585 3171 +3231 2586 3171 +3231 2587 3170 +3230 2589 3170 +3229 2591 3169 +3227 2593 3167 +3226 2597 3166 +3223 2601 3164 +3220 2607 3161 +3215 2615 3157 +3209 2626 3152 +3201 2639 3145 +3190 2657 3135 +3174 2680 3122 +3152 2708 3103 +3122 2743 3078 +3077 2787 3041 +3010 2839 2986 +2901 2901 2901 +2696 2972 2754 +2044 3053 2432 +0 3142 0 +0 3239 0 +0 3344 0 +0 3454 0 +0 3569 0 +0 3687 0 +3381 2633 3265 +3381 2634 3265 +3381 2634 3265 +3380 2634 3265 +3380 2634 3265 +3380 2635 3265 +3380 2636 3264 +3379 2637 3264 +3379 2638 3263 +3378 2640 3263 +3377 2642 3262 +3376 2645 3260 +3374 2649 3259 +3372 2655 3256 +3368 2662 3253 +3364 2671 3249 +3358 2684 3243 +3350 2700 3235 +3339 2720 3225 +3324 2746 3210 +3304 2779 3190 +3274 2819 3161 +3232 2868 3120 +3168 2926 3058 +3066 2994 2960 +2879 3071 2782 +2358 3157 2318 +0 3252 0 +0 3353 0 +0 3461 0 +0 3575 0 +0 3692 0 +3525 2692 3366 +3525 2693 3366 +3524 2693 3366 +3524 2693 3366 +3524 2693 3366 +3524 2694 3365 +3524 2695 3365 +3524 2695 3365 +3523 2697 3364 +3523 2698 3364 +3522 2700 3363 +3521 2703 3362 +3520 2707 3361 +3518 2711 3359 +3516 2718 3356 +3512 2726 3353 +3508 2737 3348 +3503 2751 3342 +3495 2770 3334 +3484 2793 3322 +3470 2823 3307 +3450 2859 3285 +3421 2904 3254 +3380 2958 3208 +3319 3022 3140 +3221 3095 3028 +3045 3177 2817 +2591 3268 2101 +0 3366 0 +0 3471 0 +0 3582 0 +0 3698 0 +3665 2761 3473 +3665 2761 3473 +3665 2761 3473 +3665 2762 3473 +3665 2762 3473 +3665 2762 3473 +3665 2763 3472 +3665 2764 3472 +3664 2765 3472 +3664 2766 3471 +3663 2768 3471 +3663 2770 3470 +3662 2773 3469 +3660 2777 3467 +3659 2783 3465 +3656 2790 3463 +3653 2800 3459 +3649 2812 3454 +3644 2828 3448 +3636 2849 3439 +3626 2875 3427 +3611 2908 3410 +3592 2949 3387 +3564 2998 3353 +3524 3056 3305 +3464 3124 3230 +3370 3202 3106 +3201 3288 2859 +2786 3383 1324 +0 3485 0 +0 3593 0 +0 3706 0 +3804 2839 3586 +3804 2839 3586 +3804 2839 3586 +3804 2840 3585 +3803 2840 3585 +3803 2840 3585 +3803 2841 3585 +3803 2841 3585 +3803 2842 3585 +3803 2843 3584 +3802 2845 3584 +3802 2847 3583 +3801 2849 3582 +3800 2853 3581 +3799 2858 3580 +3797 2864 3578 +3795 2872 3575 +3792 2882 3571 +3788 2896 3566 +3782 2914 3559 +3775 2937 3550 +3765 2966 3537 +3751 3002 3520 +3731 3046 3495 +3704 3099 3460 +3665 3161 3408 +3606 3233 3328 +3514 3314 3193 +3351 3404 2910 +2960 3502 0 +0 3606 0 +0 3717 0 +3940 2926 3703 +3940 2926 3702 +3940 2926 3702 +3940 2926 3702 +3940 2927 3702 +3940 2927 3702 +3940 2927 3702 +3940 2928 3702 +3940 2929 3702 +3940 2930 3702 +3939 2931 3701 +3939 2932 3701 +3938 2935 3700 +3938 2938 3699 +3937 2941 3698 +3936 2947 3696 +3934 2953 3694 +3932 2962 3691 +3929 2974 3687 +3925 2989 3682 +3919 3008 3675 +3912 3033 3666 +3902 3064 3652 +3888 3103 3634 +3869 3150 3608 +3842 3206 3572 +3803 3271 3517 +3745 3347 3433 +3654 3431 3288 +3495 3523 2971 +3121 3624 0 +0 3730 0 +4076 3021 3823 +4076 3021 3823 +4076 3021 3823 +4076 3022 3823 +4076 3022 3823 +4076 3022 3823 +4076 3022 3823 +4076 3023 3822 +4076 3023 3822 +4075 3024 3822 +4075 3025 3822 +4075 3026 3821 +4075 3028 3821 +4074 3031 3820 +4073 3034 3819 +4072 3038 3818 +4071 3043 3817 +4070 3051 3814 +4067 3060 3811 +4064 3073 3807 +4060 3089 3802 +4055 3110 3795 +4048 3136 3785 +4038 3170 3771 +4024 3210 3753 +4005 3260 3726 +3978 3318 3688 +3940 3387 3632 +3883 3464 3544 +3793 3551 3390 +3636 3646 3041 +3273 3748 0 +4095 3124 3946 +4095 3124 3946 +4095 3124 3946 +4095 3124 3946 +4095 3124 3946 +4095 3124 3946 +4095 3125 3946 +4095 3125 3946 +4095 3125 3946 +4095 3126 3945 +4095 3127 3945 +4095 3128 3945 +4095 3129 3945 +4095 3131 3944 +4095 3134 3943 +4095 3137 3942 +4095 3142 3941 +4095 3147 3940 +4095 3155 3937 +4095 3165 3934 +4095 3179 3930 +4095 3196 3925 +4095 3218 3917 +4095 3246 3907 +4095 3280 3893 +4095 3323 3874 +4095 3375 3847 +4095 3435 3808 +4075 3506 3750 +4019 3586 3659 +3930 3674 3499 +3775 3771 3120 +4095 3232 4071 +4095 3232 4071 +4095 3232 4071 +4095 3232 4071 +4095 3233 4071 +4095 3233 4071 +4095 3233 4071 +4095 3233 4071 +4095 3234 4071 +4095 3234 4071 +4095 3235 4071 +4095 3236 4070 +4095 3237 4070 +4095 3238 4070 +4095 3240 4069 +4095 3243 4069 +4095 3246 4068 +4095 3251 4066 +4095 3257 4065 +4095 3265 4062 +4095 3276 4059 +4095 3290 4055 +4095 3308 4050 +4095 3331 4042 +4095 3360 4032 +4095 3396 4018 +4095 3440 3998 +4095 3493 3971 +4095 3556 3931 +4095 3628 3872 +4095 3709 3778 +4065 3799 3612 +0 2525 2793 +0 2525 2793 +0 2525 2793 +0 2525 2793 +0 2526 2792 +0 2527 2792 +0 2528 2791 +0 2529 2790 +0 2531 2788 +0 2533 2786 +0 2536 2783 +0 2540 2779 +0 2545 2774 +0 2552 2768 +0 2561 2758 +0 2572 2746 +0 2588 2728 +0 2607 2704 +0 2632 2668 +0 2664 2617 +0 2703 2537 +0 2750 2402 +0 2807 2121 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3445 0 +0 3562 0 +0 3683 0 +0 2525 2794 +0 2525 2794 +0 2525 2793 +0 2526 2793 +0 2526 2792 +0 2527 2792 +0 2528 2791 +0 2529 2790 +0 2531 2788 +0 2533 2786 +0 2536 2783 +0 2540 2780 +0 2545 2775 +0 2552 2768 +0 2561 2759 +0 2573 2746 +0 2588 2728 +0 2607 2704 +0 2632 2669 +0 2664 2617 +0 2703 2538 +0 2750 2403 +0 2807 2123 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2525 2794 +0 2525 2794 +0 2525 2794 +0 2526 2793 +0 2526 2793 +0 2527 2792 +0 2528 2791 +0 2529 2790 +0 2531 2789 +0 2533 2787 +0 2536 2784 +0 2540 2780 +0 2545 2775 +0 2552 2768 +0 2561 2759 +0 2573 2746 +0 2588 2729 +0 2608 2704 +0 2633 2669 +0 2664 2618 +0 2703 2538 +0 2750 2404 +0 2807 2124 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2525 2795 +0 2525 2794 +0 2525 2794 +0 2526 2794 +0 2526 2793 +0 2527 2793 +0 2528 2792 +0 2529 2791 +0 2531 2789 +0 2533 2787 +0 2536 2784 +0 2540 2781 +0 2545 2776 +0 2552 2769 +0 2561 2760 +0 2573 2747 +0 2588 2730 +0 2608 2705 +0 2633 2670 +0 2664 2619 +0 2703 2539 +0 2750 2405 +0 2807 2127 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2525 2795 +0 2525 2795 +0 2526 2795 +0 2526 2795 +0 2526 2794 +0 2527 2793 +0 2528 2793 +0 2529 2791 +0 2531 2790 +0 2533 2788 +0 2536 2785 +0 2540 2781 +0 2545 2776 +0 2552 2770 +0 2561 2760 +0 2573 2748 +0 2588 2730 +0 2608 2706 +0 2633 2671 +0 2664 2620 +0 2703 2540 +0 2750 2407 +0 2807 2130 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2525 2796 +0 2526 2796 +0 2526 2796 +0 2526 2795 +0 2527 2795 +0 2527 2794 +0 2528 2794 +0 2530 2792 +0 2531 2791 +0 2533 2789 +0 2536 2786 +0 2540 2782 +0 2546 2777 +0 2552 2771 +0 2561 2761 +0 2573 2749 +0 2588 2731 +0 2608 2707 +0 2633 2672 +0 2664 2621 +0 2703 2542 +0 2751 2409 +0 2807 2134 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2526 2798 +0 2526 2797 +0 2526 2797 +0 2527 2797 +0 2527 2796 +0 2528 2796 +0 2529 2795 +0 2530 2794 +0 2532 2792 +0 2534 2790 +0 2537 2787 +0 2541 2784 +0 2546 2779 +0 2553 2772 +0 2562 2763 +0 2573 2750 +0 2589 2733 +0 2608 2709 +0 2633 2674 +0 2665 2623 +0 2703 2544 +0 2751 2412 +0 2807 2139 +0 2873 0 +0 2948 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2526 2799 +0 2526 2799 +0 2527 2799 +0 2527 2798 +0 2527 2798 +0 2528 2797 +0 2529 2797 +0 2530 2795 +0 2532 2794 +0 2534 2792 +0 2537 2789 +0 2541 2785 +0 2546 2780 +0 2553 2774 +0 2562 2765 +0 2574 2752 +0 2589 2735 +0 2609 2711 +0 2634 2676 +0 2665 2625 +0 2704 2547 +0 2751 2416 +0 2807 2146 +0 2873 0 +0 2949 0 +0 3033 0 +0 3126 0 +0 3226 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2527 2801 +0 2527 2801 +0 2527 2801 +0 2528 2801 +0 2528 2800 +0 2529 2800 +0 2530 2799 +0 2531 2798 +0 2533 2796 +0 2535 2794 +0 2538 2791 +0 2542 2788 +0 2547 2783 +0 2554 2776 +0 2563 2767 +0 2574 2755 +0 2590 2737 +0 2609 2713 +0 2634 2679 +0 2665 2629 +0 2704 2551 +0 2751 2421 +0 2808 2156 +0 2873 0 +0 2949 0 +0 3033 0 +0 3126 0 +0 3227 0 +0 3333 0 +0 3446 0 +0 3562 0 +0 3683 0 +0 2527 2804 +0 2528 2804 +0 2528 2804 +0 2528 2804 +0 2529 2803 +0 2529 2803 +0 2530 2802 +0 2532 2801 +0 2533 2799 +0 2536 2797 +0 2538 2794 +0 2542 2791 +0 2548 2786 +0 2554 2779 +0 2563 2770 +0 2575 2758 +0 2590 2741 +0 2610 2717 +0 2635 2683 +0 2666 2633 +0 2705 2556 +0 2752 2428 +0 2808 2168 +0 2874 0 +0 2949 0 +0 3034 0 +0 3126 0 +0 3227 0 +0 3334 0 +0 3446 0 +0 3563 0 +0 3683 0 +0 2528 2808 +0 2529 2808 +0 2529 2808 +0 2529 2808 +0 2530 2807 +0 2531 2807 +0 2531 2806 +0 2533 2805 +0 2534 2803 +0 2537 2801 +0 2539 2799 +0 2543 2795 +0 2549 2790 +0 2555 2783 +0 2564 2775 +0 2576 2762 +0 2591 2745 +0 2611 2722 +0 2635 2688 +0 2667 2639 +0 2705 2563 +0 2752 2437 +0 2809 2184 +0 2874 0 +0 2949 0 +0 3034 0 +0 3127 0 +0 3227 0 +0 3334 0 +0 3446 0 +0 3563 0 +0 3683 0 +0 2530 2814 +0 2530 2813 +0 2530 2813 +0 2531 2813 +0 2531 2812 +0 2532 2812 +0 2533 2811 +0 2534 2810 +0 2536 2808 +0 2538 2806 +0 2541 2804 +0 2545 2800 +0 2550 2795 +0 2557 2789 +0 2565 2780 +0 2577 2768 +0 2592 2751 +0 2612 2728 +0 2636 2695 +0 2668 2646 +0 2706 2572 +0 2753 2449 +0 2809 2204 +0 2875 806 +0 2950 0 +0 3034 0 +0 3127 0 +0 3227 0 +0 3334 0 +0 3446 0 +0 3563 0 +0 3683 0 +0 2532 2821 +0 2532 2820 +0 2532 2820 +0 2532 2820 +0 2533 2819 +0 2534 2819 +0 2535 2818 +0 2536 2817 +0 2537 2815 +0 2540 2814 +0 2543 2811 +0 2546 2807 +0 2552 2803 +0 2558 2796 +0 2567 2788 +0 2579 2776 +0 2594 2759 +0 2613 2736 +0 2638 2704 +0 2669 2656 +0 2708 2584 +0 2754 2464 +0 2810 2230 +0 2876 1179 +0 2951 0 +0 3035 0 +0 3128 0 +0 3228 0 +0 3334 0 +0 3446 0 +0 3563 0 +0 3683 0 +0 2534 2830 +0 2534 2829 +0 2534 2829 +0 2535 2829 +0 2535 2828 +0 2536 2828 +0 2537 2827 +0 2538 2826 +0 2540 2825 +0 2542 2823 +0 2545 2820 +0 2549 2817 +0 2554 2812 +0 2561 2806 +0 2569 2797 +0 2581 2786 +0 2596 2770 +0 2615 2747 +0 2640 2716 +0 2671 2669 +0 2709 2599 +0 2756 2484 +0 2812 2263 +0 2877 1432 +0 2952 0 +0 3036 0 +0 3128 0 +0 3228 0 +0 3335 0 +0 3447 0 +0 3563 0 +0 3683 0 +0 2537 2842 +0 2537 2841 +0 2538 2841 +0 2538 2841 +0 2539 2840 +0 2539 2840 +0 2540 2839 +0 2541 2838 +0 2543 2837 +0 2545 2835 +0 2548 2832 +0 2552 2829 +0 2557 2824 +0 2564 2818 +0 2572 2810 +0 2584 2799 +0 2599 2783 +0 2618 2761 +0 2642 2731 +0 2673 2686 +0 2711 2618 +0 2758 2509 +0 2813 2303 +0 2878 1638 +0 2953 0 +0 3037 0 +0 3129 0 +0 3229 0 +0 3335 0 +0 3447 0 +0 3564 0 +0 3684 0 +0 2541 2857 +0 2542 2857 +0 2542 2857 +0 2542 2856 +0 2543 2856 +0 2543 2855 +0 2544 2854 +0 2546 2854 +0 2547 2852 +0 2549 2850 +0 2552 2848 +0 2556 2845 +0 2561 2840 +0 2568 2835 +0 2576 2827 +0 2588 2816 +0 2602 2801 +0 2621 2780 +0 2646 2750 +0 2676 2708 +0 2714 2643 +0 2760 2540 +0 2816 2351 +0 2880 1818 +0 2955 0 +0 3038 0 +0 3130 0 +0 3230 0 +0 3336 0 +0 3448 0 +0 3564 0 +0 3684 0 +0 2547 2877 +0 2547 2877 +0 2547 2876 +0 2548 2876 +0 2548 2876 +0 2549 2875 +0 2550 2874 +0 2551 2873 +0 2553 2872 +0 2555 2870 +0 2558 2868 +0 2561 2865 +0 2566 2861 +0 2573 2855 +0 2581 2848 +0 2593 2837 +0 2607 2823 +0 2626 2803 +0 2650 2775 +0 2680 2735 +0 2718 2675 +0 2764 2579 +0 2819 2409 +0 2883 1983 +0 2957 0 +0 3040 0 +0 3132 0 +0 3231 0 +0 3337 0 +0 3449 0 +0 3565 0 +0 3684 0 +1040 2554 2902 +1028 2555 2902 +1011 2555 2902 +986 2555 2901 +952 2556 2901 +901 2556 2900 +823 2557 2900 +692 2558 2899 +422 2560 2898 +0 2562 2896 +0 2565 2894 +0 2569 2891 +0 2573 2887 +0 2580 2882 +0 2588 2875 +0 2599 2865 +0 2614 2851 +0 2632 2833 +0 2656 2806 +0 2686 2769 +0 2723 2713 +0 2768 2627 +0 2823 2476 +0 2887 2139 +0 2960 0 +0 3043 0 +0 3134 0 +0 3233 0 +0 3338 0 +0 3450 0 +0 3565 0 +0 3685 0 +2058 2564 2934 +2057 2564 2933 +2055 2565 2933 +2053 2565 2933 +2050 2565 2933 +2045 2566 2932 +2039 2567 2932 +2032 2568 2931 +2021 2570 2930 +2006 2572 2928 +1985 2574 2926 +1956 2578 2923 +1914 2583 2920 +1850 2589 2915 +1749 2597 2908 +1564 2608 2899 +1057 2622 2887 +0 2641 2869 +0 2664 2845 +0 2693 2811 +0 2730 2761 +0 2775 2683 +0 2828 2553 +0 2891 2287 +0 2964 0 +0 3046 0 +0 3137 0 +0 3235 0 +0 3340 0 +0 3451 0 +0 3566 0 +0 3686 0 +2415 2577 2973 +2415 2577 2973 +2414 2577 2972 +2413 2578 2972 +2412 2578 2972 +2410 2579 2971 +2407 2580 2971 +2404 2581 2970 +2399 2582 2969 +2392 2584 2968 +2384 2587 2966 +2372 2590 2963 +2355 2595 2960 +2332 2601 2956 +2300 2609 2949 +2252 2620 2941 +2179 2633 2930 +2059 2651 2914 +1824 2674 2892 +744 2703 2862 +0 2739 2817 +0 2783 2749 +0 2835 2639 +0 2898 2431 +0 2969 1756 +0 3050 0 +0 3140 0 +0 3238 0 +0 3342 0 +0 3453 0 +0 3568 0 +0 3687 0 +2664 2593 3020 +2664 2593 3020 +2663 2594 3020 +2663 2594 3020 +2662 2594 3020 +2661 2595 3019 +2659 2596 3019 +2657 2597 3018 +2654 2598 3017 +2651 2600 3016 +2646 2603 3014 +2639 2606 3012 +2630 2611 3009 +2618 2617 3005 +2601 2624 2999 +2577 2635 2992 +2543 2648 2982 +2493 2665 2968 +2416 2687 2949 +2287 2715 2922 +2025 2750 2883 +0 2793 2824 +0 2845 2733 +0 2906 2572 +0 2976 2191 +0 3056 0 +0 3145 0 +0 3242 0 +0 3345 0 +0 3455 0 +0 3570 0 +0 3688 0 +2867 2614 3077 +2867 2614 3077 +2867 2615 3077 +2866 2615 3077 +2866 2615 3076 +2865 2616 3076 +2864 2617 3076 +2863 2618 3075 +2861 2619 3074 +2859 2621 3073 +2856 2623 3072 +2851 2627 3070 +2846 2631 3067 +2838 2637 3063 +2828 2644 3059 +2813 2654 3052 +2793 2667 3043 +2765 2683 3031 +2724 2705 3014 +2664 2731 2991 +2567 2765 2958 +2395 2807 2909 +1957 2857 2835 +0 2916 2711 +0 2985 2465 +0 3064 979 +0 3151 0 +0 3247 0 +0 3350 0 +0 3458 0 +0 3572 0 +0 3690 0 +3046 2641 3143 +3046 2641 3143 +3046 2641 3143 +3045 2642 3143 +3045 2642 3143 +3044 2643 3142 +3044 2643 3142 +3043 2644 3142 +3042 2646 3141 +3040 2647 3140 +3038 2650 3139 +3035 2653 3137 +3032 2657 3135 +3027 2662 3132 +3020 2669 3127 +3010 2678 3122 +2997 2691 3114 +2980 2706 3104 +2955 2727 3090 +2919 2752 3070 +2867 2785 3042 +2786 2824 3002 +2648 2873 2942 +2356 2930 2848 +0 2997 2679 +0 3074 2263 +0 3160 0 +0 3254 0 +0 3355 0 +0 3463 0 +0 3576 0 +0 3693 0 +3210 2674 3219 +3210 2674 3219 +3210 2675 3219 +3210 2675 3219 +3209 2675 3219 +3209 2676 3218 +3209 2677 3218 +3208 2677 3218 +3207 2679 3217 +3206 2680 3216 +3205 2682 3215 +3203 2685 3214 +3200 2689 3212 +3197 2694 3209 +3192 2701 3206 +3185 2709 3201 +3177 2721 3195 +3165 2735 3186 +3148 2754 3174 +3126 2779 3158 +3093 2809 3135 +3045 2847 3103 +2973 2893 3055 +2853 2948 2983 +2618 3013 2865 +1555 3087 2634 +0 3171 1643 +0 3263 0 +0 3362 0 +0 3468 0 +0 3580 0 +0 3696 0 +3365 2716 3304 +3365 2716 3304 +3364 2716 3304 +3364 2716 3304 +3364 2716 3304 +3364 2717 3303 +3364 2718 3303 +3363 2718 3303 +3363 2719 3302 +3362 2721 3302 +3361 2723 3301 +3359 2725 3300 +3358 2729 3298 +3355 2734 3296 +3352 2740 3293 +3347 2748 3289 +3341 2758 3284 +3333 2772 3277 +3322 2789 3267 +3306 2812 3254 +3285 2840 3235 +3254 2876 3210 +3209 2919 3173 +3142 2971 3118 +3033 3033 3033 +2828 3104 2887 +2176 3185 2564 +0 3274 0 +0 3372 0 +0 3476 0 +0 3586 0 +0 3701 0 +3513 2765 3397 +3513 2765 3397 +3513 2766 3397 +3513 2766 3397 +3513 2766 3397 +3512 2767 3397 +3512 2767 3397 +3512 2768 3396 +3511 2769 3396 +3511 2770 3395 +3510 2772 3395 +3509 2774 3394 +3508 2777 3392 +3506 2781 3391 +3504 2787 3388 +3500 2794 3385 +3496 2804 3381 +3490 2816 3375 +3482 2832 3367 +3471 2852 3357 +3457 2878 3342 +3436 2911 3322 +3406 2951 3293 +3364 3000 3252 +3300 3058 3190 +3198 3126 3092 +3011 3203 2914 +2491 3289 2450 +0 3384 0 +0 3486 0 +0 3594 0 +0 3707 0 +3657 2824 3498 +3657 2824 3498 +3657 2825 3498 +3657 2825 3498 +3656 2825 3498 +3656 2825 3498 +3656 2826 3497 +3656 2827 3497 +3656 2827 3497 +3655 2829 3497 +3655 2830 3496 +3654 2832 3495 +3653 2835 3494 +3652 2839 3493 +3650 2843 3491 +3648 2850 3488 +3645 2858 3485 +3640 2869 3480 +3635 2883 3474 +3627 2902 3466 +3616 2925 3454 +3602 2955 3439 +3582 2992 3417 +3553 3036 3386 +3512 3090 3340 +3451 3154 3272 +3353 3227 3160 +3177 3309 2949 +2723 3400 2233 +0 3498 0 +0 3604 0 +0 3715 0 +3797 2893 3605 +3797 2893 3605 +3797 2893 3605 +3797 2893 3605 +3797 2894 3605 +3797 2894 3605 +3797 2894 3605 +3797 2895 3605 +3797 2896 3604 +3796 2897 3604 +3796 2898 3604 +3795 2900 3603 +3795 2902 3602 +3794 2905 3601 +3792 2909 3600 +3791 2915 3598 +3788 2922 3595 +3785 2932 3591 +3781 2944 3587 +3776 2960 3580 +3768 2981 3571 +3758 3007 3559 +3744 3040 3542 +3724 3081 3519 +3696 3130 3486 +3656 3188 3437 +3596 3256 3362 +3502 3334 3238 +3333 3420 2991 +2918 3515 1456 +0 3617 0 +0 3725 0 +3936 2971 3718 +3936 2971 3718 +3936 2971 3718 +3936 2971 3718 +3936 2972 3718 +3936 2972 3717 +3935 2972 3717 +3935 2973 3717 +3935 2973 3717 +3935 2974 3717 +3935 2975 3716 +3934 2977 3716 +3934 2979 3715 +3933 2981 3714 +3932 2985 3713 +3931 2990 3712 +3929 2996 3710 +3927 3004 3707 +3924 3015 3703 +3920 3028 3698 +3914 3046 3691 +3907 3069 3682 +3897 3098 3669 +3883 3134 3652 +3863 3178 3627 +3836 3231 3592 +3797 3293 3540 +3738 3365 3460 +3646 3446 3325 +3483 3536 3042 +3092 3634 0 +0 3738 0 +4073 3058 3835 +4073 3058 3835 +4072 3058 3835 +4072 3058 3835 +4072 3059 3834 +4072 3059 3834 +4072 3059 3834 +4072 3059 3834 +4072 3060 3834 +4072 3061 3834 +4072 3062 3834 +4071 3063 3833 +4071 3064 3833 +4071 3067 3832 +4070 3070 3831 +4069 3073 3830 +4068 3079 3828 +4066 3085 3826 +4064 3094 3823 +4061 3106 3820 +4057 3121 3814 +4051 3140 3807 +4044 3165 3798 +4034 3196 3784 +4020 3235 3766 +4001 3282 3741 +3974 3338 3704 +3935 3404 3650 +3877 3479 3565 +3787 3563 3420 +3627 3656 3103 +3253 3756 0 +4095 3153 3955 +4095 3153 3955 +4095 3153 3955 +4095 3154 3955 +4095 3154 3955 +4095 3154 3955 +4095 3154 3955 +4095 3154 3955 +4095 3155 3955 +4095 3155 3954 +4095 3156 3954 +4095 3157 3954 +4095 3159 3954 +4095 3160 3953 +4095 3163 3952 +4095 3166 3951 +4095 3170 3950 +4095 3176 3949 +4095 3183 3946 +4095 3192 3943 +4095 3205 3940 +4095 3221 3934 +4095 3242 3927 +4095 3269 3917 +4095 3302 3903 +4095 3342 3885 +4095 3392 3858 +4095 3451 3820 +4072 3519 3764 +4015 3596 3676 +3925 3683 3522 +3768 3778 3173 +4095 3256 4078 +4095 3256 4078 +4095 3256 4078 +4095 3256 4078 +4095 3256 4078 +4095 3256 4078 +4095 3256 4078 +4095 3257 4078 +4095 3257 4078 +4095 3257 4078 +4095 3258 4078 +4095 3259 4077 +4095 3260 4077 +4095 3261 4077 +4095 3263 4076 +4095 3266 4075 +4095 3269 4075 +4095 3274 4073 +4095 3280 4072 +4095 3287 4069 +4095 3297 4066 +4095 3311 4062 +4095 3328 4057 +4095 3350 4049 +4095 3378 4039 +4095 3413 4025 +4095 3455 4006 +4095 3507 3979 +4095 3567 3940 +4095 3638 3882 +4095 3718 3791 +4062 3806 3631 +0 2656 2925 +0 2657 2925 +0 2657 2925 +0 2657 2925 +0 2658 2924 +0 2658 2924 +0 2659 2923 +0 2660 2923 +0 2661 2921 +0 2663 2920 +0 2665 2918 +0 2668 2915 +0 2672 2911 +0 2677 2906 +0 2684 2899 +0 2693 2890 +0 2705 2878 +0 2720 2860 +0 2739 2835 +0 2764 2800 +0 2796 2749 +0 2835 2669 +0 2882 2534 +0 2939 2253 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2657 2926 +0 2657 2926 +0 2657 2925 +0 2657 2925 +0 2658 2925 +0 2658 2924 +0 2659 2924 +0 2660 2923 +0 2661 2922 +0 2663 2920 +0 2665 2918 +0 2668 2915 +0 2672 2912 +0 2677 2907 +0 2684 2900 +0 2693 2890 +0 2705 2878 +0 2720 2860 +0 2739 2836 +0 2765 2801 +0 2796 2749 +0 2835 2669 +0 2882 2535 +0 2939 2254 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2657 2926 +0 2657 2926 +0 2657 2926 +0 2657 2925 +0 2658 2925 +0 2658 2925 +0 2659 2924 +0 2660 2923 +0 2661 2922 +0 2663 2920 +0 2665 2918 +0 2668 2916 +0 2672 2912 +0 2677 2907 +0 2684 2900 +0 2693 2891 +0 2705 2878 +0 2720 2861 +0 2740 2836 +0 2765 2801 +0 2796 2749 +0 2835 2670 +0 2882 2535 +0 2939 2255 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2657 2926 +0 2657 2926 +0 2657 2926 +0 2657 2926 +0 2658 2925 +0 2658 2925 +0 2659 2924 +0 2660 2923 +0 2661 2922 +0 2663 2921 +0 2665 2919 +0 2668 2916 +0 2672 2912 +0 2677 2907 +0 2684 2900 +0 2693 2891 +0 2705 2879 +0 2720 2861 +0 2740 2836 +0 2765 2801 +0 2796 2750 +0 2835 2670 +0 2882 2536 +0 2939 2257 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2657 2927 +0 2657 2927 +0 2657 2927 +0 2657 2926 +0 2658 2926 +0 2658 2925 +0 2659 2925 +0 2660 2924 +0 2661 2923 +0 2663 2921 +0 2665 2919 +0 2668 2917 +0 2672 2913 +0 2677 2908 +0 2684 2901 +0 2693 2892 +0 2705 2879 +0 2720 2862 +0 2740 2837 +0 2765 2802 +0 2796 2751 +0 2835 2671 +0 2882 2537 +0 2939 2259 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2657 2928 +0 2657 2927 +0 2657 2927 +0 2658 2927 +0 2658 2927 +0 2659 2926 +0 2659 2926 +0 2660 2925 +0 2661 2924 +0 2663 2922 +0 2665 2920 +0 2668 2917 +0 2672 2914 +0 2677 2909 +0 2684 2902 +0 2693 2893 +0 2705 2880 +0 2720 2862 +0 2740 2838 +0 2765 2803 +0 2796 2752 +0 2835 2673 +0 2882 2539 +0 2939 2262 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2657 2929 +0 2657 2928 +0 2658 2928 +0 2658 2928 +0 2658 2928 +0 2659 2927 +0 2660 2926 +0 2660 2926 +0 2662 2925 +0 2663 2923 +0 2666 2921 +0 2669 2918 +0 2672 2915 +0 2678 2910 +0 2684 2903 +0 2693 2894 +0 2705 2881 +0 2720 2864 +0 2740 2839 +0 2765 2804 +0 2796 2753 +0 2835 2674 +0 2883 2541 +0 2939 2266 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2658 2930 +0 2658 2930 +0 2658 2929 +0 2658 2929 +0 2659 2929 +0 2659 2928 +0 2660 2928 +0 2661 2927 +0 2662 2926 +0 2664 2924 +0 2666 2922 +0 2669 2919 +0 2673 2916 +0 2678 2911 +0 2685 2904 +0 2694 2895 +0 2706 2882 +0 2721 2865 +0 2740 2841 +0 2765 2806 +0 2797 2755 +0 2836 2676 +0 2883 2544 +0 2939 2271 +0 3005 0 +0 3080 0 +0 3165 0 +0 3258 0 +0 3358 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2658 2931 +0 2658 2931 +0 2658 2931 +0 2659 2931 +0 2659 2931 +0 2660 2930 +0 2660 2929 +0 2661 2929 +0 2662 2927 +0 2664 2926 +0 2666 2924 +0 2669 2921 +0 2673 2918 +0 2678 2913 +0 2685 2906 +0 2694 2897 +0 2706 2884 +0 2721 2867 +0 2741 2843 +0 2766 2808 +0 2797 2757 +0 2836 2679 +0 2883 2548 +0 2939 2279 +0 3005 0 +0 3081 0 +0 3165 0 +0 3258 0 +0 3359 0 +0 3465 0 +0 3578 0 +0 3694 0 +0 2659 2934 +0 2659 2934 +0 2659 2933 +0 2659 2933 +0 2660 2933 +0 2660 2932 +0 2661 2932 +0 2662 2931 +0 2663 2930 +0 2665 2928 +0 2667 2926 +0 2670 2924 +0 2674 2920 +0 2679 2915 +0 2686 2908 +0 2695 2899 +0 2706 2887 +0 2722 2870 +0 2741 2845 +0 2766 2811 +0 2797 2761 +0 2836 2683 +0 2883 2553 +0 2940 2288 +0 3006 0 +0 3081 0 +0 3165 0 +0 3258 0 +0 3359 0 +0 3466 0 +0 3578 0 +0 3695 0 +0 2659 2937 +0 2659 2937 +0 2660 2936 +0 2660 2936 +0 2660 2936 +0 2661 2935 +0 2662 2935 +0 2663 2934 +0 2664 2933 +0 2665 2931 +0 2668 2929 +0 2671 2927 +0 2674 2923 +0 2680 2918 +0 2686 2911 +0 2695 2902 +0 2707 2890 +0 2722 2873 +0 2742 2849 +0 2767 2815 +0 2798 2765 +0 2837 2688 +0 2884 2560 +0 2940 2300 +0 3006 0 +0 3081 0 +0 3166 0 +0 3258 0 +0 3359 0 +0 3466 0 +0 3578 0 +0 3695 0 +0 2660 2941 +0 2660 2941 +0 2661 2940 +0 2661 2940 +0 2661 2940 +0 2662 2939 +0 2663 2939 +0 2664 2938 +0 2665 2937 +0 2666 2935 +0 2669 2933 +0 2672 2931 +0 2675 2927 +0 2681 2922 +0 2687 2916 +0 2696 2907 +0 2708 2894 +0 2723 2877 +0 2743 2854 +0 2768 2820 +0 2799 2771 +0 2837 2695 +0 2885 2569 +0 2941 2316 +0 3006 0 +0 3082 0 +0 3166 0 +0 3259 0 +0 3359 0 +0 3466 0 +0 3578 0 +0 3695 0 +0 2662 2946 +0 2662 2946 +0 2662 2946 +0 2662 2945 +0 2663 2945 +0 2663 2945 +0 2664 2944 +0 2665 2943 +0 2666 2942 +0 2668 2941 +0 2670 2939 +0 2673 2936 +0 2677 2932 +0 2682 2928 +0 2689 2921 +0 2698 2912 +0 2709 2900 +0 2724 2883 +0 2744 2860 +0 2769 2827 +0 2800 2778 +0 2838 2704 +0 2885 2581 +0 2941 2336 +0 3007 938 +0 3082 0 +0 3166 0 +0 3259 0 +0 3359 0 +0 3466 0 +0 3578 0 +0 3695 0 +0 2663 2953 +0 2664 2953 +0 2664 2952 +0 2664 2952 +0 2665 2952 +0 2665 2951 +0 2666 2951 +0 2667 2950 +0 2668 2949 +0 2670 2948 +0 2672 2946 +0 2675 2943 +0 2679 2940 +0 2684 2935 +0 2690 2928 +0 2699 2920 +0 2711 2908 +0 2726 2891 +0 2745 2868 +0 2770 2836 +0 2801 2788 +0 2840 2716 +0 2886 2596 +0 2942 2362 +0 3008 1311 +0 3083 0 +0 3167 0 +0 3260 0 +0 3360 0 +0 3466 0 +0 3579 0 +0 3695 0 +0 2666 2962 +0 2666 2962 +0 2666 2962 +0 2667 2961 +0 2667 2961 +0 2667 2961 +0 2668 2960 +0 2669 2959 +0 2670 2958 +0 2672 2957 +0 2674 2955 +0 2677 2952 +0 2681 2949 +0 2686 2944 +0 2693 2938 +0 2701 2929 +0 2713 2918 +0 2728 2902 +0 2747 2879 +0 2772 2848 +0 2803 2801 +0 2841 2731 +0 2888 2616 +0 2944 2395 +0 3009 1565 +0 3084 0 +0 3168 0 +0 3260 0 +0 3360 0 +0 3467 0 +0 3579 0 +0 3695 0 +0 2669 2974 +0 2669 2974 +0 2669 2973 +0 2670 2973 +0 2670 2973 +0 2671 2972 +0 2671 2972 +0 2672 2971 +0 2673 2970 +0 2675 2969 +0 2677 2967 +0 2680 2964 +0 2684 2961 +0 2689 2957 +0 2696 2950 +0 2704 2942 +0 2716 2931 +0 2731 2915 +0 2750 2894 +0 2774 2863 +0 2805 2818 +0 2843 2751 +0 2890 2641 +0 2945 2435 +0 3010 1770 +0 3085 0 +0 3169 0 +0 3261 0 +0 3361 0 +0 3467 0 +0 3579 0 +0 3696 0 +0 2673 2989 +0 2673 2989 +0 2674 2989 +0 2674 2989 +0 2674 2988 +0 2675 2988 +0 2676 2987 +0 2676 2987 +0 2678 2986 +0 2679 2984 +0 2681 2982 +0 2684 2980 +0 2688 2977 +0 2693 2973 +0 2700 2967 +0 2708 2959 +0 2720 2948 +0 2735 2933 +0 2754 2912 +0 2778 2882 +0 2808 2840 +0 2846 2775 +0 2893 2672 +0 2948 2483 +0 3013 1950 +0 3087 0 +0 3170 0 +0 3262 0 +0 3362 0 +0 3468 0 +0 3580 0 +0 3696 0 +0 2679 3009 +0 2679 3009 +0 2679 3009 +0 2680 3008 +0 2680 3008 +0 2680 3008 +0 2681 3007 +0 2682 3007 +0 2683 3006 +0 2685 3004 +0 2687 3003 +0 2690 3000 +0 2693 2997 +0 2698 2993 +0 2705 2987 +0 2714 2980 +0 2725 2969 +0 2739 2955 +0 2758 2935 +0 2782 2907 +0 2813 2867 +0 2850 2807 +0 2896 2711 +0 2951 2541 +0 3015 2115 +0 3089 0 +0 3172 0 +0 3264 0 +0 3363 0 +0 3469 0 +0 3581 0 +0 3697 0 +1182 2686 3034 +1173 2686 3034 +1160 2687 3034 +1143 2687 3034 +1119 2687 3033 +1084 2688 3033 +1033 2688 3033 +955 2689 3032 +824 2691 3031 +554 2692 3030 +0 2694 3028 +0 2697 3026 +0 2701 3023 +0 2706 3019 +0 2712 3014 +0 2720 3007 +0 2731 2997 +0 2746 2983 +0 2764 2965 +0 2788 2939 +0 2818 2901 +0 2855 2846 +0 2901 2759 +0 2955 2608 +0 3019 2271 +0 3092 0 +0 3175 0 +0 3266 0 +0 3365 0 +0 3470 0 +0 3582 0 +0 3697 0 +2191 2696 3066 +2190 2696 3066 +2189 2696 3066 +2187 2697 3065 +2185 2697 3065 +2182 2698 3065 +2177 2698 3064 +2172 2699 3064 +2164 2700 3063 +2153 2702 3062 +2138 2704 3060 +2117 2706 3058 +2088 2710 3055 +2046 2715 3052 +1983 2721 3047 +1881 2729 3040 +1696 2740 3031 +1189 2754 3019 +0 2773 3001 +0 2796 2977 +0 2825 2943 +0 2862 2893 +0 2907 2815 +0 2960 2685 +0 3023 2419 +0 3096 0 +0 3178 0 +0 3269 0 +0 3367 0 +0 3472 0 +0 3583 0 +0 3699 0 +2548 2709 3105 +2548 2709 3105 +2547 2709 3105 +2546 2709 3105 +2545 2710 3104 +2544 2710 3104 +2542 2711 3104 +2539 2712 3103 +2536 2713 3102 +2531 2714 3101 +2524 2716 3100 +2516 2719 3098 +2504 2722 3095 +2487 2727 3092 +2464 2733 3088 +2432 2741 3082 +2384 2752 3073 +2311 2766 3062 +2191 2783 3046 +1956 2806 3025 +876 2835 2994 +0 2871 2949 +0 2915 2881 +0 2967 2771 +0 3030 2564 +0 3101 1888 +0 3182 0 +0 3272 0 +0 3370 0 +0 3474 0 +0 3585 0 +0 3700 0 +2796 2725 3153 +2796 2725 3152 +2796 2725 3152 +2795 2726 3152 +2795 2726 3152 +2794 2726 3152 +2793 2727 3151 +2791 2728 3151 +2789 2729 3150 +2787 2730 3149 +2783 2732 3148 +2778 2735 3146 +2771 2738 3144 +2762 2743 3141 +2750 2749 3137 +2733 2756 3131 +2709 2767 3124 +2675 2780 3114 +2625 2797 3100 +2548 2819 3081 +2419 2847 3054 +2157 2882 3015 +0 2925 2957 +0 2977 2865 +0 3038 2704 +0 3108 2323 +0 3188 0 +0 3277 0 +0 3374 0 +0 3478 0 +0 3587 0 +0 3702 0 +2999 2746 3209 +2999 2746 3209 +2999 2746 3209 +2999 2747 3209 +2998 2747 3209 +2998 2747 3209 +2997 2748 3208 +2996 2749 3208 +2995 2750 3207 +2993 2751 3206 +2991 2753 3205 +2988 2755 3204 +2984 2759 3202 +2978 2763 3199 +2970 2769 3196 +2960 2776 3191 +2945 2786 3184 +2925 2799 3175 +2897 2815 3163 +2857 2837 3147 +2796 2864 3123 +2699 2897 3090 +2527 2939 3041 +2089 2989 2967 +0 3048 2843 +0 3118 2597 +0 3196 1111 +0 3283 0 +0 3379 0 +0 3482 0 +0 3590 0 +0 3704 0 +3178 2773 3276 +3178 2773 3275 +3178 2773 3275 +3178 2773 3275 +3177 2774 3275 +3177 2774 3275 +3177 2775 3275 +3176 2775 3274 +3175 2776 3274 +3174 2778 3273 +3172 2779 3272 +3170 2782 3271 +3167 2785 3269 +3164 2789 3267 +3159 2794 3264 +3152 2801 3260 +3142 2811 3254 +3130 2823 3246 +3112 2838 3236 +3087 2859 3222 +3051 2884 3202 +2999 2917 3174 +2918 2956 3134 +2780 3005 3074 +2488 3062 2980 +0 3130 2811 +0 3206 2395 +0 3292 0 +0 3386 0 +0 3487 0 +0 3595 0 +0 3708 0 +3342 2806 3351 +3342 2806 3351 +3342 2807 3351 +3342 2807 3351 +3342 2807 3351 +3341 2807 3351 +3341 2808 3350 +3341 2809 3350 +3340 2810 3350 +3339 2811 3349 +3338 2812 3348 +3337 2814 3347 +3335 2817 3346 +3332 2821 3344 +3329 2826 3341 +3324 2833 3338 +3318 2841 3333 +3309 2853 3327 +3297 2867 3318 +3281 2886 3306 +3258 2911 3290 +3225 2941 3267 +3177 2979 3235 +3105 3025 3187 +2985 3080 3115 +2750 3145 2997 +1687 3219 2766 +0 3303 1775 +0 3395 0 +0 3494 0 +0 3600 0 +0 3712 0 +3497 2847 3436 +3497 2848 3436 +3497 2848 3436 +3497 2848 3436 +3496 2848 3436 +3496 2849 3436 +3496 2849 3436 +3496 2850 3435 +3495 2850 3435 +3495 2852 3434 +3494 2853 3434 +3493 2855 3433 +3492 2858 3432 +3490 2861 3430 +3487 2866 3428 +3484 2872 3425 +3479 2880 3421 +3473 2890 3416 +3465 2904 3409 +3454 2921 3399 +3438 2944 3386 +3417 2972 3368 +3386 3008 3342 +3341 3051 3305 +3274 3103 3250 +3165 3165 3165 +2960 3236 3019 +2308 3317 2696 +0 3406 0 +0 3504 0 +0 3608 0 +0 3718 0 +3645 2897 3529 +3645 2897 3529 +3645 2898 3529 +3645 2898 3529 +3645 2898 3529 +3645 2898 3529 +3644 2899 3529 +3644 2899 3529 +3644 2900 3528 +3644 2901 3528 +3643 2902 3527 +3642 2904 3527 +3641 2906 3526 +3640 2909 3524 +3638 2914 3523 +3636 2919 3520 +3633 2926 3517 +3628 2936 3513 +3622 2948 3507 +3614 2964 3500 +3604 2984 3489 +3589 3011 3474 +3568 3043 3454 +3539 3084 3426 +3496 3132 3384 +3432 3191 3322 +3330 3258 3224 +3143 3335 3046 +2623 3421 2582 +0 3516 0 +0 3618 0 +0 3726 0 +3789 2956 3630 +3789 2956 3630 +3789 2957 3630 +3789 2957 3630 +3789 2957 3630 +3789 2957 3630 +3788 2958 3630 +3788 2958 3630 +3788 2959 3629 +3788 2960 3629 +3787 2961 3629 +3787 2962 3628 +3786 2964 3627 +3785 2967 3626 +3784 2971 3625 +3782 2976 3623 +3780 2982 3620 +3777 2990 3617 +3772 3001 3613 +3767 3015 3606 +3759 3034 3598 +3748 3057 3587 +3734 3087 3571 +3714 3124 3549 +3685 3169 3518 +3644 3222 3473 +3583 3286 3404 +3485 3359 3292 +3309 3441 3081 +2855 3532 2365 +0 3630 0 +0 3736 0 +3929 3025 3737 +3929 3025 3737 +3929 3025 3737 +3929 3025 3737 +3929 3026 3737 +3929 3026 3737 +3929 3026 3737 +3929 3026 3737 +3929 3027 3737 +3929 3028 3736 +3928 3029 3736 +3928 3030 3736 +3927 3032 3735 +3927 3034 3734 +3926 3037 3733 +3925 3042 3732 +3923 3047 3730 +3921 3054 3727 +3918 3064 3723 +3913 3076 3719 +3908 3092 3712 +3900 3113 3703 +3890 3139 3691 +3876 3172 3674 +3856 3213 3651 +3828 3262 3618 +3788 3320 3569 +3728 3388 3494 +3634 3466 3370 +3465 3552 3123 +3050 3647 1588 +0 3749 0 +4068 3103 3850 +4068 3103 3850 +4068 3103 3850 +4068 3103 3850 +4068 3104 3850 +4068 3104 3850 +4068 3104 3850 +4068 3104 3849 +4067 3105 3849 +4067 3105 3849 +4067 3106 3849 +4067 3107 3849 +4066 3109 3848 +4066 3111 3847 +4065 3114 3847 +4064 3117 3845 +4063 3122 3844 +4061 3128 3842 +4059 3136 3839 +4056 3147 3835 +4052 3160 3830 +4046 3178 3823 +4039 3201 3814 +4029 3230 3801 +4015 3266 3784 +3995 3310 3759 +3968 3363 3724 +3929 3425 3672 +3870 3497 3592 +3778 3578 3457 +3615 3668 3174 +3224 3766 0 +4095 3190 3967 +4095 3190 3967 +4095 3190 3967 +4095 3190 3967 +4095 3191 3967 +4095 3191 3967 +4095 3191 3967 +4095 3191 3966 +4095 3192 3966 +4095 3192 3966 +4095 3193 3966 +4095 3194 3966 +4095 3195 3965 +4095 3197 3965 +4095 3199 3964 +4095 3202 3963 +4095 3206 3962 +4095 3211 3961 +4095 3217 3958 +4095 3226 3956 +4095 3238 3952 +4095 3253 3946 +4095 3273 3939 +4095 3297 3930 +4095 3328 3917 +4095 3367 3898 +4095 3414 3873 +4095 3470 3836 +4067 3536 3782 +4009 3611 3697 +3919 3695 3552 +3759 3788 3235 +4095 3285 4087 +4095 3285 4087 +4095 3286 4087 +4095 3286 4087 +4095 3286 4087 +4095 3286 4087 +4095 3286 4087 +4095 3286 4087 +4095 3287 4087 +4095 3287 4087 +4095 3288 4087 +4095 3288 4086 +4095 3289 4086 +4095 3291 4086 +4095 3292 4085 +4095 3295 4084 +4095 3298 4084 +4095 3302 4082 +4095 3308 4081 +4095 3315 4079 +4095 3325 4076 +4095 3337 4072 +4095 3353 4066 +4095 3374 4059 +4095 3401 4049 +4095 3434 4036 +4095 3475 4017 +4095 3524 3990 +4095 3583 3952 +4095 3651 3896 +4095 3729 3808 +4057 3815 3655 +0 2788 3057 +0 2789 3057 +0 2789 3057 +0 2789 3057 +0 2789 3057 +0 2790 3056 +0 2790 3056 +0 2791 3055 +0 2792 3054 +0 2793 3053 +0 2795 3052 +0 2797 3050 +0 2800 3047 +0 2804 3043 +0 2809 3038 +0 2816 3031 +0 2825 3022 +0 2837 3009 +0 2852 2992 +0 2872 2967 +0 2897 2932 +0 2928 2880 +0 2967 2801 +0 3014 2666 +0 3071 2384 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2788 3058 +0 2789 3058 +0 2789 3057 +0 2789 3057 +0 2789 3057 +0 2790 3057 +0 2790 3056 +0 2791 3055 +0 2792 3055 +0 2793 3053 +0 2795 3052 +0 2797 3050 +0 2800 3047 +0 2804 3043 +0 2809 3038 +0 2816 3032 +0 2825 3022 +0 2837 3010 +0 2852 2992 +0 2872 2967 +0 2897 2932 +0 2928 2881 +0 2967 2801 +0 3014 2666 +0 3071 2385 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2788 3058 +0 2789 3058 +0 2789 3058 +0 2789 3057 +0 2789 3057 +0 2790 3057 +0 2790 3056 +0 2791 3056 +0 2792 3055 +0 2793 3054 +0 2795 3052 +0 2797 3050 +0 2800 3047 +0 2804 3044 +0 2809 3039 +0 2816 3032 +0 2825 3023 +0 2837 3010 +0 2852 2992 +0 2872 2968 +0 2897 2933 +0 2928 2881 +0 2967 2801 +0 3014 2667 +0 3071 2386 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2789 3058 +0 2789 3058 +0 2789 3058 +0 2789 3058 +0 2789 3057 +0 2790 3057 +0 2790 3057 +0 2791 3056 +0 2792 3055 +0 2793 3054 +0 2795 3052 +0 2797 3050 +0 2800 3048 +0 2804 3044 +0 2809 3039 +0 2816 3032 +0 2825 3023 +0 2837 3010 +0 2852 2993 +0 2872 2968 +0 2897 2933 +0 2928 2881 +0 2967 2802 +0 3014 2667 +0 3071 2387 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2789 3059 +0 2789 3058 +0 2789 3058 +0 2789 3058 +0 2789 3058 +0 2790 3058 +0 2790 3057 +0 2791 3056 +0 2792 3056 +0 2793 3054 +0 2795 3053 +0 2797 3051 +0 2800 3048 +0 2804 3044 +0 2809 3039 +0 2816 3033 +0 2825 3023 +0 2837 3011 +0 2852 2993 +0 2872 2969 +0 2897 2934 +0 2928 2882 +0 2967 2802 +0 3014 2668 +0 3071 2389 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2789 3059 +0 2789 3059 +0 2789 3059 +0 2789 3059 +0 2790 3058 +0 2790 3058 +0 2791 3058 +0 2791 3057 +0 2792 3056 +0 2793 3055 +0 2795 3053 +0 2797 3051 +0 2800 3049 +0 2804 3045 +0 2809 3040 +0 2816 3033 +0 2825 3024 +0 2837 3011 +0 2852 2994 +0 2872 2969 +0 2897 2934 +0 2928 2883 +0 2967 2803 +0 3014 2670 +0 3071 2391 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2789 3060 +0 2789 3060 +0 2789 3060 +0 2789 3059 +0 2790 3059 +0 2790 3059 +0 2791 3058 +0 2791 3058 +0 2792 3057 +0 2794 3056 +0 2795 3054 +0 2797 3052 +0 2800 3049 +0 2804 3046 +0 2810 3041 +0 2816 3034 +0 2825 3025 +0 2837 3012 +0 2852 2995 +0 2872 2970 +0 2897 2935 +0 2928 2884 +0 2967 2805 +0 3015 2671 +0 3071 2394 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3490 0 +0 3597 0 +0 3710 0 +0 2789 3061 +0 2789 3061 +0 2789 3061 +0 2790 3060 +0 2790 3060 +0 2790 3060 +0 2791 3059 +0 2792 3059 +0 2793 3058 +0 2794 3057 +0 2795 3055 +0 2798 3053 +0 2801 3050 +0 2805 3047 +0 2810 3042 +0 2817 3035 +0 2826 3026 +0 2837 3013 +0 2853 2996 +0 2872 2971 +0 2897 2936 +0 2929 2885 +0 2967 2806 +0 3015 2673 +0 3071 2398 +0 3137 0 +0 3212 0 +0 3297 0 +0 3390 0 +0 3491 0 +0 3597 0 +0 3710 0 +0 2790 3062 +0 2790 3062 +0 2790 3062 +0 2790 3062 +0 2790 3061 +0 2791 3061 +0 2791 3060 +0 2792 3060 +0 2793 3059 +0 2794 3058 +0 2796 3056 +0 2798 3054 +0 2801 3052 +0 2805 3048 +0 2810 3043 +0 2817 3036 +0 2826 3027 +0 2838 3014 +0 2853 2997 +0 2872 2973 +0 2897 2938 +0 2929 2887 +0 2968 2809 +0 3015 2676 +0 3071 2404 +0 3137 0 +0 3213 0 +0 3297 0 +0 3390 0 +0 3491 0 +0 3598 0 +0 3710 0 +0 2790 3064 +0 2790 3064 +0 2790 3063 +0 2790 3063 +0 2791 3063 +0 2791 3063 +0 2792 3062 +0 2792 3062 +0 2793 3061 +0 2795 3060 +0 2796 3058 +0 2798 3056 +0 2801 3053 +0 2805 3050 +0 2810 3045 +0 2817 3038 +0 2826 3029 +0 2838 3016 +0 2853 2999 +0 2873 2975 +0 2898 2940 +0 2929 2890 +0 2968 2811 +0 3015 2680 +0 3072 2411 +0 3137 0 +0 3213 0 +0 3297 0 +0 3390 0 +0 3491 0 +0 3598 0 +0 3710 0 +0 2791 3066 +0 2791 3066 +0 2791 3066 +0 2791 3065 +0 2791 3065 +0 2792 3065 +0 2792 3064 +0 2793 3064 +0 2794 3063 +0 2795 3062 +0 2797 3060 +0 2799 3058 +0 2802 3056 +0 2806 3052 +0 2811 3047 +0 2818 3040 +0 2827 3031 +0 2838 3019 +0 2854 3002 +0 2873 2978 +0 2898 2943 +0 2930 2893 +0 2968 2815 +0 3016 2685 +0 3072 2420 +0 3138 0 +0 3213 0 +0 3297 0 +0 3390 0 +0 3491 0 +0 3598 0 +0 3710 0 +0 2791 3069 +0 2791 3069 +0 2792 3069 +0 2792 3068 +0 2792 3068 +0 2792 3068 +0 2793 3067 +0 2794 3067 +0 2795 3066 +0 2796 3065 +0 2798 3063 +0 2800 3061 +0 2803 3059 +0 2807 3055 +0 2812 3050 +0 2819 3043 +0 2827 3034 +0 2839 3022 +0 2854 3005 +0 2874 2981 +0 2899 2947 +0 2930 2897 +0 2969 2821 +0 3016 2692 +0 3072 2432 +0 3138 0 +0 3213 0 +0 3298 0 +0 3391 0 +0 3491 0 +0 3598 0 +0 3710 0 +0 2792 3073 +0 2792 3073 +0 2793 3073 +0 2793 3072 +0 2793 3072 +0 2793 3072 +0 2794 3071 +0 2795 3071 +0 2796 3070 +0 2797 3069 +0 2799 3067 +0 2801 3065 +0 2804 3063 +0 2808 3059 +0 2813 3054 +0 2819 3048 +0 2828 3039 +0 2840 3026 +0 2855 3010 +0 2875 2986 +0 2900 2952 +0 2931 2903 +0 2970 2827 +0 3017 2701 +0 3073 2448 +0 3138 0 +0 3214 0 +0 3298 0 +0 3391 0 +0 3491 0 +0 3598 0 +0 3710 0 +0 2794 3078 +0 2794 3078 +0 2794 3078 +0 2794 3078 +0 2794 3077 +0 2795 3077 +0 2795 3077 +0 2796 3076 +0 2797 3075 +0 2798 3074 +0 2800 3073 +0 2802 3071 +0 2805 3068 +0 2809 3064 +0 2814 3060 +0 2821 3053 +0 2830 3044 +0 2841 3032 +0 2856 3016 +0 2876 2992 +0 2901 2959 +0 2932 2911 +0 2970 2836 +0 3017 2713 +0 3074 2468 +0 3139 1070 +0 3214 0 +0 3298 0 +0 3391 0 +0 3491 0 +0 3598 0 +0 3710 0 +0 2795 3085 +0 2796 3085 +0 2796 3085 +0 2796 3085 +0 2796 3084 +0 2797 3084 +0 2797 3084 +0 2798 3083 +0 2799 3082 +0 2800 3081 +0 2802 3080 +0 2804 3078 +0 2807 3075 +0 2811 3072 +0 2816 3067 +0 2822 3060 +0 2831 3052 +0 2843 3040 +0 2858 3023 +0 2877 3001 +0 2902 2968 +0 2933 2920 +0 2972 2848 +0 3019 2728 +0 3075 2494 +0 3140 1443 +0 3215 0 +0 3299 0 +0 3392 0 +0 3492 0 +0 3599 0 +0 3711 0 +0 2798 3094 +0 2798 3094 +0 2798 3094 +0 2798 3094 +0 2799 3093 +0 2799 3093 +0 2800 3093 +0 2800 3092 +0 2801 3091 +0 2802 3090 +0 2804 3089 +0 2806 3087 +0 2809 3084 +0 2813 3081 +0 2818 3076 +0 2825 3070 +0 2834 3062 +0 2845 3050 +0 2860 3034 +0 2879 3011 +0 2904 2980 +0 2935 2933 +0 2973 2863 +0 3020 2748 +0 3076 2527 +0 3141 1697 +0 3216 0 +0 3300 0 +0 3392 0 +0 3492 0 +0 3599 0 +0 3711 0 +0 2801 3106 +0 2801 3106 +0 2801 3106 +0 2802 3106 +0 2802 3105 +0 2802 3105 +0 2803 3105 +0 2803 3104 +0 2804 3103 +0 2806 3102 +0 2807 3101 +0 2809 3099 +0 2812 3096 +0 2816 3093 +0 2821 3089 +0 2828 3083 +0 2837 3074 +0 2848 3063 +0 2863 3047 +0 2882 3026 +0 2907 2995 +0 2937 2950 +0 2976 2883 +0 3022 2773 +0 3078 2567 +0 3143 1902 +0 3217 0 +0 3301 0 +0 3393 0 +0 3493 0 +0 3599 0 +0 3711 0 +0 2805 3121 +0 2805 3121 +0 2806 3121 +0 2806 3121 +0 2806 3121 +0 2806 3120 +0 2807 3120 +0 2808 3119 +0 2809 3119 +0 2810 3118 +0 2811 3116 +0 2814 3115 +0 2816 3112 +0 2820 3109 +0 2825 3105 +0 2832 3099 +0 2840 3091 +0 2852 3080 +0 2867 3065 +0 2886 3044 +0 2910 3014 +0 2940 2972 +0 2978 2908 +0 3025 2805 +0 3080 2615 +0 3145 2083 +0 3219 0 +0 3302 0 +0 3394 0 +0 3494 0 +0 3600 0 +0 3712 0 +0 2811 3141 +0 2811 3141 +0 2811 3141 +0 2811 3141 +0 2812 3141 +0 2812 3140 +0 2813 3140 +0 2813 3139 +0 2814 3139 +0 2815 3138 +0 2817 3136 +0 2819 3135 +0 2822 3132 +0 2826 3129 +0 2831 3125 +0 2837 3120 +0 2846 3112 +0 2857 3101 +0 2872 3087 +0 2890 3067 +0 2914 3039 +0 2945 2999 +0 2982 2939 +0 3028 2843 +0 3083 2673 +0 3147 2248 +0 3221 0 +0 3304 0 +0 3396 0 +0 3495 0 +0 3601 0 +0 3713 0 +1321 2818 3166 +1314 2818 3166 +1305 2819 3166 +1292 2819 3166 +1275 2819 3166 +1251 2819 3165 +1216 2820 3165 +1165 2821 3165 +1087 2821 3164 +956 2823 3163 +686 2824 3162 +0 2826 3160 +0 2829 3158 +0 2833 3155 +0 2838 3151 +0 2844 3146 +0 2853 3139 +0 2864 3129 +0 2878 3115 +0 2897 3097 +0 2920 3071 +0 2950 3033 +0 2987 2978 +0 3033 2891 +0 3087 2740 +0 3151 2403 +0 3224 0 +0 3307 0 +0 3398 0 +0 3497 0 +0 3603 0 +0 3714 0 +2324 2828 3198 +2323 2828 3198 +2322 2828 3198 +2321 2828 3198 +2319 2829 3197 +2317 2829 3197 +2314 2830 3197 +2309 2830 3196 +2304 2831 3196 +2296 2832 3195 +2285 2834 3194 +2270 2836 3192 +2249 2839 3190 +2220 2842 3188 +2178 2847 3184 +2115 2853 3179 +2013 2862 3172 +1828 2872 3163 +1321 2887 3151 +0 2905 3134 +0 2928 3109 +0 2957 3075 +0 2994 3025 +0 3039 2947 +0 3092 2817 +0 3156 2552 +0 3228 0 +0 3310 0 +0 3401 0 +0 3499 0 +0 3604 0 +0 3715 0 +2680 2841 3237 +2680 2841 3237 +2680 2841 3237 +2679 2841 3237 +2678 2841 3237 +2677 2842 3236 +2676 2842 3236 +2674 2843 3236 +2671 2844 3235 +2668 2845 3234 +2663 2846 3233 +2657 2848 3232 +2648 2851 3230 +2636 2854 3228 +2620 2859 3224 +2597 2865 3220 +2564 2873 3214 +2516 2884 3205 +2444 2898 3194 +2324 2915 3178 +2088 2938 3157 +1008 2967 3126 +0 3003 3081 +0 3047 3013 +0 3100 2903 +0 3162 2696 +0 3233 2020 +0 3315 0 +0 3404 0 +0 3502 0 +0 3607 0 +0 3717 0 +2929 2857 3285 +2929 2857 3285 +2928 2857 3285 +2928 2858 3284 +2927 2858 3284 +2927 2858 3284 +2926 2859 3284 +2925 2859 3283 +2923 2860 3283 +2921 2861 3282 +2919 2863 3281 +2915 2864 3280 +2910 2867 3278 +2903 2870 3276 +2894 2875 3273 +2882 2881 3269 +2865 2889 3264 +2841 2899 3256 +2807 2912 3246 +2757 2929 3232 +2680 2952 3213 +2551 2980 3186 +2289 3014 3147 +0 3057 3089 +0 3109 2997 +0 3170 2837 +0 3240 2456 +0 3320 0 +0 3409 0 +0 3506 0 +0 3610 0 +0 3719 0 +3132 2878 3341 +3132 2878 3341 +3131 2878 3341 +3131 2879 3341 +3131 2879 3341 +3130 2879 3341 +3130 2880 3341 +3129 2880 3340 +3128 2881 3340 +3127 2882 3339 +3125 2883 3338 +3123 2885 3337 +3120 2888 3336 +3116 2891 3334 +3110 2895 3331 +3102 2901 3328 +3092 2908 3323 +3077 2918 3316 +3057 2931 3307 +3029 2947 3295 +2989 2969 3279 +2928 2996 3255 +2832 3029 3222 +2659 3071 3173 +2222 3121 3099 +0 3181 2975 +0 3250 2729 +0 3328 1243 +0 3415 0 +0 3511 0 +0 3614 0 +0 3723 0 +3310 2905 3408 +3310 2905 3408 +3310 2905 3408 +3310 2905 3407 +3310 2906 3407 +3309 2906 3407 +3309 2906 3407 +3309 2907 3407 +3308 2907 3406 +3307 2908 3406 +3306 2910 3405 +3304 2911 3404 +3302 2914 3403 +3300 2917 3401 +3296 2921 3399 +3291 2926 3396 +3284 2933 3392 +3274 2943 3386 +3262 2955 3378 +3244 2970 3368 +3219 2991 3354 +3183 3016 3334 +3131 3049 3306 +3050 3089 3266 +2912 3137 3207 +2620 3195 3112 +0 3262 2944 +0 3338 2528 +0 3424 0 +0 3518 0 +0 3619 0 +0 3727 0 +3474 2938 3483 +3474 2938 3483 +3474 2939 3483 +3474 2939 3483 +3474 2939 3483 +3474 2939 3483 +3474 2940 3483 +3473 2940 3483 +3473 2941 3482 +3472 2942 3482 +3471 2943 3481 +3470 2944 3480 +3469 2947 3479 +3467 2949 3478 +3464 2953 3476 +3461 2958 3473 +3456 2965 3470 +3450 2973 3465 +3441 2985 3459 +3429 3000 3450 +3413 3019 3438 +3390 3043 3422 +3357 3073 3399 +3310 3111 3367 +3237 3157 3320 +3117 3213 3248 +2883 3277 3129 +1820 3351 2898 +0 3435 1907 +0 3527 0 +0 3626 0 +0 3732 0 +3629 2980 3568 +3629 2980 3568 +3629 2980 3568 +3629 2980 3568 +3629 2980 3568 +3629 2980 3568 +3628 2981 3568 +3628 2981 3568 +3628 2982 3567 +3627 2983 3567 +3627 2984 3566 +3626 2985 3566 +3625 2987 3565 +3624 2990 3564 +3622 2993 3562 +3619 2998 3560 +3616 3004 3557 +3612 3012 3553 +3605 3022 3548 +3597 3036 3541 +3586 3053 3531 +3570 3076 3518 +3549 3104 3500 +3518 3140 3474 +3474 3183 3437 +3406 3235 3382 +3297 3297 3297 +3092 3368 3151 +2441 3449 2828 +0 3538 0 +0 3636 0 +0 3740 0 +3777 3029 3662 +3777 3029 3662 +3777 3030 3662 +3777 3030 3661 +3777 3030 3661 +3777 3030 3661 +3777 3030 3661 +3777 3031 3661 +3776 3031 3661 +3776 3032 3660 +3776 3033 3660 +3775 3034 3660 +3774 3036 3659 +3773 3038 3658 +3772 3042 3657 +3770 3046 3655 +3768 3051 3652 +3765 3058 3649 +3760 3068 3645 +3754 3080 3639 +3747 3096 3632 +3736 3117 3621 +3721 3143 3606 +3700 3175 3586 +3671 3216 3558 +3628 3265 3516 +3564 3323 3455 +3462 3390 3356 +3275 3467 3178 +2755 3554 2715 +0 3648 0 +0 3750 0 +3921 3088 3762 +3921 3088 3762 +3921 3089 3762 +3921 3089 3762 +3921 3089 3762 +3921 3089 3762 +3921 3089 3762 +3921 3090 3762 +3920 3090 3762 +3920 3091 3761 +3920 3092 3761 +3919 3093 3761 +3919 3094 3760 +3918 3096 3759 +3917 3099 3758 +3916 3103 3757 +3914 3108 3755 +3912 3114 3753 +3909 3122 3749 +3905 3133 3745 +3899 3148 3738 +3891 3166 3730 +3881 3189 3719 +3866 3219 3703 +3846 3256 3681 +3817 3301 3650 +3776 3355 3605 +3715 3418 3536 +3617 3491 3424 +3441 3573 3213 +2987 3664 2497 +0 3762 0 +4062 3157 3869 +4062 3157 3869 +4062 3157 3869 +4062 3157 3869 +4062 3157 3869 +4061 3158 3869 +4061 3158 3869 +4061 3158 3869 +4061 3159 3869 +4061 3159 3869 +4061 3160 3869 +4060 3161 3868 +4060 3162 3868 +4060 3164 3867 +4059 3166 3866 +4058 3169 3865 +4057 3174 3864 +4055 3179 3862 +4053 3186 3859 +4050 3196 3856 +4045 3208 3851 +4040 3224 3844 +4032 3245 3835 +4022 3271 3823 +4008 3304 3806 +3988 3345 3783 +3960 3394 3750 +3920 3452 3701 +3860 3520 3626 +3766 3598 3502 +3598 3684 3255 +3182 3779 1720 +4095 3235 3982 +4095 3235 3982 +4095 3235 3982 +4095 3235 3982 +4095 3235 3982 +4095 3236 3982 +4095 3236 3982 +4095 3236 3982 +4095 3236 3982 +4095 3237 3981 +4095 3238 3981 +4095 3238 3981 +4095 3239 3981 +4095 3241 3980 +4095 3243 3979 +4095 3246 3979 +4095 3249 3978 +4095 3254 3976 +4095 3260 3974 +4095 3268 3971 +4095 3279 3967 +4095 3293 3962 +4095 3310 3956 +4095 3333 3946 +4095 3362 3934 +4095 3398 3916 +4095 3442 3891 +4095 3495 3856 +4061 3557 3804 +4002 3629 3724 +3910 3710 3589 +3747 3800 3306 +4095 3322 4095 +4095 3322 4095 +4095 3322 4095 +4095 3322 4095 +4095 3322 4095 +4095 3323 4095 +4095 3323 4095 +4095 3323 4095 +4095 3323 4095 +4095 3324 4095 +4095 3324 4095 +4095 3325 4095 +4095 3326 4095 +4095 3327 4095 +4095 3329 4095 +4095 3331 4095 +4095 3334 4095 +4095 3338 4094 +4095 3343 4093 +4095 3350 4090 +4095 3358 4088 +4095 3370 4084 +4095 3385 4079 +4095 3405 4071 +4095 3429 4062 +4095 3461 4049 +4095 3499 4030 +4095 3546 4005 +4095 3602 3968 +4095 3668 3914 +4095 3743 3829 +4051 3827 3684 +0 2920 3190 +0 2920 3189 +0 2921 3189 +0 2921 3189 +0 2921 3189 +0 2921 3189 +0 2922 3188 +0 2922 3188 +0 2923 3187 +0 2924 3186 +0 2925 3185 +0 2927 3184 +0 2929 3182 +0 2932 3179 +0 2936 3175 +0 2941 3170 +0 2948 3163 +0 2957 3154 +0 2969 3141 +0 2984 3124 +0 3004 3099 +0 3029 3064 +0 3060 3012 +0 3099 2932 +0 3146 2798 +0 3203 2515 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3622 0 +0 3729 0 +0 2920 3190 +0 2920 3190 +0 2921 3189 +0 2921 3189 +0 2921 3189 +0 2921 3189 +0 2922 3189 +0 2922 3188 +0 2923 3187 +0 2924 3187 +0 2925 3185 +0 2927 3184 +0 2929 3182 +0 2932 3179 +0 2936 3175 +0 2941 3170 +0 2948 3163 +0 2957 3154 +0 2969 3142 +0 2984 3124 +0 3004 3099 +0 3029 3064 +0 3060 3013 +0 3099 2933 +0 3146 2798 +0 3203 2516 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3622 0 +0 3729 0 +0 2920 3190 +0 2921 3190 +0 2921 3190 +0 2921 3189 +0 2921 3189 +0 2921 3189 +0 2922 3189 +0 2922 3188 +0 2923 3188 +0 2924 3187 +0 2925 3186 +0 2927 3184 +0 2929 3182 +0 2932 3179 +0 2936 3176 +0 2941 3170 +0 2948 3164 +0 2957 3154 +0 2969 3142 +0 2984 3124 +0 3004 3100 +0 3029 3064 +0 3060 3013 +0 3099 2933 +0 3146 2798 +0 3203 2517 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3622 0 +0 3729 0 +0 2920 3190 +0 2921 3190 +0 2921 3190 +0 2921 3190 +0 2921 3190 +0 2921 3189 +0 2922 3189 +0 2922 3188 +0 2923 3188 +0 2924 3187 +0 2925 3186 +0 2927 3184 +0 2929 3182 +0 2932 3179 +0 2936 3176 +0 2941 3171 +0 2948 3164 +0 2957 3155 +0 2969 3142 +0 2984 3124 +0 3004 3100 +0 3029 3065 +0 3060 3013 +0 3099 2933 +0 3146 2799 +0 3203 2518 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3622 0 +0 3729 0 +0 2921 3190 +0 2921 3190 +0 2921 3190 +0 2921 3190 +0 2921 3190 +0 2921 3190 +0 2922 3189 +0 2922 3189 +0 2923 3188 +0 2924 3187 +0 2925 3186 +0 2927 3185 +0 2929 3183 +0 2932 3180 +0 2936 3176 +0 2941 3171 +0 2948 3164 +0 2957 3155 +0 2969 3142 +0 2984 3125 +0 3004 3100 +0 3029 3065 +0 3060 3014 +0 3099 2934 +0 3146 2799 +0 3203 2519 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3622 0 +0 3729 0 +0 2921 3191 +0 2921 3191 +0 2921 3191 +0 2921 3190 +0 2921 3190 +0 2922 3190 +0 2922 3190 +0 2922 3189 +0 2923 3188 +0 2924 3188 +0 2925 3187 +0 2927 3185 +0 2929 3183 +0 2932 3180 +0 2936 3176 +0 2941 3171 +0 2948 3165 +0 2957 3155 +0 2969 3143 +0 2984 3125 +0 3004 3101 +0 3029 3066 +0 3060 3014 +0 3099 2935 +0 3146 2800 +0 3203 2521 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3622 0 +0 3729 0 +0 2921 3191 +0 2921 3191 +0 2921 3191 +0 2921 3191 +0 2921 3191 +0 2922 3190 +0 2922 3190 +0 2923 3190 +0 2923 3189 +0 2924 3188 +0 2925 3187 +0 2927 3186 +0 2929 3183 +0 2932 3181 +0 2936 3177 +0 2941 3172 +0 2948 3165 +0 2957 3156 +0 2969 3143 +0 2984 3126 +0 3004 3101 +0 3029 3066 +0 3060 3015 +0 3099 2936 +0 3147 2802 +0 3203 2523 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3623 0 +0 3729 0 +0 2921 3192 +0 2921 3192 +0 2921 3192 +0 2921 3192 +0 2922 3191 +0 2922 3191 +0 2922 3191 +0 2923 3190 +0 2923 3190 +0 2924 3189 +0 2926 3188 +0 2927 3186 +0 2930 3184 +0 2933 3181 +0 2936 3178 +0 2942 3173 +0 2948 3166 +0 2957 3157 +0 2969 3144 +0 2984 3127 +0 3004 3102 +0 3029 3067 +0 3061 3016 +0 3099 2937 +0 3147 2803 +0 3203 2526 +0 3269 0 +0 3344 0 +0 3429 0 +0 3522 0 +0 3623 0 +0 3730 0 +0 2921 3193 +0 2921 3193 +0 2921 3193 +0 2922 3193 +0 2922 3192 +0 2922 3192 +0 2922 3192 +0 2923 3191 +0 2924 3191 +0 2925 3190 +0 2926 3189 +0 2928 3187 +0 2930 3185 +0 2933 3182 +0 2937 3179 +0 2942 3174 +0 2949 3167 +0 2958 3158 +0 2969 3145 +0 2985 3128 +0 3004 3103 +0 3029 3069 +0 3061 3017 +0 3100 2938 +0 3147 2806 +0 3203 2530 +0 3269 0 +0 3345 0 +0 3429 0 +0 3522 0 +0 3623 0 +0 3730 0 +0 2922 3194 +0 2922 3194 +0 2922 3194 +0 2922 3194 +0 2922 3194 +0 2922 3193 +0 2923 3193 +0 2923 3193 +0 2924 3192 +0 2925 3191 +0 2926 3190 +0 2928 3188 +0 2930 3186 +0 2933 3184 +0 2937 3180 +0 2942 3175 +0 2949 3168 +0 2958 3159 +0 2970 3147 +0 2985 3129 +0 3005 3105 +0 3030 3070 +0 3061 3019 +0 3100 2941 +0 3147 2808 +0 3203 2536 +0 3269 0 +0 3345 0 +0 3429 0 +0 3522 0 +0 3623 0 +0 3730 0 +0 2922 3196 +0 2922 3196 +0 2922 3196 +0 2922 3196 +0 2923 3195 +0 2923 3195 +0 2923 3195 +0 2924 3194 +0 2924 3194 +0 2925 3193 +0 2927 3192 +0 2928 3190 +0 2931 3188 +0 2933 3185 +0 2937 3182 +0 2943 3177 +0 2949 3170 +0 2958 3161 +0 2970 3148 +0 2985 3131 +0 3005 3107 +0 3030 3072 +0 3061 3022 +0 3100 2944 +0 3147 2812 +0 3204 2543 +0 3269 0 +0 3345 0 +0 3429 0 +0 3522 0 +0 3623 0 +0 3730 0 +0 2923 3198 +0 2923 3198 +0 2923 3198 +0 2923 3198 +0 2923 3198 +0 2923 3197 +0 2924 3197 +0 2924 3197 +0 2925 3196 +0 2926 3195 +0 2927 3194 +0 2929 3192 +0 2931 3190 +0 2934 3188 +0 2938 3184 +0 2943 3179 +0 2950 3172 +0 2959 3163 +0 2971 3151 +0 2986 3134 +0 3005 3110 +0 3030 3075 +0 3062 3025 +0 3100 2947 +0 3148 2818 +0 3204 2552 +0 3270 0 +0 3345 0 +0 3430 0 +0 3522 0 +0 3623 0 +0 3730 0 +0 2923 3201 +0 2923 3201 +0 2924 3201 +0 2924 3201 +0 2924 3201 +0 2924 3200 +0 2925 3200 +0 2925 3200 +0 2926 3199 +0 2927 3198 +0 2928 3197 +0 2930 3195 +0 2932 3193 +0 2935 3191 +0 2939 3187 +0 2944 3182 +0 2951 3176 +0 2960 3167 +0 2971 3154 +0 2986 3137 +0 3006 3113 +0 3031 3079 +0 3062 3029 +0 3101 2953 +0 3148 2824 +0 3204 2564 +0 3270 0 +0 3345 0 +0 3430 0 +0 3523 0 +0 3623 0 +0 3730 0 +0 2924 3205 +0 2924 3205 +0 2925 3205 +0 2925 3205 +0 2925 3205 +0 2925 3204 +0 2926 3204 +0 2926 3203 +0 2927 3203 +0 2928 3202 +0 2929 3201 +0 2931 3199 +0 2933 3197 +0 2936 3195 +0 2940 3191 +0 2945 3186 +0 2952 3180 +0 2961 3171 +0 2972 3159 +0 2987 3142 +0 3007 3118 +0 3032 3084 +0 3063 3035 +0 3102 2959 +0 3149 2833 +0 3205 2580 +0 3271 0 +0 3346 0 +0 3430 0 +0 3523 0 +0 3623 0 +0 3730 0 +0 2926 3210 +0 2926 3210 +0 2926 3210 +0 2926 3210 +0 2926 3210 +0 2927 3210 +0 2927 3209 +0 2927 3209 +0 2928 3208 +0 2929 3207 +0 2930 3206 +0 2932 3205 +0 2934 3203 +0 2937 3200 +0 2941 3197 +0 2946 3192 +0 2953 3185 +0 2962 3176 +0 2973 3164 +0 2989 3148 +0 3008 3124 +0 3033 3091 +0 3064 3043 +0 3103 2968 +0 3150 2845 +0 3206 2601 +0 3271 1202 +0 3346 0 +0 3431 0 +0 3523 0 +0 3624 0 +0 3730 0 +0 2927 3217 +0 2928 3217 +0 2928 3217 +0 2928 3217 +0 2928 3217 +0 2928 3216 +0 2929 3216 +0 2929 3216 +0 2930 3215 +0 2931 3214 +0 2932 3213 +0 2934 3212 +0 2936 3210 +0 2939 3207 +0 2943 3204 +0 2948 3199 +0 2955 3193 +0 2963 3184 +0 2975 3172 +0 2990 3156 +0 3010 3133 +0 3034 3100 +0 3065 3053 +0 3104 2980 +0 3151 2860 +0 3207 2626 +0 3272 1575 +0 3347 0 +0 3431 0 +0 3524 0 +0 3624 0 +0 3731 0 +0 2930 3226 +0 2930 3226 +0 2930 3226 +0 2930 3226 +0 2930 3226 +0 2931 3226 +0 2931 3225 +0 2932 3225 +0 2932 3224 +0 2933 3223 +0 2934 3222 +0 2936 3221 +0 2938 3219 +0 2941 3216 +0 2945 3213 +0 2950 3208 +0 2957 3202 +0 2966 3194 +0 2977 3182 +0 2992 3166 +0 3012 3144 +0 3036 3112 +0 3067 3066 +0 3105 2995 +0 3152 2880 +0 3208 2659 +0 3273 1829 +0 3348 0 +0 3432 0 +0 3524 0 +0 3624 0 +0 3731 0 +0 2933 3238 +0 2933 3238 +0 2933 3238 +0 2933 3238 +0 2934 3238 +0 2934 3237 +0 2934 3237 +0 2935 3237 +0 2936 3236 +0 2936 3235 +0 2938 3234 +0 2939 3233 +0 2941 3231 +0 2944 3229 +0 2948 3225 +0 2953 3221 +0 2960 3215 +0 2969 3206 +0 2980 3195 +0 2995 3179 +0 3014 3158 +0 3039 3127 +0 3069 3082 +0 3108 3015 +0 3154 2905 +0 3210 2699 +0 3275 2034 +0 3349 0 +0 3433 0 +0 3525 0 +0 3625 0 +0 3732 0 +0 2937 3254 +0 2937 3253 +0 2938 3253 +0 2938 3253 +0 2938 3253 +0 2938 3253 +0 2939 3252 +0 2939 3252 +0 2940 3252 +0 2941 3251 +0 2942 3250 +0 2943 3248 +0 2946 3247 +0 2948 3244 +0 2952 3241 +0 2957 3237 +0 2964 3231 +0 2973 3223 +0 2984 3212 +0 2999 3197 +0 3018 3176 +0 3042 3147 +0 3073 3104 +0 3110 3040 +0 3157 2937 +0 3212 2747 +0 3277 2215 +0 3351 0 +0 3434 0 +0 3526 0 +0 3626 0 +0 3732 0 +0 2943 3273 +0 2943 3273 +0 2943 3273 +0 2943 3273 +0 2944 3273 +0 2944 3273 +0 2944 3272 +0 2945 3272 +0 2945 3271 +0 2946 3271 +0 2947 3270 +0 2949 3268 +0 2951 3267 +0 2954 3264 +0 2958 3261 +0 2963 3257 +0 2969 3252 +0 2978 3244 +0 2989 3234 +0 3004 3219 +0 3022 3199 +0 3046 3171 +0 3077 3131 +0 3114 3071 +0 3160 2976 +0 3215 2805 +0 3279 2380 +0 3353 0 +0 3436 0 +0 3528 0 +0 3627 0 +0 3733 0 +1458 2950 3298 +1453 2950 3298 +1446 2951 3298 +1437 2951 3298 +1424 2951 3298 +1407 2951 3298 +1383 2952 3298 +1348 2952 3297 +1297 2953 3297 +1219 2954 3296 +1088 2955 3295 +818 2956 3294 +0 2958 3292 +0 2961 3290 +0 2965 3287 +0 2970 3283 +0 2976 3278 +0 2985 3271 +0 2996 3261 +0 3010 3248 +0 3029 3229 +0 3052 3203 +0 3082 3165 +0 3119 3110 +0 3165 3023 +0 3219 2873 +0 3283 2535 +0 3356 0 +0 3439 0 +0 3530 0 +0 3629 0 +0 3735 0 +2457 2960 3330 +2456 2960 3330 +2456 2960 3330 +2455 2960 3330 +2453 2961 3330 +2451 2961 3330 +2449 2961 3329 +2446 2962 3329 +2442 2962 3328 +2436 2963 3328 +2428 2964 3327 +2417 2966 3326 +2402 2968 3324 +2382 2971 3322 +2352 2974 3320 +2310 2979 3316 +2247 2985 3311 +2145 2994 3304 +1960 3004 3295 +1453 3019 3283 +0 3037 3266 +0 3060 3242 +0 3090 3207 +0 3126 3157 +0 3171 3079 +0 3225 2949 +0 3288 2684 +0 3360 0 +0 3442 0 +0 3533 0 +0 3631 0 +0 3736 0 +2813 2973 3369 +2813 2973 3369 +2812 2973 3369 +2812 2973 3369 +2811 2973 3369 +2810 2974 3369 +2809 2974 3369 +2808 2974 3368 +2806 2975 3368 +2803 2976 3367 +2800 2977 3366 +2795 2978 3365 +2789 2980 3364 +2780 2983 3362 +2768 2987 3360 +2752 2991 3356 +2729 2997 3352 +2696 3005 3346 +2648 3016 3337 +2576 3030 3326 +2456 3048 3310 +2220 3070 3289 +1140 3099 3258 +0 3135 3213 +0 3179 3145 +0 3232 3035 +0 3294 2828 +0 3366 2152 +0 3447 0 +0 3536 0 +0 3634 0 +0 3739 0 +3061 2989 3417 +3061 2989 3417 +3061 2989 3417 +3060 2989 3417 +3060 2990 3417 +3060 2990 3416 +3059 2990 3416 +3058 2991 3416 +3057 2991 3415 +3055 2992 3415 +3053 2993 3414 +3051 2995 3413 +3047 2997 3412 +3042 2999 3410 +3036 3002 3408 +3027 3007 3405 +3014 3013 3401 +2997 3021 3396 +2973 3031 3388 +2939 3044 3378 +2889 3062 3364 +2812 3084 3345 +2683 3112 3318 +2421 3147 3279 +0 3189 3221 +0 3241 3129 +0 3302 2969 +0 3373 2588 +0 3452 0 +0 3541 0 +0 3638 0 +0 3742 0 +3264 3010 3474 +3264 3010 3474 +3264 3010 3473 +3263 3010 3473 +3263 3011 3473 +3263 3011 3473 +3263 3011 3473 +3262 3012 3473 +3261 3012 3472 +3260 3013 3472 +3259 3014 3471 +3257 3015 3470 +3255 3017 3469 +3252 3020 3468 +3248 3023 3466 +3242 3027 3463 +3234 3033 3460 +3224 3040 3455 +3210 3050 3448 +3190 3063 3440 +3161 3080 3427 +3121 3101 3411 +3060 3128 3387 +2964 3162 3354 +2791 3203 3305 +2354 3253 3231 +0 3313 3107 +0 3382 2861 +0 3460 1375 +0 3548 0 +0 3643 0 +0 3746 0 +3442 3037 3540 +3442 3037 3540 +3442 3037 3540 +3442 3037 3540 +3442 3037 3540 +3442 3038 3539 +3442 3038 3539 +3441 3038 3539 +3441 3039 3539 +3440 3040 3538 +3439 3041 3538 +3438 3042 3537 +3437 3044 3536 +3434 3046 3535 +3432 3049 3533 +3428 3053 3531 +3423 3058 3528 +3416 3065 3524 +3407 3075 3518 +3394 3087 3511 +3376 3103 3500 +3351 3123 3486 +3315 3149 3466 +3263 3181 3438 +3182 3221 3398 +3044 3269 3339 +2752 3327 3244 +0 3394 3076 +0 3470 2660 +0 3556 0 +0 3650 0 +0 3751 0 +3606 3070 3616 +3606 3070 3616 +3606 3071 3616 +3606 3071 3615 +3606 3071 3615 +3606 3071 3615 +3606 3071 3615 +3606 3072 3615 +3605 3072 3615 +3605 3073 3614 +3604 3074 3614 +3603 3075 3613 +3602 3077 3613 +3601 3079 3611 +3599 3082 3610 +3596 3085 3608 +3593 3090 3605 +3588 3097 3602 +3582 3106 3597 +3573 3117 3591 +3561 3132 3582 +3545 3151 3570 +3522 3175 3554 +3489 3205 3531 +3442 3243 3499 +3369 3289 3452 +3249 3345 3380 +3015 3409 3261 +1952 3483 3030 +0 3567 2039 +0 3659 0 +0 3758 0 +3761 3112 3700 +3761 3112 3700 +3761 3112 3700 +3761 3112 3700 +3761 3112 3700 +3761 3112 3700 +3761 3112 3700 +3760 3113 3700 +3760 3113 3700 +3760 3114 3699 +3759 3115 3699 +3759 3116 3699 +3758 3117 3698 +3757 3119 3697 +3756 3122 3696 +3754 3125 3694 +3751 3130 3692 +3748 3136 3689 +3744 3144 3685 +3738 3154 3680 +3729 3168 3673 +3718 3185 3663 +3702 3208 3650 +3681 3236 3632 +3650 3272 3606 +3606 3315 3569 +3538 3368 3514 +3429 3429 3429 +3224 3501 3283 +2573 3581 2960 +0 3671 0 +0 3768 0 +3909 3161 3794 +3909 3161 3794 +3909 3162 3794 +3909 3162 3794 +3909 3162 3794 +3909 3162 3794 +3909 3162 3793 +3909 3162 3793 +3909 3163 3793 +3908 3163 3793 +3908 3164 3793 +3908 3165 3792 +3907 3166 3792 +3906 3168 3791 +3905 3171 3790 +3904 3174 3789 +3902 3178 3787 +3900 3183 3785 +3897 3190 3781 +3892 3200 3777 +3887 3212 3771 +3879 3228 3764 +3868 3249 3753 +3853 3275 3739 +3832 3307 3718 +3803 3348 3690 +3760 3397 3648 +3696 3455 3587 +3594 3522 3488 +3407 3599 3311 +2887 3686 2847 +0 3780 0 +4053 3220 3894 +4053 3221 3894 +4053 3221 3894 +4053 3221 3894 +4053 3221 3894 +4053 3221 3894 +4053 3221 3894 +4053 3221 3894 +4053 3222 3894 +4052 3222 3894 +4052 3223 3894 +4052 3224 3893 +4052 3225 3893 +4051 3226 3892 +4050 3229 3891 +4049 3231 3890 +4048 3235 3889 +4046 3240 3887 +4044 3246 3885 +4041 3254 3881 +4037 3265 3877 +4031 3280 3871 +4023 3298 3862 +4013 3321 3851 +3998 3351 3835 +3978 3388 3813 +3950 3433 3782 +3908 3487 3737 +3847 3550 3668 +3749 3623 3557 +3573 3705 3345 +3119 3796 2630 +4095 3289 4002 +4095 3289 4002 +4095 3289 4002 +4095 3289 4002 +4095 3289 4001 +4095 3290 4001 +4095 3290 4001 +4095 3290 4001 +4095 3290 4001 +4095 3291 4001 +4095 3291 4001 +4095 3292 4001 +4095 3293 4000 +4095 3294 4000 +4095 3296 3999 +4095 3298 3998 +4095 3302 3997 +4095 3306 3996 +4095 3311 3994 +4095 3318 3991 +4095 3328 3988 +4095 3340 3983 +4095 3357 3976 +4095 3377 3967 +4095 3403 3955 +4095 3436 3939 +4095 3477 3915 +4092 3526 3882 +4052 3585 3833 +3993 3653 3758 +3898 3730 3634 +3730 3816 3387 +4095 3367 4095 +4095 3367 4095 +4095 3367 4095 +4095 3367 4095 +4095 3367 4095 +4095 3368 4095 +4095 3368 4095 +4095 3368 4095 +4095 3368 4095 +4095 3369 4095 +4095 3369 4095 +4095 3370 4095 +4095 3370 4095 +4095 3372 4095 +4095 3373 4095 +4095 3375 4095 +4095 3378 4095 +4095 3381 4095 +4095 3386 4095 +4095 3392 4095 +4095 3400 4095 +4095 3411 4095 +4095 3425 4094 +4095 3442 4088 +4095 3465 4078 +4095 3494 4066 +4095 3530 4048 +4095 3574 4023 +4095 3627 3988 +4095 3689 3936 +4095 3761 3857 +4042 3842 3721 +0 3052 3322 +0 3052 3322 +0 3053 3321 +0 3053 3321 +0 3053 3321 +0 3053 3321 +0 3053 3321 +0 3054 3320 +0 3054 3320 +0 3055 3319 +0 3056 3318 +0 3057 3317 +0 3059 3316 +0 3061 3314 +0 3064 3311 +0 3068 3307 +0 3073 3302 +0 3080 3295 +0 3089 3286 +0 3101 3273 +0 3116 3256 +0 3136 3231 +0 3161 3196 +0 3192 3144 +0 3231 3064 +0 3278 2929 +0 3335 2647 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3052 3322 +0 3052 3322 +0 3053 3322 +0 3053 3321 +0 3053 3321 +0 3053 3321 +0 3053 3321 +0 3054 3320 +0 3054 3320 +0 3055 3319 +0 3056 3319 +0 3057 3317 +0 3059 3316 +0 3061 3314 +0 3064 3311 +0 3068 3307 +0 3073 3302 +0 3080 3295 +0 3089 3286 +0 3101 3273 +0 3116 3256 +0 3136 3231 +0 3161 3196 +0 3192 3144 +0 3231 3065 +0 3278 2930 +0 3335 2648 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3052 3322 +0 3052 3322 +0 3053 3322 +0 3053 3322 +0 3053 3321 +0 3053 3321 +0 3053 3321 +0 3054 3321 +0 3054 3320 +0 3055 3319 +0 3056 3319 +0 3057 3318 +0 3059 3316 +0 3061 3314 +0 3064 3311 +0 3068 3307 +0 3073 3302 +0 3080 3296 +0 3089 3286 +0 3101 3274 +0 3116 3256 +0 3136 3231 +0 3161 3196 +0 3192 3145 +0 3231 3065 +0 3278 2930 +0 3335 2648 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3052 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3321 +0 3053 3321 +0 3054 3321 +0 3054 3320 +0 3055 3320 +0 3056 3319 +0 3057 3318 +0 3059 3316 +0 3061 3314 +0 3064 3311 +0 3068 3308 +0 3073 3303 +0 3080 3296 +0 3089 3286 +0 3101 3274 +0 3116 3256 +0 3136 3232 +0 3161 3197 +0 3192 3145 +0 3231 3065 +0 3278 2930 +0 3335 2649 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3321 +0 3054 3321 +0 3054 3321 +0 3055 3320 +0 3056 3319 +0 3057 3318 +0 3059 3316 +0 3061 3314 +0 3064 3312 +0 3068 3308 +0 3073 3303 +0 3080 3296 +0 3089 3287 +0 3101 3274 +0 3116 3256 +0 3136 3232 +0 3161 3197 +0 3192 3145 +0 3231 3065 +0 3278 2931 +0 3335 2650 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3053 3323 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3053 3322 +0 3054 3322 +0 3054 3321 +0 3054 3321 +0 3055 3320 +0 3056 3319 +0 3057 3318 +0 3059 3317 +0 3061 3315 +0 3064 3312 +0 3068 3308 +0 3073 3303 +0 3080 3296 +0 3089 3287 +0 3101 3274 +0 3116 3257 +0 3136 3232 +0 3161 3197 +0 3192 3146 +0 3231 3066 +0 3279 2932 +0 3335 2651 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3053 3322 +0 3054 3322 +0 3054 3322 +0 3055 3321 +0 3055 3321 +0 3056 3320 +0 3057 3319 +0 3059 3317 +0 3061 3315 +0 3064 3312 +0 3068 3309 +0 3073 3304 +0 3080 3297 +0 3089 3287 +0 3101 3275 +0 3116 3257 +0 3136 3233 +0 3161 3198 +0 3192 3146 +0 3231 3067 +0 3279 2932 +0 3335 2653 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3053 3323 +0 3054 3323 +0 3054 3322 +0 3055 3322 +0 3055 3321 +0 3056 3320 +0 3058 3319 +0 3059 3318 +0 3061 3316 +0 3064 3313 +0 3068 3309 +0 3074 3304 +0 3080 3297 +0 3089 3288 +0 3101 3275 +0 3116 3258 +0 3136 3233 +0 3161 3198 +0 3192 3147 +0 3231 3068 +0 3279 2934 +0 3335 2655 +0 3401 0 +0 3476 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3053 3324 +0 3053 3324 +0 3053 3324 +0 3053 3324 +0 3053 3324 +0 3054 3324 +0 3054 3323 +0 3054 3323 +0 3055 3322 +0 3056 3322 +0 3057 3321 +0 3058 3320 +0 3059 3318 +0 3062 3316 +0 3065 3314 +0 3069 3310 +0 3074 3305 +0 3081 3298 +0 3090 3289 +0 3101 3276 +0 3117 3259 +0 3136 3234 +0 3161 3199 +0 3193 3148 +0 3231 3069 +0 3279 2935 +0 3335 2658 +0 3401 0 +0 3477 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3053 3325 +0 3053 3325 +0 3053 3325 +0 3054 3325 +0 3054 3325 +0 3054 3325 +0 3054 3324 +0 3055 3324 +0 3055 3323 +0 3056 3323 +0 3057 3322 +0 3058 3321 +0 3060 3319 +0 3062 3317 +0 3065 3314 +0 3069 3311 +0 3074 3306 +0 3081 3299 +0 3090 3290 +0 3102 3277 +0 3117 3260 +0 3136 3235 +0 3161 3201 +0 3193 3149 +0 3232 3071 +0 3279 2938 +0 3335 2662 +0 3401 0 +0 3477 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3054 3326 +0 3054 3326 +0 3054 3326 +0 3054 3326 +0 3054 3326 +0 3054 3326 +0 3055 3326 +0 3055 3325 +0 3055 3325 +0 3056 3324 +0 3057 3323 +0 3058 3322 +0 3060 3321 +0 3062 3319 +0 3065 3316 +0 3069 3312 +0 3074 3307 +0 3081 3300 +0 3090 3291 +0 3102 3279 +0 3117 3261 +0 3137 3237 +0 3162 3202 +0 3193 3151 +0 3232 3073 +0 3279 2941 +0 3335 2668 +0 3401 0 +0 3477 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3054 3328 +0 3054 3328 +0 3054 3328 +0 3054 3328 +0 3054 3328 +0 3055 3327 +0 3055 3327 +0 3055 3327 +0 3056 3326 +0 3057 3326 +0 3057 3325 +0 3059 3324 +0 3060 3322 +0 3063 3320 +0 3066 3318 +0 3069 3314 +0 3075 3309 +0 3081 3302 +0 3090 3293 +0 3102 3281 +0 3117 3263 +0 3137 3239 +0 3162 3204 +0 3193 3154 +0 3232 3076 +0 3279 2944 +0 3336 2675 +0 3402 0 +0 3477 0 +0 3561 0 +0 3654 0 +0 3755 0 +0 3055 3330 +0 3055 3330 +0 3055 3330 +0 3055 3330 +0 3055 3330 +0 3055 3330 +0 3056 3329 +0 3056 3329 +0 3056 3329 +0 3057 3328 +0 3058 3327 +0 3059 3326 +0 3061 3325 +0 3063 3323 +0 3066 3320 +0 3070 3316 +0 3075 3311 +0 3082 3305 +0 3091 3295 +0 3103 3283 +0 3118 3266 +0 3137 3242 +0 3162 3207 +0 3194 3157 +0 3233 3080 +0 3280 2950 +0 3336 2684 +0 3402 0 +0 3477 0 +0 3562 0 +0 3655 0 +0 3755 0 +0 3055 3333 +0 3055 3333 +0 3055 3333 +0 3056 3333 +0 3056 3333 +0 3056 3333 +0 3056 3332 +0 3057 3332 +0 3057 3332 +0 3058 3331 +0 3059 3330 +0 3060 3329 +0 3062 3328 +0 3064 3326 +0 3067 3323 +0 3071 3319 +0 3076 3314 +0 3083 3308 +0 3092 3299 +0 3103 3286 +0 3119 3269 +0 3138 3245 +0 3163 3211 +0 3194 3161 +0 3233 3085 +0 3280 2957 +0 3336 2696 +0 3402 0 +0 3477 0 +0 3562 0 +0 3655 0 +0 3755 0 +0 3056 3337 +0 3056 3337 +0 3056 3337 +0 3057 3337 +0 3057 3337 +0 3057 3337 +0 3057 3336 +0 3058 3336 +0 3058 3336 +0 3059 3335 +0 3060 3334 +0 3061 3333 +0 3063 3332 +0 3065 3330 +0 3068 3327 +0 3072 3323 +0 3077 3318 +0 3084 3312 +0 3093 3303 +0 3104 3291 +0 3119 3274 +0 3139 3250 +0 3164 3216 +0 3195 3167 +0 3234 3092 +0 3281 2966 +0 3337 2712 +0 3403 0 +0 3478 0 +0 3562 0 +0 3655 0 +0 3755 0 +0 3058 3342 +0 3058 3342 +0 3058 3342 +0 3058 3342 +0 3058 3342 +0 3058 3342 +0 3059 3342 +0 3059 3341 +0 3060 3341 +0 3060 3340 +0 3061 3339 +0 3062 3338 +0 3064 3337 +0 3066 3335 +0 3069 3332 +0 3073 3329 +0 3078 3324 +0 3085 3317 +0 3094 3309 +0 3106 3296 +0 3121 3280 +0 3140 3256 +0 3165 3223 +0 3196 3175 +0 3235 3100 +0 3282 2977 +0 3338 2733 +0 3403 1334 +0 3478 0 +0 3563 0 +0 3655 0 +0 3756 0 +0 3059 3349 +0 3060 3349 +0 3060 3349 +0 3060 3349 +0 3060 3349 +0 3060 3349 +0 3060 3349 +0 3061 3348 +0 3061 3348 +0 3062 3347 +0 3063 3346 +0 3064 3345 +0 3066 3344 +0 3068 3342 +0 3071 3339 +0 3075 3336 +0 3080 3331 +0 3087 3325 +0 3096 3316 +0 3107 3304 +0 3122 3288 +0 3142 3265 +0 3166 3232 +0 3197 3185 +0 3236 3112 +0 3283 2993 +0 3339 2758 +0 3404 1707 +0 3479 0 +0 3563 0 +0 3656 0 +0 3756 0 +0 3062 3358 +0 3062 3358 +0 3062 3358 +0 3062 3358 +0 3062 3358 +0 3063 3358 +0 3063 3358 +0 3063 3357 +0 3064 3357 +0 3064 3356 +0 3065 3355 +0 3067 3354 +0 3068 3353 +0 3070 3351 +0 3073 3349 +0 3077 3345 +0 3082 3341 +0 3089 3334 +0 3098 3326 +0 3109 3314 +0 3124 3298 +0 3144 3276 +0 3168 3244 +0 3199 3198 +0 3238 3127 +0 3284 3012 +0 3340 2791 +0 3405 1961 +0 3480 0 +0 3564 0 +0 3657 0 +0 3757 0 +0 3065 3370 +0 3065 3370 +0 3065 3370 +0 3065 3370 +0 3066 3370 +0 3066 3370 +0 3066 3369 +0 3066 3369 +0 3067 3369 +0 3068 3368 +0 3069 3367 +0 3070 3366 +0 3071 3365 +0 3074 3363 +0 3076 3361 +0 3080 3357 +0 3085 3353 +0 3092 3347 +0 3101 3338 +0 3112 3327 +0 3127 3312 +0 3146 3290 +0 3171 3259 +0 3202 3214 +0 3240 3147 +0 3286 3037 +0 3342 2831 +0 3407 2166 +0 3481 0 +0 3565 0 +0 3657 0 +0 3757 0 +0 3069 3386 +0 3069 3386 +0 3070 3386 +0 3070 3385 +0 3070 3385 +0 3070 3385 +0 3070 3385 +0 3071 3385 +0 3071 3384 +0 3072 3384 +0 3073 3383 +0 3074 3382 +0 3076 3381 +0 3078 3379 +0 3081 3376 +0 3084 3373 +0 3089 3369 +0 3096 3363 +0 3105 3355 +0 3116 3344 +0 3131 3329 +0 3150 3308 +0 3174 3279 +0 3205 3236 +0 3243 3172 +0 3289 3069 +0 3344 2880 +0 3409 2347 +0 3483 0 +0 3567 0 +0 3659 0 +0 3758 0 +0 3075 3405 +0 3075 3405 +0 3075 3405 +0 3075 3405 +0 3075 3405 +0 3076 3405 +0 3076 3405 +0 3076 3404 +0 3077 3404 +0 3077 3404 +0 3078 3403 +0 3080 3402 +0 3081 3401 +0 3083 3399 +0 3086 3397 +0 3090 3393 +0 3095 3389 +0 3101 3384 +0 3110 3376 +0 3121 3366 +0 3136 3351 +0 3155 3332 +0 3179 3304 +0 3209 3263 +0 3246 3203 +0 3292 3108 +0 3347 2937 +0 3411 2512 +0 3485 0 +0 3568 0 +0 3660 0 +0 3759 0 +1593 3082 3431 +1590 3082 3431 +1585 3083 3431 +1578 3083 3430 +1569 3083 3430 +1556 3083 3430 +1539 3083 3430 +1515 3084 3430 +1480 3084 3429 +1429 3085 3429 +1351 3086 3428 +1220 3087 3427 +950 3088 3426 +0 3090 3424 +0 3093 3422 +0 3097 3419 +0 3102 3415 +0 3108 3410 +0 3117 3403 +0 3128 3393 +0 3142 3380 +0 3161 3361 +0 3184 3335 +0 3214 3297 +0 3252 3242 +0 3297 3155 +0 3351 3005 +0 3415 2667 +0 3488 0 +0 3571 0 +0 3662 0 +0 3761 0 +2589 3092 3462 +2589 3092 3462 +2588 3092 3462 +2588 3092 3462 +2587 3092 3462 +2585 3093 3462 +2584 3093 3462 +2581 3093 3461 +2578 3094 3461 +2574 3094 3461 +2568 3095 3460 +2560 3096 3459 +2549 3098 3458 +2534 3100 3456 +2514 3103 3454 +2484 3106 3452 +2442 3111 3448 +2379 3117 3443 +2277 3126 3436 +2092 3137 3427 +1586 3151 3415 +0 3169 3398 +0 3192 3374 +0 3222 3339 +0 3258 3289 +0 3303 3211 +0 3357 3081 +0 3420 2816 +0 3492 0 +0 3574 0 +0 3665 0 +0 3763 0 +2945 3105 3501 +2945 3105 3501 +2945 3105 3501 +2944 3105 3501 +2944 3105 3501 +2943 3105 3501 +2942 3106 3501 +2941 3106 3501 +2940 3106 3500 +2938 3107 3500 +2935 3108 3499 +2932 3109 3499 +2927 3110 3497 +2921 3112 3496 +2912 3115 3494 +2900 3119 3492 +2884 3123 3488 +2861 3129 3484 +2828 3137 3478 +2780 3148 3470 +2708 3162 3458 +2588 3180 3443 +2352 3202 3421 +1272 3231 3390 +0 3267 3345 +0 3311 3277 +0 3364 3167 +0 3426 2960 +0 3498 2284 +0 3579 0 +0 3669 0 +0 3766 0 +3193 3121 3549 +3193 3121 3549 +3193 3121 3549 +3193 3121 3549 +3192 3122 3549 +3192 3122 3549 +3192 3122 3548 +3191 3122 3548 +3190 3123 3548 +3189 3123 3548 +3188 3124 3547 +3186 3125 3546 +3183 3127 3545 +3179 3129 3544 +3174 3131 3543 +3168 3135 3540 +3159 3139 3537 +3146 3145 3533 +3129 3153 3528 +3105 3163 3520 +3071 3176 3510 +3021 3194 3496 +2944 3216 3477 +2815 3244 3450 +2553 3279 3411 +0 3321 3353 +0 3373 3261 +0 3434 3101 +0 3505 2720 +0 3585 0 +0 3673 0 +0 3770 0 +3396 3142 3606 +3396 3142 3606 +3396 3142 3606 +3396 3142 3606 +3396 3143 3605 +3395 3143 3605 +3395 3143 3605 +3395 3143 3605 +3394 3144 3605 +3393 3144 3604 +3392 3145 3604 +3391 3146 3603 +3389 3148 3603 +3387 3149 3601 +3384 3152 3600 +3380 3155 3598 +3374 3159 3595 +3367 3165 3592 +3356 3172 3587 +3342 3182 3581 +3322 3195 3572 +3294 3212 3560 +3253 3233 3543 +3192 3260 3519 +3096 3294 3486 +2923 3335 3437 +2486 3385 3363 +0 3445 3239 +0 3514 2993 +0 3592 1507 +0 3680 0 +0 3775 0 +3575 3169 3672 +3575 3169 3672 +3574 3169 3672 +3574 3169 3672 +3574 3169 3672 +3574 3169 3672 +3574 3170 3672 +3574 3170 3671 +3573 3170 3671 +3573 3171 3671 +3572 3172 3670 +3571 3173 3670 +3570 3174 3669 +3569 3176 3668 +3567 3178 3667 +3564 3181 3665 +3560 3185 3663 +3555 3190 3660 +3548 3198 3656 +3539 3207 3650 +3526 3219 3643 +3508 3235 3632 +3483 3255 3618 +3448 3281 3598 +3395 3313 3571 +3314 3353 3531 +3176 3401 3471 +2884 3459 3376 +0 3526 3208 +0 3602 2792 +0 3688 0 +0 3782 0 +3739 3202 3748 +3739 3202 3748 +3739 3203 3748 +3738 3203 3748 +3738 3203 3748 +3738 3203 3747 +3738 3203 3747 +3738 3203 3747 +3738 3204 3747 +3737 3204 3747 +3737 3205 3746 +3736 3206 3746 +3736 3207 3745 +3734 3209 3745 +3733 3211 3744 +3731 3214 3742 +3728 3217 3740 +3725 3222 3738 +3720 3229 3734 +3714 3238 3729 +3705 3249 3723 +3693 3264 3714 +3677 3283 3703 +3654 3307 3686 +3621 3338 3663 +3574 3375 3631 +3501 3422 3584 +3381 3477 3512 +3147 3541 3393 +2084 3616 3162 +0 3699 2171 +0 3791 0 +3893 3244 3833 +3893 3244 3833 +3893 3244 3833 +3893 3244 3832 +3893 3244 3832 +3893 3244 3832 +3893 3244 3832 +3893 3244 3832 +3893 3245 3832 +3892 3245 3832 +3892 3246 3832 +3892 3247 3831 +3891 3248 3831 +3890 3249 3830 +3889 3251 3829 +3888 3254 3828 +3886 3257 3826 +3884 3262 3824 +3880 3268 3821 +3876 3276 3817 +3870 3286 3812 +3861 3300 3805 +3850 3318 3795 +3835 3340 3782 +3813 3368 3764 +3782 3404 3738 +3738 3447 3701 +3670 3500 3646 +3561 3561 3561 +3357 3633 3415 +2705 3713 3092 +0 3803 0 +4041 3293 3926 +4041 3293 3926 +4041 3294 3926 +4041 3294 3926 +4041 3294 3926 +4041 3294 3926 +4041 3294 3926 +4041 3294 3926 +4041 3295 3925 +4041 3295 3925 +4041 3296 3925 +4040 3296 3925 +4040 3297 3924 +4039 3299 3924 +4039 3300 3923 +4038 3303 3922 +4036 3306 3921 +4034 3310 3919 +4032 3315 3917 +4029 3322 3914 +4025 3332 3909 +4019 3344 3904 +4011 3360 3896 +4000 3381 3885 +3985 3407 3871 +3964 3440 3850 +3935 3480 3822 +3892 3529 3781 +3829 3587 3719 +3726 3654 3620 +3539 3732 3443 +3019 3818 2979 +4095 3353 4027 +4095 3353 4027 +4095 3353 4027 +4095 3353 4027 +4095 3353 4026 +4095 3353 4026 +4095 3353 4026 +4095 3353 4026 +4095 3354 4026 +4095 3354 4026 +4095 3354 4026 +4095 3355 4026 +4095 3356 4025 +4095 3357 4025 +4095 3359 4024 +4095 3361 4024 +4095 3363 4023 +4095 3367 4021 +4095 3372 4019 +4095 3378 4017 +4095 3387 4013 +4095 3397 4009 +4095 3412 4003 +4095 3430 3994 +4095 3454 3983 +4095 3483 3967 +4095 3520 3945 +4082 3565 3914 +4041 3619 3869 +3979 3682 3800 +3881 3755 3689 +3706 3837 3477 +4095 3421 4095 +4095 3421 4095 +4095 3421 4095 +4095 3421 4095 +4095 3421 4095 +4095 3421 4095 +4095 3422 4095 +4095 3422 4095 +4095 3422 4095 +4095 3422 4095 +4095 3423 4095 +4095 3423 4095 +4095 3424 4095 +4095 3425 4095 +4095 3426 4095 +4095 3428 4095 +4095 3431 4095 +4095 3434 4095 +4095 3438 4095 +4095 3443 4095 +4095 3451 4095 +4095 3460 4095 +4095 3473 4095 +4095 3489 4095 +4095 3509 4095 +4095 3536 4087 +4095 3568 4071 +4095 3609 4047 +4095 3658 4014 +4095 3717 3965 +4095 3785 3891 +4030 3862 3767 +0 3184 3454 +0 3184 3454 +0 3185 3454 +0 3185 3453 +0 3185 3453 +0 3185 3453 +0 3185 3453 +0 3185 3453 +0 3186 3452 +0 3186 3452 +0 3187 3451 +0 3188 3450 +0 3189 3449 +0 3191 3448 +0 3193 3446 +0 3196 3443 +0 3200 3439 +0 3205 3434 +0 3212 3427 +0 3221 3418 +0 3233 3405 +0 3248 3388 +0 3268 3363 +0 3293 3328 +0 3324 3276 +0 3363 3196 +0 3410 3061 +0 3467 2779 +0 3533 0 +0 3608 0 +0 3693 0 +0 3786 0 +0 3184 3454 +0 3184 3454 +0 3185 3454 +0 3185 3454 +0 3185 3453 +0 3185 3453 +0 3185 3453 +0 3185 3453 +0 3186 3452 +0 3186 3452 +0 3187 3451 +0 3188 3451 +0 3189 3449 +0 3191 3448 +0 3193 3446 +0 3196 3443 +0 3200 3439 +0 3205 3434 +0 3212 3427 +0 3221 3418 +0 3233 3405 +0 3248 3388 +0 3268 3363 +0 3293 3328 +0 3324 3276 +0 3363 3196 +0 3410 3061 +0 3467 2779 +0 3533 0 +0 3608 0 +0 3693 0 +0 3786 0 +0 3184 3454 +0 3184 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3453 +0 3185 3453 +0 3185 3453 +0 3186 3453 +0 3186 3452 +0 3187 3451 +0 3188 3451 +0 3189 3449 +0 3191 3448 +0 3193 3446 +0 3196 3443 +0 3200 3439 +0 3205 3434 +0 3212 3428 +0 3221 3418 +0 3233 3406 +0 3248 3388 +0 3268 3363 +0 3293 3328 +0 3324 3277 +0 3363 3197 +0 3411 3062 +0 3467 2780 +0 3533 0 +0 3608 0 +0 3693 0 +0 3786 0 +0 3184 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3453 +0 3185 3453 +0 3186 3453 +0 3186 3452 +0 3187 3452 +0 3188 3451 +0 3189 3450 +0 3191 3448 +0 3193 3446 +0 3196 3443 +0 3200 3440 +0 3205 3434 +0 3212 3428 +0 3221 3418 +0 3233 3406 +0 3248 3388 +0 3268 3364 +0 3293 3328 +0 3324 3277 +0 3363 3197 +0 3411 3062 +0 3467 2780 +0 3533 0 +0 3608 0 +0 3693 0 +0 3786 0 +0 3184 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3453 +0 3186 3453 +0 3186 3453 +0 3186 3452 +0 3187 3452 +0 3188 3451 +0 3189 3450 +0 3191 3448 +0 3193 3446 +0 3196 3443 +0 3200 3440 +0 3205 3435 +0 3212 3428 +0 3221 3419 +0 3233 3406 +0 3248 3388 +0 3268 3364 +0 3293 3329 +0 3324 3277 +0 3363 3197 +0 3411 3062 +0 3467 2781 +0 3533 0 +0 3608 0 +0 3693 0 +0 3786 0 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3186 3453 +0 3186 3453 +0 3186 3453 +0 3187 3452 +0 3188 3451 +0 3189 3450 +0 3191 3448 +0 3193 3446 +0 3196 3444 +0 3200 3440 +0 3205 3435 +0 3212 3428 +0 3221 3419 +0 3233 3406 +0 3248 3389 +0 3268 3364 +0 3293 3329 +0 3324 3277 +0 3363 3198 +0 3411 3063 +0 3467 2782 +0 3533 0 +0 3608 0 +0 3693 0 +0 3786 0 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3185 3454 +0 3186 3454 +0 3186 3453 +0 3187 3453 +0 3187 3452 +0 3188 3451 +0 3189 3450 +0 3191 3449 +0 3193 3447 +0 3196 3444 +0 3200 3440 +0 3205 3435 +0 3212 3428 +0 3221 3419 +0 3233 3406 +0 3248 3389 +0 3268 3364 +0 3293 3329 +0 3324 3278 +0 3363 3198 +0 3411 3064 +0 3467 2783 +0 3533 0 +0 3609 0 +0 3693 0 +0 3786 0 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3185 3454 +0 3186 3454 +0 3186 3454 +0 3187 3453 +0 3187 3453 +0 3188 3452 +0 3190 3451 +0 3191 3449 +0 3193 3447 +0 3196 3444 +0 3200 3441 +0 3205 3436 +0 3212 3429 +0 3221 3420 +0 3233 3407 +0 3248 3389 +0 3268 3365 +0 3293 3330 +0 3324 3278 +0 3363 3199 +0 3411 3065 +0 3467 2785 +0 3533 0 +0 3609 0 +0 3693 0 +0 3786 0 +0 3185 3456 +0 3185 3456 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3185 3455 +0 3186 3455 +0 3186 3455 +0 3186 3454 +0 3187 3454 +0 3187 3453 +0 3188 3452 +0 3190 3451 +0 3191 3450 +0 3194 3448 +0 3197 3445 +0 3200 3441 +0 3206 3436 +0 3212 3429 +0 3221 3420 +0 3233 3407 +0 3248 3390 +0 3268 3365 +0 3293 3331 +0 3325 3279 +0 3363 3200 +0 3411 3066 +0 3467 2787 +0 3533 0 +0 3609 0 +0 3693 0 +0 3786 0 +0 3185 3456 +0 3185 3456 +0 3185 3456 +0 3185 3456 +0 3185 3456 +0 3186 3456 +0 3186 3456 +0 3186 3455 +0 3186 3455 +0 3187 3455 +0 3188 3454 +0 3189 3453 +0 3190 3452 +0 3192 3450 +0 3194 3448 +0 3197 3446 +0 3201 3442 +0 3206 3437 +0 3213 3430 +0 3222 3421 +0 3233 3408 +0 3249 3391 +0 3268 3366 +0 3293 3331 +0 3325 3280 +0 3364 3201 +0 3411 3067 +0 3467 2790 +0 3533 0 +0 3609 0 +0 3693 0 +0 3786 0 +0 3185 3457 +0 3185 3457 +0 3185 3457 +0 3185 3457 +0 3186 3457 +0 3186 3457 +0 3186 3457 +0 3186 3456 +0 3187 3456 +0 3187 3456 +0 3188 3455 +0 3189 3454 +0 3190 3453 +0 3192 3451 +0 3194 3449 +0 3197 3447 +0 3201 3443 +0 3206 3438 +0 3213 3431 +0 3222 3422 +0 3234 3409 +0 3249 3392 +0 3268 3368 +0 3293 3333 +0 3325 3282 +0 3364 3203 +0 3411 3070 +0 3467 2794 +0 3533 0 +0 3609 0 +0 3693 0 +0 3786 0 +0 3186 3459 +0 3186 3458 +0 3186 3458 +0 3186 3458 +0 3186 3458 +0 3186 3458 +0 3186 3458 +0 3187 3458 +0 3187 3457 +0 3188 3457 +0 3188 3456 +0 3189 3455 +0 3190 3454 +0 3192 3453 +0 3194 3451 +0 3197 3448 +0 3201 3444 +0 3206 3439 +0 3213 3432 +0 3222 3423 +0 3234 3411 +0 3249 3393 +0 3269 3369 +0 3294 3334 +0 3325 3283 +0 3364 3205 +0 3411 3073 +0 3468 2800 +0 3533 0 +0 3609 0 +0 3693 0 +0 3786 0 +0 3186 3460 +0 3186 3460 +0 3186 3460 +0 3186 3460 +0 3186 3460 +0 3187 3460 +0 3187 3460 +0 3187 3459 +0 3187 3459 +0 3188 3458 +0 3189 3458 +0 3190 3457 +0 3191 3456 +0 3193 3454 +0 3195 3452 +0 3198 3450 +0 3202 3446 +0 3207 3441 +0 3214 3434 +0 3223 3425 +0 3234 3413 +0 3250 3395 +0 3269 3371 +0 3294 3337 +0 3325 3286 +0 3364 3208 +0 3411 3077 +0 3468 2807 +0 3534 0 +0 3609 0 +0 3694 0 +0 3787 0 +0 3187 3462 +0 3187 3462 +0 3187 3462 +0 3187 3462 +0 3187 3462 +0 3187 3462 +0 3187 3462 +0 3188 3462 +0 3188 3461 +0 3189 3461 +0 3189 3460 +0 3190 3459 +0 3191 3458 +0 3193 3457 +0 3195 3455 +0 3198 3452 +0 3202 3448 +0 3207 3443 +0 3214 3437 +0 3223 3428 +0 3235 3415 +0 3250 3398 +0 3270 3374 +0 3295 3339 +0 3326 3289 +0 3365 3212 +0 3412 3082 +0 3468 2816 +0 3534 0 +0 3609 0 +0 3694 0 +0 3787 0 +0 3187 3465 +0 3187 3465 +0 3187 3465 +0 3188 3465 +0 3188 3465 +0 3188 3465 +0 3188 3465 +0 3188 3465 +0 3189 3464 +0 3189 3464 +0 3190 3463 +0 3191 3462 +0 3192 3461 +0 3194 3460 +0 3196 3458 +0 3199 3455 +0 3203 3451 +0 3208 3446 +0 3215 3440 +0 3224 3431 +0 3235 3418 +0 3251 3401 +0 3270 3377 +0 3295 3343 +0 3326 3293 +0 3365 3217 +0 3412 3089 +0 3469 2829 +0 3534 0 +0 3610 0 +0 3694 0 +0 3787 0 +0 3188 3469 +0 3188 3469 +0 3188 3469 +0 3189 3469 +0 3189 3469 +0 3189 3469 +0 3189 3469 +0 3189 3468 +0 3190 3468 +0 3190 3468 +0 3191 3467 +0 3192 3466 +0 3193 3465 +0 3195 3464 +0 3197 3462 +0 3200 3459 +0 3204 3455 +0 3209 3451 +0 3216 3444 +0 3225 3435 +0 3236 3423 +0 3252 3406 +0 3271 3382 +0 3296 3349 +0 3327 3299 +0 3366 3224 +0 3413 3098 +0 3469 2844 +0 3535 106 +0 3610 0 +0 3694 0 +0 3787 0 +0 3190 3475 +0 3190 3475 +0 3190 3474 +0 3190 3474 +0 3190 3474 +0 3190 3474 +0 3190 3474 +0 3191 3474 +0 3191 3473 +0 3192 3473 +0 3192 3472 +0 3193 3471 +0 3195 3470 +0 3196 3469 +0 3198 3467 +0 3201 3464 +0 3205 3461 +0 3210 3456 +0 3217 3449 +0 3226 3441 +0 3238 3429 +0 3253 3412 +0 3272 3389 +0 3297 3355 +0 3328 3307 +0 3367 3233 +0 3414 3109 +0 3470 2865 +0 3535 1466 +0 3611 0 +0 3695 0 +0 3788 0 +0 3192 3481 +0 3192 3481 +0 3192 3481 +0 3192 3481 +0 3192 3481 +0 3192 3481 +0 3192 3481 +0 3193 3481 +0 3193 3480 +0 3193 3480 +0 3194 3479 +0 3195 3478 +0 3196 3477 +0 3198 3476 +0 3200 3474 +0 3203 3471 +0 3207 3468 +0 3212 3463 +0 3219 3457 +0 3228 3448 +0 3239 3436 +0 3254 3420 +0 3274 3397 +0 3298 3364 +0 3329 3317 +0 3368 3244 +0 3415 3125 +0 3471 2891 +0 3536 1839 +0 3611 0 +0 3695 0 +0 3788 0 +0 3194 3491 +0 3194 3491 +0 3194 3490 +0 3194 3490 +0 3194 3490 +0 3194 3490 +0 3195 3490 +0 3195 3490 +0 3195 3489 +0 3196 3489 +0 3197 3488 +0 3197 3488 +0 3199 3487 +0 3200 3485 +0 3202 3483 +0 3205 3481 +0 3209 3477 +0 3214 3473 +0 3221 3466 +0 3230 3458 +0 3241 3446 +0 3256 3430 +0 3276 3408 +0 3300 3376 +0 3331 3330 +0 3370 3259 +0 3416 3144 +0 3472 2923 +0 3537 2093 +0 3612 0 +0 3696 0 +0 3789 0 +0 3197 3502 +0 3197 3502 +0 3197 3502 +0 3197 3502 +0 3197 3502 +0 3198 3502 +0 3198 3502 +0 3198 3502 +0 3199 3501 +0 3199 3501 +0 3200 3500 +0 3201 3500 +0 3202 3498 +0 3203 3497 +0 3206 3495 +0 3209 3493 +0 3212 3489 +0 3217 3485 +0 3224 3479 +0 3233 3471 +0 3244 3459 +0 3259 3444 +0 3278 3422 +0 3303 3391 +0 3334 3347 +0 3372 3279 +0 3418 3169 +0 3474 2963 +0 3539 2299 +0 3613 0 +0 3697 0 +0 3790 0 +0 3201 3518 +0 3201 3518 +0 3202 3518 +0 3202 3518 +0 3202 3518 +0 3202 3517 +0 3202 3517 +0 3202 3517 +0 3203 3517 +0 3203 3516 +0 3204 3516 +0 3205 3515 +0 3206 3514 +0 3208 3513 +0 3210 3511 +0 3213 3508 +0 3216 3505 +0 3221 3501 +0 3228 3495 +0 3237 3487 +0 3248 3476 +0 3263 3461 +0 3282 3440 +0 3306 3411 +0 3337 3368 +0 3375 3304 +0 3421 3201 +0 3476 3012 +0 3541 2479 +0 3615 0 +0 3699 0 +0 3791 0 +0 3207 3538 +0 3207 3538 +0 3207 3537 +0 3207 3537 +0 3207 3537 +0 3207 3537 +0 3208 3537 +0 3208 3537 +0 3208 3537 +0 3209 3536 +0 3210 3536 +0 3210 3535 +0 3212 3534 +0 3213 3533 +0 3215 3531 +0 3218 3529 +0 3222 3526 +0 3227 3521 +0 3233 3516 +0 3242 3508 +0 3253 3498 +0 3268 3483 +0 3287 3464 +0 3311 3436 +0 3341 3395 +0 3379 3335 +0 3424 3240 +0 3479 3069 +0 3544 2644 +0 3617 0 +0 3701 0 +0 3792 0 +1728 3214 3563 +1725 3214 3563 +1722 3215 3563 +1717 3215 3563 +1710 3215 3563 +1701 3215 3562 +1688 3215 3562 +1671 3215 3562 +1647 3216 3562 +1612 3216 3561 +1562 3217 3561 +1483 3218 3560 +1352 3219 3559 +1082 3220 3558 +0 3223 3557 +0 3225 3554 +0 3229 3551 +0 3234 3548 +0 3240 3542 +0 3249 3535 +0 3260 3525 +0 3274 3512 +0 3293 3493 +0 3317 3467 +0 3346 3429 +0 3384 3374 +0 3429 3287 +0 3483 3137 +0 3547 2799 +0 3620 0 +0 3703 0 +0 3794 0 +2722 3224 3594 +2721 3224 3594 +2721 3224 3594 +2720 3224 3594 +2720 3224 3594 +2719 3225 3594 +2717 3225 3594 +2716 3225 3594 +2713 3225 3593 +2710 3226 3593 +2706 3227 3593 +2700 3227 3592 +2692 3229 3591 +2681 3230 3590 +2666 3232 3589 +2646 3235 3587 +2617 3238 3584 +2574 3243 3580 +2511 3250 3575 +2410 3258 3569 +2224 3269 3559 +1718 3283 3547 +0 3301 3530 +0 3324 3506 +0 3354 3471 +0 3390 3421 +0 3435 3343 +0 3489 3214 +0 3552 2948 +0 3624 0 +0 3706 0 +0 3797 0 +3077 3237 3634 +3077 3237 3634 +3077 3237 3633 +3077 3237 3633 +3076 3237 3633 +3076 3237 3633 +3075 3237 3633 +3075 3238 3633 +3073 3238 3633 +3072 3239 3632 +3070 3239 3632 +3068 3240 3631 +3064 3241 3631 +3059 3243 3630 +3053 3245 3628 +3044 3247 3626 +3032 3251 3624 +3016 3255 3621 +2993 3262 3616 +2960 3270 3610 +2913 3280 3602 +2840 3294 3590 +2720 3312 3575 +2485 3335 3553 +1404 3363 3522 +0 3399 3477 +0 3443 3409 +0 3496 3299 +0 3558 3092 +0 3630 2417 +0 3711 0 +0 3801 0 +3325 3253 3681 +3325 3253 3681 +3325 3253 3681 +3325 3253 3681 +3325 3254 3681 +3325 3254 3681 +3324 3254 3681 +3324 3254 3681 +3323 3254 3680 +3322 3255 3680 +3321 3255 3680 +3320 3256 3679 +3318 3257 3678 +3315 3259 3678 +3311 3261 3676 +3306 3263 3675 +3300 3267 3672 +3291 3271 3669 +3278 3277 3665 +3261 3285 3660 +3237 3295 3652 +3203 3308 3642 +3153 3326 3628 +3076 3348 3609 +2947 3376 3582 +2685 3411 3543 +0 3454 3485 +0 3505 3394 +0 3566 3233 +0 3637 2852 +0 3717 0 +0 3805 0 +3528 3274 3738 +3528 3274 3738 +3528 3274 3738 +3528 3274 3738 +3528 3275 3738 +3528 3275 3738 +3527 3275 3737 +3527 3275 3737 +3527 3275 3737 +3526 3276 3737 +3525 3276 3737 +3525 3277 3736 +3523 3278 3735 +3522 3280 3735 +3519 3281 3734 +3516 3284 3732 +3512 3287 3730 +3506 3291 3728 +3499 3297 3724 +3488 3305 3719 +3474 3314 3713 +3454 3327 3704 +3426 3344 3692 +3385 3365 3675 +3324 3392 3652 +3228 3426 3618 +3055 3467 3570 +2618 3517 3495 +0 3577 3371 +0 3646 3125 +0 3724 1639 +0 3812 0 +3707 3301 3804 +3707 3301 3804 +3707 3301 3804 +3707 3301 3804 +3707 3301 3804 +3706 3301 3804 +3706 3302 3804 +3706 3302 3804 +3706 3302 3803 +3705 3303 3803 +3705 3303 3803 +3704 3304 3803 +3703 3305 3802 +3702 3306 3801 +3701 3308 3800 +3699 3310 3799 +3696 3313 3797 +3692 3317 3795 +3687 3323 3792 +3680 3330 3788 +3671 3339 3782 +3658 3351 3775 +3640 3367 3764 +3615 3387 3750 +3580 3413 3730 +3527 3445 3703 +3446 3485 3663 +3308 3533 3603 +3017 3591 3508 +0 3658 3340 +0 3734 2924 +0 3820 0 +3871 3334 3880 +3871 3334 3880 +3871 3335 3880 +3871 3335 3880 +3871 3335 3880 +3871 3335 3880 +3870 3335 3880 +3870 3335 3879 +3870 3335 3879 +3870 3336 3879 +3869 3336 3879 +3869 3337 3879 +3868 3338 3878 +3868 3339 3878 +3867 3341 3877 +3865 3343 3876 +3863 3346 3874 +3861 3349 3872 +3857 3354 3870 +3852 3361 3866 +3846 3370 3862 +3837 3381 3855 +3825 3396 3846 +3809 3415 3835 +3786 3439 3818 +3753 3470 3796 +3706 3507 3763 +3633 3554 3716 +3513 3609 3644 +3279 3673 3525 +2216 3748 3294 +0 3831 2303 +4025 3376 3965 +4025 3376 3965 +4025 3376 3965 +4025 3376 3965 +4025 3376 3965 +4025 3376 3965 +4025 3376 3964 +4025 3376 3964 +4025 3377 3964 +4025 3377 3964 +4024 3377 3964 +4024 3378 3964 +4024 3379 3963 +4023 3380 3963 +4022 3381 3962 +4021 3383 3961 +4020 3386 3960 +4018 3389 3958 +4016 3394 3956 +4012 3400 3953 +4008 3408 3950 +4002 3418 3944 +3993 3432 3937 +3982 3450 3928 +3967 3472 3914 +3945 3501 3896 +3914 3536 3870 +3870 3579 3833 +3803 3632 3779 +3693 3693 3693 +3489 3765 3547 +2837 3845 3224 +4095 3425 4058 +4095 3426 4058 +4095 3426 4058 +4095 3426 4058 +4095 3426 4058 +4095 3426 4058 +4095 3426 4058 +4095 3426 4058 +4095 3426 4058 +4095 3427 4057 +4095 3427 4057 +4095 3428 4057 +4095 3428 4057 +4095 3429 4056 +4095 3431 4056 +4095 3432 4055 +4095 3435 4054 +4095 3438 4053 +4095 3442 4051 +4095 3447 4049 +4095 3455 4046 +4095 3464 4041 +4095 3476 4036 +4095 3492 4028 +4095 3513 4017 +4095 3539 4003 +4095 3572 3982 +4067 3612 3954 +4024 3661 3913 +3961 3719 3851 +3858 3787 3752 +3671 3864 3575 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3485 4095 +4095 3486 4095 +4095 3486 4095 +4095 3486 4095 +4095 3487 4095 +4095 3488 4095 +4095 3489 4095 +4095 3491 4095 +4095 3493 4095 +4095 3495 4095 +4095 3499 4095 +4095 3504 4095 +4095 3510 4095 +4095 3519 4095 +4095 3530 4095 +4095 3544 4095 +4095 3562 4095 +4095 3586 4095 +4095 3615 4095 +4095 3652 4077 +4095 3697 4046 +4095 3751 4001 +4095 3814 3932 +4014 3887 3821 +0 3316 3586 +0 3316 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3585 +0 3317 3585 +0 3317 3585 +0 3317 3585 +0 3318 3584 +0 3318 3584 +0 3319 3583 +0 3320 3582 +0 3321 3581 +0 3323 3580 +0 3325 3578 +0 3328 3575 +0 3332 3571 +0 3337 3566 +0 3344 3559 +0 3353 3550 +0 3365 3537 +0 3380 3520 +0 3400 3495 +0 3425 3460 +0 3456 3408 +0 3495 3328 +0 3543 3193 +0 3599 2911 +0 3665 0 +0 3740 0 +0 3825 0 +0 3316 3586 +0 3316 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3585 +0 3317 3585 +0 3317 3585 +0 3317 3585 +0 3318 3585 +0 3318 3584 +0 3319 3583 +0 3320 3583 +0 3321 3581 +0 3323 3580 +0 3325 3578 +0 3328 3575 +0 3332 3571 +0 3337 3566 +0 3344 3559 +0 3353 3550 +0 3365 3537 +0 3380 3520 +0 3400 3495 +0 3425 3460 +0 3456 3408 +0 3495 3328 +0 3543 3193 +0 3599 2911 +0 3665 0 +0 3741 0 +0 3825 0 +0 3316 3586 +0 3316 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3585 +0 3317 3585 +0 3318 3585 +0 3318 3585 +0 3318 3584 +0 3319 3583 +0 3320 3583 +0 3321 3581 +0 3323 3580 +0 3325 3578 +0 3328 3575 +0 3332 3571 +0 3337 3566 +0 3344 3560 +0 3353 3550 +0 3365 3538 +0 3380 3520 +0 3400 3495 +0 3425 3460 +0 3456 3408 +0 3495 3329 +0 3543 3194 +0 3599 2911 +0 3665 0 +0 3741 0 +0 3825 0 +0 3316 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3585 +0 3317 3585 +0 3318 3585 +0 3318 3585 +0 3318 3584 +0 3319 3584 +0 3320 3583 +0 3321 3582 +0 3323 3580 +0 3325 3578 +0 3328 3575 +0 3332 3571 +0 3337 3566 +0 3344 3560 +0 3353 3550 +0 3365 3538 +0 3380 3520 +0 3400 3495 +0 3425 3460 +0 3456 3409 +0 3495 3329 +0 3543 3194 +0 3599 2912 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3585 +0 3318 3585 +0 3318 3585 +0 3318 3584 +0 3319 3584 +0 3320 3583 +0 3321 3582 +0 3323 3580 +0 3325 3578 +0 3328 3575 +0 3332 3572 +0 3337 3567 +0 3344 3560 +0 3353 3551 +0 3365 3538 +0 3380 3520 +0 3400 3496 +0 3425 3460 +0 3456 3409 +0 3495 3329 +0 3543 3194 +0 3599 2912 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3318 3585 +0 3318 3585 +0 3319 3584 +0 3319 3584 +0 3320 3583 +0 3321 3582 +0 3323 3580 +0 3325 3578 +0 3328 3576 +0 3332 3572 +0 3337 3567 +0 3344 3560 +0 3353 3551 +0 3365 3538 +0 3380 3520 +0 3400 3496 +0 3425 3461 +0 3456 3409 +0 3495 3329 +0 3543 3194 +0 3599 2913 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3318 3586 +0 3318 3585 +0 3319 3585 +0 3319 3584 +0 3320 3583 +0 3321 3582 +0 3323 3581 +0 3325 3579 +0 3328 3576 +0 3332 3572 +0 3337 3567 +0 3344 3560 +0 3353 3551 +0 3365 3538 +0 3380 3521 +0 3400 3496 +0 3425 3461 +0 3456 3409 +0 3495 3330 +0 3543 3195 +0 3599 2914 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3586 +0 3317 3586 +0 3317 3586 +0 3318 3586 +0 3318 3585 +0 3319 3585 +0 3319 3584 +0 3320 3584 +0 3322 3582 +0 3323 3581 +0 3325 3579 +0 3328 3576 +0 3332 3572 +0 3338 3567 +0 3344 3561 +0 3353 3551 +0 3365 3539 +0 3380 3521 +0 3400 3496 +0 3425 3461 +0 3456 3410 +0 3495 3330 +0 3543 3196 +0 3599 2915 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3318 3587 +0 3318 3586 +0 3318 3586 +0 3319 3585 +0 3319 3585 +0 3320 3584 +0 3322 3583 +0 3323 3581 +0 3326 3579 +0 3328 3576 +0 3332 3573 +0 3338 3568 +0 3344 3561 +0 3353 3552 +0 3365 3539 +0 3380 3521 +0 3400 3497 +0 3425 3462 +0 3457 3410 +0 3495 3331 +0 3543 3197 +0 3599 2917 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3588 +0 3317 3588 +0 3317 3588 +0 3317 3588 +0 3317 3587 +0 3317 3587 +0 3317 3587 +0 3318 3587 +0 3318 3587 +0 3318 3586 +0 3319 3586 +0 3320 3585 +0 3321 3584 +0 3322 3583 +0 3323 3582 +0 3326 3580 +0 3329 3577 +0 3333 3573 +0 3338 3568 +0 3345 3561 +0 3354 3552 +0 3365 3540 +0 3381 3522 +0 3400 3498 +0 3425 3463 +0 3457 3411 +0 3496 3332 +0 3543 3198 +0 3599 2919 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3588 +0 3317 3588 +0 3317 3588 +0 3317 3588 +0 3317 3588 +0 3317 3588 +0 3318 3588 +0 3318 3588 +0 3318 3587 +0 3319 3587 +0 3319 3587 +0 3320 3586 +0 3321 3585 +0 3322 3584 +0 3324 3583 +0 3326 3580 +0 3329 3578 +0 3333 3574 +0 3338 3569 +0 3345 3562 +0 3354 3553 +0 3365 3540 +0 3381 3523 +0 3400 3498 +0 3425 3464 +0 3457 3412 +0 3496 3333 +0 3543 3200 +0 3599 2922 +0 3665 0 +0 3741 0 +0 3825 0 +0 3317 3589 +0 3317 3589 +0 3317 3589 +0 3317 3589 +0 3318 3589 +0 3318 3589 +0 3318 3589 +0 3318 3589 +0 3318 3588 +0 3319 3588 +0 3319 3588 +0 3320 3587 +0 3321 3586 +0 3322 3585 +0 3324 3583 +0 3326 3581 +0 3329 3579 +0 3333 3575 +0 3338 3570 +0 3345 3563 +0 3354 3554 +0 3366 3541 +0 3381 3524 +0 3401 3500 +0 3426 3465 +0 3457 3414 +0 3496 3335 +0 3543 3202 +0 3600 2927 +0 3665 0 +0 3741 0 +0 3825 0 +0 3318 3591 +0 3318 3591 +0 3318 3591 +0 3318 3590 +0 3318 3590 +0 3318 3590 +0 3318 3590 +0 3318 3590 +0 3319 3590 +0 3319 3589 +0 3320 3589 +0 3320 3588 +0 3321 3587 +0 3323 3586 +0 3324 3585 +0 3326 3583 +0 3329 3580 +0 3333 3576 +0 3338 3571 +0 3345 3565 +0 3354 3555 +0 3366 3543 +0 3381 3525 +0 3401 3501 +0 3426 3466 +0 3457 3415 +0 3496 3337 +0 3543 3205 +0 3600 2932 +0 3666 0 +0 3741 0 +0 3826 0 +0 3318 3592 +0 3318 3592 +0 3318 3592 +0 3318 3592 +0 3318 3592 +0 3318 3592 +0 3319 3592 +0 3319 3592 +0 3319 3591 +0 3320 3591 +0 3320 3591 +0 3321 3590 +0 3322 3589 +0 3323 3588 +0 3325 3586 +0 3327 3584 +0 3330 3582 +0 3334 3578 +0 3339 3573 +0 3346 3566 +0 3355 3557 +0 3366 3545 +0 3382 3527 +0 3401 3503 +0 3426 3469 +0 3458 3418 +0 3496 3340 +0 3544 3209 +0 3600 2939 +0 3666 0 +0 3741 0 +0 3826 0 +0 3319 3595 +0 3319 3595 +0 3319 3594 +0 3319 3594 +0 3319 3594 +0 3319 3594 +0 3319 3594 +0 3319 3594 +0 3320 3594 +0 3320 3593 +0 3321 3593 +0 3321 3592 +0 3322 3591 +0 3324 3590 +0 3325 3589 +0 3327 3587 +0 3330 3584 +0 3334 3580 +0 3339 3575 +0 3346 3569 +0 3355 3560 +0 3367 3547 +0 3382 3530 +0 3402 3506 +0 3427 3472 +0 3458 3421 +0 3497 3344 +0 3544 3214 +0 3600 2948 +0 3666 0 +0 3741 0 +0 3826 0 +0 3319 3598 +0 3319 3597 +0 3320 3597 +0 3320 3597 +0 3320 3597 +0 3320 3597 +0 3320 3597 +0 3320 3597 +0 3320 3597 +0 3321 3596 +0 3321 3596 +0 3322 3595 +0 3323 3594 +0 3324 3593 +0 3326 3592 +0 3328 3590 +0 3331 3587 +0 3335 3583 +0 3340 3579 +0 3347 3572 +0 3356 3563 +0 3368 3550 +0 3383 3533 +0 3402 3510 +0 3427 3475 +0 3459 3426 +0 3497 3349 +0 3544 3221 +0 3601 2961 +0 3666 0 +0 3742 0 +0 3826 0 +0 3320 3601 +0 3320 3601 +0 3321 3601 +0 3321 3601 +0 3321 3601 +0 3321 3601 +0 3321 3601 +0 3321 3601 +0 3321 3601 +0 3322 3600 +0 3322 3600 +0 3323 3599 +0 3324 3598 +0 3325 3597 +0 3327 3596 +0 3329 3594 +0 3332 3591 +0 3336 3587 +0 3341 3583 +0 3348 3576 +0 3357 3567 +0 3368 3555 +0 3384 3538 +0 3403 3514 +0 3428 3481 +0 3459 3431 +0 3498 3356 +0 3545 3230 +0 3601 2976 +0 3667 238 +0 3742 0 +0 3826 0 +0 3322 3607 +0 3322 3607 +0 3322 3607 +0 3322 3607 +0 3322 3606 +0 3322 3606 +0 3322 3606 +0 3323 3606 +0 3323 3606 +0 3323 3605 +0 3324 3605 +0 3324 3604 +0 3325 3604 +0 3327 3603 +0 3328 3601 +0 3330 3599 +0 3333 3596 +0 3337 3593 +0 3342 3588 +0 3349 3582 +0 3358 3573 +0 3370 3561 +0 3385 3544 +0 3404 3521 +0 3429 3487 +0 3460 3439 +0 3499 3365 +0 3546 3241 +0 3602 2997 +0 3668 1599 +0 3743 0 +0 3827 0 +0 3324 3614 +0 3324 3614 +0 3324 3614 +0 3324 3613 +0 3324 3613 +0 3324 3613 +0 3324 3613 +0 3324 3613 +0 3325 3613 +0 3325 3612 +0 3326 3612 +0 3326 3611 +0 3327 3611 +0 3328 3609 +0 3330 3608 +0 3332 3606 +0 3335 3603 +0 3339 3600 +0 3344 3595 +0 3351 3589 +0 3360 3580 +0 3371 3568 +0 3386 3552 +0 3406 3529 +0 3431 3496 +0 3462 3449 +0 3500 3376 +0 3547 3257 +0 3603 3023 +0 3668 1971 +0 3743 0 +0 3827 0 +0 3326 3623 +0 3326 3623 +0 3326 3623 +0 3326 3623 +0 3326 3622 +0 3326 3622 +0 3327 3622 +0 3327 3622 +0 3327 3622 +0 3327 3621 +0 3328 3621 +0 3329 3620 +0 3330 3620 +0 3331 3619 +0 3332 3617 +0 3335 3615 +0 3337 3613 +0 3341 3609 +0 3346 3605 +0 3353 3598 +0 3362 3590 +0 3374 3578 +0 3388 3562 +0 3408 3540 +0 3432 3508 +0 3463 3462 +0 3502 3392 +0 3548 3276 +0 3604 3055 +0 3669 2225 +0 3744 0 +0 3828 0 +0 3329 3635 +0 3329 3635 +0 3329 3634 +0 3329 3634 +0 3329 3634 +0 3330 3634 +0 3330 3634 +0 3330 3634 +0 3330 3634 +0 3331 3633 +0 3331 3633 +0 3332 3632 +0 3333 3632 +0 3334 3631 +0 3336 3629 +0 3338 3627 +0 3341 3625 +0 3344 3622 +0 3349 3617 +0 3356 3611 +0 3365 3603 +0 3376 3591 +0 3391 3576 +0 3410 3554 +0 3435 3523 +0 3466 3479 +0 3504 3411 +0 3550 3301 +0 3606 3095 +0 3671 2431 +0 3746 0 +0 3829 0 +0 3333 3650 +0 3333 3650 +0 3334 3650 +0 3334 3650 +0 3334 3650 +0 3334 3650 +0 3334 3649 +0 3334 3649 +0 3334 3649 +0 3335 3649 +0 3335 3648 +0 3336 3648 +0 3337 3647 +0 3338 3646 +0 3340 3645 +0 3342 3643 +0 3345 3641 +0 3349 3637 +0 3354 3633 +0 3360 3627 +0 3369 3619 +0 3380 3608 +0 3395 3593 +0 3414 3572 +0 3438 3543 +0 3469 3500 +0 3507 3436 +0 3553 3333 +0 3608 3144 +0 3673 2611 +0 3747 0 +0 3831 0 +0 3339 3670 +0 3339 3670 +0 3339 3670 +0 3339 3670 +0 3339 3670 +0 3339 3669 +0 3340 3669 +0 3340 3669 +0 3340 3669 +0 3340 3669 +0 3341 3668 +0 3342 3668 +0 3343 3667 +0 3344 3666 +0 3345 3665 +0 3347 3663 +0 3350 3661 +0 3354 3658 +0 3359 3654 +0 3365 3648 +0 3374 3640 +0 3385 3630 +0 3400 3616 +0 3419 3596 +0 3443 3568 +0 3473 3527 +0 3511 3467 +0 3556 3372 +0 3611 3202 +0 3676 2776 +0 3750 0 +0 3833 0 +1862 3346 3695 +1860 3347 3695 +1858 3347 3695 +1854 3347 3695 +1849 3347 3695 +1842 3347 3695 +1833 3347 3695 +1821 3347 3694 +1803 3347 3694 +1779 3348 3694 +1744 3348 3693 +1694 3349 3693 +1616 3350 3692 +1484 3351 3691 +1214 3353 3690 +0 3355 3689 +0 3357 3686 +0 3361 3684 +0 3366 3680 +0 3372 3674 +0 3381 3667 +0 3392 3657 +0 3406 3644 +0 3425 3625 +0 3449 3599 +0 3479 3562 +0 3516 3506 +0 3561 3419 +0 3615 3269 +0 3679 2931 +0 3753 0 +0 3835 0 +2854 3356 3727 +2854 3356 3727 +2853 3356 3726 +2853 3356 3726 +2853 3356 3726 +2852 3357 3726 +2851 3357 3726 +2849 3357 3726 +2848 3357 3726 +2845 3358 3726 +2842 3358 3725 +2838 3359 3725 +2832 3360 3724 +2824 3361 3723 +2813 3362 3722 +2798 3364 3721 +2778 3367 3719 +2749 3371 3716 +2706 3375 3712 +2643 3382 3707 +2542 3390 3701 +2357 3401 3692 +1850 3415 3679 +0 3433 3662 +0 3456 3638 +0 3486 3604 +0 3522 3553 +0 3567 3476 +0 3621 3346 +0 3684 3080 +0 3757 0 +0 3838 0 +3210 3369 3766 +3209 3369 3766 +3209 3369 3766 +3209 3369 3766 +3209 3369 3766 +3209 3369 3765 +3208 3369 3765 +3207 3370 3765 +3207 3370 3765 +3206 3370 3765 +3204 3371 3764 +3202 3371 3764 +3200 3372 3763 +3196 3373 3763 +3191 3375 3762 +3185 3377 3760 +3176 3379 3758 +3164 3383 3756 +3148 3387 3753 +3125 3394 3748 +3092 3402 3742 +3045 3412 3734 +2972 3426 3722 +2852 3444 3707 +2617 3467 3685 +1537 3495 3654 +0 3531 3609 +0 3575 3542 +0 3628 3431 +0 3690 3224 +0 3762 2549 +0 3843 0 +3457 3385 3813 +3457 3385 3813 +3457 3385 3813 +3457 3385 3813 +3457 3385 3813 +3457 3386 3813 +3457 3386 3813 +3456 3386 3813 +3456 3386 3813 +3455 3387 3812 +3454 3387 3812 +3453 3388 3812 +3452 3388 3811 +3450 3389 3811 +3447 3391 3810 +3443 3393 3808 +3439 3395 3807 +3432 3399 3805 +3423 3403 3802 +3410 3409 3797 +3393 3417 3792 +3369 3427 3785 +3335 3441 3774 +3285 3458 3761 +3208 3480 3741 +3079 3508 3714 +2817 3543 3675 +0 3586 3617 +0 3637 3526 +0 3698 3365 +0 3769 2984 +0 3849 0 +3660 3406 3870 +3660 3406 3870 +3660 3406 3870 +3660 3406 3870 +3660 3407 3870 +3660 3407 3870 +3660 3407 3870 +3660 3407 3870 +3659 3407 3869 +3659 3408 3869 +3658 3408 3869 +3658 3409 3869 +3657 3409 3868 +3655 3410 3868 +3654 3412 3867 +3651 3414 3866 +3648 3416 3864 +3644 3419 3862 +3638 3424 3860 +3631 3429 3856 +3620 3437 3851 +3606 3446 3845 +3586 3459 3836 +3558 3476 3824 +3517 3497 3807 +3456 3524 3784 +3360 3558 3750 +3187 3599 3702 +2750 3650 3627 +0 3709 3503 +0 3778 3257 +0 3856 1771 +3839 3433 3936 +3839 3433 3936 +3839 3433 3936 +3839 3433 3936 +3839 3433 3936 +3839 3433 3936 +3838 3433 3936 +3838 3434 3936 +3838 3434 3936 +3838 3434 3936 +3838 3435 3935 +3837 3435 3935 +3836 3436 3935 +3836 3437 3934 +3834 3438 3933 +3833 3440 3932 +3831 3442 3931 +3828 3445 3930 +3824 3449 3927 +3819 3455 3924 +3812 3462 3920 +3803 3471 3914 +3790 3483 3907 +3772 3499 3897 +3747 3519 3882 +3712 3545 3863 +3659 3577 3835 +3578 3617 3795 +3440 3665 3735 +3149 3723 3640 +0 3790 3472 +0 3867 3056 +4003 3467 4012 +4003 3467 4012 +4003 3467 4012 +4003 3467 4012 +4003 3467 4012 +4003 3467 4012 +4003 3467 4012 +4002 3467 4012 +4002 3467 4012 +4002 3468 4011 +4002 3468 4011 +4002 3468 4011 +4001 3469 4011 +4001 3470 4010 +4000 3471 4010 +3999 3473 4009 +3997 3475 4008 +3995 3478 4006 +3993 3482 4004 +3989 3487 4002 +3984 3493 3998 +3978 3502 3994 +3969 3513 3987 +3957 3528 3979 +3941 3547 3967 +3918 3571 3950 +3886 3602 3928 +3838 3640 3895 +3765 3686 3848 +3646 3741 3776 +3411 3806 3657 +2348 3880 3426 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3508 4095 +4095 3509 4095 +4095 3509 4095 +4095 3509 4095 +4095 3510 4095 +4095 3511 4095 +4095 3512 4095 +4095 3513 4094 +4095 3515 4093 +4095 3518 4092 +4095 3522 4091 +4095 3526 4088 +4095 3532 4086 +4095 3540 4082 +4095 3551 4076 +4095 3564 4069 +4095 3582 4060 +4095 3604 4046 +4077 3633 4028 +4046 3668 4002 +4002 3712 3965 +3935 3764 3911 +3826 3826 3826 +3621 3897 3679 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3558 4095 +4095 3559 4095 +4095 3559 4095 +4095 3560 4095 +4095 3560 4095 +4095 3561 4095 +4095 3563 4095 +4095 3564 4095 +4095 3567 4095 +4095 3570 4095 +4095 3574 4095 +4095 3580 4095 +4095 3587 4095 +4095 3596 4095 +4095 3608 4095 +4095 3624 4095 +4095 3645 4095 +4095 3671 4095 +4095 3704 4095 +4095 3744 4086 +4095 3793 4045 +4093 3851 3983 +3990 3919 3884 +0 3448 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3717 +0 3449 3717 +0 3449 3717 +0 3450 3717 +0 3450 3717 +0 3450 3716 +0 3451 3715 +0 3452 3715 +0 3453 3713 +0 3455 3712 +0 3457 3710 +0 3460 3707 +0 3464 3703 +0 3469 3698 +0 3476 3691 +0 3485 3682 +0 3497 3669 +0 3512 3652 +0 3532 3627 +0 3557 3592 +0 3588 3540 +0 3627 3460 +0 3675 3325 +0 3731 3043 +0 3797 0 +0 3873 0 +0 3448 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3717 +0 3449 3717 +0 3450 3717 +0 3450 3717 +0 3451 3716 +0 3451 3715 +0 3452 3715 +0 3453 3713 +0 3455 3712 +0 3457 3710 +0 3460 3707 +0 3464 3703 +0 3469 3698 +0 3476 3692 +0 3485 3682 +0 3497 3670 +0 3512 3652 +0 3532 3627 +0 3557 3592 +0 3588 3540 +0 3627 3460 +0 3675 3325 +0 3731 3043 +0 3797 0 +0 3873 0 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3717 +0 3449 3717 +0 3450 3717 +0 3450 3717 +0 3451 3716 +0 3451 3716 +0 3452 3715 +0 3453 3714 +0 3455 3712 +0 3457 3710 +0 3460 3707 +0 3464 3703 +0 3469 3698 +0 3476 3692 +0 3485 3682 +0 3497 3670 +0 3512 3652 +0 3532 3627 +0 3557 3592 +0 3588 3540 +0 3627 3461 +0 3675 3326 +0 3731 3043 +0 3797 0 +0 3873 0 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3717 +0 3450 3717 +0 3450 3717 +0 3451 3716 +0 3451 3716 +0 3452 3715 +0 3453 3714 +0 3455 3712 +0 3457 3710 +0 3460 3707 +0 3464 3703 +0 3469 3698 +0 3476 3692 +0 3485 3682 +0 3497 3670 +0 3512 3652 +0 3532 3627 +0 3557 3592 +0 3588 3541 +0 3627 3461 +0 3675 3326 +0 3731 3043 +0 3797 0 +0 3873 0 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3717 +0 3450 3717 +0 3450 3717 +0 3451 3716 +0 3451 3716 +0 3452 3715 +0 3453 3714 +0 3455 3712 +0 3457 3710 +0 3460 3707 +0 3464 3704 +0 3469 3699 +0 3476 3692 +0 3485 3682 +0 3497 3670 +0 3512 3652 +0 3532 3628 +0 3557 3592 +0 3588 3541 +0 3627 3461 +0 3675 3326 +0 3731 3044 +0 3797 0 +0 3873 0 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3450 3717 +0 3450 3717 +0 3451 3716 +0 3451 3716 +0 3452 3715 +0 3453 3714 +0 3455 3712 +0 3457 3710 +0 3460 3707 +0 3464 3704 +0 3469 3699 +0 3476 3692 +0 3485 3683 +0 3497 3670 +0 3512 3652 +0 3532 3628 +0 3557 3593 +0 3588 3541 +0 3627 3461 +0 3675 3326 +0 3731 3044 +0 3797 0 +0 3873 0 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3450 3717 +0 3450 3717 +0 3451 3717 +0 3451 3716 +0 3452 3715 +0 3454 3714 +0 3455 3712 +0 3457 3710 +0 3460 3708 +0 3464 3704 +0 3469 3699 +0 3476 3692 +0 3485 3683 +0 3497 3670 +0 3512 3653 +0 3532 3628 +0 3557 3593 +0 3588 3541 +0 3627 3461 +0 3675 3327 +0 3731 3045 +0 3797 0 +0 3873 0 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3449 3718 +0 3450 3718 +0 3450 3717 +0 3451 3717 +0 3451 3716 +0 3452 3715 +0 3454 3714 +0 3455 3713 +0 3457 3711 +0 3460 3708 +0 3464 3704 +0 3470 3699 +0 3476 3692 +0 3485 3683 +0 3497 3670 +0 3512 3653 +0 3532 3628 +0 3557 3593 +0 3589 3541 +0 3627 3462 +0 3675 3327 +0 3731 3046 +0 3797 0 +0 3873 0 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3718 +0 3450 3718 +0 3450 3718 +0 3450 3718 +0 3451 3717 +0 3451 3716 +0 3452 3716 +0 3454 3714 +0 3455 3713 +0 3458 3711 +0 3460 3708 +0 3464 3704 +0 3470 3699 +0 3476 3693 +0 3485 3683 +0 3497 3671 +0 3512 3653 +0 3532 3629 +0 3557 3593 +0 3589 3542 +0 3627 3462 +0 3675 3328 +0 3731 3047 +0 3797 0 +0 3873 0 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3449 3719 +0 3450 3719 +0 3450 3718 +0 3450 3718 +0 3451 3718 +0 3452 3717 +0 3452 3716 +0 3454 3715 +0 3455 3713 +0 3458 3711 +0 3461 3709 +0 3465 3705 +0 3470 3700 +0 3477 3693 +0 3486 3684 +0 3497 3671 +0 3513 3654 +0 3532 3629 +0 3557 3594 +0 3589 3542 +0 3628 3463 +0 3675 3329 +0 3731 3049 +0 3797 0 +0 3873 0 +0 3449 3720 +0 3449 3720 +0 3449 3720 +0 3449 3720 +0 3449 3720 +0 3449 3720 +0 3449 3719 +0 3450 3719 +0 3450 3719 +0 3450 3719 +0 3450 3719 +0 3451 3718 +0 3452 3717 +0 3453 3717 +0 3454 3715 +0 3456 3714 +0 3458 3712 +0 3461 3709 +0 3465 3705 +0 3470 3700 +0 3477 3694 +0 3486 3684 +0 3497 3672 +0 3513 3654 +0 3532 3630 +0 3557 3595 +0 3589 3543 +0 3628 3464 +0 3675 3330 +0 3731 3051 +0 3797 0 +0 3873 0 +0 3449 3721 +0 3449 3721 +0 3449 3720 +0 3449 3720 +0 3449 3720 +0 3449 3720 +0 3450 3720 +0 3450 3720 +0 3450 3720 +0 3450 3720 +0 3451 3719 +0 3451 3719 +0 3452 3718 +0 3453 3717 +0 3454 3716 +0 3456 3715 +0 3458 3713 +0 3461 3710 +0 3465 3706 +0 3470 3701 +0 3477 3694 +0 3486 3685 +0 3498 3672 +0 3513 3655 +0 3532 3631 +0 3557 3596 +0 3589 3544 +0 3628 3465 +0 3675 3332 +0 3731 3055 +0 3797 0 +0 3873 0 +0 3449 3721 +0 3449 3721 +0 3449 3721 +0 3450 3721 +0 3450 3721 +0 3450 3721 +0 3450 3721 +0 3450 3721 +0 3450 3721 +0 3450 3721 +0 3451 3720 +0 3451 3720 +0 3452 3719 +0 3453 3718 +0 3454 3717 +0 3456 3716 +0 3458 3714 +0 3461 3711 +0 3465 3707 +0 3470 3702 +0 3477 3695 +0 3486 3686 +0 3498 3674 +0 3513 3656 +0 3533 3632 +0 3558 3597 +0 3589 3546 +0 3628 3467 +0 3675 3334 +0 3732 3059 +0 3798 0 +0 3873 0 +0 3450 3723 +0 3450 3723 +0 3450 3723 +0 3450 3723 +0 3450 3723 +0 3450 3723 +0 3450 3722 +0 3450 3722 +0 3451 3722 +0 3451 3722 +0 3451 3721 +0 3452 3721 +0 3452 3720 +0 3453 3719 +0 3455 3718 +0 3456 3717 +0 3458 3715 +0 3461 3712 +0 3465 3708 +0 3471 3703 +0 3477 3697 +0 3486 3687 +0 3498 3675 +0 3513 3658 +0 3533 3633 +0 3558 3599 +0 3589 3548 +0 3628 3469 +0 3675 3337 +0 3732 3064 +0 3798 0 +0 3873 0 +0 3450 3724 +0 3450 3724 +0 3450 3724 +0 3450 3724 +0 3450 3724 +0 3450 3724 +0 3451 3724 +0 3451 3724 +0 3451 3724 +0 3451 3723 +0 3452 3723 +0 3452 3723 +0 3453 3722 +0 3454 3721 +0 3455 3720 +0 3457 3719 +0 3459 3717 +0 3462 3714 +0 3466 3710 +0 3471 3705 +0 3478 3698 +0 3487 3689 +0 3498 3677 +0 3514 3659 +0 3533 3635 +0 3558 3601 +0 3590 3550 +0 3628 3472 +0 3676 3341 +0 3732 3071 +0 3798 0 +0 3873 0 +0 3451 3727 +0 3451 3727 +0 3451 3727 +0 3451 3727 +0 3451 3727 +0 3451 3726 +0 3451 3726 +0 3451 3726 +0 3452 3726 +0 3452 3726 +0 3452 3725 +0 3453 3725 +0 3453 3724 +0 3454 3723 +0 3456 3722 +0 3457 3721 +0 3459 3719 +0 3462 3716 +0 3466 3712 +0 3471 3708 +0 3478 3701 +0 3487 3692 +0 3499 3679 +0 3514 3662 +0 3534 3638 +0 3559 3604 +0 3590 3553 +0 3629 3476 +0 3676 3346 +0 3732 3081 +0 3798 0 +0 3873 0 +0 3451 3730 +0 3452 3730 +0 3452 3730 +0 3452 3730 +0 3452 3729 +0 3452 3729 +0 3452 3729 +0 3452 3729 +0 3452 3729 +0 3453 3729 +0 3453 3728 +0 3453 3728 +0 3454 3727 +0 3455 3726 +0 3456 3725 +0 3458 3724 +0 3460 3722 +0 3463 3719 +0 3467 3716 +0 3472 3711 +0 3479 3704 +0 3488 3695 +0 3500 3683 +0 3515 3666 +0 3534 3642 +0 3559 3608 +0 3591 3558 +0 3629 3481 +0 3676 3353 +0 3733 3093 +0 3798 0 +0 3874 0 +0 3453 3734 +0 3453 3734 +0 3453 3734 +0 3453 3734 +0 3453 3733 +0 3453 3733 +0 3453 3733 +0 3453 3733 +0 3453 3733 +0 3454 3733 +0 3454 3732 +0 3454 3732 +0 3455 3731 +0 3456 3730 +0 3457 3729 +0 3459 3728 +0 3461 3726 +0 3464 3723 +0 3468 3720 +0 3473 3715 +0 3480 3708 +0 3489 3699 +0 3501 3687 +0 3516 3670 +0 3535 3646 +0 3560 3613 +0 3591 3563 +0 3630 3488 +0 3677 3362 +0 3733 3109 +0 3799 370 +0 3874 0 +0 3454 3739 +0 3454 3739 +0 3454 3739 +0 3454 3739 +0 3454 3739 +0 3454 3739 +0 3454 3738 +0 3454 3738 +0 3455 3738 +0 3455 3738 +0 3455 3738 +0 3456 3737 +0 3457 3737 +0 3457 3736 +0 3459 3735 +0 3460 3733 +0 3463 3731 +0 3465 3729 +0 3469 3725 +0 3474 3720 +0 3481 3714 +0 3490 3705 +0 3502 3693 +0 3517 3676 +0 3536 3653 +0 3561 3620 +0 3592 3571 +0 3631 3497 +0 3678 3374 +0 3734 3129 +0 3800 1731 +0 3875 0 +0 3456 3746 +0 3456 3746 +0 3456 3746 +0 3456 3746 +0 3456 3746 +0 3456 3745 +0 3456 3745 +0 3456 3745 +0 3456 3745 +0 3457 3745 +0 3457 3744 +0 3458 3744 +0 3458 3743 +0 3459 3743 +0 3460 3742 +0 3462 3740 +0 3464 3738 +0 3467 3736 +0 3471 3732 +0 3476 3727 +0 3483 3721 +0 3492 3712 +0 3503 3700 +0 3518 3684 +0 3538 3661 +0 3563 3629 +0 3594 3581 +0 3632 3508 +0 3679 3389 +0 3735 3155 +0 3800 2103 +0 3875 0 +0 3458 3755 +0 3458 3755 +0 3458 3755 +0 3458 3755 +0 3458 3755 +0 3458 3755 +0 3458 3754 +0 3459 3754 +0 3459 3754 +0 3459 3754 +0 3460 3754 +0 3460 3753 +0 3461 3753 +0 3462 3752 +0 3463 3751 +0 3465 3749 +0 3467 3747 +0 3470 3745 +0 3473 3741 +0 3479 3737 +0 3485 3731 +0 3494 3722 +0 3506 3710 +0 3521 3694 +0 3540 3672 +0 3565 3640 +0 3595 3594 +0 3634 3524 +0 3681 3409 +0 3736 3187 +0 3802 2357 +0 3876 0 +0 3461 3767 +0 3461 3767 +0 3461 3767 +0 3461 3767 +0 3461 3767 +0 3462 3766 +0 3462 3766 +0 3462 3766 +0 3462 3766 +0 3462 3766 +0 3463 3765 +0 3463 3765 +0 3464 3764 +0 3465 3764 +0 3466 3763 +0 3468 3761 +0 3470 3759 +0 3473 3757 +0 3477 3754 +0 3482 3749 +0 3488 3743 +0 3497 3735 +0 3508 3723 +0 3523 3708 +0 3543 3686 +0 3567 3655 +0 3598 3611 +0 3636 3543 +0 3682 3434 +0 3738 3227 +0 3803 2563 +0 3878 0 +0 3466 3782 +0 3466 3782 +0 3466 3782 +0 3466 3782 +0 3466 3782 +0 3466 3782 +0 3466 3782 +0 3466 3782 +0 3466 3781 +0 3467 3781 +0 3467 3781 +0 3467 3780 +0 3468 3780 +0 3469 3779 +0 3470 3778 +0 3472 3777 +0 3474 3775 +0 3477 3773 +0 3481 3769 +0 3486 3765 +0 3492 3759 +0 3501 3751 +0 3512 3740 +0 3527 3725 +0 3546 3704 +0 3570 3675 +0 3601 3632 +0 3639 3568 +0 3685 3465 +0 3740 3276 +0 3805 2743 +0 3879 0 +0 3471 3802 +0 3471 3802 +0 3471 3802 +0 3471 3802 +0 3471 3802 +0 3471 3802 +0 3472 3802 +0 3472 3801 +0 3472 3801 +0 3472 3801 +0 3473 3801 +0 3473 3800 +0 3474 3800 +0 3475 3799 +0 3476 3798 +0 3477 3797 +0 3480 3795 +0 3482 3793 +0 3486 3790 +0 3491 3786 +0 3498 3780 +0 3506 3772 +0 3517 3762 +0 3532 3748 +0 3551 3728 +0 3575 3700 +0 3605 3660 +0 3643 3599 +0 3689 3504 +0 3743 3334 +0 3808 2908 +0 3882 0 +1996 3479 3827 +1994 3479 3827 +1992 3479 3827 +1990 3479 3827 +1986 3479 3827 +1981 3479 3827 +1974 3479 3827 +1965 3479 3827 +1953 3479 3826 +1935 3480 3826 +1911 3480 3826 +1877 3480 3826 +1826 3481 3825 +1748 3482 3824 +1616 3483 3824 +1346 3485 3822 +0 3487 3821 +0 3490 3819 +0 3493 3816 +0 3498 3812 +0 3505 3806 +0 3513 3799 +0 3524 3789 +0 3538 3776 +0 3557 3757 +0 3581 3731 +0 3611 3694 +0 3648 3638 +0 3693 3551 +0 3748 3401 +0 3811 3063 +0 3885 0 +2986 3488 3859 +2986 3488 3859 +2986 3488 3859 +2986 3488 3859 +2985 3488 3859 +2985 3489 3858 +2984 3489 3858 +2983 3489 3858 +2982 3489 3858 +2980 3489 3858 +2977 3490 3858 +2974 3490 3857 +2970 3491 3857 +2964 3492 3856 +2956 3493 3855 +2945 3494 3854 +2931 3496 3853 +2910 3499 3851 +2881 3503 3848 +2839 3507 3844 +2775 3514 3839 +2674 3522 3833 +2489 3533 3824 +1982 3547 3811 +0 3565 3794 +0 3589 3770 +0 3618 3736 +0 3655 3685 +0 3699 3608 +0 3753 3478 +0 3816 3212 +0 3889 0 +3342 3501 3898 +3342 3501 3898 +3342 3501 3898 +3341 3501 3898 +3341 3501 3898 +3341 3501 3898 +3341 3501 3898 +3340 3501 3897 +3340 3502 3897 +3339 3502 3897 +3338 3502 3897 +3336 3503 3897 +3334 3503 3896 +3332 3504 3896 +3328 3505 3895 +3323 3507 3894 +3317 3509 3892 +3308 3511 3891 +3296 3515 3888 +3280 3520 3885 +3257 3526 3880 +3224 3534 3874 +3177 3544 3866 +3104 3558 3854 +2984 3576 3839 +2749 3599 3817 +1669 3628 3786 +0 3663 3741 +0 3707 3674 +0 3760 3564 +0 3822 3356 +0 3894 2681 +3590 3517 3945 +3590 3517 3945 +3590 3517 3945 +3589 3517 3945 +3589 3518 3945 +3589 3518 3945 +3589 3518 3945 +3589 3518 3945 +3588 3518 3945 +3588 3518 3945 +3587 3519 3945 +3586 3519 3944 +3585 3520 3944 +3584 3520 3943 +3582 3522 3943 +3579 3523 3942 +3576 3525 3941 +3571 3527 3939 +3564 3531 3937 +3555 3535 3934 +3543 3541 3930 +3525 3549 3924 +3501 3559 3917 +3467 3573 3907 +3417 3590 3893 +3340 3612 3873 +3211 3640 3846 +2949 3675 3807 +0 3718 3749 +0 3769 3658 +0 3830 3497 +0 3901 3116 +3792 3538 4002 +3792 3538 4002 +3792 3538 4002 +3792 3539 4002 +3792 3539 4002 +3792 3539 4002 +3792 3539 4002 +3792 3539 4002 +3792 3539 4002 +3791 3539 4002 +3791 3540 4001 +3790 3540 4001 +3790 3541 4001 +3789 3541 4000 +3787 3542 4000 +3786 3544 3999 +3783 3546 3998 +3780 3548 3996 +3776 3551 3994 +3770 3556 3992 +3763 3561 3988 +3752 3569 3983 +3738 3579 3977 +3718 3591 3968 +3690 3608 3956 +3649 3629 3939 +3588 3656 3916 +3492 3690 3882 +3319 3731 3834 +2882 3782 3759 +0 3841 3636 +0 3910 3389 +3971 3565 4068 +3971 3565 4068 +3971 3565 4068 +3971 3565 4068 +3971 3565 4068 +3971 3565 4068 +3971 3565 4068 +3971 3566 4068 +3970 3566 4068 +3970 3566 4068 +3970 3566 4068 +3970 3567 4067 +3969 3567 4067 +3968 3568 4067 +3968 3569 4066 +3966 3570 4066 +3965 3572 4065 +3963 3574 4063 +3960 3577 4062 +3956 3581 4059 +3951 3587 4056 +3944 3594 4052 +3935 3603 4047 +3922 3615 4039 +3904 3631 4029 +3879 3651 4014 +3844 3677 3995 +3791 3709 3967 +3710 3749 3927 +3572 3797 3867 +3281 3855 3772 +0 3922 3604 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3599 4095 +4095 3600 4095 +4095 3600 4095 +4095 3601 4095 +4095 3601 4095 +4095 3602 4095 +4095 3603 4095 +4095 3605 4095 +4095 3607 4095 +4095 3610 4095 +4095 3614 4095 +4095 3619 4095 +4095 3625 4095 +4095 3634 4095 +4095 3645 4095 +4090 3660 4095 +4073 3679 4095 +4050 3703 4083 +4018 3734 4060 +3970 3772 4027 +3897 3818 3980 +3778 3873 3908 +3543 3938 3789 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3640 4095 +4095 3641 4095 +4095 3641 4095 +4095 3641 4095 +4095 3642 4095 +4095 3642 4095 +4095 3643 4095 +4095 3644 4095 +4095 3646 4095 +4095 3648 4095 +4095 3650 4095 +4095 3654 4095 +4095 3658 4095 +4095 3664 4095 +4095 3672 4095 +4095 3683 4095 +4095 3696 4095 +4095 3714 4095 +4095 3736 4095 +4095 3765 4095 +4095 3800 4095 +4095 3844 4095 +4067 3896 4043 +3958 3958 3958 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset new file mode 100644 index 0000000000..a91e9d0c1a --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset @@ -0,0 +1,32780 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [ + 0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [ + 0, 0, 0, + 0, 0, 0, + 0, 15, 0, + 0, 104, 0, + 0, 201, 0, + 0, 305, 0, + 0, 415, 0, + 0, 530, 0, + 0, 649, 0, + 0, 771, 0, + 0, 895, 0, + 0, 1022, 0, + 0, 1149, 0, + 0, 1278, 0, + 0, 1408, 0, + 0, 1538, 0, + 0, 1668, 0, + 0, 1799, 0, + 0, 1931, 0, + 0, 2062, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2457, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 130, 0, 20, + 28, 0, 0, + 0, 33, 0, + 0, 119, 0, + 0, 213, 0, + 0, 315, 0, + 0, 423, 0, + 0, 536, 0, + 0, 654, 0, + 0, 775, 0, + 0, 898, 0, + 0, 1024, 0, + 0, 1151, 0, + 0, 1279, 0, + 0, 1408, 0, + 0, 1538, 0, + 0, 1669, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2062, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 342, 0, 170, + 280, 0, 102, + 183, 56, 0, + 7, 139, 0, + 0, 229, 0, + 0, 328, 0, + 0, 433, 0, + 0, 544, 0, + 0, 660, 0, + 0, 779, 0, + 0, 902, 0, + 0, 1026, 0, + 0, 1153, 0, + 0, 1281, 0, + 0, 1410, 0, + 0, 1539, 0, + 0, 1670, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 526, 0, 315, + 486, 18, 266, + 426, 86, 192, + 331, 163, 68, + 163, 250, 0, + 0, 344, 0, + 0, 446, 0, + 0, 555, 0, + 0, 668, 0, + 0, 785, 0, + 0, 906, 0, + 0, 1030, 0, + 0, 1156, 0, + 0, 1283, 0, + 0, 1411, 0, + 0, 1540, 0, + 0, 1670, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 693, 8, 457, + 666, 60, 422, + 626, 123, 370, + 568, 195, 290, + 475, 276, 155, + 312, 366, 0, + 0, 463, 0, + 0, 568, 0, + 0, 678, 0, + 0, 794, 0, + 0, 913, 0, + 0, 1035, 0, + 0, 1159, 0, + 0, 1285, 0, + 0, 1413, 0, + 0, 1542, 0, + 0, 1672, 0, + 0, 1802, 0, + 0, 1932, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 850, 65, 596, + 831, 112, 570, + 804, 168, 534, + 765, 233, 479, + 707, 308, 395, + 616, 393, 250, + 457, 485, 0, + 82, 585, 0, + 0, 692, 0, + 0, 804, 0, + 0, 921, 0, + 0, 1041, 0, + 0, 1164, 0, + 0, 1289, 0, + 0, 1416, 0, + 0, 1544, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 999, 131, 733, + 986, 172, 714, + 967, 222, 688, + 940, 280, 650, + 901, 348, 594, + 844, 426, 505, + 755, 513, 352, + 598, 608, 3, + 235, 710, 0, + 0, 818, 0, + 0, 932, 0, + 0, 1049, 0, + 0, 1170, 0, + 0, 1294, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1675, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1144, 207, 869, + 1134, 242, 855, + 1121, 285, 836, + 1102, 336, 809, + 1075, 397, 770, + 1037, 468, 712, + 980, 547, 621, + 892, 636, 461, + 737, 732, 82, + 382, 836, 0, + 0, 946, 0, + 0, 1060, 0, + 0, 1179, 0, + 0, 1300, 0, + 0, 1424, 0, + 0, 1550, 0, + 0, 1678, 0, + 0, 1807, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1286, 293, 1004, + 1278, 322, 994, + 1268, 358, 980, + 1255, 402, 960, + 1236, 455, 932, + 1210, 518, 893, + 1172, 590, 833, + 1115, 671, 740, + 1027, 761, 574, + 874, 859, 170, + 525, 964, 0, + 0, 1074, 0, + 0, 1190, 0, + 0, 1309, 0, + 0, 1431, 0, + 0, 1555, 0, + 0, 1682, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1424, 386, 1138, + 1419, 410, 1131, + 1412, 440, 1120, + 1402, 477, 1106, + 1389, 523, 1086, + 1370, 577, 1058, + 1343, 641, 1018, + 1306, 714, 958, + 1250, 797, 862, + 1162, 888, 692, + 1010, 987, 267, + 665, 1093, 0, + 0, 1204, 0, + 0, 1320, 0, + 0, 1439, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1562, 487, 1272, + 1558, 506, 1266, + 1552, 531, 1258, + 1545, 561, 1248, + 1535, 599, 1234, + 1522, 646, 1213, + 1503, 701, 1185, + 1477, 766, 1144, + 1439, 840, 1084, + 1383, 924, 987, + 1296, 1016, 813, + 1145, 1116, 370, + 802, 1222, 0, + 0, 1334, 0, + 0, 1450, 0, + 0, 1570, 0, + 0, 1693, 0, + 0, 1818, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2331, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1697, 595, 1405, + 1695, 610, 1401, + 1691, 629, 1395, + 1685, 654, 1387, + 1678, 685, 1377, + 1668, 724, 1362, + 1655, 771, 1342, + 1636, 827, 1314, + 1610, 893, 1273, + 1572, 968, 1211, + 1517, 1053, 1113, + 1430, 1145, 937, + 1279, 1246, 479, + 939, 1352, 0, + 0, 1465, 0, + 0, 1581, 0, + 0, 1701, 0, + 0, 1824, 0, + 0, 1950, 0, + 0, 2076, 0, + 0, 2204, 0, + 0, 2334, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1832, 707, 1538, + 1830, 719, 1535, + 1827, 735, 1531, + 1823, 755, 1525, + 1818, 780, 1517, + 1811, 811, 1507, + 1801, 851, 1492, + 1788, 898, 1472, + 1769, 955, 1443, + 1743, 1021, 1402, + 1705, 1097, 1340, + 1650, 1182, 1241, + 1563, 1275, 1062, + 1412, 1376, 594, + 1074, 1483, 0, + 0, 1596, 0, + 0, 1712, 0, + 0, 1833, 0, + 0, 1956, 0, + 0, 2081, 0, + 0, 2208, 0, + 0, 2336, 0, + 0, 2466, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1966, 824, 1671, + 1965, 834, 1668, + 1963, 846, 1665, + 1960, 861, 1661, + 1956, 881, 1655, + 1951, 907, 1647, + 1943, 939, 1637, + 1934, 978, 1622, + 1920, 1026, 1602, + 1902, 1084, 1573, + 1875, 1150, 1531, + 1838, 1227, 1469, + 1782, 1312, 1370, + 1696, 1406, 1190, + 1545, 1507, 712, + 1209, 1614, 0, + 0, 1727, 0, + 0, 1844, 0, + 0, 1964, 0, + 0, 2088, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2100, 945, 1803, + 2099, 952, 1802, + 2097, 961, 1799, + 2095, 973, 1796, + 2092, 989, 1792, + 2088, 1009, 1786, + 2083, 1035, 1778, + 2076, 1067, 1768, + 2066, 1107, 1753, + 2053, 1156, 1732, + 2034, 1213, 1703, + 2008, 1280, 1662, + 1970, 1357, 1599, + 1915, 1442, 1499, + 1828, 1536, 1318, + 1678, 1638, 834, + 1342, 1745, 0, + 0, 1858, 0, + 0, 1976, 0, + 0, 2096, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2730, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2233, 1068, 1936, + 2232, 1074, 1935, + 2231, 1081, 1933, + 2230, 1090, 1930, + 2227, 1102, 1927, + 2225, 1118, 1923, + 2221, 1139, 1917, + 2215, 1164, 1909, + 2208, 1197, 1899, + 2198, 1237, 1884, + 2185, 1286, 1863, + 2166, 1343, 1834, + 2140, 1411, 1793, + 2103, 1488, 1730, + 2047, 1573, 1629, + 1961, 1668, 1447, + 1811, 1769, 958, + 1476, 1877, 0, + 0, 1990, 0, + 0, 2107, 0, + 0, 2228, 0, + 0, 2351, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2366, 1194, 2068, + 2366, 1198, 2067, + 2365, 1203, 2066, + 2364, 1210, 2064, + 2362, 1220, 2062, + 2360, 1232, 2059, + 2357, 1248, 2054, + 2353, 1268, 2049, + 2348, 1294, 2041, + 2340, 1327, 2030, + 2331, 1367, 2015, + 2317, 1416, 1995, + 2299, 1474, 1966, + 2273, 1542, 1924, + 2235, 1619, 1861, + 2180, 1705, 1760, + 2093, 1799, 1577, + 1944, 1901, 1084, + 1609, 2009, 0, + 0, 2122, 0, + 0, 2239, 0, + 0, 2360, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2499, 1321, 2200, + 2499, 1324, 2200, + 2498, 1328, 2199, + 2497, 1333, 2197, + 2496, 1340, 2196, + 2494, 1350, 2193, + 2492, 1362, 2190, + 2489, 1378, 2186, + 2485, 1399, 2180, + 2480, 1425, 2172, + 2473, 1458, 2161, + 2463, 1498, 2147, + 2450, 1547, 2126, + 2431, 1605, 2097, + 2405, 1673, 2055, + 2367, 1750, 1992, + 2312, 1836, 1891, + 2226, 1931, 1708, + 2076, 2032, 1211, + 1742, 2140, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2632, 1449, 2333, + 2631, 1451, 2332, + 2631, 1454, 2331, + 2630, 1458, 2330, + 2629, 1464, 2329, + 2628, 1471, 2327, + 2626, 1481, 2325, + 2624, 1493, 2322, + 2621, 1509, 2318, + 2617, 1530, 2312, + 2612, 1556, 2304, + 2605, 1589, 2293, + 2595, 1629, 2278, + 2582, 1678, 2258, + 2563, 1736, 2229, + 2537, 1804, 2187, + 2500, 1881, 2123, + 2444, 1968, 2023, + 2358, 2062, 1839, + 2208, 2164, 1340, + 1874, 2272, 0, + 0, 2385, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1578, 2465, + 2764, 1580, 2465, + 2763, 1582, 2464, + 2763, 1585, 2463, + 2762, 1589, 2462, + 2761, 1595, 2461, + 2760, 1602, 2459, + 2759, 1612, 2457, + 2756, 1624, 2454, + 2753, 1640, 2449, + 2750, 1661, 2444, + 2744, 1687, 2436, + 2737, 1720, 2425, + 2727, 1760, 2410, + 2714, 1809, 2389, + 2695, 1868, 2360, + 2669, 1936, 2318, + 2632, 2013, 2255, + 2577, 2099, 2154, + 2490, 2194, 1970, + 2341, 2296, 1469, + 2007, 2404, 0, + 0, 2517, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1708, 2597, + 2896, 1709, 2597, + 2896, 1711, 2596, + 2896, 1713, 2596, + 2895, 1716, 2595, + 2894, 1721, 2594, + 2893, 1726, 2593, + 2892, 1733, 2591, + 2891, 1743, 2589, + 2889, 1755, 2586, + 2886, 1771, 2581, + 2882, 1792, 2575, + 2876, 1818, 2568, + 2869, 1851, 2557, + 2859, 1892, 2542, + 2846, 1941, 2521, + 2828, 1999, 2492, + 2801, 2067, 2450, + 2764, 2145, 2387, + 2709, 2231, 2286, + 2622, 2326, 2101, + 2473, 2428, 1599, + 2139, 2536, 0, + 0, 2649, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1838, 2729, + 3029, 1839, 2729, + 3028, 1841, 2729, + 3028, 1842, 2728, + 3028, 1845, 2728, + 3027, 1848, 2727, + 3027, 1852, 2726, + 3026, 1858, 2725, + 3024, 1865, 2723, + 3023, 1874, 2721, + 3021, 1887, 2717, + 3018, 1903, 2713, + 3014, 1924, 2707, + 3009, 1950, 2699, + 3001, 1983, 2689, + 2992, 2024, 2674, + 2978, 2073, 2653, + 2960, 2131, 2624, + 2934, 2199, 2582, + 2896, 2277, 2519, + 2841, 2363, 2418, + 2755, 2458, 2233, + 2605, 2560, 1730, + 2272, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3143, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1969, 2861, + 3161, 1970, 2861, + 3161, 1971, 2861, + 3160, 1972, 2861, + 3160, 1974, 2860, + 3160, 1976, 2860, + 3159, 1980, 2859, + 3159, 1984, 2858, + 3158, 1989, 2857, + 3157, 1996, 2855, + 3155, 2006, 2853, + 3153, 2018, 2849, + 3150, 2035, 2845, + 3146, 2055, 2839, + 3141, 2082, 2831, + 3134, 2115, 2821, + 3124, 2155, 2806, + 3110, 2205, 2785, + 3092, 2263, 2756, + 3066, 2331, 2714, + 3028, 2409, 2651, + 2973, 2495, 2549, + 2887, 2590, 2365, + 2737, 2692, 1861, + 2404, 2800, 0, + 0, 2913, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2100, 2994, + 3293, 2101, 2993, + 3293, 2102, 2993, + 3293, 2103, 2993, + 3293, 2104, 2993, + 3292, 2106, 2992, + 3292, 2108, 2992, + 3291, 2111, 2991, + 3291, 2115, 2990, + 3290, 2121, 2989, + 3289, 2128, 2987, + 3287, 2138, 2985, + 3285, 2150, 2981, + 3282, 2166, 2977, + 3278, 2187, 2971, + 3273, 2213, 2963, + 3266, 2246, 2953, + 3256, 2287, 2938, + 3242, 2336, 2917, + 3224, 2395, 2888, + 3198, 2463, 2846, + 3161, 2541, 2783, + 3105, 2627, 2681, + 3019, 2722, 2497, + 2870, 2824, 1992, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2232, 3126, + 3425, 2232, 3126, + 3425, 2233, 3125, + 3425, 2233, 3125, + 3425, 2234, 3125, + 3425, 2236, 3125, + 3424, 2238, 3124, + 3424, 2240, 3124, + 3424, 2243, 3123, + 3423, 2247, 3122, + 3422, 2253, 3121, + 3421, 2260, 3119, + 3419, 2270, 3117, + 3417, 2282, 3113, + 3414, 2298, 3109, + 3410, 2319, 3103, + 3405, 2345, 3095, + 3398, 2378, 3085, + 3388, 2419, 3070, + 3375, 2468, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2813, + 3151, 2854, 2629, + 3002, 2956, 2124, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2363, 3258, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2365, 3257, + 3557, 2366, 3257, + 3557, 2368, 3257, + 3557, 2370, 3256, + 3556, 2372, 3256, + 3556, 2375, 3255, + 3555, 2379, 3254, + 3554, 2385, 3253, + 3553, 2392, 3251, + 3551, 2402, 3249, + 3549, 2414, 3245, + 3546, 2430, 3241, + 3542, 2451, 3235, + 3537, 2477, 3227, + 3530, 2510, 3217, + 3520, 2551, 3202, + 3507, 2600, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2945, + 3283, 2986, 2760, + 3134, 3088, 2255, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2495, 3390, + 3690, 2495, 3390, + 3690, 2496, 3390, + 3689, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3389, + 3689, 2498, 3389, + 3689, 2500, 3389, + 3689, 2501, 3388, + 3688, 2504, 3388, + 3688, 2507, 3387, + 3687, 2511, 3386, + 3686, 2517, 3385, + 3685, 2524, 3383, + 3683, 2534, 3381, + 3681, 2546, 3378, + 3678, 2562, 3373, + 3674, 2583, 3367, + 3669, 2609, 3360, + 3662, 2642, 3349, + 3652, 2683, 3334, + 3639, 2732, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3502, 3023, 3077, + 3415, 3118, 2892, + 3266, 3220, 2387, + 2933, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3821, 2629, 3521, + 3821, 2630, 3521, + 3821, 2632, 3521, + 3821, 2633, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2643, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3816, 2666, 3513, + 3813, 2678, 3510, + 3810, 2694, 3505, + 3807, 2715, 3499, + 3801, 2741, 3492, + 3794, 2774, 3481, + 3784, 2815, 3466, + 3771, 2864, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3209, + 3547, 3250, 3024, + 3398, 3352, 2519, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2761, 3654, + 3953, 2762, 3653, + 3953, 2764, 3653, + 3953, 2765, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2873, 3624, + 3926, 2906, 3613, + 3916, 2947, 3598, + 3903, 2996, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3341, + 3679, 3382, 3156, + 3530, 3484, 2651, + 3197, 3592, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4085, 2894, 3785, + 4085, 2896, 3785, + 4085, 2897, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4083, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3769, + 4071, 2979, 3764, + 4065, 3005, 3756, + 4058, 3038, 3745, + 4049, 3079, 3730, + 4035, 3128, 3709, + 4017, 3187, 3680, + 3991, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3473, + 3812, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3917, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3915, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3137, 3888, + 4095, 3170, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3551, 3605, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 0, 0, + 0, 0, 0, + 0, 49, 0, + 0, 132, 0, + 0, 224, 0, + 0, 324, 0, + 0, 430, 0, + 0, 542, 0, + 0, 658, 0, + 0, 778, 0, + 0, 901, 0, + 0, 1025, 0, + 0, 1152, 0, + 0, 1280, 0, + 0, 1409, 0, + 0, 1539, 0, + 0, 1669, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2589, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 104, 0, 80, + 0, 0, 0, + 0, 66, 0, + 0, 147, 0, + 0, 236, 0, + 0, 333, 0, + 0, 438, 0, + 0, 548, 0, + 0, 662, 0, + 0, 781, 0, + 0, 903, 0, + 0, 1028, 0, + 0, 1154, 0, + 0, 1281, 0, + 0, 1410, 0, + 0, 1540, 0, + 0, 1670, 0, + 0, 1800, 0, + 0, 1931, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2721, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3381, 0, + 0, 3514, 0, + 0, 3646, 0, + 326, 0, 214, + 262, 20, 152, + 160, 88, 54, + 0, 165, 0, + 0, 251, 0, + 0, 346, 0, + 0, 447, 0, + 0, 555, 0, + 0, 668, 0, + 0, 786, 0, + 0, 907, 0, + 0, 1030, 0, + 0, 1156, 0, + 0, 1283, 0, + 0, 1411, 0, + 0, 1540, 0, + 0, 1670, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2194, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 515, 0, 347, + 474, 52, 302, + 413, 116, 234, + 315, 188, 122, + 139, 271, 0, + 0, 361, 0, + 0, 460, 0, + 0, 565, 0, + 0, 676, 0, + 0, 792, 0, + 0, 911, 0, + 0, 1034, 0, + 0, 1158, 0, + 0, 1285, 0, + 0, 1413, 0, + 0, 1542, 0, + 0, 1671, 0, + 0, 1802, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 686, 42, 481, + 658, 92, 447, + 618, 150, 399, + 558, 218, 324, + 463, 295, 200, + 295, 382, 0, + 0, 477, 0, + 0, 579, 0, + 0, 687, 0, + 0, 800, 0, + 0, 918, 0, + 0, 1039, 0, + 0, 1162, 0, + 0, 1288, 0, + 0, 1415, 0, + 0, 1543, 0, + 0, 1673, 0, + 0, 1802, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 844, 96, 614, + 825, 140, 589, + 798, 192, 554, + 758, 255, 502, + 700, 327, 422, + 607, 408, 287, + 444, 498, 4, + 53, 596, 0, + 0, 700, 0, + 0, 811, 0, + 0, 926, 0, + 0, 1045, 0, + 0, 1167, 0, + 0, 1291, 0, + 0, 1418, 0, + 0, 1545, 0, + 0, 1674, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 996, 158, 746, + 982, 197, 728, + 963, 244, 702, + 936, 300, 666, + 897, 365, 611, + 839, 440, 527, + 748, 525, 382, + 589, 617, 65, + 214, 718, 0, + 0, 824, 0, + 0, 936, 0, + 0, 1053, 0, + 0, 1173, 0, + 0, 1296, 0, + 0, 1421, 0, + 0, 1548, 0, + 0, 1676, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1141, 230, 879, + 1131, 263, 865, + 1118, 304, 846, + 1099, 354, 820, + 1072, 412, 782, + 1034, 481, 726, + 976, 558, 638, + 887, 645, 484, + 730, 740, 135, + 367, 842, 0, + 0, 950, 0, + 0, 1064, 0, + 0, 1181, 0, + 0, 1302, 0, + 0, 1426, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1807, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1284, 312, 1011, + 1276, 340, 1001, + 1266, 374, 987, + 1253, 417, 968, + 1234, 468, 941, + 1207, 529, 902, + 1169, 600, 844, + 1112, 679, 753, + 1024, 768, 593, + 869, 865, 214, + 514, 968, 0, + 0, 1078, 0, + 0, 1192, 0, + 0, 1311, 0, + 0, 1432, 0, + 0, 1557, 0, + 0, 1683, 0, + 0, 1810, 0, + 0, 1939, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1423, 402, 1144, + 1418, 425, 1136, + 1410, 454, 1126, + 1401, 490, 1112, + 1387, 534, 1092, + 1368, 587, 1064, + 1342, 650, 1025, + 1304, 722, 966, + 1247, 803, 872, + 1159, 893, 706, + 1006, 991, 302, + 657, 1096, 0, + 0, 1206, 0, + 0, 1322, 0, + 0, 1441, 0, + 0, 1563, 0, + 0, 1687, 0, + 0, 1814, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1561, 500, 1276, + 1557, 518, 1270, + 1551, 542, 1263, + 1544, 572, 1252, + 1534, 609, 1238, + 1521, 655, 1218, + 1502, 709, 1190, + 1476, 773, 1150, + 1438, 846, 1090, + 1382, 929, 994, + 1294, 1020, 824, + 1142, 1119, 399, + 797, 1225, 0, + 0, 1336, 0, + 0, 1452, 0, + 0, 1571, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1697, 605, 1408, + 1694, 619, 1404, + 1690, 639, 1398, + 1684, 663, 1391, + 1677, 694, 1380, + 1667, 732, 1366, + 1654, 778, 1346, + 1635, 833, 1317, + 1609, 898, 1277, + 1571, 973, 1216, + 1515, 1056, 1119, + 1428, 1148, 945, + 1277, 1248, 502, + 935, 1354, 0, + 0, 1466, 0, + 0, 1582, 0, + 0, 1702, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1832, 715, 1540, + 1830, 727, 1537, + 1827, 742, 1533, + 1823, 761, 1527, + 1817, 786, 1519, + 1810, 818, 1509, + 1800, 856, 1494, + 1787, 903, 1474, + 1768, 959, 1446, + 1742, 1025, 1405, + 1704, 1100, 1343, + 1649, 1185, 1245, + 1562, 1277, 1069, + 1411, 1378, 612, + 1071, 1484, 0, + 0, 1597, 0, + 0, 1713, 0, + 0, 1833, 0, + 0, 1956, 0, + 0, 2082, 0, + 0, 2208, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1966, 830, 1672, + 1964, 840, 1670, + 1962, 851, 1667, + 1959, 867, 1663, + 1955, 887, 1657, + 1950, 912, 1649, + 1943, 943, 1639, + 1933, 983, 1624, + 1920, 1030, 1604, + 1901, 1087, 1575, + 1875, 1153, 1534, + 1837, 1229, 1472, + 1782, 1314, 1373, + 1695, 1407, 1194, + 1544, 1508, 726, + 1206, 1615, 0, + 0, 1728, 0, + 0, 1845, 0, + 0, 1965, 0, + 0, 2088, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2100, 950, 1805, + 2099, 957, 1803, + 2097, 966, 1801, + 2095, 978, 1797, + 2092, 993, 1793, + 2088, 1013, 1787, + 2083, 1039, 1780, + 2075, 1071, 1769, + 2066, 1110, 1754, + 2052, 1159, 1734, + 2034, 1216, 1705, + 2007, 1282, 1663, + 1970, 1359, 1601, + 1914, 1444, 1502, + 1828, 1538, 1322, + 1678, 1639, 844, + 1341, 1746, 0, + 0, 1859, 0, + 0, 1976, 0, + 0, 2097, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2233, 1072, 1937, + 2232, 1077, 1935, + 2231, 1084, 1934, + 2229, 1093, 1931, + 2227, 1106, 1928, + 2224, 1121, 1924, + 2220, 1142, 1918, + 2215, 1167, 1910, + 2208, 1200, 1900, + 2198, 1239, 1885, + 2185, 1288, 1864, + 2166, 1345, 1836, + 2140, 1412, 1794, + 2103, 1489, 1731, + 2047, 1575, 1631, + 1960, 1669, 1450, + 1810, 1770, 966, + 1475, 1878, 0, + 0, 1990, 0, + 0, 2108, 0, + 0, 2228, 0, + 0, 2352, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2366, 1196, 2069, + 2365, 1200, 2068, + 2365, 1206, 2067, + 2363, 1213, 2065, + 2362, 1222, 2063, + 2360, 1234, 2059, + 2357, 1250, 2055, + 2353, 1271, 2049, + 2347, 1297, 2041, + 2340, 1329, 2031, + 2330, 1369, 2016, + 2317, 1418, 1995, + 2298, 1475, 1966, + 2272, 1543, 1925, + 2235, 1620, 1862, + 2180, 1706, 1762, + 2093, 1800, 1579, + 1943, 1901, 1090, + 1608, 2009, 0, + 0, 2122, 0, + 0, 2239, 0, + 0, 2360, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2499, 1323, 2201, + 2498, 1326, 2200, + 2498, 1330, 2199, + 2497, 1335, 2198, + 2496, 1342, 2196, + 2494, 1352, 2194, + 2492, 1364, 2191, + 2489, 1380, 2186, + 2485, 1400, 2181, + 2480, 1426, 2173, + 2473, 1459, 2162, + 2463, 1499, 2147, + 2449, 1548, 2127, + 2431, 1606, 2098, + 2405, 1674, 2056, + 2367, 1751, 1993, + 2312, 1837, 1892, + 2225, 1931, 1709, + 2076, 2033, 1216, + 1741, 2141, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1450, 2333, + 2631, 1453, 2333, + 2631, 1456, 2332, + 2630, 1460, 2331, + 2629, 1465, 2330, + 2628, 1473, 2328, + 2626, 1482, 2325, + 2624, 1494, 2322, + 2621, 1510, 2318, + 2617, 1531, 2312, + 2612, 1557, 2304, + 2605, 1590, 2294, + 2595, 1630, 2279, + 2582, 1679, 2258, + 2563, 1737, 2229, + 2537, 1805, 2187, + 2500, 1882, 2124, + 2444, 1968, 2023, + 2358, 2063, 1840, + 2208, 2164, 1343, + 1874, 2272, 0, + 0, 2386, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1579, 2465, + 2764, 1581, 2465, + 2763, 1583, 2464, + 2763, 1586, 2464, + 2762, 1590, 2463, + 2761, 1596, 2461, + 2760, 1603, 2460, + 2758, 1613, 2457, + 2756, 1625, 2454, + 2753, 1641, 2450, + 2749, 1662, 2444, + 2744, 1688, 2436, + 2737, 1721, 2425, + 2727, 1761, 2410, + 2714, 1810, 2390, + 2695, 1868, 2361, + 2669, 1936, 2319, + 2632, 2013, 2256, + 2576, 2100, 2155, + 2490, 2194, 1971, + 2341, 2296, 1472, + 2006, 2404, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1709, 2597, + 2896, 1710, 2597, + 2896, 1712, 2597, + 2895, 1714, 2596, + 2895, 1717, 2595, + 2894, 1721, 2594, + 2893, 1727, 2593, + 2892, 1734, 2591, + 2891, 1744, 2589, + 2888, 1756, 2586, + 2886, 1772, 2581, + 2882, 1793, 2576, + 2876, 1819, 2568, + 2869, 1852, 2557, + 2859, 1892, 2542, + 2846, 1942, 2522, + 2827, 2000, 2492, + 2801, 2068, 2450, + 2764, 2145, 2387, + 2709, 2232, 2286, + 2622, 2326, 2102, + 2473, 2428, 1601, + 2139, 2536, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1839, 2729, + 3029, 1840, 2729, + 3028, 1841, 2729, + 3028, 1843, 2729, + 3028, 1845, 2728, + 3027, 1849, 2727, + 3026, 1853, 2726, + 3026, 1858, 2725, + 3024, 1865, 2723, + 3023, 1875, 2721, + 3021, 1887, 2718, + 3018, 1904, 2713, + 3014, 1924, 2708, + 3009, 1950, 2700, + 3001, 1983, 2689, + 2992, 2024, 2674, + 2978, 2073, 2653, + 2960, 2132, 2624, + 2934, 2199, 2582, + 2896, 2277, 2519, + 2841, 2363, 2418, + 2754, 2458, 2234, + 2605, 2560, 1732, + 2271, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1970, 2862, + 3161, 1970, 2861, + 3161, 1971, 2861, + 3160, 1973, 2861, + 3160, 1975, 2860, + 3160, 1977, 2860, + 3159, 1980, 2859, + 3159, 1984, 2858, + 3158, 1990, 2857, + 3157, 1997, 2855, + 3155, 2006, 2853, + 3153, 2019, 2850, + 3150, 2035, 2845, + 3146, 2056, 2839, + 3141, 2082, 2832, + 3133, 2115, 2821, + 3124, 2156, 2806, + 3110, 2205, 2785, + 3092, 2263, 2756, + 3066, 2331, 2714, + 3028, 2409, 2651, + 2973, 2495, 2550, + 2887, 2590, 2365, + 2737, 2692, 1862, + 2404, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2101, 2994, + 3293, 2101, 2994, + 3293, 2102, 2993, + 3293, 2103, 2993, + 3293, 2104, 2993, + 3292, 2106, 2992, + 3292, 2109, 2992, + 3291, 2112, 2991, + 3291, 2116, 2990, + 3290, 2121, 2989, + 3289, 2129, 2987, + 3287, 2138, 2985, + 3285, 2151, 2982, + 3282, 2167, 2977, + 3278, 2187, 2971, + 3273, 2214, 2963, + 3266, 2247, 2953, + 3256, 2287, 2938, + 3242, 2337, 2917, + 3224, 2395, 2888, + 3198, 2463, 2846, + 3160, 2541, 2783, + 3105, 2627, 2681, + 3019, 2722, 2497, + 2870, 2824, 1993, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2232, 3126, + 3425, 2232, 3126, + 3425, 2233, 3126, + 3425, 2234, 3125, + 3425, 2235, 3125, + 3425, 2236, 3125, + 3424, 2238, 3124, + 3424, 2240, 3124, + 3424, 2243, 3123, + 3423, 2248, 3122, + 3422, 2253, 3121, + 3421, 2260, 3119, + 3419, 2270, 3117, + 3417, 2282, 3114, + 3414, 2299, 3109, + 3410, 2319, 3103, + 3405, 2346, 3095, + 3398, 2379, 3085, + 3388, 2419, 3070, + 3375, 2469, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2813, + 3151, 2854, 2629, + 3002, 2956, 2124, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2366, 3257, + 3557, 2367, 3257, + 3557, 2368, 3257, + 3557, 2370, 3256, + 3556, 2372, 3256, + 3556, 2375, 3255, + 3555, 2379, 3254, + 3554, 2385, 3253, + 3553, 2392, 3251, + 3551, 2402, 3249, + 3549, 2414, 3246, + 3546, 2430, 3241, + 3542, 2451, 3235, + 3537, 2477, 3228, + 3530, 2510, 3217, + 3520, 2551, 3202, + 3507, 2600, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2945, + 3283, 2986, 2761, + 3134, 3088, 2256, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2495, 3390, + 3690, 2495, 3390, + 3690, 2496, 3390, + 3689, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3389, + 3689, 2498, 3389, + 3689, 2500, 3389, + 3689, 2502, 3389, + 3688, 2504, 3388, + 3688, 2507, 3387, + 3687, 2511, 3386, + 3686, 2517, 3385, + 3685, 2524, 3383, + 3683, 2534, 3381, + 3681, 2546, 3378, + 3678, 2562, 3373, + 3674, 2583, 3367, + 3669, 2609, 3360, + 3662, 2642, 3349, + 3652, 2683, 3334, + 3639, 2732, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3502, 3023, 3077, + 3415, 3118, 2893, + 3266, 3220, 2387, + 2933, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3821, 2629, 3522, + 3821, 2629, 3522, + 3821, 2630, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2643, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3815, 2666, 3513, + 3813, 2678, 3510, + 3810, 2694, 3505, + 3807, 2715, 3500, + 3801, 2741, 3492, + 3794, 2774, 3481, + 3784, 2815, 3466, + 3771, 2864, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3209, + 3547, 3250, 3025, + 3398, 3352, 2519, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2761, 3654, + 3953, 2762, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2873, 3624, + 3926, 2906, 3613, + 3916, 2947, 3598, + 3903, 2996, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3341, + 3679, 3382, 3157, + 3530, 3484, 2651, + 3197, 3592, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4085, 2894, 3785, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4083, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3769, + 4071, 2979, 3764, + 4065, 3005, 3756, + 4058, 3038, 3745, + 4049, 3079, 3730, + 4035, 3129, 3709, + 4017, 3187, 3680, + 3991, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3473, + 3811, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3137, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3551, 3605, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 0, 36, + 0, 24, 0, + 0, 91, 0, + 0, 168, 0, + 0, 254, 0, + 0, 348, 0, + 0, 449, 0, + 0, 557, 0, + 0, 669, 0, + 0, 787, 0, + 0, 907, 0, + 0, 1031, 0, + 0, 1156, 0, + 0, 1283, 0, + 0, 1411, 0, + 0, 1541, 0, + 0, 1671, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 67, 0, 149, + 0, 42, 77, + 0, 107, 0, + 0, 181, 0, + 0, 264, 0, + 0, 356, 0, + 0, 456, 0, + 0, 562, 0, + 0, 674, 0, + 0, 790, 0, + 0, 910, 0, + 0, 1033, 0, + 0, 1158, 0, + 0, 1284, 0, + 0, 1412, 0, + 0, 1541, 0, + 0, 1671, 0, + 0, 1801, 0, + 0, 1932, 0, + 0, 2063, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2853, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3249, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 303, 13, 267, + 236, 65, 212, + 127, 127, 127, + 0, 198, 0, + 0, 279, 0, + 0, 368, 0, + 0, 465, 0, + 0, 570, 0, + 0, 680, 0, + 0, 795, 0, + 0, 913, 0, + 0, 1035, 0, + 0, 1160, 0, + 0, 1286, 0, + 0, 1413, 0, + 0, 1542, 0, + 0, 1672, 0, + 0, 1802, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2326, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2985, 0, + 0, 3117, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 500, 45, 387, + 458, 94, 346, + 394, 152, 284, + 292, 220, 186, + 105, 297, 8, + 0, 383, 0, + 0, 478, 0, + 0, 579, 0, + 0, 687, 0, + 0, 801, 0, + 0, 918, 0, + 0, 1039, 0, + 0, 1162, 0, + 0, 1288, 0, + 0, 1415, 0, + 0, 1543, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 676, 85, 511, + 647, 130, 480, + 606, 184, 434, + 545, 248, 366, + 447, 321, 254, + 271, 403, 43, + 0, 494, 0, + 0, 592, 0, + 0, 697, 0, + 0, 808, 0, + 0, 924, 0, + 0, 1044, 0, + 0, 1166, 0, + 0, 1291, 0, + 0, 1417, 0, + 0, 1545, 0, + 0, 1674, 0, + 0, 1803, 0, + 0, 1934, 0, + 0, 2064, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 837, 134, 636, + 818, 175, 613, + 790, 224, 579, + 750, 282, 531, + 690, 350, 456, + 596, 428, 332, + 427, 514, 85, + 12, 609, 0, + 0, 711, 0, + 0, 819, 0, + 0, 932, 0, + 0, 1050, 0, + 0, 1171, 0, + 0, 1294, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1675, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 991, 192, 763, + 977, 228, 746, + 957, 272, 721, + 930, 325, 686, + 891, 387, 634, + 832, 459, 554, + 740, 540, 419, + 577, 630, 136, + 186, 728, 0, + 0, 832, 0, + 0, 943, 0, + 0, 1058, 0, + 0, 1177, 0, + 0, 1299, 0, + 0, 1423, 0, + 0, 1550, 0, + 0, 1677, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1138, 259, 892, + 1128, 290, 878, + 1114, 329, 860, + 1095, 376, 834, + 1068, 432, 798, + 1029, 497, 743, + 971, 572, 659, + 880, 657, 514, + 721, 749, 197, + 347, 850, 0, + 0, 956, 0, + 0, 1068, 0, + 0, 1185, 0, + 0, 1305, 0, + 0, 1428, 0, + 0, 1553, 0, + 0, 1680, 0, + 0, 1808, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2198, 0, + 0, 2328, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1281, 336, 1021, + 1274, 362, 1011, + 1264, 395, 997, + 1250, 436, 978, + 1231, 486, 952, + 1204, 544, 914, + 1166, 613, 858, + 1109, 690, 770, + 1019, 777, 616, + 862, 872, 267, + 499, 974, 0, + 0, 1082, 0, + 0, 1196, 0, + 0, 1314, 0, + 0, 1435, 0, + 0, 1558, 0, + 0, 1684, 0, + 0, 1811, 0, + 0, 1939, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1421, 422, 1151, + 1416, 444, 1143, + 1408, 472, 1133, + 1398, 506, 1119, + 1385, 549, 1100, + 1366, 601, 1073, + 1339, 661, 1034, + 1301, 732, 976, + 1245, 811, 885, + 1156, 900, 725, + 1001, 997, 346, + 646, 1100, 0, + 0, 1210, 0, + 0, 1324, 0, + 0, 1443, 0, + 0, 1565, 0, + 0, 1689, 0, + 0, 1815, 0, + 0, 1942, 0, + 0, 2071, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1559, 516, 1281, + 1555, 534, 1276, + 1550, 557, 1268, + 1543, 586, 1258, + 1533, 622, 1244, + 1519, 666, 1224, + 1500, 719, 1197, + 1474, 782, 1157, + 1436, 854, 1098, + 1380, 935, 1004, + 1291, 1025, 838, + 1138, 1123, 434, + 789, 1228, 0, + 0, 1339, 0, + 0, 1454, 0, + 0, 1573, 0, + 0, 1695, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1696, 617, 1412, + 1693, 632, 1408, + 1689, 651, 1402, + 1683, 674, 1395, + 1676, 704, 1384, + 1666, 741, 1370, + 1653, 787, 1350, + 1634, 841, 1322, + 1608, 905, 1282, + 1570, 978, 1222, + 1514, 1061, 1126, + 1426, 1152, 956, + 1274, 1251, 531, + 929, 1357, 0, + 0, 1468, 0, + 0, 1584, 0, + 0, 1703, 0, + 0, 1826, 0, + 0, 1951, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1831, 725, 1543, + 1829, 737, 1540, + 1826, 752, 1536, + 1822, 771, 1530, + 1817, 795, 1523, + 1809, 826, 1512, + 1800, 864, 1498, + 1786, 910, 1478, + 1767, 965, 1449, + 1741, 1030, 1409, + 1703, 1105, 1348, + 1648, 1188, 1251, + 1560, 1280, 1077, + 1409, 1380, 634, + 1067, 1486, 0, + 0, 1598, 0, + 0, 1714, 0, + 0, 1834, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1965, 838, 1675, + 1964, 847, 1672, + 1962, 859, 1669, + 1959, 874, 1665, + 1955, 894, 1659, + 1949, 918, 1652, + 1942, 950, 1641, + 1932, 988, 1626, + 1919, 1035, 1606, + 1900, 1092, 1578, + 1874, 1157, 1537, + 1837, 1232, 1475, + 1781, 1317, 1377, + 1694, 1409, 1201, + 1543, 1510, 744, + 1203, 1617, 0, + 0, 1729, 0, + 0, 1845, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2099, 956, 1806, + 2098, 963, 1805, + 2097, 972, 1802, + 2094, 983, 1799, + 2091, 999, 1795, + 2087, 1019, 1789, + 2082, 1044, 1781, + 2075, 1076, 1771, + 2065, 1115, 1756, + 2052, 1162, 1736, + 2033, 1219, 1707, + 2007, 1285, 1666, + 1969, 1361, 1604, + 1914, 1446, 1505, + 1827, 1539, 1326, + 1676, 1640, 858, + 1338, 1747, 0, + 0, 1860, 0, + 0, 1977, 0, + 0, 2097, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2233, 1076, 1938, + 2232, 1082, 1937, + 2231, 1089, 1935, + 2229, 1098, 1933, + 2227, 1110, 1929, + 2224, 1125, 1925, + 2220, 1146, 1919, + 2215, 1171, 1912, + 2208, 1203, 1901, + 2198, 1243, 1886, + 2184, 1291, 1866, + 2166, 1348, 1837, + 2140, 1415, 1796, + 2102, 1491, 1733, + 2047, 1576, 1634, + 1960, 1670, 1454, + 1810, 1771, 976, + 1473, 1878, 0, + 0, 1991, 0, + 0, 2108, 0, + 0, 2229, 0, + 0, 2352, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2366, 1200, 2070, + 2365, 1204, 2069, + 2364, 1209, 2068, + 2363, 1216, 2066, + 2361, 1226, 2063, + 2359, 1238, 2060, + 2356, 1253, 2056, + 2352, 1274, 2050, + 2347, 1299, 2042, + 2340, 1332, 2032, + 2330, 1371, 2017, + 2317, 1420, 1997, + 2298, 1477, 1968, + 2272, 1544, 1926, + 2235, 1621, 1863, + 2179, 1707, 1763, + 2092, 1801, 1582, + 1943, 1902, 1098, + 1607, 2010, 0, + 0, 2123, 0, + 0, 2240, 0, + 0, 2360, 0, + 0, 2484, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2499, 1325, 2202, + 2498, 1328, 2201, + 2498, 1332, 2200, + 2497, 1338, 2199, + 2495, 1345, 2197, + 2494, 1354, 2195, + 2492, 1367, 2191, + 2489, 1382, 2187, + 2485, 1403, 2181, + 2480, 1429, 2174, + 2472, 1461, 2163, + 2463, 1501, 2148, + 2449, 1550, 2128, + 2431, 1608, 2099, + 2404, 1675, 2057, + 2367, 1752, 1994, + 2312, 1838, 1894, + 2225, 1932, 1711, + 2075, 2033, 1222, + 1740, 2141, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1452, 2334, + 2631, 1455, 2333, + 2630, 1458, 2332, + 2630, 1462, 2331, + 2629, 1467, 2330, + 2628, 1474, 2328, + 2626, 1484, 2326, + 2624, 1496, 2323, + 2621, 1512, 2319, + 2617, 1533, 2313, + 2612, 1559, 2305, + 2605, 1591, 2294, + 2595, 1631, 2279, + 2581, 1680, 2259, + 2563, 1738, 2230, + 2537, 1806, 2188, + 2499, 1883, 2125, + 2444, 1969, 2024, + 2357, 2063, 1842, + 2208, 2165, 1348, + 1873, 2273, 0, + 0, 2386, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1581, 2466, + 2764, 1582, 2465, + 2763, 1585, 2465, + 2763, 1588, 2464, + 2762, 1592, 2463, + 2761, 1597, 2462, + 2760, 1605, 2460, + 2758, 1614, 2458, + 2756, 1626, 2454, + 2753, 1642, 2450, + 2749, 1663, 2444, + 2744, 1689, 2436, + 2737, 1722, 2426, + 2727, 1762, 2411, + 2714, 1811, 2390, + 2695, 1869, 2361, + 2669, 1937, 2319, + 2632, 2014, 2256, + 2576, 2100, 2155, + 2490, 2195, 1972, + 2340, 2297, 1475, + 2006, 2405, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1710, 2598, + 2896, 1711, 2597, + 2896, 1713, 2597, + 2895, 1715, 2596, + 2895, 1718, 2596, + 2894, 1723, 2595, + 2893, 1728, 2593, + 2892, 1735, 2592, + 2891, 1745, 2589, + 2888, 1757, 2586, + 2885, 1773, 2582, + 2882, 1794, 2576, + 2876, 1820, 2568, + 2869, 1853, 2557, + 2859, 1893, 2542, + 2846, 1942, 2522, + 2827, 2001, 2493, + 2801, 2068, 2451, + 2764, 2146, 2388, + 2709, 2232, 2287, + 2622, 2326, 2103, + 2473, 2428, 1604, + 2139, 2536, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1840, 2730, + 3028, 1841, 2729, + 3028, 1842, 2729, + 3028, 1844, 2729, + 3028, 1846, 2728, + 3027, 1849, 2727, + 3026, 1854, 2726, + 3026, 1859, 2725, + 3024, 1866, 2723, + 3023, 1876, 2721, + 3021, 1888, 2718, + 3018, 1904, 2714, + 3014, 1925, 2708, + 3008, 1951, 2700, + 3001, 1984, 2689, + 2992, 2025, 2674, + 2978, 2074, 2654, + 2960, 2132, 2625, + 2933, 2200, 2582, + 2896, 2277, 2519, + 2841, 2364, 2418, + 2754, 2458, 2234, + 2605, 2560, 1733, + 2271, 2668, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1970, 2862, + 3161, 1971, 2862, + 3161, 1972, 2861, + 3160, 1973, 2861, + 3160, 1975, 2861, + 3160, 1978, 2860, + 3159, 1981, 2859, + 3159, 1985, 2858, + 3158, 1990, 2857, + 3156, 1998, 2855, + 3155, 2007, 2853, + 3153, 2020, 2850, + 3150, 2036, 2845, + 3146, 2056, 2840, + 3141, 2083, 2832, + 3133, 2115, 2821, + 3124, 2156, 2806, + 3110, 2205, 2785, + 3092, 2264, 2756, + 3066, 2332, 2714, + 3028, 2409, 2651, + 2973, 2495, 2550, + 2887, 2590, 2366, + 2737, 2692, 1864, + 2403, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2101, 2994, + 3293, 2102, 2994, + 3293, 2103, 2993, + 3293, 2104, 2993, + 3293, 2105, 2993, + 3292, 2107, 2993, + 3292, 2109, 2992, + 3291, 2112, 2991, + 3291, 2116, 2990, + 3290, 2122, 2989, + 3289, 2129, 2987, + 3287, 2139, 2985, + 3285, 2151, 2982, + 3282, 2167, 2977, + 3278, 2188, 2972, + 3273, 2214, 2964, + 3266, 2247, 2953, + 3256, 2288, 2938, + 3242, 2337, 2917, + 3224, 2395, 2888, + 3198, 2463, 2846, + 3160, 2541, 2783, + 3105, 2627, 2682, + 3019, 2722, 2497, + 2869, 2824, 1994, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2232, 3126, + 3425, 2233, 3126, + 3425, 2233, 3126, + 3425, 2234, 3125, + 3425, 2235, 3125, + 3425, 2236, 3125, + 3424, 2238, 3125, + 3424, 2241, 3124, + 3424, 2244, 3123, + 3423, 2248, 3122, + 3422, 2253, 3121, + 3421, 2261, 3119, + 3419, 2270, 3117, + 3417, 2283, 3114, + 3414, 2299, 3109, + 3410, 2320, 3103, + 3405, 2346, 3096, + 3398, 2379, 3085, + 3388, 2420, 3070, + 3375, 2469, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2814, + 3151, 2854, 2629, + 3002, 2956, 2125, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2364, 3258, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2366, 3257, + 3557, 2367, 3257, + 3557, 2368, 3257, + 3557, 2370, 3257, + 3556, 2372, 3256, + 3556, 2375, 3255, + 3555, 2380, 3254, + 3554, 2385, 3253, + 3553, 2392, 3251, + 3551, 2402, 3249, + 3549, 2414, 3246, + 3546, 2431, 3241, + 3542, 2451, 3235, + 3537, 2478, 3228, + 3530, 2511, 3217, + 3520, 2551, 3202, + 3507, 2601, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2945, + 3283, 2986, 2761, + 3134, 3088, 2256, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2495, 3390, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3689, 2496, 3390, + 3689, 2497, 3390, + 3689, 2498, 3389, + 3689, 2499, 3389, + 3689, 2500, 3389, + 3689, 2502, 3389, + 3688, 2504, 3388, + 3688, 2507, 3387, + 3687, 2511, 3386, + 3686, 2517, 3385, + 3685, 2524, 3383, + 3683, 2534, 3381, + 3681, 2546, 3378, + 3678, 2562, 3373, + 3674, 2583, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2683, 3334, + 3639, 2733, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3502, 3023, 3077, + 3415, 3118, 2893, + 3266, 3220, 2388, + 2932, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3821, 2629, 3522, + 3821, 2630, 3522, + 3821, 2631, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2643, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3815, 2666, 3513, + 3813, 2678, 3510, + 3810, 2694, 3505, + 3807, 2715, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2815, 3466, + 3771, 2865, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3209, + 3547, 3250, 3025, + 3398, 3352, 2520, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2873, 3624, + 3926, 2907, 3613, + 3916, 2947, 3598, + 3903, 2997, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3341, + 3679, 3382, 3157, + 3530, 3484, 2651, + 3197, 3592, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3785, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4083, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3770, + 4071, 2979, 3764, + 4065, 3005, 3756, + 4058, 3039, 3745, + 4049, 3079, 3730, + 4035, 3129, 3709, + 4017, 3187, 3680, + 3991, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3473, + 3811, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3551, 3606, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 33, 135, + 0, 83, 61, + 0, 142, 0, + 0, 211, 0, + 0, 290, 0, + 0, 377, 0, + 0, 473, 0, + 0, 576, 0, + 0, 684, 0, + 0, 798, 0, + 0, 916, 0, + 0, 1037, 0, + 0, 1161, 0, + 0, 1287, 0, + 0, 1414, 0, + 0, 1543, 0, + 0, 1672, 0, + 0, 1802, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 11, 50, 228, + 0, 99, 168, + 0, 156, 74, + 0, 223, 0, + 0, 300, 0, + 0, 386, 0, + 0, 480, 0, + 0, 581, 0, + 0, 689, 0, + 0, 802, 0, + 0, 919, 0, + 0, 1039, 0, + 0, 1163, 0, + 0, 1288, 0, + 0, 1415, 0, + 0, 1543, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1933, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 271, 73, 329, + 199, 119, 281, + 79, 174, 209, + 0, 239, 91, + 0, 313, 0, + 0, 397, 0, + 0, 489, 0, + 0, 588, 0, + 0, 694, 0, + 0, 806, 0, + 0, 922, 0, + 0, 1042, 0, + 0, 1165, 0, + 0, 1290, 0, + 0, 1416, 0, + 0, 1544, 0, + 0, 1673, 0, + 0, 1803, 0, + 0, 1934, 0, + 0, 2064, 0, + 0, 2195, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 480, 102, 436, + 435, 145, 399, + 368, 197, 344, + 259, 259, 259, + 54, 330, 113, + 0, 411, 0, + 0, 500, 0, + 0, 597, 0, + 0, 702, 0, + 0, 812, 0, + 0, 927, 0, + 0, 1045, 0, + 0, 1167, 0, + 0, 1292, 0, + 0, 1418, 0, + 0, 1546, 0, + 0, 1674, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2458, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 662, 137, 548, + 632, 177, 519, + 590, 226, 478, + 526, 284, 416, + 424, 352, 318, + 237, 429, 140, + 0, 515, 0, + 0, 610, 0, + 0, 711, 0, + 0, 819, 0, + 0, 933, 0, + 0, 1050, 0, + 0, 1171, 0, + 0, 1294, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1675, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 828, 181, 665, + 808, 217, 643, + 779, 262, 612, + 738, 316, 566, + 677, 380, 498, + 579, 453, 386, + 403, 535, 175, + 0, 626, 0, + 0, 724, 0, + 0, 830, 0, + 0, 941, 0, + 0, 1056, 0, + 0, 1176, 0, + 0, 1298, 0, + 0, 1423, 0, + 0, 1549, 0, + 0, 1677, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 984, 233, 785, + 970, 266, 768, + 950, 307, 745, + 922, 356, 712, + 882, 414, 663, + 822, 482, 588, + 728, 560, 464, + 559, 646, 217, + 144, 741, 0, + 0, 843, 0, + 0, 951, 0, + 0, 1064, 0, + 0, 1182, 0, + 0, 1303, 0, + 0, 1426, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1807, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1133, 295, 908, + 1123, 324, 895, + 1109, 360, 878, + 1089, 404, 853, + 1062, 457, 818, + 1023, 519, 766, + 964, 591, 686, + 872, 672, 551, + 709, 762, 268, + 318, 860, 0, + 0, 964, 0, + 0, 1075, 0, + 0, 1190, 0, + 0, 1309, 0, + 0, 1431, 0, + 0, 1555, 0, + 0, 1682, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1277, 366, 1033, + 1270, 391, 1024, + 1260, 422, 1010, + 1246, 461, 992, + 1227, 508, 967, + 1200, 564, 930, + 1161, 629, 876, + 1103, 705, 791, + 1013, 789, 646, + 853, 882, 329, + 479, 982, 0, + 0, 1088, 0, + 0, 1201, 0, + 0, 1317, 0, + 0, 1437, 0, + 0, 1560, 0, + 0, 1685, 0, + 0, 1812, 0, + 0, 1940, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2330, 0, + 0, 2460, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1418, 447, 1160, + 1413, 468, 1153, + 1406, 494, 1143, + 1396, 528, 1129, + 1382, 568, 1111, + 1363, 618, 1084, + 1336, 677, 1046, + 1298, 745, 990, + 1241, 822, 902, + 1151, 909, 748, + 994, 1004, 399, + 631, 1106, 0, + 0, 1214, 0, + 0, 1328, 0, + 0, 1446, 0, + 0, 1567, 0, + 0, 1690, 0, + 0, 1816, 0, + 0, 1943, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1557, 537, 1288, + 1553, 554, 1283, + 1548, 576, 1275, + 1540, 604, 1265, + 1531, 639, 1251, + 1517, 681, 1232, + 1498, 733, 1205, + 1471, 793, 1166, + 1433, 864, 1108, + 1377, 944, 1017, + 1288, 1032, 857, + 1133, 1129, 478, + 778, 1232, 0, + 0, 1342, 0, + 0, 1456, 0, + 0, 1575, 0, + 0, 1697, 0, + 0, 1821, 0, + 0, 1947, 0, + 0, 2074, 0, + 0, 2203, 0, + 0, 2332, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1694, 634, 1417, + 1691, 648, 1413, + 1687, 666, 1408, + 1682, 689, 1400, + 1675, 718, 1390, + 1665, 754, 1376, + 1651, 798, 1356, + 1632, 851, 1329, + 1606, 914, 1289, + 1568, 986, 1230, + 1512, 1067, 1136, + 1424, 1157, 970, + 1270, 1255, 567, + 921, 1360, 0, + 0, 1471, 0, + 0, 1586, 0, + 0, 1705, 0, + 0, 1827, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1830, 738, 1547, + 1828, 750, 1544, + 1825, 764, 1540, + 1821, 783, 1534, + 1815, 806, 1527, + 1808, 836, 1516, + 1798, 873, 1502, + 1785, 919, 1482, + 1766, 973, 1454, + 1740, 1037, 1414, + 1702, 1110, 1354, + 1646, 1193, 1258, + 1558, 1284, 1088, + 1406, 1383, 663, + 1061, 1489, 0, + 0, 1600, 0, + 0, 1716, 0, + 0, 1836, 0, + 0, 1958, 0, + 0, 2083, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1965, 849, 1678, + 1963, 857, 1675, + 1961, 869, 1672, + 1958, 884, 1668, + 1954, 903, 1662, + 1949, 927, 1655, + 1941, 958, 1644, + 1932, 996, 1630, + 1918, 1042, 1610, + 1899, 1097, 1582, + 1873, 1162, 1541, + 1835, 1237, 1480, + 1780, 1320, 1383, + 1692, 1412, 1209, + 1541, 1512, 766, + 1199, 1618, 0, + 0, 1730, 0, + 0, 1847, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2099, 964, 1809, + 2098, 970, 1807, + 2096, 979, 1804, + 2094, 991, 1801, + 2091, 1006, 1797, + 2087, 1026, 1791, + 2082, 1051, 1784, + 2074, 1082, 1773, + 2065, 1120, 1759, + 2051, 1167, 1738, + 2032, 1224, 1710, + 2006, 1289, 1669, + 1969, 1364, 1607, + 1913, 1449, 1509, + 1826, 1542, 1333, + 1675, 1642, 876, + 1335, 1749, 0, + 0, 1861, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2232, 1083, 1940, + 2231, 1088, 1938, + 2230, 1095, 1937, + 2229, 1104, 1934, + 2226, 1116, 1931, + 2224, 1131, 1927, + 2220, 1151, 1921, + 2214, 1176, 1913, + 2207, 1208, 1903, + 2197, 1247, 1888, + 2184, 1294, 1868, + 2165, 1351, 1839, + 2139, 1417, 1798, + 2101, 1493, 1736, + 2046, 1578, 1637, + 1959, 1671, 1459, + 1809, 1772, 990, + 1470, 1879, 0, + 0, 1992, 0, + 0, 2109, 0, + 0, 2229, 0, + 0, 2352, 0, + 0, 2478, 0, + 0, 2604, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2366, 1204, 2071, + 2365, 1208, 2070, + 2364, 1214, 2069, + 2363, 1221, 2067, + 2361, 1230, 2065, + 2359, 1242, 2062, + 2356, 1258, 2057, + 2352, 1278, 2052, + 2347, 1303, 2044, + 2340, 1335, 2033, + 2330, 1375, 2018, + 2316, 1423, 1998, + 2298, 1480, 1969, + 2272, 1547, 1928, + 2234, 1623, 1865, + 2179, 1708, 1766, + 2092, 1802, 1586, + 1942, 1903, 1108, + 1605, 2010, 0, + 0, 2123, 0, + 0, 2240, 0, + 0, 2361, 0, + 0, 2484, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2498, 1329, 2203, + 2498, 1332, 2202, + 2497, 1336, 2201, + 2496, 1341, 2200, + 2495, 1348, 2198, + 2494, 1358, 2196, + 2491, 1370, 2192, + 2488, 1385, 2188, + 2485, 1406, 2182, + 2479, 1431, 2175, + 2472, 1464, 2164, + 2462, 1504, 2149, + 2449, 1552, 2129, + 2430, 1609, 2100, + 2404, 1677, 2058, + 2367, 1753, 1995, + 2311, 1839, 1896, + 2225, 1933, 1714, + 2075, 2034, 1230, + 1739, 2142, 0, + 0, 2255, 0, + 0, 2372, 0, + 0, 2492, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1455, 2334, + 2631, 1457, 2334, + 2630, 1460, 2333, + 2630, 1464, 2332, + 2629, 1470, 2331, + 2628, 1477, 2329, + 2626, 1486, 2327, + 2624, 1499, 2324, + 2621, 1514, 2319, + 2617, 1535, 2313, + 2612, 1561, 2306, + 2604, 1593, 2295, + 2595, 1633, 2280, + 2581, 1682, 2260, + 2563, 1740, 2231, + 2537, 1807, 2189, + 2499, 1884, 2126, + 2444, 1970, 2026, + 2357, 2064, 1844, + 2207, 2165, 1354, + 1872, 2273, 0, + 0, 2386, 0, + 0, 2504, 0, + 0, 2624, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1583, 2466, + 2763, 1584, 2466, + 2763, 1587, 2465, + 2763, 1590, 2464, + 2762, 1594, 2464, + 2761, 1599, 2462, + 2760, 1607, 2460, + 2758, 1616, 2458, + 2756, 1628, 2455, + 2753, 1644, 2451, + 2749, 1665, 2445, + 2744, 1691, 2437, + 2737, 1723, 2426, + 2727, 1764, 2411, + 2714, 1812, 2391, + 2695, 1870, 2362, + 2669, 1938, 2320, + 2631, 2015, 2257, + 2576, 2101, 2156, + 2490, 2195, 1974, + 2340, 2297, 1480, + 2005, 2405, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1711, 2598, + 2896, 1713, 2598, + 2896, 1714, 2597, + 2895, 1717, 2597, + 2895, 1720, 2596, + 2894, 1724, 2595, + 2893, 1730, 2594, + 2892, 1737, 2592, + 2890, 1746, 2590, + 2888, 1759, 2586, + 2885, 1775, 2582, + 2881, 1795, 2576, + 2876, 1821, 2568, + 2869, 1854, 2558, + 2859, 1894, 2543, + 2846, 1943, 2522, + 2827, 2001, 2493, + 2801, 2069, 2451, + 2764, 2146, 2388, + 2708, 2232, 2288, + 2622, 2327, 2104, + 2472, 2429, 1608, + 2138, 2537, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3029, 1841, 2730, + 3028, 1842, 2730, + 3028, 1843, 2729, + 3028, 1845, 2729, + 3028, 1847, 2728, + 3027, 1851, 2728, + 3026, 1855, 2727, + 3025, 1860, 2725, + 3024, 1867, 2724, + 3023, 1877, 2721, + 3020, 1889, 2718, + 3018, 1905, 2714, + 3014, 1926, 2708, + 3008, 1952, 2700, + 3001, 1985, 2689, + 2991, 2025, 2675, + 2978, 2074, 2654, + 2959, 2133, 2625, + 2933, 2200, 2583, + 2896, 2278, 2520, + 2841, 2364, 2419, + 2754, 2459, 2235, + 2605, 2560, 1736, + 2271, 2668, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1971, 2862, + 3161, 1972, 2862, + 3161, 1973, 2862, + 3160, 1974, 2861, + 3160, 1976, 2861, + 3160, 1978, 2860, + 3159, 1981, 2860, + 3159, 1986, 2859, + 3158, 1991, 2857, + 3156, 1998, 2856, + 3155, 2008, 2853, + 3153, 2020, 2850, + 3150, 2036, 2846, + 3146, 2057, 2840, + 3141, 2083, 2832, + 3133, 2116, 2821, + 3124, 2157, 2806, + 3110, 2206, 2786, + 3092, 2264, 2757, + 3066, 2332, 2715, + 3028, 2409, 2651, + 2973, 2496, 2550, + 2886, 2590, 2366, + 2737, 2692, 1866, + 2403, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2102, 2994, + 3293, 2102, 2994, + 3293, 2103, 2994, + 3293, 2104, 2993, + 3292, 2105, 2993, + 3292, 2107, 2993, + 3292, 2110, 2992, + 3291, 2113, 2991, + 3291, 2117, 2990, + 3290, 2122, 2989, + 3289, 2130, 2987, + 3287, 2139, 2985, + 3285, 2152, 2982, + 3282, 2168, 2978, + 3278, 2188, 2972, + 3273, 2215, 2964, + 3266, 2248, 2953, + 3256, 2288, 2938, + 3242, 2337, 2918, + 3224, 2396, 2888, + 3198, 2464, 2846, + 3160, 2541, 2783, + 3105, 2628, 2682, + 3019, 2722, 2498, + 2869, 2824, 1996, + 2536, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2233, 3126, + 3425, 2233, 3126, + 3425, 2234, 3126, + 3425, 2235, 3126, + 3425, 2236, 3125, + 3425, 2237, 3125, + 3424, 2239, 3125, + 3424, 2241, 3124, + 3423, 2244, 3123, + 3423, 2248, 3122, + 3422, 2254, 3121, + 3421, 2261, 3119, + 3419, 2271, 3117, + 3417, 2283, 3114, + 3414, 2299, 3109, + 3410, 2320, 3104, + 3405, 2346, 3096, + 3398, 2379, 3085, + 3388, 2420, 3070, + 3375, 2469, 3049, + 3356, 2527, 3020, + 3330, 2595, 2978, + 3293, 2673, 2915, + 3237, 2759, 2814, + 3151, 2854, 2629, + 3002, 2956, 2126, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2364, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2366, 3258, + 3557, 2367, 3257, + 3557, 2369, 3257, + 3556, 2370, 3257, + 3556, 2373, 3256, + 3556, 2376, 3255, + 3555, 2380, 3254, + 3554, 2386, 3253, + 3553, 2393, 3251, + 3551, 2402, 3249, + 3549, 2415, 3246, + 3546, 2431, 3241, + 3542, 2452, 3236, + 3537, 2478, 3228, + 3530, 2511, 3217, + 3520, 2552, 3202, + 3507, 2601, 3181, + 3488, 2659, 3152, + 3462, 2727, 3110, + 3425, 2805, 3047, + 3369, 2891, 2946, + 3283, 2986, 2761, + 3134, 3088, 2257, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2499, 3389, + 3689, 2500, 3389, + 3689, 2502, 3389, + 3688, 2504, 3388, + 3688, 2508, 3387, + 3687, 2512, 3386, + 3686, 2517, 3385, + 3685, 2525, 3383, + 3683, 2534, 3381, + 3681, 2547, 3378, + 3678, 2563, 3373, + 3674, 2583, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2683, 3334, + 3639, 2733, 3313, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3501, 3023, 3078, + 3415, 3118, 2893, + 3266, 3220, 2389, + 2932, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2627, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3821, 2629, 3522, + 3821, 2630, 3522, + 3821, 2631, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2636, 3520, + 3820, 2639, 3519, + 3819, 2644, 3518, + 3818, 2649, 3517, + 3817, 2656, 3515, + 3815, 2666, 3513, + 3813, 2678, 3510, + 3810, 2695, 3505, + 3806, 2715, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2815, 3466, + 3771, 2865, 3445, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3210, + 3547, 3250, 3025, + 3398, 3352, 2520, + 3065, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2771, 3651, + 3951, 2775, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2810, 3642, + 3943, 2826, 3637, + 3939, 2847, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2947, 3598, + 3903, 2997, 3577, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3342, + 3679, 3382, 3157, + 3530, 3484, 2652, + 3197, 3593, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3785, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3783, + 4083, 2907, 3782, + 4082, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2958, 3770, + 4071, 2979, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3079, 3730, + 4035, 3129, 3710, + 4017, 3187, 3680, + 3990, 3255, 3638, + 3953, 3333, 3575, + 3898, 3419, 3474, + 3811, 3514, 3289, + 3662, 3616, 2783, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3039, 3915, + 4095, 3045, 3913, + 4095, 3052, 3911, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3090, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2915, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3171, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3222, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3944, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 108, 241, + 0, 151, 183, + 0, 203, 91, + 0, 264, 0, + 0, 334, 0, + 0, 414, 0, + 0, 503, 0, + 0, 600, 0, + 0, 704, 0, + 0, 813, 0, + 0, 928, 0, + 0, 1046, 0, + 0, 1168, 0, + 0, 1292, 0, + 0, 1418, 0, + 0, 1546, 0, + 0, 1674, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 123, 316, + 0, 165, 267, + 0, 215, 193, + 0, 274, 69, + 0, 343, 0, + 0, 422, 0, + 0, 509, 0, + 0, 605, 0, + 0, 708, 0, + 0, 816, 0, + 0, 930, 0, + 0, 1048, 0, + 0, 1170, 0, + 0, 1293, 0, + 0, 1419, 0, + 0, 1546, 0, + 0, 1675, 0, + 0, 1804, 0, + 0, 1934, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 225, 143, 400, + 144, 182, 360, + 6, 231, 300, + 0, 288, 206, + 0, 355, 37, + 0, 432, 0, + 0, 518, 0, + 0, 612, 0, + 0, 713, 0, + 0, 821, 0, + 0, 934, 0, + 0, 1051, 0, + 0, 1171, 0, + 0, 1295, 0, + 0, 1420, 0, + 0, 1547, 0, + 0, 1676, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2065, 0, + 0, 2196, 0, + 0, 2327, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 451, 167, 493, + 403, 205, 461, + 331, 251, 413, + 211, 306, 341, + 0, 371, 223, + 0, 445, 0, + 0, 529, 0, + 0, 621, 0, + 0, 720, 0, + 0, 826, 0, + 0, 938, 0, + 0, 1054, 0, + 0, 1174, 0, + 0, 1297, 0, + 0, 1422, 0, + 0, 1548, 0, + 0, 1676, 0, + 0, 1805, 0, + 0, 1935, 0, + 0, 2066, 0, + 0, 2196, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2590, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 643, 198, 593, + 612, 234, 568, + 567, 277, 531, + 500, 329, 476, + 391, 391, 391, + 186, 462, 245, + 0, 543, 0, + 0, 632, 0, + 0, 730, 0, + 0, 834, 0, + 0, 944, 0, + 0, 1059, 0, + 0, 1178, 0, + 0, 1299, 0, + 0, 1424, 0, + 0, 1550, 0, + 0, 1678, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 815, 237, 700, + 794, 269, 680, + 765, 310, 651, + 722, 358, 610, + 658, 417, 548, + 556, 484, 450, + 369, 561, 272, + 0, 647, 0, + 0, 742, 0, + 0, 844, 0, + 0, 952, 0, + 0, 1065, 0, + 0, 1182, 0, + 0, 1303, 0, + 0, 1426, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1808, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 974, 283, 813, + 960, 313, 797, + 940, 350, 775, + 911, 395, 744, + 870, 448, 699, + 809, 512, 630, + 711, 585, 518, + 535, 667, 307, + 81, 758, 0, + 0, 856, 0, + 0, 962, 0, + 0, 1073, 0, + 0, 1188, 0, + 0, 1308, 0, + 0, 1430, 0, + 0, 1555, 0, + 0, 1681, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1126, 339, 929, + 1116, 365, 917, + 1102, 398, 900, + 1082, 439, 877, + 1054, 488, 844, + 1014, 546, 795, + 954, 614, 720, + 860, 692, 596, + 691, 778, 349, + 276, 873, 0, + 0, 975, 0, + 0, 1083, 0, + 0, 1196, 0, + 0, 1314, 0, + 0, 1435, 0, + 0, 1558, 0, + 0, 1684, 0, + 0, 1811, 0, + 0, 1939, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1272, 404, 1049, + 1265, 427, 1040, + 1255, 456, 1027, + 1241, 492, 1010, + 1221, 536, 985, + 1194, 589, 950, + 1155, 651, 898, + 1096, 723, 818, + 1004, 804, 683, + 841, 894, 400, + 450, 992, 0, + 0, 1096, 0, + 0, 1207, 0, + 0, 1322, 0, + 0, 1441, 0, + 0, 1563, 0, + 0, 1688, 0, + 0, 1814, 0, + 0, 1942, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1415, 479, 1172, + 1409, 499, 1165, + 1402, 523, 1156, + 1392, 554, 1143, + 1378, 593, 1124, + 1359, 640, 1099, + 1332, 696, 1062, + 1293, 762, 1008, + 1235, 837, 923, + 1145, 921, 778, + 985, 1014, 461, + 611, 1114, 0, + 0, 1221, 0, + 0, 1333, 0, + 0, 1449, 0, + 0, 1569, 0, + 0, 1692, 0, + 0, 1817, 0, + 0, 1944, 0, + 0, 2072, 0, + 0, 2202, 0, + 0, 2331, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1555, 563, 1298, + 1551, 579, 1292, + 1545, 600, 1285, + 1538, 627, 1275, + 1528, 660, 1262, + 1514, 701, 1243, + 1495, 750, 1216, + 1468, 809, 1178, + 1430, 877, 1122, + 1373, 955, 1034, + 1283, 1041, 880, + 1127, 1136, 531, + 763, 1238, 0, + 0, 1347, 0, + 0, 1460, 0, + 0, 1578, 0, + 0, 1699, 0, + 0, 1822, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1692, 656, 1424, + 1689, 669, 1420, + 1685, 686, 1415, + 1680, 708, 1408, + 1673, 736, 1397, + 1663, 771, 1384, + 1649, 813, 1364, + 1630, 865, 1337, + 1604, 926, 1298, + 1565, 996, 1240, + 1509, 1076, 1149, + 1420, 1164, 989, + 1265, 1261, 610, + 910, 1365, 0, + 0, 1474, 0, + 0, 1589, 0, + 0, 1707, 0, + 0, 1829, 0, + 0, 1953, 0, + 0, 2079, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2595, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1828, 756, 1553, + 1826, 766, 1550, + 1823, 780, 1545, + 1819, 798, 1540, + 1814, 821, 1532, + 1807, 850, 1522, + 1797, 886, 1508, + 1783, 930, 1488, + 1764, 983, 1461, + 1738, 1046, 1421, + 1700, 1118, 1362, + 1644, 1199, 1268, + 1556, 1289, 1103, + 1402, 1387, 699, + 1053, 1492, 0, + 0, 1603, 0, + 0, 1718, 0, + 0, 1837, 0, + 0, 1959, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1964, 862, 1682, + 1962, 871, 1679, + 1960, 882, 1676, + 1957, 896, 1672, + 1953, 915, 1667, + 1948, 938, 1659, + 1940, 968, 1649, + 1930, 1006, 1634, + 1917, 1051, 1614, + 1898, 1105, 1586, + 1872, 1169, 1546, + 1834, 1243, 1486, + 1778, 1325, 1391, + 1690, 1416, 1220, + 1538, 1515, 795, + 1193, 1621, 0, + 0, 1732, 0, + 0, 1848, 0, + 0, 1968, 0, + 0, 2090, 0, + 0, 2215, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 2098, 974, 1812, + 2097, 981, 1810, + 2095, 989, 1808, + 2093, 1001, 1804, + 2090, 1016, 1800, + 2086, 1035, 1795, + 2081, 1059, 1787, + 2074, 1090, 1776, + 2064, 1128, 1762, + 2050, 1174, 1742, + 2032, 1230, 1714, + 2005, 1294, 1673, + 1968, 1369, 1612, + 1912, 1452, 1515, + 1824, 1545, 1341, + 1673, 1644, 898, + 1331, 1751, 0, + 0, 1862, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2232, 1091, 1942, + 2231, 1096, 1941, + 2230, 1103, 1939, + 2228, 1111, 1937, + 2226, 1123, 1933, + 2223, 1138, 1929, + 2219, 1158, 1924, + 2214, 1183, 1916, + 2206, 1214, 1905, + 2197, 1253, 1891, + 2183, 1300, 1870, + 2165, 1356, 1842, + 2138, 1421, 1801, + 2101, 1497, 1739, + 2045, 1581, 1641, + 1958, 1674, 1465, + 1807, 1774, 1008, + 1467, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2365, 1211, 2073, + 2364, 1215, 2072, + 2364, 1220, 2071, + 2362, 1227, 2069, + 2361, 1236, 2066, + 2359, 1248, 2063, + 2356, 1263, 2059, + 2352, 1283, 2053, + 2346, 1308, 2046, + 2339, 1340, 2035, + 2329, 1379, 2020, + 2316, 1427, 2000, + 2297, 1483, 1971, + 2271, 1550, 1930, + 2234, 1625, 1868, + 2178, 1710, 1769, + 2091, 1804, 1591, + 1941, 1904, 1122, + 1603, 2011, 0, + 0, 2124, 0, + 0, 2241, 0, + 0, 2361, 0, + 0, 2484, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2498, 1334, 2204, + 2498, 1337, 2203, + 2497, 1341, 2202, + 2496, 1346, 2201, + 2495, 1353, 2199, + 2493, 1362, 2197, + 2491, 1374, 2194, + 2488, 1390, 2189, + 2484, 1410, 2184, + 2479, 1435, 2176, + 2472, 1467, 2165, + 2462, 1507, 2150, + 2449, 1555, 2130, + 2430, 1612, 2101, + 2404, 1679, 2060, + 2366, 1755, 1997, + 2311, 1840, 1898, + 2224, 1934, 1718, + 2074, 2035, 1241, + 1737, 2142, 0, + 0, 2255, 0, + 0, 2372, 0, + 0, 2493, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1459, 2335, + 2631, 1461, 2335, + 2630, 1464, 2334, + 2629, 1468, 2333, + 2628, 1473, 2332, + 2627, 1480, 2330, + 2626, 1490, 2328, + 2624, 1502, 2324, + 2621, 1518, 2320, + 2617, 1538, 2314, + 2611, 1564, 2307, + 2604, 1596, 2296, + 2594, 1636, 2281, + 2581, 1684, 2261, + 2562, 1742, 2232, + 2536, 1809, 2190, + 2499, 1885, 2128, + 2443, 1971, 2028, + 2357, 2065, 1846, + 2207, 2166, 1362, + 1871, 2274, 0, + 0, 2387, 0, + 0, 2504, 0, + 0, 2625, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2764, 1585, 2467, + 2763, 1587, 2466, + 2763, 1589, 2466, + 2762, 1593, 2465, + 2762, 1597, 2464, + 2761, 1602, 2463, + 2760, 1609, 2461, + 2758, 1618, 2459, + 2756, 1631, 2456, + 2753, 1647, 2451, + 2749, 1667, 2446, + 2744, 1693, 2438, + 2737, 1725, 2427, + 2727, 1765, 2412, + 2713, 1814, 2392, + 2695, 1872, 2363, + 2669, 1939, 2321, + 2631, 2016, 2258, + 2576, 2102, 2158, + 2489, 2196, 1976, + 2340, 2297, 1486, + 2004, 2405, 0, + 0, 2518, 0, + 0, 2636, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1713, 2599, + 2896, 1715, 2598, + 2896, 1717, 2598, + 2895, 1719, 2597, + 2895, 1722, 2597, + 2894, 1726, 2596, + 2893, 1731, 2594, + 2892, 1739, 2593, + 2890, 1748, 2590, + 2888, 1760, 2587, + 2885, 1776, 2583, + 2881, 1797, 2577, + 2876, 1823, 2569, + 2869, 1855, 2558, + 2859, 1896, 2544, + 2846, 1944, 2523, + 2827, 2002, 2494, + 2801, 2070, 2452, + 2764, 2147, 2389, + 2708, 2233, 2289, + 2622, 2327, 2106, + 2472, 2429, 1612, + 2137, 2537, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1843, 2730, + 3028, 1844, 2730, + 3028, 1845, 2730, + 3028, 1847, 2729, + 3027, 1849, 2729, + 3027, 1852, 2728, + 3026, 1856, 2727, + 3025, 1862, 2726, + 3024, 1869, 2724, + 3023, 1878, 2722, + 3020, 1891, 2719, + 3017, 1907, 2714, + 3014, 1927, 2708, + 3008, 1953, 2701, + 3001, 1986, 2690, + 2991, 2026, 2675, + 2978, 2075, 2654, + 2959, 2133, 2625, + 2933, 2201, 2583, + 2896, 2278, 2520, + 2840, 2364, 2420, + 2754, 2459, 2236, + 2605, 2561, 1740, + 2270, 2669, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1972, 2862, + 3161, 1973, 2862, + 3160, 1974, 2862, + 3160, 1975, 2862, + 3160, 1977, 2861, + 3160, 1980, 2861, + 3159, 1983, 2860, + 3158, 1987, 2859, + 3158, 1992, 2858, + 3156, 1999, 2856, + 3155, 2009, 2853, + 3153, 2021, 2850, + 3150, 2037, 2846, + 3146, 2058, 2840, + 3140, 2084, 2832, + 3133, 2117, 2821, + 3124, 2157, 2807, + 3110, 2206, 2786, + 3092, 2265, 2757, + 3065, 2333, 2715, + 3028, 2410, 2652, + 2973, 2496, 2551, + 2886, 2591, 2367, + 2737, 2692, 1868, + 2403, 2801, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2103, 2994, + 3293, 2103, 2994, + 3293, 2104, 2994, + 3293, 2105, 2994, + 3292, 2106, 2993, + 3292, 2108, 2993, + 3292, 2110, 2992, + 3291, 2114, 2992, + 3291, 2118, 2991, + 3290, 2123, 2989, + 3289, 2130, 2988, + 3287, 2140, 2985, + 3285, 2152, 2982, + 3282, 2168, 2978, + 3278, 2189, 2972, + 3273, 2215, 2964, + 3265, 2248, 2953, + 3256, 2289, 2938, + 3242, 2338, 2918, + 3224, 2396, 2889, + 3198, 2464, 2847, + 3160, 2541, 2784, + 3105, 2628, 2682, + 3019, 2722, 2498, + 2869, 2824, 1998, + 2535, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3425, 2234, 3126, + 3425, 2234, 3126, + 3425, 2235, 3126, + 3425, 2235, 3126, + 3425, 2236, 3126, + 3425, 2238, 3125, + 3424, 2239, 3125, + 3424, 2242, 3124, + 3423, 2245, 3124, + 3423, 2249, 3123, + 3422, 2255, 3121, + 3421, 2262, 3119, + 3419, 2271, 3117, + 3417, 2284, 3114, + 3414, 2300, 3110, + 3410, 2320, 3104, + 3405, 2347, 3096, + 3398, 2380, 3085, + 3388, 2420, 3070, + 3374, 2469, 3050, + 3356, 2528, 3021, + 3330, 2596, 2978, + 3292, 2673, 2915, + 3237, 2760, 2814, + 3151, 2854, 2630, + 3001, 2956, 2128, + 2668, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2365, 3258, + 3557, 2366, 3258, + 3557, 2367, 3258, + 3557, 2368, 3257, + 3557, 2369, 3257, + 3556, 2371, 3257, + 3556, 2373, 3256, + 3556, 2376, 3255, + 3555, 2380, 3254, + 3554, 2386, 3253, + 3553, 2393, 3251, + 3551, 2403, 3249, + 3549, 2415, 3246, + 3546, 2431, 3242, + 3542, 2452, 3236, + 3537, 2478, 3228, + 3530, 2511, 3217, + 3520, 2552, 3202, + 3507, 2601, 3182, + 3488, 2660, 3152, + 3462, 2728, 3110, + 3425, 2805, 3047, + 3369, 2892, 2946, + 3283, 2986, 2761, + 3134, 3088, 2258, + 2800, 3196, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2496, 3390, + 3690, 2496, 3390, + 3689, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2498, 3390, + 3689, 2499, 3389, + 3689, 2501, 3389, + 3689, 2502, 3389, + 3688, 2505, 3388, + 3688, 2508, 3387, + 3687, 2512, 3386, + 3686, 2518, 3385, + 3685, 2525, 3383, + 3683, 2534, 3381, + 3681, 2547, 3378, + 3678, 2563, 3374, + 3674, 2584, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2684, 3334, + 3639, 2733, 3314, + 3620, 2791, 3284, + 3594, 2859, 3242, + 3557, 2937, 3179, + 3501, 3023, 3078, + 3415, 3118, 2893, + 3266, 3220, 2389, + 2932, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3821, 2629, 3522, + 3821, 2630, 3522, + 3821, 2631, 3521, + 3821, 2632, 3521, + 3821, 2634, 3521, + 3820, 2637, 3520, + 3820, 2640, 3519, + 3819, 2644, 3518, + 3818, 2649, 3517, + 3817, 2657, 3515, + 3815, 2666, 3513, + 3813, 2679, 3510, + 3810, 2695, 3506, + 3806, 2716, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2816, 3466, + 3771, 2865, 3446, + 3752, 2923, 3416, + 3726, 2991, 3374, + 3689, 3069, 3311, + 3634, 3155, 3210, + 3547, 3250, 3025, + 3398, 3352, 2521, + 3064, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3954, 2759, 3654, + 3954, 2759, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3653, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2768, 3652, + 3952, 2772, 3651, + 3951, 2776, 3650, + 3950, 2781, 3649, + 3949, 2788, 3647, + 3948, 2798, 3645, + 3945, 2811, 3642, + 3943, 2827, 3638, + 3939, 2847, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2947, 3598, + 3903, 2997, 3578, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3287, 3342, + 3679, 3382, 3157, + 3530, 3484, 2652, + 3197, 3593, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2903, 3784, + 4083, 2908, 3783, + 4082, 2913, 3781, + 4081, 2920, 3779, + 4080, 2930, 3777, + 4078, 2942, 3774, + 4075, 2959, 3770, + 4071, 2979, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3079, 3730, + 4035, 3129, 3710, + 4017, 3187, 3680, + 3990, 3255, 3638, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3514, 3289, + 3662, 3616, 2784, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3035, 3916, + 4095, 3040, 3915, + 4095, 3045, 3913, + 4095, 3052, 3912, + 4095, 3062, 3909, + 4095, 3074, 3906, + 4095, 3091, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3211, 3862, + 4095, 3261, 3842, + 4095, 3319, 3812, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2916, + 4095, 3155, 4051, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3223, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3343, 3994, + 4095, 3393, 3974, + 4095, 3451, 3945, + 4095, 3519, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 193, 352, + 0, 229, 307, + 0, 273, 239, + 0, 326, 129, + 0, 388, 0, + 0, 459, 0, + 0, 540, 0, + 0, 630, 0, + 0, 728, 0, + 0, 833, 0, + 0, 943, 0, + 0, 1058, 0, + 0, 1177, 0, + 0, 1299, 0, + 0, 1423, 0, + 0, 1550, 0, + 0, 1677, 0, + 0, 1806, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 205, 412, + 0, 240, 373, + 0, 283, 315, + 0, 335, 223, + 0, 396, 62, + 0, 466, 0, + 0, 546, 0, + 0, 635, 0, + 0, 732, 0, + 0, 836, 0, + 0, 945, 0, + 0, 1060, 0, + 0, 1178, 0, + 0, 1300, 0, + 0, 1424, 0, + 0, 1550, 0, + 0, 1678, 0, + 0, 1807, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 154, 222, 481, + 58, 255, 448, + 0, 297, 399, + 0, 347, 325, + 0, 407, 201, + 0, 476, 0, + 0, 554, 0, + 0, 641, 0, + 0, 737, 0, + 0, 840, 0, + 0, 949, 0, + 0, 1062, 0, + 0, 1180, 0, + 0, 1302, 0, + 0, 1425, 0, + 0, 1551, 0, + 0, 1679, 0, + 0, 1807, 0, + 0, 1936, 0, + 0, 2066, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 409, 242, 560, + 357, 275, 532, + 276, 315, 492, + 138, 363, 433, + 0, 420, 338, + 0, 488, 170, + 0, 564, 0, + 0, 650, 0, + 0, 744, 0, + 0, 845, 0, + 0, 953, 0, + 0, 1066, 0, + 0, 1183, 0, + 0, 1304, 0, + 0, 1427, 0, + 0, 1552, 0, + 0, 1679, 0, + 0, 1808, 0, + 0, 1937, 0, + 0, 2067, 0, + 0, 2197, 0, + 0, 2328, 0, + 0, 2459, 0, + 0, 2591, 0, + 0, 2722, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 616, 269, 648, + 583, 299, 625, + 535, 337, 593, + 463, 383, 546, + 343, 438, 474, + 109, 503, 355, + 0, 577, 124, + 0, 661, 0, + 0, 753, 0, + 0, 852, 0, + 0, 958, 0, + 0, 1070, 0, + 0, 1186, 0, + 0, 1306, 0, + 0, 1429, 0, + 0, 1554, 0, + 0, 1681, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2067, 0, + 0, 2198, 0, + 0, 2328, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 796, 302, 744, + 775, 330, 726, + 744, 366, 700, + 700, 409, 663, + 632, 461, 608, + 523, 523, 523, + 318, 594, 377, + 0, 675, 54, + 0, 764, 0, + 0, 862, 0, + 0, 966, 0, + 0, 1076, 0, + 0, 1191, 0, + 0, 1310, 0, + 0, 1432, 0, + 0, 1556, 0, + 0, 1682, 0, + 0, 1810, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 962, 343, 847, + 947, 369, 832, + 926, 401, 812, + 897, 442, 784, + 854, 490, 742, + 790, 549, 680, + 688, 616, 582, + 501, 693, 404, + 0, 780, 0, + 0, 874, 0, + 0, 976, 0, + 0, 1084, 0, + 0, 1197, 0, + 0, 1314, 0, + 0, 1435, 0, + 0, 1559, 0, + 0, 1684, 0, + 0, 1811, 0, + 0, 1940, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1117, 392, 956, + 1107, 415, 945, + 1092, 445, 929, + 1072, 482, 907, + 1043, 527, 876, + 1002, 581, 831, + 941, 644, 762, + 843, 717, 650, + 667, 799, 439, + 213, 890, 0, + 0, 988, 0, + 0, 1094, 0, + 0, 1205, 0, + 0, 1320, 0, + 0, 1440, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1266, 450, 1070, + 1258, 471, 1061, + 1248, 497, 1049, + 1234, 530, 1032, + 1214, 571, 1009, + 1186, 620, 976, + 1146, 678, 927, + 1086, 746, 852, + 992, 824, 728, + 824, 910, 481, + 408, 1005, 0, + 0, 1107, 0, + 0, 1215, 0, + 0, 1328, 0, + 0, 1446, 0, + 0, 1567, 0, + 0, 1690, 0, + 0, 1816, 0, + 0, 1943, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1410, 519, 1188, + 1405, 536, 1182, + 1397, 559, 1172, + 1387, 588, 1160, + 1373, 624, 1142, + 1353, 668, 1117, + 1326, 721, 1082, + 1287, 783, 1030, + 1228, 855, 950, + 1136, 936, 815, + 973, 1026, 532, + 582, 1124, 0, + 0, 1229, 0, + 0, 1339, 0, + 0, 1454, 0, + 0, 1573, 0, + 0, 1695, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1551, 596, 1310, + 1547, 611, 1305, + 1542, 631, 1297, + 1534, 655, 1288, + 1524, 687, 1275, + 1510, 725, 1256, + 1491, 772, 1231, + 1464, 828, 1194, + 1425, 894, 1140, + 1367, 969, 1055, + 1277, 1053, 910, + 1117, 1146, 593, + 743, 1246, 0, + 0, 1353, 0, + 0, 1465, 0, + 0, 1581, 0, + 0, 1702, 0, + 0, 1824, 0, + 0, 1950, 0, + 0, 2076, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1690, 683, 1434, + 1687, 695, 1430, + 1683, 711, 1424, + 1677, 732, 1417, + 1670, 759, 1407, + 1660, 792, 1394, + 1646, 833, 1375, + 1627, 882, 1348, + 1600, 941, 1310, + 1562, 1009, 1254, + 1505, 1087, 1166, + 1415, 1173, 1013, + 1259, 1268, 663, + 895, 1370, 0, + 0, 1479, 0, + 0, 1592, 0, + 0, 1710, 0, + 0, 1831, 0, + 0, 1954, 0, + 0, 2080, 0, + 0, 2207, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1826, 777, 1560, + 1824, 788, 1557, + 1821, 801, 1552, + 1817, 818, 1547, + 1812, 840, 1540, + 1805, 868, 1530, + 1795, 903, 1516, + 1781, 945, 1496, + 1762, 997, 1469, + 1736, 1058, 1430, + 1697, 1128, 1372, + 1641, 1208, 1281, + 1552, 1296, 1121, + 1397, 1393, 742, + 1042, 1497, 0, + 0, 1606, 0, + 0, 1721, 0, + 0, 1839, 0, + 0, 1961, 0, + 0, 2085, 0, + 0, 2211, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1962, 880, 1687, + 1961, 888, 1685, + 1958, 898, 1682, + 1955, 912, 1678, + 1951, 930, 1672, + 1946, 953, 1664, + 1939, 982, 1654, + 1929, 1018, 1640, + 1915, 1062, 1620, + 1897, 1116, 1593, + 1870, 1178, 1553, + 1832, 1250, 1494, + 1776, 1331, 1400, + 1688, 1422, 1235, + 1534, 1520, 831, + 1185, 1624, 0, + 0, 1735, 0, + 0, 1850, 0, + 0, 1969, 0, + 0, 2091, 0, + 0, 2216, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2097, 988, 1815, + 2096, 994, 1814, + 2094, 1003, 1811, + 2092, 1014, 1808, + 2089, 1028, 1804, + 2085, 1047, 1799, + 2080, 1071, 1791, + 2072, 1100, 1781, + 2063, 1138, 1766, + 2049, 1183, 1746, + 2030, 1237, 1719, + 2004, 1301, 1678, + 1966, 1375, 1618, + 1910, 1457, 1523, + 1822, 1548, 1352, + 1670, 1647, 927, + 1325, 1753, 0, + 0, 1864, 0, + 0, 1980, 0, + 0, 2100, 0, + 0, 2222, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2231, 1101, 1945, + 2230, 1106, 1944, + 2229, 1113, 1942, + 2227, 1122, 1940, + 2225, 1133, 1936, + 2222, 1148, 1932, + 2218, 1167, 1927, + 2213, 1191, 1919, + 2206, 1222, 1908, + 2196, 1260, 1894, + 2182, 1306, 1874, + 2164, 1362, 1846, + 2137, 1427, 1805, + 2100, 1501, 1744, + 2044, 1585, 1647, + 1956, 1677, 1473, + 1805, 1776, 1031, + 1463, 1883, 0, + 0, 1994, 0, + 0, 2111, 0, + 0, 2231, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2364, 1219, 2075, + 2364, 1223, 2074, + 2363, 1228, 2073, + 2362, 1235, 2071, + 2360, 1244, 2069, + 2358, 1255, 2066, + 2355, 1270, 2061, + 2351, 1290, 2056, + 2346, 1315, 2048, + 2339, 1346, 2037, + 2329, 1385, 2023, + 2315, 1432, 2003, + 2297, 1488, 1974, + 2270, 1553, 1933, + 2233, 1629, 1871, + 2177, 1713, 1773, + 2090, 1806, 1597, + 1939, 1906, 1140, + 1599, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2498, 1340, 2206, + 2497, 1343, 2205, + 2497, 1347, 2204, + 2496, 1352, 2203, + 2494, 1359, 2201, + 2493, 1368, 2199, + 2491, 1380, 2195, + 2488, 1395, 2191, + 2484, 1415, 2185, + 2478, 1440, 2178, + 2471, 1472, 2167, + 2461, 1511, 2152, + 2448, 1559, 2132, + 2429, 1615, 2103, + 2403, 1682, 2062, + 2366, 1757, 2000, + 2310, 1842, 1901, + 2223, 1936, 1723, + 2073, 2036, 1254, + 1735, 2144, 0, + 0, 2256, 0, + 0, 2373, 0, + 0, 2493, 0, + 0, 2616, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2631, 1463, 2337, + 2630, 1466, 2336, + 2630, 1469, 2335, + 2629, 1473, 2334, + 2628, 1478, 2333, + 2627, 1485, 2331, + 2625, 1494, 2329, + 2623, 1506, 2326, + 2620, 1522, 2322, + 2616, 1542, 2316, + 2611, 1567, 2308, + 2604, 1599, 2297, + 2594, 1639, 2283, + 2581, 1687, 2262, + 2562, 1744, 2233, + 2536, 1811, 2192, + 2498, 1887, 2130, + 2443, 1972, 2030, + 2356, 2066, 1850, + 2206, 2167, 1373, + 1869, 2275, 0, + 0, 2387, 0, + 0, 2504, 0, + 0, 2625, 0, + 0, 2748, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2763, 1589, 2468, + 2763, 1591, 2467, + 2763, 1593, 2467, + 2762, 1596, 2466, + 2761, 1600, 2465, + 2761, 1605, 2464, + 2759, 1613, 2462, + 2758, 1622, 2460, + 2756, 1634, 2457, + 2753, 1650, 2452, + 2749, 1670, 2447, + 2743, 1696, 2439, + 2736, 1728, 2428, + 2727, 1768, 2413, + 2713, 1816, 2393, + 2694, 1874, 2364, + 2668, 1941, 2322, + 2631, 2017, 2260, + 2575, 2103, 2160, + 2489, 2197, 1978, + 2339, 2298, 1494, + 2003, 2406, 0, + 0, 2519, 0, + 0, 2636, 0, + 0, 2757, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1716, 2599, + 2896, 1717, 2599, + 2895, 1719, 2599, + 2895, 1722, 2598, + 2894, 1725, 2597, + 2894, 1729, 2596, + 2893, 1734, 2595, + 2892, 1741, 2593, + 2890, 1751, 2591, + 2888, 1763, 2588, + 2885, 1779, 2583, + 2881, 1799, 2578, + 2876, 1825, 2570, + 2869, 1857, 2559, + 2859, 1897, 2544, + 2845, 1946, 2524, + 2827, 2004, 2495, + 2801, 2071, 2453, + 2763, 2148, 2390, + 2708, 2234, 2290, + 2621, 2328, 2108, + 2472, 2430, 1618, + 2136, 2537, 0, + 0, 2650, 0, + 0, 2768, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1845, 2731, + 3028, 1846, 2731, + 3028, 1847, 2730, + 3028, 1849, 2730, + 3027, 1851, 2729, + 3027, 1854, 2729, + 3026, 1858, 2728, + 3025, 1864, 2726, + 3024, 1871, 2725, + 3022, 1880, 2722, + 3020, 1892, 2719, + 3017, 1908, 2715, + 3013, 1929, 2709, + 3008, 1955, 2701, + 3001, 1987, 2690, + 2991, 2028, 2676, + 2978, 2076, 2655, + 2959, 2134, 2626, + 2933, 2202, 2584, + 2896, 2279, 2521, + 2840, 2365, 2421, + 2754, 2459, 2238, + 2604, 2561, 1744, + 2269, 2669, 0, + 0, 2782, 0, + 0, 2900, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3161, 1974, 2863, + 3161, 1975, 2862, + 3160, 1976, 2862, + 3160, 1977, 2862, + 3160, 1979, 2862, + 3160, 1981, 2861, + 3159, 1984, 2860, + 3158, 1988, 2859, + 3157, 1994, 2858, + 3156, 2001, 2856, + 3155, 2010, 2854, + 3152, 2023, 2851, + 3150, 2039, 2846, + 3146, 2059, 2841, + 3140, 2085, 2833, + 3133, 2118, 2822, + 3123, 2158, 2807, + 3110, 2207, 2787, + 3091, 2266, 2758, + 3065, 2333, 2716, + 3028, 2410, 2653, + 2973, 2497, 2552, + 2886, 2591, 2368, + 2737, 2693, 1872, + 2402, 2801, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3293, 2104, 2994, + 3293, 2104, 2994, + 3293, 2105, 2994, + 3293, 2106, 2994, + 3292, 2107, 2994, + 3292, 2109, 2993, + 3292, 2112, 2993, + 3291, 2115, 2992, + 3291, 2119, 2991, + 3290, 2124, 2990, + 3288, 2132, 2988, + 3287, 2141, 2986, + 3285, 2153, 2982, + 3282, 2169, 2978, + 3278, 2190, 2972, + 3273, 2216, 2964, + 3265, 2249, 2954, + 3256, 2290, 2939, + 3242, 2339, 2918, + 3224, 2397, 2889, + 3198, 2465, 2847, + 3160, 2542, 2784, + 3105, 2628, 2683, + 3018, 2723, 2499, + 2869, 2825, 2000, + 2535, 2933, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3661, 0, + 3425, 2234, 3126, + 3425, 2235, 3126, + 3425, 2235, 3126, + 3425, 2236, 3126, + 3425, 2237, 3126, + 3425, 2238, 3125, + 3424, 2240, 3125, + 3424, 2243, 3124, + 3423, 2246, 3124, + 3423, 2250, 3123, + 3422, 2255, 3121, + 3421, 2263, 3120, + 3419, 2272, 3117, + 3417, 2284, 3114, + 3414, 2301, 3110, + 3410, 2321, 3104, + 3405, 2347, 3096, + 3398, 2380, 3085, + 3388, 2421, 3071, + 3374, 2470, 3050, + 3356, 2528, 3021, + 3330, 2596, 2979, + 3292, 2674, 2916, + 3237, 2760, 2815, + 3151, 2855, 2631, + 3001, 2956, 2130, + 2667, 3065, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2365, 3258, + 3557, 2366, 3258, + 3557, 2366, 3258, + 3557, 2367, 3258, + 3557, 2367, 3258, + 3557, 2368, 3258, + 3557, 2370, 3257, + 3556, 2371, 3257, + 3556, 2374, 3256, + 3556, 2377, 3256, + 3555, 2381, 3255, + 3554, 2387, 3253, + 3553, 2394, 3252, + 3551, 2403, 3249, + 3549, 2416, 3246, + 3546, 2432, 3242, + 3542, 2453, 3236, + 3537, 2479, 3228, + 3530, 2512, 3217, + 3520, 2552, 3202, + 3507, 2602, 3182, + 3488, 2660, 3153, + 3462, 2728, 3111, + 3425, 2805, 3047, + 3369, 2892, 2946, + 3283, 2986, 2762, + 3134, 3088, 2260, + 2800, 3197, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3690, 2497, 3390, + 3690, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2498, 3390, + 3689, 2499, 3390, + 3689, 2500, 3390, + 3689, 2501, 3389, + 3689, 2503, 3389, + 3688, 2505, 3388, + 3688, 2508, 3388, + 3687, 2513, 3387, + 3686, 2518, 3385, + 3685, 2525, 3384, + 3683, 2535, 3381, + 3681, 2547, 3378, + 3678, 2563, 3374, + 3674, 2584, 3368, + 3669, 2610, 3360, + 3662, 2643, 3349, + 3652, 2684, 3334, + 3639, 2733, 3314, + 3620, 2792, 3285, + 3594, 2860, 3242, + 3557, 2937, 3179, + 3501, 3024, 3078, + 3415, 3118, 2894, + 3266, 3220, 2391, + 2932, 3329, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3822, 2629, 3522, + 3821, 2630, 3522, + 3821, 2630, 3522, + 3821, 2631, 3522, + 3821, 2633, 3521, + 3821, 2635, 3521, + 3820, 2637, 3520, + 3820, 2640, 3520, + 3819, 2644, 3519, + 3818, 2650, 3517, + 3817, 2657, 3515, + 3815, 2667, 3513, + 3813, 2679, 3510, + 3810, 2695, 3506, + 3806, 2716, 3500, + 3801, 2742, 3492, + 3794, 2775, 3481, + 3784, 2816, 3466, + 3771, 2865, 3446, + 3752, 2924, 3416, + 3726, 2992, 3374, + 3689, 3069, 3311, + 3634, 3156, 3210, + 3547, 3250, 3025, + 3398, 3352, 2521, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3953, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3653, + 3953, 2766, 3653, + 3952, 2769, 3652, + 3952, 2772, 3652, + 3951, 2776, 3651, + 3950, 2781, 3649, + 3949, 2789, 3647, + 3948, 2798, 3645, + 3945, 2811, 3642, + 3942, 2827, 3638, + 3939, 2848, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2948, 3598, + 3903, 2997, 3578, + 3884, 3055, 3548, + 3858, 3123, 3506, + 3821, 3201, 3443, + 3766, 3288, 3342, + 3679, 3382, 3157, + 3530, 3484, 2653, + 3197, 3593, 0, + 0, 3706, 0, + 4086, 2891, 3786, + 4086, 2891, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2896, 3785, + 4085, 2898, 3785, + 4085, 2900, 3784, + 4084, 2904, 3784, + 4083, 2908, 3783, + 4082, 2913, 3781, + 4081, 2921, 3780, + 4080, 2930, 3777, + 4078, 2943, 3774, + 4075, 2959, 3770, + 4071, 2980, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3080, 3730, + 4035, 3129, 3710, + 4017, 3187, 3680, + 3990, 3255, 3638, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3514, 3289, + 3662, 3616, 2784, + 3329, 3725, 0, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3032, 3916, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3045, 3913, + 4095, 3052, 3912, + 4095, 3062, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3111, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3862, + 4095, 3261, 3842, + 4095, 3319, 3813, + 4095, 3387, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2916, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4050, + 4095, 3155, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3167, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3184, 4044, + 4095, 3194, 4041, + 4095, 3206, 4038, + 4095, 3223, 4034, + 4095, 3243, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3994, + 4095, 3393, 3974, + 4095, 3451, 3945, + 4095, 3520, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 286, 468, + 0, 316, 433, + 0, 352, 383, + 0, 397, 305, + 0, 450, 175, + 0, 514, 0, + 0, 586, 0, + 0, 668, 0, + 0, 759, 0, + 0, 857, 0, + 0, 962, 0, + 0, 1073, 0, + 0, 1189, 0, + 0, 1308, 0, + 0, 1430, 0, + 0, 1555, 0, + 0, 1681, 0, + 0, 1809, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 296, 515, + 0, 325, 484, + 0, 361, 439, + 0, 405, 371, + 0, 458, 261, + 0, 520, 54, + 0, 592, 0, + 0, 673, 0, + 0, 762, 0, + 0, 860, 0, + 0, 965, 0, + 0, 1075, 0, + 0, 1190, 0, + 0, 1309, 0, + 0, 1431, 0, + 0, 1556, 0, + 0, 1682, 0, + 0, 1810, 0, + 0, 1938, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 38, 310, 571, + 0, 338, 544, + 0, 372, 505, + 0, 415, 447, + 0, 467, 355, + 0, 528, 195, + 0, 599, 0, + 0, 678, 0, + 0, 767, 0, + 0, 864, 0, + 0, 968, 0, + 0, 1077, 0, + 0, 1192, 0, + 0, 1311, 0, + 0, 1432, 0, + 0, 1556, 0, + 0, 1682, 0, + 0, 1810, 0, + 0, 1939, 0, + 0, 2068, 0, + 0, 2198, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 347, 327, 637, + 286, 354, 613, + 190, 387, 580, + 17, 429, 531, + 0, 479, 457, + 0, 539, 333, + 0, 608, 87, + 0, 686, 0, + 0, 774, 0, + 0, 869, 0, + 0, 972, 0, + 0, 1081, 0, + 0, 1194, 0, + 0, 1312, 0, + 0, 1434, 0, + 0, 1558, 0, + 0, 1683, 0, + 0, 1811, 0, + 0, 1939, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 577, 349, 712, + 541, 375, 692, + 489, 407, 664, + 408, 447, 624, + 270, 495, 565, + 0, 553, 470, + 0, 620, 302, + 0, 696, 0, + 0, 782, 0, + 0, 876, 0, + 0, 977, 0, + 0, 1085, 0, + 0, 1198, 0, + 0, 1315, 0, + 0, 1436, 0, + 0, 1559, 0, + 0, 1684, 0, + 0, 1812, 0, + 0, 1940, 0, + 0, 2069, 0, + 0, 2199, 0, + 0, 2329, 0, + 0, 2460, 0, + 0, 2591, 0, + 0, 2723, 0, + 0, 2854, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 771, 377, 796, + 748, 401, 780, + 715, 431, 757, + 668, 469, 725, + 595, 515, 678, + 475, 571, 606, + 241, 635, 487, + 0, 709, 256, + 0, 793, 0, + 0, 885, 0, + 0, 984, 0, + 0, 1091, 0, + 0, 1202, 0, + 0, 1318, 0, + 0, 1438, 0, + 0, 1561, 0, + 0, 1686, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2199, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 944, 411, 889, + 928, 434, 876, + 907, 462, 858, + 876, 498, 832, + 832, 541, 795, + 764, 594, 740, + 655, 655, 655, + 450, 726, 509, + 0, 807, 186, + 0, 896, 0, + 0, 994, 0, + 0, 1098, 0, + 0, 1208, 0, + 0, 1323, 0, + 0, 1442, 0, + 0, 1564, 0, + 0, 1688, 0, + 0, 1814, 0, + 0, 1942, 0, + 0, 2071, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1105, 454, 990, + 1094, 475, 979, + 1079, 501, 965, + 1058, 533, 944, + 1029, 574, 916, + 986, 623, 874, + 922, 681, 813, + 820, 748, 714, + 633, 825, 536, + 113, 912, 73, + 0, 1006, 0, + 0, 1108, 0, + 0, 1216, 0, + 0, 1329, 0, + 0, 1446, 0, + 0, 1567, 0, + 0, 1691, 0, + 0, 1816, 0, + 0, 1943, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1257, 506, 1097, + 1249, 524, 1088, + 1239, 547, 1077, + 1224, 577, 1061, + 1204, 614, 1039, + 1175, 659, 1008, + 1134, 713, 963, + 1073, 776, 894, + 975, 849, 783, + 799, 931, 571, + 345, 1022, 0, + 0, 1121, 0, + 0, 1226, 0, + 0, 1337, 0, + 0, 1452, 0, + 0, 1572, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1404, 566, 1209, + 1398, 582, 1202, + 1390, 603, 1193, + 1380, 629, 1181, + 1366, 662, 1165, + 1346, 703, 1141, + 1318, 752, 1108, + 1278, 811, 1059, + 1218, 878, 984, + 1124, 956, 860, + 956, 1042, 613, + 540, 1137, 0, + 0, 1239, 0, + 0, 1347, 0, + 0, 1461, 0, + 0, 1578, 0, + 0, 1699, 0, + 0, 1823, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1546, 637, 1325, + 1542, 651, 1320, + 1537, 668, 1314, + 1529, 691, 1304, + 1519, 720, 1292, + 1505, 756, 1274, + 1486, 800, 1249, + 1458, 853, 1214, + 1419, 915, 1162, + 1360, 987, 1082, + 1268, 1068, 947, + 1105, 1158, 665, + 714, 1256, 0, + 0, 1361, 0, + 0, 1471, 0, + 0, 1586, 0, + 0, 1705, 0, + 0, 1827, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1686, 717, 1446, + 1683, 728, 1442, + 1679, 743, 1437, + 1674, 763, 1430, + 1666, 787, 1420, + 1656, 819, 1407, + 1642, 857, 1388, + 1623, 904, 1363, + 1596, 960, 1326, + 1557, 1026, 1272, + 1500, 1101, 1187, + 1409, 1185, 1042, + 1250, 1278, 725, + 875, 1378, 0, + 0, 1485, 0, + 0, 1597, 0, + 0, 1713, 0, + 0, 1834, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1824, 805, 1569, + 1822, 815, 1566, + 1819, 827, 1562, + 1815, 843, 1556, + 1809, 864, 1549, + 1802, 891, 1539, + 1792, 924, 1526, + 1778, 965, 1507, + 1759, 1014, 1480, + 1732, 1073, 1442, + 1694, 1141, 1386, + 1637, 1219, 1298, + 1547, 1305, 1145, + 1391, 1400, 795, + 1028, 1502, 0, + 0, 1611, 0, + 0, 1724, 0, + 0, 1842, 0, + 0, 1963, 0, + 0, 2087, 0, + 0, 2212, 0, + 0, 2339, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1960, 902, 1694, + 1959, 910, 1692, + 1956, 920, 1689, + 1953, 933, 1685, + 1949, 950, 1679, + 1944, 972, 1672, + 1937, 1000, 1662, + 1927, 1035, 1648, + 1913, 1077, 1628, + 1894, 1129, 1601, + 1868, 1190, 1562, + 1830, 1260, 1505, + 1773, 1340, 1413, + 1684, 1428, 1253, + 1530, 1525, 875, + 1174, 1629, 0, + 0, 1738, 0, + 0, 1853, 0, + 0, 1971, 0, + 0, 2093, 0, + 0, 2217, 0, + 0, 2343, 0, + 0, 2471, 0, + 0, 2599, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2095, 1005, 1821, + 2094, 1012, 1819, + 2093, 1020, 1817, + 2090, 1030, 1814, + 2087, 1044, 1810, + 2084, 1062, 1804, + 2078, 1085, 1797, + 2071, 1114, 1786, + 2061, 1150, 1772, + 2047, 1195, 1753, + 2029, 1248, 1725, + 2002, 1310, 1685, + 1964, 1382, 1626, + 1908, 1464, 1533, + 1820, 1554, 1367, + 1667, 1652, 963, + 1317, 1756, 0, + 0, 1867, 0, + 0, 1982, 0, + 0, 2101, 0, + 0, 2223, 0, + 0, 2348, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2230, 1115, 1949, + 2229, 1120, 1948, + 2228, 1126, 1946, + 2226, 1135, 1944, + 2224, 1146, 1941, + 2221, 1160, 1936, + 2217, 1179, 1931, + 2212, 1203, 1923, + 2205, 1233, 1913, + 2195, 1270, 1898, + 2181, 1315, 1879, + 2162, 1369, 1851, + 2136, 1433, 1810, + 2098, 1507, 1750, + 2042, 1589, 1655, + 1955, 1681, 1484, + 1802, 1780, 1059, + 1457, 1885, 0, + 0, 1996, 0, + 0, 2112, 0, + 0, 2232, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2364, 1229, 2078, + 2363, 1233, 2077, + 2362, 1238, 2076, + 2361, 1245, 2074, + 2359, 1254, 2072, + 2357, 1265, 2069, + 2354, 1280, 2064, + 2350, 1299, 2059, + 2345, 1323, 2051, + 2338, 1354, 2041, + 2328, 1392, 2026, + 2314, 1438, 2006, + 2296, 1494, 1978, + 2269, 1559, 1937, + 2232, 1633, 1876, + 2176, 1717, 1779, + 2089, 1809, 1606, + 1937, 1908, 1163, + 1595, 2015, 0, + 0, 2127, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2497, 1348, 2208, + 2497, 1351, 2207, + 2496, 1355, 2206, + 2495, 1360, 2205, + 2494, 1367, 2203, + 2492, 1376, 2201, + 2490, 1387, 2198, + 2487, 1402, 2193, + 2483, 1422, 2188, + 2478, 1447, 2180, + 2471, 1478, 2169, + 2461, 1517, 2155, + 2447, 1564, 2135, + 2429, 1620, 2106, + 2402, 1686, 2065, + 2365, 1761, 2004, + 2309, 1845, 1906, + 2222, 1938, 1729, + 2071, 2038, 1272, + 1731, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2630, 1470, 2338, + 2630, 1472, 2338, + 2629, 1475, 2337, + 2629, 1479, 2336, + 2628, 1484, 2335, + 2627, 1491, 2333, + 2625, 1500, 2331, + 2623, 1512, 2327, + 2620, 1527, 2323, + 2616, 1547, 2317, + 2611, 1572, 2310, + 2603, 1604, 2299, + 2594, 1643, 2284, + 2580, 1691, 2264, + 2561, 1748, 2236, + 2535, 1814, 2194, + 2498, 1890, 2132, + 2442, 1974, 2033, + 2355, 2068, 1855, + 2205, 2168, 1386, + 1867, 2276, 0, + 0, 2388, 0, + 0, 2505, 0, + 0, 2625, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2763, 1594, 2469, + 2763, 1595, 2469, + 2762, 1598, 2468, + 2762, 1601, 2467, + 2761, 1605, 2466, + 2760, 1610, 2465, + 2759, 1617, 2463, + 2757, 1626, 2461, + 2755, 1638, 2458, + 2752, 1654, 2454, + 2748, 1674, 2448, + 2743, 1699, 2440, + 2736, 1731, 2429, + 2726, 1771, 2415, + 2713, 1819, 2394, + 2694, 1876, 2366, + 2668, 1943, 2324, + 2630, 2019, 2262, + 2575, 2104, 2162, + 2488, 2198, 1982, + 2338, 2299, 1505, + 2001, 2407, 0, + 0, 2519, 0, + 0, 2637, 0, + 0, 2757, 0, + 0, 2880, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2896, 1720, 2600, + 2895, 1721, 2600, + 2895, 1723, 2600, + 2895, 1725, 2599, + 2894, 1728, 2598, + 2894, 1732, 2597, + 2893, 1738, 2596, + 2891, 1745, 2594, + 2890, 1754, 2592, + 2888, 1766, 2589, + 2885, 1782, 2584, + 2881, 1802, 2579, + 2876, 1828, 2571, + 2868, 1860, 2560, + 2859, 1900, 2545, + 2845, 1948, 2525, + 2827, 2006, 2496, + 2800, 2073, 2454, + 2763, 2149, 2392, + 2708, 2235, 2292, + 2621, 2329, 2111, + 2471, 2430, 1626, + 2135, 2538, 0, + 0, 2651, 0, + 0, 2768, 0, + 0, 2889, 0, + 0, 3012, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1847, 2732, + 3028, 1848, 2731, + 3028, 1850, 2731, + 3027, 1851, 2731, + 3027, 1854, 2730, + 3027, 1857, 2729, + 3026, 1861, 2728, + 3025, 1866, 2727, + 3024, 1873, 2725, + 3022, 1883, 2723, + 3020, 1895, 2720, + 3017, 1911, 2716, + 3013, 1931, 2710, + 3008, 1957, 2702, + 3001, 1989, 2691, + 2991, 2030, 2676, + 2978, 2078, 2656, + 2959, 2136, 2627, + 2933, 2203, 2585, + 2895, 2280, 2522, + 2840, 2366, 2422, + 2753, 2460, 2240, + 2604, 2562, 1750, + 2268, 2670, 0, + 0, 2783, 0, + 0, 2900, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1976, 2863, + 3160, 1977, 2863, + 3160, 1978, 2863, + 3160, 1979, 2862, + 3160, 1981, 2862, + 3159, 1983, 2862, + 3159, 1986, 2861, + 3158, 1990, 2860, + 3157, 1996, 2858, + 3156, 2003, 2857, + 3154, 2012, 2854, + 3152, 2025, 2851, + 3149, 2040, 2847, + 3146, 2061, 2841, + 3140, 2087, 2833, + 3133, 2120, 2822, + 3123, 2160, 2808, + 3110, 2209, 2787, + 3091, 2267, 2758, + 3065, 2334, 2716, + 3028, 2411, 2653, + 2972, 2497, 2553, + 2886, 2592, 2370, + 2736, 2693, 1876, + 2401, 2801, 0, + 0, 2914, 0, + 0, 3032, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3529, 0, + 0, 3657, 0, + 3293, 2105, 2995, + 3293, 2106, 2995, + 3293, 2107, 2995, + 3292, 2108, 2994, + 3292, 2109, 2994, + 3292, 2111, 2994, + 3292, 2113, 2993, + 3291, 2116, 2992, + 3290, 2120, 2991, + 3290, 2126, 2990, + 3288, 2133, 2988, + 3287, 2142, 2986, + 3285, 2155, 2983, + 3282, 2171, 2978, + 3278, 2191, 2973, + 3272, 2217, 2965, + 3265, 2250, 2954, + 3256, 2291, 2939, + 3242, 2339, 2919, + 3224, 2398, 2890, + 3197, 2465, 2848, + 3160, 2542, 2785, + 3105, 2629, 2684, + 3018, 2723, 2500, + 2869, 2825, 2004, + 2534, 2933, 0, + 0, 3046, 0, + 0, 3164, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3661, 0, + 3425, 2236, 3127, + 3425, 2236, 3127, + 3425, 2237, 3126, + 3425, 2237, 3126, + 3425, 2238, 3126, + 3424, 2240, 3126, + 3424, 2241, 3125, + 3424, 2244, 3125, + 3423, 2247, 3124, + 3423, 2251, 3123, + 3422, 2256, 3122, + 3421, 2264, 3120, + 3419, 2273, 3118, + 3417, 2286, 3114, + 3414, 2302, 3110, + 3410, 2322, 3104, + 3405, 2348, 3096, + 3397, 2381, 3086, + 3388, 2422, 3071, + 3374, 2471, 3050, + 3356, 2529, 3021, + 3330, 2597, 2979, + 3292, 2674, 2916, + 3237, 2760, 2815, + 3150, 2855, 2631, + 3001, 2957, 2132, + 2667, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3557, 2366, 3259, + 3557, 2367, 3258, + 3557, 2367, 3258, + 3557, 2367, 3258, + 3557, 2368, 3258, + 3557, 2369, 3258, + 3557, 2371, 3258, + 3556, 2372, 3257, + 3556, 2375, 3257, + 3555, 2378, 3256, + 3555, 2382, 3255, + 3554, 2387, 3254, + 3553, 2395, 3252, + 3551, 2404, 3249, + 3549, 2417, 3246, + 3546, 2433, 3242, + 3542, 2453, 3236, + 3537, 2480, 3228, + 3530, 2512, 3217, + 3520, 2553, 3203, + 3506, 2602, 3182, + 3488, 2660, 3153, + 3462, 2728, 3111, + 3424, 2806, 3048, + 3369, 2892, 2947, + 3283, 2987, 2763, + 3133, 3089, 2262, + 2799, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3548, 0, + 0, 3672, 0, + 3689, 2497, 3390, + 3689, 2497, 3390, + 3689, 2498, 3390, + 3689, 2498, 3390, + 3689, 2499, 3390, + 3689, 2499, 3390, + 3689, 2500, 3390, + 3689, 2502, 3389, + 3688, 2504, 3389, + 3688, 2506, 3388, + 3688, 2509, 3388, + 3687, 2513, 3387, + 3686, 2519, 3385, + 3685, 2526, 3384, + 3683, 2535, 3381, + 3681, 2548, 3378, + 3678, 2564, 3374, + 3674, 2585, 3368, + 3669, 2611, 3360, + 3662, 2644, 3349, + 3652, 2684, 3334, + 3639, 2734, 3314, + 3620, 2792, 3285, + 3594, 2860, 3243, + 3557, 2937, 3179, + 3501, 3024, 3078, + 3415, 3119, 2894, + 3266, 3220, 2392, + 2932, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3680, 0, + 3822, 2628, 3522, + 3822, 2629, 3522, + 3822, 2629, 3522, + 3822, 2629, 3522, + 3821, 2630, 3522, + 3821, 2630, 3522, + 3821, 2631, 3522, + 3821, 2632, 3522, + 3821, 2633, 3521, + 3821, 2635, 3521, + 3820, 2637, 3520, + 3820, 2641, 3520, + 3819, 2645, 3519, + 3818, 2650, 3517, + 3817, 2657, 3516, + 3815, 2667, 3513, + 3813, 2679, 3510, + 3810, 2696, 3506, + 3806, 2716, 3500, + 3801, 2743, 3492, + 3794, 2775, 3481, + 3784, 2816, 3466, + 3771, 2865, 3446, + 3752, 2924, 3417, + 3726, 2992, 3375, + 3689, 3069, 3311, + 3633, 3156, 3210, + 3547, 3250, 3026, + 3398, 3352, 2523, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2760, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3954, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3654, + 3953, 2765, 3653, + 3953, 2767, 3653, + 3952, 2769, 3652, + 3952, 2772, 3652, + 3951, 2776, 3651, + 3950, 2782, 3649, + 3949, 2789, 3648, + 3948, 2799, 3645, + 3945, 2811, 3642, + 3942, 2827, 3638, + 3939, 2848, 3632, + 3933, 2874, 3624, + 3926, 2907, 3613, + 3916, 2948, 3598, + 3903, 2997, 3578, + 3884, 3056, 3549, + 3858, 3124, 3506, + 3821, 3201, 3443, + 3766, 3288, 3342, + 3679, 3382, 3157, + 3530, 3484, 2654, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2897, 3785, + 4085, 2898, 3785, + 4085, 2901, 3784, + 4084, 2904, 3784, + 4083, 2908, 3783, + 4082, 2914, 3781, + 4081, 2921, 3780, + 4080, 2930, 3777, + 4077, 2943, 3774, + 4075, 2959, 3770, + 4071, 2980, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3080, 3730, + 4035, 3129, 3710, + 4017, 3188, 3681, + 3990, 3256, 3638, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3514, 3289, + 3662, 3616, 2785, + 3329, 3725, 0, + 4095, 3023, 3919, + 4095, 3023, 3918, + 4095, 3023, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3917, + 4095, 3030, 3917, + 4095, 3033, 3916, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3045, 3913, + 4095, 3053, 3912, + 4095, 3062, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3112, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3862, + 4095, 3261, 3842, + 4095, 3319, 3813, + 4095, 3388, 3770, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3944, 3646, 3421, + 3794, 3748, 2916, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4049, + 4095, 3162, 4049, + 4095, 3164, 4048, + 4095, 3168, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3185, 4044, + 4095, 3194, 4041, + 4095, 3207, 4038, + 4095, 3223, 4034, + 4095, 3244, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3994, + 4095, 3393, 3974, + 4095, 3451, 3945, + 4095, 3520, 3902, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3778, 3553, + 0, 387, 587, + 0, 410, 561, + 0, 440, 523, + 0, 477, 468, + 0, 523, 381, + 0, 577, 231, + 0, 641, 0, + 0, 714, 0, + 0, 797, 0, + 0, 888, 0, + 0, 987, 0, + 0, 1093, 0, + 0, 1204, 0, + 0, 1320, 0, + 0, 1439, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 395, 624, + 0, 418, 600, + 0, 448, 565, + 0, 484, 515, + 0, 529, 437, + 0, 583, 307, + 0, 646, 42, + 0, 718, 0, + 0, 800, 0, + 0, 891, 0, + 0, 989, 0, + 0, 1094, 0, + 0, 1205, 0, + 0, 1321, 0, + 0, 1440, 0, + 0, 1562, 0, + 0, 1687, 0, + 0, 1813, 0, + 0, 1941, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 406, 669, + 0, 428, 647, + 0, 457, 616, + 0, 493, 571, + 0, 537, 503, + 0, 590, 393, + 0, 652, 186, + 0, 724, 0, + 0, 805, 0, + 0, 894, 0, + 0, 992, 0, + 0, 1097, 0, + 0, 1207, 0, + 0, 1322, 0, + 0, 1441, 0, + 0, 1563, 0, + 0, 1688, 0, + 0, 1814, 0, + 0, 1942, 0, + 0, 2070, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 247, 420, 722, + 170, 442, 703, + 41, 470, 676, + 0, 505, 637, + 0, 547, 579, + 0, 599, 487, + 0, 660, 327, + 0, 731, 0, + 0, 811, 0, + 0, 899, 0, + 0, 996, 0, + 0, 1100, 0, + 0, 1210, 0, + 0, 1324, 0, + 0, 1443, 0, + 0, 1564, 0, + 0, 1688, 0, + 0, 1815, 0, + 0, 1942, 0, + 0, 2071, 0, + 0, 2200, 0, + 0, 2330, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2986, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 519, 438, 786, + 479, 459, 769, + 418, 486, 745, + 322, 520, 712, + 149, 561, 663, + 0, 611, 589, + 0, 671, 465, + 0, 740, 219, + 0, 818, 0, + 0, 906, 0, + 0, 1001, 0, + 0, 1104, 0, + 0, 1213, 0, + 0, 1327, 0, + 0, 1445, 0, + 0, 1566, 0, + 0, 1690, 0, + 0, 1815, 0, + 0, 1943, 0, + 0, 2071, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2461, 0, + 0, 2592, 0, + 0, 2723, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 734, 461, 858, + 709, 481, 844, + 673, 507, 824, + 621, 539, 797, + 540, 579, 756, + 402, 627, 697, + 110, 685, 602, + 0, 752, 434, + 0, 828, 18, + 0, 914, 0, + 0, 1008, 0, + 0, 1109, 0, + 0, 1217, 0, + 0, 1330, 0, + 0, 1447, 0, + 0, 1568, 0, + 0, 1691, 0, + 0, 1817, 0, + 0, 1944, 0, + 0, 2072, 0, + 0, 2201, 0, + 0, 2331, 0, + 0, 2462, 0, + 0, 2592, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 919, 490, 940, + 903, 509, 929, + 880, 533, 912, + 847, 563, 889, + 800, 601, 857, + 727, 647, 810, + 607, 703, 738, + 373, 767, 619, + 0, 842, 388, + 0, 925, 0, + 0, 1017, 0, + 0, 1116, 0, + 0, 1223, 0, + 0, 1334, 0, + 0, 1451, 0, + 0, 1570, 0, + 0, 1693, 0, + 0, 1818, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1087, 526, 1031, + 1076, 544, 1021, + 1061, 566, 1008, + 1039, 594, 990, + 1008, 630, 964, + 964, 673, 927, + 896, 726, 872, + 787, 787, 787, + 582, 859, 641, + 0, 939, 318, + 0, 1029, 0, + 0, 1126, 0, + 0, 1230, 0, + 0, 1340, 0, + 0, 1455, 0, + 0, 1574, 0, + 0, 1696, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2203, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1245, 570, 1130, + 1237, 586, 1122, + 1226, 607, 1111, + 1211, 633, 1097, + 1190, 665, 1076, + 1161, 706, 1048, + 1118, 755, 1006, + 1055, 813, 945, + 952, 880, 846, + 765, 958, 669, + 245, 1044, 205, + 0, 1138, 0, + 0, 1240, 0, + 0, 1348, 0, + 0, 1461, 0, + 0, 1578, 0, + 0, 1699, 0, + 0, 1823, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1395, 623, 1235, + 1389, 638, 1229, + 1381, 656, 1220, + 1371, 679, 1209, + 1356, 709, 1193, + 1336, 746, 1171, + 1308, 791, 1140, + 1267, 845, 1095, + 1205, 908, 1026, + 1107, 981, 915, + 932, 1063, 703, + 477, 1154, 0, + 0, 1253, 0, + 0, 1358, 0, + 0, 1469, 0, + 0, 1585, 0, + 0, 1704, 0, + 0, 1826, 0, + 0, 1951, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1540, 686, 1346, + 1536, 698, 1341, + 1530, 715, 1334, + 1522, 735, 1326, + 1512, 762, 1313, + 1498, 794, 1297, + 1478, 835, 1273, + 1450, 884, 1240, + 1410, 943, 1191, + 1351, 1011, 1116, + 1256, 1088, 993, + 1088, 1174, 745, + 672, 1269, 0, + 0, 1371, 0, + 0, 1479, 0, + 0, 1593, 0, + 0, 1710, 0, + 0, 1831, 0, + 0, 1955, 0, + 0, 2080, 0, + 0, 2207, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1681, 758, 1461, + 1678, 769, 1458, + 1674, 783, 1453, + 1669, 801, 1446, + 1661, 823, 1436, + 1651, 852, 1424, + 1637, 888, 1406, + 1618, 932, 1381, + 1590, 985, 1346, + 1551, 1047, 1295, + 1492, 1119, 1215, + 1400, 1200, 1079, + 1237, 1290, 797, + 846, 1388, 0, + 0, 1493, 0, + 0, 1603, 0, + 0, 1718, 0, + 0, 1837, 0, + 0, 1959, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1820, 840, 1581, + 1818, 849, 1578, + 1815, 860, 1574, + 1811, 875, 1569, + 1806, 895, 1562, + 1798, 920, 1552, + 1788, 951, 1539, + 1774, 989, 1521, + 1755, 1036, 1495, + 1728, 1092, 1458, + 1689, 1158, 1404, + 1632, 1233, 1319, + 1541, 1317, 1174, + 1382, 1410, 857, + 1007, 1510, 0, + 0, 1617, 0, + 0, 1729, 0, + 0, 1846, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1958, 930, 1703, + 1956, 937, 1701, + 1954, 947, 1698, + 1951, 959, 1694, + 1947, 976, 1689, + 1941, 996, 1681, + 1934, 1023, 1671, + 1924, 1056, 1658, + 1910, 1097, 1639, + 1891, 1146, 1613, + 1865, 1205, 1575, + 1826, 1273, 1518, + 1769, 1351, 1430, + 1679, 1437, 1277, + 1523, 1532, 927, + 1160, 1635, 0, + 0, 1743, 0, + 0, 1856, 0, + 0, 1974, 0, + 0, 2095, 0, + 0, 2219, 0, + 0, 2344, 0, + 0, 2471, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2094, 1028, 1828, + 2092, 1034, 1826, + 2091, 1042, 1824, + 2088, 1052, 1821, + 2086, 1065, 1817, + 2082, 1082, 1811, + 2076, 1104, 1804, + 2069, 1132, 1794, + 2059, 1167, 1780, + 2045, 1210, 1761, + 2026, 1261, 1733, + 2000, 1322, 1695, + 1962, 1392, 1637, + 1905, 1472, 1545, + 1816, 1561, 1385, + 1662, 1657, 1007, + 1307, 1761, 0, + 0, 1870, 0, + 0, 1985, 0, + 0, 2103, 0, + 0, 2225, 0, + 0, 2349, 0, + 0, 2475, 0, + 0, 2603, 0, + 0, 2731, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2228, 1133, 1954, + 2228, 1138, 1953, + 2226, 1144, 1951, + 2225, 1152, 1949, + 2223, 1163, 1946, + 2220, 1176, 1942, + 2216, 1194, 1936, + 2210, 1217, 1929, + 2203, 1246, 1918, + 2193, 1282, 1904, + 2180, 1327, 1885, + 2161, 1380, 1857, + 2134, 1442, 1817, + 2096, 1514, 1758, + 2040, 1596, 1665, + 1952, 1686, 1499, + 1799, 1784, 1095, + 1449, 1888, 0, + 0, 1999, 0, + 0, 2114, 0, + 0, 2233, 0, + 0, 2356, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2363, 1243, 2082, + 2362, 1247, 2081, + 2361, 1252, 2080, + 2360, 1258, 2078, + 2358, 1267, 2076, + 2356, 1278, 2073, + 2353, 1292, 2068, + 2349, 1311, 2063, + 2344, 1335, 2055, + 2337, 1365, 2045, + 2327, 1402, 2031, + 2313, 1447, 2011, + 2294, 1502, 1983, + 2268, 1565, 1942, + 2230, 1639, 1882, + 2174, 1721, 1787, + 2087, 1813, 1617, + 1934, 1912, 1191, + 1589, 2017, 0, + 0, 2129, 0, + 0, 2244, 0, + 0, 2364, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2496, 1359, 2211, + 2496, 1362, 2210, + 2495, 1365, 2209, + 2494, 1370, 2208, + 2493, 1377, 2206, + 2491, 1386, 2204, + 2489, 1397, 2201, + 2486, 1412, 2196, + 2482, 1431, 2191, + 2477, 1455, 2183, + 2470, 1486, 2173, + 2460, 1524, 2158, + 2446, 1570, 2138, + 2428, 1626, 2110, + 2402, 1691, 2069, + 2364, 1765, 2008, + 2308, 1849, 1911, + 2221, 1941, 1738, + 2069, 2041, 1295, + 1727, 2147, 0, + 0, 2259, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 2630, 1478, 2340, + 2629, 1480, 2340, + 2629, 1483, 2339, + 2628, 1487, 2338, + 2627, 1492, 2337, + 2626, 1499, 2335, + 2624, 1508, 2333, + 2622, 1519, 2330, + 2619, 1535, 2326, + 2615, 1554, 2320, + 2610, 1579, 2312, + 2603, 1610, 2302, + 2593, 1649, 2287, + 2579, 1696, 2267, + 2561, 1752, 2238, + 2535, 1818, 2197, + 2497, 1893, 2136, + 2441, 1977, 2038, + 2354, 2070, 1861, + 2203, 2170, 1404, + 1864, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2763, 1600, 2471, + 2762, 1602, 2470, + 2762, 1604, 2470, + 2761, 1607, 2469, + 2761, 1611, 2468, + 2760, 1616, 2467, + 2759, 1623, 2465, + 2757, 1632, 2463, + 2755, 1644, 2460, + 2752, 1659, 2455, + 2748, 1679, 2450, + 2743, 1704, 2442, + 2735, 1736, 2431, + 2726, 1775, 2417, + 2712, 1823, 2396, + 2694, 1880, 2368, + 2667, 1946, 2326, + 2630, 2022, 2264, + 2574, 2107, 2165, + 2487, 2200, 1987, + 2337, 2301, 1518, + 1999, 2408, 0, + 0, 2520, 0, + 0, 2637, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 2895, 1725, 2601, + 2895, 1726, 2601, + 2895, 1728, 2601, + 2894, 1730, 2600, + 2894, 1733, 2599, + 2893, 1737, 2599, + 2892, 1742, 2597, + 2891, 1749, 2595, + 2890, 1758, 2593, + 2887, 1770, 2590, + 2884, 1786, 2586, + 2881, 1806, 2580, + 2875, 1832, 2572, + 2868, 1864, 2561, + 2858, 1903, 2547, + 2845, 1951, 2526, + 2826, 2008, 2498, + 2800, 2075, 2456, + 2763, 2151, 2394, + 2707, 2237, 2294, + 2620, 2330, 2114, + 2470, 2431, 1637, + 2133, 2539, 0, + 0, 2652, 0, + 0, 2769, 0, + 0, 2889, 0, + 0, 3012, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1851, 2733, + 3028, 1852, 2732, + 3027, 1853, 2732, + 3027, 1855, 2732, + 3027, 1857, 2731, + 3026, 1860, 2730, + 3026, 1864, 2729, + 3025, 1870, 2728, + 3024, 1877, 2726, + 3022, 1886, 2724, + 3020, 1898, 2721, + 3017, 1914, 2717, + 3013, 1934, 2711, + 3008, 1960, 2703, + 3000, 1992, 2692, + 2991, 2032, 2677, + 2977, 2080, 2657, + 2959, 2138, 2628, + 2933, 2205, 2586, + 2895, 2282, 2524, + 2840, 2367, 2424, + 2753, 2461, 2243, + 2603, 2562, 1758, + 2267, 2670, 0, + 0, 2783, 0, + 0, 2900, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1979, 2864, + 3160, 1979, 2864, + 3160, 1980, 2863, + 3160, 1982, 2863, + 3160, 1983, 2863, + 3159, 1986, 2862, + 3159, 1989, 2861, + 3158, 1993, 2861, + 3157, 1998, 2859, + 3156, 2005, 2857, + 3154, 2015, 2855, + 3152, 2027, 2852, + 3149, 2043, 2848, + 3145, 2063, 2842, + 3140, 2089, 2834, + 3133, 2122, 2823, + 3123, 2162, 2809, + 3110, 2210, 2788, + 3091, 2268, 2759, + 3065, 2335, 2717, + 3028, 2412, 2654, + 2972, 2498, 2554, + 2886, 2592, 2372, + 2736, 2694, 1882, + 2401, 2802, 0, + 0, 2915, 0, + 0, 3032, 0, + 0, 3153, 0, + 0, 3276, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3293, 2107, 2995, + 3293, 2108, 2995, + 3292, 2109, 2995, + 3292, 2110, 2995, + 3292, 2111, 2995, + 3292, 2113, 2994, + 3291, 2115, 2994, + 3291, 2118, 2993, + 3290, 2122, 2992, + 3289, 2128, 2991, + 3288, 2135, 2989, + 3287, 2144, 2986, + 3284, 2157, 2983, + 3282, 2173, 2979, + 3278, 2193, 2973, + 3272, 2219, 2965, + 3265, 2252, 2955, + 3255, 2292, 2940, + 3242, 2341, 2919, + 3223, 2399, 2890, + 3197, 2466, 2848, + 3160, 2543, 2785, + 3104, 2629, 2685, + 3018, 2724, 2502, + 2868, 2825, 2008, + 2534, 2933, 0, + 0, 3046, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 3425, 2237, 3127, + 3425, 2238, 3127, + 3425, 2238, 3127, + 3425, 2239, 3127, + 3425, 2240, 3126, + 3424, 2241, 3126, + 3424, 2243, 3126, + 3424, 2245, 3125, + 3423, 2248, 3124, + 3423, 2252, 3123, + 3422, 2258, 3122, + 3420, 2265, 3120, + 3419, 2275, 3118, + 3417, 2287, 3115, + 3414, 2303, 3111, + 3410, 2323, 3105, + 3405, 2350, 3097, + 3397, 2382, 3086, + 3388, 2423, 3071, + 3374, 2472, 3051, + 3356, 2530, 3022, + 3330, 2597, 2980, + 3292, 2675, 2917, + 3237, 2761, 2816, + 3150, 2855, 2633, + 3001, 2957, 2136, + 2666, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2367, 3259, + 3557, 2368, 3259, + 3557, 2368, 3259, + 3557, 2369, 3259, + 3557, 2369, 3258, + 3557, 2370, 3258, + 3557, 2372, 3258, + 3556, 2373, 3257, + 3556, 2376, 3257, + 3555, 2379, 3256, + 3555, 2383, 3255, + 3554, 2389, 3254, + 3553, 2396, 3252, + 3551, 2405, 3250, + 3549, 2418, 3247, + 3546, 2434, 3242, + 3542, 2454, 3236, + 3537, 2480, 3229, + 3530, 2513, 3218, + 3520, 2554, 3203, + 3506, 2603, 3182, + 3488, 2661, 3153, + 3462, 2729, 3111, + 3424, 2806, 3048, + 3369, 2892, 2947, + 3283, 2987, 2763, + 3133, 3089, 2264, + 2799, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3548, 0, + 0, 3672, 0, + 3689, 2498, 3391, + 3689, 2498, 3391, + 3689, 2499, 3391, + 3689, 2499, 3390, + 3689, 2500, 3390, + 3689, 2500, 3390, + 3689, 2501, 3390, + 3689, 2503, 3390, + 3688, 2504, 3389, + 3688, 2507, 3389, + 3688, 2510, 3388, + 3687, 2514, 3387, + 3686, 2520, 3386, + 3685, 2527, 3384, + 3683, 2536, 3382, + 3681, 2549, 3378, + 3678, 2565, 3374, + 3674, 2585, 3368, + 3669, 2612, 3360, + 3662, 2644, 3350, + 3652, 2685, 3335, + 3639, 2734, 3314, + 3620, 2792, 3285, + 3594, 2860, 3243, + 3557, 2938, 3180, + 3501, 3024, 3079, + 3415, 3119, 2895, + 3265, 3221, 2394, + 2932, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3681, 0, + 3822, 2629, 3523, + 3822, 2629, 3523, + 3822, 2630, 3523, + 3822, 2630, 3522, + 3821, 2630, 3522, + 3821, 2631, 3522, + 3821, 2632, 3522, + 3821, 2633, 3522, + 3821, 2634, 3522, + 3821, 2636, 3521, + 3820, 2638, 3521, + 3820, 2641, 3520, + 3819, 2645, 3519, + 3818, 2651, 3518, + 3817, 2658, 3516, + 3815, 2668, 3513, + 3813, 2680, 3510, + 3810, 2696, 3506, + 3806, 2717, 3500, + 3801, 2743, 3492, + 3794, 2776, 3481, + 3784, 2817, 3467, + 3771, 2866, 3446, + 3752, 2924, 3417, + 3726, 2992, 3375, + 3689, 3069, 3312, + 3633, 3156, 3210, + 3547, 3251, 3026, + 3398, 3353, 2524, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2760, 3655, + 3954, 2761, 3655, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3954, 2761, 3654, + 3954, 2762, 3654, + 3953, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3654, + 3953, 2765, 3653, + 3953, 2767, 3653, + 3952, 2769, 3652, + 3952, 2773, 3652, + 3951, 2777, 3651, + 3950, 2782, 3649, + 3949, 2790, 3648, + 3947, 2799, 3645, + 3945, 2812, 3642, + 3942, 2828, 3638, + 3939, 2848, 3632, + 3933, 2875, 3624, + 3926, 2908, 3613, + 3916, 2948, 3598, + 3903, 2997, 3578, + 3884, 3056, 3549, + 3858, 3124, 3507, + 3821, 3201, 3443, + 3766, 3288, 3342, + 3679, 3383, 3158, + 3530, 3485, 2655, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2892, 3787, + 4086, 2892, 3787, + 4086, 2892, 3787, + 4086, 2892, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4086, 2895, 3786, + 4085, 2896, 3786, + 4085, 2897, 3785, + 4085, 2899, 3785, + 4084, 2901, 3784, + 4084, 2904, 3784, + 4083, 2908, 3783, + 4082, 2914, 3781, + 4081, 2921, 3780, + 4080, 2931, 3777, + 4077, 2943, 3774, + 4075, 2959, 3770, + 4071, 2980, 3764, + 4065, 3006, 3756, + 4058, 3039, 3745, + 4048, 3080, 3730, + 4035, 3129, 3710, + 4016, 3188, 3681, + 3990, 3256, 3639, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3515, 3289, + 3662, 3617, 2786, + 3329, 3725, 0, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3918, + 4095, 3024, 3918, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3029, 3917, + 4095, 3030, 3917, + 4095, 3033, 3916, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3046, 3913, + 4095, 3053, 3912, + 4095, 3062, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3112, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3862, + 4095, 3261, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3943, 3647, 3421, + 3794, 3749, 2917, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3155, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4050, + 4095, 3156, 4050, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3161, 4049, + 4095, 3162, 4049, + 4095, 3165, 4048, + 4095, 3168, 4048, + 4095, 3172, 4047, + 4095, 3177, 4045, + 4095, 3185, 4044, + 4095, 3194, 4041, + 4095, 3207, 4038, + 4095, 3223, 4034, + 4095, 3244, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3994, + 4095, 3393, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3779, 3553, + 0, 494, 709, + 0, 513, 690, + 0, 537, 662, + 0, 567, 621, + 0, 604, 561, + 0, 650, 466, + 0, 705, 295, + 0, 770, 0, + 0, 843, 0, + 0, 927, 0, + 0, 1018, 0, + 0, 1118, 0, + 0, 1223, 0, + 0, 1335, 0, + 0, 1451, 0, + 0, 1571, 0, + 0, 1693, 0, + 0, 1818, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 500, 738, + 0, 519, 719, + 0, 543, 693, + 0, 572, 655, + 0, 610, 600, + 0, 655, 513, + 0, 709, 363, + 0, 773, 25, + 0, 846, 0, + 0, 929, 0, + 0, 1020, 0, + 0, 1119, 0, + 0, 1225, 0, + 0, 1336, 0, + 0, 1452, 0, + 0, 1571, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1945, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 509, 773, + 0, 527, 756, + 0, 550, 732, + 0, 580, 697, + 0, 616, 647, + 0, 661, 569, + 0, 715, 440, + 0, 778, 174, + 0, 850, 0, + 0, 932, 0, + 0, 1023, 0, + 0, 1121, 0, + 0, 1227, 0, + 0, 1337, 0, + 0, 1453, 0, + 0, 1572, 0, + 0, 1694, 0, + 0, 1819, 0, + 0, 1946, 0, + 0, 2073, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 66, 520, 816, + 0, 538, 801, + 0, 561, 779, + 0, 589, 748, + 0, 625, 703, + 0, 669, 635, + 0, 722, 525, + 0, 784, 318, + 0, 856, 0, + 0, 937, 0, + 0, 1027, 0, + 0, 1124, 0, + 0, 1229, 0, + 0, 1339, 0, + 0, 1454, 0, + 0, 1573, 0, + 0, 1695, 0, + 0, 1820, 0, + 0, 1946, 0, + 0, 2074, 0, + 0, 2202, 0, + 0, 2332, 0, + 0, 2462, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3118, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 429, 534, 868, + 379, 552, 854, + 302, 574, 835, + 173, 602, 808, + 0, 637, 769, + 0, 680, 711, + 0, 731, 620, + 0, 792, 459, + 0, 863, 78, + 0, 943, 0, + 0, 1031, 0, + 0, 1128, 0, + 0, 1232, 0, + 0, 1342, 0, + 0, 1456, 0, + 0, 1575, 0, + 0, 1696, 0, + 0, 1821, 0, + 0, 1947, 0, + 0, 2074, 0, + 0, 2203, 0, + 0, 2332, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2855, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 680, 553, 930, + 652, 570, 918, + 611, 591, 901, + 550, 618, 878, + 454, 652, 844, + 281, 693, 796, + 0, 743, 721, + 0, 803, 597, + 0, 872, 351, + 0, 950, 0, + 0, 1038, 0, + 0, 1133, 0, + 0, 1236, 0, + 0, 1345, 0, + 0, 1459, 0, + 0, 1577, 0, + 0, 1698, 0, + 0, 1822, 0, + 0, 1948, 0, + 0, 2075, 0, + 0, 2203, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2593, 0, + 0, 2724, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 884, 577, 1001, + 866, 593, 990, + 841, 613, 976, + 806, 639, 956, + 753, 671, 929, + 672, 711, 889, + 534, 759, 829, + 243, 817, 734, + 0, 884, 566, + 0, 960, 150, + 0, 1046, 0, + 0, 1140, 0, + 0, 1241, 0, + 0, 1349, 0, + 0, 1462, 0, + 0, 1579, 0, + 0, 1700, 0, + 0, 1823, 0, + 0, 1949, 0, + 0, 2076, 0, + 0, 2204, 0, + 0, 2333, 0, + 0, 2463, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1063, 607, 1081, + 1051, 622, 1072, + 1035, 641, 1061, + 1012, 665, 1044, + 979, 696, 1022, + 932, 733, 989, + 859, 780, 942, + 739, 835, 870, + 505, 899, 751, + 0, 974, 520, + 0, 1057, 0, + 0, 1149, 0, + 0, 1249, 0, + 0, 1355, 0, + 0, 1466, 0, + 0, 1583, 0, + 0, 1702, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1228, 644, 1170, + 1219, 658, 1163, + 1208, 676, 1153, + 1193, 698, 1140, + 1171, 727, 1122, + 1140, 762, 1096, + 1096, 805, 1059, + 1029, 858, 1005, + 919, 919, 919, + 715, 991, 773, + 63, 1071, 450, + 0, 1161, 0, + 0, 1258, 0, + 0, 1362, 0, + 0, 1472, 0, + 0, 1587, 0, + 0, 1706, 0, + 0, 1828, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1383, 690, 1267, + 1377, 702, 1262, + 1369, 718, 1254, + 1358, 739, 1243, + 1343, 765, 1229, + 1322, 798, 1208, + 1293, 838, 1180, + 1250, 887, 1139, + 1187, 945, 1077, + 1084, 1013, 978, + 897, 1090, 801, + 377, 1176, 337, + 0, 1270, 0, + 0, 1372, 0, + 0, 1480, 0, + 0, 1593, 0, + 0, 1711, 0, + 0, 1831, 0, + 0, 1955, 0, + 0, 2080, 0, + 0, 2208, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1531, 745, 1371, + 1527, 756, 1367, + 1521, 770, 1361, + 1513, 788, 1352, + 1503, 812, 1341, + 1488, 841, 1325, + 1468, 878, 1303, + 1440, 923, 1272, + 1399, 977, 1227, + 1337, 1040, 1158, + 1239, 1113, 1047, + 1064, 1195, 835, + 609, 1286, 120, + 0, 1385, 0, + 0, 1490, 0, + 0, 1601, 0, + 0, 1717, 0, + 0, 1836, 0, + 0, 1958, 0, + 0, 2083, 0, + 0, 2210, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1675, 809, 1481, + 1672, 818, 1478, + 1668, 831, 1473, + 1662, 847, 1466, + 1655, 867, 1458, + 1644, 894, 1445, + 1630, 927, 1429, + 1610, 967, 1405, + 1582, 1016, 1372, + 1542, 1075, 1323, + 1483, 1143, 1249, + 1388, 1220, 1125, + 1220, 1307, 878, + 804, 1401, 0, + 0, 1503, 0, + 0, 1611, 0, + 0, 1725, 0, + 0, 1842, 0, + 0, 1963, 0, + 0, 2087, 0, + 0, 2212, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1816, 882, 1596, + 1813, 890, 1593, + 1810, 901, 1590, + 1806, 915, 1585, + 1801, 933, 1578, + 1793, 955, 1569, + 1783, 984, 1556, + 1769, 1020, 1538, + 1750, 1064, 1514, + 1722, 1117, 1478, + 1683, 1179, 1427, + 1625, 1251, 1347, + 1532, 1333, 1212, + 1369, 1422, 929, + 978, 1520, 0, + 0, 1625, 0, + 0, 1735, 0, + 0, 1850, 0, + 0, 1969, 0, + 0, 2092, 0, + 0, 2216, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1954, 965, 1715, + 1952, 972, 1713, + 1950, 981, 1710, + 1947, 992, 1706, + 1943, 1007, 1701, + 1938, 1027, 1694, + 1930, 1052, 1684, + 1920, 1083, 1671, + 1906, 1121, 1653, + 1887, 1168, 1627, + 1860, 1224, 1590, + 1821, 1290, 1536, + 1764, 1365, 1452, + 1673, 1449, 1307, + 1514, 1542, 989, + 1139, 1642, 0, + 0, 1749, 0, + 0, 1861, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 2091, 1056, 1837, + 2090, 1062, 1835, + 2088, 1069, 1833, + 2086, 1079, 1830, + 2083, 1091, 1826, + 2079, 1108, 1821, + 2073, 1129, 1813, + 2066, 1155, 1803, + 2056, 1188, 1790, + 2042, 1229, 1771, + 2023, 1278, 1745, + 1997, 1337, 1707, + 1958, 1405, 1650, + 1901, 1483, 1562, + 1812, 1570, 1409, + 1655, 1664, 1059, + 1292, 1767, 0, + 0, 1875, 0, + 0, 1988, 0, + 0, 2106, 0, + 0, 2227, 0, + 0, 2351, 0, + 0, 2476, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2227, 1156, 1961, + 2226, 1160, 1960, + 2224, 1166, 1958, + 2223, 1174, 1956, + 2221, 1184, 1953, + 2218, 1197, 1949, + 2214, 1214, 1943, + 2208, 1236, 1936, + 2201, 1264, 1926, + 2191, 1299, 1912, + 2177, 1342, 1893, + 2158, 1393, 1866, + 2132, 1454, 1827, + 2094, 1524, 1769, + 2037, 1604, 1678, + 1948, 1693, 1517, + 1794, 1789, 1139, + 1439, 1893, 0, + 0, 2002, 0, + 0, 2117, 0, + 0, 2235, 0, + 0, 2357, 0, + 0, 2481, 0, + 0, 2607, 0, + 0, 2735, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 2361, 1261, 2087, + 2361, 1265, 2086, + 2360, 1270, 2085, + 2358, 1276, 2083, + 2357, 1284, 2081, + 2355, 1295, 2078, + 2352, 1309, 2074, + 2348, 1327, 2068, + 2342, 1349, 2061, + 2335, 1378, 2050, + 2325, 1415, 2036, + 2312, 1459, 2017, + 2293, 1512, 1989, + 2266, 1574, 1949, + 2228, 1646, 1890, + 2172, 1728, 1797, + 2084, 1818, 1631, + 1931, 1916, 1227, + 1581, 2021, 0, + 0, 2131, 0, + 0, 2246, 0, + 0, 2365, 0, + 0, 2488, 0, + 0, 2612, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2495, 1373, 2215, + 2495, 1376, 2214, + 2494, 1379, 2213, + 2493, 1384, 2212, + 2492, 1391, 2210, + 2490, 1399, 2208, + 2488, 1410, 2205, + 2485, 1424, 2201, + 2481, 1443, 2195, + 2476, 1467, 2187, + 2469, 1497, 2177, + 2459, 1534, 2163, + 2445, 1579, 2143, + 2427, 1634, 2115, + 2400, 1698, 2074, + 2362, 1771, 2014, + 2306, 1854, 1919, + 2219, 1945, 1749, + 2066, 2044, 1323, + 1721, 2149, 0, + 0, 2261, 0, + 0, 2376, 0, + 0, 2496, 0, + 0, 2619, 0, + 0, 2743, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3649, 0, + 2629, 1489, 2343, + 2628, 1491, 2343, + 2628, 1494, 2342, + 2627, 1497, 2341, + 2626, 1503, 2340, + 2625, 1509, 2338, + 2623, 1518, 2336, + 2621, 1529, 2333, + 2618, 1544, 2329, + 2614, 1563, 2323, + 2609, 1588, 2315, + 2602, 1618, 2305, + 2592, 1656, 2290, + 2579, 1703, 2270, + 2560, 1758, 2242, + 2534, 1823, 2201, + 2496, 1897, 2140, + 2440, 1981, 2043, + 2353, 2073, 1870, + 2201, 2173, 1427, + 1859, 2279, 0, + 0, 2391, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2762, 1608, 2473, + 2762, 1610, 2473, + 2761, 1612, 2472, + 2761, 1615, 2471, + 2760, 1619, 2470, + 2759, 1624, 2469, + 2758, 1631, 2467, + 2756, 1640, 2465, + 2754, 1652, 2462, + 2751, 1667, 2458, + 2747, 1686, 2452, + 2742, 1711, 2444, + 2735, 1742, 2434, + 2725, 1781, 2419, + 2712, 1828, 2399, + 2693, 1884, 2370, + 2667, 1950, 2329, + 2629, 2025, 2268, + 2573, 2109, 2170, + 2486, 2202, 1993, + 2335, 2302, 1536, + 1996, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 2895, 1731, 2603, + 2895, 1732, 2603, + 2894, 1734, 2602, + 2894, 1736, 2602, + 2893, 1739, 2601, + 2893, 1743, 2600, + 2892, 1748, 2599, + 2891, 1755, 2597, + 2889, 1764, 2595, + 2887, 1776, 2592, + 2884, 1791, 2587, + 2880, 1811, 2582, + 2875, 1836, 2574, + 2868, 1868, 2563, + 2858, 1907, 2549, + 2844, 1955, 2528, + 2826, 2012, 2500, + 2800, 2078, 2458, + 2762, 2154, 2396, + 2706, 2239, 2298, + 2619, 2332, 2119, + 2469, 2433, 1651, + 2131, 2540, 0, + 0, 2652, 0, + 0, 2769, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3028, 1856, 2734, + 3027, 1857, 2734, + 3027, 1858, 2733, + 3027, 1860, 2733, + 3027, 1862, 2732, + 3026, 1865, 2732, + 3025, 1869, 2731, + 3024, 1874, 2729, + 3023, 1881, 2728, + 3022, 1890, 2725, + 3019, 1902, 2722, + 3017, 1918, 2718, + 3013, 1938, 2712, + 3007, 1964, 2704, + 3000, 1996, 2694, + 2990, 2035, 2679, + 2977, 2083, 2658, + 2958, 2140, 2630, + 2932, 2207, 2588, + 2895, 2283, 2526, + 2839, 2369, 2426, + 2752, 2462, 2246, + 2602, 2563, 1769, + 2265, 2671, 0, + 0, 2784, 0, + 0, 2901, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1982, 2865, + 3160, 1983, 2865, + 3160, 1984, 2864, + 3160, 1985, 2864, + 3159, 1987, 2864, + 3159, 1989, 2863, + 3158, 1992, 2862, + 3158, 1996, 2861, + 3157, 2002, 2860, + 3156, 2009, 2858, + 3154, 2018, 2856, + 3152, 2030, 2853, + 3149, 2046, 2849, + 3145, 2066, 2843, + 3140, 2092, 2835, + 3133, 2124, 2824, + 3123, 2164, 2810, + 3109, 2212, 2789, + 3091, 2270, 2760, + 3065, 2337, 2719, + 3027, 2414, 2656, + 2972, 2499, 2556, + 2885, 2593, 2375, + 2735, 2695, 1890, + 2399, 2802, 0, + 0, 2915, 0, + 0, 3032, 0, + 0, 3153, 0, + 0, 3276, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3292, 2110, 2996, + 3292, 2111, 2996, + 3292, 2111, 2996, + 3292, 2112, 2996, + 3292, 2114, 2995, + 3292, 2116, 2995, + 3291, 2118, 2994, + 3291, 2121, 2994, + 3290, 2125, 2993, + 3289, 2130, 2991, + 3288, 2138, 2990, + 3286, 2147, 2987, + 3284, 2159, 2984, + 3281, 2175, 2980, + 3277, 2195, 2974, + 3272, 2221, 2966, + 3265, 2254, 2955, + 3255, 2294, 2941, + 3242, 2342, 2920, + 3223, 2400, 2891, + 3197, 2467, 2849, + 3160, 2544, 2787, + 3104, 2630, 2686, + 3018, 2724, 2504, + 2868, 2826, 2015, + 2533, 2934, 0, + 0, 3047, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 3425, 2239, 3128, + 3425, 2240, 3127, + 3425, 2240, 3127, + 3425, 2241, 3127, + 3424, 2242, 3127, + 3424, 2243, 3127, + 3424, 2245, 3126, + 3424, 2247, 3126, + 3423, 2250, 3125, + 3422, 2254, 3124, + 3421, 2260, 3123, + 3420, 2267, 3121, + 3419, 2276, 3119, + 3417, 2289, 3115, + 3414, 2305, 3111, + 3410, 2325, 3105, + 3404, 2351, 3097, + 3397, 2384, 3087, + 3387, 2424, 3072, + 3374, 2473, 3051, + 3355, 2531, 3022, + 3329, 2598, 2980, + 3292, 2675, 2918, + 3237, 2761, 2817, + 3150, 2856, 2634, + 3000, 2957, 2141, + 2666, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2369, 3259, + 3557, 2369, 3259, + 3557, 2370, 3259, + 3557, 2370, 3259, + 3557, 2371, 3259, + 3557, 2372, 3259, + 3556, 2373, 3258, + 3556, 2375, 3258, + 3556, 2377, 3257, + 3555, 2380, 3257, + 3555, 2385, 3256, + 3554, 2390, 3254, + 3553, 2397, 3252, + 3551, 2407, 3250, + 3549, 2419, 3247, + 3546, 2435, 3243, + 3542, 2456, 3237, + 3537, 2482, 3229, + 3529, 2514, 3218, + 3520, 2555, 3203, + 3506, 2604, 3183, + 3488, 2662, 3154, + 3462, 2729, 3112, + 3424, 2807, 3049, + 3369, 2893, 2948, + 3282, 2987, 2765, + 3133, 3089, 2268, + 2799, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3689, 2499, 3391, + 3689, 2499, 3391, + 3689, 2500, 3391, + 3689, 2500, 3391, + 3689, 2501, 3391, + 3689, 2501, 3390, + 3689, 2502, 3390, + 3689, 2504, 3390, + 3688, 2506, 3390, + 3688, 2508, 3389, + 3687, 2511, 3388, + 3687, 2515, 3387, + 3686, 2521, 3386, + 3685, 2528, 3384, + 3683, 2537, 3382, + 3681, 2550, 3379, + 3678, 2566, 3374, + 3674, 2586, 3369, + 3669, 2613, 3361, + 3662, 2645, 3350, + 3652, 2686, 3335, + 3639, 2735, 3314, + 3620, 2793, 3285, + 3594, 2861, 3243, + 3556, 2938, 3180, + 3501, 3024, 3079, + 3415, 3119, 2896, + 3265, 3221, 2397, + 2931, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3681, 0, + 3822, 2630, 3523, + 3822, 2630, 3523, + 3821, 2630, 3523, + 3821, 2631, 3523, + 3821, 2631, 3523, + 3821, 2632, 3522, + 3821, 2632, 3522, + 3821, 2633, 3522, + 3821, 2635, 3522, + 3821, 2637, 3521, + 3820, 2639, 3521, + 3820, 2642, 3520, + 3819, 2646, 3519, + 3818, 2652, 3518, + 3817, 2659, 3516, + 3815, 2668, 3514, + 3813, 2681, 3510, + 3810, 2697, 3506, + 3806, 2717, 3500, + 3801, 2744, 3492, + 3794, 2777, 3482, + 3784, 2817, 3467, + 3771, 2866, 3446, + 3752, 2925, 3417, + 3726, 2992, 3375, + 3689, 3070, 3312, + 3633, 3156, 3211, + 3547, 3251, 3027, + 3398, 3353, 2526, + 3064, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2761, 3655, + 3954, 2761, 3655, + 3954, 2761, 3655, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2762, 3654, + 3953, 2763, 3654, + 3953, 2764, 3654, + 3953, 2765, 3654, + 3953, 2766, 3654, + 3953, 2768, 3653, + 3952, 2770, 3653, + 3952, 2773, 3652, + 3951, 2777, 3651, + 3950, 2783, 3650, + 3949, 2790, 3648, + 3947, 2800, 3645, + 3945, 2812, 3642, + 3942, 2828, 3638, + 3938, 2849, 3632, + 3933, 2875, 3624, + 3926, 2908, 3614, + 3916, 2949, 3599, + 3903, 2998, 3578, + 3884, 3056, 3549, + 3858, 3124, 3507, + 3821, 3202, 3444, + 3766, 3288, 3343, + 3679, 3383, 3158, + 3530, 3485, 2656, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2892, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3786, + 4086, 2894, 3786, + 4086, 2894, 3786, + 4085, 2895, 3786, + 4085, 2896, 3786, + 4085, 2897, 3786, + 4085, 2899, 3785, + 4084, 2902, 3785, + 4084, 2905, 3784, + 4083, 2909, 3783, + 4082, 2914, 3782, + 4081, 2922, 3780, + 4080, 2931, 3777, + 4077, 2944, 3774, + 4075, 2960, 3770, + 4071, 2980, 3764, + 4065, 3007, 3756, + 4058, 3040, 3745, + 4048, 3080, 3731, + 4035, 3130, 3710, + 4016, 3188, 3681, + 3990, 3256, 3639, + 3953, 3333, 3575, + 3898, 3420, 3474, + 3811, 3515, 3290, + 3662, 3617, 2787, + 3328, 3725, 0, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3024, 3919, + 4095, 3025, 3919, + 4095, 3025, 3918, + 4095, 3025, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3918, + 4095, 3029, 3918, + 4095, 3031, 3917, + 4095, 3033, 3917, + 4095, 3036, 3916, + 4095, 3040, 3915, + 4095, 3046, 3914, + 4095, 3053, 3912, + 4095, 3063, 3909, + 4095, 3075, 3906, + 4095, 3091, 3902, + 4095, 3112, 3896, + 4095, 3138, 3888, + 4095, 3171, 3877, + 4095, 3212, 3863, + 4095, 3261, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3465, 3707, + 4030, 3552, 3606, + 3943, 3647, 3422, + 3794, 3749, 2918, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3157, 4050, + 4095, 3157, 4050, + 4095, 3158, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3161, 4050, + 4095, 3163, 4049, + 4095, 3165, 4049, + 4095, 3168, 4048, + 4095, 3172, 4047, + 4095, 3178, 4046, + 4095, 3185, 4044, + 4095, 3195, 4041, + 4095, 3207, 4038, + 4095, 3223, 4034, + 4095, 3244, 4028, + 4095, 3270, 4020, + 4095, 3303, 4009, + 4095, 3344, 3995, + 4095, 3393, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3779, 3553, + 0, 606, 834, + 0, 621, 819, + 0, 640, 798, + 0, 664, 769, + 0, 695, 726, + 0, 733, 662, + 0, 779, 559, + 0, 834, 370, + 0, 899, 0, + 0, 973, 0, + 0, 1057, 0, + 0, 1149, 0, + 0, 1248, 0, + 0, 1355, 0, + 0, 1466, 0, + 0, 1583, 0, + 0, 1702, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3250, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 611, 856, + 0, 626, 842, + 0, 645, 822, + 0, 669, 794, + 0, 699, 753, + 0, 737, 693, + 0, 782, 598, + 0, 837, 427, + 0, 902, 2, + 0, 976, 0, + 0, 1059, 0, + 0, 1150, 0, + 0, 1250, 0, + 0, 1356, 0, + 0, 1467, 0, + 0, 1583, 0, + 0, 1703, 0, + 0, 1825, 0, + 0, 1950, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 618, 883, + 0, 632, 870, + 0, 651, 851, + 0, 675, 825, + 0, 705, 788, + 0, 742, 732, + 0, 787, 645, + 0, 841, 495, + 0, 905, 157, + 0, 979, 0, + 0, 1061, 0, + 0, 1152, 0, + 0, 1251, 0, + 0, 1357, 0, + 0, 1468, 0, + 0, 1584, 0, + 0, 1703, 0, + 0, 1826, 0, + 0, 1951, 0, + 0, 2077, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 627, 918, + 0, 641, 905, + 0, 659, 888, + 0, 682, 864, + 0, 712, 829, + 0, 748, 779, + 0, 793, 702, + 0, 847, 572, + 0, 910, 306, + 0, 983, 0, + 0, 1064, 0, + 0, 1155, 0, + 0, 1253, 0, + 0, 1359, 0, + 0, 1469, 0, + 0, 1585, 0, + 0, 1704, 0, + 0, 1827, 0, + 0, 1951, 0, + 0, 2078, 0, + 0, 2205, 0, + 0, 2334, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 271, 638, 960, + 198, 652, 948, + 78, 670, 933, + 0, 693, 911, + 0, 721, 880, + 0, 757, 835, + 0, 801, 768, + 0, 854, 657, + 0, 916, 450, + 0, 988, 0, + 0, 1069, 0, + 0, 1159, 0, + 0, 1256, 0, + 0, 1361, 0, + 0, 1471, 0, + 0, 1586, 0, + 0, 1705, 0, + 0, 1827, 0, + 0, 1952, 0, + 0, 2078, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2594, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2987, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 595, 653, 1011, + 561, 667, 1000, + 511, 684, 986, + 434, 706, 967, + 305, 734, 940, + 43, 769, 901, + 0, 812, 843, + 0, 863, 752, + 0, 924, 591, + 0, 995, 210, + 0, 1075, 0, + 0, 1164, 0, + 0, 1260, 0, + 0, 1364, 0, + 0, 1474, 0, + 0, 1588, 0, + 0, 1707, 0, + 0, 1829, 0, + 0, 1953, 0, + 0, 2079, 0, + 0, 2206, 0, + 0, 2335, 0, + 0, 2464, 0, + 0, 2595, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 832, 672, 1071, + 812, 685, 1062, + 784, 702, 1050, + 743, 723, 1033, + 682, 750, 1010, + 586, 784, 976, + 413, 825, 928, + 0, 875, 853, + 0, 935, 729, + 0, 1004, 483, + 0, 1082, 0, + 0, 1170, 0, + 0, 1265, 0, + 0, 1368, 0, + 0, 1477, 0, + 0, 1591, 0, + 0, 1709, 0, + 0, 1830, 0, + 0, 1954, 0, + 0, 2080, 0, + 0, 2207, 0, + 0, 2335, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2725, 0, + 0, 2856, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3382, 0, + 0, 3514, 0, + 0, 3646, 0, + 1029, 697, 1140, + 1016, 709, 1133, + 998, 725, 1122, + 973, 745, 1108, + 938, 771, 1089, + 885, 803, 1061, + 804, 843, 1021, + 666, 891, 961, + 375, 949, 866, + 0, 1016, 698, + 0, 1093, 282, + 0, 1178, 0, + 0, 1272, 0, + 0, 1374, 0, + 0, 1481, 0, + 0, 1594, 0, + 0, 1711, 0, + 0, 1832, 0, + 0, 1955, 0, + 0, 2081, 0, + 0, 2208, 0, + 0, 2336, 0, + 0, 2465, 0, + 0, 2595, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1204, 728, 1220, + 1195, 739, 1213, + 1183, 754, 1205, + 1167, 773, 1193, + 1144, 797, 1176, + 1111, 828, 1154, + 1064, 866, 1121, + 991, 912, 1074, + 872, 967, 1002, + 637, 1032, 883, + 0, 1106, 652, + 0, 1189, 0, + 0, 1281, 0, + 0, 1381, 0, + 0, 1487, 0, + 0, 1599, 0, + 0, 1715, 0, + 0, 1835, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1366, 766, 1308, + 1360, 777, 1302, + 1352, 790, 1295, + 1340, 808, 1286, + 1325, 830, 1272, + 1303, 859, 1254, + 1272, 894, 1228, + 1228, 938, 1191, + 1161, 990, 1137, + 1052, 1052, 1052, + 847, 1123, 905, + 195, 1203, 583, + 0, 1293, 0, + 0, 1390, 0, + 0, 1494, 0, + 0, 1604, 0, + 0, 1719, 0, + 0, 1838, 0, + 0, 1960, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2727, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 1519, 813, 1404, + 1515, 822, 1399, + 1509, 834, 1394, + 1501, 850, 1386, + 1490, 871, 1375, + 1475, 897, 1361, + 1454, 930, 1341, + 1425, 970, 1312, + 1383, 1019, 1271, + 1319, 1077, 1209, + 1216, 1145, 1110, + 1029, 1222, 933, + 509, 1308, 469, + 0, 1402, 0, + 0, 1504, 0, + 0, 1612, 0, + 0, 1725, 0, + 0, 1843, 0, + 0, 1963, 0, + 0, 2087, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1666, 868, 1507, + 1663, 877, 1504, + 1659, 888, 1499, + 1653, 902, 1493, + 1645, 920, 1484, + 1635, 944, 1473, + 1620, 973, 1457, + 1600, 1010, 1435, + 1572, 1055, 1404, + 1531, 1109, 1359, + 1469, 1172, 1290, + 1372, 1245, 1179, + 1196, 1327, 967, + 741, 1418, 252, + 0, 1517, 0, + 0, 1622, 0, + 0, 1733, 0, + 0, 1849, 0, + 0, 1968, 0, + 0, 2091, 0, + 0, 2215, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1809, 933, 1616, + 1807, 941, 1613, + 1804, 950, 1610, + 1800, 963, 1605, + 1794, 979, 1599, + 1787, 999, 1590, + 1776, 1026, 1578, + 1762, 1059, 1561, + 1742, 1099, 1537, + 1715, 1148, 1504, + 1675, 1207, 1455, + 1615, 1275, 1381, + 1520, 1352, 1257, + 1352, 1439, 1010, + 936, 1533, 0, + 0, 1635, 0, + 0, 1743, 0, + 0, 1857, 0, + 0, 1974, 0, + 0, 2095, 0, + 0, 2219, 0, + 0, 2344, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1949, 1008, 1730, + 1948, 1014, 1728, + 1946, 1022, 1725, + 1943, 1033, 1722, + 1938, 1047, 1717, + 1933, 1065, 1710, + 1925, 1088, 1701, + 1915, 1116, 1688, + 1901, 1152, 1670, + 1882, 1196, 1646, + 1855, 1249, 1610, + 1815, 1312, 1559, + 1757, 1383, 1479, + 1664, 1465, 1344, + 1501, 1555, 1061, + 1110, 1652, 0, + 0, 1757, 0, + 0, 1867, 0, + 0, 1983, 0, + 0, 2102, 0, + 0, 2224, 0, + 0, 2348, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2087, 1092, 1849, + 2086, 1097, 1847, + 2085, 1104, 1845, + 2082, 1113, 1842, + 2079, 1124, 1838, + 2075, 1140, 1833, + 2070, 1159, 1826, + 2062, 1184, 1816, + 2052, 1215, 1803, + 2039, 1254, 1785, + 2019, 1300, 1759, + 1992, 1357, 1722, + 1954, 1422, 1668, + 1896, 1497, 1584, + 1805, 1581, 1439, + 1646, 1674, 1121, + 1271, 1774, 0, + 0, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2224, 1184, 1970, + 2223, 1189, 1969, + 2222, 1194, 1967, + 2220, 1201, 1965, + 2218, 1211, 1962, + 2215, 1224, 1958, + 2211, 1240, 1953, + 2206, 1261, 1945, + 2198, 1287, 1936, + 2188, 1320, 1922, + 2175, 1361, 1903, + 2156, 1410, 1877, + 2129, 1469, 1839, + 2090, 1537, 1782, + 2033, 1615, 1694, + 1944, 1702, 1541, + 1787, 1797, 1191, + 1424, 1899, 0, + 0, 2007, 0, + 0, 2121, 0, + 0, 2238, 0, + 0, 2359, 0, + 0, 2483, 0, + 0, 2608, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2359, 1284, 2094, + 2359, 1288, 2093, + 2358, 1292, 2092, + 2357, 1298, 2090, + 2355, 1306, 2088, + 2353, 1316, 2085, + 2350, 1329, 2081, + 2346, 1346, 2075, + 2340, 1368, 2068, + 2333, 1396, 2058, + 2323, 1431, 2044, + 2309, 1474, 2025, + 2291, 1525, 1998, + 2264, 1586, 1959, + 2226, 1656, 1901, + 2169, 1736, 1810, + 2080, 1825, 1649, + 1926, 1921, 1271, + 1571, 2025, 0, + 0, 2135, 0, + 0, 2249, 0, + 0, 2368, 0, + 0, 2489, 0, + 0, 2613, 0, + 0, 2739, 0, + 0, 2867, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2494, 1391, 2220, + 2493, 1393, 2219, + 2493, 1397, 2218, + 2492, 1402, 2217, + 2491, 1408, 2215, + 2489, 1416, 2213, + 2487, 1427, 2210, + 2484, 1441, 2206, + 2480, 1459, 2200, + 2474, 1482, 2193, + 2467, 1511, 2183, + 2457, 1547, 2168, + 2444, 1591, 2149, + 2425, 1644, 2121, + 2398, 1706, 2082, + 2361, 1779, 2022, + 2304, 1860, 1929, + 2216, 1950, 1763, + 2063, 2048, 1359, + 1714, 2153, 0, + 0, 2263, 0, + 0, 2378, 0, + 0, 2498, 0, + 0, 2620, 0, + 0, 2744, 0, + 0, 2871, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2628, 1503, 2347, + 2627, 1505, 2347, + 2627, 1508, 2346, + 2626, 1511, 2345, + 2625, 1516, 2344, + 2624, 1523, 2342, + 2622, 1531, 2340, + 2620, 1542, 2337, + 2617, 1557, 2333, + 2613, 1575, 2327, + 2608, 1599, 2319, + 2601, 1629, 2309, + 2591, 1666, 2295, + 2577, 1711, 2275, + 2559, 1766, 2247, + 2532, 1830, 2207, + 2495, 1903, 2146, + 2438, 1986, 2051, + 2351, 2077, 1881, + 2199, 2176, 1456, + 1853, 2281, 0, + 0, 2393, 0, + 0, 2509, 0, + 0, 2628, 0, + 0, 2751, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3650, 0, + 2761, 1619, 2476, + 2761, 1621, 2476, + 2760, 1623, 2475, + 2760, 1626, 2474, + 2759, 1630, 2473, + 2758, 1635, 2472, + 2757, 1641, 2470, + 2756, 1650, 2468, + 2753, 1661, 2465, + 2750, 1676, 2461, + 2747, 1695, 2455, + 2741, 1720, 2447, + 2734, 1750, 2437, + 2724, 1788, 2422, + 2711, 1835, 2402, + 2692, 1890, 2374, + 2666, 1955, 2333, + 2628, 2029, 2272, + 2572, 2113, 2176, + 2485, 2205, 2002, + 2333, 2305, 1559, + 1991, 2411, 0, + 0, 2523, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 2894, 1739, 2605, + 2894, 1740, 2605, + 2894, 1742, 2605, + 2893, 1744, 2604, + 2893, 1747, 2603, + 2892, 1751, 2602, + 2891, 1756, 2601, + 2890, 1763, 2599, + 2888, 1772, 2597, + 2886, 1784, 2594, + 2883, 1799, 2590, + 2879, 1818, 2584, + 2874, 1843, 2576, + 2867, 1874, 2566, + 2857, 1913, 2551, + 2844, 1960, 2531, + 2825, 2016, 2502, + 2799, 2082, 2461, + 2761, 2157, 2400, + 2705, 2241, 2302, + 2618, 2334, 2125, + 2468, 2434, 1668, + 2128, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 3027, 1862, 2735, + 3027, 1863, 2735, + 3027, 1864, 2735, + 3026, 1866, 2735, + 3026, 1868, 2734, + 3026, 1871, 2733, + 3025, 1875, 2732, + 3024, 1880, 2731, + 3023, 1887, 2729, + 3021, 1896, 2727, + 3019, 1908, 2724, + 3016, 1924, 2720, + 3012, 1943, 2714, + 3007, 1969, 2706, + 3000, 2000, 2695, + 2990, 2039, 2681, + 2976, 2087, 2660, + 2958, 2144, 2632, + 2932, 2210, 2590, + 2894, 2286, 2528, + 2838, 2371, 2430, + 2752, 2464, 2251, + 2601, 2565, 1783, + 2263, 2672, 0, + 0, 2784, 0, + 0, 2901, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 3160, 1987, 2866, + 3160, 1988, 2866, + 3159, 1989, 2866, + 3159, 1990, 2865, + 3159, 1992, 2865, + 3159, 1994, 2864, + 3158, 1997, 2864, + 3157, 2001, 2863, + 3157, 2006, 2861, + 3155, 2013, 2860, + 3154, 2023, 2857, + 3152, 2035, 2854, + 3149, 2050, 2850, + 3145, 2070, 2844, + 3139, 2096, 2836, + 3132, 2128, 2826, + 3122, 2167, 2811, + 3109, 2215, 2791, + 3090, 2272, 2762, + 3064, 2339, 2720, + 3027, 2415, 2658, + 2971, 2501, 2558, + 2884, 2594, 2378, + 2734, 2696, 1901, + 2397, 2803, 0, + 0, 2916, 0, + 0, 3033, 0, + 0, 3153, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3292, 2114, 2997, + 3292, 2114, 2997, + 3292, 2115, 2997, + 3292, 2116, 2997, + 3292, 2117, 2996, + 3291, 2119, 2996, + 3291, 2121, 2995, + 3291, 2124, 2995, + 3290, 2128, 2994, + 3289, 2134, 2992, + 3288, 2141, 2990, + 3286, 2150, 2988, + 3284, 2162, 2985, + 3281, 2178, 2981, + 3277, 2198, 2975, + 3272, 2224, 2967, + 3265, 2256, 2956, + 3255, 2296, 2942, + 3241, 2344, 2921, + 3223, 2402, 2892, + 3197, 2469, 2851, + 3159, 2546, 2788, + 3104, 2631, 2688, + 3017, 2725, 2507, + 2867, 2827, 2023, + 2531, 2934, 0, + 0, 3047, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 3425, 2242, 3128, + 3425, 2242, 3128, + 3425, 2243, 3128, + 3424, 2244, 3128, + 3424, 2245, 3128, + 3424, 2246, 3127, + 3424, 2248, 3127, + 3423, 2250, 3126, + 3423, 2253, 3126, + 3422, 2257, 3125, + 3421, 2262, 3123, + 3420, 2270, 3122, + 3418, 2279, 3119, + 3416, 2291, 3116, + 3413, 2307, 3112, + 3410, 2327, 3106, + 3404, 2353, 3098, + 3397, 2386, 3087, + 3387, 2426, 3073, + 3374, 2474, 3052, + 3355, 2532, 3023, + 3329, 2600, 2981, + 3292, 2676, 2919, + 3236, 2762, 2818, + 3150, 2856, 2636, + 3000, 2958, 2147, + 2665, 3066, 0, + 0, 3179, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2371, 3260, + 3557, 2371, 3260, + 3557, 2372, 3260, + 3557, 2372, 3259, + 3557, 2373, 3259, + 3557, 2374, 3259, + 3556, 2375, 3259, + 3556, 2377, 3258, + 3556, 2379, 3258, + 3555, 2382, 3257, + 3554, 2387, 3256, + 3554, 2392, 3255, + 3552, 2399, 3253, + 3551, 2409, 3251, + 3549, 2421, 3247, + 3546, 2437, 3243, + 3542, 2457, 3237, + 3537, 2483, 3230, + 3529, 2516, 3219, + 3520, 2556, 3204, + 3506, 2605, 3183, + 3488, 2663, 3154, + 3461, 2730, 3113, + 3424, 2807, 3050, + 3369, 2894, 2949, + 3282, 2988, 2766, + 3133, 3090, 2273, + 2798, 3197, 0, + 0, 3311, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3689, 2501, 3391, + 3689, 2501, 3391, + 3689, 2501, 3391, + 3689, 2502, 3391, + 3689, 2502, 3391, + 3689, 2503, 3391, + 3689, 2504, 3391, + 3689, 2505, 3390, + 3688, 2507, 3390, + 3688, 2509, 3389, + 3687, 2513, 3389, + 3687, 2517, 3388, + 3686, 2522, 3386, + 3685, 2529, 3385, + 3683, 2539, 3382, + 3681, 2551, 3379, + 3678, 2567, 3375, + 3674, 2588, 3369, + 3669, 2614, 3361, + 3662, 2646, 3350, + 3652, 2687, 3336, + 3638, 2736, 3315, + 3620, 2794, 3286, + 3594, 2862, 3244, + 3556, 2939, 3181, + 3501, 3025, 3080, + 3414, 3119, 2897, + 3265, 3221, 2400, + 2931, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3681, 0, + 3821, 2631, 3523, + 3821, 2631, 3523, + 3821, 2632, 3523, + 3821, 2632, 3523, + 3821, 2632, 3523, + 3821, 2633, 3523, + 3821, 2634, 3523, + 3821, 2635, 3522, + 3821, 2636, 3522, + 3820, 2638, 3522, + 3820, 2640, 3521, + 3820, 2643, 3520, + 3819, 2647, 3519, + 3818, 2653, 3518, + 3817, 2660, 3516, + 3815, 2669, 3514, + 3813, 2682, 3511, + 3810, 2698, 3506, + 3806, 2718, 3501, + 3801, 2745, 3493, + 3794, 2777, 3482, + 3784, 2818, 3467, + 3771, 2867, 3447, + 3752, 2925, 3418, + 3726, 2993, 3375, + 3689, 3070, 3312, + 3633, 3157, 3211, + 3547, 3251, 3028, + 3397, 3353, 2529, + 3063, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2762, 3655, + 3954, 2763, 3655, + 3953, 2763, 3655, + 3953, 2764, 3655, + 3953, 2765, 3654, + 3953, 2766, 3654, + 3953, 2767, 3654, + 3953, 2769, 3653, + 3952, 2771, 3653, + 3952, 2774, 3652, + 3951, 2778, 3651, + 3950, 2784, 3650, + 3949, 2791, 3648, + 3947, 2800, 3646, + 3945, 2813, 3643, + 3942, 2829, 3638, + 3938, 2850, 3632, + 3933, 2876, 3625, + 3926, 2909, 3614, + 3916, 2949, 3599, + 3903, 2998, 3578, + 3884, 3057, 3549, + 3858, 3125, 3507, + 3821, 3202, 3444, + 3765, 3288, 3343, + 3679, 3383, 3159, + 3530, 3485, 2658, + 3196, 3593, 0, + 0, 3706, 0, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2893, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2895, 3786, + 4085, 2896, 3786, + 4085, 2897, 3786, + 4085, 2898, 3786, + 4085, 2900, 3785, + 4084, 2902, 3785, + 4084, 2905, 3784, + 4083, 2909, 3783, + 4082, 2915, 3782, + 4081, 2922, 3780, + 4080, 2932, 3778, + 4077, 2944, 3774, + 4074, 2960, 3770, + 4071, 2981, 3764, + 4065, 3007, 3756, + 4058, 3040, 3746, + 4048, 3081, 3731, + 4035, 3130, 3710, + 4016, 3188, 3681, + 3990, 3256, 3639, + 3953, 3334, 3576, + 3898, 3420, 3475, + 3811, 3515, 3290, + 3662, 3617, 2788, + 3328, 3725, 0, + 4095, 3024, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3026, 3918, + 4095, 3026, 3918, + 4095, 3027, 3918, + 4095, 3028, 3918, + 4095, 3030, 3918, + 4095, 3031, 3917, + 4095, 3034, 3917, + 4095, 3037, 3916, + 4095, 3041, 3915, + 4095, 3046, 3914, + 4095, 3054, 3912, + 4095, 3063, 3910, + 4095, 3076, 3906, + 4095, 3092, 3902, + 4095, 3113, 3896, + 4095, 3139, 3888, + 4095, 3172, 3878, + 4095, 3212, 3863, + 4095, 3262, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3466, 3708, + 4030, 3552, 3606, + 3943, 3647, 3422, + 3794, 3749, 2919, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3156, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3158, 4050, + 4095, 3158, 4050, + 4095, 3159, 4050, + 4095, 3160, 4050, + 4095, 3161, 4050, + 4095, 3163, 4049, + 4095, 3165, 4049, + 4095, 3168, 4048, + 4095, 3173, 4047, + 4095, 3178, 4046, + 4095, 3185, 4044, + 4095, 3195, 4041, + 4095, 3207, 4038, + 4095, 3224, 4034, + 4095, 3244, 4028, + 4095, 3271, 4020, + 4095, 3304, 4009, + 4095, 3344, 3995, + 4095, 3393, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3597, 3839, + 4095, 3684, 3738, + 4076, 3779, 3554, + 0, 723, 961, + 0, 734, 949, + 0, 749, 934, + 0, 769, 912, + 0, 793, 881, + 0, 824, 837, + 0, 862, 769, + 0, 908, 660, + 0, 964, 453, + 0, 1029, 0, + 0, 1104, 0, + 0, 1187, 0, + 0, 1280, 0, + 0, 1380, 0, + 0, 1486, 0, + 0, 1598, 0, + 0, 1714, 0, + 0, 1834, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 727, 977, + 0, 738, 966, + 0, 753, 951, + 0, 772, 930, + 0, 796, 901, + 0, 827, 858, + 0, 865, 794, + 0, 911, 691, + 0, 966, 502, + 0, 1031, 0, + 0, 1105, 0, + 0, 1189, 0, + 0, 1281, 0, + 0, 1380, 0, + 0, 1487, 0, + 0, 1598, 0, + 0, 1715, 0, + 0, 1835, 0, + 0, 1957, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 732, 998, + 0, 743, 988, + 0, 758, 974, + 0, 777, 954, + 0, 801, 926, + 0, 831, 886, + 0, 869, 825, + 0, 915, 730, + 0, 969, 560, + 0, 1034, 134, + 0, 1108, 0, + 0, 1191, 0, + 0, 1282, 0, + 0, 1382, 0, + 0, 1488, 0, + 0, 1599, 0, + 0, 1715, 0, + 0, 1835, 0, + 0, 1958, 0, + 0, 2082, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 739, 1025, + 0, 750, 1015, + 0, 764, 1002, + 0, 783, 983, + 0, 807, 957, + 0, 837, 920, + 0, 874, 864, + 0, 919, 777, + 0, 973, 627, + 0, 1037, 289, + 0, 1111, 0, + 0, 1193, 0, + 0, 1284, 0, + 0, 1383, 0, + 0, 1489, 0, + 0, 1600, 0, + 0, 1716, 0, + 0, 1836, 0, + 0, 1958, 0, + 0, 2083, 0, + 0, 2209, 0, + 0, 2337, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 0, 748, 1059, + 0, 759, 1050, + 0, 773, 1037, + 0, 791, 1020, + 0, 815, 996, + 0, 844, 962, + 0, 880, 911, + 0, 925, 834, + 0, 979, 704, + 0, 1042, 438, + 0, 1115, 0, + 0, 1197, 0, + 0, 1287, 0, + 0, 1386, 0, + 0, 1491, 0, + 0, 1602, 0, + 0, 1717, 0, + 0, 1836, 0, + 0, 1959, 0, + 0, 2083, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2466, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3119, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 450, 760, 1100, + 403, 770, 1092, + 330, 784, 1080, + 210, 802, 1065, + 0, 825, 1043, + 0, 853, 1012, + 0, 889, 967, + 0, 933, 900, + 0, 986, 790, + 0, 1048, 582, + 0, 1120, 0, + 0, 1201, 0, + 0, 1291, 0, + 0, 1388, 0, + 0, 1493, 0, + 0, 1603, 0, + 0, 1718, 0, + 0, 1837, 0, + 0, 1960, 0, + 0, 2084, 0, + 0, 2210, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2596, 0, + 0, 2726, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 751, 775, 1150, + 727, 785, 1143, + 693, 799, 1132, + 643, 816, 1119, + 566, 838, 1099, + 437, 866, 1072, + 175, 901, 1033, + 0, 944, 975, + 0, 995, 884, + 0, 1056, 723, + 0, 1127, 342, + 0, 1207, 0, + 0, 1296, 0, + 0, 1392, 0, + 0, 1496, 0, + 0, 1606, 0, + 0, 1720, 0, + 0, 1839, 0, + 0, 1961, 0, + 0, 2085, 0, + 0, 2211, 0, + 0, 2338, 0, + 0, 2467, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2857, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3514, 0, + 0, 3646, 0, + 978, 795, 1209, + 964, 805, 1203, + 944, 817, 1194, + 916, 834, 1182, + 875, 855, 1165, + 814, 882, 1142, + 718, 916, 1108, + 545, 957, 1060, + 108, 1008, 985, + 0, 1067, 862, + 0, 1136, 615, + 0, 1215, 0, + 0, 1302, 0, + 0, 1397, 0, + 0, 1500, 0, + 0, 1609, 0, + 0, 1723, 0, + 0, 1841, 0, + 0, 1962, 0, + 0, 2086, 0, + 0, 2212, 0, + 0, 2339, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2988, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1170, 820, 1278, + 1161, 829, 1273, + 1148, 841, 1265, + 1130, 857, 1255, + 1105, 877, 1240, + 1070, 903, 1221, + 1017, 935, 1193, + 936, 975, 1153, + 798, 1023, 1093, + 507, 1081, 998, + 0, 1148, 830, + 0, 1225, 414, + 0, 1310, 0, + 0, 1404, 0, + 0, 1506, 0, + 0, 1613, 0, + 0, 1726, 0, + 0, 1843, 0, + 0, 1964, 0, + 0, 2087, 0, + 0, 2213, 0, + 0, 2340, 0, + 0, 2468, 0, + 0, 2597, 0, + 0, 2727, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1343, 851, 1356, + 1336, 860, 1352, + 1327, 871, 1345, + 1316, 886, 1337, + 1299, 905, 1325, + 1276, 929, 1308, + 1244, 960, 1286, + 1196, 998, 1253, + 1123, 1044, 1206, + 1004, 1099, 1134, + 769, 1164, 1015, + 0, 1238, 784, + 0, 1321, 0, + 0, 1413, 0, + 0, 1513, 0, + 0, 1619, 0, + 0, 1731, 0, + 0, 1847, 0, + 0, 1967, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 1502, 890, 1444, + 1498, 898, 1440, + 1492, 909, 1434, + 1484, 922, 1427, + 1472, 940, 1418, + 1457, 962, 1404, + 1435, 991, 1386, + 1405, 1026, 1360, + 1360, 1070, 1323, + 1293, 1122, 1269, + 1184, 1184, 1184, + 979, 1255, 1037, + 327, 1335, 715, + 0, 1425, 0, + 0, 1522, 0, + 0, 1626, 0, + 0, 1736, 0, + 0, 1851, 0, + 0, 1970, 0, + 0, 2092, 0, + 0, 2216, 0, + 0, 2343, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1654, 938, 1539, + 1651, 945, 1536, + 1647, 954, 1532, + 1641, 967, 1526, + 1633, 982, 1518, + 1622, 1003, 1507, + 1607, 1029, 1493, + 1586, 1062, 1473, + 1557, 1102, 1444, + 1515, 1151, 1403, + 1451, 1209, 1341, + 1349, 1277, 1243, + 1161, 1354, 1065, + 641, 1440, 601, + 0, 1534, 0, + 0, 1636, 0, + 0, 1744, 0, + 0, 1857, 0, + 0, 1975, 0, + 0, 2096, 0, + 0, 2219, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1801, 994, 1642, + 1798, 1000, 1639, + 1795, 1009, 1636, + 1791, 1020, 1631, + 1785, 1034, 1625, + 1778, 1052, 1617, + 1767, 1076, 1605, + 1752, 1105, 1589, + 1732, 1142, 1567, + 1704, 1187, 1536, + 1663, 1241, 1491, + 1601, 1304, 1423, + 1504, 1377, 1311, + 1328, 1459, 1099, + 874, 1550, 384, + 0, 1649, 0, + 0, 1754, 0, + 0, 1865, 0, + 0, 1981, 0, + 0, 2100, 0, + 0, 2223, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1943, 1060, 1750, + 1941, 1066, 1748, + 1939, 1073, 1746, + 1936, 1082, 1742, + 1932, 1095, 1737, + 1926, 1111, 1731, + 1919, 1132, 1722, + 1908, 1158, 1710, + 1894, 1191, 1693, + 1874, 1231, 1670, + 1847, 1281, 1636, + 1807, 1339, 1587, + 1747, 1407, 1513, + 1652, 1484, 1389, + 1484, 1571, 1142, + 1068, 1665, 0, + 0, 1767, 0, + 0, 1876, 0, + 0, 1989, 0, + 0, 2106, 0, + 0, 2227, 0, + 0, 2351, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 2083, 1136, 1864, + 2082, 1140, 1862, + 2080, 1146, 1860, + 2078, 1155, 1858, + 2075, 1165, 1854, + 2071, 1179, 1849, + 2065, 1197, 1842, + 2058, 1220, 1833, + 2047, 1249, 1820, + 2033, 1284, 1802, + 2014, 1328, 1778, + 1987, 1381, 1743, + 1947, 1444, 1691, + 1889, 1516, 1611, + 1796, 1597, 1476, + 1633, 1687, 1193, + 1242, 1784, 0, + 0, 1889, 0, + 0, 1999, 0, + 0, 2115, 0, + 0, 2234, 0, + 0, 2356, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 2221, 1220, 1982, + 2220, 1224, 1981, + 2218, 1229, 1979, + 2217, 1236, 1977, + 2214, 1245, 1974, + 2211, 1257, 1970, + 2207, 1272, 1965, + 2202, 1291, 1958, + 2195, 1316, 1948, + 2185, 1347, 1935, + 2171, 1386, 1917, + 2151, 1433, 1891, + 2124, 1489, 1854, + 2086, 1554, 1800, + 2028, 1629, 1716, + 1937, 1713, 1571, + 1778, 1806, 1253, + 1403, 1906, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2357, 1313, 2103, + 2356, 1316, 2102, + 2355, 1321, 2101, + 2354, 1326, 2099, + 2352, 1334, 2097, + 2350, 1343, 2094, + 2347, 1356, 2090, + 2343, 1372, 2085, + 2338, 1393, 2078, + 2330, 1419, 2068, + 2320, 1452, 2054, + 2307, 1493, 2035, + 2288, 1543, 2009, + 2261, 1601, 1971, + 2222, 1669, 1915, + 2165, 1747, 1826, + 2076, 1834, 1673, + 1919, 1929, 1323, + 1556, 2031, 0, + 0, 2139, 0, + 0, 2253, 0, + 0, 2370, 0, + 0, 2491, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2492, 1414, 2227, + 2491, 1416, 2226, + 2491, 1420, 2225, + 2490, 1424, 2224, + 2489, 1430, 2222, + 2487, 1438, 2220, + 2485, 1448, 2217, + 2482, 1461, 2213, + 2478, 1479, 2208, + 2472, 1501, 2200, + 2465, 1528, 2190, + 2455, 1563, 2176, + 2442, 1606, 2157, + 2423, 1657, 2130, + 2396, 1718, 2091, + 2358, 1788, 2033, + 2301, 1868, 1942, + 2213, 1957, 1782, + 2058, 2053, 1403, + 1703, 2157, 0, + 0, 2267, 0, + 0, 2381, 0, + 0, 2500, 0, + 0, 2621, 0, + 0, 2745, 0, + 0, 2871, 0, + 0, 2999, 0, + 0, 3128, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2626, 1521, 2353, + 2626, 1523, 2352, + 2625, 1526, 2351, + 2625, 1529, 2350, + 2624, 1534, 2349, + 2623, 1540, 2347, + 2621, 1548, 2345, + 2619, 1559, 2342, + 2616, 1573, 2338, + 2612, 1591, 2332, + 2607, 1614, 2325, + 2599, 1643, 2315, + 2589, 1679, 2301, + 2576, 1723, 2281, + 2557, 1776, 2253, + 2531, 1839, 2214, + 2493, 1911, 2154, + 2436, 1992, 2061, + 2348, 2082, 1895, + 2195, 2180, 1491, + 1846, 2285, 0, + 0, 2395, 0, + 0, 2511, 0, + 0, 2630, 0, + 0, 2752, 0, + 0, 2876, 0, + 0, 3003, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2760, 1633, 2480, + 2760, 1635, 2479, + 2759, 1637, 2479, + 2759, 1640, 2478, + 2758, 1643, 2477, + 2757, 1648, 2476, + 2756, 1655, 2474, + 2755, 1663, 2472, + 2752, 1674, 2469, + 2749, 1689, 2465, + 2745, 1707, 2459, + 2740, 1731, 2451, + 2733, 1761, 2441, + 2723, 1798, 2427, + 2710, 1843, 2407, + 2691, 1898, 2379, + 2664, 1962, 2339, + 2627, 2035, 2278, + 2571, 2118, 2183, + 2483, 2209, 2013, + 2331, 2308, 1588, + 1986, 2414, 0, + 0, 2525, 0, + 0, 2641, 0, + 0, 2760, 0, + 0, 2883, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2893, 1750, 2608, + 2893, 1751, 2608, + 2893, 1753, 2608, + 2893, 1755, 2607, + 2892, 1758, 2606, + 2891, 1762, 2605, + 2891, 1767, 2604, + 2889, 1773, 2602, + 2888, 1782, 2600, + 2886, 1793, 2597, + 2883, 1808, 2593, + 2879, 1827, 2587, + 2873, 1852, 2579, + 2866, 1882, 2569, + 2856, 1920, 2554, + 2843, 1967, 2534, + 2824, 2022, 2506, + 2798, 2087, 2465, + 2760, 2161, 2404, + 2704, 2245, 2308, + 2617, 2337, 2134, + 2465, 2437, 1691, + 2123, 2543, 0, + 0, 2655, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3652, 0, + 3026, 1870, 2738, + 3026, 1871, 2737, + 3026, 1873, 2737, + 3026, 1874, 2737, + 3025, 1876, 2736, + 3025, 1879, 2735, + 3024, 1883, 2735, + 3023, 1888, 2733, + 3022, 1895, 2732, + 3021, 1904, 2729, + 3018, 1916, 2726, + 3015, 1931, 2722, + 3012, 1950, 2716, + 3006, 1975, 2708, + 2999, 2006, 2698, + 2989, 2045, 2683, + 2976, 2092, 2663, + 2957, 2148, 2635, + 2931, 2214, 2593, + 2893, 2289, 2532, + 2838, 2373, 2434, + 2750, 2466, 2258, + 2600, 2567, 1800, + 2260, 2673, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 3159, 1993, 2868, + 3159, 1994, 2868, + 3159, 1995, 2867, + 3159, 1996, 2867, + 3159, 1998, 2867, + 3158, 2000, 2866, + 3158, 2003, 2865, + 3157, 2007, 2864, + 3156, 2012, 2863, + 3155, 2019, 2861, + 3153, 2028, 2859, + 3151, 2040, 2856, + 3148, 2056, 2852, + 3144, 2075, 2846, + 3139, 2101, 2838, + 3132, 2132, 2827, + 3122, 2172, 2813, + 3109, 2219, 2793, + 3090, 2276, 2764, + 3064, 2342, 2723, + 3026, 2418, 2661, + 2971, 2503, 2562, + 2884, 2596, 2383, + 2733, 2697, 1915, + 2395, 2804, 0, + 0, 2917, 0, + 0, 3033, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 3292, 2119, 2998, + 3292, 2119, 2998, + 3292, 2120, 2998, + 3292, 2121, 2998, + 3291, 2122, 2997, + 3291, 2124, 2997, + 3291, 2126, 2997, + 3290, 2129, 2996, + 3290, 2133, 2995, + 3289, 2138, 2994, + 3287, 2145, 2992, + 3286, 2155, 2989, + 3284, 2167, 2986, + 3281, 2182, 2982, + 3277, 2202, 2976, + 3272, 2228, 2968, + 3264, 2260, 2958, + 3255, 2299, 2943, + 3241, 2347, 2923, + 3222, 2405, 2894, + 3196, 2471, 2852, + 3159, 2548, 2790, + 3103, 2633, 2691, + 3017, 2727, 2510, + 2866, 2828, 2033, + 2530, 2935, 0, + 0, 3048, 0, + 0, 3165, 0, + 0, 3285, 0, + 0, 3409, 0, + 0, 3534, 0, + 0, 3661, 0, + 3424, 2246, 3129, + 3424, 2246, 3129, + 3424, 2246, 3129, + 3424, 2247, 3129, + 3424, 2248, 3129, + 3424, 2249, 3128, + 3424, 2251, 3128, + 3423, 2253, 3127, + 3423, 2257, 3127, + 3422, 2261, 3126, + 3421, 2266, 3124, + 3420, 2273, 3123, + 3418, 2282, 3120, + 3416, 2294, 3117, + 3413, 2310, 3113, + 3409, 2330, 3107, + 3404, 2356, 3099, + 3397, 2388, 3088, + 3387, 2428, 3074, + 3374, 2477, 3053, + 3355, 2534, 3024, + 3329, 2601, 2983, + 3291, 2678, 2920, + 3236, 2763, 2820, + 3149, 2857, 2639, + 2999, 2959, 2155, + 2663, 3066, 0, + 0, 3179, 0, + 0, 3297, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3557, 2374, 3260, + 3557, 2374, 3260, + 3557, 2374, 3260, + 3557, 2375, 3260, + 3556, 2376, 3260, + 3556, 2377, 3260, + 3556, 2378, 3259, + 3556, 2380, 3259, + 3555, 2382, 3259, + 3555, 2385, 3258, + 3554, 2389, 3257, + 3553, 2395, 3255, + 3552, 2402, 3254, + 3551, 2411, 3251, + 3548, 2423, 3248, + 3546, 2439, 3244, + 3542, 2459, 3238, + 3536, 2485, 3230, + 3529, 2518, 3220, + 3519, 2558, 3205, + 3506, 2607, 3184, + 3487, 2664, 3155, + 3461, 2732, 3114, + 3424, 2808, 3051, + 3368, 2894, 2950, + 3282, 2989, 2768, + 3132, 3090, 2279, + 2797, 3198, 0, + 0, 3311, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3689, 2503, 3392, + 3689, 2503, 3392, + 3689, 2503, 3392, + 3689, 2504, 3392, + 3689, 2504, 3392, + 3689, 2505, 3391, + 3689, 2506, 3391, + 3688, 2507, 3391, + 3688, 2509, 3390, + 3688, 2511, 3390, + 3687, 2515, 3389, + 3687, 2519, 3388, + 3686, 2524, 3387, + 3684, 2531, 3385, + 3683, 2541, 3383, + 3681, 2553, 3380, + 3678, 2569, 3375, + 3674, 2589, 3369, + 3669, 2615, 3362, + 3661, 2648, 3351, + 3652, 2688, 3336, + 3638, 2737, 3316, + 3620, 2795, 3287, + 3594, 2863, 3245, + 3556, 2940, 3182, + 3501, 3026, 3081, + 3414, 3120, 2898, + 3265, 3222, 2405, + 2930, 3330, 0, + 0, 3443, 0, + 0, 3560, 0, + 0, 3681, 0, + 3821, 2633, 3524, + 3821, 2633, 3523, + 3821, 2633, 3523, + 3821, 2633, 3523, + 3821, 2634, 3523, + 3821, 2634, 3523, + 3821, 2635, 3523, + 3821, 2636, 3523, + 3821, 2637, 3522, + 3820, 2639, 3522, + 3820, 2642, 3521, + 3819, 2645, 3521, + 3819, 2649, 3520, + 3818, 2654, 3518, + 3817, 2661, 3517, + 3815, 2671, 3514, + 3813, 2683, 3511, + 3810, 2699, 3507, + 3806, 2720, 3501, + 3801, 2746, 3493, + 3794, 2779, 3482, + 3784, 2819, 3468, + 3770, 2868, 3447, + 3752, 2926, 3418, + 3726, 2994, 3376, + 3688, 3071, 3313, + 3633, 3157, 3212, + 3547, 3252, 3029, + 3397, 3353, 2532, + 3063, 3461, 0, + 0, 3575, 0, + 0, 3692, 0, + 3954, 2763, 3655, + 3954, 2763, 3655, + 3954, 2763, 3655, + 3954, 2764, 3655, + 3953, 2764, 3655, + 3953, 2764, 3655, + 3953, 2765, 3655, + 3953, 2766, 3655, + 3953, 2767, 3654, + 3953, 2768, 3654, + 3953, 2770, 3654, + 3952, 2772, 3653, + 3952, 2775, 3652, + 3951, 2779, 3651, + 3950, 2785, 3650, + 3949, 2792, 3648, + 3947, 2802, 3646, + 3945, 2814, 3643, + 3942, 2830, 3639, + 3938, 2851, 3633, + 3933, 2877, 3625, + 3926, 2910, 3614, + 3916, 2950, 3599, + 3903, 2999, 3579, + 3884, 3057, 3550, + 3858, 3125, 3508, + 3821, 3202, 3444, + 3765, 3289, 3344, + 3679, 3383, 3160, + 3529, 3485, 2661, + 3195, 3593, 0, + 0, 3706, 0, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2894, 3787, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4085, 2896, 3787, + 4085, 2897, 3786, + 4085, 2898, 3786, + 4085, 2899, 3786, + 4085, 2901, 3786, + 4084, 2903, 3785, + 4084, 2906, 3784, + 4083, 2910, 3783, + 4082, 2916, 3782, + 4081, 2923, 3780, + 4079, 2933, 3778, + 4077, 2945, 3775, + 4074, 2961, 3770, + 4071, 2982, 3765, + 4065, 3008, 3757, + 4058, 3041, 3746, + 4048, 3081, 3731, + 4035, 3130, 3710, + 4016, 3189, 3681, + 3990, 3257, 3639, + 3953, 3334, 3576, + 3898, 3420, 3475, + 3811, 3515, 3291, + 3662, 3617, 2790, + 3328, 3725, 0, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3025, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3028, 3918, + 4095, 3029, 3918, + 4095, 3030, 3918, + 4095, 3032, 3917, + 4095, 3034, 3917, + 4095, 3037, 3916, + 4095, 3042, 3915, + 4095, 3047, 3914, + 4095, 3054, 3912, + 4095, 3064, 3910, + 4095, 3076, 3906, + 4095, 3092, 3902, + 4095, 3113, 3896, + 4095, 3139, 3888, + 4095, 3172, 3878, + 4095, 3213, 3863, + 4095, 3262, 3842, + 4095, 3320, 3813, + 4095, 3388, 3771, + 4085, 3466, 3708, + 4030, 3552, 3607, + 3943, 3647, 3422, + 3794, 3749, 2920, + 4095, 3156, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3159, 4050, + 4095, 3159, 4050, + 4095, 3160, 4050, + 4095, 3162, 4050, + 4095, 3163, 4049, + 4095, 3166, 4049, + 4095, 3169, 4048, + 4095, 3173, 4047, + 4095, 3179, 4046, + 4095, 3186, 4044, + 4095, 3195, 4042, + 4095, 3208, 4038, + 4095, 3224, 4034, + 4095, 3245, 4028, + 4095, 3271, 4020, + 4095, 3304, 4010, + 4095, 3345, 3995, + 4095, 3394, 3974, + 4095, 3452, 3945, + 4095, 3520, 3903, + 4095, 3598, 3840, + 4095, 3684, 3738, + 4075, 3779, 3554, + 0, 843, 1089, + 0, 852, 1080, + 0, 864, 1068, + 0, 879, 1052, + 0, 898, 1030, + 0, 923, 998, + 0, 954, 952, + 0, 992, 882, + 0, 1039, 767, + 0, 1094, 545, + 0, 1160, 0, + 0, 1234, 0, + 0, 1318, 0, + 0, 1411, 0, + 0, 1511, 0, + 0, 1617, 0, + 0, 1729, 0, + 0, 1846, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 846, 1101, + 0, 855, 1093, + 0, 867, 1082, + 0, 881, 1066, + 0, 901, 1044, + 0, 925, 1013, + 0, 956, 969, + 0, 994, 901, + 0, 1041, 792, + 0, 1096, 585, + 0, 1161, 0, + 0, 1236, 0, + 0, 1319, 0, + 0, 1412, 0, + 0, 1512, 0, + 0, 1618, 0, + 0, 1730, 0, + 0, 1846, 0, + 0, 1966, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 850, 1117, + 0, 859, 1109, + 0, 870, 1098, + 0, 885, 1083, + 0, 904, 1063, + 0, 928, 1033, + 0, 959, 990, + 0, 997, 926, + 0, 1043, 823, + 0, 1098, 634, + 0, 1163, 101, + 0, 1237, 0, + 0, 1321, 0, + 0, 1413, 0, + 0, 1513, 0, + 0, 1619, 0, + 0, 1730, 0, + 0, 1847, 0, + 0, 1967, 0, + 0, 2089, 0, + 0, 2214, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 856, 1138, + 0, 864, 1130, + 0, 875, 1120, + 0, 890, 1106, + 0, 909, 1086, + 0, 933, 1058, + 0, 963, 1018, + 0, 1001, 957, + 0, 1047, 862, + 0, 1101, 692, + 0, 1166, 266, + 0, 1240, 0, + 0, 1323, 0, + 0, 1414, 0, + 0, 1514, 0, + 0, 1620, 0, + 0, 1731, 0, + 0, 1847, 0, + 0, 1967, 0, + 0, 2090, 0, + 0, 2215, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3251, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 0, 863, 1164, + 0, 871, 1157, + 0, 882, 1147, + 0, 897, 1134, + 0, 915, 1115, + 0, 939, 1089, + 0, 969, 1052, + 0, 1006, 996, + 0, 1051, 909, + 0, 1106, 759, + 0, 1169, 421, + 0, 1243, 0, + 0, 1325, 0, + 0, 1417, 0, + 0, 1515, 0, + 0, 1621, 0, + 0, 1732, 0, + 0, 1848, 0, + 0, 1968, 0, + 0, 2090, 0, + 0, 2215, 0, + 0, 2341, 0, + 0, 2469, 0, + 0, 2598, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3646, 0, + 133, 872, 1198, + 32, 880, 1191, + 0, 891, 1182, + 0, 905, 1169, + 0, 923, 1152, + 0, 947, 1128, + 0, 976, 1094, + 0, 1013, 1043, + 0, 1057, 966, + 0, 1111, 836, + 0, 1174, 570, + 0, 1247, 0, + 0, 1329, 0, + 0, 1419, 0, + 0, 1518, 0, + 0, 1623, 0, + 0, 1734, 0, + 0, 1849, 0, + 0, 1968, 0, + 0, 2091, 0, + 0, 2215, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2858, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 615, 884, 1238, + 582, 892, 1232, + 535, 902, 1224, + 462, 916, 1213, + 342, 934, 1197, + 107, 957, 1175, + 0, 986, 1144, + 0, 1021, 1100, + 0, 1065, 1032, + 0, 1118, 922, + 0, 1180, 714, + 0, 1252, 39, + 0, 1333, 0, + 0, 1423, 0, + 0, 1521, 0, + 0, 1625, 0, + 0, 1735, 0, + 0, 1851, 0, + 0, 1970, 0, + 0, 2092, 0, + 0, 2216, 0, + 0, 2342, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2728, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 901, 899, 1288, + 883, 907, 1282, + 859, 917, 1275, + 825, 931, 1265, + 775, 948, 1251, + 698, 970, 1231, + 569, 998, 1204, + 307, 1033, 1165, + 0, 1076, 1107, + 0, 1127, 1016, + 0, 1188, 855, + 0, 1259, 474, + 0, 1339, 0, + 0, 1428, 0, + 0, 1524, 0, + 0, 1628, 0, + 0, 1738, 0, + 0, 1852, 0, + 0, 1971, 0, + 0, 2093, 0, + 0, 2217, 0, + 0, 2343, 0, + 0, 2470, 0, + 0, 2599, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2989, 0, + 0, 3120, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1121, 919, 1346, + 1110, 927, 1341, + 1096, 937, 1335, + 1076, 949, 1326, + 1048, 966, 1314, + 1007, 987, 1297, + 947, 1014, 1274, + 850, 1048, 1241, + 677, 1089, 1192, + 240, 1140, 1117, + 0, 1199, 994, + 0, 1268, 747, + 0, 1347, 0, + 0, 1434, 0, + 0, 1530, 0, + 0, 1632, 0, + 0, 1741, 0, + 0, 1855, 0, + 0, 1973, 0, + 0, 2094, 0, + 0, 2218, 0, + 0, 2344, 0, + 0, 2471, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1309, 945, 1414, + 1302, 952, 1410, + 1293, 961, 1405, + 1280, 973, 1397, + 1262, 989, 1387, + 1237, 1009, 1372, + 1202, 1035, 1353, + 1149, 1067, 1325, + 1068, 1107, 1285, + 930, 1156, 1225, + 639, 1213, 1130, + 0, 1280, 962, + 0, 1357, 546, + 0, 1442, 0, + 0, 1536, 0, + 0, 1638, 0, + 0, 1745, 0, + 0, 1858, 0, + 0, 1976, 0, + 0, 2096, 0, + 0, 2220, 0, + 0, 2345, 0, + 0, 2472, 0, + 0, 2600, 0, + 0, 2729, 0, + 0, 2859, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 1479, 977, 1492, + 1475, 983, 1488, + 1468, 992, 1484, + 1460, 1003, 1477, + 1448, 1018, 1469, + 1431, 1037, 1457, + 1408, 1061, 1441, + 1376, 1092, 1418, + 1328, 1130, 1385, + 1255, 1176, 1338, + 1136, 1231, 1266, + 901, 1296, 1148, + 0, 1370, 916, + 0, 1453, 0, + 0, 1545, 0, + 0, 1645, 0, + 0, 1751, 0, + 0, 1863, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1638, 1016, 1579, + 1635, 1022, 1576, + 1630, 1030, 1572, + 1624, 1041, 1567, + 1616, 1054, 1559, + 1604, 1072, 1550, + 1589, 1094, 1537, + 1567, 1123, 1518, + 1537, 1158, 1492, + 1492, 1202, 1455, + 1425, 1254, 1401, + 1316, 1316, 1316, + 1111, 1387, 1169, + 459, 1468, 847, + 0, 1557, 0, + 0, 1654, 0, + 0, 1758, 0, + 0, 1869, 0, + 0, 1983, 0, + 0, 2102, 0, + 0, 2224, 0, + 0, 2348, 0, + 0, 2475, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1789, 1064, 1673, + 1786, 1070, 1671, + 1783, 1077, 1668, + 1779, 1086, 1664, + 1773, 1099, 1658, + 1765, 1115, 1650, + 1754, 1135, 1640, + 1739, 1161, 1625, + 1719, 1194, 1605, + 1689, 1234, 1576, + 1647, 1283, 1535, + 1583, 1341, 1473, + 1481, 1409, 1375, + 1293, 1486, 1197, + 773, 1572, 733, + 0, 1667, 0, + 0, 1768, 0, + 0, 1876, 0, + 0, 1989, 0, + 0, 2107, 0, + 0, 2228, 0, + 0, 2351, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1934, 1121, 1775, + 1933, 1126, 1774, + 1930, 1133, 1771, + 1927, 1141, 1768, + 1923, 1152, 1763, + 1917, 1166, 1757, + 1910, 1184, 1749, + 1899, 1208, 1737, + 1885, 1237, 1721, + 1864, 1274, 1700, + 1836, 1319, 1668, + 1795, 1373, 1623, + 1734, 1436, 1555, + 1636, 1509, 1443, + 1460, 1592, 1231, + 1006, 1682, 516, + 0, 1781, 0, + 0, 1886, 0, + 0, 1997, 0, + 0, 2113, 0, + 0, 2232, 0, + 0, 2355, 0, + 0, 2479, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 2076, 1188, 1884, + 2075, 1192, 1882, + 2074, 1198, 1880, + 2071, 1205, 1878, + 2068, 1214, 1874, + 2064, 1227, 1869, + 2058, 1243, 1863, + 2051, 1264, 1854, + 2041, 1290, 1842, + 2026, 1323, 1825, + 2007, 1363, 1802, + 1979, 1413, 1768, + 1939, 1471, 1720, + 1879, 1539, 1645, + 1784, 1616, 1521, + 1616, 1703, 1274, + 1200, 1798, 0, + 0, 1899, 0, + 0, 2008, 0, + 0, 2121, 0, + 0, 2239, 0, + 0, 2359, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2216, 1264, 1997, + 2215, 1268, 1996, + 2214, 1272, 1995, + 2212, 1279, 1992, + 2210, 1287, 1990, + 2207, 1297, 1986, + 2203, 1311, 1981, + 2197, 1329, 1974, + 2190, 1352, 1965, + 2179, 1381, 1952, + 2165, 1417, 1935, + 2146, 1461, 1910, + 2119, 1513, 1875, + 2079, 1576, 1823, + 2021, 1648, 1743, + 1928, 1729, 1608, + 1765, 1819, 1325, + 1374, 1916, 0, + 0, 2021, 0, + 0, 2132, 0, + 0, 2247, 0, + 0, 2366, 0, + 0, 2488, 0, + 0, 2612, 0, + 0, 2739, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2353, 1349, 2115, + 2353, 1352, 2114, + 2352, 1356, 2113, + 2350, 1361, 2111, + 2349, 1368, 2109, + 2347, 1377, 2106, + 2344, 1389, 2102, + 2340, 1404, 2097, + 2334, 1423, 2090, + 2327, 1448, 2080, + 2317, 1479, 2067, + 2303, 1518, 2049, + 2284, 1565, 2023, + 2257, 1621, 1987, + 2218, 1686, 1932, + 2160, 1761, 1848, + 2069, 1846, 1703, + 1910, 1938, 1386, + 1535, 2039, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2489, 1443, 2236, + 2489, 1445, 2235, + 2488, 1449, 2234, + 2487, 1453, 2233, + 2486, 1458, 2231, + 2484, 1466, 2229, + 2482, 1475, 2226, + 2479, 1488, 2222, + 2475, 1504, 2217, + 2470, 1525, 2210, + 2462, 1551, 2200, + 2452, 1584, 2186, + 2439, 1625, 2167, + 2420, 1675, 2141, + 2393, 1733, 2103, + 2355, 1802, 2047, + 2297, 1879, 1958, + 2208, 1966, 1805, + 2051, 2061, 1456, + 1688, 2163, 0, + 0, 2271, 0, + 0, 2385, 0, + 0, 2502, 0, + 0, 2623, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2624, 1544, 2359, + 2624, 1546, 2359, + 2624, 1549, 2358, + 2623, 1552, 2357, + 2622, 1556, 2356, + 2621, 1562, 2354, + 2619, 1570, 2352, + 2617, 1580, 2349, + 2614, 1593, 2345, + 2610, 1611, 2340, + 2605, 1633, 2332, + 2597, 1661, 2322, + 2587, 1695, 2308, + 2574, 1738, 2289, + 2555, 1789, 2262, + 2528, 1850, 2223, + 2490, 1921, 2165, + 2433, 2000, 2074, + 2345, 2089, 1914, + 2190, 2186, 1535, + 1835, 2289, 0, + 0, 2399, 0, + 0, 2513, 0, + 0, 2632, 0, + 0, 2753, 0, + 0, 2877, 0, + 0, 3004, 0, + 0, 3131, 0, + 0, 3260, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2759, 1651, 2485, + 2758, 1653, 2485, + 2758, 1655, 2484, + 2758, 1658, 2483, + 2757, 1661, 2482, + 2756, 1666, 2481, + 2755, 1672, 2480, + 2753, 1680, 2477, + 2751, 1691, 2474, + 2748, 1705, 2470, + 2744, 1723, 2465, + 2739, 1746, 2457, + 2731, 1775, 2447, + 2721, 1811, 2433, + 2708, 1855, 2413, + 2689, 1908, 2385, + 2663, 1971, 2346, + 2625, 2043, 2287, + 2568, 2124, 2193, + 2480, 2214, 2027, + 2327, 2312, 1623, + 1978, 2417, 0, + 0, 2527, 0, + 0, 2643, 0, + 0, 2762, 0, + 0, 2884, 0, + 0, 3008, 0, + 0, 3135, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2892, 1764, 2612, + 2892, 1765, 2612, + 2892, 1767, 2612, + 2892, 1769, 2611, + 2891, 1772, 2610, + 2890, 1775, 2609, + 2889, 1780, 2608, + 2888, 1787, 2606, + 2887, 1795, 2604, + 2884, 1806, 2601, + 2882, 1821, 2597, + 2878, 1839, 2591, + 2872, 1863, 2584, + 2865, 1893, 2573, + 2855, 1930, 2559, + 2842, 1976, 2539, + 2823, 2030, 2511, + 2797, 2094, 2471, + 2759, 2167, 2411, + 2703, 2250, 2315, + 2615, 2341, 2145, + 2463, 2440, 1720, + 2118, 2546, 0, + 0, 2657, 0, + 0, 2773, 0, + 0, 2892, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 3026, 1881, 2741, + 3026, 1882, 2740, + 3025, 1883, 2740, + 3025, 1885, 2740, + 3025, 1887, 2739, + 3024, 1890, 2738, + 3024, 1894, 2737, + 3023, 1899, 2736, + 3021, 1905, 2734, + 3020, 1914, 2732, + 3018, 1926, 2729, + 3015, 1940, 2725, + 3011, 1960, 2719, + 3005, 1984, 2712, + 2998, 2015, 2701, + 2988, 2053, 2687, + 2975, 2099, 2667, + 2956, 2154, 2638, + 2930, 2219, 2598, + 2892, 2294, 2537, + 2836, 2377, 2440, + 2749, 2469, 2266, + 2598, 2569, 1823, + 2256, 2675, 0, + 0, 2787, 0, + 0, 2903, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 3159, 2002, 2870, + 3159, 2002, 2870, + 3158, 2003, 2870, + 3158, 2005, 2869, + 3158, 2006, 2869, + 3158, 2008, 2868, + 3157, 2011, 2868, + 3156, 2015, 2867, + 3156, 2020, 2865, + 3154, 2027, 2864, + 3153, 2036, 2861, + 3151, 2048, 2858, + 3148, 2063, 2854, + 3144, 2082, 2848, + 3138, 2107, 2840, + 3131, 2139, 2830, + 3121, 2177, 2815, + 3108, 2224, 2795, + 3089, 2280, 2767, + 3063, 2346, 2726, + 3025, 2421, 2664, + 2970, 2506, 2566, + 2883, 2598, 2390, + 2732, 2699, 1933, + 2392, 2805, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 3291, 2125, 3000, + 3291, 2125, 3000, + 3291, 2126, 3000, + 3291, 2127, 2999, + 3291, 2128, 2999, + 3291, 2130, 2999, + 3290, 2132, 2998, + 3290, 2135, 2997, + 3289, 2139, 2996, + 3288, 2145, 2995, + 3287, 2151, 2993, + 3285, 2161, 2991, + 3283, 2172, 2988, + 3280, 2188, 2984, + 3276, 2208, 2978, + 3271, 2233, 2970, + 3264, 2264, 2960, + 3254, 2304, 2945, + 3241, 2351, 2925, + 3222, 2408, 2896, + 3196, 2474, 2855, + 3158, 2550, 2793, + 3103, 2635, 2694, + 3016, 2728, 2515, + 2865, 2829, 2047, + 2527, 2936, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3534, 0, + 0, 3661, 0, + 3424, 2250, 3130, + 3424, 2251, 3130, + 3424, 2251, 3130, + 3424, 2252, 3130, + 3424, 2253, 3130, + 3423, 2254, 3130, + 3423, 2256, 3129, + 3423, 2258, 3129, + 3422, 2261, 3128, + 3422, 2265, 3127, + 3421, 2271, 3126, + 3420, 2278, 3124, + 3418, 2287, 3122, + 3416, 2299, 3118, + 3413, 2314, 3114, + 3409, 2334, 3108, + 3404, 2360, 3101, + 3396, 2392, 3090, + 3387, 2431, 3075, + 3373, 2479, 3055, + 3355, 2537, 3026, + 3328, 2603, 2984, + 3291, 2680, 2922, + 3235, 2765, 2823, + 3149, 2859, 2643, + 2999, 2960, 2165, + 2662, 3067, 0, + 0, 3180, 0, + 0, 3297, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3666, 0, + 3557, 2377, 3261, + 3557, 2378, 3261, + 3556, 2378, 3261, + 3556, 2379, 3261, + 3556, 2379, 3261, + 3556, 2380, 3261, + 3556, 2382, 3260, + 3556, 2383, 3260, + 3555, 2386, 3259, + 3555, 2389, 3259, + 3554, 2393, 3258, + 3553, 2398, 3256, + 3552, 2405, 3255, + 3550, 2414, 3252, + 3548, 2427, 3249, + 3545, 2442, 3245, + 3541, 2462, 3239, + 3536, 2488, 3231, + 3529, 2520, 3221, + 3519, 2560, 3206, + 3506, 2609, 3185, + 3487, 2666, 3157, + 3461, 2733, 3115, + 3423, 2810, 3052, + 3368, 2896, 2952, + 3281, 2989, 2771, + 3131, 3091, 2287, + 2795, 3198, 0, + 0, 3311, 0, + 0, 3429, 0, + 0, 3549, 0, + 0, 3673, 0, + 3689, 2506, 3393, + 3689, 2506, 3393, + 3689, 2506, 3392, + 3689, 2506, 3392, + 3689, 2507, 3392, + 3689, 2508, 3392, + 3688, 2509, 3392, + 3688, 2510, 3392, + 3688, 2512, 3391, + 3688, 2514, 3391, + 3687, 2517, 3390, + 3686, 2521, 3389, + 3686, 2527, 3388, + 3684, 2534, 3386, + 3683, 2543, 3383, + 3681, 2555, 3380, + 3678, 2571, 3376, + 3674, 2592, 3370, + 3668, 2617, 3362, + 3661, 2650, 3352, + 3651, 2690, 3337, + 3638, 2739, 3316, + 3619, 2796, 3287, + 3593, 2864, 3246, + 3556, 2941, 3183, + 3500, 3026, 3083, + 3414, 3121, 2900, + 3264, 3222, 2411, + 2929, 3330, 0, + 0, 3443, 0, + 0, 3560, 0, + 0, 3681, 0, + 3821, 2635, 3524, + 3821, 2635, 3524, + 3821, 2635, 3524, + 3821, 2635, 3524, + 3821, 2636, 3524, + 3821, 2636, 3524, + 3821, 2637, 3523, + 3821, 2638, 3523, + 3821, 2639, 3523, + 3820, 2641, 3523, + 3820, 2644, 3522, + 3819, 2647, 3521, + 3819, 2651, 3520, + 3818, 2656, 3519, + 3817, 2663, 3517, + 3815, 2673, 3515, + 3813, 2685, 3512, + 3810, 2701, 3507, + 3806, 2721, 3502, + 3801, 2747, 3494, + 3794, 2780, 3483, + 3784, 2820, 3468, + 3770, 2869, 3448, + 3752, 2927, 3419, + 3726, 2995, 3377, + 3688, 3072, 3314, + 3633, 3158, 3213, + 3546, 3252, 3030, + 3397, 3354, 2537, + 3062, 3462, 0, + 0, 3575, 0, + 0, 3692, 0, + 3953, 2765, 3656, + 3953, 2765, 3656, + 3953, 2765, 3656, + 3953, 2765, 3656, + 3953, 2765, 3655, + 3953, 2766, 3655, + 3953, 2766, 3655, + 3953, 2767, 3655, + 3953, 2768, 3655, + 3953, 2770, 3655, + 3952, 2771, 3654, + 3952, 2774, 3654, + 3952, 2777, 3653, + 3951, 2781, 3652, + 3950, 2786, 3651, + 3949, 2793, 3649, + 3947, 2803, 3646, + 3945, 2815, 3643, + 3942, 2831, 3639, + 3938, 2852, 3633, + 3933, 2878, 3625, + 3926, 2911, 3615, + 3916, 2951, 3600, + 3903, 3000, 3579, + 3884, 3058, 3550, + 3858, 3126, 3508, + 3821, 3203, 3445, + 3765, 3289, 3344, + 3679, 3384, 3161, + 3529, 3485, 2664, + 3195, 3593, 0, + 0, 3707, 0, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4086, 2895, 3787, + 4086, 2896, 3787, + 4086, 2896, 3787, + 4086, 2896, 3787, + 4086, 2896, 3787, + 4085, 2897, 3787, + 4085, 2898, 3787, + 4085, 2899, 3787, + 4085, 2900, 3786, + 4085, 2902, 3786, + 4084, 2904, 3785, + 4084, 2907, 3785, + 4083, 2911, 3784, + 4082, 2917, 3782, + 4081, 2924, 3780, + 4079, 2934, 3778, + 4077, 2946, 3775, + 4074, 2962, 3771, + 4070, 2983, 3765, + 4065, 3009, 3757, + 4058, 3042, 3746, + 4048, 3082, 3731, + 4035, 3131, 3711, + 4016, 3189, 3682, + 3990, 3257, 3640, + 3953, 3334, 3577, + 3897, 3421, 3476, + 3811, 3515, 3292, + 3662, 3617, 2793, + 3327, 3725, 0, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3026, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3028, 3919, + 4095, 3029, 3919, + 4095, 3030, 3918, + 4095, 3031, 3918, + 4095, 3033, 3918, + 4095, 3035, 3917, + 4095, 3038, 3916, + 4095, 3042, 3915, + 4095, 3048, 3914, + 4095, 3055, 3912, + 4095, 3065, 3910, + 4095, 3077, 3907, + 4095, 3093, 3902, + 4095, 3114, 3897, + 4095, 3140, 3889, + 4095, 3173, 3878, + 4095, 3213, 3863, + 4095, 3263, 3843, + 4095, 3321, 3813, + 4095, 3389, 3771, + 4085, 3466, 3708, + 4030, 3552, 3607, + 3943, 3647, 3423, + 3794, 3749, 2922, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3157, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3159, 4051, + 4095, 3159, 4051, + 4095, 3160, 4050, + 4095, 3161, 4050, + 4095, 3162, 4050, + 4095, 3164, 4049, + 4095, 3166, 4049, + 4095, 3170, 4048, + 4095, 3174, 4047, + 4095, 3179, 4046, + 4095, 3186, 4044, + 4095, 3196, 4042, + 4095, 3208, 4039, + 4095, 3224, 4034, + 4095, 3245, 4028, + 4095, 3271, 4021, + 4095, 3304, 4010, + 4095, 3345, 3995, + 4095, 3394, 3974, + 4095, 3453, 3945, + 4095, 3520, 3903, + 4095, 3598, 3840, + 4095, 3684, 3739, + 4075, 3779, 3555, + 0, 966, 1218, + 0, 973, 1211, + 0, 982, 1202, + 0, 994, 1191, + 0, 1009, 1174, + 0, 1028, 1151, + 0, 1053, 1119, + 0, 1084, 1071, + 0, 1122, 999, + 0, 1169, 879, + 0, 1225, 645, + 0, 1291, 0, + 0, 1366, 0, + 0, 1450, 0, + 0, 1542, 0, + 0, 1643, 0, + 0, 1749, 0, + 0, 1861, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3383, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 969, 1227, + 0, 975, 1221, + 0, 984, 1212, + 0, 996, 1201, + 0, 1011, 1185, + 0, 1030, 1162, + 0, 1055, 1130, + 0, 1086, 1084, + 0, 1124, 1014, + 0, 1171, 899, + 0, 1226, 677, + 0, 1292, 0, + 0, 1367, 0, + 0, 1451, 0, + 0, 1543, 0, + 0, 1643, 0, + 0, 1750, 0, + 0, 1862, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 972, 1239, + 0, 978, 1233, + 0, 987, 1225, + 0, 999, 1214, + 0, 1014, 1198, + 0, 1033, 1176, + 0, 1057, 1146, + 0, 1088, 1101, + 0, 1126, 1033, + 0, 1173, 924, + 0, 1228, 717, + 0, 1293, 53, + 0, 1368, 0, + 0, 1452, 0, + 0, 1544, 0, + 0, 1644, 0, + 0, 1750, 0, + 0, 1862, 0, + 0, 1978, 0, + 0, 2098, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 976, 1255, + 0, 982, 1249, + 0, 991, 1241, + 0, 1002, 1230, + 0, 1017, 1215, + 0, 1036, 1195, + 0, 1061, 1165, + 0, 1091, 1122, + 0, 1129, 1058, + 0, 1175, 955, + 0, 1231, 766, + 0, 1295, 233, + 0, 1370, 0, + 0, 1453, 0, + 0, 1545, 0, + 0, 1645, 0, + 0, 1751, 0, + 0, 1863, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2221, 0, + 0, 2346, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 981, 1276, + 0, 988, 1270, + 0, 996, 1263, + 0, 1008, 1252, + 0, 1022, 1238, + 0, 1041, 1218, + 0, 1065, 1190, + 0, 1095, 1150, + 0, 1133, 1090, + 0, 1179, 994, + 0, 1234, 824, + 0, 1298, 398, + 0, 1372, 0, + 0, 1455, 0, + 0, 1547, 0, + 0, 1646, 0, + 0, 1752, 0, + 0, 1863, 0, + 0, 1979, 0, + 0, 2099, 0, + 0, 2222, 0, + 0, 2347, 0, + 0, 2473, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 0, 988, 1302, + 0, 995, 1297, + 0, 1003, 1289, + 0, 1014, 1280, + 0, 1029, 1266, + 0, 1047, 1247, + 0, 1071, 1221, + 0, 1101, 1184, + 0, 1138, 1128, + 0, 1183, 1041, + 0, 1238, 891, + 0, 1301, 553, + 0, 1375, 0, + 0, 1457, 0, + 0, 1549, 0, + 0, 1648, 0, + 0, 1753, 0, + 0, 1864, 0, + 0, 1980, 0, + 0, 2100, 0, + 0, 2222, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2601, 0, + 0, 2730, 0, + 0, 2860, 0, + 0, 2990, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 329, 998, 1335, + 265, 1004, 1330, + 164, 1012, 1323, + 0, 1023, 1314, + 0, 1037, 1301, + 0, 1055, 1284, + 0, 1079, 1260, + 0, 1108, 1226, + 0, 1145, 1175, + 0, 1189, 1098, + 0, 1243, 968, + 0, 1306, 702, + 0, 1379, 0, + 0, 1461, 0, + 0, 1551, 0, + 0, 1650, 0, + 0, 1755, 0, + 0, 1866, 0, + 0, 1981, 0, + 0, 2101, 0, + 0, 2223, 0, + 0, 2347, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 770, 1010, 1375, + 747, 1016, 1370, + 715, 1024, 1364, + 667, 1035, 1356, + 594, 1048, 1345, + 474, 1066, 1329, + 239, 1089, 1307, + 0, 1118, 1276, + 0, 1154, 1232, + 0, 1197, 1164, + 0, 1250, 1054, + 0, 1312, 846, + 0, 1384, 171, + 0, 1465, 0, + 0, 1555, 0, + 0, 1653, 0, + 0, 1757, 0, + 0, 1868, 0, + 0, 1983, 0, + 0, 2102, 0, + 0, 2224, 0, + 0, 2348, 0, + 0, 2474, 0, + 0, 2602, 0, + 0, 2731, 0, + 0, 2860, 0, + 0, 2991, 0, + 0, 3121, 0, + 0, 3252, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1045, 1025, 1424, + 1033, 1031, 1420, + 1016, 1039, 1414, + 992, 1049, 1407, + 957, 1063, 1397, + 907, 1080, 1383, + 830, 1102, 1364, + 702, 1130, 1336, + 440, 1165, 1297, + 0, 1208, 1239, + 0, 1260, 1148, + 0, 1321, 987, + 0, 1391, 606, + 0, 1471, 0, + 0, 1560, 0, + 0, 1657, 0, + 0, 1760, 0, + 0, 1870, 0, + 0, 1985, 0, + 0, 2103, 0, + 0, 2225, 0, + 0, 2349, 0, + 0, 2475, 0, + 0, 2603, 0, + 0, 2731, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1261, 1046, 1482, + 1253, 1051, 1478, + 1242, 1059, 1473, + 1228, 1069, 1467, + 1208, 1082, 1458, + 1180, 1098, 1446, + 1139, 1119, 1429, + 1079, 1146, 1406, + 982, 1180, 1373, + 810, 1222, 1324, + 372, 1272, 1249, + 0, 1331, 1126, + 0, 1400, 879, + 0, 1479, 0, + 0, 1566, 0, + 0, 1662, 0, + 0, 1764, 0, + 0, 1873, 0, + 0, 1987, 0, + 0, 2105, 0, + 0, 2226, 0, + 0, 2350, 0, + 0, 2476, 0, + 0, 2603, 0, + 0, 2732, 0, + 0, 2861, 0, + 0, 2991, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1446, 1072, 1550, + 1441, 1077, 1546, + 1434, 1084, 1542, + 1425, 1093, 1537, + 1412, 1105, 1529, + 1394, 1121, 1519, + 1370, 1141, 1505, + 1334, 1167, 1485, + 1282, 1199, 1457, + 1200, 1239, 1417, + 1063, 1288, 1357, + 771, 1345, 1263, + 0, 1412, 1094, + 0, 1489, 678, + 0, 1575, 0, + 0, 1668, 0, + 0, 1770, 0, + 0, 1877, 0, + 0, 1990, 0, + 0, 2108, 0, + 0, 2228, 0, + 0, 2352, 0, + 0, 2477, 0, + 0, 2604, 0, + 0, 2732, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3515, 0, + 0, 3647, 0, + 1615, 1104, 1627, + 1611, 1109, 1624, + 1607, 1115, 1621, + 1600, 1124, 1616, + 1592, 1135, 1609, + 1580, 1150, 1601, + 1563, 1169, 1589, + 1540, 1193, 1573, + 1508, 1224, 1550, + 1460, 1262, 1518, + 1388, 1308, 1470, + 1268, 1363, 1398, + 1033, 1428, 1280, + 0, 1502, 1048, + 0, 1585, 57, + 0, 1677, 0, + 0, 1777, 0, + 0, 1883, 0, + 0, 1995, 0, + 0, 2111, 0, + 0, 2231, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 1772, 1144, 1713, + 1770, 1148, 1711, + 1767, 1154, 1708, + 1762, 1162, 1704, + 1756, 1173, 1699, + 1748, 1186, 1692, + 1737, 1204, 1682, + 1721, 1226, 1669, + 1699, 1255, 1650, + 1669, 1290, 1624, + 1624, 1334, 1588, + 1557, 1386, 1533, + 1448, 1448, 1448, + 1243, 1519, 1301, + 591, 1600, 979, + 0, 1689, 0, + 0, 1786, 0, + 0, 1891, 0, + 0, 2001, 0, + 0, 2116, 0, + 0, 2234, 0, + 0, 2356, 0, + 0, 2481, 0, + 0, 2607, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1923, 1192, 1807, + 1921, 1196, 1805, + 1919, 1202, 1803, + 1915, 1209, 1800, + 1911, 1218, 1796, + 1905, 1231, 1790, + 1897, 1247, 1782, + 1886, 1267, 1772, + 1871, 1293, 1757, + 1851, 1326, 1737, + 1821, 1366, 1708, + 1779, 1415, 1667, + 1715, 1473, 1605, + 1613, 1541, 1507, + 1426, 1618, 1329, + 905, 1704, 865, + 0, 1799, 0, + 0, 1900, 0, + 0, 2008, 0, + 0, 2122, 0, + 0, 2239, 0, + 0, 2360, 0, + 0, 2483, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2068, 1250, 1909, + 2067, 1253, 1908, + 2065, 1258, 1906, + 2063, 1265, 1903, + 2059, 1273, 1900, + 2055, 1284, 1895, + 2049, 1298, 1889, + 2042, 1317, 1881, + 2031, 1340, 1869, + 2017, 1370, 1854, + 1997, 1406, 1832, + 1968, 1451, 1801, + 1927, 1505, 1755, + 1866, 1569, 1687, + 1768, 1641, 1575, + 1592, 1724, 1364, + 1138, 1815, 648, + 0, 1913, 0, + 0, 2018, 0, + 0, 2129, 0, + 0, 2245, 0, + 0, 2364, 0, + 0, 2487, 0, + 0, 2612, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 2210, 1317, 2017, + 2209, 1320, 2016, + 2207, 1324, 2014, + 2206, 1330, 2012, + 2203, 1337, 2010, + 2200, 1347, 2006, + 2196, 1359, 2001, + 2191, 1375, 1995, + 2183, 1396, 1986, + 2173, 1422, 1974, + 2158, 1455, 1957, + 2139, 1496, 1934, + 2111, 1545, 1900, + 2071, 1603, 1852, + 2011, 1671, 1777, + 1916, 1749, 1653, + 1748, 1835, 1406, + 1333, 1930, 0, + 0, 2032, 0, + 0, 2140, 0, + 0, 2253, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2349, 1394, 2130, + 2348, 1396, 2129, + 2347, 1400, 2128, + 2346, 1404, 2127, + 2344, 1411, 2125, + 2342, 1419, 2122, + 2339, 1429, 2118, + 2335, 1443, 2113, + 2329, 1461, 2106, + 2322, 1484, 2097, + 2312, 1513, 2084, + 2298, 1549, 2067, + 2278, 1593, 2042, + 2251, 1646, 2007, + 2211, 1708, 1955, + 2153, 1780, 1875, + 2061, 1861, 1740, + 1898, 1951, 1457, + 1507, 2049, 0, + 0, 2153, 0, + 0, 2264, 0, + 0, 2379, 0, + 0, 2498, 0, + 0, 2620, 0, + 0, 2744, 0, + 0, 2871, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2486, 1479, 2248, + 2485, 1482, 2247, + 2485, 1484, 2246, + 2484, 1488, 2245, + 2483, 1493, 2243, + 2481, 1500, 2241, + 2479, 1509, 2238, + 2476, 1521, 2234, + 2472, 1536, 2229, + 2466, 1555, 2222, + 2459, 1580, 2213, + 2449, 1611, 2199, + 2435, 1650, 2181, + 2416, 1697, 2155, + 2389, 1753, 2119, + 2350, 1818, 2064, + 2292, 1893, 1980, + 2201, 1978, 1835, + 2042, 2070, 1518, + 1668, 2171, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2622, 1573, 2368, + 2621, 1575, 2368, + 2621, 1578, 2367, + 2620, 1581, 2366, + 2619, 1585, 2365, + 2618, 1590, 2363, + 2616, 1598, 2361, + 2614, 1607, 2358, + 2611, 1620, 2354, + 2607, 1636, 2349, + 2602, 1657, 2342, + 2595, 1683, 2332, + 2585, 1716, 2318, + 2571, 1757, 2299, + 2552, 1807, 2273, + 2525, 1865, 2235, + 2487, 1934, 2179, + 2430, 2011, 2091, + 2340, 2098, 1937, + 2183, 2193, 1588, + 1820, 2295, 0, + 0, 2403, 0, + 0, 2517, 0, + 0, 2634, 0, + 0, 2755, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2757, 1675, 2492, + 2756, 1676, 2491, + 2756, 1678, 2491, + 2756, 1681, 2490, + 2755, 1684, 2489, + 2754, 1688, 2488, + 2753, 1694, 2486, + 2751, 1702, 2484, + 2749, 1712, 2481, + 2746, 1726, 2477, + 2742, 1743, 2472, + 2737, 1765, 2464, + 2729, 1793, 2454, + 2719, 1827, 2440, + 2706, 1870, 2421, + 2687, 1922, 2394, + 2660, 1982, 2355, + 2622, 2053, 2297, + 2566, 2132, 2206, + 2477, 2221, 2046, + 2322, 2318, 1667, + 1967, 2421, 0, + 0, 2531, 0, + 0, 2645, 0, + 0, 2764, 0, + 0, 2885, 0, + 0, 3010, 0, + 0, 3136, 0, + 0, 3263, 0, + 0, 3392, 0, + 0, 3521, 0, + 0, 3651, 0, + 2891, 1782, 2617, + 2891, 1784, 2617, + 2890, 1785, 2617, + 2890, 1787, 2616, + 2890, 1790, 2615, + 2889, 1793, 2615, + 2888, 1798, 2613, + 2887, 1804, 2612, + 2885, 1812, 2609, + 2883, 1823, 2606, + 2880, 1837, 2602, + 2876, 1855, 2597, + 2871, 1878, 2589, + 2863, 1907, 2579, + 2854, 1943, 2565, + 2840, 1987, 2545, + 2821, 2040, 2518, + 2795, 2103, 2478, + 2757, 2175, 2419, + 2701, 2256, 2325, + 2612, 2346, 2159, + 2459, 2444, 1755, + 2110, 2549, 0, + 0, 2659, 0, + 0, 2775, 0, + 0, 2894, 0, + 0, 3016, 0, + 0, 3140, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3523, 0, + 0, 3653, 0, + 3025, 1895, 2745, + 3024, 1896, 2744, + 3024, 1897, 2744, + 3024, 1899, 2744, + 3024, 1901, 2743, + 3023, 1904, 2742, + 3022, 1908, 2741, + 3022, 1912, 2740, + 3020, 1919, 2738, + 3019, 1927, 2736, + 3017, 1938, 2733, + 3014, 1953, 2729, + 3010, 1971, 2723, + 3004, 1995, 2716, + 2997, 2025, 2705, + 2987, 2062, 2691, + 2974, 2108, 2671, + 2955, 2162, 2643, + 2929, 2226, 2603, + 2891, 2299, 2543, + 2835, 2382, 2447, + 2747, 2473, 2277, + 2595, 2572, 1852, + 2250, 2678, 0, + 0, 2789, 0, + 0, 2905, 0, + 0, 3024, 0, + 0, 3147, 0, + 0, 3272, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 3158, 2013, 2873, + 3158, 2013, 2873, + 3158, 2014, 2872, + 3157, 2015, 2872, + 3157, 2017, 2872, + 3157, 2019, 2871, + 3156, 2022, 2871, + 3156, 2026, 2870, + 3155, 2031, 2868, + 3154, 2038, 2867, + 3152, 2046, 2864, + 3150, 2058, 2861, + 3147, 2073, 2857, + 3143, 2092, 2851, + 3138, 2116, 2844, + 3130, 2147, 2833, + 3120, 2185, 2819, + 3107, 2231, 2799, + 3088, 2286, 2770, + 3062, 2351, 2730, + 3024, 2426, 2669, + 2968, 2509, 2572, + 2881, 2601, 2398, + 2730, 2701, 1955, + 2388, 2807, 0, + 0, 2919, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 3291, 2133, 3002, + 3291, 2134, 3002, + 3291, 2135, 3002, + 3291, 2135, 3002, + 3290, 2137, 3001, + 3290, 2138, 3001, + 3290, 2141, 3000, + 3289, 2143, 3000, + 3288, 2147, 2999, + 3288, 2153, 2997, + 3286, 2159, 2996, + 3285, 2168, 2993, + 3283, 2180, 2990, + 3280, 2195, 2986, + 3276, 2215, 2980, + 3270, 2239, 2973, + 3263, 2271, 2962, + 3253, 2309, 2947, + 3240, 2356, 2927, + 3221, 2412, 2899, + 3195, 2478, 2858, + 3157, 2553, 2796, + 3102, 2638, 2698, + 3015, 2730, 2522, + 2864, 2831, 2065, + 2524, 2938, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 3424, 2257, 3132, + 3424, 2257, 3132, + 3423, 2258, 3132, + 3423, 2258, 3132, + 3423, 2259, 3132, + 3423, 2261, 3131, + 3423, 2262, 3131, + 3422, 2264, 3130, + 3422, 2267, 3130, + 3421, 2271, 3129, + 3420, 2277, 3127, + 3419, 2284, 3126, + 3417, 2293, 3123, + 3415, 2304, 3120, + 3412, 2320, 3116, + 3408, 2340, 3110, + 3403, 2365, 3102, + 3396, 2397, 3092, + 3386, 2436, 3077, + 3373, 2483, 3057, + 3354, 2540, 3028, + 3328, 2606, 2987, + 3290, 2682, 2925, + 3235, 2767, 2826, + 3148, 2860, 2647, + 2997, 2961, 2179, + 2659, 3068, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3666, 0, + 3556, 2382, 3263, + 3556, 2382, 3263, + 3556, 2383, 3262, + 3556, 2383, 3262, + 3556, 2384, 3262, + 3556, 2385, 3262, + 3556, 2386, 3262, + 3555, 2388, 3261, + 3555, 2390, 3261, + 3554, 2393, 3260, + 3554, 2397, 3259, + 3553, 2403, 3258, + 3552, 2410, 3256, + 3550, 2419, 3254, + 3548, 2431, 3250, + 3545, 2446, 3246, + 3541, 2466, 3240, + 3536, 2492, 3233, + 3529, 2524, 3222, + 3519, 2564, 3207, + 3505, 2612, 3187, + 3487, 2669, 3158, + 3461, 2736, 3117, + 3423, 2812, 3054, + 3368, 2897, 2955, + 3281, 2991, 2775, + 3131, 3092, 2297, + 2794, 3199, 0, + 0, 3312, 0, + 0, 3429, 0, + 0, 3550, 0, + 0, 3673, 0, + 3689, 2509, 3394, + 3689, 2509, 3393, + 3689, 2510, 3393, + 3689, 2510, 3393, + 3688, 2511, 3393, + 3688, 2511, 3393, + 3688, 2512, 3393, + 3688, 2514, 3392, + 3688, 2515, 3392, + 3687, 2518, 3392, + 3687, 2521, 3391, + 3686, 2525, 3390, + 3685, 2530, 3389, + 3684, 2537, 3387, + 3682, 2546, 3384, + 3680, 2559, 3381, + 3677, 2574, 3377, + 3673, 2595, 3371, + 3668, 2620, 3363, + 3661, 2653, 3353, + 3651, 2692, 3338, + 3638, 2741, 3318, + 3619, 2798, 3289, + 3593, 2865, 3247, + 3556, 2942, 3184, + 3500, 3028, 3084, + 3413, 3122, 2903, + 3264, 3223, 2419, + 2928, 3331, 0, + 0, 3443, 0, + 0, 3561, 0, + 0, 3681, 0, + 3821, 2637, 3525, + 3821, 2638, 3525, + 3821, 2638, 3525, + 3821, 2638, 3525, + 3821, 2639, 3524, + 3821, 2639, 3524, + 3821, 2640, 3524, + 3821, 2641, 3524, + 3820, 2642, 3524, + 3820, 2644, 3523, + 3820, 2646, 3523, + 3819, 2649, 3522, + 3818, 2653, 3521, + 3818, 2659, 3520, + 3816, 2666, 3518, + 3815, 2675, 3516, + 3813, 2687, 3512, + 3810, 2703, 3508, + 3806, 2724, 3502, + 3801, 2750, 3494, + 3793, 2782, 3484, + 3784, 2822, 3469, + 3770, 2871, 3448, + 3752, 2929, 3420, + 3725, 2996, 3378, + 3688, 3073, 3315, + 3633, 3159, 3215, + 3546, 3253, 3032, + 3396, 3354, 2543, + 3061, 3462, 0, + 0, 3575, 0, + 0, 3692, 0, + 3953, 2767, 3656, + 3953, 2767, 3656, + 3953, 2767, 3656, + 3953, 2767, 3656, + 3953, 2768, 3656, + 3953, 2768, 3656, + 3953, 2769, 3656, + 3953, 2769, 3656, + 3953, 2770, 3655, + 3953, 2772, 3655, + 3952, 2773, 3655, + 3952, 2776, 3654, + 3951, 2779, 3653, + 3951, 2783, 3652, + 3950, 2788, 3651, + 3949, 2795, 3649, + 3947, 2805, 3647, + 3945, 2817, 3644, + 3942, 2833, 3639, + 3938, 2854, 3634, + 3933, 2880, 3626, + 3926, 2912, 3615, + 3916, 2952, 3600, + 3902, 3001, 3580, + 3884, 3059, 3551, + 3858, 3127, 3509, + 3820, 3204, 3446, + 3765, 3290, 3345, + 3678, 3384, 3162, + 3529, 3486, 2669, + 3194, 3594, 0, + 0, 3707, 0, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4086, 2897, 3788, + 4085, 2898, 3788, + 4085, 2898, 3787, + 4085, 2899, 3787, + 4085, 2899, 3787, + 4085, 2900, 3787, + 4085, 2902, 3787, + 4085, 2903, 3786, + 4084, 2906, 3786, + 4084, 2909, 3785, + 4083, 2913, 3784, + 4082, 2918, 3783, + 4081, 2926, 3781, + 4079, 2935, 3779, + 4077, 2947, 3775, + 4074, 2963, 3771, + 4070, 2984, 3765, + 4065, 3010, 3757, + 4058, 3043, 3747, + 4048, 3083, 3732, + 4035, 3132, 3711, + 4016, 3190, 3682, + 3990, 3258, 3640, + 3953, 3335, 3577, + 3897, 3421, 3476, + 3811, 3516, 3293, + 3661, 3617, 2796, + 3327, 3725, 0, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3027, 3919, + 4095, 3028, 3919, + 4095, 3028, 3919, + 4095, 3028, 3919, + 4095, 3029, 3919, + 4095, 3029, 3919, + 4095, 3030, 3919, + 4095, 3031, 3919, + 4095, 3032, 3918, + 4095, 3034, 3918, + 4095, 3036, 3917, + 4095, 3039, 3917, + 4095, 3044, 3916, + 4095, 3049, 3914, + 4095, 3056, 3913, + 4095, 3066, 3910, + 4095, 3078, 3907, + 4095, 3094, 3903, + 4095, 3115, 3897, + 4095, 3141, 3889, + 4095, 3174, 3878, + 4095, 3214, 3863, + 4095, 3263, 3843, + 4095, 3321, 3814, + 4095, 3389, 3772, + 4085, 3467, 3709, + 4030, 3553, 3608, + 3943, 3647, 3424, + 3794, 3749, 2925, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3158, 4051, + 4095, 3159, 4051, + 4095, 3159, 4051, + 4095, 3159, 4051, + 4095, 3160, 4051, + 4095, 3160, 4051, + 4095, 3161, 4051, + 4095, 3162, 4050, + 4095, 3163, 4050, + 4095, 3165, 4050, + 4095, 3167, 4049, + 4095, 3170, 4048, + 4095, 3175, 4047, + 4095, 3180, 4046, + 4095, 3187, 4044, + 4095, 3197, 4042, + 4095, 3209, 4039, + 4095, 3225, 4035, + 4095, 3246, 4029, + 4095, 3272, 4021, + 4095, 3305, 4010, + 4095, 3346, 3995, + 4095, 3395, 3975, + 4095, 3453, 3946, + 4095, 3521, 3903, + 4095, 3598, 3840, + 4095, 3685, 3739, + 4075, 3779, 3555, + 0, 1092, 1347, + 0, 1097, 1342, + 0, 1104, 1336, + 0, 1112, 1327, + 0, 1124, 1315, + 0, 1139, 1298, + 0, 1159, 1275, + 0, 1183, 1242, + 0, 1215, 1193, + 0, 1253, 1119, + 0, 1300, 996, + 0, 1356, 751, + 0, 1422, 0, + 0, 1497, 0, + 0, 1581, 0, + 0, 1674, 0, + 0, 1774, 0, + 0, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1093, 1354, + 0, 1098, 1350, + 0, 1105, 1343, + 0, 1114, 1335, + 0, 1126, 1323, + 0, 1141, 1306, + 0, 1160, 1283, + 0, 1185, 1251, + 0, 1216, 1203, + 0, 1254, 1131, + 0, 1301, 1011, + 0, 1357, 777, + 0, 1423, 0, + 0, 1498, 0, + 0, 1582, 0, + 0, 1674, 0, + 0, 1775, 0, + 0, 1881, 0, + 0, 1993, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1096, 1364, + 0, 1101, 1359, + 0, 1107, 1353, + 0, 1116, 1344, + 0, 1128, 1333, + 0, 1143, 1317, + 0, 1162, 1294, + 0, 1187, 1262, + 0, 1218, 1216, + 0, 1256, 1146, + 0, 1303, 1031, + 0, 1359, 809, + 0, 1424, 0, + 0, 1499, 0, + 0, 1583, 0, + 0, 1675, 0, + 0, 1775, 0, + 0, 1882, 0, + 0, 1994, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1099, 1376, + 0, 1104, 1371, + 0, 1110, 1365, + 0, 1119, 1357, + 0, 1131, 1346, + 0, 1146, 1330, + 0, 1165, 1308, + 0, 1189, 1278, + 0, 1220, 1233, + 0, 1258, 1165, + 0, 1305, 1056, + 0, 1360, 850, + 0, 1425, 185, + 0, 1500, 0, + 0, 1584, 0, + 0, 1676, 0, + 0, 1776, 0, + 0, 1882, 0, + 0, 1994, 0, + 0, 2110, 0, + 0, 2230, 0, + 0, 2353, 0, + 0, 2478, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1103, 1392, + 0, 1108, 1387, + 0, 1114, 1381, + 0, 1123, 1373, + 0, 1135, 1363, + 0, 1149, 1348, + 0, 1168, 1327, + 0, 1193, 1297, + 0, 1223, 1255, + 0, 1261, 1190, + 0, 1307, 1087, + 0, 1363, 898, + 0, 1427, 365, + 0, 1502, 0, + 0, 1585, 0, + 0, 1677, 0, + 0, 1777, 0, + 0, 1883, 0, + 0, 1995, 0, + 0, 2111, 0, + 0, 2231, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1108, 1412, + 0, 1113, 1408, + 0, 1120, 1402, + 0, 1128, 1395, + 0, 1140, 1384, + 0, 1154, 1370, + 0, 1173, 1350, + 0, 1197, 1322, + 0, 1227, 1282, + 0, 1265, 1222, + 0, 1311, 1126, + 0, 1366, 956, + 0, 1430, 530, + 0, 1504, 0, + 0, 1587, 0, + 0, 1679, 0, + 0, 1778, 0, + 0, 1884, 0, + 0, 1995, 0, + 0, 2112, 0, + 0, 2231, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2605, 0, + 0, 2733, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3122, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 0, 1115, 1438, + 0, 1120, 1434, + 0, 1127, 1429, + 0, 1135, 1421, + 0, 1146, 1412, + 0, 1161, 1398, + 0, 1179, 1380, + 0, 1203, 1353, + 0, 1233, 1316, + 0, 1270, 1260, + 0, 1315, 1173, + 0, 1370, 1023, + 0, 1434, 686, + 0, 1507, 0, + 0, 1590, 0, + 0, 1681, 0, + 0, 1780, 0, + 0, 1885, 0, + 0, 1996, 0, + 0, 2112, 0, + 0, 2232, 0, + 0, 2354, 0, + 0, 2479, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2862, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 503, 1125, 1470, + 461, 1130, 1467, + 397, 1136, 1462, + 296, 1144, 1455, + 111, 1155, 1446, + 0, 1169, 1433, + 0, 1188, 1416, + 0, 1211, 1392, + 0, 1240, 1358, + 0, 1277, 1307, + 0, 1322, 1230, + 0, 1375, 1100, + 0, 1438, 834, + 0, 1511, 0, + 0, 1593, 0, + 0, 1683, 0, + 0, 1782, 0, + 0, 1887, 0, + 0, 1998, 0, + 0, 2113, 0, + 0, 2233, 0, + 0, 2355, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2992, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3384, 0, + 0, 3516, 0, + 0, 3647, 0, + 919, 1137, 1510, + 902, 1142, 1507, + 879, 1148, 1502, + 847, 1156, 1496, + 799, 1167, 1488, + 726, 1180, 1477, + 606, 1198, 1461, + 371, 1221, 1439, + 0, 1250, 1409, + 0, 1286, 1364, + 0, 1330, 1296, + 0, 1382, 1186, + 0, 1444, 978, + 0, 1516, 303, + 0, 1597, 0, + 0, 1687, 0, + 0, 1785, 0, + 0, 1889, 0, + 0, 2000, 0, + 0, 2115, 0, + 0, 2234, 0, + 0, 2356, 0, + 0, 2480, 0, + 0, 2606, 0, + 0, 2734, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3253, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1186, 1153, 1559, + 1177, 1158, 1556, + 1165, 1164, 1552, + 1148, 1171, 1546, + 1124, 1182, 1539, + 1090, 1195, 1529, + 1039, 1212, 1515, + 962, 1234, 1496, + 834, 1262, 1468, + 572, 1297, 1429, + 0, 1340, 1371, + 0, 1392, 1280, + 0, 1453, 1119, + 0, 1523, 738, + 0, 1603, 0, + 0, 1692, 0, + 0, 1789, 0, + 0, 1892, 0, + 0, 2002, 0, + 0, 2117, 0, + 0, 2235, 0, + 0, 2357, 0, + 0, 2481, 0, + 0, 2607, 0, + 0, 2735, 0, + 0, 2863, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1398, 1174, 1617, + 1393, 1178, 1614, + 1385, 1184, 1610, + 1375, 1191, 1606, + 1360, 1201, 1599, + 1340, 1214, 1590, + 1312, 1230, 1578, + 1271, 1251, 1561, + 1211, 1278, 1538, + 1114, 1312, 1505, + 942, 1354, 1456, + 504, 1404, 1382, + 0, 1463, 1258, + 0, 1532, 1012, + 0, 1611, 0, + 0, 1698, 0, + 0, 1794, 0, + 0, 1896, 0, + 0, 2005, 0, + 0, 2119, 0, + 0, 2237, 0, + 0, 2358, 0, + 0, 2482, 0, + 0, 2608, 0, + 0, 2735, 0, + 0, 2864, 0, + 0, 2993, 0, + 0, 3123, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3647, 0, + 1582, 1200, 1684, + 1579, 1204, 1682, + 1573, 1209, 1679, + 1567, 1216, 1674, + 1557, 1225, 1669, + 1544, 1237, 1661, + 1527, 1253, 1651, + 1502, 1273, 1637, + 1466, 1299, 1617, + 1414, 1331, 1589, + 1332, 1371, 1549, + 1195, 1420, 1489, + 903, 1477, 1395, + 0, 1544, 1226, + 0, 1621, 810, + 0, 1707, 0, + 0, 1801, 0, + 0, 1902, 0, + 0, 2010, 0, + 0, 2123, 0, + 0, 2240, 0, + 0, 2360, 0, + 0, 2484, 0, + 0, 2609, 0, + 0, 2736, 0, + 0, 2864, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 1750, 1232, 1761, + 1747, 1236, 1759, + 1744, 1241, 1756, + 1739, 1248, 1753, + 1732, 1256, 1748, + 1724, 1268, 1742, + 1712, 1282, 1733, + 1695, 1301, 1721, + 1672, 1326, 1705, + 1640, 1356, 1682, + 1592, 1394, 1650, + 1520, 1440, 1602, + 1400, 1495, 1530, + 1165, 1560, 1412, + 102, 1634, 1180, + 0, 1718, 189, + 0, 1809, 0, + 0, 1909, 0, + 0, 2015, 0, + 0, 2127, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 1906, 1272, 1846, + 1905, 1276, 1845, + 1902, 1280, 1843, + 1899, 1286, 1840, + 1894, 1294, 1836, + 1888, 1305, 1831, + 1880, 1319, 1824, + 1869, 1336, 1814, + 1853, 1359, 1801, + 1831, 1387, 1782, + 1801, 1422, 1757, + 1756, 1466, 1720, + 1689, 1518, 1665, + 1580, 1580, 1580, + 1375, 1651, 1434, + 723, 1732, 1111, + 0, 1821, 0, + 0, 1918, 0, + 0, 2023, 0, + 0, 2133, 0, + 0, 2248, 0, + 0, 2366, 0, + 0, 2488, 0, + 0, 2613, 0, + 0, 2739, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2056, 1321, 1941, + 2055, 1324, 1939, + 2053, 1328, 1938, + 2051, 1334, 1935, + 2047, 1341, 1932, + 2043, 1350, 1928, + 2037, 1363, 1922, + 2029, 1379, 1914, + 2018, 1399, 1904, + 2003, 1425, 1889, + 1983, 1458, 1869, + 1953, 1498, 1840, + 1911, 1547, 1799, + 1847, 1605, 1737, + 1745, 1673, 1639, + 1558, 1750, 1461, + 1037, 1836, 997, + 0, 1931, 0, + 0, 2032, 0, + 0, 2140, 0, + 0, 2254, 0, + 0, 2371, 0, + 0, 2492, 0, + 0, 2615, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2996, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 2201, 1379, 2042, + 2200, 1382, 2041, + 2199, 1386, 2040, + 2197, 1390, 2038, + 2195, 1397, 2035, + 2191, 1405, 2032, + 2187, 1416, 2027, + 2182, 1430, 2021, + 2174, 1449, 2013, + 2163, 1472, 2001, + 2149, 1502, 1986, + 2129, 1538, 1964, + 2100, 1583, 1933, + 2059, 1637, 1887, + 1998, 1701, 1819, + 1900, 1774, 1707, + 1724, 1856, 1496, + 1270, 1947, 780, + 0, 2045, 0, + 0, 2151, 0, + 0, 2262, 0, + 0, 2377, 0, + 0, 2497, 0, + 0, 2619, 0, + 0, 2744, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2342, 1447, 2150, + 2342, 1449, 2149, + 2341, 1452, 2148, + 2339, 1456, 2146, + 2338, 1462, 2145, + 2335, 1469, 2142, + 2332, 1479, 2138, + 2328, 1491, 2133, + 2323, 1507, 2127, + 2315, 1528, 2118, + 2305, 1554, 2106, + 2290, 1587, 2089, + 2271, 1628, 2066, + 2243, 1677, 2032, + 2203, 1735, 1984, + 2143, 1803, 1909, + 2049, 1881, 1785, + 1880, 1967, 1538, + 1465, 2062, 3, + 0, 2164, 0, + 0, 2272, 0, + 0, 2385, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2481, 1524, 2263, + 2481, 1526, 2262, + 2480, 1528, 2261, + 2479, 1532, 2260, + 2478, 1537, 2259, + 2476, 1543, 2257, + 2474, 1551, 2254, + 2471, 1561, 2250, + 2467, 1575, 2245, + 2461, 1593, 2238, + 2454, 1616, 2229, + 2444, 1645, 2216, + 2430, 1681, 2199, + 2410, 1725, 2174, + 2383, 1778, 2139, + 2344, 1840, 2087, + 2285, 1912, 2007, + 2193, 1993, 1872, + 2030, 2083, 1589, + 1639, 2181, 0, + 0, 2285, 0, + 0, 2396, 0, + 0, 2511, 0, + 0, 2630, 0, + 0, 2752, 0, + 0, 2876, 0, + 0, 3003, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2618, 1610, 2380, + 2618, 1611, 2380, + 2617, 1614, 2379, + 2617, 1617, 2378, + 2616, 1620, 2377, + 2615, 1626, 2375, + 2613, 1632, 2373, + 2611, 1641, 2370, + 2608, 1653, 2367, + 2604, 1668, 2361, + 2598, 1687, 2354, + 2591, 1712, 2345, + 2581, 1743, 2331, + 2567, 1782, 2313, + 2548, 1829, 2287, + 2521, 1885, 2251, + 2482, 1950, 2197, + 2424, 2026, 2112, + 2333, 2110, 1967, + 2174, 2202, 1650, + 1800, 2303, 0, + 0, 2409, 0, + 0, 2522, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 2754, 1704, 2501, + 2754, 1705, 2500, + 2754, 1707, 2500, + 2753, 1710, 2499, + 2752, 1713, 2498, + 2751, 1717, 2497, + 2750, 1723, 2496, + 2749, 1730, 2493, + 2746, 1739, 2490, + 2743, 1752, 2486, + 2739, 1768, 2481, + 2734, 1789, 2474, + 2727, 1815, 2464, + 2717, 1849, 2450, + 2703, 1889, 2432, + 2684, 1939, 2405, + 2657, 1997, 2367, + 2619, 2066, 2311, + 2562, 2143, 2223, + 2472, 2230, 2069, + 2315, 2325, 1720, + 1952, 2427, 0, + 0, 2535, 0, + 0, 2649, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3392, 0, + 0, 3522, 0, + 0, 3652, 0, + 2889, 1806, 2624, + 2889, 1807, 2624, + 2889, 1808, 2624, + 2888, 1810, 2623, + 2888, 1813, 2622, + 2887, 1816, 2621, + 2886, 1821, 2620, + 2885, 1826, 2619, + 2883, 1834, 2616, + 2881, 1844, 2613, + 2878, 1858, 2609, + 2874, 1875, 2604, + 2869, 1897, 2596, + 2861, 1925, 2586, + 2852, 1959, 2572, + 2838, 2002, 2553, + 2819, 2054, 2526, + 2792, 2114, 2487, + 2754, 2185, 2429, + 2698, 2265, 2338, + 2609, 2353, 2178, + 2454, 2450, 1799, + 2099, 2553, 0, + 0, 2663, 0, + 0, 2777, 0, + 0, 2896, 0, + 0, 3018, 0, + 0, 3142, 0, + 0, 3268, 0, + 0, 3395, 0, + 0, 3524, 0, + 0, 3653, 0, + 3023, 1914, 2750, + 3023, 1915, 2749, + 3023, 1916, 2749, + 3023, 1917, 2749, + 3022, 1919, 2748, + 3022, 1922, 2748, + 3021, 1925, 2747, + 3020, 1930, 2745, + 3019, 1936, 2744, + 3017, 1944, 2741, + 3015, 1955, 2738, + 3012, 1969, 2734, + 3008, 1987, 2729, + 3003, 2010, 2721, + 2996, 2039, 2711, + 2986, 2075, 2697, + 2972, 2119, 2677, + 2953, 2172, 2650, + 2927, 2235, 2610, + 2889, 2307, 2551, + 2833, 2388, 2457, + 2744, 2478, 2291, + 2591, 2576, 1888, + 2242, 2681, 0, + 0, 2792, 0, + 0, 2907, 0, + 0, 3026, 0, + 0, 3148, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3655, 0, + 3157, 2027, 2877, + 3157, 2028, 2877, + 3157, 2028, 2876, + 3156, 2030, 2876, + 3156, 2031, 2876, + 3156, 2033, 2875, + 3155, 2036, 2874, + 3155, 2040, 2874, + 3154, 2045, 2872, + 3152, 2051, 2871, + 3151, 2059, 2868, + 3149, 2071, 2865, + 3146, 2085, 2861, + 3142, 2104, 2855, + 3136, 2127, 2848, + 3129, 2157, 2837, + 3119, 2194, 2823, + 3106, 2240, 2803, + 3087, 2294, 2775, + 3061, 2358, 2735, + 3023, 2431, 2675, + 2967, 2514, 2579, + 2879, 2605, 2409, + 2727, 2704, 1984, + 2382, 2810, 0, + 0, 2921, 0, + 0, 3037, 0, + 0, 3157, 0, + 0, 3279, 0, + 0, 3404, 0, + 0, 3530, 0, + 0, 3658, 0, + 3290, 2144, 3005, + 3290, 2145, 3005, + 3290, 2145, 3005, + 3290, 2146, 3005, + 3290, 2148, 3004, + 3289, 2149, 3004, + 3289, 2151, 3003, + 3288, 2154, 3003, + 3288, 2158, 3002, + 3287, 2163, 3000, + 3286, 2170, 2999, + 3284, 2178, 2996, + 3282, 2190, 2993, + 3279, 2205, 2989, + 3275, 2224, 2983, + 3270, 2248, 2976, + 3262, 2279, 2965, + 3253, 2317, 2951, + 3239, 2363, 2931, + 3220, 2418, 2902, + 3194, 2483, 2862, + 3156, 2558, 2801, + 3101, 2641, 2704, + 3013, 2733, 2530, + 2862, 2833, 2087, + 2520, 2939, 0, + 0, 3051, 0, + 0, 3168, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 3423, 2265, 3134, + 3423, 2265, 3134, + 3423, 2266, 3134, + 3423, 2267, 3134, + 3423, 2268, 3134, + 3422, 2269, 3133, + 3422, 2270, 3133, + 3422, 2273, 3132, + 3421, 2276, 3132, + 3421, 2279, 3131, + 3420, 2285, 3130, + 3418, 2291, 3128, + 3417, 2300, 3125, + 3415, 2312, 3122, + 3412, 2327, 3118, + 3408, 2347, 3112, + 3403, 2371, 3105, + 3395, 2403, 3094, + 3386, 2441, 3080, + 3372, 2488, 3059, + 3353, 2545, 3031, + 3327, 2610, 2990, + 3290, 2685, 2928, + 3234, 2770, 2830, + 3147, 2863, 2654, + 2996, 2963, 2197, + 2656, 3070, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 3556, 2388, 3264, + 3556, 2389, 3264, + 3556, 2389, 3264, + 3556, 2390, 3264, + 3555, 2390, 3264, + 3555, 2391, 3264, + 3555, 2393, 3263, + 3555, 2394, 3263, + 3554, 2397, 3262, + 3554, 2400, 3262, + 3553, 2403, 3261, + 3552, 2409, 3259, + 3551, 2416, 3258, + 3550, 2425, 3255, + 3547, 2437, 3252, + 3544, 2452, 3248, + 3541, 2472, 3242, + 3535, 2497, 3234, + 3528, 2529, 3224, + 3518, 2568, 3209, + 3505, 2615, 3189, + 3486, 2672, 3160, + 3460, 2738, 3119, + 3422, 2814, 3057, + 3367, 2899, 2958, + 3280, 2992, 2780, + 3130, 3093, 2311, + 2791, 3200, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 3688, 2514, 3395, + 3688, 2514, 3395, + 3688, 2515, 3395, + 3688, 2515, 3395, + 3688, 2515, 3394, + 3688, 2516, 3394, + 3688, 2517, 3394, + 3688, 2518, 3394, + 3687, 2520, 3393, + 3687, 2522, 3393, + 3686, 2525, 3392, + 3686, 2529, 3391, + 3685, 2535, 3390, + 3684, 2542, 3388, + 3682, 2551, 3386, + 3680, 2563, 3383, + 3677, 2579, 3378, + 3673, 2599, 3373, + 3668, 2624, 3365, + 3661, 2656, 3354, + 3651, 2696, 3339, + 3637, 2744, 3319, + 3619, 2801, 3290, + 3593, 2868, 3249, + 3555, 2944, 3186, + 3500, 3029, 3087, + 3413, 3123, 2907, + 3263, 3224, 2429, + 2926, 3331, 0, + 0, 3444, 0, + 0, 3561, 0, + 0, 3682, 0, + 3821, 2641, 3526, + 3821, 2641, 3526, + 3821, 2641, 3526, + 3821, 2642, 3526, + 3821, 2642, 3525, + 3821, 2643, 3525, + 3820, 2643, 3525, + 3820, 2644, 3525, + 3820, 2646, 3525, + 3820, 2647, 3524, + 3819, 2650, 3524, + 3819, 2653, 3523, + 3818, 2657, 3522, + 3817, 2662, 3521, + 3816, 2669, 3519, + 3815, 2679, 3517, + 3812, 2691, 3513, + 3809, 2706, 3509, + 3806, 2727, 3503, + 3800, 2752, 3495, + 3793, 2785, 3485, + 3783, 2825, 3470, + 3770, 2873, 3450, + 3751, 2930, 3421, + 3725, 2998, 3379, + 3688, 3074, 3316, + 3632, 3160, 3216, + 3546, 3254, 3035, + 3396, 3355, 2551, + 3060, 3463, 0, + 0, 3576, 0, + 0, 3693, 0, + 3953, 2769, 3657, + 3953, 2770, 3657, + 3953, 2770, 3657, + 3953, 2770, 3657, + 3953, 2770, 3657, + 3953, 2771, 3657, + 3953, 2771, 3656, + 3953, 2772, 3656, + 3953, 2773, 3656, + 3952, 2774, 3656, + 3952, 2776, 3655, + 3952, 2778, 3655, + 3951, 2781, 3654, + 3951, 2785, 3653, + 3950, 2791, 3652, + 3948, 2798, 3650, + 3947, 2807, 3648, + 3945, 2820, 3644, + 3942, 2835, 3640, + 3938, 2856, 3634, + 3933, 2882, 3627, + 3925, 2914, 3616, + 3916, 2954, 3601, + 3902, 3003, 3581, + 3884, 3061, 3552, + 3858, 3128, 3510, + 3820, 3205, 3447, + 3765, 3291, 3347, + 3678, 3385, 3165, + 3528, 3486, 2675, + 3193, 3594, 0, + 0, 3707, 0, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2899, 3788, + 4085, 2900, 3788, + 4085, 2900, 3788, + 4085, 2901, 3788, + 4085, 2901, 3788, + 4085, 2902, 3787, + 4085, 2904, 3787, + 4084, 2905, 3787, + 4084, 2908, 3786, + 4084, 2911, 3785, + 4083, 2915, 3784, + 4082, 2920, 3783, + 4081, 2928, 3781, + 4079, 2937, 3779, + 4077, 2949, 3776, + 4074, 2965, 3772, + 4070, 2986, 3766, + 4065, 3012, 3758, + 4058, 3044, 3747, + 4048, 3084, 3732, + 4035, 3133, 3712, + 4016, 3191, 3683, + 3990, 3259, 3641, + 3952, 3336, 3578, + 3897, 3422, 3477, + 3811, 3516, 3295, + 3661, 3618, 2801, + 3326, 3726, 0, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3029, 3920, + 4095, 3030, 3920, + 4095, 3030, 3920, + 4095, 3031, 3919, + 4095, 3031, 3919, + 4095, 3032, 3919, + 4095, 3034, 3919, + 4095, 3035, 3918, + 4095, 3038, 3918, + 4095, 3041, 3917, + 4095, 3045, 3916, + 4095, 3050, 3915, + 4095, 3058, 3913, + 4095, 3067, 3911, + 4095, 3079, 3907, + 4095, 3095, 3903, + 4095, 3116, 3897, + 4095, 3142, 3889, + 4095, 3175, 3879, + 4095, 3215, 3864, + 4095, 3264, 3843, + 4095, 3322, 3814, + 4095, 3390, 3772, + 4085, 3467, 3709, + 4029, 3553, 3609, + 3943, 3648, 3425, + 3793, 3750, 2928, + 4095, 3159, 4052, + 4095, 3159, 4052, + 4095, 3159, 4052, + 4095, 3159, 4052, + 4095, 3160, 4052, + 4095, 3160, 4051, + 4095, 3160, 4051, + 4095, 3160, 4051, + 4095, 3161, 4051, + 4095, 3161, 4051, + 4095, 3162, 4051, + 4095, 3163, 4051, + 4095, 3164, 4050, + 4095, 3166, 4050, + 4095, 3168, 4049, + 4095, 3171, 4049, + 4095, 3176, 4048, + 4095, 3181, 4046, + 4095, 3188, 4045, + 4095, 3198, 4042, + 4095, 3210, 4039, + 4095, 3226, 4035, + 4095, 3247, 4029, + 4095, 3273, 4021, + 4095, 3306, 4010, + 4095, 3346, 3996, + 4095, 3395, 3975, + 4095, 3454, 3946, + 4095, 3521, 3904, + 4095, 3599, 3841, + 4095, 3685, 3740, + 4075, 3780, 3556, + 0, 1218, 1478, + 0, 1222, 1474, + 0, 1228, 1469, + 0, 1234, 1463, + 0, 1243, 1454, + 0, 1255, 1441, + 0, 1270, 1424, + 0, 1290, 1401, + 0, 1314, 1367, + 0, 1346, 1318, + 0, 1384, 1242, + 0, 1431, 1116, + 0, 1488, 863, + 0, 1553, 0, + 0, 1629, 0, + 0, 1713, 0, + 0, 1806, 0, + 0, 1906, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1220, 1483, + 0, 1224, 1479, + 0, 1229, 1475, + 0, 1236, 1468, + 0, 1245, 1459, + 0, 1256, 1447, + 0, 1271, 1430, + 0, 1291, 1407, + 0, 1316, 1374, + 0, 1347, 1325, + 0, 1385, 1251, + 0, 1432, 1128, + 0, 1488, 883, + 0, 1554, 0, + 0, 1629, 0, + 0, 1713, 0, + 0, 1806, 0, + 0, 1906, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1222, 1490, + 0, 1225, 1486, + 0, 1231, 1482, + 0, 1237, 1475, + 0, 1246, 1467, + 0, 1258, 1455, + 0, 1273, 1438, + 0, 1292, 1415, + 0, 1317, 1383, + 0, 1348, 1335, + 0, 1387, 1263, + 0, 1433, 1143, + 0, 1489, 909, + 0, 1555, 0, + 0, 1630, 0, + 0, 1714, 0, + 0, 1807, 0, + 0, 1907, 0, + 0, 2013, 0, + 0, 2125, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1224, 1499, + 0, 1228, 1496, + 0, 1233, 1491, + 0, 1240, 1485, + 0, 1248, 1476, + 0, 1260, 1465, + 0, 1275, 1449, + 0, 1294, 1426, + 0, 1319, 1395, + 0, 1350, 1348, + 0, 1388, 1278, + 0, 1435, 1163, + 0, 1491, 942, + 0, 1556, 111, + 0, 1631, 0, + 0, 1715, 0, + 0, 1807, 0, + 0, 1907, 0, + 0, 2014, 0, + 0, 2126, 0, + 0, 2242, 0, + 0, 2362, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1227, 1511, + 0, 1231, 1508, + 0, 1236, 1503, + 0, 1243, 1497, + 0, 1251, 1489, + 0, 1263, 1478, + 0, 1278, 1462, + 0, 1297, 1441, + 0, 1321, 1410, + 0, 1352, 1365, + 0, 1390, 1298, + 0, 1437, 1188, + 0, 1492, 982, + 0, 1557, 317, + 0, 1632, 0, + 0, 1716, 0, + 0, 1808, 0, + 0, 1908, 0, + 0, 2014, 0, + 0, 2126, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2485, 0, + 0, 2610, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1231, 1527, + 0, 1235, 1524, + 0, 1240, 1519, + 0, 1247, 1514, + 0, 1255, 1506, + 0, 1267, 1495, + 0, 1281, 1480, + 0, 1300, 1459, + 0, 1325, 1429, + 0, 1355, 1387, + 0, 1393, 1322, + 0, 1439, 1219, + 0, 1495, 1030, + 0, 1559, 497, + 0, 1634, 0, + 0, 1717, 0, + 0, 1809, 0, + 0, 1909, 0, + 0, 2015, 0, + 0, 2127, 0, + 0, 2243, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3254, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1237, 1547, + 0, 1240, 1544, + 0, 1245, 1540, + 0, 1252, 1534, + 0, 1260, 1527, + 0, 1272, 1516, + 0, 1286, 1502, + 0, 1305, 1482, + 0, 1329, 1454, + 0, 1360, 1414, + 0, 1397, 1354, + 0, 1443, 1258, + 0, 1498, 1088, + 0, 1562, 662, + 0, 1636, 0, + 0, 1719, 0, + 0, 1811, 0, + 0, 1910, 0, + 0, 2016, 0, + 0, 2128, 0, + 0, 2244, 0, + 0, 2363, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2737, 0, + 0, 2865, 0, + 0, 2994, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 0, 1244, 1573, + 0, 1248, 1570, + 0, 1252, 1566, + 0, 1259, 1561, + 0, 1267, 1554, + 0, 1278, 1544, + 0, 1293, 1530, + 0, 1311, 1512, + 0, 1335, 1486, + 0, 1365, 1448, + 0, 1402, 1392, + 0, 1448, 1306, + 0, 1502, 1155, + 0, 1566, 818, + 0, 1639, 0, + 0, 1722, 0, + 0, 1813, 0, + 0, 1912, 0, + 0, 2017, 0, + 0, 2129, 0, + 0, 2244, 0, + 0, 2364, 0, + 0, 2486, 0, + 0, 2611, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3516, 0, + 0, 3648, 0, + 664, 1253, 1605, + 635, 1257, 1602, + 593, 1262, 1599, + 530, 1268, 1594, + 428, 1276, 1587, + 243, 1287, 1578, + 0, 1301, 1566, + 0, 1320, 1548, + 0, 1343, 1524, + 0, 1372, 1490, + 0, 1409, 1440, + 0, 1454, 1362, + 0, 1507, 1232, + 0, 1570, 966, + 0, 1643, 0, + 0, 1725, 0, + 0, 1816, 0, + 0, 1914, 0, + 0, 2019, 0, + 0, 2130, 0, + 0, 2245, 0, + 0, 2365, 0, + 0, 2487, 0, + 0, 2612, 0, + 0, 2738, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3124, 0, + 0, 3255, 0, + 0, 3385, 0, + 0, 3517, 0, + 0, 3648, 0, + 1063, 1266, 1645, + 1051, 1269, 1642, + 1034, 1274, 1639, + 1011, 1280, 1635, + 979, 1288, 1628, + 931, 1299, 1620, + 858, 1313, 1609, + 738, 1330, 1593, + 503, 1353, 1571, + 0, 1382, 1541, + 0, 1418, 1496, + 0, 1462, 1428, + 0, 1514, 1318, + 0, 1577, 1110, + 0, 1648, 435, + 0, 1729, 0, + 0, 1819, 0, + 0, 1917, 0, + 0, 2021, 0, + 0, 2132, 0, + 0, 2247, 0, + 0, 2366, 0, + 0, 2488, 0, + 0, 2612, 0, + 0, 2739, 0, + 0, 2866, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1325, 1282, 1693, + 1318, 1285, 1691, + 1309, 1290, 1688, + 1297, 1296, 1684, + 1280, 1303, 1678, + 1256, 1314, 1671, + 1222, 1327, 1661, + 1172, 1344, 1647, + 1095, 1366, 1628, + 966, 1394, 1601, + 704, 1429, 1562, + 0, 1472, 1503, + 0, 1524, 1412, + 0, 1585, 1251, + 0, 1655, 870, + 0, 1735, 0, + 0, 1824, 0, + 0, 1921, 0, + 0, 2024, 0, + 0, 2134, 0, + 0, 2249, 0, + 0, 2367, 0, + 0, 2489, 0, + 0, 2613, 0, + 0, 2739, 0, + 0, 2867, 0, + 0, 2995, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1535, 1302, 1751, + 1530, 1306, 1749, + 1525, 1310, 1746, + 1517, 1316, 1742, + 1507, 1323, 1738, + 1492, 1333, 1731, + 1472, 1346, 1722, + 1444, 1362, 1710, + 1404, 1384, 1693, + 1343, 1411, 1670, + 1246, 1444, 1637, + 1074, 1486, 1588, + 636, 1536, 1514, + 0, 1595, 1390, + 0, 1664, 1144, + 0, 1743, 0, + 0, 1830, 0, + 0, 1926, 0, + 0, 2029, 0, + 0, 2137, 0, + 0, 2251, 0, + 0, 2369, 0, + 0, 2490, 0, + 0, 2614, 0, + 0, 2740, 0, + 0, 2867, 0, + 0, 2996, 0, + 0, 3125, 0, + 0, 3255, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1717, 1329, 1818, + 1714, 1332, 1816, + 1711, 1336, 1814, + 1706, 1341, 1811, + 1699, 1348, 1806, + 1689, 1357, 1801, + 1676, 1370, 1793, + 1659, 1385, 1783, + 1634, 1406, 1769, + 1598, 1431, 1749, + 1546, 1464, 1721, + 1465, 1503, 1681, + 1327, 1552, 1621, + 1035, 1609, 1527, + 0, 1676, 1358, + 0, 1753, 942, + 0, 1839, 0, + 0, 1933, 0, + 0, 2034, 0, + 0, 2142, 0, + 0, 2255, 0, + 0, 2372, 0, + 0, 2492, 0, + 0, 2616, 0, + 0, 2741, 0, + 0, 2868, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 1884, 1361, 1894, + 1882, 1364, 1893, + 1879, 1368, 1891, + 1876, 1373, 1888, + 1871, 1380, 1885, + 1865, 1388, 1880, + 1856, 1400, 1874, + 1844, 1414, 1865, + 1827, 1433, 1853, + 1805, 1458, 1837, + 1772, 1488, 1814, + 1724, 1526, 1782, + 1652, 1572, 1734, + 1532, 1627, 1662, + 1297, 1692, 1544, + 234, 1766, 1313, + 0, 1850, 322, + 0, 1942, 0, + 0, 2041, 0, + 0, 2147, 0, + 0, 2259, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 2040, 1402, 1980, + 2038, 1405, 1979, + 2037, 1408, 1977, + 2034, 1413, 1975, + 2031, 1419, 1972, + 2026, 1427, 1968, + 2020, 1437, 1963, + 2012, 1451, 1956, + 2001, 1468, 1946, + 1985, 1491, 1933, + 1964, 1519, 1914, + 1933, 1555, 1889, + 1888, 1598, 1852, + 1821, 1650, 1797, + 1712, 1712, 1712, + 1507, 1783, 1566, + 855, 1864, 1243, + 0, 1953, 0, + 0, 2051, 0, + 0, 2155, 0, + 0, 2265, 0, + 0, 2380, 0, + 0, 2499, 0, + 0, 2620, 0, + 0, 2745, 0, + 0, 2871, 0, + 0, 2999, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 2189, 1451, 2074, + 2188, 1453, 2073, + 2187, 1456, 2071, + 2185, 1461, 2070, + 2183, 1466, 2067, + 2180, 1473, 2064, + 2175, 1483, 2060, + 2169, 1495, 2054, + 2161, 1511, 2046, + 2151, 1531, 2036, + 2136, 1557, 2021, + 2115, 1590, 2001, + 2085, 1630, 1972, + 2043, 1679, 1931, + 1979, 1737, 1869, + 1877, 1805, 1771, + 1690, 1882, 1593, + 1170, 1968, 1129, + 0, 2063, 0, + 0, 2165, 0, + 0, 2273, 0, + 0, 2386, 0, + 0, 2503, 0, + 0, 2624, 0, + 0, 2747, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2334, 1509, 2175, + 2333, 1511, 2174, + 2332, 1514, 2173, + 2331, 1518, 2172, + 2329, 1522, 2170, + 2327, 1529, 2167, + 2324, 1537, 2164, + 2319, 1548, 2159, + 2314, 1562, 2153, + 2306, 1581, 2145, + 2295, 1604, 2134, + 2281, 1634, 2118, + 2261, 1671, 2096, + 2232, 1716, 2065, + 2191, 1769, 2019, + 2130, 1833, 1951, + 2032, 1906, 1839, + 1856, 1988, 1628, + 1402, 2079, 912, + 0, 2177, 0, + 0, 2283, 0, + 0, 2394, 0, + 0, 2509, 0, + 0, 2629, 0, + 0, 2751, 0, + 0, 2876, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2475, 1577, 2283, + 2474, 1579, 2282, + 2474, 1581, 2281, + 2473, 1584, 2280, + 2472, 1588, 2279, + 2470, 1594, 2277, + 2468, 1601, 2274, + 2464, 1611, 2270, + 2460, 1623, 2266, + 2455, 1639, 2259, + 2447, 1660, 2250, + 2437, 1686, 2238, + 2423, 1719, 2221, + 2403, 1760, 2198, + 2375, 1809, 2165, + 2335, 1867, 2116, + 2275, 1935, 2041, + 2181, 2013, 1917, + 2012, 2099, 1670, + 1597, 2194, 135, + 0, 2296, 0, + 0, 2404, 0, + 0, 2517, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2879, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2614, 1654, 2395, + 2613, 1656, 2395, + 2613, 1658, 2394, + 2612, 1660, 2393, + 2611, 1664, 2392, + 2610, 1669, 2391, + 2608, 1675, 2389, + 2606, 1683, 2386, + 2603, 1694, 2382, + 2599, 1707, 2377, + 2593, 1725, 2370, + 2586, 1748, 2361, + 2576, 1777, 2348, + 2562, 1813, 2331, + 2542, 1857, 2306, + 2515, 1910, 2271, + 2476, 1972, 2219, + 2417, 2044, 2139, + 2325, 2125, 2004, + 2162, 2215, 1721, + 1771, 2313, 0, + 0, 2417, 0, + 0, 2528, 0, + 0, 2643, 0, + 0, 2762, 0, + 0, 2884, 0, + 0, 3009, 0, + 0, 3135, 0, + 0, 3263, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2751, 1741, 2513, + 2750, 1742, 2512, + 2750, 1744, 2512, + 2750, 1746, 2511, + 2749, 1749, 2510, + 2748, 1753, 2509, + 2747, 1758, 2507, + 2745, 1764, 2505, + 2743, 1773, 2502, + 2740, 1785, 2499, + 2736, 1800, 2493, + 2730, 1819, 2486, + 2723, 1844, 2477, + 2713, 1875, 2464, + 2699, 1914, 2445, + 2680, 1961, 2420, + 2653, 2017, 2383, + 2614, 2083, 2329, + 2556, 2158, 2244, + 2466, 2242, 2099, + 2306, 2335, 1782, + 1932, 2435, 0, + 0, 2542, 0, + 0, 2654, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2887, 1835, 2633, + 2886, 1836, 2633, + 2886, 1838, 2633, + 2886, 1839, 2632, + 2885, 1842, 2631, + 2884, 1845, 2630, + 2884, 1849, 2629, + 2882, 1855, 2628, + 2881, 1862, 2625, + 2878, 1872, 2623, + 2875, 1884, 2619, + 2871, 1900, 2613, + 2866, 1921, 2606, + 2859, 1948, 2596, + 2849, 1981, 2582, + 2835, 2021, 2564, + 2816, 2071, 2537, + 2789, 2130, 2499, + 2751, 2198, 2443, + 2694, 2275, 2355, + 2604, 2362, 2201, + 2447, 2457, 1852, + 2084, 2559, 0, + 0, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3143, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 3021, 1937, 2757, + 3021, 1938, 2756, + 3021, 1939, 2756, + 3021, 1940, 2756, + 3020, 1942, 2755, + 3020, 1945, 2754, + 3019, 1948, 2754, + 3018, 1953, 2752, + 3017, 1959, 2751, + 3015, 1966, 2748, + 3013, 1977, 2745, + 3010, 1990, 2741, + 3006, 2007, 2736, + 3001, 2029, 2728, + 2994, 2057, 2718, + 2984, 2092, 2705, + 2970, 2134, 2685, + 2951, 2186, 2658, + 2924, 2247, 2619, + 2886, 2317, 2561, + 2830, 2397, 2470, + 2741, 2485, 2310, + 2586, 2582, 1931, + 2231, 2685, 0, + 0, 2795, 0, + 0, 2910, 0, + 0, 3028, 0, + 0, 3150, 0, + 0, 3274, 0, + 0, 3400, 0, + 0, 3527, 0, + 0, 3656, 0, + 3155, 2045, 2882, + 3155, 2046, 2882, + 3155, 2047, 2882, + 3155, 2048, 2881, + 3155, 2049, 2881, + 3154, 2051, 2880, + 3154, 2054, 2880, + 3153, 2057, 2879, + 3152, 2062, 2877, + 3151, 2068, 2876, + 3149, 2077, 2874, + 3147, 2087, 2870, + 3144, 2101, 2866, + 3140, 2119, 2861, + 3135, 2142, 2853, + 3128, 2171, 2843, + 3118, 2207, 2829, + 3104, 2251, 2809, + 3085, 2304, 2782, + 3059, 2367, 2742, + 3021, 2439, 2683, + 2965, 2520, 2589, + 2877, 2610, 2423, + 2723, 2708, 2020, + 2374, 2813, 0, + 0, 2924, 0, + 0, 3039, 0, + 0, 3158, 0, + 0, 3280, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 3289, 2158, 3009, + 3289, 2159, 3009, + 3289, 2160, 3009, + 3289, 2160, 3009, + 3288, 2162, 3008, + 3288, 2163, 3008, + 3288, 2165, 3007, + 3287, 2168, 3007, + 3287, 2172, 3006, + 3286, 2177, 3004, + 3285, 2183, 3003, + 3283, 2192, 3000, + 3281, 2203, 2997, + 3278, 2217, 2993, + 3274, 2236, 2988, + 3269, 2259, 2980, + 3261, 2289, 2969, + 3251, 2326, 2955, + 3238, 2372, 2935, + 3219, 2426, 2907, + 3193, 2490, 2867, + 3155, 2563, 2807, + 3099, 2646, 2711, + 3011, 2737, 2541, + 2859, 2836, 2116, + 2514, 2942, 0, + 0, 3053, 0, + 0, 3169, 0, + 0, 3289, 0, + 0, 3411, 0, + 0, 3536, 0, + 0, 3662, 0, + 3422, 2276, 3137, + 3422, 2276, 3137, + 3422, 2277, 3137, + 3422, 2278, 3137, + 3422, 2278, 3137, + 3422, 2280, 3136, + 3421, 2281, 3136, + 3421, 2283, 3135, + 3420, 2286, 3135, + 3420, 2290, 3134, + 3419, 2295, 3133, + 3418, 2302, 3131, + 3416, 2310, 3128, + 3414, 2322, 3125, + 3411, 2337, 3121, + 3407, 2356, 3115, + 3402, 2380, 3108, + 3394, 2411, 3097, + 3385, 2449, 3083, + 3371, 2495, 3063, + 3352, 2551, 3035, + 3326, 2615, 2994, + 3289, 2690, 2933, + 3233, 2773, 2836, + 3145, 2866, 2662, + 2994, 2965, 2219, + 2652, 3072, 0, + 0, 3183, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3542, 0, + 0, 3667, 0, + 3555, 2397, 3267, + 3555, 2397, 3266, + 3555, 2398, 3266, + 3555, 2398, 3266, + 3555, 2399, 3266, + 3555, 2400, 3266, + 3555, 2401, 3266, + 3554, 2403, 3265, + 3554, 2405, 3265, + 3553, 2408, 3264, + 3553, 2412, 3263, + 3552, 2417, 3262, + 3551, 2423, 3260, + 3549, 2432, 3258, + 3547, 2444, 3254, + 3544, 2459, 3250, + 3540, 2479, 3245, + 3535, 2504, 3237, + 3527, 2535, 3226, + 3518, 2573, 3212, + 3504, 2621, 3191, + 3485, 2677, 3163, + 3459, 2742, 3122, + 3422, 2818, 3060, + 3366, 2902, 2962, + 3279, 2995, 2786, + 3128, 3095, 2329, + 2788, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 3688, 2520, 3396, + 3688, 2521, 3396, + 3688, 2521, 3396, + 3688, 2521, 3396, + 3688, 2522, 3396, + 3688, 2522, 3396, + 3687, 2523, 3396, + 3687, 2525, 3395, + 3687, 2526, 3395, + 3687, 2529, 3394, + 3686, 2532, 3394, + 3685, 2536, 3393, + 3684, 2541, 3391, + 3683, 2548, 3390, + 3682, 2557, 3387, + 3679, 2569, 3384, + 3677, 2584, 3380, + 3673, 2604, 3374, + 3667, 2629, 3366, + 3660, 2661, 3356, + 3650, 2700, 3341, + 3637, 2748, 3321, + 3618, 2804, 3292, + 3592, 2871, 3251, + 3555, 2946, 3189, + 3499, 3031, 3090, + 3412, 3125, 2912, + 3262, 3225, 2443, + 2923, 3332, 0, + 0, 3445, 0, + 0, 3562, 0, + 0, 3682, 0, + 3820, 2646, 3527, + 3820, 2646, 3527, + 3820, 2646, 3527, + 3820, 2647, 3527, + 3820, 2647, 3527, + 3820, 2648, 3527, + 3820, 2648, 3526, + 3820, 2649, 3526, + 3820, 2651, 3526, + 3819, 2652, 3525, + 3819, 2654, 3525, + 3819, 2658, 3524, + 3818, 2662, 3523, + 3817, 2667, 3522, + 3816, 2674, 3520, + 3814, 2683, 3518, + 3812, 2695, 3515, + 3809, 2711, 3510, + 3805, 2731, 3505, + 3800, 2756, 3497, + 3793, 2788, 3486, + 3783, 2828, 3471, + 3769, 2876, 3451, + 3751, 2933, 3422, + 3725, 3000, 3381, + 3687, 3076, 3318, + 3632, 3161, 3219, + 3545, 3255, 3039, + 3395, 3356, 2562, + 3058, 3463, 0, + 0, 3576, 0, + 0, 3693, 0, + 3953, 2773, 3658, + 3953, 2773, 3658, + 3953, 2773, 3658, + 3953, 2774, 3658, + 3953, 2774, 3658, + 3953, 2774, 3658, + 3953, 2775, 3657, + 3953, 2776, 3657, + 3952, 2777, 3657, + 3952, 2778, 3657, + 3952, 2780, 3656, + 3952, 2782, 3656, + 3951, 2785, 3655, + 3950, 2789, 3654, + 3949, 2794, 3653, + 3948, 2801, 3651, + 3947, 2811, 3649, + 3944, 2823, 3645, + 3942, 2839, 3641, + 3938, 2859, 3635, + 3932, 2885, 3628, + 3925, 2917, 3617, + 3915, 2957, 3602, + 3902, 3005, 3582, + 3883, 3063, 3553, + 3857, 3130, 3511, + 3820, 3206, 3449, + 3764, 3292, 3349, + 3678, 3386, 3167, + 3528, 3487, 2683, + 3192, 3595, 0, + 0, 3708, 0, + 4085, 2901, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2902, 3789, + 4085, 2903, 3789, + 4085, 2903, 3789, + 4085, 2904, 3788, + 4085, 2905, 3788, + 4085, 2906, 3788, + 4084, 2908, 3787, + 4084, 2910, 3787, + 4083, 2913, 3786, + 4083, 2918, 3785, + 4082, 2923, 3784, + 4081, 2930, 3782, + 4079, 2939, 3780, + 4077, 2952, 3777, + 4074, 2968, 3772, + 4070, 2988, 3767, + 4065, 3014, 3759, + 4058, 3046, 3748, + 4048, 3086, 3733, + 4034, 3135, 3713, + 4016, 3193, 3684, + 3990, 3260, 3642, + 3952, 3337, 3579, + 3897, 3423, 3479, + 3810, 3517, 3297, + 3660, 3618, 2807, + 3325, 3726, 0, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3031, 3920, + 4095, 3032, 3920, + 4095, 3032, 3920, + 4095, 3033, 3920, + 4095, 3033, 3920, + 4095, 3034, 3920, + 4095, 3036, 3919, + 4095, 3037, 3919, + 4095, 3040, 3918, + 4095, 3043, 3918, + 4095, 3047, 3917, + 4095, 3052, 3915, + 4095, 3060, 3914, + 4095, 3069, 3911, + 4095, 3081, 3908, + 4095, 3097, 3904, + 4095, 3118, 3898, + 4095, 3144, 3890, + 4095, 3176, 3879, + 4095, 3217, 3864, + 4095, 3265, 3844, + 4095, 3323, 3815, + 4095, 3391, 3773, + 4085, 3468, 3710, + 4029, 3554, 3610, + 3943, 3648, 3427, + 3793, 3750, 2933, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3161, 4052, + 4095, 3162, 4052, + 4095, 3162, 4052, + 4095, 3163, 4052, + 4095, 3163, 4051, + 4095, 3164, 4051, + 4095, 3166, 4051, + 4095, 3168, 4050, + 4095, 3170, 4050, + 4095, 3173, 4049, + 4095, 3177, 4048, + 4095, 3183, 4047, + 4095, 3190, 4045, + 4095, 3199, 4043, + 4095, 3212, 4040, + 4095, 3228, 4035, + 4095, 3248, 4029, + 4095, 3274, 4022, + 4095, 3307, 4011, + 4095, 3347, 3996, + 4095, 3396, 3975, + 4095, 3454, 3946, + 4095, 3522, 3904, + 4095, 3599, 3841, + 4095, 3685, 3741, + 4075, 3780, 3557, + 0, 1347, 1608, + 0, 1350, 1606, + 0, 1354, 1602, + 0, 1359, 1597, + 0, 1365, 1590, + 0, 1374, 1581, + 0, 1386, 1569, + 0, 1401, 1552, + 0, 1421, 1528, + 0, 1446, 1494, + 0, 1477, 1444, + 0, 1516, 1367, + 0, 1563, 1239, + 0, 1619, 979, + 0, 1685, 0, + 0, 1760, 0, + 0, 1845, 0, + 0, 1938, 0, + 0, 2038, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1348, 1612, + 0, 1351, 1610, + 0, 1354, 1606, + 0, 1360, 1601, + 0, 1366, 1595, + 0, 1375, 1586, + 0, 1387, 1573, + 0, 1402, 1557, + 0, 1422, 1533, + 0, 1447, 1499, + 0, 1478, 1450, + 0, 1516, 1374, + 0, 1564, 1248, + 0, 1620, 995, + 0, 1685, 0, + 0, 1761, 0, + 0, 1845, 0, + 0, 1938, 0, + 0, 2038, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1349, 1618, + 0, 1352, 1615, + 0, 1356, 1611, + 0, 1361, 1607, + 0, 1368, 1600, + 0, 1377, 1591, + 0, 1388, 1579, + 0, 1403, 1563, + 0, 1423, 1539, + 0, 1448, 1506, + 0, 1479, 1457, + 0, 1517, 1383, + 0, 1564, 1260, + 0, 1620, 1015, + 0, 1686, 0, + 0, 1761, 0, + 0, 1845, 0, + 0, 1938, 0, + 0, 2038, 0, + 0, 2145, 0, + 0, 2257, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1351, 1625, + 0, 1354, 1622, + 0, 1358, 1619, + 0, 1363, 1614, + 0, 1369, 1607, + 0, 1378, 1599, + 0, 1390, 1587, + 0, 1405, 1570, + 0, 1424, 1548, + 0, 1449, 1515, + 0, 1480, 1467, + 0, 1519, 1395, + 0, 1565, 1275, + 0, 1621, 1041, + 0, 1687, 0, + 0, 1762, 0, + 0, 1846, 0, + 0, 1939, 0, + 0, 2039, 0, + 0, 2145, 0, + 0, 2258, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1353, 1634, + 0, 1356, 1631, + 0, 1360, 1628, + 0, 1365, 1623, + 0, 1372, 1617, + 0, 1381, 1608, + 0, 1392, 1597, + 0, 1407, 1581, + 0, 1426, 1558, + 0, 1451, 1527, + 0, 1482, 1480, + 0, 1520, 1410, + 0, 1567, 1295, + 0, 1623, 1074, + 0, 1688, 244, + 0, 1763, 0, + 0, 1847, 0, + 0, 1939, 0, + 0, 2039, 0, + 0, 2146, 0, + 0, 2258, 0, + 0, 2374, 0, + 0, 2494, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3386, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1356, 1646, + 0, 1359, 1643, + 0, 1363, 1640, + 0, 1368, 1636, + 0, 1375, 1629, + 0, 1383, 1621, + 0, 1395, 1610, + 0, 1410, 1594, + 0, 1429, 1573, + 0, 1453, 1542, + 0, 1484, 1497, + 0, 1522, 1430, + 0, 1569, 1320, + 0, 1624, 1114, + 0, 1690, 449, + 0, 1764, 0, + 0, 1848, 0, + 0, 1940, 0, + 0, 2040, 0, + 0, 2146, 0, + 0, 2258, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2617, 0, + 0, 2742, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1360, 1662, + 0, 1363, 1659, + 0, 1367, 1656, + 0, 1372, 1652, + 0, 1379, 1646, + 0, 1387, 1638, + 0, 1399, 1627, + 0, 1414, 1612, + 0, 1433, 1591, + 0, 1457, 1561, + 0, 1487, 1519, + 0, 1525, 1455, + 0, 1572, 1351, + 0, 1627, 1162, + 0, 1692, 629, + 0, 1766, 0, + 0, 1849, 0, + 0, 1941, 0, + 0, 2041, 0, + 0, 2147, 0, + 0, 2259, 0, + 0, 2375, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2869, 0, + 0, 2997, 0, + 0, 3126, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3648, 0, + 0, 1366, 1682, + 0, 1369, 1679, + 0, 1373, 1676, + 0, 1377, 1672, + 0, 1384, 1666, + 0, 1393, 1659, + 0, 1404, 1648, + 0, 1418, 1634, + 0, 1437, 1614, + 0, 1461, 1586, + 0, 1492, 1546, + 0, 1529, 1486, + 0, 1575, 1390, + 0, 1630, 1220, + 0, 1694, 795, + 0, 1768, 0, + 0, 1851, 0, + 0, 1943, 0, + 0, 2042, 0, + 0, 2148, 0, + 0, 2260, 0, + 0, 2376, 0, + 0, 2495, 0, + 0, 2618, 0, + 0, 2743, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3649, 0, + 0, 1373, 1707, + 0, 1376, 1705, + 0, 1380, 1702, + 0, 1385, 1698, + 0, 1391, 1693, + 0, 1399, 1686, + 0, 1411, 1676, + 0, 1425, 1662, + 0, 1444, 1644, + 0, 1467, 1618, + 0, 1497, 1580, + 0, 1534, 1525, + 0, 1580, 1438, + 0, 1634, 1287, + 0, 1698, 950, + 0, 1771, 0, + 0, 1854, 0, + 0, 1945, 0, + 0, 2044, 0, + 0, 2149, 0, + 0, 2261, 0, + 0, 2377, 0, + 0, 2496, 0, + 0, 2619, 0, + 0, 2743, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3256, 0, + 0, 3387, 0, + 0, 3517, 0, + 0, 3649, 0, + 817, 1383, 1739, + 796, 1385, 1737, + 767, 1389, 1734, + 725, 1394, 1731, + 662, 1400, 1726, + 560, 1408, 1719, + 375, 1419, 1710, + 0, 1433, 1698, + 0, 1452, 1680, + 0, 1475, 1656, + 0, 1504, 1622, + 0, 1541, 1572, + 0, 1586, 1494, + 0, 1639, 1364, + 0, 1702, 1098, + 0, 1775, 0, + 0, 1857, 0, + 0, 1948, 0, + 0, 2046, 0, + 0, 2151, 0, + 0, 2262, 0, + 0, 2378, 0, + 0, 2497, 0, + 0, 2619, 0, + 0, 2744, 0, + 0, 2870, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1204, 1395, 1779, + 1195, 1398, 1777, + 1183, 1401, 1775, + 1166, 1406, 1771, + 1143, 1412, 1767, + 1111, 1420, 1761, + 1063, 1431, 1752, + 990, 1445, 1741, + 870, 1462, 1725, + 635, 1485, 1704, + 0, 1514, 1673, + 0, 1550, 1628, + 0, 1594, 1560, + 0, 1646, 1450, + 0, 1709, 1243, + 0, 1780, 567, + 0, 1861, 0, + 0, 1951, 0, + 0, 2049, 0, + 0, 2154, 0, + 0, 2264, 0, + 0, 2379, 0, + 0, 2498, 0, + 0, 2620, 0, + 0, 2744, 0, + 0, 2871, 0, + 0, 2998, 0, + 0, 3127, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1462, 1411, 1827, + 1457, 1414, 1825, + 1450, 1417, 1823, + 1441, 1422, 1820, + 1429, 1428, 1816, + 1412, 1436, 1811, + 1388, 1446, 1803, + 1354, 1459, 1793, + 1304, 1476, 1779, + 1227, 1498, 1760, + 1098, 1526, 1733, + 836, 1561, 1694, + 0, 1604, 1636, + 0, 1656, 1544, + 0, 1717, 1383, + 0, 1787, 1003, + 0, 1867, 0, + 0, 1956, 0, + 0, 2053, 0, + 0, 2157, 0, + 0, 2266, 0, + 0, 2381, 0, + 0, 2499, 0, + 0, 2621, 0, + 0, 2745, 0, + 0, 2871, 0, + 0, 2999, 0, + 0, 3128, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1670, 1432, 1884, + 1667, 1435, 1883, + 1663, 1438, 1881, + 1657, 1442, 1878, + 1649, 1448, 1875, + 1639, 1455, 1870, + 1624, 1465, 1863, + 1604, 1478, 1854, + 1576, 1494, 1842, + 1536, 1516, 1826, + 1475, 1543, 1802, + 1378, 1576, 1769, + 1206, 1618, 1720, + 769, 1668, 1646, + 0, 1728, 1522, + 0, 1797, 1276, + 0, 1875, 0, + 0, 1962, 0, + 0, 2058, 0, + 0, 2161, 0, + 0, 2270, 0, + 0, 2383, 0, + 0, 2501, 0, + 0, 2623, 0, + 0, 2746, 0, + 0, 2872, 0, + 0, 3000, 0, + 0, 3128, 0, + 0, 3257, 0, + 0, 3387, 0, + 0, 3518, 0, + 0, 3649, 0, + 1851, 1458, 1951, + 1849, 1461, 1950, + 1847, 1464, 1948, + 1843, 1468, 1946, + 1838, 1473, 1943, + 1831, 1480, 1939, + 1821, 1490, 1933, + 1809, 1502, 1925, + 1791, 1517, 1915, + 1766, 1538, 1901, + 1730, 1563, 1881, + 1678, 1596, 1853, + 1597, 1636, 1813, + 1459, 1684, 1753, + 1167, 1741, 1659, + 0, 1809, 1491, + 0, 1885, 1074, + 0, 1971, 0, + 0, 2065, 0, + 0, 2166, 0, + 0, 2274, 0, + 0, 2387, 0, + 0, 2504, 0, + 0, 2625, 0, + 0, 2748, 0, + 0, 2873, 0, + 0, 3000, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 2017, 1491, 2027, + 2016, 1494, 2026, + 2014, 1496, 2025, + 2011, 1500, 2023, + 2008, 1505, 2020, + 2003, 1512, 2017, + 1997, 1520, 2012, + 1988, 1532, 2006, + 1976, 1547, 1997, + 1960, 1566, 1985, + 1937, 1590, 1969, + 1904, 1620, 1946, + 1856, 1658, 1914, + 1784, 1704, 1867, + 1664, 1759, 1794, + 1430, 1824, 1676, + 367, 1898, 1445, + 0, 1982, 454, + 0, 2074, 0, + 0, 2173, 0, + 0, 2279, 0, + 0, 2391, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 2173, 1532, 2113, + 2172, 1534, 2112, + 2171, 1537, 2111, + 2169, 1540, 2109, + 2166, 1545, 2107, + 2163, 1551, 2104, + 2158, 1559, 2100, + 2152, 1569, 2095, + 2144, 1583, 2088, + 2133, 1600, 2078, + 2117, 1623, 2065, + 2096, 1651, 2047, + 2065, 1687, 2021, + 2021, 1730, 1984, + 1953, 1782, 1929, + 1844, 1844, 1844, + 1639, 1915, 1698, + 988, 1996, 1375, + 0, 2085, 0, + 0, 2183, 0, + 0, 2287, 0, + 0, 2397, 0, + 0, 2512, 0, + 0, 2631, 0, + 0, 2753, 0, + 0, 2877, 0, + 0, 3003, 0, + 0, 3131, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 2322, 1581, 2206, + 2321, 1583, 2206, + 2320, 1585, 2205, + 2319, 1588, 2204, + 2317, 1593, 2202, + 2315, 1598, 2199, + 2312, 1605, 2196, + 2307, 1615, 2192, + 2301, 1627, 2186, + 2293, 1643, 2179, + 2283, 1663, 2168, + 2268, 1690, 2153, + 2247, 1722, 2133, + 2218, 1763, 2105, + 2175, 1811, 2063, + 2111, 1870, 2001, + 2009, 1937, 1903, + 1822, 2014, 1725, + 1302, 2100, 1261, + 0, 2195, 0, + 0, 2297, 0, + 0, 2405, 0, + 0, 2518, 0, + 0, 2635, 0, + 0, 2756, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2466, 1640, 2308, + 2466, 1641, 2307, + 2465, 1643, 2306, + 2464, 1646, 2305, + 2463, 1650, 2304, + 2461, 1655, 2302, + 2459, 1661, 2299, + 2456, 1669, 2296, + 2451, 1680, 2292, + 2446, 1694, 2285, + 2438, 1713, 2277, + 2427, 1736, 2266, + 2413, 1766, 2250, + 2393, 1803, 2228, + 2364, 1848, 2197, + 2323, 1902, 2152, + 2262, 1965, 2083, + 2164, 2038, 1971, + 1988, 2120, 1760, + 1534, 2211, 1044, + 0, 2309, 0, + 0, 2415, 0, + 0, 2526, 0, + 0, 2641, 0, + 0, 2761, 0, + 0, 2883, 0, + 0, 3008, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 2607, 1708, 2415, + 2607, 1709, 2415, + 2607, 1711, 2414, + 2606, 1713, 2413, + 2605, 1716, 2412, + 2604, 1721, 2411, + 2602, 1726, 2409, + 2600, 1733, 2406, + 2597, 1743, 2402, + 2592, 1755, 2398, + 2587, 1771, 2391, + 2579, 1792, 2382, + 2569, 1818, 2370, + 2555, 1851, 2353, + 2535, 1892, 2330, + 2507, 1941, 2297, + 2467, 1999, 2248, + 2407, 2067, 2173, + 2313, 2145, 2049, + 2144, 2231, 1802, + 1729, 2326, 267, + 0, 2428, 0, + 0, 2536, 0, + 0, 2649, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3011, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2746, 1785, 2528, + 2746, 1786, 2528, + 2745, 1788, 2527, + 2745, 1790, 2526, + 2744, 1793, 2526, + 2743, 1796, 2524, + 2742, 1801, 2523, + 2740, 1807, 2521, + 2738, 1815, 2518, + 2735, 1826, 2514, + 2731, 1839, 2509, + 2726, 1857, 2502, + 2718, 1880, 2493, + 2708, 1909, 2480, + 2694, 1945, 2463, + 2674, 1989, 2438, + 2647, 2042, 2403, + 2608, 2104, 2351, + 2549, 2176, 2271, + 2457, 2257, 2136, + 2294, 2347, 1853, + 1903, 2445, 0, + 0, 2549, 0, + 0, 2660, 0, + 0, 2775, 0, + 0, 2894, 0, + 0, 3016, 0, + 0, 3141, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3523, 0, + 0, 3653, 0, + 2883, 1872, 2645, + 2883, 1873, 2645, + 2883, 1874, 2644, + 2882, 1876, 2644, + 2882, 1878, 2643, + 2881, 1881, 2642, + 2880, 1885, 2641, + 2879, 1890, 2640, + 2877, 1897, 2637, + 2875, 1905, 2635, + 2872, 1917, 2631, + 2868, 1932, 2625, + 2862, 1952, 2618, + 2855, 1976, 2609, + 2845, 2008, 2596, + 2831, 2046, 2577, + 2812, 2093, 2552, + 2785, 2149, 2515, + 2746, 2215, 2461, + 2688, 2290, 2376, + 2598, 2374, 2231, + 2438, 2467, 1914, + 2064, 2567, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3271, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 3019, 1967, 2766, + 3019, 1967, 2765, + 3018, 1968, 2765, + 3018, 1970, 2765, + 3018, 1971, 2764, + 3017, 1974, 2763, + 3017, 1977, 2763, + 3016, 1981, 2761, + 3014, 1987, 2760, + 3013, 1994, 2758, + 3011, 2004, 2755, + 3008, 2016, 2751, + 3004, 2032, 2745, + 2998, 2053, 2738, + 2991, 2080, 2728, + 2981, 2113, 2715, + 2967, 2154, 2696, + 2948, 2203, 2669, + 2921, 2262, 2631, + 2883, 2330, 2575, + 2826, 2408, 2487, + 2736, 2494, 2334, + 2580, 2589, 1984, + 2216, 2691, 0, + 0, 2800, 0, + 0, 2913, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3275, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3154, 2069, 2889, + 3153, 2069, 2889, + 3153, 2070, 2888, + 3153, 2071, 2888, + 3153, 2072, 2888, + 3152, 2074, 2887, + 3152, 2077, 2887, + 3151, 2080, 2886, + 3150, 2085, 2884, + 3149, 2091, 2883, + 3147, 2098, 2881, + 3145, 2109, 2878, + 3142, 2122, 2873, + 3138, 2139, 2868, + 3133, 2161, 2861, + 3126, 2189, 2850, + 3116, 2224, 2837, + 3102, 2266, 2817, + 3083, 2318, 2790, + 3057, 2379, 2751, + 3018, 2449, 2693, + 2962, 2529, 2602, + 2873, 2617, 2442, + 2718, 2714, 2063, + 2363, 2818, 0, + 0, 2927, 0, + 0, 3042, 0, + 0, 3160, 0, + 0, 3282, 0, + 0, 3406, 0, + 0, 3532, 0, + 0, 3659, 0, + 3288, 2177, 3014, + 3288, 2177, 3014, + 3287, 2178, 3014, + 3287, 2179, 3014, + 3287, 2180, 3013, + 3287, 2181, 3013, + 3286, 2183, 3012, + 3286, 2186, 3012, + 3285, 2190, 3011, + 3284, 2194, 3010, + 3283, 2200, 3008, + 3281, 2209, 3006, + 3279, 2219, 3003, + 3276, 2233, 2998, + 3272, 2251, 2993, + 3267, 2274, 2985, + 3260, 2303, 2975, + 3250, 2339, 2961, + 3236, 2383, 2941, + 3217, 2437, 2914, + 3191, 2499, 2874, + 3153, 2571, 2815, + 3097, 2652, 2721, + 3009, 2743, 2556, + 2855, 2840, 2152, + 2506, 2945, 0, + 0, 3056, 0, + 0, 3171, 0, + 0, 3290, 0, + 0, 3412, 0, + 0, 3537, 0, + 0, 3663, 0, + 3421, 2290, 3141, + 3421, 2291, 3141, + 3421, 2291, 3141, + 3421, 2292, 3141, + 3421, 2293, 3141, + 3421, 2294, 3140, + 3420, 2295, 3140, + 3420, 2297, 3139, + 3419, 2300, 3139, + 3419, 2304, 3138, + 3418, 2309, 3136, + 3417, 2315, 3135, + 3415, 2324, 3132, + 3413, 2335, 3129, + 3410, 2349, 3125, + 3406, 2368, 3120, + 3401, 2392, 3112, + 3393, 2421, 3102, + 3384, 2459, 3087, + 3370, 2504, 3067, + 3351, 2558, 3039, + 3325, 2622, 2999, + 3287, 2696, 2939, + 3231, 2778, 2844, + 3143, 2869, 2673, + 2991, 2968, 2248, + 2646, 3074, 0, + 0, 3185, 0, + 0, 3301, 0, + 0, 3421, 0, + 0, 3543, 0, + 0, 3668, 0, + 3554, 2408, 3269, + 3554, 2408, 3269, + 3554, 2408, 3269, + 3554, 2409, 3269, + 3554, 2410, 3269, + 3554, 2411, 3269, + 3554, 2412, 3268, + 3553, 2413, 3268, + 3553, 2416, 3268, + 3553, 2418, 3267, + 3552, 2422, 3266, + 3551, 2427, 3265, + 3550, 2434, 3263, + 3548, 2443, 3261, + 3546, 2454, 3257, + 3543, 2469, 3253, + 3539, 2488, 3248, + 3534, 2512, 3240, + 3527, 2543, 3229, + 3517, 2581, 3215, + 3503, 2627, 3195, + 3485, 2683, 3167, + 3458, 2747, 3126, + 3421, 2822, 3065, + 3365, 2905, 2968, + 3277, 2998, 2794, + 3126, 3097, 2352, + 2784, 3204, 0, + 0, 3315, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3674, 0, + 3687, 2529, 3399, + 3687, 2529, 3399, + 3687, 2529, 3399, + 3687, 2530, 3398, + 3687, 2530, 3398, + 3687, 2531, 3398, + 3687, 2532, 3398, + 3687, 2533, 3398, + 3686, 2535, 3397, + 3686, 2537, 3397, + 3685, 2540, 3396, + 3685, 2544, 3395, + 3684, 2549, 3394, + 3683, 2556, 3392, + 3681, 2565, 3390, + 3679, 2576, 3387, + 3676, 2591, 3382, + 3672, 2611, 3377, + 3667, 2636, 3369, + 3660, 2667, 3358, + 3650, 2706, 3344, + 3636, 2753, 3324, + 3618, 2809, 3295, + 3591, 2874, 3254, + 3554, 2950, 3192, + 3498, 3034, 3094, + 3411, 3127, 2918, + 3260, 3227, 2461, + 2920, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 3820, 2652, 3529, + 3820, 2652, 3529, + 3820, 2653, 3528, + 3820, 2653, 3528, + 3820, 2653, 3528, + 3820, 2654, 3528, + 3820, 2655, 3528, + 3820, 2656, 3528, + 3819, 2657, 3528, + 3819, 2658, 3527, + 3819, 2661, 3527, + 3818, 2664, 3526, + 3817, 2668, 3525, + 3817, 2673, 3524, + 3815, 2680, 3522, + 3814, 2689, 3519, + 3812, 2701, 3516, + 3809, 2716, 3512, + 3805, 2736, 3506, + 3799, 2761, 3499, + 3792, 2793, 3488, + 3782, 2832, 3473, + 3769, 2880, 3453, + 3750, 2936, 3424, + 3724, 3003, 3383, + 3687, 3078, 3321, + 3631, 3163, 3222, + 3544, 3257, 3044, + 3394, 3357, 2575, + 3056, 3465, 0, + 0, 3577, 0, + 0, 3694, 0, + 3953, 2778, 3659, + 3953, 2778, 3659, + 3953, 2778, 3659, + 3953, 2778, 3659, + 3952, 2779, 3659, + 3952, 2779, 3659, + 3952, 2780, 3659, + 3952, 2780, 3658, + 3952, 2781, 3658, + 3952, 2783, 3658, + 3952, 2784, 3658, + 3951, 2787, 3657, + 3951, 2790, 3656, + 3950, 2794, 3655, + 3949, 2799, 3654, + 3948, 2806, 3652, + 3946, 2815, 3650, + 3944, 2827, 3647, + 3941, 2843, 3642, + 3937, 2863, 3637, + 3932, 2888, 3629, + 3925, 2920, 3618, + 3915, 2960, 3604, + 3902, 3008, 3583, + 3883, 3065, 3554, + 3857, 3132, 3513, + 3819, 3208, 3450, + 3764, 3293, 3351, + 3677, 3387, 3171, + 3527, 3488, 2694, + 3190, 3596, 0, + 0, 3708, 0, + 4085, 2905, 3790, + 4085, 2905, 3790, + 4085, 2905, 3790, + 4085, 2905, 3790, + 4085, 2906, 3790, + 4085, 2906, 3790, + 4085, 2906, 3790, + 4085, 2907, 3789, + 4085, 2908, 3789, + 4084, 2909, 3789, + 4084, 2910, 3789, + 4084, 2912, 3788, + 4084, 2914, 3788, + 4083, 2917, 3787, + 4082, 2921, 3786, + 4082, 2926, 3785, + 4080, 2933, 3783, + 4079, 2943, 3781, + 4077, 2955, 3778, + 4074, 2971, 3773, + 4070, 2991, 3768, + 4064, 3017, 3760, + 4057, 3049, 3749, + 4047, 3089, 3734, + 4034, 3137, 3714, + 4015, 3195, 3685, + 3989, 3262, 3643, + 3952, 3338, 3581, + 3896, 3424, 3481, + 3810, 3518, 3299, + 3660, 3619, 2815, + 3324, 3727, 0, + 4095, 3033, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3034, 3921, + 4095, 3035, 3921, + 4095, 3035, 3921, + 4095, 3036, 3920, + 4095, 3037, 3920, + 4095, 3038, 3920, + 4095, 3040, 3920, + 4095, 3042, 3919, + 4095, 3046, 3918, + 4095, 3050, 3917, + 4095, 3055, 3916, + 4095, 3062, 3914, + 4095, 3072, 3912, + 4095, 3084, 3909, + 4095, 3100, 3904, + 4095, 3120, 3899, + 4095, 3146, 3891, + 4095, 3178, 3880, + 4095, 3218, 3865, + 4095, 3267, 3845, + 4095, 3325, 3816, + 4095, 3392, 3774, + 4084, 3469, 3711, + 4029, 3555, 3611, + 3942, 3649, 3429, + 3793, 3751, 2939, + 4095, 3163, 4053, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3163, 4052, + 4095, 3164, 4052, + 4095, 3164, 4052, + 4095, 3164, 4052, + 4095, 3165, 4052, + 4095, 3166, 4052, + 4095, 3167, 4052, + 4095, 3168, 4051, + 4095, 3170, 4051, + 4095, 3172, 4050, + 4095, 3175, 4050, + 4095, 3179, 4049, + 4095, 3185, 4047, + 4095, 3192, 4046, + 4095, 3201, 4043, + 4095, 3213, 4040, + 4095, 3229, 4036, + 4095, 3250, 4030, + 4095, 3276, 4022, + 4095, 3308, 4011, + 4095, 3349, 3997, + 4095, 3397, 3976, + 4095, 3455, 3947, + 4095, 3523, 3905, + 4095, 3600, 3842, + 4095, 3686, 3742, + 4075, 3780, 3559, + 0, 1476, 1739, + 0, 1478, 1737, + 0, 1481, 1735, + 0, 1485, 1731, + 0, 1490, 1726, + 0, 1497, 1719, + 0, 1506, 1710, + 0, 1518, 1698, + 0, 1533, 1681, + 0, 1552, 1657, + 0, 1577, 1622, + 0, 1609, 1572, + 0, 1647, 1494, + 0, 1695, 1365, + 0, 1751, 1099, + 0, 1817, 0, + 0, 1892, 0, + 0, 1976, 0, + 0, 2069, 0, + 0, 2170, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3518, 0, + 0, 3649, 0, + 0, 1477, 1742, + 0, 1479, 1740, + 0, 1482, 1738, + 0, 1486, 1734, + 0, 1491, 1729, + 0, 1498, 1723, + 0, 1507, 1713, + 0, 1518, 1701, + 0, 1533, 1684, + 0, 1553, 1660, + 0, 1578, 1626, + 0, 1609, 1576, + 0, 1648, 1500, + 0, 1695, 1371, + 0, 1751, 1111, + 0, 1817, 0, + 0, 1892, 0, + 0, 1977, 0, + 0, 2070, 0, + 0, 2170, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1478, 1746, + 0, 1480, 1744, + 0, 1483, 1742, + 0, 1487, 1738, + 0, 1492, 1733, + 0, 1499, 1727, + 0, 1507, 1718, + 0, 1519, 1706, + 0, 1534, 1689, + 0, 1554, 1665, + 0, 1579, 1631, + 0, 1610, 1582, + 0, 1649, 1506, + 0, 1696, 1380, + 0, 1752, 1127, + 0, 1818, 0, + 0, 1893, 0, + 0, 1977, 0, + 0, 2070, 0, + 0, 2170, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1479, 1752, + 0, 1481, 1750, + 0, 1484, 1747, + 0, 1488, 1744, + 0, 1493, 1739, + 0, 1500, 1732, + 0, 1509, 1723, + 0, 1520, 1711, + 0, 1535, 1695, + 0, 1555, 1671, + 0, 1580, 1638, + 0, 1611, 1590, + 0, 1650, 1515, + 0, 1696, 1392, + 0, 1753, 1147, + 0, 1818, 0, + 0, 1893, 0, + 0, 1978, 0, + 0, 2070, 0, + 0, 2171, 0, + 0, 2277, 0, + 0, 2389, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1481, 1759, + 0, 1483, 1757, + 0, 1486, 1754, + 0, 1490, 1751, + 0, 1495, 1746, + 0, 1502, 1740, + 0, 1510, 1731, + 0, 1522, 1719, + 0, 1537, 1703, + 0, 1556, 1680, + 0, 1581, 1647, + 0, 1612, 1600, + 0, 1651, 1527, + 0, 1698, 1407, + 0, 1754, 1173, + 0, 1819, 122, + 0, 1894, 0, + 0, 1978, 0, + 0, 2071, 0, + 0, 2171, 0, + 0, 2278, 0, + 0, 2390, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1483, 1768, + 0, 1485, 1766, + 0, 1488, 1763, + 0, 1492, 1760, + 0, 1497, 1755, + 0, 1504, 1749, + 0, 1513, 1741, + 0, 1524, 1729, + 0, 1539, 1713, + 0, 1558, 1691, + 0, 1583, 1659, + 0, 1614, 1612, + 0, 1652, 1542, + 0, 1699, 1427, + 0, 1755, 1206, + 0, 1820, 376, + 0, 1895, 0, + 0, 1979, 0, + 0, 2071, 0, + 0, 2171, 0, + 0, 2278, 0, + 0, 2390, 0, + 0, 2506, 0, + 0, 2626, 0, + 0, 2749, 0, + 0, 2874, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1486, 1780, + 0, 1488, 1778, + 0, 1491, 1776, + 0, 1495, 1772, + 0, 1500, 1768, + 0, 1507, 1762, + 0, 1516, 1753, + 0, 1527, 1742, + 0, 1542, 1726, + 0, 1561, 1705, + 0, 1586, 1674, + 0, 1616, 1629, + 0, 1655, 1562, + 0, 1701, 1452, + 0, 1757, 1246, + 0, 1822, 581, + 0, 1896, 0, + 0, 1980, 0, + 0, 2072, 0, + 0, 2172, 0, + 0, 2279, 0, + 0, 2390, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3258, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1490, 1795, + 0, 1493, 1794, + 0, 1495, 1791, + 0, 1499, 1788, + 0, 1504, 1784, + 0, 1511, 1778, + 0, 1519, 1770, + 0, 1531, 1759, + 0, 1546, 1744, + 0, 1565, 1723, + 0, 1589, 1694, + 0, 1620, 1651, + 0, 1657, 1587, + 0, 1704, 1484, + 0, 1759, 1294, + 0, 1824, 762, + 0, 1898, 0, + 0, 1981, 0, + 0, 2073, 0, + 0, 2173, 0, + 0, 2279, 0, + 0, 2391, 0, + 0, 2507, 0, + 0, 2627, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3001, 0, + 0, 3129, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1496, 1815, + 0, 1498, 1814, + 0, 1501, 1811, + 0, 1505, 1808, + 0, 1510, 1804, + 0, 1516, 1799, + 0, 1525, 1791, + 0, 1536, 1781, + 0, 1551, 1766, + 0, 1569, 1746, + 0, 1593, 1718, + 0, 1624, 1678, + 0, 1661, 1618, + 0, 1707, 1522, + 0, 1762, 1352, + 0, 1826, 927, + 0, 1900, 0, + 0, 1983, 0, + 0, 2075, 0, + 0, 2174, 0, + 0, 2280, 0, + 0, 2392, 0, + 0, 2508, 0, + 0, 2628, 0, + 0, 2750, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3649, 0, + 0, 1503, 1841, + 0, 1505, 1839, + 0, 1508, 1837, + 0, 1512, 1834, + 0, 1517, 1830, + 0, 1523, 1825, + 0, 1532, 1818, + 0, 1543, 1808, + 0, 1557, 1795, + 0, 1576, 1776, + 0, 1599, 1750, + 0, 1629, 1712, + 0, 1666, 1657, + 0, 1712, 1570, + 0, 1766, 1419, + 0, 1830, 1082, + 0, 1903, 0, + 0, 1986, 0, + 0, 2077, 0, + 0, 2176, 0, + 0, 2282, 0, + 0, 2393, 0, + 0, 2509, 0, + 0, 2628, 0, + 0, 2751, 0, + 0, 2875, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3388, 0, + 0, 3519, 0, + 0, 3650, 0, + 964, 1513, 1873, + 949, 1515, 1871, + 928, 1518, 1869, + 899, 1521, 1867, + 857, 1526, 1863, + 794, 1532, 1858, + 692, 1541, 1851, + 507, 1551, 1842, + 0, 1566, 1830, + 0, 1584, 1813, + 0, 1607, 1788, + 0, 1637, 1754, + 0, 1673, 1704, + 0, 1718, 1626, + 0, 1771, 1496, + 0, 1835, 1231, + 0, 1907, 0, + 0, 1989, 0, + 0, 2080, 0, + 0, 2178, 0, + 0, 2283, 0, + 0, 2394, 0, + 0, 2510, 0, + 0, 2629, 0, + 0, 2751, 0, + 0, 2876, 0, + 0, 3002, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 1342, 1525, 1912, + 1336, 1527, 1911, + 1327, 1530, 1909, + 1315, 1533, 1907, + 1299, 1538, 1903, + 1276, 1544, 1899, + 1243, 1552, 1893, + 1195, 1563, 1884, + 1123, 1577, 1873, + 1003, 1595, 1857, + 767, 1617, 1836, + 0, 1646, 1805, + 0, 1682, 1760, + 0, 1726, 1692, + 0, 1779, 1582, + 0, 1841, 1375, + 0, 1912, 699, + 0, 1994, 0, + 0, 2083, 0, + 0, 2181, 0, + 0, 2286, 0, + 0, 2396, 0, + 0, 2511, 0, + 0, 2630, 0, + 0, 2752, 0, + 0, 2877, 0, + 0, 3003, 0, + 0, 3130, 0, + 0, 3259, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 1598, 1542, 1960, + 1594, 1543, 1959, + 1589, 1546, 1957, + 1582, 1549, 1955, + 1573, 1554, 1952, + 1561, 1560, 1948, + 1544, 1568, 1943, + 1520, 1578, 1935, + 1486, 1591, 1925, + 1436, 1608, 1911, + 1359, 1631, 1892, + 1230, 1659, 1865, + 968, 1693, 1826, + 0, 1736, 1768, + 0, 1788, 1676, + 0, 1849, 1516, + 0, 1919, 1135, + 0, 1999, 0, + 0, 2088, 0, + 0, 2185, 0, + 0, 2289, 0, + 0, 2398, 0, + 0, 2513, 0, + 0, 2632, 0, + 0, 2753, 0, + 0, 2877, 0, + 0, 3003, 0, + 0, 3131, 0, + 0, 3260, 0, + 0, 3389, 0, + 0, 3519, 0, + 0, 3650, 0, + 1804, 1562, 2017, + 1802, 1564, 2016, + 1799, 1567, 2015, + 1795, 1570, 2013, + 1789, 1574, 2010, + 1781, 1580, 2007, + 1771, 1587, 2002, + 1756, 1597, 1995, + 1737, 1610, 1987, + 1708, 1626, 1974, + 1668, 1648, 1958, + 1607, 1675, 1934, + 1511, 1708, 1901, + 1338, 1750, 1852, + 901, 1800, 1778, + 0, 1860, 1654, + 0, 1929, 1408, + 0, 2007, 0, + 0, 2095, 0, + 0, 2190, 0, + 0, 2293, 0, + 0, 2402, 0, + 0, 2515, 0, + 0, 2633, 0, + 0, 2755, 0, + 0, 2878, 0, + 0, 3004, 0, + 0, 3132, 0, + 0, 3260, 0, + 0, 3389, 0, + 0, 3520, 0, + 0, 3650, 0, + 1985, 1589, 2084, + 1983, 1591, 2083, + 1981, 1593, 2082, + 1979, 1596, 2080, + 1975, 1600, 2078, + 1970, 1605, 2075, + 1963, 1612, 2071, + 1953, 1622, 2065, + 1941, 1634, 2058, + 1923, 1650, 2047, + 1898, 1670, 2033, + 1862, 1695, 2013, + 1810, 1728, 1985, + 1729, 1768, 1945, + 1591, 1816, 1886, + 1299, 1874, 1791, + 0, 1941, 1623, + 0, 2017, 1207, + 0, 2103, 0, + 0, 2197, 0, + 0, 2298, 0, + 0, 2406, 0, + 0, 2519, 0, + 0, 2636, 0, + 0, 2757, 0, + 0, 2880, 0, + 0, 3005, 0, + 0, 3132, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3650, 0, + 2150, 1622, 2160, + 2149, 1623, 2159, + 2148, 1626, 2158, + 2146, 1628, 2157, + 2143, 1632, 2155, + 2140, 1637, 2152, + 2135, 1644, 2149, + 2129, 1653, 2144, + 2120, 1664, 2138, + 2108, 1679, 2129, + 2092, 1698, 2117, + 2069, 1722, 2101, + 2036, 1752, 2078, + 1989, 1790, 2046, + 1916, 1836, 1999, + 1796, 1892, 1927, + 1562, 1956, 1808, + 499, 2030, 1577, + 0, 2114, 586, + 0, 2206, 0, + 0, 2305, 0, + 0, 2412, 0, + 0, 2523, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 2306, 1663, 2246, + 2305, 1664, 2245, + 2304, 1666, 2244, + 2303, 1669, 2243, + 2301, 1672, 2241, + 2298, 1677, 2239, + 2295, 1683, 2236, + 2291, 1691, 2232, + 2284, 1701, 2227, + 2276, 1715, 2220, + 2265, 1732, 2210, + 2249, 1755, 2197, + 2228, 1783, 2179, + 2197, 1819, 2153, + 2153, 1862, 2116, + 2085, 1915, 2061, + 1976, 1976, 1976, + 1771, 2047, 1830, + 1120, 2128, 1507, + 0, 2217, 0, + 0, 2315, 0, + 0, 2419, 0, + 0, 2529, 0, + 0, 2644, 0, + 0, 2763, 0, + 0, 2885, 0, + 0, 3009, 0, + 0, 3135, 0, + 0, 3263, 0, + 0, 3392, 0, + 0, 3521, 0, + 0, 3651, 0, + 2455, 1712, 2339, + 2454, 1713, 2339, + 2453, 1715, 2338, + 2452, 1717, 2337, + 2451, 1721, 2336, + 2449, 1725, 2334, + 2447, 1730, 2332, + 2444, 1737, 2328, + 2439, 1747, 2324, + 2434, 1759, 2318, + 2426, 1775, 2311, + 2415, 1796, 2300, + 2400, 1822, 2285, + 2379, 1854, 2265, + 2350, 1895, 2237, + 2307, 1944, 2195, + 2243, 2002, 2134, + 2141, 2069, 2035, + 1954, 2146, 1857, + 1434, 2233, 1394, + 0, 2327, 0, + 0, 2429, 0, + 0, 2537, 0, + 0, 2650, 0, + 0, 2767, 0, + 0, 2888, 0, + 0, 3012, 0, + 0, 3137, 0, + 0, 3264, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2599, 1771, 2440, + 2598, 1772, 2440, + 2598, 1773, 2439, + 2597, 1775, 2438, + 2596, 1778, 2437, + 2595, 1782, 2436, + 2593, 1787, 2434, + 2591, 1793, 2432, + 2588, 1801, 2428, + 2584, 1812, 2424, + 2578, 1827, 2418, + 2570, 1845, 2409, + 2560, 1868, 2398, + 2545, 1898, 2382, + 2525, 1935, 2360, + 2496, 1980, 2329, + 2455, 2034, 2284, + 2394, 2097, 2215, + 2296, 2170, 2104, + 2120, 2252, 1892, + 1666, 2343, 1176, + 0, 2441, 0, + 0, 2547, 0, + 0, 2658, 0, + 0, 2773, 0, + 0, 2893, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 2740, 1839, 2548, + 2740, 1840, 2547, + 2739, 1841, 2547, + 2739, 1843, 2546, + 2738, 1845, 2545, + 2737, 1848, 2544, + 2736, 1853, 2543, + 2734, 1858, 2541, + 2732, 1865, 2538, + 2729, 1875, 2535, + 2725, 1887, 2530, + 2719, 1903, 2523, + 2711, 1924, 2514, + 2701, 1950, 2502, + 2687, 1983, 2486, + 2667, 2024, 2462, + 2639, 2073, 2429, + 2599, 2132, 2380, + 2539, 2199, 2305, + 2445, 2277, 2181, + 2277, 2363, 1934, + 1861, 2458, 400, + 0, 2560, 0, + 0, 2668, 0, + 0, 2781, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 2878, 1917, 2660, + 2878, 1917, 2660, + 2878, 1919, 2660, + 2878, 1920, 2659, + 2877, 1922, 2659, + 2876, 1925, 2658, + 2875, 1928, 2657, + 2874, 1933, 2655, + 2872, 1939, 2653, + 2870, 1947, 2650, + 2867, 1958, 2646, + 2863, 1972, 2641, + 2858, 1989, 2635, + 2850, 2012, 2625, + 2840, 2041, 2613, + 2826, 2077, 2595, + 2807, 2121, 2570, + 2779, 2174, 2535, + 2740, 2236, 2483, + 2681, 2308, 2403, + 2589, 2389, 2268, + 2426, 2479, 1986, + 2035, 2577, 0, + 0, 2682, 0, + 0, 2792, 0, + 0, 2907, 0, + 0, 3026, 0, + 0, 3148, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3656, 0, + 3015, 2003, 2777, + 3015, 2004, 2777, + 3015, 2005, 2777, + 3015, 2006, 2776, + 3014, 2008, 2776, + 3014, 2010, 2775, + 3013, 2013, 2774, + 3012, 2017, 2773, + 3011, 2022, 2772, + 3009, 2029, 2770, + 3007, 2038, 2767, + 3004, 2049, 2763, + 3000, 2064, 2758, + 2995, 2084, 2751, + 2987, 2108, 2741, + 2977, 2140, 2728, + 2963, 2178, 2709, + 2944, 2225, 2684, + 2917, 2281, 2647, + 2878, 2347, 2593, + 2821, 2422, 2508, + 2730, 2506, 2363, + 2570, 2599, 2046, + 2196, 2699, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 3151, 2098, 2898, + 3151, 2099, 2898, + 3151, 2099, 2897, + 3150, 2100, 2897, + 3150, 2102, 2897, + 3150, 2104, 2896, + 3149, 2106, 2896, + 3149, 2109, 2895, + 3148, 2113, 2893, + 3147, 2119, 2892, + 3145, 2126, 2890, + 3143, 2136, 2887, + 3140, 2148, 2883, + 3136, 2164, 2877, + 3130, 2185, 2870, + 3123, 2212, 2860, + 3113, 2245, 2847, + 3099, 2286, 2828, + 3080, 2335, 2801, + 3053, 2394, 2763, + 3015, 2462, 2707, + 2958, 2540, 2619, + 2868, 2626, 2466, + 2712, 2721, 2116, + 2349, 2823, 0, + 0, 2932, 0, + 0, 3045, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3407, 0, + 0, 3533, 0, + 0, 3660, 0, + 3286, 2200, 3021, + 3286, 2201, 3021, + 3286, 2201, 3021, + 3285, 2202, 3021, + 3285, 2203, 3020, + 3285, 2205, 3020, + 3284, 2206, 3019, + 3284, 2209, 3019, + 3283, 2212, 3018, + 3282, 2217, 3016, + 3281, 2223, 3015, + 3280, 2231, 3013, + 3277, 2241, 3010, + 3274, 2254, 3006, + 3270, 2271, 3000, + 3265, 2293, 2993, + 3258, 2321, 2983, + 3248, 2356, 2969, + 3234, 2398, 2949, + 3215, 2450, 2922, + 3189, 2511, 2883, + 3151, 2581, 2825, + 3094, 2661, 2734, + 3005, 2749, 2574, + 2850, 2846, 2196, + 2495, 2950, 0, + 0, 3059, 0, + 0, 3174, 0, + 0, 3292, 0, + 0, 3414, 0, + 0, 3538, 0, + 0, 3664, 0, + 3420, 2309, 3146, + 3420, 2309, 3146, + 3420, 2309, 3146, + 3420, 2310, 3146, + 3419, 2311, 3146, + 3419, 2312, 3145, + 3419, 2313, 3145, + 3418, 2315, 3145, + 3418, 2318, 3144, + 3417, 2322, 3143, + 3416, 2326, 3142, + 3415, 2333, 3140, + 3414, 2341, 3138, + 3411, 2351, 3135, + 3408, 2365, 3131, + 3404, 2383, 3125, + 3399, 2406, 3117, + 3392, 2435, 3107, + 3382, 2471, 3093, + 3368, 2516, 3074, + 3350, 2569, 3046, + 3323, 2631, 3006, + 3285, 2703, 2947, + 3229, 2785, 2853, + 3141, 2875, 2688, + 2988, 2973, 2284, + 2638, 3077, 0, + 0, 3188, 0, + 0, 3303, 0, + 0, 3422, 0, + 0, 3544, 0, + 0, 3669, 0, + 3553, 2422, 3273, + 3553, 2422, 3273, + 3553, 2423, 3273, + 3553, 2423, 3273, + 3553, 2424, 3273, + 3553, 2425, 3273, + 3553, 2426, 3272, + 3552, 2427, 3272, + 3552, 2430, 3271, + 3552, 2432, 3271, + 3551, 2436, 3270, + 3550, 2441, 3269, + 3549, 2447, 3267, + 3547, 2456, 3265, + 3545, 2467, 3261, + 3542, 2481, 3257, + 3538, 2500, 3252, + 3533, 2524, 3244, + 3525, 2554, 3234, + 3516, 2591, 3219, + 3502, 2636, 3200, + 3483, 2690, 3172, + 3457, 2754, 3131, + 3419, 2828, 3071, + 3363, 2910, 2976, + 3275, 3002, 2805, + 3123, 3100, 2380, + 2778, 3206, 0, + 0, 3317, 0, + 0, 3433, 0, + 0, 3553, 0, + 0, 3675, 0, + 3687, 2540, 3402, + 3687, 2540, 3402, + 3686, 2540, 3401, + 3686, 2541, 3401, + 3686, 2541, 3401, + 3686, 2542, 3401, + 3686, 2543, 3401, + 3686, 2544, 3401, + 3686, 2545, 3400, + 3685, 2548, 3400, + 3685, 2550, 3399, + 3684, 2554, 3398, + 3683, 2559, 3397, + 3682, 2566, 3395, + 3680, 2575, 3393, + 3678, 2586, 3390, + 3675, 2601, 3385, + 3671, 2620, 3380, + 3666, 2644, 3372, + 3659, 2675, 3362, + 3649, 2713, 3347, + 3635, 2759, 3327, + 3617, 2815, 3299, + 3590, 2880, 3258, + 3553, 2954, 3197, + 3497, 3038, 3100, + 3410, 3130, 2926, + 3258, 3229, 2484, + 2916, 3336, 0, + 0, 3448, 0, + 0, 3564, 0, + 0, 3684, 0, + 3819, 2661, 3531, + 3819, 2661, 3531, + 3819, 2661, 3531, + 3819, 2661, 3531, + 3819, 2662, 3531, + 3819, 2662, 3530, + 3819, 2663, 3530, + 3819, 2664, 3530, + 3819, 2665, 3530, + 3818, 2667, 3529, + 3818, 2669, 3529, + 3818, 2672, 3528, + 3817, 2676, 3527, + 3816, 2681, 3526, + 3815, 2688, 3524, + 3813, 2697, 3522, + 3811, 2708, 3519, + 3808, 2723, 3514, + 3804, 2743, 3509, + 3799, 2768, 3501, + 3792, 2799, 3490, + 3782, 2838, 3476, + 3768, 2885, 3456, + 3750, 2941, 3427, + 3723, 3007, 3386, + 3686, 3082, 3325, + 3630, 3166, 3227, + 3543, 3259, 3050, + 3392, 3359, 2593, + 3052, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 3952, 2784, 3661, + 3952, 2784, 3661, + 3952, 2785, 3661, + 3952, 2785, 3661, + 3952, 2785, 3661, + 3952, 2785, 3660, + 3952, 2786, 3660, + 3952, 2787, 3660, + 3952, 2788, 3660, + 3951, 2789, 3660, + 3951, 2791, 3659, + 3951, 2793, 3659, + 3950, 2796, 3658, + 3950, 2800, 3657, + 3949, 2805, 3656, + 3947, 2812, 3654, + 3946, 2821, 3652, + 3944, 2833, 3648, + 3941, 2848, 3644, + 3937, 2868, 3638, + 3932, 2893, 3631, + 3924, 2925, 3620, + 3915, 2964, 3605, + 3901, 3012, 3585, + 3882, 3068, 3556, + 3856, 3135, 3515, + 3819, 3211, 3453, + 3763, 3295, 3354, + 3676, 3389, 3176, + 3526, 3489, 2707, + 3188, 3597, 0, + 0, 3709, 0, + 4085, 2910, 3791, + 4085, 2910, 3791, + 4085, 2910, 3791, + 4085, 2910, 3791, + 4085, 2911, 3791, + 4085, 2911, 3791, + 4085, 2911, 3791, + 4084, 2912, 3791, + 4084, 2912, 3791, + 4084, 2913, 3790, + 4084, 2915, 3790, + 4084, 2916, 3790, + 4083, 2919, 3789, + 4083, 2922, 3788, + 4082, 2926, 3787, + 4081, 2931, 3786, + 4080, 2938, 3784, + 4078, 2947, 3782, + 4076, 2959, 3779, + 4073, 2975, 3775, + 4069, 2995, 3769, + 4064, 3020, 3761, + 4057, 3052, 3750, + 4047, 3092, 3736, + 4034, 3140, 3715, + 4015, 3197, 3686, + 3989, 3264, 3645, + 3951, 3340, 3583, + 3896, 3425, 3483, + 3809, 3519, 3303, + 3659, 3620, 2826, + 3322, 3728, 0, + 4095, 3037, 3922, + 4095, 3037, 3922, + 4095, 3037, 3922, + 4095, 3037, 3922, + 4095, 3038, 3922, + 4095, 3038, 3922, + 4095, 3038, 3922, + 4095, 3039, 3922, + 4095, 3039, 3922, + 4095, 3040, 3921, + 4095, 3041, 3921, + 4095, 3042, 3921, + 4095, 3044, 3920, + 4095, 3046, 3920, + 4095, 3049, 3919, + 4095, 3053, 3918, + 4095, 3059, 3917, + 4095, 3066, 3915, + 4095, 3075, 3913, + 4095, 3087, 3910, + 4095, 3103, 3905, + 4095, 3123, 3900, + 4095, 3149, 3892, + 4095, 3181, 3881, + 4095, 3221, 3866, + 4095, 3269, 3846, + 4095, 3327, 3817, + 4095, 3394, 3775, + 4084, 3470, 3713, + 4029, 3556, 3613, + 3942, 3650, 3432, + 3792, 3751, 2947, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3166, 4053, + 4095, 3167, 4053, + 4095, 3167, 4053, + 4095, 3168, 4053, + 4095, 3168, 4053, + 4095, 3169, 4052, + 4095, 3171, 4052, + 4095, 3172, 4052, + 4095, 3175, 4051, + 4095, 3178, 4050, + 4095, 3182, 4049, + 4095, 3187, 4048, + 4095, 3194, 4046, + 4095, 3204, 4044, + 4095, 3216, 4041, + 4095, 3232, 4037, + 4095, 3252, 4031, + 4095, 3278, 4023, + 4095, 3310, 4012, + 4095, 3350, 3997, + 4095, 3399, 3977, + 4095, 3457, 3948, + 4095, 3524, 3906, + 4095, 3601, 3843, + 4095, 3687, 3743, + 4074, 3781, 3561, + 0, 1606, 1871, + 0, 1607, 1869, + 0, 1610, 1867, + 0, 1612, 1864, + 0, 1616, 1861, + 0, 1622, 1856, + 0, 1628, 1849, + 0, 1637, 1840, + 0, 1649, 1827, + 0, 1664, 1810, + 0, 1684, 1786, + 0, 1709, 1751, + 0, 1740, 1701, + 0, 1779, 1623, + 0, 1826, 1491, + 0, 1883, 1222, + 0, 1949, 0, + 0, 2024, 0, + 0, 2108, 0, + 0, 2201, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1606, 1873, + 0, 1608, 1871, + 0, 1610, 1869, + 0, 1613, 1867, + 0, 1617, 1863, + 0, 1622, 1858, + 0, 1629, 1851, + 0, 1638, 1842, + 0, 1650, 1830, + 0, 1665, 1813, + 0, 1684, 1789, + 0, 1709, 1754, + 0, 1741, 1704, + 0, 1779, 1626, + 0, 1827, 1497, + 0, 1883, 1231, + 0, 1949, 0, + 0, 2024, 0, + 0, 2109, 0, + 0, 2202, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1607, 1876, + 0, 1609, 1874, + 0, 1611, 1872, + 0, 1614, 1870, + 0, 1618, 1866, + 0, 1623, 1861, + 0, 1630, 1855, + 0, 1639, 1846, + 0, 1650, 1833, + 0, 1666, 1816, + 0, 1685, 1792, + 0, 1710, 1758, + 0, 1741, 1708, + 0, 1780, 1632, + 0, 1827, 1503, + 0, 1883, 1243, + 0, 1949, 0, + 0, 2024, 0, + 0, 2109, 0, + 0, 2202, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1608, 1880, + 0, 1610, 1878, + 0, 1612, 1876, + 0, 1615, 1874, + 0, 1619, 1870, + 0, 1624, 1865, + 0, 1631, 1859, + 0, 1640, 1850, + 0, 1651, 1838, + 0, 1666, 1821, + 0, 1686, 1797, + 0, 1711, 1763, + 0, 1742, 1714, + 0, 1781, 1638, + 0, 1828, 1512, + 0, 1884, 1259, + 0, 1950, 0, + 0, 2025, 0, + 0, 2109, 0, + 0, 2202, 0, + 0, 2302, 0, + 0, 2409, 0, + 0, 2521, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1609, 1885, + 0, 1611, 1884, + 0, 1613, 1882, + 0, 1616, 1879, + 0, 1620, 1876, + 0, 1625, 1871, + 0, 1632, 1864, + 0, 1641, 1855, + 0, 1652, 1843, + 0, 1668, 1827, + 0, 1687, 1803, + 0, 1712, 1770, + 0, 1743, 1722, + 0, 1782, 1647, + 0, 1829, 1524, + 0, 1885, 1280, + 0, 1950, 0, + 0, 2025, 0, + 0, 2110, 0, + 0, 2202, 0, + 0, 2303, 0, + 0, 2409, 0, + 0, 2522, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1611, 1892, + 0, 1613, 1891, + 0, 1615, 1889, + 0, 1618, 1886, + 0, 1622, 1883, + 0, 1627, 1878, + 0, 1634, 1872, + 0, 1642, 1863, + 0, 1654, 1851, + 0, 1669, 1835, + 0, 1689, 1812, + 0, 1713, 1779, + 0, 1744, 1732, + 0, 1783, 1659, + 0, 1830, 1540, + 0, 1886, 1305, + 0, 1951, 254, + 0, 2026, 0, + 0, 2110, 0, + 0, 2203, 0, + 0, 2303, 0, + 0, 2410, 0, + 0, 2522, 0, + 0, 2638, 0, + 0, 2758, 0, + 0, 2881, 0, + 0, 3006, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1614, 1901, + 0, 1615, 1900, + 0, 1617, 1898, + 0, 1620, 1896, + 0, 1624, 1892, + 0, 1629, 1887, + 0, 1636, 1881, + 0, 1645, 1873, + 0, 1656, 1861, + 0, 1671, 1845, + 0, 1691, 1823, + 0, 1715, 1791, + 0, 1746, 1745, + 0, 1784, 1674, + 0, 1831, 1559, + 0, 1887, 1338, + 0, 1952, 508, + 0, 2027, 0, + 0, 2111, 0, + 0, 2203, 0, + 0, 2304, 0, + 0, 2410, 0, + 0, 2522, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2881, 0, + 0, 3007, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3390, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1617, 1913, + 0, 1618, 1912, + 0, 1620, 1910, + 0, 1623, 1908, + 0, 1627, 1904, + 0, 1632, 1900, + 0, 1639, 1894, + 0, 1648, 1885, + 0, 1659, 1874, + 0, 1674, 1859, + 0, 1693, 1837, + 0, 1718, 1806, + 0, 1748, 1761, + 0, 1787, 1694, + 0, 1833, 1584, + 0, 1889, 1378, + 0, 1954, 713, + 0, 2028, 0, + 0, 2112, 0, + 0, 2204, 0, + 0, 2304, 0, + 0, 2411, 0, + 0, 2522, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3133, 0, + 0, 3261, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1621, 1929, + 0, 1622, 1928, + 0, 1625, 1926, + 0, 1627, 1923, + 0, 1631, 1920, + 0, 1636, 1916, + 0, 1643, 1910, + 0, 1652, 1902, + 0, 1663, 1891, + 0, 1678, 1876, + 0, 1697, 1855, + 0, 1721, 1826, + 0, 1752, 1783, + 0, 1790, 1719, + 0, 1836, 1616, + 0, 1891, 1426, + 0, 1956, 894, + 0, 2030, 0, + 0, 2113, 0, + 0, 2206, 0, + 0, 2305, 0, + 0, 2411, 0, + 0, 2523, 0, + 0, 2639, 0, + 0, 2759, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1626, 1949, + 0, 1628, 1948, + 0, 1630, 1946, + 0, 1633, 1944, + 0, 1637, 1940, + 0, 1642, 1936, + 0, 1648, 1931, + 0, 1657, 1923, + 0, 1668, 1913, + 0, 1683, 1898, + 0, 1701, 1878, + 0, 1726, 1851, + 0, 1756, 1810, + 0, 1793, 1750, + 0, 1839, 1655, + 0, 1894, 1484, + 0, 1958, 1059, + 0, 2032, 0, + 0, 2115, 0, + 0, 2207, 0, + 0, 2306, 0, + 0, 2412, 0, + 0, 2524, 0, + 0, 2640, 0, + 0, 2760, 0, + 0, 2882, 0, + 0, 3007, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3520, 0, + 0, 3651, 0, + 0, 1634, 1974, + 0, 1635, 1973, + 0, 1637, 1971, + 0, 1640, 1969, + 0, 1644, 1966, + 0, 1649, 1962, + 0, 1655, 1957, + 0, 1664, 1950, + 0, 1675, 1940, + 0, 1689, 1927, + 0, 1708, 1908, + 0, 1731, 1882, + 0, 1761, 1844, + 0, 1798, 1789, + 0, 1844, 1702, + 0, 1898, 1552, + 0, 1962, 1214, + 0, 2035, 0, + 0, 2118, 0, + 0, 2209, 0, + 0, 2308, 0, + 0, 2414, 0, + 0, 2525, 0, + 0, 2641, 0, + 0, 2760, 0, + 0, 2883, 0, + 0, 3008, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 1107, 1643, 2006, + 1096, 1645, 2005, + 1081, 1647, 2003, + 1061, 1650, 2001, + 1031, 1653, 1999, + 989, 1658, 1995, + 926, 1664, 1990, + 824, 1673, 1983, + 639, 1684, 1974, + 132, 1698, 1962, + 0, 1716, 1945, + 0, 1739, 1921, + 0, 1769, 1886, + 0, 1805, 1836, + 0, 1850, 1758, + 0, 1904, 1628, + 0, 1967, 1363, + 0, 2039, 0, + 0, 2121, 0, + 0, 2212, 0, + 0, 2310, 0, + 0, 2415, 0, + 0, 2526, 0, + 0, 2642, 0, + 0, 2761, 0, + 0, 2883, 0, + 0, 3008, 0, + 0, 3134, 0, + 0, 3262, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 1479, 1656, 2045, + 1474, 1657, 2044, + 1468, 1659, 2043, + 1459, 1662, 2041, + 1447, 1666, 2039, + 1431, 1670, 2035, + 1408, 1676, 2031, + 1375, 1684, 2025, + 1327, 1695, 2016, + 1255, 1709, 2005, + 1135, 1727, 1989, + 899, 1749, 1968, + 0, 1778, 1937, + 0, 1814, 1892, + 0, 1858, 1824, + 0, 1911, 1714, + 0, 1973, 1507, + 0, 2045, 831, + 0, 2126, 0, + 0, 2215, 0, + 0, 2313, 0, + 0, 2418, 0, + 0, 2528, 0, + 0, 2643, 0, + 0, 2762, 0, + 0, 2884, 0, + 0, 3009, 0, + 0, 3135, 0, + 0, 3263, 0, + 0, 3391, 0, + 0, 3521, 0, + 0, 3651, 0, + 1732, 1672, 2093, + 1730, 1674, 2092, + 1726, 1676, 2091, + 1721, 1678, 2089, + 1715, 1681, 2087, + 1706, 1686, 2084, + 1693, 1692, 2080, + 1676, 1700, 2075, + 1652, 1710, 2067, + 1618, 1723, 2057, + 1568, 1741, 2043, + 1491, 1763, 2024, + 1362, 1791, 1997, + 1100, 1826, 1958, + 0, 1868, 1900, + 0, 1920, 1808, + 0, 1981, 1648, + 0, 2052, 1267, + 0, 2132, 0, + 0, 2220, 0, + 0, 2317, 0, + 0, 2421, 0, + 0, 2530, 0, + 0, 2645, 0, + 0, 2764, 0, + 0, 2885, 0, + 0, 3009, 0, + 0, 3136, 0, + 0, 3263, 0, + 0, 3392, 0, + 0, 3521, 0, + 0, 3651, 0, + 1938, 1693, 2150, + 1936, 1694, 2150, + 1934, 1696, 2148, + 1931, 1699, 2147, + 1927, 1702, 2145, + 1921, 1706, 2142, + 1913, 1712, 2139, + 1903, 1719, 2134, + 1889, 1729, 2127, + 1869, 1742, 2119, + 1840, 1759, 2106, + 1800, 1780, 2090, + 1739, 1807, 2066, + 1643, 1841, 2033, + 1470, 1882, 1984, + 1033, 1932, 1910, + 0, 1992, 1786, + 0, 2061, 1540, + 0, 2139, 54, + 0, 2227, 0, + 0, 2322, 0, + 0, 2425, 0, + 0, 2534, 0, + 0, 2648, 0, + 0, 2766, 0, + 0, 2887, 0, + 0, 3011, 0, + 0, 3136, 0, + 0, 3264, 0, + 0, 3392, 0, + 0, 3522, 0, + 0, 3652, 0, + 2118, 1720, 2217, + 2117, 1721, 2216, + 2116, 1723, 2215, + 2113, 1725, 2214, + 2111, 1728, 2212, + 2107, 1732, 2210, + 2102, 1737, 2207, + 2095, 1744, 2203, + 2086, 1754, 2197, + 2073, 1766, 2190, + 2055, 1782, 2179, + 2030, 1802, 2165, + 1994, 1828, 2145, + 1942, 1860, 2118, + 1861, 1900, 2077, + 1723, 1948, 2018, + 1431, 2006, 1923, + 0, 2073, 1755, + 0, 2149, 1339, + 0, 2235, 0, + 0, 2329, 0, + 0, 2430, 0, + 0, 2538, 0, + 0, 2651, 0, + 0, 2768, 0, + 0, 2889, 0, + 0, 3012, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 2283, 1753, 2293, + 2282, 1754, 2292, + 2281, 1756, 2292, + 2280, 1758, 2290, + 2278, 1761, 2289, + 2275, 1764, 2287, + 2272, 1769, 2285, + 2267, 1776, 2281, + 2261, 1785, 2276, + 2252, 1796, 2270, + 2240, 1811, 2261, + 2224, 1830, 2249, + 2201, 1854, 2233, + 2168, 1884, 2210, + 2121, 1922, 2178, + 2048, 1968, 2131, + 1928, 2024, 2059, + 1694, 2088, 1940, + 631, 2163, 1709, + 0, 2246, 718, + 0, 2338, 0, + 0, 2437, 0, + 0, 2544, 0, + 0, 2655, 0, + 0, 2772, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 2439, 1794, 2378, + 2438, 1795, 2378, + 2437, 1796, 2377, + 2436, 1798, 2376, + 2435, 1801, 2375, + 2433, 1804, 2373, + 2430, 1809, 2371, + 2427, 1815, 2368, + 2423, 1823, 2364, + 2417, 1833, 2359, + 2408, 1847, 2352, + 2397, 1864, 2342, + 2382, 1887, 2329, + 2360, 1915, 2311, + 2329, 1951, 2285, + 2285, 1994, 2248, + 2217, 2047, 2193, + 2108, 2108, 2108, + 1903, 2180, 1962, + 1252, 2260, 1639, + 0, 2350, 0, + 0, 2447, 0, + 0, 2551, 0, + 0, 2661, 0, + 0, 2776, 0, + 0, 2895, 0, + 0, 3017, 0, + 0, 3141, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3524, 0, + 0, 3653, 0, + 2587, 1843, 2472, + 2587, 1844, 2471, + 2586, 1845, 2471, + 2585, 1847, 2470, + 2584, 1850, 2469, + 2583, 1853, 2468, + 2581, 1857, 2466, + 2579, 1862, 2464, + 2576, 1869, 2460, + 2571, 1879, 2456, + 2566, 1891, 2451, + 2558, 1907, 2443, + 2547, 1928, 2432, + 2532, 1954, 2418, + 2511, 1986, 2397, + 2482, 2027, 2369, + 2439, 2076, 2327, + 2375, 2134, 2266, + 2273, 2201, 2167, + 2086, 2279, 1990, + 1566, 2365, 1526, + 0, 2459, 0, + 0, 2561, 0, + 0, 2669, 0, + 0, 2782, 0, + 0, 2899, 0, + 0, 3020, 0, + 0, 3144, 0, + 0, 3269, 0, + 0, 3396, 0, + 0, 3525, 0, + 0, 3654, 0, + 2731, 1902, 2573, + 2731, 1903, 2572, + 2731, 1904, 2572, + 2730, 1906, 2571, + 2729, 1908, 2570, + 2728, 1910, 2569, + 2727, 1914, 2568, + 2725, 1919, 2566, + 2723, 1925, 2564, + 2720, 1933, 2560, + 2716, 1944, 2556, + 2710, 1959, 2550, + 2702, 1977, 2541, + 2692, 2000, 2530, + 2677, 2030, 2514, + 2657, 2067, 2492, + 2629, 2112, 2461, + 2588, 2166, 2416, + 2526, 2229, 2347, + 2428, 2302, 2236, + 2252, 2384, 2024, + 1798, 2475, 1309, + 0, 2574, 0, + 0, 2679, 0, + 0, 2790, 0, + 0, 2906, 0, + 0, 3025, 0, + 0, 3147, 0, + 0, 3272, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 2872, 1970, 2680, + 2872, 1971, 2680, + 2872, 1972, 2679, + 2871, 1973, 2679, + 2871, 1975, 2678, + 2870, 1977, 2677, + 2869, 1981, 2676, + 2868, 1985, 2675, + 2866, 1990, 2673, + 2864, 1998, 2670, + 2861, 2007, 2667, + 2857, 2019, 2662, + 2851, 2036, 2655, + 2843, 2056, 2646, + 2833, 2083, 2634, + 2819, 2115, 2618, + 2799, 2156, 2594, + 2771, 2205, 2561, + 2731, 2264, 2512, + 2672, 2332, 2437, + 2577, 2409, 2314, + 2409, 2495, 2066, + 1993, 2590, 532, + 0, 2692, 0, + 0, 2800, 0, + 0, 2914, 0, + 0, 3031, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3657, 0, + 3011, 2048, 2793, + 3011, 2049, 2792, + 3010, 2050, 2792, + 3010, 2051, 2792, + 3010, 2052, 2791, + 3009, 2054, 2791, + 3008, 2057, 2790, + 3007, 2060, 2789, + 3006, 2065, 2787, + 3005, 2071, 2785, + 3002, 2079, 2782, + 2999, 2090, 2779, + 2995, 2104, 2774, + 2990, 2122, 2767, + 2982, 2144, 2757, + 2972, 2173, 2745, + 2958, 2209, 2727, + 2939, 2253, 2702, + 2911, 2306, 2667, + 2872, 2368, 2616, + 2813, 2440, 2536, + 2721, 2521, 2400, + 2558, 2611, 2118, + 2167, 2709, 0, + 0, 2814, 0, + 0, 2924, 0, + 0, 3039, 0, + 0, 3158, 0, + 0, 3280, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 3148, 2135, 2910, + 3147, 2135, 2909, + 3147, 2136, 2909, + 3147, 2137, 2909, + 3147, 2138, 2909, + 3146, 2140, 2908, + 3146, 2142, 2907, + 3145, 2145, 2907, + 3144, 2149, 2905, + 3143, 2154, 2904, + 3141, 2161, 2902, + 3139, 2170, 2899, + 3136, 2181, 2895, + 3132, 2196, 2890, + 3127, 2216, 2883, + 3119, 2241, 2873, + 3109, 2272, 2860, + 3095, 2310, 2842, + 3076, 2357, 2816, + 3049, 2413, 2779, + 3010, 2479, 2725, + 2953, 2554, 2640, + 2862, 2638, 2495, + 2703, 2731, 2178, + 2328, 2831, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 3283, 2230, 3030, + 3283, 2230, 3030, + 3283, 2231, 3030, + 3283, 2232, 3030, + 3283, 2233, 3029, + 3282, 2234, 3029, + 3282, 2236, 3028, + 3281, 2238, 3028, + 3281, 2241, 3027, + 3280, 2245, 3026, + 3279, 2251, 3024, + 3277, 2258, 3022, + 3275, 2268, 3019, + 3272, 2280, 3015, + 3268, 2297, 3010, + 3262, 2317, 3002, + 3255, 2344, 2992, + 3245, 2377, 2979, + 3231, 2418, 2960, + 3212, 2467, 2933, + 3186, 2526, 2896, + 3147, 2594, 2839, + 3090, 2672, 2751, + 3000, 2758, 2598, + 2844, 2853, 2248, + 2481, 2955, 0, + 0, 3064, 0, + 0, 3177, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3418, 2332, 3153, + 3418, 2332, 3153, + 3418, 2333, 3153, + 3418, 2333, 3153, + 3417, 2334, 3153, + 3417, 2335, 3152, + 3417, 2337, 3152, + 3417, 2339, 3151, + 3416, 2341, 3151, + 3415, 2344, 3150, + 3414, 2349, 3149, + 3413, 2355, 3147, + 3412, 2363, 3145, + 3409, 2373, 3142, + 3406, 2386, 3138, + 3403, 2403, 3132, + 3397, 2425, 3125, + 3390, 2453, 3115, + 3380, 2488, 3101, + 3366, 2531, 3082, + 3347, 2582, 3054, + 3321, 2643, 3016, + 3283, 2713, 2958, + 3226, 2793, 2866, + 3137, 2882, 2706, + 2983, 2978, 2328, + 2627, 3082, 0, + 0, 3191, 0, + 0, 3306, 0, + 0, 3424, 0, + 0, 3546, 0, + 0, 3670, 0, + 3552, 2440, 3279, + 3552, 2441, 3278, + 3552, 2441, 3278, + 3552, 2441, 3278, + 3552, 2442, 3278, + 3551, 2443, 3278, + 3551, 2444, 3278, + 3551, 2446, 3277, + 3551, 2448, 3277, + 3550, 2450, 3276, + 3549, 2454, 3275, + 3549, 2458, 3274, + 3547, 2465, 3272, + 3546, 2473, 3270, + 3543, 2484, 3267, + 3541, 2497, 3263, + 3537, 2515, 3257, + 3531, 2538, 3250, + 3524, 2567, 3239, + 3514, 2603, 3225, + 3500, 2648, 3206, + 3482, 2701, 3178, + 3455, 2763, 3138, + 3417, 2835, 3079, + 3361, 2917, 2986, + 3273, 3007, 2820, + 3120, 3105, 2416, + 2770, 3209, 0, + 0, 3320, 0, + 0, 3435, 0, + 0, 3554, 0, + 0, 3676, 0, + 3685, 2554, 3406, + 3685, 2554, 3405, + 3685, 2554, 3405, + 3685, 2555, 3405, + 3685, 2555, 3405, + 3685, 2556, 3405, + 3685, 2557, 3405, + 3685, 2558, 3405, + 3684, 2560, 3404, + 3684, 2562, 3404, + 3684, 2564, 3403, + 3683, 2568, 3402, + 3682, 2573, 3401, + 3681, 2579, 3399, + 3679, 2588, 3397, + 3677, 2599, 3394, + 3674, 2613, 3389, + 3670, 2632, 3384, + 3665, 2656, 3376, + 3658, 2686, 3366, + 3648, 2723, 3351, + 3634, 2768, 3332, + 3615, 2823, 3304, + 3589, 2886, 3263, + 3551, 2960, 3203, + 3495, 3042, 3108, + 3408, 3134, 2938, + 3255, 3233, 2512, + 2910, 3338, 0, + 0, 3449, 0, + 0, 3565, 0, + 0, 3685, 0, + 3819, 2672, 3534, + 3819, 2672, 3534, + 3819, 2672, 3534, + 3819, 2672, 3534, + 3818, 2673, 3533, + 3818, 2673, 3533, + 3818, 2674, 3533, + 3818, 2675, 3533, + 3818, 2676, 3533, + 3818, 2678, 3532, + 3817, 2680, 3532, + 3817, 2683, 3531, + 3816, 2686, 3530, + 3815, 2691, 3529, + 3814, 2698, 3527, + 3812, 2707, 3525, + 3810, 2718, 3522, + 3807, 2733, 3517, + 3803, 2752, 3512, + 3798, 2776, 3504, + 3791, 2807, 3494, + 3781, 2845, 3479, + 3767, 2891, 3459, + 3749, 2947, 3431, + 3722, 3012, 3390, + 3685, 3086, 3329, + 3629, 3170, 3232, + 3542, 3262, 3059, + 3390, 3362, 2616, + 3048, 3468, 0, + 0, 3580, 0, + 0, 3696, 0, + 3952, 2793, 3663, + 3952, 2793, 3663, + 3952, 2793, 3663, + 3951, 2793, 3663, + 3951, 2793, 3663, + 3951, 2794, 3663, + 3951, 2794, 3663, + 3951, 2795, 3662, + 3951, 2796, 3662, + 3951, 2797, 3662, + 3951, 2799, 3661, + 3950, 2801, 3661, + 3950, 2804, 3660, + 3949, 2808, 3659, + 3948, 2813, 3658, + 3947, 2820, 3656, + 3945, 2829, 3654, + 3943, 2840, 3651, + 3940, 2856, 3646, + 3936, 2875, 3641, + 3931, 2900, 3633, + 3924, 2931, 3622, + 3914, 2970, 3608, + 3900, 3017, 3588, + 3882, 3073, 3559, + 3856, 3139, 3518, + 3818, 3214, 3457, + 3762, 3298, 3359, + 3675, 3391, 3182, + 3524, 3491, 2725, + 3184, 3598, 0, + 0, 3710, 0, + 4084, 2916, 3793, + 4084, 2916, 3793, + 4084, 2916, 3793, + 4084, 2917, 3793, + 4084, 2917, 3793, + 4084, 2917, 3793, + 4084, 2918, 3793, + 4084, 2918, 3792, + 4084, 2919, 3792, + 4084, 2920, 3792, + 4083, 2921, 3792, + 4083, 2923, 3791, + 4083, 2925, 3791, + 4082, 2928, 3790, + 4082, 2932, 3789, + 4081, 2937, 3788, + 4080, 2944, 3786, + 4078, 2953, 3784, + 4076, 2965, 3781, + 4073, 2980, 3776, + 4069, 3000, 3771, + 4064, 3025, 3763, + 4056, 3057, 3752, + 4047, 3096, 3738, + 4033, 3144, 3717, + 4015, 3201, 3689, + 3988, 3267, 3647, + 3951, 3343, 3585, + 3895, 3428, 3486, + 3808, 3521, 3308, + 3658, 3622, 2839, + 3320, 3729, 0, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3042, 3923, + 4095, 3043, 3923, + 4095, 3043, 3923, + 4095, 3043, 3923, + 4095, 3044, 3923, + 4095, 3045, 3923, + 4095, 3046, 3922, + 4095, 3047, 3922, + 4095, 3049, 3922, + 4095, 3051, 3921, + 4095, 3054, 3920, + 4095, 3058, 3919, + 4095, 3063, 3918, + 4095, 3070, 3916, + 4095, 3079, 3914, + 4095, 3091, 3911, + 4095, 3107, 3907, + 4095, 3127, 3901, + 4095, 3152, 3893, + 4095, 3184, 3882, + 4095, 3224, 3868, + 4095, 3272, 3847, + 4095, 3329, 3819, + 4095, 3396, 3777, + 4084, 3472, 3715, + 4028, 3558, 3615, + 3941, 3651, 3435, + 3791, 3752, 2958, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3169, 4054, + 4095, 3170, 4054, + 4095, 3170, 4054, + 4095, 3170, 4054, + 4095, 3171, 4054, + 4095, 3171, 4054, + 4095, 3172, 4054, + 4095, 3173, 4053, + 4095, 3174, 4053, + 4095, 3176, 4053, + 4095, 3178, 4052, + 4095, 3181, 4051, + 4095, 3185, 4050, + 4095, 3191, 4049, + 4095, 3198, 4047, + 4095, 3207, 4045, + 4095, 3219, 4042, + 4095, 3235, 4037, + 4095, 3255, 4032, + 4095, 3281, 4024, + 4095, 3313, 4013, + 4095, 3353, 3998, + 4095, 3401, 3978, + 4095, 3459, 3949, + 4095, 3526, 3907, + 4095, 3602, 3845, + 4095, 3688, 3745, + 4074, 3782, 3564, + 0, 1736, 2002, + 0, 1737, 2001, + 0, 1739, 2000, + 0, 1741, 1998, + 0, 1744, 1995, + 0, 1748, 1991, + 0, 1753, 1986, + 0, 1760, 1979, + 0, 1769, 1970, + 0, 1781, 1958, + 0, 1796, 1940, + 0, 1816, 1916, + 0, 1841, 1881, + 0, 1872, 1830, + 0, 1911, 1752, + 0, 1958, 1620, + 0, 2015, 1347, + 0, 2080, 0, + 0, 2156, 0, + 0, 2240, 0, + 0, 2333, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1737, 2004, + 0, 1738, 2003, + 0, 1739, 2001, + 0, 1742, 1999, + 0, 1745, 1997, + 0, 1749, 1993, + 0, 1754, 1988, + 0, 1761, 1981, + 0, 1769, 1972, + 0, 1781, 1960, + 0, 1796, 1942, + 0, 1816, 1918, + 0, 1841, 1883, + 0, 1872, 1833, + 0, 1911, 1755, + 0, 1958, 1624, + 0, 2015, 1354, + 0, 2081, 0, + 0, 2156, 0, + 0, 2241, 0, + 0, 2333, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1737, 2006, + 0, 1738, 2005, + 0, 1740, 2004, + 0, 1742, 2002, + 0, 1745, 1999, + 0, 1749, 1995, + 0, 1754, 1990, + 0, 1761, 1984, + 0, 1770, 1974, + 0, 1782, 1962, + 0, 1797, 1945, + 0, 1817, 1921, + 0, 1841, 1886, + 0, 1873, 1836, + 0, 1912, 1759, + 0, 1959, 1629, + 0, 2015, 1363, + 0, 2081, 0, + 0, 2156, 0, + 0, 2241, 0, + 0, 2334, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1738, 2009, + 0, 1739, 2008, + 0, 1741, 2007, + 0, 1743, 2005, + 0, 1746, 2002, + 0, 1750, 1998, + 0, 1755, 1993, + 0, 1762, 1987, + 0, 1771, 1978, + 0, 1782, 1965, + 0, 1798, 1948, + 0, 1817, 1924, + 0, 1842, 1890, + 0, 1873, 1840, + 0, 1912, 1764, + 0, 1959, 1636, + 0, 2015, 1375, + 0, 2081, 0, + 0, 2157, 0, + 0, 2241, 0, + 0, 2334, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1739, 2013, + 0, 1740, 2012, + 0, 1742, 2011, + 0, 1744, 2009, + 0, 1747, 2006, + 0, 1751, 2002, + 0, 1756, 1997, + 0, 1763, 1991, + 0, 1772, 1982, + 0, 1783, 1970, + 0, 1798, 1953, + 0, 1818, 1929, + 0, 1843, 1895, + 0, 1874, 1846, + 0, 1913, 1771, + 0, 1960, 1645, + 0, 2016, 1391, + 0, 2082, 0, + 0, 2157, 0, + 0, 2241, 0, + 0, 2334, 0, + 0, 2434, 0, + 0, 2541, 0, + 0, 2653, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1740, 2018, + 0, 1741, 2017, + 0, 1743, 2016, + 0, 1745, 2014, + 0, 1748, 2011, + 0, 1752, 2008, + 0, 1757, 2003, + 0, 1764, 1996, + 0, 1773, 1988, + 0, 1785, 1975, + 0, 1800, 1959, + 0, 1819, 1935, + 0, 1844, 1902, + 0, 1875, 1854, + 0, 1914, 1779, + 0, 1961, 1656, + 0, 2017, 1412, + 0, 2082, 13, + 0, 2157, 0, + 0, 2242, 0, + 0, 2334, 0, + 0, 2435, 0, + 0, 2541, 0, + 0, 2654, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3138, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3522, 0, + 0, 3652, 0, + 0, 1742, 2025, + 0, 1743, 2024, + 0, 1745, 2023, + 0, 1747, 2021, + 0, 1750, 2018, + 0, 1754, 2015, + 0, 1759, 2010, + 0, 1766, 2004, + 0, 1775, 1995, + 0, 1786, 1983, + 0, 1801, 1967, + 0, 1821, 1944, + 0, 1845, 1911, + 0, 1876, 1864, + 0, 1915, 1791, + 0, 1962, 1672, + 0, 2018, 1438, + 0, 2083, 386, + 0, 2158, 0, + 0, 2242, 0, + 0, 2335, 0, + 0, 2435, 0, + 0, 2542, 0, + 0, 2654, 0, + 0, 2770, 0, + 0, 2890, 0, + 0, 3013, 0, + 0, 3139, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1744, 2035, + 0, 1746, 2033, + 0, 1747, 2032, + 0, 1749, 2030, + 0, 1752, 2028, + 0, 1756, 2024, + 0, 1761, 2020, + 0, 1768, 2013, + 0, 1777, 2005, + 0, 1788, 1993, + 0, 1803, 1977, + 0, 1823, 1955, + 0, 1847, 1923, + 0, 1878, 1877, + 0, 1917, 1806, + 0, 1963, 1691, + 0, 2019, 1470, + 0, 2084, 640, + 0, 2159, 0, + 0, 2243, 0, + 0, 2336, 0, + 0, 2436, 0, + 0, 2542, 0, + 0, 2654, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3265, 0, + 0, 3393, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1748, 2046, + 0, 1749, 2045, + 0, 1750, 2044, + 0, 1753, 2042, + 0, 1755, 2040, + 0, 1759, 2036, + 0, 1764, 2032, + 0, 1771, 2026, + 0, 1780, 2018, + 0, 1791, 2006, + 0, 1806, 1991, + 0, 1825, 1969, + 0, 1850, 1938, + 0, 1881, 1893, + 0, 1919, 1826, + 0, 1965, 1716, + 0, 2021, 1510, + 0, 2086, 846, + 0, 2160, 0, + 0, 2244, 0, + 0, 2336, 0, + 0, 2436, 0, + 0, 2543, 0, + 0, 2655, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1752, 2062, + 0, 1753, 2061, + 0, 1755, 2060, + 0, 1757, 2058, + 0, 1760, 2055, + 0, 1763, 2052, + 0, 1768, 2048, + 0, 1775, 2042, + 0, 1784, 2034, + 0, 1795, 2023, + 0, 1810, 2008, + 0, 1829, 1987, + 0, 1853, 1958, + 0, 1884, 1915, + 0, 1922, 1851, + 0, 1968, 1748, + 0, 2023, 1559, + 0, 2088, 1026, + 0, 2162, 0, + 0, 2246, 0, + 0, 2338, 0, + 0, 2437, 0, + 0, 2543, 0, + 0, 2655, 0, + 0, 2771, 0, + 0, 2891, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3652, 0, + 0, 1757, 2082, + 0, 1759, 2081, + 0, 1760, 2080, + 0, 1762, 2078, + 0, 1765, 2076, + 0, 1769, 2073, + 0, 1774, 2068, + 0, 1780, 2063, + 0, 1789, 2055, + 0, 1800, 2045, + 0, 1815, 2030, + 0, 1834, 2011, + 0, 1858, 1983, + 0, 1888, 1942, + 0, 1925, 1882, + 0, 1971, 1787, + 0, 2026, 1616, + 0, 2090, 1191, + 0, 2164, 0, + 0, 2247, 0, + 0, 2339, 0, + 0, 2438, 0, + 0, 2544, 0, + 0, 2656, 0, + 0, 2772, 0, + 0, 2892, 0, + 0, 3014, 0, + 0, 3139, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 30, 1765, 2107, + 0, 1766, 2106, + 0, 1767, 2105, + 0, 1770, 2103, + 0, 1772, 2101, + 0, 1776, 2098, + 0, 1781, 2094, + 0, 1787, 2089, + 0, 1796, 2082, + 0, 1807, 2072, + 0, 1821, 2059, + 0, 1840, 2040, + 0, 1864, 2014, + 0, 1893, 1976, + 0, 1931, 1921, + 0, 1976, 1834, + 0, 2030, 1684, + 0, 2094, 1346, + 0, 2167, 0, + 0, 2250, 0, + 0, 2341, 0, + 0, 2440, 0, + 0, 2546, 0, + 0, 2657, 0, + 0, 2773, 0, + 0, 2892, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3266, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 1247, 1774, 2139, + 1239, 1775, 2138, + 1228, 1777, 2137, + 1213, 1779, 2136, + 1193, 1782, 2133, + 1163, 1785, 2131, + 1121, 1790, 2127, + 1058, 1796, 2122, + 956, 1805, 2116, + 771, 1816, 2106, + 265, 1830, 2094, + 0, 1848, 2077, + 0, 1871, 2053, + 0, 1901, 2018, + 0, 1937, 1968, + 0, 1982, 1890, + 0, 2036, 1760, + 0, 2099, 1495, + 0, 2171, 0, + 0, 2253, 0, + 0, 2344, 0, + 0, 2442, 0, + 0, 2547, 0, + 0, 2658, 0, + 0, 2774, 0, + 0, 2893, 0, + 0, 3015, 0, + 0, 3140, 0, + 0, 3267, 0, + 0, 3394, 0, + 0, 3523, 0, + 0, 3653, 0, + 1614, 1787, 2178, + 1611, 1788, 2178, + 1606, 1790, 2177, + 1600, 1792, 2175, + 1591, 1794, 2173, + 1579, 1798, 2171, + 1563, 1802, 2167, + 1540, 1808, 2163, + 1507, 1817, 2157, + 1459, 1827, 2149, + 1387, 1841, 2137, + 1267, 1859, 2122, + 1031, 1881, 2100, + 0, 1910, 2069, + 0, 1946, 2024, + 0, 1990, 1956, + 0, 2043, 1846, + 0, 2105, 1639, + 0, 2177, 963, + 0, 2258, 0, + 0, 2348, 0, + 0, 2445, 0, + 0, 2550, 0, + 0, 2660, 0, + 0, 2775, 0, + 0, 2894, 0, + 0, 3016, 0, + 0, 3141, 0, + 0, 3267, 0, + 0, 3395, 0, + 0, 3523, 0, + 0, 3653, 0, + 1867, 1803, 2226, + 1865, 1804, 2225, + 1862, 1806, 2224, + 1858, 1808, 2223, + 1853, 1810, 2222, + 1847, 1814, 2219, + 1838, 1818, 2216, + 1825, 1824, 2212, + 1808, 1832, 2207, + 1784, 1842, 2199, + 1750, 1855, 2189, + 1700, 1873, 2175, + 1623, 1895, 2156, + 1494, 1923, 2129, + 1232, 1958, 2090, + 0, 2000, 2032, + 0, 2052, 1940, + 0, 2113, 1780, + 0, 2184, 1399, + 0, 2264, 0, + 0, 2352, 0, + 0, 2449, 0, + 0, 2553, 0, + 0, 2663, 0, + 0, 2777, 0, + 0, 2896, 0, + 0, 3017, 0, + 0, 3142, 0, + 0, 3268, 0, + 0, 3395, 0, + 0, 3524, 0, + 0, 3653, 0, + 2071, 1824, 2283, + 2070, 1825, 2282, + 2068, 1827, 2282, + 2066, 1828, 2281, + 2063, 1831, 2279, + 2059, 1834, 2277, + 2053, 1838, 2274, + 2046, 1844, 2271, + 2035, 1851, 2266, + 2021, 1861, 2260, + 2001, 1874, 2251, + 1973, 1891, 2239, + 1932, 1912, 2222, + 1871, 1939, 2198, + 1775, 1973, 2165, + 1602, 2014, 2117, + 1165, 2064, 2042, + 0, 2124, 1918, + 0, 2193, 1672, + 0, 2271, 186, + 0, 2359, 0, + 0, 2454, 0, + 0, 2557, 0, + 0, 2666, 0, + 0, 2780, 0, + 0, 2898, 0, + 0, 3019, 0, + 0, 3143, 0, + 0, 3268, 0, + 0, 3396, 0, + 0, 3524, 0, + 0, 3654, 0, + 2251, 1851, 2350, + 2250, 1852, 2349, + 2249, 1853, 2348, + 2248, 1855, 2347, + 2246, 1857, 2346, + 2243, 1860, 2344, + 2239, 1864, 2342, + 2234, 1869, 2339, + 2227, 1877, 2335, + 2218, 1886, 2329, + 2205, 1898, 2322, + 2187, 1914, 2311, + 2162, 1934, 2297, + 2127, 1960, 2277, + 2074, 1992, 2250, + 1993, 2032, 2210, + 1855, 2080, 2150, + 1563, 2138, 2055, + 0, 2205, 1887, + 0, 2281, 1471, + 0, 2367, 0, + 0, 2461, 0, + 0, 2562, 0, + 0, 2670, 0, + 0, 2783, 0, + 0, 2900, 0, + 0, 3021, 0, + 0, 3144, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 2416, 1884, 2425, + 2415, 1885, 2425, + 2415, 1886, 2424, + 2413, 1888, 2424, + 2412, 1890, 2423, + 2410, 1893, 2421, + 2408, 1896, 2419, + 2404, 1901, 2417, + 2399, 1908, 2413, + 2393, 1917, 2408, + 2384, 1928, 2402, + 2372, 1943, 2393, + 2356, 1962, 2382, + 2333, 1986, 2365, + 2300, 2017, 2342, + 2253, 2054, 2310, + 2180, 2101, 2263, + 2060, 2156, 2191, + 1826, 2220, 2072, + 763, 2295, 1841, + 0, 2378, 850, + 0, 2470, 0, + 0, 2570, 0, + 0, 2676, 0, + 0, 2787, 0, + 0, 2904, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 2571, 1925, 2511, + 2571, 1926, 2510, + 2570, 1927, 2510, + 2569, 1928, 2509, + 2568, 1930, 2508, + 2567, 1933, 2507, + 2565, 1936, 2505, + 2563, 1941, 2503, + 2559, 1947, 2500, + 2555, 1955, 2496, + 2549, 1965, 2491, + 2540, 1979, 2484, + 2529, 1997, 2474, + 2514, 2019, 2461, + 2492, 2048, 2443, + 2461, 2083, 2417, + 2417, 2126, 2380, + 2350, 2179, 2326, + 2240, 2240, 2240, + 2036, 2312, 2094, + 1384, 2392, 1771, + 0, 2482, 0, + 0, 2579, 0, + 0, 2683, 0, + 0, 2793, 0, + 0, 2908, 0, + 0, 3027, 0, + 0, 3149, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3656, 0, + 2720, 1975, 2604, + 2719, 1975, 2604, + 2719, 1976, 2603, + 2718, 1978, 2603, + 2718, 1979, 2602, + 2717, 1982, 2601, + 2715, 1985, 2600, + 2713, 1989, 2598, + 2711, 1994, 2596, + 2708, 2002, 2593, + 2704, 2011, 2588, + 2698, 2023, 2583, + 2690, 2039, 2575, + 2679, 2060, 2564, + 2664, 2086, 2550, + 2643, 2119, 2529, + 2614, 2159, 2501, + 2571, 2208, 2460, + 2508, 2266, 2398, + 2405, 2333, 2299, + 2218, 2411, 2122, + 1698, 2497, 1658, + 0, 2591, 0, + 0, 2693, 0, + 0, 2801, 0, + 0, 2914, 0, + 0, 3032, 0, + 0, 3152, 0, + 0, 3276, 0, + 0, 3401, 0, + 0, 3529, 0, + 0, 3657, 0, + 2864, 2033, 2705, + 2863, 2034, 2705, + 2863, 2035, 2704, + 2863, 2036, 2704, + 2862, 2038, 2703, + 2861, 2040, 2703, + 2860, 2042, 2702, + 2859, 2046, 2700, + 2857, 2051, 2698, + 2855, 2057, 2696, + 2852, 2066, 2692, + 2848, 2076, 2688, + 2842, 2091, 2682, + 2834, 2109, 2673, + 2824, 2133, 2662, + 2809, 2162, 2646, + 2789, 2199, 2624, + 2761, 2244, 2593, + 2720, 2298, 2548, + 2658, 2361, 2479, + 2560, 2434, 2368, + 2385, 2516, 2156, + 1930, 2607, 1441, + 0, 2706, 0, + 0, 2811, 0, + 0, 2922, 0, + 0, 3038, 0, + 0, 3157, 0, + 0, 3279, 0, + 0, 3404, 0, + 0, 3531, 0, + 0, 3658, 0, + 3004, 2102, 2812, + 3004, 2102, 2812, + 3004, 2103, 2812, + 3004, 2104, 2811, + 3003, 2105, 2811, + 3003, 2107, 2810, + 3002, 2110, 2810, + 3001, 2113, 2808, + 3000, 2117, 2807, + 2998, 2122, 2805, + 2996, 2130, 2802, + 2993, 2139, 2799, + 2989, 2152, 2794, + 2983, 2168, 2787, + 2976, 2188, 2779, + 2965, 2215, 2766, + 2951, 2248, 2750, + 2931, 2288, 2726, + 2903, 2337, 2693, + 2863, 2396, 2644, + 2804, 2464, 2570, + 2709, 2541, 2446, + 2541, 2628, 2199, + 2125, 2722, 664, + 0, 2824, 0, + 0, 2932, 0, + 0, 3046, 0, + 0, 3163, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3660, 0, + 3143, 2180, 2925, + 3143, 2180, 2925, + 3143, 2181, 2924, + 3142, 2182, 2924, + 3142, 2183, 2924, + 3142, 2184, 2923, + 3141, 2186, 2923, + 3141, 2189, 2922, + 3140, 2192, 2921, + 3138, 2197, 2919, + 3137, 2203, 2917, + 3134, 2211, 2914, + 3131, 2222, 2911, + 3127, 2236, 2906, + 3122, 2254, 2899, + 3114, 2276, 2890, + 3104, 2305, 2877, + 3090, 2341, 2859, + 3071, 2385, 2835, + 3043, 2438, 2799, + 3004, 2500, 2748, + 2945, 2572, 2668, + 2853, 2653, 2532, + 2690, 2743, 2250, + 2299, 2841, 0, + 0, 2946, 0, + 0, 3056, 0, + 0, 3171, 0, + 0, 3290, 0, + 0, 3412, 0, + 0, 3537, 0, + 0, 3663, 0, + 3280, 2267, 3042, + 3280, 2267, 3042, + 3280, 2267, 3041, + 3279, 2268, 3041, + 3279, 2269, 3041, + 3279, 2270, 3041, + 3278, 2272, 3040, + 3278, 2274, 3039, + 3277, 2277, 3039, + 3276, 2281, 3037, + 3275, 2286, 3036, + 3273, 2293, 3034, + 3271, 2302, 3031, + 3268, 2313, 3027, + 3264, 2328, 3022, + 3259, 2348, 3015, + 3251, 2373, 3005, + 3241, 2404, 2992, + 3227, 2442, 2974, + 3208, 2489, 2948, + 3181, 2545, 2911, + 3142, 2611, 2857, + 3085, 2686, 2773, + 2994, 2770, 2628, + 2835, 2863, 2310, + 2460, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 3415, 2362, 3162, + 3415, 2362, 3162, + 3415, 2362, 3162, + 3415, 2363, 3162, + 3415, 2364, 3162, + 3415, 2365, 3161, + 3414, 2366, 3161, + 3414, 2368, 3160, + 3414, 2370, 3160, + 3413, 2373, 3159, + 3412, 2377, 3158, + 3411, 2383, 3156, + 3409, 2390, 3154, + 3407, 2400, 3151, + 3404, 2412, 3147, + 3400, 2429, 3142, + 3394, 2449, 3134, + 3387, 2476, 3124, + 3377, 2509, 3111, + 3363, 2550, 3092, + 3344, 2599, 3066, + 3318, 2658, 3028, + 3279, 2726, 2971, + 3222, 2804, 2883, + 3132, 2891, 2730, + 2976, 2985, 2380, + 2613, 3088, 0, + 0, 3196, 0, + 0, 3309, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3550, 2464, 3285, + 3550, 2464, 3285, + 3550, 2464, 3285, + 3550, 2465, 3285, + 3550, 2465, 3285, + 3550, 2466, 3285, + 3549, 2467, 3284, + 3549, 2469, 3284, + 3549, 2471, 3284, + 3548, 2473, 3283, + 3548, 2477, 3282, + 3547, 2481, 3281, + 3545, 2487, 3279, + 3544, 2495, 3277, + 3542, 2505, 3274, + 3539, 2518, 3270, + 3535, 2535, 3264, + 3529, 2557, 3257, + 3522, 2585, 3247, + 3512, 2620, 3233, + 3498, 2663, 3214, + 3479, 2714, 3187, + 3453, 2775, 3148, + 3415, 2845, 3090, + 3358, 2925, 2999, + 3269, 3014, 2838, + 3115, 3110, 2460, + 2760, 3214, 0, + 0, 3323, 0, + 0, 3438, 0, + 0, 3556, 0, + 0, 3678, 0, + 3684, 2572, 3411, + 3684, 2572, 3411, + 3684, 2573, 3411, + 3684, 2573, 3410, + 3684, 2574, 3410, + 3684, 2574, 3410, + 3684, 2575, 3410, + 3683, 2576, 3410, + 3683, 2578, 3409, + 3683, 2580, 3409, + 3682, 2582, 3408, + 3682, 2586, 3407, + 3681, 2591, 3406, + 3679, 2597, 3404, + 3678, 2605, 3402, + 3676, 2616, 3399, + 3673, 2630, 3395, + 3669, 2647, 3389, + 3663, 2670, 3382, + 3656, 2699, 3371, + 3646, 2736, 3357, + 3633, 2780, 3338, + 3614, 2833, 3310, + 3587, 2895, 3270, + 3549, 2967, 3211, + 3493, 3049, 3118, + 3405, 3139, 2952, + 3252, 3237, 2548, + 2902, 3342, 0, + 0, 3452, 0, + 0, 3567, 0, + 0, 3686, 0, + 3818, 2686, 3538, + 3818, 2686, 3538, + 3818, 2686, 3538, + 3818, 2686, 3537, + 3817, 2687, 3537, + 3817, 2687, 3537, + 3817, 2688, 3537, + 3817, 2689, 3537, + 3817, 2690, 3537, + 3817, 2692, 3536, + 3816, 2694, 3536, + 3816, 2696, 3535, + 3815, 2700, 3534, + 3814, 2705, 3533, + 3813, 2711, 3531, + 3811, 2720, 3529, + 3809, 2731, 3526, + 3806, 2745, 3522, + 3802, 2764, 3516, + 3797, 2788, 3508, + 3790, 2818, 3498, + 3780, 2855, 3484, + 3766, 2900, 3464, + 3748, 2955, 3436, + 3721, 3018, 3395, + 3683, 3092, 3335, + 3627, 3174, 3240, + 3540, 3266, 3070, + 3387, 3365, 2644, + 3042, 3470, 0, + 0, 3582, 0, + 0, 3697, 0, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2804, 3666, + 3951, 2805, 3666, + 3951, 2805, 3665, + 3950, 2806, 3665, + 3950, 2807, 3665, + 3950, 2808, 3665, + 3950, 2810, 3664, + 3949, 2812, 3664, + 3949, 2815, 3663, + 3948, 2818, 3662, + 3947, 2823, 3661, + 3946, 2830, 3659, + 3944, 2839, 3657, + 3942, 2850, 3654, + 3939, 2865, 3650, + 3935, 2884, 3644, + 3930, 2909, 3636, + 3923, 2939, 3626, + 3913, 2977, 3611, + 3900, 3024, 3591, + 3881, 3079, 3563, + 3855, 3144, 3522, + 3817, 3218, 3461, + 3761, 3302, 3364, + 3674, 3394, 3191, + 3522, 3494, 2748, + 3180, 3600, 0, + 0, 3712, 0, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2925, 3795, + 4084, 2926, 3795, + 4083, 2926, 3795, + 4083, 2926, 3795, + 4083, 2927, 3794, + 4083, 2928, 3794, + 4083, 2929, 3794, + 4083, 2931, 3794, + 4082, 2933, 3793, + 4082, 2936, 3792, + 4081, 2940, 3791, + 4080, 2945, 3790, + 4079, 2952, 3788, + 4077, 2961, 3786, + 4075, 2972, 3783, + 4072, 2988, 3779, + 4068, 3007, 3773, + 4063, 3032, 3765, + 4056, 3063, 3755, + 4046, 3102, 3740, + 4033, 3149, 3720, + 4014, 3205, 3691, + 3988, 3271, 3650, + 3950, 3346, 3589, + 3894, 3430, 3491, + 3807, 3523, 3314, + 3656, 3623, 2857, + 3317, 3730, 0, + 4095, 3048, 3925, + 4095, 3048, 3925, + 4095, 3048, 3925, + 4095, 3049, 3925, + 4095, 3049, 3925, + 4095, 3049, 3925, + 4095, 3049, 3925, + 4095, 3050, 3925, + 4095, 3050, 3924, + 4095, 3051, 3924, + 4095, 3052, 3924, + 4095, 3053, 3924, + 4095, 3055, 3923, + 4095, 3057, 3923, + 4095, 3060, 3922, + 4095, 3064, 3921, + 4095, 3069, 3920, + 4095, 3076, 3918, + 4095, 3085, 3916, + 4095, 3097, 3913, + 4095, 3112, 3908, + 4095, 3132, 3903, + 4095, 3157, 3895, + 4095, 3189, 3884, + 4095, 3228, 3870, + 4095, 3276, 3849, + 4095, 3333, 3821, + 4095, 3399, 3779, + 4083, 3475, 3717, + 4027, 3560, 3619, + 3940, 3653, 3440, + 3790, 3754, 2972, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3174, 4055, + 4095, 3175, 4055, + 4095, 3175, 4055, + 4095, 3175, 4055, + 4095, 3176, 4055, + 4095, 3177, 4055, + 4095, 3178, 4055, + 4095, 3179, 4054, + 4095, 3181, 4054, + 4095, 3183, 4053, + 4095, 3186, 4053, + 4095, 3190, 4052, + 4095, 3195, 4050, + 4095, 3202, 4049, + 4095, 3211, 4046, + 4095, 3223, 4043, + 4095, 3239, 4039, + 4095, 3259, 4033, + 4095, 3285, 4025, + 4095, 3317, 4015, + 4095, 3356, 4000, + 4095, 3404, 3979, + 4095, 3461, 3951, + 4095, 3528, 3909, + 4095, 3604, 3847, + 4095, 3690, 3747, + 4073, 3783, 3567, + 0, 1867, 2134, + 0, 1868, 2133, + 0, 1869, 2132, + 0, 1871, 2130, + 0, 1873, 2128, + 0, 1876, 2126, + 0, 1880, 2122, + 0, 1885, 2117, + 0, 1892, 2110, + 0, 1901, 2101, + 0, 1913, 2088, + 0, 1928, 2071, + 0, 1948, 2047, + 0, 1973, 2012, + 0, 2004, 1961, + 0, 2043, 1882, + 0, 2090, 1749, + 0, 2146, 1473, + 0, 2212, 0, + 0, 2288, 0, + 0, 2372, 0, + 0, 2465, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 0, 1867, 2135, + 0, 1868, 2134, + 0, 1869, 2133, + 0, 1871, 2132, + 0, 1873, 2130, + 0, 1876, 2127, + 0, 1880, 2123, + 0, 1885, 2118, + 0, 1892, 2112, + 0, 1901, 2102, + 0, 1913, 2090, + 0, 1928, 2072, + 0, 1948, 2048, + 0, 1973, 2013, + 0, 2004, 1962, + 0, 2043, 1884, + 0, 2090, 1752, + 0, 2147, 1479, + 0, 2213, 0, + 0, 2288, 0, + 0, 2372, 0, + 0, 2465, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3654, 0, + 0, 1868, 2137, + 0, 1869, 2136, + 0, 1870, 2135, + 0, 1872, 2133, + 0, 1874, 2131, + 0, 1877, 2129, + 0, 1881, 2125, + 0, 1886, 2120, + 0, 1893, 2113, + 0, 1902, 2104, + 0, 1913, 2092, + 0, 1929, 2074, + 0, 1948, 2050, + 0, 1973, 2016, + 0, 2004, 1965, + 0, 2043, 1887, + 0, 2091, 1756, + 0, 2147, 1486, + 0, 2213, 0, + 0, 2288, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1868, 2139, + 0, 1869, 2138, + 0, 1870, 2137, + 0, 1872, 2136, + 0, 1874, 2134, + 0, 1877, 2131, + 0, 1881, 2127, + 0, 1886, 2122, + 0, 1893, 2116, + 0, 1902, 2107, + 0, 1914, 2094, + 0, 1929, 2077, + 0, 1949, 2053, + 0, 1974, 2019, + 0, 2005, 1968, + 0, 2044, 1891, + 0, 2091, 1761, + 0, 2147, 1495, + 0, 2213, 0, + 0, 2288, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1869, 2142, + 0, 1870, 2141, + 0, 1871, 2140, + 0, 1873, 2139, + 0, 1875, 2137, + 0, 1878, 2134, + 0, 1882, 2130, + 0, 1887, 2125, + 0, 1894, 2119, + 0, 1903, 2110, + 0, 1915, 2097, + 0, 1930, 2080, + 0, 1949, 2056, + 0, 1974, 2022, + 0, 2005, 1973, + 0, 2044, 1896, + 0, 2091, 1768, + 0, 2148, 1508, + 0, 2213, 0, + 0, 2289, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2566, 0, + 0, 2673, 0, + 0, 2785, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1870, 2146, + 0, 1871, 2145, + 0, 1872, 2144, + 0, 1874, 2143, + 0, 1876, 2141, + 0, 1879, 2138, + 0, 1883, 2134, + 0, 1888, 2130, + 0, 1895, 2123, + 0, 1904, 2114, + 0, 1915, 2102, + 0, 1931, 2085, + 0, 1950, 2061, + 0, 1975, 2028, + 0, 2006, 1978, + 0, 2045, 1903, + 0, 2092, 1777, + 0, 2148, 1523, + 0, 2214, 0, + 0, 2289, 0, + 0, 2373, 0, + 0, 2466, 0, + 0, 2567, 0, + 0, 2673, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3270, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1871, 2151, + 0, 1872, 2151, + 0, 1874, 2149, + 0, 1875, 2148, + 0, 1877, 2146, + 0, 1880, 2143, + 0, 1884, 2140, + 0, 1889, 2135, + 0, 1896, 2129, + 0, 1905, 2120, + 0, 1917, 2108, + 0, 1932, 2091, + 0, 1951, 2068, + 0, 1976, 2034, + 0, 2007, 1986, + 0, 2046, 1912, + 0, 2093, 1788, + 0, 2149, 1544, + 0, 2214, 145, + 0, 2290, 0, + 0, 2374, 0, + 0, 2467, 0, + 0, 2567, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3022, 0, + 0, 3145, 0, + 0, 3271, 0, + 0, 3397, 0, + 0, 3525, 0, + 0, 3655, 0, + 0, 1873, 2158, + 0, 1874, 2157, + 0, 1875, 2156, + 0, 1877, 2155, + 0, 1879, 2153, + 0, 1882, 2150, + 0, 1886, 2147, + 0, 1891, 2142, + 0, 1898, 2136, + 0, 1907, 2127, + 0, 1918, 2115, + 0, 1933, 2099, + 0, 1953, 2076, + 0, 1977, 2043, + 0, 2009, 1996, + 0, 2047, 1923, + 0, 2094, 1804, + 0, 2150, 1570, + 0, 2215, 518, + 0, 2290, 0, + 0, 2374, 0, + 0, 2467, 0, + 0, 2567, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2902, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3397, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1876, 2167, + 0, 1876, 2167, + 0, 1878, 2166, + 0, 1879, 2164, + 0, 1882, 2162, + 0, 1884, 2160, + 0, 1888, 2156, + 0, 1893, 2152, + 0, 1900, 2145, + 0, 1909, 2137, + 0, 1920, 2125, + 0, 1935, 2109, + 0, 1955, 2087, + 0, 1979, 2055, + 0, 2010, 2009, + 0, 2049, 1938, + 0, 2095, 1823, + 0, 2151, 1602, + 0, 2216, 772, + 0, 2291, 0, + 0, 2375, 0, + 0, 2468, 0, + 0, 2568, 0, + 0, 2674, 0, + 0, 2786, 0, + 0, 2903, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1879, 2179, + 0, 1880, 2179, + 0, 1881, 2178, + 0, 1883, 2176, + 0, 1885, 2174, + 0, 1888, 2172, + 0, 1891, 2168, + 0, 1896, 2164, + 0, 1903, 2158, + 0, 1912, 2150, + 0, 1923, 2138, + 0, 1938, 2123, + 0, 1957, 2101, + 0, 1982, 2070, + 0, 2013, 2026, + 0, 2051, 1958, + 0, 2097, 1848, + 0, 2153, 1642, + 0, 2218, 978, + 0, 2293, 0, + 0, 2376, 0, + 0, 2469, 0, + 0, 2568, 0, + 0, 2675, 0, + 0, 2787, 0, + 0, 2903, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1883, 2195, + 0, 1884, 2194, + 0, 1885, 2193, + 0, 1887, 2192, + 0, 1889, 2190, + 0, 1892, 2188, + 0, 1895, 2184, + 0, 1900, 2180, + 0, 1907, 2174, + 0, 1916, 2166, + 0, 1927, 2155, + 0, 1942, 2140, + 0, 1961, 2119, + 0, 1985, 2090, + 0, 2016, 2047, + 0, 2054, 1983, + 0, 2100, 1880, + 0, 2155, 1691, + 0, 2220, 1158, + 0, 2294, 0, + 0, 2378, 0, + 0, 2470, 0, + 0, 2569, 0, + 0, 2676, 0, + 0, 2787, 0, + 0, 2904, 0, + 0, 3023, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 0, 1889, 2215, + 0, 1889, 2214, + 0, 1891, 2213, + 0, 1892, 2212, + 0, 1894, 2210, + 0, 1897, 2208, + 0, 1901, 2205, + 0, 1906, 2200, + 0, 1912, 2195, + 0, 1921, 2187, + 0, 1932, 2177, + 0, 1947, 2163, + 0, 1966, 2143, + 0, 1990, 2115, + 0, 2020, 2074, + 0, 2058, 2014, + 0, 2103, 1919, + 0, 2158, 1748, + 0, 2223, 1323, + 0, 2296, 0, + 0, 2380, 0, + 0, 2471, 0, + 0, 2571, 0, + 0, 2677, 0, + 0, 2788, 0, + 0, 2904, 0, + 0, 3024, 0, + 0, 3146, 0, + 0, 3271, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 241, 1896, 2240, + 162, 1897, 2239, + 31, 1898, 2238, + 0, 1900, 2237, + 0, 1902, 2236, + 0, 1904, 2233, + 0, 1908, 2230, + 0, 1913, 2227, + 0, 1919, 2221, + 0, 1928, 2214, + 0, 1939, 2204, + 0, 1953, 2191, + 0, 1972, 2172, + 0, 1996, 2146, + 0, 2026, 2108, + 0, 2063, 2053, + 0, 2108, 1966, + 0, 2162, 1816, + 0, 2226, 1478, + 0, 2299, 0, + 0, 2382, 0, + 0, 2473, 0, + 0, 2572, 0, + 0, 2678, 0, + 0, 2789, 0, + 0, 2905, 0, + 0, 3024, 0, + 0, 3147, 0, + 0, 3272, 0, + 0, 3398, 0, + 0, 3526, 0, + 0, 3655, 0, + 1385, 1906, 2272, + 1379, 1906, 2271, + 1371, 1908, 2270, + 1360, 1909, 2269, + 1345, 1911, 2268, + 1325, 1914, 2266, + 1296, 1917, 2263, + 1253, 1922, 2259, + 1190, 1929, 2254, + 1089, 1937, 2248, + 903, 1948, 2239, + 397, 1962, 2226, + 0, 1980, 2209, + 0, 2003, 2185, + 0, 2033, 2150, + 0, 2069, 2100, + 0, 2114, 2023, + 0, 2168, 1893, + 0, 2231, 1627, + 0, 2303, 0, + 0, 2385, 0, + 0, 2476, 0, + 0, 2574, 0, + 0, 2680, 0, + 0, 2790, 0, + 0, 2906, 0, + 0, 3025, 0, + 0, 3148, 0, + 0, 3272, 0, + 0, 3399, 0, + 0, 3526, 0, + 0, 3655, 0, + 1749, 1918, 2311, + 1747, 1919, 2310, + 1743, 1920, 2310, + 1738, 1922, 2309, + 1732, 1924, 2307, + 1723, 1926, 2305, + 1711, 1930, 2303, + 1695, 1934, 2300, + 1672, 1941, 2295, + 1639, 1949, 2289, + 1592, 1959, 2281, + 1519, 1973, 2269, + 1399, 1991, 2254, + 1164, 2014, 2232, + 83, 2042, 2201, + 0, 2078, 2156, + 0, 2122, 2088, + 0, 2175, 1978, + 0, 2237, 1771, + 0, 2309, 1096, + 0, 2390, 0, + 0, 2480, 0, + 0, 2577, 0, + 0, 2682, 0, + 0, 2792, 0, + 0, 2907, 0, + 0, 3026, 0, + 0, 3148, 0, + 0, 3273, 0, + 0, 3399, 0, + 0, 3527, 0, + 0, 3656, 0, + 2000, 1935, 2359, + 1999, 1935, 2358, + 1997, 1936, 2358, + 1994, 1938, 2357, + 1990, 1940, 2355, + 1985, 1942, 2354, + 1979, 1946, 2351, + 1970, 1950, 2348, + 1957, 1956, 2344, + 1940, 1964, 2339, + 1916, 1974, 2331, + 1882, 1988, 2321, + 1832, 2005, 2307, + 1755, 2027, 2288, + 1626, 2055, 2261, + 1364, 2090, 2222, + 0, 2133, 2164, + 0, 2184, 2073, + 0, 2245, 1912, + 0, 2316, 1531, + 0, 2396, 0, + 0, 2484, 0, + 0, 2581, 0, + 0, 2685, 0, + 0, 2795, 0, + 0, 2909, 0, + 0, 3028, 0, + 0, 3149, 0, + 0, 3274, 0, + 0, 3400, 0, + 0, 3527, 0, + 0, 3656, 0, + 2205, 1955, 2416, + 2204, 1956, 2415, + 2202, 1957, 2415, + 2201, 1959, 2414, + 2198, 1960, 2413, + 2195, 1963, 2411, + 2191, 1966, 2409, + 2185, 1970, 2407, + 2178, 1976, 2403, + 2167, 1984, 2398, + 2153, 1993, 2392, + 2133, 2006, 2383, + 2105, 2023, 2371, + 2064, 2044, 2354, + 2003, 2071, 2331, + 1907, 2105, 2297, + 1734, 2146, 2249, + 1297, 2196, 2174, + 0, 2256, 2050, + 0, 2325, 1804, + 0, 2403, 318, + 0, 2491, 0, + 0, 2586, 0, + 0, 2689, 0, + 0, 2798, 0, + 0, 2912, 0, + 0, 3030, 0, + 0, 3151, 0, + 0, 3275, 0, + 0, 3401, 0, + 0, 3528, 0, + 0, 3656, 0, + 2384, 1982, 2482, + 2383, 1983, 2482, + 2382, 1984, 2481, + 2381, 1985, 2480, + 2380, 1987, 2479, + 2378, 1989, 2478, + 2375, 1992, 2476, + 2371, 1996, 2474, + 2366, 2002, 2471, + 2359, 2009, 2467, + 2350, 2018, 2461, + 2337, 2030, 2454, + 2319, 2046, 2443, + 2294, 2066, 2429, + 2259, 2092, 2410, + 2206, 2124, 2382, + 2125, 2164, 2342, + 1987, 2212, 2282, + 1696, 2270, 2187, + 0, 2337, 2019, + 0, 2414, 1603, + 0, 2499, 0, + 0, 2593, 0, + 0, 2694, 0, + 0, 2802, 0, + 0, 2915, 0, + 0, 3032, 0, + 0, 3153, 0, + 0, 3276, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 2549, 2015, 2558, + 2548, 2016, 2558, + 2547, 2017, 2557, + 2547, 2018, 2557, + 2546, 2020, 2556, + 2544, 2022, 2555, + 2542, 2025, 2553, + 2540, 2029, 2551, + 2536, 2034, 2549, + 2531, 2040, 2545, + 2525, 2049, 2541, + 2516, 2060, 2534, + 2504, 2075, 2526, + 2488, 2094, 2514, + 2465, 2118, 2497, + 2432, 2149, 2475, + 2385, 2187, 2442, + 2312, 2233, 2395, + 2192, 2288, 2323, + 1958, 2352, 2204, + 895, 2427, 1973, + 0, 2510, 982, + 0, 2602, 0, + 0, 2702, 0, + 0, 2808, 0, + 0, 2919, 0, + 0, 3036, 0, + 0, 3156, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 2703, 2056, 2643, + 2703, 2057, 2643, + 2703, 2058, 2642, + 2702, 2059, 2642, + 2701, 2060, 2641, + 2700, 2062, 2640, + 2699, 2065, 2639, + 2697, 2068, 2637, + 2695, 2073, 2635, + 2691, 2079, 2632, + 2687, 2087, 2629, + 2681, 2097, 2623, + 2673, 2111, 2616, + 2661, 2129, 2607, + 2646, 2151, 2593, + 2624, 2180, 2575, + 2593, 2215, 2549, + 2549, 2259, 2512, + 2482, 2311, 2458, + 2373, 2373, 2373, + 2168, 2444, 2226, + 1516, 2524, 1903, + 0, 2614, 0, + 0, 2711, 0, + 0, 2815, 0, + 0, 2925, 0, + 0, 3040, 0, + 0, 3159, 0, + 0, 3281, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 2852, 2106, 2736, + 2852, 2107, 2736, + 2851, 2107, 2736, + 2851, 2108, 2735, + 2850, 2110, 2735, + 2850, 2111, 2734, + 2849, 2114, 2733, + 2847, 2117, 2732, + 2846, 2121, 2730, + 2843, 2126, 2728, + 2840, 2134, 2725, + 2836, 2143, 2720, + 2830, 2155, 2715, + 2822, 2171, 2707, + 2811, 2192, 2696, + 2796, 2218, 2682, + 2775, 2251, 2662, + 2746, 2291, 2633, + 2703, 2340, 2592, + 2640, 2398, 2530, + 2537, 2466, 2431, + 2350, 2543, 2254, + 1830, 2629, 1790, + 0, 2723, 0, + 0, 2825, 0, + 0, 2933, 0, + 0, 3046, 0, + 0, 3164, 0, + 0, 3284, 0, + 0, 3408, 0, + 0, 3533, 0, + 0, 3661, 0, + 2996, 2165, 2837, + 2996, 2165, 2837, + 2995, 2166, 2837, + 2995, 2167, 2836, + 2995, 2168, 2836, + 2994, 2170, 2835, + 2994, 2172, 2835, + 2993, 2174, 2834, + 2991, 2178, 2832, + 2990, 2183, 2830, + 2987, 2189, 2828, + 2984, 2198, 2825, + 2980, 2209, 2820, + 2974, 2223, 2814, + 2966, 2241, 2805, + 2956, 2265, 2794, + 2941, 2294, 2778, + 2921, 2331, 2756, + 2893, 2376, 2725, + 2852, 2430, 2680, + 2790, 2493, 2611, + 2693, 2566, 2500, + 2517, 2648, 2288, + 2062, 2739, 1573, + 0, 2838, 0, + 0, 2943, 0, + 0, 3054, 0, + 0, 3170, 0, + 0, 3289, 0, + 0, 3412, 0, + 0, 3536, 0, + 0, 3663, 0, + 3137, 2233, 2944, + 3136, 2234, 2944, + 3136, 2234, 2944, + 3136, 2235, 2944, + 3136, 2236, 2944, + 3135, 2238, 2943, + 3135, 2239, 2942, + 3134, 2242, 2942, + 3133, 2245, 2941, + 3132, 2249, 2939, + 3130, 2254, 2937, + 3128, 2262, 2934, + 3125, 2271, 2931, + 3121, 2284, 2926, + 3115, 2300, 2920, + 3108, 2320, 2911, + 3097, 2347, 2899, + 3083, 2380, 2882, + 3063, 2420, 2858, + 3036, 2469, 2825, + 2996, 2528, 2776, + 2936, 2596, 2702, + 2841, 2673, 2578, + 2673, 2760, 2331, + 2257, 2854, 796, + 0, 2956, 0, + 0, 3064, 0, + 0, 3178, 0, + 0, 3295, 0, + 0, 3416, 0, + 0, 3540, 0, + 0, 3665, 0, + 3275, 2311, 3057, + 3275, 2312, 3057, + 3275, 2312, 3057, + 3275, 2313, 3057, + 3275, 2314, 3056, + 3274, 2315, 3056, + 3274, 2316, 3055, + 3273, 2318, 3055, + 3273, 2321, 3054, + 3272, 2324, 3053, + 3270, 2329, 3051, + 3269, 2335, 3049, + 3267, 2343, 3046, + 3263, 2354, 3043, + 3259, 2368, 3038, + 3254, 2386, 3031, + 3246, 2409, 3022, + 3236, 2437, 3009, + 3222, 2473, 2991, + 3203, 2517, 2967, + 3175, 2570, 2931, + 3136, 2633, 2880, + 3078, 2704, 2800, + 2985, 2786, 2665, + 2822, 2875, 2382, + 2431, 2973, 0, + 0, 3078, 0, + 0, 3188, 0, + 0, 3303, 0, + 0, 3422, 0, + 0, 3545, 0, + 0, 3669, 0, + 3412, 2398, 3174, + 3412, 2399, 3174, + 3412, 2399, 3174, + 3412, 2400, 3174, + 3411, 2400, 3173, + 3411, 2401, 3173, + 3411, 2402, 3173, + 3411, 2404, 3172, + 3410, 2406, 3172, + 3409, 2409, 3171, + 3408, 2413, 3170, + 3407, 2418, 3168, + 3406, 2425, 3166, + 3403, 2434, 3163, + 3400, 2445, 3159, + 3396, 2461, 3154, + 3391, 2480, 3147, + 3383, 2505, 3137, + 3373, 2536, 3124, + 3360, 2574, 3106, + 3340, 2621, 3080, + 3313, 2677, 3043, + 3275, 2743, 2989, + 3217, 2818, 2905, + 3126, 2902, 2760, + 2967, 2995, 2442, + 2592, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 3547, 2493, 3294, + 3547, 2494, 3294, + 3547, 2494, 3294, + 3547, 2494, 3294, + 3547, 2495, 3294, + 3547, 2496, 3294, + 3547, 2497, 3293, + 3547, 2498, 3293, + 3546, 2500, 3293, + 3546, 2502, 3292, + 3545, 2505, 3291, + 3544, 2510, 3290, + 3543, 2515, 3288, + 3541, 2522, 3286, + 3539, 2532, 3283, + 3536, 2545, 3279, + 3532, 2561, 3274, + 3527, 2582, 3266, + 3519, 2608, 3257, + 3509, 2641, 3243, + 3496, 2682, 3224, + 3476, 2731, 3198, + 3450, 2790, 3160, + 3411, 2858, 3103, + 3354, 2936, 3015, + 3265, 3023, 2862, + 3108, 3118, 2512, + 2745, 3220, 0, + 0, 3328, 0, + 0, 3442, 0, + 0, 3559, 0, + 0, 3680, 0, + 3682, 2596, 3418, + 3682, 2596, 3417, + 3682, 2596, 3417, + 3682, 2597, 3417, + 3682, 2597, 3417, + 3682, 2598, 3417, + 3682, 2598, 3417, + 3681, 2599, 3417, + 3681, 2601, 3416, + 3681, 2603, 3416, + 3680, 2605, 3415, + 3680, 2609, 3414, + 3679, 2613, 3413, + 3677, 2619, 3411, + 3676, 2627, 3409, + 3674, 2637, 3406, + 3671, 2650, 3402, + 3667, 2667, 3396, + 3661, 2689, 3389, + 3654, 2717, 3379, + 3644, 2752, 3365, + 3630, 2795, 3346, + 3612, 2846, 3319, + 3585, 2907, 3280, + 3547, 2977, 3222, + 3490, 3057, 3131, + 3401, 3146, 2970, + 3247, 3242, 2592, + 2892, 3346, 0, + 0, 3456, 0, + 0, 3570, 0, + 0, 3689, 0, + 3816, 2704, 3543, + 3816, 2704, 3543, + 3816, 2705, 3543, + 3816, 2705, 3543, + 3816, 2705, 3543, + 3816, 2706, 3542, + 3816, 2706, 3542, + 3816, 2707, 3542, + 3815, 2708, 3542, + 3815, 2710, 3541, + 3815, 2712, 3541, + 3814, 2714, 3540, + 3814, 2718, 3539, + 3813, 2723, 3538, + 3811, 2729, 3536, + 3810, 2737, 3534, + 3808, 2748, 3531, + 3805, 2762, 3527, + 3801, 2780, 3521, + 3795, 2803, 3514, + 3788, 2832, 3504, + 3778, 2868, 3489, + 3765, 2912, 3470, + 3746, 2965, 3442, + 3719, 3027, 3403, + 3681, 3099, 3343, + 3625, 3181, 3250, + 3537, 3271, 3084, + 3384, 3369, 2680, + 3034, 3474, 0, + 0, 3584, 0, + 0, 3699, 0, + 3950, 2818, 3670, + 3950, 2818, 3670, + 3950, 2818, 3670, + 3950, 2818, 3670, + 3950, 2819, 3670, + 3950, 2819, 3669, + 3949, 2819, 3669, + 3949, 2820, 3669, + 3949, 2821, 3669, + 3949, 2822, 3669, + 3949, 2824, 3668, + 3948, 2826, 3668, + 3948, 2829, 3667, + 3947, 2832, 3666, + 3946, 2837, 3665, + 3945, 2844, 3663, + 3943, 2852, 3661, + 3941, 2863, 3658, + 3938, 2878, 3654, + 3934, 2896, 3648, + 3929, 2920, 3640, + 3922, 2950, 3630, + 3912, 2987, 3616, + 3898, 3032, 3596, + 3880, 3087, 3568, + 3853, 3151, 3528, + 3815, 3224, 3467, + 3759, 3307, 3372, + 3672, 3398, 3202, + 3520, 3497, 2776, + 3174, 3602, 0, + 0, 3714, 0, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2936, 3798, + 4083, 2937, 3798, + 4083, 2937, 3798, + 4082, 2938, 3797, + 4082, 2939, 3797, + 4082, 2940, 3797, + 4082, 2942, 3796, + 4081, 2944, 3796, + 4081, 2947, 3795, + 4080, 2951, 3794, + 4079, 2956, 3793, + 4078, 2962, 3791, + 4077, 2971, 3789, + 4074, 2982, 3786, + 4071, 2997, 3782, + 4068, 3016, 3776, + 4062, 3041, 3768, + 4055, 3071, 3758, + 4045, 3109, 3743, + 4032, 3156, 3723, + 4013, 3211, 3695, + 3987, 3276, 3654, + 3949, 3350, 3593, + 3893, 3434, 3496, + 3806, 3526, 3323, + 3654, 3626, 2880, + 3312, 3732, 0, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3057, 3927, + 4095, 3058, 3927, + 4095, 3058, 3927, + 4095, 3059, 3927, + 4095, 3059, 3927, + 4095, 3060, 3926, + 4095, 3061, 3926, + 4095, 3063, 3926, + 4095, 3065, 3925, + 4095, 3068, 3924, + 4095, 3072, 3923, + 4095, 3077, 3922, + 4095, 3084, 3920, + 4095, 3093, 3918, + 4095, 3105, 3915, + 4095, 3120, 3911, + 4095, 3139, 3905, + 4095, 3164, 3897, + 4095, 3195, 3887, + 4095, 3234, 3872, + 4095, 3281, 3852, + 4095, 3337, 3823, + 4095, 3403, 3782, + 4082, 3478, 3721, + 4026, 3562, 3623, + 3939, 3655, 3446, + 3788, 3755, 2989, + 4095, 3180, 4057, + 4095, 3180, 4057, + 4095, 3180, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3181, 4057, + 4095, 3182, 4057, + 4095, 3182, 4057, + 4095, 3183, 4056, + 4095, 3184, 4056, + 4095, 3185, 4056, + 4095, 3187, 4055, + 4095, 3189, 4055, + 4095, 3192, 4054, + 4095, 3196, 4053, + 4095, 3201, 4052, + 4095, 3208, 4050, + 4095, 3217, 4048, + 4095, 3229, 4045, + 4095, 3245, 4040, + 4095, 3264, 4035, + 4095, 3290, 4027, + 4095, 3321, 4016, + 4095, 3360, 4002, + 4095, 3408, 3981, + 4095, 3465, 3953, + 4095, 3531, 3911, + 4095, 3607, 3849, + 4095, 3692, 3751, + 4073, 3785, 3572, + 0, 1998, 2266, + 0, 1999, 2265, + 0, 2000, 2264, + 0, 2001, 2263, + 0, 2003, 2262, + 0, 2005, 2260, + 0, 2008, 2257, + 0, 2012, 2253, + 0, 2017, 2248, + 0, 2024, 2241, + 0, 2033, 2232, + 0, 2045, 2219, + 0, 2060, 2202, + 0, 2079, 2177, + 0, 2104, 2143, + 0, 2136, 2091, + 0, 2175, 2012, + 0, 2222, 1879, + 0, 2278, 1601, + 0, 2344, 0, + 0, 2420, 0, + 0, 2504, 0, + 0, 2597, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 1998, 2267, + 0, 1999, 2266, + 0, 2000, 2265, + 0, 2001, 2264, + 0, 2003, 2263, + 0, 2005, 2260, + 0, 2008, 2258, + 0, 2012, 2254, + 0, 2017, 2249, + 0, 2024, 2242, + 0, 2033, 2233, + 0, 2045, 2220, + 0, 2060, 2203, + 0, 2080, 2179, + 0, 2105, 2144, + 0, 2136, 2093, + 0, 2175, 2014, + 0, 2222, 1881, + 0, 2279, 1606, + 0, 2344, 0, + 0, 2420, 0, + 0, 2504, 0, + 0, 2597, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 1999, 2268, + 0, 1999, 2267, + 0, 2000, 2266, + 0, 2002, 2265, + 0, 2003, 2264, + 0, 2005, 2262, + 0, 2008, 2259, + 0, 2012, 2255, + 0, 2017, 2250, + 0, 2024, 2244, + 0, 2033, 2234, + 0, 2045, 2222, + 0, 2060, 2204, + 0, 2080, 2180, + 0, 2105, 2145, + 0, 2136, 2095, + 0, 2175, 2016, + 0, 2222, 1884, + 0, 2279, 1611, + 0, 2345, 0, + 0, 2420, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 1999, 2270, + 0, 2000, 2269, + 0, 2001, 2268, + 0, 2002, 2267, + 0, 2004, 2265, + 0, 2006, 2263, + 0, 2009, 2261, + 0, 2013, 2257, + 0, 2018, 2252, + 0, 2025, 2245, + 0, 2034, 2236, + 0, 2045, 2224, + 0, 2061, 2206, + 0, 2080, 2182, + 0, 2105, 2148, + 0, 2137, 2097, + 0, 2175, 2019, + 0, 2223, 1888, + 0, 2279, 1618, + 0, 2345, 0, + 0, 2420, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 2000, 2272, + 0, 2000, 2271, + 0, 2001, 2270, + 0, 2003, 2269, + 0, 2004, 2268, + 0, 2006, 2266, + 0, 2009, 2263, + 0, 2013, 2259, + 0, 2018, 2254, + 0, 2025, 2248, + 0, 2034, 2239, + 0, 2046, 2226, + 0, 2061, 2209, + 0, 2081, 2185, + 0, 2106, 2151, + 0, 2137, 2100, + 0, 2176, 2023, + 0, 2223, 1893, + 0, 2279, 1627, + 0, 2345, 0, + 0, 2420, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3402, 0, + 0, 3529, 0, + 0, 3657, 0, + 0, 2000, 2275, + 0, 2001, 2274, + 0, 2002, 2273, + 0, 2003, 2272, + 0, 2005, 2271, + 0, 2007, 2269, + 0, 2010, 2266, + 0, 2014, 2262, + 0, 2019, 2258, + 0, 2026, 2251, + 0, 2035, 2242, + 0, 2047, 2230, + 0, 2062, 2212, + 0, 2081, 2189, + 0, 2106, 2155, + 0, 2138, 2105, + 0, 2176, 2028, + 0, 2223, 1900, + 0, 2280, 1640, + 0, 2345, 0, + 0, 2421, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2698, 0, + 0, 2805, 0, + 0, 2917, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 0, 2001, 2279, + 0, 2002, 2278, + 0, 2003, 2277, + 0, 2004, 2276, + 0, 2006, 2275, + 0, 2008, 2273, + 0, 2011, 2270, + 0, 2015, 2267, + 0, 2020, 2262, + 0, 2027, 2255, + 0, 2036, 2246, + 0, 2048, 2234, + 0, 2063, 2217, + 0, 2082, 2193, + 0, 2107, 2160, + 0, 2138, 2110, + 0, 2177, 2035, + 0, 2224, 1909, + 0, 2280, 1655, + 0, 2346, 0, + 0, 2421, 0, + 0, 2505, 0, + 0, 2598, 0, + 0, 2699, 0, + 0, 2805, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3154, 0, + 0, 3277, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 0, 2003, 2284, + 0, 2003, 2283, + 0, 2004, 2283, + 0, 2006, 2282, + 0, 2007, 2280, + 0, 2009, 2278, + 0, 2012, 2275, + 0, 2016, 2272, + 0, 2021, 2267, + 0, 2028, 2261, + 0, 2037, 2252, + 0, 2049, 2240, + 0, 2064, 2223, + 0, 2083, 2200, + 0, 2108, 2166, + 0, 2139, 2118, + 0, 2178, 2044, + 0, 2225, 1921, + 0, 2281, 1676, + 0, 2347, 277, + 0, 2422, 0, + 0, 2506, 0, + 0, 2599, 0, + 0, 2699, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3034, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3529, 0, + 0, 3658, 0, + 0, 2005, 2291, + 0, 2005, 2290, + 0, 2006, 2290, + 0, 2007, 2288, + 0, 2009, 2287, + 0, 2011, 2285, + 0, 2014, 2283, + 0, 2018, 2279, + 0, 2023, 2274, + 0, 2030, 2268, + 0, 2039, 2259, + 0, 2050, 2247, + 0, 2065, 2231, + 0, 2085, 2208, + 0, 2110, 2175, + 0, 2141, 2128, + 0, 2179, 2055, + 0, 2226, 1936, + 0, 2282, 1702, + 0, 2347, 650, + 0, 2422, 0, + 0, 2507, 0, + 0, 2599, 0, + 0, 2699, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2007, 2300, + 0, 2008, 2299, + 0, 2009, 2299, + 0, 2010, 2298, + 0, 2011, 2296, + 0, 2014, 2294, + 0, 2017, 2292, + 0, 2020, 2288, + 0, 2025, 2284, + 0, 2032, 2277, + 0, 2041, 2269, + 0, 2053, 2257, + 0, 2068, 2241, + 0, 2087, 2219, + 0, 2111, 2187, + 0, 2142, 2141, + 0, 2181, 2071, + 0, 2227, 1955, + 0, 2283, 1734, + 0, 2349, 904, + 0, 2423, 0, + 0, 2507, 0, + 0, 2600, 0, + 0, 2700, 0, + 0, 2806, 0, + 0, 2918, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2010, 2312, + 0, 2011, 2311, + 0, 2012, 2311, + 0, 2013, 2310, + 0, 2015, 2308, + 0, 2017, 2306, + 0, 2020, 2304, + 0, 2023, 2301, + 0, 2029, 2296, + 0, 2035, 2290, + 0, 2044, 2282, + 0, 2055, 2270, + 0, 2070, 2255, + 0, 2090, 2233, + 0, 2114, 2202, + 0, 2145, 2158, + 0, 2183, 2090, + 0, 2229, 1980, + 0, 2285, 1774, + 0, 2350, 1110, + 0, 2425, 0, + 0, 2508, 0, + 0, 2601, 0, + 0, 2700, 0, + 0, 2807, 0, + 0, 2919, 0, + 0, 3035, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2014, 2327, + 0, 2015, 2327, + 0, 2016, 2326, + 0, 2017, 2325, + 0, 2019, 2324, + 0, 2021, 2322, + 0, 2024, 2320, + 0, 2028, 2316, + 0, 2033, 2312, + 0, 2039, 2306, + 0, 2048, 2298, + 0, 2059, 2287, + 0, 2074, 2272, + 0, 2093, 2251, + 0, 2117, 2222, + 0, 2148, 2179, + 0, 2186, 2115, + 0, 2232, 2012, + 0, 2287, 1823, + 0, 2352, 1290, + 0, 2426, 0, + 0, 2510, 0, + 0, 2602, 0, + 0, 2701, 0, + 0, 2808, 0, + 0, 2919, 0, + 0, 3036, 0, + 0, 3155, 0, + 0, 3278, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 0, 2020, 2347, + 0, 2021, 2347, + 0, 2022, 2346, + 0, 2023, 2345, + 0, 2024, 2344, + 0, 2026, 2342, + 0, 2029, 2340, + 0, 2033, 2337, + 0, 2038, 2333, + 0, 2044, 2327, + 0, 2053, 2319, + 0, 2064, 2309, + 0, 2079, 2295, + 0, 2098, 2275, + 0, 2122, 2247, + 0, 2152, 2206, + 0, 2190, 2146, + 0, 2235, 2051, + 0, 2290, 1881, + 0, 2355, 1455, + 0, 2429, 0, + 0, 2512, 0, + 0, 2603, 0, + 0, 2703, 0, + 0, 2809, 0, + 0, 2920, 0, + 0, 3036, 0, + 0, 3156, 0, + 0, 3279, 0, + 0, 3403, 0, + 0, 3530, 0, + 0, 3658, 0, + 423, 2027, 2373, + 373, 2028, 2372, + 295, 2029, 2371, + 163, 2030, 2370, + 0, 2032, 2369, + 0, 2034, 2368, + 0, 2036, 2365, + 0, 2040, 2363, + 0, 2045, 2359, + 0, 2051, 2353, + 0, 2060, 2346, + 0, 2071, 2336, + 0, 2085, 2323, + 0, 2104, 2304, + 0, 2128, 2278, + 0, 2158, 2241, + 0, 2195, 2185, + 0, 2240, 2098, + 0, 2294, 1948, + 0, 2358, 1610, + 0, 2432, 0, + 0, 2514, 0, + 0, 2605, 0, + 0, 2704, 0, + 0, 2810, 0, + 0, 2921, 0, + 0, 3037, 0, + 0, 3157, 0, + 0, 3279, 0, + 0, 3404, 0, + 0, 3530, 0, + 0, 3658, 0, + 1521, 2037, 2404, + 1517, 2038, 2404, + 1511, 2039, 2403, + 1503, 2040, 2402, + 1492, 2041, 2401, + 1477, 2043, 2400, + 1457, 2046, 2398, + 1428, 2050, 2395, + 1385, 2054, 2391, + 1322, 2061, 2386, + 1221, 2069, 2380, + 1036, 2080, 2371, + 529, 2094, 2358, + 0, 2112, 2341, + 0, 2135, 2317, + 0, 2165, 2283, + 0, 2201, 2232, + 0, 2246, 2155, + 0, 2300, 2025, + 0, 2363, 1759, + 0, 2436, 0, + 0, 2518, 0, + 0, 2608, 0, + 0, 2707, 0, + 0, 2812, 0, + 0, 2923, 0, + 0, 3038, 0, + 0, 3157, 0, + 0, 3280, 0, + 0, 3404, 0, + 0, 3531, 0, + 0, 3659, 0, + 1883, 2050, 2444, + 1881, 2050, 2443, + 1879, 2051, 2443, + 1875, 2052, 2442, + 1870, 2054, 2441, + 1864, 2056, 2439, + 1855, 2058, 2437, + 1843, 2062, 2435, + 1827, 2066, 2432, + 1804, 2073, 2427, + 1771, 2081, 2421, + 1724, 2091, 2413, + 1651, 2105, 2401, + 1531, 2123, 2386, + 1296, 2146, 2364, + 216, 2174, 2333, + 0, 2210, 2288, + 0, 2254, 2221, + 0, 2307, 2111, + 0, 2369, 1903, + 0, 2441, 1228, + 0, 2522, 0, + 0, 2612, 0, + 0, 2709, 0, + 0, 2814, 0, + 0, 2924, 0, + 0, 3039, 0, + 0, 3158, 0, + 0, 3280, 0, + 0, 3405, 0, + 0, 3531, 0, + 0, 3659, 0, + 2133, 2066, 2491, + 2132, 2067, 2491, + 2131, 2067, 2490, + 2129, 2068, 2490, + 2126, 2070, 2489, + 2122, 2072, 2487, + 2118, 2074, 2486, + 2111, 2078, 2484, + 2102, 2082, 2481, + 2089, 2088, 2476, + 2072, 2096, 2471, + 2048, 2106, 2464, + 2014, 2120, 2453, + 1964, 2137, 2440, + 1887, 2159, 2420, + 1758, 2187, 2393, + 1496, 2222, 2354, + 0, 2265, 2296, + 0, 2316, 2205, + 0, 2377, 2044, + 0, 2448, 1663, + 0, 2528, 0, + 0, 2617, 0, + 0, 2713, 0, + 0, 2817, 0, + 0, 2927, 0, + 0, 3041, 0, + 0, 3160, 0, + 0, 3282, 0, + 0, 3406, 0, + 0, 3532, 0, + 0, 3659, 0, + 2337, 2087, 2548, + 2337, 2088, 2548, + 2336, 2088, 2547, + 2334, 2089, 2547, + 2333, 2091, 2546, + 2330, 2093, 2545, + 2327, 2095, 2543, + 2323, 2098, 2541, + 2317, 2103, 2539, + 2310, 2108, 2535, + 2299, 2116, 2530, + 2285, 2126, 2524, + 2265, 2138, 2515, + 2237, 2155, 2503, + 2196, 2176, 2486, + 2135, 2203, 2463, + 2039, 2237, 2429, + 1866, 2278, 2381, + 1429, 2329, 2306, + 0, 2388, 2182, + 0, 2457, 1936, + 0, 2536, 450, + 0, 2623, 0, + 0, 2718, 0, + 0, 2821, 0, + 0, 2930, 0, + 0, 3044, 0, + 0, 3162, 0, + 0, 3283, 0, + 0, 3407, 0, + 0, 3533, 0, + 0, 3660, 0, + 2517, 2114, 2614, + 2516, 2114, 2614, + 2515, 2115, 2614, + 2515, 2116, 2613, + 2513, 2117, 2612, + 2512, 2119, 2612, + 2510, 2121, 2610, + 2507, 2124, 2609, + 2503, 2128, 2606, + 2498, 2134, 2603, + 2491, 2141, 2599, + 2482, 2150, 2593, + 2469, 2162, 2586, + 2451, 2178, 2576, + 2426, 2198, 2561, + 2391, 2224, 2542, + 2338, 2256, 2514, + 2257, 2296, 2474, + 2119, 2344, 2414, + 1828, 2402, 2319, + 0, 2469, 2151, + 0, 2546, 1735, + 0, 2631, 0, + 0, 2725, 0, + 0, 2827, 0, + 0, 2934, 0, + 0, 3047, 0, + 0, 3164, 0, + 0, 3285, 0, + 0, 3408, 0, + 0, 3534, 0, + 0, 3661, 0, + 2681, 2147, 2690, + 2681, 2147, 2690, + 2680, 2148, 2690, + 2680, 2149, 2689, + 2679, 2150, 2689, + 2678, 2152, 2688, + 2676, 2154, 2687, + 2674, 2157, 2685, + 2672, 2161, 2683, + 2668, 2166, 2681, + 2663, 2172, 2677, + 2657, 2181, 2673, + 2648, 2192, 2666, + 2636, 2207, 2658, + 2620, 2226, 2646, + 2597, 2250, 2629, + 2565, 2281, 2607, + 2517, 2319, 2574, + 2444, 2365, 2527, + 2325, 2420, 2455, + 2090, 2485, 2336, + 1027, 2559, 2105, + 0, 2642, 1114, + 0, 2734, 0, + 0, 2834, 0, + 0, 2940, 0, + 0, 3052, 0, + 0, 3168, 0, + 0, 3288, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 2836, 2188, 2775, + 2836, 2189, 2775, + 2835, 2189, 2775, + 2835, 2190, 2774, + 2834, 2191, 2774, + 2833, 2193, 2773, + 2832, 2194, 2772, + 2831, 2197, 2771, + 2829, 2201, 2770, + 2827, 2205, 2767, + 2823, 2211, 2765, + 2819, 2219, 2761, + 2813, 2230, 2755, + 2805, 2243, 2748, + 2793, 2261, 2739, + 2778, 2283, 2725, + 2756, 2312, 2707, + 2726, 2347, 2681, + 2681, 2391, 2644, + 2614, 2443, 2590, + 2505, 2505, 2505, + 2300, 2576, 2358, + 1648, 2656, 2036, + 0, 2746, 0, + 0, 2843, 0, + 0, 2947, 0, + 0, 3057, 0, + 0, 3172, 0, + 0, 3291, 0, + 0, 3413, 0, + 0, 3537, 0, + 0, 3664, 0, + 2984, 2238, 2869, + 2984, 2238, 2868, + 2984, 2239, 2868, + 2983, 2239, 2868, + 2983, 2240, 2868, + 2983, 2242, 2867, + 2982, 2244, 2866, + 2981, 2246, 2865, + 2979, 2249, 2864, + 2978, 2253, 2862, + 2975, 2259, 2860, + 2972, 2266, 2857, + 2968, 2275, 2853, + 2962, 2287, 2847, + 2954, 2303, 2839, + 2943, 2324, 2828, + 2928, 2350, 2814, + 2907, 2383, 2794, + 2878, 2423, 2765, + 2836, 2472, 2724, + 2772, 2530, 2662, + 2669, 2598, 2563, + 2482, 2675, 2386, + 1962, 2761, 1922, + 0, 2855, 0, + 0, 2957, 0, + 0, 3065, 0, + 0, 3178, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 3128, 2297, 2969, + 3128, 2297, 2969, + 3128, 2298, 2969, + 3128, 2298, 2969, + 3127, 2299, 2969, + 3127, 2300, 2968, + 3126, 2302, 2968, + 3126, 2304, 2967, + 3125, 2307, 2966, + 3123, 2310, 2964, + 3122, 2315, 2962, + 3119, 2321, 2960, + 3116, 2330, 2957, + 3112, 2341, 2952, + 3106, 2355, 2946, + 3099, 2373, 2938, + 3088, 2397, 2926, + 3073, 2426, 2910, + 3053, 2463, 2888, + 3025, 2508, 2857, + 2984, 2562, 2812, + 2922, 2625, 2744, + 2825, 2698, 2632, + 2649, 2780, 2420, + 2195, 2871, 1705, + 0, 2970, 0, + 0, 3075, 0, + 0, 3186, 0, + 0, 3302, 0, + 0, 3421, 0, + 0, 3544, 0, + 0, 3668, 0, + 3269, 2365, 3077, + 3269, 2366, 3077, + 3269, 2366, 3076, + 3268, 2367, 3076, + 3268, 2367, 3076, + 3268, 2368, 3076, + 3268, 2370, 3075, + 3267, 2371, 3075, + 3266, 2374, 3074, + 3265, 2377, 3073, + 3264, 2381, 3071, + 3262, 2387, 3069, + 3260, 2394, 3067, + 3257, 2403, 3063, + 3253, 2416, 3058, + 3247, 2432, 3052, + 3240, 2453, 3043, + 3229, 2479, 3031, + 3215, 2512, 3014, + 3195, 2552, 2990, + 3168, 2601, 2957, + 3128, 2660, 2908, + 3068, 2728, 2834, + 2973, 2805, 2710, + 2805, 2892, 2463, + 2389, 2986, 928, + 0, 3088, 0, + 0, 3197, 0, + 0, 3310, 0, + 0, 3427, 0, + 0, 3548, 0, + 0, 3672, 0, + 3407, 2443, 3189, + 3407, 2444, 3189, + 3407, 2444, 3189, + 3407, 2444, 3189, + 3407, 2445, 3189, + 3407, 2446, 3188, + 3406, 2447, 3188, + 3406, 2448, 3188, + 3405, 2450, 3187, + 3405, 2453, 3186, + 3404, 2457, 3185, + 3403, 2461, 3183, + 3401, 2467, 3181, + 3399, 2475, 3179, + 3396, 2486, 3175, + 3392, 2500, 3170, + 3386, 2518, 3163, + 3379, 2541, 3154, + 3368, 2570, 3141, + 3354, 2605, 3123, + 3335, 2649, 3099, + 3308, 2702, 3064, + 3268, 2765, 3012, + 3210, 2836, 2932, + 3117, 2918, 2797, + 2954, 3008, 2514, + 2563, 3105, 0, + 0, 3210, 0, + 0, 3320, 0, + 0, 3436, 0, + 0, 3555, 0, + 0, 3677, 0, + 3544, 2530, 3306, + 3544, 2530, 3306, + 3544, 2531, 3306, + 3544, 2531, 3306, + 3544, 2532, 3306, + 3544, 2532, 3305, + 3543, 2533, 3305, + 3543, 2534, 3305, + 3543, 2536, 3304, + 3542, 2538, 3304, + 3541, 2541, 3303, + 3541, 2545, 3302, + 3539, 2550, 3300, + 3538, 2557, 3298, + 3535, 2566, 3295, + 3532, 2578, 3291, + 3528, 2593, 3286, + 3523, 2612, 3279, + 3516, 2637, 3269, + 3505, 2668, 3256, + 3492, 2707, 3238, + 3472, 2754, 3212, + 3445, 2810, 3175, + 3407, 2875, 3121, + 3349, 2950, 3037, + 3258, 3034, 2892, + 3099, 3127, 2574, + 2724, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 3680, 2625, 3427, + 3680, 2626, 3426, + 3680, 2626, 3426, + 3679, 2626, 3426, + 3679, 2626, 3426, + 3679, 2627, 3426, + 3679, 2628, 3426, + 3679, 2629, 3426, + 3679, 2630, 3425, + 3678, 2632, 3425, + 3678, 2634, 3424, + 3677, 2637, 3423, + 3676, 2642, 3422, + 3675, 2647, 3420, + 3673, 2655, 3418, + 3671, 2664, 3415, + 3668, 2677, 3411, + 3664, 2693, 3406, + 3659, 2714, 3399, + 3651, 2740, 3389, + 3641, 2773, 3375, + 3628, 2814, 3356, + 3609, 2863, 3330, + 3582, 2922, 3292, + 3543, 2990, 3236, + 3486, 3068, 3147, + 3397, 3155, 2994, + 3240, 3250, 2644, + 2877, 3352, 0, + 0, 3460, 0, + 0, 3574, 0, + 0, 3691, 0, + 3814, 2728, 3550, + 3814, 2728, 3550, + 3814, 2728, 3550, + 3814, 2728, 3550, + 3814, 2729, 3549, + 3814, 2729, 3549, + 3814, 2730, 3549, + 3814, 2730, 3549, + 3814, 2732, 3549, + 3813, 2733, 3548, + 3813, 2735, 3548, + 3812, 2737, 3547, + 3812, 2741, 3546, + 3811, 2745, 3545, + 3810, 2751, 3543, + 3808, 2759, 3541, + 3806, 2769, 3538, + 3803, 2782, 3534, + 3799, 2800, 3528, + 3793, 2822, 3521, + 3786, 2849, 3511, + 3776, 2884, 3497, + 3763, 2927, 3478, + 3744, 2978, 3451, + 3717, 3039, 3412, + 3679, 3109, 3354, + 3622, 3189, 3263, + 3534, 3278, 3102, + 3379, 3374, 2724, + 3024, 3478, 0, + 0, 3588, 0, + 0, 3702, 0, + 3948, 2836, 3675, + 3948, 2836, 3675, + 3948, 2836, 3675, + 3948, 2837, 3675, + 3948, 2837, 3675, + 3948, 2837, 3675, + 3948, 2838, 3675, + 3948, 2838, 3674, + 3948, 2839, 3674, + 3948, 2840, 3674, + 3947, 2842, 3673, + 3947, 2844, 3673, + 3946, 2847, 3672, + 3946, 2850, 3671, + 3945, 2855, 3670, + 3944, 2861, 3668, + 3942, 2869, 3666, + 3940, 2880, 3663, + 3937, 2894, 3659, + 3933, 2912, 3653, + 3928, 2935, 3646, + 3920, 2964, 3636, + 3910, 3000, 3622, + 3897, 3044, 3602, + 3878, 3097, 3574, + 3852, 3160, 3535, + 3814, 3232, 3475, + 3757, 3313, 3382, + 3669, 3403, 3216, + 3516, 3501, 2812, + 3167, 3606, 0, + 0, 3716, 0, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2950, 3802, + 4082, 2951, 3802, + 4082, 2951, 3802, + 4082, 2952, 3801, + 4081, 2952, 3801, + 4081, 2953, 3801, + 4081, 2954, 3801, + 4081, 2956, 3800, + 4080, 2958, 3800, + 4080, 2961, 3799, + 4079, 2964, 3798, + 4078, 2969, 3797, + 4077, 2976, 3795, + 4075, 2984, 3793, + 4073, 2995, 3790, + 4070, 3010, 3786, + 4066, 3028, 3780, + 4061, 3052, 3772, + 4054, 3082, 3762, + 4044, 3119, 3748, + 4030, 3164, 3728, + 4012, 3219, 3700, + 3985, 3283, 3660, + 3948, 3356, 3599, + 3892, 3439, 3504, + 3804, 3530, 3334, + 3652, 3629, 2909, + 3307, 3735, 0, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3068, 3930, + 4095, 3069, 3930, + 4095, 3069, 3930, + 4095, 3069, 3930, + 4095, 3070, 3929, + 4095, 3071, 3929, + 4095, 3072, 3929, + 4095, 3074, 3929, + 4095, 3076, 3928, + 4095, 3079, 3927, + 4095, 3083, 3926, + 4095, 3088, 3925, + 4095, 3094, 3923, + 4095, 3103, 3921, + 4095, 3114, 3918, + 4095, 3129, 3914, + 4095, 3148, 3908, + 4095, 3173, 3900, + 4095, 3203, 3890, + 4095, 3241, 3875, + 4095, 3288, 3855, + 4095, 3343, 3827, + 4095, 3408, 3786, + 4081, 3482, 3725, + 4025, 3566, 3629, + 3938, 3658, 3455, + 3786, 3758, 3012, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3189, 4059, + 4095, 3190, 4059, + 4095, 3190, 4059, + 4095, 3191, 4059, + 4095, 3191, 4059, + 4095, 3192, 4058, + 4095, 3193, 4058, + 4095, 3195, 4058, + 4095, 3197, 4057, + 4095, 3200, 4056, + 4095, 3204, 4055, + 4095, 3209, 4054, + 4095, 3216, 4052, + 4095, 3225, 4050, + 4095, 3237, 4047, + 4095, 3252, 4043, + 4095, 3271, 4037, + 4095, 3296, 4029, + 4095, 3327, 4019, + 4095, 3366, 4004, + 4095, 3413, 3984, + 4095, 3469, 3956, + 4095, 3535, 3914, + 4095, 3610, 3853, + 4095, 3694, 3755, + 4071, 3787, 3579, + 0, 2129, 2398, + 0, 2130, 2397, + 0, 2131, 2396, + 0, 2132, 2396, + 0, 2133, 2394, + 0, 2135, 2393, + 0, 2137, 2391, + 0, 2140, 2388, + 0, 2144, 2384, + 0, 2149, 2379, + 0, 2156, 2373, + 0, 2165, 2363, + 0, 2176, 2351, + 0, 2192, 2333, + 0, 2211, 2309, + 0, 2236, 2274, + 0, 2268, 2222, + 0, 2307, 2143, + 0, 2354, 2009, + 0, 2410, 1731, + 0, 2476, 0, + 0, 2552, 0, + 0, 2636, 0, + 0, 2729, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2130, 2398, + 0, 2130, 2398, + 0, 2131, 2397, + 0, 2132, 2396, + 0, 2133, 2395, + 0, 2135, 2394, + 0, 2137, 2392, + 0, 2140, 2389, + 0, 2144, 2385, + 0, 2149, 2380, + 0, 2156, 2373, + 0, 2165, 2364, + 0, 2177, 2352, + 0, 2192, 2334, + 0, 2212, 2310, + 0, 2237, 2275, + 0, 2268, 2223, + 0, 2307, 2144, + 0, 2354, 2011, + 0, 2411, 1734, + 0, 2476, 0, + 0, 2552, 0, + 0, 2636, 0, + 0, 2729, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2130, 2399, + 0, 2130, 2399, + 0, 2131, 2398, + 0, 2132, 2397, + 0, 2133, 2396, + 0, 2135, 2395, + 0, 2137, 2393, + 0, 2140, 2390, + 0, 2144, 2386, + 0, 2149, 2381, + 0, 2156, 2374, + 0, 2165, 2365, + 0, 2177, 2353, + 0, 2192, 2335, + 0, 2212, 2311, + 0, 2237, 2276, + 0, 2268, 2225, + 0, 2307, 2146, + 0, 2354, 2013, + 0, 2411, 1738, + 0, 2477, 0, + 0, 2552, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2130, 2400, + 0, 2131, 2400, + 0, 2131, 2399, + 0, 2132, 2399, + 0, 2134, 2397, + 0, 2135, 2396, + 0, 2138, 2394, + 0, 2140, 2391, + 0, 2144, 2387, + 0, 2150, 2382, + 0, 2156, 2376, + 0, 2165, 2367, + 0, 2177, 2354, + 0, 2192, 2337, + 0, 2212, 2312, + 0, 2237, 2278, + 0, 2268, 2227, + 0, 2307, 2148, + 0, 2354, 2016, + 0, 2411, 1743, + 0, 2477, 0, + 0, 2552, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2131, 2402, + 0, 2131, 2402, + 0, 2132, 2401, + 0, 2133, 2400, + 0, 2134, 2399, + 0, 2136, 2398, + 0, 2138, 2396, + 0, 2141, 2393, + 0, 2145, 2389, + 0, 2150, 2384, + 0, 2157, 2377, + 0, 2166, 2368, + 0, 2177, 2356, + 0, 2193, 2339, + 0, 2212, 2314, + 0, 2237, 2280, + 0, 2269, 2229, + 0, 2307, 2151, + 0, 2355, 2020, + 0, 2411, 1750, + 0, 2477, 0, + 0, 2552, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2131, 2404, + 0, 2132, 2404, + 0, 2132, 2403, + 0, 2133, 2402, + 0, 2135, 2401, + 0, 2136, 2400, + 0, 2139, 2398, + 0, 2141, 2395, + 0, 2145, 2391, + 0, 2151, 2387, + 0, 2157, 2380, + 0, 2166, 2371, + 0, 2178, 2358, + 0, 2193, 2341, + 0, 2213, 2317, + 0, 2238, 2283, + 0, 2269, 2232, + 0, 2308, 2155, + 0, 2355, 2025, + 0, 2411, 1760, + 0, 2477, 0, + 0, 2553, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3049, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2132, 2407, + 0, 2133, 2407, + 0, 2133, 2406, + 0, 2134, 2405, + 0, 2135, 2404, + 0, 2137, 2403, + 0, 2139, 2401, + 0, 2142, 2398, + 0, 2146, 2395, + 0, 2151, 2390, + 0, 2158, 2383, + 0, 2167, 2374, + 0, 2179, 2362, + 0, 2194, 2345, + 0, 2213, 2321, + 0, 2238, 2287, + 0, 2270, 2237, + 0, 2308, 2160, + 0, 2356, 2032, + 0, 2412, 1772, + 0, 2478, 0, + 0, 2553, 0, + 0, 2637, 0, + 0, 2730, 0, + 0, 2830, 0, + 0, 2937, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3286, 0, + 0, 3409, 0, + 0, 3535, 0, + 0, 3661, 0, + 0, 2133, 2411, + 0, 2134, 2411, + 0, 2134, 2410, + 0, 2135, 2409, + 0, 2136, 2408, + 0, 2138, 2407, + 0, 2140, 2405, + 0, 2143, 2402, + 0, 2147, 2399, + 0, 2152, 2394, + 0, 2159, 2387, + 0, 2168, 2378, + 0, 2180, 2366, + 0, 2195, 2349, + 0, 2214, 2325, + 0, 2239, 2292, + 0, 2270, 2242, + 0, 2309, 2167, + 0, 2356, 2041, + 0, 2412, 1788, + 0, 2478, 0, + 0, 2553, 0, + 0, 2638, 0, + 0, 2730, 0, + 0, 2831, 0, + 0, 2937, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2134, 2417, + 0, 2135, 2416, + 0, 2136, 2416, + 0, 2136, 2415, + 0, 2138, 2414, + 0, 2139, 2412, + 0, 2142, 2410, + 0, 2144, 2408, + 0, 2148, 2404, + 0, 2154, 2399, + 0, 2160, 2393, + 0, 2169, 2384, + 0, 2181, 2372, + 0, 2196, 2355, + 0, 2215, 2332, + 0, 2240, 2299, + 0, 2271, 2250, + 0, 2310, 2176, + 0, 2357, 2053, + 0, 2413, 1808, + 0, 2479, 410, + 0, 2554, 0, + 0, 2638, 0, + 0, 2731, 0, + 0, 2831, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3166, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2136, 2424, + 0, 2137, 2423, + 0, 2137, 2422, + 0, 2138, 2422, + 0, 2140, 2421, + 0, 2141, 2419, + 0, 2143, 2417, + 0, 2146, 2415, + 0, 2150, 2411, + 0, 2155, 2406, + 0, 2162, 2400, + 0, 2171, 2391, + 0, 2182, 2379, + 0, 2198, 2363, + 0, 2217, 2340, + 0, 2242, 2308, + 0, 2273, 2260, + 0, 2311, 2187, + 0, 2358, 2068, + 0, 2414, 1834, + 0, 2479, 782, + 0, 2554, 0, + 0, 2639, 0, + 0, 2731, 0, + 0, 2831, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2139, 2433, + 0, 2139, 2432, + 0, 2140, 2432, + 0, 2141, 2431, + 0, 2142, 2430, + 0, 2144, 2428, + 0, 2146, 2426, + 0, 2149, 2424, + 0, 2152, 2420, + 0, 2158, 2416, + 0, 2164, 2410, + 0, 2173, 2401, + 0, 2185, 2389, + 0, 2200, 2373, + 0, 2219, 2351, + 0, 2244, 2319, + 0, 2274, 2273, + 0, 2313, 2203, + 0, 2360, 2088, + 0, 2415, 1866, + 0, 2481, 1036, + 0, 2555, 0, + 0, 2639, 0, + 0, 2732, 0, + 0, 2832, 0, + 0, 2938, 0, + 0, 3050, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2142, 2444, + 0, 2142, 2444, + 0, 2143, 2443, + 0, 2144, 2443, + 0, 2145, 2442, + 0, 2147, 2440, + 0, 2149, 2438, + 0, 2152, 2436, + 0, 2156, 2433, + 0, 2161, 2428, + 0, 2167, 2422, + 0, 2176, 2414, + 0, 2188, 2402, + 0, 2202, 2387, + 0, 2222, 2365, + 0, 2246, 2334, + 0, 2277, 2290, + 0, 2315, 2222, + 0, 2362, 2113, + 0, 2417, 1906, + 0, 2482, 1242, + 0, 2557, 0, + 0, 2640, 0, + 0, 2733, 0, + 0, 2833, 0, + 0, 2939, 0, + 0, 3051, 0, + 0, 3167, 0, + 0, 3287, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2146, 2460, + 0, 2146, 2460, + 0, 2147, 2459, + 0, 2148, 2458, + 0, 2149, 2457, + 0, 2151, 2456, + 0, 2153, 2454, + 0, 2156, 2452, + 0, 2160, 2448, + 0, 2165, 2444, + 0, 2171, 2438, + 0, 2180, 2430, + 0, 2191, 2419, + 0, 2206, 2404, + 0, 2225, 2383, + 0, 2249, 2354, + 0, 2280, 2311, + 0, 2318, 2247, + 0, 2364, 2144, + 0, 2419, 1955, + 0, 2484, 1422, + 0, 2558, 0, + 0, 2642, 0, + 0, 2734, 0, + 0, 2834, 0, + 0, 2940, 0, + 0, 3051, 0, + 0, 3168, 0, + 0, 3288, 0, + 0, 3410, 0, + 0, 3535, 0, + 0, 3662, 0, + 0, 2152, 2480, + 0, 2152, 2479, + 0, 2153, 2479, + 0, 2154, 2478, + 0, 2155, 2477, + 0, 2156, 2476, + 0, 2159, 2474, + 0, 2161, 2472, + 0, 2165, 2469, + 0, 2170, 2465, + 0, 2177, 2459, + 0, 2185, 2451, + 0, 2196, 2441, + 0, 2211, 2427, + 0, 2230, 2407, + 0, 2254, 2379, + 0, 2284, 2339, + 0, 2322, 2278, + 0, 2368, 2183, + 0, 2422, 2013, + 0, 2487, 1587, + 0, 2561, 0, + 0, 2644, 0, + 0, 2735, 0, + 0, 2835, 0, + 0, 2941, 0, + 0, 3052, 0, + 0, 3168, 0, + 0, 3288, 0, + 0, 3411, 0, + 0, 3536, 0, + 0, 3662, 0, + 590, 2159, 2505, + 556, 2159, 2505, + 505, 2160, 2504, + 427, 2161, 2503, + 295, 2162, 2503, + 26, 2164, 2501, + 0, 2166, 2500, + 0, 2169, 2498, + 0, 2172, 2495, + 0, 2177, 2491, + 0, 2184, 2485, + 0, 2192, 2478, + 0, 2203, 2468, + 0, 2218, 2455, + 0, 2236, 2436, + 0, 2260, 2410, + 0, 2290, 2373, + 0, 2327, 2317, + 0, 2372, 2230, + 0, 2427, 2080, + 0, 2490, 1742, + 0, 2564, 0, + 0, 2646, 0, + 0, 2737, 0, + 0, 2836, 0, + 0, 2942, 0, + 0, 3053, 0, + 0, 3169, 0, + 0, 3289, 0, + 0, 3411, 0, + 0, 3536, 0, + 0, 3662, 0, + 1656, 2169, 2537, + 1653, 2169, 2536, + 1649, 2170, 2536, + 1643, 2171, 2535, + 1635, 2172, 2534, + 1624, 2173, 2533, + 1610, 2175, 2532, + 1589, 2178, 2530, + 1560, 2182, 2527, + 1518, 2186, 2523, + 1454, 2193, 2518, + 1353, 2201, 2512, + 1168, 2212, 2503, + 661, 2226, 2490, + 0, 2244, 2473, + 0, 2268, 2449, + 0, 2297, 2415, + 0, 2334, 2364, + 0, 2378, 2287, + 0, 2432, 2157, + 0, 2495, 1891, + 0, 2568, 0, + 0, 2650, 0, + 0, 2740, 0, + 0, 2839, 0, + 0, 2944, 0, + 0, 3055, 0, + 0, 3170, 0, + 0, 3289, 0, + 0, 3412, 0, + 0, 3536, 0, + 0, 3663, 0, + 2017, 2181, 2576, + 2015, 2182, 2576, + 2013, 2182, 2575, + 2011, 2183, 2575, + 2007, 2184, 2574, + 2002, 2186, 2573, + 1996, 2188, 2571, + 1987, 2190, 2570, + 1975, 2194, 2567, + 1959, 2199, 2564, + 1936, 2205, 2559, + 1903, 2213, 2553, + 1856, 2223, 2545, + 1783, 2237, 2533, + 1663, 2255, 2518, + 1428, 2278, 2496, + 348, 2307, 2465, + 0, 2342, 2420, + 0, 2386, 2353, + 0, 2439, 2243, + 0, 2501, 2035, + 0, 2573, 1360, + 0, 2654, 0, + 0, 2744, 0, + 0, 2842, 0, + 0, 2946, 0, + 0, 3056, 0, + 0, 3172, 0, + 0, 3291, 0, + 0, 3413, 0, + 0, 3537, 0, + 0, 3663, 0, + 2266, 2198, 2624, + 2266, 2198, 2623, + 2264, 2199, 2623, + 2263, 2200, 2622, + 2261, 2201, 2622, + 2258, 2202, 2621, + 2255, 2204, 2620, + 2250, 2206, 2618, + 2243, 2210, 2616, + 2234, 2214, 2613, + 2222, 2220, 2609, + 2204, 2228, 2603, + 2180, 2238, 2596, + 2146, 2252, 2586, + 2096, 2269, 2572, + 2019, 2291, 2552, + 1890, 2319, 2525, + 1628, 2354, 2486, + 0, 2397, 2428, + 0, 2448, 2337, + 0, 2509, 2176, + 0, 2580, 1795, + 0, 2660, 0, + 0, 2749, 0, + 0, 2845, 0, + 0, 2949, 0, + 0, 3059, 0, + 0, 3173, 0, + 0, 3292, 0, + 0, 3414, 0, + 0, 3538, 0, + 0, 3664, 0, + 2470, 2219, 2680, + 2469, 2219, 2680, + 2469, 2220, 2680, + 2468, 2220, 2679, + 2466, 2221, 2679, + 2465, 2223, 2678, + 2462, 2225, 2677, + 2459, 2227, 2675, + 2455, 2230, 2673, + 2450, 2235, 2671, + 2442, 2240, 2667, + 2431, 2248, 2662, + 2417, 2258, 2656, + 2397, 2270, 2647, + 2369, 2287, 2635, + 2328, 2308, 2618, + 2267, 2335, 2595, + 2171, 2369, 2561, + 1998, 2410, 2513, + 1561, 2461, 2438, + 0, 2520, 2315, + 0, 2589, 2068, + 0, 2668, 582, + 0, 2755, 0, + 0, 2851, 0, + 0, 2953, 0, + 0, 3062, 0, + 0, 3176, 0, + 0, 3294, 0, + 0, 3415, 0, + 0, 3539, 0, + 0, 3665, 0, + 2649, 2245, 2747, + 2649, 2246, 2746, + 2648, 2246, 2746, + 2648, 2247, 2746, + 2647, 2248, 2745, + 2646, 2249, 2745, + 2644, 2251, 2744, + 2642, 2253, 2742, + 2639, 2256, 2741, + 2635, 2260, 2738, + 2630, 2266, 2735, + 2623, 2273, 2731, + 2614, 2282, 2726, + 2601, 2294, 2718, + 2583, 2310, 2708, + 2558, 2330, 2693, + 2523, 2356, 2674, + 2470, 2388, 2646, + 2389, 2428, 2606, + 2251, 2476, 2546, + 1960, 2534, 2451, + 0, 2601, 2283, + 0, 2678, 1867, + 0, 2763, 0, + 0, 2857, 0, + 0, 2959, 0, + 0, 3066, 0, + 0, 3179, 0, + 0, 3296, 0, + 0, 3417, 0, + 0, 3540, 0, + 0, 3666, 0, + 2813, 2279, 2823, + 2813, 2279, 2822, + 2813, 2280, 2822, + 2812, 2280, 2822, + 2812, 2281, 2821, + 2811, 2282, 2821, + 2810, 2284, 2820, + 2808, 2286, 2819, + 2806, 2289, 2817, + 2804, 2293, 2816, + 2800, 2298, 2813, + 2796, 2304, 2809, + 2789, 2313, 2805, + 2780, 2324, 2798, + 2769, 2339, 2790, + 2752, 2358, 2778, + 2729, 2382, 2762, + 2697, 2413, 2739, + 2649, 2451, 2706, + 2576, 2497, 2659, + 2457, 2552, 2587, + 2222, 2617, 2468, + 1159, 2691, 2237, + 0, 2774, 1246, + 0, 2866, 0, + 0, 2966, 0, + 0, 3072, 0, + 0, 3184, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3542, 0, + 0, 3667, 0, + 2968, 2320, 2907, + 2968, 2320, 2907, + 2968, 2321, 2907, + 2967, 2321, 2907, + 2967, 2322, 2906, + 2966, 2323, 2906, + 2966, 2325, 2905, + 2965, 2327, 2904, + 2963, 2329, 2903, + 2961, 2333, 2902, + 2959, 2337, 2900, + 2956, 2343, 2897, + 2951, 2351, 2893, + 2945, 2362, 2888, + 2937, 2375, 2880, + 2925, 2393, 2871, + 2910, 2415, 2857, + 2888, 2444, 2839, + 2858, 2479, 2813, + 2813, 2523, 2776, + 2746, 2575, 2722, + 2637, 2637, 2637, + 2432, 2708, 2490, + 1780, 2789, 2168, + 0, 2878, 0, + 0, 2975, 0, + 0, 3079, 0, + 0, 3190, 0, + 0, 3304, 0, + 0, 3423, 0, + 0, 3545, 0, + 0, 3669, 0, + 3116, 2370, 3001, + 3116, 2370, 3001, + 3116, 2370, 3001, + 3116, 2371, 3000, + 3116, 2372, 3000, + 3115, 2373, 3000, + 3115, 2374, 2999, + 3114, 2376, 2998, + 3113, 2378, 2997, + 3112, 2381, 2996, + 3110, 2385, 2994, + 3107, 2391, 2992, + 3104, 2398, 2989, + 3100, 2407, 2985, + 3094, 2420, 2979, + 3086, 2436, 2971, + 3075, 2456, 2961, + 3060, 2482, 2946, + 3039, 2515, 2926, + 3010, 2555, 2897, + 2968, 2604, 2856, + 2904, 2662, 2794, + 2802, 2730, 2696, + 2614, 2807, 2518, + 2094, 2893, 2054, + 0, 2987, 0, + 0, 3089, 0, + 0, 3197, 0, + 0, 3310, 0, + 0, 3428, 0, + 0, 3549, 0, + 0, 3672, 0, + 3260, 2429, 3102, + 3260, 2429, 3102, + 3260, 2429, 3101, + 3260, 2430, 3101, + 3260, 2430, 3101, + 3259, 2431, 3101, + 3259, 2432, 3100, + 3258, 2434, 3100, + 3258, 2436, 3099, + 3257, 2439, 3098, + 3255, 2442, 3096, + 3254, 2447, 3095, + 3251, 2453, 3092, + 3248, 2462, 3089, + 3244, 2473, 3084, + 3238, 2487, 3078, + 3231, 2505, 3070, + 3220, 2529, 3058, + 3206, 2558, 3042, + 3185, 2595, 3021, + 3157, 2640, 2989, + 3116, 2694, 2944, + 3054, 2757, 2876, + 2957, 2830, 2764, + 2781, 2913, 2552, + 2327, 3003, 1837, + 0, 3102, 0, + 0, 3207, 0, + 0, 3318, 0, + 0, 3434, 0, + 0, 3553, 0, + 0, 3676, 0, + 3401, 2497, 3209, + 3401, 2497, 3209, + 3401, 2498, 3209, + 3401, 2498, 3208, + 3401, 2499, 3208, + 3400, 2499, 3208, + 3400, 2500, 3208, + 3400, 2502, 3207, + 3399, 2503, 3207, + 3398, 2506, 3206, + 3397, 2509, 3205, + 3396, 2513, 3203, + 3394, 2519, 3201, + 3392, 2526, 3199, + 3389, 2535, 3195, + 3385, 2548, 3190, + 3379, 2564, 3184, + 3372, 2585, 3175, + 3361, 2611, 3163, + 3347, 2644, 3146, + 3328, 2684, 3123, + 3300, 2734, 3089, + 3260, 2792, 3040, + 3200, 2860, 2966, + 3105, 2937, 2842, + 2937, 3024, 2595, + 2521, 3118, 1060, + 0, 3220, 0, + 0, 3329, 0, + 0, 3442, 0, + 0, 3560, 0, + 0, 3680, 0, + 3539, 2575, 3321, + 3539, 2575, 3321, + 3539, 2576, 3321, + 3539, 2576, 3321, + 3539, 2576, 3321, + 3539, 2577, 3321, + 3539, 2578, 3320, + 3538, 2579, 3320, + 3538, 2581, 3320, + 3537, 2582, 3319, + 3537, 2585, 3318, + 3536, 2589, 3317, + 3535, 2593, 3315, + 3533, 2599, 3313, + 3531, 2608, 3311, + 3528, 2618, 3307, + 3524, 2632, 3302, + 3518, 2650, 3295, + 3511, 2673, 3286, + 3500, 2702, 3273, + 3486, 2738, 3255, + 3467, 2782, 3231, + 3440, 2834, 3196, + 3400, 2897, 3144, + 3342, 2969, 3064, + 3249, 3050, 2929, + 3086, 3140, 2646, + 2695, 3237, 0, + 0, 3342, 0, + 0, 3452, 0, + 0, 3568, 0, + 0, 3687, 0, + 3676, 2662, 3438, + 3676, 2662, 3438, + 3676, 2663, 3438, + 3676, 2663, 3438, + 3676, 2663, 3438, + 3676, 2664, 3438, + 3676, 2664, 3438, + 3675, 2665, 3437, + 3675, 2667, 3437, + 3675, 2668, 3436, + 3674, 2670, 3436, + 3674, 2673, 3435, + 3673, 2677, 3434, + 3671, 2682, 3432, + 3670, 2689, 3430, + 3668, 2698, 3427, + 3665, 2710, 3423, + 3661, 2725, 3418, + 3655, 2744, 3411, + 3648, 2769, 3401, + 3638, 2800, 3388, + 3624, 2839, 3370, + 3605, 2886, 3344, + 3578, 2942, 3308, + 3539, 3007, 3253, + 3481, 3082, 3169, + 3390, 3167, 3024, + 3231, 3259, 2706, + 2856, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 3812, 2757, 3559, + 3812, 2757, 3559, + 3812, 2758, 3559, + 3812, 2758, 3558, + 3812, 2758, 3558, + 3811, 2759, 3558, + 3811, 2759, 3558, + 3811, 2760, 3558, + 3811, 2761, 3558, + 3811, 2762, 3557, + 3810, 2764, 3557, + 3810, 2766, 3556, + 3809, 2770, 3555, + 3808, 2774, 3554, + 3807, 2779, 3552, + 3805, 2787, 3550, + 3803, 2796, 3547, + 3800, 2809, 3543, + 3796, 2825, 3538, + 3791, 2846, 3531, + 3783, 2872, 3521, + 3773, 2905, 3507, + 3760, 2946, 3488, + 3741, 2996, 3462, + 3714, 3054, 3424, + 3675, 3122, 3368, + 3618, 3200, 3279, + 3529, 3287, 3126, + 3372, 3382, 2777, + 3009, 3484, 0, + 0, 3592, 0, + 0, 3706, 0, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2860, 3682, + 3946, 2861, 3682, + 3946, 2861, 3681, + 3946, 2862, 3681, + 3946, 2863, 3681, + 3946, 2864, 3681, + 3945, 2865, 3680, + 3945, 2867, 3680, + 3944, 2869, 3679, + 3944, 2873, 3678, + 3943, 2877, 3677, + 3942, 2883, 3675, + 3940, 2891, 3673, + 3938, 2901, 3670, + 3935, 2914, 3666, + 3931, 2932, 3661, + 3926, 2954, 3653, + 3918, 2981, 3643, + 3908, 3016, 3629, + 3895, 3059, 3610, + 3876, 3110, 3583, + 3849, 3171, 3544, + 3811, 3242, 3486, + 3754, 3321, 3395, + 3666, 3410, 3235, + 3511, 3507, 2856, + 3156, 3610, 0, + 0, 3720, 0, + 4080, 2968, 3807, + 4080, 2968, 3807, + 4080, 2968, 3807, + 4080, 2969, 3807, + 4080, 2969, 3807, + 4080, 2969, 3807, + 4080, 2969, 3807, + 4080, 2970, 3807, + 4080, 2970, 3806, + 4080, 2971, 3806, + 4080, 2972, 3806, + 4079, 2974, 3806, + 4079, 2976, 3805, + 4078, 2979, 3804, + 4078, 2982, 3803, + 4077, 2987, 3802, + 4076, 2993, 3800, + 4074, 3001, 3798, + 4072, 3012, 3795, + 4069, 3026, 3791, + 4065, 3044, 3786, + 4060, 3067, 3778, + 4052, 3096, 3768, + 4042, 3132, 3754, + 4029, 3176, 3734, + 4010, 3229, 3706, + 3984, 3292, 3667, + 3946, 3364, 3608, + 3889, 3445, 3514, + 3801, 3535, 3348, + 3648, 3633, 2944, + 3299, 3738, 0, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3082, 3934, + 4095, 3083, 3934, + 4095, 3083, 3934, + 4095, 3084, 3934, + 4095, 3084, 3933, + 4095, 3085, 3933, + 4095, 3086, 3933, + 4095, 3088, 3932, + 4095, 3090, 3932, + 4095, 3093, 3931, + 4095, 3096, 3930, + 4095, 3101, 3929, + 4095, 3108, 3927, + 4095, 3116, 3925, + 4095, 3127, 3922, + 4095, 3142, 3918, + 4095, 3160, 3912, + 4095, 3184, 3905, + 4095, 3214, 3894, + 4095, 3251, 3880, + 4095, 3297, 3860, + 4095, 3351, 3832, + 4095, 3415, 3792, + 4080, 3488, 3732, + 4024, 3571, 3636, + 3936, 3662, 3466, + 3784, 3761, 3041, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3200, 4062, + 4095, 3201, 4062, + 4095, 3201, 4062, + 4095, 3202, 4062, + 4095, 3202, 4062, + 4095, 3203, 4061, + 4095, 3204, 4061, + 4095, 3206, 4061, + 4095, 3208, 4060, + 4095, 3211, 4059, + 4095, 3215, 4058, + 4095, 3220, 4057, + 4095, 3226, 4055, + 4095, 3235, 4053, + 4095, 3247, 4050, + 4095, 3261, 4046, + 4095, 3280, 4040, + 4095, 3305, 4032, + 4095, 3335, 4022, + 4095, 3374, 4008, + 4095, 3420, 3988, + 4095, 3475, 3959, + 4095, 3540, 3918, + 4095, 3614, 3858, + 4095, 3698, 3761, + 4070, 3790, 3587, + 0, 2261, 2529, + 0, 2261, 2529, + 0, 2262, 2529, + 0, 2263, 2528, + 0, 2264, 2527, + 0, 2265, 2526, + 0, 2267, 2524, + 0, 2269, 2522, + 0, 2272, 2520, + 0, 2276, 2516, + 0, 2281, 2511, + 0, 2288, 2504, + 0, 2297, 2495, + 0, 2308, 2482, + 0, 2324, 2465, + 0, 2343, 2440, + 0, 2368, 2405, + 0, 2400, 2354, + 0, 2439, 2274, + 0, 2486, 2140, + 0, 2542, 1860, + 0, 2608, 0, + 0, 2684, 0, + 0, 2768, 0, + 0, 2861, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2261, 2530, + 0, 2262, 2530, + 0, 2262, 2529, + 0, 2263, 2529, + 0, 2264, 2528, + 0, 2265, 2527, + 0, 2267, 2525, + 0, 2269, 2523, + 0, 2272, 2520, + 0, 2276, 2517, + 0, 2281, 2512, + 0, 2288, 2505, + 0, 2297, 2495, + 0, 2309, 2483, + 0, 2324, 2465, + 0, 2343, 2441, + 0, 2368, 2406, + 0, 2400, 2354, + 0, 2439, 2275, + 0, 2486, 2141, + 0, 2543, 1863, + 0, 2608, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2261, 2531, + 0, 2262, 2530, + 0, 2262, 2530, + 0, 2263, 2529, + 0, 2264, 2528, + 0, 2265, 2527, + 0, 2267, 2526, + 0, 2269, 2524, + 0, 2272, 2521, + 0, 2276, 2517, + 0, 2281, 2512, + 0, 2288, 2505, + 0, 2297, 2496, + 0, 2309, 2484, + 0, 2324, 2466, + 0, 2344, 2442, + 0, 2369, 2407, + 0, 2400, 2355, + 0, 2439, 2276, + 0, 2486, 2143, + 0, 2543, 1866, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2262, 2532, + 0, 2262, 2531, + 0, 2263, 2531, + 0, 2263, 2530, + 0, 2264, 2529, + 0, 2265, 2528, + 0, 2267, 2527, + 0, 2269, 2525, + 0, 2272, 2522, + 0, 2276, 2518, + 0, 2281, 2513, + 0, 2288, 2506, + 0, 2297, 2497, + 0, 2309, 2485, + 0, 2324, 2467, + 0, 2344, 2443, + 0, 2369, 2408, + 0, 2400, 2357, + 0, 2439, 2278, + 0, 2486, 2145, + 0, 2543, 1870, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2262, 2533, + 0, 2262, 2533, + 0, 2263, 2532, + 0, 2264, 2531, + 0, 2264, 2531, + 0, 2266, 2529, + 0, 2267, 2528, + 0, 2270, 2526, + 0, 2273, 2523, + 0, 2276, 2520, + 0, 2282, 2515, + 0, 2288, 2508, + 0, 2297, 2499, + 0, 2309, 2486, + 0, 2324, 2469, + 0, 2344, 2444, + 0, 2369, 2410, + 0, 2400, 2359, + 0, 2439, 2280, + 0, 2487, 2148, + 0, 2543, 1875, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2262, 2535, + 0, 2263, 2534, + 0, 2263, 2534, + 0, 2264, 2533, + 0, 2265, 2532, + 0, 2266, 2531, + 0, 2268, 2530, + 0, 2270, 2528, + 0, 2273, 2525, + 0, 2277, 2521, + 0, 2282, 2516, + 0, 2289, 2510, + 0, 2298, 2500, + 0, 2310, 2488, + 0, 2325, 2471, + 0, 2344, 2446, + 0, 2369, 2412, + 0, 2401, 2361, + 0, 2440, 2283, + 0, 2487, 2152, + 0, 2543, 1882, + 0, 2609, 0, + 0, 2684, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3181, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3541, 0, + 0, 3667, 0, + 0, 2263, 2537, + 0, 2263, 2537, + 0, 2264, 2536, + 0, 2265, 2535, + 0, 2265, 2535, + 0, 2267, 2533, + 0, 2268, 2532, + 0, 2271, 2530, + 0, 2274, 2527, + 0, 2277, 2524, + 0, 2283, 2519, + 0, 2289, 2512, + 0, 2298, 2503, + 0, 2310, 2490, + 0, 2325, 2473, + 0, 2345, 2449, + 0, 2370, 2415, + 0, 2401, 2364, + 0, 2440, 2287, + 0, 2487, 2157, + 0, 2543, 1892, + 0, 2609, 0, + 0, 2685, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2962, 0, + 0, 3069, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3418, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2264, 2540, + 0, 2264, 2539, + 0, 2265, 2539, + 0, 2265, 2538, + 0, 2266, 2538, + 0, 2267, 2536, + 0, 2269, 2535, + 0, 2271, 2533, + 0, 2274, 2530, + 0, 2278, 2527, + 0, 2283, 2522, + 0, 2290, 2515, + 0, 2299, 2506, + 0, 2311, 2494, + 0, 2326, 2477, + 0, 2346, 2453, + 0, 2370, 2419, + 0, 2402, 2369, + 0, 2440, 2292, + 0, 2488, 2164, + 0, 2544, 1904, + 0, 2610, 0, + 0, 2685, 0, + 0, 2769, 0, + 0, 2862, 0, + 0, 2963, 0, + 0, 3069, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2265, 2544, + 0, 2265, 2543, + 0, 2266, 2543, + 0, 2266, 2542, + 0, 2267, 2542, + 0, 2268, 2540, + 0, 2270, 2539, + 0, 2272, 2537, + 0, 2275, 2534, + 0, 2279, 2531, + 0, 2284, 2526, + 0, 2291, 2519, + 0, 2300, 2510, + 0, 2312, 2498, + 0, 2327, 2481, + 0, 2346, 2458, + 0, 2371, 2424, + 0, 2402, 2375, + 0, 2441, 2299, + 0, 2488, 2173, + 0, 2544, 1920, + 0, 2610, 0, + 0, 2685, 0, + 0, 2770, 0, + 0, 2862, 0, + 0, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3298, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2266, 2549, + 0, 2266, 2549, + 0, 2267, 2548, + 0, 2268, 2548, + 0, 2269, 2547, + 0, 2270, 2546, + 0, 2271, 2544, + 0, 2274, 2542, + 0, 2277, 2540, + 0, 2280, 2536, + 0, 2286, 2531, + 0, 2292, 2525, + 0, 2301, 2516, + 0, 2313, 2504, + 0, 2328, 2487, + 0, 2348, 2464, + 0, 2372, 2431, + 0, 2403, 2382, + 0, 2442, 2308, + 0, 2489, 2185, + 0, 2545, 1940, + 0, 2611, 542, + 0, 2686, 0, + 0, 2770, 0, + 0, 2863, 0, + 0, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2268, 2556, + 0, 2268, 2556, + 0, 2269, 2555, + 0, 2269, 2555, + 0, 2270, 2554, + 0, 2272, 2553, + 0, 2273, 2551, + 0, 2275, 2549, + 0, 2278, 2547, + 0, 2282, 2543, + 0, 2287, 2538, + 0, 2294, 2532, + 0, 2303, 2523, + 0, 2315, 2512, + 0, 2330, 2495, + 0, 2349, 2472, + 0, 2374, 2440, + 0, 2405, 2392, + 0, 2443, 2320, + 0, 2490, 2200, + 0, 2546, 1966, + 0, 2612, 914, + 0, 2687, 0, + 0, 2771, 0, + 0, 2863, 0, + 0, 2963, 0, + 0, 3070, 0, + 0, 3182, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2270, 2565, + 0, 2271, 2565, + 0, 2271, 2564, + 0, 2272, 2564, + 0, 2273, 2563, + 0, 2274, 2562, + 0, 2276, 2560, + 0, 2278, 2559, + 0, 2281, 2556, + 0, 2285, 2553, + 0, 2290, 2548, + 0, 2296, 2542, + 0, 2305, 2533, + 0, 2317, 2522, + 0, 2332, 2505, + 0, 2351, 2483, + 0, 2376, 2451, + 0, 2407, 2405, + 0, 2445, 2335, + 0, 2492, 2220, + 0, 2547, 1998, + 0, 2613, 1168, + 0, 2688, 0, + 0, 2772, 0, + 0, 2864, 0, + 0, 2964, 0, + 0, 3071, 0, + 0, 3183, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2273, 2577, + 0, 2274, 2577, + 0, 2274, 2576, + 0, 2275, 2576, + 0, 2276, 2575, + 0, 2277, 2574, + 0, 2279, 2572, + 0, 2281, 2571, + 0, 2284, 2568, + 0, 2288, 2565, + 0, 2293, 2560, + 0, 2299, 2554, + 0, 2308, 2546, + 0, 2320, 2535, + 0, 2335, 2519, + 0, 2354, 2497, + 0, 2378, 2467, + 0, 2409, 2422, + 0, 2447, 2354, + 0, 2494, 2245, + 0, 2549, 2038, + 0, 2614, 1374, + 0, 2689, 0, + 0, 2773, 0, + 0, 2865, 0, + 0, 2965, 0, + 0, 3071, 0, + 0, 3183, 0, + 0, 3299, 0, + 0, 3419, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2278, 2592, + 0, 2278, 2592, + 0, 2279, 2592, + 0, 2279, 2591, + 0, 2280, 2590, + 0, 2281, 2589, + 0, 2283, 2588, + 0, 2285, 2586, + 0, 2288, 2584, + 0, 2292, 2581, + 0, 2297, 2576, + 0, 2303, 2570, + 0, 2312, 2562, + 0, 2323, 2551, + 0, 2338, 2536, + 0, 2357, 2516, + 0, 2382, 2486, + 0, 2412, 2443, + 0, 2450, 2379, + 0, 2496, 2276, + 0, 2551, 2087, + 0, 2616, 1554, + 0, 2690, 0, + 0, 2774, 0, + 0, 2866, 0, + 0, 2966, 0, + 0, 3072, 0, + 0, 3184, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3542, 0, + 0, 3667, 0, + 0, 2283, 2612, + 0, 2284, 2612, + 0, 2284, 2611, + 0, 2285, 2611, + 0, 2286, 2610, + 0, 2287, 2609, + 0, 2289, 2608, + 0, 2291, 2606, + 0, 2293, 2604, + 0, 2297, 2601, + 0, 2302, 2597, + 0, 2309, 2591, + 0, 2317, 2584, + 0, 2329, 2573, + 0, 2343, 2559, + 0, 2362, 2539, + 0, 2386, 2511, + 0, 2416, 2471, + 0, 2454, 2410, + 0, 2500, 2315, + 0, 2555, 2145, + 0, 2619, 1719, + 0, 2693, 0, + 0, 2776, 0, + 0, 2868, 0, + 0, 2967, 0, + 0, 3073, 0, + 0, 3184, 0, + 0, 3300, 0, + 0, 3420, 0, + 0, 3543, 0, + 0, 3668, 0, + 746, 2291, 2637, + 722, 2291, 2637, + 688, 2292, 2637, + 637, 2292, 2636, + 559, 2293, 2636, + 428, 2294, 2635, + 158, 2296, 2633, + 0, 2298, 2632, + 0, 2301, 2630, + 0, 2304, 2627, + 0, 2309, 2623, + 0, 2316, 2618, + 0, 2324, 2610, + 0, 2335, 2601, + 0, 2350, 2587, + 0, 2368, 2568, + 0, 2392, 2542, + 0, 2422, 2505, + 0, 2459, 2449, + 0, 2504, 2362, + 0, 2559, 2212, + 0, 2622, 1874, + 0, 2696, 0, + 0, 2778, 0, + 0, 2870, 0, + 0, 2969, 0, + 0, 3074, 0, + 0, 3185, 0, + 0, 3301, 0, + 0, 3421, 0, + 0, 3543, 0, + 0, 3668, 0, + 1791, 2300, 2669, + 1789, 2301, 2669, + 1785, 2301, 2668, + 1781, 2302, 2668, + 1775, 2303, 2667, + 1767, 2304, 2667, + 1757, 2305, 2665, + 1742, 2307, 2664, + 1721, 2310, 2662, + 1692, 2314, 2659, + 1650, 2319, 2656, + 1586, 2325, 2651, + 1485, 2333, 2644, + 1300, 2344, 2635, + 793, 2358, 2622, + 0, 2376, 2605, + 0, 2400, 2581, + 0, 2429, 2547, + 0, 2466, 2496, + 0, 2510, 2419, + 0, 2564, 2289, + 0, 2627, 2023, + 0, 2700, 0, + 0, 2782, 0, + 0, 2872, 0, + 0, 2971, 0, + 0, 3076, 0, + 0, 3187, 0, + 0, 3302, 0, + 0, 3422, 0, + 0, 3544, 0, + 0, 3668, 0, + 2150, 2313, 2708, + 2149, 2313, 2708, + 2147, 2314, 2708, + 2145, 2314, 2707, + 2143, 2315, 2707, + 2139, 2316, 2706, + 2135, 2318, 2705, + 2128, 2320, 2704, + 2119, 2323, 2702, + 2108, 2326, 2699, + 2091, 2331, 2696, + 2068, 2337, 2691, + 2036, 2345, 2685, + 1988, 2356, 2677, + 1915, 2369, 2666, + 1795, 2387, 2650, + 1560, 2410, 2628, + 480, 2439, 2597, + 0, 2474, 2553, + 0, 2518, 2485, + 0, 2571, 2375, + 0, 2633, 2167, + 0, 2705, 1492, + 0, 2786, 0, + 0, 2876, 0, + 0, 2974, 0, + 0, 3078, 0, + 0, 3189, 0, + 0, 3304, 0, + 0, 3423, 0, + 0, 3545, 0, + 0, 3669, 0, + 2399, 2329, 2756, + 2398, 2330, 2756, + 2398, 2330, 2755, + 2396, 2331, 2755, + 2395, 2332, 2754, + 2393, 2333, 2754, + 2390, 2334, 2753, + 2387, 2336, 2752, + 2382, 2339, 2750, + 2375, 2342, 2748, + 2366, 2346, 2745, + 2354, 2352, 2741, + 2337, 2360, 2735, + 2313, 2370, 2728, + 2278, 2384, 2718, + 2228, 2401, 2704, + 2151, 2423, 2684, + 2023, 2451, 2657, + 1760, 2486, 2618, + 0, 2529, 2560, + 0, 2581, 2469, + 0, 2642, 2308, + 0, 2712, 1927, + 0, 2792, 0, + 0, 2881, 0, + 0, 2978, 0, + 0, 3081, 0, + 0, 3191, 0, + 0, 3306, 0, + 0, 3424, 0, + 0, 3546, 0, + 0, 3670, 0, + 2602, 2350, 2813, + 2602, 2351, 2812, + 2602, 2351, 2812, + 2601, 2352, 2812, + 2600, 2353, 2811, + 2599, 2354, 2811, + 2597, 2355, 2810, + 2595, 2357, 2809, + 2591, 2359, 2807, + 2587, 2362, 2805, + 2582, 2367, 2803, + 2574, 2372, 2799, + 2563, 2380, 2794, + 2549, 2390, 2788, + 2529, 2402, 2779, + 2501, 2419, 2767, + 2460, 2440, 2750, + 2400, 2467, 2727, + 2303, 2501, 2694, + 2131, 2543, 2645, + 1693, 2593, 2570, + 0, 2652, 2447, + 0, 2721, 2200, + 0, 2800, 714, + 0, 2887, 0, + 0, 2983, 0, + 0, 3085, 0, + 0, 3194, 0, + 0, 3308, 0, + 0, 3426, 0, + 0, 3547, 0, + 0, 3671, 0, + 2781, 2377, 2879, + 2781, 2377, 2879, + 2781, 2378, 2879, + 2780, 2378, 2878, + 2780, 2379, 2878, + 2779, 2380, 2877, + 2778, 2381, 2877, + 2776, 2383, 2876, + 2774, 2385, 2874, + 2771, 2388, 2873, + 2767, 2392, 2870, + 2762, 2398, 2867, + 2755, 2405, 2863, + 2746, 2414, 2858, + 2733, 2426, 2850, + 2715, 2442, 2840, + 2691, 2462, 2826, + 2655, 2488, 2806, + 2602, 2520, 2778, + 2521, 2560, 2738, + 2384, 2609, 2678, + 2092, 2666, 2584, + 0, 2733, 2415, + 0, 2810, 1999, + 0, 2895, 0, + 0, 2989, 0, + 0, 3091, 0, + 0, 3198, 0, + 0, 3311, 0, + 0, 3429, 0, + 0, 3549, 0, + 0, 3673, 0, + 2946, 2411, 2955, + 2945, 2411, 2955, + 2945, 2411, 2954, + 2945, 2412, 2954, + 2944, 2412, 2954, + 2944, 2413, 2953, + 2943, 2414, 2953, + 2942, 2416, 2952, + 2940, 2418, 2951, + 2939, 2421, 2950, + 2936, 2425, 2948, + 2932, 2430, 2945, + 2928, 2436, 2942, + 2921, 2445, 2937, + 2913, 2456, 2930, + 2901, 2471, 2922, + 2884, 2490, 2910, + 2861, 2514, 2894, + 2829, 2545, 2871, + 2781, 2583, 2838, + 2709, 2629, 2791, + 2589, 2684, 2719, + 2354, 2749, 2601, + 1291, 2823, 2369, + 0, 2906, 1378, + 0, 2998, 0, + 0, 3098, 0, + 0, 3204, 0, + 0, 3316, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3675, 0, + 3100, 2452, 3040, + 3100, 2452, 3040, + 3100, 2452, 3039, + 3100, 2453, 3039, + 3099, 2453, 3039, + 3099, 2454, 3039, + 3098, 2455, 3038, + 3098, 2457, 3037, + 3097, 2459, 3037, + 3095, 2461, 3035, + 3093, 2465, 3034, + 3091, 2469, 3032, + 3088, 2475, 3029, + 3083, 2483, 3025, + 3077, 2494, 3020, + 3069, 2507, 3013, + 3058, 2525, 3003, + 3042, 2547, 2990, + 3020, 2576, 2971, + 2990, 2611, 2945, + 2945, 2655, 2909, + 2878, 2707, 2854, + 2769, 2769, 2769, + 2564, 2840, 2622, + 1912, 2921, 2300, + 0, 3010, 0, + 0, 3107, 0, + 0, 3212, 0, + 0, 3322, 0, + 0, 3437, 0, + 0, 3555, 0, + 0, 3677, 0, + 3249, 2501, 3133, + 3248, 2502, 3133, + 3248, 2502, 3133, + 3248, 2502, 3133, + 3248, 2503, 3132, + 3248, 2504, 3132, + 3247, 2505, 3132, + 3247, 2506, 3131, + 3246, 2508, 3130, + 3245, 2510, 3129, + 3244, 2513, 3128, + 3242, 2517, 3126, + 3239, 2523, 3124, + 3236, 2530, 3121, + 3232, 2539, 3117, + 3226, 2552, 3111, + 3218, 2568, 3103, + 3207, 2588, 3093, + 3192, 2614, 3078, + 3172, 2647, 3058, + 3142, 2687, 3029, + 3100, 2736, 2988, + 3036, 2794, 2926, + 2934, 2862, 2828, + 2746, 2939, 2650, + 2226, 3025, 2186, + 0, 3120, 0, + 0, 3221, 0, + 0, 3329, 0, + 0, 3443, 0, + 0, 3560, 0, + 0, 3681, 0, + 3392, 2560, 3234, + 3392, 2561, 3234, + 3392, 2561, 3234, + 3392, 2561, 3233, + 3392, 2562, 3233, + 3392, 2562, 3233, + 3391, 2563, 3233, + 3391, 2564, 3232, + 3391, 2566, 3232, + 3390, 2568, 3231, + 3389, 2571, 3230, + 3388, 2574, 3229, + 3386, 2579, 3227, + 3383, 2586, 3224, + 3380, 2594, 3221, + 3376, 2605, 3216, + 3370, 2619, 3210, + 3363, 2637, 3202, + 3352, 2661, 3190, + 3338, 2691, 3175, + 3317, 2727, 3153, + 3289, 2772, 3121, + 3248, 2826, 3076, + 3187, 2890, 3008, + 3089, 2962, 2896, + 2913, 3045, 2685, + 2459, 3135, 1969, + 0, 3234, 0, + 0, 3339, 0, + 0, 3450, 0, + 0, 3566, 0, + 0, 3685, 0, + 3533, 2629, 3341, + 3533, 2629, 3341, + 3533, 2629, 3341, + 3533, 2630, 3341, + 3533, 2630, 3341, + 3533, 2631, 3340, + 3532, 2631, 3340, + 3532, 2632, 3340, + 3532, 2634, 3339, + 3531, 2636, 3339, + 3530, 2638, 3338, + 3530, 2641, 3337, + 3528, 2645, 3335, + 3527, 2651, 3333, + 3524, 2658, 3331, + 3521, 2668, 3327, + 3517, 2680, 3322, + 3512, 2696, 3316, + 3504, 2717, 3307, + 3494, 2743, 3295, + 3479, 2776, 3278, + 3460, 2817, 3255, + 3432, 2866, 3221, + 3392, 2924, 3173, + 3332, 2992, 3098, + 3237, 3069, 2974, + 3069, 3156, 2727, + 2654, 3251, 1192, + 0, 3353, 0, + 0, 3461, 0, + 0, 3574, 0, + 0, 3692, 0, + 3672, 2707, 3453, + 3672, 2707, 3453, + 3671, 2707, 3453, + 3671, 2708, 3453, + 3671, 2708, 3453, + 3671, 2709, 3453, + 3671, 2709, 3453, + 3671, 2710, 3453, + 3671, 2711, 3452, + 3670, 2713, 3452, + 3670, 2715, 3451, + 3669, 2717, 3450, + 3668, 2721, 3449, + 3667, 2725, 3448, + 3665, 2732, 3446, + 3663, 2740, 3443, + 3660, 2750, 3439, + 3656, 2764, 3434, + 3650, 2782, 3427, + 3643, 2805, 3418, + 3633, 2834, 3405, + 3619, 2870, 3388, + 3599, 2914, 3363, + 3572, 2967, 3328, + 3532, 3029, 3276, + 3474, 3101, 3196, + 3382, 3182, 3061, + 3218, 3272, 2778, + 2827, 3370, 0, + 0, 3474, 0, + 0, 3585, 0, + 0, 3700, 0, + 3808, 2794, 3570, + 3808, 2794, 3570, + 3808, 2794, 3570, + 3808, 2795, 3570, + 3808, 2795, 3570, + 3808, 2795, 3570, + 3808, 2796, 3570, + 3808, 2796, 3570, + 3808, 2797, 3569, + 3807, 2799, 3569, + 3807, 2800, 3569, + 3806, 2803, 3568, + 3806, 2805, 3567, + 3805, 2809, 3566, + 3804, 2814, 3564, + 3802, 2821, 3562, + 3800, 2830, 3559, + 3797, 2842, 3555, + 3793, 2857, 3550, + 3787, 2876, 3543, + 3780, 2901, 3533, + 3770, 2932, 3520, + 3756, 2971, 3502, + 3737, 3018, 3476, + 3710, 3074, 3440, + 3671, 3139, 3385, + 3613, 3214, 3301, + 3522, 3299, 3156, + 3363, 3391, 2839, + 2989, 3492, 0, + 0, 3598, 0, + 0, 3710, 0, + 3944, 2889, 3691, + 3944, 2889, 3691, + 3944, 2890, 3691, + 3944, 2890, 3691, + 3944, 2890, 3691, + 3944, 2890, 3691, + 3944, 2891, 3690, + 3943, 2891, 3690, + 3943, 2892, 3690, + 3943, 2893, 3690, + 3943, 2894, 3689, + 3942, 2896, 3689, + 3942, 2898, 3688, + 3941, 2902, 3687, + 3940, 2906, 3686, + 3939, 2911, 3684, + 3937, 2919, 3682, + 3935, 2928, 3679, + 3932, 2941, 3675, + 3928, 2957, 3670, + 3923, 2978, 3663, + 3916, 3004, 3653, + 3906, 3037, 3639, + 3892, 3078, 3620, + 3873, 3128, 3594, + 3846, 3186, 3556, + 3808, 3255, 3500, + 3750, 3332, 3412, + 3661, 3419, 3258, + 3504, 3514, 2909, + 3141, 3616, 0, + 0, 3724, 0, + 4079, 2992, 3814, + 4079, 2992, 3814, + 4078, 2992, 3814, + 4078, 2992, 3814, + 4078, 2992, 3814, + 4078, 2992, 3814, + 4078, 2993, 3814, + 4078, 2993, 3813, + 4078, 2994, 3813, + 4078, 2995, 3813, + 4078, 2996, 3813, + 4077, 2997, 3812, + 4077, 2999, 3812, + 4077, 3002, 3811, + 4076, 3005, 3810, + 4075, 3009, 3809, + 4074, 3015, 3807, + 4072, 3023, 3805, + 4070, 3033, 3802, + 4067, 3047, 3798, + 4063, 3064, 3793, + 4058, 3086, 3785, + 4050, 3114, 3775, + 4040, 3148, 3761, + 4027, 3191, 3742, + 4008, 3242, 3715, + 3981, 3303, 3676, + 3943, 3374, 3618, + 3886, 3453, 3527, + 3798, 3542, 3367, + 3643, 3639, 2988, + 3288, 3742, 0, + 4095, 3100, 3939, + 4095, 3100, 3939, + 4095, 3100, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3101, 3939, + 4095, 3102, 3939, + 4095, 3103, 3939, + 4095, 3103, 3938, + 4095, 3105, 3938, + 4095, 3106, 3938, + 4095, 3108, 3937, + 4095, 3111, 3936, + 4095, 3114, 3936, + 4095, 3119, 3934, + 4095, 3125, 3933, + 4095, 3133, 3930, + 4095, 3144, 3927, + 4095, 3158, 3923, + 4095, 3176, 3918, + 4095, 3199, 3910, + 4095, 3228, 3900, + 4095, 3264, 3886, + 4095, 3308, 3866, + 4095, 3361, 3839, + 4095, 3424, 3799, + 4078, 3496, 3740, + 4021, 3577, 3646, + 3933, 3667, 3480, + 3780, 3765, 3076, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3214, 4066, + 4095, 3215, 4066, + 4095, 3215, 4066, + 4095, 3215, 4066, + 4095, 3216, 4066, + 4095, 3216, 4066, + 4095, 3217, 4065, + 4095, 3218, 4065, + 4095, 3220, 4065, + 4095, 3222, 4064, + 4095, 3225, 4063, + 4095, 3229, 4062, + 4095, 3233, 4061, + 4095, 3240, 4059, + 4095, 3248, 4057, + 4095, 3259, 4054, + 4095, 3274, 4050, + 4095, 3292, 4044, + 4095, 3316, 4037, + 4095, 3346, 4026, + 4095, 3383, 4012, + 4095, 3429, 3992, + 4095, 3483, 3964, + 4095, 3547, 3924, + 4095, 3620, 3864, + 4095, 3703, 3768, + 4068, 3794, 3598, + 0, 2393, 2661, + 0, 2393, 2661, + 0, 2393, 2661, + 0, 2394, 2660, + 0, 2395, 2660, + 0, 2396, 2659, + 0, 2397, 2658, + 0, 2399, 2656, + 0, 2401, 2654, + 0, 2404, 2651, + 0, 2408, 2648, + 0, 2413, 2643, + 0, 2420, 2636, + 0, 2429, 2627, + 0, 2440, 2614, + 0, 2456, 2596, + 0, 2475, 2572, + 0, 2500, 2537, + 0, 2532, 2485, + 0, 2571, 2406, + 0, 2618, 2271, + 0, 2674, 1991, + 0, 2740, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 0, 2393, 2662, + 0, 2393, 2662, + 0, 2394, 2661, + 0, 2394, 2661, + 0, 2395, 2660, + 0, 2396, 2659, + 0, 2397, 2658, + 0, 2399, 2657, + 0, 2401, 2655, + 0, 2404, 2652, + 0, 2408, 2648, + 0, 2413, 2643, + 0, 2420, 2636, + 0, 2429, 2627, + 0, 2441, 2614, + 0, 2456, 2597, + 0, 2475, 2572, + 0, 2500, 2537, + 0, 2532, 2486, + 0, 2571, 2406, + 0, 2618, 2272, + 0, 2675, 1992, + 0, 2740, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 0, 2393, 2662, + 0, 2393, 2662, + 0, 2394, 2662, + 0, 2394, 2661, + 0, 2395, 2661, + 0, 2396, 2660, + 0, 2397, 2659, + 0, 2399, 2657, + 0, 2401, 2655, + 0, 2404, 2652, + 0, 2408, 2649, + 0, 2413, 2644, + 0, 2420, 2637, + 0, 2429, 2628, + 0, 2441, 2615, + 0, 2456, 2597, + 0, 2476, 2573, + 0, 2501, 2538, + 0, 2532, 2487, + 0, 2571, 2407, + 0, 2618, 2273, + 0, 2675, 1995, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3673, 0, + 0, 2393, 2663, + 0, 2393, 2663, + 0, 2394, 2662, + 0, 2394, 2662, + 0, 2395, 2661, + 0, 2396, 2661, + 0, 2397, 2659, + 0, 2399, 2658, + 0, 2401, 2656, + 0, 2404, 2653, + 0, 2408, 2649, + 0, 2413, 2644, + 0, 2420, 2638, + 0, 2429, 2628, + 0, 2441, 2616, + 0, 2456, 2598, + 0, 2476, 2574, + 0, 2501, 2539, + 0, 2532, 2488, + 0, 2571, 2408, + 0, 2618, 2275, + 0, 2675, 1998, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3674, 0, + 0, 2393, 2664, + 0, 2394, 2664, + 0, 2394, 2663, + 0, 2395, 2663, + 0, 2395, 2662, + 0, 2396, 2661, + 0, 2398, 2660, + 0, 2399, 2659, + 0, 2401, 2657, + 0, 2404, 2654, + 0, 2408, 2650, + 0, 2413, 2645, + 0, 2420, 2639, + 0, 2429, 2629, + 0, 2441, 2617, + 0, 2456, 2599, + 0, 2476, 2575, + 0, 2501, 2540, + 0, 2532, 2489, + 0, 2571, 2410, + 0, 2618, 2277, + 0, 2675, 2002, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3313, 0, + 0, 3430, 0, + 0, 3550, 0, + 0, 3674, 0, + 0, 2394, 2665, + 0, 2394, 2665, + 0, 2394, 2665, + 0, 2395, 2664, + 0, 2396, 2664, + 0, 2397, 2663, + 0, 2398, 2662, + 0, 2399, 2660, + 0, 2402, 2658, + 0, 2405, 2655, + 0, 2409, 2652, + 0, 2414, 2647, + 0, 2421, 2640, + 0, 2430, 2631, + 0, 2441, 2618, + 0, 2457, 2601, + 0, 2476, 2576, + 0, 2501, 2542, + 0, 2533, 2491, + 0, 2571, 2412, + 0, 2619, 2280, + 0, 2675, 2007, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2394, 2667, + 0, 2394, 2667, + 0, 2395, 2666, + 0, 2395, 2666, + 0, 2396, 2665, + 0, 2397, 2664, + 0, 2398, 2663, + 0, 2400, 2662, + 0, 2402, 2660, + 0, 2405, 2657, + 0, 2409, 2653, + 0, 2414, 2648, + 0, 2421, 2642, + 0, 2430, 2633, + 0, 2442, 2620, + 0, 2457, 2603, + 0, 2477, 2579, + 0, 2501, 2544, + 0, 2533, 2493, + 0, 2572, 2415, + 0, 2619, 2284, + 0, 2675, 2014, + 0, 2741, 0, + 0, 2816, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3094, 0, + 0, 3201, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2395, 2669, + 0, 2395, 2669, + 0, 2395, 2669, + 0, 2396, 2668, + 0, 2397, 2668, + 0, 2398, 2667, + 0, 2399, 2666, + 0, 2400, 2664, + 0, 2403, 2662, + 0, 2406, 2659, + 0, 2410, 2656, + 0, 2415, 2651, + 0, 2422, 2644, + 0, 2430, 2635, + 0, 2442, 2623, + 0, 2457, 2605, + 0, 2477, 2581, + 0, 2502, 2547, + 0, 2533, 2497, + 0, 2572, 2419, + 0, 2619, 2289, + 0, 2676, 2024, + 0, 2741, 0, + 0, 2817, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3095, 0, + 0, 3201, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2395, 2672, + 0, 2396, 2672, + 0, 2396, 2672, + 0, 2397, 2671, + 0, 2397, 2670, + 0, 2398, 2670, + 0, 2400, 2669, + 0, 2401, 2667, + 0, 2403, 2665, + 0, 2406, 2662, + 0, 2410, 2659, + 0, 2415, 2654, + 0, 2422, 2647, + 0, 2431, 2638, + 0, 2443, 2626, + 0, 2458, 2609, + 0, 2478, 2585, + 0, 2503, 2551, + 0, 2534, 2501, + 0, 2573, 2424, + 0, 2620, 2296, + 0, 2676, 2036, + 0, 2742, 0, + 0, 2817, 0, + 0, 2901, 0, + 0, 2994, 0, + 0, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3430, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2397, 2676, + 0, 2397, 2676, + 0, 2397, 2676, + 0, 2398, 2675, + 0, 2398, 2674, + 0, 2399, 2674, + 0, 2401, 2673, + 0, 2402, 2671, + 0, 2404, 2669, + 0, 2407, 2666, + 0, 2411, 2663, + 0, 2416, 2658, + 0, 2423, 2651, + 0, 2432, 2642, + 0, 2444, 2630, + 0, 2459, 2613, + 0, 2478, 2590, + 0, 2503, 2556, + 0, 2535, 2507, + 0, 2573, 2431, + 0, 2620, 2305, + 0, 2677, 2052, + 0, 2742, 0, + 0, 2817, 0, + 0, 2902, 0, + 0, 2995, 0, + 0, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2398, 2681, + 0, 2398, 2681, + 0, 2399, 2681, + 0, 2399, 2680, + 0, 2400, 2680, + 0, 2401, 2679, + 0, 2402, 2678, + 0, 2404, 2676, + 0, 2406, 2674, + 0, 2409, 2672, + 0, 2413, 2668, + 0, 2418, 2663, + 0, 2424, 2657, + 0, 2433, 2648, + 0, 2445, 2636, + 0, 2460, 2619, + 0, 2480, 2596, + 0, 2504, 2563, + 0, 2536, 2514, + 0, 2574, 2440, + 0, 2621, 2317, + 0, 2677, 2072, + 0, 2743, 674, + 0, 2818, 0, + 0, 2902, 0, + 0, 2995, 0, + 0, 3095, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2400, 2688, + 0, 2400, 2688, + 0, 2400, 2688, + 0, 2401, 2687, + 0, 2402, 2687, + 0, 2402, 2686, + 0, 2404, 2685, + 0, 2405, 2683, + 0, 2408, 2681, + 0, 2410, 2679, + 0, 2414, 2675, + 0, 2419, 2671, + 0, 2426, 2664, + 0, 2435, 2656, + 0, 2447, 2644, + 0, 2462, 2627, + 0, 2481, 2604, + 0, 2506, 2572, + 0, 2537, 2524, + 0, 2575, 2452, + 0, 2622, 2332, + 0, 2678, 2098, + 0, 2744, 1046, + 0, 2819, 0, + 0, 2903, 0, + 0, 2995, 0, + 0, 3096, 0, + 0, 3202, 0, + 0, 3314, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2402, 2697, + 0, 2402, 2697, + 0, 2403, 2697, + 0, 2403, 2696, + 0, 2404, 2696, + 0, 2405, 2695, + 0, 2406, 2694, + 0, 2408, 2693, + 0, 2410, 2691, + 0, 2413, 2688, + 0, 2417, 2685, + 0, 2422, 2680, + 0, 2428, 2674, + 0, 2437, 2665, + 0, 2449, 2654, + 0, 2464, 2638, + 0, 2483, 2615, + 0, 2508, 2583, + 0, 2539, 2537, + 0, 2577, 2467, + 0, 2624, 2352, + 0, 2680, 2130, + 0, 2745, 1300, + 0, 2820, 0, + 0, 2904, 0, + 0, 2996, 0, + 0, 3096, 0, + 0, 3203, 0, + 0, 3315, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2405, 2709, + 0, 2406, 2709, + 0, 2406, 2709, + 0, 2406, 2708, + 0, 2407, 2708, + 0, 2408, 2707, + 0, 2409, 2706, + 0, 2411, 2705, + 0, 2413, 2703, + 0, 2416, 2700, + 0, 2420, 2697, + 0, 2425, 2692, + 0, 2431, 2686, + 0, 2440, 2678, + 0, 2452, 2667, + 0, 2467, 2651, + 0, 2486, 2629, + 0, 2510, 2599, + 0, 2541, 2554, + 0, 2579, 2486, + 0, 2626, 2377, + 0, 2681, 2170, + 0, 2746, 1506, + 0, 2821, 0, + 0, 2905, 0, + 0, 2997, 0, + 0, 3097, 0, + 0, 3203, 0, + 0, 3315, 0, + 0, 3431, 0, + 0, 3551, 0, + 0, 3674, 0, + 0, 2410, 2725, + 0, 2410, 2724, + 0, 2410, 2724, + 0, 2411, 2724, + 0, 2411, 2723, + 0, 2412, 2722, + 0, 2413, 2721, + 0, 2415, 2720, + 0, 2417, 2718, + 0, 2420, 2716, + 0, 2424, 2713, + 0, 2429, 2708, + 0, 2435, 2702, + 0, 2444, 2694, + 0, 2456, 2684, + 0, 2470, 2669, + 0, 2489, 2648, + 0, 2514, 2618, + 0, 2544, 2575, + 0, 2582, 2511, + 0, 2628, 2408, + 0, 2684, 2219, + 0, 2748, 1686, + 0, 2823, 0, + 0, 2906, 0, + 0, 2998, 0, + 0, 3098, 0, + 0, 3204, 0, + 0, 3316, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3675, 0, + 0, 2415, 2744, + 0, 2415, 2744, + 0, 2416, 2744, + 0, 2416, 2744, + 0, 2417, 2743, + 0, 2418, 2742, + 0, 2419, 2741, + 0, 2421, 2740, + 0, 2423, 2738, + 0, 2426, 2736, + 0, 2429, 2733, + 0, 2434, 2729, + 0, 2441, 2723, + 0, 2449, 2716, + 0, 2461, 2705, + 0, 2475, 2691, + 0, 2494, 2671, + 0, 2518, 2643, + 0, 2548, 2603, + 0, 2586, 2543, + 0, 2632, 2447, + 0, 2687, 2277, + 0, 2751, 1851, + 0, 2825, 0, + 0, 2908, 0, + 0, 3000, 0, + 0, 3099, 0, + 0, 3205, 0, + 0, 3316, 0, + 0, 3432, 0, + 0, 3552, 0, + 0, 3675, 0, + 896, 2423, 2770, + 879, 2423, 2769, + 854, 2423, 2769, + 820, 2424, 2769, + 769, 2424, 2768, + 691, 2425, 2768, + 560, 2426, 2767, + 290, 2428, 2766, + 0, 2430, 2764, + 0, 2433, 2762, + 0, 2436, 2759, + 0, 2441, 2755, + 0, 2448, 2750, + 0, 2456, 2742, + 0, 2467, 2733, + 0, 2482, 2719, + 0, 2500, 2701, + 0, 2524, 2674, + 0, 2554, 2637, + 0, 2591, 2581, + 0, 2636, 2494, + 0, 2691, 2344, + 0, 2755, 2007, + 0, 2828, 0, + 0, 2910, 0, + 0, 3002, 0, + 0, 3101, 0, + 0, 3206, 0, + 0, 3317, 0, + 0, 3433, 0, + 0, 3553, 0, + 0, 3675, 0, + 1925, 2432, 2801, + 1923, 2432, 2801, + 1921, 2433, 2801, + 1917, 2433, 2801, + 1913, 2434, 2800, + 1907, 2435, 2799, + 1899, 2436, 2799, + 1889, 2438, 2798, + 1874, 2440, 2796, + 1853, 2442, 2794, + 1824, 2446, 2791, + 1782, 2451, 2788, + 1718, 2457, 2783, + 1617, 2465, 2776, + 1432, 2476, 2767, + 925, 2490, 2754, + 0, 2508, 2737, + 0, 2532, 2713, + 0, 2561, 2679, + 0, 2598, 2628, + 0, 2642, 2551, + 0, 2696, 2421, + 0, 2759, 2155, + 0, 2832, 0, + 0, 2914, 0, + 0, 3004, 0, + 0, 3103, 0, + 0, 3208, 0, + 0, 3319, 0, + 0, 3434, 0, + 0, 3554, 0, + 0, 3676, 0, + 2283, 2445, 2841, + 2282, 2445, 2840, + 2281, 2445, 2840, + 2279, 2446, 2840, + 2278, 2447, 2839, + 2275, 2447, 2839, + 2271, 2449, 2838, + 2267, 2450, 2837, + 2260, 2452, 2836, + 2252, 2455, 2834, + 2240, 2458, 2831, + 2223, 2463, 2828, + 2200, 2469, 2823, + 2168, 2477, 2817, + 2120, 2488, 2809, + 2047, 2501, 2798, + 1927, 2519, 2782, + 1692, 2542, 2760, + 612, 2571, 2729, + 0, 2607, 2685, + 0, 2650, 2617, + 0, 2703, 2507, + 0, 2765, 2299, + 0, 2837, 1624, + 0, 2918, 0, + 0, 3008, 0, + 0, 3106, 0, + 0, 3210, 0, + 0, 3321, 0, + 0, 3436, 0, + 0, 3555, 0, + 0, 3677, 0, + 2532, 2461, 2888, + 2531, 2462, 2888, + 2531, 2462, 2888, + 2530, 2462, 2887, + 2529, 2463, 2887, + 2527, 2464, 2887, + 2525, 2465, 2886, + 2522, 2466, 2885, + 2519, 2468, 2884, + 2514, 2471, 2882, + 2507, 2474, 2880, + 2498, 2479, 2877, + 2486, 2484, 2873, + 2469, 2492, 2867, + 2445, 2503, 2860, + 2411, 2516, 2850, + 2360, 2533, 2836, + 2283, 2555, 2817, + 2155, 2583, 2789, + 1893, 2618, 2750, + 0, 2661, 2692, + 0, 2713, 2601, + 0, 2774, 2440, + 0, 2844, 2059, + 0, 2924, 0, + 0, 3013, 0, + 0, 3110, 0, + 0, 3213, 0, + 0, 3323, 0, + 0, 3438, 0, + 0, 3556, 0, + 0, 3678, 0, + 2735, 2482, 2945, + 2735, 2483, 2945, + 2734, 2483, 2945, + 2734, 2483, 2944, + 2733, 2484, 2944, + 2732, 2485, 2944, + 2731, 2486, 2943, + 2729, 2487, 2942, + 2727, 2489, 2941, + 2724, 2491, 2940, + 2719, 2495, 2938, + 2714, 2499, 2935, + 2706, 2504, 2931, + 2696, 2512, 2927, + 2681, 2522, 2920, + 2661, 2535, 2911, + 2633, 2551, 2899, + 2592, 2572, 2882, + 2532, 2599, 2859, + 2435, 2633, 2826, + 2263, 2675, 2777, + 1825, 2725, 2702, + 0, 2784, 2579, + 0, 2853, 2332, + 0, 2932, 847, + 0, 3019, 0, + 0, 3115, 0, + 0, 3217, 0, + 0, 3326, 0, + 0, 3440, 0, + 0, 3558, 0, + 0, 3679, 0, + 2914, 2509, 3011, + 2913, 2509, 3011, + 2913, 2510, 3011, + 2913, 2510, 3011, + 2912, 2510, 3010, + 2912, 2511, 3010, + 2911, 2512, 3009, + 2910, 2513, 3009, + 2908, 2515, 3008, + 2906, 2517, 3007, + 2903, 2521, 3005, + 2900, 2525, 3003, + 2894, 2530, 3000, + 2888, 2537, 2995, + 2878, 2546, 2990, + 2865, 2558, 2982, + 2848, 2574, 2972, + 2823, 2594, 2958, + 2787, 2620, 2938, + 2735, 2652, 2910, + 2653, 2692, 2870, + 2516, 2741, 2810, + 2224, 2798, 2716, + 0, 2865, 2547, + 0, 2942, 2131, + 0, 3028, 0, + 0, 3122, 0, + 0, 3223, 0, + 0, 3331, 0, + 0, 3443, 0, + 0, 3561, 0, + 0, 3681, 0, + 3078, 2542, 3087, + 3078, 2543, 3087, + 3077, 2543, 3087, + 3077, 2543, 3087, + 3077, 2544, 3086, + 3076, 2544, 3086, + 3076, 2545, 3086, + 3075, 2547, 3085, + 3074, 2548, 3084, + 3073, 2550, 3083, + 3071, 2553, 3082, + 3068, 2557, 3080, + 3064, 2562, 3077, + 3060, 2569, 3074, + 3053, 2577, 3069, + 3045, 2589, 3063, + 3033, 2603, 3054, + 3016, 2622, 3042, + 2993, 2647, 3026, + 2961, 2677, 3003, + 2913, 2715, 2971, + 2841, 2761, 2923, + 2721, 2816, 2851, + 2486, 2881, 2733, + 1423, 2955, 2501, + 0, 3039, 1510, + 0, 3130, 0, + 0, 3230, 0, + 0, 3336, 0, + 0, 3448, 0, + 0, 3564, 0, + 0, 3684, 0, + 3232, 2584, 3172, + 3232, 2584, 3172, + 3232, 2584, 3172, + 3232, 2584, 3172, + 3232, 2585, 3171, + 3232, 2585, 3171, + 3231, 2586, 3171, + 3231, 2587, 3170, + 3230, 2589, 3170, + 3229, 2591, 3169, + 3227, 2593, 3167, + 3226, 2597, 3166, + 3223, 2601, 3164, + 3220, 2607, 3161, + 3215, 2615, 3157, + 3209, 2626, 3152, + 3201, 2639, 3145, + 3190, 2657, 3135, + 3174, 2680, 3122, + 3152, 2708, 3103, + 3122, 2743, 3078, + 3077, 2787, 3041, + 3010, 2839, 2986, + 2901, 2901, 2901, + 2696, 2972, 2754, + 2044, 3053, 2432, + 0, 3142, 0, + 0, 3239, 0, + 0, 3344, 0, + 0, 3454, 0, + 0, 3569, 0, + 0, 3687, 0, + 3381, 2633, 3265, + 3381, 2634, 3265, + 3381, 2634, 3265, + 3380, 2634, 3265, + 3380, 2634, 3265, + 3380, 2635, 3265, + 3380, 2636, 3264, + 3379, 2637, 3264, + 3379, 2638, 3263, + 3378, 2640, 3263, + 3377, 2642, 3262, + 3376, 2645, 3260, + 3374, 2649, 3259, + 3372, 2655, 3256, + 3368, 2662, 3253, + 3364, 2671, 3249, + 3358, 2684, 3243, + 3350, 2700, 3235, + 3339, 2720, 3225, + 3324, 2746, 3210, + 3304, 2779, 3190, + 3274, 2819, 3161, + 3232, 2868, 3120, + 3168, 2926, 3058, + 3066, 2994, 2960, + 2879, 3071, 2782, + 2358, 3157, 2318, + 0, 3252, 0, + 0, 3353, 0, + 0, 3461, 0, + 0, 3575, 0, + 0, 3692, 0, + 3525, 2692, 3366, + 3525, 2693, 3366, + 3524, 2693, 3366, + 3524, 2693, 3366, + 3524, 2693, 3366, + 3524, 2694, 3365, + 3524, 2695, 3365, + 3524, 2695, 3365, + 3523, 2697, 3364, + 3523, 2698, 3364, + 3522, 2700, 3363, + 3521, 2703, 3362, + 3520, 2707, 3361, + 3518, 2711, 3359, + 3516, 2718, 3356, + 3512, 2726, 3353, + 3508, 2737, 3348, + 3503, 2751, 3342, + 3495, 2770, 3334, + 3484, 2793, 3322, + 3470, 2823, 3307, + 3450, 2859, 3285, + 3421, 2904, 3254, + 3380, 2958, 3208, + 3319, 3022, 3140, + 3221, 3095, 3028, + 3045, 3177, 2817, + 2591, 3268, 2101, + 0, 3366, 0, + 0, 3471, 0, + 0, 3582, 0, + 0, 3698, 0, + 3665, 2761, 3473, + 3665, 2761, 3473, + 3665, 2761, 3473, + 3665, 2762, 3473, + 3665, 2762, 3473, + 3665, 2762, 3473, + 3665, 2763, 3472, + 3665, 2764, 3472, + 3664, 2765, 3472, + 3664, 2766, 3471, + 3663, 2768, 3471, + 3663, 2770, 3470, + 3662, 2773, 3469, + 3660, 2777, 3467, + 3659, 2783, 3465, + 3656, 2790, 3463, + 3653, 2800, 3459, + 3649, 2812, 3454, + 3644, 2828, 3448, + 3636, 2849, 3439, + 3626, 2875, 3427, + 3611, 2908, 3410, + 3592, 2949, 3387, + 3564, 2998, 3353, + 3524, 3056, 3305, + 3464, 3124, 3230, + 3370, 3202, 3106, + 3201, 3288, 2859, + 2786, 3383, 1324, + 0, 3485, 0, + 0, 3593, 0, + 0, 3706, 0, + 3804, 2839, 3586, + 3804, 2839, 3586, + 3804, 2839, 3586, + 3804, 2840, 3585, + 3803, 2840, 3585, + 3803, 2840, 3585, + 3803, 2841, 3585, + 3803, 2841, 3585, + 3803, 2842, 3585, + 3803, 2843, 3584, + 3802, 2845, 3584, + 3802, 2847, 3583, + 3801, 2849, 3582, + 3800, 2853, 3581, + 3799, 2858, 3580, + 3797, 2864, 3578, + 3795, 2872, 3575, + 3792, 2882, 3571, + 3788, 2896, 3566, + 3782, 2914, 3559, + 3775, 2937, 3550, + 3765, 2966, 3537, + 3751, 3002, 3520, + 3731, 3046, 3495, + 3704, 3099, 3460, + 3665, 3161, 3408, + 3606, 3233, 3328, + 3514, 3314, 3193, + 3351, 3404, 2910, + 2960, 3502, 0, + 0, 3606, 0, + 0, 3717, 0, + 3940, 2926, 3703, + 3940, 2926, 3702, + 3940, 2926, 3702, + 3940, 2926, 3702, + 3940, 2927, 3702, + 3940, 2927, 3702, + 3940, 2927, 3702, + 3940, 2928, 3702, + 3940, 2929, 3702, + 3940, 2930, 3702, + 3939, 2931, 3701, + 3939, 2932, 3701, + 3938, 2935, 3700, + 3938, 2938, 3699, + 3937, 2941, 3698, + 3936, 2947, 3696, + 3934, 2953, 3694, + 3932, 2962, 3691, + 3929, 2974, 3687, + 3925, 2989, 3682, + 3919, 3008, 3675, + 3912, 3033, 3666, + 3902, 3064, 3652, + 3888, 3103, 3634, + 3869, 3150, 3608, + 3842, 3206, 3572, + 3803, 3271, 3517, + 3745, 3347, 3433, + 3654, 3431, 3288, + 3495, 3523, 2971, + 3121, 3624, 0, + 0, 3730, 0, + 4076, 3021, 3823, + 4076, 3021, 3823, + 4076, 3021, 3823, + 4076, 3022, 3823, + 4076, 3022, 3823, + 4076, 3022, 3823, + 4076, 3022, 3823, + 4076, 3023, 3822, + 4076, 3023, 3822, + 4075, 3024, 3822, + 4075, 3025, 3822, + 4075, 3026, 3821, + 4075, 3028, 3821, + 4074, 3031, 3820, + 4073, 3034, 3819, + 4072, 3038, 3818, + 4071, 3043, 3817, + 4070, 3051, 3814, + 4067, 3060, 3811, + 4064, 3073, 3807, + 4060, 3089, 3802, + 4055, 3110, 3795, + 4048, 3136, 3785, + 4038, 3170, 3771, + 4024, 3210, 3753, + 4005, 3260, 3726, + 3978, 3318, 3688, + 3940, 3387, 3632, + 3883, 3464, 3544, + 3793, 3551, 3390, + 3636, 3646, 3041, + 3273, 3748, 0, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3124, 3946, + 4095, 3125, 3946, + 4095, 3125, 3946, + 4095, 3125, 3946, + 4095, 3126, 3945, + 4095, 3127, 3945, + 4095, 3128, 3945, + 4095, 3129, 3945, + 4095, 3131, 3944, + 4095, 3134, 3943, + 4095, 3137, 3942, + 4095, 3142, 3941, + 4095, 3147, 3940, + 4095, 3155, 3937, + 4095, 3165, 3934, + 4095, 3179, 3930, + 4095, 3196, 3925, + 4095, 3218, 3917, + 4095, 3246, 3907, + 4095, 3280, 3893, + 4095, 3323, 3874, + 4095, 3375, 3847, + 4095, 3435, 3808, + 4075, 3506, 3750, + 4019, 3586, 3659, + 3930, 3674, 3499, + 3775, 3771, 3120, + 4095, 3232, 4071, + 4095, 3232, 4071, + 4095, 3232, 4071, + 4095, 3232, 4071, + 4095, 3233, 4071, + 4095, 3233, 4071, + 4095, 3233, 4071, + 4095, 3233, 4071, + 4095, 3234, 4071, + 4095, 3234, 4071, + 4095, 3235, 4071, + 4095, 3236, 4070, + 4095, 3237, 4070, + 4095, 3238, 4070, + 4095, 3240, 4069, + 4095, 3243, 4069, + 4095, 3246, 4068, + 4095, 3251, 4066, + 4095, 3257, 4065, + 4095, 3265, 4062, + 4095, 3276, 4059, + 4095, 3290, 4055, + 4095, 3308, 4050, + 4095, 3331, 4042, + 4095, 3360, 4032, + 4095, 3396, 4018, + 4095, 3440, 3998, + 4095, 3493, 3971, + 4095, 3556, 3931, + 4095, 3628, 3872, + 4095, 3709, 3778, + 4065, 3799, 3612, + 0, 2525, 2793, + 0, 2525, 2793, + 0, 2525, 2793, + 0, 2525, 2793, + 0, 2526, 2792, + 0, 2527, 2792, + 0, 2528, 2791, + 0, 2529, 2790, + 0, 2531, 2788, + 0, 2533, 2786, + 0, 2536, 2783, + 0, 2540, 2779, + 0, 2545, 2774, + 0, 2552, 2768, + 0, 2561, 2758, + 0, 2572, 2746, + 0, 2588, 2728, + 0, 2607, 2704, + 0, 2632, 2668, + 0, 2664, 2617, + 0, 2703, 2537, + 0, 2750, 2402, + 0, 2807, 2121, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3445, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2525, 2793, + 0, 2526, 2793, + 0, 2526, 2792, + 0, 2527, 2792, + 0, 2528, 2791, + 0, 2529, 2790, + 0, 2531, 2788, + 0, 2533, 2786, + 0, 2536, 2783, + 0, 2540, 2780, + 0, 2545, 2775, + 0, 2552, 2768, + 0, 2561, 2759, + 0, 2573, 2746, + 0, 2588, 2728, + 0, 2607, 2704, + 0, 2632, 2669, + 0, 2664, 2617, + 0, 2703, 2538, + 0, 2750, 2403, + 0, 2807, 2123, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2526, 2793, + 0, 2526, 2793, + 0, 2527, 2792, + 0, 2528, 2791, + 0, 2529, 2790, + 0, 2531, 2789, + 0, 2533, 2787, + 0, 2536, 2784, + 0, 2540, 2780, + 0, 2545, 2775, + 0, 2552, 2768, + 0, 2561, 2759, + 0, 2573, 2746, + 0, 2588, 2729, + 0, 2608, 2704, + 0, 2633, 2669, + 0, 2664, 2618, + 0, 2703, 2538, + 0, 2750, 2404, + 0, 2807, 2124, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2795, + 0, 2525, 2794, + 0, 2525, 2794, + 0, 2526, 2794, + 0, 2526, 2793, + 0, 2527, 2793, + 0, 2528, 2792, + 0, 2529, 2791, + 0, 2531, 2789, + 0, 2533, 2787, + 0, 2536, 2784, + 0, 2540, 2781, + 0, 2545, 2776, + 0, 2552, 2769, + 0, 2561, 2760, + 0, 2573, 2747, + 0, 2588, 2730, + 0, 2608, 2705, + 0, 2633, 2670, + 0, 2664, 2619, + 0, 2703, 2539, + 0, 2750, 2405, + 0, 2807, 2127, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2795, + 0, 2525, 2795, + 0, 2526, 2795, + 0, 2526, 2795, + 0, 2526, 2794, + 0, 2527, 2793, + 0, 2528, 2793, + 0, 2529, 2791, + 0, 2531, 2790, + 0, 2533, 2788, + 0, 2536, 2785, + 0, 2540, 2781, + 0, 2545, 2776, + 0, 2552, 2770, + 0, 2561, 2760, + 0, 2573, 2748, + 0, 2588, 2730, + 0, 2608, 2706, + 0, 2633, 2671, + 0, 2664, 2620, + 0, 2703, 2540, + 0, 2750, 2407, + 0, 2807, 2130, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2525, 2796, + 0, 2526, 2796, + 0, 2526, 2796, + 0, 2526, 2795, + 0, 2527, 2795, + 0, 2527, 2794, + 0, 2528, 2794, + 0, 2530, 2792, + 0, 2531, 2791, + 0, 2533, 2789, + 0, 2536, 2786, + 0, 2540, 2782, + 0, 2546, 2777, + 0, 2552, 2771, + 0, 2561, 2761, + 0, 2573, 2749, + 0, 2588, 2731, + 0, 2608, 2707, + 0, 2633, 2672, + 0, 2664, 2621, + 0, 2703, 2542, + 0, 2751, 2409, + 0, 2807, 2134, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2526, 2798, + 0, 2526, 2797, + 0, 2526, 2797, + 0, 2527, 2797, + 0, 2527, 2796, + 0, 2528, 2796, + 0, 2529, 2795, + 0, 2530, 2794, + 0, 2532, 2792, + 0, 2534, 2790, + 0, 2537, 2787, + 0, 2541, 2784, + 0, 2546, 2779, + 0, 2553, 2772, + 0, 2562, 2763, + 0, 2573, 2750, + 0, 2589, 2733, + 0, 2608, 2709, + 0, 2633, 2674, + 0, 2665, 2623, + 0, 2703, 2544, + 0, 2751, 2412, + 0, 2807, 2139, + 0, 2873, 0, + 0, 2948, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2526, 2799, + 0, 2526, 2799, + 0, 2527, 2799, + 0, 2527, 2798, + 0, 2527, 2798, + 0, 2528, 2797, + 0, 2529, 2797, + 0, 2530, 2795, + 0, 2532, 2794, + 0, 2534, 2792, + 0, 2537, 2789, + 0, 2541, 2785, + 0, 2546, 2780, + 0, 2553, 2774, + 0, 2562, 2765, + 0, 2574, 2752, + 0, 2589, 2735, + 0, 2609, 2711, + 0, 2634, 2676, + 0, 2665, 2625, + 0, 2704, 2547, + 0, 2751, 2416, + 0, 2807, 2146, + 0, 2873, 0, + 0, 2949, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3226, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2527, 2801, + 0, 2527, 2801, + 0, 2527, 2801, + 0, 2528, 2801, + 0, 2528, 2800, + 0, 2529, 2800, + 0, 2530, 2799, + 0, 2531, 2798, + 0, 2533, 2796, + 0, 2535, 2794, + 0, 2538, 2791, + 0, 2542, 2788, + 0, 2547, 2783, + 0, 2554, 2776, + 0, 2563, 2767, + 0, 2574, 2755, + 0, 2590, 2737, + 0, 2609, 2713, + 0, 2634, 2679, + 0, 2665, 2629, + 0, 2704, 2551, + 0, 2751, 2421, + 0, 2808, 2156, + 0, 2873, 0, + 0, 2949, 0, + 0, 3033, 0, + 0, 3126, 0, + 0, 3227, 0, + 0, 3333, 0, + 0, 3446, 0, + 0, 3562, 0, + 0, 3683, 0, + 0, 2527, 2804, + 0, 2528, 2804, + 0, 2528, 2804, + 0, 2528, 2804, + 0, 2529, 2803, + 0, 2529, 2803, + 0, 2530, 2802, + 0, 2532, 2801, + 0, 2533, 2799, + 0, 2536, 2797, + 0, 2538, 2794, + 0, 2542, 2791, + 0, 2548, 2786, + 0, 2554, 2779, + 0, 2563, 2770, + 0, 2575, 2758, + 0, 2590, 2741, + 0, 2610, 2717, + 0, 2635, 2683, + 0, 2666, 2633, + 0, 2705, 2556, + 0, 2752, 2428, + 0, 2808, 2168, + 0, 2874, 0, + 0, 2949, 0, + 0, 3034, 0, + 0, 3126, 0, + 0, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2528, 2808, + 0, 2529, 2808, + 0, 2529, 2808, + 0, 2529, 2808, + 0, 2530, 2807, + 0, 2531, 2807, + 0, 2531, 2806, + 0, 2533, 2805, + 0, 2534, 2803, + 0, 2537, 2801, + 0, 2539, 2799, + 0, 2543, 2795, + 0, 2549, 2790, + 0, 2555, 2783, + 0, 2564, 2775, + 0, 2576, 2762, + 0, 2591, 2745, + 0, 2611, 2722, + 0, 2635, 2688, + 0, 2667, 2639, + 0, 2705, 2563, + 0, 2752, 2437, + 0, 2809, 2184, + 0, 2874, 0, + 0, 2949, 0, + 0, 3034, 0, + 0, 3127, 0, + 0, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2530, 2814, + 0, 2530, 2813, + 0, 2530, 2813, + 0, 2531, 2813, + 0, 2531, 2812, + 0, 2532, 2812, + 0, 2533, 2811, + 0, 2534, 2810, + 0, 2536, 2808, + 0, 2538, 2806, + 0, 2541, 2804, + 0, 2545, 2800, + 0, 2550, 2795, + 0, 2557, 2789, + 0, 2565, 2780, + 0, 2577, 2768, + 0, 2592, 2751, + 0, 2612, 2728, + 0, 2636, 2695, + 0, 2668, 2646, + 0, 2706, 2572, + 0, 2753, 2449, + 0, 2809, 2204, + 0, 2875, 806, + 0, 2950, 0, + 0, 3034, 0, + 0, 3127, 0, + 0, 3227, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2532, 2821, + 0, 2532, 2820, + 0, 2532, 2820, + 0, 2532, 2820, + 0, 2533, 2819, + 0, 2534, 2819, + 0, 2535, 2818, + 0, 2536, 2817, + 0, 2537, 2815, + 0, 2540, 2814, + 0, 2543, 2811, + 0, 2546, 2807, + 0, 2552, 2803, + 0, 2558, 2796, + 0, 2567, 2788, + 0, 2579, 2776, + 0, 2594, 2759, + 0, 2613, 2736, + 0, 2638, 2704, + 0, 2669, 2656, + 0, 2708, 2584, + 0, 2754, 2464, + 0, 2810, 2230, + 0, 2876, 1179, + 0, 2951, 0, + 0, 3035, 0, + 0, 3128, 0, + 0, 3228, 0, + 0, 3334, 0, + 0, 3446, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2534, 2830, + 0, 2534, 2829, + 0, 2534, 2829, + 0, 2535, 2829, + 0, 2535, 2828, + 0, 2536, 2828, + 0, 2537, 2827, + 0, 2538, 2826, + 0, 2540, 2825, + 0, 2542, 2823, + 0, 2545, 2820, + 0, 2549, 2817, + 0, 2554, 2812, + 0, 2561, 2806, + 0, 2569, 2797, + 0, 2581, 2786, + 0, 2596, 2770, + 0, 2615, 2747, + 0, 2640, 2716, + 0, 2671, 2669, + 0, 2709, 2599, + 0, 2756, 2484, + 0, 2812, 2263, + 0, 2877, 1432, + 0, 2952, 0, + 0, 3036, 0, + 0, 3128, 0, + 0, 3228, 0, + 0, 3335, 0, + 0, 3447, 0, + 0, 3563, 0, + 0, 3683, 0, + 0, 2537, 2842, + 0, 2537, 2841, + 0, 2538, 2841, + 0, 2538, 2841, + 0, 2539, 2840, + 0, 2539, 2840, + 0, 2540, 2839, + 0, 2541, 2838, + 0, 2543, 2837, + 0, 2545, 2835, + 0, 2548, 2832, + 0, 2552, 2829, + 0, 2557, 2824, + 0, 2564, 2818, + 0, 2572, 2810, + 0, 2584, 2799, + 0, 2599, 2783, + 0, 2618, 2761, + 0, 2642, 2731, + 0, 2673, 2686, + 0, 2711, 2618, + 0, 2758, 2509, + 0, 2813, 2303, + 0, 2878, 1638, + 0, 2953, 0, + 0, 3037, 0, + 0, 3129, 0, + 0, 3229, 0, + 0, 3335, 0, + 0, 3447, 0, + 0, 3564, 0, + 0, 3684, 0, + 0, 2541, 2857, + 0, 2542, 2857, + 0, 2542, 2857, + 0, 2542, 2856, + 0, 2543, 2856, + 0, 2543, 2855, + 0, 2544, 2854, + 0, 2546, 2854, + 0, 2547, 2852, + 0, 2549, 2850, + 0, 2552, 2848, + 0, 2556, 2845, + 0, 2561, 2840, + 0, 2568, 2835, + 0, 2576, 2827, + 0, 2588, 2816, + 0, 2602, 2801, + 0, 2621, 2780, + 0, 2646, 2750, + 0, 2676, 2708, + 0, 2714, 2643, + 0, 2760, 2540, + 0, 2816, 2351, + 0, 2880, 1818, + 0, 2955, 0, + 0, 3038, 0, + 0, 3130, 0, + 0, 3230, 0, + 0, 3336, 0, + 0, 3448, 0, + 0, 3564, 0, + 0, 3684, 0, + 0, 2547, 2877, + 0, 2547, 2877, + 0, 2547, 2876, + 0, 2548, 2876, + 0, 2548, 2876, + 0, 2549, 2875, + 0, 2550, 2874, + 0, 2551, 2873, + 0, 2553, 2872, + 0, 2555, 2870, + 0, 2558, 2868, + 0, 2561, 2865, + 0, 2566, 2861, + 0, 2573, 2855, + 0, 2581, 2848, + 0, 2593, 2837, + 0, 2607, 2823, + 0, 2626, 2803, + 0, 2650, 2775, + 0, 2680, 2735, + 0, 2718, 2675, + 0, 2764, 2579, + 0, 2819, 2409, + 0, 2883, 1983, + 0, 2957, 0, + 0, 3040, 0, + 0, 3132, 0, + 0, 3231, 0, + 0, 3337, 0, + 0, 3449, 0, + 0, 3565, 0, + 0, 3684, 0, + 1040, 2554, 2902, + 1028, 2555, 2902, + 1011, 2555, 2902, + 986, 2555, 2901, + 952, 2556, 2901, + 901, 2556, 2900, + 823, 2557, 2900, + 692, 2558, 2899, + 422, 2560, 2898, + 0, 2562, 2896, + 0, 2565, 2894, + 0, 2569, 2891, + 0, 2573, 2887, + 0, 2580, 2882, + 0, 2588, 2875, + 0, 2599, 2865, + 0, 2614, 2851, + 0, 2632, 2833, + 0, 2656, 2806, + 0, 2686, 2769, + 0, 2723, 2713, + 0, 2768, 2627, + 0, 2823, 2476, + 0, 2887, 2139, + 0, 2960, 0, + 0, 3043, 0, + 0, 3134, 0, + 0, 3233, 0, + 0, 3338, 0, + 0, 3450, 0, + 0, 3565, 0, + 0, 3685, 0, + 2058, 2564, 2934, + 2057, 2564, 2933, + 2055, 2565, 2933, + 2053, 2565, 2933, + 2050, 2565, 2933, + 2045, 2566, 2932, + 2039, 2567, 2932, + 2032, 2568, 2931, + 2021, 2570, 2930, + 2006, 2572, 2928, + 1985, 2574, 2926, + 1956, 2578, 2923, + 1914, 2583, 2920, + 1850, 2589, 2915, + 1749, 2597, 2908, + 1564, 2608, 2899, + 1057, 2622, 2887, + 0, 2641, 2869, + 0, 2664, 2845, + 0, 2693, 2811, + 0, 2730, 2761, + 0, 2775, 2683, + 0, 2828, 2553, + 0, 2891, 2287, + 0, 2964, 0, + 0, 3046, 0, + 0, 3137, 0, + 0, 3235, 0, + 0, 3340, 0, + 0, 3451, 0, + 0, 3566, 0, + 0, 3686, 0, + 2415, 2577, 2973, + 2415, 2577, 2973, + 2414, 2577, 2972, + 2413, 2578, 2972, + 2412, 2578, 2972, + 2410, 2579, 2971, + 2407, 2580, 2971, + 2404, 2581, 2970, + 2399, 2582, 2969, + 2392, 2584, 2968, + 2384, 2587, 2966, + 2372, 2590, 2963, + 2355, 2595, 2960, + 2332, 2601, 2956, + 2300, 2609, 2949, + 2252, 2620, 2941, + 2179, 2633, 2930, + 2059, 2651, 2914, + 1824, 2674, 2892, + 744, 2703, 2862, + 0, 2739, 2817, + 0, 2783, 2749, + 0, 2835, 2639, + 0, 2898, 2431, + 0, 2969, 1756, + 0, 3050, 0, + 0, 3140, 0, + 0, 3238, 0, + 0, 3342, 0, + 0, 3453, 0, + 0, 3568, 0, + 0, 3687, 0, + 2664, 2593, 3020, + 2664, 2593, 3020, + 2663, 2594, 3020, + 2663, 2594, 3020, + 2662, 2594, 3020, + 2661, 2595, 3019, + 2659, 2596, 3019, + 2657, 2597, 3018, + 2654, 2598, 3017, + 2651, 2600, 3016, + 2646, 2603, 3014, + 2639, 2606, 3012, + 2630, 2611, 3009, + 2618, 2617, 3005, + 2601, 2624, 2999, + 2577, 2635, 2992, + 2543, 2648, 2982, + 2493, 2665, 2968, + 2416, 2687, 2949, + 2287, 2715, 2922, + 2025, 2750, 2883, + 0, 2793, 2824, + 0, 2845, 2733, + 0, 2906, 2572, + 0, 2976, 2191, + 0, 3056, 0, + 0, 3145, 0, + 0, 3242, 0, + 0, 3345, 0, + 0, 3455, 0, + 0, 3570, 0, + 0, 3688, 0, + 2867, 2614, 3077, + 2867, 2614, 3077, + 2867, 2615, 3077, + 2866, 2615, 3077, + 2866, 2615, 3076, + 2865, 2616, 3076, + 2864, 2617, 3076, + 2863, 2618, 3075, + 2861, 2619, 3074, + 2859, 2621, 3073, + 2856, 2623, 3072, + 2851, 2627, 3070, + 2846, 2631, 3067, + 2838, 2637, 3063, + 2828, 2644, 3059, + 2813, 2654, 3052, + 2793, 2667, 3043, + 2765, 2683, 3031, + 2724, 2705, 3014, + 2664, 2731, 2991, + 2567, 2765, 2958, + 2395, 2807, 2909, + 1957, 2857, 2835, + 0, 2916, 2711, + 0, 2985, 2465, + 0, 3064, 979, + 0, 3151, 0, + 0, 3247, 0, + 0, 3350, 0, + 0, 3458, 0, + 0, 3572, 0, + 0, 3690, 0, + 3046, 2641, 3143, + 3046, 2641, 3143, + 3046, 2641, 3143, + 3045, 2642, 3143, + 3045, 2642, 3143, + 3044, 2643, 3142, + 3044, 2643, 3142, + 3043, 2644, 3142, + 3042, 2646, 3141, + 3040, 2647, 3140, + 3038, 2650, 3139, + 3035, 2653, 3137, + 3032, 2657, 3135, + 3027, 2662, 3132, + 3020, 2669, 3127, + 3010, 2678, 3122, + 2997, 2691, 3114, + 2980, 2706, 3104, + 2955, 2727, 3090, + 2919, 2752, 3070, + 2867, 2785, 3042, + 2786, 2824, 3002, + 2648, 2873, 2942, + 2356, 2930, 2848, + 0, 2997, 2679, + 0, 3074, 2263, + 0, 3160, 0, + 0, 3254, 0, + 0, 3355, 0, + 0, 3463, 0, + 0, 3576, 0, + 0, 3693, 0, + 3210, 2674, 3219, + 3210, 2674, 3219, + 3210, 2675, 3219, + 3210, 2675, 3219, + 3209, 2675, 3219, + 3209, 2676, 3218, + 3209, 2677, 3218, + 3208, 2677, 3218, + 3207, 2679, 3217, + 3206, 2680, 3216, + 3205, 2682, 3215, + 3203, 2685, 3214, + 3200, 2689, 3212, + 3197, 2694, 3209, + 3192, 2701, 3206, + 3185, 2709, 3201, + 3177, 2721, 3195, + 3165, 2735, 3186, + 3148, 2754, 3174, + 3126, 2779, 3158, + 3093, 2809, 3135, + 3045, 2847, 3103, + 2973, 2893, 3055, + 2853, 2948, 2983, + 2618, 3013, 2865, + 1555, 3087, 2634, + 0, 3171, 1643, + 0, 3263, 0, + 0, 3362, 0, + 0, 3468, 0, + 0, 3580, 0, + 0, 3696, 0, + 3365, 2716, 3304, + 3365, 2716, 3304, + 3364, 2716, 3304, + 3364, 2716, 3304, + 3364, 2716, 3304, + 3364, 2717, 3303, + 3364, 2718, 3303, + 3363, 2718, 3303, + 3363, 2719, 3302, + 3362, 2721, 3302, + 3361, 2723, 3301, + 3359, 2725, 3300, + 3358, 2729, 3298, + 3355, 2734, 3296, + 3352, 2740, 3293, + 3347, 2748, 3289, + 3341, 2758, 3284, + 3333, 2772, 3277, + 3322, 2789, 3267, + 3306, 2812, 3254, + 3285, 2840, 3235, + 3254, 2876, 3210, + 3209, 2919, 3173, + 3142, 2971, 3118, + 3033, 3033, 3033, + 2828, 3104, 2887, + 2176, 3185, 2564, + 0, 3274, 0, + 0, 3372, 0, + 0, 3476, 0, + 0, 3586, 0, + 0, 3701, 0, + 3513, 2765, 3397, + 3513, 2765, 3397, + 3513, 2766, 3397, + 3513, 2766, 3397, + 3513, 2766, 3397, + 3512, 2767, 3397, + 3512, 2767, 3397, + 3512, 2768, 3396, + 3511, 2769, 3396, + 3511, 2770, 3395, + 3510, 2772, 3395, + 3509, 2774, 3394, + 3508, 2777, 3392, + 3506, 2781, 3391, + 3504, 2787, 3388, + 3500, 2794, 3385, + 3496, 2804, 3381, + 3490, 2816, 3375, + 3482, 2832, 3367, + 3471, 2852, 3357, + 3457, 2878, 3342, + 3436, 2911, 3322, + 3406, 2951, 3293, + 3364, 3000, 3252, + 3300, 3058, 3190, + 3198, 3126, 3092, + 3011, 3203, 2914, + 2491, 3289, 2450, + 0, 3384, 0, + 0, 3486, 0, + 0, 3594, 0, + 0, 3707, 0, + 3657, 2824, 3498, + 3657, 2824, 3498, + 3657, 2825, 3498, + 3657, 2825, 3498, + 3656, 2825, 3498, + 3656, 2825, 3498, + 3656, 2826, 3497, + 3656, 2827, 3497, + 3656, 2827, 3497, + 3655, 2829, 3497, + 3655, 2830, 3496, + 3654, 2832, 3495, + 3653, 2835, 3494, + 3652, 2839, 3493, + 3650, 2843, 3491, + 3648, 2850, 3488, + 3645, 2858, 3485, + 3640, 2869, 3480, + 3635, 2883, 3474, + 3627, 2902, 3466, + 3616, 2925, 3454, + 3602, 2955, 3439, + 3582, 2992, 3417, + 3553, 3036, 3386, + 3512, 3090, 3340, + 3451, 3154, 3272, + 3353, 3227, 3160, + 3177, 3309, 2949, + 2723, 3400, 2233, + 0, 3498, 0, + 0, 3604, 0, + 0, 3715, 0, + 3797, 2893, 3605, + 3797, 2893, 3605, + 3797, 2893, 3605, + 3797, 2893, 3605, + 3797, 2894, 3605, + 3797, 2894, 3605, + 3797, 2894, 3605, + 3797, 2895, 3605, + 3797, 2896, 3604, + 3796, 2897, 3604, + 3796, 2898, 3604, + 3795, 2900, 3603, + 3795, 2902, 3602, + 3794, 2905, 3601, + 3792, 2909, 3600, + 3791, 2915, 3598, + 3788, 2922, 3595, + 3785, 2932, 3591, + 3781, 2944, 3587, + 3776, 2960, 3580, + 3768, 2981, 3571, + 3758, 3007, 3559, + 3744, 3040, 3542, + 3724, 3081, 3519, + 3696, 3130, 3486, + 3656, 3188, 3437, + 3596, 3256, 3362, + 3502, 3334, 3238, + 3333, 3420, 2991, + 2918, 3515, 1456, + 0, 3617, 0, + 0, 3725, 0, + 3936, 2971, 3718, + 3936, 2971, 3718, + 3936, 2971, 3718, + 3936, 2971, 3718, + 3936, 2972, 3718, + 3936, 2972, 3717, + 3935, 2972, 3717, + 3935, 2973, 3717, + 3935, 2973, 3717, + 3935, 2974, 3717, + 3935, 2975, 3716, + 3934, 2977, 3716, + 3934, 2979, 3715, + 3933, 2981, 3714, + 3932, 2985, 3713, + 3931, 2990, 3712, + 3929, 2996, 3710, + 3927, 3004, 3707, + 3924, 3015, 3703, + 3920, 3028, 3698, + 3914, 3046, 3691, + 3907, 3069, 3682, + 3897, 3098, 3669, + 3883, 3134, 3652, + 3863, 3178, 3627, + 3836, 3231, 3592, + 3797, 3293, 3540, + 3738, 3365, 3460, + 3646, 3446, 3325, + 3483, 3536, 3042, + 3092, 3634, 0, + 0, 3738, 0, + 4073, 3058, 3835, + 4073, 3058, 3835, + 4072, 3058, 3835, + 4072, 3058, 3835, + 4072, 3059, 3834, + 4072, 3059, 3834, + 4072, 3059, 3834, + 4072, 3059, 3834, + 4072, 3060, 3834, + 4072, 3061, 3834, + 4072, 3062, 3834, + 4071, 3063, 3833, + 4071, 3064, 3833, + 4071, 3067, 3832, + 4070, 3070, 3831, + 4069, 3073, 3830, + 4068, 3079, 3828, + 4066, 3085, 3826, + 4064, 3094, 3823, + 4061, 3106, 3820, + 4057, 3121, 3814, + 4051, 3140, 3807, + 4044, 3165, 3798, + 4034, 3196, 3784, + 4020, 3235, 3766, + 4001, 3282, 3741, + 3974, 3338, 3704, + 3935, 3404, 3650, + 3877, 3479, 3565, + 3787, 3563, 3420, + 3627, 3656, 3103, + 3253, 3756, 0, + 4095, 3153, 3955, + 4095, 3153, 3955, + 4095, 3153, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3154, 3955, + 4095, 3155, 3955, + 4095, 3155, 3954, + 4095, 3156, 3954, + 4095, 3157, 3954, + 4095, 3159, 3954, + 4095, 3160, 3953, + 4095, 3163, 3952, + 4095, 3166, 3951, + 4095, 3170, 3950, + 4095, 3176, 3949, + 4095, 3183, 3946, + 4095, 3192, 3943, + 4095, 3205, 3940, + 4095, 3221, 3934, + 4095, 3242, 3927, + 4095, 3269, 3917, + 4095, 3302, 3903, + 4095, 3342, 3885, + 4095, 3392, 3858, + 4095, 3451, 3820, + 4072, 3519, 3764, + 4015, 3596, 3676, + 3925, 3683, 3522, + 3768, 3778, 3173, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3256, 4078, + 4095, 3257, 4078, + 4095, 3257, 4078, + 4095, 3257, 4078, + 4095, 3258, 4078, + 4095, 3259, 4077, + 4095, 3260, 4077, + 4095, 3261, 4077, + 4095, 3263, 4076, + 4095, 3266, 4075, + 4095, 3269, 4075, + 4095, 3274, 4073, + 4095, 3280, 4072, + 4095, 3287, 4069, + 4095, 3297, 4066, + 4095, 3311, 4062, + 4095, 3328, 4057, + 4095, 3350, 4049, + 4095, 3378, 4039, + 4095, 3413, 4025, + 4095, 3455, 4006, + 4095, 3507, 3979, + 4095, 3567, 3940, + 4095, 3638, 3882, + 4095, 3718, 3791, + 4062, 3806, 3631, + 0, 2656, 2925, + 0, 2657, 2925, + 0, 2657, 2925, + 0, 2657, 2925, + 0, 2658, 2924, + 0, 2658, 2924, + 0, 2659, 2923, + 0, 2660, 2923, + 0, 2661, 2921, + 0, 2663, 2920, + 0, 2665, 2918, + 0, 2668, 2915, + 0, 2672, 2911, + 0, 2677, 2906, + 0, 2684, 2899, + 0, 2693, 2890, + 0, 2705, 2878, + 0, 2720, 2860, + 0, 2739, 2835, + 0, 2764, 2800, + 0, 2796, 2749, + 0, 2835, 2669, + 0, 2882, 2534, + 0, 2939, 2253, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2925, + 0, 2657, 2925, + 0, 2658, 2925, + 0, 2658, 2924, + 0, 2659, 2924, + 0, 2660, 2923, + 0, 2661, 2922, + 0, 2663, 2920, + 0, 2665, 2918, + 0, 2668, 2915, + 0, 2672, 2912, + 0, 2677, 2907, + 0, 2684, 2900, + 0, 2693, 2890, + 0, 2705, 2878, + 0, 2720, 2860, + 0, 2739, 2836, + 0, 2765, 2801, + 0, 2796, 2749, + 0, 2835, 2669, + 0, 2882, 2535, + 0, 2939, 2254, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2925, + 0, 2658, 2925, + 0, 2658, 2925, + 0, 2659, 2924, + 0, 2660, 2923, + 0, 2661, 2922, + 0, 2663, 2920, + 0, 2665, 2918, + 0, 2668, 2916, + 0, 2672, 2912, + 0, 2677, 2907, + 0, 2684, 2900, + 0, 2693, 2891, + 0, 2705, 2878, + 0, 2720, 2861, + 0, 2740, 2836, + 0, 2765, 2801, + 0, 2796, 2749, + 0, 2835, 2670, + 0, 2882, 2535, + 0, 2939, 2255, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2657, 2926, + 0, 2658, 2925, + 0, 2658, 2925, + 0, 2659, 2924, + 0, 2660, 2923, + 0, 2661, 2922, + 0, 2663, 2921, + 0, 2665, 2919, + 0, 2668, 2916, + 0, 2672, 2912, + 0, 2677, 2907, + 0, 2684, 2900, + 0, 2693, 2891, + 0, 2705, 2879, + 0, 2720, 2861, + 0, 2740, 2836, + 0, 2765, 2801, + 0, 2796, 2750, + 0, 2835, 2670, + 0, 2882, 2536, + 0, 2939, 2257, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2927, + 0, 2657, 2927, + 0, 2657, 2927, + 0, 2657, 2926, + 0, 2658, 2926, + 0, 2658, 2925, + 0, 2659, 2925, + 0, 2660, 2924, + 0, 2661, 2923, + 0, 2663, 2921, + 0, 2665, 2919, + 0, 2668, 2917, + 0, 2672, 2913, + 0, 2677, 2908, + 0, 2684, 2901, + 0, 2693, 2892, + 0, 2705, 2879, + 0, 2720, 2862, + 0, 2740, 2837, + 0, 2765, 2802, + 0, 2796, 2751, + 0, 2835, 2671, + 0, 2882, 2537, + 0, 2939, 2259, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2928, + 0, 2657, 2927, + 0, 2657, 2927, + 0, 2658, 2927, + 0, 2658, 2927, + 0, 2659, 2926, + 0, 2659, 2926, + 0, 2660, 2925, + 0, 2661, 2924, + 0, 2663, 2922, + 0, 2665, 2920, + 0, 2668, 2917, + 0, 2672, 2914, + 0, 2677, 2909, + 0, 2684, 2902, + 0, 2693, 2893, + 0, 2705, 2880, + 0, 2720, 2862, + 0, 2740, 2838, + 0, 2765, 2803, + 0, 2796, 2752, + 0, 2835, 2673, + 0, 2882, 2539, + 0, 2939, 2262, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2657, 2929, + 0, 2657, 2928, + 0, 2658, 2928, + 0, 2658, 2928, + 0, 2658, 2928, + 0, 2659, 2927, + 0, 2660, 2926, + 0, 2660, 2926, + 0, 2662, 2925, + 0, 2663, 2923, + 0, 2666, 2921, + 0, 2669, 2918, + 0, 2672, 2915, + 0, 2678, 2910, + 0, 2684, 2903, + 0, 2693, 2894, + 0, 2705, 2881, + 0, 2720, 2864, + 0, 2740, 2839, + 0, 2765, 2804, + 0, 2796, 2753, + 0, 2835, 2674, + 0, 2883, 2541, + 0, 2939, 2266, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2658, 2930, + 0, 2658, 2930, + 0, 2658, 2929, + 0, 2658, 2929, + 0, 2659, 2929, + 0, 2659, 2928, + 0, 2660, 2928, + 0, 2661, 2927, + 0, 2662, 2926, + 0, 2664, 2924, + 0, 2666, 2922, + 0, 2669, 2919, + 0, 2673, 2916, + 0, 2678, 2911, + 0, 2685, 2904, + 0, 2694, 2895, + 0, 2706, 2882, + 0, 2721, 2865, + 0, 2740, 2841, + 0, 2765, 2806, + 0, 2797, 2755, + 0, 2836, 2676, + 0, 2883, 2544, + 0, 2939, 2271, + 0, 3005, 0, + 0, 3080, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3358, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2658, 2931, + 0, 2658, 2931, + 0, 2658, 2931, + 0, 2659, 2931, + 0, 2659, 2931, + 0, 2660, 2930, + 0, 2660, 2929, + 0, 2661, 2929, + 0, 2662, 2927, + 0, 2664, 2926, + 0, 2666, 2924, + 0, 2669, 2921, + 0, 2673, 2918, + 0, 2678, 2913, + 0, 2685, 2906, + 0, 2694, 2897, + 0, 2706, 2884, + 0, 2721, 2867, + 0, 2741, 2843, + 0, 2766, 2808, + 0, 2797, 2757, + 0, 2836, 2679, + 0, 2883, 2548, + 0, 2939, 2279, + 0, 3005, 0, + 0, 3081, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3359, 0, + 0, 3465, 0, + 0, 3578, 0, + 0, 3694, 0, + 0, 2659, 2934, + 0, 2659, 2934, + 0, 2659, 2933, + 0, 2659, 2933, + 0, 2660, 2933, + 0, 2660, 2932, + 0, 2661, 2932, + 0, 2662, 2931, + 0, 2663, 2930, + 0, 2665, 2928, + 0, 2667, 2926, + 0, 2670, 2924, + 0, 2674, 2920, + 0, 2679, 2915, + 0, 2686, 2908, + 0, 2695, 2899, + 0, 2706, 2887, + 0, 2722, 2870, + 0, 2741, 2845, + 0, 2766, 2811, + 0, 2797, 2761, + 0, 2836, 2683, + 0, 2883, 2553, + 0, 2940, 2288, + 0, 3006, 0, + 0, 3081, 0, + 0, 3165, 0, + 0, 3258, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2659, 2937, + 0, 2659, 2937, + 0, 2660, 2936, + 0, 2660, 2936, + 0, 2660, 2936, + 0, 2661, 2935, + 0, 2662, 2935, + 0, 2663, 2934, + 0, 2664, 2933, + 0, 2665, 2931, + 0, 2668, 2929, + 0, 2671, 2927, + 0, 2674, 2923, + 0, 2680, 2918, + 0, 2686, 2911, + 0, 2695, 2902, + 0, 2707, 2890, + 0, 2722, 2873, + 0, 2742, 2849, + 0, 2767, 2815, + 0, 2798, 2765, + 0, 2837, 2688, + 0, 2884, 2560, + 0, 2940, 2300, + 0, 3006, 0, + 0, 3081, 0, + 0, 3166, 0, + 0, 3258, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2660, 2941, + 0, 2660, 2941, + 0, 2661, 2940, + 0, 2661, 2940, + 0, 2661, 2940, + 0, 2662, 2939, + 0, 2663, 2939, + 0, 2664, 2938, + 0, 2665, 2937, + 0, 2666, 2935, + 0, 2669, 2933, + 0, 2672, 2931, + 0, 2675, 2927, + 0, 2681, 2922, + 0, 2687, 2916, + 0, 2696, 2907, + 0, 2708, 2894, + 0, 2723, 2877, + 0, 2743, 2854, + 0, 2768, 2820, + 0, 2799, 2771, + 0, 2837, 2695, + 0, 2885, 2569, + 0, 2941, 2316, + 0, 3006, 0, + 0, 3082, 0, + 0, 3166, 0, + 0, 3259, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2662, 2946, + 0, 2662, 2946, + 0, 2662, 2946, + 0, 2662, 2945, + 0, 2663, 2945, + 0, 2663, 2945, + 0, 2664, 2944, + 0, 2665, 2943, + 0, 2666, 2942, + 0, 2668, 2941, + 0, 2670, 2939, + 0, 2673, 2936, + 0, 2677, 2932, + 0, 2682, 2928, + 0, 2689, 2921, + 0, 2698, 2912, + 0, 2709, 2900, + 0, 2724, 2883, + 0, 2744, 2860, + 0, 2769, 2827, + 0, 2800, 2778, + 0, 2838, 2704, + 0, 2885, 2581, + 0, 2941, 2336, + 0, 3007, 938, + 0, 3082, 0, + 0, 3166, 0, + 0, 3259, 0, + 0, 3359, 0, + 0, 3466, 0, + 0, 3578, 0, + 0, 3695, 0, + 0, 2663, 2953, + 0, 2664, 2953, + 0, 2664, 2952, + 0, 2664, 2952, + 0, 2665, 2952, + 0, 2665, 2951, + 0, 2666, 2951, + 0, 2667, 2950, + 0, 2668, 2949, + 0, 2670, 2948, + 0, 2672, 2946, + 0, 2675, 2943, + 0, 2679, 2940, + 0, 2684, 2935, + 0, 2690, 2928, + 0, 2699, 2920, + 0, 2711, 2908, + 0, 2726, 2891, + 0, 2745, 2868, + 0, 2770, 2836, + 0, 2801, 2788, + 0, 2840, 2716, + 0, 2886, 2596, + 0, 2942, 2362, + 0, 3008, 1311, + 0, 3083, 0, + 0, 3167, 0, + 0, 3260, 0, + 0, 3360, 0, + 0, 3466, 0, + 0, 3579, 0, + 0, 3695, 0, + 0, 2666, 2962, + 0, 2666, 2962, + 0, 2666, 2962, + 0, 2667, 2961, + 0, 2667, 2961, + 0, 2667, 2961, + 0, 2668, 2960, + 0, 2669, 2959, + 0, 2670, 2958, + 0, 2672, 2957, + 0, 2674, 2955, + 0, 2677, 2952, + 0, 2681, 2949, + 0, 2686, 2944, + 0, 2693, 2938, + 0, 2701, 2929, + 0, 2713, 2918, + 0, 2728, 2902, + 0, 2747, 2879, + 0, 2772, 2848, + 0, 2803, 2801, + 0, 2841, 2731, + 0, 2888, 2616, + 0, 2944, 2395, + 0, 3009, 1565, + 0, 3084, 0, + 0, 3168, 0, + 0, 3260, 0, + 0, 3360, 0, + 0, 3467, 0, + 0, 3579, 0, + 0, 3695, 0, + 0, 2669, 2974, + 0, 2669, 2974, + 0, 2669, 2973, + 0, 2670, 2973, + 0, 2670, 2973, + 0, 2671, 2972, + 0, 2671, 2972, + 0, 2672, 2971, + 0, 2673, 2970, + 0, 2675, 2969, + 0, 2677, 2967, + 0, 2680, 2964, + 0, 2684, 2961, + 0, 2689, 2957, + 0, 2696, 2950, + 0, 2704, 2942, + 0, 2716, 2931, + 0, 2731, 2915, + 0, 2750, 2894, + 0, 2774, 2863, + 0, 2805, 2818, + 0, 2843, 2751, + 0, 2890, 2641, + 0, 2945, 2435, + 0, 3010, 1770, + 0, 3085, 0, + 0, 3169, 0, + 0, 3261, 0, + 0, 3361, 0, + 0, 3467, 0, + 0, 3579, 0, + 0, 3696, 0, + 0, 2673, 2989, + 0, 2673, 2989, + 0, 2674, 2989, + 0, 2674, 2989, + 0, 2674, 2988, + 0, 2675, 2988, + 0, 2676, 2987, + 0, 2676, 2987, + 0, 2678, 2986, + 0, 2679, 2984, + 0, 2681, 2982, + 0, 2684, 2980, + 0, 2688, 2977, + 0, 2693, 2973, + 0, 2700, 2967, + 0, 2708, 2959, + 0, 2720, 2948, + 0, 2735, 2933, + 0, 2754, 2912, + 0, 2778, 2882, + 0, 2808, 2840, + 0, 2846, 2775, + 0, 2893, 2672, + 0, 2948, 2483, + 0, 3013, 1950, + 0, 3087, 0, + 0, 3170, 0, + 0, 3262, 0, + 0, 3362, 0, + 0, 3468, 0, + 0, 3580, 0, + 0, 3696, 0, + 0, 2679, 3009, + 0, 2679, 3009, + 0, 2679, 3009, + 0, 2680, 3008, + 0, 2680, 3008, + 0, 2680, 3008, + 0, 2681, 3007, + 0, 2682, 3007, + 0, 2683, 3006, + 0, 2685, 3004, + 0, 2687, 3003, + 0, 2690, 3000, + 0, 2693, 2997, + 0, 2698, 2993, + 0, 2705, 2987, + 0, 2714, 2980, + 0, 2725, 2969, + 0, 2739, 2955, + 0, 2758, 2935, + 0, 2782, 2907, + 0, 2813, 2867, + 0, 2850, 2807, + 0, 2896, 2711, + 0, 2951, 2541, + 0, 3015, 2115, + 0, 3089, 0, + 0, 3172, 0, + 0, 3264, 0, + 0, 3363, 0, + 0, 3469, 0, + 0, 3581, 0, + 0, 3697, 0, + 1182, 2686, 3034, + 1173, 2686, 3034, + 1160, 2687, 3034, + 1143, 2687, 3034, + 1119, 2687, 3033, + 1084, 2688, 3033, + 1033, 2688, 3033, + 955, 2689, 3032, + 824, 2691, 3031, + 554, 2692, 3030, + 0, 2694, 3028, + 0, 2697, 3026, + 0, 2701, 3023, + 0, 2706, 3019, + 0, 2712, 3014, + 0, 2720, 3007, + 0, 2731, 2997, + 0, 2746, 2983, + 0, 2764, 2965, + 0, 2788, 2939, + 0, 2818, 2901, + 0, 2855, 2846, + 0, 2901, 2759, + 0, 2955, 2608, + 0, 3019, 2271, + 0, 3092, 0, + 0, 3175, 0, + 0, 3266, 0, + 0, 3365, 0, + 0, 3470, 0, + 0, 3582, 0, + 0, 3697, 0, + 2191, 2696, 3066, + 2190, 2696, 3066, + 2189, 2696, 3066, + 2187, 2697, 3065, + 2185, 2697, 3065, + 2182, 2698, 3065, + 2177, 2698, 3064, + 2172, 2699, 3064, + 2164, 2700, 3063, + 2153, 2702, 3062, + 2138, 2704, 3060, + 2117, 2706, 3058, + 2088, 2710, 3055, + 2046, 2715, 3052, + 1983, 2721, 3047, + 1881, 2729, 3040, + 1696, 2740, 3031, + 1189, 2754, 3019, + 0, 2773, 3001, + 0, 2796, 2977, + 0, 2825, 2943, + 0, 2862, 2893, + 0, 2907, 2815, + 0, 2960, 2685, + 0, 3023, 2419, + 0, 3096, 0, + 0, 3178, 0, + 0, 3269, 0, + 0, 3367, 0, + 0, 3472, 0, + 0, 3583, 0, + 0, 3699, 0, + 2548, 2709, 3105, + 2548, 2709, 3105, + 2547, 2709, 3105, + 2546, 2709, 3105, + 2545, 2710, 3104, + 2544, 2710, 3104, + 2542, 2711, 3104, + 2539, 2712, 3103, + 2536, 2713, 3102, + 2531, 2714, 3101, + 2524, 2716, 3100, + 2516, 2719, 3098, + 2504, 2722, 3095, + 2487, 2727, 3092, + 2464, 2733, 3088, + 2432, 2741, 3082, + 2384, 2752, 3073, + 2311, 2766, 3062, + 2191, 2783, 3046, + 1956, 2806, 3025, + 876, 2835, 2994, + 0, 2871, 2949, + 0, 2915, 2881, + 0, 2967, 2771, + 0, 3030, 2564, + 0, 3101, 1888, + 0, 3182, 0, + 0, 3272, 0, + 0, 3370, 0, + 0, 3474, 0, + 0, 3585, 0, + 0, 3700, 0, + 2796, 2725, 3153, + 2796, 2725, 3152, + 2796, 2725, 3152, + 2795, 2726, 3152, + 2795, 2726, 3152, + 2794, 2726, 3152, + 2793, 2727, 3151, + 2791, 2728, 3151, + 2789, 2729, 3150, + 2787, 2730, 3149, + 2783, 2732, 3148, + 2778, 2735, 3146, + 2771, 2738, 3144, + 2762, 2743, 3141, + 2750, 2749, 3137, + 2733, 2756, 3131, + 2709, 2767, 3124, + 2675, 2780, 3114, + 2625, 2797, 3100, + 2548, 2819, 3081, + 2419, 2847, 3054, + 2157, 2882, 3015, + 0, 2925, 2957, + 0, 2977, 2865, + 0, 3038, 2704, + 0, 3108, 2323, + 0, 3188, 0, + 0, 3277, 0, + 0, 3374, 0, + 0, 3478, 0, + 0, 3587, 0, + 0, 3702, 0, + 2999, 2746, 3209, + 2999, 2746, 3209, + 2999, 2746, 3209, + 2999, 2747, 3209, + 2998, 2747, 3209, + 2998, 2747, 3209, + 2997, 2748, 3208, + 2996, 2749, 3208, + 2995, 2750, 3207, + 2993, 2751, 3206, + 2991, 2753, 3205, + 2988, 2755, 3204, + 2984, 2759, 3202, + 2978, 2763, 3199, + 2970, 2769, 3196, + 2960, 2776, 3191, + 2945, 2786, 3184, + 2925, 2799, 3175, + 2897, 2815, 3163, + 2857, 2837, 3147, + 2796, 2864, 3123, + 2699, 2897, 3090, + 2527, 2939, 3041, + 2089, 2989, 2967, + 0, 3048, 2843, + 0, 3118, 2597, + 0, 3196, 1111, + 0, 3283, 0, + 0, 3379, 0, + 0, 3482, 0, + 0, 3590, 0, + 0, 3704, 0, + 3178, 2773, 3276, + 3178, 2773, 3275, + 3178, 2773, 3275, + 3178, 2773, 3275, + 3177, 2774, 3275, + 3177, 2774, 3275, + 3177, 2775, 3275, + 3176, 2775, 3274, + 3175, 2776, 3274, + 3174, 2778, 3273, + 3172, 2779, 3272, + 3170, 2782, 3271, + 3167, 2785, 3269, + 3164, 2789, 3267, + 3159, 2794, 3264, + 3152, 2801, 3260, + 3142, 2811, 3254, + 3130, 2823, 3246, + 3112, 2838, 3236, + 3087, 2859, 3222, + 3051, 2884, 3202, + 2999, 2917, 3174, + 2918, 2956, 3134, + 2780, 3005, 3074, + 2488, 3062, 2980, + 0, 3130, 2811, + 0, 3206, 2395, + 0, 3292, 0, + 0, 3386, 0, + 0, 3487, 0, + 0, 3595, 0, + 0, 3708, 0, + 3342, 2806, 3351, + 3342, 2806, 3351, + 3342, 2807, 3351, + 3342, 2807, 3351, + 3342, 2807, 3351, + 3341, 2807, 3351, + 3341, 2808, 3350, + 3341, 2809, 3350, + 3340, 2810, 3350, + 3339, 2811, 3349, + 3338, 2812, 3348, + 3337, 2814, 3347, + 3335, 2817, 3346, + 3332, 2821, 3344, + 3329, 2826, 3341, + 3324, 2833, 3338, + 3318, 2841, 3333, + 3309, 2853, 3327, + 3297, 2867, 3318, + 3281, 2886, 3306, + 3258, 2911, 3290, + 3225, 2941, 3267, + 3177, 2979, 3235, + 3105, 3025, 3187, + 2985, 3080, 3115, + 2750, 3145, 2997, + 1687, 3219, 2766, + 0, 3303, 1775, + 0, 3395, 0, + 0, 3494, 0, + 0, 3600, 0, + 0, 3712, 0, + 3497, 2847, 3436, + 3497, 2848, 3436, + 3497, 2848, 3436, + 3497, 2848, 3436, + 3496, 2848, 3436, + 3496, 2849, 3436, + 3496, 2849, 3436, + 3496, 2850, 3435, + 3495, 2850, 3435, + 3495, 2852, 3434, + 3494, 2853, 3434, + 3493, 2855, 3433, + 3492, 2858, 3432, + 3490, 2861, 3430, + 3487, 2866, 3428, + 3484, 2872, 3425, + 3479, 2880, 3421, + 3473, 2890, 3416, + 3465, 2904, 3409, + 3454, 2921, 3399, + 3438, 2944, 3386, + 3417, 2972, 3368, + 3386, 3008, 3342, + 3341, 3051, 3305, + 3274, 3103, 3250, + 3165, 3165, 3165, + 2960, 3236, 3019, + 2308, 3317, 2696, + 0, 3406, 0, + 0, 3504, 0, + 0, 3608, 0, + 0, 3718, 0, + 3645, 2897, 3529, + 3645, 2897, 3529, + 3645, 2898, 3529, + 3645, 2898, 3529, + 3645, 2898, 3529, + 3645, 2898, 3529, + 3644, 2899, 3529, + 3644, 2899, 3529, + 3644, 2900, 3528, + 3644, 2901, 3528, + 3643, 2902, 3527, + 3642, 2904, 3527, + 3641, 2906, 3526, + 3640, 2909, 3524, + 3638, 2914, 3523, + 3636, 2919, 3520, + 3633, 2926, 3517, + 3628, 2936, 3513, + 3622, 2948, 3507, + 3614, 2964, 3500, + 3604, 2984, 3489, + 3589, 3011, 3474, + 3568, 3043, 3454, + 3539, 3084, 3426, + 3496, 3132, 3384, + 3432, 3191, 3322, + 3330, 3258, 3224, + 3143, 3335, 3046, + 2623, 3421, 2582, + 0, 3516, 0, + 0, 3618, 0, + 0, 3726, 0, + 3789, 2956, 3630, + 3789, 2956, 3630, + 3789, 2957, 3630, + 3789, 2957, 3630, + 3789, 2957, 3630, + 3789, 2957, 3630, + 3788, 2958, 3630, + 3788, 2958, 3630, + 3788, 2959, 3629, + 3788, 2960, 3629, + 3787, 2961, 3629, + 3787, 2962, 3628, + 3786, 2964, 3627, + 3785, 2967, 3626, + 3784, 2971, 3625, + 3782, 2976, 3623, + 3780, 2982, 3620, + 3777, 2990, 3617, + 3772, 3001, 3613, + 3767, 3015, 3606, + 3759, 3034, 3598, + 3748, 3057, 3587, + 3734, 3087, 3571, + 3714, 3124, 3549, + 3685, 3169, 3518, + 3644, 3222, 3473, + 3583, 3286, 3404, + 3485, 3359, 3292, + 3309, 3441, 3081, + 2855, 3532, 2365, + 0, 3630, 0, + 0, 3736, 0, + 3929, 3025, 3737, + 3929, 3025, 3737, + 3929, 3025, 3737, + 3929, 3025, 3737, + 3929, 3026, 3737, + 3929, 3026, 3737, + 3929, 3026, 3737, + 3929, 3026, 3737, + 3929, 3027, 3737, + 3929, 3028, 3736, + 3928, 3029, 3736, + 3928, 3030, 3736, + 3927, 3032, 3735, + 3927, 3034, 3734, + 3926, 3037, 3733, + 3925, 3042, 3732, + 3923, 3047, 3730, + 3921, 3054, 3727, + 3918, 3064, 3723, + 3913, 3076, 3719, + 3908, 3092, 3712, + 3900, 3113, 3703, + 3890, 3139, 3691, + 3876, 3172, 3674, + 3856, 3213, 3651, + 3828, 3262, 3618, + 3788, 3320, 3569, + 3728, 3388, 3494, + 3634, 3466, 3370, + 3465, 3552, 3123, + 3050, 3647, 1588, + 0, 3749, 0, + 4068, 3103, 3850, + 4068, 3103, 3850, + 4068, 3103, 3850, + 4068, 3103, 3850, + 4068, 3104, 3850, + 4068, 3104, 3850, + 4068, 3104, 3850, + 4068, 3104, 3849, + 4067, 3105, 3849, + 4067, 3105, 3849, + 4067, 3106, 3849, + 4067, 3107, 3849, + 4066, 3109, 3848, + 4066, 3111, 3847, + 4065, 3114, 3847, + 4064, 3117, 3845, + 4063, 3122, 3844, + 4061, 3128, 3842, + 4059, 3136, 3839, + 4056, 3147, 3835, + 4052, 3160, 3830, + 4046, 3178, 3823, + 4039, 3201, 3814, + 4029, 3230, 3801, + 4015, 3266, 3784, + 3995, 3310, 3759, + 3968, 3363, 3724, + 3929, 3425, 3672, + 3870, 3497, 3592, + 3778, 3578, 3457, + 3615, 3668, 3174, + 3224, 3766, 0, + 4095, 3190, 3967, + 4095, 3190, 3967, + 4095, 3190, 3967, + 4095, 3190, 3967, + 4095, 3191, 3967, + 4095, 3191, 3967, + 4095, 3191, 3967, + 4095, 3191, 3966, + 4095, 3192, 3966, + 4095, 3192, 3966, + 4095, 3193, 3966, + 4095, 3194, 3966, + 4095, 3195, 3965, + 4095, 3197, 3965, + 4095, 3199, 3964, + 4095, 3202, 3963, + 4095, 3206, 3962, + 4095, 3211, 3961, + 4095, 3217, 3958, + 4095, 3226, 3956, + 4095, 3238, 3952, + 4095, 3253, 3946, + 4095, 3273, 3939, + 4095, 3297, 3930, + 4095, 3328, 3917, + 4095, 3367, 3898, + 4095, 3414, 3873, + 4095, 3470, 3836, + 4067, 3536, 3782, + 4009, 3611, 3697, + 3919, 3695, 3552, + 3759, 3788, 3235, + 4095, 3285, 4087, + 4095, 3285, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3286, 4087, + 4095, 3287, 4087, + 4095, 3287, 4087, + 4095, 3288, 4087, + 4095, 3288, 4086, + 4095, 3289, 4086, + 4095, 3291, 4086, + 4095, 3292, 4085, + 4095, 3295, 4084, + 4095, 3298, 4084, + 4095, 3302, 4082, + 4095, 3308, 4081, + 4095, 3315, 4079, + 4095, 3325, 4076, + 4095, 3337, 4072, + 4095, 3353, 4066, + 4095, 3374, 4059, + 4095, 3401, 4049, + 4095, 3434, 4036, + 4095, 3475, 4017, + 4095, 3524, 3990, + 4095, 3583, 3952, + 4095, 3651, 3896, + 4095, 3729, 3808, + 4057, 3815, 3655, + 0, 2788, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2790, 3056, + 0, 2790, 3056, + 0, 2791, 3055, + 0, 2792, 3054, + 0, 2793, 3053, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3047, + 0, 2804, 3043, + 0, 2809, 3038, + 0, 2816, 3031, + 0, 2825, 3022, + 0, 2837, 3009, + 0, 2852, 2992, + 0, 2872, 2967, + 0, 2897, 2932, + 0, 2928, 2880, + 0, 2967, 2801, + 0, 3014, 2666, + 0, 3071, 2384, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2788, 3058, + 0, 2789, 3058, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2790, 3057, + 0, 2790, 3056, + 0, 2791, 3055, + 0, 2792, 3055, + 0, 2793, 3053, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3047, + 0, 2804, 3043, + 0, 2809, 3038, + 0, 2816, 3032, + 0, 2825, 3022, + 0, 2837, 3010, + 0, 2852, 2992, + 0, 2872, 2967, + 0, 2897, 2932, + 0, 2928, 2881, + 0, 2967, 2801, + 0, 3014, 2666, + 0, 3071, 2385, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2788, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3057, + 0, 2789, 3057, + 0, 2790, 3057, + 0, 2790, 3056, + 0, 2791, 3056, + 0, 2792, 3055, + 0, 2793, 3054, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3047, + 0, 2804, 3044, + 0, 2809, 3039, + 0, 2816, 3032, + 0, 2825, 3023, + 0, 2837, 3010, + 0, 2852, 2992, + 0, 2872, 2968, + 0, 2897, 2933, + 0, 2928, 2881, + 0, 2967, 2801, + 0, 3014, 2667, + 0, 3071, 2386, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3057, + 0, 2790, 3057, + 0, 2790, 3057, + 0, 2791, 3056, + 0, 2792, 3055, + 0, 2793, 3054, + 0, 2795, 3052, + 0, 2797, 3050, + 0, 2800, 3048, + 0, 2804, 3044, + 0, 2809, 3039, + 0, 2816, 3032, + 0, 2825, 3023, + 0, 2837, 3010, + 0, 2852, 2993, + 0, 2872, 2968, + 0, 2897, 2933, + 0, 2928, 2881, + 0, 2967, 2802, + 0, 3014, 2667, + 0, 3071, 2387, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3059, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2789, 3058, + 0, 2790, 3058, + 0, 2790, 3057, + 0, 2791, 3056, + 0, 2792, 3056, + 0, 2793, 3054, + 0, 2795, 3053, + 0, 2797, 3051, + 0, 2800, 3048, + 0, 2804, 3044, + 0, 2809, 3039, + 0, 2816, 3033, + 0, 2825, 3023, + 0, 2837, 3011, + 0, 2852, 2993, + 0, 2872, 2969, + 0, 2897, 2934, + 0, 2928, 2882, + 0, 2967, 2802, + 0, 3014, 2668, + 0, 3071, 2389, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3059, + 0, 2789, 3059, + 0, 2789, 3059, + 0, 2789, 3059, + 0, 2790, 3058, + 0, 2790, 3058, + 0, 2791, 3058, + 0, 2791, 3057, + 0, 2792, 3056, + 0, 2793, 3055, + 0, 2795, 3053, + 0, 2797, 3051, + 0, 2800, 3049, + 0, 2804, 3045, + 0, 2809, 3040, + 0, 2816, 3033, + 0, 2825, 3024, + 0, 2837, 3011, + 0, 2852, 2994, + 0, 2872, 2969, + 0, 2897, 2934, + 0, 2928, 2883, + 0, 2967, 2803, + 0, 3014, 2670, + 0, 3071, 2391, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3060, + 0, 2789, 3060, + 0, 2789, 3060, + 0, 2789, 3059, + 0, 2790, 3059, + 0, 2790, 3059, + 0, 2791, 3058, + 0, 2791, 3058, + 0, 2792, 3057, + 0, 2794, 3056, + 0, 2795, 3054, + 0, 2797, 3052, + 0, 2800, 3049, + 0, 2804, 3046, + 0, 2810, 3041, + 0, 2816, 3034, + 0, 2825, 3025, + 0, 2837, 3012, + 0, 2852, 2995, + 0, 2872, 2970, + 0, 2897, 2935, + 0, 2928, 2884, + 0, 2967, 2805, + 0, 3015, 2671, + 0, 3071, 2394, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3490, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2789, 3061, + 0, 2789, 3061, + 0, 2789, 3061, + 0, 2790, 3060, + 0, 2790, 3060, + 0, 2790, 3060, + 0, 2791, 3059, + 0, 2792, 3059, + 0, 2793, 3058, + 0, 2794, 3057, + 0, 2795, 3055, + 0, 2798, 3053, + 0, 2801, 3050, + 0, 2805, 3047, + 0, 2810, 3042, + 0, 2817, 3035, + 0, 2826, 3026, + 0, 2837, 3013, + 0, 2853, 2996, + 0, 2872, 2971, + 0, 2897, 2936, + 0, 2929, 2885, + 0, 2967, 2806, + 0, 3015, 2673, + 0, 3071, 2398, + 0, 3137, 0, + 0, 3212, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3597, 0, + 0, 3710, 0, + 0, 2790, 3062, + 0, 2790, 3062, + 0, 2790, 3062, + 0, 2790, 3062, + 0, 2790, 3061, + 0, 2791, 3061, + 0, 2791, 3060, + 0, 2792, 3060, + 0, 2793, 3059, + 0, 2794, 3058, + 0, 2796, 3056, + 0, 2798, 3054, + 0, 2801, 3052, + 0, 2805, 3048, + 0, 2810, 3043, + 0, 2817, 3036, + 0, 2826, 3027, + 0, 2838, 3014, + 0, 2853, 2997, + 0, 2872, 2973, + 0, 2897, 2938, + 0, 2929, 2887, + 0, 2968, 2809, + 0, 3015, 2676, + 0, 3071, 2404, + 0, 3137, 0, + 0, 3213, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2790, 3064, + 0, 2790, 3064, + 0, 2790, 3063, + 0, 2790, 3063, + 0, 2791, 3063, + 0, 2791, 3063, + 0, 2792, 3062, + 0, 2792, 3062, + 0, 2793, 3061, + 0, 2795, 3060, + 0, 2796, 3058, + 0, 2798, 3056, + 0, 2801, 3053, + 0, 2805, 3050, + 0, 2810, 3045, + 0, 2817, 3038, + 0, 2826, 3029, + 0, 2838, 3016, + 0, 2853, 2999, + 0, 2873, 2975, + 0, 2898, 2940, + 0, 2929, 2890, + 0, 2968, 2811, + 0, 3015, 2680, + 0, 3072, 2411, + 0, 3137, 0, + 0, 3213, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2791, 3066, + 0, 2791, 3066, + 0, 2791, 3066, + 0, 2791, 3065, + 0, 2791, 3065, + 0, 2792, 3065, + 0, 2792, 3064, + 0, 2793, 3064, + 0, 2794, 3063, + 0, 2795, 3062, + 0, 2797, 3060, + 0, 2799, 3058, + 0, 2802, 3056, + 0, 2806, 3052, + 0, 2811, 3047, + 0, 2818, 3040, + 0, 2827, 3031, + 0, 2838, 3019, + 0, 2854, 3002, + 0, 2873, 2978, + 0, 2898, 2943, + 0, 2930, 2893, + 0, 2968, 2815, + 0, 3016, 2685, + 0, 3072, 2420, + 0, 3138, 0, + 0, 3213, 0, + 0, 3297, 0, + 0, 3390, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2791, 3069, + 0, 2791, 3069, + 0, 2792, 3069, + 0, 2792, 3068, + 0, 2792, 3068, + 0, 2792, 3068, + 0, 2793, 3067, + 0, 2794, 3067, + 0, 2795, 3066, + 0, 2796, 3065, + 0, 2798, 3063, + 0, 2800, 3061, + 0, 2803, 3059, + 0, 2807, 3055, + 0, 2812, 3050, + 0, 2819, 3043, + 0, 2827, 3034, + 0, 2839, 3022, + 0, 2854, 3005, + 0, 2874, 2981, + 0, 2899, 2947, + 0, 2930, 2897, + 0, 2969, 2821, + 0, 3016, 2692, + 0, 3072, 2432, + 0, 3138, 0, + 0, 3213, 0, + 0, 3298, 0, + 0, 3391, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2792, 3073, + 0, 2792, 3073, + 0, 2793, 3073, + 0, 2793, 3072, + 0, 2793, 3072, + 0, 2793, 3072, + 0, 2794, 3071, + 0, 2795, 3071, + 0, 2796, 3070, + 0, 2797, 3069, + 0, 2799, 3067, + 0, 2801, 3065, + 0, 2804, 3063, + 0, 2808, 3059, + 0, 2813, 3054, + 0, 2819, 3048, + 0, 2828, 3039, + 0, 2840, 3026, + 0, 2855, 3010, + 0, 2875, 2986, + 0, 2900, 2952, + 0, 2931, 2903, + 0, 2970, 2827, + 0, 3017, 2701, + 0, 3073, 2448, + 0, 3138, 0, + 0, 3214, 0, + 0, 3298, 0, + 0, 3391, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2794, 3078, + 0, 2794, 3078, + 0, 2794, 3078, + 0, 2794, 3078, + 0, 2794, 3077, + 0, 2795, 3077, + 0, 2795, 3077, + 0, 2796, 3076, + 0, 2797, 3075, + 0, 2798, 3074, + 0, 2800, 3073, + 0, 2802, 3071, + 0, 2805, 3068, + 0, 2809, 3064, + 0, 2814, 3060, + 0, 2821, 3053, + 0, 2830, 3044, + 0, 2841, 3032, + 0, 2856, 3016, + 0, 2876, 2992, + 0, 2901, 2959, + 0, 2932, 2911, + 0, 2970, 2836, + 0, 3017, 2713, + 0, 3074, 2468, + 0, 3139, 1070, + 0, 3214, 0, + 0, 3298, 0, + 0, 3391, 0, + 0, 3491, 0, + 0, 3598, 0, + 0, 3710, 0, + 0, 2795, 3085, + 0, 2796, 3085, + 0, 2796, 3085, + 0, 2796, 3085, + 0, 2796, 3084, + 0, 2797, 3084, + 0, 2797, 3084, + 0, 2798, 3083, + 0, 2799, 3082, + 0, 2800, 3081, + 0, 2802, 3080, + 0, 2804, 3078, + 0, 2807, 3075, + 0, 2811, 3072, + 0, 2816, 3067, + 0, 2822, 3060, + 0, 2831, 3052, + 0, 2843, 3040, + 0, 2858, 3023, + 0, 2877, 3001, + 0, 2902, 2968, + 0, 2933, 2920, + 0, 2972, 2848, + 0, 3019, 2728, + 0, 3075, 2494, + 0, 3140, 1443, + 0, 3215, 0, + 0, 3299, 0, + 0, 3392, 0, + 0, 3492, 0, + 0, 3599, 0, + 0, 3711, 0, + 0, 2798, 3094, + 0, 2798, 3094, + 0, 2798, 3094, + 0, 2798, 3094, + 0, 2799, 3093, + 0, 2799, 3093, + 0, 2800, 3093, + 0, 2800, 3092, + 0, 2801, 3091, + 0, 2802, 3090, + 0, 2804, 3089, + 0, 2806, 3087, + 0, 2809, 3084, + 0, 2813, 3081, + 0, 2818, 3076, + 0, 2825, 3070, + 0, 2834, 3062, + 0, 2845, 3050, + 0, 2860, 3034, + 0, 2879, 3011, + 0, 2904, 2980, + 0, 2935, 2933, + 0, 2973, 2863, + 0, 3020, 2748, + 0, 3076, 2527, + 0, 3141, 1697, + 0, 3216, 0, + 0, 3300, 0, + 0, 3392, 0, + 0, 3492, 0, + 0, 3599, 0, + 0, 3711, 0, + 0, 2801, 3106, + 0, 2801, 3106, + 0, 2801, 3106, + 0, 2802, 3106, + 0, 2802, 3105, + 0, 2802, 3105, + 0, 2803, 3105, + 0, 2803, 3104, + 0, 2804, 3103, + 0, 2806, 3102, + 0, 2807, 3101, + 0, 2809, 3099, + 0, 2812, 3096, + 0, 2816, 3093, + 0, 2821, 3089, + 0, 2828, 3083, + 0, 2837, 3074, + 0, 2848, 3063, + 0, 2863, 3047, + 0, 2882, 3026, + 0, 2907, 2995, + 0, 2937, 2950, + 0, 2976, 2883, + 0, 3022, 2773, + 0, 3078, 2567, + 0, 3143, 1902, + 0, 3217, 0, + 0, 3301, 0, + 0, 3393, 0, + 0, 3493, 0, + 0, 3599, 0, + 0, 3711, 0, + 0, 2805, 3121, + 0, 2805, 3121, + 0, 2806, 3121, + 0, 2806, 3121, + 0, 2806, 3121, + 0, 2806, 3120, + 0, 2807, 3120, + 0, 2808, 3119, + 0, 2809, 3119, + 0, 2810, 3118, + 0, 2811, 3116, + 0, 2814, 3115, + 0, 2816, 3112, + 0, 2820, 3109, + 0, 2825, 3105, + 0, 2832, 3099, + 0, 2840, 3091, + 0, 2852, 3080, + 0, 2867, 3065, + 0, 2886, 3044, + 0, 2910, 3014, + 0, 2940, 2972, + 0, 2978, 2908, + 0, 3025, 2805, + 0, 3080, 2615, + 0, 3145, 2083, + 0, 3219, 0, + 0, 3302, 0, + 0, 3394, 0, + 0, 3494, 0, + 0, 3600, 0, + 0, 3712, 0, + 0, 2811, 3141, + 0, 2811, 3141, + 0, 2811, 3141, + 0, 2811, 3141, + 0, 2812, 3141, + 0, 2812, 3140, + 0, 2813, 3140, + 0, 2813, 3139, + 0, 2814, 3139, + 0, 2815, 3138, + 0, 2817, 3136, + 0, 2819, 3135, + 0, 2822, 3132, + 0, 2826, 3129, + 0, 2831, 3125, + 0, 2837, 3120, + 0, 2846, 3112, + 0, 2857, 3101, + 0, 2872, 3087, + 0, 2890, 3067, + 0, 2914, 3039, + 0, 2945, 2999, + 0, 2982, 2939, + 0, 3028, 2843, + 0, 3083, 2673, + 0, 3147, 2248, + 0, 3221, 0, + 0, 3304, 0, + 0, 3396, 0, + 0, 3495, 0, + 0, 3601, 0, + 0, 3713, 0, + 1321, 2818, 3166, + 1314, 2818, 3166, + 1305, 2819, 3166, + 1292, 2819, 3166, + 1275, 2819, 3166, + 1251, 2819, 3165, + 1216, 2820, 3165, + 1165, 2821, 3165, + 1087, 2821, 3164, + 956, 2823, 3163, + 686, 2824, 3162, + 0, 2826, 3160, + 0, 2829, 3158, + 0, 2833, 3155, + 0, 2838, 3151, + 0, 2844, 3146, + 0, 2853, 3139, + 0, 2864, 3129, + 0, 2878, 3115, + 0, 2897, 3097, + 0, 2920, 3071, + 0, 2950, 3033, + 0, 2987, 2978, + 0, 3033, 2891, + 0, 3087, 2740, + 0, 3151, 2403, + 0, 3224, 0, + 0, 3307, 0, + 0, 3398, 0, + 0, 3497, 0, + 0, 3603, 0, + 0, 3714, 0, + 2324, 2828, 3198, + 2323, 2828, 3198, + 2322, 2828, 3198, + 2321, 2828, 3198, + 2319, 2829, 3197, + 2317, 2829, 3197, + 2314, 2830, 3197, + 2309, 2830, 3196, + 2304, 2831, 3196, + 2296, 2832, 3195, + 2285, 2834, 3194, + 2270, 2836, 3192, + 2249, 2839, 3190, + 2220, 2842, 3188, + 2178, 2847, 3184, + 2115, 2853, 3179, + 2013, 2862, 3172, + 1828, 2872, 3163, + 1321, 2887, 3151, + 0, 2905, 3134, + 0, 2928, 3109, + 0, 2957, 3075, + 0, 2994, 3025, + 0, 3039, 2947, + 0, 3092, 2817, + 0, 3156, 2552, + 0, 3228, 0, + 0, 3310, 0, + 0, 3401, 0, + 0, 3499, 0, + 0, 3604, 0, + 0, 3715, 0, + 2680, 2841, 3237, + 2680, 2841, 3237, + 2680, 2841, 3237, + 2679, 2841, 3237, + 2678, 2841, 3237, + 2677, 2842, 3236, + 2676, 2842, 3236, + 2674, 2843, 3236, + 2671, 2844, 3235, + 2668, 2845, 3234, + 2663, 2846, 3233, + 2657, 2848, 3232, + 2648, 2851, 3230, + 2636, 2854, 3228, + 2620, 2859, 3224, + 2597, 2865, 3220, + 2564, 2873, 3214, + 2516, 2884, 3205, + 2444, 2898, 3194, + 2324, 2915, 3178, + 2088, 2938, 3157, + 1008, 2967, 3126, + 0, 3003, 3081, + 0, 3047, 3013, + 0, 3100, 2903, + 0, 3162, 2696, + 0, 3233, 2020, + 0, 3315, 0, + 0, 3404, 0, + 0, 3502, 0, + 0, 3607, 0, + 0, 3717, 0, + 2929, 2857, 3285, + 2929, 2857, 3285, + 2928, 2857, 3285, + 2928, 2858, 3284, + 2927, 2858, 3284, + 2927, 2858, 3284, + 2926, 2859, 3284, + 2925, 2859, 3283, + 2923, 2860, 3283, + 2921, 2861, 3282, + 2919, 2863, 3281, + 2915, 2864, 3280, + 2910, 2867, 3278, + 2903, 2870, 3276, + 2894, 2875, 3273, + 2882, 2881, 3269, + 2865, 2889, 3264, + 2841, 2899, 3256, + 2807, 2912, 3246, + 2757, 2929, 3232, + 2680, 2952, 3213, + 2551, 2980, 3186, + 2289, 3014, 3147, + 0, 3057, 3089, + 0, 3109, 2997, + 0, 3170, 2837, + 0, 3240, 2456, + 0, 3320, 0, + 0, 3409, 0, + 0, 3506, 0, + 0, 3610, 0, + 0, 3719, 0, + 3132, 2878, 3341, + 3132, 2878, 3341, + 3131, 2878, 3341, + 3131, 2879, 3341, + 3131, 2879, 3341, + 3130, 2879, 3341, + 3130, 2880, 3341, + 3129, 2880, 3340, + 3128, 2881, 3340, + 3127, 2882, 3339, + 3125, 2883, 3338, + 3123, 2885, 3337, + 3120, 2888, 3336, + 3116, 2891, 3334, + 3110, 2895, 3331, + 3102, 2901, 3328, + 3092, 2908, 3323, + 3077, 2918, 3316, + 3057, 2931, 3307, + 3029, 2947, 3295, + 2989, 2969, 3279, + 2928, 2996, 3255, + 2832, 3029, 3222, + 2659, 3071, 3173, + 2222, 3121, 3099, + 0, 3181, 2975, + 0, 3250, 2729, + 0, 3328, 1243, + 0, 3415, 0, + 0, 3511, 0, + 0, 3614, 0, + 0, 3723, 0, + 3310, 2905, 3408, + 3310, 2905, 3408, + 3310, 2905, 3408, + 3310, 2905, 3407, + 3310, 2906, 3407, + 3309, 2906, 3407, + 3309, 2906, 3407, + 3309, 2907, 3407, + 3308, 2907, 3406, + 3307, 2908, 3406, + 3306, 2910, 3405, + 3304, 2911, 3404, + 3302, 2914, 3403, + 3300, 2917, 3401, + 3296, 2921, 3399, + 3291, 2926, 3396, + 3284, 2933, 3392, + 3274, 2943, 3386, + 3262, 2955, 3378, + 3244, 2970, 3368, + 3219, 2991, 3354, + 3183, 3016, 3334, + 3131, 3049, 3306, + 3050, 3089, 3266, + 2912, 3137, 3207, + 2620, 3195, 3112, + 0, 3262, 2944, + 0, 3338, 2528, + 0, 3424, 0, + 0, 3518, 0, + 0, 3619, 0, + 0, 3727, 0, + 3474, 2938, 3483, + 3474, 2938, 3483, + 3474, 2939, 3483, + 3474, 2939, 3483, + 3474, 2939, 3483, + 3474, 2939, 3483, + 3474, 2940, 3483, + 3473, 2940, 3483, + 3473, 2941, 3482, + 3472, 2942, 3482, + 3471, 2943, 3481, + 3470, 2944, 3480, + 3469, 2947, 3479, + 3467, 2949, 3478, + 3464, 2953, 3476, + 3461, 2958, 3473, + 3456, 2965, 3470, + 3450, 2973, 3465, + 3441, 2985, 3459, + 3429, 3000, 3450, + 3413, 3019, 3438, + 3390, 3043, 3422, + 3357, 3073, 3399, + 3310, 3111, 3367, + 3237, 3157, 3320, + 3117, 3213, 3248, + 2883, 3277, 3129, + 1820, 3351, 2898, + 0, 3435, 1907, + 0, 3527, 0, + 0, 3626, 0, + 0, 3732, 0, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3629, 2980, 3568, + 3628, 2981, 3568, + 3628, 2981, 3568, + 3628, 2982, 3567, + 3627, 2983, 3567, + 3627, 2984, 3566, + 3626, 2985, 3566, + 3625, 2987, 3565, + 3624, 2990, 3564, + 3622, 2993, 3562, + 3619, 2998, 3560, + 3616, 3004, 3557, + 3612, 3012, 3553, + 3605, 3022, 3548, + 3597, 3036, 3541, + 3586, 3053, 3531, + 3570, 3076, 3518, + 3549, 3104, 3500, + 3518, 3140, 3474, + 3474, 3183, 3437, + 3406, 3235, 3382, + 3297, 3297, 3297, + 3092, 3368, 3151, + 2441, 3449, 2828, + 0, 3538, 0, + 0, 3636, 0, + 0, 3740, 0, + 3777, 3029, 3662, + 3777, 3029, 3662, + 3777, 3030, 3662, + 3777, 3030, 3661, + 3777, 3030, 3661, + 3777, 3030, 3661, + 3777, 3030, 3661, + 3777, 3031, 3661, + 3776, 3031, 3661, + 3776, 3032, 3660, + 3776, 3033, 3660, + 3775, 3034, 3660, + 3774, 3036, 3659, + 3773, 3038, 3658, + 3772, 3042, 3657, + 3770, 3046, 3655, + 3768, 3051, 3652, + 3765, 3058, 3649, + 3760, 3068, 3645, + 3754, 3080, 3639, + 3747, 3096, 3632, + 3736, 3117, 3621, + 3721, 3143, 3606, + 3700, 3175, 3586, + 3671, 3216, 3558, + 3628, 3265, 3516, + 3564, 3323, 3455, + 3462, 3390, 3356, + 3275, 3467, 3178, + 2755, 3554, 2715, + 0, 3648, 0, + 0, 3750, 0, + 3921, 3088, 3762, + 3921, 3088, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3089, 3762, + 3921, 3090, 3762, + 3920, 3090, 3762, + 3920, 3091, 3761, + 3920, 3092, 3761, + 3919, 3093, 3761, + 3919, 3094, 3760, + 3918, 3096, 3759, + 3917, 3099, 3758, + 3916, 3103, 3757, + 3914, 3108, 3755, + 3912, 3114, 3753, + 3909, 3122, 3749, + 3905, 3133, 3745, + 3899, 3148, 3738, + 3891, 3166, 3730, + 3881, 3189, 3719, + 3866, 3219, 3703, + 3846, 3256, 3681, + 3817, 3301, 3650, + 3776, 3355, 3605, + 3715, 3418, 3536, + 3617, 3491, 3424, + 3441, 3573, 3213, + 2987, 3664, 2497, + 0, 3762, 0, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4062, 3157, 3869, + 4061, 3158, 3869, + 4061, 3158, 3869, + 4061, 3158, 3869, + 4061, 3159, 3869, + 4061, 3159, 3869, + 4061, 3160, 3869, + 4060, 3161, 3868, + 4060, 3162, 3868, + 4060, 3164, 3867, + 4059, 3166, 3866, + 4058, 3169, 3865, + 4057, 3174, 3864, + 4055, 3179, 3862, + 4053, 3186, 3859, + 4050, 3196, 3856, + 4045, 3208, 3851, + 4040, 3224, 3844, + 4032, 3245, 3835, + 4022, 3271, 3823, + 4008, 3304, 3806, + 3988, 3345, 3783, + 3960, 3394, 3750, + 3920, 3452, 3701, + 3860, 3520, 3626, + 3766, 3598, 3502, + 3598, 3684, 3255, + 3182, 3779, 1720, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3235, 3982, + 4095, 3236, 3982, + 4095, 3236, 3982, + 4095, 3236, 3982, + 4095, 3236, 3982, + 4095, 3237, 3981, + 4095, 3238, 3981, + 4095, 3238, 3981, + 4095, 3239, 3981, + 4095, 3241, 3980, + 4095, 3243, 3979, + 4095, 3246, 3979, + 4095, 3249, 3978, + 4095, 3254, 3976, + 4095, 3260, 3974, + 4095, 3268, 3971, + 4095, 3279, 3967, + 4095, 3293, 3962, + 4095, 3310, 3956, + 4095, 3333, 3946, + 4095, 3362, 3934, + 4095, 3398, 3916, + 4095, 3442, 3891, + 4095, 3495, 3856, + 4061, 3557, 3804, + 4002, 3629, 3724, + 3910, 3710, 3589, + 3747, 3800, 3306, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3322, 4095, + 4095, 3323, 4095, + 4095, 3323, 4095, + 4095, 3323, 4095, + 4095, 3323, 4095, + 4095, 3324, 4095, + 4095, 3324, 4095, + 4095, 3325, 4095, + 4095, 3326, 4095, + 4095, 3327, 4095, + 4095, 3329, 4095, + 4095, 3331, 4095, + 4095, 3334, 4095, + 4095, 3338, 4094, + 4095, 3343, 4093, + 4095, 3350, 4090, + 4095, 3358, 4088, + 4095, 3370, 4084, + 4095, 3385, 4079, + 4095, 3405, 4071, + 4095, 3429, 4062, + 4095, 3461, 4049, + 4095, 3499, 4030, + 4095, 3546, 4005, + 4095, 3602, 3968, + 4095, 3668, 3914, + 4095, 3743, 3829, + 4051, 3827, 3684, + 0, 2920, 3190, + 0, 2920, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2922, 3188, + 0, 2922, 3188, + 0, 2923, 3187, + 0, 2924, 3186, + 0, 2925, 3185, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3175, + 0, 2941, 3170, + 0, 2948, 3163, + 0, 2957, 3154, + 0, 2969, 3141, + 0, 2984, 3124, + 0, 3004, 3099, + 0, 3029, 3064, + 0, 3060, 3012, + 0, 3099, 2932, + 0, 3146, 2798, + 0, 3203, 2515, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2920, 3190, + 0, 2920, 3190, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2922, 3189, + 0, 2922, 3188, + 0, 2923, 3187, + 0, 2924, 3187, + 0, 2925, 3185, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3175, + 0, 2941, 3170, + 0, 2948, 3163, + 0, 2957, 3154, + 0, 2969, 3142, + 0, 2984, 3124, + 0, 3004, 3099, + 0, 3029, 3064, + 0, 3060, 3013, + 0, 3099, 2933, + 0, 3146, 2798, + 0, 3203, 2516, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2920, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2921, 3189, + 0, 2922, 3189, + 0, 2922, 3188, + 0, 2923, 3188, + 0, 2924, 3187, + 0, 2925, 3186, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3176, + 0, 2941, 3170, + 0, 2948, 3164, + 0, 2957, 3154, + 0, 2969, 3142, + 0, 2984, 3124, + 0, 3004, 3100, + 0, 3029, 3064, + 0, 3060, 3013, + 0, 3099, 2933, + 0, 3146, 2798, + 0, 3203, 2517, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2920, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3189, + 0, 2922, 3189, + 0, 2922, 3188, + 0, 2923, 3188, + 0, 2924, 3187, + 0, 2925, 3186, + 0, 2927, 3184, + 0, 2929, 3182, + 0, 2932, 3179, + 0, 2936, 3176, + 0, 2941, 3171, + 0, 2948, 3164, + 0, 2957, 3155, + 0, 2969, 3142, + 0, 2984, 3124, + 0, 3004, 3100, + 0, 3029, 3065, + 0, 3060, 3013, + 0, 3099, 2933, + 0, 3146, 2799, + 0, 3203, 2518, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2922, 3189, + 0, 2922, 3189, + 0, 2923, 3188, + 0, 2924, 3187, + 0, 2925, 3186, + 0, 2927, 3185, + 0, 2929, 3183, + 0, 2932, 3180, + 0, 2936, 3176, + 0, 2941, 3171, + 0, 2948, 3164, + 0, 2957, 3155, + 0, 2969, 3142, + 0, 2984, 3125, + 0, 3004, 3100, + 0, 3029, 3065, + 0, 3060, 3014, + 0, 3099, 2934, + 0, 3146, 2799, + 0, 3203, 2519, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3190, + 0, 2921, 3190, + 0, 2922, 3190, + 0, 2922, 3190, + 0, 2922, 3189, + 0, 2923, 3188, + 0, 2924, 3188, + 0, 2925, 3187, + 0, 2927, 3185, + 0, 2929, 3183, + 0, 2932, 3180, + 0, 2936, 3176, + 0, 2941, 3171, + 0, 2948, 3165, + 0, 2957, 3155, + 0, 2969, 3143, + 0, 2984, 3125, + 0, 3004, 3101, + 0, 3029, 3066, + 0, 3060, 3014, + 0, 3099, 2935, + 0, 3146, 2800, + 0, 3203, 2521, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3622, 0, + 0, 3729, 0, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2921, 3191, + 0, 2922, 3190, + 0, 2922, 3190, + 0, 2923, 3190, + 0, 2923, 3189, + 0, 2924, 3188, + 0, 2925, 3187, + 0, 2927, 3186, + 0, 2929, 3183, + 0, 2932, 3181, + 0, 2936, 3177, + 0, 2941, 3172, + 0, 2948, 3165, + 0, 2957, 3156, + 0, 2969, 3143, + 0, 2984, 3126, + 0, 3004, 3101, + 0, 3029, 3066, + 0, 3060, 3015, + 0, 3099, 2936, + 0, 3147, 2802, + 0, 3203, 2523, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3729, 0, + 0, 2921, 3192, + 0, 2921, 3192, + 0, 2921, 3192, + 0, 2921, 3192, + 0, 2922, 3191, + 0, 2922, 3191, + 0, 2922, 3191, + 0, 2923, 3190, + 0, 2923, 3190, + 0, 2924, 3189, + 0, 2926, 3188, + 0, 2927, 3186, + 0, 2930, 3184, + 0, 2933, 3181, + 0, 2936, 3178, + 0, 2942, 3173, + 0, 2948, 3166, + 0, 2957, 3157, + 0, 2969, 3144, + 0, 2984, 3127, + 0, 3004, 3102, + 0, 3029, 3067, + 0, 3061, 3016, + 0, 3099, 2937, + 0, 3147, 2803, + 0, 3203, 2526, + 0, 3269, 0, + 0, 3344, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2921, 3193, + 0, 2921, 3193, + 0, 2921, 3193, + 0, 2922, 3193, + 0, 2922, 3192, + 0, 2922, 3192, + 0, 2922, 3192, + 0, 2923, 3191, + 0, 2924, 3191, + 0, 2925, 3190, + 0, 2926, 3189, + 0, 2928, 3187, + 0, 2930, 3185, + 0, 2933, 3182, + 0, 2937, 3179, + 0, 2942, 3174, + 0, 2949, 3167, + 0, 2958, 3158, + 0, 2969, 3145, + 0, 2985, 3128, + 0, 3004, 3103, + 0, 3029, 3069, + 0, 3061, 3017, + 0, 3100, 2938, + 0, 3147, 2806, + 0, 3203, 2530, + 0, 3269, 0, + 0, 3345, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3194, + 0, 2922, 3193, + 0, 2923, 3193, + 0, 2923, 3193, + 0, 2924, 3192, + 0, 2925, 3191, + 0, 2926, 3190, + 0, 2928, 3188, + 0, 2930, 3186, + 0, 2933, 3184, + 0, 2937, 3180, + 0, 2942, 3175, + 0, 2949, 3168, + 0, 2958, 3159, + 0, 2970, 3147, + 0, 2985, 3129, + 0, 3005, 3105, + 0, 3030, 3070, + 0, 3061, 3019, + 0, 3100, 2941, + 0, 3147, 2808, + 0, 3203, 2536, + 0, 3269, 0, + 0, 3345, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2922, 3196, + 0, 2922, 3196, + 0, 2922, 3196, + 0, 2922, 3196, + 0, 2923, 3195, + 0, 2923, 3195, + 0, 2923, 3195, + 0, 2924, 3194, + 0, 2924, 3194, + 0, 2925, 3193, + 0, 2927, 3192, + 0, 2928, 3190, + 0, 2931, 3188, + 0, 2933, 3185, + 0, 2937, 3182, + 0, 2943, 3177, + 0, 2949, 3170, + 0, 2958, 3161, + 0, 2970, 3148, + 0, 2985, 3131, + 0, 3005, 3107, + 0, 3030, 3072, + 0, 3061, 3022, + 0, 3100, 2944, + 0, 3147, 2812, + 0, 3204, 2543, + 0, 3269, 0, + 0, 3345, 0, + 0, 3429, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3198, + 0, 2923, 3197, + 0, 2924, 3197, + 0, 2924, 3197, + 0, 2925, 3196, + 0, 2926, 3195, + 0, 2927, 3194, + 0, 2929, 3192, + 0, 2931, 3190, + 0, 2934, 3188, + 0, 2938, 3184, + 0, 2943, 3179, + 0, 2950, 3172, + 0, 2959, 3163, + 0, 2971, 3151, + 0, 2986, 3134, + 0, 3005, 3110, + 0, 3030, 3075, + 0, 3062, 3025, + 0, 3100, 2947, + 0, 3148, 2818, + 0, 3204, 2552, + 0, 3270, 0, + 0, 3345, 0, + 0, 3430, 0, + 0, 3522, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2923, 3201, + 0, 2923, 3201, + 0, 2924, 3201, + 0, 2924, 3201, + 0, 2924, 3201, + 0, 2924, 3200, + 0, 2925, 3200, + 0, 2925, 3200, + 0, 2926, 3199, + 0, 2927, 3198, + 0, 2928, 3197, + 0, 2930, 3195, + 0, 2932, 3193, + 0, 2935, 3191, + 0, 2939, 3187, + 0, 2944, 3182, + 0, 2951, 3176, + 0, 2960, 3167, + 0, 2971, 3154, + 0, 2986, 3137, + 0, 3006, 3113, + 0, 3031, 3079, + 0, 3062, 3029, + 0, 3101, 2953, + 0, 3148, 2824, + 0, 3204, 2564, + 0, 3270, 0, + 0, 3345, 0, + 0, 3430, 0, + 0, 3523, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2924, 3205, + 0, 2924, 3205, + 0, 2925, 3205, + 0, 2925, 3205, + 0, 2925, 3205, + 0, 2925, 3204, + 0, 2926, 3204, + 0, 2926, 3203, + 0, 2927, 3203, + 0, 2928, 3202, + 0, 2929, 3201, + 0, 2931, 3199, + 0, 2933, 3197, + 0, 2936, 3195, + 0, 2940, 3191, + 0, 2945, 3186, + 0, 2952, 3180, + 0, 2961, 3171, + 0, 2972, 3159, + 0, 2987, 3142, + 0, 3007, 3118, + 0, 3032, 3084, + 0, 3063, 3035, + 0, 3102, 2959, + 0, 3149, 2833, + 0, 3205, 2580, + 0, 3271, 0, + 0, 3346, 0, + 0, 3430, 0, + 0, 3523, 0, + 0, 3623, 0, + 0, 3730, 0, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2926, 3210, + 0, 2927, 3210, + 0, 2927, 3209, + 0, 2927, 3209, + 0, 2928, 3208, + 0, 2929, 3207, + 0, 2930, 3206, + 0, 2932, 3205, + 0, 2934, 3203, + 0, 2937, 3200, + 0, 2941, 3197, + 0, 2946, 3192, + 0, 2953, 3185, + 0, 2962, 3176, + 0, 2973, 3164, + 0, 2989, 3148, + 0, 3008, 3124, + 0, 3033, 3091, + 0, 3064, 3043, + 0, 3103, 2968, + 0, 3150, 2845, + 0, 3206, 2601, + 0, 3271, 1202, + 0, 3346, 0, + 0, 3431, 0, + 0, 3523, 0, + 0, 3624, 0, + 0, 3730, 0, + 0, 2927, 3217, + 0, 2928, 3217, + 0, 2928, 3217, + 0, 2928, 3217, + 0, 2928, 3217, + 0, 2928, 3216, + 0, 2929, 3216, + 0, 2929, 3216, + 0, 2930, 3215, + 0, 2931, 3214, + 0, 2932, 3213, + 0, 2934, 3212, + 0, 2936, 3210, + 0, 2939, 3207, + 0, 2943, 3204, + 0, 2948, 3199, + 0, 2955, 3193, + 0, 2963, 3184, + 0, 2975, 3172, + 0, 2990, 3156, + 0, 3010, 3133, + 0, 3034, 3100, + 0, 3065, 3053, + 0, 3104, 2980, + 0, 3151, 2860, + 0, 3207, 2626, + 0, 3272, 1575, + 0, 3347, 0, + 0, 3431, 0, + 0, 3524, 0, + 0, 3624, 0, + 0, 3731, 0, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2930, 3226, + 0, 2931, 3226, + 0, 2931, 3225, + 0, 2932, 3225, + 0, 2932, 3224, + 0, 2933, 3223, + 0, 2934, 3222, + 0, 2936, 3221, + 0, 2938, 3219, + 0, 2941, 3216, + 0, 2945, 3213, + 0, 2950, 3208, + 0, 2957, 3202, + 0, 2966, 3194, + 0, 2977, 3182, + 0, 2992, 3166, + 0, 3012, 3144, + 0, 3036, 3112, + 0, 3067, 3066, + 0, 3105, 2995, + 0, 3152, 2880, + 0, 3208, 2659, + 0, 3273, 1829, + 0, 3348, 0, + 0, 3432, 0, + 0, 3524, 0, + 0, 3624, 0, + 0, 3731, 0, + 0, 2933, 3238, + 0, 2933, 3238, + 0, 2933, 3238, + 0, 2933, 3238, + 0, 2934, 3238, + 0, 2934, 3237, + 0, 2934, 3237, + 0, 2935, 3237, + 0, 2936, 3236, + 0, 2936, 3235, + 0, 2938, 3234, + 0, 2939, 3233, + 0, 2941, 3231, + 0, 2944, 3229, + 0, 2948, 3225, + 0, 2953, 3221, + 0, 2960, 3215, + 0, 2969, 3206, + 0, 2980, 3195, + 0, 2995, 3179, + 0, 3014, 3158, + 0, 3039, 3127, + 0, 3069, 3082, + 0, 3108, 3015, + 0, 3154, 2905, + 0, 3210, 2699, + 0, 3275, 2034, + 0, 3349, 0, + 0, 3433, 0, + 0, 3525, 0, + 0, 3625, 0, + 0, 3732, 0, + 0, 2937, 3254, + 0, 2937, 3253, + 0, 2938, 3253, + 0, 2938, 3253, + 0, 2938, 3253, + 0, 2938, 3253, + 0, 2939, 3252, + 0, 2939, 3252, + 0, 2940, 3252, + 0, 2941, 3251, + 0, 2942, 3250, + 0, 2943, 3248, + 0, 2946, 3247, + 0, 2948, 3244, + 0, 2952, 3241, + 0, 2957, 3237, + 0, 2964, 3231, + 0, 2973, 3223, + 0, 2984, 3212, + 0, 2999, 3197, + 0, 3018, 3176, + 0, 3042, 3147, + 0, 3073, 3104, + 0, 3110, 3040, + 0, 3157, 2937, + 0, 3212, 2747, + 0, 3277, 2215, + 0, 3351, 0, + 0, 3434, 0, + 0, 3526, 0, + 0, 3626, 0, + 0, 3732, 0, + 0, 2943, 3273, + 0, 2943, 3273, + 0, 2943, 3273, + 0, 2943, 3273, + 0, 2944, 3273, + 0, 2944, 3273, + 0, 2944, 3272, + 0, 2945, 3272, + 0, 2945, 3271, + 0, 2946, 3271, + 0, 2947, 3270, + 0, 2949, 3268, + 0, 2951, 3267, + 0, 2954, 3264, + 0, 2958, 3261, + 0, 2963, 3257, + 0, 2969, 3252, + 0, 2978, 3244, + 0, 2989, 3234, + 0, 3004, 3219, + 0, 3022, 3199, + 0, 3046, 3171, + 0, 3077, 3131, + 0, 3114, 3071, + 0, 3160, 2976, + 0, 3215, 2805, + 0, 3279, 2380, + 0, 3353, 0, + 0, 3436, 0, + 0, 3528, 0, + 0, 3627, 0, + 0, 3733, 0, + 1458, 2950, 3298, + 1453, 2950, 3298, + 1446, 2951, 3298, + 1437, 2951, 3298, + 1424, 2951, 3298, + 1407, 2951, 3298, + 1383, 2952, 3298, + 1348, 2952, 3297, + 1297, 2953, 3297, + 1219, 2954, 3296, + 1088, 2955, 3295, + 818, 2956, 3294, + 0, 2958, 3292, + 0, 2961, 3290, + 0, 2965, 3287, + 0, 2970, 3283, + 0, 2976, 3278, + 0, 2985, 3271, + 0, 2996, 3261, + 0, 3010, 3248, + 0, 3029, 3229, + 0, 3052, 3203, + 0, 3082, 3165, + 0, 3119, 3110, + 0, 3165, 3023, + 0, 3219, 2873, + 0, 3283, 2535, + 0, 3356, 0, + 0, 3439, 0, + 0, 3530, 0, + 0, 3629, 0, + 0, 3735, 0, + 2457, 2960, 3330, + 2456, 2960, 3330, + 2456, 2960, 3330, + 2455, 2960, 3330, + 2453, 2961, 3330, + 2451, 2961, 3330, + 2449, 2961, 3329, + 2446, 2962, 3329, + 2442, 2962, 3328, + 2436, 2963, 3328, + 2428, 2964, 3327, + 2417, 2966, 3326, + 2402, 2968, 3324, + 2382, 2971, 3322, + 2352, 2974, 3320, + 2310, 2979, 3316, + 2247, 2985, 3311, + 2145, 2994, 3304, + 1960, 3004, 3295, + 1453, 3019, 3283, + 0, 3037, 3266, + 0, 3060, 3242, + 0, 3090, 3207, + 0, 3126, 3157, + 0, 3171, 3079, + 0, 3225, 2949, + 0, 3288, 2684, + 0, 3360, 0, + 0, 3442, 0, + 0, 3533, 0, + 0, 3631, 0, + 0, 3736, 0, + 2813, 2973, 3369, + 2813, 2973, 3369, + 2812, 2973, 3369, + 2812, 2973, 3369, + 2811, 2973, 3369, + 2810, 2974, 3369, + 2809, 2974, 3369, + 2808, 2974, 3368, + 2806, 2975, 3368, + 2803, 2976, 3367, + 2800, 2977, 3366, + 2795, 2978, 3365, + 2789, 2980, 3364, + 2780, 2983, 3362, + 2768, 2987, 3360, + 2752, 2991, 3356, + 2729, 2997, 3352, + 2696, 3005, 3346, + 2648, 3016, 3337, + 2576, 3030, 3326, + 2456, 3048, 3310, + 2220, 3070, 3289, + 1140, 3099, 3258, + 0, 3135, 3213, + 0, 3179, 3145, + 0, 3232, 3035, + 0, 3294, 2828, + 0, 3366, 2152, + 0, 3447, 0, + 0, 3536, 0, + 0, 3634, 0, + 0, 3739, 0, + 3061, 2989, 3417, + 3061, 2989, 3417, + 3061, 2989, 3417, + 3060, 2989, 3417, + 3060, 2990, 3417, + 3060, 2990, 3416, + 3059, 2990, 3416, + 3058, 2991, 3416, + 3057, 2991, 3415, + 3055, 2992, 3415, + 3053, 2993, 3414, + 3051, 2995, 3413, + 3047, 2997, 3412, + 3042, 2999, 3410, + 3036, 3002, 3408, + 3027, 3007, 3405, + 3014, 3013, 3401, + 2997, 3021, 3396, + 2973, 3031, 3388, + 2939, 3044, 3378, + 2889, 3062, 3364, + 2812, 3084, 3345, + 2683, 3112, 3318, + 2421, 3147, 3279, + 0, 3189, 3221, + 0, 3241, 3129, + 0, 3302, 2969, + 0, 3373, 2588, + 0, 3452, 0, + 0, 3541, 0, + 0, 3638, 0, + 0, 3742, 0, + 3264, 3010, 3474, + 3264, 3010, 3474, + 3264, 3010, 3473, + 3263, 3010, 3473, + 3263, 3011, 3473, + 3263, 3011, 3473, + 3263, 3011, 3473, + 3262, 3012, 3473, + 3261, 3012, 3472, + 3260, 3013, 3472, + 3259, 3014, 3471, + 3257, 3015, 3470, + 3255, 3017, 3469, + 3252, 3020, 3468, + 3248, 3023, 3466, + 3242, 3027, 3463, + 3234, 3033, 3460, + 3224, 3040, 3455, + 3210, 3050, 3448, + 3190, 3063, 3440, + 3161, 3080, 3427, + 3121, 3101, 3411, + 3060, 3128, 3387, + 2964, 3162, 3354, + 2791, 3203, 3305, + 2354, 3253, 3231, + 0, 3313, 3107, + 0, 3382, 2861, + 0, 3460, 1375, + 0, 3548, 0, + 0, 3643, 0, + 0, 3746, 0, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3037, 3540, + 3442, 3038, 3539, + 3442, 3038, 3539, + 3441, 3038, 3539, + 3441, 3039, 3539, + 3440, 3040, 3538, + 3439, 3041, 3538, + 3438, 3042, 3537, + 3437, 3044, 3536, + 3434, 3046, 3535, + 3432, 3049, 3533, + 3428, 3053, 3531, + 3423, 3058, 3528, + 3416, 3065, 3524, + 3407, 3075, 3518, + 3394, 3087, 3511, + 3376, 3103, 3500, + 3351, 3123, 3486, + 3315, 3149, 3466, + 3263, 3181, 3438, + 3182, 3221, 3398, + 3044, 3269, 3339, + 2752, 3327, 3244, + 0, 3394, 3076, + 0, 3470, 2660, + 0, 3556, 0, + 0, 3650, 0, + 0, 3751, 0, + 3606, 3070, 3616, + 3606, 3070, 3616, + 3606, 3071, 3616, + 3606, 3071, 3615, + 3606, 3071, 3615, + 3606, 3071, 3615, + 3606, 3071, 3615, + 3606, 3072, 3615, + 3605, 3072, 3615, + 3605, 3073, 3614, + 3604, 3074, 3614, + 3603, 3075, 3613, + 3602, 3077, 3613, + 3601, 3079, 3611, + 3599, 3082, 3610, + 3596, 3085, 3608, + 3593, 3090, 3605, + 3588, 3097, 3602, + 3582, 3106, 3597, + 3573, 3117, 3591, + 3561, 3132, 3582, + 3545, 3151, 3570, + 3522, 3175, 3554, + 3489, 3205, 3531, + 3442, 3243, 3499, + 3369, 3289, 3452, + 3249, 3345, 3380, + 3015, 3409, 3261, + 1952, 3483, 3030, + 0, 3567, 2039, + 0, 3659, 0, + 0, 3758, 0, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3761, 3112, 3700, + 3760, 3113, 3700, + 3760, 3113, 3700, + 3760, 3114, 3699, + 3759, 3115, 3699, + 3759, 3116, 3699, + 3758, 3117, 3698, + 3757, 3119, 3697, + 3756, 3122, 3696, + 3754, 3125, 3694, + 3751, 3130, 3692, + 3748, 3136, 3689, + 3744, 3144, 3685, + 3738, 3154, 3680, + 3729, 3168, 3673, + 3718, 3185, 3663, + 3702, 3208, 3650, + 3681, 3236, 3632, + 3650, 3272, 3606, + 3606, 3315, 3569, + 3538, 3368, 3514, + 3429, 3429, 3429, + 3224, 3501, 3283, + 2573, 3581, 2960, + 0, 3671, 0, + 0, 3768, 0, + 3909, 3161, 3794, + 3909, 3161, 3794, + 3909, 3162, 3794, + 3909, 3162, 3794, + 3909, 3162, 3794, + 3909, 3162, 3794, + 3909, 3162, 3793, + 3909, 3162, 3793, + 3909, 3163, 3793, + 3908, 3163, 3793, + 3908, 3164, 3793, + 3908, 3165, 3792, + 3907, 3166, 3792, + 3906, 3168, 3791, + 3905, 3171, 3790, + 3904, 3174, 3789, + 3902, 3178, 3787, + 3900, 3183, 3785, + 3897, 3190, 3781, + 3892, 3200, 3777, + 3887, 3212, 3771, + 3879, 3228, 3764, + 3868, 3249, 3753, + 3853, 3275, 3739, + 3832, 3307, 3718, + 3803, 3348, 3690, + 3760, 3397, 3648, + 3696, 3455, 3587, + 3594, 3522, 3488, + 3407, 3599, 3311, + 2887, 3686, 2847, + 0, 3780, 0, + 4053, 3220, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3221, 3894, + 4053, 3222, 3894, + 4052, 3222, 3894, + 4052, 3223, 3894, + 4052, 3224, 3893, + 4052, 3225, 3893, + 4051, 3226, 3892, + 4050, 3229, 3891, + 4049, 3231, 3890, + 4048, 3235, 3889, + 4046, 3240, 3887, + 4044, 3246, 3885, + 4041, 3254, 3881, + 4037, 3265, 3877, + 4031, 3280, 3871, + 4023, 3298, 3862, + 4013, 3321, 3851, + 3998, 3351, 3835, + 3978, 3388, 3813, + 3950, 3433, 3782, + 3908, 3487, 3737, + 3847, 3550, 3668, + 3749, 3623, 3557, + 3573, 3705, 3345, + 3119, 3796, 2630, + 4095, 3289, 4002, + 4095, 3289, 4002, + 4095, 3289, 4002, + 4095, 3289, 4002, + 4095, 3289, 4001, + 4095, 3290, 4001, + 4095, 3290, 4001, + 4095, 3290, 4001, + 4095, 3290, 4001, + 4095, 3291, 4001, + 4095, 3291, 4001, + 4095, 3292, 4001, + 4095, 3293, 4000, + 4095, 3294, 4000, + 4095, 3296, 3999, + 4095, 3298, 3998, + 4095, 3302, 3997, + 4095, 3306, 3996, + 4095, 3311, 3994, + 4095, 3318, 3991, + 4095, 3328, 3988, + 4095, 3340, 3983, + 4095, 3357, 3976, + 4095, 3377, 3967, + 4095, 3403, 3955, + 4095, 3436, 3939, + 4095, 3477, 3915, + 4092, 3526, 3882, + 4052, 3585, 3833, + 3993, 3653, 3758, + 3898, 3730, 3634, + 3730, 3816, 3387, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3367, 4095, + 4095, 3368, 4095, + 4095, 3368, 4095, + 4095, 3368, 4095, + 4095, 3368, 4095, + 4095, 3369, 4095, + 4095, 3369, 4095, + 4095, 3370, 4095, + 4095, 3370, 4095, + 4095, 3372, 4095, + 4095, 3373, 4095, + 4095, 3375, 4095, + 4095, 3378, 4095, + 4095, 3381, 4095, + 4095, 3386, 4095, + 4095, 3392, 4095, + 4095, 3400, 4095, + 4095, 3411, 4095, + 4095, 3425, 4094, + 4095, 3442, 4088, + 4095, 3465, 4078, + 4095, 3494, 4066, + 4095, 3530, 4048, + 4095, 3574, 4023, + 4095, 3627, 3988, + 4095, 3689, 3936, + 4095, 3761, 3857, + 4042, 3842, 3721, + 0, 3052, 3322, + 0, 3052, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3320, + 0, 3054, 3320, + 0, 3055, 3319, + 0, 3056, 3318, + 0, 3057, 3317, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3307, + 0, 3073, 3302, + 0, 3080, 3295, + 0, 3089, 3286, + 0, 3101, 3273, + 0, 3116, 3256, + 0, 3136, 3231, + 0, 3161, 3196, + 0, 3192, 3144, + 0, 3231, 3064, + 0, 3278, 2929, + 0, 3335, 2647, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3052, 3322, + 0, 3052, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3320, + 0, 3054, 3320, + 0, 3055, 3319, + 0, 3056, 3319, + 0, 3057, 3317, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3307, + 0, 3073, 3302, + 0, 3080, 3295, + 0, 3089, 3286, + 0, 3101, 3273, + 0, 3116, 3256, + 0, 3136, 3231, + 0, 3161, 3196, + 0, 3192, 3144, + 0, 3231, 3065, + 0, 3278, 2930, + 0, 3335, 2648, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3052, 3322, + 0, 3052, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3321, + 0, 3054, 3320, + 0, 3055, 3319, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3307, + 0, 3073, 3302, + 0, 3080, 3296, + 0, 3089, 3286, + 0, 3101, 3274, + 0, 3116, 3256, + 0, 3136, 3231, + 0, 3161, 3196, + 0, 3192, 3145, + 0, 3231, 3065, + 0, 3278, 2930, + 0, 3335, 2648, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3052, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3053, 3321, + 0, 3054, 3321, + 0, 3054, 3320, + 0, 3055, 3320, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3311, + 0, 3068, 3308, + 0, 3073, 3303, + 0, 3080, 3296, + 0, 3089, 3286, + 0, 3101, 3274, + 0, 3116, 3256, + 0, 3136, 3232, + 0, 3161, 3197, + 0, 3192, 3145, + 0, 3231, 3065, + 0, 3278, 2930, + 0, 3335, 2649, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3321, + 0, 3054, 3321, + 0, 3054, 3321, + 0, 3055, 3320, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3316, + 0, 3061, 3314, + 0, 3064, 3312, + 0, 3068, 3308, + 0, 3073, 3303, + 0, 3080, 3296, + 0, 3089, 3287, + 0, 3101, 3274, + 0, 3116, 3256, + 0, 3136, 3232, + 0, 3161, 3197, + 0, 3192, 3145, + 0, 3231, 3065, + 0, 3278, 2931, + 0, 3335, 2650, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3323, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3053, 3322, + 0, 3054, 3322, + 0, 3054, 3321, + 0, 3054, 3321, + 0, 3055, 3320, + 0, 3056, 3319, + 0, 3057, 3318, + 0, 3059, 3317, + 0, 3061, 3315, + 0, 3064, 3312, + 0, 3068, 3308, + 0, 3073, 3303, + 0, 3080, 3296, + 0, 3089, 3287, + 0, 3101, 3274, + 0, 3116, 3257, + 0, 3136, 3232, + 0, 3161, 3197, + 0, 3192, 3146, + 0, 3231, 3066, + 0, 3279, 2932, + 0, 3335, 2651, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3322, + 0, 3054, 3322, + 0, 3054, 3322, + 0, 3055, 3321, + 0, 3055, 3321, + 0, 3056, 3320, + 0, 3057, 3319, + 0, 3059, 3317, + 0, 3061, 3315, + 0, 3064, 3312, + 0, 3068, 3309, + 0, 3073, 3304, + 0, 3080, 3297, + 0, 3089, 3287, + 0, 3101, 3275, + 0, 3116, 3257, + 0, 3136, 3233, + 0, 3161, 3198, + 0, 3192, 3146, + 0, 3231, 3067, + 0, 3279, 2932, + 0, 3335, 2653, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3053, 3323, + 0, 3054, 3323, + 0, 3054, 3322, + 0, 3055, 3322, + 0, 3055, 3321, + 0, 3056, 3320, + 0, 3058, 3319, + 0, 3059, 3318, + 0, 3061, 3316, + 0, 3064, 3313, + 0, 3068, 3309, + 0, 3074, 3304, + 0, 3080, 3297, + 0, 3089, 3288, + 0, 3101, 3275, + 0, 3116, 3258, + 0, 3136, 3233, + 0, 3161, 3198, + 0, 3192, 3147, + 0, 3231, 3068, + 0, 3279, 2934, + 0, 3335, 2655, + 0, 3401, 0, + 0, 3476, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3053, 3324, + 0, 3054, 3324, + 0, 3054, 3323, + 0, 3054, 3323, + 0, 3055, 3322, + 0, 3056, 3322, + 0, 3057, 3321, + 0, 3058, 3320, + 0, 3059, 3318, + 0, 3062, 3316, + 0, 3065, 3314, + 0, 3069, 3310, + 0, 3074, 3305, + 0, 3081, 3298, + 0, 3090, 3289, + 0, 3101, 3276, + 0, 3117, 3259, + 0, 3136, 3234, + 0, 3161, 3199, + 0, 3193, 3148, + 0, 3231, 3069, + 0, 3279, 2935, + 0, 3335, 2658, + 0, 3401, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3053, 3325, + 0, 3053, 3325, + 0, 3053, 3325, + 0, 3054, 3325, + 0, 3054, 3325, + 0, 3054, 3325, + 0, 3054, 3324, + 0, 3055, 3324, + 0, 3055, 3323, + 0, 3056, 3323, + 0, 3057, 3322, + 0, 3058, 3321, + 0, 3060, 3319, + 0, 3062, 3317, + 0, 3065, 3314, + 0, 3069, 3311, + 0, 3074, 3306, + 0, 3081, 3299, + 0, 3090, 3290, + 0, 3102, 3277, + 0, 3117, 3260, + 0, 3136, 3235, + 0, 3161, 3201, + 0, 3193, 3149, + 0, 3232, 3071, + 0, 3279, 2938, + 0, 3335, 2662, + 0, 3401, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3054, 3326, + 0, 3055, 3326, + 0, 3055, 3325, + 0, 3055, 3325, + 0, 3056, 3324, + 0, 3057, 3323, + 0, 3058, 3322, + 0, 3060, 3321, + 0, 3062, 3319, + 0, 3065, 3316, + 0, 3069, 3312, + 0, 3074, 3307, + 0, 3081, 3300, + 0, 3090, 3291, + 0, 3102, 3279, + 0, 3117, 3261, + 0, 3137, 3237, + 0, 3162, 3202, + 0, 3193, 3151, + 0, 3232, 3073, + 0, 3279, 2941, + 0, 3335, 2668, + 0, 3401, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3054, 3328, + 0, 3055, 3327, + 0, 3055, 3327, + 0, 3055, 3327, + 0, 3056, 3326, + 0, 3057, 3326, + 0, 3057, 3325, + 0, 3059, 3324, + 0, 3060, 3322, + 0, 3063, 3320, + 0, 3066, 3318, + 0, 3069, 3314, + 0, 3075, 3309, + 0, 3081, 3302, + 0, 3090, 3293, + 0, 3102, 3281, + 0, 3117, 3263, + 0, 3137, 3239, + 0, 3162, 3204, + 0, 3193, 3154, + 0, 3232, 3076, + 0, 3279, 2944, + 0, 3336, 2675, + 0, 3402, 0, + 0, 3477, 0, + 0, 3561, 0, + 0, 3654, 0, + 0, 3755, 0, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3055, 3330, + 0, 3056, 3329, + 0, 3056, 3329, + 0, 3056, 3329, + 0, 3057, 3328, + 0, 3058, 3327, + 0, 3059, 3326, + 0, 3061, 3325, + 0, 3063, 3323, + 0, 3066, 3320, + 0, 3070, 3316, + 0, 3075, 3311, + 0, 3082, 3305, + 0, 3091, 3295, + 0, 3103, 3283, + 0, 3118, 3266, + 0, 3137, 3242, + 0, 3162, 3207, + 0, 3194, 3157, + 0, 3233, 3080, + 0, 3280, 2950, + 0, 3336, 2684, + 0, 3402, 0, + 0, 3477, 0, + 0, 3562, 0, + 0, 3655, 0, + 0, 3755, 0, + 0, 3055, 3333, + 0, 3055, 3333, + 0, 3055, 3333, + 0, 3056, 3333, + 0, 3056, 3333, + 0, 3056, 3333, + 0, 3056, 3332, + 0, 3057, 3332, + 0, 3057, 3332, + 0, 3058, 3331, + 0, 3059, 3330, + 0, 3060, 3329, + 0, 3062, 3328, + 0, 3064, 3326, + 0, 3067, 3323, + 0, 3071, 3319, + 0, 3076, 3314, + 0, 3083, 3308, + 0, 3092, 3299, + 0, 3103, 3286, + 0, 3119, 3269, + 0, 3138, 3245, + 0, 3163, 3211, + 0, 3194, 3161, + 0, 3233, 3085, + 0, 3280, 2957, + 0, 3336, 2696, + 0, 3402, 0, + 0, 3477, 0, + 0, 3562, 0, + 0, 3655, 0, + 0, 3755, 0, + 0, 3056, 3337, + 0, 3056, 3337, + 0, 3056, 3337, + 0, 3057, 3337, + 0, 3057, 3337, + 0, 3057, 3337, + 0, 3057, 3336, + 0, 3058, 3336, + 0, 3058, 3336, + 0, 3059, 3335, + 0, 3060, 3334, + 0, 3061, 3333, + 0, 3063, 3332, + 0, 3065, 3330, + 0, 3068, 3327, + 0, 3072, 3323, + 0, 3077, 3318, + 0, 3084, 3312, + 0, 3093, 3303, + 0, 3104, 3291, + 0, 3119, 3274, + 0, 3139, 3250, + 0, 3164, 3216, + 0, 3195, 3167, + 0, 3234, 3092, + 0, 3281, 2966, + 0, 3337, 2712, + 0, 3403, 0, + 0, 3478, 0, + 0, 3562, 0, + 0, 3655, 0, + 0, 3755, 0, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3058, 3342, + 0, 3059, 3342, + 0, 3059, 3341, + 0, 3060, 3341, + 0, 3060, 3340, + 0, 3061, 3339, + 0, 3062, 3338, + 0, 3064, 3337, + 0, 3066, 3335, + 0, 3069, 3332, + 0, 3073, 3329, + 0, 3078, 3324, + 0, 3085, 3317, + 0, 3094, 3309, + 0, 3106, 3296, + 0, 3121, 3280, + 0, 3140, 3256, + 0, 3165, 3223, + 0, 3196, 3175, + 0, 3235, 3100, + 0, 3282, 2977, + 0, 3338, 2733, + 0, 3403, 1334, + 0, 3478, 0, + 0, 3563, 0, + 0, 3655, 0, + 0, 3756, 0, + 0, 3059, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3060, 3349, + 0, 3061, 3348, + 0, 3061, 3348, + 0, 3062, 3347, + 0, 3063, 3346, + 0, 3064, 3345, + 0, 3066, 3344, + 0, 3068, 3342, + 0, 3071, 3339, + 0, 3075, 3336, + 0, 3080, 3331, + 0, 3087, 3325, + 0, 3096, 3316, + 0, 3107, 3304, + 0, 3122, 3288, + 0, 3142, 3265, + 0, 3166, 3232, + 0, 3197, 3185, + 0, 3236, 3112, + 0, 3283, 2993, + 0, 3339, 2758, + 0, 3404, 1707, + 0, 3479, 0, + 0, 3563, 0, + 0, 3656, 0, + 0, 3756, 0, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3062, 3358, + 0, 3063, 3358, + 0, 3063, 3358, + 0, 3063, 3357, + 0, 3064, 3357, + 0, 3064, 3356, + 0, 3065, 3355, + 0, 3067, 3354, + 0, 3068, 3353, + 0, 3070, 3351, + 0, 3073, 3349, + 0, 3077, 3345, + 0, 3082, 3341, + 0, 3089, 3334, + 0, 3098, 3326, + 0, 3109, 3314, + 0, 3124, 3298, + 0, 3144, 3276, + 0, 3168, 3244, + 0, 3199, 3198, + 0, 3238, 3127, + 0, 3284, 3012, + 0, 3340, 2791, + 0, 3405, 1961, + 0, 3480, 0, + 0, 3564, 0, + 0, 3657, 0, + 0, 3757, 0, + 0, 3065, 3370, + 0, 3065, 3370, + 0, 3065, 3370, + 0, 3065, 3370, + 0, 3066, 3370, + 0, 3066, 3370, + 0, 3066, 3369, + 0, 3066, 3369, + 0, 3067, 3369, + 0, 3068, 3368, + 0, 3069, 3367, + 0, 3070, 3366, + 0, 3071, 3365, + 0, 3074, 3363, + 0, 3076, 3361, + 0, 3080, 3357, + 0, 3085, 3353, + 0, 3092, 3347, + 0, 3101, 3338, + 0, 3112, 3327, + 0, 3127, 3312, + 0, 3146, 3290, + 0, 3171, 3259, + 0, 3202, 3214, + 0, 3240, 3147, + 0, 3286, 3037, + 0, 3342, 2831, + 0, 3407, 2166, + 0, 3481, 0, + 0, 3565, 0, + 0, 3657, 0, + 0, 3757, 0, + 0, 3069, 3386, + 0, 3069, 3386, + 0, 3070, 3386, + 0, 3070, 3385, + 0, 3070, 3385, + 0, 3070, 3385, + 0, 3070, 3385, + 0, 3071, 3385, + 0, 3071, 3384, + 0, 3072, 3384, + 0, 3073, 3383, + 0, 3074, 3382, + 0, 3076, 3381, + 0, 3078, 3379, + 0, 3081, 3376, + 0, 3084, 3373, + 0, 3089, 3369, + 0, 3096, 3363, + 0, 3105, 3355, + 0, 3116, 3344, + 0, 3131, 3329, + 0, 3150, 3308, + 0, 3174, 3279, + 0, 3205, 3236, + 0, 3243, 3172, + 0, 3289, 3069, + 0, 3344, 2880, + 0, 3409, 2347, + 0, 3483, 0, + 0, 3567, 0, + 0, 3659, 0, + 0, 3758, 0, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3075, 3405, + 0, 3076, 3405, + 0, 3076, 3405, + 0, 3076, 3404, + 0, 3077, 3404, + 0, 3077, 3404, + 0, 3078, 3403, + 0, 3080, 3402, + 0, 3081, 3401, + 0, 3083, 3399, + 0, 3086, 3397, + 0, 3090, 3393, + 0, 3095, 3389, + 0, 3101, 3384, + 0, 3110, 3376, + 0, 3121, 3366, + 0, 3136, 3351, + 0, 3155, 3332, + 0, 3179, 3304, + 0, 3209, 3263, + 0, 3246, 3203, + 0, 3292, 3108, + 0, 3347, 2937, + 0, 3411, 2512, + 0, 3485, 0, + 0, 3568, 0, + 0, 3660, 0, + 0, 3759, 0, + 1593, 3082, 3431, + 1590, 3082, 3431, + 1585, 3083, 3431, + 1578, 3083, 3430, + 1569, 3083, 3430, + 1556, 3083, 3430, + 1539, 3083, 3430, + 1515, 3084, 3430, + 1480, 3084, 3429, + 1429, 3085, 3429, + 1351, 3086, 3428, + 1220, 3087, 3427, + 950, 3088, 3426, + 0, 3090, 3424, + 0, 3093, 3422, + 0, 3097, 3419, + 0, 3102, 3415, + 0, 3108, 3410, + 0, 3117, 3403, + 0, 3128, 3393, + 0, 3142, 3380, + 0, 3161, 3361, + 0, 3184, 3335, + 0, 3214, 3297, + 0, 3252, 3242, + 0, 3297, 3155, + 0, 3351, 3005, + 0, 3415, 2667, + 0, 3488, 0, + 0, 3571, 0, + 0, 3662, 0, + 0, 3761, 0, + 2589, 3092, 3462, + 2589, 3092, 3462, + 2588, 3092, 3462, + 2588, 3092, 3462, + 2587, 3092, 3462, + 2585, 3093, 3462, + 2584, 3093, 3462, + 2581, 3093, 3461, + 2578, 3094, 3461, + 2574, 3094, 3461, + 2568, 3095, 3460, + 2560, 3096, 3459, + 2549, 3098, 3458, + 2534, 3100, 3456, + 2514, 3103, 3454, + 2484, 3106, 3452, + 2442, 3111, 3448, + 2379, 3117, 3443, + 2277, 3126, 3436, + 2092, 3137, 3427, + 1586, 3151, 3415, + 0, 3169, 3398, + 0, 3192, 3374, + 0, 3222, 3339, + 0, 3258, 3289, + 0, 3303, 3211, + 0, 3357, 3081, + 0, 3420, 2816, + 0, 3492, 0, + 0, 3574, 0, + 0, 3665, 0, + 0, 3763, 0, + 2945, 3105, 3501, + 2945, 3105, 3501, + 2945, 3105, 3501, + 2944, 3105, 3501, + 2944, 3105, 3501, + 2943, 3105, 3501, + 2942, 3106, 3501, + 2941, 3106, 3501, + 2940, 3106, 3500, + 2938, 3107, 3500, + 2935, 3108, 3499, + 2932, 3109, 3499, + 2927, 3110, 3497, + 2921, 3112, 3496, + 2912, 3115, 3494, + 2900, 3119, 3492, + 2884, 3123, 3488, + 2861, 3129, 3484, + 2828, 3137, 3478, + 2780, 3148, 3470, + 2708, 3162, 3458, + 2588, 3180, 3443, + 2352, 3202, 3421, + 1272, 3231, 3390, + 0, 3267, 3345, + 0, 3311, 3277, + 0, 3364, 3167, + 0, 3426, 2960, + 0, 3498, 2284, + 0, 3579, 0, + 0, 3669, 0, + 0, 3766, 0, + 3193, 3121, 3549, + 3193, 3121, 3549, + 3193, 3121, 3549, + 3193, 3121, 3549, + 3192, 3122, 3549, + 3192, 3122, 3549, + 3192, 3122, 3548, + 3191, 3122, 3548, + 3190, 3123, 3548, + 3189, 3123, 3548, + 3188, 3124, 3547, + 3186, 3125, 3546, + 3183, 3127, 3545, + 3179, 3129, 3544, + 3174, 3131, 3543, + 3168, 3135, 3540, + 3159, 3139, 3537, + 3146, 3145, 3533, + 3129, 3153, 3528, + 3105, 3163, 3520, + 3071, 3176, 3510, + 3021, 3194, 3496, + 2944, 3216, 3477, + 2815, 3244, 3450, + 2553, 3279, 3411, + 0, 3321, 3353, + 0, 3373, 3261, + 0, 3434, 3101, + 0, 3505, 2720, + 0, 3585, 0, + 0, 3673, 0, + 0, 3770, 0, + 3396, 3142, 3606, + 3396, 3142, 3606, + 3396, 3142, 3606, + 3396, 3142, 3606, + 3396, 3143, 3605, + 3395, 3143, 3605, + 3395, 3143, 3605, + 3395, 3143, 3605, + 3394, 3144, 3605, + 3393, 3144, 3604, + 3392, 3145, 3604, + 3391, 3146, 3603, + 3389, 3148, 3603, + 3387, 3149, 3601, + 3384, 3152, 3600, + 3380, 3155, 3598, + 3374, 3159, 3595, + 3367, 3165, 3592, + 3356, 3172, 3587, + 3342, 3182, 3581, + 3322, 3195, 3572, + 3294, 3212, 3560, + 3253, 3233, 3543, + 3192, 3260, 3519, + 3096, 3294, 3486, + 2923, 3335, 3437, + 2486, 3385, 3363, + 0, 3445, 3239, + 0, 3514, 2993, + 0, 3592, 1507, + 0, 3680, 0, + 0, 3775, 0, + 3575, 3169, 3672, + 3575, 3169, 3672, + 3574, 3169, 3672, + 3574, 3169, 3672, + 3574, 3169, 3672, + 3574, 3169, 3672, + 3574, 3170, 3672, + 3574, 3170, 3671, + 3573, 3170, 3671, + 3573, 3171, 3671, + 3572, 3172, 3670, + 3571, 3173, 3670, + 3570, 3174, 3669, + 3569, 3176, 3668, + 3567, 3178, 3667, + 3564, 3181, 3665, + 3560, 3185, 3663, + 3555, 3190, 3660, + 3548, 3198, 3656, + 3539, 3207, 3650, + 3526, 3219, 3643, + 3508, 3235, 3632, + 3483, 3255, 3618, + 3448, 3281, 3598, + 3395, 3313, 3571, + 3314, 3353, 3531, + 3176, 3401, 3471, + 2884, 3459, 3376, + 0, 3526, 3208, + 0, 3602, 2792, + 0, 3688, 0, + 0, 3782, 0, + 3739, 3202, 3748, + 3739, 3202, 3748, + 3739, 3203, 3748, + 3738, 3203, 3748, + 3738, 3203, 3748, + 3738, 3203, 3747, + 3738, 3203, 3747, + 3738, 3203, 3747, + 3738, 3204, 3747, + 3737, 3204, 3747, + 3737, 3205, 3746, + 3736, 3206, 3746, + 3736, 3207, 3745, + 3734, 3209, 3745, + 3733, 3211, 3744, + 3731, 3214, 3742, + 3728, 3217, 3740, + 3725, 3222, 3738, + 3720, 3229, 3734, + 3714, 3238, 3729, + 3705, 3249, 3723, + 3693, 3264, 3714, + 3677, 3283, 3703, + 3654, 3307, 3686, + 3621, 3338, 3663, + 3574, 3375, 3631, + 3501, 3422, 3584, + 3381, 3477, 3512, + 3147, 3541, 3393, + 2084, 3616, 3162, + 0, 3699, 2171, + 0, 3791, 0, + 3893, 3244, 3833, + 3893, 3244, 3833, + 3893, 3244, 3833, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3244, 3832, + 3893, 3245, 3832, + 3892, 3245, 3832, + 3892, 3246, 3832, + 3892, 3247, 3831, + 3891, 3248, 3831, + 3890, 3249, 3830, + 3889, 3251, 3829, + 3888, 3254, 3828, + 3886, 3257, 3826, + 3884, 3262, 3824, + 3880, 3268, 3821, + 3876, 3276, 3817, + 3870, 3286, 3812, + 3861, 3300, 3805, + 3850, 3318, 3795, + 3835, 3340, 3782, + 3813, 3368, 3764, + 3782, 3404, 3738, + 3738, 3447, 3701, + 3670, 3500, 3646, + 3561, 3561, 3561, + 3357, 3633, 3415, + 2705, 3713, 3092, + 0, 3803, 0, + 4041, 3293, 3926, + 4041, 3293, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3294, 3926, + 4041, 3295, 3925, + 4041, 3295, 3925, + 4041, 3296, 3925, + 4040, 3296, 3925, + 4040, 3297, 3924, + 4039, 3299, 3924, + 4039, 3300, 3923, + 4038, 3303, 3922, + 4036, 3306, 3921, + 4034, 3310, 3919, + 4032, 3315, 3917, + 4029, 3322, 3914, + 4025, 3332, 3909, + 4019, 3344, 3904, + 4011, 3360, 3896, + 4000, 3381, 3885, + 3985, 3407, 3871, + 3964, 3440, 3850, + 3935, 3480, 3822, + 3892, 3529, 3781, + 3829, 3587, 3719, + 3726, 3654, 3620, + 3539, 3732, 3443, + 3019, 3818, 2979, + 4095, 3353, 4027, + 4095, 3353, 4027, + 4095, 3353, 4027, + 4095, 3353, 4027, + 4095, 3353, 4026, + 4095, 3353, 4026, + 4095, 3353, 4026, + 4095, 3353, 4026, + 4095, 3354, 4026, + 4095, 3354, 4026, + 4095, 3354, 4026, + 4095, 3355, 4026, + 4095, 3356, 4025, + 4095, 3357, 4025, + 4095, 3359, 4024, + 4095, 3361, 4024, + 4095, 3363, 4023, + 4095, 3367, 4021, + 4095, 3372, 4019, + 4095, 3378, 4017, + 4095, 3387, 4013, + 4095, 3397, 4009, + 4095, 3412, 4003, + 4095, 3430, 3994, + 4095, 3454, 3983, + 4095, 3483, 3967, + 4095, 3520, 3945, + 4082, 3565, 3914, + 4041, 3619, 3869, + 3979, 3682, 3800, + 3881, 3755, 3689, + 3706, 3837, 3477, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3421, 4095, + 4095, 3422, 4095, + 4095, 3422, 4095, + 4095, 3422, 4095, + 4095, 3422, 4095, + 4095, 3423, 4095, + 4095, 3423, 4095, + 4095, 3424, 4095, + 4095, 3425, 4095, + 4095, 3426, 4095, + 4095, 3428, 4095, + 4095, 3431, 4095, + 4095, 3434, 4095, + 4095, 3438, 4095, + 4095, 3443, 4095, + 4095, 3451, 4095, + 4095, 3460, 4095, + 4095, 3473, 4095, + 4095, 3489, 4095, + 4095, 3509, 4095, + 4095, 3536, 4087, + 4095, 3568, 4071, + 4095, 3609, 4047, + 4095, 3658, 4014, + 4095, 3717, 3965, + 4095, 3785, 3891, + 4030, 3862, 3767, + 0, 3184, 3454, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3452, + 0, 3186, 3452, + 0, 3187, 3451, + 0, 3188, 3450, + 0, 3189, 3449, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3439, + 0, 3205, 3434, + 0, 3212, 3427, + 0, 3221, 3418, + 0, 3233, 3405, + 0, 3248, 3388, + 0, 3268, 3363, + 0, 3293, 3328, + 0, 3324, 3276, + 0, 3363, 3196, + 0, 3410, 3061, + 0, 3467, 2779, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3452, + 0, 3186, 3452, + 0, 3187, 3451, + 0, 3188, 3451, + 0, 3189, 3449, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3439, + 0, 3205, 3434, + 0, 3212, 3427, + 0, 3221, 3418, + 0, 3233, 3405, + 0, 3248, 3388, + 0, 3268, 3363, + 0, 3293, 3328, + 0, 3324, 3276, + 0, 3363, 3196, + 0, 3410, 3061, + 0, 3467, 2779, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3453, + 0, 3186, 3452, + 0, 3187, 3451, + 0, 3188, 3451, + 0, 3189, 3449, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3439, + 0, 3205, 3434, + 0, 3212, 3428, + 0, 3221, 3418, + 0, 3233, 3406, + 0, 3248, 3388, + 0, 3268, 3363, + 0, 3293, 3328, + 0, 3324, 3277, + 0, 3363, 3197, + 0, 3411, 3062, + 0, 3467, 2780, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3185, 3453, + 0, 3186, 3453, + 0, 3186, 3452, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3440, + 0, 3205, 3434, + 0, 3212, 3428, + 0, 3221, 3418, + 0, 3233, 3406, + 0, 3248, 3388, + 0, 3268, 3364, + 0, 3293, 3328, + 0, 3324, 3277, + 0, 3363, 3197, + 0, 3411, 3062, + 0, 3467, 2780, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3184, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3453, + 0, 3186, 3453, + 0, 3186, 3453, + 0, 3186, 3452, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3443, + 0, 3200, 3440, + 0, 3205, 3435, + 0, 3212, 3428, + 0, 3221, 3419, + 0, 3233, 3406, + 0, 3248, 3388, + 0, 3268, 3364, + 0, 3293, 3329, + 0, 3324, 3277, + 0, 3363, 3197, + 0, 3411, 3062, + 0, 3467, 2781, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3186, 3453, + 0, 3186, 3453, + 0, 3186, 3453, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3448, + 0, 3193, 3446, + 0, 3196, 3444, + 0, 3200, 3440, + 0, 3205, 3435, + 0, 3212, 3428, + 0, 3221, 3419, + 0, 3233, 3406, + 0, 3248, 3389, + 0, 3268, 3364, + 0, 3293, 3329, + 0, 3324, 3277, + 0, 3363, 3198, + 0, 3411, 3063, + 0, 3467, 2782, + 0, 3533, 0, + 0, 3608, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3185, 3454, + 0, 3186, 3454, + 0, 3186, 3453, + 0, 3187, 3453, + 0, 3187, 3452, + 0, 3188, 3451, + 0, 3189, 3450, + 0, 3191, 3449, + 0, 3193, 3447, + 0, 3196, 3444, + 0, 3200, 3440, + 0, 3205, 3435, + 0, 3212, 3428, + 0, 3221, 3419, + 0, 3233, 3406, + 0, 3248, 3389, + 0, 3268, 3364, + 0, 3293, 3329, + 0, 3324, 3278, + 0, 3363, 3198, + 0, 3411, 3064, + 0, 3467, 2783, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3454, + 0, 3186, 3454, + 0, 3186, 3454, + 0, 3187, 3453, + 0, 3187, 3453, + 0, 3188, 3452, + 0, 3190, 3451, + 0, 3191, 3449, + 0, 3193, 3447, + 0, 3196, 3444, + 0, 3200, 3441, + 0, 3205, 3436, + 0, 3212, 3429, + 0, 3221, 3420, + 0, 3233, 3407, + 0, 3248, 3389, + 0, 3268, 3365, + 0, 3293, 3330, + 0, 3324, 3278, + 0, 3363, 3199, + 0, 3411, 3065, + 0, 3467, 2785, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3185, 3455, + 0, 3186, 3455, + 0, 3186, 3455, + 0, 3186, 3454, + 0, 3187, 3454, + 0, 3187, 3453, + 0, 3188, 3452, + 0, 3190, 3451, + 0, 3191, 3450, + 0, 3194, 3448, + 0, 3197, 3445, + 0, 3200, 3441, + 0, 3206, 3436, + 0, 3212, 3429, + 0, 3221, 3420, + 0, 3233, 3407, + 0, 3248, 3390, + 0, 3268, 3365, + 0, 3293, 3331, + 0, 3325, 3279, + 0, 3363, 3200, + 0, 3411, 3066, + 0, 3467, 2787, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3185, 3456, + 0, 3186, 3456, + 0, 3186, 3456, + 0, 3186, 3455, + 0, 3186, 3455, + 0, 3187, 3455, + 0, 3188, 3454, + 0, 3189, 3453, + 0, 3190, 3452, + 0, 3192, 3450, + 0, 3194, 3448, + 0, 3197, 3446, + 0, 3201, 3442, + 0, 3206, 3437, + 0, 3213, 3430, + 0, 3222, 3421, + 0, 3233, 3408, + 0, 3249, 3391, + 0, 3268, 3366, + 0, 3293, 3331, + 0, 3325, 3280, + 0, 3364, 3201, + 0, 3411, 3067, + 0, 3467, 2790, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3185, 3457, + 0, 3185, 3457, + 0, 3185, 3457, + 0, 3185, 3457, + 0, 3186, 3457, + 0, 3186, 3457, + 0, 3186, 3457, + 0, 3186, 3456, + 0, 3187, 3456, + 0, 3187, 3456, + 0, 3188, 3455, + 0, 3189, 3454, + 0, 3190, 3453, + 0, 3192, 3451, + 0, 3194, 3449, + 0, 3197, 3447, + 0, 3201, 3443, + 0, 3206, 3438, + 0, 3213, 3431, + 0, 3222, 3422, + 0, 3234, 3409, + 0, 3249, 3392, + 0, 3268, 3368, + 0, 3293, 3333, + 0, 3325, 3282, + 0, 3364, 3203, + 0, 3411, 3070, + 0, 3467, 2794, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3186, 3459, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3186, 3458, + 0, 3187, 3458, + 0, 3187, 3457, + 0, 3188, 3457, + 0, 3188, 3456, + 0, 3189, 3455, + 0, 3190, 3454, + 0, 3192, 3453, + 0, 3194, 3451, + 0, 3197, 3448, + 0, 3201, 3444, + 0, 3206, 3439, + 0, 3213, 3432, + 0, 3222, 3423, + 0, 3234, 3411, + 0, 3249, 3393, + 0, 3269, 3369, + 0, 3294, 3334, + 0, 3325, 3283, + 0, 3364, 3205, + 0, 3411, 3073, + 0, 3468, 2800, + 0, 3533, 0, + 0, 3609, 0, + 0, 3693, 0, + 0, 3786, 0, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3186, 3460, + 0, 3187, 3460, + 0, 3187, 3460, + 0, 3187, 3459, + 0, 3187, 3459, + 0, 3188, 3458, + 0, 3189, 3458, + 0, 3190, 3457, + 0, 3191, 3456, + 0, 3193, 3454, + 0, 3195, 3452, + 0, 3198, 3450, + 0, 3202, 3446, + 0, 3207, 3441, + 0, 3214, 3434, + 0, 3223, 3425, + 0, 3234, 3413, + 0, 3250, 3395, + 0, 3269, 3371, + 0, 3294, 3337, + 0, 3325, 3286, + 0, 3364, 3208, + 0, 3411, 3077, + 0, 3468, 2807, + 0, 3534, 0, + 0, 3609, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3187, 3462, + 0, 3188, 3462, + 0, 3188, 3461, + 0, 3189, 3461, + 0, 3189, 3460, + 0, 3190, 3459, + 0, 3191, 3458, + 0, 3193, 3457, + 0, 3195, 3455, + 0, 3198, 3452, + 0, 3202, 3448, + 0, 3207, 3443, + 0, 3214, 3437, + 0, 3223, 3428, + 0, 3235, 3415, + 0, 3250, 3398, + 0, 3270, 3374, + 0, 3295, 3339, + 0, 3326, 3289, + 0, 3365, 3212, + 0, 3412, 3082, + 0, 3468, 2816, + 0, 3534, 0, + 0, 3609, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3187, 3465, + 0, 3187, 3465, + 0, 3187, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3188, 3465, + 0, 3189, 3464, + 0, 3189, 3464, + 0, 3190, 3463, + 0, 3191, 3462, + 0, 3192, 3461, + 0, 3194, 3460, + 0, 3196, 3458, + 0, 3199, 3455, + 0, 3203, 3451, + 0, 3208, 3446, + 0, 3215, 3440, + 0, 3224, 3431, + 0, 3235, 3418, + 0, 3251, 3401, + 0, 3270, 3377, + 0, 3295, 3343, + 0, 3326, 3293, + 0, 3365, 3217, + 0, 3412, 3089, + 0, 3469, 2829, + 0, 3534, 0, + 0, 3610, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3188, 3469, + 0, 3188, 3469, + 0, 3188, 3469, + 0, 3189, 3469, + 0, 3189, 3469, + 0, 3189, 3469, + 0, 3189, 3469, + 0, 3189, 3468, + 0, 3190, 3468, + 0, 3190, 3468, + 0, 3191, 3467, + 0, 3192, 3466, + 0, 3193, 3465, + 0, 3195, 3464, + 0, 3197, 3462, + 0, 3200, 3459, + 0, 3204, 3455, + 0, 3209, 3451, + 0, 3216, 3444, + 0, 3225, 3435, + 0, 3236, 3423, + 0, 3252, 3406, + 0, 3271, 3382, + 0, 3296, 3349, + 0, 3327, 3299, + 0, 3366, 3224, + 0, 3413, 3098, + 0, 3469, 2844, + 0, 3535, 106, + 0, 3610, 0, + 0, 3694, 0, + 0, 3787, 0, + 0, 3190, 3475, + 0, 3190, 3475, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3190, 3474, + 0, 3191, 3474, + 0, 3191, 3473, + 0, 3192, 3473, + 0, 3192, 3472, + 0, 3193, 3471, + 0, 3195, 3470, + 0, 3196, 3469, + 0, 3198, 3467, + 0, 3201, 3464, + 0, 3205, 3461, + 0, 3210, 3456, + 0, 3217, 3449, + 0, 3226, 3441, + 0, 3238, 3429, + 0, 3253, 3412, + 0, 3272, 3389, + 0, 3297, 3355, + 0, 3328, 3307, + 0, 3367, 3233, + 0, 3414, 3109, + 0, 3470, 2865, + 0, 3535, 1466, + 0, 3611, 0, + 0, 3695, 0, + 0, 3788, 0, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3192, 3481, + 0, 3193, 3481, + 0, 3193, 3480, + 0, 3193, 3480, + 0, 3194, 3479, + 0, 3195, 3478, + 0, 3196, 3477, + 0, 3198, 3476, + 0, 3200, 3474, + 0, 3203, 3471, + 0, 3207, 3468, + 0, 3212, 3463, + 0, 3219, 3457, + 0, 3228, 3448, + 0, 3239, 3436, + 0, 3254, 3420, + 0, 3274, 3397, + 0, 3298, 3364, + 0, 3329, 3317, + 0, 3368, 3244, + 0, 3415, 3125, + 0, 3471, 2891, + 0, 3536, 1839, + 0, 3611, 0, + 0, 3695, 0, + 0, 3788, 0, + 0, 3194, 3491, + 0, 3194, 3491, + 0, 3194, 3490, + 0, 3194, 3490, + 0, 3194, 3490, + 0, 3194, 3490, + 0, 3195, 3490, + 0, 3195, 3490, + 0, 3195, 3489, + 0, 3196, 3489, + 0, 3197, 3488, + 0, 3197, 3488, + 0, 3199, 3487, + 0, 3200, 3485, + 0, 3202, 3483, + 0, 3205, 3481, + 0, 3209, 3477, + 0, 3214, 3473, + 0, 3221, 3466, + 0, 3230, 3458, + 0, 3241, 3446, + 0, 3256, 3430, + 0, 3276, 3408, + 0, 3300, 3376, + 0, 3331, 3330, + 0, 3370, 3259, + 0, 3416, 3144, + 0, 3472, 2923, + 0, 3537, 2093, + 0, 3612, 0, + 0, 3696, 0, + 0, 3789, 0, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3197, 3502, + 0, 3198, 3502, + 0, 3198, 3502, + 0, 3198, 3502, + 0, 3199, 3501, + 0, 3199, 3501, + 0, 3200, 3500, + 0, 3201, 3500, + 0, 3202, 3498, + 0, 3203, 3497, + 0, 3206, 3495, + 0, 3209, 3493, + 0, 3212, 3489, + 0, 3217, 3485, + 0, 3224, 3479, + 0, 3233, 3471, + 0, 3244, 3459, + 0, 3259, 3444, + 0, 3278, 3422, + 0, 3303, 3391, + 0, 3334, 3347, + 0, 3372, 3279, + 0, 3418, 3169, + 0, 3474, 2963, + 0, 3539, 2299, + 0, 3613, 0, + 0, 3697, 0, + 0, 3790, 0, + 0, 3201, 3518, + 0, 3201, 3518, + 0, 3202, 3518, + 0, 3202, 3518, + 0, 3202, 3518, + 0, 3202, 3517, + 0, 3202, 3517, + 0, 3202, 3517, + 0, 3203, 3517, + 0, 3203, 3516, + 0, 3204, 3516, + 0, 3205, 3515, + 0, 3206, 3514, + 0, 3208, 3513, + 0, 3210, 3511, + 0, 3213, 3508, + 0, 3216, 3505, + 0, 3221, 3501, + 0, 3228, 3495, + 0, 3237, 3487, + 0, 3248, 3476, + 0, 3263, 3461, + 0, 3282, 3440, + 0, 3306, 3411, + 0, 3337, 3368, + 0, 3375, 3304, + 0, 3421, 3201, + 0, 3476, 3012, + 0, 3541, 2479, + 0, 3615, 0, + 0, 3699, 0, + 0, 3791, 0, + 0, 3207, 3538, + 0, 3207, 3538, + 0, 3207, 3537, + 0, 3207, 3537, + 0, 3207, 3537, + 0, 3207, 3537, + 0, 3208, 3537, + 0, 3208, 3537, + 0, 3208, 3537, + 0, 3209, 3536, + 0, 3210, 3536, + 0, 3210, 3535, + 0, 3212, 3534, + 0, 3213, 3533, + 0, 3215, 3531, + 0, 3218, 3529, + 0, 3222, 3526, + 0, 3227, 3521, + 0, 3233, 3516, + 0, 3242, 3508, + 0, 3253, 3498, + 0, 3268, 3483, + 0, 3287, 3464, + 0, 3311, 3436, + 0, 3341, 3395, + 0, 3379, 3335, + 0, 3424, 3240, + 0, 3479, 3069, + 0, 3544, 2644, + 0, 3617, 0, + 0, 3701, 0, + 0, 3792, 0, + 1728, 3214, 3563, + 1725, 3214, 3563, + 1722, 3215, 3563, + 1717, 3215, 3563, + 1710, 3215, 3563, + 1701, 3215, 3562, + 1688, 3215, 3562, + 1671, 3215, 3562, + 1647, 3216, 3562, + 1612, 3216, 3561, + 1562, 3217, 3561, + 1483, 3218, 3560, + 1352, 3219, 3559, + 1082, 3220, 3558, + 0, 3223, 3557, + 0, 3225, 3554, + 0, 3229, 3551, + 0, 3234, 3548, + 0, 3240, 3542, + 0, 3249, 3535, + 0, 3260, 3525, + 0, 3274, 3512, + 0, 3293, 3493, + 0, 3317, 3467, + 0, 3346, 3429, + 0, 3384, 3374, + 0, 3429, 3287, + 0, 3483, 3137, + 0, 3547, 2799, + 0, 3620, 0, + 0, 3703, 0, + 0, 3794, 0, + 2722, 3224, 3594, + 2721, 3224, 3594, + 2721, 3224, 3594, + 2720, 3224, 3594, + 2720, 3224, 3594, + 2719, 3225, 3594, + 2717, 3225, 3594, + 2716, 3225, 3594, + 2713, 3225, 3593, + 2710, 3226, 3593, + 2706, 3227, 3593, + 2700, 3227, 3592, + 2692, 3229, 3591, + 2681, 3230, 3590, + 2666, 3232, 3589, + 2646, 3235, 3587, + 2617, 3238, 3584, + 2574, 3243, 3580, + 2511, 3250, 3575, + 2410, 3258, 3569, + 2224, 3269, 3559, + 1718, 3283, 3547, + 0, 3301, 3530, + 0, 3324, 3506, + 0, 3354, 3471, + 0, 3390, 3421, + 0, 3435, 3343, + 0, 3489, 3214, + 0, 3552, 2948, + 0, 3624, 0, + 0, 3706, 0, + 0, 3797, 0, + 3077, 3237, 3634, + 3077, 3237, 3634, + 3077, 3237, 3633, + 3077, 3237, 3633, + 3076, 3237, 3633, + 3076, 3237, 3633, + 3075, 3237, 3633, + 3075, 3238, 3633, + 3073, 3238, 3633, + 3072, 3239, 3632, + 3070, 3239, 3632, + 3068, 3240, 3631, + 3064, 3241, 3631, + 3059, 3243, 3630, + 3053, 3245, 3628, + 3044, 3247, 3626, + 3032, 3251, 3624, + 3016, 3255, 3621, + 2993, 3262, 3616, + 2960, 3270, 3610, + 2913, 3280, 3602, + 2840, 3294, 3590, + 2720, 3312, 3575, + 2485, 3335, 3553, + 1404, 3363, 3522, + 0, 3399, 3477, + 0, 3443, 3409, + 0, 3496, 3299, + 0, 3558, 3092, + 0, 3630, 2417, + 0, 3711, 0, + 0, 3801, 0, + 3325, 3253, 3681, + 3325, 3253, 3681, + 3325, 3253, 3681, + 3325, 3253, 3681, + 3325, 3254, 3681, + 3325, 3254, 3681, + 3324, 3254, 3681, + 3324, 3254, 3681, + 3323, 3254, 3680, + 3322, 3255, 3680, + 3321, 3255, 3680, + 3320, 3256, 3679, + 3318, 3257, 3678, + 3315, 3259, 3678, + 3311, 3261, 3676, + 3306, 3263, 3675, + 3300, 3267, 3672, + 3291, 3271, 3669, + 3278, 3277, 3665, + 3261, 3285, 3660, + 3237, 3295, 3652, + 3203, 3308, 3642, + 3153, 3326, 3628, + 3076, 3348, 3609, + 2947, 3376, 3582, + 2685, 3411, 3543, + 0, 3454, 3485, + 0, 3505, 3394, + 0, 3566, 3233, + 0, 3637, 2852, + 0, 3717, 0, + 0, 3805, 0, + 3528, 3274, 3738, + 3528, 3274, 3738, + 3528, 3274, 3738, + 3528, 3274, 3738, + 3528, 3275, 3738, + 3528, 3275, 3738, + 3527, 3275, 3737, + 3527, 3275, 3737, + 3527, 3275, 3737, + 3526, 3276, 3737, + 3525, 3276, 3737, + 3525, 3277, 3736, + 3523, 3278, 3735, + 3522, 3280, 3735, + 3519, 3281, 3734, + 3516, 3284, 3732, + 3512, 3287, 3730, + 3506, 3291, 3728, + 3499, 3297, 3724, + 3488, 3305, 3719, + 3474, 3314, 3713, + 3454, 3327, 3704, + 3426, 3344, 3692, + 3385, 3365, 3675, + 3324, 3392, 3652, + 3228, 3426, 3618, + 3055, 3467, 3570, + 2618, 3517, 3495, + 0, 3577, 3371, + 0, 3646, 3125, + 0, 3724, 1639, + 0, 3812, 0, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3707, 3301, 3804, + 3706, 3301, 3804, + 3706, 3302, 3804, + 3706, 3302, 3804, + 3706, 3302, 3803, + 3705, 3303, 3803, + 3705, 3303, 3803, + 3704, 3304, 3803, + 3703, 3305, 3802, + 3702, 3306, 3801, + 3701, 3308, 3800, + 3699, 3310, 3799, + 3696, 3313, 3797, + 3692, 3317, 3795, + 3687, 3323, 3792, + 3680, 3330, 3788, + 3671, 3339, 3782, + 3658, 3351, 3775, + 3640, 3367, 3764, + 3615, 3387, 3750, + 3580, 3413, 3730, + 3527, 3445, 3703, + 3446, 3485, 3663, + 3308, 3533, 3603, + 3017, 3591, 3508, + 0, 3658, 3340, + 0, 3734, 2924, + 0, 3820, 0, + 3871, 3334, 3880, + 3871, 3334, 3880, + 3871, 3335, 3880, + 3871, 3335, 3880, + 3871, 3335, 3880, + 3871, 3335, 3880, + 3870, 3335, 3880, + 3870, 3335, 3879, + 3870, 3335, 3879, + 3870, 3336, 3879, + 3869, 3336, 3879, + 3869, 3337, 3879, + 3868, 3338, 3878, + 3868, 3339, 3878, + 3867, 3341, 3877, + 3865, 3343, 3876, + 3863, 3346, 3874, + 3861, 3349, 3872, + 3857, 3354, 3870, + 3852, 3361, 3866, + 3846, 3370, 3862, + 3837, 3381, 3855, + 3825, 3396, 3846, + 3809, 3415, 3835, + 3786, 3439, 3818, + 3753, 3470, 3796, + 3706, 3507, 3763, + 3633, 3554, 3716, + 3513, 3609, 3644, + 3279, 3673, 3525, + 2216, 3748, 3294, + 0, 3831, 2303, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3965, + 4025, 3376, 3964, + 4025, 3376, 3964, + 4025, 3377, 3964, + 4025, 3377, 3964, + 4024, 3377, 3964, + 4024, 3378, 3964, + 4024, 3379, 3963, + 4023, 3380, 3963, + 4022, 3381, 3962, + 4021, 3383, 3961, + 4020, 3386, 3960, + 4018, 3389, 3958, + 4016, 3394, 3956, + 4012, 3400, 3953, + 4008, 3408, 3950, + 4002, 3418, 3944, + 3993, 3432, 3937, + 3982, 3450, 3928, + 3967, 3472, 3914, + 3945, 3501, 3896, + 3914, 3536, 3870, + 3870, 3579, 3833, + 3803, 3632, 3779, + 3693, 3693, 3693, + 3489, 3765, 3547, + 2837, 3845, 3224, + 4095, 3425, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3426, 4058, + 4095, 3427, 4057, + 4095, 3427, 4057, + 4095, 3428, 4057, + 4095, 3428, 4057, + 4095, 3429, 4056, + 4095, 3431, 4056, + 4095, 3432, 4055, + 4095, 3435, 4054, + 4095, 3438, 4053, + 4095, 3442, 4051, + 4095, 3447, 4049, + 4095, 3455, 4046, + 4095, 3464, 4041, + 4095, 3476, 4036, + 4095, 3492, 4028, + 4095, 3513, 4017, + 4095, 3539, 4003, + 4095, 3572, 3982, + 4067, 3612, 3954, + 4024, 3661, 3913, + 3961, 3719, 3851, + 3858, 3787, 3752, + 3671, 3864, 3575, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3485, 4095, + 4095, 3486, 4095, + 4095, 3486, 4095, + 4095, 3486, 4095, + 4095, 3487, 4095, + 4095, 3488, 4095, + 4095, 3489, 4095, + 4095, 3491, 4095, + 4095, 3493, 4095, + 4095, 3495, 4095, + 4095, 3499, 4095, + 4095, 3504, 4095, + 4095, 3510, 4095, + 4095, 3519, 4095, + 4095, 3530, 4095, + 4095, 3544, 4095, + 4095, 3562, 4095, + 4095, 3586, 4095, + 4095, 3615, 4095, + 4095, 3652, 4077, + 4095, 3697, 4046, + 4095, 3751, 4001, + 4095, 3814, 3932, + 4014, 3887, 3821, + 0, 3316, 3586, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3584, + 0, 3318, 3584, + 0, 3319, 3583, + 0, 3320, 3582, + 0, 3321, 3581, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3559, + 0, 3353, 3550, + 0, 3365, 3537, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3408, + 0, 3495, 3328, + 0, 3543, 3193, + 0, 3599, 2911, + 0, 3665, 0, + 0, 3740, 0, + 0, 3825, 0, + 0, 3316, 3586, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3583, + 0, 3320, 3583, + 0, 3321, 3581, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3559, + 0, 3353, 3550, + 0, 3365, 3537, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3408, + 0, 3495, 3328, + 0, 3543, 3193, + 0, 3599, 2911, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3316, 3586, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3583, + 0, 3320, 3583, + 0, 3321, 3581, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3560, + 0, 3353, 3550, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3408, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2911, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3316, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3571, + 0, 3337, 3566, + 0, 3344, 3560, + 0, 3353, 3550, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3495, + 0, 3425, 3460, + 0, 3456, 3409, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2912, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3585, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3318, 3584, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3575, + 0, 3332, 3572, + 0, 3337, 3567, + 0, 3344, 3560, + 0, 3353, 3551, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3496, + 0, 3425, 3460, + 0, 3456, 3409, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2912, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3318, 3585, + 0, 3318, 3585, + 0, 3319, 3584, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3580, + 0, 3325, 3578, + 0, 3328, 3576, + 0, 3332, 3572, + 0, 3337, 3567, + 0, 3344, 3560, + 0, 3353, 3551, + 0, 3365, 3538, + 0, 3380, 3520, + 0, 3400, 3496, + 0, 3425, 3461, + 0, 3456, 3409, + 0, 3495, 3329, + 0, 3543, 3194, + 0, 3599, 2913, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3318, 3586, + 0, 3318, 3585, + 0, 3319, 3585, + 0, 3319, 3584, + 0, 3320, 3583, + 0, 3321, 3582, + 0, 3323, 3581, + 0, 3325, 3579, + 0, 3328, 3576, + 0, 3332, 3572, + 0, 3337, 3567, + 0, 3344, 3560, + 0, 3353, 3551, + 0, 3365, 3538, + 0, 3380, 3521, + 0, 3400, 3496, + 0, 3425, 3461, + 0, 3456, 3409, + 0, 3495, 3330, + 0, 3543, 3195, + 0, 3599, 2914, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3317, 3586, + 0, 3318, 3586, + 0, 3318, 3585, + 0, 3319, 3585, + 0, 3319, 3584, + 0, 3320, 3584, + 0, 3322, 3582, + 0, 3323, 3581, + 0, 3325, 3579, + 0, 3328, 3576, + 0, 3332, 3572, + 0, 3338, 3567, + 0, 3344, 3561, + 0, 3353, 3551, + 0, 3365, 3539, + 0, 3380, 3521, + 0, 3400, 3496, + 0, 3425, 3461, + 0, 3456, 3410, + 0, 3495, 3330, + 0, 3543, 3196, + 0, 3599, 2915, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3318, 3587, + 0, 3318, 3586, + 0, 3318, 3586, + 0, 3319, 3585, + 0, 3319, 3585, + 0, 3320, 3584, + 0, 3322, 3583, + 0, 3323, 3581, + 0, 3326, 3579, + 0, 3328, 3576, + 0, 3332, 3573, + 0, 3338, 3568, + 0, 3344, 3561, + 0, 3353, 3552, + 0, 3365, 3539, + 0, 3380, 3521, + 0, 3400, 3497, + 0, 3425, 3462, + 0, 3457, 3410, + 0, 3495, 3331, + 0, 3543, 3197, + 0, 3599, 2917, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3317, 3587, + 0, 3318, 3587, + 0, 3318, 3587, + 0, 3318, 3586, + 0, 3319, 3586, + 0, 3320, 3585, + 0, 3321, 3584, + 0, 3322, 3583, + 0, 3323, 3582, + 0, 3326, 3580, + 0, 3329, 3577, + 0, 3333, 3573, + 0, 3338, 3568, + 0, 3345, 3561, + 0, 3354, 3552, + 0, 3365, 3540, + 0, 3381, 3522, + 0, 3400, 3498, + 0, 3425, 3463, + 0, 3457, 3411, + 0, 3496, 3332, + 0, 3543, 3198, + 0, 3599, 2919, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3317, 3588, + 0, 3318, 3588, + 0, 3318, 3588, + 0, 3318, 3587, + 0, 3319, 3587, + 0, 3319, 3587, + 0, 3320, 3586, + 0, 3321, 3585, + 0, 3322, 3584, + 0, 3324, 3583, + 0, 3326, 3580, + 0, 3329, 3578, + 0, 3333, 3574, + 0, 3338, 3569, + 0, 3345, 3562, + 0, 3354, 3553, + 0, 3365, 3540, + 0, 3381, 3523, + 0, 3400, 3498, + 0, 3425, 3464, + 0, 3457, 3412, + 0, 3496, 3333, + 0, 3543, 3200, + 0, 3599, 2922, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3317, 3589, + 0, 3317, 3589, + 0, 3317, 3589, + 0, 3317, 3589, + 0, 3318, 3589, + 0, 3318, 3589, + 0, 3318, 3589, + 0, 3318, 3589, + 0, 3318, 3588, + 0, 3319, 3588, + 0, 3319, 3588, + 0, 3320, 3587, + 0, 3321, 3586, + 0, 3322, 3585, + 0, 3324, 3583, + 0, 3326, 3581, + 0, 3329, 3579, + 0, 3333, 3575, + 0, 3338, 3570, + 0, 3345, 3563, + 0, 3354, 3554, + 0, 3366, 3541, + 0, 3381, 3524, + 0, 3401, 3500, + 0, 3426, 3465, + 0, 3457, 3414, + 0, 3496, 3335, + 0, 3543, 3202, + 0, 3600, 2927, + 0, 3665, 0, + 0, 3741, 0, + 0, 3825, 0, + 0, 3318, 3591, + 0, 3318, 3591, + 0, 3318, 3591, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3318, 3590, + 0, 3319, 3590, + 0, 3319, 3589, + 0, 3320, 3589, + 0, 3320, 3588, + 0, 3321, 3587, + 0, 3323, 3586, + 0, 3324, 3585, + 0, 3326, 3583, + 0, 3329, 3580, + 0, 3333, 3576, + 0, 3338, 3571, + 0, 3345, 3565, + 0, 3354, 3555, + 0, 3366, 3543, + 0, 3381, 3525, + 0, 3401, 3501, + 0, 3426, 3466, + 0, 3457, 3415, + 0, 3496, 3337, + 0, 3543, 3205, + 0, 3600, 2932, + 0, 3666, 0, + 0, 3741, 0, + 0, 3826, 0, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3318, 3592, + 0, 3319, 3592, + 0, 3319, 3592, + 0, 3319, 3591, + 0, 3320, 3591, + 0, 3320, 3591, + 0, 3321, 3590, + 0, 3322, 3589, + 0, 3323, 3588, + 0, 3325, 3586, + 0, 3327, 3584, + 0, 3330, 3582, + 0, 3334, 3578, + 0, 3339, 3573, + 0, 3346, 3566, + 0, 3355, 3557, + 0, 3366, 3545, + 0, 3382, 3527, + 0, 3401, 3503, + 0, 3426, 3469, + 0, 3458, 3418, + 0, 3496, 3340, + 0, 3544, 3209, + 0, 3600, 2939, + 0, 3666, 0, + 0, 3741, 0, + 0, 3826, 0, + 0, 3319, 3595, + 0, 3319, 3595, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3319, 3594, + 0, 3320, 3594, + 0, 3320, 3593, + 0, 3321, 3593, + 0, 3321, 3592, + 0, 3322, 3591, + 0, 3324, 3590, + 0, 3325, 3589, + 0, 3327, 3587, + 0, 3330, 3584, + 0, 3334, 3580, + 0, 3339, 3575, + 0, 3346, 3569, + 0, 3355, 3560, + 0, 3367, 3547, + 0, 3382, 3530, + 0, 3402, 3506, + 0, 3427, 3472, + 0, 3458, 3421, + 0, 3497, 3344, + 0, 3544, 3214, + 0, 3600, 2948, + 0, 3666, 0, + 0, 3741, 0, + 0, 3826, 0, + 0, 3319, 3598, + 0, 3319, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3320, 3597, + 0, 3321, 3596, + 0, 3321, 3596, + 0, 3322, 3595, + 0, 3323, 3594, + 0, 3324, 3593, + 0, 3326, 3592, + 0, 3328, 3590, + 0, 3331, 3587, + 0, 3335, 3583, + 0, 3340, 3579, + 0, 3347, 3572, + 0, 3356, 3563, + 0, 3368, 3550, + 0, 3383, 3533, + 0, 3402, 3510, + 0, 3427, 3475, + 0, 3459, 3426, + 0, 3497, 3349, + 0, 3544, 3221, + 0, 3601, 2961, + 0, 3666, 0, + 0, 3742, 0, + 0, 3826, 0, + 0, 3320, 3601, + 0, 3320, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3321, 3601, + 0, 3322, 3600, + 0, 3322, 3600, + 0, 3323, 3599, + 0, 3324, 3598, + 0, 3325, 3597, + 0, 3327, 3596, + 0, 3329, 3594, + 0, 3332, 3591, + 0, 3336, 3587, + 0, 3341, 3583, + 0, 3348, 3576, + 0, 3357, 3567, + 0, 3368, 3555, + 0, 3384, 3538, + 0, 3403, 3514, + 0, 3428, 3481, + 0, 3459, 3431, + 0, 3498, 3356, + 0, 3545, 3230, + 0, 3601, 2976, + 0, 3667, 238, + 0, 3742, 0, + 0, 3826, 0, + 0, 3322, 3607, + 0, 3322, 3607, + 0, 3322, 3607, + 0, 3322, 3607, + 0, 3322, 3606, + 0, 3322, 3606, + 0, 3322, 3606, + 0, 3323, 3606, + 0, 3323, 3606, + 0, 3323, 3605, + 0, 3324, 3605, + 0, 3324, 3604, + 0, 3325, 3604, + 0, 3327, 3603, + 0, 3328, 3601, + 0, 3330, 3599, + 0, 3333, 3596, + 0, 3337, 3593, + 0, 3342, 3588, + 0, 3349, 3582, + 0, 3358, 3573, + 0, 3370, 3561, + 0, 3385, 3544, + 0, 3404, 3521, + 0, 3429, 3487, + 0, 3460, 3439, + 0, 3499, 3365, + 0, 3546, 3241, + 0, 3602, 2997, + 0, 3668, 1599, + 0, 3743, 0, + 0, 3827, 0, + 0, 3324, 3614, + 0, 3324, 3614, + 0, 3324, 3614, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3324, 3613, + 0, 3325, 3613, + 0, 3325, 3612, + 0, 3326, 3612, + 0, 3326, 3611, + 0, 3327, 3611, + 0, 3328, 3609, + 0, 3330, 3608, + 0, 3332, 3606, + 0, 3335, 3603, + 0, 3339, 3600, + 0, 3344, 3595, + 0, 3351, 3589, + 0, 3360, 3580, + 0, 3371, 3568, + 0, 3386, 3552, + 0, 3406, 3529, + 0, 3431, 3496, + 0, 3462, 3449, + 0, 3500, 3376, + 0, 3547, 3257, + 0, 3603, 3023, + 0, 3668, 1971, + 0, 3743, 0, + 0, 3827, 0, + 0, 3326, 3623, + 0, 3326, 3623, + 0, 3326, 3623, + 0, 3326, 3623, + 0, 3326, 3622, + 0, 3326, 3622, + 0, 3327, 3622, + 0, 3327, 3622, + 0, 3327, 3622, + 0, 3327, 3621, + 0, 3328, 3621, + 0, 3329, 3620, + 0, 3330, 3620, + 0, 3331, 3619, + 0, 3332, 3617, + 0, 3335, 3615, + 0, 3337, 3613, + 0, 3341, 3609, + 0, 3346, 3605, + 0, 3353, 3598, + 0, 3362, 3590, + 0, 3374, 3578, + 0, 3388, 3562, + 0, 3408, 3540, + 0, 3432, 3508, + 0, 3463, 3462, + 0, 3502, 3392, + 0, 3548, 3276, + 0, 3604, 3055, + 0, 3669, 2225, + 0, 3744, 0, + 0, 3828, 0, + 0, 3329, 3635, + 0, 3329, 3635, + 0, 3329, 3634, + 0, 3329, 3634, + 0, 3329, 3634, + 0, 3330, 3634, + 0, 3330, 3634, + 0, 3330, 3634, + 0, 3330, 3634, + 0, 3331, 3633, + 0, 3331, 3633, + 0, 3332, 3632, + 0, 3333, 3632, + 0, 3334, 3631, + 0, 3336, 3629, + 0, 3338, 3627, + 0, 3341, 3625, + 0, 3344, 3622, + 0, 3349, 3617, + 0, 3356, 3611, + 0, 3365, 3603, + 0, 3376, 3591, + 0, 3391, 3576, + 0, 3410, 3554, + 0, 3435, 3523, + 0, 3466, 3479, + 0, 3504, 3411, + 0, 3550, 3301, + 0, 3606, 3095, + 0, 3671, 2431, + 0, 3746, 0, + 0, 3829, 0, + 0, 3333, 3650, + 0, 3333, 3650, + 0, 3334, 3650, + 0, 3334, 3650, + 0, 3334, 3650, + 0, 3334, 3650, + 0, 3334, 3649, + 0, 3334, 3649, + 0, 3334, 3649, + 0, 3335, 3649, + 0, 3335, 3648, + 0, 3336, 3648, + 0, 3337, 3647, + 0, 3338, 3646, + 0, 3340, 3645, + 0, 3342, 3643, + 0, 3345, 3641, + 0, 3349, 3637, + 0, 3354, 3633, + 0, 3360, 3627, + 0, 3369, 3619, + 0, 3380, 3608, + 0, 3395, 3593, + 0, 3414, 3572, + 0, 3438, 3543, + 0, 3469, 3500, + 0, 3507, 3436, + 0, 3553, 3333, + 0, 3608, 3144, + 0, 3673, 2611, + 0, 3747, 0, + 0, 3831, 0, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3670, + 0, 3339, 3669, + 0, 3340, 3669, + 0, 3340, 3669, + 0, 3340, 3669, + 0, 3340, 3669, + 0, 3341, 3668, + 0, 3342, 3668, + 0, 3343, 3667, + 0, 3344, 3666, + 0, 3345, 3665, + 0, 3347, 3663, + 0, 3350, 3661, + 0, 3354, 3658, + 0, 3359, 3654, + 0, 3365, 3648, + 0, 3374, 3640, + 0, 3385, 3630, + 0, 3400, 3616, + 0, 3419, 3596, + 0, 3443, 3568, + 0, 3473, 3527, + 0, 3511, 3467, + 0, 3556, 3372, + 0, 3611, 3202, + 0, 3676, 2776, + 0, 3750, 0, + 0, 3833, 0, + 1862, 3346, 3695, + 1860, 3347, 3695, + 1858, 3347, 3695, + 1854, 3347, 3695, + 1849, 3347, 3695, + 1842, 3347, 3695, + 1833, 3347, 3695, + 1821, 3347, 3694, + 1803, 3347, 3694, + 1779, 3348, 3694, + 1744, 3348, 3693, + 1694, 3349, 3693, + 1616, 3350, 3692, + 1484, 3351, 3691, + 1214, 3353, 3690, + 0, 3355, 3689, + 0, 3357, 3686, + 0, 3361, 3684, + 0, 3366, 3680, + 0, 3372, 3674, + 0, 3381, 3667, + 0, 3392, 3657, + 0, 3406, 3644, + 0, 3425, 3625, + 0, 3449, 3599, + 0, 3479, 3562, + 0, 3516, 3506, + 0, 3561, 3419, + 0, 3615, 3269, + 0, 3679, 2931, + 0, 3753, 0, + 0, 3835, 0, + 2854, 3356, 3727, + 2854, 3356, 3727, + 2853, 3356, 3726, + 2853, 3356, 3726, + 2853, 3356, 3726, + 2852, 3357, 3726, + 2851, 3357, 3726, + 2849, 3357, 3726, + 2848, 3357, 3726, + 2845, 3358, 3726, + 2842, 3358, 3725, + 2838, 3359, 3725, + 2832, 3360, 3724, + 2824, 3361, 3723, + 2813, 3362, 3722, + 2798, 3364, 3721, + 2778, 3367, 3719, + 2749, 3371, 3716, + 2706, 3375, 3712, + 2643, 3382, 3707, + 2542, 3390, 3701, + 2357, 3401, 3692, + 1850, 3415, 3679, + 0, 3433, 3662, + 0, 3456, 3638, + 0, 3486, 3604, + 0, 3522, 3553, + 0, 3567, 3476, + 0, 3621, 3346, + 0, 3684, 3080, + 0, 3757, 0, + 0, 3838, 0, + 3210, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3766, + 3209, 3369, 3765, + 3208, 3369, 3765, + 3207, 3370, 3765, + 3207, 3370, 3765, + 3206, 3370, 3765, + 3204, 3371, 3764, + 3202, 3371, 3764, + 3200, 3372, 3763, + 3196, 3373, 3763, + 3191, 3375, 3762, + 3185, 3377, 3760, + 3176, 3379, 3758, + 3164, 3383, 3756, + 3148, 3387, 3753, + 3125, 3394, 3748, + 3092, 3402, 3742, + 3045, 3412, 3734, + 2972, 3426, 3722, + 2852, 3444, 3707, + 2617, 3467, 3685, + 1537, 3495, 3654, + 0, 3531, 3609, + 0, 3575, 3542, + 0, 3628, 3431, + 0, 3690, 3224, + 0, 3762, 2549, + 0, 3843, 0, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3385, 3813, + 3457, 3386, 3813, + 3457, 3386, 3813, + 3456, 3386, 3813, + 3456, 3386, 3813, + 3455, 3387, 3812, + 3454, 3387, 3812, + 3453, 3388, 3812, + 3452, 3388, 3811, + 3450, 3389, 3811, + 3447, 3391, 3810, + 3443, 3393, 3808, + 3439, 3395, 3807, + 3432, 3399, 3805, + 3423, 3403, 3802, + 3410, 3409, 3797, + 3393, 3417, 3792, + 3369, 3427, 3785, + 3335, 3441, 3774, + 3285, 3458, 3761, + 3208, 3480, 3741, + 3079, 3508, 3714, + 2817, 3543, 3675, + 0, 3586, 3617, + 0, 3637, 3526, + 0, 3698, 3365, + 0, 3769, 2984, + 0, 3849, 0, + 3660, 3406, 3870, + 3660, 3406, 3870, + 3660, 3406, 3870, + 3660, 3406, 3870, + 3660, 3407, 3870, + 3660, 3407, 3870, + 3660, 3407, 3870, + 3660, 3407, 3870, + 3659, 3407, 3869, + 3659, 3408, 3869, + 3658, 3408, 3869, + 3658, 3409, 3869, + 3657, 3409, 3868, + 3655, 3410, 3868, + 3654, 3412, 3867, + 3651, 3414, 3866, + 3648, 3416, 3864, + 3644, 3419, 3862, + 3638, 3424, 3860, + 3631, 3429, 3856, + 3620, 3437, 3851, + 3606, 3446, 3845, + 3586, 3459, 3836, + 3558, 3476, 3824, + 3517, 3497, 3807, + 3456, 3524, 3784, + 3360, 3558, 3750, + 3187, 3599, 3702, + 2750, 3650, 3627, + 0, 3709, 3503, + 0, 3778, 3257, + 0, 3856, 1771, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3839, 3433, 3936, + 3838, 3433, 3936, + 3838, 3434, 3936, + 3838, 3434, 3936, + 3838, 3434, 3936, + 3838, 3435, 3935, + 3837, 3435, 3935, + 3836, 3436, 3935, + 3836, 3437, 3934, + 3834, 3438, 3933, + 3833, 3440, 3932, + 3831, 3442, 3931, + 3828, 3445, 3930, + 3824, 3449, 3927, + 3819, 3455, 3924, + 3812, 3462, 3920, + 3803, 3471, 3914, + 3790, 3483, 3907, + 3772, 3499, 3897, + 3747, 3519, 3882, + 3712, 3545, 3863, + 3659, 3577, 3835, + 3578, 3617, 3795, + 3440, 3665, 3735, + 3149, 3723, 3640, + 0, 3790, 3472, + 0, 3867, 3056, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4003, 3467, 4012, + 4002, 3467, 4012, + 4002, 3467, 4012, + 4002, 3468, 4011, + 4002, 3468, 4011, + 4002, 3468, 4011, + 4001, 3469, 4011, + 4001, 3470, 4010, + 4000, 3471, 4010, + 3999, 3473, 4009, + 3997, 3475, 4008, + 3995, 3478, 4006, + 3993, 3482, 4004, + 3989, 3487, 4002, + 3984, 3493, 3998, + 3978, 3502, 3994, + 3969, 3513, 3987, + 3957, 3528, 3979, + 3941, 3547, 3967, + 3918, 3571, 3950, + 3886, 3602, 3928, + 3838, 3640, 3895, + 3765, 3686, 3848, + 3646, 3741, 3776, + 3411, 3806, 3657, + 2348, 3880, 3426, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3508, 4095, + 4095, 3509, 4095, + 4095, 3509, 4095, + 4095, 3509, 4095, + 4095, 3510, 4095, + 4095, 3511, 4095, + 4095, 3512, 4095, + 4095, 3513, 4094, + 4095, 3515, 4093, + 4095, 3518, 4092, + 4095, 3522, 4091, + 4095, 3526, 4088, + 4095, 3532, 4086, + 4095, 3540, 4082, + 4095, 3551, 4076, + 4095, 3564, 4069, + 4095, 3582, 4060, + 4095, 3604, 4046, + 4077, 3633, 4028, + 4046, 3668, 4002, + 4002, 3712, 3965, + 3935, 3764, 3911, + 3826, 3826, 3826, + 3621, 3897, 3679, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3558, 4095, + 4095, 3559, 4095, + 4095, 3559, 4095, + 4095, 3560, 4095, + 4095, 3560, 4095, + 4095, 3561, 4095, + 4095, 3563, 4095, + 4095, 3564, 4095, + 4095, 3567, 4095, + 4095, 3570, 4095, + 4095, 3574, 4095, + 4095, 3580, 4095, + 4095, 3587, 4095, + 4095, 3596, 4095, + 4095, 3608, 4095, + 4095, 3624, 4095, + 4095, 3645, 4095, + 4095, 3671, 4095, + 4095, 3704, 4095, + 4095, 3744, 4086, + 4095, 3793, 4045, + 4093, 3851, 3983, + 3990, 3919, 3884, + 0, 3448, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3450, 3716, + 0, 3451, 3715, + 0, 3452, 3715, + 0, 3453, 3713, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3691, + 0, 3485, 3682, + 0, 3497, 3669, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3540, + 0, 3627, 3460, + 0, 3675, 3325, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3448, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3715, + 0, 3452, 3715, + 0, 3453, 3713, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3540, + 0, 3627, 3460, + 0, 3675, 3325, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3540, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3703, + 0, 3469, 3698, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3627, + 0, 3557, 3592, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3043, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3717, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3704, + 0, 3469, 3699, + 0, 3476, 3692, + 0, 3485, 3682, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3628, + 0, 3557, 3592, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3044, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3716, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3453, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3707, + 0, 3464, 3704, + 0, 3469, 3699, + 0, 3476, 3692, + 0, 3485, 3683, + 0, 3497, 3670, + 0, 3512, 3652, + 0, 3532, 3628, + 0, 3557, 3593, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3326, + 0, 3731, 3044, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3450, 3717, + 0, 3450, 3717, + 0, 3451, 3717, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3454, 3714, + 0, 3455, 3712, + 0, 3457, 3710, + 0, 3460, 3708, + 0, 3464, 3704, + 0, 3469, 3699, + 0, 3476, 3692, + 0, 3485, 3683, + 0, 3497, 3670, + 0, 3512, 3653, + 0, 3532, 3628, + 0, 3557, 3593, + 0, 3588, 3541, + 0, 3627, 3461, + 0, 3675, 3327, + 0, 3731, 3045, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3449, 3718, + 0, 3450, 3718, + 0, 3450, 3717, + 0, 3451, 3717, + 0, 3451, 3716, + 0, 3452, 3715, + 0, 3454, 3714, + 0, 3455, 3713, + 0, 3457, 3711, + 0, 3460, 3708, + 0, 3464, 3704, + 0, 3470, 3699, + 0, 3476, 3692, + 0, 3485, 3683, + 0, 3497, 3670, + 0, 3512, 3653, + 0, 3532, 3628, + 0, 3557, 3593, + 0, 3589, 3541, + 0, 3627, 3462, + 0, 3675, 3327, + 0, 3731, 3046, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3718, + 0, 3450, 3718, + 0, 3450, 3718, + 0, 3450, 3718, + 0, 3451, 3717, + 0, 3451, 3716, + 0, 3452, 3716, + 0, 3454, 3714, + 0, 3455, 3713, + 0, 3458, 3711, + 0, 3460, 3708, + 0, 3464, 3704, + 0, 3470, 3699, + 0, 3476, 3693, + 0, 3485, 3683, + 0, 3497, 3671, + 0, 3512, 3653, + 0, 3532, 3629, + 0, 3557, 3593, + 0, 3589, 3542, + 0, 3627, 3462, + 0, 3675, 3328, + 0, 3731, 3047, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3449, 3719, + 0, 3450, 3719, + 0, 3450, 3718, + 0, 3450, 3718, + 0, 3451, 3718, + 0, 3452, 3717, + 0, 3452, 3716, + 0, 3454, 3715, + 0, 3455, 3713, + 0, 3458, 3711, + 0, 3461, 3709, + 0, 3465, 3705, + 0, 3470, 3700, + 0, 3477, 3693, + 0, 3486, 3684, + 0, 3497, 3671, + 0, 3513, 3654, + 0, 3532, 3629, + 0, 3557, 3594, + 0, 3589, 3542, + 0, 3628, 3463, + 0, 3675, 3329, + 0, 3731, 3049, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3719, + 0, 3450, 3719, + 0, 3450, 3719, + 0, 3450, 3719, + 0, 3450, 3719, + 0, 3451, 3718, + 0, 3452, 3717, + 0, 3453, 3717, + 0, 3454, 3715, + 0, 3456, 3714, + 0, 3458, 3712, + 0, 3461, 3709, + 0, 3465, 3705, + 0, 3470, 3700, + 0, 3477, 3694, + 0, 3486, 3684, + 0, 3497, 3672, + 0, 3513, 3654, + 0, 3532, 3630, + 0, 3557, 3595, + 0, 3589, 3543, + 0, 3628, 3464, + 0, 3675, 3330, + 0, 3731, 3051, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3721, + 0, 3449, 3721, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3449, 3720, + 0, 3450, 3720, + 0, 3450, 3720, + 0, 3450, 3720, + 0, 3450, 3720, + 0, 3451, 3719, + 0, 3451, 3719, + 0, 3452, 3718, + 0, 3453, 3717, + 0, 3454, 3716, + 0, 3456, 3715, + 0, 3458, 3713, + 0, 3461, 3710, + 0, 3465, 3706, + 0, 3470, 3701, + 0, 3477, 3694, + 0, 3486, 3685, + 0, 3498, 3672, + 0, 3513, 3655, + 0, 3532, 3631, + 0, 3557, 3596, + 0, 3589, 3544, + 0, 3628, 3465, + 0, 3675, 3332, + 0, 3731, 3055, + 0, 3797, 0, + 0, 3873, 0, + 0, 3449, 3721, + 0, 3449, 3721, + 0, 3449, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3450, 3721, + 0, 3451, 3720, + 0, 3451, 3720, + 0, 3452, 3719, + 0, 3453, 3718, + 0, 3454, 3717, + 0, 3456, 3716, + 0, 3458, 3714, + 0, 3461, 3711, + 0, 3465, 3707, + 0, 3470, 3702, + 0, 3477, 3695, + 0, 3486, 3686, + 0, 3498, 3674, + 0, 3513, 3656, + 0, 3533, 3632, + 0, 3558, 3597, + 0, 3589, 3546, + 0, 3628, 3467, + 0, 3675, 3334, + 0, 3732, 3059, + 0, 3798, 0, + 0, 3873, 0, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3723, + 0, 3450, 3722, + 0, 3450, 3722, + 0, 3451, 3722, + 0, 3451, 3722, + 0, 3451, 3721, + 0, 3452, 3721, + 0, 3452, 3720, + 0, 3453, 3719, + 0, 3455, 3718, + 0, 3456, 3717, + 0, 3458, 3715, + 0, 3461, 3712, + 0, 3465, 3708, + 0, 3471, 3703, + 0, 3477, 3697, + 0, 3486, 3687, + 0, 3498, 3675, + 0, 3513, 3658, + 0, 3533, 3633, + 0, 3558, 3599, + 0, 3589, 3548, + 0, 3628, 3469, + 0, 3675, 3337, + 0, 3732, 3064, + 0, 3798, 0, + 0, 3873, 0, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3450, 3724, + 0, 3451, 3724, + 0, 3451, 3724, + 0, 3451, 3724, + 0, 3451, 3723, + 0, 3452, 3723, + 0, 3452, 3723, + 0, 3453, 3722, + 0, 3454, 3721, + 0, 3455, 3720, + 0, 3457, 3719, + 0, 3459, 3717, + 0, 3462, 3714, + 0, 3466, 3710, + 0, 3471, 3705, + 0, 3478, 3698, + 0, 3487, 3689, + 0, 3498, 3677, + 0, 3514, 3659, + 0, 3533, 3635, + 0, 3558, 3601, + 0, 3590, 3550, + 0, 3628, 3472, + 0, 3676, 3341, + 0, 3732, 3071, + 0, 3798, 0, + 0, 3873, 0, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3727, + 0, 3451, 3726, + 0, 3451, 3726, + 0, 3451, 3726, + 0, 3452, 3726, + 0, 3452, 3726, + 0, 3452, 3725, + 0, 3453, 3725, + 0, 3453, 3724, + 0, 3454, 3723, + 0, 3456, 3722, + 0, 3457, 3721, + 0, 3459, 3719, + 0, 3462, 3716, + 0, 3466, 3712, + 0, 3471, 3708, + 0, 3478, 3701, + 0, 3487, 3692, + 0, 3499, 3679, + 0, 3514, 3662, + 0, 3534, 3638, + 0, 3559, 3604, + 0, 3590, 3553, + 0, 3629, 3476, + 0, 3676, 3346, + 0, 3732, 3081, + 0, 3798, 0, + 0, 3873, 0, + 0, 3451, 3730, + 0, 3452, 3730, + 0, 3452, 3730, + 0, 3452, 3730, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3452, 3729, + 0, 3453, 3729, + 0, 3453, 3728, + 0, 3453, 3728, + 0, 3454, 3727, + 0, 3455, 3726, + 0, 3456, 3725, + 0, 3458, 3724, + 0, 3460, 3722, + 0, 3463, 3719, + 0, 3467, 3716, + 0, 3472, 3711, + 0, 3479, 3704, + 0, 3488, 3695, + 0, 3500, 3683, + 0, 3515, 3666, + 0, 3534, 3642, + 0, 3559, 3608, + 0, 3591, 3558, + 0, 3629, 3481, + 0, 3676, 3353, + 0, 3733, 3093, + 0, 3798, 0, + 0, 3874, 0, + 0, 3453, 3734, + 0, 3453, 3734, + 0, 3453, 3734, + 0, 3453, 3734, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3453, 3733, + 0, 3454, 3733, + 0, 3454, 3732, + 0, 3454, 3732, + 0, 3455, 3731, + 0, 3456, 3730, + 0, 3457, 3729, + 0, 3459, 3728, + 0, 3461, 3726, + 0, 3464, 3723, + 0, 3468, 3720, + 0, 3473, 3715, + 0, 3480, 3708, + 0, 3489, 3699, + 0, 3501, 3687, + 0, 3516, 3670, + 0, 3535, 3646, + 0, 3560, 3613, + 0, 3591, 3563, + 0, 3630, 3488, + 0, 3677, 3362, + 0, 3733, 3109, + 0, 3799, 370, + 0, 3874, 0, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3739, + 0, 3454, 3738, + 0, 3454, 3738, + 0, 3455, 3738, + 0, 3455, 3738, + 0, 3455, 3738, + 0, 3456, 3737, + 0, 3457, 3737, + 0, 3457, 3736, + 0, 3459, 3735, + 0, 3460, 3733, + 0, 3463, 3731, + 0, 3465, 3729, + 0, 3469, 3725, + 0, 3474, 3720, + 0, 3481, 3714, + 0, 3490, 3705, + 0, 3502, 3693, + 0, 3517, 3676, + 0, 3536, 3653, + 0, 3561, 3620, + 0, 3592, 3571, + 0, 3631, 3497, + 0, 3678, 3374, + 0, 3734, 3129, + 0, 3800, 1731, + 0, 3875, 0, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3746, + 0, 3456, 3745, + 0, 3456, 3745, + 0, 3456, 3745, + 0, 3456, 3745, + 0, 3457, 3745, + 0, 3457, 3744, + 0, 3458, 3744, + 0, 3458, 3743, + 0, 3459, 3743, + 0, 3460, 3742, + 0, 3462, 3740, + 0, 3464, 3738, + 0, 3467, 3736, + 0, 3471, 3732, + 0, 3476, 3727, + 0, 3483, 3721, + 0, 3492, 3712, + 0, 3503, 3700, + 0, 3518, 3684, + 0, 3538, 3661, + 0, 3563, 3629, + 0, 3594, 3581, + 0, 3632, 3508, + 0, 3679, 3389, + 0, 3735, 3155, + 0, 3800, 2103, + 0, 3875, 0, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3755, + 0, 3458, 3754, + 0, 3459, 3754, + 0, 3459, 3754, + 0, 3459, 3754, + 0, 3460, 3754, + 0, 3460, 3753, + 0, 3461, 3753, + 0, 3462, 3752, + 0, 3463, 3751, + 0, 3465, 3749, + 0, 3467, 3747, + 0, 3470, 3745, + 0, 3473, 3741, + 0, 3479, 3737, + 0, 3485, 3731, + 0, 3494, 3722, + 0, 3506, 3710, + 0, 3521, 3694, + 0, 3540, 3672, + 0, 3565, 3640, + 0, 3595, 3594, + 0, 3634, 3524, + 0, 3681, 3409, + 0, 3736, 3187, + 0, 3802, 2357, + 0, 3876, 0, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3461, 3767, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3462, 3766, + 0, 3463, 3765, + 0, 3463, 3765, + 0, 3464, 3764, + 0, 3465, 3764, + 0, 3466, 3763, + 0, 3468, 3761, + 0, 3470, 3759, + 0, 3473, 3757, + 0, 3477, 3754, + 0, 3482, 3749, + 0, 3488, 3743, + 0, 3497, 3735, + 0, 3508, 3723, + 0, 3523, 3708, + 0, 3543, 3686, + 0, 3567, 3655, + 0, 3598, 3611, + 0, 3636, 3543, + 0, 3682, 3434, + 0, 3738, 3227, + 0, 3803, 2563, + 0, 3878, 0, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3782, + 0, 3466, 3781, + 0, 3467, 3781, + 0, 3467, 3781, + 0, 3467, 3780, + 0, 3468, 3780, + 0, 3469, 3779, + 0, 3470, 3778, + 0, 3472, 3777, + 0, 3474, 3775, + 0, 3477, 3773, + 0, 3481, 3769, + 0, 3486, 3765, + 0, 3492, 3759, + 0, 3501, 3751, + 0, 3512, 3740, + 0, 3527, 3725, + 0, 3546, 3704, + 0, 3570, 3675, + 0, 3601, 3632, + 0, 3639, 3568, + 0, 3685, 3465, + 0, 3740, 3276, + 0, 3805, 2743, + 0, 3879, 0, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3471, 3802, + 0, 3472, 3802, + 0, 3472, 3801, + 0, 3472, 3801, + 0, 3472, 3801, + 0, 3473, 3801, + 0, 3473, 3800, + 0, 3474, 3800, + 0, 3475, 3799, + 0, 3476, 3798, + 0, 3477, 3797, + 0, 3480, 3795, + 0, 3482, 3793, + 0, 3486, 3790, + 0, 3491, 3786, + 0, 3498, 3780, + 0, 3506, 3772, + 0, 3517, 3762, + 0, 3532, 3748, + 0, 3551, 3728, + 0, 3575, 3700, + 0, 3605, 3660, + 0, 3643, 3599, + 0, 3689, 3504, + 0, 3743, 3334, + 0, 3808, 2908, + 0, 3882, 0, + 1996, 3479, 3827, + 1994, 3479, 3827, + 1992, 3479, 3827, + 1990, 3479, 3827, + 1986, 3479, 3827, + 1981, 3479, 3827, + 1974, 3479, 3827, + 1965, 3479, 3827, + 1953, 3479, 3826, + 1935, 3480, 3826, + 1911, 3480, 3826, + 1877, 3480, 3826, + 1826, 3481, 3825, + 1748, 3482, 3824, + 1616, 3483, 3824, + 1346, 3485, 3822, + 0, 3487, 3821, + 0, 3490, 3819, + 0, 3493, 3816, + 0, 3498, 3812, + 0, 3505, 3806, + 0, 3513, 3799, + 0, 3524, 3789, + 0, 3538, 3776, + 0, 3557, 3757, + 0, 3581, 3731, + 0, 3611, 3694, + 0, 3648, 3638, + 0, 3693, 3551, + 0, 3748, 3401, + 0, 3811, 3063, + 0, 3885, 0, + 2986, 3488, 3859, + 2986, 3488, 3859, + 2986, 3488, 3859, + 2986, 3488, 3859, + 2985, 3488, 3859, + 2985, 3489, 3858, + 2984, 3489, 3858, + 2983, 3489, 3858, + 2982, 3489, 3858, + 2980, 3489, 3858, + 2977, 3490, 3858, + 2974, 3490, 3857, + 2970, 3491, 3857, + 2964, 3492, 3856, + 2956, 3493, 3855, + 2945, 3494, 3854, + 2931, 3496, 3853, + 2910, 3499, 3851, + 2881, 3503, 3848, + 2839, 3507, 3844, + 2775, 3514, 3839, + 2674, 3522, 3833, + 2489, 3533, 3824, + 1982, 3547, 3811, + 0, 3565, 3794, + 0, 3589, 3770, + 0, 3618, 3736, + 0, 3655, 3685, + 0, 3699, 3608, + 0, 3753, 3478, + 0, 3816, 3212, + 0, 3889, 0, + 3342, 3501, 3898, + 3342, 3501, 3898, + 3342, 3501, 3898, + 3341, 3501, 3898, + 3341, 3501, 3898, + 3341, 3501, 3898, + 3341, 3501, 3898, + 3340, 3501, 3897, + 3340, 3502, 3897, + 3339, 3502, 3897, + 3338, 3502, 3897, + 3336, 3503, 3897, + 3334, 3503, 3896, + 3332, 3504, 3896, + 3328, 3505, 3895, + 3323, 3507, 3894, + 3317, 3509, 3892, + 3308, 3511, 3891, + 3296, 3515, 3888, + 3280, 3520, 3885, + 3257, 3526, 3880, + 3224, 3534, 3874, + 3177, 3544, 3866, + 3104, 3558, 3854, + 2984, 3576, 3839, + 2749, 3599, 3817, + 1669, 3628, 3786, + 0, 3663, 3741, + 0, 3707, 3674, + 0, 3760, 3564, + 0, 3822, 3356, + 0, 3894, 2681, + 3590, 3517, 3945, + 3590, 3517, 3945, + 3590, 3517, 3945, + 3589, 3517, 3945, + 3589, 3518, 3945, + 3589, 3518, 3945, + 3589, 3518, 3945, + 3589, 3518, 3945, + 3588, 3518, 3945, + 3588, 3518, 3945, + 3587, 3519, 3945, + 3586, 3519, 3944, + 3585, 3520, 3944, + 3584, 3520, 3943, + 3582, 3522, 3943, + 3579, 3523, 3942, + 3576, 3525, 3941, + 3571, 3527, 3939, + 3564, 3531, 3937, + 3555, 3535, 3934, + 3543, 3541, 3930, + 3525, 3549, 3924, + 3501, 3559, 3917, + 3467, 3573, 3907, + 3417, 3590, 3893, + 3340, 3612, 3873, + 3211, 3640, 3846, + 2949, 3675, 3807, + 0, 3718, 3749, + 0, 3769, 3658, + 0, 3830, 3497, + 0, 3901, 3116, + 3792, 3538, 4002, + 3792, 3538, 4002, + 3792, 3538, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3792, 3539, 4002, + 3791, 3539, 4002, + 3791, 3540, 4001, + 3790, 3540, 4001, + 3790, 3541, 4001, + 3789, 3541, 4000, + 3787, 3542, 4000, + 3786, 3544, 3999, + 3783, 3546, 3998, + 3780, 3548, 3996, + 3776, 3551, 3994, + 3770, 3556, 3992, + 3763, 3561, 3988, + 3752, 3569, 3983, + 3738, 3579, 3977, + 3718, 3591, 3968, + 3690, 3608, 3956, + 3649, 3629, 3939, + 3588, 3656, 3916, + 3492, 3690, 3882, + 3319, 3731, 3834, + 2882, 3782, 3759, + 0, 3841, 3636, + 0, 3910, 3389, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3565, 4068, + 3971, 3566, 4068, + 3970, 3566, 4068, + 3970, 3566, 4068, + 3970, 3566, 4068, + 3970, 3567, 4067, + 3969, 3567, 4067, + 3968, 3568, 4067, + 3968, 3569, 4066, + 3966, 3570, 4066, + 3965, 3572, 4065, + 3963, 3574, 4063, + 3960, 3577, 4062, + 3956, 3581, 4059, + 3951, 3587, 4056, + 3944, 3594, 4052, + 3935, 3603, 4047, + 3922, 3615, 4039, + 3904, 3631, 4029, + 3879, 3651, 4014, + 3844, 3677, 3995, + 3791, 3709, 3967, + 3710, 3749, 3927, + 3572, 3797, 3867, + 3281, 3855, 3772, + 0, 3922, 3604, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3599, 4095, + 4095, 3600, 4095, + 4095, 3600, 4095, + 4095, 3601, 4095, + 4095, 3601, 4095, + 4095, 3602, 4095, + 4095, 3603, 4095, + 4095, 3605, 4095, + 4095, 3607, 4095, + 4095, 3610, 4095, + 4095, 3614, 4095, + 4095, 3619, 4095, + 4095, 3625, 4095, + 4095, 3634, 4095, + 4095, 3645, 4095, + 4090, 3660, 4095, + 4073, 3679, 4095, + 4050, 3703, 4083, + 4018, 3734, 4060, + 3970, 3772, 4027, + 3897, 3818, 3980, + 3778, 3873, 3908, + 3543, 3938, 3789, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3640, 4095, + 4095, 3641, 4095, + 4095, 3641, 4095, + 4095, 3641, 4095, + 4095, 3642, 4095, + 4095, 3642, 4095, + 4095, 3643, 4095, + 4095, 3644, 4095, + 4095, 3646, 4095, + 4095, 3648, 4095, + 4095, 3650, 4095, + 4095, 3654, 4095, + 4095, 3658, 4095, + 4095, 3664, 4095, + 4095, 3672, 4095, + 4095, 3683, 4095, + 4095, 3696, 4095, + 4095, 3714, 4095, + 4095, 3736, 4095, + 4095, 3765, 4095, + 4095, 3800, 4095, + 4095, 3844, 4095, + 4067, 3896, 4043, + 3958, 3958, 3958 +] + } +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr new file mode 100644 index 0000000000..a01efd6e72 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c11862c33eb828f32df7dd1a7dd8843f7553379334553551aae0aaadb2100a01 +size 276701 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.dds b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.dds new file mode 100644 index 0000000000..42f736064e --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20355376cea9da29e36086debf3d84a6453dcbd8c1616c3c57e5a6c0df0a9e0e +size 15105796 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.exr new file mode 100644 index 0000000000..dd1b951211 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/displaymapperpassthrough.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da5a5fcf9eff8064f27f7f146db353fde7207fc36b10cfde95dc6b45941663bf +size 5046039 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading new file mode 100644 index 0000000000..eab6fb7d9e --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading @@ -0,0 +1,57 @@ +#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx +version 13.0 v3 +define_window_layout_xml { + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +Root { + inputs 0 + name C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading + project_directory "\[python \{nuke.script_directory()\}]" + label "This is a Nuke project template used to validate HDR / ACES color grading workflow in Nuke to generate 'Look Modification' (LMT) Luts for Oopen 3D Engine." + format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" + proxy_type scale + proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" + colorManagement Nuke + workingSpaceLUT linear + monitorLut sRGB + monitorOutLUT rec709 + int8Lut sRGB + int16Lut sRGB + logLut Cineon + floatLut linear +} +Viewer { + inputs 0 + frame 1 + frame_range 1-100 + name Viewer1 + xpos -40 + ypos -9 +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading.autosave b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading.autosave new file mode 100644 index 0000000000..00db0cd63d --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading.autosave @@ -0,0 +1,125 @@ +#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx +version 13.0 v3 +define_window_layout_xml { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +} +Root { + inputs 0 + name C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/O3DE_HDR_Nuke_Color_Grading + project_directory C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke + label "This is a Nuke project template used to validate HDR / ACES color grading workflow in Nuke to generate 'Look Modification' (LMT) Luts for Oopen 3D Engine." + frame 16 + first_frame 16 + last_frame 32 + lock_range true + format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" + proxy_type scale + proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" + colorManagement OCIO + OCIOGPUSupport true + OCIO_config aces_1.0.3 + defaultViewerLUT "OCIO LUTs" + workingSpaceLUT scene_linear + monitorLut ACES/sRGB + monitorOutLUT "sRGB (ACES)" + int8Lut matte_paint + int16Lut texture_paint + logLut compositing_log + floatLut scene_linear +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/LUTs/linear_lut_32.exr + format "1024 32 0 0 1024 32 1 " + origset true + colorspace scene_linear + name Read3 + xpos -1727 + ypos -81 +} +OCIOFileTransform { + file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d + working_space scene_linear + name OCIOFileTransform1 + xpos -1587 + ypos -45 +} +Viewer { + frame_range 16-32 + viewerProcess "sRGB (ACES)" + name Viewer3 + xpos -1586 + ypos 10 +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/HDR/displaymapperpassthrough.exr + format "1167 1618 0 0 1167 1618 1 " + origset true + colorspace scene_linear + name Read1 + xpos -1719 + ypos -421 +} +Read { + inputs 0 + file_type exr + file C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/LUTs/linear_lut_32.exr + format "1024 32 0 0 1024 32 1 " + origset true + colorspace "Utility - Log2 48 nits Shaper - AP1" + name Read2 + xpos -1720 + ypos -311 +} +Merge2 { + inputs 2 + Achannels {rgba.red rgba.green rgba.blue -rgba.alpha} + Bchannels {rgba.red rgba.green rgba.blue -rgba.alpha} + output {rgba.red rgba.green rgba.blue -rgba.alpha} + also_merge all + mix 0 + name Merge1 + selected true + xpos -1495 + ypos -340 +} +Viewer { + frame 16 + frame_range 16-32 + viewerProcess "sRGB (ACES)" + name Viewer2 + xpos -1495 + ypos -272 +} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd new file mode 100644 index 0000000000..3718e0facf --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0276e1d329cda3514f46a55fd1d3ce90fce617814198ab69d234f2c58c15882 +size 98742272 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd new file mode 100644 index 0000000000..82eca8b3cc --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce91088eaa54afab608bfcea6ab4009cbb3027cb83c76710a46470144e7d799d +size 98638424 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/framebuffer_ACEScg_to_sRGB_icc.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/framebuffer_ACEScg_to_sRGB_icc.exr new file mode 100644 index 0000000000..9daa58f75c --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/framebuffer_ACEScg_to_sRGB_icc.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:facad074b84df87a0ab4baaf2bd95552e6eca3fed79a56875c9815f32d885b8a +size 11949493 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_clt_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_clt_32_LUT.exr new file mode 100644 index 0000000000..a8c859147f --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_clt_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfdfefb553fffd1a799a62e205fe13ebd88f3327d97d20cb900af6465ecc2dae +size 61384 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_hue-sat_32_LUT.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_hue-sat_32_LUT.exr new file mode 100644 index 0000000000..ed8446a2ad --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/i_shaped/test_hue-sat_32_LUT.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfced5571e7d681cc565a9be07fa199ecfee0d70ad4104ccb47c75a525737445 +size 96548 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/Test_3DL_32_LUT.azasset b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/Test_3DL_32_LUT.azasset new file mode 100644 index 0000000000..b643955084 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/Test_3DL_32_LUT.azasset @@ -0,0 +1,4922 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [0, 64, 128, 192, 256, 320, 384, 448, 512, 575, 639, 703, 767, 831, 895, 959, 1023], + "Values": [128, 193, 337, +96, 193, 353, +145, 241, 418, +177, 273, 514, +225, 273, 562, +337, 337, 707, +385, 385, 803, +450, 450, 883, +562, 514, 996, +594, 578, 1108, +691, 658, 1220, +739, 723, 1317, +803, 787, 1429, +915, 867, 1574, +980, 915, 1638, +1028, 996, 1766, +1092, 1044, 1847, +257, 353, 401, +289, 353, 434, +305, 369, 514, +273, 385, 594, +321, 385, 642, +353, 466, 771, +434, 482, 835, +498, 562, 964, +562, 594, 1060, +642, 658, 1140, +691, 723, 1253, +755, 787, 1349, +851, 835, 1477, +899, 899, 1574, +947, 964, 1670, +1044, 1044, 1783, +1124, 1076, 1863, +337, 530, 482, +385, 546, 530, +401, 562, 594, +401, 562, 691, +434, 594, 771, +450, 642, 867, +482, 642, 931, +562, 674, 1028, +610, 739, 1108, +658, 771, 1204, +739, 819, 1317, +851, 899, 1445, +867, 915, 1510, +947, 980, 1590, +1012, 1044, 1718, +1060, 1076, 1815, +1140, 1140, 1927, +466, 771, 642, +482, 771, 691, +482, 771, 755, +514, 787, 803, +514, 803, 915, +578, 803, 964, +626, 851, 1044, +658, 867, 1124, +707, 899, 1220, +771, 931, 1301, +787, 947, 1381, +883, 1012, 1477, +931, 1044, 1590, +1012, 1108, 1686, +1044, 1140, 1766, +1140, 1204, 1879, +1188, 1253, 1991, +691, 1012, 755, +674, 1012, 803, +674, 980, 883, +658, 980, 947, +658, 1012, 980, +642, 1012, 1092, +707, 1012, 1156, +755, 1060, 1269, +771, 1060, 1317, +835, 1108, 1397, +931, 1156, 1510, +947, 1156, 1574, +980, 1188, 1654, +1076, 1237, 1783, +1140, 1285, 1863, +1188, 1301, 1911, +1237, 1349, 2023, +851, 1220, 899, +803, 1204, 931, +835, 1204, 996, +819, 1204, 1060, +835, 1204, 1124, +867, 1204, 1156, +883, 1220, 1253, +899, 1237, 1349, +931, 1253, 1429, +996, 1269, 1510, +996, 1317, 1590, +1060, 1349, 1670, +1124, 1349, 1750, +1156, 1397, 1847, +1253, 1429, 1943, +1285, 1461, 2039, +1333, 1477, 2104, +980, 1413, 1012, +980, 1429, 1060, +980, 1413, 1108, +980, 1413, 1172, +996, 1397, 1237, +1012, 1429, 1333, +1044, 1429, 1365, +1076, 1445, 1445, +1044, 1445, 1526, +1124, 1477, 1622, +1140, 1493, 1702, +1156, 1493, 1750, +1188, 1558, 1863, +1285, 1558, 1943, +1349, 1590, 2023, +1381, 1622, 2104, +1461, 1654, 2216, +1156, 1606, 1124, +1140, 1622, 1172, +1140, 1606, 1253, +1172, 1622, 1317, +1188, 1622, 1381, +1172, 1638, 1445, +1188, 1638, 1510, +1220, 1638, 1542, +1237, 1638, 1606, +1301, 1654, 1718, +1333, 1670, 1799, +1365, 1702, 1879, +1397, 1734, 1975, +1429, 1734, 2039, +1477, 1766, 2104, +1526, 1815, 2216, +1558, 1831, 2296, +1317, 1815, 1285, +1285, 1831, 1317, +1301, 1831, 1365, +1317, 1815, 1397, +1333, 1799, 1445, +1349, 1831, 1542, +1381, 1831, 1622, +1381, 1815, 1654, +1413, 1863, 1734, +1461, 1863, 1799, +1477, 1863, 1895, +1510, 1895, 1991, +1542, 1895, 2023, +1638, 1943, 2136, +1670, 1927, 2184, +1670, 1943, 2264, +1734, 1991, 2377, +1542, 2007, 1381, +1510, 2023, 1381, +1526, 2023, 1445, +1542, 2023, 1526, +1542, 2007, 1590, +1574, 2023, 1654, +1558, 2023, 1686, +1606, 2039, 1766, +1606, 2023, 1815, +1654, 2056, 1863, +1686, 2072, 1943, +1718, 2088, 2072, +1734, 2104, 2168, +1766, 2120, 2248, +1847, 2136, 2296, +1927, 2152, 2361, +1975, 2184, 2457, +1734, 2232, 1493, +1766, 2248, 1510, +1734, 2232, 1526, +1766, 2248, 1590, +1766, 2232, 1686, +1815, 2232, 1766, +1799, 2232, 1815, +1847, 2264, 1927, +1831, 2264, 1927, +1879, 2280, 2007, +1895, 2280, 2072, +1911, 2280, 2136, +1959, 2312, 2232, +1975, 2329, 2345, +2023, 2361, 2425, +2072, 2329, 2441, +2104, 2361, 2537, +1975, 2457, 1654, +1943, 2457, 1638, +1959, 2457, 1670, +1975, 2441, 1734, +1991, 2441, 1799, +2007, 2441, 1895, +2023, 2441, 1943, +2023, 2441, 1991, +2023, 2441, 2072, +2072, 2473, 2168, +2104, 2473, 2200, +2120, 2473, 2264, +2184, 2489, 2296, +2216, 2505, 2377, +2200, 2521, 2537, +2248, 2553, 2634, +2264, 2537, 2682, +2152, 2650, 1734, +2168, 2634, 1783, +2120, 2650, 1815, +2136, 2650, 1879, +2168, 2650, 1959, +2200, 2650, 2023, +2216, 2650, 2088, +2200, 2666, 2120, +2248, 2682, 2200, +2232, 2682, 2264, +2248, 2682, 2329, +2280, 2682, 2377, +2312, 2698, 2457, +2345, 2714, 2537, +2361, 2714, 2602, +2393, 2730, 2714, +2425, 2762, 2810, +2312, 2858, 1895, +2329, 2858, 1895, +2329, 2875, 1959, +2296, 2858, 1991, +2329, 2875, 2056, +2345, 2858, 2120, +2377, 2875, 2184, +2377, 2875, 2296, +2393, 2891, 2329, +2409, 2875, 2361, +2473, 2875, 2441, +2441, 2875, 2489, +2489, 2891, 2553, +2521, 2907, 2618, +2537, 2907, 2698, +2585, 2923, 2778, +2618, 2955, 2907, +2553, 3067, 2023, +2537, 3067, 2056, +2489, 3067, 2088, +2521, 3067, 2120, +2537, 3051, 2184, +2537, 3051, 2280, +2585, 3067, 2312, +2602, 3051, 2377, +2602, 3083, 2425, +2602, 3067, 2505, +2618, 3083, 2553, +2634, 3083, 2618, +2666, 3083, 2666, +2698, 3083, 2714, +2730, 3115, 2794, +2746, 3115, 2907, +2778, 3131, 2987, +2714, 3276, 2184, +2714, 3276, 2216, +2682, 3292, 2232, +2698, 3292, 2280, +2698, 3292, 2296, +2746, 3276, 2393, +2730, 3292, 2457, +2762, 3292, 2521, +2762, 3276, 2585, +2778, 3260, 2634, +2746, 3260, 2698, +2810, 3276, 2746, +2842, 3292, 2842, +2826, 3292, 2858, +2858, 3292, 2907, +2875, 3308, 3003, +2923, 3324, 3067, +2891, 3501, 2345, +2891, 3485, 2377, +2875, 3485, 2361, +2842, 3501, 2377, +2858, 3485, 2425, +2907, 3501, 2521, +2907, 3485, 2602, +2939, 3485, 2650, +2939, 3469, 2698, +2955, 3501, 2762, +2955, 3485, 2810, +3035, 3485, 2891, +3019, 3501, 2971, +3067, 3517, 3051, +3067, 3517, 3115, +3115, 3533, 3164, +3099, 3549, 3244, +273, 225, 353, +273, 241, 385, +225, 273, 450, +257, 257, 514, +305, 321, 626, +369, 353, 707, +434, 434, 819, +498, 482, 915, +562, 562, 1028, +594, 594, 1124, +723, 658, 1220, +755, 723, 1333, +819, 819, 1445, +899, 883, 1590, +980, 915, 1638, +1060, 1012, 1750, +1108, 1060, 1863, +337, 353, 401, +337, 369, 450, +321, 401, 546, +337, 401, 594, +369, 434, 707, +418, 466, 771, +466, 514, 867, +546, 578, 996, +578, 626, 1076, +691, 674, 1156, +723, 739, 1269, +755, 803, 1365, +867, 851, 1493, +931, 915, 1558, +996, 980, 1670, +1060, 1044, 1783, +1124, 1076, 1863, +434, 546, 482, +418, 562, 546, +466, 594, 626, +466, 594, 707, +466, 642, 819, +482, 642, 867, +514, 674, 964, +578, 707, 1028, +626, 755, 1140, +707, 787, 1220, +755, 835, 1333, +835, 883, 1429, +915, 931, 1510, +947, 996, 1606, +1028, 1060, 1734, +1076, 1076, 1799, +1140, 1140, 1927, +562, 771, 594, +530, 787, 707, +546, 803, 771, +578, 803, 803, +578, 803, 867, +594, 819, 980, +642, 867, 1076, +658, 883, 1140, +739, 915, 1237, +771, 931, 1301, +787, 980, 1413, +883, 1012, 1493, +947, 1060, 1574, +996, 1108, 1670, +1060, 1140, 1783, +1140, 1204, 1879, +1220, 1237, 1991, +723, 996, 755, +691, 996, 819, +707, 996, 883, +674, 1012, 964, +707, 1012, 996, +723, 1028, 1092, +723, 1044, 1172, +787, 1060, 1253, +819, 1092, 1317, +851, 1124, 1413, +931, 1156, 1510, +964, 1172, 1590, +1012, 1172, 1654, +1076, 1237, 1783, +1140, 1285, 1863, +1220, 1333, 1943, +1285, 1349, 2039, +851, 1220, 867, +835, 1220, 931, +835, 1220, 996, +835, 1220, 1076, +851, 1204, 1140, +867, 1204, 1156, +883, 1220, 1253, +915, 1253, 1381, +980, 1269, 1445, +996, 1285, 1510, +1012, 1317, 1606, +1108, 1349, 1686, +1124, 1365, 1750, +1156, 1381, 1847, +1237, 1413, 1927, +1285, 1445, 2039, +1349, 1493, 2104, +1028, 1413, 996, +996, 1413, 1044, +1012, 1413, 1140, +1028, 1413, 1188, +1044, 1413, 1253, +1012, 1413, 1333, +1060, 1429, 1333, +1076, 1445, 1445, +1060, 1477, 1542, +1108, 1477, 1606, +1140, 1493, 1702, +1172, 1510, 1783, +1220, 1542, 1863, +1285, 1558, 1959, +1349, 1606, 2023, +1413, 1622, 2120, +1477, 1670, 2232, +1188, 1606, 1156, +1140, 1622, 1172, +1156, 1606, 1220, +1156, 1606, 1317, +1172, 1606, 1381, +1188, 1622, 1461, +1220, 1622, 1510, +1237, 1654, 1558, +1253, 1654, 1622, +1285, 1686, 1734, +1333, 1670, 1799, +1381, 1718, 1895, +1397, 1718, 1959, +1429, 1734, 2039, +1477, 1766, 2104, +1526, 1815, 2200, +1558, 1831, 2296, +1333, 1815, 1253, +1349, 1815, 1301, +1317, 1831, 1349, +1333, 1815, 1397, +1365, 1815, 1493, +1365, 1831, 1558, +1365, 1815, 1590, +1397, 1847, 1686, +1429, 1847, 1718, +1461, 1863, 1799, +1477, 1879, 1911, +1493, 1895, 2007, +1574, 1927, 2039, +1670, 1927, 2136, +1686, 1927, 2200, +1670, 1943, 2264, +1718, 1991, 2377, +1558, 2023, 1365, +1542, 2023, 1381, +1542, 2023, 1445, +1558, 2023, 1510, +1574, 2023, 1606, +1574, 2023, 1654, +1622, 2023, 1702, +1606, 2039, 1766, +1622, 2056, 1831, +1654, 2056, 1863, +1686, 2056, 1943, +1718, 2088, 2056, +1718, 2088, 2152, +1766, 2136, 2248, +1879, 2120, 2264, +1927, 2152, 2361, +1975, 2184, 2473, +1799, 2232, 1477, +1783, 2232, 1510, +1766, 2232, 1558, +1783, 2232, 1622, +1799, 2216, 1670, +1815, 2232, 1766, +1815, 2248, 1815, +1847, 2264, 1895, +1879, 2280, 1975, +1879, 2296, 2023, +1911, 2296, 2088, +1911, 2280, 2136, +2007, 2312, 2248, +1975, 2329, 2345, +2056, 2345, 2393, +2072, 2345, 2457, +2120, 2361, 2553, +2007, 2457, 1654, +1991, 2473, 1654, +1959, 2457, 1670, +1975, 2441, 1734, +1991, 2441, 1799, +2007, 2441, 1863, +2039, 2457, 1959, +2072, 2473, 2039, +2039, 2457, 2088, +2072, 2473, 2168, +2120, 2489, 2216, +2120, 2457, 2264, +2168, 2505, 2361, +2200, 2505, 2441, +2216, 2537, 2553, +2232, 2537, 2618, +2248, 2537, 2682, +2168, 2666, 1750, +2168, 2650, 1799, +2120, 2650, 1815, +2168, 2666, 1879, +2168, 2650, 1959, +2184, 2650, 2023, +2216, 2650, 2056, +2216, 2666, 2136, +2216, 2650, 2184, +2248, 2666, 2248, +2248, 2682, 2345, +2280, 2682, 2377, +2312, 2698, 2457, +2329, 2698, 2521, +2377, 2730, 2618, +2393, 2746, 2714, +2425, 2762, 2794, +2345, 2842, 1895, +2329, 2858, 1895, +2296, 2858, 1943, +2312, 2875, 1959, +2329, 2875, 2056, +2345, 2858, 2120, +2377, 2875, 2200, +2393, 2875, 2264, +2425, 2875, 2329, +2409, 2875, 2361, +2473, 2875, 2441, +2489, 2875, 2505, +2505, 2891, 2553, +2505, 2875, 2602, +2553, 2907, 2698, +2585, 2923, 2778, +2602, 2955, 2891, +2537, 3067, 2023, +2569, 3067, 2056, +2505, 3067, 2056, +2521, 3067, 2120, +2537, 3067, 2184, +2569, 3083, 2264, +2585, 3067, 2329, +2585, 3051, 2377, +2602, 3083, 2425, +2602, 3067, 2521, +2634, 3083, 2602, +2618, 3067, 2618, +2666, 3083, 2666, +2698, 3099, 2714, +2730, 3115, 2794, +2778, 3131, 2891, +2778, 3131, 2987, +2714, 3276, 2184, +2746, 3308, 2216, +2698, 3308, 2232, +2714, 3308, 2312, +2714, 3308, 2296, +2730, 3292, 2361, +2730, 3292, 2457, +2778, 3276, 2553, +2778, 3276, 2585, +2778, 3260, 2634, +2762, 3276, 2698, +2794, 3260, 2730, +2826, 3292, 2826, +2810, 3276, 2858, +2842, 3292, 2923, +2875, 3308, 3003, +2939, 3340, 3083, +2891, 3485, 2345, +2875, 3485, 2329, +2875, 3485, 2377, +2842, 3501, 2377, +2891, 3517, 2457, +2907, 3501, 2521, +2907, 3485, 2569, +2907, 3485, 2666, +2939, 3485, 2714, +2971, 3485, 2778, +3019, 3501, 2826, +3035, 3485, 2891, +3035, 3517, 2971, +3051, 3517, 3051, +3083, 3533, 3131, +3099, 3517, 3164, +3148, 3533, 3212, +385, 257, 369, +353, 289, 401, +369, 305, 482, +401, 337, 594, +401, 337, 642, +434, 401, 771, +482, 466, 835, +562, 530, 947, +578, 578, 1060, +674, 626, 1124, +723, 707, 1253, +803, 755, 1349, +883, 835, 1477, +915, 883, 1558, +1044, 947, 1670, +1076, 1012, 1766, +1108, 1060, 1863, +498, 369, 385, +450, 401, 498, +434, 434, 578, +401, 466, 626, +450, 498, 723, +514, 514, 803, +562, 594, 931, +578, 610, 996, +642, 642, 1076, +691, 707, 1188, +755, 771, 1285, +835, 835, 1413, +867, 867, 1477, +964, 915, 1574, +996, 996, 1670, +1108, 1060, 1815, +1140, 1108, 1895, +562, 594, 514, +562, 610, 578, +530, 610, 674, +514, 642, 739, +514, 626, 803, +562, 674, 883, +610, 707, 980, +658, 755, 1076, +674, 771, 1156, +755, 819, 1237, +819, 883, 1365, +851, 915, 1445, +931, 964, 1542, +980, 1012, 1622, +1076, 1076, 1766, +1076, 1092, 1799, +1172, 1172, 1959, +658, 787, 610, +642, 803, 658, +610, 803, 755, +626, 819, 819, +642, 835, 915, +674, 851, 980, +707, 883, 1092, +723, 899, 1172, +771, 947, 1269, +771, 964, 1349, +851, 996, 1445, +915, 1044, 1493, +996, 1092, 1606, +1012, 1108, 1686, +1092, 1172, 1783, +1140, 1220, 1895, +1253, 1269, 1959, +771, 1012, 755, +771, 1012, 803, +723, 1012, 899, +739, 1028, 964, +755, 1028, 1012, +771, 1044, 1108, +787, 1060, 1204, +819, 1092, 1285, +851, 1092, 1333, +915, 1140, 1429, +931, 1156, 1510, +996, 1172, 1590, +1044, 1220, 1702, +1108, 1253, 1783, +1172, 1301, 1847, +1253, 1317, 1959, +1285, 1365, 2023, +883, 1204, 835, +915, 1220, 931, +867, 1220, 1012, +883, 1220, 1060, +899, 1220, 1156, +931, 1220, 1188, +947, 1237, 1285, +947, 1253, 1365, +980, 1269, 1445, +1012, 1285, 1526, +1060, 1333, 1622, +1092, 1333, 1670, +1140, 1381, 1766, +1220, 1397, 1863, +1269, 1445, 1959, +1317, 1477, 2039, +1381, 1477, 2120, +1060, 1413, 996, +1044, 1413, 1028, +1028, 1429, 1124, +1044, 1429, 1172, +1060, 1429, 1269, +1076, 1445, 1333, +1108, 1445, 1365, +1076, 1445, 1445, +1092, 1461, 1542, +1124, 1493, 1622, +1220, 1526, 1734, +1204, 1542, 1799, +1237, 1558, 1879, +1317, 1574, 1943, +1365, 1606, 2039, +1413, 1622, 2120, +1477, 1654, 2200, +1188, 1606, 1108, +1204, 1606, 1188, +1172, 1622, 1253, +1188, 1622, 1301, +1237, 1622, 1397, +1220, 1638, 1429, +1253, 1654, 1526, +1285, 1654, 1574, +1285, 1654, 1622, +1317, 1670, 1734, +1349, 1702, 1815, +1381, 1718, 1895, +1429, 1718, 1959, +1445, 1750, 2023, +1493, 1783, 2120, +1574, 1815, 2216, +1622, 1847, 2312, +1365, 1815, 1253, +1365, 1815, 1285, +1333, 1815, 1365, +1365, 1815, 1397, +1397, 1831, 1477, +1397, 1815, 1558, +1413, 1831, 1622, +1413, 1863, 1702, +1461, 1863, 1750, +1477, 1879, 1815, +1493, 1879, 1911, +1542, 1879, 1975, +1606, 1911, 2039, +1670, 1927, 2136, +1686, 1927, 2200, +1686, 1975, 2280, +1766, 2007, 2361, +1558, 2023, 1365, +1574, 2007, 1381, +1542, 2039, 1461, +1558, 2023, 1510, +1590, 2039, 1590, +1606, 2023, 1654, +1638, 2056, 1718, +1638, 2039, 1766, +1670, 2056, 1847, +1702, 2056, 1879, +1702, 2088, 1991, +1766, 2088, 2072, +1783, 2104, 2152, +1847, 2136, 2216, +1879, 2120, 2264, +1911, 2136, 2345, +1975, 2184, 2473, +1799, 2248, 1477, +1783, 2232, 1477, +1799, 2264, 1558, +1799, 2248, 1638, +1799, 2216, 1670, +1831, 2232, 1750, +1831, 2216, 1799, +1863, 2264, 1895, +1895, 2280, 1943, +1911, 2280, 2023, +1959, 2296, 2072, +1975, 2296, 2120, +2007, 2329, 2248, +2039, 2329, 2329, +2056, 2345, 2393, +2088, 2361, 2473, +2120, 2377, 2553, +2007, 2457, 1654, +2023, 2457, 1622, +1975, 2457, 1638, +2007, 2457, 1718, +2007, 2441, 1799, +2039, 2425, 1879, +2039, 2457, 1927, +2072, 2457, 2039, +2039, 2457, 2088, +2072, 2473, 2136, +2104, 2473, 2200, +2168, 2489, 2232, +2152, 2489, 2345, +2200, 2521, 2441, +2216, 2521, 2537, +2248, 2553, 2634, +2264, 2553, 2698, +2168, 2666, 1750, +2152, 2666, 1783, +2152, 2666, 1815, +2168, 2650, 1863, +2200, 2682, 1943, +2216, 2666, 2007, +2216, 2650, 2056, +2264, 2682, 2152, +2248, 2682, 2216, +2264, 2682, 2264, +2296, 2682, 2345, +2280, 2682, 2377, +2312, 2698, 2457, +2329, 2698, 2521, +2377, 2730, 2618, +2393, 2746, 2730, +2425, 2762, 2794, +2345, 2875, 1911, +2345, 2875, 1911, +2345, 2891, 1943, +2345, 2875, 1991, +2345, 2875, 2039, +2345, 2875, 2120, +2409, 2875, 2232, +2409, 2891, 2280, +2425, 2875, 2329, +2457, 2891, 2377, +2489, 2891, 2441, +2505, 2891, 2521, +2521, 2875, 2537, +2569, 2907, 2634, +2553, 2907, 2698, +2618, 2907, 2778, +2618, 2955, 2907, +2553, 3067, 2039, +2569, 3067, 2056, +2537, 3067, 2072, +2521, 3067, 2120, +2553, 3083, 2200, +2553, 3067, 2248, +2585, 3067, 2312, +2618, 3083, 2409, +2634, 3067, 2457, +2634, 3099, 2505, +2634, 3083, 2585, +2666, 3083, 2634, +2666, 3099, 2682, +2730, 3115, 2746, +2746, 3131, 2810, +2778, 3131, 2891, +2778, 3131, 2971, +2746, 3308, 2200, +2730, 3292, 2200, +2682, 3292, 2216, +2714, 3308, 2296, +2746, 3308, 2345, +2762, 3292, 2393, +2778, 3276, 2457, +2746, 3276, 2521, +2762, 3276, 2569, +2778, 3260, 2634, +2794, 3276, 2714, +2794, 3276, 2746, +2842, 3292, 2794, +2875, 3292, 2875, +2858, 3292, 2907, +2891, 3308, 2987, +2923, 3340, 3099, +2891, 3485, 2345, +2891, 3485, 2345, +2939, 3501, 2361, +2875, 3485, 2409, +2858, 3485, 2425, +2907, 3501, 2489, +2907, 3485, 2569, +2923, 3485, 2634, +2955, 3501, 2714, +2987, 3485, 2746, +3019, 3501, 2842, +3051, 3517, 2923, +3067, 3501, 2971, +3051, 3517, 3051, +3099, 3533, 3131, +3131, 3533, 3180, +3164, 3549, 3228, +594, 321, 466, +530, 369, 498, +498, 401, 562, +530, 418, 658, +562, 450, 707, +546, 482, 787, +594, 562, 915, +642, 594, 996, +707, 626, 1076, +755, 707, 1204, +787, 755, 1285, +851, 803, 1397, +899, 867, 1493, +1012, 915, 1574, +1060, 980, 1670, +1108, 1060, 1815, +1188, 1108, 1895, +658, 450, 466, +610, 450, 546, +546, 482, 594, +578, 514, 674, +562, 562, 771, +594, 594, 867, +594, 610, 931, +642, 642, 1028, +707, 723, 1124, +739, 739, 1204, +803, 803, 1317, +899, 883, 1445, +931, 899, 1510, +996, 947, 1606, +1060, 1012, 1702, +1092, 1076, 1783, +1188, 1140, 1927, +658, 626, 514, +674, 626, 562, +642, 642, 723, +658, 658, 787, +626, 691, 851, +610, 723, 947, +658, 739, 996, +707, 787, 1092, +739, 803, 1172, +803, 867, 1301, +867, 883, 1381, +883, 915, 1445, +947, 980, 1542, +1028, 1028, 1654, +1092, 1092, 1750, +1156, 1124, 1863, +1204, 1188, 1943, +755, 835, 642, +755, 819, 674, +739, 819, 755, +739, 851, 867, +723, 867, 931, +755, 899, 1044, +787, 915, 1108, +819, 947, 1204, +819, 964, 1269, +851, 996, 1349, +899, 1012, 1413, +964, 1076, 1526, +1028, 1092, 1622, +1076, 1140, 1718, +1156, 1188, 1815, +1220, 1237, 1927, +1253, 1269, 1975, +835, 1028, 739, +835, 1012, 787, +819, 1028, 867, +803, 1044, 996, +835, 1060, 1060, +851, 1076, 1156, +883, 1092, 1188, +883, 1108, 1269, +931, 1124, 1381, +964, 1140, 1461, +980, 1172, 1526, +1028, 1204, 1622, +1092, 1253, 1702, +1140, 1285, 1799, +1220, 1301, 1863, +1285, 1349, 1975, +1349, 1397, 2072, +980, 1220, 867, +964, 1220, 915, +964, 1237, 996, +931, 1220, 1076, +947, 1220, 1156, +980, 1237, 1204, +996, 1253, 1301, +1028, 1269, 1381, +1060, 1285, 1461, +1044, 1317, 1558, +1092, 1349, 1622, +1140, 1349, 1686, +1188, 1381, 1783, +1253, 1429, 1863, +1301, 1461, 1959, +1381, 1493, 2056, +1429, 1526, 2120, +1124, 1429, 980, +1108, 1429, 1028, +1124, 1429, 1108, +1108, 1445, 1204, +1124, 1461, 1301, +1124, 1445, 1349, +1108, 1445, 1365, +1156, 1477, 1493, +1172, 1493, 1558, +1188, 1493, 1654, +1204, 1526, 1734, +1220, 1558, 1815, +1269, 1558, 1895, +1365, 1590, 1959, +1397, 1606, 2039, +1445, 1638, 2104, +1510, 1686, 2216, +1237, 1638, 1124, +1269, 1622, 1188, +1285, 1638, 1220, +1253, 1638, 1301, +1285, 1622, 1381, +1269, 1638, 1445, +1285, 1654, 1542, +1349, 1670, 1558, +1349, 1670, 1622, +1365, 1686, 1750, +1397, 1718, 1847, +1413, 1718, 1911, +1461, 1750, 1991, +1461, 1766, 2039, +1558, 1815, 2152, +1574, 1815, 2232, +1638, 1863, 2345, +1413, 1831, 1220, +1429, 1831, 1285, +1445, 1831, 1349, +1397, 1831, 1397, +1429, 1831, 1477, +1445, 1847, 1574, +1429, 1847, 1638, +1477, 1863, 1718, +1493, 1863, 1750, +1526, 1895, 1831, +1542, 1895, 1895, +1574, 1911, 1975, +1654, 1927, 2072, +1686, 1943, 2152, +1718, 1959, 2232, +1766, 1991, 2329, +1783, 1991, 2361, +1622, 2039, 1349, +1638, 2039, 1413, +1654, 2056, 1461, +1606, 2039, 1542, +1638, 2039, 1574, +1654, 2056, 1670, +1670, 2039, 1718, +1686, 2039, 1783, +1702, 2072, 1863, +1718, 2072, 1911, +1750, 2088, 1975, +1750, 2088, 2072, +1831, 2136, 2152, +1831, 2120, 2200, +1895, 2136, 2280, +1959, 2136, 2361, +1991, 2200, 2473, +1847, 2248, 1477, +1847, 2248, 1493, +1831, 2248, 1526, +1815, 2248, 1606, +1831, 2248, 1670, +1863, 2264, 1783, +1879, 2264, 1847, +1911, 2264, 1879, +1927, 2280, 1959, +1927, 2296, 2023, +1975, 2312, 2072, +1991, 2312, 2152, +2007, 2329, 2248, +2056, 2361, 2345, +2056, 2345, 2393, +2136, 2361, 2489, +2136, 2345, 2537, +2023, 2457, 1590, +2072, 2457, 1638, +2039, 2441, 1654, +2007, 2441, 1734, +2056, 2457, 1815, +2056, 2441, 1863, +2104, 2473, 1959, +2072, 2457, 2007, +2104, 2473, 2072, +2120, 2473, 2152, +2152, 2473, 2216, +2168, 2505, 2280, +2184, 2505, 2345, +2184, 2521, 2473, +2216, 2537, 2553, +2264, 2553, 2602, +2329, 2553, 2682, +2200, 2650, 1750, +2232, 2666, 1799, +2216, 2666, 1815, +2184, 2666, 1847, +2216, 2682, 1959, +2232, 2682, 2023, +2264, 2650, 2072, +2280, 2682, 2152, +2280, 2666, 2216, +2280, 2698, 2280, +2296, 2682, 2345, +2345, 2698, 2393, +2361, 2714, 2473, +2409, 2714, 2521, +2425, 2714, 2585, +2409, 2762, 2730, +2441, 2762, 2810, +2393, 2891, 1927, +2393, 2891, 1927, +2393, 2891, 1959, +2361, 2891, 2007, +2377, 2875, 2072, +2409, 2875, 2152, +2425, 2875, 2216, +2441, 2875, 2312, +2473, 2891, 2361, +2489, 2875, 2377, +2473, 2875, 2441, +2505, 2891, 2521, +2553, 2907, 2569, +2553, 2891, 2618, +2585, 2907, 2698, +2634, 2923, 2794, +2634, 2939, 2891, +2553, 3083, 2039, +2569, 3083, 2039, +2585, 3083, 2120, +2553, 3083, 2104, +2553, 3083, 2168, +2569, 3067, 2248, +2585, 3051, 2280, +2618, 3035, 2377, +2634, 3083, 2473, +2634, 3083, 2505, +2650, 3067, 2569, +2682, 3099, 2650, +2730, 3099, 2698, +2714, 3115, 2730, +2762, 3131, 2810, +2794, 3148, 2891, +2794, 3148, 2987, +2778, 3292, 2200, +2746, 3308, 2200, +2762, 3292, 2248, +2730, 3308, 2280, +2746, 3292, 2296, +2762, 3276, 2361, +2778, 3292, 2457, +2794, 3276, 2521, +2810, 3276, 2585, +2778, 3260, 2634, +2826, 3292, 2698, +2826, 3292, 2730, +2842, 3276, 2794, +2875, 3292, 2875, +2907, 3308, 2923, +2955, 3324, 3003, +2939, 3340, 3083, +2955, 3501, 2329, +2891, 3485, 2345, +2923, 3517, 2329, +2939, 3501, 2393, +2907, 3501, 2457, +2923, 3517, 2505, +2923, 3517, 2602, +2955, 3501, 2666, +2987, 3485, 2730, +3019, 3485, 2762, +3051, 3485, 2826, +3051, 3517, 2923, +3067, 3501, 2971, +3099, 3517, 3051, +3083, 3533, 3131, +3115, 3533, 3180, +3164, 3549, 3228, +771, 418, 498, +739, 450, 562, +674, 498, 642, +658, 530, 707, +707, 562, 819, +691, 578, 883, +674, 626, 964, +739, 658, 1028, +755, 707, 1124, +819, 755, 1237, +867, 819, 1333, +931, 867, 1429, +980, 899, 1510, +1076, 964, 1606, +1108, 1028, 1718, +1140, 1060, 1799, +1204, 1124, 1927, +851, 530, 530, +819, 546, 610, +723, 594, 691, +691, 610, 755, +707, 626, 835, +723, 626, 931, +755, 691, 980, +755, 723, 1060, +803, 771, 1172, +867, 819, 1269, +915, 867, 1381, +964, 899, 1461, +1012, 947, 1526, +1044, 996, 1638, +1124, 1060, 1734, +1156, 1092, 1831, +1253, 1188, 1959, +915, 674, 498, +883, 691, 562, +819, 691, 755, +739, 739, 835, +755, 755, 899, +771, 771, 980, +771, 803, 1044, +803, 835, 1140, +851, 867, 1220, +883, 899, 1317, +899, 931, 1413, +980, 980, 1493, +1028, 1044, 1606, +1092, 1076, 1686, +1140, 1108, 1766, +1188, 1172, 1879, +1285, 1220, 1991, +899, 883, 658, +899, 867, 707, +915, 883, 787, +883, 899, 947, +867, 931, 996, +835, 931, 1076, +835, 947, 1124, +867, 980, 1237, +883, 996, 1317, +947, 1044, 1397, +964, 1044, 1461, +1028, 1108, 1574, +1076, 1140, 1638, +1124, 1172, 1734, +1188, 1220, 1847, +1269, 1253, 1911, +1317, 1301, 2007, +964, 1044, 771, +947, 1060, 851, +964, 1044, 899, +947, 1076, 1012, +931, 1076, 1076, +931, 1108, 1156, +947, 1124, 1237, +996, 1156, 1333, +980, 1172, 1397, +1028, 1156, 1445, +1076, 1204, 1558, +1108, 1237, 1638, +1140, 1253, 1718, +1204, 1301, 1799, +1285, 1333, 1879, +1301, 1349, 1959, +1365, 1413, 2088, +1076, 1253, 883, +1060, 1253, 947, +1092, 1253, 996, +1076, 1269, 1092, +1044, 1269, 1172, +1092, 1285, 1269, +1060, 1285, 1349, +1108, 1317, 1429, +1092, 1317, 1493, +1140, 1349, 1558, +1156, 1365, 1622, +1172, 1397, 1702, +1237, 1413, 1799, +1317, 1445, 1895, +1349, 1477, 1975, +1397, 1510, 2088, +1477, 1558, 2136, +1220, 1445, 1012, +1204, 1445, 1028, +1188, 1461, 1124, +1188, 1445, 1204, +1156, 1445, 1269, +1156, 1477, 1381, +1172, 1477, 1397, +1204, 1493, 1510, +1220, 1493, 1574, +1253, 1526, 1654, +1237, 1542, 1750, +1301, 1558, 1847, +1349, 1574, 1847, +1413, 1622, 1975, +1445, 1654, 2056, +1510, 1670, 2152, +1542, 1686, 2232, +1333, 1654, 1092, +1349, 1638, 1156, +1333, 1654, 1204, +1349, 1654, 1301, +1317, 1654, 1381, +1333, 1654, 1477, +1365, 1686, 1542, +1381, 1670, 1574, +1413, 1686, 1686, +1429, 1702, 1750, +1461, 1734, 1879, +1461, 1750, 1911, +1493, 1766, 1991, +1526, 1799, 2072, +1558, 1815, 2168, +1622, 1847, 2232, +1686, 1895, 2312, +1461, 1847, 1220, +1493, 1847, 1269, +1510, 1847, 1333, +1493, 1847, 1397, +1461, 1847, 1461, +1526, 1863, 1574, +1510, 1863, 1638, +1526, 1879, 1702, +1558, 1879, 1750, +1590, 1895, 1783, +1574, 1911, 1927, +1606, 1927, 2007, +1686, 1927, 2072, +1718, 1927, 2152, +1718, 1975, 2232, +1783, 2007, 2312, +1815, 2023, 2393, +1670, 2039, 1333, +1686, 2056, 1381, +1670, 2056, 1445, +1670, 2056, 1493, +1686, 2072, 1574, +1702, 2056, 1686, +1734, 2072, 1766, +1718, 2072, 1815, +1750, 2088, 1879, +1799, 2104, 1943, +1831, 2104, 1975, +1815, 2136, 2088, +1863, 2136, 2152, +1927, 2136, 2232, +1943, 2136, 2296, +2007, 2184, 2409, +2023, 2232, 2505, +1895, 2280, 1461, +1879, 2280, 1493, +1895, 2264, 1558, +1895, 2280, 1622, +1895, 2280, 1702, +1911, 2280, 1815, +1927, 2264, 1863, +1975, 2296, 1911, +1943, 2296, 1975, +1975, 2296, 2039, +2007, 2312, 2088, +2039, 2329, 2168, +2088, 2361, 2296, +2088, 2345, 2345, +2104, 2361, 2409, +2136, 2361, 2489, +2184, 2393, 2585, +2088, 2473, 1622, +2088, 2489, 1622, +2088, 2473, 1654, +2104, 2473, 1718, +2072, 2473, 1799, +2072, 2457, 1895, +2136, 2473, 1991, +2136, 2489, 2039, +2136, 2473, 2088, +2152, 2489, 2136, +2184, 2505, 2216, +2216, 2521, 2264, +2248, 2521, 2329, +2264, 2537, 2473, +2296, 2537, 2505, +2312, 2537, 2585, +2329, 2569, 2698, +2264, 2682, 1750, +2264, 2682, 1783, +2248, 2666, 1799, +2248, 2698, 1879, +2216, 2682, 1927, +2264, 2666, 2023, +2280, 2682, 2088, +2312, 2682, 2152, +2280, 2682, 2216, +2312, 2682, 2280, +2345, 2698, 2377, +2377, 2698, 2409, +2377, 2714, 2489, +2409, 2730, 2569, +2441, 2746, 2650, +2473, 2778, 2762, +2473, 2762, 2778, +2409, 2891, 1911, +2393, 2891, 1927, +2425, 2891, 1927, +2425, 2891, 1991, +2409, 2907, 2072, +2473, 2891, 2136, +2473, 2891, 2232, +2489, 2891, 2296, +2505, 2891, 2361, +2537, 2875, 2393, +2521, 2891, 2457, +2521, 2875, 2505, +2585, 2891, 2569, +2569, 2907, 2634, +2618, 2939, 2730, +2634, 2939, 2810, +2634, 2939, 2891, +2602, 3067, 2007, +2618, 3099, 2056, +2602, 3067, 2072, +2585, 3083, 2120, +2602, 3083, 2216, +2618, 3083, 2280, +2650, 3083, 2312, +2650, 3067, 2361, +2666, 3067, 2473, +2682, 3099, 2521, +2682, 3083, 2569, +2698, 3115, 2666, +2730, 3115, 2714, +2762, 3115, 2746, +2778, 3115, 2810, +2842, 3148, 2923, +2794, 3148, 3003, +2746, 3292, 2168, +2778, 3292, 2216, +2778, 3292, 2216, +2762, 3292, 2264, +2762, 3308, 2312, +2762, 3292, 2361, +2778, 3276, 2425, +2794, 3260, 2489, +2794, 3260, 2569, +2826, 3276, 2650, +2858, 3308, 2682, +2842, 3276, 2762, +2875, 3292, 2842, +2891, 3308, 2891, +2939, 3324, 2939, +2955, 3324, 3019, +2987, 3340, 3083, +2907, 3501, 2329, +2923, 3501, 2329, +2939, 3501, 2361, +2987, 3517, 2409, +2923, 3517, 2473, +2955, 3517, 2537, +2955, 3501, 2585, +3003, 3501, 2634, +3035, 3501, 2746, +3035, 3501, 2778, +3067, 3501, 2842, +3099, 3517, 2923, +3067, 3517, 2987, +3083, 3517, 3051, +3131, 3533, 3131, +3131, 3533, 3180, +3164, 3549, 3228, +996, 514, 562, +947, 546, 626, +819, 578, 723, +803, 626, 771, +803, 642, 851, +819, 674, 947, +819, 707, 1012, +867, 739, 1108, +883, 787, 1188, +947, 819, 1301, +964, 851, 1365, +1012, 899, 1461, +1076, 947, 1542, +1124, 1028, 1654, +1156, 1060, 1734, +1220, 1124, 1863, +1285, 1188, 1959, +1028, 594, 562, +996, 610, 658, +899, 674, 787, +835, 723, 851, +835, 723, 883, +851, 739, 980, +851, 755, 1044, +883, 803, 1140, +883, 835, 1220, +947, 883, 1317, +980, 899, 1397, +1060, 964, 1493, +1076, 1012, 1590, +1108, 1060, 1670, +1172, 1108, 1783, +1253, 1172, 1879, +1317, 1220, 2007, +1092, 723, 514, +1028, 739, 658, +980, 755, 803, +883, 803, 883, +899, 851, 964, +915, 851, 1044, +931, 867, 1140, +931, 899, 1188, +947, 915, 1269, +964, 947, 1349, +1012, 980, 1413, +1044, 1044, 1526, +1092, 1076, 1622, +1140, 1124, 1734, +1204, 1172, 1815, +1269, 1220, 1927, +1349, 1253, 1975, +1076, 899, 642, +1108, 899, 707, +1108, 899, 771, +1028, 931, 980, +931, 947, 1028, +964, 980, 1140, +947, 996, 1204, +964, 1028, 1269, +996, 1044, 1333, +1044, 1076, 1413, +1076, 1108, 1510, +1108, 1124, 1574, +1156, 1172, 1686, +1220, 1204, 1766, +1269, 1269, 1847, +1349, 1301, 1959, +1365, 1333, 2023, +1092, 1092, 787, +1108, 1124, 851, +1108, 1124, 931, +1108, 1092, 964, +1092, 1140, 1156, +1060, 1140, 1172, +1044, 1172, 1269, +1044, 1156, 1317, +1076, 1204, 1413, +1108, 1237, 1493, +1140, 1253, 1574, +1188, 1285, 1670, +1269, 1301, 1734, +1285, 1349, 1831, +1349, 1365, 1927, +1381, 1381, 2007, +1429, 1461, 2104, +1220, 1285, 915, +1204, 1285, 964, +1204, 1301, 1060, +1188, 1285, 1124, +1172, 1301, 1220, +1172, 1333, 1317, +1156, 1333, 1381, +1172, 1333, 1445, +1188, 1365, 1477, +1220, 1397, 1606, +1204, 1397, 1654, +1253, 1413, 1734, +1301, 1445, 1831, +1333, 1477, 1927, +1365, 1493, 2007, +1461, 1542, 2056, +1526, 1590, 2184, +1285, 1477, 1044, +1301, 1477, 1076, +1253, 1477, 1108, +1269, 1477, 1204, +1285, 1477, 1301, +1237, 1493, 1349, +1253, 1510, 1445, +1269, 1526, 1558, +1301, 1542, 1622, +1269, 1542, 1670, +1381, 1574, 1750, +1397, 1590, 1831, +1445, 1622, 1911, +1477, 1654, 2007, +1510, 1670, 2088, +1558, 1702, 2184, +1622, 1734, 2232, +1429, 1686, 1140, +1461, 1670, 1172, +1445, 1686, 1237, +1429, 1686, 1317, +1429, 1686, 1397, +1413, 1702, 1493, +1413, 1702, 1574, +1445, 1702, 1622, +1477, 1718, 1718, +1526, 1750, 1783, +1542, 1750, 1831, +1542, 1766, 1927, +1574, 1799, 1991, +1622, 1815, 2088, +1638, 1831, 2168, +1702, 1863, 2232, +1750, 1879, 2312, +1558, 1863, 1237, +1558, 1879, 1285, +1574, 1879, 1349, +1542, 1863, 1381, +1574, 1863, 1477, +1558, 1895, 1590, +1590, 1879, 1654, +1606, 1895, 1718, +1638, 1911, 1750, +1638, 1911, 1847, +1654, 1927, 1943, +1686, 1927, 2023, +1750, 1943, 2104, +1766, 1991, 2200, +1799, 1991, 2232, +1847, 2023, 2345, +1895, 2039, 2393, +1750, 2088, 1397, +1750, 2088, 1381, +1734, 2088, 1413, +1750, 2072, 1493, +1750, 2072, 1558, +1750, 2088, 1654, +1783, 2072, 1766, +1783, 2088, 1799, +1799, 2088, 1863, +1847, 2104, 1927, +1879, 2120, 1975, +1847, 2136, 2104, +1911, 2136, 2168, +1975, 2152, 2264, +2023, 2184, 2345, +2023, 2216, 2441, +2056, 2232, 2521, +1959, 2312, 1510, +1943, 2296, 1493, +1959, 2296, 1558, +1991, 2296, 1622, +1959, 2296, 1702, +1959, 2280, 1783, +1991, 2280, 1863, +2023, 2296, 1943, +2023, 2329, 2007, +2039, 2329, 2072, +2072, 2345, 2120, +2104, 2345, 2200, +2104, 2329, 2280, +2104, 2361, 2361, +2120, 2361, 2425, +2136, 2377, 2505, +2264, 2393, 2602, +2136, 2473, 1638, +2088, 2473, 1622, +2136, 2489, 1638, +2120, 2489, 1702, +2120, 2473, 1783, +2152, 2489, 1895, +2152, 2473, 1975, +2168, 2489, 2039, +2184, 2473, 2104, +2200, 2505, 2152, +2232, 2505, 2232, +2264, 2521, 2264, +2296, 2521, 2345, +2312, 2537, 2457, +2329, 2537, 2521, +2361, 2553, 2602, +2393, 2585, 2682, +2264, 2682, 1750, +2264, 2682, 1750, +2296, 2682, 1831, +2296, 2666, 1863, +2296, 2682, 1943, +2280, 2682, 2007, +2312, 2682, 2072, +2377, 2714, 2200, +2361, 2698, 2248, +2377, 2698, 2312, +2361, 2714, 2345, +2393, 2714, 2425, +2457, 2746, 2457, +2473, 2746, 2553, +2473, 2746, 2650, +2521, 2762, 2730, +2537, 2778, 2810, +2457, 2891, 1879, +2457, 2907, 1895, +2505, 2907, 1927, +2521, 2907, 1991, +2521, 2891, 2072, +2489, 2907, 2120, +2521, 2891, 2200, +2537, 2891, 2296, +2569, 2891, 2345, +2553, 2891, 2409, +2569, 2907, 2473, +2602, 2907, 2553, +2618, 2923, 2602, +2618, 2923, 2666, +2650, 2923, 2730, +2698, 2955, 2794, +2714, 2971, 2939, +2650, 3083, 2023, +2650, 3083, 2039, +2650, 3083, 2056, +2682, 3099, 2136, +2666, 3099, 2216, +2634, 3099, 2264, +2666, 3099, 2345, +2682, 3099, 2393, +2698, 3083, 2457, +2730, 3099, 2537, +2714, 3115, 2602, +2746, 3115, 2682, +2778, 3115, 2714, +2794, 3148, 2778, +2826, 3148, 2842, +2826, 3148, 2907, +2875, 3180, 3035, +2826, 3292, 2184, +2794, 3308, 2184, +2778, 3292, 2200, +2794, 3276, 2232, +2810, 3276, 2296, +2762, 3276, 2329, +2826, 3292, 2441, +2842, 3292, 2537, +2842, 3276, 2585, +2858, 3292, 2650, +2875, 3292, 2714, +2907, 3292, 2778, +2907, 3308, 2826, +2939, 3324, 2907, +2955, 3308, 2939, +3003, 3340, 3035, +3003, 3356, 3099, +2939, 3517, 2312, +3019, 3517, 2361, +2971, 3517, 2345, +3035, 3517, 2393, +2971, 3517, 2441, +3003, 3517, 2521, +3003, 3501, 2618, +3035, 3501, 2682, +3051, 3501, 2746, +3083, 3501, 2778, +3115, 3517, 2875, +3099, 3517, 2939, +3131, 3533, 3019, +3148, 3517, 3067, +3164, 3549, 3131, +3180, 3549, 3164, +3212, 3549, 3228, +1188, 594, 578, +1124, 642, 674, +1044, 691, 803, +947, 739, 851, +931, 755, 931, +980, 787, 1012, +996, 819, 1092, +1028, 851, 1204, +1044, 867, 1253, +1028, 899, 1349, +1044, 931, 1413, +1108, 996, 1510, +1156, 1044, 1622, +1188, 1060, 1686, +1253, 1124, 1799, +1317, 1188, 1911, +1349, 1220, 1959, +1220, 691, 610, +1204, 691, 691, +1092, 739, 819, +996, 787, 899, +996, 819, 964, +996, 835, 1060, +1028, 883, 1124, +1028, 883, 1204, +1060, 915, 1269, +1060, 947, 1365, +1108, 1012, 1461, +1140, 1028, 1542, +1172, 1060, 1638, +1204, 1108, 1702, +1285, 1156, 1831, +1333, 1204, 1943, +1381, 1237, 1975, +1285, 771, 578, +1237, 803, 739, +1172, 835, 851, +1092, 867, 964, +1044, 899, 1012, +1044, 915, 1076, +1028, 931, 1156, +1076, 947, 1237, +1060, 1012, 1333, +1076, 1044, 1397, +1124, 1076, 1493, +1140, 1092, 1558, +1204, 1140, 1670, +1253, 1172, 1766, +1285, 1220, 1847, +1381, 1253, 1927, +1381, 1285, 2023, +1285, 931, 626, +1301, 931, 674, +1237, 947, 867, +1172, 996, 1044, +1092, 1028, 1076, +1108, 1060, 1156, +1108, 1060, 1237, +1140, 1076, 1301, +1108, 1108, 1381, +1140, 1140, 1461, +1140, 1156, 1542, +1220, 1188, 1638, +1253, 1237, 1734, +1301, 1269, 1815, +1349, 1301, 1895, +1397, 1333, 1959, +1461, 1381, 2072, +1269, 1124, 771, +1285, 1124, 819, +1253, 1124, 883, +1285, 1108, 964, +1220, 1140, 1172, +1172, 1188, 1237, +1188, 1204, 1301, +1172, 1220, 1397, +1172, 1237, 1461, +1220, 1269, 1558, +1237, 1285, 1622, +1253, 1317, 1686, +1333, 1333, 1783, +1365, 1349, 1863, +1413, 1413, 1959, +1461, 1445, 2056, +1526, 1493, 2120, +1301, 1333, 980, +1301, 1333, 980, +1317, 1333, 1028, +1317, 1317, 1108, +1333, 1317, 1188, +1301, 1333, 1317, +1285, 1365, 1381, +1269, 1381, 1461, +1237, 1397, 1526, +1253, 1429, 1606, +1317, 1429, 1686, +1349, 1445, 1766, +1397, 1493, 1863, +1429, 1510, 1943, +1493, 1542, 2023, +1542, 1590, 2120, +1622, 1638, 2200, +1397, 1526, 1076, +1429, 1510, 1108, +1413, 1526, 1156, +1397, 1526, 1253, +1397, 1526, 1333, +1381, 1542, 1413, +1365, 1542, 1493, +1349, 1558, 1558, +1365, 1558, 1622, +1397, 1574, 1686, +1445, 1606, 1766, +1477, 1622, 1879, +1493, 1638, 1943, +1542, 1670, 2039, +1574, 1686, 2120, +1654, 1734, 2184, +1686, 1750, 2264, +1574, 1718, 1204, +1558, 1702, 1220, +1558, 1718, 1253, +1526, 1718, 1333, +1542, 1718, 1413, +1558, 1718, 1510, +1542, 1718, 1590, +1558, 1750, 1654, +1558, 1750, 1734, +1558, 1734, 1783, +1574, 1766, 1863, +1622, 1815, 1975, +1638, 1815, 2023, +1670, 1831, 2120, +1734, 1879, 2200, +1783, 1879, 2264, +1815, 1895, 2345, +1686, 1895, 1285, +1670, 1895, 1285, +1670, 1879, 1333, +1654, 1895, 1397, +1670, 1895, 1493, +1670, 1911, 1558, +1670, 1911, 1686, +1686, 1911, 1734, +1734, 1927, 1799, +1734, 1927, 1879, +1766, 1943, 1959, +1815, 1975, 2023, +1815, 1975, 2088, +1847, 2007, 2168, +1863, 2039, 2264, +1911, 2039, 2345, +1943, 2056, 2425, +1847, 2088, 1349, +1863, 2104, 1397, +1831, 2104, 1413, +1847, 2088, 1493, +1847, 2104, 1574, +1863, 2104, 1670, +1847, 2104, 1783, +1911, 2120, 1831, +1879, 2136, 1895, +1927, 2136, 1943, +1959, 2120, 2023, +1975, 2120, 2088, +2023, 2152, 2184, +2023, 2184, 2296, +2056, 2216, 2393, +2072, 2232, 2441, +2120, 2280, 2537, +2039, 2312, 1493, +2039, 2312, 1526, +2007, 2296, 1542, +2023, 2329, 1622, +2056, 2312, 1702, +2056, 2329, 1783, +2023, 2329, 1863, +2088, 2329, 1975, +2072, 2329, 1991, +2104, 2345, 2104, +2136, 2345, 2136, +2136, 2329, 2168, +2136, 2377, 2312, +2152, 2377, 2377, +2184, 2393, 2457, +2232, 2393, 2537, +2280, 2409, 2634, +2216, 2505, 1606, +2200, 2489, 1606, +2200, 2505, 1670, +2216, 2505, 1734, +2200, 2505, 1783, +2232, 2521, 1895, +2200, 2505, 1943, +2232, 2505, 2072, +2264, 2505, 2120, +2264, 2521, 2184, +2296, 2537, 2264, +2329, 2537, 2312, +2345, 2537, 2377, +2312, 2537, 2457, +2361, 2569, 2553, +2393, 2585, 2634, +2425, 2602, 2714, +2345, 2698, 1718, +2345, 2714, 1766, +2361, 2714, 1815, +2345, 2698, 1879, +2377, 2714, 1943, +2393, 2714, 2007, +2377, 2714, 2104, +2393, 2714, 2184, +2409, 2714, 2232, +2441, 2714, 2312, +2425, 2730, 2377, +2473, 2746, 2441, +2505, 2762, 2473, +2521, 2762, 2569, +2537, 2762, 2666, +2521, 2778, 2746, +2569, 2810, 2842, +2521, 2907, 1879, +2489, 2891, 1895, +2537, 2907, 1943, +2521, 2891, 1959, +2537, 2891, 2023, +2553, 2891, 2120, +2537, 2907, 2216, +2553, 2907, 2280, +2585, 2907, 2329, +2602, 2907, 2425, +2618, 2907, 2489, +2634, 2923, 2537, +2666, 2939, 2618, +2698, 2939, 2666, +2730, 2955, 2746, +2714, 2971, 2842, +2746, 2955, 2907, +2682, 3099, 2023, +2682, 3099, 2023, +2682, 3115, 2056, +2682, 3099, 2104, +2714, 3115, 2184, +2698, 3099, 2248, +2714, 3131, 2296, +2714, 3099, 2409, +2746, 3099, 2473, +2778, 3099, 2553, +2778, 3131, 2634, +2794, 3131, 2698, +2810, 3148, 2746, +2826, 3131, 2778, +2842, 3131, 2842, +2907, 3180, 2939, +2939, 3180, 3003, +2810, 3276, 2136, +2826, 3292, 2152, +2858, 3292, 2232, +2842, 3292, 2264, +2842, 3292, 2248, +2858, 3292, 2361, +2842, 3308, 2457, +2858, 3308, 2521, +2907, 3324, 2602, +2907, 3308, 2666, +2939, 3308, 2698, +2955, 3340, 2794, +2955, 3324, 2858, +2987, 3324, 2923, +3003, 3356, 2987, +3019, 3356, 3051, +3067, 3388, 3148, +3051, 3517, 2329, +3051, 3517, 2361, +3051, 3517, 2361, +3083, 3517, 2393, +3035, 3517, 2425, +3003, 3517, 2489, +3035, 3517, 2569, +3083, 3517, 2666, +3099, 3501, 2762, +3131, 3517, 2810, +3131, 3533, 2891, +3148, 3533, 2955, +3131, 3533, 3003, +3164, 3533, 3067, +3196, 3549, 3131, +3244, 3565, 3180, +3212, 3565, 3244, +1365, 707, 658, +1349, 739, 739, +1237, 787, 883, +1140, 835, 980, +1108, 883, 1028, +1108, 867, 1092, +1124, 899, 1172, +1172, 947, 1269, +1156, 980, 1349, +1204, 996, 1397, +1188, 1044, 1493, +1220, 1060, 1574, +1269, 1092, 1654, +1317, 1156, 1783, +1349, 1204, 1847, +1397, 1237, 1927, +1461, 1285, 2039, +1381, 771, 658, +1397, 771, 739, +1301, 835, 899, +1188, 867, 980, +1140, 899, 1044, +1124, 915, 1108, +1124, 931, 1188, +1156, 980, 1285, +1172, 1012, 1349, +1220, 1044, 1445, +1204, 1076, 1526, +1269, 1092, 1606, +1285, 1140, 1702, +1317, 1188, 1766, +1381, 1237, 1847, +1445, 1285, 1959, +1445, 1301, 2007, +1445, 851, 642, +1413, 867, 755, +1365, 883, 899, +1237, 947, 1028, +1156, 1012, 1092, +1172, 1012, 1156, +1188, 1044, 1237, +1188, 1060, 1301, +1220, 1076, 1381, +1220, 1076, 1477, +1220, 1124, 1542, +1269, 1156, 1622, +1301, 1188, 1718, +1397, 1253, 1815, +1413, 1269, 1895, +1461, 1317, 1975, +1526, 1365, 2088, +1493, 996, 658, +1493, 980, 723, +1413, 1028, 915, +1349, 1060, 1060, +1253, 1092, 1156, +1237, 1108, 1204, +1204, 1124, 1269, +1253, 1140, 1365, +1253, 1172, 1429, +1253, 1188, 1493, +1269, 1237, 1590, +1333, 1269, 1670, +1365, 1301, 1766, +1397, 1317, 1831, +1429, 1333, 1927, +1510, 1397, 2056, +1510, 1413, 2104, +1461, 1140, 755, +1461, 1156, 819, +1510, 1140, 883, +1445, 1188, 1108, +1381, 1204, 1220, +1301, 1253, 1285, +1301, 1269, 1365, +1317, 1285, 1445, +1333, 1301, 1493, +1349, 1333, 1590, +1365, 1333, 1638, +1397, 1365, 1734, +1397, 1381, 1815, +1445, 1413, 1911, +1477, 1445, 1991, +1574, 1493, 2056, +1622, 1526, 2152, +1493, 1365, 931, +1461, 1349, 964, +1510, 1365, 1028, +1510, 1365, 1108, +1510, 1349, 1172, +1429, 1397, 1397, +1397, 1397, 1429, +1397, 1429, 1493, +1333, 1461, 1574, +1413, 1461, 1638, +1461, 1493, 1766, +1477, 1510, 1831, +1510, 1510, 1879, +1542, 1542, 1943, +1590, 1590, 2039, +1638, 1622, 2136, +1686, 1654, 2248, +1526, 1526, 1076, +1542, 1558, 1172, +1477, 1542, 1156, +1493, 1542, 1220, +1526, 1558, 1301, +1574, 1558, 1397, +1510, 1574, 1526, +1526, 1590, 1574, +1526, 1622, 1686, +1542, 1638, 1750, +1526, 1638, 1815, +1574, 1670, 1895, +1606, 1702, 1991, +1654, 1718, 2039, +1686, 1734, 2120, +1734, 1766, 2232, +1766, 1783, 2312, +1686, 1750, 1204, +1670, 1750, 1237, +1654, 1734, 1285, +1670, 1734, 1349, +1654, 1734, 1397, +1670, 1750, 1510, +1670, 1766, 1590, +1638, 1766, 1670, +1654, 1799, 1766, +1638, 1815, 1815, +1670, 1815, 1895, +1702, 1847, 1991, +1750, 1863, 2039, +1766, 1863, 2104, +1815, 1895, 2200, +1863, 1911, 2280, +1911, 1943, 2377, +1815, 1927, 1285, +1799, 1911, 1301, +1799, 1927, 1365, +1766, 1927, 1429, +1799, 1927, 1477, +1815, 1927, 1574, +1815, 1927, 1670, +1799, 1927, 1750, +1847, 1959, 1815, +1799, 1943, 1879, +1847, 1975, 1975, +1847, 2007, 2056, +1863, 1991, 2120, +1911, 2023, 2200, +1959, 2056, 2296, +1991, 2072, 2377, +2023, 2088, 2425, +1959, 2120, 1397, +1943, 2120, 1429, +1943, 2136, 1461, +1959, 2120, 1526, +1943, 2120, 1574, +1927, 2136, 1670, +1943, 2136, 1734, +1943, 2136, 1847, +1991, 2120, 1911, +2007, 2136, 1959, +2023, 2152, 2056, +2072, 2184, 2152, +2088, 2184, 2216, +2120, 2232, 2296, +2104, 2248, 2393, +2120, 2248, 2457, +2168, 2280, 2553, +2136, 2329, 1526, +2152, 2345, 1542, +2136, 2345, 1606, +2120, 2345, 1654, +2136, 2345, 1718, +2120, 2345, 1783, +2168, 2361, 1863, +2152, 2345, 1975, +2168, 2345, 2039, +2152, 2345, 2088, +2200, 2361, 2152, +2200, 2377, 2232, +2232, 2377, 2312, +2232, 2393, 2377, +2296, 2409, 2473, +2329, 2425, 2553, +2329, 2441, 2634, +2296, 2505, 1590, +2264, 2521, 1622, +2296, 2537, 1686, +2264, 2505, 1718, +2280, 2537, 1799, +2280, 2521, 1879, +2329, 2521, 1991, +2296, 2521, 2072, +2345, 2537, 2152, +2329, 2553, 2216, +2345, 2537, 2280, +2393, 2553, 2296, +2425, 2569, 2377, +2377, 2553, 2489, +2425, 2602, 2585, +2473, 2618, 2650, +2489, 2618, 2746, +2441, 2714, 1750, +2441, 2730, 1799, +2425, 2730, 1815, +2409, 2730, 1847, +2409, 2730, 1911, +2441, 2746, 1991, +2457, 2714, 2104, +2473, 2746, 2184, +2473, 2746, 2280, +2505, 2746, 2345, +2505, 2762, 2425, +2537, 2778, 2473, +2569, 2762, 2505, +2553, 2778, 2569, +2569, 2794, 2714, +2569, 2794, 2762, +2634, 2794, 2842, +2553, 2907, 1879, +2602, 2923, 1895, +2602, 2923, 1895, +2602, 2923, 1975, +2602, 2907, 2056, +2618, 2907, 2120, +2618, 2923, 2200, +2602, 2907, 2312, +2634, 2907, 2345, +2666, 2923, 2409, +2698, 2939, 2505, +2666, 2923, 2553, +2714, 2939, 2634, +2746, 2955, 2682, +2778, 2955, 2762, +2746, 2971, 2858, +2794, 2987, 2939, +2746, 3115, 2007, +2714, 3115, 2023, +2746, 3131, 2056, +2762, 3131, 2120, +2778, 3115, 2184, +2778, 3099, 2264, +2746, 3131, 2312, +2778, 3131, 2377, +2794, 3131, 2489, +2842, 3131, 2585, +2842, 3148, 2618, +2858, 3131, 2682, +2858, 3148, 2762, +2891, 3164, 2810, +2907, 3164, 2875, +2955, 3164, 2923, +2955, 3196, 3051, +2875, 3324, 2152, +2858, 3324, 2152, +2875, 3308, 2200, +2875, 3308, 2232, +2923, 3324, 2296, +2875, 3308, 2345, +2875, 3324, 2409, +2907, 3340, 2537, +2939, 3324, 2618, +2955, 3308, 2682, +2987, 3308, 2730, +2971, 3324, 2778, +3019, 3340, 2891, +2987, 3340, 2923, +3051, 3356, 2987, +3099, 3388, 3099, +3099, 3372, 3148, +3083, 3533, 2312, +3083, 3533, 2361, +3083, 3533, 2361, +3115, 3549, 2409, +3083, 3517, 2409, +3115, 3533, 2521, +3131, 3533, 2585, +3131, 3549, 2698, +3131, 3533, 2762, +3180, 3549, 2810, +3196, 3533, 2875, +3212, 3549, 2987, +3196, 3549, 3003, +3212, 3549, 3067, +3228, 3533, 3131, +3244, 3565, 3196, +3276, 3565, 3276, +1558, 771, 691, +1542, 803, 771, +1445, 867, 947, +1349, 931, 1060, +1253, 964, 1108, +1269, 996, 1156, +1253, 1012, 1237, +1253, 1028, 1301, +1285, 1044, 1381, +1301, 1076, 1461, +1333, 1092, 1542, +1349, 1140, 1638, +1381, 1188, 1734, +1445, 1220, 1815, +1461, 1269, 1879, +1510, 1285, 1959, +1542, 1349, 2088, +1574, 835, 691, +1574, 851, 803, +1477, 883, 915, +1365, 964, 1028, +1285, 1028, 1124, +1269, 1028, 1188, +1269, 1044, 1237, +1285, 1060, 1333, +1301, 1092, 1397, +1317, 1092, 1477, +1349, 1140, 1542, +1397, 1172, 1670, +1413, 1220, 1766, +1429, 1269, 1815, +1493, 1285, 1895, +1510, 1317, 1991, +1574, 1365, 2072, +1606, 931, 707, +1590, 931, 803, +1558, 964, 931, +1429, 1012, 1060, +1333, 1076, 1172, +1301, 1076, 1188, +1285, 1092, 1253, +1333, 1124, 1365, +1317, 1124, 1429, +1365, 1156, 1510, +1381, 1204, 1606, +1397, 1237, 1702, +1397, 1253, 1734, +1461, 1301, 1847, +1510, 1333, 1943, +1542, 1397, 2023, +1574, 1413, 2104, +1670, 1028, 674, +1606, 1060, 819, +1590, 1060, 964, +1510, 1076, 1076, +1397, 1156, 1220, +1349, 1188, 1269, +1333, 1204, 1349, +1365, 1220, 1429, +1397, 1220, 1493, +1413, 1253, 1542, +1429, 1269, 1638, +1429, 1317, 1718, +1461, 1349, 1799, +1510, 1365, 1879, +1558, 1413, 1975, +1606, 1445, 2088, +1654, 1493, 2136, +1702, 1204, 755, +1718, 1204, 819, +1702, 1204, 915, +1622, 1220, 1124, +1542, 1253, 1220, +1445, 1301, 1333, +1445, 1317, 1413, +1445, 1349, 1477, +1461, 1333, 1542, +1461, 1365, 1606, +1477, 1413, 1702, +1461, 1413, 1766, +1526, 1461, 1863, +1542, 1461, 1943, +1622, 1526, 2023, +1670, 1558, 2120, +1686, 1590, 2184, +1670, 1397, 931, +1686, 1381, 947, +1686, 1397, 1028, +1718, 1365, 1076, +1654, 1397, 1285, +1590, 1429, 1413, +1493, 1461, 1461, +1510, 1461, 1526, +1510, 1477, 1606, +1526, 1493, 1702, +1558, 1526, 1766, +1558, 1558, 1847, +1590, 1590, 1927, +1638, 1622, 2023, +1686, 1638, 2104, +1718, 1654, 2168, +1750, 1702, 2232, +1686, 1574, 1044, +1702, 1558, 1092, +1702, 1574, 1172, +1702, 1590, 1220, +1750, 1590, 1301, +1750, 1574, 1397, +1670, 1606, 1558, +1638, 1638, 1638, +1638, 1654, 1702, +1638, 1686, 1783, +1638, 1702, 1831, +1654, 1702, 1895, +1686, 1718, 1959, +1750, 1750, 2072, +1799, 1783, 2168, +1815, 1799, 2248, +1879, 1847, 2329, +1799, 1766, 1204, +1766, 1766, 1253, +1783, 1783, 1285, +1766, 1799, 1381, +1750, 1783, 1429, +1766, 1783, 1526, +1783, 1799, 1590, +1766, 1799, 1734, +1750, 1831, 1815, +1766, 1847, 1847, +1783, 1863, 1927, +1799, 1895, 2007, +1831, 1879, 2072, +1863, 1895, 2152, +1927, 1927, 2248, +1943, 1943, 2329, +1991, 1991, 2377, +1927, 1927, 1285, +1927, 1927, 1317, +1911, 1927, 1381, +1927, 1959, 1461, +1927, 1943, 1526, +1911, 1943, 1590, +1943, 1959, 1654, +1927, 1975, 1750, +1911, 1991, 1847, +1895, 1975, 1895, +1911, 2023, 2007, +1943, 2039, 2072, +1975, 2056, 2152, +2007, 2072, 2232, +2039, 2072, 2280, +2072, 2088, 2361, +2120, 2136, 2457, +2072, 2120, 1397, +2088, 2120, 1429, +2088, 2136, 1493, +2088, 2136, 1526, +2072, 2136, 1590, +2088, 2136, 1670, +2072, 2136, 1734, +2056, 2152, 1831, +2072, 2152, 1927, +2120, 2168, 1991, +2104, 2200, 2088, +2152, 2216, 2168, +2136, 2216, 2232, +2168, 2248, 2312, +2184, 2280, 2409, +2216, 2296, 2473, +2248, 2312, 2537, +2248, 2361, 1542, +2232, 2345, 1558, +2232, 2361, 1606, +2216, 2345, 1654, +2216, 2345, 1718, +2216, 2345, 1750, +2216, 2361, 1847, +2216, 2361, 1959, +2216, 2361, 2056, +2248, 2361, 2120, +2248, 2377, 2168, +2264, 2393, 2264, +2329, 2393, 2345, +2345, 2425, 2441, +2361, 2425, 2505, +2361, 2457, 2585, +2393, 2473, 2666, +2409, 2537, 1654, +2377, 2521, 1654, +2393, 2537, 1702, +2377, 2537, 1734, +2377, 2537, 1799, +2393, 2553, 1895, +2377, 2553, 1991, +2377, 2537, 2072, +2377, 2553, 2120, +2425, 2553, 2216, +2409, 2553, 2280, +2457, 2585, 2345, +2473, 2585, 2441, +2505, 2602, 2505, +2489, 2618, 2585, +2521, 2618, 2666, +2569, 2650, 2762, +2505, 2746, 1799, +2505, 2746, 1783, +2489, 2746, 1815, +2505, 2746, 1879, +2505, 2746, 1943, +2521, 2762, 1991, +2537, 2746, 2104, +2537, 2762, 2184, +2553, 2762, 2280, +2553, 2762, 2377, +2553, 2778, 2441, +2569, 2762, 2473, +2618, 2778, 2521, +2650, 2778, 2553, +2618, 2810, 2698, +2666, 2794, 2794, +2682, 2810, 2875, +2666, 2939, 1895, +2682, 2939, 1895, +2682, 2955, 1943, +2682, 2939, 1991, +2682, 2939, 2023, +2666, 2939, 2088, +2698, 2923, 2216, +2714, 2939, 2312, +2714, 2939, 2393, +2730, 2955, 2457, +2746, 2939, 2521, +2730, 2955, 2585, +2778, 2971, 2666, +2794, 2955, 2698, +2826, 2971, 2778, +2810, 2987, 2891, +2842, 3003, 2955, +2826, 3164, 2023, +2794, 3131, 2039, +2794, 3148, 2039, +2794, 3164, 2120, +2810, 3148, 2168, +2826, 3148, 2280, +2875, 3164, 2329, +2875, 3148, 2409, +2842, 3131, 2489, +2875, 3148, 2569, +2875, 3148, 2666, +2923, 3164, 2714, +2939, 3180, 2762, +2939, 3180, 2826, +3003, 3196, 2891, +3003, 3180, 2955, +2987, 3196, 3051, +2923, 3340, 2136, +2971, 3340, 2184, +2955, 3340, 2216, +2923, 3324, 2232, +2907, 3324, 2296, +2955, 3340, 2345, +2971, 3324, 2441, +2971, 3340, 2521, +2987, 3340, 2618, +3003, 3340, 2682, +3067, 3340, 2762, +3019, 3324, 2794, +3067, 3340, 2891, +3067, 3356, 2971, +3115, 3388, 3035, +3131, 3372, 3051, +3164, 3388, 3148, +3131, 3533, 2296, +3148, 3565, 2361, +3148, 3565, 2345, +3164, 3549, 2425, +3164, 3565, 2457, +3148, 3549, 2489, +3164, 3549, 2585, +3148, 3565, 2650, +3164, 3565, 2746, +3212, 3549, 2810, +3244, 3549, 2891, +3244, 3533, 2971, +3244, 3549, 3019, +3276, 3565, 3099, +3260, 3565, 3180, +3308, 3581, 3228, +3340, 3597, 3308, +1734, 883, 755, +1734, 867, 819, +1670, 931, 964, +1510, 996, 1076, +1429, 1028, 1140, +1381, 1060, 1204, +1397, 1108, 1301, +1413, 1124, 1365, +1429, 1140, 1461, +1429, 1156, 1542, +1477, 1188, 1622, +1510, 1237, 1702, +1542, 1253, 1766, +1542, 1301, 1831, +1558, 1333, 1927, +1622, 1381, 2039, +1654, 1397, 2120, +1734, 915, 755, +1750, 915, 819, +1654, 947, 980, +1558, 1012, 1076, +1477, 1076, 1204, +1413, 1124, 1253, +1413, 1140, 1317, +1429, 1140, 1397, +1445, 1172, 1461, +1461, 1188, 1574, +1510, 1220, 1606, +1510, 1253, 1686, +1542, 1269, 1766, +1542, 1333, 1863, +1590, 1365, 1975, +1622, 1397, 2056, +1686, 1429, 2136, +1750, 1012, 771, +1734, 1028, 883, +1718, 1028, 980, +1622, 1076, 1108, +1542, 1124, 1220, +1429, 1172, 1269, +1445, 1204, 1349, +1477, 1220, 1445, +1477, 1237, 1493, +1493, 1237, 1558, +1526, 1285, 1654, +1558, 1301, 1734, +1574, 1333, 1815, +1590, 1381, 1911, +1638, 1413, 2007, +1654, 1445, 2072, +1702, 1493, 2152, +1879, 1092, 739, +1799, 1124, 883, +1783, 1140, 1012, +1718, 1172, 1156, +1606, 1220, 1253, +1510, 1237, 1317, +1510, 1269, 1365, +1510, 1301, 1461, +1542, 1317, 1542, +1542, 1333, 1606, +1574, 1349, 1686, +1606, 1397, 1799, +1590, 1413, 1863, +1590, 1445, 1943, +1654, 1477, 2007, +1702, 1526, 2120, +1750, 1542, 2200, +1863, 1220, 771, +1895, 1237, 835, +1831, 1237, 964, +1783, 1269, 1140, +1718, 1301, 1285, +1606, 1349, 1397, +1558, 1381, 1429, +1558, 1397, 1526, +1590, 1429, 1622, +1606, 1461, 1686, +1622, 1461, 1750, +1654, 1477, 1847, +1654, 1526, 1895, +1686, 1542, 1975, +1734, 1574, 2072, +1750, 1622, 2184, +1799, 1654, 2232, +1863, 1413, 899, +1895, 1413, 931, +1879, 1413, 1028, +1879, 1397, 1124, +1815, 1429, 1317, +1734, 1477, 1461, +1670, 1510, 1526, +1654, 1542, 1574, +1670, 1558, 1670, +1670, 1574, 1750, +1686, 1574, 1815, +1702, 1622, 1895, +1718, 1654, 1991, +1734, 1654, 2039, +1766, 1670, 2104, +1847, 1734, 2232, +1911, 1734, 2312, +1879, 1606, 1028, +1895, 1606, 1092, +1895, 1622, 1156, +1943, 1638, 1237, +1927, 1606, 1301, +1911, 1622, 1477, +1831, 1654, 1590, +1734, 1686, 1638, +1766, 1702, 1750, +1766, 1718, 1783, +1799, 1750, 1895, +1799, 1766, 1975, +1831, 1783, 2056, +1879, 1799, 2120, +1911, 1831, 2200, +1959, 1847, 2296, +1959, 1863, 2329, +1959, 1815, 1220, +1943, 1815, 1237, +1927, 1815, 1269, +1927, 1815, 1365, +1927, 1815, 1445, +2007, 1815, 1493, +2023, 1831, 1590, +1943, 1847, 1783, +1879, 1863, 1815, +1911, 1879, 1895, +1911, 1895, 1959, +1911, 1911, 2023, +1943, 1927, 2072, +1975, 1943, 2168, +2023, 1959, 2248, +2023, 2007, 2329, +2104, 2023, 2441, +2056, 1991, 1365, +2039, 1975, 1381, +2039, 1975, 1413, +2039, 1991, 1445, +2023, 1991, 1526, +2007, 1991, 1590, +2039, 2007, 1702, +2039, 2007, 1783, +2023, 2023, 1911, +2023, 2039, 1975, +2007, 2056, 1991, +2056, 2072, 2104, +2072, 2072, 2152, +2104, 2088, 2232, +2168, 2136, 2345, +2216, 2168, 2441, +2232, 2168, 2505, +2248, 2184, 1461, +2248, 2184, 1445, +2216, 2184, 1510, +2216, 2184, 1558, +2200, 2184, 1622, +2200, 2168, 1702, +2200, 2184, 1799, +2232, 2200, 1895, +2232, 2232, 1959, +2216, 2232, 2039, +2216, 2248, 2120, +2216, 2264, 2200, +2232, 2280, 2264, +2264, 2280, 2345, +2264, 2312, 2425, +2280, 2312, 2489, +2312, 2312, 2553, +2329, 2377, 1574, +2329, 2377, 1574, +2312, 2361, 1606, +2329, 2361, 1686, +2329, 2361, 1718, +2312, 2377, 1783, +2312, 2361, 1863, +2329, 2393, 1991, +2329, 2377, 2039, +2361, 2393, 2152, +2377, 2393, 2216, +2361, 2409, 2312, +2393, 2425, 2393, +2393, 2441, 2457, +2409, 2473, 2553, +2425, 2489, 2634, +2457, 2489, 2666, +2457, 2553, 1638, +2457, 2553, 1670, +2489, 2553, 1718, +2457, 2537, 1750, +2473, 2569, 1847, +2441, 2553, 1895, +2457, 2553, 1991, +2505, 2585, 2072, +2473, 2553, 2104, +2489, 2585, 2248, +2505, 2585, 2312, +2505, 2602, 2361, +2537, 2618, 2473, +2553, 2618, 2537, +2553, 2634, 2618, +2602, 2666, 2714, +2602, 2682, 2794, +2618, 2778, 1799, +2634, 2762, 1831, +2618, 2762, 1847, +2618, 2794, 1911, +2618, 2778, 1959, +2602, 2778, 1991, +2618, 2762, 2072, +2602, 2778, 2184, +2602, 2762, 2248, +2618, 2778, 2377, +2666, 2794, 2409, +2666, 2810, 2489, +2682, 2794, 2521, +2730, 2794, 2618, +2730, 2810, 2698, +2762, 2826, 2778, +2778, 2826, 2842, +2762, 2955, 1895, +2762, 2939, 1895, +2778, 2971, 1943, +2730, 2939, 1975, +2778, 2955, 2056, +2762, 2971, 2136, +2746, 2971, 2184, +2810, 2971, 2296, +2794, 2971, 2361, +2810, 2971, 2473, +2810, 2955, 2537, +2794, 2971, 2618, +2826, 2971, 2682, +2858, 2971, 2730, +2907, 3003, 2778, +2875, 3019, 2923, +2939, 3051, 2987, +2907, 3148, 2039, +2923, 3180, 2056, +2907, 3164, 2088, +2891, 3164, 2104, +2891, 3164, 2184, +2891, 3164, 2264, +2939, 3180, 2312, +2923, 3148, 2393, +2939, 3164, 2505, +2939, 3180, 2618, +2955, 3164, 2666, +2987, 3180, 2714, +2987, 3196, 2794, +3003, 3196, 2858, +3019, 3180, 2891, +3051, 3196, 2971, +3019, 3196, 3051, +3019, 3340, 2168, +3019, 3340, 2168, +3035, 3340, 2200, +3003, 3356, 2232, +3035, 3356, 2312, +3035, 3356, 2345, +3035, 3356, 2441, +3051, 3340, 2505, +3051, 3372, 2650, +3051, 3356, 2714, +3099, 3372, 2762, +3131, 3404, 2875, +3148, 3388, 2939, +3148, 3388, 2971, +3164, 3388, 3035, +3196, 3404, 3099, +3228, 3404, 3164, +3212, 3565, 2345, +3212, 3565, 2345, +3212, 3565, 2345, +3244, 3581, 2425, +3228, 3565, 2441, +3244, 3565, 2521, +3228, 3581, 2585, +3276, 3565, 2682, +3228, 3565, 2730, +3228, 3549, 2794, +3260, 3565, 2875, +3276, 3549, 2971, +3308, 3565, 3051, +3324, 3581, 3115, +3308, 3581, 3180, +3356, 3581, 3228, +3404, 3613, 3292, +1927, 964, 803, +1911, 964, 899, +1847, 1012, 1028, +1766, 1092, 1172, +1654, 1140, 1269, +1574, 1204, 1333, +1574, 1220, 1365, +1558, 1220, 1429, +1574, 1253, 1510, +1606, 1269, 1622, +1606, 1285, 1654, +1638, 1301, 1766, +1670, 1349, 1831, +1702, 1365, 1911, +1686, 1413, 1991, +1766, 1461, 2088, +1783, 1510, 2184, +1959, 1012, 835, +1943, 1012, 899, +1863, 1060, 1028, +1783, 1108, 1172, +1702, 1172, 1253, +1590, 1220, 1317, +1558, 1220, 1349, +1590, 1253, 1461, +1590, 1253, 1510, +1590, 1285, 1590, +1638, 1317, 1686, +1638, 1333, 1766, +1686, 1365, 1847, +1686, 1381, 1927, +1734, 1445, 2007, +1766, 1461, 2088, +1799, 1510, 2200, +1927, 1076, 819, +1911, 1076, 899, +1911, 1092, 1012, +1799, 1140, 1140, +1750, 1220, 1301, +1638, 1253, 1365, +1606, 1301, 1413, +1606, 1301, 1493, +1622, 1333, 1542, +1654, 1349, 1654, +1638, 1349, 1718, +1686, 1381, 1799, +1702, 1413, 1895, +1734, 1429, 1943, +1734, 1493, 2039, +1799, 1526, 2136, +1831, 1574, 2216, +1991, 1156, 803, +1943, 1204, 915, +1927, 1188, 1044, +1879, 1204, 1140, +1799, 1253, 1285, +1702, 1317, 1397, +1638, 1365, 1445, +1638, 1381, 1542, +1654, 1381, 1606, +1670, 1413, 1686, +1686, 1429, 1750, +1702, 1445, 1831, +1750, 1477, 1895, +1766, 1526, 1991, +1783, 1558, 2072, +1847, 1606, 2184, +1847, 1606, 2200, +2088, 1285, 819, +2072, 1285, 883, +1975, 1333, 1092, +1959, 1333, 1220, +1879, 1365, 1349, +1766, 1413, 1461, +1686, 1445, 1510, +1702, 1477, 1590, +1702, 1477, 1622, +1750, 1510, 1718, +1750, 1542, 1799, +1783, 1558, 1879, +1799, 1590, 1959, +1815, 1622, 2056, +1815, 1638, 2088, +1895, 1670, 2200, +1943, 1702, 2280, +2056, 1461, 915, +2088, 1461, 947, +2088, 1461, 1028, +2039, 1477, 1188, +1991, 1493, 1365, +1927, 1526, 1510, +1847, 1574, 1590, +1799, 1622, 1638, +1799, 1638, 1734, +1831, 1638, 1783, +1831, 1654, 1847, +1847, 1654, 1911, +1879, 1686, 2023, +1879, 1734, 2104, +1943, 1750, 2168, +2007, 1783, 2248, +2007, 1799, 2329, +2072, 1654, 1028, +2088, 1638, 1060, +2104, 1638, 1108, +2136, 1638, 1188, +2104, 1638, 1285, +2072, 1670, 1510, +1991, 1702, 1638, +1911, 1734, 1734, +1879, 1766, 1766, +1911, 1783, 1863, +1943, 1799, 1927, +1975, 1815, 1991, +1959, 1847, 2088, +1975, 1847, 2152, +2007, 1863, 2232, +2056, 1895, 2312, +2104, 1927, 2377, +2136, 1847, 1172, +2136, 1847, 1188, +2152, 1847, 1269, +2136, 1831, 1317, +2168, 1847, 1413, +2200, 1815, 1461, +2136, 1847, 1654, +2120, 1879, 1766, +2023, 1911, 1815, +2039, 1911, 1895, +2039, 1927, 1959, +2088, 1975, 2088, +2072, 1991, 2136, +2088, 2023, 2248, +2152, 2007, 2280, +2200, 2039, 2377, +2216, 2072, 2441, +2216, 2007, 1301, +2184, 2023, 1365, +2200, 2007, 1381, +2200, 2039, 1461, +2184, 2039, 1510, +2200, 2023, 1590, +2232, 2039, 1686, +2296, 2023, 1734, +2184, 2056, 1911, +2184, 2072, 1975, +2168, 2072, 2039, +2152, 2120, 2136, +2200, 2152, 2216, +2232, 2152, 2296, +2264, 2184, 2393, +2312, 2200, 2473, +2312, 2232, 2553, +2345, 2216, 1461, +2361, 2216, 1510, +2345, 2216, 1526, +2329, 2216, 1590, +2329, 2232, 1654, +2312, 2232, 1750, +2312, 2248, 1847, +2345, 2248, 1895, +2361, 2264, 1959, +2329, 2264, 2104, +2329, 2296, 2184, +2296, 2296, 2216, +2312, 2312, 2312, +2329, 2312, 2377, +2345, 2312, 2441, +2361, 2345, 2505, +2425, 2361, 2634, +2505, 2393, 1606, +2489, 2377, 1590, +2489, 2377, 1622, +2473, 2393, 1686, +2457, 2377, 1734, +2457, 2393, 1831, +2473, 2393, 1895, +2473, 2409, 2007, +2489, 2409, 2072, +2473, 2425, 2152, +2473, 2441, 2232, +2473, 2457, 2296, +2473, 2489, 2393, +2505, 2489, 2473, +2489, 2505, 2521, +2505, 2505, 2602, +2553, 2537, 2698, +2585, 2569, 1686, +2585, 2569, 1686, +2585, 2585, 1750, +2585, 2585, 1783, +2569, 2585, 1847, +2618, 2618, 1959, +2569, 2585, 2007, +2569, 2602, 2072, +2602, 2618, 2152, +2602, 2634, 2264, +2585, 2618, 2329, +2618, 2634, 2409, +2634, 2666, 2505, +2650, 2666, 2569, +2650, 2666, 2634, +2666, 2714, 2730, +2666, 2698, 2778, +2746, 2778, 1831, +2698, 2778, 1815, +2714, 2810, 1879, +2714, 2794, 1927, +2730, 2794, 1975, +2698, 2794, 2023, +2730, 2794, 2088, +2698, 2794, 2168, +2698, 2810, 2248, +2746, 2810, 2361, +2762, 2810, 2457, +2762, 2794, 2505, +2778, 2810, 2553, +2794, 2826, 2666, +2842, 2858, 2762, +2842, 2842, 2810, +2842, 2858, 2891, +2858, 2971, 1943, +2875, 2971, 1943, +2842, 2955, 1959, +2858, 2987, 2007, +2875, 2971, 2072, +2858, 2971, 2120, +2842, 2971, 2216, +2826, 2987, 2280, +2858, 2987, 2361, +2858, 2987, 2441, +2875, 2987, 2553, +2907, 3003, 2634, +2891, 3003, 2682, +2939, 3003, 2698, +2971, 3019, 2794, +2939, 3035, 2907, +3003, 3067, 3019, +2971, 3180, 2039, +3003, 3180, 2072, +3019, 3196, 2136, +2987, 3180, 2152, +2987, 3196, 2216, +3003, 3180, 2280, +2987, 3180, 2329, +3019, 3196, 2409, +3051, 3196, 2489, +3035, 3180, 2602, +3019, 3196, 2682, +3051, 3196, 2746, +3051, 3180, 2794, +3051, 3196, 2875, +3099, 3196, 2891, +3115, 3196, 2955, +3148, 3228, 3067, +3099, 3372, 2184, +3115, 3356, 2200, +3131, 3388, 2216, +3115, 3372, 2280, +3099, 3372, 2296, +3115, 3388, 2345, +3115, 3388, 2441, +3164, 3404, 2537, +3180, 3404, 2634, +3148, 3388, 2714, +3148, 3388, 2778, +3180, 3404, 2858, +3196, 3388, 2923, +3244, 3404, 3003, +3260, 3404, 3083, +3276, 3404, 3115, +3324, 3421, 3196, +3292, 3565, 2312, +3308, 3581, 2329, +3276, 3565, 2345, +3292, 3581, 2409, +3276, 3581, 2425, +3308, 3581, 2505, +3292, 3581, 2569, +3308, 3581, 2666, +3292, 3581, 2730, +3308, 3581, 2826, +3324, 3581, 2891, +3356, 3581, 2971, +3372, 3597, 3083, +3372, 3581, 3148, +3404, 3613, 3212, +3421, 3613, 3276, +3437, 3613, 3308, +2120, 1060, 867, +2104, 1060, 931, +2056, 1092, 1044, +1943, 1140, 1188, +1831, 1204, 1285, +1750, 1269, 1381, +1718, 1301, 1445, +1702, 1317, 1510, +1734, 1349, 1606, +1750, 1365, 1670, +1750, 1381, 1734, +1766, 1381, 1799, +1815, 1429, 1879, +1831, 1477, 1975, +1879, 1493, 2072, +1911, 1558, 2168, +1927, 1590, 2264, +2088, 1108, 867, +2072, 1092, 947, +2072, 1140, 1076, +1975, 1172, 1188, +1895, 1237, 1301, +1783, 1285, 1413, +1718, 1349, 1445, +1734, 1349, 1542, +1750, 1365, 1622, +1734, 1381, 1686, +1766, 1397, 1766, +1783, 1429, 1815, +1815, 1445, 1927, +1847, 1493, 1991, +1895, 1510, 2088, +1911, 1558, 2184, +1959, 1590, 2248, +2136, 1188, 899, +2120, 1204, 1012, +2104, 1188, 1076, +2023, 1237, 1237, +1927, 1269, 1333, +1831, 1333, 1461, +1750, 1381, 1477, +1766, 1397, 1558, +1750, 1397, 1606, +1783, 1445, 1686, +1799, 1445, 1766, +1815, 1477, 1831, +1847, 1510, 1943, +1879, 1542, 2007, +1895, 1558, 2120, +1959, 1590, 2184, +1991, 1622, 2248, +2168, 1253, 915, +2120, 1253, 996, +2120, 1269, 1108, +2072, 1269, 1188, +1975, 1349, 1381, +1895, 1397, 1477, +1815, 1445, 1526, +1799, 1461, 1590, +1815, 1477, 1654, +1799, 1493, 1718, +1847, 1526, 1815, +1847, 1542, 1879, +1895, 1590, 2007, +1895, 1606, 2056, +1943, 1622, 2104, +1959, 1654, 2200, +2023, 1702, 2312, +2280, 1333, 835, +2232, 1365, 947, +2168, 1381, 1108, +2152, 1397, 1204, +2088, 1445, 1381, +1991, 1461, 1477, +1911, 1542, 1590, +1847, 1558, 1638, +1895, 1590, 1718, +1879, 1606, 1799, +1895, 1622, 1831, +1911, 1622, 1911, +1927, 1654, 1975, +1991, 1670, 2072, +2023, 1702, 2200, +2039, 1750, 2232, +2088, 1783, 2329, +2329, 1493, 931, +2312, 1493, 980, +2296, 1493, 1076, +2184, 1542, 1285, +2200, 1542, 1381, +2120, 1606, 1526, +2023, 1638, 1638, +1943, 1670, 1686, +1943, 1686, 1766, +1959, 1718, 1831, +1975, 1718, 1895, +1991, 1718, 1975, +2072, 1766, 2056, +2088, 1799, 2136, +2072, 1815, 2200, +2072, 1831, 2280, +2120, 1879, 2377, +2329, 1686, 1076, +2345, 1686, 1076, +2361, 1702, 1140, +2377, 1686, 1237, +2312, 1702, 1397, +2264, 1702, 1526, +2168, 1750, 1670, +2120, 1799, 1766, +2072, 1831, 1831, +2056, 1831, 1895, +2104, 1863, 1959, +2104, 1863, 2023, +2136, 1879, 2104, +2136, 1911, 2184, +2152, 1959, 2280, +2184, 1959, 2345, +2232, 1991, 2441, +2345, 1863, 1156, +2312, 1863, 1204, +2345, 1879, 1253, +2345, 1863, 1301, +2377, 1863, 1397, +2377, 1879, 1493, +2312, 1895, 1686, +2280, 1927, 1815, +2184, 1959, 1895, +2152, 1975, 1927, +2184, 1991, 2007, +2216, 2007, 2088, +2248, 2023, 2168, +2216, 2039, 2232, +2264, 2072, 2329, +2312, 2104, 2425, +2361, 2136, 2521, +2393, 2039, 1301, +2393, 2039, 1333, +2409, 2039, 1365, +2409, 2039, 1445, +2441, 2039, 1477, +2425, 2039, 1558, +2473, 2039, 1670, +2425, 2072, 1847, +2361, 2120, 1975, +2312, 2136, 2007, +2329, 2152, 2104, +2345, 2168, 2168, +2361, 2184, 2248, +2329, 2200, 2296, +2393, 2232, 2393, +2393, 2232, 2489, +2425, 2280, 2553, +2489, 2264, 1510, +2489, 2264, 1510, +2489, 2280, 1558, +2505, 2264, 1606, +2457, 2280, 1670, +2473, 2280, 1734, +2457, 2264, 1783, +2521, 2280, 1863, +2553, 2248, 1943, +2425, 2296, 2152, +2425, 2296, 2184, +2425, 2312, 2248, +2473, 2345, 2345, +2457, 2361, 2409, +2489, 2377, 2489, +2505, 2377, 2553, +2537, 2409, 2650, +2634, 2441, 1606, +2618, 2425, 1622, +2602, 2425, 1670, +2602, 2441, 1718, +2618, 2457, 1799, +2569, 2441, 1863, +2569, 2457, 1927, +2585, 2473, 2039, +2585, 2457, 2104, +2618, 2457, 2136, +2569, 2473, 2280, +2585, 2489, 2361, +2569, 2505, 2425, +2569, 2521, 2505, +2602, 2521, 2569, +2634, 2569, 2650, +2666, 2569, 2746, +2698, 2602, 1702, +2714, 2618, 1750, +2746, 2618, 1799, +2714, 2618, 1847, +2730, 2634, 1911, +2714, 2634, 1975, +2698, 2634, 2039, +2714, 2618, 2088, +2714, 2650, 2200, +2746, 2666, 2312, +2730, 2682, 2377, +2714, 2682, 2441, +2714, 2698, 2505, +2714, 2714, 2618, +2714, 2698, 2682, +2730, 2730, 2762, +2746, 2746, 2842, +2842, 2810, 1847, +2842, 2810, 1879, +2858, 2794, 1911, +2875, 2810, 1911, +2858, 2810, 1975, +2842, 2810, 2039, +2842, 2794, 2120, +2826, 2794, 2184, +2858, 2810, 2296, +2858, 2826, 2329, +2858, 2842, 2441, +2858, 2842, 2537, +2875, 2842, 2602, +2875, 2858, 2682, +2907, 2875, 2762, +2907, 2891, 2826, +2907, 2907, 2907, +2971, 3003, 1943, +2971, 2971, 1959, +2987, 2987, 2007, +2939, 2987, 2023, +2971, 2987, 2104, +2955, 2987, 2152, +2939, 3003, 2232, +2987, 3003, 2312, +2955, 3003, 2361, +2987, 3003, 2473, +3003, 3019, 2585, +2987, 3035, 2682, +3019, 3035, 2714, +3019, 3051, 2762, +3035, 3051, 2858, +3067, 3067, 2971, +3051, 3083, 3035, +3115, 3212, 2104, +3115, 3212, 2088, +3115, 3212, 2136, +3083, 3196, 2184, +3083, 3212, 2216, +3083, 3212, 2280, +3099, 3196, 2312, +3083, 3212, 2409, +3099, 3196, 2473, +3067, 3196, 2569, +3099, 3212, 2666, +3115, 3212, 2746, +3148, 3228, 2826, +3131, 3228, 2875, +3164, 3228, 2923, +3196, 3244, 3003, +3212, 3260, 3115, +3228, 3404, 2216, +3244, 3404, 2232, +3212, 3404, 2264, +3228, 3404, 2296, +3212, 3404, 2345, +3196, 3404, 2377, +3212, 3388, 2441, +3212, 3404, 2521, +3228, 3404, 2618, +3228, 3388, 2714, +3324, 3421, 2810, +3292, 3421, 2907, +3292, 3404, 2955, +3340, 3421, 3051, +3324, 3437, 3115, +3372, 3453, 3164, +3388, 3437, 3196, +3388, 3581, 2361, +3421, 3613, 2377, +3404, 3597, 2409, +3388, 3597, 2441, +3388, 3597, 2473, +3372, 3597, 2505, +3356, 3597, 2553, +3388, 3613, 2666, +3388, 3629, 2746, +3372, 3613, 2826, +3421, 3581, 2891, +3421, 3613, 2971, +3453, 3581, 3099, +3469, 3613, 3148, +3469, 3597, 3212, +3485, 3613, 3260, +3517, 3629, 3308, +2296, 1156, 915, +2296, 1156, 1012, +2264, 1172, 1140, +2168, 1237, 1237, +2072, 1301, 1381, +1975, 1333, 1445, +1879, 1397, 1542, +1895, 1429, 1558, +1879, 1445, 1654, +1911, 1461, 1718, +1927, 1493, 1815, +1927, 1510, 1879, +1959, 1526, 1959, +1975, 1558, 2039, +2056, 1574, 2120, +2088, 1622, 2216, +2120, 1654, 2312, +2296, 1172, 931, +2296, 1188, 1012, +2280, 1188, 1124, +2184, 1253, 1285, +2072, 1301, 1381, +1991, 1365, 1445, +1911, 1413, 1526, +1895, 1445, 1574, +1911, 1461, 1654, +1911, 1493, 1750, +1943, 1510, 1831, +1943, 1526, 1911, +1959, 1574, 1991, +2007, 1574, 2039, +2056, 1606, 2104, +2072, 1622, 2216, +2120, 1670, 2280, +2312, 1253, 947, +2329, 1237, 996, +2329, 1253, 1124, +2232, 1285, 1237, +2136, 1365, 1381, +2023, 1413, 1493, +1927, 1461, 1574, +1943, 1510, 1638, +1927, 1526, 1702, +1943, 1526, 1750, +1975, 1574, 1863, +1975, 1574, 1895, +1991, 1590, 1991, +2023, 1606, 2072, +2072, 1622, 2152, +2104, 1670, 2232, +2136, 1702, 2361, +2361, 1317, 947, +2329, 1333, 1060, +2329, 1349, 1140, +2296, 1349, 1269, +2184, 1429, 1413, +2120, 1477, 1542, +2007, 1542, 1622, +1959, 1558, 1638, +1959, 1574, 1718, +1959, 1590, 1783, +1975, 1606, 1847, +1975, 1622, 1927, +2056, 1638, 2023, +2072, 1686, 2104, +2120, 1702, 2200, +2136, 1734, 2248, +2184, 1750, 2345, +2473, 1397, 915, +2425, 1445, 1060, +2361, 1445, 1172, +2345, 1445, 1285, +2296, 1477, 1397, +2200, 1542, 1510, +2088, 1590, 1622, +2023, 1654, 1702, +2023, 1654, 1750, +2039, 1654, 1815, +2056, 1686, 1911, +2088, 1702, 1991, +2120, 1750, 2056, +2152, 1766, 2136, +2152, 1783, 2200, +2200, 1815, 2296, +2168, 1847, 2377, +2537, 1558, 947, +2505, 1526, 996, +2489, 1558, 1140, +2409, 1606, 1349, +2377, 1606, 1445, +2296, 1622, 1574, +2232, 1686, 1670, +2152, 1734, 1766, +2104, 1766, 1799, +2136, 1766, 1879, +2136, 1799, 1943, +2136, 1815, 2007, +2168, 1815, 2088, +2184, 1847, 2168, +2216, 1863, 2232, +2312, 1911, 2377, +2280, 1943, 2425, +2553, 1718, 1012, +2521, 1702, 1060, +2569, 1702, 1140, +2521, 1718, 1237, +2441, 1734, 1429, +2441, 1766, 1590, +2377, 1799, 1670, +2264, 1847, 1815, +2184, 1895, 1847, +2216, 1911, 1943, +2216, 1927, 2007, +2232, 1943, 2088, +2248, 1943, 2152, +2296, 1959, 2264, +2312, 1975, 2280, +2329, 2007, 2361, +2361, 2072, 2473, +2585, 1911, 1156, +2585, 1911, 1188, +2618, 1911, 1237, +2585, 1895, 1317, +2585, 1879, 1381, +2569, 1927, 1590, +2537, 1927, 1718, +2441, 1975, 1847, +2345, 2007, 1943, +2345, 2039, 2007, +2329, 2056, 2072, +2345, 2056, 2136, +2377, 2104, 2232, +2425, 2120, 2296, +2409, 2136, 2393, +2425, 2168, 2473, +2489, 2200, 2553, +2618, 2088, 1285, +2618, 2104, 1317, +2602, 2104, 1381, +2634, 2072, 1413, +2618, 2104, 1510, +2666, 2088, 1606, +2666, 2104, 1702, +2602, 2120, 1863, +2537, 2152, 2023, +2441, 2200, 2088, +2457, 2216, 2136, +2473, 2216, 2232, +2473, 2232, 2296, +2489, 2248, 2361, +2473, 2248, 2441, +2505, 2296, 2537, +2553, 2296, 2602, +2650, 2280, 1445, +2666, 2280, 1477, +2634, 2264, 1526, +2634, 2264, 1558, +2634, 2280, 1622, +2650, 2280, 1686, +2650, 2296, 1783, +2746, 2264, 1863, +2682, 2280, 2023, +2602, 2312, 2184, +2585, 2361, 2216, +2602, 2361, 2264, +2585, 2377, 2393, +2618, 2393, 2489, +2602, 2425, 2537, +2618, 2425, 2602, +2634, 2473, 2698, +2714, 2473, 1622, +2714, 2473, 1654, +2698, 2473, 1670, +2730, 2473, 1718, +2730, 2489, 1783, +2698, 2473, 1831, +2698, 2457, 1911, +2714, 2489, 1991, +2762, 2473, 2056, +2794, 2473, 2136, +2746, 2505, 2329, +2666, 2537, 2393, +2698, 2553, 2457, +2698, 2553, 2537, +2714, 2585, 2618, +2746, 2618, 2714, +2762, 2602, 2762, +2842, 2666, 1783, +2842, 2666, 1783, +2826, 2650, 1799, +2858, 2666, 1879, +2858, 2666, 1943, +2826, 2666, 1959, +2842, 2682, 2072, +2826, 2698, 2168, +2794, 2682, 2216, +2826, 2682, 2296, +2842, 2682, 2361, +2826, 2714, 2489, +2826, 2730, 2569, +2810, 2730, 2634, +2858, 2746, 2682, +2875, 2746, 2746, +2875, 2762, 2826, +2971, 2810, 1879, +2971, 2826, 1895, +2955, 2810, 1911, +2971, 2826, 1927, +2971, 2810, 2007, +2971, 2826, 2088, +2971, 2842, 2152, +2955, 2842, 2248, +2955, 2875, 2329, +2971, 2858, 2393, +3003, 2875, 2489, +2971, 2875, 2553, +2971, 2891, 2666, +2971, 2907, 2730, +2955, 2907, 2794, +2987, 2939, 2891, +2987, 2939, 2955, +3083, 3035, 1991, +3067, 3003, 1975, +3067, 3035, 2023, +3067, 3035, 2072, +3083, 3019, 2120, +3067, 3019, 2184, +3083, 3019, 2280, +3099, 3035, 2329, +3083, 3035, 2377, +3099, 3051, 2489, +3067, 3051, 2569, +3067, 3067, 2650, +3115, 3083, 2746, +3131, 3083, 2810, +3131, 3099, 2891, +3164, 3115, 2971, +3164, 3131, 3035, +3180, 3196, 2072, +3180, 3196, 2104, +3180, 3196, 2136, +3180, 3212, 2168, +3196, 3196, 2232, +3180, 3228, 2280, +3164, 3196, 2329, +3180, 3212, 2409, +3180, 3212, 2505, +3196, 3244, 2585, +3180, 3212, 2666, +3228, 3228, 2746, +3212, 3244, 2858, +3228, 3244, 2923, +3276, 3260, 2971, +3260, 3276, 3083, +3276, 3324, 3180, +3340, 3421, 2232, +3324, 3404, 2264, +3340, 3421, 2296, +3324, 3421, 2329, +3372, 3437, 2377, +3340, 3421, 2393, +3340, 3421, 2473, +3356, 3421, 2569, +3356, 3437, 2650, +3372, 3437, 2698, +3372, 3453, 2778, +3372, 3453, 2875, +3388, 3453, 2971, +3421, 3469, 3099, +3437, 3453, 3131, +3453, 3469, 3180, +3453, 3469, 3244, +3485, 3597, 2393, +3517, 3629, 2409, +3501, 3613, 2409, +3485, 3613, 2473, +3469, 3613, 2489, +3469, 3613, 2537, +3501, 3645, 2602, +3501, 3629, 2682, +3485, 3645, 2746, +3485, 3629, 2842, +3517, 3629, 2907, +3517, 3613, 3003, +3485, 3629, 3099, +3533, 3645, 3196, +3533, 3629, 3244, +3549, 3661, 3308, +3597, 3661, 3356, +2505, 1253, 996, +2537, 1253, 1060, +2473, 1253, 1140, +2377, 1317, 1317, +2296, 1365, 1413, +2184, 1445, 1526, +2104, 1493, 1622, +2039, 1542, 1670, +2072, 1574, 1718, +2039, 1558, 1750, +2056, 1574, 1847, +2104, 1606, 1943, +2120, 1638, 2039, +2152, 1654, 2104, +2184, 1670, 2168, +2232, 1702, 2264, +2232, 1734, 2345, +2521, 1269, 980, +2505, 1301, 1076, +2505, 1285, 1156, +2393, 1333, 1301, +2312, 1381, 1429, +2200, 1461, 1542, +2120, 1510, 1638, +2056, 1574, 1654, +2072, 1574, 1718, +2104, 1590, 1799, +2104, 1606, 1863, +2136, 1622, 1959, +2152, 1654, 2056, +2168, 1686, 2104, +2200, 1702, 2200, +2232, 1734, 2248, +2264, 1750, 2329, +2521, 1333, 1012, +2521, 1349, 1108, +2505, 1349, 1188, +2457, 1381, 1317, +2377, 1429, 1429, +2264, 1477, 1526, +2136, 1542, 1606, +2088, 1606, 1686, +2056, 1606, 1734, +2120, 1638, 1831, +2136, 1638, 1895, +2136, 1638, 1959, +2168, 1670, 2072, +2200, 1702, 2104, +2232, 1718, 2184, +2248, 1766, 2312, +2264, 1783, 2361, +2537, 1397, 1028, +2537, 1413, 1092, +2521, 1413, 1172, +2521, 1429, 1317, +2425, 1493, 1445, +2296, 1542, 1574, +2232, 1590, 1670, +2152, 1638, 1734, +2136, 1670, 1783, +2168, 1686, 1879, +2184, 1718, 1943, +2184, 1718, 2007, +2232, 1750, 2088, +2216, 1750, 2152, +2232, 1783, 2232, +2280, 1815, 2329, +2345, 1815, 2377, +2634, 1477, 1012, +2585, 1510, 1092, +2553, 1542, 1220, +2569, 1526, 1349, +2489, 1558, 1461, +2393, 1622, 1606, +2312, 1654, 1686, +2232, 1702, 1766, +2200, 1750, 1815, +2200, 1766, 1895, +2216, 1766, 1959, +2216, 1783, 2023, +2248, 1815, 2088, +2280, 1831, 2168, +2296, 1863, 2248, +2361, 1879, 2345, +2409, 1911, 2441, +2698, 1590, 980, +2682, 1590, 1028, +2650, 1638, 1188, +2569, 1654, 1317, +2585, 1654, 1461, +2489, 1686, 1590, +2409, 1734, 1718, +2312, 1799, 1799, +2248, 1847, 1847, +2280, 1863, 1927, +2264, 1863, 1975, +2329, 1895, 2072, +2345, 1895, 2136, +2377, 1911, 2248, +2393, 1943, 2312, +2425, 1959, 2345, +2425, 1975, 2441, +2794, 1734, 1044, +2778, 1718, 1092, +2778, 1734, 1172, +2730, 1766, 1285, +2650, 1799, 1477, +2618, 1799, 1606, +2569, 1847, 1734, +2505, 1895, 1847, +2393, 1943, 1927, +2393, 1975, 1975, +2361, 1975, 2023, +2409, 1991, 2104, +2409, 2007, 2184, +2457, 2039, 2280, +2457, 2072, 2361, +2489, 2088, 2441, +2553, 2136, 2569, +2778, 1911, 1140, +2794, 1927, 1188, +2794, 1911, 1237, +2826, 1943, 1333, +2826, 1959, 1429, +2714, 1991, 1654, +2730, 1991, 1766, +2634, 2039, 1879, +2537, 2072, 1959, +2473, 2120, 2039, +2473, 2136, 2104, +2505, 2152, 2184, +2505, 2168, 2248, +2553, 2200, 2361, +2569, 2184, 2409, +2602, 2200, 2489, +2585, 2200, 2553, +2810, 2136, 1317, +2810, 2152, 1349, +2810, 2120, 1365, +2810, 2136, 1429, +2842, 2120, 1493, +2842, 2120, 1590, +2778, 2152, 1799, +2746, 2152, 1895, +2682, 2184, 2056, +2602, 2248, 2152, +2553, 2248, 2184, +2553, 2264, 2248, +2602, 2280, 2345, +2634, 2296, 2425, +2666, 2312, 2489, +2682, 2345, 2553, +2666, 2361, 2666, +2826, 2280, 1429, +2826, 2296, 1477, +2858, 2296, 1526, +2842, 2296, 1574, +2858, 2296, 1606, +2907, 2296, 1686, +2891, 2312, 1783, +2923, 2312, 1879, +2842, 2312, 2072, +2778, 2361, 2200, +2698, 2409, 2280, +2714, 2441, 2361, +2682, 2425, 2409, +2730, 2441, 2489, +2746, 2441, 2553, +2730, 2489, 2650, +2746, 2489, 2714, +2875, 2505, 1622, +2891, 2489, 1622, +2891, 2505, 1654, +2875, 2505, 1718, +2907, 2489, 1750, +2891, 2489, 1847, +2907, 2489, 1943, +2923, 2505, 1975, +2955, 2489, 2039, +2939, 2505, 2232, +2842, 2537, 2377, +2794, 2569, 2425, +2810, 2602, 2505, +2810, 2602, 2602, +2858, 2634, 2698, +2842, 2666, 2746, +2858, 2666, 2810, +2939, 2682, 1799, +2939, 2682, 1799, +2923, 2682, 1815, +2939, 2698, 1895, +2923, 2698, 1927, +2955, 2698, 1991, +2939, 2698, 2056, +2971, 2714, 2136, +2971, 2714, 2200, +3003, 2714, 2296, +3083, 2682, 2361, +2971, 2730, 2553, +2923, 2746, 2569, +2955, 2746, 2650, +2923, 2778, 2730, +2971, 2794, 2810, +3019, 2826, 2907, +3083, 2842, 1911, +3099, 2875, 1927, +3083, 2858, 1943, +3115, 2858, 1991, +3115, 2875, 2072, +3099, 2875, 2120, +3083, 2875, 2216, +3083, 2891, 2280, +3083, 2907, 2329, +3067, 2907, 2409, +3067, 2891, 2457, +3099, 2907, 2569, +3099, 2891, 2698, +3083, 2939, 2794, +3035, 2955, 2810, +3067, 2955, 2891, +3115, 2987, 2987, +3228, 3051, 2023, +3228, 3051, 2023, +3228, 3067, 2088, +3212, 3051, 2120, +3212, 3067, 2184, +3180, 3051, 2232, +3212, 3067, 2312, +3212, 3067, 2345, +3196, 3083, 2441, +3212, 3067, 2505, +3212, 3099, 2618, +3244, 3115, 2698, +3228, 3115, 2762, +3228, 3131, 2875, +3212, 3131, 2939, +3180, 3131, 2987, +3212, 3148, 3067, +3308, 3244, 2136, +3292, 3228, 2152, +3292, 3244, 2168, +3324, 3228, 2232, +3276, 3244, 2248, +3292, 3228, 2329, +3292, 3228, 2345, +3292, 3260, 2457, +3308, 3244, 2521, +3308, 3260, 2634, +3308, 3244, 2682, +3308, 3260, 2762, +3308, 3292, 2842, +3324, 3292, 2939, +3372, 3324, 3035, +3340, 3308, 3099, +3372, 3308, 3164, +3469, 3437, 2280, +3485, 3437, 2280, +3469, 3437, 2312, +3469, 3437, 2345, +3485, 3469, 2425, +3469, 3469, 2425, +3485, 3453, 2521, +3469, 3453, 2585, +3453, 3453, 2634, +3485, 3469, 2762, +3485, 3485, 2810, +3485, 3469, 2891, +3501, 3469, 2987, +3469, 3469, 3067, +3517, 3501, 3180, +3501, 3501, 3212, +3533, 3501, 3324, +3597, 3629, 2409, +3549, 3629, 2425, +3581, 3613, 2425, +3581, 3613, 2457, +3597, 3645, 2489, +3565, 3629, 2521, +3549, 3629, 2585, +3581, 3629, 2698, +3581, 3645, 2746, +3565, 3645, 2842, +3581, 3645, 2875, +3565, 3645, 2971, +3581, 3661, 3083, +3597, 3677, 3228, +3613, 3661, 3292, +3677, 3677, 3324, +3677, 3694, 3356, +2682, 1333, 1028, +2666, 1333, 1108, +2666, 1349, 1188, +2602, 1413, 1333, +2505, 1445, 1461, +2441, 1510, 1574, +2329, 1590, 1702, +2264, 1638, 1766, +2216, 1638, 1783, +2232, 1654, 1831, +2264, 1686, 1943, +2280, 1718, 2023, +2280, 1718, 2056, +2312, 1750, 2184, +2329, 1766, 2232, +2377, 1799, 2329, +2409, 1815, 2409, +2682, 1365, 1044, +2698, 1365, 1092, +2714, 1381, 1220, +2634, 1429, 1349, +2521, 1493, 1493, +2441, 1526, 1590, +2361, 1574, 1686, +2264, 1638, 1766, +2264, 1686, 1799, +2264, 1686, 1863, +2264, 1702, 1927, +2280, 1734, 2007, +2312, 1750, 2120, +2312, 1766, 2168, +2361, 1783, 2248, +2409, 1815, 2312, +2457, 1847, 2441, +2698, 1429, 1076, +2698, 1397, 1108, +2714, 1413, 1220, +2682, 1461, 1365, +2569, 1526, 1493, +2473, 1558, 1590, +2377, 1622, 1686, +2312, 1670, 1783, +2280, 1718, 1831, +2248, 1718, 1879, +2296, 1734, 1943, +2296, 1750, 2023, +2329, 1783, 2088, +2361, 1799, 2168, +2361, 1831, 2248, +2425, 1831, 2329, +2457, 1879, 2441, +2730, 1493, 1092, +2746, 1493, 1156, +2746, 1493, 1237, +2698, 1510, 1333, +2634, 1574, 1493, +2553, 1622, 1590, +2457, 1686, 1718, +2345, 1702, 1783, +2296, 1766, 1831, +2329, 1766, 1863, +2329, 1799, 1975, +2329, 1799, 2007, +2361, 1831, 2136, +2393, 1831, 2200, +2425, 1879, 2264, +2457, 1895, 2377, +2489, 1927, 2409, +2842, 1558, 1044, +2730, 1574, 1156, +2746, 1606, 1269, +2730, 1606, 1365, +2698, 1622, 1477, +2569, 1670, 1606, +2521, 1734, 1718, +2425, 1766, 1799, +2361, 1815, 1863, +2345, 1847, 1927, +2393, 1879, 2023, +2425, 1895, 2104, +2441, 1879, 2168, +2457, 1927, 2216, +2441, 1927, 2280, +2505, 1959, 2377, +2521, 1991, 2473, +2907, 1638, 1012, +2891, 1670, 1140, +2826, 1718, 1269, +2778, 1702, 1349, +2794, 1718, 1510, +2730, 1766, 1638, +2634, 1799, 1766, +2553, 1879, 1847, +2489, 1895, 1927, +2473, 1959, 1991, +2441, 1959, 2039, +2473, 1959, 2104, +2473, 1975, 2200, +2521, 2023, 2280, +2553, 2039, 2361, +2553, 2072, 2457, +2602, 2104, 2537, +2987, 1766, 1044, +2955, 1783, 1108, +2939, 1799, 1204, +2875, 1831, 1365, +2842, 1863, 1493, +2826, 1863, 1638, +2746, 1911, 1783, +2634, 1943, 1879, +2585, 2007, 1975, +2521, 2056, 2007, +2553, 2072, 2088, +2553, 2088, 2152, +2602, 2120, 2248, +2602, 2136, 2329, +2618, 2168, 2409, +2602, 2152, 2489, +2682, 2168, 2553, +3019, 1991, 1204, +3003, 1975, 1237, +3003, 1991, 1269, +3019, 1991, 1365, +2955, 2007, 1526, +2891, 2039, 1670, +2923, 2056, 1815, +2810, 2088, 1943, +2730, 2136, 2039, +2634, 2168, 2120, +2618, 2200, 2168, +2602, 2200, 2232, +2666, 2216, 2312, +2682, 2232, 2393, +2682, 2232, 2441, +2698, 2264, 2537, +2730, 2280, 2618, +3003, 2136, 1285, +2987, 2136, 1301, +3035, 2136, 1349, +3067, 2136, 1429, +3051, 2104, 1493, +3035, 2152, 1638, +2939, 2168, 1831, +2955, 2168, 1959, +2875, 2216, 2088, +2746, 2264, 2200, +2714, 2312, 2200, +2714, 2329, 2280, +2746, 2345, 2361, +2746, 2361, 2473, +2794, 2377, 2521, +2762, 2377, 2602, +2794, 2409, 2698, +3051, 2345, 1461, +3035, 2345, 1477, +3067, 2345, 1526, +3067, 2345, 1558, +3051, 2345, 1606, +3051, 2329, 1686, +3067, 2312, 1783, +3019, 2345, 1991, +3003, 2345, 2072, +2939, 2393, 2216, +2858, 2457, 2345, +2810, 2457, 2361, +2826, 2489, 2457, +2842, 2505, 2537, +2858, 2521, 2618, +2891, 2521, 2682, +2907, 2569, 2778, +3083, 2553, 1622, +3067, 2537, 1638, +3051, 2521, 1622, +3067, 2521, 1686, +3083, 2537, 1766, +3099, 2537, 1831, +3115, 2537, 1927, +3180, 2537, 1991, +3148, 2521, 2056, +3083, 2553, 2264, +3035, 2602, 2441, +2955, 2634, 2473, +2955, 2650, 2505, +2939, 2666, 2602, +2955, 2666, 2714, +2971, 2682, 2730, +2987, 2698, 2875, +3148, 2714, 1783, +3131, 2714, 1799, +3131, 2714, 1831, +3115, 2714, 1863, +3099, 2714, 1911, +3131, 2714, 1959, +3131, 2714, 2023, +3148, 2714, 2088, +3212, 2714, 2200, +3212, 2698, 2248, +3164, 2730, 2457, +3115, 2762, 2569, +3067, 2794, 2618, +3067, 2810, 2698, +3099, 2826, 2778, +3099, 2826, 2842, +3099, 2858, 2923, +3212, 2891, 1911, +3180, 2907, 1943, +3212, 2907, 1975, +3164, 2907, 1991, +3196, 2907, 2072, +3196, 2923, 2136, +3180, 2907, 2200, +3180, 2907, 2248, +3228, 2907, 2296, +3212, 2907, 2361, +3276, 2923, 2473, +3276, 2907, 2537, +3228, 2939, 2698, +3180, 2987, 2778, +3196, 2987, 2891, +3164, 3019, 2955, +3212, 3035, 3051, +3356, 3099, 2056, +3324, 3083, 2072, +3340, 3099, 2104, +3356, 3115, 2152, +3340, 3115, 2216, +3340, 3099, 2280, +3340, 3099, 2296, +3340, 3131, 2425, +3324, 3115, 2473, +3292, 3115, 2553, +3292, 3131, 2634, +3292, 3115, 2682, +3324, 3115, 2762, +3292, 3115, 2875, +3292, 3148, 2955, +3292, 3196, 3035, +3308, 3180, 3083, +3421, 3276, 2152, +3421, 3276, 2184, +3453, 3260, 2216, +3437, 3276, 2248, +3404, 3276, 2312, +3437, 3292, 2361, +3421, 3292, 2425, +3404, 3292, 2489, +3453, 3308, 2585, +3437, 3324, 2682, +3453, 3308, 2778, +3453, 3324, 2810, +3453, 3308, 2891, +3453, 3324, 2971, +3485, 3340, 3083, +3485, 3372, 3164, +3453, 3356, 3228, +3597, 3469, 2329, +3581, 3469, 2329, +3597, 3485, 2377, +3581, 3469, 2393, +3581, 3485, 2425, +3581, 3485, 2473, +3549, 3469, 2521, +3565, 3469, 2618, +3565, 3453, 2682, +3581, 3469, 2746, +3597, 3469, 2826, +3597, 3501, 2907, +3613, 3501, 3019, +3581, 3517, 3067, +3597, 3517, 3180, +3613, 3517, 3244, +3629, 3549, 3340, +3677, 3661, 2425, +3677, 3661, 2457, +3677, 3661, 2441, +3694, 3645, 2473, +3694, 3645, 2505, +3677, 3645, 2537, +3694, 3677, 2634, +3710, 3677, 2730, +3677, 3661, 2778, +3710, 3677, 2907, +3694, 3677, 2923, +3710, 3677, 3019, +3710, 3694, 3115, +3726, 3694, 3212, +3694, 3694, 3308, +3758, 3726, 3404, +3806, 3758, 3517, +2923, 1445, 1108, +2907, 1429, 1156, +2907, 1445, 1285, +2842, 1477, 1381, +2730, 1526, 1510, +2634, 1590, 1606, +2553, 1638, 1718, +2441, 1686, 1799, +2409, 1766, 1847, +2409, 1783, 1911, +2441, 1783, 1975, +2473, 1799, 2056, +2473, 1815, 2120, +2489, 1847, 2216, +2521, 1863, 2280, +2553, 1895, 2361, +2553, 1927, 2441, +2923, 1429, 1076, +2923, 1445, 1156, +2907, 1445, 1237, +2842, 1461, 1349, +2778, 1526, 1493, +2650, 1606, 1622, +2585, 1654, 1718, +2489, 1718, 1783, +2409, 1766, 1831, +2425, 1783, 1911, +2425, 1815, 1991, +2457, 1815, 2072, +2489, 1831, 2152, +2489, 1847, 2216, +2537, 1879, 2329, +2553, 1895, 2361, +2569, 1943, 2441, +2939, 1477, 1108, +2923, 1477, 1188, +2907, 1477, 1269, +2875, 1493, 1365, +2794, 1574, 1526, +2714, 1622, 1638, +2602, 1702, 1734, +2521, 1750, 1815, +2441, 1799, 1863, +2409, 1815, 1927, +2489, 1831, 2023, +2489, 1847, 2104, +2489, 1879, 2168, +2537, 1879, 2216, +2537, 1911, 2296, +2569, 1943, 2393, +2602, 1959, 2473, +2955, 1558, 1156, +2939, 1558, 1204, +2923, 1558, 1285, +2923, 1574, 1397, +2858, 1638, 1526, +2778, 1670, 1622, +2666, 1734, 1766, +2602, 1783, 1831, +2537, 1847, 1927, +2505, 1863, 1959, +2521, 1879, 2007, +2537, 1911, 2088, +2505, 1911, 2136, +2553, 1927, 2264, +2553, 1943, 2296, +2634, 2007, 2425, +2650, 2039, 2521, +2987, 1654, 1172, +2987, 1654, 1204, +2971, 1654, 1253, +2971, 1670, 1381, +2907, 1702, 1526, +2826, 1750, 1686, +2762, 1799, 1750, +2682, 1863, 1879, +2553, 1895, 1943, +2537, 1911, 1975, +2553, 1943, 2072, +2569, 1975, 2136, +2569, 2007, 2232, +2618, 2023, 2312, +2618, 2039, 2393, +2666, 2056, 2473, +2666, 2088, 2553, +3099, 1702, 1092, +3035, 1766, 1220, +3003, 1783, 1333, +2987, 1783, 1413, +2971, 1783, 1526, +2907, 1815, 1670, +2826, 1863, 1783, +2762, 1959, 1927, +2682, 2007, 1991, +2618, 2039, 2023, +2634, 2056, 2104, +2650, 2072, 2184, +2650, 2088, 2248, +2666, 2088, 2312, +2682, 2120, 2393, +2714, 2136, 2505, +2746, 2152, 2569, +3228, 1847, 1124, +3164, 1847, 1156, +3180, 1879, 1269, +3083, 1927, 1445, +3067, 1927, 1590, +3051, 1927, 1702, +2939, 1975, 1831, +2875, 2039, 1959, +2778, 2088, 2056, +2714, 2136, 2120, +2682, 2152, 2152, +2666, 2152, 2200, +2746, 2184, 2345, +2730, 2168, 2361, +2762, 2200, 2473, +2778, 2232, 2569, +2794, 2248, 2618, +3260, 2007, 1172, +3244, 2007, 1204, +3228, 2007, 1285, +3196, 2007, 1365, +3115, 2056, 1590, +3083, 2039, 1686, +3099, 2072, 1815, +2987, 2104, 1959, +2923, 2168, 2088, +2826, 2200, 2168, +2778, 2264, 2232, +2810, 2264, 2264, +2778, 2264, 2361, +2794, 2296, 2441, +2810, 2312, 2553, +2842, 2345, 2602, +2858, 2345, 2698, +3244, 2168, 1285, +3228, 2168, 1317, +3260, 2168, 1349, +3228, 2152, 1429, +3244, 2168, 1542, +3212, 2200, 1702, +3131, 2232, 1879, +3099, 2232, 2007, +3051, 2280, 2152, +2955, 2345, 2248, +2858, 2377, 2296, +2842, 2377, 2312, +2858, 2393, 2409, +2891, 2409, 2521, +2891, 2425, 2553, +2923, 2457, 2682, +2939, 2473, 2730, +3228, 2377, 1461, +3244, 2393, 1510, +3228, 2377, 1493, +3276, 2361, 1526, +3276, 2361, 1606, +3292, 2361, 1686, +3276, 2361, 1815, +3196, 2409, 2023, +3196, 2425, 2168, +3099, 2473, 2312, +2987, 2489, 2377, +2939, 2537, 2425, +2955, 2553, 2505, +2971, 2553, 2585, +2971, 2585, 2666, +3003, 2585, 2730, +3019, 2618, 2826, +3260, 2569, 1590, +3260, 2569, 1622, +3260, 2569, 1654, +3244, 2569, 1718, +3260, 2569, 1766, +3308, 2537, 1799, +3292, 2537, 1895, +3324, 2553, 1975, +3260, 2569, 2152, +3244, 2585, 2345, +3164, 2634, 2441, +3131, 2666, 2537, +3067, 2698, 2585, +3099, 2698, 2650, +3099, 2714, 2730, +3115, 2714, 2794, +3115, 2730, 2875, +3292, 2746, 1766, +3324, 2746, 1783, +3324, 2746, 1815, +3308, 2746, 1879, +3308, 2746, 1911, +3324, 2730, 1927, +3324, 2746, 2039, +3356, 2746, 2104, +3404, 2746, 2184, +3388, 2762, 2312, +3356, 2762, 2457, +3292, 2810, 2618, +3196, 2842, 2682, +3196, 2842, 2714, +3180, 2858, 2794, +3228, 2891, 2907, +3228, 2907, 2955, +3372, 2939, 1927, +3388, 2939, 1927, +3372, 2939, 1959, +3372, 2939, 2023, +3388, 2955, 2072, +3372, 2955, 2120, +3356, 2923, 2200, +3388, 2939, 2248, +3404, 2955, 2312, +3404, 2939, 2377, +3469, 2939, 2457, +3404, 2971, 2682, +3372, 3003, 2778, +3324, 3035, 2826, +3324, 3051, 2907, +3372, 3083, 3003, +3340, 3067, 3051, +3404, 3115, 2072, +3404, 3115, 2072, +3404, 3115, 2104, +3404, 3115, 2136, +3404, 3131, 2216, +3421, 3131, 2280, +3404, 3115, 2296, +3388, 3115, 2361, +3404, 3115, 2425, +3404, 3131, 2537, +3437, 3131, 2618, +3453, 3131, 2682, +3517, 3131, 2714, +3421, 3180, 2955, +3404, 3212, 3003, +3437, 3212, 3067, +3437, 3228, 3148, +3565, 3308, 2216, +3597, 3324, 2232, +3581, 3308, 2248, +3565, 3308, 2280, +3565, 3324, 2345, +3565, 3324, 2393, +3581, 3324, 2457, +3581, 3324, 2521, +3549, 3324, 2618, +3533, 3324, 2666, +3565, 3340, 2762, +3581, 3356, 2842, +3581, 3356, 2891, +3613, 3356, 3003, +3597, 3372, 3148, +3597, 3404, 3228, +3581, 3421, 3276, +3694, 3485, 2329, +3694, 3485, 2361, +3694, 3485, 2361, +3694, 3501, 2409, +3710, 3501, 2489, +3710, 3501, 2489, +3710, 3501, 2553, +3694, 3501, 2650, +3677, 3517, 2714, +3694, 3517, 2778, +3677, 3517, 2875, +3710, 3517, 2955, +3694, 3533, 3019, +3710, 3533, 3131, +3710, 3549, 3196, +3694, 3549, 3260, +3710, 3581, 3356, +3838, 3694, 2473, +3806, 3677, 2457, +3822, 3677, 2505, +3822, 3694, 2553, +3806, 3694, 2569, +3790, 3677, 2602, +3790, 3694, 2666, +3806, 3677, 2730, +3790, 3694, 2842, +3790, 3710, 2907, +3838, 3742, 3003, +3854, 3774, 3131, +3854, 3758, 3196, +3854, 3790, 3340, +3822, 3774, 3388, +3838, 3790, 3533, +3854, 3806, 3645, +3115, 1526, 1172, +3099, 1526, 1253, +3099, 1542, 1285, +3067, 1542, 1413, +2971, 1590, 1542, +2891, 1670, 1670, +2794, 1750, 1783, +2730, 1799, 1847, +2650, 1831, 1943, +2618, 1879, 1991, +2602, 1879, 2039, +2618, 1879, 2104, +2634, 1911, 2184, +2650, 1959, 2280, +2666, 1991, 2361, +2698, 1991, 2441, +2746, 2056, 2553, +3099, 1558, 1172, +3115, 1542, 1204, +3099, 1542, 1285, +3083, 1574, 1445, +2971, 1622, 1558, +2891, 1670, 1670, +2826, 1766, 1783, +2746, 1815, 1863, +2634, 1863, 1959, +2618, 1879, 1959, +2585, 1879, 2023, +2602, 1911, 2120, +2634, 1911, 2184, +2666, 1959, 2280, +2698, 2007, 2393, +2730, 2023, 2473, +2730, 2039, 2553, +3131, 1590, 1172, +3148, 1590, 1220, +3115, 1574, 1301, +3067, 1590, 1413, +3019, 1654, 1574, +2955, 1718, 1686, +2842, 1783, 1799, +2746, 1815, 1879, +2650, 1879, 1943, +2618, 1911, 1975, +2650, 1927, 2056, +2666, 1959, 2136, +2682, 1991, 2248, +2666, 1991, 2312, +2714, 2023, 2409, +2730, 2056, 2489, +2762, 2072, 2569, +3131, 1638, 1172, +3115, 1638, 1253, +3131, 1654, 1317, +3115, 1622, 1413, +3035, 1670, 1542, +2987, 1734, 1654, +2875, 1815, 1799, +2810, 1863, 1895, +2730, 1943, 1975, +2682, 1975, 2007, +2682, 1991, 2072, +2698, 2007, 2152, +2682, 2023, 2216, +2730, 2056, 2345, +2762, 2088, 2409, +2794, 2088, 2473, +2810, 2088, 2537, +3148, 1718, 1237, +3180, 1750, 1301, +3164, 1750, 1349, +3180, 1750, 1477, +3180, 1750, 1574, +3051, 1831, 1702, +2987, 1895, 1863, +2875, 1943, 1927, +2778, 1991, 1991, +2714, 2072, 2072, +2730, 2072, 2152, +2730, 2072, 2200, +2762, 2104, 2296, +2794, 2104, 2361, +2794, 2120, 2441, +2810, 2120, 2505, +2826, 2152, 2585, +3324, 1799, 1204, +3276, 1831, 1285, +3228, 1831, 1365, +3228, 1847, 1477, +3212, 1847, 1590, +3148, 1879, 1734, +3083, 1943, 1831, +2955, 2023, 1975, +2907, 2056, 2072, +2794, 2120, 2136, +2762, 2120, 2152, +2810, 2136, 2248, +2794, 2152, 2312, +2826, 2152, 2377, +2842, 2200, 2473, +2842, 2200, 2537, +2891, 2232, 2634, +3404, 1895, 1188, +3372, 1895, 1204, +3324, 1943, 1349, +3228, 1991, 1526, +3228, 1991, 1654, +3212, 1991, 1734, +3148, 2023, 1847, +3067, 2072, 1991, +2987, 2136, 2088, +2891, 2200, 2184, +2842, 2216, 2216, +2858, 2232, 2296, +2858, 2248, 2361, +2858, 2248, 2425, +2907, 2280, 2553, +2907, 2296, 2618, +2907, 2329, 2666, +3437, 2056, 1204, +3421, 2039, 1253, +3388, 2056, 1317, +3372, 2056, 1397, +3276, 2120, 1638, +3260, 2120, 1766, +3244, 2136, 1911, +3164, 2184, 2039, +3067, 2232, 2152, +3019, 2296, 2232, +2907, 2312, 2280, +2923, 2345, 2329, +2923, 2361, 2393, +2939, 2361, 2489, +2955, 2377, 2553, +2955, 2409, 2618, +3003, 2441, 2746, +3404, 2200, 1301, +3469, 2216, 1365, +3453, 2216, 1397, +3437, 2200, 1461, +3421, 2232, 1574, +3340, 2248, 1734, +3292, 2280, 1927, +3308, 2296, 2056, +3228, 2312, 2136, +3099, 2377, 2280, +3019, 2425, 2345, +2987, 2473, 2409, +3003, 2457, 2489, +3035, 2505, 2569, +3035, 2521, 2634, +3051, 2537, 2746, +3051, 2537, 2778, +3437, 2393, 1445, +3469, 2409, 1461, +3469, 2409, 1493, +3485, 2409, 1574, +3469, 2393, 1622, +3469, 2409, 1750, +3437, 2409, 1895, +3388, 2457, 2088, +3340, 2457, 2200, +3292, 2521, 2345, +3164, 2553, 2457, +3083, 2585, 2473, +3099, 2602, 2521, +3099, 2618, 2602, +3115, 2634, 2714, +3164, 2650, 2762, +3164, 2650, 2891, +3469, 2585, 1590, +3469, 2585, 1606, +3453, 2585, 1654, +3485, 2569, 1686, +3469, 2569, 1750, +3533, 2569, 1847, +3549, 2553, 1927, +3501, 2569, 2007, +3421, 2602, 2216, +3437, 2602, 2345, +3340, 2666, 2489, +3260, 2714, 2585, +3212, 2746, 2634, +3212, 2762, 2698, +3228, 2762, 2762, +3244, 2794, 2858, +3260, 2778, 2907, +3485, 2778, 1750, +3485, 2778, 1799, +3469, 2762, 1815, +3469, 2778, 1847, +3485, 2762, 1895, +3533, 2778, 1959, +3517, 2746, 1991, +3565, 2762, 2088, +3565, 2746, 2168, +3549, 2778, 2345, +3517, 2794, 2505, +3421, 2810, 2634, +3356, 2875, 2714, +3308, 2907, 2762, +3324, 2923, 2875, +3324, 2939, 2939, +3356, 2939, 3019, +3533, 2971, 1895, +3533, 3003, 1943, +3549, 2987, 1927, +3533, 2971, 1991, +3581, 2987, 2039, +3581, 2955, 2088, +3549, 2987, 2184, +3565, 2987, 2264, +3613, 2971, 2329, +3645, 2971, 2361, +3645, 2987, 2505, +3581, 3019, 2730, +3533, 3035, 2810, +3404, 3067, 2875, +3404, 3051, 2923, +3404, 3067, 2971, +3437, 3083, 3083, +3581, 3164, 2056, +3565, 3148, 2072, +3565, 3164, 2120, +3581, 3131, 2136, +3549, 3148, 2216, +3581, 3148, 2248, +3581, 3164, 2329, +3597, 3164, 2377, +3597, 3180, 2457, +3613, 3164, 2521, +3645, 3164, 2602, +3661, 3164, 2698, +3645, 3180, 2858, +3597, 3228, 3003, +3549, 3260, 3051, +3549, 3260, 3115, +3565, 3276, 3196, +3710, 3356, 2248, +3694, 3340, 2280, +3694, 3340, 2280, +3694, 3372, 2361, +3710, 3372, 2393, +3694, 3372, 2425, +3677, 3372, 2489, +3694, 3356, 2537, +3694, 3372, 2618, +3694, 3388, 2682, +3694, 3372, 2794, +3742, 3388, 2826, +3758, 3388, 2907, +3790, 3372, 3003, +3710, 3404, 3196, +3677, 3437, 3244, +3710, 3437, 3308, +3854, 3533, 2409, +3854, 3533, 2409, +3806, 3517, 2393, +3854, 3533, 2473, +3806, 3549, 2505, +3822, 3533, 2537, +3822, 3549, 2602, +3806, 3533, 2666, +3822, 3533, 2730, +3790, 3533, 2810, +3806, 3549, 2858, +3790, 3549, 2955, +3790, 3581, 3051, +3806, 3581, 3148, +3822, 3581, 3212, +3822, 3597, 3324, +3806, 3597, 3388, +3983, 3758, 2553, +3983, 3774, 2602, +3950, 3758, 2618, +3967, 3774, 2634, +3967, 3774, 2698, +3950, 3774, 2762, +3934, 3758, 2746, +3950, 3758, 2891, +3934, 3758, 2955, +3918, 3774, 3019, +3950, 3774, 3131, +3934, 3790, 3196, +3950, 3806, 3340, +3934, 3790, 3404, +3950, 3854, 3613, +3918, 3854, 3661, +3902, 3870, 3806] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.3dl b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.3dl new file mode 100644 index 0000000000..956644638c --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.3dl @@ -0,0 +1,32769 @@ +0 33 66 99 132 165 198 231 264 297 330 363 396 429 462 495 528 561 594 627 660 693 726 759 792 825 858 891 924 957 990 1023 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 28 +0 0 152 +0 0 280 +0 0 408 +0 0 537 +0 0 667 +0 0 797 +0 0 928 +0 0 1084 +0 0 1291 +0 0 1472 +0 0 1634 +361 0 1771 +1145 0 1881 +1561 0 2006 +1561 0 2154 +432 987 2341 +1228 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 54 +0 0 173 +0 0 295 +0 0 419 +0 0 545 +0 0 673 +0 0 802 +0 0 932 +0 0 1087 +0 0 1293 +0 0 1473 +0 0 1635 +370 0 1772 +1144 0 1882 +1559 0 2006 +1558 0 2154 +428 992 2341 +1232 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 87 +0 0 198 +0 0 315 +0 0 434 +0 0 557 +0 0 682 +0 0 809 +0 0 937 +0 0 1091 +0 0 1295 +0 0 1474 +0 0 1635 +381 0 1773 +1143 0 1883 +1556 0 2007 +1554 0 2155 +423 998 2341 +1238 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 31 +0 0 127 +0 0 230 +0 0 340 +0 0 454 +0 0 572 +0 0 693 +0 0 817 +0 0 943 +0 0 1095 +0 0 1298 +0 0 1476 +0 0 1636 +395 0 1774 +1142 0 1883 +1552 0 2008 +1548 0 2156 +416 1005 2342 +1246 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 31 +0 0 176 +0 0 270 +0 0 371 +0 0 478 +0 0 591 +0 0 708 +0 0 828 +0 0 952 +0 0 1101 +0 0 1302 +0 0 1479 +0 0 1637 +414 0 1775 +1140 0 1884 +1547 0 2010 +1540 58 2158 +407 1015 2342 +1257 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 31 +0 7 176 +0 63 318 +0 63 410 +0 63 509 +0 63 615 +0 63 727 +0 63 843 +0 63 963 +0 103 1109 +0 30 1307 +0 30 1482 +0 3 1639 +438 0 1777 +1137 0 1886 +1539 0 2011 +1530 197 2160 +394 1028 2343 +1270 621 2470 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +0 4 0 +0 23 0 +0 47 0 +0 77 31 +0 114 176 +0 159 318 +0 214 457 +0 214 548 +0 214 646 +0 214 751 +0 214 862 +0 214 977 +0 243 1120 +0 163 1314 +0 163 1487 +0 142 1641 +468 0 1779 +1134 0 1888 +1530 32 2014 +1515 333 2163 +376 1045 2344 +1287 621 2470 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +0 144 0 +0 157 0 +0 175 0 +0 198 31 +0 227 176 +0 262 318 +0 306 457 +0 359 595 +0 359 684 +0 359 782 +0 359 886 +0 359 996 +0 380 1134 +0 295 1323 +0 295 1494 +0 280 1644 +506 122 1783 +1129 0 1891 +1516 164 2017 +1495 469 2167 +352 1066 2345 +1309 621 2470 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +0 281 0 +0 291 0 +0 304 0 +0 322 31 +0 344 176 +0 371 318 +0 406 457 +0 449 595 +0 501 730 +0 501 819 +0 501 916 +0 501 1020 +0 516 1151 +0 426 1335 +0 426 1502 +0 415 1648 +552 265 1787 +1123 111 1894 +1498 296 2021 +1467 603 2172 +317 1093 2347 +1348 639 2470 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +0 417 0 +0 424 0 +0 434 0 +0 447 31 +0 464 176 +0 486 318 +0 513 457 +0 547 595 +0 589 730 +0 640 865 +0 640 954 +0 640 1050 +0 651 1174 +0 570 1350 +0 559 1512 +0 550 1653 +556 441 1791 +1115 244 1898 +1471 428 2027 +1426 737 2178 +265 1128 2349 +1396 662 2470 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +0 552 0 +0 557 0 +0 565 0 +0 575 31 +0 587 176 +0 604 318 +0 625 457 +0 652 595 +0 686 730 +0 727 865 +0 777 1000 +0 777 1088 +0 786 1203 +0 726 1370 +0 691 1526 +0 685 1662 +556 606 1796 +1132 422 1904 +1434 560 2035 +1365 871 2187 +186 1169 2352 +1454 691 2470 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +0 686 0 +0 690 0 +0 696 0 +0 703 31 +0 713 176 +0 726 318 +0 742 457 +0 763 595 +0 789 730 +0 823 865 +0 864 1000 +0 913 1133 +0 920 1239 +0 876 1395 +0 823 1544 +0 818 1675 +556 761 1803 +1160 593 1912 +1378 692 2045 +1267 1004 2199 +0 1212 2357 +1520 728 2470 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +0 857 100 +0 857 131 +0 861 202 +0 866 282 +0 873 371 +0 882 468 +0 894 573 +0 909 683 +0 928 797 +0 953 916 +0 984 1038 +0 1023 1162 +0 1061 1287 +0 1030 1430 +0 984 1569 +0 971 1697 +566 941 1817 +1178 799 1926 +1302 849 2057 +1119 1137 2212 +0 1255 2365 +1585 801 2470 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +1738 957 2513 +0 1184 1027 +0 1184 1031 +0 1184 1036 +0 1184 1043 +0 1184 1052 +0 1184 1064 +0 1184 1080 +0 1184 1099 +0 1184 1125 +0 1190 1168 +0 1209 1242 +0 1232 1325 +0 1257 1416 +0 1237 1493 +0 1209 1617 +0 1222 1740 +636 1187 1854 +1040 1131 1961 +1243 1131 2080 +1031 1271 2224 +472 1312 2372 +1588 1032 2472 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +1765 1144 2512 +0 1421 1377 +0 1421 1379 +0 1421 1382 +0 1421 1385 +0 1421 1389 +0 1421 1395 +0 1421 1402 +0 1421 1412 +0 1421 1425 +0 1421 1442 +0 1421 1463 +0 1421 1491 +0 1432 1546 +0 1418 1604 +0 1399 1673 +0 1412 1786 +636 1404 1895 +1048 1353 1999 +1151 1350 2110 +878 1405 2240 +666 1388 2378 +1601 1209 2473 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +1799 1314 2510 +901 1580 1648 +901 1579 1649 +901 1579 1650 +901 1579 1652 +901 1578 1655 +901 1577 1658 +901 1576 1662 +901 1574 1668 +901 1572 1675 +901 1569 1685 +901 1567 1698 +901 1567 1714 +886 1567 1736 +886 1577 1788 +886 1569 1838 +890 1552 1888 +807 1557 1969 +921 1536 2067 +942 1537 2170 +810 1524 2268 +1125 1501 2382 +1680 1435 2473 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1845 1472 2509 +1449 1705 1856 +1448 1705 1856 +1447 1705 1857 +1446 1705 1859 +1444 1705 1860 +1441 1705 1862 +1438 1705 1865 +1433 1705 1868 +1427 1705 1873 +1426 1703 1880 +1426 1700 1888 +1426 1696 1899 +1423 1691 1913 +1400 1685 1931 +1400 1696 1976 +1370 1702 2022 +1371 1685 2062 +1192 1672 2128 +1127 1678 2221 +1173 1647 2295 +1519 1631 2386 +1775 1634 2475 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1785 1818 1978 +1786 1818 1978 +1786 1818 1979 +1786 1818 1980 +1786 1818 1981 +1787 1818 1982 +1788 1818 1983 +1789 1818 1986 +1790 1818 1988 +1792 1818 1992 +1788 1818 1998 +1781 1818 2007 +1772 1818 2018 +1752 1824 2037 +1733 1818 2052 +1727 1802 2080 +1685 1816 2123 +1705 1809 2166 +1657 1793 2234 +1664 1793 2304 +1754 1797 2389 +1874 1790 2475 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1958 1958 2028 +1957 1958 2029 +1957 1958 2029 +1957 1958 2030 +1956 1958 2031 +1956 1958 2031 +1956 1958 2033 +1955 1958 2035 +1954 1958 2037 +1953 1958 2041 +1951 1958 2045 +1948 1958 2051 +1946 1958 2058 +1941 1962 2068 +1935 1968 2081 +1927 1969 2115 +1913 1965 2153 +1905 1963 2189 +1920 1969 2243 +1881 1969 2320 +1929 1954 2391 +2032 1964 2481 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2093 1969 2517 +2119 2119 2068 +2119 2119 2068 +2119 2119 2068 +2119 2120 2069 +2119 2120 2069 +2119 2120 2071 +2119 2120 2072 +2119 2121 2073 +2119 2122 2076 +2119 2122 2079 +2119 2124 2083 +2119 2125 2088 +2119 2127 2095 +2119 2127 2101 +2119 2127 2110 +2115 2131 2133 +2108 2133 2164 +2103 2131 2206 +2110 2135 2256 +2119 2135 2316 +2148 2131 2395 +2212 2147 2485 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2369 2356 2125 +2369 2356 2126 +2369 2356 2126 +2369 2356 2127 +2369 2357 2129 +2368 2357 2131 +2367 2358 2133 +2368 2359 2137 +2369 2360 2143 +2370 2358 2146 +2369 2356 2148 +2368 2358 2163 +2370 2358 2193 +2369 2358 2226 +2372 2355 2273 +2383 2356 2337 +2410 2367 2405 +2467 2385 2498 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1963 +2681 2655 1963 +2681 2654 1964 +2681 2654 1965 +2681 2654 1966 +2681 2654 1968 +2681 2654 1967 +2681 2654 1965 +2680 2653 1964 +2680 2653 1961 +2679 2652 1961 +2678 2653 1968 +2677 2654 1989 +2676 2653 2013 +2675 2649 2032 +2677 2655 2124 +2681 2656 2208 +2687 2661 2306 +2695 2667 2410 +2715 2678 2527 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2773 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 28 +0 0 152 +0 0 280 +0 0 408 +0 0 537 +0 0 667 +0 0 797 +0 0 928 +0 0 1088 +0 0 1293 +0 0 1473 +0 0 1634 +398 0 1772 +1148 0 1882 +1561 0 2006 +1560 0 2154 +428 987 2341 +1231 619 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 36 +0 0 159 +0 0 285 +0 0 412 +0 0 540 +0 0 669 +0 0 799 +0 0 930 +0 0 1089 +0 0 1294 +0 0 1474 +0 0 1635 +378 0 1771 +1147 0 1882 +1561 0 2006 +1559 0 2154 +428 992 2341 +1235 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 71 +0 0 186 +0 0 305 +0 0 427 +0 0 551 +0 0 678 +0 0 805 +0 0 935 +0 0 1092 +0 0 1296 +0 0 1475 +0 0 1635 +389 0 1772 +1146 0 1883 +1558 0 2007 +1555 0 2155 +423 998 2341 +1241 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 13 +0 0 112 +0 0 219 +0 0 330 +0 0 446 +0 0 566 +0 0 689 +0 0 814 +0 0 941 +0 0 1097 +0 0 1299 +0 0 1477 +0 0 1636 +403 0 1773 +1145 0 1884 +1554 0 2008 +1549 0 2156 +416 1005 2342 +1249 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 13 +0 0 163 +0 0 259 +0 0 363 +0 0 472 +0 0 586 +0 0 704 +0 0 825 +0 0 949 +0 0 1103 +0 0 1303 +0 0 1480 +0 0 1637 +422 0 1775 +1143 0 1884 +1548 0 2010 +1541 50 2158 +407 1015 2342 +1259 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 13 +0 0 163 +0 38 309 +0 38 402 +0 38 503 +0 38 610 +0 38 723 +0 38 840 +0 38 961 +0 102 1111 +0 30 1308 +0 30 1483 +0 0 1639 +445 0 1776 +1140 0 1886 +1541 0 2011 +1531 190 2160 +394 1028 2343 +1272 621 2470 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +0 4 0 +0 0 0 +0 20 0 +0 52 13 +0 91 163 +0 139 309 +0 195 450 +0 195 542 +0 195 641 +0 195 748 +0 195 859 +0 195 975 +0 242 1121 +0 163 1315 +0 163 1488 +0 135 1641 +475 0 1779 +1137 0 1888 +1532 32 2014 +1516 329 2163 +376 1045 2344 +1289 621 2470 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +0 144 0 +0 137 0 +0 155 0 +0 179 13 +0 209 163 +0 246 309 +0 291 450 +0 346 589 +0 346 680 +0 346 778 +0 346 883 +0 346 994 +0 380 1135 +0 295 1324 +0 295 1494 +0 274 1644 +512 108 1782 +1133 0 1891 +1518 164 2017 +1496 465 2167 +352 1066 2345 +1311 621 2470 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +0 281 0 +0 276 0 +0 289 0 +0 307 13 +0 330 163 +0 359 309 +0 394 450 +0 438 589 +0 491 727 +0 491 816 +0 491 914 +0 491 1018 +0 516 1153 +0 426 1336 +0 426 1502 +0 412 1648 +557 254 1787 +1126 111 1894 +1500 296 2021 +1468 601 2172 +317 1093 2347 +1350 639 2470 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +0 417 0 +0 413 0 +0 423 0 +0 437 13 +0 454 163 +0 476 309 +0 504 450 +0 539 589 +0 581 727 +0 633 862 +0 633 952 +0 633 1049 +0 651 1176 +0 570 1351 +0 559 1513 +0 547 1653 +561 434 1790 +1118 244 1898 +1474 428 2027 +1427 736 2178 +265 1128 2349 +1398 662 2470 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +0 552 0 +0 549 0 +0 557 0 +0 566 13 +0 579 163 +0 596 309 +0 618 450 +0 645 589 +0 679 727 +0 721 862 +0 772 997 +0 772 1086 +0 785 1204 +0 726 1371 +0 691 1527 +0 682 1662 +561 601 1796 +1135 422 1904 +1436 560 2035 +1366 869 2187 +186 1169 2352 +1455 691 2470 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +0 686 0 +0 684 0 +0 690 0 +0 697 13 +0 707 163 +0 720 309 +0 736 450 +0 758 589 +0 784 727 +0 818 862 +0 859 997 +0 909 1132 +0 919 1240 +0 876 1396 +0 823 1545 +0 817 1675 +561 758 1802 +1163 593 1912 +1381 692 2045 +1269 1003 2199 +0 1212 2357 +1522 728 2470 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +0 854 85 +0 854 130 +0 858 201 +0 863 282 +0 870 371 +0 879 468 +0 891 572 +0 906 682 +0 925 797 +0 950 916 +0 981 1038 +0 1020 1162 +0 1060 1288 +0 1029 1430 +0 983 1570 +0 969 1697 +572 942 1817 +1182 800 1926 +1302 849 2057 +1120 1137 2212 +0 1254 2365 +1585 800 2470 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +0 1183 1025 +0 1183 1031 +0 1183 1036 +0 1183 1043 +0 1183 1052 +0 1183 1064 +0 1183 1080 +0 1183 1099 +0 1183 1125 +0 1188 1168 +0 1207 1242 +0 1231 1325 +0 1257 1417 +0 1236 1493 +0 1208 1617 +0 1221 1741 +640 1187 1855 +1045 1132 1961 +1243 1131 2080 +1031 1271 2225 +498 1311 2371 +1589 1031 2471 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +1765 1143 2512 +0 1421 1376 +0 1421 1379 +0 1421 1382 +0 1421 1385 +0 1421 1389 +0 1421 1395 +0 1421 1402 +0 1421 1412 +0 1421 1425 +0 1421 1442 +0 1421 1463 +0 1421 1491 +0 1431 1546 +0 1417 1605 +0 1399 1673 +0 1411 1786 +640 1405 1896 +1052 1353 1999 +1151 1350 2110 +878 1405 2240 +684 1387 2378 +1602 1208 2473 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +1799 1313 2510 +913 1579 1648 +912 1579 1649 +912 1579 1651 +912 1579 1653 +912 1578 1655 +912 1577 1658 +912 1576 1662 +912 1574 1668 +912 1572 1675 +912 1569 1685 +912 1567 1698 +912 1567 1714 +892 1567 1736 +891 1577 1788 +891 1569 1838 +896 1552 1889 +818 1557 1970 +929 1536 2067 +946 1537 2170 +810 1524 2268 +1128 1500 2382 +1680 1435 2473 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1450 1705 1856 +1449 1705 1856 +1448 1705 1857 +1446 1705 1859 +1444 1705 1860 +1442 1705 1862 +1439 1705 1865 +1434 1705 1868 +1427 1705 1873 +1427 1703 1880 +1427 1700 1888 +1427 1696 1899 +1424 1691 1913 +1401 1685 1931 +1401 1696 1976 +1370 1701 2022 +1372 1685 2062 +1195 1672 2128 +1129 1678 2221 +1176 1647 2295 +1520 1631 2386 +1776 1634 2475 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1894 1629 2511 +1786 1817 1978 +1786 1817 1978 +1786 1817 1979 +1786 1817 1980 +1787 1817 1981 +1787 1817 1982 +1788 1817 1983 +1789 1817 1986 +1790 1817 1988 +1793 1817 1992 +1789 1817 1998 +1782 1817 2007 +1772 1818 2018 +1753 1824 2036 +1733 1818 2052 +1727 1803 2080 +1686 1816 2123 +1706 1808 2166 +1658 1793 2234 +1664 1793 2304 +1754 1797 2389 +1874 1790 2475 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1964 1800 2514 +1958 1958 2028 +1958 1958 2029 +1957 1958 2029 +1957 1958 2030 +1957 1958 2031 +1956 1958 2031 +1956 1958 2033 +1955 1958 2035 +1954 1958 2037 +1953 1958 2041 +1951 1958 2045 +1948 1958 2051 +1946 1958 2058 +1941 1962 2068 +1936 1968 2081 +1927 1969 2115 +1913 1965 2153 +1905 1963 2189 +1920 1969 2243 +1881 1968 2320 +1929 1954 2392 +2033 1964 2481 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2120 2119 2068 +2120 2119 2068 +2120 2119 2068 +2120 2120 2069 +2120 2120 2069 +2120 2120 2070 +2120 2120 2072 +2120 2121 2073 +2120 2122 2076 +2120 2122 2079 +2120 2124 2083 +2120 2125 2088 +2119 2127 2095 +2119 2127 2101 +2119 2127 2110 +2115 2131 2133 +2109 2133 2164 +2103 2131 2206 +2111 2135 2256 +2119 2135 2316 +2148 2131 2395 +2212 2147 2485 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2356 2125 +2369 2356 2126 +2369 2356 2126 +2369 2356 2127 +2369 2357 2129 +2368 2357 2131 +2367 2358 2133 +2368 2359 2137 +2369 2360 2143 +2370 2358 2146 +2369 2356 2148 +2368 2358 2163 +2370 2358 2193 +2369 2358 2226 +2372 2355 2273 +2383 2356 2337 +2410 2367 2405 +2467 2385 2498 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2654 1965 +2681 2654 1966 +2681 2654 1968 +2681 2654 1967 +2681 2654 1966 +2680 2653 1964 +2680 2653 1962 +2679 2652 1962 +2678 2653 1969 +2677 2654 1990 +2676 2653 2014 +2675 2650 2033 +2677 2655 2124 +2681 2656 2208 +2687 2661 2306 +2695 2667 2410 +2715 2678 2527 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2709 2773 2484 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 28 +0 0 152 +0 0 280 +0 0 408 +0 0 537 +0 0 667 +0 0 797 +0 0 928 +0 0 1088 +0 0 1296 +0 0 1475 +0 0 1634 +445 0 1772 +1152 0 1882 +1561 0 2006 +1559 0 2155 +423 987 2341 +1234 615 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 36 +0 0 159 +0 0 285 +0 0 412 +0 0 540 +0 0 669 +0 0 799 +0 0 930 +0 0 1089 +0 0 1297 +0 0 1475 +0 0 1635 +426 0 1772 +1151 0 1882 +1561 0 2007 +1558 0 2155 +423 992 2341 +1238 618 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 48 +0 0 168 +0 0 291 +0 0 417 +0 0 544 +0 0 672 +0 0 801 +0 0 931 +0 0 1090 +0 0 1298 +0 0 1476 +0 0 1635 +400 0 1772 +1150 0 1883 +1560 0 2007 +1556 0 2155 +423 998 2341 +1244 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 92 +0 0 203 +0 0 318 +0 0 437 +0 0 559 +0 0 683 +0 0 810 +0 0 938 +0 0 1094 +0 0 1300 +0 0 1478 +0 0 1636 +414 0 1773 +1149 0 1884 +1556 0 2008 +1550 0 2156 +416 1005 2342 +1252 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 145 +0 0 245 +0 0 351 +0 0 462 +0 0 579 +0 0 699 +0 0 821 +0 0 946 +0 0 1101 +0 0 1304 +0 0 1481 +0 0 1637 +432 0 1774 +1147 0 1885 +1551 0 2010 +1543 38 2158 +407 1015 2342 +1262 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 145 +0 1 295 +0 1 391 +0 1 494 +0 1 604 +0 1 718 +0 1 836 +0 1 958 +0 70 1109 +0 30 1310 +0 30 1484 +0 0 1639 +455 0 1776 +1144 0 1886 +1544 0 2012 +1532 182 2160 +394 1028 2343 +1275 621 2470 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +0 4 0 +0 0 0 +0 0 0 +0 16 0 +0 58 145 +0 109 295 +0 170 441 +0 170 534 +0 170 635 +0 170 742 +0 170 855 +0 170 973 +0 218 1119 +0 163 1316 +0 163 1489 +0 126 1641 +484 0 1778 +1141 0 1888 +1534 32 2014 +1518 322 2163 +376 1045 2344 +1292 621 2470 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +0 144 0 +0 137 0 +0 127 0 +0 152 0 +0 184 145 +0 223 295 +0 271 441 +0 327 582 +0 327 674 +0 327 773 +0 327 879 +0 327 991 +0 363 1133 +0 295 1325 +0 295 1495 +0 267 1644 +520 87 1782 +1137 0 1891 +1521 164 2017 +1498 461 2167 +352 1066 2345 +1314 621 2470 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +0 281 0 +0 276 0 +0 269 0 +0 287 0 +0 311 145 +0 341 295 +0 378 441 +0 423 582 +0 478 721 +0 478 812 +0 478 910 +0 478 1016 +0 503 1151 +0 426 1337 +0 426 1503 +0 406 1648 +565 239 1786 +1131 111 1894 +1503 296 2022 +1470 597 2172 +317 1093 2347 +1353 639 2470 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +0 417 0 +0 413 0 +0 408 0 +0 422 0 +0 439 145 +0 462 295 +0 491 441 +0 527 582 +0 570 721 +0 623 859 +0 623 948 +0 623 1046 +0 642 1174 +0 570 1352 +0 559 1514 +0 544 1653 +569 424 1790 +1123 244 1899 +1477 428 2027 +1429 733 2178 +265 1128 2349 +1400 662 2470 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +0 552 0 +0 549 0 +0 545 0 +0 555 0 +0 568 145 +0 586 295 +0 608 441 +0 636 582 +0 670 721 +0 713 859 +0 765 995 +0 765 1084 +0 778 1202 +0 726 1372 +0 691 1528 +0 680 1662 +569 594 1795 +1139 422 1905 +1440 560 2035 +1368 868 2187 +186 1169 2352 +1457 691 2470 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +0 686 0 +0 684 0 +0 681 0 +0 689 0 +0 699 145 +0 712 295 +0 729 441 +0 750 582 +0 777 721 +0 811 859 +0 854 995 +0 904 1130 +0 914 1238 +0 876 1397 +0 823 1546 +0 815 1675 +569 753 1802 +1167 593 1913 +1385 692 2045 +1272 1002 2199 +0 1212 2357 +1524 728 2470 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +0 854 85 +0 854 130 +0 852 185 +0 857 268 +0 864 360 +0 873 459 +0 885 565 +0 901 676 +0 920 793 +0 946 912 +0 977 1035 +0 1016 1160 +0 1056 1287 +0 1029 1432 +0 983 1571 +0 967 1697 +579 939 1816 +1186 800 1926 +1306 849 2057 +1123 1137 2212 +0 1254 2365 +1587 800 2470 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +0 1181 1022 +0 1181 1028 +0 1181 1036 +0 1181 1043 +0 1181 1052 +0 1181 1064 +0 1181 1080 +0 1181 1099 +0 1181 1125 +0 1186 1168 +0 1205 1242 +0 1229 1325 +0 1255 1417 +0 1235 1494 +0 1207 1618 +0 1219 1741 +647 1188 1855 +1051 1133 1961 +1243 1131 2080 +1031 1271 2225 +532 1310 2371 +1590 1030 2471 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +1766 1141 2512 +0 1420 1375 +0 1420 1378 +0 1420 1382 +0 1420 1385 +0 1420 1389 +0 1420 1395 +0 1420 1402 +0 1420 1412 +0 1420 1425 +0 1420 1442 +0 1420 1463 +0 1420 1491 +0 1430 1546 +0 1417 1606 +0 1398 1674 +0 1410 1786 +647 1405 1896 +1059 1354 2000 +1151 1350 2109 +878 1405 2240 +706 1386 2378 +1603 1208 2473 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +1800 1311 2510 +929 1579 1649 +928 1579 1650 +926 1579 1651 +926 1579 1653 +926 1578 1655 +926 1577 1658 +926 1576 1663 +926 1574 1668 +926 1572 1676 +926 1569 1685 +926 1567 1698 +926 1567 1715 +906 1567 1736 +898 1576 1787 +898 1569 1837 +906 1552 1889 +833 1557 1970 +939 1536 2067 +950 1537 2170 +810 1524 2268 +1132 1500 2382 +1680 1435 2473 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1845 1471 2509 +1452 1705 1855 +1450 1705 1856 +1449 1705 1857 +1448 1705 1859 +1446 1705 1860 +1443 1705 1862 +1440 1705 1865 +1435 1705 1868 +1429 1705 1873 +1428 1703 1880 +1428 1700 1888 +1428 1696 1899 +1425 1691 1913 +1402 1685 1931 +1402 1696 1977 +1371 1701 2021 +1374 1685 2062 +1200 1672 2128 +1132 1678 2221 +1180 1647 2295 +1520 1631 2386 +1776 1634 2475 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1787 1817 1978 +1787 1817 1978 +1786 1817 1979 +1786 1817 1980 +1787 1817 1981 +1787 1817 1982 +1788 1817 1983 +1789 1817 1986 +1791 1817 1988 +1793 1817 1992 +1789 1817 1998 +1782 1817 2007 +1772 1818 2018 +1753 1823 2036 +1734 1818 2052 +1728 1803 2080 +1687 1816 2123 +1706 1808 2166 +1658 1793 2234 +1666 1793 2304 +1755 1797 2389 +1874 1790 2475 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1958 1958 2029 +1958 1958 2029 +1958 1958 2029 +1958 1958 2030 +1957 1958 2031 +1957 1958 2032 +1956 1958 2033 +1955 1958 2035 +1955 1958 2037 +1953 1958 2041 +1951 1958 2045 +1949 1958 2051 +1946 1958 2058 +1941 1962 2068 +1936 1968 2081 +1927 1969 2114 +1914 1966 2153 +1905 1963 2189 +1920 1969 2243 +1882 1968 2320 +1930 1954 2392 +2034 1964 2481 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2094 1969 2517 +2120 2119 2068 +2120 2119 2068 +2120 2119 2068 +2120 2120 2069 +2120 2120 2069 +2120 2120 2070 +2120 2120 2071 +2120 2121 2073 +2120 2122 2076 +2120 2122 2079 +2120 2124 2083 +2120 2125 2088 +2119 2127 2095 +2119 2127 2101 +2119 2127 2110 +2116 2131 2132 +2109 2133 2164 +2103 2131 2206 +2111 2135 2256 +2120 2135 2316 +2148 2131 2395 +2212 2147 2485 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2261 2159 2524 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2356 2126 +2369 2356 2126 +2369 2356 2127 +2369 2357 2129 +2368 2357 2131 +2367 2358 2133 +2368 2359 2137 +2369 2360 2143 +2370 2358 2146 +2369 2356 2148 +2368 2358 2163 +2370 2358 2193 +2369 2358 2226 +2372 2355 2273 +2384 2356 2337 +2410 2367 2405 +2467 2385 2498 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2655 1965 +2681 2655 1966 +2681 2654 1967 +2681 2654 1969 +2681 2654 1968 +2681 2654 1966 +2680 2653 1965 +2680 2653 1962 +2679 2652 1963 +2678 2653 1970 +2677 2655 1992 +2676 2653 2015 +2675 2650 2035 +2677 2655 2124 +2681 2656 2208 +2687 2661 2306 +2695 2666 2409 +2715 2678 2527 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2722 2684 2575 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2771 2455 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 28 +0 0 152 +0 0 280 +0 0 408 +0 0 537 +0 0 667 +0 0 797 +0 0 928 +0 0 1088 +0 0 1300 +0 0 1478 +0 0 1634 +499 0 1773 +1157 0 1883 +1561 0 2007 +1557 0 2156 +416 987 2341 +1238 611 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 36 +0 0 159 +0 0 285 +0 0 412 +0 0 540 +0 0 669 +0 0 799 +0 0 930 +0 0 1089 +0 0 1301 +0 0 1478 +0 0 1635 +483 0 1773 +1157 0 1883 +1561 0 2007 +1556 0 2156 +416 992 2341 +1243 614 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 48 +0 0 168 +0 0 291 +0 0 417 +0 0 544 +0 0 672 +0 0 801 +0 0 931 +0 0 1090 +0 0 1302 +0 0 1479 +0 0 1635 +460 0 1772 +1156 0 1884 +1560 0 2008 +1554 0 2156 +416 998 2341 +1249 617 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 63 +0 0 180 +0 0 300 +0 0 424 +0 0 549 +0 0 676 +0 0 804 +0 0 933 +0 0 1091 +0 0 1302 +0 0 1480 +0 0 1636 +427 0 1772 +1154 0 1884 +1560 0 2009 +1552 0 2156 +416 1005 2342 +1256 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 120 +0 0 224 +0 0 335 +0 0 450 +0 0 569 +0 0 691 +0 0 816 +0 0 942 +0 0 1097 +0 0 1306 +0 0 1482 +0 0 1637 +445 0 1774 +1153 0 1885 +1554 0 2010 +1544 22 2158 +407 1015 2342 +1266 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 120 +0 0 277 +0 0 376 +0 0 483 +0 0 594 +0 0 711 +0 0 831 +0 0 954 +0 23 1106 +0 30 1311 +0 30 1486 +0 0 1639 +467 0 1775 +1150 0 1887 +1547 0 2012 +1534 170 2160 +394 1028 2343 +1279 621 2470 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +0 4 0 +0 0 0 +0 0 0 +0 0 0 +0 11 120 +0 67 277 +0 133 427 +0 133 523 +0 133 627 +0 133 736 +0 133 850 +0 133 968 +0 186 1116 +0 163 1318 +0 163 1490 +0 112 1641 +496 0 1778 +1147 0 1888 +1538 32 2014 +1520 314 2163 +376 1045 2344 +1296 621 2470 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +0 144 0 +0 137 0 +0 127 0 +0 114 0 +0 148 120 +0 190 277 +0 241 427 +0 302 573 +0 302 666 +0 302 767 +0 302 875 +0 302 987 +0 339 1130 +0 295 1327 +0 295 1496 +0 258 1644 +531 58 1781 +1142 0 1891 +1524 164 2018 +1500 455 2167 +352 1066 2345 +1318 621 2470 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +0 281 0 +0 276 0 +0 269 0 +0 259 0 +0 284 120 +0 316 277 +0 355 427 +0 403 573 +0 459 714 +0 459 806 +0 459 906 +0 459 1012 +0 486 1148 +0 426 1339 +0 426 1504 +0 399 1648 +574 219 1786 +1136 111 1894 +1506 296 2022 +1472 593 2172 +317 1093 2347 +1356 639 2470 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +0 417 0 +0 413 0 +0 408 0 +0 401 0 +0 419 120 +0 443 277 +0 473 427 +0 510 573 +0 556 714 +0 610 854 +0 610 944 +0 610 1043 +0 629 1171 +0 570 1354 +0 559 1515 +0 539 1653 +578 410 1789 +1128 244 1899 +1481 428 2028 +1431 730 2178 +265 1128 2349 +1403 662 2470 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +0 552 0 +0 549 0 +0 545 0 +0 540 0 +0 553 120 +0 571 277 +0 594 427 +0 623 573 +0 658 714 +0 702 854 +0 755 991 +0 755 1080 +0 769 1200 +0 726 1374 +0 691 1529 +0 676 1662 +578 585 1795 +1145 422 1905 +1444 560 2035 +1371 865 2187 +186 1169 2352 +1460 691 2470 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +0 686 0 +0 684 0 +0 681 0 +0 677 0 +0 688 120 +0 701 277 +0 718 427 +0 740 573 +0 768 714 +0 803 854 +0 845 991 +0 897 1127 +0 907 1236 +0 876 1399 +0 823 1547 +0 812 1675 +578 746 1801 +1172 593 1913 +1390 692 2045 +1275 1000 2199 +0 1212 2357 +1526 728 2470 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +0 854 85 +0 854 130 +0 852 185 +0 850 248 +0 857 344 +0 866 446 +0 878 555 +0 894 669 +0 914 787 +0 939 908 +0 971 1032 +0 1011 1157 +0 1051 1285 +0 1029 1433 +0 983 1572 +27 965 1697 +589 934 1816 +1190 800 1926 +1312 849 2057 +1127 1135 2212 +0 1254 2365 +1589 800 2470 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +0 1178 1018 +0 1178 1024 +0 1178 1032 +0 1178 1043 +0 1178 1052 +0 1178 1064 +0 1178 1080 +0 1178 1099 +0 1178 1125 +0 1184 1168 +0 1203 1242 +0 1227 1325 +0 1253 1417 +21 1234 1496 +21 1206 1619 +81 1217 1742 +655 1189 1855 +1060 1135 1962 +1243 1131 2080 +1031 1271 2225 +573 1308 2371 +1592 1028 2471 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +1767 1138 2512 +0 1418 1374 +0 1418 1376 +0 1418 1380 +0 1418 1385 +0 1418 1389 +0 1418 1395 +0 1418 1402 +0 1418 1412 +0 1418 1425 +0 1418 1442 +0 1418 1463 +0 1418 1491 +0 1429 1546 +21 1416 1607 +21 1397 1675 +81 1409 1787 +655 1406 1896 +1067 1355 2000 +1151 1350 2109 +878 1405 2240 +735 1384 2378 +1605 1206 2473 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +1801 1309 2510 +949 1577 1650 +947 1578 1651 +946 1578 1652 +943 1579 1653 +943 1578 1656 +943 1577 1659 +943 1576 1663 +943 1574 1669 +943 1572 1676 +943 1569 1686 +943 1567 1699 +943 1567 1715 +924 1567 1737 +908 1576 1787 +908 1568 1837 +917 1552 1889 +852 1557 1971 +951 1536 2066 +957 1537 2170 +810 1525 2268 +1138 1499 2382 +1680 1435 2473 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1845 1470 2509 +1454 1705 1855 +1453 1705 1856 +1451 1705 1857 +1449 1705 1859 +1447 1705 1860 +1444 1705 1862 +1441 1705 1865 +1436 1705 1868 +1430 1705 1873 +1430 1703 1880 +1430 1700 1888 +1430 1696 1899 +1426 1691 1913 +1403 1685 1931 +1403 1696 1977 +1372 1701 2021 +1375 1686 2063 +1206 1672 2128 +1137 1678 2221 +1185 1647 2295 +1521 1632 2386 +1778 1634 2475 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1894 1628 2511 +1788 1817 1978 +1788 1817 1978 +1787 1817 1979 +1787 1817 1980 +1787 1817 1981 +1788 1817 1982 +1789 1817 1983 +1790 1817 1986 +1791 1817 1988 +1793 1817 1992 +1789 1817 1998 +1782 1817 2007 +1773 1818 2018 +1754 1823 2036 +1735 1818 2051 +1730 1803 2080 +1689 1816 2124 +1707 1808 2166 +1658 1793 2234 +1668 1793 2304 +1756 1797 2389 +1874 1789 2475 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1965 1800 2514 +1959 1958 2029 +1959 1958 2029 +1958 1958 2030 +1958 1958 2030 +1958 1958 2031 +1957 1958 2032 +1957 1958 2033 +1956 1958 2035 +1955 1958 2037 +1954 1958 2041 +1952 1958 2045 +1950 1958 2051 +1946 1958 2058 +1942 1962 2068 +1936 1967 2081 +1928 1969 2114 +1915 1966 2154 +1905 1962 2189 +1920 1968 2243 +1883 1968 2320 +1930 1954 2392 +2035 1964 2481 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2095 1968 2516 +2120 2120 2068 +2120 2120 2068 +2120 2120 2068 +2120 2120 2069 +2120 2120 2069 +2120 2120 2070 +2120 2120 2071 +2120 2121 2073 +2120 2122 2075 +2120 2122 2078 +2120 2124 2082 +2120 2125 2088 +2119 2127 2095 +2119 2127 2101 +2119 2127 2110 +2116 2131 2132 +2110 2133 2165 +2104 2131 2206 +2111 2134 2256 +2120 2135 2316 +2148 2131 2395 +2212 2147 2485 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2356 2126 +2369 2356 2126 +2369 2356 2127 +2369 2357 2129 +2368 2357 2131 +2368 2358 2133 +2368 2359 2137 +2369 2360 2143 +2370 2358 2146 +2369 2356 2148 +2369 2358 2163 +2371 2358 2193 +2369 2358 2226 +2372 2355 2273 +2384 2357 2337 +2410 2367 2405 +2467 2385 2498 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2655 1966 +2681 2655 1967 +2681 2655 1968 +2681 2655 1969 +2681 2654 1968 +2681 2654 1967 +2680 2654 1965 +2680 2653 1963 +2679 2653 1963 +2678 2654 1973 +2677 2655 1994 +2676 2653 2016 +2675 2650 2036 +2677 2655 2123 +2681 2656 2208 +2687 2661 2306 +2695 2666 2409 +2715 2678 2527 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +58 0 0 +58 0 0 +58 0 0 +58 0 0 +58 0 28 +58 0 152 +58 0 280 +58 0 408 +58 0 537 +58 0 667 +58 0 797 +58 0 928 +0 0 1088 +0 0 1305 +0 0 1481 +28 0 1634 +564 0 1774 +1165 0 1884 +1561 0 2007 +1555 0 2157 +407 987 2341 +1245 605 2470 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +41 0 0 +50 0 0 +50 0 0 +50 0 0 +50 0 36 +50 0 159 +50 0 285 +50 0 412 +50 0 540 +50 0 669 +50 0 799 +50 0 930 +0 0 1089 +0 0 1306 +0 0 1482 +36 0 1635 +550 0 1774 +1164 0 1884 +1561 0 2008 +1554 0 2157 +407 992 2341 +1249 608 2470 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +17 0 0 +26 0 0 +38 0 0 +38 0 0 +38 0 48 +38 0 168 +38 0 291 +38 0 417 +38 0 544 +38 0 672 +38 0 801 +38 0 931 +0 0 1090 +0 0 1307 +0 0 1482 +48 0 1635 +530 0 1773 +1163 0 1884 +1560 0 2008 +1552 0 2157 +407 998 2341 +1254 611 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +6 0 0 +22 0 0 +22 0 63 +22 0 180 +22 0 300 +22 0 424 +22 0 549 +22 0 676 +22 0 804 +22 0 933 +0 0 1091 +0 0 1308 +0 0 1483 +63 0 1636 +502 0 1773 +1162 0 1885 +1560 0 2009 +1550 0 2158 +407 1005 2342 +1262 615 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 83 +0 0 195 +0 0 312 +0 0 433 +0 0 556 +0 0 681 +0 0 808 +0 0 936 +0 0 1093 +0 0 1309 +0 0 1484 +83 0 1637 +462 0 1772 +1160 0 1885 +1559 0 2010 +1547 0 2158 +407 1015 2342 +1272 621 2470 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +1732 0 2503 +0 0 0 +0 0 0 +0 0 0 +0 0 0 +0 0 83 +0 0 251 +0 0 356 +0 0 467 +0 0 582 +0 0 701 +0 0 823 +0 0 948 +0 0 1102 +0 30 1314 +0 30 1487 +83 0 1639 +483 0 1774 +1157 0 1887 +1552 0 2012 +1536 154 2160 +394 1028 2343 +1285 621 2470 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +0 4 0 +0 0 0 +0 0 0 +0 0 0 +0 0 83 +0 3 251 +0 78 409 +0 78 509 +0 78 615 +0 78 727 +0 78 843 +0 78 963 +0 137 1112 +0 163 1321 +0 163 1492 +83 94 1641 +511 0 1777 +1154 0 1889 +1542 32 2015 +1522 302 2163 +376 1045 2344 +1302 621 2470 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +0 144 0 +0 137 0 +0 127 0 +0 114 0 +0 96 83 +0 143 251 +0 199 409 +0 265 559 +0 265 655 +0 265 759 +0 265 868 +0 265 982 +0 305 1126 +0 295 1330 +0 295 1498 +83 244 1644 +545 15 1780 +1150 0 1891 +1529 164 2018 +1502 446 2167 +352 1066 2345 +1323 621 2470 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +0 281 0 +0 276 0 +0 269 0 +0 259 0 +0 246 83 +0 280 251 +0 322 409 +0 373 559 +0 434 705 +0 434 798 +0 434 899 +0 434 1007 +0 462 1144 +0 426 1341 +0 426 1506 +83 390 1648 +587 190 1784 +1144 111 1895 +1511 296 2022 +1474 586 2172 +317 1093 2347 +1361 639 2470 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +0 417 0 +0 413 0 +0 408 0 +0 401 0 +0 391 83 +0 416 251 +0 448 409 +0 487 559 +0 535 705 +0 591 846 +0 591 938 +0 591 1038 +0 611 1167 +0 570 1357 +0 559 1517 +83 531 1653 +591 391 1789 +1136 244 1899 +1486 428 2028 +1434 725 2178 +265 1128 2349 +1407 662 2470 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +0 552 0 +0 549 0 +0 545 0 +0 540 0 +0 533 83 +0 551 251 +0 575 409 +0 605 559 +0 642 705 +0 688 846 +0 742 985 +0 742 1076 +0 756 1197 +0 726 1376 +0 691 1531 +83 670 1662 +591 572 1794 +1152 422 1905 +1450 560 2036 +1374 862 2187 +186 1169 2352 +1464 691 2470 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +0 686 0 +0 684 0 +0 681 0 +0 677 0 +0 672 83 +0 686 251 +0 703 409 +0 726 559 +0 755 705 +0 791 846 +0 835 985 +0 887 1123 +0 898 1233 +0 876 1401 +0 823 1548 +83 808 1675 +591 737 1800 +1179 593 1913 +1396 692 2046 +1279 997 2199 +0 1212 2357 +1529 728 2470 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +0 854 85 +0 854 130 +0 852 185 +0 850 248 +0 846 322 +0 855 429 +0 868 541 +0 884 658 +0 904 778 +0 930 901 +0 963 1027 +0 1003 1154 +69 1044 1282 +0 1029 1435 +0 983 1573 +141 963 1697 +601 928 1815 +1197 800 1927 +1320 849 2058 +1133 1133 2212 +0 1254 2365 +1592 800 2470 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +136 1175 1014 +107 1175 1020 +65 1175 1028 +1 1175 1038 +0 1175 1052 +0 1175 1064 +0 1175 1080 +0 1175 1099 +0 1175 1125 +0 1180 1168 +0 1200 1242 +0 1224 1325 +21 1250 1417 +153 1233 1497 +153 1204 1620 +214 1214 1743 +666 1191 1855 +1071 1137 1962 +1243 1131 2080 +1031 1271 2226 +622 1305 2371 +1594 1025 2471 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +1769 1134 2512 +136 1416 1371 +107 1416 1374 +65 1416 1378 +1 1416 1383 +0 1416 1389 +0 1416 1395 +0 1416 1402 +0 1416 1412 +0 1416 1425 +0 1416 1442 +0 1416 1463 +0 1416 1491 +21 1427 1546 +153 1415 1608 +153 1396 1676 +214 1407 1788 +666 1407 1897 +1078 1356 2001 +1151 1350 2109 +878 1405 2241 +770 1382 2378 +1607 1205 2473 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +1802 1306 2510 +973 1576 1651 +973 1576 1652 +971 1577 1653 +969 1577 1654 +966 1578 1656 +966 1577 1659 +966 1576 1664 +966 1574 1669 +966 1572 1677 +966 1569 1686 +966 1567 1699 +966 1567 1716 +948 1567 1737 +920 1575 1786 +920 1568 1836 +932 1552 1890 +876 1557 1972 +968 1536 2066 +965 1537 2170 +810 1526 2268 +1145 1498 2382 +1680 1435 2473 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1844 1469 2509 +1457 1704 1855 +1456 1704 1856 +1454 1705 1857 +1452 1705 1858 +1449 1705 1860 +1446 1705 1862 +1443 1705 1865 +1438 1705 1868 +1432 1705 1873 +1431 1703 1880 +1431 1700 1888 +1431 1696 1899 +1428 1691 1913 +1405 1685 1932 +1405 1696 1977 +1373 1700 2021 +1378 1686 2063 +1214 1672 2128 +1142 1679 2221 +1192 1647 2295 +1522 1633 2386 +1779 1634 2475 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1895 1627 2511 +1790 1816 1977 +1790 1816 1978 +1789 1816 1978 +1789 1816 1979 +1788 1816 1981 +1788 1816 1982 +1789 1816 1983 +1790 1816 1986 +1792 1816 1988 +1793 1816 1992 +1790 1816 1998 +1783 1816 2007 +1773 1817 2018 +1755 1823 2036 +1736 1817 2051 +1731 1804 2079 +1691 1816 2124 +1708 1807 2166 +1659 1793 2234 +1670 1794 2305 +1757 1797 2389 +1873 1789 2475 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1966 1800 2514 +1960 1958 2029 +1960 1958 2029 +1959 1958 2030 +1959 1958 2030 +1958 1958 2031 +1958 1958 2032 +1957 1958 2034 +1956 1958 2035 +1956 1958 2038 +1954 1958 2041 +1952 1958 2046 +1950 1958 2051 +1947 1958 2059 +1942 1961 2068 +1936 1967 2081 +1928 1969 2113 +1916 1966 2154 +1905 1962 2189 +1920 1968 2242 +1884 1968 2319 +1930 1954 2392 +2036 1964 2481 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2096 1968 2516 +2120 2120 2068 +2120 2120 2068 +2120 2120 2069 +2120 2120 2069 +2121 2120 2069 +2121 2120 2070 +2121 2120 2071 +2121 2121 2073 +2121 2122 2075 +2121 2122 2078 +2121 2124 2082 +2121 2125 2087 +2120 2127 2094 +2119 2127 2101 +2119 2127 2110 +2116 2131 2132 +2110 2134 2165 +2104 2130 2206 +2111 2134 2256 +2120 2134 2316 +2148 2131 2395 +2213 2146 2485 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2370 2356 2126 +2369 2356 2127 +2369 2356 2129 +2369 2357 2131 +2368 2357 2133 +2368 2359 2137 +2369 2360 2143 +2370 2358 2146 +2369 2356 2148 +2369 2358 2162 +2371 2358 2193 +2370 2358 2226 +2372 2356 2273 +2384 2357 2337 +2410 2367 2406 +2466 2384 2498 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2655 1967 +2681 2655 1968 +2681 2655 1969 +2681 2655 1970 +2681 2655 1969 +2681 2654 1968 +2680 2654 1966 +2680 2653 1964 +2679 2653 1964 +2678 2654 1975 +2677 2655 1997 +2676 2654 2018 +2675 2650 2038 +2677 2655 2123 +2681 2656 2208 +2687 2661 2306 +2695 2666 2409 +2715 2678 2527 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2456 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +197 0 0 +197 0 0 +197 0 0 +197 0 0 +197 0 28 +197 0 152 +197 0 280 +197 0 408 +197 0 537 +197 0 667 +197 0 797 +197 0 928 +71 0 1088 +0 0 1312 +0 0 1486 +152 0 1634 +638 0 1775 +1174 0 1884 +1561 0 2008 +1552 0 2159 +394 987 2341 +1252 597 2470 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +184 0 0 +190 0 0 +190 0 0 +190 0 0 +190 0 36 +190 0 159 +190 0 285 +190 0 412 +190 0 540 +190 0 669 +190 0 799 +190 0 930 +46 0 1089 +0 0 1313 +0 0 1486 +159 0 1635 +626 0 1775 +1173 0 1885 +1561 0 2008 +1551 0 2159 +394 992 2341 +1257 599 2470 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +167 0 0 +173 0 0 +182 0 0 +182 0 0 +182 0 48 +182 0 168 +182 0 291 +182 0 417 +182 0 544 +182 0 672 +182 0 801 +182 0 931 +35 0 1090 +0 0 1313 +0 0 1487 +168 0 1635 +609 0 1775 +1172 0 1885 +1560 0 2009 +1549 0 2159 +394 998 2341 +1262 603 2470 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +142 0 0 +149 0 0 +158 0 0 +170 0 0 +170 0 63 +170 0 180 +170 0 300 +170 0 424 +170 0 549 +170 0 676 +170 0 804 +170 0 933 +19 0 1091 +0 0 1315 +0 0 1487 +180 0 1636 +586 0 1774 +1171 0 1886 +1560 0 2010 +1547 0 2159 +394 1005 2342 +1270 608 2470 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +1734 0 2503 +107 0 0 +115 0 0 +125 0 0 +138 0 0 +154 0 83 +154 0 195 +154 0 312 +154 0 433 +154 0 556 +154 0 681 +154 0 808 +154 0 936 +0 0 1093 +0 0 1316 +0 0 1489 +195 0 1637 +552 0 1774 +1169 0 1886 +1559 0 2011 +1544 57 2160 +394 1015 2342 +1279 613 2470 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +1733 0 2503 +56 0 0 +65 0 0 +76 0 0 +90 0 0 +108 0 83 +132 0 215 +132 0 327 +132 0 444 +132 0 564 +132 0 688 +132 0 813 +132 0 940 +0 0 1096 +0 30 1317 +0 30 1490 +215 0 1639 +504 0 1773 +1167 0 1887 +1558 0 2012 +1540 132 2160 +394 1028 2343 +1292 621 2470 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +1732 30 2504 +56 4 0 +65 0 0 +76 0 0 +90 0 0 +108 0 83 +132 0 215 +132 0 383 +132 0 488 +132 0 599 +132 0 714 +132 0 833 +132 0 955 +0 64 1107 +0 163 1324 +0 163 1494 +215 68 1641 +530 0 1776 +1164 0 1889 +1548 32 2015 +1525 286 2163 +376 1045 2344 +1308 621 2470 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +56 144 0 +65 137 0 +76 127 0 +90 114 0 +108 96 83 +132 70 215 +132 135 383 +132 210 541 +132 210 641 +132 210 747 +132 210 859 +132 210 975 +0 255 1121 +0 295 1333 +0 295 1500 +215 226 1644 +563 0 1779 +1159 0 1892 +1536 164 2018 +1506 434 2167 +352 1066 2345 +1329 621 2470 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +56 281 0 +65 276 0 +76 269 0 +90 259 0 +108 246 83 +132 227 215 +132 275 383 +132 331 541 +132 397 691 +132 397 787 +132 397 891 +132 397 1000 +0 427 1139 +0 426 1344 +0 426 1508 +215 376 1648 +604 147 1783 +1154 111 1895 +1518 296 2022 +1478 578 2172 +317 1093 2347 +1367 639 2470 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +56 417 0 +65 413 0 +76 408 0 +90 401 0 +108 391 83 +132 378 215 +132 412 383 +132 455 541 +132 505 691 +132 566 837 +132 566 930 +132 566 1032 +0 587 1163 +0 570 1359 +0 559 1519 +215 522 1653 +607 365 1787 +1146 244 1900 +1493 428 2028 +1438 719 2178 +265 1128 2349 +1413 662 2470 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +56 552 0 +65 549 0 +76 545 0 +90 540 0 +108 533 83 +132 523 215 +132 548 383 +132 580 541 +132 619 691 +132 667 837 +132 723 978 +132 723 1071 +0 738 1192 +0 726 1379 +0 691 1532 +215 663 1662 +607 554 1792 +1162 422 1905 +1457 560 2036 +1379 857 2187 +186 1169 2352 +1468 691 2470 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +56 686 0 +65 684 0 +76 681 0 +90 677 0 +108 672 83 +132 665 215 +132 684 383 +132 708 541 +132 737 691 +132 774 837 +132 820 978 +132 874 1118 +0 885 1229 +0 876 1403 +0 823 1550 +215 803 1675 +607 725 1799 +1188 593 1913 +1404 692 2046 +1285 994 2199 +0 1212 2357 +1533 728 2470 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +63 854 85 +31 854 130 +43 852 185 +58 850 248 +78 846 322 +103 841 404 +103 854 522 +103 870 643 +103 892 767 +103 918 893 +103 952 1020 +103 993 1149 +185 1035 1278 +0 1029 1438 +0 983 1575 +259 959 1697 +617 920 1814 +1206 800 1927 +1329 849 2058 +1141 1131 2212 +0 1254 2365 +1596 800 2470 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +289 1170 1007 +268 1170 1013 +239 1170 1021 +196 1170 1032 +132 1170 1046 +30 1170 1064 +30 1170 1080 +30 1170 1099 +30 1170 1125 +30 1176 1168 +30 1195 1242 +30 1220 1325 +125 1246 1417 +285 1231 1499 +285 1202 1622 +345 1210 1744 +680 1193 1856 +1086 1139 1963 +1243 1131 2080 +1031 1271 2226 +681 1302 2370 +1597 1022 2471 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +1771 1129 2512 +289 1413 1368 +268 1413 1371 +239 1413 1375 +196 1413 1380 +132 1413 1386 +30 1413 1395 +30 1413 1402 +30 1413 1412 +30 1413 1425 +30 1413 1442 +30 1413 1463 +30 1413 1491 +125 1424 1546 +285 1414 1610 +285 1395 1677 +345 1404 1789 +680 1408 1897 +1092 1358 2001 +1151 1350 2109 +878 1405 2241 +813 1379 2377 +1609 1202 2473 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1804 1303 2510 +1005 1574 1653 +1004 1574 1654 +1003 1575 1655 +1001 1575 1656 +998 1576 1658 +995 1577 1660 +995 1576 1664 +995 1574 1670 +995 1572 1678 +995 1569 1687 +995 1567 1700 +995 1567 1716 +977 1567 1738 +937 1574 1785 +937 1567 1835 +952 1552 1890 +906 1557 1973 +989 1536 2066 +976 1537 2170 +810 1527 2268 +1155 1497 2382 +1680 1435 2473 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1844 1468 2509 +1461 1703 1854 +1459 1704 1855 +1458 1704 1856 +1456 1704 1858 +1453 1705 1859 +1449 1705 1862 +1446 1705 1865 +1441 1705 1868 +1435 1705 1873 +1434 1703 1880 +1434 1700 1888 +1434 1696 1899 +1431 1691 1913 +1408 1685 1932 +1408 1696 1977 +1375 1699 2021 +1380 1687 2064 +1224 1672 2127 +1149 1680 2221 +1200 1647 2295 +1523 1633 2386 +1781 1634 2475 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1896 1626 2511 +1793 1816 1977 +1792 1816 1977 +1792 1816 1978 +1791 1816 1979 +1790 1816 1980 +1789 1816 1982 +1790 1816 1983 +1791 1816 1986 +1792 1816 1988 +1794 1816 1992 +1790 1816 1998 +1783 1816 2007 +1774 1817 2018 +1756 1822 2035 +1737 1817 2051 +1733 1804 2079 +1694 1816 2124 +1710 1807 2166 +1660 1793 2234 +1673 1795 2305 +1759 1797 2389 +1873 1788 2475 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1968 1800 2514 +1961 1958 2029 +1961 1958 2030 +1961 1958 2030 +1960 1958 2031 +1959 1958 2031 +1959 1958 2032 +1958 1958 2034 +1958 1958 2036 +1956 1958 2038 +1955 1958 2042 +1953 1958 2046 +1951 1958 2052 +1948 1958 2059 +1943 1961 2068 +1937 1966 2081 +1930 1968 2112 +1918 1966 2154 +1905 1962 2189 +1920 1968 2242 +1885 1967 2319 +1930 1954 2392 +2038 1964 2481 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2097 1968 2516 +2120 2120 2069 +2120 2120 2069 +2121 2120 2069 +2121 2120 2069 +2121 2120 2069 +2121 2120 2069 +2121 2120 2071 +2121 2121 2073 +2121 2122 2075 +2121 2122 2078 +2121 2124 2082 +2121 2125 2087 +2120 2127 2094 +2119 2127 2101 +2119 2127 2110 +2117 2131 2132 +2111 2134 2166 +2105 2130 2206 +2111 2134 2255 +2121 2134 2316 +2148 2131 2396 +2213 2146 2485 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2370 2355 2126 +2370 2356 2127 +2369 2356 2129 +2369 2357 2131 +2368 2357 2133 +2369 2358 2137 +2369 2359 2143 +2370 2358 2146 +2369 2356 2148 +2369 2358 2162 +2371 2358 2193 +2370 2358 2226 +2373 2356 2273 +2385 2357 2337 +2411 2367 2406 +2466 2384 2498 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2655 1967 +2681 2655 1969 +2681 2655 1970 +2681 2655 1971 +2681 2655 1970 +2681 2655 1969 +2680 2654 1968 +2680 2654 1965 +2679 2653 1966 +2679 2654 1979 +2677 2655 2000 +2676 2654 2020 +2675 2650 2041 +2677 2655 2122 +2681 2656 2208 +2688 2661 2306 +2695 2666 2408 +2715 2678 2527 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2723 2684 2575 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2457 +2710 2773 2483 +2714 2774 2520 +2714 2773 2553 +2717 2777 2616 +2722 2784 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +333 0 0 +333 0 0 +333 0 0 +333 0 0 +333 0 28 +333 0 152 +333 0 280 +333 0 408 +333 0 537 +333 0 667 +333 0 797 +333 0 928 +244 0 1088 +0 0 1321 +0 0 1492 +280 0 1634 +721 0 1777 +1186 0 1886 +1561 0 2009 +1548 0 2161 +376 987 2341 +1263 586 2469 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +324 0 0 +329 0 0 +329 0 0 +329 0 0 +329 0 36 +329 0 159 +329 0 285 +329 0 412 +329 0 540 +329 0 669 +329 0 799 +329 0 930 +227 0 1089 +0 0 1322 +0 0 1493 +285 0 1635 +711 0 1776 +1185 0 1886 +1561 0 2009 +1547 0 2161 +376 992 2341 +1267 588 2469 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +311 0 0 +316 0 0 +322 0 0 +322 0 0 +322 0 48 +322 0 168 +322 0 291 +322 0 417 +322 0 544 +322 0 672 +322 0 801 +322 0 931 +219 0 1090 +0 0 1323 +0 0 1493 +291 0 1635 +697 0 1776 +1184 0 1886 +1560 0 2010 +1545 22 2161 +376 998 2341 +1272 592 2469 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +294 0 0 +299 0 0 +305 0 0 +314 0 0 +314 0 63 +314 0 180 +314 0 300 +314 0 424 +314 0 549 +314 0 676 +314 0 804 +314 0 933 +209 0 1091 +0 0 1323 +0 0 1494 +300 0 1636 +678 0 1776 +1183 0 1887 +1560 0 2011 +1543 69 2161 +376 1005 2342 +1280 596 2469 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +1735 0 2503 +269 0 0 +274 0 0 +281 0 0 +290 0 0 +302 0 83 +302 0 195 +302 0 312 +302 0 433 +302 0 556 +302 0 681 +302 0 808 +302 0 936 +194 0 1093 +0 0 1325 +0 0 1495 +312 0 1637 +651 0 1776 +1181 0 1887 +1559 0 2012 +1540 124 2162 +376 1015 2342 +1289 603 2469 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +1734 0 2504 +234 0 0 +239 0 0 +247 0 0 +257 0 0 +270 0 83 +286 0 215 +286 0 327 +286 0 444 +286 0 564 +286 0 688 +286 0 813 +286 0 940 +173 0 1096 +0 30 1326 +0 30 1496 +327 0 1639 +613 0 1775 +1179 0 1888 +1558 0 2013 +1535 189 2162 +376 1028 2343 +1301 611 2469 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +1733 30 2504 +182 4 0 +188 0 0 +197 0 0 +208 0 0 +222 0 83 +241 0 215 +264 0 347 +264 0 459 +264 0 576 +264 0 697 +264 0 820 +264 0 946 +145 0 1100 +0 163 1329 +0 163 1497 +347 32 1641 +555 0 1774 +1176 0 1890 +1557 32 2015 +1530 264 2163 +376 1045 2344 +1318 621 2469 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +1732 163 2504 +182 144 0 +188 137 0 +197 127 0 +208 114 0 +222 96 83 +241 70 215 +264 34 347 +264 126 516 +264 126 620 +264 126 731 +264 126 846 +264 126 966 +145 179 1114 +0 295 1337 +0 295 1503 +347 201 1644 +586 0 1777 +1172 0 1892 +1544 164 2019 +1510 418 2167 +352 1066 2345 +1338 621 2469 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +182 281 0 +188 276 0 +197 269 0 +208 259 0 +222 246 83 +241 227 215 +264 202 347 +264 267 516 +264 342 673 +264 342 773 +264 342 879 +264 342 991 +145 376 1133 +0 426 1349 +0 426 1511 +347 358 1648 +625 84 1782 +1166 111 1896 +1526 296 2023 +1483 566 2172 +317 1093 2347 +1375 639 2469 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +182 417 0 +188 413 0 +197 408 0 +208 401 0 +222 391 83 +241 378 215 +264 360 347 +264 407 516 +264 463 673 +264 529 824 +264 529 920 +264 529 1023 +145 552 1156 +0 570 1364 +0 559 1522 +347 509 1653 +628 326 1786 +1159 244 1900 +1502 428 2029 +1443 710 2178 +265 1128 2349 +1420 662 2469 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +182 552 0 +188 549 0 +197 545 0 +208 540 0 +222 533 83 +241 523 215 +264 510 347 +264 544 516 +264 586 673 +264 637 824 +264 698 969 +264 698 1063 +145 714 1186 +0 726 1383 +0 691 1535 +347 654 1662 +628 529 1791 +1174 422 1906 +1467 560 2036 +1385 851 2187 +186 1169 2352 +1475 691 2469 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +182 686 0 +188 684 0 +197 681 0 +208 677 0 +222 672 83 +241 665 215 +264 655 347 +264 681 516 +264 712 673 +264 752 824 +264 799 969 +264 856 1111 +145 867 1223 +0 876 1407 +0 823 1553 +347 796 1675 +628 708 1798 +1200 593 1914 +1415 692 2046 +1292 989 2199 +0 1212 2357 +1539 728 2469 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +187 854 85 +163 854 130 +172 852 185 +183 850 248 +198 846 322 +218 841 404 +243 835 496 +243 852 623 +243 874 752 +243 902 881 +243 936 1011 +243 979 1142 +304 1023 1273 +0 1029 1441 +0 983 1578 +380 954 1697 +638 909 1812 +1217 800 1928 +1343 849 2058 +1151 1127 2212 +0 1254 2365 +1600 800 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +436 1164 998 +421 1164 1004 +400 1164 1013 +371 1164 1024 +328 1164 1038 +265 1164 1056 +163 1164 1080 +163 1164 1099 +163 1164 1125 +163 1170 1168 +163 1189 1242 +163 1214 1325 +235 1241 1417 +417 1228 1503 +417 1199 1624 +478 1204 1746 +698 1196 1857 +1104 1142 1964 +1243 1131 2079 +1031 1271 2226 +750 1297 2370 +1600 1018 2470 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +1773 1121 2512 +436 1410 1364 +421 1410 1367 +400 1410 1371 +371 1410 1376 +328 1410 1382 +265 1410 1391 +163 1410 1402 +163 1410 1412 +163 1410 1425 +163 1410 1442 +163 1410 1463 +163 1410 1491 +235 1421 1546 +417 1412 1612 +417 1393 1679 +478 1400 1791 +698 1410 1897 +1111 1360 2002 +1151 1350 2108 +878 1405 2242 +865 1375 2377 +1613 1200 2472 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1806 1298 2510 +1044 1572 1655 +1043 1572 1656 +1042 1572 1657 +1040 1573 1658 +1038 1573 1660 +1034 1574 1662 +1030 1576 1666 +1030 1574 1671 +1030 1572 1679 +1030 1569 1688 +1030 1567 1701 +1030 1567 1717 +1014 1567 1739 +958 1573 1783 +958 1565 1833 +977 1552 1891 +944 1557 1974 +1016 1536 2066 +990 1537 2170 +810 1528 2268 +1168 1496 2382 +1680 1435 2473 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1843 1466 2509 +1466 1702 1854 +1464 1703 1855 +1463 1703 1855 +1461 1703 1857 +1458 1704 1859 +1454 1705 1862 +1449 1705 1865 +1444 1705 1868 +1438 1705 1873 +1438 1703 1880 +1438 1700 1888 +1438 1696 1899 +1434 1691 1913 +1412 1685 1932 +1412 1696 1978 +1377 1698 2020 +1384 1688 2065 +1238 1672 2127 +1159 1681 2221 +1212 1647 2296 +1524 1635 2386 +1783 1634 2474 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1897 1625 2511 +1796 1815 1977 +1795 1815 1977 +1795 1815 1978 +1794 1815 1978 +1793 1815 1980 +1792 1815 1981 +1790 1815 1983 +1792 1815 1986 +1793 1815 1988 +1795 1815 1992 +1791 1815 1998 +1784 1815 2007 +1775 1816 2018 +1758 1821 2035 +1739 1816 2051 +1736 1805 2078 +1698 1816 2124 +1712 1806 2166 +1661 1793 2234 +1677 1795 2305 +1762 1797 2390 +1872 1787 2475 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1969 1800 2514 +1963 1958 2030 +1962 1958 2030 +1962 1958 2031 +1962 1958 2031 +1961 1958 2032 +1960 1958 2033 +1959 1958 2034 +1958 1958 2036 +1958 1958 2039 +1956 1958 2042 +1955 1958 2047 +1952 1958 2052 +1949 1958 2059 +1943 1961 2068 +1937 1966 2081 +1930 1968 2111 +1921 1967 2155 +1905 1961 2189 +1920 1967 2241 +1887 1967 2319 +1931 1954 2392 +2040 1964 2481 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2099 1967 2516 +2121 2120 2069 +2121 2120 2069 +2121 2120 2069 +2121 2120 2069 +2121 2120 2070 +2122 2120 2070 +2122 2120 2070 +2122 2121 2072 +2122 2122 2074 +2122 2122 2078 +2122 2124 2082 +2122 2125 2087 +2121 2127 2094 +2119 2127 2101 +2119 2127 2110 +2118 2131 2131 +2112 2134 2166 +2105 2129 2205 +2112 2134 2255 +2122 2134 2316 +2148 2132 2396 +2214 2146 2485 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2261 2159 2523 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2371 2355 2126 +2370 2356 2127 +2370 2356 2129 +2369 2357 2131 +2369 2357 2133 +2369 2358 2137 +2370 2359 2143 +2370 2358 2146 +2369 2356 2148 +2369 2358 2162 +2372 2358 2193 +2371 2358 2226 +2374 2356 2273 +2386 2358 2337 +2411 2367 2406 +2465 2384 2499 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2655 1967 +2681 2655 1969 +2681 2656 1972 +2681 2656 1973 +2681 2655 1972 +2681 2655 1971 +2680 2655 1969 +2680 2654 1967 +2679 2654 1967 +2679 2655 1983 +2677 2656 2005 +2677 2654 2023 +2675 2651 2045 +2677 2655 2122 +2681 2656 2208 +2688 2660 2305 +2695 2666 2408 +2715 2678 2527 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2458 +2710 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +469 0 0 +469 0 0 +469 0 0 +469 0 0 +469 0 28 +469 0 152 +469 0 280 +469 0 408 +469 0 537 +469 0 667 +469 0 797 +469 0 928 +404 0 1088 +100 0 1333 +100 0 1501 +408 0 1634 +813 0 1779 +1202 0 1887 +1561 0 2010 +1542 61 2164 +352 987 2341 +1276 570 2469 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +1737 0 2503 +462 0 0 +465 0 0 +465 0 0 +465 0 0 +465 0 36 +465 0 159 +465 0 285 +465 0 412 +465 0 540 +465 0 669 +465 0 799 +465 0 930 +393 0 1089 +76 0 1333 +76 0 1501 +412 0 1635 +805 0 1779 +1201 0 1887 +1561 0 2011 +1541 86 2164 +352 992 2341 +1280 573 2469 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +453 0 0 +456 0 0 +461 0 0 +461 0 0 +461 0 48 +461 0 168 +461 0 291 +461 0 417 +461 0 544 +461 0 672 +461 0 801 +461 0 931 +387 0 1090 +43 0 1334 +43 0 1501 +417 0 1635 +793 0 1778 +1200 0 1888 +1560 0 2011 +1539 116 2164 +352 998 2341 +1285 577 2469 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +1736 0 2503 +440 0 0 +444 0 0 +448 0 0 +455 0 0 +455 0 63 +455 0 180 +455 0 300 +455 0 424 +455 0 549 +455 0 676 +455 0 804 +455 0 933 +380 0 1091 +0 0 1335 +0 0 1502 +424 0 1636 +778 0 1778 +1199 0 1889 +1560 0 2012 +1537 154 2164 +352 1005 2342 +1292 582 2469 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +1736 0 2504 +422 0 0 +426 0 0 +431 0 0 +437 0 0 +446 0 83 +446 0 195 +446 0 312 +446 0 433 +446 0 556 +446 0 681 +446 0 808 +446 0 936 +370 0 1093 +0 0 1336 +0 0 1503 +433 0 1637 +757 0 1778 +1197 0 1889 +1559 0 2013 +1534 201 2165 +352 1015 2342 +1302 588 2469 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +1735 0 2504 +397 0 0 +401 0 0 +406 0 0 +413 0 0 +422 0 83 +434 0 215 +434 0 327 +434 0 444 +434 0 564 +434 0 688 +434 0 813 +434 0 940 +356 0 1096 +0 30 1338 +0 30 1504 +444 0 1639 +726 0 1777 +1195 0 1890 +1558 0 2015 +1530 256 2165 +352 1028 2343 +1314 596 2469 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +1735 30 2504 +362 4 0 +366 0 0 +371 0 0 +379 0 0 +389 0 83 +402 0 215 +418 0 347 +418 0 459 +418 0 576 +418 0 697 +418 0 820 +418 0 946 +337 0 1100 +0 163 1340 +0 163 1505 +459 32 1641 +682 0 1776 +1192 0 1891 +1557 32 2017 +1524 322 2166 +352 1045 2344 +1329 607 2469 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +1734 163 2504 +309 144 0 +314 137 0 +320 127 0 +329 114 0 +340 96 83 +354 70 215 +373 34 347 +396 0 479 +396 0 591 +396 0 708 +396 0 829 +396 0 952 +310 52 1105 +0 295 1343 +0 295 1507 +479 164 1644 +615 0 1775 +1188 0 1893 +1555 164 2019 +1516 396 2167 +352 1066 2345 +1349 621 2469 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +1732 295 2505 +309 281 0 +314 276 0 +320 269 0 +329 259 0 +340 246 83 +354 227 215 +373 202 347 +396 166 479 +396 257 648 +396 257 752 +396 257 863 +396 257 978 +310 298 1124 +0 426 1354 +0 426 1515 +479 333 1648 +652 0 1779 +1183 111 1897 +1538 296 2024 +1489 550 2172 +317 1093 2347 +1385 639 2469 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +309 417 0 +314 413 0 +320 408 0 +329 401 0 +340 391 83 +354 378 215 +373 360 347 +396 334 479 +396 399 648 +396 474 805 +396 474 905 +396 474 1011 +310 500 1148 +0 570 1369 +0 559 1526 +479 490 1653 +655 270 1784 +1176 244 1901 +1514 428 2029 +1450 699 2178 +265 1128 2349 +1430 662 2469 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +309 552 0 +314 549 0 +320 545 0 +329 540 0 +340 533 83 +354 523 215 +373 510 347 +396 492 479 +396 539 648 +396 595 805 +396 661 955 +396 661 1052 +310 678 1178 +0 726 1388 +0 691 1539 +479 640 1662 +655 494 1789 +1191 422 1907 +1480 560 2037 +1393 842 2187 +186 1169 2352 +1483 691 2469 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +309 686 0 +314 684 0 +320 681 0 +329 677 0 +340 672 83 +354 665 215 +373 655 347 +396 643 479 +396 677 648 +396 719 805 +396 770 955 +396 830 1101 +310 842 1216 +0 876 1412 +0 823 1557 +479 786 1675 +655 684 1796 +1216 593 1915 +1430 692 2047 +1302 983 2199 +0 1212 2357 +1546 728 2469 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +313 854 85 +295 854 130 +302 852 185 +310 850 248 +322 846 322 +336 841 404 +356 835 496 +380 826 594 +380 849 730 +380 878 865 +380 915 1000 +380 960 1133 +426 1005 1267 +0 1029 1446 +0 983 1581 +504 947 1697 +664 894 1810 +1232 800 1928 +1359 849 2059 +1164 1123 2212 +0 1254 2365 +1607 800 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +579 1156 985 +568 1156 992 +553 1156 1001 +532 1156 1012 +503 1156 1027 +461 1156 1045 +397 1156 1069 +295 1156 1099 +295 1156 1125 +295 1161 1168 +295 1181 1242 +295 1207 1325 +350 1233 1417 +549 1224 1507 +549 1195 1627 +610 1196 1748 +721 1200 1858 +1128 1147 1966 +1243 1131 2078 +1031 1271 2227 +827 1290 2369 +1605 1012 2470 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +1776 1112 2512 +579 1405 1359 +568 1405 1361 +553 1405 1365 +532 1405 1370 +503 1405 1377 +461 1405 1386 +397 1405 1397 +295 1405 1412 +295 1405 1425 +295 1405 1442 +295 1405 1463 +295 1405 1491 +350 1416 1546 +549 1410 1615 +549 1390 1682 +610 1395 1793 +721 1413 1898 +1134 1362 2004 +1151 1350 2108 +878 1405 2243 +927 1369 2376 +1617 1196 2472 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1809 1292 2510 +1091 1568 1658 +1091 1569 1659 +1089 1569 1660 +1088 1569 1661 +1086 1570 1663 +1083 1571 1665 +1079 1572 1668 +1074 1574 1673 +1074 1572 1680 +1074 1569 1690 +1074 1567 1702 +1074 1567 1718 +1060 1567 1740 +984 1571 1781 +984 1563 1832 +1008 1552 1891 +990 1557 1977 +1050 1536 2065 +1008 1537 2170 +810 1530 2268 +1184 1494 2382 +1680 1435 2473 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1842 1464 2509 +1472 1701 1853 +1471 1701 1854 +1469 1702 1855 +1467 1702 1856 +1464 1703 1858 +1461 1703 1861 +1456 1704 1864 +1449 1705 1868 +1443 1705 1873 +1442 1703 1880 +1442 1700 1888 +1442 1696 1899 +1439 1691 1913 +1417 1685 1933 +1417 1696 1979 +1379 1697 2020 +1390 1690 2066 +1256 1672 2126 +1172 1682 2221 +1227 1647 2296 +1526 1636 2386 +1786 1634 2474 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1899 1624 2511 +1800 1814 1976 +1800 1814 1976 +1799 1814 1977 +1799 1814 1978 +1797 1814 1979 +1796 1814 1981 +1795 1814 1983 +1793 1814 1986 +1794 1814 1988 +1796 1814 1992 +1792 1814 1998 +1785 1814 2007 +1776 1815 2018 +1760 1821 2034 +1741 1815 2050 +1739 1806 2078 +1704 1816 2125 +1714 1805 2166 +1662 1793 2234 +1683 1796 2305 +1765 1797 2390 +1871 1786 2475 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1971 1800 2514 +1965 1958 2031 +1965 1958 2031 +1964 1958 2031 +1964 1958 2032 +1963 1958 2032 +1962 1958 2034 +1961 1958 2035 +1960 1958 2037 +1959 1958 2039 +1958 1958 2042 +1956 1958 2047 +1953 1958 2053 +1951 1958 2060 +1944 1960 2068 +1938 1965 2081 +1932 1967 2110 +1924 1968 2156 +1905 1961 2189 +1920 1966 2240 +1890 1966 2318 +1932 1954 2393 +2043 1964 2481 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2101 1966 2516 +2121 2121 2069 +2121 2121 2070 +2121 2121 2070 +2122 2121 2070 +2122 2121 2070 +2122 2121 2071 +2122 2121 2071 +2123 2121 2071 +2123 2122 2074 +2123 2122 2077 +2123 2124 2081 +2123 2125 2086 +2122 2127 2093 +2119 2127 2101 +2119 2127 2110 +2119 2131 2131 +2114 2135 2167 +2107 2129 2205 +2112 2133 2255 +2123 2133 2316 +2148 2132 2397 +2215 2145 2485 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2260 2159 2523 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2371 2355 2126 +2371 2355 2127 +2371 2356 2129 +2370 2356 2131 +2369 2357 2133 +2369 2358 2137 +2370 2359 2143 +2370 2358 2146 +2369 2356 2148 +2369 2358 2161 +2372 2358 2193 +2371 2358 2227 +2375 2356 2273 +2387 2359 2337 +2411 2367 2406 +2465 2384 2499 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2496 2391 2531 +2681 2655 1963 +2681 2655 1963 +2681 2655 1964 +2681 2655 1965 +2681 2655 1967 +2681 2655 1969 +2681 2656 1972 +2681 2656 1975 +2681 2656 1974 +2681 2656 1973 +2680 2655 1971 +2680 2655 1969 +2679 2654 1969 +2679 2655 1990 +2678 2657 2010 +2677 2655 2027 +2675 2651 2050 +2677 2656 2121 +2681 2656 2208 +2688 2660 2305 +2695 2665 2407 +2715 2678 2527 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2723 2684 2576 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2431 +2713 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2768 2439 +2714 2769 2444 +2711 2772 2460 +2711 2773 2482 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2722 2784 2693 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +603 0 0 +603 0 0 +603 0 0 +603 0 0 +603 0 28 +603 0 152 +603 0 280 +603 0 408 +603 0 537 +603 0 667 +603 0 797 +603 0 928 +556 0 1088 +249 0 1348 +249 0 1511 +537 0 1634 +912 0 1782 +1222 0 1890 +1561 0 2012 +1535 174 2167 +317 987 2341 +1325 528 2469 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +598 0 0 +601 0 0 +601 0 0 +601 0 0 +601 0 36 +601 0 159 +601 0 285 +601 0 412 +601 0 540 +601 0 669 +601 0 799 +601 0 930 +548 0 1089 +232 0 1349 +232 0 1511 +540 0 1635 +906 0 1782 +1221 0 1890 +1561 0 2013 +1534 193 2167 +317 992 2341 +1328 531 2469 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +591 0 0 +594 0 0 +597 0 0 +597 0 0 +597 0 48 +597 0 168 +597 0 291 +597 0 417 +597 0 544 +597 0 672 +597 0 801 +597 0 931 +544 0 1090 +208 0 1349 +208 0 1512 +544 0 1635 +897 0 1781 +1221 0 1891 +1560 0 2013 +1532 217 2168 +317 998 2341 +1333 535 2469 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +1738 0 2504 +582 0 0 +585 0 0 +588 0 0 +593 0 0 +593 0 63 +593 0 180 +593 0 300 +593 0 424 +593 0 549 +593 0 676 +593 0 804 +593 0 933 +539 0 1091 +175 0 1351 +175 0 1512 +549 0 1636 +884 0 1781 +1220 0 1891 +1560 0 2014 +1530 248 2168 +317 1005 2342 +1339 540 2469 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +569 0 0 +572 0 0 +575 0 0 +580 0 0 +586 0 83 +586 0 195 +586 0 312 +586 0 433 +586 0 556 +586 0 681 +586 0 808 +586 0 936 +532 0 1093 +125 0 1352 +125 0 1513 +556 0 1637 +867 0 1781 +1218 0 1891 +1559 0 2015 +1526 286 2168 +317 1015 2342 +1348 547 2469 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +1737 0 2504 +551 0 0 +554 0 0 +558 0 0 +563 0 0 +569 0 83 +578 0 215 +578 0 327 +578 0 444 +578 0 564 +578 0 688 +578 0 813 +578 0 940 +522 0 1096 +50 30 1353 +50 30 1514 +564 0 1639 +844 0 1780 +1216 0 1893 +1558 0 2017 +1522 333 2169 +317 1028 2343 +1359 556 2469 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +1736 30 2504 +526 4 0 +529 0 0 +533 0 0 +538 0 0 +545 0 83 +554 0 215 +566 0 347 +566 0 459 +566 0 576 +566 0 697 +566 0 820 +566 0 946 +509 0 1100 +0 163 1355 +0 163 1516 +576 32 1641 +810 0 1779 +1213 0 1894 +1557 32 2019 +1516 388 2170 +317 1045 2344 +1373 568 2469 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +1735 163 2505 +490 144 0 +494 137 0 +498 127 0 +504 114 0 +511 96 83 +521 70 215 +534 34 347 +550 0 479 +550 0 591 +550 0 708 +550 0 829 +550 0 952 +491 52 1105 +0 295 1358 +0 295 1518 +591 164 1644 +761 0 1778 +1209 0 1896 +1555 164 2021 +1508 454 2170 +317 1066 2345 +1391 584 2469 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +1734 295 2505 +438 281 0 +441 276 0 +446 269 0 +452 259 0 +461 246 83 +472 227 215 +486 202 347 +505 166 479 +528 111 611 +528 111 723 +528 111 840 +528 111 961 +465 167 1111 +0 426 1362 +0 426 1520 +611 296 1648 +685 0 1777 +1204 111 1898 +1552 296 2024 +1498 528 2172 +317 1093 2347 +1405 655 2469 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +1732 426 2506 +438 417 0 +441 413 0 +446 408 0 +452 401 0 +461 391 83 +472 378 215 +486 360 347 +505 334 479 +528 298 611 +528 390 780 +528 390 884 +528 390 995 +465 420 1136 +0 570 1376 +0 559 1531 +611 465 1653 +688 180 1781 +1197 244 1902 +1529 428 2030 +1459 683 2178 +265 1128 2349 +1448 678 2469 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +438 552 0 +441 549 0 +446 545 0 +452 540 0 +461 533 83 +472 523 215 +486 510 347 +505 492 479 +528 466 611 +528 532 780 +528 606 937 +528 606 1037 +465 626 1167 +0 726 1395 +0 691 1544 +611 622 1662 +688 441 1786 +1211 422 1908 +1496 560 2038 +1403 831 2187 +186 1169 2352 +1499 706 2469 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +438 686 0 +441 684 0 +446 681 0 +452 677 0 +461 672 83 +472 665 215 +486 655 347 +505 643 479 +528 624 611 +528 671 780 +528 728 937 +528 793 1088 +465 806 1206 +0 876 1419 +0 823 1561 +611 773 1675 +688 651 1793 +1235 593 1916 +1448 692 2048 +1314 975 2199 +0 1212 2357 +1560 742 2469 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +441 854 85 +427 854 130 +432 852 185 +438 850 248 +447 846 322 +458 841 404 +473 835 496 +492 826 594 +516 814 700 +516 845 843 +516 884 983 +516 932 1121 +551 980 1257 +0 1029 1452 +0 983 1586 +630 938 1697 +697 873 1807 +1251 800 1930 +1381 849 2060 +1181 1116 2212 +0 1254 2365 +1619 811 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +719 1144 968 +711 1144 975 +700 1144 984 +685 1144 996 +664 1144 1011 +635 1144 1030 +592 1144 1055 +529 1144 1086 +426 1144 1125 +426 1150 1168 +426 1170 1242 +426 1196 1325 +469 1224 1417 +681 1219 1512 +681 1190 1631 +741 1186 1751 +750 1205 1859 +1158 1153 1968 +1243 1131 2078 +1031 1271 2228 +914 1282 2369 +1608 1020 2470 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +1781 1099 2512 +719 1398 1351 +711 1398 1354 +700 1398 1358 +685 1398 1363 +664 1398 1370 +635 1398 1379 +592 1398 1390 +529 1398 1406 +426 1398 1425 +426 1398 1442 +426 1398 1463 +426 1398 1491 +469 1409 1546 +681 1406 1619 +681 1387 1686 +741 1388 1796 +750 1416 1900 +1164 1366 2006 +1151 1350 2107 +878 1405 2243 +998 1362 2375 +1620 1201 2472 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1813 1283 2510 +1148 1563 1662 +1147 1564 1663 +1146 1564 1663 +1145 1565 1665 +1143 1565 1667 +1140 1566 1669 +1137 1568 1672 +1133 1569 1676 +1126 1572 1682 +1126 1569 1691 +1126 1567 1704 +1126 1567 1720 +1114 1567 1742 +1017 1569 1778 +1017 1561 1829 +1046 1552 1893 +1045 1557 1979 +1092 1536 2064 +1032 1537 2170 +810 1533 2268 +1205 1491 2382 +1680 1432 2474 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1841 1461 2509 +1481 1699 1851 +1480 1700 1852 +1478 1700 1853 +1476 1700 1855 +1473 1701 1857 +1470 1702 1859 +1465 1703 1863 +1458 1704 1867 +1449 1705 1873 +1448 1703 1880 +1448 1700 1888 +1448 1696 1899 +1445 1691 1913 +1423 1685 1934 +1423 1696 1979 +1383 1695 2019 +1396 1691 2067 +1278 1672 2126 +1188 1684 2221 +1246 1647 2296 +1529 1638 2386 +1793 1636 2474 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1901 1622 2511 +1805 1813 1975 +1805 1813 1975 +1805 1813 1976 +1804 1813 1977 +1803 1813 1978 +1802 1813 1979 +1800 1813 1982 +1798 1813 1984 +1796 1813 1988 +1797 1813 1992 +1793 1813 1998 +1787 1813 2007 +1777 1813 2018 +1763 1819 2033 +1745 1813 2049 +1744 1807 2077 +1710 1816 2126 +1718 1804 2166 +1664 1793 2234 +1690 1798 2306 +1770 1797 2390 +1871 1786 2475 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1974 1800 2514 +1968 1958 2031 +1968 1958 2031 +1967 1958 2032 +1967 1958 2032 +1966 1958 2033 +1965 1958 2034 +1964 1958 2036 +1963 1958 2038 +1961 1958 2040 +1960 1958 2043 +1958 1958 2048 +1955 1958 2054 +1953 1958 2061 +1945 1959 2068 +1939 1964 2081 +1934 1966 2107 +1928 1969 2157 +1905 1959 2189 +1920 1965 2239 +1893 1965 2317 +1933 1954 2393 +2043 1964 2481 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2104 1965 2515 +2122 2122 2070 +2122 2122 2070 +2122 2122 2071 +2122 2122 2071 +2122 2122 2071 +2123 2122 2071 +2123 2122 2072 +2124 2122 2072 +2124 2122 2073 +2124 2122 2076 +2124 2124 2080 +2124 2125 2086 +2124 2127 2093 +2119 2127 2101 +2119 2127 2110 +2120 2131 2130 +2116 2135 2169 +2108 2128 2204 +2113 2132 2254 +2124 2133 2316 +2148 2133 2397 +2216 2146 2485 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2260 2159 2522 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2371 2355 2126 +2371 2355 2127 +2371 2355 2129 +2371 2356 2131 +2370 2357 2133 +2370 2357 2137 +2371 2358 2143 +2370 2358 2146 +2369 2356 2148 +2370 2358 2161 +2373 2358 2193 +2372 2358 2227 +2376 2357 2273 +2388 2360 2337 +2411 2367 2406 +2465 2385 2499 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2680 2654 1962 +2680 2655 1962 +2681 2655 1963 +2681 2655 1964 +2681 2655 1966 +2681 2655 1968 +2681 2656 1970 +2681 2656 1974 +2681 2656 1972 +2681 2655 1970 +2680 2655 1969 +2680 2654 1966 +2679 2654 1967 +2679 2655 1987 +2677 2657 2008 +2677 2656 2029 +2675 2652 2050 +2677 2656 2121 +2681 2656 2208 +2688 2660 2306 +2695 2665 2407 +2715 2678 2527 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2771 2430 +2713 2771 2430 +2713 2771 2430 +2714 2771 2430 +2714 2771 2431 +2714 2771 2431 +2714 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2431 +2715 2771 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2711 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2694 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +737 0 0 +737 0 0 +737 0 0 +737 0 0 +737 0 28 +737 0 152 +737 0 280 +737 0 408 +737 0 537 +737 0 667 +737 0 797 +737 0 928 +703 0 1088 +438 0 1361 +394 0 1525 +667 0 1634 +977 0 1782 +1248 0 1893 +1561 0 2015 +1525 291 2172 +265 987 2341 +1385 462 2468 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +734 0 0 +736 0 0 +736 0 0 +736 0 0 +736 0 36 +736 0 159 +736 0 285 +736 0 412 +736 0 540 +736 0 669 +736 0 799 +736 0 930 +697 0 1089 +427 0 1361 +381 0 1525 +669 0 1635 +971 0 1782 +1248 0 1893 +1561 0 2015 +1524 306 2173 +265 992 2341 +1388 465 2468 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +729 0 0 +730 0 0 +733 0 0 +733 0 0 +733 0 48 +733 0 168 +733 0 291 +733 0 417 +733 0 544 +733 0 672 +733 0 801 +733 0 931 +694 0 1090 +412 0 1362 +365 0 1526 +672 0 1635 +963 0 1782 +1247 0 1894 +1560 0 2016 +1522 325 2173 +265 998 2341 +1392 470 2468 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +1740 0 2504 +722 0 0 +723 0 0 +726 0 0 +730 0 0 +730 0 63 +730 0 180 +730 0 300 +730 0 424 +730 0 549 +730 0 676 +730 0 804 +730 0 933 +690 0 1091 +391 0 1363 +341 0 1526 +676 0 1636 +953 0 1781 +1245 0 1894 +1560 0 2017 +1519 349 2173 +265 1005 2342 +1398 476 2468 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +1739 0 2504 +712 0 0 +714 0 0 +717 0 0 +720 0 0 +725 0 83 +725 0 195 +725 0 312 +725 0 433 +725 0 556 +725 0 681 +725 0 808 +725 0 936 +685 0 1093 +361 0 1364 +307 0 1527 +681 0 1637 +939 0 1781 +1244 0 1895 +1559 0 2018 +1516 380 2173 +265 1015 2342 +1405 484 2468 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +1739 0 2505 +699 0 0 +701 0 0 +704 0 0 +708 0 0 +712 0 83 +719 0 215 +719 0 327 +719 0 444 +719 0 564 +719 0 688 +719 0 813 +719 0 940 +678 0 1096 +317 30 1365 +258 30 1528 +688 0 1639 +918 0 1780 +1242 0 1896 +1558 0 2019 +1512 419 2174 +265 1028 2343 +1415 494 2468 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +1738 30 2505 +681 4 0 +683 0 0 +686 0 0 +690 0 0 +695 0 83 +702 0 215 +710 0 347 +710 0 459 +710 0 576 +710 0 697 +710 0 820 +710 0 946 +669 0 1100 +251 163 1367 +182 163 1530 +697 32 1641 +890 0 1779 +1239 0 1897 +1557 32 2021 +1506 465 2175 +265 1045 2344 +1427 508 2468 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +1737 163 2505 +656 144 0 +658 137 0 +661 127 0 +665 114 0 +670 96 83 +678 70 215 +686 34 347 +699 0 479 +699 0 591 +699 0 708 +699 0 829 +699 0 952 +656 52 1105 +145 295 1370 +56 295 1531 +708 164 1644 +849 0 1778 +1236 0 1899 +1555 164 2023 +1498 521 2175 +265 1066 2345 +1443 526 2468 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +1736 295 2505 +620 281 0 +623 276 0 +626 269 0 +630 259 0 +636 246 83 +643 227 215 +653 202 347 +666 166 479 +683 111 611 +683 111 723 +683 111 840 +683 111 961 +639 167 1111 +0 426 1374 +0 426 1534 +723 296 1648 +788 0 1777 +1231 111 1901 +1552 296 2027 +1487 586 2177 +265 1093 2347 +1456 606 2469 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +1735 426 2506 +567 417 0 +570 413 0 +573 408 0 +578 401 0 +585 391 83 +593 378 215 +604 360 347 +618 334 479 +637 298 611 +660 244 743 +660 244 856 +660 244 973 +614 286 1119 +0 536 1379 +0 559 1537 +743 428 1653 +797 104 1780 +1224 244 1904 +1549 428 2031 +1472 660 2178 +265 1128 2349 +1472 699 2469 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +1732 559 2507 +567 552 0 +570 549 0 +573 545 0 +578 540 0 +585 533 83 +593 523 215 +604 510 347 +618 492 479 +637 466 611 +660 430 743 +660 521 912 +660 521 1017 +614 545 1152 +0 703 1397 +0 691 1550 +743 597 1662 +797 399 1786 +1238 422 1910 +1518 560 2039 +1417 815 2187 +186 1169 2352 +1521 727 2469 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +567 686 0 +570 684 0 +573 681 0 +578 677 0 +585 672 83 +593 665 215 +604 655 347 +618 643 479 +637 624 611 +660 599 743 +660 664 912 +660 739 1070 +614 754 1192 +0 860 1421 +0 823 1568 +743 755 1675 +797 625 1792 +1261 593 1918 +1472 692 2049 +1331 963 2199 +0 1212 2357 +1579 761 2469 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +569 854 85 +559 854 130 +563 852 185 +568 850 248 +574 846 322 +583 841 404 +594 835 496 +608 826 594 +627 814 700 +651 797 811 +651 841 960 +651 893 1104 +678 945 1245 +0 1017 1454 +0 983 1592 +758 925 1697 +804 857 1807 +1275 800 1931 +1408 849 2061 +1203 1108 2212 +0 1254 2365 +1635 828 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +834 1134 954 +827 1134 961 +819 1134 970 +808 1134 982 +792 1134 998 +770 1134 1018 +739 1134 1043 +693 1134 1075 +625 1134 1115 +570 1131 1163 +570 1152 1237 +570 1179 1321 +601 1208 1413 +800 1208 1514 +767 1185 1636 +863 1174 1754 +863 1195 1861 +1192 1157 1970 +1257 1131 2078 +1043 1269 2229 +975 1275 2368 +1616 1030 2470 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +857 1389 1341 +851 1389 1344 +843 1389 1348 +832 1389 1353 +817 1389 1360 +797 1389 1369 +767 1389 1381 +725 1389 1397 +661 1389 1417 +559 1389 1442 +559 1389 1463 +559 1389 1491 +591 1400 1546 +794 1400 1623 +813 1382 1691 +874 1379 1799 +874 1408 1902 +1201 1371 2008 +1151 1350 2106 +878 1405 2245 +1078 1352 2375 +1623 1208 2472 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1819 1270 2510 +1214 1557 1667 +1213 1557 1668 +1212 1558 1669 +1211 1558 1670 +1209 1559 1672 +1207 1560 1674 +1205 1561 1677 +1201 1563 1681 +1195 1565 1686 +1188 1569 1694 +1188 1567 1706 +1188 1567 1722 +1177 1567 1744 +1072 1567 1776 +1057 1558 1825 +1094 1552 1894 +1094 1557 1981 +1142 1536 2063 +1061 1537 2170 +810 1536 2268 +1232 1487 2382 +1680 1427 2474 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1839 1457 2509 +1512 1695 1855 +1511 1695 1855 +1510 1695 1856 +1508 1696 1858 +1505 1696 1860 +1502 1697 1862 +1497 1698 1866 +1491 1699 1870 +1482 1701 1876 +1478 1703 1881 +1478 1700 1889 +1478 1696 1900 +1475 1691 1914 +1446 1684 1934 +1440 1693 1977 +1405 1695 2020 +1418 1691 2069 +1312 1672 2125 +1209 1684 2221 +1248 1649 2296 +1541 1636 2386 +1794 1633 2475 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1900 1619 2511 +1813 1811 1973 +1812 1811 1974 +1812 1811 1975 +1811 1811 1976 +1810 1811 1977 +1809 1811 1978 +1808 1811 1981 +1806 1811 1983 +1803 1811 1987 +1799 1811 1992 +1795 1811 1998 +1789 1811 2007 +1779 1812 2018 +1767 1817 2033 +1749 1812 2048 +1751 1809 2076 +1717 1818 2125 +1722 1802 2166 +1667 1793 2234 +1699 1800 2306 +1776 1797 2391 +1871 1786 2475 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1978 1800 2515 +1972 1958 2032 +1972 1958 2033 +1971 1958 2033 +1971 1958 2034 +1970 1958 2034 +1969 1958 2036 +1968 1958 2037 +1967 1958 2039 +1965 1958 2041 +1962 1958 2045 +1961 1958 2049 +1958 1958 2055 +1955 1958 2062 +1947 1958 2069 +1940 1963 2081 +1937 1965 2105 +1931 1968 2155 +1905 1958 2189 +1920 1964 2238 +1898 1964 2316 +1934 1954 2393 +2043 1964 2481 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2108 1964 2515 +2123 2122 2071 +2123 2122 2071 +2123 2122 2071 +2123 2122 2072 +2124 2122 2072 +2124 2122 2072 +2124 2122 2073 +2125 2122 2073 +2125 2122 2074 +2126 2122 2075 +2126 2124 2079 +2126 2125 2085 +2125 2127 2092 +2119 2127 2101 +2119 2127 2110 +2122 2131 2129 +2118 2135 2168 +2110 2127 2203 +2114 2132 2254 +2126 2132 2316 +2148 2134 2399 +2218 2147 2485 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2259 2159 2522 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2371 2355 2126 +2371 2355 2127 +2371 2355 2129 +2372 2355 2131 +2371 2356 2133 +2372 2357 2137 +2372 2358 2143 +2371 2358 2146 +2369 2356 2148 +2370 2358 2160 +2373 2358 2193 +2373 2358 2228 +2377 2357 2273 +2391 2362 2337 +2412 2367 2407 +2466 2386 2499 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2496 2392 2532 +2680 2654 1961 +2680 2654 1961 +2680 2654 1962 +2680 2654 1963 +2680 2655 1965 +2680 2655 1966 +2681 2655 1969 +2681 2656 1973 +2681 2655 1970 +2680 2654 1966 +2680 2654 1965 +2679 2653 1962 +2679 2653 1963 +2678 2655 1982 +2677 2657 2003 +2678 2657 2033 +2676 2653 2053 +2678 2656 2122 +2681 2656 2208 +2688 2660 2306 +2695 2665 2407 +2715 2678 2527 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2724 2684 2577 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2714 2770 2431 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2715 2770 2435 +2716 2769 2439 +2714 2769 2444 +2711 2772 2462 +2712 2773 2481 +2714 2774 2521 +2713 2773 2553 +2717 2777 2616 +2723 2785 2695 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +871 0 0 +871 0 0 +871 0 0 +871 0 0 +871 0 28 +871 0 152 +871 0 280 +871 0 408 +871 0 537 +871 0 667 +871 0 797 +871 0 928 +845 0 1088 +668 0 1361 +535 0 1543 +769 0 1643 +1048 0 1782 +1313 0 1897 +1561 0 2018 +1511 412 2179 +186 987 2341 +1454 356 2467 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +868 0 0 +869 0 0 +869 0 0 +869 0 0 +869 0 36 +869 0 159 +869 0 285 +869 0 412 +869 0 540 +869 0 669 +869 0 799 +869 0 930 +841 0 1089 +662 0 1361 +526 0 1543 +770 0 1643 +1043 0 1782 +1313 0 1897 +1561 0 2018 +1510 423 2179 +186 992 2341 +1457 360 2467 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +864 0 0 +866 0 0 +868 0 0 +868 0 0 +868 0 48 +868 0 168 +868 0 291 +868 0 417 +868 0 544 +868 0 672 +868 0 801 +868 0 931 +839 0 1090 +653 0 1362 +513 0 1544 +773 0 1644 +1036 0 1782 +1312 0 1897 +1560 0 2019 +1508 438 2179 +186 998 2341 +1461 366 2467 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +1743 0 2505 +859 0 0 +861 0 0 +862 0 0 +865 0 0 +865 0 63 +865 0 180 +865 0 300 +865 0 424 +865 0 549 +865 0 676 +865 0 804 +865 0 933 +836 0 1091 +640 0 1363 +496 0 1544 +776 0 1645 +1027 0 1781 +1311 0 1898 +1560 0 2020 +1505 457 2180 +186 1005 2342 +1465 373 2467 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +852 0 0 +854 0 0 +856 0 0 +858 0 0 +862 0 83 +862 0 195 +862 0 312 +862 0 433 +862 0 556 +862 0 681 +862 0 808 +862 0 936 +833 0 1093 +623 0 1364 +473 0 1545 +780 0 1646 +1015 0 1781 +1310 0 1899 +1559 0 2021 +1502 482 2180 +186 1015 2342 +1472 383 2467 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +1742 0 2505 +843 0 0 +844 0 0 +846 0 0 +849 0 0 +852 0 83 +857 0 215 +857 0 327 +857 0 444 +857 0 564 +857 0 688 +857 0 813 +857 0 940 +827 0 1096 +599 30 1365 +439 30 1546 +785 0 1648 +998 0 1780 +1308 0 1900 +1558 0 2022 +1497 512 2180 +186 1028 2343 +1480 397 2467 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +1741 30 2505 +830 4 0 +831 0 0 +833 0 0 +836 0 0 +839 0 83 +844 0 215 +851 0 347 +851 0 459 +851 0 576 +851 0 697 +851 0 820 +851 0 946 +821 0 1100 +565 163 1367 +390 163 1547 +793 32 1650 +974 0 1779 +1306 0 1901 +1557 32 2024 +1491 551 2181 +186 1045 2344 +1491 413 2467 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +1740 163 2506 +812 144 0 +813 137 0 +815 127 0 +818 114 0 +822 96 83 +827 70 215 +834 34 347 +842 0 479 +842 0 591 +842 0 708 +842 0 829 +842 0 952 +812 52 1105 +515 295 1370 +314 295 1549 +802 164 1653 +940 0 1778 +1302 0 1903 +1555 164 2027 +1483 597 2182 +186 1066 2345 +1505 435 2467 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +1739 295 2506 +787 281 0 +788 276 0 +790 269 0 +793 259 0 +797 246 83 +803 227 215 +809 202 347 +819 166 479 +831 111 611 +831 111 723 +831 111 840 +831 111 961 +799 167 1111 +438 426 1374 +188 426 1552 +814 296 1657 +891 0 1777 +1298 111 1905 +1552 296 2030 +1472 653 2183 +186 1093 2347 +1516 532 2467 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +1738 426 2507 +750 417 0 +752 413 0 +755 408 0 +758 401 0 +762 391 83 +768 378 215 +775 360 347 +785 334 479 +798 298 611 +815 244 743 +815 244 856 +815 244 973 +782 286 1119 +345 536 1379 +0 559 1555 +831 428 1662 +899 104 1780 +1292 244 1908 +1549 428 2034 +1456 718 2185 +186 1128 2349 +1530 640 2468 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +1736 559 2508 +697 552 0 +699 549 0 +702 545 0 +705 540 0 +710 533 83 +717 523 215 +725 510 347 +736 492 479 +750 466 611 +769 430 743 +792 376 875 +792 376 988 +758 407 1131 +280 611 1385 +0 691 1559 +799 583 1666 +916 342 1786 +1257 324 1907 +1545 560 2040 +1434 792 2187 +186 1169 2352 +1547 752 2469 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +1732 691 2509 +697 686 0 +699 684 0 +702 681 0 +705 677 0 +710 672 83 +717 665 215 +725 655 347 +736 643 479 +750 624 611 +769 599 743 +792 562 875 +792 654 1044 +758 672 1172 +280 796 1409 +0 823 1576 +799 745 1680 +916 591 1792 +1279 529 1915 +1502 692 2050 +1352 947 2199 +0 1212 2357 +1603 785 2469 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +699 854 85 +691 854 130 +694 852 185 +698 850 248 +702 846 322 +709 841 404 +717 835 496 +728 826 594 +743 814 700 +762 797 811 +786 774 927 +786 834 1081 +805 893 1228 +403 973 1443 +0 983 1599 +812 918 1701 +921 837 1807 +1293 760 1928 +1442 849 2062 +1230 1096 2212 +0 1254 2365 +1657 848 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +910 1134 954 +905 1134 961 +898 1134 970 +889 1134 982 +875 1134 998 +857 1134 1018 +832 1134 1043 +795 1134 1075 +741 1134 1115 +699 1131 1163 +726 1120 1220 +726 1149 1307 +748 1179 1402 +901 1179 1504 +767 1185 1644 +906 1170 1757 +968 1186 1861 +1214 1140 1967 +1304 1131 2079 +1082 1261 2229 +975 1275 2368 +1638 1044 2470 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +993 1376 1327 +989 1376 1330 +983 1376 1334 +975 1376 1340 +964 1376 1347 +949 1376 1356 +928 1376 1368 +899 1376 1385 +857 1376 1405 +793 1376 1431 +691 1376 1463 +691 1376 1491 +715 1388 1546 +877 1388 1623 +945 1376 1697 +997 1370 1804 +1006 1396 1906 +1223 1377 2010 +1151 1350 2105 +878 1405 2247 +1167 1339 2373 +1626 1218 2473 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1826 1254 2510 +1284 1548 1666 +1284 1549 1666 +1283 1549 1667 +1282 1550 1668 +1281 1550 1670 +1279 1551 1673 +1276 1553 1675 +1273 1555 1680 +1269 1557 1685 +1263 1560 1692 +1239 1562 1707 +1239 1562 1723 +1229 1562 1745 +1136 1562 1777 +1127 1554 1826 +1162 1550 1897 +1168 1552 1984 +1181 1539 2065 +1075 1537 2169 +810 1538 2270 +1285 1479 2381 +1681 1429 2475 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1842 1448 2509 +1553 1689 1859 +1552 1689 1860 +1551 1689 1861 +1549 1690 1862 +1547 1690 1864 +1544 1691 1867 +1539 1692 1870 +1534 1693 1874 +1526 1695 1880 +1522 1697 1885 +1517 1700 1891 +1517 1696 1902 +1515 1691 1916 +1488 1684 1935 +1461 1690 1974 +1430 1693 2019 +1446 1691 2070 +1360 1672 2128 +1236 1684 2221 +1248 1653 2296 +1559 1632 2386 +1794 1630 2475 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1898 1615 2511 +1821 1809 1972 +1820 1809 1972 +1820 1809 1973 +1819 1809 1974 +1818 1809 1975 +1817 1809 1977 +1816 1809 1979 +1813 1809 1982 +1811 1809 1986 +1807 1809 1990 +1800 1811 1998 +1793 1811 2007 +1784 1811 2018 +1772 1817 2033 +1754 1811 2049 +1756 1809 2076 +1721 1816 2124 +1728 1804 2168 +1675 1795 2234 +1712 1800 2308 +1779 1799 2391 +1880 1789 2475 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1982 1798 2515 +1977 1958 2034 +1977 1958 2034 +1976 1958 2035 +1976 1958 2035 +1975 1958 2036 +1974 1958 2037 +1973 1958 2038 +1972 1958 2040 +1970 1958 2043 +1968 1958 2046 +1964 1958 2050 +1962 1958 2056 +1959 1958 2063 +1950 1958 2070 +1942 1961 2081 +1940 1963 2103 +1935 1966 2152 +1912 1959 2190 +1920 1962 2236 +1904 1962 2314 +1936 1954 2394 +2043 1964 2481 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2112 1962 2514 +2124 2124 2073 +2124 2124 2073 +2124 2124 2073 +2125 2124 2073 +2125 2124 2073 +2125 2124 2074 +2125 2124 2074 +2126 2124 2075 +2126 2124 2076 +2127 2124 2076 +2129 2124 2078 +2129 2125 2083 +2128 2127 2090 +2122 2127 2100 +2119 2127 2110 +2123 2131 2129 +2120 2135 2167 +2113 2128 2205 +2115 2130 2253 +2128 2131 2316 +2148 2135 2400 +2220 2148 2485 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2258 2159 2521 +2370 2355 2124 +2370 2355 2124 +2370 2355 2124 +2370 2355 2125 +2370 2355 2125 +2370 2355 2126 +2371 2355 2126 +2371 2355 2127 +2371 2355 2129 +2372 2355 2131 +2372 2355 2133 +2373 2356 2137 +2374 2357 2143 +2372 2357 2146 +2369 2356 2148 +2370 2358 2159 +2374 2358 2192 +2374 2358 2228 +2379 2358 2273 +2393 2364 2337 +2413 2367 2408 +2467 2387 2498 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2496 2393 2533 +2680 2654 1959 +2680 2654 1959 +2680 2654 1960 +2680 2654 1961 +2680 2654 1963 +2680 2655 1965 +2680 2655 1968 +2680 2655 1971 +2680 2655 1969 +2680 2654 1965 +2679 2653 1959 +2679 2652 1957 +2678 2652 1958 +2678 2654 1977 +2677 2657 1996 +2678 2657 2031 +2677 2654 2057 +2678 2657 2122 +2682 2656 2208 +2688 2660 2307 +2695 2665 2407 +2715 2678 2527 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2725 2684 2578 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2430 +2713 2770 2430 +2714 2770 2430 +2714 2770 2430 +2715 2770 2430 +2715 2770 2431 +2716 2770 2431 +2716 2770 2431 +2716 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2712 2773 2483 +2714 2775 2522 +2712 2773 2553 +2717 2777 2616 +2724 2786 2697 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +1004 0 0 +1004 0 0 +1004 0 0 +1004 0 0 +1004 0 28 +1004 0 152 +1004 0 280 +1004 0 408 +1004 0 537 +1004 0 667 +1004 0 797 +1004 0 928 +985 0 1088 +862 0 1361 +674 0 1566 +856 0 1661 +1128 0 1782 +1394 0 1902 +1561 0 2022 +1491 535 2188 +220 987 2343 +1533 158 2465 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1002 0 0 +1003 0 0 +1003 0 0 +1003 0 0 +1003 0 36 +1003 0 159 +1003 0 285 +1003 0 412 +1003 0 540 +1003 0 669 +1003 0 799 +1003 0 930 +982 0 1089 +858 0 1361 +667 0 1566 +858 0 1662 +1124 0 1782 +1393 0 1903 +1561 0 2022 +1490 544 2188 +220 992 2343 +1536 164 2465 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +999 0 0 +1000 0 0 +1002 0 0 +1002 0 0 +1002 0 48 +1002 0 168 +1002 0 291 +1002 0 417 +1002 0 544 +1002 0 672 +1002 0 801 +1002 0 931 +981 0 1090 +852 0 1362 +658 0 1567 +860 0 1662 +1118 0 1782 +1393 0 1903 +1560 0 2023 +1488 556 2188 +220 998 2343 +1539 173 2465 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +1747 0 2505 +996 0 0 +996 0 0 +998 0 0 +1000 0 0 +1000 0 63 +1000 0 180 +1000 0 300 +1000 0 424 +1000 0 549 +1000 0 676 +1000 0 804 +1000 0 933 +979 0 1091 +844 0 1363 +645 0 1567 +862 0 1663 +1110 0 1781 +1392 0 1903 +1560 0 2024 +1486 570 2188 +220 1005 2344 +1543 185 2465 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +1746 0 2505 +990 0 0 +991 0 0 +993 0 0 +995 0 0 +997 0 83 +997 0 195 +997 0 312 +997 0 433 +997 0 556 +997 0 681 +997 0 808 +997 0 936 +976 0 1093 +833 0 1364 +629 0 1568 +866 0 1664 +1100 0 1781 +1391 0 1904 +1559 0 2025 +1482 590 2189 +220 1015 2344 +1548 200 2465 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +1746 0 2506 +983 0 0 +985 0 0 +986 0 0 +988 0 0 +991 0 83 +994 0 215 +994 0 327 +994 0 444 +994 0 564 +994 0 688 +994 0 813 +994 0 940 +973 0 1096 +819 30 1365 +605 30 1569 +871 0 1666 +1086 0 1780 +1390 0 1905 +1558 0 2026 +1477 614 2189 +220 1028 2345 +1555 219 2465 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +1745 30 2506 +974 4 0 +975 0 0 +977 0 0 +979 0 0 +981 0 83 +985 0 215 +989 0 347 +989 0 459 +989 0 576 +989 0 697 +989 0 820 +989 0 946 +968 0 1100 +798 163 1367 +571 163 1570 +876 32 1668 +1067 0 1779 +1388 0 1906 +1557 32 2028 +1471 645 2190 +220 1045 2346 +1564 244 2465 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +1744 163 2506 +961 144 0 +962 137 0 +963 127 0 +966 114 0 +968 96 83 +972 70 215 +977 34 347 +983 0 479 +983 0 591 +983 0 708 +983 0 829 +983 0 952 +961 52 1105 +769 295 1370 +522 295 1572 +884 164 1671 +1039 0 1778 +1385 0 1908 +1555 164 2031 +1462 683 2191 +220 1066 2347 +1576 275 2465 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +1743 295 2507 +943 281 0 +944 276 0 +946 269 0 +948 259 0 +951 246 83 +955 227 215 +959 202 347 +966 166 479 +975 111 611 +975 111 723 +975 111 840 +975 111 961 +952 167 1111 +726 426 1374 +446 426 1574 +895 296 1674 +1000 0 1777 +1382 111 1910 +1552 296 2034 +1450 729 2192 +220 1093 2349 +1586 407 2466 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +1741 426 2508 +917 417 0 +919 413 0 +920 408 0 +923 401 0 +926 391 83 +930 378 215 +935 360 347 +942 334 479 +951 298 611 +963 244 743 +963 244 856 +963 244 973 +940 286 1119 +679 536 1379 +320 559 1577 +908 428 1679 +1006 104 1780 +1377 244 1913 +1549 428 2038 +1434 785 2194 +220 1128 2351 +1598 544 2467 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +1739 559 2508 +881 552 0 +883 549 0 +884 545 0 +887 540 0 +890 533 83 +894 523 215 +900 510 347 +908 492 479 +917 466 611 +930 430 743 +947 376 875 +947 376 988 +923 407 1131 +649 611 1385 +67 691 1581 +882 583 1684 +1020 342 1786 +1348 324 1912 +1545 560 2044 +1411 850 2196 +220 1169 2354 +1613 680 2468 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +1736 691 2509 +828 686 0 +829 684 0 +831 681 0 +834 677 0 +838 672 83 +842 665 215 +849 655 347 +857 643 479 +868 624 611 +883 599 743 +901 562 875 +925 508 1007 +899 532 1145 +605 694 1393 +0 823 1587 +799 745 1688 +1039 540 1792 +1299 403 1909 +1539 692 2052 +1379 925 2199 +0 1212 2357 +1633 815 2469 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +1732 823 2511 +829 854 85 +823 854 130 +825 852 185 +828 850 248 +832 846 322 +837 841 404 +843 835 496 +852 826 594 +863 814 700 +877 797 811 +896 774 927 +920 741 1047 +934 812 1203 +669 906 1428 +0 983 1610 +812 918 1709 +1043 809 1807 +1313 689 1923 +1484 849 2064 +1265 1080 2212 +0 1254 2365 +1683 875 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +996 1134 954 +992 1134 961 +986 1134 970 +979 1134 982 +968 1134 998 +953 1134 1018 +932 1134 1043 +903 1134 1075 +861 1134 1115 +829 1131 1163 +850 1120 1220 +876 1105 1286 +892 1138 1385 +1008 1138 1491 +767 1185 1653 +906 1170 1765 +1078 1173 1861 +1237 1110 1962 +1360 1131 2081 +1129 1250 2229 +975 1275 2368 +1666 1061 2470 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1129 1359 1308 +1126 1359 1311 +1121 1359 1315 +1115 1359 1321 +1107 1359 1328 +1097 1359 1338 +1082 1359 1351 +1061 1359 1367 +1032 1359 1389 +989 1359 1416 +926 1359 1449 +823 1359 1491 +841 1371 1546 +969 1371 1623 +1077 1367 1705 +1117 1361 1811 +1138 1380 1911 +1246 1386 2012 +1151 1350 2103 +878 1405 2249 +1204 1332 2374 +1631 1230 2474 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1835 1230 2510 +1361 1536 1656 +1360 1537 1657 +1360 1537 1658 +1359 1538 1659 +1358 1539 1661 +1356 1540 1663 +1354 1541 1667 +1351 1543 1671 +1347 1545 1676 +1342 1549 1684 +1323 1550 1699 +1283 1550 1723 +1274 1550 1745 +1190 1550 1777 +1220 1548 1833 +1249 1544 1903 +1265 1540 1988 +1206 1545 2067 +1075 1537 2167 +810 1538 2272 +1313 1474 2382 +1686 1437 2475 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1851 1433 2509 +1603 1680 1865 +1602 1680 1865 +1600 1680 1867 +1599 1681 1868 +1597 1681 1870 +1594 1682 1872 +1590 1683 1876 +1585 1684 1880 +1578 1686 1886 +1575 1689 1891 +1571 1692 1897 +1565 1696 1905 +1563 1691 1919 +1538 1684 1938 +1489 1686 1969 +1460 1689 2014 +1482 1691 2072 +1418 1672 2133 +1270 1684 2221 +1248 1657 2296 +1563 1627 2386 +1794 1625 2476 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1896 1610 2511 +1830 1805 1969 +1830 1805 1970 +1829 1805 1971 +1829 1805 1972 +1828 1805 1973 +1827 1805 1974 +1825 1805 1977 +1823 1805 1979 +1821 1805 1983 +1817 1805 1988 +1810 1807 1996 +1800 1811 2007 +1791 1811 2018 +1779 1817 2033 +1762 1811 2051 +1763 1809 2078 +1725 1813 2122 +1736 1807 2171 +1689 1798 2234 +1727 1800 2309 +1778 1800 2391 +1894 1792 2475 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1986 1795 2515 +1983 1958 2036 +1983 1958 2036 +1983 1958 2037 +1983 1958 2037 +1982 1958 2038 +1981 1958 2039 +1980 1958 2040 +1979 1958 2042 +1977 1958 2045 +1974 1958 2048 +1971 1958 2052 +1966 1958 2058 +1963 1958 2065 +1955 1958 2072 +1945 1959 2081 +1942 1961 2103 +1940 1963 2147 +1922 1962 2193 +1920 1960 2233 +1912 1960 2312 +1943 1954 2394 +2043 1964 2481 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2119 1960 2514 +2126 2125 2075 +2126 2125 2075 +2126 2125 2075 +2126 2125 2075 +2126 2125 2075 +2127 2125 2076 +2127 2125 2076 +2127 2125 2076 +2128 2125 2077 +2129 2125 2078 +2130 2125 2080 +2132 2125 2082 +2131 2127 2089 +2125 2127 2098 +2119 2127 2110 +2123 2131 2129 +2124 2135 2165 +2118 2130 2208 +2117 2129 2251 +2132 2129 2316 +2154 2135 2400 +2222 2149 2485 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2257 2159 2521 +2371 2355 2125 +2371 2355 2125 +2371 2355 2125 +2371 2355 2126 +2372 2355 2126 +2372 2355 2127 +2372 2355 2127 +2372 2355 2128 +2372 2355 2130 +2373 2355 2132 +2374 2355 2134 +2374 2355 2136 +2375 2356 2142 +2373 2356 2145 +2371 2355 2148 +2372 2357 2159 +2375 2358 2191 +2375 2358 2229 +2381 2358 2273 +2396 2366 2336 +2413 2367 2408 +2468 2388 2498 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2497 2394 2532 +2679 2653 1956 +2679 2653 1957 +2679 2653 1958 +2679 2654 1959 +2679 2654 1961 +2680 2654 1962 +2680 2654 1965 +2680 2655 1969 +2680 2654 1966 +2679 2653 1962 +2679 2652 1957 +2678 2651 1950 +2678 2650 1950 +2677 2652 1970 +2676 2657 1988 +2678 2657 2023 +2679 2655 2063 +2679 2657 2122 +2682 2656 2208 +2688 2660 2308 +2695 2665 2407 +2715 2678 2527 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2726 2684 2578 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2770 2428 +2712 2770 2429 +2712 2770 2429 +2712 2770 2429 +2713 2770 2429 +2713 2770 2429 +2713 2770 2429 +2714 2770 2429 +2714 2770 2430 +2715 2770 2430 +2716 2770 2431 +2717 2770 2431 +2717 2770 2432 +2716 2770 2435 +2716 2769 2439 +2714 2770 2444 +2711 2772 2462 +2713 2774 2488 +2714 2775 2522 +2712 2773 2553 +2717 2777 2617 +2724 2787 2699 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +1146 0 0 +1146 0 0 +1146 0 0 +1146 0 46 +1146 0 140 +1146 0 240 +1146 0 347 +1146 0 460 +1146 0 576 +1146 0 697 +1146 0 820 +1146 0 946 +1143 0 1084 +1060 0 1359 +918 0 1574 +981 0 1683 +1223 0 1785 +1476 0 1909 +1569 0 2028 +1478 645 2197 +391 989 2347 +1611 0 2464 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1146 0 0 +1146 0 0 +1146 0 27 +1146 0 101 +1146 0 185 +1146 0 277 +1146 0 376 +1146 0 482 +1146 0 594 +1146 0 710 +1146 0 830 +1146 0 953 +1142 0 1089 +1059 0 1361 +917 0 1576 +981 0 1683 +1223 0 1786 +1476 0 1910 +1569 0 2029 +1477 656 2197 +395 992 2347 +1611 0 2464 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1757 0 2506 +1143 0 0 +1143 0 0 +1144 0 38 +1144 0 111 +1144 0 193 +1144 0 284 +1144 0 382 +1144 0 487 +1144 0 598 +1144 0 713 +1144 0 833 +1144 0 955 +1141 0 1090 +1055 0 1362 +911 0 1576 +982 0 1684 +1219 0 1785 +1475 0 1911 +1568 0 2029 +1475 665 2197 +395 998 2347 +1614 0 2464 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1141 0 0 +1141 0 0 +1142 0 38 +1143 0 124 +1143 0 204 +1143 0 293 +1143 0 389 +1143 0 493 +1143 0 602 +1143 0 717 +1143 0 835 +1143 0 957 +1140 0 1091 +1050 0 1363 +904 0 1577 +984 0 1685 +1213 0 1785 +1474 0 1911 +1568 0 2030 +1472 676 2198 +395 1005 2348 +1617 0 2464 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1137 0 0 +1137 0 0 +1138 0 38 +1139 0 124 +1141 0 219 +1141 0 305 +1141 0 399 +1141 0 501 +1141 0 608 +1141 0 722 +1141 0 839 +1141 0 960 +1138 0 1093 +1043 0 1364 +895 0 1577 +987 0 1686 +1205 0 1784 +1474 0 1912 +1567 0 2031 +1469 692 2198 +395 1015 2348 +1622 0 2464 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1756 0 2506 +1132 0 0 +1132 0 0 +1133 0 38 +1134 0 124 +1136 0 219 +1139 0 320 +1139 0 411 +1139 0 511 +1139 0 616 +1139 0 728 +1139 0 844 +1139 0 963 +1136 0 1096 +1034 0 1365 +882 0 1578 +990 0 1687 +1194 0 1784 +1472 0 1913 +1566 0 2032 +1464 711 2199 +395 1028 2349 +1628 0 2464 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1755 0 2507 +1125 13 0 +1125 0 0 +1126 0 38 +1128 0 124 +1129 0 219 +1132 0 320 +1135 0 428 +1135 0 524 +1135 0 627 +1135 0 736 +1135 0 850 +1135 0 968 +1132 0 1100 +1021 107 1367 +864 107 1579 +995 0 1690 +1178 0 1783 +1471 0 1914 +1565 97 2034 +1457 736 2199 +395 1045 2350 +1636 0 2464 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1754 107 2507 +1116 150 0 +1116 137 0 +1117 127 38 +1118 114 124 +1120 96 219 +1123 70 320 +1126 34 428 +1131 0 541 +1131 0 640 +1131 0 747 +1131 0 858 +1131 0 975 +1128 0 1105 +1003 254 1370 +839 254 1581 +1001 137 1692 +1157 0 1782 +1469 17 1915 +1563 213 2037 +1448 768 2200 +395 1066 2351 +1646 21 2464 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1753 254 2507 +1103 286 0 +1103 276 0 +1104 269 38 +1106 259 124 +1108 246 219 +1110 227 320 +1114 202 428 +1118 166 541 +1125 111 658 +1125 111 760 +1125 111 869 +1125 111 983 +1121 111 1111 +979 396 1374 +803 396 1584 +1009 276 1696 +1127 0 1781 +1466 140 1918 +1560 333 2040 +1436 807 2201 +395 1093 2353 +1654 232 2464 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1751 396 2508 +1085 420 0 +1085 413 0 +1086 408 38 +1088 401 124 +1090 391 219 +1093 378 320 +1097 360 428 +1102 334 541 +1108 298 658 +1116 244 779 +1116 244 884 +1116 244 995 +1113 244 1119 +952 513 1379 +749 536 1587 +1019 413 1700 +1132 186 1784 +1462 265 1920 +1557 456 2044 +1419 854 2202 +395 1128 2355 +1664 421 2465 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1749 536 2509 +1061 554 0 +1061 549 0 +1062 545 38 +1064 540 124 +1066 533 219 +1069 523 320 +1073 510 428 +1078 492 541 +1085 466 658 +1093 430 779 +1105 376 902 +1105 376 1009 +1102 376 1131 +936 591 1385 +666 674 1590 +999 572 1705 +1142 392 1789 +1438 342 1919 +1553 581 2050 +1395 910 2205 +395 1169 2358 +1678 592 2466 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1746 674 2510 +1025 688 0 +1025 684 0 +1027 681 38 +1028 677 124 +1031 672 219 +1034 665 320 +1038 655 428 +1044 643 541 +1051 624 658 +1061 599 779 +1073 562 902 +1089 508 1028 +1086 508 1145 +913 678 1393 +525 811 1596 +936 738 1709 +1157 573 1796 +1399 418 1917 +1547 709 2058 +1361 976 2207 +221 1212 2361 +1695 752 2468 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +1742 811 2511 +998 854 247 +999 854 274 +1000 852 314 +1002 850 363 +1005 846 421 +1008 841 488 +1013 835 565 +1018 826 651 +1026 814 746 +1036 797 847 +1050 774 955 +1067 741 1069 +1082 701 1186 +907 818 1417 +458 939 1611 +854 914 1719 +1166 781 1811 +1344 583 1918 +1532 855 2069 +1306 1062 2213 +0 1254 2365 +1713 908 2469 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1738 955 2513 +1120 1134 981 +1120 1134 987 +1116 1134 996 +1110 1134 1007 +1102 1134 1022 +1091 1134 1041 +1076 1134 1065 +1055 1134 1096 +1025 1134 1133 +1003 1131 1180 +1017 1120 1235 +1036 1105 1300 +1052 1087 1374 +1136 1087 1482 +920 1158 1655 +941 1167 1774 +1193 1161 1864 +1274 1071 1958 +1421 1134 2085 +1184 1237 2230 +980 1275 2368 +1697 1083 2471 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1244 1351 1313 +1244 1351 1315 +1241 1351 1320 +1236 1351 1325 +1230 1351 1332 +1222 1351 1342 +1211 1351 1355 +1195 1351 1371 +1174 1351 1392 +1143 1351 1419 +1099 1351 1452 +1031 1351 1493 +1008 1345 1543 +1101 1345 1620 +1200 1345 1706 +1180 1356 1819 +1250 1368 1917 +1282 1376 2010 +1214 1352 2106 +941 1399 2251 +1206 1332 2375 +1655 1246 2474 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1442 1522 1648 +1441 1522 1649 +1440 1523 1650 +1440 1523 1651 +1439 1524 1653 +1437 1525 1655 +1436 1526 1658 +1433 1528 1663 +1430 1531 1668 +1426 1534 1676 +1410 1536 1691 +1377 1536 1716 +1335 1537 1749 +1263 1537 1781 +1301 1537 1839 +1339 1536 1910 +1357 1528 1994 +1241 1551 2071 +1105 1537 2167 +883 1536 2275 +1324 1476 2384 +1692 1446 2476 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1866 1416 2509 +1656 1669 1872 +1656 1669 1873 +1655 1669 1874 +1654 1670 1875 +1652 1671 1877 +1650 1671 1879 +1646 1672 1883 +1642 1674 1887 +1636 1675 1893 +1633 1678 1897 +1629 1681 1903 +1624 1685 1911 +1616 1691 1922 +1595 1684 1941 +1542 1684 1969 +1504 1684 2010 +1525 1691 2073 +1483 1671 2138 +1324 1684 2221 +1259 1662 2297 +1564 1621 2385 +1796 1617 2477 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1894 1605 2510 +1843 1802 1967 +1843 1802 1968 +1843 1802 1969 +1842 1802 1969 +1841 1802 1971 +1840 1802 1972 +1839 1802 1974 +1837 1802 1977 +1834 1802 1981 +1831 1802 1986 +1824 1804 1994 +1814 1807 2005 +1802 1811 2018 +1790 1817 2033 +1773 1811 2052 +1772 1809 2081 +1734 1809 2120 +1747 1811 2175 +1708 1801 2234 +1744 1800 2309 +1774 1800 2391 +1911 1796 2475 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1790 2515 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1991 1958 2038 +1991 1958 2038 +1990 1958 2040 +1989 1958 2041 +1988 1958 2043 +1986 1958 2045 +1983 1958 2049 +1980 1958 2053 +1976 1958 2059 +1970 1958 2067 +1962 1958 2074 +1950 1958 2082 +1946 1958 2104 +1947 1962 2142 +1936 1964 2196 +1923 1957 2231 +1922 1958 2310 +1954 1955 2394 +2043 1964 2481 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2127 1958 2514 +2128 2127 2076 +2128 2127 2077 +2129 2127 2077 +2129 2127 2077 +2129 2127 2077 +2129 2127 2078 +2130 2127 2078 +2130 2127 2079 +2131 2127 2080 +2132 2127 2080 +2133 2127 2082 +2135 2127 2084 +2135 2127 2087 +2129 2127 2097 +2122 2127 2109 +2124 2131 2129 +2128 2135 2163 +2124 2132 2210 +2119 2127 2251 +2135 2128 2316 +2164 2135 2400 +2226 2151 2485 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2257 2159 2520 +2374 2355 2126 +2374 2355 2127 +2374 2355 2127 +2374 2355 2127 +2374 2355 2127 +2374 2355 2128 +2374 2355 2129 +2375 2355 2130 +2375 2355 2131 +2375 2355 2133 +2376 2355 2135 +2377 2355 2138 +2376 2355 2140 +2375 2355 2143 +2372 2354 2147 +2374 2356 2159 +2375 2358 2191 +2375 2357 2230 +2381 2358 2275 +2398 2368 2335 +2415 2368 2409 +2469 2388 2498 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2498 2395 2532 +2679 2653 1955 +2679 2653 1955 +2679 2653 1956 +2679 2653 1957 +2679 2653 1958 +2679 2654 1961 +2679 2654 1963 +2679 2654 1967 +2679 2654 1964 +2679 2653 1961 +2678 2652 1955 +2678 2650 1948 +2677 2648 1939 +2677 2650 1960 +2676 2655 1976 +2677 2657 2013 +2680 2657 2068 +2679 2658 2122 +2683 2657 2209 +2688 2661 2310 +2695 2666 2408 +2715 2679 2527 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2727 2684 2579 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2712 2769 2427 +2712 2769 2427 +2712 2769 2427 +2712 2769 2428 +2712 2769 2428 +2712 2769 2428 +2713 2769 2428 +2713 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2717 2770 2436 +2716 2770 2440 +2714 2770 2444 +2712 2772 2461 +2714 2774 2492 +2714 2775 2523 +2712 2774 2554 +2717 2778 2620 +2725 2789 2702 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +2729 2789 2727 +1314 0 0 +1314 0 0 +1315 0 0 +1316 0 18 +1317 0 98 +1319 0 188 +1321 0 285 +1324 0 389 +1328 0 499 +1331 0 624 +1331 0 765 +1331 0 904 +1329 0 1054 +1312 0 1291 +1236 0 1533 +1269 0 1690 +1323 0 1781 +1534 0 1909 +1607 0 2039 +1502 645 2197 +677 1023 2352 +1658 0 2466 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1314 0 0 +1314 0 0 +1315 0 17 +1315 0 78 +1316 0 150 +1318 0 230 +1321 0 319 +1324 0 417 +1328 0 521 +1331 0 640 +1331 0 777 +1331 0 914 +1329 0 1059 +1311 0 1294 +1235 0 1535 +1268 0 1691 +1323 0 1782 +1533 0 1910 +1607 0 2039 +1501 656 2197 +679 1026 2352 +1659 0 2466 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1776 0 2506 +1314 0 0 +1314 0 17 +1314 0 97 +1315 0 149 +1316 0 211 +1318 0 282 +1320 0 363 +1323 0 452 +1327 0 549 +1330 0 662 +1330 0 794 +1330 0 926 +1328 0 1068 +1311 0 1298 +1235 0 1537 +1267 0 1692 +1323 0 1783 +1532 0 1911 +1606 0 2040 +1500 671 2198 +682 1030 2352 +1660 0 2466 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1777 0 2506 +1314 0 18 +1314 0 78 +1314 0 149 +1314 0 229 +1315 0 281 +1316 0 343 +1319 0 414 +1322 0 494 +1326 0 584 +1329 0 689 +1329 0 814 +1329 0 941 +1327 0 1079 +1310 0 1302 +1233 0 1540 +1266 0 1693 +1323 0 1784 +1531 0 1912 +1605 0 2041 +1498 690 2198 +686 1035 2353 +1661 0 2466 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1778 0 2506 +1314 0 98 +1314 0 150 +1314 0 211 +1314 0 281 +1314 0 361 +1315 0 413 +1318 0 475 +1321 0 546 +1325 0 627 +1328 0 723 +1328 0 840 +1328 0 961 +1326 0 1094 +1309 0 1309 +1232 0 1544 +1265 0 1695 +1323 0 1787 +1529 0 1914 +1603 0 2042 +1497 714 2199 +691 1042 2353 +1662 0 2466 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1779 0 2506 +1314 0 188 +1314 0 230 +1314 0 282 +1314 0 343 +1314 0 413 +1314 0 493 +1316 0 545 +1319 0 607 +1323 0 678 +1326 0 766 +1326 0 873 +1326 0 986 +1324 0 1113 +1307 0 1317 +1230 0 1549 +1263 0 1697 +1323 30 1790 +1527 0 1916 +1602 132 2043 +1495 745 2200 +698 1051 2354 +1663 0 2466 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1781 0 2506 +1314 121 285 +1314 106 319 +1314 85 363 +1314 56 414 +1314 13 475 +1314 0 545 +1314 0 625 +1317 0 677 +1321 0 739 +1324 0 816 +1324 0 914 +1324 0 1018 +1322 0 1138 +1304 0 1329 +1227 0 1556 +1261 0 1700 +1323 163 1794 +1524 32 1919 +1599 264 2045 +1491 783 2201 +706 1063 2354 +1666 32 2466 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1784 0 2506 +1314 264 389 +1314 253 417 +1314 238 452 +1314 217 494 +1314 188 546 +1314 146 607 +1314 82 677 +1314 0 757 +1318 0 809 +1321 0 876 +1321 0 963 +1321 0 1058 +1319 0 1168 +1302 0 1343 +1223 0 1565 +1257 0 1704 +1323 295 1799 +1520 164 1923 +1596 396 2047 +1487 830 2203 +718 1079 2355 +1668 164 2466 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1787 0 2506 +1314 404 499 +1314 396 521 +1314 385 549 +1314 370 584 +1314 349 627 +1314 320 678 +1314 277 739 +1314 214 809 +1314 111 889 +1317 111 946 +1317 111 1021 +1317 111 1106 +1315 111 1206 +1297 111 1362 +1218 111 1576 +1252 111 1709 +1323 426 1806 +1515 296 1928 +1592 528 2051 +1482 885 2205 +733 1099 2357 +1667 296 2465 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1791 111 2506 +1310 530 574 +1310 524 592 +1310 516 616 +1310 505 646 +1310 490 684 +1310 468 730 +1310 438 784 +1310 394 848 +1310 328 922 +1311 244 1001 +1311 244 1068 +1311 244 1145 +1310 244 1238 +1292 244 1379 +1207 285 1587 +1251 265 1716 +1322 514 1811 +1510 413 1934 +1587 643 2055 +1471 941 2208 +745 1128 2358 +1669 442 2465 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1794 285 2506 +1294 639 574 +1294 634 592 +1294 627 616 +1294 619 646 +1294 607 684 +1294 591 730 +1294 568 784 +1294 535 848 +1294 488 922 +1297 430 1001 +1304 376 1080 +1304 376 1155 +1302 376 1246 +1284 376 1385 +1178 503 1590 +1239 473 1720 +1329 626 1816 +1488 470 1933 +1583 729 2060 +1450 988 2209 +745 1169 2362 +1682 607 2467 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1792 503 2507 +1274 753 574 +1274 749 592 +1274 744 616 +1274 737 646 +1274 728 684 +1274 716 730 +1274 698 784 +1274 674 848 +1274 640 922 +1276 599 1001 +1284 562 1080 +1294 508 1169 +1292 508 1257 +1273 508 1393 +1137 691 1596 +1203 671 1723 +1338 742 1822 +1453 529 1930 +1577 824 2068 +1421 1044 2212 +672 1212 2365 +1699 762 2468 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1788 691 2509 +1258 900 682 +1259 900 693 +1259 896 712 +1259 891 736 +1259 885 767 +1259 876 806 +1259 864 852 +1259 847 908 +1259 824 973 +1261 797 1044 +1269 774 1117 +1280 741 1199 +1289 701 1290 +1270 701 1417 +1120 852 1611 +1159 869 1734 +1344 895 1836 +1405 663 1931 +1563 942 2078 +1372 1118 2218 +602 1254 2368 +1718 915 2470 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1784 871 2510 +1314 1134 1183 +1314 1134 1187 +1315 1134 1191 +1316 1134 1197 +1317 1134 1206 +1319 1134 1216 +1321 1134 1230 +1324 1134 1248 +1328 1134 1271 +1333 1131 1302 +1340 1120 1345 +1349 1105 1396 +1358 1087 1457 +1341 1087 1528 +1216 1158 1687 +1159 1142 1780 +1317 1176 1886 +1360 1041 1962 +1486 1159 2104 +1228 1237 2234 +1015 1275 2368 +1721 1100 2471 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1784 1087 2512 +1399 1351 1421 +1399 1351 1423 +1400 1351 1426 +1400 1351 1429 +1401 1351 1434 +1403 1351 1441 +1405 1351 1449 +1407 1351 1460 +1410 1351 1475 +1407 1351 1495 +1382 1351 1523 +1347 1351 1559 +1336 1345 1602 +1319 1345 1655 +1383 1345 1736 +1321 1339 1825 +1361 1378 1936 +1367 1360 2014 +1313 1367 2124 +1014 1399 2255 +1228 1332 2375 +1681 1258 2475 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1514 1522 1673 +1514 1522 1673 +1513 1522 1674 +1512 1522 1674 +1510 1522 1676 +1508 1522 1677 +1505 1522 1679 +1501 1522 1682 +1495 1522 1685 +1489 1523 1691 +1475 1525 1706 +1447 1525 1730 +1412 1526 1762 +1397 1537 1811 +1426 1537 1865 +1415 1525 1919 +1395 1535 2005 +1299 1551 2087 +1205 1526 2170 +1197 1525 2279 +1402 1488 2382 +1717 1446 2476 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1900 1416 2509 +1678 1669 1879 +1678 1669 1879 +1678 1669 1880 +1678 1669 1882 +1678 1669 1884 +1678 1669 1886 +1678 1669 1889 +1678 1669 1894 +1678 1669 1900 +1674 1670 1903 +1671 1673 1909 +1667 1678 1917 +1659 1683 1928 +1644 1684 1948 +1597 1684 1976 +1591 1683 2015 +1577 1683 2072 +1536 1664 2140 +1423 1683 2226 +1349 1660 2299 +1619 1615 2384 +1819 1607 2477 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1912 1605 2509 +1848 1802 1967 +1848 1802 1968 +1849 1802 1969 +1849 1803 1970 +1849 1803 1972 +1850 1804 1973 +1851 1805 1976 +1851 1806 1980 +1853 1807 1984 +1853 1808 1990 +1846 1810 1998 +1837 1813 2009 +1825 1817 2022 +1820 1817 2033 +1804 1811 2052 +1785 1809 2084 +1764 1804 2118 +1767 1811 2177 +1736 1801 2237 +1751 1800 2307 +1774 1800 2391 +1919 1797 2474 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +2000 1784 2514 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1992 1958 2038 +1992 1958 2038 +1992 1958 2039 +1992 1958 2040 +1991 1958 2042 +1988 1958 2046 +1983 1958 2052 +1978 1958 2060 +1974 1962 2077 +1963 1962 2086 +1955 1958 2110 +1955 1962 2141 +1953 1964 2193 +1941 1953 2231 +1931 1953 2310 +1966 1959 2394 +2048 1966 2481 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2129 1963 2515 +2134 2127 2070 +2134 2127 2070 +2134 2127 2071 +2135 2127 2071 +2135 2127 2073 +2135 2127 2074 +2135 2127 2076 +2136 2127 2078 +2137 2127 2081 +2137 2127 2084 +2139 2127 2085 +2140 2127 2087 +2141 2127 2091 +2135 2127 2100 +2127 2127 2112 +2129 2128 2129 +2136 2135 2161 +2130 2135 2208 +2125 2127 2253 +2141 2131 2316 +2170 2132 2397 +2230 2150 2485 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2266 2159 2520 +2377 2355 2126 +2377 2355 2127 +2377 2355 2127 +2377 2355 2127 +2377 2355 2127 +2378 2355 2127 +2378 2355 2128 +2378 2355 2128 +2378 2355 2129 +2379 2355 2130 +2380 2355 2133 +2380 2355 2135 +2380 2355 2137 +2378 2357 2143 +2376 2356 2147 +2376 2354 2159 +2375 2358 2194 +2375 2357 2230 +2381 2357 2273 +2399 2366 2335 +2418 2368 2408 +2472 2387 2495 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2499 2395 2533 +2680 2655 1964 +2680 2655 1964 +2680 2655 1964 +2680 2655 1964 +2680 2655 1964 +2680 2655 1964 +2680 2655 1964 +2680 2655 1964 +2679 2655 1968 +2679 2655 1970 +2679 2654 1965 +2678 2652 1958 +2677 2650 1949 +2677 2648 1945 +2675 2653 1962 +2676 2656 2011 +2680 2657 2064 +2681 2657 2122 +2684 2657 2213 +2688 2662 2314 +2696 2667 2413 +2716 2679 2527 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2727 2684 2578 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2713 2769 2427 +2713 2769 2427 +2713 2769 2427 +2713 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2428 +2714 2769 2429 +2714 2769 2429 +2715 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2718 2772 2447 +2715 2770 2444 +2712 2771 2455 +2714 2774 2492 +2716 2775 2523 +2714 2775 2560 +2719 2781 2625 +2725 2789 2703 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +2729 2791 2730 +1471 0 0 +1471 0 0 +1472 0 0 +1472 0 18 +1473 0 98 +1475 0 188 +1476 0 285 +1478 0 389 +1481 0 499 +1485 0 614 +1490 0 733 +1496 0 855 +1498 0 1011 +1486 0 1266 +1470 0 1472 +1490 0 1659 +1524 0 1789 +1589 0 1904 +1654 0 2053 +1531 645 2197 +923 1046 2356 +1710 0 2469 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1471 0 0 +1471 0 0 +1471 0 17 +1472 0 78 +1473 0 150 +1474 0 230 +1476 0 319 +1478 0 417 +1481 0 521 +1485 0 631 +1489 0 746 +1496 0 865 +1497 0 1017 +1486 0 1269 +1469 0 1474 +1489 0 1660 +1524 0 1790 +1589 0 1905 +1653 0 2053 +1531 656 2197 +924 1049 2356 +1710 0 2469 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1801 0 2506 +1471 0 0 +1471 0 17 +1471 0 97 +1472 0 149 +1472 0 211 +1474 0 282 +1475 0 363 +1477 0 452 +1480 0 549 +1484 0 653 +1489 0 763 +1496 0 878 +1497 0 1026 +1485 0 1273 +1469 0 1476 +1489 0 1661 +1524 0 1791 +1588 0 1905 +1652 0 2054 +1530 671 2198 +926 1053 2357 +1711 0 2469 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1802 0 2506 +1471 0 18 +1471 0 78 +1471 0 149 +1471 0 229 +1472 0 281 +1473 0 343 +1475 0 414 +1477 0 494 +1480 0 584 +1483 0 681 +1488 0 785 +1495 0 895 +1496 0 1039 +1485 0 1278 +1468 0 1480 +1488 0 1662 +1524 0 1793 +1587 0 1907 +1651 0 2054 +1529 690 2198 +928 1058 2357 +1712 0 2469 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1803 0 2506 +1471 0 98 +1471 0 150 +1471 0 211 +1471 0 281 +1471 0 361 +1472 0 413 +1474 0 475 +1476 0 546 +1479 0 627 +1482 0 716 +1487 0 813 +1494 0 917 +1495 0 1055 +1484 0 1285 +1467 0 1484 +1487 0 1664 +1524 0 1795 +1585 0 1908 +1650 0 2055 +1527 714 2199 +931 1065 2357 +1713 0 2469 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1804 0 2506 +1471 0 188 +1471 0 230 +1471 0 282 +1471 0 343 +1471 0 413 +1471 0 493 +1472 0 545 +1475 0 607 +1478 0 678 +1481 0 759 +1486 0 848 +1493 0 946 +1494 0 1075 +1482 0 1294 +1466 0 1490 +1486 0 1667 +1524 30 1798 +1584 0 1911 +1648 132 2057 +1525 745 2200 +935 1074 2358 +1715 0 2469 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1806 0 2506 +1471 121 285 +1471 106 319 +1471 85 363 +1471 56 414 +1471 13 475 +1471 0 545 +1471 0 625 +1473 0 677 +1476 0 739 +1480 0 810 +1485 0 891 +1491 0 980 +1493 0 1102 +1481 0 1306 +1464 0 1497 +1485 0 1670 +1524 163 1802 +1581 32 1914 +1646 264 2058 +1522 783 2201 +940 1085 2358 +1716 32 2469 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1809 0 2506 +1471 264 389 +1471 253 417 +1471 238 452 +1471 217 494 +1471 188 546 +1471 146 607 +1471 82 677 +1471 0 757 +1474 0 809 +1478 0 871 +1483 0 942 +1489 0 1023 +1491 0 1135 +1479 0 1321 +1462 0 1507 +1482 0 1674 +1524 295 1807 +1578 164 1918 +1644 396 2061 +1518 830 2203 +947 1100 2359 +1719 164 2469 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1812 0 2506 +1471 404 499 +1471 396 521 +1471 385 549 +1471 370 584 +1471 349 627 +1471 320 678 +1471 277 739 +1471 214 809 +1471 111 889 +1475 111 942 +1480 111 1003 +1486 111 1075 +1488 111 1176 +1476 111 1340 +1459 111 1520 +1480 111 1680 +1524 426 1814 +1573 296 1923 +1640 528 2064 +1513 885 2205 +956 1119 2361 +1717 296 2469 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1816 111 2506 +1471 542 614 +1471 536 631 +1471 528 653 +1471 517 681 +1471 502 716 +1471 482 759 +1471 452 810 +1471 410 871 +1471 346 942 +1471 244 1021 +1476 244 1074 +1483 244 1135 +1484 244 1225 +1472 244 1369 +1455 244 1537 +1476 244 1687 +1520 502 1820 +1567 428 1930 +1634 660 2068 +1506 950 2208 +968 1143 2362 +1715 428 2469 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1821 244 2506 +1471 678 733 +1471 674 746 +1471 668 763 +1471 660 785 +1471 649 813 +1471 634 848 +1471 613 891 +1471 584 942 +1471 542 1003 +1471 478 1074 +1471 376 1153 +1478 376 1206 +1479 376 1283 +1467 376 1412 +1450 376 1559 +1471 376 1701 +1516 581 1827 +1566 591 1940 +1627 792 2074 +1496 1025 2212 +983 1174 2364 +1712 560 2468 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1828 376 2506 +1471 814 855 +1471 811 865 +1471 806 878 +1471 800 895 +1471 792 917 +1471 782 946 +1471 767 980 +1471 746 1023 +1471 717 1075 +1471 674 1135 +1471 611 1206 +1471 508 1285 +1472 508 1352 +1460 508 1465 +1443 508 1587 +1464 508 1721 +1509 670 1836 +1566 751 1952 +1617 925 2081 +1483 1109 2218 +935 1212 2368 +1708 692 2467 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1838 508 2506 +1467 954 955 +1467 954 960 +1467 951 971 +1467 947 985 +1467 941 1004 +1467 933 1027 +1467 923 1056 +1467 908 1092 +1467 888 1137 +1467 859 1191 +1467 818 1254 +1467 755 1326 +1471 701 1400 +1458 701 1503 +1441 701 1611 +1446 742 1738 +1508 833 1851 +1542 872 1959 +1602 1037 2091 +1448 1185 2224 +886 1254 2372 +1718 855 2468 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1839 727 2507 +1503 1167 1293 +1503 1167 1296 +1504 1167 1299 +1504 1167 1304 +1505 1167 1311 +1506 1167 1319 +1508 1167 1330 +1510 1167 1344 +1512 1167 1363 +1514 1162 1390 +1514 1141 1432 +1514 1111 1482 +1517 1087 1536 +1506 1087 1597 +1491 1087 1687 +1446 1077 1783 +1489 1144 1900 +1509 1144 1988 +1532 1221 2116 +1329 1289 2240 +1151 1275 2372 +1721 1061 2469 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1839 1003 2508 +1547 1351 1534 +1547 1351 1536 +1547 1351 1538 +1548 1351 1541 +1549 1351 1545 +1550 1351 1550 +1551 1351 1556 +1553 1351 1565 +1555 1351 1577 +1558 1351 1592 +1563 1351 1611 +1569 1351 1636 +1573 1345 1671 +1563 1345 1717 +1550 1345 1771 +1498 1335 1850 +1489 1358 1942 +1476 1376 2036 +1418 1388 2147 +1096 1399 2261 +1290 1332 2375 +1730 1258 2473 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1839 1219 2510 +1626 1522 1733 +1625 1522 1734 +1625 1522 1734 +1623 1522 1735 +1622 1522 1736 +1621 1522 1737 +1618 1522 1739 +1615 1522 1742 +1611 1522 1745 +1605 1522 1749 +1605 1522 1760 +1609 1522 1778 +1596 1523 1805 +1587 1534 1850 +1574 1537 1894 +1558 1522 1941 +1509 1521 2012 +1413 1563 2107 +1330 1535 2187 +1296 1523 2285 +1459 1491 2382 +1767 1446 2474 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1910 1416 2509 +1737 1669 1898 +1737 1669 1899 +1737 1669 1900 +1737 1669 1901 +1737 1669 1903 +1737 1669 1905 +1737 1669 1908 +1737 1669 1913 +1737 1669 1918 +1732 1669 1922 +1727 1669 1925 +1719 1669 1930 +1711 1672 1940 +1697 1674 1960 +1687 1684 2003 +1675 1681 2036 +1638 1672 2080 +1565 1674 2153 +1492 1672 2229 +1526 1649 2305 +1680 1621 2385 +1871 1607 2473 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1954 1605 2509 +1862 1802 1972 +1862 1802 1973 +1862 1802 1973 +1862 1803 1975 +1862 1803 1976 +1863 1804 1978 +1864 1805 1981 +1865 1806 1984 +1866 1807 1989 +1868 1809 1995 +1868 1809 2004 +1868 1809 2014 +1861 1811 2027 +1856 1811 2038 +1842 1811 2056 +1824 1809 2088 +1829 1804 2122 +1805 1804 2175 +1793 1801 2242 +1782 1800 2309 +1820 1797 2390 +1940 1796 2477 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +2014 1783 2512 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1992 1958 2037 +1992 1958 2038 +1992 1958 2038 +1992 1958 2039 +1992 1958 2040 +1992 1958 2041 +1992 1958 2042 +1992 1958 2044 +1989 1958 2051 +1984 1962 2068 +1979 1968 2090 +1970 1962 2115 +1966 1962 2148 +1966 1964 2190 +1964 1947 2231 +1943 1947 2310 +1978 1965 2395 +2061 1971 2481 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2133 1968 2516 +2142 2127 2061 +2142 2127 2061 +2142 2127 2062 +2142 2127 2063 +2142 2127 2064 +2143 2127 2065 +2143 2127 2067 +2143 2127 2069 +2144 2127 2072 +2145 2127 2076 +2146 2127 2082 +2148 2127 2089 +2148 2127 2095 +2143 2127 2104 +2135 2127 2116 +2137 2127 2132 +2144 2131 2161 +2141 2135 2204 +2133 2127 2256 +2149 2134 2316 +2174 2130 2395 +2237 2146 2485 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2277 2159 2520 +2379 2355 2126 +2380 2355 2127 +2380 2355 2127 +2380 2355 2127 +2380 2355 2127 +2380 2355 2127 +2380 2355 2128 +2381 2355 2128 +2381 2355 2129 +2381 2355 2130 +2382 2355 2131 +2382 2355 2133 +2382 2355 2135 +2381 2357 2141 +2379 2358 2148 +2379 2355 2161 +2378 2357 2192 +2376 2358 2230 +2382 2354 2270 +2402 2364 2335 +2420 2368 2405 +2473 2383 2495 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2499 2394 2533 +2681 2657 1947 +2681 2657 1947 +2681 2657 1947 +2681 2657 1947 +2681 2657 1947 +2681 2657 1947 +2681 2657 1947 +2681 2657 1947 +2681 2656 1951 +2680 2656 1956 +2680 2656 1963 +2679 2655 1973 +2679 2654 1971 +2678 2651 1967 +2678 2651 1962 +2678 2655 2011 +2679 2657 2064 +2682 2657 2129 +2684 2657 2213 +2688 2661 2311 +2699 2668 2415 +2717 2681 2528 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2726 2683 2577 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2715 2769 2427 +2716 2769 2427 +2716 2769 2427 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2428 +2716 2769 2429 +2716 2769 2429 +2717 2769 2430 +2717 2769 2431 +2718 2770 2433 +2719 2772 2443 +2720 2775 2457 +2716 2772 2452 +2713 2770 2455 +2714 2773 2485 +2718 2774 2523 +2717 2777 2567 +2721 2782 2627 +2725 2788 2702 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +2729 2794 2733 +1677 0 708 +1676 0 722 +1676 0 740 +1675 0 763 +1674 0 792 +1672 0 829 +1670 0 873 +1667 0 927 +1663 0 989 +1658 0 1062 +1657 0 1123 +1662 0 1179 +1666 0 1250 +1649 0 1372 +1636 0 1533 +1634 0 1672 +1671 0 1828 +1667 0 1929 +1689 355 2079 +1608 810 2211 +1232 994 2359 +1771 0 2470 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1854 0 2508 +1676 0 726 +1676 0 735 +1675 0 753 +1674 0 775 +1673 0 804 +1672 0 839 +1669 0 883 +1667 0 935 +1663 0 997 +1658 0 1068 +1657 0 1129 +1662 0 1184 +1666 0 1253 +1649 0 1375 +1636 0 1535 +1635 0 1673 +1670 0 1829 +1666 0 1930 +1689 372 2079 +1607 814 2211 +1238 995 2359 +1771 0 2470 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1676 0 749 +1675 0 758 +1675 0 770 +1674 0 791 +1673 0 819 +1672 0 853 +1669 0 895 +1666 0 946 +1663 0 1007 +1657 0 1077 +1657 0 1136 +1661 0 1191 +1665 0 1259 +1649 0 1378 +1636 0 1537 +1635 0 1674 +1669 0 1829 +1665 0 1930 +1688 394 2080 +1606 821 2211 +1245 996 2359 +1771 0 2470 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1675 0 777 +1674 0 786 +1674 0 797 +1674 0 812 +1673 0 838 +1671 0 871 +1669 0 912 +1666 0 961 +1662 0 1020 +1657 0 1088 +1656 0 1146 +1661 0 1199 +1665 0 1266 +1649 0 1383 +1636 0 1541 +1636 0 1676 +1668 0 1830 +1663 0 1932 +1687 422 2080 +1605 829 2212 +1255 998 2359 +1772 0 2470 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1855 0 2508 +1674 0 814 +1673 0 822 +1673 0 832 +1673 0 845 +1672 0 863 +1671 0 894 +1668 0 933 +1666 0 980 +1662 0 1036 +1656 0 1102 +1655 0 1159 +1660 0 1210 +1664 0 1276 +1649 0 1390 +1636 0 1545 +1637 0 1679 +1667 0 1831 +1662 0 1934 +1686 457 2081 +1603 840 2212 +1268 1001 2360 +1772 0 2470 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1856 0 2508 +1672 0 858 +1672 0 865 +1672 0 874 +1671 0 887 +1671 0 903 +1670 0 923 +1667 0 960 +1664 0 1004 +1661 0 1058 +1655 0 1121 +1655 0 1175 +1659 0 1225 +1663 0 1289 +1649 0 1398 +1636 0 1551 +1639 0 1683 +1666 0 1832 +1659 132 1936 +1684 500 2083 +1600 854 2213 +1285 1004 2360 +1773 0 2470 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1857 0 2508 +1670 32 911 +1669 32 917 +1669 32 926 +1669 32 937 +1668 32 951 +1667 32 970 +1667 32 993 +1663 32 1035 +1660 32 1085 +1654 32 1144 +1654 32 1196 +1658 32 1244 +1662 0 1305 +1649 0 1410 +1636 0 1560 +1641 32 1688 +1663 32 1833 +1656 264 1939 +1682 551 2084 +1596 873 2214 +1306 1009 2361 +1773 0 2470 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1859 32 2508 +1667 164 973 +1667 164 979 +1666 164 986 +1666 164 996 +1666 164 1009 +1664 164 1025 +1663 164 1046 +1662 164 1073 +1658 164 1119 +1653 164 1174 +1652 164 1223 +1657 164 1268 +1661 137 1326 +1649 0 1424 +1636 0 1570 +1644 164 1695 +1661 164 1835 +1652 396 1943 +1680 612 2086 +1591 896 2215 +1333 1014 2362 +1774 0 2470 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1861 164 2508 +1663 296 1045 +1663 296 1050 +1663 296 1056 +1662 296 1065 +1662 296 1075 +1661 296 1090 +1660 296 1108 +1658 296 1131 +1656 296 1161 +1651 296 1212 +1650 296 1257 +1655 296 1299 +1659 276 1353 +1649 111 1443 +1636 111 1584 +1648 296 1704 +1657 296 1838 +1646 528 1948 +1676 683 2089 +1585 926 2217 +1367 1022 2363 +1772 0 2470 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1863 296 2508 +1658 428 1127 +1658 428 1131 +1657 428 1136 +1657 428 1143 +1656 428 1152 +1655 428 1164 +1654 428 1180 +1653 428 1200 +1651 428 1225 +1648 428 1257 +1648 428 1298 +1653 428 1336 +1657 413 1387 +1648 265 1468 +1636 244 1601 +1653 428 1715 +1661 428 1846 +1638 660 1955 +1671 762 2093 +1576 963 2219 +1408 1032 2365 +1768 91 2470 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1866 428 2508 +1655 583 1188 +1655 583 1191 +1654 583 1196 +1654 583 1202 +1654 583 1210 +1653 583 1221 +1651 583 1234 +1650 583 1252 +1648 583 1275 +1646 583 1304 +1644 536 1348 +1649 536 1383 +1653 524 1429 +1645 413 1503 +1633 376 1622 +1654 536 1730 +1662 536 1854 +1635 766 1962 +1664 863 2099 +1566 1025 2222 +1432 1062 2367 +1764 309 2470 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1872 536 2508 +1655 745 1237 +1655 745 1240 +1654 745 1244 +1654 745 1249 +1654 745 1257 +1653 745 1266 +1651 745 1279 +1650 745 1295 +1648 745 1315 +1646 745 1342 +1644 713 1383 +1644 633 1439 +1648 624 1479 +1640 536 1547 +1628 508 1646 +1649 633 1749 +1657 633 1863 +1635 881 1973 +1655 979 2105 +1554 1109 2228 +1415 1110 2370 +1760 519 2469 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1880 633 2508 +1655 918 1304 +1656 918 1306 +1655 918 1310 +1655 918 1314 +1654 918 1320 +1654 918 1329 +1653 918 1340 +1651 918 1354 +1649 918 1372 +1647 918 1395 +1645 897 1432 +1645 845 1482 +1643 779 1541 +1635 719 1601 +1623 701 1686 +1641 772 1775 +1650 779 1877 +1631 1007 1989 +1643 1092 2115 +1533 1205 2236 +1384 1170 2375 +1758 725 2468 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1889 758 2508 +1647 1170 1441 +1648 1170 1443 +1648 1170 1445 +1648 1170 1448 +1649 1170 1452 +1650 1170 1457 +1651 1170 1463 +1653 1170 1472 +1654 1170 1484 +1655 1170 1500 +1654 1157 1529 +1654 1129 1570 +1651 1095 1619 +1635 1095 1678 +1623 1087 1751 +1615 1062 1817 +1632 1090 1907 +1595 1178 2016 +1626 1217 2123 +1463 1323 2255 +1427 1258 2375 +1780 1002 2468 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1884 986 2506 +1671 1358 1617 +1671 1358 1618 +1672 1358 1619 +1672 1358 1621 +1672 1358 1624 +1673 1358 1628 +1674 1358 1632 +1676 1358 1638 +1678 1358 1646 +1680 1358 1657 +1683 1358 1672 +1687 1358 1694 +1687 1345 1729 +1672 1345 1775 +1659 1345 1825 +1644 1322 1879 +1625 1320 1950 +1565 1390 2060 +1550 1377 2150 +1313 1430 2275 +1491 1332 2378 +1794 1220 2471 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1883 1202 2507 +1720 1522 1779 +1720 1522 1780 +1719 1522 1781 +1718 1522 1782 +1717 1522 1783 +1716 1522 1785 +1714 1522 1787 +1712 1522 1790 +1708 1522 1795 +1704 1522 1800 +1703 1522 1811 +1707 1522 1827 +1711 1522 1847 +1703 1522 1873 +1693 1522 1912 +1668 1522 1965 +1628 1506 2021 +1607 1566 2121 +1540 1536 2191 +1494 1506 2283 +1572 1474 2382 +1813 1446 2473 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1923 1435 2511 +1810 1655 1910 +1809 1655 1911 +1809 1655 1911 +1808 1655 1912 +1807 1656 1913 +1806 1657 1915 +1805 1658 1918 +1802 1659 1921 +1800 1661 1925 +1796 1662 1930 +1791 1662 1934 +1784 1662 1939 +1776 1662 1948 +1775 1662 1972 +1766 1670 2011 +1745 1681 2051 +1732 1662 2087 +1680 1676 2155 +1604 1655 2226 +1644 1643 2305 +1738 1626 2385 +1900 1611 2473 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1984 1617 2510 +1907 1800 1983 +1907 1800 1984 +1907 1800 1984 +1907 1800 1985 +1907 1800 1986 +1907 1800 1987 +1907 1800 1989 +1907 1800 1991 +1907 1800 1994 +1907 1800 1997 +1906 1801 2005 +1906 1801 2015 +1905 1801 2029 +1901 1801 2043 +1890 1801 2062 +1872 1801 2086 +1874 1807 2128 +1850 1801 2174 +1847 1800 2243 +1818 1792 2312 +1871 1797 2387 +1976 1799 2480 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1783 2511 +2034 1958 2033 +2033 1958 2033 +2033 1958 2034 +2032 1958 2034 +2031 1959 2036 +2031 1959 2037 +2029 1960 2039 +2027 1961 2041 +2025 1961 2044 +2021 1963 2049 +2020 1963 2052 +2020 1963 2054 +2020 1963 2059 +2020 1959 2069 +2016 1962 2088 +2004 1969 2111 +1998 1964 2152 +1993 1963 2193 +1987 1952 2238 +1975 1952 2313 +2009 1966 2398 +2073 1966 2481 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2135 1969 2517 +2163 2131 2063 +2163 2131 2063 +2163 2131 2064 +2163 2131 2065 +2163 2131 2065 +2163 2131 2066 +2163 2131 2068 +2163 2131 2069 +2163 2131 2072 +2163 2131 2075 +2164 2131 2080 +2165 2131 2087 +2166 2131 2096 +2164 2131 2105 +2157 2131 2117 +2148 2127 2128 +2154 2127 2154 +2155 2131 2206 +2143 2127 2260 +2159 2135 2315 +2188 2134 2395 +2251 2149 2486 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2283 2159 2520 +2386 2355 2123 +2386 2355 2123 +2386 2356 2123 +2387 2356 2123 +2387 2356 2124 +2387 2356 2124 +2387 2356 2125 +2387 2357 2126 +2388 2357 2127 +2388 2357 2129 +2389 2358 2131 +2389 2358 2133 +2389 2357 2135 +2386 2356 2141 +2384 2356 2148 +2382 2356 2170 +2388 2357 2191 +2386 2356 2226 +2394 2358 2272 +2409 2366 2337 +2431 2373 2403 +2476 2384 2495 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2508 2398 2531 +2684 2656 1957 +2684 2656 1957 +2684 2656 1956 +2684 2656 1956 +2684 2656 1956 +2684 2656 1956 +2684 2656 1955 +2684 2656 1954 +2684 2656 1955 +2684 2656 1956 +2684 2656 1961 +2683 2656 1971 +2683 2655 1982 +2682 2655 1994 +2682 2655 1993 +2681 2656 2011 +2682 2656 2069 +2683 2657 2133 +2686 2657 2216 +2691 2663 2315 +2700 2669 2417 +2719 2681 2533 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2726 2683 2576 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2718 2771 2437 +2718 2771 2437 +2718 2771 2437 +2718 2771 2436 +2718 2771 2436 +2718 2771 2435 +2718 2771 2435 +2717 2770 2434 +2717 2770 2432 +2717 2770 2430 +2717 2769 2430 +2718 2769 2431 +2718 2770 2433 +2719 2771 2443 +2720 2774 2457 +2721 2773 2466 +2716 2771 2466 +2717 2774 2492 +2718 2776 2528 +2718 2777 2569 +2722 2782 2624 +2727 2788 2703 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +2731 2794 2734 +1824 0 1212 +1824 0 1217 +1825 0 1223 +1825 0 1231 +1826 0 1242 +1827 0 1255 +1829 0 1273 +1831 0 1296 +1833 0 1325 +1830 0 1360 +1825 0 1405 +1819 0 1458 +1810 0 1521 +1804 0 1576 +1787 0 1659 +1777 0 1755 +1770 0 1865 +1790 0 1986 +1740 750 2108 +1692 916 2230 +1561 947 2370 +1845 0 2469 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1920 0 2511 +1824 0 1216 +1824 0 1219 +1825 0 1225 +1825 0 1233 +1826 0 1243 +1827 0 1257 +1829 0 1275 +1831 0 1298 +1833 0 1326 +1830 0 1362 +1825 0 1406 +1819 0 1459 +1810 0 1523 +1804 0 1578 +1787 0 1661 +1777 0 1756 +1770 0 1866 +1790 32 1986 +1740 754 2108 +1692 922 2231 +1561 949 2370 +1845 0 2470 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1825 0 1221 +1825 0 1224 +1825 0 1228 +1825 0 1235 +1826 0 1246 +1827 0 1260 +1829 0 1277 +1831 0 1300 +1833 0 1328 +1830 0 1364 +1825 0 1408 +1819 0 1461 +1810 0 1524 +1804 0 1580 +1787 0 1663 +1777 0 1758 +1770 44 1866 +1789 88 1987 +1740 759 2109 +1692 931 2231 +1562 952 2370 +1845 0 2470 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1920 0 2510 +1825 0 1228 +1825 0 1231 +1825 0 1234 +1825 0 1239 +1826 0 1249 +1827 0 1263 +1829 0 1280 +1831 0 1302 +1833 0 1331 +1830 0 1366 +1825 0 1410 +1819 0 1463 +1810 0 1526 +1804 0 1584 +1787 0 1666 +1777 0 1760 +1769 102 1867 +1788 153 1988 +1739 765 2110 +1692 942 2232 +1563 957 2370 +1845 0 2470 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1920 44 2510 +1826 0 1238 +1826 0 1240 +1826 0 1243 +1826 0 1248 +1826 0 1254 +1827 0 1267 +1829 0 1284 +1831 0 1306 +1833 0 1335 +1830 0 1370 +1825 0 1413 +1819 0 1465 +1810 0 1528 +1804 0 1588 +1787 0 1669 +1777 83 1763 +1769 170 1868 +1787 229 1990 +1739 774 2111 +1692 956 2233 +1563 962 2370 +1845 0 2470 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1921 103 2510 +1827 0 1250 +1827 0 1252 +1827 0 1255 +1827 0 1260 +1827 1 1265 +1827 30 1273 +1829 30 1290 +1831 30 1312 +1833 30 1339 +1830 30 1375 +1825 30 1417 +1819 30 1469 +1810 64 1531 +1804 132 1593 +1787 132 1674 +1777 215 1767 +1768 247 1870 +1785 313 1991 +1738 785 2113 +1692 974 2235 +1564 970 2370 +1845 0 2470 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1921 171 2510 +1829 58 1265 +1829 66 1267 +1829 77 1270 +1829 91 1275 +1829 109 1280 +1829 133 1288 +1829 163 1297 +1831 163 1318 +1833 163 1346 +1830 163 1380 +1825 163 1423 +1819 163 1474 +1810 188 1536 +1804 264 1601 +1787 264 1680 +1777 347 1772 +1767 334 1872 +1783 406 1994 +1737 799 2115 +1692 998 2237 +1565 979 2370 +1845 32 2471 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1922 248 2510 +1831 183 1285 +1831 190 1287 +1831 198 1290 +1831 209 1294 +1831 223 1299 +1831 242 1306 +1831 265 1315 +1831 295 1328 +1833 295 1354 +1830 295 1388 +1825 295 1430 +1819 295 1480 +1810 314 1541 +1804 396 1611 +1787 396 1688 +1777 479 1778 +1766 428 1875 +1779 506 1998 +1736 818 2119 +1692 1027 2240 +1567 992 2369 +1845 164 2471 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1922 335 2510 +1833 310 1310 +1833 315 1312 +1833 322 1315 +1833 330 1319 +1833 341 1324 +1833 355 1331 +1833 373 1339 +1833 397 1351 +1833 426 1365 +1830 426 1398 +1825 426 1439 +1819 426 1489 +1810 441 1548 +1804 528 1623 +1787 528 1699 +1777 611 1787 +1765 530 1878 +1775 613 2002 +1734 841 2123 +1692 1064 2244 +1569 1008 2369 +1844 330 2472 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1924 429 2510 +1830 439 1356 +1830 443 1358 +1830 447 1361 +1830 454 1364 +1830 462 1369 +1830 473 1375 +1830 487 1383 +1830 506 1393 +1830 529 1407 +1828 531 1428 +1824 531 1466 +1817 531 1513 +1809 543 1570 +1803 601 1641 +1787 591 1713 +1780 686 1796 +1768 615 1886 +1769 725 2008 +1730 897 2126 +1685 1092 2246 +1595 1019 2371 +1840 422 2472 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1926 531 2509 +1825 568 1412 +1825 571 1414 +1825 575 1417 +1825 579 1420 +1825 586 1424 +1825 594 1429 +1825 605 1436 +1825 619 1445 +1825 638 1457 +1824 640 1476 +1821 640 1501 +1814 640 1545 +1806 648 1598 +1800 695 1664 +1787 658 1731 +1782 751 1810 +1774 707 1896 +1763 805 2012 +1724 965 2131 +1675 1127 2249 +1629 1033 2373 +1836 515 2472 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1930 640 2509 +1819 699 1479 +1819 701 1480 +1819 703 1482 +1819 707 1485 +1819 712 1488 +1819 718 1493 +1819 727 1499 +1819 737 1507 +1819 752 1518 +1817 753 1534 +1814 753 1556 +1811 753 1584 +1803 760 1633 +1797 797 1695 +1787 733 1754 +1782 813 1830 +1781 806 1910 +1756 887 2016 +1716 1042 2138 +1662 1169 2253 +1634 1062 2374 +1829 616 2472 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1935 753 2509 +1811 848 1553 +1811 848 1554 +1811 851 1556 +1811 853 1558 +1811 857 1561 +1811 861 1565 +1811 867 1570 +1811 875 1577 +1811 886 1586 +1809 887 1600 +1807 887 1619 +1804 887 1644 +1799 892 1675 +1793 920 1732 +1785 861 1784 +1781 901 1853 +1789 932 1929 +1748 990 2023 +1706 1137 2147 +1648 1218 2257 +1620 1108 2375 +1824 746 2471 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1942 876 2509 +1820 1109 1630 +1820 1109 1631 +1819 1109 1633 +1819 1109 1635 +1818 1109 1637 +1817 1109 1641 +1815 1109 1645 +1813 1109 1651 +1810 1109 1659 +1810 1109 1670 +1808 1109 1686 +1805 1109 1707 +1800 1112 1734 +1793 1134 1775 +1785 1098 1823 +1767 1090 1881 +1785 1153 1970 +1749 1166 2045 +1704 1267 2165 +1646 1289 2266 +1638 1188 2377 +1843 976 2471 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1948 1035 2509 +1812 1336 1724 +1812 1336 1725 +1811 1336 1727 +1811 1336 1728 +1810 1336 1730 +1809 1336 1733 +1807 1336 1736 +1805 1336 1741 +1802 1336 1748 +1804 1336 1756 +1806 1336 1767 +1810 1336 1781 +1808 1338 1803 +1801 1351 1839 +1785 1351 1887 +1762 1338 1936 +1760 1342 2007 +1728 1366 2073 +1683 1382 2175 +1573 1418 2288 +1713 1264 2379 +1872 1202 2471 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1942 1211 2508 +1832 1511 1838 +1832 1511 1839 +1832 1511 1839 +1832 1511 1840 +1832 1511 1841 +1832 1511 1843 +1832 1511 1845 +1832 1511 1848 +1832 1511 1852 +1829 1511 1857 +1829 1511 1865 +1832 1511 1876 +1834 1511 1891 +1824 1511 1912 +1810 1511 1951 +1783 1522 2002 +1774 1495 2052 +1746 1515 2117 +1708 1501 2192 +1652 1522 2297 +1779 1436 2383 +1898 1422 2472 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1969 1408 2508 +1888 1654 1938 +1888 1654 1938 +1888 1654 1939 +1888 1654 1940 +1888 1654 1940 +1888 1654 1942 +1888 1654 1943 +1888 1654 1946 +1888 1654 1949 +1885 1654 1953 +1881 1654 1958 +1875 1654 1965 +1868 1655 1975 +1863 1662 1991 +1855 1662 2017 +1843 1654 2055 +1817 1654 2107 +1794 1657 2159 +1766 1662 2229 +1800 1621 2303 +1843 1605 2385 +1921 1624 2474 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +2007 1630 2511 +1977 1783 1983 +1977 1783 1984 +1977 1783 1984 +1977 1783 1985 +1977 1783 1986 +1978 1783 1987 +1978 1783 1989 +1979 1783 1991 +1980 1783 1994 +1980 1783 1997 +1977 1785 2004 +1973 1788 2012 +1966 1792 2023 +1959 1786 2037 +1958 1786 2064 +1950 1793 2093 +1929 1801 2129 +1939 1792 2174 +1905 1778 2235 +1877 1792 2311 +1920 1800 2389 +2007 1802 2476 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2064 1798 2511 +2083 1958 2032 +2082 1958 2032 +2082 1958 2032 +2082 1958 2033 +2082 1958 2034 +2082 1958 2035 +2081 1958 2036 +2081 1958 2038 +2080 1958 2041 +2077 1959 2045 +2073 1961 2051 +2067 1963 2058 +2061 1965 2068 +2056 1964 2080 +2056 1959 2093 +2052 1959 2114 +2036 1961 2142 +2031 1968 2199 +2019 1953 2244 +2017 1958 2317 +2046 1962 2395 +2106 1970 2483 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2149 1969 2517 +2191 2132 2068 +2191 2132 2068 +2191 2132 2069 +2190 2132 2069 +2190 2132 2070 +2190 2131 2071 +2189 2131 2072 +2188 2130 2074 +2187 2130 2076 +2187 2129 2079 +2187 2129 2083 +2187 2129 2088 +2187 2129 2096 +2184 2129 2105 +2180 2129 2117 +2180 2128 2131 +2170 2124 2154 +2176 2127 2200 +2167 2133 2262 +2179 2135 2315 +2208 2135 2395 +2271 2155 2484 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2291 2159 2521 +2407 2360 2121 +2407 2360 2121 +2407 2360 2121 +2407 2360 2121 +2407 2360 2121 +2407 2359 2122 +2407 2359 2122 +2407 2359 2123 +2407 2358 2123 +2408 2359 2125 +2408 2360 2128 +2409 2360 2131 +2409 2360 2135 +2408 2362 2141 +2405 2359 2147 +2402 2358 2164 +2395 2358 2193 +2399 2361 2228 +2408 2365 2275 +2419 2368 2338 +2446 2373 2402 +2486 2387 2498 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2516 2398 2529 +2687 2656 1984 +2687 2656 1984 +2687 2656 1984 +2687 2656 1984 +2687 2656 1984 +2687 2656 1984 +2687 2656 1984 +2687 2656 1984 +2688 2656 1989 +2688 2656 1991 +2688 2656 1992 +2689 2656 1995 +2690 2656 1999 +2690 2657 2008 +2688 2657 2023 +2688 2657 2054 +2688 2658 2083 +2688 2659 2149 +2689 2659 2227 +2696 2667 2323 +2703 2668 2417 +2722 2681 2534 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2728 2686 2580 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2773 2448 +2722 2772 2447 +2721 2772 2444 +2721 2771 2441 +2720 2770 2438 +2721 2771 2443 +2722 2773 2457 +2723 2774 2473 +2723 2774 2481 +2717 2775 2500 +2720 2779 2531 +2720 2778 2569 +2726 2782 2625 +2731 2788 2703 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +2734 2794 2737 +1906 311 1618 +1906 316 1619 +1906 322 1620 +1906 330 1621 +1905 342 1623 +1905 356 1626 +1905 374 1630 +1904 398 1634 +1903 427 1640 +1901 464 1648 +1904 471 1670 +1909 471 1700 +1914 464 1736 +1910 152 1775 +1903 63 1817 +1900 481 1880 +1885 481 1958 +1866 624 2053 +1837 927 2156 +1786 933 2261 +1818 679 2380 +1933 0 2471 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1989 487 2513 +1906 330 1619 +1907 325 1621 +1906 332 1622 +1906 340 1623 +1906 351 1625 +1905 365 1628 +1905 383 1631 +1904 406 1636 +1903 435 1642 +1901 471 1650 +1904 478 1672 +1910 478 1702 +1915 478 1736 +1910 179 1776 +1903 95 1817 +1900 491 1880 +1885 491 1958 +1866 631 2054 +1837 928 2156 +1786 935 2261 +1818 681 2380 +1933 0 2471 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1989 491 2513 +1906 354 1621 +1907 350 1622 +1907 344 1624 +1907 352 1625 +1906 362 1627 +1906 376 1630 +1905 393 1633 +1904 416 1638 +1903 444 1644 +1902 480 1652 +1905 486 1674 +1910 486 1704 +1915 486 1738 +1910 212 1777 +1904 135 1818 +1900 504 1881 +1885 504 1959 +1866 640 2054 +1837 930 2156 +1787 936 2261 +1819 684 2380 +1933 0 2471 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1990 495 2513 +1906 384 1623 +1907 381 1624 +1907 375 1626 +1907 367 1628 +1907 377 1630 +1906 391 1633 +1905 408 1636 +1905 430 1641 +1904 457 1647 +1902 491 1655 +1905 498 1676 +1911 498 1706 +1915 498 1740 +1910 253 1778 +1904 183 1819 +1900 520 1882 +1885 520 1960 +1866 653 2055 +1838 932 2156 +1787 939 2261 +1819 688 2381 +1933 0 2471 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1990 501 2513 +1906 422 1625 +1907 419 1626 +1907 413 1628 +1907 406 1631 +1908 397 1634 +1907 409 1636 +1906 426 1640 +1905 447 1644 +1904 473 1650 +1903 507 1658 +1906 513 1680 +1911 513 1709 +1916 513 1743 +1911 303 1780 +1904 241 1821 +1899 542 1884 +1886 542 1962 +1866 669 2056 +1838 935 2156 +1788 941 2261 +1820 693 2381 +1933 0 2471 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1991 508 2513 +1906 468 1629 +1907 465 1630 +1907 460 1632 +1907 454 1634 +1908 445 1637 +1908 434 1641 +1907 449 1645 +1906 469 1649 +1905 495 1655 +1904 526 1663 +1907 533 1684 +1912 533 1713 +1917 533 1747 +1911 362 1783 +1905 308 1823 +1899 569 1886 +1886 569 1964 +1866 690 2057 +1839 939 2157 +1789 945 2262 +1821 700 2381 +1933 10 2471 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1993 518 2513 +1906 523 1633 +1907 520 1635 +1907 516 1636 +1907 511 1639 +1908 503 1642 +1908 493 1646 +1908 479 1651 +1908 498 1656 +1907 521 1662 +1905 551 1669 +1908 557 1690 +1913 557 1719 +1918 557 1753 +1912 430 1786 +1905 384 1826 +1898 602 1888 +1887 602 1966 +1866 716 2059 +1839 944 2157 +1791 950 2262 +1823 708 2381 +1933 84 2470 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1994 531 2513 +1906 588 1640 +1907 585 1641 +1907 582 1643 +1907 577 1645 +1908 570 1648 +1908 562 1652 +1908 550 1657 +1909 533 1664 +1908 555 1670 +1907 583 1678 +1910 588 1698 +1915 588 1727 +1920 588 1759 +1913 508 1790 +1906 470 1830 +1897 644 1892 +1888 644 1970 +1866 749 2061 +1840 951 2157 +1793 957 2263 +1825 720 2382 +1933 167 2470 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1996 548 2512 +1906 662 1647 +1907 660 1649 +1907 657 1650 +1907 653 1653 +1908 647 1655 +1908 640 1659 +1908 629 1665 +1909 615 1672 +1911 596 1681 +1909 622 1689 +1912 627 1708 +1917 627 1736 +1922 627 1769 +1913 595 1796 +1907 563 1835 +1896 695 1896 +1889 695 1975 +1866 789 2064 +1841 960 2158 +1796 966 2263 +1827 735 2383 +1933 330 2471 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1999 569 2512 +1906 745 1658 +1907 743 1659 +1907 741 1661 +1907 737 1663 +1908 733 1666 +1908 727 1670 +1908 718 1675 +1909 707 1682 +1911 691 1691 +1912 669 1703 +1915 674 1722 +1920 674 1749 +1925 674 1780 +1915 674 1805 +1909 665 1842 +1894 754 1903 +1887 754 1980 +1866 838 2069 +1843 972 2159 +1800 977 2264 +1831 754 2384 +1933 489 2472 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +2002 596 2512 +1910 819 1677 +1910 817 1678 +1910 815 1680 +1911 812 1682 +1911 809 1685 +1911 803 1689 +1912 796 1693 +1913 787 1700 +1914 773 1708 +1915 755 1720 +1915 772 1732 +1921 772 1758 +1925 772 1789 +1916 772 1813 +1909 792 1855 +1894 863 1914 +1887 875 1990 +1865 911 2073 +1841 1000 2165 +1800 1040 2269 +1833 798 2384 +1931 640 2472 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +2004 683 2511 +1915 898 1703 +1915 897 1704 +1915 895 1705 +1915 893 1707 +1916 890 1710 +1916 885 1713 +1917 879 1718 +1918 871 1724 +1919 860 1732 +1920 845 1743 +1921 860 1755 +1921 885 1769 +1925 885 1799 +1916 885 1823 +1909 925 1873 +1894 979 1929 +1887 1007 2002 +1862 997 2078 +1838 1037 2174 +1800 1121 2277 +1843 837 2383 +1928 785 2473 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +2007 787 2510 +1922 997 1735 +1922 998 1736 +1922 997 1737 +1922 995 1739 +1923 993 1741 +1923 989 1745 +1924 984 1749 +1925 978 1755 +1926 969 1763 +1927 958 1772 +1927 969 1783 +1927 989 1797 +1926 1011 1816 +1917 1011 1839 +1910 1049 1891 +1895 1094 1949 +1888 1137 2019 +1859 1095 2086 +1833 1102 2184 +1802 1203 2287 +1856 905 2383 +1926 942 2474 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +2010 902 2509 +1931 1121 1774 +1931 1122 1775 +1931 1123 1776 +1932 1124 1778 +1932 1126 1780 +1932 1129 1783 +1933 1132 1787 +1934 1137 1793 +1935 1143 1800 +1936 1145 1809 +1936 1152 1819 +1936 1166 1832 +1935 1181 1849 +1921 1181 1881 +1914 1207 1928 +1905 1197 1974 +1898 1248 2038 +1870 1219 2099 +1827 1224 2189 +1814 1266 2289 +1856 1137 2381 +1933 1139 2475 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +2017 1048 2509 +1943 1312 1836 +1943 1312 1837 +1943 1313 1838 +1943 1314 1839 +1944 1315 1841 +1944 1317 1844 +1945 1319 1847 +1945 1322 1852 +1946 1326 1858 +1948 1331 1866 +1945 1332 1875 +1940 1332 1886 +1936 1339 1902 +1923 1339 1930 +1915 1358 1965 +1906 1343 2006 +1889 1364 2062 +1872 1381 2136 +1826 1367 2210 +1822 1339 2296 +1868 1258 2382 +1955 1262 2478 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +2027 1191 2509 +1969 1458 1884 +1969 1458 1884 +1968 1458 1885 +1968 1458 1887 +1968 1458 1888 +1968 1458 1890 +1967 1458 1892 +1966 1458 1896 +1965 1458 1900 +1964 1458 1906 +1962 1458 1913 +1957 1458 1924 +1950 1459 1938 +1941 1472 1960 +1934 1487 1991 +1937 1461 2031 +1908 1472 2078 +1899 1508 2159 +1871 1507 2226 +1869 1459 2304 +1906 1424 2382 +1989 1433 2480 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +2031 1414 2509 +1995 1625 1959 +1995 1625 1960 +1995 1625 1961 +1995 1626 1962 +1995 1626 1963 +1994 1627 1965 +1994 1628 1968 +1993 1630 1972 +1992 1632 1976 +1991 1632 1982 +1990 1632 1987 +1990 1632 1993 +1990 1632 2002 +1989 1633 2018 +1978 1635 2038 +1968 1630 2070 +1945 1650 2122 +1941 1635 2175 +1926 1623 2233 +1921 1624 2309 +1947 1613 2388 +2014 1610 2474 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2061 1608 2512 +2048 1766 1996 +2048 1766 1996 +2048 1766 1996 +2048 1766 1997 +2048 1766 1998 +2048 1766 1999 +2048 1766 2000 +2048 1766 2002 +2048 1766 2006 +2048 1766 2009 +2048 1766 2014 +2048 1766 2020 +2048 1767 2029 +2044 1773 2043 +2040 1782 2061 +2029 1792 2098 +2027 1783 2138 +1997 1783 2185 +1996 1799 2243 +1996 1791 2315 +2012 1789 2391 +2075 1804 2478 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2111 1808 2513 +2118 1947 2038 +2118 1947 2038 +2118 1947 2039 +2118 1947 2039 +2118 1948 2040 +2119 1948 2041 +2119 1948 2042 +2120 1949 2044 +2120 1950 2047 +2121 1951 2050 +2120 1952 2054 +2119 1952 2060 +2117 1952 2068 +2111 1952 2078 +2102 1952 2094 +2100 1957 2116 +2094 1953 2146 +2078 1951 2186 +2073 1951 2247 +2076 1958 2318 +2097 1963 2398 +2161 1972 2478 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2191 1974 2517 +2223 2127 2077 +2223 2127 2077 +2223 2127 2077 +2223 2128 2078 +2223 2128 2078 +2223 2128 2078 +2223 2128 2079 +2223 2129 2080 +2223 2130 2082 +2223 2131 2084 +2221 2130 2088 +2219 2128 2093 +2216 2127 2099 +2213 2127 2109 +2210 2127 2121 +2206 2127 2136 +2216 2126 2162 +2212 2127 2204 +2215 2139 2260 +2222 2139 2318 +2237 2143 2401 +2282 2159 2486 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2316 2166 2524 +2426 2364 2124 +2426 2364 2124 +2426 2364 2124 +2426 2364 2125 +2426 2364 2125 +2426 2364 2126 +2426 2364 2126 +2426 2364 2127 +2426 2364 2129 +2426 2364 2131 +2426 2364 2132 +2426 2363 2135 +2427 2362 2138 +2429 2364 2138 +2428 2365 2146 +2427 2363 2161 +2428 2366 2187 +2427 2369 2230 +2430 2369 2278 +2430 2368 2333 +2463 2376 2405 +2502 2392 2495 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2540 2403 2525 +2694 2658 1982 +2694 2658 1982 +2694 2658 1982 +2694 2658 1981 +2694 2658 1981 +2694 2658 1979 +2693 2657 1979 +2693 2657 1977 +2693 2657 1978 +2693 2657 1979 +2693 2658 1988 +2694 2659 2001 +2694 2660 2015 +2696 2660 2021 +2695 2657 2016 +2695 2660 2055 +2697 2662 2117 +2697 2663 2170 +2697 2666 2245 +2701 2667 2320 +2711 2672 2426 +2725 2685 2539 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2731 2689 2588 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2727 2773 2456 +2727 2773 2456 +2727 2773 2456 +2727 2774 2457 +2727 2774 2457 +2727 2774 2457 +2727 2774 2458 +2728 2774 2459 +2728 2775 2460 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2728 2775 2461 +2729 2773 2461 +2729 2774 2466 +2728 2776 2478 +2729 2777 2494 +2725 2779 2509 +2723 2779 2533 +2725 2779 2571 +2728 2783 2631 +2735 2789 2705 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2738 2796 2741 +2036 810 1881 +2036 808 1882 +2036 806 1882 +2036 803 1883 +2037 799 1884 +2037 794 1886 +2037 787 1887 +2038 777 1890 +2039 763 1894 +2040 745 1898 +2042 718 1904 +2043 681 1912 +2044 657 1923 +2037 657 1946 +2028 657 1974 +2025 726 2020 +2019 820 2081 +1994 874 2146 +1993 810 2228 +2002 0 2298 +2010 0 2382 +2069 0 2474 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2036 813 1881 +2036 813 1882 +2036 811 1883 +2036 808 1884 +2037 804 1884 +2037 799 1886 +2037 791 1888 +2038 782 1891 +2039 769 1894 +2040 750 1898 +2042 724 1905 +2043 687 1912 +2044 666 1924 +2037 666 1946 +2028 666 1974 +2024 730 2021 +2019 824 2081 +1994 876 2146 +1994 812 2228 +2002 0 2298 +2010 0 2382 +2069 0 2474 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2037 817 1881 +2036 817 1882 +2036 817 1883 +2036 814 1884 +2037 810 1885 +2037 805 1887 +2037 798 1888 +2038 789 1891 +2039 776 1894 +2040 757 1899 +2042 732 1905 +2043 695 1913 +2044 675 1924 +2037 678 1946 +2028 678 1974 +2024 735 2021 +2019 831 2081 +1994 877 2146 +1994 814 2228 +2002 0 2298 +2010 0 2382 +2069 0 2474 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2108 0 2510 +2037 823 1882 +2037 823 1883 +2037 823 1884 +2036 823 1885 +2037 819 1886 +2037 814 1887 +2037 807 1889 +2038 797 1892 +2039 785 1895 +2040 767 1900 +2042 742 1906 +2043 706 1914 +2044 686 1925 +2038 693 1947 +2028 693 1975 +2024 742 2022 +2020 839 2082 +1995 880 2146 +1995 817 2228 +2003 0 2298 +2010 0 2382 +2069 0 2474 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2107 0 2510 +2037 830 1882 +2037 830 1883 +2037 830 1884 +2037 830 1885 +2037 830 1887 +2037 825 1888 +2037 818 1891 +2038 809 1893 +2039 797 1897 +2040 779 1901 +2042 755 1907 +2043 721 1915 +2044 701 1926 +2038 713 1948 +2029 713 1976 +2024 751 2023 +2020 850 2082 +1995 883 2147 +1996 821 2228 +2004 0 2298 +2011 0 2383 +2069 0 2474 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2107 61 2510 +2038 840 1883 +2038 840 1884 +2038 840 1884 +2037 840 1886 +2037 840 1887 +2037 840 1890 +2037 833 1892 +2038 825 1894 +2039 813 1898 +2040 796 1902 +2042 772 1908 +2043 739 1916 +2044 721 1927 +2038 737 1950 +2029 737 1977 +2023 762 2025 +2021 864 2083 +1996 888 2147 +1997 826 2228 +2005 48 2298 +2011 0 2383 +2069 10 2474 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2105 179 2510 +2039 853 1883 +2039 853 1884 +2039 853 1885 +2038 853 1887 +2038 853 1888 +2038 853 1891 +2037 853 1894 +2038 844 1896 +2039 833 1900 +2040 817 1904 +2042 794 1910 +2043 763 1918 +2044 745 1929 +2039 769 1951 +2029 769 1979 +2023 777 2027 +2022 882 2084 +1997 894 2148 +1998 832 2227 +2006 147 2298 +2011 89 2384 +2069 84 2473 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2104 299 2510 +2040 869 1884 +2040 869 1885 +2040 869 1886 +2040 869 1887 +2039 869 1889 +2039 869 1891 +2039 869 1894 +2038 869 1899 +2039 858 1902 +2040 843 1907 +2042 822 1913 +2043 792 1920 +2044 776 1932 +2039 807 1954 +2030 807 1981 +2022 797 2029 +2023 905 2085 +1998 901 2149 +2000 841 2227 +2007 253 2298 +2012 208 2384 +2069 167 2473 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2103 423 2510 +2042 890 1885 +2042 890 1886 +2042 890 1887 +2041 890 1888 +2041 890 1890 +2041 890 1893 +2040 890 1896 +2040 890 1900 +2039 890 1905 +2040 876 1910 +2042 857 1916 +2043 829 1924 +2044 814 1935 +2040 854 1957 +2031 854 1984 +2021 822 2032 +2025 934 2086 +2000 911 2150 +2003 852 2226 +2009 364 2298 +2013 329 2385 +2069 258 2473 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2101 548 2511 +2044 917 1887 +2044 917 1887 +2044 917 1889 +2043 917 1890 +2043 917 1892 +2043 917 1894 +2042 917 1897 +2042 917 1901 +2041 917 1907 +2040 917 1914 +2042 899 1920 +2043 874 1928 +2044 861 1939 +2041 906 1961 +2032 910 1988 +2020 853 2037 +2024 959 2090 +2002 924 2152 +2007 867 2226 +2011 480 2298 +2014 453 2386 +2069 358 2472 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2098 675 2511 +2047 951 1889 +2047 951 1890 +2047 951 1891 +2047 951 1892 +2046 951 1894 +2046 951 1896 +2045 951 1899 +2045 951 1903 +2044 951 1909 +2043 951 1916 +2042 951 1926 +2043 928 1933 +2044 916 1944 +2041 956 1966 +2033 976 1993 +2021 913 2042 +2022 990 2095 +2006 968 2154 +2012 886 2225 +2014 599 2298 +2016 579 2387 +2069 463 2472 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2094 803 2512 +2051 992 1892 +2051 992 1892 +2051 992 1894 +2050 992 1895 +2050 992 1897 +2050 992 1899 +2049 992 1902 +2049 992 1906 +2048 992 1912 +2047 992 1919 +2045 992 1928 +2043 992 1941 +2044 981 1951 +2041 1016 1973 +2035 1052 1999 +2023 999 2048 +2020 1028 2102 +2010 1027 2157 +2018 910 2223 +2019 722 2298 +2019 682 2389 +2069 575 2471 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2089 933 2513 +2055 1051 1898 +2055 1052 1899 +2055 1052 1900 +2055 1052 1902 +2054 1052 1903 +2054 1052 1905 +2054 1052 1909 +2053 1052 1913 +2052 1052 1918 +2051 1052 1925 +2050 1052 1935 +2048 1052 1947 +2047 1053 1963 +2043 1083 1983 +2038 1120 2010 +2027 1089 2055 +2019 1074 2110 +2016 1091 2162 +2024 958 2224 +2023 859 2299 +2024 795 2391 +2069 729 2471 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2085 1046 2513 +2065 1109 1913 +2065 1110 1913 +2065 1112 1915 +2065 1113 1916 +2064 1115 1918 +2063 1118 1921 +2063 1121 1924 +2061 1126 1929 +2060 1132 1936 +2058 1137 1943 +2057 1137 1952 +2055 1137 1964 +2053 1137 1979 +2053 1164 1999 +2049 1195 2025 +2041 1167 2059 +2028 1112 2110 +2027 1145 2168 +2024 1061 2228 +2023 1050 2301 +2024 973 2387 +2069 983 2473 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2092 1159 2513 +2079 1177 1931 +2078 1178 1932 +2078 1179 1933 +2078 1180 1934 +2077 1182 1936 +2077 1184 1939 +2076 1187 1942 +2075 1191 1947 +2073 1196 1953 +2071 1204 1961 +2068 1213 1971 +2065 1225 1985 +2062 1230 2000 +2062 1252 2020 +2062 1280 2044 +2056 1256 2073 +2047 1209 2114 +2037 1182 2169 +2024 1169 2235 +2023 1221 2303 +2029 1152 2384 +2060 1207 2475 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2100 1275 2513 +2099 1357 1955 +2099 1357 1955 +2099 1357 1955 +2099 1357 1956 +2098 1357 1957 +2098 1357 1958 +2097 1357 1960 +2096 1357 1962 +2094 1357 1965 +2093 1357 1969 +2090 1361 1977 +2086 1370 1990 +2083 1381 2008 +2080 1396 2034 +2079 1416 2059 +2078 1420 2093 +2067 1399 2124 +2059 1381 2174 +2045 1359 2234 +2030 1417 2304 +2051 1393 2388 +2070 1417 2476 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2115 1452 2513 +2118 1561 1978 +2118 1561 1978 +2118 1561 1979 +2118 1561 1980 +2119 1561 1982 +2119 1561 1984 +2119 1561 1986 +2120 1561 1990 +2120 1561 1994 +2119 1561 1998 +2116 1561 2003 +2113 1561 2009 +2109 1560 2018 +2103 1553 2032 +2099 1566 2064 +2098 1570 2096 +2095 1587 2145 +2080 1579 2177 +2077 1562 2236 +2046 1604 2305 +2071 1614 2389 +2114 1600 2477 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2143 1637 2513 +2134 1765 2000 +2134 1765 2001 +2134 1766 2001 +2134 1766 2002 +2134 1767 2003 +2134 1767 2004 +2134 1768 2005 +2134 1769 2007 +2134 1771 2010 +2134 1772 2014 +2135 1773 2021 +2137 1773 2031 +2138 1773 2045 +2138 1767 2062 +2131 1758 2076 +2129 1756 2098 +2124 1756 2137 +2121 1783 2193 +2113 1774 2243 +2086 1783 2307 +2096 1787 2390 +2148 1816 2480 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2194 1817 2514 +2181 1956 2056 +2181 1956 2057 +2181 1956 2057 +2182 1956 2057 +2182 1955 2057 +2182 1955 2057 +2182 1955 2058 +2183 1954 2058 +2183 1953 2059 +2184 1951 2060 +2185 1950 2062 +2187 1947 2063 +2188 1945 2068 +2188 1950 2081 +2188 1955 2098 +2191 1957 2124 +2187 1958 2158 +2166 1958 2197 +2157 1958 2256 +2157 1958 2315 +2170 1965 2391 +2214 1983 2481 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2243 1992 2520 +2280 2135 2094 +2279 2135 2094 +2279 2135 2094 +2279 2135 2093 +2279 2135 2093 +2279 2135 2093 +2278 2135 2093 +2278 2135 2092 +2278 2135 2091 +2277 2135 2090 +2276 2135 2089 +2275 2135 2087 +2273 2135 2088 +2271 2132 2104 +2268 2128 2124 +2265 2127 2141 +2261 2127 2163 +2267 2131 2204 +2267 2143 2274 +2279 2151 2326 +2302 2151 2402 +2336 2169 2486 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2365 2174 2524 +2461 2367 2129 +2461 2367 2129 +2461 2367 2129 +2460 2367 2129 +2460 2367 2129 +2460 2367 2129 +2460 2367 2129 +2459 2367 2129 +2458 2367 2129 +2457 2367 2129 +2456 2367 2129 +2456 2367 2131 +2456 2368 2135 +2457 2370 2144 +2458 2370 2155 +2459 2368 2173 +2458 2367 2191 +2459 2372 2228 +2457 2374 2273 +2469 2375 2338 +2498 2390 2405 +2539 2403 2489 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2561 2413 2521 +2709 2666 2040 +2709 2666 2040 +2709 2665 2040 +2709 2665 2040 +2709 2665 2040 +2709 2665 2040 +2709 2665 2040 +2710 2664 2040 +2710 2664 2039 +2710 2664 2038 +2710 2664 2037 +2710 2663 2035 +2710 2663 2036 +2709 2665 2056 +2708 2668 2074 +2708 2667 2090 +2708 2666 2122 +2710 2669 2190 +2713 2675 2273 +2712 2672 2336 +2722 2681 2446 +2732 2688 2548 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2743 2699 2604 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2736 2777 2472 +2736 2777 2472 +2736 2777 2472 +2736 2777 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2473 +2736 2778 2474 +2736 2778 2475 +2736 2778 2475 +2736 2779 2476 +2736 2779 2478 +2736 2779 2480 +2736 2779 2480 +2736 2779 2480 +2737 2778 2487 +2736 2777 2497 +2732 2777 2512 +2731 2783 2550 +2734 2783 2585 +2737 2787 2644 +2741 2798 2718 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2746 2799 2749 +2203 0 1962 +2203 0 1963 +2203 0 1963 +2203 0 1964 +2202 0 1966 +2202 0 1967 +2202 0 1969 +2202 0 1972 +2201 0 1976 +2200 0 1981 +2199 0 1988 +2198 0 1996 +2196 0 2008 +2194 0 2027 +2190 0 2051 +2189 0 2090 +2187 0 2135 +2178 0 2178 +2160 0 2231 +2145 0 2305 +2169 0 2389 +2195 0 2474 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2191 934 2513 +2203 0 1962 +2203 0 1963 +2203 0 1963 +2203 0 1965 +2202 0 1966 +2202 0 1967 +2202 0 1969 +2202 0 1972 +2201 0 1976 +2200 0 1981 +2199 0 1988 +2198 0 1997 +2196 0 2008 +2194 0 2027 +2190 0 2051 +2189 0 2090 +2187 0 2135 +2178 0 2178 +2160 0 2231 +2145 0 2305 +2169 0 2389 +2195 0 2474 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2191 935 2513 +2203 0 1962 +2203 0 1963 +2203 0 1964 +2203 0 1965 +2202 0 1966 +2202 0 1968 +2202 0 1970 +2202 0 1973 +2201 0 1976 +2200 0 1981 +2199 0 1988 +2198 0 1997 +2196 0 2008 +2194 0 2026 +2190 0 2051 +2189 0 2090 +2187 0 2135 +2178 0 2178 +2161 0 2231 +2146 0 2305 +2169 0 2389 +2195 0 2474 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2191 937 2513 +2203 0 1963 +2203 0 1963 +2203 0 1964 +2203 0 1965 +2202 0 1966 +2202 0 1968 +2202 0 1970 +2202 0 1973 +2201 0 1977 +2200 0 1982 +2199 0 1988 +2198 0 1997 +2196 0 2008 +2194 0 2026 +2190 0 2050 +2189 0 2090 +2187 0 2135 +2178 0 2178 +2161 0 2232 +2146 0 2305 +2169 0 2389 +2195 0 2474 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2192 939 2513 +2202 0 1963 +2202 0 1963 +2202 0 1964 +2202 0 1965 +2202 0 1966 +2202 0 1968 +2202 0 1970 +2202 0 1973 +2201 0 1977 +2200 0 1982 +2199 0 1989 +2198 0 1997 +2196 0 2009 +2194 0 2026 +2190 0 2050 +2188 0 2090 +2187 0 2136 +2178 0 2178 +2161 0 2232 +2147 0 2305 +2169 0 2389 +2195 0 2474 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2192 942 2513 +2202 0 1963 +2202 0 1964 +2202 0 1965 +2202 0 1966 +2202 0 1967 +2202 0 1969 +2202 0 1970 +2202 0 1973 +2201 0 1977 +2200 0 1982 +2199 0 1989 +2198 0 1998 +2196 0 2009 +2194 0 2026 +2190 0 2050 +2188 0 2090 +2187 0 2136 +2178 0 2178 +2162 0 2232 +2148 0 2305 +2169 0 2389 +2195 74 2474 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2193 946 2513 +2202 0 1964 +2202 0 1965 +2202 0 1965 +2202 0 1966 +2202 0 1968 +2202 0 1969 +2202 0 1971 +2202 0 1974 +2201 0 1978 +2200 0 1983 +2199 0 1989 +2198 0 1998 +2196 0 2010 +2194 0 2025 +2190 0 2049 +2188 0 2090 +2187 0 2137 +2178 0 2178 +2162 0 2232 +2149 0 2305 +2168 0 2389 +2196 195 2474 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2194 951 2513 +2202 0 1965 +2202 0 1965 +2202 0 1966 +2202 0 1967 +2202 0 1968 +2202 0 1970 +2202 0 1972 +2202 0 1975 +2201 0 1979 +2200 0 1984 +2199 0 1990 +2198 0 1999 +2196 0 2010 +2194 0 2024 +2190 0 2049 +2188 0 2090 +2187 0 2138 +2178 0 2178 +2163 0 2233 +2150 0 2306 +2168 0 2388 +2196 319 2474 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2195 957 2513 +2201 0 1966 +2201 0 1966 +2201 0 1967 +2201 0 1968 +2201 0 1969 +2201 0 1971 +2201 0 1973 +2201 0 1976 +2201 0 1979 +2200 0 1984 +2199 0 1991 +2198 0 2000 +2196 0 2011 +2194 0 2024 +2190 0 2048 +2187 0 2090 +2187 0 2140 +2178 0 2178 +2165 0 2233 +2152 111 2306 +2167 0 2388 +2195 419 2475 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2197 966 2513 +2200 0 1967 +2200 0 1968 +2200 0 1968 +2200 0 1969 +2200 0 1970 +2200 0 1972 +2200 0 1974 +2200 0 1977 +2200 0 1981 +2200 0 1986 +2199 0 1993 +2198 0 2001 +2196 0 2012 +2194 0 2023 +2190 0 2047 +2186 0 2090 +2186 0 2140 +2178 0 2178 +2166 0 2234 +2155 244 2307 +2166 0 2388 +2195 523 2475 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 978 2513 +2199 0 1969 +2199 0 1969 +2199 0 1970 +2199 0 1971 +2199 0 1972 +2199 0 1974 +2199 0 1976 +2199 0 1979 +2199 0 1983 +2199 0 1988 +2199 0 1994 +2198 0 2003 +2196 0 2014 +2194 0 2025 +2190 0 2045 +2186 0 2089 +2185 0 2140 +2178 0 2180 +2169 0 2235 +2158 376 2308 +2165 61 2387 +2194 633 2476 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2202 993 2513 +2198 0 1971 +2198 0 1972 +2198 0 1972 +2198 0 1973 +2198 0 1974 +2198 0 1976 +2198 0 1978 +2198 0 1981 +2198 0 1985 +2198 0 1990 +2198 0 1996 +2198 0 2005 +2196 0 2016 +2194 0 2027 +2190 0 2043 +2186 0 2087 +2183 0 2140 +2178 0 2183 +2172 0 2236 +2163 508 2309 +2167 263 2387 +2192 748 2476 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2206 1012 2513 +2197 0 1974 +2197 0 1974 +2197 0 1975 +2197 0 1976 +2197 0 1977 +2197 0 1979 +2197 0 1981 +2197 0 1984 +2197 0 1988 +2197 0 1993 +2197 0 1999 +2197 0 2008 +2196 0 2019 +2194 0 2030 +2190 0 2044 +2186 0 2085 +2183 0 2139 +2179 0 2186 +2175 0 2237 +2168 643 2310 +2170 532 2388 +2192 890 2477 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2211 1054 2513 +2200 621 1974 +2200 621 1974 +2200 621 1976 +2200 621 1977 +2200 621 1978 +2200 621 1980 +2201 621 1983 +2201 621 1986 +2202 621 1991 +2202 621 1997 +2202 621 2003 +2202 621 2012 +2202 617 2022 +2196 529 2033 +2193 529 2047 +2189 621 2082 +2185 627 2133 +2182 413 2189 +2177 708 2240 +2170 828 2310 +2173 948 2390 +2196 1121 2478 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2216 1189 2513 +2203 974 1974 +2203 974 1974 +2203 974 1976 +2203 974 1977 +2203 974 1978 +2204 974 1980 +2204 974 1983 +2204 974 1986 +2205 974 1991 +2206 974 1997 +2207 974 2005 +2208 974 2016 +2208 973 2027 +2203 934 2038 +2196 877 2052 +2192 934 2084 +2188 977 2129 +2185 874 2183 +2181 1059 2243 +2174 996 2310 +2175 1202 2391 +2206 1271 2478 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2222 1322 2513 +2208 1278 1984 +2208 1279 1985 +2208 1279 1986 +2208 1281 1986 +2209 1282 1987 +2209 1284 1988 +2209 1286 1990 +2209 1289 1992 +2210 1294 1995 +2211 1299 1998 +2212 1302 2005 +2213 1302 2016 +2214 1300 2030 +2212 1282 2047 +2206 1256 2063 +2201 1278 2090 +2194 1321 2134 +2193 1308 2182 +2182 1327 2241 +2178 1331 2310 +2182 1416 2391 +2214 1452 2477 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2228 1489 2513 +2220 1531 2004 +2220 1531 2004 +2220 1531 2004 +2220 1532 2005 +2220 1533 2006 +2220 1534 2007 +2220 1535 2008 +2220 1537 2010 +2220 1540 2013 +2221 1543 2017 +2222 1547 2021 +2223 1553 2027 +2224 1559 2037 +2222 1557 2051 +2218 1543 2073 +2214 1535 2102 +2208 1550 2140 +2199 1572 2190 +2195 1558 2240 +2192 1577 2310 +2192 1604 2393 +2223 1653 2476 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2238 1676 2514 +2241 1755 2023 +2241 1755 2023 +2241 1755 2024 +2241 1755 2024 +2241 1755 2025 +2241 1755 2025 +2241 1755 2026 +2241 1755 2028 +2241 1755 2029 +2241 1755 2031 +2241 1758 2036 +2241 1761 2042 +2240 1765 2049 +2240 1765 2063 +2238 1765 2080 +2237 1764 2104 +2229 1762 2147 +2223 1755 2193 +2223 1765 2244 +2223 1774 2315 +2215 1795 2391 +2250 1824 2482 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2262 1849 2517 +2268 1946 2048 +2268 1946 2049 +2269 1946 2049 +2269 1946 2050 +2269 1946 2051 +2269 1946 2051 +2270 1946 2053 +2270 1946 2054 +2270 1946 2057 +2271 1946 2060 +2272 1946 2064 +2273 1946 2070 +2274 1945 2077 +2274 1945 2087 +2274 1945 2099 +2271 1951 2124 +2268 1961 2158 +2265 1963 2203 +2273 1968 2256 +2261 1969 2321 +2271 1965 2394 +2310 1995 2482 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2335 2014 2520 +2351 2143 2087 +2351 2143 2087 +2351 2143 2087 +2351 2143 2088 +2351 2143 2088 +2351 2143 2089 +2351 2143 2091 +2351 2143 2092 +2351 2143 2094 +2351 2143 2097 +2351 2143 2101 +2351 2143 2106 +2351 2143 2112 +2351 2143 2115 +2351 2143 2119 +2351 2143 2141 +2349 2146 2174 +2346 2147 2214 +2351 2143 2263 +2356 2159 2326 +2362 2167 2401 +2402 2189 2492 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2434 2202 2530 +2515 2384 2126 +2514 2384 2127 +2514 2384 2127 +2514 2384 2127 +2514 2383 2127 +2514 2383 2127 +2514 2383 2128 +2514 2383 2128 +2514 2382 2129 +2513 2382 2130 +2513 2381 2131 +2513 2381 2133 +2514 2382 2135 +2515 2384 2141 +2515 2385 2150 +2515 2388 2172 +2515 2388 2195 +2520 2388 2230 +2523 2391 2279 +2523 2395 2342 +2548 2407 2404 +2582 2421 2483 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2607 2433 2514 +2731 2680 2128 +2731 2680 2129 +2731 2680 2129 +2731 2680 2130 +2731 2680 2131 +2731 2681 2132 +2731 2681 2133 +2731 2681 2135 +2731 2681 2136 +2730 2681 2137 +2730 2681 2138 +2729 2680 2140 +2728 2679 2142 +2728 2679 2150 +2730 2679 2164 +2731 2678 2176 +2730 2679 2195 +2730 2680 2243 +2735 2682 2308 +2735 2687 2382 +2739 2689 2468 +2750 2708 2581 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2756 2707 2625 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2755 2784 2495 +2755 2784 2495 +2755 2784 2495 +2755 2784 2496 +2755 2784 2496 +2755 2784 2496 +2755 2784 2497 +2755 2784 2498 +2755 2785 2499 +2755 2785 2501 +2755 2786 2503 +2755 2786 2506 +2755 2787 2509 +2755 2787 2512 +2755 2787 2515 +2754 2787 2520 +2753 2788 2528 +2753 2787 2543 +2751 2785 2569 +2749 2789 2602 +2753 2795 2660 +2755 2801 2726 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2757 2802 2755 +2331 0 2000 +2331 0 2000 +2331 0 2001 +2331 0 2001 +2331 0 2002 +2331 0 2003 +2331 0 2005 +2331 0 2007 +2331 0 2010 +2331 0 2013 +2331 0 2018 +2331 0 2024 +2330 0 2034 +2326 0 2051 +2322 0 2072 +2321 0 2094 +2320 0 2138 +2314 0 2186 +2319 0 2244 +2315 0 2315 +2317 0 2391 +2334 913 2480 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2348 1255 2518 +2331 0 2000 +2331 0 2000 +2331 0 2001 +2331 0 2001 +2331 0 2002 +2331 0 2003 +2331 0 2005 +2331 0 2007 +2331 0 2010 +2331 0 2013 +2331 0 2018 +2331 0 2024 +2330 0 2034 +2326 0 2051 +2322 0 2072 +2321 0 2094 +2320 0 2138 +2315 0 2186 +2319 0 2245 +2315 0 2315 +2317 0 2392 +2334 917 2480 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2348 1256 2518 +2331 0 2000 +2331 0 2000 +2331 0 2001 +2331 0 2001 +2331 0 2002 +2331 0 2003 +2331 0 2005 +2331 0 2007 +2331 0 2010 +2331 0 2013 +2331 0 2018 +2330 0 2024 +2329 0 2034 +2326 0 2051 +2322 0 2072 +2321 0 2095 +2320 0 2138 +2315 0 2186 +2319 0 2245 +2315 0 2315 +2317 0 2392 +2334 922 2479 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2348 1258 2518 +2331 0 2000 +2331 0 2000 +2331 0 2001 +2331 0 2001 +2331 0 2002 +2331 0 2003 +2331 0 2005 +2331 0 2007 +2331 0 2010 +2331 0 2013 +2331 0 2018 +2330 0 2024 +2329 0 2034 +2326 0 2052 +2322 0 2072 +2321 0 2095 +2321 0 2138 +2315 0 2186 +2319 0 2245 +2315 0 2315 +2317 0 2392 +2334 929 2479 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2348 1260 2518 +2331 0 2000 +2331 0 2000 +2331 0 2001 +2331 0 2001 +2331 0 2002 +2331 0 2003 +2331 0 2005 +2331 0 2007 +2331 0 2010 +2331 0 2013 +2331 0 2018 +2330 0 2024 +2329 0 2034 +2326 0 2052 +2322 0 2072 +2321 0 2095 +2321 0 2138 +2315 0 2186 +2319 0 2245 +2315 0 2315 +2317 0 2392 +2334 938 2479 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2349 1263 2518 +2331 0 2000 +2331 0 2000 +2331 0 2001 +2331 0 2001 +2330 0 2002 +2330 0 2003 +2330 0 2005 +2330 0 2007 +2330 0 2010 +2330 0 2013 +2330 0 2018 +2330 0 2024 +2329 0 2034 +2326 0 2052 +2322 0 2073 +2321 0 2095 +2322 0 2138 +2315 0 2186 +2318 0 2245 +2315 30 2315 +2317 0 2392 +2334 949 2479 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2349 1267 2518 +2331 0 2000 +2330 0 2000 +2330 0 2001 +2330 0 2001 +2330 0 2002 +2330 0 2003 +2330 0 2005 +2330 0 2007 +2330 0 2010 +2330 0 2013 +2330 0 2018 +2329 0 2024 +2328 0 2034 +2327 0 2053 +2323 0 2073 +2321 0 2096 +2322 0 2139 +2315 0 2186 +2318 0 2245 +2315 163 2315 +2317 32 2392 +2334 964 2478 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2350 1272 2518 +2330 0 2000 +2330 0 2000 +2330 0 2001 +2330 0 2001 +2330 0 2002 +2330 0 2003 +2329 0 2005 +2329 0 2007 +2329 0 2010 +2329 0 2013 +2329 0 2018 +2328 0 2024 +2327 0 2034 +2327 0 2053 +2323 0 2073 +2321 0 2096 +2323 0 2139 +2316 0 2186 +2318 0 2246 +2315 295 2315 +2317 164 2393 +2334 983 2478 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2351 1279 2518 +2330 0 2000 +2330 0 2000 +2330 0 2001 +2330 0 2001 +2329 0 2002 +2329 0 2003 +2329 0 2005 +2329 0 2007 +2328 0 2010 +2328 0 2013 +2328 0 2018 +2328 0 2024 +2327 0 2034 +2327 0 2054 +2323 0 2074 +2321 0 2097 +2325 0 2140 +2316 0 2186 +2317 111 2246 +2315 426 2315 +2317 296 2393 +2334 993 2478 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2352 1288 2518 +2329 0 2000 +2329 0 2000 +2329 0 2001 +2329 0 2001 +2329 0 2002 +2329 0 2003 +2328 0 2005 +2328 0 2007 +2328 0 2010 +2327 0 2013 +2327 0 2018 +2326 0 2024 +2325 0 2034 +2327 0 2055 +2324 0 2075 +2321 0 2098 +2325 0 2141 +2317 0 2186 +2317 244 2247 +2315 559 2315 +2317 428 2393 +2335 1003 2479 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2354 1300 2518 +2328 0 2000 +2328 0 2000 +2328 0 2001 +2328 0 2001 +2328 0 2002 +2328 0 2003 +2328 0 2005 +2327 0 2007 +2327 0 2010 +2326 0 2013 +2325 0 2018 +2325 0 2024 +2324 0 2034 +2326 0 2055 +2325 61 2077 +2322 0 2099 +2325 0 2142 +2319 0 2187 +2316 376 2248 +2315 691 2315 +2317 560 2394 +2337 1018 2479 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2356 1315 2518 +2328 0 2000 +2328 0 2000 +2328 0 2001 +2328 0 2001 +2328 0 2002 +2327 0 2003 +2327 0 2005 +2327 0 2007 +2326 0 2010 +2326 0 2013 +2325 0 2018 +2325 0 2027 +2324 0 2036 +2326 0 2057 +2327 111 2081 +2323 0 2103 +2324 0 2142 +2322 0 2190 +2315 426 2247 +2315 741 2315 +2319 692 2394 +2338 1091 2481 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2357 1322 2518 +2328 0 2000 +2328 0 2001 +2328 0 2001 +2328 0 2002 +2328 0 2003 +2328 0 2004 +2328 0 2006 +2327 0 2008 +2327 0 2011 +2326 0 2014 +2326 0 2019 +2325 0 2028 +2325 0 2040 +2327 44 2061 +2328 216 2085 +2326 0 2109 +2323 0 2139 +2324 123 2193 +2314 517 2247 +2316 765 2314 +2321 843 2393 +2340 1204 2482 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2357 1332 2518 +2332 614 2005 +2332 614 2005 +2332 614 2006 +2332 614 2007 +2332 614 2008 +2332 614 2009 +2331 614 2011 +2331 614 2014 +2331 614 2017 +2330 614 2021 +2329 614 2026 +2329 614 2035 +2329 614 2047 +2329 614 2057 +2330 670 2082 +2328 727 2109 +2321 757 2137 +2324 709 2196 +2318 901 2249 +2318 868 2316 +2319 1072 2391 +2342 1300 2483 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2357 1409 2519 +2336 924 2012 +2336 924 2013 +2336 924 2013 +2336 924 2014 +2335 924 2015 +2335 924 2017 +2335 924 2019 +2335 924 2021 +2335 924 2024 +2334 924 2029 +2333 924 2035 +2333 924 2042 +2333 924 2052 +2333 924 2063 +2333 971 2080 +2330 1020 2108 +2324 1065 2141 +2325 1052 2197 +2321 1173 2253 +2319 1077 2317 +2317 1227 2391 +2345 1377 2483 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2359 1509 2521 +2339 1291 2020 +2339 1291 2020 +2339 1290 2020 +2339 1289 2020 +2339 1288 2021 +2339 1286 2022 +2338 1283 2023 +2338 1280 2024 +2338 1276 2026 +2337 1270 2028 +2336 1267 2033 +2336 1267 2040 +2336 1269 2048 +2336 1288 2065 +2336 1315 2084 +2334 1351 2116 +2331 1343 2151 +2330 1343 2198 +2326 1378 2257 +2319 1407 2317 +2328 1414 2394 +2350 1546 2482 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2368 1608 2518 +2349 1557 2025 +2349 1557 2025 +2349 1557 2025 +2349 1557 2026 +2348 1557 2026 +2348 1557 2027 +2348 1557 2028 +2348 1557 2029 +2347 1557 2031 +2347 1554 2033 +2346 1550 2036 +2345 1548 2041 +2344 1548 2050 +2344 1550 2067 +2343 1557 2089 +2339 1571 2115 +2337 1566 2150 +2337 1567 2198 +2334 1596 2255 +2334 1620 2319 +2342 1646 2396 +2365 1717 2481 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2382 1733 2518 +2364 1776 2032 +2364 1776 2033 +2364 1776 2033 +2364 1777 2034 +2364 1778 2035 +2364 1779 2037 +2363 1781 2038 +2363 1783 2041 +2363 1786 2044 +2362 1790 2049 +2361 1791 2052 +2360 1789 2057 +2359 1784 2065 +2361 1784 2074 +2360 1788 2094 +2357 1783 2117 +2358 1792 2156 +2361 1806 2207 +2354 1805 2259 +2356 1809 2322 +2365 1822 2394 +2383 1874 2484 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2403 1889 2522 +2391 1976 2073 +2391 1976 2073 +2391 1976 2073 +2391 1976 2073 +2391 1976 2073 +2391 1976 2074 +2391 1976 2074 +2391 1976 2075 +2391 1976 2076 +2391 1976 2077 +2391 1976 2078 +2391 1976 2080 +2392 1977 2084 +2394 1981 2093 +2395 1984 2105 +2395 1984 2134 +2392 1984 2163 +2391 1984 2207 +2387 1995 2266 +2396 1995 2324 +2406 2017 2405 +2425 2038 2488 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2448 2060 2526 +2463 2177 2109 +2463 2177 2109 +2463 2177 2110 +2463 2177 2110 +2463 2177 2110 +2463 2177 2111 +2463 2178 2112 +2463 2178 2113 +2463 2179 2114 +2463 2180 2116 +2463 2181 2119 +2462 2182 2121 +2460 2183 2124 +2459 2181 2126 +2458 2177 2134 +2459 2184 2157 +2463 2186 2183 +2461 2184 2220 +2460 2188 2268 +2468 2189 2340 +2476 2191 2406 +2508 2230 2493 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2527 2237 2533 +2598 2410 2071 +2598 2410 2071 +2599 2411 2071 +2599 2411 2071 +2599 2411 2071 +2600 2412 2070 +2600 2412 2070 +2602 2413 2069 +2603 2414 2069 +2604 2416 2068 +2606 2418 2066 +2607 2419 2068 +2607 2420 2073 +2607 2420 2079 +2607 2420 2088 +2607 2420 2112 +2607 2422 2147 +2606 2422 2181 +2609 2420 2243 +2615 2426 2302 +2628 2437 2380 +2656 2458 2462 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2676 2468 2496 +2763 2702 2255 +2763 2702 2255 +2763 2702 2255 +2762 2701 2255 +2762 2701 2255 +2762 2701 2255 +2762 2701 2255 +2762 2701 2255 +2762 2701 2255 +2763 2701 2256 +2763 2701 2257 +2764 2701 2260 +2765 2701 2267 +2765 2701 2274 +2763 2702 2284 +2762 2704 2300 +2763 2706 2316 +2764 2703 2348 +2764 2703 2388 +2768 2710 2455 +2769 2717 2538 +2774 2727 2626 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2777 2731 2667 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2797 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2548 +2781 2798 2549 +2781 2798 2550 +2781 2799 2550 +2781 2799 2551 +2781 2800 2553 +2782 2800 2555 +2782 2801 2558 +2781 2801 2560 +2780 2800 2559 +2782 2800 2561 +2781 2802 2573 +2781 2801 2584 +2780 2801 2606 +2777 2799 2640 +2775 2801 2677 +2779 2810 2744 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2781 2810 2772 +2481 974 2044 +2481 973 2044 +2481 971 2044 +2481 969 2045 +2480 967 2045 +2480 963 2046 +2480 958 2047 +2480 951 2048 +2480 951 2051 +2480 951 2054 +2480 951 2058 +2480 951 2063 +2480 955 2072 +2479 992 2087 +2477 1037 2103 +2476 1071 2127 +2475 1132 2163 +2475 1219 2209 +2476 1370 2267 +2478 1392 2329 +2488 1469 2402 +2504 1610 2488 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2481 977 2044 +2481 977 2044 +2481 976 2044 +2480 974 2045 +2480 971 2045 +2480 968 2046 +2480 963 2047 +2480 956 2048 +2480 955 2051 +2480 955 2054 +2480 955 2058 +2480 955 2063 +2480 960 2072 +2479 996 2087 +2477 1041 2103 +2476 1074 2127 +2476 1133 2163 +2475 1220 2209 +2476 1373 2267 +2478 1394 2329 +2488 1469 2402 +2504 1611 2488 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2481 982 2044 +2481 982 2044 +2480 982 2044 +2480 980 2045 +2480 977 2045 +2480 974 2046 +2480 969 2047 +2480 962 2048 +2480 962 2051 +2480 962 2054 +2480 962 2058 +2480 962 2063 +2480 966 2072 +2479 1002 2087 +2477 1046 2103 +2476 1079 2127 +2476 1136 2162 +2475 1221 2209 +2476 1377 2267 +2478 1397 2329 +2488 1469 2402 +2504 1611 2488 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2481 988 2044 +2480 988 2044 +2480 988 2044 +2480 988 2045 +2480 985 2045 +2480 981 2046 +2480 977 2047 +2480 970 2048 +2480 970 2051 +2480 970 2054 +2480 970 2058 +2480 970 2063 +2480 974 2072 +2479 1010 2087 +2477 1053 2103 +2476 1085 2127 +2476 1138 2162 +2475 1222 2209 +2476 1382 2267 +2478 1400 2329 +2488 1469 2402 +2504 1612 2488 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2480 996 2044 +2480 996 2044 +2480 996 2044 +2480 996 2045 +2480 996 2045 +2480 992 2046 +2480 987 2047 +2480 981 2048 +2480 981 2051 +2480 981 2054 +2480 981 2058 +2480 981 2063 +2480 985 2072 +2479 1020 2087 +2477 1062 2103 +2476 1094 2127 +2476 1142 2162 +2476 1223 2208 +2476 1388 2268 +2478 1404 2329 +2488 1469 2402 +2504 1614 2487 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2480 1006 2044 +2480 1006 2044 +2480 1006 2044 +2480 1006 2045 +2480 1006 2045 +2480 1006 2046 +2480 1001 2047 +2479 995 2048 +2479 995 2051 +2479 995 2054 +2479 995 2058 +2479 995 2063 +2479 999 2072 +2479 1032 2087 +2477 1074 2103 +2476 1105 2127 +2476 1147 2162 +2476 1225 2208 +2476 1397 2268 +2478 1409 2329 +2488 1469 2401 +2503 1615 2487 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2519 1697 2526 +2480 1019 2044 +2480 1019 2044 +2480 1019 2044 +2480 1019 2045 +2480 1019 2045 +2480 1019 2046 +2479 1019 2047 +2479 1013 2048 +2479 1013 2051 +2479 1013 2054 +2479 1013 2058 +2479 1013 2063 +2479 1017 2072 +2479 1049 2087 +2477 1089 2103 +2475 1119 2127 +2476 1154 2161 +2476 1228 2208 +2477 1408 2268 +2477 1417 2329 +2488 1469 2401 +2503 1618 2486 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2480 1036 2044 +2480 1036 2044 +2480 1036 2044 +2480 1036 2045 +2480 1036 2045 +2479 1036 2046 +2479 1036 2047 +2479 1036 2048 +2479 1036 2051 +2479 1036 2054 +2479 1036 2058 +2479 1036 2063 +2479 1039 2072 +2478 1070 2087 +2476 1108 2103 +2475 1137 2127 +2477 1162 2161 +2476 1232 2207 +2477 1423 2268 +2477 1426 2329 +2488 1469 2401 +2503 1621 2486 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2518 1697 2526 +2480 1071 2044 +2480 1071 2044 +2480 1071 2044 +2480 1071 2045 +2480 1071 2045 +2479 1071 2046 +2479 1071 2047 +2479 1071 2048 +2479 1044 2051 +2479 1044 2054 +2479 1044 2058 +2479 1044 2063 +2479 1048 2072 +2479 1085 2087 +2477 1122 2103 +2476 1149 2126 +2478 1179 2161 +2476 1241 2208 +2477 1424 2268 +2478 1436 2329 +2488 1480 2401 +2504 1627 2485 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2519 1702 2526 +2480 1115 2044 +2480 1115 2044 +2480 1115 2044 +2480 1115 2045 +2480 1115 2045 +2479 1115 2046 +2479 1115 2047 +2479 1115 2048 +2479 1091 2051 +2479 1054 2054 +2479 1054 2058 +2479 1054 2063 +2479 1058 2072 +2479 1099 2087 +2478 1138 2103 +2476 1165 2125 +2478 1193 2160 +2477 1254 2209 +2477 1424 2266 +2479 1448 2329 +2488 1495 2401 +2504 1635 2485 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2521 1708 2526 +2480 1169 2044 +2480 1169 2044 +2480 1169 2044 +2480 1169 2045 +2480 1169 2045 +2479 1169 2046 +2479 1169 2047 +2479 1169 2048 +2479 1147 2051 +2479 1114 2054 +2479 1067 2058 +2479 1067 2063 +2479 1070 2072 +2479 1111 2087 +2479 1159 2103 +2478 1185 2125 +2480 1212 2159 +2478 1278 2209 +2477 1424 2264 +2480 1464 2329 +2488 1514 2402 +2505 1646 2485 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2523 1718 2525 +2480 1231 2044 +2480 1231 2044 +2480 1231 2044 +2480 1231 2045 +2480 1231 2045 +2479 1231 2046 +2479 1231 2047 +2479 1231 2048 +2479 1212 2051 +2479 1184 2054 +2479 1144 2058 +2479 1083 2063 +2479 1087 2072 +2479 1126 2087 +2481 1186 2103 +2479 1210 2125 +2481 1236 2158 +2479 1308 2209 +2477 1424 2262 +2481 1485 2329 +2488 1542 2402 +2507 1660 2485 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2526 1729 2524 +2480 1299 2045 +2480 1299 2045 +2480 1299 2045 +2480 1299 2046 +2480 1299 2046 +2480 1299 2047 +2480 1299 2048 +2479 1299 2049 +2479 1283 2051 +2479 1259 2054 +2479 1225 2059 +2479 1174 2064 +2479 1114 2072 +2480 1151 2087 +2481 1213 2103 +2481 1244 2125 +2483 1268 2156 +2481 1346 2209 +2477 1430 2260 +2483 1511 2329 +2489 1583 2403 +2509 1680 2486 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2529 1745 2524 +2482 1385 2049 +2482 1385 2049 +2482 1384 2049 +2482 1384 2050 +2482 1382 2050 +2482 1381 2051 +2482 1379 2052 +2481 1376 2053 +2482 1366 2055 +2482 1349 2058 +2482 1321 2063 +2482 1281 2068 +2482 1235 2076 +2482 1263 2087 +2484 1312 2103 +2484 1330 2127 +2485 1346 2157 +2483 1386 2211 +2480 1472 2262 +2483 1568 2328 +2492 1634 2404 +2509 1714 2486 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2531 1767 2524 +2484 1508 2049 +2484 1507 2049 +2484 1507 2049 +2484 1506 2050 +2484 1506 2050 +2484 1504 2051 +2483 1503 2052 +2483 1501 2053 +2483 1493 2055 +2484 1482 2058 +2485 1467 2063 +2485 1445 2068 +2485 1416 2076 +2486 1436 2087 +2488 1470 2103 +2487 1479 2127 +2487 1478 2157 +2484 1484 2208 +2487 1547 2268 +2485 1642 2328 +2495 1671 2406 +2509 1751 2486 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2531 1801 2522 +2490 1632 2052 +2490 1632 2052 +2490 1632 2053 +2490 1632 2054 +2490 1632 2054 +2490 1632 2056 +2490 1632 2057 +2490 1632 2060 +2490 1628 2062 +2491 1623 2066 +2491 1613 2070 +2492 1598 2075 +2493 1580 2082 +2492 1580 2091 +2493 1600 2105 +2492 1613 2131 +2491 1631 2162 +2489 1632 2206 +2493 1658 2265 +2493 1730 2328 +2499 1742 2404 +2518 1813 2489 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2537 1864 2526 +2502 1784 2071 +2502 1784 2071 +2502 1784 2071 +2502 1784 2072 +2502 1784 2073 +2502 1784 2073 +2502 1784 2075 +2502 1784 2077 +2502 1779 2078 +2502 1774 2081 +2503 1769 2085 +2503 1762 2090 +2504 1754 2098 +2504 1757 2107 +2503 1757 2115 +2502 1754 2140 +2499 1757 2175 +2500 1778 2215 +2501 1806 2266 +2500 1817 2326 +2509 1832 2402 +2528 1891 2490 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2547 1940 2532 +2516 1927 2075 +2516 1928 2075 +2516 1928 2075 +2516 1928 2076 +2516 1928 2076 +2517 1929 2077 +2517 1929 2078 +2517 1930 2079 +2517 1930 2081 +2516 1930 2084 +2516 1924 2087 +2515 1913 2090 +2514 1901 2096 +2516 1900 2105 +2517 1912 2120 +2515 1910 2143 +2514 1921 2180 +2513 1918 2218 +2516 1938 2272 +2518 1938 2333 +2528 1977 2406 +2552 2008 2491 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2567 2036 2526 +2547 2073 2093 +2547 2073 2093 +2547 2073 2093 +2546 2073 2093 +2546 2073 2094 +2546 2073 2094 +2545 2073 2095 +2545 2073 2096 +2545 2073 2098 +2545 2073 2100 +2545 2073 2102 +2545 2073 2106 +2545 2073 2111 +2545 2075 2119 +2543 2075 2127 +2543 2078 2149 +2543 2075 2180 +2546 2089 2222 +2546 2091 2274 +2551 2098 2337 +2558 2115 2411 +2588 2155 2491 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2598 2168 2529 +2602 2259 2099 +2602 2258 2099 +2602 2258 2099 +2602 2258 2099 +2602 2258 2099 +2601 2258 2099 +2600 2258 2099 +2600 2257 2099 +2600 2257 2101 +2600 2257 2104 +2600 2257 2108 +2600 2257 2113 +2600 2257 2120 +2603 2257 2132 +2606 2257 2144 +2606 2263 2161 +2611 2270 2190 +2606 2266 2226 +2612 2277 2289 +2615 2277 2347 +2621 2290 2414 +2651 2318 2497 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2668 2333 2527 +2722 2488 1839 +2722 2488 1839 +2722 2488 1841 +2722 2488 1843 +2723 2488 1845 +2723 2489 1848 +2724 2489 1852 +2724 2489 1858 +2724 2489 1862 +2724 2489 1867 +2724 2488 1873 +2723 2488 1876 +2723 2488 1878 +2722 2488 1891 +2722 2486 1913 +2722 2485 1956 +2723 2487 2015 +2723 2486 2070 +2727 2489 2159 +2732 2495 2242 +2745 2509 2352 +2763 2528 2453 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2772 2539 2499 +2811 2738 2425 +2811 2738 2425 +2811 2738 2426 +2811 2738 2426 +2811 2738 2426 +2811 2738 2426 +2811 2738 2427 +2811 2738 2427 +2811 2739 2428 +2811 2739 2430 +2811 2739 2431 +2811 2740 2434 +2811 2740 2437 +2811 2740 2440 +2810 2740 2444 +2810 2740 2448 +2811 2742 2464 +2810 2743 2483 +2810 2745 2522 +2810 2748 2564 +2811 2752 2623 +2810 2762 2701 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2813 2763 2731 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2591 +2820 2813 2590 +2820 2813 2590 +2820 2813 2589 +2820 2812 2589 +2820 2813 2590 +2820 2813 2591 +2820 2813 2592 +2820 2813 2593 +2820 2814 2596 +2819 2814 2598 +2818 2813 2599 +2820 2813 2604 +2822 2813 2612 +2820 2813 2623 +2820 2815 2643 +2818 2815 2670 +2818 2817 2713 +2813 2819 2768 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2814 2823 2799 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2554 1623 2059 +2554 1623 2059 +2554 1623 2060 +2554 1623 2060 +2554 1623 2061 +2554 1623 2063 +2554 1623 2065 +2554 1623 2067 +2554 1623 2070 +2554 1623 2074 +2554 1623 2080 +2554 1623 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2555 1588 2133 +2556 1555 2169 +2555 1608 2217 +2557 1691 2269 +2563 1692 2342 +2564 1761 2409 +2587 1838 2491 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1625 2059 +2554 1624 2059 +2554 1624 2060 +2554 1624 2060 +2554 1624 2061 +2554 1624 2063 +2554 1624 2064 +2554 1624 2067 +2554 1624 2070 +2554 1624 2074 +2554 1624 2080 +2554 1624 2087 +2554 1621 2096 +2554 1621 2102 +2554 1621 2110 +2556 1590 2134 +2556 1556 2169 +2555 1609 2217 +2557 1691 2269 +2563 1692 2342 +2564 1762 2409 +2587 1839 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1627 2059 +2554 1626 2059 +2554 1625 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2063 +2554 1625 2064 +2554 1625 2067 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1622 2096 +2554 1621 2102 +2554 1621 2110 +2556 1592 2134 +2556 1559 2169 +2555 1610 2217 +2557 1691 2269 +2564 1693 2342 +2564 1764 2409 +2587 1840 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1630 2060 +2554 1629 2060 +2554 1627 2060 +2554 1625 2060 +2554 1625 2061 +2554 1625 2062 +2554 1625 2064 +2554 1625 2066 +2554 1625 2070 +2554 1625 2074 +2554 1625 2079 +2554 1625 2086 +2554 1623 2095 +2554 1621 2102 +2554 1621 2110 +2556 1595 2134 +2556 1562 2169 +2555 1611 2217 +2557 1691 2270 +2564 1694 2342 +2564 1765 2409 +2587 1842 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1633 2060 +2554 1632 2060 +2554 1631 2060 +2554 1629 2060 +2554 1626 2061 +2554 1626 2062 +2554 1626 2064 +2554 1626 2066 +2554 1626 2069 +2554 1626 2073 +2554 1626 2079 +2554 1626 2086 +2554 1625 2095 +2554 1621 2102 +2554 1621 2110 +2556 1599 2135 +2556 1567 2169 +2555 1613 2217 +2557 1692 2270 +2564 1695 2342 +2565 1768 2409 +2587 1844 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2554 1638 2061 +2554 1638 2061 +2554 1636 2061 +2554 1634 2061 +2554 1631 2061 +2554 1628 2062 +2554 1628 2063 +2554 1628 2066 +2554 1628 2069 +2554 1628 2073 +2554 1628 2079 +2554 1628 2086 +2554 1626 2095 +2554 1621 2102 +2554 1621 2110 +2556 1605 2135 +2556 1572 2169 +2555 1616 2217 +2557 1693 2270 +2564 1696 2342 +2565 1771 2409 +2587 1847 2492 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2597 1897 2530 +2555 1645 2062 +2555 1644 2062 +2555 1643 2062 +2555 1641 2062 +2555 1638 2062 +2555 1635 2063 +2555 1631 2063 +2555 1631 2066 +2555 1631 2069 +2555 1631 2073 +2555 1631 2078 +2555 1631 2085 +2555 1628 2094 +2554 1621 2102 +2554 1621 2110 +2556 1612 2136 +2556 1580 2169 +2554 1619 2217 +2558 1694 2270 +2564 1698 2342 +2565 1775 2409 +2587 1852 2492 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2555 1654 2063 +2555 1653 2063 +2555 1651 2063 +2555 1650 2063 +2555 1647 2063 +2555 1644 2064 +2555 1640 2064 +2555 1633 2065 +2555 1633 2068 +2555 1633 2072 +2555 1633 2078 +2555 1633 2085 +2555 1631 2094 +2554 1621 2102 +2554 1621 2110 +2556 1621 2137 +2557 1590 2169 +2554 1624 2217 +2558 1695 2270 +2564 1701 2342 +2565 1781 2409 +2588 1857 2493 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2597 1897 2529 +2556 1665 2064 +2556 1664 2065 +2556 1663 2065 +2556 1661 2065 +2556 1659 2065 +2556 1655 2066 +2556 1651 2066 +2556 1646 2066 +2556 1638 2067 +2556 1638 2071 +2556 1638 2077 +2556 1638 2084 +2556 1636 2093 +2554 1621 2102 +2554 1621 2110 +2556 1633 2138 +2557 1603 2169 +2554 1630 2217 +2558 1697 2271 +2564 1704 2342 +2565 1788 2409 +2588 1860 2493 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2597 1897 2528 +2556 1680 2066 +2556 1679 2067 +2556 1678 2067 +2556 1676 2067 +2556 1674 2067 +2556 1671 2068 +2556 1667 2068 +2556 1661 2069 +2556 1653 2069 +2556 1643 2070 +2556 1643 2076 +2556 1643 2083 +2556 1641 2092 +2554 1624 2101 +2554 1621 2110 +2557 1649 2140 +2557 1620 2170 +2554 1638 2217 +2558 1699 2271 +2565 1709 2342 +2566 1798 2409 +2589 1863 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2558 1699 2069 +2558 1698 2069 +2558 1697 2070 +2558 1695 2070 +2558 1693 2070 +2558 1690 2070 +2558 1686 2071 +2558 1681 2071 +2558 1674 2072 +2558 1663 2073 +2558 1650 2074 +2558 1650 2082 +2557 1648 2091 +2555 1631 2100 +2554 1621 2110 +2557 1657 2141 +2558 1642 2173 +2554 1658 2217 +2559 1702 2273 +2565 1715 2342 +2566 1810 2409 +2589 1868 2493 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2597 1897 2527 +2559 1723 2073 +2559 1723 2073 +2559 1722 2073 +2559 1720 2073 +2559 1718 2074 +2559 1715 2074 +2559 1711 2074 +2559 1706 2075 +2559 1699 2076 +2559 1690 2077 +2559 1677 2078 +2559 1659 2080 +2558 1657 2089 +2556 1641 2098 +2554 1621 2110 +2557 1657 2141 +2558 1669 2176 +2555 1684 2217 +2560 1706 2274 +2566 1723 2342 +2567 1816 2409 +2591 1873 2493 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2597 1897 2525 +2560 1754 2078 +2560 1754 2078 +2560 1753 2078 +2560 1752 2079 +2560 1750 2079 +2560 1747 2079 +2560 1744 2080 +2560 1739 2080 +2560 1732 2081 +2560 1724 2082 +2560 1712 2083 +2560 1695 2085 +2560 1674 2088 +2558 1658 2097 +2555 1635 2110 +2557 1661 2141 +2559 1703 2179 +2556 1716 2217 +2560 1716 2275 +2566 1739 2342 +2568 1818 2408 +2592 1880 2493 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2597 1898 2524 +2562 1761 2078 +2562 1761 2078 +2562 1761 2079 +2562 1762 2080 +2562 1763 2080 +2562 1765 2082 +2562 1766 2084 +2562 1769 2086 +2562 1772 2089 +2563 1771 2091 +2563 1760 2093 +2563 1745 2094 +2562 1727 2097 +2561 1712 2103 +2558 1692 2116 +2556 1693 2138 +2560 1738 2181 +2560 1744 2217 +2561 1744 2275 +2566 1785 2340 +2571 1835 2406 +2592 1893 2492 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2599 1908 2527 +2563 1769 2078 +2563 1769 2078 +2563 1770 2079 +2563 1771 2080 +2563 1772 2080 +2563 1773 2082 +2564 1775 2084 +2564 1777 2086 +2564 1780 2089 +2564 1784 2093 +2565 1789 2098 +2565 1796 2105 +2566 1789 2110 +2564 1776 2116 +2563 1758 2124 +2559 1753 2143 +2558 1773 2177 +2563 1787 2220 +2563 1779 2275 +2566 1840 2337 +2576 1860 2406 +2591 1925 2491 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2602 1920 2530 +2566 1822 2077 +2566 1822 2078 +2566 1822 2078 +2566 1822 2078 +2566 1822 2079 +2566 1822 2079 +2566 1822 2080 +2566 1822 2081 +2566 1822 2083 +2566 1822 2085 +2567 1824 2089 +2568 1831 2096 +2568 1839 2106 +2570 1844 2121 +2568 1834 2131 +2568 1813 2145 +2564 1813 2176 +2565 1838 2221 +2568 1838 2272 +2573 1888 2337 +2580 1896 2406 +2599 1967 2492 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2609 1966 2529 +2573 1894 2080 +2573 1894 2081 +2573 1895 2081 +2573 1896 2081 +2573 1897 2082 +2574 1898 2082 +2574 1900 2083 +2575 1903 2084 +2575 1906 2086 +2575 1906 2088 +2575 1906 2090 +2575 1906 2094 +2575 1906 2099 +2575 1907 2109 +2576 1913 2129 +2577 1915 2152 +2578 1893 2171 +2576 1899 2221 +2578 1919 2273 +2580 1949 2338 +2587 1961 2408 +2611 2008 2495 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2623 2041 2528 +2588 1996 2083 +2588 1997 2083 +2588 1997 2084 +2588 1997 2085 +2588 1997 2086 +2588 1998 2087 +2588 1998 2088 +2588 1999 2091 +2588 2000 2093 +2588 2001 2098 +2588 2005 2100 +2589 2012 2104 +2591 2018 2108 +2588 2010 2114 +2588 2009 2126 +2589 2014 2149 +2590 2016 2184 +2591 2003 2214 +2591 2019 2275 +2595 2044 2342 +2604 2072 2411 +2625 2108 2494 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2644 2138 2530 +2625 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2149 2111 +2624 2148 2111 +2624 2148 2111 +2623 2147 2111 +2623 2146 2111 +2622 2145 2111 +2621 2143 2111 +2620 2141 2111 +2618 2137 2111 +2617 2136 2114 +2617 2144 2126 +2617 2155 2141 +2619 2157 2164 +2623 2160 2195 +2624 2165 2231 +2619 2165 2275 +2633 2187 2352 +2638 2190 2417 +2660 2223 2503 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2672 2249 2537 +2670 2315 2112 +2671 2315 2112 +2671 2315 2112 +2671 2315 2111 +2671 2316 2111 +2672 2316 2111 +2672 2316 2111 +2673 2317 2110 +2674 2318 2109 +2675 2319 2108 +2677 2321 2107 +2680 2323 2105 +2682 2325 2106 +2681 2325 2118 +2680 2325 2133 +2678 2328 2149 +2677 2328 2176 +2677 2325 2215 +2687 2335 2275 +2689 2335 2316 +2695 2346 2391 +2724 2369 2462 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2735 2385 2488 +2775 2531 1744 +2775 2531 1745 +2775 2531 1747 +2775 2531 1750 +2776 2532 1753 +2776 2532 1758 +2776 2533 1764 +2776 2533 1772 +2777 2534 1782 +2778 2535 1796 +2778 2536 1813 +2778 2537 1825 +2777 2535 1833 +2776 2530 1839 +2776 2528 1859 +2778 2535 1929 +2779 2534 1991 +2780 2535 2071 +2782 2538 2158 +2784 2536 2248 +2791 2552 2360 +2803 2569 2485 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2813 2581 2533 +2826 2762 2506 +2826 2762 2506 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2762 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2505 +2826 2761 2506 +2826 2761 2507 +2826 2761 2509 +2826 2761 2510 +2826 2760 2508 +2826 2760 2508 +2826 2762 2520 +2826 2764 2535 +2826 2763 2548 +2826 2763 2571 +2826 2767 2613 +2826 2769 2662 +2826 2779 2732 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2784 2763 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2623 +2826 2823 2625 +2826 2823 2628 +2826 2822 2631 +2826 2821 2638 +2826 2822 2651 +2826 2823 2668 +2826 2819 2690 +2826 2823 2740 +2826 2825 2794 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 +2826 2826 2819 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.azasset b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.azasset new file mode 100644 index 0000000000..92f5a49363 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_clt_32_LUT.azasset @@ -0,0 +1,32777 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1084, +0, 0, 1291, +0, 0, 1472, +0, 0, 1634, +361, 0, 1771, +1145, 0, 1881, +1561, 0, 2006, +1561, 0, 2154, +432, 987, 2341, +1228, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 54, +0, 0, 173, +0, 0, 295, +0, 0, 419, +0, 0, 545, +0, 0, 673, +0, 0, 802, +0, 0, 932, +0, 0, 1087, +0, 0, 1293, +0, 0, 1473, +0, 0, 1635, +370, 0, 1772, +1144, 0, 1882, +1559, 0, 2006, +1558, 0, 2154, +428, 992, 2341, +1232, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 87, +0, 0, 198, +0, 0, 315, +0, 0, 434, +0, 0, 557, +0, 0, 682, +0, 0, 809, +0, 0, 937, +0, 0, 1091, +0, 0, 1295, +0, 0, 1474, +0, 0, 1635, +381, 0, 1773, +1143, 0, 1883, +1556, 0, 2007, +1554, 0, 2155, +423, 998, 2341, +1238, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 31, +0, 0, 127, +0, 0, 230, +0, 0, 340, +0, 0, 454, +0, 0, 572, +0, 0, 693, +0, 0, 817, +0, 0, 943, +0, 0, 1095, +0, 0, 1298, +0, 0, 1476, +0, 0, 1636, +395, 0, 1774, +1142, 0, 1883, +1552, 0, 2008, +1548, 0, 2156, +416, 1005, 2342, +1246, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 31, +0, 0, 176, +0, 0, 270, +0, 0, 371, +0, 0, 478, +0, 0, 591, +0, 0, 708, +0, 0, 828, +0, 0, 952, +0, 0, 1101, +0, 0, 1302, +0, 0, 1479, +0, 0, 1637, +414, 0, 1775, +1140, 0, 1884, +1547, 0, 2010, +1540, 58, 2158, +407, 1015, 2342, +1257, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 31, +0, 7, 176, +0, 63, 318, +0, 63, 410, +0, 63, 509, +0, 63, 615, +0, 63, 727, +0, 63, 843, +0, 63, 963, +0, 103, 1109, +0, 30, 1307, +0, 30, 1482, +0, 3, 1639, +438, 0, 1777, +1137, 0, 1886, +1539, 0, 2011, +1530, 197, 2160, +394, 1028, 2343, +1270, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 23, 0, +0, 47, 0, +0, 77, 31, +0, 114, 176, +0, 159, 318, +0, 214, 457, +0, 214, 548, +0, 214, 646, +0, 214, 751, +0, 214, 862, +0, 214, 977, +0, 243, 1120, +0, 163, 1314, +0, 163, 1487, +0, 142, 1641, +468, 0, 1779, +1134, 0, 1888, +1530, 32, 2014, +1515, 333, 2163, +376, 1045, 2344, +1287, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 157, 0, +0, 175, 0, +0, 198, 31, +0, 227, 176, +0, 262, 318, +0, 306, 457, +0, 359, 595, +0, 359, 684, +0, 359, 782, +0, 359, 886, +0, 359, 996, +0, 380, 1134, +0, 295, 1323, +0, 295, 1494, +0, 280, 1644, +506, 122, 1783, +1129, 0, 1891, +1516, 164, 2017, +1495, 469, 2167, +352, 1066, 2345, +1309, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 291, 0, +0, 304, 0, +0, 322, 31, +0, 344, 176, +0, 371, 318, +0, 406, 457, +0, 449, 595, +0, 501, 730, +0, 501, 819, +0, 501, 916, +0, 501, 1020, +0, 516, 1151, +0, 426, 1335, +0, 426, 1502, +0, 415, 1648, +552, 265, 1787, +1123, 111, 1894, +1498, 296, 2021, +1467, 603, 2172, +317, 1093, 2347, +1348, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 424, 0, +0, 434, 0, +0, 447, 31, +0, 464, 176, +0, 486, 318, +0, 513, 457, +0, 547, 595, +0, 589, 730, +0, 640, 865, +0, 640, 954, +0, 640, 1050, +0, 651, 1174, +0, 570, 1350, +0, 559, 1512, +0, 550, 1653, +556, 441, 1791, +1115, 244, 1898, +1471, 428, 2027, +1426, 737, 2178, +265, 1128, 2349, +1396, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 557, 0, +0, 565, 0, +0, 575, 31, +0, 587, 176, +0, 604, 318, +0, 625, 457, +0, 652, 595, +0, 686, 730, +0, 727, 865, +0, 777, 1000, +0, 777, 1088, +0, 786, 1203, +0, 726, 1370, +0, 691, 1526, +0, 685, 1662, +556, 606, 1796, +1132, 422, 1904, +1434, 560, 2035, +1365, 871, 2187, +186, 1169, 2352, +1454, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 690, 0, +0, 696, 0, +0, 703, 31, +0, 713, 176, +0, 726, 318, +0, 742, 457, +0, 763, 595, +0, 789, 730, +0, 823, 865, +0, 864, 1000, +0, 913, 1133, +0, 920, 1239, +0, 876, 1395, +0, 823, 1544, +0, 818, 1675, +556, 761, 1803, +1160, 593, 1912, +1378, 692, 2045, +1267, 1004, 2199, +0, 1212, 2357, +1520, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 857, 100, +0, 857, 131, +0, 861, 202, +0, 866, 282, +0, 873, 371, +0, 882, 468, +0, 894, 573, +0, 909, 683, +0, 928, 797, +0, 953, 916, +0, 984, 1038, +0, 1023, 1162, +0, 1061, 1287, +0, 1030, 1430, +0, 984, 1569, +0, 971, 1697, +566, 941, 1817, +1178, 799, 1926, +1302, 849, 2057, +1119, 1137, 2212, +0, 1255, 2365, +1585, 801, 2470, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +1738, 957, 2513, +0, 1184, 1027, +0, 1184, 1031, +0, 1184, 1036, +0, 1184, 1043, +0, 1184, 1052, +0, 1184, 1064, +0, 1184, 1080, +0, 1184, 1099, +0, 1184, 1125, +0, 1190, 1168, +0, 1209, 1242, +0, 1232, 1325, +0, 1257, 1416, +0, 1237, 1493, +0, 1209, 1617, +0, 1222, 1740, +636, 1187, 1854, +1040, 1131, 1961, +1243, 1131, 2080, +1031, 1271, 2224, +472, 1312, 2372, +1588, 1032, 2472, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +1765, 1144, 2512, +0, 1421, 1377, +0, 1421, 1379, +0, 1421, 1382, +0, 1421, 1385, +0, 1421, 1389, +0, 1421, 1395, +0, 1421, 1402, +0, 1421, 1412, +0, 1421, 1425, +0, 1421, 1442, +0, 1421, 1463, +0, 1421, 1491, +0, 1432, 1546, +0, 1418, 1604, +0, 1399, 1673, +0, 1412, 1786, +636, 1404, 1895, +1048, 1353, 1999, +1151, 1350, 2110, +878, 1405, 2240, +666, 1388, 2378, +1601, 1209, 2473, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +1799, 1314, 2510, +901, 1580, 1648, +901, 1579, 1649, +901, 1579, 1650, +901, 1579, 1652, +901, 1578, 1655, +901, 1577, 1658, +901, 1576, 1662, +901, 1574, 1668, +901, 1572, 1675, +901, 1569, 1685, +901, 1567, 1698, +901, 1567, 1714, +886, 1567, 1736, +886, 1577, 1788, +886, 1569, 1838, +890, 1552, 1888, +807, 1557, 1969, +921, 1536, 2067, +942, 1537, 2170, +810, 1524, 2268, +1125, 1501, 2382, +1680, 1435, 2473, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1845, 1472, 2509, +1449, 1705, 1856, +1448, 1705, 1856, +1447, 1705, 1857, +1446, 1705, 1859, +1444, 1705, 1860, +1441, 1705, 1862, +1438, 1705, 1865, +1433, 1705, 1868, +1427, 1705, 1873, +1426, 1703, 1880, +1426, 1700, 1888, +1426, 1696, 1899, +1423, 1691, 1913, +1400, 1685, 1931, +1400, 1696, 1976, +1370, 1702, 2022, +1371, 1685, 2062, +1192, 1672, 2128, +1127, 1678, 2221, +1173, 1647, 2295, +1519, 1631, 2386, +1775, 1634, 2475, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1785, 1818, 1978, +1786, 1818, 1978, +1786, 1818, 1979, +1786, 1818, 1980, +1786, 1818, 1981, +1787, 1818, 1982, +1788, 1818, 1983, +1789, 1818, 1986, +1790, 1818, 1988, +1792, 1818, 1992, +1788, 1818, 1998, +1781, 1818, 2007, +1772, 1818, 2018, +1752, 1824, 2037, +1733, 1818, 2052, +1727, 1802, 2080, +1685, 1816, 2123, +1705, 1809, 2166, +1657, 1793, 2234, +1664, 1793, 2304, +1754, 1797, 2389, +1874, 1790, 2475, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1958, 1958, 2028, +1957, 1958, 2029, +1957, 1958, 2029, +1957, 1958, 2030, +1956, 1958, 2031, +1956, 1958, 2031, +1956, 1958, 2033, +1955, 1958, 2035, +1954, 1958, 2037, +1953, 1958, 2041, +1951, 1958, 2045, +1948, 1958, 2051, +1946, 1958, 2058, +1941, 1962, 2068, +1935, 1968, 2081, +1927, 1969, 2115, +1913, 1965, 2153, +1905, 1963, 2189, +1920, 1969, 2243, +1881, 1969, 2320, +1929, 1954, 2391, +2032, 1964, 2481, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2093, 1969, 2517, +2119, 2119, 2068, +2119, 2119, 2068, +2119, 2119, 2068, +2119, 2120, 2069, +2119, 2120, 2069, +2119, 2120, 2071, +2119, 2120, 2072, +2119, 2121, 2073, +2119, 2122, 2076, +2119, 2122, 2079, +2119, 2124, 2083, +2119, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2115, 2131, 2133, +2108, 2133, 2164, +2103, 2131, 2206, +2110, 2135, 2256, +2119, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2369, 2356, 2125, +2369, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2367, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2368, 2358, 2163, +2370, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2383, 2356, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2654, 1964, +2681, 2654, 1965, +2681, 2654, 1966, +2681, 2654, 1968, +2681, 2654, 1967, +2681, 2654, 1965, +2680, 2653, 1964, +2680, 2653, 1961, +2679, 2652, 1961, +2678, 2653, 1968, +2677, 2654, 1989, +2676, 2653, 2013, +2675, 2649, 2032, +2677, 2655, 2124, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2667, 2410, +2715, 2678, 2527, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2773, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1088, +0, 0, 1293, +0, 0, 1473, +0, 0, 1634, +398, 0, 1772, +1148, 0, 1882, +1561, 0, 2006, +1560, 0, 2154, +428, 987, 2341, +1231, 619, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 36, +0, 0, 159, +0, 0, 285, +0, 0, 412, +0, 0, 540, +0, 0, 669, +0, 0, 799, +0, 0, 930, +0, 0, 1089, +0, 0, 1294, +0, 0, 1474, +0, 0, 1635, +378, 0, 1771, +1147, 0, 1882, +1561, 0, 2006, +1559, 0, 2154, +428, 992, 2341, +1235, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 71, +0, 0, 186, +0, 0, 305, +0, 0, 427, +0, 0, 551, +0, 0, 678, +0, 0, 805, +0, 0, 935, +0, 0, 1092, +0, 0, 1296, +0, 0, 1475, +0, 0, 1635, +389, 0, 1772, +1146, 0, 1883, +1558, 0, 2007, +1555, 0, 2155, +423, 998, 2341, +1241, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 13, +0, 0, 112, +0, 0, 219, +0, 0, 330, +0, 0, 446, +0, 0, 566, +0, 0, 689, +0, 0, 814, +0, 0, 941, +0, 0, 1097, +0, 0, 1299, +0, 0, 1477, +0, 0, 1636, +403, 0, 1773, +1145, 0, 1884, +1554, 0, 2008, +1549, 0, 2156, +416, 1005, 2342, +1249, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 13, +0, 0, 163, +0, 0, 259, +0, 0, 363, +0, 0, 472, +0, 0, 586, +0, 0, 704, +0, 0, 825, +0, 0, 949, +0, 0, 1103, +0, 0, 1303, +0, 0, 1480, +0, 0, 1637, +422, 0, 1775, +1143, 0, 1884, +1548, 0, 2010, +1541, 50, 2158, +407, 1015, 2342, +1259, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 13, +0, 0, 163, +0, 38, 309, +0, 38, 402, +0, 38, 503, +0, 38, 610, +0, 38, 723, +0, 38, 840, +0, 38, 961, +0, 102, 1111, +0, 30, 1308, +0, 30, 1483, +0, 0, 1639, +445, 0, 1776, +1140, 0, 1886, +1541, 0, 2011, +1531, 190, 2160, +394, 1028, 2343, +1272, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 20, 0, +0, 52, 13, +0, 91, 163, +0, 139, 309, +0, 195, 450, +0, 195, 542, +0, 195, 641, +0, 195, 748, +0, 195, 859, +0, 195, 975, +0, 242, 1121, +0, 163, 1315, +0, 163, 1488, +0, 135, 1641, +475, 0, 1779, +1137, 0, 1888, +1532, 32, 2014, +1516, 329, 2163, +376, 1045, 2344, +1289, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 155, 0, +0, 179, 13, +0, 209, 163, +0, 246, 309, +0, 291, 450, +0, 346, 589, +0, 346, 680, +0, 346, 778, +0, 346, 883, +0, 346, 994, +0, 380, 1135, +0, 295, 1324, +0, 295, 1494, +0, 274, 1644, +512, 108, 1782, +1133, 0, 1891, +1518, 164, 2017, +1496, 465, 2167, +352, 1066, 2345, +1311, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 289, 0, +0, 307, 13, +0, 330, 163, +0, 359, 309, +0, 394, 450, +0, 438, 589, +0, 491, 727, +0, 491, 816, +0, 491, 914, +0, 491, 1018, +0, 516, 1153, +0, 426, 1336, +0, 426, 1502, +0, 412, 1648, +557, 254, 1787, +1126, 111, 1894, +1500, 296, 2021, +1468, 601, 2172, +317, 1093, 2347, +1350, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 423, 0, +0, 437, 13, +0, 454, 163, +0, 476, 309, +0, 504, 450, +0, 539, 589, +0, 581, 727, +0, 633, 862, +0, 633, 952, +0, 633, 1049, +0, 651, 1176, +0, 570, 1351, +0, 559, 1513, +0, 547, 1653, +561, 434, 1790, +1118, 244, 1898, +1474, 428, 2027, +1427, 736, 2178, +265, 1128, 2349, +1398, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 557, 0, +0, 566, 13, +0, 579, 163, +0, 596, 309, +0, 618, 450, +0, 645, 589, +0, 679, 727, +0, 721, 862, +0, 772, 997, +0, 772, 1086, +0, 785, 1204, +0, 726, 1371, +0, 691, 1527, +0, 682, 1662, +561, 601, 1796, +1135, 422, 1904, +1436, 560, 2035, +1366, 869, 2187, +186, 1169, 2352, +1455, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 690, 0, +0, 697, 13, +0, 707, 163, +0, 720, 309, +0, 736, 450, +0, 758, 589, +0, 784, 727, +0, 818, 862, +0, 859, 997, +0, 909, 1132, +0, 919, 1240, +0, 876, 1396, +0, 823, 1545, +0, 817, 1675, +561, 758, 1802, +1163, 593, 1912, +1381, 692, 2045, +1269, 1003, 2199, +0, 1212, 2357, +1522, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 858, 201, +0, 863, 282, +0, 870, 371, +0, 879, 468, +0, 891, 572, +0, 906, 682, +0, 925, 797, +0, 950, 916, +0, 981, 1038, +0, 1020, 1162, +0, 1060, 1288, +0, 1029, 1430, +0, 983, 1570, +0, 969, 1697, +572, 942, 1817, +1182, 800, 1926, +1302, 849, 2057, +1120, 1137, 2212, +0, 1254, 2365, +1585, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +0, 1183, 1025, +0, 1183, 1031, +0, 1183, 1036, +0, 1183, 1043, +0, 1183, 1052, +0, 1183, 1064, +0, 1183, 1080, +0, 1183, 1099, +0, 1183, 1125, +0, 1188, 1168, +0, 1207, 1242, +0, 1231, 1325, +0, 1257, 1417, +0, 1236, 1493, +0, 1208, 1617, +0, 1221, 1741, +640, 1187, 1855, +1045, 1132, 1961, +1243, 1131, 2080, +1031, 1271, 2225, +498, 1311, 2371, +1589, 1031, 2471, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +1765, 1143, 2512, +0, 1421, 1376, +0, 1421, 1379, +0, 1421, 1382, +0, 1421, 1385, +0, 1421, 1389, +0, 1421, 1395, +0, 1421, 1402, +0, 1421, 1412, +0, 1421, 1425, +0, 1421, 1442, +0, 1421, 1463, +0, 1421, 1491, +0, 1431, 1546, +0, 1417, 1605, +0, 1399, 1673, +0, 1411, 1786, +640, 1405, 1896, +1052, 1353, 1999, +1151, 1350, 2110, +878, 1405, 2240, +684, 1387, 2378, +1602, 1208, 2473, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +1799, 1313, 2510, +913, 1579, 1648, +912, 1579, 1649, +912, 1579, 1651, +912, 1579, 1653, +912, 1578, 1655, +912, 1577, 1658, +912, 1576, 1662, +912, 1574, 1668, +912, 1572, 1675, +912, 1569, 1685, +912, 1567, 1698, +912, 1567, 1714, +892, 1567, 1736, +891, 1577, 1788, +891, 1569, 1838, +896, 1552, 1889, +818, 1557, 1970, +929, 1536, 2067, +946, 1537, 2170, +810, 1524, 2268, +1128, 1500, 2382, +1680, 1435, 2473, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1450, 1705, 1856, +1449, 1705, 1856, +1448, 1705, 1857, +1446, 1705, 1859, +1444, 1705, 1860, +1442, 1705, 1862, +1439, 1705, 1865, +1434, 1705, 1868, +1427, 1705, 1873, +1427, 1703, 1880, +1427, 1700, 1888, +1427, 1696, 1899, +1424, 1691, 1913, +1401, 1685, 1931, +1401, 1696, 1976, +1370, 1701, 2022, +1372, 1685, 2062, +1195, 1672, 2128, +1129, 1678, 2221, +1176, 1647, 2295, +1520, 1631, 2386, +1776, 1634, 2475, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1894, 1629, 2511, +1786, 1817, 1978, +1786, 1817, 1978, +1786, 1817, 1979, +1786, 1817, 1980, +1787, 1817, 1981, +1787, 1817, 1982, +1788, 1817, 1983, +1789, 1817, 1986, +1790, 1817, 1988, +1793, 1817, 1992, +1789, 1817, 1998, +1782, 1817, 2007, +1772, 1818, 2018, +1753, 1824, 2036, +1733, 1818, 2052, +1727, 1803, 2080, +1686, 1816, 2123, +1706, 1808, 2166, +1658, 1793, 2234, +1664, 1793, 2304, +1754, 1797, 2389, +1874, 1790, 2475, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1964, 1800, 2514, +1958, 1958, 2028, +1958, 1958, 2029, +1957, 1958, 2029, +1957, 1958, 2030, +1957, 1958, 2031, +1956, 1958, 2031, +1956, 1958, 2033, +1955, 1958, 2035, +1954, 1958, 2037, +1953, 1958, 2041, +1951, 1958, 2045, +1948, 1958, 2051, +1946, 1958, 2058, +1941, 1962, 2068, +1936, 1968, 2081, +1927, 1969, 2115, +1913, 1965, 2153, +1905, 1963, 2189, +1920, 1969, 2243, +1881, 1968, 2320, +1929, 1954, 2392, +2033, 1964, 2481, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2120, 2120, 2070, +2120, 2120, 2072, +2120, 2121, 2073, +2120, 2122, 2076, +2120, 2122, 2079, +2120, 2124, 2083, +2120, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2115, 2131, 2133, +2109, 2133, 2164, +2103, 2131, 2206, +2111, 2135, 2256, +2119, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2356, 2125, +2369, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2367, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2368, 2358, 2163, +2370, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2383, 2356, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2654, 1965, +2681, 2654, 1966, +2681, 2654, 1968, +2681, 2654, 1967, +2681, 2654, 1966, +2680, 2653, 1964, +2680, 2653, 1962, +2679, 2652, 1962, +2678, 2653, 1969, +2677, 2654, 1990, +2676, 2653, 2014, +2675, 2650, 2033, +2677, 2655, 2124, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2667, 2410, +2715, 2678, 2527, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2709, 2773, 2484, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1088, +0, 0, 1296, +0, 0, 1475, +0, 0, 1634, +445, 0, 1772, +1152, 0, 1882, +1561, 0, 2006, +1559, 0, 2155, +423, 987, 2341, +1234, 615, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 36, +0, 0, 159, +0, 0, 285, +0, 0, 412, +0, 0, 540, +0, 0, 669, +0, 0, 799, +0, 0, 930, +0, 0, 1089, +0, 0, 1297, +0, 0, 1475, +0, 0, 1635, +426, 0, 1772, +1151, 0, 1882, +1561, 0, 2007, +1558, 0, 2155, +423, 992, 2341, +1238, 618, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 48, +0, 0, 168, +0, 0, 291, +0, 0, 417, +0, 0, 544, +0, 0, 672, +0, 0, 801, +0, 0, 931, +0, 0, 1090, +0, 0, 1298, +0, 0, 1476, +0, 0, 1635, +400, 0, 1772, +1150, 0, 1883, +1560, 0, 2007, +1556, 0, 2155, +423, 998, 2341, +1244, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 92, +0, 0, 203, +0, 0, 318, +0, 0, 437, +0, 0, 559, +0, 0, 683, +0, 0, 810, +0, 0, 938, +0, 0, 1094, +0, 0, 1300, +0, 0, 1478, +0, 0, 1636, +414, 0, 1773, +1149, 0, 1884, +1556, 0, 2008, +1550, 0, 2156, +416, 1005, 2342, +1252, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 145, +0, 0, 245, +0, 0, 351, +0, 0, 462, +0, 0, 579, +0, 0, 699, +0, 0, 821, +0, 0, 946, +0, 0, 1101, +0, 0, 1304, +0, 0, 1481, +0, 0, 1637, +432, 0, 1774, +1147, 0, 1885, +1551, 0, 2010, +1543, 38, 2158, +407, 1015, 2342, +1262, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 145, +0, 1, 295, +0, 1, 391, +0, 1, 494, +0, 1, 604, +0, 1, 718, +0, 1, 836, +0, 1, 958, +0, 70, 1109, +0, 30, 1310, +0, 30, 1484, +0, 0, 1639, +455, 0, 1776, +1144, 0, 1886, +1544, 0, 2012, +1532, 182, 2160, +394, 1028, 2343, +1275, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 0, 0, +0, 16, 0, +0, 58, 145, +0, 109, 295, +0, 170, 441, +0, 170, 534, +0, 170, 635, +0, 170, 742, +0, 170, 855, +0, 170, 973, +0, 218, 1119, +0, 163, 1316, +0, 163, 1489, +0, 126, 1641, +484, 0, 1778, +1141, 0, 1888, +1534, 32, 2014, +1518, 322, 2163, +376, 1045, 2344, +1292, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 127, 0, +0, 152, 0, +0, 184, 145, +0, 223, 295, +0, 271, 441, +0, 327, 582, +0, 327, 674, +0, 327, 773, +0, 327, 879, +0, 327, 991, +0, 363, 1133, +0, 295, 1325, +0, 295, 1495, +0, 267, 1644, +520, 87, 1782, +1137, 0, 1891, +1521, 164, 2017, +1498, 461, 2167, +352, 1066, 2345, +1314, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 269, 0, +0, 287, 0, +0, 311, 145, +0, 341, 295, +0, 378, 441, +0, 423, 582, +0, 478, 721, +0, 478, 812, +0, 478, 910, +0, 478, 1016, +0, 503, 1151, +0, 426, 1337, +0, 426, 1503, +0, 406, 1648, +565, 239, 1786, +1131, 111, 1894, +1503, 296, 2022, +1470, 597, 2172, +317, 1093, 2347, +1353, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 408, 0, +0, 422, 0, +0, 439, 145, +0, 462, 295, +0, 491, 441, +0, 527, 582, +0, 570, 721, +0, 623, 859, +0, 623, 948, +0, 623, 1046, +0, 642, 1174, +0, 570, 1352, +0, 559, 1514, +0, 544, 1653, +569, 424, 1790, +1123, 244, 1899, +1477, 428, 2027, +1429, 733, 2178, +265, 1128, 2349, +1400, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 545, 0, +0, 555, 0, +0, 568, 145, +0, 586, 295, +0, 608, 441, +0, 636, 582, +0, 670, 721, +0, 713, 859, +0, 765, 995, +0, 765, 1084, +0, 778, 1202, +0, 726, 1372, +0, 691, 1528, +0, 680, 1662, +569, 594, 1795, +1139, 422, 1905, +1440, 560, 2035, +1368, 868, 2187, +186, 1169, 2352, +1457, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 681, 0, +0, 689, 0, +0, 699, 145, +0, 712, 295, +0, 729, 441, +0, 750, 582, +0, 777, 721, +0, 811, 859, +0, 854, 995, +0, 904, 1130, +0, 914, 1238, +0, 876, 1397, +0, 823, 1546, +0, 815, 1675, +569, 753, 1802, +1167, 593, 1913, +1385, 692, 2045, +1272, 1002, 2199, +0, 1212, 2357, +1524, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 852, 185, +0, 857, 268, +0, 864, 360, +0, 873, 459, +0, 885, 565, +0, 901, 676, +0, 920, 793, +0, 946, 912, +0, 977, 1035, +0, 1016, 1160, +0, 1056, 1287, +0, 1029, 1432, +0, 983, 1571, +0, 967, 1697, +579, 939, 1816, +1186, 800, 1926, +1306, 849, 2057, +1123, 1137, 2212, +0, 1254, 2365, +1587, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +0, 1181, 1022, +0, 1181, 1028, +0, 1181, 1036, +0, 1181, 1043, +0, 1181, 1052, +0, 1181, 1064, +0, 1181, 1080, +0, 1181, 1099, +0, 1181, 1125, +0, 1186, 1168, +0, 1205, 1242, +0, 1229, 1325, +0, 1255, 1417, +0, 1235, 1494, +0, 1207, 1618, +0, 1219, 1741, +647, 1188, 1855, +1051, 1133, 1961, +1243, 1131, 2080, +1031, 1271, 2225, +532, 1310, 2371, +1590, 1030, 2471, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +1766, 1141, 2512, +0, 1420, 1375, +0, 1420, 1378, +0, 1420, 1382, +0, 1420, 1385, +0, 1420, 1389, +0, 1420, 1395, +0, 1420, 1402, +0, 1420, 1412, +0, 1420, 1425, +0, 1420, 1442, +0, 1420, 1463, +0, 1420, 1491, +0, 1430, 1546, +0, 1417, 1606, +0, 1398, 1674, +0, 1410, 1786, +647, 1405, 1896, +1059, 1354, 2000, +1151, 1350, 2109, +878, 1405, 2240, +706, 1386, 2378, +1603, 1208, 2473, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +1800, 1311, 2510, +929, 1579, 1649, +928, 1579, 1650, +926, 1579, 1651, +926, 1579, 1653, +926, 1578, 1655, +926, 1577, 1658, +926, 1576, 1663, +926, 1574, 1668, +926, 1572, 1676, +926, 1569, 1685, +926, 1567, 1698, +926, 1567, 1715, +906, 1567, 1736, +898, 1576, 1787, +898, 1569, 1837, +906, 1552, 1889, +833, 1557, 1970, +939, 1536, 2067, +950, 1537, 2170, +810, 1524, 2268, +1132, 1500, 2382, +1680, 1435, 2473, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1845, 1471, 2509, +1452, 1705, 1855, +1450, 1705, 1856, +1449, 1705, 1857, +1448, 1705, 1859, +1446, 1705, 1860, +1443, 1705, 1862, +1440, 1705, 1865, +1435, 1705, 1868, +1429, 1705, 1873, +1428, 1703, 1880, +1428, 1700, 1888, +1428, 1696, 1899, +1425, 1691, 1913, +1402, 1685, 1931, +1402, 1696, 1977, +1371, 1701, 2021, +1374, 1685, 2062, +1200, 1672, 2128, +1132, 1678, 2221, +1180, 1647, 2295, +1520, 1631, 2386, +1776, 1634, 2475, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1787, 1817, 1978, +1787, 1817, 1978, +1786, 1817, 1979, +1786, 1817, 1980, +1787, 1817, 1981, +1787, 1817, 1982, +1788, 1817, 1983, +1789, 1817, 1986, +1791, 1817, 1988, +1793, 1817, 1992, +1789, 1817, 1998, +1782, 1817, 2007, +1772, 1818, 2018, +1753, 1823, 2036, +1734, 1818, 2052, +1728, 1803, 2080, +1687, 1816, 2123, +1706, 1808, 2166, +1658, 1793, 2234, +1666, 1793, 2304, +1755, 1797, 2389, +1874, 1790, 2475, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1958, 1958, 2029, +1958, 1958, 2029, +1958, 1958, 2029, +1958, 1958, 2030, +1957, 1958, 2031, +1957, 1958, 2032, +1956, 1958, 2033, +1955, 1958, 2035, +1955, 1958, 2037, +1953, 1958, 2041, +1951, 1958, 2045, +1949, 1958, 2051, +1946, 1958, 2058, +1941, 1962, 2068, +1936, 1968, 2081, +1927, 1969, 2114, +1914, 1966, 2153, +1905, 1963, 2189, +1920, 1969, 2243, +1882, 1968, 2320, +1930, 1954, 2392, +2034, 1964, 2481, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2094, 1969, 2517, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2119, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2120, 2120, 2070, +2120, 2120, 2071, +2120, 2121, 2073, +2120, 2122, 2076, +2120, 2122, 2079, +2120, 2124, 2083, +2120, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2116, 2131, 2132, +2109, 2133, 2164, +2103, 2131, 2206, +2111, 2135, 2256, +2120, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2261, 2159, 2524, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2367, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2368, 2358, 2163, +2370, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2384, 2356, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1965, +2681, 2655, 1966, +2681, 2654, 1967, +2681, 2654, 1969, +2681, 2654, 1968, +2681, 2654, 1966, +2680, 2653, 1965, +2680, 2653, 1962, +2679, 2652, 1963, +2678, 2653, 1970, +2677, 2655, 1992, +2676, 2653, 2015, +2675, 2650, 2035, +2677, 2655, 2124, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2666, 2409, +2715, 2678, 2527, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2722, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2771, 2455, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 28, +0, 0, 152, +0, 0, 280, +0, 0, 408, +0, 0, 537, +0, 0, 667, +0, 0, 797, +0, 0, 928, +0, 0, 1088, +0, 0, 1300, +0, 0, 1478, +0, 0, 1634, +499, 0, 1773, +1157, 0, 1883, +1561, 0, 2007, +1557, 0, 2156, +416, 987, 2341, +1238, 611, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 36, +0, 0, 159, +0, 0, 285, +0, 0, 412, +0, 0, 540, +0, 0, 669, +0, 0, 799, +0, 0, 930, +0, 0, 1089, +0, 0, 1301, +0, 0, 1478, +0, 0, 1635, +483, 0, 1773, +1157, 0, 1883, +1561, 0, 2007, +1556, 0, 2156, +416, 992, 2341, +1243, 614, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 48, +0, 0, 168, +0, 0, 291, +0, 0, 417, +0, 0, 544, +0, 0, 672, +0, 0, 801, +0, 0, 931, +0, 0, 1090, +0, 0, 1302, +0, 0, 1479, +0, 0, 1635, +460, 0, 1772, +1156, 0, 1884, +1560, 0, 2008, +1554, 0, 2156, +416, 998, 2341, +1249, 617, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 63, +0, 0, 180, +0, 0, 300, +0, 0, 424, +0, 0, 549, +0, 0, 676, +0, 0, 804, +0, 0, 933, +0, 0, 1091, +0, 0, 1302, +0, 0, 1480, +0, 0, 1636, +427, 0, 1772, +1154, 0, 1884, +1560, 0, 2009, +1552, 0, 2156, +416, 1005, 2342, +1256, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 120, +0, 0, 224, +0, 0, 335, +0, 0, 450, +0, 0, 569, +0, 0, 691, +0, 0, 816, +0, 0, 942, +0, 0, 1097, +0, 0, 1306, +0, 0, 1482, +0, 0, 1637, +445, 0, 1774, +1153, 0, 1885, +1554, 0, 2010, +1544, 22, 2158, +407, 1015, 2342, +1266, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 120, +0, 0, 277, +0, 0, 376, +0, 0, 483, +0, 0, 594, +0, 0, 711, +0, 0, 831, +0, 0, 954, +0, 23, 1106, +0, 30, 1311, +0, 30, 1486, +0, 0, 1639, +467, 0, 1775, +1150, 0, 1887, +1547, 0, 2012, +1534, 170, 2160, +394, 1028, 2343, +1279, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 11, 120, +0, 67, 277, +0, 133, 427, +0, 133, 523, +0, 133, 627, +0, 133, 736, +0, 133, 850, +0, 133, 968, +0, 186, 1116, +0, 163, 1318, +0, 163, 1490, +0, 112, 1641, +496, 0, 1778, +1147, 0, 1888, +1538, 32, 2014, +1520, 314, 2163, +376, 1045, 2344, +1296, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 127, 0, +0, 114, 0, +0, 148, 120, +0, 190, 277, +0, 241, 427, +0, 302, 573, +0, 302, 666, +0, 302, 767, +0, 302, 875, +0, 302, 987, +0, 339, 1130, +0, 295, 1327, +0, 295, 1496, +0, 258, 1644, +531, 58, 1781, +1142, 0, 1891, +1524, 164, 2018, +1500, 455, 2167, +352, 1066, 2345, +1318, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 269, 0, +0, 259, 0, +0, 284, 120, +0, 316, 277, +0, 355, 427, +0, 403, 573, +0, 459, 714, +0, 459, 806, +0, 459, 906, +0, 459, 1012, +0, 486, 1148, +0, 426, 1339, +0, 426, 1504, +0, 399, 1648, +574, 219, 1786, +1136, 111, 1894, +1506, 296, 2022, +1472, 593, 2172, +317, 1093, 2347, +1356, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 408, 0, +0, 401, 0, +0, 419, 120, +0, 443, 277, +0, 473, 427, +0, 510, 573, +0, 556, 714, +0, 610, 854, +0, 610, 944, +0, 610, 1043, +0, 629, 1171, +0, 570, 1354, +0, 559, 1515, +0, 539, 1653, +578, 410, 1789, +1128, 244, 1899, +1481, 428, 2028, +1431, 730, 2178, +265, 1128, 2349, +1403, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 545, 0, +0, 540, 0, +0, 553, 120, +0, 571, 277, +0, 594, 427, +0, 623, 573, +0, 658, 714, +0, 702, 854, +0, 755, 991, +0, 755, 1080, +0, 769, 1200, +0, 726, 1374, +0, 691, 1529, +0, 676, 1662, +578, 585, 1795, +1145, 422, 1905, +1444, 560, 2035, +1371, 865, 2187, +186, 1169, 2352, +1460, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 681, 0, +0, 677, 0, +0, 688, 120, +0, 701, 277, +0, 718, 427, +0, 740, 573, +0, 768, 714, +0, 803, 854, +0, 845, 991, +0, 897, 1127, +0, 907, 1236, +0, 876, 1399, +0, 823, 1547, +0, 812, 1675, +578, 746, 1801, +1172, 593, 1913, +1390, 692, 2045, +1275, 1000, 2199, +0, 1212, 2357, +1526, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 852, 185, +0, 850, 248, +0, 857, 344, +0, 866, 446, +0, 878, 555, +0, 894, 669, +0, 914, 787, +0, 939, 908, +0, 971, 1032, +0, 1011, 1157, +0, 1051, 1285, +0, 1029, 1433, +0, 983, 1572, +27, 965, 1697, +589, 934, 1816, +1190, 800, 1926, +1312, 849, 2057, +1127, 1135, 2212, +0, 1254, 2365, +1589, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +0, 1178, 1018, +0, 1178, 1024, +0, 1178, 1032, +0, 1178, 1043, +0, 1178, 1052, +0, 1178, 1064, +0, 1178, 1080, +0, 1178, 1099, +0, 1178, 1125, +0, 1184, 1168, +0, 1203, 1242, +0, 1227, 1325, +0, 1253, 1417, +21, 1234, 1496, +21, 1206, 1619, +81, 1217, 1742, +655, 1189, 1855, +1060, 1135, 1962, +1243, 1131, 2080, +1031, 1271, 2225, +573, 1308, 2371, +1592, 1028, 2471, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +1767, 1138, 2512, +0, 1418, 1374, +0, 1418, 1376, +0, 1418, 1380, +0, 1418, 1385, +0, 1418, 1389, +0, 1418, 1395, +0, 1418, 1402, +0, 1418, 1412, +0, 1418, 1425, +0, 1418, 1442, +0, 1418, 1463, +0, 1418, 1491, +0, 1429, 1546, +21, 1416, 1607, +21, 1397, 1675, +81, 1409, 1787, +655, 1406, 1896, +1067, 1355, 2000, +1151, 1350, 2109, +878, 1405, 2240, +735, 1384, 2378, +1605, 1206, 2473, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +1801, 1309, 2510, +949, 1577, 1650, +947, 1578, 1651, +946, 1578, 1652, +943, 1579, 1653, +943, 1578, 1656, +943, 1577, 1659, +943, 1576, 1663, +943, 1574, 1669, +943, 1572, 1676, +943, 1569, 1686, +943, 1567, 1699, +943, 1567, 1715, +924, 1567, 1737, +908, 1576, 1787, +908, 1568, 1837, +917, 1552, 1889, +852, 1557, 1971, +951, 1536, 2066, +957, 1537, 2170, +810, 1525, 2268, +1138, 1499, 2382, +1680, 1435, 2473, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1845, 1470, 2509, +1454, 1705, 1855, +1453, 1705, 1856, +1451, 1705, 1857, +1449, 1705, 1859, +1447, 1705, 1860, +1444, 1705, 1862, +1441, 1705, 1865, +1436, 1705, 1868, +1430, 1705, 1873, +1430, 1703, 1880, +1430, 1700, 1888, +1430, 1696, 1899, +1426, 1691, 1913, +1403, 1685, 1931, +1403, 1696, 1977, +1372, 1701, 2021, +1375, 1686, 2063, +1206, 1672, 2128, +1137, 1678, 2221, +1185, 1647, 2295, +1521, 1632, 2386, +1778, 1634, 2475, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1894, 1628, 2511, +1788, 1817, 1978, +1788, 1817, 1978, +1787, 1817, 1979, +1787, 1817, 1980, +1787, 1817, 1981, +1788, 1817, 1982, +1789, 1817, 1983, +1790, 1817, 1986, +1791, 1817, 1988, +1793, 1817, 1992, +1789, 1817, 1998, +1782, 1817, 2007, +1773, 1818, 2018, +1754, 1823, 2036, +1735, 1818, 2051, +1730, 1803, 2080, +1689, 1816, 2124, +1707, 1808, 2166, +1658, 1793, 2234, +1668, 1793, 2304, +1756, 1797, 2389, +1874, 1789, 2475, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1965, 1800, 2514, +1959, 1958, 2029, +1959, 1958, 2029, +1958, 1958, 2030, +1958, 1958, 2030, +1958, 1958, 2031, +1957, 1958, 2032, +1957, 1958, 2033, +1956, 1958, 2035, +1955, 1958, 2037, +1954, 1958, 2041, +1952, 1958, 2045, +1950, 1958, 2051, +1946, 1958, 2058, +1942, 1962, 2068, +1936, 1967, 2081, +1928, 1969, 2114, +1915, 1966, 2154, +1905, 1962, 2189, +1920, 1968, 2243, +1883, 1968, 2320, +1930, 1954, 2392, +2035, 1964, 2481, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2095, 1968, 2516, +2120, 2120, 2068, +2120, 2120, 2068, +2120, 2120, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2120, 2120, 2070, +2120, 2120, 2071, +2120, 2121, 2073, +2120, 2122, 2075, +2120, 2122, 2078, +2120, 2124, 2082, +2120, 2125, 2088, +2119, 2127, 2095, +2119, 2127, 2101, +2119, 2127, 2110, +2116, 2131, 2132, +2110, 2133, 2165, +2104, 2131, 2206, +2111, 2134, 2256, +2120, 2135, 2316, +2148, 2131, 2395, +2212, 2147, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2356, 2126, +2369, 2356, 2126, +2369, 2356, 2127, +2369, 2357, 2129, +2368, 2357, 2131, +2368, 2358, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2163, +2371, 2358, 2193, +2369, 2358, 2226, +2372, 2355, 2273, +2384, 2357, 2337, +2410, 2367, 2405, +2467, 2385, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1966, +2681, 2655, 1967, +2681, 2655, 1968, +2681, 2655, 1969, +2681, 2654, 1968, +2681, 2654, 1967, +2680, 2654, 1965, +2680, 2653, 1963, +2679, 2653, 1963, +2678, 2654, 1973, +2677, 2655, 1994, +2676, 2653, 2016, +2675, 2650, 2036, +2677, 2655, 2123, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2666, 2409, +2715, 2678, 2527, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +58, 0, 0, +58, 0, 0, +58, 0, 0, +58, 0, 0, +58, 0, 28, +58, 0, 152, +58, 0, 280, +58, 0, 408, +58, 0, 537, +58, 0, 667, +58, 0, 797, +58, 0, 928, +0, 0, 1088, +0, 0, 1305, +0, 0, 1481, +28, 0, 1634, +564, 0, 1774, +1165, 0, 1884, +1561, 0, 2007, +1555, 0, 2157, +407, 987, 2341, +1245, 605, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +41, 0, 0, +50, 0, 0, +50, 0, 0, +50, 0, 0, +50, 0, 36, +50, 0, 159, +50, 0, 285, +50, 0, 412, +50, 0, 540, +50, 0, 669, +50, 0, 799, +50, 0, 930, +0, 0, 1089, +0, 0, 1306, +0, 0, 1482, +36, 0, 1635, +550, 0, 1774, +1164, 0, 1884, +1561, 0, 2008, +1554, 0, 2157, +407, 992, 2341, +1249, 608, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +17, 0, 0, +26, 0, 0, +38, 0, 0, +38, 0, 0, +38, 0, 48, +38, 0, 168, +38, 0, 291, +38, 0, 417, +38, 0, 544, +38, 0, 672, +38, 0, 801, +38, 0, 931, +0, 0, 1090, +0, 0, 1307, +0, 0, 1482, +48, 0, 1635, +530, 0, 1773, +1163, 0, 1884, +1560, 0, 2008, +1552, 0, 2157, +407, 998, 2341, +1254, 611, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +6, 0, 0, +22, 0, 0, +22, 0, 63, +22, 0, 180, +22, 0, 300, +22, 0, 424, +22, 0, 549, +22, 0, 676, +22, 0, 804, +22, 0, 933, +0, 0, 1091, +0, 0, 1308, +0, 0, 1483, +63, 0, 1636, +502, 0, 1773, +1162, 0, 1885, +1560, 0, 2009, +1550, 0, 2158, +407, 1005, 2342, +1262, 615, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 83, +0, 0, 195, +0, 0, 312, +0, 0, 433, +0, 0, 556, +0, 0, 681, +0, 0, 808, +0, 0, 936, +0, 0, 1093, +0, 0, 1309, +0, 0, 1484, +83, 0, 1637, +462, 0, 1772, +1160, 0, 1885, +1559, 0, 2010, +1547, 0, 2158, +407, 1015, 2342, +1272, 621, 2470, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +1732, 0, 2503, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 83, +0, 0, 251, +0, 0, 356, +0, 0, 467, +0, 0, 582, +0, 0, 701, +0, 0, 823, +0, 0, 948, +0, 0, 1102, +0, 30, 1314, +0, 30, 1487, +83, 0, 1639, +483, 0, 1774, +1157, 0, 1887, +1552, 0, 2012, +1536, 154, 2160, +394, 1028, 2343, +1285, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +0, 4, 0, +0, 0, 0, +0, 0, 0, +0, 0, 0, +0, 0, 83, +0, 3, 251, +0, 78, 409, +0, 78, 509, +0, 78, 615, +0, 78, 727, +0, 78, 843, +0, 78, 963, +0, 137, 1112, +0, 163, 1321, +0, 163, 1492, +83, 94, 1641, +511, 0, 1777, +1154, 0, 1889, +1542, 32, 2015, +1522, 302, 2163, +376, 1045, 2344, +1302, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +0, 144, 0, +0, 137, 0, +0, 127, 0, +0, 114, 0, +0, 96, 83, +0, 143, 251, +0, 199, 409, +0, 265, 559, +0, 265, 655, +0, 265, 759, +0, 265, 868, +0, 265, 982, +0, 305, 1126, +0, 295, 1330, +0, 295, 1498, +83, 244, 1644, +545, 15, 1780, +1150, 0, 1891, +1529, 164, 2018, +1502, 446, 2167, +352, 1066, 2345, +1323, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +0, 281, 0, +0, 276, 0, +0, 269, 0, +0, 259, 0, +0, 246, 83, +0, 280, 251, +0, 322, 409, +0, 373, 559, +0, 434, 705, +0, 434, 798, +0, 434, 899, +0, 434, 1007, +0, 462, 1144, +0, 426, 1341, +0, 426, 1506, +83, 390, 1648, +587, 190, 1784, +1144, 111, 1895, +1511, 296, 2022, +1474, 586, 2172, +317, 1093, 2347, +1361, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +0, 417, 0, +0, 413, 0, +0, 408, 0, +0, 401, 0, +0, 391, 83, +0, 416, 251, +0, 448, 409, +0, 487, 559, +0, 535, 705, +0, 591, 846, +0, 591, 938, +0, 591, 1038, +0, 611, 1167, +0, 570, 1357, +0, 559, 1517, +83, 531, 1653, +591, 391, 1789, +1136, 244, 1899, +1486, 428, 2028, +1434, 725, 2178, +265, 1128, 2349, +1407, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +0, 552, 0, +0, 549, 0, +0, 545, 0, +0, 540, 0, +0, 533, 83, +0, 551, 251, +0, 575, 409, +0, 605, 559, +0, 642, 705, +0, 688, 846, +0, 742, 985, +0, 742, 1076, +0, 756, 1197, +0, 726, 1376, +0, 691, 1531, +83, 670, 1662, +591, 572, 1794, +1152, 422, 1905, +1450, 560, 2036, +1374, 862, 2187, +186, 1169, 2352, +1464, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +0, 686, 0, +0, 684, 0, +0, 681, 0, +0, 677, 0, +0, 672, 83, +0, 686, 251, +0, 703, 409, +0, 726, 559, +0, 755, 705, +0, 791, 846, +0, 835, 985, +0, 887, 1123, +0, 898, 1233, +0, 876, 1401, +0, 823, 1548, +83, 808, 1675, +591, 737, 1800, +1179, 593, 1913, +1396, 692, 2046, +1279, 997, 2199, +0, 1212, 2357, +1529, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +0, 854, 85, +0, 854, 130, +0, 852, 185, +0, 850, 248, +0, 846, 322, +0, 855, 429, +0, 868, 541, +0, 884, 658, +0, 904, 778, +0, 930, 901, +0, 963, 1027, +0, 1003, 1154, +69, 1044, 1282, +0, 1029, 1435, +0, 983, 1573, +141, 963, 1697, +601, 928, 1815, +1197, 800, 1927, +1320, 849, 2058, +1133, 1133, 2212, +0, 1254, 2365, +1592, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +136, 1175, 1014, +107, 1175, 1020, +65, 1175, 1028, +1, 1175, 1038, +0, 1175, 1052, +0, 1175, 1064, +0, 1175, 1080, +0, 1175, 1099, +0, 1175, 1125, +0, 1180, 1168, +0, 1200, 1242, +0, 1224, 1325, +21, 1250, 1417, +153, 1233, 1497, +153, 1204, 1620, +214, 1214, 1743, +666, 1191, 1855, +1071, 1137, 1962, +1243, 1131, 2080, +1031, 1271, 2226, +622, 1305, 2371, +1594, 1025, 2471, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +1769, 1134, 2512, +136, 1416, 1371, +107, 1416, 1374, +65, 1416, 1378, +1, 1416, 1383, +0, 1416, 1389, +0, 1416, 1395, +0, 1416, 1402, +0, 1416, 1412, +0, 1416, 1425, +0, 1416, 1442, +0, 1416, 1463, +0, 1416, 1491, +21, 1427, 1546, +153, 1415, 1608, +153, 1396, 1676, +214, 1407, 1788, +666, 1407, 1897, +1078, 1356, 2001, +1151, 1350, 2109, +878, 1405, 2241, +770, 1382, 2378, +1607, 1205, 2473, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +1802, 1306, 2510, +973, 1576, 1651, +973, 1576, 1652, +971, 1577, 1653, +969, 1577, 1654, +966, 1578, 1656, +966, 1577, 1659, +966, 1576, 1664, +966, 1574, 1669, +966, 1572, 1677, +966, 1569, 1686, +966, 1567, 1699, +966, 1567, 1716, +948, 1567, 1737, +920, 1575, 1786, +920, 1568, 1836, +932, 1552, 1890, +876, 1557, 1972, +968, 1536, 2066, +965, 1537, 2170, +810, 1526, 2268, +1145, 1498, 2382, +1680, 1435, 2473, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1844, 1469, 2509, +1457, 1704, 1855, +1456, 1704, 1856, +1454, 1705, 1857, +1452, 1705, 1858, +1449, 1705, 1860, +1446, 1705, 1862, +1443, 1705, 1865, +1438, 1705, 1868, +1432, 1705, 1873, +1431, 1703, 1880, +1431, 1700, 1888, +1431, 1696, 1899, +1428, 1691, 1913, +1405, 1685, 1932, +1405, 1696, 1977, +1373, 1700, 2021, +1378, 1686, 2063, +1214, 1672, 2128, +1142, 1679, 2221, +1192, 1647, 2295, +1522, 1633, 2386, +1779, 1634, 2475, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1895, 1627, 2511, +1790, 1816, 1977, +1790, 1816, 1978, +1789, 1816, 1978, +1789, 1816, 1979, +1788, 1816, 1981, +1788, 1816, 1982, +1789, 1816, 1983, +1790, 1816, 1986, +1792, 1816, 1988, +1793, 1816, 1992, +1790, 1816, 1998, +1783, 1816, 2007, +1773, 1817, 2018, +1755, 1823, 2036, +1736, 1817, 2051, +1731, 1804, 2079, +1691, 1816, 2124, +1708, 1807, 2166, +1659, 1793, 2234, +1670, 1794, 2305, +1757, 1797, 2389, +1873, 1789, 2475, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1966, 1800, 2514, +1960, 1958, 2029, +1960, 1958, 2029, +1959, 1958, 2030, +1959, 1958, 2030, +1958, 1958, 2031, +1958, 1958, 2032, +1957, 1958, 2034, +1956, 1958, 2035, +1956, 1958, 2038, +1954, 1958, 2041, +1952, 1958, 2046, +1950, 1958, 2051, +1947, 1958, 2059, +1942, 1961, 2068, +1936, 1967, 2081, +1928, 1969, 2113, +1916, 1966, 2154, +1905, 1962, 2189, +1920, 1968, 2242, +1884, 1968, 2319, +1930, 1954, 2392, +2036, 1964, 2481, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2096, 1968, 2516, +2120, 2120, 2068, +2120, 2120, 2068, +2120, 2120, 2069, +2120, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2070, +2121, 2120, 2071, +2121, 2121, 2073, +2121, 2122, 2075, +2121, 2122, 2078, +2121, 2124, 2082, +2121, 2125, 2087, +2120, 2127, 2094, +2119, 2127, 2101, +2119, 2127, 2110, +2116, 2131, 2132, +2110, 2134, 2165, +2104, 2130, 2206, +2111, 2134, 2256, +2120, 2134, 2316, +2148, 2131, 2395, +2213, 2146, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2370, 2356, 2126, +2369, 2356, 2127, +2369, 2356, 2129, +2369, 2357, 2131, +2368, 2357, 2133, +2368, 2359, 2137, +2369, 2360, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2162, +2371, 2358, 2193, +2370, 2358, 2226, +2372, 2356, 2273, +2384, 2357, 2337, +2410, 2367, 2406, +2466, 2384, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1968, +2681, 2655, 1969, +2681, 2655, 1970, +2681, 2655, 1969, +2681, 2654, 1968, +2680, 2654, 1966, +2680, 2653, 1964, +2679, 2653, 1964, +2678, 2654, 1975, +2677, 2655, 1997, +2676, 2654, 2018, +2675, 2650, 2038, +2677, 2655, 2123, +2681, 2656, 2208, +2687, 2661, 2306, +2695, 2666, 2409, +2715, 2678, 2527, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2456, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +197, 0, 0, +197, 0, 0, +197, 0, 0, +197, 0, 0, +197, 0, 28, +197, 0, 152, +197, 0, 280, +197, 0, 408, +197, 0, 537, +197, 0, 667, +197, 0, 797, +197, 0, 928, +71, 0, 1088, +0, 0, 1312, +0, 0, 1486, +152, 0, 1634, +638, 0, 1775, +1174, 0, 1884, +1561, 0, 2008, +1552, 0, 2159, +394, 987, 2341, +1252, 597, 2470, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +184, 0, 0, +190, 0, 0, +190, 0, 0, +190, 0, 0, +190, 0, 36, +190, 0, 159, +190, 0, 285, +190, 0, 412, +190, 0, 540, +190, 0, 669, +190, 0, 799, +190, 0, 930, +46, 0, 1089, +0, 0, 1313, +0, 0, 1486, +159, 0, 1635, +626, 0, 1775, +1173, 0, 1885, +1561, 0, 2008, +1551, 0, 2159, +394, 992, 2341, +1257, 599, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +167, 0, 0, +173, 0, 0, +182, 0, 0, +182, 0, 0, +182, 0, 48, +182, 0, 168, +182, 0, 291, +182, 0, 417, +182, 0, 544, +182, 0, 672, +182, 0, 801, +182, 0, 931, +35, 0, 1090, +0, 0, 1313, +0, 0, 1487, +168, 0, 1635, +609, 0, 1775, +1172, 0, 1885, +1560, 0, 2009, +1549, 0, 2159, +394, 998, 2341, +1262, 603, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +142, 0, 0, +149, 0, 0, +158, 0, 0, +170, 0, 0, +170, 0, 63, +170, 0, 180, +170, 0, 300, +170, 0, 424, +170, 0, 549, +170, 0, 676, +170, 0, 804, +170, 0, 933, +19, 0, 1091, +0, 0, 1315, +0, 0, 1487, +180, 0, 1636, +586, 0, 1774, +1171, 0, 1886, +1560, 0, 2010, +1547, 0, 2159, +394, 1005, 2342, +1270, 608, 2470, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +1734, 0, 2503, +107, 0, 0, +115, 0, 0, +125, 0, 0, +138, 0, 0, +154, 0, 83, +154, 0, 195, +154, 0, 312, +154, 0, 433, +154, 0, 556, +154, 0, 681, +154, 0, 808, +154, 0, 936, +0, 0, 1093, +0, 0, 1316, +0, 0, 1489, +195, 0, 1637, +552, 0, 1774, +1169, 0, 1886, +1559, 0, 2011, +1544, 57, 2160, +394, 1015, 2342, +1279, 613, 2470, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +1733, 0, 2503, +56, 0, 0, +65, 0, 0, +76, 0, 0, +90, 0, 0, +108, 0, 83, +132, 0, 215, +132, 0, 327, +132, 0, 444, +132, 0, 564, +132, 0, 688, +132, 0, 813, +132, 0, 940, +0, 0, 1096, +0, 30, 1317, +0, 30, 1490, +215, 0, 1639, +504, 0, 1773, +1167, 0, 1887, +1558, 0, 2012, +1540, 132, 2160, +394, 1028, 2343, +1292, 621, 2470, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +1732, 30, 2504, +56, 4, 0, +65, 0, 0, +76, 0, 0, +90, 0, 0, +108, 0, 83, +132, 0, 215, +132, 0, 383, +132, 0, 488, +132, 0, 599, +132, 0, 714, +132, 0, 833, +132, 0, 955, +0, 64, 1107, +0, 163, 1324, +0, 163, 1494, +215, 68, 1641, +530, 0, 1776, +1164, 0, 1889, +1548, 32, 2015, +1525, 286, 2163, +376, 1045, 2344, +1308, 621, 2470, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +56, 144, 0, +65, 137, 0, +76, 127, 0, +90, 114, 0, +108, 96, 83, +132, 70, 215, +132, 135, 383, +132, 210, 541, +132, 210, 641, +132, 210, 747, +132, 210, 859, +132, 210, 975, +0, 255, 1121, +0, 295, 1333, +0, 295, 1500, +215, 226, 1644, +563, 0, 1779, +1159, 0, 1892, +1536, 164, 2018, +1506, 434, 2167, +352, 1066, 2345, +1329, 621, 2470, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +56, 281, 0, +65, 276, 0, +76, 269, 0, +90, 259, 0, +108, 246, 83, +132, 227, 215, +132, 275, 383, +132, 331, 541, +132, 397, 691, +132, 397, 787, +132, 397, 891, +132, 397, 1000, +0, 427, 1139, +0, 426, 1344, +0, 426, 1508, +215, 376, 1648, +604, 147, 1783, +1154, 111, 1895, +1518, 296, 2022, +1478, 578, 2172, +317, 1093, 2347, +1367, 639, 2470, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +56, 417, 0, +65, 413, 0, +76, 408, 0, +90, 401, 0, +108, 391, 83, +132, 378, 215, +132, 412, 383, +132, 455, 541, +132, 505, 691, +132, 566, 837, +132, 566, 930, +132, 566, 1032, +0, 587, 1163, +0, 570, 1359, +0, 559, 1519, +215, 522, 1653, +607, 365, 1787, +1146, 244, 1900, +1493, 428, 2028, +1438, 719, 2178, +265, 1128, 2349, +1413, 662, 2470, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +56, 552, 0, +65, 549, 0, +76, 545, 0, +90, 540, 0, +108, 533, 83, +132, 523, 215, +132, 548, 383, +132, 580, 541, +132, 619, 691, +132, 667, 837, +132, 723, 978, +132, 723, 1071, +0, 738, 1192, +0, 726, 1379, +0, 691, 1532, +215, 663, 1662, +607, 554, 1792, +1162, 422, 1905, +1457, 560, 2036, +1379, 857, 2187, +186, 1169, 2352, +1468, 691, 2470, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +56, 686, 0, +65, 684, 0, +76, 681, 0, +90, 677, 0, +108, 672, 83, +132, 665, 215, +132, 684, 383, +132, 708, 541, +132, 737, 691, +132, 774, 837, +132, 820, 978, +132, 874, 1118, +0, 885, 1229, +0, 876, 1403, +0, 823, 1550, +215, 803, 1675, +607, 725, 1799, +1188, 593, 1913, +1404, 692, 2046, +1285, 994, 2199, +0, 1212, 2357, +1533, 728, 2470, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +63, 854, 85, +31, 854, 130, +43, 852, 185, +58, 850, 248, +78, 846, 322, +103, 841, 404, +103, 854, 522, +103, 870, 643, +103, 892, 767, +103, 918, 893, +103, 952, 1020, +103, 993, 1149, +185, 1035, 1278, +0, 1029, 1438, +0, 983, 1575, +259, 959, 1697, +617, 920, 1814, +1206, 800, 1927, +1329, 849, 2058, +1141, 1131, 2212, +0, 1254, 2365, +1596, 800, 2470, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +289, 1170, 1007, +268, 1170, 1013, +239, 1170, 1021, +196, 1170, 1032, +132, 1170, 1046, +30, 1170, 1064, +30, 1170, 1080, +30, 1170, 1099, +30, 1170, 1125, +30, 1176, 1168, +30, 1195, 1242, +30, 1220, 1325, +125, 1246, 1417, +285, 1231, 1499, +285, 1202, 1622, +345, 1210, 1744, +680, 1193, 1856, +1086, 1139, 1963, +1243, 1131, 2080, +1031, 1271, 2226, +681, 1302, 2370, +1597, 1022, 2471, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +1771, 1129, 2512, +289, 1413, 1368, +268, 1413, 1371, +239, 1413, 1375, +196, 1413, 1380, +132, 1413, 1386, +30, 1413, 1395, +30, 1413, 1402, +30, 1413, 1412, +30, 1413, 1425, +30, 1413, 1442, +30, 1413, 1463, +30, 1413, 1491, +125, 1424, 1546, +285, 1414, 1610, +285, 1395, 1677, +345, 1404, 1789, +680, 1408, 1897, +1092, 1358, 2001, +1151, 1350, 2109, +878, 1405, 2241, +813, 1379, 2377, +1609, 1202, 2473, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1804, 1303, 2510, +1005, 1574, 1653, +1004, 1574, 1654, +1003, 1575, 1655, +1001, 1575, 1656, +998, 1576, 1658, +995, 1577, 1660, +995, 1576, 1664, +995, 1574, 1670, +995, 1572, 1678, +995, 1569, 1687, +995, 1567, 1700, +995, 1567, 1716, +977, 1567, 1738, +937, 1574, 1785, +937, 1567, 1835, +952, 1552, 1890, +906, 1557, 1973, +989, 1536, 2066, +976, 1537, 2170, +810, 1527, 2268, +1155, 1497, 2382, +1680, 1435, 2473, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1844, 1468, 2509, +1461, 1703, 1854, +1459, 1704, 1855, +1458, 1704, 1856, +1456, 1704, 1858, +1453, 1705, 1859, +1449, 1705, 1862, +1446, 1705, 1865, +1441, 1705, 1868, +1435, 1705, 1873, +1434, 1703, 1880, +1434, 1700, 1888, +1434, 1696, 1899, +1431, 1691, 1913, +1408, 1685, 1932, +1408, 1696, 1977, +1375, 1699, 2021, +1380, 1687, 2064, +1224, 1672, 2127, +1149, 1680, 2221, +1200, 1647, 2295, +1523, 1633, 2386, +1781, 1634, 2475, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1896, 1626, 2511, +1793, 1816, 1977, +1792, 1816, 1977, +1792, 1816, 1978, +1791, 1816, 1979, +1790, 1816, 1980, +1789, 1816, 1982, +1790, 1816, 1983, +1791, 1816, 1986, +1792, 1816, 1988, +1794, 1816, 1992, +1790, 1816, 1998, +1783, 1816, 2007, +1774, 1817, 2018, +1756, 1822, 2035, +1737, 1817, 2051, +1733, 1804, 2079, +1694, 1816, 2124, +1710, 1807, 2166, +1660, 1793, 2234, +1673, 1795, 2305, +1759, 1797, 2389, +1873, 1788, 2475, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1968, 1800, 2514, +1961, 1958, 2029, +1961, 1958, 2030, +1961, 1958, 2030, +1960, 1958, 2031, +1959, 1958, 2031, +1959, 1958, 2032, +1958, 1958, 2034, +1958, 1958, 2036, +1956, 1958, 2038, +1955, 1958, 2042, +1953, 1958, 2046, +1951, 1958, 2052, +1948, 1958, 2059, +1943, 1961, 2068, +1937, 1966, 2081, +1930, 1968, 2112, +1918, 1966, 2154, +1905, 1962, 2189, +1920, 1968, 2242, +1885, 1967, 2319, +1930, 1954, 2392, +2038, 1964, 2481, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2097, 1968, 2516, +2120, 2120, 2069, +2120, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2071, +2121, 2121, 2073, +2121, 2122, 2075, +2121, 2122, 2078, +2121, 2124, 2082, +2121, 2125, 2087, +2120, 2127, 2094, +2119, 2127, 2101, +2119, 2127, 2110, +2117, 2131, 2132, +2111, 2134, 2166, +2105, 2130, 2206, +2111, 2134, 2255, +2121, 2134, 2316, +2148, 2131, 2396, +2213, 2146, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2370, 2355, 2126, +2370, 2356, 2127, +2369, 2356, 2129, +2369, 2357, 2131, +2368, 2357, 2133, +2369, 2358, 2137, +2369, 2359, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2162, +2371, 2358, 2193, +2370, 2358, 2226, +2373, 2356, 2273, +2385, 2357, 2337, +2411, 2367, 2406, +2466, 2384, 2498, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1969, +2681, 2655, 1970, +2681, 2655, 1971, +2681, 2655, 1970, +2681, 2655, 1969, +2680, 2654, 1968, +2680, 2654, 1965, +2679, 2653, 1966, +2679, 2654, 1979, +2677, 2655, 2000, +2676, 2654, 2020, +2675, 2650, 2041, +2677, 2655, 2122, +2681, 2656, 2208, +2688, 2661, 2306, +2695, 2666, 2408, +2715, 2678, 2527, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2723, 2684, 2575, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2457, +2710, 2773, 2483, +2714, 2774, 2520, +2714, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +333, 0, 0, +333, 0, 0, +333, 0, 0, +333, 0, 0, +333, 0, 28, +333, 0, 152, +333, 0, 280, +333, 0, 408, +333, 0, 537, +333, 0, 667, +333, 0, 797, +333, 0, 928, +244, 0, 1088, +0, 0, 1321, +0, 0, 1492, +280, 0, 1634, +721, 0, 1777, +1186, 0, 1886, +1561, 0, 2009, +1548, 0, 2161, +376, 987, 2341, +1263, 586, 2469, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +324, 0, 0, +329, 0, 0, +329, 0, 0, +329, 0, 0, +329, 0, 36, +329, 0, 159, +329, 0, 285, +329, 0, 412, +329, 0, 540, +329, 0, 669, +329, 0, 799, +329, 0, 930, +227, 0, 1089, +0, 0, 1322, +0, 0, 1493, +285, 0, 1635, +711, 0, 1776, +1185, 0, 1886, +1561, 0, 2009, +1547, 0, 2161, +376, 992, 2341, +1267, 588, 2469, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +311, 0, 0, +316, 0, 0, +322, 0, 0, +322, 0, 0, +322, 0, 48, +322, 0, 168, +322, 0, 291, +322, 0, 417, +322, 0, 544, +322, 0, 672, +322, 0, 801, +322, 0, 931, +219, 0, 1090, +0, 0, 1323, +0, 0, 1493, +291, 0, 1635, +697, 0, 1776, +1184, 0, 1886, +1560, 0, 2010, +1545, 22, 2161, +376, 998, 2341, +1272, 592, 2469, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +294, 0, 0, +299, 0, 0, +305, 0, 0, +314, 0, 0, +314, 0, 63, +314, 0, 180, +314, 0, 300, +314, 0, 424, +314, 0, 549, +314, 0, 676, +314, 0, 804, +314, 0, 933, +209, 0, 1091, +0, 0, 1323, +0, 0, 1494, +300, 0, 1636, +678, 0, 1776, +1183, 0, 1887, +1560, 0, 2011, +1543, 69, 2161, +376, 1005, 2342, +1280, 596, 2469, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +1735, 0, 2503, +269, 0, 0, +274, 0, 0, +281, 0, 0, +290, 0, 0, +302, 0, 83, +302, 0, 195, +302, 0, 312, +302, 0, 433, +302, 0, 556, +302, 0, 681, +302, 0, 808, +302, 0, 936, +194, 0, 1093, +0, 0, 1325, +0, 0, 1495, +312, 0, 1637, +651, 0, 1776, +1181, 0, 1887, +1559, 0, 2012, +1540, 124, 2162, +376, 1015, 2342, +1289, 603, 2469, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +1734, 0, 2504, +234, 0, 0, +239, 0, 0, +247, 0, 0, +257, 0, 0, +270, 0, 83, +286, 0, 215, +286, 0, 327, +286, 0, 444, +286, 0, 564, +286, 0, 688, +286, 0, 813, +286, 0, 940, +173, 0, 1096, +0, 30, 1326, +0, 30, 1496, +327, 0, 1639, +613, 0, 1775, +1179, 0, 1888, +1558, 0, 2013, +1535, 189, 2162, +376, 1028, 2343, +1301, 611, 2469, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +1733, 30, 2504, +182, 4, 0, +188, 0, 0, +197, 0, 0, +208, 0, 0, +222, 0, 83, +241, 0, 215, +264, 0, 347, +264, 0, 459, +264, 0, 576, +264, 0, 697, +264, 0, 820, +264, 0, 946, +145, 0, 1100, +0, 163, 1329, +0, 163, 1497, +347, 32, 1641, +555, 0, 1774, +1176, 0, 1890, +1557, 32, 2015, +1530, 264, 2163, +376, 1045, 2344, +1318, 621, 2469, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +1732, 163, 2504, +182, 144, 0, +188, 137, 0, +197, 127, 0, +208, 114, 0, +222, 96, 83, +241, 70, 215, +264, 34, 347, +264, 126, 516, +264, 126, 620, +264, 126, 731, +264, 126, 846, +264, 126, 966, +145, 179, 1114, +0, 295, 1337, +0, 295, 1503, +347, 201, 1644, +586, 0, 1777, +1172, 0, 1892, +1544, 164, 2019, +1510, 418, 2167, +352, 1066, 2345, +1338, 621, 2469, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +182, 281, 0, +188, 276, 0, +197, 269, 0, +208, 259, 0, +222, 246, 83, +241, 227, 215, +264, 202, 347, +264, 267, 516, +264, 342, 673, +264, 342, 773, +264, 342, 879, +264, 342, 991, +145, 376, 1133, +0, 426, 1349, +0, 426, 1511, +347, 358, 1648, +625, 84, 1782, +1166, 111, 1896, +1526, 296, 2023, +1483, 566, 2172, +317, 1093, 2347, +1375, 639, 2469, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +182, 417, 0, +188, 413, 0, +197, 408, 0, +208, 401, 0, +222, 391, 83, +241, 378, 215, +264, 360, 347, +264, 407, 516, +264, 463, 673, +264, 529, 824, +264, 529, 920, +264, 529, 1023, +145, 552, 1156, +0, 570, 1364, +0, 559, 1522, +347, 509, 1653, +628, 326, 1786, +1159, 244, 1900, +1502, 428, 2029, +1443, 710, 2178, +265, 1128, 2349, +1420, 662, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +182, 552, 0, +188, 549, 0, +197, 545, 0, +208, 540, 0, +222, 533, 83, +241, 523, 215, +264, 510, 347, +264, 544, 516, +264, 586, 673, +264, 637, 824, +264, 698, 969, +264, 698, 1063, +145, 714, 1186, +0, 726, 1383, +0, 691, 1535, +347, 654, 1662, +628, 529, 1791, +1174, 422, 1906, +1467, 560, 2036, +1385, 851, 2187, +186, 1169, 2352, +1475, 691, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +182, 686, 0, +188, 684, 0, +197, 681, 0, +208, 677, 0, +222, 672, 83, +241, 665, 215, +264, 655, 347, +264, 681, 516, +264, 712, 673, +264, 752, 824, +264, 799, 969, +264, 856, 1111, +145, 867, 1223, +0, 876, 1407, +0, 823, 1553, +347, 796, 1675, +628, 708, 1798, +1200, 593, 1914, +1415, 692, 2046, +1292, 989, 2199, +0, 1212, 2357, +1539, 728, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +187, 854, 85, +163, 854, 130, +172, 852, 185, +183, 850, 248, +198, 846, 322, +218, 841, 404, +243, 835, 496, +243, 852, 623, +243, 874, 752, +243, 902, 881, +243, 936, 1011, +243, 979, 1142, +304, 1023, 1273, +0, 1029, 1441, +0, 983, 1578, +380, 954, 1697, +638, 909, 1812, +1217, 800, 1928, +1343, 849, 2058, +1151, 1127, 2212, +0, 1254, 2365, +1600, 800, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +436, 1164, 998, +421, 1164, 1004, +400, 1164, 1013, +371, 1164, 1024, +328, 1164, 1038, +265, 1164, 1056, +163, 1164, 1080, +163, 1164, 1099, +163, 1164, 1125, +163, 1170, 1168, +163, 1189, 1242, +163, 1214, 1325, +235, 1241, 1417, +417, 1228, 1503, +417, 1199, 1624, +478, 1204, 1746, +698, 1196, 1857, +1104, 1142, 1964, +1243, 1131, 2079, +1031, 1271, 2226, +750, 1297, 2370, +1600, 1018, 2470, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +1773, 1121, 2512, +436, 1410, 1364, +421, 1410, 1367, +400, 1410, 1371, +371, 1410, 1376, +328, 1410, 1382, +265, 1410, 1391, +163, 1410, 1402, +163, 1410, 1412, +163, 1410, 1425, +163, 1410, 1442, +163, 1410, 1463, +163, 1410, 1491, +235, 1421, 1546, +417, 1412, 1612, +417, 1393, 1679, +478, 1400, 1791, +698, 1410, 1897, +1111, 1360, 2002, +1151, 1350, 2108, +878, 1405, 2242, +865, 1375, 2377, +1613, 1200, 2472, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1806, 1298, 2510, +1044, 1572, 1655, +1043, 1572, 1656, +1042, 1572, 1657, +1040, 1573, 1658, +1038, 1573, 1660, +1034, 1574, 1662, +1030, 1576, 1666, +1030, 1574, 1671, +1030, 1572, 1679, +1030, 1569, 1688, +1030, 1567, 1701, +1030, 1567, 1717, +1014, 1567, 1739, +958, 1573, 1783, +958, 1565, 1833, +977, 1552, 1891, +944, 1557, 1974, +1016, 1536, 2066, +990, 1537, 2170, +810, 1528, 2268, +1168, 1496, 2382, +1680, 1435, 2473, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1843, 1466, 2509, +1466, 1702, 1854, +1464, 1703, 1855, +1463, 1703, 1855, +1461, 1703, 1857, +1458, 1704, 1859, +1454, 1705, 1862, +1449, 1705, 1865, +1444, 1705, 1868, +1438, 1705, 1873, +1438, 1703, 1880, +1438, 1700, 1888, +1438, 1696, 1899, +1434, 1691, 1913, +1412, 1685, 1932, +1412, 1696, 1978, +1377, 1698, 2020, +1384, 1688, 2065, +1238, 1672, 2127, +1159, 1681, 2221, +1212, 1647, 2296, +1524, 1635, 2386, +1783, 1634, 2474, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1897, 1625, 2511, +1796, 1815, 1977, +1795, 1815, 1977, +1795, 1815, 1978, +1794, 1815, 1978, +1793, 1815, 1980, +1792, 1815, 1981, +1790, 1815, 1983, +1792, 1815, 1986, +1793, 1815, 1988, +1795, 1815, 1992, +1791, 1815, 1998, +1784, 1815, 2007, +1775, 1816, 2018, +1758, 1821, 2035, +1739, 1816, 2051, +1736, 1805, 2078, +1698, 1816, 2124, +1712, 1806, 2166, +1661, 1793, 2234, +1677, 1795, 2305, +1762, 1797, 2390, +1872, 1787, 2475, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1969, 1800, 2514, +1963, 1958, 2030, +1962, 1958, 2030, +1962, 1958, 2031, +1962, 1958, 2031, +1961, 1958, 2032, +1960, 1958, 2033, +1959, 1958, 2034, +1958, 1958, 2036, +1958, 1958, 2039, +1956, 1958, 2042, +1955, 1958, 2047, +1952, 1958, 2052, +1949, 1958, 2059, +1943, 1961, 2068, +1937, 1966, 2081, +1930, 1968, 2111, +1921, 1967, 2155, +1905, 1961, 2189, +1920, 1967, 2241, +1887, 1967, 2319, +1931, 1954, 2392, +2040, 1964, 2481, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2099, 1967, 2516, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2069, +2121, 2120, 2070, +2122, 2120, 2070, +2122, 2120, 2070, +2122, 2121, 2072, +2122, 2122, 2074, +2122, 2122, 2078, +2122, 2124, 2082, +2122, 2125, 2087, +2121, 2127, 2094, +2119, 2127, 2101, +2119, 2127, 2110, +2118, 2131, 2131, +2112, 2134, 2166, +2105, 2129, 2205, +2112, 2134, 2255, +2122, 2134, 2316, +2148, 2132, 2396, +2214, 2146, 2485, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2261, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2370, 2356, 2127, +2370, 2356, 2129, +2369, 2357, 2131, +2369, 2357, 2133, +2369, 2358, 2137, +2370, 2359, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2162, +2372, 2358, 2193, +2371, 2358, 2226, +2374, 2356, 2273, +2386, 2358, 2337, +2411, 2367, 2406, +2465, 2384, 2499, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1969, +2681, 2656, 1972, +2681, 2656, 1973, +2681, 2655, 1972, +2681, 2655, 1971, +2680, 2655, 1969, +2680, 2654, 1967, +2679, 2654, 1967, +2679, 2655, 1983, +2677, 2656, 2005, +2677, 2654, 2023, +2675, 2651, 2045, +2677, 2655, 2122, +2681, 2656, 2208, +2688, 2660, 2305, +2695, 2666, 2408, +2715, 2678, 2527, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2458, +2710, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +469, 0, 0, +469, 0, 0, +469, 0, 0, +469, 0, 0, +469, 0, 28, +469, 0, 152, +469, 0, 280, +469, 0, 408, +469, 0, 537, +469, 0, 667, +469, 0, 797, +469, 0, 928, +404, 0, 1088, +100, 0, 1333, +100, 0, 1501, +408, 0, 1634, +813, 0, 1779, +1202, 0, 1887, +1561, 0, 2010, +1542, 61, 2164, +352, 987, 2341, +1276, 570, 2469, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +1737, 0, 2503, +462, 0, 0, +465, 0, 0, +465, 0, 0, +465, 0, 0, +465, 0, 36, +465, 0, 159, +465, 0, 285, +465, 0, 412, +465, 0, 540, +465, 0, 669, +465, 0, 799, +465, 0, 930, +393, 0, 1089, +76, 0, 1333, +76, 0, 1501, +412, 0, 1635, +805, 0, 1779, +1201, 0, 1887, +1561, 0, 2011, +1541, 86, 2164, +352, 992, 2341, +1280, 573, 2469, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +453, 0, 0, +456, 0, 0, +461, 0, 0, +461, 0, 0, +461, 0, 48, +461, 0, 168, +461, 0, 291, +461, 0, 417, +461, 0, 544, +461, 0, 672, +461, 0, 801, +461, 0, 931, +387, 0, 1090, +43, 0, 1334, +43, 0, 1501, +417, 0, 1635, +793, 0, 1778, +1200, 0, 1888, +1560, 0, 2011, +1539, 116, 2164, +352, 998, 2341, +1285, 577, 2469, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +1736, 0, 2503, +440, 0, 0, +444, 0, 0, +448, 0, 0, +455, 0, 0, +455, 0, 63, +455, 0, 180, +455, 0, 300, +455, 0, 424, +455, 0, 549, +455, 0, 676, +455, 0, 804, +455, 0, 933, +380, 0, 1091, +0, 0, 1335, +0, 0, 1502, +424, 0, 1636, +778, 0, 1778, +1199, 0, 1889, +1560, 0, 2012, +1537, 154, 2164, +352, 1005, 2342, +1292, 582, 2469, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +1736, 0, 2504, +422, 0, 0, +426, 0, 0, +431, 0, 0, +437, 0, 0, +446, 0, 83, +446, 0, 195, +446, 0, 312, +446, 0, 433, +446, 0, 556, +446, 0, 681, +446, 0, 808, +446, 0, 936, +370, 0, 1093, +0, 0, 1336, +0, 0, 1503, +433, 0, 1637, +757, 0, 1778, +1197, 0, 1889, +1559, 0, 2013, +1534, 201, 2165, +352, 1015, 2342, +1302, 588, 2469, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +1735, 0, 2504, +397, 0, 0, +401, 0, 0, +406, 0, 0, +413, 0, 0, +422, 0, 83, +434, 0, 215, +434, 0, 327, +434, 0, 444, +434, 0, 564, +434, 0, 688, +434, 0, 813, +434, 0, 940, +356, 0, 1096, +0, 30, 1338, +0, 30, 1504, +444, 0, 1639, +726, 0, 1777, +1195, 0, 1890, +1558, 0, 2015, +1530, 256, 2165, +352, 1028, 2343, +1314, 596, 2469, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +1735, 30, 2504, +362, 4, 0, +366, 0, 0, +371, 0, 0, +379, 0, 0, +389, 0, 83, +402, 0, 215, +418, 0, 347, +418, 0, 459, +418, 0, 576, +418, 0, 697, +418, 0, 820, +418, 0, 946, +337, 0, 1100, +0, 163, 1340, +0, 163, 1505, +459, 32, 1641, +682, 0, 1776, +1192, 0, 1891, +1557, 32, 2017, +1524, 322, 2166, +352, 1045, 2344, +1329, 607, 2469, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +1734, 163, 2504, +309, 144, 0, +314, 137, 0, +320, 127, 0, +329, 114, 0, +340, 96, 83, +354, 70, 215, +373, 34, 347, +396, 0, 479, +396, 0, 591, +396, 0, 708, +396, 0, 829, +396, 0, 952, +310, 52, 1105, +0, 295, 1343, +0, 295, 1507, +479, 164, 1644, +615, 0, 1775, +1188, 0, 1893, +1555, 164, 2019, +1516, 396, 2167, +352, 1066, 2345, +1349, 621, 2469, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +1732, 295, 2505, +309, 281, 0, +314, 276, 0, +320, 269, 0, +329, 259, 0, +340, 246, 83, +354, 227, 215, +373, 202, 347, +396, 166, 479, +396, 257, 648, +396, 257, 752, +396, 257, 863, +396, 257, 978, +310, 298, 1124, +0, 426, 1354, +0, 426, 1515, +479, 333, 1648, +652, 0, 1779, +1183, 111, 1897, +1538, 296, 2024, +1489, 550, 2172, +317, 1093, 2347, +1385, 639, 2469, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +309, 417, 0, +314, 413, 0, +320, 408, 0, +329, 401, 0, +340, 391, 83, +354, 378, 215, +373, 360, 347, +396, 334, 479, +396, 399, 648, +396, 474, 805, +396, 474, 905, +396, 474, 1011, +310, 500, 1148, +0, 570, 1369, +0, 559, 1526, +479, 490, 1653, +655, 270, 1784, +1176, 244, 1901, +1514, 428, 2029, +1450, 699, 2178, +265, 1128, 2349, +1430, 662, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +309, 552, 0, +314, 549, 0, +320, 545, 0, +329, 540, 0, +340, 533, 83, +354, 523, 215, +373, 510, 347, +396, 492, 479, +396, 539, 648, +396, 595, 805, +396, 661, 955, +396, 661, 1052, +310, 678, 1178, +0, 726, 1388, +0, 691, 1539, +479, 640, 1662, +655, 494, 1789, +1191, 422, 1907, +1480, 560, 2037, +1393, 842, 2187, +186, 1169, 2352, +1483, 691, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +309, 686, 0, +314, 684, 0, +320, 681, 0, +329, 677, 0, +340, 672, 83, +354, 665, 215, +373, 655, 347, +396, 643, 479, +396, 677, 648, +396, 719, 805, +396, 770, 955, +396, 830, 1101, +310, 842, 1216, +0, 876, 1412, +0, 823, 1557, +479, 786, 1675, +655, 684, 1796, +1216, 593, 1915, +1430, 692, 2047, +1302, 983, 2199, +0, 1212, 2357, +1546, 728, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +313, 854, 85, +295, 854, 130, +302, 852, 185, +310, 850, 248, +322, 846, 322, +336, 841, 404, +356, 835, 496, +380, 826, 594, +380, 849, 730, +380, 878, 865, +380, 915, 1000, +380, 960, 1133, +426, 1005, 1267, +0, 1029, 1446, +0, 983, 1581, +504, 947, 1697, +664, 894, 1810, +1232, 800, 1928, +1359, 849, 2059, +1164, 1123, 2212, +0, 1254, 2365, +1607, 800, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +579, 1156, 985, +568, 1156, 992, +553, 1156, 1001, +532, 1156, 1012, +503, 1156, 1027, +461, 1156, 1045, +397, 1156, 1069, +295, 1156, 1099, +295, 1156, 1125, +295, 1161, 1168, +295, 1181, 1242, +295, 1207, 1325, +350, 1233, 1417, +549, 1224, 1507, +549, 1195, 1627, +610, 1196, 1748, +721, 1200, 1858, +1128, 1147, 1966, +1243, 1131, 2078, +1031, 1271, 2227, +827, 1290, 2369, +1605, 1012, 2470, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +1776, 1112, 2512, +579, 1405, 1359, +568, 1405, 1361, +553, 1405, 1365, +532, 1405, 1370, +503, 1405, 1377, +461, 1405, 1386, +397, 1405, 1397, +295, 1405, 1412, +295, 1405, 1425, +295, 1405, 1442, +295, 1405, 1463, +295, 1405, 1491, +350, 1416, 1546, +549, 1410, 1615, +549, 1390, 1682, +610, 1395, 1793, +721, 1413, 1898, +1134, 1362, 2004, +1151, 1350, 2108, +878, 1405, 2243, +927, 1369, 2376, +1617, 1196, 2472, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1809, 1292, 2510, +1091, 1568, 1658, +1091, 1569, 1659, +1089, 1569, 1660, +1088, 1569, 1661, +1086, 1570, 1663, +1083, 1571, 1665, +1079, 1572, 1668, +1074, 1574, 1673, +1074, 1572, 1680, +1074, 1569, 1690, +1074, 1567, 1702, +1074, 1567, 1718, +1060, 1567, 1740, +984, 1571, 1781, +984, 1563, 1832, +1008, 1552, 1891, +990, 1557, 1977, +1050, 1536, 2065, +1008, 1537, 2170, +810, 1530, 2268, +1184, 1494, 2382, +1680, 1435, 2473, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1842, 1464, 2509, +1472, 1701, 1853, +1471, 1701, 1854, +1469, 1702, 1855, +1467, 1702, 1856, +1464, 1703, 1858, +1461, 1703, 1861, +1456, 1704, 1864, +1449, 1705, 1868, +1443, 1705, 1873, +1442, 1703, 1880, +1442, 1700, 1888, +1442, 1696, 1899, +1439, 1691, 1913, +1417, 1685, 1933, +1417, 1696, 1979, +1379, 1697, 2020, +1390, 1690, 2066, +1256, 1672, 2126, +1172, 1682, 2221, +1227, 1647, 2296, +1526, 1636, 2386, +1786, 1634, 2474, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1899, 1624, 2511, +1800, 1814, 1976, +1800, 1814, 1976, +1799, 1814, 1977, +1799, 1814, 1978, +1797, 1814, 1979, +1796, 1814, 1981, +1795, 1814, 1983, +1793, 1814, 1986, +1794, 1814, 1988, +1796, 1814, 1992, +1792, 1814, 1998, +1785, 1814, 2007, +1776, 1815, 2018, +1760, 1821, 2034, +1741, 1815, 2050, +1739, 1806, 2078, +1704, 1816, 2125, +1714, 1805, 2166, +1662, 1793, 2234, +1683, 1796, 2305, +1765, 1797, 2390, +1871, 1786, 2475, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1971, 1800, 2514, +1965, 1958, 2031, +1965, 1958, 2031, +1964, 1958, 2031, +1964, 1958, 2032, +1963, 1958, 2032, +1962, 1958, 2034, +1961, 1958, 2035, +1960, 1958, 2037, +1959, 1958, 2039, +1958, 1958, 2042, +1956, 1958, 2047, +1953, 1958, 2053, +1951, 1958, 2060, +1944, 1960, 2068, +1938, 1965, 2081, +1932, 1967, 2110, +1924, 1968, 2156, +1905, 1961, 2189, +1920, 1966, 2240, +1890, 1966, 2318, +1932, 1954, 2393, +2043, 1964, 2481, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2101, 1966, 2516, +2121, 2121, 2069, +2121, 2121, 2070, +2121, 2121, 2070, +2122, 2121, 2070, +2122, 2121, 2070, +2122, 2121, 2071, +2122, 2121, 2071, +2123, 2121, 2071, +2123, 2122, 2074, +2123, 2122, 2077, +2123, 2124, 2081, +2123, 2125, 2086, +2122, 2127, 2093, +2119, 2127, 2101, +2119, 2127, 2110, +2119, 2131, 2131, +2114, 2135, 2167, +2107, 2129, 2205, +2112, 2133, 2255, +2123, 2133, 2316, +2148, 2132, 2397, +2215, 2145, 2485, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2260, 2159, 2523, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2356, 2129, +2370, 2356, 2131, +2369, 2357, 2133, +2369, 2358, 2137, +2370, 2359, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2369, 2358, 2161, +2372, 2358, 2193, +2371, 2358, 2227, +2375, 2356, 2273, +2387, 2359, 2337, +2411, 2367, 2406, +2465, 2384, 2499, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2496, 2391, 2531, +2681, 2655, 1963, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1965, +2681, 2655, 1967, +2681, 2655, 1969, +2681, 2656, 1972, +2681, 2656, 1975, +2681, 2656, 1974, +2681, 2656, 1973, +2680, 2655, 1971, +2680, 2655, 1969, +2679, 2654, 1969, +2679, 2655, 1990, +2678, 2657, 2010, +2677, 2655, 2027, +2675, 2651, 2050, +2677, 2656, 2121, +2681, 2656, 2208, +2688, 2660, 2305, +2695, 2665, 2407, +2715, 2678, 2527, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2723, 2684, 2576, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2431, +2713, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2768, 2439, +2714, 2769, 2444, +2711, 2772, 2460, +2711, 2773, 2482, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2722, 2784, 2693, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +603, 0, 0, +603, 0, 0, +603, 0, 0, +603, 0, 0, +603, 0, 28, +603, 0, 152, +603, 0, 280, +603, 0, 408, +603, 0, 537, +603, 0, 667, +603, 0, 797, +603, 0, 928, +556, 0, 1088, +249, 0, 1348, +249, 0, 1511, +537, 0, 1634, +912, 0, 1782, +1222, 0, 1890, +1561, 0, 2012, +1535, 174, 2167, +317, 987, 2341, +1325, 528, 2469, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +598, 0, 0, +601, 0, 0, +601, 0, 0, +601, 0, 0, +601, 0, 36, +601, 0, 159, +601, 0, 285, +601, 0, 412, +601, 0, 540, +601, 0, 669, +601, 0, 799, +601, 0, 930, +548, 0, 1089, +232, 0, 1349, +232, 0, 1511, +540, 0, 1635, +906, 0, 1782, +1221, 0, 1890, +1561, 0, 2013, +1534, 193, 2167, +317, 992, 2341, +1328, 531, 2469, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +591, 0, 0, +594, 0, 0, +597, 0, 0, +597, 0, 0, +597, 0, 48, +597, 0, 168, +597, 0, 291, +597, 0, 417, +597, 0, 544, +597, 0, 672, +597, 0, 801, +597, 0, 931, +544, 0, 1090, +208, 0, 1349, +208, 0, 1512, +544, 0, 1635, +897, 0, 1781, +1221, 0, 1891, +1560, 0, 2013, +1532, 217, 2168, +317, 998, 2341, +1333, 535, 2469, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +1738, 0, 2504, +582, 0, 0, +585, 0, 0, +588, 0, 0, +593, 0, 0, +593, 0, 63, +593, 0, 180, +593, 0, 300, +593, 0, 424, +593, 0, 549, +593, 0, 676, +593, 0, 804, +593, 0, 933, +539, 0, 1091, +175, 0, 1351, +175, 0, 1512, +549, 0, 1636, +884, 0, 1781, +1220, 0, 1891, +1560, 0, 2014, +1530, 248, 2168, +317, 1005, 2342, +1339, 540, 2469, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +569, 0, 0, +572, 0, 0, +575, 0, 0, +580, 0, 0, +586, 0, 83, +586, 0, 195, +586, 0, 312, +586, 0, 433, +586, 0, 556, +586, 0, 681, +586, 0, 808, +586, 0, 936, +532, 0, 1093, +125, 0, 1352, +125, 0, 1513, +556, 0, 1637, +867, 0, 1781, +1218, 0, 1891, +1559, 0, 2015, +1526, 286, 2168, +317, 1015, 2342, +1348, 547, 2469, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +1737, 0, 2504, +551, 0, 0, +554, 0, 0, +558, 0, 0, +563, 0, 0, +569, 0, 83, +578, 0, 215, +578, 0, 327, +578, 0, 444, +578, 0, 564, +578, 0, 688, +578, 0, 813, +578, 0, 940, +522, 0, 1096, +50, 30, 1353, +50, 30, 1514, +564, 0, 1639, +844, 0, 1780, +1216, 0, 1893, +1558, 0, 2017, +1522, 333, 2169, +317, 1028, 2343, +1359, 556, 2469, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +1736, 30, 2504, +526, 4, 0, +529, 0, 0, +533, 0, 0, +538, 0, 0, +545, 0, 83, +554, 0, 215, +566, 0, 347, +566, 0, 459, +566, 0, 576, +566, 0, 697, +566, 0, 820, +566, 0, 946, +509, 0, 1100, +0, 163, 1355, +0, 163, 1516, +576, 32, 1641, +810, 0, 1779, +1213, 0, 1894, +1557, 32, 2019, +1516, 388, 2170, +317, 1045, 2344, +1373, 568, 2469, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +1735, 163, 2505, +490, 144, 0, +494, 137, 0, +498, 127, 0, +504, 114, 0, +511, 96, 83, +521, 70, 215, +534, 34, 347, +550, 0, 479, +550, 0, 591, +550, 0, 708, +550, 0, 829, +550, 0, 952, +491, 52, 1105, +0, 295, 1358, +0, 295, 1518, +591, 164, 1644, +761, 0, 1778, +1209, 0, 1896, +1555, 164, 2021, +1508, 454, 2170, +317, 1066, 2345, +1391, 584, 2469, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +1734, 295, 2505, +438, 281, 0, +441, 276, 0, +446, 269, 0, +452, 259, 0, +461, 246, 83, +472, 227, 215, +486, 202, 347, +505, 166, 479, +528, 111, 611, +528, 111, 723, +528, 111, 840, +528, 111, 961, +465, 167, 1111, +0, 426, 1362, +0, 426, 1520, +611, 296, 1648, +685, 0, 1777, +1204, 111, 1898, +1552, 296, 2024, +1498, 528, 2172, +317, 1093, 2347, +1405, 655, 2469, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +1732, 426, 2506, +438, 417, 0, +441, 413, 0, +446, 408, 0, +452, 401, 0, +461, 391, 83, +472, 378, 215, +486, 360, 347, +505, 334, 479, +528, 298, 611, +528, 390, 780, +528, 390, 884, +528, 390, 995, +465, 420, 1136, +0, 570, 1376, +0, 559, 1531, +611, 465, 1653, +688, 180, 1781, +1197, 244, 1902, +1529, 428, 2030, +1459, 683, 2178, +265, 1128, 2349, +1448, 678, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +438, 552, 0, +441, 549, 0, +446, 545, 0, +452, 540, 0, +461, 533, 83, +472, 523, 215, +486, 510, 347, +505, 492, 479, +528, 466, 611, +528, 532, 780, +528, 606, 937, +528, 606, 1037, +465, 626, 1167, +0, 726, 1395, +0, 691, 1544, +611, 622, 1662, +688, 441, 1786, +1211, 422, 1908, +1496, 560, 2038, +1403, 831, 2187, +186, 1169, 2352, +1499, 706, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +438, 686, 0, +441, 684, 0, +446, 681, 0, +452, 677, 0, +461, 672, 83, +472, 665, 215, +486, 655, 347, +505, 643, 479, +528, 624, 611, +528, 671, 780, +528, 728, 937, +528, 793, 1088, +465, 806, 1206, +0, 876, 1419, +0, 823, 1561, +611, 773, 1675, +688, 651, 1793, +1235, 593, 1916, +1448, 692, 2048, +1314, 975, 2199, +0, 1212, 2357, +1560, 742, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +441, 854, 85, +427, 854, 130, +432, 852, 185, +438, 850, 248, +447, 846, 322, +458, 841, 404, +473, 835, 496, +492, 826, 594, +516, 814, 700, +516, 845, 843, +516, 884, 983, +516, 932, 1121, +551, 980, 1257, +0, 1029, 1452, +0, 983, 1586, +630, 938, 1697, +697, 873, 1807, +1251, 800, 1930, +1381, 849, 2060, +1181, 1116, 2212, +0, 1254, 2365, +1619, 811, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +719, 1144, 968, +711, 1144, 975, +700, 1144, 984, +685, 1144, 996, +664, 1144, 1011, +635, 1144, 1030, +592, 1144, 1055, +529, 1144, 1086, +426, 1144, 1125, +426, 1150, 1168, +426, 1170, 1242, +426, 1196, 1325, +469, 1224, 1417, +681, 1219, 1512, +681, 1190, 1631, +741, 1186, 1751, +750, 1205, 1859, +1158, 1153, 1968, +1243, 1131, 2078, +1031, 1271, 2228, +914, 1282, 2369, +1608, 1020, 2470, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +1781, 1099, 2512, +719, 1398, 1351, +711, 1398, 1354, +700, 1398, 1358, +685, 1398, 1363, +664, 1398, 1370, +635, 1398, 1379, +592, 1398, 1390, +529, 1398, 1406, +426, 1398, 1425, +426, 1398, 1442, +426, 1398, 1463, +426, 1398, 1491, +469, 1409, 1546, +681, 1406, 1619, +681, 1387, 1686, +741, 1388, 1796, +750, 1416, 1900, +1164, 1366, 2006, +1151, 1350, 2107, +878, 1405, 2243, +998, 1362, 2375, +1620, 1201, 2472, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1813, 1283, 2510, +1148, 1563, 1662, +1147, 1564, 1663, +1146, 1564, 1663, +1145, 1565, 1665, +1143, 1565, 1667, +1140, 1566, 1669, +1137, 1568, 1672, +1133, 1569, 1676, +1126, 1572, 1682, +1126, 1569, 1691, +1126, 1567, 1704, +1126, 1567, 1720, +1114, 1567, 1742, +1017, 1569, 1778, +1017, 1561, 1829, +1046, 1552, 1893, +1045, 1557, 1979, +1092, 1536, 2064, +1032, 1537, 2170, +810, 1533, 2268, +1205, 1491, 2382, +1680, 1432, 2474, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1841, 1461, 2509, +1481, 1699, 1851, +1480, 1700, 1852, +1478, 1700, 1853, +1476, 1700, 1855, +1473, 1701, 1857, +1470, 1702, 1859, +1465, 1703, 1863, +1458, 1704, 1867, +1449, 1705, 1873, +1448, 1703, 1880, +1448, 1700, 1888, +1448, 1696, 1899, +1445, 1691, 1913, +1423, 1685, 1934, +1423, 1696, 1979, +1383, 1695, 2019, +1396, 1691, 2067, +1278, 1672, 2126, +1188, 1684, 2221, +1246, 1647, 2296, +1529, 1638, 2386, +1793, 1636, 2474, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1901, 1622, 2511, +1805, 1813, 1975, +1805, 1813, 1975, +1805, 1813, 1976, +1804, 1813, 1977, +1803, 1813, 1978, +1802, 1813, 1979, +1800, 1813, 1982, +1798, 1813, 1984, +1796, 1813, 1988, +1797, 1813, 1992, +1793, 1813, 1998, +1787, 1813, 2007, +1777, 1813, 2018, +1763, 1819, 2033, +1745, 1813, 2049, +1744, 1807, 2077, +1710, 1816, 2126, +1718, 1804, 2166, +1664, 1793, 2234, +1690, 1798, 2306, +1770, 1797, 2390, +1871, 1786, 2475, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1974, 1800, 2514, +1968, 1958, 2031, +1968, 1958, 2031, +1967, 1958, 2032, +1967, 1958, 2032, +1966, 1958, 2033, +1965, 1958, 2034, +1964, 1958, 2036, +1963, 1958, 2038, +1961, 1958, 2040, +1960, 1958, 2043, +1958, 1958, 2048, +1955, 1958, 2054, +1953, 1958, 2061, +1945, 1959, 2068, +1939, 1964, 2081, +1934, 1966, 2107, +1928, 1969, 2157, +1905, 1959, 2189, +1920, 1965, 2239, +1893, 1965, 2317, +1933, 1954, 2393, +2043, 1964, 2481, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2104, 1965, 2515, +2122, 2122, 2070, +2122, 2122, 2070, +2122, 2122, 2071, +2122, 2122, 2071, +2122, 2122, 2071, +2123, 2122, 2071, +2123, 2122, 2072, +2124, 2122, 2072, +2124, 2122, 2073, +2124, 2122, 2076, +2124, 2124, 2080, +2124, 2125, 2086, +2124, 2127, 2093, +2119, 2127, 2101, +2119, 2127, 2110, +2120, 2131, 2130, +2116, 2135, 2169, +2108, 2128, 2204, +2113, 2132, 2254, +2124, 2133, 2316, +2148, 2133, 2397, +2216, 2146, 2485, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2260, 2159, 2522, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2355, 2129, +2371, 2356, 2131, +2370, 2357, 2133, +2370, 2357, 2137, +2371, 2358, 2143, +2370, 2358, 2146, +2369, 2356, 2148, +2370, 2358, 2161, +2373, 2358, 2193, +2372, 2358, 2227, +2376, 2357, 2273, +2388, 2360, 2337, +2411, 2367, 2406, +2465, 2385, 2499, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2680, 2654, 1962, +2680, 2655, 1962, +2681, 2655, 1963, +2681, 2655, 1964, +2681, 2655, 1966, +2681, 2655, 1968, +2681, 2656, 1970, +2681, 2656, 1974, +2681, 2656, 1972, +2681, 2655, 1970, +2680, 2655, 1969, +2680, 2654, 1966, +2679, 2654, 1967, +2679, 2655, 1987, +2677, 2657, 2008, +2677, 2656, 2029, +2675, 2652, 2050, +2677, 2656, 2121, +2681, 2656, 2208, +2688, 2660, 2306, +2695, 2665, 2407, +2715, 2678, 2527, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2771, 2430, +2713, 2771, 2430, +2713, 2771, 2430, +2714, 2771, 2430, +2714, 2771, 2431, +2714, 2771, 2431, +2714, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2431, +2715, 2771, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2711, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2694, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +737, 0, 0, +737, 0, 0, +737, 0, 0, +737, 0, 0, +737, 0, 28, +737, 0, 152, +737, 0, 280, +737, 0, 408, +737, 0, 537, +737, 0, 667, +737, 0, 797, +737, 0, 928, +703, 0, 1088, +438, 0, 1361, +394, 0, 1525, +667, 0, 1634, +977, 0, 1782, +1248, 0, 1893, +1561, 0, 2015, +1525, 291, 2172, +265, 987, 2341, +1385, 462, 2468, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +734, 0, 0, +736, 0, 0, +736, 0, 0, +736, 0, 0, +736, 0, 36, +736, 0, 159, +736, 0, 285, +736, 0, 412, +736, 0, 540, +736, 0, 669, +736, 0, 799, +736, 0, 930, +697, 0, 1089, +427, 0, 1361, +381, 0, 1525, +669, 0, 1635, +971, 0, 1782, +1248, 0, 1893, +1561, 0, 2015, +1524, 306, 2173, +265, 992, 2341, +1388, 465, 2468, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +729, 0, 0, +730, 0, 0, +733, 0, 0, +733, 0, 0, +733, 0, 48, +733, 0, 168, +733, 0, 291, +733, 0, 417, +733, 0, 544, +733, 0, 672, +733, 0, 801, +733, 0, 931, +694, 0, 1090, +412, 0, 1362, +365, 0, 1526, +672, 0, 1635, +963, 0, 1782, +1247, 0, 1894, +1560, 0, 2016, +1522, 325, 2173, +265, 998, 2341, +1392, 470, 2468, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +1740, 0, 2504, +722, 0, 0, +723, 0, 0, +726, 0, 0, +730, 0, 0, +730, 0, 63, +730, 0, 180, +730, 0, 300, +730, 0, 424, +730, 0, 549, +730, 0, 676, +730, 0, 804, +730, 0, 933, +690, 0, 1091, +391, 0, 1363, +341, 0, 1526, +676, 0, 1636, +953, 0, 1781, +1245, 0, 1894, +1560, 0, 2017, +1519, 349, 2173, +265, 1005, 2342, +1398, 476, 2468, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +1739, 0, 2504, +712, 0, 0, +714, 0, 0, +717, 0, 0, +720, 0, 0, +725, 0, 83, +725, 0, 195, +725, 0, 312, +725, 0, 433, +725, 0, 556, +725, 0, 681, +725, 0, 808, +725, 0, 936, +685, 0, 1093, +361, 0, 1364, +307, 0, 1527, +681, 0, 1637, +939, 0, 1781, +1244, 0, 1895, +1559, 0, 2018, +1516, 380, 2173, +265, 1015, 2342, +1405, 484, 2468, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +1739, 0, 2505, +699, 0, 0, +701, 0, 0, +704, 0, 0, +708, 0, 0, +712, 0, 83, +719, 0, 215, +719, 0, 327, +719, 0, 444, +719, 0, 564, +719, 0, 688, +719, 0, 813, +719, 0, 940, +678, 0, 1096, +317, 30, 1365, +258, 30, 1528, +688, 0, 1639, +918, 0, 1780, +1242, 0, 1896, +1558, 0, 2019, +1512, 419, 2174, +265, 1028, 2343, +1415, 494, 2468, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +1738, 30, 2505, +681, 4, 0, +683, 0, 0, +686, 0, 0, +690, 0, 0, +695, 0, 83, +702, 0, 215, +710, 0, 347, +710, 0, 459, +710, 0, 576, +710, 0, 697, +710, 0, 820, +710, 0, 946, +669, 0, 1100, +251, 163, 1367, +182, 163, 1530, +697, 32, 1641, +890, 0, 1779, +1239, 0, 1897, +1557, 32, 2021, +1506, 465, 2175, +265, 1045, 2344, +1427, 508, 2468, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +1737, 163, 2505, +656, 144, 0, +658, 137, 0, +661, 127, 0, +665, 114, 0, +670, 96, 83, +678, 70, 215, +686, 34, 347, +699, 0, 479, +699, 0, 591, +699, 0, 708, +699, 0, 829, +699, 0, 952, +656, 52, 1105, +145, 295, 1370, +56, 295, 1531, +708, 164, 1644, +849, 0, 1778, +1236, 0, 1899, +1555, 164, 2023, +1498, 521, 2175, +265, 1066, 2345, +1443, 526, 2468, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +1736, 295, 2505, +620, 281, 0, +623, 276, 0, +626, 269, 0, +630, 259, 0, +636, 246, 83, +643, 227, 215, +653, 202, 347, +666, 166, 479, +683, 111, 611, +683, 111, 723, +683, 111, 840, +683, 111, 961, +639, 167, 1111, +0, 426, 1374, +0, 426, 1534, +723, 296, 1648, +788, 0, 1777, +1231, 111, 1901, +1552, 296, 2027, +1487, 586, 2177, +265, 1093, 2347, +1456, 606, 2469, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +1735, 426, 2506, +567, 417, 0, +570, 413, 0, +573, 408, 0, +578, 401, 0, +585, 391, 83, +593, 378, 215, +604, 360, 347, +618, 334, 479, +637, 298, 611, +660, 244, 743, +660, 244, 856, +660, 244, 973, +614, 286, 1119, +0, 536, 1379, +0, 559, 1537, +743, 428, 1653, +797, 104, 1780, +1224, 244, 1904, +1549, 428, 2031, +1472, 660, 2178, +265, 1128, 2349, +1472, 699, 2469, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +1732, 559, 2507, +567, 552, 0, +570, 549, 0, +573, 545, 0, +578, 540, 0, +585, 533, 83, +593, 523, 215, +604, 510, 347, +618, 492, 479, +637, 466, 611, +660, 430, 743, +660, 521, 912, +660, 521, 1017, +614, 545, 1152, +0, 703, 1397, +0, 691, 1550, +743, 597, 1662, +797, 399, 1786, +1238, 422, 1910, +1518, 560, 2039, +1417, 815, 2187, +186, 1169, 2352, +1521, 727, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +567, 686, 0, +570, 684, 0, +573, 681, 0, +578, 677, 0, +585, 672, 83, +593, 665, 215, +604, 655, 347, +618, 643, 479, +637, 624, 611, +660, 599, 743, +660, 664, 912, +660, 739, 1070, +614, 754, 1192, +0, 860, 1421, +0, 823, 1568, +743, 755, 1675, +797, 625, 1792, +1261, 593, 1918, +1472, 692, 2049, +1331, 963, 2199, +0, 1212, 2357, +1579, 761, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +569, 854, 85, +559, 854, 130, +563, 852, 185, +568, 850, 248, +574, 846, 322, +583, 841, 404, +594, 835, 496, +608, 826, 594, +627, 814, 700, +651, 797, 811, +651, 841, 960, +651, 893, 1104, +678, 945, 1245, +0, 1017, 1454, +0, 983, 1592, +758, 925, 1697, +804, 857, 1807, +1275, 800, 1931, +1408, 849, 2061, +1203, 1108, 2212, +0, 1254, 2365, +1635, 828, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +834, 1134, 954, +827, 1134, 961, +819, 1134, 970, +808, 1134, 982, +792, 1134, 998, +770, 1134, 1018, +739, 1134, 1043, +693, 1134, 1075, +625, 1134, 1115, +570, 1131, 1163, +570, 1152, 1237, +570, 1179, 1321, +601, 1208, 1413, +800, 1208, 1514, +767, 1185, 1636, +863, 1174, 1754, +863, 1195, 1861, +1192, 1157, 1970, +1257, 1131, 2078, +1043, 1269, 2229, +975, 1275, 2368, +1616, 1030, 2470, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +857, 1389, 1341, +851, 1389, 1344, +843, 1389, 1348, +832, 1389, 1353, +817, 1389, 1360, +797, 1389, 1369, +767, 1389, 1381, +725, 1389, 1397, +661, 1389, 1417, +559, 1389, 1442, +559, 1389, 1463, +559, 1389, 1491, +591, 1400, 1546, +794, 1400, 1623, +813, 1382, 1691, +874, 1379, 1799, +874, 1408, 1902, +1201, 1371, 2008, +1151, 1350, 2106, +878, 1405, 2245, +1078, 1352, 2375, +1623, 1208, 2472, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1819, 1270, 2510, +1214, 1557, 1667, +1213, 1557, 1668, +1212, 1558, 1669, +1211, 1558, 1670, +1209, 1559, 1672, +1207, 1560, 1674, +1205, 1561, 1677, +1201, 1563, 1681, +1195, 1565, 1686, +1188, 1569, 1694, +1188, 1567, 1706, +1188, 1567, 1722, +1177, 1567, 1744, +1072, 1567, 1776, +1057, 1558, 1825, +1094, 1552, 1894, +1094, 1557, 1981, +1142, 1536, 2063, +1061, 1537, 2170, +810, 1536, 2268, +1232, 1487, 2382, +1680, 1427, 2474, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1839, 1457, 2509, +1512, 1695, 1855, +1511, 1695, 1855, +1510, 1695, 1856, +1508, 1696, 1858, +1505, 1696, 1860, +1502, 1697, 1862, +1497, 1698, 1866, +1491, 1699, 1870, +1482, 1701, 1876, +1478, 1703, 1881, +1478, 1700, 1889, +1478, 1696, 1900, +1475, 1691, 1914, +1446, 1684, 1934, +1440, 1693, 1977, +1405, 1695, 2020, +1418, 1691, 2069, +1312, 1672, 2125, +1209, 1684, 2221, +1248, 1649, 2296, +1541, 1636, 2386, +1794, 1633, 2475, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1900, 1619, 2511, +1813, 1811, 1973, +1812, 1811, 1974, +1812, 1811, 1975, +1811, 1811, 1976, +1810, 1811, 1977, +1809, 1811, 1978, +1808, 1811, 1981, +1806, 1811, 1983, +1803, 1811, 1987, +1799, 1811, 1992, +1795, 1811, 1998, +1789, 1811, 2007, +1779, 1812, 2018, +1767, 1817, 2033, +1749, 1812, 2048, +1751, 1809, 2076, +1717, 1818, 2125, +1722, 1802, 2166, +1667, 1793, 2234, +1699, 1800, 2306, +1776, 1797, 2391, +1871, 1786, 2475, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1978, 1800, 2515, +1972, 1958, 2032, +1972, 1958, 2033, +1971, 1958, 2033, +1971, 1958, 2034, +1970, 1958, 2034, +1969, 1958, 2036, +1968, 1958, 2037, +1967, 1958, 2039, +1965, 1958, 2041, +1962, 1958, 2045, +1961, 1958, 2049, +1958, 1958, 2055, +1955, 1958, 2062, +1947, 1958, 2069, +1940, 1963, 2081, +1937, 1965, 2105, +1931, 1968, 2155, +1905, 1958, 2189, +1920, 1964, 2238, +1898, 1964, 2316, +1934, 1954, 2393, +2043, 1964, 2481, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2108, 1964, 2515, +2123, 2122, 2071, +2123, 2122, 2071, +2123, 2122, 2071, +2123, 2122, 2072, +2124, 2122, 2072, +2124, 2122, 2072, +2124, 2122, 2073, +2125, 2122, 2073, +2125, 2122, 2074, +2126, 2122, 2075, +2126, 2124, 2079, +2126, 2125, 2085, +2125, 2127, 2092, +2119, 2127, 2101, +2119, 2127, 2110, +2122, 2131, 2129, +2118, 2135, 2168, +2110, 2127, 2203, +2114, 2132, 2254, +2126, 2132, 2316, +2148, 2134, 2399, +2218, 2147, 2485, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2259, 2159, 2522, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2355, 2129, +2372, 2355, 2131, +2371, 2356, 2133, +2372, 2357, 2137, +2372, 2358, 2143, +2371, 2358, 2146, +2369, 2356, 2148, +2370, 2358, 2160, +2373, 2358, 2193, +2373, 2358, 2228, +2377, 2357, 2273, +2391, 2362, 2337, +2412, 2367, 2407, +2466, 2386, 2499, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2496, 2392, 2532, +2680, 2654, 1961, +2680, 2654, 1961, +2680, 2654, 1962, +2680, 2654, 1963, +2680, 2655, 1965, +2680, 2655, 1966, +2681, 2655, 1969, +2681, 2656, 1973, +2681, 2655, 1970, +2680, 2654, 1966, +2680, 2654, 1965, +2679, 2653, 1962, +2679, 2653, 1963, +2678, 2655, 1982, +2677, 2657, 2003, +2678, 2657, 2033, +2676, 2653, 2053, +2678, 2656, 2122, +2681, 2656, 2208, +2688, 2660, 2306, +2695, 2665, 2407, +2715, 2678, 2527, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2724, 2684, 2577, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2431, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2715, 2770, 2435, +2716, 2769, 2439, +2714, 2769, 2444, +2711, 2772, 2462, +2712, 2773, 2481, +2714, 2774, 2521, +2713, 2773, 2553, +2717, 2777, 2616, +2723, 2785, 2695, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +871, 0, 0, +871, 0, 0, +871, 0, 0, +871, 0, 0, +871, 0, 28, +871, 0, 152, +871, 0, 280, +871, 0, 408, +871, 0, 537, +871, 0, 667, +871, 0, 797, +871, 0, 928, +845, 0, 1088, +668, 0, 1361, +535, 0, 1543, +769, 0, 1643, +1048, 0, 1782, +1313, 0, 1897, +1561, 0, 2018, +1511, 412, 2179, +186, 987, 2341, +1454, 356, 2467, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +868, 0, 0, +869, 0, 0, +869, 0, 0, +869, 0, 0, +869, 0, 36, +869, 0, 159, +869, 0, 285, +869, 0, 412, +869, 0, 540, +869, 0, 669, +869, 0, 799, +869, 0, 930, +841, 0, 1089, +662, 0, 1361, +526, 0, 1543, +770, 0, 1643, +1043, 0, 1782, +1313, 0, 1897, +1561, 0, 2018, +1510, 423, 2179, +186, 992, 2341, +1457, 360, 2467, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +864, 0, 0, +866, 0, 0, +868, 0, 0, +868, 0, 0, +868, 0, 48, +868, 0, 168, +868, 0, 291, +868, 0, 417, +868, 0, 544, +868, 0, 672, +868, 0, 801, +868, 0, 931, +839, 0, 1090, +653, 0, 1362, +513, 0, 1544, +773, 0, 1644, +1036, 0, 1782, +1312, 0, 1897, +1560, 0, 2019, +1508, 438, 2179, +186, 998, 2341, +1461, 366, 2467, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +1743, 0, 2505, +859, 0, 0, +861, 0, 0, +862, 0, 0, +865, 0, 0, +865, 0, 63, +865, 0, 180, +865, 0, 300, +865, 0, 424, +865, 0, 549, +865, 0, 676, +865, 0, 804, +865, 0, 933, +836, 0, 1091, +640, 0, 1363, +496, 0, 1544, +776, 0, 1645, +1027, 0, 1781, +1311, 0, 1898, +1560, 0, 2020, +1505, 457, 2180, +186, 1005, 2342, +1465, 373, 2467, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +852, 0, 0, +854, 0, 0, +856, 0, 0, +858, 0, 0, +862, 0, 83, +862, 0, 195, +862, 0, 312, +862, 0, 433, +862, 0, 556, +862, 0, 681, +862, 0, 808, +862, 0, 936, +833, 0, 1093, +623, 0, 1364, +473, 0, 1545, +780, 0, 1646, +1015, 0, 1781, +1310, 0, 1899, +1559, 0, 2021, +1502, 482, 2180, +186, 1015, 2342, +1472, 383, 2467, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +1742, 0, 2505, +843, 0, 0, +844, 0, 0, +846, 0, 0, +849, 0, 0, +852, 0, 83, +857, 0, 215, +857, 0, 327, +857, 0, 444, +857, 0, 564, +857, 0, 688, +857, 0, 813, +857, 0, 940, +827, 0, 1096, +599, 30, 1365, +439, 30, 1546, +785, 0, 1648, +998, 0, 1780, +1308, 0, 1900, +1558, 0, 2022, +1497, 512, 2180, +186, 1028, 2343, +1480, 397, 2467, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +1741, 30, 2505, +830, 4, 0, +831, 0, 0, +833, 0, 0, +836, 0, 0, +839, 0, 83, +844, 0, 215, +851, 0, 347, +851, 0, 459, +851, 0, 576, +851, 0, 697, +851, 0, 820, +851, 0, 946, +821, 0, 1100, +565, 163, 1367, +390, 163, 1547, +793, 32, 1650, +974, 0, 1779, +1306, 0, 1901, +1557, 32, 2024, +1491, 551, 2181, +186, 1045, 2344, +1491, 413, 2467, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +1740, 163, 2506, +812, 144, 0, +813, 137, 0, +815, 127, 0, +818, 114, 0, +822, 96, 83, +827, 70, 215, +834, 34, 347, +842, 0, 479, +842, 0, 591, +842, 0, 708, +842, 0, 829, +842, 0, 952, +812, 52, 1105, +515, 295, 1370, +314, 295, 1549, +802, 164, 1653, +940, 0, 1778, +1302, 0, 1903, +1555, 164, 2027, +1483, 597, 2182, +186, 1066, 2345, +1505, 435, 2467, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +1739, 295, 2506, +787, 281, 0, +788, 276, 0, +790, 269, 0, +793, 259, 0, +797, 246, 83, +803, 227, 215, +809, 202, 347, +819, 166, 479, +831, 111, 611, +831, 111, 723, +831, 111, 840, +831, 111, 961, +799, 167, 1111, +438, 426, 1374, +188, 426, 1552, +814, 296, 1657, +891, 0, 1777, +1298, 111, 1905, +1552, 296, 2030, +1472, 653, 2183, +186, 1093, 2347, +1516, 532, 2467, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +1738, 426, 2507, +750, 417, 0, +752, 413, 0, +755, 408, 0, +758, 401, 0, +762, 391, 83, +768, 378, 215, +775, 360, 347, +785, 334, 479, +798, 298, 611, +815, 244, 743, +815, 244, 856, +815, 244, 973, +782, 286, 1119, +345, 536, 1379, +0, 559, 1555, +831, 428, 1662, +899, 104, 1780, +1292, 244, 1908, +1549, 428, 2034, +1456, 718, 2185, +186, 1128, 2349, +1530, 640, 2468, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +1736, 559, 2508, +697, 552, 0, +699, 549, 0, +702, 545, 0, +705, 540, 0, +710, 533, 83, +717, 523, 215, +725, 510, 347, +736, 492, 479, +750, 466, 611, +769, 430, 743, +792, 376, 875, +792, 376, 988, +758, 407, 1131, +280, 611, 1385, +0, 691, 1559, +799, 583, 1666, +916, 342, 1786, +1257, 324, 1907, +1545, 560, 2040, +1434, 792, 2187, +186, 1169, 2352, +1547, 752, 2469, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +1732, 691, 2509, +697, 686, 0, +699, 684, 0, +702, 681, 0, +705, 677, 0, +710, 672, 83, +717, 665, 215, +725, 655, 347, +736, 643, 479, +750, 624, 611, +769, 599, 743, +792, 562, 875, +792, 654, 1044, +758, 672, 1172, +280, 796, 1409, +0, 823, 1576, +799, 745, 1680, +916, 591, 1792, +1279, 529, 1915, +1502, 692, 2050, +1352, 947, 2199, +0, 1212, 2357, +1603, 785, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +699, 854, 85, +691, 854, 130, +694, 852, 185, +698, 850, 248, +702, 846, 322, +709, 841, 404, +717, 835, 496, +728, 826, 594, +743, 814, 700, +762, 797, 811, +786, 774, 927, +786, 834, 1081, +805, 893, 1228, +403, 973, 1443, +0, 983, 1599, +812, 918, 1701, +921, 837, 1807, +1293, 760, 1928, +1442, 849, 2062, +1230, 1096, 2212, +0, 1254, 2365, +1657, 848, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +910, 1134, 954, +905, 1134, 961, +898, 1134, 970, +889, 1134, 982, +875, 1134, 998, +857, 1134, 1018, +832, 1134, 1043, +795, 1134, 1075, +741, 1134, 1115, +699, 1131, 1163, +726, 1120, 1220, +726, 1149, 1307, +748, 1179, 1402, +901, 1179, 1504, +767, 1185, 1644, +906, 1170, 1757, +968, 1186, 1861, +1214, 1140, 1967, +1304, 1131, 2079, +1082, 1261, 2229, +975, 1275, 2368, +1638, 1044, 2470, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +993, 1376, 1327, +989, 1376, 1330, +983, 1376, 1334, +975, 1376, 1340, +964, 1376, 1347, +949, 1376, 1356, +928, 1376, 1368, +899, 1376, 1385, +857, 1376, 1405, +793, 1376, 1431, +691, 1376, 1463, +691, 1376, 1491, +715, 1388, 1546, +877, 1388, 1623, +945, 1376, 1697, +997, 1370, 1804, +1006, 1396, 1906, +1223, 1377, 2010, +1151, 1350, 2105, +878, 1405, 2247, +1167, 1339, 2373, +1626, 1218, 2473, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1826, 1254, 2510, +1284, 1548, 1666, +1284, 1549, 1666, +1283, 1549, 1667, +1282, 1550, 1668, +1281, 1550, 1670, +1279, 1551, 1673, +1276, 1553, 1675, +1273, 1555, 1680, +1269, 1557, 1685, +1263, 1560, 1692, +1239, 1562, 1707, +1239, 1562, 1723, +1229, 1562, 1745, +1136, 1562, 1777, +1127, 1554, 1826, +1162, 1550, 1897, +1168, 1552, 1984, +1181, 1539, 2065, +1075, 1537, 2169, +810, 1538, 2270, +1285, 1479, 2381, +1681, 1429, 2475, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1842, 1448, 2509, +1553, 1689, 1859, +1552, 1689, 1860, +1551, 1689, 1861, +1549, 1690, 1862, +1547, 1690, 1864, +1544, 1691, 1867, +1539, 1692, 1870, +1534, 1693, 1874, +1526, 1695, 1880, +1522, 1697, 1885, +1517, 1700, 1891, +1517, 1696, 1902, +1515, 1691, 1916, +1488, 1684, 1935, +1461, 1690, 1974, +1430, 1693, 2019, +1446, 1691, 2070, +1360, 1672, 2128, +1236, 1684, 2221, +1248, 1653, 2296, +1559, 1632, 2386, +1794, 1630, 2475, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1898, 1615, 2511, +1821, 1809, 1972, +1820, 1809, 1972, +1820, 1809, 1973, +1819, 1809, 1974, +1818, 1809, 1975, +1817, 1809, 1977, +1816, 1809, 1979, +1813, 1809, 1982, +1811, 1809, 1986, +1807, 1809, 1990, +1800, 1811, 1998, +1793, 1811, 2007, +1784, 1811, 2018, +1772, 1817, 2033, +1754, 1811, 2049, +1756, 1809, 2076, +1721, 1816, 2124, +1728, 1804, 2168, +1675, 1795, 2234, +1712, 1800, 2308, +1779, 1799, 2391, +1880, 1789, 2475, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1982, 1798, 2515, +1977, 1958, 2034, +1977, 1958, 2034, +1976, 1958, 2035, +1976, 1958, 2035, +1975, 1958, 2036, +1974, 1958, 2037, +1973, 1958, 2038, +1972, 1958, 2040, +1970, 1958, 2043, +1968, 1958, 2046, +1964, 1958, 2050, +1962, 1958, 2056, +1959, 1958, 2063, +1950, 1958, 2070, +1942, 1961, 2081, +1940, 1963, 2103, +1935, 1966, 2152, +1912, 1959, 2190, +1920, 1962, 2236, +1904, 1962, 2314, +1936, 1954, 2394, +2043, 1964, 2481, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2112, 1962, 2514, +2124, 2124, 2073, +2124, 2124, 2073, +2124, 2124, 2073, +2125, 2124, 2073, +2125, 2124, 2073, +2125, 2124, 2074, +2125, 2124, 2074, +2126, 2124, 2075, +2126, 2124, 2076, +2127, 2124, 2076, +2129, 2124, 2078, +2129, 2125, 2083, +2128, 2127, 2090, +2122, 2127, 2100, +2119, 2127, 2110, +2123, 2131, 2129, +2120, 2135, 2167, +2113, 2128, 2205, +2115, 2130, 2253, +2128, 2131, 2316, +2148, 2135, 2400, +2220, 2148, 2485, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2258, 2159, 2521, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2124, +2370, 2355, 2125, +2370, 2355, 2125, +2370, 2355, 2126, +2371, 2355, 2126, +2371, 2355, 2127, +2371, 2355, 2129, +2372, 2355, 2131, +2372, 2355, 2133, +2373, 2356, 2137, +2374, 2357, 2143, +2372, 2357, 2146, +2369, 2356, 2148, +2370, 2358, 2159, +2374, 2358, 2192, +2374, 2358, 2228, +2379, 2358, 2273, +2393, 2364, 2337, +2413, 2367, 2408, +2467, 2387, 2498, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2496, 2393, 2533, +2680, 2654, 1959, +2680, 2654, 1959, +2680, 2654, 1960, +2680, 2654, 1961, +2680, 2654, 1963, +2680, 2655, 1965, +2680, 2655, 1968, +2680, 2655, 1971, +2680, 2655, 1969, +2680, 2654, 1965, +2679, 2653, 1959, +2679, 2652, 1957, +2678, 2652, 1958, +2678, 2654, 1977, +2677, 2657, 1996, +2678, 2657, 2031, +2677, 2654, 2057, +2678, 2657, 2122, +2682, 2656, 2208, +2688, 2660, 2307, +2695, 2665, 2407, +2715, 2678, 2527, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2725, 2684, 2578, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2430, +2713, 2770, 2430, +2714, 2770, 2430, +2714, 2770, 2430, +2715, 2770, 2430, +2715, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2431, +2716, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2712, 2773, 2483, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2616, +2724, 2786, 2697, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +1004, 0, 0, +1004, 0, 0, +1004, 0, 0, +1004, 0, 0, +1004, 0, 28, +1004, 0, 152, +1004, 0, 280, +1004, 0, 408, +1004, 0, 537, +1004, 0, 667, +1004, 0, 797, +1004, 0, 928, +985, 0, 1088, +862, 0, 1361, +674, 0, 1566, +856, 0, 1661, +1128, 0, 1782, +1394, 0, 1902, +1561, 0, 2022, +1491, 535, 2188, +220, 987, 2343, +1533, 158, 2465, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1002, 0, 0, +1003, 0, 0, +1003, 0, 0, +1003, 0, 0, +1003, 0, 36, +1003, 0, 159, +1003, 0, 285, +1003, 0, 412, +1003, 0, 540, +1003, 0, 669, +1003, 0, 799, +1003, 0, 930, +982, 0, 1089, +858, 0, 1361, +667, 0, 1566, +858, 0, 1662, +1124, 0, 1782, +1393, 0, 1903, +1561, 0, 2022, +1490, 544, 2188, +220, 992, 2343, +1536, 164, 2465, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +999, 0, 0, +1000, 0, 0, +1002, 0, 0, +1002, 0, 0, +1002, 0, 48, +1002, 0, 168, +1002, 0, 291, +1002, 0, 417, +1002, 0, 544, +1002, 0, 672, +1002, 0, 801, +1002, 0, 931, +981, 0, 1090, +852, 0, 1362, +658, 0, 1567, +860, 0, 1662, +1118, 0, 1782, +1393, 0, 1903, +1560, 0, 2023, +1488, 556, 2188, +220, 998, 2343, +1539, 173, 2465, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +1747, 0, 2505, +996, 0, 0, +996, 0, 0, +998, 0, 0, +1000, 0, 0, +1000, 0, 63, +1000, 0, 180, +1000, 0, 300, +1000, 0, 424, +1000, 0, 549, +1000, 0, 676, +1000, 0, 804, +1000, 0, 933, +979, 0, 1091, +844, 0, 1363, +645, 0, 1567, +862, 0, 1663, +1110, 0, 1781, +1392, 0, 1903, +1560, 0, 2024, +1486, 570, 2188, +220, 1005, 2344, +1543, 185, 2465, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +1746, 0, 2505, +990, 0, 0, +991, 0, 0, +993, 0, 0, +995, 0, 0, +997, 0, 83, +997, 0, 195, +997, 0, 312, +997, 0, 433, +997, 0, 556, +997, 0, 681, +997, 0, 808, +997, 0, 936, +976, 0, 1093, +833, 0, 1364, +629, 0, 1568, +866, 0, 1664, +1100, 0, 1781, +1391, 0, 1904, +1559, 0, 2025, +1482, 590, 2189, +220, 1015, 2344, +1548, 200, 2465, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +1746, 0, 2506, +983, 0, 0, +985, 0, 0, +986, 0, 0, +988, 0, 0, +991, 0, 83, +994, 0, 215, +994, 0, 327, +994, 0, 444, +994, 0, 564, +994, 0, 688, +994, 0, 813, +994, 0, 940, +973, 0, 1096, +819, 30, 1365, +605, 30, 1569, +871, 0, 1666, +1086, 0, 1780, +1390, 0, 1905, +1558, 0, 2026, +1477, 614, 2189, +220, 1028, 2345, +1555, 219, 2465, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +1745, 30, 2506, +974, 4, 0, +975, 0, 0, +977, 0, 0, +979, 0, 0, +981, 0, 83, +985, 0, 215, +989, 0, 347, +989, 0, 459, +989, 0, 576, +989, 0, 697, +989, 0, 820, +989, 0, 946, +968, 0, 1100, +798, 163, 1367, +571, 163, 1570, +876, 32, 1668, +1067, 0, 1779, +1388, 0, 1906, +1557, 32, 2028, +1471, 645, 2190, +220, 1045, 2346, +1564, 244, 2465, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +1744, 163, 2506, +961, 144, 0, +962, 137, 0, +963, 127, 0, +966, 114, 0, +968, 96, 83, +972, 70, 215, +977, 34, 347, +983, 0, 479, +983, 0, 591, +983, 0, 708, +983, 0, 829, +983, 0, 952, +961, 52, 1105, +769, 295, 1370, +522, 295, 1572, +884, 164, 1671, +1039, 0, 1778, +1385, 0, 1908, +1555, 164, 2031, +1462, 683, 2191, +220, 1066, 2347, +1576, 275, 2465, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +1743, 295, 2507, +943, 281, 0, +944, 276, 0, +946, 269, 0, +948, 259, 0, +951, 246, 83, +955, 227, 215, +959, 202, 347, +966, 166, 479, +975, 111, 611, +975, 111, 723, +975, 111, 840, +975, 111, 961, +952, 167, 1111, +726, 426, 1374, +446, 426, 1574, +895, 296, 1674, +1000, 0, 1777, +1382, 111, 1910, +1552, 296, 2034, +1450, 729, 2192, +220, 1093, 2349, +1586, 407, 2466, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +1741, 426, 2508, +917, 417, 0, +919, 413, 0, +920, 408, 0, +923, 401, 0, +926, 391, 83, +930, 378, 215, +935, 360, 347, +942, 334, 479, +951, 298, 611, +963, 244, 743, +963, 244, 856, +963, 244, 973, +940, 286, 1119, +679, 536, 1379, +320, 559, 1577, +908, 428, 1679, +1006, 104, 1780, +1377, 244, 1913, +1549, 428, 2038, +1434, 785, 2194, +220, 1128, 2351, +1598, 544, 2467, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +1739, 559, 2508, +881, 552, 0, +883, 549, 0, +884, 545, 0, +887, 540, 0, +890, 533, 83, +894, 523, 215, +900, 510, 347, +908, 492, 479, +917, 466, 611, +930, 430, 743, +947, 376, 875, +947, 376, 988, +923, 407, 1131, +649, 611, 1385, +67, 691, 1581, +882, 583, 1684, +1020, 342, 1786, +1348, 324, 1912, +1545, 560, 2044, +1411, 850, 2196, +220, 1169, 2354, +1613, 680, 2468, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +1736, 691, 2509, +828, 686, 0, +829, 684, 0, +831, 681, 0, +834, 677, 0, +838, 672, 83, +842, 665, 215, +849, 655, 347, +857, 643, 479, +868, 624, 611, +883, 599, 743, +901, 562, 875, +925, 508, 1007, +899, 532, 1145, +605, 694, 1393, +0, 823, 1587, +799, 745, 1688, +1039, 540, 1792, +1299, 403, 1909, +1539, 692, 2052, +1379, 925, 2199, +0, 1212, 2357, +1633, 815, 2469, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +1732, 823, 2511, +829, 854, 85, +823, 854, 130, +825, 852, 185, +828, 850, 248, +832, 846, 322, +837, 841, 404, +843, 835, 496, +852, 826, 594, +863, 814, 700, +877, 797, 811, +896, 774, 927, +920, 741, 1047, +934, 812, 1203, +669, 906, 1428, +0, 983, 1610, +812, 918, 1709, +1043, 809, 1807, +1313, 689, 1923, +1484, 849, 2064, +1265, 1080, 2212, +0, 1254, 2365, +1683, 875, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +996, 1134, 954, +992, 1134, 961, +986, 1134, 970, +979, 1134, 982, +968, 1134, 998, +953, 1134, 1018, +932, 1134, 1043, +903, 1134, 1075, +861, 1134, 1115, +829, 1131, 1163, +850, 1120, 1220, +876, 1105, 1286, +892, 1138, 1385, +1008, 1138, 1491, +767, 1185, 1653, +906, 1170, 1765, +1078, 1173, 1861, +1237, 1110, 1962, +1360, 1131, 2081, +1129, 1250, 2229, +975, 1275, 2368, +1666, 1061, 2470, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1129, 1359, 1308, +1126, 1359, 1311, +1121, 1359, 1315, +1115, 1359, 1321, +1107, 1359, 1328, +1097, 1359, 1338, +1082, 1359, 1351, +1061, 1359, 1367, +1032, 1359, 1389, +989, 1359, 1416, +926, 1359, 1449, +823, 1359, 1491, +841, 1371, 1546, +969, 1371, 1623, +1077, 1367, 1705, +1117, 1361, 1811, +1138, 1380, 1911, +1246, 1386, 2012, +1151, 1350, 2103, +878, 1405, 2249, +1204, 1332, 2374, +1631, 1230, 2474, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1835, 1230, 2510, +1361, 1536, 1656, +1360, 1537, 1657, +1360, 1537, 1658, +1359, 1538, 1659, +1358, 1539, 1661, +1356, 1540, 1663, +1354, 1541, 1667, +1351, 1543, 1671, +1347, 1545, 1676, +1342, 1549, 1684, +1323, 1550, 1699, +1283, 1550, 1723, +1274, 1550, 1745, +1190, 1550, 1777, +1220, 1548, 1833, +1249, 1544, 1903, +1265, 1540, 1988, +1206, 1545, 2067, +1075, 1537, 2167, +810, 1538, 2272, +1313, 1474, 2382, +1686, 1437, 2475, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1851, 1433, 2509, +1603, 1680, 1865, +1602, 1680, 1865, +1600, 1680, 1867, +1599, 1681, 1868, +1597, 1681, 1870, +1594, 1682, 1872, +1590, 1683, 1876, +1585, 1684, 1880, +1578, 1686, 1886, +1575, 1689, 1891, +1571, 1692, 1897, +1565, 1696, 1905, +1563, 1691, 1919, +1538, 1684, 1938, +1489, 1686, 1969, +1460, 1689, 2014, +1482, 1691, 2072, +1418, 1672, 2133, +1270, 1684, 2221, +1248, 1657, 2296, +1563, 1627, 2386, +1794, 1625, 2476, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1896, 1610, 2511, +1830, 1805, 1969, +1830, 1805, 1970, +1829, 1805, 1971, +1829, 1805, 1972, +1828, 1805, 1973, +1827, 1805, 1974, +1825, 1805, 1977, +1823, 1805, 1979, +1821, 1805, 1983, +1817, 1805, 1988, +1810, 1807, 1996, +1800, 1811, 2007, +1791, 1811, 2018, +1779, 1817, 2033, +1762, 1811, 2051, +1763, 1809, 2078, +1725, 1813, 2122, +1736, 1807, 2171, +1689, 1798, 2234, +1727, 1800, 2309, +1778, 1800, 2391, +1894, 1792, 2475, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1986, 1795, 2515, +1983, 1958, 2036, +1983, 1958, 2036, +1983, 1958, 2037, +1983, 1958, 2037, +1982, 1958, 2038, +1981, 1958, 2039, +1980, 1958, 2040, +1979, 1958, 2042, +1977, 1958, 2045, +1974, 1958, 2048, +1971, 1958, 2052, +1966, 1958, 2058, +1963, 1958, 2065, +1955, 1958, 2072, +1945, 1959, 2081, +1942, 1961, 2103, +1940, 1963, 2147, +1922, 1962, 2193, +1920, 1960, 2233, +1912, 1960, 2312, +1943, 1954, 2394, +2043, 1964, 2481, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2119, 1960, 2514, +2126, 2125, 2075, +2126, 2125, 2075, +2126, 2125, 2075, +2126, 2125, 2075, +2126, 2125, 2075, +2127, 2125, 2076, +2127, 2125, 2076, +2127, 2125, 2076, +2128, 2125, 2077, +2129, 2125, 2078, +2130, 2125, 2080, +2132, 2125, 2082, +2131, 2127, 2089, +2125, 2127, 2098, +2119, 2127, 2110, +2123, 2131, 2129, +2124, 2135, 2165, +2118, 2130, 2208, +2117, 2129, 2251, +2132, 2129, 2316, +2154, 2135, 2400, +2222, 2149, 2485, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2257, 2159, 2521, +2371, 2355, 2125, +2371, 2355, 2125, +2371, 2355, 2125, +2371, 2355, 2126, +2372, 2355, 2126, +2372, 2355, 2127, +2372, 2355, 2127, +2372, 2355, 2128, +2372, 2355, 2130, +2373, 2355, 2132, +2374, 2355, 2134, +2374, 2355, 2136, +2375, 2356, 2142, +2373, 2356, 2145, +2371, 2355, 2148, +2372, 2357, 2159, +2375, 2358, 2191, +2375, 2358, 2229, +2381, 2358, 2273, +2396, 2366, 2336, +2413, 2367, 2408, +2468, 2388, 2498, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2497, 2394, 2532, +2679, 2653, 1956, +2679, 2653, 1957, +2679, 2653, 1958, +2679, 2654, 1959, +2679, 2654, 1961, +2680, 2654, 1962, +2680, 2654, 1965, +2680, 2655, 1969, +2680, 2654, 1966, +2679, 2653, 1962, +2679, 2652, 1957, +2678, 2651, 1950, +2678, 2650, 1950, +2677, 2652, 1970, +2676, 2657, 1988, +2678, 2657, 2023, +2679, 2655, 2063, +2679, 2657, 2122, +2682, 2656, 2208, +2688, 2660, 2308, +2695, 2665, 2407, +2715, 2678, 2527, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2726, 2684, 2578, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2770, 2428, +2712, 2770, 2429, +2712, 2770, 2429, +2712, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2713, 2770, 2429, +2714, 2770, 2429, +2714, 2770, 2430, +2715, 2770, 2430, +2716, 2770, 2431, +2717, 2770, 2431, +2717, 2770, 2432, +2716, 2770, 2435, +2716, 2769, 2439, +2714, 2770, 2444, +2711, 2772, 2462, +2713, 2774, 2488, +2714, 2775, 2522, +2712, 2773, 2553, +2717, 2777, 2617, +2724, 2787, 2699, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +1146, 0, 0, +1146, 0, 0, +1146, 0, 0, +1146, 0, 46, +1146, 0, 140, +1146, 0, 240, +1146, 0, 347, +1146, 0, 460, +1146, 0, 576, +1146, 0, 697, +1146, 0, 820, +1146, 0, 946, +1143, 0, 1084, +1060, 0, 1359, +918, 0, 1574, +981, 0, 1683, +1223, 0, 1785, +1476, 0, 1909, +1569, 0, 2028, +1478, 645, 2197, +391, 989, 2347, +1611, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1146, 0, 0, +1146, 0, 0, +1146, 0, 27, +1146, 0, 101, +1146, 0, 185, +1146, 0, 277, +1146, 0, 376, +1146, 0, 482, +1146, 0, 594, +1146, 0, 710, +1146, 0, 830, +1146, 0, 953, +1142, 0, 1089, +1059, 0, 1361, +917, 0, 1576, +981, 0, 1683, +1223, 0, 1786, +1476, 0, 1910, +1569, 0, 2029, +1477, 656, 2197, +395, 992, 2347, +1611, 0, 2464, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1757, 0, 2506, +1143, 0, 0, +1143, 0, 0, +1144, 0, 38, +1144, 0, 111, +1144, 0, 193, +1144, 0, 284, +1144, 0, 382, +1144, 0, 487, +1144, 0, 598, +1144, 0, 713, +1144, 0, 833, +1144, 0, 955, +1141, 0, 1090, +1055, 0, 1362, +911, 0, 1576, +982, 0, 1684, +1219, 0, 1785, +1475, 0, 1911, +1568, 0, 2029, +1475, 665, 2197, +395, 998, 2347, +1614, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1141, 0, 0, +1141, 0, 0, +1142, 0, 38, +1143, 0, 124, +1143, 0, 204, +1143, 0, 293, +1143, 0, 389, +1143, 0, 493, +1143, 0, 602, +1143, 0, 717, +1143, 0, 835, +1143, 0, 957, +1140, 0, 1091, +1050, 0, 1363, +904, 0, 1577, +984, 0, 1685, +1213, 0, 1785, +1474, 0, 1911, +1568, 0, 2030, +1472, 676, 2198, +395, 1005, 2348, +1617, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1137, 0, 0, +1137, 0, 0, +1138, 0, 38, +1139, 0, 124, +1141, 0, 219, +1141, 0, 305, +1141, 0, 399, +1141, 0, 501, +1141, 0, 608, +1141, 0, 722, +1141, 0, 839, +1141, 0, 960, +1138, 0, 1093, +1043, 0, 1364, +895, 0, 1577, +987, 0, 1686, +1205, 0, 1784, +1474, 0, 1912, +1567, 0, 2031, +1469, 692, 2198, +395, 1015, 2348, +1622, 0, 2464, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1756, 0, 2506, +1132, 0, 0, +1132, 0, 0, +1133, 0, 38, +1134, 0, 124, +1136, 0, 219, +1139, 0, 320, +1139, 0, 411, +1139, 0, 511, +1139, 0, 616, +1139, 0, 728, +1139, 0, 844, +1139, 0, 963, +1136, 0, 1096, +1034, 0, 1365, +882, 0, 1578, +990, 0, 1687, +1194, 0, 1784, +1472, 0, 1913, +1566, 0, 2032, +1464, 711, 2199, +395, 1028, 2349, +1628, 0, 2464, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1755, 0, 2507, +1125, 13, 0, +1125, 0, 0, +1126, 0, 38, +1128, 0, 124, +1129, 0, 219, +1132, 0, 320, +1135, 0, 428, +1135, 0, 524, +1135, 0, 627, +1135, 0, 736, +1135, 0, 850, +1135, 0, 968, +1132, 0, 1100, +1021, 107, 1367, +864, 107, 1579, +995, 0, 1690, +1178, 0, 1783, +1471, 0, 1914, +1565, 97, 2034, +1457, 736, 2199, +395, 1045, 2350, +1636, 0, 2464, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1754, 107, 2507, +1116, 150, 0, +1116, 137, 0, +1117, 127, 38, +1118, 114, 124, +1120, 96, 219, +1123, 70, 320, +1126, 34, 428, +1131, 0, 541, +1131, 0, 640, +1131, 0, 747, +1131, 0, 858, +1131, 0, 975, +1128, 0, 1105, +1003, 254, 1370, +839, 254, 1581, +1001, 137, 1692, +1157, 0, 1782, +1469, 17, 1915, +1563, 213, 2037, +1448, 768, 2200, +395, 1066, 2351, +1646, 21, 2464, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1753, 254, 2507, +1103, 286, 0, +1103, 276, 0, +1104, 269, 38, +1106, 259, 124, +1108, 246, 219, +1110, 227, 320, +1114, 202, 428, +1118, 166, 541, +1125, 111, 658, +1125, 111, 760, +1125, 111, 869, +1125, 111, 983, +1121, 111, 1111, +979, 396, 1374, +803, 396, 1584, +1009, 276, 1696, +1127, 0, 1781, +1466, 140, 1918, +1560, 333, 2040, +1436, 807, 2201, +395, 1093, 2353, +1654, 232, 2464, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1751, 396, 2508, +1085, 420, 0, +1085, 413, 0, +1086, 408, 38, +1088, 401, 124, +1090, 391, 219, +1093, 378, 320, +1097, 360, 428, +1102, 334, 541, +1108, 298, 658, +1116, 244, 779, +1116, 244, 884, +1116, 244, 995, +1113, 244, 1119, +952, 513, 1379, +749, 536, 1587, +1019, 413, 1700, +1132, 186, 1784, +1462, 265, 1920, +1557, 456, 2044, +1419, 854, 2202, +395, 1128, 2355, +1664, 421, 2465, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1749, 536, 2509, +1061, 554, 0, +1061, 549, 0, +1062, 545, 38, +1064, 540, 124, +1066, 533, 219, +1069, 523, 320, +1073, 510, 428, +1078, 492, 541, +1085, 466, 658, +1093, 430, 779, +1105, 376, 902, +1105, 376, 1009, +1102, 376, 1131, +936, 591, 1385, +666, 674, 1590, +999, 572, 1705, +1142, 392, 1789, +1438, 342, 1919, +1553, 581, 2050, +1395, 910, 2205, +395, 1169, 2358, +1678, 592, 2466, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1746, 674, 2510, +1025, 688, 0, +1025, 684, 0, +1027, 681, 38, +1028, 677, 124, +1031, 672, 219, +1034, 665, 320, +1038, 655, 428, +1044, 643, 541, +1051, 624, 658, +1061, 599, 779, +1073, 562, 902, +1089, 508, 1028, +1086, 508, 1145, +913, 678, 1393, +525, 811, 1596, +936, 738, 1709, +1157, 573, 1796, +1399, 418, 1917, +1547, 709, 2058, +1361, 976, 2207, +221, 1212, 2361, +1695, 752, 2468, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +1742, 811, 2511, +998, 854, 247, +999, 854, 274, +1000, 852, 314, +1002, 850, 363, +1005, 846, 421, +1008, 841, 488, +1013, 835, 565, +1018, 826, 651, +1026, 814, 746, +1036, 797, 847, +1050, 774, 955, +1067, 741, 1069, +1082, 701, 1186, +907, 818, 1417, +458, 939, 1611, +854, 914, 1719, +1166, 781, 1811, +1344, 583, 1918, +1532, 855, 2069, +1306, 1062, 2213, +0, 1254, 2365, +1713, 908, 2469, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1738, 955, 2513, +1120, 1134, 981, +1120, 1134, 987, +1116, 1134, 996, +1110, 1134, 1007, +1102, 1134, 1022, +1091, 1134, 1041, +1076, 1134, 1065, +1055, 1134, 1096, +1025, 1134, 1133, +1003, 1131, 1180, +1017, 1120, 1235, +1036, 1105, 1300, +1052, 1087, 1374, +1136, 1087, 1482, +920, 1158, 1655, +941, 1167, 1774, +1193, 1161, 1864, +1274, 1071, 1958, +1421, 1134, 2085, +1184, 1237, 2230, +980, 1275, 2368, +1697, 1083, 2471, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1244, 1351, 1313, +1244, 1351, 1315, +1241, 1351, 1320, +1236, 1351, 1325, +1230, 1351, 1332, +1222, 1351, 1342, +1211, 1351, 1355, +1195, 1351, 1371, +1174, 1351, 1392, +1143, 1351, 1419, +1099, 1351, 1452, +1031, 1351, 1493, +1008, 1345, 1543, +1101, 1345, 1620, +1200, 1345, 1706, +1180, 1356, 1819, +1250, 1368, 1917, +1282, 1376, 2010, +1214, 1352, 2106, +941, 1399, 2251, +1206, 1332, 2375, +1655, 1246, 2474, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1442, 1522, 1648, +1441, 1522, 1649, +1440, 1523, 1650, +1440, 1523, 1651, +1439, 1524, 1653, +1437, 1525, 1655, +1436, 1526, 1658, +1433, 1528, 1663, +1430, 1531, 1668, +1426, 1534, 1676, +1410, 1536, 1691, +1377, 1536, 1716, +1335, 1537, 1749, +1263, 1537, 1781, +1301, 1537, 1839, +1339, 1536, 1910, +1357, 1528, 1994, +1241, 1551, 2071, +1105, 1537, 2167, +883, 1536, 2275, +1324, 1476, 2384, +1692, 1446, 2476, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1866, 1416, 2509, +1656, 1669, 1872, +1656, 1669, 1873, +1655, 1669, 1874, +1654, 1670, 1875, +1652, 1671, 1877, +1650, 1671, 1879, +1646, 1672, 1883, +1642, 1674, 1887, +1636, 1675, 1893, +1633, 1678, 1897, +1629, 1681, 1903, +1624, 1685, 1911, +1616, 1691, 1922, +1595, 1684, 1941, +1542, 1684, 1969, +1504, 1684, 2010, +1525, 1691, 2073, +1483, 1671, 2138, +1324, 1684, 2221, +1259, 1662, 2297, +1564, 1621, 2385, +1796, 1617, 2477, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1894, 1605, 2510, +1843, 1802, 1967, +1843, 1802, 1968, +1843, 1802, 1969, +1842, 1802, 1969, +1841, 1802, 1971, +1840, 1802, 1972, +1839, 1802, 1974, +1837, 1802, 1977, +1834, 1802, 1981, +1831, 1802, 1986, +1824, 1804, 1994, +1814, 1807, 2005, +1802, 1811, 2018, +1790, 1817, 2033, +1773, 1811, 2052, +1772, 1809, 2081, +1734, 1809, 2120, +1747, 1811, 2175, +1708, 1801, 2234, +1744, 1800, 2309, +1774, 1800, 2391, +1911, 1796, 2475, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1790, 2515, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1991, 1958, 2038, +1991, 1958, 2038, +1990, 1958, 2040, +1989, 1958, 2041, +1988, 1958, 2043, +1986, 1958, 2045, +1983, 1958, 2049, +1980, 1958, 2053, +1976, 1958, 2059, +1970, 1958, 2067, +1962, 1958, 2074, +1950, 1958, 2082, +1946, 1958, 2104, +1947, 1962, 2142, +1936, 1964, 2196, +1923, 1957, 2231, +1922, 1958, 2310, +1954, 1955, 2394, +2043, 1964, 2481, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2127, 1958, 2514, +2128, 2127, 2076, +2128, 2127, 2077, +2129, 2127, 2077, +2129, 2127, 2077, +2129, 2127, 2077, +2129, 2127, 2078, +2130, 2127, 2078, +2130, 2127, 2079, +2131, 2127, 2080, +2132, 2127, 2080, +2133, 2127, 2082, +2135, 2127, 2084, +2135, 2127, 2087, +2129, 2127, 2097, +2122, 2127, 2109, +2124, 2131, 2129, +2128, 2135, 2163, +2124, 2132, 2210, +2119, 2127, 2251, +2135, 2128, 2316, +2164, 2135, 2400, +2226, 2151, 2485, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2257, 2159, 2520, +2374, 2355, 2126, +2374, 2355, 2127, +2374, 2355, 2127, +2374, 2355, 2127, +2374, 2355, 2127, +2374, 2355, 2128, +2374, 2355, 2129, +2375, 2355, 2130, +2375, 2355, 2131, +2375, 2355, 2133, +2376, 2355, 2135, +2377, 2355, 2138, +2376, 2355, 2140, +2375, 2355, 2143, +2372, 2354, 2147, +2374, 2356, 2159, +2375, 2358, 2191, +2375, 2357, 2230, +2381, 2358, 2275, +2398, 2368, 2335, +2415, 2368, 2409, +2469, 2388, 2498, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2498, 2395, 2532, +2679, 2653, 1955, +2679, 2653, 1955, +2679, 2653, 1956, +2679, 2653, 1957, +2679, 2653, 1958, +2679, 2654, 1961, +2679, 2654, 1963, +2679, 2654, 1967, +2679, 2654, 1964, +2679, 2653, 1961, +2678, 2652, 1955, +2678, 2650, 1948, +2677, 2648, 1939, +2677, 2650, 1960, +2676, 2655, 1976, +2677, 2657, 2013, +2680, 2657, 2068, +2679, 2658, 2122, +2683, 2657, 2209, +2688, 2661, 2310, +2695, 2666, 2408, +2715, 2679, 2527, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2727, 2684, 2579, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2427, +2712, 2769, 2428, +2712, 2769, 2428, +2712, 2769, 2428, +2713, 2769, 2428, +2713, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2717, 2770, 2436, +2716, 2770, 2440, +2714, 2770, 2444, +2712, 2772, 2461, +2714, 2774, 2492, +2714, 2775, 2523, +2712, 2774, 2554, +2717, 2778, 2620, +2725, 2789, 2702, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +2729, 2789, 2727, +1314, 0, 0, +1314, 0, 0, +1315, 0, 0, +1316, 0, 18, +1317, 0, 98, +1319, 0, 188, +1321, 0, 285, +1324, 0, 389, +1328, 0, 499, +1331, 0, 624, +1331, 0, 765, +1331, 0, 904, +1329, 0, 1054, +1312, 0, 1291, +1236, 0, 1533, +1269, 0, 1690, +1323, 0, 1781, +1534, 0, 1909, +1607, 0, 2039, +1502, 645, 2197, +677, 1023, 2352, +1658, 0, 2466, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1314, 0, 0, +1314, 0, 0, +1315, 0, 17, +1315, 0, 78, +1316, 0, 150, +1318, 0, 230, +1321, 0, 319, +1324, 0, 417, +1328, 0, 521, +1331, 0, 640, +1331, 0, 777, +1331, 0, 914, +1329, 0, 1059, +1311, 0, 1294, +1235, 0, 1535, +1268, 0, 1691, +1323, 0, 1782, +1533, 0, 1910, +1607, 0, 2039, +1501, 656, 2197, +679, 1026, 2352, +1659, 0, 2466, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1776, 0, 2506, +1314, 0, 0, +1314, 0, 17, +1314, 0, 97, +1315, 0, 149, +1316, 0, 211, +1318, 0, 282, +1320, 0, 363, +1323, 0, 452, +1327, 0, 549, +1330, 0, 662, +1330, 0, 794, +1330, 0, 926, +1328, 0, 1068, +1311, 0, 1298, +1235, 0, 1537, +1267, 0, 1692, +1323, 0, 1783, +1532, 0, 1911, +1606, 0, 2040, +1500, 671, 2198, +682, 1030, 2352, +1660, 0, 2466, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1777, 0, 2506, +1314, 0, 18, +1314, 0, 78, +1314, 0, 149, +1314, 0, 229, +1315, 0, 281, +1316, 0, 343, +1319, 0, 414, +1322, 0, 494, +1326, 0, 584, +1329, 0, 689, +1329, 0, 814, +1329, 0, 941, +1327, 0, 1079, +1310, 0, 1302, +1233, 0, 1540, +1266, 0, 1693, +1323, 0, 1784, +1531, 0, 1912, +1605, 0, 2041, +1498, 690, 2198, +686, 1035, 2353, +1661, 0, 2466, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1778, 0, 2506, +1314, 0, 98, +1314, 0, 150, +1314, 0, 211, +1314, 0, 281, +1314, 0, 361, +1315, 0, 413, +1318, 0, 475, +1321, 0, 546, +1325, 0, 627, +1328, 0, 723, +1328, 0, 840, +1328, 0, 961, +1326, 0, 1094, +1309, 0, 1309, +1232, 0, 1544, +1265, 0, 1695, +1323, 0, 1787, +1529, 0, 1914, +1603, 0, 2042, +1497, 714, 2199, +691, 1042, 2353, +1662, 0, 2466, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1779, 0, 2506, +1314, 0, 188, +1314, 0, 230, +1314, 0, 282, +1314, 0, 343, +1314, 0, 413, +1314, 0, 493, +1316, 0, 545, +1319, 0, 607, +1323, 0, 678, +1326, 0, 766, +1326, 0, 873, +1326, 0, 986, +1324, 0, 1113, +1307, 0, 1317, +1230, 0, 1549, +1263, 0, 1697, +1323, 30, 1790, +1527, 0, 1916, +1602, 132, 2043, +1495, 745, 2200, +698, 1051, 2354, +1663, 0, 2466, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1781, 0, 2506, +1314, 121, 285, +1314, 106, 319, +1314, 85, 363, +1314, 56, 414, +1314, 13, 475, +1314, 0, 545, +1314, 0, 625, +1317, 0, 677, +1321, 0, 739, +1324, 0, 816, +1324, 0, 914, +1324, 0, 1018, +1322, 0, 1138, +1304, 0, 1329, +1227, 0, 1556, +1261, 0, 1700, +1323, 163, 1794, +1524, 32, 1919, +1599, 264, 2045, +1491, 783, 2201, +706, 1063, 2354, +1666, 32, 2466, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1784, 0, 2506, +1314, 264, 389, +1314, 253, 417, +1314, 238, 452, +1314, 217, 494, +1314, 188, 546, +1314, 146, 607, +1314, 82, 677, +1314, 0, 757, +1318, 0, 809, +1321, 0, 876, +1321, 0, 963, +1321, 0, 1058, +1319, 0, 1168, +1302, 0, 1343, +1223, 0, 1565, +1257, 0, 1704, +1323, 295, 1799, +1520, 164, 1923, +1596, 396, 2047, +1487, 830, 2203, +718, 1079, 2355, +1668, 164, 2466, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1787, 0, 2506, +1314, 404, 499, +1314, 396, 521, +1314, 385, 549, +1314, 370, 584, +1314, 349, 627, +1314, 320, 678, +1314, 277, 739, +1314, 214, 809, +1314, 111, 889, +1317, 111, 946, +1317, 111, 1021, +1317, 111, 1106, +1315, 111, 1206, +1297, 111, 1362, +1218, 111, 1576, +1252, 111, 1709, +1323, 426, 1806, +1515, 296, 1928, +1592, 528, 2051, +1482, 885, 2205, +733, 1099, 2357, +1667, 296, 2465, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1791, 111, 2506, +1310, 530, 574, +1310, 524, 592, +1310, 516, 616, +1310, 505, 646, +1310, 490, 684, +1310, 468, 730, +1310, 438, 784, +1310, 394, 848, +1310, 328, 922, +1311, 244, 1001, +1311, 244, 1068, +1311, 244, 1145, +1310, 244, 1238, +1292, 244, 1379, +1207, 285, 1587, +1251, 265, 1716, +1322, 514, 1811, +1510, 413, 1934, +1587, 643, 2055, +1471, 941, 2208, +745, 1128, 2358, +1669, 442, 2465, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1794, 285, 2506, +1294, 639, 574, +1294, 634, 592, +1294, 627, 616, +1294, 619, 646, +1294, 607, 684, +1294, 591, 730, +1294, 568, 784, +1294, 535, 848, +1294, 488, 922, +1297, 430, 1001, +1304, 376, 1080, +1304, 376, 1155, +1302, 376, 1246, +1284, 376, 1385, +1178, 503, 1590, +1239, 473, 1720, +1329, 626, 1816, +1488, 470, 1933, +1583, 729, 2060, +1450, 988, 2209, +745, 1169, 2362, +1682, 607, 2467, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1792, 503, 2507, +1274, 753, 574, +1274, 749, 592, +1274, 744, 616, +1274, 737, 646, +1274, 728, 684, +1274, 716, 730, +1274, 698, 784, +1274, 674, 848, +1274, 640, 922, +1276, 599, 1001, +1284, 562, 1080, +1294, 508, 1169, +1292, 508, 1257, +1273, 508, 1393, +1137, 691, 1596, +1203, 671, 1723, +1338, 742, 1822, +1453, 529, 1930, +1577, 824, 2068, +1421, 1044, 2212, +672, 1212, 2365, +1699, 762, 2468, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1788, 691, 2509, +1258, 900, 682, +1259, 900, 693, +1259, 896, 712, +1259, 891, 736, +1259, 885, 767, +1259, 876, 806, +1259, 864, 852, +1259, 847, 908, +1259, 824, 973, +1261, 797, 1044, +1269, 774, 1117, +1280, 741, 1199, +1289, 701, 1290, +1270, 701, 1417, +1120, 852, 1611, +1159, 869, 1734, +1344, 895, 1836, +1405, 663, 1931, +1563, 942, 2078, +1372, 1118, 2218, +602, 1254, 2368, +1718, 915, 2470, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1784, 871, 2510, +1314, 1134, 1183, +1314, 1134, 1187, +1315, 1134, 1191, +1316, 1134, 1197, +1317, 1134, 1206, +1319, 1134, 1216, +1321, 1134, 1230, +1324, 1134, 1248, +1328, 1134, 1271, +1333, 1131, 1302, +1340, 1120, 1345, +1349, 1105, 1396, +1358, 1087, 1457, +1341, 1087, 1528, +1216, 1158, 1687, +1159, 1142, 1780, +1317, 1176, 1886, +1360, 1041, 1962, +1486, 1159, 2104, +1228, 1237, 2234, +1015, 1275, 2368, +1721, 1100, 2471, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1784, 1087, 2512, +1399, 1351, 1421, +1399, 1351, 1423, +1400, 1351, 1426, +1400, 1351, 1429, +1401, 1351, 1434, +1403, 1351, 1441, +1405, 1351, 1449, +1407, 1351, 1460, +1410, 1351, 1475, +1407, 1351, 1495, +1382, 1351, 1523, +1347, 1351, 1559, +1336, 1345, 1602, +1319, 1345, 1655, +1383, 1345, 1736, +1321, 1339, 1825, +1361, 1378, 1936, +1367, 1360, 2014, +1313, 1367, 2124, +1014, 1399, 2255, +1228, 1332, 2375, +1681, 1258, 2475, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1514, 1522, 1673, +1514, 1522, 1673, +1513, 1522, 1674, +1512, 1522, 1674, +1510, 1522, 1676, +1508, 1522, 1677, +1505, 1522, 1679, +1501, 1522, 1682, +1495, 1522, 1685, +1489, 1523, 1691, +1475, 1525, 1706, +1447, 1525, 1730, +1412, 1526, 1762, +1397, 1537, 1811, +1426, 1537, 1865, +1415, 1525, 1919, +1395, 1535, 2005, +1299, 1551, 2087, +1205, 1526, 2170, +1197, 1525, 2279, +1402, 1488, 2382, +1717, 1446, 2476, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1900, 1416, 2509, +1678, 1669, 1879, +1678, 1669, 1879, +1678, 1669, 1880, +1678, 1669, 1882, +1678, 1669, 1884, +1678, 1669, 1886, +1678, 1669, 1889, +1678, 1669, 1894, +1678, 1669, 1900, +1674, 1670, 1903, +1671, 1673, 1909, +1667, 1678, 1917, +1659, 1683, 1928, +1644, 1684, 1948, +1597, 1684, 1976, +1591, 1683, 2015, +1577, 1683, 2072, +1536, 1664, 2140, +1423, 1683, 2226, +1349, 1660, 2299, +1619, 1615, 2384, +1819, 1607, 2477, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1912, 1605, 2509, +1848, 1802, 1967, +1848, 1802, 1968, +1849, 1802, 1969, +1849, 1803, 1970, +1849, 1803, 1972, +1850, 1804, 1973, +1851, 1805, 1976, +1851, 1806, 1980, +1853, 1807, 1984, +1853, 1808, 1990, +1846, 1810, 1998, +1837, 1813, 2009, +1825, 1817, 2022, +1820, 1817, 2033, +1804, 1811, 2052, +1785, 1809, 2084, +1764, 1804, 2118, +1767, 1811, 2177, +1736, 1801, 2237, +1751, 1800, 2307, +1774, 1800, 2391, +1919, 1797, 2474, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +2000, 1784, 2514, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2038, +1992, 1958, 2038, +1992, 1958, 2039, +1992, 1958, 2040, +1991, 1958, 2042, +1988, 1958, 2046, +1983, 1958, 2052, +1978, 1958, 2060, +1974, 1962, 2077, +1963, 1962, 2086, +1955, 1958, 2110, +1955, 1962, 2141, +1953, 1964, 2193, +1941, 1953, 2231, +1931, 1953, 2310, +1966, 1959, 2394, +2048, 1966, 2481, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2129, 1963, 2515, +2134, 2127, 2070, +2134, 2127, 2070, +2134, 2127, 2071, +2135, 2127, 2071, +2135, 2127, 2073, +2135, 2127, 2074, +2135, 2127, 2076, +2136, 2127, 2078, +2137, 2127, 2081, +2137, 2127, 2084, +2139, 2127, 2085, +2140, 2127, 2087, +2141, 2127, 2091, +2135, 2127, 2100, +2127, 2127, 2112, +2129, 2128, 2129, +2136, 2135, 2161, +2130, 2135, 2208, +2125, 2127, 2253, +2141, 2131, 2316, +2170, 2132, 2397, +2230, 2150, 2485, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2266, 2159, 2520, +2377, 2355, 2126, +2377, 2355, 2127, +2377, 2355, 2127, +2377, 2355, 2127, +2377, 2355, 2127, +2378, 2355, 2127, +2378, 2355, 2128, +2378, 2355, 2128, +2378, 2355, 2129, +2379, 2355, 2130, +2380, 2355, 2133, +2380, 2355, 2135, +2380, 2355, 2137, +2378, 2357, 2143, +2376, 2356, 2147, +2376, 2354, 2159, +2375, 2358, 2194, +2375, 2357, 2230, +2381, 2357, 2273, +2399, 2366, 2335, +2418, 2368, 2408, +2472, 2387, 2495, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2499, 2395, 2533, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2680, 2655, 1964, +2679, 2655, 1968, +2679, 2655, 1970, +2679, 2654, 1965, +2678, 2652, 1958, +2677, 2650, 1949, +2677, 2648, 1945, +2675, 2653, 1962, +2676, 2656, 2011, +2680, 2657, 2064, +2681, 2657, 2122, +2684, 2657, 2213, +2688, 2662, 2314, +2696, 2667, 2413, +2716, 2679, 2527, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2727, 2684, 2578, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2427, +2713, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2428, +2714, 2769, 2429, +2714, 2769, 2429, +2715, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2718, 2772, 2447, +2715, 2770, 2444, +2712, 2771, 2455, +2714, 2774, 2492, +2716, 2775, 2523, +2714, 2775, 2560, +2719, 2781, 2625, +2725, 2789, 2703, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +2729, 2791, 2730, +1471, 0, 0, +1471, 0, 0, +1472, 0, 0, +1472, 0, 18, +1473, 0, 98, +1475, 0, 188, +1476, 0, 285, +1478, 0, 389, +1481, 0, 499, +1485, 0, 614, +1490, 0, 733, +1496, 0, 855, +1498, 0, 1011, +1486, 0, 1266, +1470, 0, 1472, +1490, 0, 1659, +1524, 0, 1789, +1589, 0, 1904, +1654, 0, 2053, +1531, 645, 2197, +923, 1046, 2356, +1710, 0, 2469, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1471, 0, 0, +1471, 0, 0, +1471, 0, 17, +1472, 0, 78, +1473, 0, 150, +1474, 0, 230, +1476, 0, 319, +1478, 0, 417, +1481, 0, 521, +1485, 0, 631, +1489, 0, 746, +1496, 0, 865, +1497, 0, 1017, +1486, 0, 1269, +1469, 0, 1474, +1489, 0, 1660, +1524, 0, 1790, +1589, 0, 1905, +1653, 0, 2053, +1531, 656, 2197, +924, 1049, 2356, +1710, 0, 2469, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1801, 0, 2506, +1471, 0, 0, +1471, 0, 17, +1471, 0, 97, +1472, 0, 149, +1472, 0, 211, +1474, 0, 282, +1475, 0, 363, +1477, 0, 452, +1480, 0, 549, +1484, 0, 653, +1489, 0, 763, +1496, 0, 878, +1497, 0, 1026, +1485, 0, 1273, +1469, 0, 1476, +1489, 0, 1661, +1524, 0, 1791, +1588, 0, 1905, +1652, 0, 2054, +1530, 671, 2198, +926, 1053, 2357, +1711, 0, 2469, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1802, 0, 2506, +1471, 0, 18, +1471, 0, 78, +1471, 0, 149, +1471, 0, 229, +1472, 0, 281, +1473, 0, 343, +1475, 0, 414, +1477, 0, 494, +1480, 0, 584, +1483, 0, 681, +1488, 0, 785, +1495, 0, 895, +1496, 0, 1039, +1485, 0, 1278, +1468, 0, 1480, +1488, 0, 1662, +1524, 0, 1793, +1587, 0, 1907, +1651, 0, 2054, +1529, 690, 2198, +928, 1058, 2357, +1712, 0, 2469, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1803, 0, 2506, +1471, 0, 98, +1471, 0, 150, +1471, 0, 211, +1471, 0, 281, +1471, 0, 361, +1472, 0, 413, +1474, 0, 475, +1476, 0, 546, +1479, 0, 627, +1482, 0, 716, +1487, 0, 813, +1494, 0, 917, +1495, 0, 1055, +1484, 0, 1285, +1467, 0, 1484, +1487, 0, 1664, +1524, 0, 1795, +1585, 0, 1908, +1650, 0, 2055, +1527, 714, 2199, +931, 1065, 2357, +1713, 0, 2469, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1804, 0, 2506, +1471, 0, 188, +1471, 0, 230, +1471, 0, 282, +1471, 0, 343, +1471, 0, 413, +1471, 0, 493, +1472, 0, 545, +1475, 0, 607, +1478, 0, 678, +1481, 0, 759, +1486, 0, 848, +1493, 0, 946, +1494, 0, 1075, +1482, 0, 1294, +1466, 0, 1490, +1486, 0, 1667, +1524, 30, 1798, +1584, 0, 1911, +1648, 132, 2057, +1525, 745, 2200, +935, 1074, 2358, +1715, 0, 2469, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1806, 0, 2506, +1471, 121, 285, +1471, 106, 319, +1471, 85, 363, +1471, 56, 414, +1471, 13, 475, +1471, 0, 545, +1471, 0, 625, +1473, 0, 677, +1476, 0, 739, +1480, 0, 810, +1485, 0, 891, +1491, 0, 980, +1493, 0, 1102, +1481, 0, 1306, +1464, 0, 1497, +1485, 0, 1670, +1524, 163, 1802, +1581, 32, 1914, +1646, 264, 2058, +1522, 783, 2201, +940, 1085, 2358, +1716, 32, 2469, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1809, 0, 2506, +1471, 264, 389, +1471, 253, 417, +1471, 238, 452, +1471, 217, 494, +1471, 188, 546, +1471, 146, 607, +1471, 82, 677, +1471, 0, 757, +1474, 0, 809, +1478, 0, 871, +1483, 0, 942, +1489, 0, 1023, +1491, 0, 1135, +1479, 0, 1321, +1462, 0, 1507, +1482, 0, 1674, +1524, 295, 1807, +1578, 164, 1918, +1644, 396, 2061, +1518, 830, 2203, +947, 1100, 2359, +1719, 164, 2469, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1812, 0, 2506, +1471, 404, 499, +1471, 396, 521, +1471, 385, 549, +1471, 370, 584, +1471, 349, 627, +1471, 320, 678, +1471, 277, 739, +1471, 214, 809, +1471, 111, 889, +1475, 111, 942, +1480, 111, 1003, +1486, 111, 1075, +1488, 111, 1176, +1476, 111, 1340, +1459, 111, 1520, +1480, 111, 1680, +1524, 426, 1814, +1573, 296, 1923, +1640, 528, 2064, +1513, 885, 2205, +956, 1119, 2361, +1717, 296, 2469, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1816, 111, 2506, +1471, 542, 614, +1471, 536, 631, +1471, 528, 653, +1471, 517, 681, +1471, 502, 716, +1471, 482, 759, +1471, 452, 810, +1471, 410, 871, +1471, 346, 942, +1471, 244, 1021, +1476, 244, 1074, +1483, 244, 1135, +1484, 244, 1225, +1472, 244, 1369, +1455, 244, 1537, +1476, 244, 1687, +1520, 502, 1820, +1567, 428, 1930, +1634, 660, 2068, +1506, 950, 2208, +968, 1143, 2362, +1715, 428, 2469, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1821, 244, 2506, +1471, 678, 733, +1471, 674, 746, +1471, 668, 763, +1471, 660, 785, +1471, 649, 813, +1471, 634, 848, +1471, 613, 891, +1471, 584, 942, +1471, 542, 1003, +1471, 478, 1074, +1471, 376, 1153, +1478, 376, 1206, +1479, 376, 1283, +1467, 376, 1412, +1450, 376, 1559, +1471, 376, 1701, +1516, 581, 1827, +1566, 591, 1940, +1627, 792, 2074, +1496, 1025, 2212, +983, 1174, 2364, +1712, 560, 2468, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1828, 376, 2506, +1471, 814, 855, +1471, 811, 865, +1471, 806, 878, +1471, 800, 895, +1471, 792, 917, +1471, 782, 946, +1471, 767, 980, +1471, 746, 1023, +1471, 717, 1075, +1471, 674, 1135, +1471, 611, 1206, +1471, 508, 1285, +1472, 508, 1352, +1460, 508, 1465, +1443, 508, 1587, +1464, 508, 1721, +1509, 670, 1836, +1566, 751, 1952, +1617, 925, 2081, +1483, 1109, 2218, +935, 1212, 2368, +1708, 692, 2467, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1838, 508, 2506, +1467, 954, 955, +1467, 954, 960, +1467, 951, 971, +1467, 947, 985, +1467, 941, 1004, +1467, 933, 1027, +1467, 923, 1056, +1467, 908, 1092, +1467, 888, 1137, +1467, 859, 1191, +1467, 818, 1254, +1467, 755, 1326, +1471, 701, 1400, +1458, 701, 1503, +1441, 701, 1611, +1446, 742, 1738, +1508, 833, 1851, +1542, 872, 1959, +1602, 1037, 2091, +1448, 1185, 2224, +886, 1254, 2372, +1718, 855, 2468, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1839, 727, 2507, +1503, 1167, 1293, +1503, 1167, 1296, +1504, 1167, 1299, +1504, 1167, 1304, +1505, 1167, 1311, +1506, 1167, 1319, +1508, 1167, 1330, +1510, 1167, 1344, +1512, 1167, 1363, +1514, 1162, 1390, +1514, 1141, 1432, +1514, 1111, 1482, +1517, 1087, 1536, +1506, 1087, 1597, +1491, 1087, 1687, +1446, 1077, 1783, +1489, 1144, 1900, +1509, 1144, 1988, +1532, 1221, 2116, +1329, 1289, 2240, +1151, 1275, 2372, +1721, 1061, 2469, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1839, 1003, 2508, +1547, 1351, 1534, +1547, 1351, 1536, +1547, 1351, 1538, +1548, 1351, 1541, +1549, 1351, 1545, +1550, 1351, 1550, +1551, 1351, 1556, +1553, 1351, 1565, +1555, 1351, 1577, +1558, 1351, 1592, +1563, 1351, 1611, +1569, 1351, 1636, +1573, 1345, 1671, +1563, 1345, 1717, +1550, 1345, 1771, +1498, 1335, 1850, +1489, 1358, 1942, +1476, 1376, 2036, +1418, 1388, 2147, +1096, 1399, 2261, +1290, 1332, 2375, +1730, 1258, 2473, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1839, 1219, 2510, +1626, 1522, 1733, +1625, 1522, 1734, +1625, 1522, 1734, +1623, 1522, 1735, +1622, 1522, 1736, +1621, 1522, 1737, +1618, 1522, 1739, +1615, 1522, 1742, +1611, 1522, 1745, +1605, 1522, 1749, +1605, 1522, 1760, +1609, 1522, 1778, +1596, 1523, 1805, +1587, 1534, 1850, +1574, 1537, 1894, +1558, 1522, 1941, +1509, 1521, 2012, +1413, 1563, 2107, +1330, 1535, 2187, +1296, 1523, 2285, +1459, 1491, 2382, +1767, 1446, 2474, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1910, 1416, 2509, +1737, 1669, 1898, +1737, 1669, 1899, +1737, 1669, 1900, +1737, 1669, 1901, +1737, 1669, 1903, +1737, 1669, 1905, +1737, 1669, 1908, +1737, 1669, 1913, +1737, 1669, 1918, +1732, 1669, 1922, +1727, 1669, 1925, +1719, 1669, 1930, +1711, 1672, 1940, +1697, 1674, 1960, +1687, 1684, 2003, +1675, 1681, 2036, +1638, 1672, 2080, +1565, 1674, 2153, +1492, 1672, 2229, +1526, 1649, 2305, +1680, 1621, 2385, +1871, 1607, 2473, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1954, 1605, 2509, +1862, 1802, 1972, +1862, 1802, 1973, +1862, 1802, 1973, +1862, 1803, 1975, +1862, 1803, 1976, +1863, 1804, 1978, +1864, 1805, 1981, +1865, 1806, 1984, +1866, 1807, 1989, +1868, 1809, 1995, +1868, 1809, 2004, +1868, 1809, 2014, +1861, 1811, 2027, +1856, 1811, 2038, +1842, 1811, 2056, +1824, 1809, 2088, +1829, 1804, 2122, +1805, 1804, 2175, +1793, 1801, 2242, +1782, 1800, 2309, +1820, 1797, 2390, +1940, 1796, 2477, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +2014, 1783, 2512, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2037, +1992, 1958, 2038, +1992, 1958, 2038, +1992, 1958, 2039, +1992, 1958, 2040, +1992, 1958, 2041, +1992, 1958, 2042, +1992, 1958, 2044, +1989, 1958, 2051, +1984, 1962, 2068, +1979, 1968, 2090, +1970, 1962, 2115, +1966, 1962, 2148, +1966, 1964, 2190, +1964, 1947, 2231, +1943, 1947, 2310, +1978, 1965, 2395, +2061, 1971, 2481, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2133, 1968, 2516, +2142, 2127, 2061, +2142, 2127, 2061, +2142, 2127, 2062, +2142, 2127, 2063, +2142, 2127, 2064, +2143, 2127, 2065, +2143, 2127, 2067, +2143, 2127, 2069, +2144, 2127, 2072, +2145, 2127, 2076, +2146, 2127, 2082, +2148, 2127, 2089, +2148, 2127, 2095, +2143, 2127, 2104, +2135, 2127, 2116, +2137, 2127, 2132, +2144, 2131, 2161, +2141, 2135, 2204, +2133, 2127, 2256, +2149, 2134, 2316, +2174, 2130, 2395, +2237, 2146, 2485, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2277, 2159, 2520, +2379, 2355, 2126, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2127, +2380, 2355, 2128, +2381, 2355, 2128, +2381, 2355, 2129, +2381, 2355, 2130, +2382, 2355, 2131, +2382, 2355, 2133, +2382, 2355, 2135, +2381, 2357, 2141, +2379, 2358, 2148, +2379, 2355, 2161, +2378, 2357, 2192, +2376, 2358, 2230, +2382, 2354, 2270, +2402, 2364, 2335, +2420, 2368, 2405, +2473, 2383, 2495, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2499, 2394, 2533, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2657, 1947, +2681, 2656, 1951, +2680, 2656, 1956, +2680, 2656, 1963, +2679, 2655, 1973, +2679, 2654, 1971, +2678, 2651, 1967, +2678, 2651, 1962, +2678, 2655, 2011, +2679, 2657, 2064, +2682, 2657, 2129, +2684, 2657, 2213, +2688, 2661, 2311, +2699, 2668, 2415, +2717, 2681, 2528, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2726, 2683, 2577, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2715, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2427, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2428, +2716, 2769, 2429, +2716, 2769, 2429, +2717, 2769, 2430, +2717, 2769, 2431, +2718, 2770, 2433, +2719, 2772, 2443, +2720, 2775, 2457, +2716, 2772, 2452, +2713, 2770, 2455, +2714, 2773, 2485, +2718, 2774, 2523, +2717, 2777, 2567, +2721, 2782, 2627, +2725, 2788, 2702, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +2729, 2794, 2733, +1677, 0, 708, +1676, 0, 722, +1676, 0, 740, +1675, 0, 763, +1674, 0, 792, +1672, 0, 829, +1670, 0, 873, +1667, 0, 927, +1663, 0, 989, +1658, 0, 1062, +1657, 0, 1123, +1662, 0, 1179, +1666, 0, 1250, +1649, 0, 1372, +1636, 0, 1533, +1634, 0, 1672, +1671, 0, 1828, +1667, 0, 1929, +1689, 355, 2079, +1608, 810, 2211, +1232, 994, 2359, +1771, 0, 2470, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1854, 0, 2508, +1676, 0, 726, +1676, 0, 735, +1675, 0, 753, +1674, 0, 775, +1673, 0, 804, +1672, 0, 839, +1669, 0, 883, +1667, 0, 935, +1663, 0, 997, +1658, 0, 1068, +1657, 0, 1129, +1662, 0, 1184, +1666, 0, 1253, +1649, 0, 1375, +1636, 0, 1535, +1635, 0, 1673, +1670, 0, 1829, +1666, 0, 1930, +1689, 372, 2079, +1607, 814, 2211, +1238, 995, 2359, +1771, 0, 2470, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1676, 0, 749, +1675, 0, 758, +1675, 0, 770, +1674, 0, 791, +1673, 0, 819, +1672, 0, 853, +1669, 0, 895, +1666, 0, 946, +1663, 0, 1007, +1657, 0, 1077, +1657, 0, 1136, +1661, 0, 1191, +1665, 0, 1259, +1649, 0, 1378, +1636, 0, 1537, +1635, 0, 1674, +1669, 0, 1829, +1665, 0, 1930, +1688, 394, 2080, +1606, 821, 2211, +1245, 996, 2359, +1771, 0, 2470, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1675, 0, 777, +1674, 0, 786, +1674, 0, 797, +1674, 0, 812, +1673, 0, 838, +1671, 0, 871, +1669, 0, 912, +1666, 0, 961, +1662, 0, 1020, +1657, 0, 1088, +1656, 0, 1146, +1661, 0, 1199, +1665, 0, 1266, +1649, 0, 1383, +1636, 0, 1541, +1636, 0, 1676, +1668, 0, 1830, +1663, 0, 1932, +1687, 422, 2080, +1605, 829, 2212, +1255, 998, 2359, +1772, 0, 2470, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1855, 0, 2508, +1674, 0, 814, +1673, 0, 822, +1673, 0, 832, +1673, 0, 845, +1672, 0, 863, +1671, 0, 894, +1668, 0, 933, +1666, 0, 980, +1662, 0, 1036, +1656, 0, 1102, +1655, 0, 1159, +1660, 0, 1210, +1664, 0, 1276, +1649, 0, 1390, +1636, 0, 1545, +1637, 0, 1679, +1667, 0, 1831, +1662, 0, 1934, +1686, 457, 2081, +1603, 840, 2212, +1268, 1001, 2360, +1772, 0, 2470, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1856, 0, 2508, +1672, 0, 858, +1672, 0, 865, +1672, 0, 874, +1671, 0, 887, +1671, 0, 903, +1670, 0, 923, +1667, 0, 960, +1664, 0, 1004, +1661, 0, 1058, +1655, 0, 1121, +1655, 0, 1175, +1659, 0, 1225, +1663, 0, 1289, +1649, 0, 1398, +1636, 0, 1551, +1639, 0, 1683, +1666, 0, 1832, +1659, 132, 1936, +1684, 500, 2083, +1600, 854, 2213, +1285, 1004, 2360, +1773, 0, 2470, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1857, 0, 2508, +1670, 32, 911, +1669, 32, 917, +1669, 32, 926, +1669, 32, 937, +1668, 32, 951, +1667, 32, 970, +1667, 32, 993, +1663, 32, 1035, +1660, 32, 1085, +1654, 32, 1144, +1654, 32, 1196, +1658, 32, 1244, +1662, 0, 1305, +1649, 0, 1410, +1636, 0, 1560, +1641, 32, 1688, +1663, 32, 1833, +1656, 264, 1939, +1682, 551, 2084, +1596, 873, 2214, +1306, 1009, 2361, +1773, 0, 2470, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1859, 32, 2508, +1667, 164, 973, +1667, 164, 979, +1666, 164, 986, +1666, 164, 996, +1666, 164, 1009, +1664, 164, 1025, +1663, 164, 1046, +1662, 164, 1073, +1658, 164, 1119, +1653, 164, 1174, +1652, 164, 1223, +1657, 164, 1268, +1661, 137, 1326, +1649, 0, 1424, +1636, 0, 1570, +1644, 164, 1695, +1661, 164, 1835, +1652, 396, 1943, +1680, 612, 2086, +1591, 896, 2215, +1333, 1014, 2362, +1774, 0, 2470, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1861, 164, 2508, +1663, 296, 1045, +1663, 296, 1050, +1663, 296, 1056, +1662, 296, 1065, +1662, 296, 1075, +1661, 296, 1090, +1660, 296, 1108, +1658, 296, 1131, +1656, 296, 1161, +1651, 296, 1212, +1650, 296, 1257, +1655, 296, 1299, +1659, 276, 1353, +1649, 111, 1443, +1636, 111, 1584, +1648, 296, 1704, +1657, 296, 1838, +1646, 528, 1948, +1676, 683, 2089, +1585, 926, 2217, +1367, 1022, 2363, +1772, 0, 2470, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1863, 296, 2508, +1658, 428, 1127, +1658, 428, 1131, +1657, 428, 1136, +1657, 428, 1143, +1656, 428, 1152, +1655, 428, 1164, +1654, 428, 1180, +1653, 428, 1200, +1651, 428, 1225, +1648, 428, 1257, +1648, 428, 1298, +1653, 428, 1336, +1657, 413, 1387, +1648, 265, 1468, +1636, 244, 1601, +1653, 428, 1715, +1661, 428, 1846, +1638, 660, 1955, +1671, 762, 2093, +1576, 963, 2219, +1408, 1032, 2365, +1768, 91, 2470, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1866, 428, 2508, +1655, 583, 1188, +1655, 583, 1191, +1654, 583, 1196, +1654, 583, 1202, +1654, 583, 1210, +1653, 583, 1221, +1651, 583, 1234, +1650, 583, 1252, +1648, 583, 1275, +1646, 583, 1304, +1644, 536, 1348, +1649, 536, 1383, +1653, 524, 1429, +1645, 413, 1503, +1633, 376, 1622, +1654, 536, 1730, +1662, 536, 1854, +1635, 766, 1962, +1664, 863, 2099, +1566, 1025, 2222, +1432, 1062, 2367, +1764, 309, 2470, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1872, 536, 2508, +1655, 745, 1237, +1655, 745, 1240, +1654, 745, 1244, +1654, 745, 1249, +1654, 745, 1257, +1653, 745, 1266, +1651, 745, 1279, +1650, 745, 1295, +1648, 745, 1315, +1646, 745, 1342, +1644, 713, 1383, +1644, 633, 1439, +1648, 624, 1479, +1640, 536, 1547, +1628, 508, 1646, +1649, 633, 1749, +1657, 633, 1863, +1635, 881, 1973, +1655, 979, 2105, +1554, 1109, 2228, +1415, 1110, 2370, +1760, 519, 2469, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1880, 633, 2508, +1655, 918, 1304, +1656, 918, 1306, +1655, 918, 1310, +1655, 918, 1314, +1654, 918, 1320, +1654, 918, 1329, +1653, 918, 1340, +1651, 918, 1354, +1649, 918, 1372, +1647, 918, 1395, +1645, 897, 1432, +1645, 845, 1482, +1643, 779, 1541, +1635, 719, 1601, +1623, 701, 1686, +1641, 772, 1775, +1650, 779, 1877, +1631, 1007, 1989, +1643, 1092, 2115, +1533, 1205, 2236, +1384, 1170, 2375, +1758, 725, 2468, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1889, 758, 2508, +1647, 1170, 1441, +1648, 1170, 1443, +1648, 1170, 1445, +1648, 1170, 1448, +1649, 1170, 1452, +1650, 1170, 1457, +1651, 1170, 1463, +1653, 1170, 1472, +1654, 1170, 1484, +1655, 1170, 1500, +1654, 1157, 1529, +1654, 1129, 1570, +1651, 1095, 1619, +1635, 1095, 1678, +1623, 1087, 1751, +1615, 1062, 1817, +1632, 1090, 1907, +1595, 1178, 2016, +1626, 1217, 2123, +1463, 1323, 2255, +1427, 1258, 2375, +1780, 1002, 2468, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1884, 986, 2506, +1671, 1358, 1617, +1671, 1358, 1618, +1672, 1358, 1619, +1672, 1358, 1621, +1672, 1358, 1624, +1673, 1358, 1628, +1674, 1358, 1632, +1676, 1358, 1638, +1678, 1358, 1646, +1680, 1358, 1657, +1683, 1358, 1672, +1687, 1358, 1694, +1687, 1345, 1729, +1672, 1345, 1775, +1659, 1345, 1825, +1644, 1322, 1879, +1625, 1320, 1950, +1565, 1390, 2060, +1550, 1377, 2150, +1313, 1430, 2275, +1491, 1332, 2378, +1794, 1220, 2471, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1883, 1202, 2507, +1720, 1522, 1779, +1720, 1522, 1780, +1719, 1522, 1781, +1718, 1522, 1782, +1717, 1522, 1783, +1716, 1522, 1785, +1714, 1522, 1787, +1712, 1522, 1790, +1708, 1522, 1795, +1704, 1522, 1800, +1703, 1522, 1811, +1707, 1522, 1827, +1711, 1522, 1847, +1703, 1522, 1873, +1693, 1522, 1912, +1668, 1522, 1965, +1628, 1506, 2021, +1607, 1566, 2121, +1540, 1536, 2191, +1494, 1506, 2283, +1572, 1474, 2382, +1813, 1446, 2473, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1923, 1435, 2511, +1810, 1655, 1910, +1809, 1655, 1911, +1809, 1655, 1911, +1808, 1655, 1912, +1807, 1656, 1913, +1806, 1657, 1915, +1805, 1658, 1918, +1802, 1659, 1921, +1800, 1661, 1925, +1796, 1662, 1930, +1791, 1662, 1934, +1784, 1662, 1939, +1776, 1662, 1948, +1775, 1662, 1972, +1766, 1670, 2011, +1745, 1681, 2051, +1732, 1662, 2087, +1680, 1676, 2155, +1604, 1655, 2226, +1644, 1643, 2305, +1738, 1626, 2385, +1900, 1611, 2473, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1984, 1617, 2510, +1907, 1800, 1983, +1907, 1800, 1984, +1907, 1800, 1984, +1907, 1800, 1985, +1907, 1800, 1986, +1907, 1800, 1987, +1907, 1800, 1989, +1907, 1800, 1991, +1907, 1800, 1994, +1907, 1800, 1997, +1906, 1801, 2005, +1906, 1801, 2015, +1905, 1801, 2029, +1901, 1801, 2043, +1890, 1801, 2062, +1872, 1801, 2086, +1874, 1807, 2128, +1850, 1801, 2174, +1847, 1800, 2243, +1818, 1792, 2312, +1871, 1797, 2387, +1976, 1799, 2480, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1783, 2511, +2034, 1958, 2033, +2033, 1958, 2033, +2033, 1958, 2034, +2032, 1958, 2034, +2031, 1959, 2036, +2031, 1959, 2037, +2029, 1960, 2039, +2027, 1961, 2041, +2025, 1961, 2044, +2021, 1963, 2049, +2020, 1963, 2052, +2020, 1963, 2054, +2020, 1963, 2059, +2020, 1959, 2069, +2016, 1962, 2088, +2004, 1969, 2111, +1998, 1964, 2152, +1993, 1963, 2193, +1987, 1952, 2238, +1975, 1952, 2313, +2009, 1966, 2398, +2073, 1966, 2481, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2135, 1969, 2517, +2163, 2131, 2063, +2163, 2131, 2063, +2163, 2131, 2064, +2163, 2131, 2065, +2163, 2131, 2065, +2163, 2131, 2066, +2163, 2131, 2068, +2163, 2131, 2069, +2163, 2131, 2072, +2163, 2131, 2075, +2164, 2131, 2080, +2165, 2131, 2087, +2166, 2131, 2096, +2164, 2131, 2105, +2157, 2131, 2117, +2148, 2127, 2128, +2154, 2127, 2154, +2155, 2131, 2206, +2143, 2127, 2260, +2159, 2135, 2315, +2188, 2134, 2395, +2251, 2149, 2486, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2283, 2159, 2520, +2386, 2355, 2123, +2386, 2355, 2123, +2386, 2356, 2123, +2387, 2356, 2123, +2387, 2356, 2124, +2387, 2356, 2124, +2387, 2356, 2125, +2387, 2357, 2126, +2388, 2357, 2127, +2388, 2357, 2129, +2389, 2358, 2131, +2389, 2358, 2133, +2389, 2357, 2135, +2386, 2356, 2141, +2384, 2356, 2148, +2382, 2356, 2170, +2388, 2357, 2191, +2386, 2356, 2226, +2394, 2358, 2272, +2409, 2366, 2337, +2431, 2373, 2403, +2476, 2384, 2495, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2508, 2398, 2531, +2684, 2656, 1957, +2684, 2656, 1957, +2684, 2656, 1956, +2684, 2656, 1956, +2684, 2656, 1956, +2684, 2656, 1956, +2684, 2656, 1955, +2684, 2656, 1954, +2684, 2656, 1955, +2684, 2656, 1956, +2684, 2656, 1961, +2683, 2656, 1971, +2683, 2655, 1982, +2682, 2655, 1994, +2682, 2655, 1993, +2681, 2656, 2011, +2682, 2656, 2069, +2683, 2657, 2133, +2686, 2657, 2216, +2691, 2663, 2315, +2700, 2669, 2417, +2719, 2681, 2533, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2726, 2683, 2576, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2437, +2718, 2771, 2436, +2718, 2771, 2436, +2718, 2771, 2435, +2718, 2771, 2435, +2717, 2770, 2434, +2717, 2770, 2432, +2717, 2770, 2430, +2717, 2769, 2430, +2718, 2769, 2431, +2718, 2770, 2433, +2719, 2771, 2443, +2720, 2774, 2457, +2721, 2773, 2466, +2716, 2771, 2466, +2717, 2774, 2492, +2718, 2776, 2528, +2718, 2777, 2569, +2722, 2782, 2624, +2727, 2788, 2703, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +2731, 2794, 2734, +1824, 0, 1212, +1824, 0, 1217, +1825, 0, 1223, +1825, 0, 1231, +1826, 0, 1242, +1827, 0, 1255, +1829, 0, 1273, +1831, 0, 1296, +1833, 0, 1325, +1830, 0, 1360, +1825, 0, 1405, +1819, 0, 1458, +1810, 0, 1521, +1804, 0, 1576, +1787, 0, 1659, +1777, 0, 1755, +1770, 0, 1865, +1790, 0, 1986, +1740, 750, 2108, +1692, 916, 2230, +1561, 947, 2370, +1845, 0, 2469, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1920, 0, 2511, +1824, 0, 1216, +1824, 0, 1219, +1825, 0, 1225, +1825, 0, 1233, +1826, 0, 1243, +1827, 0, 1257, +1829, 0, 1275, +1831, 0, 1298, +1833, 0, 1326, +1830, 0, 1362, +1825, 0, 1406, +1819, 0, 1459, +1810, 0, 1523, +1804, 0, 1578, +1787, 0, 1661, +1777, 0, 1756, +1770, 0, 1866, +1790, 32, 1986, +1740, 754, 2108, +1692, 922, 2231, +1561, 949, 2370, +1845, 0, 2470, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1825, 0, 1221, +1825, 0, 1224, +1825, 0, 1228, +1825, 0, 1235, +1826, 0, 1246, +1827, 0, 1260, +1829, 0, 1277, +1831, 0, 1300, +1833, 0, 1328, +1830, 0, 1364, +1825, 0, 1408, +1819, 0, 1461, +1810, 0, 1524, +1804, 0, 1580, +1787, 0, 1663, +1777, 0, 1758, +1770, 44, 1866, +1789, 88, 1987, +1740, 759, 2109, +1692, 931, 2231, +1562, 952, 2370, +1845, 0, 2470, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1920, 0, 2510, +1825, 0, 1228, +1825, 0, 1231, +1825, 0, 1234, +1825, 0, 1239, +1826, 0, 1249, +1827, 0, 1263, +1829, 0, 1280, +1831, 0, 1302, +1833, 0, 1331, +1830, 0, 1366, +1825, 0, 1410, +1819, 0, 1463, +1810, 0, 1526, +1804, 0, 1584, +1787, 0, 1666, +1777, 0, 1760, +1769, 102, 1867, +1788, 153, 1988, +1739, 765, 2110, +1692, 942, 2232, +1563, 957, 2370, +1845, 0, 2470, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1920, 44, 2510, +1826, 0, 1238, +1826, 0, 1240, +1826, 0, 1243, +1826, 0, 1248, +1826, 0, 1254, +1827, 0, 1267, +1829, 0, 1284, +1831, 0, 1306, +1833, 0, 1335, +1830, 0, 1370, +1825, 0, 1413, +1819, 0, 1465, +1810, 0, 1528, +1804, 0, 1588, +1787, 0, 1669, +1777, 83, 1763, +1769, 170, 1868, +1787, 229, 1990, +1739, 774, 2111, +1692, 956, 2233, +1563, 962, 2370, +1845, 0, 2470, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1921, 103, 2510, +1827, 0, 1250, +1827, 0, 1252, +1827, 0, 1255, +1827, 0, 1260, +1827, 1, 1265, +1827, 30, 1273, +1829, 30, 1290, +1831, 30, 1312, +1833, 30, 1339, +1830, 30, 1375, +1825, 30, 1417, +1819, 30, 1469, +1810, 64, 1531, +1804, 132, 1593, +1787, 132, 1674, +1777, 215, 1767, +1768, 247, 1870, +1785, 313, 1991, +1738, 785, 2113, +1692, 974, 2235, +1564, 970, 2370, +1845, 0, 2470, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1921, 171, 2510, +1829, 58, 1265, +1829, 66, 1267, +1829, 77, 1270, +1829, 91, 1275, +1829, 109, 1280, +1829, 133, 1288, +1829, 163, 1297, +1831, 163, 1318, +1833, 163, 1346, +1830, 163, 1380, +1825, 163, 1423, +1819, 163, 1474, +1810, 188, 1536, +1804, 264, 1601, +1787, 264, 1680, +1777, 347, 1772, +1767, 334, 1872, +1783, 406, 1994, +1737, 799, 2115, +1692, 998, 2237, +1565, 979, 2370, +1845, 32, 2471, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1922, 248, 2510, +1831, 183, 1285, +1831, 190, 1287, +1831, 198, 1290, +1831, 209, 1294, +1831, 223, 1299, +1831, 242, 1306, +1831, 265, 1315, +1831, 295, 1328, +1833, 295, 1354, +1830, 295, 1388, +1825, 295, 1430, +1819, 295, 1480, +1810, 314, 1541, +1804, 396, 1611, +1787, 396, 1688, +1777, 479, 1778, +1766, 428, 1875, +1779, 506, 1998, +1736, 818, 2119, +1692, 1027, 2240, +1567, 992, 2369, +1845, 164, 2471, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1922, 335, 2510, +1833, 310, 1310, +1833, 315, 1312, +1833, 322, 1315, +1833, 330, 1319, +1833, 341, 1324, +1833, 355, 1331, +1833, 373, 1339, +1833, 397, 1351, +1833, 426, 1365, +1830, 426, 1398, +1825, 426, 1439, +1819, 426, 1489, +1810, 441, 1548, +1804, 528, 1623, +1787, 528, 1699, +1777, 611, 1787, +1765, 530, 1878, +1775, 613, 2002, +1734, 841, 2123, +1692, 1064, 2244, +1569, 1008, 2369, +1844, 330, 2472, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1924, 429, 2510, +1830, 439, 1356, +1830, 443, 1358, +1830, 447, 1361, +1830, 454, 1364, +1830, 462, 1369, +1830, 473, 1375, +1830, 487, 1383, +1830, 506, 1393, +1830, 529, 1407, +1828, 531, 1428, +1824, 531, 1466, +1817, 531, 1513, +1809, 543, 1570, +1803, 601, 1641, +1787, 591, 1713, +1780, 686, 1796, +1768, 615, 1886, +1769, 725, 2008, +1730, 897, 2126, +1685, 1092, 2246, +1595, 1019, 2371, +1840, 422, 2472, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1926, 531, 2509, +1825, 568, 1412, +1825, 571, 1414, +1825, 575, 1417, +1825, 579, 1420, +1825, 586, 1424, +1825, 594, 1429, +1825, 605, 1436, +1825, 619, 1445, +1825, 638, 1457, +1824, 640, 1476, +1821, 640, 1501, +1814, 640, 1545, +1806, 648, 1598, +1800, 695, 1664, +1787, 658, 1731, +1782, 751, 1810, +1774, 707, 1896, +1763, 805, 2012, +1724, 965, 2131, +1675, 1127, 2249, +1629, 1033, 2373, +1836, 515, 2472, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1930, 640, 2509, +1819, 699, 1479, +1819, 701, 1480, +1819, 703, 1482, +1819, 707, 1485, +1819, 712, 1488, +1819, 718, 1493, +1819, 727, 1499, +1819, 737, 1507, +1819, 752, 1518, +1817, 753, 1534, +1814, 753, 1556, +1811, 753, 1584, +1803, 760, 1633, +1797, 797, 1695, +1787, 733, 1754, +1782, 813, 1830, +1781, 806, 1910, +1756, 887, 2016, +1716, 1042, 2138, +1662, 1169, 2253, +1634, 1062, 2374, +1829, 616, 2472, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1935, 753, 2509, +1811, 848, 1553, +1811, 848, 1554, +1811, 851, 1556, +1811, 853, 1558, +1811, 857, 1561, +1811, 861, 1565, +1811, 867, 1570, +1811, 875, 1577, +1811, 886, 1586, +1809, 887, 1600, +1807, 887, 1619, +1804, 887, 1644, +1799, 892, 1675, +1793, 920, 1732, +1785, 861, 1784, +1781, 901, 1853, +1789, 932, 1929, +1748, 990, 2023, +1706, 1137, 2147, +1648, 1218, 2257, +1620, 1108, 2375, +1824, 746, 2471, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1942, 876, 2509, +1820, 1109, 1630, +1820, 1109, 1631, +1819, 1109, 1633, +1819, 1109, 1635, +1818, 1109, 1637, +1817, 1109, 1641, +1815, 1109, 1645, +1813, 1109, 1651, +1810, 1109, 1659, +1810, 1109, 1670, +1808, 1109, 1686, +1805, 1109, 1707, +1800, 1112, 1734, +1793, 1134, 1775, +1785, 1098, 1823, +1767, 1090, 1881, +1785, 1153, 1970, +1749, 1166, 2045, +1704, 1267, 2165, +1646, 1289, 2266, +1638, 1188, 2377, +1843, 976, 2471, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1948, 1035, 2509, +1812, 1336, 1724, +1812, 1336, 1725, +1811, 1336, 1727, +1811, 1336, 1728, +1810, 1336, 1730, +1809, 1336, 1733, +1807, 1336, 1736, +1805, 1336, 1741, +1802, 1336, 1748, +1804, 1336, 1756, +1806, 1336, 1767, +1810, 1336, 1781, +1808, 1338, 1803, +1801, 1351, 1839, +1785, 1351, 1887, +1762, 1338, 1936, +1760, 1342, 2007, +1728, 1366, 2073, +1683, 1382, 2175, +1573, 1418, 2288, +1713, 1264, 2379, +1872, 1202, 2471, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1942, 1211, 2508, +1832, 1511, 1838, +1832, 1511, 1839, +1832, 1511, 1839, +1832, 1511, 1840, +1832, 1511, 1841, +1832, 1511, 1843, +1832, 1511, 1845, +1832, 1511, 1848, +1832, 1511, 1852, +1829, 1511, 1857, +1829, 1511, 1865, +1832, 1511, 1876, +1834, 1511, 1891, +1824, 1511, 1912, +1810, 1511, 1951, +1783, 1522, 2002, +1774, 1495, 2052, +1746, 1515, 2117, +1708, 1501, 2192, +1652, 1522, 2297, +1779, 1436, 2383, +1898, 1422, 2472, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1969, 1408, 2508, +1888, 1654, 1938, +1888, 1654, 1938, +1888, 1654, 1939, +1888, 1654, 1940, +1888, 1654, 1940, +1888, 1654, 1942, +1888, 1654, 1943, +1888, 1654, 1946, +1888, 1654, 1949, +1885, 1654, 1953, +1881, 1654, 1958, +1875, 1654, 1965, +1868, 1655, 1975, +1863, 1662, 1991, +1855, 1662, 2017, +1843, 1654, 2055, +1817, 1654, 2107, +1794, 1657, 2159, +1766, 1662, 2229, +1800, 1621, 2303, +1843, 1605, 2385, +1921, 1624, 2474, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +2007, 1630, 2511, +1977, 1783, 1983, +1977, 1783, 1984, +1977, 1783, 1984, +1977, 1783, 1985, +1977, 1783, 1986, +1978, 1783, 1987, +1978, 1783, 1989, +1979, 1783, 1991, +1980, 1783, 1994, +1980, 1783, 1997, +1977, 1785, 2004, +1973, 1788, 2012, +1966, 1792, 2023, +1959, 1786, 2037, +1958, 1786, 2064, +1950, 1793, 2093, +1929, 1801, 2129, +1939, 1792, 2174, +1905, 1778, 2235, +1877, 1792, 2311, +1920, 1800, 2389, +2007, 1802, 2476, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2064, 1798, 2511, +2083, 1958, 2032, +2082, 1958, 2032, +2082, 1958, 2032, +2082, 1958, 2033, +2082, 1958, 2034, +2082, 1958, 2035, +2081, 1958, 2036, +2081, 1958, 2038, +2080, 1958, 2041, +2077, 1959, 2045, +2073, 1961, 2051, +2067, 1963, 2058, +2061, 1965, 2068, +2056, 1964, 2080, +2056, 1959, 2093, +2052, 1959, 2114, +2036, 1961, 2142, +2031, 1968, 2199, +2019, 1953, 2244, +2017, 1958, 2317, +2046, 1962, 2395, +2106, 1970, 2483, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2149, 1969, 2517, +2191, 2132, 2068, +2191, 2132, 2068, +2191, 2132, 2069, +2190, 2132, 2069, +2190, 2132, 2070, +2190, 2131, 2071, +2189, 2131, 2072, +2188, 2130, 2074, +2187, 2130, 2076, +2187, 2129, 2079, +2187, 2129, 2083, +2187, 2129, 2088, +2187, 2129, 2096, +2184, 2129, 2105, +2180, 2129, 2117, +2180, 2128, 2131, +2170, 2124, 2154, +2176, 2127, 2200, +2167, 2133, 2262, +2179, 2135, 2315, +2208, 2135, 2395, +2271, 2155, 2484, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2291, 2159, 2521, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2360, 2121, +2407, 2359, 2122, +2407, 2359, 2122, +2407, 2359, 2123, +2407, 2358, 2123, +2408, 2359, 2125, +2408, 2360, 2128, +2409, 2360, 2131, +2409, 2360, 2135, +2408, 2362, 2141, +2405, 2359, 2147, +2402, 2358, 2164, +2395, 2358, 2193, +2399, 2361, 2228, +2408, 2365, 2275, +2419, 2368, 2338, +2446, 2373, 2402, +2486, 2387, 2498, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2516, 2398, 2529, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2687, 2656, 1984, +2688, 2656, 1989, +2688, 2656, 1991, +2688, 2656, 1992, +2689, 2656, 1995, +2690, 2656, 1999, +2690, 2657, 2008, +2688, 2657, 2023, +2688, 2657, 2054, +2688, 2658, 2083, +2688, 2659, 2149, +2689, 2659, 2227, +2696, 2667, 2323, +2703, 2668, 2417, +2722, 2681, 2534, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2728, 2686, 2580, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2773, 2448, +2722, 2772, 2447, +2721, 2772, 2444, +2721, 2771, 2441, +2720, 2770, 2438, +2721, 2771, 2443, +2722, 2773, 2457, +2723, 2774, 2473, +2723, 2774, 2481, +2717, 2775, 2500, +2720, 2779, 2531, +2720, 2778, 2569, +2726, 2782, 2625, +2731, 2788, 2703, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +2734, 2794, 2737, +1906, 311, 1618, +1906, 316, 1619, +1906, 322, 1620, +1906, 330, 1621, +1905, 342, 1623, +1905, 356, 1626, +1905, 374, 1630, +1904, 398, 1634, +1903, 427, 1640, +1901, 464, 1648, +1904, 471, 1670, +1909, 471, 1700, +1914, 464, 1736, +1910, 152, 1775, +1903, 63, 1817, +1900, 481, 1880, +1885, 481, 1958, +1866, 624, 2053, +1837, 927, 2156, +1786, 933, 2261, +1818, 679, 2380, +1933, 0, 2471, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1989, 487, 2513, +1906, 330, 1619, +1907, 325, 1621, +1906, 332, 1622, +1906, 340, 1623, +1906, 351, 1625, +1905, 365, 1628, +1905, 383, 1631, +1904, 406, 1636, +1903, 435, 1642, +1901, 471, 1650, +1904, 478, 1672, +1910, 478, 1702, +1915, 478, 1736, +1910, 179, 1776, +1903, 95, 1817, +1900, 491, 1880, +1885, 491, 1958, +1866, 631, 2054, +1837, 928, 2156, +1786, 935, 2261, +1818, 681, 2380, +1933, 0, 2471, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1989, 491, 2513, +1906, 354, 1621, +1907, 350, 1622, +1907, 344, 1624, +1907, 352, 1625, +1906, 362, 1627, +1906, 376, 1630, +1905, 393, 1633, +1904, 416, 1638, +1903, 444, 1644, +1902, 480, 1652, +1905, 486, 1674, +1910, 486, 1704, +1915, 486, 1738, +1910, 212, 1777, +1904, 135, 1818, +1900, 504, 1881, +1885, 504, 1959, +1866, 640, 2054, +1837, 930, 2156, +1787, 936, 2261, +1819, 684, 2380, +1933, 0, 2471, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1990, 495, 2513, +1906, 384, 1623, +1907, 381, 1624, +1907, 375, 1626, +1907, 367, 1628, +1907, 377, 1630, +1906, 391, 1633, +1905, 408, 1636, +1905, 430, 1641, +1904, 457, 1647, +1902, 491, 1655, +1905, 498, 1676, +1911, 498, 1706, +1915, 498, 1740, +1910, 253, 1778, +1904, 183, 1819, +1900, 520, 1882, +1885, 520, 1960, +1866, 653, 2055, +1838, 932, 2156, +1787, 939, 2261, +1819, 688, 2381, +1933, 0, 2471, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1990, 501, 2513, +1906, 422, 1625, +1907, 419, 1626, +1907, 413, 1628, +1907, 406, 1631, +1908, 397, 1634, +1907, 409, 1636, +1906, 426, 1640, +1905, 447, 1644, +1904, 473, 1650, +1903, 507, 1658, +1906, 513, 1680, +1911, 513, 1709, +1916, 513, 1743, +1911, 303, 1780, +1904, 241, 1821, +1899, 542, 1884, +1886, 542, 1962, +1866, 669, 2056, +1838, 935, 2156, +1788, 941, 2261, +1820, 693, 2381, +1933, 0, 2471, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1991, 508, 2513, +1906, 468, 1629, +1907, 465, 1630, +1907, 460, 1632, +1907, 454, 1634, +1908, 445, 1637, +1908, 434, 1641, +1907, 449, 1645, +1906, 469, 1649, +1905, 495, 1655, +1904, 526, 1663, +1907, 533, 1684, +1912, 533, 1713, +1917, 533, 1747, +1911, 362, 1783, +1905, 308, 1823, +1899, 569, 1886, +1886, 569, 1964, +1866, 690, 2057, +1839, 939, 2157, +1789, 945, 2262, +1821, 700, 2381, +1933, 10, 2471, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1993, 518, 2513, +1906, 523, 1633, +1907, 520, 1635, +1907, 516, 1636, +1907, 511, 1639, +1908, 503, 1642, +1908, 493, 1646, +1908, 479, 1651, +1908, 498, 1656, +1907, 521, 1662, +1905, 551, 1669, +1908, 557, 1690, +1913, 557, 1719, +1918, 557, 1753, +1912, 430, 1786, +1905, 384, 1826, +1898, 602, 1888, +1887, 602, 1966, +1866, 716, 2059, +1839, 944, 2157, +1791, 950, 2262, +1823, 708, 2381, +1933, 84, 2470, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1994, 531, 2513, +1906, 588, 1640, +1907, 585, 1641, +1907, 582, 1643, +1907, 577, 1645, +1908, 570, 1648, +1908, 562, 1652, +1908, 550, 1657, +1909, 533, 1664, +1908, 555, 1670, +1907, 583, 1678, +1910, 588, 1698, +1915, 588, 1727, +1920, 588, 1759, +1913, 508, 1790, +1906, 470, 1830, +1897, 644, 1892, +1888, 644, 1970, +1866, 749, 2061, +1840, 951, 2157, +1793, 957, 2263, +1825, 720, 2382, +1933, 167, 2470, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1996, 548, 2512, +1906, 662, 1647, +1907, 660, 1649, +1907, 657, 1650, +1907, 653, 1653, +1908, 647, 1655, +1908, 640, 1659, +1908, 629, 1665, +1909, 615, 1672, +1911, 596, 1681, +1909, 622, 1689, +1912, 627, 1708, +1917, 627, 1736, +1922, 627, 1769, +1913, 595, 1796, +1907, 563, 1835, +1896, 695, 1896, +1889, 695, 1975, +1866, 789, 2064, +1841, 960, 2158, +1796, 966, 2263, +1827, 735, 2383, +1933, 330, 2471, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1999, 569, 2512, +1906, 745, 1658, +1907, 743, 1659, +1907, 741, 1661, +1907, 737, 1663, +1908, 733, 1666, +1908, 727, 1670, +1908, 718, 1675, +1909, 707, 1682, +1911, 691, 1691, +1912, 669, 1703, +1915, 674, 1722, +1920, 674, 1749, +1925, 674, 1780, +1915, 674, 1805, +1909, 665, 1842, +1894, 754, 1903, +1887, 754, 1980, +1866, 838, 2069, +1843, 972, 2159, +1800, 977, 2264, +1831, 754, 2384, +1933, 489, 2472, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +2002, 596, 2512, +1910, 819, 1677, +1910, 817, 1678, +1910, 815, 1680, +1911, 812, 1682, +1911, 809, 1685, +1911, 803, 1689, +1912, 796, 1693, +1913, 787, 1700, +1914, 773, 1708, +1915, 755, 1720, +1915, 772, 1732, +1921, 772, 1758, +1925, 772, 1789, +1916, 772, 1813, +1909, 792, 1855, +1894, 863, 1914, +1887, 875, 1990, +1865, 911, 2073, +1841, 1000, 2165, +1800, 1040, 2269, +1833, 798, 2384, +1931, 640, 2472, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +2004, 683, 2511, +1915, 898, 1703, +1915, 897, 1704, +1915, 895, 1705, +1915, 893, 1707, +1916, 890, 1710, +1916, 885, 1713, +1917, 879, 1718, +1918, 871, 1724, +1919, 860, 1732, +1920, 845, 1743, +1921, 860, 1755, +1921, 885, 1769, +1925, 885, 1799, +1916, 885, 1823, +1909, 925, 1873, +1894, 979, 1929, +1887, 1007, 2002, +1862, 997, 2078, +1838, 1037, 2174, +1800, 1121, 2277, +1843, 837, 2383, +1928, 785, 2473, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +2007, 787, 2510, +1922, 997, 1735, +1922, 998, 1736, +1922, 997, 1737, +1922, 995, 1739, +1923, 993, 1741, +1923, 989, 1745, +1924, 984, 1749, +1925, 978, 1755, +1926, 969, 1763, +1927, 958, 1772, +1927, 969, 1783, +1927, 989, 1797, +1926, 1011, 1816, +1917, 1011, 1839, +1910, 1049, 1891, +1895, 1094, 1949, +1888, 1137, 2019, +1859, 1095, 2086, +1833, 1102, 2184, +1802, 1203, 2287, +1856, 905, 2383, +1926, 942, 2474, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +2010, 902, 2509, +1931, 1121, 1774, +1931, 1122, 1775, +1931, 1123, 1776, +1932, 1124, 1778, +1932, 1126, 1780, +1932, 1129, 1783, +1933, 1132, 1787, +1934, 1137, 1793, +1935, 1143, 1800, +1936, 1145, 1809, +1936, 1152, 1819, +1936, 1166, 1832, +1935, 1181, 1849, +1921, 1181, 1881, +1914, 1207, 1928, +1905, 1197, 1974, +1898, 1248, 2038, +1870, 1219, 2099, +1827, 1224, 2189, +1814, 1266, 2289, +1856, 1137, 2381, +1933, 1139, 2475, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +2017, 1048, 2509, +1943, 1312, 1836, +1943, 1312, 1837, +1943, 1313, 1838, +1943, 1314, 1839, +1944, 1315, 1841, +1944, 1317, 1844, +1945, 1319, 1847, +1945, 1322, 1852, +1946, 1326, 1858, +1948, 1331, 1866, +1945, 1332, 1875, +1940, 1332, 1886, +1936, 1339, 1902, +1923, 1339, 1930, +1915, 1358, 1965, +1906, 1343, 2006, +1889, 1364, 2062, +1872, 1381, 2136, +1826, 1367, 2210, +1822, 1339, 2296, +1868, 1258, 2382, +1955, 1262, 2478, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +2027, 1191, 2509, +1969, 1458, 1884, +1969, 1458, 1884, +1968, 1458, 1885, +1968, 1458, 1887, +1968, 1458, 1888, +1968, 1458, 1890, +1967, 1458, 1892, +1966, 1458, 1896, +1965, 1458, 1900, +1964, 1458, 1906, +1962, 1458, 1913, +1957, 1458, 1924, +1950, 1459, 1938, +1941, 1472, 1960, +1934, 1487, 1991, +1937, 1461, 2031, +1908, 1472, 2078, +1899, 1508, 2159, +1871, 1507, 2226, +1869, 1459, 2304, +1906, 1424, 2382, +1989, 1433, 2480, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +2031, 1414, 2509, +1995, 1625, 1959, +1995, 1625, 1960, +1995, 1625, 1961, +1995, 1626, 1962, +1995, 1626, 1963, +1994, 1627, 1965, +1994, 1628, 1968, +1993, 1630, 1972, +1992, 1632, 1976, +1991, 1632, 1982, +1990, 1632, 1987, +1990, 1632, 1993, +1990, 1632, 2002, +1989, 1633, 2018, +1978, 1635, 2038, +1968, 1630, 2070, +1945, 1650, 2122, +1941, 1635, 2175, +1926, 1623, 2233, +1921, 1624, 2309, +1947, 1613, 2388, +2014, 1610, 2474, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2061, 1608, 2512, +2048, 1766, 1996, +2048, 1766, 1996, +2048, 1766, 1996, +2048, 1766, 1997, +2048, 1766, 1998, +2048, 1766, 1999, +2048, 1766, 2000, +2048, 1766, 2002, +2048, 1766, 2006, +2048, 1766, 2009, +2048, 1766, 2014, +2048, 1766, 2020, +2048, 1767, 2029, +2044, 1773, 2043, +2040, 1782, 2061, +2029, 1792, 2098, +2027, 1783, 2138, +1997, 1783, 2185, +1996, 1799, 2243, +1996, 1791, 2315, +2012, 1789, 2391, +2075, 1804, 2478, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2111, 1808, 2513, +2118, 1947, 2038, +2118, 1947, 2038, +2118, 1947, 2039, +2118, 1947, 2039, +2118, 1948, 2040, +2119, 1948, 2041, +2119, 1948, 2042, +2120, 1949, 2044, +2120, 1950, 2047, +2121, 1951, 2050, +2120, 1952, 2054, +2119, 1952, 2060, +2117, 1952, 2068, +2111, 1952, 2078, +2102, 1952, 2094, +2100, 1957, 2116, +2094, 1953, 2146, +2078, 1951, 2186, +2073, 1951, 2247, +2076, 1958, 2318, +2097, 1963, 2398, +2161, 1972, 2478, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2191, 1974, 2517, +2223, 2127, 2077, +2223, 2127, 2077, +2223, 2127, 2077, +2223, 2128, 2078, +2223, 2128, 2078, +2223, 2128, 2078, +2223, 2128, 2079, +2223, 2129, 2080, +2223, 2130, 2082, +2223, 2131, 2084, +2221, 2130, 2088, +2219, 2128, 2093, +2216, 2127, 2099, +2213, 2127, 2109, +2210, 2127, 2121, +2206, 2127, 2136, +2216, 2126, 2162, +2212, 2127, 2204, +2215, 2139, 2260, +2222, 2139, 2318, +2237, 2143, 2401, +2282, 2159, 2486, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2316, 2166, 2524, +2426, 2364, 2124, +2426, 2364, 2124, +2426, 2364, 2124, +2426, 2364, 2125, +2426, 2364, 2125, +2426, 2364, 2126, +2426, 2364, 2126, +2426, 2364, 2127, +2426, 2364, 2129, +2426, 2364, 2131, +2426, 2364, 2132, +2426, 2363, 2135, +2427, 2362, 2138, +2429, 2364, 2138, +2428, 2365, 2146, +2427, 2363, 2161, +2428, 2366, 2187, +2427, 2369, 2230, +2430, 2369, 2278, +2430, 2368, 2333, +2463, 2376, 2405, +2502, 2392, 2495, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2540, 2403, 2525, +2694, 2658, 1982, +2694, 2658, 1982, +2694, 2658, 1982, +2694, 2658, 1981, +2694, 2658, 1981, +2694, 2658, 1979, +2693, 2657, 1979, +2693, 2657, 1977, +2693, 2657, 1978, +2693, 2657, 1979, +2693, 2658, 1988, +2694, 2659, 2001, +2694, 2660, 2015, +2696, 2660, 2021, +2695, 2657, 2016, +2695, 2660, 2055, +2697, 2662, 2117, +2697, 2663, 2170, +2697, 2666, 2245, +2701, 2667, 2320, +2711, 2672, 2426, +2725, 2685, 2539, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2731, 2689, 2588, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2773, 2456, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2457, +2727, 2774, 2458, +2728, 2774, 2459, +2728, 2775, 2460, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2728, 2775, 2461, +2729, 2773, 2461, +2729, 2774, 2466, +2728, 2776, 2478, +2729, 2777, 2494, +2725, 2779, 2509, +2723, 2779, 2533, +2725, 2779, 2571, +2728, 2783, 2631, +2735, 2789, 2705, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2738, 2796, 2741, +2036, 810, 1881, +2036, 808, 1882, +2036, 806, 1882, +2036, 803, 1883, +2037, 799, 1884, +2037, 794, 1886, +2037, 787, 1887, +2038, 777, 1890, +2039, 763, 1894, +2040, 745, 1898, +2042, 718, 1904, +2043, 681, 1912, +2044, 657, 1923, +2037, 657, 1946, +2028, 657, 1974, +2025, 726, 2020, +2019, 820, 2081, +1994, 874, 2146, +1993, 810, 2228, +2002, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2036, 813, 1881, +2036, 813, 1882, +2036, 811, 1883, +2036, 808, 1884, +2037, 804, 1884, +2037, 799, 1886, +2037, 791, 1888, +2038, 782, 1891, +2039, 769, 1894, +2040, 750, 1898, +2042, 724, 1905, +2043, 687, 1912, +2044, 666, 1924, +2037, 666, 1946, +2028, 666, 1974, +2024, 730, 2021, +2019, 824, 2081, +1994, 876, 2146, +1994, 812, 2228, +2002, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2037, 817, 1881, +2036, 817, 1882, +2036, 817, 1883, +2036, 814, 1884, +2037, 810, 1885, +2037, 805, 1887, +2037, 798, 1888, +2038, 789, 1891, +2039, 776, 1894, +2040, 757, 1899, +2042, 732, 1905, +2043, 695, 1913, +2044, 675, 1924, +2037, 678, 1946, +2028, 678, 1974, +2024, 735, 2021, +2019, 831, 2081, +1994, 877, 2146, +1994, 814, 2228, +2002, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2108, 0, 2510, +2037, 823, 1882, +2037, 823, 1883, +2037, 823, 1884, +2036, 823, 1885, +2037, 819, 1886, +2037, 814, 1887, +2037, 807, 1889, +2038, 797, 1892, +2039, 785, 1895, +2040, 767, 1900, +2042, 742, 1906, +2043, 706, 1914, +2044, 686, 1925, +2038, 693, 1947, +2028, 693, 1975, +2024, 742, 2022, +2020, 839, 2082, +1995, 880, 2146, +1995, 817, 2228, +2003, 0, 2298, +2010, 0, 2382, +2069, 0, 2474, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2107, 0, 2510, +2037, 830, 1882, +2037, 830, 1883, +2037, 830, 1884, +2037, 830, 1885, +2037, 830, 1887, +2037, 825, 1888, +2037, 818, 1891, +2038, 809, 1893, +2039, 797, 1897, +2040, 779, 1901, +2042, 755, 1907, +2043, 721, 1915, +2044, 701, 1926, +2038, 713, 1948, +2029, 713, 1976, +2024, 751, 2023, +2020, 850, 2082, +1995, 883, 2147, +1996, 821, 2228, +2004, 0, 2298, +2011, 0, 2383, +2069, 0, 2474, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2107, 61, 2510, +2038, 840, 1883, +2038, 840, 1884, +2038, 840, 1884, +2037, 840, 1886, +2037, 840, 1887, +2037, 840, 1890, +2037, 833, 1892, +2038, 825, 1894, +2039, 813, 1898, +2040, 796, 1902, +2042, 772, 1908, +2043, 739, 1916, +2044, 721, 1927, +2038, 737, 1950, +2029, 737, 1977, +2023, 762, 2025, +2021, 864, 2083, +1996, 888, 2147, +1997, 826, 2228, +2005, 48, 2298, +2011, 0, 2383, +2069, 10, 2474, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2105, 179, 2510, +2039, 853, 1883, +2039, 853, 1884, +2039, 853, 1885, +2038, 853, 1887, +2038, 853, 1888, +2038, 853, 1891, +2037, 853, 1894, +2038, 844, 1896, +2039, 833, 1900, +2040, 817, 1904, +2042, 794, 1910, +2043, 763, 1918, +2044, 745, 1929, +2039, 769, 1951, +2029, 769, 1979, +2023, 777, 2027, +2022, 882, 2084, +1997, 894, 2148, +1998, 832, 2227, +2006, 147, 2298, +2011, 89, 2384, +2069, 84, 2473, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2104, 299, 2510, +2040, 869, 1884, +2040, 869, 1885, +2040, 869, 1886, +2040, 869, 1887, +2039, 869, 1889, +2039, 869, 1891, +2039, 869, 1894, +2038, 869, 1899, +2039, 858, 1902, +2040, 843, 1907, +2042, 822, 1913, +2043, 792, 1920, +2044, 776, 1932, +2039, 807, 1954, +2030, 807, 1981, +2022, 797, 2029, +2023, 905, 2085, +1998, 901, 2149, +2000, 841, 2227, +2007, 253, 2298, +2012, 208, 2384, +2069, 167, 2473, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2103, 423, 2510, +2042, 890, 1885, +2042, 890, 1886, +2042, 890, 1887, +2041, 890, 1888, +2041, 890, 1890, +2041, 890, 1893, +2040, 890, 1896, +2040, 890, 1900, +2039, 890, 1905, +2040, 876, 1910, +2042, 857, 1916, +2043, 829, 1924, +2044, 814, 1935, +2040, 854, 1957, +2031, 854, 1984, +2021, 822, 2032, +2025, 934, 2086, +2000, 911, 2150, +2003, 852, 2226, +2009, 364, 2298, +2013, 329, 2385, +2069, 258, 2473, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2101, 548, 2511, +2044, 917, 1887, +2044, 917, 1887, +2044, 917, 1889, +2043, 917, 1890, +2043, 917, 1892, +2043, 917, 1894, +2042, 917, 1897, +2042, 917, 1901, +2041, 917, 1907, +2040, 917, 1914, +2042, 899, 1920, +2043, 874, 1928, +2044, 861, 1939, +2041, 906, 1961, +2032, 910, 1988, +2020, 853, 2037, +2024, 959, 2090, +2002, 924, 2152, +2007, 867, 2226, +2011, 480, 2298, +2014, 453, 2386, +2069, 358, 2472, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2098, 675, 2511, +2047, 951, 1889, +2047, 951, 1890, +2047, 951, 1891, +2047, 951, 1892, +2046, 951, 1894, +2046, 951, 1896, +2045, 951, 1899, +2045, 951, 1903, +2044, 951, 1909, +2043, 951, 1916, +2042, 951, 1926, +2043, 928, 1933, +2044, 916, 1944, +2041, 956, 1966, +2033, 976, 1993, +2021, 913, 2042, +2022, 990, 2095, +2006, 968, 2154, +2012, 886, 2225, +2014, 599, 2298, +2016, 579, 2387, +2069, 463, 2472, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2094, 803, 2512, +2051, 992, 1892, +2051, 992, 1892, +2051, 992, 1894, +2050, 992, 1895, +2050, 992, 1897, +2050, 992, 1899, +2049, 992, 1902, +2049, 992, 1906, +2048, 992, 1912, +2047, 992, 1919, +2045, 992, 1928, +2043, 992, 1941, +2044, 981, 1951, +2041, 1016, 1973, +2035, 1052, 1999, +2023, 999, 2048, +2020, 1028, 2102, +2010, 1027, 2157, +2018, 910, 2223, +2019, 722, 2298, +2019, 682, 2389, +2069, 575, 2471, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2089, 933, 2513, +2055, 1051, 1898, +2055, 1052, 1899, +2055, 1052, 1900, +2055, 1052, 1902, +2054, 1052, 1903, +2054, 1052, 1905, +2054, 1052, 1909, +2053, 1052, 1913, +2052, 1052, 1918, +2051, 1052, 1925, +2050, 1052, 1935, +2048, 1052, 1947, +2047, 1053, 1963, +2043, 1083, 1983, +2038, 1120, 2010, +2027, 1089, 2055, +2019, 1074, 2110, +2016, 1091, 2162, +2024, 958, 2224, +2023, 859, 2299, +2024, 795, 2391, +2069, 729, 2471, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2085, 1046, 2513, +2065, 1109, 1913, +2065, 1110, 1913, +2065, 1112, 1915, +2065, 1113, 1916, +2064, 1115, 1918, +2063, 1118, 1921, +2063, 1121, 1924, +2061, 1126, 1929, +2060, 1132, 1936, +2058, 1137, 1943, +2057, 1137, 1952, +2055, 1137, 1964, +2053, 1137, 1979, +2053, 1164, 1999, +2049, 1195, 2025, +2041, 1167, 2059, +2028, 1112, 2110, +2027, 1145, 2168, +2024, 1061, 2228, +2023, 1050, 2301, +2024, 973, 2387, +2069, 983, 2473, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2092, 1159, 2513, +2079, 1177, 1931, +2078, 1178, 1932, +2078, 1179, 1933, +2078, 1180, 1934, +2077, 1182, 1936, +2077, 1184, 1939, +2076, 1187, 1942, +2075, 1191, 1947, +2073, 1196, 1953, +2071, 1204, 1961, +2068, 1213, 1971, +2065, 1225, 1985, +2062, 1230, 2000, +2062, 1252, 2020, +2062, 1280, 2044, +2056, 1256, 2073, +2047, 1209, 2114, +2037, 1182, 2169, +2024, 1169, 2235, +2023, 1221, 2303, +2029, 1152, 2384, +2060, 1207, 2475, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2100, 1275, 2513, +2099, 1357, 1955, +2099, 1357, 1955, +2099, 1357, 1955, +2099, 1357, 1956, +2098, 1357, 1957, +2098, 1357, 1958, +2097, 1357, 1960, +2096, 1357, 1962, +2094, 1357, 1965, +2093, 1357, 1969, +2090, 1361, 1977, +2086, 1370, 1990, +2083, 1381, 2008, +2080, 1396, 2034, +2079, 1416, 2059, +2078, 1420, 2093, +2067, 1399, 2124, +2059, 1381, 2174, +2045, 1359, 2234, +2030, 1417, 2304, +2051, 1393, 2388, +2070, 1417, 2476, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2115, 1452, 2513, +2118, 1561, 1978, +2118, 1561, 1978, +2118, 1561, 1979, +2118, 1561, 1980, +2119, 1561, 1982, +2119, 1561, 1984, +2119, 1561, 1986, +2120, 1561, 1990, +2120, 1561, 1994, +2119, 1561, 1998, +2116, 1561, 2003, +2113, 1561, 2009, +2109, 1560, 2018, +2103, 1553, 2032, +2099, 1566, 2064, +2098, 1570, 2096, +2095, 1587, 2145, +2080, 1579, 2177, +2077, 1562, 2236, +2046, 1604, 2305, +2071, 1614, 2389, +2114, 1600, 2477, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2143, 1637, 2513, +2134, 1765, 2000, +2134, 1765, 2001, +2134, 1766, 2001, +2134, 1766, 2002, +2134, 1767, 2003, +2134, 1767, 2004, +2134, 1768, 2005, +2134, 1769, 2007, +2134, 1771, 2010, +2134, 1772, 2014, +2135, 1773, 2021, +2137, 1773, 2031, +2138, 1773, 2045, +2138, 1767, 2062, +2131, 1758, 2076, +2129, 1756, 2098, +2124, 1756, 2137, +2121, 1783, 2193, +2113, 1774, 2243, +2086, 1783, 2307, +2096, 1787, 2390, +2148, 1816, 2480, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2194, 1817, 2514, +2181, 1956, 2056, +2181, 1956, 2057, +2181, 1956, 2057, +2182, 1956, 2057, +2182, 1955, 2057, +2182, 1955, 2057, +2182, 1955, 2058, +2183, 1954, 2058, +2183, 1953, 2059, +2184, 1951, 2060, +2185, 1950, 2062, +2187, 1947, 2063, +2188, 1945, 2068, +2188, 1950, 2081, +2188, 1955, 2098, +2191, 1957, 2124, +2187, 1958, 2158, +2166, 1958, 2197, +2157, 1958, 2256, +2157, 1958, 2315, +2170, 1965, 2391, +2214, 1983, 2481, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2243, 1992, 2520, +2280, 2135, 2094, +2279, 2135, 2094, +2279, 2135, 2094, +2279, 2135, 2093, +2279, 2135, 2093, +2279, 2135, 2093, +2278, 2135, 2093, +2278, 2135, 2092, +2278, 2135, 2091, +2277, 2135, 2090, +2276, 2135, 2089, +2275, 2135, 2087, +2273, 2135, 2088, +2271, 2132, 2104, +2268, 2128, 2124, +2265, 2127, 2141, +2261, 2127, 2163, +2267, 2131, 2204, +2267, 2143, 2274, +2279, 2151, 2326, +2302, 2151, 2402, +2336, 2169, 2486, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2365, 2174, 2524, +2461, 2367, 2129, +2461, 2367, 2129, +2461, 2367, 2129, +2460, 2367, 2129, +2460, 2367, 2129, +2460, 2367, 2129, +2460, 2367, 2129, +2459, 2367, 2129, +2458, 2367, 2129, +2457, 2367, 2129, +2456, 2367, 2129, +2456, 2367, 2131, +2456, 2368, 2135, +2457, 2370, 2144, +2458, 2370, 2155, +2459, 2368, 2173, +2458, 2367, 2191, +2459, 2372, 2228, +2457, 2374, 2273, +2469, 2375, 2338, +2498, 2390, 2405, +2539, 2403, 2489, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2561, 2413, 2521, +2709, 2666, 2040, +2709, 2666, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2709, 2665, 2040, +2710, 2664, 2040, +2710, 2664, 2039, +2710, 2664, 2038, +2710, 2664, 2037, +2710, 2663, 2035, +2710, 2663, 2036, +2709, 2665, 2056, +2708, 2668, 2074, +2708, 2667, 2090, +2708, 2666, 2122, +2710, 2669, 2190, +2713, 2675, 2273, +2712, 2672, 2336, +2722, 2681, 2446, +2732, 2688, 2548, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2743, 2699, 2604, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2472, +2736, 2777, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2473, +2736, 2778, 2474, +2736, 2778, 2475, +2736, 2778, 2475, +2736, 2779, 2476, +2736, 2779, 2478, +2736, 2779, 2480, +2736, 2779, 2480, +2736, 2779, 2480, +2737, 2778, 2487, +2736, 2777, 2497, +2732, 2777, 2512, +2731, 2783, 2550, +2734, 2783, 2585, +2737, 2787, 2644, +2741, 2798, 2718, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2746, 2799, 2749, +2203, 0, 1962, +2203, 0, 1963, +2203, 0, 1963, +2203, 0, 1964, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1969, +2202, 0, 1972, +2201, 0, 1976, +2200, 0, 1981, +2199, 0, 1988, +2198, 0, 1996, +2196, 0, 2008, +2194, 0, 2027, +2190, 0, 2051, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2160, 0, 2231, +2145, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2191, 934, 2513, +2203, 0, 1962, +2203, 0, 1963, +2203, 0, 1963, +2203, 0, 1965, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1969, +2202, 0, 1972, +2201, 0, 1976, +2200, 0, 1981, +2199, 0, 1988, +2198, 0, 1997, +2196, 0, 2008, +2194, 0, 2027, +2190, 0, 2051, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2160, 0, 2231, +2145, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2191, 935, 2513, +2203, 0, 1962, +2203, 0, 1963, +2203, 0, 1964, +2203, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1976, +2200, 0, 1981, +2199, 0, 1988, +2198, 0, 1997, +2196, 0, 2008, +2194, 0, 2026, +2190, 0, 2051, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2161, 0, 2231, +2146, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2191, 937, 2513, +2203, 0, 1963, +2203, 0, 1963, +2203, 0, 1964, +2203, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1977, +2200, 0, 1982, +2199, 0, 1988, +2198, 0, 1997, +2196, 0, 2008, +2194, 0, 2026, +2190, 0, 2050, +2189, 0, 2090, +2187, 0, 2135, +2178, 0, 2178, +2161, 0, 2232, +2146, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2192, 939, 2513, +2202, 0, 1963, +2202, 0, 1963, +2202, 0, 1964, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1977, +2200, 0, 1982, +2199, 0, 1989, +2198, 0, 1997, +2196, 0, 2009, +2194, 0, 2026, +2190, 0, 2050, +2188, 0, 2090, +2187, 0, 2136, +2178, 0, 2178, +2161, 0, 2232, +2147, 0, 2305, +2169, 0, 2389, +2195, 0, 2474, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2192, 942, 2513, +2202, 0, 1963, +2202, 0, 1964, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1969, +2202, 0, 1970, +2202, 0, 1973, +2201, 0, 1977, +2200, 0, 1982, +2199, 0, 1989, +2198, 0, 1998, +2196, 0, 2009, +2194, 0, 2026, +2190, 0, 2050, +2188, 0, 2090, +2187, 0, 2136, +2178, 0, 2178, +2162, 0, 2232, +2148, 0, 2305, +2169, 0, 2389, +2195, 74, 2474, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2193, 946, 2513, +2202, 0, 1964, +2202, 0, 1965, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1968, +2202, 0, 1969, +2202, 0, 1971, +2202, 0, 1974, +2201, 0, 1978, +2200, 0, 1983, +2199, 0, 1989, +2198, 0, 1998, +2196, 0, 2010, +2194, 0, 2025, +2190, 0, 2049, +2188, 0, 2090, +2187, 0, 2137, +2178, 0, 2178, +2162, 0, 2232, +2149, 0, 2305, +2168, 0, 2389, +2196, 195, 2474, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2194, 951, 2513, +2202, 0, 1965, +2202, 0, 1965, +2202, 0, 1966, +2202, 0, 1967, +2202, 0, 1968, +2202, 0, 1970, +2202, 0, 1972, +2202, 0, 1975, +2201, 0, 1979, +2200, 0, 1984, +2199, 0, 1990, +2198, 0, 1999, +2196, 0, 2010, +2194, 0, 2024, +2190, 0, 2049, +2188, 0, 2090, +2187, 0, 2138, +2178, 0, 2178, +2163, 0, 2233, +2150, 0, 2306, +2168, 0, 2388, +2196, 319, 2474, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2195, 957, 2513, +2201, 0, 1966, +2201, 0, 1966, +2201, 0, 1967, +2201, 0, 1968, +2201, 0, 1969, +2201, 0, 1971, +2201, 0, 1973, +2201, 0, 1976, +2201, 0, 1979, +2200, 0, 1984, +2199, 0, 1991, +2198, 0, 2000, +2196, 0, 2011, +2194, 0, 2024, +2190, 0, 2048, +2187, 0, 2090, +2187, 0, 2140, +2178, 0, 2178, +2165, 0, 2233, +2152, 111, 2306, +2167, 0, 2388, +2195, 419, 2475, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2197, 966, 2513, +2200, 0, 1967, +2200, 0, 1968, +2200, 0, 1968, +2200, 0, 1969, +2200, 0, 1970, +2200, 0, 1972, +2200, 0, 1974, +2200, 0, 1977, +2200, 0, 1981, +2200, 0, 1986, +2199, 0, 1993, +2198, 0, 2001, +2196, 0, 2012, +2194, 0, 2023, +2190, 0, 2047, +2186, 0, 2090, +2186, 0, 2140, +2178, 0, 2178, +2166, 0, 2234, +2155, 244, 2307, +2166, 0, 2388, +2195, 523, 2475, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 978, 2513, +2199, 0, 1969, +2199, 0, 1969, +2199, 0, 1970, +2199, 0, 1971, +2199, 0, 1972, +2199, 0, 1974, +2199, 0, 1976, +2199, 0, 1979, +2199, 0, 1983, +2199, 0, 1988, +2199, 0, 1994, +2198, 0, 2003, +2196, 0, 2014, +2194, 0, 2025, +2190, 0, 2045, +2186, 0, 2089, +2185, 0, 2140, +2178, 0, 2180, +2169, 0, 2235, +2158, 376, 2308, +2165, 61, 2387, +2194, 633, 2476, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2202, 993, 2513, +2198, 0, 1971, +2198, 0, 1972, +2198, 0, 1972, +2198, 0, 1973, +2198, 0, 1974, +2198, 0, 1976, +2198, 0, 1978, +2198, 0, 1981, +2198, 0, 1985, +2198, 0, 1990, +2198, 0, 1996, +2198, 0, 2005, +2196, 0, 2016, +2194, 0, 2027, +2190, 0, 2043, +2186, 0, 2087, +2183, 0, 2140, +2178, 0, 2183, +2172, 0, 2236, +2163, 508, 2309, +2167, 263, 2387, +2192, 748, 2476, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2206, 1012, 2513, +2197, 0, 1974, +2197, 0, 1974, +2197, 0, 1975, +2197, 0, 1976, +2197, 0, 1977, +2197, 0, 1979, +2197, 0, 1981, +2197, 0, 1984, +2197, 0, 1988, +2197, 0, 1993, +2197, 0, 1999, +2197, 0, 2008, +2196, 0, 2019, +2194, 0, 2030, +2190, 0, 2044, +2186, 0, 2085, +2183, 0, 2139, +2179, 0, 2186, +2175, 0, 2237, +2168, 643, 2310, +2170, 532, 2388, +2192, 890, 2477, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2211, 1054, 2513, +2200, 621, 1974, +2200, 621, 1974, +2200, 621, 1976, +2200, 621, 1977, +2200, 621, 1978, +2200, 621, 1980, +2201, 621, 1983, +2201, 621, 1986, +2202, 621, 1991, +2202, 621, 1997, +2202, 621, 2003, +2202, 621, 2012, +2202, 617, 2022, +2196, 529, 2033, +2193, 529, 2047, +2189, 621, 2082, +2185, 627, 2133, +2182, 413, 2189, +2177, 708, 2240, +2170, 828, 2310, +2173, 948, 2390, +2196, 1121, 2478, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2216, 1189, 2513, +2203, 974, 1974, +2203, 974, 1974, +2203, 974, 1976, +2203, 974, 1977, +2203, 974, 1978, +2204, 974, 1980, +2204, 974, 1983, +2204, 974, 1986, +2205, 974, 1991, +2206, 974, 1997, +2207, 974, 2005, +2208, 974, 2016, +2208, 973, 2027, +2203, 934, 2038, +2196, 877, 2052, +2192, 934, 2084, +2188, 977, 2129, +2185, 874, 2183, +2181, 1059, 2243, +2174, 996, 2310, +2175, 1202, 2391, +2206, 1271, 2478, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2222, 1322, 2513, +2208, 1278, 1984, +2208, 1279, 1985, +2208, 1279, 1986, +2208, 1281, 1986, +2209, 1282, 1987, +2209, 1284, 1988, +2209, 1286, 1990, +2209, 1289, 1992, +2210, 1294, 1995, +2211, 1299, 1998, +2212, 1302, 2005, +2213, 1302, 2016, +2214, 1300, 2030, +2212, 1282, 2047, +2206, 1256, 2063, +2201, 1278, 2090, +2194, 1321, 2134, +2193, 1308, 2182, +2182, 1327, 2241, +2178, 1331, 2310, +2182, 1416, 2391, +2214, 1452, 2477, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2228, 1489, 2513, +2220, 1531, 2004, +2220, 1531, 2004, +2220, 1531, 2004, +2220, 1532, 2005, +2220, 1533, 2006, +2220, 1534, 2007, +2220, 1535, 2008, +2220, 1537, 2010, +2220, 1540, 2013, +2221, 1543, 2017, +2222, 1547, 2021, +2223, 1553, 2027, +2224, 1559, 2037, +2222, 1557, 2051, +2218, 1543, 2073, +2214, 1535, 2102, +2208, 1550, 2140, +2199, 1572, 2190, +2195, 1558, 2240, +2192, 1577, 2310, +2192, 1604, 2393, +2223, 1653, 2476, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2238, 1676, 2514, +2241, 1755, 2023, +2241, 1755, 2023, +2241, 1755, 2024, +2241, 1755, 2024, +2241, 1755, 2025, +2241, 1755, 2025, +2241, 1755, 2026, +2241, 1755, 2028, +2241, 1755, 2029, +2241, 1755, 2031, +2241, 1758, 2036, +2241, 1761, 2042, +2240, 1765, 2049, +2240, 1765, 2063, +2238, 1765, 2080, +2237, 1764, 2104, +2229, 1762, 2147, +2223, 1755, 2193, +2223, 1765, 2244, +2223, 1774, 2315, +2215, 1795, 2391, +2250, 1824, 2482, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2262, 1849, 2517, +2268, 1946, 2048, +2268, 1946, 2049, +2269, 1946, 2049, +2269, 1946, 2050, +2269, 1946, 2051, +2269, 1946, 2051, +2270, 1946, 2053, +2270, 1946, 2054, +2270, 1946, 2057, +2271, 1946, 2060, +2272, 1946, 2064, +2273, 1946, 2070, +2274, 1945, 2077, +2274, 1945, 2087, +2274, 1945, 2099, +2271, 1951, 2124, +2268, 1961, 2158, +2265, 1963, 2203, +2273, 1968, 2256, +2261, 1969, 2321, +2271, 1965, 2394, +2310, 1995, 2482, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2335, 2014, 2520, +2351, 2143, 2087, +2351, 2143, 2087, +2351, 2143, 2087, +2351, 2143, 2088, +2351, 2143, 2088, +2351, 2143, 2089, +2351, 2143, 2091, +2351, 2143, 2092, +2351, 2143, 2094, +2351, 2143, 2097, +2351, 2143, 2101, +2351, 2143, 2106, +2351, 2143, 2112, +2351, 2143, 2115, +2351, 2143, 2119, +2351, 2143, 2141, +2349, 2146, 2174, +2346, 2147, 2214, +2351, 2143, 2263, +2356, 2159, 2326, +2362, 2167, 2401, +2402, 2189, 2492, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2434, 2202, 2530, +2515, 2384, 2126, +2514, 2384, 2127, +2514, 2384, 2127, +2514, 2384, 2127, +2514, 2383, 2127, +2514, 2383, 2127, +2514, 2383, 2128, +2514, 2383, 2128, +2514, 2382, 2129, +2513, 2382, 2130, +2513, 2381, 2131, +2513, 2381, 2133, +2514, 2382, 2135, +2515, 2384, 2141, +2515, 2385, 2150, +2515, 2388, 2172, +2515, 2388, 2195, +2520, 2388, 2230, +2523, 2391, 2279, +2523, 2395, 2342, +2548, 2407, 2404, +2582, 2421, 2483, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2607, 2433, 2514, +2731, 2680, 2128, +2731, 2680, 2129, +2731, 2680, 2129, +2731, 2680, 2130, +2731, 2680, 2131, +2731, 2681, 2132, +2731, 2681, 2133, +2731, 2681, 2135, +2731, 2681, 2136, +2730, 2681, 2137, +2730, 2681, 2138, +2729, 2680, 2140, +2728, 2679, 2142, +2728, 2679, 2150, +2730, 2679, 2164, +2731, 2678, 2176, +2730, 2679, 2195, +2730, 2680, 2243, +2735, 2682, 2308, +2735, 2687, 2382, +2739, 2689, 2468, +2750, 2708, 2581, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2756, 2707, 2625, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2495, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2496, +2755, 2784, 2497, +2755, 2784, 2498, +2755, 2785, 2499, +2755, 2785, 2501, +2755, 2786, 2503, +2755, 2786, 2506, +2755, 2787, 2509, +2755, 2787, 2512, +2755, 2787, 2515, +2754, 2787, 2520, +2753, 2788, 2528, +2753, 2787, 2543, +2751, 2785, 2569, +2749, 2789, 2602, +2753, 2795, 2660, +2755, 2801, 2726, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2757, 2802, 2755, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2331, 0, 2024, +2330, 0, 2034, +2326, 0, 2051, +2322, 0, 2072, +2321, 0, 2094, +2320, 0, 2138, +2314, 0, 2186, +2319, 0, 2244, +2315, 0, 2315, +2317, 0, 2391, +2334, 913, 2480, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2348, 1255, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2331, 0, 2024, +2330, 0, 2034, +2326, 0, 2051, +2322, 0, 2072, +2321, 0, 2094, +2320, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 917, 2480, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2348, 1256, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2051, +2322, 0, 2072, +2321, 0, 2095, +2320, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 922, 2479, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2348, 1258, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2052, +2322, 0, 2072, +2321, 0, 2095, +2321, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 929, 2479, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2348, 1260, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2331, 0, 2002, +2331, 0, 2003, +2331, 0, 2005, +2331, 0, 2007, +2331, 0, 2010, +2331, 0, 2013, +2331, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2052, +2322, 0, 2072, +2321, 0, 2095, +2321, 0, 2138, +2315, 0, 2186, +2319, 0, 2245, +2315, 0, 2315, +2317, 0, 2392, +2334, 938, 2479, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2349, 1263, 2518, +2331, 0, 2000, +2331, 0, 2000, +2331, 0, 2001, +2331, 0, 2001, +2330, 0, 2002, +2330, 0, 2003, +2330, 0, 2005, +2330, 0, 2007, +2330, 0, 2010, +2330, 0, 2013, +2330, 0, 2018, +2330, 0, 2024, +2329, 0, 2034, +2326, 0, 2052, +2322, 0, 2073, +2321, 0, 2095, +2322, 0, 2138, +2315, 0, 2186, +2318, 0, 2245, +2315, 30, 2315, +2317, 0, 2392, +2334, 949, 2479, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2349, 1267, 2518, +2331, 0, 2000, +2330, 0, 2000, +2330, 0, 2001, +2330, 0, 2001, +2330, 0, 2002, +2330, 0, 2003, +2330, 0, 2005, +2330, 0, 2007, +2330, 0, 2010, +2330, 0, 2013, +2330, 0, 2018, +2329, 0, 2024, +2328, 0, 2034, +2327, 0, 2053, +2323, 0, 2073, +2321, 0, 2096, +2322, 0, 2139, +2315, 0, 2186, +2318, 0, 2245, +2315, 163, 2315, +2317, 32, 2392, +2334, 964, 2478, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2350, 1272, 2518, +2330, 0, 2000, +2330, 0, 2000, +2330, 0, 2001, +2330, 0, 2001, +2330, 0, 2002, +2330, 0, 2003, +2329, 0, 2005, +2329, 0, 2007, +2329, 0, 2010, +2329, 0, 2013, +2329, 0, 2018, +2328, 0, 2024, +2327, 0, 2034, +2327, 0, 2053, +2323, 0, 2073, +2321, 0, 2096, +2323, 0, 2139, +2316, 0, 2186, +2318, 0, 2246, +2315, 295, 2315, +2317, 164, 2393, +2334, 983, 2478, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2351, 1279, 2518, +2330, 0, 2000, +2330, 0, 2000, +2330, 0, 2001, +2330, 0, 2001, +2329, 0, 2002, +2329, 0, 2003, +2329, 0, 2005, +2329, 0, 2007, +2328, 0, 2010, +2328, 0, 2013, +2328, 0, 2018, +2328, 0, 2024, +2327, 0, 2034, +2327, 0, 2054, +2323, 0, 2074, +2321, 0, 2097, +2325, 0, 2140, +2316, 0, 2186, +2317, 111, 2246, +2315, 426, 2315, +2317, 296, 2393, +2334, 993, 2478, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2352, 1288, 2518, +2329, 0, 2000, +2329, 0, 2000, +2329, 0, 2001, +2329, 0, 2001, +2329, 0, 2002, +2329, 0, 2003, +2328, 0, 2005, +2328, 0, 2007, +2328, 0, 2010, +2327, 0, 2013, +2327, 0, 2018, +2326, 0, 2024, +2325, 0, 2034, +2327, 0, 2055, +2324, 0, 2075, +2321, 0, 2098, +2325, 0, 2141, +2317, 0, 2186, +2317, 244, 2247, +2315, 559, 2315, +2317, 428, 2393, +2335, 1003, 2479, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2354, 1300, 2518, +2328, 0, 2000, +2328, 0, 2000, +2328, 0, 2001, +2328, 0, 2001, +2328, 0, 2002, +2328, 0, 2003, +2328, 0, 2005, +2327, 0, 2007, +2327, 0, 2010, +2326, 0, 2013, +2325, 0, 2018, +2325, 0, 2024, +2324, 0, 2034, +2326, 0, 2055, +2325, 61, 2077, +2322, 0, 2099, +2325, 0, 2142, +2319, 0, 2187, +2316, 376, 2248, +2315, 691, 2315, +2317, 560, 2394, +2337, 1018, 2479, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2356, 1315, 2518, +2328, 0, 2000, +2328, 0, 2000, +2328, 0, 2001, +2328, 0, 2001, +2328, 0, 2002, +2327, 0, 2003, +2327, 0, 2005, +2327, 0, 2007, +2326, 0, 2010, +2326, 0, 2013, +2325, 0, 2018, +2325, 0, 2027, +2324, 0, 2036, +2326, 0, 2057, +2327, 111, 2081, +2323, 0, 2103, +2324, 0, 2142, +2322, 0, 2190, +2315, 426, 2247, +2315, 741, 2315, +2319, 692, 2394, +2338, 1091, 2481, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2357, 1322, 2518, +2328, 0, 2000, +2328, 0, 2001, +2328, 0, 2001, +2328, 0, 2002, +2328, 0, 2003, +2328, 0, 2004, +2328, 0, 2006, +2327, 0, 2008, +2327, 0, 2011, +2326, 0, 2014, +2326, 0, 2019, +2325, 0, 2028, +2325, 0, 2040, +2327, 44, 2061, +2328, 216, 2085, +2326, 0, 2109, +2323, 0, 2139, +2324, 123, 2193, +2314, 517, 2247, +2316, 765, 2314, +2321, 843, 2393, +2340, 1204, 2482, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2357, 1332, 2518, +2332, 614, 2005, +2332, 614, 2005, +2332, 614, 2006, +2332, 614, 2007, +2332, 614, 2008, +2332, 614, 2009, +2331, 614, 2011, +2331, 614, 2014, +2331, 614, 2017, +2330, 614, 2021, +2329, 614, 2026, +2329, 614, 2035, +2329, 614, 2047, +2329, 614, 2057, +2330, 670, 2082, +2328, 727, 2109, +2321, 757, 2137, +2324, 709, 2196, +2318, 901, 2249, +2318, 868, 2316, +2319, 1072, 2391, +2342, 1300, 2483, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2357, 1409, 2519, +2336, 924, 2012, +2336, 924, 2013, +2336, 924, 2013, +2336, 924, 2014, +2335, 924, 2015, +2335, 924, 2017, +2335, 924, 2019, +2335, 924, 2021, +2335, 924, 2024, +2334, 924, 2029, +2333, 924, 2035, +2333, 924, 2042, +2333, 924, 2052, +2333, 924, 2063, +2333, 971, 2080, +2330, 1020, 2108, +2324, 1065, 2141, +2325, 1052, 2197, +2321, 1173, 2253, +2319, 1077, 2317, +2317, 1227, 2391, +2345, 1377, 2483, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2359, 1509, 2521, +2339, 1291, 2020, +2339, 1291, 2020, +2339, 1290, 2020, +2339, 1289, 2020, +2339, 1288, 2021, +2339, 1286, 2022, +2338, 1283, 2023, +2338, 1280, 2024, +2338, 1276, 2026, +2337, 1270, 2028, +2336, 1267, 2033, +2336, 1267, 2040, +2336, 1269, 2048, +2336, 1288, 2065, +2336, 1315, 2084, +2334, 1351, 2116, +2331, 1343, 2151, +2330, 1343, 2198, +2326, 1378, 2257, +2319, 1407, 2317, +2328, 1414, 2394, +2350, 1546, 2482, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2368, 1608, 2518, +2349, 1557, 2025, +2349, 1557, 2025, +2349, 1557, 2025, +2349, 1557, 2026, +2348, 1557, 2026, +2348, 1557, 2027, +2348, 1557, 2028, +2348, 1557, 2029, +2347, 1557, 2031, +2347, 1554, 2033, +2346, 1550, 2036, +2345, 1548, 2041, +2344, 1548, 2050, +2344, 1550, 2067, +2343, 1557, 2089, +2339, 1571, 2115, +2337, 1566, 2150, +2337, 1567, 2198, +2334, 1596, 2255, +2334, 1620, 2319, +2342, 1646, 2396, +2365, 1717, 2481, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2382, 1733, 2518, +2364, 1776, 2032, +2364, 1776, 2033, +2364, 1776, 2033, +2364, 1777, 2034, +2364, 1778, 2035, +2364, 1779, 2037, +2363, 1781, 2038, +2363, 1783, 2041, +2363, 1786, 2044, +2362, 1790, 2049, +2361, 1791, 2052, +2360, 1789, 2057, +2359, 1784, 2065, +2361, 1784, 2074, +2360, 1788, 2094, +2357, 1783, 2117, +2358, 1792, 2156, +2361, 1806, 2207, +2354, 1805, 2259, +2356, 1809, 2322, +2365, 1822, 2394, +2383, 1874, 2484, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2403, 1889, 2522, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2073, +2391, 1976, 2074, +2391, 1976, 2074, +2391, 1976, 2075, +2391, 1976, 2076, +2391, 1976, 2077, +2391, 1976, 2078, +2391, 1976, 2080, +2392, 1977, 2084, +2394, 1981, 2093, +2395, 1984, 2105, +2395, 1984, 2134, +2392, 1984, 2163, +2391, 1984, 2207, +2387, 1995, 2266, +2396, 1995, 2324, +2406, 2017, 2405, +2425, 2038, 2488, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2448, 2060, 2526, +2463, 2177, 2109, +2463, 2177, 2109, +2463, 2177, 2110, +2463, 2177, 2110, +2463, 2177, 2110, +2463, 2177, 2111, +2463, 2178, 2112, +2463, 2178, 2113, +2463, 2179, 2114, +2463, 2180, 2116, +2463, 2181, 2119, +2462, 2182, 2121, +2460, 2183, 2124, +2459, 2181, 2126, +2458, 2177, 2134, +2459, 2184, 2157, +2463, 2186, 2183, +2461, 2184, 2220, +2460, 2188, 2268, +2468, 2189, 2340, +2476, 2191, 2406, +2508, 2230, 2493, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2527, 2237, 2533, +2598, 2410, 2071, +2598, 2410, 2071, +2599, 2411, 2071, +2599, 2411, 2071, +2599, 2411, 2071, +2600, 2412, 2070, +2600, 2412, 2070, +2602, 2413, 2069, +2603, 2414, 2069, +2604, 2416, 2068, +2606, 2418, 2066, +2607, 2419, 2068, +2607, 2420, 2073, +2607, 2420, 2079, +2607, 2420, 2088, +2607, 2420, 2112, +2607, 2422, 2147, +2606, 2422, 2181, +2609, 2420, 2243, +2615, 2426, 2302, +2628, 2437, 2380, +2656, 2458, 2462, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2676, 2468, 2496, +2763, 2702, 2255, +2763, 2702, 2255, +2763, 2702, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2762, 2701, 2255, +2763, 2701, 2256, +2763, 2701, 2257, +2764, 2701, 2260, +2765, 2701, 2267, +2765, 2701, 2274, +2763, 2702, 2284, +2762, 2704, 2300, +2763, 2706, 2316, +2764, 2703, 2348, +2764, 2703, 2388, +2768, 2710, 2455, +2769, 2717, 2538, +2774, 2727, 2626, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2777, 2731, 2667, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2797, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2548, +2781, 2798, 2549, +2781, 2798, 2550, +2781, 2799, 2550, +2781, 2799, 2551, +2781, 2800, 2553, +2782, 2800, 2555, +2782, 2801, 2558, +2781, 2801, 2560, +2780, 2800, 2559, +2782, 2800, 2561, +2781, 2802, 2573, +2781, 2801, 2584, +2780, 2801, 2606, +2777, 2799, 2640, +2775, 2801, 2677, +2779, 2810, 2744, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2781, 2810, 2772, +2481, 974, 2044, +2481, 973, 2044, +2481, 971, 2044, +2481, 969, 2045, +2480, 967, 2045, +2480, 963, 2046, +2480, 958, 2047, +2480, 951, 2048, +2480, 951, 2051, +2480, 951, 2054, +2480, 951, 2058, +2480, 951, 2063, +2480, 955, 2072, +2479, 992, 2087, +2477, 1037, 2103, +2476, 1071, 2127, +2475, 1132, 2163, +2475, 1219, 2209, +2476, 1370, 2267, +2478, 1392, 2329, +2488, 1469, 2402, +2504, 1610, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2481, 977, 2044, +2481, 977, 2044, +2481, 976, 2044, +2480, 974, 2045, +2480, 971, 2045, +2480, 968, 2046, +2480, 963, 2047, +2480, 956, 2048, +2480, 955, 2051, +2480, 955, 2054, +2480, 955, 2058, +2480, 955, 2063, +2480, 960, 2072, +2479, 996, 2087, +2477, 1041, 2103, +2476, 1074, 2127, +2476, 1133, 2163, +2475, 1220, 2209, +2476, 1373, 2267, +2478, 1394, 2329, +2488, 1469, 2402, +2504, 1611, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2481, 982, 2044, +2481, 982, 2044, +2480, 982, 2044, +2480, 980, 2045, +2480, 977, 2045, +2480, 974, 2046, +2480, 969, 2047, +2480, 962, 2048, +2480, 962, 2051, +2480, 962, 2054, +2480, 962, 2058, +2480, 962, 2063, +2480, 966, 2072, +2479, 1002, 2087, +2477, 1046, 2103, +2476, 1079, 2127, +2476, 1136, 2162, +2475, 1221, 2209, +2476, 1377, 2267, +2478, 1397, 2329, +2488, 1469, 2402, +2504, 1611, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2481, 988, 2044, +2480, 988, 2044, +2480, 988, 2044, +2480, 988, 2045, +2480, 985, 2045, +2480, 981, 2046, +2480, 977, 2047, +2480, 970, 2048, +2480, 970, 2051, +2480, 970, 2054, +2480, 970, 2058, +2480, 970, 2063, +2480, 974, 2072, +2479, 1010, 2087, +2477, 1053, 2103, +2476, 1085, 2127, +2476, 1138, 2162, +2475, 1222, 2209, +2476, 1382, 2267, +2478, 1400, 2329, +2488, 1469, 2402, +2504, 1612, 2488, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2480, 996, 2044, +2480, 996, 2044, +2480, 996, 2044, +2480, 996, 2045, +2480, 996, 2045, +2480, 992, 2046, +2480, 987, 2047, +2480, 981, 2048, +2480, 981, 2051, +2480, 981, 2054, +2480, 981, 2058, +2480, 981, 2063, +2480, 985, 2072, +2479, 1020, 2087, +2477, 1062, 2103, +2476, 1094, 2127, +2476, 1142, 2162, +2476, 1223, 2208, +2476, 1388, 2268, +2478, 1404, 2329, +2488, 1469, 2402, +2504, 1614, 2487, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2480, 1006, 2044, +2480, 1006, 2044, +2480, 1006, 2044, +2480, 1006, 2045, +2480, 1006, 2045, +2480, 1006, 2046, +2480, 1001, 2047, +2479, 995, 2048, +2479, 995, 2051, +2479, 995, 2054, +2479, 995, 2058, +2479, 995, 2063, +2479, 999, 2072, +2479, 1032, 2087, +2477, 1074, 2103, +2476, 1105, 2127, +2476, 1147, 2162, +2476, 1225, 2208, +2476, 1397, 2268, +2478, 1409, 2329, +2488, 1469, 2401, +2503, 1615, 2487, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2519, 1697, 2526, +2480, 1019, 2044, +2480, 1019, 2044, +2480, 1019, 2044, +2480, 1019, 2045, +2480, 1019, 2045, +2480, 1019, 2046, +2479, 1019, 2047, +2479, 1013, 2048, +2479, 1013, 2051, +2479, 1013, 2054, +2479, 1013, 2058, +2479, 1013, 2063, +2479, 1017, 2072, +2479, 1049, 2087, +2477, 1089, 2103, +2475, 1119, 2127, +2476, 1154, 2161, +2476, 1228, 2208, +2477, 1408, 2268, +2477, 1417, 2329, +2488, 1469, 2401, +2503, 1618, 2486, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2480, 1036, 2044, +2480, 1036, 2044, +2480, 1036, 2044, +2480, 1036, 2045, +2480, 1036, 2045, +2479, 1036, 2046, +2479, 1036, 2047, +2479, 1036, 2048, +2479, 1036, 2051, +2479, 1036, 2054, +2479, 1036, 2058, +2479, 1036, 2063, +2479, 1039, 2072, +2478, 1070, 2087, +2476, 1108, 2103, +2475, 1137, 2127, +2477, 1162, 2161, +2476, 1232, 2207, +2477, 1423, 2268, +2477, 1426, 2329, +2488, 1469, 2401, +2503, 1621, 2486, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2518, 1697, 2526, +2480, 1071, 2044, +2480, 1071, 2044, +2480, 1071, 2044, +2480, 1071, 2045, +2480, 1071, 2045, +2479, 1071, 2046, +2479, 1071, 2047, +2479, 1071, 2048, +2479, 1044, 2051, +2479, 1044, 2054, +2479, 1044, 2058, +2479, 1044, 2063, +2479, 1048, 2072, +2479, 1085, 2087, +2477, 1122, 2103, +2476, 1149, 2126, +2478, 1179, 2161, +2476, 1241, 2208, +2477, 1424, 2268, +2478, 1436, 2329, +2488, 1480, 2401, +2504, 1627, 2485, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2519, 1702, 2526, +2480, 1115, 2044, +2480, 1115, 2044, +2480, 1115, 2044, +2480, 1115, 2045, +2480, 1115, 2045, +2479, 1115, 2046, +2479, 1115, 2047, +2479, 1115, 2048, +2479, 1091, 2051, +2479, 1054, 2054, +2479, 1054, 2058, +2479, 1054, 2063, +2479, 1058, 2072, +2479, 1099, 2087, +2478, 1138, 2103, +2476, 1165, 2125, +2478, 1193, 2160, +2477, 1254, 2209, +2477, 1424, 2266, +2479, 1448, 2329, +2488, 1495, 2401, +2504, 1635, 2485, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2521, 1708, 2526, +2480, 1169, 2044, +2480, 1169, 2044, +2480, 1169, 2044, +2480, 1169, 2045, +2480, 1169, 2045, +2479, 1169, 2046, +2479, 1169, 2047, +2479, 1169, 2048, +2479, 1147, 2051, +2479, 1114, 2054, +2479, 1067, 2058, +2479, 1067, 2063, +2479, 1070, 2072, +2479, 1111, 2087, +2479, 1159, 2103, +2478, 1185, 2125, +2480, 1212, 2159, +2478, 1278, 2209, +2477, 1424, 2264, +2480, 1464, 2329, +2488, 1514, 2402, +2505, 1646, 2485, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2523, 1718, 2525, +2480, 1231, 2044, +2480, 1231, 2044, +2480, 1231, 2044, +2480, 1231, 2045, +2480, 1231, 2045, +2479, 1231, 2046, +2479, 1231, 2047, +2479, 1231, 2048, +2479, 1212, 2051, +2479, 1184, 2054, +2479, 1144, 2058, +2479, 1083, 2063, +2479, 1087, 2072, +2479, 1126, 2087, +2481, 1186, 2103, +2479, 1210, 2125, +2481, 1236, 2158, +2479, 1308, 2209, +2477, 1424, 2262, +2481, 1485, 2329, +2488, 1542, 2402, +2507, 1660, 2485, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2526, 1729, 2524, +2480, 1299, 2045, +2480, 1299, 2045, +2480, 1299, 2045, +2480, 1299, 2046, +2480, 1299, 2046, +2480, 1299, 2047, +2480, 1299, 2048, +2479, 1299, 2049, +2479, 1283, 2051, +2479, 1259, 2054, +2479, 1225, 2059, +2479, 1174, 2064, +2479, 1114, 2072, +2480, 1151, 2087, +2481, 1213, 2103, +2481, 1244, 2125, +2483, 1268, 2156, +2481, 1346, 2209, +2477, 1430, 2260, +2483, 1511, 2329, +2489, 1583, 2403, +2509, 1680, 2486, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2529, 1745, 2524, +2482, 1385, 2049, +2482, 1385, 2049, +2482, 1384, 2049, +2482, 1384, 2050, +2482, 1382, 2050, +2482, 1381, 2051, +2482, 1379, 2052, +2481, 1376, 2053, +2482, 1366, 2055, +2482, 1349, 2058, +2482, 1321, 2063, +2482, 1281, 2068, +2482, 1235, 2076, +2482, 1263, 2087, +2484, 1312, 2103, +2484, 1330, 2127, +2485, 1346, 2157, +2483, 1386, 2211, +2480, 1472, 2262, +2483, 1568, 2328, +2492, 1634, 2404, +2509, 1714, 2486, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2531, 1767, 2524, +2484, 1508, 2049, +2484, 1507, 2049, +2484, 1507, 2049, +2484, 1506, 2050, +2484, 1506, 2050, +2484, 1504, 2051, +2483, 1503, 2052, +2483, 1501, 2053, +2483, 1493, 2055, +2484, 1482, 2058, +2485, 1467, 2063, +2485, 1445, 2068, +2485, 1416, 2076, +2486, 1436, 2087, +2488, 1470, 2103, +2487, 1479, 2127, +2487, 1478, 2157, +2484, 1484, 2208, +2487, 1547, 2268, +2485, 1642, 2328, +2495, 1671, 2406, +2509, 1751, 2486, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2531, 1801, 2522, +2490, 1632, 2052, +2490, 1632, 2052, +2490, 1632, 2053, +2490, 1632, 2054, +2490, 1632, 2054, +2490, 1632, 2056, +2490, 1632, 2057, +2490, 1632, 2060, +2490, 1628, 2062, +2491, 1623, 2066, +2491, 1613, 2070, +2492, 1598, 2075, +2493, 1580, 2082, +2492, 1580, 2091, +2493, 1600, 2105, +2492, 1613, 2131, +2491, 1631, 2162, +2489, 1632, 2206, +2493, 1658, 2265, +2493, 1730, 2328, +2499, 1742, 2404, +2518, 1813, 2489, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2537, 1864, 2526, +2502, 1784, 2071, +2502, 1784, 2071, +2502, 1784, 2071, +2502, 1784, 2072, +2502, 1784, 2073, +2502, 1784, 2073, +2502, 1784, 2075, +2502, 1784, 2077, +2502, 1779, 2078, +2502, 1774, 2081, +2503, 1769, 2085, +2503, 1762, 2090, +2504, 1754, 2098, +2504, 1757, 2107, +2503, 1757, 2115, +2502, 1754, 2140, +2499, 1757, 2175, +2500, 1778, 2215, +2501, 1806, 2266, +2500, 1817, 2326, +2509, 1832, 2402, +2528, 1891, 2490, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2547, 1940, 2532, +2516, 1927, 2075, +2516, 1928, 2075, +2516, 1928, 2075, +2516, 1928, 2076, +2516, 1928, 2076, +2517, 1929, 2077, +2517, 1929, 2078, +2517, 1930, 2079, +2517, 1930, 2081, +2516, 1930, 2084, +2516, 1924, 2087, +2515, 1913, 2090, +2514, 1901, 2096, +2516, 1900, 2105, +2517, 1912, 2120, +2515, 1910, 2143, +2514, 1921, 2180, +2513, 1918, 2218, +2516, 1938, 2272, +2518, 1938, 2333, +2528, 1977, 2406, +2552, 2008, 2491, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2567, 2036, 2526, +2547, 2073, 2093, +2547, 2073, 2093, +2547, 2073, 2093, +2546, 2073, 2093, +2546, 2073, 2094, +2546, 2073, 2094, +2545, 2073, 2095, +2545, 2073, 2096, +2545, 2073, 2098, +2545, 2073, 2100, +2545, 2073, 2102, +2545, 2073, 2106, +2545, 2073, 2111, +2545, 2075, 2119, +2543, 2075, 2127, +2543, 2078, 2149, +2543, 2075, 2180, +2546, 2089, 2222, +2546, 2091, 2274, +2551, 2098, 2337, +2558, 2115, 2411, +2588, 2155, 2491, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2598, 2168, 2529, +2602, 2259, 2099, +2602, 2258, 2099, +2602, 2258, 2099, +2602, 2258, 2099, +2602, 2258, 2099, +2601, 2258, 2099, +2600, 2258, 2099, +2600, 2257, 2099, +2600, 2257, 2101, +2600, 2257, 2104, +2600, 2257, 2108, +2600, 2257, 2113, +2600, 2257, 2120, +2603, 2257, 2132, +2606, 2257, 2144, +2606, 2263, 2161, +2611, 2270, 2190, +2606, 2266, 2226, +2612, 2277, 2289, +2615, 2277, 2347, +2621, 2290, 2414, +2651, 2318, 2497, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2668, 2333, 2527, +2722, 2488, 1839, +2722, 2488, 1839, +2722, 2488, 1841, +2722, 2488, 1843, +2723, 2488, 1845, +2723, 2489, 1848, +2724, 2489, 1852, +2724, 2489, 1858, +2724, 2489, 1862, +2724, 2489, 1867, +2724, 2488, 1873, +2723, 2488, 1876, +2723, 2488, 1878, +2722, 2488, 1891, +2722, 2486, 1913, +2722, 2485, 1956, +2723, 2487, 2015, +2723, 2486, 2070, +2727, 2489, 2159, +2732, 2495, 2242, +2745, 2509, 2352, +2763, 2528, 2453, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2772, 2539, 2499, +2811, 2738, 2425, +2811, 2738, 2425, +2811, 2738, 2426, +2811, 2738, 2426, +2811, 2738, 2426, +2811, 2738, 2426, +2811, 2738, 2427, +2811, 2738, 2427, +2811, 2739, 2428, +2811, 2739, 2430, +2811, 2739, 2431, +2811, 2740, 2434, +2811, 2740, 2437, +2811, 2740, 2440, +2810, 2740, 2444, +2810, 2740, 2448, +2811, 2742, 2464, +2810, 2743, 2483, +2810, 2745, 2522, +2810, 2748, 2564, +2811, 2752, 2623, +2810, 2762, 2701, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2813, 2763, 2731, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2591, +2820, 2813, 2590, +2820, 2813, 2590, +2820, 2813, 2589, +2820, 2812, 2589, +2820, 2813, 2590, +2820, 2813, 2591, +2820, 2813, 2592, +2820, 2813, 2593, +2820, 2814, 2596, +2819, 2814, 2598, +2818, 2813, 2599, +2820, 2813, 2604, +2822, 2813, 2612, +2820, 2813, 2623, +2820, 2815, 2643, +2818, 2815, 2670, +2818, 2817, 2713, +2813, 2819, 2768, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2814, 2823, 2799, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2554, 1623, 2059, +2554, 1623, 2059, +2554, 1623, 2060, +2554, 1623, 2060, +2554, 1623, 2061, +2554, 1623, 2063, +2554, 1623, 2065, +2554, 1623, 2067, +2554, 1623, 2070, +2554, 1623, 2074, +2554, 1623, 2080, +2554, 1623, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2555, 1588, 2133, +2556, 1555, 2169, +2555, 1608, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1761, 2409, +2587, 1838, 2491, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1625, 2059, +2554, 1624, 2059, +2554, 1624, 2060, +2554, 1624, 2060, +2554, 1624, 2061, +2554, 1624, 2063, +2554, 1624, 2064, +2554, 1624, 2067, +2554, 1624, 2070, +2554, 1624, 2074, +2554, 1624, 2080, +2554, 1624, 2087, +2554, 1621, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1590, 2134, +2556, 1556, 2169, +2555, 1609, 2217, +2557, 1691, 2269, +2563, 1692, 2342, +2564, 1762, 2409, +2587, 1839, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1627, 2059, +2554, 1626, 2059, +2554, 1625, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2063, +2554, 1625, 2064, +2554, 1625, 2067, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1622, 2096, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1592, 2134, +2556, 1559, 2169, +2555, 1610, 2217, +2557, 1691, 2269, +2564, 1693, 2342, +2564, 1764, 2409, +2587, 1840, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1630, 2060, +2554, 1629, 2060, +2554, 1627, 2060, +2554, 1625, 2060, +2554, 1625, 2061, +2554, 1625, 2062, +2554, 1625, 2064, +2554, 1625, 2066, +2554, 1625, 2070, +2554, 1625, 2074, +2554, 1625, 2079, +2554, 1625, 2086, +2554, 1623, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1595, 2134, +2556, 1562, 2169, +2555, 1611, 2217, +2557, 1691, 2270, +2564, 1694, 2342, +2564, 1765, 2409, +2587, 1842, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1633, 2060, +2554, 1632, 2060, +2554, 1631, 2060, +2554, 1629, 2060, +2554, 1626, 2061, +2554, 1626, 2062, +2554, 1626, 2064, +2554, 1626, 2066, +2554, 1626, 2069, +2554, 1626, 2073, +2554, 1626, 2079, +2554, 1626, 2086, +2554, 1625, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1599, 2135, +2556, 1567, 2169, +2555, 1613, 2217, +2557, 1692, 2270, +2564, 1695, 2342, +2565, 1768, 2409, +2587, 1844, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2554, 1638, 2061, +2554, 1638, 2061, +2554, 1636, 2061, +2554, 1634, 2061, +2554, 1631, 2061, +2554, 1628, 2062, +2554, 1628, 2063, +2554, 1628, 2066, +2554, 1628, 2069, +2554, 1628, 2073, +2554, 1628, 2079, +2554, 1628, 2086, +2554, 1626, 2095, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1605, 2135, +2556, 1572, 2169, +2555, 1616, 2217, +2557, 1693, 2270, +2564, 1696, 2342, +2565, 1771, 2409, +2587, 1847, 2492, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2597, 1897, 2530, +2555, 1645, 2062, +2555, 1644, 2062, +2555, 1643, 2062, +2555, 1641, 2062, +2555, 1638, 2062, +2555, 1635, 2063, +2555, 1631, 2063, +2555, 1631, 2066, +2555, 1631, 2069, +2555, 1631, 2073, +2555, 1631, 2078, +2555, 1631, 2085, +2555, 1628, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1612, 2136, +2556, 1580, 2169, +2554, 1619, 2217, +2558, 1694, 2270, +2564, 1698, 2342, +2565, 1775, 2409, +2587, 1852, 2492, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2555, 1654, 2063, +2555, 1653, 2063, +2555, 1651, 2063, +2555, 1650, 2063, +2555, 1647, 2063, +2555, 1644, 2064, +2555, 1640, 2064, +2555, 1633, 2065, +2555, 1633, 2068, +2555, 1633, 2072, +2555, 1633, 2078, +2555, 1633, 2085, +2555, 1631, 2094, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1621, 2137, +2557, 1590, 2169, +2554, 1624, 2217, +2558, 1695, 2270, +2564, 1701, 2342, +2565, 1781, 2409, +2588, 1857, 2493, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2597, 1897, 2529, +2556, 1665, 2064, +2556, 1664, 2065, +2556, 1663, 2065, +2556, 1661, 2065, +2556, 1659, 2065, +2556, 1655, 2066, +2556, 1651, 2066, +2556, 1646, 2066, +2556, 1638, 2067, +2556, 1638, 2071, +2556, 1638, 2077, +2556, 1638, 2084, +2556, 1636, 2093, +2554, 1621, 2102, +2554, 1621, 2110, +2556, 1633, 2138, +2557, 1603, 2169, +2554, 1630, 2217, +2558, 1697, 2271, +2564, 1704, 2342, +2565, 1788, 2409, +2588, 1860, 2493, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2597, 1897, 2528, +2556, 1680, 2066, +2556, 1679, 2067, +2556, 1678, 2067, +2556, 1676, 2067, +2556, 1674, 2067, +2556, 1671, 2068, +2556, 1667, 2068, +2556, 1661, 2069, +2556, 1653, 2069, +2556, 1643, 2070, +2556, 1643, 2076, +2556, 1643, 2083, +2556, 1641, 2092, +2554, 1624, 2101, +2554, 1621, 2110, +2557, 1649, 2140, +2557, 1620, 2170, +2554, 1638, 2217, +2558, 1699, 2271, +2565, 1709, 2342, +2566, 1798, 2409, +2589, 1863, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2558, 1699, 2069, +2558, 1698, 2069, +2558, 1697, 2070, +2558, 1695, 2070, +2558, 1693, 2070, +2558, 1690, 2070, +2558, 1686, 2071, +2558, 1681, 2071, +2558, 1674, 2072, +2558, 1663, 2073, +2558, 1650, 2074, +2558, 1650, 2082, +2557, 1648, 2091, +2555, 1631, 2100, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1642, 2173, +2554, 1658, 2217, +2559, 1702, 2273, +2565, 1715, 2342, +2566, 1810, 2409, +2589, 1868, 2493, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2597, 1897, 2527, +2559, 1723, 2073, +2559, 1723, 2073, +2559, 1722, 2073, +2559, 1720, 2073, +2559, 1718, 2074, +2559, 1715, 2074, +2559, 1711, 2074, +2559, 1706, 2075, +2559, 1699, 2076, +2559, 1690, 2077, +2559, 1677, 2078, +2559, 1659, 2080, +2558, 1657, 2089, +2556, 1641, 2098, +2554, 1621, 2110, +2557, 1657, 2141, +2558, 1669, 2176, +2555, 1684, 2217, +2560, 1706, 2274, +2566, 1723, 2342, +2567, 1816, 2409, +2591, 1873, 2493, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2597, 1897, 2525, +2560, 1754, 2078, +2560, 1754, 2078, +2560, 1753, 2078, +2560, 1752, 2079, +2560, 1750, 2079, +2560, 1747, 2079, +2560, 1744, 2080, +2560, 1739, 2080, +2560, 1732, 2081, +2560, 1724, 2082, +2560, 1712, 2083, +2560, 1695, 2085, +2560, 1674, 2088, +2558, 1658, 2097, +2555, 1635, 2110, +2557, 1661, 2141, +2559, 1703, 2179, +2556, 1716, 2217, +2560, 1716, 2275, +2566, 1739, 2342, +2568, 1818, 2408, +2592, 1880, 2493, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2597, 1898, 2524, +2562, 1761, 2078, +2562, 1761, 2078, +2562, 1761, 2079, +2562, 1762, 2080, +2562, 1763, 2080, +2562, 1765, 2082, +2562, 1766, 2084, +2562, 1769, 2086, +2562, 1772, 2089, +2563, 1771, 2091, +2563, 1760, 2093, +2563, 1745, 2094, +2562, 1727, 2097, +2561, 1712, 2103, +2558, 1692, 2116, +2556, 1693, 2138, +2560, 1738, 2181, +2560, 1744, 2217, +2561, 1744, 2275, +2566, 1785, 2340, +2571, 1835, 2406, +2592, 1893, 2492, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2599, 1908, 2527, +2563, 1769, 2078, +2563, 1769, 2078, +2563, 1770, 2079, +2563, 1771, 2080, +2563, 1772, 2080, +2563, 1773, 2082, +2564, 1775, 2084, +2564, 1777, 2086, +2564, 1780, 2089, +2564, 1784, 2093, +2565, 1789, 2098, +2565, 1796, 2105, +2566, 1789, 2110, +2564, 1776, 2116, +2563, 1758, 2124, +2559, 1753, 2143, +2558, 1773, 2177, +2563, 1787, 2220, +2563, 1779, 2275, +2566, 1840, 2337, +2576, 1860, 2406, +2591, 1925, 2491, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2602, 1920, 2530, +2566, 1822, 2077, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2078, +2566, 1822, 2079, +2566, 1822, 2079, +2566, 1822, 2080, +2566, 1822, 2081, +2566, 1822, 2083, +2566, 1822, 2085, +2567, 1824, 2089, +2568, 1831, 2096, +2568, 1839, 2106, +2570, 1844, 2121, +2568, 1834, 2131, +2568, 1813, 2145, +2564, 1813, 2176, +2565, 1838, 2221, +2568, 1838, 2272, +2573, 1888, 2337, +2580, 1896, 2406, +2599, 1967, 2492, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2609, 1966, 2529, +2573, 1894, 2080, +2573, 1894, 2081, +2573, 1895, 2081, +2573, 1896, 2081, +2573, 1897, 2082, +2574, 1898, 2082, +2574, 1900, 2083, +2575, 1903, 2084, +2575, 1906, 2086, +2575, 1906, 2088, +2575, 1906, 2090, +2575, 1906, 2094, +2575, 1906, 2099, +2575, 1907, 2109, +2576, 1913, 2129, +2577, 1915, 2152, +2578, 1893, 2171, +2576, 1899, 2221, +2578, 1919, 2273, +2580, 1949, 2338, +2587, 1961, 2408, +2611, 2008, 2495, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2623, 2041, 2528, +2588, 1996, 2083, +2588, 1997, 2083, +2588, 1997, 2084, +2588, 1997, 2085, +2588, 1997, 2086, +2588, 1998, 2087, +2588, 1998, 2088, +2588, 1999, 2091, +2588, 2000, 2093, +2588, 2001, 2098, +2588, 2005, 2100, +2589, 2012, 2104, +2591, 2018, 2108, +2588, 2010, 2114, +2588, 2009, 2126, +2589, 2014, 2149, +2590, 2016, 2184, +2591, 2003, 2214, +2591, 2019, 2275, +2595, 2044, 2342, +2604, 2072, 2411, +2625, 2108, 2494, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2644, 2138, 2530, +2625, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2149, 2111, +2624, 2148, 2111, +2624, 2148, 2111, +2623, 2147, 2111, +2623, 2146, 2111, +2622, 2145, 2111, +2621, 2143, 2111, +2620, 2141, 2111, +2618, 2137, 2111, +2617, 2136, 2114, +2617, 2144, 2126, +2617, 2155, 2141, +2619, 2157, 2164, +2623, 2160, 2195, +2624, 2165, 2231, +2619, 2165, 2275, +2633, 2187, 2352, +2638, 2190, 2417, +2660, 2223, 2503, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2672, 2249, 2537, +2670, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2112, +2671, 2315, 2111, +2671, 2316, 2111, +2672, 2316, 2111, +2672, 2316, 2111, +2673, 2317, 2110, +2674, 2318, 2109, +2675, 2319, 2108, +2677, 2321, 2107, +2680, 2323, 2105, +2682, 2325, 2106, +2681, 2325, 2118, +2680, 2325, 2133, +2678, 2328, 2149, +2677, 2328, 2176, +2677, 2325, 2215, +2687, 2335, 2275, +2689, 2335, 2316, +2695, 2346, 2391, +2724, 2369, 2462, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2735, 2385, 2488, +2775, 2531, 1744, +2775, 2531, 1745, +2775, 2531, 1747, +2775, 2531, 1750, +2776, 2532, 1753, +2776, 2532, 1758, +2776, 2533, 1764, +2776, 2533, 1772, +2777, 2534, 1782, +2778, 2535, 1796, +2778, 2536, 1813, +2778, 2537, 1825, +2777, 2535, 1833, +2776, 2530, 1839, +2776, 2528, 1859, +2778, 2535, 1929, +2779, 2534, 1991, +2780, 2535, 2071, +2782, 2538, 2158, +2784, 2536, 2248, +2791, 2552, 2360, +2803, 2569, 2485, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2813, 2581, 2533, +2826, 2762, 2506, +2826, 2762, 2506, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2762, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2505, +2826, 2761, 2506, +2826, 2761, 2507, +2826, 2761, 2509, +2826, 2761, 2510, +2826, 2760, 2508, +2826, 2760, 2508, +2826, 2762, 2520, +2826, 2764, 2535, +2826, 2763, 2548, +2826, 2763, 2571, +2826, 2767, 2613, +2826, 2769, 2662, +2826, 2779, 2732, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2784, 2763, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2623, +2826, 2823, 2625, +2826, 2823, 2628, +2826, 2822, 2631, +2826, 2821, 2638, +2826, 2822, 2651, +2826, 2823, 2668, +2826, 2819, 2690, +2826, 2823, 2740, +2826, 2825, 2794, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819, +2826, 2826, 2819] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.3dl b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.3dl new file mode 100644 index 0000000000..7d112117cd --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.3dl @@ -0,0 +1,32769 @@ +0 33 66 99 132 165 198 231 264 297 330 363 396 429 462 495 528 561 594 627 660 693 726 759 792 825 858 891 924 957 990 1023 +0 0 0 +97 163 0 +201 318 0 +312 466 0 +427 609 0 +545 750 0 +667 888 0 +792 1025 0 +918 1160 0 +1046 1295 0 +1174 1429 0 +1304 1563 0 +1434 1696 0 +1565 1828 0 +1696 1961 0 +1827 2094 0 +1959 2226 0 +2090 2358 0 +2222 2491 0 +2354 2623 0 +2486 2755 0 +2618 2887 0 +2750 3019 0 +2882 3152 0 +3014 3284 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +163 0 97 +163 42 0 +318 300 0 +419 466 0 +512 609 0 +613 750 0 +719 888 0 +832 1025 0 +949 1160 0 +1069 1295 0 +1192 1429 0 +1318 1563 0 +1444 1696 0 +1572 1828 0 +1702 1961 0 +1831 2094 0 +1962 2226 0 +2093 2358 0 +2224 2491 0 +2355 2623 0 +2487 2755 0 +2619 2887 0 +2750 3019 0 +2883 3152 0 +3014 3284 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +318 0 201 +318 0 13 +318 93 0 +466 388 0 +606 609 0 +689 750 0 +781 888 0 +881 1025 0 +987 1160 0 +1099 1295 0 +1215 1429 0 +1335 1563 0 +1457 1696 0 +1582 1828 0 +1709 1961 0 +1837 2094 0 +1966 2226 0 +2096 2358 0 +2226 2491 0 +2357 2623 0 +2488 2755 0 +2620 2887 0 +2751 3019 0 +2883 3152 0 +3014 3284 0 +3147 3416 0 +3279 3548 0 +3410 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +466 0 312 +466 0 171 +466 0 0 +466 154 0 +609 485 0 +750 723 0 +852 888 0 +939 1025 0 +1033 1160 0 +1135 1295 0 +1244 1429 0 +1357 1563 0 +1475 1696 0 +1596 1828 0 +1719 1961 0 +1845 2094 0 +1972 2226 0 +2100 2358 0 +2230 2491 0 +2359 2623 0 +2490 2755 0 +2621 2887 0 +2752 3019 0 +2884 3152 0 +3015 3284 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +609 0 427 +609 0 322 +609 0 127 +609 0 0 +609 224 0 +750 587 0 +888 838 0 +1006 1025 0 +1089 1160 0 +1181 1295 0 +1280 1429 0 +1385 1563 0 +1496 1696 0 +1612 1828 0 +1732 1961 0 +1855 2094 0 +1979 2226 0 +2106 2358 0 +2234 2491 0 +2363 2623 0 +2493 2755 0 +2623 2887 0 +2754 3019 0 +2885 3152 0 +3016 3284 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +750 0 545 +750 0 467 +750 0 334 +750 0 59 +750 0 0 +750 304 0 +888 697 0 +1025 957 0 +1154 1160 0 +1234 1295 0 +1323 1429 0 +1421 1563 0 +1524 1696 0 +1634 1828 0 +1749 1961 0 +1867 2094 0 +1989 2226 0 +2113 2358 0 +2239 2491 0 +2367 2623 0 +2496 2755 0 +2625 2887 0 +2755 3019 0 +2886 3152 0 +3017 3284 0 +3148 3416 0 +3280 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +888 0 667 +888 0 608 +888 0 515 +888 0 350 +888 0 0 +888 0 0 +888 392 0 +1025 811 0 +1160 1079 0 +1295 1292 0 +1376 1429 0 +1463 1563 0 +1559 1696 0 +1661 1828 0 +1770 1961 0 +1884 2094 0 +2002 2226 0 +2123 2358 0 +2247 2491 0 +2372 2623 0 +2500 2755 0 +2628 2887 0 +2758 3019 0 +2888 3152 0 +3018 3284 0 +3149 3416 0 +3280 3548 0 +3412 3680 0 +3544 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1025 0 792 +1025 0 748 +1025 0 681 +1025 0 573 +1025 0 371 +1025 0 0 +1025 0 0 +1025 488 0 +1160 929 0 +1295 1204 0 +1429 1419 0 +1515 1563 0 +1601 1696 0 +1696 1828 0 +1797 1961 0 +1905 2094 0 +2018 2226 0 +2136 2358 0 +2256 2491 0 +2380 2623 0 +2505 2755 0 +2633 2887 0 +2761 3019 0 +2890 3152 0 +3020 3284 0 +3151 3416 0 +3281 3548 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3808 4076 0 +3939 4095 0 +1160 0 918 +1160 0 885 +1160 0 836 +1160 0 762 +1160 0 640 +1160 0 397 +1160 0 0 +1160 0 0 +1160 592 0 +1295 1051 0 +1429 1330 0 +1563 1548 0 +1653 1696 0 +1738 1828 0 +1831 1961 0 +1932 2094 0 +2039 2226 0 +2152 2358 0 +2269 2491 0 +2390 2623 0 +2513 2755 0 +2638 2887 0 +2765 3019 0 +2893 3152 0 +3022 3284 0 +3152 3416 0 +3283 3548 0 +3414 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1295 0 1046 +1295 0 1021 +1295 0 985 +1295 0 934 +1295 0 853 +1295 0 717 +1295 0 431 +1295 0 0 +1295 0 0 +1295 702 0 +1429 1174 0 +1563 1458 0 +1696 1677 0 +1789 1828 0 +1873 1961 0 +1966 2094 0 +2066 2226 0 +2173 2358 0 +2285 2491 0 +2402 2623 0 +2523 2755 0 +2646 2887 0 +2771 3019 0 +2898 3152 0 +3025 3284 0 +3155 3416 0 +3285 3548 0 +3415 3680 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1174 +1429 0 1156 +1429 0 1130 +1429 0 1092 +1429 0 1037 +1429 0 951 +1429 0 803 +1429 0 471 +1429 0 0 +1429 0 0 +1429 816 0 +1563 1301 0 +1696 1587 0 +1828 1807 0 +1923 1961 0 +2007 2094 0 +2100 2226 0 +2200 2358 0 +2306 2491 0 +2419 2623 0 +2535 2755 0 +2655 2887 0 +2778 3019 0 +2903 3152 0 +3030 3284 0 +3158 3416 0 +3287 3548 0 +3417 3680 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1563 0 1304 +1563 0 1290 +1563 0 1271 +1563 0 1244 +1563 0 1205 +1563 0 1148 +1563 0 1057 +1563 0 897 +1563 0 523 +1563 0 0 +1563 0 0 +1563 934 0 +1696 1427 0 +1828 1716 0 +1961 1938 0 +2058 2094 0 +2141 2226 0 +2233 2358 0 +2333 2491 0 +2440 2623 0 +2552 2755 0 +2668 2887 0 +2788 3019 0 +2911 3152 0 +3035 3284 0 +3162 3416 0 +3290 3548 0 +3419 3680 0 +3549 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1434 +1696 0 1424 +1696 0 1410 +1696 0 1390 +1696 0 1362 +1696 0 1322 +1696 0 1262 +1696 0 1167 +1696 0 998 +1696 0 580 +1696 0 0 +1696 0 0 +1696 1056 0 +1828 1557 0 +1961 1847 0 +2094 2069 0 +2191 2226 0 +2275 2358 0 +2367 2491 0 +2466 2623 0 +2573 2755 0 +2684 2887 0 +2800 3019 0 +2920 3152 0 +3043 3284 0 +3168 3416 0 +3294 3548 0 +3422 3680 0 +3552 3812 0 +3681 3944 0 +3812 4076 0 +3942 4095 0 +1828 0 1565 +1828 0 1557 +1828 0 1547 +1828 0 1532 +1828 0 1512 +1828 0 1484 +1828 0 1442 +1828 0 1381 +1828 0 1283 +1828 0 1106 +1828 0 650 +1828 0 0 +1828 0 0 +1828 1180 0 +1961 1686 0 +2094 1977 0 +2226 2200 0 +2325 2358 0 +2408 2491 0 +2500 2623 0 +2599 2755 0 +2705 2887 0 +2816 3019 0 +2933 3152 0 +3052 3284 0 +3175 3416 0 +3300 3548 0 +3427 3680 0 +3554 3812 0 +3683 3944 0 +3813 4076 0 +3944 4095 0 +1961 0 1696 +1961 0 1690 +1961 0 1682 +1961 0 1672 +1961 0 1657 +1961 0 1636 +1961 0 1607 +1961 0 1565 +1961 0 1503 +1961 0 1402 +1961 0 1220 +1961 0 726 +1961 0 0 +1961 0 0 +1961 1306 0 +2094 1816 0 +2226 2108 0 +2358 2332 0 +2458 2491 0 +2541 2623 0 +2632 2755 0 +2732 2887 0 +2837 3019 0 +2949 3152 0 +3065 3284 0 +3184 3416 0 +3307 3548 0 +3432 3680 0 +3559 3812 0 +3687 3944 0 +3816 4076 0 +3946 4095 0 +2094 0 1827 +2094 0 1823 +2094 0 1817 +2094 0 1809 +2094 0 1798 +2094 0 1783 +2094 0 1763 +2094 0 1733 +2094 0 1691 +2094 0 1626 +2094 0 1524 +2094 0 1336 +2094 0 814 +2094 0 0 +2094 0 0 +2094 1433 0 +2226 1946 0 +2358 2239 0 +2491 2463 0 +2590 2623 0 +2673 2755 0 +2765 2887 0 +2864 3019 0 +2970 3152 0 +3081 3284 0 +3197 3416 0 +3317 3548 0 +3440 3680 0 +3564 3812 0 +3691 3944 0 +3819 4076 0 +3948 4095 0 +2226 0 1959 +2226 0 1956 +2226 0 1951 +2226 0 1945 +2226 0 1937 +2226 0 1926 +2226 0 1911 +2226 0 1890 +2226 0 1860 +2226 0 1817 +2226 0 1753 +2226 0 1648 +2226 0 1457 +2226 0 907 +2226 0 0 +2226 0 0 +2226 1562 0 +2358 2078 0 +2491 2371 0 +2623 2595 0 +2723 2755 0 +2806 2887 0 +2897 3019 0 +2996 3152 0 +3102 3284 0 +3213 3416 0 +3329 3548 0 +3449 3680 0 +3572 3812 0 +3696 3944 0 +3823 4076 0 +3951 4095 0 +2358 0 2090 +2358 0 2088 +2358 0 2085 +2358 0 2080 +2358 0 2074 +2358 0 2066 +2358 0 2055 +2358 0 2040 +2358 0 2019 +2358 0 1989 +2358 0 1946 +2358 0 1880 +2358 0 1775 +2358 0 1580 +2358 0 1009 +2358 0 0 +2358 0 0 +2358 1692 0 +2491 2209 0 +2623 2503 0 +2755 2727 0 +2856 2887 0 +2938 3019 0 +3030 3152 0 +3128 3284 0 +3234 3416 0 +3346 3548 0 +3462 3680 0 +3581 3812 0 +3704 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2222 +2491 0 2220 +2491 0 2218 +2491 0 2215 +2491 0 2210 +2491 0 2204 +2491 0 2196 +2491 0 2185 +2491 0 2170 +2491 0 2149 +2491 0 2119 +2491 0 2075 +2491 0 2009 +2491 0 1903 +2491 0 1706 +2491 0 1120 +2491 0 0 +2491 0 0 +2491 1822 0 +2623 2340 0 +2755 2635 0 +2887 2859 0 +2988 3019 0 +3071 3152 0 +3162 3284 0 +3261 3416 0 +3367 3548 0 +3478 3680 0 +3594 3812 0 +3713 3944 0 +3836 4076 0 +3961 4095 0 +2623 0 2354 +2623 0 2352 +2623 0 2351 +2623 0 2348 +2623 0 2345 +2623 0 2341 +2623 0 2335 +2623 0 2327 +2623 0 2315 +2623 0 2300 +2623 0 2278 +2623 0 2248 +2623 0 2205 +2623 0 2138 +2623 0 2032 +2623 0 1833 +2623 0 1232 +2623 0 0 +2623 0 0 +2623 1952 0 +2755 2473 0 +2887 2767 0 +3019 2991 0 +3120 3152 0 +3203 3284 0 +3294 3416 0 +3393 3548 0 +3499 3680 0 +3610 3812 0 +3726 3944 0 +3846 4076 0 +3968 4095 0 +2755 0 2486 +2755 0 2485 +2755 0 2484 +2755 0 2482 +2755 0 2479 +2755 0 2476 +2755 0 2472 +2755 0 2466 +2755 0 2457 +2755 0 2446 +2755 0 2431 +2755 0 2409 +2755 0 2379 +2755 0 2335 +2755 0 2269 +2755 0 2162 +2755 0 1962 +2755 0 1353 +2755 0 0 +2755 0 0 +2755 2083 0 +2887 2604 0 +3019 2898 0 +3152 3123 0 +3252 3284 0 +3335 3416 0 +3426 3548 0 +3525 3680 0 +3631 3812 0 +3742 3944 0 +3858 4076 0 +3978 4095 0 +2887 0 2618 +2887 0 2617 +2887 0 2616 +2887 0 2615 +2887 0 2613 +2887 0 2611 +2887 0 2607 +2887 0 2603 +2887 0 2597 +2887 0 2589 +2887 0 2577 +2887 0 2562 +2887 0 2541 +2887 0 2510 +2887 0 2466 +2887 0 2400 +2887 0 2292 +2887 0 2091 +2887 0 1472 +2887 0 0 +2887 0 0 +2887 2215 0 +3019 2735 0 +3152 3031 0 +3284 3254 0 +3385 3416 0 +3467 3548 0 +3558 3680 0 +3657 3812 0 +3763 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2750 +3019 0 2749 +3019 0 2748 +3019 0 2747 +3019 0 2746 +3019 0 2744 +3019 0 2742 +3019 0 2738 +3019 0 2734 +3019 0 2728 +3019 0 2720 +3019 0 2708 +3019 0 2693 +3019 0 2672 +3019 0 2641 +3019 0 2597 +3019 0 2530 +3019 0 2422 +3019 0 2220 +3019 0 1594 +3019 0 0 +3019 0 0 +3019 2346 0 +3152 2868 0 +3284 3162 0 +3416 3387 0 +3516 3548 0 +3599 3680 0 +3691 3812 0 +3790 3944 0 +3895 4076 0 +4007 4095 0 +3152 0 2882 +3152 0 2881 +3152 0 2881 +3152 0 2880 +3152 0 2879 +3152 0 2878 +3152 0 2876 +3152 0 2873 +3152 0 2870 +3152 0 2866 +3152 0 2860 +3152 0 2851 +3152 0 2840 +3152 0 2825 +3152 0 2803 +3152 0 2773 +3152 0 2729 +3152 0 2662 +3152 0 2554 +3152 0 2352 +3152 0 1720 +3152 0 0 +3152 0 0 +3152 2478 0 +3284 2999 0 +3416 3294 0 +3548 3519 0 +3649 3680 0 +3732 3812 0 +3823 3944 0 +3922 4076 0 +4027 4095 0 +3284 0 3014 +3284 0 3014 +3284 0 3013 +3284 0 3012 +3284 0 3012 +3284 0 3011 +3284 0 3009 +3284 0 3008 +3284 0 3005 +3284 0 3002 +3284 0 2997 +3284 0 2991 +3284 0 2983 +3284 0 2972 +3284 0 2956 +3284 0 2935 +3284 0 2904 +3284 0 2860 +3284 0 2793 +3284 0 2684 +3284 0 2481 +3284 0 1844 +3284 0 0 +3284 0 0 +3284 2609 0 +3416 3132 0 +3548 3426 0 +3680 3651 0 +3781 3812 0 +3864 3944 0 +3955 4076 0 +4054 4095 0 +3416 0 3146 +3416 0 3146 +3416 0 3145 +3416 0 3145 +3416 0 3144 +3416 0 3144 +3416 0 3143 +3416 0 3141 +3416 0 3139 +3416 0 3137 +3416 0 3134 +3416 0 3129 +3416 0 3123 +3416 0 3115 +3416 0 3104 +3416 0 3088 +3416 0 3067 +3416 0 3036 +3416 0 2992 +3416 0 2925 +3416 0 2816 +3416 0 2613 +3416 0 1977 +3416 0 0 +3416 0 0 +3416 2741 0 +3548 3264 0 +3680 3558 0 +3812 3783 0 +3913 3944 0 +3996 4076 0 +4087 4095 0 +3548 0 3278 +3548 0 3278 +3548 0 3278 +3548 0 3277 +3548 0 3277 +3548 0 3276 +3548 0 3276 +3548 0 3275 +3548 0 3273 +3548 0 3271 +3548 0 3269 +3548 0 3266 +3548 0 3261 +3548 0 3255 +3548 0 3247 +3548 0 3236 +3548 0 3220 +3548 0 3198 +3548 0 3168 +3548 0 3124 +3548 0 3056 +3548 0 2948 +3548 0 2745 +3548 0 2104 +3548 0 0 +3548 0 0 +3548 2873 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3409 +3680 0 3409 +3680 0 3408 +3680 0 3408 +3680 0 3406 +3680 0 3405 +3680 0 3403 +3680 0 3401 +3680 0 3398 +3680 0 3393 +3680 0 3387 +3680 0 3379 +3680 0 3367 +3680 0 3352 +3680 0 3330 +3680 0 3300 +3680 0 3255 +3680 0 3188 +3680 0 3080 +3680 0 2876 +3680 0 2237 +3680 0 0 +3680 0 0 +3680 3005 0 +3812 3528 0 +3944 3822 0 +4076 4047 0 +4095 4095 0 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3541 +3812 0 3541 +3812 0 3541 +3812 0 3540 +3812 0 3540 +3812 0 3538 +3812 0 3537 +3812 0 3535 +3812 0 3533 +3812 0 3530 +3812 0 3525 +3812 0 3519 +3812 0 3511 +3812 0 3499 +3812 0 3484 +3812 0 3462 +3812 0 3432 +3812 0 3387 +3812 0 3320 +3812 0 3211 +3812 0 3008 +3812 0 2367 +3812 0 0 +3812 0 0 +3812 3137 0 +3944 3660 0 +4076 3954 0 +4095 4095 0 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3670 +3944 0 3669 +3944 0 3667 +3944 0 3665 +3944 0 3661 +3944 0 3657 +3944 0 3651 +3944 0 3643 +3944 0 3631 +3944 0 3616 +3944 0 3594 +3944 0 3564 +3944 0 3520 +3944 0 3452 +3944 0 3344 +3944 0 3140 +3944 0 2497 +3944 0 0 +3944 0 0 +3944 3269 0 +4076 3791 0 +4095 4087 0 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3803 +4076 0 3801 +4076 0 3799 +4076 0 3797 +4076 0 3793 +4076 0 3789 +4076 0 3783 +4076 0 3774 +4076 0 3763 +4076 0 3748 +4076 0 3726 +4076 0 3696 +4076 0 3651 +4076 0 3584 +4076 0 3475 +4076 0 3271 +4076 0 2626 +4076 0 0 +4076 0 0 +4076 3401 0 +4095 3924 0 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3933 +4095 0 3932 +4095 0 3929 +4095 0 3926 +4095 0 3921 +4095 0 3915 +4095 0 3907 +4095 0 3896 +4095 0 3880 +4095 0 3859 +4095 0 3828 +4095 0 3784 +4095 0 3716 +4095 0 3608 +4095 0 3404 +4095 0 2761 +4095 0 0 +4095 0 0 +4095 3533 0 +0 97 163 +0 163 42 +13 318 0 +171 466 0 +322 609 0 +467 750 0 +608 888 0 +748 1025 0 +885 1160 0 +1021 1295 0 +1156 1429 0 +1290 1563 0 +1424 1696 0 +1557 1828 0 +1690 1961 0 +1823 2094 0 +1956 2226 0 +2088 2358 0 +2220 2491 0 +2352 2623 0 +2485 2755 0 +2617 2887 0 +2749 3019 0 +2881 3152 0 +3014 3284 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +42 0 163 +131 131 131 +229 295 86 +333 450 15 +444 598 0 +559 741 0 +678 882 0 +800 1020 0 +924 1157 0 +1050 1292 0 +1178 1427 0 +1307 1561 0 +1436 1695 0 +1566 1828 0 +1697 1961 0 +1828 2093 0 +1959 2226 0 +2091 2358 0 +2223 2491 0 +2354 2623 0 +2486 2755 0 +2618 2887 0 +2750 3019 0 +2882 3152 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +300 0 318 +295 86 229 +295 174 86 +450 432 15 +551 598 0 +644 741 0 +745 882 0 +852 1020 0 +964 1157 0 +1081 1292 0 +1201 1427 0 +1325 1561 0 +1450 1695 0 +1576 1828 0 +1705 1961 0 +1834 2093 0 +1963 2226 0 +2094 2358 0 +2225 2491 0 +2356 2623 0 +2488 2755 0 +2619 2887 0 +2751 3019 0 +2883 3152 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +466 0 419 +450 15 333 +450 15 145 +450 225 15 +598 520 0 +738 741 0 +822 882 0 +914 1020 0 +1013 1157 0 +1119 1292 0 +1231 1427 0 +1347 1561 0 +1467 1695 0 +1590 1828 0 +1715 1961 0 +1841 2093 0 +1969 2226 0 +2098 2358 0 +2228 2491 0 +2358 2623 0 +2489 2755 0 +2620 2887 0 +2752 3019 0 +2883 3152 0 +3015 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +609 0 512 +598 0 444 +598 0 303 +598 0 0 +598 286 0 +741 616 0 +882 855 0 +985 1020 0 +1071 1157 0 +1166 1292 0 +1267 1427 0 +1376 1561 0 +1489 1695 0 +1607 1828 0 +1728 1961 0 +1851 2093 0 +1977 2226 0 +2104 2358 0 +2233 2491 0 +2362 2623 0 +2492 2755 0 +2622 2887 0 +2753 3019 0 +2885 3152 0 +3016 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +750 0 613 +741 0 559 +741 0 453 +741 0 258 +741 0 0 +741 356 0 +882 719 0 +1020 970 0 +1139 1157 0 +1221 1292 0 +1313 1427 0 +1412 1561 0 +1517 1695 0 +1629 1828 0 +1745 1961 0 +1864 2093 0 +1987 2226 0 +2111 2358 0 +2238 2491 0 +2366 2623 0 +2495 2755 0 +2625 2887 0 +2755 3019 0 +2886 3152 0 +3017 3283 0 +3148 3416 0 +3280 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +888 0 719 +882 0 678 +882 0 599 +882 0 466 +882 0 190 +882 0 0 +882 436 0 +1020 829 0 +1157 1089 0 +1286 1292 0 +1366 1427 0 +1456 1561 0 +1552 1695 0 +1656 1828 0 +1766 1961 0 +1881 2093 0 +1999 2226 0 +2121 2358 0 +2245 2491 0 +2372 2623 0 +2499 2755 0 +2628 2887 0 +2757 3019 0 +2888 3152 0 +3018 3283 0 +3149 3416 0 +3280 3548 0 +3412 3680 0 +3544 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1025 0 832 +1020 0 800 +1020 0 740 +1020 0 647 +1020 0 482 +1020 0 81 +1020 0 0 +1020 524 0 +1157 943 0 +1292 1211 0 +1427 1424 0 +1508 1561 0 +1596 1695 0 +1691 1828 0 +1793 1961 0 +1902 2093 0 +2016 2226 0 +2134 2358 0 +2255 2491 0 +2379 2623 0 +2505 2755 0 +2632 2887 0 +2760 3019 0 +2890 3152 0 +3020 3283 0 +3151 3416 0 +3281 3548 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3807 4076 0 +3939 4095 0 +1160 0 949 +1157 0 924 +1157 0 879 +1157 0 813 +1157 0 705 +1157 0 503 +1157 0 0 +1157 0 0 +1157 620 0 +1292 1062 0 +1427 1336 0 +1561 1552 0 +1647 1695 0 +1733 1828 0 +1828 1961 0 +1929 2093 0 +2037 2226 0 +2150 2358 0 +2268 2491 0 +2388 2623 0 +2512 2755 0 +2638 2887 0 +2765 3019 0 +2893 3152 0 +3022 3283 0 +3152 3416 0 +3283 3548 0 +3414 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1295 0 1069 +1292 0 1050 +1292 0 1017 +1292 0 968 +1292 0 894 +1292 0 772 +1292 0 529 +1292 0 0 +1292 0 0 +1292 724 0 +1427 1182 0 +1561 1463 0 +1695 1680 0 +1785 1828 0 +1870 1961 0 +1963 2093 0 +2064 2226 0 +2171 2358 0 +2284 2491 0 +2401 2623 0 +2522 2755 0 +2645 2887 0 +2770 3019 0 +2897 3152 0 +3025 3283 0 +3154 3416 0 +3284 3548 0 +3415 3680 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1192 +1427 0 1178 +1427 0 1153 +1427 0 1118 +1427 0 1065 +1427 0 985 +1427 0 849 +1427 0 562 +1427 0 0 +1427 0 0 +1427 833 0 +1561 1307 0 +1695 1590 0 +1828 1810 0 +1920 1961 0 +2005 2093 0 +2098 2226 0 +2199 2358 0 +2305 2491 0 +2417 2623 0 +2535 2755 0 +2655 2887 0 +2777 3019 0 +2903 3152 0 +3029 3283 0 +3158 3416 0 +3287 3548 0 +3417 3680 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1563 0 1318 +1561 0 1307 +1561 0 1288 +1561 0 1262 +1561 0 1225 +1561 0 1170 +1561 0 1084 +1561 0 935 +1561 0 605 +1561 0 0 +1561 0 0 +1561 948 0 +1695 1432 0 +1828 1719 0 +1961 1940 0 +2056 2093 0 +2140 2226 0 +2232 2358 0 +2332 2491 0 +2439 2623 0 +2551 2755 0 +2667 2887 0 +2787 3019 0 +2910 3152 0 +3035 3283 0 +3162 3416 0 +3290 3548 0 +3419 3680 0 +3549 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1444 +1695 0 1436 +1695 0 1422 +1695 0 1403 +1695 0 1376 +1695 0 1337 +1695 0 1279 +1695 0 1188 +1695 0 1029 +1695 0 653 +1695 0 0 +1695 0 0 +1695 1066 0 +1828 1560 0 +1961 1849 0 +2093 2070 0 +2190 2226 0 +2273 2358 0 +2366 2491 0 +2465 2623 0 +2572 2755 0 +2684 2887 0 +2800 3019 0 +2920 3152 0 +3042 3283 0 +3168 3416 0 +3294 3548 0 +3422 3680 0 +3551 3812 0 +3681 3944 0 +3811 4076 0 +3942 4095 0 +1828 0 1572 +1828 0 1566 +1828 0 1556 +1828 0 1542 +1828 0 1522 +1828 0 1494 +1828 0 1454 +1828 0 1394 +1828 0 1300 +1828 0 1131 +1828 0 713 +1828 0 0 +1828 0 0 +1828 1188 0 +1961 1689 0 +2093 1979 0 +2226 2201 0 +2324 2358 0 +2407 2491 0 +2499 2623 0 +2598 2755 0 +2705 2887 0 +2816 3019 0 +2932 3152 0 +3052 3283 0 +3175 3416 0 +3300 3548 0 +3426 3680 0 +3554 3812 0 +3683 3944 0 +3813 4076 0 +3944 4095 0 +1961 0 1702 +1961 0 1697 +1961 0 1689 +1961 0 1679 +1961 0 1664 +1961 0 1644 +1961 0 1615 +1961 0 1574 +1961 0 1513 +1961 0 1415 +1961 0 1238 +1961 0 780 +1961 0 0 +1961 0 0 +1961 1312 0 +2093 1818 0 +2226 2109 0 +2358 2332 0 +2457 2491 0 +2540 2623 0 +2632 2755 0 +2731 2887 0 +2837 3019 0 +2949 3152 0 +3065 3283 0 +3184 3416 0 +3307 3548 0 +3432 3680 0 +3559 3812 0 +3687 3944 0 +3816 4076 0 +3946 4095 0 +2094 0 1831 +2093 0 1828 +2093 0 1822 +2093 0 1814 +2093 0 1804 +2093 0 1789 +2093 0 1768 +2093 0 1739 +2093 0 1698 +2093 0 1635 +2093 0 1534 +2093 0 1351 +2093 0 859 +2093 0 0 +2093 0 0 +2093 1438 0 +2226 1948 0 +2358 2240 0 +2491 2464 0 +2590 2623 0 +2673 2755 0 +2764 2887 0 +2863 3019 0 +2970 3152 0 +3081 3283 0 +3197 3416 0 +3317 3548 0 +3439 3680 0 +3564 3812 0 +3691 3944 0 +3819 4076 0 +3948 4095 0 +2226 0 1962 +2226 0 1959 +2226 0 1955 +2226 0 1949 +2226 0 1941 +2226 0 1930 +2226 0 1915 +2226 0 1894 +2226 0 1865 +2226 0 1823 +2226 0 1759 +2226 0 1656 +2226 0 1469 +2226 0 944 +2226 0 0 +2226 0 0 +2226 1565 0 +2358 2079 0 +2491 2372 0 +2623 2595 0 +2723 2755 0 +2805 2887 0 +2897 3019 0 +2996 3152 0 +3102 3283 0 +3213 3416 0 +3329 3548 0 +3449 3680 0 +3572 3812 0 +3696 3944 0 +3823 4076 0 +3951 4095 0 +2358 0 2093 +2358 0 2091 +2358 0 2087 +2358 0 2083 +2358 0 2077 +2358 0 2069 +2358 0 2058 +2358 0 2043 +2358 0 2022 +2358 0 1993 +2358 0 1950 +2358 0 1885 +2358 0 1781 +2358 0 1589 +2358 0 1039 +2358 0 0 +2358 0 0 +2358 1694 0 +2491 2210 0 +2623 2503 0 +2755 2727 0 +2855 2887 0 +2938 3019 0 +3029 3152 0 +3128 3283 0 +3234 3416 0 +3346 3548 0 +3462 3680 0 +3581 3812 0 +3704 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2224 +2491 0 2223 +2491 0 2220 +2491 0 2217 +2491 0 2212 +2491 0 2206 +2491 0 2199 +2491 0 2187 +2491 0 2172 +2491 0 2151 +2491 0 2121 +2491 0 2078 +2491 0 2013 +2491 0 1907 +2491 0 1713 +2491 0 1143 +2491 0 0 +2491 0 0 +2491 1824 0 +2623 2341 0 +2755 2635 0 +2887 2859 0 +2987 3019 0 +3070 3152 0 +3162 3283 0 +3261 3416 0 +3367 3548 0 +3478 3680 0 +3594 3812 0 +3713 3944 0 +3836 4076 0 +3961 4095 0 +2623 0 2355 +2623 0 2354 +2623 0 2352 +2623 0 2350 +2623 0 2347 +2623 0 2342 +2623 0 2336 +2623 0 2328 +2623 0 2317 +2623 0 2302 +2623 0 2281 +2623 0 2250 +2623 0 2207 +2623 0 2141 +2623 0 2035 +2623 0 1838 +2623 0 1251 +2623 0 0 +2623 0 0 +2623 1954 0 +2755 2473 0 +2887 2767 0 +3019 2991 0 +3120 3152 0 +3203 3283 0 +3294 3416 0 +3393 3548 0 +3499 3680 0 +3610 3812 0 +3726 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2487 +2755 0 2486 +2755 0 2485 +2755 0 2483 +2755 0 2481 +2755 0 2477 +2755 0 2473 +2755 0 2467 +2755 0 2459 +2755 0 2448 +2755 0 2432 +2755 0 2411 +2755 0 2381 +2755 0 2337 +2755 0 2271 +2755 0 2164 +2755 0 1966 +2755 0 1367 +2755 0 0 +2755 0 0 +2755 2084 0 +2887 2604 0 +3019 2898 0 +3152 3123 0 +3252 3283 0 +3335 3416 0 +3426 3548 0 +3525 3680 0 +3631 3812 0 +3742 3944 0 +3858 4076 0 +3978 4095 0 +2887 0 2619 +2887 0 2618 +2887 0 2617 +2887 0 2616 +2887 0 2614 +2887 0 2612 +2887 0 2608 +2887 0 2604 +2887 0 2598 +2887 0 2589 +2887 0 2578 +2887 0 2563 +2887 0 2542 +2887 0 2511 +2887 0 2467 +2887 0 2401 +2887 0 2294 +2887 0 2094 +2887 0 1483 +2887 0 0 +2887 0 0 +2887 2215 0 +3019 2735 0 +3152 3031 0 +3283 3254 0 +3385 3416 0 +3467 3548 0 +3558 3680 0 +3657 3812 0 +3763 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2750 +3019 0 2750 +3019 0 2749 +3019 0 2748 +3019 0 2747 +3019 0 2745 +3019 0 2742 +3019 0 2739 +3019 0 2735 +3019 0 2729 +3019 0 2720 +3019 0 2709 +3019 0 2694 +3019 0 2672 +3019 0 2642 +3019 0 2598 +3019 0 2531 +3019 0 2424 +3019 0 2222 +3019 0 1602 +3019 0 0 +3019 0 0 +3019 2346 0 +3152 2868 0 +3283 3162 0 +3416 3387 0 +3516 3548 0 +3599 3680 0 +3691 3812 0 +3790 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2883 +3152 0 2882 +3152 0 2881 +3152 0 2881 +3152 0 2880 +3152 0 2878 +3152 0 2877 +3152 0 2874 +3152 0 2871 +3152 0 2866 +3152 0 2860 +3152 0 2852 +3152 0 2841 +3152 0 2825 +3152 0 2804 +3152 0 2773 +3152 0 2729 +3152 0 2663 +3152 0 2555 +3152 0 2353 +3152 0 1726 +3152 0 0 +3152 0 0 +3152 2478 0 +3283 2999 0 +3416 3294 0 +3548 3519 0 +3649 3680 0 +3731 3812 0 +3823 3944 0 +3922 4076 0 +4027 4095 0 +3284 0 3014 +3283 0 3014 +3283 0 3014 +3283 0 3013 +3283 0 3012 +3283 0 3011 +3283 0 3010 +3283 0 3008 +3283 0 3005 +3283 0 3002 +3283 0 2998 +3283 0 2992 +3283 0 2983 +3283 0 2972 +3283 0 2957 +3283 0 2935 +3283 0 2905 +3283 0 2860 +3283 0 2793 +3283 0 2685 +3283 0 2482 +3283 0 1849 +3283 0 0 +3283 0 0 +3283 2609 0 +3416 3132 0 +3548 3426 0 +3680 3651 0 +3781 3812 0 +3864 3944 0 +3955 4076 0 +4054 4095 0 +3416 0 3146 +3416 0 3146 +3416 0 3146 +3416 0 3145 +3416 0 3145 +3416 0 3144 +3416 0 3143 +3416 0 3141 +3416 0 3140 +3416 0 3137 +3416 0 3134 +3416 0 3129 +3416 0 3123 +3416 0 3115 +3416 0 3104 +3416 0 3088 +3416 0 3067 +3416 0 3036 +3416 0 2992 +3416 0 2925 +3416 0 2817 +3416 0 2614 +3416 0 1981 +3416 0 0 +3416 0 0 +3416 2741 0 +3548 3264 0 +3680 3558 0 +3812 3783 0 +3913 3944 0 +3996 4076 0 +4087 4095 0 +3548 0 3278 +3548 0 3278 +3548 0 3278 +3548 0 3278 +3548 0 3277 +3548 0 3277 +3548 0 3276 +3548 0 3275 +3548 0 3273 +3548 0 3272 +3548 0 3269 +3548 0 3266 +3548 0 3261 +3548 0 3255 +3548 0 3247 +3548 0 3236 +3548 0 3220 +3548 0 3199 +3548 0 3168 +3548 0 3124 +3548 0 3057 +3548 0 2948 +3548 0 2745 +3548 0 2107 +3548 0 0 +3548 0 0 +3548 2873 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3409 +3680 0 3409 +3680 0 3408 +3680 0 3408 +3680 0 3407 +3680 0 3405 +3680 0 3403 +3680 0 3401 +3680 0 3398 +3680 0 3393 +3680 0 3387 +3680 0 3379 +3680 0 3368 +3680 0 3352 +3680 0 3331 +3680 0 3300 +3680 0 3256 +3680 0 3188 +3680 0 3080 +3680 0 2877 +3680 0 2239 +3680 0 0 +3680 0 0 +3680 3005 0 +3812 3528 0 +3944 3822 0 +4076 4047 0 +4095 4095 0 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3541 +3812 0 3541 +3812 0 3540 +3812 0 3540 +3812 0 3538 +3812 0 3537 +3812 0 3536 +3812 0 3533 +3812 0 3530 +3812 0 3525 +3812 0 3519 +3812 0 3511 +3812 0 3499 +3812 0 3484 +3812 0 3462 +3812 0 3432 +3812 0 3388 +3812 0 3321 +3812 0 3212 +3812 0 3009 +3812 0 2369 +3812 0 0 +3812 0 0 +3812 3137 0 +3944 3660 0 +4076 3954 0 +4095 4095 0 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3671 +3944 0 3669 +3944 0 3667 +3944 0 3665 +3944 0 3662 +3944 0 3657 +3944 0 3651 +3944 0 3643 +3944 0 3632 +3944 0 3616 +3944 0 3595 +3944 0 3564 +3944 0 3520 +3944 0 3452 +3944 0 3344 +3944 0 3140 +3944 0 2498 +3944 0 0 +3944 0 0 +3944 3269 0 +4076 3792 0 +4095 4087 0 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3803 +4076 0 3801 +4076 0 3799 +4076 0 3797 +4076 0 3793 +4076 0 3789 +4076 0 3783 +4076 0 3775 +4076 0 3763 +4076 0 3748 +4076 0 3726 +4076 0 3696 +4076 0 3651 +4076 0 3584 +4076 0 3475 +4076 0 3272 +4076 0 2627 +4076 0 0 +4076 0 0 +4076 3401 0 +4095 3924 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3933 +4095 0 3932 +4095 0 3929 +4095 0 3926 +4095 0 3921 +4095 0 3915 +4095 0 3907 +4095 0 3896 +4095 0 3880 +4095 0 3859 +4095 0 3828 +4095 0 3784 +4095 0 3717 +4095 0 3608 +4095 0 3404 +4095 0 2762 +4095 0 0 +4095 0 0 +4095 3533 0 +0 201 318 +0 318 300 +0 318 93 +0 466 0 +127 609 0 +334 750 0 +515 888 0 +681 1025 0 +836 1160 0 +985 1295 0 +1130 1429 0 +1271 1563 0 +1410 1696 0 +1547 1828 0 +1682 1961 0 +1817 2094 0 +1951 2226 0 +2085 2358 0 +2218 2491 0 +2351 2623 0 +2484 2755 0 +2616 2887 0 +2748 3019 0 +2881 3152 0 +3013 3284 0 +3145 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 13 318 +86 229 295 +86 295 174 +145 450 15 +303 598 0 +453 741 0 +599 882 0 +740 1020 0 +879 1157 0 +1017 1292 0 +1153 1427 0 +1288 1561 0 +1422 1695 0 +1556 1828 0 +1689 1961 0 +1822 2093 0 +1955 2226 0 +2087 2358 0 +2220 2491 0 +2352 2623 0 +2485 2755 0 +2617 2887 0 +2749 3019 0 +2881 3152 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +93 0 318 +174 86 295 +264 264 264 +361 427 218 +466 582 148 +576 730 34 +691 873 0 +810 1014 0 +932 1152 0 +1056 1289 0 +1182 1424 0 +1310 1559 0 +1439 1693 0 +1568 1827 0 +1699 1960 0 +1829 2093 0 +1960 2225 0 +2091 2358 0 +2223 2490 0 +2355 2623 0 +2486 2755 0 +2618 2887 0 +2750 3019 0 +2882 3152 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +388 0 466 +432 15 450 +427 218 361 +427 306 218 +582 564 148 +683 730 34 +776 873 0 +877 1014 0 +984 1152 0 +1096 1289 0 +1213 1424 0 +1333 1559 0 +1456 1693 0 +1582 1827 0 +1708 1960 0 +1837 2093 0 +1966 2225 0 +2096 2358 0 +2226 2490 0 +2357 2623 0 +2488 2755 0 +2620 2887 0 +2751 3019 0 +2883 3152 0 +3014 3283 0 +3147 3416 0 +3279 3548 0 +3410 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +609 0 606 +598 0 551 +582 148 466 +582 148 277 +582 357 148 +730 652 34 +870 873 0 +954 1014 0 +1045 1152 0 +1145 1289 0 +1251 1424 0 +1363 1559 0 +1479 1693 0 +1599 1827 0 +1722 1960 0 +1847 2093 0 +1973 2225 0 +2101 2358 0 +2230 2490 0 +2360 2623 0 +2491 2755 0 +2621 2887 0 +2752 3019 0 +2884 3152 0 +3015 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +750 0 689 +741 0 644 +730 34 576 +730 34 435 +730 34 132 +730 418 34 +873 749 0 +1014 987 0 +1117 1152 0 +1203 1289 0 +1298 1424 0 +1400 1559 0 +1508 1693 0 +1621 1827 0 +1739 1960 0 +1860 2093 0 +1983 2225 0 +2109 2358 0 +2236 2490 0 +2364 2623 0 +2494 2755 0 +2624 2887 0 +2754 3019 0 +2885 3152 0 +3016 3283 0 +3148 3416 0 +3280 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +888 0 781 +882 0 745 +873 0 691 +873 0 585 +873 0 390 +873 0 0 +873 488 0 +1014 852 0 +1152 1102 0 +1271 1289 0 +1353 1424 0 +1445 1559 0 +1544 1693 0 +1650 1827 0 +1761 1960 0 +1877 2093 0 +1996 2225 0 +2119 2358 0 +2243 2490 0 +2370 2623 0 +2498 2755 0 +2627 2887 0 +2757 3019 0 +2887 3152 0 +3018 3283 0 +3149 3416 0 +3280 3548 0 +3412 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1025 0 881 +1020 0 852 +1014 0 810 +1014 0 731 +1014 0 598 +1014 0 323 +1014 0 0 +1014 568 0 +1152 960 0 +1289 1221 0 +1418 1424 0 +1499 1559 0 +1588 1693 0 +1684 1827 0 +1789 1960 0 +1898 2093 0 +2013 2225 0 +2132 2358 0 +2253 2490 0 +2378 2623 0 +2504 2755 0 +2631 2887 0 +2760 3019 0 +2890 3152 0 +3019 3283 0 +3150 3416 0 +3281 3548 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3807 4076 0 +3939 4095 0 +1160 0 987 +1157 0 964 +1152 0 932 +1152 0 873 +1152 0 779 +1152 0 614 +1152 0 214 +1152 0 0 +1152 656 0 +1289 1075 0 +1424 1343 0 +1559 1556 0 +1640 1693 0 +1727 1827 0 +1823 1960 0 +1926 2093 0 +2034 2225 0 +2148 2358 0 +2266 2490 0 +2387 2623 0 +2511 2755 0 +2637 2887 0 +2764 3019 0 +2893 3152 0 +3022 3283 0 +3152 3416 0 +3282 3548 0 +3414 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1295 0 1099 +1292 0 1081 +1289 0 1056 +1289 0 1012 +1289 0 945 +1289 0 837 +1289 0 635 +1289 0 9 +1289 0 0 +1289 753 0 +1424 1193 0 +1559 1468 0 +1693 1683 0 +1779 1827 0 +1865 1960 0 +1960 2093 0 +2061 2225 0 +2169 2358 0 +2283 2490 0 +2400 2623 0 +2521 2755 0 +2644 2887 0 +2770 3019 0 +2897 3152 0 +3025 3283 0 +3154 3416 0 +3284 3548 0 +3415 3680 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1215 +1427 0 1201 +1424 0 1182 +1424 0 1149 +1424 0 1101 +1424 0 1027 +1424 0 904 +1424 0 662 +1424 0 0 +1424 0 0 +1424 856 0 +1559 1315 0 +1693 1594 0 +1827 1812 0 +1917 1960 0 +2002 2093 0 +2095 2225 0 +2196 2358 0 +2304 2490 0 +2416 2623 0 +2533 2755 0 +2654 2887 0 +2777 3019 0 +2903 3152 0 +3029 3283 0 +3157 3416 0 +3287 3548 0 +3417 3680 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1563 0 1335 +1561 0 1325 +1559 0 1310 +1559 0 1285 +1559 0 1250 +1559 0 1198 +1559 0 1118 +1559 0 981 +1559 0 696 +1559 0 0 +1559 0 0 +1559 966 0 +1693 1439 0 +1827 1722 0 +1960 1941 0 +2053 2093 0 +2137 2225 0 +2230 2358 0 +2331 2490 0 +2437 2623 0 +2550 2755 0 +2667 2887 0 +2787 3019 0 +2910 3152 0 +3035 3283 0 +3162 3416 0 +3290 3548 0 +3419 3680 0 +3549 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1457 +1695 0 1450 +1693 0 1439 +1693 0 1420 +1693 0 1394 +1693 0 1357 +1693 0 1302 +1693 0 1216 +1693 0 1067 +1693 0 736 +1693 0 0 +1693 0 0 +1693 1080 0 +1827 1565 0 +1960 1851 0 +2093 2071 0 +2188 2225 0 +2271 2358 0 +2364 2490 0 +2464 2623 0 +2571 2755 0 +2683 2887 0 +2799 3019 0 +2919 3152 0 +3042 3283 0 +3167 3416 0 +3294 3548 0 +3422 3680 0 +3551 3812 0 +3681 3944 0 +3811 4076 0 +3942 4095 0 +1828 0 1582 +1828 0 1576 +1827 0 1568 +1827 0 1554 +1827 0 1535 +1827 0 1508 +1827 0 1469 +1827 0 1412 +1827 0 1321 +1827 0 1161 +1827 0 786 +1827 0 0 +1827 0 0 +1827 1198 0 +1960 1692 0 +2093 1981 0 +2225 2202 0 +2322 2358 0 +2406 2490 0 +2498 2623 0 +2598 2755 0 +2704 2887 0 +2816 3019 0 +2932 3152 0 +3052 3283 0 +3175 3416 0 +3300 3548 0 +3426 3680 0 +3554 3812 0 +3683 3944 0 +3813 4076 0 +3944 4095 0 +1961 0 1709 +1961 0 1705 +1960 0 1699 +1960 0 1688 +1960 0 1674 +1960 0 1654 +1960 0 1626 +1960 0 1586 +1960 0 1526 +1960 0 1431 +1960 0 1263 +1960 0 844 +1960 0 0 +1960 0 0 +1960 1320 0 +2093 1821 0 +2225 2111 0 +2358 2333 0 +2456 2490 0 +2539 2623 0 +2631 2755 0 +2731 2887 0 +2836 3019 0 +2948 3152 0 +3064 3283 0 +3184 3416 0 +3307 3548 0 +3432 3680 0 +3559 3812 0 +3687 3944 0 +3816 4076 0 +3945 4095 0 +2094 0 1837 +2093 0 1834 +2093 0 1829 +2093 0 1821 +2093 0 1811 +2093 0 1796 +2093 0 1776 +2093 0 1748 +2093 0 1706 +2093 0 1645 +2093 0 1547 +2093 0 1370 +2093 0 913 +2093 0 0 +2093 0 0 +2093 1444 0 +2225 1950 0 +2358 2241 0 +2490 2464 0 +2589 2623 0 +2672 2755 0 +2764 2887 0 +2863 3019 0 +2969 3152 0 +3081 3283 0 +3197 3416 0 +3317 3548 0 +3439 3680 0 +3564 3812 0 +3691 3944 0 +3819 4076 0 +3948 4095 0 +2226 0 1966 +2226 0 1963 +2225 0 1960 +2225 0 1954 +2225 0 1946 +2225 0 1936 +2225 0 1921 +2225 0 1900 +2225 0 1871 +2225 0 1829 +2225 0 1767 +2225 0 1666 +2225 0 1484 +2225 0 990 +2225 0 0 +2225 0 0 +2225 1570 0 +2358 2080 0 +2490 2373 0 +2623 2596 0 +2722 2755 0 +2805 2887 0 +2896 3019 0 +2996 3152 0 +3101 3283 0 +3213 3416 0 +3329 3548 0 +3449 3680 0 +3572 3812 0 +3696 3944 0 +3823 4076 0 +3951 4095 0 +2358 0 2096 +2358 0 2094 +2358 0 2091 +2358 0 2087 +2358 0 2081 +2358 0 2073 +2358 0 2062 +2358 0 2047 +2358 0 2027 +2358 0 1997 +2358 0 1955 +2358 0 1891 +2358 0 1788 +2358 0 1600 +2358 0 1076 +2358 0 0 +2358 0 0 +2358 1698 0 +2490 2211 0 +2623 2504 0 +2755 2728 0 +2855 2887 0 +2938 3019 0 +3029 3152 0 +3128 3283 0 +3234 3416 0 +3346 3548 0 +3462 3680 0 +3581 3812 0 +3704 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2226 +2491 0 2225 +2490 0 2223 +2490 0 2220 +2490 0 2215 +2490 0 2209 +2490 0 2202 +2490 0 2190 +2490 0 2175 +2490 0 2154 +2490 0 2125 +2490 0 2082 +2490 0 2017 +2490 0 1913 +2490 0 1722 +2490 0 1173 +2490 0 0 +2490 0 0 +2490 1826 0 +2623 2342 0 +2755 2636 0 +2887 2859 0 +2987 3019 0 +3070 3152 0 +3161 3283 0 +3260 3416 0 +3366 3548 0 +3478 3680 0 +3594 3812 0 +3713 3944 0 +3836 4076 0 +3961 4095 0 +2623 0 2357 +2623 0 2356 +2623 0 2355 +2623 0 2352 +2623 0 2349 +2623 0 2345 +2623 0 2338 +2623 0 2331 +2623 0 2320 +2623 0 2304 +2623 0 2283 +2623 0 2253 +2623 0 2210 +2623 0 2144 +2623 0 2039 +2623 0 1845 +2623 0 1275 +2623 0 0 +2623 0 0 +2623 1956 0 +2755 2474 0 +2887 2767 0 +3019 2991 0 +3120 3152 0 +3202 3283 0 +3294 3416 0 +3393 3548 0 +3499 3680 0 +3610 3812 0 +3726 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2488 +2755 0 2488 +2755 0 2486 +2755 0 2485 +2755 0 2482 +2755 0 2479 +2755 0 2475 +2755 0 2469 +2755 0 2460 +2755 0 2449 +2755 0 2434 +2755 0 2413 +2755 0 2383 +2755 0 2339 +2755 0 2274 +2755 0 2167 +2755 0 1971 +2755 0 1386 +2755 0 0 +2755 0 0 +2755 2086 0 +2887 2605 0 +3019 2898 0 +3152 3123 0 +3252 3283 0 +3335 3416 0 +3426 3548 0 +3525 3680 0 +3631 3812 0 +3742 3944 0 +3858 4076 0 +3978 4095 0 +2887 0 2620 +2887 0 2619 +2887 0 2618 +2887 0 2617 +2887 0 2615 +2887 0 2613 +2887 0 2609 +2887 0 2605 +2887 0 2599 +2887 0 2591 +2887 0 2580 +2887 0 2564 +2887 0 2543 +2887 0 2513 +2887 0 2469 +2887 0 2403 +2887 0 2296 +2887 0 2098 +2887 0 1497 +2887 0 0 +2887 0 0 +2887 2217 0 +3019 2736 0 +3152 3031 0 +3283 3255 0 +3384 3416 0 +3467 3548 0 +3558 3680 0 +3657 3812 0 +3763 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2751 +3019 0 2751 +3019 0 2750 +3019 0 2749 +3019 0 2747 +3019 0 2746 +3019 0 2743 +3019 0 2740 +3019 0 2735 +3019 0 2729 +3019 0 2721 +3019 0 2710 +3019 0 2695 +3019 0 2673 +3019 0 2643 +3019 0 2599 +3019 0 2533 +3019 0 2426 +3019 0 2225 +3019 0 1613 +3019 0 0 +3019 0 0 +3019 2347 0 +3152 2869 0 +3283 3163 0 +3416 3387 0 +3516 3548 0 +3599 3680 0 +3690 3812 0 +3790 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2883 +3152 0 2883 +3152 0 2882 +3152 0 2881 +3152 0 2880 +3152 0 2879 +3152 0 2877 +3152 0 2875 +3152 0 2871 +3152 0 2867 +3152 0 2861 +3152 0 2853 +3152 0 2842 +3152 0 2826 +3152 0 2805 +3152 0 2774 +3152 0 2730 +3152 0 2664 +3152 0 2556 +3152 0 2355 +3152 0 1735 +3152 0 0 +3152 0 0 +3152 2479 0 +3283 2999 0 +3416 3294 0 +3548 3519 0 +3649 3680 0 +3731 3812 0 +3823 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3014 +3283 0 3014 +3283 0 3014 +3283 0 3013 +3283 0 3013 +3283 0 3011 +3283 0 3010 +3283 0 3008 +3283 0 3006 +3283 0 3002 +3283 0 2998 +3283 0 2992 +3283 0 2984 +3283 0 2973 +3283 0 2957 +3283 0 2936 +3283 0 2905 +3283 0 2861 +3283 0 2794 +3283 0 2686 +3283 0 2484 +3283 0 1856 +3283 0 0 +3283 0 0 +3283 2610 0 +3416 3132 0 +3548 3427 0 +3680 3651 0 +3781 3812 0 +3863 3944 0 +3955 4076 0 +4054 4095 0 +3416 0 3147 +3416 0 3146 +3416 0 3146 +3416 0 3146 +3416 0 3145 +3416 0 3144 +3416 0 3143 +3416 0 3142 +3416 0 3140 +3416 0 3138 +3416 0 3134 +3416 0 3130 +3416 0 3124 +3416 0 3115 +3416 0 3104 +3416 0 3089 +3416 0 3067 +3416 0 3037 +3416 0 2992 +3416 0 2926 +3416 0 2817 +3416 0 2615 +3416 0 1986 +3416 0 0 +3416 0 0 +3416 2742 0 +3548 3264 0 +3680 3559 0 +3812 3783 0 +3913 3944 0 +3996 4076 0 +4087 4095 0 +3548 0 3279 +3548 0 3278 +3548 0 3278 +3548 0 3278 +3548 0 3277 +3548 0 3277 +3548 0 3276 +3548 0 3275 +3548 0 3274 +3548 0 3272 +3548 0 3269 +3548 0 3266 +3548 0 3261 +3548 0 3256 +3548 0 3247 +3548 0 3236 +3548 0 3221 +3548 0 3199 +3548 0 3168 +3548 0 3124 +3548 0 3057 +3548 0 2949 +3548 0 2746 +3548 0 2111 +3548 0 0 +3548 0 0 +3548 2873 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3409 +3680 0 3409 +3680 0 3408 +3680 0 3407 +3680 0 3405 +3680 0 3404 +3680 0 3401 +3680 0 3398 +3680 0 3393 +3680 0 3387 +3680 0 3379 +3680 0 3368 +3680 0 3353 +3680 0 3331 +3680 0 3300 +3680 0 3256 +3680 0 3189 +3680 0 3081 +3680 0 2877 +3680 0 2242 +3680 0 0 +3680 0 0 +3680 3005 0 +3812 3528 0 +3944 3822 0 +4076 4047 0 +4095 4095 0 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3541 +3812 0 3541 +3812 0 3541 +3812 0 3540 +3812 0 3539 +3812 0 3537 +3812 0 3536 +3812 0 3533 +3812 0 3530 +3812 0 3525 +3812 0 3519 +3812 0 3511 +3812 0 3500 +3812 0 3484 +3812 0 3463 +3812 0 3432 +3812 0 3388 +3812 0 3321 +3812 0 3212 +3812 0 3009 +3812 0 2371 +3812 0 0 +3812 0 0 +3812 3137 0 +3944 3660 0 +4076 3954 0 +4095 4095 0 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3673 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3669 +3944 0 3668 +3944 0 3665 +3944 0 3662 +3944 0 3657 +3944 0 3651 +3944 0 3643 +3944 0 3632 +3944 0 3616 +3944 0 3595 +3944 0 3564 +3944 0 3520 +3944 0 3453 +3944 0 3344 +3944 0 3140 +3944 0 2500 +3944 0 0 +3944 0 0 +3944 3269 0 +4076 3792 0 +4095 4087 0 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3803 +4076 0 3801 +4076 0 3799 +4076 0 3797 +4076 0 3793 +4076 0 3789 +4076 0 3783 +4076 0 3775 +4076 0 3763 +4076 0 3748 +4076 0 3726 +4076 0 3696 +4076 0 3651 +4076 0 3585 +4076 0 3476 +4076 0 3272 +4076 0 2628 +4076 0 0 +4076 0 0 +4076 3401 0 +4095 3924 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3933 +4095 0 3932 +4095 0 3929 +4095 0 3926 +4095 0 3921 +4095 0 3915 +4095 0 3907 +4095 0 3896 +4095 0 3880 +4095 0 3859 +4095 0 3828 +4095 0 3784 +4095 0 3717 +4095 0 3608 +4095 0 3404 +4095 0 2762 +4095 0 0 +4095 0 0 +4095 3533 0 +0 312 466 +0 419 466 +0 466 388 +0 466 154 +0 609 0 +59 750 0 +350 888 0 +573 1025 0 +762 1160 0 +934 1295 0 +1092 1429 0 +1244 1563 0 +1390 1696 0 +1532 1828 0 +1672 1961 0 +1809 2094 0 +1945 2226 0 +2080 2358 0 +2215 2491 0 +2348 2623 0 +2482 2755 0 +2615 2887 0 +2747 3019 0 +2880 3152 0 +3012 3284 0 +3145 3416 0 +3277 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 171 466 +15 333 450 +15 450 432 +15 450 225 +0 598 0 +258 741 0 +466 882 0 +647 1020 0 +813 1157 0 +968 1292 0 +1118 1427 0 +1262 1561 0 +1403 1695 0 +1542 1828 0 +1679 1961 0 +1814 2093 0 +1949 2226 0 +2083 2358 0 +2217 2491 0 +2350 2623 0 +2483 2755 0 +2616 2887 0 +2748 3019 0 +2881 3152 0 +3013 3283 0 +3145 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 0 466 +15 145 450 +218 361 427 +218 427 306 +277 582 148 +435 730 34 +585 873 0 +731 1014 0 +873 1152 0 +1012 1289 0 +1149 1424 0 +1285 1559 0 +1420 1693 0 +1554 1827 0 +1688 1960 0 +1821 2093 0 +1954 2225 0 +2087 2358 0 +2220 2490 0 +2352 2623 0 +2485 2755 0 +2617 2887 0 +2749 3019 0 +2881 3152 0 +3013 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +154 0 466 +225 15 450 +306 218 427 +396 396 396 +494 560 350 +598 714 280 +708 862 166 +823 1005 0 +942 1146 0 +1064 1284 0 +1188 1421 0 +1315 1557 0 +1442 1691 0 +1571 1825 0 +1700 1959 0 +1830 2092 0 +1961 2225 0 +2092 2357 0 +2223 2490 0 +2355 2622 0 +2487 2755 0 +2619 2887 0 +2750 3019 0 +2882 3151 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +485 0 609 +520 0 598 +564 148 582 +560 350 494 +560 438 350 +714 696 280 +815 862 166 +908 1005 0 +1009 1146 0 +1116 1284 0 +1228 1421 0 +1345 1557 0 +1465 1691 0 +1588 1825 0 +1714 1959 0 +1841 2092 0 +1969 2225 0 +2098 2357 0 +2228 2490 0 +2358 2622 0 +2489 2755 0 +2620 2887 0 +2751 3019 0 +2883 3151 0 +3015 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +723 0 750 +741 0 738 +730 34 683 +714 280 598 +714 280 409 +714 490 280 +862 784 166 +1002 1005 0 +1086 1146 0 +1177 1284 0 +1277 1421 0 +1384 1557 0 +1495 1691 0 +1611 1825 0 +1731 1959 0 +1854 2092 0 +1979 2225 0 +2105 2357 0 +2234 2490 0 +2362 2622 0 +2492 2755 0 +2623 2887 0 +2753 3019 0 +2885 3151 0 +3016 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +888 0 852 +882 0 822 +873 0 776 +862 166 708 +862 166 567 +862 166 264 +862 550 166 +1005 881 0 +1146 1119 0 +1249 1284 0 +1335 1421 0 +1430 1557 0 +1532 1691 0 +1640 1825 0 +1754 1959 0 +1871 2092 0 +1992 2225 0 +2115 2357 0 +2241 2490 0 +2368 2622 0 +2497 2755 0 +2626 2887 0 +2756 3019 0 +2886 3151 0 +3017 3283 0 +3148 3416 0 +3280 3548 0 +3412 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1025 0 939 +1020 0 914 +1014 0 877 +1005 0 823 +1005 0 717 +1005 0 523 +1005 0 0 +1005 620 0 +1146 983 0 +1284 1235 0 +1403 1421 0 +1486 1557 0 +1577 1691 0 +1676 1825 0 +1781 1959 0 +1893 2092 0 +2009 2225 0 +2128 2357 0 +2251 2490 0 +2375 2622 0 +2502 2755 0 +2630 2887 0 +2759 3019 0 +2889 3151 0 +3019 3283 0 +3150 3416 0 +3281 3548 0 +3412 3680 0 +3544 3812 0 +3676 3944 0 +3807 4076 0 +3939 4095 0 +1160 0 1033 +1157 0 1013 +1152 0 984 +1146 0 942 +1146 0 863 +1146 0 730 +1146 0 455 +1146 0 0 +1146 700 0 +1284 1093 0 +1421 1353 0 +1551 1557 0 +1631 1691 0 +1720 1825 0 +1817 1959 0 +1920 2092 0 +2030 2225 0 +2145 2357 0 +2264 2490 0 +2385 2622 0 +2510 2755 0 +2636 2887 0 +2763 3019 0 +2892 3151 0 +3021 3283 0 +3151 3416 0 +3282 3548 0 +3413 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1295 0 1135 +1292 0 1119 +1289 0 1096 +1284 0 1064 +1284 0 1005 +1284 0 911 +1284 0 746 +1284 0 346 +1284 0 0 +1284 788 0 +1421 1207 0 +1557 1476 0 +1691 1688 0 +1772 1825 0 +1860 1959 0 +1955 2092 0 +2058 2225 0 +2166 2357 0 +2280 2490 0 +2398 2622 0 +2520 2755 0 +2643 2887 0 +2769 3019 0 +2896 3151 0 +3025 3283 0 +3154 3416 0 +3284 3548 0 +3415 3680 0 +3545 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1244 +1427 0 1231 +1424 0 1213 +1421 0 1188 +1421 0 1144 +1421 0 1077 +1421 0 969 +1421 0 767 +1421 0 141 +1421 0 0 +1421 885 0 +1557 1326 0 +1691 1600 0 +1825 1816 0 +1911 1959 0 +1997 2092 0 +2092 2225 0 +2193 2357 0 +2302 2490 0 +2414 2622 0 +2532 2755 0 +2653 2887 0 +2776 3019 0 +2902 3151 0 +3029 3283 0 +3157 3416 0 +3286 3548 0 +3416 3680 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1563 0 1357 +1561 0 1347 +1559 0 1333 +1557 0 1315 +1557 0 1281 +1557 0 1233 +1557 0 1159 +1557 0 1037 +1557 0 794 +1557 0 0 +1557 0 0 +1557 988 0 +1691 1447 0 +1825 1727 0 +1959 1944 0 +2049 2092 0 +2134 2225 0 +2228 2357 0 +2329 2490 0 +2436 2622 0 +2549 2755 0 +2666 2887 0 +2786 3019 0 +2909 3151 0 +3034 3283 0 +3161 3416 0 +3290 3548 0 +3419 3680 0 +3549 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1475 +1695 0 1467 +1693 0 1456 +1691 0 1442 +1691 0 1417 +1691 0 1382 +1691 0 1330 +1691 0 1249 +1691 0 1113 +1691 0 827 +1691 0 0 +1691 0 0 +1691 1098 0 +1825 1571 0 +1959 1854 0 +2092 2073 0 +2185 2225 0 +2269 2357 0 +2362 2490 0 +2463 2622 0 +2570 2755 0 +2682 2887 0 +2798 3019 0 +2919 3151 0 +3042 3283 0 +3167 3416 0 +3294 3548 0 +3422 3680 0 +3551 3812 0 +3681 3944 0 +3811 4076 0 +3942 4095 0 +1828 0 1596 +1828 0 1590 +1827 0 1582 +1825 0 1571 +1825 0 1552 +1825 0 1526 +1825 0 1489 +1825 0 1434 +1825 0 1348 +1825 0 1199 +1825 0 869 +1825 0 0 +1825 0 0 +1825 1212 0 +1959 1697 0 +2092 1983 0 +2225 2203 0 +2320 2357 0 +2404 2490 0 +2496 2622 0 +2596 2755 0 +2703 2887 0 +2815 3019 0 +2932 3151 0 +3051 3283 0 +3174 3416 0 +3299 3548 0 +3426 3680 0 +3554 3812 0 +3683 3944 0 +3813 4076 0 +3944 4095 0 +1961 0 1719 +1961 0 1715 +1960 0 1708 +1959 0 1700 +1959 0 1686 +1959 0 1667 +1959 0 1640 +1959 0 1601 +1959 0 1544 +1959 0 1453 +1959 0 1294 +1959 0 917 +1959 0 0 +1959 0 0 +1959 1331 0 +2092 1824 0 +2225 2112 0 +2357 2334 0 +2454 2490 0 +2538 2622 0 +2630 2755 0 +2730 2887 0 +2836 3019 0 +2948 3151 0 +3064 3283 0 +3184 3416 0 +3307 3548 0 +3432 3680 0 +3558 3812 0 +3686 3944 0 +3815 4076 0 +3945 4095 0 +2094 0 1845 +2093 0 1841 +2093 0 1837 +2092 0 1830 +2092 0 1820 +2092 0 1806 +2092 0 1786 +2092 0 1758 +2092 0 1718 +2092 0 1658 +2092 0 1564 +2092 0 1394 +2092 0 977 +2092 0 0 +2092 0 0 +2092 1452 0 +2225 1953 0 +2357 2243 0 +2490 2465 0 +2588 2622 0 +2671 2755 0 +2763 2887 0 +2863 3019 0 +2969 3151 0 +3080 3283 0 +3196 3416 0 +3316 3548 0 +3439 3680 0 +3564 3812 0 +3691 3944 0 +3818 4076 0 +3948 4095 0 +2226 0 1972 +2226 0 1969 +2225 0 1966 +2225 0 1961 +2225 0 1953 +2225 0 1943 +2225 0 1928 +2225 0 1908 +2225 0 1880 +2225 0 1839 +2225 0 1777 +2225 0 1679 +2225 0 1503 +2225 0 1044 +2225 0 0 +2225 0 0 +2225 1576 0 +2357 2082 0 +2490 2374 0 +2622 2596 0 +2721 2755 0 +2804 2887 0 +2896 3019 0 +2995 3151 0 +3101 3283 0 +3213 3416 0 +3329 3548 0 +3449 3680 0 +3571 3812 0 +3696 3944 0 +3823 4076 0 +3951 4095 0 +2358 0 2100 +2358 0 2098 +2358 0 2096 +2357 0 2092 +2357 0 2086 +2357 0 2078 +2357 0 2068 +2357 0 2053 +2357 0 2032 +2357 0 2004 +2357 0 1962 +2357 0 1899 +2357 0 1798 +2357 0 1615 +2357 0 1122 +2357 0 0 +2357 0 0 +2357 1702 0 +2490 2213 0 +2622 2505 0 +2755 2728 0 +2854 2887 0 +2937 3019 0 +3029 3151 0 +3128 3283 0 +3234 3416 0 +3345 3548 0 +3461 3680 0 +3581 3812 0 +3703 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2230 +2491 0 2228 +2490 0 2226 +2490 0 2223 +2490 0 2219 +2490 0 2213 +2490 0 2206 +2490 0 2195 +2490 0 2180 +2490 0 2159 +2490 0 2129 +2490 0 2087 +2490 0 2023 +2490 0 1920 +2490 0 1733 +2490 0 1210 +2490 0 0 +2490 0 0 +2490 1830 0 +2622 2343 0 +2755 2636 0 +2887 2860 0 +2987 3019 0 +3070 3151 0 +3161 3283 0 +3260 3416 0 +3366 3548 0 +3478 3680 0 +3594 3812 0 +3713 3944 0 +3836 4076 0 +3961 4095 0 +2623 0 2359 +2623 0 2358 +2623 0 2357 +2622 0 2355 +2622 0 2352 +2622 0 2347 +2622 0 2341 +2622 0 2334 +2622 0 2323 +2622 0 2308 +2622 0 2287 +2622 0 2256 +2622 0 2214 +2622 0 2149 +2622 0 2045 +2622 0 1853 +2622 0 1304 +2622 0 0 +2622 0 0 +2622 1958 0 +2755 2475 0 +2887 2768 0 +3019 2991 0 +3119 3151 0 +3202 3283 0 +3293 3416 0 +3393 3548 0 +3499 3680 0 +3610 3812 0 +3726 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2490 +2755 0 2489 +2755 0 2488 +2755 0 2487 +2755 0 2484 +2755 0 2481 +2755 0 2477 +2755 0 2471 +2755 0 2463 +2755 0 2452 +2755 0 2436 +2755 0 2415 +2755 0 2386 +2755 0 2342 +2755 0 2277 +2755 0 2172 +2755 0 1977 +2755 0 1409 +2755 0 0 +2755 0 0 +2755 2088 0 +2887 2605 0 +3019 2899 0 +3151 3123 0 +3252 3283 0 +3335 3416 0 +3426 3548 0 +3525 3680 0 +3631 3812 0 +3742 3944 0 +3858 4076 0 +3978 4095 0 +2887 0 2621 +2887 0 2620 +2887 0 2620 +2887 0 2619 +2887 0 2617 +2887 0 2614 +2887 0 2611 +2887 0 2607 +2887 0 2601 +2887 0 2592 +2887 0 2581 +2887 0 2566 +2887 0 2545 +2887 0 2515 +2887 0 2471 +2887 0 2406 +2887 0 2299 +2887 0 2103 +2887 0 1516 +2887 0 0 +2887 0 0 +2887 2218 0 +3019 2736 0 +3151 3031 0 +3283 3255 0 +3384 3416 0 +3467 3548 0 +3558 3680 0 +3657 3812 0 +3763 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2752 +3019 0 2752 +3019 0 2751 +3019 0 2750 +3019 0 2749 +3019 0 2747 +3019 0 2745 +3019 0 2741 +3019 0 2737 +3019 0 2731 +3019 0 2723 +3019 0 2712 +3019 0 2696 +3019 0 2675 +3019 0 2645 +3019 0 2601 +3019 0 2535 +3019 0 2428 +3019 0 2229 +3019 0 1628 +3019 0 0 +3019 0 0 +3019 2348 0 +3151 2869 0 +3283 3163 0 +3416 3387 0 +3516 3548 0 +3599 3680 0 +3690 3812 0 +3790 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2884 +3152 0 2883 +3152 0 2883 +3151 0 2882 +3151 0 2881 +3151 0 2880 +3151 0 2878 +3151 0 2876 +3151 0 2872 +3151 0 2868 +3151 0 2862 +3151 0 2854 +3151 0 2842 +3151 0 2827 +3151 0 2806 +3151 0 2775 +3151 0 2732 +3151 0 2665 +3151 0 2558 +3151 0 2358 +3151 0 1746 +3151 0 0 +3151 0 0 +3151 2480 0 +3283 2999 0 +3416 3294 0 +3548 3519 0 +3649 3680 0 +3731 3812 0 +3822 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3015 +3283 0 3015 +3283 0 3014 +3283 0 3014 +3283 0 3013 +3283 0 3012 +3283 0 3011 +3283 0 3009 +3283 0 3007 +3283 0 3003 +3283 0 2999 +3283 0 2993 +3283 0 2985 +3283 0 2973 +3283 0 2958 +3283 0 2936 +3283 0 2906 +3283 0 2862 +3283 0 2795 +3283 0 2688 +3283 0 2486 +3283 0 1864 +3283 0 0 +3283 0 0 +3283 2611 0 +3416 3132 0 +3548 3427 0 +3680 3651 0 +3781 3812 0 +3863 3944 0 +3955 4076 0 +4054 4095 0 +3416 0 3147 +3416 0 3147 +3416 0 3147 +3416 0 3146 +3416 0 3146 +3416 0 3145 +3416 0 3144 +3416 0 3142 +3416 0 3141 +3416 0 3138 +3416 0 3135 +3416 0 3130 +3416 0 3124 +3416 0 3116 +3416 0 3105 +3416 0 3089 +3416 0 3068 +3416 0 3038 +3416 0 2993 +3416 0 2927 +3416 0 2818 +3416 0 2617 +3416 0 1992 +3416 0 0 +3416 0 0 +3416 2742 0 +3548 3264 0 +3680 3559 0 +3812 3783 0 +3913 3944 0 +3995 4076 0 +4087 4095 0 +3548 0 3279 +3548 0 3279 +3548 0 3279 +3548 0 3278 +3548 0 3278 +3548 0 3277 +3548 0 3277 +3548 0 3275 +3548 0 3274 +3548 0 3272 +3548 0 3270 +3548 0 3267 +3548 0 3262 +3548 0 3256 +3548 0 3248 +3548 0 3237 +3548 0 3221 +3548 0 3200 +3548 0 3169 +3548 0 3125 +3548 0 3058 +3548 0 2950 +3548 0 2747 +3548 0 2115 +3548 0 0 +3548 0 0 +3548 2874 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3411 +3680 0 3411 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3410 +3680 0 3409 +3680 0 3408 +3680 0 3407 +3680 0 3406 +3680 0 3404 +3680 0 3401 +3680 0 3398 +3680 0 3394 +3680 0 3388 +3680 0 3379 +3680 0 3368 +3680 0 3353 +3680 0 3331 +3680 0 3301 +3680 0 3256 +3680 0 3189 +3680 0 3081 +3680 0 2878 +3680 0 2246 +3680 0 0 +3680 0 0 +3680 3006 0 +3812 3528 0 +3944 3823 0 +4076 4047 0 +4095 4095 0 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3542 +3812 0 3542 +3812 0 3541 +3812 0 3541 +3812 0 3540 +3812 0 3539 +3812 0 3538 +3812 0 3536 +3812 0 3533 +3812 0 3530 +3812 0 3526 +3812 0 3520 +3812 0 3511 +3812 0 3500 +3812 0 3485 +3812 0 3463 +3812 0 3432 +3812 0 3388 +3812 0 3321 +3812 0 3213 +3812 0 3010 +3812 0 2374 +3812 0 0 +3812 0 0 +3812 3138 0 +3944 3660 0 +4076 3954 0 +4095 4095 0 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3669 +3944 0 3668 +3944 0 3665 +3944 0 3662 +3944 0 3657 +3944 0 3651 +3944 0 3643 +3944 0 3632 +3944 0 3616 +3944 0 3595 +3944 0 3564 +3944 0 3520 +3944 0 3453 +3944 0 3344 +3944 0 3141 +3944 0 2502 +3944 0 0 +3944 0 0 +3944 3269 0 +4076 3792 0 +4095 4087 0 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3801 +4076 0 3799 +4076 0 3797 +4076 0 3794 +4076 0 3789 +4076 0 3783 +4076 0 3775 +4076 0 3764 +4076 0 3748 +4076 0 3727 +4076 0 3696 +4076 0 3652 +4076 0 3585 +4076 0 3476 +4076 0 3272 +4076 0 2630 +4076 0 0 +4076 0 0 +4076 3401 0 +4095 3924 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3933 +4095 0 3932 +4095 0 3929 +4095 0 3926 +4095 0 3921 +4095 0 3915 +4095 0 3907 +4095 0 3896 +4095 0 3880 +4095 0 3859 +4095 0 3828 +4095 0 3784 +4095 0 3717 +4095 0 3608 +4095 0 3405 +4095 0 2764 +4095 0 0 +4095 0 0 +4095 3534 0 +0 427 609 +0 512 609 +0 606 609 +0 609 485 +0 609 224 +0 750 0 +0 888 0 +371 1025 0 +640 1160 0 +853 1295 0 +1037 1429 0 +1205 1563 0 +1362 1696 0 +1512 1828 0 +1657 1961 0 +1798 2094 0 +1937 2226 0 +2074 2358 0 +2210 2491 0 +2345 2623 0 +2479 2755 0 +2613 2887 0 +2746 3019 0 +2879 3152 0 +3012 3284 0 +3144 3416 0 +3277 3548 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 322 609 +0 444 598 +0 551 598 +0 598 520 +0 598 286 +0 741 0 +190 882 0 +482 1020 0 +705 1157 0 +894 1292 0 +1065 1427 0 +1225 1561 0 +1376 1695 0 +1522 1828 0 +1664 1961 0 +1804 2093 0 +1941 2226 0 +2077 2358 0 +2212 2491 0 +2347 2623 0 +2481 2755 0 +2614 2887 0 +2747 3019 0 +2880 3152 0 +3012 3283 0 +3145 3416 0 +3277 3548 0 +3409 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 127 609 +0 303 598 +148 466 582 +148 582 564 +148 582 357 +132 730 34 +390 873 0 +598 1014 0 +779 1152 0 +945 1289 0 +1101 1424 0 +1250 1559 0 +1394 1693 0 +1535 1827 0 +1674 1960 0 +1811 2093 0 +1946 2225 0 +2081 2358 0 +2215 2490 0 +2349 2623 0 +2482 2755 0 +2615 2887 0 +2747 3019 0 +2880 3152 0 +3013 3283 0 +3145 3416 0 +3277 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 0 609 +0 0 598 +148 277 582 +350 494 560 +350 560 438 +409 714 280 +567 862 166 +717 1005 0 +863 1146 0 +1005 1284 0 +1144 1421 0 +1281 1557 0 +1417 1691 0 +1552 1825 0 +1686 1959 0 +1820 2092 0 +1953 2225 0 +2086 2357 0 +2219 2490 0 +2352 2622 0 +2484 2755 0 +2617 2887 0 +2749 3019 0 +2881 3151 0 +3013 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +224 0 609 +286 0 598 +357 148 582 +438 350 560 +528 528 528 +625 691 482 +730 846 412 +840 994 298 +955 1137 80 +1074 1278 0 +1196 1416 0 +1320 1553 0 +1446 1689 0 +1574 1823 0 +1703 1958 0 +1832 2091 0 +1963 2224 0 +2093 2357 0 +2224 2489 0 +2356 2622 0 +2487 2755 0 +2619 2887 0 +2750 3019 0 +2883 3151 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +587 0 750 +616 0 741 +652 34 730 +696 280 714 +691 482 625 +691 570 482 +846 828 412 +947 994 298 +1040 1137 80 +1141 1278 0 +1248 1416 0 +1360 1553 0 +1477 1689 0 +1598 1823 0 +1721 1958 0 +1846 2091 0 +1973 2224 0 +2101 2357 0 +2230 2489 0 +2360 2622 0 +2490 2755 0 +2621 2887 0 +2752 3019 0 +2884 3151 0 +3015 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3674 3944 0 +3807 4076 0 +3939 4095 0 +838 0 888 +855 0 882 +873 0 870 +862 166 815 +846 412 730 +846 412 541 +846 622 412 +994 917 298 +1134 1137 80 +1218 1278 0 +1310 1416 0 +1409 1553 0 +1515 1689 0 +1627 1823 0 +1743 1958 0 +1863 2091 0 +1986 2224 0 +2111 2357 0 +2238 2489 0 +2366 2622 0 +2495 2755 0 +2625 2887 0 +2755 3019 0 +2886 3151 0 +3016 3283 0 +3148 3416 0 +3280 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1025 0 1006 +1020 0 985 +1014 0 954 +1005 0 908 +994 298 840 +994 298 699 +994 298 397 +994 682 298 +1137 1013 80 +1278 1251 0 +1381 1416 0 +1467 1553 0 +1562 1689 0 +1664 1823 0 +1772 1958 0 +1885 2091 0 +2003 2224 0 +2124 2357 0 +2247 2489 0 +2373 2622 0 +2501 2755 0 +2629 2887 0 +2758 3019 0 +2888 3151 0 +3018 3283 0 +3149 3416 0 +3280 3548 0 +3412 3680 0 +3544 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1160 0 1089 +1157 0 1071 +1152 0 1045 +1146 0 1009 +1137 80 955 +1137 80 850 +1137 80 655 +1137 80 81 +1137 753 80 +1278 1116 0 +1416 1367 0 +1535 1553 0 +1617 1689 0 +1709 1823 0 +1808 1958 0 +1913 2091 0 +2025 2224 0 +2141 2357 0 +2260 2489 0 +2383 2622 0 +2508 2755 0 +2635 2887 0 +2762 3019 0 +2891 3151 0 +3021 3283 0 +3151 3416 0 +3282 3548 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1295 0 1181 +1292 0 1166 +1289 0 1145 +1284 0 1116 +1278 0 1074 +1278 0 995 +1278 0 862 +1278 0 587 +1278 0 0 +1278 832 0 +1416 1225 0 +1553 1486 0 +1683 1689 0 +1763 1823 0 +1852 1958 0 +1949 2091 0 +2053 2224 0 +2162 2357 0 +2277 2489 0 +2396 2622 0 +2517 2755 0 +2642 2887 0 +2768 3019 0 +2895 3151 0 +3024 3283 0 +3154 3416 0 +3284 3548 0 +3414 3680 0 +3545 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1280 +1427 0 1267 +1424 0 1251 +1421 0 1228 +1416 0 1196 +1416 0 1137 +1416 0 1043 +1416 0 878 +1416 0 478 +1416 0 0 +1416 920 0 +1553 1340 0 +1689 1608 0 +1823 1821 0 +1905 1958 0 +1992 2091 0 +2087 2224 0 +2190 2357 0 +2298 2489 0 +2412 2622 0 +2530 2755 0 +2651 2887 0 +2775 3019 0 +2901 3151 0 +3028 3283 0 +3157 3416 0 +3286 3548 0 +3416 3680 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1563 0 1385 +1561 0 1376 +1559 0 1363 +1557 0 1345 +1553 0 1320 +1553 0 1276 +1553 0 1209 +1553 0 1102 +1553 0 900 +1553 0 275 +1553 0 0 +1553 1017 0 +1689 1457 0 +1823 1732 0 +1958 1948 0 +2044 2091 0 +2130 2224 0 +2224 2357 0 +2326 2489 0 +2434 2622 0 +2547 2755 0 +2664 2887 0 +2785 3019 0 +2908 3151 0 +3034 3283 0 +3161 3416 0 +3289 3548 0 +3419 3680 0 +3549 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1496 +1695 0 1489 +1693 0 1479 +1691 0 1465 +1689 0 1446 +1689 0 1413 +1689 0 1365 +1689 0 1291 +1689 0 1169 +1689 0 926 +1689 0 0 +1689 0 0 +1689 1120 0 +1823 1579 0 +1958 1859 0 +2091 2076 0 +2181 2224 0 +2266 2357 0 +2360 2489 0 +2460 2622 0 +2568 2755 0 +2681 2887 0 +2797 3019 0 +2918 3151 0 +3041 3283 0 +3166 3416 0 +3293 3548 0 +3422 3680 0 +3551 3812 0 +3681 3944 0 +3811 4076 0 +3942 4095 0 +1828 0 1612 +1828 0 1607 +1827 0 1599 +1825 0 1588 +1823 0 1574 +1823 0 1549 +1823 0 1514 +1823 0 1462 +1823 0 1382 +1823 0 1245 +1823 0 960 +1823 0 0 +1823 0 0 +1823 1230 0 +1958 1703 0 +2091 1986 0 +2224 2206 0 +2317 2357 0 +2401 2489 0 +2494 2622 0 +2595 2755 0 +2702 2887 0 +2814 3019 0 +2931 3151 0 +3051 3283 0 +3174 3416 0 +3299 3548 0 +3426 3680 0 +3554 3812 0 +3683 3944 0 +3813 4076 0 +3944 4095 0 +1961 0 1732 +1961 0 1728 +1960 0 1722 +1959 0 1714 +1958 0 1703 +1958 0 1684 +1958 0 1658 +1958 0 1621 +1958 0 1566 +1958 0 1480 +1958 0 1332 +1958 0 1000 +1958 0 0 +1958 0 0 +1958 1344 0 +2091 1829 0 +2224 2115 0 +2357 2335 0 +2452 2489 0 +2536 2622 0 +2628 2755 0 +2728 2887 0 +2835 3019 0 +2947 3151 0 +3063 3283 0 +3184 3416 0 +3307 3548 0 +3431 3680 0 +3558 3812 0 +3686 3944 0 +3815 4076 0 +3945 4095 0 +2094 0 1855 +2093 0 1851 +2093 0 1847 +2092 0 1841 +2091 0 1832 +2091 0 1819 +2091 0 1799 +2091 0 1772 +2091 0 1733 +2091 0 1676 +2091 0 1585 +2091 0 1425 +2091 0 1050 +2091 0 0 +2091 0 0 +2091 1463 0 +2224 1956 0 +2357 2245 0 +2489 2466 0 +2586 2622 0 +2670 2755 0 +2762 2887 0 +2862 3019 0 +2968 3151 0 +3080 3283 0 +3196 3416 0 +3316 3548 0 +3439 3680 0 +3564 3812 0 +3691 3944 0 +3818 4076 0 +3948 4095 0 +2226 0 1979 +2226 0 1977 +2225 0 1973 +2225 0 1969 +2224 0 1963 +2224 0 1952 +2224 0 1938 +2224 0 1918 +2224 0 1891 +2224 0 1850 +2224 0 1790 +2224 0 1695 +2224 0 1527 +2224 0 1108 +2224 0 0 +2224 0 0 +2224 1584 0 +2357 2085 0 +2489 2375 0 +2622 2597 0 +2720 2755 0 +2803 2887 0 +2895 3019 0 +2995 3151 0 +3101 3283 0 +3212 3416 0 +3329 3548 0 +3448 3680 0 +3571 3812 0 +3696 3944 0 +3823 4076 0 +3951 4095 0 +2358 0 2106 +2358 0 2104 +2358 0 2101 +2357 0 2098 +2357 0 2093 +2357 0 2086 +2357 0 2075 +2357 0 2060 +2357 0 2040 +2357 0 2012 +2357 0 1970 +2357 0 1909 +2357 0 1811 +2357 0 1634 +2357 0 1176 +2357 0 0 +2357 0 0 +2357 1708 0 +2489 2215 0 +2622 2506 0 +2755 2729 0 +2853 2887 0 +2936 3019 0 +3028 3151 0 +3127 3283 0 +3233 3416 0 +3345 3548 0 +3461 3680 0 +3581 3812 0 +3703 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2234 +2491 0 2233 +2490 0 2230 +2490 0 2228 +2489 0 2224 +2489 0 2219 +2489 0 2211 +2489 0 2200 +2489 0 2185 +2489 0 2165 +2489 0 2136 +2489 0 2094 +2489 0 2031 +2489 0 1930 +2489 0 1748 +2489 0 1255 +2489 0 0 +2489 0 0 +2489 1834 0 +2622 2344 0 +2755 2637 0 +2887 2860 0 +2986 3019 0 +3069 3151 0 +3160 3283 0 +3260 3416 0 +3366 3548 0 +3478 3680 0 +3594 3812 0 +3713 3944 0 +3836 4076 0 +3961 4095 0 +2623 0 2363 +2623 0 2362 +2623 0 2360 +2622 0 2358 +2622 0 2356 +2622 0 2351 +2622 0 2346 +2622 0 2337 +2622 0 2327 +2622 0 2312 +2622 0 2291 +2622 0 2261 +2622 0 2219 +2622 0 2155 +2622 0 2052 +2622 0 1865 +2622 0 1342 +2622 0 0 +2622 0 0 +2622 1962 0 +2755 2476 0 +2887 2768 0 +3019 2992 0 +3119 3151 0 +3201 3283 0 +3293 3416 0 +3392 3548 0 +3498 3680 0 +3610 3812 0 +3726 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2493 +2755 0 2492 +2755 0 2491 +2755 0 2489 +2755 0 2487 +2755 0 2484 +2755 0 2480 +2755 0 2474 +2755 0 2466 +2755 0 2455 +2755 0 2440 +2755 0 2419 +2755 0 2389 +2755 0 2346 +2755 0 2281 +2755 0 2177 +2755 0 1986 +2755 0 1439 +2755 0 0 +2755 0 0 +2755 2091 0 +2887 2606 0 +3019 2899 0 +3151 3123 0 +3251 3283 0 +3334 3416 0 +3426 3548 0 +3525 3680 0 +3631 3812 0 +3742 3944 0 +3858 4076 0 +3977 4095 0 +2887 0 2623 +2887 0 2622 +2887 0 2621 +2887 0 2620 +2887 0 2619 +2887 0 2617 +2887 0 2613 +2887 0 2609 +2887 0 2603 +2887 0 2595 +2887 0 2584 +2887 0 2569 +2887 0 2548 +2887 0 2517 +2887 0 2474 +2887 0 2409 +2887 0 2304 +2887 0 2110 +2887 0 1540 +2887 0 0 +2887 0 0 +2887 2220 0 +3019 2737 0 +3151 3031 0 +3283 3255 0 +3384 3416 0 +3467 3548 0 +3558 3680 0 +3657 3812 0 +3763 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2754 +3019 0 2753 +3019 0 2752 +3019 0 2751 +3019 0 2750 +3019 0 2749 +3019 0 2746 +3019 0 2743 +3019 0 2738 +3019 0 2732 +3019 0 2724 +3019 0 2713 +3019 0 2698 +3019 0 2677 +3019 0 2647 +3019 0 2603 +3019 0 2537 +3019 0 2431 +3019 0 2234 +3019 0 1646 +3019 0 0 +3019 0 0 +3019 2350 0 +3151 2869 0 +3283 3163 0 +3416 3387 0 +3516 3548 0 +3599 3680 0 +3690 3812 0 +3789 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2885 +3152 0 2885 +3152 0 2884 +3151 0 2883 +3151 0 2883 +3151 0 2881 +3151 0 2879 +3151 0 2877 +3151 0 2873 +3151 0 2869 +3151 0 2863 +3151 0 2855 +3151 0 2844 +3151 0 2829 +3151 0 2807 +3151 0 2777 +3151 0 2733 +3151 0 2667 +3151 0 2560 +3151 0 2362 +3151 0 1760 +3151 0 0 +3151 0 0 +3151 2481 0 +3283 3000 0 +3416 3295 0 +3548 3519 0 +3648 3680 0 +3731 3812 0 +3822 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3016 +3283 0 3016 +3283 0 3015 +3283 0 3015 +3283 0 3014 +3283 0 3013 +3283 0 3012 +3283 0 3010 +3283 0 3008 +3283 0 3004 +3283 0 3000 +3283 0 2994 +3283 0 2986 +3283 0 2974 +3283 0 2959 +3283 0 2938 +3283 0 2907 +3283 0 2863 +3283 0 2797 +3283 0 2690 +3283 0 2489 +3283 0 1875 +3283 0 0 +3283 0 0 +3283 2612 0 +3416 3132 0 +3548 3427 0 +3680 3651 0 +3781 3812 0 +3863 3944 0 +3955 4076 0 +4054 4095 0 +3416 0 3147 +3416 0 3147 +3416 0 3147 +3416 0 3147 +3416 0 3146 +3416 0 3145 +3416 0 3144 +3416 0 3143 +3416 0 3141 +3416 0 3139 +3416 0 3135 +3416 0 3131 +3416 0 3125 +3416 0 3117 +3416 0 3106 +3416 0 3090 +3416 0 3069 +3416 0 3038 +3416 0 2994 +3416 0 2928 +3416 0 2820 +3416 0 2619 +3416 0 2000 +3416 0 0 +3416 0 0 +3416 2743 0 +3548 3264 0 +3680 3559 0 +3812 3783 0 +3913 3944 0 +3995 4076 0 +4087 4095 0 +3548 0 3279 +3548 0 3279 +3548 0 3279 +3548 0 3279 +3548 0 3278 +3548 0 3278 +3548 0 3277 +3548 0 3276 +3548 0 3275 +3548 0 3273 +3548 0 3270 +3548 0 3267 +3548 0 3262 +3548 0 3256 +3548 0 3248 +3548 0 3237 +3548 0 3222 +3548 0 3200 +3548 0 3170 +3548 0 3125 +3548 0 3059 +3548 0 2951 +3548 0 2749 +3548 0 2122 +3548 0 0 +3548 0 0 +3548 2874 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3411 +3680 0 3411 +3680 0 3411 +3680 0 3411 +3680 0 3410 +3680 0 3410 +3680 0 3409 +3680 0 3409 +3680 0 3408 +3680 0 3406 +3680 0 3404 +3680 0 3402 +3680 0 3399 +3680 0 3394 +3680 0 3388 +3680 0 3380 +3680 0 3369 +3680 0 3353 +3680 0 3332 +3680 0 3301 +3680 0 3257 +3680 0 3190 +3680 0 3082 +3680 0 2879 +3680 0 2251 +3680 0 0 +3680 0 0 +3680 3006 0 +3812 3528 0 +3944 3823 0 +4076 4047 0 +4095 4095 0 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3542 +3812 0 3541 +3812 0 3540 +3812 0 3539 +3812 0 3538 +3812 0 3536 +3812 0 3534 +3812 0 3530 +3812 0 3526 +3812 0 3520 +3812 0 3511 +3812 0 3500 +3812 0 3485 +3812 0 3463 +3812 0 3433 +3812 0 3388 +3812 0 3322 +3812 0 3213 +3812 0 3011 +3812 0 2377 +3812 0 0 +3812 0 0 +3812 3138 0 +3944 3660 0 +4076 3955 0 +4095 4095 0 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3670 +3944 0 3668 +3944 0 3665 +3944 0 3662 +3944 0 3658 +3944 0 3652 +3944 0 3643 +3944 0 3632 +3944 0 3617 +3944 0 3595 +3944 0 3564 +3944 0 3520 +3944 0 3453 +3944 0 3345 +3944 0 3142 +3944 0 2505 +3944 0 0 +3944 0 0 +3944 3270 0 +4076 3792 0 +4095 4087 0 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3801 +4076 0 3800 +4076 0 3797 +4076 0 3794 +4076 0 3790 +4076 0 3783 +4076 0 3775 +4076 0 3764 +4076 0 3748 +4076 0 3727 +4076 0 3696 +4076 0 3652 +4076 0 3585 +4076 0 3476 +4076 0 3273 +4076 0 2632 +4076 0 0 +4076 0 0 +4076 3401 0 +4095 3924 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3934 +4095 0 3932 +4095 0 3929 +4095 0 3926 +4095 0 3921 +4095 0 3915 +4095 0 3907 +4095 0 3896 +4095 0 3880 +4095 0 3859 +4095 0 3828 +4095 0 3784 +4095 0 3717 +4095 0 3608 +4095 0 3405 +4095 0 2765 +4095 0 0 +4095 0 0 +4095 3534 0 +0 545 750 +0 613 750 +0 689 750 +0 750 723 +0 750 587 +0 750 304 +0 888 0 +0 1025 0 +397 1160 0 +717 1295 0 +951 1429 0 +1148 1563 0 +1322 1696 0 +1484 1828 0 +1636 1961 0 +1783 2094 0 +1926 2226 0 +2066 2358 0 +2204 2491 0 +2341 2623 0 +2476 2755 0 +2611 2887 0 +2744 3019 0 +2878 3152 0 +3011 3284 0 +3144 3416 0 +3276 3548 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 467 750 +0 559 741 +0 644 741 +0 738 741 +0 741 616 +0 741 356 +0 882 0 +81 1020 0 +503 1157 0 +772 1292 0 +985 1427 0 +1170 1561 0 +1337 1695 0 +1494 1828 0 +1644 1961 0 +1789 2093 0 +1930 2226 0 +2069 2358 0 +2206 2491 0 +2342 2623 0 +2477 2755 0 +2612 2887 0 +2745 3019 0 +2878 3152 0 +3011 3283 0 +3144 3416 0 +3277 3548 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 334 750 +0 453 741 +34 576 730 +34 683 730 +34 730 652 +34 730 418 +0 873 0 +323 1014 0 +614 1152 0 +837 1289 0 +1027 1424 0 +1198 1559 0 +1357 1693 0 +1508 1827 0 +1654 1960 0 +1796 2093 0 +1936 2225 0 +2073 2358 0 +2209 2490 0 +2345 2623 0 +2479 2755 0 +2613 2887 0 +2746 3019 0 +2879 3152 0 +3011 3283 0 +3144 3416 0 +3277 3548 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 59 750 +0 258 741 +34 435 730 +280 598 714 +280 714 696 +280 714 490 +264 862 166 +523 1005 0 +730 1146 0 +911 1284 0 +1077 1421 0 +1233 1557 0 +1382 1691 0 +1526 1825 0 +1667 1959 0 +1806 2092 0 +1943 2225 0 +2078 2357 0 +2213 2490 0 +2347 2622 0 +2481 2755 0 +2614 2887 0 +2747 3019 0 +2880 3151 0 +3012 3283 0 +3145 3416 0 +3277 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 0 750 +0 0 741 +34 132 730 +280 409 714 +482 625 691 +482 691 570 +541 846 412 +699 994 298 +850 1137 80 +995 1278 0 +1137 1416 0 +1276 1553 0 +1413 1689 0 +1549 1823 0 +1684 1958 0 +1819 2091 0 +1952 2224 0 +2086 2357 0 +2219 2489 0 +2351 2622 0 +2484 2755 0 +2617 2887 0 +2749 3019 0 +2881 3151 0 +3013 3283 0 +3145 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +304 0 750 +356 0 741 +418 34 730 +490 280 714 +570 482 691 +660 660 660 +758 824 614 +862 978 544 +972 1126 430 +1087 1270 212 +1206 1410 0 +1328 1549 0 +1452 1685 0 +1579 1821 0 +1706 1956 0 +1835 2089 0 +1965 2223 0 +2095 2356 0 +2226 2489 0 +2356 2621 0 +2488 2754 0 +2619 2887 0 +2751 3019 0 +2883 3151 0 +3014 3283 0 +3146 3416 0 +3278 3548 0 +3410 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +697 0 888 +719 0 882 +749 0 873 +784 166 862 +828 412 846 +824 614 758 +824 702 614 +978 960 544 +1079 1126 430 +1172 1270 212 +1273 1410 0 +1380 1549 0 +1492 1685 0 +1609 1821 0 +1730 1956 0 +1853 2089 0 +1978 2223 0 +2105 2356 0 +2233 2489 0 +2362 2621 0 +2492 2754 0 +2623 2887 0 +2753 3019 0 +2885 3151 0 +3016 3283 0 +3147 3416 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +957 0 1025 +970 0 1020 +987 0 1014 +1005 0 1002 +994 298 947 +978 544 862 +978 544 673 +978 754 544 +1126 1049 430 +1266 1270 212 +1350 1410 0 +1442 1549 0 +1541 1685 0 +1648 1821 0 +1759 1956 0 +1875 2089 0 +1995 2223 0 +2118 2356 0 +2243 2489 0 +2370 2621 0 +2498 2754 0 +2627 2887 0 +2756 3019 0 +2887 3151 0 +3018 3283 0 +3149 3416 0 +3280 3548 0 +3412 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1160 0 1154 +1157 0 1139 +1152 0 1117 +1146 0 1086 +1137 80 1040 +1126 430 972 +1126 430 831 +1126 430 529 +1126 814 430 +1270 1145 212 +1410 1383 0 +1513 1549 0 +1599 1685 0 +1694 1821 0 +1796 1956 0 +1904 2089 0 +2018 2223 0 +2135 2356 0 +2256 2489 0 +2380 2621 0 +2505 2754 0 +2632 2887 0 +2761 3019 0 +2890 3151 0 +3020 3283 0 +3151 3416 0 +3281 3548 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3808 4076 0 +3939 4095 0 +1295 0 1234 +1292 0 1221 +1289 0 1203 +1284 0 1177 +1278 0 1141 +1270 212 1087 +1270 212 982 +1270 212 787 +1270 212 214 +1270 884 212 +1410 1248 0 +1549 1499 0 +1667 1685 0 +1750 1821 0 +1841 1956 0 +1940 2089 0 +2046 2223 0 +2157 2356 0 +2273 2489 0 +2393 2621 0 +2515 2754 0 +2640 2887 0 +2766 3019 0 +2895 3151 0 +3023 3283 0 +3153 3416 0 +3283 3548 0 +3414 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1323 +1427 0 1313 +1424 0 1298 +1421 0 1277 +1416 0 1248 +1410 0 1206 +1410 0 1127 +1410 0 994 +1410 0 719 +1410 47 0 +1410 964 0 +1549 1358 0 +1685 1618 0 +1815 1821 0 +1895 1956 0 +1984 2089 0 +2081 2223 0 +2185 2356 0 +2294 2489 0 +2409 2621 0 +2528 2754 0 +2650 2887 0 +2774 3019 0 +2900 3151 0 +3027 3283 0 +3156 3416 0 +3286 3548 0 +3416 3680 0 +3547 3812 0 +3677 3944 0 +3809 4076 0 +3941 4095 0 +1563 0 1421 +1561 0 1412 +1559 0 1400 +1557 0 1384 +1553 0 1360 +1549 0 1328 +1549 0 1269 +1549 0 1176 +1549 0 1011 +1549 0 611 +1549 0 0 +1549 1053 0 +1685 1471 0 +1821 1740 0 +1956 1953 0 +2037 2089 0 +2124 2223 0 +2219 2356 0 +2322 2489 0 +2431 2621 0 +2545 2754 0 +2662 2887 0 +2784 3019 0 +2907 3151 0 +3033 3283 0 +3160 3416 0 +3289 3548 0 +3418 3680 0 +3548 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1524 +1695 0 1517 +1693 0 1508 +1691 0 1495 +1689 0 1477 +1685 0 1452 +1685 0 1408 +1685 0 1341 +1685 0 1233 +1685 0 1031 +1685 0 406 +1685 0 0 +1685 1149 0 +1821 1590 0 +1956 1865 0 +2089 2080 0 +2176 2223 0 +2262 2356 0 +2356 2489 0 +2458 2621 0 +2566 2754 0 +2679 2887 0 +2796 3019 0 +2917 3151 0 +3040 3283 0 +3166 3416 0 +3293 3548 0 +3421 3680 0 +3551 3812 0 +3681 3944 0 +3811 4076 0 +3942 4095 0 +1828 0 1634 +1828 0 1629 +1827 0 1621 +1825 0 1611 +1823 0 1598 +1821 0 1579 +1821 0 1545 +1821 0 1497 +1821 0 1423 +1821 0 1301 +1821 0 1059 +1821 0 0 +1821 0 0 +1821 1253 0 +1956 1711 0 +2089 1991 0 +2223 2208 0 +2313 2356 0 +2398 2489 0 +2492 2621 0 +2593 2754 0 +2700 2887 0 +2813 3019 0 +2930 3151 0 +3050 3283 0 +3173 3416 0 +3299 3548 0 +3426 3680 0 +3554 3812 0 +3683 3944 0 +3813 4076 0 +3944 4095 0 +1961 0 1749 +1961 0 1745 +1960 0 1739 +1959 0 1731 +1958 0 1721 +1956 0 1706 +1956 0 1681 +1956 0 1646 +1956 0 1594 +1956 0 1514 +1956 0 1378 +1956 0 1091 +1956 0 0 +1956 0 0 +1956 1362 0 +2089 1835 0 +2223 2118 0 +2356 2338 0 +2449 2489 0 +2533 2621 0 +2627 2754 0 +2727 2887 0 +2834 3019 0 +2946 3151 0 +3062 3283 0 +3183 3416 0 +3306 3548 0 +3431 3680 0 +3558 3812 0 +3686 3944 0 +3815 4076 0 +3945 4095 0 +2094 0 1867 +2093 0 1864 +2093 0 1860 +2092 0 1854 +2091 0 1846 +2089 0 1835 +2089 0 1816 +2089 0 1790 +2089 0 1753 +2089 0 1698 +2089 0 1612 +2089 0 1463 +2089 0 1133 +2089 0 0 +2089 0 0 +2089 1476 0 +2223 1961 0 +2356 2247 0 +2489 2468 0 +2584 2621 0 +2668 2754 0 +2761 2887 0 +2860 3019 0 +2967 3151 0 +3079 3283 0 +3196 3416 0 +3316 3548 0 +3438 3680 0 +3564 3812 0 +3690 3944 0 +3818 4076 0 +3948 4095 0 +2226 0 1989 +2226 0 1987 +2225 0 1983 +2225 0 1979 +2224 0 1973 +2223 0 1965 +2223 0 1951 +2223 0 1931 +2223 0 1904 +2223 0 1865 +2223 0 1808 +2223 0 1717 +2223 0 1557 +2223 0 1181 +2223 0 0 +2223 0 0 +2223 1595 0 +2356 2088 0 +2489 2377 0 +2621 2598 0 +2718 2754 0 +2802 2887 0 +2894 3019 0 +2994 3151 0 +3100 3283 0 +3212 3416 0 +3328 3548 0 +3448 3680 0 +3571 3812 0 +3696 3944 0 +3822 4076 0 +3951 4095 0 +2358 0 2113 +2358 0 2111 +2358 0 2109 +2357 0 2105 +2357 0 2101 +2356 0 2095 +2356 0 2084 +2356 0 2070 +2356 0 2050 +2356 0 2022 +2356 0 1982 +2356 0 1922 +2356 0 1828 +2356 0 1659 +2356 0 1240 +2356 0 0 +2356 0 0 +2356 1716 0 +2489 2218 0 +2621 2507 0 +2754 2730 0 +2852 2887 0 +2935 3019 0 +3027 3151 0 +3127 3283 0 +3233 3416 0 +3344 3548 0 +3461 3680 0 +3581 3812 0 +3703 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2239 +2491 0 2238 +2490 0 2236 +2490 0 2234 +2489 0 2230 +2489 0 2226 +2489 0 2218 +2489 0 2207 +2489 0 2193 +2489 0 2172 +2489 0 2144 +2489 0 2103 +2489 0 2041 +2489 0 1943 +2489 0 1767 +2489 0 1310 +2489 0 0 +2489 0 0 +2489 1840 0 +2621 2346 0 +2754 2638 0 +2887 2861 0 +2985 3019 0 +3068 3151 0 +3160 3283 0 +3259 3416 0 +3365 3548 0 +3477 3680 0 +3593 3812 0 +3713 3944 0 +3835 4076 0 +3961 4095 0 +2623 0 2367 +2623 0 2366 +2623 0 2364 +2622 0 2362 +2622 0 2360 +2621 0 2356 +2621 0 2351 +2621 0 2343 +2621 0 2332 +2621 0 2317 +2621 0 2297 +2621 0 2268 +2621 0 2226 +2621 0 2163 +2621 0 2062 +2621 0 1880 +2621 0 1387 +2621 0 0 +2621 0 0 +2621 1966 0 +2754 2477 0 +2887 2769 0 +3019 2992 0 +3118 3151 0 +3201 3283 0 +3293 3416 0 +3392 3548 0 +3498 3680 0 +3609 3812 0 +3725 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2496 +2755 0 2495 +2755 0 2494 +2755 0 2492 +2755 0 2490 +2754 0 2488 +2754 0 2484 +2754 0 2478 +2754 0 2470 +2754 0 2459 +2754 0 2444 +2754 0 2423 +2754 0 2394 +2754 0 2351 +2754 0 2287 +2754 0 2185 +2754 0 1997 +2754 0 1476 +2754 0 0 +2754 0 0 +2754 2094 0 +2887 2607 0 +3019 2900 0 +3151 3124 0 +3251 3283 0 +3334 3416 0 +3425 3548 0 +3525 3680 0 +3630 3812 0 +3742 3944 0 +3858 4076 0 +3977 4095 0 +2887 0 2625 +2887 0 2625 +2887 0 2624 +2887 0 2623 +2887 0 2621 +2887 0 2619 +2887 0 2616 +2887 0 2612 +2887 0 2606 +2887 0 2598 +2887 0 2587 +2887 0 2572 +2887 0 2551 +2887 0 2521 +2887 0 2478 +2887 0 2413 +2887 0 2310 +2887 0 2118 +2887 0 1569 +2887 0 0 +2887 0 0 +2887 2223 0 +3019 2738 0 +3151 3032 0 +3283 3255 0 +3384 3416 0 +3466 3548 0 +3558 3680 0 +3657 3812 0 +3763 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2755 +3019 0 2755 +3019 0 2754 +3019 0 2753 +3019 0 2752 +3019 0 2751 +3019 0 2748 +3019 0 2745 +3019 0 2741 +3019 0 2735 +3019 0 2727 +3019 0 2716 +3019 0 2701 +3019 0 2679 +3019 0 2649 +3019 0 2606 +3019 0 2541 +3019 0 2435 +3019 0 2241 +3019 0 1670 +3019 0 0 +3019 0 0 +3019 2352 0 +3151 2870 0 +3283 3163 0 +3416 3387 0 +3516 3548 0 +3599 3680 0 +3690 3812 0 +3789 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2886 +3152 0 2886 +3152 0 2885 +3151 0 2885 +3151 0 2884 +3151 0 2883 +3151 0 2881 +3151 0 2879 +3151 0 2875 +3151 0 2871 +3151 0 2865 +3151 0 2857 +3151 0 2845 +3151 0 2830 +3151 0 2809 +3151 0 2779 +3151 0 2735 +3151 0 2670 +3151 0 2564 +3151 0 2367 +3151 0 1779 +3151 0 0 +3151 0 0 +3151 2482 0 +3283 3000 0 +3416 3295 0 +3548 3519 0 +3648 3680 0 +3731 3812 0 +3822 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3017 +3283 0 3017 +3283 0 3016 +3283 0 3016 +3283 0 3015 +3283 0 3014 +3283 0 3013 +3283 0 3011 +3283 0 3009 +3283 0 3005 +3283 0 3001 +3283 0 2995 +3283 0 2987 +3283 0 2976 +3283 0 2960 +3283 0 2939 +3283 0 2909 +3283 0 2865 +3283 0 2799 +3283 0 2692 +3283 0 2493 +3283 0 1890 +3283 0 0 +3283 0 0 +3283 2613 0 +3416 3133 0 +3548 3427 0 +3680 3651 0 +3781 3812 0 +3863 3944 0 +3954 4076 0 +4054 4095 0 +3416 0 3148 +3416 0 3148 +3416 0 3148 +3416 0 3147 +3416 0 3147 +3416 0 3146 +3416 0 3145 +3416 0 3144 +3416 0 3142 +3416 0 3140 +3416 0 3136 +3416 0 3132 +3416 0 3126 +3416 0 3118 +3416 0 3106 +3416 0 3091 +3416 0 3070 +3416 0 3039 +3416 0 2996 +3416 0 2929 +3416 0 2822 +3416 0 2621 +3416 0 2011 +3416 0 0 +3416 0 0 +3416 2744 0 +3548 3265 0 +3680 3559 0 +3812 3783 0 +3913 3944 0 +3995 4076 0 +4087 4095 0 +3548 0 3280 +3548 0 3280 +3548 0 3280 +3548 0 3279 +3548 0 3279 +3548 0 3278 +3548 0 3278 +3548 0 3277 +3548 0 3275 +3548 0 3273 +3548 0 3271 +3548 0 3268 +3548 0 3263 +3548 0 3257 +3548 0 3249 +3548 0 3238 +3548 0 3222 +3548 0 3201 +3548 0 3171 +3548 0 3126 +3548 0 3060 +3548 0 2952 +3548 0 2751 +3548 0 2130 +3548 0 0 +3548 0 0 +3548 2875 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3411 +3680 0 3411 +3680 0 3411 +3680 0 3411 +3680 0 3411 +3680 0 3410 +3680 0 3410 +3680 0 3409 +3680 0 3408 +3680 0 3407 +3680 0 3405 +3680 0 3402 +3680 0 3399 +3680 0 3395 +3680 0 3388 +3680 0 3380 +3680 0 3369 +3680 0 3354 +3680 0 3332 +3680 0 3302 +3680 0 3258 +3680 0 3191 +3680 0 3083 +3680 0 2881 +3680 0 2257 +3680 0 0 +3680 0 0 +3680 3006 0 +3812 3528 0 +3944 3823 0 +4076 4047 0 +4095 4095 0 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3541 +3812 0 3541 +3812 0 3540 +3812 0 3538 +3812 0 3537 +3812 0 3534 +3812 0 3531 +3812 0 3526 +3812 0 3520 +3812 0 3512 +3812 0 3501 +3812 0 3485 +3812 0 3464 +3812 0 3433 +3812 0 3389 +3812 0 3322 +3812 0 3214 +3812 0 3012 +3812 0 2382 +3812 0 0 +3812 0 0 +3812 3138 0 +3944 3660 0 +4076 3955 0 +4095 4095 0 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3670 +3944 0 3668 +3944 0 3666 +3944 0 3662 +3944 0 3658 +3944 0 3652 +3944 0 3644 +3944 0 3632 +3944 0 3617 +3944 0 3595 +3944 0 3565 +3944 0 3521 +3944 0 3454 +3944 0 3346 +3944 0 3143 +3944 0 2508 +3944 0 0 +3944 0 0 +3944 3270 0 +4076 3792 0 +4095 4087 0 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3806 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3802 +4076 0 3800 +4076 0 3797 +4076 0 3794 +4076 0 3790 +4076 0 3784 +4076 0 3775 +4076 0 3764 +4076 0 3749 +4076 0 3727 +4076 0 3696 +4076 0 3652 +4076 0 3585 +4076 0 3477 +4076 0 3273 +4076 0 2635 +4076 0 0 +4076 0 0 +4076 3402 0 +4095 3925 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3934 +4095 0 3932 +4095 0 3929 +4095 0 3926 +4095 0 3922 +4095 0 3916 +4095 0 3908 +4095 0 3896 +4095 0 3881 +4095 0 3859 +4095 0 3829 +4095 0 3784 +4095 0 3717 +4095 0 3609 +4095 0 3405 +4095 0 2767 +4095 0 0 +4095 0 0 +4095 3534 0 +0 667 888 +0 719 888 +0 781 888 +0 852 888 +0 888 838 +0 888 697 +0 888 392 +0 1025 0 +0 1160 0 +431 1295 0 +803 1429 0 +1057 1563 0 +1262 1696 0 +1442 1828 0 +1607 1961 0 +1763 2094 0 +1911 2226 0 +2055 2358 0 +2196 2491 0 +2335 2623 0 +2472 2755 0 +2607 2887 0 +2742 3019 0 +2876 3152 0 +3009 3284 0 +3143 3416 0 +3276 3548 0 +3408 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 608 888 +0 678 882 +0 745 882 +0 822 882 +0 882 855 +0 882 719 +0 882 436 +0 1020 0 +0 1157 0 +529 1292 0 +849 1427 0 +1084 1561 0 +1279 1695 0 +1454 1828 0 +1615 1961 0 +1768 2093 0 +1915 2226 0 +2058 2358 0 +2199 2491 0 +2336 2623 0 +2473 2755 0 +2608 2887 0 +2742 3019 0 +2877 3152 0 +3010 3283 0 +3143 3416 0 +3276 3548 0 +3408 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 515 888 +0 599 882 +0 691 873 +0 776 873 +0 870 873 +0 873 749 +0 873 488 +0 1014 0 +214 1152 0 +635 1289 0 +904 1424 0 +1118 1559 0 +1302 1693 0 +1469 1827 0 +1626 1960 0 +1776 2093 0 +1921 2225 0 +2062 2358 0 +2202 2490 0 +2338 2623 0 +2475 2755 0 +2609 2887 0 +2743 3019 0 +2877 3152 0 +3010 3283 0 +3143 3416 0 +3276 3548 0 +3409 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 350 888 +0 466 882 +0 585 873 +166 708 862 +166 815 862 +166 862 784 +166 862 550 +0 1005 0 +455 1146 0 +746 1284 0 +969 1421 0 +1159 1557 0 +1330 1691 0 +1489 1825 0 +1640 1959 0 +1786 2092 0 +1928 2225 0 +2068 2357 0 +2206 2490 0 +2341 2622 0 +2477 2755 0 +2611 2887 0 +2745 3019 0 +2878 3151 0 +3011 3283 0 +3144 3416 0 +3277 3548 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 0 888 +0 190 882 +0 390 873 +166 567 862 +412 730 846 +412 846 828 +412 846 622 +397 994 298 +655 1137 80 +862 1278 0 +1043 1416 0 +1209 1553 0 +1365 1689 0 +1514 1823 0 +1658 1958 0 +1799 2091 0 +1938 2224 0 +2075 2357 0 +2211 2489 0 +2346 2622 0 +2480 2755 0 +2613 2887 0 +2746 3019 0 +2879 3151 0 +3012 3283 0 +3144 3416 0 +3277 3548 0 +3409 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 0 888 +0 0 882 +0 0 873 +166 264 862 +412 541 846 +614 758 824 +614 824 702 +673 978 544 +831 1126 430 +982 1270 212 +1127 1410 0 +1269 1549 0 +1408 1685 0 +1545 1821 0 +1681 1956 0 +1816 2089 0 +1951 2223 0 +2084 2356 0 +2218 2489 0 +2351 2621 0 +2484 2754 0 +2616 2887 0 +2748 3019 0 +2881 3151 0 +3013 3283 0 +3145 3416 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +392 0 888 +436 0 882 +488 0 873 +550 166 862 +622 412 846 +702 614 824 +792 792 792 +890 956 746 +994 1110 676 +1104 1258 562 +1219 1402 344 +1338 1543 0 +1460 1681 0 +1585 1817 0 +1711 1953 0 +1838 2087 0 +1967 2221 0 +2096 2355 0 +2227 2488 0 +2357 2621 0 +2489 2754 0 +2620 2886 0 +2751 3018 0 +2883 3151 0 +3015 3283 0 +3147 3415 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +811 0 1025 +829 0 1020 +852 0 1014 +881 0 1005 +917 298 994 +960 544 978 +956 746 890 +956 834 746 +1110 1092 676 +1211 1258 562 +1304 1402 344 +1405 1543 0 +1512 1681 0 +1625 1817 0 +1742 1953 0 +1862 2087 0 +1985 2221 0 +2110 2355 0 +2237 2488 0 +2365 2621 0 +2494 2754 0 +2624 2886 0 +2754 3018 0 +2885 3151 0 +3016 3283 0 +3148 3415 0 +3280 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1079 0 1160 +1089 0 1157 +1102 0 1152 +1119 0 1146 +1137 80 1134 +1126 430 1079 +1110 676 994 +1110 676 805 +1110 886 676 +1258 1181 562 +1398 1402 344 +1482 1543 0 +1574 1681 0 +1673 1817 0 +1779 1953 0 +1891 2087 0 +2008 2221 0 +2127 2355 0 +2250 2488 0 +2375 2621 0 +2502 2754 0 +2630 2886 0 +2759 3018 0 +2889 3151 0 +3019 3283 0 +3150 3415 0 +3281 3548 0 +3412 3680 0 +3544 3812 0 +3676 3944 0 +3807 4076 0 +3939 4095 0 +1292 0 1295 +1292 0 1286 +1289 0 1271 +1284 0 1249 +1278 0 1218 +1270 212 1172 +1258 562 1104 +1258 562 963 +1258 562 661 +1258 946 562 +1402 1277 344 +1543 1516 0 +1645 1681 0 +1732 1817 0 +1826 1953 0 +1928 2087 0 +2036 2221 0 +2150 2355 0 +2267 2488 0 +2388 2621 0 +2512 2754 0 +2637 2886 0 +2764 3018 0 +2893 3151 0 +3022 3283 0 +3152 3415 0 +3283 3548 0 +3414 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1429 0 1376 +1427 0 1366 +1424 0 1353 +1421 0 1335 +1416 0 1310 +1410 0 1273 +1402 344 1219 +1402 344 1114 +1402 344 919 +1402 344 345 +1402 1017 344 +1543 1381 0 +1681 1631 0 +1799 1817 0 +1882 1953 0 +1973 2087 0 +2072 2221 0 +2178 2355 0 +2289 2488 0 +2405 2621 0 +2525 2754 0 +2647 2886 0 +2772 3018 0 +2898 3151 0 +3026 3283 0 +3155 3415 0 +3285 3548 0 +3415 3680 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1563 0 1463 +1561 0 1456 +1559 0 1445 +1557 0 1430 +1553 0 1409 +1549 0 1380 +1543 0 1338 +1543 0 1259 +1543 0 1127 +1543 0 852 +1543 172 0 +1543 1096 0 +1681 1489 0 +1817 1750 0 +1947 1953 0 +2027 2087 0 +2116 2221 0 +2213 2355 0 +2317 2488 0 +2427 2621 0 +2541 2754 0 +2660 2886 0 +2782 3018 0 +2906 3151 0 +3032 3283 0 +3160 3415 0 +3288 3548 0 +3418 3680 0 +3548 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1696 0 1559 +1695 0 1552 +1693 0 1544 +1691 0 1532 +1689 0 1515 +1685 0 1492 +1681 0 1460 +1681 0 1401 +1681 0 1308 +1681 0 1142 +1681 0 742 +1681 0 0 +1681 1184 0 +1817 1604 0 +1953 1872 0 +2087 2085 0 +2169 2221 0 +2256 2355 0 +2352 2488 0 +2454 2621 0 +2563 2754 0 +2677 2886 0 +2794 3018 0 +2916 3151 0 +3039 3283 0 +3165 3415 0 +3292 3548 0 +3421 3680 0 +3550 3812 0 +3680 3944 0 +3811 4076 0 +3942 4095 0 +1828 0 1661 +1828 0 1656 +1827 0 1650 +1825 0 1640 +1823 0 1627 +1821 0 1609 +1817 0 1585 +1817 0 1540 +1817 0 1474 +1817 0 1366 +1817 0 1164 +1817 0 536 +1817 0 0 +1817 1281 0 +1953 1722 0 +2087 1996 0 +2221 2212 0 +2308 2355 0 +2394 2488 0 +2488 2621 0 +2590 2754 0 +2698 2886 0 +2811 3018 0 +2928 3151 0 +3049 3283 0 +3173 3415 0 +3298 3548 0 +3425 3680 0 +3553 3812 0 +3683 3944 0 +3812 4076 0 +3943 4095 0 +1961 0 1770 +1961 0 1766 +1960 0 1761 +1959 0 1754 +1958 0 1743 +1956 0 1730 +1953 0 1711 +1953 0 1678 +1953 0 1629 +1953 0 1555 +1953 0 1433 +1953 0 1190 +1953 0 0 +1953 0 0 +1953 1385 0 +2087 1843 0 +2221 2123 0 +2355 2340 0 +2445 2488 0 +2530 2621 0 +2624 2754 0 +2725 2886 0 +2832 3018 0 +2945 3151 0 +3062 3283 0 +3182 3415 0 +3305 3548 0 +3431 3680 0 +3558 3812 0 +3686 3944 0 +3815 4076 0 +3945 4095 0 +2094 0 1884 +2093 0 1881 +2093 0 1877 +2092 0 1871 +2091 0 1863 +2089 0 1853 +2087 0 1838 +2087 0 1813 +2087 0 1778 +2087 0 1726 +2087 0 1646 +2087 0 1509 +2087 0 1224 +2087 0 0 +2087 0 0 +2087 1494 0 +2221 1967 0 +2355 2251 0 +2488 2470 0 +2581 2621 0 +2666 2754 0 +2759 2886 0 +2859 3018 0 +2966 3151 0 +3078 3283 0 +3195 3415 0 +3315 3548 0 +3438 3680 0 +3563 3812 0 +3690 3944 0 +3818 4076 0 +3947 4095 0 +2226 0 2002 +2226 0 1999 +2225 0 1996 +2225 0 1992 +2224 0 1986 +2223 0 1978 +2221 0 1967 +2221 0 1948 +2221 0 1922 +2221 0 1885 +2221 0 1830 +2221 0 1744 +2221 0 1596 +2221 0 1264 +2221 0 0 +2221 0 0 +2221 1608 0 +2355 2093 0 +2488 2379 0 +2621 2600 0 +2716 2754 0 +2800 2886 0 +2892 3018 0 +2993 3151 0 +3099 3283 0 +3211 3415 0 +3328 3548 0 +3448 3680 0 +3571 3812 0 +3696 3944 0 +3822 4076 0 +3951 4095 0 +2358 0 2123 +2358 0 2121 +2358 0 2119 +2357 0 2115 +2357 0 2111 +2356 0 2105 +2355 0 2096 +2355 0 2083 +2355 0 2063 +2355 0 2037 +2355 0 1998 +2355 0 1940 +2355 0 1849 +2355 0 1689 +2355 0 1313 +2355 0 0 +2355 0 0 +2355 1727 0 +2488 2221 0 +2621 2509 0 +2754 2731 0 +2850 2886 0 +2934 3018 0 +3026 3151 0 +3126 3283 0 +3232 3415 0 +3344 3548 0 +3460 3680 0 +3580 3812 0 +3703 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2247 +2491 0 2245 +2490 0 2243 +2490 0 2241 +2489 0 2238 +2489 0 2233 +2488 0 2227 +2488 0 2217 +2488 0 2202 +2488 0 2183 +2488 0 2155 +2488 0 2115 +2488 0 2055 +2488 0 1960 +2488 0 1791 +2488 0 1373 +2488 0 0 +2488 0 0 +2488 1848 0 +2621 2349 0 +2754 2640 0 +2886 2862 0 +2984 3018 0 +3067 3151 0 +3159 3283 0 +3259 3415 0 +3365 3548 0 +3477 3680 0 +3593 3812 0 +3713 3944 0 +3835 4076 0 +3961 4095 0 +2623 0 2372 +2623 0 2372 +2623 0 2370 +2622 0 2368 +2622 0 2366 +2621 0 2362 +2621 0 2357 +2621 0 2350 +2621 0 2339 +2621 0 2325 +2621 0 2304 +2621 0 2276 +2621 0 2235 +2621 0 2173 +2621 0 2075 +2621 0 1899 +2621 0 1441 +2621 0 0 +2621 0 0 +2621 1972 0 +2754 2479 0 +2886 2770 0 +3018 2992 0 +3117 3151 0 +3200 3283 0 +3292 3415 0 +3392 3548 0 +3497 3680 0 +3609 3812 0 +3725 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2500 +2755 0 2499 +2755 0 2498 +2755 0 2497 +2755 0 2495 +2754 0 2492 +2754 0 2489 +2754 0 2483 +2754 0 2475 +2754 0 2464 +2754 0 2450 +2754 0 2429 +2754 0 2400 +2754 0 2358 +2754 0 2295 +2754 0 2195 +2754 0 2012 +2754 0 1521 +2754 0 0 +2754 0 0 +2754 2099 0 +2886 2609 0 +3018 2901 0 +3151 3124 0 +3250 3283 0 +3333 3415 0 +3425 3548 0 +3524 3680 0 +3630 3812 0 +3741 3944 0 +3858 4076 0 +3977 4095 0 +2887 0 2628 +2887 0 2628 +2887 0 2627 +2887 0 2626 +2887 0 2625 +2887 0 2623 +2886 0 2620 +2886 0 2616 +2886 0 2610 +2886 0 2602 +2886 0 2591 +2886 0 2576 +2886 0 2555 +2886 0 2526 +2886 0 2483 +2886 0 2419 +2886 0 2317 +2886 0 2129 +2886 0 1606 +2886 0 0 +2886 0 0 +2886 2226 0 +3018 2739 0 +3151 3032 0 +3283 3256 0 +3383 3415 0 +3466 3548 0 +3557 3680 0 +3657 3812 0 +3762 3944 0 +3874 4076 0 +3990 4095 0 +3019 0 2758 +3019 0 2757 +3019 0 2757 +3019 0 2756 +3019 0 2755 +3019 0 2753 +3018 0 2751 +3018 0 2748 +3018 0 2744 +3018 0 2738 +3018 0 2730 +3018 0 2719 +3018 0 2703 +3018 0 2683 +3018 0 2653 +3018 0 2610 +3018 0 2545 +3018 0 2441 +3018 0 2249 +3018 0 1700 +3018 0 0 +3018 0 0 +3018 2354 0 +3151 2871 0 +3283 3164 0 +3415 3387 0 +3515 3548 0 +3598 3680 0 +3690 3812 0 +3789 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2888 +3152 0 2888 +3152 0 2887 +3151 0 2886 +3151 0 2886 +3151 0 2885 +3151 0 2883 +3151 0 2881 +3151 0 2877 +3151 0 2873 +3151 0 2867 +3151 0 2859 +3151 0 2848 +3151 0 2833 +3151 0 2812 +3151 0 2782 +3151 0 2738 +3151 0 2673 +3151 0 2568 +3151 0 2373 +3151 0 1802 +3151 0 0 +3151 0 0 +3151 2484 0 +3283 3001 0 +3415 3295 0 +3548 3519 0 +3648 3680 0 +3731 3812 0 +3822 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3018 +3283 0 3018 +3283 0 3018 +3283 0 3017 +3283 0 3016 +3283 0 3016 +3283 0 3015 +3283 0 3013 +3283 0 3010 +3283 0 3007 +3283 0 3003 +3283 0 2997 +3283 0 2988 +3283 0 2977 +3283 0 2962 +3283 0 2941 +3283 0 2911 +3283 0 2867 +3283 0 2801 +3283 0 2695 +3283 0 2498 +3283 0 1908 +3283 0 0 +3283 0 0 +3283 2614 0 +3415 3133 0 +3548 3427 0 +3680 3651 0 +3781 3812 0 +3863 3944 0 +3954 4076 0 +4054 4095 0 +3416 0 3149 +3416 0 3149 +3416 0 3149 +3416 0 3148 +3416 0 3148 +3416 0 3147 +3415 0 3147 +3415 0 3145 +3415 0 3144 +3415 0 3141 +3415 0 3138 +3415 0 3133 +3415 0 3127 +3415 0 3119 +3415 0 3108 +3415 0 3093 +3415 0 3071 +3415 0 3041 +3415 0 2997 +3415 0 2931 +3415 0 2824 +3415 0 2625 +3415 0 2026 +3415 0 0 +3415 0 0 +3415 2745 0 +3548 3265 0 +3680 3559 0 +3812 3783 0 +3913 3944 0 +3995 4076 0 +4087 4095 0 +3548 0 3280 +3548 0 3280 +3548 0 3280 +3548 0 3280 +3548 0 3280 +3548 0 3279 +3548 0 3279 +3548 0 3278 +3548 0 3276 +3548 0 3274 +3548 0 3272 +3548 0 3269 +3548 0 3264 +3548 0 3258 +3548 0 3250 +3548 0 3239 +3548 0 3223 +3548 0 3202 +3548 0 3172 +3548 0 3128 +3548 0 3061 +3548 0 2954 +3548 0 2754 +3548 0 2141 +3548 0 0 +3548 0 0 +3548 2876 0 +3680 3396 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3412 +3680 0 3412 +3680 0 3412 +3680 0 3412 +3680 0 3411 +3680 0 3411 +3680 0 3411 +3680 0 3410 +3680 0 3409 +3680 0 3407 +3680 0 3406 +3680 0 3403 +3680 0 3400 +3680 0 3395 +3680 0 3389 +3680 0 3381 +3680 0 3370 +3680 0 3354 +3680 0 3333 +3680 0 3303 +3680 0 3258 +3680 0 3192 +3680 0 3084 +3680 0 2883 +3680 0 2266 +3680 0 0 +3680 0 0 +3680 3007 0 +3812 3528 0 +3944 3823 0 +4076 4047 0 +4095 4095 0 +3812 0 3544 +3812 0 3544 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3541 +3812 0 3540 +3812 0 3539 +3812 0 3537 +3812 0 3534 +3812 0 3531 +3812 0 3527 +3812 0 3521 +3812 0 3513 +3812 0 3501 +3812 0 3486 +3812 0 3464 +3812 0 3434 +3812 0 3390 +3812 0 3323 +3812 0 3215 +3812 0 3014 +3812 0 2389 +3812 0 0 +3812 0 0 +3812 3139 0 +3944 3660 0 +4076 3955 0 +4095 4095 0 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3673 +3944 0 3672 +3944 0 3670 +3944 0 3668 +3944 0 3666 +3944 0 3663 +3944 0 3658 +3944 0 3652 +3944 0 3644 +3944 0 3633 +3944 0 3617 +3944 0 3596 +3944 0 3565 +3944 0 3521 +3944 0 3454 +3944 0 3346 +3944 0 3144 +3944 0 2513 +3944 0 0 +3944 0 0 +3944 3270 0 +4076 3792 0 +4095 4087 0 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3802 +4076 0 3800 +4076 0 3798 +4076 0 3794 +4076 0 3790 +4076 0 3784 +4076 0 3776 +4076 0 3764 +4076 0 3749 +4076 0 3727 +4076 0 3697 +4076 0 3653 +4076 0 3586 +4076 0 3477 +4076 0 3274 +4076 0 2639 +4076 0 0 +4076 0 0 +4076 3402 0 +4095 3925 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3935 +4095 0 3934 +4095 0 3932 +4095 0 3930 +4095 0 3927 +4095 0 3922 +4095 0 3916 +4095 0 3908 +4095 0 3896 +4095 0 3881 +4095 0 3859 +4095 0 3829 +4095 0 3784 +4095 0 3718 +4095 0 3609 +4095 0 3406 +4095 0 2770 +4095 0 0 +4095 0 0 +4095 3534 0 +0 792 1025 +0 832 1025 +0 881 1025 +0 939 1025 +0 1006 1025 +0 1025 957 +0 1025 811 +0 1025 488 +0 1160 0 +0 1295 0 +471 1429 0 +897 1563 0 +1167 1696 0 +1381 1828 0 +1565 1961 0 +1733 2094 0 +1890 2226 0 +2040 2358 0 +2185 2491 0 +2327 2623 0 +2466 2755 0 +2603 2887 0 +2738 3019 0 +2873 3152 0 +3008 3284 0 +3141 3416 0 +3275 3548 0 +3408 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 748 1025 +0 800 1020 +0 852 1020 +0 914 1020 +0 985 1020 +0 1020 970 +0 1020 829 +0 1020 524 +0 1157 0 +0 1292 0 +562 1427 0 +935 1561 0 +1188 1695 0 +1394 1828 0 +1574 1961 0 +1739 2093 0 +1894 2226 0 +2043 2358 0 +2187 2491 0 +2328 2623 0 +2467 2755 0 +2604 2887 0 +2739 3019 0 +2874 3152 0 +3008 3283 0 +3141 3416 0 +3275 3548 0 +3408 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 681 1025 +0 740 1020 +0 810 1014 +0 877 1014 +0 954 1014 +0 1014 987 +0 1014 852 +0 1014 568 +0 1152 0 +9 1289 0 +662 1424 0 +981 1559 0 +1216 1693 0 +1412 1827 0 +1586 1960 0 +1748 2093 0 +1900 2225 0 +2047 2358 0 +2190 2490 0 +2331 2623 0 +2469 2755 0 +2605 2887 0 +2740 3019 0 +2875 3152 0 +3008 3283 0 +3142 3416 0 +3275 3548 0 +3408 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 573 1025 +0 647 1020 +0 731 1014 +0 823 1005 +0 908 1005 +0 1002 1005 +0 1005 881 +0 1005 620 +0 1146 0 +346 1284 0 +767 1421 0 +1037 1557 0 +1249 1691 0 +1434 1825 0 +1601 1959 0 +1758 2092 0 +1908 2225 0 +2053 2357 0 +2195 2490 0 +2334 2622 0 +2471 2755 0 +2607 2887 0 +2741 3019 0 +2876 3151 0 +3009 3283 0 +3142 3416 0 +3275 3548 0 +3408 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 371 1025 +0 482 1020 +0 598 1014 +0 717 1005 +298 840 994 +298 947 994 +298 994 917 +298 994 682 +81 1137 80 +587 1278 0 +878 1416 0 +1102 1553 0 +1291 1689 0 +1462 1823 0 +1621 1958 0 +1772 2091 0 +1918 2224 0 +2060 2357 0 +2200 2489 0 +2337 2622 0 +2474 2755 0 +2609 2887 0 +2743 3019 0 +2877 3151 0 +3010 3283 0 +3143 3416 0 +3276 3548 0 +3409 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 0 1025 +0 81 1020 +0 323 1014 +0 523 1005 +298 699 994 +544 862 978 +544 978 960 +544 978 754 +529 1126 430 +787 1270 212 +994 1410 0 +1176 1549 0 +1341 1685 0 +1497 1821 0 +1646 1956 0 +1790 2089 0 +1931 2223 0 +2070 2356 0 +2207 2489 0 +2343 2621 0 +2478 2754 0 +2612 2887 0 +2745 3019 0 +2879 3151 0 +3011 3283 0 +3144 3416 0 +3277 3548 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +0 0 1025 +0 0 1020 +0 0 1014 +0 0 1005 +298 397 994 +544 673 978 +746 890 956 +746 956 834 +805 1110 676 +963 1258 562 +1114 1402 344 +1259 1543 0 +1401 1681 0 +1540 1817 0 +1678 1953 0 +1813 2087 0 +1948 2221 0 +2083 2355 0 +2217 2488 0 +2350 2621 0 +2483 2754 0 +2616 2886 0 +2748 3018 0 +2881 3151 0 +3013 3283 0 +3145 3415 0 +3278 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +488 0 1025 +524 0 1020 +568 0 1014 +620 0 1005 +682 298 994 +754 544 978 +834 746 956 +924 924 924 +1021 1088 878 +1126 1242 809 +1236 1390 695 +1351 1534 476 +1470 1674 0 +1592 1813 0 +1716 1950 0 +1843 2085 0 +1970 2220 0 +2099 2353 0 +2229 2487 0 +2359 2620 0 +2490 2753 0 +2621 2886 0 +2752 3018 0 +2883 3151 0 +3015 3283 0 +3147 3415 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3674 3944 0 +3806 4076 0 +3939 4095 0 +929 0 1160 +943 0 1157 +960 0 1152 +983 0 1146 +1013 80 1137 +1049 430 1126 +1092 676 1110 +1088 878 1021 +1088 967 878 +1242 1225 809 +1343 1390 695 +1437 1534 476 +1537 1674 0 +1644 1813 0 +1757 1950 0 +1873 2085 0 +1994 2220 0 +2117 2353 0 +2242 2487 0 +2369 2620 0 +2497 2753 0 +2626 2886 0 +2756 3018 0 +2887 3151 0 +3017 3283 0 +3149 3415 0 +3280 3548 0 +3412 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1204 0 1295 +1211 0 1292 +1221 0 1289 +1235 0 1284 +1251 0 1278 +1270 212 1266 +1258 562 1211 +1242 809 1126 +1242 809 938 +1242 1018 809 +1390 1313 695 +1531 1534 476 +1614 1674 0 +1706 1813 0 +1806 1950 0 +1912 2085 0 +2023 2220 0 +2140 2353 0 +2260 2487 0 +2382 2620 0 +2507 2753 0 +2634 2886 0 +2762 3018 0 +2891 3151 0 +3021 3283 0 +3151 3415 0 +3282 3548 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1419 0 1429 +1424 0 1427 +1424 0 1418 +1421 0 1403 +1416 0 1381 +1410 0 1350 +1402 344 1304 +1390 695 1236 +1390 695 1095 +1390 695 793 +1390 1078 695 +1534 1409 476 +1674 1648 0 +1777 1813 0 +1864 1950 0 +1958 2085 0 +2060 2220 0 +2168 2353 0 +2282 2487 0 +2399 2620 0 +2521 2753 0 +2644 2886 0 +2769 3018 0 +2896 3151 0 +3025 3283 0 +3154 3415 0 +3284 3548 0 +3415 3680 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1563 0 1515 +1561 0 1508 +1559 0 1499 +1557 0 1486 +1553 0 1467 +1549 0 1442 +1543 0 1405 +1534 476 1351 +1534 476 1246 +1534 476 1051 +1534 476 479 +1534 1149 476 +1674 1512 0 +1813 1763 0 +1931 1950 0 +2014 2085 0 +2105 2220 0 +2204 2353 0 +2310 2487 0 +2421 2620 0 +2537 2753 0 +2657 2886 0 +2779 3018 0 +2904 3151 0 +3031 3283 0 +3158 3415 0 +3287 3548 0 +3417 3680 0 +3548 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1696 0 1601 +1695 0 1596 +1693 0 1588 +1691 0 1577 +1689 0 1562 +1685 0 1541 +1681 0 1512 +1674 0 1470 +1674 0 1391 +1674 0 1258 +1674 0 983 +1674 313 0 +1674 1228 0 +1813 1622 0 +1950 1882 0 +2079 2085 0 +2159 2220 0 +2248 2353 0 +2345 2487 0 +2449 2620 0 +2559 2753 0 +2673 2886 0 +2792 3018 0 +2914 3151 0 +3038 3283 0 +3164 3415 0 +3292 3548 0 +3420 3680 0 +3550 3812 0 +3680 3944 0 +3810 4076 0 +3942 4095 0 +1828 0 1696 +1828 0 1691 +1827 0 1684 +1825 0 1676 +1823 0 1664 +1821 0 1648 +1817 0 1625 +1813 0 1592 +1813 0 1533 +1813 0 1440 +1813 0 1275 +1813 0 874 +1813 0 0 +1813 1317 0 +1950 1736 0 +2085 2004 0 +2220 2217 0 +2301 2353 0 +2388 2487 0 +2483 2620 0 +2586 2753 0 +2695 2886 0 +2808 3018 0 +2927 3151 0 +3047 3283 0 +3171 3415 0 +3297 3548 0 +3425 3680 0 +3553 3812 0 +3682 3944 0 +3812 4076 0 +3943 4095 0 +1961 0 1797 +1961 0 1793 +1960 0 1789 +1959 0 1781 +1958 0 1772 +1956 0 1759 +1953 0 1742 +1950 0 1716 +1950 0 1672 +1950 0 1606 +1950 0 1498 +1950 0 1295 +1950 0 670 +1950 0 0 +1950 1413 0 +2085 1854 0 +2220 2128 0 +2353 2344 0 +2440 2487 0 +2526 2620 0 +2620 2753 0 +2722 2886 0 +2830 3018 0 +2943 3151 0 +3060 3283 0 +3181 3415 0 +3305 3548 0 +3430 3680 0 +3557 3812 0 +3686 3944 0 +3815 4076 0 +3945 4095 0 +2094 0 1905 +2093 0 1902 +2093 0 1898 +2092 0 1893 +2091 0 1885 +2089 0 1875 +2087 0 1862 +2085 0 1843 +2085 0 1810 +2085 0 1761 +2085 0 1687 +2085 0 1565 +2085 0 1322 +2085 0 10 +2085 0 0 +2085 1517 0 +2220 1975 0 +2353 2255 0 +2487 2473 0 +2577 2620 0 +2662 2753 0 +2756 2886 0 +2857 3018 0 +2964 3151 0 +3077 3283 0 +3194 3415 0 +3314 3548 0 +3437 3680 0 +3563 3812 0 +3690 3944 0 +3818 4076 0 +3947 4095 0 +2226 0 2018 +2226 0 2016 +2225 0 2013 +2225 0 2009 +2224 0 2003 +2223 0 1995 +2221 0 1985 +2220 0 1970 +2220 0 1946 +2220 0 1910 +2220 0 1858 +2220 0 1778 +2220 0 1642 +2220 0 1355 +2220 0 0 +2220 0 0 +2220 1626 0 +2353 2099 0 +2487 2383 0 +2620 2602 0 +2713 2753 0 +2798 2886 0 +2890 3018 0 +2991 3151 0 +3098 3283 0 +3210 3415 0 +3327 3548 0 +3447 3680 0 +3570 3812 0 +3695 3944 0 +3822 4076 0 +3950 4095 0 +2358 0 2136 +2358 0 2134 +2358 0 2132 +2357 0 2128 +2357 0 2124 +2356 0 2118 +2355 0 2110 +2353 0 2099 +2353 0 2081 +2353 0 2054 +2353 0 2017 +2353 0 1962 +2353 0 1876 +2353 0 1727 +2353 0 1396 +2353 0 0 +2353 0 0 +2353 1740 0 +2487 2226 0 +2620 2511 0 +2753 2732 0 +2848 2886 0 +2932 3018 0 +3025 3151 0 +3125 3283 0 +3231 3415 0 +3343 3548 0 +3460 3680 0 +3580 3812 0 +3703 3944 0 +3828 4076 0 +3955 4095 0 +2491 0 2256 +2491 0 2255 +2490 0 2253 +2490 0 2251 +2489 0 2247 +2489 0 2243 +2488 0 2237 +2487 0 2229 +2487 0 2215 +2487 0 2196 +2487 0 2169 +2487 0 2130 +2487 0 2072 +2487 0 1981 +2487 0 1822 +2487 0 1446 +2487 0 0 +2487 0 0 +2487 1859 0 +2620 2352 0 +2753 2641 0 +2886 2863 0 +2982 3018 0 +3066 3151 0 +3158 3283 0 +3258 3415 0 +3364 3548 0 +3476 3680 0 +3593 3812 0 +3712 3944 0 +3835 4076 0 +3960 4095 0 +2623 0 2380 +2623 0 2379 +2623 0 2378 +2622 0 2375 +2622 0 2373 +2621 0 2370 +2621 0 2365 +2620 0 2359 +2620 0 2348 +2620 0 2334 +2620 0 2314 +2620 0 2287 +2620 0 2247 +2620 0 2187 +2620 0 2092 +2620 0 1923 +2620 0 1505 +2620 0 0 +2620 0 0 +2620 1981 0 +2753 2482 0 +2886 2772 0 +3018 2993 0 +3116 3151 0 +3199 3283 0 +3291 3415 0 +3391 3548 0 +3497 3680 0 +3609 3812 0 +3725 3944 0 +3845 4076 0 +3968 4095 0 +2755 0 2505 +2755 0 2505 +2755 0 2504 +2755 0 2502 +2755 0 2501 +2754 0 2498 +2754 0 2494 +2753 0 2490 +2753 0 2482 +2753 0 2471 +2753 0 2457 +2753 0 2437 +2753 0 2408 +2753 0 2367 +2753 0 2305 +2753 0 2208 +2753 0 2031 +2753 0 1575 +2753 0 0 +2753 0 0 +2753 2105 0 +2886 2611 0 +3018 2902 0 +3151 3125 0 +3249 3283 0 +3333 3415 0 +3424 3548 0 +3524 3680 0 +3630 3812 0 +3741 3944 0 +3857 4076 0 +3977 4095 0 +2887 0 2633 +2887 0 2632 +2887 0 2631 +2887 0 2630 +2887 0 2629 +2887 0 2627 +2886 0 2624 +2886 0 2621 +2886 0 2615 +2886 0 2607 +2886 0 2596 +2886 0 2581 +2886 0 2561 +2886 0 2532 +2886 0 2490 +2886 0 2427 +2886 0 2327 +2886 0 2144 +2886 0 1651 +2886 0 0 +2886 0 0 +2886 2231 0 +3018 2740 0 +3151 3033 0 +3283 3256 0 +3382 3415 0 +3466 3548 0 +3557 3680 0 +3656 3812 0 +3762 3944 0 +3873 4076 0 +3990 4095 0 +3019 0 2761 +3019 0 2760 +3019 0 2760 +3019 0 2759 +3019 0 2758 +3019 0 2756 +3018 0 2754 +3018 0 2752 +3018 0 2747 +3018 0 2742 +3018 0 2734 +3018 0 2723 +3018 0 2708 +3018 0 2687 +3018 0 2658 +3018 0 2615 +3018 0 2551 +3018 0 2449 +3018 0 2261 +3018 0 1737 +3018 0 0 +3018 0 0 +3018 2358 0 +3151 2872 0 +3283 3164 0 +3415 3388 0 +3515 3548 0 +3598 3680 0 +3690 3812 0 +3789 3944 0 +3895 4076 0 +4006 4095 0 +3152 0 2890 +3152 0 2890 +3152 0 2890 +3151 0 2889 +3151 0 2888 +3151 0 2887 +3151 0 2885 +3151 0 2883 +3151 0 2880 +3151 0 2876 +3151 0 2870 +3151 0 2862 +3151 0 2851 +3151 0 2836 +3151 0 2815 +3151 0 2785 +3151 0 2742 +3151 0 2678 +3151 0 2573 +3151 0 2382 +3151 0 1832 +3151 0 0 +3151 0 0 +3151 2487 0 +3283 3002 0 +3415 3296 0 +3548 3520 0 +3648 3680 0 +3730 3812 0 +3822 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3020 +3283 0 3020 +3283 0 3019 +3283 0 3019 +3283 0 3018 +3283 0 3018 +3283 0 3016 +3283 0 3015 +3283 0 3013 +3283 0 3009 +3283 0 3005 +3283 0 2999 +3283 0 2991 +3283 0 2980 +3283 0 2965 +3283 0 2943 +3283 0 2914 +3283 0 2870 +3283 0 2805 +3283 0 2700 +3283 0 2504 +3283 0 1932 +3283 0 0 +3283 0 0 +3283 2616 0 +3415 3134 0 +3548 3428 0 +3680 3652 0 +3780 3812 0 +3863 3944 0 +3954 4076 0 +4053 4095 0 +3416 0 3151 +3416 0 3151 +3416 0 3150 +3416 0 3150 +3416 0 3149 +3416 0 3149 +3415 0 3148 +3415 0 3147 +3415 0 3145 +3415 0 3143 +3415 0 3139 +3415 0 3135 +3415 0 3129 +3415 0 3121 +3415 0 3110 +3415 0 3094 +3415 0 3073 +3415 0 3043 +3415 0 2999 +3415 0 2934 +3415 0 2827 +3415 0 2630 +3415 0 2044 +3415 0 0 +3415 0 0 +3415 2746 0 +3548 3265 0 +3680 3559 0 +3812 3784 0 +3912 3944 0 +3995 4076 0 +4087 4095 0 +3548 0 3281 +3548 0 3281 +3548 0 3281 +3548 0 3281 +3548 0 3280 +3548 0 3280 +3548 0 3280 +3548 0 3279 +3548 0 3277 +3548 0 3276 +3548 0 3273 +3548 0 3270 +3548 0 3265 +3548 0 3259 +3548 0 3251 +3548 0 3240 +3548 0 3225 +3548 0 3203 +3548 0 3173 +3548 0 3129 +3548 0 3063 +3548 0 2956 +3548 0 2758 +3548 0 2156 +3548 0 0 +3548 0 0 +3548 2877 0 +3680 3397 0 +3812 3691 0 +3944 3915 0 +4045 4076 0 +4095 4095 0 +3680 0 3413 +3680 0 3413 +3680 0 3413 +3680 0 3412 +3680 0 3412 +3680 0 3412 +3680 0 3411 +3680 0 3411 +3680 0 3410 +3680 0 3408 +3680 0 3406 +3680 0 3404 +3680 0 3401 +3680 0 3396 +3680 0 3390 +3680 0 3382 +3680 0 3371 +3680 0 3356 +3680 0 3334 +3680 0 3304 +3680 0 3260 +3680 0 3193 +3680 0 3086 +3680 0 2886 +3680 0 2277 +3680 0 0 +3680 0 0 +3680 3008 0 +3812 3529 0 +3944 3823 0 +4076 4047 0 +4095 4095 0 +3812 0 3544 +3812 0 3544 +3812 0 3544 +3812 0 3544 +3812 0 3544 +3812 0 3543 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3541 +3812 0 3540 +3812 0 3538 +3812 0 3535 +3812 0 3532 +3812 0 3528 +3812 0 3521 +3812 0 3513 +3812 0 3502 +3812 0 3487 +3812 0 3465 +3812 0 3435 +3812 0 3391 +3812 0 3324 +3812 0 3216 +3812 0 3016 +3812 0 2397 +3812 0 0 +3812 0 0 +3812 3139 0 +3944 3660 0 +4076 3955 0 +4095 4095 0 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3675 +3944 0 3675 +3944 0 3675 +3944 0 3674 +3944 0 3674 +3944 0 3673 +3944 0 3672 +3944 0 3671 +3944 0 3669 +3944 0 3666 +3944 0 3663 +3944 0 3659 +3944 0 3653 +3944 0 3645 +3944 0 3633 +3944 0 3618 +3944 0 3596 +3944 0 3566 +3944 0 3522 +3944 0 3455 +3944 0 3347 +3944 0 3145 +3944 0 2520 +3944 0 0 +3944 0 0 +3944 3271 0 +4076 3792 0 +4095 4087 0 +4076 0 3808 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3806 +4076 0 3806 +4076 0 3805 +4076 0 3805 +4076 0 3804 +4076 0 3802 +4076 0 3801 +4076 0 3798 +4076 0 3795 +4076 0 3790 +4076 0 3784 +4076 0 3776 +4076 0 3765 +4076 0 3749 +4076 0 3728 +4076 0 3697 +4076 0 3653 +4076 0 3586 +4076 0 3478 +4076 0 3276 +4076 0 2644 +4076 0 0 +4076 0 0 +4076 3402 0 +4095 3925 0 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3936 +4095 0 3934 +4095 0 3932 +4095 0 3930 +4095 0 3927 +4095 0 3922 +4095 0 3916 +4095 0 3908 +4095 0 3897 +4095 0 3881 +4095 0 3860 +4095 0 3829 +4095 0 3785 +4095 0 3718 +4095 0 3610 +4095 0 3407 +4095 0 2773 +4095 0 0 +4095 0 0 +4095 3534 0 +0 918 1160 +0 949 1160 +0 987 1160 +0 1033 1160 +0 1089 1160 +0 1154 1160 +0 1160 1079 +0 1160 929 +0 1160 592 +0 1295 0 +0 1429 0 +523 1563 0 +998 1696 0 +1283 1828 0 +1503 1961 0 +1691 2094 0 +1860 2226 0 +2019 2358 0 +2170 2491 0 +2315 2623 0 +2457 2755 0 +2597 2887 0 +2734 3019 0 +2870 3152 0 +3005 3284 0 +3139 3416 0 +3273 3548 0 +3406 3680 0 +3540 3812 0 +3672 3944 0 +3805 4076 0 +3937 4095 0 +0 885 1160 +0 924 1157 +0 964 1157 +0 1013 1157 +0 1071 1157 +0 1139 1157 +0 1157 1089 +0 1157 943 +0 1157 620 +0 1292 0 +0 1427 0 +605 1561 0 +1029 1695 0 +1300 1828 0 +1513 1961 0 +1698 2093 0 +1865 2226 0 +2022 2358 0 +2172 2491 0 +2317 2623 0 +2459 2755 0 +2598 2887 0 +2735 3019 0 +2871 3152 0 +3005 3283 0 +3140 3416 0 +3273 3548 0 +3407 3680 0 +3540 3812 0 +3672 3944 0 +3805 4076 0 +3937 4095 0 +0 836 1160 +0 879 1157 +0 932 1152 +0 984 1152 +0 1045 1152 +0 1117 1152 +0 1152 1102 +0 1152 960 +0 1152 656 +0 1289 0 +0 1424 0 +696 1559 0 +1067 1693 0 +1321 1827 0 +1526 1960 0 +1706 2093 0 +1871 2225 0 +2027 2358 0 +2175 2490 0 +2320 2623 0 +2460 2755 0 +2599 2887 0 +2735 3019 0 +2871 3152 0 +3006 3283 0 +3140 3416 0 +3274 3548 0 +3407 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3937 4095 0 +0 762 1160 +0 813 1157 +0 873 1152 +0 942 1146 +0 1009 1146 +0 1086 1146 +0 1146 1119 +0 1146 983 +0 1146 700 +0 1284 0 +141 1421 0 +794 1557 0 +1113 1691 0 +1348 1825 0 +1544 1959 0 +1718 2092 0 +1880 2225 0 +2032 2357 0 +2180 2490 0 +2323 2622 0 +2463 2755 0 +2601 2887 0 +2737 3019 0 +2872 3151 0 +3007 3283 0 +3141 3416 0 +3274 3548 0 +3407 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 640 1160 +0 705 1157 +0 779 1152 +0 863 1146 +80 955 1137 +80 1040 1137 +80 1134 1137 +80 1137 1013 +80 1137 753 +0 1278 0 +478 1416 0 +900 1553 0 +1169 1689 0 +1382 1823 0 +1566 1958 0 +1733 2091 0 +1891 2224 0 +2040 2357 0 +2185 2489 0 +2327 2622 0 +2466 2755 0 +2603 2887 0 +2738 3019 0 +2873 3151 0 +3008 3283 0 +3141 3416 0 +3275 3548 0 +3408 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 397 1160 +0 503 1157 +0 614 1152 +0 730 1146 +80 850 1137 +430 972 1126 +430 1079 1126 +430 1126 1049 +430 1126 814 +214 1270 212 +719 1410 0 +1011 1549 0 +1233 1685 0 +1423 1821 0 +1594 1956 0 +1753 2089 0 +1904 2223 0 +2050 2356 0 +2193 2489 0 +2332 2621 0 +2470 2754 0 +2606 2887 0 +2741 3019 0 +2875 3151 0 +3009 3283 0 +3142 3416 0 +3275 3548 0 +3408 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 0 1160 +0 0 1157 +0 214 1152 +0 455 1146 +80 655 1137 +430 831 1126 +676 994 1110 +676 1110 1092 +676 1110 886 +661 1258 562 +919 1402 344 +1127 1543 0 +1308 1681 0 +1474 1817 0 +1629 1953 0 +1778 2087 0 +1922 2221 0 +2063 2355 0 +2202 2488 0 +2339 2621 0 +2475 2754 0 +2610 2886 0 +2744 3018 0 +2877 3151 0 +3010 3283 0 +3144 3415 0 +3276 3548 0 +3409 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 0 1160 +0 0 1157 +0 0 1152 +0 0 1146 +80 81 1137 +430 529 1126 +676 805 1110 +878 1021 1088 +878 1088 967 +938 1242 809 +1095 1390 695 +1246 1534 476 +1391 1674 0 +1533 1813 0 +1672 1950 0 +1810 2085 0 +1946 2220 0 +2081 2353 0 +2215 2487 0 +2348 2620 0 +2482 2753 0 +2615 2886 0 +2747 3018 0 +2880 3151 0 +3013 3283 0 +3145 3415 0 +3277 3548 0 +3410 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +592 0 1160 +620 0 1157 +656 0 1152 +700 0 1146 +753 80 1137 +814 430 1126 +886 676 1110 +967 878 1088 +1056 1056 1056 +1154 1220 1010 +1258 1374 940 +1368 1523 826 +1483 1666 608 +1602 1807 0 +1724 1945 0 +1849 2082 0 +1975 2217 0 +2102 2352 0 +2231 2486 0 +2361 2619 0 +2491 2752 0 +2622 2885 0 +2752 3018 0 +2884 3151 0 +3015 3283 0 +3147 3415 0 +3279 3548 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1051 0 1295 +1062 0 1292 +1075 0 1289 +1093 0 1284 +1116 0 1278 +1145 212 1270 +1181 562 1258 +1225 809 1242 +1220 1010 1154 +1220 1099 1010 +1374 1357 940 +1476 1523 826 +1569 1666 608 +1669 1807 0 +1776 1945 0 +1889 2082 0 +2006 2217 0 +2126 2352 0 +2249 2486 0 +2374 2619 0 +2501 2752 0 +2629 2885 0 +2758 3018 0 +2888 3151 0 +3018 3283 0 +3150 3415 0 +3281 3548 0 +3412 3680 0 +3544 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1330 0 1429 +1336 0 1427 +1343 0 1424 +1353 0 1421 +1367 0 1416 +1383 0 1410 +1402 344 1398 +1390 695 1343 +1374 940 1258 +1374 940 1069 +1374 1150 940 +1523 1445 826 +1663 1666 608 +1746 1807 0 +1838 1945 0 +1938 2082 0 +2044 2217 0 +2155 2352 0 +2272 2486 0 +2392 2619 0 +2514 2752 0 +2639 2885 0 +2766 3018 0 +2894 3151 0 +3023 3283 0 +3153 3415 0 +3283 3548 0 +3414 3680 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1548 0 1563 +1552 0 1561 +1556 0 1559 +1557 0 1551 +1553 0 1535 +1549 0 1513 +1543 0 1482 +1534 476 1437 +1523 826 1368 +1523 826 1228 +1523 826 926 +1523 1211 826 +1666 1541 608 +1807 1780 0 +1909 1945 0 +1996 2082 0 +2090 2217 0 +2192 2352 0 +2301 2486 0 +2414 2619 0 +2532 2752 0 +2652 2885 0 +2776 3018 0 +2902 3151 0 +3029 3283 0 +3157 3415 0 +3286 3548 0 +3416 3680 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1696 0 1653 +1695 0 1647 +1693 0 1640 +1691 0 1631 +1689 0 1617 +1685 0 1599 +1681 0 1574 +1674 0 1537 +1666 608 1483 +1666 608 1378 +1666 608 1183 +1666 609 608 +1666 1281 608 +1807 1644 0 +1945 1895 0 +2063 2082 0 +2146 2217 0 +2237 2352 0 +2336 2486 0 +2442 2619 0 +2553 2752 0 +2669 2885 0 +2789 3018 0 +2911 3151 0 +3036 3283 0 +3163 3415 0 +3291 3548 0 +3420 3680 0 +3549 3812 0 +3680 3944 0 +3810 4076 0 +3941 4095 0 +1828 0 1738 +1828 0 1733 +1827 0 1727 +1825 0 1720 +1823 0 1709 +1821 0 1694 +1817 0 1673 +1813 0 1644 +1807 0 1602 +1807 0 1523 +1807 0 1391 +1807 0 1115 +1807 438 0 +1807 1360 0 +1945 1754 0 +2082 2014 0 +2211 2217 0 +2291 2352 0 +2380 2486 0 +2477 2619 0 +2581 2752 0 +2691 2885 0 +2805 3018 0 +2924 3151 0 +3046 3283 0 +3170 3415 0 +3296 3548 0 +3424 3680 0 +3552 3812 0 +3682 3944 0 +3812 4076 0 +3943 4095 0 +1961 0 1831 +1961 0 1828 +1960 0 1823 +1959 0 1817 +1958 0 1808 +1956 0 1796 +1953 0 1779 +1950 0 1757 +1945 0 1724 +1945 0 1665 +1945 0 1572 +1945 0 1407 +1945 0 1007 +1945 37 0 +1945 1449 0 +2082 1868 0 +2217 2136 0 +2352 2349 0 +2433 2486 0 +2520 2619 0 +2616 2752 0 +2718 2885 0 +2827 3018 0 +2941 3151 0 +3059 3283 0 +3180 3415 0 +3303 3548 0 +3429 3680 0 +3557 3812 0 +3685 3944 0 +3814 4076 0 +3945 4095 0 +2094 0 1932 +2093 0 1929 +2093 0 1926 +2092 0 1920 +2091 0 1913 +2089 0 1904 +2087 0 1891 +2085 0 1873 +2082 0 1849 +2082 0 1804 +2082 0 1738 +2082 0 1630 +2082 0 1428 +2082 0 800 +2082 0 0 +2082 1545 0 +2217 1986 0 +2352 2261 0 +2486 2476 0 +2572 2619 0 +2658 2752 0 +2752 2885 0 +2854 3018 0 +2962 3151 0 +3075 3283 0 +3192 3415 0 +3313 3548 0 +3437 3680 0 +3562 3812 0 +3689 3944 0 +3818 4076 0 +3947 4095 0 +2226 0 2039 +2226 0 2037 +2225 0 2034 +2225 0 2030 +2224 0 2025 +2223 0 2018 +2221 0 2008 +2220 0 1994 +2217 0 1975 +2217 0 1941 +2217 0 1894 +2217 0 1819 +2217 0 1697 +2217 0 1454 +2217 0 140 +2217 0 0 +2217 1649 0 +2352 2107 0 +2486 2387 0 +2619 2604 0 +2710 2752 0 +2795 2885 0 +2888 3018 0 +2989 3151 0 +3096 3283 0 +3209 3415 0 +3326 3548 0 +3446 3680 0 +3570 3812 0 +3695 3944 0 +3822 4076 0 +3950 4095 0 +2358 0 2152 +2358 0 2150 +2358 0 2148 +2357 0 2145 +2357 0 2141 +2356 0 2135 +2355 0 2127 +2353 0 2117 +2352 0 2102 +2352 0 2078 +2352 0 2042 +2352 0 1990 +2352 0 1910 +2352 0 1773 +2352 0 1487 +2352 0 0 +2352 0 0 +2352 1758 0 +2486 2232 0 +2619 2515 0 +2752 2734 0 +2845 2885 0 +2930 3018 0 +3023 3151 0 +3123 3283 0 +3230 3415 0 +3342 3548 0 +3459 3680 0 +3579 3812 0 +3702 3944 0 +3827 4076 0 +3954 4095 0 +2491 0 2269 +2491 0 2268 +2490 0 2266 +2490 0 2264 +2489 0 2260 +2489 0 2256 +2488 0 2250 +2487 0 2242 +2486 0 2231 +2486 0 2213 +2486 0 2187 +2486 0 2149 +2486 0 2094 +2486 0 2008 +2486 0 1859 +2486 0 1529 +2486 0 0 +2486 0 0 +2486 1873 0 +2619 2357 0 +2752 2644 0 +2885 2864 0 +2980 3018 0 +3064 3151 0 +3157 3283 0 +3257 3415 0 +3363 3548 0 +3475 3680 0 +3592 3812 0 +3712 3944 0 +3835 4076 0 +3960 4095 0 +2623 0 2390 +2623 0 2388 +2623 0 2387 +2622 0 2385 +2622 0 2383 +2621 0 2380 +2621 0 2375 +2620 0 2369 +2619 0 2361 +2619 0 2347 +2619 0 2328 +2619 0 2301 +2619 0 2262 +2619 0 2204 +2619 0 2113 +2619 0 1954 +2619 0 1578 +2619 0 0 +2619 0 0 +2619 1991 0 +2752 2485 0 +2885 2773 0 +3018 2995 0 +3115 3151 0 +3198 3283 0 +3290 3415 0 +3390 3548 0 +3496 3680 0 +3608 3812 0 +3725 3944 0 +3845 4076 0 +3967 4095 0 +2755 0 2513 +2755 0 2512 +2755 0 2511 +2755 0 2510 +2755 0 2508 +2754 0 2505 +2754 0 2502 +2753 0 2497 +2752 0 2491 +2752 0 2481 +2752 0 2467 +2752 0 2447 +2752 0 2419 +2752 0 2379 +2752 0 2319 +2752 0 2224 +2752 0 2056 +2752 0 1638 +2752 0 0 +2752 0 0 +2752 2113 0 +2885 2613 0 +3018 2903 0 +3151 3126 0 +3248 3283 0 +3331 3415 0 +3423 3548 0 +3523 3680 0 +3629 3812 0 +3741 3944 0 +3857 4076 0 +3977 4095 0 +2887 0 2638 +2887 0 2638 +2887 0 2637 +2887 0 2636 +2887 0 2635 +2887 0 2632 +2886 0 2630 +2886 0 2626 +2885 0 2622 +2885 0 2614 +2885 0 2603 +2885 0 2589 +2885 0 2569 +2885 0 2540 +2885 0 2499 +2885 0 2438 +2885 0 2340 +2885 0 2163 +2885 0 1706 +2885 0 0 +2885 0 0 +2885 2237 0 +3018 2742 0 +3151 3034 0 +3283 3257 0 +3381 3415 0 +3465 3548 0 +3556 3680 0 +3656 3812 0 +3762 3944 0 +3873 4076 0 +3989 4095 0 +3019 0 2765 +3019 0 2765 +3019 0 2764 +3019 0 2763 +3019 0 2762 +3019 0 2761 +3018 0 2759 +3018 0 2756 +3018 0 2752 +3018 0 2747 +3018 0 2739 +3018 0 2728 +3018 0 2714 +3018 0 2693 +3018 0 2664 +3018 0 2622 +3018 0 2559 +3018 0 2459 +3018 0 2276 +3018 0 1782 +3018 0 0 +3018 0 0 +3018 2362 0 +3151 2873 0 +3283 3165 0 +3415 3388 0 +3514 3548 0 +3597 3680 0 +3689 3812 0 +3788 3944 0 +3894 4076 0 +4006 4095 0 +3152 0 2893 +3152 0 2893 +3152 0 2893 +3151 0 2892 +3151 0 2891 +3151 0 2890 +3151 0 2889 +3151 0 2887 +3151 0 2884 +3151 0 2880 +3151 0 2874 +3151 0 2866 +3151 0 2855 +3151 0 2840 +3151 0 2819 +3151 0 2790 +3151 0 2747 +3151 0 2684 +3151 0 2581 +3151 0 2394 +3151 0 1869 +3151 0 0 +3151 0 0 +3151 2490 0 +3283 3003 0 +3415 3296 0 +3548 3520 0 +3647 3680 0 +3730 3812 0 +3822 3944 0 +3921 4076 0 +4027 4095 0 +3284 0 3022 +3283 0 3022 +3283 0 3022 +3283 0 3021 +3283 0 3021 +3283 0 3020 +3283 0 3019 +3283 0 3017 +3283 0 3015 +3283 0 3012 +3283 0 3008 +3283 0 3002 +3283 0 2994 +3283 0 2983 +3283 0 2968 +3283 0 2947 +3283 0 2917 +3283 0 2874 +3283 0 2809 +3283 0 2705 +3283 0 2513 +3283 0 1962 +3283 0 0 +3283 0 0 +3283 2619 0 +3415 3135 0 +3548 3428 0 +3680 3652 0 +3780 3812 0 +3863 3944 0 +3954 4076 0 +4053 4095 0 +3416 0 3152 +3416 0 3152 +3416 0 3152 +3416 0 3151 +3416 0 3151 +3416 0 3151 +3415 0 3150 +3415 0 3149 +3415 0 3147 +3415 0 3145 +3415 0 3141 +3415 0 3137 +3415 0 3131 +3415 0 3123 +3415 0 3112 +3415 0 3097 +3415 0 3076 +3415 0 3046 +3415 0 3002 +3415 0 2937 +3415 0 2832 +3415 0 2637 +3415 0 2068 +3415 0 0 +3415 0 0 +3415 2748 0 +3548 3266 0 +3680 3560 0 +3812 3784 0 +3912 3944 0 +3995 4076 0 +4086 4095 0 +3548 0 3283 +3548 0 3283 +3548 0 3282 +3548 0 3282 +3548 0 3282 +3548 0 3281 +3548 0 3281 +3548 0 3280 +3548 0 3279 +3548 0 3277 +3548 0 3275 +3548 0 3271 +3548 0 3267 +3548 0 3261 +3548 0 3253 +3548 0 3242 +3548 0 3226 +3548 0 3205 +3548 0 3175 +3548 0 3132 +3548 0 3066 +3548 0 2960 +3548 0 2763 +3548 0 2174 +3548 0 0 +3548 0 0 +3548 2878 0 +3680 3397 0 +3812 3691 0 +3944 3915 0 +4044 4076 0 +4095 4095 0 +3680 0 3414 +3680 0 3414 +3680 0 3414 +3680 0 3413 +3680 0 3413 +3680 0 3413 +3680 0 3412 +3680 0 3412 +3680 0 3411 +3680 0 3409 +3680 0 3408 +3680 0 3405 +3680 0 3402 +3680 0 3397 +3680 0 3392 +3680 0 3383 +3680 0 3372 +3680 0 3357 +3680 0 3336 +3680 0 3305 +3680 0 3261 +3680 0 3195 +3680 0 3089 +3680 0 2890 +3680 0 2291 +3680 0 0 +3680 0 0 +3680 3009 0 +3812 3529 0 +3944 3823 0 +4076 4047 0 +4095 4095 0 +3812 0 3545 +3812 0 3545 +3812 0 3545 +3812 0 3545 +3812 0 3544 +3812 0 3544 +3812 0 3544 +3812 0 3543 +3812 0 3543 +3812 0 3542 +3812 0 3540 +3812 0 3538 +3812 0 3536 +3812 0 3533 +3812 0 3528 +3812 0 3522 +3812 0 3514 +3812 0 3503 +3812 0 3488 +3812 0 3466 +3812 0 3436 +3812 0 3392 +3812 0 3326 +3812 0 3218 +3812 0 3019 +3812 0 2408 +3812 0 0 +3812 0 0 +3812 3140 0 +3944 3661 0 +4076 3955 0 +4095 4095 0 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3675 +3944 0 3675 +3944 0 3674 +3944 0 3673 +3944 0 3671 +3944 0 3670 +3944 0 3667 +3944 0 3664 +3944 0 3659 +3944 0 3653 +3944 0 3645 +3944 0 3634 +3944 0 3619 +3944 0 3597 +3944 0 3567 +3944 0 3523 +3944 0 3456 +3944 0 3349 +3944 0 3147 +3944 0 2528 +3944 0 0 +3944 0 0 +3944 3271 0 +4076 3792 0 +4095 4087 0 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3807 +4076 0 3807 +4076 0 3807 +4076 0 3806 +4076 0 3805 +4076 0 3804 +4076 0 3803 +4076 0 3801 +4076 0 3798 +4076 0 3795 +4076 0 3791 +4076 0 3785 +4076 0 3777 +4076 0 3765 +4076 0 3750 +4076 0 3728 +4076 0 3698 +4076 0 3654 +4076 0 3587 +4076 0 3479 +4076 0 3277 +4076 0 2650 +4076 0 0 +4076 0 0 +4076 3403 0 +4095 3925 0 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3938 +4095 0 3937 +4095 0 3936 +4095 0 3935 +4095 0 3933 +4095 0 3930 +4095 0 3927 +4095 0 3923 +4095 0 3917 +4095 0 3908 +4095 0 3897 +4095 0 3881 +4095 0 3860 +4095 0 3830 +4095 0 3786 +4095 0 3719 +4095 0 3611 +4095 0 3408 +4095 0 2778 +4095 0 0 +4095 0 0 +4095 3534 0 +0 1046 1295 +0 1069 1295 +0 1099 1295 +0 1135 1295 +0 1181 1295 +0 1234 1295 +0 1295 1292 +0 1295 1204 +0 1295 1051 +0 1295 702 +0 1429 0 +0 1563 0 +580 1696 0 +1106 1828 0 +1402 1961 0 +1626 2094 0 +1817 2226 0 +1989 2358 0 +2149 2491 0 +2300 2623 0 +2446 2755 0 +2589 2887 0 +2728 3019 0 +2866 3152 0 +3002 3284 0 +3137 3416 0 +3271 3548 0 +3405 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 1021 1295 +0 1050 1292 +0 1081 1292 +0 1119 1292 +0 1166 1292 +0 1221 1292 +0 1286 1292 +0 1292 1211 +0 1292 1062 +0 1292 724 +0 1427 0 +0 1561 0 +653 1695 0 +1131 1828 0 +1415 1961 0 +1635 2093 0 +1823 2226 0 +1993 2358 0 +2151 2491 0 +2302 2623 0 +2448 2755 0 +2589 2887 0 +2729 3019 0 +2866 3152 0 +3002 3283 0 +3137 3416 0 +3272 3548 0 +3405 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 985 1295 +0 1017 1292 +0 1056 1289 +0 1096 1289 +0 1145 1289 +0 1203 1289 +0 1271 1289 +0 1289 1221 +0 1289 1075 +0 1289 753 +0 1424 0 +0 1559 0 +736 1693 0 +1161 1827 0 +1431 1960 0 +1645 2093 0 +1829 2225 0 +1997 2358 0 +2154 2490 0 +2304 2623 0 +2449 2755 0 +2591 2887 0 +2729 3019 0 +2867 3152 0 +3002 3283 0 +3138 3416 0 +3272 3548 0 +3405 3680 0 +3539 3812 0 +3672 3944 0 +3804 4076 0 +3937 4095 0 +0 934 1295 +0 968 1292 +0 1012 1289 +0 1064 1284 +0 1116 1284 +0 1177 1284 +0 1249 1284 +0 1284 1235 +0 1284 1093 +0 1284 788 +0 1421 0 +0 1557 0 +827 1691 0 +1199 1825 0 +1453 1959 0 +1658 2092 0 +1839 2225 0 +2004 2357 0 +2159 2490 0 +2308 2622 0 +2452 2755 0 +2592 2887 0 +2731 3019 0 +2868 3151 0 +3003 3283 0 +3138 3416 0 +3272 3548 0 +3406 3680 0 +3539 3812 0 +3672 3944 0 +3805 4076 0 +3937 4095 0 +0 853 1295 +0 894 1292 +0 945 1289 +0 1005 1284 +0 1074 1278 +0 1141 1278 +0 1218 1278 +0 1278 1251 +0 1278 1116 +0 1278 832 +0 1416 0 +275 1553 0 +926 1689 0 +1245 1823 0 +1480 1958 0 +1676 2091 0 +1850 2224 0 +2012 2357 0 +2165 2489 0 +2312 2622 0 +2455 2755 0 +2595 2887 0 +2732 3019 0 +2869 3151 0 +3004 3283 0 +3139 3416 0 +3273 3548 0 +3406 3680 0 +3539 3812 0 +3672 3944 0 +3805 4076 0 +3937 4095 0 +0 717 1295 +0 772 1292 +0 837 1289 +0 911 1284 +0 995 1278 +212 1087 1270 +212 1172 1270 +212 1266 1270 +212 1270 1145 +212 1270 884 +0 1410 47 +611 1549 0 +1031 1685 0 +1301 1821 0 +1514 1956 0 +1698 2089 0 +1865 2223 0 +2022 2356 0 +2172 2489 0 +2317 2621 0 +2459 2754 0 +2598 2887 0 +2735 3019 0 +2871 3151 0 +3005 3283 0 +3140 3416 0 +3273 3548 0 +3407 3680 0 +3540 3812 0 +3672 3944 0 +3805 4076 0 +3937 4095 0 +0 431 1295 +0 529 1292 +0 635 1289 +0 746 1284 +0 862 1278 +212 982 1270 +562 1104 1258 +562 1211 1258 +562 1258 1181 +562 1258 946 +345 1402 344 +852 1543 0 +1142 1681 0 +1366 1817 0 +1555 1953 0 +1726 2087 0 +1885 2221 0 +2037 2355 0 +2183 2488 0 +2325 2621 0 +2464 2754 0 +2602 2886 0 +2738 3018 0 +2873 3151 0 +3007 3283 0 +3141 3415 0 +3274 3548 0 +3407 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 0 1295 +0 0 1292 +0 9 1289 +0 346 1284 +0 587 1278 +212 787 1270 +562 963 1258 +809 1126 1242 +809 1242 1225 +809 1242 1018 +793 1390 695 +1051 1534 476 +1258 1674 0 +1440 1813 0 +1606 1950 0 +1761 2085 0 +1910 2220 0 +2054 2353 0 +2196 2487 0 +2334 2620 0 +2471 2753 0 +2607 2886 0 +2742 3018 0 +2876 3151 0 +3009 3283 0 +3143 3415 0 +3276 3548 0 +3408 3680 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 0 1295 +0 0 1292 +0 0 1289 +0 0 1284 +0 0 1278 +212 214 1270 +562 661 1258 +809 938 1242 +1010 1154 1220 +1010 1220 1099 +1069 1374 940 +1228 1523 826 +1378 1666 608 +1523 1807 0 +1665 1945 0 +1804 2082 0 +1942 2217 0 +2078 2352 0 +2213 2486 0 +2347 2619 0 +2481 2752 0 +2614 2885 0 +2747 3018 0 +2880 3151 0 +3012 3283 0 +3145 3415 0 +3277 3548 0 +3409 3680 0 +3542 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +702 0 1295 +724 0 1292 +753 0 1289 +788 0 1284 +832 0 1278 +884 212 1270 +946 562 1258 +1018 809 1242 +1099 1010 1220 +1188 1188 1188 +1286 1352 1142 +1390 1507 1073 +1500 1654 959 +1615 1798 740 +1734 1939 0 +1856 2077 0 +1981 2214 0 +2107 2349 0 +2235 2484 0 +2363 2618 0 +2493 2751 0 +2623 2885 0 +2754 3017 0 +2885 3150 0 +3016 3282 0 +3147 3415 0 +3279 3547 0 +3411 3680 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1174 0 1429 +1182 0 1427 +1193 0 1424 +1207 0 1421 +1225 0 1416 +1248 0 1410 +1277 344 1402 +1313 695 1390 +1357 940 1374 +1352 1142 1286 +1352 1231 1142 +1507 1489 1073 +1608 1654 959 +1701 1798 740 +1801 1939 0 +1908 2077 0 +2021 2214 0 +2138 2349 0 +2258 2484 0 +2381 2618 0 +2506 2751 0 +2633 2885 0 +2761 3017 0 +2891 3150 0 +3020 3282 0 +3151 3415 0 +3282 3547 0 +3413 3680 0 +3544 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1458 0 1563 +1463 0 1561 +1468 0 1559 +1476 0 1557 +1486 0 1553 +1499 0 1549 +1516 0 1543 +1534 476 1531 +1523 826 1476 +1507 1073 1390 +1507 1073 1202 +1507 1282 1073 +1654 1577 959 +1795 1798 740 +1878 1939 0 +1970 2077 0 +2070 2214 0 +2176 2349 0 +2288 2484 0 +2404 2618 0 +2524 2751 0 +2647 2885 0 +2771 3017 0 +2898 3150 0 +3026 3282 0 +3155 3415 0 +3285 3547 0 +3415 3680 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1677 0 1696 +1680 0 1695 +1683 0 1693 +1688 0 1691 +1689 0 1683 +1685 0 1667 +1681 0 1645 +1674 0 1614 +1666 608 1569 +1654 959 1500 +1654 959 1360 +1654 959 1056 +1654 1343 959 +1798 1673 740 +1939 1912 0 +2041 2077 0 +2128 2214 0 +2223 2349 0 +2325 2484 0 +2432 2618 0 +2546 2751 0 +2664 2885 0 +2784 3017 0 +2908 3150 0 +3033 3282 0 +3161 3415 0 +3289 3547 0 +3418 3680 0 +3548 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1828 0 1789 +1828 0 1785 +1827 0 1779 +1825 0 1772 +1823 0 1763 +1821 0 1750 +1817 0 1732 +1813 0 1706 +1807 0 1669 +1798 740 1615 +1798 740 1510 +1798 740 1315 +1798 740 742 +1798 1413 740 +1939 1776 0 +2077 2027 0 +2195 2214 0 +2278 2349 0 +2369 2484 0 +2469 2618 0 +2574 2751 0 +2685 2885 0 +2801 3017 0 +2921 3150 0 +3043 3282 0 +3168 3415 0 +3295 3547 0 +3423 3680 0 +3552 3812 0 +3681 3944 0 +3812 4076 0 +3943 4095 0 +1961 0 1873 +1961 0 1870 +1960 0 1865 +1959 0 1860 +1958 0 1852 +1956 0 1841 +1953 0 1826 +1950 0 1806 +1945 0 1776 +1939 0 1734 +1939 0 1655 +1939 0 1523 +1939 0 1248 +1939 573 0 +1939 1492 0 +2077 1886 0 +2214 2146 0 +2343 2349 0 +2423 2484 0 +2512 2618 0 +2609 2751 0 +2713 2885 0 +2823 3017 0 +2938 3150 0 +3056 3282 0 +3178 3415 0 +3302 3547 0 +3428 3680 0 +3556 3812 0 +3685 3944 0 +3814 4076 0 +3944 4095 0 +2094 0 1966 +2093 0 1963 +2093 0 1960 +2092 0 1955 +2091 0 1949 +2089 0 1940 +2087 0 1928 +2085 0 1912 +2082 0 1889 +2077 0 1856 +2077 0 1797 +2077 0 1704 +2077 0 1539 +2077 0 1138 +2077 173 0 +2077 1581 0 +2214 2000 0 +2349 2268 0 +2484 2481 0 +2565 2618 0 +2652 2751 0 +2748 2885 0 +2850 3017 0 +2959 3150 0 +3073 3282 0 +3191 3415 0 +3312 3547 0 +3436 3680 0 +3562 3812 0 +3689 3944 0 +3817 4076 0 +3947 4095 0 +2226 0 2066 +2226 0 2064 +2225 0 2061 +2225 0 2058 +2224 0 2053 +2223 0 2046 +2221 0 2036 +2220 0 2023 +2217 0 2006 +2214 0 1981 +2214 0 1936 +2214 0 1870 +2214 0 1762 +2214 0 1560 +2214 0 932 +2214 0 0 +2214 1677 0 +2349 2118 0 +2484 2393 0 +2618 2608 0 +2704 2751 0 +2790 2885 0 +2885 3017 0 +2986 3150 0 +3094 3282 0 +3207 3415 0 +3325 3547 0 +3445 3680 0 +3569 3812 0 +3694 3944 0 +3821 4076 0 +3950 4095 0 +2358 0 2173 +2358 0 2171 +2358 0 2169 +2357 0 2166 +2357 0 2162 +2356 0 2157 +2355 0 2150 +2353 0 2140 +2352 0 2126 +2349 0 2107 +2349 0 2074 +2349 0 2025 +2349 0 1951 +2349 0 1829 +2349 0 1586 +2349 0 275 +2349 0 0 +2349 1781 0 +2484 2240 0 +2618 2519 0 +2751 2737 0 +2842 2885 0 +2927 3017 0 +3020 3150 0 +3121 3282 0 +3228 3415 0 +3341 3547 0 +3458 3680 0 +3579 3812 0 +3702 3944 0 +3827 4076 0 +3954 4095 0 +2491 0 2285 +2491 0 2284 +2490 0 2283 +2490 0 2280 +2489 0 2277 +2489 0 2273 +2488 0 2267 +2487 0 2260 +2486 0 2249 +2484 0 2235 +2484 0 2210 +2484 0 2174 +2484 0 2122 +2484 0 2042 +2484 0 1906 +2484 0 1620 +2484 0 0 +2484 0 0 +2484 1891 0 +2618 2363 0 +2751 2647 0 +2885 2866 0 +2977 3017 0 +3062 3150 0 +3155 3282 0 +3255 3415 0 +3362 3547 0 +3475 3680 0 +3591 3812 0 +3711 3944 0 +3834 4076 0 +3960 4095 0 +2623 0 2402 +2623 0 2401 +2623 0 2400 +2622 0 2398 +2622 0 2396 +2621 0 2393 +2621 0 2388 +2620 0 2382 +2619 0 2374 +2618 0 2363 +2618 0 2345 +2618 0 2319 +2618 0 2281 +2618 0 2226 +2618 0 2140 +2618 0 1991 +2618 0 1661 +2618 0 0 +2618 0 0 +2618 2005 0 +2751 2490 0 +2885 2776 0 +3017 2996 0 +3112 3150 0 +3196 3282 0 +3289 3415 0 +3389 3547 0 +3495 3680 0 +3607 3812 0 +3724 3944 0 +3844 4076 0 +3967 4095 0 +2755 0 2523 +2755 0 2522 +2755 0 2521 +2755 0 2520 +2755 0 2517 +2754 0 2515 +2754 0 2512 +2753 0 2507 +2752 0 2501 +2751 0 2493 +2751 0 2479 +2751 0 2460 +2751 0 2433 +2751 0 2394 +2751 0 2336 +2751 0 2245 +2751 0 2086 +2751 0 1711 +2751 0 0 +2751 0 0 +2751 2123 0 +2885 2617 0 +3017 2905 0 +3150 3127 0 +3247 3282 0 +3330 3415 0 +3422 3547 0 +3522 3680 0 +3629 3812 0 +3740 3944 0 +3856 4076 0 +3977 4095 0 +2887 0 2646 +2887 0 2645 +2887 0 2644 +2887 0 2643 +2887 0 2642 +2887 0 2640 +2886 0 2637 +2886 0 2634 +2885 0 2629 +2885 0 2623 +2885 0 2613 +2885 0 2599 +2885 0 2579 +2885 0 2551 +2885 0 2511 +2885 0 2451 +2885 0 2356 +2885 0 2188 +2885 0 1769 +2885 0 0 +2885 0 0 +2885 2245 0 +3017 2745 0 +3150 3036 0 +3282 3257 0 +3380 3415 0 +3464 3547 0 +3556 3680 0 +3655 3812 0 +3761 3944 0 +3873 4076 0 +3989 4095 0 +3019 0 2771 +3019 0 2770 +3019 0 2770 +3019 0 2769 +3019 0 2768 +3019 0 2766 +3018 0 2764 +3018 0 2762 +3018 0 2758 +3017 0 2754 +3017 0 2746 +3017 0 2735 +3017 0 2721 +3017 0 2701 +3017 0 2672 +3017 0 2631 +3017 0 2570 +3017 0 2471 +3017 0 2294 +3017 0 1837 +3017 0 0 +3017 0 0 +3017 2369 0 +3150 2875 0 +3282 3166 0 +3415 3389 0 +3513 3547 0 +3597 3680 0 +3689 3812 0 +3788 3944 0 +3894 4076 0 +4005 4095 0 +3152 0 2898 +3152 0 2897 +3152 0 2897 +3151 0 2896 +3151 0 2895 +3151 0 2895 +3151 0 2893 +3151 0 2891 +3151 0 2888 +3150 0 2885 +3150 0 2879 +3150 0 2871 +3150 0 2860 +3150 0 2846 +3150 0 2825 +3150 0 2796 +3150 0 2754 +3150 0 2691 +3150 0 2591 +3150 0 2408 +3150 0 1915 +3150 0 0 +3150 0 0 +3150 2495 0 +3282 3005 0 +3415 3297 0 +3547 3520 0 +3646 3680 0 +3729 3812 0 +3821 3944 0 +3921 4076 0 +4026 4095 0 +3284 0 3025 +3283 0 3025 +3283 0 3025 +3283 0 3025 +3283 0 3024 +3283 0 3023 +3283 0 3022 +3283 0 3021 +3283 0 3018 +3282 0 3016 +3282 0 3012 +3282 0 3006 +3282 0 2998 +3282 0 2987 +3282 0 2972 +3282 0 2951 +3282 0 2922 +3282 0 2879 +3282 0 2815 +3282 0 2713 +3282 0 2524 +3282 0 1999 +3282 0 0 +3282 0 0 +3282 2622 0 +3415 3136 0 +3547 3429 0 +3680 3652 0 +3779 3812 0 +3862 3944 0 +3953 4076 0 +4053 4095 0 +3416 0 3155 +3416 0 3154 +3416 0 3154 +3416 0 3154 +3416 0 3154 +3416 0 3153 +3415 0 3152 +3415 0 3151 +3415 0 3150 +3415 0 3147 +3415 0 3144 +3415 0 3140 +3415 0 3134 +3415 0 3126 +3415 0 3115 +3415 0 3100 +3415 0 3079 +3415 0 3049 +3415 0 3006 +3415 0 2942 +3415 0 2837 +3415 0 2646 +3415 0 2098 +3415 0 0 +3415 0 0 +3415 2751 0 +3547 3267 0 +3680 3560 0 +3812 3784 0 +3912 3944 0 +3995 4076 0 +4086 4095 0 +3548 0 3285 +3548 0 3284 +3548 0 3284 +3548 0 3284 +3548 0 3284 +3548 0 3283 +3548 0 3283 +3548 0 3282 +3548 0 3281 +3547 0 3279 +3547 0 3277 +3547 0 3274 +3547 0 3269 +3547 0 3263 +3547 0 3255 +3547 0 3244 +3547 0 3229 +3547 0 3208 +3547 0 3178 +3547 0 3135 +3547 0 3069 +3547 0 2964 +3547 0 2770 +3547 0 2198 +3547 0 0 +3547 0 0 +3547 2880 0 +3680 3398 0 +3812 3692 0 +3944 3916 0 +4044 4076 0 +4095 4095 0 +3680 0 3415 +3680 0 3415 +3680 0 3415 +3680 0 3415 +3680 0 3414 +3680 0 3414 +3680 0 3414 +3680 0 3413 +3680 0 3412 +3680 0 3411 +3680 0 3409 +3680 0 3407 +3680 0 3404 +3680 0 3399 +3680 0 3393 +3680 0 3385 +3680 0 3374 +3680 0 3359 +3680 0 3337 +3680 0 3307 +3680 0 3264 +3680 0 3198 +3680 0 3092 +3680 0 2895 +3680 0 2310 +3680 0 0 +3680 0 0 +3680 3011 0 +3812 3530 0 +3944 3824 0 +4076 4047 0 +4095 4095 0 +3812 0 3546 +3812 0 3546 +3812 0 3546 +3812 0 3545 +3812 0 3545 +3812 0 3545 +3812 0 3545 +3812 0 3544 +3812 0 3544 +3812 0 3543 +3812 0 3541 +3812 0 3540 +3812 0 3537 +3812 0 3534 +3812 0 3530 +3812 0 3523 +3812 0 3515 +3812 0 3504 +3812 0 3489 +3812 0 3468 +3812 0 3437 +3812 0 3394 +3812 0 3328 +3812 0 3221 +3812 0 3023 +3812 0 2422 +3812 0 0 +3812 0 0 +3812 3141 0 +3944 3661 0 +4076 3955 0 +4095 4095 0 +3944 0 3677 +3944 0 3677 +3944 0 3677 +3944 0 3677 +3944 0 3677 +3944 0 3676 +3944 0 3676 +3944 0 3676 +3944 0 3675 +3944 0 3675 +3944 0 3674 +3944 0 3673 +3944 0 3671 +3944 0 3668 +3944 0 3665 +3944 0 3661 +3944 0 3654 +3944 0 3646 +3944 0 3635 +3944 0 3620 +3944 0 3598 +3944 0 3568 +3944 0 3524 +3944 0 3458 +3944 0 3351 +3944 0 3151 +3944 0 2539 +3944 0 0 +3944 0 0 +3944 3272 0 +4076 3793 0 +4095 4088 0 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3807 +4076 0 3807 +4076 0 3806 +4076 0 3805 +4076 0 3803 +4076 0 3802 +4076 0 3799 +4076 0 3796 +4076 0 3791 +4076 0 3785 +4076 0 3777 +4076 0 3766 +4076 0 3751 +4076 0 3729 +4076 0 3699 +4076 0 3655 +4076 0 3588 +4076 0 3480 +4076 0 3279 +4076 0 2659 +4076 0 0 +4076 0 0 +4076 3403 0 +4095 3925 0 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3939 +4095 0 3939 +4095 0 3938 +4095 0 3937 +4095 0 3937 +4095 0 3935 +4095 0 3933 +4095 0 3931 +4095 0 3927 +4095 0 3923 +4095 0 3917 +4095 0 3909 +4095 0 3898 +4095 0 3882 +4095 0 3861 +4095 0 3830 +4095 0 3786 +4095 0 3720 +4095 0 3612 +4095 0 3410 +4095 0 2785 +4095 0 0 +4095 0 0 +4095 3535 0 +0 1174 1429 +0 1192 1429 +0 1215 1429 +0 1244 1429 +0 1280 1429 +0 1323 1429 +0 1376 1429 +0 1429 1419 +0 1429 1330 +0 1429 1174 +0 1429 816 +0 1563 0 +0 1696 0 +650 1828 0 +1220 1961 0 +1524 2094 0 +1753 2226 0 +1946 2358 0 +2119 2491 0 +2278 2623 0 +2431 2755 0 +2577 2887 0 +2720 3019 0 +2860 3152 0 +2997 3284 0 +3134 3416 0 +3269 3548 0 +3403 3680 0 +3537 3812 0 +3670 3944 0 +3803 4076 0 +3937 4095 0 +0 1156 1429 +0 1178 1427 +0 1201 1427 +0 1231 1427 +0 1267 1427 +0 1313 1427 +0 1366 1427 +0 1427 1424 +0 1427 1336 +0 1427 1182 +0 1427 833 +0 1561 0 +0 1695 0 +713 1828 0 +1238 1961 0 +1534 2093 0 +1759 2226 0 +1950 2358 0 +2121 2491 0 +2281 2623 0 +2432 2755 0 +2578 2887 0 +2720 3019 0 +2860 3152 0 +2998 3283 0 +3134 3416 0 +3269 3548 0 +3403 3680 0 +3537 3812 0 +3671 3944 0 +3803 4076 0 +3937 4095 0 +0 1130 1429 +0 1153 1427 +0 1182 1424 +0 1213 1424 +0 1251 1424 +0 1298 1424 +0 1353 1424 +0 1418 1424 +0 1424 1343 +0 1424 1193 +0 1424 856 +0 1559 0 +0 1693 0 +786 1827 0 +1263 1960 0 +1547 2093 0 +1767 2225 0 +1955 2358 0 +2125 2490 0 +2283 2623 0 +2434 2755 0 +2580 2887 0 +2721 3019 0 +2861 3152 0 +2998 3283 0 +3134 3416 0 +3269 3548 0 +3404 3680 0 +3537 3812 0 +3671 3944 0 +3803 4076 0 +3937 4095 0 +0 1092 1429 +0 1118 1427 +0 1149 1424 +0 1188 1421 +0 1228 1421 +0 1277 1421 +0 1335 1421 +0 1403 1421 +0 1421 1353 +0 1421 1207 +0 1421 885 +0 1557 0 +0 1691 0 +869 1825 0 +1294 1959 0 +1564 2092 0 +1777 2225 0 +1962 2357 0 +2129 2490 0 +2287 2622 0 +2436 2755 0 +2581 2887 0 +2723 3019 0 +2862 3151 0 +2999 3283 0 +3135 3416 0 +3270 3548 0 +3404 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 1037 1429 +0 1065 1427 +0 1101 1424 +0 1144 1421 +0 1196 1416 +0 1248 1416 +0 1310 1416 +0 1381 1416 +0 1416 1367 +0 1416 1225 +0 1416 920 +0 1553 0 +0 1689 0 +960 1823 0 +1332 1958 0 +1585 2091 0 +1790 2224 0 +1970 2357 0 +2136 2489 0 +2291 2622 0 +2440 2755 0 +2584 2887 0 +2724 3019 0 +2863 3151 0 +3000 3283 0 +3135 3416 0 +3270 3548 0 +3404 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 951 1429 +0 985 1427 +0 1027 1424 +0 1077 1421 +0 1137 1416 +0 1206 1410 +0 1273 1410 +0 1350 1410 +0 1410 1383 +0 1410 1248 +0 1410 964 +0 1549 0 +406 1685 0 +1059 1821 0 +1378 1956 0 +1612 2089 0 +1808 2223 0 +1982 2356 0 +2144 2489 0 +2297 2621 0 +2444 2754 0 +2587 2887 0 +2727 3019 0 +2865 3151 0 +3001 3283 0 +3136 3416 0 +3271 3548 0 +3405 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 803 1429 +0 849 1427 +0 904 1424 +0 969 1421 +0 1043 1416 +0 1127 1410 +344 1219 1402 +344 1304 1402 +344 1398 1402 +344 1402 1277 +344 1402 1017 +0 1543 172 +742 1681 0 +1164 1817 0 +1433 1953 0 +1646 2087 0 +1830 2221 0 +1998 2355 0 +2155 2488 0 +2304 2621 0 +2450 2754 0 +2591 2886 0 +2730 3018 0 +2867 3151 0 +3003 3283 0 +3138 3415 0 +3272 3548 0 +3406 3680 0 +3539 3812 0 +3672 3944 0 +3804 4076 0 +3937 4095 0 +0 471 1429 +0 562 1427 +0 662 1424 +0 767 1421 +0 878 1416 +0 994 1410 +344 1114 1402 +695 1236 1390 +695 1343 1390 +695 1390 1313 +695 1390 1078 +479 1534 476 +983 1674 0 +1275 1813 0 +1498 1950 0 +1687 2085 0 +1858 2220 0 +2017 2353 0 +2169 2487 0 +2314 2620 0 +2457 2753 0 +2596 2886 0 +2734 3018 0 +2870 3151 0 +3005 3283 0 +3139 3415 0 +3273 3548 0 +3406 3680 0 +3540 3812 0 +3672 3944 0 +3805 4076 0 +3937 4095 0 +0 0 1429 +0 0 1427 +0 0 1424 +0 141 1421 +0 478 1416 +0 719 1410 +344 919 1402 +695 1095 1390 +940 1258 1374 +940 1374 1357 +940 1374 1150 +926 1523 826 +1183 1666 608 +1391 1807 0 +1572 1945 0 +1738 2082 0 +1894 2217 0 +2042 2352 0 +2187 2486 0 +2328 2619 0 +2467 2752 0 +2603 2885 0 +2739 3018 0 +2874 3151 0 +3008 3283 0 +3141 3415 0 +3275 3548 0 +3408 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +0 0 1429 +0 0 1427 +0 0 1424 +0 0 1421 +0 0 1416 +47 0 1410 +344 345 1402 +695 793 1390 +940 1069 1374 +1142 1286 1352 +1142 1352 1231 +1202 1507 1073 +1360 1654 959 +1510 1798 740 +1655 1939 0 +1797 2077 0 +1936 2214 0 +2074 2349 0 +2210 2484 0 +2345 2618 0 +2479 2751 0 +2613 2885 0 +2746 3017 0 +2879 3150 0 +3012 3282 0 +3144 3415 0 +3277 3547 0 +3409 3680 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +816 0 1429 +833 0 1427 +856 0 1424 +885 0 1421 +920 0 1416 +964 0 1410 +1017 344 1402 +1078 695 1390 +1150 940 1374 +1231 1142 1352 +1320 1320 1320 +1418 1484 1274 +1522 1638 1205 +1633 1787 1090 +1748 1930 872 +1866 2071 79 +1988 2209 0 +2113 2346 0 +2239 2481 0 +2367 2616 0 +2495 2750 0 +2625 2883 0 +2755 3016 0 +2886 3150 0 +3017 3282 0 +3148 3414 0 +3280 3547 0 +3411 3679 0 +3543 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1301 0 1563 +1307 0 1561 +1315 0 1559 +1326 0 1557 +1340 0 1553 +1358 0 1549 +1381 0 1543 +1409 476 1534 +1445 826 1523 +1489 1073 1507 +1484 1274 1418 +1484 1363 1274 +1638 1621 1205 +1740 1787 1090 +1833 1930 872 +1934 2071 79 +2041 2209 0 +2153 2346 0 +2270 2481 0 +2390 2616 0 +2514 2750 0 +2639 2883 0 +2765 3016 0 +2894 3150 0 +3023 3282 0 +3152 3414 0 +3283 3547 0 +3414 3679 0 +3545 3812 0 +3676 3944 0 +3808 4076 0 +3940 4095 0 +1587 0 1696 +1590 0 1695 +1594 0 1693 +1600 0 1691 +1608 0 1689 +1618 0 1685 +1631 0 1681 +1648 0 1674 +1666 608 1663 +1654 959 1608 +1638 1205 1522 +1638 1205 1333 +1638 1414 1205 +1787 1709 1090 +1927 1930 872 +2010 2071 79 +2102 2209 0 +2202 2346 0 +2308 2481 0 +2420 2616 0 +2536 2750 0 +2656 2883 0 +2778 3016 0 +2904 3150 0 +3030 3282 0 +3158 3414 0 +3287 3547 0 +3417 3679 0 +3547 3812 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1807 0 1828 +1810 0 1828 +1812 0 1827 +1816 0 1825 +1821 0 1823 +1821 0 1815 +1817 0 1799 +1813 0 1777 +1807 0 1746 +1798 740 1701 +1787 1090 1633 +1787 1090 1491 +1787 1090 1189 +1787 1475 1090 +1930 1805 872 +2071 2044 79 +2174 2209 0 +2260 2346 0 +2355 2481 0 +2456 2616 0 +2565 2750 0 +2678 2883 0 +2796 3016 0 +2917 3150 0 +3040 3282 0 +3165 3414 0 +3293 3547 0 +3421 3679 0 +3551 3812 0 +3680 3944 0 +3811 4076 0 +3942 4095 0 +1961 0 1923 +1961 0 1920 +1960 0 1917 +1959 0 1911 +1958 0 1905 +1956 0 1895 +1953 0 1882 +1950 0 1864 +1945 0 1838 +1939 0 1801 +1930 872 1748 +1930 872 1642 +1930 872 1447 +1930 872 873 +1930 1545 872 +2071 1908 79 +2209 2159 0 +2328 2346 0 +2410 2481 0 +2501 2616 0 +2601 2750 0 +2706 2883 0 +2817 3016 0 +2933 3150 0 +3053 3282 0 +3175 3414 0 +3300 3547 0 +3427 3679 0 +3555 3812 0 +3684 3944 0 +3813 4076 0 +3944 4095 0 +2094 0 2007 +2093 0 2005 +2093 0 2002 +2092 0 1997 +2091 0 1992 +2089 0 1984 +2087 0 1973 +2085 0 1958 +2082 0 1938 +2077 0 1908 +2071 79 1866 +2071 79 1787 +2071 79 1655 +2071 79 1379 +2071 706 79 +2071 1625 79 +2209 2018 0 +2346 2278 0 +2475 2481 0 +2555 2616 0 +2645 2750 0 +2741 2883 0 +2845 3016 0 +2955 3150 0 +3070 3282 0 +3188 3414 0 +3310 3547 0 +3434 3679 0 +3561 3812 0 +3688 3944 0 +3816 4076 0 +3946 4095 0 +2226 0 2100 +2226 0 2098 +2225 0 2095 +2225 0 2092 +2224 0 2087 +2223 0 2081 +2221 0 2072 +2220 0 2060 +2217 0 2044 +2214 0 2021 +2209 0 1988 +2209 0 1929 +2209 0 1836 +2209 0 1671 +2209 0 1270 +2209 303 0 +2209 1713 0 +2346 2132 0 +2481 2401 0 +2616 2613 0 +2697 2750 0 +2784 2883 0 +2880 3016 0 +2982 3150 0 +3091 3282 0 +3205 3414 0 +3323 3547 0 +3444 3679 0 +3568 3812 0 +3694 3944 0 +3821 4076 0 +3950 4095 0 +2358 0 2200 +2358 0 2199 +2358 0 2196 +2357 0 2193 +2357 0 2190 +2356 0 2185 +2355 0 2178 +2353 0 2168 +2352 0 2155 +2349 0 2138 +2346 0 2113 +2346 0 2069 +2346 0 2002 +2346 0 1894 +2346 0 1692 +2346 0 1064 +2346 0 0 +2346 1809 0 +2481 2251 0 +2616 2525 0 +2750 2741 0 +2836 2883 0 +2922 3016 0 +3017 3150 0 +3118 3282 0 +3226 3414 0 +3339 3547 0 +3457 3679 0 +3577 3812 0 +3701 3944 0 +3826 4076 0 +3954 4095 0 +2491 0 2306 +2491 0 2305 +2490 0 2304 +2490 0 2302 +2489 0 2298 +2489 0 2294 +2488 0 2289 +2487 0 2282 +2486 0 2272 +2484 0 2258 +2481 0 2239 +2481 0 2206 +2481 0 2158 +2481 0 2084 +2481 0 1961 +2481 0 1719 +2481 0 415 +2481 0 0 +2481 1913 0 +2616 2372 0 +2750 2651 0 +2883 2869 0 +2974 3016 0 +3059 3150 0 +3152 3282 0 +3253 3414 0 +3361 3547 0 +3473 3679 0 +3590 3812 0 +3711 3944 0 +3834 4076 0 +3959 4095 0 +2623 0 2419 +2623 0 2417 +2623 0 2416 +2622 0 2414 +2622 0 2412 +2621 0 2409 +2621 0 2405 +2620 0 2399 +2619 0 2392 +2618 0 2381 +2616 0 2367 +2616 0 2342 +2616 0 2306 +2616 0 2255 +2616 0 2174 +2616 0 2038 +2616 0 1752 +2616 0 0 +2616 0 0 +2616 2022 0 +2750 2496 0 +2883 2779 0 +3016 2998 0 +3110 3150 0 +3194 3282 0 +3287 3414 0 +3387 3547 0 +3494 3679 0 +3606 3812 0 +3723 3944 0 +3843 4076 0 +3967 4095 0 +2755 0 2535 +2755 0 2535 +2755 0 2533 +2755 0 2532 +2755 0 2530 +2754 0 2528 +2754 0 2525 +2753 0 2521 +2752 0 2514 +2751 0 2506 +2750 0 2495 +2750 0 2477 +2750 0 2451 +2750 0 2414 +2750 0 2359 +2750 0 2273 +2750 0 2124 +2750 0 1794 +2750 0 0 +2750 0 0 +2750 2137 0 +2883 2621 0 +3016 2907 0 +3150 3128 0 +3244 3282 0 +3329 3414 0 +3421 3547 0 +3521 3679 0 +3628 3812 0 +3740 3944 0 +3856 4076 0 +3976 4095 0 +2887 0 2655 +2887 0 2655 +2887 0 2654 +2887 0 2653 +2887 0 2651 +2887 0 2650 +2886 0 2647 +2886 0 2644 +2885 0 2639 +2885 0 2633 +2883 0 2625 +2883 0 2611 +2883 0 2592 +2883 0 2565 +2883 0 2526 +2883 0 2469 +2883 0 2378 +2883 0 2218 +2883 0 1843 +2883 0 0 +2883 0 0 +2883 2255 0 +3016 2749 0 +3150 3038 0 +3282 3259 0 +3379 3414 0 +3462 3547 0 +3554 3679 0 +3654 3812 0 +3761 3944 0 +3872 4076 0 +3989 4095 0 +3019 0 2778 +3019 0 2777 +3019 0 2777 +3019 0 2776 +3019 0 2775 +3019 0 2774 +3018 0 2772 +3018 0 2769 +3018 0 2766 +3017 0 2761 +3016 0 2755 +3016 0 2745 +3016 0 2731 +3016 0 2711 +3016 0 2683 +3016 0 2643 +3016 0 2583 +3016 0 2488 +3016 0 2319 +3016 0 1900 +3016 0 0 +3016 0 0 +3016 2377 0 +3150 2878 0 +3282 3168 0 +3414 3390 0 +3512 3547 0 +3596 3679 0 +3688 3812 0 +3787 3944 0 +3893 4076 0 +4005 4095 0 +3152 0 2903 +3152 0 2903 +3152 0 2903 +3151 0 2902 +3151 0 2901 +3151 0 2900 +3151 0 2898 +3151 0 2896 +3151 0 2894 +3150 0 2891 +3150 0 2886 +3150 0 2878 +3150 0 2868 +3150 0 2853 +3150 0 2833 +3150 0 2804 +3150 0 2763 +3150 0 2702 +3150 0 2604 +3150 0 2427 +3150 0 1969 +3150 0 0 +3150 0 0 +3150 2501 0 +3282 3006 0 +3414 3298 0 +3547 3521 0 +3646 3679 0 +3729 3812 0 +3820 3944 0 +3920 4076 0 +4026 4095 0 +3284 0 3030 +3283 0 3029 +3283 0 3029 +3283 0 3029 +3283 0 3028 +3283 0 3027 +3283 0 3026 +3283 0 3025 +3283 0 3023 +3282 0 3020 +3282 0 3017 +3282 0 3011 +3282 0 3003 +3282 0 2992 +3282 0 2977 +3282 0 2957 +3282 0 2928 +3282 0 2886 +3282 0 2823 +3282 0 2723 +3282 0 2539 +3282 0 2045 +3282 0 0 +3282 0 0 +3282 2627 0 +3414 3137 0 +3547 3429 0 +3679 3653 0 +3778 3812 0 +3862 3944 0 +3953 4076 0 +4053 4095 0 +3416 0 3158 +3416 0 3158 +3416 0 3157 +3416 0 3157 +3416 0 3157 +3416 0 3156 +3415 0 3155 +3415 0 3154 +3415 0 3153 +3415 0 3151 +3414 0 3148 +3414 0 3144 +3414 0 3138 +3414 0 3130 +3414 0 3119 +3414 0 3104 +3414 0 3083 +3414 0 3054 +3414 0 3011 +3414 0 2947 +3414 0 2845 +3414 0 2657 +3414 0 2135 +3414 0 0 +3414 0 0 +3414 2754 0 +3547 3268 0 +3679 3561 0 +3812 3784 0 +3911 3944 0 +3994 4076 0 +4086 4095 0 +3548 0 3287 +3548 0 3287 +3548 0 3287 +3548 0 3286 +3548 0 3286 +3548 0 3286 +3548 0 3285 +3548 0 3284 +3548 0 3283 +3547 0 3282 +3547 0 3280 +3547 0 3277 +3547 0 3272 +3547 0 3266 +3547 0 3258 +3547 0 3247 +3547 0 3232 +3547 0 3211 +3547 0 3181 +3547 0 3138 +3547 0 3074 +3547 0 2970 +3547 0 2778 +3547 0 2228 +3547 0 0 +3547 0 0 +3547 2883 0 +3679 3399 0 +3812 3692 0 +3944 3916 0 +4044 4076 0 +4095 4095 0 +3680 0 3417 +3680 0 3417 +3680 0 3417 +3680 0 3416 +3680 0 3416 +3680 0 3416 +3680 0 3415 +3680 0 3415 +3680 0 3414 +3680 0 3413 +3679 0 3411 +3679 0 3409 +3679 0 3406 +3679 0 3401 +3679 0 3395 +3679 0 3387 +3679 0 3376 +3679 0 3361 +3679 0 3340 +3679 0 3310 +3679 0 3267 +3679 0 3201 +3679 0 3096 +3679 0 2901 +3679 0 2333 +3679 0 0 +3679 0 0 +3679 3013 0 +3812 3530 0 +3944 3824 0 +4076 4048 0 +4095 4095 0 +3812 0 3547 +3812 0 3547 +3812 0 3547 +3812 0 3547 +3812 0 3547 +3812 0 3547 +3812 0 3546 +3812 0 3546 +3812 0 3545 +3812 0 3544 +3812 0 3543 +3812 0 3541 +3812 0 3539 +3812 0 3536 +3812 0 3531 +3812 0 3525 +3812 0 3517 +3812 0 3506 +3812 0 3491 +3812 0 3469 +3812 0 3439 +3812 0 3396 +3812 0 3330 +3812 0 3224 +3812 0 3027 +3812 0 2441 +3812 0 0 +3812 0 0 +3812 3143 0 +3944 3661 0 +4076 3955 0 +4095 4095 0 +3944 0 3678 +3944 0 3678 +3944 0 3678 +3944 0 3678 +3944 0 3678 +3944 0 3677 +3944 0 3677 +3944 0 3677 +3944 0 3676 +3944 0 3676 +3944 0 3675 +3944 0 3674 +3944 0 3672 +3944 0 3669 +3944 0 3666 +3944 0 3662 +3944 0 3656 +3944 0 3648 +3944 0 3636 +3944 0 3621 +3944 0 3600 +3944 0 3569 +3944 0 3526 +3944 0 3459 +3944 0 3353 +3944 0 3154 +3944 0 2553 +3944 0 0 +3944 0 0 +3944 3273 0 +4076 3793 0 +4095 4088 0 +4076 0 3809 +4076 0 3809 +4076 0 3809 +4076 0 3809 +4076 0 3809 +4076 0 3809 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3808 +4076 0 3807 +4076 0 3806 +4076 0 3804 +4076 0 3803 +4076 0 3800 +4076 0 3797 +4076 0 3793 +4076 0 3787 +4076 0 3778 +4076 0 3767 +4076 0 3752 +4076 0 3730 +4076 0 3700 +4076 0 3656 +4076 0 3590 +4076 0 3482 +4076 0 3282 +4076 0 2670 +4076 0 0 +4076 0 0 +4076 3404 0 +4095 3925 0 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3940 +4095 0 3939 +4095 0 3938 +4095 0 3937 +4095 0 3936 +4095 0 3934 +4095 0 3932 +4095 0 3928 +4095 0 3924 +4095 0 3918 +4095 0 3910 +4095 0 3898 +4095 0 3883 +4095 0 3862 +4095 0 3831 +4095 0 3787 +4095 0 3721 +4095 0 3613 +4095 0 3412 +4095 0 2793 +4095 0 0 +4095 0 0 +4095 3536 0 +0 1304 1563 +0 1318 1563 +0 1335 1563 +0 1357 1563 +0 1385 1563 +0 1421 1563 +0 1463 1563 +0 1515 1563 +0 1563 1548 +0 1563 1458 +0 1563 1301 +0 1563 934 +0 1696 0 +0 1828 0 +726 1961 0 +1336 2094 0 +1648 2226 0 +1880 2358 0 +2075 2491 0 +2248 2623 0 +2409 2755 0 +2562 2887 0 +2708 3019 0 +2851 3152 0 +2991 3284 0 +3129 3416 0 +3266 3548 0 +3401 3680 0 +3535 3812 0 +3669 3944 0 +3803 4076 0 +3936 4095 0 +0 1290 1563 +0 1307 1561 +0 1325 1561 +0 1347 1561 +0 1376 1561 +0 1412 1561 +0 1456 1561 +0 1508 1561 +0 1561 1552 +0 1561 1463 +0 1561 1307 +0 1561 948 +0 1695 0 +0 1828 0 +780 1961 0 +1351 2093 0 +1656 2226 0 +1885 2358 0 +2078 2491 0 +2250 2623 0 +2411 2755 0 +2563 2887 0 +2709 3019 0 +2852 3152 0 +2992 3283 0 +3129 3416 0 +3266 3548 0 +3401 3680 0 +3536 3812 0 +3669 3944 0 +3803 4076 0 +3936 4095 0 +0 1271 1563 +0 1288 1561 +0 1310 1559 +0 1333 1559 +0 1363 1559 +0 1400 1559 +0 1445 1559 +0 1499 1559 +0 1559 1556 +0 1559 1468 +0 1559 1315 +0 1559 966 +0 1693 0 +0 1827 0 +844 1960 0 +1370 2093 0 +1666 2225 0 +1891 2358 0 +2082 2490 0 +2253 2623 0 +2413 2755 0 +2564 2887 0 +2710 3019 0 +2853 3152 0 +2992 3283 0 +3130 3416 0 +3266 3548 0 +3401 3680 0 +3536 3812 0 +3669 3944 0 +3803 4076 0 +3936 4095 0 +0 1244 1563 +0 1262 1561 +0 1285 1559 +0 1315 1557 +0 1345 1557 +0 1384 1557 +0 1430 1557 +0 1486 1557 +0 1551 1557 +0 1557 1476 +0 1557 1326 +0 1557 988 +0 1691 0 +0 1825 0 +917 1959 0 +1394 2092 0 +1679 2225 0 +1899 2357 0 +2087 2490 0 +2256 2622 0 +2415 2755 0 +2566 2887 0 +2712 3019 0 +2854 3151 0 +2993 3283 0 +3130 3416 0 +3267 3548 0 +3401 3680 0 +3536 3812 0 +3669 3944 0 +3803 4076 0 +3936 4095 0 +0 1205 1563 +0 1225 1561 +0 1250 1559 +0 1281 1557 +0 1320 1553 +0 1360 1553 +0 1409 1553 +0 1467 1553 +0 1535 1553 +0 1553 1486 +0 1553 1340 +0 1553 1017 +0 1689 0 +0 1823 0 +1000 1958 0 +1425 2091 0 +1695 2224 0 +1909 2357 0 +2094 2489 0 +2261 2622 0 +2419 2755 0 +2569 2887 0 +2713 3019 0 +2855 3151 0 +2994 3283 0 +3131 3416 0 +3267 3548 0 +3402 3680 0 +3536 3812 0 +3670 3944 0 +3803 4076 0 +3936 4095 0 +0 1148 1563 +0 1170 1561 +0 1198 1559 +0 1233 1557 +0 1276 1553 +0 1328 1549 +0 1380 1549 +0 1442 1549 +0 1513 1549 +0 1549 1499 +0 1549 1358 +0 1549 1053 +0 1685 0 +0 1821 0 +1091 1956 0 +1463 2089 0 +1717 2223 0 +1922 2356 0 +2103 2489 0 +2268 2621 0 +2423 2754 0 +2572 2887 0 +2716 3019 0 +2857 3151 0 +2995 3283 0 +3132 3416 0 +3268 3548 0 +3402 3680 0 +3537 3812 0 +3670 3944 0 +3803 4076 0 +3936 4095 0 +0 1057 1563 +0 1084 1561 +0 1118 1559 +0 1159 1557 +0 1209 1553 +0 1269 1549 +0 1338 1543 +0 1405 1543 +0 1482 1543 +0 1543 1516 +0 1543 1381 +0 1543 1096 +0 1681 0 +536 1817 0 +1190 1953 0 +1509 2087 0 +1744 2221 0 +1940 2355 0 +2115 2488 0 +2276 2621 0 +2429 2754 0 +2576 2886 0 +2719 3018 0 +2859 3151 0 +2997 3283 0 +3133 3415 0 +3269 3548 0 +3403 3680 0 +3537 3812 0 +3670 3944 0 +3803 4076 0 +3937 4095 0 +0 897 1563 +0 935 1561 +0 981 1559 +0 1037 1557 +0 1102 1553 +0 1176 1549 +0 1259 1543 +476 1351 1534 +476 1437 1534 +476 1531 1534 +476 1534 1409 +476 1534 1149 +0 1674 313 +874 1813 0 +1295 1950 0 +1565 2085 0 +1778 2220 0 +1962 2353 0 +2130 2487 0 +2287 2620 0 +2437 2753 0 +2581 2886 0 +2723 3018 0 +2862 3151 0 +2999 3283 0 +3135 3415 0 +3270 3548 0 +3404 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 523 1563 +0 605 1561 +0 696 1559 +0 794 1557 +0 900 1553 +0 1011 1549 +0 1127 1543 +476 1246 1534 +826 1368 1523 +826 1476 1523 +826 1523 1445 +826 1523 1211 +608 1666 609 +1115 1807 0 +1407 1945 0 +1630 2082 0 +1819 2217 0 +1990 2352 0 +2149 2486 0 +2301 2619 0 +2447 2752 0 +2589 2885 0 +2728 3018 0 +2866 3151 0 +3002 3283 0 +3137 3415 0 +3271 3548 0 +3405 3680 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 0 1563 +0 0 1561 +0 0 1559 +0 0 1557 +0 275 1553 +0 611 1549 +0 852 1543 +476 1051 1534 +826 1228 1523 +1073 1390 1507 +1073 1507 1489 +1073 1507 1282 +1056 1654 959 +1315 1798 740 +1523 1939 0 +1704 2077 0 +1870 2214 0 +2025 2349 0 +2174 2484 0 +2319 2618 0 +2460 2751 0 +2599 2885 0 +2735 3017 0 +2871 3150 0 +3006 3282 0 +3140 3415 0 +3274 3547 0 +3407 3680 0 +3540 3812 0 +3673 3944 0 +3805 4076 0 +3937 4095 0 +0 0 1563 +0 0 1561 +0 0 1559 +0 0 1557 +0 0 1553 +0 0 1549 +172 0 1543 +476 479 1534 +826 926 1523 +1073 1202 1507 +1274 1418 1484 +1274 1484 1363 +1333 1638 1205 +1491 1787 1090 +1642 1930 872 +1787 2071 79 +1929 2209 0 +2069 2346 0 +2206 2481 0 +2342 2616 0 +2477 2750 0 +2611 2883 0 +2745 3016 0 +2878 3150 0 +3011 3282 0 +3144 3414 0 +3277 3547 0 +3409 3679 0 +3541 3812 0 +3674 3944 0 +3806 4076 0 +3938 4095 0 +934 0 1563 +948 0 1561 +966 0 1559 +988 0 1557 +1017 0 1553 +1053 0 1549 +1096 0 1543 +1149 476 1534 +1211 826 1523 +1282 1073 1507 +1363 1274 1484 +1453 1453 1453 +1550 1616 1407 +1654 1771 1337 +1765 1919 1223 +1880 2062 1005 +1998 2203 217 +2120 2341 0 +2245 2478 0 +2371 2613 0 +2499 2748 0 +2628 2882 0 +2757 3015 0 +2887 3149 0 +3018 3281 0 +3149 3414 0 +3280 3547 0 +3412 3679 0 +3544 3812 0 +3675 3944 0 +3807 4076 0 +3939 4095 0 +1427 0 1696 +1432 0 1695 +1439 0 1693 +1447 0 1691 +1457 0 1689 +1471 0 1685 +1489 0 1681 +1512 0 1674 +1541 608 1666 +1577 959 1654 +1621 1205 1638 +1616 1407 1550 +1616 1495 1407 +1771 1754 1337 +1872 1919 1223 +1965 2062 1005 +2066 2203 217 +2173 2341 0 +2285 2478 0 +2402 2613 0 +2522 2748 0 +2645 2882 0 +2770 3015 0 +2898 3149 0 +3025 3281 0 +3155 3414 0 +3285 3547 0 +3415 3679 0 +3546 3812 0 +3677 3944 0 +3808 4076 0 +3940 4095 0 +1716 0 1828 +1719 0 1828 +1722 0 1827 +1727 0 1825 +1732 0 1823 +1740 0 1821 +1750 0 1817 +1763 0 1813 +1780 0 1807 +1798 740 1795 +1787 1090 1740 +1771 1337 1654 +1771 1337 1466 +1771 1546 1337 +1919 1841 1223 +2059 2062 1005 +2142 2203 217 +2234 2341 0 +2334 2478 0 +2440 2613 0 +2552 2748 0 +2668 2882 0 +2788 3015 0 +2911 3149 0 +3035 3281 0 +3162 3414 0 +3290 3547 0 +3419 3679 0 +3549 3812 0 +3679 3944 0 +3810 4076 0 +3941 4095 0 +1938 0 1961 +1940 0 1961 +1941 0 1960 +1944 0 1959 +1948 0 1958 +1953 0 1956 +1953 0 1947 +1950 0 1931 +1945 0 1909 +1939 0 1878 +1930 872 1833 +1919 1223 1765 +1919 1223 1624 +1919 1223 1321 +1919 1607 1223 +2062 1937 1005 +2203 2176 217 +2305 2341 0 +2392 2478 0 +2487 2613 0 +2589 2748 0 +2697 2882 0 +2810 3015 0 +2928 3149 0 +3049 3281 0 +3172 3414 0 +3298 3547 0 +3425 3679 0 +3553 3812 0 +3683 3944 0 +3812 4076 0 +3943 4095 0 +2094 0 2058 +2093 0 2056 +2093 0 2053 +2092 0 2049 +2091 0 2044 +2089 0 2037 +2087 0 2027 +2085 0 2014 +2082 0 1996 +2077 0 1970 +2071 79 1934 +2062 1005 1880 +2062 1005 1774 +2062 1005 1579 +2062 1005 1006 +2062 1677 1005 +2203 2041 217 +2341 2291 0 +2460 2478 0 +2542 2613 0 +2634 2748 0 +2733 2882 0 +2838 3015 0 +2950 3149 0 +3065 3281 0 +3185 3414 0 +3307 3547 0 +3432 3679 0 +3559 3812 0 +3687 3944 0 +3816 4076 0 +3946 4095 0 +2226 0 2141 +2226 0 2140 +2225 0 2137 +2225 0 2134 +2224 0 2130 +2223 0 2124 +2221 0 2116 +2220 0 2105 +2217 0 2090 +2214 0 2070 +2209 0 2041 +2203 217 1998 +2203 217 1920 +2203 217 1787 +2203 217 1512 +2203 838 217 +2203 1757 217 +2341 2150 0 +2478 2411 0 +2607 2613 0 +2687 2748 0 +2777 2882 0 +2873 3015 0 +2977 3149 0 +3087 3281 0 +3202 3414 0 +3320 3547 0 +3442 3679 0 +3566 3812 0 +3692 3944 0 +3820 4076 0 +3949 4095 0 +2358 0 2233 +2358 0 2232 +2358 0 2230 +2357 0 2228 +2357 0 2224 +2356 0 2219 +2355 0 2213 +2353 0 2204 +2352 0 2192 +2349 0 2176 +2346 0 2153 +2341 0 2120 +2341 0 2061 +2341 0 1968 +2341 0 1803 +2341 0 1403 +2341 437 0 +2341 1845 0 +2478 2264 0 +2613 2533 0 +2748 2745 0 +2829 2882 0 +2916 3015 0 +3012 3149 0 +3114 3281 0 +3223 3414 0 +3337 3547 0 +3455 3679 0 +3576 3812 0 +3700 3944 0 +3826 4076 0 +3953 4095 0 +2491 0 2333 +2491 0 2332 +2490 0 2331 +2490 0 2329 +2489 0 2326 +2489 0 2322 +2488 0 2317 +2487 0 2310 +2486 0 2301 +2484 0 2288 +2481 0 2270 +2478 0 2245 +2478 0 2201 +2478 0 2134 +2478 0 2026 +2478 0 1824 +2478 0 1199 +2478 0 0 +2478 1941 0 +2613 2382 0 +2748 2657 0 +2882 2873 0 +2968 3015 0 +3055 3149 0 +3149 3281 0 +3250 3414 0 +3358 3547 0 +3472 3679 0 +3589 3812 0 +3710 3944 0 +3833 4076 0 +3959 4095 0 +2623 0 2440 +2623 0 2439 +2623 0 2437 +2622 0 2436 +2622 0 2434 +2621 0 2431 +2621 0 2427 +2620 0 2421 +2619 0 2414 +2618 0 2404 +2616 0 2390 +2613 0 2371 +2613 0 2338 +2613 0 2290 +2613 0 2216 +2613 0 2093 +2613 0 1851 +2613 0 547 +2613 0 0 +2613 2045 0 +2748 2504 0 +2882 2784 0 +3015 3001 0 +3106 3149 0 +3191 3281 0 +3284 3414 0 +3385 3547 0 +3493 3679 0 +3605 3812 0 +3722 3944 0 +3843 4076 0 +3966 4095 0 +2755 0 2552 +2755 0 2551 +2755 0 2550 +2755 0 2549 +2755 0 2547 +2754 0 2545 +2754 0 2541 +2753 0 2537 +2752 0 2532 +2751 0 2524 +2750 0 2514 +2748 0 2499 +2748 0 2474 +2748 0 2439 +2748 0 2387 +2748 0 2306 +2748 0 2170 +2748 0 1885 +2748 0 0 +2748 0 0 +2748 2155 0 +2882 2628 0 +3015 2911 0 +3149 3131 0 +3242 3281 0 +3326 3414 0 +3419 3547 0 +3520 3679 0 +3626 3812 0 +3739 3944 0 +3855 4076 0 +3976 4095 0 +2887 0 2668 +2887 0 2667 +2887 0 2667 +2887 0 2666 +2887 0 2664 +2887 0 2662 +2886 0 2660 +2886 0 2657 +2885 0 2652 +2885 0 2647 +2883 0 2639 +2882 0 2628 +2882 0 2609 +2882 0 2583 +2882 0 2546 +2882 0 2491 +2882 0 2405 +2882 0 2256 +2882 0 1925 +2882 0 0 +2882 0 0 +2882 2269 0 +3015 2753 0 +3149 3040 0 +3281 3260 0 +3376 3414 0 +3461 3547 0 +3553 3679 0 +3653 3812 0 +3760 3944 0 +3872 4076 0 +3988 4095 0 +3019 0 2788 +3019 0 2787 +3019 0 2787 +3019 0 2786 +3019 0 2785 +3019 0 2784 +3018 0 2782 +3018 0 2779 +3018 0 2776 +3017 0 2771 +3016 0 2765 +3015 0 2757 +3015 0 2743 +3015 0 2724 +3015 0 2697 +3015 0 2658 +3015 0 2600 +3015 0 2510 +3015 0 2350 +3015 0 1974 +3015 0 0 +3015 0 0 +3015 2387 0 +3149 2881 0 +3281 3169 0 +3414 3391 0 +3511 3547 0 +3595 3679 0 +3687 3812 0 +3786 3944 0 +3892 4076 0 +4005 4095 0 +3152 0 2911 +3152 0 2910 +3152 0 2910 +3151 0 2909 +3151 0 2908 +3151 0 2907 +3151 0 2906 +3151 0 2904 +3151 0 2902 +3150 0 2898 +3150 0 2894 +3149 0 2887 +3149 0 2877 +3149 0 2863 +3149 0 2843 +3149 0 2815 +3149 0 2775 +3149 0 2715 +3149 0 2620 +3149 0 2452 +3149 0 2033 +3149 0 0 +3149 0 0 +3149 2509 0 +3281 3009 0 +3414 3299 0 +3547 3522 0 +3644 3679 0 +3728 3812 0 +3820 3944 0 +3919 4076 0 +4026 4095 0 +3284 0 3035 +3283 0 3035 +3283 0 3035 +3283 0 3034 +3283 0 3034 +3283 0 3033 +3283 0 3032 +3283 0 3031 +3283 0 3029 +3282 0 3026 +3282 0 3023 +3281 0 3018 +3281 0 3010 +3281 0 2999 +3281 0 2985 +3281 0 2965 +3281 0 2936 +3281 0 2895 +3281 0 2833 +3281 0 2735 +3281 0 2558 +3281 0 2100 +3281 0 0 +3281 0 0 +3281 2633 0 +3414 3139 0 +3547 3430 0 +3679 3653 0 +3777 3812 0 +3861 3944 0 +3953 4076 0 +4052 4095 0 +3416 0 3162 +3416 0 3162 +3416 0 3162 +3416 0 3161 +3416 0 3161 +3416 0 3160 +3415 0 3160 +3415 0 3158 +3415 0 3157 +3415 0 3155 +3414 0 3152 +3414 0 3149 +3414 0 3143 +3414 0 3135 +3414 0 3125 +3414 0 3110 +3414 0 3089 +3414 0 3060 +3414 0 3018 +3414 0 2956 +3414 0 2855 +3414 0 2672 +3414 0 2180 +3414 0 0 +3414 0 0 +3414 2759 0 +3547 3269 0 +3679 3562 0 +3812 3785 0 +3910 3944 0 +3994 4076 0 +4085 4095 0 +3548 0 3290 +3548 0 3290 +3548 0 3290 +3548 0 3290 +3548 0 3289 +3548 0 3289 +3548 0 3288 +3548 0 3287 +3548 0 3286 +3547 0 3285 +3547 0 3283 +3547 0 3280 +3547 0 3276 +3547 0 3270 +3547 0 3262 +3547 0 3251 +3547 0 3236 +3547 0 3216 +3547 0 3186 +3547 0 3144 +3547 0 3080 +3547 0 2977 +3547 0 2790 +3547 0 2265 +3547 0 0 +3547 0 0 +3547 2886 0 +3679 3400 0 +3812 3693 0 +3944 3916 0 +4043 4076 0 +4095 4095 0 +3680 0 3419 +3680 0 3419 +3680 0 3419 +3680 0 3419 +3680 0 3419 +3680 0 3418 +3680 0 3418 +3680 0 3417 +3680 0 3416 +3680 0 3415 +3679 0 3414 +3679 0 3412 +3679 0 3409 +3679 0 3404 +3679 0 3398 +3679 0 3390 +3679 0 3379 +3679 0 3364 +3679 0 3343 +3679 0 3314 +3679 0 3271 +3679 0 3206 +3679 0 3102 +3679 0 2910 +3679 0 2363 +3679 0 0 +3679 0 0 +3679 3015 0 +3812 3531 0 +3944 3824 0 +4076 4048 0 +4095 4095 0 +3812 0 3549 +3812 0 3549 +3812 0 3549 +3812 0 3549 +3812 0 3549 +3812 0 3548 +3812 0 3548 +3812 0 3548 +3812 0 3547 +3812 0 3546 +3812 0 3545 +3812 0 3544 +3812 0 3541 +3812 0 3538 +3812 0 3533 +3812 0 3528 +3812 0 3520 +3812 0 3508 +3812 0 3493 +3812 0 3472 +3812 0 3442 +3812 0 3399 +3812 0 3333 +3812 0 3228 +3812 0 3034 +3812 0 2465 +3812 0 0 +3812 0 0 +3812 3145 0 +3944 3662 0 +4076 3956 0 +4095 4095 0 +3944 0 3679 +3944 0 3679 +3944 0 3679 +3944 0 3679 +3944 0 3679 +3944 0 3679 +3944 0 3679 +3944 0 3678 +3944 0 3678 +3944 0 3677 +3944 0 3676 +3944 0 3675 +3944 0 3673 +3944 0 3671 +3944 0 3668 +3944 0 3663 +3944 0 3657 +3944 0 3649 +3944 0 3638 +3944 0 3623 +3944 0 3602 +3944 0 3571 +3944 0 3528 +3944 0 3462 +3944 0 3356 +3944 0 3159 +3944 0 2572 +3944 0 0 +3944 0 0 +3944 3275 0 +4076 3793 0 +4095 4088 0 +4076 0 3810 +4076 0 3810 +4076 0 3810 +4076 0 3810 +4076 0 3810 +4076 0 3810 +4076 0 3810 +4076 0 3809 +4076 0 3809 +4076 0 3808 +4076 0 3808 +4076 0 3807 +4076 0 3805 +4076 0 3804 +4076 0 3801 +4076 0 3798 +4076 0 3794 +4076 0 3787 +4076 0 3780 +4076 0 3768 +4076 0 3753 +4076 0 3732 +4076 0 3701 +4076 0 3658 +4076 0 3592 +4076 0 3485 +4076 0 3286 +4076 0 2684 +4076 0 0 +4076 0 0 +4076 3405 0 +4095 3926 0 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3940 +4095 0 3940 +4095 0 3939 +4095 0 3938 +4095 0 3937 +4095 0 3935 +4095 0 3932 +4095 0 3929 +4095 0 3925 +4095 0 3919 +4095 0 3910 +4095 0 3899 +4095 0 3884 +4095 0 3863 +4095 0 3832 +4095 0 3788 +4095 0 3722 +4095 0 3615 +4095 0 3415 +4095 0 2804 +4095 0 0 +4095 0 0 +4095 3537 0 +0 1434 1696 +0 1444 1696 +0 1457 1696 +0 1475 1696 +0 1496 1696 +0 1524 1696 +0 1559 1696 +0 1601 1696 +0 1653 1696 +0 1696 1677 +0 1696 1587 +0 1696 1427 +0 1696 1056 +0 1828 0 +0 1961 0 +814 2094 0 +1457 2226 0 +1775 2358 0 +2009 2491 0 +2205 2623 0 +2379 2755 0 +2541 2887 0 +2693 3019 0 +2840 3152 0 +2983 3284 0 +3123 3416 0 +3261 3548 0 +3398 3680 0 +3533 3812 0 +3667 3944 0 +3801 4076 0 +3935 4095 0 +0 1424 1696 +0 1436 1695 +0 1450 1695 +0 1467 1695 +0 1489 1695 +0 1517 1695 +0 1552 1695 +0 1596 1695 +0 1647 1695 +0 1695 1680 +0 1695 1590 +0 1695 1432 +0 1695 1066 +0 1828 0 +0 1961 0 +859 2093 0 +1469 2226 0 +1781 2358 0 +2013 2491 0 +2207 2623 0 +2381 2755 0 +2542 2887 0 +2694 3019 0 +2841 3152 0 +2983 3283 0 +3123 3416 0 +3261 3548 0 +3398 3680 0 +3533 3812 0 +3667 3944 0 +3801 4076 0 +3935 4095 0 +0 1410 1696 +0 1422 1695 +0 1439 1693 +0 1456 1693 +0 1479 1693 +0 1508 1693 +0 1544 1693 +0 1588 1693 +0 1640 1693 +0 1693 1683 +0 1693 1594 +0 1693 1439 +0 1693 1080 +0 1827 0 +0 1960 0 +913 2093 0 +1484 2225 0 +1788 2358 0 +2017 2490 0 +2210 2623 0 +2383 2755 0 +2543 2887 0 +2695 3019 0 +2842 3152 0 +2984 3283 0 +3124 3416 0 +3261 3548 0 +3398 3680 0 +3533 3812 0 +3668 3944 0 +3801 4076 0 +3935 4095 0 +0 1390 1696 +0 1403 1695 +0 1420 1693 +0 1442 1691 +0 1465 1691 +0 1495 1691 +0 1532 1691 +0 1577 1691 +0 1631 1691 +0 1691 1688 +0 1691 1600 +0 1691 1447 +0 1691 1098 +0 1825 0 +0 1959 0 +977 2092 0 +1503 2225 0 +1798 2357 0 +2023 2490 0 +2214 2622 0 +2386 2755 0 +2545 2887 0 +2696 3019 0 +2842 3151 0 +2985 3283 0 +3124 3416 0 +3262 3548 0 +3398 3680 0 +3533 3812 0 +3668 3944 0 +3801 4076 0 +3935 4095 0 +0 1362 1696 +0 1376 1695 +0 1394 1693 +0 1417 1691 +0 1446 1689 +0 1477 1689 +0 1515 1689 +0 1562 1689 +0 1617 1689 +0 1683 1689 +0 1689 1608 +0 1689 1457 +0 1689 1120 +0 1823 0 +0 1958 0 +1050 2091 0 +1527 2224 0 +1811 2357 0 +2031 2489 0 +2219 2622 0 +2389 2755 0 +2548 2887 0 +2698 3019 0 +2844 3151 0 +2986 3283 0 +3125 3416 0 +3262 3548 0 +3399 3680 0 +3534 3812 0 +3668 3944 0 +3801 4076 0 +3935 4095 0 +0 1322 1696 +0 1337 1695 +0 1357 1693 +0 1382 1691 +0 1413 1689 +0 1452 1685 +0 1492 1685 +0 1541 1685 +0 1599 1685 +0 1667 1685 +0 1685 1618 +0 1685 1471 +0 1685 1149 +0 1821 0 +0 1956 0 +1133 2089 0 +1557 2223 0 +1828 2356 0 +2041 2489 0 +2226 2621 0 +2394 2754 0 +2551 2887 0 +2701 3019 0 +2845 3151 0 +2987 3283 0 +3126 3416 0 +3263 3548 0 +3399 3680 0 +3534 3812 0 +3668 3944 0 +3802 4076 0 +3935 4095 0 +0 1262 1696 +0 1279 1695 +0 1302 1693 +0 1330 1691 +0 1365 1689 +0 1408 1685 +0 1460 1681 +0 1512 1681 +0 1574 1681 +0 1645 1681 +0 1681 1631 +0 1681 1489 +0 1681 1184 +0 1817 0 +0 1953 0 +1224 2087 0 +1596 2221 0 +1849 2355 0 +2055 2488 0 +2235 2621 0 +2400 2754 0 +2555 2886 0 +2703 3018 0 +2848 3151 0 +2988 3283 0 +3127 3415 0 +3264 3548 0 +3400 3680 0 +3534 3812 0 +3668 3944 0 +3802 4076 0 +3935 4095 0 +0 1167 1696 +0 1188 1695 +0 1216 1693 +0 1249 1691 +0 1291 1689 +0 1341 1685 +0 1401 1681 +0 1470 1674 +0 1537 1674 +0 1614 1674 +0 1674 1648 +0 1674 1512 +0 1674 1228 +0 1813 0 +670 1950 0 +1322 2085 0 +1642 2220 0 +1876 2353 0 +2072 2487 0 +2247 2620 0 +2408 2753 0 +2561 2886 0 +2708 3018 0 +2851 3151 0 +2991 3283 0 +3129 3415 0 +3265 3548 0 +3401 3680 0 +3535 3812 0 +3669 3944 0 +3802 4076 0 +3936 4095 0 +0 998 1696 +0 1029 1695 +0 1067 1693 +0 1113 1691 +0 1169 1689 +0 1233 1685 +0 1308 1681 +0 1391 1674 +608 1483 1666 +608 1569 1666 +608 1663 1666 +608 1666 1541 +608 1666 1281 +0 1807 438 +1007 1945 0 +1428 2082 0 +1697 2217 0 +1910 2352 0 +2094 2486 0 +2262 2619 0 +2419 2752 0 +2569 2885 0 +2714 3018 0 +2855 3151 0 +2994 3283 0 +3131 3415 0 +3267 3548 0 +3402 3680 0 +3536 3812 0 +3670 3944 0 +3803 4076 0 +3936 4095 0 +0 580 1696 +0 653 1695 +0 736 1693 +0 827 1691 +0 926 1689 +0 1031 1685 +0 1142 1681 +0 1258 1674 +608 1378 1666 +959 1500 1654 +959 1608 1654 +959 1654 1577 +959 1654 1343 +742 1798 740 +1248 1939 0 +1539 2077 0 +1762 2214 0 +1951 2349 0 +2122 2484 0 +2281 2618 0 +2433 2751 0 +2579 2885 0 +2721 3017 0 +2860 3150 0 +2998 3282 0 +3134 3415 0 +3269 3547 0 +3404 3680 0 +3537 3812 0 +3671 3944 0 +3803 4076 0 +3937 4095 0 +0 0 1696 +0 0 1695 +0 0 1693 +0 0 1691 +0 0 1689 +0 406 1685 +0 742 1681 +0 983 1674 +608 1183 1666 +959 1360 1654 +1205 1522 1638 +1205 1638 1621 +1205 1638 1414 +1189 1787 1090 +1447 1930 872 +1655 2071 79 +1836 2209 0 +2002 2346 0 +2158 2481 0 +2306 2616 0 +2451 2750 0 +2592 2883 0 +2731 3016 0 +2868 3150 0 +3003 3282 0 +3138 3414 0 +3272 3547 0 +3406 3679 0 +3539 3812 0 +3672 3944 0 +3804 4076 0 +3937 4095 0 +0 0 1696 +0 0 1695 +0 0 1693 +0 0 1691 +0 0 1689 +0 0 1685 +0 0 1681 +313 0 1674 +609 608 1666 +959 1056 1654 +1205 1333 1638 +1407 1550 1616 +1407 1616 1495 +1466 1771 1337 +1624 1919 1223 +1774 2062 1005 +1920 2203 217 +2061 2341 0 +2201 2478 0 +2338 2613 0 +2474 2748 0 +2609 2882 0 +2743 3015 0 +2877 3149 0 +3010 3281 0 +3143 3414 0 +3276 3547 0 +3409 3679 0 +3541 3812 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +1056 0 1696 +1066 0 1695 +1080 0 1693 +1098 0 1691 +1120 0 1689 +1149 0 1685 +1184 0 1681 +1228 0 1674 +1281 608 1666 +1343 959 1654 +1414 1205 1638 +1495 1407 1616 +1585 1585 1585 +1682 1748 1539 +1787 1903 1469 +1897 2051 1355 +2012 2194 1136 +2131 2335 345 +2253 2473 0 +2377 2610 0 +2503 2746 0 +2631 2880 0 +2759 3014 0 +2889 3148 0 +3019 3280 0 +3150 3414 0 +3281 3546 0 +3413 3679 0 +3544 3811 0 +3676 3944 0 +3807 4076 0 +3939 4095 0 +1557 0 1828 +1560 0 1828 +1565 0 1827 +1571 0 1825 +1579 0 1823 +1590 0 1821 +1604 0 1817 +1622 0 1813 +1644 0 1807 +1673 740 1798 +1709 1090 1787 +1754 1337 1771 +1748 1539 1682 +1748 1627 1539 +1903 1885 1469 +2004 2051 1355 +2097 2194 1136 +2198 2335 345 +2305 2473 0 +2417 2610 0 +2534 2746 0 +2654 2880 0 +2777 3014 0 +2903 3148 0 +3029 3280 0 +3158 3414 0 +3287 3546 0 +3417 3679 0 +3547 3811 0 +3678 3944 0 +3809 4076 0 +3941 4095 0 +1847 0 1961 +1849 0 1961 +1851 0 1960 +1854 0 1959 +1859 0 1958 +1865 0 1956 +1872 0 1953 +1882 0 1950 +1895 0 1945 +1912 0 1939 +1930 872 1927 +1919 1223 1872 +1903 1469 1787 +1903 1469 1598 +1903 1678 1469 +2051 1973 1355 +2191 2194 1136 +2274 2335 345 +2366 2473 0 +2466 2610 0 +2572 2746 0 +2684 2880 0 +2800 3014 0 +2920 3148 0 +3043 3280 0 +3168 3414 0 +3294 3546 0 +3422 3679 0 +3552 3811 0 +3681 3944 0 +3812 4076 0 +3942 4095 0 +2069 0 2094 +2070 0 2093 +2071 0 2093 +2073 0 2092 +2076 0 2091 +2080 0 2089 +2085 0 2087 +2085 0 2079 +2082 0 2063 +2077 0 2041 +2071 79 2010 +2062 1005 1965 +2051 1355 1897 +2051 1355 1756 +2051 1355 1453 +2051 1739 1355 +2194 2069 1136 +2335 2308 345 +2438 2473 0 +2524 2610 0 +2619 2746 0 +2721 2880 0 +2829 3014 0 +2942 3148 0 +3060 3280 0 +3181 3414 0 +3304 3546 0 +3430 3679 0 +3557 3811 0 +3685 3944 0 +3814 4076 0 +3945 4095 0 +2226 0 2191 +2226 0 2190 +2225 0 2188 +2225 0 2185 +2224 0 2181 +2223 0 2176 +2221 0 2169 +2220 0 2159 +2217 0 2146 +2214 0 2128 +2209 0 2102 +2203 217 2066 +2194 1136 2012 +2194 1136 1906 +2194 1136 1711 +2194 1136 1137 +2194 1809 1136 +2335 2173 345 +2473 2423 0 +2592 2610 0 +2674 2746 0 +2766 2880 0 +2865 3014 0 +2970 3148 0 +3082 3280 0 +3198 3414 0 +3317 3546 0 +3440 3679 0 +3564 3811 0 +3691 3944 0 +3819 4076 0 +3948 4095 0 +2358 0 2275 +2358 0 2273 +2358 0 2271 +2357 0 2269 +2357 0 2266 +2356 0 2262 +2355 0 2256 +2353 0 2248 +2352 0 2237 +2349 0 2223 +2346 0 2202 +2341 0 2173 +2335 345 2131 +2335 345 2052 +2335 345 1919 +2335 345 1644 +2335 970 345 +2335 1889 345 +2473 2282 0 +2610 2543 0 +2740 2746 0 +2820 2880 0 +2908 3014 0 +3005 3148 0 +3109 3280 0 +3219 3414 0 +3334 3546 0 +3453 3679 0 +3574 3811 0 +3699 3944 0 +3824 4076 0 +3952 4095 0 +2491 0 2367 +2491 0 2366 +2490 0 2364 +2490 0 2362 +2489 0 2360 +2489 0 2356 +2488 0 2352 +2487 0 2345 +2486 0 2336 +2484 0 2325 +2481 0 2308 +2478 0 2285 +2473 0 2253 +2473 0 2194 +2473 0 2100 +2473 0 1935 +2473 0 1535 +2473 557 0 +2473 1977 0 +2610 2396 0 +2746 2665 0 +2880 2877 0 +2961 3014 0 +3049 3148 0 +3144 3280 0 +3247 3414 0 +3355 3546 0 +3469 3679 0 +3587 3811 0 +3708 3944 0 +3832 4076 0 +3958 4095 0 +2623 0 2466 +2623 0 2465 +2623 0 2464 +2622 0 2463 +2622 0 2460 +2621 0 2458 +2621 0 2454 +2620 0 2449 +2619 0 2442 +2618 0 2432 +2616 0 2420 +2613 0 2402 +2610 0 2377 +2610 0 2333 +2610 0 2266 +2610 0 2158 +2610 0 1956 +2610 0 1330 +2610 0 0 +2610 2073 0 +2746 2515 0 +2880 2789 0 +3014 3004 0 +3100 3148 0 +3186 3280 0 +3281 3414 0 +3382 3546 0 +3490 3679 0 +3604 3811 0 +3721 3944 0 +3841 4076 0 +3965 4095 0 +2755 0 2573 +2755 0 2572 +2755 0 2571 +2755 0 2570 +2755 0 2568 +2754 0 2566 +2754 0 2563 +2753 0 2559 +2752 0 2553 +2751 0 2546 +2750 0 2536 +2748 0 2522 +2746 0 2503 +2746 0 2470 +2746 0 2422 +2746 0 2348 +2746 0 2226 +2746 0 1983 +2746 0 678 +2746 0 0 +2746 2177 0 +2880 2636 0 +3014 2915 0 +3148 3133 0 +3238 3280 0 +3323 3414 0 +3416 3546 0 +3517 3679 0 +3625 3811 0 +3737 3944 0 +3854 4076 0 +3975 4095 0 +2887 0 2684 +2887 0 2684 +2887 0 2683 +2887 0 2682 +2887 0 2681 +2887 0 2679 +2886 0 2677 +2886 0 2673 +2885 0 2669 +2885 0 2664 +2883 0 2656 +2882 0 2645 +2880 0 2631 +2880 0 2606 +2880 0 2571 +2880 0 2519 +2880 0 2439 +2880 0 2302 +2880 0 2016 +2880 0 0 +2880 0 0 +2880 2287 0 +3014 2759 0 +3148 3043 0 +3280 3262 0 +3374 3414 0 +3458 3546 0 +3551 3679 0 +3652 3811 0 +3758 3944 0 +3871 4076 0 +3988 4095 0 +3019 0 2800 +3019 0 2800 +3019 0 2799 +3019 0 2798 +3019 0 2797 +3019 0 2796 +3018 0 2794 +3018 0 2792 +3018 0 2789 +3017 0 2784 +3016 0 2778 +3015 0 2770 +3014 0 2759 +3014 0 2741 +3014 0 2715 +3014 0 2678 +3014 0 2623 +3014 0 2536 +3014 0 2388 +3014 0 2056 +3014 0 0 +3014 0 0 +3014 2401 0 +3148 2886 0 +3280 3172 0 +3414 3393 0 +3509 3546 0 +3593 3679 0 +3685 3811 0 +3785 3944 0 +3891 4076 0 +4004 4095 0 +3152 0 2920 +3152 0 2920 +3152 0 2919 +3151 0 2919 +3151 0 2918 +3151 0 2917 +3151 0 2916 +3151 0 2914 +3151 0 2911 +3150 0 2908 +3150 0 2904 +3149 0 2898 +3148 0 2889 +3148 0 2875 +3148 0 2856 +3148 0 2829 +3148 0 2790 +3148 0 2733 +3148 0 2642 +3148 0 2482 +3148 0 2106 +3148 0 0 +3148 0 0 +3148 2520 0 +3280 3013 0 +3414 3301 0 +3546 3523 0 +3643 3679 0 +3727 3811 0 +3819 3944 0 +3918 4076 0 +4025 4095 0 +3284 0 3043 +3283 0 3042 +3283 0 3042 +3283 0 3042 +3283 0 3041 +3283 0 3040 +3283 0 3039 +3283 0 3038 +3283 0 3036 +3282 0 3033 +3282 0 3030 +3281 0 3025 +3280 0 3019 +3280 0 3009 +3280 0 2995 +3280 0 2975 +3280 0 2947 +3280 0 2907 +3280 0 2847 +3280 0 2752 +3280 0 2583 +3280 0 2164 +3280 0 0 +3280 0 0 +3280 2641 0 +3414 3142 0 +3546 3432 0 +3679 3654 0 +3777 3811 0 +3860 3944 0 +3952 4076 0 +4051 4095 0 +3416 0 3168 +3416 0 3168 +3416 0 3167 +3416 0 3167 +3416 0 3166 +3416 0 3166 +3415 0 3165 +3415 0 3164 +3415 0 3163 +3415 0 3161 +3414 0 3158 +3414 0 3155 +3414 0 3150 +3414 0 3142 +3414 0 3132 +3414 0 3117 +3414 0 3097 +3414 0 3069 +3414 0 3027 +3414 0 2966 +3414 0 2867 +3414 0 2691 +3414 0 2234 +3414 0 0 +3414 0 0 +3414 2765 0 +3546 3271 0 +3679 3563 0 +3811 3785 0 +3910 3944 0 +3993 4076 0 +4085 4095 0 +3548 0 3294 +3548 0 3294 +3548 0 3294 +3548 0 3294 +3548 0 3293 +3548 0 3293 +3548 0 3292 +3548 0 3292 +3548 0 3291 +3547 0 3289 +3547 0 3287 +3547 0 3285 +3546 0 3281 +3546 0 3275 +3546 0 3268 +3546 0 3257 +3546 0 3242 +3546 0 3221 +3546 0 3192 +3546 0 3151 +3546 0 3087 +3546 0 2987 +3546 0 2804 +3546 0 2311 +3546 0 0 +3546 0 0 +3546 2891 0 +3679 3401 0 +3811 3694 0 +3944 3917 0 +4043 4076 0 +4095 4095 0 +3680 0 3422 +3680 0 3422 +3680 0 3422 +3680 0 3422 +3680 0 3422 +3680 0 3421 +3680 0 3421 +3680 0 3420 +3680 0 3420 +3680 0 3418 +3679 0 3417 +3679 0 3415 +3679 0 3413 +3679 0 3408 +3679 0 3402 +3679 0 3394 +3679 0 3384 +3679 0 3368 +3679 0 3348 +3679 0 3318 +3679 0 3276 +3679 0 3212 +3679 0 3110 +3679 0 2922 +3679 0 2400 +3679 0 0 +3679 0 0 +3679 3018 0 +3811 3532 0 +3944 3825 0 +4076 4048 0 +4095 4095 0 +3812 0 3552 +3812 0 3551 +3812 0 3551 +3812 0 3551 +3812 0 3551 +3812 0 3551 +3812 0 3550 +3812 0 3550 +3812 0 3549 +3812 0 3548 +3812 0 3547 +3812 0 3546 +3811 0 3544 +3811 0 3541 +3811 0 3536 +3811 0 3530 +3811 0 3522 +3811 0 3511 +3811 0 3496 +3811 0 3475 +3811 0 3446 +3811 0 3403 +3811 0 3338 +3811 0 3234 +3811 0 3043 +3811 0 2494 +3811 0 0 +3811 0 0 +3811 3147 0 +3944 3663 0 +4076 3956 0 +4095 4095 0 +3944 0 3681 +3944 0 3681 +3944 0 3681 +3944 0 3681 +3944 0 3681 +3944 0 3681 +3944 0 3680 +3944 0 3680 +3944 0 3680 +3944 0 3679 +3944 0 3678 +3944 0 3677 +3944 0 3676 +3944 0 3673 +3944 0 3670 +3944 0 3666 +3944 0 3659 +3944 0 3651 +3944 0 3640 +3944 0 3625 +3944 0 3604 +3944 0 3574 +3944 0 3531 +3944 0 3466 +3944 0 3361 +3944 0 3166 +3944 0 2596 +3944 0 0 +3944 0 0 +3944 3277 0 +4076 3794 0 +4095 4088 0 +4076 0 3812 +4076 0 3811 +4076 0 3811 +4076 0 3811 +4076 0 3811 +4076 0 3811 +4076 0 3811 +4076 0 3810 +4076 0 3810 +4076 0 3810 +4076 0 3809 +4076 0 3808 +4076 0 3807 +4076 0 3805 +4076 0 3803 +4076 0 3800 +4076 0 3795 +4076 0 3789 +4076 0 3781 +4076 0 3770 +4076 0 3755 +4076 0 3734 +4076 0 3703 +4076 0 3660 +4076 0 3594 +4076 0 3488 +4076 0 3291 +4076 0 2703 +4076 0 0 +4076 0 0 +4076 3407 0 +4095 3926 0 +4095 0 3942 +4095 0 3942 +4095 0 3942 +4095 0 3942 +4095 0 3942 +4095 0 3942 +4095 0 3942 +4095 0 3942 +4095 0 3941 +4095 0 3941 +4095 0 3941 +4095 0 3940 +4095 0 3939 +4095 0 3938 +4095 0 3936 +4095 0 3934 +4095 0 3930 +4095 0 3926 +4095 0 3920 +4095 0 3912 +4095 0 3901 +4095 0 3885 +4095 0 3864 +4095 0 3834 +4095 0 3790 +4095 0 3724 +4095 0 3617 +4095 0 3419 +4095 0 2818 +4095 0 0 +4095 0 0 +4095 3538 0 +0 1565 1828 +0 1572 1828 +0 1582 1828 +0 1596 1828 +0 1612 1828 +0 1634 1828 +0 1661 1828 +0 1696 1828 +0 1738 1828 +0 1789 1828 +0 1828 1807 +0 1828 1716 +0 1828 1557 +0 1828 1180 +0 1961 0 +0 2094 0 +907 2226 0 +1580 2358 0 +1903 2491 0 +2138 2623 0 +2335 2755 0 +2510 2887 0 +2672 3019 0 +2825 3152 0 +2972 3284 0 +3115 3416 0 +3255 3548 0 +3393 3680 0 +3530 3812 0 +3665 3944 0 +3799 4076 0 +3933 4095 0 +0 1557 1828 +0 1566 1828 +0 1576 1828 +0 1590 1828 +0 1607 1828 +0 1629 1828 +0 1656 1828 +0 1691 1828 +0 1733 1828 +0 1785 1828 +0 1828 1810 +0 1828 1719 +0 1828 1560 +0 1828 1188 +0 1961 0 +0 2093 0 +944 2226 0 +1589 2358 0 +1907 2491 0 +2141 2623 0 +2337 2755 0 +2511 2887 0 +2672 3019 0 +2825 3152 0 +2972 3283 0 +3115 3416 0 +3255 3548 0 +3393 3680 0 +3530 3812 0 +3665 3944 0 +3799 4076 0 +3933 4095 0 +0 1547 1828 +0 1556 1828 +0 1568 1827 +0 1582 1827 +0 1599 1827 +0 1621 1827 +0 1650 1827 +0 1684 1827 +0 1727 1827 +0 1779 1827 +0 1827 1812 +0 1827 1722 +0 1827 1565 +0 1827 1198 +0 1960 0 +0 2093 0 +990 2225 0 +1600 2358 0 +1913 2490 0 +2144 2623 0 +2339 2755 0 +2513 2887 0 +2673 3019 0 +2826 3152 0 +2973 3283 0 +3115 3416 0 +3256 3548 0 +3393 3680 0 +3530 3812 0 +3665 3944 0 +3799 4076 0 +3933 4095 0 +0 1532 1828 +0 1542 1828 +0 1554 1827 +0 1571 1825 +0 1588 1825 +0 1611 1825 +0 1640 1825 +0 1676 1825 +0 1720 1825 +0 1772 1825 +0 1825 1816 +0 1825 1727 +0 1825 1571 +0 1825 1212 +0 1959 0 +0 2092 0 +1044 2225 0 +1615 2357 0 +1920 2490 0 +2149 2622 0 +2342 2755 0 +2515 2887 0 +2675 3019 0 +2827 3151 0 +2973 3283 0 +3116 3416 0 +3256 3548 0 +3394 3680 0 +3530 3812 0 +3665 3944 0 +3799 4076 0 +3933 4095 0 +0 1512 1828 +0 1522 1828 +0 1535 1827 +0 1552 1825 +0 1574 1823 +0 1598 1823 +0 1627 1823 +0 1664 1823 +0 1709 1823 +0 1763 1823 +0 1823 1821 +0 1823 1732 +0 1823 1579 +0 1823 1230 +0 1958 0 +0 2091 0 +1108 2224 0 +1634 2357 0 +1930 2489 0 +2155 2622 0 +2346 2755 0 +2517 2887 0 +2677 3019 0 +2829 3151 0 +2974 3283 0 +3117 3416 0 +3256 3548 0 +3394 3680 0 +3530 3812 0 +3665 3944 0 +3800 4076 0 +3934 4095 0 +0 1484 1828 +0 1494 1828 +0 1508 1827 +0 1526 1825 +0 1549 1823 +0 1579 1821 +0 1609 1821 +0 1648 1821 +0 1694 1821 +0 1750 1821 +0 1815 1821 +0 1821 1740 +0 1821 1590 +0 1821 1253 +0 1956 0 +0 2089 0 +1181 2223 0 +1659 2356 0 +1943 2489 0 +2163 2621 0 +2351 2754 0 +2521 2887 0 +2679 3019 0 +2830 3151 0 +2976 3283 0 +3118 3416 0 +3257 3548 0 +3395 3680 0 +3531 3812 0 +3666 3944 0 +3800 4076 0 +3934 4095 0 +0 1442 1828 +0 1454 1828 +0 1469 1827 +0 1489 1825 +0 1514 1823 +0 1545 1821 +0 1585 1817 +0 1625 1817 +0 1673 1817 +0 1732 1817 +0 1799 1817 +0 1817 1750 +0 1817 1604 +0 1817 1281 +0 1953 0 +0 2087 0 +1264 2221 0 +1689 2355 0 +1960 2488 0 +2173 2621 0 +2358 2754 0 +2526 2886 0 +2683 3018 0 +2833 3151 0 +2977 3283 0 +3119 3415 0 +3258 3548 0 +3395 3680 0 +3531 3812 0 +3666 3944 0 +3800 4076 0 +3934 4095 0 +0 1381 1828 +0 1394 1828 +0 1412 1827 +0 1434 1825 +0 1462 1823 +0 1497 1821 +0 1540 1817 +0 1592 1813 +0 1644 1813 +0 1706 1813 +0 1777 1813 +0 1813 1763 +0 1813 1622 +0 1813 1317 +0 1950 0 +10 2085 0 +1355 2220 0 +1727 2353 0 +1981 2487 0 +2187 2620 0 +2367 2753 0 +2532 2886 0 +2687 3018 0 +2836 3151 0 +2980 3283 0 +3121 3415 0 +3259 3548 0 +3396 3680 0 +3532 3812 0 +3666 3944 0 +3801 4076 0 +3934 4095 0 +0 1283 1828 +0 1300 1828 +0 1321 1827 +0 1348 1825 +0 1382 1823 +0 1423 1821 +0 1474 1817 +0 1533 1813 +0 1602 1807 +0 1669 1807 +0 1746 1807 +0 1807 1780 +0 1807 1644 +0 1807 1360 +0 1945 37 +800 2082 0 +1454 2217 0 +1773 2352 0 +2008 2486 0 +2204 2619 0 +2379 2752 0 +2540 2885 0 +2693 3018 0 +2840 3151 0 +2983 3283 0 +3123 3415 0 +3261 3548 0 +3397 3680 0 +3533 3812 0 +3667 3944 0 +3801 4076 0 +3935 4095 0 +0 1106 1828 +0 1131 1828 +0 1161 1827 +0 1199 1825 +0 1245 1823 +0 1301 1821 +0 1366 1817 +0 1440 1813 +0 1523 1807 +740 1615 1798 +740 1701 1798 +740 1795 1798 +740 1798 1673 +740 1798 1413 +0 1939 573 +1138 2077 0 +1560 2214 0 +1829 2349 0 +2042 2484 0 +2226 2618 0 +2394 2751 0 +2551 2885 0 +2701 3017 0 +2846 3150 0 +2987 3282 0 +3126 3415 0 +3263 3547 0 +3399 3680 0 +3534 3812 0 +3668 3944 0 +3802 4076 0 +3935 4095 0 +0 650 1828 +0 713 1828 +0 786 1827 +0 869 1825 +0 960 1823 +0 1059 1821 +0 1164 1817 +0 1275 1813 +0 1391 1807 +740 1510 1798 +1090 1633 1787 +1090 1740 1787 +1090 1787 1709 +1090 1787 1475 +873 1930 872 +1379 2071 79 +1671 2209 0 +1894 2346 0 +2084 2481 0 +2255 2616 0 +2414 2750 0 +2565 2883 0 +2711 3016 0 +2853 3150 0 +2992 3282 0 +3130 3414 0 +3266 3547 0 +3401 3679 0 +3536 3812 0 +3669 3944 0 +3803 4076 0 +3936 4095 0 +0 0 1828 +0 0 1828 +0 0 1827 +0 0 1825 +0 0 1823 +0 0 1821 +0 536 1817 +0 874 1813 +0 1115 1807 +740 1315 1798 +1090 1491 1787 +1337 1654 1771 +1337 1771 1754 +1337 1771 1546 +1321 1919 1223 +1579 2062 1005 +1787 2203 217 +1968 2341 0 +2134 2478 0 +2290 2613 0 +2439 2748 0 +2583 2882 0 +2724 3015 0 +2863 3149 0 +2999 3281 0 +3135 3414 0 +3270 3547 0 +3404 3679 0 +3538 3812 0 +3671 3944 0 +3804 4076 0 +3937 4095 0 +0 0 1828 +0 0 1828 +0 0 1827 +0 0 1825 +0 0 1823 +0 0 1821 +0 0 1817 +0 0 1813 +438 0 1807 +740 742 1798 +1090 1189 1787 +1337 1466 1771 +1539 1682 1748 +1539 1748 1627 +1598 1903 1469 +1756 2051 1355 +1906 2194 1136 +2052 2335 345 +2194 2473 0 +2333 2610 0 +2470 2746 0 +2606 2880 0 +2741 3014 0 +2875 3148 0 +3009 3280 0 +3142 3414 0 +3275 3546 0 +3408 3679 0 +3541 3811 0 +3673 3944 0 +3805 4076 0 +3938 4095 0 +1180 0 1828 +1188 0 1828 +1198 0 1827 +1212 0 1825 +1230 0 1823 +1253 0 1821 +1281 0 1817 +1317 0 1813 +1360 0 1807 +1413 740 1798 +1475 1090 1787 +1546 1337 1771 +1627 1539 1748 +1717 1717 1717 +1814 1880 1671 +1919 2035 1601 +2029 2183 1487 +2144 2326 1269 +2263 2467 477 +2385 2605 0 +2509 2742 0 +2636 2878 0 +2763 3012 0 +2892 3146 0 +3021 3280 0 +3151 3413 0 +3282 3546 0 +3413 3678 0 +3545 3811 0 +3676 3943 0 +3808 4076 0 +3940 4095 0 +1686 0 1961 +1689 0 1961 +1692 0 1960 +1697 0 1959 +1703 0 1958 +1711 0 1956 +1722 0 1953 +1736 0 1950 +1754 0 1945 +1776 0 1939 +1805 872 1930 +1841 1223 1919 +1885 1469 1903 +1880 1671 1814 +1880 1759 1671 +2035 2017 1601 +2136 2183 1487 +2229 2326 1269 +2330 2467 477 +2437 2605 0 +2550 2742 0 +2666 2878 0 +2786 3012 0 +2910 3146 0 +3034 3280 0 +3162 3413 0 +3290 3546 0 +3419 3678 0 +3549 3811 0 +3679 3943 0 +3810 4076 0 +3941 4095 0 +1977 0 2094 +1979 0 2093 +1981 0 2093 +1983 0 2092 +1986 0 2091 +1991 0 2089 +1996 0 2087 +2004 0 2085 +2014 0 2082 +2027 0 2077 +2044 79 2071 +2062 1005 2059 +2051 1355 2004 +2035 1601 1919 +2035 1601 1730 +2035 1811 1601 +2183 2105 1487 +2323 2326 1269 +2407 2467 477 +2498 2605 0 +2598 2742 0 +2704 2878 0 +2816 3012 0 +2932 3146 0 +3052 3280 0 +3175 3413 0 +3300 3546 0 +3426 3678 0 +3554 3811 0 +3683 3943 0 +3813 4076 0 +3944 4095 0 +2200 0 2226 +2201 0 2226 +2202 0 2225 +2203 0 2225 +2206 0 2224 +2208 0 2223 +2212 0 2221 +2217 0 2220 +2217 0 2211 +2214 0 2195 +2209 0 2174 +2203 217 2142 +2194 1136 2097 +2183 1487 2029 +2183 1487 1888 +2183 1487 1585 +2183 1871 1487 +2326 2202 1269 +2467 2440 477 +2570 2605 0 +2656 2742 0 +2751 2878 0 +2853 3012 0 +2961 3146 0 +3074 3280 0 +3192 3413 0 +3313 3546 0 +3436 3678 0 +3562 3811 0 +3689 3943 0 +3817 4076 0 +3947 4095 0 +2358 0 2325 +2358 0 2324 +2358 0 2322 +2357 0 2320 +2357 0 2317 +2356 0 2313 +2355 0 2308 +2353 0 2301 +2352 0 2291 +2349 0 2278 +2346 0 2260 +2341 0 2234 +2335 345 2198 +2326 1269 2144 +2326 1269 2038 +2326 1269 1843 +2326 1269 1270 +2326 1941 1269 +2467 2305 477 +2605 2556 0 +2724 2742 0 +2807 2878 0 +2898 3012 0 +2997 3146 0 +3102 3280 0 +3214 3413 0 +3330 3546 0 +3449 3678 0 +3572 3811 0 +3697 3943 0 +3823 4076 0 +3951 4095 0 +2491 0 2408 +2491 0 2407 +2490 0 2406 +2490 0 2404 +2489 0 2401 +2489 0 2398 +2488 0 2394 +2487 0 2388 +2486 0 2380 +2484 0 2369 +2481 0 2355 +2478 0 2334 +2473 0 2305 +2467 477 2263 +2467 477 2184 +2467 477 2051 +2467 477 1776 +2467 1099 477 +2467 2021 477 +2605 2414 0 +2742 2675 0 +2872 2878 0 +2952 3012 0 +3041 3146 0 +3138 3280 0 +3242 3413 0 +3351 3546 0 +3466 3678 0 +3585 3811 0 +3706 3943 0 +3830 4076 0 +3957 4095 0 +2623 0 2500 +2623 0 2499 +2623 0 2498 +2622 0 2496 +2622 0 2494 +2621 0 2492 +2621 0 2488 +2620 0 2483 +2619 0 2477 +2618 0 2469 +2616 0 2456 +2613 0 2440 +2610 0 2417 +2605 0 2385 +2605 0 2326 +2605 0 2233 +2605 0 2067 +2605 0 1667 +2605 705 0 +2605 2109 0 +2742 2529 0 +2878 2797 0 +3012 3009 0 +3093 3146 0 +3180 3280 0 +3276 3413 0 +3379 3546 0 +3488 3678 0 +3601 3811 0 +3719 3943 0 +3840 4076 0 +3964 4095 0 +2755 0 2599 +2755 0 2598 +2755 0 2598 +2755 0 2596 +2755 0 2595 +2754 0 2593 +2754 0 2590 +2753 0 2586 +2752 0 2581 +2751 0 2574 +2750 0 2565 +2748 0 2552 +2746 0 2534 +2742 0 2509 +2742 0 2465 +2742 0 2398 +2742 0 2291 +2742 0 2089 +2742 0 1463 +2742 0 0 +2742 2206 0 +2878 2647 0 +3012 2921 0 +3146 3137 0 +3233 3280 0 +3319 3413 0 +3413 3546 0 +3515 3678 0 +3622 3811 0 +3736 3943 0 +3853 4076 0 +3974 4095 0 +2887 0 2705 +2887 0 2705 +2887 0 2704 +2887 0 2703 +2887 0 2702 +2887 0 2700 +2886 0 2698 +2886 0 2695 +2885 0 2691 +2885 0 2685 +2883 0 2678 +2882 0 2668 +2880 0 2654 +2878 0 2636 +2878 0 2602 +2878 0 2554 +2878 0 2480 +2878 0 2358 +2878 0 2115 +2878 0 817 +2878 0 0 +2878 2309 0 +3012 2767 0 +3146 3047 0 +3280 3265 0 +3370 3413 0 +3455 3546 0 +3548 3678 0 +3650 3811 0 +3757 3943 0 +3869 4076 0 +3986 4095 0 +3019 0 2816 +3019 0 2816 +3019 0 2816 +3019 0 2815 +3019 0 2814 +3019 0 2813 +3018 0 2811 +3018 0 2808 +3018 0 2805 +3017 0 2801 +3016 0 2796 +3015 0 2788 +3014 0 2777 +3012 0 2763 +3012 0 2738 +3012 0 2703 +3012 0 2651 +3012 0 2570 +3012 0 2434 +3012 0 2148 +3012 0 0 +3012 0 0 +3012 2419 0 +3146 2892 0 +3280 3175 0 +3413 3395 0 +3506 3546 0 +3590 3678 0 +3683 3811 0 +3784 3943 0 +3890 4076 0 +4003 4095 0 +3152 0 2933 +3152 0 2932 +3152 0 2932 +3151 0 2932 +3151 0 2931 +3151 0 2930 +3151 0 2928 +3151 0 2927 +3151 0 2924 +3150 0 2921 +3150 0 2917 +3149 0 2911 +3148 0 2903 +3146 0 2892 +3146 0 2873 +3146 0 2847 +3146 0 2810 +3146 0 2755 +3146 0 2669 +3146 0 2521 +3146 0 2189 +3146 0 0 +3146 0 0 +3146 2533 0 +3280 3017 0 +3413 3304 0 +3546 3525 0 +3641 3678 0 +3725 3811 0 +3817 3943 0 +3917 4076 0 +4024 4095 0 +3284 0 3052 +3283 0 3052 +3283 0 3052 +3283 0 3051 +3283 0 3051 +3283 0 3050 +3283 0 3049 +3283 0 3047 +3283 0 3046 +3282 0 3043 +3282 0 3040 +3281 0 3035 +3280 0 3029 +3280 0 3021 +3280 0 3007 +3280 0 2988 +3280 0 2961 +3280 0 2922 +3280 0 2865 +3280 0 2773 +3280 0 2613 +3280 0 2237 +3280 0 0 +3280 0 0 +3280 2651 0 +3413 3145 0 +3546 3434 0 +3678 3655 0 +3775 3811 0 +3859 3943 0 +3950 4076 0 +4051 4095 0 +3416 0 3175 +3416 0 3175 +3416 0 3175 +3416 0 3174 +3416 0 3174 +3416 0 3173 +3415 0 3173 +3415 0 3171 +3415 0 3170 +3415 0 3168 +3414 0 3165 +3414 0 3162 +3414 0 3158 +3413 0 3151 +3413 0 3141 +3413 0 3127 +3413 0 3107 +3413 0 3079 +3413 0 3039 +3413 0 2979 +3413 0 2884 +3413 0 2715 +3413 0 2298 +3413 0 0 +3413 0 0 +3413 2773 0 +3546 3274 0 +3678 3564 0 +3811 3786 0 +3909 3943 0 +3992 4076 0 +4084 4095 0 +3548 0 3300 +3548 0 3300 +3548 0 3300 +3548 0 3299 +3548 0 3299 +3548 0 3299 +3548 0 3298 +3548 0 3297 +3548 0 3296 +3547 0 3295 +3547 0 3293 +3547 0 3290 +3546 0 3287 +3546 0 3282 +3546 0 3275 +3546 0 3264 +3546 0 3249 +3546 0 3229 +3546 0 3201 +3546 0 3160 +3546 0 3098 +3546 0 3000 +3546 0 2824 +3546 0 2365 +3546 0 0 +3546 0 0 +3546 2897 0 +3678 3403 0 +3811 3695 0 +3943 3917 0 +4042 4076 0 +4095 4095 0 +3680 0 3427 +3680 0 3426 +3680 0 3426 +3680 0 3426 +3680 0 3426 +3680 0 3426 +3680 0 3425 +3680 0 3425 +3680 0 3424 +3680 0 3423 +3679 0 3421 +3679 0 3419 +3679 0 3417 +3678 0 3413 +3678 0 3407 +3678 0 3400 +3678 0 3389 +3678 0 3374 +3678 0 3354 +3678 0 3325 +3678 0 3282 +3678 0 3220 +3678 0 3119 +3678 0 2936 +3678 0 2445 +3678 0 0 +3678 0 0 +3678 3023 0 +3811 3534 0 +3943 3826 0 +4076 4049 0 +4095 4095 0 +3812 0 3554 +3812 0 3554 +3812 0 3554 +3812 0 3554 +3812 0 3554 +3812 0 3554 +3812 0 3553 +3812 0 3553 +3812 0 3552 +3812 0 3552 +3812 0 3551 +3812 0 3549 +3811 0 3547 +3811 0 3545 +3811 0 3540 +3811 0 3534 +3811 0 3526 +3811 0 3516 +3811 0 3501 +3811 0 3480 +3811 0 3450 +3811 0 3408 +3811 0 3344 +3811 0 3241 +3811 0 3054 +3811 0 2531 +3811 0 0 +3811 0 0 +3811 3151 0 +3943 3664 0 +4076 3957 0 +4095 4095 0 +3944 0 3683 +3944 0 3683 +3944 0 3683 +3944 0 3683 +3944 0 3683 +3944 0 3683 +3944 0 3683 +3944 0 3682 +3944 0 3682 +3944 0 3681 +3944 0 3680 +3944 0 3679 +3944 0 3678 +3943 0 3676 +3943 0 3673 +3943 0 3668 +3943 0 3662 +3943 0 3655 +3943 0 3644 +3943 0 3628 +3943 0 3607 +3943 0 3578 +3943 0 3535 +3943 0 3470 +3943 0 3366 +3943 0 3175 +3943 0 2625 +3943 0 0 +3943 0 0 +3943 3279 0 +4076 3795 0 +4095 4089 0 +4076 0 3813 +4076 0 3813 +4076 0 3813 +4076 0 3813 +4076 0 3813 +4076 0 3813 +4076 0 3812 +4076 0 3812 +4076 0 3812 +4076 0 3812 +4076 0 3811 +4076 0 3810 +4076 0 3809 +4076 0 3808 +4076 0 3805 +4076 0 3802 +4076 0 3798 +4076 0 3792 +4076 0 3784 +4076 0 3773 +4076 0 3757 +4076 0 3736 +4076 0 3706 +4076 0 3663 +4076 0 3597 +4076 0 3492 +4076 0 3297 +4076 0 2726 +4076 0 0 +4076 0 0 +4076 3409 0 +4095 3927 0 +4095 0 3944 +4095 0 3944 +4095 0 3944 +4095 0 3944 +4095 0 3944 +4095 0 3944 +4095 0 3943 +4095 0 3943 +4095 0 3943 +4095 0 3943 +4095 0 3942 +4095 0 3941 +4095 0 3941 +4095 0 3940 +4095 0 3938 +4095 0 3935 +4095 0 3932 +4095 0 3927 +4095 0 3922 +4095 0 3913 +4095 0 3903 +4095 0 3887 +4095 0 3866 +4095 0 3836 +4095 0 3792 +4095 0 3727 +4095 0 3621 +4095 0 3424 +4095 0 2837 +4095 0 0 +4095 0 0 +4095 3539 0 +0 1696 1961 +0 1702 1961 +0 1709 1961 +0 1719 1961 +0 1732 1961 +0 1749 1961 +0 1770 1961 +0 1797 1961 +0 1831 1961 +0 1873 1961 +0 1923 1961 +0 1961 1938 +0 1961 1847 +0 1961 1686 +0 1961 1306 +0 2094 0 +0 2226 0 +1009 2358 0 +1706 2491 0 +2032 2623 0 +2269 2755 0 +2466 2887 0 +2641 3019 0 +2803 3152 0 +2956 3284 0 +3104 3416 0 +3247 3548 0 +3387 3680 0 +3525 3812 0 +3661 3944 0 +3797 4076 0 +3932 4095 0 +0 1690 1961 +0 1697 1961 +0 1705 1961 +0 1715 1961 +0 1728 1961 +0 1745 1961 +0 1766 1961 +0 1793 1961 +0 1828 1961 +0 1870 1961 +0 1920 1961 +0 1961 1940 +0 1961 1849 +0 1961 1689 +0 1961 1312 +0 2093 0 +0 2226 0 +1039 2358 0 +1713 2491 0 +2035 2623 0 +2271 2755 0 +2467 2887 0 +2642 3019 0 +2804 3152 0 +2957 3283 0 +3104 3416 0 +3247 3548 0 +3387 3680 0 +3525 3812 0 +3662 3944 0 +3797 4076 0 +3932 4095 0 +0 1682 1961 +0 1689 1961 +0 1699 1960 +0 1708 1960 +0 1722 1960 +0 1739 1960 +0 1761 1960 +0 1789 1960 +0 1823 1960 +0 1865 1960 +0 1917 1960 +0 1960 1941 +0 1960 1851 +0 1960 1692 +0 1960 1320 +0 2093 0 +0 2225 0 +1076 2358 0 +1722 2490 0 +2039 2623 0 +2274 2755 0 +2469 2887 0 +2643 3019 0 +2805 3152 0 +2957 3283 0 +3104 3416 0 +3247 3548 0 +3387 3680 0 +3525 3812 0 +3662 3944 0 +3797 4076 0 +3932 4095 0 +0 1672 1961 +0 1679 1961 +0 1688 1960 +0 1700 1959 +0 1714 1959 +0 1731 1959 +0 1754 1959 +0 1781 1959 +0 1817 1959 +0 1860 1959 +0 1911 1959 +0 1959 1944 +0 1959 1854 +0 1959 1697 +0 1959 1331 +0 2092 0 +0 2225 0 +1122 2357 0 +1733 2490 0 +2045 2622 0 +2277 2755 0 +2471 2887 0 +2645 3019 0 +2806 3151 0 +2958 3283 0 +3105 3416 0 +3248 3548 0 +3388 3680 0 +3526 3812 0 +3662 3944 0 +3797 4076 0 +3932 4095 0 +0 1657 1961 +0 1664 1961 +0 1674 1960 +0 1686 1959 +0 1703 1958 +0 1721 1958 +0 1743 1958 +0 1772 1958 +0 1808 1958 +0 1852 1958 +0 1905 1958 +0 1958 1948 +0 1958 1859 +0 1958 1703 +0 1958 1344 +0 2091 0 +0 2224 0 +1176 2357 0 +1748 2489 0 +2052 2622 0 +2281 2755 0 +2474 2887 0 +2647 3019 0 +2807 3151 0 +2959 3283 0 +3106 3416 0 +3248 3548 0 +3388 3680 0 +3526 3812 0 +3662 3944 0 +3797 4076 0 +3932 4095 0 +0 1636 1961 +0 1644 1961 +0 1654 1960 +0 1667 1959 +0 1684 1958 +0 1706 1956 +0 1730 1956 +0 1759 1956 +0 1796 1956 +0 1841 1956 +0 1895 1956 +0 1956 1953 +0 1956 1865 +0 1956 1711 +0 1956 1362 +0 2089 0 +0 2223 0 +1240 2356 0 +1767 2489 0 +2062 2621 0 +2287 2754 0 +2478 2887 0 +2649 3019 0 +2809 3151 0 +2960 3283 0 +3106 3416 0 +3249 3548 0 +3388 3680 0 +3526 3812 0 +3662 3944 0 +3797 4076 0 +3932 4095 0 +0 1607 1961 +0 1615 1961 +0 1626 1960 +0 1640 1959 +0 1658 1958 +0 1681 1956 +0 1711 1953 +0 1742 1953 +0 1779 1953 +0 1826 1953 +0 1882 1953 +0 1947 1953 +0 1953 1872 +0 1953 1722 +0 1953 1385 +0 2087 0 +0 2221 0 +1313 2355 0 +1791 2488 0 +2075 2621 0 +2295 2754 0 +2483 2886 0 +2653 3018 0 +2812 3151 0 +2962 3283 0 +3108 3415 0 +3250 3548 0 +3389 3680 0 +3527 3812 0 +3663 3944 0 +3798 4076 0 +3932 4095 0 +0 1565 1961 +0 1574 1961 +0 1586 1960 +0 1601 1959 +0 1621 1958 +0 1646 1956 +0 1678 1953 +0 1716 1950 +0 1757 1950 +0 1806 1950 +0 1864 1950 +0 1931 1950 +0 1950 1882 +0 1950 1736 +0 1950 1413 +0 2085 0 +0 2220 0 +1396 2353 0 +1822 2487 0 +2092 2620 0 +2305 2753 0 +2490 2886 0 +2658 3018 0 +2815 3151 0 +2965 3283 0 +3110 3415 0 +3251 3548 0 +3390 3680 0 +3528 3812 0 +3663 3944 0 +3798 4076 0 +3932 4095 0 +0 1503 1961 +0 1513 1961 +0 1526 1960 +0 1544 1959 +0 1566 1958 +0 1594 1956 +0 1629 1953 +0 1672 1950 +0 1724 1945 +0 1776 1945 +0 1838 1945 +0 1909 1945 +0 1945 1895 +0 1945 1754 +0 1945 1449 +0 2082 0 +140 2217 0 +1487 2352 0 +1859 2486 0 +2113 2619 0 +2319 2752 0 +2499 2885 0 +2664 3018 0 +2819 3151 0 +2968 3283 0 +3112 3415 0 +3253 3548 0 +3392 3680 0 +3528 3812 0 +3664 3944 0 +3798 4076 0 +3933 4095 0 +0 1402 1961 +0 1415 1961 +0 1431 1960 +0 1453 1959 +0 1480 1958 +0 1514 1956 +0 1555 1953 +0 1606 1950 +0 1665 1945 +0 1734 1939 +0 1801 1939 +0 1878 1939 +0 1939 1912 +0 1939 1776 +0 1939 1492 +0 2077 173 +932 2214 0 +1586 2349 0 +1906 2484 0 +2140 2618 0 +2336 2751 0 +2511 2885 0 +2672 3017 0 +2825 3150 0 +2972 3282 0 +3115 3415 0 +3255 3547 0 +3393 3680 0 +3530 3812 0 +3665 3944 0 +3799 4076 0 +3933 4095 0 +0 1220 1961 +0 1238 1961 +0 1263 1960 +0 1294 1959 +0 1332 1958 +0 1378 1956 +0 1433 1953 +0 1498 1950 +0 1572 1945 +0 1655 1939 +872 1748 1930 +872 1833 1930 +872 1927 1930 +872 1930 1805 +872 1930 1545 +79 2071 706 +1270 2209 0 +1692 2346 0 +1961 2481 0 +2174 2616 0 +2359 2750 0 +2526 2883 0 +2683 3016 0 +2833 3150 0 +2977 3282 0 +3119 3414 0 +3258 3547 0 +3395 3679 0 +3531 3812 0 +3666 3944 0 +3800 4076 0 +3934 4095 0 +0 726 1961 +0 780 1961 +0 844 1960 +0 917 1959 +0 1000 1958 +0 1091 1956 +0 1190 1953 +0 1295 1950 +0 1407 1945 +0 1523 1939 +872 1642 1930 +1223 1765 1919 +1223 1872 1919 +1223 1919 1841 +1223 1919 1607 +1006 2062 1005 +1512 2203 217 +1803 2341 0 +2026 2478 0 +2216 2613 0 +2387 2748 0 +2546 2882 0 +2697 3015 0 +2843 3149 0 +2985 3281 0 +3125 3414 0 +3262 3547 0 +3398 3679 0 +3533 3812 0 +3668 3944 0 +3801 4076 0 +3935 4095 0 +0 0 1961 +0 0 1961 +0 0 1960 +0 0 1959 +0 0 1958 +0 0 1956 +0 0 1953 +0 670 1950 +0 1007 1945 +0 1248 1939 +872 1447 1930 +1223 1624 1919 +1469 1787 1903 +1469 1903 1885 +1469 1903 1678 +1453 2051 1355 +1711 2194 1136 +1919 2335 345 +2100 2473 0 +2266 2610 0 +2422 2746 0 +2571 2880 0 +2715 3014 0 +2856 3148 0 +2995 3280 0 +3132 3414 0 +3268 3546 0 +3402 3679 0 +3536 3811 0 +3670 3944 0 +3803 4076 0 +3936 4095 0 +0 0 1961 +0 0 1961 +0 0 1960 +0 0 1959 +0 0 1958 +0 0 1956 +0 0 1953 +0 0 1950 +37 0 1945 +573 0 1939 +872 873 1930 +1223 1321 1919 +1469 1598 1903 +1671 1814 1880 +1671 1880 1759 +1730 2035 1601 +1888 2183 1487 +2038 2326 1269 +2184 2467 477 +2326 2605 0 +2465 2742 0 +2602 2878 0 +2738 3012 0 +2873 3146 0 +3007 3280 0 +3141 3413 0 +3275 3546 0 +3407 3678 0 +3540 3811 0 +3673 3943 0 +3805 4076 0 +3938 4095 0 +1306 0 1961 +1312 0 1961 +1320 0 1960 +1331 0 1959 +1344 0 1958 +1362 0 1956 +1385 0 1953 +1413 0 1950 +1449 0 1945 +1492 0 1939 +1545 872 1930 +1607 1223 1919 +1678 1469 1903 +1759 1671 1880 +1849 1849 1849 +1946 2013 1803 +2051 2167 1733 +2161 2315 1619 +2276 2459 1401 +2395 2599 611 +2517 2738 0 +2641 2874 0 +2767 3010 0 +2895 3144 0 +3024 3278 0 +3154 3412 0 +3284 3545 0 +3414 3678 0 +3545 3810 0 +3677 3943 0 +3808 4075 0 +3940 4095 0 +1816 0 2094 +1818 0 2093 +1821 0 2093 +1824 0 2092 +1829 0 2091 +1835 0 2089 +1843 0 2087 +1854 0 2085 +1868 0 2082 +1886 0 2077 +1908 79 2071 +1937 1005 2062 +1973 1355 2051 +2017 1601 2035 +2013 1803 1946 +2013 1891 1803 +2167 2149 1733 +2268 2315 1619 +2362 2459 1401 +2462 2599 611 +2569 2738 0 +2681 2874 0 +2798 3010 0 +2919 3144 0 +3041 3278 0 +3167 3412 0 +3294 3545 0 +3422 3678 0 +3551 3810 0 +3681 3943 0 +3811 4075 0 +3942 4095 0 +2108 0 2226 +2109 0 2226 +2111 0 2225 +2112 0 2225 +2115 0 2224 +2118 0 2223 +2123 0 2221 +2128 0 2220 +2136 0 2217 +2146 0 2214 +2159 0 2209 +2176 217 2203 +2194 1136 2191 +2183 1487 2136 +2167 1733 2051 +2167 1733 1862 +2167 1943 1733 +2315 2237 1619 +2455 2459 1401 +2538 2599 611 +2631 2738 0 +2730 2874 0 +2836 3010 0 +2948 3144 0 +3064 3278 0 +3184 3412 0 +3307 3545 0 +3432 3678 0 +3559 3810 0 +3687 3943 0 +3816 4075 0 +3945 4095 0 +2332 0 2358 +2332 0 2358 +2333 0 2358 +2334 0 2357 +2335 0 2357 +2338 0 2356 +2340 0 2355 +2344 0 2353 +2349 0 2352 +2349 0 2343 +2346 0 2328 +2341 0 2305 +2335 345 2274 +2326 1269 2229 +2315 1619 2161 +2315 1619 2020 +2315 1619 1718 +2315 2003 1619 +2459 2334 1401 +2599 2572 611 +2702 2738 0 +2788 2874 0 +2883 3010 0 +2985 3144 0 +3093 3278 0 +3206 3412 0 +3324 3545 0 +3445 3678 0 +3569 3810 0 +3694 3943 0 +3821 4075 0 +3950 4095 0 +2491 0 2458 +2491 0 2457 +2490 0 2456 +2490 0 2454 +2489 0 2452 +2489 0 2449 +2488 0 2445 +2487 0 2440 +2486 0 2433 +2484 0 2423 +2481 0 2410 +2478 0 2392 +2473 0 2366 +2467 477 2330 +2459 1401 2276 +2459 1401 2171 +2459 1401 1976 +2459 1401 1403 +2459 2073 1401 +2599 2437 611 +2738 2688 0 +2856 2874 0 +2939 3010 0 +3030 3144 0 +3129 3278 0 +3234 3412 0 +3346 3545 0 +3462 3678 0 +3582 3810 0 +3704 3943 0 +3829 4075 0 +3955 4095 0 +2623 0 2541 +2623 0 2540 +2623 0 2539 +2622 0 2538 +2622 0 2536 +2621 0 2533 +2621 0 2530 +2620 0 2526 +2619 0 2520 +2618 0 2512 +2616 0 2501 +2613 0 2487 +2610 0 2466 +2605 0 2437 +2599 611 2395 +2599 611 2316 +2599 611 2183 +2599 611 1908 +2599 1236 611 +2599 2153 611 +2738 2547 0 +2874 2807 0 +3004 3010 0 +3084 3144 0 +3173 3278 0 +3270 3412 0 +3374 3545 0 +3483 3678 0 +3598 3810 0 +3717 3943 0 +3838 4075 0 +3963 4095 0 +2755 0 2632 +2755 0 2632 +2755 0 2631 +2755 0 2630 +2755 0 2628 +2754 0 2627 +2754 0 2624 +2753 0 2620 +2752 0 2616 +2751 0 2609 +2750 0 2601 +2748 0 2589 +2746 0 2572 +2742 0 2550 +2738 0 2517 +2738 0 2458 +2738 0 2365 +2738 0 2200 +2738 0 1799 +2738 817 0 +2738 2241 0 +2874 2661 0 +3010 2928 0 +3144 3141 0 +3225 3278 0 +3313 3412 0 +3408 3545 0 +3511 3678 0 +3620 3810 0 +3733 3943 0 +3851 4075 0 +3972 4095 0 +2887 0 2732 +2887 0 2731 +2887 0 2731 +2887 0 2730 +2887 0 2728 +2887 0 2727 +2886 0 2725 +2886 0 2722 +2885 0 2718 +2885 0 2713 +2883 0 2706 +2882 0 2697 +2880 0 2684 +2878 0 2666 +2874 0 2641 +2874 0 2597 +2874 0 2530 +2874 0 2423 +2874 0 2220 +2874 0 1596 +2874 0 0 +2874 2338 0 +3010 2778 0 +3144 3053 0 +3278 3269 0 +3365 3412 0 +3451 3545 0 +3545 3678 0 +3647 3810 0 +3755 3943 0 +3868 4075 0 +3985 4095 0 +3019 0 2837 +3019 0 2837 +3019 0 2836 +3019 0 2836 +3019 0 2835 +3019 0 2834 +3018 0 2832 +3018 0 2830 +3018 0 2827 +3017 0 2823 +3016 0 2817 +3015 0 2810 +3014 0 2800 +3012 0 2786 +3010 0 2767 +3010 0 2734 +3010 0 2686 +3010 0 2612 +3010 0 2489 +3010 0 2247 +3010 0 922 +3010 0 0 +3010 2441 0 +3144 2901 0 +3278 3180 0 +3412 3397 0 +3502 3545 0 +3587 3678 0 +3680 3810 0 +3781 3943 0 +3889 4075 0 +4002 4095 0 +3152 0 2949 +3152 0 2949 +3152 0 2948 +3151 0 2948 +3151 0 2947 +3151 0 2946 +3151 0 2945 +3151 0 2943 +3151 0 2941 +3150 0 2938 +3150 0 2933 +3149 0 2928 +3148 0 2920 +3146 0 2910 +3144 0 2895 +3144 0 2870 +3144 0 2835 +3144 0 2783 +3144 0 2703 +3144 0 2566 +3144 0 2280 +3144 0 0 +3144 0 0 +3144 2551 0 +3278 3023 0 +3412 3307 0 +3545 3526 0 +3638 3678 0 +3722 3810 0 +3815 3943 0 +3916 4075 0 +4023 4095 0 +3284 0 3065 +3283 0 3065 +3283 0 3064 +3283 0 3064 +3283 0 3063 +3283 0 3062 +3283 0 3062 +3283 0 3060 +3283 0 3059 +3282 0 3056 +3282 0 3053 +3281 0 3049 +3280 0 3043 +3280 0 3034 +3278 0 3024 +3278 0 3005 +3278 0 2979 +3278 0 2942 +3278 0 2886 +3278 0 2800 +3278 0 2651 +3278 0 2320 +3278 0 0 +3278 0 0 +3278 2665 0 +3412 3150 0 +3545 3436 0 +3678 3657 0 +3773 3810 0 +3857 3943 0 +3949 4075 0 +4049 4095 0 +3416 0 3184 +3416 0 3184 +3416 0 3184 +3416 0 3184 +3416 0 3184 +3416 0 3183 +3415 0 3182 +3415 0 3181 +3415 0 3180 +3415 0 3178 +3414 0 3175 +3414 0 3172 +3414 0 3168 +3413 0 3162 +3412 0 3154 +3412 0 3140 +3412 0 3120 +3412 0 3093 +3412 0 3055 +3412 0 2997 +3412 0 2906 +3412 0 2746 +3412 0 2371 +3412 0 0 +3412 0 0 +3412 2784 0 +3545 3278 0 +3678 3566 0 +3810 3787 0 +3907 3943 0 +3991 4075 0 +4083 4095 0 +3548 0 3307 +3548 0 3307 +3548 0 3307 +3548 0 3307 +3548 0 3307 +3548 0 3306 +3548 0 3305 +3548 0 3305 +3548 0 3303 +3547 0 3302 +3547 0 3300 +3547 0 3298 +3546 0 3294 +3546 0 3290 +3545 0 3284 +3545 0 3273 +3545 0 3259 +3545 0 3239 +3545 0 3211 +3545 0 3171 +3545 0 3111 +3545 0 3016 +3545 0 2848 +3545 0 2429 +3545 0 0 +3545 0 0 +3545 2905 0 +3678 3406 0 +3810 3696 0 +3943 3918 0 +4041 4075 0 +4095 4095 0 +3680 0 3432 +3680 0 3432 +3680 0 3432 +3680 0 3432 +3680 0 3431 +3680 0 3431 +3680 0 3431 +3680 0 3430 +3680 0 3429 +3680 0 3428 +3679 0 3427 +3679 0 3425 +3679 0 3422 +3678 0 3419 +3678 0 3414 +3678 0 3407 +3678 0 3396 +3678 0 3381 +3678 0 3361 +3678 0 3333 +3678 0 3291 +3678 0 3230 +3678 0 3132 +3678 0 2955 +3678 0 2499 +3678 0 0 +3678 0 0 +3678 3029 0 +3810 3536 0 +3943 3827 0 +4075 4049 0 +4095 4095 0 +3812 0 3559 +3812 0 3559 +3812 0 3559 +3812 0 3558 +3812 0 3558 +3812 0 3558 +3812 0 3558 +3812 0 3557 +3812 0 3557 +3812 0 3556 +3812 0 3555 +3812 0 3553 +3811 0 3552 +3811 0 3549 +3810 0 3545 +3810 0 3540 +3810 0 3532 +3810 0 3521 +3810 0 3506 +3810 0 3486 +3810 0 3457 +3810 0 3415 +3810 0 3352 +3810 0 3251 +3810 0 3069 +3810 0 2576 +3810 0 0 +3810 0 0 +3810 3155 0 +3943 3665 0 +4075 3958 0 +4095 4095 0 +3944 0 3687 +3944 0 3687 +3944 0 3687 +3944 0 3686 +3944 0 3686 +3944 0 3686 +3944 0 3686 +3944 0 3686 +3944 0 3685 +3944 0 3685 +3944 0 3684 +3944 0 3683 +3944 0 3681 +3943 0 3679 +3943 0 3677 +3943 0 3672 +3943 0 3666 +3943 0 3659 +3943 0 3648 +3943 0 3632 +3943 0 3612 +3943 0 3583 +3943 0 3540 +3943 0 3476 +3943 0 3374 +3943 0 3186 +3943 0 2662 +3943 0 0 +3943 0 0 +3943 3283 0 +4075 3796 0 +4095 4089 0 +4076 0 3816 +4076 0 3816 +4076 0 3816 +4076 0 3815 +4076 0 3815 +4076 0 3815 +4076 0 3815 +4076 0 3815 +4076 0 3814 +4076 0 3814 +4076 0 3813 +4076 0 3812 +4076 0 3812 +4076 0 3810 +4075 0 3808 +4075 0 3805 +4075 0 3801 +4075 0 3795 +4075 0 3787 +4075 0 3776 +4075 0 3760 +4075 0 3739 +4075 0 3710 +4075 0 3667 +4075 0 3602 +4075 0 3498 +4075 0 3306 +4075 0 2756 +4075 0 0 +4075 0 0 +4075 3411 0 +4095 3927 0 +4095 0 3946 +4095 0 3946 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3945 +4095 0 3944 +4095 0 3944 +4095 0 3943 +4095 0 3942 +4095 0 3941 +4095 0 3940 +4095 0 3937 +4095 0 3934 +4095 0 3930 +4095 0 3924 +4095 0 3916 +4095 0 3905 +4095 0 3889 +4095 0 3868 +4095 0 3838 +4095 0 3795 +4095 0 3730 +4095 0 3625 +4095 0 3430 +4095 0 2861 +4095 0 0 +4095 0 0 +4095 3541 0 +0 1827 2094 +0 1831 2094 +0 1837 2094 +0 1845 2094 +0 1855 2094 +0 1867 2094 +0 1884 2094 +0 1905 2094 +0 1932 2094 +0 1966 2094 +0 2007 2094 +0 2058 2094 +0 2094 2069 +0 2094 1977 +0 2094 1816 +0 2094 1433 +0 2226 0 +0 2358 0 +1120 2491 0 +1833 2623 0 +2162 2755 0 +2400 2887 0 +2597 3019 0 +2773 3152 0 +2935 3284 0 +3088 3416 0 +3236 3548 0 +3379 3680 0 +3519 3812 0 +3657 3944 0 +3793 4076 0 +3929 4095 0 +0 1823 2094 +0 1828 2093 +0 1834 2093 +0 1841 2093 +0 1851 2093 +0 1864 2093 +0 1881 2093 +0 1902 2093 +0 1929 2093 +0 1963 2093 +0 2005 2093 +0 2056 2093 +0 2093 2070 +0 2093 1979 +0 2093 1818 +0 2093 1438 +0 2226 0 +0 2358 0 +1143 2491 0 +1838 2623 0 +2164 2755 0 +2401 2887 0 +2598 3019 0 +2773 3152 0 +2935 3283 0 +3088 3416 0 +3236 3548 0 +3379 3680 0 +3519 3812 0 +3657 3944 0 +3793 4076 0 +3929 4095 0 +0 1817 2094 +0 1822 2093 +0 1829 2093 +0 1837 2093 +0 1847 2093 +0 1860 2093 +0 1877 2093 +0 1898 2093 +0 1926 2093 +0 1960 2093 +0 2002 2093 +0 2053 2093 +0 2093 2071 +0 2093 1981 +0 2093 1821 +0 2093 1444 +0 2225 0 +0 2358 0 +1173 2490 0 +1845 2623 0 +2167 2755 0 +2403 2887 0 +2599 3019 0 +2774 3152 0 +2936 3283 0 +3089 3416 0 +3236 3548 0 +3379 3680 0 +3519 3812 0 +3657 3944 0 +3793 4076 0 +3929 4095 0 +0 1809 2094 +0 1814 2093 +0 1821 2093 +0 1830 2092 +0 1841 2092 +0 1854 2092 +0 1871 2092 +0 1893 2092 +0 1920 2092 +0 1955 2092 +0 1997 2092 +0 2049 2092 +0 2092 2073 +0 2092 1983 +0 2092 1824 +0 2092 1452 +0 2225 0 +0 2357 0 +1210 2490 0 +1853 2622 0 +2172 2755 0 +2406 2887 0 +2601 3019 0 +2775 3151 0 +2936 3283 0 +3089 3416 0 +3237 3548 0 +3379 3680 0 +3520 3812 0 +3657 3944 0 +3794 4076 0 +3929 4095 0 +0 1798 2094 +0 1804 2093 +0 1811 2093 +0 1820 2092 +0 1832 2091 +0 1846 2091 +0 1863 2091 +0 1885 2091 +0 1913 2091 +0 1949 2091 +0 1992 2091 +0 2044 2091 +0 2091 2076 +0 2091 1986 +0 2091 1829 +0 2091 1463 +0 2224 0 +0 2357 0 +1255 2489 0 +1865 2622 0 +2177 2755 0 +2409 2887 0 +2603 3019 0 +2777 3151 0 +2938 3283 0 +3090 3416 0 +3237 3548 0 +3380 3680 0 +3520 3812 0 +3658 3944 0 +3794 4076 0 +3929 4095 0 +0 1783 2094 +0 1789 2093 +0 1796 2093 +0 1806 2092 +0 1819 2091 +0 1835 2089 +0 1853 2089 +0 1875 2089 +0 1904 2089 +0 1940 2089 +0 1984 2089 +0 2037 2089 +0 2089 2080 +0 2089 1991 +0 2089 1835 +0 2089 1476 +0 2223 0 +0 2356 0 +1310 2489 0 +1880 2621 0 +2185 2754 0 +2413 2887 0 +2606 3019 0 +2779 3151 0 +2939 3283 0 +3091 3416 0 +3238 3548 0 +3380 3680 0 +3520 3812 0 +3658 3944 0 +3794 4076 0 +3929 4095 0 +0 1763 2094 +0 1768 2093 +0 1776 2093 +0 1786 2092 +0 1799 2091 +0 1816 2089 +0 1838 2087 +0 1862 2087 +0 1891 2087 +0 1928 2087 +0 1973 2087 +0 2027 2087 +0 2087 2085 +0 2087 1996 +0 2087 1843 +0 2087 1494 +0 2221 0 +0 2355 0 +1373 2488 0 +1899 2621 0 +2195 2754 0 +2419 2886 0 +2610 3018 0 +2782 3151 0 +2941 3283 0 +3093 3415 0 +3239 3548 0 +3381 3680 0 +3521 3812 0 +3658 3944 0 +3794 4076 0 +3930 4095 0 +0 1733 2094 +0 1739 2093 +0 1748 2093 +0 1758 2092 +0 1772 2091 +0 1790 2089 +0 1813 2087 +0 1843 2085 +0 1873 2085 +0 1912 2085 +0 1958 2085 +0 2014 2085 +0 2079 2085 +0 2085 2004 +0 2085 1854 +0 2085 1517 +0 2220 0 +0 2353 0 +1446 2487 0 +1923 2620 0 +2208 2753 0 +2427 2886 0 +2615 3018 0 +2785 3151 0 +2943 3283 0 +3094 3415 0 +3240 3548 0 +3382 3680 0 +3521 3812 0 +3659 3944 0 +3795 4076 0 +3930 4095 0 +0 1691 2094 +0 1698 2093 +0 1706 2093 +0 1718 2092 +0 1733 2091 +0 1753 2089 +0 1778 2087 +0 1810 2085 +0 1849 2082 +0 1889 2082 +0 1938 2082 +0 1996 2082 +0 2063 2082 +0 2082 2014 +0 2082 1868 +0 2082 1545 +0 2217 0 +0 2352 0 +1529 2486 0 +1954 2619 0 +2224 2752 0 +2438 2885 0 +2622 3018 0 +2790 3151 0 +2947 3283 0 +3097 3415 0 +3242 3548 0 +3383 3680 0 +3522 3812 0 +3659 3944 0 +3795 4076 0 +3930 4095 0 +0 1626 2094 +0 1635 2093 +0 1645 2093 +0 1658 2092 +0 1676 2091 +0 1698 2089 +0 1726 2087 +0 1761 2085 +0 1804 2082 +0 1856 2077 +0 1908 2077 +0 1970 2077 +0 2041 2077 +0 2077 2027 +0 2077 1886 +0 2077 1581 +0 2214 0 +275 2349 0 +1620 2484 0 +1991 2618 0 +2245 2751 0 +2451 2885 0 +2631 3017 0 +2796 3150 0 +2951 3282 0 +3100 3415 0 +3244 3547 0 +3385 3680 0 +3523 3812 0 +3661 3944 0 +3796 4076 0 +3931 4095 0 +0 1524 2094 +0 1534 2093 +0 1547 2093 +0 1564 2092 +0 1585 2091 +0 1612 2089 +0 1646 2087 +0 1687 2085 +0 1738 2082 +0 1797 2077 +79 1866 2071 +79 1934 2071 +79 2010 2071 +79 2071 2044 +79 2071 1908 +79 2071 1625 +0 2209 303 +1064 2346 0 +1719 2481 0 +2038 2616 0 +2273 2750 0 +2469 2883 0 +2643 3016 0 +2804 3150 0 +2957 3282 0 +3104 3414 0 +3247 3547 0 +3387 3679 0 +3525 3812 0 +3662 3944 0 +3797 4076 0 +3932 4095 0 +0 1336 2094 +0 1351 2093 +0 1370 2093 +0 1394 2092 +0 1425 2091 +0 1463 2089 +0 1509 2087 +0 1565 2085 +0 1630 2082 +0 1704 2077 +79 1787 2071 +1005 1880 2062 +1005 1965 2062 +1005 2059 2062 +1005 2062 1937 +1005 2062 1677 +217 2203 838 +1403 2341 0 +1824 2478 0 +2093 2613 0 +2306 2748 0 +2491 2882 0 +2658 3015 0 +2815 3149 0 +2965 3281 0 +3110 3414 0 +3251 3547 0 +3390 3679 0 +3528 3812 0 +3663 3944 0 +3798 4076 0 +3932 4095 0 +0 814 2094 +0 859 2093 +0 913 2093 +0 977 2092 +0 1050 2091 +0 1133 2089 +0 1224 2087 +0 1322 2085 +0 1428 2082 +0 1539 2077 +79 1655 2071 +1005 1774 2062 +1355 1897 2051 +1355 2004 2051 +1355 2051 1973 +1355 2051 1739 +1137 2194 1136 +1644 2335 345 +1935 2473 0 +2158 2610 0 +2348 2746 0 +2519 2880 0 +2678 3014 0 +2829 3148 0 +2975 3280 0 +3117 3414 0 +3257 3546 0 +3394 3679 0 +3530 3811 0 +3666 3944 0 +3800 4076 0 +3934 4095 0 +0 0 2094 +0 0 2093 +0 0 2093 +0 0 2092 +0 0 2091 +0 0 2089 +0 0 2087 +0 10 2085 +0 800 2082 +0 1138 2077 +79 1379 2071 +1005 1579 2062 +1355 1756 2051 +1601 1919 2035 +1601 2035 2017 +1601 2035 1811 +1585 2183 1487 +1843 2326 1269 +2051 2467 477 +2233 2605 0 +2398 2742 0 +2554 2878 0 +2703 3012 0 +2847 3146 0 +2988 3280 0 +3127 3413 0 +3264 3546 0 +3400 3678 0 +3534 3811 0 +3668 3943 0 +3802 4076 0 +3935 4095 0 +0 0 2094 +0 0 2093 +0 0 2093 +0 0 2092 +0 0 2091 +0 0 2089 +0 0 2087 +0 0 2085 +0 0 2082 +173 0 2077 +706 79 2071 +1005 1006 2062 +1355 1453 2051 +1601 1730 2035 +1803 1946 2013 +1803 2013 1891 +1862 2167 1733 +2020 2315 1619 +2171 2459 1401 +2316 2599 611 +2458 2738 0 +2597 2874 0 +2734 3010 0 +2870 3144 0 +3005 3278 0 +3140 3412 0 +3273 3545 0 +3407 3678 0 +3540 3810 0 +3672 3943 0 +3805 4075 0 +3937 4095 0 +1433 0 2094 +1438 0 2093 +1444 0 2093 +1452 0 2092 +1463 0 2091 +1476 0 2089 +1494 0 2087 +1517 0 2085 +1545 0 2082 +1581 0 2077 +1625 79 2071 +1677 1005 2062 +1739 1355 2051 +1811 1601 2035 +1891 1803 2013 +1981 1981 1981 +2078 2145 1935 +2183 2299 1865 +2293 2447 1751 +2408 2591 1533 +2527 2731 738 +2649 2870 0 +2773 3006 0 +2900 3142 0 +3027 3276 0 +3156 3410 0 +3285 3544 0 +3416 3677 0 +3547 3810 0 +3677 3943 0 +3809 4075 0 +3940 4095 0 +1946 0 2226 +1948 0 2226 +1950 0 2225 +1953 0 2225 +1956 0 2224 +1961 0 2223 +1967 0 2221 +1975 0 2220 +1986 0 2217 +2000 0 2214 +2018 0 2209 +2041 217 2203 +2069 1136 2194 +2105 1487 2183 +2149 1733 2167 +2145 1935 2078 +2145 2023 1935 +2299 2281 1865 +2401 2447 1751 +2493 2591 1533 +2594 2731 738 +2701 2870 0 +2813 3006 0 +2931 3142 0 +3050 3276 0 +3174 3410 0 +3299 3544 0 +3426 3677 0 +3554 3810 0 +3683 3943 0 +3813 4075 0 +3944 4095 0 +2239 0 2358 +2240 0 2358 +2241 0 2358 +2243 0 2357 +2245 0 2357 +2247 0 2356 +2251 0 2355 +2255 0 2353 +2261 0 2352 +2268 0 2349 +2278 0 2346 +2291 0 2341 +2308 345 2335 +2326 1269 2323 +2315 1619 2268 +2299 1865 2183 +2299 1865 1994 +2299 2075 1865 +2447 2370 1751 +2587 2591 1533 +2671 2731 738 +2763 2870 0 +2862 3006 0 +2969 3142 0 +3080 3276 0 +3196 3410 0 +3316 3544 0 +3439 3677 0 +3564 3810 0 +3691 3943 0 +3818 4075 0 +3948 4095 0 +2463 0 2491 +2464 0 2491 +2464 0 2490 +2465 0 2490 +2466 0 2489 +2468 0 2489 +2470 0 2488 +2473 0 2487 +2476 0 2486 +2481 0 2484 +2481 0 2475 +2478 0 2460 +2473 0 2438 +2467 477 2407 +2459 1401 2362 +2447 1751 2293 +2447 1751 2152 +2447 1751 1850 +2447 2135 1751 +2591 2466 1533 +2731 2705 738 +2834 2870 0 +2920 3006 0 +3015 3142 0 +3117 3276 0 +3225 3410 0 +3339 3544 0 +3456 3677 0 +3577 3810 0 +3701 3943 0 +3826 4075 0 +3953 4095 0 +2623 0 2590 +2623 0 2590 +2623 0 2589 +2622 0 2588 +2622 0 2586 +2621 0 2584 +2621 0 2581 +2620 0 2577 +2619 0 2572 +2618 0 2565 +2616 0 2555 +2613 0 2542 +2610 0 2524 +2605 0 2498 +2599 611 2462 +2591 1533 2408 +2591 1533 2303 +2591 1533 2108 +2591 1533 1533 +2591 2206 1533 +2731 2570 738 +2870 2820 0 +2988 3006 0 +3071 3142 0 +3162 3276 0 +3261 3410 0 +3367 3544 0 +3478 3677 0 +3594 3810 0 +3713 3943 0 +3836 4075 0 +3961 4095 0 +2755 0 2673 +2755 0 2673 +2755 0 2672 +2755 0 2671 +2755 0 2670 +2754 0 2668 +2754 0 2666 +2753 0 2662 +2752 0 2658 +2751 0 2652 +2750 0 2645 +2748 0 2634 +2746 0 2619 +2742 0 2598 +2738 0 2569 +2731 738 2527 +2731 738 2448 +2731 738 2315 +2731 738 2040 +2731 1362 738 +2731 2285 738 +2870 2678 0 +3006 2939 0 +3136 3142 0 +3216 3276 0 +3305 3410 0 +3402 3544 0 +3506 3677 0 +3616 3810 0 +3730 3943 0 +3849 4075 0 +3971 4095 0 +2887 0 2765 +2887 0 2764 +2887 0 2764 +2887 0 2763 +2887 0 2762 +2887 0 2761 +2886 0 2759 +2886 0 2756 +2885 0 2752 +2885 0 2748 +2883 0 2741 +2882 0 2733 +2880 0 2721 +2878 0 2704 +2874 0 2681 +2870 0 2649 +2870 0 2590 +2870 0 2497 +2870 0 2332 +2870 0 1932 +2870 963 0 +2870 2374 0 +3006 2792 0 +3142 3061 0 +3276 3273 0 +3358 3410 0 +3445 3544 0 +3540 3677 0 +3643 3810 0 +3752 3943 0 +3865 4075 0 +3983 4095 0 +3019 0 2864 +3019 0 2863 +3019 0 2863 +3019 0 2863 +3019 0 2862 +3019 0 2860 +3018 0 2859 +3018 0 2857 +3018 0 2854 +3017 0 2850 +3016 0 2845 +3015 0 2838 +3014 0 2829 +3012 0 2816 +3010 0 2798 +3006 0 2773 +3006 0 2729 +3006 0 2662 +3006 0 2554 +3006 0 2352 +3006 0 1723 +3006 0 0 +3006 2470 0 +3142 2911 0 +3276 3185 0 +3410 3401 0 +3497 3544 0 +3583 3677 0 +3677 3810 0 +3779 3943 0 +3887 4075 0 +4000 4095 0 +3152 0 2970 +3152 0 2970 +3152 0 2969 +3151 0 2969 +3151 0 2968 +3151 0 2967 +3151 0 2966 +3151 0 2964 +3151 0 2962 +3150 0 2959 +3150 0 2955 +3149 0 2950 +3148 0 2942 +3146 0 2932 +3144 0 2919 +3142 0 2900 +3142 0 2867 +3142 0 2818 +3142 0 2744 +3142 0 2622 +3142 0 2379 +3142 0 1068 +3142 0 0 +3142 2573 0 +3276 3032 0 +3410 3311 0 +3544 3529 0 +3634 3677 0 +3719 3810 0 +3813 3943 0 +3913 4075 0 +4021 4095 0 +3284 0 3081 +3283 0 3081 +3283 0 3081 +3283 0 3080 +3283 0 3080 +3283 0 3079 +3283 0 3078 +3283 0 3077 +3283 0 3075 +3282 0 3073 +3282 0 3070 +3281 0 3065 +3280 0 3060 +3280 0 3052 +3278 0 3041 +3276 0 3027 +3276 0 3002 +3276 0 2967 +3276 0 2915 +3276 0 2834 +3276 0 2698 +3276 0 2411 +3276 0 0 +3276 0 0 +3276 2683 0 +3410 3156 0 +3544 3440 0 +3677 3659 0 +3770 3810 0 +3854 3943 0 +3947 4075 0 +4048 4095 0 +3416 0 3197 +3416 0 3197 +3416 0 3197 +3416 0 3196 +3416 0 3196 +3416 0 3196 +3415 0 3195 +3415 0 3194 +3415 0 3192 +3415 0 3191 +3414 0 3188 +3414 0 3185 +3414 0 3181 +3413 0 3175 +3412 0 3167 +3410 0 3156 +3410 0 3137 +3410 0 3111 +3410 0 3074 +3410 0 3019 +3410 0 2933 +3410 0 2784 +3410 0 2453 +3410 0 0 +3410 0 0 +3410 2797 0 +3544 3282 0 +3677 3568 0 +3810 3789 0 +3905 3943 0 +3989 4075 0 +4082 4095 0 +3548 0 3317 +3548 0 3317 +3548 0 3317 +3548 0 3316 +3548 0 3316 +3548 0 3316 +3548 0 3315 +3548 0 3314 +3548 0 3313 +3547 0 3312 +3547 0 3310 +3547 0 3307 +3546 0 3304 +3546 0 3300 +3545 0 3294 +3544 0 3285 +3544 0 3272 +3544 0 3253 +3544 0 3225 +3544 0 3186 +3544 0 3129 +3544 0 3038 +3544 0 2879 +3544 0 2502 +3544 0 0 +3544 0 0 +3544 2916 0 +3677 3410 0 +3810 3698 0 +3943 3920 0 +4039 4075 0 +4095 4095 0 +3680 0 3440 +3680 0 3439 +3680 0 3439 +3680 0 3439 +3680 0 3439 +3680 0 3438 +3680 0 3438 +3680 0 3437 +3680 0 3437 +3680 0 3436 +3679 0 3434 +3679 0 3432 +3679 0 3430 +3678 0 3426 +3678 0 3422 +3677 0 3416 +3677 0 3405 +3677 0 3391 +3677 0 3371 +3677 0 3344 +3677 0 3303 +3677 0 3243 +3677 0 3149 +3677 0 2980 +3677 0 2562 +3677 0 0 +3677 0 0 +3677 3037 0 +3810 3538 0 +3943 3828 0 +4075 4050 0 +4095 4095 0 +3812 0 3564 +3812 0 3564 +3812 0 3564 +3812 0 3564 +3812 0 3564 +3812 0 3564 +3812 0 3563 +3812 0 3563 +3812 0 3562 +3812 0 3562 +3812 0 3561 +3812 0 3559 +3811 0 3557 +3811 0 3554 +3810 0 3551 +3810 0 3547 +3810 0 3539 +3810 0 3528 +3810 0 3514 +3810 0 3493 +3810 0 3465 +3810 0 3424 +3810 0 3362 +3810 0 3264 +3810 0 3088 +3810 0 2631 +3810 0 0 +3810 0 0 +3810 3161 0 +3943 3667 0 +4075 3959 0 +4095 4095 0 +3944 0 3691 +3944 0 3691 +3944 0 3691 +3944 0 3691 +3944 0 3691 +3944 0 3690 +3944 0 3690 +3944 0 3690 +3944 0 3689 +3944 0 3689 +3944 0 3688 +3944 0 3687 +3944 0 3685 +3943 0 3683 +3943 0 3681 +3943 0 3677 +3943 0 3672 +3943 0 3664 +3943 0 3653 +3943 0 3638 +3943 0 3618 +3943 0 3589 +3943 0 3547 +3943 0 3484 +3943 0 3384 +3943 0 3201 +3943 0 2708 +3943 0 0 +3943 0 0 +3943 3287 0 +4075 3797 0 +4095 4090 0 +4076 0 3819 +4076 0 3819 +4076 0 3819 +4076 0 3818 +4076 0 3818 +4076 0 3818 +4076 0 3818 +4076 0 3818 +4076 0 3818 +4076 0 3817 +4076 0 3816 +4076 0 3816 +4076 0 3814 +4076 0 3813 +4075 0 3811 +4075 0 3809 +4075 0 3804 +4075 0 3798 +4075 0 3790 +4075 0 3780 +4075 0 3765 +4075 0 3744 +4075 0 3714 +4075 0 3672 +4075 0 3608 +4075 0 3505 +4075 0 3318 +4075 0 2793 +4075 0 0 +4075 0 0 +4075 3415 0 +4095 3929 0 +4095 0 3948 +4095 0 3948 +4095 0 3948 +4095 0 3948 +4095 0 3948 +4095 0 3948 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3947 +4095 0 3946 +4095 0 3946 +4095 0 3945 +4095 0 3944 +4095 0 3942 +4095 0 3940 +4095 0 3937 +4095 0 3933 +4095 0 3927 +4095 0 3919 +4095 0 3908 +4095 0 3893 +4095 0 3872 +4095 0 3842 +4095 0 3799 +4095 0 3735 +4095 0 3630 +4095 0 3439 +4095 0 2890 +4095 0 0 +4095 0 0 +4095 3544 0 +0 1959 2226 +0 1962 2226 +0 1966 2226 +0 1972 2226 +0 1979 2226 +0 1989 2226 +0 2002 2226 +0 2018 2226 +0 2039 2226 +0 2066 2226 +0 2100 2226 +0 2141 2226 +0 2191 2226 +0 2226 2200 +0 2226 2108 +0 2226 1946 +0 2226 1562 +0 2358 0 +0 2491 0 +1232 2623 0 +1962 2755 0 +2292 2887 0 +2530 3019 0 +2729 3152 0 +2904 3284 0 +3067 3416 0 +3220 3548 0 +3367 3680 0 +3511 3812 0 +3651 3944 0 +3789 4076 0 +3926 4095 0 +0 1956 2226 +0 1959 2226 +0 1963 2226 +0 1969 2226 +0 1977 2226 +0 1987 2226 +0 1999 2226 +0 2016 2226 +0 2037 2226 +0 2064 2226 +0 2098 2226 +0 2140 2226 +0 2190 2226 +0 2226 2201 +0 2226 2109 +0 2226 1948 +0 2226 1565 +0 2358 0 +0 2491 0 +1251 2623 0 +1966 2755 0 +2294 2887 0 +2531 3019 0 +2729 3152 0 +2905 3283 0 +3067 3416 0 +3220 3548 0 +3368 3680 0 +3511 3812 0 +3651 3944 0 +3789 4076 0 +3926 4095 0 +0 1951 2226 +0 1955 2226 +0 1960 2225 +0 1966 2225 +0 1973 2225 +0 1983 2225 +0 1996 2225 +0 2013 2225 +0 2034 2225 +0 2061 2225 +0 2095 2225 +0 2137 2225 +0 2188 2225 +0 2225 2202 +0 2225 2111 +0 2225 1950 +0 2225 1570 +0 2358 0 +0 2490 0 +1275 2623 0 +1971 2755 0 +2296 2887 0 +2533 3019 0 +2730 3152 0 +2905 3283 0 +3067 3416 0 +3221 3548 0 +3368 3680 0 +3511 3812 0 +3651 3944 0 +3789 4076 0 +3926 4095 0 +0 1945 2226 +0 1949 2226 +0 1954 2225 +0 1961 2225 +0 1969 2225 +0 1979 2225 +0 1992 2225 +0 2009 2225 +0 2030 2225 +0 2058 2225 +0 2092 2225 +0 2134 2225 +0 2185 2225 +0 2225 2203 +0 2225 2112 +0 2225 1953 +0 2225 1576 +0 2357 0 +0 2490 0 +1304 2622 0 +1977 2755 0 +2299 2887 0 +2535 3019 0 +2732 3151 0 +2906 3283 0 +3068 3416 0 +3221 3548 0 +3368 3680 0 +3511 3812 0 +3651 3944 0 +3789 4076 0 +3926 4095 0 +0 1937 2226 +0 1941 2226 +0 1946 2225 +0 1953 2225 +0 1963 2224 +0 1973 2224 +0 1986 2224 +0 2003 2224 +0 2025 2224 +0 2053 2224 +0 2087 2224 +0 2130 2224 +0 2181 2224 +0 2224 2206 +0 2224 2115 +0 2224 1956 +0 2224 1584 +0 2357 0 +0 2489 0 +1342 2622 0 +1986 2755 0 +2304 2887 0 +2537 3019 0 +2733 3151 0 +2907 3283 0 +3069 3416 0 +3222 3548 0 +3369 3680 0 +3511 3812 0 +3652 3944 0 +3790 4076 0 +3926 4095 0 +0 1926 2226 +0 1930 2226 +0 1936 2225 +0 1943 2225 +0 1952 2224 +0 1965 2223 +0 1978 2223 +0 1995 2223 +0 2018 2223 +0 2046 2223 +0 2081 2223 +0 2124 2223 +0 2176 2223 +0 2223 2208 +0 2223 2118 +0 2223 1961 +0 2223 1595 +0 2356 0 +0 2489 0 +1387 2621 0 +1997 2754 0 +2310 2887 0 +2541 3019 0 +2735 3151 0 +2909 3283 0 +3070 3416 0 +3222 3548 0 +3369 3680 0 +3512 3812 0 +3652 3944 0 +3790 4076 0 +3926 4095 0 +0 1911 2226 +0 1915 2226 +0 1921 2225 +0 1928 2225 +0 1938 2224 +0 1951 2223 +0 1967 2221 +0 1985 2221 +0 2008 2221 +0 2036 2221 +0 2072 2221 +0 2116 2221 +0 2169 2221 +0 2221 2212 +0 2221 2123 +0 2221 1967 +0 2221 1608 +0 2355 0 +0 2488 0 +1441 2621 0 +2012 2754 0 +2317 2886 0 +2545 3018 0 +2738 3151 0 +2911 3283 0 +3071 3415 0 +3223 3548 0 +3370 3680 0 +3513 3812 0 +3652 3944 0 +3790 4076 0 +3927 4095 0 +0 1890 2226 +0 1894 2226 +0 1900 2225 +0 1908 2225 +0 1918 2224 +0 1931 2223 +0 1948 2221 +0 1970 2220 +0 1994 2220 +0 2023 2220 +0 2060 2220 +0 2105 2220 +0 2159 2220 +0 2220 2217 +0 2220 2128 +0 2220 1975 +0 2220 1626 +0 2353 0 +0 2487 0 +1505 2620 0 +2031 2753 0 +2327 2886 0 +2551 3018 0 +2742 3151 0 +2914 3283 0 +3073 3415 0 +3225 3548 0 +3371 3680 0 +3513 3812 0 +3653 3944 0 +3790 4076 0 +3927 4095 0 +0 1860 2226 +0 1865 2226 +0 1871 2225 +0 1880 2225 +0 1891 2224 +0 1904 2223 +0 1922 2221 +0 1946 2220 +0 1975 2217 +0 2006 2217 +0 2044 2217 +0 2090 2217 +0 2146 2217 +0 2211 2217 +0 2217 2136 +0 2217 1986 +0 2217 1649 +0 2352 0 +0 2486 0 +1578 2619 0 +2056 2752 0 +2340 2885 0 +2559 3018 0 +2747 3151 0 +2917 3283 0 +3076 3415 0 +3226 3548 0 +3372 3680 0 +3514 3812 0 +3653 3944 0 +3791 4076 0 +3927 4095 0 +0 1817 2226 +0 1823 2226 +0 1829 2225 +0 1839 2225 +0 1850 2224 +0 1865 2223 +0 1885 2221 +0 1910 2220 +0 1942 2217 +0 1981 2214 +0 2021 2214 +0 2070 2214 +0 2128 2214 +0 2195 2214 +0 2214 2146 +0 2214 2000 +0 2214 1677 +0 2349 0 +0 2484 0 +1661 2618 0 +2086 2751 0 +2356 2885 0 +2570 3017 0 +2754 3150 0 +2922 3282 0 +3079 3415 0 +3229 3547 0 +3374 3680 0 +3515 3812 0 +3654 3944 0 +3791 4076 0 +3927 4095 0 +0 1753 2226 +0 1759 2226 +0 1767 2225 +0 1777 2225 +0 1790 2224 +0 1808 2223 +0 1830 2221 +0 1858 2220 +0 1894 2217 +0 1936 2214 +0 1988 2209 +0 2041 2209 +0 2102 2209 +0 2174 2209 +0 2209 2159 +0 2209 2018 +0 2209 1713 +0 2346 0 +415 2481 0 +1752 2616 0 +2124 2750 0 +2378 2883 0 +2583 3016 0 +2763 3150 0 +2928 3282 0 +3083 3414 0 +3232 3547 0 +3376 3679 0 +3517 3812 0 +3656 3944 0 +3793 4076 0 +3928 4095 0 +0 1648 2226 +0 1656 2226 +0 1666 2225 +0 1679 2225 +0 1695 2224 +0 1717 2223 +0 1744 2221 +0 1778 2220 +0 1819 2217 +0 1870 2214 +0 1929 2209 +217 1998 2203 +217 2066 2203 +217 2142 2203 +217 2203 2176 +217 2203 2041 +217 2203 1757 +0 2341 437 +1199 2478 0 +1851 2613 0 +2170 2748 0 +2405 2882 0 +2600 3015 0 +2775 3149 0 +2936 3281 0 +3089 3414 0 +3236 3547 0 +3379 3679 0 +3520 3812 0 +3657 3944 0 +3794 4076 0 +3929 4095 0 +0 1457 2226 +0 1469 2226 +0 1484 2225 +0 1503 2225 +0 1527 2224 +0 1557 2223 +0 1596 2221 +0 1642 2220 +0 1697 2217 +0 1762 2214 +0 1836 2209 +217 1920 2203 +1136 2012 2194 +1136 2097 2194 +1136 2191 2194 +1136 2194 2069 +1136 2194 1809 +345 2335 970 +1535 2473 0 +1956 2610 0 +2226 2746 0 +2439 2880 0 +2623 3014 0 +2790 3148 0 +2947 3280 0 +3097 3414 0 +3242 3546 0 +3384 3679 0 +3522 3811 0 +3659 3944 0 +3795 4076 0 +3930 4095 0 +0 907 2226 +0 944 2226 +0 990 2225 +0 1044 2225 +0 1108 2224 +0 1181 2223 +0 1264 2221 +0 1355 2220 +0 1454 2217 +0 1560 2214 +0 1671 2209 +217 1787 2203 +1136 1906 2194 +1487 2029 2183 +1487 2136 2183 +1487 2183 2105 +1487 2183 1871 +1270 2326 1269 +1776 2467 477 +2067 2605 0 +2291 2742 0 +2480 2878 0 +2651 3012 0 +2810 3146 0 +2961 3280 0 +3107 3413 0 +3249 3546 0 +3389 3678 0 +3526 3811 0 +3662 3943 0 +3798 4076 0 +3932 4095 0 +0 0 2226 +0 0 2226 +0 0 2225 +0 0 2225 +0 0 2224 +0 0 2223 +0 0 2221 +0 0 2220 +0 140 2217 +0 932 2214 +0 1270 2209 +217 1512 2203 +1136 1711 2194 +1487 1888 2183 +1733 2051 2167 +1733 2167 2149 +1733 2167 1943 +1718 2315 1619 +1976 2459 1401 +2183 2599 611 +2365 2738 0 +2530 2874 0 +2686 3010 0 +2835 3144 0 +2979 3278 0 +3120 3412 0 +3259 3545 0 +3396 3678 0 +3532 3810 0 +3666 3943 0 +3801 4075 0 +3934 4095 0 +0 0 2226 +0 0 2226 +0 0 2225 +0 0 2225 +0 0 2224 +0 0 2223 +0 0 2221 +0 0 2220 +0 0 2217 +0 0 2214 +303 0 2209 +838 217 2203 +1136 1137 2194 +1487 1585 2183 +1733 1862 2167 +1935 2078 2145 +1935 2145 2023 +1994 2299 1865 +2152 2447 1751 +2303 2591 1533 +2448 2731 738 +2590 2870 0 +2729 3006 0 +2867 3142 0 +3002 3276 0 +3137 3410 0 +3272 3544 0 +3405 3677 0 +3539 3810 0 +3672 3943 0 +3804 4075 0 +3937 4095 0 +1562 0 2226 +1565 0 2226 +1570 0 2225 +1576 0 2225 +1584 0 2224 +1595 0 2223 +1608 0 2221 +1626 0 2220 +1649 0 2217 +1677 0 2214 +1713 0 2209 +1757 217 2203 +1809 1136 2194 +1871 1487 2183 +1943 1733 2167 +2023 1935 2145 +2113 2113 2113 +2210 2277 2067 +2315 2431 1997 +2425 2579 1883 +2540 2723 1664 +2659 2863 870 +2781 3002 0 +2906 3138 0 +3031 3274 0 +3159 3408 0 +3288 3543 0 +3418 3676 0 +3548 3809 0 +3679 3942 0 +3810 4075 0 +3941 4095 0 +2078 0 2358 +2079 0 2358 +2080 0 2358 +2082 0 2357 +2085 0 2357 +2088 0 2356 +2093 0 2355 +2099 0 2353 +2107 0 2352 +2118 0 2349 +2132 0 2346 +2150 0 2341 +2173 345 2335 +2202 1269 2326 +2237 1619 2315 +2281 1865 2299 +2277 2067 2210 +2277 2155 2067 +2431 2414 1997 +2533 2579 1883 +2626 2723 1664 +2726 2863 870 +2833 3002 0 +2946 3138 0 +3062 3274 0 +3183 3408 0 +3306 3543 0 +3431 3676 0 +3558 3809 0 +3686 3942 0 +3815 4075 0 +3945 4095 0 +2371 0 2491 +2372 0 2491 +2373 0 2490 +2374 0 2490 +2375 0 2489 +2377 0 2489 +2379 0 2488 +2383 0 2487 +2387 0 2486 +2393 0 2484 +2401 0 2481 +2411 0 2478 +2423 0 2473 +2440 477 2467 +2459 1401 2455 +2447 1751 2401 +2431 1997 2315 +2431 1997 2126 +2431 2207 1997 +2579 2502 1883 +2719 2723 1664 +2803 2863 870 +2895 3002 0 +2995 3138 0 +3100 3274 0 +3212 3408 0 +3329 3543 0 +3448 3676 0 +3571 3809 0 +3696 3942 0 +3823 4075 0 +3951 4095 0 +2595 0 2623 +2595 0 2623 +2596 0 2623 +2596 0 2622 +2597 0 2622 +2598 0 2621 +2600 0 2621 +2602 0 2620 +2604 0 2619 +2608 0 2618 +2613 0 2616 +2613 0 2607 +2610 0 2592 +2605 0 2570 +2599 611 2538 +2591 1533 2493 +2579 1883 2425 +2579 1883 2284 +2579 1883 1981 +2579 2267 1883 +2723 2598 1664 +2863 2837 870 +2966 3002 0 +3053 3138 0 +3147 3274 0 +3249 3408 0 +3357 3543 0 +3471 3676 0 +3588 3809 0 +3709 3942 0 +3833 4075 0 +3959 4095 0 +2755 0 2723 +2755 0 2723 +2755 0 2722 +2755 0 2721 +2755 0 2720 +2754 0 2718 +2754 0 2716 +2753 0 2713 +2752 0 2710 +2751 0 2704 +2750 0 2697 +2748 0 2687 +2746 0 2674 +2742 0 2656 +2738 0 2631 +2731 738 2594 +2723 1664 2540 +2723 1664 2435 +2723 1664 2240 +2723 1664 1667 +2723 2338 1664 +2863 2701 870 +3002 2952 0 +3120 3138 0 +3203 3274 0 +3294 3408 0 +3393 3543 0 +3499 3676 0 +3610 3809 0 +3726 3942 0 +3846 4075 0 +3968 4095 0 +2887 0 2806 +2887 0 2805 +2887 0 2805 +2887 0 2804 +2887 0 2803 +2887 0 2802 +2886 0 2800 +2886 0 2798 +2885 0 2795 +2885 0 2790 +2883 0 2784 +2882 0 2777 +2880 0 2766 +2878 0 2751 +2874 0 2730 +2870 0 2701 +2863 870 2659 +2863 870 2580 +2863 870 2447 +2863 870 2173 +2863 1498 870 +2863 2417 870 +3002 2810 0 +3138 3071 0 +3268 3274 0 +3348 3408 0 +3437 3543 0 +3534 3676 0 +3638 3809 0 +3748 3942 0 +3862 4075 0 +3981 4095 0 +3019 0 2897 +3019 0 2897 +3019 0 2896 +3019 0 2896 +3019 0 2895 +3019 0 2894 +3018 0 2892 +3018 0 2890 +3018 0 2888 +3017 0 2885 +3016 0 2880 +3015 0 2873 +3014 0 2865 +3012 0 2853 +3010 0 2836 +3006 0 2813 +3002 0 2781 +3002 0 2722 +3002 0 2628 +3002 0 2463 +3002 0 2062 +3002 1109 0 +3002 2505 0 +3138 2925 0 +3274 3193 0 +3408 3406 0 +3490 3543 0 +3577 3676 0 +3672 3809 0 +3775 3942 0 +3884 4075 0 +3998 4095 0 +3152 0 2996 +3152 0 2996 +3152 0 2996 +3151 0 2995 +3151 0 2995 +3151 0 2994 +3151 0 2993 +3151 0 2991 +3151 0 2989 +3150 0 2986 +3150 0 2982 +3149 0 2977 +3148 0 2970 +3146 0 2961 +3144 0 2948 +3142 0 2931 +3138 0 2906 +3138 0 2861 +3138 0 2795 +3138 0 2687 +3138 0 2484 +3138 0 1857 +3138 0 0 +3138 2602 0 +3274 3042 0 +3408 3317 0 +3543 3533 0 +3629 3676 0 +3715 3809 0 +3809 3942 0 +3911 4075 0 +4019 4095 0 +3284 0 3102 +3283 0 3102 +3283 0 3101 +3283 0 3101 +3283 0 3101 +3283 0 3100 +3283 0 3099 +3283 0 3098 +3283 0 3096 +3282 0 3094 +3282 0 3091 +3281 0 3087 +3280 0 3082 +3280 0 3074 +3278 0 3064 +3276 0 3050 +3274 0 3031 +3274 0 2998 +3274 0 2950 +3274 0 2876 +3274 0 2753 +3274 0 2510 +3274 0 1202 +3274 0 0 +3274 2706 0 +3408 3164 0 +3543 3444 0 +3676 3662 0 +3766 3809 0 +3851 3942 0 +3945 4075 0 +4046 4095 0 +3416 0 3213 +3416 0 3213 +3416 0 3213 +3416 0 3213 +3416 0 3212 +3416 0 3212 +3415 0 3211 +3415 0 3210 +3415 0 3209 +3415 0 3207 +3414 0 3205 +3414 0 3202 +3414 0 3198 +3413 0 3192 +3412 0 3184 +3410 0 3174 +3408 0 3159 +3408 0 3134 +3408 0 3099 +3408 0 3047 +3408 0 2966 +3408 0 2830 +3408 0 2545 +3408 0 0 +3408 0 0 +3408 2815 0 +3543 3288 0 +3676 3572 0 +3809 3791 0 +3902 3942 0 +3986 4075 0 +4080 4095 0 +3548 0 3329 +3548 0 3329 +3548 0 3329 +3548 0 3329 +3548 0 3329 +3548 0 3328 +3548 0 3328 +3548 0 3327 +3548 0 3326 +3547 0 3325 +3547 0 3323 +3547 0 3320 +3546 0 3317 +3546 0 3313 +3545 0 3307 +3544 0 3299 +3543 0 3288 +3543 0 3270 +3543 0 3243 +3543 0 3206 +3543 0 3151 +3543 0 3065 +3543 0 2917 +3543 0 2585 +3543 0 0 +3543 0 0 +3543 2929 0 +3676 3414 0 +3809 3700 0 +3942 3921 0 +4037 4075 0 +4095 4095 0 +3680 0 3449 +3680 0 3449 +3680 0 3449 +3680 0 3449 +3680 0 3448 +3680 0 3448 +3680 0 3448 +3680 0 3447 +3680 0 3446 +3680 0 3445 +3679 0 3444 +3679 0 3442 +3679 0 3440 +3678 0 3436 +3678 0 3432 +3677 0 3426 +3676 0 3418 +3676 0 3404 +3676 0 3385 +3676 0 3358 +3676 0 3319 +3676 0 3261 +3676 0 3170 +3676 0 3010 +3676 0 2636 +3676 0 0 +3676 0 0 +3676 3048 0 +3809 3542 0 +3942 3830 0 +4075 4051 0 +4095 4095 0 +3812 0 3572 +3812 0 3572 +3812 0 3572 +3812 0 3571 +3812 0 3571 +3812 0 3571 +3812 0 3571 +3812 0 3570 +3812 0 3570 +3812 0 3569 +3812 0 3568 +3812 0 3566 +3811 0 3564 +3811 0 3562 +3810 0 3559 +3810 0 3554 +3809 0 3548 +3809 0 3537 +3809 0 3523 +3809 0 3503 +3809 0 3475 +3809 0 3435 +3809 0 3376 +3809 0 3281 +3809 0 3112 +3809 0 2694 +3809 0 0 +3809 0 0 +3809 3169 0 +3942 3670 0 +4075 3960 0 +4095 4095 0 +3944 0 3696 +3944 0 3696 +3944 0 3696 +3944 0 3696 +3944 0 3696 +3944 0 3696 +3944 0 3696 +3944 0 3695 +3944 0 3695 +3944 0 3694 +3944 0 3694 +3944 0 3692 +3944 0 3691 +3943 0 3689 +3943 0 3687 +3943 0 3683 +3942 0 3679 +3942 0 3671 +3942 0 3660 +3942 0 3646 +3942 0 3626 +3942 0 3597 +3942 0 3556 +3942 0 3494 +3942 0 3396 +3942 0 3220 +3942 0 2762 +3942 0 0 +3942 0 0 +3942 3293 0 +4075 3799 0 +4095 4091 0 +4076 0 3823 +4076 0 3823 +4076 0 3823 +4076 0 3823 +4076 0 3823 +4076 0 3822 +4076 0 3822 +4076 0 3822 +4076 0 3822 +4076 0 3821 +4076 0 3821 +4076 0 3820 +4076 0 3819 +4076 0 3817 +4075 0 3816 +4075 0 3813 +4075 0 3810 +4075 0 3803 +4075 0 3796 +4075 0 3785 +4075 0 3770 +4075 0 3750 +4075 0 3721 +4075 0 3679 +4075 0 3616 +4075 0 3515 +4075 0 3333 +4075 0 2839 +4075 0 0 +4075 0 0 +4075 3419 0 +4095 3930 0 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3951 +4095 0 3950 +4095 0 3950 +4095 0 3950 +4095 0 3950 +4095 0 3949 +4095 0 3948 +4095 0 3947 +4095 0 3945 +4095 0 3944 +4095 0 3941 +4095 0 3937 +4095 0 3931 +4095 0 3923 +4095 0 3912 +4095 0 3897 +4095 0 3876 +4095 0 3847 +4095 0 3804 +4095 0 3741 +4095 0 3638 +4095 0 3450 +4095 0 2927 +4095 0 0 +4095 0 0 +4095 3547 0 +0 2090 2358 +0 2093 2358 +0 2096 2358 +0 2100 2358 +0 2106 2358 +0 2113 2358 +0 2123 2358 +0 2136 2358 +0 2152 2358 +0 2173 2358 +0 2200 2358 +0 2233 2358 +0 2275 2358 +0 2325 2358 +0 2358 2332 +0 2358 2239 +0 2358 2078 +0 2358 1692 +0 2491 0 +0 2623 0 +1353 2755 0 +2091 2887 0 +2422 3019 0 +2662 3152 0 +2860 3284 0 +3036 3416 0 +3198 3548 0 +3352 3680 0 +3499 3812 0 +3643 3944 0 +3783 4076 0 +3921 4095 0 +0 2088 2358 +0 2091 2358 +0 2094 2358 +0 2098 2358 +0 2104 2358 +0 2111 2358 +0 2121 2358 +0 2134 2358 +0 2150 2358 +0 2171 2358 +0 2199 2358 +0 2232 2358 +0 2273 2358 +0 2324 2358 +0 2358 2332 +0 2358 2240 +0 2358 2079 +0 2358 1694 +0 2491 0 +0 2623 0 +1367 2755 0 +2094 2887 0 +2424 3019 0 +2663 3152 0 +2860 3283 0 +3036 3416 0 +3199 3548 0 +3352 3680 0 +3499 3812 0 +3643 3944 0 +3783 4076 0 +3921 4095 0 +0 2085 2358 +0 2087 2358 +0 2091 2358 +0 2096 2358 +0 2101 2358 +0 2109 2358 +0 2119 2358 +0 2132 2358 +0 2148 2358 +0 2169 2358 +0 2196 2358 +0 2230 2358 +0 2271 2358 +0 2322 2358 +0 2358 2333 +0 2358 2241 +0 2358 2080 +0 2358 1698 +0 2490 0 +0 2623 0 +1386 2755 0 +2098 2887 0 +2426 3019 0 +2664 3152 0 +2861 3283 0 +3037 3416 0 +3199 3548 0 +3353 3680 0 +3500 3812 0 +3643 3944 0 +3783 4076 0 +3921 4095 0 +0 2080 2358 +0 2083 2358 +0 2087 2358 +0 2092 2357 +0 2098 2357 +0 2105 2357 +0 2115 2357 +0 2128 2357 +0 2145 2357 +0 2166 2357 +0 2193 2357 +0 2228 2357 +0 2269 2357 +0 2320 2357 +0 2357 2334 +0 2357 2243 +0 2357 2082 +0 2357 1702 +0 2490 0 +0 2622 0 +1409 2755 0 +2103 2887 0 +2428 3019 0 +2665 3151 0 +2862 3283 0 +3038 3416 0 +3200 3548 0 +3353 3680 0 +3500 3812 0 +3643 3944 0 +3783 4076 0 +3921 4095 0 +0 2074 2358 +0 2077 2358 +0 2081 2358 +0 2086 2357 +0 2093 2357 +0 2101 2357 +0 2111 2357 +0 2124 2357 +0 2141 2357 +0 2162 2357 +0 2190 2357 +0 2224 2357 +0 2266 2357 +0 2317 2357 +0 2357 2335 +0 2357 2245 +0 2357 2085 +0 2357 1708 +0 2489 0 +0 2622 0 +1439 2755 0 +2110 2887 0 +2431 3019 0 +2667 3151 0 +2863 3283 0 +3038 3416 0 +3200 3548 0 +3353 3680 0 +3500 3812 0 +3643 3944 0 +3783 4076 0 +3921 4095 0 +0 2066 2358 +0 2069 2358 +0 2073 2358 +0 2078 2357 +0 2086 2357 +0 2095 2356 +0 2105 2356 +0 2118 2356 +0 2135 2356 +0 2157 2356 +0 2185 2356 +0 2219 2356 +0 2262 2356 +0 2313 2356 +0 2356 2338 +0 2356 2247 +0 2356 2088 +0 2356 1716 +0 2489 0 +0 2621 0 +1476 2754 0 +2118 2887 0 +2435 3019 0 +2670 3151 0 +2865 3283 0 +3039 3416 0 +3201 3548 0 +3354 3680 0 +3501 3812 0 +3644 3944 0 +3784 4076 0 +3922 4095 0 +0 2055 2358 +0 2058 2358 +0 2062 2358 +0 2068 2357 +0 2075 2357 +0 2084 2356 +0 2096 2355 +0 2110 2355 +0 2127 2355 +0 2150 2355 +0 2178 2355 +0 2213 2355 +0 2256 2355 +0 2308 2355 +0 2355 2340 +0 2355 2251 +0 2355 2093 +0 2355 1727 +0 2488 0 +0 2621 0 +1521 2754 0 +2129 2886 0 +2441 3018 0 +2673 3151 0 +2867 3283 0 +3041 3415 0 +3202 3548 0 +3354 3680 0 +3501 3812 0 +3644 3944 0 +3784 4076 0 +3922 4095 0 +0 2040 2358 +0 2043 2358 +0 2047 2358 +0 2053 2357 +0 2060 2357 +0 2070 2356 +0 2083 2355 +0 2099 2353 +0 2117 2353 +0 2140 2353 +0 2168 2353 +0 2204 2353 +0 2248 2353 +0 2301 2353 +0 2353 2344 +0 2353 2255 +0 2353 2099 +0 2353 1740 +0 2487 0 +0 2620 0 +1575 2753 0 +2144 2886 0 +2449 3018 0 +2678 3151 0 +2870 3283 0 +3043 3415 0 +3203 3548 0 +3356 3680 0 +3502 3812 0 +3645 3944 0 +3784 4076 0 +3922 4095 0 +0 2019 2358 +0 2022 2358 +0 2027 2358 +0 2032 2357 +0 2040 2357 +0 2050 2356 +0 2063 2355 +0 2081 2353 +0 2102 2352 +0 2126 2352 +0 2155 2352 +0 2192 2352 +0 2237 2352 +0 2291 2352 +0 2352 2349 +0 2352 2261 +0 2352 2107 +0 2352 1758 +0 2486 0 +0 2619 0 +1638 2752 0 +2163 2885 0 +2459 3018 0 +2684 3151 0 +2874 3283 0 +3046 3415 0 +3205 3548 0 +3357 3680 0 +3503 3812 0 +3645 3944 0 +3785 4076 0 +3923 4095 0 +0 1989 2358 +0 1993 2358 +0 1997 2358 +0 2004 2357 +0 2012 2357 +0 2022 2356 +0 2037 2355 +0 2054 2353 +0 2078 2352 +0 2107 2349 +0 2138 2349 +0 2176 2349 +0 2223 2349 +0 2278 2349 +0 2343 2349 +0 2349 2268 +0 2349 2118 +0 2349 1781 +0 2484 0 +0 2618 0 +1711 2751 0 +2188 2885 0 +2471 3017 0 +2691 3150 0 +2879 3282 0 +3049 3415 0 +3208 3547 0 +3359 3680 0 +3504 3812 0 +3646 3944 0 +3785 4076 0 +3923 4095 0 +0 1946 2358 +0 1950 2358 +0 1955 2358 +0 1962 2357 +0 1970 2357 +0 1982 2356 +0 1998 2355 +0 2017 2353 +0 2042 2352 +0 2074 2349 +0 2113 2346 +0 2153 2346 +0 2202 2346 +0 2260 2346 +0 2328 2346 +0 2346 2278 +0 2346 2132 +0 2346 1809 +0 2481 0 +0 2616 0 +1794 2750 0 +2218 2883 0 +2488 3016 0 +2702 3150 0 +2886 3282 0 +3054 3414 0 +3211 3547 0 +3361 3679 0 +3506 3812 0 +3648 3944 0 +3787 4076 0 +3924 4095 0 +0 1880 2358 +0 1885 2358 +0 1891 2358 +0 1899 2357 +0 1909 2357 +0 1922 2356 +0 1940 2355 +0 1962 2353 +0 1990 2352 +0 2025 2349 +0 2069 2346 +0 2120 2341 +0 2173 2341 +0 2234 2341 +0 2305 2341 +0 2341 2291 +0 2341 2150 +0 2341 1845 +0 2478 0 +547 2613 0 +1885 2748 0 +2256 2882 0 +2510 3015 0 +2715 3149 0 +2895 3281 0 +3060 3414 0 +3216 3547 0 +3364 3679 0 +3508 3812 0 +3649 3944 0 +3787 4076 0 +3925 4095 0 +0 1775 2358 +0 1781 2358 +0 1788 2358 +0 1798 2357 +0 1811 2357 +0 1828 2356 +0 1849 2355 +0 1876 2353 +0 1910 2352 +0 1951 2349 +0 2002 2346 +0 2061 2341 +345 2131 2335 +345 2198 2335 +345 2274 2335 +345 2335 2308 +345 2335 2173 +345 2335 1889 +0 2473 557 +1330 2610 0 +1983 2746 0 +2302 2880 0 +2536 3014 0 +2733 3148 0 +2907 3280 0 +3069 3414 0 +3221 3546 0 +3368 3679 0 +3511 3811 0 +3651 3944 0 +3789 4076 0 +3926 4095 0 +0 1580 2358 +0 1589 2358 +0 1600 2358 +0 1615 2357 +0 1634 2357 +0 1659 2356 +0 1689 2355 +0 1727 2353 +0 1773 2352 +0 1829 2349 +0 1894 2346 +0 1968 2341 +345 2052 2335 +1269 2144 2326 +1269 2229 2326 +1269 2323 2326 +1269 2326 2202 +1269 2326 1941 +477 2467 1099 +1667 2605 0 +2089 2742 0 +2358 2878 0 +2570 3012 0 +2755 3146 0 +2922 3280 0 +3079 3413 0 +3229 3546 0 +3374 3678 0 +3516 3811 0 +3655 3943 0 +3792 4076 0 +3927 4095 0 +0 1009 2358 +0 1039 2358 +0 1076 2358 +0 1122 2357 +0 1176 2357 +0 1240 2356 +0 1313 2355 +0 1396 2353 +0 1487 2352 +0 1586 2349 +0 1692 2346 +0 1803 2341 +345 1919 2335 +1269 2038 2326 +1619 2161 2315 +1619 2268 2315 +1619 2315 2237 +1619 2315 2003 +1403 2459 1401 +1908 2599 611 +2200 2738 0 +2423 2874 0 +2612 3010 0 +2783 3144 0 +2942 3278 0 +3093 3412 0 +3239 3545 0 +3381 3678 0 +3521 3810 0 +3659 3943 0 +3795 4075 0 +3930 4095 0 +0 0 2358 +0 0 2358 +0 0 2358 +0 0 2357 +0 0 2357 +0 0 2356 +0 0 2355 +0 0 2353 +0 0 2352 +0 275 2349 +0 1064 2346 +0 1403 2341 +345 1644 2335 +1269 1843 2326 +1619 2020 2315 +1865 2183 2299 +1865 2299 2281 +1865 2299 2075 +1850 2447 1751 +2108 2591 1533 +2315 2731 738 +2497 2870 0 +2662 3006 0 +2818 3142 0 +2967 3276 0 +3111 3410 0 +3253 3544 0 +3391 3677 0 +3528 3810 0 +3664 3943 0 +3798 4075 0 +3933 4095 0 +0 0 2358 +0 0 2358 +0 0 2358 +0 0 2357 +0 0 2357 +0 0 2356 +0 0 2355 +0 0 2353 +0 0 2352 +0 0 2349 +0 0 2346 +437 0 2341 +970 345 2335 +1269 1270 2326 +1619 1718 2315 +1865 1994 2299 +2067 2210 2277 +2067 2277 2155 +2126 2431 1997 +2284 2579 1883 +2435 2723 1664 +2580 2863 870 +2722 3002 0 +2861 3138 0 +2998 3274 0 +3134 3408 0 +3270 3543 0 +3404 3676 0 +3537 3809 0 +3671 3942 0 +3803 4075 0 +3937 4095 0 +1692 0 2358 +1694 0 2358 +1698 0 2358 +1702 0 2357 +1708 0 2357 +1716 0 2356 +1727 0 2355 +1740 0 2353 +1758 0 2352 +1781 0 2349 +1809 0 2346 +1845 0 2341 +1889 345 2335 +1941 1269 2326 +2003 1619 2315 +2075 1865 2299 +2155 2067 2277 +2245 2245 2245 +2343 2409 2199 +2447 2563 2129 +2557 2711 2015 +2672 2855 1796 +2791 2995 1006 +2913 3134 0 +3037 3270 0 +3164 3406 0 +3291 3541 0 +3420 3675 0 +3550 3808 0 +3680 3941 0 +3810 4074 0 +3942 4095 0 +2209 0 2491 +2210 0 2491 +2211 0 2490 +2213 0 2490 +2215 0 2489 +2218 0 2489 +2221 0 2488 +2226 0 2487 +2232 0 2486 +2240 0 2484 +2251 0 2481 +2264 0 2478 +2282 0 2473 +2305 477 2467 +2334 1401 2459 +2370 1751 2447 +2414 1997 2431 +2409 2199 2343 +2409 2288 2199 +2563 2545 2129 +2665 2711 2015 +2758 2855 1796 +2858 2995 1006 +2965 3134 0 +3078 3270 0 +3194 3406 0 +3315 3541 0 +3438 3675 0 +3563 3808 0 +3690 3941 0 +3818 4074 0 +3947 4095 0 +2503 0 2623 +2503 0 2623 +2504 0 2623 +2505 0 2622 +2506 0 2622 +2507 0 2621 +2509 0 2621 +2511 0 2620 +2515 0 2619 +2519 0 2618 +2525 0 2616 +2533 0 2613 +2543 0 2610 +2556 0 2605 +2572 611 2599 +2591 1533 2587 +2579 1883 2533 +2563 2129 2447 +2563 2129 2258 +2563 2339 2129 +2711 2634 2015 +2852 2855 1796 +2935 2995 1006 +3027 3134 0 +3126 3270 0 +3233 3406 0 +3344 3541 0 +3461 3675 0 +3581 3808 0 +3703 3941 0 +3828 4074 0 +3955 4095 0 +2727 0 2755 +2727 0 2755 +2728 0 2755 +2728 0 2755 +2729 0 2755 +2730 0 2754 +2731 0 2754 +2732 0 2753 +2734 0 2752 +2737 0 2751 +2741 0 2750 +2745 0 2748 +2746 0 2740 +2742 0 2724 +2738 0 2702 +2731 738 2671 +2723 1664 2626 +2711 2015 2557 +2711 2015 2416 +2711 2015 2114 +2711 2400 2015 +2855 2730 1796 +2995 2968 1006 +3098 3134 0 +3184 3270 0 +3279 3406 0 +3381 3541 0 +3490 3675 0 +3603 3808 0 +3720 3941 0 +3841 4074 0 +3965 4095 0 +2887 0 2856 +2887 0 2855 +2887 0 2855 +2887 0 2854 +2887 0 2853 +2887 0 2852 +2886 0 2850 +2886 0 2848 +2885 0 2845 +2885 0 2842 +2883 0 2836 +2882 0 2829 +2880 0 2820 +2878 0 2807 +2874 0 2788 +2870 0 2763 +2863 870 2726 +2855 1796 2672 +2855 1796 2567 +2855 1796 2372 +2855 1796 1797 +2855 2470 1796 +2995 2833 1006 +3134 3084 0 +3252 3270 0 +3335 3406 0 +3426 3541 0 +3525 3675 0 +3631 3808 0 +3742 3941 0 +3858 4074 0 +3978 4095 0 +3019 0 2938 +3019 0 2938 +3019 0 2938 +3019 0 2937 +3019 0 2936 +3019 0 2935 +3018 0 2934 +3018 0 2932 +3018 0 2930 +3017 0 2927 +3016 0 2922 +3015 0 2916 +3014 0 2908 +3012 0 2898 +3010 0 2883 +3006 0 2862 +3002 0 2833 +2995 1006 2791 +2995 1006 2712 +2995 1006 2579 +2995 1006 2303 +2995 1635 1006 +2995 2549 1006 +3134 2943 0 +3270 3203 0 +3400 3406 0 +3480 3541 0 +3569 3675 0 +3666 3808 0 +3770 3941 0 +3880 4074 0 +3994 4095 0 +3152 0 3030 +3152 0 3029 +3152 0 3029 +3151 0 3029 +3151 0 3028 +3151 0 3027 +3151 0 3026 +3151 0 3025 +3151 0 3023 +3150 0 3020 +3150 0 3017 +3149 0 3012 +3148 0 3005 +3146 0 2997 +3144 0 2985 +3142 0 2969 +3138 0 2946 +3134 0 2913 +3134 0 2854 +3134 0 2761 +3134 0 2596 +3134 0 2195 +3134 1211 0 +3134 2638 0 +3270 3056 0 +3406 3325 0 +3541 3538 0 +3622 3675 0 +3709 3808 0 +3805 3941 0 +3907 4074 0 +4016 4095 0 +3284 0 3128 +3283 0 3128 +3283 0 3128 +3283 0 3128 +3283 0 3127 +3283 0 3127 +3283 0 3126 +3283 0 3125 +3283 0 3123 +3282 0 3121 +3282 0 3118 +3281 0 3114 +3280 0 3109 +3280 0 3102 +3278 0 3093 +3276 0 3080 +3274 0 3062 +3270 0 3037 +3270 0 2993 +3270 0 2926 +3270 0 2818 +3270 0 2616 +3270 0 1990 +3270 0 0 +3270 2734 0 +3406 3175 0 +3541 3450 0 +3675 3665 0 +3761 3808 0 +3847 3941 0 +3941 4074 0 +4043 4095 0 +3416 0 3234 +3416 0 3234 +3416 0 3234 +3416 0 3234 +3416 0 3233 +3416 0 3233 +3415 0 3232 +3415 0 3231 +3415 0 3230 +3415 0 3228 +3414 0 3226 +3414 0 3223 +3414 0 3219 +3413 0 3214 +3412 0 3206 +3410 0 3196 +3408 0 3183 +3406 0 3164 +3406 0 3131 +3406 0 3082 +3406 0 3008 +3406 0 2886 +3406 0 2643 +3406 0 1325 +3406 0 0 +3406 2838 0 +3541 3296 0 +3675 3576 0 +3808 3794 0 +3898 3941 0 +3983 4074 0 +4077 4095 0 +3548 0 3346 +3548 0 3346 +3548 0 3346 +3548 0 3345 +3548 0 3345 +3548 0 3344 +3548 0 3344 +3548 0 3343 +3548 0 3342 +3547 0 3341 +3547 0 3339 +3547 0 3337 +3546 0 3334 +3546 0 3330 +3545 0 3324 +3544 0 3316 +3543 0 3306 +3541 0 3291 +3541 0 3267 +3541 0 3231 +3541 0 3179 +3541 0 3099 +3541 0 2963 +3541 0 2676 +3541 0 0 +3541 0 0 +3541 2947 0 +3675 3420 0 +3808 3704 0 +3941 3923 0 +4034 4074 0 +4095 4095 0 +3680 0 3462 +3680 0 3462 +3680 0 3462 +3680 0 3461 +3680 0 3461 +3680 0 3461 +3680 0 3460 +3680 0 3460 +3680 0 3459 +3680 0 3458 +3679 0 3457 +3679 0 3455 +3679 0 3453 +3678 0 3449 +3678 0 3445 +3677 0 3439 +3676 0 3431 +3675 0 3420 +3675 0 3402 +3675 0 3376 +3675 0 3338 +3675 0 3283 +3675 0 3197 +3675 0 3048 +3675 0 2718 +3675 0 0 +3675 0 0 +3675 3061 0 +3808 3546 0 +3941 3832 0 +4074 4053 0 +4095 4095 0 +3812 0 3581 +3812 0 3581 +3812 0 3581 +3812 0 3581 +3812 0 3581 +3812 0 3581 +3812 0 3580 +3812 0 3580 +3812 0 3579 +3812 0 3579 +3812 0 3577 +3812 0 3576 +3811 0 3574 +3811 0 3572 +3810 0 3569 +3810 0 3564 +3809 0 3558 +3808 0 3550 +3808 0 3536 +3808 0 3517 +3808 0 3490 +3808 0 3451 +3808 0 3393 +3808 0 3302 +3808 0 3143 +3808 0 2767 +3808 0 0 +3808 0 0 +3808 3180 0 +3941 3674 0 +4074 3962 0 +4095 4095 0 +3944 0 3704 +3944 0 3704 +3944 0 3704 +3944 0 3703 +3944 0 3703 +3944 0 3703 +3944 0 3703 +3944 0 3703 +3944 0 3702 +3944 0 3702 +3944 0 3701 +3944 0 3700 +3944 0 3699 +3943 0 3697 +3943 0 3694 +3943 0 3691 +3942 0 3686 +3941 0 3680 +3941 0 3669 +3941 0 3655 +3941 0 3635 +3941 0 3608 +3941 0 3568 +3941 0 3507 +3941 0 3413 +3941 0 3244 +3941 0 2826 +3941 0 0 +3941 0 0 +3941 3302 0 +4074 3802 0 +4095 4092 0 +4076 0 3828 +4076 0 3828 +4076 0 3828 +4076 0 3828 +4076 0 3828 +4076 0 3828 +4076 0 3828 +4076 0 3828 +4076 0 3827 +4076 0 3827 +4076 0 3826 +4076 0 3826 +4076 0 3824 +4076 0 3823 +4075 0 3821 +4075 0 3818 +4075 0 3815 +4074 0 3810 +4074 0 3803 +4074 0 3792 +4074 0 3777 +4074 0 3757 +4074 0 3729 +4074 0 3688 +4074 0 3626 +4074 0 3528 +4074 0 3351 +4074 0 2893 +4074 0 0 +4074 0 0 +4074 3426 0 +4095 3932 0 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3955 +4095 0 3954 +4095 0 3954 +4095 0 3954 +4095 0 3953 +4095 0 3952 +4095 0 3951 +4095 0 3950 +4095 0 3948 +4095 0 3945 +4095 0 3942 +4095 0 3936 +4095 0 3928 +4095 0 3917 +4095 0 3903 +4095 0 3882 +4095 0 3853 +4095 0 3811 +4095 0 3748 +4095 0 3648 +4095 0 3465 +4095 0 2973 +4095 0 0 +4095 0 0 +4095 3552 0 +0 2222 2491 +0 2224 2491 +0 2226 2491 +0 2230 2491 +0 2234 2491 +0 2239 2491 +0 2247 2491 +0 2256 2491 +0 2269 2491 +0 2285 2491 +0 2306 2491 +0 2333 2491 +0 2367 2491 +0 2408 2491 +0 2458 2491 +0 2491 2463 +0 2491 2371 +0 2491 2209 +0 2491 1822 +0 2623 0 +0 2755 0 +1472 2887 0 +2220 3019 0 +2554 3152 0 +2793 3284 0 +2992 3416 0 +3168 3548 0 +3330 3680 0 +3484 3812 0 +3631 3944 0 +3774 4076 0 +3915 4095 0 +0 2220 2491 +0 2223 2491 +0 2225 2491 +0 2228 2491 +0 2233 2491 +0 2238 2491 +0 2245 2491 +0 2255 2491 +0 2268 2491 +0 2284 2491 +0 2305 2491 +0 2332 2491 +0 2366 2491 +0 2407 2491 +0 2457 2491 +0 2491 2464 +0 2491 2372 +0 2491 2210 +0 2491 1824 +0 2623 0 +0 2755 0 +1483 2887 0 +2222 3019 0 +2555 3152 0 +2793 3283 0 +2992 3416 0 +3168 3548 0 +3331 3680 0 +3484 3812 0 +3632 3944 0 +3775 4076 0 +3915 4095 0 +0 2218 2491 +0 2220 2491 +0 2223 2490 +0 2226 2490 +0 2230 2490 +0 2236 2490 +0 2243 2490 +0 2253 2490 +0 2266 2490 +0 2283 2490 +0 2304 2490 +0 2331 2490 +0 2364 2490 +0 2406 2490 +0 2456 2490 +0 2490 2464 +0 2490 2373 +0 2490 2211 +0 2490 1826 +0 2623 0 +0 2755 0 +1497 2887 0 +2225 3019 0 +2556 3152 0 +2794 3283 0 +2992 3416 0 +3168 3548 0 +3331 3680 0 +3484 3812 0 +3632 3944 0 +3775 4076 0 +3915 4095 0 +0 2215 2491 +0 2217 2491 +0 2220 2490 +0 2223 2490 +0 2228 2490 +0 2234 2490 +0 2241 2490 +0 2251 2490 +0 2264 2490 +0 2280 2490 +0 2302 2490 +0 2329 2490 +0 2362 2490 +0 2404 2490 +0 2454 2490 +0 2490 2465 +0 2490 2374 +0 2490 2213 +0 2490 1830 +0 2622 0 +0 2755 0 +1516 2887 0 +2229 3019 0 +2558 3151 0 +2795 3283 0 +2993 3416 0 +3169 3548 0 +3331 3680 0 +3485 3812 0 +3632 3944 0 +3775 4076 0 +3915 4095 0 +0 2210 2491 +0 2212 2491 +0 2215 2490 +0 2219 2490 +0 2224 2489 +0 2230 2489 +0 2238 2489 +0 2247 2489 +0 2260 2489 +0 2277 2489 +0 2298 2489 +0 2326 2489 +0 2360 2489 +0 2401 2489 +0 2452 2489 +0 2489 2466 +0 2489 2375 +0 2489 2215 +0 2489 1834 +0 2622 0 +0 2755 0 +1540 2887 0 +2234 3019 0 +2560 3151 0 +2797 3283 0 +2994 3416 0 +3170 3548 0 +3332 3680 0 +3485 3812 0 +3632 3944 0 +3775 4076 0 +3915 4095 0 +0 2204 2491 +0 2206 2491 +0 2209 2490 +0 2213 2490 +0 2219 2489 +0 2226 2489 +0 2233 2489 +0 2243 2489 +0 2256 2489 +0 2273 2489 +0 2294 2489 +0 2322 2489 +0 2356 2489 +0 2398 2489 +0 2449 2489 +0 2489 2468 +0 2489 2377 +0 2489 2218 +0 2489 1840 +0 2621 0 +0 2754 0 +1569 2887 0 +2241 3019 0 +2564 3151 0 +2799 3283 0 +2996 3416 0 +3171 3548 0 +3332 3680 0 +3485 3812 0 +3632 3944 0 +3775 4076 0 +3916 4095 0 +0 2196 2491 +0 2199 2491 +0 2202 2490 +0 2206 2490 +0 2211 2489 +0 2218 2489 +0 2227 2488 +0 2237 2488 +0 2250 2488 +0 2267 2488 +0 2289 2488 +0 2317 2488 +0 2352 2488 +0 2394 2488 +0 2445 2488 +0 2488 2470 +0 2488 2379 +0 2488 2221 +0 2488 1848 +0 2621 0 +0 2754 0 +1606 2886 0 +2249 3018 0 +2568 3151 0 +2801 3283 0 +2997 3415 0 +3172 3548 0 +3333 3680 0 +3486 3812 0 +3633 3944 0 +3776 4076 0 +3916 4095 0 +0 2185 2491 +0 2187 2491 +0 2190 2490 +0 2195 2490 +0 2200 2489 +0 2207 2489 +0 2217 2488 +0 2229 2487 +0 2242 2487 +0 2260 2487 +0 2282 2487 +0 2310 2487 +0 2345 2487 +0 2388 2487 +0 2440 2487 +0 2487 2473 +0 2487 2383 +0 2487 2226 +0 2487 1859 +0 2620 0 +0 2753 0 +1651 2886 0 +2261 3018 0 +2573 3151 0 +2805 3283 0 +2999 3415 0 +3173 3548 0 +3334 3680 0 +3487 3812 0 +3633 3944 0 +3776 4076 0 +3916 4095 0 +0 2170 2491 +0 2172 2491 +0 2175 2490 +0 2180 2490 +0 2185 2489 +0 2193 2489 +0 2202 2488 +0 2215 2487 +0 2231 2486 +0 2249 2486 +0 2272 2486 +0 2301 2486 +0 2336 2486 +0 2380 2486 +0 2433 2486 +0 2486 2476 +0 2486 2387 +0 2486 2232 +0 2486 1873 +0 2619 0 +0 2752 0 +1706 2885 0 +2276 3018 0 +2581 3151 0 +2809 3283 0 +3002 3415 0 +3175 3548 0 +3336 3680 0 +3488 3812 0 +3634 3944 0 +3777 4076 0 +3917 4095 0 +0 2149 2491 +0 2151 2491 +0 2154 2490 +0 2159 2490 +0 2165 2489 +0 2172 2489 +0 2183 2488 +0 2196 2487 +0 2213 2486 +0 2235 2484 +0 2258 2484 +0 2288 2484 +0 2325 2484 +0 2369 2484 +0 2423 2484 +0 2484 2481 +0 2484 2393 +0 2484 2240 +0 2484 1891 +0 2618 0 +0 2751 0 +1769 2885 0 +2294 3017 0 +2591 3150 0 +2815 3282 0 +3006 3415 0 +3178 3547 0 +3337 3680 0 +3489 3812 0 +3635 3944 0 +3777 4076 0 +3917 4095 0 +0 2119 2491 +0 2121 2491 +0 2125 2490 +0 2129 2490 +0 2136 2489 +0 2144 2489 +0 2155 2488 +0 2169 2487 +0 2187 2486 +0 2210 2484 +0 2239 2481 +0 2270 2481 +0 2308 2481 +0 2355 2481 +0 2410 2481 +0 2475 2481 +0 2481 2401 +0 2481 2251 +0 2481 1913 +0 2616 0 +0 2750 0 +1843 2883 0 +2319 3016 0 +2604 3150 0 +2823 3282 0 +3011 3414 0 +3182 3547 0 +3340 3679 0 +3491 3812 0 +3636 3944 0 +3778 4076 0 +3918 4095 0 +0 2075 2491 +0 2078 2491 +0 2082 2490 +0 2087 2490 +0 2094 2489 +0 2103 2489 +0 2115 2488 +0 2130 2487 +0 2149 2486 +0 2174 2484 +0 2206 2481 +0 2245 2478 +0 2285 2478 +0 2334 2478 +0 2392 2478 +0 2460 2478 +0 2478 2411 +0 2478 2264 +0 2478 1941 +0 2613 0 +0 2748 0 +1925 2882 0 +2350 3015 0 +2620 3149 0 +2833 3281 0 +3018 3414 0 +3186 3547 0 +3343 3679 0 +3493 3812 0 +3638 3944 0 +3780 4076 0 +3919 4095 0 +0 2009 2491 +0 2013 2491 +0 2017 2490 +0 2023 2490 +0 2031 2489 +0 2041 2489 +0 2055 2488 +0 2072 2487 +0 2094 2486 +0 2122 2484 +0 2158 2481 +0 2201 2478 +0 2253 2473 +0 2305 2473 +0 2366 2473 +0 2438 2473 +0 2473 2423 +0 2473 2282 +0 2473 1977 +0 2610 0 +678 2746 0 +2016 2880 0 +2388 3014 0 +2642 3148 0 +2847 3280 0 +3027 3414 0 +3192 3546 0 +3348 3679 0 +3496 3811 0 +3640 3944 0 +3781 4076 0 +3920 4095 0 +0 1903 2491 +0 1907 2491 +0 1913 2490 +0 1920 2490 +0 1930 2489 +0 1943 2489 +0 1960 2488 +0 1981 2487 +0 2008 2486 +0 2042 2484 +0 2084 2481 +0 2134 2478 +0 2194 2473 +477 2263 2467 +477 2330 2467 +477 2407 2467 +477 2467 2440 +477 2467 2305 +477 2467 2021 +0 2605 705 +1463 2742 0 +2115 2878 0 +2434 3012 0 +2669 3146 0 +2865 3280 0 +3039 3413 0 +3201 3546 0 +3354 3678 0 +3501 3811 0 +3644 3943 0 +3784 4076 0 +3922 4095 0 +0 1706 2491 +0 1713 2491 +0 1722 2490 +0 1733 2490 +0 1748 2489 +0 1767 2489 +0 1791 2488 +0 1822 2487 +0 1859 2486 +0 1906 2484 +0 1961 2481 +0 2026 2478 +0 2100 2473 +477 2184 2467 +1401 2276 2459 +1401 2362 2459 +1401 2455 2459 +1401 2459 2334 +1401 2459 2073 +611 2599 1236 +1799 2738 0 +2220 2874 0 +2489 3010 0 +2703 3144 0 +2886 3278 0 +3055 3412 0 +3211 3545 0 +3361 3678 0 +3506 3810 0 +3648 3943 0 +3787 4075 0 +3924 4095 0 +0 1120 2491 +0 1143 2491 +0 1173 2490 +0 1210 2490 +0 1255 2489 +0 1310 2489 +0 1373 2488 +0 1446 2487 +0 1529 2486 +0 1620 2484 +0 1719 2481 +0 1824 2478 +0 1935 2473 +477 2051 2467 +1401 2171 2459 +1751 2293 2447 +1751 2401 2447 +1751 2447 2370 +1751 2447 2135 +1533 2591 1533 +2040 2731 738 +2332 2870 0 +2554 3006 0 +2744 3142 0 +2915 3276 0 +3074 3410 0 +3225 3544 0 +3371 3677 0 +3514 3810 0 +3653 3943 0 +3790 4075 0 +3927 4095 0 +0 0 2491 +0 0 2491 +0 0 2490 +0 0 2490 +0 0 2489 +0 0 2489 +0 0 2488 +0 0 2487 +0 0 2486 +0 0 2484 +0 415 2481 +0 1199 2478 +0 1535 2473 +477 1776 2467 +1401 1976 2459 +1751 2152 2447 +1997 2315 2431 +1997 2431 2414 +1997 2431 2207 +1981 2579 1883 +2240 2723 1664 +2447 2863 870 +2628 3002 0 +2795 3138 0 +2950 3274 0 +3099 3408 0 +3243 3543 0 +3385 3676 0 +3523 3809 0 +3660 3942 0 +3796 4075 0 +3931 4095 0 +0 0 2491 +0 0 2491 +0 0 2490 +0 0 2490 +0 0 2489 +0 0 2489 +0 0 2488 +0 0 2487 +0 0 2486 +0 0 2484 +0 0 2481 +0 0 2478 +557 0 2473 +1099 477 2467 +1401 1403 2459 +1751 1850 2447 +1997 2126 2431 +2199 2343 2409 +2199 2409 2288 +2258 2563 2129 +2416 2711 2015 +2567 2855 1796 +2712 2995 1006 +2854 3134 0 +2993 3270 0 +3131 3406 0 +3267 3541 0 +3402 3675 0 +3536 3808 0 +3669 3941 0 +3803 4074 0 +3936 4095 0 +1822 0 2491 +1824 0 2491 +1826 0 2490 +1830 0 2490 +1834 0 2489 +1840 0 2489 +1848 0 2488 +1859 0 2487 +1873 0 2486 +1891 0 2484 +1913 0 2481 +1941 0 2478 +1977 0 2473 +2021 477 2467 +2073 1401 2459 +2135 1751 2447 +2207 1997 2431 +2288 2199 2409 +2377 2377 2377 +2475 2541 2331 +2579 2696 2261 +2689 2843 2147 +2804 2987 1930 +2923 3128 1137 +3045 3266 0 +3170 3402 0 +3296 3538 0 +3423 3673 0 +3552 3807 0 +3682 3940 0 +3812 4073 0 +3943 4095 0 +2340 0 2623 +2341 0 2623 +2342 0 2623 +2343 0 2622 +2344 0 2622 +2346 0 2621 +2349 0 2621 +2352 0 2620 +2357 0 2619 +2363 0 2618 +2372 0 2616 +2382 0 2613 +2396 0 2610 +2414 0 2605 +2437 611 2599 +2466 1533 2591 +2502 1883 2579 +2545 2129 2563 +2541 2331 2475 +2541 2420 2331 +2696 2678 2261 +2797 2843 2147 +2890 2987 1930 +2991 3128 1137 +3097 3266 0 +3210 3402 0 +3326 3538 0 +3447 3673 0 +3570 3807 0 +3695 3940 0 +3822 4073 0 +3950 4095 0 +2635 0 2755 +2635 0 2755 +2636 0 2755 +2636 0 2755 +2637 0 2755 +2638 0 2754 +2640 0 2754 +2641 0 2753 +2644 0 2752 +2647 0 2751 +2651 0 2750 +2657 0 2748 +2665 0 2746 +2675 0 2742 +2688 0 2738 +2705 738 2731 +2723 1664 2719 +2711 2015 2665 +2696 2261 2579 +2696 2261 2391 +2696 2471 2261 +2843 2766 2147 +2984 2987 1930 +3067 3128 1137 +3159 3266 0 +3259 3402 0 +3365 3538 0 +3477 3673 0 +3593 3807 0 +3713 3940 0 +3835 4073 0 +3961 4095 0 +2859 0 2887 +2859 0 2887 +2859 0 2887 +2860 0 2887 +2860 0 2887 +2861 0 2887 +2862 0 2886 +2863 0 2886 +2864 0 2885 +2866 0 2885 +2869 0 2883 +2873 0 2882 +2877 0 2880 +2878 0 2872 +2874 0 2856 +2870 0 2834 +2863 870 2803 +2855 1796 2758 +2843 2147 2689 +2843 2147 2549 +2843 2147 2246 +2843 2532 2147 +2987 2862 1930 +3128 3101 1137 +3230 3266 0 +3317 3402 0 +3411 3538 0 +3513 3673 0 +3622 3807 0 +3735 3940 0 +3852 4073 0 +3974 4095 0 +3019 0 2988 +3019 0 2987 +3019 0 2987 +3019 0 2987 +3019 0 2986 +3019 0 2985 +3018 0 2984 +3018 0 2982 +3018 0 2980 +3017 0 2977 +3016 0 2974 +3015 0 2968 +3014 0 2961 +3012 0 2952 +3010 0 2939 +3006 0 2920 +3002 0 2895 +2995 1006 2858 +2987 1930 2804 +2987 1930 2699 +2987 1930 2503 +2987 1930 1930 +2987 2602 1930 +3128 2965 1137 +3266 3216 0 +3384 3402 0 +3467 3538 0 +3558 3673 0 +3657 3807 0 +3763 3940 0 +3874 4073 0 +3990 4095 0 +3152 0 3071 +3152 0 3070 +3152 0 3070 +3151 0 3070 +3151 0 3069 +3151 0 3068 +3151 0 3067 +3151 0 3066 +3151 0 3064 +3150 0 3062 +3150 0 3059 +3149 0 3055 +3148 0 3049 +3146 0 3041 +3144 0 3030 +3142 0 3015 +3138 0 2995 +3134 0 2965 +3128 1137 2923 +3128 1137 2845 +3128 1137 2712 +3128 1137 2436 +3128 1758 1137 +3128 2681 1137 +3266 3074 0 +3402 3335 0 +3532 3538 0 +3612 3673 0 +3701 3807 0 +3798 3940 0 +3902 4073 0 +4012 4095 0 +3284 0 3162 +3283 0 3162 +3283 0 3161 +3283 0 3161 +3283 0 3160 +3283 0 3160 +3283 0 3159 +3283 0 3158 +3283 0 3157 +3282 0 3155 +3282 0 3152 +3281 0 3149 +3280 0 3144 +3280 0 3138 +3278 0 3129 +3276 0 3117 +3274 0 3100 +3270 0 3078 +3266 0 3045 +3266 0 2986 +3266 0 2893 +3266 0 2727 +3266 0 2327 +3266 1375 0 +3266 2770 0 +3402 3189 0 +3538 3457 0 +3673 3670 0 +3754 3807 0 +3841 3940 0 +3937 4073 0 +4039 4095 0 +3416 0 3261 +3416 0 3261 +3416 0 3260 +3416 0 3260 +3416 0 3260 +3416 0 3259 +3415 0 3259 +3415 0 3258 +3415 0 3257 +3415 0 3255 +3414 0 3253 +3414 0 3250 +3414 0 3247 +3413 0 3242 +3412 0 3234 +3410 0 3225 +3408 0 3212 +3406 0 3194 +3402 0 3170 +3402 0 3125 +3402 0 3059 +3402 0 2951 +3402 0 2749 +3402 0 2121 +3402 0 0 +3402 2866 0 +3538 3307 0 +3673 3582 0 +3807 3797 0 +3893 3940 0 +3979 4073 0 +4073 4095 0 +3548 0 3367 +3548 0 3367 +3548 0 3366 +3548 0 3366 +3548 0 3366 +3548 0 3365 +3548 0 3365 +3548 0 3364 +3548 0 3363 +3547 0 3362 +3547 0 3361 +3547 0 3358 +3546 0 3355 +3546 0 3351 +3545 0 3346 +3544 0 3339 +3543 0 3329 +3541 0 3315 +3538 0 3296 +3538 0 3263 +3538 0 3214 +3538 0 3140 +3538 0 3018 +3538 0 2775 +3538 0 1477 +3538 0 0 +3538 2970 0 +3673 3429 0 +3807 3708 0 +3940 3926 0 +4030 4073 0 +4095 4095 0 +3680 0 3478 +3680 0 3478 +3680 0 3478 +3680 0 3478 +3680 0 3478 +3680 0 3477 +3680 0 3477 +3680 0 3476 +3680 0 3475 +3680 0 3475 +3679 0 3473 +3679 0 3472 +3679 0 3469 +3678 0 3466 +3678 0 3462 +3677 0 3456 +3676 0 3448 +3675 0 3438 +3673 0 3423 +3673 0 3399 +3673 0 3363 +3673 0 3311 +3673 0 3231 +3673 0 3095 +3673 0 2809 +3673 0 0 +3673 0 0 +3673 3079 0 +3807 3552 0 +3940 3836 0 +4073 4055 0 +4095 4095 0 +3812 0 3594 +3812 0 3594 +3812 0 3594 +3812 0 3594 +3812 0 3594 +3812 0 3593 +3812 0 3593 +3812 0 3593 +3812 0 3592 +3812 0 3591 +3812 0 3590 +3812 0 3589 +3811 0 3587 +3811 0 3585 +3810 0 3582 +3810 0 3577 +3809 0 3571 +3808 0 3563 +3807 0 3552 +3807 0 3534 +3807 0 3508 +3807 0 3470 +3807 0 3415 +3807 0 3329 +3807 0 3181 +3807 0 2850 +3807 0 0 +3807 0 0 +3807 3194 0 +3940 3678 0 +4073 3964 0 +4095 4095 0 +3944 0 3713 +3944 0 3713 +3944 0 3713 +3944 0 3713 +3944 0 3713 +3944 0 3713 +3944 0 3713 +3944 0 3712 +3944 0 3712 +3944 0 3711 +3944 0 3711 +3944 0 3710 +3944 0 3708 +3943 0 3706 +3943 0 3704 +3943 0 3701 +3942 0 3696 +3941 0 3690 +3940 0 3682 +3940 0 3668 +3940 0 3649 +3940 0 3622 +3940 0 3583 +3940 0 3525 +3940 0 3434 +3940 0 3275 +3940 0 2899 +3940 0 0 +3940 0 0 +3940 3312 0 +4073 3805 0 +4095 4094 0 +4076 0 3836 +4076 0 3836 +4076 0 3836 +4076 0 3836 +4076 0 3836 +4076 0 3835 +4076 0 3835 +4076 0 3835 +4076 0 3835 +4076 0 3834 +4076 0 3834 +4076 0 3833 +4076 0 3832 +4076 0 3830 +4075 0 3829 +4075 0 3826 +4075 0 3823 +4074 0 3818 +4073 0 3812 +4073 0 3801 +4073 0 3787 +4073 0 3768 +4073 0 3740 +4073 0 3700 +4073 0 3640 +4073 0 3545 +4073 0 3376 +4073 0 2957 +4073 0 0 +4073 0 0 +4073 3434 0 +4095 3935 0 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3961 +4095 0 3960 +4095 0 3960 +4095 0 3960 +4095 0 3959 +4095 0 3959 +4095 0 3958 +4095 0 3957 +4095 0 3955 +4095 0 3953 +4095 0 3951 +4095 0 3947 +4095 0 3943 +4095 0 3935 +4095 0 3924 +4095 0 3910 +4095 0 3890 +4095 0 3861 +4095 0 3820 +4095 0 3759 +4095 0 3661 +4095 0 3484 +4095 0 3027 +4095 0 0 +4095 0 0 +4095 3558 0 +0 2354 2623 +0 2355 2623 +0 2357 2623 +0 2359 2623 +0 2363 2623 +0 2367 2623 +0 2372 2623 +0 2380 2623 +0 2390 2623 +0 2402 2623 +0 2419 2623 +0 2440 2623 +0 2466 2623 +0 2500 2623 +0 2541 2623 +0 2590 2623 +0 2623 2595 +0 2623 2503 +0 2623 2340 +0 2623 1952 +0 2755 0 +0 2887 0 +1594 3019 0 +2352 3152 0 +2684 3284 0 +2925 3416 0 +3124 3548 0 +3300 3680 0 +3462 3812 0 +3616 3944 0 +3763 4076 0 +3907 4095 0 +0 2352 2623 +0 2354 2623 +0 2356 2623 +0 2358 2623 +0 2362 2623 +0 2366 2623 +0 2372 2623 +0 2379 2623 +0 2388 2623 +0 2401 2623 +0 2417 2623 +0 2439 2623 +0 2465 2623 +0 2499 2623 +0 2540 2623 +0 2590 2623 +0 2623 2595 +0 2623 2503 +0 2623 2341 +0 2623 1954 +0 2755 0 +0 2887 0 +1602 3019 0 +2353 3152 0 +2685 3283 0 +2925 3416 0 +3124 3548 0 +3300 3680 0 +3462 3812 0 +3616 3944 0 +3763 4076 0 +3907 4095 0 +0 2351 2623 +0 2352 2623 +0 2355 2623 +0 2357 2623 +0 2360 2623 +0 2364 2623 +0 2370 2623 +0 2378 2623 +0 2387 2623 +0 2400 2623 +0 2416 2623 +0 2437 2623 +0 2464 2623 +0 2498 2623 +0 2539 2623 +0 2589 2623 +0 2623 2596 +0 2623 2504 +0 2623 2342 +0 2623 1956 +0 2755 0 +0 2887 0 +1613 3019 0 +2355 3152 0 +2686 3283 0 +2926 3416 0 +3124 3548 0 +3300 3680 0 +3463 3812 0 +3616 3944 0 +3763 4076 0 +3907 4095 0 +0 2348 2623 +0 2350 2623 +0 2352 2623 +0 2355 2622 +0 2358 2622 +0 2362 2622 +0 2368 2622 +0 2375 2622 +0 2385 2622 +0 2398 2622 +0 2414 2622 +0 2436 2622 +0 2463 2622 +0 2496 2622 +0 2538 2622 +0 2588 2622 +0 2622 2596 +0 2622 2505 +0 2622 2343 +0 2622 1958 +0 2755 0 +0 2887 0 +1628 3019 0 +2358 3151 0 +2688 3283 0 +2927 3416 0 +3125 3548 0 +3301 3680 0 +3463 3812 0 +3616 3944 0 +3764 4076 0 +3907 4095 0 +0 2345 2623 +0 2347 2623 +0 2349 2623 +0 2352 2622 +0 2356 2622 +0 2360 2622 +0 2366 2622 +0 2373 2622 +0 2383 2622 +0 2396 2622 +0 2412 2622 +0 2434 2622 +0 2460 2622 +0 2494 2622 +0 2536 2622 +0 2586 2622 +0 2622 2597 +0 2622 2506 +0 2622 2344 +0 2622 1962 +0 2755 0 +0 2887 0 +1646 3019 0 +2362 3151 0 +2690 3283 0 +2928 3416 0 +3125 3548 0 +3301 3680 0 +3463 3812 0 +3617 3944 0 +3764 4076 0 +3907 4095 0 +0 2341 2623 +0 2342 2623 +0 2345 2623 +0 2347 2622 +0 2351 2622 +0 2356 2621 +0 2362 2621 +0 2370 2621 +0 2380 2621 +0 2393 2621 +0 2409 2621 +0 2431 2621 +0 2458 2621 +0 2492 2621 +0 2533 2621 +0 2584 2621 +0 2621 2598 +0 2621 2507 +0 2621 2346 +0 2621 1966 +0 2754 0 +0 2887 0 +1670 3019 0 +2367 3151 0 +2692 3283 0 +2929 3416 0 +3126 3548 0 +3302 3680 0 +3464 3812 0 +3617 3944 0 +3764 4076 0 +3908 4095 0 +0 2335 2623 +0 2336 2623 +0 2338 2623 +0 2341 2622 +0 2346 2622 +0 2351 2621 +0 2357 2621 +0 2365 2621 +0 2375 2621 +0 2388 2621 +0 2405 2621 +0 2427 2621 +0 2454 2621 +0 2488 2621 +0 2530 2621 +0 2581 2621 +0 2621 2600 +0 2621 2509 +0 2621 2349 +0 2621 1972 +0 2754 0 +0 2886 0 +1700 3018 0 +2373 3151 0 +2695 3283 0 +2931 3415 0 +3128 3548 0 +3303 3680 0 +3464 3812 0 +3617 3944 0 +3764 4076 0 +3908 4095 0 +0 2327 2623 +0 2328 2623 +0 2331 2623 +0 2334 2622 +0 2337 2622 +0 2343 2621 +0 2350 2621 +0 2359 2620 +0 2369 2620 +0 2382 2620 +0 2399 2620 +0 2421 2620 +0 2449 2620 +0 2483 2620 +0 2526 2620 +0 2577 2620 +0 2620 2602 +0 2620 2511 +0 2620 2352 +0 2620 1981 +0 2753 0 +0 2886 0 +1737 3018 0 +2382 3151 0 +2700 3283 0 +2934 3415 0 +3129 3548 0 +3304 3680 0 +3465 3812 0 +3618 3944 0 +3765 4076 0 +3908 4095 0 +0 2315 2623 +0 2317 2623 +0 2320 2623 +0 2323 2622 +0 2327 2622 +0 2332 2621 +0 2339 2621 +0 2348 2620 +0 2361 2619 +0 2374 2619 +0 2392 2619 +0 2414 2619 +0 2442 2619 +0 2477 2619 +0 2520 2619 +0 2572 2619 +0 2619 2604 +0 2619 2515 +0 2619 2357 +0 2619 1991 +0 2752 0 +0 2885 0 +1782 3018 0 +2394 3151 0 +2705 3283 0 +2937 3415 0 +3132 3548 0 +3305 3680 0 +3466 3812 0 +3619 3944 0 +3765 4076 0 +3908 4095 0 +0 2300 2623 +0 2302 2623 +0 2304 2623 +0 2308 2622 +0 2312 2622 +0 2317 2621 +0 2325 2621 +0 2334 2620 +0 2347 2619 +0 2363 2618 +0 2381 2618 +0 2404 2618 +0 2432 2618 +0 2469 2618 +0 2512 2618 +0 2565 2618 +0 2618 2608 +0 2618 2519 +0 2618 2363 +0 2618 2005 +0 2751 0 +0 2885 0 +1837 3017 0 +2408 3150 0 +2713 3282 0 +2942 3415 0 +3135 3547 0 +3307 3680 0 +3468 3812 0 +3620 3944 0 +3766 4076 0 +3909 4095 0 +0 2278 2623 +0 2281 2623 +0 2283 2623 +0 2287 2622 +0 2291 2622 +0 2297 2621 +0 2304 2621 +0 2314 2620 +0 2328 2619 +0 2345 2618 +0 2367 2616 +0 2390 2616 +0 2420 2616 +0 2456 2616 +0 2501 2616 +0 2555 2616 +0 2616 2613 +0 2616 2525 +0 2616 2372 +0 2616 2022 +0 2750 0 +0 2883 0 +1900 3016 0 +2427 3150 0 +2723 3282 0 +2947 3414 0 +3138 3547 0 +3310 3679 0 +3469 3812 0 +3621 3944 0 +3767 4076 0 +3910 4095 0 +0 2248 2623 +0 2250 2623 +0 2253 2623 +0 2256 2622 +0 2261 2622 +0 2268 2621 +0 2276 2621 +0 2287 2620 +0 2301 2619 +0 2319 2618 +0 2342 2616 +0 2371 2613 +0 2402 2613 +0 2440 2613 +0 2487 2613 +0 2542 2613 +0 2607 2613 +0 2613 2533 +0 2613 2382 +0 2613 2045 +0 2748 0 +0 2882 0 +1974 3015 0 +2452 3149 0 +2735 3281 0 +2956 3414 0 +3144 3547 0 +3314 3679 0 +3472 3812 0 +3623 3944 0 +3768 4076 0 +3910 4095 0 +0 2205 2623 +0 2207 2623 +0 2210 2623 +0 2214 2622 +0 2219 2622 +0 2226 2621 +0 2235 2621 +0 2247 2620 +0 2262 2619 +0 2281 2618 +0 2306 2616 +0 2338 2613 +0 2377 2610 +0 2417 2610 +0 2466 2610 +0 2524 2610 +0 2592 2610 +0 2610 2543 +0 2610 2396 +0 2610 2073 +0 2746 0 +0 2880 0 +2056 3014 0 +2482 3148 0 +2752 3280 0 +2966 3414 0 +3151 3546 0 +3318 3679 0 +3475 3811 0 +3625 3944 0 +3770 4076 0 +3912 4095 0 +0 2138 2623 +0 2141 2623 +0 2144 2623 +0 2149 2622 +0 2155 2622 +0 2163 2621 +0 2173 2621 +0 2187 2620 +0 2204 2619 +0 2226 2618 +0 2255 2616 +0 2290 2613 +0 2333 2610 +0 2385 2605 +0 2437 2605 +0 2498 2605 +0 2570 2605 +0 2605 2556 +0 2605 2414 +0 2605 2109 +0 2742 0 +817 2878 0 +2148 3012 0 +2521 3146 0 +2773 3280 0 +2979 3413 0 +3160 3546 0 +3325 3678 0 +3480 3811 0 +3628 3943 0 +3773 4076 0 +3913 4095 0 +0 2032 2623 +0 2035 2623 +0 2039 2623 +0 2045 2622 +0 2052 2622 +0 2062 2621 +0 2075 2621 +0 2092 2620 +0 2113 2619 +0 2140 2618 +0 2174 2616 +0 2216 2613 +0 2266 2610 +0 2326 2605 +611 2395 2599 +611 2462 2599 +611 2538 2599 +611 2599 2572 +611 2599 2437 +611 2599 2153 +0 2738 817 +1596 2874 0 +2247 3010 0 +2566 3144 0 +2800 3278 0 +2997 3412 0 +3171 3545 0 +3333 3678 0 +3486 3810 0 +3632 3943 0 +3776 4075 0 +3916 4095 0 +0 1833 2623 +0 1838 2623 +0 1845 2623 +0 1853 2622 +0 1865 2622 +0 1880 2621 +0 1899 2621 +0 1923 2620 +0 1954 2619 +0 1991 2618 +0 2038 2616 +0 2093 2613 +0 2158 2610 +0 2233 2605 +611 2316 2599 +1533 2408 2591 +1533 2493 2591 +1533 2587 2591 +1533 2591 2466 +1533 2591 2206 +738 2731 1362 +1932 2870 0 +2352 3006 0 +2622 3142 0 +2834 3276 0 +3019 3410 0 +3186 3544 0 +3344 3677 0 +3493 3810 0 +3638 3943 0 +3780 4075 0 +3919 4095 0 +0 1232 2623 +0 1251 2623 +0 1275 2623 +0 1304 2622 +0 1342 2622 +0 1387 2621 +0 1441 2621 +0 1505 2620 +0 1578 2619 +0 1661 2618 +0 1752 2616 +0 1851 2613 +0 1956 2610 +0 2067 2605 +611 2183 2599 +1533 2303 2591 +1883 2425 2579 +1883 2533 2579 +1883 2579 2502 +1883 2579 2267 +1667 2723 1664 +2173 2863 870 +2463 3002 0 +2687 3138 0 +2876 3274 0 +3047 3408 0 +3206 3543 0 +3358 3676 0 +3503 3809 0 +3646 3942 0 +3785 4075 0 +3923 4095 0 +0 0 2623 +0 0 2623 +0 0 2623 +0 0 2622 +0 0 2622 +0 0 2621 +0 0 2621 +0 0 2620 +0 0 2619 +0 0 2618 +0 0 2616 +0 547 2613 +0 1330 2610 +0 1667 2605 +611 1908 2599 +1533 2108 2591 +1883 2284 2579 +2129 2447 2563 +2129 2563 2545 +2129 2563 2339 +2114 2711 2015 +2372 2855 1796 +2579 2995 1006 +2761 3134 0 +2926 3270 0 +3082 3406 0 +3231 3541 0 +3376 3675 0 +3517 3808 0 +3655 3941 0 +3792 4074 0 +3928 4095 0 +0 0 2623 +0 0 2623 +0 0 2623 +0 0 2622 +0 0 2622 +0 0 2621 +0 0 2621 +0 0 2620 +0 0 2619 +0 0 2618 +0 0 2616 +0 0 2613 +0 0 2610 +705 0 2605 +1236 611 2599 +1533 1533 2591 +1883 1981 2579 +2129 2258 2563 +2331 2475 2541 +2331 2541 2420 +2391 2696 2261 +2549 2843 2147 +2699 2987 1930 +2845 3128 1137 +2986 3266 0 +3125 3402 0 +3263 3538 0 +3399 3673 0 +3534 3807 0 +3668 3940 0 +3801 4073 0 +3935 4095 0 +1952 0 2623 +1954 0 2623 +1956 0 2623 +1958 0 2622 +1962 0 2622 +1966 0 2621 +1972 0 2621 +1981 0 2620 +1991 0 2619 +2005 0 2618 +2022 0 2616 +2045 0 2613 +2073 0 2610 +2109 0 2605 +2153 611 2599 +2206 1533 2591 +2267 1883 2579 +2339 2129 2563 +2420 2331 2541 +2509 2509 2509 +2607 2673 2463 +2711 2828 2393 +2821 2975 2280 +2936 3119 2061 +3055 3259 1272 +3177 3398 0 +3302 3535 0 +3428 3670 0 +3556 3805 0 +3684 3939 0 +3814 4072 0 +3944 4095 0 +2473 0 2755 +2473 0 2755 +2474 0 2755 +2475 0 2755 +2476 0 2755 +2477 0 2754 +2479 0 2754 +2482 0 2753 +2485 0 2752 +2490 0 2751 +2496 0 2750 +2504 0 2748 +2515 0 2746 +2529 0 2742 +2547 0 2738 +2570 738 2731 +2598 1664 2723 +2634 2015 2711 +2678 2261 2696 +2673 2463 2607 +2673 2552 2463 +2828 2810 2393 +2929 2975 2280 +3022 3119 2061 +3122 3259 1272 +3230 3398 0 +3342 3535 0 +3459 3670 0 +3579 3805 0 +3702 3939 0 +3827 4072 0 +3954 4095 0 +2767 0 2887 +2767 0 2887 +2767 0 2887 +2768 0 2887 +2768 0 2887 +2769 0 2887 +2770 0 2886 +2772 0 2886 +2773 0 2885 +2776 0 2885 +2779 0 2883 +2784 0 2882 +2789 0 2880 +2797 0 2878 +2807 0 2874 +2820 0 2870 +2837 870 2863 +2855 1796 2852 +2843 2147 2797 +2828 2393 2711 +2828 2393 2522 +2828 2603 2393 +2975 2898 2280 +3116 3119 2061 +3199 3259 1272 +3291 3398 0 +3391 3535 0 +3497 3670 0 +3609 3805 0 +3725 3939 0 +3845 4072 0 +3968 4095 0 +2991 0 3019 +2991 0 3019 +2991 0 3019 +2991 0 3019 +2992 0 3019 +2992 0 3019 +2992 0 3018 +2993 0 3018 +2995 0 3018 +2996 0 3017 +2998 0 3016 +3001 0 3015 +3004 0 3014 +3009 0 3012 +3010 0 3004 +3006 0 2988 +3002 0 2966 +2995 1006 2935 +2987 1930 2890 +2975 2280 2821 +2975 2280 2680 +2975 2280 2377 +2975 2664 2280 +3119 2995 2061 +3259 3233 1272 +3362 3398 0 +3449 3535 0 +3543 3670 0 +3646 3805 0 +3754 3939 0 +3867 4072 0 +3984 4095 0 +3152 0 3120 +3152 0 3120 +3152 0 3120 +3151 0 3119 +3151 0 3119 +3151 0 3118 +3151 0 3117 +3151 0 3116 +3151 0 3115 +3150 0 3112 +3150 0 3110 +3149 0 3106 +3148 0 3100 +3146 0 3093 +3144 0 3084 +3142 0 3071 +3138 0 3053 +3134 0 3027 +3128 1137 2991 +3119 2061 2936 +3119 2061 2831 +3119 2061 2636 +3119 2061 2064 +3119 2734 2061 +3259 3097 1272 +3398 3348 0 +3516 3535 0 +3599 3670 0 +3690 3805 0 +3790 3939 0 +3895 4072 0 +4006 4095 0 +3284 0 3203 +3283 0 3203 +3283 0 3202 +3283 0 3202 +3283 0 3201 +3283 0 3201 +3283 0 3200 +3283 0 3199 +3283 0 3198 +3282 0 3196 +3282 0 3194 +3281 0 3191 +3280 0 3186 +3280 0 3180 +3278 0 3173 +3276 0 3162 +3274 0 3147 +3270 0 3126 +3266 0 3097 +3259 1272 3055 +3259 1272 2976 +3259 1272 2843 +3259 1272 2569 +3259 1899 1272 +3259 2813 1272 +3398 3206 0 +3535 3467 0 +3664 3670 0 +3744 3805 0 +3833 3939 0 +3930 4072 0 +4034 4095 0 +3416 0 3294 +3416 0 3294 +3416 0 3294 +3416 0 3293 +3416 0 3293 +3416 0 3293 +3415 0 3292 +3415 0 3291 +3415 0 3290 +3415 0 3289 +3414 0 3287 +3414 0 3284 +3414 0 3281 +3413 0 3276 +3412 0 3270 +3410 0 3261 +3408 0 3249 +3406 0 3233 +3402 0 3210 +3398 0 3177 +3398 0 3118 +3398 0 3025 +3398 0 2860 +3398 0 2458 +3398 1484 0 +3398 2902 0 +3535 3321 0 +3670 3589 0 +3805 3802 0 +3886 3939 0 +3973 4072 0 +4069 4095 0 +3548 0 3393 +3548 0 3393 +3548 0 3393 +3548 0 3393 +3548 0 3392 +3548 0 3392 +3548 0 3392 +3548 0 3391 +3548 0 3390 +3547 0 3389 +3547 0 3387 +3547 0 3385 +3546 0 3382 +3546 0 3379 +3545 0 3374 +3544 0 3367 +3543 0 3357 +3541 0 3344 +3538 0 3326 +3535 0 3302 +3535 0 3257 +3535 0 3190 +3535 0 3083 +3535 0 2881 +3535 0 2256 +3535 0 0 +3535 2998 0 +3670 3439 0 +3805 3714 0 +3939 3929 0 +4025 4072 0 +4095 4095 0 +3680 0 3499 +3680 0 3499 +3680 0 3499 +3680 0 3499 +3680 0 3498 +3680 0 3498 +3680 0 3497 +3680 0 3497 +3680 0 3496 +3680 0 3495 +3679 0 3494 +3679 0 3493 +3679 0 3490 +3678 0 3488 +3678 0 3483 +3677 0 3478 +3676 0 3471 +3675 0 3461 +3673 0 3447 +3670 0 3428 +3670 0 3395 +3670 0 3346 +3670 0 3273 +3670 0 3150 +3670 0 2908 +3670 0 1603 +3670 0 0 +3670 3102 0 +3805 3561 0 +3939 3840 0 +4072 4058 0 +4095 4095 0 +3812 0 3610 +3812 0 3610 +3812 0 3610 +3812 0 3610 +3812 0 3610 +3812 0 3609 +3812 0 3609 +3812 0 3609 +3812 0 3608 +3812 0 3607 +3812 0 3606 +3812 0 3605 +3811 0 3604 +3811 0 3601 +3810 0 3598 +3810 0 3594 +3809 0 3588 +3808 0 3581 +3807 0 3570 +3805 0 3556 +3805 0 3531 +3805 0 3495 +3805 0 3443 +3805 0 3363 +3805 0 3227 +3805 0 2941 +3805 0 0 +3805 0 0 +3805 3211 0 +3939 3685 0 +4072 3968 0 +4095 4095 0 +3944 0 3726 +3944 0 3726 +3944 0 3726 +3944 0 3726 +3944 0 3726 +3944 0 3725 +3944 0 3725 +3944 0 3725 +3944 0 3725 +3944 0 3724 +3944 0 3723 +3944 0 3722 +3944 0 3721 +3943 0 3719 +3943 0 3717 +3943 0 3713 +3942 0 3709 +3941 0 3703 +3940 0 3695 +3939 0 3684 +3939 0 3666 +3939 0 3640 +3939 0 3603 +3939 0 3547 +3939 0 3461 +3939 0 3313 +3939 0 2982 +3939 0 0 +3939 0 0 +3939 3326 0 +4072 3810 0 +4095 4095 0 +4076 0 3846 +4076 0 3845 +4076 0 3845 +4076 0 3845 +4076 0 3845 +4076 0 3845 +4076 0 3845 +4076 0 3845 +4076 0 3845 +4076 0 3844 +4076 0 3843 +4076 0 3843 +4076 0 3841 +4076 0 3840 +4075 0 3838 +4075 0 3836 +4075 0 3833 +4074 0 3828 +4073 0 3822 +4072 0 3814 +4072 0 3800 +4072 0 3781 +4072 0 3754 +4072 0 3715 +4072 0 3657 +4072 0 3566 +4072 0 3407 +4072 0 3031 +4072 0 0 +4072 0 0 +4072 3444 0 +4095 3938 0 +4095 0 3968 +4095 0 3968 +4095 0 3968 +4095 0 3968 +4095 0 3968 +4095 0 3968 +4095 0 3968 +4095 0 3968 +4095 0 3967 +4095 0 3967 +4095 0 3967 +4095 0 3966 +4095 0 3965 +4095 0 3964 +4095 0 3963 +4095 0 3961 +4095 0 3959 +4095 0 3955 +4095 0 3950 +4095 0 3944 +4095 0 3934 +4095 0 3920 +4095 0 3900 +4095 0 3872 +4095 0 3832 +4095 0 3772 +4095 0 3677 +4095 0 3509 +4095 0 3090 +4095 0 0 +4095 0 0 +4095 3566 0 +0 2486 2755 +0 2487 2755 +0 2488 2755 +0 2490 2755 +0 2493 2755 +0 2496 2755 +0 2500 2755 +0 2505 2755 +0 2513 2755 +0 2523 2755 +0 2535 2755 +0 2552 2755 +0 2573 2755 +0 2599 2755 +0 2632 2755 +0 2673 2755 +0 2723 2755 +0 2755 2727 +0 2755 2635 +0 2755 2473 +0 2755 2083 +0 2887 0 +0 3019 0 +1720 3152 0 +2481 3284 0 +2816 3416 0 +3056 3548 0 +3255 3680 0 +3432 3812 0 +3594 3944 0 +3748 4076 0 +3896 4095 0 +0 2485 2755 +0 2486 2755 +0 2488 2755 +0 2489 2755 +0 2492 2755 +0 2495 2755 +0 2499 2755 +0 2505 2755 +0 2512 2755 +0 2522 2755 +0 2535 2755 +0 2551 2755 +0 2572 2755 +0 2598 2755 +0 2632 2755 +0 2673 2755 +0 2723 2755 +0 2755 2727 +0 2755 2635 +0 2755 2473 +0 2755 2084 +0 2887 0 +0 3019 0 +1726 3152 0 +2482 3283 0 +2817 3416 0 +3057 3548 0 +3256 3680 0 +3432 3812 0 +3595 3944 0 +3748 4076 0 +3896 4095 0 +0 2484 2755 +0 2485 2755 +0 2486 2755 +0 2488 2755 +0 2491 2755 +0 2494 2755 +0 2498 2755 +0 2504 2755 +0 2511 2755 +0 2521 2755 +0 2533 2755 +0 2550 2755 +0 2571 2755 +0 2598 2755 +0 2631 2755 +0 2672 2755 +0 2722 2755 +0 2755 2728 +0 2755 2636 +0 2755 2474 +0 2755 2086 +0 2887 0 +0 3019 0 +1735 3152 0 +2484 3283 0 +2817 3416 0 +3057 3548 0 +3256 3680 0 +3432 3812 0 +3595 3944 0 +3748 4076 0 +3896 4095 0 +0 2482 2755 +0 2483 2755 +0 2485 2755 +0 2487 2755 +0 2489 2755 +0 2492 2755 +0 2497 2755 +0 2502 2755 +0 2510 2755 +0 2520 2755 +0 2532 2755 +0 2549 2755 +0 2570 2755 +0 2596 2755 +0 2630 2755 +0 2671 2755 +0 2721 2755 +0 2755 2728 +0 2755 2636 +0 2755 2475 +0 2755 2088 +0 2887 0 +0 3019 0 +1746 3151 0 +2486 3283 0 +2818 3416 0 +3058 3548 0 +3256 3680 0 +3432 3812 0 +3595 3944 0 +3748 4076 0 +3896 4095 0 +0 2479 2755 +0 2481 2755 +0 2482 2755 +0 2484 2755 +0 2487 2755 +0 2490 2755 +0 2495 2755 +0 2501 2755 +0 2508 2755 +0 2517 2755 +0 2530 2755 +0 2547 2755 +0 2568 2755 +0 2595 2755 +0 2628 2755 +0 2670 2755 +0 2720 2755 +0 2755 2729 +0 2755 2637 +0 2755 2476 +0 2755 2091 +0 2887 0 +0 3019 0 +1760 3151 0 +2489 3283 0 +2820 3416 0 +3059 3548 0 +3257 3680 0 +3433 3812 0 +3595 3944 0 +3748 4076 0 +3896 4095 0 +0 2476 2755 +0 2477 2755 +0 2479 2755 +0 2481 2755 +0 2484 2755 +0 2488 2754 +0 2492 2754 +0 2498 2754 +0 2505 2754 +0 2515 2754 +0 2528 2754 +0 2545 2754 +0 2566 2754 +0 2593 2754 +0 2627 2754 +0 2668 2754 +0 2718 2754 +0 2754 2730 +0 2754 2638 +0 2754 2477 +0 2754 2094 +0 2887 0 +0 3019 0 +1779 3151 0 +2493 3283 0 +2822 3416 0 +3060 3548 0 +3258 3680 0 +3433 3812 0 +3595 3944 0 +3749 4076 0 +3896 4095 0 +0 2472 2755 +0 2473 2755 +0 2475 2755 +0 2477 2755 +0 2480 2755 +0 2484 2754 +0 2489 2754 +0 2494 2754 +0 2502 2754 +0 2512 2754 +0 2525 2754 +0 2541 2754 +0 2563 2754 +0 2590 2754 +0 2624 2754 +0 2666 2754 +0 2716 2754 +0 2754 2731 +0 2754 2640 +0 2754 2479 +0 2754 2099 +0 2886 0 +0 3018 0 +1802 3151 0 +2498 3283 0 +2824 3415 0 +3061 3548 0 +3258 3680 0 +3434 3812 0 +3596 3944 0 +3749 4076 0 +3896 4095 0 +0 2466 2755 +0 2467 2755 +0 2469 2755 +0 2471 2755 +0 2474 2755 +0 2478 2754 +0 2483 2754 +0 2490 2753 +0 2497 2753 +0 2507 2753 +0 2521 2753 +0 2537 2753 +0 2559 2753 +0 2586 2753 +0 2620 2753 +0 2662 2753 +0 2713 2753 +0 2753 2732 +0 2753 2641 +0 2753 2482 +0 2753 2105 +0 2886 0 +0 3018 0 +1832 3151 0 +2504 3283 0 +2827 3415 0 +3063 3548 0 +3260 3680 0 +3435 3812 0 +3596 3944 0 +3749 4076 0 +3897 4095 0 +0 2457 2755 +0 2459 2755 +0 2460 2755 +0 2463 2755 +0 2466 2755 +0 2470 2754 +0 2475 2754 +0 2482 2753 +0 2491 2752 +0 2501 2752 +0 2514 2752 +0 2532 2752 +0 2553 2752 +0 2581 2752 +0 2616 2752 +0 2658 2752 +0 2710 2752 +0 2752 2734 +0 2752 2644 +0 2752 2485 +0 2752 2113 +0 2885 0 +0 3018 0 +1869 3151 0 +2513 3283 0 +2832 3415 0 +3066 3548 0 +3261 3680 0 +3436 3812 0 +3597 3944 0 +3750 4076 0 +3897 4095 0 +0 2446 2755 +0 2448 2755 +0 2449 2755 +0 2452 2755 +0 2455 2755 +0 2459 2754 +0 2464 2754 +0 2471 2753 +0 2481 2752 +0 2493 2751 +0 2506 2751 +0 2524 2751 +0 2546 2751 +0 2574 2751 +0 2609 2751 +0 2652 2751 +0 2704 2751 +0 2751 2737 +0 2751 2647 +0 2751 2490 +0 2751 2123 +0 2885 0 +0 3017 0 +1915 3150 0 +2524 3282 0 +2837 3415 0 +3069 3547 0 +3264 3680 0 +3437 3812 0 +3598 3944 0 +3751 4076 0 +3898 4095 0 +0 2431 2755 +0 2432 2755 +0 2434 2755 +0 2436 2755 +0 2440 2755 +0 2444 2754 +0 2450 2754 +0 2457 2753 +0 2467 2752 +0 2479 2751 +0 2495 2750 +0 2514 2750 +0 2536 2750 +0 2565 2750 +0 2601 2750 +0 2645 2750 +0 2697 2750 +0 2750 2741 +0 2750 2651 +0 2750 2496 +0 2750 2137 +0 2883 0 +0 3016 0 +1969 3150 0 +2539 3282 0 +2845 3414 0 +3074 3547 0 +3267 3679 0 +3439 3812 0 +3600 3944 0 +3752 4076 0 +3898 4095 0 +0 2409 2755 +0 2411 2755 +0 2413 2755 +0 2415 2755 +0 2419 2755 +0 2423 2754 +0 2429 2754 +0 2437 2753 +0 2447 2752 +0 2460 2751 +0 2477 2750 +0 2499 2748 +0 2522 2748 +0 2552 2748 +0 2589 2748 +0 2634 2748 +0 2687 2748 +0 2748 2745 +0 2748 2657 +0 2748 2504 +0 2748 2155 +0 2882 0 +0 3015 0 +2033 3149 0 +2558 3281 0 +2855 3414 0 +3080 3547 0 +3271 3679 0 +3442 3812 0 +3602 3944 0 +3753 4076 0 +3899 4095 0 +0 2379 2755 +0 2381 2755 +0 2383 2755 +0 2386 2755 +0 2389 2755 +0 2394 2754 +0 2400 2754 +0 2408 2753 +0 2419 2752 +0 2433 2751 +0 2451 2750 +0 2474 2748 +0 2503 2746 +0 2534 2746 +0 2572 2746 +0 2619 2746 +0 2674 2746 +0 2740 2746 +0 2746 2665 +0 2746 2515 +0 2746 2177 +0 2880 0 +0 3014 0 +2106 3148 0 +2583 3280 0 +2867 3414 0 +3087 3546 0 +3276 3679 0 +3446 3811 0 +3604 3944 0 +3755 4076 0 +3901 4095 0 +0 2335 2755 +0 2337 2755 +0 2339 2755 +0 2342 2755 +0 2346 2755 +0 2351 2754 +0 2358 2754 +0 2367 2753 +0 2379 2752 +0 2394 2751 +0 2414 2750 +0 2439 2748 +0 2470 2746 +0 2509 2742 +0 2550 2742 +0 2598 2742 +0 2656 2742 +0 2724 2742 +0 2742 2675 +0 2742 2529 +0 2742 2206 +0 2878 0 +0 3012 0 +2189 3146 0 +2613 3280 0 +2884 3413 0 +3098 3546 0 +3282 3678 0 +3450 3811 0 +3607 3943 0 +3757 4076 0 +3903 4095 0 +0 2269 2755 +0 2271 2755 +0 2274 2755 +0 2277 2755 +0 2281 2755 +0 2287 2754 +0 2295 2754 +0 2305 2753 +0 2319 2752 +0 2336 2751 +0 2359 2750 +0 2387 2748 +0 2422 2746 +0 2465 2742 +0 2517 2738 +0 2569 2738 +0 2631 2738 +0 2702 2738 +0 2738 2688 +0 2738 2547 +0 2738 2241 +0 2874 0 +922 3010 0 +2280 3144 0 +2651 3278 0 +2906 3412 0 +3111 3545 0 +3291 3678 0 +3457 3810 0 +3612 3943 0 +3760 4075 0 +3905 4095 0 +0 2162 2755 +0 2164 2755 +0 2167 2755 +0 2172 2755 +0 2177 2755 +0 2185 2754 +0 2195 2754 +0 2208 2753 +0 2224 2752 +0 2245 2751 +0 2273 2750 +0 2306 2748 +0 2348 2746 +0 2398 2742 +0 2458 2738 +738 2527 2731 +738 2594 2731 +738 2671 2731 +738 2731 2705 +738 2731 2570 +738 2731 2285 +0 2870 963 +1723 3006 0 +2379 3142 0 +2698 3276 0 +2933 3410 0 +3129 3544 0 +3303 3677 0 +3465 3810 0 +3618 3943 0 +3765 4075 0 +3908 4095 0 +0 1962 2755 +0 1966 2755 +0 1971 2755 +0 1977 2755 +0 1986 2755 +0 1997 2754 +0 2012 2754 +0 2031 2753 +0 2056 2752 +0 2086 2751 +0 2124 2750 +0 2170 2748 +0 2226 2746 +0 2291 2742 +0 2365 2738 +738 2448 2731 +1664 2540 2723 +1664 2626 2723 +1664 2719 2723 +1664 2723 2598 +1664 2723 2338 +870 2863 1498 +2062 3002 0 +2484 3138 0 +2753 3274 0 +2966 3408 0 +3151 3543 0 +3319 3676 0 +3475 3809 0 +3626 3942 0 +3770 4075 0 +3912 4095 0 +0 1353 2755 +0 1367 2755 +0 1386 2755 +0 1409 2755 +0 1439 2755 +0 1476 2754 +0 1521 2754 +0 1575 2753 +0 1638 2752 +0 1711 2751 +0 1794 2750 +0 1885 2748 +0 1983 2746 +0 2089 2742 +0 2200 2738 +738 2315 2731 +1664 2435 2723 +2015 2557 2711 +2015 2665 2711 +2015 2711 2634 +2015 2711 2400 +1797 2855 1796 +2303 2995 1006 +2596 3134 0 +2818 3270 0 +3008 3406 0 +3179 3541 0 +3338 3675 0 +3490 3808 0 +3635 3941 0 +3777 4074 0 +3917 4095 0 +0 0 2755 +0 0 2755 +0 0 2755 +0 0 2755 +0 0 2755 +0 0 2754 +0 0 2754 +0 0 2753 +0 0 2752 +0 0 2751 +0 0 2750 +0 0 2748 +0 678 2746 +0 1463 2742 +0 1799 2738 +738 2040 2731 +1664 2240 2723 +2015 2416 2711 +2261 2579 2696 +2261 2696 2678 +2261 2696 2471 +2246 2843 2147 +2503 2987 1930 +2712 3128 1137 +2893 3266 0 +3059 3402 0 +3214 3538 0 +3363 3673 0 +3508 3807 0 +3649 3940 0 +3787 4073 0 +3924 4095 0 +0 0 2755 +0 0 2755 +0 0 2755 +0 0 2755 +0 0 2755 +0 0 2754 +0 0 2754 +0 0 2753 +0 0 2752 +0 0 2751 +0 0 2750 +0 0 2748 +0 0 2746 +0 0 2742 +817 0 2738 +1362 738 2731 +1664 1667 2723 +2015 2114 2711 +2261 2391 2696 +2463 2607 2673 +2463 2673 2552 +2522 2828 2393 +2680 2975 2280 +2831 3119 2061 +2976 3259 1272 +3118 3398 0 +3257 3535 0 +3395 3670 0 +3531 3805 0 +3666 3939 0 +3800 4072 0 +3934 4095 0 +2083 0 2755 +2084 0 2755 +2086 0 2755 +2088 0 2755 +2091 0 2755 +2094 0 2754 +2099 0 2754 +2105 0 2753 +2113 0 2752 +2123 0 2751 +2137 0 2750 +2155 0 2748 +2177 0 2746 +2206 0 2742 +2241 0 2738 +2285 738 2731 +2338 1664 2723 +2400 2015 2711 +2471 2261 2696 +2552 2463 2673 +2642 2642 2642 +2739 2805 2596 +2843 2959 2526 +2954 3108 2412 +3069 3251 2194 +3187 3392 1406 +3309 3530 0 +3434 3667 0 +3560 3802 0 +3688 3937 0 +3816 4071 0 +3946 4095 0 +2604 0 2887 +2604 0 2887 +2605 0 2887 +2605 0 2887 +2606 0 2887 +2607 0 2887 +2609 0 2886 +2611 0 2886 +2613 0 2885 +2617 0 2885 +2621 0 2883 +2628 0 2882 +2636 0 2880 +2647 0 2878 +2661 0 2874 +2678 0 2870 +2701 870 2863 +2730 1796 2855 +2766 2147 2843 +2810 2393 2828 +2805 2596 2739 +2805 2684 2596 +2959 2942 2526 +3061 3108 2412 +3154 3251 2194 +3255 3392 1406 +3362 3530 0 +3474 3667 0 +3591 3802 0 +3711 3937 0 +3834 4071 0 +3960 4095 0 +2898 0 3019 +2898 0 3019 +2898 0 3019 +2899 0 3019 +2899 0 3019 +2900 0 3019 +2901 0 3018 +2902 0 3018 +2903 0 3018 +2905 0 3017 +2907 0 3016 +2911 0 3015 +2915 0 3014 +2921 0 3012 +2928 0 3010 +2939 0 3006 +2952 0 3002 +2968 1006 2995 +2987 1930 2984 +2975 2280 2929 +2959 2526 2843 +2959 2526 2654 +2959 2735 2526 +3108 3031 2412 +3248 3251 2194 +3331 3392 1406 +3423 3530 0 +3523 3667 0 +3629 3802 0 +3741 3937 0 +3857 4071 0 +3977 4095 0 +3123 0 3152 +3123 0 3152 +3123 0 3152 +3123 0 3151 +3123 0 3151 +3124 0 3151 +3124 0 3151 +3125 0 3151 +3126 0 3151 +3127 0 3150 +3128 0 3150 +3131 0 3149 +3133 0 3148 +3137 0 3146 +3141 0 3144 +3142 0 3136 +3138 0 3120 +3134 0 3098 +3128 1137 3067 +3119 2061 3022 +3108 2412 2954 +3108 2412 2813 +3108 2412 2511 +3108 2796 2412 +3251 3126 2194 +3392 3365 1406 +3495 3530 0 +3581 3667 0 +3676 3802 0 +3777 3937 0 +3886 4071 0 +3999 4095 0 +3284 0 3252 +3283 0 3252 +3283 0 3252 +3283 0 3252 +3283 0 3251 +3283 0 3251 +3283 0 3250 +3283 0 3249 +3283 0 3248 +3282 0 3247 +3282 0 3244 +3281 0 3242 +3280 0 3238 +3280 0 3233 +3278 0 3225 +3276 0 3216 +3274 0 3203 +3270 0 3184 +3266 0 3159 +3259 1272 3122 +3251 2194 3069 +3251 2194 2963 +3251 2194 2768 +3251 2195 2194 +3251 2866 2194 +3392 3230 1406 +3530 3480 0 +3648 3667 0 +3731 3802 0 +3822 3937 0 +3921 4071 0 +4027 4095 0 +3416 0 3335 +3416 0 3335 +3416 0 3335 +3416 0 3335 +3416 0 3334 +3416 0 3334 +3415 0 3333 +3415 0 3333 +3415 0 3331 +3415 0 3330 +3414 0 3329 +3414 0 3326 +3414 0 3323 +3413 0 3319 +3412 0 3313 +3410 0 3305 +3408 0 3294 +3406 0 3279 +3402 0 3259 +3398 0 3230 +3392 1406 3187 +3392 1406 3108 +3392 1406 2976 +3392 1406 2701 +3392 2025 1406 +3392 2945 1406 +3530 3339 0 +3667 3599 0 +3796 3802 0 +3876 3937 0 +3965 4071 0 +4062 4095 0 +3548 0 3426 +3548 0 3426 +3548 0 3426 +3548 0 3426 +3548 0 3426 +3548 0 3425 +3548 0 3425 +3548 0 3424 +3548 0 3423 +3547 0 3422 +3547 0 3421 +3547 0 3419 +3546 0 3416 +3546 0 3413 +3545 0 3408 +3544 0 3402 +3543 0 3393 +3541 0 3381 +3538 0 3365 +3535 0 3342 +3530 0 3309 +3530 0 3250 +3530 0 3157 +3530 0 2992 +3530 0 2593 +3530 1621 0 +3530 3034 0 +3667 3453 0 +3802 3721 0 +3937 3934 0 +4018 4071 0 +4095 4095 0 +3680 0 3525 +3680 0 3525 +3680 0 3525 +3680 0 3525 +3680 0 3525 +3680 0 3525 +3680 0 3524 +3680 0 3524 +3680 0 3523 +3680 0 3522 +3679 0 3521 +3679 0 3520 +3679 0 3517 +3678 0 3515 +3678 0 3511 +3677 0 3506 +3676 0 3499 +3675 0 3490 +3673 0 3477 +3670 0 3459 +3667 0 3434 +3667 0 3389 +3667 0 3323 +3667 0 3215 +3667 0 3014 +3667 0 2388 +3667 0 0 +3667 3131 0 +3802 3571 0 +3937 3846 0 +4071 4061 0 +4095 4095 0 +3812 0 3631 +3812 0 3631 +3812 0 3631 +3812 0 3631 +3812 0 3631 +3812 0 3630 +3812 0 3630 +3812 0 3630 +3812 0 3629 +3812 0 3629 +3812 0 3628 +3812 0 3626 +3811 0 3625 +3811 0 3622 +3810 0 3620 +3810 0 3616 +3809 0 3610 +3808 0 3603 +3807 0 3593 +3805 0 3579 +3802 0 3560 +3802 0 3527 +3802 0 3479 +3802 0 3405 +3802 0 3282 +3802 0 3040 +3802 0 1737 +3802 0 0 +3802 3234 0 +3937 3692 0 +4071 3972 0 +4095 4095 0 +3944 0 3742 +3944 0 3742 +3944 0 3742 +3944 0 3742 +3944 0 3742 +3944 0 3742 +3944 0 3741 +3944 0 3741 +3944 0 3741 +3944 0 3740 +3944 0 3740 +3944 0 3739 +3944 0 3737 +3943 0 3736 +3943 0 3733 +3943 0 3730 +3942 0 3726 +3941 0 3720 +3940 0 3713 +3939 0 3702 +3937 0 3688 +3937 0 3663 +3937 0 3628 +3937 0 3575 +3937 0 3495 +3937 0 3359 +3937 0 3073 +3937 0 0 +3937 0 0 +3937 3344 0 +4071 3816 0 +4095 4095 0 +4076 0 3858 +4076 0 3858 +4076 0 3858 +4076 0 3858 +4076 0 3858 +4076 0 3858 +4076 0 3858 +4076 0 3857 +4076 0 3857 +4076 0 3856 +4076 0 3856 +4076 0 3855 +4076 0 3854 +4076 0 3853 +4075 0 3851 +4075 0 3849 +4075 0 3846 +4074 0 3841 +4073 0 3835 +4072 0 3827 +4071 0 3816 +4071 0 3798 +4071 0 3772 +4071 0 3735 +4071 0 3679 +4071 0 3593 +4071 0 3445 +4071 0 3113 +4071 0 0 +4071 0 0 +4071 3458 0 +4095 3943 0 +4095 0 3978 +4095 0 3978 +4095 0 3978 +4095 0 3978 +4095 0 3977 +4095 0 3977 +4095 0 3977 +4095 0 3977 +4095 0 3977 +4095 0 3977 +4095 0 3976 +4095 0 3976 +4095 0 3975 +4095 0 3974 +4095 0 3972 +4095 0 3971 +4095 0 3968 +4095 0 3965 +4095 0 3961 +4095 0 3954 +4095 0 3946 +4095 0 3932 +4095 0 3913 +4095 0 3886 +4095 0 3847 +4095 0 3790 +4095 0 3699 +4095 0 3539 +4095 0 3164 +4095 0 0 +4095 0 0 +4095 3576 0 +0 2618 2887 +0 2619 2887 +0 2620 2887 +0 2621 2887 +0 2623 2887 +0 2625 2887 +0 2628 2887 +0 2633 2887 +0 2638 2887 +0 2646 2887 +0 2655 2887 +0 2668 2887 +0 2684 2887 +0 2705 2887 +0 2732 2887 +0 2765 2887 +0 2806 2887 +0 2856 2887 +0 2887 2859 +0 2887 2767 +0 2887 2604 +0 2887 2215 +0 3019 0 +0 3152 0 +1844 3284 0 +2613 3416 0 +2948 3548 0 +3188 3680 0 +3387 3812 0 +3564 3944 0 +3726 4076 0 +3880 4095 0 +0 2617 2887 +0 2618 2887 +0 2619 2887 +0 2620 2887 +0 2622 2887 +0 2625 2887 +0 2628 2887 +0 2632 2887 +0 2638 2887 +0 2645 2887 +0 2655 2887 +0 2667 2887 +0 2684 2887 +0 2705 2887 +0 2731 2887 +0 2764 2887 +0 2805 2887 +0 2855 2887 +0 2887 2859 +0 2887 2767 +0 2887 2604 +0 2887 2215 +0 3019 0 +0 3152 0 +1849 3283 0 +2614 3416 0 +2948 3548 0 +3188 3680 0 +3388 3812 0 +3564 3944 0 +3726 4076 0 +3880 4095 0 +0 2616 2887 +0 2617 2887 +0 2618 2887 +0 2620 2887 +0 2621 2887 +0 2624 2887 +0 2627 2887 +0 2631 2887 +0 2637 2887 +0 2644 2887 +0 2654 2887 +0 2667 2887 +0 2683 2887 +0 2704 2887 +0 2731 2887 +0 2764 2887 +0 2805 2887 +0 2855 2887 +0 2887 2859 +0 2887 2767 +0 2887 2605 +0 2887 2217 +0 3019 0 +0 3152 0 +1856 3283 0 +2615 3416 0 +2949 3548 0 +3189 3680 0 +3388 3812 0 +3564 3944 0 +3726 4076 0 +3880 4095 0 +0 2615 2887 +0 2616 2887 +0 2617 2887 +0 2619 2887 +0 2620 2887 +0 2623 2887 +0 2626 2887 +0 2630 2887 +0 2636 2887 +0 2643 2887 +0 2653 2887 +0 2666 2887 +0 2682 2887 +0 2703 2887 +0 2730 2887 +0 2763 2887 +0 2804 2887 +0 2854 2887 +0 2887 2860 +0 2887 2768 +0 2887 2605 +0 2887 2218 +0 3019 0 +0 3151 0 +1864 3283 0 +2617 3416 0 +2950 3548 0 +3189 3680 0 +3388 3812 0 +3564 3944 0 +3727 4076 0 +3880 4095 0 +0 2613 2887 +0 2614 2887 +0 2615 2887 +0 2617 2887 +0 2619 2887 +0 2621 2887 +0 2625 2887 +0 2629 2887 +0 2635 2887 +0 2642 2887 +0 2651 2887 +0 2664 2887 +0 2681 2887 +0 2702 2887 +0 2728 2887 +0 2762 2887 +0 2803 2887 +0 2853 2887 +0 2887 2860 +0 2887 2768 +0 2887 2606 +0 2887 2220 +0 3019 0 +0 3151 0 +1875 3283 0 +2619 3416 0 +2951 3548 0 +3190 3680 0 +3388 3812 0 +3564 3944 0 +3727 4076 0 +3880 4095 0 +0 2611 2887 +0 2612 2887 +0 2613 2887 +0 2614 2887 +0 2617 2887 +0 2619 2887 +0 2623 2887 +0 2627 2887 +0 2632 2887 +0 2640 2887 +0 2650 2887 +0 2662 2887 +0 2679 2887 +0 2700 2887 +0 2727 2887 +0 2761 2887 +0 2802 2887 +0 2852 2887 +0 2887 2861 +0 2887 2769 +0 2887 2607 +0 2887 2223 +0 3019 0 +0 3151 0 +1890 3283 0 +2621 3416 0 +2952 3548 0 +3191 3680 0 +3389 3812 0 +3565 3944 0 +3727 4076 0 +3881 4095 0 +0 2607 2887 +0 2608 2887 +0 2609 2887 +0 2611 2887 +0 2613 2887 +0 2616 2887 +0 2620 2886 +0 2624 2886 +0 2630 2886 +0 2637 2886 +0 2647 2886 +0 2660 2886 +0 2677 2886 +0 2698 2886 +0 2725 2886 +0 2759 2886 +0 2800 2886 +0 2850 2886 +0 2886 2862 +0 2886 2770 +0 2886 2609 +0 2886 2226 +0 3018 0 +0 3151 0 +1908 3283 0 +2625 3415 0 +2954 3548 0 +3192 3680 0 +3390 3812 0 +3565 3944 0 +3727 4076 0 +3881 4095 0 +0 2603 2887 +0 2604 2887 +0 2605 2887 +0 2607 2887 +0 2609 2887 +0 2612 2887 +0 2616 2886 +0 2621 2886 +0 2626 2886 +0 2634 2886 +0 2644 2886 +0 2657 2886 +0 2673 2886 +0 2695 2886 +0 2722 2886 +0 2756 2886 +0 2798 2886 +0 2848 2886 +0 2886 2863 +0 2886 2772 +0 2886 2611 +0 2886 2231 +0 3018 0 +0 3151 0 +1932 3283 0 +2630 3415 0 +2956 3548 0 +3193 3680 0 +3391 3812 0 +3566 3944 0 +3728 4076 0 +3881 4095 0 +0 2597 2887 +0 2598 2887 +0 2599 2887 +0 2601 2887 +0 2603 2887 +0 2606 2887 +0 2610 2886 +0 2615 2886 +0 2622 2885 +0 2629 2885 +0 2639 2885 +0 2652 2885 +0 2669 2885 +0 2691 2885 +0 2718 2885 +0 2752 2885 +0 2795 2885 +0 2845 2885 +0 2885 2864 +0 2885 2773 +0 2885 2613 +0 2885 2237 +0 3018 0 +0 3151 0 +1962 3283 0 +2637 3415 0 +2960 3548 0 +3195 3680 0 +3392 3812 0 +3567 3944 0 +3728 4076 0 +3881 4095 0 +0 2589 2887 +0 2589 2887 +0 2591 2887 +0 2592 2887 +0 2595 2887 +0 2598 2887 +0 2602 2886 +0 2607 2886 +0 2614 2885 +0 2623 2885 +0 2633 2885 +0 2647 2885 +0 2664 2885 +0 2685 2885 +0 2713 2885 +0 2748 2885 +0 2790 2885 +0 2842 2885 +0 2885 2866 +0 2885 2776 +0 2885 2617 +0 2885 2245 +0 3017 0 +0 3150 0 +1999 3282 0 +2646 3415 0 +2964 3547 0 +3198 3680 0 +3394 3812 0 +3568 3944 0 +3729 4076 0 +3882 4095 0 +0 2577 2887 +0 2578 2887 +0 2580 2887 +0 2581 2887 +0 2584 2887 +0 2587 2887 +0 2591 2886 +0 2596 2886 +0 2603 2885 +0 2613 2885 +0 2625 2883 +0 2639 2883 +0 2656 2883 +0 2678 2883 +0 2706 2883 +0 2741 2883 +0 2784 2883 +0 2836 2883 +0 2883 2869 +0 2883 2779 +0 2883 2621 +0 2883 2255 +0 3016 0 +0 3150 0 +2045 3282 0 +2657 3414 0 +2970 3547 0 +3201 3679 0 +3396 3812 0 +3569 3944 0 +3730 4076 0 +3883 4095 0 +0 2562 2887 +0 2563 2887 +0 2564 2887 +0 2566 2887 +0 2569 2887 +0 2572 2887 +0 2576 2886 +0 2581 2886 +0 2589 2885 +0 2599 2885 +0 2611 2883 +0 2628 2882 +0 2645 2882 +0 2668 2882 +0 2697 2882 +0 2733 2882 +0 2777 2882 +0 2829 2882 +0 2882 2873 +0 2882 2784 +0 2882 2628 +0 2882 2269 +0 3015 0 +0 3149 0 +2100 3281 0 +2672 3414 0 +2977 3547 0 +3206 3679 0 +3399 3812 0 +3571 3944 0 +3732 4076 0 +3884 4095 0 +0 2541 2887 +0 2542 2887 +0 2543 2887 +0 2545 2887 +0 2548 2887 +0 2551 2887 +0 2555 2886 +0 2561 2886 +0 2569 2885 +0 2579 2885 +0 2592 2883 +0 2609 2882 +0 2631 2880 +0 2654 2880 +0 2684 2880 +0 2721 2880 +0 2766 2880 +0 2820 2880 +0 2880 2877 +0 2880 2789 +0 2880 2636 +0 2880 2287 +0 3014 0 +0 3148 0 +2164 3280 0 +2691 3414 0 +2987 3546 0 +3212 3679 0 +3403 3811 0 +3574 3944 0 +3734 4076 0 +3885 4095 0 +0 2510 2887 +0 2511 2887 +0 2513 2887 +0 2515 2887 +0 2517 2887 +0 2521 2887 +0 2526 2886 +0 2532 2886 +0 2540 2885 +0 2551 2885 +0 2565 2883 +0 2583 2882 +0 2606 2880 +0 2636 2878 +0 2666 2878 +0 2704 2878 +0 2751 2878 +0 2807 2878 +0 2872 2878 +0 2878 2797 +0 2878 2647 +0 2878 2309 +0 3012 0 +0 3146 0 +2237 3280 0 +2715 3413 0 +3000 3546 0 +3220 3678 0 +3408 3811 0 +3578 3943 0 +3736 4076 0 +3887 4095 0 +0 2466 2887 +0 2467 2887 +0 2469 2887 +0 2471 2887 +0 2474 2887 +0 2478 2887 +0 2483 2886 +0 2490 2886 +0 2499 2885 +0 2511 2885 +0 2526 2883 +0 2546 2882 +0 2571 2880 +0 2602 2878 +0 2641 2874 +0 2681 2874 +0 2730 2874 +0 2788 2874 +0 2856 2874 +0 2874 2807 +0 2874 2661 +0 2874 2338 +0 3010 0 +0 3144 0 +2320 3278 0 +2746 3412 0 +3016 3545 0 +3230 3678 0 +3415 3810 0 +3583 3943 0 +3739 4075 0 +3889 4095 0 +0 2400 2887 +0 2401 2887 +0 2403 2887 +0 2406 2887 +0 2409 2887 +0 2413 2887 +0 2419 2886 +0 2427 2886 +0 2438 2885 +0 2451 2885 +0 2469 2883 +0 2491 2882 +0 2519 2880 +0 2554 2878 +0 2597 2874 +0 2649 2870 +0 2701 2870 +0 2763 2870 +0 2834 2870 +0 2870 2820 +0 2870 2678 +0 2870 2374 +0 3006 0 +1068 3142 0 +2411 3276 0 +2784 3410 0 +3038 3544 0 +3243 3677 0 +3424 3810 0 +3589 3943 0 +3744 4075 0 +3893 4095 0 +0 2292 2887 +0 2294 2887 +0 2296 2887 +0 2299 2887 +0 2304 2887 +0 2310 2887 +0 2317 2886 +0 2327 2886 +0 2340 2885 +0 2356 2885 +0 2378 2883 +0 2405 2882 +0 2439 2880 +0 2480 2878 +0 2530 2874 +0 2590 2870 +870 2659 2863 +870 2726 2863 +870 2803 2863 +870 2863 2837 +870 2863 2701 +870 2863 2417 +0 3002 1109 +1857 3138 0 +2510 3274 0 +2830 3408 0 +3065 3543 0 +3261 3676 0 +3435 3809 0 +3597 3942 0 +3750 4075 0 +3897 4095 0 +0 2091 2887 +0 2094 2887 +0 2098 2887 +0 2103 2887 +0 2110 2887 +0 2118 2887 +0 2129 2886 +0 2144 2886 +0 2163 2885 +0 2188 2885 +0 2218 2883 +0 2256 2882 +0 2302 2880 +0 2358 2878 +0 2423 2874 +0 2497 2870 +870 2580 2863 +1796 2672 2855 +1796 2758 2855 +1796 2852 2855 +1796 2855 2730 +1796 2855 2470 +1006 2995 1635 +2195 3134 0 +2616 3270 0 +2886 3406 0 +3099 3541 0 +3283 3675 0 +3451 3808 0 +3608 3941 0 +3757 4074 0 +3903 4095 0 +0 1472 2887 +0 1483 2887 +0 1497 2887 +0 1516 2887 +0 1540 2887 +0 1569 2887 +0 1606 2886 +0 1651 2886 +0 1706 2885 +0 1769 2885 +0 1843 2883 +0 1925 2882 +0 2016 2880 +0 2115 2878 +0 2220 2874 +0 2332 2870 +870 2447 2863 +1796 2567 2855 +2147 2689 2843 +2147 2797 2843 +2147 2843 2766 +2147 2843 2532 +1930 2987 1930 +2436 3128 1137 +2727 3266 0 +2951 3402 0 +3140 3538 0 +3311 3673 0 +3470 3807 0 +3622 3940 0 +3768 4073 0 +3910 4095 0 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2886 +0 0 2886 +0 0 2885 +0 0 2885 +0 0 2883 +0 0 2882 +0 0 2880 +0 817 2878 +0 1596 2874 +0 1932 2870 +870 2173 2863 +1796 2372 2855 +2147 2549 2843 +2393 2711 2828 +2393 2828 2810 +2393 2828 2603 +2377 2975 2280 +2636 3119 2061 +2843 3259 1272 +3025 3398 0 +3190 3535 0 +3346 3670 0 +3495 3805 0 +3640 3939 0 +3781 4072 0 +3920 4095 0 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2887 +0 0 2886 +0 0 2886 +0 0 2885 +0 0 2885 +0 0 2883 +0 0 2882 +0 0 2880 +0 0 2878 +0 0 2874 +963 0 2870 +1498 870 2863 +1796 1797 2855 +2147 2246 2843 +2393 2522 2828 +2596 2739 2805 +2596 2805 2684 +2654 2959 2526 +2813 3108 2412 +2963 3251 2194 +3108 3392 1406 +3250 3530 0 +3389 3667 0 +3527 3802 0 +3663 3937 0 +3798 4071 0 +3932 4095 0 +2215 0 2887 +2215 0 2887 +2217 0 2887 +2218 0 2887 +2220 0 2887 +2223 0 2887 +2226 0 2886 +2231 0 2886 +2237 0 2885 +2245 0 2885 +2255 0 2883 +2269 0 2882 +2287 0 2880 +2309 0 2878 +2338 0 2874 +2374 0 2870 +2417 870 2863 +2470 1796 2855 +2532 2147 2843 +2603 2393 2828 +2684 2596 2805 +2774 2774 2774 +2871 2937 2728 +2976 3092 2658 +3085 3239 2544 +3201 3383 2326 +3320 3524 1536 +3441 3662 0 +3566 3799 0 +3692 3934 0 +3820 4069 0 +3949 4095 0 +2735 0 3019 +2735 0 3019 +2736 0 3019 +2736 0 3019 +2737 0 3019 +2738 0 3019 +2739 0 3018 +2740 0 3018 +2742 0 3018 +2745 0 3017 +2749 0 3016 +2753 0 3015 +2759 0 3014 +2767 0 3012 +2778 0 3010 +2792 0 3006 +2810 0 3002 +2833 1006 2995 +2862 1930 2987 +2898 2280 2975 +2942 2526 2959 +2937 2728 2871 +2937 2816 2728 +3092 3074 2658 +3193 3239 2544 +3286 3383 2326 +3387 3524 1536 +3494 3662 0 +3606 3799 0 +3723 3934 0 +3843 4069 0 +3966 4095 0 +3031 0 3152 +3031 0 3152 +3031 0 3152 +3031 0 3151 +3031 0 3151 +3032 0 3151 +3032 0 3151 +3033 0 3151 +3034 0 3151 +3036 0 3150 +3038 0 3150 +3040 0 3149 +3043 0 3148 +3047 0 3146 +3053 0 3144 +3061 0 3142 +3071 0 3138 +3084 0 3134 +3101 1137 3128 +3119 2061 3116 +3108 2412 3061 +3092 2658 2976 +3092 2658 2787 +3092 2867 2658 +3239 3162 2544 +3380 3383 2326 +3463 3524 1536 +3555 3662 0 +3655 3799 0 +3761 3934 0 +3873 4069 0 +3989 4095 0 +3254 0 3284 +3254 0 3283 +3255 0 3283 +3255 0 3283 +3255 0 3283 +3255 0 3283 +3256 0 3283 +3256 0 3283 +3257 0 3283 +3257 0 3282 +3259 0 3282 +3260 0 3281 +3262 0 3280 +3265 0 3280 +3269 0 3278 +3273 0 3276 +3274 0 3268 +3270 0 3252 +3266 0 3230 +3259 1272 3199 +3251 2194 3154 +3239 2544 3085 +3239 2544 2945 +3239 2544 2642 +3239 2928 2544 +3383 3258 2326 +3524 3497 1536 +3626 3662 0 +3713 3799 0 +3808 3934 0 +3910 4069 0 +4018 4095 0 +3416 0 3385 +3416 0 3385 +3416 0 3384 +3416 0 3384 +3416 0 3384 +3416 0 3384 +3415 0 3383 +3415 0 3382 +3415 0 3381 +3415 0 3380 +3414 0 3379 +3414 0 3376 +3414 0 3374 +3413 0 3370 +3412 0 3365 +3410 0 3358 +3408 0 3348 +3406 0 3335 +3402 0 3317 +3398 0 3291 +3392 1406 3255 +3383 2326 3201 +3383 2326 3095 +3383 2326 2900 +3383 2326 2328 +3383 2998 2326 +3524 3362 1536 +3662 3612 0 +3781 3799 0 +3863 3934 0 +3954 4069 0 +4054 4095 0 +3548 0 3467 +3548 0 3467 +3548 0 3467 +3548 0 3467 +3548 0 3467 +3548 0 3466 +3548 0 3466 +3548 0 3466 +3548 0 3465 +3547 0 3464 +3547 0 3462 +3547 0 3461 +3546 0 3458 +3546 0 3455 +3545 0 3451 +3544 0 3445 +3543 0 3437 +3541 0 3426 +3538 0 3411 +3535 0 3391 +3530 0 3362 +3524 1536 3320 +3524 1536 3241 +3524 1536 3108 +3524 1536 2833 +3524 2158 1536 +3524 3078 1536 +3662 3471 0 +3799 3731 0 +3928 3934 0 +4008 4069 0 +4095 4095 0 +3680 0 3558 +3680 0 3558 +3680 0 3558 +3680 0 3558 +3680 0 3558 +3680 0 3558 +3680 0 3557 +3680 0 3557 +3680 0 3556 +3680 0 3556 +3679 0 3554 +3679 0 3553 +3679 0 3551 +3678 0 3548 +3678 0 3545 +3677 0 3540 +3676 0 3534 +3675 0 3525 +3673 0 3513 +3670 0 3497 +3667 0 3474 +3662 0 3441 +3662 0 3382 +3662 0 3289 +3662 0 3125 +3662 0 2724 +3662 1753 0 +3662 3166 0 +3799 3585 0 +3934 3853 0 +4069 4066 0 +4095 4095 0 +3812 0 3657 +3812 0 3657 +3812 0 3657 +3812 0 3657 +3812 0 3657 +3812 0 3657 +3812 0 3657 +3812 0 3656 +3812 0 3656 +3812 0 3655 +3812 0 3654 +3812 0 3653 +3811 0 3652 +3811 0 3650 +3810 0 3647 +3810 0 3643 +3809 0 3638 +3808 0 3631 +3807 0 3622 +3805 0 3609 +3802 0 3591 +3799 0 3566 +3799 0 3522 +3799 0 3455 +3799 0 3347 +3799 0 3145 +3799 0 2519 +3799 0 0 +3799 3262 0 +3934 3703 0 +4069 3978 0 +4095 4095 0 +3944 0 3763 +3944 0 3763 +3944 0 3763 +3944 0 3763 +3944 0 3763 +3944 0 3763 +3944 0 3762 +3944 0 3762 +3944 0 3762 +3944 0 3761 +3944 0 3761 +3944 0 3760 +3944 0 3758 +3943 0 3757 +3943 0 3755 +3943 0 3752 +3942 0 3748 +3941 0 3742 +3940 0 3735 +3939 0 3725 +3937 0 3711 +3934 0 3692 +3934 0 3659 +3934 0 3611 +3934 0 3537 +3934 0 3414 +3934 0 3172 +3934 0 1863 +3934 0 0 +3934 3366 0 +4069 3824 0 +4095 4095 0 +4076 0 3874 +4076 0 3874 +4076 0 3874 +4076 0 3874 +4076 0 3874 +4076 0 3874 +4076 0 3874 +4076 0 3873 +4076 0 3873 +4076 0 3873 +4076 0 3872 +4076 0 3872 +4076 0 3871 +4076 0 3869 +4075 0 3868 +4075 0 3865 +4075 0 3862 +4074 0 3858 +4073 0 3852 +4072 0 3845 +4071 0 3834 +4069 0 3820 +4069 0 3795 +4069 0 3760 +4069 0 3708 +4069 0 3627 +4069 0 3491 +4069 0 3205 +4069 0 0 +4069 0 0 +4069 3475 0 +4095 3949 0 +4095 0 3990 +4095 0 3990 +4095 0 3990 +4095 0 3990 +4095 0 3990 +4095 0 3990 +4095 0 3990 +4095 0 3990 +4095 0 3989 +4095 0 3989 +4095 0 3989 +4095 0 3988 +4095 0 3988 +4095 0 3986 +4095 0 3985 +4095 0 3983 +4095 0 3981 +4095 0 3978 +4095 0 3974 +4095 0 3968 +4095 0 3960 +4095 0 3949 +4095 0 3930 +4095 0 3904 +4095 0 3867 +4095 0 3812 +4095 0 3726 +4095 0 3577 +4095 0 3246 +4095 0 0 +4095 0 0 +4095 3590 0 +0 2750 3019 +0 2750 3019 +0 2751 3019 +0 2752 3019 +0 2754 3019 +0 2755 3019 +0 2758 3019 +0 2761 3019 +0 2765 3019 +0 2771 3019 +0 2778 3019 +0 2788 3019 +0 2800 3019 +0 2816 3019 +0 2837 3019 +0 2864 3019 +0 2897 3019 +0 2938 3019 +0 2988 3019 +0 3019 2991 +0 3019 2898 +0 3019 2735 +0 3019 2346 +0 3152 0 +0 3284 0 +1977 3416 0 +2745 3548 0 +3080 3680 0 +3320 3812 0 +3520 3944 0 +3696 4076 0 +3859 4095 0 +0 2749 3019 +0 2750 3019 +0 2751 3019 +0 2752 3019 +0 2753 3019 +0 2755 3019 +0 2757 3019 +0 2760 3019 +0 2765 3019 +0 2770 3019 +0 2777 3019 +0 2787 3019 +0 2800 3019 +0 2816 3019 +0 2837 3019 +0 2863 3019 +0 2897 3019 +0 2938 3019 +0 2987 3019 +0 3019 2991 +0 3019 2898 +0 3019 2735 +0 3019 2346 +0 3152 0 +0 3283 0 +1981 3416 0 +2745 3548 0 +3080 3680 0 +3321 3812 0 +3520 3944 0 +3696 4076 0 +3859 4095 0 +0 2748 3019 +0 2749 3019 +0 2750 3019 +0 2751 3019 +0 2752 3019 +0 2754 3019 +0 2757 3019 +0 2760 3019 +0 2764 3019 +0 2770 3019 +0 2777 3019 +0 2787 3019 +0 2799 3019 +0 2816 3019 +0 2836 3019 +0 2863 3019 +0 2896 3019 +0 2938 3019 +0 2987 3019 +0 3019 2991 +0 3019 2898 +0 3019 2736 +0 3019 2347 +0 3152 0 +0 3283 0 +1986 3416 0 +2746 3548 0 +3081 3680 0 +3321 3812 0 +3520 3944 0 +3696 4076 0 +3859 4095 0 +0 2747 3019 +0 2748 3019 +0 2749 3019 +0 2750 3019 +0 2751 3019 +0 2753 3019 +0 2756 3019 +0 2759 3019 +0 2763 3019 +0 2769 3019 +0 2776 3019 +0 2786 3019 +0 2798 3019 +0 2815 3019 +0 2836 3019 +0 2863 3019 +0 2896 3019 +0 2937 3019 +0 2987 3019 +0 3019 2991 +0 3019 2899 +0 3019 2736 +0 3019 2348 +0 3151 0 +0 3283 0 +1992 3416 0 +2747 3548 0 +3081 3680 0 +3321 3812 0 +3520 3944 0 +3696 4076 0 +3859 4095 0 +0 2746 3019 +0 2747 3019 +0 2747 3019 +0 2749 3019 +0 2750 3019 +0 2752 3019 +0 2755 3019 +0 2758 3019 +0 2762 3019 +0 2768 3019 +0 2775 3019 +0 2785 3019 +0 2797 3019 +0 2814 3019 +0 2835 3019 +0 2862 3019 +0 2895 3019 +0 2936 3019 +0 2986 3019 +0 3019 2992 +0 3019 2899 +0 3019 2737 +0 3019 2350 +0 3151 0 +0 3283 0 +2000 3416 0 +2749 3548 0 +3082 3680 0 +3322 3812 0 +3520 3944 0 +3696 4076 0 +3859 4095 0 +0 2744 3019 +0 2745 3019 +0 2746 3019 +0 2747 3019 +0 2749 3019 +0 2751 3019 +0 2753 3019 +0 2756 3019 +0 2761 3019 +0 2766 3019 +0 2774 3019 +0 2784 3019 +0 2796 3019 +0 2813 3019 +0 2834 3019 +0 2860 3019 +0 2894 3019 +0 2935 3019 +0 2985 3019 +0 3019 2992 +0 3019 2900 +0 3019 2738 +0 3019 2352 +0 3151 0 +0 3283 0 +2011 3416 0 +2751 3548 0 +3083 3680 0 +3322 3812 0 +3521 3944 0 +3696 4076 0 +3859 4095 0 +0 2742 3019 +0 2742 3019 +0 2743 3019 +0 2745 3019 +0 2746 3019 +0 2748 3019 +0 2751 3018 +0 2754 3018 +0 2759 3018 +0 2764 3018 +0 2772 3018 +0 2782 3018 +0 2794 3018 +0 2811 3018 +0 2832 3018 +0 2859 3018 +0 2892 3018 +0 2934 3018 +0 2984 3018 +0 3018 2992 +0 3018 2901 +0 3018 2739 +0 3018 2354 +0 3151 0 +0 3283 0 +2026 3415 0 +2754 3548 0 +3084 3680 0 +3323 3812 0 +3521 3944 0 +3697 4076 0 +3859 4095 0 +0 2738 3019 +0 2739 3019 +0 2740 3019 +0 2741 3019 +0 2743 3019 +0 2745 3019 +0 2748 3018 +0 2752 3018 +0 2756 3018 +0 2762 3018 +0 2769 3018 +0 2779 3018 +0 2792 3018 +0 2808 3018 +0 2830 3018 +0 2857 3018 +0 2890 3018 +0 2932 3018 +0 2982 3018 +0 3018 2993 +0 3018 2902 +0 3018 2740 +0 3018 2358 +0 3151 0 +0 3283 0 +2044 3415 0 +2758 3548 0 +3086 3680 0 +3324 3812 0 +3522 3944 0 +3697 4076 0 +3860 4095 0 +0 2734 3019 +0 2735 3019 +0 2735 3019 +0 2737 3019 +0 2738 3019 +0 2741 3019 +0 2744 3018 +0 2747 3018 +0 2752 3018 +0 2758 3018 +0 2766 3018 +0 2776 3018 +0 2789 3018 +0 2805 3018 +0 2827 3018 +0 2854 3018 +0 2888 3018 +0 2930 3018 +0 2980 3018 +0 3018 2995 +0 3018 2903 +0 3018 2742 +0 3018 2362 +0 3151 0 +0 3283 0 +2068 3415 0 +2763 3548 0 +3089 3680 0 +3326 3812 0 +3523 3944 0 +3698 4076 0 +3860 4095 0 +0 2728 3019 +0 2729 3019 +0 2729 3019 +0 2731 3019 +0 2732 3019 +0 2735 3019 +0 2738 3018 +0 2742 3018 +0 2747 3018 +0 2754 3017 +0 2761 3017 +0 2771 3017 +0 2784 3017 +0 2801 3017 +0 2823 3017 +0 2850 3017 +0 2885 3017 +0 2927 3017 +0 2977 3017 +0 3017 2996 +0 3017 2905 +0 3017 2745 +0 3017 2369 +0 3150 0 +0 3282 0 +2098 3415 0 +2770 3547 0 +3092 3680 0 +3328 3812 0 +3524 3944 0 +3699 4076 0 +3861 4095 0 +0 2720 3019 +0 2720 3019 +0 2721 3019 +0 2723 3019 +0 2724 3019 +0 2727 3019 +0 2730 3018 +0 2734 3018 +0 2739 3018 +0 2746 3017 +0 2755 3016 +0 2765 3016 +0 2778 3016 +0 2796 3016 +0 2817 3016 +0 2845 3016 +0 2880 3016 +0 2922 3016 +0 2974 3016 +0 3016 2998 +0 3016 2907 +0 3016 2749 +0 3016 2377 +0 3150 0 +0 3282 0 +2135 3414 0 +2778 3547 0 +3096 3679 0 +3330 3812 0 +3526 3944 0 +3700 4076 0 +3862 4095 0 +0 2708 3019 +0 2709 3019 +0 2710 3019 +0 2712 3019 +0 2713 3019 +0 2716 3019 +0 2719 3018 +0 2723 3018 +0 2728 3018 +0 2735 3017 +0 2745 3016 +0 2757 3015 +0 2770 3015 +0 2788 3015 +0 2810 3015 +0 2838 3015 +0 2873 3015 +0 2916 3015 +0 2968 3015 +0 3015 3001 +0 3015 2911 +0 3015 2753 +0 3015 2387 +0 3149 0 +0 3281 0 +2180 3414 0 +2790 3547 0 +3102 3679 0 +3333 3812 0 +3528 3944 0 +3701 4076 0 +3863 4095 0 +0 2693 3019 +0 2694 3019 +0 2695 3019 +0 2696 3019 +0 2698 3019 +0 2701 3019 +0 2703 3018 +0 2708 3018 +0 2714 3018 +0 2721 3017 +0 2731 3016 +0 2743 3015 +0 2759 3014 +0 2777 3014 +0 2800 3014 +0 2829 3014 +0 2865 3014 +0 2908 3014 +0 2961 3014 +0 3014 3004 +0 3014 2915 +0 3014 2759 +0 3014 2401 +0 3148 0 +0 3280 0 +2234 3414 0 +2804 3546 0 +3110 3679 0 +3338 3811 0 +3531 3944 0 +3703 4076 0 +3864 4095 0 +0 2672 3019 +0 2672 3019 +0 2673 3019 +0 2675 3019 +0 2677 3019 +0 2679 3019 +0 2683 3018 +0 2687 3018 +0 2693 3018 +0 2701 3017 +0 2711 3016 +0 2724 3015 +0 2741 3014 +0 2763 3012 +0 2786 3012 +0 2816 3012 +0 2853 3012 +0 2898 3012 +0 2952 3012 +0 3012 3009 +0 3012 2921 +0 3012 2767 +0 3012 2419 +0 3146 0 +0 3280 0 +2298 3413 0 +2824 3546 0 +3119 3678 0 +3344 3811 0 +3535 3943 0 +3706 4076 0 +3866 4095 0 +0 2641 3019 +0 2642 3019 +0 2643 3019 +0 2645 3019 +0 2647 3019 +0 2649 3019 +0 2653 3018 +0 2658 3018 +0 2664 3018 +0 2672 3017 +0 2683 3016 +0 2697 3015 +0 2715 3014 +0 2738 3012 +0 2767 3010 +0 2798 3010 +0 2836 3010 +0 2883 3010 +0 2939 3010 +0 3004 3010 +0 3010 2928 +0 3010 2778 +0 3010 2441 +0 3144 0 +0 3278 0 +2371 3412 0 +2848 3545 0 +3132 3678 0 +3352 3810 0 +3540 3943 0 +3710 4075 0 +3868 4095 0 +0 2597 3019 +0 2598 3019 +0 2599 3019 +0 2601 3019 +0 2603 3019 +0 2606 3019 +0 2610 3018 +0 2615 3018 +0 2622 3018 +0 2631 3017 +0 2643 3016 +0 2658 3015 +0 2678 3014 +0 2703 3012 +0 2734 3010 +0 2773 3006 +0 2813 3006 +0 2862 3006 +0 2920 3006 +0 2988 3006 +0 3006 2939 +0 3006 2792 +0 3006 2470 +0 3142 0 +0 3276 0 +2453 3410 0 +2879 3544 0 +3149 3677 0 +3362 3810 0 +3547 3943 0 +3714 4075 0 +3872 4095 0 +0 2530 3019 +0 2531 3019 +0 2533 3019 +0 2535 3019 +0 2537 3019 +0 2541 3019 +0 2545 3018 +0 2551 3018 +0 2559 3018 +0 2570 3017 +0 2583 3016 +0 2600 3015 +0 2623 3014 +0 2651 3012 +0 2686 3010 +0 2729 3006 +0 2781 3002 +0 2833 3002 +0 2895 3002 +0 2966 3002 +0 3002 2952 +0 3002 2810 +0 3002 2505 +0 3138 0 +1202 3274 0 +2545 3408 0 +2917 3543 0 +3170 3676 0 +3376 3809 0 +3556 3942 0 +3721 4075 0 +3876 4095 0 +0 2422 3019 +0 2424 3019 +0 2426 3019 +0 2428 3019 +0 2431 3019 +0 2435 3019 +0 2441 3018 +0 2449 3018 +0 2459 3018 +0 2471 3017 +0 2488 3016 +0 2510 3015 +0 2536 3014 +0 2570 3012 +0 2612 3010 +0 2662 3006 +0 2722 3002 +1006 2791 2995 +1006 2858 2995 +1006 2935 2995 +1006 2995 2968 +1006 2995 2833 +1006 2995 2549 +0 3134 1211 +1990 3270 0 +2643 3406 0 +2963 3541 0 +3197 3675 0 +3393 3808 0 +3568 3941 0 +3729 4074 0 +3882 4095 0 +0 2220 3019 +0 2222 3019 +0 2225 3019 +0 2229 3019 +0 2234 3019 +0 2241 3019 +0 2249 3018 +0 2261 3018 +0 2276 3018 +0 2294 3017 +0 2319 3016 +0 2350 3015 +0 2388 3014 +0 2434 3012 +0 2489 3010 +0 2554 3006 +0 2628 3002 +1006 2712 2995 +1930 2804 2987 +1930 2890 2987 +1930 2984 2987 +1930 2987 2862 +1930 2987 2602 +1137 3128 1758 +2327 3266 0 +2749 3402 0 +3018 3538 0 +3231 3673 0 +3415 3807 0 +3583 3940 0 +3740 4073 0 +3890 4095 0 +0 1594 3019 +0 1602 3019 +0 1613 3019 +0 1628 3019 +0 1646 3019 +0 1670 3019 +0 1700 3018 +0 1737 3018 +0 1782 3018 +0 1837 3017 +0 1900 3016 +0 1974 3015 +0 2056 3014 +0 2148 3012 +0 2247 3010 +0 2352 3006 +0 2463 3002 +1006 2579 2995 +1930 2699 2987 +2280 2821 2975 +2280 2929 2975 +2280 2975 2898 +2280 2975 2664 +2064 3119 2061 +2569 3259 1272 +2860 3398 0 +3083 3535 0 +3273 3670 0 +3443 3805 0 +3603 3939 0 +3754 4072 0 +3900 4095 0 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3018 +0 0 3018 +0 0 3018 +0 0 3017 +0 0 3016 +0 0 3015 +0 0 3014 +0 0 3012 +0 922 3010 +0 1723 3006 +0 2062 3002 +1006 2303 2995 +1930 2503 2987 +2280 2680 2975 +2526 2843 2959 +2526 2959 2942 +2526 2959 2735 +2511 3108 2412 +2768 3251 2194 +2976 3392 1406 +3157 3530 0 +3323 3667 0 +3479 3802 0 +3628 3937 0 +3772 4071 0 +3913 4095 0 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3019 +0 0 3018 +0 0 3018 +0 0 3018 +0 0 3017 +0 0 3016 +0 0 3015 +0 0 3014 +0 0 3012 +0 0 3010 +0 0 3006 +1109 0 3002 +1635 1006 2995 +1930 1930 2987 +2280 2377 2975 +2526 2654 2959 +2728 2871 2937 +2728 2937 2816 +2787 3092 2658 +2945 3239 2544 +3095 3383 2326 +3241 3524 1536 +3382 3662 0 +3522 3799 0 +3659 3934 0 +3795 4069 0 +3930 4095 0 +2346 0 3019 +2346 0 3019 +2347 0 3019 +2348 0 3019 +2350 0 3019 +2352 0 3019 +2354 0 3018 +2358 0 3018 +2362 0 3018 +2369 0 3017 +2377 0 3016 +2387 0 3015 +2401 0 3014 +2419 0 3012 +2441 0 3010 +2470 0 3006 +2505 0 3002 +2549 1006 2995 +2602 1930 2987 +2664 2280 2975 +2735 2526 2959 +2816 2728 2937 +2906 2906 2906 +3003 3069 2860 +3107 3223 2790 +3218 3372 2676 +3333 3515 2457 +3452 3656 1663 +3574 3794 0 +3698 3931 0 +3824 4066 0 +3952 4095 0 +2868 0 3152 +2868 0 3152 +2869 0 3152 +2869 0 3151 +2869 0 3151 +2870 0 3151 +2871 0 3151 +2872 0 3151 +2873 0 3151 +2875 0 3150 +2878 0 3150 +2881 0 3149 +2886 0 3148 +2892 0 3146 +2901 0 3144 +2911 0 3142 +2925 0 3138 +2943 0 3134 +2965 1137 3128 +2995 2061 3119 +3031 2412 3108 +3074 2658 3092 +3069 2860 3003 +3069 2948 2860 +3223 3206 2790 +3325 3372 2676 +3418 3515 2457 +3519 3656 1663 +3626 3794 0 +3738 3931 0 +3855 4066 0 +3976 4095 0 +3162 0 3284 +3162 0 3283 +3163 0 3283 +3163 0 3283 +3163 0 3283 +3163 0 3283 +3164 0 3283 +3164 0 3283 +3165 0 3283 +3166 0 3282 +3168 0 3282 +3169 0 3281 +3172 0 3280 +3175 0 3280 +3180 0 3278 +3185 0 3276 +3193 0 3274 +3203 0 3270 +3216 0 3266 +3233 1272 3259 +3251 2194 3248 +3239 2544 3193 +3223 2790 3107 +3223 2790 2918 +3223 2999 2790 +3372 3294 2676 +3512 3515 2457 +3595 3656 1663 +3687 3794 0 +3787 3931 0 +3893 4066 0 +4005 4095 0 +3387 0 3416 +3387 0 3416 +3387 0 3416 +3387 0 3416 +3387 0 3416 +3387 0 3416 +3387 0 3415 +3388 0 3415 +3388 0 3415 +3389 0 3415 +3390 0 3414 +3391 0 3414 +3393 0 3414 +3395 0 3413 +3397 0 3412 +3401 0 3410 +3406 0 3408 +3406 0 3400 +3402 0 3384 +3398 0 3362 +3392 1406 3331 +3383 2326 3286 +3372 2676 3218 +3372 2676 3077 +3372 2676 2774 +3372 3060 2676 +3515 3391 2457 +3656 3629 1663 +3759 3794 0 +3845 3931 0 +3940 4066 0 +4042 4095 0 +3548 0 3516 +3548 0 3516 +3548 0 3516 +3548 0 3516 +3548 0 3516 +3548 0 3516 +3548 0 3515 +3548 0 3515 +3548 0 3514 +3547 0 3513 +3547 0 3512 +3547 0 3511 +3546 0 3509 +3546 0 3506 +3545 0 3502 +3544 0 3497 +3543 0 3490 +3541 0 3480 +3538 0 3467 +3535 0 3449 +3530 0 3423 +3524 1536 3387 +3515 2457 3333 +3515 2457 3227 +3515 2457 3032 +3515 2457 2459 +3515 3130 2457 +3656 3494 1663 +3794 3745 0 +3913 3931 0 +3995 4066 0 +4087 4095 0 +3680 0 3599 +3680 0 3599 +3680 0 3599 +3680 0 3599 +3680 0 3599 +3680 0 3599 +3680 0 3598 +3680 0 3598 +3680 0 3597 +3680 0 3597 +3679 0 3596 +3679 0 3595 +3679 0 3593 +3678 0 3590 +3678 0 3587 +3677 0 3583 +3676 0 3577 +3675 0 3569 +3673 0 3558 +3670 0 3543 +3667 0 3523 +3662 0 3494 +3656 1663 3452 +3656 1663 3373 +3656 1663 3240 +3656 1663 2965 +3656 2289 1663 +3656 3210 1663 +3794 3603 0 +3931 3863 0 +4060 4066 0 +4095 4095 0 +3812 0 3691 +3812 0 3691 +3812 0 3690 +3812 0 3690 +3812 0 3690 +3812 0 3690 +3812 0 3690 +3812 0 3690 +3812 0 3689 +3812 0 3689 +3812 0 3688 +3812 0 3687 +3811 0 3685 +3811 0 3683 +3810 0 3680 +3810 0 3677 +3809 0 3672 +3808 0 3666 +3807 0 3657 +3805 0 3646 +3802 0 3629 +3799 0 3606 +3794 0 3574 +3794 0 3515 +3794 0 3421 +3794 0 3256 +3794 0 2856 +3794 1884 0 +3794 3298 0 +3931 3717 0 +4066 3985 0 +4095 4095 0 +3944 0 3790 +3944 0 3790 +3944 0 3790 +3944 0 3790 +3944 0 3789 +3944 0 3789 +3944 0 3789 +3944 0 3789 +3944 0 3788 +3944 0 3788 +3944 0 3787 +3944 0 3786 +3944 0 3785 +3943 0 3784 +3943 0 3781 +3943 0 3779 +3942 0 3775 +3941 0 3770 +3940 0 3763 +3939 0 3754 +3937 0 3741 +3934 0 3723 +3931 0 3698 +3931 0 3654 +3931 0 3587 +3931 0 3479 +3931 0 3277 +3931 0 2650 +3931 0 0 +3931 3395 0 +4066 3835 0 +4095 4095 0 +4076 0 3895 +4076 0 3895 +4076 0 3895 +4076 0 3895 +4076 0 3895 +4076 0 3895 +4076 0 3895 +4076 0 3895 +4076 0 3894 +4076 0 3894 +4076 0 3893 +4076 0 3892 +4076 0 3891 +4076 0 3890 +4075 0 3889 +4075 0 3887 +4075 0 3884 +4074 0 3880 +4073 0 3874 +4072 0 3867 +4071 0 3857 +4069 0 3843 +4066 0 3824 +4066 0 3791 +4066 0 3743 +4066 0 3669 +4066 0 3546 +4066 0 3303 +4066 0 1985 +4066 0 0 +4066 3498 0 +4095 3957 0 +4095 0 4007 +4095 0 4006 +4095 0 4006 +4095 0 4006 +4095 0 4006 +4095 0 4006 +4095 0 4006 +4095 0 4006 +4095 0 4006 +4095 0 4005 +4095 0 4005 +4095 0 4005 +4095 0 4004 +4095 0 4003 +4095 0 4002 +4095 0 4000 +4095 0 3998 +4095 0 3994 +4095 0 3990 +4095 0 3984 +4095 0 3977 +4095 0 3966 +4095 0 3952 +4095 0 3927 +4095 0 3892 +4095 0 3840 +4095 0 3759 +4095 0 3623 +4095 0 3337 +4095 0 0 +4095 0 0 +4095 3608 0 +0 2882 3152 +0 2883 3152 +0 2883 3152 +0 2884 3152 +0 2885 3152 +0 2886 3152 +0 2888 3152 +0 2890 3152 +0 2893 3152 +0 2898 3152 +0 2903 3152 +0 2911 3152 +0 2920 3152 +0 2933 3152 +0 2949 3152 +0 2970 3152 +0 2996 3152 +0 3030 3152 +0 3071 3152 +0 3120 3152 +0 3152 3123 +0 3152 3031 +0 3152 2868 +0 3152 2478 +0 3284 0 +0 3416 0 +2104 3548 0 +2876 3680 0 +3211 3812 0 +3452 3944 0 +3651 4076 0 +3828 4095 0 +0 2881 3152 +0 2882 3152 +0 2883 3152 +0 2883 3152 +0 2885 3152 +0 2886 3152 +0 2888 3152 +0 2890 3152 +0 2893 3152 +0 2897 3152 +0 2903 3152 +0 2910 3152 +0 2920 3152 +0 2932 3152 +0 2949 3152 +0 2970 3152 +0 2996 3152 +0 3029 3152 +0 3070 3152 +0 3120 3152 +0 3152 3123 +0 3152 3031 +0 3152 2868 +0 3152 2478 +0 3283 0 +0 3416 0 +2107 3548 0 +2877 3680 0 +3212 3812 0 +3452 3944 0 +3651 4076 0 +3828 4095 0 +0 2881 3152 +0 2881 3152 +0 2882 3152 +0 2883 3152 +0 2884 3152 +0 2885 3152 +0 2887 3152 +0 2890 3152 +0 2893 3152 +0 2897 3152 +0 2903 3152 +0 2910 3152 +0 2919 3152 +0 2932 3152 +0 2948 3152 +0 2969 3152 +0 2996 3152 +0 3029 3152 +0 3070 3152 +0 3120 3152 +0 3152 3123 +0 3152 3031 +0 3152 2869 +0 3152 2479 +0 3283 0 +0 3416 0 +2111 3548 0 +2877 3680 0 +3212 3812 0 +3453 3944 0 +3651 4076 0 +3828 4095 0 +0 2880 3152 +0 2881 3152 +0 2881 3152 +0 2882 3151 +0 2883 3151 +0 2885 3151 +0 2886 3151 +0 2889 3151 +0 2892 3151 +0 2896 3151 +0 2902 3151 +0 2909 3151 +0 2919 3151 +0 2932 3151 +0 2948 3151 +0 2969 3151 +0 2995 3151 +0 3029 3151 +0 3070 3151 +0 3119 3151 +0 3151 3123 +0 3151 3031 +0 3151 2869 +0 3151 2480 +0 3283 0 +0 3416 0 +2115 3548 0 +2878 3680 0 +3213 3812 0 +3453 3944 0 +3652 4076 0 +3828 4095 0 +0 2879 3152 +0 2880 3152 +0 2880 3152 +0 2881 3151 +0 2883 3151 +0 2884 3151 +0 2886 3151 +0 2888 3151 +0 2891 3151 +0 2895 3151 +0 2901 3151 +0 2908 3151 +0 2918 3151 +0 2931 3151 +0 2947 3151 +0 2968 3151 +0 2995 3151 +0 3028 3151 +0 3069 3151 +0 3119 3151 +0 3151 3123 +0 3151 3031 +0 3151 2869 +0 3151 2481 +0 3283 0 +0 3416 0 +2122 3548 0 +2879 3680 0 +3213 3812 0 +3453 3944 0 +3652 4076 0 +3828 4095 0 +0 2878 3152 +0 2878 3152 +0 2879 3152 +0 2880 3151 +0 2881 3151 +0 2883 3151 +0 2885 3151 +0 2887 3151 +0 2890 3151 +0 2895 3151 +0 2900 3151 +0 2907 3151 +0 2917 3151 +0 2930 3151 +0 2946 3151 +0 2967 3151 +0 2994 3151 +0 3027 3151 +0 3068 3151 +0 3118 3151 +0 3151 3124 +0 3151 3032 +0 3151 2870 +0 3151 2482 +0 3283 0 +0 3416 0 +2130 3548 0 +2881 3680 0 +3214 3812 0 +3454 3944 0 +3652 4076 0 +3829 4095 0 +0 2876 3152 +0 2877 3152 +0 2877 3152 +0 2878 3151 +0 2879 3151 +0 2881 3151 +0 2883 3151 +0 2885 3151 +0 2889 3151 +0 2893 3151 +0 2898 3151 +0 2906 3151 +0 2916 3151 +0 2928 3151 +0 2945 3151 +0 2966 3151 +0 2993 3151 +0 3026 3151 +0 3067 3151 +0 3117 3151 +0 3151 3124 +0 3151 3032 +0 3151 2871 +0 3151 2484 +0 3283 0 +0 3415 0 +2141 3548 0 +2883 3680 0 +3215 3812 0 +3454 3944 0 +3653 4076 0 +3829 4095 0 +0 2873 3152 +0 2874 3152 +0 2875 3152 +0 2876 3151 +0 2877 3151 +0 2879 3151 +0 2881 3151 +0 2883 3151 +0 2887 3151 +0 2891 3151 +0 2896 3151 +0 2904 3151 +0 2914 3151 +0 2927 3151 +0 2943 3151 +0 2964 3151 +0 2991 3151 +0 3025 3151 +0 3066 3151 +0 3116 3151 +0 3151 3125 +0 3151 3033 +0 3151 2872 +0 3151 2487 +0 3283 0 +0 3415 0 +2156 3548 0 +2886 3680 0 +3216 3812 0 +3455 3944 0 +3653 4076 0 +3829 4095 0 +0 2870 3152 +0 2871 3152 +0 2871 3152 +0 2872 3151 +0 2873 3151 +0 2875 3151 +0 2877 3151 +0 2880 3151 +0 2884 3151 +0 2888 3151 +0 2894 3151 +0 2902 3151 +0 2911 3151 +0 2924 3151 +0 2941 3151 +0 2962 3151 +0 2989 3151 +0 3023 3151 +0 3064 3151 +0 3115 3151 +0 3151 3126 +0 3151 3034 +0 3151 2873 +0 3151 2490 +0 3283 0 +0 3415 0 +2174 3548 0 +2890 3680 0 +3218 3812 0 +3456 3944 0 +3654 4076 0 +3830 4095 0 +0 2866 3152 +0 2866 3152 +0 2867 3152 +0 2868 3151 +0 2869 3151 +0 2871 3151 +0 2873 3151 +0 2876 3151 +0 2880 3151 +0 2885 3150 +0 2891 3150 +0 2898 3150 +0 2908 3150 +0 2921 3150 +0 2938 3150 +0 2959 3150 +0 2986 3150 +0 3020 3150 +0 3062 3150 +0 3112 3150 +0 3150 3127 +0 3150 3036 +0 3150 2875 +0 3150 2495 +0 3282 0 +0 3415 0 +2198 3547 0 +2895 3680 0 +3221 3812 0 +3458 3944 0 +3655 4076 0 +3830 4095 0 +0 2860 3152 +0 2860 3152 +0 2861 3152 +0 2862 3151 +0 2863 3151 +0 2865 3151 +0 2867 3151 +0 2870 3151 +0 2874 3151 +0 2879 3150 +0 2886 3150 +0 2894 3150 +0 2904 3150 +0 2917 3150 +0 2933 3150 +0 2955 3150 +0 2982 3150 +0 3017 3150 +0 3059 3150 +0 3110 3150 +0 3150 3128 +0 3150 3038 +0 3150 2878 +0 3150 2501 +0 3282 0 +0 3414 0 +2228 3547 0 +2901 3679 0 +3224 3812 0 +3459 3944 0 +3656 4076 0 +3831 4095 0 +0 2851 3152 +0 2852 3152 +0 2853 3152 +0 2854 3151 +0 2855 3151 +0 2857 3151 +0 2859 3151 +0 2862 3151 +0 2866 3151 +0 2871 3150 +0 2878 3150 +0 2887 3149 +0 2898 3149 +0 2911 3149 +0 2928 3149 +0 2950 3149 +0 2977 3149 +0 3012 3149 +0 3055 3149 +0 3106 3149 +0 3149 3131 +0 3149 3040 +0 3149 2881 +0 3149 2509 +0 3281 0 +0 3414 0 +2265 3547 0 +2910 3679 0 +3228 3812 0 +3462 3944 0 +3658 4076 0 +3832 4095 0 +0 2840 3152 +0 2841 3152 +0 2842 3152 +0 2842 3151 +0 2844 3151 +0 2845 3151 +0 2848 3151 +0 2851 3151 +0 2855 3151 +0 2860 3150 +0 2868 3150 +0 2877 3149 +0 2889 3148 +0 2903 3148 +0 2920 3148 +0 2942 3148 +0 2970 3148 +0 3005 3148 +0 3049 3148 +0 3100 3148 +0 3148 3133 +0 3148 3043 +0 3148 2886 +0 3148 2520 +0 3280 0 +0 3414 0 +2311 3546 0 +2922 3679 0 +3234 3811 0 +3466 3944 0 +3660 4076 0 +3834 4095 0 +0 2825 3152 +0 2825 3152 +0 2826 3152 +0 2827 3151 +0 2829 3151 +0 2830 3151 +0 2833 3151 +0 2836 3151 +0 2840 3151 +0 2846 3150 +0 2853 3150 +0 2863 3149 +0 2875 3148 +0 2892 3146 +0 2910 3146 +0 2932 3146 +0 2961 3146 +0 2997 3146 +0 3041 3146 +0 3093 3146 +0 3146 3137 +0 3146 3047 +0 3146 2892 +0 3146 2533 +0 3280 0 +0 3413 0 +2365 3546 0 +2936 3678 0 +3241 3811 0 +3470 3943 0 +3663 4076 0 +3836 4095 0 +0 2803 3152 +0 2804 3152 +0 2805 3152 +0 2806 3151 +0 2807 3151 +0 2809 3151 +0 2812 3151 +0 2815 3151 +0 2819 3151 +0 2825 3150 +0 2833 3150 +0 2843 3149 +0 2856 3148 +0 2873 3146 +0 2895 3144 +0 2919 3144 +0 2948 3144 +0 2985 3144 +0 3030 3144 +0 3084 3144 +0 3144 3141 +0 3144 3053 +0 3144 2901 +0 3144 2551 +0 3278 0 +0 3412 0 +2429 3545 0 +2955 3678 0 +3251 3810 0 +3476 3943 0 +3667 4075 0 +3838 4095 0 +0 2773 3152 +0 2773 3152 +0 2774 3152 +0 2775 3151 +0 2777 3151 +0 2779 3151 +0 2782 3151 +0 2785 3151 +0 2790 3151 +0 2796 3150 +0 2804 3150 +0 2815 3149 +0 2829 3148 +0 2847 3146 +0 2870 3144 +0 2900 3142 +0 2931 3142 +0 2969 3142 +0 3015 3142 +0 3071 3142 +0 3136 3142 +0 3142 3061 +0 3142 2911 +0 3142 2573 +0 3276 0 +0 3410 0 +2502 3544 0 +2980 3677 0 +3264 3810 0 +3484 3943 0 +3672 4075 0 +3842 4095 0 +0 2729 3152 +0 2729 3152 +0 2730 3152 +0 2732 3151 +0 2733 3151 +0 2735 3151 +0 2738 3151 +0 2742 3151 +0 2747 3151 +0 2754 3150 +0 2763 3150 +0 2775 3149 +0 2790 3148 +0 2810 3146 +0 2835 3144 +0 2867 3142 +0 2906 3138 +0 2946 3138 +0 2995 3138 +0 3053 3138 +0 3120 3138 +0 3138 3071 +0 3138 2925 +0 3138 2602 +0 3274 0 +0 3408 0 +2585 3543 0 +3010 3676 0 +3281 3809 0 +3494 3942 0 +3679 4075 0 +3847 4095 0 +0 2662 3152 +0 2663 3152 +0 2664 3152 +0 2665 3151 +0 2667 3151 +0 2670 3151 +0 2673 3151 +0 2678 3151 +0 2684 3151 +0 2691 3150 +0 2702 3150 +0 2715 3149 +0 2733 3148 +0 2755 3146 +0 2783 3144 +0 2818 3142 +0 2861 3138 +0 2913 3134 +0 2965 3134 +0 3027 3134 +0 3098 3134 +0 3134 3084 +0 3134 2943 +0 3134 2638 +0 3270 0 +1325 3406 0 +2676 3541 0 +3048 3675 0 +3302 3808 0 +3507 3941 0 +3688 4074 0 +3853 4095 0 +0 2554 3152 +0 2555 3152 +0 2556 3152 +0 2558 3151 +0 2560 3151 +0 2564 3151 +0 2568 3151 +0 2573 3151 +0 2581 3151 +0 2591 3150 +0 2604 3150 +0 2620 3149 +0 2642 3148 +0 2669 3146 +0 2703 3144 +0 2744 3142 +0 2795 3138 +0 2854 3134 +1137 2923 3128 +1137 2991 3128 +1137 3067 3128 +1137 3128 3101 +1137 3128 2965 +1137 3128 2681 +0 3266 1375 +2121 3402 0 +2775 3538 0 +3095 3673 0 +3329 3807 0 +3525 3940 0 +3700 4073 0 +3861 4095 0 +0 2352 3152 +0 2353 3152 +0 2355 3152 +0 2358 3151 +0 2362 3151 +0 2367 3151 +0 2373 3151 +0 2382 3151 +0 2394 3151 +0 2408 3150 +0 2427 3150 +0 2452 3149 +0 2482 3148 +0 2521 3146 +0 2566 3144 +0 2622 3142 +0 2687 3138 +0 2761 3134 +1137 2845 3128 +2061 2936 3119 +2061 3022 3119 +2061 3116 3119 +2061 3119 2995 +2061 3119 2734 +1272 3259 1899 +2458 3398 0 +2881 3535 0 +3150 3670 0 +3363 3805 0 +3547 3939 0 +3715 4072 0 +3872 4095 0 +0 1720 3152 +0 1726 3152 +0 1735 3152 +0 1746 3151 +0 1760 3151 +0 1779 3151 +0 1802 3151 +0 1832 3151 +0 1869 3151 +0 1915 3150 +0 1969 3150 +0 2033 3149 +0 2106 3148 +0 2189 3146 +0 2280 3144 +0 2379 3142 +0 2484 3138 +0 2596 3134 +1137 2712 3128 +2061 2831 3119 +2412 2954 3108 +2412 3061 3108 +2412 3108 3031 +2412 3108 2796 +2194 3251 2195 +2701 3392 1406 +2992 3530 0 +3215 3667 0 +3405 3802 0 +3575 3937 0 +3735 4071 0 +3886 4095 0 +0 0 3152 +0 0 3152 +0 0 3152 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3150 +0 0 3150 +0 0 3149 +0 0 3148 +0 0 3146 +0 0 3144 +0 1068 3142 +0 1857 3138 +0 2195 3134 +1137 2436 3128 +2061 2636 3119 +2412 2813 3108 +2658 2976 3092 +2658 3092 3074 +2658 3092 2867 +2642 3239 2544 +2900 3383 2326 +3108 3524 1536 +3289 3662 0 +3455 3799 0 +3611 3934 0 +3760 4069 0 +3904 4095 0 +0 0 3152 +0 0 3152 +0 0 3152 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3151 +0 0 3150 +0 0 3150 +0 0 3149 +0 0 3148 +0 0 3146 +0 0 3144 +0 0 3142 +0 0 3138 +1211 0 3134 +1758 1137 3128 +2061 2064 3119 +2412 2511 3108 +2658 2787 3092 +2860 3003 3069 +2860 3069 2948 +2918 3223 2790 +3077 3372 2676 +3227 3515 2457 +3373 3656 1663 +3515 3794 0 +3654 3931 0 +3791 4066 0 +3927 4095 0 +2478 0 3152 +2478 0 3152 +2479 0 3152 +2480 0 3151 +2481 0 3151 +2482 0 3151 +2484 0 3151 +2487 0 3151 +2490 0 3151 +2495 0 3150 +2501 0 3150 +2509 0 3149 +2520 0 3148 +2533 0 3146 +2551 0 3144 +2573 0 3142 +2602 0 3138 +2638 0 3134 +2681 1137 3128 +2734 2061 3119 +2796 2412 3108 +2867 2658 3092 +2948 2860 3069 +3038 3038 3038 +3135 3201 2992 +3239 3356 2922 +3350 3504 2808 +3465 3648 2590 +3584 3788 1799 +3706 3926 0 +3830 4063 0 +3956 4095 0 +2999 0 3284 +2999 0 3283 +2999 0 3283 +2999 0 3283 +3000 0 3283 +3000 0 3283 +3001 0 3283 +3002 0 3283 +3003 0 3283 +3005 0 3282 +3006 0 3282 +3009 0 3281 +3013 0 3280 +3017 0 3280 +3023 0 3278 +3032 0 3276 +3042 0 3274 +3056 0 3270 +3074 0 3266 +3097 1272 3259 +3126 2194 3251 +3162 2544 3239 +3206 2790 3223 +3201 2992 3135 +3201 3080 2992 +3356 3338 2922 +3457 3504 2808 +3550 3648 2590 +3651 3788 1799 +3758 3926 0 +3870 4063 0 +3987 4095 0 +3294 0 3416 +3294 0 3416 +3294 0 3416 +3294 0 3416 +3295 0 3416 +3295 0 3416 +3295 0 3415 +3296 0 3415 +3296 0 3415 +3297 0 3415 +3298 0 3414 +3299 0 3414 +3301 0 3414 +3304 0 3413 +3307 0 3412 +3311 0 3410 +3317 0 3408 +3325 0 3406 +3335 0 3402 +3348 0 3398 +3365 1406 3392 +3383 2326 3380 +3372 2676 3325 +3356 2922 3239 +3356 2922 3051 +3356 3132 2922 +3504 3426 2808 +3644 3648 2590 +3728 3788 1799 +3820 3926 0 +3919 4063 0 +4025 4095 0 +3519 0 3548 +3519 0 3548 +3519 0 3548 +3519 0 3548 +3519 0 3548 +3519 0 3548 +3519 0 3548 +3520 0 3548 +3520 0 3548 +3520 0 3547 +3521 0 3547 +3522 0 3547 +3523 0 3546 +3525 0 3546 +3526 0 3545 +3529 0 3544 +3533 0 3543 +3538 0 3541 +3538 0 3532 +3535 0 3516 +3530 0 3495 +3524 1536 3463 +3515 2457 3418 +3504 2808 3350 +3504 2808 3209 +3504 2808 2907 +3504 3192 2808 +3648 3523 2590 +3788 3761 1799 +3891 3926 0 +3977 4063 0 +4072 4095 0 +3680 0 3649 +3680 0 3649 +3680 0 3649 +3680 0 3649 +3680 0 3648 +3680 0 3648 +3680 0 3648 +3680 0 3648 +3680 0 3647 +3680 0 3646 +3679 0 3646 +3679 0 3644 +3679 0 3643 +3678 0 3641 +3678 0 3638 +3677 0 3634 +3676 0 3629 +3675 0 3622 +3673 0 3612 +3670 0 3599 +3667 0 3581 +3662 0 3555 +3656 1663 3519 +3648 2590 3465 +3648 2590 3360 +3648 2590 3165 +3648 2590 2592 +3648 3262 2590 +3788 3626 1799 +3926 3877 0 +4045 4063 0 +4095 4095 0 +3812 0 3732 +3812 0 3731 +3812 0 3731 +3812 0 3731 +3812 0 3731 +3812 0 3731 +3812 0 3731 +3812 0 3730 +3812 0 3730 +3812 0 3729 +3812 0 3729 +3812 0 3728 +3811 0 3727 +3811 0 3725 +3810 0 3722 +3810 0 3719 +3809 0 3715 +3808 0 3709 +3807 0 3701 +3805 0 3690 +3802 0 3676 +3799 0 3655 +3794 0 3626 +3788 1799 3584 +3788 1799 3505 +3788 1799 3372 +3788 1799 3097 +3788 2422 1799 +3788 3342 1799 +3926 3735 0 +4063 3995 0 +4095 4095 0 +3944 0 3823 +3944 0 3823 +3944 0 3823 +3944 0 3822 +3944 0 3822 +3944 0 3822 +3944 0 3822 +3944 0 3822 +3944 0 3822 +3944 0 3821 +3944 0 3820 +3944 0 3820 +3944 0 3819 +3943 0 3817 +3943 0 3815 +3943 0 3813 +3942 0 3809 +3941 0 3805 +3940 0 3798 +3939 0 3790 +3937 0 3777 +3934 0 3761 +3931 0 3738 +3926 0 3706 +3926 0 3647 +3926 0 3553 +3926 0 3388 +3926 0 2988 +3926 2023 0 +3926 3430 0 +4063 3849 0 +4095 4095 0 +4076 0 3922 +4076 0 3922 +4076 0 3921 +4076 0 3921 +4076 0 3921 +4076 0 3921 +4076 0 3921 +4076 0 3921 +4076 0 3921 +4076 0 3921 +4076 0 3920 +4076 0 3919 +4076 0 3918 +4076 0 3917 +4075 0 3916 +4075 0 3913 +4075 0 3911 +4074 0 3907 +4073 0 3902 +4072 0 3895 +4071 0 3886 +4069 0 3873 +4066 0 3855 +4063 0 3830 +4063 0 3786 +4063 0 3719 +4063 0 3611 +4063 0 3409 +4063 0 2781 +4063 0 0 +4063 3527 0 +4095 3968 0 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4027 +4095 0 4026 +4095 0 4026 +4095 0 4026 +4095 0 4025 +4095 0 4024 +4095 0 4023 +4095 0 4021 +4095 0 4019 +4095 0 4016 +4095 0 4012 +4095 0 4006 +4095 0 3999 +4095 0 3989 +4095 0 3976 +4095 0 3956 +4095 0 3923 +4095 0 3875 +4095 0 3801 +4095 0 3679 +4095 0 3436 +4095 0 2137 +4095 0 0 +4095 3630 0 +0 3014 3284 +0 3014 3284 +0 3014 3284 +0 3015 3284 +0 3016 3284 +0 3017 3284 +0 3018 3284 +0 3020 3284 +0 3022 3284 +0 3025 3284 +0 3030 3284 +0 3035 3284 +0 3043 3284 +0 3052 3284 +0 3065 3284 +0 3081 3284 +0 3102 3284 +0 3128 3284 +0 3162 3284 +0 3203 3284 +0 3252 3284 +0 3284 3254 +0 3284 3162 +0 3284 2999 +0 3284 2609 +0 3416 0 +0 3548 0 +2237 3680 0 +3008 3812 0 +3344 3944 0 +3584 4076 0 +3784 4095 0 +0 3014 3284 +0 3014 3283 +0 3014 3283 +0 3015 3283 +0 3016 3283 +0 3017 3283 +0 3018 3283 +0 3020 3283 +0 3022 3283 +0 3025 3283 +0 3029 3283 +0 3035 3283 +0 3042 3283 +0 3052 3283 +0 3065 3283 +0 3081 3283 +0 3102 3283 +0 3128 3283 +0 3162 3283 +0 3203 3283 +0 3252 3283 +0 3283 3254 +0 3283 3162 +0 3283 2999 +0 3283 2609 +0 3416 0 +0 3548 0 +2239 3680 0 +3009 3812 0 +3344 3944 0 +3584 4076 0 +3784 4095 0 +0 3013 3284 +0 3014 3283 +0 3014 3283 +0 3014 3283 +0 3015 3283 +0 3016 3283 +0 3018 3283 +0 3019 3283 +0 3022 3283 +0 3025 3283 +0 3029 3283 +0 3035 3283 +0 3042 3283 +0 3052 3283 +0 3064 3283 +0 3081 3283 +0 3101 3283 +0 3128 3283 +0 3161 3283 +0 3202 3283 +0 3252 3283 +0 3283 3255 +0 3283 3163 +0 3283 2999 +0 3283 2610 +0 3416 0 +0 3548 0 +2242 3680 0 +3009 3812 0 +3344 3944 0 +3585 4076 0 +3784 4095 0 +0 3012 3284 +0 3013 3283 +0 3013 3283 +0 3014 3283 +0 3015 3283 +0 3016 3283 +0 3017 3283 +0 3019 3283 +0 3021 3283 +0 3025 3283 +0 3029 3283 +0 3034 3283 +0 3042 3283 +0 3051 3283 +0 3064 3283 +0 3080 3283 +0 3101 3283 +0 3128 3283 +0 3161 3283 +0 3202 3283 +0 3252 3283 +0 3283 3255 +0 3283 3163 +0 3283 2999 +0 3283 2611 +0 3416 0 +0 3548 0 +2246 3680 0 +3010 3812 0 +3344 3944 0 +3585 4076 0 +3784 4095 0 +0 3012 3284 +0 3012 3283 +0 3013 3283 +0 3013 3283 +0 3014 3283 +0 3015 3283 +0 3016 3283 +0 3018 3283 +0 3021 3283 +0 3024 3283 +0 3028 3283 +0 3034 3283 +0 3041 3283 +0 3051 3283 +0 3063 3283 +0 3080 3283 +0 3101 3283 +0 3127 3283 +0 3160 3283 +0 3201 3283 +0 3251 3283 +0 3283 3255 +0 3283 3163 +0 3283 3000 +0 3283 2612 +0 3416 0 +0 3548 0 +2251 3680 0 +3011 3812 0 +3345 3944 0 +3585 4076 0 +3784 4095 0 +0 3011 3284 +0 3011 3283 +0 3011 3283 +0 3012 3283 +0 3013 3283 +0 3014 3283 +0 3016 3283 +0 3018 3283 +0 3020 3283 +0 3023 3283 +0 3027 3283 +0 3033 3283 +0 3040 3283 +0 3050 3283 +0 3062 3283 +0 3079 3283 +0 3100 3283 +0 3127 3283 +0 3160 3283 +0 3201 3283 +0 3251 3283 +0 3283 3255 +0 3283 3163 +0 3283 3000 +0 3283 2613 +0 3416 0 +0 3548 0 +2257 3680 0 +3012 3812 0 +3346 3944 0 +3585 4076 0 +3784 4095 0 +0 3009 3284 +0 3010 3283 +0 3010 3283 +0 3011 3283 +0 3012 3283 +0 3013 3283 +0 3015 3283 +0 3016 3283 +0 3019 3283 +0 3022 3283 +0 3026 3283 +0 3032 3283 +0 3039 3283 +0 3049 3283 +0 3062 3283 +0 3078 3283 +0 3099 3283 +0 3126 3283 +0 3159 3283 +0 3200 3283 +0 3250 3283 +0 3283 3256 +0 3283 3164 +0 3283 3001 +0 3283 2614 +0 3415 0 +0 3548 0 +2266 3680 0 +3014 3812 0 +3346 3944 0 +3586 4076 0 +3784 4095 0 +0 3008 3284 +0 3008 3283 +0 3008 3283 +0 3009 3283 +0 3010 3283 +0 3011 3283 +0 3013 3283 +0 3015 3283 +0 3017 3283 +0 3021 3283 +0 3025 3283 +0 3031 3283 +0 3038 3283 +0 3047 3283 +0 3060 3283 +0 3077 3283 +0 3098 3283 +0 3125 3283 +0 3158 3283 +0 3199 3283 +0 3249 3283 +0 3283 3256 +0 3283 3164 +0 3283 3002 +0 3283 2616 +0 3415 0 +0 3548 0 +2277 3680 0 +3016 3812 0 +3347 3944 0 +3586 4076 0 +3785 4095 0 +0 3005 3284 +0 3005 3283 +0 3006 3283 +0 3007 3283 +0 3008 3283 +0 3009 3283 +0 3010 3283 +0 3013 3283 +0 3015 3283 +0 3018 3283 +0 3023 3283 +0 3029 3283 +0 3036 3283 +0 3046 3283 +0 3059 3283 +0 3075 3283 +0 3096 3283 +0 3123 3283 +0 3157 3283 +0 3198 3283 +0 3248 3283 +0 3283 3257 +0 3283 3165 +0 3283 3003 +0 3283 2619 +0 3415 0 +0 3548 0 +2291 3680 0 +3019 3812 0 +3349 3944 0 +3587 4076 0 +3786 4095 0 +0 3002 3284 +0 3002 3283 +0 3002 3283 +0 3003 3283 +0 3004 3283 +0 3005 3283 +0 3007 3283 +0 3009 3283 +0 3012 3283 +0 3016 3282 +0 3020 3282 +0 3026 3282 +0 3033 3282 +0 3043 3282 +0 3056 3282 +0 3073 3282 +0 3094 3282 +0 3121 3282 +0 3155 3282 +0 3196 3282 +0 3247 3282 +0 3282 3257 +0 3282 3166 +0 3282 3005 +0 3282 2622 +0 3415 0 +0 3547 0 +2310 3680 0 +3023 3812 0 +3351 3944 0 +3588 4076 0 +3786 4095 0 +0 2997 3284 +0 2998 3283 +0 2998 3283 +0 2999 3283 +0 3000 3283 +0 3001 3283 +0 3003 3283 +0 3005 3283 +0 3008 3283 +0 3012 3282 +0 3017 3282 +0 3023 3282 +0 3030 3282 +0 3040 3282 +0 3053 3282 +0 3070 3282 +0 3091 3282 +0 3118 3282 +0 3152 3282 +0 3194 3282 +0 3244 3282 +0 3282 3259 +0 3282 3168 +0 3282 3006 +0 3282 2627 +0 3414 0 +0 3547 0 +2333 3679 0 +3027 3812 0 +3353 3944 0 +3590 4076 0 +3787 4095 0 +0 2991 3284 +0 2992 3283 +0 2992 3283 +0 2993 3283 +0 2994 3283 +0 2995 3283 +0 2997 3283 +0 2999 3283 +0 3002 3283 +0 3006 3282 +0 3011 3282 +0 3018 3281 +0 3025 3281 +0 3035 3281 +0 3049 3281 +0 3065 3281 +0 3087 3281 +0 3114 3281 +0 3149 3281 +0 3191 3281 +0 3242 3281 +0 3281 3260 +0 3281 3169 +0 3281 3009 +0 3281 2633 +0 3414 0 +0 3547 0 +2363 3679 0 +3034 3812 0 +3356 3944 0 +3592 4076 0 +3788 4095 0 +0 2983 3284 +0 2983 3283 +0 2984 3283 +0 2985 3283 +0 2986 3283 +0 2987 3283 +0 2988 3283 +0 2991 3283 +0 2994 3283 +0 2998 3282 +0 3003 3282 +0 3010 3281 +0 3019 3280 +0 3029 3280 +0 3043 3280 +0 3060 3280 +0 3082 3280 +0 3109 3280 +0 3144 3280 +0 3186 3280 +0 3238 3280 +0 3280 3262 +0 3280 3172 +0 3280 3013 +0 3280 2641 +0 3414 0 +0 3546 0 +2400 3679 0 +3043 3811 0 +3361 3944 0 +3594 4076 0 +3790 4095 0 +0 2972 3284 +0 2972 3283 +0 2973 3283 +0 2973 3283 +0 2974 3283 +0 2976 3283 +0 2977 3283 +0 2980 3283 +0 2983 3283 +0 2987 3282 +0 2992 3282 +0 2999 3281 +0 3009 3280 +0 3021 3280 +0 3034 3280 +0 3052 3280 +0 3074 3280 +0 3102 3280 +0 3138 3280 +0 3180 3280 +0 3233 3280 +0 3280 3265 +0 3280 3175 +0 3280 3017 +0 3280 2651 +0 3413 0 +0 3546 0 +2445 3678 0 +3054 3811 0 +3366 3943 0 +3597 4076 0 +3792 4095 0 +0 2956 3284 +0 2957 3283 +0 2957 3283 +0 2958 3283 +0 2959 3283 +0 2960 3283 +0 2962 3283 +0 2965 3283 +0 2968 3283 +0 2972 3282 +0 2977 3282 +0 2985 3281 +0 2995 3280 +0 3007 3280 +0 3024 3278 +0 3041 3278 +0 3064 3278 +0 3093 3278 +0 3129 3278 +0 3173 3278 +0 3225 3278 +0 3278 3269 +0 3278 3180 +0 3278 3023 +0 3278 2665 +0 3412 0 +0 3545 0 +2499 3678 0 +3069 3810 0 +3374 3943 0 +3602 4075 0 +3795 4095 0 +0 2935 3284 +0 2935 3283 +0 2936 3283 +0 2936 3283 +0 2938 3283 +0 2939 3283 +0 2941 3283 +0 2943 3283 +0 2947 3283 +0 2951 3282 +0 2957 3282 +0 2965 3281 +0 2975 3280 +0 2988 3280 +0 3005 3278 +0 3027 3276 +0 3050 3276 +0 3080 3276 +0 3117 3276 +0 3162 3276 +0 3216 3276 +0 3276 3273 +0 3276 3185 +0 3276 3032 +0 3276 2683 +0 3410 0 +0 3544 0 +2562 3677 0 +3088 3810 0 +3384 3943 0 +3608 4075 0 +3799 4095 0 +0 2904 3284 +0 2905 3283 +0 2905 3283 +0 2906 3283 +0 2907 3283 +0 2909 3283 +0 2911 3283 +0 2914 3283 +0 2917 3283 +0 2922 3282 +0 2928 3282 +0 2936 3281 +0 2947 3280 +0 2961 3280 +0 2979 3278 +0 3002 3276 +0 3031 3274 +0 3062 3274 +0 3100 3274 +0 3147 3274 +0 3203 3274 +0 3268 3274 +0 3274 3193 +0 3274 3042 +0 3274 2706 +0 3408 0 +0 3543 0 +2636 3676 0 +3112 3809 0 +3396 3942 0 +3616 4075 0 +3804 4095 0 +0 2860 3284 +0 2860 3283 +0 2861 3283 +0 2862 3283 +0 2863 3283 +0 2865 3283 +0 2867 3283 +0 2870 3283 +0 2874 3283 +0 2879 3282 +0 2886 3282 +0 2895 3281 +0 2907 3280 +0 2922 3280 +0 2942 3278 +0 2967 3276 +0 2998 3274 +0 3037 3270 +0 3078 3270 +0 3126 3270 +0 3184 3270 +0 3252 3270 +0 3270 3203 +0 3270 3056 +0 3270 2734 +0 3406 0 +0 3541 0 +2718 3675 0 +3143 3808 0 +3413 3941 0 +3626 4074 0 +3811 4095 0 +0 2793 3284 +0 2793 3283 +0 2794 3283 +0 2795 3283 +0 2797 3283 +0 2799 3283 +0 2801 3283 +0 2805 3283 +0 2809 3283 +0 2815 3282 +0 2823 3282 +0 2833 3281 +0 2847 3280 +0 2865 3280 +0 2886 3278 +0 2915 3276 +0 2950 3274 +0 2993 3270 +0 3045 3266 +0 3097 3266 +0 3159 3266 +0 3230 3266 +0 3266 3216 +0 3266 3074 +0 3266 2770 +0 3402 0 +1477 3538 0 +2809 3673 0 +3181 3807 0 +3434 3940 0 +3640 4073 0 +3820 4095 0 +0 2684 3284 +0 2685 3283 +0 2686 3283 +0 2688 3283 +0 2690 3283 +0 2692 3283 +0 2695 3283 +0 2700 3283 +0 2705 3283 +0 2713 3282 +0 2723 3282 +0 2735 3281 +0 2752 3280 +0 2773 3280 +0 2800 3278 +0 2834 3276 +0 2876 3274 +0 2926 3270 +0 2986 3266 +1272 3055 3259 +1272 3122 3259 +1272 3199 3259 +1272 3259 3233 +1272 3259 3097 +1272 3259 2813 +0 3398 1484 +2256 3535 0 +2908 3670 0 +3227 3805 0 +3461 3939 0 +3657 4072 0 +3832 4095 0 +0 2481 3284 +0 2482 3283 +0 2484 3283 +0 2486 3283 +0 2489 3283 +0 2493 3283 +0 2498 3283 +0 2504 3283 +0 2513 3283 +0 2524 3282 +0 2539 3282 +0 2558 3281 +0 2583 3280 +0 2613 3280 +0 2651 3278 +0 2698 3276 +0 2753 3274 +0 2818 3270 +0 2893 3266 +1272 2976 3259 +2194 3069 3251 +2194 3154 3251 +2194 3248 3251 +2194 3251 3126 +2194 3251 2866 +1406 3392 2025 +2593 3530 0 +3014 3667 0 +3282 3802 0 +3495 3937 0 +3679 4071 0 +3847 4095 0 +0 1844 3284 +0 1849 3283 +0 1856 3283 +0 1864 3283 +0 1875 3283 +0 1890 3283 +0 1908 3283 +0 1932 3283 +0 1962 3283 +0 1999 3282 +0 2045 3282 +0 2100 3281 +0 2164 3280 +0 2237 3280 +0 2320 3278 +0 2411 3276 +0 2510 3274 +0 2616 3270 +0 2727 3266 +1272 2843 3259 +2194 2963 3251 +2544 3085 3239 +2544 3193 3239 +2544 3239 3162 +2544 3239 2928 +2328 3383 2326 +2833 3524 1536 +3125 3662 0 +3347 3799 0 +3537 3934 0 +3708 4069 0 +3867 4095 0 +0 0 3284 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3282 +0 0 3282 +0 0 3281 +0 0 3280 +0 0 3280 +0 0 3278 +0 0 3276 +0 1202 3274 +0 1990 3270 +0 2327 3266 +1272 2569 3259 +2194 2768 3251 +2544 2945 3239 +2790 3107 3223 +2790 3223 3206 +2790 3223 2999 +2774 3372 2676 +3032 3515 2457 +3240 3656 1663 +3421 3794 0 +3587 3931 0 +3743 4066 0 +3892 4095 0 +0 0 3284 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3283 +0 0 3282 +0 0 3282 +0 0 3281 +0 0 3280 +0 0 3280 +0 0 3278 +0 0 3276 +0 0 3274 +0 0 3270 +1375 0 3266 +1899 1272 3259 +2195 2194 3251 +2544 2642 3239 +2790 2918 3223 +2992 3135 3201 +2992 3201 3080 +3051 3356 2922 +3209 3504 2808 +3360 3648 2590 +3505 3788 1799 +3647 3926 0 +3786 4063 0 +3923 4095 0 +2609 0 3284 +2609 0 3283 +2610 0 3283 +2611 0 3283 +2612 0 3283 +2613 0 3283 +2614 0 3283 +2616 0 3283 +2619 0 3283 +2622 0 3282 +2627 0 3282 +2633 0 3281 +2641 0 3280 +2651 0 3280 +2665 0 3278 +2683 0 3276 +2706 0 3274 +2734 0 3270 +2770 0 3266 +2813 1272 3259 +2866 2194 3251 +2928 2544 3239 +2999 2790 3223 +3080 2992 3201 +3170 3170 3170 +3267 3333 3124 +3372 3488 3054 +3482 3636 2940 +3597 3780 2721 +3716 3920 1928 +3838 4058 0 +3962 4095 0 +3132 0 3416 +3132 0 3416 +3132 0 3416 +3132 0 3416 +3132 0 3416 +3133 0 3416 +3133 0 3415 +3134 0 3415 +3135 0 3415 +3136 0 3415 +3137 0 3414 +3139 0 3414 +3142 0 3414 +3145 0 3413 +3150 0 3412 +3156 0 3410 +3164 0 3408 +3175 0 3406 +3189 0 3402 +3206 0 3398 +3230 1406 3392 +3258 2326 3383 +3294 2676 3372 +3338 2922 3356 +3333 3124 3267 +3333 3212 3124 +3488 3470 3054 +3589 3636 2940 +3682 3780 2721 +3783 3920 1928 +3890 4058 0 +4002 4095 0 +3426 0 3548 +3426 0 3548 +3427 0 3548 +3427 0 3548 +3427 0 3548 +3427 0 3548 +3427 0 3548 +3428 0 3548 +3428 0 3548 +3429 0 3547 +3429 0 3547 +3430 0 3547 +3432 0 3546 +3434 0 3546 +3436 0 3545 +3440 0 3544 +3444 0 3543 +3450 0 3541 +3457 0 3538 +3467 0 3535 +3480 0 3530 +3497 1536 3524 +3515 2457 3512 +3504 2808 3457 +3488 3054 3372 +3488 3054 3183 +3488 3264 3054 +3636 3558 2940 +3776 3780 2721 +3860 3920 1928 +3952 4058 0 +4051 4095 0 +3651 0 3680 +3651 0 3680 +3651 0 3680 +3651 0 3680 +3651 0 3680 +3651 0 3680 +3651 0 3680 +3652 0 3680 +3652 0 3680 +3652 0 3680 +3653 0 3679 +3653 0 3679 +3654 0 3679 +3655 0 3678 +3657 0 3678 +3659 0 3677 +3662 0 3676 +3665 0 3675 +3670 0 3673 +3670 0 3664 +3667 0 3648 +3662 0 3626 +3656 1663 3595 +3648 2590 3550 +3636 2940 3482 +3636 2940 3341 +3636 2940 3038 +3636 3324 2940 +3780 3655 2721 +3920 3893 1928 +4023 4058 0 +4095 4095 0 +3812 0 3781 +3812 0 3781 +3812 0 3781 +3812 0 3781 +3812 0 3781 +3812 0 3781 +3812 0 3781 +3812 0 3780 +3812 0 3780 +3812 0 3779 +3812 0 3778 +3812 0 3777 +3811 0 3777 +3811 0 3775 +3810 0 3773 +3810 0 3770 +3809 0 3766 +3808 0 3761 +3807 0 3754 +3805 0 3744 +3802 0 3731 +3799 0 3713 +3794 0 3687 +3788 1799 3651 +3780 2721 3597 +3780 2721 3492 +3780 2721 3296 +3780 2721 2722 +3780 3394 2721 +3920 3758 1928 +4058 4008 0 +4095 4095 0 +3944 0 3864 +3944 0 3864 +3944 0 3863 +3944 0 3863 +3944 0 3863 +3944 0 3863 +3944 0 3863 +3944 0 3863 +3944 0 3863 +3944 0 3862 +3944 0 3862 +3944 0 3861 +3944 0 3860 +3943 0 3859 +3943 0 3857 +3943 0 3854 +3942 0 3851 +3941 0 3847 +3940 0 3841 +3939 0 3833 +3937 0 3822 +3934 0 3808 +3931 0 3787 +3926 0 3758 +3920 1928 3716 +3920 1928 3637 +3920 1928 3504 +3920 1928 3229 +3920 2556 1928 +3920 3474 1928 +4058 3867 0 +4095 4095 0 +4076 0 3955 +4076 0 3955 +4076 0 3955 +4076 0 3955 +4076 0 3955 +4076 0 3954 +4076 0 3954 +4076 0 3954 +4076 0 3954 +4076 0 3953 +4076 0 3953 +4076 0 3953 +4076 0 3952 +4076 0 3950 +4075 0 3949 +4075 0 3947 +4075 0 3945 +4074 0 3941 +4073 0 3937 +4072 0 3930 +4071 0 3921 +4069 0 3910 +4066 0 3893 +4063 0 3870 +4058 0 3838 +4058 0 3779 +4058 0 3685 +4058 0 3520 +4058 0 3119 +4058 2157 0 +4058 3562 0 +4095 3982 0 +4095 0 4054 +4095 0 4054 +4095 0 4054 +4095 0 4054 +4095 0 4054 +4095 0 4054 +4095 0 4054 +4095 0 4053 +4095 0 4053 +4095 0 4053 +4095 0 4053 +4095 0 4052 +4095 0 4051 +4095 0 4051 +4095 0 4049 +4095 0 4048 +4095 0 4046 +4095 0 4043 +4095 0 4039 +4095 0 4034 +4095 0 4027 +4095 0 4018 +4095 0 4005 +4095 0 3987 +4095 0 3962 +4095 0 3918 +4095 0 3851 +4095 0 3743 +4095 0 3541 +4095 0 2915 +4095 0 0 +4095 3659 0 +0 3146 3416 +0 3146 3416 +0 3147 3416 +0 3147 3416 +0 3147 3416 +0 3148 3416 +0 3149 3416 +0 3151 3416 +0 3152 3416 +0 3155 3416 +0 3158 3416 +0 3162 3416 +0 3168 3416 +0 3175 3416 +0 3184 3416 +0 3197 3416 +0 3213 3416 +0 3234 3416 +0 3261 3416 +0 3294 3416 +0 3335 3416 +0 3385 3416 +0 3416 3387 +0 3416 3294 +0 3416 3132 +0 3416 2741 +0 3548 0 +0 3680 0 +2367 3812 0 +3140 3944 0 +3475 4076 0 +3716 4095 0 +0 3146 3416 +0 3146 3416 +0 3146 3416 +0 3147 3416 +0 3147 3416 +0 3148 3416 +0 3149 3416 +0 3151 3416 +0 3152 3416 +0 3154 3416 +0 3158 3416 +0 3162 3416 +0 3168 3416 +0 3175 3416 +0 3184 3416 +0 3197 3416 +0 3213 3416 +0 3234 3416 +0 3261 3416 +0 3294 3416 +0 3335 3416 +0 3385 3416 +0 3416 3387 +0 3416 3294 +0 3416 3132 +0 3416 2741 +0 3548 0 +0 3680 0 +2369 3812 0 +3140 3944 0 +3475 4076 0 +3717 4095 0 +0 3145 3416 +0 3146 3416 +0 3146 3416 +0 3147 3416 +0 3147 3416 +0 3148 3416 +0 3149 3416 +0 3150 3416 +0 3152 3416 +0 3154 3416 +0 3157 3416 +0 3162 3416 +0 3167 3416 +0 3175 3416 +0 3184 3416 +0 3197 3416 +0 3213 3416 +0 3234 3416 +0 3260 3416 +0 3294 3416 +0 3335 3416 +0 3384 3416 +0 3416 3387 +0 3416 3294 +0 3416 3132 +0 3416 2742 +0 3548 0 +0 3680 0 +2371 3812 0 +3140 3944 0 +3476 4076 0 +3717 4095 0 +0 3145 3416 +0 3145 3416 +0 3146 3416 +0 3146 3416 +0 3147 3416 +0 3147 3416 +0 3148 3416 +0 3150 3416 +0 3151 3416 +0 3154 3416 +0 3157 3416 +0 3161 3416 +0 3167 3416 +0 3174 3416 +0 3184 3416 +0 3196 3416 +0 3213 3416 +0 3234 3416 +0 3260 3416 +0 3293 3416 +0 3335 3416 +0 3384 3416 +0 3416 3387 +0 3416 3294 +0 3416 3132 +0 3416 2742 +0 3548 0 +0 3680 0 +2374 3812 0 +3141 3944 0 +3476 4076 0 +3717 4095 0 +0 3144 3416 +0 3145 3416 +0 3145 3416 +0 3146 3416 +0 3146 3416 +0 3147 3416 +0 3148 3416 +0 3149 3416 +0 3151 3416 +0 3154 3416 +0 3157 3416 +0 3161 3416 +0 3166 3416 +0 3174 3416 +0 3184 3416 +0 3196 3416 +0 3212 3416 +0 3233 3416 +0 3260 3416 +0 3293 3416 +0 3334 3416 +0 3384 3416 +0 3416 3387 +0 3416 3295 +0 3416 3132 +0 3416 2743 +0 3548 0 +0 3680 0 +2377 3812 0 +3142 3944 0 +3476 4076 0 +3717 4095 0 +0 3144 3416 +0 3144 3416 +0 3144 3416 +0 3145 3416 +0 3145 3416 +0 3146 3416 +0 3147 3416 +0 3149 3416 +0 3151 3416 +0 3153 3416 +0 3156 3416 +0 3160 3416 +0 3166 3416 +0 3173 3416 +0 3183 3416 +0 3196 3416 +0 3212 3416 +0 3233 3416 +0 3259 3416 +0 3293 3416 +0 3334 3416 +0 3384 3416 +0 3416 3387 +0 3416 3295 +0 3416 3133 +0 3416 2744 +0 3548 0 +0 3680 0 +2382 3812 0 +3143 3944 0 +3477 4076 0 +3717 4095 0 +0 3143 3416 +0 3143 3416 +0 3143 3416 +0 3144 3416 +0 3144 3416 +0 3145 3416 +0 3147 3415 +0 3148 3415 +0 3150 3415 +0 3152 3415 +0 3155 3415 +0 3160 3415 +0 3165 3415 +0 3173 3415 +0 3182 3415 +0 3195 3415 +0 3211 3415 +0 3232 3415 +0 3259 3415 +0 3292 3415 +0 3333 3415 +0 3383 3415 +0 3415 3387 +0 3415 3295 +0 3415 3133 +0 3415 2745 +0 3548 0 +0 3680 0 +2389 3812 0 +3144 3944 0 +3477 4076 0 +3718 4095 0 +0 3141 3416 +0 3141 3416 +0 3142 3416 +0 3142 3416 +0 3143 3416 +0 3144 3416 +0 3145 3415 +0 3147 3415 +0 3149 3415 +0 3151 3415 +0 3154 3415 +0 3158 3415 +0 3164 3415 +0 3171 3415 +0 3181 3415 +0 3194 3415 +0 3210 3415 +0 3231 3415 +0 3258 3415 +0 3291 3415 +0 3333 3415 +0 3382 3415 +0 3415 3388 +0 3415 3296 +0 3415 3134 +0 3415 2746 +0 3548 0 +0 3680 0 +2397 3812 0 +3145 3944 0 +3478 4076 0 +3718 4095 0 +0 3139 3416 +0 3140 3416 +0 3140 3416 +0 3141 3416 +0 3141 3416 +0 3142 3416 +0 3144 3415 +0 3145 3415 +0 3147 3415 +0 3150 3415 +0 3153 3415 +0 3157 3415 +0 3163 3415 +0 3170 3415 +0 3180 3415 +0 3192 3415 +0 3209 3415 +0 3230 3415 +0 3257 3415 +0 3290 3415 +0 3331 3415 +0 3381 3415 +0 3415 3388 +0 3415 3296 +0 3415 3135 +0 3415 2748 +0 3548 0 +0 3680 0 +2408 3812 0 +3147 3944 0 +3479 4076 0 +3719 4095 0 +0 3137 3416 +0 3137 3416 +0 3138 3416 +0 3138 3416 +0 3139 3416 +0 3140 3416 +0 3141 3415 +0 3143 3415 +0 3145 3415 +0 3147 3415 +0 3151 3415 +0 3155 3415 +0 3161 3415 +0 3168 3415 +0 3178 3415 +0 3191 3415 +0 3207 3415 +0 3228 3415 +0 3255 3415 +0 3289 3415 +0 3330 3415 +0 3380 3415 +0 3415 3389 +0 3415 3297 +0 3415 3136 +0 3415 2751 +0 3547 0 +0 3680 0 +2422 3812 0 +3151 3944 0 +3480 4076 0 +3720 4095 0 +0 3134 3416 +0 3134 3416 +0 3134 3416 +0 3135 3416 +0 3135 3416 +0 3136 3416 +0 3138 3415 +0 3139 3415 +0 3141 3415 +0 3144 3415 +0 3148 3414 +0 3152 3414 +0 3158 3414 +0 3165 3414 +0 3175 3414 +0 3188 3414 +0 3205 3414 +0 3226 3414 +0 3253 3414 +0 3287 3414 +0 3329 3414 +0 3379 3414 +0 3414 3390 +0 3414 3298 +0 3414 3137 +0 3414 2754 +0 3547 0 +0 3679 0 +2441 3812 0 +3154 3944 0 +3482 4076 0 +3721 4095 0 +0 3129 3416 +0 3129 3416 +0 3130 3416 +0 3130 3416 +0 3131 3416 +0 3132 3416 +0 3133 3415 +0 3135 3415 +0 3137 3415 +0 3140 3415 +0 3144 3414 +0 3149 3414 +0 3155 3414 +0 3162 3414 +0 3172 3414 +0 3185 3414 +0 3202 3414 +0 3223 3414 +0 3250 3414 +0 3284 3414 +0 3326 3414 +0 3376 3414 +0 3414 3391 +0 3414 3299 +0 3414 3139 +0 3414 2759 +0 3547 0 +0 3679 0 +2465 3812 0 +3159 3944 0 +3485 4076 0 +3722 4095 0 +0 3123 3416 +0 3123 3416 +0 3124 3416 +0 3124 3416 +0 3125 3416 +0 3126 3416 +0 3127 3415 +0 3129 3415 +0 3131 3415 +0 3134 3415 +0 3138 3414 +0 3143 3414 +0 3150 3414 +0 3158 3414 +0 3168 3414 +0 3181 3414 +0 3198 3414 +0 3219 3414 +0 3247 3414 +0 3281 3414 +0 3323 3414 +0 3374 3414 +0 3414 3393 +0 3414 3301 +0 3414 3142 +0 3414 2765 +0 3546 0 +0 3679 0 +2494 3811 0 +3166 3944 0 +3488 4076 0 +3724 4095 0 +0 3115 3416 +0 3115 3416 +0 3115 3416 +0 3116 3416 +0 3117 3416 +0 3118 3416 +0 3119 3415 +0 3121 3415 +0 3123 3415 +0 3126 3415 +0 3130 3414 +0 3135 3414 +0 3142 3414 +0 3151 3413 +0 3162 3413 +0 3175 3413 +0 3192 3413 +0 3214 3413 +0 3242 3413 +0 3276 3413 +0 3319 3413 +0 3370 3413 +0 3413 3395 +0 3413 3304 +0 3413 3145 +0 3413 2773 +0 3546 0 +0 3678 0 +2531 3811 0 +3175 3943 0 +3492 4076 0 +3727 4095 0 +0 3104 3416 +0 3104 3416 +0 3104 3416 +0 3105 3416 +0 3106 3416 +0 3106 3416 +0 3108 3415 +0 3110 3415 +0 3112 3415 +0 3115 3415 +0 3119 3414 +0 3125 3414 +0 3132 3414 +0 3141 3413 +0 3154 3412 +0 3167 3412 +0 3184 3412 +0 3206 3412 +0 3234 3412 +0 3270 3412 +0 3313 3412 +0 3365 3412 +0 3412 3397 +0 3412 3307 +0 3412 3150 +0 3412 2784 +0 3545 0 +0 3678 0 +2576 3810 0 +3186 3943 0 +3498 4075 0 +3730 4095 0 +0 3088 3416 +0 3088 3416 +0 3089 3416 +0 3089 3416 +0 3090 3416 +0 3091 3416 +0 3093 3415 +0 3094 3415 +0 3097 3415 +0 3100 3415 +0 3104 3414 +0 3110 3414 +0 3117 3414 +0 3127 3413 +0 3140 3412 +0 3156 3410 +0 3174 3410 +0 3196 3410 +0 3225 3410 +0 3261 3410 +0 3305 3410 +0 3358 3410 +0 3410 3401 +0 3410 3311 +0 3410 3156 +0 3410 2797 +0 3544 0 +0 3677 0 +2631 3810 0 +3201 3943 0 +3505 4075 0 +3735 4095 0 +0 3067 3416 +0 3067 3416 +0 3067 3416 +0 3068 3416 +0 3069 3416 +0 3070 3416 +0 3071 3415 +0 3073 3415 +0 3076 3415 +0 3079 3415 +0 3083 3414 +0 3089 3414 +0 3097 3414 +0 3107 3413 +0 3120 3412 +0 3137 3410 +0 3159 3408 +0 3183 3408 +0 3212 3408 +0 3249 3408 +0 3294 3408 +0 3348 3408 +0 3408 3406 +0 3408 3317 +0 3408 3164 +0 3408 2815 +0 3543 0 +0 3676 0 +2694 3809 0 +3220 3942 0 +3515 4075 0 +3741 4095 0 +0 3036 3416 +0 3036 3416 +0 3037 3416 +0 3038 3416 +0 3038 3416 +0 3039 3416 +0 3041 3415 +0 3043 3415 +0 3046 3415 +0 3049 3415 +0 3054 3414 +0 3060 3414 +0 3069 3414 +0 3079 3413 +0 3093 3412 +0 3111 3410 +0 3134 3408 +0 3164 3406 +0 3194 3406 +0 3233 3406 +0 3279 3406 +0 3335 3406 +0 3400 3406 +0 3406 3325 +0 3406 3175 +0 3406 2838 +0 3541 0 +0 3675 0 +2767 3808 0 +3244 3941 0 +3528 4074 0 +3748 4095 0 +0 2992 3416 +0 2992 3416 +0 2992 3416 +0 2993 3416 +0 2994 3416 +0 2996 3416 +0 2997 3415 +0 2999 3415 +0 3002 3415 +0 3006 3415 +0 3011 3414 +0 3018 3414 +0 3027 3414 +0 3039 3413 +0 3055 3412 +0 3074 3410 +0 3099 3408 +0 3131 3406 +0 3170 3402 +0 3210 3402 +0 3259 3402 +0 3317 3402 +0 3384 3402 +0 3402 3335 +0 3402 3189 +0 3402 2866 +0 3538 0 +0 3673 0 +2850 3807 0 +3275 3940 0 +3545 4073 0 +3759 4095 0 +0 2925 3416 +0 2925 3416 +0 2926 3416 +0 2927 3416 +0 2928 3416 +0 2929 3416 +0 2931 3415 +0 2934 3415 +0 2937 3415 +0 2942 3415 +0 2947 3414 +0 2956 3414 +0 2966 3414 +0 2979 3413 +0 2997 3412 +0 3019 3410 +0 3047 3408 +0 3082 3406 +0 3125 3402 +0 3177 3398 +0 3230 3398 +0 3291 3398 +0 3362 3398 +0 3398 3348 +0 3398 3206 +0 3398 2902 +0 3535 0 +1603 3670 0 +2941 3805 0 +3313 3939 0 +3566 4072 0 +3772 4095 0 +0 2816 3416 +0 2817 3416 +0 2817 3416 +0 2818 3416 +0 2820 3416 +0 2822 3416 +0 2824 3415 +0 2827 3415 +0 2832 3415 +0 2837 3415 +0 2845 3414 +0 2855 3414 +0 2867 3414 +0 2884 3413 +0 2906 3412 +0 2933 3410 +0 2966 3408 +0 3008 3406 +0 3059 3402 +0 3118 3398 +1406 3187 3392 +1406 3255 3392 +1406 3331 3392 +1406 3392 3365 +1406 3392 3230 +1406 3392 2945 +0 3530 1621 +2388 3667 0 +3040 3802 0 +3359 3937 0 +3593 4071 0 +3790 4095 0 +0 2613 3416 +0 2614 3416 +0 2615 3416 +0 2617 3416 +0 2619 3416 +0 2621 3416 +0 2625 3415 +0 2630 3415 +0 2637 3415 +0 2646 3415 +0 2657 3414 +0 2672 3414 +0 2691 3414 +0 2715 3413 +0 2746 3412 +0 2784 3410 +0 2830 3408 +0 2886 3406 +0 2951 3402 +0 3025 3398 +1406 3108 3392 +2326 3201 3383 +2326 3286 3383 +2326 3380 3383 +2326 3383 3258 +2326 3383 2998 +1536 3524 2158 +2724 3662 0 +3145 3799 0 +3414 3934 0 +3627 4069 0 +3812 4095 0 +0 1977 3416 +0 1981 3416 +0 1986 3416 +0 1992 3416 +0 2000 3416 +0 2011 3416 +0 2026 3415 +0 2044 3415 +0 2068 3415 +0 2098 3415 +0 2135 3414 +0 2180 3414 +0 2234 3414 +0 2298 3413 +0 2371 3412 +0 2453 3410 +0 2545 3408 +0 2643 3406 +0 2749 3402 +0 2860 3398 +1406 2976 3392 +2326 3095 3383 +2676 3218 3372 +2676 3325 3372 +2676 3372 3294 +2676 3372 3060 +2459 3515 2457 +2965 3656 1663 +3256 3794 0 +3479 3931 0 +3669 4066 0 +3840 4095 0 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3415 +0 0 3415 +0 0 3415 +0 0 3415 +0 0 3414 +0 0 3414 +0 0 3414 +0 0 3413 +0 0 3412 +0 0 3410 +0 0 3408 +0 1325 3406 +0 2121 3402 +0 2458 3398 +1406 2701 3392 +2326 2900 3383 +2676 3077 3372 +2922 3239 3356 +2922 3356 3338 +2922 3356 3132 +2907 3504 2808 +3165 3648 2590 +3372 3788 1799 +3553 3926 0 +3719 4063 0 +3875 4095 0 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3416 +0 0 3415 +0 0 3415 +0 0 3415 +0 0 3415 +0 0 3414 +0 0 3414 +0 0 3414 +0 0 3413 +0 0 3412 +0 0 3410 +0 0 3408 +0 0 3406 +0 0 3402 +1484 0 3398 +2025 1406 3392 +2326 2328 3383 +2676 2774 3372 +2922 3051 3356 +3124 3267 3333 +3124 3333 3212 +3183 3488 3054 +3341 3636 2940 +3492 3780 2721 +3637 3920 1928 +3779 4058 0 +3918 4095 0 +2741 0 3416 +2741 0 3416 +2742 0 3416 +2742 0 3416 +2743 0 3416 +2744 0 3416 +2745 0 3415 +2746 0 3415 +2748 0 3415 +2751 0 3415 +2754 0 3414 +2759 0 3414 +2765 0 3414 +2773 0 3413 +2784 0 3412 +2797 0 3410 +2815 0 3408 +2838 0 3406 +2866 0 3402 +2902 0 3398 +2945 1406 3392 +2998 2326 3383 +3060 2676 3372 +3132 2922 3356 +3212 3124 3333 +3302 3302 3302 +3399 3466 3256 +3504 3620 3186 +3614 3768 3072 +3729 3912 2854 +3848 4052 2063 +3970 4095 0 +3264 0 3548 +3264 0 3548 +3264 0 3548 +3264 0 3548 +3264 0 3548 +3265 0 3548 +3265 0 3548 +3265 0 3548 +3266 0 3548 +3267 0 3547 +3268 0 3547 +3269 0 3547 +3271 0 3546 +3274 0 3546 +3278 0 3545 +3282 0 3544 +3288 0 3543 +3296 0 3541 +3307 0 3538 +3321 0 3535 +3339 0 3530 +3362 1536 3524 +3391 2457 3515 +3426 2808 3504 +3470 3054 3488 +3466 3256 3399 +3466 3344 3256 +3620 3603 3186 +3721 3768 3072 +3814 3912 2854 +3915 4052 2063 +4022 4095 0 +3558 0 3680 +3558 0 3680 +3559 0 3680 +3559 0 3680 +3559 0 3680 +3559 0 3680 +3559 0 3680 +3559 0 3680 +3560 0 3680 +3560 0 3680 +3561 0 3679 +3562 0 3679 +3563 0 3679 +3564 0 3678 +3566 0 3678 +3568 0 3677 +3572 0 3676 +3576 0 3675 +3582 0 3673 +3589 0 3670 +3599 0 3667 +3612 0 3662 +3629 1663 3656 +3648 2590 3644 +3636 2940 3589 +3620 3186 3504 +3620 3186 3315 +3620 3396 3186 +3768 3691 3072 +3908 3912 2854 +3992 4052 2063 +4084 4095 0 +3783 0 3812 +3783 0 3812 +3783 0 3812 +3783 0 3812 +3783 0 3812 +3783 0 3812 +3783 0 3812 +3784 0 3812 +3784 0 3812 +3784 0 3812 +3784 0 3812 +3785 0 3812 +3785 0 3811 +3786 0 3811 +3787 0 3810 +3789 0 3810 +3791 0 3809 +3794 0 3808 +3797 0 3807 +3802 0 3805 +3802 0 3796 +3799 0 3781 +3794 0 3759 +3788 1799 3728 +3780 2721 3682 +3768 3072 3614 +3768 3072 3473 +3768 3072 3171 +3768 3456 3072 +3912 3787 2854 +4052 4025 2063 +4095 4095 0 +3944 0 3913 +3944 0 3913 +3944 0 3913 +3944 0 3913 +3944 0 3913 +3944 0 3913 +3944 0 3913 +3944 0 3912 +3944 0 3912 +3944 0 3912 +3944 0 3911 +3944 0 3910 +3944 0 3910 +3943 0 3909 +3943 0 3907 +3943 0 3905 +3942 0 3902 +3941 0 3898 +3940 0 3893 +3939 0 3886 +3937 0 3876 +3934 0 3863 +3931 0 3845 +3926 0 3820 +3920 1928 3783 +3912 2854 3729 +3912 2854 3624 +3912 2854 3428 +3912 2854 2854 +3912 3526 2854 +4052 3890 2063 +4095 4095 0 +4076 0 3996 +4076 0 3996 +4076 0 3996 +4076 0 3995 +4076 0 3995 +4076 0 3995 +4076 0 3995 +4076 0 3995 +4076 0 3995 +4076 0 3995 +4076 0 3994 +4076 0 3994 +4076 0 3993 +4076 0 3992 +4075 0 3991 +4075 0 3989 +4075 0 3986 +4074 0 3983 +4073 0 3979 +4072 0 3973 +4071 0 3965 +4069 0 3954 +4066 0 3940 +4063 0 3919 +4058 0 3890 +4052 2063 3848 +4052 2063 3769 +4052 2063 3636 +4052 2063 3361 +4052 2689 2063 +4052 3606 2063 +4095 4000 0 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4087 +4095 0 4086 +4095 0 4086 +4095 0 4086 +4095 0 4085 +4095 0 4085 +4095 0 4084 +4095 0 4083 +4095 0 4082 +4095 0 4080 +4095 0 4077 +4095 0 4073 +4095 0 4069 +4095 0 4062 +4095 0 4054 +4095 0 4042 +4095 0 4025 +4095 0 4002 +4095 0 3970 +4095 0 3911 +4095 0 3818 +4095 0 3653 +4095 0 3253 +4095 2266 0 +4095 3695 0 +0 3278 3548 +0 3278 3548 +0 3279 3548 +0 3279 3548 +0 3279 3548 +0 3280 3548 +0 3280 3548 +0 3281 3548 +0 3283 3548 +0 3285 3548 +0 3287 3548 +0 3290 3548 +0 3294 3548 +0 3300 3548 +0 3307 3548 +0 3317 3548 +0 3329 3548 +0 3346 3548 +0 3367 3548 +0 3393 3548 +0 3426 3548 +0 3467 3548 +0 3516 3548 +0 3548 3519 +0 3548 3426 +0 3548 3264 +0 3548 2873 +0 3680 0 +0 3812 0 +2497 3944 0 +3271 4076 0 +3608 4095 0 +0 3278 3548 +0 3278 3548 +0 3278 3548 +0 3279 3548 +0 3279 3548 +0 3280 3548 +0 3280 3548 +0 3281 3548 +0 3283 3548 +0 3284 3548 +0 3287 3548 +0 3290 3548 +0 3294 3548 +0 3300 3548 +0 3307 3548 +0 3317 3548 +0 3329 3548 +0 3346 3548 +0 3367 3548 +0 3393 3548 +0 3426 3548 +0 3467 3548 +0 3516 3548 +0 3548 3519 +0 3548 3426 +0 3548 3264 +0 3548 2873 +0 3680 0 +0 3812 0 +2498 3944 0 +3272 4076 0 +3608 4095 0 +0 3278 3548 +0 3278 3548 +0 3278 3548 +0 3279 3548 +0 3279 3548 +0 3280 3548 +0 3280 3548 +0 3281 3548 +0 3282 3548 +0 3284 3548 +0 3287 3548 +0 3290 3548 +0 3294 3548 +0 3300 3548 +0 3307 3548 +0 3317 3548 +0 3329 3548 +0 3346 3548 +0 3366 3548 +0 3393 3548 +0 3426 3548 +0 3467 3548 +0 3516 3548 +0 3548 3519 +0 3548 3427 +0 3548 3264 +0 3548 2873 +0 3680 0 +0 3812 0 +2500 3944 0 +3272 4076 0 +3608 4095 0 +0 3277 3548 +0 3278 3548 +0 3278 3548 +0 3278 3548 +0 3279 3548 +0 3279 3548 +0 3280 3548 +0 3281 3548 +0 3282 3548 +0 3284 3548 +0 3286 3548 +0 3290 3548 +0 3294 3548 +0 3299 3548 +0 3307 3548 +0 3316 3548 +0 3329 3548 +0 3345 3548 +0 3366 3548 +0 3393 3548 +0 3426 3548 +0 3467 3548 +0 3516 3548 +0 3548 3519 +0 3548 3427 +0 3548 3264 +0 3548 2874 +0 3680 0 +0 3812 0 +2502 3944 0 +3272 4076 0 +3608 4095 0 +0 3277 3548 +0 3277 3548 +0 3277 3548 +0 3278 3548 +0 3278 3548 +0 3279 3548 +0 3280 3548 +0 3280 3548 +0 3282 3548 +0 3284 3548 +0 3286 3548 +0 3289 3548 +0 3293 3548 +0 3299 3548 +0 3307 3548 +0 3316 3548 +0 3329 3548 +0 3345 3548 +0 3366 3548 +0 3392 3548 +0 3426 3548 +0 3467 3548 +0 3516 3548 +0 3548 3519 +0 3548 3427 +0 3548 3264 +0 3548 2874 +0 3680 0 +0 3812 0 +2505 3944 0 +3273 4076 0 +3608 4095 0 +0 3276 3548 +0 3277 3548 +0 3277 3548 +0 3277 3548 +0 3278 3548 +0 3278 3548 +0 3279 3548 +0 3280 3548 +0 3281 3548 +0 3283 3548 +0 3286 3548 +0 3289 3548 +0 3293 3548 +0 3299 3548 +0 3306 3548 +0 3316 3548 +0 3328 3548 +0 3344 3548 +0 3365 3548 +0 3392 3548 +0 3425 3548 +0 3466 3548 +0 3516 3548 +0 3548 3519 +0 3548 3427 +0 3548 3265 +0 3548 2875 +0 3680 0 +0 3812 0 +2508 3944 0 +3273 4076 0 +3609 4095 0 +0 3276 3548 +0 3276 3548 +0 3276 3548 +0 3277 3548 +0 3277 3548 +0 3278 3548 +0 3279 3548 +0 3280 3548 +0 3281 3548 +0 3283 3548 +0 3285 3548 +0 3288 3548 +0 3292 3548 +0 3298 3548 +0 3305 3548 +0 3315 3548 +0 3328 3548 +0 3344 3548 +0 3365 3548 +0 3392 3548 +0 3425 3548 +0 3466 3548 +0 3515 3548 +0 3548 3519 +0 3548 3427 +0 3548 3265 +0 3548 2876 +0 3680 0 +0 3812 0 +2513 3944 0 +3274 4076 0 +3609 4095 0 +0 3275 3548 +0 3275 3548 +0 3275 3548 +0 3275 3548 +0 3276 3548 +0 3277 3548 +0 3278 3548 +0 3279 3548 +0 3280 3548 +0 3282 3548 +0 3284 3548 +0 3287 3548 +0 3292 3548 +0 3297 3548 +0 3305 3548 +0 3314 3548 +0 3327 3548 +0 3343 3548 +0 3364 3548 +0 3391 3548 +0 3424 3548 +0 3466 3548 +0 3515 3548 +0 3548 3520 +0 3548 3428 +0 3548 3265 +0 3548 2877 +0 3680 0 +0 3812 0 +2520 3944 0 +3276 4076 0 +3610 4095 0 +0 3273 3548 +0 3273 3548 +0 3274 3548 +0 3274 3548 +0 3275 3548 +0 3275 3548 +0 3276 3548 +0 3277 3548 +0 3279 3548 +0 3281 3548 +0 3283 3548 +0 3286 3548 +0 3291 3548 +0 3296 3548 +0 3303 3548 +0 3313 3548 +0 3326 3548 +0 3342 3548 +0 3363 3548 +0 3390 3548 +0 3423 3548 +0 3465 3548 +0 3514 3548 +0 3548 3520 +0 3548 3428 +0 3548 3266 +0 3548 2878 +0 3680 0 +0 3812 0 +2528 3944 0 +3277 4076 0 +3611 4095 0 +0 3271 3548 +0 3272 3548 +0 3272 3548 +0 3272 3548 +0 3273 3548 +0 3273 3548 +0 3274 3548 +0 3276 3548 +0 3277 3548 +0 3279 3547 +0 3282 3547 +0 3285 3547 +0 3289 3547 +0 3295 3547 +0 3302 3547 +0 3312 3547 +0 3325 3547 +0 3341 3547 +0 3362 3547 +0 3389 3547 +0 3422 3547 +0 3464 3547 +0 3513 3547 +0 3547 3520 +0 3547 3429 +0 3547 3267 +0 3547 2880 +0 3680 0 +0 3812 0 +2539 3944 0 +3279 4076 0 +3612 4095 0 +0 3269 3548 +0 3269 3548 +0 3269 3548 +0 3270 3548 +0 3270 3548 +0 3271 3548 +0 3272 3548 +0 3273 3548 +0 3275 3548 +0 3277 3547 +0 3280 3547 +0 3283 3547 +0 3287 3547 +0 3293 3547 +0 3300 3547 +0 3310 3547 +0 3323 3547 +0 3339 3547 +0 3361 3547 +0 3387 3547 +0 3421 3547 +0 3462 3547 +0 3512 3547 +0 3547 3521 +0 3547 3429 +0 3547 3268 +0 3547 2883 +0 3679 0 +0 3812 0 +2553 3944 0 +3282 4076 0 +3613 4095 0 +0 3266 3548 +0 3266 3548 +0 3266 3548 +0 3267 3548 +0 3267 3548 +0 3268 3548 +0 3269 3548 +0 3270 3548 +0 3271 3548 +0 3274 3547 +0 3277 3547 +0 3280 3547 +0 3285 3547 +0 3290 3547 +0 3298 3547 +0 3307 3547 +0 3320 3547 +0 3337 3547 +0 3358 3547 +0 3385 3547 +0 3419 3547 +0 3461 3547 +0 3511 3547 +0 3547 3522 +0 3547 3430 +0 3547 3269 +0 3547 2886 +0 3679 0 +0 3812 0 +2572 3944 0 +3286 4076 0 +3615 4095 0 +0 3261 3548 +0 3261 3548 +0 3261 3548 +0 3262 3548 +0 3262 3548 +0 3263 3548 +0 3264 3548 +0 3265 3548 +0 3267 3548 +0 3269 3547 +0 3272 3547 +0 3276 3547 +0 3281 3546 +0 3287 3546 +0 3294 3546 +0 3304 3546 +0 3317 3546 +0 3334 3546 +0 3355 3546 +0 3382 3546 +0 3416 3546 +0 3458 3546 +0 3509 3546 +0 3546 3523 +0 3546 3432 +0 3546 3271 +0 3546 2891 +0 3679 0 +0 3811 0 +2596 3944 0 +3291 4076 0 +3617 4095 0 +0 3255 3548 +0 3255 3548 +0 3256 3548 +0 3256 3548 +0 3256 3548 +0 3257 3548 +0 3258 3548 +0 3259 3548 +0 3261 3548 +0 3263 3547 +0 3266 3547 +0 3270 3547 +0 3275 3546 +0 3282 3546 +0 3290 3546 +0 3300 3546 +0 3313 3546 +0 3330 3546 +0 3351 3546 +0 3379 3546 +0 3413 3546 +0 3455 3546 +0 3506 3546 +0 3546 3525 +0 3546 3434 +0 3546 3274 +0 3546 2897 +0 3678 0 +0 3811 0 +2625 3943 0 +3297 4076 0 +3621 4095 0 +0 3247 3548 +0 3247 3548 +0 3247 3548 +0 3248 3548 +0 3248 3548 +0 3249 3548 +0 3250 3548 +0 3251 3548 +0 3253 3548 +0 3255 3547 +0 3258 3547 +0 3262 3547 +0 3268 3546 +0 3275 3546 +0 3284 3545 +0 3294 3545 +0 3307 3545 +0 3324 3545 +0 3346 3545 +0 3374 3545 +0 3408 3545 +0 3451 3545 +0 3502 3545 +0 3545 3526 +0 3545 3436 +0 3545 3278 +0 3545 2905 +0 3678 0 +0 3810 0 +2662 3943 0 +3306 4075 0 +3625 4095 0 +0 3236 3548 +0 3236 3548 +0 3236 3548 +0 3237 3548 +0 3237 3548 +0 3238 3548 +0 3239 3548 +0 3240 3548 +0 3242 3548 +0 3244 3547 +0 3247 3547 +0 3251 3547 +0 3257 3546 +0 3264 3546 +0 3273 3545 +0 3285 3544 +0 3299 3544 +0 3316 3544 +0 3339 3544 +0 3367 3544 +0 3402 3544 +0 3445 3544 +0 3497 3544 +0 3544 3529 +0 3544 3440 +0 3544 3282 +0 3544 2916 +0 3677 0 +0 3810 0 +2708 3943 0 +3318 4075 0 +3630 4095 0 +0 3220 3548 +0 3220 3548 +0 3221 3548 +0 3221 3548 +0 3222 3548 +0 3222 3548 +0 3223 3548 +0 3225 3548 +0 3226 3548 +0 3229 3547 +0 3232 3547 +0 3236 3547 +0 3242 3546 +0 3249 3546 +0 3259 3545 +0 3272 3544 +0 3288 3543 +0 3306 3543 +0 3329 3543 +0 3357 3543 +0 3393 3543 +0 3437 3543 +0 3490 3543 +0 3543 3533 +0 3543 3444 +0 3543 3288 +0 3543 2929 +0 3676 0 +0 3809 0 +2762 3942 0 +3333 4075 0 +3638 4095 0 +0 3198 3548 +0 3199 3548 +0 3199 3548 +0 3200 3548 +0 3200 3548 +0 3201 3548 +0 3202 3548 +0 3203 3548 +0 3205 3548 +0 3208 3547 +0 3211 3547 +0 3216 3547 +0 3221 3546 +0 3229 3546 +0 3239 3545 +0 3253 3544 +0 3270 3543 +0 3291 3541 +0 3315 3541 +0 3344 3541 +0 3381 3541 +0 3426 3541 +0 3480 3541 +0 3541 3538 +0 3541 3450 +0 3541 3296 +0 3541 2947 +0 3675 0 +0 3808 0 +2826 3941 0 +3351 4074 0 +3648 4095 0 +0 3168 3548 +0 3168 3548 +0 3168 3548 +0 3169 3548 +0 3170 3548 +0 3171 3548 +0 3172 3548 +0 3173 3548 +0 3175 3548 +0 3178 3547 +0 3182 3547 +0 3186 3547 +0 3192 3546 +0 3201 3546 +0 3211 3545 +0 3225 3544 +0 3243 3543 +0 3267 3541 +0 3296 3538 +0 3326 3538 +0 3365 3538 +0 3411 3538 +0 3467 3538 +0 3532 3538 +0 3538 3457 +0 3538 3307 +0 3538 2970 +0 3673 0 +0 3807 0 +2899 3940 0 +3376 4073 0 +3661 4095 0 +0 3124 3548 +0 3124 3548 +0 3124 3548 +0 3125 3548 +0 3125 3548 +0 3126 3548 +0 3128 3548 +0 3129 3548 +0 3132 3548 +0 3135 3547 +0 3138 3547 +0 3144 3547 +0 3151 3546 +0 3160 3546 +0 3171 3545 +0 3186 3544 +0 3206 3543 +0 3231 3541 +0 3263 3538 +0 3302 3535 +0 3342 3535 +0 3391 3535 +0 3449 3535 +0 3516 3535 +0 3535 3467 +0 3535 3321 +0 3535 2998 +0 3670 0 +0 3805 0 +2982 3939 0 +3407 4072 0 +3677 4095 0 +0 3056 3548 +0 3057 3548 +0 3057 3548 +0 3058 3548 +0 3059 3548 +0 3060 3548 +0 3061 3548 +0 3063 3548 +0 3066 3548 +0 3069 3547 +0 3074 3547 +0 3080 3547 +0 3087 3546 +0 3098 3546 +0 3111 3545 +0 3129 3544 +0 3151 3543 +0 3179 3541 +0 3214 3538 +0 3257 3535 +0 3309 3530 +0 3362 3530 +0 3423 3530 +0 3495 3530 +0 3530 3480 +0 3530 3339 +0 3530 3034 +0 3667 0 +1737 3802 0 +3073 3937 0 +3445 4071 0 +3699 4095 0 +0 2948 3548 +0 2948 3548 +0 2949 3548 +0 2950 3548 +0 2951 3548 +0 2952 3548 +0 2954 3548 +0 2956 3548 +0 2960 3548 +0 2964 3547 +0 2970 3547 +0 2977 3547 +0 2987 3546 +0 3000 3546 +0 3016 3545 +0 3038 3544 +0 3065 3543 +0 3099 3541 +0 3140 3538 +0 3190 3535 +0 3250 3530 +1536 3320 3524 +1536 3387 3524 +1536 3463 3524 +1536 3524 3497 +1536 3524 3362 +1536 3524 3078 +0 3662 1753 +2519 3799 0 +3172 3934 0 +3491 4069 0 +3726 4095 0 +0 2745 3548 +0 2745 3548 +0 2746 3548 +0 2747 3548 +0 2749 3548 +0 2751 3548 +0 2754 3548 +0 2758 3548 +0 2763 3548 +0 2770 3547 +0 2778 3547 +0 2790 3547 +0 2804 3546 +0 2824 3546 +0 2848 3545 +0 2879 3544 +0 2917 3543 +0 2963 3541 +0 3018 3538 +0 3083 3535 +0 3157 3530 +1536 3241 3524 +2457 3333 3515 +2457 3418 3515 +2457 3512 3515 +2457 3515 3391 +2457 3515 3130 +1663 3656 2289 +2856 3794 0 +3277 3931 0 +3546 4066 0 +3759 4095 0 +0 2104 3548 +0 2107 3548 +0 2111 3548 +0 2115 3548 +0 2122 3548 +0 2130 3548 +0 2141 3548 +0 2156 3548 +0 2174 3548 +0 2198 3547 +0 2228 3547 +0 2265 3547 +0 2311 3546 +0 2365 3546 +0 2429 3545 +0 2502 3544 +0 2585 3543 +0 2676 3541 +0 2775 3538 +0 2881 3535 +0 2992 3530 +1536 3108 3524 +2457 3227 3515 +2808 3350 3504 +2808 3457 3504 +2808 3504 3426 +2808 3504 3192 +2592 3648 2590 +3097 3788 1799 +3388 3926 0 +3611 4063 0 +3801 4095 0 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3547 +0 0 3547 +0 0 3547 +0 0 3546 +0 0 3546 +0 0 3545 +0 0 3544 +0 0 3543 +0 0 3541 +0 1477 3538 +0 2256 3535 +0 2593 3530 +1536 2833 3524 +2457 3032 3515 +2808 3209 3504 +3054 3372 3488 +3054 3488 3470 +3054 3488 3264 +3038 3636 2940 +3296 3780 2721 +3504 3920 1928 +3685 4058 0 +3851 4095 0 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3548 +0 0 3547 +0 0 3547 +0 0 3547 +0 0 3546 +0 0 3546 +0 0 3545 +0 0 3544 +0 0 3543 +0 0 3541 +0 0 3538 +0 0 3535 +1621 0 3530 +2158 1536 3524 +2457 2459 3515 +2808 2907 3504 +3054 3183 3488 +3256 3399 3466 +3256 3466 3344 +3315 3620 3186 +3473 3768 3072 +3624 3912 2854 +3769 4052 2063 +3911 4095 0 +2873 0 3548 +2873 0 3548 +2873 0 3548 +2874 0 3548 +2874 0 3548 +2875 0 3548 +2876 0 3548 +2877 0 3548 +2878 0 3548 +2880 0 3547 +2883 0 3547 +2886 0 3547 +2891 0 3546 +2897 0 3546 +2905 0 3545 +2916 0 3544 +2929 0 3543 +2947 0 3541 +2970 0 3538 +2998 0 3535 +3034 0 3530 +3078 1536 3524 +3130 2457 3515 +3192 2808 3504 +3264 3054 3488 +3344 3256 3466 +3434 3434 3434 +3531 3598 3388 +3636 3752 3318 +3746 3900 3204 +3861 4044 2986 +3980 4095 2192 +3396 0 3680 +3396 0 3680 +3396 0 3680 +3396 0 3680 +3396 0 3680 +3396 0 3680 +3396 0 3680 +3397 0 3680 +3397 0 3680 +3398 0 3680 +3399 0 3679 +3400 0 3679 +3401 0 3679 +3403 0 3678 +3406 0 3678 +3410 0 3677 +3414 0 3676 +3420 0 3675 +3429 0 3673 +3439 0 3670 +3453 0 3667 +3471 0 3662 +3494 1663 3656 +3523 2590 3648 +3558 2940 3636 +3603 3186 3620 +3598 3388 3531 +3598 3477 3388 +3752 3735 3318 +3853 3900 3204 +3947 4044 2986 +4047 4095 2192 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3691 0 3812 +3692 0 3812 +3692 0 3812 +3693 0 3812 +3694 0 3811 +3695 0 3811 +3696 0 3810 +3698 0 3810 +3700 0 3809 +3704 0 3808 +3708 0 3807 +3714 0 3805 +3721 0 3802 +3731 0 3799 +3745 0 3794 +3761 1799 3788 +3780 2721 3776 +3768 3072 3721 +3752 3318 3636 +3752 3318 3447 +3752 3528 3318 +3900 3822 3204 +4040 4044 2986 +4095 4095 2192 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3915 0 3944 +3916 0 3944 +3916 0 3944 +3916 0 3944 +3917 0 3944 +3917 0 3943 +3918 0 3943 +3920 0 3943 +3921 0 3942 +3923 0 3941 +3926 0 3940 +3929 0 3939 +3934 0 3937 +3934 0 3928 +3931 0 3913 +3926 0 3891 +3920 1928 3860 +3912 2854 3814 +3900 3204 3746 +3900 3204 3605 +3900 3204 3302 +3900 3588 3204 +4044 3919 2986 +4095 4095 2192 +4076 0 4045 +4076 0 4045 +4076 0 4045 +4076 0 4045 +4076 0 4045 +4076 0 4045 +4076 0 4045 +4076 0 4045 +4076 0 4044 +4076 0 4044 +4076 0 4044 +4076 0 4043 +4076 0 4043 +4076 0 4042 +4075 0 4041 +4075 0 4039 +4075 0 4037 +4074 0 4034 +4073 0 4030 +4072 0 4025 +4071 0 4018 +4069 0 4008 +4066 0 3995 +4063 0 3977 +4058 0 3952 +4052 2063 3915 +4044 2986 3861 +4044 2986 3755 +4044 2986 3561 +4044 2986 2987 +4044 3659 2986 +4095 4023 2192 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4087 +4095 0 4072 +4095 0 4051 +4095 0 4022 +4095 2192 3980 +4095 2192 3901 +4095 2192 3768 +4095 2192 3494 +4095 2814 2192 +4095 3738 2192 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3411 3680 +0 3411 3680 +0 3411 3680 +0 3412 3680 +0 3413 3680 +0 3414 3680 +0 3415 3680 +0 3417 3680 +0 3419 3680 +0 3422 3680 +0 3427 3680 +0 3432 3680 +0 3440 3680 +0 3449 3680 +0 3462 3680 +0 3478 3680 +0 3499 3680 +0 3525 3680 +0 3558 3680 +0 3599 3680 +0 3649 3680 +0 3680 3651 +0 3680 3558 +0 3680 3396 +0 3680 3005 +0 3812 0 +0 3944 0 +2626 4076 0 +3404 4095 0 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3411 3680 +0 3411 3680 +0 3411 3680 +0 3412 3680 +0 3413 3680 +0 3414 3680 +0 3415 3680 +0 3417 3680 +0 3419 3680 +0 3422 3680 +0 3426 3680 +0 3432 3680 +0 3439 3680 +0 3449 3680 +0 3462 3680 +0 3478 3680 +0 3499 3680 +0 3525 3680 +0 3558 3680 +0 3599 3680 +0 3649 3680 +0 3680 3651 +0 3680 3558 +0 3680 3396 +0 3680 3005 +0 3812 0 +0 3944 0 +2627 4076 0 +3404 4095 0 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3411 3680 +0 3411 3680 +0 3412 3680 +0 3413 3680 +0 3414 3680 +0 3415 3680 +0 3417 3680 +0 3419 3680 +0 3422 3680 +0 3426 3680 +0 3432 3680 +0 3439 3680 +0 3449 3680 +0 3462 3680 +0 3478 3680 +0 3499 3680 +0 3525 3680 +0 3558 3680 +0 3599 3680 +0 3649 3680 +0 3680 3651 +0 3680 3559 +0 3680 3396 +0 3680 3005 +0 3812 0 +0 3944 0 +2628 4076 0 +3404 4095 0 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3411 3680 +0 3411 3680 +0 3412 3680 +0 3412 3680 +0 3413 3680 +0 3415 3680 +0 3416 3680 +0 3419 3680 +0 3422 3680 +0 3426 3680 +0 3432 3680 +0 3439 3680 +0 3449 3680 +0 3461 3680 +0 3478 3680 +0 3499 3680 +0 3525 3680 +0 3558 3680 +0 3599 3680 +0 3649 3680 +0 3680 3651 +0 3680 3559 +0 3680 3396 +0 3680 3006 +0 3812 0 +0 3944 0 +2630 4076 0 +3405 4095 0 +0 3409 3680 +0 3409 3680 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3411 3680 +0 3411 3680 +0 3412 3680 +0 3413 3680 +0 3414 3680 +0 3416 3680 +0 3419 3680 +0 3422 3680 +0 3426 3680 +0 3431 3680 +0 3439 3680 +0 3448 3680 +0 3461 3680 +0 3478 3680 +0 3498 3680 +0 3525 3680 +0 3558 3680 +0 3599 3680 +0 3648 3680 +0 3680 3651 +0 3680 3559 +0 3680 3396 +0 3680 3006 +0 3812 0 +0 3944 0 +2632 4076 0 +3405 4095 0 +0 3409 3680 +0 3409 3680 +0 3409 3680 +0 3410 3680 +0 3410 3680 +0 3410 3680 +0 3411 3680 +0 3412 3680 +0 3413 3680 +0 3414 3680 +0 3416 3680 +0 3418 3680 +0 3421 3680 +0 3426 3680 +0 3431 3680 +0 3438 3680 +0 3448 3680 +0 3461 3680 +0 3477 3680 +0 3498 3680 +0 3525 3680 +0 3558 3680 +0 3599 3680 +0 3648 3680 +0 3680 3651 +0 3680 3559 +0 3680 3396 +0 3680 3006 +0 3812 0 +0 3944 0 +2635 4076 0 +3405 4095 0 +0 3408 3680 +0 3408 3680 +0 3409 3680 +0 3409 3680 +0 3409 3680 +0 3410 3680 +0 3411 3680 +0 3411 3680 +0 3412 3680 +0 3414 3680 +0 3415 3680 +0 3418 3680 +0 3421 3680 +0 3425 3680 +0 3431 3680 +0 3438 3680 +0 3448 3680 +0 3460 3680 +0 3477 3680 +0 3497 3680 +0 3524 3680 +0 3557 3680 +0 3598 3680 +0 3648 3680 +0 3680 3651 +0 3680 3559 +0 3680 3396 +0 3680 3007 +0 3812 0 +0 3944 0 +2639 4076 0 +3406 4095 0 +0 3408 3680 +0 3408 3680 +0 3408 3680 +0 3408 3680 +0 3409 3680 +0 3409 3680 +0 3410 3680 +0 3411 3680 +0 3412 3680 +0 3413 3680 +0 3415 3680 +0 3417 3680 +0 3420 3680 +0 3425 3680 +0 3430 3680 +0 3437 3680 +0 3447 3680 +0 3460 3680 +0 3476 3680 +0 3497 3680 +0 3524 3680 +0 3557 3680 +0 3598 3680 +0 3648 3680 +0 3680 3652 +0 3680 3559 +0 3680 3397 +0 3680 3008 +0 3812 0 +0 3944 0 +2644 4076 0 +3407 4095 0 +0 3406 3680 +0 3407 3680 +0 3407 3680 +0 3407 3680 +0 3408 3680 +0 3408 3680 +0 3409 3680 +0 3410 3680 +0 3411 3680 +0 3412 3680 +0 3414 3680 +0 3416 3680 +0 3420 3680 +0 3424 3680 +0 3429 3680 +0 3437 3680 +0 3446 3680 +0 3459 3680 +0 3475 3680 +0 3496 3680 +0 3523 3680 +0 3556 3680 +0 3597 3680 +0 3647 3680 +0 3680 3652 +0 3680 3560 +0 3680 3397 +0 3680 3009 +0 3812 0 +0 3944 0 +2650 4076 0 +3408 4095 0 +0 3405 3680 +0 3405 3680 +0 3405 3680 +0 3406 3680 +0 3406 3680 +0 3407 3680 +0 3407 3680 +0 3408 3680 +0 3409 3680 +0 3411 3680 +0 3413 3680 +0 3415 3680 +0 3418 3680 +0 3423 3680 +0 3428 3680 +0 3436 3680 +0 3445 3680 +0 3458 3680 +0 3475 3680 +0 3495 3680 +0 3522 3680 +0 3556 3680 +0 3597 3680 +0 3646 3680 +0 3680 3652 +0 3680 3560 +0 3680 3398 +0 3680 3011 +0 3812 0 +0 3944 0 +2659 4076 0 +3410 4095 0 +0 3403 3680 +0 3403 3680 +0 3404 3680 +0 3404 3680 +0 3404 3680 +0 3405 3680 +0 3406 3680 +0 3406 3680 +0 3408 3680 +0 3409 3680 +0 3411 3679 +0 3414 3679 +0 3417 3679 +0 3421 3679 +0 3427 3679 +0 3434 3679 +0 3444 3679 +0 3457 3679 +0 3473 3679 +0 3494 3679 +0 3521 3679 +0 3554 3679 +0 3596 3679 +0 3646 3679 +0 3679 3653 +0 3679 3561 +0 3679 3399 +0 3679 3013 +0 3812 0 +0 3944 0 +2670 4076 0 +3412 4095 0 +0 3401 3680 +0 3401 3680 +0 3401 3680 +0 3401 3680 +0 3402 3680 +0 3402 3680 +0 3403 3680 +0 3404 3680 +0 3405 3680 +0 3407 3680 +0 3409 3679 +0 3412 3679 +0 3415 3679 +0 3419 3679 +0 3425 3679 +0 3432 3679 +0 3442 3679 +0 3455 3679 +0 3472 3679 +0 3493 3679 +0 3520 3679 +0 3553 3679 +0 3595 3679 +0 3644 3679 +0 3679 3653 +0 3679 3562 +0 3679 3400 +0 3679 3015 +0 3812 0 +0 3944 0 +2684 4076 0 +3415 4095 0 +0 3398 3680 +0 3398 3680 +0 3398 3680 +0 3398 3680 +0 3399 3680 +0 3399 3680 +0 3400 3680 +0 3401 3680 +0 3402 3680 +0 3404 3680 +0 3406 3679 +0 3409 3679 +0 3413 3679 +0 3417 3679 +0 3422 3679 +0 3430 3679 +0 3440 3679 +0 3453 3679 +0 3469 3679 +0 3490 3679 +0 3517 3679 +0 3551 3679 +0 3593 3679 +0 3643 3679 +0 3679 3654 +0 3679 3563 +0 3679 3401 +0 3679 3018 +0 3811 0 +0 3944 0 +2703 4076 0 +3419 4095 0 +0 3393 3680 +0 3393 3680 +0 3393 3680 +0 3394 3680 +0 3394 3680 +0 3395 3680 +0 3395 3680 +0 3396 3680 +0 3397 3680 +0 3399 3680 +0 3401 3679 +0 3404 3679 +0 3408 3679 +0 3413 3678 +0 3419 3678 +0 3426 3678 +0 3436 3678 +0 3449 3678 +0 3466 3678 +0 3488 3678 +0 3515 3678 +0 3548 3678 +0 3590 3678 +0 3641 3678 +0 3678 3655 +0 3678 3564 +0 3678 3403 +0 3678 3023 +0 3811 0 +0 3943 0 +2726 4076 0 +3424 4095 0 +0 3387 3680 +0 3387 3680 +0 3387 3680 +0 3388 3680 +0 3388 3680 +0 3388 3680 +0 3389 3680 +0 3390 3680 +0 3392 3680 +0 3393 3680 +0 3395 3679 +0 3398 3679 +0 3402 3679 +0 3407 3678 +0 3414 3678 +0 3422 3678 +0 3432 3678 +0 3445 3678 +0 3462 3678 +0 3483 3678 +0 3511 3678 +0 3545 3678 +0 3587 3678 +0 3638 3678 +0 3678 3657 +0 3678 3566 +0 3678 3406 +0 3678 3029 +0 3810 0 +0 3943 0 +2756 4075 0 +3430 4095 0 +0 3379 3680 +0 3379 3680 +0 3379 3680 +0 3379 3680 +0 3380 3680 +0 3380 3680 +0 3381 3680 +0 3382 3680 +0 3383 3680 +0 3385 3680 +0 3387 3679 +0 3390 3679 +0 3394 3679 +0 3400 3678 +0 3407 3678 +0 3416 3677 +0 3426 3677 +0 3439 3677 +0 3456 3677 +0 3478 3677 +0 3506 3677 +0 3540 3677 +0 3583 3677 +0 3634 3677 +0 3677 3659 +0 3677 3568 +0 3677 3410 +0 3677 3037 +0 3810 0 +0 3943 0 +2793 4075 0 +3439 4095 0 +0 3367 3680 +0 3368 3680 +0 3368 3680 +0 3368 3680 +0 3369 3680 +0 3369 3680 +0 3370 3680 +0 3371 3680 +0 3372 3680 +0 3374 3680 +0 3376 3679 +0 3379 3679 +0 3384 3679 +0 3389 3678 +0 3396 3678 +0 3405 3677 +0 3418 3676 +0 3431 3676 +0 3448 3676 +0 3471 3676 +0 3499 3676 +0 3534 3676 +0 3577 3676 +0 3629 3676 +0 3676 3662 +0 3676 3572 +0 3676 3414 +0 3676 3048 +0 3809 0 +0 3942 0 +2839 4075 0 +3450 4095 0 +0 3352 3680 +0 3352 3680 +0 3353 3680 +0 3353 3680 +0 3353 3680 +0 3354 3680 +0 3354 3680 +0 3356 3680 +0 3357 3680 +0 3359 3680 +0 3361 3679 +0 3364 3679 +0 3368 3679 +0 3374 3678 +0 3381 3678 +0 3391 3677 +0 3404 3676 +0 3420 3675 +0 3438 3675 +0 3461 3675 +0 3490 3675 +0 3525 3675 +0 3569 3675 +0 3622 3675 +0 3675 3665 +0 3675 3576 +0 3675 3420 +0 3675 3061 +0 3808 0 +0 3941 0 +2893 4074 0 +3465 4095 0 +0 3330 3680 +0 3331 3680 +0 3331 3680 +0 3331 3680 +0 3332 3680 +0 3332 3680 +0 3333 3680 +0 3334 3680 +0 3336 3680 +0 3337 3680 +0 3340 3679 +0 3343 3679 +0 3348 3679 +0 3354 3678 +0 3361 3678 +0 3371 3677 +0 3385 3676 +0 3402 3675 +0 3423 3673 +0 3447 3673 +0 3477 3673 +0 3513 3673 +0 3558 3673 +0 3612 3673 +0 3673 3670 +0 3673 3582 +0 3673 3429 +0 3673 3079 +0 3807 0 +0 3940 0 +2957 4073 0 +3484 4095 0 +0 3300 3680 +0 3300 3680 +0 3300 3680 +0 3301 3680 +0 3301 3680 +0 3302 3680 +0 3303 3680 +0 3304 3680 +0 3305 3680 +0 3307 3680 +0 3310 3679 +0 3314 3679 +0 3318 3679 +0 3325 3678 +0 3333 3678 +0 3344 3677 +0 3358 3676 +0 3376 3675 +0 3399 3673 +0 3428 3670 +0 3459 3670 +0 3497 3670 +0 3543 3670 +0 3599 3670 +0 3664 3670 +0 3670 3589 +0 3670 3439 +0 3670 3102 +0 3805 0 +0 3939 0 +3031 4072 0 +3509 4095 0 +0 3255 3680 +0 3256 3680 +0 3256 3680 +0 3256 3680 +0 3257 3680 +0 3258 3680 +0 3258 3680 +0 3260 3680 +0 3261 3680 +0 3264 3680 +0 3267 3679 +0 3271 3679 +0 3276 3679 +0 3282 3678 +0 3291 3678 +0 3303 3677 +0 3319 3676 +0 3338 3675 +0 3363 3673 +0 3395 3670 +0 3434 3667 +0 3474 3667 +0 3523 3667 +0 3581 3667 +0 3648 3667 +0 3667 3599 +0 3667 3453 +0 3667 3131 +0 3802 0 +0 3937 0 +3113 4071 0 +3539 4095 0 +0 3188 3680 +0 3188 3680 +0 3189 3680 +0 3189 3680 +0 3190 3680 +0 3191 3680 +0 3192 3680 +0 3193 3680 +0 3195 3680 +0 3198 3680 +0 3201 3679 +0 3206 3679 +0 3212 3679 +0 3220 3678 +0 3230 3678 +0 3243 3677 +0 3261 3676 +0 3283 3675 +0 3311 3673 +0 3346 3670 +0 3389 3667 +0 3441 3662 +0 3494 3662 +0 3555 3662 +0 3626 3662 +0 3662 3612 +0 3662 3471 +0 3662 3166 +0 3799 0 +1863 3934 0 +3205 4069 0 +3577 4095 0 +0 3080 3680 +0 3080 3680 +0 3081 3680 +0 3081 3680 +0 3082 3680 +0 3083 3680 +0 3084 3680 +0 3086 3680 +0 3089 3680 +0 3092 3680 +0 3096 3679 +0 3102 3679 +0 3110 3679 +0 3119 3678 +0 3132 3678 +0 3149 3677 +0 3170 3676 +0 3197 3675 +0 3231 3673 +0 3273 3670 +0 3323 3667 +0 3382 3662 +1663 3452 3656 +1663 3519 3656 +1663 3595 3656 +1663 3656 3629 +1663 3656 3494 +1663 3656 3210 +0 3794 1884 +2650 3931 0 +3303 4066 0 +3623 4095 0 +0 2876 3680 +0 2877 3680 +0 2877 3680 +0 2878 3680 +0 2879 3680 +0 2881 3680 +0 2883 3680 +0 2886 3680 +0 2890 3680 +0 2895 3680 +0 2901 3679 +0 2910 3679 +0 2922 3679 +0 2936 3678 +0 2955 3678 +0 2980 3677 +0 3010 3676 +0 3048 3675 +0 3095 3673 +0 3150 3670 +0 3215 3667 +0 3289 3662 +1663 3373 3656 +2590 3465 3648 +2590 3550 3648 +2590 3644 3648 +2590 3648 3523 +2590 3648 3262 +1799 3788 2422 +2988 3926 0 +3409 4063 0 +3679 4095 0 +0 2237 3680 +0 2239 3680 +0 2242 3680 +0 2246 3680 +0 2251 3680 +0 2257 3680 +0 2266 3680 +0 2277 3680 +0 2291 3680 +0 2310 3680 +0 2333 3679 +0 2363 3679 +0 2400 3679 +0 2445 3678 +0 2499 3678 +0 2562 3677 +0 2636 3676 +0 2718 3675 +0 2809 3673 +0 2908 3670 +0 3014 3667 +0 3125 3662 +1663 3240 3656 +2590 3360 3648 +2940 3482 3636 +2940 3589 3636 +2940 3636 3558 +2940 3636 3324 +2722 3780 2721 +3229 3920 1928 +3520 4058 0 +3743 4095 0 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3679 +0 0 3679 +0 0 3679 +0 0 3678 +0 0 3678 +0 0 3677 +0 0 3676 +0 0 3675 +0 0 3673 +0 1603 3670 +0 2388 3667 +0 2724 3662 +1663 2965 3656 +2590 3165 3648 +2940 3341 3636 +3186 3504 3620 +3186 3620 3603 +3186 3620 3396 +3171 3768 3072 +3428 3912 2854 +3636 4052 2063 +3818 4095 0 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3680 +0 0 3679 +0 0 3679 +0 0 3679 +0 0 3678 +0 0 3678 +0 0 3677 +0 0 3676 +0 0 3675 +0 0 3673 +0 0 3670 +0 0 3667 +1753 0 3662 +2289 1663 3656 +2590 2592 3648 +2940 3038 3636 +3186 3315 3620 +3388 3531 3598 +3388 3598 3477 +3447 3752 3318 +3605 3900 3204 +3755 4044 2986 +3901 4095 2192 +3005 0 3680 +3005 0 3680 +3005 0 3680 +3006 0 3680 +3006 0 3680 +3006 0 3680 +3007 0 3680 +3008 0 3680 +3009 0 3680 +3011 0 3680 +3013 0 3679 +3015 0 3679 +3018 0 3679 +3023 0 3678 +3029 0 3678 +3037 0 3677 +3048 0 3676 +3061 0 3675 +3079 0 3673 +3102 0 3670 +3131 0 3667 +3166 0 3662 +3210 1663 3656 +3262 2590 3648 +3324 2940 3636 +3396 3186 3620 +3477 3388 3598 +3566 3566 3566 +3664 3730 3520 +3768 3884 3450 +3878 4032 3336 +3993 4095 3118 +3528 0 3812 +3528 0 3812 +3528 0 3812 +3528 0 3812 +3528 0 3812 +3528 0 3812 +3528 0 3812 +3529 0 3812 +3529 0 3812 +3530 0 3812 +3530 0 3812 +3531 0 3812 +3532 0 3811 +3534 0 3811 +3536 0 3810 +3538 0 3810 +3542 0 3809 +3546 0 3808 +3552 0 3807 +3561 0 3805 +3571 0 3802 +3585 0 3799 +3603 0 3794 +3626 1799 3788 +3655 2721 3780 +3691 3072 3768 +3735 3318 3752 +3730 3520 3664 +3730 3609 3520 +3884 3867 3450 +3986 4032 3336 +4079 4095 3118 +3822 0 3944 +3822 0 3944 +3822 0 3944 +3823 0 3944 +3823 0 3944 +3823 0 3944 +3823 0 3944 +3823 0 3944 +3823 0 3944 +3824 0 3944 +3824 0 3944 +3824 0 3944 +3825 0 3944 +3826 0 3943 +3827 0 3943 +3828 0 3943 +3830 0 3942 +3832 0 3941 +3836 0 3940 +3840 0 3939 +3846 0 3937 +3853 0 3934 +3863 0 3931 +3877 0 3926 +3893 1928 3920 +3912 2854 3908 +3900 3204 3853 +3884 3450 3768 +3884 3450 3579 +3884 3660 3450 +4032 3955 3336 +4095 4095 3118 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4047 0 4076 +4048 0 4076 +4048 0 4076 +4048 0 4076 +4049 0 4076 +4049 0 4075 +4050 0 4075 +4051 0 4075 +4053 0 4074 +4055 0 4073 +4058 0 4072 +4061 0 4071 +4066 0 4069 +4066 0 4060 +4063 0 4045 +4058 0 4023 +4052 2063 3992 +4044 2986 3947 +4032 3336 3878 +4032 3336 3737 +4032 3336 3435 +4032 3720 3336 +4095 4051 3118 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4084 +4095 2192 4047 +4095 3118 3993 +4095 3118 3888 +4095 3118 3693 +4095 3118 3121 +4095 3791 3118 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3544 3812 +0 3545 3812 +0 3546 3812 +0 3547 3812 +0 3549 3812 +0 3552 3812 +0 3554 3812 +0 3559 3812 +0 3564 3812 +0 3572 3812 +0 3581 3812 +0 3594 3812 +0 3610 3812 +0 3631 3812 +0 3657 3812 +0 3691 3812 +0 3732 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3137 +0 3944 0 +0 4076 0 +2761 4095 0 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3544 3812 +0 3545 3812 +0 3546 3812 +0 3547 3812 +0 3549 3812 +0 3551 3812 +0 3554 3812 +0 3559 3812 +0 3564 3812 +0 3572 3812 +0 3581 3812 +0 3594 3812 +0 3610 3812 +0 3631 3812 +0 3657 3812 +0 3691 3812 +0 3731 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3137 +0 3944 0 +0 4076 0 +2762 4095 0 +0 3542 3812 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3545 3812 +0 3546 3812 +0 3547 3812 +0 3549 3812 +0 3551 3812 +0 3554 3812 +0 3559 3812 +0 3564 3812 +0 3572 3812 +0 3581 3812 +0 3594 3812 +0 3610 3812 +0 3631 3812 +0 3657 3812 +0 3690 3812 +0 3731 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3137 +0 3944 0 +0 4076 0 +2762 4095 0 +0 3542 3812 +0 3542 3812 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3545 3812 +0 3545 3812 +0 3547 3812 +0 3549 3812 +0 3551 3812 +0 3554 3812 +0 3558 3812 +0 3564 3812 +0 3571 3812 +0 3581 3812 +0 3594 3812 +0 3610 3812 +0 3631 3812 +0 3657 3812 +0 3690 3812 +0 3731 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3138 +0 3944 0 +0 4076 0 +2764 4095 0 +0 3541 3812 +0 3542 3812 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3544 3812 +0 3545 3812 +0 3547 3812 +0 3549 3812 +0 3551 3812 +0 3554 3812 +0 3558 3812 +0 3564 3812 +0 3571 3812 +0 3581 3812 +0 3594 3812 +0 3610 3812 +0 3631 3812 +0 3657 3812 +0 3690 3812 +0 3731 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3138 +0 3944 0 +0 4076 0 +2765 4095 0 +0 3541 3812 +0 3541 3812 +0 3541 3812 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3545 3812 +0 3547 3812 +0 3548 3812 +0 3551 3812 +0 3554 3812 +0 3558 3812 +0 3564 3812 +0 3571 3812 +0 3581 3812 +0 3593 3812 +0 3609 3812 +0 3630 3812 +0 3657 3812 +0 3690 3812 +0 3731 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3138 +0 3944 0 +0 4076 0 +2767 4095 0 +0 3541 3812 +0 3541 3812 +0 3541 3812 +0 3541 3812 +0 3542 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3545 3812 +0 3546 3812 +0 3548 3812 +0 3550 3812 +0 3553 3812 +0 3558 3812 +0 3563 3812 +0 3571 3812 +0 3580 3812 +0 3593 3812 +0 3609 3812 +0 3630 3812 +0 3657 3812 +0 3690 3812 +0 3731 3812 +0 3781 3812 +0 3812 3783 +0 3812 3691 +0 3812 3528 +0 3812 3139 +0 3944 0 +0 4076 0 +2770 4095 0 +0 3540 3812 +0 3540 3812 +0 3541 3812 +0 3541 3812 +0 3541 3812 +0 3541 3812 +0 3542 3812 +0 3543 3812 +0 3543 3812 +0 3544 3812 +0 3546 3812 +0 3548 3812 +0 3550 3812 +0 3553 3812 +0 3557 3812 +0 3563 3812 +0 3570 3812 +0 3580 3812 +0 3593 3812 +0 3609 3812 +0 3630 3812 +0 3656 3812 +0 3690 3812 +0 3730 3812 +0 3780 3812 +0 3812 3784 +0 3812 3691 +0 3812 3529 +0 3812 3139 +0 3944 0 +0 4076 0 +2773 4095 0 +0 3540 3812 +0 3540 3812 +0 3540 3812 +0 3540 3812 +0 3540 3812 +0 3541 3812 +0 3541 3812 +0 3542 3812 +0 3543 3812 +0 3544 3812 +0 3545 3812 +0 3547 3812 +0 3549 3812 +0 3552 3812 +0 3557 3812 +0 3562 3812 +0 3570 3812 +0 3579 3812 +0 3592 3812 +0 3608 3812 +0 3629 3812 +0 3656 3812 +0 3689 3812 +0 3730 3812 +0 3780 3812 +0 3812 3784 +0 3812 3691 +0 3812 3529 +0 3812 3140 +0 3944 0 +0 4076 0 +2778 4095 0 +0 3538 3812 +0 3538 3812 +0 3539 3812 +0 3539 3812 +0 3539 3812 +0 3540 3812 +0 3540 3812 +0 3541 3812 +0 3542 3812 +0 3543 3812 +0 3544 3812 +0 3546 3812 +0 3548 3812 +0 3552 3812 +0 3556 3812 +0 3562 3812 +0 3569 3812 +0 3579 3812 +0 3591 3812 +0 3607 3812 +0 3629 3812 +0 3655 3812 +0 3689 3812 +0 3729 3812 +0 3779 3812 +0 3812 3784 +0 3812 3692 +0 3812 3530 +0 3812 3141 +0 3944 0 +0 4076 0 +2785 4095 0 +0 3537 3812 +0 3537 3812 +0 3537 3812 +0 3538 3812 +0 3538 3812 +0 3538 3812 +0 3539 3812 +0 3540 3812 +0 3540 3812 +0 3541 3812 +0 3543 3812 +0 3545 3812 +0 3547 3812 +0 3551 3812 +0 3555 3812 +0 3561 3812 +0 3568 3812 +0 3577 3812 +0 3590 3812 +0 3606 3812 +0 3628 3812 +0 3654 3812 +0 3688 3812 +0 3729 3812 +0 3778 3812 +0 3812 3784 +0 3812 3692 +0 3812 3530 +0 3812 3143 +0 3944 0 +0 4076 0 +2793 4095 0 +0 3535 3812 +0 3536 3812 +0 3536 3812 +0 3536 3812 +0 3536 3812 +0 3537 3812 +0 3537 3812 +0 3538 3812 +0 3538 3812 +0 3540 3812 +0 3541 3812 +0 3544 3812 +0 3546 3812 +0 3549 3812 +0 3553 3812 +0 3559 3812 +0 3566 3812 +0 3576 3812 +0 3589 3812 +0 3605 3812 +0 3626 3812 +0 3653 3812 +0 3687 3812 +0 3728 3812 +0 3777 3812 +0 3812 3785 +0 3812 3693 +0 3812 3531 +0 3812 3145 +0 3944 0 +0 4076 0 +2804 4095 0 +0 3533 3812 +0 3533 3812 +0 3533 3812 +0 3533 3812 +0 3534 3812 +0 3534 3812 +0 3534 3812 +0 3535 3812 +0 3536 3812 +0 3537 3812 +0 3539 3812 +0 3541 3812 +0 3544 3811 +0 3547 3811 +0 3552 3811 +0 3557 3811 +0 3564 3811 +0 3574 3811 +0 3587 3811 +0 3604 3811 +0 3625 3811 +0 3652 3811 +0 3685 3811 +0 3727 3811 +0 3777 3811 +0 3811 3785 +0 3811 3694 +0 3811 3532 +0 3811 3147 +0 3944 0 +0 4076 0 +2818 4095 0 +0 3530 3812 +0 3530 3812 +0 3530 3812 +0 3530 3812 +0 3530 3812 +0 3531 3812 +0 3531 3812 +0 3532 3812 +0 3533 3812 +0 3534 3812 +0 3536 3812 +0 3538 3812 +0 3541 3811 +0 3545 3811 +0 3549 3811 +0 3554 3811 +0 3562 3811 +0 3572 3811 +0 3585 3811 +0 3601 3811 +0 3622 3811 +0 3650 3811 +0 3683 3811 +0 3725 3811 +0 3775 3811 +0 3811 3786 +0 3811 3695 +0 3811 3534 +0 3811 3151 +0 3943 0 +0 4076 0 +2837 4095 0 +0 3525 3812 +0 3525 3812 +0 3525 3812 +0 3526 3812 +0 3526 3812 +0 3526 3812 +0 3527 3812 +0 3528 3812 +0 3528 3812 +0 3530 3812 +0 3531 3812 +0 3533 3812 +0 3536 3811 +0 3540 3811 +0 3545 3810 +0 3551 3810 +0 3559 3810 +0 3569 3810 +0 3582 3810 +0 3598 3810 +0 3620 3810 +0 3647 3810 +0 3680 3810 +0 3722 3810 +0 3773 3810 +0 3810 3787 +0 3810 3696 +0 3810 3536 +0 3810 3155 +0 3943 0 +0 4075 0 +2861 4095 0 +0 3519 3812 +0 3519 3812 +0 3519 3812 +0 3520 3812 +0 3520 3812 +0 3520 3812 +0 3521 3812 +0 3521 3812 +0 3522 3812 +0 3523 3812 +0 3525 3812 +0 3528 3812 +0 3530 3811 +0 3534 3811 +0 3540 3810 +0 3547 3810 +0 3554 3810 +0 3564 3810 +0 3577 3810 +0 3594 3810 +0 3616 3810 +0 3643 3810 +0 3677 3810 +0 3719 3810 +0 3770 3810 +0 3810 3789 +0 3810 3698 +0 3810 3538 +0 3810 3161 +0 3943 0 +0 4075 0 +2890 4095 0 +0 3511 3812 +0 3511 3812 +0 3511 3812 +0 3511 3812 +0 3511 3812 +0 3512 3812 +0 3513 3812 +0 3513 3812 +0 3514 3812 +0 3515 3812 +0 3517 3812 +0 3520 3812 +0 3522 3811 +0 3526 3811 +0 3532 3810 +0 3539 3810 +0 3548 3809 +0 3558 3809 +0 3571 3809 +0 3588 3809 +0 3610 3809 +0 3638 3809 +0 3672 3809 +0 3715 3809 +0 3766 3809 +0 3809 3791 +0 3809 3700 +0 3809 3542 +0 3809 3169 +0 3942 0 +0 4075 0 +2927 4095 0 +0 3499 3812 +0 3499 3812 +0 3500 3812 +0 3500 3812 +0 3500 3812 +0 3501 3812 +0 3501 3812 +0 3502 3812 +0 3503 3812 +0 3504 3812 +0 3506 3812 +0 3508 3812 +0 3511 3811 +0 3516 3811 +0 3521 3810 +0 3528 3810 +0 3537 3809 +0 3550 3808 +0 3563 3808 +0 3581 3808 +0 3603 3808 +0 3631 3808 +0 3666 3808 +0 3709 3808 +0 3761 3808 +0 3808 3794 +0 3808 3704 +0 3808 3546 +0 3808 3180 +0 3941 0 +0 4074 0 +2973 4095 0 +0 3484 3812 +0 3484 3812 +0 3484 3812 +0 3485 3812 +0 3485 3812 +0 3485 3812 +0 3486 3812 +0 3487 3812 +0 3488 3812 +0 3489 3812 +0 3491 3812 +0 3493 3812 +0 3496 3811 +0 3501 3811 +0 3506 3810 +0 3514 3810 +0 3523 3809 +0 3536 3808 +0 3552 3807 +0 3570 3807 +0 3593 3807 +0 3622 3807 +0 3657 3807 +0 3701 3807 +0 3754 3807 +0 3807 3797 +0 3807 3708 +0 3807 3552 +0 3807 3194 +0 3940 0 +0 4073 0 +3027 4095 0 +0 3462 3812 +0 3462 3812 +0 3463 3812 +0 3463 3812 +0 3463 3812 +0 3464 3812 +0 3464 3812 +0 3465 3812 +0 3466 3812 +0 3468 3812 +0 3469 3812 +0 3472 3812 +0 3475 3811 +0 3480 3811 +0 3486 3810 +0 3493 3810 +0 3503 3809 +0 3517 3808 +0 3534 3807 +0 3556 3805 +0 3579 3805 +0 3609 3805 +0 3646 3805 +0 3690 3805 +0 3744 3805 +0 3805 3802 +0 3805 3714 +0 3805 3561 +0 3805 3211 +0 3939 0 +0 4072 0 +3090 4095 0 +0 3432 3812 +0 3432 3812 +0 3432 3812 +0 3432 3812 +0 3433 3812 +0 3433 3812 +0 3434 3812 +0 3435 3812 +0 3436 3812 +0 3437 3812 +0 3439 3812 +0 3442 3812 +0 3446 3811 +0 3450 3811 +0 3457 3810 +0 3465 3810 +0 3475 3809 +0 3490 3808 +0 3508 3807 +0 3531 3805 +0 3560 3802 +0 3591 3802 +0 3629 3802 +0 3676 3802 +0 3731 3802 +0 3796 3802 +0 3802 3721 +0 3802 3571 +0 3802 3234 +0 3937 0 +0 4071 0 +3164 4095 0 +0 3387 3812 +0 3388 3812 +0 3388 3812 +0 3388 3812 +0 3388 3812 +0 3389 3812 +0 3390 3812 +0 3391 3812 +0 3392 3812 +0 3394 3812 +0 3396 3812 +0 3399 3812 +0 3403 3811 +0 3408 3811 +0 3415 3810 +0 3424 3810 +0 3435 3809 +0 3451 3808 +0 3470 3807 +0 3495 3805 +0 3527 3802 +0 3566 3799 +0 3606 3799 +0 3655 3799 +0 3713 3799 +0 3781 3799 +0 3799 3731 +0 3799 3585 +0 3799 3262 +0 3934 0 +0 4069 0 +3246 4095 0 +0 3320 3812 +0 3321 3812 +0 3321 3812 +0 3321 3812 +0 3322 3812 +0 3322 3812 +0 3323 3812 +0 3324 3812 +0 3326 3812 +0 3328 3812 +0 3330 3812 +0 3333 3812 +0 3338 3811 +0 3344 3811 +0 3352 3810 +0 3362 3810 +0 3376 3809 +0 3393 3808 +0 3415 3807 +0 3443 3805 +0 3479 3802 +0 3522 3799 +0 3574 3794 +0 3626 3794 +0 3687 3794 +0 3759 3794 +0 3794 3745 +0 3794 3603 +0 3794 3298 +0 3931 0 +1985 4066 0 +3337 4095 0 +0 3211 3812 +0 3212 3812 +0 3212 3812 +0 3213 3812 +0 3213 3812 +0 3214 3812 +0 3215 3812 +0 3216 3812 +0 3218 3812 +0 3221 3812 +0 3224 3812 +0 3228 3812 +0 3234 3811 +0 3241 3811 +0 3251 3810 +0 3264 3810 +0 3281 3809 +0 3302 3808 +0 3329 3807 +0 3363 3805 +0 3405 3802 +0 3455 3799 +0 3515 3794 +1799 3584 3788 +1799 3651 3788 +1799 3728 3788 +1799 3788 3761 +1799 3788 3626 +1799 3788 3342 +0 3926 2023 +2781 4063 0 +3436 4095 0 +0 3008 3812 +0 3009 3812 +0 3009 3812 +0 3010 3812 +0 3011 3812 +0 3012 3812 +0 3014 3812 +0 3016 3812 +0 3019 3812 +0 3023 3812 +0 3027 3812 +0 3034 3812 +0 3043 3811 +0 3054 3811 +0 3069 3810 +0 3088 3810 +0 3112 3809 +0 3143 3808 +0 3181 3807 +0 3227 3805 +0 3282 3802 +0 3347 3799 +0 3421 3794 +1799 3505 3788 +2721 3597 3780 +2721 3682 3780 +2721 3776 3780 +2721 3780 3655 +2721 3780 3394 +1928 3920 2556 +3119 4058 0 +3541 4095 0 +0 2367 3812 +0 2369 3812 +0 2371 3812 +0 2374 3812 +0 2377 3812 +0 2382 3812 +0 2389 3812 +0 2397 3812 +0 2408 3812 +0 2422 3812 +0 2441 3812 +0 2465 3812 +0 2494 3811 +0 2531 3811 +0 2576 3810 +0 2631 3810 +0 2694 3809 +0 2767 3808 +0 2850 3807 +0 2941 3805 +0 3040 3802 +0 3145 3799 +0 3256 3794 +1799 3372 3788 +2721 3492 3780 +3072 3614 3768 +3072 3721 3768 +3072 3768 3691 +3072 3768 3456 +2854 3912 2854 +3361 4052 2063 +3653 4095 0 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3811 +0 0 3811 +0 0 3810 +0 0 3810 +0 0 3809 +0 0 3808 +0 0 3807 +0 0 3805 +0 1737 3802 +0 2519 3799 +0 2856 3794 +1799 3097 3788 +2721 3296 3780 +3072 3473 3768 +3318 3636 3752 +3318 3752 3735 +3318 3752 3528 +3302 3900 3204 +3561 4044 2986 +3768 4095 2192 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3812 +0 0 3811 +0 0 3811 +0 0 3810 +0 0 3810 +0 0 3809 +0 0 3808 +0 0 3807 +0 0 3805 +0 0 3802 +0 0 3799 +1884 0 3794 +2422 1799 3788 +2721 2722 3780 +3072 3171 3768 +3318 3447 3752 +3520 3664 3730 +3520 3730 3609 +3579 3884 3450 +3737 4032 3336 +3888 4095 3118 +3137 0 3812 +3137 0 3812 +3137 0 3812 +3138 0 3812 +3138 0 3812 +3138 0 3812 +3139 0 3812 +3139 0 3812 +3140 0 3812 +3141 0 3812 +3143 0 3812 +3145 0 3812 +3147 0 3811 +3151 0 3811 +3155 0 3810 +3161 0 3810 +3169 0 3809 +3180 0 3808 +3194 0 3807 +3211 0 3805 +3234 0 3802 +3262 0 3799 +3298 0 3794 +3342 1799 3788 +3394 2721 3780 +3456 3072 3768 +3528 3318 3752 +3609 3520 3730 +3698 3698 3698 +3796 3862 3652 +3900 4016 3583 +4010 4095 3469 +3660 0 3944 +3660 0 3944 +3660 0 3944 +3660 0 3944 +3660 0 3944 +3660 0 3944 +3660 0 3944 +3660 0 3944 +3661 0 3944 +3661 0 3944 +3661 0 3944 +3662 0 3944 +3663 0 3944 +3664 0 3943 +3665 0 3943 +3667 0 3943 +3670 0 3942 +3674 0 3941 +3678 0 3940 +3685 0 3939 +3692 0 3937 +3703 0 3934 +3717 0 3931 +3735 0 3926 +3758 1928 3920 +3787 2854 3912 +3822 3204 3900 +3867 3450 3884 +3862 3652 3796 +3862 3741 3652 +4016 3999 3583 +4095 4095 3469 +3954 0 4076 +3954 0 4076 +3954 0 4076 +3954 0 4076 +3955 0 4076 +3955 0 4076 +3955 0 4076 +3955 0 4076 +3955 0 4076 +3955 0 4076 +3955 0 4076 +3956 0 4076 +3956 0 4076 +3957 0 4076 +3958 0 4075 +3959 0 4075 +3960 0 4075 +3962 0 4074 +3964 0 4073 +3968 0 4072 +3972 0 4071 +3978 0 4069 +3985 0 4066 +3995 0 4063 +4008 0 4058 +4025 2063 4052 +4044 2986 4040 +4032 3336 3986 +4016 3583 3900 +4016 3583 3711 +4016 3792 3583 +4095 4087 3469 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2192 4095 +4095 3118 4079 +4095 3469 4010 +4095 3469 3869 +4095 3469 3568 +4095 3853 3469 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3676 3944 +0 3677 3944 +0 3678 3944 +0 3679 3944 +0 3681 3944 +0 3683 3944 +0 3687 3944 +0 3691 3944 +0 3696 3944 +0 3704 3944 +0 3713 3944 +0 3726 3944 +0 3742 3944 +0 3763 3944 +0 3790 3944 +0 3823 3944 +0 3864 3944 +0 3913 3944 +0 3944 3915 +0 3944 3822 +0 3944 3660 +0 3944 3269 +0 4076 0 +0 4095 0 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3676 3944 +0 3677 3944 +0 3678 3944 +0 3679 3944 +0 3681 3944 +0 3683 3944 +0 3687 3944 +0 3691 3944 +0 3696 3944 +0 3704 3944 +0 3713 3944 +0 3726 3944 +0 3742 3944 +0 3763 3944 +0 3790 3944 +0 3823 3944 +0 3864 3944 +0 3913 3944 +0 3944 3915 +0 3944 3822 +0 3944 3660 +0 3944 3269 +0 4076 0 +0 4095 0 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3676 3944 +0 3677 3944 +0 3678 3944 +0 3679 3944 +0 3681 3944 +0 3683 3944 +0 3687 3944 +0 3691 3944 +0 3696 3944 +0 3704 3944 +0 3713 3944 +0 3726 3944 +0 3742 3944 +0 3763 3944 +0 3790 3944 +0 3823 3944 +0 3863 3944 +0 3913 3944 +0 3944 3915 +0 3944 3822 +0 3944 3660 +0 3944 3269 +0 4076 0 +0 4095 0 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3676 3944 +0 3677 3944 +0 3678 3944 +0 3679 3944 +0 3681 3944 +0 3683 3944 +0 3686 3944 +0 3691 3944 +0 3696 3944 +0 3703 3944 +0 3713 3944 +0 3726 3944 +0 3742 3944 +0 3763 3944 +0 3790 3944 +0 3822 3944 +0 3863 3944 +0 3913 3944 +0 3944 3915 +0 3944 3823 +0 3944 3660 +0 3944 3269 +0 4076 0 +0 4095 0 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3677 3944 +0 3678 3944 +0 3679 3944 +0 3681 3944 +0 3683 3944 +0 3686 3944 +0 3691 3944 +0 3696 3944 +0 3703 3944 +0 3713 3944 +0 3726 3944 +0 3742 3944 +0 3763 3944 +0 3789 3944 +0 3822 3944 +0 3863 3944 +0 3913 3944 +0 3944 3915 +0 3944 3823 +0 3944 3660 +0 3944 3270 +0 4076 0 +0 4095 0 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3676 3944 +0 3677 3944 +0 3679 3944 +0 3681 3944 +0 3683 3944 +0 3686 3944 +0 3690 3944 +0 3696 3944 +0 3703 3944 +0 3713 3944 +0 3725 3944 +0 3742 3944 +0 3763 3944 +0 3789 3944 +0 3822 3944 +0 3863 3944 +0 3913 3944 +0 3944 3915 +0 3944 3823 +0 3944 3660 +0 3944 3270 +0 4076 0 +0 4095 0 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3676 3944 +0 3676 3944 +0 3677 3944 +0 3679 3944 +0 3680 3944 +0 3683 3944 +0 3686 3944 +0 3690 3944 +0 3696 3944 +0 3703 3944 +0 3713 3944 +0 3725 3944 +0 3741 3944 +0 3762 3944 +0 3789 3944 +0 3822 3944 +0 3863 3944 +0 3913 3944 +0 3944 3915 +0 3944 3823 +0 3944 3660 +0 3944 3270 +0 4076 0 +0 4095 0 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3674 3944 +0 3674 3944 +0 3674 3944 +0 3675 3944 +0 3676 3944 +0 3677 3944 +0 3678 3944 +0 3680 3944 +0 3682 3944 +0 3686 3944 +0 3690 3944 +0 3695 3944 +0 3703 3944 +0 3712 3944 +0 3725 3944 +0 3741 3944 +0 3762 3944 +0 3789 3944 +0 3822 3944 +0 3863 3944 +0 3912 3944 +0 3944 3915 +0 3944 3823 +0 3944 3660 +0 3944 3271 +0 4076 0 +0 4095 0 +0 3672 3944 +0 3672 3944 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3673 3944 +0 3674 3944 +0 3675 3944 +0 3675 3944 +0 3676 3944 +0 3678 3944 +0 3680 3944 +0 3682 3944 +0 3685 3944 +0 3689 3944 +0 3695 3944 +0 3702 3944 +0 3712 3944 +0 3725 3944 +0 3741 3944 +0 3762 3944 +0 3788 3944 +0 3822 3944 +0 3863 3944 +0 3912 3944 +0 3944 3915 +0 3944 3823 +0 3944 3661 +0 3944 3271 +0 4076 0 +0 4095 0 +0 3671 3944 +0 3671 3944 +0 3672 3944 +0 3672 3944 +0 3672 3944 +0 3672 3944 +0 3673 3944 +0 3673 3944 +0 3674 3944 +0 3675 3944 +0 3676 3944 +0 3677 3944 +0 3679 3944 +0 3681 3944 +0 3685 3944 +0 3689 3944 +0 3694 3944 +0 3702 3944 +0 3711 3944 +0 3724 3944 +0 3740 3944 +0 3761 3944 +0 3788 3944 +0 3821 3944 +0 3862 3944 +0 3912 3944 +0 3944 3916 +0 3944 3824 +0 3944 3661 +0 3944 3272 +0 4076 0 +0 4095 0 +0 3670 3944 +0 3671 3944 +0 3671 3944 +0 3671 3944 +0 3671 3944 +0 3671 3944 +0 3672 3944 +0 3672 3944 +0 3673 3944 +0 3674 3944 +0 3675 3944 +0 3676 3944 +0 3678 3944 +0 3680 3944 +0 3684 3944 +0 3688 3944 +0 3694 3944 +0 3701 3944 +0 3711 3944 +0 3723 3944 +0 3740 3944 +0 3761 3944 +0 3787 3944 +0 3820 3944 +0 3862 3944 +0 3911 3944 +0 3944 3916 +0 3944 3824 +0 3944 3661 +0 3944 3273 +0 4076 0 +0 4095 0 +0 3669 3944 +0 3669 3944 +0 3669 3944 +0 3669 3944 +0 3670 3944 +0 3670 3944 +0 3670 3944 +0 3671 3944 +0 3671 3944 +0 3673 3944 +0 3674 3944 +0 3675 3944 +0 3677 3944 +0 3679 3944 +0 3683 3944 +0 3687 3944 +0 3692 3944 +0 3700 3944 +0 3710 3944 +0 3722 3944 +0 3739 3944 +0 3760 3944 +0 3786 3944 +0 3820 3944 +0 3861 3944 +0 3910 3944 +0 3944 3916 +0 3944 3824 +0 3944 3662 +0 3944 3275 +0 4076 0 +0 4095 0 +0 3667 3944 +0 3667 3944 +0 3668 3944 +0 3668 3944 +0 3668 3944 +0 3668 3944 +0 3668 3944 +0 3669 3944 +0 3670 3944 +0 3671 3944 +0 3672 3944 +0 3673 3944 +0 3676 3944 +0 3678 3944 +0 3681 3944 +0 3685 3944 +0 3691 3944 +0 3699 3944 +0 3708 3944 +0 3721 3944 +0 3737 3944 +0 3758 3944 +0 3785 3944 +0 3819 3944 +0 3860 3944 +0 3910 3944 +0 3944 3917 +0 3944 3825 +0 3944 3663 +0 3944 3277 +0 4076 0 +0 4095 0 +0 3665 3944 +0 3665 3944 +0 3665 3944 +0 3665 3944 +0 3665 3944 +0 3666 3944 +0 3666 3944 +0 3666 3944 +0 3667 3944 +0 3668 3944 +0 3669 3944 +0 3671 3944 +0 3673 3944 +0 3676 3943 +0 3679 3943 +0 3683 3943 +0 3689 3943 +0 3697 3943 +0 3706 3943 +0 3719 3943 +0 3736 3943 +0 3757 3943 +0 3784 3943 +0 3817 3943 +0 3859 3943 +0 3909 3943 +0 3943 3917 +0 3943 3826 +0 3943 3664 +0 3943 3279 +0 4076 0 +0 4095 0 +0 3661 3944 +0 3662 3944 +0 3662 3944 +0 3662 3944 +0 3662 3944 +0 3662 3944 +0 3663 3944 +0 3663 3944 +0 3664 3944 +0 3665 3944 +0 3666 3944 +0 3668 3944 +0 3670 3944 +0 3673 3943 +0 3677 3943 +0 3681 3943 +0 3687 3943 +0 3694 3943 +0 3704 3943 +0 3717 3943 +0 3733 3943 +0 3755 3943 +0 3781 3943 +0 3815 3943 +0 3857 3943 +0 3907 3943 +0 3943 3918 +0 3943 3827 +0 3943 3665 +0 3943 3283 +0 4075 0 +0 4095 0 +0 3657 3944 +0 3657 3944 +0 3657 3944 +0 3657 3944 +0 3658 3944 +0 3658 3944 +0 3658 3944 +0 3659 3944 +0 3659 3944 +0 3661 3944 +0 3662 3944 +0 3663 3944 +0 3666 3944 +0 3668 3943 +0 3672 3943 +0 3677 3943 +0 3683 3943 +0 3691 3943 +0 3701 3943 +0 3713 3943 +0 3730 3943 +0 3752 3943 +0 3779 3943 +0 3813 3943 +0 3854 3943 +0 3905 3943 +0 3943 3920 +0 3943 3828 +0 3943 3667 +0 3943 3287 +0 4075 0 +0 4095 0 +0 3651 3944 +0 3651 3944 +0 3651 3944 +0 3651 3944 +0 3652 3944 +0 3652 3944 +0 3652 3944 +0 3653 3944 +0 3653 3944 +0 3654 3944 +0 3656 3944 +0 3657 3944 +0 3659 3944 +0 3662 3943 +0 3666 3943 +0 3672 3943 +0 3679 3942 +0 3686 3942 +0 3696 3942 +0 3709 3942 +0 3726 3942 +0 3748 3942 +0 3775 3942 +0 3809 3942 +0 3851 3942 +0 3902 3942 +0 3942 3921 +0 3942 3830 +0 3942 3670 +0 3942 3293 +0 4075 0 +0 4095 0 +0 3643 3944 +0 3643 3944 +0 3643 3944 +0 3643 3944 +0 3643 3944 +0 3644 3944 +0 3644 3944 +0 3645 3944 +0 3645 3944 +0 3646 3944 +0 3648 3944 +0 3649 3944 +0 3651 3944 +0 3655 3943 +0 3659 3943 +0 3664 3943 +0 3671 3942 +0 3680 3941 +0 3690 3941 +0 3703 3941 +0 3720 3941 +0 3742 3941 +0 3770 3941 +0 3805 3941 +0 3847 3941 +0 3898 3941 +0 3941 3923 +0 3941 3832 +0 3941 3674 +0 3941 3302 +0 4074 0 +0 4095 0 +0 3631 3944 +0 3632 3944 +0 3632 3944 +0 3632 3944 +0 3632 3944 +0 3632 3944 +0 3633 3944 +0 3633 3944 +0 3634 3944 +0 3635 3944 +0 3636 3944 +0 3638 3944 +0 3640 3944 +0 3644 3943 +0 3648 3943 +0 3653 3943 +0 3660 3942 +0 3669 3941 +0 3682 3940 +0 3695 3940 +0 3713 3940 +0 3735 3940 +0 3763 3940 +0 3798 3940 +0 3841 3940 +0 3893 3940 +0 3940 3926 +0 3940 3836 +0 3940 3678 +0 3940 3312 +0 4073 0 +0 4095 0 +0 3616 3944 +0 3616 3944 +0 3616 3944 +0 3616 3944 +0 3617 3944 +0 3617 3944 +0 3617 3944 +0 3618 3944 +0 3619 3944 +0 3620 3944 +0 3621 3944 +0 3623 3944 +0 3625 3944 +0 3628 3943 +0 3632 3943 +0 3638 3943 +0 3646 3942 +0 3655 3941 +0 3668 3940 +0 3684 3939 +0 3702 3939 +0 3725 3939 +0 3754 3939 +0 3790 3939 +0 3833 3939 +0 3886 3939 +0 3939 3929 +0 3939 3840 +0 3939 3685 +0 3939 3326 +0 4072 0 +0 4095 0 +0 3594 3944 +0 3595 3944 +0 3595 3944 +0 3595 3944 +0 3595 3944 +0 3595 3944 +0 3596 3944 +0 3596 3944 +0 3597 3944 +0 3598 3944 +0 3600 3944 +0 3602 3944 +0 3604 3944 +0 3607 3943 +0 3612 3943 +0 3618 3943 +0 3626 3942 +0 3635 3941 +0 3649 3940 +0 3666 3939 +0 3688 3937 +0 3711 3937 +0 3741 3937 +0 3777 3937 +0 3822 3937 +0 3876 3937 +0 3937 3934 +0 3937 3846 +0 3937 3692 +0 3937 3344 +0 4071 0 +0 4095 0 +0 3564 3944 +0 3564 3944 +0 3564 3944 +0 3564 3944 +0 3564 3944 +0 3565 3944 +0 3565 3944 +0 3566 3944 +0 3567 3944 +0 3568 3944 +0 3569 3944 +0 3571 3944 +0 3574 3944 +0 3578 3943 +0 3583 3943 +0 3589 3943 +0 3597 3942 +0 3608 3941 +0 3622 3940 +0 3640 3939 +0 3663 3937 +0 3692 3934 +0 3723 3934 +0 3761 3934 +0 3808 3934 +0 3863 3934 +0 3928 3934 +0 3934 3853 +0 3934 3703 +0 3934 3366 +0 4069 0 +0 4095 0 +0 3520 3944 +0 3520 3944 +0 3520 3944 +0 3520 3944 +0 3520 3944 +0 3521 3944 +0 3521 3944 +0 3522 3944 +0 3523 3944 +0 3524 3944 +0 3526 3944 +0 3528 3944 +0 3531 3944 +0 3535 3943 +0 3540 3943 +0 3547 3943 +0 3556 3942 +0 3568 3941 +0 3583 3940 +0 3603 3939 +0 3628 3937 +0 3659 3934 +0 3698 3931 +0 3738 3931 +0 3787 3931 +0 3845 3931 +0 3913 3931 +0 3931 3863 +0 3931 3717 +0 3931 3395 +0 4066 0 +0 4095 0 +0 3452 3944 +0 3452 3944 +0 3453 3944 +0 3453 3944 +0 3453 3944 +0 3454 3944 +0 3454 3944 +0 3455 3944 +0 3456 3944 +0 3458 3944 +0 3459 3944 +0 3462 3944 +0 3466 3944 +0 3470 3943 +0 3476 3943 +0 3484 3943 +0 3494 3942 +0 3507 3941 +0 3525 3940 +0 3547 3939 +0 3575 3937 +0 3611 3934 +0 3654 3931 +0 3706 3926 +0 3758 3926 +0 3820 3926 +0 3891 3926 +0 3926 3877 +0 3926 3735 +0 3926 3430 +0 4063 0 +2137 4095 0 +0 3344 3944 +0 3344 3944 +0 3344 3944 +0 3344 3944 +0 3345 3944 +0 3346 3944 +0 3346 3944 +0 3347 3944 +0 3349 3944 +0 3351 3944 +0 3353 3944 +0 3356 3944 +0 3361 3944 +0 3366 3943 +0 3374 3943 +0 3384 3943 +0 3396 3942 +0 3413 3941 +0 3434 3940 +0 3461 3939 +0 3495 3937 +0 3537 3934 +0 3587 3931 +0 3647 3926 +1928 3716 3920 +1928 3783 3920 +1928 3860 3920 +1928 3920 3893 +1928 3920 3758 +1928 3920 3474 +0 4058 2157 +2915 4095 0 +0 3140 3944 +0 3140 3944 +0 3140 3944 +0 3141 3944 +0 3142 3944 +0 3143 3944 +0 3144 3944 +0 3145 3944 +0 3147 3944 +0 3151 3944 +0 3154 3944 +0 3159 3944 +0 3166 3944 +0 3175 3943 +0 3186 3943 +0 3201 3943 +0 3220 3942 +0 3244 3941 +0 3275 3940 +0 3313 3939 +0 3359 3937 +0 3414 3934 +0 3479 3931 +0 3553 3926 +1928 3637 3920 +2854 3729 3912 +2854 3814 3912 +2854 3908 3912 +2854 3912 3787 +2854 3912 3526 +2063 4052 2689 +3253 4095 0 +0 2497 3944 +0 2498 3944 +0 2500 3944 +0 2502 3944 +0 2505 3944 +0 2508 3944 +0 2513 3944 +0 2520 3944 +0 2528 3944 +0 2539 3944 +0 2553 3944 +0 2572 3944 +0 2596 3944 +0 2625 3943 +0 2662 3943 +0 2708 3943 +0 2762 3942 +0 2826 3941 +0 2899 3940 +0 2982 3939 +0 3073 3937 +0 3172 3934 +0 3277 3931 +0 3388 3926 +1928 3504 3920 +2854 3624 3912 +3204 3746 3900 +3204 3853 3900 +3204 3900 3822 +3204 3900 3588 +2987 4044 2986 +3494 4095 2192 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3943 +0 0 3943 +0 0 3943 +0 0 3942 +0 0 3941 +0 0 3940 +0 0 3939 +0 0 3937 +0 1863 3934 +0 2650 3931 +0 2988 3926 +1928 3229 3920 +2854 3428 3912 +3204 3605 3900 +3450 3768 3884 +3450 3884 3867 +3450 3884 3660 +3435 4032 3336 +3693 4095 3118 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3944 +0 0 3943 +0 0 3943 +0 0 3943 +0 0 3942 +0 0 3941 +0 0 3940 +0 0 3939 +0 0 3937 +0 0 3934 +0 0 3931 +2023 0 3926 +2556 1928 3920 +2854 2854 3912 +3204 3302 3900 +3450 3579 3884 +3652 3796 3862 +3652 3862 3741 +3711 4016 3583 +3869 4095 3469 +3269 0 3944 +3269 0 3944 +3269 0 3944 +3269 0 3944 +3270 0 3944 +3270 0 3944 +3270 0 3944 +3271 0 3944 +3271 0 3944 +3272 0 3944 +3273 0 3944 +3275 0 3944 +3277 0 3944 +3279 0 3943 +3283 0 3943 +3287 0 3943 +3293 0 3942 +3302 0 3941 +3312 0 3940 +3326 0 3939 +3344 0 3937 +3366 0 3934 +3395 0 3931 +3430 0 3926 +3474 1928 3920 +3526 2854 3912 +3588 3204 3900 +3660 3450 3884 +3741 3652 3862 +3830 3830 3830 +3928 3994 3784 +4032 4095 3714 +3791 0 4076 +3792 0 4076 +3792 0 4076 +3792 0 4076 +3792 0 4076 +3792 0 4076 +3792 0 4076 +3792 0 4076 +3792 0 4076 +3793 0 4076 +3793 0 4076 +3793 0 4076 +3794 0 4076 +3795 0 4076 +3796 0 4075 +3797 0 4075 +3799 0 4075 +3802 0 4074 +3805 0 4073 +3810 0 4072 +3816 0 4071 +3824 0 4069 +3835 0 4066 +3849 0 4063 +3867 0 4058 +3890 2063 4052 +3919 2986 4044 +3955 3336 4032 +3999 3583 4016 +3994 3784 3928 +3994 3873 3784 +4095 4095 3714 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4087 0 4095 +4088 0 4095 +4088 0 4095 +4088 0 4095 +4088 0 4095 +4089 0 4095 +4089 0 4095 +4090 0 4095 +4091 0 4095 +4092 0 4095 +4094 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 0 4095 +4095 2192 4095 +4095 3118 4095 +4095 3469 4095 +4095 3714 4032 +4095 3714 3844 +4095 3924 3714 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3812 4076 +0 3813 4076 +0 3816 4076 +0 3819 4076 +0 3823 4076 +0 3828 4076 +0 3836 4076 +0 3846 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3922 4076 +0 3955 4076 +0 3996 4076 +0 4045 4076 +0 4076 4047 +0 4076 3954 +0 4076 3791 +0 4076 3401 +0 4095 0 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3811 4076 +0 3813 4076 +0 3816 4076 +0 3819 4076 +0 3823 4076 +0 3828 4076 +0 3836 4076 +0 3845 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3922 4076 +0 3955 4076 +0 3996 4076 +0 4045 4076 +0 4076 4047 +0 4076 3954 +0 4076 3792 +0 4076 3401 +0 4095 0 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3811 4076 +0 3813 4076 +0 3816 4076 +0 3819 4076 +0 3823 4076 +0 3828 4076 +0 3836 4076 +0 3845 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3921 4076 +0 3955 4076 +0 3996 4076 +0 4045 4076 +0 4076 4047 +0 4076 3954 +0 4076 3792 +0 4076 3401 +0 4095 0 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3811 4076 +0 3813 4076 +0 3815 4076 +0 3818 4076 +0 3823 4076 +0 3828 4076 +0 3836 4076 +0 3845 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3921 4076 +0 3955 4076 +0 3995 4076 +0 4045 4076 +0 4076 4047 +0 4076 3954 +0 4076 3792 +0 4076 3401 +0 4095 0 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3811 4076 +0 3813 4076 +0 3815 4076 +0 3818 4076 +0 3823 4076 +0 3828 4076 +0 3836 4076 +0 3845 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3921 4076 +0 3955 4076 +0 3995 4076 +0 4045 4076 +0 4076 4047 +0 4076 3955 +0 4076 3792 +0 4076 3401 +0 4095 0 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3811 4076 +0 3813 4076 +0 3815 4076 +0 3818 4076 +0 3822 4076 +0 3828 4076 +0 3835 4076 +0 3845 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3921 4076 +0 3954 4076 +0 3995 4076 +0 4045 4076 +0 4076 4047 +0 4076 3955 +0 4076 3792 +0 4076 3402 +0 4095 0 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3810 4076 +0 3811 4076 +0 3812 4076 +0 3815 4076 +0 3818 4076 +0 3822 4076 +0 3828 4076 +0 3835 4076 +0 3845 4076 +0 3858 4076 +0 3874 4076 +0 3895 4076 +0 3921 4076 +0 3954 4076 +0 3995 4076 +0 4045 4076 +0 4076 4047 +0 4076 3955 +0 4076 3792 +0 4076 3402 +0 4095 0 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3806 4076 +0 3806 4076 +0 3806 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3812 4076 +0 3815 4076 +0 3818 4076 +0 3822 4076 +0 3828 4076 +0 3835 4076 +0 3845 4076 +0 3857 4076 +0 3873 4076 +0 3895 4076 +0 3921 4076 +0 3954 4076 +0 3995 4076 +0 4045 4076 +0 4076 4047 +0 4076 3955 +0 4076 3792 +0 4076 3402 +0 4095 0 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3806 4076 +0 3807 4076 +0 3807 4076 +0 3808 4076 +0 3809 4076 +0 3810 4076 +0 3812 4076 +0 3814 4076 +0 3818 4076 +0 3822 4076 +0 3827 4076 +0 3835 4076 +0 3845 4076 +0 3857 4076 +0 3873 4076 +0 3894 4076 +0 3921 4076 +0 3954 4076 +0 3995 4076 +0 4044 4076 +0 4076 4047 +0 4076 3955 +0 4076 3792 +0 4076 3403 +0 4095 0 +0 3804 4076 +0 3804 4076 +0 3804 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3805 4076 +0 3806 4076 +0 3807 4076 +0 3808 4076 +0 3808 4076 +0 3810 4076 +0 3812 4076 +0 3814 4076 +0 3817 4076 +0 3821 4076 +0 3827 4076 +0 3834 4076 +0 3844 4076 +0 3856 4076 +0 3873 4076 +0 3894 4076 +0 3921 4076 +0 3953 4076 +0 3995 4076 +0 4044 4076 +0 4076 4047 +0 4076 3955 +0 4076 3793 +0 4076 3403 +0 4095 0 +0 3803 4076 +0 3803 4076 +0 3803 4076 +0 3804 4076 +0 3804 4076 +0 3804 4076 +0 3804 4076 +0 3805 4076 +0 3805 4076 +0 3806 4076 +0 3807 4076 +0 3808 4076 +0 3809 4076 +0 3811 4076 +0 3813 4076 +0 3816 4076 +0 3821 4076 +0 3826 4076 +0 3834 4076 +0 3843 4076 +0 3856 4076 +0 3872 4076 +0 3893 4076 +0 3920 4076 +0 3953 4076 +0 3994 4076 +0 4044 4076 +0 4076 4048 +0 4076 3955 +0 4076 3793 +0 4076 3404 +0 4095 0 +0 3803 4076 +0 3803 4076 +0 3803 4076 +0 3803 4076 +0 3803 4076 +0 3803 4076 +0 3803 4076 +0 3804 4076 +0 3804 4076 +0 3805 4076 +0 3806 4076 +0 3807 4076 +0 3808 4076 +0 3810 4076 +0 3812 4076 +0 3816 4076 +0 3820 4076 +0 3826 4076 +0 3833 4076 +0 3843 4076 +0 3855 4076 +0 3872 4076 +0 3892 4076 +0 3919 4076 +0 3953 4076 +0 3994 4076 +0 4043 4076 +0 4076 4048 +0 4076 3956 +0 4076 3793 +0 4076 3405 +0 4095 0 +0 3801 4076 +0 3801 4076 +0 3801 4076 +0 3801 4076 +0 3801 4076 +0 3802 4076 +0 3802 4076 +0 3802 4076 +0 3803 4076 +0 3803 4076 +0 3804 4076 +0 3805 4076 +0 3807 4076 +0 3809 4076 +0 3812 4076 +0 3814 4076 +0 3819 4076 +0 3824 4076 +0 3832 4076 +0 3841 4076 +0 3854 4076 +0 3871 4076 +0 3891 4076 +0 3918 4076 +0 3952 4076 +0 3993 4076 +0 4043 4076 +0 4076 4048 +0 4076 3956 +0 4076 3794 +0 4076 3407 +0 4095 0 +0 3799 4076 +0 3799 4076 +0 3799 4076 +0 3799 4076 +0 3800 4076 +0 3800 4076 +0 3800 4076 +0 3801 4076 +0 3801 4076 +0 3802 4076 +0 3803 4076 +0 3804 4076 +0 3805 4076 +0 3808 4076 +0 3810 4076 +0 3813 4076 +0 3817 4076 +0 3823 4076 +0 3830 4076 +0 3840 4076 +0 3853 4076 +0 3869 4076 +0 3890 4076 +0 3917 4076 +0 3950 4076 +0 3992 4076 +0 4042 4076 +0 4076 4049 +0 4076 3957 +0 4076 3795 +0 4076 3409 +0 4095 0 +0 3797 4076 +0 3797 4076 +0 3797 4076 +0 3797 4076 +0 3797 4076 +0 3797 4076 +0 3798 4076 +0 3798 4076 +0 3798 4076 +0 3799 4076 +0 3800 4076 +0 3801 4076 +0 3803 4076 +0 3805 4076 +0 3808 4075 +0 3811 4075 +0 3816 4075 +0 3821 4075 +0 3829 4075 +0 3838 4075 +0 3851 4075 +0 3868 4075 +0 3889 4075 +0 3916 4075 +0 3949 4075 +0 3991 4075 +0 4041 4075 +0 4075 4049 +0 4075 3958 +0 4075 3796 +0 4075 3411 +0 4095 0 +0 3793 4076 +0 3793 4076 +0 3793 4076 +0 3794 4076 +0 3794 4076 +0 3794 4076 +0 3794 4076 +0 3795 4076 +0 3795 4076 +0 3796 4076 +0 3797 4076 +0 3798 4076 +0 3800 4076 +0 3802 4076 +0 3805 4075 +0 3809 4075 +0 3813 4075 +0 3818 4075 +0 3826 4075 +0 3836 4075 +0 3849 4075 +0 3865 4075 +0 3887 4075 +0 3913 4075 +0 3947 4075 +0 3989 4075 +0 4039 4075 +0 4075 4050 +0 4075 3959 +0 4075 3797 +0 4075 3415 +0 4095 0 +0 3789 4076 +0 3789 4076 +0 3789 4076 +0 3789 4076 +0 3790 4076 +0 3790 4076 +0 3790 4076 +0 3790 4076 +0 3791 4076 +0 3791 4076 +0 3793 4076 +0 3794 4076 +0 3795 4076 +0 3798 4076 +0 3801 4075 +0 3804 4075 +0 3810 4075 +0 3815 4075 +0 3823 4075 +0 3833 4075 +0 3846 4075 +0 3862 4075 +0 3884 4075 +0 3911 4075 +0 3945 4075 +0 3986 4075 +0 4037 4075 +0 4075 4051 +0 4075 3960 +0 4075 3799 +0 4075 3419 +0 4095 0 +0 3783 4076 +0 3783 4076 +0 3783 4076 +0 3783 4076 +0 3783 4076 +0 3784 4076 +0 3784 4076 +0 3784 4076 +0 3785 4076 +0 3785 4076 +0 3787 4076 +0 3787 4076 +0 3789 4076 +0 3792 4076 +0 3795 4075 +0 3798 4075 +0 3803 4075 +0 3810 4074 +0 3818 4074 +0 3828 4074 +0 3841 4074 +0 3858 4074 +0 3880 4074 +0 3907 4074 +0 3941 4074 +0 3983 4074 +0 4034 4074 +0 4074 4053 +0 4074 3962 +0 4074 3802 +0 4074 3426 +0 4095 0 +0 3774 4076 +0 3775 4076 +0 3775 4076 +0 3775 4076 +0 3775 4076 +0 3775 4076 +0 3776 4076 +0 3776 4076 +0 3777 4076 +0 3777 4076 +0 3778 4076 +0 3780 4076 +0 3781 4076 +0 3784 4076 +0 3787 4075 +0 3790 4075 +0 3796 4075 +0 3803 4074 +0 3812 4073 +0 3822 4073 +0 3835 4073 +0 3852 4073 +0 3874 4073 +0 3902 4073 +0 3937 4073 +0 3979 4073 +0 4030 4073 +0 4073 4055 +0 4073 3964 +0 4073 3805 +0 4073 3434 +0 4095 0 +0 3763 4076 +0 3763 4076 +0 3763 4076 +0 3764 4076 +0 3764 4076 +0 3764 4076 +0 3764 4076 +0 3765 4076 +0 3765 4076 +0 3766 4076 +0 3767 4076 +0 3768 4076 +0 3770 4076 +0 3773 4076 +0 3776 4075 +0 3780 4075 +0 3785 4075 +0 3792 4074 +0 3801 4073 +0 3814 4072 +0 3827 4072 +0 3845 4072 +0 3867 4072 +0 3895 4072 +0 3930 4072 +0 3973 4072 +0 4025 4072 +0 4072 4058 +0 4072 3968 +0 4072 3810 +0 4072 3444 +0 4095 0 +0 3748 4076 +0 3748 4076 +0 3748 4076 +0 3748 4076 +0 3748 4076 +0 3749 4076 +0 3749 4076 +0 3749 4076 +0 3750 4076 +0 3751 4076 +0 3752 4076 +0 3753 4076 +0 3755 4076 +0 3757 4076 +0 3760 4075 +0 3765 4075 +0 3770 4075 +0 3777 4074 +0 3787 4073 +0 3800 4072 +0 3816 4071 +0 3834 4071 +0 3857 4071 +0 3886 4071 +0 3921 4071 +0 3965 4071 +0 4018 4071 +0 4071 4061 +0 4071 3972 +0 4071 3816 +0 4071 3458 +0 4095 0 +0 3726 4076 +0 3726 4076 +0 3726 4076 +0 3727 4076 +0 3727 4076 +0 3727 4076 +0 3727 4076 +0 3728 4076 +0 3728 4076 +0 3729 4076 +0 3730 4076 +0 3732 4076 +0 3734 4076 +0 3736 4076 +0 3739 4075 +0 3744 4075 +0 3750 4075 +0 3757 4074 +0 3768 4073 +0 3781 4072 +0 3798 4071 +0 3820 4069 +0 3843 4069 +0 3873 4069 +0 3910 4069 +0 3954 4069 +0 4008 4069 +0 4069 4066 +0 4069 3978 +0 4069 3824 +0 4069 3475 +0 4095 0 +0 3696 4076 +0 3696 4076 +0 3696 4076 +0 3696 4076 +0 3696 4076 +0 3696 4076 +0 3697 4076 +0 3697 4076 +0 3698 4076 +0 3699 4076 +0 3700 4076 +0 3701 4076 +0 3703 4076 +0 3706 4076 +0 3710 4075 +0 3714 4075 +0 3721 4075 +0 3729 4074 +0 3740 4073 +0 3754 4072 +0 3772 4071 +0 3795 4069 +0 3824 4066 +0 3855 4066 +0 3893 4066 +0 3940 4066 +0 3995 4066 +0 4060 4066 +0 4066 3985 +0 4066 3835 +0 4066 3498 +0 4095 0 +0 3651 4076 +0 3651 4076 +0 3651 4076 +0 3652 4076 +0 3652 4076 +0 3652 4076 +0 3653 4076 +0 3653 4076 +0 3654 4076 +0 3655 4076 +0 3656 4076 +0 3658 4076 +0 3660 4076 +0 3663 4076 +0 3667 4075 +0 3672 4075 +0 3679 4075 +0 3688 4074 +0 3700 4073 +0 3715 4072 +0 3735 4071 +0 3760 4069 +0 3791 4066 +0 3830 4063 +0 3870 4063 +0 3919 4063 +0 3977 4063 +0 4045 4063 +0 4063 3995 +0 4063 3849 +0 4063 3527 +0 4095 0 +0 3584 4076 +0 3584 4076 +0 3585 4076 +0 3585 4076 +0 3585 4076 +0 3585 4076 +0 3586 4076 +0 3586 4076 +0 3587 4076 +0 3588 4076 +0 3590 4076 +0 3592 4076 +0 3594 4076 +0 3597 4076 +0 3602 4075 +0 3608 4075 +0 3616 4075 +0 3626 4074 +0 3640 4073 +0 3657 4072 +0 3679 4071 +0 3708 4069 +0 3743 4066 +0 3786 4063 +0 3838 4058 +0 3890 4058 +0 3952 4058 +0 4023 4058 +0 4058 4008 +0 4058 3867 +0 4058 3562 +0 4095 0 +0 3475 4076 +0 3475 4076 +0 3476 4076 +0 3476 4076 +0 3476 4076 +0 3477 4076 +0 3477 4076 +0 3478 4076 +0 3479 4076 +0 3480 4076 +0 3482 4076 +0 3485 4076 +0 3488 4076 +0 3492 4076 +0 3498 4075 +0 3505 4075 +0 3515 4075 +0 3528 4074 +0 3545 4073 +0 3566 4072 +0 3593 4071 +0 3627 4069 +0 3669 4066 +0 3719 4063 +0 3779 4058 +2063 3848 4052 +2063 3915 4052 +2063 3992 4052 +2063 4052 4025 +2063 4052 3890 +2063 4052 3606 +0 4095 2266 +0 3271 4076 +0 3272 4076 +0 3272 4076 +0 3272 4076 +0 3273 4076 +0 3273 4076 +0 3274 4076 +0 3276 4076 +0 3277 4076 +0 3279 4076 +0 3282 4076 +0 3286 4076 +0 3291 4076 +0 3297 4076 +0 3306 4075 +0 3318 4075 +0 3333 4075 +0 3351 4074 +0 3376 4073 +0 3407 4072 +0 3445 4071 +0 3491 4069 +0 3546 4066 +0 3611 4063 +0 3685 4058 +2063 3769 4052 +2986 3861 4044 +2986 3947 4044 +2986 4040 4044 +2986 4044 3919 +2986 4044 3659 +2192 4095 2814 +0 2626 4076 +0 2627 4076 +0 2628 4076 +0 2630 4076 +0 2632 4076 +0 2635 4076 +0 2639 4076 +0 2644 4076 +0 2650 4076 +0 2659 4076 +0 2670 4076 +0 2684 4076 +0 2703 4076 +0 2726 4076 +0 2756 4075 +0 2793 4075 +0 2839 4075 +0 2893 4074 +0 2957 4073 +0 3031 4072 +0 3113 4071 +0 3205 4069 +0 3303 4066 +0 3409 4063 +0 3520 4058 +2063 3636 4052 +2986 3755 4044 +3336 3878 4032 +3336 3986 4032 +3336 4032 3955 +3336 4032 3720 +3121 4095 3118 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4075 +0 0 4075 +0 0 4075 +0 0 4074 +0 0 4073 +0 0 4072 +0 0 4071 +0 0 4069 +0 1985 4066 +0 2781 4063 +0 3119 4058 +2063 3361 4052 +2986 3561 4044 +3336 3737 4032 +3583 3900 4016 +3583 4016 3999 +3583 4016 3792 +3568 4095 3469 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4076 +0 0 4075 +0 0 4075 +0 0 4075 +0 0 4074 +0 0 4073 +0 0 4072 +0 0 4071 +0 0 4069 +0 0 4066 +0 0 4063 +2157 0 4058 +2689 2063 4052 +2986 2987 4044 +3336 3435 4032 +3583 3711 4016 +3784 3928 3994 +3784 3994 3873 +3844 4095 3714 +3401 0 4076 +3401 0 4076 +3401 0 4076 +3401 0 4076 +3401 0 4076 +3402 0 4076 +3402 0 4076 +3402 0 4076 +3403 0 4076 +3403 0 4076 +3404 0 4076 +3405 0 4076 +3407 0 4076 +3409 0 4076 +3411 0 4075 +3415 0 4075 +3419 0 4075 +3426 0 4074 +3434 0 4073 +3444 0 4072 +3458 0 4071 +3475 0 4069 +3498 0 4066 +3527 0 4063 +3562 0 4058 +3606 2063 4052 +3659 2986 4044 +3720 3336 4032 +3792 3583 4016 +3873 3784 3994 +3962 3962 3962 +4060 4095 3916 +3924 0 4095 +3924 0 4095 +3924 0 4095 +3924 0 4095 +3924 0 4095 +3925 0 4095 +3925 0 4095 +3925 0 4095 +3925 0 4095 +3925 0 4095 +3925 0 4095 +3926 0 4095 +3926 0 4095 +3927 0 4095 +3927 0 4095 +3929 0 4095 +3930 0 4095 +3932 0 4095 +3935 0 4095 +3938 0 4095 +3943 0 4095 +3949 0 4095 +3957 0 4095 +3968 0 4095 +3982 0 4095 +4000 0 4095 +4023 2192 4095 +4051 3118 4095 +4087 3469 4095 +4095 3714 4095 +4095 3916 4060 +4095 4005 3916 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3946 4095 +0 3948 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3978 4095 +0 3990 4095 +0 4007 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3924 +0 4095 3533 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3946 4095 +0 3948 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3978 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3924 +0 4095 3533 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3945 4095 +0 3948 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3978 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3924 +0 4095 3533 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3945 4095 +0 3948 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3978 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3924 +0 4095 3534 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3945 4095 +0 3948 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3977 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3924 +0 4095 3534 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3945 4095 +0 3948 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3977 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3925 +0 4095 3534 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3942 4095 +0 3943 4095 +0 3945 4095 +0 3947 4095 +0 3951 4095 +0 3955 4095 +0 3961 4095 +0 3968 4095 +0 3977 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4054 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3925 +0 4095 3534 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3942 4095 +0 3943 4095 +0 3945 4095 +0 3947 4095 +0 3950 4095 +0 3955 4095 +0 3960 4095 +0 3968 4095 +0 3977 4095 +0 3990 4095 +0 4006 4095 +0 4027 4095 +0 4053 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3925 +0 4095 3534 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3939 4095 +0 3940 4095 +0 3941 4095 +0 3941 4095 +0 3943 4095 +0 3945 4095 +0 3947 4095 +0 3950 4095 +0 3954 4095 +0 3960 4095 +0 3967 4095 +0 3977 4095 +0 3989 4095 +0 4006 4095 +0 4027 4095 +0 4053 4095 +0 4086 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4087 +0 4095 3925 +0 4095 3534 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3938 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3940 4095 +0 3940 4095 +0 3941 4095 +0 3943 4095 +0 3944 4095 +0 3947 4095 +0 3950 4095 +0 3954 4095 +0 3960 4095 +0 3967 4095 +0 3977 4095 +0 3989 4095 +0 4005 4095 +0 4026 4095 +0 4053 4095 +0 4086 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4088 +0 4095 3925 +0 4095 3535 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3938 4095 +0 3938 4095 +0 3939 4095 +0 3940 4095 +0 3941 4095 +0 3942 4095 +0 3944 4095 +0 3946 4095 +0 3950 4095 +0 3954 4095 +0 3959 4095 +0 3967 4095 +0 3976 4095 +0 3989 4095 +0 4005 4095 +0 4026 4095 +0 4053 4095 +0 4086 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4088 +0 4095 3925 +0 4095 3536 +0 3936 4095 +0 3936 4095 +0 3936 4095 +0 3936 4095 +0 3936 4095 +0 3936 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3937 4095 +0 3938 4095 +0 3939 4095 +0 3940 4095 +0 3941 4095 +0 3943 4095 +0 3946 4095 +0 3949 4095 +0 3953 4095 +0 3959 4095 +0 3966 4095 +0 3976 4095 +0 3988 4095 +0 4005 4095 +0 4026 4095 +0 4052 4095 +0 4085 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4088 +0 4095 3926 +0 4095 3537 +0 3935 4095 +0 3935 4095 +0 3935 4095 +0 3935 4095 +0 3935 4095 +0 3935 4095 +0 3935 4095 +0 3936 4095 +0 3936 4095 +0 3937 4095 +0 3937 4095 +0 3938 4095 +0 3939 4095 +0 3941 4095 +0 3942 4095 +0 3945 4095 +0 3948 4095 +0 3952 4095 +0 3958 4095 +0 3965 4095 +0 3975 4095 +0 3988 4095 +0 4004 4095 +0 4025 4095 +0 4051 4095 +0 4085 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4088 +0 4095 3926 +0 4095 3538 +0 3933 4095 +0 3933 4095 +0 3933 4095 +0 3933 4095 +0 3934 4095 +0 3934 4095 +0 3934 4095 +0 3934 4095 +0 3935 4095 +0 3935 4095 +0 3936 4095 +0 3937 4095 +0 3938 4095 +0 3940 4095 +0 3941 4095 +0 3944 4095 +0 3947 4095 +0 3951 4095 +0 3957 4095 +0 3964 4095 +0 3974 4095 +0 3986 4095 +0 4003 4095 +0 4024 4095 +0 4051 4095 +0 4084 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4089 +0 4095 3927 +0 4095 3539 +0 3932 4095 +0 3932 4095 +0 3932 4095 +0 3932 4095 +0 3932 4095 +0 3932 4095 +0 3932 4095 +0 3932 4095 +0 3933 4095 +0 3933 4095 +0 3934 4095 +0 3935 4095 +0 3936 4095 +0 3938 4095 +0 3940 4095 +0 3942 4095 +0 3945 4095 +0 3950 4095 +0 3955 4095 +0 3963 4095 +0 3972 4095 +0 3985 4095 +0 4002 4095 +0 4023 4095 +0 4049 4095 +0 4083 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4089 +0 4095 3927 +0 4095 3541 +0 3929 4095 +0 3929 4095 +0 3929 4095 +0 3929 4095 +0 3929 4095 +0 3929 4095 +0 3930 4095 +0 3930 4095 +0 3930 4095 +0 3931 4095 +0 3932 4095 +0 3932 4095 +0 3934 4095 +0 3935 4095 +0 3937 4095 +0 3940 4095 +0 3944 4095 +0 3948 4095 +0 3953 4095 +0 3961 4095 +0 3971 4095 +0 3983 4095 +0 4000 4095 +0 4021 4095 +0 4048 4095 +0 4082 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4090 +0 4095 3929 +0 4095 3544 +0 3926 4095 +0 3926 4095 +0 3926 4095 +0 3926 4095 +0 3926 4095 +0 3926 4095 +0 3927 4095 +0 3927 4095 +0 3927 4095 +0 3927 4095 +0 3928 4095 +0 3929 4095 +0 3930 4095 +0 3932 4095 +0 3934 4095 +0 3937 4095 +0 3941 4095 +0 3945 4095 +0 3951 4095 +0 3959 4095 +0 3968 4095 +0 3981 4095 +0 3998 4095 +0 4019 4095 +0 4046 4095 +0 4080 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4091 +0 4095 3930 +0 4095 3547 +0 3921 4095 +0 3921 4095 +0 3921 4095 +0 3921 4095 +0 3921 4095 +0 3922 4095 +0 3922 4095 +0 3922 4095 +0 3923 4095 +0 3923 4095 +0 3924 4095 +0 3925 4095 +0 3926 4095 +0 3927 4095 +0 3930 4095 +0 3933 4095 +0 3937 4095 +0 3942 4095 +0 3947 4095 +0 3955 4095 +0 3965 4095 +0 3978 4095 +0 3994 4095 +0 4016 4095 +0 4043 4095 +0 4077 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4092 +0 4095 3932 +0 4095 3552 +0 3915 4095 +0 3915 4095 +0 3915 4095 +0 3915 4095 +0 3915 4095 +0 3916 4095 +0 3916 4095 +0 3916 4095 +0 3917 4095 +0 3917 4095 +0 3918 4095 +0 3919 4095 +0 3920 4095 +0 3922 4095 +0 3924 4095 +0 3927 4095 +0 3931 4095 +0 3936 4095 +0 3943 4095 +0 3950 4095 +0 3961 4095 +0 3974 4095 +0 3990 4095 +0 4012 4095 +0 4039 4095 +0 4073 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4094 +0 4095 3935 +0 4095 3558 +0 3907 4095 +0 3907 4095 +0 3907 4095 +0 3907 4095 +0 3907 4095 +0 3908 4095 +0 3908 4095 +0 3908 4095 +0 3908 4095 +0 3909 4095 +0 3910 4095 +0 3910 4095 +0 3912 4095 +0 3913 4095 +0 3916 4095 +0 3919 4095 +0 3923 4095 +0 3928 4095 +0 3935 4095 +0 3944 4095 +0 3954 4095 +0 3968 4095 +0 3984 4095 +0 4006 4095 +0 4034 4095 +0 4069 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 3938 +0 4095 3566 +0 3896 4095 +0 3896 4095 +0 3896 4095 +0 3896 4095 +0 3896 4095 +0 3896 4095 +0 3896 4095 +0 3897 4095 +0 3897 4095 +0 3898 4095 +0 3898 4095 +0 3899 4095 +0 3901 4095 +0 3903 4095 +0 3905 4095 +0 3908 4095 +0 3912 4095 +0 3917 4095 +0 3924 4095 +0 3934 4095 +0 3946 4095 +0 3960 4095 +0 3977 4095 +0 3999 4095 +0 4027 4095 +0 4062 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 3943 +0 4095 3576 +0 3880 4095 +0 3880 4095 +0 3880 4095 +0 3880 4095 +0 3880 4095 +0 3881 4095 +0 3881 4095 +0 3881 4095 +0 3881 4095 +0 3882 4095 +0 3883 4095 +0 3884 4095 +0 3885 4095 +0 3887 4095 +0 3889 4095 +0 3893 4095 +0 3897 4095 +0 3903 4095 +0 3910 4095 +0 3920 4095 +0 3932 4095 +0 3949 4095 +0 3966 4095 +0 3989 4095 +0 4018 4095 +0 4054 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 3949 +0 4095 3590 +0 3859 4095 +0 3859 4095 +0 3859 4095 +0 3859 4095 +0 3859 4095 +0 3859 4095 +0 3859 4095 +0 3860 4095 +0 3860 4095 +0 3861 4095 +0 3862 4095 +0 3863 4095 +0 3864 4095 +0 3866 4095 +0 3868 4095 +0 3872 4095 +0 3876 4095 +0 3882 4095 +0 3890 4095 +0 3900 4095 +0 3913 4095 +0 3930 4095 +0 3952 4095 +0 3976 4095 +0 4005 4095 +0 4042 4095 +0 4087 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 3957 +0 4095 3608 +0 3828 4095 +0 3828 4095 +0 3828 4095 +0 3828 4095 +0 3828 4095 +0 3829 4095 +0 3829 4095 +0 3829 4095 +0 3830 4095 +0 3830 4095 +0 3831 4095 +0 3832 4095 +0 3834 4095 +0 3836 4095 +0 3838 4095 +0 3842 4095 +0 3847 4095 +0 3853 4095 +0 3861 4095 +0 3872 4095 +0 3886 4095 +0 3904 4095 +0 3927 4095 +0 3956 4095 +0 3987 4095 +0 4025 4095 +0 4072 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 3968 +0 4095 3630 +0 3784 4095 +0 3784 4095 +0 3784 4095 +0 3784 4095 +0 3784 4095 +0 3784 4095 +0 3784 4095 +0 3785 4095 +0 3786 4095 +0 3786 4095 +0 3787 4095 +0 3788 4095 +0 3790 4095 +0 3792 4095 +0 3795 4095 +0 3799 4095 +0 3804 4095 +0 3811 4095 +0 3820 4095 +0 3832 4095 +0 3847 4095 +0 3867 4095 +0 3892 4095 +0 3923 4095 +0 3962 4095 +0 4002 4095 +0 4051 4095 +0 4095 4095 +0 4095 4095 +0 4095 4095 +0 4095 3982 +0 4095 3659 +0 3716 4095 +0 3717 4095 +0 3717 4095 +0 3717 4095 +0 3717 4095 +0 3717 4095 +0 3718 4095 +0 3718 4095 +0 3719 4095 +0 3720 4095 +0 3721 4095 +0 3722 4095 +0 3724 4095 +0 3727 4095 +0 3730 4095 +0 3735 4095 +0 3741 4095 +0 3748 4095 +0 3759 4095 +0 3772 4095 +0 3790 4095 +0 3812 4095 +0 3840 4095 +0 3875 4095 +0 3918 4095 +0 3970 4095 +0 4022 4095 +0 4084 4095 +0 4095 4095 +0 4095 4095 +0 4095 4000 +0 4095 3695 +0 3608 4095 +0 3608 4095 +0 3608 4095 +0 3608 4095 +0 3608 4095 +0 3609 4095 +0 3609 4095 +0 3610 4095 +0 3611 4095 +0 3612 4095 +0 3613 4095 +0 3615 4095 +0 3617 4095 +0 3621 4095 +0 3625 4095 +0 3630 4095 +0 3638 4095 +0 3648 4095 +0 3661 4095 +0 3677 4095 +0 3699 4095 +0 3726 4095 +0 3759 4095 +0 3801 4095 +0 3851 4095 +0 3911 4095 +2192 3980 4095 +2192 4047 4095 +2192 4095 4095 +2192 4095 4095 +2192 4095 4023 +2192 4095 3738 +0 3404 4095 +0 3404 4095 +0 3404 4095 +0 3405 4095 +0 3405 4095 +0 3405 4095 +0 3406 4095 +0 3407 4095 +0 3408 4095 +0 3410 4095 +0 3412 4095 +0 3415 4095 +0 3419 4095 +0 3424 4095 +0 3430 4095 +0 3439 4095 +0 3450 4095 +0 3465 4095 +0 3484 4095 +0 3509 4095 +0 3539 4095 +0 3577 4095 +0 3623 4095 +0 3679 4095 +0 3743 4095 +0 3818 4095 +2192 3901 4095 +3118 3993 4095 +3118 4079 4095 +3118 4095 4095 +3118 4095 4051 +3118 4095 3791 +0 2761 4095 +0 2762 4095 +0 2762 4095 +0 2764 4095 +0 2765 4095 +0 2767 4095 +0 2770 4095 +0 2773 4095 +0 2778 4095 +0 2785 4095 +0 2793 4095 +0 2804 4095 +0 2818 4095 +0 2837 4095 +0 2861 4095 +0 2890 4095 +0 2927 4095 +0 2973 4095 +0 3027 4095 +0 3090 4095 +0 3164 4095 +0 3246 4095 +0 3337 4095 +0 3436 4095 +0 3541 4095 +0 3653 4095 +2192 3768 4095 +3118 3888 4095 +3469 4010 4095 +3469 4095 4095 +3469 4095 4087 +3469 4095 3853 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 2137 4095 +0 2915 4095 +0 3253 4095 +2192 3494 4095 +3118 3693 4095 +3469 3869 4095 +3714 4032 4095 +3714 4095 4095 +3714 4095 3924 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +0 0 4095 +2266 0 4095 +2814 2192 4095 +3118 3121 4095 +3469 3568 4095 +3714 3844 4095 +3916 4060 4095 +3916 4095 4005 +3533 0 4095 +3533 0 4095 +3533 0 4095 +3534 0 4095 +3534 0 4095 +3534 0 4095 +3534 0 4095 +3534 0 4095 +3534 0 4095 +3535 0 4095 +3536 0 4095 +3537 0 4095 +3538 0 4095 +3539 0 4095 +3541 0 4095 +3544 0 4095 +3547 0 4095 +3552 0 4095 +3558 0 4095 +3566 0 4095 +3576 0 4095 +3590 0 4095 +3608 0 4095 +3630 0 4095 +3659 0 4095 +3695 0 4095 +3738 2192 4095 +3791 3118 4095 +3853 3469 4095 +3924 3714 4095 +4005 3916 4095 +4095 4095 4095 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.azasset b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.azasset new file mode 100644 index 0000000000..82fbee2eee --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/o_invShaped/test_hue-sat_32_LUT.azasset @@ -0,0 +1,32777 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "LookupTableAsset", + "ClassData": { + "Name": "LookupTable", + "Intervals": [0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [0, 0, 0, +97, 163, 0, +201, 318, 0, +312, 466, 0, +427, 609, 0, +545, 750, 0, +667, 888, 0, +792, 1025, 0, +918, 1160, 0, +1046, 1295, 0, +1174, 1429, 0, +1304, 1563, 0, +1434, 1696, 0, +1565, 1828, 0, +1696, 1961, 0, +1827, 2094, 0, +1959, 2226, 0, +2090, 2358, 0, +2222, 2491, 0, +2354, 2623, 0, +2486, 2755, 0, +2618, 2887, 0, +2750, 3019, 0, +2882, 3152, 0, +3014, 3284, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +163, 0, 97, +163, 42, 0, +318, 300, 0, +419, 466, 0, +512, 609, 0, +613, 750, 0, +719, 888, 0, +832, 1025, 0, +949, 1160, 0, +1069, 1295, 0, +1192, 1429, 0, +1318, 1563, 0, +1444, 1696, 0, +1572, 1828, 0, +1702, 1961, 0, +1831, 2094, 0, +1962, 2226, 0, +2093, 2358, 0, +2224, 2491, 0, +2355, 2623, 0, +2487, 2755, 0, +2619, 2887, 0, +2750, 3019, 0, +2883, 3152, 0, +3014, 3284, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +318, 0, 201, +318, 0, 13, +318, 93, 0, +466, 388, 0, +606, 609, 0, +689, 750, 0, +781, 888, 0, +881, 1025, 0, +987, 1160, 0, +1099, 1295, 0, +1215, 1429, 0, +1335, 1563, 0, +1457, 1696, 0, +1582, 1828, 0, +1709, 1961, 0, +1837, 2094, 0, +1966, 2226, 0, +2096, 2358, 0, +2226, 2491, 0, +2357, 2623, 0, +2488, 2755, 0, +2620, 2887, 0, +2751, 3019, 0, +2883, 3152, 0, +3014, 3284, 0, +3147, 3416, 0, +3279, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +466, 0, 312, +466, 0, 171, +466, 0, 0, +466, 154, 0, +609, 485, 0, +750, 723, 0, +852, 888, 0, +939, 1025, 0, +1033, 1160, 0, +1135, 1295, 0, +1244, 1429, 0, +1357, 1563, 0, +1475, 1696, 0, +1596, 1828, 0, +1719, 1961, 0, +1845, 2094, 0, +1972, 2226, 0, +2100, 2358, 0, +2230, 2491, 0, +2359, 2623, 0, +2490, 2755, 0, +2621, 2887, 0, +2752, 3019, 0, +2884, 3152, 0, +3015, 3284, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +609, 0, 427, +609, 0, 322, +609, 0, 127, +609, 0, 0, +609, 224, 0, +750, 587, 0, +888, 838, 0, +1006, 1025, 0, +1089, 1160, 0, +1181, 1295, 0, +1280, 1429, 0, +1385, 1563, 0, +1496, 1696, 0, +1612, 1828, 0, +1732, 1961, 0, +1855, 2094, 0, +1979, 2226, 0, +2106, 2358, 0, +2234, 2491, 0, +2363, 2623, 0, +2493, 2755, 0, +2623, 2887, 0, +2754, 3019, 0, +2885, 3152, 0, +3016, 3284, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +750, 0, 545, +750, 0, 467, +750, 0, 334, +750, 0, 59, +750, 0, 0, +750, 304, 0, +888, 697, 0, +1025, 957, 0, +1154, 1160, 0, +1234, 1295, 0, +1323, 1429, 0, +1421, 1563, 0, +1524, 1696, 0, +1634, 1828, 0, +1749, 1961, 0, +1867, 2094, 0, +1989, 2226, 0, +2113, 2358, 0, +2239, 2491, 0, +2367, 2623, 0, +2496, 2755, 0, +2625, 2887, 0, +2755, 3019, 0, +2886, 3152, 0, +3017, 3284, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 667, +888, 0, 608, +888, 0, 515, +888, 0, 350, +888, 0, 0, +888, 0, 0, +888, 392, 0, +1025, 811, 0, +1160, 1079, 0, +1295, 1292, 0, +1376, 1429, 0, +1463, 1563, 0, +1559, 1696, 0, +1661, 1828, 0, +1770, 1961, 0, +1884, 2094, 0, +2002, 2226, 0, +2123, 2358, 0, +2247, 2491, 0, +2372, 2623, 0, +2500, 2755, 0, +2628, 2887, 0, +2758, 3019, 0, +2888, 3152, 0, +3018, 3284, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 792, +1025, 0, 748, +1025, 0, 681, +1025, 0, 573, +1025, 0, 371, +1025, 0, 0, +1025, 0, 0, +1025, 488, 0, +1160, 929, 0, +1295, 1204, 0, +1429, 1419, 0, +1515, 1563, 0, +1601, 1696, 0, +1696, 1828, 0, +1797, 1961, 0, +1905, 2094, 0, +2018, 2226, 0, +2136, 2358, 0, +2256, 2491, 0, +2380, 2623, 0, +2505, 2755, 0, +2633, 2887, 0, +2761, 3019, 0, +2890, 3152, 0, +3020, 3284, 0, +3151, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3939, 4095, 0, +1160, 0, 918, +1160, 0, 885, +1160, 0, 836, +1160, 0, 762, +1160, 0, 640, +1160, 0, 397, +1160, 0, 0, +1160, 0, 0, +1160, 592, 0, +1295, 1051, 0, +1429, 1330, 0, +1563, 1548, 0, +1653, 1696, 0, +1738, 1828, 0, +1831, 1961, 0, +1932, 2094, 0, +2039, 2226, 0, +2152, 2358, 0, +2269, 2491, 0, +2390, 2623, 0, +2513, 2755, 0, +2638, 2887, 0, +2765, 3019, 0, +2893, 3152, 0, +3022, 3284, 0, +3152, 3416, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1046, +1295, 0, 1021, +1295, 0, 985, +1295, 0, 934, +1295, 0, 853, +1295, 0, 717, +1295, 0, 431, +1295, 0, 0, +1295, 0, 0, +1295, 702, 0, +1429, 1174, 0, +1563, 1458, 0, +1696, 1677, 0, +1789, 1828, 0, +1873, 1961, 0, +1966, 2094, 0, +2066, 2226, 0, +2173, 2358, 0, +2285, 2491, 0, +2402, 2623, 0, +2523, 2755, 0, +2646, 2887, 0, +2771, 3019, 0, +2898, 3152, 0, +3025, 3284, 0, +3155, 3416, 0, +3285, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1174, +1429, 0, 1156, +1429, 0, 1130, +1429, 0, 1092, +1429, 0, 1037, +1429, 0, 951, +1429, 0, 803, +1429, 0, 471, +1429, 0, 0, +1429, 0, 0, +1429, 816, 0, +1563, 1301, 0, +1696, 1587, 0, +1828, 1807, 0, +1923, 1961, 0, +2007, 2094, 0, +2100, 2226, 0, +2200, 2358, 0, +2306, 2491, 0, +2419, 2623, 0, +2535, 2755, 0, +2655, 2887, 0, +2778, 3019, 0, +2903, 3152, 0, +3030, 3284, 0, +3158, 3416, 0, +3287, 3548, 0, +3417, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1304, +1563, 0, 1290, +1563, 0, 1271, +1563, 0, 1244, +1563, 0, 1205, +1563, 0, 1148, +1563, 0, 1057, +1563, 0, 897, +1563, 0, 523, +1563, 0, 0, +1563, 0, 0, +1563, 934, 0, +1696, 1427, 0, +1828, 1716, 0, +1961, 1938, 0, +2058, 2094, 0, +2141, 2226, 0, +2233, 2358, 0, +2333, 2491, 0, +2440, 2623, 0, +2552, 2755, 0, +2668, 2887, 0, +2788, 3019, 0, +2911, 3152, 0, +3035, 3284, 0, +3162, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1434, +1696, 0, 1424, +1696, 0, 1410, +1696, 0, 1390, +1696, 0, 1362, +1696, 0, 1322, +1696, 0, 1262, +1696, 0, 1167, +1696, 0, 998, +1696, 0, 580, +1696, 0, 0, +1696, 0, 0, +1696, 1056, 0, +1828, 1557, 0, +1961, 1847, 0, +2094, 2069, 0, +2191, 2226, 0, +2275, 2358, 0, +2367, 2491, 0, +2466, 2623, 0, +2573, 2755, 0, +2684, 2887, 0, +2800, 3019, 0, +2920, 3152, 0, +3043, 3284, 0, +3168, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3552, 3812, 0, +3681, 3944, 0, +3812, 4076, 0, +3942, 4095, 0, +1828, 0, 1565, +1828, 0, 1557, +1828, 0, 1547, +1828, 0, 1532, +1828, 0, 1512, +1828, 0, 1484, +1828, 0, 1442, +1828, 0, 1381, +1828, 0, 1283, +1828, 0, 1106, +1828, 0, 650, +1828, 0, 0, +1828, 0, 0, +1828, 1180, 0, +1961, 1686, 0, +2094, 1977, 0, +2226, 2200, 0, +2325, 2358, 0, +2408, 2491, 0, +2500, 2623, 0, +2599, 2755, 0, +2705, 2887, 0, +2816, 3019, 0, +2933, 3152, 0, +3052, 3284, 0, +3175, 3416, 0, +3300, 3548, 0, +3427, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1696, +1961, 0, 1690, +1961, 0, 1682, +1961, 0, 1672, +1961, 0, 1657, +1961, 0, 1636, +1961, 0, 1607, +1961, 0, 1565, +1961, 0, 1503, +1961, 0, 1402, +1961, 0, 1220, +1961, 0, 726, +1961, 0, 0, +1961, 0, 0, +1961, 1306, 0, +2094, 1816, 0, +2226, 2108, 0, +2358, 2332, 0, +2458, 2491, 0, +2541, 2623, 0, +2632, 2755, 0, +2732, 2887, 0, +2837, 3019, 0, +2949, 3152, 0, +3065, 3284, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2094, 0, 1827, +2094, 0, 1823, +2094, 0, 1817, +2094, 0, 1809, +2094, 0, 1798, +2094, 0, 1783, +2094, 0, 1763, +2094, 0, 1733, +2094, 0, 1691, +2094, 0, 1626, +2094, 0, 1524, +2094, 0, 1336, +2094, 0, 814, +2094, 0, 0, +2094, 0, 0, +2094, 1433, 0, +2226, 1946, 0, +2358, 2239, 0, +2491, 2463, 0, +2590, 2623, 0, +2673, 2755, 0, +2765, 2887, 0, +2864, 3019, 0, +2970, 3152, 0, +3081, 3284, 0, +3197, 3416, 0, +3317, 3548, 0, +3440, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2226, 0, 1959, +2226, 0, 1956, +2226, 0, 1951, +2226, 0, 1945, +2226, 0, 1937, +2226, 0, 1926, +2226, 0, 1911, +2226, 0, 1890, +2226, 0, 1860, +2226, 0, 1817, +2226, 0, 1753, +2226, 0, 1648, +2226, 0, 1457, +2226, 0, 907, +2226, 0, 0, +2226, 0, 0, +2226, 1562, 0, +2358, 2078, 0, +2491, 2371, 0, +2623, 2595, 0, +2723, 2755, 0, +2806, 2887, 0, +2897, 3019, 0, +2996, 3152, 0, +3102, 3284, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3572, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2090, +2358, 0, 2088, +2358, 0, 2085, +2358, 0, 2080, +2358, 0, 2074, +2358, 0, 2066, +2358, 0, 2055, +2358, 0, 2040, +2358, 0, 2019, +2358, 0, 1989, +2358, 0, 1946, +2358, 0, 1880, +2358, 0, 1775, +2358, 0, 1580, +2358, 0, 1009, +2358, 0, 0, +2358, 0, 0, +2358, 1692, 0, +2491, 2209, 0, +2623, 2503, 0, +2755, 2727, 0, +2856, 2887, 0, +2938, 3019, 0, +3030, 3152, 0, +3128, 3284, 0, +3234, 3416, 0, +3346, 3548, 0, +3462, 3680, 0, +3581, 3812, 0, +3704, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2222, +2491, 0, 2220, +2491, 0, 2218, +2491, 0, 2215, +2491, 0, 2210, +2491, 0, 2204, +2491, 0, 2196, +2491, 0, 2185, +2491, 0, 2170, +2491, 0, 2149, +2491, 0, 2119, +2491, 0, 2075, +2491, 0, 2009, +2491, 0, 1903, +2491, 0, 1706, +2491, 0, 1120, +2491, 0, 0, +2491, 0, 0, +2491, 1822, 0, +2623, 2340, 0, +2755, 2635, 0, +2887, 2859, 0, +2988, 3019, 0, +3071, 3152, 0, +3162, 3284, 0, +3261, 3416, 0, +3367, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2354, +2623, 0, 2352, +2623, 0, 2351, +2623, 0, 2348, +2623, 0, 2345, +2623, 0, 2341, +2623, 0, 2335, +2623, 0, 2327, +2623, 0, 2315, +2623, 0, 2300, +2623, 0, 2278, +2623, 0, 2248, +2623, 0, 2205, +2623, 0, 2138, +2623, 0, 2032, +2623, 0, 1833, +2623, 0, 1232, +2623, 0, 0, +2623, 0, 0, +2623, 1952, 0, +2755, 2473, 0, +2887, 2767, 0, +3019, 2991, 0, +3120, 3152, 0, +3203, 3284, 0, +3294, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3846, 4076, 0, +3968, 4095, 0, +2755, 0, 2486, +2755, 0, 2485, +2755, 0, 2484, +2755, 0, 2482, +2755, 0, 2479, +2755, 0, 2476, +2755, 0, 2472, +2755, 0, 2466, +2755, 0, 2457, +2755, 0, 2446, +2755, 0, 2431, +2755, 0, 2409, +2755, 0, 2379, +2755, 0, 2335, +2755, 0, 2269, +2755, 0, 2162, +2755, 0, 1962, +2755, 0, 1353, +2755, 0, 0, +2755, 0, 0, +2755, 2083, 0, +2887, 2604, 0, +3019, 2898, 0, +3152, 3123, 0, +3252, 3284, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2618, +2887, 0, 2617, +2887, 0, 2616, +2887, 0, 2615, +2887, 0, 2613, +2887, 0, 2611, +2887, 0, 2607, +2887, 0, 2603, +2887, 0, 2597, +2887, 0, 2589, +2887, 0, 2577, +2887, 0, 2562, +2887, 0, 2541, +2887, 0, 2510, +2887, 0, 2466, +2887, 0, 2400, +2887, 0, 2292, +2887, 0, 2091, +2887, 0, 1472, +2887, 0, 0, +2887, 0, 0, +2887, 2215, 0, +3019, 2735, 0, +3152, 3031, 0, +3284, 3254, 0, +3385, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2748, +3019, 0, 2747, +3019, 0, 2746, +3019, 0, 2744, +3019, 0, 2742, +3019, 0, 2738, +3019, 0, 2734, +3019, 0, 2728, +3019, 0, 2720, +3019, 0, 2708, +3019, 0, 2693, +3019, 0, 2672, +3019, 0, 2641, +3019, 0, 2597, +3019, 0, 2530, +3019, 0, 2422, +3019, 0, 2220, +3019, 0, 1594, +3019, 0, 0, +3019, 0, 0, +3019, 2346, 0, +3152, 2868, 0, +3284, 3162, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3691, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4007, 4095, 0, +3152, 0, 2882, +3152, 0, 2881, +3152, 0, 2881, +3152, 0, 2880, +3152, 0, 2879, +3152, 0, 2878, +3152, 0, 2876, +3152, 0, 2873, +3152, 0, 2870, +3152, 0, 2866, +3152, 0, 2860, +3152, 0, 2851, +3152, 0, 2840, +3152, 0, 2825, +3152, 0, 2803, +3152, 0, 2773, +3152, 0, 2729, +3152, 0, 2662, +3152, 0, 2554, +3152, 0, 2352, +3152, 0, 1720, +3152, 0, 0, +3152, 0, 0, +3152, 2478, 0, +3284, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3732, 3812, 0, +3823, 3944, 0, +3922, 4076, 0, +4027, 4095, 0, +3284, 0, 3014, +3284, 0, 3014, +3284, 0, 3013, +3284, 0, 3012, +3284, 0, 3012, +3284, 0, 3011, +3284, 0, 3009, +3284, 0, 3008, +3284, 0, 3005, +3284, 0, 3002, +3284, 0, 2997, +3284, 0, 2991, +3284, 0, 2983, +3284, 0, 2972, +3284, 0, 2956, +3284, 0, 2935, +3284, 0, 2904, +3284, 0, 2860, +3284, 0, 2793, +3284, 0, 2684, +3284, 0, 2481, +3284, 0, 1844, +3284, 0, 0, +3284, 0, 0, +3284, 2609, 0, +3416, 3132, 0, +3548, 3426, 0, +3680, 3651, 0, +3781, 3812, 0, +3864, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3141, +3416, 0, 3139, +3416, 0, 3137, +3416, 0, 3134, +3416, 0, 3129, +3416, 0, 3123, +3416, 0, 3115, +3416, 0, 3104, +3416, 0, 3088, +3416, 0, 3067, +3416, 0, 3036, +3416, 0, 2992, +3416, 0, 2925, +3416, 0, 2816, +3416, 0, 2613, +3416, 0, 1977, +3416, 0, 0, +3416, 0, 0, +3416, 2741, 0, +3548, 3264, 0, +3680, 3558, 0, +3812, 3783, 0, +3913, 3944, 0, +3996, 4076, 0, +4087, 4095, 0, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3271, +3548, 0, 3269, +3548, 0, 3266, +3548, 0, 3261, +3548, 0, 3255, +3548, 0, 3247, +3548, 0, 3236, +3548, 0, 3220, +3548, 0, 3198, +3548, 0, 3168, +3548, 0, 3124, +3548, 0, 3056, +3548, 0, 2948, +3548, 0, 2745, +3548, 0, 2104, +3548, 0, 0, +3548, 0, 0, +3548, 2873, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3408, +3680, 0, 3406, +3680, 0, 3405, +3680, 0, 3403, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3393, +3680, 0, 3387, +3680, 0, 3379, +3680, 0, 3367, +3680, 0, 3352, +3680, 0, 3330, +3680, 0, 3300, +3680, 0, 3255, +3680, 0, 3188, +3680, 0, 3080, +3680, 0, 2876, +3680, 0, 2237, +3680, 0, 0, +3680, 0, 0, +3680, 3005, 0, +3812, 3528, 0, +3944, 3822, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3537, +3812, 0, 3535, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3525, +3812, 0, 3519, +3812, 0, 3511, +3812, 0, 3499, +3812, 0, 3484, +3812, 0, 3462, +3812, 0, 3432, +3812, 0, 3387, +3812, 0, 3320, +3812, 0, 3211, +3812, 0, 3008, +3812, 0, 2367, +3812, 0, 0, +3812, 0, 0, +3812, 3137, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3669, +3944, 0, 3667, +3944, 0, 3665, +3944, 0, 3661, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3631, +3944, 0, 3616, +3944, 0, 3594, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3452, +3944, 0, 3344, +3944, 0, 3140, +3944, 0, 2497, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3791, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3774, +4076, 0, 3763, +4076, 0, 3748, +4076, 0, 3726, +4076, 0, 3696, +4076, 0, 3651, +4076, 0, 3584, +4076, 0, 3475, +4076, 0, 3271, +4076, 0, 2626, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3716, +4095, 0, 3608, +4095, 0, 3404, +4095, 0, 2761, +4095, 0, 0, +4095, 0, 0, +4095, 3533, 0, +0, 97, 163, +0, 163, 42, +13, 318, 0, +171, 466, 0, +322, 609, 0, +467, 750, 0, +608, 888, 0, +748, 1025, 0, +885, 1160, 0, +1021, 1295, 0, +1156, 1429, 0, +1290, 1563, 0, +1424, 1696, 0, +1557, 1828, 0, +1690, 1961, 0, +1823, 2094, 0, +1956, 2226, 0, +2088, 2358, 0, +2220, 2491, 0, +2352, 2623, 0, +2485, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3152, 0, +3014, 3284, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +42, 0, 163, +131, 131, 131, +229, 295, 86, +333, 450, 15, +444, 598, 0, +559, 741, 0, +678, 882, 0, +800, 1020, 0, +924, 1157, 0, +1050, 1292, 0, +1178, 1427, 0, +1307, 1561, 0, +1436, 1695, 0, +1566, 1828, 0, +1697, 1961, 0, +1828, 2093, 0, +1959, 2226, 0, +2091, 2358, 0, +2223, 2491, 0, +2354, 2623, 0, +2486, 2755, 0, +2618, 2887, 0, +2750, 3019, 0, +2882, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +300, 0, 318, +295, 86, 229, +295, 174, 86, +450, 432, 15, +551, 598, 0, +644, 741, 0, +745, 882, 0, +852, 1020, 0, +964, 1157, 0, +1081, 1292, 0, +1201, 1427, 0, +1325, 1561, 0, +1450, 1695, 0, +1576, 1828, 0, +1705, 1961, 0, +1834, 2093, 0, +1963, 2226, 0, +2094, 2358, 0, +2225, 2491, 0, +2356, 2623, 0, +2488, 2755, 0, +2619, 2887, 0, +2751, 3019, 0, +2883, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +466, 0, 419, +450, 15, 333, +450, 15, 145, +450, 225, 15, +598, 520, 0, +738, 741, 0, +822, 882, 0, +914, 1020, 0, +1013, 1157, 0, +1119, 1292, 0, +1231, 1427, 0, +1347, 1561, 0, +1467, 1695, 0, +1590, 1828, 0, +1715, 1961, 0, +1841, 2093, 0, +1969, 2226, 0, +2098, 2358, 0, +2228, 2491, 0, +2358, 2623, 0, +2489, 2755, 0, +2620, 2887, 0, +2752, 3019, 0, +2883, 3152, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +609, 0, 512, +598, 0, 444, +598, 0, 303, +598, 0, 0, +598, 286, 0, +741, 616, 0, +882, 855, 0, +985, 1020, 0, +1071, 1157, 0, +1166, 1292, 0, +1267, 1427, 0, +1376, 1561, 0, +1489, 1695, 0, +1607, 1828, 0, +1728, 1961, 0, +1851, 2093, 0, +1977, 2226, 0, +2104, 2358, 0, +2233, 2491, 0, +2362, 2623, 0, +2492, 2755, 0, +2622, 2887, 0, +2753, 3019, 0, +2885, 3152, 0, +3016, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +750, 0, 613, +741, 0, 559, +741, 0, 453, +741, 0, 258, +741, 0, 0, +741, 356, 0, +882, 719, 0, +1020, 970, 0, +1139, 1157, 0, +1221, 1292, 0, +1313, 1427, 0, +1412, 1561, 0, +1517, 1695, 0, +1629, 1828, 0, +1745, 1961, 0, +1864, 2093, 0, +1987, 2226, 0, +2111, 2358, 0, +2238, 2491, 0, +2366, 2623, 0, +2495, 2755, 0, +2625, 2887, 0, +2755, 3019, 0, +2886, 3152, 0, +3017, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 719, +882, 0, 678, +882, 0, 599, +882, 0, 466, +882, 0, 190, +882, 0, 0, +882, 436, 0, +1020, 829, 0, +1157, 1089, 0, +1286, 1292, 0, +1366, 1427, 0, +1456, 1561, 0, +1552, 1695, 0, +1656, 1828, 0, +1766, 1961, 0, +1881, 2093, 0, +1999, 2226, 0, +2121, 2358, 0, +2245, 2491, 0, +2372, 2623, 0, +2499, 2755, 0, +2628, 2887, 0, +2757, 3019, 0, +2888, 3152, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 832, +1020, 0, 800, +1020, 0, 740, +1020, 0, 647, +1020, 0, 482, +1020, 0, 81, +1020, 0, 0, +1020, 524, 0, +1157, 943, 0, +1292, 1211, 0, +1427, 1424, 0, +1508, 1561, 0, +1596, 1695, 0, +1691, 1828, 0, +1793, 1961, 0, +1902, 2093, 0, +2016, 2226, 0, +2134, 2358, 0, +2255, 2491, 0, +2379, 2623, 0, +2505, 2755, 0, +2632, 2887, 0, +2760, 3019, 0, +2890, 3152, 0, +3020, 3283, 0, +3151, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 949, +1157, 0, 924, +1157, 0, 879, +1157, 0, 813, +1157, 0, 705, +1157, 0, 503, +1157, 0, 0, +1157, 0, 0, +1157, 620, 0, +1292, 1062, 0, +1427, 1336, 0, +1561, 1552, 0, +1647, 1695, 0, +1733, 1828, 0, +1828, 1961, 0, +1929, 2093, 0, +2037, 2226, 0, +2150, 2358, 0, +2268, 2491, 0, +2388, 2623, 0, +2512, 2755, 0, +2638, 2887, 0, +2765, 3019, 0, +2893, 3152, 0, +3022, 3283, 0, +3152, 3416, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1069, +1292, 0, 1050, +1292, 0, 1017, +1292, 0, 968, +1292, 0, 894, +1292, 0, 772, +1292, 0, 529, +1292, 0, 0, +1292, 0, 0, +1292, 724, 0, +1427, 1182, 0, +1561, 1463, 0, +1695, 1680, 0, +1785, 1828, 0, +1870, 1961, 0, +1963, 2093, 0, +2064, 2226, 0, +2171, 2358, 0, +2284, 2491, 0, +2401, 2623, 0, +2522, 2755, 0, +2645, 2887, 0, +2770, 3019, 0, +2897, 3152, 0, +3025, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1192, +1427, 0, 1178, +1427, 0, 1153, +1427, 0, 1118, +1427, 0, 1065, +1427, 0, 985, +1427, 0, 849, +1427, 0, 562, +1427, 0, 0, +1427, 0, 0, +1427, 833, 0, +1561, 1307, 0, +1695, 1590, 0, +1828, 1810, 0, +1920, 1961, 0, +2005, 2093, 0, +2098, 2226, 0, +2199, 2358, 0, +2305, 2491, 0, +2417, 2623, 0, +2535, 2755, 0, +2655, 2887, 0, +2777, 3019, 0, +2903, 3152, 0, +3029, 3283, 0, +3158, 3416, 0, +3287, 3548, 0, +3417, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1318, +1561, 0, 1307, +1561, 0, 1288, +1561, 0, 1262, +1561, 0, 1225, +1561, 0, 1170, +1561, 0, 1084, +1561, 0, 935, +1561, 0, 605, +1561, 0, 0, +1561, 0, 0, +1561, 948, 0, +1695, 1432, 0, +1828, 1719, 0, +1961, 1940, 0, +2056, 2093, 0, +2140, 2226, 0, +2232, 2358, 0, +2332, 2491, 0, +2439, 2623, 0, +2551, 2755, 0, +2667, 2887, 0, +2787, 3019, 0, +2910, 3152, 0, +3035, 3283, 0, +3162, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1444, +1695, 0, 1436, +1695, 0, 1422, +1695, 0, 1403, +1695, 0, 1376, +1695, 0, 1337, +1695, 0, 1279, +1695, 0, 1188, +1695, 0, 1029, +1695, 0, 653, +1695, 0, 0, +1695, 0, 0, +1695, 1066, 0, +1828, 1560, 0, +1961, 1849, 0, +2093, 2070, 0, +2190, 2226, 0, +2273, 2358, 0, +2366, 2491, 0, +2465, 2623, 0, +2572, 2755, 0, +2684, 2887, 0, +2800, 3019, 0, +2920, 3152, 0, +3042, 3283, 0, +3168, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1572, +1828, 0, 1566, +1828, 0, 1556, +1828, 0, 1542, +1828, 0, 1522, +1828, 0, 1494, +1828, 0, 1454, +1828, 0, 1394, +1828, 0, 1300, +1828, 0, 1131, +1828, 0, 713, +1828, 0, 0, +1828, 0, 0, +1828, 1188, 0, +1961, 1689, 0, +2093, 1979, 0, +2226, 2201, 0, +2324, 2358, 0, +2407, 2491, 0, +2499, 2623, 0, +2598, 2755, 0, +2705, 2887, 0, +2816, 3019, 0, +2932, 3152, 0, +3052, 3283, 0, +3175, 3416, 0, +3300, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1702, +1961, 0, 1697, +1961, 0, 1689, +1961, 0, 1679, +1961, 0, 1664, +1961, 0, 1644, +1961, 0, 1615, +1961, 0, 1574, +1961, 0, 1513, +1961, 0, 1415, +1961, 0, 1238, +1961, 0, 780, +1961, 0, 0, +1961, 0, 0, +1961, 1312, 0, +2093, 1818, 0, +2226, 2109, 0, +2358, 2332, 0, +2457, 2491, 0, +2540, 2623, 0, +2632, 2755, 0, +2731, 2887, 0, +2837, 3019, 0, +2949, 3152, 0, +3065, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2094, 0, 1831, +2093, 0, 1828, +2093, 0, 1822, +2093, 0, 1814, +2093, 0, 1804, +2093, 0, 1789, +2093, 0, 1768, +2093, 0, 1739, +2093, 0, 1698, +2093, 0, 1635, +2093, 0, 1534, +2093, 0, 1351, +2093, 0, 859, +2093, 0, 0, +2093, 0, 0, +2093, 1438, 0, +2226, 1948, 0, +2358, 2240, 0, +2491, 2464, 0, +2590, 2623, 0, +2673, 2755, 0, +2764, 2887, 0, +2863, 3019, 0, +2970, 3152, 0, +3081, 3283, 0, +3197, 3416, 0, +3317, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2226, 0, 1962, +2226, 0, 1959, +2226, 0, 1955, +2226, 0, 1949, +2226, 0, 1941, +2226, 0, 1930, +2226, 0, 1915, +2226, 0, 1894, +2226, 0, 1865, +2226, 0, 1823, +2226, 0, 1759, +2226, 0, 1656, +2226, 0, 1469, +2226, 0, 944, +2226, 0, 0, +2226, 0, 0, +2226, 1565, 0, +2358, 2079, 0, +2491, 2372, 0, +2623, 2595, 0, +2723, 2755, 0, +2805, 2887, 0, +2897, 3019, 0, +2996, 3152, 0, +3102, 3283, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3572, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2093, +2358, 0, 2091, +2358, 0, 2087, +2358, 0, 2083, +2358, 0, 2077, +2358, 0, 2069, +2358, 0, 2058, +2358, 0, 2043, +2358, 0, 2022, +2358, 0, 1993, +2358, 0, 1950, +2358, 0, 1885, +2358, 0, 1781, +2358, 0, 1589, +2358, 0, 1039, +2358, 0, 0, +2358, 0, 0, +2358, 1694, 0, +2491, 2210, 0, +2623, 2503, 0, +2755, 2727, 0, +2855, 2887, 0, +2938, 3019, 0, +3029, 3152, 0, +3128, 3283, 0, +3234, 3416, 0, +3346, 3548, 0, +3462, 3680, 0, +3581, 3812, 0, +3704, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2224, +2491, 0, 2223, +2491, 0, 2220, +2491, 0, 2217, +2491, 0, 2212, +2491, 0, 2206, +2491, 0, 2199, +2491, 0, 2187, +2491, 0, 2172, +2491, 0, 2151, +2491, 0, 2121, +2491, 0, 2078, +2491, 0, 2013, +2491, 0, 1907, +2491, 0, 1713, +2491, 0, 1143, +2491, 0, 0, +2491, 0, 0, +2491, 1824, 0, +2623, 2341, 0, +2755, 2635, 0, +2887, 2859, 0, +2987, 3019, 0, +3070, 3152, 0, +3162, 3283, 0, +3261, 3416, 0, +3367, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2355, +2623, 0, 2354, +2623, 0, 2352, +2623, 0, 2350, +2623, 0, 2347, +2623, 0, 2342, +2623, 0, 2336, +2623, 0, 2328, +2623, 0, 2317, +2623, 0, 2302, +2623, 0, 2281, +2623, 0, 2250, +2623, 0, 2207, +2623, 0, 2141, +2623, 0, 2035, +2623, 0, 1838, +2623, 0, 1251, +2623, 0, 0, +2623, 0, 0, +2623, 1954, 0, +2755, 2473, 0, +2887, 2767, 0, +3019, 2991, 0, +3120, 3152, 0, +3203, 3283, 0, +3294, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2487, +2755, 0, 2486, +2755, 0, 2485, +2755, 0, 2483, +2755, 0, 2481, +2755, 0, 2477, +2755, 0, 2473, +2755, 0, 2467, +2755, 0, 2459, +2755, 0, 2448, +2755, 0, 2432, +2755, 0, 2411, +2755, 0, 2381, +2755, 0, 2337, +2755, 0, 2271, +2755, 0, 2164, +2755, 0, 1966, +2755, 0, 1367, +2755, 0, 0, +2755, 0, 0, +2755, 2084, 0, +2887, 2604, 0, +3019, 2898, 0, +3152, 3123, 0, +3252, 3283, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2619, +2887, 0, 2618, +2887, 0, 2617, +2887, 0, 2616, +2887, 0, 2614, +2887, 0, 2612, +2887, 0, 2608, +2887, 0, 2604, +2887, 0, 2598, +2887, 0, 2589, +2887, 0, 2578, +2887, 0, 2563, +2887, 0, 2542, +2887, 0, 2511, +2887, 0, 2467, +2887, 0, 2401, +2887, 0, 2294, +2887, 0, 2094, +2887, 0, 1483, +2887, 0, 0, +2887, 0, 0, +2887, 2215, 0, +3019, 2735, 0, +3152, 3031, 0, +3283, 3254, 0, +3385, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2750, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2748, +3019, 0, 2747, +3019, 0, 2745, +3019, 0, 2742, +3019, 0, 2739, +3019, 0, 2735, +3019, 0, 2729, +3019, 0, 2720, +3019, 0, 2709, +3019, 0, 2694, +3019, 0, 2672, +3019, 0, 2642, +3019, 0, 2598, +3019, 0, 2531, +3019, 0, 2424, +3019, 0, 2222, +3019, 0, 1602, +3019, 0, 0, +3019, 0, 0, +3019, 2346, 0, +3152, 2868, 0, +3283, 3162, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3691, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2883, +3152, 0, 2882, +3152, 0, 2881, +3152, 0, 2881, +3152, 0, 2880, +3152, 0, 2878, +3152, 0, 2877, +3152, 0, 2874, +3152, 0, 2871, +3152, 0, 2866, +3152, 0, 2860, +3152, 0, 2852, +3152, 0, 2841, +3152, 0, 2825, +3152, 0, 2804, +3152, 0, 2773, +3152, 0, 2729, +3152, 0, 2663, +3152, 0, 2555, +3152, 0, 2353, +3152, 0, 1726, +3152, 0, 0, +3152, 0, 0, +3152, 2478, 0, +3283, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3731, 3812, 0, +3823, 3944, 0, +3922, 4076, 0, +4027, 4095, 0, +3284, 0, 3014, +3283, 0, 3014, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3012, +3283, 0, 3011, +3283, 0, 3010, +3283, 0, 3008, +3283, 0, 3005, +3283, 0, 3002, +3283, 0, 2998, +3283, 0, 2992, +3283, 0, 2983, +3283, 0, 2972, +3283, 0, 2957, +3283, 0, 2935, +3283, 0, 2905, +3283, 0, 2860, +3283, 0, 2793, +3283, 0, 2685, +3283, 0, 2482, +3283, 0, 1849, +3283, 0, 0, +3283, 0, 0, +3283, 2609, 0, +3416, 3132, 0, +3548, 3426, 0, +3680, 3651, 0, +3781, 3812, 0, +3864, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3141, +3416, 0, 3140, +3416, 0, 3137, +3416, 0, 3134, +3416, 0, 3129, +3416, 0, 3123, +3416, 0, 3115, +3416, 0, 3104, +3416, 0, 3088, +3416, 0, 3067, +3416, 0, 3036, +3416, 0, 2992, +3416, 0, 2925, +3416, 0, 2817, +3416, 0, 2614, +3416, 0, 1981, +3416, 0, 0, +3416, 0, 0, +3416, 2741, 0, +3548, 3264, 0, +3680, 3558, 0, +3812, 3783, 0, +3913, 3944, 0, +3996, 4076, 0, +4087, 4095, 0, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3272, +3548, 0, 3269, +3548, 0, 3266, +3548, 0, 3261, +3548, 0, 3255, +3548, 0, 3247, +3548, 0, 3236, +3548, 0, 3220, +3548, 0, 3199, +3548, 0, 3168, +3548, 0, 3124, +3548, 0, 3057, +3548, 0, 2948, +3548, 0, 2745, +3548, 0, 2107, +3548, 0, 0, +3548, 0, 0, +3548, 2873, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3405, +3680, 0, 3403, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3393, +3680, 0, 3387, +3680, 0, 3379, +3680, 0, 3368, +3680, 0, 3352, +3680, 0, 3331, +3680, 0, 3300, +3680, 0, 3256, +3680, 0, 3188, +3680, 0, 3080, +3680, 0, 2877, +3680, 0, 2239, +3680, 0, 0, +3680, 0, 0, +3680, 3005, 0, +3812, 3528, 0, +3944, 3822, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3537, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3525, +3812, 0, 3519, +3812, 0, 3511, +3812, 0, 3499, +3812, 0, 3484, +3812, 0, 3462, +3812, 0, 3432, +3812, 0, 3388, +3812, 0, 3321, +3812, 0, 3212, +3812, 0, 3009, +3812, 0, 2369, +3812, 0, 0, +3812, 0, 0, +3812, 3137, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3667, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3616, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3452, +3944, 0, 3344, +3944, 0, 3140, +3944, 0, 2498, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3763, +4076, 0, 3748, +4076, 0, 3726, +4076, 0, 3696, +4076, 0, 3651, +4076, 0, 3584, +4076, 0, 3475, +4076, 0, 3272, +4076, 0, 2627, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3404, +4095, 0, 2762, +4095, 0, 0, +4095, 0, 0, +4095, 3533, 0, +0, 201, 318, +0, 318, 300, +0, 318, 93, +0, 466, 0, +127, 609, 0, +334, 750, 0, +515, 888, 0, +681, 1025, 0, +836, 1160, 0, +985, 1295, 0, +1130, 1429, 0, +1271, 1563, 0, +1410, 1696, 0, +1547, 1828, 0, +1682, 1961, 0, +1817, 2094, 0, +1951, 2226, 0, +2085, 2358, 0, +2218, 2491, 0, +2351, 2623, 0, +2484, 2755, 0, +2616, 2887, 0, +2748, 3019, 0, +2881, 3152, 0, +3013, 3284, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 13, 318, +86, 229, 295, +86, 295, 174, +145, 450, 15, +303, 598, 0, +453, 741, 0, +599, 882, 0, +740, 1020, 0, +879, 1157, 0, +1017, 1292, 0, +1153, 1427, 0, +1288, 1561, 0, +1422, 1695, 0, +1556, 1828, 0, +1689, 1961, 0, +1822, 2093, 0, +1955, 2226, 0, +2087, 2358, 0, +2220, 2491, 0, +2352, 2623, 0, +2485, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +93, 0, 318, +174, 86, 295, +264, 264, 264, +361, 427, 218, +466, 582, 148, +576, 730, 34, +691, 873, 0, +810, 1014, 0, +932, 1152, 0, +1056, 1289, 0, +1182, 1424, 0, +1310, 1559, 0, +1439, 1693, 0, +1568, 1827, 0, +1699, 1960, 0, +1829, 2093, 0, +1960, 2225, 0, +2091, 2358, 0, +2223, 2490, 0, +2355, 2623, 0, +2486, 2755, 0, +2618, 2887, 0, +2750, 3019, 0, +2882, 3152, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +388, 0, 466, +432, 15, 450, +427, 218, 361, +427, 306, 218, +582, 564, 148, +683, 730, 34, +776, 873, 0, +877, 1014, 0, +984, 1152, 0, +1096, 1289, 0, +1213, 1424, 0, +1333, 1559, 0, +1456, 1693, 0, +1582, 1827, 0, +1708, 1960, 0, +1837, 2093, 0, +1966, 2225, 0, +2096, 2358, 0, +2226, 2490, 0, +2357, 2623, 0, +2488, 2755, 0, +2620, 2887, 0, +2751, 3019, 0, +2883, 3152, 0, +3014, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +609, 0, 606, +598, 0, 551, +582, 148, 466, +582, 148, 277, +582, 357, 148, +730, 652, 34, +870, 873, 0, +954, 1014, 0, +1045, 1152, 0, +1145, 1289, 0, +1251, 1424, 0, +1363, 1559, 0, +1479, 1693, 0, +1599, 1827, 0, +1722, 1960, 0, +1847, 2093, 0, +1973, 2225, 0, +2101, 2358, 0, +2230, 2490, 0, +2360, 2623, 0, +2491, 2755, 0, +2621, 2887, 0, +2752, 3019, 0, +2884, 3152, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +750, 0, 689, +741, 0, 644, +730, 34, 576, +730, 34, 435, +730, 34, 132, +730, 418, 34, +873, 749, 0, +1014, 987, 0, +1117, 1152, 0, +1203, 1289, 0, +1298, 1424, 0, +1400, 1559, 0, +1508, 1693, 0, +1621, 1827, 0, +1739, 1960, 0, +1860, 2093, 0, +1983, 2225, 0, +2109, 2358, 0, +2236, 2490, 0, +2364, 2623, 0, +2494, 2755, 0, +2624, 2887, 0, +2754, 3019, 0, +2885, 3152, 0, +3016, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 781, +882, 0, 745, +873, 0, 691, +873, 0, 585, +873, 0, 390, +873, 0, 0, +873, 488, 0, +1014, 852, 0, +1152, 1102, 0, +1271, 1289, 0, +1353, 1424, 0, +1445, 1559, 0, +1544, 1693, 0, +1650, 1827, 0, +1761, 1960, 0, +1877, 2093, 0, +1996, 2225, 0, +2119, 2358, 0, +2243, 2490, 0, +2370, 2623, 0, +2498, 2755, 0, +2627, 2887, 0, +2757, 3019, 0, +2887, 3152, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 881, +1020, 0, 852, +1014, 0, 810, +1014, 0, 731, +1014, 0, 598, +1014, 0, 323, +1014, 0, 0, +1014, 568, 0, +1152, 960, 0, +1289, 1221, 0, +1418, 1424, 0, +1499, 1559, 0, +1588, 1693, 0, +1684, 1827, 0, +1789, 1960, 0, +1898, 2093, 0, +2013, 2225, 0, +2132, 2358, 0, +2253, 2490, 0, +2378, 2623, 0, +2504, 2755, 0, +2631, 2887, 0, +2760, 3019, 0, +2890, 3152, 0, +3019, 3283, 0, +3150, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 987, +1157, 0, 964, +1152, 0, 932, +1152, 0, 873, +1152, 0, 779, +1152, 0, 614, +1152, 0, 214, +1152, 0, 0, +1152, 656, 0, +1289, 1075, 0, +1424, 1343, 0, +1559, 1556, 0, +1640, 1693, 0, +1727, 1827, 0, +1823, 1960, 0, +1926, 2093, 0, +2034, 2225, 0, +2148, 2358, 0, +2266, 2490, 0, +2387, 2623, 0, +2511, 2755, 0, +2637, 2887, 0, +2764, 3019, 0, +2893, 3152, 0, +3022, 3283, 0, +3152, 3416, 0, +3282, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1099, +1292, 0, 1081, +1289, 0, 1056, +1289, 0, 1012, +1289, 0, 945, +1289, 0, 837, +1289, 0, 635, +1289, 0, 9, +1289, 0, 0, +1289, 753, 0, +1424, 1193, 0, +1559, 1468, 0, +1693, 1683, 0, +1779, 1827, 0, +1865, 1960, 0, +1960, 2093, 0, +2061, 2225, 0, +2169, 2358, 0, +2283, 2490, 0, +2400, 2623, 0, +2521, 2755, 0, +2644, 2887, 0, +2770, 3019, 0, +2897, 3152, 0, +3025, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1215, +1427, 0, 1201, +1424, 0, 1182, +1424, 0, 1149, +1424, 0, 1101, +1424, 0, 1027, +1424, 0, 904, +1424, 0, 662, +1424, 0, 0, +1424, 0, 0, +1424, 856, 0, +1559, 1315, 0, +1693, 1594, 0, +1827, 1812, 0, +1917, 1960, 0, +2002, 2093, 0, +2095, 2225, 0, +2196, 2358, 0, +2304, 2490, 0, +2416, 2623, 0, +2533, 2755, 0, +2654, 2887, 0, +2777, 3019, 0, +2903, 3152, 0, +3029, 3283, 0, +3157, 3416, 0, +3287, 3548, 0, +3417, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1335, +1561, 0, 1325, +1559, 0, 1310, +1559, 0, 1285, +1559, 0, 1250, +1559, 0, 1198, +1559, 0, 1118, +1559, 0, 981, +1559, 0, 696, +1559, 0, 0, +1559, 0, 0, +1559, 966, 0, +1693, 1439, 0, +1827, 1722, 0, +1960, 1941, 0, +2053, 2093, 0, +2137, 2225, 0, +2230, 2358, 0, +2331, 2490, 0, +2437, 2623, 0, +2550, 2755, 0, +2667, 2887, 0, +2787, 3019, 0, +2910, 3152, 0, +3035, 3283, 0, +3162, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1457, +1695, 0, 1450, +1693, 0, 1439, +1693, 0, 1420, +1693, 0, 1394, +1693, 0, 1357, +1693, 0, 1302, +1693, 0, 1216, +1693, 0, 1067, +1693, 0, 736, +1693, 0, 0, +1693, 0, 0, +1693, 1080, 0, +1827, 1565, 0, +1960, 1851, 0, +2093, 2071, 0, +2188, 2225, 0, +2271, 2358, 0, +2364, 2490, 0, +2464, 2623, 0, +2571, 2755, 0, +2683, 2887, 0, +2799, 3019, 0, +2919, 3152, 0, +3042, 3283, 0, +3167, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1582, +1828, 0, 1576, +1827, 0, 1568, +1827, 0, 1554, +1827, 0, 1535, +1827, 0, 1508, +1827, 0, 1469, +1827, 0, 1412, +1827, 0, 1321, +1827, 0, 1161, +1827, 0, 786, +1827, 0, 0, +1827, 0, 0, +1827, 1198, 0, +1960, 1692, 0, +2093, 1981, 0, +2225, 2202, 0, +2322, 2358, 0, +2406, 2490, 0, +2498, 2623, 0, +2598, 2755, 0, +2704, 2887, 0, +2816, 3019, 0, +2932, 3152, 0, +3052, 3283, 0, +3175, 3416, 0, +3300, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1709, +1961, 0, 1705, +1960, 0, 1699, +1960, 0, 1688, +1960, 0, 1674, +1960, 0, 1654, +1960, 0, 1626, +1960, 0, 1586, +1960, 0, 1526, +1960, 0, 1431, +1960, 0, 1263, +1960, 0, 844, +1960, 0, 0, +1960, 0, 0, +1960, 1320, 0, +2093, 1821, 0, +2225, 2111, 0, +2358, 2333, 0, +2456, 2490, 0, +2539, 2623, 0, +2631, 2755, 0, +2731, 2887, 0, +2836, 3019, 0, +2948, 3152, 0, +3064, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3945, 4095, 0, +2094, 0, 1837, +2093, 0, 1834, +2093, 0, 1829, +2093, 0, 1821, +2093, 0, 1811, +2093, 0, 1796, +2093, 0, 1776, +2093, 0, 1748, +2093, 0, 1706, +2093, 0, 1645, +2093, 0, 1547, +2093, 0, 1370, +2093, 0, 913, +2093, 0, 0, +2093, 0, 0, +2093, 1444, 0, +2225, 1950, 0, +2358, 2241, 0, +2490, 2464, 0, +2589, 2623, 0, +2672, 2755, 0, +2764, 2887, 0, +2863, 3019, 0, +2969, 3152, 0, +3081, 3283, 0, +3197, 3416, 0, +3317, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2226, 0, 1966, +2226, 0, 1963, +2225, 0, 1960, +2225, 0, 1954, +2225, 0, 1946, +2225, 0, 1936, +2225, 0, 1921, +2225, 0, 1900, +2225, 0, 1871, +2225, 0, 1829, +2225, 0, 1767, +2225, 0, 1666, +2225, 0, 1484, +2225, 0, 990, +2225, 0, 0, +2225, 0, 0, +2225, 1570, 0, +2358, 2080, 0, +2490, 2373, 0, +2623, 2596, 0, +2722, 2755, 0, +2805, 2887, 0, +2896, 3019, 0, +2996, 3152, 0, +3101, 3283, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3572, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2096, +2358, 0, 2094, +2358, 0, 2091, +2358, 0, 2087, +2358, 0, 2081, +2358, 0, 2073, +2358, 0, 2062, +2358, 0, 2047, +2358, 0, 2027, +2358, 0, 1997, +2358, 0, 1955, +2358, 0, 1891, +2358, 0, 1788, +2358, 0, 1600, +2358, 0, 1076, +2358, 0, 0, +2358, 0, 0, +2358, 1698, 0, +2490, 2211, 0, +2623, 2504, 0, +2755, 2728, 0, +2855, 2887, 0, +2938, 3019, 0, +3029, 3152, 0, +3128, 3283, 0, +3234, 3416, 0, +3346, 3548, 0, +3462, 3680, 0, +3581, 3812, 0, +3704, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2226, +2491, 0, 2225, +2490, 0, 2223, +2490, 0, 2220, +2490, 0, 2215, +2490, 0, 2209, +2490, 0, 2202, +2490, 0, 2190, +2490, 0, 2175, +2490, 0, 2154, +2490, 0, 2125, +2490, 0, 2082, +2490, 0, 2017, +2490, 0, 1913, +2490, 0, 1722, +2490, 0, 1173, +2490, 0, 0, +2490, 0, 0, +2490, 1826, 0, +2623, 2342, 0, +2755, 2636, 0, +2887, 2859, 0, +2987, 3019, 0, +3070, 3152, 0, +3161, 3283, 0, +3260, 3416, 0, +3366, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2357, +2623, 0, 2356, +2623, 0, 2355, +2623, 0, 2352, +2623, 0, 2349, +2623, 0, 2345, +2623, 0, 2338, +2623, 0, 2331, +2623, 0, 2320, +2623, 0, 2304, +2623, 0, 2283, +2623, 0, 2253, +2623, 0, 2210, +2623, 0, 2144, +2623, 0, 2039, +2623, 0, 1845, +2623, 0, 1275, +2623, 0, 0, +2623, 0, 0, +2623, 1956, 0, +2755, 2474, 0, +2887, 2767, 0, +3019, 2991, 0, +3120, 3152, 0, +3202, 3283, 0, +3294, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2488, +2755, 0, 2488, +2755, 0, 2486, +2755, 0, 2485, +2755, 0, 2482, +2755, 0, 2479, +2755, 0, 2475, +2755, 0, 2469, +2755, 0, 2460, +2755, 0, 2449, +2755, 0, 2434, +2755, 0, 2413, +2755, 0, 2383, +2755, 0, 2339, +2755, 0, 2274, +2755, 0, 2167, +2755, 0, 1971, +2755, 0, 1386, +2755, 0, 0, +2755, 0, 0, +2755, 2086, 0, +2887, 2605, 0, +3019, 2898, 0, +3152, 3123, 0, +3252, 3283, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2620, +2887, 0, 2619, +2887, 0, 2618, +2887, 0, 2617, +2887, 0, 2615, +2887, 0, 2613, +2887, 0, 2609, +2887, 0, 2605, +2887, 0, 2599, +2887, 0, 2591, +2887, 0, 2580, +2887, 0, 2564, +2887, 0, 2543, +2887, 0, 2513, +2887, 0, 2469, +2887, 0, 2403, +2887, 0, 2296, +2887, 0, 2098, +2887, 0, 1497, +2887, 0, 0, +2887, 0, 0, +2887, 2217, 0, +3019, 2736, 0, +3152, 3031, 0, +3283, 3255, 0, +3384, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2751, +3019, 0, 2751, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2747, +3019, 0, 2746, +3019, 0, 2743, +3019, 0, 2740, +3019, 0, 2735, +3019, 0, 2729, +3019, 0, 2721, +3019, 0, 2710, +3019, 0, 2695, +3019, 0, 2673, +3019, 0, 2643, +3019, 0, 2599, +3019, 0, 2533, +3019, 0, 2426, +3019, 0, 2225, +3019, 0, 1613, +3019, 0, 0, +3019, 0, 0, +3019, 2347, 0, +3152, 2869, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2883, +3152, 0, 2883, +3152, 0, 2882, +3152, 0, 2881, +3152, 0, 2880, +3152, 0, 2879, +3152, 0, 2877, +3152, 0, 2875, +3152, 0, 2871, +3152, 0, 2867, +3152, 0, 2861, +3152, 0, 2853, +3152, 0, 2842, +3152, 0, 2826, +3152, 0, 2805, +3152, 0, 2774, +3152, 0, 2730, +3152, 0, 2664, +3152, 0, 2556, +3152, 0, 2355, +3152, 0, 1735, +3152, 0, 0, +3152, 0, 0, +3152, 2479, 0, +3283, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3731, 3812, 0, +3823, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3014, +3283, 0, 3014, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3013, +3283, 0, 3011, +3283, 0, 3010, +3283, 0, 3008, +3283, 0, 3006, +3283, 0, 3002, +3283, 0, 2998, +3283, 0, 2992, +3283, 0, 2984, +3283, 0, 2973, +3283, 0, 2957, +3283, 0, 2936, +3283, 0, 2905, +3283, 0, 2861, +3283, 0, 2794, +3283, 0, 2686, +3283, 0, 2484, +3283, 0, 1856, +3283, 0, 0, +3283, 0, 0, +3283, 2610, 0, +3416, 3132, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3142, +3416, 0, 3140, +3416, 0, 3138, +3416, 0, 3134, +3416, 0, 3130, +3416, 0, 3124, +3416, 0, 3115, +3416, 0, 3104, +3416, 0, 3089, +3416, 0, 3067, +3416, 0, 3037, +3416, 0, 2992, +3416, 0, 2926, +3416, 0, 2817, +3416, 0, 2615, +3416, 0, 1986, +3416, 0, 0, +3416, 0, 0, +3416, 2742, 0, +3548, 3264, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3996, 4076, 0, +4087, 4095, 0, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3274, +3548, 0, 3272, +3548, 0, 3269, +3548, 0, 3266, +3548, 0, 3261, +3548, 0, 3256, +3548, 0, 3247, +3548, 0, 3236, +3548, 0, 3221, +3548, 0, 3199, +3548, 0, 3168, +3548, 0, 3124, +3548, 0, 3057, +3548, 0, 2949, +3548, 0, 2746, +3548, 0, 2111, +3548, 0, 0, +3548, 0, 0, +3548, 2873, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3405, +3680, 0, 3404, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3393, +3680, 0, 3387, +3680, 0, 3379, +3680, 0, 3368, +3680, 0, 3353, +3680, 0, 3331, +3680, 0, 3300, +3680, 0, 3256, +3680, 0, 3189, +3680, 0, 3081, +3680, 0, 2877, +3680, 0, 2242, +3680, 0, 0, +3680, 0, 0, +3680, 3005, 0, +3812, 3528, 0, +3944, 3822, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3537, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3525, +3812, 0, 3519, +3812, 0, 3511, +3812, 0, 3500, +3812, 0, 3484, +3812, 0, 3463, +3812, 0, 3432, +3812, 0, 3388, +3812, 0, 3321, +3812, 0, 3212, +3812, 0, 3009, +3812, 0, 2371, +3812, 0, 0, +3812, 0, 0, +3812, 3137, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3616, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3453, +3944, 0, 3344, +3944, 0, 3140, +3944, 0, 2500, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3763, +4076, 0, 3748, +4076, 0, 3726, +4076, 0, 3696, +4076, 0, 3651, +4076, 0, 3585, +4076, 0, 3476, +4076, 0, 3272, +4076, 0, 2628, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3404, +4095, 0, 2762, +4095, 0, 0, +4095, 0, 0, +4095, 3533, 0, +0, 312, 466, +0, 419, 466, +0, 466, 388, +0, 466, 154, +0, 609, 0, +59, 750, 0, +350, 888, 0, +573, 1025, 0, +762, 1160, 0, +934, 1295, 0, +1092, 1429, 0, +1244, 1563, 0, +1390, 1696, 0, +1532, 1828, 0, +1672, 1961, 0, +1809, 2094, 0, +1945, 2226, 0, +2080, 2358, 0, +2215, 2491, 0, +2348, 2623, 0, +2482, 2755, 0, +2615, 2887, 0, +2747, 3019, 0, +2880, 3152, 0, +3012, 3284, 0, +3145, 3416, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 171, 466, +15, 333, 450, +15, 450, 432, +15, 450, 225, +0, 598, 0, +258, 741, 0, +466, 882, 0, +647, 1020, 0, +813, 1157, 0, +968, 1292, 0, +1118, 1427, 0, +1262, 1561, 0, +1403, 1695, 0, +1542, 1828, 0, +1679, 1961, 0, +1814, 2093, 0, +1949, 2226, 0, +2083, 2358, 0, +2217, 2491, 0, +2350, 2623, 0, +2483, 2755, 0, +2616, 2887, 0, +2748, 3019, 0, +2881, 3152, 0, +3013, 3283, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 466, +15, 145, 450, +218, 361, 427, +218, 427, 306, +277, 582, 148, +435, 730, 34, +585, 873, 0, +731, 1014, 0, +873, 1152, 0, +1012, 1289, 0, +1149, 1424, 0, +1285, 1559, 0, +1420, 1693, 0, +1554, 1827, 0, +1688, 1960, 0, +1821, 2093, 0, +1954, 2225, 0, +2087, 2358, 0, +2220, 2490, 0, +2352, 2623, 0, +2485, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3152, 0, +3013, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +154, 0, 466, +225, 15, 450, +306, 218, 427, +396, 396, 396, +494, 560, 350, +598, 714, 280, +708, 862, 166, +823, 1005, 0, +942, 1146, 0, +1064, 1284, 0, +1188, 1421, 0, +1315, 1557, 0, +1442, 1691, 0, +1571, 1825, 0, +1700, 1959, 0, +1830, 2092, 0, +1961, 2225, 0, +2092, 2357, 0, +2223, 2490, 0, +2355, 2622, 0, +2487, 2755, 0, +2619, 2887, 0, +2750, 3019, 0, +2882, 3151, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +485, 0, 609, +520, 0, 598, +564, 148, 582, +560, 350, 494, +560, 438, 350, +714, 696, 280, +815, 862, 166, +908, 1005, 0, +1009, 1146, 0, +1116, 1284, 0, +1228, 1421, 0, +1345, 1557, 0, +1465, 1691, 0, +1588, 1825, 0, +1714, 1959, 0, +1841, 2092, 0, +1969, 2225, 0, +2098, 2357, 0, +2228, 2490, 0, +2358, 2622, 0, +2489, 2755, 0, +2620, 2887, 0, +2751, 3019, 0, +2883, 3151, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +723, 0, 750, +741, 0, 738, +730, 34, 683, +714, 280, 598, +714, 280, 409, +714, 490, 280, +862, 784, 166, +1002, 1005, 0, +1086, 1146, 0, +1177, 1284, 0, +1277, 1421, 0, +1384, 1557, 0, +1495, 1691, 0, +1611, 1825, 0, +1731, 1959, 0, +1854, 2092, 0, +1979, 2225, 0, +2105, 2357, 0, +2234, 2490, 0, +2362, 2622, 0, +2492, 2755, 0, +2623, 2887, 0, +2753, 3019, 0, +2885, 3151, 0, +3016, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +888, 0, 852, +882, 0, 822, +873, 0, 776, +862, 166, 708, +862, 166, 567, +862, 166, 264, +862, 550, 166, +1005, 881, 0, +1146, 1119, 0, +1249, 1284, 0, +1335, 1421, 0, +1430, 1557, 0, +1532, 1691, 0, +1640, 1825, 0, +1754, 1959, 0, +1871, 2092, 0, +1992, 2225, 0, +2115, 2357, 0, +2241, 2490, 0, +2368, 2622, 0, +2497, 2755, 0, +2626, 2887, 0, +2756, 3019, 0, +2886, 3151, 0, +3017, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 939, +1020, 0, 914, +1014, 0, 877, +1005, 0, 823, +1005, 0, 717, +1005, 0, 523, +1005, 0, 0, +1005, 620, 0, +1146, 983, 0, +1284, 1235, 0, +1403, 1421, 0, +1486, 1557, 0, +1577, 1691, 0, +1676, 1825, 0, +1781, 1959, 0, +1893, 2092, 0, +2009, 2225, 0, +2128, 2357, 0, +2251, 2490, 0, +2375, 2622, 0, +2502, 2755, 0, +2630, 2887, 0, +2759, 3019, 0, +2889, 3151, 0, +3019, 3283, 0, +3150, 3416, 0, +3281, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 1033, +1157, 0, 1013, +1152, 0, 984, +1146, 0, 942, +1146, 0, 863, +1146, 0, 730, +1146, 0, 455, +1146, 0, 0, +1146, 700, 0, +1284, 1093, 0, +1421, 1353, 0, +1551, 1557, 0, +1631, 1691, 0, +1720, 1825, 0, +1817, 1959, 0, +1920, 2092, 0, +2030, 2225, 0, +2145, 2357, 0, +2264, 2490, 0, +2385, 2622, 0, +2510, 2755, 0, +2636, 2887, 0, +2763, 3019, 0, +2892, 3151, 0, +3021, 3283, 0, +3151, 3416, 0, +3282, 3548, 0, +3413, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1135, +1292, 0, 1119, +1289, 0, 1096, +1284, 0, 1064, +1284, 0, 1005, +1284, 0, 911, +1284, 0, 746, +1284, 0, 346, +1284, 0, 0, +1284, 788, 0, +1421, 1207, 0, +1557, 1476, 0, +1691, 1688, 0, +1772, 1825, 0, +1860, 1959, 0, +1955, 2092, 0, +2058, 2225, 0, +2166, 2357, 0, +2280, 2490, 0, +2398, 2622, 0, +2520, 2755, 0, +2643, 2887, 0, +2769, 3019, 0, +2896, 3151, 0, +3025, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3415, 3680, 0, +3545, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1244, +1427, 0, 1231, +1424, 0, 1213, +1421, 0, 1188, +1421, 0, 1144, +1421, 0, 1077, +1421, 0, 969, +1421, 0, 767, +1421, 0, 141, +1421, 0, 0, +1421, 885, 0, +1557, 1326, 0, +1691, 1600, 0, +1825, 1816, 0, +1911, 1959, 0, +1997, 2092, 0, +2092, 2225, 0, +2193, 2357, 0, +2302, 2490, 0, +2414, 2622, 0, +2532, 2755, 0, +2653, 2887, 0, +2776, 3019, 0, +2902, 3151, 0, +3029, 3283, 0, +3157, 3416, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1357, +1561, 0, 1347, +1559, 0, 1333, +1557, 0, 1315, +1557, 0, 1281, +1557, 0, 1233, +1557, 0, 1159, +1557, 0, 1037, +1557, 0, 794, +1557, 0, 0, +1557, 0, 0, +1557, 988, 0, +1691, 1447, 0, +1825, 1727, 0, +1959, 1944, 0, +2049, 2092, 0, +2134, 2225, 0, +2228, 2357, 0, +2329, 2490, 0, +2436, 2622, 0, +2549, 2755, 0, +2666, 2887, 0, +2786, 3019, 0, +2909, 3151, 0, +3034, 3283, 0, +3161, 3416, 0, +3290, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1475, +1695, 0, 1467, +1693, 0, 1456, +1691, 0, 1442, +1691, 0, 1417, +1691, 0, 1382, +1691, 0, 1330, +1691, 0, 1249, +1691, 0, 1113, +1691, 0, 827, +1691, 0, 0, +1691, 0, 0, +1691, 1098, 0, +1825, 1571, 0, +1959, 1854, 0, +2092, 2073, 0, +2185, 2225, 0, +2269, 2357, 0, +2362, 2490, 0, +2463, 2622, 0, +2570, 2755, 0, +2682, 2887, 0, +2798, 3019, 0, +2919, 3151, 0, +3042, 3283, 0, +3167, 3416, 0, +3294, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1596, +1828, 0, 1590, +1827, 0, 1582, +1825, 0, 1571, +1825, 0, 1552, +1825, 0, 1526, +1825, 0, 1489, +1825, 0, 1434, +1825, 0, 1348, +1825, 0, 1199, +1825, 0, 869, +1825, 0, 0, +1825, 0, 0, +1825, 1212, 0, +1959, 1697, 0, +2092, 1983, 0, +2225, 2203, 0, +2320, 2357, 0, +2404, 2490, 0, +2496, 2622, 0, +2596, 2755, 0, +2703, 2887, 0, +2815, 3019, 0, +2932, 3151, 0, +3051, 3283, 0, +3174, 3416, 0, +3299, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1719, +1961, 0, 1715, +1960, 0, 1708, +1959, 0, 1700, +1959, 0, 1686, +1959, 0, 1667, +1959, 0, 1640, +1959, 0, 1601, +1959, 0, 1544, +1959, 0, 1453, +1959, 0, 1294, +1959, 0, 917, +1959, 0, 0, +1959, 0, 0, +1959, 1331, 0, +2092, 1824, 0, +2225, 2112, 0, +2357, 2334, 0, +2454, 2490, 0, +2538, 2622, 0, +2630, 2755, 0, +2730, 2887, 0, +2836, 3019, 0, +2948, 3151, 0, +3064, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3432, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1845, +2093, 0, 1841, +2093, 0, 1837, +2092, 0, 1830, +2092, 0, 1820, +2092, 0, 1806, +2092, 0, 1786, +2092, 0, 1758, +2092, 0, 1718, +2092, 0, 1658, +2092, 0, 1564, +2092, 0, 1394, +2092, 0, 977, +2092, 0, 0, +2092, 0, 0, +2092, 1452, 0, +2225, 1953, 0, +2357, 2243, 0, +2490, 2465, 0, +2588, 2622, 0, +2671, 2755, 0, +2763, 2887, 0, +2863, 3019, 0, +2969, 3151, 0, +3080, 3283, 0, +3196, 3416, 0, +3316, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3818, 4076, 0, +3948, 4095, 0, +2226, 0, 1972, +2226, 0, 1969, +2225, 0, 1966, +2225, 0, 1961, +2225, 0, 1953, +2225, 0, 1943, +2225, 0, 1928, +2225, 0, 1908, +2225, 0, 1880, +2225, 0, 1839, +2225, 0, 1777, +2225, 0, 1679, +2225, 0, 1503, +2225, 0, 1044, +2225, 0, 0, +2225, 0, 0, +2225, 1576, 0, +2357, 2082, 0, +2490, 2374, 0, +2622, 2596, 0, +2721, 2755, 0, +2804, 2887, 0, +2896, 3019, 0, +2995, 3151, 0, +3101, 3283, 0, +3213, 3416, 0, +3329, 3548, 0, +3449, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2100, +2358, 0, 2098, +2358, 0, 2096, +2357, 0, 2092, +2357, 0, 2086, +2357, 0, 2078, +2357, 0, 2068, +2357, 0, 2053, +2357, 0, 2032, +2357, 0, 2004, +2357, 0, 1962, +2357, 0, 1899, +2357, 0, 1798, +2357, 0, 1615, +2357, 0, 1122, +2357, 0, 0, +2357, 0, 0, +2357, 1702, 0, +2490, 2213, 0, +2622, 2505, 0, +2755, 2728, 0, +2854, 2887, 0, +2937, 3019, 0, +3029, 3151, 0, +3128, 3283, 0, +3234, 3416, 0, +3345, 3548, 0, +3461, 3680, 0, +3581, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2230, +2491, 0, 2228, +2490, 0, 2226, +2490, 0, 2223, +2490, 0, 2219, +2490, 0, 2213, +2490, 0, 2206, +2490, 0, 2195, +2490, 0, 2180, +2490, 0, 2159, +2490, 0, 2129, +2490, 0, 2087, +2490, 0, 2023, +2490, 0, 1920, +2490, 0, 1733, +2490, 0, 1210, +2490, 0, 0, +2490, 0, 0, +2490, 1830, 0, +2622, 2343, 0, +2755, 2636, 0, +2887, 2860, 0, +2987, 3019, 0, +3070, 3151, 0, +3161, 3283, 0, +3260, 3416, 0, +3366, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2359, +2623, 0, 2358, +2623, 0, 2357, +2622, 0, 2355, +2622, 0, 2352, +2622, 0, 2347, +2622, 0, 2341, +2622, 0, 2334, +2622, 0, 2323, +2622, 0, 2308, +2622, 0, 2287, +2622, 0, 2256, +2622, 0, 2214, +2622, 0, 2149, +2622, 0, 2045, +2622, 0, 1853, +2622, 0, 1304, +2622, 0, 0, +2622, 0, 0, +2622, 1958, 0, +2755, 2475, 0, +2887, 2768, 0, +3019, 2991, 0, +3119, 3151, 0, +3202, 3283, 0, +3293, 3416, 0, +3393, 3548, 0, +3499, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2490, +2755, 0, 2489, +2755, 0, 2488, +2755, 0, 2487, +2755, 0, 2484, +2755, 0, 2481, +2755, 0, 2477, +2755, 0, 2471, +2755, 0, 2463, +2755, 0, 2452, +2755, 0, 2436, +2755, 0, 2415, +2755, 0, 2386, +2755, 0, 2342, +2755, 0, 2277, +2755, 0, 2172, +2755, 0, 1977, +2755, 0, 1409, +2755, 0, 0, +2755, 0, 0, +2755, 2088, 0, +2887, 2605, 0, +3019, 2899, 0, +3151, 3123, 0, +3252, 3283, 0, +3335, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3978, 4095, 0, +2887, 0, 2621, +2887, 0, 2620, +2887, 0, 2620, +2887, 0, 2619, +2887, 0, 2617, +2887, 0, 2614, +2887, 0, 2611, +2887, 0, 2607, +2887, 0, 2601, +2887, 0, 2592, +2887, 0, 2581, +2887, 0, 2566, +2887, 0, 2545, +2887, 0, 2515, +2887, 0, 2471, +2887, 0, 2406, +2887, 0, 2299, +2887, 0, 2103, +2887, 0, 1516, +2887, 0, 0, +2887, 0, 0, +2887, 2218, 0, +3019, 2736, 0, +3151, 3031, 0, +3283, 3255, 0, +3384, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2752, +3019, 0, 2752, +3019, 0, 2751, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2747, +3019, 0, 2745, +3019, 0, 2741, +3019, 0, 2737, +3019, 0, 2731, +3019, 0, 2723, +3019, 0, 2712, +3019, 0, 2696, +3019, 0, 2675, +3019, 0, 2645, +3019, 0, 2601, +3019, 0, 2535, +3019, 0, 2428, +3019, 0, 2229, +3019, 0, 1628, +3019, 0, 0, +3019, 0, 0, +3019, 2348, 0, +3151, 2869, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3790, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2884, +3152, 0, 2883, +3152, 0, 2883, +3151, 0, 2882, +3151, 0, 2881, +3151, 0, 2880, +3151, 0, 2878, +3151, 0, 2876, +3151, 0, 2872, +3151, 0, 2868, +3151, 0, 2862, +3151, 0, 2854, +3151, 0, 2842, +3151, 0, 2827, +3151, 0, 2806, +3151, 0, 2775, +3151, 0, 2732, +3151, 0, 2665, +3151, 0, 2558, +3151, 0, 2358, +3151, 0, 1746, +3151, 0, 0, +3151, 0, 0, +3151, 2480, 0, +3283, 2999, 0, +3416, 3294, 0, +3548, 3519, 0, +3649, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3015, +3283, 0, 3015, +3283, 0, 3014, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3012, +3283, 0, 3011, +3283, 0, 3009, +3283, 0, 3007, +3283, 0, 3003, +3283, 0, 2999, +3283, 0, 2993, +3283, 0, 2985, +3283, 0, 2973, +3283, 0, 2958, +3283, 0, 2936, +3283, 0, 2906, +3283, 0, 2862, +3283, 0, 2795, +3283, 0, 2688, +3283, 0, 2486, +3283, 0, 1864, +3283, 0, 0, +3283, 0, 0, +3283, 2611, 0, +3416, 3132, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3142, +3416, 0, 3141, +3416, 0, 3138, +3416, 0, 3135, +3416, 0, 3130, +3416, 0, 3124, +3416, 0, 3116, +3416, 0, 3105, +3416, 0, 3089, +3416, 0, 3068, +3416, 0, 3038, +3416, 0, 2993, +3416, 0, 2927, +3416, 0, 2818, +3416, 0, 2617, +3416, 0, 1992, +3416, 0, 0, +3416, 0, 0, +3416, 2742, 0, +3548, 3264, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3277, +3548, 0, 3275, +3548, 0, 3274, +3548, 0, 3272, +3548, 0, 3270, +3548, 0, 3267, +3548, 0, 3262, +3548, 0, 3256, +3548, 0, 3248, +3548, 0, 3237, +3548, 0, 3221, +3548, 0, 3200, +3548, 0, 3169, +3548, 0, 3125, +3548, 0, 3058, +3548, 0, 2950, +3548, 0, 2747, +3548, 0, 2115, +3548, 0, 0, +3548, 0, 0, +3548, 2874, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3406, +3680, 0, 3404, +3680, 0, 3401, +3680, 0, 3398, +3680, 0, 3394, +3680, 0, 3388, +3680, 0, 3379, +3680, 0, 3368, +3680, 0, 3353, +3680, 0, 3331, +3680, 0, 3301, +3680, 0, 3256, +3680, 0, 3189, +3680, 0, 3081, +3680, 0, 2878, +3680, 0, 2246, +3680, 0, 0, +3680, 0, 0, +3680, 3006, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3538, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3530, +3812, 0, 3526, +3812, 0, 3520, +3812, 0, 3511, +3812, 0, 3500, +3812, 0, 3485, +3812, 0, 3463, +3812, 0, 3432, +3812, 0, 3388, +3812, 0, 3321, +3812, 0, 3213, +3812, 0, 3010, +3812, 0, 2374, +3812, 0, 0, +3812, 0, 0, +3812, 3138, 0, +3944, 3660, 0, +4076, 3954, 0, +4095, 4095, 0, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3657, +3944, 0, 3651, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3616, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3453, +3944, 0, 3344, +3944, 0, 3141, +3944, 0, 2502, +3944, 0, 0, +3944, 0, 0, +3944, 3269, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3799, +4076, 0, 3797, +4076, 0, 3794, +4076, 0, 3789, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3764, +4076, 0, 3748, +4076, 0, 3727, +4076, 0, 3696, +4076, 0, 3652, +4076, 0, 3585, +4076, 0, 3476, +4076, 0, 3272, +4076, 0, 2630, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3405, +4095, 0, 2764, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 427, 609, +0, 512, 609, +0, 606, 609, +0, 609, 485, +0, 609, 224, +0, 750, 0, +0, 888, 0, +371, 1025, 0, +640, 1160, 0, +853, 1295, 0, +1037, 1429, 0, +1205, 1563, 0, +1362, 1696, 0, +1512, 1828, 0, +1657, 1961, 0, +1798, 2094, 0, +1937, 2226, 0, +2074, 2358, 0, +2210, 2491, 0, +2345, 2623, 0, +2479, 2755, 0, +2613, 2887, 0, +2746, 3019, 0, +2879, 3152, 0, +3012, 3284, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 322, 609, +0, 444, 598, +0, 551, 598, +0, 598, 520, +0, 598, 286, +0, 741, 0, +190, 882, 0, +482, 1020, 0, +705, 1157, 0, +894, 1292, 0, +1065, 1427, 0, +1225, 1561, 0, +1376, 1695, 0, +1522, 1828, 0, +1664, 1961, 0, +1804, 2093, 0, +1941, 2226, 0, +2077, 2358, 0, +2212, 2491, 0, +2347, 2623, 0, +2481, 2755, 0, +2614, 2887, 0, +2747, 3019, 0, +2880, 3152, 0, +3012, 3283, 0, +3145, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 127, 609, +0, 303, 598, +148, 466, 582, +148, 582, 564, +148, 582, 357, +132, 730, 34, +390, 873, 0, +598, 1014, 0, +779, 1152, 0, +945, 1289, 0, +1101, 1424, 0, +1250, 1559, 0, +1394, 1693, 0, +1535, 1827, 0, +1674, 1960, 0, +1811, 2093, 0, +1946, 2225, 0, +2081, 2358, 0, +2215, 2490, 0, +2349, 2623, 0, +2482, 2755, 0, +2615, 2887, 0, +2747, 3019, 0, +2880, 3152, 0, +3013, 3283, 0, +3145, 3416, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 609, +0, 0, 598, +148, 277, 582, +350, 494, 560, +350, 560, 438, +409, 714, 280, +567, 862, 166, +717, 1005, 0, +863, 1146, 0, +1005, 1284, 0, +1144, 1421, 0, +1281, 1557, 0, +1417, 1691, 0, +1552, 1825, 0, +1686, 1959, 0, +1820, 2092, 0, +1953, 2225, 0, +2086, 2357, 0, +2219, 2490, 0, +2352, 2622, 0, +2484, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3151, 0, +3013, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +224, 0, 609, +286, 0, 598, +357, 148, 582, +438, 350, 560, +528, 528, 528, +625, 691, 482, +730, 846, 412, +840, 994, 298, +955, 1137, 80, +1074, 1278, 0, +1196, 1416, 0, +1320, 1553, 0, +1446, 1689, 0, +1574, 1823, 0, +1703, 1958, 0, +1832, 2091, 0, +1963, 2224, 0, +2093, 2357, 0, +2224, 2489, 0, +2356, 2622, 0, +2487, 2755, 0, +2619, 2887, 0, +2750, 3019, 0, +2883, 3151, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +587, 0, 750, +616, 0, 741, +652, 34, 730, +696, 280, 714, +691, 482, 625, +691, 570, 482, +846, 828, 412, +947, 994, 298, +1040, 1137, 80, +1141, 1278, 0, +1248, 1416, 0, +1360, 1553, 0, +1477, 1689, 0, +1598, 1823, 0, +1721, 1958, 0, +1846, 2091, 0, +1973, 2224, 0, +2101, 2357, 0, +2230, 2489, 0, +2360, 2622, 0, +2490, 2755, 0, +2621, 2887, 0, +2752, 3019, 0, +2884, 3151, 0, +3015, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +838, 0, 888, +855, 0, 882, +873, 0, 870, +862, 166, 815, +846, 412, 730, +846, 412, 541, +846, 622, 412, +994, 917, 298, +1134, 1137, 80, +1218, 1278, 0, +1310, 1416, 0, +1409, 1553, 0, +1515, 1689, 0, +1627, 1823, 0, +1743, 1958, 0, +1863, 2091, 0, +1986, 2224, 0, +2111, 2357, 0, +2238, 2489, 0, +2366, 2622, 0, +2495, 2755, 0, +2625, 2887, 0, +2755, 3019, 0, +2886, 3151, 0, +3016, 3283, 0, +3148, 3416, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1025, 0, 1006, +1020, 0, 985, +1014, 0, 954, +1005, 0, 908, +994, 298, 840, +994, 298, 699, +994, 298, 397, +994, 682, 298, +1137, 1013, 80, +1278, 1251, 0, +1381, 1416, 0, +1467, 1553, 0, +1562, 1689, 0, +1664, 1823, 0, +1772, 1958, 0, +1885, 2091, 0, +2003, 2224, 0, +2124, 2357, 0, +2247, 2489, 0, +2373, 2622, 0, +2501, 2755, 0, +2629, 2887, 0, +2758, 3019, 0, +2888, 3151, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 1089, +1157, 0, 1071, +1152, 0, 1045, +1146, 0, 1009, +1137, 80, 955, +1137, 80, 850, +1137, 80, 655, +1137, 80, 81, +1137, 753, 80, +1278, 1116, 0, +1416, 1367, 0, +1535, 1553, 0, +1617, 1689, 0, +1709, 1823, 0, +1808, 1958, 0, +1913, 2091, 0, +2025, 2224, 0, +2141, 2357, 0, +2260, 2489, 0, +2383, 2622, 0, +2508, 2755, 0, +2635, 2887, 0, +2762, 3019, 0, +2891, 3151, 0, +3021, 3283, 0, +3151, 3416, 0, +3282, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1295, 0, 1181, +1292, 0, 1166, +1289, 0, 1145, +1284, 0, 1116, +1278, 0, 1074, +1278, 0, 995, +1278, 0, 862, +1278, 0, 587, +1278, 0, 0, +1278, 832, 0, +1416, 1225, 0, +1553, 1486, 0, +1683, 1689, 0, +1763, 1823, 0, +1852, 1958, 0, +1949, 2091, 0, +2053, 2224, 0, +2162, 2357, 0, +2277, 2489, 0, +2396, 2622, 0, +2517, 2755, 0, +2642, 2887, 0, +2768, 3019, 0, +2895, 3151, 0, +3024, 3283, 0, +3154, 3416, 0, +3284, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1280, +1427, 0, 1267, +1424, 0, 1251, +1421, 0, 1228, +1416, 0, 1196, +1416, 0, 1137, +1416, 0, 1043, +1416, 0, 878, +1416, 0, 478, +1416, 0, 0, +1416, 920, 0, +1553, 1340, 0, +1689, 1608, 0, +1823, 1821, 0, +1905, 1958, 0, +1992, 2091, 0, +2087, 2224, 0, +2190, 2357, 0, +2298, 2489, 0, +2412, 2622, 0, +2530, 2755, 0, +2651, 2887, 0, +2775, 3019, 0, +2901, 3151, 0, +3028, 3283, 0, +3157, 3416, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1385, +1561, 0, 1376, +1559, 0, 1363, +1557, 0, 1345, +1553, 0, 1320, +1553, 0, 1276, +1553, 0, 1209, +1553, 0, 1102, +1553, 0, 900, +1553, 0, 275, +1553, 0, 0, +1553, 1017, 0, +1689, 1457, 0, +1823, 1732, 0, +1958, 1948, 0, +2044, 2091, 0, +2130, 2224, 0, +2224, 2357, 0, +2326, 2489, 0, +2434, 2622, 0, +2547, 2755, 0, +2664, 2887, 0, +2785, 3019, 0, +2908, 3151, 0, +3034, 3283, 0, +3161, 3416, 0, +3289, 3548, 0, +3419, 3680, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1496, +1695, 0, 1489, +1693, 0, 1479, +1691, 0, 1465, +1689, 0, 1446, +1689, 0, 1413, +1689, 0, 1365, +1689, 0, 1291, +1689, 0, 1169, +1689, 0, 926, +1689, 0, 0, +1689, 0, 0, +1689, 1120, 0, +1823, 1579, 0, +1958, 1859, 0, +2091, 2076, 0, +2181, 2224, 0, +2266, 2357, 0, +2360, 2489, 0, +2460, 2622, 0, +2568, 2755, 0, +2681, 2887, 0, +2797, 3019, 0, +2918, 3151, 0, +3041, 3283, 0, +3166, 3416, 0, +3293, 3548, 0, +3422, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1612, +1828, 0, 1607, +1827, 0, 1599, +1825, 0, 1588, +1823, 0, 1574, +1823, 0, 1549, +1823, 0, 1514, +1823, 0, 1462, +1823, 0, 1382, +1823, 0, 1245, +1823, 0, 960, +1823, 0, 0, +1823, 0, 0, +1823, 1230, 0, +1958, 1703, 0, +2091, 1986, 0, +2224, 2206, 0, +2317, 2357, 0, +2401, 2489, 0, +2494, 2622, 0, +2595, 2755, 0, +2702, 2887, 0, +2814, 3019, 0, +2931, 3151, 0, +3051, 3283, 0, +3174, 3416, 0, +3299, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1732, +1961, 0, 1728, +1960, 0, 1722, +1959, 0, 1714, +1958, 0, 1703, +1958, 0, 1684, +1958, 0, 1658, +1958, 0, 1621, +1958, 0, 1566, +1958, 0, 1480, +1958, 0, 1332, +1958, 0, 1000, +1958, 0, 0, +1958, 0, 0, +1958, 1344, 0, +2091, 1829, 0, +2224, 2115, 0, +2357, 2335, 0, +2452, 2489, 0, +2536, 2622, 0, +2628, 2755, 0, +2728, 2887, 0, +2835, 3019, 0, +2947, 3151, 0, +3063, 3283, 0, +3184, 3416, 0, +3307, 3548, 0, +3431, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1855, +2093, 0, 1851, +2093, 0, 1847, +2092, 0, 1841, +2091, 0, 1832, +2091, 0, 1819, +2091, 0, 1799, +2091, 0, 1772, +2091, 0, 1733, +2091, 0, 1676, +2091, 0, 1585, +2091, 0, 1425, +2091, 0, 1050, +2091, 0, 0, +2091, 0, 0, +2091, 1463, 0, +2224, 1956, 0, +2357, 2245, 0, +2489, 2466, 0, +2586, 2622, 0, +2670, 2755, 0, +2762, 2887, 0, +2862, 3019, 0, +2968, 3151, 0, +3080, 3283, 0, +3196, 3416, 0, +3316, 3548, 0, +3439, 3680, 0, +3564, 3812, 0, +3691, 3944, 0, +3818, 4076, 0, +3948, 4095, 0, +2226, 0, 1979, +2226, 0, 1977, +2225, 0, 1973, +2225, 0, 1969, +2224, 0, 1963, +2224, 0, 1952, +2224, 0, 1938, +2224, 0, 1918, +2224, 0, 1891, +2224, 0, 1850, +2224, 0, 1790, +2224, 0, 1695, +2224, 0, 1527, +2224, 0, 1108, +2224, 0, 0, +2224, 0, 0, +2224, 1584, 0, +2357, 2085, 0, +2489, 2375, 0, +2622, 2597, 0, +2720, 2755, 0, +2803, 2887, 0, +2895, 3019, 0, +2995, 3151, 0, +3101, 3283, 0, +3212, 3416, 0, +3329, 3548, 0, +3448, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3823, 4076, 0, +3951, 4095, 0, +2358, 0, 2106, +2358, 0, 2104, +2358, 0, 2101, +2357, 0, 2098, +2357, 0, 2093, +2357, 0, 2086, +2357, 0, 2075, +2357, 0, 2060, +2357, 0, 2040, +2357, 0, 2012, +2357, 0, 1970, +2357, 0, 1909, +2357, 0, 1811, +2357, 0, 1634, +2357, 0, 1176, +2357, 0, 0, +2357, 0, 0, +2357, 1708, 0, +2489, 2215, 0, +2622, 2506, 0, +2755, 2729, 0, +2853, 2887, 0, +2936, 3019, 0, +3028, 3151, 0, +3127, 3283, 0, +3233, 3416, 0, +3345, 3548, 0, +3461, 3680, 0, +3581, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2234, +2491, 0, 2233, +2490, 0, 2230, +2490, 0, 2228, +2489, 0, 2224, +2489, 0, 2219, +2489, 0, 2211, +2489, 0, 2200, +2489, 0, 2185, +2489, 0, 2165, +2489, 0, 2136, +2489, 0, 2094, +2489, 0, 2031, +2489, 0, 1930, +2489, 0, 1748, +2489, 0, 1255, +2489, 0, 0, +2489, 0, 0, +2489, 1834, 0, +2622, 2344, 0, +2755, 2637, 0, +2887, 2860, 0, +2986, 3019, 0, +3069, 3151, 0, +3160, 3283, 0, +3260, 3416, 0, +3366, 3548, 0, +3478, 3680, 0, +3594, 3812, 0, +3713, 3944, 0, +3836, 4076, 0, +3961, 4095, 0, +2623, 0, 2363, +2623, 0, 2362, +2623, 0, 2360, +2622, 0, 2358, +2622, 0, 2356, +2622, 0, 2351, +2622, 0, 2346, +2622, 0, 2337, +2622, 0, 2327, +2622, 0, 2312, +2622, 0, 2291, +2622, 0, 2261, +2622, 0, 2219, +2622, 0, 2155, +2622, 0, 2052, +2622, 0, 1865, +2622, 0, 1342, +2622, 0, 0, +2622, 0, 0, +2622, 1962, 0, +2755, 2476, 0, +2887, 2768, 0, +3019, 2992, 0, +3119, 3151, 0, +3201, 3283, 0, +3293, 3416, 0, +3392, 3548, 0, +3498, 3680, 0, +3610, 3812, 0, +3726, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2493, +2755, 0, 2492, +2755, 0, 2491, +2755, 0, 2489, +2755, 0, 2487, +2755, 0, 2484, +2755, 0, 2480, +2755, 0, 2474, +2755, 0, 2466, +2755, 0, 2455, +2755, 0, 2440, +2755, 0, 2419, +2755, 0, 2389, +2755, 0, 2346, +2755, 0, 2281, +2755, 0, 2177, +2755, 0, 1986, +2755, 0, 1439, +2755, 0, 0, +2755, 0, 0, +2755, 2091, 0, +2887, 2606, 0, +3019, 2899, 0, +3151, 3123, 0, +3251, 3283, 0, +3334, 3416, 0, +3426, 3548, 0, +3525, 3680, 0, +3631, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3977, 4095, 0, +2887, 0, 2623, +2887, 0, 2622, +2887, 0, 2621, +2887, 0, 2620, +2887, 0, 2619, +2887, 0, 2617, +2887, 0, 2613, +2887, 0, 2609, +2887, 0, 2603, +2887, 0, 2595, +2887, 0, 2584, +2887, 0, 2569, +2887, 0, 2548, +2887, 0, 2517, +2887, 0, 2474, +2887, 0, 2409, +2887, 0, 2304, +2887, 0, 2110, +2887, 0, 1540, +2887, 0, 0, +2887, 0, 0, +2887, 2220, 0, +3019, 2737, 0, +3151, 3031, 0, +3283, 3255, 0, +3384, 3416, 0, +3467, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2754, +3019, 0, 2753, +3019, 0, 2752, +3019, 0, 2751, +3019, 0, 2750, +3019, 0, 2749, +3019, 0, 2746, +3019, 0, 2743, +3019, 0, 2738, +3019, 0, 2732, +3019, 0, 2724, +3019, 0, 2713, +3019, 0, 2698, +3019, 0, 2677, +3019, 0, 2647, +3019, 0, 2603, +3019, 0, 2537, +3019, 0, 2431, +3019, 0, 2234, +3019, 0, 1646, +3019, 0, 0, +3019, 0, 0, +3019, 2350, 0, +3151, 2869, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2885, +3152, 0, 2885, +3152, 0, 2884, +3151, 0, 2883, +3151, 0, 2883, +3151, 0, 2881, +3151, 0, 2879, +3151, 0, 2877, +3151, 0, 2873, +3151, 0, 2869, +3151, 0, 2863, +3151, 0, 2855, +3151, 0, 2844, +3151, 0, 2829, +3151, 0, 2807, +3151, 0, 2777, +3151, 0, 2733, +3151, 0, 2667, +3151, 0, 2560, +3151, 0, 2362, +3151, 0, 1760, +3151, 0, 0, +3151, 0, 0, +3151, 2481, 0, +3283, 3000, 0, +3416, 3295, 0, +3548, 3519, 0, +3648, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3016, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3015, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3012, +3283, 0, 3010, +3283, 0, 3008, +3283, 0, 3004, +3283, 0, 3000, +3283, 0, 2994, +3283, 0, 2986, +3283, 0, 2974, +3283, 0, 2959, +3283, 0, 2938, +3283, 0, 2907, +3283, 0, 2863, +3283, 0, 2797, +3283, 0, 2690, +3283, 0, 2489, +3283, 0, 1875, +3283, 0, 0, +3283, 0, 0, +3283, 2612, 0, +3416, 3132, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3955, 4076, 0, +4054, 4095, 0, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3143, +3416, 0, 3141, +3416, 0, 3139, +3416, 0, 3135, +3416, 0, 3131, +3416, 0, 3125, +3416, 0, 3117, +3416, 0, 3106, +3416, 0, 3090, +3416, 0, 3069, +3416, 0, 3038, +3416, 0, 2994, +3416, 0, 2928, +3416, 0, 2820, +3416, 0, 2619, +3416, 0, 2000, +3416, 0, 0, +3416, 0, 0, +3416, 2743, 0, +3548, 3264, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3270, +3548, 0, 3267, +3548, 0, 3262, +3548, 0, 3256, +3548, 0, 3248, +3548, 0, 3237, +3548, 0, 3222, +3548, 0, 3200, +3548, 0, 3170, +3548, 0, 3125, +3548, 0, 3059, +3548, 0, 2951, +3548, 0, 2749, +3548, 0, 2122, +3548, 0, 0, +3548, 0, 0, +3548, 2874, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3406, +3680, 0, 3404, +3680, 0, 3402, +3680, 0, 3399, +3680, 0, 3394, +3680, 0, 3388, +3680, 0, 3380, +3680, 0, 3369, +3680, 0, 3353, +3680, 0, 3332, +3680, 0, 3301, +3680, 0, 3257, +3680, 0, 3190, +3680, 0, 3082, +3680, 0, 2879, +3680, 0, 2251, +3680, 0, 0, +3680, 0, 0, +3680, 3006, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3538, +3812, 0, 3536, +3812, 0, 3534, +3812, 0, 3530, +3812, 0, 3526, +3812, 0, 3520, +3812, 0, 3511, +3812, 0, 3500, +3812, 0, 3485, +3812, 0, 3463, +3812, 0, 3433, +3812, 0, 3388, +3812, 0, 3322, +3812, 0, 3213, +3812, 0, 3011, +3812, 0, 2377, +3812, 0, 0, +3812, 0, 0, +3812, 3138, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3662, +3944, 0, 3658, +3944, 0, 3652, +3944, 0, 3643, +3944, 0, 3632, +3944, 0, 3617, +3944, 0, 3595, +3944, 0, 3564, +3944, 0, 3520, +3944, 0, 3453, +3944, 0, 3345, +3944, 0, 3142, +3944, 0, 2505, +3944, 0, 0, +3944, 0, 0, +3944, 3270, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3800, +4076, 0, 3797, +4076, 0, 3794, +4076, 0, 3790, +4076, 0, 3783, +4076, 0, 3775, +4076, 0, 3764, +4076, 0, 3748, +4076, 0, 3727, +4076, 0, 3696, +4076, 0, 3652, +4076, 0, 3585, +4076, 0, 3476, +4076, 0, 3273, +4076, 0, 2632, +4076, 0, 0, +4076, 0, 0, +4076, 3401, 0, +4095, 3924, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3921, +4095, 0, 3915, +4095, 0, 3907, +4095, 0, 3896, +4095, 0, 3880, +4095, 0, 3859, +4095, 0, 3828, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3608, +4095, 0, 3405, +4095, 0, 2765, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 545, 750, +0, 613, 750, +0, 689, 750, +0, 750, 723, +0, 750, 587, +0, 750, 304, +0, 888, 0, +0, 1025, 0, +397, 1160, 0, +717, 1295, 0, +951, 1429, 0, +1148, 1563, 0, +1322, 1696, 0, +1484, 1828, 0, +1636, 1961, 0, +1783, 2094, 0, +1926, 2226, 0, +2066, 2358, 0, +2204, 2491, 0, +2341, 2623, 0, +2476, 2755, 0, +2611, 2887, 0, +2744, 3019, 0, +2878, 3152, 0, +3011, 3284, 0, +3144, 3416, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 467, 750, +0, 559, 741, +0, 644, 741, +0, 738, 741, +0, 741, 616, +0, 741, 356, +0, 882, 0, +81, 1020, 0, +503, 1157, 0, +772, 1292, 0, +985, 1427, 0, +1170, 1561, 0, +1337, 1695, 0, +1494, 1828, 0, +1644, 1961, 0, +1789, 2093, 0, +1930, 2226, 0, +2069, 2358, 0, +2206, 2491, 0, +2342, 2623, 0, +2477, 2755, 0, +2612, 2887, 0, +2745, 3019, 0, +2878, 3152, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 334, 750, +0, 453, 741, +34, 576, 730, +34, 683, 730, +34, 730, 652, +34, 730, 418, +0, 873, 0, +323, 1014, 0, +614, 1152, 0, +837, 1289, 0, +1027, 1424, 0, +1198, 1559, 0, +1357, 1693, 0, +1508, 1827, 0, +1654, 1960, 0, +1796, 2093, 0, +1936, 2225, 0, +2073, 2358, 0, +2209, 2490, 0, +2345, 2623, 0, +2479, 2755, 0, +2613, 2887, 0, +2746, 3019, 0, +2879, 3152, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 59, 750, +0, 258, 741, +34, 435, 730, +280, 598, 714, +280, 714, 696, +280, 714, 490, +264, 862, 166, +523, 1005, 0, +730, 1146, 0, +911, 1284, 0, +1077, 1421, 0, +1233, 1557, 0, +1382, 1691, 0, +1526, 1825, 0, +1667, 1959, 0, +1806, 2092, 0, +1943, 2225, 0, +2078, 2357, 0, +2213, 2490, 0, +2347, 2622, 0, +2481, 2755, 0, +2614, 2887, 0, +2747, 3019, 0, +2880, 3151, 0, +3012, 3283, 0, +3145, 3416, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 750, +0, 0, 741, +34, 132, 730, +280, 409, 714, +482, 625, 691, +482, 691, 570, +541, 846, 412, +699, 994, 298, +850, 1137, 80, +995, 1278, 0, +1137, 1416, 0, +1276, 1553, 0, +1413, 1689, 0, +1549, 1823, 0, +1684, 1958, 0, +1819, 2091, 0, +1952, 2224, 0, +2086, 2357, 0, +2219, 2489, 0, +2351, 2622, 0, +2484, 2755, 0, +2617, 2887, 0, +2749, 3019, 0, +2881, 3151, 0, +3013, 3283, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +304, 0, 750, +356, 0, 741, +418, 34, 730, +490, 280, 714, +570, 482, 691, +660, 660, 660, +758, 824, 614, +862, 978, 544, +972, 1126, 430, +1087, 1270, 212, +1206, 1410, 0, +1328, 1549, 0, +1452, 1685, 0, +1579, 1821, 0, +1706, 1956, 0, +1835, 2089, 0, +1965, 2223, 0, +2095, 2356, 0, +2226, 2489, 0, +2356, 2621, 0, +2488, 2754, 0, +2619, 2887, 0, +2751, 3019, 0, +2883, 3151, 0, +3014, 3283, 0, +3146, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +697, 0, 888, +719, 0, 882, +749, 0, 873, +784, 166, 862, +828, 412, 846, +824, 614, 758, +824, 702, 614, +978, 960, 544, +1079, 1126, 430, +1172, 1270, 212, +1273, 1410, 0, +1380, 1549, 0, +1492, 1685, 0, +1609, 1821, 0, +1730, 1956, 0, +1853, 2089, 0, +1978, 2223, 0, +2105, 2356, 0, +2233, 2489, 0, +2362, 2621, 0, +2492, 2754, 0, +2623, 2887, 0, +2753, 3019, 0, +2885, 3151, 0, +3016, 3283, 0, +3147, 3416, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +957, 0, 1025, +970, 0, 1020, +987, 0, 1014, +1005, 0, 1002, +994, 298, 947, +978, 544, 862, +978, 544, 673, +978, 754, 544, +1126, 1049, 430, +1266, 1270, 212, +1350, 1410, 0, +1442, 1549, 0, +1541, 1685, 0, +1648, 1821, 0, +1759, 1956, 0, +1875, 2089, 0, +1995, 2223, 0, +2118, 2356, 0, +2243, 2489, 0, +2370, 2621, 0, +2498, 2754, 0, +2627, 2887, 0, +2756, 3019, 0, +2887, 3151, 0, +3018, 3283, 0, +3149, 3416, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1160, 0, 1154, +1157, 0, 1139, +1152, 0, 1117, +1146, 0, 1086, +1137, 80, 1040, +1126, 430, 972, +1126, 430, 831, +1126, 430, 529, +1126, 814, 430, +1270, 1145, 212, +1410, 1383, 0, +1513, 1549, 0, +1599, 1685, 0, +1694, 1821, 0, +1796, 1956, 0, +1904, 2089, 0, +2018, 2223, 0, +2135, 2356, 0, +2256, 2489, 0, +2380, 2621, 0, +2505, 2754, 0, +2632, 2887, 0, +2761, 3019, 0, +2890, 3151, 0, +3020, 3283, 0, +3151, 3416, 0, +3281, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3939, 4095, 0, +1295, 0, 1234, +1292, 0, 1221, +1289, 0, 1203, +1284, 0, 1177, +1278, 0, 1141, +1270, 212, 1087, +1270, 212, 982, +1270, 212, 787, +1270, 212, 214, +1270, 884, 212, +1410, 1248, 0, +1549, 1499, 0, +1667, 1685, 0, +1750, 1821, 0, +1841, 1956, 0, +1940, 2089, 0, +2046, 2223, 0, +2157, 2356, 0, +2273, 2489, 0, +2393, 2621, 0, +2515, 2754, 0, +2640, 2887, 0, +2766, 3019, 0, +2895, 3151, 0, +3023, 3283, 0, +3153, 3416, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1323, +1427, 0, 1313, +1424, 0, 1298, +1421, 0, 1277, +1416, 0, 1248, +1410, 0, 1206, +1410, 0, 1127, +1410, 0, 994, +1410, 0, 719, +1410, 47, 0, +1410, 964, 0, +1549, 1358, 0, +1685, 1618, 0, +1815, 1821, 0, +1895, 1956, 0, +1984, 2089, 0, +2081, 2223, 0, +2185, 2356, 0, +2294, 2489, 0, +2409, 2621, 0, +2528, 2754, 0, +2650, 2887, 0, +2774, 3019, 0, +2900, 3151, 0, +3027, 3283, 0, +3156, 3416, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3677, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1563, 0, 1421, +1561, 0, 1412, +1559, 0, 1400, +1557, 0, 1384, +1553, 0, 1360, +1549, 0, 1328, +1549, 0, 1269, +1549, 0, 1176, +1549, 0, 1011, +1549, 0, 611, +1549, 0, 0, +1549, 1053, 0, +1685, 1471, 0, +1821, 1740, 0, +1956, 1953, 0, +2037, 2089, 0, +2124, 2223, 0, +2219, 2356, 0, +2322, 2489, 0, +2431, 2621, 0, +2545, 2754, 0, +2662, 2887, 0, +2784, 3019, 0, +2907, 3151, 0, +3033, 3283, 0, +3160, 3416, 0, +3289, 3548, 0, +3418, 3680, 0, +3548, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1524, +1695, 0, 1517, +1693, 0, 1508, +1691, 0, 1495, +1689, 0, 1477, +1685, 0, 1452, +1685, 0, 1408, +1685, 0, 1341, +1685, 0, 1233, +1685, 0, 1031, +1685, 0, 406, +1685, 0, 0, +1685, 1149, 0, +1821, 1590, 0, +1956, 1865, 0, +2089, 2080, 0, +2176, 2223, 0, +2262, 2356, 0, +2356, 2489, 0, +2458, 2621, 0, +2566, 2754, 0, +2679, 2887, 0, +2796, 3019, 0, +2917, 3151, 0, +3040, 3283, 0, +3166, 3416, 0, +3293, 3548, 0, +3421, 3680, 0, +3551, 3812, 0, +3681, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1634, +1828, 0, 1629, +1827, 0, 1621, +1825, 0, 1611, +1823, 0, 1598, +1821, 0, 1579, +1821, 0, 1545, +1821, 0, 1497, +1821, 0, 1423, +1821, 0, 1301, +1821, 0, 1059, +1821, 0, 0, +1821, 0, 0, +1821, 1253, 0, +1956, 1711, 0, +2089, 1991, 0, +2223, 2208, 0, +2313, 2356, 0, +2398, 2489, 0, +2492, 2621, 0, +2593, 2754, 0, +2700, 2887, 0, +2813, 3019, 0, +2930, 3151, 0, +3050, 3283, 0, +3173, 3416, 0, +3299, 3548, 0, +3426, 3680, 0, +3554, 3812, 0, +3683, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +1961, 0, 1749, +1961, 0, 1745, +1960, 0, 1739, +1959, 0, 1731, +1958, 0, 1721, +1956, 0, 1706, +1956, 0, 1681, +1956, 0, 1646, +1956, 0, 1594, +1956, 0, 1514, +1956, 0, 1378, +1956, 0, 1091, +1956, 0, 0, +1956, 0, 0, +1956, 1362, 0, +2089, 1835, 0, +2223, 2118, 0, +2356, 2338, 0, +2449, 2489, 0, +2533, 2621, 0, +2627, 2754, 0, +2727, 2887, 0, +2834, 3019, 0, +2946, 3151, 0, +3062, 3283, 0, +3183, 3416, 0, +3306, 3548, 0, +3431, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1867, +2093, 0, 1864, +2093, 0, 1860, +2092, 0, 1854, +2091, 0, 1846, +2089, 0, 1835, +2089, 0, 1816, +2089, 0, 1790, +2089, 0, 1753, +2089, 0, 1698, +2089, 0, 1612, +2089, 0, 1463, +2089, 0, 1133, +2089, 0, 0, +2089, 0, 0, +2089, 1476, 0, +2223, 1961, 0, +2356, 2247, 0, +2489, 2468, 0, +2584, 2621, 0, +2668, 2754, 0, +2761, 2887, 0, +2860, 3019, 0, +2967, 3151, 0, +3079, 3283, 0, +3196, 3416, 0, +3316, 3548, 0, +3438, 3680, 0, +3564, 3812, 0, +3690, 3944, 0, +3818, 4076, 0, +3948, 4095, 0, +2226, 0, 1989, +2226, 0, 1987, +2225, 0, 1983, +2225, 0, 1979, +2224, 0, 1973, +2223, 0, 1965, +2223, 0, 1951, +2223, 0, 1931, +2223, 0, 1904, +2223, 0, 1865, +2223, 0, 1808, +2223, 0, 1717, +2223, 0, 1557, +2223, 0, 1181, +2223, 0, 0, +2223, 0, 0, +2223, 1595, 0, +2356, 2088, 0, +2489, 2377, 0, +2621, 2598, 0, +2718, 2754, 0, +2802, 2887, 0, +2894, 3019, 0, +2994, 3151, 0, +3100, 3283, 0, +3212, 3416, 0, +3328, 3548, 0, +3448, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3822, 4076, 0, +3951, 4095, 0, +2358, 0, 2113, +2358, 0, 2111, +2358, 0, 2109, +2357, 0, 2105, +2357, 0, 2101, +2356, 0, 2095, +2356, 0, 2084, +2356, 0, 2070, +2356, 0, 2050, +2356, 0, 2022, +2356, 0, 1982, +2356, 0, 1922, +2356, 0, 1828, +2356, 0, 1659, +2356, 0, 1240, +2356, 0, 0, +2356, 0, 0, +2356, 1716, 0, +2489, 2218, 0, +2621, 2507, 0, +2754, 2730, 0, +2852, 2887, 0, +2935, 3019, 0, +3027, 3151, 0, +3127, 3283, 0, +3233, 3416, 0, +3344, 3548, 0, +3461, 3680, 0, +3581, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2239, +2491, 0, 2238, +2490, 0, 2236, +2490, 0, 2234, +2489, 0, 2230, +2489, 0, 2226, +2489, 0, 2218, +2489, 0, 2207, +2489, 0, 2193, +2489, 0, 2172, +2489, 0, 2144, +2489, 0, 2103, +2489, 0, 2041, +2489, 0, 1943, +2489, 0, 1767, +2489, 0, 1310, +2489, 0, 0, +2489, 0, 0, +2489, 1840, 0, +2621, 2346, 0, +2754, 2638, 0, +2887, 2861, 0, +2985, 3019, 0, +3068, 3151, 0, +3160, 3283, 0, +3259, 3416, 0, +3365, 3548, 0, +3477, 3680, 0, +3593, 3812, 0, +3713, 3944, 0, +3835, 4076, 0, +3961, 4095, 0, +2623, 0, 2367, +2623, 0, 2366, +2623, 0, 2364, +2622, 0, 2362, +2622, 0, 2360, +2621, 0, 2356, +2621, 0, 2351, +2621, 0, 2343, +2621, 0, 2332, +2621, 0, 2317, +2621, 0, 2297, +2621, 0, 2268, +2621, 0, 2226, +2621, 0, 2163, +2621, 0, 2062, +2621, 0, 1880, +2621, 0, 1387, +2621, 0, 0, +2621, 0, 0, +2621, 1966, 0, +2754, 2477, 0, +2887, 2769, 0, +3019, 2992, 0, +3118, 3151, 0, +3201, 3283, 0, +3293, 3416, 0, +3392, 3548, 0, +3498, 3680, 0, +3609, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2496, +2755, 0, 2495, +2755, 0, 2494, +2755, 0, 2492, +2755, 0, 2490, +2754, 0, 2488, +2754, 0, 2484, +2754, 0, 2478, +2754, 0, 2470, +2754, 0, 2459, +2754, 0, 2444, +2754, 0, 2423, +2754, 0, 2394, +2754, 0, 2351, +2754, 0, 2287, +2754, 0, 2185, +2754, 0, 1997, +2754, 0, 1476, +2754, 0, 0, +2754, 0, 0, +2754, 2094, 0, +2887, 2607, 0, +3019, 2900, 0, +3151, 3124, 0, +3251, 3283, 0, +3334, 3416, 0, +3425, 3548, 0, +3525, 3680, 0, +3630, 3812, 0, +3742, 3944, 0, +3858, 4076, 0, +3977, 4095, 0, +2887, 0, 2625, +2887, 0, 2625, +2887, 0, 2624, +2887, 0, 2623, +2887, 0, 2621, +2887, 0, 2619, +2887, 0, 2616, +2887, 0, 2612, +2887, 0, 2606, +2887, 0, 2598, +2887, 0, 2587, +2887, 0, 2572, +2887, 0, 2551, +2887, 0, 2521, +2887, 0, 2478, +2887, 0, 2413, +2887, 0, 2310, +2887, 0, 2118, +2887, 0, 1569, +2887, 0, 0, +2887, 0, 0, +2887, 2223, 0, +3019, 2738, 0, +3151, 3032, 0, +3283, 3255, 0, +3384, 3416, 0, +3466, 3548, 0, +3558, 3680, 0, +3657, 3812, 0, +3763, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2755, +3019, 0, 2755, +3019, 0, 2754, +3019, 0, 2753, +3019, 0, 2752, +3019, 0, 2751, +3019, 0, 2748, +3019, 0, 2745, +3019, 0, 2741, +3019, 0, 2735, +3019, 0, 2727, +3019, 0, 2716, +3019, 0, 2701, +3019, 0, 2679, +3019, 0, 2649, +3019, 0, 2606, +3019, 0, 2541, +3019, 0, 2435, +3019, 0, 2241, +3019, 0, 1670, +3019, 0, 0, +3019, 0, 0, +3019, 2352, 0, +3151, 2870, 0, +3283, 3163, 0, +3416, 3387, 0, +3516, 3548, 0, +3599, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2886, +3152, 0, 2886, +3152, 0, 2885, +3151, 0, 2885, +3151, 0, 2884, +3151, 0, 2883, +3151, 0, 2881, +3151, 0, 2879, +3151, 0, 2875, +3151, 0, 2871, +3151, 0, 2865, +3151, 0, 2857, +3151, 0, 2845, +3151, 0, 2830, +3151, 0, 2809, +3151, 0, 2779, +3151, 0, 2735, +3151, 0, 2670, +3151, 0, 2564, +3151, 0, 2367, +3151, 0, 1779, +3151, 0, 0, +3151, 0, 0, +3151, 2482, 0, +3283, 3000, 0, +3416, 3295, 0, +3548, 3519, 0, +3648, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3017, +3283, 0, 3017, +3283, 0, 3016, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3014, +3283, 0, 3013, +3283, 0, 3011, +3283, 0, 3009, +3283, 0, 3005, +3283, 0, 3001, +3283, 0, 2995, +3283, 0, 2987, +3283, 0, 2976, +3283, 0, 2960, +3283, 0, 2939, +3283, 0, 2909, +3283, 0, 2865, +3283, 0, 2799, +3283, 0, 2692, +3283, 0, 2493, +3283, 0, 1890, +3283, 0, 0, +3283, 0, 0, +3283, 2613, 0, +3416, 3133, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4054, 4095, 0, +3416, 0, 3148, +3416, 0, 3148, +3416, 0, 3148, +3416, 0, 3147, +3416, 0, 3147, +3416, 0, 3146, +3416, 0, 3145, +3416, 0, 3144, +3416, 0, 3142, +3416, 0, 3140, +3416, 0, 3136, +3416, 0, 3132, +3416, 0, 3126, +3416, 0, 3118, +3416, 0, 3106, +3416, 0, 3091, +3416, 0, 3070, +3416, 0, 3039, +3416, 0, 2996, +3416, 0, 2929, +3416, 0, 2822, +3416, 0, 2621, +3416, 0, 2011, +3416, 0, 0, +3416, 0, 0, +3416, 2744, 0, +3548, 3265, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3278, +3548, 0, 3277, +3548, 0, 3275, +3548, 0, 3273, +3548, 0, 3271, +3548, 0, 3268, +3548, 0, 3263, +3548, 0, 3257, +3548, 0, 3249, +3548, 0, 3238, +3548, 0, 3222, +3548, 0, 3201, +3548, 0, 3171, +3548, 0, 3126, +3548, 0, 3060, +3548, 0, 2952, +3548, 0, 2751, +3548, 0, 2130, +3548, 0, 0, +3548, 0, 0, +3548, 2875, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3407, +3680, 0, 3405, +3680, 0, 3402, +3680, 0, 3399, +3680, 0, 3395, +3680, 0, 3388, +3680, 0, 3380, +3680, 0, 3369, +3680, 0, 3354, +3680, 0, 3332, +3680, 0, 3302, +3680, 0, 3258, +3680, 0, 3191, +3680, 0, 3083, +3680, 0, 2881, +3680, 0, 2257, +3680, 0, 0, +3680, 0, 0, +3680, 3006, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3537, +3812, 0, 3534, +3812, 0, 3531, +3812, 0, 3526, +3812, 0, 3520, +3812, 0, 3512, +3812, 0, 3501, +3812, 0, 3485, +3812, 0, 3464, +3812, 0, 3433, +3812, 0, 3389, +3812, 0, 3322, +3812, 0, 3214, +3812, 0, 3012, +3812, 0, 2382, +3812, 0, 0, +3812, 0, 0, +3812, 3138, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3668, +3944, 0, 3666, +3944, 0, 3662, +3944, 0, 3658, +3944, 0, 3652, +3944, 0, 3644, +3944, 0, 3632, +3944, 0, 3617, +3944, 0, 3595, +3944, 0, 3565, +3944, 0, 3521, +3944, 0, 3454, +3944, 0, 3346, +3944, 0, 3143, +3944, 0, 2508, +3944, 0, 0, +3944, 0, 0, +3944, 3270, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3802, +4076, 0, 3800, +4076, 0, 3797, +4076, 0, 3794, +4076, 0, 3790, +4076, 0, 3784, +4076, 0, 3775, +4076, 0, 3764, +4076, 0, 3749, +4076, 0, 3727, +4076, 0, 3696, +4076, 0, 3652, +4076, 0, 3585, +4076, 0, 3477, +4076, 0, 3273, +4076, 0, 2635, +4076, 0, 0, +4076, 0, 0, +4076, 3402, 0, +4095, 3925, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3926, +4095, 0, 3922, +4095, 0, 3916, +4095, 0, 3908, +4095, 0, 3896, +4095, 0, 3881, +4095, 0, 3859, +4095, 0, 3829, +4095, 0, 3784, +4095, 0, 3717, +4095, 0, 3609, +4095, 0, 3405, +4095, 0, 2767, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 667, 888, +0, 719, 888, +0, 781, 888, +0, 852, 888, +0, 888, 838, +0, 888, 697, +0, 888, 392, +0, 1025, 0, +0, 1160, 0, +431, 1295, 0, +803, 1429, 0, +1057, 1563, 0, +1262, 1696, 0, +1442, 1828, 0, +1607, 1961, 0, +1763, 2094, 0, +1911, 2226, 0, +2055, 2358, 0, +2196, 2491, 0, +2335, 2623, 0, +2472, 2755, 0, +2607, 2887, 0, +2742, 3019, 0, +2876, 3152, 0, +3009, 3284, 0, +3143, 3416, 0, +3276, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 608, 888, +0, 678, 882, +0, 745, 882, +0, 822, 882, +0, 882, 855, +0, 882, 719, +0, 882, 436, +0, 1020, 0, +0, 1157, 0, +529, 1292, 0, +849, 1427, 0, +1084, 1561, 0, +1279, 1695, 0, +1454, 1828, 0, +1615, 1961, 0, +1768, 2093, 0, +1915, 2226, 0, +2058, 2358, 0, +2199, 2491, 0, +2336, 2623, 0, +2473, 2755, 0, +2608, 2887, 0, +2742, 3019, 0, +2877, 3152, 0, +3010, 3283, 0, +3143, 3416, 0, +3276, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 515, 888, +0, 599, 882, +0, 691, 873, +0, 776, 873, +0, 870, 873, +0, 873, 749, +0, 873, 488, +0, 1014, 0, +214, 1152, 0, +635, 1289, 0, +904, 1424, 0, +1118, 1559, 0, +1302, 1693, 0, +1469, 1827, 0, +1626, 1960, 0, +1776, 2093, 0, +1921, 2225, 0, +2062, 2358, 0, +2202, 2490, 0, +2338, 2623, 0, +2475, 2755, 0, +2609, 2887, 0, +2743, 3019, 0, +2877, 3152, 0, +3010, 3283, 0, +3143, 3416, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 350, 888, +0, 466, 882, +0, 585, 873, +166, 708, 862, +166, 815, 862, +166, 862, 784, +166, 862, 550, +0, 1005, 0, +455, 1146, 0, +746, 1284, 0, +969, 1421, 0, +1159, 1557, 0, +1330, 1691, 0, +1489, 1825, 0, +1640, 1959, 0, +1786, 2092, 0, +1928, 2225, 0, +2068, 2357, 0, +2206, 2490, 0, +2341, 2622, 0, +2477, 2755, 0, +2611, 2887, 0, +2745, 3019, 0, +2878, 3151, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 888, +0, 190, 882, +0, 390, 873, +166, 567, 862, +412, 730, 846, +412, 846, 828, +412, 846, 622, +397, 994, 298, +655, 1137, 80, +862, 1278, 0, +1043, 1416, 0, +1209, 1553, 0, +1365, 1689, 0, +1514, 1823, 0, +1658, 1958, 0, +1799, 2091, 0, +1938, 2224, 0, +2075, 2357, 0, +2211, 2489, 0, +2346, 2622, 0, +2480, 2755, 0, +2613, 2887, 0, +2746, 3019, 0, +2879, 3151, 0, +3012, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 888, +0, 0, 882, +0, 0, 873, +166, 264, 862, +412, 541, 846, +614, 758, 824, +614, 824, 702, +673, 978, 544, +831, 1126, 430, +982, 1270, 212, +1127, 1410, 0, +1269, 1549, 0, +1408, 1685, 0, +1545, 1821, 0, +1681, 1956, 0, +1816, 2089, 0, +1951, 2223, 0, +2084, 2356, 0, +2218, 2489, 0, +2351, 2621, 0, +2484, 2754, 0, +2616, 2887, 0, +2748, 3019, 0, +2881, 3151, 0, +3013, 3283, 0, +3145, 3416, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +392, 0, 888, +436, 0, 882, +488, 0, 873, +550, 166, 862, +622, 412, 846, +702, 614, 824, +792, 792, 792, +890, 956, 746, +994, 1110, 676, +1104, 1258, 562, +1219, 1402, 344, +1338, 1543, 0, +1460, 1681, 0, +1585, 1817, 0, +1711, 1953, 0, +1838, 2087, 0, +1967, 2221, 0, +2096, 2355, 0, +2227, 2488, 0, +2357, 2621, 0, +2489, 2754, 0, +2620, 2886, 0, +2751, 3018, 0, +2883, 3151, 0, +3015, 3283, 0, +3147, 3415, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +811, 0, 1025, +829, 0, 1020, +852, 0, 1014, +881, 0, 1005, +917, 298, 994, +960, 544, 978, +956, 746, 890, +956, 834, 746, +1110, 1092, 676, +1211, 1258, 562, +1304, 1402, 344, +1405, 1543, 0, +1512, 1681, 0, +1625, 1817, 0, +1742, 1953, 0, +1862, 2087, 0, +1985, 2221, 0, +2110, 2355, 0, +2237, 2488, 0, +2365, 2621, 0, +2494, 2754, 0, +2624, 2886, 0, +2754, 3018, 0, +2885, 3151, 0, +3016, 3283, 0, +3148, 3415, 0, +3280, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1079, 0, 1160, +1089, 0, 1157, +1102, 0, 1152, +1119, 0, 1146, +1137, 80, 1134, +1126, 430, 1079, +1110, 676, 994, +1110, 676, 805, +1110, 886, 676, +1258, 1181, 562, +1398, 1402, 344, +1482, 1543, 0, +1574, 1681, 0, +1673, 1817, 0, +1779, 1953, 0, +1891, 2087, 0, +2008, 2221, 0, +2127, 2355, 0, +2250, 2488, 0, +2375, 2621, 0, +2502, 2754, 0, +2630, 2886, 0, +2759, 3018, 0, +2889, 3151, 0, +3019, 3283, 0, +3150, 3415, 0, +3281, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1292, 0, 1295, +1292, 0, 1286, +1289, 0, 1271, +1284, 0, 1249, +1278, 0, 1218, +1270, 212, 1172, +1258, 562, 1104, +1258, 562, 963, +1258, 562, 661, +1258, 946, 562, +1402, 1277, 344, +1543, 1516, 0, +1645, 1681, 0, +1732, 1817, 0, +1826, 1953, 0, +1928, 2087, 0, +2036, 2221, 0, +2150, 2355, 0, +2267, 2488, 0, +2388, 2621, 0, +2512, 2754, 0, +2637, 2886, 0, +2764, 3018, 0, +2893, 3151, 0, +3022, 3283, 0, +3152, 3415, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1429, 0, 1376, +1427, 0, 1366, +1424, 0, 1353, +1421, 0, 1335, +1416, 0, 1310, +1410, 0, 1273, +1402, 344, 1219, +1402, 344, 1114, +1402, 344, 919, +1402, 344, 345, +1402, 1017, 344, +1543, 1381, 0, +1681, 1631, 0, +1799, 1817, 0, +1882, 1953, 0, +1973, 2087, 0, +2072, 2221, 0, +2178, 2355, 0, +2289, 2488, 0, +2405, 2621, 0, +2525, 2754, 0, +2647, 2886, 0, +2772, 3018, 0, +2898, 3151, 0, +3026, 3283, 0, +3155, 3415, 0, +3285, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1563, 0, 1463, +1561, 0, 1456, +1559, 0, 1445, +1557, 0, 1430, +1553, 0, 1409, +1549, 0, 1380, +1543, 0, 1338, +1543, 0, 1259, +1543, 0, 1127, +1543, 0, 852, +1543, 172, 0, +1543, 1096, 0, +1681, 1489, 0, +1817, 1750, 0, +1947, 1953, 0, +2027, 2087, 0, +2116, 2221, 0, +2213, 2355, 0, +2317, 2488, 0, +2427, 2621, 0, +2541, 2754, 0, +2660, 2886, 0, +2782, 3018, 0, +2906, 3151, 0, +3032, 3283, 0, +3160, 3415, 0, +3288, 3548, 0, +3418, 3680, 0, +3548, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1696, 0, 1559, +1695, 0, 1552, +1693, 0, 1544, +1691, 0, 1532, +1689, 0, 1515, +1685, 0, 1492, +1681, 0, 1460, +1681, 0, 1401, +1681, 0, 1308, +1681, 0, 1142, +1681, 0, 742, +1681, 0, 0, +1681, 1184, 0, +1817, 1604, 0, +1953, 1872, 0, +2087, 2085, 0, +2169, 2221, 0, +2256, 2355, 0, +2352, 2488, 0, +2454, 2621, 0, +2563, 2754, 0, +2677, 2886, 0, +2794, 3018, 0, +2916, 3151, 0, +3039, 3283, 0, +3165, 3415, 0, +3292, 3548, 0, +3421, 3680, 0, +3550, 3812, 0, +3680, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1828, 0, 1661, +1828, 0, 1656, +1827, 0, 1650, +1825, 0, 1640, +1823, 0, 1627, +1821, 0, 1609, +1817, 0, 1585, +1817, 0, 1540, +1817, 0, 1474, +1817, 0, 1366, +1817, 0, 1164, +1817, 0, 536, +1817, 0, 0, +1817, 1281, 0, +1953, 1722, 0, +2087, 1996, 0, +2221, 2212, 0, +2308, 2355, 0, +2394, 2488, 0, +2488, 2621, 0, +2590, 2754, 0, +2698, 2886, 0, +2811, 3018, 0, +2928, 3151, 0, +3049, 3283, 0, +3173, 3415, 0, +3298, 3548, 0, +3425, 3680, 0, +3553, 3812, 0, +3683, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1770, +1961, 0, 1766, +1960, 0, 1761, +1959, 0, 1754, +1958, 0, 1743, +1956, 0, 1730, +1953, 0, 1711, +1953, 0, 1678, +1953, 0, 1629, +1953, 0, 1555, +1953, 0, 1433, +1953, 0, 1190, +1953, 0, 0, +1953, 0, 0, +1953, 1385, 0, +2087, 1843, 0, +2221, 2123, 0, +2355, 2340, 0, +2445, 2488, 0, +2530, 2621, 0, +2624, 2754, 0, +2725, 2886, 0, +2832, 3018, 0, +2945, 3151, 0, +3062, 3283, 0, +3182, 3415, 0, +3305, 3548, 0, +3431, 3680, 0, +3558, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1884, +2093, 0, 1881, +2093, 0, 1877, +2092, 0, 1871, +2091, 0, 1863, +2089, 0, 1853, +2087, 0, 1838, +2087, 0, 1813, +2087, 0, 1778, +2087, 0, 1726, +2087, 0, 1646, +2087, 0, 1509, +2087, 0, 1224, +2087, 0, 0, +2087, 0, 0, +2087, 1494, 0, +2221, 1967, 0, +2355, 2251, 0, +2488, 2470, 0, +2581, 2621, 0, +2666, 2754, 0, +2759, 2886, 0, +2859, 3018, 0, +2966, 3151, 0, +3078, 3283, 0, +3195, 3415, 0, +3315, 3548, 0, +3438, 3680, 0, +3563, 3812, 0, +3690, 3944, 0, +3818, 4076, 0, +3947, 4095, 0, +2226, 0, 2002, +2226, 0, 1999, +2225, 0, 1996, +2225, 0, 1992, +2224, 0, 1986, +2223, 0, 1978, +2221, 0, 1967, +2221, 0, 1948, +2221, 0, 1922, +2221, 0, 1885, +2221, 0, 1830, +2221, 0, 1744, +2221, 0, 1596, +2221, 0, 1264, +2221, 0, 0, +2221, 0, 0, +2221, 1608, 0, +2355, 2093, 0, +2488, 2379, 0, +2621, 2600, 0, +2716, 2754, 0, +2800, 2886, 0, +2892, 3018, 0, +2993, 3151, 0, +3099, 3283, 0, +3211, 3415, 0, +3328, 3548, 0, +3448, 3680, 0, +3571, 3812, 0, +3696, 3944, 0, +3822, 4076, 0, +3951, 4095, 0, +2358, 0, 2123, +2358, 0, 2121, +2358, 0, 2119, +2357, 0, 2115, +2357, 0, 2111, +2356, 0, 2105, +2355, 0, 2096, +2355, 0, 2083, +2355, 0, 2063, +2355, 0, 2037, +2355, 0, 1998, +2355, 0, 1940, +2355, 0, 1849, +2355, 0, 1689, +2355, 0, 1313, +2355, 0, 0, +2355, 0, 0, +2355, 1727, 0, +2488, 2221, 0, +2621, 2509, 0, +2754, 2731, 0, +2850, 2886, 0, +2934, 3018, 0, +3026, 3151, 0, +3126, 3283, 0, +3232, 3415, 0, +3344, 3548, 0, +3460, 3680, 0, +3580, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2247, +2491, 0, 2245, +2490, 0, 2243, +2490, 0, 2241, +2489, 0, 2238, +2489, 0, 2233, +2488, 0, 2227, +2488, 0, 2217, +2488, 0, 2202, +2488, 0, 2183, +2488, 0, 2155, +2488, 0, 2115, +2488, 0, 2055, +2488, 0, 1960, +2488, 0, 1791, +2488, 0, 1373, +2488, 0, 0, +2488, 0, 0, +2488, 1848, 0, +2621, 2349, 0, +2754, 2640, 0, +2886, 2862, 0, +2984, 3018, 0, +3067, 3151, 0, +3159, 3283, 0, +3259, 3415, 0, +3365, 3548, 0, +3477, 3680, 0, +3593, 3812, 0, +3713, 3944, 0, +3835, 4076, 0, +3961, 4095, 0, +2623, 0, 2372, +2623, 0, 2372, +2623, 0, 2370, +2622, 0, 2368, +2622, 0, 2366, +2621, 0, 2362, +2621, 0, 2357, +2621, 0, 2350, +2621, 0, 2339, +2621, 0, 2325, +2621, 0, 2304, +2621, 0, 2276, +2621, 0, 2235, +2621, 0, 2173, +2621, 0, 2075, +2621, 0, 1899, +2621, 0, 1441, +2621, 0, 0, +2621, 0, 0, +2621, 1972, 0, +2754, 2479, 0, +2886, 2770, 0, +3018, 2992, 0, +3117, 3151, 0, +3200, 3283, 0, +3292, 3415, 0, +3392, 3548, 0, +3497, 3680, 0, +3609, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2500, +2755, 0, 2499, +2755, 0, 2498, +2755, 0, 2497, +2755, 0, 2495, +2754, 0, 2492, +2754, 0, 2489, +2754, 0, 2483, +2754, 0, 2475, +2754, 0, 2464, +2754, 0, 2450, +2754, 0, 2429, +2754, 0, 2400, +2754, 0, 2358, +2754, 0, 2295, +2754, 0, 2195, +2754, 0, 2012, +2754, 0, 1521, +2754, 0, 0, +2754, 0, 0, +2754, 2099, 0, +2886, 2609, 0, +3018, 2901, 0, +3151, 3124, 0, +3250, 3283, 0, +3333, 3415, 0, +3425, 3548, 0, +3524, 3680, 0, +3630, 3812, 0, +3741, 3944, 0, +3858, 4076, 0, +3977, 4095, 0, +2887, 0, 2628, +2887, 0, 2628, +2887, 0, 2627, +2887, 0, 2626, +2887, 0, 2625, +2887, 0, 2623, +2886, 0, 2620, +2886, 0, 2616, +2886, 0, 2610, +2886, 0, 2602, +2886, 0, 2591, +2886, 0, 2576, +2886, 0, 2555, +2886, 0, 2526, +2886, 0, 2483, +2886, 0, 2419, +2886, 0, 2317, +2886, 0, 2129, +2886, 0, 1606, +2886, 0, 0, +2886, 0, 0, +2886, 2226, 0, +3018, 2739, 0, +3151, 3032, 0, +3283, 3256, 0, +3383, 3415, 0, +3466, 3548, 0, +3557, 3680, 0, +3657, 3812, 0, +3762, 3944, 0, +3874, 4076, 0, +3990, 4095, 0, +3019, 0, 2758, +3019, 0, 2757, +3019, 0, 2757, +3019, 0, 2756, +3019, 0, 2755, +3019, 0, 2753, +3018, 0, 2751, +3018, 0, 2748, +3018, 0, 2744, +3018, 0, 2738, +3018, 0, 2730, +3018, 0, 2719, +3018, 0, 2703, +3018, 0, 2683, +3018, 0, 2653, +3018, 0, 2610, +3018, 0, 2545, +3018, 0, 2441, +3018, 0, 2249, +3018, 0, 1700, +3018, 0, 0, +3018, 0, 0, +3018, 2354, 0, +3151, 2871, 0, +3283, 3164, 0, +3415, 3387, 0, +3515, 3548, 0, +3598, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2888, +3152, 0, 2888, +3152, 0, 2887, +3151, 0, 2886, +3151, 0, 2886, +3151, 0, 2885, +3151, 0, 2883, +3151, 0, 2881, +3151, 0, 2877, +3151, 0, 2873, +3151, 0, 2867, +3151, 0, 2859, +3151, 0, 2848, +3151, 0, 2833, +3151, 0, 2812, +3151, 0, 2782, +3151, 0, 2738, +3151, 0, 2673, +3151, 0, 2568, +3151, 0, 2373, +3151, 0, 1802, +3151, 0, 0, +3151, 0, 0, +3151, 2484, 0, +3283, 3001, 0, +3415, 3295, 0, +3548, 3519, 0, +3648, 3680, 0, +3731, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3018, +3283, 0, 3018, +3283, 0, 3018, +3283, 0, 3017, +3283, 0, 3016, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3013, +3283, 0, 3010, +3283, 0, 3007, +3283, 0, 3003, +3283, 0, 2997, +3283, 0, 2988, +3283, 0, 2977, +3283, 0, 2962, +3283, 0, 2941, +3283, 0, 2911, +3283, 0, 2867, +3283, 0, 2801, +3283, 0, 2695, +3283, 0, 2498, +3283, 0, 1908, +3283, 0, 0, +3283, 0, 0, +3283, 2614, 0, +3415, 3133, 0, +3548, 3427, 0, +3680, 3651, 0, +3781, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4054, 4095, 0, +3416, 0, 3149, +3416, 0, 3149, +3416, 0, 3149, +3416, 0, 3148, +3416, 0, 3148, +3416, 0, 3147, +3415, 0, 3147, +3415, 0, 3145, +3415, 0, 3144, +3415, 0, 3141, +3415, 0, 3138, +3415, 0, 3133, +3415, 0, 3127, +3415, 0, 3119, +3415, 0, 3108, +3415, 0, 3093, +3415, 0, 3071, +3415, 0, 3041, +3415, 0, 2997, +3415, 0, 2931, +3415, 0, 2824, +3415, 0, 2625, +3415, 0, 2026, +3415, 0, 0, +3415, 0, 0, +3415, 2745, 0, +3548, 3265, 0, +3680, 3559, 0, +3812, 3783, 0, +3913, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3279, +3548, 0, 3278, +3548, 0, 3276, +3548, 0, 3274, +3548, 0, 3272, +3548, 0, 3269, +3548, 0, 3264, +3548, 0, 3258, +3548, 0, 3250, +3548, 0, 3239, +3548, 0, 3223, +3548, 0, 3202, +3548, 0, 3172, +3548, 0, 3128, +3548, 0, 3061, +3548, 0, 2954, +3548, 0, 2754, +3548, 0, 2141, +3548, 0, 0, +3548, 0, 0, +3548, 2876, 0, +3680, 3396, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3409, +3680, 0, 3407, +3680, 0, 3406, +3680, 0, 3403, +3680, 0, 3400, +3680, 0, 3395, +3680, 0, 3389, +3680, 0, 3381, +3680, 0, 3370, +3680, 0, 3354, +3680, 0, 3333, +3680, 0, 3303, +3680, 0, 3258, +3680, 0, 3192, +3680, 0, 3084, +3680, 0, 2883, +3680, 0, 2266, +3680, 0, 0, +3680, 0, 0, +3680, 3007, 0, +3812, 3528, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3539, +3812, 0, 3537, +3812, 0, 3534, +3812, 0, 3531, +3812, 0, 3527, +3812, 0, 3521, +3812, 0, 3513, +3812, 0, 3501, +3812, 0, 3486, +3812, 0, 3464, +3812, 0, 3434, +3812, 0, 3390, +3812, 0, 3323, +3812, 0, 3215, +3812, 0, 3014, +3812, 0, 2389, +3812, 0, 0, +3812, 0, 0, +3812, 3139, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3670, +3944, 0, 3668, +3944, 0, 3666, +3944, 0, 3663, +3944, 0, 3658, +3944, 0, 3652, +3944, 0, 3644, +3944, 0, 3633, +3944, 0, 3617, +3944, 0, 3596, +3944, 0, 3565, +3944, 0, 3521, +3944, 0, 3454, +3944, 0, 3346, +3944, 0, 3144, +3944, 0, 2513, +3944, 0, 0, +3944, 0, 0, +3944, 3270, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3802, +4076, 0, 3800, +4076, 0, 3798, +4076, 0, 3794, +4076, 0, 3790, +4076, 0, 3784, +4076, 0, 3776, +4076, 0, 3764, +4076, 0, 3749, +4076, 0, 3727, +4076, 0, 3697, +4076, 0, 3653, +4076, 0, 3586, +4076, 0, 3477, +4076, 0, 3274, +4076, 0, 2639, +4076, 0, 0, +4076, 0, 0, +4076, 3402, 0, +4095, 3925, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3935, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3930, +4095, 0, 3927, +4095, 0, 3922, +4095, 0, 3916, +4095, 0, 3908, +4095, 0, 3896, +4095, 0, 3881, +4095, 0, 3859, +4095, 0, 3829, +4095, 0, 3784, +4095, 0, 3718, +4095, 0, 3609, +4095, 0, 3406, +4095, 0, 2770, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 792, 1025, +0, 832, 1025, +0, 881, 1025, +0, 939, 1025, +0, 1006, 1025, +0, 1025, 957, +0, 1025, 811, +0, 1025, 488, +0, 1160, 0, +0, 1295, 0, +471, 1429, 0, +897, 1563, 0, +1167, 1696, 0, +1381, 1828, 0, +1565, 1961, 0, +1733, 2094, 0, +1890, 2226, 0, +2040, 2358, 0, +2185, 2491, 0, +2327, 2623, 0, +2466, 2755, 0, +2603, 2887, 0, +2738, 3019, 0, +2873, 3152, 0, +3008, 3284, 0, +3141, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 748, 1025, +0, 800, 1020, +0, 852, 1020, +0, 914, 1020, +0, 985, 1020, +0, 1020, 970, +0, 1020, 829, +0, 1020, 524, +0, 1157, 0, +0, 1292, 0, +562, 1427, 0, +935, 1561, 0, +1188, 1695, 0, +1394, 1828, 0, +1574, 1961, 0, +1739, 2093, 0, +1894, 2226, 0, +2043, 2358, 0, +2187, 2491, 0, +2328, 2623, 0, +2467, 2755, 0, +2604, 2887, 0, +2739, 3019, 0, +2874, 3152, 0, +3008, 3283, 0, +3141, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 681, 1025, +0, 740, 1020, +0, 810, 1014, +0, 877, 1014, +0, 954, 1014, +0, 1014, 987, +0, 1014, 852, +0, 1014, 568, +0, 1152, 0, +9, 1289, 0, +662, 1424, 0, +981, 1559, 0, +1216, 1693, 0, +1412, 1827, 0, +1586, 1960, 0, +1748, 2093, 0, +1900, 2225, 0, +2047, 2358, 0, +2190, 2490, 0, +2331, 2623, 0, +2469, 2755, 0, +2605, 2887, 0, +2740, 3019, 0, +2875, 3152, 0, +3008, 3283, 0, +3142, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 573, 1025, +0, 647, 1020, +0, 731, 1014, +0, 823, 1005, +0, 908, 1005, +0, 1002, 1005, +0, 1005, 881, +0, 1005, 620, +0, 1146, 0, +346, 1284, 0, +767, 1421, 0, +1037, 1557, 0, +1249, 1691, 0, +1434, 1825, 0, +1601, 1959, 0, +1758, 2092, 0, +1908, 2225, 0, +2053, 2357, 0, +2195, 2490, 0, +2334, 2622, 0, +2471, 2755, 0, +2607, 2887, 0, +2741, 3019, 0, +2876, 3151, 0, +3009, 3283, 0, +3142, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 371, 1025, +0, 482, 1020, +0, 598, 1014, +0, 717, 1005, +298, 840, 994, +298, 947, 994, +298, 994, 917, +298, 994, 682, +81, 1137, 80, +587, 1278, 0, +878, 1416, 0, +1102, 1553, 0, +1291, 1689, 0, +1462, 1823, 0, +1621, 1958, 0, +1772, 2091, 0, +1918, 2224, 0, +2060, 2357, 0, +2200, 2489, 0, +2337, 2622, 0, +2474, 2755, 0, +2609, 2887, 0, +2743, 3019, 0, +2877, 3151, 0, +3010, 3283, 0, +3143, 3416, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1025, +0, 81, 1020, +0, 323, 1014, +0, 523, 1005, +298, 699, 994, +544, 862, 978, +544, 978, 960, +544, 978, 754, +529, 1126, 430, +787, 1270, 212, +994, 1410, 0, +1176, 1549, 0, +1341, 1685, 0, +1497, 1821, 0, +1646, 1956, 0, +1790, 2089, 0, +1931, 2223, 0, +2070, 2356, 0, +2207, 2489, 0, +2343, 2621, 0, +2478, 2754, 0, +2612, 2887, 0, +2745, 3019, 0, +2879, 3151, 0, +3011, 3283, 0, +3144, 3416, 0, +3277, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +0, 0, 1025, +0, 0, 1020, +0, 0, 1014, +0, 0, 1005, +298, 397, 994, +544, 673, 978, +746, 890, 956, +746, 956, 834, +805, 1110, 676, +963, 1258, 562, +1114, 1402, 344, +1259, 1543, 0, +1401, 1681, 0, +1540, 1817, 0, +1678, 1953, 0, +1813, 2087, 0, +1948, 2221, 0, +2083, 2355, 0, +2217, 2488, 0, +2350, 2621, 0, +2483, 2754, 0, +2616, 2886, 0, +2748, 3018, 0, +2881, 3151, 0, +3013, 3283, 0, +3145, 3415, 0, +3278, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +488, 0, 1025, +524, 0, 1020, +568, 0, 1014, +620, 0, 1005, +682, 298, 994, +754, 544, 978, +834, 746, 956, +924, 924, 924, +1021, 1088, 878, +1126, 1242, 809, +1236, 1390, 695, +1351, 1534, 476, +1470, 1674, 0, +1592, 1813, 0, +1716, 1950, 0, +1843, 2085, 0, +1970, 2220, 0, +2099, 2353, 0, +2229, 2487, 0, +2359, 2620, 0, +2490, 2753, 0, +2621, 2886, 0, +2752, 3018, 0, +2883, 3151, 0, +3015, 3283, 0, +3147, 3415, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3939, 4095, 0, +929, 0, 1160, +943, 0, 1157, +960, 0, 1152, +983, 0, 1146, +1013, 80, 1137, +1049, 430, 1126, +1092, 676, 1110, +1088, 878, 1021, +1088, 967, 878, +1242, 1225, 809, +1343, 1390, 695, +1437, 1534, 476, +1537, 1674, 0, +1644, 1813, 0, +1757, 1950, 0, +1873, 2085, 0, +1994, 2220, 0, +2117, 2353, 0, +2242, 2487, 0, +2369, 2620, 0, +2497, 2753, 0, +2626, 2886, 0, +2756, 3018, 0, +2887, 3151, 0, +3017, 3283, 0, +3149, 3415, 0, +3280, 3548, 0, +3412, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1204, 0, 1295, +1211, 0, 1292, +1221, 0, 1289, +1235, 0, 1284, +1251, 0, 1278, +1270, 212, 1266, +1258, 562, 1211, +1242, 809, 1126, +1242, 809, 938, +1242, 1018, 809, +1390, 1313, 695, +1531, 1534, 476, +1614, 1674, 0, +1706, 1813, 0, +1806, 1950, 0, +1912, 2085, 0, +2023, 2220, 0, +2140, 2353, 0, +2260, 2487, 0, +2382, 2620, 0, +2507, 2753, 0, +2634, 2886, 0, +2762, 3018, 0, +2891, 3151, 0, +3021, 3283, 0, +3151, 3415, 0, +3282, 3548, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1419, 0, 1429, +1424, 0, 1427, +1424, 0, 1418, +1421, 0, 1403, +1416, 0, 1381, +1410, 0, 1350, +1402, 344, 1304, +1390, 695, 1236, +1390, 695, 1095, +1390, 695, 793, +1390, 1078, 695, +1534, 1409, 476, +1674, 1648, 0, +1777, 1813, 0, +1864, 1950, 0, +1958, 2085, 0, +2060, 2220, 0, +2168, 2353, 0, +2282, 2487, 0, +2399, 2620, 0, +2521, 2753, 0, +2644, 2886, 0, +2769, 3018, 0, +2896, 3151, 0, +3025, 3283, 0, +3154, 3415, 0, +3284, 3548, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1563, 0, 1515, +1561, 0, 1508, +1559, 0, 1499, +1557, 0, 1486, +1553, 0, 1467, +1549, 0, 1442, +1543, 0, 1405, +1534, 476, 1351, +1534, 476, 1246, +1534, 476, 1051, +1534, 476, 479, +1534, 1149, 476, +1674, 1512, 0, +1813, 1763, 0, +1931, 1950, 0, +2014, 2085, 0, +2105, 2220, 0, +2204, 2353, 0, +2310, 2487, 0, +2421, 2620, 0, +2537, 2753, 0, +2657, 2886, 0, +2779, 3018, 0, +2904, 3151, 0, +3031, 3283, 0, +3158, 3415, 0, +3287, 3548, 0, +3417, 3680, 0, +3548, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1696, 0, 1601, +1695, 0, 1596, +1693, 0, 1588, +1691, 0, 1577, +1689, 0, 1562, +1685, 0, 1541, +1681, 0, 1512, +1674, 0, 1470, +1674, 0, 1391, +1674, 0, 1258, +1674, 0, 983, +1674, 313, 0, +1674, 1228, 0, +1813, 1622, 0, +1950, 1882, 0, +2079, 2085, 0, +2159, 2220, 0, +2248, 2353, 0, +2345, 2487, 0, +2449, 2620, 0, +2559, 2753, 0, +2673, 2886, 0, +2792, 3018, 0, +2914, 3151, 0, +3038, 3283, 0, +3164, 3415, 0, +3292, 3548, 0, +3420, 3680, 0, +3550, 3812, 0, +3680, 3944, 0, +3810, 4076, 0, +3942, 4095, 0, +1828, 0, 1696, +1828, 0, 1691, +1827, 0, 1684, +1825, 0, 1676, +1823, 0, 1664, +1821, 0, 1648, +1817, 0, 1625, +1813, 0, 1592, +1813, 0, 1533, +1813, 0, 1440, +1813, 0, 1275, +1813, 0, 874, +1813, 0, 0, +1813, 1317, 0, +1950, 1736, 0, +2085, 2004, 0, +2220, 2217, 0, +2301, 2353, 0, +2388, 2487, 0, +2483, 2620, 0, +2586, 2753, 0, +2695, 2886, 0, +2808, 3018, 0, +2927, 3151, 0, +3047, 3283, 0, +3171, 3415, 0, +3297, 3548, 0, +3425, 3680, 0, +3553, 3812, 0, +3682, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1797, +1961, 0, 1793, +1960, 0, 1789, +1959, 0, 1781, +1958, 0, 1772, +1956, 0, 1759, +1953, 0, 1742, +1950, 0, 1716, +1950, 0, 1672, +1950, 0, 1606, +1950, 0, 1498, +1950, 0, 1295, +1950, 0, 670, +1950, 0, 0, +1950, 1413, 0, +2085, 1854, 0, +2220, 2128, 0, +2353, 2344, 0, +2440, 2487, 0, +2526, 2620, 0, +2620, 2753, 0, +2722, 2886, 0, +2830, 3018, 0, +2943, 3151, 0, +3060, 3283, 0, +3181, 3415, 0, +3305, 3548, 0, +3430, 3680, 0, +3557, 3812, 0, +3686, 3944, 0, +3815, 4076, 0, +3945, 4095, 0, +2094, 0, 1905, +2093, 0, 1902, +2093, 0, 1898, +2092, 0, 1893, +2091, 0, 1885, +2089, 0, 1875, +2087, 0, 1862, +2085, 0, 1843, +2085, 0, 1810, +2085, 0, 1761, +2085, 0, 1687, +2085, 0, 1565, +2085, 0, 1322, +2085, 0, 10, +2085, 0, 0, +2085, 1517, 0, +2220, 1975, 0, +2353, 2255, 0, +2487, 2473, 0, +2577, 2620, 0, +2662, 2753, 0, +2756, 2886, 0, +2857, 3018, 0, +2964, 3151, 0, +3077, 3283, 0, +3194, 3415, 0, +3314, 3548, 0, +3437, 3680, 0, +3563, 3812, 0, +3690, 3944, 0, +3818, 4076, 0, +3947, 4095, 0, +2226, 0, 2018, +2226, 0, 2016, +2225, 0, 2013, +2225, 0, 2009, +2224, 0, 2003, +2223, 0, 1995, +2221, 0, 1985, +2220, 0, 1970, +2220, 0, 1946, +2220, 0, 1910, +2220, 0, 1858, +2220, 0, 1778, +2220, 0, 1642, +2220, 0, 1355, +2220, 0, 0, +2220, 0, 0, +2220, 1626, 0, +2353, 2099, 0, +2487, 2383, 0, +2620, 2602, 0, +2713, 2753, 0, +2798, 2886, 0, +2890, 3018, 0, +2991, 3151, 0, +3098, 3283, 0, +3210, 3415, 0, +3327, 3548, 0, +3447, 3680, 0, +3570, 3812, 0, +3695, 3944, 0, +3822, 4076, 0, +3950, 4095, 0, +2358, 0, 2136, +2358, 0, 2134, +2358, 0, 2132, +2357, 0, 2128, +2357, 0, 2124, +2356, 0, 2118, +2355, 0, 2110, +2353, 0, 2099, +2353, 0, 2081, +2353, 0, 2054, +2353, 0, 2017, +2353, 0, 1962, +2353, 0, 1876, +2353, 0, 1727, +2353, 0, 1396, +2353, 0, 0, +2353, 0, 0, +2353, 1740, 0, +2487, 2226, 0, +2620, 2511, 0, +2753, 2732, 0, +2848, 2886, 0, +2932, 3018, 0, +3025, 3151, 0, +3125, 3283, 0, +3231, 3415, 0, +3343, 3548, 0, +3460, 3680, 0, +3580, 3812, 0, +3703, 3944, 0, +3828, 4076, 0, +3955, 4095, 0, +2491, 0, 2256, +2491, 0, 2255, +2490, 0, 2253, +2490, 0, 2251, +2489, 0, 2247, +2489, 0, 2243, +2488, 0, 2237, +2487, 0, 2229, +2487, 0, 2215, +2487, 0, 2196, +2487, 0, 2169, +2487, 0, 2130, +2487, 0, 2072, +2487, 0, 1981, +2487, 0, 1822, +2487, 0, 1446, +2487, 0, 0, +2487, 0, 0, +2487, 1859, 0, +2620, 2352, 0, +2753, 2641, 0, +2886, 2863, 0, +2982, 3018, 0, +3066, 3151, 0, +3158, 3283, 0, +3258, 3415, 0, +3364, 3548, 0, +3476, 3680, 0, +3593, 3812, 0, +3712, 3944, 0, +3835, 4076, 0, +3960, 4095, 0, +2623, 0, 2380, +2623, 0, 2379, +2623, 0, 2378, +2622, 0, 2375, +2622, 0, 2373, +2621, 0, 2370, +2621, 0, 2365, +2620, 0, 2359, +2620, 0, 2348, +2620, 0, 2334, +2620, 0, 2314, +2620, 0, 2287, +2620, 0, 2247, +2620, 0, 2187, +2620, 0, 2092, +2620, 0, 1923, +2620, 0, 1505, +2620, 0, 0, +2620, 0, 0, +2620, 1981, 0, +2753, 2482, 0, +2886, 2772, 0, +3018, 2993, 0, +3116, 3151, 0, +3199, 3283, 0, +3291, 3415, 0, +3391, 3548, 0, +3497, 3680, 0, +3609, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3968, 4095, 0, +2755, 0, 2505, +2755, 0, 2505, +2755, 0, 2504, +2755, 0, 2502, +2755, 0, 2501, +2754, 0, 2498, +2754, 0, 2494, +2753, 0, 2490, +2753, 0, 2482, +2753, 0, 2471, +2753, 0, 2457, +2753, 0, 2437, +2753, 0, 2408, +2753, 0, 2367, +2753, 0, 2305, +2753, 0, 2208, +2753, 0, 2031, +2753, 0, 1575, +2753, 0, 0, +2753, 0, 0, +2753, 2105, 0, +2886, 2611, 0, +3018, 2902, 0, +3151, 3125, 0, +3249, 3283, 0, +3333, 3415, 0, +3424, 3548, 0, +3524, 3680, 0, +3630, 3812, 0, +3741, 3944, 0, +3857, 4076, 0, +3977, 4095, 0, +2887, 0, 2633, +2887, 0, 2632, +2887, 0, 2631, +2887, 0, 2630, +2887, 0, 2629, +2887, 0, 2627, +2886, 0, 2624, +2886, 0, 2621, +2886, 0, 2615, +2886, 0, 2607, +2886, 0, 2596, +2886, 0, 2581, +2886, 0, 2561, +2886, 0, 2532, +2886, 0, 2490, +2886, 0, 2427, +2886, 0, 2327, +2886, 0, 2144, +2886, 0, 1651, +2886, 0, 0, +2886, 0, 0, +2886, 2231, 0, +3018, 2740, 0, +3151, 3033, 0, +3283, 3256, 0, +3382, 3415, 0, +3466, 3548, 0, +3557, 3680, 0, +3656, 3812, 0, +3762, 3944, 0, +3873, 4076, 0, +3990, 4095, 0, +3019, 0, 2761, +3019, 0, 2760, +3019, 0, 2760, +3019, 0, 2759, +3019, 0, 2758, +3019, 0, 2756, +3018, 0, 2754, +3018, 0, 2752, +3018, 0, 2747, +3018, 0, 2742, +3018, 0, 2734, +3018, 0, 2723, +3018, 0, 2708, +3018, 0, 2687, +3018, 0, 2658, +3018, 0, 2615, +3018, 0, 2551, +3018, 0, 2449, +3018, 0, 2261, +3018, 0, 1737, +3018, 0, 0, +3018, 0, 0, +3018, 2358, 0, +3151, 2872, 0, +3283, 3164, 0, +3415, 3388, 0, +3515, 3548, 0, +3598, 3680, 0, +3690, 3812, 0, +3789, 3944, 0, +3895, 4076, 0, +4006, 4095, 0, +3152, 0, 2890, +3152, 0, 2890, +3152, 0, 2890, +3151, 0, 2889, +3151, 0, 2888, +3151, 0, 2887, +3151, 0, 2885, +3151, 0, 2883, +3151, 0, 2880, +3151, 0, 2876, +3151, 0, 2870, +3151, 0, 2862, +3151, 0, 2851, +3151, 0, 2836, +3151, 0, 2815, +3151, 0, 2785, +3151, 0, 2742, +3151, 0, 2678, +3151, 0, 2573, +3151, 0, 2382, +3151, 0, 1832, +3151, 0, 0, +3151, 0, 0, +3151, 2487, 0, +3283, 3002, 0, +3415, 3296, 0, +3548, 3520, 0, +3648, 3680, 0, +3730, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3020, +3283, 0, 3020, +3283, 0, 3019, +3283, 0, 3019, +3283, 0, 3018, +3283, 0, 3018, +3283, 0, 3016, +3283, 0, 3015, +3283, 0, 3013, +3283, 0, 3009, +3283, 0, 3005, +3283, 0, 2999, +3283, 0, 2991, +3283, 0, 2980, +3283, 0, 2965, +3283, 0, 2943, +3283, 0, 2914, +3283, 0, 2870, +3283, 0, 2805, +3283, 0, 2700, +3283, 0, 2504, +3283, 0, 1932, +3283, 0, 0, +3283, 0, 0, +3283, 2616, 0, +3415, 3134, 0, +3548, 3428, 0, +3680, 3652, 0, +3780, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4053, 4095, 0, +3416, 0, 3151, +3416, 0, 3151, +3416, 0, 3150, +3416, 0, 3150, +3416, 0, 3149, +3416, 0, 3149, +3415, 0, 3148, +3415, 0, 3147, +3415, 0, 3145, +3415, 0, 3143, +3415, 0, 3139, +3415, 0, 3135, +3415, 0, 3129, +3415, 0, 3121, +3415, 0, 3110, +3415, 0, 3094, +3415, 0, 3073, +3415, 0, 3043, +3415, 0, 2999, +3415, 0, 2934, +3415, 0, 2827, +3415, 0, 2630, +3415, 0, 2044, +3415, 0, 0, +3415, 0, 0, +3415, 2746, 0, +3548, 3265, 0, +3680, 3559, 0, +3812, 3784, 0, +3912, 3944, 0, +3995, 4076, 0, +4087, 4095, 0, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3277, +3548, 0, 3276, +3548, 0, 3273, +3548, 0, 3270, +3548, 0, 3265, +3548, 0, 3259, +3548, 0, 3251, +3548, 0, 3240, +3548, 0, 3225, +3548, 0, 3203, +3548, 0, 3173, +3548, 0, 3129, +3548, 0, 3063, +3548, 0, 2956, +3548, 0, 2758, +3548, 0, 2156, +3548, 0, 0, +3548, 0, 0, +3548, 2877, 0, +3680, 3397, 0, +3812, 3691, 0, +3944, 3915, 0, +4045, 4076, 0, +4095, 4095, 0, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3411, +3680, 0, 3410, +3680, 0, 3408, +3680, 0, 3406, +3680, 0, 3404, +3680, 0, 3401, +3680, 0, 3396, +3680, 0, 3390, +3680, 0, 3382, +3680, 0, 3371, +3680, 0, 3356, +3680, 0, 3334, +3680, 0, 3304, +3680, 0, 3260, +3680, 0, 3193, +3680, 0, 3086, +3680, 0, 2886, +3680, 0, 2277, +3680, 0, 0, +3680, 0, 0, +3680, 3008, 0, +3812, 3529, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3535, +3812, 0, 3532, +3812, 0, 3528, +3812, 0, 3521, +3812, 0, 3513, +3812, 0, 3502, +3812, 0, 3487, +3812, 0, 3465, +3812, 0, 3435, +3812, 0, 3391, +3812, 0, 3324, +3812, 0, 3216, +3812, 0, 3016, +3812, 0, 2397, +3812, 0, 0, +3812, 0, 0, +3812, 3139, 0, +3944, 3660, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3672, +3944, 0, 3671, +3944, 0, 3669, +3944, 0, 3666, +3944, 0, 3663, +3944, 0, 3659, +3944, 0, 3653, +3944, 0, 3645, +3944, 0, 3633, +3944, 0, 3618, +3944, 0, 3596, +3944, 0, 3566, +3944, 0, 3522, +3944, 0, 3455, +3944, 0, 3347, +3944, 0, 3145, +3944, 0, 2520, +3944, 0, 0, +3944, 0, 0, +3944, 3271, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3802, +4076, 0, 3801, +4076, 0, 3798, +4076, 0, 3795, +4076, 0, 3790, +4076, 0, 3784, +4076, 0, 3776, +4076, 0, 3765, +4076, 0, 3749, +4076, 0, 3728, +4076, 0, 3697, +4076, 0, 3653, +4076, 0, 3586, +4076, 0, 3478, +4076, 0, 3276, +4076, 0, 2644, +4076, 0, 0, +4076, 0, 0, +4076, 3402, 0, +4095, 3925, 0, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3930, +4095, 0, 3927, +4095, 0, 3922, +4095, 0, 3916, +4095, 0, 3908, +4095, 0, 3897, +4095, 0, 3881, +4095, 0, 3860, +4095, 0, 3829, +4095, 0, 3785, +4095, 0, 3718, +4095, 0, 3610, +4095, 0, 3407, +4095, 0, 2773, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 918, 1160, +0, 949, 1160, +0, 987, 1160, +0, 1033, 1160, +0, 1089, 1160, +0, 1154, 1160, +0, 1160, 1079, +0, 1160, 929, +0, 1160, 592, +0, 1295, 0, +0, 1429, 0, +523, 1563, 0, +998, 1696, 0, +1283, 1828, 0, +1503, 1961, 0, +1691, 2094, 0, +1860, 2226, 0, +2019, 2358, 0, +2170, 2491, 0, +2315, 2623, 0, +2457, 2755, 0, +2597, 2887, 0, +2734, 3019, 0, +2870, 3152, 0, +3005, 3284, 0, +3139, 3416, 0, +3273, 3548, 0, +3406, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 885, 1160, +0, 924, 1157, +0, 964, 1157, +0, 1013, 1157, +0, 1071, 1157, +0, 1139, 1157, +0, 1157, 1089, +0, 1157, 943, +0, 1157, 620, +0, 1292, 0, +0, 1427, 0, +605, 1561, 0, +1029, 1695, 0, +1300, 1828, 0, +1513, 1961, 0, +1698, 2093, 0, +1865, 2226, 0, +2022, 2358, 0, +2172, 2491, 0, +2317, 2623, 0, +2459, 2755, 0, +2598, 2887, 0, +2735, 3019, 0, +2871, 3152, 0, +3005, 3283, 0, +3140, 3416, 0, +3273, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 836, 1160, +0, 879, 1157, +0, 932, 1152, +0, 984, 1152, +0, 1045, 1152, +0, 1117, 1152, +0, 1152, 1102, +0, 1152, 960, +0, 1152, 656, +0, 1289, 0, +0, 1424, 0, +696, 1559, 0, +1067, 1693, 0, +1321, 1827, 0, +1526, 1960, 0, +1706, 2093, 0, +1871, 2225, 0, +2027, 2358, 0, +2175, 2490, 0, +2320, 2623, 0, +2460, 2755, 0, +2599, 2887, 0, +2735, 3019, 0, +2871, 3152, 0, +3006, 3283, 0, +3140, 3416, 0, +3274, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 762, 1160, +0, 813, 1157, +0, 873, 1152, +0, 942, 1146, +0, 1009, 1146, +0, 1086, 1146, +0, 1146, 1119, +0, 1146, 983, +0, 1146, 700, +0, 1284, 0, +141, 1421, 0, +794, 1557, 0, +1113, 1691, 0, +1348, 1825, 0, +1544, 1959, 0, +1718, 2092, 0, +1880, 2225, 0, +2032, 2357, 0, +2180, 2490, 0, +2323, 2622, 0, +2463, 2755, 0, +2601, 2887, 0, +2737, 3019, 0, +2872, 3151, 0, +3007, 3283, 0, +3141, 3416, 0, +3274, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 640, 1160, +0, 705, 1157, +0, 779, 1152, +0, 863, 1146, +80, 955, 1137, +80, 1040, 1137, +80, 1134, 1137, +80, 1137, 1013, +80, 1137, 753, +0, 1278, 0, +478, 1416, 0, +900, 1553, 0, +1169, 1689, 0, +1382, 1823, 0, +1566, 1958, 0, +1733, 2091, 0, +1891, 2224, 0, +2040, 2357, 0, +2185, 2489, 0, +2327, 2622, 0, +2466, 2755, 0, +2603, 2887, 0, +2738, 3019, 0, +2873, 3151, 0, +3008, 3283, 0, +3141, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 397, 1160, +0, 503, 1157, +0, 614, 1152, +0, 730, 1146, +80, 850, 1137, +430, 972, 1126, +430, 1079, 1126, +430, 1126, 1049, +430, 1126, 814, +214, 1270, 212, +719, 1410, 0, +1011, 1549, 0, +1233, 1685, 0, +1423, 1821, 0, +1594, 1956, 0, +1753, 2089, 0, +1904, 2223, 0, +2050, 2356, 0, +2193, 2489, 0, +2332, 2621, 0, +2470, 2754, 0, +2606, 2887, 0, +2741, 3019, 0, +2875, 3151, 0, +3009, 3283, 0, +3142, 3416, 0, +3275, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1160, +0, 0, 1157, +0, 214, 1152, +0, 455, 1146, +80, 655, 1137, +430, 831, 1126, +676, 994, 1110, +676, 1110, 1092, +676, 1110, 886, +661, 1258, 562, +919, 1402, 344, +1127, 1543, 0, +1308, 1681, 0, +1474, 1817, 0, +1629, 1953, 0, +1778, 2087, 0, +1922, 2221, 0, +2063, 2355, 0, +2202, 2488, 0, +2339, 2621, 0, +2475, 2754, 0, +2610, 2886, 0, +2744, 3018, 0, +2877, 3151, 0, +3010, 3283, 0, +3144, 3415, 0, +3276, 3548, 0, +3409, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1160, +0, 0, 1157, +0, 0, 1152, +0, 0, 1146, +80, 81, 1137, +430, 529, 1126, +676, 805, 1110, +878, 1021, 1088, +878, 1088, 967, +938, 1242, 809, +1095, 1390, 695, +1246, 1534, 476, +1391, 1674, 0, +1533, 1813, 0, +1672, 1950, 0, +1810, 2085, 0, +1946, 2220, 0, +2081, 2353, 0, +2215, 2487, 0, +2348, 2620, 0, +2482, 2753, 0, +2615, 2886, 0, +2747, 3018, 0, +2880, 3151, 0, +3013, 3283, 0, +3145, 3415, 0, +3277, 3548, 0, +3410, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +592, 0, 1160, +620, 0, 1157, +656, 0, 1152, +700, 0, 1146, +753, 80, 1137, +814, 430, 1126, +886, 676, 1110, +967, 878, 1088, +1056, 1056, 1056, +1154, 1220, 1010, +1258, 1374, 940, +1368, 1523, 826, +1483, 1666, 608, +1602, 1807, 0, +1724, 1945, 0, +1849, 2082, 0, +1975, 2217, 0, +2102, 2352, 0, +2231, 2486, 0, +2361, 2619, 0, +2491, 2752, 0, +2622, 2885, 0, +2752, 3018, 0, +2884, 3151, 0, +3015, 3283, 0, +3147, 3415, 0, +3279, 3548, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1051, 0, 1295, +1062, 0, 1292, +1075, 0, 1289, +1093, 0, 1284, +1116, 0, 1278, +1145, 212, 1270, +1181, 562, 1258, +1225, 809, 1242, +1220, 1010, 1154, +1220, 1099, 1010, +1374, 1357, 940, +1476, 1523, 826, +1569, 1666, 608, +1669, 1807, 0, +1776, 1945, 0, +1889, 2082, 0, +2006, 2217, 0, +2126, 2352, 0, +2249, 2486, 0, +2374, 2619, 0, +2501, 2752, 0, +2629, 2885, 0, +2758, 3018, 0, +2888, 3151, 0, +3018, 3283, 0, +3150, 3415, 0, +3281, 3548, 0, +3412, 3680, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1330, 0, 1429, +1336, 0, 1427, +1343, 0, 1424, +1353, 0, 1421, +1367, 0, 1416, +1383, 0, 1410, +1402, 344, 1398, +1390, 695, 1343, +1374, 940, 1258, +1374, 940, 1069, +1374, 1150, 940, +1523, 1445, 826, +1663, 1666, 608, +1746, 1807, 0, +1838, 1945, 0, +1938, 2082, 0, +2044, 2217, 0, +2155, 2352, 0, +2272, 2486, 0, +2392, 2619, 0, +2514, 2752, 0, +2639, 2885, 0, +2766, 3018, 0, +2894, 3151, 0, +3023, 3283, 0, +3153, 3415, 0, +3283, 3548, 0, +3414, 3680, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1548, 0, 1563, +1552, 0, 1561, +1556, 0, 1559, +1557, 0, 1551, +1553, 0, 1535, +1549, 0, 1513, +1543, 0, 1482, +1534, 476, 1437, +1523, 826, 1368, +1523, 826, 1228, +1523, 826, 926, +1523, 1211, 826, +1666, 1541, 608, +1807, 1780, 0, +1909, 1945, 0, +1996, 2082, 0, +2090, 2217, 0, +2192, 2352, 0, +2301, 2486, 0, +2414, 2619, 0, +2532, 2752, 0, +2652, 2885, 0, +2776, 3018, 0, +2902, 3151, 0, +3029, 3283, 0, +3157, 3415, 0, +3286, 3548, 0, +3416, 3680, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1696, 0, 1653, +1695, 0, 1647, +1693, 0, 1640, +1691, 0, 1631, +1689, 0, 1617, +1685, 0, 1599, +1681, 0, 1574, +1674, 0, 1537, +1666, 608, 1483, +1666, 608, 1378, +1666, 608, 1183, +1666, 609, 608, +1666, 1281, 608, +1807, 1644, 0, +1945, 1895, 0, +2063, 2082, 0, +2146, 2217, 0, +2237, 2352, 0, +2336, 2486, 0, +2442, 2619, 0, +2553, 2752, 0, +2669, 2885, 0, +2789, 3018, 0, +2911, 3151, 0, +3036, 3283, 0, +3163, 3415, 0, +3291, 3548, 0, +3420, 3680, 0, +3549, 3812, 0, +3680, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1828, 0, 1738, +1828, 0, 1733, +1827, 0, 1727, +1825, 0, 1720, +1823, 0, 1709, +1821, 0, 1694, +1817, 0, 1673, +1813, 0, 1644, +1807, 0, 1602, +1807, 0, 1523, +1807, 0, 1391, +1807, 0, 1115, +1807, 438, 0, +1807, 1360, 0, +1945, 1754, 0, +2082, 2014, 0, +2211, 2217, 0, +2291, 2352, 0, +2380, 2486, 0, +2477, 2619, 0, +2581, 2752, 0, +2691, 2885, 0, +2805, 3018, 0, +2924, 3151, 0, +3046, 3283, 0, +3170, 3415, 0, +3296, 3548, 0, +3424, 3680, 0, +3552, 3812, 0, +3682, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1831, +1961, 0, 1828, +1960, 0, 1823, +1959, 0, 1817, +1958, 0, 1808, +1956, 0, 1796, +1953, 0, 1779, +1950, 0, 1757, +1945, 0, 1724, +1945, 0, 1665, +1945, 0, 1572, +1945, 0, 1407, +1945, 0, 1007, +1945, 37, 0, +1945, 1449, 0, +2082, 1868, 0, +2217, 2136, 0, +2352, 2349, 0, +2433, 2486, 0, +2520, 2619, 0, +2616, 2752, 0, +2718, 2885, 0, +2827, 3018, 0, +2941, 3151, 0, +3059, 3283, 0, +3180, 3415, 0, +3303, 3548, 0, +3429, 3680, 0, +3557, 3812, 0, +3685, 3944, 0, +3814, 4076, 0, +3945, 4095, 0, +2094, 0, 1932, +2093, 0, 1929, +2093, 0, 1926, +2092, 0, 1920, +2091, 0, 1913, +2089, 0, 1904, +2087, 0, 1891, +2085, 0, 1873, +2082, 0, 1849, +2082, 0, 1804, +2082, 0, 1738, +2082, 0, 1630, +2082, 0, 1428, +2082, 0, 800, +2082, 0, 0, +2082, 1545, 0, +2217, 1986, 0, +2352, 2261, 0, +2486, 2476, 0, +2572, 2619, 0, +2658, 2752, 0, +2752, 2885, 0, +2854, 3018, 0, +2962, 3151, 0, +3075, 3283, 0, +3192, 3415, 0, +3313, 3548, 0, +3437, 3680, 0, +3562, 3812, 0, +3689, 3944, 0, +3818, 4076, 0, +3947, 4095, 0, +2226, 0, 2039, +2226, 0, 2037, +2225, 0, 2034, +2225, 0, 2030, +2224, 0, 2025, +2223, 0, 2018, +2221, 0, 2008, +2220, 0, 1994, +2217, 0, 1975, +2217, 0, 1941, +2217, 0, 1894, +2217, 0, 1819, +2217, 0, 1697, +2217, 0, 1454, +2217, 0, 140, +2217, 0, 0, +2217, 1649, 0, +2352, 2107, 0, +2486, 2387, 0, +2619, 2604, 0, +2710, 2752, 0, +2795, 2885, 0, +2888, 3018, 0, +2989, 3151, 0, +3096, 3283, 0, +3209, 3415, 0, +3326, 3548, 0, +3446, 3680, 0, +3570, 3812, 0, +3695, 3944, 0, +3822, 4076, 0, +3950, 4095, 0, +2358, 0, 2152, +2358, 0, 2150, +2358, 0, 2148, +2357, 0, 2145, +2357, 0, 2141, +2356, 0, 2135, +2355, 0, 2127, +2353, 0, 2117, +2352, 0, 2102, +2352, 0, 2078, +2352, 0, 2042, +2352, 0, 1990, +2352, 0, 1910, +2352, 0, 1773, +2352, 0, 1487, +2352, 0, 0, +2352, 0, 0, +2352, 1758, 0, +2486, 2232, 0, +2619, 2515, 0, +2752, 2734, 0, +2845, 2885, 0, +2930, 3018, 0, +3023, 3151, 0, +3123, 3283, 0, +3230, 3415, 0, +3342, 3548, 0, +3459, 3680, 0, +3579, 3812, 0, +3702, 3944, 0, +3827, 4076, 0, +3954, 4095, 0, +2491, 0, 2269, +2491, 0, 2268, +2490, 0, 2266, +2490, 0, 2264, +2489, 0, 2260, +2489, 0, 2256, +2488, 0, 2250, +2487, 0, 2242, +2486, 0, 2231, +2486, 0, 2213, +2486, 0, 2187, +2486, 0, 2149, +2486, 0, 2094, +2486, 0, 2008, +2486, 0, 1859, +2486, 0, 1529, +2486, 0, 0, +2486, 0, 0, +2486, 1873, 0, +2619, 2357, 0, +2752, 2644, 0, +2885, 2864, 0, +2980, 3018, 0, +3064, 3151, 0, +3157, 3283, 0, +3257, 3415, 0, +3363, 3548, 0, +3475, 3680, 0, +3592, 3812, 0, +3712, 3944, 0, +3835, 4076, 0, +3960, 4095, 0, +2623, 0, 2390, +2623, 0, 2388, +2623, 0, 2387, +2622, 0, 2385, +2622, 0, 2383, +2621, 0, 2380, +2621, 0, 2375, +2620, 0, 2369, +2619, 0, 2361, +2619, 0, 2347, +2619, 0, 2328, +2619, 0, 2301, +2619, 0, 2262, +2619, 0, 2204, +2619, 0, 2113, +2619, 0, 1954, +2619, 0, 1578, +2619, 0, 0, +2619, 0, 0, +2619, 1991, 0, +2752, 2485, 0, +2885, 2773, 0, +3018, 2995, 0, +3115, 3151, 0, +3198, 3283, 0, +3290, 3415, 0, +3390, 3548, 0, +3496, 3680, 0, +3608, 3812, 0, +3725, 3944, 0, +3845, 4076, 0, +3967, 4095, 0, +2755, 0, 2513, +2755, 0, 2512, +2755, 0, 2511, +2755, 0, 2510, +2755, 0, 2508, +2754, 0, 2505, +2754, 0, 2502, +2753, 0, 2497, +2752, 0, 2491, +2752, 0, 2481, +2752, 0, 2467, +2752, 0, 2447, +2752, 0, 2419, +2752, 0, 2379, +2752, 0, 2319, +2752, 0, 2224, +2752, 0, 2056, +2752, 0, 1638, +2752, 0, 0, +2752, 0, 0, +2752, 2113, 0, +2885, 2613, 0, +3018, 2903, 0, +3151, 3126, 0, +3248, 3283, 0, +3331, 3415, 0, +3423, 3548, 0, +3523, 3680, 0, +3629, 3812, 0, +3741, 3944, 0, +3857, 4076, 0, +3977, 4095, 0, +2887, 0, 2638, +2887, 0, 2638, +2887, 0, 2637, +2887, 0, 2636, +2887, 0, 2635, +2887, 0, 2632, +2886, 0, 2630, +2886, 0, 2626, +2885, 0, 2622, +2885, 0, 2614, +2885, 0, 2603, +2885, 0, 2589, +2885, 0, 2569, +2885, 0, 2540, +2885, 0, 2499, +2885, 0, 2438, +2885, 0, 2340, +2885, 0, 2163, +2885, 0, 1706, +2885, 0, 0, +2885, 0, 0, +2885, 2237, 0, +3018, 2742, 0, +3151, 3034, 0, +3283, 3257, 0, +3381, 3415, 0, +3465, 3548, 0, +3556, 3680, 0, +3656, 3812, 0, +3762, 3944, 0, +3873, 4076, 0, +3989, 4095, 0, +3019, 0, 2765, +3019, 0, 2765, +3019, 0, 2764, +3019, 0, 2763, +3019, 0, 2762, +3019, 0, 2761, +3018, 0, 2759, +3018, 0, 2756, +3018, 0, 2752, +3018, 0, 2747, +3018, 0, 2739, +3018, 0, 2728, +3018, 0, 2714, +3018, 0, 2693, +3018, 0, 2664, +3018, 0, 2622, +3018, 0, 2559, +3018, 0, 2459, +3018, 0, 2276, +3018, 0, 1782, +3018, 0, 0, +3018, 0, 0, +3018, 2362, 0, +3151, 2873, 0, +3283, 3165, 0, +3415, 3388, 0, +3514, 3548, 0, +3597, 3680, 0, +3689, 3812, 0, +3788, 3944, 0, +3894, 4076, 0, +4006, 4095, 0, +3152, 0, 2893, +3152, 0, 2893, +3152, 0, 2893, +3151, 0, 2892, +3151, 0, 2891, +3151, 0, 2890, +3151, 0, 2889, +3151, 0, 2887, +3151, 0, 2884, +3151, 0, 2880, +3151, 0, 2874, +3151, 0, 2866, +3151, 0, 2855, +3151, 0, 2840, +3151, 0, 2819, +3151, 0, 2790, +3151, 0, 2747, +3151, 0, 2684, +3151, 0, 2581, +3151, 0, 2394, +3151, 0, 1869, +3151, 0, 0, +3151, 0, 0, +3151, 2490, 0, +3283, 3003, 0, +3415, 3296, 0, +3548, 3520, 0, +3647, 3680, 0, +3730, 3812, 0, +3822, 3944, 0, +3921, 4076, 0, +4027, 4095, 0, +3284, 0, 3022, +3283, 0, 3022, +3283, 0, 3022, +3283, 0, 3021, +3283, 0, 3021, +3283, 0, 3020, +3283, 0, 3019, +3283, 0, 3017, +3283, 0, 3015, +3283, 0, 3012, +3283, 0, 3008, +3283, 0, 3002, +3283, 0, 2994, +3283, 0, 2983, +3283, 0, 2968, +3283, 0, 2947, +3283, 0, 2917, +3283, 0, 2874, +3283, 0, 2809, +3283, 0, 2705, +3283, 0, 2513, +3283, 0, 1962, +3283, 0, 0, +3283, 0, 0, +3283, 2619, 0, +3415, 3135, 0, +3548, 3428, 0, +3680, 3652, 0, +3780, 3812, 0, +3863, 3944, 0, +3954, 4076, 0, +4053, 4095, 0, +3416, 0, 3152, +3416, 0, 3152, +3416, 0, 3152, +3416, 0, 3151, +3416, 0, 3151, +3416, 0, 3151, +3415, 0, 3150, +3415, 0, 3149, +3415, 0, 3147, +3415, 0, 3145, +3415, 0, 3141, +3415, 0, 3137, +3415, 0, 3131, +3415, 0, 3123, +3415, 0, 3112, +3415, 0, 3097, +3415, 0, 3076, +3415, 0, 3046, +3415, 0, 3002, +3415, 0, 2937, +3415, 0, 2832, +3415, 0, 2637, +3415, 0, 2068, +3415, 0, 0, +3415, 0, 0, +3415, 2748, 0, +3548, 3266, 0, +3680, 3560, 0, +3812, 3784, 0, +3912, 3944, 0, +3995, 4076, 0, +4086, 4095, 0, +3548, 0, 3283, +3548, 0, 3283, +3548, 0, 3282, +3548, 0, 3282, +3548, 0, 3282, +3548, 0, 3281, +3548, 0, 3281, +3548, 0, 3280, +3548, 0, 3279, +3548, 0, 3277, +3548, 0, 3275, +3548, 0, 3271, +3548, 0, 3267, +3548, 0, 3261, +3548, 0, 3253, +3548, 0, 3242, +3548, 0, 3226, +3548, 0, 3205, +3548, 0, 3175, +3548, 0, 3132, +3548, 0, 3066, +3548, 0, 2960, +3548, 0, 2763, +3548, 0, 2174, +3548, 0, 0, +3548, 0, 0, +3548, 2878, 0, +3680, 3397, 0, +3812, 3691, 0, +3944, 3915, 0, +4044, 4076, 0, +4095, 4095, 0, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3413, +3680, 0, 3412, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3409, +3680, 0, 3408, +3680, 0, 3405, +3680, 0, 3402, +3680, 0, 3397, +3680, 0, 3392, +3680, 0, 3383, +3680, 0, 3372, +3680, 0, 3357, +3680, 0, 3336, +3680, 0, 3305, +3680, 0, 3261, +3680, 0, 3195, +3680, 0, 3089, +3680, 0, 2890, +3680, 0, 2291, +3680, 0, 0, +3680, 0, 0, +3680, 3009, 0, +3812, 3529, 0, +3944, 3823, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3543, +3812, 0, 3542, +3812, 0, 3540, +3812, 0, 3538, +3812, 0, 3536, +3812, 0, 3533, +3812, 0, 3528, +3812, 0, 3522, +3812, 0, 3514, +3812, 0, 3503, +3812, 0, 3488, +3812, 0, 3466, +3812, 0, 3436, +3812, 0, 3392, +3812, 0, 3326, +3812, 0, 3218, +3812, 0, 3019, +3812, 0, 2408, +3812, 0, 0, +3812, 0, 0, +3812, 3140, 0, +3944, 3661, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3671, +3944, 0, 3670, +3944, 0, 3667, +3944, 0, 3664, +3944, 0, 3659, +3944, 0, 3653, +3944, 0, 3645, +3944, 0, 3634, +3944, 0, 3619, +3944, 0, 3597, +3944, 0, 3567, +3944, 0, 3523, +3944, 0, 3456, +3944, 0, 3349, +3944, 0, 3147, +3944, 0, 2528, +3944, 0, 0, +3944, 0, 0, +3944, 3271, 0, +4076, 3792, 0, +4095, 4087, 0, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3801, +4076, 0, 3798, +4076, 0, 3795, +4076, 0, 3791, +4076, 0, 3785, +4076, 0, 3777, +4076, 0, 3765, +4076, 0, 3750, +4076, 0, 3728, +4076, 0, 3698, +4076, 0, 3654, +4076, 0, 3587, +4076, 0, 3479, +4076, 0, 3277, +4076, 0, 2650, +4076, 0, 0, +4076, 0, 0, +4076, 3403, 0, +4095, 3925, 0, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3930, +4095, 0, 3927, +4095, 0, 3923, +4095, 0, 3917, +4095, 0, 3908, +4095, 0, 3897, +4095, 0, 3881, +4095, 0, 3860, +4095, 0, 3830, +4095, 0, 3786, +4095, 0, 3719, +4095, 0, 3611, +4095, 0, 3408, +4095, 0, 2778, +4095, 0, 0, +4095, 0, 0, +4095, 3534, 0, +0, 1046, 1295, +0, 1069, 1295, +0, 1099, 1295, +0, 1135, 1295, +0, 1181, 1295, +0, 1234, 1295, +0, 1295, 1292, +0, 1295, 1204, +0, 1295, 1051, +0, 1295, 702, +0, 1429, 0, +0, 1563, 0, +580, 1696, 0, +1106, 1828, 0, +1402, 1961, 0, +1626, 2094, 0, +1817, 2226, 0, +1989, 2358, 0, +2149, 2491, 0, +2300, 2623, 0, +2446, 2755, 0, +2589, 2887, 0, +2728, 3019, 0, +2866, 3152, 0, +3002, 3284, 0, +3137, 3416, 0, +3271, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 1021, 1295, +0, 1050, 1292, +0, 1081, 1292, +0, 1119, 1292, +0, 1166, 1292, +0, 1221, 1292, +0, 1286, 1292, +0, 1292, 1211, +0, 1292, 1062, +0, 1292, 724, +0, 1427, 0, +0, 1561, 0, +653, 1695, 0, +1131, 1828, 0, +1415, 1961, 0, +1635, 2093, 0, +1823, 2226, 0, +1993, 2358, 0, +2151, 2491, 0, +2302, 2623, 0, +2448, 2755, 0, +2589, 2887, 0, +2729, 3019, 0, +2866, 3152, 0, +3002, 3283, 0, +3137, 3416, 0, +3272, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 985, 1295, +0, 1017, 1292, +0, 1056, 1289, +0, 1096, 1289, +0, 1145, 1289, +0, 1203, 1289, +0, 1271, 1289, +0, 1289, 1221, +0, 1289, 1075, +0, 1289, 753, +0, 1424, 0, +0, 1559, 0, +736, 1693, 0, +1161, 1827, 0, +1431, 1960, 0, +1645, 2093, 0, +1829, 2225, 0, +1997, 2358, 0, +2154, 2490, 0, +2304, 2623, 0, +2449, 2755, 0, +2591, 2887, 0, +2729, 3019, 0, +2867, 3152, 0, +3002, 3283, 0, +3138, 3416, 0, +3272, 3548, 0, +3405, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 934, 1295, +0, 968, 1292, +0, 1012, 1289, +0, 1064, 1284, +0, 1116, 1284, +0, 1177, 1284, +0, 1249, 1284, +0, 1284, 1235, +0, 1284, 1093, +0, 1284, 788, +0, 1421, 0, +0, 1557, 0, +827, 1691, 0, +1199, 1825, 0, +1453, 1959, 0, +1658, 2092, 0, +1839, 2225, 0, +2004, 2357, 0, +2159, 2490, 0, +2308, 2622, 0, +2452, 2755, 0, +2592, 2887, 0, +2731, 3019, 0, +2868, 3151, 0, +3003, 3283, 0, +3138, 3416, 0, +3272, 3548, 0, +3406, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 853, 1295, +0, 894, 1292, +0, 945, 1289, +0, 1005, 1284, +0, 1074, 1278, +0, 1141, 1278, +0, 1218, 1278, +0, 1278, 1251, +0, 1278, 1116, +0, 1278, 832, +0, 1416, 0, +275, 1553, 0, +926, 1689, 0, +1245, 1823, 0, +1480, 1958, 0, +1676, 2091, 0, +1850, 2224, 0, +2012, 2357, 0, +2165, 2489, 0, +2312, 2622, 0, +2455, 2755, 0, +2595, 2887, 0, +2732, 3019, 0, +2869, 3151, 0, +3004, 3283, 0, +3139, 3416, 0, +3273, 3548, 0, +3406, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 717, 1295, +0, 772, 1292, +0, 837, 1289, +0, 911, 1284, +0, 995, 1278, +212, 1087, 1270, +212, 1172, 1270, +212, 1266, 1270, +212, 1270, 1145, +212, 1270, 884, +0, 1410, 47, +611, 1549, 0, +1031, 1685, 0, +1301, 1821, 0, +1514, 1956, 0, +1698, 2089, 0, +1865, 2223, 0, +2022, 2356, 0, +2172, 2489, 0, +2317, 2621, 0, +2459, 2754, 0, +2598, 2887, 0, +2735, 3019, 0, +2871, 3151, 0, +3005, 3283, 0, +3140, 3416, 0, +3273, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 431, 1295, +0, 529, 1292, +0, 635, 1289, +0, 746, 1284, +0, 862, 1278, +212, 982, 1270, +562, 1104, 1258, +562, 1211, 1258, +562, 1258, 1181, +562, 1258, 946, +345, 1402, 344, +852, 1543, 0, +1142, 1681, 0, +1366, 1817, 0, +1555, 1953, 0, +1726, 2087, 0, +1885, 2221, 0, +2037, 2355, 0, +2183, 2488, 0, +2325, 2621, 0, +2464, 2754, 0, +2602, 2886, 0, +2738, 3018, 0, +2873, 3151, 0, +3007, 3283, 0, +3141, 3415, 0, +3274, 3548, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1295, +0, 0, 1292, +0, 9, 1289, +0, 346, 1284, +0, 587, 1278, +212, 787, 1270, +562, 963, 1258, +809, 1126, 1242, +809, 1242, 1225, +809, 1242, 1018, +793, 1390, 695, +1051, 1534, 476, +1258, 1674, 0, +1440, 1813, 0, +1606, 1950, 0, +1761, 2085, 0, +1910, 2220, 0, +2054, 2353, 0, +2196, 2487, 0, +2334, 2620, 0, +2471, 2753, 0, +2607, 2886, 0, +2742, 3018, 0, +2876, 3151, 0, +3009, 3283, 0, +3143, 3415, 0, +3276, 3548, 0, +3408, 3680, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1295, +0, 0, 1292, +0, 0, 1289, +0, 0, 1284, +0, 0, 1278, +212, 214, 1270, +562, 661, 1258, +809, 938, 1242, +1010, 1154, 1220, +1010, 1220, 1099, +1069, 1374, 940, +1228, 1523, 826, +1378, 1666, 608, +1523, 1807, 0, +1665, 1945, 0, +1804, 2082, 0, +1942, 2217, 0, +2078, 2352, 0, +2213, 2486, 0, +2347, 2619, 0, +2481, 2752, 0, +2614, 2885, 0, +2747, 3018, 0, +2880, 3151, 0, +3012, 3283, 0, +3145, 3415, 0, +3277, 3548, 0, +3409, 3680, 0, +3542, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +702, 0, 1295, +724, 0, 1292, +753, 0, 1289, +788, 0, 1284, +832, 0, 1278, +884, 212, 1270, +946, 562, 1258, +1018, 809, 1242, +1099, 1010, 1220, +1188, 1188, 1188, +1286, 1352, 1142, +1390, 1507, 1073, +1500, 1654, 959, +1615, 1798, 740, +1734, 1939, 0, +1856, 2077, 0, +1981, 2214, 0, +2107, 2349, 0, +2235, 2484, 0, +2363, 2618, 0, +2493, 2751, 0, +2623, 2885, 0, +2754, 3017, 0, +2885, 3150, 0, +3016, 3282, 0, +3147, 3415, 0, +3279, 3547, 0, +3411, 3680, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1174, 0, 1429, +1182, 0, 1427, +1193, 0, 1424, +1207, 0, 1421, +1225, 0, 1416, +1248, 0, 1410, +1277, 344, 1402, +1313, 695, 1390, +1357, 940, 1374, +1352, 1142, 1286, +1352, 1231, 1142, +1507, 1489, 1073, +1608, 1654, 959, +1701, 1798, 740, +1801, 1939, 0, +1908, 2077, 0, +2021, 2214, 0, +2138, 2349, 0, +2258, 2484, 0, +2381, 2618, 0, +2506, 2751, 0, +2633, 2885, 0, +2761, 3017, 0, +2891, 3150, 0, +3020, 3282, 0, +3151, 3415, 0, +3282, 3547, 0, +3413, 3680, 0, +3544, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1458, 0, 1563, +1463, 0, 1561, +1468, 0, 1559, +1476, 0, 1557, +1486, 0, 1553, +1499, 0, 1549, +1516, 0, 1543, +1534, 476, 1531, +1523, 826, 1476, +1507, 1073, 1390, +1507, 1073, 1202, +1507, 1282, 1073, +1654, 1577, 959, +1795, 1798, 740, +1878, 1939, 0, +1970, 2077, 0, +2070, 2214, 0, +2176, 2349, 0, +2288, 2484, 0, +2404, 2618, 0, +2524, 2751, 0, +2647, 2885, 0, +2771, 3017, 0, +2898, 3150, 0, +3026, 3282, 0, +3155, 3415, 0, +3285, 3547, 0, +3415, 3680, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1677, 0, 1696, +1680, 0, 1695, +1683, 0, 1693, +1688, 0, 1691, +1689, 0, 1683, +1685, 0, 1667, +1681, 0, 1645, +1674, 0, 1614, +1666, 608, 1569, +1654, 959, 1500, +1654, 959, 1360, +1654, 959, 1056, +1654, 1343, 959, +1798, 1673, 740, +1939, 1912, 0, +2041, 2077, 0, +2128, 2214, 0, +2223, 2349, 0, +2325, 2484, 0, +2432, 2618, 0, +2546, 2751, 0, +2664, 2885, 0, +2784, 3017, 0, +2908, 3150, 0, +3033, 3282, 0, +3161, 3415, 0, +3289, 3547, 0, +3418, 3680, 0, +3548, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1828, 0, 1789, +1828, 0, 1785, +1827, 0, 1779, +1825, 0, 1772, +1823, 0, 1763, +1821, 0, 1750, +1817, 0, 1732, +1813, 0, 1706, +1807, 0, 1669, +1798, 740, 1615, +1798, 740, 1510, +1798, 740, 1315, +1798, 740, 742, +1798, 1413, 740, +1939, 1776, 0, +2077, 2027, 0, +2195, 2214, 0, +2278, 2349, 0, +2369, 2484, 0, +2469, 2618, 0, +2574, 2751, 0, +2685, 2885, 0, +2801, 3017, 0, +2921, 3150, 0, +3043, 3282, 0, +3168, 3415, 0, +3295, 3547, 0, +3423, 3680, 0, +3552, 3812, 0, +3681, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +1961, 0, 1873, +1961, 0, 1870, +1960, 0, 1865, +1959, 0, 1860, +1958, 0, 1852, +1956, 0, 1841, +1953, 0, 1826, +1950, 0, 1806, +1945, 0, 1776, +1939, 0, 1734, +1939, 0, 1655, +1939, 0, 1523, +1939, 0, 1248, +1939, 573, 0, +1939, 1492, 0, +2077, 1886, 0, +2214, 2146, 0, +2343, 2349, 0, +2423, 2484, 0, +2512, 2618, 0, +2609, 2751, 0, +2713, 2885, 0, +2823, 3017, 0, +2938, 3150, 0, +3056, 3282, 0, +3178, 3415, 0, +3302, 3547, 0, +3428, 3680, 0, +3556, 3812, 0, +3685, 3944, 0, +3814, 4076, 0, +3944, 4095, 0, +2094, 0, 1966, +2093, 0, 1963, +2093, 0, 1960, +2092, 0, 1955, +2091, 0, 1949, +2089, 0, 1940, +2087, 0, 1928, +2085, 0, 1912, +2082, 0, 1889, +2077, 0, 1856, +2077, 0, 1797, +2077, 0, 1704, +2077, 0, 1539, +2077, 0, 1138, +2077, 173, 0, +2077, 1581, 0, +2214, 2000, 0, +2349, 2268, 0, +2484, 2481, 0, +2565, 2618, 0, +2652, 2751, 0, +2748, 2885, 0, +2850, 3017, 0, +2959, 3150, 0, +3073, 3282, 0, +3191, 3415, 0, +3312, 3547, 0, +3436, 3680, 0, +3562, 3812, 0, +3689, 3944, 0, +3817, 4076, 0, +3947, 4095, 0, +2226, 0, 2066, +2226, 0, 2064, +2225, 0, 2061, +2225, 0, 2058, +2224, 0, 2053, +2223, 0, 2046, +2221, 0, 2036, +2220, 0, 2023, +2217, 0, 2006, +2214, 0, 1981, +2214, 0, 1936, +2214, 0, 1870, +2214, 0, 1762, +2214, 0, 1560, +2214, 0, 932, +2214, 0, 0, +2214, 1677, 0, +2349, 2118, 0, +2484, 2393, 0, +2618, 2608, 0, +2704, 2751, 0, +2790, 2885, 0, +2885, 3017, 0, +2986, 3150, 0, +3094, 3282, 0, +3207, 3415, 0, +3325, 3547, 0, +3445, 3680, 0, +3569, 3812, 0, +3694, 3944, 0, +3821, 4076, 0, +3950, 4095, 0, +2358, 0, 2173, +2358, 0, 2171, +2358, 0, 2169, +2357, 0, 2166, +2357, 0, 2162, +2356, 0, 2157, +2355, 0, 2150, +2353, 0, 2140, +2352, 0, 2126, +2349, 0, 2107, +2349, 0, 2074, +2349, 0, 2025, +2349, 0, 1951, +2349, 0, 1829, +2349, 0, 1586, +2349, 0, 275, +2349, 0, 0, +2349, 1781, 0, +2484, 2240, 0, +2618, 2519, 0, +2751, 2737, 0, +2842, 2885, 0, +2927, 3017, 0, +3020, 3150, 0, +3121, 3282, 0, +3228, 3415, 0, +3341, 3547, 0, +3458, 3680, 0, +3579, 3812, 0, +3702, 3944, 0, +3827, 4076, 0, +3954, 4095, 0, +2491, 0, 2285, +2491, 0, 2284, +2490, 0, 2283, +2490, 0, 2280, +2489, 0, 2277, +2489, 0, 2273, +2488, 0, 2267, +2487, 0, 2260, +2486, 0, 2249, +2484, 0, 2235, +2484, 0, 2210, +2484, 0, 2174, +2484, 0, 2122, +2484, 0, 2042, +2484, 0, 1906, +2484, 0, 1620, +2484, 0, 0, +2484, 0, 0, +2484, 1891, 0, +2618, 2363, 0, +2751, 2647, 0, +2885, 2866, 0, +2977, 3017, 0, +3062, 3150, 0, +3155, 3282, 0, +3255, 3415, 0, +3362, 3547, 0, +3475, 3680, 0, +3591, 3812, 0, +3711, 3944, 0, +3834, 4076, 0, +3960, 4095, 0, +2623, 0, 2402, +2623, 0, 2401, +2623, 0, 2400, +2622, 0, 2398, +2622, 0, 2396, +2621, 0, 2393, +2621, 0, 2388, +2620, 0, 2382, +2619, 0, 2374, +2618, 0, 2363, +2618, 0, 2345, +2618, 0, 2319, +2618, 0, 2281, +2618, 0, 2226, +2618, 0, 2140, +2618, 0, 1991, +2618, 0, 1661, +2618, 0, 0, +2618, 0, 0, +2618, 2005, 0, +2751, 2490, 0, +2885, 2776, 0, +3017, 2996, 0, +3112, 3150, 0, +3196, 3282, 0, +3289, 3415, 0, +3389, 3547, 0, +3495, 3680, 0, +3607, 3812, 0, +3724, 3944, 0, +3844, 4076, 0, +3967, 4095, 0, +2755, 0, 2523, +2755, 0, 2522, +2755, 0, 2521, +2755, 0, 2520, +2755, 0, 2517, +2754, 0, 2515, +2754, 0, 2512, +2753, 0, 2507, +2752, 0, 2501, +2751, 0, 2493, +2751, 0, 2479, +2751, 0, 2460, +2751, 0, 2433, +2751, 0, 2394, +2751, 0, 2336, +2751, 0, 2245, +2751, 0, 2086, +2751, 0, 1711, +2751, 0, 0, +2751, 0, 0, +2751, 2123, 0, +2885, 2617, 0, +3017, 2905, 0, +3150, 3127, 0, +3247, 3282, 0, +3330, 3415, 0, +3422, 3547, 0, +3522, 3680, 0, +3629, 3812, 0, +3740, 3944, 0, +3856, 4076, 0, +3977, 4095, 0, +2887, 0, 2646, +2887, 0, 2645, +2887, 0, 2644, +2887, 0, 2643, +2887, 0, 2642, +2887, 0, 2640, +2886, 0, 2637, +2886, 0, 2634, +2885, 0, 2629, +2885, 0, 2623, +2885, 0, 2613, +2885, 0, 2599, +2885, 0, 2579, +2885, 0, 2551, +2885, 0, 2511, +2885, 0, 2451, +2885, 0, 2356, +2885, 0, 2188, +2885, 0, 1769, +2885, 0, 0, +2885, 0, 0, +2885, 2245, 0, +3017, 2745, 0, +3150, 3036, 0, +3282, 3257, 0, +3380, 3415, 0, +3464, 3547, 0, +3556, 3680, 0, +3655, 3812, 0, +3761, 3944, 0, +3873, 4076, 0, +3989, 4095, 0, +3019, 0, 2771, +3019, 0, 2770, +3019, 0, 2770, +3019, 0, 2769, +3019, 0, 2768, +3019, 0, 2766, +3018, 0, 2764, +3018, 0, 2762, +3018, 0, 2758, +3017, 0, 2754, +3017, 0, 2746, +3017, 0, 2735, +3017, 0, 2721, +3017, 0, 2701, +3017, 0, 2672, +3017, 0, 2631, +3017, 0, 2570, +3017, 0, 2471, +3017, 0, 2294, +3017, 0, 1837, +3017, 0, 0, +3017, 0, 0, +3017, 2369, 0, +3150, 2875, 0, +3282, 3166, 0, +3415, 3389, 0, +3513, 3547, 0, +3597, 3680, 0, +3689, 3812, 0, +3788, 3944, 0, +3894, 4076, 0, +4005, 4095, 0, +3152, 0, 2898, +3152, 0, 2897, +3152, 0, 2897, +3151, 0, 2896, +3151, 0, 2895, +3151, 0, 2895, +3151, 0, 2893, +3151, 0, 2891, +3151, 0, 2888, +3150, 0, 2885, +3150, 0, 2879, +3150, 0, 2871, +3150, 0, 2860, +3150, 0, 2846, +3150, 0, 2825, +3150, 0, 2796, +3150, 0, 2754, +3150, 0, 2691, +3150, 0, 2591, +3150, 0, 2408, +3150, 0, 1915, +3150, 0, 0, +3150, 0, 0, +3150, 2495, 0, +3282, 3005, 0, +3415, 3297, 0, +3547, 3520, 0, +3646, 3680, 0, +3729, 3812, 0, +3821, 3944, 0, +3921, 4076, 0, +4026, 4095, 0, +3284, 0, 3025, +3283, 0, 3025, +3283, 0, 3025, +3283, 0, 3025, +3283, 0, 3024, +3283, 0, 3023, +3283, 0, 3022, +3283, 0, 3021, +3283, 0, 3018, +3282, 0, 3016, +3282, 0, 3012, +3282, 0, 3006, +3282, 0, 2998, +3282, 0, 2987, +3282, 0, 2972, +3282, 0, 2951, +3282, 0, 2922, +3282, 0, 2879, +3282, 0, 2815, +3282, 0, 2713, +3282, 0, 2524, +3282, 0, 1999, +3282, 0, 0, +3282, 0, 0, +3282, 2622, 0, +3415, 3136, 0, +3547, 3429, 0, +3680, 3652, 0, +3779, 3812, 0, +3862, 3944, 0, +3953, 4076, 0, +4053, 4095, 0, +3416, 0, 3155, +3416, 0, 3154, +3416, 0, 3154, +3416, 0, 3154, +3416, 0, 3154, +3416, 0, 3153, +3415, 0, 3152, +3415, 0, 3151, +3415, 0, 3150, +3415, 0, 3147, +3415, 0, 3144, +3415, 0, 3140, +3415, 0, 3134, +3415, 0, 3126, +3415, 0, 3115, +3415, 0, 3100, +3415, 0, 3079, +3415, 0, 3049, +3415, 0, 3006, +3415, 0, 2942, +3415, 0, 2837, +3415, 0, 2646, +3415, 0, 2098, +3415, 0, 0, +3415, 0, 0, +3415, 2751, 0, +3547, 3267, 0, +3680, 3560, 0, +3812, 3784, 0, +3912, 3944, 0, +3995, 4076, 0, +4086, 4095, 0, +3548, 0, 3285, +3548, 0, 3284, +3548, 0, 3284, +3548, 0, 3284, +3548, 0, 3284, +3548, 0, 3283, +3548, 0, 3283, +3548, 0, 3282, +3548, 0, 3281, +3547, 0, 3279, +3547, 0, 3277, +3547, 0, 3274, +3547, 0, 3269, +3547, 0, 3263, +3547, 0, 3255, +3547, 0, 3244, +3547, 0, 3229, +3547, 0, 3208, +3547, 0, 3178, +3547, 0, 3135, +3547, 0, 3069, +3547, 0, 2964, +3547, 0, 2770, +3547, 0, 2198, +3547, 0, 0, +3547, 0, 0, +3547, 2880, 0, +3680, 3398, 0, +3812, 3692, 0, +3944, 3916, 0, +4044, 4076, 0, +4095, 4095, 0, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3414, +3680, 0, 3413, +3680, 0, 3412, +3680, 0, 3411, +3680, 0, 3409, +3680, 0, 3407, +3680, 0, 3404, +3680, 0, 3399, +3680, 0, 3393, +3680, 0, 3385, +3680, 0, 3374, +3680, 0, 3359, +3680, 0, 3337, +3680, 0, 3307, +3680, 0, 3264, +3680, 0, 3198, +3680, 0, 3092, +3680, 0, 2895, +3680, 0, 2310, +3680, 0, 0, +3680, 0, 0, +3680, 3011, 0, +3812, 3530, 0, +3944, 3824, 0, +4076, 4047, 0, +4095, 4095, 0, +3812, 0, 3546, +3812, 0, 3546, +3812, 0, 3546, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3541, +3812, 0, 3540, +3812, 0, 3537, +3812, 0, 3534, +3812, 0, 3530, +3812, 0, 3523, +3812, 0, 3515, +3812, 0, 3504, +3812, 0, 3489, +3812, 0, 3468, +3812, 0, 3437, +3812, 0, 3394, +3812, 0, 3328, +3812, 0, 3221, +3812, 0, 3023, +3812, 0, 2422, +3812, 0, 0, +3812, 0, 0, +3812, 3141, 0, +3944, 3661, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3673, +3944, 0, 3671, +3944, 0, 3668, +3944, 0, 3665, +3944, 0, 3661, +3944, 0, 3654, +3944, 0, 3646, +3944, 0, 3635, +3944, 0, 3620, +3944, 0, 3598, +3944, 0, 3568, +3944, 0, 3524, +3944, 0, 3458, +3944, 0, 3351, +3944, 0, 3151, +3944, 0, 2539, +3944, 0, 0, +3944, 0, 0, +3944, 3272, 0, +4076, 3793, 0, +4095, 4088, 0, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3805, +4076, 0, 3803, +4076, 0, 3802, +4076, 0, 3799, +4076, 0, 3796, +4076, 0, 3791, +4076, 0, 3785, +4076, 0, 3777, +4076, 0, 3766, +4076, 0, 3751, +4076, 0, 3729, +4076, 0, 3699, +4076, 0, 3655, +4076, 0, 3588, +4076, 0, 3480, +4076, 0, 3279, +4076, 0, 2659, +4076, 0, 0, +4076, 0, 0, +4076, 3403, 0, +4095, 3925, 0, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3937, +4095, 0, 3935, +4095, 0, 3933, +4095, 0, 3931, +4095, 0, 3927, +4095, 0, 3923, +4095, 0, 3917, +4095, 0, 3909, +4095, 0, 3898, +4095, 0, 3882, +4095, 0, 3861, +4095, 0, 3830, +4095, 0, 3786, +4095, 0, 3720, +4095, 0, 3612, +4095, 0, 3410, +4095, 0, 2785, +4095, 0, 0, +4095, 0, 0, +4095, 3535, 0, +0, 1174, 1429, +0, 1192, 1429, +0, 1215, 1429, +0, 1244, 1429, +0, 1280, 1429, +0, 1323, 1429, +0, 1376, 1429, +0, 1429, 1419, +0, 1429, 1330, +0, 1429, 1174, +0, 1429, 816, +0, 1563, 0, +0, 1696, 0, +650, 1828, 0, +1220, 1961, 0, +1524, 2094, 0, +1753, 2226, 0, +1946, 2358, 0, +2119, 2491, 0, +2278, 2623, 0, +2431, 2755, 0, +2577, 2887, 0, +2720, 3019, 0, +2860, 3152, 0, +2997, 3284, 0, +3134, 3416, 0, +3269, 3548, 0, +3403, 3680, 0, +3537, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 1156, 1429, +0, 1178, 1427, +0, 1201, 1427, +0, 1231, 1427, +0, 1267, 1427, +0, 1313, 1427, +0, 1366, 1427, +0, 1427, 1424, +0, 1427, 1336, +0, 1427, 1182, +0, 1427, 833, +0, 1561, 0, +0, 1695, 0, +713, 1828, 0, +1238, 1961, 0, +1534, 2093, 0, +1759, 2226, 0, +1950, 2358, 0, +2121, 2491, 0, +2281, 2623, 0, +2432, 2755, 0, +2578, 2887, 0, +2720, 3019, 0, +2860, 3152, 0, +2998, 3283, 0, +3134, 3416, 0, +3269, 3548, 0, +3403, 3680, 0, +3537, 3812, 0, +3671, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 1130, 1429, +0, 1153, 1427, +0, 1182, 1424, +0, 1213, 1424, +0, 1251, 1424, +0, 1298, 1424, +0, 1353, 1424, +0, 1418, 1424, +0, 1424, 1343, +0, 1424, 1193, +0, 1424, 856, +0, 1559, 0, +0, 1693, 0, +786, 1827, 0, +1263, 1960, 0, +1547, 2093, 0, +1767, 2225, 0, +1955, 2358, 0, +2125, 2490, 0, +2283, 2623, 0, +2434, 2755, 0, +2580, 2887, 0, +2721, 3019, 0, +2861, 3152, 0, +2998, 3283, 0, +3134, 3416, 0, +3269, 3548, 0, +3404, 3680, 0, +3537, 3812, 0, +3671, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 1092, 1429, +0, 1118, 1427, +0, 1149, 1424, +0, 1188, 1421, +0, 1228, 1421, +0, 1277, 1421, +0, 1335, 1421, +0, 1403, 1421, +0, 1421, 1353, +0, 1421, 1207, +0, 1421, 885, +0, 1557, 0, +0, 1691, 0, +869, 1825, 0, +1294, 1959, 0, +1564, 2092, 0, +1777, 2225, 0, +1962, 2357, 0, +2129, 2490, 0, +2287, 2622, 0, +2436, 2755, 0, +2581, 2887, 0, +2723, 3019, 0, +2862, 3151, 0, +2999, 3283, 0, +3135, 3416, 0, +3270, 3548, 0, +3404, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 1037, 1429, +0, 1065, 1427, +0, 1101, 1424, +0, 1144, 1421, +0, 1196, 1416, +0, 1248, 1416, +0, 1310, 1416, +0, 1381, 1416, +0, 1416, 1367, +0, 1416, 1225, +0, 1416, 920, +0, 1553, 0, +0, 1689, 0, +960, 1823, 0, +1332, 1958, 0, +1585, 2091, 0, +1790, 2224, 0, +1970, 2357, 0, +2136, 2489, 0, +2291, 2622, 0, +2440, 2755, 0, +2584, 2887, 0, +2724, 3019, 0, +2863, 3151, 0, +3000, 3283, 0, +3135, 3416, 0, +3270, 3548, 0, +3404, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 951, 1429, +0, 985, 1427, +0, 1027, 1424, +0, 1077, 1421, +0, 1137, 1416, +0, 1206, 1410, +0, 1273, 1410, +0, 1350, 1410, +0, 1410, 1383, +0, 1410, 1248, +0, 1410, 964, +0, 1549, 0, +406, 1685, 0, +1059, 1821, 0, +1378, 1956, 0, +1612, 2089, 0, +1808, 2223, 0, +1982, 2356, 0, +2144, 2489, 0, +2297, 2621, 0, +2444, 2754, 0, +2587, 2887, 0, +2727, 3019, 0, +2865, 3151, 0, +3001, 3283, 0, +3136, 3416, 0, +3271, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 803, 1429, +0, 849, 1427, +0, 904, 1424, +0, 969, 1421, +0, 1043, 1416, +0, 1127, 1410, +344, 1219, 1402, +344, 1304, 1402, +344, 1398, 1402, +344, 1402, 1277, +344, 1402, 1017, +0, 1543, 172, +742, 1681, 0, +1164, 1817, 0, +1433, 1953, 0, +1646, 2087, 0, +1830, 2221, 0, +1998, 2355, 0, +2155, 2488, 0, +2304, 2621, 0, +2450, 2754, 0, +2591, 2886, 0, +2730, 3018, 0, +2867, 3151, 0, +3003, 3283, 0, +3138, 3415, 0, +3272, 3548, 0, +3406, 3680, 0, +3539, 3812, 0, +3672, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 471, 1429, +0, 562, 1427, +0, 662, 1424, +0, 767, 1421, +0, 878, 1416, +0, 994, 1410, +344, 1114, 1402, +695, 1236, 1390, +695, 1343, 1390, +695, 1390, 1313, +695, 1390, 1078, +479, 1534, 476, +983, 1674, 0, +1275, 1813, 0, +1498, 1950, 0, +1687, 2085, 0, +1858, 2220, 0, +2017, 2353, 0, +2169, 2487, 0, +2314, 2620, 0, +2457, 2753, 0, +2596, 2886, 0, +2734, 3018, 0, +2870, 3151, 0, +3005, 3283, 0, +3139, 3415, 0, +3273, 3548, 0, +3406, 3680, 0, +3540, 3812, 0, +3672, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 0, 1429, +0, 0, 1427, +0, 0, 1424, +0, 141, 1421, +0, 478, 1416, +0, 719, 1410, +344, 919, 1402, +695, 1095, 1390, +940, 1258, 1374, +940, 1374, 1357, +940, 1374, 1150, +926, 1523, 826, +1183, 1666, 608, +1391, 1807, 0, +1572, 1945, 0, +1738, 2082, 0, +1894, 2217, 0, +2042, 2352, 0, +2187, 2486, 0, +2328, 2619, 0, +2467, 2752, 0, +2603, 2885, 0, +2739, 3018, 0, +2874, 3151, 0, +3008, 3283, 0, +3141, 3415, 0, +3275, 3548, 0, +3408, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +0, 0, 1429, +0, 0, 1427, +0, 0, 1424, +0, 0, 1421, +0, 0, 1416, +47, 0, 1410, +344, 345, 1402, +695, 793, 1390, +940, 1069, 1374, +1142, 1286, 1352, +1142, 1352, 1231, +1202, 1507, 1073, +1360, 1654, 959, +1510, 1798, 740, +1655, 1939, 0, +1797, 2077, 0, +1936, 2214, 0, +2074, 2349, 0, +2210, 2484, 0, +2345, 2618, 0, +2479, 2751, 0, +2613, 2885, 0, +2746, 3017, 0, +2879, 3150, 0, +3012, 3282, 0, +3144, 3415, 0, +3277, 3547, 0, +3409, 3680, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +816, 0, 1429, +833, 0, 1427, +856, 0, 1424, +885, 0, 1421, +920, 0, 1416, +964, 0, 1410, +1017, 344, 1402, +1078, 695, 1390, +1150, 940, 1374, +1231, 1142, 1352, +1320, 1320, 1320, +1418, 1484, 1274, +1522, 1638, 1205, +1633, 1787, 1090, +1748, 1930, 872, +1866, 2071, 79, +1988, 2209, 0, +2113, 2346, 0, +2239, 2481, 0, +2367, 2616, 0, +2495, 2750, 0, +2625, 2883, 0, +2755, 3016, 0, +2886, 3150, 0, +3017, 3282, 0, +3148, 3414, 0, +3280, 3547, 0, +3411, 3679, 0, +3543, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1301, 0, 1563, +1307, 0, 1561, +1315, 0, 1559, +1326, 0, 1557, +1340, 0, 1553, +1358, 0, 1549, +1381, 0, 1543, +1409, 476, 1534, +1445, 826, 1523, +1489, 1073, 1507, +1484, 1274, 1418, +1484, 1363, 1274, +1638, 1621, 1205, +1740, 1787, 1090, +1833, 1930, 872, +1934, 2071, 79, +2041, 2209, 0, +2153, 2346, 0, +2270, 2481, 0, +2390, 2616, 0, +2514, 2750, 0, +2639, 2883, 0, +2765, 3016, 0, +2894, 3150, 0, +3023, 3282, 0, +3152, 3414, 0, +3283, 3547, 0, +3414, 3679, 0, +3545, 3812, 0, +3676, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1587, 0, 1696, +1590, 0, 1695, +1594, 0, 1693, +1600, 0, 1691, +1608, 0, 1689, +1618, 0, 1685, +1631, 0, 1681, +1648, 0, 1674, +1666, 608, 1663, +1654, 959, 1608, +1638, 1205, 1522, +1638, 1205, 1333, +1638, 1414, 1205, +1787, 1709, 1090, +1927, 1930, 872, +2010, 2071, 79, +2102, 2209, 0, +2202, 2346, 0, +2308, 2481, 0, +2420, 2616, 0, +2536, 2750, 0, +2656, 2883, 0, +2778, 3016, 0, +2904, 3150, 0, +3030, 3282, 0, +3158, 3414, 0, +3287, 3547, 0, +3417, 3679, 0, +3547, 3812, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1807, 0, 1828, +1810, 0, 1828, +1812, 0, 1827, +1816, 0, 1825, +1821, 0, 1823, +1821, 0, 1815, +1817, 0, 1799, +1813, 0, 1777, +1807, 0, 1746, +1798, 740, 1701, +1787, 1090, 1633, +1787, 1090, 1491, +1787, 1090, 1189, +1787, 1475, 1090, +1930, 1805, 872, +2071, 2044, 79, +2174, 2209, 0, +2260, 2346, 0, +2355, 2481, 0, +2456, 2616, 0, +2565, 2750, 0, +2678, 2883, 0, +2796, 3016, 0, +2917, 3150, 0, +3040, 3282, 0, +3165, 3414, 0, +3293, 3547, 0, +3421, 3679, 0, +3551, 3812, 0, +3680, 3944, 0, +3811, 4076, 0, +3942, 4095, 0, +1961, 0, 1923, +1961, 0, 1920, +1960, 0, 1917, +1959, 0, 1911, +1958, 0, 1905, +1956, 0, 1895, +1953, 0, 1882, +1950, 0, 1864, +1945, 0, 1838, +1939, 0, 1801, +1930, 872, 1748, +1930, 872, 1642, +1930, 872, 1447, +1930, 872, 873, +1930, 1545, 872, +2071, 1908, 79, +2209, 2159, 0, +2328, 2346, 0, +2410, 2481, 0, +2501, 2616, 0, +2601, 2750, 0, +2706, 2883, 0, +2817, 3016, 0, +2933, 3150, 0, +3053, 3282, 0, +3175, 3414, 0, +3300, 3547, 0, +3427, 3679, 0, +3555, 3812, 0, +3684, 3944, 0, +3813, 4076, 0, +3944, 4095, 0, +2094, 0, 2007, +2093, 0, 2005, +2093, 0, 2002, +2092, 0, 1997, +2091, 0, 1992, +2089, 0, 1984, +2087, 0, 1973, +2085, 0, 1958, +2082, 0, 1938, +2077, 0, 1908, +2071, 79, 1866, +2071, 79, 1787, +2071, 79, 1655, +2071, 79, 1379, +2071, 706, 79, +2071, 1625, 79, +2209, 2018, 0, +2346, 2278, 0, +2475, 2481, 0, +2555, 2616, 0, +2645, 2750, 0, +2741, 2883, 0, +2845, 3016, 0, +2955, 3150, 0, +3070, 3282, 0, +3188, 3414, 0, +3310, 3547, 0, +3434, 3679, 0, +3561, 3812, 0, +3688, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2226, 0, 2100, +2226, 0, 2098, +2225, 0, 2095, +2225, 0, 2092, +2224, 0, 2087, +2223, 0, 2081, +2221, 0, 2072, +2220, 0, 2060, +2217, 0, 2044, +2214, 0, 2021, +2209, 0, 1988, +2209, 0, 1929, +2209, 0, 1836, +2209, 0, 1671, +2209, 0, 1270, +2209, 303, 0, +2209, 1713, 0, +2346, 2132, 0, +2481, 2401, 0, +2616, 2613, 0, +2697, 2750, 0, +2784, 2883, 0, +2880, 3016, 0, +2982, 3150, 0, +3091, 3282, 0, +3205, 3414, 0, +3323, 3547, 0, +3444, 3679, 0, +3568, 3812, 0, +3694, 3944, 0, +3821, 4076, 0, +3950, 4095, 0, +2358, 0, 2200, +2358, 0, 2199, +2358, 0, 2196, +2357, 0, 2193, +2357, 0, 2190, +2356, 0, 2185, +2355, 0, 2178, +2353, 0, 2168, +2352, 0, 2155, +2349, 0, 2138, +2346, 0, 2113, +2346, 0, 2069, +2346, 0, 2002, +2346, 0, 1894, +2346, 0, 1692, +2346, 0, 1064, +2346, 0, 0, +2346, 1809, 0, +2481, 2251, 0, +2616, 2525, 0, +2750, 2741, 0, +2836, 2883, 0, +2922, 3016, 0, +3017, 3150, 0, +3118, 3282, 0, +3226, 3414, 0, +3339, 3547, 0, +3457, 3679, 0, +3577, 3812, 0, +3701, 3944, 0, +3826, 4076, 0, +3954, 4095, 0, +2491, 0, 2306, +2491, 0, 2305, +2490, 0, 2304, +2490, 0, 2302, +2489, 0, 2298, +2489, 0, 2294, +2488, 0, 2289, +2487, 0, 2282, +2486, 0, 2272, +2484, 0, 2258, +2481, 0, 2239, +2481, 0, 2206, +2481, 0, 2158, +2481, 0, 2084, +2481, 0, 1961, +2481, 0, 1719, +2481, 0, 415, +2481, 0, 0, +2481, 1913, 0, +2616, 2372, 0, +2750, 2651, 0, +2883, 2869, 0, +2974, 3016, 0, +3059, 3150, 0, +3152, 3282, 0, +3253, 3414, 0, +3361, 3547, 0, +3473, 3679, 0, +3590, 3812, 0, +3711, 3944, 0, +3834, 4076, 0, +3959, 4095, 0, +2623, 0, 2419, +2623, 0, 2417, +2623, 0, 2416, +2622, 0, 2414, +2622, 0, 2412, +2621, 0, 2409, +2621, 0, 2405, +2620, 0, 2399, +2619, 0, 2392, +2618, 0, 2381, +2616, 0, 2367, +2616, 0, 2342, +2616, 0, 2306, +2616, 0, 2255, +2616, 0, 2174, +2616, 0, 2038, +2616, 0, 1752, +2616, 0, 0, +2616, 0, 0, +2616, 2022, 0, +2750, 2496, 0, +2883, 2779, 0, +3016, 2998, 0, +3110, 3150, 0, +3194, 3282, 0, +3287, 3414, 0, +3387, 3547, 0, +3494, 3679, 0, +3606, 3812, 0, +3723, 3944, 0, +3843, 4076, 0, +3967, 4095, 0, +2755, 0, 2535, +2755, 0, 2535, +2755, 0, 2533, +2755, 0, 2532, +2755, 0, 2530, +2754, 0, 2528, +2754, 0, 2525, +2753, 0, 2521, +2752, 0, 2514, +2751, 0, 2506, +2750, 0, 2495, +2750, 0, 2477, +2750, 0, 2451, +2750, 0, 2414, +2750, 0, 2359, +2750, 0, 2273, +2750, 0, 2124, +2750, 0, 1794, +2750, 0, 0, +2750, 0, 0, +2750, 2137, 0, +2883, 2621, 0, +3016, 2907, 0, +3150, 3128, 0, +3244, 3282, 0, +3329, 3414, 0, +3421, 3547, 0, +3521, 3679, 0, +3628, 3812, 0, +3740, 3944, 0, +3856, 4076, 0, +3976, 4095, 0, +2887, 0, 2655, +2887, 0, 2655, +2887, 0, 2654, +2887, 0, 2653, +2887, 0, 2651, +2887, 0, 2650, +2886, 0, 2647, +2886, 0, 2644, +2885, 0, 2639, +2885, 0, 2633, +2883, 0, 2625, +2883, 0, 2611, +2883, 0, 2592, +2883, 0, 2565, +2883, 0, 2526, +2883, 0, 2469, +2883, 0, 2378, +2883, 0, 2218, +2883, 0, 1843, +2883, 0, 0, +2883, 0, 0, +2883, 2255, 0, +3016, 2749, 0, +3150, 3038, 0, +3282, 3259, 0, +3379, 3414, 0, +3462, 3547, 0, +3554, 3679, 0, +3654, 3812, 0, +3761, 3944, 0, +3872, 4076, 0, +3989, 4095, 0, +3019, 0, 2778, +3019, 0, 2777, +3019, 0, 2777, +3019, 0, 2776, +3019, 0, 2775, +3019, 0, 2774, +3018, 0, 2772, +3018, 0, 2769, +3018, 0, 2766, +3017, 0, 2761, +3016, 0, 2755, +3016, 0, 2745, +3016, 0, 2731, +3016, 0, 2711, +3016, 0, 2683, +3016, 0, 2643, +3016, 0, 2583, +3016, 0, 2488, +3016, 0, 2319, +3016, 0, 1900, +3016, 0, 0, +3016, 0, 0, +3016, 2377, 0, +3150, 2878, 0, +3282, 3168, 0, +3414, 3390, 0, +3512, 3547, 0, +3596, 3679, 0, +3688, 3812, 0, +3787, 3944, 0, +3893, 4076, 0, +4005, 4095, 0, +3152, 0, 2903, +3152, 0, 2903, +3152, 0, 2903, +3151, 0, 2902, +3151, 0, 2901, +3151, 0, 2900, +3151, 0, 2898, +3151, 0, 2896, +3151, 0, 2894, +3150, 0, 2891, +3150, 0, 2886, +3150, 0, 2878, +3150, 0, 2868, +3150, 0, 2853, +3150, 0, 2833, +3150, 0, 2804, +3150, 0, 2763, +3150, 0, 2702, +3150, 0, 2604, +3150, 0, 2427, +3150, 0, 1969, +3150, 0, 0, +3150, 0, 0, +3150, 2501, 0, +3282, 3006, 0, +3414, 3298, 0, +3547, 3521, 0, +3646, 3679, 0, +3729, 3812, 0, +3820, 3944, 0, +3920, 4076, 0, +4026, 4095, 0, +3284, 0, 3030, +3283, 0, 3029, +3283, 0, 3029, +3283, 0, 3029, +3283, 0, 3028, +3283, 0, 3027, +3283, 0, 3026, +3283, 0, 3025, +3283, 0, 3023, +3282, 0, 3020, +3282, 0, 3017, +3282, 0, 3011, +3282, 0, 3003, +3282, 0, 2992, +3282, 0, 2977, +3282, 0, 2957, +3282, 0, 2928, +3282, 0, 2886, +3282, 0, 2823, +3282, 0, 2723, +3282, 0, 2539, +3282, 0, 2045, +3282, 0, 0, +3282, 0, 0, +3282, 2627, 0, +3414, 3137, 0, +3547, 3429, 0, +3679, 3653, 0, +3778, 3812, 0, +3862, 3944, 0, +3953, 4076, 0, +4053, 4095, 0, +3416, 0, 3158, +3416, 0, 3158, +3416, 0, 3157, +3416, 0, 3157, +3416, 0, 3157, +3416, 0, 3156, +3415, 0, 3155, +3415, 0, 3154, +3415, 0, 3153, +3415, 0, 3151, +3414, 0, 3148, +3414, 0, 3144, +3414, 0, 3138, +3414, 0, 3130, +3414, 0, 3119, +3414, 0, 3104, +3414, 0, 3083, +3414, 0, 3054, +3414, 0, 3011, +3414, 0, 2947, +3414, 0, 2845, +3414, 0, 2657, +3414, 0, 2135, +3414, 0, 0, +3414, 0, 0, +3414, 2754, 0, +3547, 3268, 0, +3679, 3561, 0, +3812, 3784, 0, +3911, 3944, 0, +3994, 4076, 0, +4086, 4095, 0, +3548, 0, 3287, +3548, 0, 3287, +3548, 0, 3287, +3548, 0, 3286, +3548, 0, 3286, +3548, 0, 3286, +3548, 0, 3285, +3548, 0, 3284, +3548, 0, 3283, +3547, 0, 3282, +3547, 0, 3280, +3547, 0, 3277, +3547, 0, 3272, +3547, 0, 3266, +3547, 0, 3258, +3547, 0, 3247, +3547, 0, 3232, +3547, 0, 3211, +3547, 0, 3181, +3547, 0, 3138, +3547, 0, 3074, +3547, 0, 2970, +3547, 0, 2778, +3547, 0, 2228, +3547, 0, 0, +3547, 0, 0, +3547, 2883, 0, +3679, 3399, 0, +3812, 3692, 0, +3944, 3916, 0, +4044, 4076, 0, +4095, 4095, 0, +3680, 0, 3417, +3680, 0, 3417, +3680, 0, 3417, +3680, 0, 3416, +3680, 0, 3416, +3680, 0, 3416, +3680, 0, 3415, +3680, 0, 3415, +3680, 0, 3414, +3680, 0, 3413, +3679, 0, 3411, +3679, 0, 3409, +3679, 0, 3406, +3679, 0, 3401, +3679, 0, 3395, +3679, 0, 3387, +3679, 0, 3376, +3679, 0, 3361, +3679, 0, 3340, +3679, 0, 3310, +3679, 0, 3267, +3679, 0, 3201, +3679, 0, 3096, +3679, 0, 2901, +3679, 0, 2333, +3679, 0, 0, +3679, 0, 0, +3679, 3013, 0, +3812, 3530, 0, +3944, 3824, 0, +4076, 4048, 0, +4095, 4095, 0, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3547, +3812, 0, 3546, +3812, 0, 3546, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3543, +3812, 0, 3541, +3812, 0, 3539, +3812, 0, 3536, +3812, 0, 3531, +3812, 0, 3525, +3812, 0, 3517, +3812, 0, 3506, +3812, 0, 3491, +3812, 0, 3469, +3812, 0, 3439, +3812, 0, 3396, +3812, 0, 3330, +3812, 0, 3224, +3812, 0, 3027, +3812, 0, 2441, +3812, 0, 0, +3812, 0, 0, +3812, 3143, 0, +3944, 3661, 0, +4076, 3955, 0, +4095, 4095, 0, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3674, +3944, 0, 3672, +3944, 0, 3669, +3944, 0, 3666, +3944, 0, 3662, +3944, 0, 3656, +3944, 0, 3648, +3944, 0, 3636, +3944, 0, 3621, +3944, 0, 3600, +3944, 0, 3569, +3944, 0, 3526, +3944, 0, 3459, +3944, 0, 3353, +3944, 0, 3154, +3944, 0, 2553, +3944, 0, 0, +3944, 0, 0, +3944, 3273, 0, +4076, 3793, 0, +4095, 4088, 0, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3806, +4076, 0, 3804, +4076, 0, 3803, +4076, 0, 3800, +4076, 0, 3797, +4076, 0, 3793, +4076, 0, 3787, +4076, 0, 3778, +4076, 0, 3767, +4076, 0, 3752, +4076, 0, 3730, +4076, 0, 3700, +4076, 0, 3656, +4076, 0, 3590, +4076, 0, 3482, +4076, 0, 3282, +4076, 0, 2670, +4076, 0, 0, +4076, 0, 0, +4076, 3404, 0, +4095, 3925, 0, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3936, +4095, 0, 3934, +4095, 0, 3932, +4095, 0, 3928, +4095, 0, 3924, +4095, 0, 3918, +4095, 0, 3910, +4095, 0, 3898, +4095, 0, 3883, +4095, 0, 3862, +4095, 0, 3831, +4095, 0, 3787, +4095, 0, 3721, +4095, 0, 3613, +4095, 0, 3412, +4095, 0, 2793, +4095, 0, 0, +4095, 0, 0, +4095, 3536, 0, +0, 1304, 1563, +0, 1318, 1563, +0, 1335, 1563, +0, 1357, 1563, +0, 1385, 1563, +0, 1421, 1563, +0, 1463, 1563, +0, 1515, 1563, +0, 1563, 1548, +0, 1563, 1458, +0, 1563, 1301, +0, 1563, 934, +0, 1696, 0, +0, 1828, 0, +726, 1961, 0, +1336, 2094, 0, +1648, 2226, 0, +1880, 2358, 0, +2075, 2491, 0, +2248, 2623, 0, +2409, 2755, 0, +2562, 2887, 0, +2708, 3019, 0, +2851, 3152, 0, +2991, 3284, 0, +3129, 3416, 0, +3266, 3548, 0, +3401, 3680, 0, +3535, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1290, 1563, +0, 1307, 1561, +0, 1325, 1561, +0, 1347, 1561, +0, 1376, 1561, +0, 1412, 1561, +0, 1456, 1561, +0, 1508, 1561, +0, 1561, 1552, +0, 1561, 1463, +0, 1561, 1307, +0, 1561, 948, +0, 1695, 0, +0, 1828, 0, +780, 1961, 0, +1351, 2093, 0, +1656, 2226, 0, +1885, 2358, 0, +2078, 2491, 0, +2250, 2623, 0, +2411, 2755, 0, +2563, 2887, 0, +2709, 3019, 0, +2852, 3152, 0, +2992, 3283, 0, +3129, 3416, 0, +3266, 3548, 0, +3401, 3680, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1271, 1563, +0, 1288, 1561, +0, 1310, 1559, +0, 1333, 1559, +0, 1363, 1559, +0, 1400, 1559, +0, 1445, 1559, +0, 1499, 1559, +0, 1559, 1556, +0, 1559, 1468, +0, 1559, 1315, +0, 1559, 966, +0, 1693, 0, +0, 1827, 0, +844, 1960, 0, +1370, 2093, 0, +1666, 2225, 0, +1891, 2358, 0, +2082, 2490, 0, +2253, 2623, 0, +2413, 2755, 0, +2564, 2887, 0, +2710, 3019, 0, +2853, 3152, 0, +2992, 3283, 0, +3130, 3416, 0, +3266, 3548, 0, +3401, 3680, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1244, 1563, +0, 1262, 1561, +0, 1285, 1559, +0, 1315, 1557, +0, 1345, 1557, +0, 1384, 1557, +0, 1430, 1557, +0, 1486, 1557, +0, 1551, 1557, +0, 1557, 1476, +0, 1557, 1326, +0, 1557, 988, +0, 1691, 0, +0, 1825, 0, +917, 1959, 0, +1394, 2092, 0, +1679, 2225, 0, +1899, 2357, 0, +2087, 2490, 0, +2256, 2622, 0, +2415, 2755, 0, +2566, 2887, 0, +2712, 3019, 0, +2854, 3151, 0, +2993, 3283, 0, +3130, 3416, 0, +3267, 3548, 0, +3401, 3680, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1205, 1563, +0, 1225, 1561, +0, 1250, 1559, +0, 1281, 1557, +0, 1320, 1553, +0, 1360, 1553, +0, 1409, 1553, +0, 1467, 1553, +0, 1535, 1553, +0, 1553, 1486, +0, 1553, 1340, +0, 1553, 1017, +0, 1689, 0, +0, 1823, 0, +1000, 1958, 0, +1425, 2091, 0, +1695, 2224, 0, +1909, 2357, 0, +2094, 2489, 0, +2261, 2622, 0, +2419, 2755, 0, +2569, 2887, 0, +2713, 3019, 0, +2855, 3151, 0, +2994, 3283, 0, +3131, 3416, 0, +3267, 3548, 0, +3402, 3680, 0, +3536, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1148, 1563, +0, 1170, 1561, +0, 1198, 1559, +0, 1233, 1557, +0, 1276, 1553, +0, 1328, 1549, +0, 1380, 1549, +0, 1442, 1549, +0, 1513, 1549, +0, 1549, 1499, +0, 1549, 1358, +0, 1549, 1053, +0, 1685, 0, +0, 1821, 0, +1091, 1956, 0, +1463, 2089, 0, +1717, 2223, 0, +1922, 2356, 0, +2103, 2489, 0, +2268, 2621, 0, +2423, 2754, 0, +2572, 2887, 0, +2716, 3019, 0, +2857, 3151, 0, +2995, 3283, 0, +3132, 3416, 0, +3268, 3548, 0, +3402, 3680, 0, +3537, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 1057, 1563, +0, 1084, 1561, +0, 1118, 1559, +0, 1159, 1557, +0, 1209, 1553, +0, 1269, 1549, +0, 1338, 1543, +0, 1405, 1543, +0, 1482, 1543, +0, 1543, 1516, +0, 1543, 1381, +0, 1543, 1096, +0, 1681, 0, +536, 1817, 0, +1190, 1953, 0, +1509, 2087, 0, +1744, 2221, 0, +1940, 2355, 0, +2115, 2488, 0, +2276, 2621, 0, +2429, 2754, 0, +2576, 2886, 0, +2719, 3018, 0, +2859, 3151, 0, +2997, 3283, 0, +3133, 3415, 0, +3269, 3548, 0, +3403, 3680, 0, +3537, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 897, 1563, +0, 935, 1561, +0, 981, 1559, +0, 1037, 1557, +0, 1102, 1553, +0, 1176, 1549, +0, 1259, 1543, +476, 1351, 1534, +476, 1437, 1534, +476, 1531, 1534, +476, 1534, 1409, +476, 1534, 1149, +0, 1674, 313, +874, 1813, 0, +1295, 1950, 0, +1565, 2085, 0, +1778, 2220, 0, +1962, 2353, 0, +2130, 2487, 0, +2287, 2620, 0, +2437, 2753, 0, +2581, 2886, 0, +2723, 3018, 0, +2862, 3151, 0, +2999, 3283, 0, +3135, 3415, 0, +3270, 3548, 0, +3404, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 523, 1563, +0, 605, 1561, +0, 696, 1559, +0, 794, 1557, +0, 900, 1553, +0, 1011, 1549, +0, 1127, 1543, +476, 1246, 1534, +826, 1368, 1523, +826, 1476, 1523, +826, 1523, 1445, +826, 1523, 1211, +608, 1666, 609, +1115, 1807, 0, +1407, 1945, 0, +1630, 2082, 0, +1819, 2217, 0, +1990, 2352, 0, +2149, 2486, 0, +2301, 2619, 0, +2447, 2752, 0, +2589, 2885, 0, +2728, 3018, 0, +2866, 3151, 0, +3002, 3283, 0, +3137, 3415, 0, +3271, 3548, 0, +3405, 3680, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 0, 1563, +0, 0, 1561, +0, 0, 1559, +0, 0, 1557, +0, 275, 1553, +0, 611, 1549, +0, 852, 1543, +476, 1051, 1534, +826, 1228, 1523, +1073, 1390, 1507, +1073, 1507, 1489, +1073, 1507, 1282, +1056, 1654, 959, +1315, 1798, 740, +1523, 1939, 0, +1704, 2077, 0, +1870, 2214, 0, +2025, 2349, 0, +2174, 2484, 0, +2319, 2618, 0, +2460, 2751, 0, +2599, 2885, 0, +2735, 3017, 0, +2871, 3150, 0, +3006, 3282, 0, +3140, 3415, 0, +3274, 3547, 0, +3407, 3680, 0, +3540, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3937, 4095, 0, +0, 0, 1563, +0, 0, 1561, +0, 0, 1559, +0, 0, 1557, +0, 0, 1553, +0, 0, 1549, +172, 0, 1543, +476, 479, 1534, +826, 926, 1523, +1073, 1202, 1507, +1274, 1418, 1484, +1274, 1484, 1363, +1333, 1638, 1205, +1491, 1787, 1090, +1642, 1930, 872, +1787, 2071, 79, +1929, 2209, 0, +2069, 2346, 0, +2206, 2481, 0, +2342, 2616, 0, +2477, 2750, 0, +2611, 2883, 0, +2745, 3016, 0, +2878, 3150, 0, +3011, 3282, 0, +3144, 3414, 0, +3277, 3547, 0, +3409, 3679, 0, +3541, 3812, 0, +3674, 3944, 0, +3806, 4076, 0, +3938, 4095, 0, +934, 0, 1563, +948, 0, 1561, +966, 0, 1559, +988, 0, 1557, +1017, 0, 1553, +1053, 0, 1549, +1096, 0, 1543, +1149, 476, 1534, +1211, 826, 1523, +1282, 1073, 1507, +1363, 1274, 1484, +1453, 1453, 1453, +1550, 1616, 1407, +1654, 1771, 1337, +1765, 1919, 1223, +1880, 2062, 1005, +1998, 2203, 217, +2120, 2341, 0, +2245, 2478, 0, +2371, 2613, 0, +2499, 2748, 0, +2628, 2882, 0, +2757, 3015, 0, +2887, 3149, 0, +3018, 3281, 0, +3149, 3414, 0, +3280, 3547, 0, +3412, 3679, 0, +3544, 3812, 0, +3675, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1427, 0, 1696, +1432, 0, 1695, +1439, 0, 1693, +1447, 0, 1691, +1457, 0, 1689, +1471, 0, 1685, +1489, 0, 1681, +1512, 0, 1674, +1541, 608, 1666, +1577, 959, 1654, +1621, 1205, 1638, +1616, 1407, 1550, +1616, 1495, 1407, +1771, 1754, 1337, +1872, 1919, 1223, +1965, 2062, 1005, +2066, 2203, 217, +2173, 2341, 0, +2285, 2478, 0, +2402, 2613, 0, +2522, 2748, 0, +2645, 2882, 0, +2770, 3015, 0, +2898, 3149, 0, +3025, 3281, 0, +3155, 3414, 0, +3285, 3547, 0, +3415, 3679, 0, +3546, 3812, 0, +3677, 3944, 0, +3808, 4076, 0, +3940, 4095, 0, +1716, 0, 1828, +1719, 0, 1828, +1722, 0, 1827, +1727, 0, 1825, +1732, 0, 1823, +1740, 0, 1821, +1750, 0, 1817, +1763, 0, 1813, +1780, 0, 1807, +1798, 740, 1795, +1787, 1090, 1740, +1771, 1337, 1654, +1771, 1337, 1466, +1771, 1546, 1337, +1919, 1841, 1223, +2059, 2062, 1005, +2142, 2203, 217, +2234, 2341, 0, +2334, 2478, 0, +2440, 2613, 0, +2552, 2748, 0, +2668, 2882, 0, +2788, 3015, 0, +2911, 3149, 0, +3035, 3281, 0, +3162, 3414, 0, +3290, 3547, 0, +3419, 3679, 0, +3549, 3812, 0, +3679, 3944, 0, +3810, 4076, 0, +3941, 4095, 0, +1938, 0, 1961, +1940, 0, 1961, +1941, 0, 1960, +1944, 0, 1959, +1948, 0, 1958, +1953, 0, 1956, +1953, 0, 1947, +1950, 0, 1931, +1945, 0, 1909, +1939, 0, 1878, +1930, 872, 1833, +1919, 1223, 1765, +1919, 1223, 1624, +1919, 1223, 1321, +1919, 1607, 1223, +2062, 1937, 1005, +2203, 2176, 217, +2305, 2341, 0, +2392, 2478, 0, +2487, 2613, 0, +2589, 2748, 0, +2697, 2882, 0, +2810, 3015, 0, +2928, 3149, 0, +3049, 3281, 0, +3172, 3414, 0, +3298, 3547, 0, +3425, 3679, 0, +3553, 3812, 0, +3683, 3944, 0, +3812, 4076, 0, +3943, 4095, 0, +2094, 0, 2058, +2093, 0, 2056, +2093, 0, 2053, +2092, 0, 2049, +2091, 0, 2044, +2089, 0, 2037, +2087, 0, 2027, +2085, 0, 2014, +2082, 0, 1996, +2077, 0, 1970, +2071, 79, 1934, +2062, 1005, 1880, +2062, 1005, 1774, +2062, 1005, 1579, +2062, 1005, 1006, +2062, 1677, 1005, +2203, 2041, 217, +2341, 2291, 0, +2460, 2478, 0, +2542, 2613, 0, +2634, 2748, 0, +2733, 2882, 0, +2838, 3015, 0, +2950, 3149, 0, +3065, 3281, 0, +3185, 3414, 0, +3307, 3547, 0, +3432, 3679, 0, +3559, 3812, 0, +3687, 3944, 0, +3816, 4076, 0, +3946, 4095, 0, +2226, 0, 2141, +2226, 0, 2140, +2225, 0, 2137, +2225, 0, 2134, +2224, 0, 2130, +2223, 0, 2124, +2221, 0, 2116, +2220, 0, 2105, +2217, 0, 2090, +2214, 0, 2070, +2209, 0, 2041, +2203, 217, 1998, +2203, 217, 1920, +2203, 217, 1787, +2203, 217, 1512, +2203, 838, 217, +2203, 1757, 217, +2341, 2150, 0, +2478, 2411, 0, +2607, 2613, 0, +2687, 2748, 0, +2777, 2882, 0, +2873, 3015, 0, +2977, 3149, 0, +3087, 3281, 0, +3202, 3414, 0, +3320, 3547, 0, +3442, 3679, 0, +3566, 3812, 0, +3692, 3944, 0, +3820, 4076, 0, +3949, 4095, 0, +2358, 0, 2233, +2358, 0, 2232, +2358, 0, 2230, +2357, 0, 2228, +2357, 0, 2224, +2356, 0, 2219, +2355, 0, 2213, +2353, 0, 2204, +2352, 0, 2192, +2349, 0, 2176, +2346, 0, 2153, +2341, 0, 2120, +2341, 0, 2061, +2341, 0, 1968, +2341, 0, 1803, +2341, 0, 1403, +2341, 437, 0, +2341, 1845, 0, +2478, 2264, 0, +2613, 2533, 0, +2748, 2745, 0, +2829, 2882, 0, +2916, 3015, 0, +3012, 3149, 0, +3114, 3281, 0, +3223, 3414, 0, +3337, 3547, 0, +3455, 3679, 0, +3576, 3812, 0, +3700, 3944, 0, +3826, 4076, 0, +3953, 4095, 0, +2491, 0, 2333, +2491, 0, 2332, +2490, 0, 2331, +2490, 0, 2329, +2489, 0, 2326, +2489, 0, 2322, +2488, 0, 2317, +2487, 0, 2310, +2486, 0, 2301, +2484, 0, 2288, +2481, 0, 2270, +2478, 0, 2245, +2478, 0, 2201, +2478, 0, 2134, +2478, 0, 2026, +2478, 0, 1824, +2478, 0, 1199, +2478, 0, 0, +2478, 1941, 0, +2613, 2382, 0, +2748, 2657, 0, +2882, 2873, 0, +2968, 3015, 0, +3055, 3149, 0, +3149, 3281, 0, +3250, 3414, 0, +3358, 3547, 0, +3472, 3679, 0, +3589, 3812, 0, +3710, 3944, 0, +3833, 4076, 0, +3959, 4095, 0, +2623, 0, 2440, +2623, 0, 2439, +2623, 0, 2437, +2622, 0, 2436, +2622, 0, 2434, +2621, 0, 2431, +2621, 0, 2427, +2620, 0, 2421, +2619, 0, 2414, +2618, 0, 2404, +2616, 0, 2390, +2613, 0, 2371, +2613, 0, 2338, +2613, 0, 2290, +2613, 0, 2216, +2613, 0, 2093, +2613, 0, 1851, +2613, 0, 547, +2613, 0, 0, +2613, 2045, 0, +2748, 2504, 0, +2882, 2784, 0, +3015, 3001, 0, +3106, 3149, 0, +3191, 3281, 0, +3284, 3414, 0, +3385, 3547, 0, +3493, 3679, 0, +3605, 3812, 0, +3722, 3944, 0, +3843, 4076, 0, +3966, 4095, 0, +2755, 0, 2552, +2755, 0, 2551, +2755, 0, 2550, +2755, 0, 2549, +2755, 0, 2547, +2754, 0, 2545, +2754, 0, 2541, +2753, 0, 2537, +2752, 0, 2532, +2751, 0, 2524, +2750, 0, 2514, +2748, 0, 2499, +2748, 0, 2474, +2748, 0, 2439, +2748, 0, 2387, +2748, 0, 2306, +2748, 0, 2170, +2748, 0, 1885, +2748, 0, 0, +2748, 0, 0, +2748, 2155, 0, +2882, 2628, 0, +3015, 2911, 0, +3149, 3131, 0, +3242, 3281, 0, +3326, 3414, 0, +3419, 3547, 0, +3520, 3679, 0, +3626, 3812, 0, +3739, 3944, 0, +3855, 4076, 0, +3976, 4095, 0, +2887, 0, 2668, +2887, 0, 2667, +2887, 0, 2667, +2887, 0, 2666, +2887, 0, 2664, +2887, 0, 2662, +2886, 0, 2660, +2886, 0, 2657, +2885, 0, 2652, +2885, 0, 2647, +2883, 0, 2639, +2882, 0, 2628, +2882, 0, 2609, +2882, 0, 2583, +2882, 0, 2546, +2882, 0, 2491, +2882, 0, 2405, +2882, 0, 2256, +2882, 0, 1925, +2882, 0, 0, +2882, 0, 0, +2882, 2269, 0, +3015, 2753, 0, +3149, 3040, 0, +3281, 3260, 0, +3376, 3414, 0, +3461, 3547, 0, +3553, 3679, 0, +3653, 3812, 0, +3760, 3944, 0, +3872, 4076, 0, +3988, 4095, 0, +3019, 0, 2788, +3019, 0, 2787, +3019, 0, 2787, +3019, 0, 2786, +3019, 0, 2785, +3019, 0, 2784, +3018, 0, 2782, +3018, 0, 2779, +3018, 0, 2776, +3017, 0, 2771, +3016, 0, 2765, +3015, 0, 2757, +3015, 0, 2743, +3015, 0, 2724, +3015, 0, 2697, +3015, 0, 2658, +3015, 0, 2600, +3015, 0, 2510, +3015, 0, 2350, +3015, 0, 1974, +3015, 0, 0, +3015, 0, 0, +3015, 2387, 0, +3149, 2881, 0, +3281, 3169, 0, +3414, 3391, 0, +3511, 3547, 0, +3595, 3679, 0, +3687, 3812, 0, +3786, 3944, 0, +3892, 4076, 0, +4005, 4095, 0, +3152, 0, 2911, +3152, 0, 2910, +3152, 0, 2910, +3151, 0, 2909, +3151, 0, 2908, +3151, 0, 2907, +3151, 0, 2906, +3151, 0, 2904, +3151, 0, 2902, +3150, 0, 2898, +3150, 0, 2894, +3149, 0, 2887, +3149, 0, 2877, +3149, 0, 2863, +3149, 0, 2843, +3149, 0, 2815, +3149, 0, 2775, +3149, 0, 2715, +3149, 0, 2620, +3149, 0, 2452, +3149, 0, 2033, +3149, 0, 0, +3149, 0, 0, +3149, 2509, 0, +3281, 3009, 0, +3414, 3299, 0, +3547, 3522, 0, +3644, 3679, 0, +3728, 3812, 0, +3820, 3944, 0, +3919, 4076, 0, +4026, 4095, 0, +3284, 0, 3035, +3283, 0, 3035, +3283, 0, 3035, +3283, 0, 3034, +3283, 0, 3034, +3283, 0, 3033, +3283, 0, 3032, +3283, 0, 3031, +3283, 0, 3029, +3282, 0, 3026, +3282, 0, 3023, +3281, 0, 3018, +3281, 0, 3010, +3281, 0, 2999, +3281, 0, 2985, +3281, 0, 2965, +3281, 0, 2936, +3281, 0, 2895, +3281, 0, 2833, +3281, 0, 2735, +3281, 0, 2558, +3281, 0, 2100, +3281, 0, 0, +3281, 0, 0, +3281, 2633, 0, +3414, 3139, 0, +3547, 3430, 0, +3679, 3653, 0, +3777, 3812, 0, +3861, 3944, 0, +3953, 4076, 0, +4052, 4095, 0, +3416, 0, 3162, +3416, 0, 3162, +3416, 0, 3162, +3416, 0, 3161, +3416, 0, 3161, +3416, 0, 3160, +3415, 0, 3160, +3415, 0, 3158, +3415, 0, 3157, +3415, 0, 3155, +3414, 0, 3152, +3414, 0, 3149, +3414, 0, 3143, +3414, 0, 3135, +3414, 0, 3125, +3414, 0, 3110, +3414, 0, 3089, +3414, 0, 3060, +3414, 0, 3018, +3414, 0, 2956, +3414, 0, 2855, +3414, 0, 2672, +3414, 0, 2180, +3414, 0, 0, +3414, 0, 0, +3414, 2759, 0, +3547, 3269, 0, +3679, 3562, 0, +3812, 3785, 0, +3910, 3944, 0, +3994, 4076, 0, +4085, 4095, 0, +3548, 0, 3290, +3548, 0, 3290, +3548, 0, 3290, +3548, 0, 3290, +3548, 0, 3289, +3548, 0, 3289, +3548, 0, 3288, +3548, 0, 3287, +3548, 0, 3286, +3547, 0, 3285, +3547, 0, 3283, +3547, 0, 3280, +3547, 0, 3276, +3547, 0, 3270, +3547, 0, 3262, +3547, 0, 3251, +3547, 0, 3236, +3547, 0, 3216, +3547, 0, 3186, +3547, 0, 3144, +3547, 0, 3080, +3547, 0, 2977, +3547, 0, 2790, +3547, 0, 2265, +3547, 0, 0, +3547, 0, 0, +3547, 2886, 0, +3679, 3400, 0, +3812, 3693, 0, +3944, 3916, 0, +4043, 4076, 0, +4095, 4095, 0, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3419, +3680, 0, 3418, +3680, 0, 3418, +3680, 0, 3417, +3680, 0, 3416, +3680, 0, 3415, +3679, 0, 3414, +3679, 0, 3412, +3679, 0, 3409, +3679, 0, 3404, +3679, 0, 3398, +3679, 0, 3390, +3679, 0, 3379, +3679, 0, 3364, +3679, 0, 3343, +3679, 0, 3314, +3679, 0, 3271, +3679, 0, 3206, +3679, 0, 3102, +3679, 0, 2910, +3679, 0, 2363, +3679, 0, 0, +3679, 0, 0, +3679, 3015, 0, +3812, 3531, 0, +3944, 3824, 0, +4076, 4048, 0, +4095, 4095, 0, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3549, +3812, 0, 3548, +3812, 0, 3548, +3812, 0, 3548, +3812, 0, 3547, +3812, 0, 3546, +3812, 0, 3545, +3812, 0, 3544, +3812, 0, 3541, +3812, 0, 3538, +3812, 0, 3533, +3812, 0, 3528, +3812, 0, 3520, +3812, 0, 3508, +3812, 0, 3493, +3812, 0, 3472, +3812, 0, 3442, +3812, 0, 3399, +3812, 0, 3333, +3812, 0, 3228, +3812, 0, 3034, +3812, 0, 2465, +3812, 0, 0, +3812, 0, 0, +3812, 3145, 0, +3944, 3662, 0, +4076, 3956, 0, +4095, 4095, 0, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3679, +3944, 0, 3678, +3944, 0, 3678, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3675, +3944, 0, 3673, +3944, 0, 3671, +3944, 0, 3668, +3944, 0, 3663, +3944, 0, 3657, +3944, 0, 3649, +3944, 0, 3638, +3944, 0, 3623, +3944, 0, 3602, +3944, 0, 3571, +3944, 0, 3528, +3944, 0, 3462, +3944, 0, 3356, +3944, 0, 3159, +3944, 0, 2572, +3944, 0, 0, +3944, 0, 0, +3944, 3275, 0, +4076, 3793, 0, +4095, 4088, 0, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3809, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3805, +4076, 0, 3804, +4076, 0, 3801, +4076, 0, 3798, +4076, 0, 3794, +4076, 0, 3787, +4076, 0, 3780, +4076, 0, 3768, +4076, 0, 3753, +4076, 0, 3732, +4076, 0, 3701, +4076, 0, 3658, +4076, 0, 3592, +4076, 0, 3485, +4076, 0, 3286, +4076, 0, 2684, +4076, 0, 0, +4076, 0, 0, +4076, 3405, 0, +4095, 3926, 0, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3937, +4095, 0, 3935, +4095, 0, 3932, +4095, 0, 3929, +4095, 0, 3925, +4095, 0, 3919, +4095, 0, 3910, +4095, 0, 3899, +4095, 0, 3884, +4095, 0, 3863, +4095, 0, 3832, +4095, 0, 3788, +4095, 0, 3722, +4095, 0, 3615, +4095, 0, 3415, +4095, 0, 2804, +4095, 0, 0, +4095, 0, 0, +4095, 3537, 0, +0, 1434, 1696, +0, 1444, 1696, +0, 1457, 1696, +0, 1475, 1696, +0, 1496, 1696, +0, 1524, 1696, +0, 1559, 1696, +0, 1601, 1696, +0, 1653, 1696, +0, 1696, 1677, +0, 1696, 1587, +0, 1696, 1427, +0, 1696, 1056, +0, 1828, 0, +0, 1961, 0, +814, 2094, 0, +1457, 2226, 0, +1775, 2358, 0, +2009, 2491, 0, +2205, 2623, 0, +2379, 2755, 0, +2541, 2887, 0, +2693, 3019, 0, +2840, 3152, 0, +2983, 3284, 0, +3123, 3416, 0, +3261, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3667, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1424, 1696, +0, 1436, 1695, +0, 1450, 1695, +0, 1467, 1695, +0, 1489, 1695, +0, 1517, 1695, +0, 1552, 1695, +0, 1596, 1695, +0, 1647, 1695, +0, 1695, 1680, +0, 1695, 1590, +0, 1695, 1432, +0, 1695, 1066, +0, 1828, 0, +0, 1961, 0, +859, 2093, 0, +1469, 2226, 0, +1781, 2358, 0, +2013, 2491, 0, +2207, 2623, 0, +2381, 2755, 0, +2542, 2887, 0, +2694, 3019, 0, +2841, 3152, 0, +2983, 3283, 0, +3123, 3416, 0, +3261, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3667, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1410, 1696, +0, 1422, 1695, +0, 1439, 1693, +0, 1456, 1693, +0, 1479, 1693, +0, 1508, 1693, +0, 1544, 1693, +0, 1588, 1693, +0, 1640, 1693, +0, 1693, 1683, +0, 1693, 1594, +0, 1693, 1439, +0, 1693, 1080, +0, 1827, 0, +0, 1960, 0, +913, 2093, 0, +1484, 2225, 0, +1788, 2358, 0, +2017, 2490, 0, +2210, 2623, 0, +2383, 2755, 0, +2543, 2887, 0, +2695, 3019, 0, +2842, 3152, 0, +2984, 3283, 0, +3124, 3416, 0, +3261, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1390, 1696, +0, 1403, 1695, +0, 1420, 1693, +0, 1442, 1691, +0, 1465, 1691, +0, 1495, 1691, +0, 1532, 1691, +0, 1577, 1691, +0, 1631, 1691, +0, 1691, 1688, +0, 1691, 1600, +0, 1691, 1447, +0, 1691, 1098, +0, 1825, 0, +0, 1959, 0, +977, 2092, 0, +1503, 2225, 0, +1798, 2357, 0, +2023, 2490, 0, +2214, 2622, 0, +2386, 2755, 0, +2545, 2887, 0, +2696, 3019, 0, +2842, 3151, 0, +2985, 3283, 0, +3124, 3416, 0, +3262, 3548, 0, +3398, 3680, 0, +3533, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1362, 1696, +0, 1376, 1695, +0, 1394, 1693, +0, 1417, 1691, +0, 1446, 1689, +0, 1477, 1689, +0, 1515, 1689, +0, 1562, 1689, +0, 1617, 1689, +0, 1683, 1689, +0, 1689, 1608, +0, 1689, 1457, +0, 1689, 1120, +0, 1823, 0, +0, 1958, 0, +1050, 2091, 0, +1527, 2224, 0, +1811, 2357, 0, +2031, 2489, 0, +2219, 2622, 0, +2389, 2755, 0, +2548, 2887, 0, +2698, 3019, 0, +2844, 3151, 0, +2986, 3283, 0, +3125, 3416, 0, +3262, 3548, 0, +3399, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1322, 1696, +0, 1337, 1695, +0, 1357, 1693, +0, 1382, 1691, +0, 1413, 1689, +0, 1452, 1685, +0, 1492, 1685, +0, 1541, 1685, +0, 1599, 1685, +0, 1667, 1685, +0, 1685, 1618, +0, 1685, 1471, +0, 1685, 1149, +0, 1821, 0, +0, 1956, 0, +1133, 2089, 0, +1557, 2223, 0, +1828, 2356, 0, +2041, 2489, 0, +2226, 2621, 0, +2394, 2754, 0, +2551, 2887, 0, +2701, 3019, 0, +2845, 3151, 0, +2987, 3283, 0, +3126, 3416, 0, +3263, 3548, 0, +3399, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 1262, 1696, +0, 1279, 1695, +0, 1302, 1693, +0, 1330, 1691, +0, 1365, 1689, +0, 1408, 1685, +0, 1460, 1681, +0, 1512, 1681, +0, 1574, 1681, +0, 1645, 1681, +0, 1681, 1631, +0, 1681, 1489, +0, 1681, 1184, +0, 1817, 0, +0, 1953, 0, +1224, 2087, 0, +1596, 2221, 0, +1849, 2355, 0, +2055, 2488, 0, +2235, 2621, 0, +2400, 2754, 0, +2555, 2886, 0, +2703, 3018, 0, +2848, 3151, 0, +2988, 3283, 0, +3127, 3415, 0, +3264, 3548, 0, +3400, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 1167, 1696, +0, 1188, 1695, +0, 1216, 1693, +0, 1249, 1691, +0, 1291, 1689, +0, 1341, 1685, +0, 1401, 1681, +0, 1470, 1674, +0, 1537, 1674, +0, 1614, 1674, +0, 1674, 1648, +0, 1674, 1512, +0, 1674, 1228, +0, 1813, 0, +670, 1950, 0, +1322, 2085, 0, +1642, 2220, 0, +1876, 2353, 0, +2072, 2487, 0, +2247, 2620, 0, +2408, 2753, 0, +2561, 2886, 0, +2708, 3018, 0, +2851, 3151, 0, +2991, 3283, 0, +3129, 3415, 0, +3265, 3548, 0, +3401, 3680, 0, +3535, 3812, 0, +3669, 3944, 0, +3802, 4076, 0, +3936, 4095, 0, +0, 998, 1696, +0, 1029, 1695, +0, 1067, 1693, +0, 1113, 1691, +0, 1169, 1689, +0, 1233, 1685, +0, 1308, 1681, +0, 1391, 1674, +608, 1483, 1666, +608, 1569, 1666, +608, 1663, 1666, +608, 1666, 1541, +608, 1666, 1281, +0, 1807, 438, +1007, 1945, 0, +1428, 2082, 0, +1697, 2217, 0, +1910, 2352, 0, +2094, 2486, 0, +2262, 2619, 0, +2419, 2752, 0, +2569, 2885, 0, +2714, 3018, 0, +2855, 3151, 0, +2994, 3283, 0, +3131, 3415, 0, +3267, 3548, 0, +3402, 3680, 0, +3536, 3812, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 580, 1696, +0, 653, 1695, +0, 736, 1693, +0, 827, 1691, +0, 926, 1689, +0, 1031, 1685, +0, 1142, 1681, +0, 1258, 1674, +608, 1378, 1666, +959, 1500, 1654, +959, 1608, 1654, +959, 1654, 1577, +959, 1654, 1343, +742, 1798, 740, +1248, 1939, 0, +1539, 2077, 0, +1762, 2214, 0, +1951, 2349, 0, +2122, 2484, 0, +2281, 2618, 0, +2433, 2751, 0, +2579, 2885, 0, +2721, 3017, 0, +2860, 3150, 0, +2998, 3282, 0, +3134, 3415, 0, +3269, 3547, 0, +3404, 3680, 0, +3537, 3812, 0, +3671, 3944, 0, +3803, 4076, 0, +3937, 4095, 0, +0, 0, 1696, +0, 0, 1695, +0, 0, 1693, +0, 0, 1691, +0, 0, 1689, +0, 406, 1685, +0, 742, 1681, +0, 983, 1674, +608, 1183, 1666, +959, 1360, 1654, +1205, 1522, 1638, +1205, 1638, 1621, +1205, 1638, 1414, +1189, 1787, 1090, +1447, 1930, 872, +1655, 2071, 79, +1836, 2209, 0, +2002, 2346, 0, +2158, 2481, 0, +2306, 2616, 0, +2451, 2750, 0, +2592, 2883, 0, +2731, 3016, 0, +2868, 3150, 0, +3003, 3282, 0, +3138, 3414, 0, +3272, 3547, 0, +3406, 3679, 0, +3539, 3812, 0, +3672, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 0, 1696, +0, 0, 1695, +0, 0, 1693, +0, 0, 1691, +0, 0, 1689, +0, 0, 1685, +0, 0, 1681, +313, 0, 1674, +609, 608, 1666, +959, 1056, 1654, +1205, 1333, 1638, +1407, 1550, 1616, +1407, 1616, 1495, +1466, 1771, 1337, +1624, 1919, 1223, +1774, 2062, 1005, +1920, 2203, 217, +2061, 2341, 0, +2201, 2478, 0, +2338, 2613, 0, +2474, 2748, 0, +2609, 2882, 0, +2743, 3015, 0, +2877, 3149, 0, +3010, 3281, 0, +3143, 3414, 0, +3276, 3547, 0, +3409, 3679, 0, +3541, 3812, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +1056, 0, 1696, +1066, 0, 1695, +1080, 0, 1693, +1098, 0, 1691, +1120, 0, 1689, +1149, 0, 1685, +1184, 0, 1681, +1228, 0, 1674, +1281, 608, 1666, +1343, 959, 1654, +1414, 1205, 1638, +1495, 1407, 1616, +1585, 1585, 1585, +1682, 1748, 1539, +1787, 1903, 1469, +1897, 2051, 1355, +2012, 2194, 1136, +2131, 2335, 345, +2253, 2473, 0, +2377, 2610, 0, +2503, 2746, 0, +2631, 2880, 0, +2759, 3014, 0, +2889, 3148, 0, +3019, 3280, 0, +3150, 3414, 0, +3281, 3546, 0, +3413, 3679, 0, +3544, 3811, 0, +3676, 3944, 0, +3807, 4076, 0, +3939, 4095, 0, +1557, 0, 1828, +1560, 0, 1828, +1565, 0, 1827, +1571, 0, 1825, +1579, 0, 1823, +1590, 0, 1821, +1604, 0, 1817, +1622, 0, 1813, +1644, 0, 1807, +1673, 740, 1798, +1709, 1090, 1787, +1754, 1337, 1771, +1748, 1539, 1682, +1748, 1627, 1539, +1903, 1885, 1469, +2004, 2051, 1355, +2097, 2194, 1136, +2198, 2335, 345, +2305, 2473, 0, +2417, 2610, 0, +2534, 2746, 0, +2654, 2880, 0, +2777, 3014, 0, +2903, 3148, 0, +3029, 3280, 0, +3158, 3414, 0, +3287, 3546, 0, +3417, 3679, 0, +3547, 3811, 0, +3678, 3944, 0, +3809, 4076, 0, +3941, 4095, 0, +1847, 0, 1961, +1849, 0, 1961, +1851, 0, 1960, +1854, 0, 1959, +1859, 0, 1958, +1865, 0, 1956, +1872, 0, 1953, +1882, 0, 1950, +1895, 0, 1945, +1912, 0, 1939, +1930, 872, 1927, +1919, 1223, 1872, +1903, 1469, 1787, +1903, 1469, 1598, +1903, 1678, 1469, +2051, 1973, 1355, +2191, 2194, 1136, +2274, 2335, 345, +2366, 2473, 0, +2466, 2610, 0, +2572, 2746, 0, +2684, 2880, 0, +2800, 3014, 0, +2920, 3148, 0, +3043, 3280, 0, +3168, 3414, 0, +3294, 3546, 0, +3422, 3679, 0, +3552, 3811, 0, +3681, 3944, 0, +3812, 4076, 0, +3942, 4095, 0, +2069, 0, 2094, +2070, 0, 2093, +2071, 0, 2093, +2073, 0, 2092, +2076, 0, 2091, +2080, 0, 2089, +2085, 0, 2087, +2085, 0, 2079, +2082, 0, 2063, +2077, 0, 2041, +2071, 79, 2010, +2062, 1005, 1965, +2051, 1355, 1897, +2051, 1355, 1756, +2051, 1355, 1453, +2051, 1739, 1355, +2194, 2069, 1136, +2335, 2308, 345, +2438, 2473, 0, +2524, 2610, 0, +2619, 2746, 0, +2721, 2880, 0, +2829, 3014, 0, +2942, 3148, 0, +3060, 3280, 0, +3181, 3414, 0, +3304, 3546, 0, +3430, 3679, 0, +3557, 3811, 0, +3685, 3944, 0, +3814, 4076, 0, +3945, 4095, 0, +2226, 0, 2191, +2226, 0, 2190, +2225, 0, 2188, +2225, 0, 2185, +2224, 0, 2181, +2223, 0, 2176, +2221, 0, 2169, +2220, 0, 2159, +2217, 0, 2146, +2214, 0, 2128, +2209, 0, 2102, +2203, 217, 2066, +2194, 1136, 2012, +2194, 1136, 1906, +2194, 1136, 1711, +2194, 1136, 1137, +2194, 1809, 1136, +2335, 2173, 345, +2473, 2423, 0, +2592, 2610, 0, +2674, 2746, 0, +2766, 2880, 0, +2865, 3014, 0, +2970, 3148, 0, +3082, 3280, 0, +3198, 3414, 0, +3317, 3546, 0, +3440, 3679, 0, +3564, 3811, 0, +3691, 3944, 0, +3819, 4076, 0, +3948, 4095, 0, +2358, 0, 2275, +2358, 0, 2273, +2358, 0, 2271, +2357, 0, 2269, +2357, 0, 2266, +2356, 0, 2262, +2355, 0, 2256, +2353, 0, 2248, +2352, 0, 2237, +2349, 0, 2223, +2346, 0, 2202, +2341, 0, 2173, +2335, 345, 2131, +2335, 345, 2052, +2335, 345, 1919, +2335, 345, 1644, +2335, 970, 345, +2335, 1889, 345, +2473, 2282, 0, +2610, 2543, 0, +2740, 2746, 0, +2820, 2880, 0, +2908, 3014, 0, +3005, 3148, 0, +3109, 3280, 0, +3219, 3414, 0, +3334, 3546, 0, +3453, 3679, 0, +3574, 3811, 0, +3699, 3944, 0, +3824, 4076, 0, +3952, 4095, 0, +2491, 0, 2367, +2491, 0, 2366, +2490, 0, 2364, +2490, 0, 2362, +2489, 0, 2360, +2489, 0, 2356, +2488, 0, 2352, +2487, 0, 2345, +2486, 0, 2336, +2484, 0, 2325, +2481, 0, 2308, +2478, 0, 2285, +2473, 0, 2253, +2473, 0, 2194, +2473, 0, 2100, +2473, 0, 1935, +2473, 0, 1535, +2473, 557, 0, +2473, 1977, 0, +2610, 2396, 0, +2746, 2665, 0, +2880, 2877, 0, +2961, 3014, 0, +3049, 3148, 0, +3144, 3280, 0, +3247, 3414, 0, +3355, 3546, 0, +3469, 3679, 0, +3587, 3811, 0, +3708, 3944, 0, +3832, 4076, 0, +3958, 4095, 0, +2623, 0, 2466, +2623, 0, 2465, +2623, 0, 2464, +2622, 0, 2463, +2622, 0, 2460, +2621, 0, 2458, +2621, 0, 2454, +2620, 0, 2449, +2619, 0, 2442, +2618, 0, 2432, +2616, 0, 2420, +2613, 0, 2402, +2610, 0, 2377, +2610, 0, 2333, +2610, 0, 2266, +2610, 0, 2158, +2610, 0, 1956, +2610, 0, 1330, +2610, 0, 0, +2610, 2073, 0, +2746, 2515, 0, +2880, 2789, 0, +3014, 3004, 0, +3100, 3148, 0, +3186, 3280, 0, +3281, 3414, 0, +3382, 3546, 0, +3490, 3679, 0, +3604, 3811, 0, +3721, 3944, 0, +3841, 4076, 0, +3965, 4095, 0, +2755, 0, 2573, +2755, 0, 2572, +2755, 0, 2571, +2755, 0, 2570, +2755, 0, 2568, +2754, 0, 2566, +2754, 0, 2563, +2753, 0, 2559, +2752, 0, 2553, +2751, 0, 2546, +2750, 0, 2536, +2748, 0, 2522, +2746, 0, 2503, +2746, 0, 2470, +2746, 0, 2422, +2746, 0, 2348, +2746, 0, 2226, +2746, 0, 1983, +2746, 0, 678, +2746, 0, 0, +2746, 2177, 0, +2880, 2636, 0, +3014, 2915, 0, +3148, 3133, 0, +3238, 3280, 0, +3323, 3414, 0, +3416, 3546, 0, +3517, 3679, 0, +3625, 3811, 0, +3737, 3944, 0, +3854, 4076, 0, +3975, 4095, 0, +2887, 0, 2684, +2887, 0, 2684, +2887, 0, 2683, +2887, 0, 2682, +2887, 0, 2681, +2887, 0, 2679, +2886, 0, 2677, +2886, 0, 2673, +2885, 0, 2669, +2885, 0, 2664, +2883, 0, 2656, +2882, 0, 2645, +2880, 0, 2631, +2880, 0, 2606, +2880, 0, 2571, +2880, 0, 2519, +2880, 0, 2439, +2880, 0, 2302, +2880, 0, 2016, +2880, 0, 0, +2880, 0, 0, +2880, 2287, 0, +3014, 2759, 0, +3148, 3043, 0, +3280, 3262, 0, +3374, 3414, 0, +3458, 3546, 0, +3551, 3679, 0, +3652, 3811, 0, +3758, 3944, 0, +3871, 4076, 0, +3988, 4095, 0, +3019, 0, 2800, +3019, 0, 2800, +3019, 0, 2799, +3019, 0, 2798, +3019, 0, 2797, +3019, 0, 2796, +3018, 0, 2794, +3018, 0, 2792, +3018, 0, 2789, +3017, 0, 2784, +3016, 0, 2778, +3015, 0, 2770, +3014, 0, 2759, +3014, 0, 2741, +3014, 0, 2715, +3014, 0, 2678, +3014, 0, 2623, +3014, 0, 2536, +3014, 0, 2388, +3014, 0, 2056, +3014, 0, 0, +3014, 0, 0, +3014, 2401, 0, +3148, 2886, 0, +3280, 3172, 0, +3414, 3393, 0, +3509, 3546, 0, +3593, 3679, 0, +3685, 3811, 0, +3785, 3944, 0, +3891, 4076, 0, +4004, 4095, 0, +3152, 0, 2920, +3152, 0, 2920, +3152, 0, 2919, +3151, 0, 2919, +3151, 0, 2918, +3151, 0, 2917, +3151, 0, 2916, +3151, 0, 2914, +3151, 0, 2911, +3150, 0, 2908, +3150, 0, 2904, +3149, 0, 2898, +3148, 0, 2889, +3148, 0, 2875, +3148, 0, 2856, +3148, 0, 2829, +3148, 0, 2790, +3148, 0, 2733, +3148, 0, 2642, +3148, 0, 2482, +3148, 0, 2106, +3148, 0, 0, +3148, 0, 0, +3148, 2520, 0, +3280, 3013, 0, +3414, 3301, 0, +3546, 3523, 0, +3643, 3679, 0, +3727, 3811, 0, +3819, 3944, 0, +3918, 4076, 0, +4025, 4095, 0, +3284, 0, 3043, +3283, 0, 3042, +3283, 0, 3042, +3283, 0, 3042, +3283, 0, 3041, +3283, 0, 3040, +3283, 0, 3039, +3283, 0, 3038, +3283, 0, 3036, +3282, 0, 3033, +3282, 0, 3030, +3281, 0, 3025, +3280, 0, 3019, +3280, 0, 3009, +3280, 0, 2995, +3280, 0, 2975, +3280, 0, 2947, +3280, 0, 2907, +3280, 0, 2847, +3280, 0, 2752, +3280, 0, 2583, +3280, 0, 2164, +3280, 0, 0, +3280, 0, 0, +3280, 2641, 0, +3414, 3142, 0, +3546, 3432, 0, +3679, 3654, 0, +3777, 3811, 0, +3860, 3944, 0, +3952, 4076, 0, +4051, 4095, 0, +3416, 0, 3168, +3416, 0, 3168, +3416, 0, 3167, +3416, 0, 3167, +3416, 0, 3166, +3416, 0, 3166, +3415, 0, 3165, +3415, 0, 3164, +3415, 0, 3163, +3415, 0, 3161, +3414, 0, 3158, +3414, 0, 3155, +3414, 0, 3150, +3414, 0, 3142, +3414, 0, 3132, +3414, 0, 3117, +3414, 0, 3097, +3414, 0, 3069, +3414, 0, 3027, +3414, 0, 2966, +3414, 0, 2867, +3414, 0, 2691, +3414, 0, 2234, +3414, 0, 0, +3414, 0, 0, +3414, 2765, 0, +3546, 3271, 0, +3679, 3563, 0, +3811, 3785, 0, +3910, 3944, 0, +3993, 4076, 0, +4085, 4095, 0, +3548, 0, 3294, +3548, 0, 3294, +3548, 0, 3294, +3548, 0, 3294, +3548, 0, 3293, +3548, 0, 3293, +3548, 0, 3292, +3548, 0, 3292, +3548, 0, 3291, +3547, 0, 3289, +3547, 0, 3287, +3547, 0, 3285, +3546, 0, 3281, +3546, 0, 3275, +3546, 0, 3268, +3546, 0, 3257, +3546, 0, 3242, +3546, 0, 3221, +3546, 0, 3192, +3546, 0, 3151, +3546, 0, 3087, +3546, 0, 2987, +3546, 0, 2804, +3546, 0, 2311, +3546, 0, 0, +3546, 0, 0, +3546, 2891, 0, +3679, 3401, 0, +3811, 3694, 0, +3944, 3917, 0, +4043, 4076, 0, +4095, 4095, 0, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3422, +3680, 0, 3421, +3680, 0, 3421, +3680, 0, 3420, +3680, 0, 3420, +3680, 0, 3418, +3679, 0, 3417, +3679, 0, 3415, +3679, 0, 3413, +3679, 0, 3408, +3679, 0, 3402, +3679, 0, 3394, +3679, 0, 3384, +3679, 0, 3368, +3679, 0, 3348, +3679, 0, 3318, +3679, 0, 3276, +3679, 0, 3212, +3679, 0, 3110, +3679, 0, 2922, +3679, 0, 2400, +3679, 0, 0, +3679, 0, 0, +3679, 3018, 0, +3811, 3532, 0, +3944, 3825, 0, +4076, 4048, 0, +4095, 4095, 0, +3812, 0, 3552, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3551, +3812, 0, 3550, +3812, 0, 3550, +3812, 0, 3549, +3812, 0, 3548, +3812, 0, 3547, +3812, 0, 3546, +3811, 0, 3544, +3811, 0, 3541, +3811, 0, 3536, +3811, 0, 3530, +3811, 0, 3522, +3811, 0, 3511, +3811, 0, 3496, +3811, 0, 3475, +3811, 0, 3446, +3811, 0, 3403, +3811, 0, 3338, +3811, 0, 3234, +3811, 0, 3043, +3811, 0, 2494, +3811, 0, 0, +3811, 0, 0, +3811, 3147, 0, +3944, 3663, 0, +4076, 3956, 0, +4095, 4095, 0, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3681, +3944, 0, 3680, +3944, 0, 3680, +3944, 0, 3680, +3944, 0, 3679, +3944, 0, 3678, +3944, 0, 3677, +3944, 0, 3676, +3944, 0, 3673, +3944, 0, 3670, +3944, 0, 3666, +3944, 0, 3659, +3944, 0, 3651, +3944, 0, 3640, +3944, 0, 3625, +3944, 0, 3604, +3944, 0, 3574, +3944, 0, 3531, +3944, 0, 3466, +3944, 0, 3361, +3944, 0, 3166, +3944, 0, 2596, +3944, 0, 0, +3944, 0, 0, +3944, 3277, 0, +4076, 3794, 0, +4095, 4088, 0, +4076, 0, 3812, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3811, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3810, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3807, +4076, 0, 3805, +4076, 0, 3803, +4076, 0, 3800, +4076, 0, 3795, +4076, 0, 3789, +4076, 0, 3781, +4076, 0, 3770, +4076, 0, 3755, +4076, 0, 3734, +4076, 0, 3703, +4076, 0, 3660, +4076, 0, 3594, +4076, 0, 3488, +4076, 0, 3291, +4076, 0, 2703, +4076, 0, 0, +4076, 0, 0, +4076, 3407, 0, +4095, 3926, 0, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3942, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3939, +4095, 0, 3938, +4095, 0, 3936, +4095, 0, 3934, +4095, 0, 3930, +4095, 0, 3926, +4095, 0, 3920, +4095, 0, 3912, +4095, 0, 3901, +4095, 0, 3885, +4095, 0, 3864, +4095, 0, 3834, +4095, 0, 3790, +4095, 0, 3724, +4095, 0, 3617, +4095, 0, 3419, +4095, 0, 2818, +4095, 0, 0, +4095, 0, 0, +4095, 3538, 0, +0, 1565, 1828, +0, 1572, 1828, +0, 1582, 1828, +0, 1596, 1828, +0, 1612, 1828, +0, 1634, 1828, +0, 1661, 1828, +0, 1696, 1828, +0, 1738, 1828, +0, 1789, 1828, +0, 1828, 1807, +0, 1828, 1716, +0, 1828, 1557, +0, 1828, 1180, +0, 1961, 0, +0, 2094, 0, +907, 2226, 0, +1580, 2358, 0, +1903, 2491, 0, +2138, 2623, 0, +2335, 2755, 0, +2510, 2887, 0, +2672, 3019, 0, +2825, 3152, 0, +2972, 3284, 0, +3115, 3416, 0, +3255, 3548, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1557, 1828, +0, 1566, 1828, +0, 1576, 1828, +0, 1590, 1828, +0, 1607, 1828, +0, 1629, 1828, +0, 1656, 1828, +0, 1691, 1828, +0, 1733, 1828, +0, 1785, 1828, +0, 1828, 1810, +0, 1828, 1719, +0, 1828, 1560, +0, 1828, 1188, +0, 1961, 0, +0, 2093, 0, +944, 2226, 0, +1589, 2358, 0, +1907, 2491, 0, +2141, 2623, 0, +2337, 2755, 0, +2511, 2887, 0, +2672, 3019, 0, +2825, 3152, 0, +2972, 3283, 0, +3115, 3416, 0, +3255, 3548, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1547, 1828, +0, 1556, 1828, +0, 1568, 1827, +0, 1582, 1827, +0, 1599, 1827, +0, 1621, 1827, +0, 1650, 1827, +0, 1684, 1827, +0, 1727, 1827, +0, 1779, 1827, +0, 1827, 1812, +0, 1827, 1722, +0, 1827, 1565, +0, 1827, 1198, +0, 1960, 0, +0, 2093, 0, +990, 2225, 0, +1600, 2358, 0, +1913, 2490, 0, +2144, 2623, 0, +2339, 2755, 0, +2513, 2887, 0, +2673, 3019, 0, +2826, 3152, 0, +2973, 3283, 0, +3115, 3416, 0, +3256, 3548, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1532, 1828, +0, 1542, 1828, +0, 1554, 1827, +0, 1571, 1825, +0, 1588, 1825, +0, 1611, 1825, +0, 1640, 1825, +0, 1676, 1825, +0, 1720, 1825, +0, 1772, 1825, +0, 1825, 1816, +0, 1825, 1727, +0, 1825, 1571, +0, 1825, 1212, +0, 1959, 0, +0, 2092, 0, +1044, 2225, 0, +1615, 2357, 0, +1920, 2490, 0, +2149, 2622, 0, +2342, 2755, 0, +2515, 2887, 0, +2675, 3019, 0, +2827, 3151, 0, +2973, 3283, 0, +3116, 3416, 0, +3256, 3548, 0, +3394, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1512, 1828, +0, 1522, 1828, +0, 1535, 1827, +0, 1552, 1825, +0, 1574, 1823, +0, 1598, 1823, +0, 1627, 1823, +0, 1664, 1823, +0, 1709, 1823, +0, 1763, 1823, +0, 1823, 1821, +0, 1823, 1732, +0, 1823, 1579, +0, 1823, 1230, +0, 1958, 0, +0, 2091, 0, +1108, 2224, 0, +1634, 2357, 0, +1930, 2489, 0, +2155, 2622, 0, +2346, 2755, 0, +2517, 2887, 0, +2677, 3019, 0, +2829, 3151, 0, +2974, 3283, 0, +3117, 3416, 0, +3256, 3548, 0, +3394, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 1484, 1828, +0, 1494, 1828, +0, 1508, 1827, +0, 1526, 1825, +0, 1549, 1823, +0, 1579, 1821, +0, 1609, 1821, +0, 1648, 1821, +0, 1694, 1821, +0, 1750, 1821, +0, 1815, 1821, +0, 1821, 1740, +0, 1821, 1590, +0, 1821, 1253, +0, 1956, 0, +0, 2089, 0, +1181, 2223, 0, +1659, 2356, 0, +1943, 2489, 0, +2163, 2621, 0, +2351, 2754, 0, +2521, 2887, 0, +2679, 3019, 0, +2830, 3151, 0, +2976, 3283, 0, +3118, 3416, 0, +3257, 3548, 0, +3395, 3680, 0, +3531, 3812, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 1442, 1828, +0, 1454, 1828, +0, 1469, 1827, +0, 1489, 1825, +0, 1514, 1823, +0, 1545, 1821, +0, 1585, 1817, +0, 1625, 1817, +0, 1673, 1817, +0, 1732, 1817, +0, 1799, 1817, +0, 1817, 1750, +0, 1817, 1604, +0, 1817, 1281, +0, 1953, 0, +0, 2087, 0, +1264, 2221, 0, +1689, 2355, 0, +1960, 2488, 0, +2173, 2621, 0, +2358, 2754, 0, +2526, 2886, 0, +2683, 3018, 0, +2833, 3151, 0, +2977, 3283, 0, +3119, 3415, 0, +3258, 3548, 0, +3395, 3680, 0, +3531, 3812, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 1381, 1828, +0, 1394, 1828, +0, 1412, 1827, +0, 1434, 1825, +0, 1462, 1823, +0, 1497, 1821, +0, 1540, 1817, +0, 1592, 1813, +0, 1644, 1813, +0, 1706, 1813, +0, 1777, 1813, +0, 1813, 1763, +0, 1813, 1622, +0, 1813, 1317, +0, 1950, 0, +10, 2085, 0, +1355, 2220, 0, +1727, 2353, 0, +1981, 2487, 0, +2187, 2620, 0, +2367, 2753, 0, +2532, 2886, 0, +2687, 3018, 0, +2836, 3151, 0, +2980, 3283, 0, +3121, 3415, 0, +3259, 3548, 0, +3396, 3680, 0, +3532, 3812, 0, +3666, 3944, 0, +3801, 4076, 0, +3934, 4095, 0, +0, 1283, 1828, +0, 1300, 1828, +0, 1321, 1827, +0, 1348, 1825, +0, 1382, 1823, +0, 1423, 1821, +0, 1474, 1817, +0, 1533, 1813, +0, 1602, 1807, +0, 1669, 1807, +0, 1746, 1807, +0, 1807, 1780, +0, 1807, 1644, +0, 1807, 1360, +0, 1945, 37, +800, 2082, 0, +1454, 2217, 0, +1773, 2352, 0, +2008, 2486, 0, +2204, 2619, 0, +2379, 2752, 0, +2540, 2885, 0, +2693, 3018, 0, +2840, 3151, 0, +2983, 3283, 0, +3123, 3415, 0, +3261, 3548, 0, +3397, 3680, 0, +3533, 3812, 0, +3667, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 1106, 1828, +0, 1131, 1828, +0, 1161, 1827, +0, 1199, 1825, +0, 1245, 1823, +0, 1301, 1821, +0, 1366, 1817, +0, 1440, 1813, +0, 1523, 1807, +740, 1615, 1798, +740, 1701, 1798, +740, 1795, 1798, +740, 1798, 1673, +740, 1798, 1413, +0, 1939, 573, +1138, 2077, 0, +1560, 2214, 0, +1829, 2349, 0, +2042, 2484, 0, +2226, 2618, 0, +2394, 2751, 0, +2551, 2885, 0, +2701, 3017, 0, +2846, 3150, 0, +2987, 3282, 0, +3126, 3415, 0, +3263, 3547, 0, +3399, 3680, 0, +3534, 3812, 0, +3668, 3944, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 650, 1828, +0, 713, 1828, +0, 786, 1827, +0, 869, 1825, +0, 960, 1823, +0, 1059, 1821, +0, 1164, 1817, +0, 1275, 1813, +0, 1391, 1807, +740, 1510, 1798, +1090, 1633, 1787, +1090, 1740, 1787, +1090, 1787, 1709, +1090, 1787, 1475, +873, 1930, 872, +1379, 2071, 79, +1671, 2209, 0, +1894, 2346, 0, +2084, 2481, 0, +2255, 2616, 0, +2414, 2750, 0, +2565, 2883, 0, +2711, 3016, 0, +2853, 3150, 0, +2992, 3282, 0, +3130, 3414, 0, +3266, 3547, 0, +3401, 3679, 0, +3536, 3812, 0, +3669, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 0, 1828, +0, 0, 1828, +0, 0, 1827, +0, 0, 1825, +0, 0, 1823, +0, 0, 1821, +0, 536, 1817, +0, 874, 1813, +0, 1115, 1807, +740, 1315, 1798, +1090, 1491, 1787, +1337, 1654, 1771, +1337, 1771, 1754, +1337, 1771, 1546, +1321, 1919, 1223, +1579, 2062, 1005, +1787, 2203, 217, +1968, 2341, 0, +2134, 2478, 0, +2290, 2613, 0, +2439, 2748, 0, +2583, 2882, 0, +2724, 3015, 0, +2863, 3149, 0, +2999, 3281, 0, +3135, 3414, 0, +3270, 3547, 0, +3404, 3679, 0, +3538, 3812, 0, +3671, 3944, 0, +3804, 4076, 0, +3937, 4095, 0, +0, 0, 1828, +0, 0, 1828, +0, 0, 1827, +0, 0, 1825, +0, 0, 1823, +0, 0, 1821, +0, 0, 1817, +0, 0, 1813, +438, 0, 1807, +740, 742, 1798, +1090, 1189, 1787, +1337, 1466, 1771, +1539, 1682, 1748, +1539, 1748, 1627, +1598, 1903, 1469, +1756, 2051, 1355, +1906, 2194, 1136, +2052, 2335, 345, +2194, 2473, 0, +2333, 2610, 0, +2470, 2746, 0, +2606, 2880, 0, +2741, 3014, 0, +2875, 3148, 0, +3009, 3280, 0, +3142, 3414, 0, +3275, 3546, 0, +3408, 3679, 0, +3541, 3811, 0, +3673, 3944, 0, +3805, 4076, 0, +3938, 4095, 0, +1180, 0, 1828, +1188, 0, 1828, +1198, 0, 1827, +1212, 0, 1825, +1230, 0, 1823, +1253, 0, 1821, +1281, 0, 1817, +1317, 0, 1813, +1360, 0, 1807, +1413, 740, 1798, +1475, 1090, 1787, +1546, 1337, 1771, +1627, 1539, 1748, +1717, 1717, 1717, +1814, 1880, 1671, +1919, 2035, 1601, +2029, 2183, 1487, +2144, 2326, 1269, +2263, 2467, 477, +2385, 2605, 0, +2509, 2742, 0, +2636, 2878, 0, +2763, 3012, 0, +2892, 3146, 0, +3021, 3280, 0, +3151, 3413, 0, +3282, 3546, 0, +3413, 3678, 0, +3545, 3811, 0, +3676, 3943, 0, +3808, 4076, 0, +3940, 4095, 0, +1686, 0, 1961, +1689, 0, 1961, +1692, 0, 1960, +1697, 0, 1959, +1703, 0, 1958, +1711, 0, 1956, +1722, 0, 1953, +1736, 0, 1950, +1754, 0, 1945, +1776, 0, 1939, +1805, 872, 1930, +1841, 1223, 1919, +1885, 1469, 1903, +1880, 1671, 1814, +1880, 1759, 1671, +2035, 2017, 1601, +2136, 2183, 1487, +2229, 2326, 1269, +2330, 2467, 477, +2437, 2605, 0, +2550, 2742, 0, +2666, 2878, 0, +2786, 3012, 0, +2910, 3146, 0, +3034, 3280, 0, +3162, 3413, 0, +3290, 3546, 0, +3419, 3678, 0, +3549, 3811, 0, +3679, 3943, 0, +3810, 4076, 0, +3941, 4095, 0, +1977, 0, 2094, +1979, 0, 2093, +1981, 0, 2093, +1983, 0, 2092, +1986, 0, 2091, +1991, 0, 2089, +1996, 0, 2087, +2004, 0, 2085, +2014, 0, 2082, +2027, 0, 2077, +2044, 79, 2071, +2062, 1005, 2059, +2051, 1355, 2004, +2035, 1601, 1919, +2035, 1601, 1730, +2035, 1811, 1601, +2183, 2105, 1487, +2323, 2326, 1269, +2407, 2467, 477, +2498, 2605, 0, +2598, 2742, 0, +2704, 2878, 0, +2816, 3012, 0, +2932, 3146, 0, +3052, 3280, 0, +3175, 3413, 0, +3300, 3546, 0, +3426, 3678, 0, +3554, 3811, 0, +3683, 3943, 0, +3813, 4076, 0, +3944, 4095, 0, +2200, 0, 2226, +2201, 0, 2226, +2202, 0, 2225, +2203, 0, 2225, +2206, 0, 2224, +2208, 0, 2223, +2212, 0, 2221, +2217, 0, 2220, +2217, 0, 2211, +2214, 0, 2195, +2209, 0, 2174, +2203, 217, 2142, +2194, 1136, 2097, +2183, 1487, 2029, +2183, 1487, 1888, +2183, 1487, 1585, +2183, 1871, 1487, +2326, 2202, 1269, +2467, 2440, 477, +2570, 2605, 0, +2656, 2742, 0, +2751, 2878, 0, +2853, 3012, 0, +2961, 3146, 0, +3074, 3280, 0, +3192, 3413, 0, +3313, 3546, 0, +3436, 3678, 0, +3562, 3811, 0, +3689, 3943, 0, +3817, 4076, 0, +3947, 4095, 0, +2358, 0, 2325, +2358, 0, 2324, +2358, 0, 2322, +2357, 0, 2320, +2357, 0, 2317, +2356, 0, 2313, +2355, 0, 2308, +2353, 0, 2301, +2352, 0, 2291, +2349, 0, 2278, +2346, 0, 2260, +2341, 0, 2234, +2335, 345, 2198, +2326, 1269, 2144, +2326, 1269, 2038, +2326, 1269, 1843, +2326, 1269, 1270, +2326, 1941, 1269, +2467, 2305, 477, +2605, 2556, 0, +2724, 2742, 0, +2807, 2878, 0, +2898, 3012, 0, +2997, 3146, 0, +3102, 3280, 0, +3214, 3413, 0, +3330, 3546, 0, +3449, 3678, 0, +3572, 3811, 0, +3697, 3943, 0, +3823, 4076, 0, +3951, 4095, 0, +2491, 0, 2408, +2491, 0, 2407, +2490, 0, 2406, +2490, 0, 2404, +2489, 0, 2401, +2489, 0, 2398, +2488, 0, 2394, +2487, 0, 2388, +2486, 0, 2380, +2484, 0, 2369, +2481, 0, 2355, +2478, 0, 2334, +2473, 0, 2305, +2467, 477, 2263, +2467, 477, 2184, +2467, 477, 2051, +2467, 477, 1776, +2467, 1099, 477, +2467, 2021, 477, +2605, 2414, 0, +2742, 2675, 0, +2872, 2878, 0, +2952, 3012, 0, +3041, 3146, 0, +3138, 3280, 0, +3242, 3413, 0, +3351, 3546, 0, +3466, 3678, 0, +3585, 3811, 0, +3706, 3943, 0, +3830, 4076, 0, +3957, 4095, 0, +2623, 0, 2500, +2623, 0, 2499, +2623, 0, 2498, +2622, 0, 2496, +2622, 0, 2494, +2621, 0, 2492, +2621, 0, 2488, +2620, 0, 2483, +2619, 0, 2477, +2618, 0, 2469, +2616, 0, 2456, +2613, 0, 2440, +2610, 0, 2417, +2605, 0, 2385, +2605, 0, 2326, +2605, 0, 2233, +2605, 0, 2067, +2605, 0, 1667, +2605, 705, 0, +2605, 2109, 0, +2742, 2529, 0, +2878, 2797, 0, +3012, 3009, 0, +3093, 3146, 0, +3180, 3280, 0, +3276, 3413, 0, +3379, 3546, 0, +3488, 3678, 0, +3601, 3811, 0, +3719, 3943, 0, +3840, 4076, 0, +3964, 4095, 0, +2755, 0, 2599, +2755, 0, 2598, +2755, 0, 2598, +2755, 0, 2596, +2755, 0, 2595, +2754, 0, 2593, +2754, 0, 2590, +2753, 0, 2586, +2752, 0, 2581, +2751, 0, 2574, +2750, 0, 2565, +2748, 0, 2552, +2746, 0, 2534, +2742, 0, 2509, +2742, 0, 2465, +2742, 0, 2398, +2742, 0, 2291, +2742, 0, 2089, +2742, 0, 1463, +2742, 0, 0, +2742, 2206, 0, +2878, 2647, 0, +3012, 2921, 0, +3146, 3137, 0, +3233, 3280, 0, +3319, 3413, 0, +3413, 3546, 0, +3515, 3678, 0, +3622, 3811, 0, +3736, 3943, 0, +3853, 4076, 0, +3974, 4095, 0, +2887, 0, 2705, +2887, 0, 2705, +2887, 0, 2704, +2887, 0, 2703, +2887, 0, 2702, +2887, 0, 2700, +2886, 0, 2698, +2886, 0, 2695, +2885, 0, 2691, +2885, 0, 2685, +2883, 0, 2678, +2882, 0, 2668, +2880, 0, 2654, +2878, 0, 2636, +2878, 0, 2602, +2878, 0, 2554, +2878, 0, 2480, +2878, 0, 2358, +2878, 0, 2115, +2878, 0, 817, +2878, 0, 0, +2878, 2309, 0, +3012, 2767, 0, +3146, 3047, 0, +3280, 3265, 0, +3370, 3413, 0, +3455, 3546, 0, +3548, 3678, 0, +3650, 3811, 0, +3757, 3943, 0, +3869, 4076, 0, +3986, 4095, 0, +3019, 0, 2816, +3019, 0, 2816, +3019, 0, 2816, +3019, 0, 2815, +3019, 0, 2814, +3019, 0, 2813, +3018, 0, 2811, +3018, 0, 2808, +3018, 0, 2805, +3017, 0, 2801, +3016, 0, 2796, +3015, 0, 2788, +3014, 0, 2777, +3012, 0, 2763, +3012, 0, 2738, +3012, 0, 2703, +3012, 0, 2651, +3012, 0, 2570, +3012, 0, 2434, +3012, 0, 2148, +3012, 0, 0, +3012, 0, 0, +3012, 2419, 0, +3146, 2892, 0, +3280, 3175, 0, +3413, 3395, 0, +3506, 3546, 0, +3590, 3678, 0, +3683, 3811, 0, +3784, 3943, 0, +3890, 4076, 0, +4003, 4095, 0, +3152, 0, 2933, +3152, 0, 2932, +3152, 0, 2932, +3151, 0, 2932, +3151, 0, 2931, +3151, 0, 2930, +3151, 0, 2928, +3151, 0, 2927, +3151, 0, 2924, +3150, 0, 2921, +3150, 0, 2917, +3149, 0, 2911, +3148, 0, 2903, +3146, 0, 2892, +3146, 0, 2873, +3146, 0, 2847, +3146, 0, 2810, +3146, 0, 2755, +3146, 0, 2669, +3146, 0, 2521, +3146, 0, 2189, +3146, 0, 0, +3146, 0, 0, +3146, 2533, 0, +3280, 3017, 0, +3413, 3304, 0, +3546, 3525, 0, +3641, 3678, 0, +3725, 3811, 0, +3817, 3943, 0, +3917, 4076, 0, +4024, 4095, 0, +3284, 0, 3052, +3283, 0, 3052, +3283, 0, 3052, +3283, 0, 3051, +3283, 0, 3051, +3283, 0, 3050, +3283, 0, 3049, +3283, 0, 3047, +3283, 0, 3046, +3282, 0, 3043, +3282, 0, 3040, +3281, 0, 3035, +3280, 0, 3029, +3280, 0, 3021, +3280, 0, 3007, +3280, 0, 2988, +3280, 0, 2961, +3280, 0, 2922, +3280, 0, 2865, +3280, 0, 2773, +3280, 0, 2613, +3280, 0, 2237, +3280, 0, 0, +3280, 0, 0, +3280, 2651, 0, +3413, 3145, 0, +3546, 3434, 0, +3678, 3655, 0, +3775, 3811, 0, +3859, 3943, 0, +3950, 4076, 0, +4051, 4095, 0, +3416, 0, 3175, +3416, 0, 3175, +3416, 0, 3175, +3416, 0, 3174, +3416, 0, 3174, +3416, 0, 3173, +3415, 0, 3173, +3415, 0, 3171, +3415, 0, 3170, +3415, 0, 3168, +3414, 0, 3165, +3414, 0, 3162, +3414, 0, 3158, +3413, 0, 3151, +3413, 0, 3141, +3413, 0, 3127, +3413, 0, 3107, +3413, 0, 3079, +3413, 0, 3039, +3413, 0, 2979, +3413, 0, 2884, +3413, 0, 2715, +3413, 0, 2298, +3413, 0, 0, +3413, 0, 0, +3413, 2773, 0, +3546, 3274, 0, +3678, 3564, 0, +3811, 3786, 0, +3909, 3943, 0, +3992, 4076, 0, +4084, 4095, 0, +3548, 0, 3300, +3548, 0, 3300, +3548, 0, 3300, +3548, 0, 3299, +3548, 0, 3299, +3548, 0, 3299, +3548, 0, 3298, +3548, 0, 3297, +3548, 0, 3296, +3547, 0, 3295, +3547, 0, 3293, +3547, 0, 3290, +3546, 0, 3287, +3546, 0, 3282, +3546, 0, 3275, +3546, 0, 3264, +3546, 0, 3249, +3546, 0, 3229, +3546, 0, 3201, +3546, 0, 3160, +3546, 0, 3098, +3546, 0, 3000, +3546, 0, 2824, +3546, 0, 2365, +3546, 0, 0, +3546, 0, 0, +3546, 2897, 0, +3678, 3403, 0, +3811, 3695, 0, +3943, 3917, 0, +4042, 4076, 0, +4095, 4095, 0, +3680, 0, 3427, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3426, +3680, 0, 3425, +3680, 0, 3425, +3680, 0, 3424, +3680, 0, 3423, +3679, 0, 3421, +3679, 0, 3419, +3679, 0, 3417, +3678, 0, 3413, +3678, 0, 3407, +3678, 0, 3400, +3678, 0, 3389, +3678, 0, 3374, +3678, 0, 3354, +3678, 0, 3325, +3678, 0, 3282, +3678, 0, 3220, +3678, 0, 3119, +3678, 0, 2936, +3678, 0, 2445, +3678, 0, 0, +3678, 0, 0, +3678, 3023, 0, +3811, 3534, 0, +3943, 3826, 0, +4076, 4049, 0, +4095, 4095, 0, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3554, +3812, 0, 3553, +3812, 0, 3553, +3812, 0, 3552, +3812, 0, 3552, +3812, 0, 3551, +3812, 0, 3549, +3811, 0, 3547, +3811, 0, 3545, +3811, 0, 3540, +3811, 0, 3534, +3811, 0, 3526, +3811, 0, 3516, +3811, 0, 3501, +3811, 0, 3480, +3811, 0, 3450, +3811, 0, 3408, +3811, 0, 3344, +3811, 0, 3241, +3811, 0, 3054, +3811, 0, 2531, +3811, 0, 0, +3811, 0, 0, +3811, 3151, 0, +3943, 3664, 0, +4076, 3957, 0, +4095, 4095, 0, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3683, +3944, 0, 3682, +3944, 0, 3682, +3944, 0, 3681, +3944, 0, 3680, +3944, 0, 3679, +3944, 0, 3678, +3943, 0, 3676, +3943, 0, 3673, +3943, 0, 3668, +3943, 0, 3662, +3943, 0, 3655, +3943, 0, 3644, +3943, 0, 3628, +3943, 0, 3607, +3943, 0, 3578, +3943, 0, 3535, +3943, 0, 3470, +3943, 0, 3366, +3943, 0, 3175, +3943, 0, 2625, +3943, 0, 0, +3943, 0, 0, +3943, 3279, 0, +4076, 3795, 0, +4095, 4089, 0, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3813, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3811, +4076, 0, 3810, +4076, 0, 3809, +4076, 0, 3808, +4076, 0, 3805, +4076, 0, 3802, +4076, 0, 3798, +4076, 0, 3792, +4076, 0, 3784, +4076, 0, 3773, +4076, 0, 3757, +4076, 0, 3736, +4076, 0, 3706, +4076, 0, 3663, +4076, 0, 3597, +4076, 0, 3492, +4076, 0, 3297, +4076, 0, 2726, +4076, 0, 0, +4076, 0, 0, +4076, 3409, 0, +4095, 3927, 0, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3943, +4095, 0, 3943, +4095, 0, 3943, +4095, 0, 3943, +4095, 0, 3942, +4095, 0, 3941, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3938, +4095, 0, 3935, +4095, 0, 3932, +4095, 0, 3927, +4095, 0, 3922, +4095, 0, 3913, +4095, 0, 3903, +4095, 0, 3887, +4095, 0, 3866, +4095, 0, 3836, +4095, 0, 3792, +4095, 0, 3727, +4095, 0, 3621, +4095, 0, 3424, +4095, 0, 2837, +4095, 0, 0, +4095, 0, 0, +4095, 3539, 0, +0, 1696, 1961, +0, 1702, 1961, +0, 1709, 1961, +0, 1719, 1961, +0, 1732, 1961, +0, 1749, 1961, +0, 1770, 1961, +0, 1797, 1961, +0, 1831, 1961, +0, 1873, 1961, +0, 1923, 1961, +0, 1961, 1938, +0, 1961, 1847, +0, 1961, 1686, +0, 1961, 1306, +0, 2094, 0, +0, 2226, 0, +1009, 2358, 0, +1706, 2491, 0, +2032, 2623, 0, +2269, 2755, 0, +2466, 2887, 0, +2641, 3019, 0, +2803, 3152, 0, +2956, 3284, 0, +3104, 3416, 0, +3247, 3548, 0, +3387, 3680, 0, +3525, 3812, 0, +3661, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1690, 1961, +0, 1697, 1961, +0, 1705, 1961, +0, 1715, 1961, +0, 1728, 1961, +0, 1745, 1961, +0, 1766, 1961, +0, 1793, 1961, +0, 1828, 1961, +0, 1870, 1961, +0, 1920, 1961, +0, 1961, 1940, +0, 1961, 1849, +0, 1961, 1689, +0, 1961, 1312, +0, 2093, 0, +0, 2226, 0, +1039, 2358, 0, +1713, 2491, 0, +2035, 2623, 0, +2271, 2755, 0, +2467, 2887, 0, +2642, 3019, 0, +2804, 3152, 0, +2957, 3283, 0, +3104, 3416, 0, +3247, 3548, 0, +3387, 3680, 0, +3525, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1682, 1961, +0, 1689, 1961, +0, 1699, 1960, +0, 1708, 1960, +0, 1722, 1960, +0, 1739, 1960, +0, 1761, 1960, +0, 1789, 1960, +0, 1823, 1960, +0, 1865, 1960, +0, 1917, 1960, +0, 1960, 1941, +0, 1960, 1851, +0, 1960, 1692, +0, 1960, 1320, +0, 2093, 0, +0, 2225, 0, +1076, 2358, 0, +1722, 2490, 0, +2039, 2623, 0, +2274, 2755, 0, +2469, 2887, 0, +2643, 3019, 0, +2805, 3152, 0, +2957, 3283, 0, +3104, 3416, 0, +3247, 3548, 0, +3387, 3680, 0, +3525, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1672, 1961, +0, 1679, 1961, +0, 1688, 1960, +0, 1700, 1959, +0, 1714, 1959, +0, 1731, 1959, +0, 1754, 1959, +0, 1781, 1959, +0, 1817, 1959, +0, 1860, 1959, +0, 1911, 1959, +0, 1959, 1944, +0, 1959, 1854, +0, 1959, 1697, +0, 1959, 1331, +0, 2092, 0, +0, 2225, 0, +1122, 2357, 0, +1733, 2490, 0, +2045, 2622, 0, +2277, 2755, 0, +2471, 2887, 0, +2645, 3019, 0, +2806, 3151, 0, +2958, 3283, 0, +3105, 3416, 0, +3248, 3548, 0, +3388, 3680, 0, +3526, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1657, 1961, +0, 1664, 1961, +0, 1674, 1960, +0, 1686, 1959, +0, 1703, 1958, +0, 1721, 1958, +0, 1743, 1958, +0, 1772, 1958, +0, 1808, 1958, +0, 1852, 1958, +0, 1905, 1958, +0, 1958, 1948, +0, 1958, 1859, +0, 1958, 1703, +0, 1958, 1344, +0, 2091, 0, +0, 2224, 0, +1176, 2357, 0, +1748, 2489, 0, +2052, 2622, 0, +2281, 2755, 0, +2474, 2887, 0, +2647, 3019, 0, +2807, 3151, 0, +2959, 3283, 0, +3106, 3416, 0, +3248, 3548, 0, +3388, 3680, 0, +3526, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1636, 1961, +0, 1644, 1961, +0, 1654, 1960, +0, 1667, 1959, +0, 1684, 1958, +0, 1706, 1956, +0, 1730, 1956, +0, 1759, 1956, +0, 1796, 1956, +0, 1841, 1956, +0, 1895, 1956, +0, 1956, 1953, +0, 1956, 1865, +0, 1956, 1711, +0, 1956, 1362, +0, 2089, 0, +0, 2223, 0, +1240, 2356, 0, +1767, 2489, 0, +2062, 2621, 0, +2287, 2754, 0, +2478, 2887, 0, +2649, 3019, 0, +2809, 3151, 0, +2960, 3283, 0, +3106, 3416, 0, +3249, 3548, 0, +3388, 3680, 0, +3526, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1607, 1961, +0, 1615, 1961, +0, 1626, 1960, +0, 1640, 1959, +0, 1658, 1958, +0, 1681, 1956, +0, 1711, 1953, +0, 1742, 1953, +0, 1779, 1953, +0, 1826, 1953, +0, 1882, 1953, +0, 1947, 1953, +0, 1953, 1872, +0, 1953, 1722, +0, 1953, 1385, +0, 2087, 0, +0, 2221, 0, +1313, 2355, 0, +1791, 2488, 0, +2075, 2621, 0, +2295, 2754, 0, +2483, 2886, 0, +2653, 3018, 0, +2812, 3151, 0, +2962, 3283, 0, +3108, 3415, 0, +3250, 3548, 0, +3389, 3680, 0, +3527, 3812, 0, +3663, 3944, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 1565, 1961, +0, 1574, 1961, +0, 1586, 1960, +0, 1601, 1959, +0, 1621, 1958, +0, 1646, 1956, +0, 1678, 1953, +0, 1716, 1950, +0, 1757, 1950, +0, 1806, 1950, +0, 1864, 1950, +0, 1931, 1950, +0, 1950, 1882, +0, 1950, 1736, +0, 1950, 1413, +0, 2085, 0, +0, 2220, 0, +1396, 2353, 0, +1822, 2487, 0, +2092, 2620, 0, +2305, 2753, 0, +2490, 2886, 0, +2658, 3018, 0, +2815, 3151, 0, +2965, 3283, 0, +3110, 3415, 0, +3251, 3548, 0, +3390, 3680, 0, +3528, 3812, 0, +3663, 3944, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 1503, 1961, +0, 1513, 1961, +0, 1526, 1960, +0, 1544, 1959, +0, 1566, 1958, +0, 1594, 1956, +0, 1629, 1953, +0, 1672, 1950, +0, 1724, 1945, +0, 1776, 1945, +0, 1838, 1945, +0, 1909, 1945, +0, 1945, 1895, +0, 1945, 1754, +0, 1945, 1449, +0, 2082, 0, +140, 2217, 0, +1487, 2352, 0, +1859, 2486, 0, +2113, 2619, 0, +2319, 2752, 0, +2499, 2885, 0, +2664, 3018, 0, +2819, 3151, 0, +2968, 3283, 0, +3112, 3415, 0, +3253, 3548, 0, +3392, 3680, 0, +3528, 3812, 0, +3664, 3944, 0, +3798, 4076, 0, +3933, 4095, 0, +0, 1402, 1961, +0, 1415, 1961, +0, 1431, 1960, +0, 1453, 1959, +0, 1480, 1958, +0, 1514, 1956, +0, 1555, 1953, +0, 1606, 1950, +0, 1665, 1945, +0, 1734, 1939, +0, 1801, 1939, +0, 1878, 1939, +0, 1939, 1912, +0, 1939, 1776, +0, 1939, 1492, +0, 2077, 173, +932, 2214, 0, +1586, 2349, 0, +1906, 2484, 0, +2140, 2618, 0, +2336, 2751, 0, +2511, 2885, 0, +2672, 3017, 0, +2825, 3150, 0, +2972, 3282, 0, +3115, 3415, 0, +3255, 3547, 0, +3393, 3680, 0, +3530, 3812, 0, +3665, 3944, 0, +3799, 4076, 0, +3933, 4095, 0, +0, 1220, 1961, +0, 1238, 1961, +0, 1263, 1960, +0, 1294, 1959, +0, 1332, 1958, +0, 1378, 1956, +0, 1433, 1953, +0, 1498, 1950, +0, 1572, 1945, +0, 1655, 1939, +872, 1748, 1930, +872, 1833, 1930, +872, 1927, 1930, +872, 1930, 1805, +872, 1930, 1545, +79, 2071, 706, +1270, 2209, 0, +1692, 2346, 0, +1961, 2481, 0, +2174, 2616, 0, +2359, 2750, 0, +2526, 2883, 0, +2683, 3016, 0, +2833, 3150, 0, +2977, 3282, 0, +3119, 3414, 0, +3258, 3547, 0, +3395, 3679, 0, +3531, 3812, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 726, 1961, +0, 780, 1961, +0, 844, 1960, +0, 917, 1959, +0, 1000, 1958, +0, 1091, 1956, +0, 1190, 1953, +0, 1295, 1950, +0, 1407, 1945, +0, 1523, 1939, +872, 1642, 1930, +1223, 1765, 1919, +1223, 1872, 1919, +1223, 1919, 1841, +1223, 1919, 1607, +1006, 2062, 1005, +1512, 2203, 217, +1803, 2341, 0, +2026, 2478, 0, +2216, 2613, 0, +2387, 2748, 0, +2546, 2882, 0, +2697, 3015, 0, +2843, 3149, 0, +2985, 3281, 0, +3125, 3414, 0, +3262, 3547, 0, +3398, 3679, 0, +3533, 3812, 0, +3668, 3944, 0, +3801, 4076, 0, +3935, 4095, 0, +0, 0, 1961, +0, 0, 1961, +0, 0, 1960, +0, 0, 1959, +0, 0, 1958, +0, 0, 1956, +0, 0, 1953, +0, 670, 1950, +0, 1007, 1945, +0, 1248, 1939, +872, 1447, 1930, +1223, 1624, 1919, +1469, 1787, 1903, +1469, 1903, 1885, +1469, 1903, 1678, +1453, 2051, 1355, +1711, 2194, 1136, +1919, 2335, 345, +2100, 2473, 0, +2266, 2610, 0, +2422, 2746, 0, +2571, 2880, 0, +2715, 3014, 0, +2856, 3148, 0, +2995, 3280, 0, +3132, 3414, 0, +3268, 3546, 0, +3402, 3679, 0, +3536, 3811, 0, +3670, 3944, 0, +3803, 4076, 0, +3936, 4095, 0, +0, 0, 1961, +0, 0, 1961, +0, 0, 1960, +0, 0, 1959, +0, 0, 1958, +0, 0, 1956, +0, 0, 1953, +0, 0, 1950, +37, 0, 1945, +573, 0, 1939, +872, 873, 1930, +1223, 1321, 1919, +1469, 1598, 1903, +1671, 1814, 1880, +1671, 1880, 1759, +1730, 2035, 1601, +1888, 2183, 1487, +2038, 2326, 1269, +2184, 2467, 477, +2326, 2605, 0, +2465, 2742, 0, +2602, 2878, 0, +2738, 3012, 0, +2873, 3146, 0, +3007, 3280, 0, +3141, 3413, 0, +3275, 3546, 0, +3407, 3678, 0, +3540, 3811, 0, +3673, 3943, 0, +3805, 4076, 0, +3938, 4095, 0, +1306, 0, 1961, +1312, 0, 1961, +1320, 0, 1960, +1331, 0, 1959, +1344, 0, 1958, +1362, 0, 1956, +1385, 0, 1953, +1413, 0, 1950, +1449, 0, 1945, +1492, 0, 1939, +1545, 872, 1930, +1607, 1223, 1919, +1678, 1469, 1903, +1759, 1671, 1880, +1849, 1849, 1849, +1946, 2013, 1803, +2051, 2167, 1733, +2161, 2315, 1619, +2276, 2459, 1401, +2395, 2599, 611, +2517, 2738, 0, +2641, 2874, 0, +2767, 3010, 0, +2895, 3144, 0, +3024, 3278, 0, +3154, 3412, 0, +3284, 3545, 0, +3414, 3678, 0, +3545, 3810, 0, +3677, 3943, 0, +3808, 4075, 0, +3940, 4095, 0, +1816, 0, 2094, +1818, 0, 2093, +1821, 0, 2093, +1824, 0, 2092, +1829, 0, 2091, +1835, 0, 2089, +1843, 0, 2087, +1854, 0, 2085, +1868, 0, 2082, +1886, 0, 2077, +1908, 79, 2071, +1937, 1005, 2062, +1973, 1355, 2051, +2017, 1601, 2035, +2013, 1803, 1946, +2013, 1891, 1803, +2167, 2149, 1733, +2268, 2315, 1619, +2362, 2459, 1401, +2462, 2599, 611, +2569, 2738, 0, +2681, 2874, 0, +2798, 3010, 0, +2919, 3144, 0, +3041, 3278, 0, +3167, 3412, 0, +3294, 3545, 0, +3422, 3678, 0, +3551, 3810, 0, +3681, 3943, 0, +3811, 4075, 0, +3942, 4095, 0, +2108, 0, 2226, +2109, 0, 2226, +2111, 0, 2225, +2112, 0, 2225, +2115, 0, 2224, +2118, 0, 2223, +2123, 0, 2221, +2128, 0, 2220, +2136, 0, 2217, +2146, 0, 2214, +2159, 0, 2209, +2176, 217, 2203, +2194, 1136, 2191, +2183, 1487, 2136, +2167, 1733, 2051, +2167, 1733, 1862, +2167, 1943, 1733, +2315, 2237, 1619, +2455, 2459, 1401, +2538, 2599, 611, +2631, 2738, 0, +2730, 2874, 0, +2836, 3010, 0, +2948, 3144, 0, +3064, 3278, 0, +3184, 3412, 0, +3307, 3545, 0, +3432, 3678, 0, +3559, 3810, 0, +3687, 3943, 0, +3816, 4075, 0, +3945, 4095, 0, +2332, 0, 2358, +2332, 0, 2358, +2333, 0, 2358, +2334, 0, 2357, +2335, 0, 2357, +2338, 0, 2356, +2340, 0, 2355, +2344, 0, 2353, +2349, 0, 2352, +2349, 0, 2343, +2346, 0, 2328, +2341, 0, 2305, +2335, 345, 2274, +2326, 1269, 2229, +2315, 1619, 2161, +2315, 1619, 2020, +2315, 1619, 1718, +2315, 2003, 1619, +2459, 2334, 1401, +2599, 2572, 611, +2702, 2738, 0, +2788, 2874, 0, +2883, 3010, 0, +2985, 3144, 0, +3093, 3278, 0, +3206, 3412, 0, +3324, 3545, 0, +3445, 3678, 0, +3569, 3810, 0, +3694, 3943, 0, +3821, 4075, 0, +3950, 4095, 0, +2491, 0, 2458, +2491, 0, 2457, +2490, 0, 2456, +2490, 0, 2454, +2489, 0, 2452, +2489, 0, 2449, +2488, 0, 2445, +2487, 0, 2440, +2486, 0, 2433, +2484, 0, 2423, +2481, 0, 2410, +2478, 0, 2392, +2473, 0, 2366, +2467, 477, 2330, +2459, 1401, 2276, +2459, 1401, 2171, +2459, 1401, 1976, +2459, 1401, 1403, +2459, 2073, 1401, +2599, 2437, 611, +2738, 2688, 0, +2856, 2874, 0, +2939, 3010, 0, +3030, 3144, 0, +3129, 3278, 0, +3234, 3412, 0, +3346, 3545, 0, +3462, 3678, 0, +3582, 3810, 0, +3704, 3943, 0, +3829, 4075, 0, +3955, 4095, 0, +2623, 0, 2541, +2623, 0, 2540, +2623, 0, 2539, +2622, 0, 2538, +2622, 0, 2536, +2621, 0, 2533, +2621, 0, 2530, +2620, 0, 2526, +2619, 0, 2520, +2618, 0, 2512, +2616, 0, 2501, +2613, 0, 2487, +2610, 0, 2466, +2605, 0, 2437, +2599, 611, 2395, +2599, 611, 2316, +2599, 611, 2183, +2599, 611, 1908, +2599, 1236, 611, +2599, 2153, 611, +2738, 2547, 0, +2874, 2807, 0, +3004, 3010, 0, +3084, 3144, 0, +3173, 3278, 0, +3270, 3412, 0, +3374, 3545, 0, +3483, 3678, 0, +3598, 3810, 0, +3717, 3943, 0, +3838, 4075, 0, +3963, 4095, 0, +2755, 0, 2632, +2755, 0, 2632, +2755, 0, 2631, +2755, 0, 2630, +2755, 0, 2628, +2754, 0, 2627, +2754, 0, 2624, +2753, 0, 2620, +2752, 0, 2616, +2751, 0, 2609, +2750, 0, 2601, +2748, 0, 2589, +2746, 0, 2572, +2742, 0, 2550, +2738, 0, 2517, +2738, 0, 2458, +2738, 0, 2365, +2738, 0, 2200, +2738, 0, 1799, +2738, 817, 0, +2738, 2241, 0, +2874, 2661, 0, +3010, 2928, 0, +3144, 3141, 0, +3225, 3278, 0, +3313, 3412, 0, +3408, 3545, 0, +3511, 3678, 0, +3620, 3810, 0, +3733, 3943, 0, +3851, 4075, 0, +3972, 4095, 0, +2887, 0, 2732, +2887, 0, 2731, +2887, 0, 2731, +2887, 0, 2730, +2887, 0, 2728, +2887, 0, 2727, +2886, 0, 2725, +2886, 0, 2722, +2885, 0, 2718, +2885, 0, 2713, +2883, 0, 2706, +2882, 0, 2697, +2880, 0, 2684, +2878, 0, 2666, +2874, 0, 2641, +2874, 0, 2597, +2874, 0, 2530, +2874, 0, 2423, +2874, 0, 2220, +2874, 0, 1596, +2874, 0, 0, +2874, 2338, 0, +3010, 2778, 0, +3144, 3053, 0, +3278, 3269, 0, +3365, 3412, 0, +3451, 3545, 0, +3545, 3678, 0, +3647, 3810, 0, +3755, 3943, 0, +3868, 4075, 0, +3985, 4095, 0, +3019, 0, 2837, +3019, 0, 2837, +3019, 0, 2836, +3019, 0, 2836, +3019, 0, 2835, +3019, 0, 2834, +3018, 0, 2832, +3018, 0, 2830, +3018, 0, 2827, +3017, 0, 2823, +3016, 0, 2817, +3015, 0, 2810, +3014, 0, 2800, +3012, 0, 2786, +3010, 0, 2767, +3010, 0, 2734, +3010, 0, 2686, +3010, 0, 2612, +3010, 0, 2489, +3010, 0, 2247, +3010, 0, 922, +3010, 0, 0, +3010, 2441, 0, +3144, 2901, 0, +3278, 3180, 0, +3412, 3397, 0, +3502, 3545, 0, +3587, 3678, 0, +3680, 3810, 0, +3781, 3943, 0, +3889, 4075, 0, +4002, 4095, 0, +3152, 0, 2949, +3152, 0, 2949, +3152, 0, 2948, +3151, 0, 2948, +3151, 0, 2947, +3151, 0, 2946, +3151, 0, 2945, +3151, 0, 2943, +3151, 0, 2941, +3150, 0, 2938, +3150, 0, 2933, +3149, 0, 2928, +3148, 0, 2920, +3146, 0, 2910, +3144, 0, 2895, +3144, 0, 2870, +3144, 0, 2835, +3144, 0, 2783, +3144, 0, 2703, +3144, 0, 2566, +3144, 0, 2280, +3144, 0, 0, +3144, 0, 0, +3144, 2551, 0, +3278, 3023, 0, +3412, 3307, 0, +3545, 3526, 0, +3638, 3678, 0, +3722, 3810, 0, +3815, 3943, 0, +3916, 4075, 0, +4023, 4095, 0, +3284, 0, 3065, +3283, 0, 3065, +3283, 0, 3064, +3283, 0, 3064, +3283, 0, 3063, +3283, 0, 3062, +3283, 0, 3062, +3283, 0, 3060, +3283, 0, 3059, +3282, 0, 3056, +3282, 0, 3053, +3281, 0, 3049, +3280, 0, 3043, +3280, 0, 3034, +3278, 0, 3024, +3278, 0, 3005, +3278, 0, 2979, +3278, 0, 2942, +3278, 0, 2886, +3278, 0, 2800, +3278, 0, 2651, +3278, 0, 2320, +3278, 0, 0, +3278, 0, 0, +3278, 2665, 0, +3412, 3150, 0, +3545, 3436, 0, +3678, 3657, 0, +3773, 3810, 0, +3857, 3943, 0, +3949, 4075, 0, +4049, 4095, 0, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3184, +3416, 0, 3183, +3415, 0, 3182, +3415, 0, 3181, +3415, 0, 3180, +3415, 0, 3178, +3414, 0, 3175, +3414, 0, 3172, +3414, 0, 3168, +3413, 0, 3162, +3412, 0, 3154, +3412, 0, 3140, +3412, 0, 3120, +3412, 0, 3093, +3412, 0, 3055, +3412, 0, 2997, +3412, 0, 2906, +3412, 0, 2746, +3412, 0, 2371, +3412, 0, 0, +3412, 0, 0, +3412, 2784, 0, +3545, 3278, 0, +3678, 3566, 0, +3810, 3787, 0, +3907, 3943, 0, +3991, 4075, 0, +4083, 4095, 0, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3307, +3548, 0, 3306, +3548, 0, 3305, +3548, 0, 3305, +3548, 0, 3303, +3547, 0, 3302, +3547, 0, 3300, +3547, 0, 3298, +3546, 0, 3294, +3546, 0, 3290, +3545, 0, 3284, +3545, 0, 3273, +3545, 0, 3259, +3545, 0, 3239, +3545, 0, 3211, +3545, 0, 3171, +3545, 0, 3111, +3545, 0, 3016, +3545, 0, 2848, +3545, 0, 2429, +3545, 0, 0, +3545, 0, 0, +3545, 2905, 0, +3678, 3406, 0, +3810, 3696, 0, +3943, 3918, 0, +4041, 4075, 0, +4095, 4095, 0, +3680, 0, 3432, +3680, 0, 3432, +3680, 0, 3432, +3680, 0, 3432, +3680, 0, 3431, +3680, 0, 3431, +3680, 0, 3431, +3680, 0, 3430, +3680, 0, 3429, +3680, 0, 3428, +3679, 0, 3427, +3679, 0, 3425, +3679, 0, 3422, +3678, 0, 3419, +3678, 0, 3414, +3678, 0, 3407, +3678, 0, 3396, +3678, 0, 3381, +3678, 0, 3361, +3678, 0, 3333, +3678, 0, 3291, +3678, 0, 3230, +3678, 0, 3132, +3678, 0, 2955, +3678, 0, 2499, +3678, 0, 0, +3678, 0, 0, +3678, 3029, 0, +3810, 3536, 0, +3943, 3827, 0, +4075, 4049, 0, +4095, 4095, 0, +3812, 0, 3559, +3812, 0, 3559, +3812, 0, 3559, +3812, 0, 3558, +3812, 0, 3558, +3812, 0, 3558, +3812, 0, 3558, +3812, 0, 3557, +3812, 0, 3557, +3812, 0, 3556, +3812, 0, 3555, +3812, 0, 3553, +3811, 0, 3552, +3811, 0, 3549, +3810, 0, 3545, +3810, 0, 3540, +3810, 0, 3532, +3810, 0, 3521, +3810, 0, 3506, +3810, 0, 3486, +3810, 0, 3457, +3810, 0, 3415, +3810, 0, 3352, +3810, 0, 3251, +3810, 0, 3069, +3810, 0, 2576, +3810, 0, 0, +3810, 0, 0, +3810, 3155, 0, +3943, 3665, 0, +4075, 3958, 0, +4095, 4095, 0, +3944, 0, 3687, +3944, 0, 3687, +3944, 0, 3687, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3686, +3944, 0, 3685, +3944, 0, 3685, +3944, 0, 3684, +3944, 0, 3683, +3944, 0, 3681, +3943, 0, 3679, +3943, 0, 3677, +3943, 0, 3672, +3943, 0, 3666, +3943, 0, 3659, +3943, 0, 3648, +3943, 0, 3632, +3943, 0, 3612, +3943, 0, 3583, +3943, 0, 3540, +3943, 0, 3476, +3943, 0, 3374, +3943, 0, 3186, +3943, 0, 2662, +3943, 0, 0, +3943, 0, 0, +3943, 3283, 0, +4075, 3796, 0, +4095, 4089, 0, +4076, 0, 3816, +4076, 0, 3816, +4076, 0, 3816, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3815, +4076, 0, 3814, +4076, 0, 3814, +4076, 0, 3813, +4076, 0, 3812, +4076, 0, 3812, +4076, 0, 3810, +4075, 0, 3808, +4075, 0, 3805, +4075, 0, 3801, +4075, 0, 3795, +4075, 0, 3787, +4075, 0, 3776, +4075, 0, 3760, +4075, 0, 3739, +4075, 0, 3710, +4075, 0, 3667, +4075, 0, 3602, +4075, 0, 3498, +4075, 0, 3306, +4075, 0, 2756, +4075, 0, 0, +4075, 0, 0, +4075, 3411, 0, +4095, 3927, 0, +4095, 0, 3946, +4095, 0, 3946, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3945, +4095, 0, 3944, +4095, 0, 3944, +4095, 0, 3943, +4095, 0, 3942, +4095, 0, 3941, +4095, 0, 3940, +4095, 0, 3937, +4095, 0, 3934, +4095, 0, 3930, +4095, 0, 3924, +4095, 0, 3916, +4095, 0, 3905, +4095, 0, 3889, +4095, 0, 3868, +4095, 0, 3838, +4095, 0, 3795, +4095, 0, 3730, +4095, 0, 3625, +4095, 0, 3430, +4095, 0, 2861, +4095, 0, 0, +4095, 0, 0, +4095, 3541, 0, +0, 1827, 2094, +0, 1831, 2094, +0, 1837, 2094, +0, 1845, 2094, +0, 1855, 2094, +0, 1867, 2094, +0, 1884, 2094, +0, 1905, 2094, +0, 1932, 2094, +0, 1966, 2094, +0, 2007, 2094, +0, 2058, 2094, +0, 2094, 2069, +0, 2094, 1977, +0, 2094, 1816, +0, 2094, 1433, +0, 2226, 0, +0, 2358, 0, +1120, 2491, 0, +1833, 2623, 0, +2162, 2755, 0, +2400, 2887, 0, +2597, 3019, 0, +2773, 3152, 0, +2935, 3284, 0, +3088, 3416, 0, +3236, 3548, 0, +3379, 3680, 0, +3519, 3812, 0, +3657, 3944, 0, +3793, 4076, 0, +3929, 4095, 0, +0, 1823, 2094, +0, 1828, 2093, +0, 1834, 2093, +0, 1841, 2093, +0, 1851, 2093, +0, 1864, 2093, +0, 1881, 2093, +0, 1902, 2093, +0, 1929, 2093, +0, 1963, 2093, +0, 2005, 2093, +0, 2056, 2093, +0, 2093, 2070, +0, 2093, 1979, +0, 2093, 1818, +0, 2093, 1438, +0, 2226, 0, +0, 2358, 0, +1143, 2491, 0, +1838, 2623, 0, +2164, 2755, 0, +2401, 2887, 0, +2598, 3019, 0, +2773, 3152, 0, +2935, 3283, 0, +3088, 3416, 0, +3236, 3548, 0, +3379, 3680, 0, +3519, 3812, 0, +3657, 3944, 0, +3793, 4076, 0, +3929, 4095, 0, +0, 1817, 2094, +0, 1822, 2093, +0, 1829, 2093, +0, 1837, 2093, +0, 1847, 2093, +0, 1860, 2093, +0, 1877, 2093, +0, 1898, 2093, +0, 1926, 2093, +0, 1960, 2093, +0, 2002, 2093, +0, 2053, 2093, +0, 2093, 2071, +0, 2093, 1981, +0, 2093, 1821, +0, 2093, 1444, +0, 2225, 0, +0, 2358, 0, +1173, 2490, 0, +1845, 2623, 0, +2167, 2755, 0, +2403, 2887, 0, +2599, 3019, 0, +2774, 3152, 0, +2936, 3283, 0, +3089, 3416, 0, +3236, 3548, 0, +3379, 3680, 0, +3519, 3812, 0, +3657, 3944, 0, +3793, 4076, 0, +3929, 4095, 0, +0, 1809, 2094, +0, 1814, 2093, +0, 1821, 2093, +0, 1830, 2092, +0, 1841, 2092, +0, 1854, 2092, +0, 1871, 2092, +0, 1893, 2092, +0, 1920, 2092, +0, 1955, 2092, +0, 1997, 2092, +0, 2049, 2092, +0, 2092, 2073, +0, 2092, 1983, +0, 2092, 1824, +0, 2092, 1452, +0, 2225, 0, +0, 2357, 0, +1210, 2490, 0, +1853, 2622, 0, +2172, 2755, 0, +2406, 2887, 0, +2601, 3019, 0, +2775, 3151, 0, +2936, 3283, 0, +3089, 3416, 0, +3237, 3548, 0, +3379, 3680, 0, +3520, 3812, 0, +3657, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1798, 2094, +0, 1804, 2093, +0, 1811, 2093, +0, 1820, 2092, +0, 1832, 2091, +0, 1846, 2091, +0, 1863, 2091, +0, 1885, 2091, +0, 1913, 2091, +0, 1949, 2091, +0, 1992, 2091, +0, 2044, 2091, +0, 2091, 2076, +0, 2091, 1986, +0, 2091, 1829, +0, 2091, 1463, +0, 2224, 0, +0, 2357, 0, +1255, 2489, 0, +1865, 2622, 0, +2177, 2755, 0, +2409, 2887, 0, +2603, 3019, 0, +2777, 3151, 0, +2938, 3283, 0, +3090, 3416, 0, +3237, 3548, 0, +3380, 3680, 0, +3520, 3812, 0, +3658, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1783, 2094, +0, 1789, 2093, +0, 1796, 2093, +0, 1806, 2092, +0, 1819, 2091, +0, 1835, 2089, +0, 1853, 2089, +0, 1875, 2089, +0, 1904, 2089, +0, 1940, 2089, +0, 1984, 2089, +0, 2037, 2089, +0, 2089, 2080, +0, 2089, 1991, +0, 2089, 1835, +0, 2089, 1476, +0, 2223, 0, +0, 2356, 0, +1310, 2489, 0, +1880, 2621, 0, +2185, 2754, 0, +2413, 2887, 0, +2606, 3019, 0, +2779, 3151, 0, +2939, 3283, 0, +3091, 3416, 0, +3238, 3548, 0, +3380, 3680, 0, +3520, 3812, 0, +3658, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1763, 2094, +0, 1768, 2093, +0, 1776, 2093, +0, 1786, 2092, +0, 1799, 2091, +0, 1816, 2089, +0, 1838, 2087, +0, 1862, 2087, +0, 1891, 2087, +0, 1928, 2087, +0, 1973, 2087, +0, 2027, 2087, +0, 2087, 2085, +0, 2087, 1996, +0, 2087, 1843, +0, 2087, 1494, +0, 2221, 0, +0, 2355, 0, +1373, 2488, 0, +1899, 2621, 0, +2195, 2754, 0, +2419, 2886, 0, +2610, 3018, 0, +2782, 3151, 0, +2941, 3283, 0, +3093, 3415, 0, +3239, 3548, 0, +3381, 3680, 0, +3521, 3812, 0, +3658, 3944, 0, +3794, 4076, 0, +3930, 4095, 0, +0, 1733, 2094, +0, 1739, 2093, +0, 1748, 2093, +0, 1758, 2092, +0, 1772, 2091, +0, 1790, 2089, +0, 1813, 2087, +0, 1843, 2085, +0, 1873, 2085, +0, 1912, 2085, +0, 1958, 2085, +0, 2014, 2085, +0, 2079, 2085, +0, 2085, 2004, +0, 2085, 1854, +0, 2085, 1517, +0, 2220, 0, +0, 2353, 0, +1446, 2487, 0, +1923, 2620, 0, +2208, 2753, 0, +2427, 2886, 0, +2615, 3018, 0, +2785, 3151, 0, +2943, 3283, 0, +3094, 3415, 0, +3240, 3548, 0, +3382, 3680, 0, +3521, 3812, 0, +3659, 3944, 0, +3795, 4076, 0, +3930, 4095, 0, +0, 1691, 2094, +0, 1698, 2093, +0, 1706, 2093, +0, 1718, 2092, +0, 1733, 2091, +0, 1753, 2089, +0, 1778, 2087, +0, 1810, 2085, +0, 1849, 2082, +0, 1889, 2082, +0, 1938, 2082, +0, 1996, 2082, +0, 2063, 2082, +0, 2082, 2014, +0, 2082, 1868, +0, 2082, 1545, +0, 2217, 0, +0, 2352, 0, +1529, 2486, 0, +1954, 2619, 0, +2224, 2752, 0, +2438, 2885, 0, +2622, 3018, 0, +2790, 3151, 0, +2947, 3283, 0, +3097, 3415, 0, +3242, 3548, 0, +3383, 3680, 0, +3522, 3812, 0, +3659, 3944, 0, +3795, 4076, 0, +3930, 4095, 0, +0, 1626, 2094, +0, 1635, 2093, +0, 1645, 2093, +0, 1658, 2092, +0, 1676, 2091, +0, 1698, 2089, +0, 1726, 2087, +0, 1761, 2085, +0, 1804, 2082, +0, 1856, 2077, +0, 1908, 2077, +0, 1970, 2077, +0, 2041, 2077, +0, 2077, 2027, +0, 2077, 1886, +0, 2077, 1581, +0, 2214, 0, +275, 2349, 0, +1620, 2484, 0, +1991, 2618, 0, +2245, 2751, 0, +2451, 2885, 0, +2631, 3017, 0, +2796, 3150, 0, +2951, 3282, 0, +3100, 3415, 0, +3244, 3547, 0, +3385, 3680, 0, +3523, 3812, 0, +3661, 3944, 0, +3796, 4076, 0, +3931, 4095, 0, +0, 1524, 2094, +0, 1534, 2093, +0, 1547, 2093, +0, 1564, 2092, +0, 1585, 2091, +0, 1612, 2089, +0, 1646, 2087, +0, 1687, 2085, +0, 1738, 2082, +0, 1797, 2077, +79, 1866, 2071, +79, 1934, 2071, +79, 2010, 2071, +79, 2071, 2044, +79, 2071, 1908, +79, 2071, 1625, +0, 2209, 303, +1064, 2346, 0, +1719, 2481, 0, +2038, 2616, 0, +2273, 2750, 0, +2469, 2883, 0, +2643, 3016, 0, +2804, 3150, 0, +2957, 3282, 0, +3104, 3414, 0, +3247, 3547, 0, +3387, 3679, 0, +3525, 3812, 0, +3662, 3944, 0, +3797, 4076, 0, +3932, 4095, 0, +0, 1336, 2094, +0, 1351, 2093, +0, 1370, 2093, +0, 1394, 2092, +0, 1425, 2091, +0, 1463, 2089, +0, 1509, 2087, +0, 1565, 2085, +0, 1630, 2082, +0, 1704, 2077, +79, 1787, 2071, +1005, 1880, 2062, +1005, 1965, 2062, +1005, 2059, 2062, +1005, 2062, 1937, +1005, 2062, 1677, +217, 2203, 838, +1403, 2341, 0, +1824, 2478, 0, +2093, 2613, 0, +2306, 2748, 0, +2491, 2882, 0, +2658, 3015, 0, +2815, 3149, 0, +2965, 3281, 0, +3110, 3414, 0, +3251, 3547, 0, +3390, 3679, 0, +3528, 3812, 0, +3663, 3944, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 814, 2094, +0, 859, 2093, +0, 913, 2093, +0, 977, 2092, +0, 1050, 2091, +0, 1133, 2089, +0, 1224, 2087, +0, 1322, 2085, +0, 1428, 2082, +0, 1539, 2077, +79, 1655, 2071, +1005, 1774, 2062, +1355, 1897, 2051, +1355, 2004, 2051, +1355, 2051, 1973, +1355, 2051, 1739, +1137, 2194, 1136, +1644, 2335, 345, +1935, 2473, 0, +2158, 2610, 0, +2348, 2746, 0, +2519, 2880, 0, +2678, 3014, 0, +2829, 3148, 0, +2975, 3280, 0, +3117, 3414, 0, +3257, 3546, 0, +3394, 3679, 0, +3530, 3811, 0, +3666, 3944, 0, +3800, 4076, 0, +3934, 4095, 0, +0, 0, 2094, +0, 0, 2093, +0, 0, 2093, +0, 0, 2092, +0, 0, 2091, +0, 0, 2089, +0, 0, 2087, +0, 10, 2085, +0, 800, 2082, +0, 1138, 2077, +79, 1379, 2071, +1005, 1579, 2062, +1355, 1756, 2051, +1601, 1919, 2035, +1601, 2035, 2017, +1601, 2035, 1811, +1585, 2183, 1487, +1843, 2326, 1269, +2051, 2467, 477, +2233, 2605, 0, +2398, 2742, 0, +2554, 2878, 0, +2703, 3012, 0, +2847, 3146, 0, +2988, 3280, 0, +3127, 3413, 0, +3264, 3546, 0, +3400, 3678, 0, +3534, 3811, 0, +3668, 3943, 0, +3802, 4076, 0, +3935, 4095, 0, +0, 0, 2094, +0, 0, 2093, +0, 0, 2093, +0, 0, 2092, +0, 0, 2091, +0, 0, 2089, +0, 0, 2087, +0, 0, 2085, +0, 0, 2082, +173, 0, 2077, +706, 79, 2071, +1005, 1006, 2062, +1355, 1453, 2051, +1601, 1730, 2035, +1803, 1946, 2013, +1803, 2013, 1891, +1862, 2167, 1733, +2020, 2315, 1619, +2171, 2459, 1401, +2316, 2599, 611, +2458, 2738, 0, +2597, 2874, 0, +2734, 3010, 0, +2870, 3144, 0, +3005, 3278, 0, +3140, 3412, 0, +3273, 3545, 0, +3407, 3678, 0, +3540, 3810, 0, +3672, 3943, 0, +3805, 4075, 0, +3937, 4095, 0, +1433, 0, 2094, +1438, 0, 2093, +1444, 0, 2093, +1452, 0, 2092, +1463, 0, 2091, +1476, 0, 2089, +1494, 0, 2087, +1517, 0, 2085, +1545, 0, 2082, +1581, 0, 2077, +1625, 79, 2071, +1677, 1005, 2062, +1739, 1355, 2051, +1811, 1601, 2035, +1891, 1803, 2013, +1981, 1981, 1981, +2078, 2145, 1935, +2183, 2299, 1865, +2293, 2447, 1751, +2408, 2591, 1533, +2527, 2731, 738, +2649, 2870, 0, +2773, 3006, 0, +2900, 3142, 0, +3027, 3276, 0, +3156, 3410, 0, +3285, 3544, 0, +3416, 3677, 0, +3547, 3810, 0, +3677, 3943, 0, +3809, 4075, 0, +3940, 4095, 0, +1946, 0, 2226, +1948, 0, 2226, +1950, 0, 2225, +1953, 0, 2225, +1956, 0, 2224, +1961, 0, 2223, +1967, 0, 2221, +1975, 0, 2220, +1986, 0, 2217, +2000, 0, 2214, +2018, 0, 2209, +2041, 217, 2203, +2069, 1136, 2194, +2105, 1487, 2183, +2149, 1733, 2167, +2145, 1935, 2078, +2145, 2023, 1935, +2299, 2281, 1865, +2401, 2447, 1751, +2493, 2591, 1533, +2594, 2731, 738, +2701, 2870, 0, +2813, 3006, 0, +2931, 3142, 0, +3050, 3276, 0, +3174, 3410, 0, +3299, 3544, 0, +3426, 3677, 0, +3554, 3810, 0, +3683, 3943, 0, +3813, 4075, 0, +3944, 4095, 0, +2239, 0, 2358, +2240, 0, 2358, +2241, 0, 2358, +2243, 0, 2357, +2245, 0, 2357, +2247, 0, 2356, +2251, 0, 2355, +2255, 0, 2353, +2261, 0, 2352, +2268, 0, 2349, +2278, 0, 2346, +2291, 0, 2341, +2308, 345, 2335, +2326, 1269, 2323, +2315, 1619, 2268, +2299, 1865, 2183, +2299, 1865, 1994, +2299, 2075, 1865, +2447, 2370, 1751, +2587, 2591, 1533, +2671, 2731, 738, +2763, 2870, 0, +2862, 3006, 0, +2969, 3142, 0, +3080, 3276, 0, +3196, 3410, 0, +3316, 3544, 0, +3439, 3677, 0, +3564, 3810, 0, +3691, 3943, 0, +3818, 4075, 0, +3948, 4095, 0, +2463, 0, 2491, +2464, 0, 2491, +2464, 0, 2490, +2465, 0, 2490, +2466, 0, 2489, +2468, 0, 2489, +2470, 0, 2488, +2473, 0, 2487, +2476, 0, 2486, +2481, 0, 2484, +2481, 0, 2475, +2478, 0, 2460, +2473, 0, 2438, +2467, 477, 2407, +2459, 1401, 2362, +2447, 1751, 2293, +2447, 1751, 2152, +2447, 1751, 1850, +2447, 2135, 1751, +2591, 2466, 1533, +2731, 2705, 738, +2834, 2870, 0, +2920, 3006, 0, +3015, 3142, 0, +3117, 3276, 0, +3225, 3410, 0, +3339, 3544, 0, +3456, 3677, 0, +3577, 3810, 0, +3701, 3943, 0, +3826, 4075, 0, +3953, 4095, 0, +2623, 0, 2590, +2623, 0, 2590, +2623, 0, 2589, +2622, 0, 2588, +2622, 0, 2586, +2621, 0, 2584, +2621, 0, 2581, +2620, 0, 2577, +2619, 0, 2572, +2618, 0, 2565, +2616, 0, 2555, +2613, 0, 2542, +2610, 0, 2524, +2605, 0, 2498, +2599, 611, 2462, +2591, 1533, 2408, +2591, 1533, 2303, +2591, 1533, 2108, +2591, 1533, 1533, +2591, 2206, 1533, +2731, 2570, 738, +2870, 2820, 0, +2988, 3006, 0, +3071, 3142, 0, +3162, 3276, 0, +3261, 3410, 0, +3367, 3544, 0, +3478, 3677, 0, +3594, 3810, 0, +3713, 3943, 0, +3836, 4075, 0, +3961, 4095, 0, +2755, 0, 2673, +2755, 0, 2673, +2755, 0, 2672, +2755, 0, 2671, +2755, 0, 2670, +2754, 0, 2668, +2754, 0, 2666, +2753, 0, 2662, +2752, 0, 2658, +2751, 0, 2652, +2750, 0, 2645, +2748, 0, 2634, +2746, 0, 2619, +2742, 0, 2598, +2738, 0, 2569, +2731, 738, 2527, +2731, 738, 2448, +2731, 738, 2315, +2731, 738, 2040, +2731, 1362, 738, +2731, 2285, 738, +2870, 2678, 0, +3006, 2939, 0, +3136, 3142, 0, +3216, 3276, 0, +3305, 3410, 0, +3402, 3544, 0, +3506, 3677, 0, +3616, 3810, 0, +3730, 3943, 0, +3849, 4075, 0, +3971, 4095, 0, +2887, 0, 2765, +2887, 0, 2764, +2887, 0, 2764, +2887, 0, 2763, +2887, 0, 2762, +2887, 0, 2761, +2886, 0, 2759, +2886, 0, 2756, +2885, 0, 2752, +2885, 0, 2748, +2883, 0, 2741, +2882, 0, 2733, +2880, 0, 2721, +2878, 0, 2704, +2874, 0, 2681, +2870, 0, 2649, +2870, 0, 2590, +2870, 0, 2497, +2870, 0, 2332, +2870, 0, 1932, +2870, 963, 0, +2870, 2374, 0, +3006, 2792, 0, +3142, 3061, 0, +3276, 3273, 0, +3358, 3410, 0, +3445, 3544, 0, +3540, 3677, 0, +3643, 3810, 0, +3752, 3943, 0, +3865, 4075, 0, +3983, 4095, 0, +3019, 0, 2864, +3019, 0, 2863, +3019, 0, 2863, +3019, 0, 2863, +3019, 0, 2862, +3019, 0, 2860, +3018, 0, 2859, +3018, 0, 2857, +3018, 0, 2854, +3017, 0, 2850, +3016, 0, 2845, +3015, 0, 2838, +3014, 0, 2829, +3012, 0, 2816, +3010, 0, 2798, +3006, 0, 2773, +3006, 0, 2729, +3006, 0, 2662, +3006, 0, 2554, +3006, 0, 2352, +3006, 0, 1723, +3006, 0, 0, +3006, 2470, 0, +3142, 2911, 0, +3276, 3185, 0, +3410, 3401, 0, +3497, 3544, 0, +3583, 3677, 0, +3677, 3810, 0, +3779, 3943, 0, +3887, 4075, 0, +4000, 4095, 0, +3152, 0, 2970, +3152, 0, 2970, +3152, 0, 2969, +3151, 0, 2969, +3151, 0, 2968, +3151, 0, 2967, +3151, 0, 2966, +3151, 0, 2964, +3151, 0, 2962, +3150, 0, 2959, +3150, 0, 2955, +3149, 0, 2950, +3148, 0, 2942, +3146, 0, 2932, +3144, 0, 2919, +3142, 0, 2900, +3142, 0, 2867, +3142, 0, 2818, +3142, 0, 2744, +3142, 0, 2622, +3142, 0, 2379, +3142, 0, 1068, +3142, 0, 0, +3142, 2573, 0, +3276, 3032, 0, +3410, 3311, 0, +3544, 3529, 0, +3634, 3677, 0, +3719, 3810, 0, +3813, 3943, 0, +3913, 4075, 0, +4021, 4095, 0, +3284, 0, 3081, +3283, 0, 3081, +3283, 0, 3081, +3283, 0, 3080, +3283, 0, 3080, +3283, 0, 3079, +3283, 0, 3078, +3283, 0, 3077, +3283, 0, 3075, +3282, 0, 3073, +3282, 0, 3070, +3281, 0, 3065, +3280, 0, 3060, +3280, 0, 3052, +3278, 0, 3041, +3276, 0, 3027, +3276, 0, 3002, +3276, 0, 2967, +3276, 0, 2915, +3276, 0, 2834, +3276, 0, 2698, +3276, 0, 2411, +3276, 0, 0, +3276, 0, 0, +3276, 2683, 0, +3410, 3156, 0, +3544, 3440, 0, +3677, 3659, 0, +3770, 3810, 0, +3854, 3943, 0, +3947, 4075, 0, +4048, 4095, 0, +3416, 0, 3197, +3416, 0, 3197, +3416, 0, 3197, +3416, 0, 3196, +3416, 0, 3196, +3416, 0, 3196, +3415, 0, 3195, +3415, 0, 3194, +3415, 0, 3192, +3415, 0, 3191, +3414, 0, 3188, +3414, 0, 3185, +3414, 0, 3181, +3413, 0, 3175, +3412, 0, 3167, +3410, 0, 3156, +3410, 0, 3137, +3410, 0, 3111, +3410, 0, 3074, +3410, 0, 3019, +3410, 0, 2933, +3410, 0, 2784, +3410, 0, 2453, +3410, 0, 0, +3410, 0, 0, +3410, 2797, 0, +3544, 3282, 0, +3677, 3568, 0, +3810, 3789, 0, +3905, 3943, 0, +3989, 4075, 0, +4082, 4095, 0, +3548, 0, 3317, +3548, 0, 3317, +3548, 0, 3317, +3548, 0, 3316, +3548, 0, 3316, +3548, 0, 3316, +3548, 0, 3315, +3548, 0, 3314, +3548, 0, 3313, +3547, 0, 3312, +3547, 0, 3310, +3547, 0, 3307, +3546, 0, 3304, +3546, 0, 3300, +3545, 0, 3294, +3544, 0, 3285, +3544, 0, 3272, +3544, 0, 3253, +3544, 0, 3225, +3544, 0, 3186, +3544, 0, 3129, +3544, 0, 3038, +3544, 0, 2879, +3544, 0, 2502, +3544, 0, 0, +3544, 0, 0, +3544, 2916, 0, +3677, 3410, 0, +3810, 3698, 0, +3943, 3920, 0, +4039, 4075, 0, +4095, 4095, 0, +3680, 0, 3440, +3680, 0, 3439, +3680, 0, 3439, +3680, 0, 3439, +3680, 0, 3439, +3680, 0, 3438, +3680, 0, 3438, +3680, 0, 3437, +3680, 0, 3437, +3680, 0, 3436, +3679, 0, 3434, +3679, 0, 3432, +3679, 0, 3430, +3678, 0, 3426, +3678, 0, 3422, +3677, 0, 3416, +3677, 0, 3405, +3677, 0, 3391, +3677, 0, 3371, +3677, 0, 3344, +3677, 0, 3303, +3677, 0, 3243, +3677, 0, 3149, +3677, 0, 2980, +3677, 0, 2562, +3677, 0, 0, +3677, 0, 0, +3677, 3037, 0, +3810, 3538, 0, +3943, 3828, 0, +4075, 4050, 0, +4095, 4095, 0, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3564, +3812, 0, 3563, +3812, 0, 3563, +3812, 0, 3562, +3812, 0, 3562, +3812, 0, 3561, +3812, 0, 3559, +3811, 0, 3557, +3811, 0, 3554, +3810, 0, 3551, +3810, 0, 3547, +3810, 0, 3539, +3810, 0, 3528, +3810, 0, 3514, +3810, 0, 3493, +3810, 0, 3465, +3810, 0, 3424, +3810, 0, 3362, +3810, 0, 3264, +3810, 0, 3088, +3810, 0, 2631, +3810, 0, 0, +3810, 0, 0, +3810, 3161, 0, +3943, 3667, 0, +4075, 3959, 0, +4095, 4095, 0, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3691, +3944, 0, 3690, +3944, 0, 3690, +3944, 0, 3690, +3944, 0, 3689, +3944, 0, 3689, +3944, 0, 3688, +3944, 0, 3687, +3944, 0, 3685, +3943, 0, 3683, +3943, 0, 3681, +3943, 0, 3677, +3943, 0, 3672, +3943, 0, 3664, +3943, 0, 3653, +3943, 0, 3638, +3943, 0, 3618, +3943, 0, 3589, +3943, 0, 3547, +3943, 0, 3484, +3943, 0, 3384, +3943, 0, 3201, +3943, 0, 2708, +3943, 0, 0, +3943, 0, 0, +3943, 3287, 0, +4075, 3797, 0, +4095, 4090, 0, +4076, 0, 3819, +4076, 0, 3819, +4076, 0, 3819, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3818, +4076, 0, 3817, +4076, 0, 3816, +4076, 0, 3816, +4076, 0, 3814, +4076, 0, 3813, +4075, 0, 3811, +4075, 0, 3809, +4075, 0, 3804, +4075, 0, 3798, +4075, 0, 3790, +4075, 0, 3780, +4075, 0, 3765, +4075, 0, 3744, +4075, 0, 3714, +4075, 0, 3672, +4075, 0, 3608, +4075, 0, 3505, +4075, 0, 3318, +4075, 0, 2793, +4075, 0, 0, +4075, 0, 0, +4075, 3415, 0, +4095, 3929, 0, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3948, +4095, 0, 3947, +4095, 0, 3947, +4095, 0, 3947, +4095, 0, 3947, +4095, 0, 3946, +4095, 0, 3946, +4095, 0, 3945, +4095, 0, 3944, +4095, 0, 3942, +4095, 0, 3940, +4095, 0, 3937, +4095, 0, 3933, +4095, 0, 3927, +4095, 0, 3919, +4095, 0, 3908, +4095, 0, 3893, +4095, 0, 3872, +4095, 0, 3842, +4095, 0, 3799, +4095, 0, 3735, +4095, 0, 3630, +4095, 0, 3439, +4095, 0, 2890, +4095, 0, 0, +4095, 0, 0, +4095, 3544, 0, +0, 1959, 2226, +0, 1962, 2226, +0, 1966, 2226, +0, 1972, 2226, +0, 1979, 2226, +0, 1989, 2226, +0, 2002, 2226, +0, 2018, 2226, +0, 2039, 2226, +0, 2066, 2226, +0, 2100, 2226, +0, 2141, 2226, +0, 2191, 2226, +0, 2226, 2200, +0, 2226, 2108, +0, 2226, 1946, +0, 2226, 1562, +0, 2358, 0, +0, 2491, 0, +1232, 2623, 0, +1962, 2755, 0, +2292, 2887, 0, +2530, 3019, 0, +2729, 3152, 0, +2904, 3284, 0, +3067, 3416, 0, +3220, 3548, 0, +3367, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1956, 2226, +0, 1959, 2226, +0, 1963, 2226, +0, 1969, 2226, +0, 1977, 2226, +0, 1987, 2226, +0, 1999, 2226, +0, 2016, 2226, +0, 2037, 2226, +0, 2064, 2226, +0, 2098, 2226, +0, 2140, 2226, +0, 2190, 2226, +0, 2226, 2201, +0, 2226, 2109, +0, 2226, 1948, +0, 2226, 1565, +0, 2358, 0, +0, 2491, 0, +1251, 2623, 0, +1966, 2755, 0, +2294, 2887, 0, +2531, 3019, 0, +2729, 3152, 0, +2905, 3283, 0, +3067, 3416, 0, +3220, 3548, 0, +3368, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1951, 2226, +0, 1955, 2226, +0, 1960, 2225, +0, 1966, 2225, +0, 1973, 2225, +0, 1983, 2225, +0, 1996, 2225, +0, 2013, 2225, +0, 2034, 2225, +0, 2061, 2225, +0, 2095, 2225, +0, 2137, 2225, +0, 2188, 2225, +0, 2225, 2202, +0, 2225, 2111, +0, 2225, 1950, +0, 2225, 1570, +0, 2358, 0, +0, 2490, 0, +1275, 2623, 0, +1971, 2755, 0, +2296, 2887, 0, +2533, 3019, 0, +2730, 3152, 0, +2905, 3283, 0, +3067, 3416, 0, +3221, 3548, 0, +3368, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1945, 2226, +0, 1949, 2226, +0, 1954, 2225, +0, 1961, 2225, +0, 1969, 2225, +0, 1979, 2225, +0, 1992, 2225, +0, 2009, 2225, +0, 2030, 2225, +0, 2058, 2225, +0, 2092, 2225, +0, 2134, 2225, +0, 2185, 2225, +0, 2225, 2203, +0, 2225, 2112, +0, 2225, 1953, +0, 2225, 1576, +0, 2357, 0, +0, 2490, 0, +1304, 2622, 0, +1977, 2755, 0, +2299, 2887, 0, +2535, 3019, 0, +2732, 3151, 0, +2906, 3283, 0, +3068, 3416, 0, +3221, 3548, 0, +3368, 3680, 0, +3511, 3812, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1937, 2226, +0, 1941, 2226, +0, 1946, 2225, +0, 1953, 2225, +0, 1963, 2224, +0, 1973, 2224, +0, 1986, 2224, +0, 2003, 2224, +0, 2025, 2224, +0, 2053, 2224, +0, 2087, 2224, +0, 2130, 2224, +0, 2181, 2224, +0, 2224, 2206, +0, 2224, 2115, +0, 2224, 1956, +0, 2224, 1584, +0, 2357, 0, +0, 2489, 0, +1342, 2622, 0, +1986, 2755, 0, +2304, 2887, 0, +2537, 3019, 0, +2733, 3151, 0, +2907, 3283, 0, +3069, 3416, 0, +3222, 3548, 0, +3369, 3680, 0, +3511, 3812, 0, +3652, 3944, 0, +3790, 4076, 0, +3926, 4095, 0, +0, 1926, 2226, +0, 1930, 2226, +0, 1936, 2225, +0, 1943, 2225, +0, 1952, 2224, +0, 1965, 2223, +0, 1978, 2223, +0, 1995, 2223, +0, 2018, 2223, +0, 2046, 2223, +0, 2081, 2223, +0, 2124, 2223, +0, 2176, 2223, +0, 2223, 2208, +0, 2223, 2118, +0, 2223, 1961, +0, 2223, 1595, +0, 2356, 0, +0, 2489, 0, +1387, 2621, 0, +1997, 2754, 0, +2310, 2887, 0, +2541, 3019, 0, +2735, 3151, 0, +2909, 3283, 0, +3070, 3416, 0, +3222, 3548, 0, +3369, 3680, 0, +3512, 3812, 0, +3652, 3944, 0, +3790, 4076, 0, +3926, 4095, 0, +0, 1911, 2226, +0, 1915, 2226, +0, 1921, 2225, +0, 1928, 2225, +0, 1938, 2224, +0, 1951, 2223, +0, 1967, 2221, +0, 1985, 2221, +0, 2008, 2221, +0, 2036, 2221, +0, 2072, 2221, +0, 2116, 2221, +0, 2169, 2221, +0, 2221, 2212, +0, 2221, 2123, +0, 2221, 1967, +0, 2221, 1608, +0, 2355, 0, +0, 2488, 0, +1441, 2621, 0, +2012, 2754, 0, +2317, 2886, 0, +2545, 3018, 0, +2738, 3151, 0, +2911, 3283, 0, +3071, 3415, 0, +3223, 3548, 0, +3370, 3680, 0, +3513, 3812, 0, +3652, 3944, 0, +3790, 4076, 0, +3927, 4095, 0, +0, 1890, 2226, +0, 1894, 2226, +0, 1900, 2225, +0, 1908, 2225, +0, 1918, 2224, +0, 1931, 2223, +0, 1948, 2221, +0, 1970, 2220, +0, 1994, 2220, +0, 2023, 2220, +0, 2060, 2220, +0, 2105, 2220, +0, 2159, 2220, +0, 2220, 2217, +0, 2220, 2128, +0, 2220, 1975, +0, 2220, 1626, +0, 2353, 0, +0, 2487, 0, +1505, 2620, 0, +2031, 2753, 0, +2327, 2886, 0, +2551, 3018, 0, +2742, 3151, 0, +2914, 3283, 0, +3073, 3415, 0, +3225, 3548, 0, +3371, 3680, 0, +3513, 3812, 0, +3653, 3944, 0, +3790, 4076, 0, +3927, 4095, 0, +0, 1860, 2226, +0, 1865, 2226, +0, 1871, 2225, +0, 1880, 2225, +0, 1891, 2224, +0, 1904, 2223, +0, 1922, 2221, +0, 1946, 2220, +0, 1975, 2217, +0, 2006, 2217, +0, 2044, 2217, +0, 2090, 2217, +0, 2146, 2217, +0, 2211, 2217, +0, 2217, 2136, +0, 2217, 1986, +0, 2217, 1649, +0, 2352, 0, +0, 2486, 0, +1578, 2619, 0, +2056, 2752, 0, +2340, 2885, 0, +2559, 3018, 0, +2747, 3151, 0, +2917, 3283, 0, +3076, 3415, 0, +3226, 3548, 0, +3372, 3680, 0, +3514, 3812, 0, +3653, 3944, 0, +3791, 4076, 0, +3927, 4095, 0, +0, 1817, 2226, +0, 1823, 2226, +0, 1829, 2225, +0, 1839, 2225, +0, 1850, 2224, +0, 1865, 2223, +0, 1885, 2221, +0, 1910, 2220, +0, 1942, 2217, +0, 1981, 2214, +0, 2021, 2214, +0, 2070, 2214, +0, 2128, 2214, +0, 2195, 2214, +0, 2214, 2146, +0, 2214, 2000, +0, 2214, 1677, +0, 2349, 0, +0, 2484, 0, +1661, 2618, 0, +2086, 2751, 0, +2356, 2885, 0, +2570, 3017, 0, +2754, 3150, 0, +2922, 3282, 0, +3079, 3415, 0, +3229, 3547, 0, +3374, 3680, 0, +3515, 3812, 0, +3654, 3944, 0, +3791, 4076, 0, +3927, 4095, 0, +0, 1753, 2226, +0, 1759, 2226, +0, 1767, 2225, +0, 1777, 2225, +0, 1790, 2224, +0, 1808, 2223, +0, 1830, 2221, +0, 1858, 2220, +0, 1894, 2217, +0, 1936, 2214, +0, 1988, 2209, +0, 2041, 2209, +0, 2102, 2209, +0, 2174, 2209, +0, 2209, 2159, +0, 2209, 2018, +0, 2209, 1713, +0, 2346, 0, +415, 2481, 0, +1752, 2616, 0, +2124, 2750, 0, +2378, 2883, 0, +2583, 3016, 0, +2763, 3150, 0, +2928, 3282, 0, +3083, 3414, 0, +3232, 3547, 0, +3376, 3679, 0, +3517, 3812, 0, +3656, 3944, 0, +3793, 4076, 0, +3928, 4095, 0, +0, 1648, 2226, +0, 1656, 2226, +0, 1666, 2225, +0, 1679, 2225, +0, 1695, 2224, +0, 1717, 2223, +0, 1744, 2221, +0, 1778, 2220, +0, 1819, 2217, +0, 1870, 2214, +0, 1929, 2209, +217, 1998, 2203, +217, 2066, 2203, +217, 2142, 2203, +217, 2203, 2176, +217, 2203, 2041, +217, 2203, 1757, +0, 2341, 437, +1199, 2478, 0, +1851, 2613, 0, +2170, 2748, 0, +2405, 2882, 0, +2600, 3015, 0, +2775, 3149, 0, +2936, 3281, 0, +3089, 3414, 0, +3236, 3547, 0, +3379, 3679, 0, +3520, 3812, 0, +3657, 3944, 0, +3794, 4076, 0, +3929, 4095, 0, +0, 1457, 2226, +0, 1469, 2226, +0, 1484, 2225, +0, 1503, 2225, +0, 1527, 2224, +0, 1557, 2223, +0, 1596, 2221, +0, 1642, 2220, +0, 1697, 2217, +0, 1762, 2214, +0, 1836, 2209, +217, 1920, 2203, +1136, 2012, 2194, +1136, 2097, 2194, +1136, 2191, 2194, +1136, 2194, 2069, +1136, 2194, 1809, +345, 2335, 970, +1535, 2473, 0, +1956, 2610, 0, +2226, 2746, 0, +2439, 2880, 0, +2623, 3014, 0, +2790, 3148, 0, +2947, 3280, 0, +3097, 3414, 0, +3242, 3546, 0, +3384, 3679, 0, +3522, 3811, 0, +3659, 3944, 0, +3795, 4076, 0, +3930, 4095, 0, +0, 907, 2226, +0, 944, 2226, +0, 990, 2225, +0, 1044, 2225, +0, 1108, 2224, +0, 1181, 2223, +0, 1264, 2221, +0, 1355, 2220, +0, 1454, 2217, +0, 1560, 2214, +0, 1671, 2209, +217, 1787, 2203, +1136, 1906, 2194, +1487, 2029, 2183, +1487, 2136, 2183, +1487, 2183, 2105, +1487, 2183, 1871, +1270, 2326, 1269, +1776, 2467, 477, +2067, 2605, 0, +2291, 2742, 0, +2480, 2878, 0, +2651, 3012, 0, +2810, 3146, 0, +2961, 3280, 0, +3107, 3413, 0, +3249, 3546, 0, +3389, 3678, 0, +3526, 3811, 0, +3662, 3943, 0, +3798, 4076, 0, +3932, 4095, 0, +0, 0, 2226, +0, 0, 2226, +0, 0, 2225, +0, 0, 2225, +0, 0, 2224, +0, 0, 2223, +0, 0, 2221, +0, 0, 2220, +0, 140, 2217, +0, 932, 2214, +0, 1270, 2209, +217, 1512, 2203, +1136, 1711, 2194, +1487, 1888, 2183, +1733, 2051, 2167, +1733, 2167, 2149, +1733, 2167, 1943, +1718, 2315, 1619, +1976, 2459, 1401, +2183, 2599, 611, +2365, 2738, 0, +2530, 2874, 0, +2686, 3010, 0, +2835, 3144, 0, +2979, 3278, 0, +3120, 3412, 0, +3259, 3545, 0, +3396, 3678, 0, +3532, 3810, 0, +3666, 3943, 0, +3801, 4075, 0, +3934, 4095, 0, +0, 0, 2226, +0, 0, 2226, +0, 0, 2225, +0, 0, 2225, +0, 0, 2224, +0, 0, 2223, +0, 0, 2221, +0, 0, 2220, +0, 0, 2217, +0, 0, 2214, +303, 0, 2209, +838, 217, 2203, +1136, 1137, 2194, +1487, 1585, 2183, +1733, 1862, 2167, +1935, 2078, 2145, +1935, 2145, 2023, +1994, 2299, 1865, +2152, 2447, 1751, +2303, 2591, 1533, +2448, 2731, 738, +2590, 2870, 0, +2729, 3006, 0, +2867, 3142, 0, +3002, 3276, 0, +3137, 3410, 0, +3272, 3544, 0, +3405, 3677, 0, +3539, 3810, 0, +3672, 3943, 0, +3804, 4075, 0, +3937, 4095, 0, +1562, 0, 2226, +1565, 0, 2226, +1570, 0, 2225, +1576, 0, 2225, +1584, 0, 2224, +1595, 0, 2223, +1608, 0, 2221, +1626, 0, 2220, +1649, 0, 2217, +1677, 0, 2214, +1713, 0, 2209, +1757, 217, 2203, +1809, 1136, 2194, +1871, 1487, 2183, +1943, 1733, 2167, +2023, 1935, 2145, +2113, 2113, 2113, +2210, 2277, 2067, +2315, 2431, 1997, +2425, 2579, 1883, +2540, 2723, 1664, +2659, 2863, 870, +2781, 3002, 0, +2906, 3138, 0, +3031, 3274, 0, +3159, 3408, 0, +3288, 3543, 0, +3418, 3676, 0, +3548, 3809, 0, +3679, 3942, 0, +3810, 4075, 0, +3941, 4095, 0, +2078, 0, 2358, +2079, 0, 2358, +2080, 0, 2358, +2082, 0, 2357, +2085, 0, 2357, +2088, 0, 2356, +2093, 0, 2355, +2099, 0, 2353, +2107, 0, 2352, +2118, 0, 2349, +2132, 0, 2346, +2150, 0, 2341, +2173, 345, 2335, +2202, 1269, 2326, +2237, 1619, 2315, +2281, 1865, 2299, +2277, 2067, 2210, +2277, 2155, 2067, +2431, 2414, 1997, +2533, 2579, 1883, +2626, 2723, 1664, +2726, 2863, 870, +2833, 3002, 0, +2946, 3138, 0, +3062, 3274, 0, +3183, 3408, 0, +3306, 3543, 0, +3431, 3676, 0, +3558, 3809, 0, +3686, 3942, 0, +3815, 4075, 0, +3945, 4095, 0, +2371, 0, 2491, +2372, 0, 2491, +2373, 0, 2490, +2374, 0, 2490, +2375, 0, 2489, +2377, 0, 2489, +2379, 0, 2488, +2383, 0, 2487, +2387, 0, 2486, +2393, 0, 2484, +2401, 0, 2481, +2411, 0, 2478, +2423, 0, 2473, +2440, 477, 2467, +2459, 1401, 2455, +2447, 1751, 2401, +2431, 1997, 2315, +2431, 1997, 2126, +2431, 2207, 1997, +2579, 2502, 1883, +2719, 2723, 1664, +2803, 2863, 870, +2895, 3002, 0, +2995, 3138, 0, +3100, 3274, 0, +3212, 3408, 0, +3329, 3543, 0, +3448, 3676, 0, +3571, 3809, 0, +3696, 3942, 0, +3823, 4075, 0, +3951, 4095, 0, +2595, 0, 2623, +2595, 0, 2623, +2596, 0, 2623, +2596, 0, 2622, +2597, 0, 2622, +2598, 0, 2621, +2600, 0, 2621, +2602, 0, 2620, +2604, 0, 2619, +2608, 0, 2618, +2613, 0, 2616, +2613, 0, 2607, +2610, 0, 2592, +2605, 0, 2570, +2599, 611, 2538, +2591, 1533, 2493, +2579, 1883, 2425, +2579, 1883, 2284, +2579, 1883, 1981, +2579, 2267, 1883, +2723, 2598, 1664, +2863, 2837, 870, +2966, 3002, 0, +3053, 3138, 0, +3147, 3274, 0, +3249, 3408, 0, +3357, 3543, 0, +3471, 3676, 0, +3588, 3809, 0, +3709, 3942, 0, +3833, 4075, 0, +3959, 4095, 0, +2755, 0, 2723, +2755, 0, 2723, +2755, 0, 2722, +2755, 0, 2721, +2755, 0, 2720, +2754, 0, 2718, +2754, 0, 2716, +2753, 0, 2713, +2752, 0, 2710, +2751, 0, 2704, +2750, 0, 2697, +2748, 0, 2687, +2746, 0, 2674, +2742, 0, 2656, +2738, 0, 2631, +2731, 738, 2594, +2723, 1664, 2540, +2723, 1664, 2435, +2723, 1664, 2240, +2723, 1664, 1667, +2723, 2338, 1664, +2863, 2701, 870, +3002, 2952, 0, +3120, 3138, 0, +3203, 3274, 0, +3294, 3408, 0, +3393, 3543, 0, +3499, 3676, 0, +3610, 3809, 0, +3726, 3942, 0, +3846, 4075, 0, +3968, 4095, 0, +2887, 0, 2806, +2887, 0, 2805, +2887, 0, 2805, +2887, 0, 2804, +2887, 0, 2803, +2887, 0, 2802, +2886, 0, 2800, +2886, 0, 2798, +2885, 0, 2795, +2885, 0, 2790, +2883, 0, 2784, +2882, 0, 2777, +2880, 0, 2766, +2878, 0, 2751, +2874, 0, 2730, +2870, 0, 2701, +2863, 870, 2659, +2863, 870, 2580, +2863, 870, 2447, +2863, 870, 2173, +2863, 1498, 870, +2863, 2417, 870, +3002, 2810, 0, +3138, 3071, 0, +3268, 3274, 0, +3348, 3408, 0, +3437, 3543, 0, +3534, 3676, 0, +3638, 3809, 0, +3748, 3942, 0, +3862, 4075, 0, +3981, 4095, 0, +3019, 0, 2897, +3019, 0, 2897, +3019, 0, 2896, +3019, 0, 2896, +3019, 0, 2895, +3019, 0, 2894, +3018, 0, 2892, +3018, 0, 2890, +3018, 0, 2888, +3017, 0, 2885, +3016, 0, 2880, +3015, 0, 2873, +3014, 0, 2865, +3012, 0, 2853, +3010, 0, 2836, +3006, 0, 2813, +3002, 0, 2781, +3002, 0, 2722, +3002, 0, 2628, +3002, 0, 2463, +3002, 0, 2062, +3002, 1109, 0, +3002, 2505, 0, +3138, 2925, 0, +3274, 3193, 0, +3408, 3406, 0, +3490, 3543, 0, +3577, 3676, 0, +3672, 3809, 0, +3775, 3942, 0, +3884, 4075, 0, +3998, 4095, 0, +3152, 0, 2996, +3152, 0, 2996, +3152, 0, 2996, +3151, 0, 2995, +3151, 0, 2995, +3151, 0, 2994, +3151, 0, 2993, +3151, 0, 2991, +3151, 0, 2989, +3150, 0, 2986, +3150, 0, 2982, +3149, 0, 2977, +3148, 0, 2970, +3146, 0, 2961, +3144, 0, 2948, +3142, 0, 2931, +3138, 0, 2906, +3138, 0, 2861, +3138, 0, 2795, +3138, 0, 2687, +3138, 0, 2484, +3138, 0, 1857, +3138, 0, 0, +3138, 2602, 0, +3274, 3042, 0, +3408, 3317, 0, +3543, 3533, 0, +3629, 3676, 0, +3715, 3809, 0, +3809, 3942, 0, +3911, 4075, 0, +4019, 4095, 0, +3284, 0, 3102, +3283, 0, 3102, +3283, 0, 3101, +3283, 0, 3101, +3283, 0, 3101, +3283, 0, 3100, +3283, 0, 3099, +3283, 0, 3098, +3283, 0, 3096, +3282, 0, 3094, +3282, 0, 3091, +3281, 0, 3087, +3280, 0, 3082, +3280, 0, 3074, +3278, 0, 3064, +3276, 0, 3050, +3274, 0, 3031, +3274, 0, 2998, +3274, 0, 2950, +3274, 0, 2876, +3274, 0, 2753, +3274, 0, 2510, +3274, 0, 1202, +3274, 0, 0, +3274, 2706, 0, +3408, 3164, 0, +3543, 3444, 0, +3676, 3662, 0, +3766, 3809, 0, +3851, 3942, 0, +3945, 4075, 0, +4046, 4095, 0, +3416, 0, 3213, +3416, 0, 3213, +3416, 0, 3213, +3416, 0, 3213, +3416, 0, 3212, +3416, 0, 3212, +3415, 0, 3211, +3415, 0, 3210, +3415, 0, 3209, +3415, 0, 3207, +3414, 0, 3205, +3414, 0, 3202, +3414, 0, 3198, +3413, 0, 3192, +3412, 0, 3184, +3410, 0, 3174, +3408, 0, 3159, +3408, 0, 3134, +3408, 0, 3099, +3408, 0, 3047, +3408, 0, 2966, +3408, 0, 2830, +3408, 0, 2545, +3408, 0, 0, +3408, 0, 0, +3408, 2815, 0, +3543, 3288, 0, +3676, 3572, 0, +3809, 3791, 0, +3902, 3942, 0, +3986, 4075, 0, +4080, 4095, 0, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3329, +3548, 0, 3328, +3548, 0, 3328, +3548, 0, 3327, +3548, 0, 3326, +3547, 0, 3325, +3547, 0, 3323, +3547, 0, 3320, +3546, 0, 3317, +3546, 0, 3313, +3545, 0, 3307, +3544, 0, 3299, +3543, 0, 3288, +3543, 0, 3270, +3543, 0, 3243, +3543, 0, 3206, +3543, 0, 3151, +3543, 0, 3065, +3543, 0, 2917, +3543, 0, 2585, +3543, 0, 0, +3543, 0, 0, +3543, 2929, 0, +3676, 3414, 0, +3809, 3700, 0, +3942, 3921, 0, +4037, 4075, 0, +4095, 4095, 0, +3680, 0, 3449, +3680, 0, 3449, +3680, 0, 3449, +3680, 0, 3449, +3680, 0, 3448, +3680, 0, 3448, +3680, 0, 3448, +3680, 0, 3447, +3680, 0, 3446, +3680, 0, 3445, +3679, 0, 3444, +3679, 0, 3442, +3679, 0, 3440, +3678, 0, 3436, +3678, 0, 3432, +3677, 0, 3426, +3676, 0, 3418, +3676, 0, 3404, +3676, 0, 3385, +3676, 0, 3358, +3676, 0, 3319, +3676, 0, 3261, +3676, 0, 3170, +3676, 0, 3010, +3676, 0, 2636, +3676, 0, 0, +3676, 0, 0, +3676, 3048, 0, +3809, 3542, 0, +3942, 3830, 0, +4075, 4051, 0, +4095, 4095, 0, +3812, 0, 3572, +3812, 0, 3572, +3812, 0, 3572, +3812, 0, 3571, +3812, 0, 3571, +3812, 0, 3571, +3812, 0, 3571, +3812, 0, 3570, +3812, 0, 3570, +3812, 0, 3569, +3812, 0, 3568, +3812, 0, 3566, +3811, 0, 3564, +3811, 0, 3562, +3810, 0, 3559, +3810, 0, 3554, +3809, 0, 3548, +3809, 0, 3537, +3809, 0, 3523, +3809, 0, 3503, +3809, 0, 3475, +3809, 0, 3435, +3809, 0, 3376, +3809, 0, 3281, +3809, 0, 3112, +3809, 0, 2694, +3809, 0, 0, +3809, 0, 0, +3809, 3169, 0, +3942, 3670, 0, +4075, 3960, 0, +4095, 4095, 0, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3696, +3944, 0, 3695, +3944, 0, 3695, +3944, 0, 3694, +3944, 0, 3694, +3944, 0, 3692, +3944, 0, 3691, +3943, 0, 3689, +3943, 0, 3687, +3943, 0, 3683, +3942, 0, 3679, +3942, 0, 3671, +3942, 0, 3660, +3942, 0, 3646, +3942, 0, 3626, +3942, 0, 3597, +3942, 0, 3556, +3942, 0, 3494, +3942, 0, 3396, +3942, 0, 3220, +3942, 0, 2762, +3942, 0, 0, +3942, 0, 0, +3942, 3293, 0, +4075, 3799, 0, +4095, 4091, 0, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3823, +4076, 0, 3822, +4076, 0, 3822, +4076, 0, 3822, +4076, 0, 3822, +4076, 0, 3821, +4076, 0, 3821, +4076, 0, 3820, +4076, 0, 3819, +4076, 0, 3817, +4075, 0, 3816, +4075, 0, 3813, +4075, 0, 3810, +4075, 0, 3803, +4075, 0, 3796, +4075, 0, 3785, +4075, 0, 3770, +4075, 0, 3750, +4075, 0, 3721, +4075, 0, 3679, +4075, 0, 3616, +4075, 0, 3515, +4075, 0, 3333, +4075, 0, 2839, +4075, 0, 0, +4075, 0, 0, +4075, 3419, 0, +4095, 3930, 0, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3951, +4095, 0, 3950, +4095, 0, 3950, +4095, 0, 3950, +4095, 0, 3950, +4095, 0, 3949, +4095, 0, 3948, +4095, 0, 3947, +4095, 0, 3945, +4095, 0, 3944, +4095, 0, 3941, +4095, 0, 3937, +4095, 0, 3931, +4095, 0, 3923, +4095, 0, 3912, +4095, 0, 3897, +4095, 0, 3876, +4095, 0, 3847, +4095, 0, 3804, +4095, 0, 3741, +4095, 0, 3638, +4095, 0, 3450, +4095, 0, 2927, +4095, 0, 0, +4095, 0, 0, +4095, 3547, 0, +0, 2090, 2358, +0, 2093, 2358, +0, 2096, 2358, +0, 2100, 2358, +0, 2106, 2358, +0, 2113, 2358, +0, 2123, 2358, +0, 2136, 2358, +0, 2152, 2358, +0, 2173, 2358, +0, 2200, 2358, +0, 2233, 2358, +0, 2275, 2358, +0, 2325, 2358, +0, 2358, 2332, +0, 2358, 2239, +0, 2358, 2078, +0, 2358, 1692, +0, 2491, 0, +0, 2623, 0, +1353, 2755, 0, +2091, 2887, 0, +2422, 3019, 0, +2662, 3152, 0, +2860, 3284, 0, +3036, 3416, 0, +3198, 3548, 0, +3352, 3680, 0, +3499, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2088, 2358, +0, 2091, 2358, +0, 2094, 2358, +0, 2098, 2358, +0, 2104, 2358, +0, 2111, 2358, +0, 2121, 2358, +0, 2134, 2358, +0, 2150, 2358, +0, 2171, 2358, +0, 2199, 2358, +0, 2232, 2358, +0, 2273, 2358, +0, 2324, 2358, +0, 2358, 2332, +0, 2358, 2240, +0, 2358, 2079, +0, 2358, 1694, +0, 2491, 0, +0, 2623, 0, +1367, 2755, 0, +2094, 2887, 0, +2424, 3019, 0, +2663, 3152, 0, +2860, 3283, 0, +3036, 3416, 0, +3199, 3548, 0, +3352, 3680, 0, +3499, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2085, 2358, +0, 2087, 2358, +0, 2091, 2358, +0, 2096, 2358, +0, 2101, 2358, +0, 2109, 2358, +0, 2119, 2358, +0, 2132, 2358, +0, 2148, 2358, +0, 2169, 2358, +0, 2196, 2358, +0, 2230, 2358, +0, 2271, 2358, +0, 2322, 2358, +0, 2358, 2333, +0, 2358, 2241, +0, 2358, 2080, +0, 2358, 1698, +0, 2490, 0, +0, 2623, 0, +1386, 2755, 0, +2098, 2887, 0, +2426, 3019, 0, +2664, 3152, 0, +2861, 3283, 0, +3037, 3416, 0, +3199, 3548, 0, +3353, 3680, 0, +3500, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2080, 2358, +0, 2083, 2358, +0, 2087, 2358, +0, 2092, 2357, +0, 2098, 2357, +0, 2105, 2357, +0, 2115, 2357, +0, 2128, 2357, +0, 2145, 2357, +0, 2166, 2357, +0, 2193, 2357, +0, 2228, 2357, +0, 2269, 2357, +0, 2320, 2357, +0, 2357, 2334, +0, 2357, 2243, +0, 2357, 2082, +0, 2357, 1702, +0, 2490, 0, +0, 2622, 0, +1409, 2755, 0, +2103, 2887, 0, +2428, 3019, 0, +2665, 3151, 0, +2862, 3283, 0, +3038, 3416, 0, +3200, 3548, 0, +3353, 3680, 0, +3500, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2074, 2358, +0, 2077, 2358, +0, 2081, 2358, +0, 2086, 2357, +0, 2093, 2357, +0, 2101, 2357, +0, 2111, 2357, +0, 2124, 2357, +0, 2141, 2357, +0, 2162, 2357, +0, 2190, 2357, +0, 2224, 2357, +0, 2266, 2357, +0, 2317, 2357, +0, 2357, 2335, +0, 2357, 2245, +0, 2357, 2085, +0, 2357, 1708, +0, 2489, 0, +0, 2622, 0, +1439, 2755, 0, +2110, 2887, 0, +2431, 3019, 0, +2667, 3151, 0, +2863, 3283, 0, +3038, 3416, 0, +3200, 3548, 0, +3353, 3680, 0, +3500, 3812, 0, +3643, 3944, 0, +3783, 4076, 0, +3921, 4095, 0, +0, 2066, 2358, +0, 2069, 2358, +0, 2073, 2358, +0, 2078, 2357, +0, 2086, 2357, +0, 2095, 2356, +0, 2105, 2356, +0, 2118, 2356, +0, 2135, 2356, +0, 2157, 2356, +0, 2185, 2356, +0, 2219, 2356, +0, 2262, 2356, +0, 2313, 2356, +0, 2356, 2338, +0, 2356, 2247, +0, 2356, 2088, +0, 2356, 1716, +0, 2489, 0, +0, 2621, 0, +1476, 2754, 0, +2118, 2887, 0, +2435, 3019, 0, +2670, 3151, 0, +2865, 3283, 0, +3039, 3416, 0, +3201, 3548, 0, +3354, 3680, 0, +3501, 3812, 0, +3644, 3944, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 2055, 2358, +0, 2058, 2358, +0, 2062, 2358, +0, 2068, 2357, +0, 2075, 2357, +0, 2084, 2356, +0, 2096, 2355, +0, 2110, 2355, +0, 2127, 2355, +0, 2150, 2355, +0, 2178, 2355, +0, 2213, 2355, +0, 2256, 2355, +0, 2308, 2355, +0, 2355, 2340, +0, 2355, 2251, +0, 2355, 2093, +0, 2355, 1727, +0, 2488, 0, +0, 2621, 0, +1521, 2754, 0, +2129, 2886, 0, +2441, 3018, 0, +2673, 3151, 0, +2867, 3283, 0, +3041, 3415, 0, +3202, 3548, 0, +3354, 3680, 0, +3501, 3812, 0, +3644, 3944, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 2040, 2358, +0, 2043, 2358, +0, 2047, 2358, +0, 2053, 2357, +0, 2060, 2357, +0, 2070, 2356, +0, 2083, 2355, +0, 2099, 2353, +0, 2117, 2353, +0, 2140, 2353, +0, 2168, 2353, +0, 2204, 2353, +0, 2248, 2353, +0, 2301, 2353, +0, 2353, 2344, +0, 2353, 2255, +0, 2353, 2099, +0, 2353, 1740, +0, 2487, 0, +0, 2620, 0, +1575, 2753, 0, +2144, 2886, 0, +2449, 3018, 0, +2678, 3151, 0, +2870, 3283, 0, +3043, 3415, 0, +3203, 3548, 0, +3356, 3680, 0, +3502, 3812, 0, +3645, 3944, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 2019, 2358, +0, 2022, 2358, +0, 2027, 2358, +0, 2032, 2357, +0, 2040, 2357, +0, 2050, 2356, +0, 2063, 2355, +0, 2081, 2353, +0, 2102, 2352, +0, 2126, 2352, +0, 2155, 2352, +0, 2192, 2352, +0, 2237, 2352, +0, 2291, 2352, +0, 2352, 2349, +0, 2352, 2261, +0, 2352, 2107, +0, 2352, 1758, +0, 2486, 0, +0, 2619, 0, +1638, 2752, 0, +2163, 2885, 0, +2459, 3018, 0, +2684, 3151, 0, +2874, 3283, 0, +3046, 3415, 0, +3205, 3548, 0, +3357, 3680, 0, +3503, 3812, 0, +3645, 3944, 0, +3785, 4076, 0, +3923, 4095, 0, +0, 1989, 2358, +0, 1993, 2358, +0, 1997, 2358, +0, 2004, 2357, +0, 2012, 2357, +0, 2022, 2356, +0, 2037, 2355, +0, 2054, 2353, +0, 2078, 2352, +0, 2107, 2349, +0, 2138, 2349, +0, 2176, 2349, +0, 2223, 2349, +0, 2278, 2349, +0, 2343, 2349, +0, 2349, 2268, +0, 2349, 2118, +0, 2349, 1781, +0, 2484, 0, +0, 2618, 0, +1711, 2751, 0, +2188, 2885, 0, +2471, 3017, 0, +2691, 3150, 0, +2879, 3282, 0, +3049, 3415, 0, +3208, 3547, 0, +3359, 3680, 0, +3504, 3812, 0, +3646, 3944, 0, +3785, 4076, 0, +3923, 4095, 0, +0, 1946, 2358, +0, 1950, 2358, +0, 1955, 2358, +0, 1962, 2357, +0, 1970, 2357, +0, 1982, 2356, +0, 1998, 2355, +0, 2017, 2353, +0, 2042, 2352, +0, 2074, 2349, +0, 2113, 2346, +0, 2153, 2346, +0, 2202, 2346, +0, 2260, 2346, +0, 2328, 2346, +0, 2346, 2278, +0, 2346, 2132, +0, 2346, 1809, +0, 2481, 0, +0, 2616, 0, +1794, 2750, 0, +2218, 2883, 0, +2488, 3016, 0, +2702, 3150, 0, +2886, 3282, 0, +3054, 3414, 0, +3211, 3547, 0, +3361, 3679, 0, +3506, 3812, 0, +3648, 3944, 0, +3787, 4076, 0, +3924, 4095, 0, +0, 1880, 2358, +0, 1885, 2358, +0, 1891, 2358, +0, 1899, 2357, +0, 1909, 2357, +0, 1922, 2356, +0, 1940, 2355, +0, 1962, 2353, +0, 1990, 2352, +0, 2025, 2349, +0, 2069, 2346, +0, 2120, 2341, +0, 2173, 2341, +0, 2234, 2341, +0, 2305, 2341, +0, 2341, 2291, +0, 2341, 2150, +0, 2341, 1845, +0, 2478, 0, +547, 2613, 0, +1885, 2748, 0, +2256, 2882, 0, +2510, 3015, 0, +2715, 3149, 0, +2895, 3281, 0, +3060, 3414, 0, +3216, 3547, 0, +3364, 3679, 0, +3508, 3812, 0, +3649, 3944, 0, +3787, 4076, 0, +3925, 4095, 0, +0, 1775, 2358, +0, 1781, 2358, +0, 1788, 2358, +0, 1798, 2357, +0, 1811, 2357, +0, 1828, 2356, +0, 1849, 2355, +0, 1876, 2353, +0, 1910, 2352, +0, 1951, 2349, +0, 2002, 2346, +0, 2061, 2341, +345, 2131, 2335, +345, 2198, 2335, +345, 2274, 2335, +345, 2335, 2308, +345, 2335, 2173, +345, 2335, 1889, +0, 2473, 557, +1330, 2610, 0, +1983, 2746, 0, +2302, 2880, 0, +2536, 3014, 0, +2733, 3148, 0, +2907, 3280, 0, +3069, 3414, 0, +3221, 3546, 0, +3368, 3679, 0, +3511, 3811, 0, +3651, 3944, 0, +3789, 4076, 0, +3926, 4095, 0, +0, 1580, 2358, +0, 1589, 2358, +0, 1600, 2358, +0, 1615, 2357, +0, 1634, 2357, +0, 1659, 2356, +0, 1689, 2355, +0, 1727, 2353, +0, 1773, 2352, +0, 1829, 2349, +0, 1894, 2346, +0, 1968, 2341, +345, 2052, 2335, +1269, 2144, 2326, +1269, 2229, 2326, +1269, 2323, 2326, +1269, 2326, 2202, +1269, 2326, 1941, +477, 2467, 1099, +1667, 2605, 0, +2089, 2742, 0, +2358, 2878, 0, +2570, 3012, 0, +2755, 3146, 0, +2922, 3280, 0, +3079, 3413, 0, +3229, 3546, 0, +3374, 3678, 0, +3516, 3811, 0, +3655, 3943, 0, +3792, 4076, 0, +3927, 4095, 0, +0, 1009, 2358, +0, 1039, 2358, +0, 1076, 2358, +0, 1122, 2357, +0, 1176, 2357, +0, 1240, 2356, +0, 1313, 2355, +0, 1396, 2353, +0, 1487, 2352, +0, 1586, 2349, +0, 1692, 2346, +0, 1803, 2341, +345, 1919, 2335, +1269, 2038, 2326, +1619, 2161, 2315, +1619, 2268, 2315, +1619, 2315, 2237, +1619, 2315, 2003, +1403, 2459, 1401, +1908, 2599, 611, +2200, 2738, 0, +2423, 2874, 0, +2612, 3010, 0, +2783, 3144, 0, +2942, 3278, 0, +3093, 3412, 0, +3239, 3545, 0, +3381, 3678, 0, +3521, 3810, 0, +3659, 3943, 0, +3795, 4075, 0, +3930, 4095, 0, +0, 0, 2358, +0, 0, 2358, +0, 0, 2358, +0, 0, 2357, +0, 0, 2357, +0, 0, 2356, +0, 0, 2355, +0, 0, 2353, +0, 0, 2352, +0, 275, 2349, +0, 1064, 2346, +0, 1403, 2341, +345, 1644, 2335, +1269, 1843, 2326, +1619, 2020, 2315, +1865, 2183, 2299, +1865, 2299, 2281, +1865, 2299, 2075, +1850, 2447, 1751, +2108, 2591, 1533, +2315, 2731, 738, +2497, 2870, 0, +2662, 3006, 0, +2818, 3142, 0, +2967, 3276, 0, +3111, 3410, 0, +3253, 3544, 0, +3391, 3677, 0, +3528, 3810, 0, +3664, 3943, 0, +3798, 4075, 0, +3933, 4095, 0, +0, 0, 2358, +0, 0, 2358, +0, 0, 2358, +0, 0, 2357, +0, 0, 2357, +0, 0, 2356, +0, 0, 2355, +0, 0, 2353, +0, 0, 2352, +0, 0, 2349, +0, 0, 2346, +437, 0, 2341, +970, 345, 2335, +1269, 1270, 2326, +1619, 1718, 2315, +1865, 1994, 2299, +2067, 2210, 2277, +2067, 2277, 2155, +2126, 2431, 1997, +2284, 2579, 1883, +2435, 2723, 1664, +2580, 2863, 870, +2722, 3002, 0, +2861, 3138, 0, +2998, 3274, 0, +3134, 3408, 0, +3270, 3543, 0, +3404, 3676, 0, +3537, 3809, 0, +3671, 3942, 0, +3803, 4075, 0, +3937, 4095, 0, +1692, 0, 2358, +1694, 0, 2358, +1698, 0, 2358, +1702, 0, 2357, +1708, 0, 2357, +1716, 0, 2356, +1727, 0, 2355, +1740, 0, 2353, +1758, 0, 2352, +1781, 0, 2349, +1809, 0, 2346, +1845, 0, 2341, +1889, 345, 2335, +1941, 1269, 2326, +2003, 1619, 2315, +2075, 1865, 2299, +2155, 2067, 2277, +2245, 2245, 2245, +2343, 2409, 2199, +2447, 2563, 2129, +2557, 2711, 2015, +2672, 2855, 1796, +2791, 2995, 1006, +2913, 3134, 0, +3037, 3270, 0, +3164, 3406, 0, +3291, 3541, 0, +3420, 3675, 0, +3550, 3808, 0, +3680, 3941, 0, +3810, 4074, 0, +3942, 4095, 0, +2209, 0, 2491, +2210, 0, 2491, +2211, 0, 2490, +2213, 0, 2490, +2215, 0, 2489, +2218, 0, 2489, +2221, 0, 2488, +2226, 0, 2487, +2232, 0, 2486, +2240, 0, 2484, +2251, 0, 2481, +2264, 0, 2478, +2282, 0, 2473, +2305, 477, 2467, +2334, 1401, 2459, +2370, 1751, 2447, +2414, 1997, 2431, +2409, 2199, 2343, +2409, 2288, 2199, +2563, 2545, 2129, +2665, 2711, 2015, +2758, 2855, 1796, +2858, 2995, 1006, +2965, 3134, 0, +3078, 3270, 0, +3194, 3406, 0, +3315, 3541, 0, +3438, 3675, 0, +3563, 3808, 0, +3690, 3941, 0, +3818, 4074, 0, +3947, 4095, 0, +2503, 0, 2623, +2503, 0, 2623, +2504, 0, 2623, +2505, 0, 2622, +2506, 0, 2622, +2507, 0, 2621, +2509, 0, 2621, +2511, 0, 2620, +2515, 0, 2619, +2519, 0, 2618, +2525, 0, 2616, +2533, 0, 2613, +2543, 0, 2610, +2556, 0, 2605, +2572, 611, 2599, +2591, 1533, 2587, +2579, 1883, 2533, +2563, 2129, 2447, +2563, 2129, 2258, +2563, 2339, 2129, +2711, 2634, 2015, +2852, 2855, 1796, +2935, 2995, 1006, +3027, 3134, 0, +3126, 3270, 0, +3233, 3406, 0, +3344, 3541, 0, +3461, 3675, 0, +3581, 3808, 0, +3703, 3941, 0, +3828, 4074, 0, +3955, 4095, 0, +2727, 0, 2755, +2727, 0, 2755, +2728, 0, 2755, +2728, 0, 2755, +2729, 0, 2755, +2730, 0, 2754, +2731, 0, 2754, +2732, 0, 2753, +2734, 0, 2752, +2737, 0, 2751, +2741, 0, 2750, +2745, 0, 2748, +2746, 0, 2740, +2742, 0, 2724, +2738, 0, 2702, +2731, 738, 2671, +2723, 1664, 2626, +2711, 2015, 2557, +2711, 2015, 2416, +2711, 2015, 2114, +2711, 2400, 2015, +2855, 2730, 1796, +2995, 2968, 1006, +3098, 3134, 0, +3184, 3270, 0, +3279, 3406, 0, +3381, 3541, 0, +3490, 3675, 0, +3603, 3808, 0, +3720, 3941, 0, +3841, 4074, 0, +3965, 4095, 0, +2887, 0, 2856, +2887, 0, 2855, +2887, 0, 2855, +2887, 0, 2854, +2887, 0, 2853, +2887, 0, 2852, +2886, 0, 2850, +2886, 0, 2848, +2885, 0, 2845, +2885, 0, 2842, +2883, 0, 2836, +2882, 0, 2829, +2880, 0, 2820, +2878, 0, 2807, +2874, 0, 2788, +2870, 0, 2763, +2863, 870, 2726, +2855, 1796, 2672, +2855, 1796, 2567, +2855, 1796, 2372, +2855, 1796, 1797, +2855, 2470, 1796, +2995, 2833, 1006, +3134, 3084, 0, +3252, 3270, 0, +3335, 3406, 0, +3426, 3541, 0, +3525, 3675, 0, +3631, 3808, 0, +3742, 3941, 0, +3858, 4074, 0, +3978, 4095, 0, +3019, 0, 2938, +3019, 0, 2938, +3019, 0, 2938, +3019, 0, 2937, +3019, 0, 2936, +3019, 0, 2935, +3018, 0, 2934, +3018, 0, 2932, +3018, 0, 2930, +3017, 0, 2927, +3016, 0, 2922, +3015, 0, 2916, +3014, 0, 2908, +3012, 0, 2898, +3010, 0, 2883, +3006, 0, 2862, +3002, 0, 2833, +2995, 1006, 2791, +2995, 1006, 2712, +2995, 1006, 2579, +2995, 1006, 2303, +2995, 1635, 1006, +2995, 2549, 1006, +3134, 2943, 0, +3270, 3203, 0, +3400, 3406, 0, +3480, 3541, 0, +3569, 3675, 0, +3666, 3808, 0, +3770, 3941, 0, +3880, 4074, 0, +3994, 4095, 0, +3152, 0, 3030, +3152, 0, 3029, +3152, 0, 3029, +3151, 0, 3029, +3151, 0, 3028, +3151, 0, 3027, +3151, 0, 3026, +3151, 0, 3025, +3151, 0, 3023, +3150, 0, 3020, +3150, 0, 3017, +3149, 0, 3012, +3148, 0, 3005, +3146, 0, 2997, +3144, 0, 2985, +3142, 0, 2969, +3138, 0, 2946, +3134, 0, 2913, +3134, 0, 2854, +3134, 0, 2761, +3134, 0, 2596, +3134, 0, 2195, +3134, 1211, 0, +3134, 2638, 0, +3270, 3056, 0, +3406, 3325, 0, +3541, 3538, 0, +3622, 3675, 0, +3709, 3808, 0, +3805, 3941, 0, +3907, 4074, 0, +4016, 4095, 0, +3284, 0, 3128, +3283, 0, 3128, +3283, 0, 3128, +3283, 0, 3128, +3283, 0, 3127, +3283, 0, 3127, +3283, 0, 3126, +3283, 0, 3125, +3283, 0, 3123, +3282, 0, 3121, +3282, 0, 3118, +3281, 0, 3114, +3280, 0, 3109, +3280, 0, 3102, +3278, 0, 3093, +3276, 0, 3080, +3274, 0, 3062, +3270, 0, 3037, +3270, 0, 2993, +3270, 0, 2926, +3270, 0, 2818, +3270, 0, 2616, +3270, 0, 1990, +3270, 0, 0, +3270, 2734, 0, +3406, 3175, 0, +3541, 3450, 0, +3675, 3665, 0, +3761, 3808, 0, +3847, 3941, 0, +3941, 4074, 0, +4043, 4095, 0, +3416, 0, 3234, +3416, 0, 3234, +3416, 0, 3234, +3416, 0, 3234, +3416, 0, 3233, +3416, 0, 3233, +3415, 0, 3232, +3415, 0, 3231, +3415, 0, 3230, +3415, 0, 3228, +3414, 0, 3226, +3414, 0, 3223, +3414, 0, 3219, +3413, 0, 3214, +3412, 0, 3206, +3410, 0, 3196, +3408, 0, 3183, +3406, 0, 3164, +3406, 0, 3131, +3406, 0, 3082, +3406, 0, 3008, +3406, 0, 2886, +3406, 0, 2643, +3406, 0, 1325, +3406, 0, 0, +3406, 2838, 0, +3541, 3296, 0, +3675, 3576, 0, +3808, 3794, 0, +3898, 3941, 0, +3983, 4074, 0, +4077, 4095, 0, +3548, 0, 3346, +3548, 0, 3346, +3548, 0, 3346, +3548, 0, 3345, +3548, 0, 3345, +3548, 0, 3344, +3548, 0, 3344, +3548, 0, 3343, +3548, 0, 3342, +3547, 0, 3341, +3547, 0, 3339, +3547, 0, 3337, +3546, 0, 3334, +3546, 0, 3330, +3545, 0, 3324, +3544, 0, 3316, +3543, 0, 3306, +3541, 0, 3291, +3541, 0, 3267, +3541, 0, 3231, +3541, 0, 3179, +3541, 0, 3099, +3541, 0, 2963, +3541, 0, 2676, +3541, 0, 0, +3541, 0, 0, +3541, 2947, 0, +3675, 3420, 0, +3808, 3704, 0, +3941, 3923, 0, +4034, 4074, 0, +4095, 4095, 0, +3680, 0, 3462, +3680, 0, 3462, +3680, 0, 3462, +3680, 0, 3461, +3680, 0, 3461, +3680, 0, 3461, +3680, 0, 3460, +3680, 0, 3460, +3680, 0, 3459, +3680, 0, 3458, +3679, 0, 3457, +3679, 0, 3455, +3679, 0, 3453, +3678, 0, 3449, +3678, 0, 3445, +3677, 0, 3439, +3676, 0, 3431, +3675, 0, 3420, +3675, 0, 3402, +3675, 0, 3376, +3675, 0, 3338, +3675, 0, 3283, +3675, 0, 3197, +3675, 0, 3048, +3675, 0, 2718, +3675, 0, 0, +3675, 0, 0, +3675, 3061, 0, +3808, 3546, 0, +3941, 3832, 0, +4074, 4053, 0, +4095, 4095, 0, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3581, +3812, 0, 3580, +3812, 0, 3580, +3812, 0, 3579, +3812, 0, 3579, +3812, 0, 3577, +3812, 0, 3576, +3811, 0, 3574, +3811, 0, 3572, +3810, 0, 3569, +3810, 0, 3564, +3809, 0, 3558, +3808, 0, 3550, +3808, 0, 3536, +3808, 0, 3517, +3808, 0, 3490, +3808, 0, 3451, +3808, 0, 3393, +3808, 0, 3302, +3808, 0, 3143, +3808, 0, 2767, +3808, 0, 0, +3808, 0, 0, +3808, 3180, 0, +3941, 3674, 0, +4074, 3962, 0, +4095, 4095, 0, +3944, 0, 3704, +3944, 0, 3704, +3944, 0, 3704, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3703, +3944, 0, 3702, +3944, 0, 3702, +3944, 0, 3701, +3944, 0, 3700, +3944, 0, 3699, +3943, 0, 3697, +3943, 0, 3694, +3943, 0, 3691, +3942, 0, 3686, +3941, 0, 3680, +3941, 0, 3669, +3941, 0, 3655, +3941, 0, 3635, +3941, 0, 3608, +3941, 0, 3568, +3941, 0, 3507, +3941, 0, 3413, +3941, 0, 3244, +3941, 0, 2826, +3941, 0, 0, +3941, 0, 0, +3941, 3302, 0, +4074, 3802, 0, +4095, 4092, 0, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3828, +4076, 0, 3827, +4076, 0, 3827, +4076, 0, 3826, +4076, 0, 3826, +4076, 0, 3824, +4076, 0, 3823, +4075, 0, 3821, +4075, 0, 3818, +4075, 0, 3815, +4074, 0, 3810, +4074, 0, 3803, +4074, 0, 3792, +4074, 0, 3777, +4074, 0, 3757, +4074, 0, 3729, +4074, 0, 3688, +4074, 0, 3626, +4074, 0, 3528, +4074, 0, 3351, +4074, 0, 2893, +4074, 0, 0, +4074, 0, 0, +4074, 3426, 0, +4095, 3932, 0, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3955, +4095, 0, 3954, +4095, 0, 3954, +4095, 0, 3954, +4095, 0, 3953, +4095, 0, 3952, +4095, 0, 3951, +4095, 0, 3950, +4095, 0, 3948, +4095, 0, 3945, +4095, 0, 3942, +4095, 0, 3936, +4095, 0, 3928, +4095, 0, 3917, +4095, 0, 3903, +4095, 0, 3882, +4095, 0, 3853, +4095, 0, 3811, +4095, 0, 3748, +4095, 0, 3648, +4095, 0, 3465, +4095, 0, 2973, +4095, 0, 0, +4095, 0, 0, +4095, 3552, 0, +0, 2222, 2491, +0, 2224, 2491, +0, 2226, 2491, +0, 2230, 2491, +0, 2234, 2491, +0, 2239, 2491, +0, 2247, 2491, +0, 2256, 2491, +0, 2269, 2491, +0, 2285, 2491, +0, 2306, 2491, +0, 2333, 2491, +0, 2367, 2491, +0, 2408, 2491, +0, 2458, 2491, +0, 2491, 2463, +0, 2491, 2371, +0, 2491, 2209, +0, 2491, 1822, +0, 2623, 0, +0, 2755, 0, +1472, 2887, 0, +2220, 3019, 0, +2554, 3152, 0, +2793, 3284, 0, +2992, 3416, 0, +3168, 3548, 0, +3330, 3680, 0, +3484, 3812, 0, +3631, 3944, 0, +3774, 4076, 0, +3915, 4095, 0, +0, 2220, 2491, +0, 2223, 2491, +0, 2225, 2491, +0, 2228, 2491, +0, 2233, 2491, +0, 2238, 2491, +0, 2245, 2491, +0, 2255, 2491, +0, 2268, 2491, +0, 2284, 2491, +0, 2305, 2491, +0, 2332, 2491, +0, 2366, 2491, +0, 2407, 2491, +0, 2457, 2491, +0, 2491, 2464, +0, 2491, 2372, +0, 2491, 2210, +0, 2491, 1824, +0, 2623, 0, +0, 2755, 0, +1483, 2887, 0, +2222, 3019, 0, +2555, 3152, 0, +2793, 3283, 0, +2992, 3416, 0, +3168, 3548, 0, +3331, 3680, 0, +3484, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2218, 2491, +0, 2220, 2491, +0, 2223, 2490, +0, 2226, 2490, +0, 2230, 2490, +0, 2236, 2490, +0, 2243, 2490, +0, 2253, 2490, +0, 2266, 2490, +0, 2283, 2490, +0, 2304, 2490, +0, 2331, 2490, +0, 2364, 2490, +0, 2406, 2490, +0, 2456, 2490, +0, 2490, 2464, +0, 2490, 2373, +0, 2490, 2211, +0, 2490, 1826, +0, 2623, 0, +0, 2755, 0, +1497, 2887, 0, +2225, 3019, 0, +2556, 3152, 0, +2794, 3283, 0, +2992, 3416, 0, +3168, 3548, 0, +3331, 3680, 0, +3484, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2215, 2491, +0, 2217, 2491, +0, 2220, 2490, +0, 2223, 2490, +0, 2228, 2490, +0, 2234, 2490, +0, 2241, 2490, +0, 2251, 2490, +0, 2264, 2490, +0, 2280, 2490, +0, 2302, 2490, +0, 2329, 2490, +0, 2362, 2490, +0, 2404, 2490, +0, 2454, 2490, +0, 2490, 2465, +0, 2490, 2374, +0, 2490, 2213, +0, 2490, 1830, +0, 2622, 0, +0, 2755, 0, +1516, 2887, 0, +2229, 3019, 0, +2558, 3151, 0, +2795, 3283, 0, +2993, 3416, 0, +3169, 3548, 0, +3331, 3680, 0, +3485, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2210, 2491, +0, 2212, 2491, +0, 2215, 2490, +0, 2219, 2490, +0, 2224, 2489, +0, 2230, 2489, +0, 2238, 2489, +0, 2247, 2489, +0, 2260, 2489, +0, 2277, 2489, +0, 2298, 2489, +0, 2326, 2489, +0, 2360, 2489, +0, 2401, 2489, +0, 2452, 2489, +0, 2489, 2466, +0, 2489, 2375, +0, 2489, 2215, +0, 2489, 1834, +0, 2622, 0, +0, 2755, 0, +1540, 2887, 0, +2234, 3019, 0, +2560, 3151, 0, +2797, 3283, 0, +2994, 3416, 0, +3170, 3548, 0, +3332, 3680, 0, +3485, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3915, 4095, 0, +0, 2204, 2491, +0, 2206, 2491, +0, 2209, 2490, +0, 2213, 2490, +0, 2219, 2489, +0, 2226, 2489, +0, 2233, 2489, +0, 2243, 2489, +0, 2256, 2489, +0, 2273, 2489, +0, 2294, 2489, +0, 2322, 2489, +0, 2356, 2489, +0, 2398, 2489, +0, 2449, 2489, +0, 2489, 2468, +0, 2489, 2377, +0, 2489, 2218, +0, 2489, 1840, +0, 2621, 0, +0, 2754, 0, +1569, 2887, 0, +2241, 3019, 0, +2564, 3151, 0, +2799, 3283, 0, +2996, 3416, 0, +3171, 3548, 0, +3332, 3680, 0, +3485, 3812, 0, +3632, 3944, 0, +3775, 4076, 0, +3916, 4095, 0, +0, 2196, 2491, +0, 2199, 2491, +0, 2202, 2490, +0, 2206, 2490, +0, 2211, 2489, +0, 2218, 2489, +0, 2227, 2488, +0, 2237, 2488, +0, 2250, 2488, +0, 2267, 2488, +0, 2289, 2488, +0, 2317, 2488, +0, 2352, 2488, +0, 2394, 2488, +0, 2445, 2488, +0, 2488, 2470, +0, 2488, 2379, +0, 2488, 2221, +0, 2488, 1848, +0, 2621, 0, +0, 2754, 0, +1606, 2886, 0, +2249, 3018, 0, +2568, 3151, 0, +2801, 3283, 0, +2997, 3415, 0, +3172, 3548, 0, +3333, 3680, 0, +3486, 3812, 0, +3633, 3944, 0, +3776, 4076, 0, +3916, 4095, 0, +0, 2185, 2491, +0, 2187, 2491, +0, 2190, 2490, +0, 2195, 2490, +0, 2200, 2489, +0, 2207, 2489, +0, 2217, 2488, +0, 2229, 2487, +0, 2242, 2487, +0, 2260, 2487, +0, 2282, 2487, +0, 2310, 2487, +0, 2345, 2487, +0, 2388, 2487, +0, 2440, 2487, +0, 2487, 2473, +0, 2487, 2383, +0, 2487, 2226, +0, 2487, 1859, +0, 2620, 0, +0, 2753, 0, +1651, 2886, 0, +2261, 3018, 0, +2573, 3151, 0, +2805, 3283, 0, +2999, 3415, 0, +3173, 3548, 0, +3334, 3680, 0, +3487, 3812, 0, +3633, 3944, 0, +3776, 4076, 0, +3916, 4095, 0, +0, 2170, 2491, +0, 2172, 2491, +0, 2175, 2490, +0, 2180, 2490, +0, 2185, 2489, +0, 2193, 2489, +0, 2202, 2488, +0, 2215, 2487, +0, 2231, 2486, +0, 2249, 2486, +0, 2272, 2486, +0, 2301, 2486, +0, 2336, 2486, +0, 2380, 2486, +0, 2433, 2486, +0, 2486, 2476, +0, 2486, 2387, +0, 2486, 2232, +0, 2486, 1873, +0, 2619, 0, +0, 2752, 0, +1706, 2885, 0, +2276, 3018, 0, +2581, 3151, 0, +2809, 3283, 0, +3002, 3415, 0, +3175, 3548, 0, +3336, 3680, 0, +3488, 3812, 0, +3634, 3944, 0, +3777, 4076, 0, +3917, 4095, 0, +0, 2149, 2491, +0, 2151, 2491, +0, 2154, 2490, +0, 2159, 2490, +0, 2165, 2489, +0, 2172, 2489, +0, 2183, 2488, +0, 2196, 2487, +0, 2213, 2486, +0, 2235, 2484, +0, 2258, 2484, +0, 2288, 2484, +0, 2325, 2484, +0, 2369, 2484, +0, 2423, 2484, +0, 2484, 2481, +0, 2484, 2393, +0, 2484, 2240, +0, 2484, 1891, +0, 2618, 0, +0, 2751, 0, +1769, 2885, 0, +2294, 3017, 0, +2591, 3150, 0, +2815, 3282, 0, +3006, 3415, 0, +3178, 3547, 0, +3337, 3680, 0, +3489, 3812, 0, +3635, 3944, 0, +3777, 4076, 0, +3917, 4095, 0, +0, 2119, 2491, +0, 2121, 2491, +0, 2125, 2490, +0, 2129, 2490, +0, 2136, 2489, +0, 2144, 2489, +0, 2155, 2488, +0, 2169, 2487, +0, 2187, 2486, +0, 2210, 2484, +0, 2239, 2481, +0, 2270, 2481, +0, 2308, 2481, +0, 2355, 2481, +0, 2410, 2481, +0, 2475, 2481, +0, 2481, 2401, +0, 2481, 2251, +0, 2481, 1913, +0, 2616, 0, +0, 2750, 0, +1843, 2883, 0, +2319, 3016, 0, +2604, 3150, 0, +2823, 3282, 0, +3011, 3414, 0, +3182, 3547, 0, +3340, 3679, 0, +3491, 3812, 0, +3636, 3944, 0, +3778, 4076, 0, +3918, 4095, 0, +0, 2075, 2491, +0, 2078, 2491, +0, 2082, 2490, +0, 2087, 2490, +0, 2094, 2489, +0, 2103, 2489, +0, 2115, 2488, +0, 2130, 2487, +0, 2149, 2486, +0, 2174, 2484, +0, 2206, 2481, +0, 2245, 2478, +0, 2285, 2478, +0, 2334, 2478, +0, 2392, 2478, +0, 2460, 2478, +0, 2478, 2411, +0, 2478, 2264, +0, 2478, 1941, +0, 2613, 0, +0, 2748, 0, +1925, 2882, 0, +2350, 3015, 0, +2620, 3149, 0, +2833, 3281, 0, +3018, 3414, 0, +3186, 3547, 0, +3343, 3679, 0, +3493, 3812, 0, +3638, 3944, 0, +3780, 4076, 0, +3919, 4095, 0, +0, 2009, 2491, +0, 2013, 2491, +0, 2017, 2490, +0, 2023, 2490, +0, 2031, 2489, +0, 2041, 2489, +0, 2055, 2488, +0, 2072, 2487, +0, 2094, 2486, +0, 2122, 2484, +0, 2158, 2481, +0, 2201, 2478, +0, 2253, 2473, +0, 2305, 2473, +0, 2366, 2473, +0, 2438, 2473, +0, 2473, 2423, +0, 2473, 2282, +0, 2473, 1977, +0, 2610, 0, +678, 2746, 0, +2016, 2880, 0, +2388, 3014, 0, +2642, 3148, 0, +2847, 3280, 0, +3027, 3414, 0, +3192, 3546, 0, +3348, 3679, 0, +3496, 3811, 0, +3640, 3944, 0, +3781, 4076, 0, +3920, 4095, 0, +0, 1903, 2491, +0, 1907, 2491, +0, 1913, 2490, +0, 1920, 2490, +0, 1930, 2489, +0, 1943, 2489, +0, 1960, 2488, +0, 1981, 2487, +0, 2008, 2486, +0, 2042, 2484, +0, 2084, 2481, +0, 2134, 2478, +0, 2194, 2473, +477, 2263, 2467, +477, 2330, 2467, +477, 2407, 2467, +477, 2467, 2440, +477, 2467, 2305, +477, 2467, 2021, +0, 2605, 705, +1463, 2742, 0, +2115, 2878, 0, +2434, 3012, 0, +2669, 3146, 0, +2865, 3280, 0, +3039, 3413, 0, +3201, 3546, 0, +3354, 3678, 0, +3501, 3811, 0, +3644, 3943, 0, +3784, 4076, 0, +3922, 4095, 0, +0, 1706, 2491, +0, 1713, 2491, +0, 1722, 2490, +0, 1733, 2490, +0, 1748, 2489, +0, 1767, 2489, +0, 1791, 2488, +0, 1822, 2487, +0, 1859, 2486, +0, 1906, 2484, +0, 1961, 2481, +0, 2026, 2478, +0, 2100, 2473, +477, 2184, 2467, +1401, 2276, 2459, +1401, 2362, 2459, +1401, 2455, 2459, +1401, 2459, 2334, +1401, 2459, 2073, +611, 2599, 1236, +1799, 2738, 0, +2220, 2874, 0, +2489, 3010, 0, +2703, 3144, 0, +2886, 3278, 0, +3055, 3412, 0, +3211, 3545, 0, +3361, 3678, 0, +3506, 3810, 0, +3648, 3943, 0, +3787, 4075, 0, +3924, 4095, 0, +0, 1120, 2491, +0, 1143, 2491, +0, 1173, 2490, +0, 1210, 2490, +0, 1255, 2489, +0, 1310, 2489, +0, 1373, 2488, +0, 1446, 2487, +0, 1529, 2486, +0, 1620, 2484, +0, 1719, 2481, +0, 1824, 2478, +0, 1935, 2473, +477, 2051, 2467, +1401, 2171, 2459, +1751, 2293, 2447, +1751, 2401, 2447, +1751, 2447, 2370, +1751, 2447, 2135, +1533, 2591, 1533, +2040, 2731, 738, +2332, 2870, 0, +2554, 3006, 0, +2744, 3142, 0, +2915, 3276, 0, +3074, 3410, 0, +3225, 3544, 0, +3371, 3677, 0, +3514, 3810, 0, +3653, 3943, 0, +3790, 4075, 0, +3927, 4095, 0, +0, 0, 2491, +0, 0, 2491, +0, 0, 2490, +0, 0, 2490, +0, 0, 2489, +0, 0, 2489, +0, 0, 2488, +0, 0, 2487, +0, 0, 2486, +0, 0, 2484, +0, 415, 2481, +0, 1199, 2478, +0, 1535, 2473, +477, 1776, 2467, +1401, 1976, 2459, +1751, 2152, 2447, +1997, 2315, 2431, +1997, 2431, 2414, +1997, 2431, 2207, +1981, 2579, 1883, +2240, 2723, 1664, +2447, 2863, 870, +2628, 3002, 0, +2795, 3138, 0, +2950, 3274, 0, +3099, 3408, 0, +3243, 3543, 0, +3385, 3676, 0, +3523, 3809, 0, +3660, 3942, 0, +3796, 4075, 0, +3931, 4095, 0, +0, 0, 2491, +0, 0, 2491, +0, 0, 2490, +0, 0, 2490, +0, 0, 2489, +0, 0, 2489, +0, 0, 2488, +0, 0, 2487, +0, 0, 2486, +0, 0, 2484, +0, 0, 2481, +0, 0, 2478, +557, 0, 2473, +1099, 477, 2467, +1401, 1403, 2459, +1751, 1850, 2447, +1997, 2126, 2431, +2199, 2343, 2409, +2199, 2409, 2288, +2258, 2563, 2129, +2416, 2711, 2015, +2567, 2855, 1796, +2712, 2995, 1006, +2854, 3134, 0, +2993, 3270, 0, +3131, 3406, 0, +3267, 3541, 0, +3402, 3675, 0, +3536, 3808, 0, +3669, 3941, 0, +3803, 4074, 0, +3936, 4095, 0, +1822, 0, 2491, +1824, 0, 2491, +1826, 0, 2490, +1830, 0, 2490, +1834, 0, 2489, +1840, 0, 2489, +1848, 0, 2488, +1859, 0, 2487, +1873, 0, 2486, +1891, 0, 2484, +1913, 0, 2481, +1941, 0, 2478, +1977, 0, 2473, +2021, 477, 2467, +2073, 1401, 2459, +2135, 1751, 2447, +2207, 1997, 2431, +2288, 2199, 2409, +2377, 2377, 2377, +2475, 2541, 2331, +2579, 2696, 2261, +2689, 2843, 2147, +2804, 2987, 1930, +2923, 3128, 1137, +3045, 3266, 0, +3170, 3402, 0, +3296, 3538, 0, +3423, 3673, 0, +3552, 3807, 0, +3682, 3940, 0, +3812, 4073, 0, +3943, 4095, 0, +2340, 0, 2623, +2341, 0, 2623, +2342, 0, 2623, +2343, 0, 2622, +2344, 0, 2622, +2346, 0, 2621, +2349, 0, 2621, +2352, 0, 2620, +2357, 0, 2619, +2363, 0, 2618, +2372, 0, 2616, +2382, 0, 2613, +2396, 0, 2610, +2414, 0, 2605, +2437, 611, 2599, +2466, 1533, 2591, +2502, 1883, 2579, +2545, 2129, 2563, +2541, 2331, 2475, +2541, 2420, 2331, +2696, 2678, 2261, +2797, 2843, 2147, +2890, 2987, 1930, +2991, 3128, 1137, +3097, 3266, 0, +3210, 3402, 0, +3326, 3538, 0, +3447, 3673, 0, +3570, 3807, 0, +3695, 3940, 0, +3822, 4073, 0, +3950, 4095, 0, +2635, 0, 2755, +2635, 0, 2755, +2636, 0, 2755, +2636, 0, 2755, +2637, 0, 2755, +2638, 0, 2754, +2640, 0, 2754, +2641, 0, 2753, +2644, 0, 2752, +2647, 0, 2751, +2651, 0, 2750, +2657, 0, 2748, +2665, 0, 2746, +2675, 0, 2742, +2688, 0, 2738, +2705, 738, 2731, +2723, 1664, 2719, +2711, 2015, 2665, +2696, 2261, 2579, +2696, 2261, 2391, +2696, 2471, 2261, +2843, 2766, 2147, +2984, 2987, 1930, +3067, 3128, 1137, +3159, 3266, 0, +3259, 3402, 0, +3365, 3538, 0, +3477, 3673, 0, +3593, 3807, 0, +3713, 3940, 0, +3835, 4073, 0, +3961, 4095, 0, +2859, 0, 2887, +2859, 0, 2887, +2859, 0, 2887, +2860, 0, 2887, +2860, 0, 2887, +2861, 0, 2887, +2862, 0, 2886, +2863, 0, 2886, +2864, 0, 2885, +2866, 0, 2885, +2869, 0, 2883, +2873, 0, 2882, +2877, 0, 2880, +2878, 0, 2872, +2874, 0, 2856, +2870, 0, 2834, +2863, 870, 2803, +2855, 1796, 2758, +2843, 2147, 2689, +2843, 2147, 2549, +2843, 2147, 2246, +2843, 2532, 2147, +2987, 2862, 1930, +3128, 3101, 1137, +3230, 3266, 0, +3317, 3402, 0, +3411, 3538, 0, +3513, 3673, 0, +3622, 3807, 0, +3735, 3940, 0, +3852, 4073, 0, +3974, 4095, 0, +3019, 0, 2988, +3019, 0, 2987, +3019, 0, 2987, +3019, 0, 2987, +3019, 0, 2986, +3019, 0, 2985, +3018, 0, 2984, +3018, 0, 2982, +3018, 0, 2980, +3017, 0, 2977, +3016, 0, 2974, +3015, 0, 2968, +3014, 0, 2961, +3012, 0, 2952, +3010, 0, 2939, +3006, 0, 2920, +3002, 0, 2895, +2995, 1006, 2858, +2987, 1930, 2804, +2987, 1930, 2699, +2987, 1930, 2503, +2987, 1930, 1930, +2987, 2602, 1930, +3128, 2965, 1137, +3266, 3216, 0, +3384, 3402, 0, +3467, 3538, 0, +3558, 3673, 0, +3657, 3807, 0, +3763, 3940, 0, +3874, 4073, 0, +3990, 4095, 0, +3152, 0, 3071, +3152, 0, 3070, +3152, 0, 3070, +3151, 0, 3070, +3151, 0, 3069, +3151, 0, 3068, +3151, 0, 3067, +3151, 0, 3066, +3151, 0, 3064, +3150, 0, 3062, +3150, 0, 3059, +3149, 0, 3055, +3148, 0, 3049, +3146, 0, 3041, +3144, 0, 3030, +3142, 0, 3015, +3138, 0, 2995, +3134, 0, 2965, +3128, 1137, 2923, +3128, 1137, 2845, +3128, 1137, 2712, +3128, 1137, 2436, +3128, 1758, 1137, +3128, 2681, 1137, +3266, 3074, 0, +3402, 3335, 0, +3532, 3538, 0, +3612, 3673, 0, +3701, 3807, 0, +3798, 3940, 0, +3902, 4073, 0, +4012, 4095, 0, +3284, 0, 3162, +3283, 0, 3162, +3283, 0, 3161, +3283, 0, 3161, +3283, 0, 3160, +3283, 0, 3160, +3283, 0, 3159, +3283, 0, 3158, +3283, 0, 3157, +3282, 0, 3155, +3282, 0, 3152, +3281, 0, 3149, +3280, 0, 3144, +3280, 0, 3138, +3278, 0, 3129, +3276, 0, 3117, +3274, 0, 3100, +3270, 0, 3078, +3266, 0, 3045, +3266, 0, 2986, +3266, 0, 2893, +3266, 0, 2727, +3266, 0, 2327, +3266, 1375, 0, +3266, 2770, 0, +3402, 3189, 0, +3538, 3457, 0, +3673, 3670, 0, +3754, 3807, 0, +3841, 3940, 0, +3937, 4073, 0, +4039, 4095, 0, +3416, 0, 3261, +3416, 0, 3261, +3416, 0, 3260, +3416, 0, 3260, +3416, 0, 3260, +3416, 0, 3259, +3415, 0, 3259, +3415, 0, 3258, +3415, 0, 3257, +3415, 0, 3255, +3414, 0, 3253, +3414, 0, 3250, +3414, 0, 3247, +3413, 0, 3242, +3412, 0, 3234, +3410, 0, 3225, +3408, 0, 3212, +3406, 0, 3194, +3402, 0, 3170, +3402, 0, 3125, +3402, 0, 3059, +3402, 0, 2951, +3402, 0, 2749, +3402, 0, 2121, +3402, 0, 0, +3402, 2866, 0, +3538, 3307, 0, +3673, 3582, 0, +3807, 3797, 0, +3893, 3940, 0, +3979, 4073, 0, +4073, 4095, 0, +3548, 0, 3367, +3548, 0, 3367, +3548, 0, 3366, +3548, 0, 3366, +3548, 0, 3366, +3548, 0, 3365, +3548, 0, 3365, +3548, 0, 3364, +3548, 0, 3363, +3547, 0, 3362, +3547, 0, 3361, +3547, 0, 3358, +3546, 0, 3355, +3546, 0, 3351, +3545, 0, 3346, +3544, 0, 3339, +3543, 0, 3329, +3541, 0, 3315, +3538, 0, 3296, +3538, 0, 3263, +3538, 0, 3214, +3538, 0, 3140, +3538, 0, 3018, +3538, 0, 2775, +3538, 0, 1477, +3538, 0, 0, +3538, 2970, 0, +3673, 3429, 0, +3807, 3708, 0, +3940, 3926, 0, +4030, 4073, 0, +4095, 4095, 0, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3478, +3680, 0, 3477, +3680, 0, 3477, +3680, 0, 3476, +3680, 0, 3475, +3680, 0, 3475, +3679, 0, 3473, +3679, 0, 3472, +3679, 0, 3469, +3678, 0, 3466, +3678, 0, 3462, +3677, 0, 3456, +3676, 0, 3448, +3675, 0, 3438, +3673, 0, 3423, +3673, 0, 3399, +3673, 0, 3363, +3673, 0, 3311, +3673, 0, 3231, +3673, 0, 3095, +3673, 0, 2809, +3673, 0, 0, +3673, 0, 0, +3673, 3079, 0, +3807, 3552, 0, +3940, 3836, 0, +4073, 4055, 0, +4095, 4095, 0, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3594, +3812, 0, 3593, +3812, 0, 3593, +3812, 0, 3593, +3812, 0, 3592, +3812, 0, 3591, +3812, 0, 3590, +3812, 0, 3589, +3811, 0, 3587, +3811, 0, 3585, +3810, 0, 3582, +3810, 0, 3577, +3809, 0, 3571, +3808, 0, 3563, +3807, 0, 3552, +3807, 0, 3534, +3807, 0, 3508, +3807, 0, 3470, +3807, 0, 3415, +3807, 0, 3329, +3807, 0, 3181, +3807, 0, 2850, +3807, 0, 0, +3807, 0, 0, +3807, 3194, 0, +3940, 3678, 0, +4073, 3964, 0, +4095, 4095, 0, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3713, +3944, 0, 3712, +3944, 0, 3712, +3944, 0, 3711, +3944, 0, 3711, +3944, 0, 3710, +3944, 0, 3708, +3943, 0, 3706, +3943, 0, 3704, +3943, 0, 3701, +3942, 0, 3696, +3941, 0, 3690, +3940, 0, 3682, +3940, 0, 3668, +3940, 0, 3649, +3940, 0, 3622, +3940, 0, 3583, +3940, 0, 3525, +3940, 0, 3434, +3940, 0, 3275, +3940, 0, 2899, +3940, 0, 0, +3940, 0, 0, +3940, 3312, 0, +4073, 3805, 0, +4095, 4094, 0, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3836, +4076, 0, 3835, +4076, 0, 3835, +4076, 0, 3835, +4076, 0, 3835, +4076, 0, 3834, +4076, 0, 3834, +4076, 0, 3833, +4076, 0, 3832, +4076, 0, 3830, +4075, 0, 3829, +4075, 0, 3826, +4075, 0, 3823, +4074, 0, 3818, +4073, 0, 3812, +4073, 0, 3801, +4073, 0, 3787, +4073, 0, 3768, +4073, 0, 3740, +4073, 0, 3700, +4073, 0, 3640, +4073, 0, 3545, +4073, 0, 3376, +4073, 0, 2957, +4073, 0, 0, +4073, 0, 0, +4073, 3434, 0, +4095, 3935, 0, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3961, +4095, 0, 3960, +4095, 0, 3960, +4095, 0, 3960, +4095, 0, 3959, +4095, 0, 3959, +4095, 0, 3958, +4095, 0, 3957, +4095, 0, 3955, +4095, 0, 3953, +4095, 0, 3951, +4095, 0, 3947, +4095, 0, 3943, +4095, 0, 3935, +4095, 0, 3924, +4095, 0, 3910, +4095, 0, 3890, +4095, 0, 3861, +4095, 0, 3820, +4095, 0, 3759, +4095, 0, 3661, +4095, 0, 3484, +4095, 0, 3027, +4095, 0, 0, +4095, 0, 0, +4095, 3558, 0, +0, 2354, 2623, +0, 2355, 2623, +0, 2357, 2623, +0, 2359, 2623, +0, 2363, 2623, +0, 2367, 2623, +0, 2372, 2623, +0, 2380, 2623, +0, 2390, 2623, +0, 2402, 2623, +0, 2419, 2623, +0, 2440, 2623, +0, 2466, 2623, +0, 2500, 2623, +0, 2541, 2623, +0, 2590, 2623, +0, 2623, 2595, +0, 2623, 2503, +0, 2623, 2340, +0, 2623, 1952, +0, 2755, 0, +0, 2887, 0, +1594, 3019, 0, +2352, 3152, 0, +2684, 3284, 0, +2925, 3416, 0, +3124, 3548, 0, +3300, 3680, 0, +3462, 3812, 0, +3616, 3944, 0, +3763, 4076, 0, +3907, 4095, 0, +0, 2352, 2623, +0, 2354, 2623, +0, 2356, 2623, +0, 2358, 2623, +0, 2362, 2623, +0, 2366, 2623, +0, 2372, 2623, +0, 2379, 2623, +0, 2388, 2623, +0, 2401, 2623, +0, 2417, 2623, +0, 2439, 2623, +0, 2465, 2623, +0, 2499, 2623, +0, 2540, 2623, +0, 2590, 2623, +0, 2623, 2595, +0, 2623, 2503, +0, 2623, 2341, +0, 2623, 1954, +0, 2755, 0, +0, 2887, 0, +1602, 3019, 0, +2353, 3152, 0, +2685, 3283, 0, +2925, 3416, 0, +3124, 3548, 0, +3300, 3680, 0, +3462, 3812, 0, +3616, 3944, 0, +3763, 4076, 0, +3907, 4095, 0, +0, 2351, 2623, +0, 2352, 2623, +0, 2355, 2623, +0, 2357, 2623, +0, 2360, 2623, +0, 2364, 2623, +0, 2370, 2623, +0, 2378, 2623, +0, 2387, 2623, +0, 2400, 2623, +0, 2416, 2623, +0, 2437, 2623, +0, 2464, 2623, +0, 2498, 2623, +0, 2539, 2623, +0, 2589, 2623, +0, 2623, 2596, +0, 2623, 2504, +0, 2623, 2342, +0, 2623, 1956, +0, 2755, 0, +0, 2887, 0, +1613, 3019, 0, +2355, 3152, 0, +2686, 3283, 0, +2926, 3416, 0, +3124, 3548, 0, +3300, 3680, 0, +3463, 3812, 0, +3616, 3944, 0, +3763, 4076, 0, +3907, 4095, 0, +0, 2348, 2623, +0, 2350, 2623, +0, 2352, 2623, +0, 2355, 2622, +0, 2358, 2622, +0, 2362, 2622, +0, 2368, 2622, +0, 2375, 2622, +0, 2385, 2622, +0, 2398, 2622, +0, 2414, 2622, +0, 2436, 2622, +0, 2463, 2622, +0, 2496, 2622, +0, 2538, 2622, +0, 2588, 2622, +0, 2622, 2596, +0, 2622, 2505, +0, 2622, 2343, +0, 2622, 1958, +0, 2755, 0, +0, 2887, 0, +1628, 3019, 0, +2358, 3151, 0, +2688, 3283, 0, +2927, 3416, 0, +3125, 3548, 0, +3301, 3680, 0, +3463, 3812, 0, +3616, 3944, 0, +3764, 4076, 0, +3907, 4095, 0, +0, 2345, 2623, +0, 2347, 2623, +0, 2349, 2623, +0, 2352, 2622, +0, 2356, 2622, +0, 2360, 2622, +0, 2366, 2622, +0, 2373, 2622, +0, 2383, 2622, +0, 2396, 2622, +0, 2412, 2622, +0, 2434, 2622, +0, 2460, 2622, +0, 2494, 2622, +0, 2536, 2622, +0, 2586, 2622, +0, 2622, 2597, +0, 2622, 2506, +0, 2622, 2344, +0, 2622, 1962, +0, 2755, 0, +0, 2887, 0, +1646, 3019, 0, +2362, 3151, 0, +2690, 3283, 0, +2928, 3416, 0, +3125, 3548, 0, +3301, 3680, 0, +3463, 3812, 0, +3617, 3944, 0, +3764, 4076, 0, +3907, 4095, 0, +0, 2341, 2623, +0, 2342, 2623, +0, 2345, 2623, +0, 2347, 2622, +0, 2351, 2622, +0, 2356, 2621, +0, 2362, 2621, +0, 2370, 2621, +0, 2380, 2621, +0, 2393, 2621, +0, 2409, 2621, +0, 2431, 2621, +0, 2458, 2621, +0, 2492, 2621, +0, 2533, 2621, +0, 2584, 2621, +0, 2621, 2598, +0, 2621, 2507, +0, 2621, 2346, +0, 2621, 1966, +0, 2754, 0, +0, 2887, 0, +1670, 3019, 0, +2367, 3151, 0, +2692, 3283, 0, +2929, 3416, 0, +3126, 3548, 0, +3302, 3680, 0, +3464, 3812, 0, +3617, 3944, 0, +3764, 4076, 0, +3908, 4095, 0, +0, 2335, 2623, +0, 2336, 2623, +0, 2338, 2623, +0, 2341, 2622, +0, 2346, 2622, +0, 2351, 2621, +0, 2357, 2621, +0, 2365, 2621, +0, 2375, 2621, +0, 2388, 2621, +0, 2405, 2621, +0, 2427, 2621, +0, 2454, 2621, +0, 2488, 2621, +0, 2530, 2621, +0, 2581, 2621, +0, 2621, 2600, +0, 2621, 2509, +0, 2621, 2349, +0, 2621, 1972, +0, 2754, 0, +0, 2886, 0, +1700, 3018, 0, +2373, 3151, 0, +2695, 3283, 0, +2931, 3415, 0, +3128, 3548, 0, +3303, 3680, 0, +3464, 3812, 0, +3617, 3944, 0, +3764, 4076, 0, +3908, 4095, 0, +0, 2327, 2623, +0, 2328, 2623, +0, 2331, 2623, +0, 2334, 2622, +0, 2337, 2622, +0, 2343, 2621, +0, 2350, 2621, +0, 2359, 2620, +0, 2369, 2620, +0, 2382, 2620, +0, 2399, 2620, +0, 2421, 2620, +0, 2449, 2620, +0, 2483, 2620, +0, 2526, 2620, +0, 2577, 2620, +0, 2620, 2602, +0, 2620, 2511, +0, 2620, 2352, +0, 2620, 1981, +0, 2753, 0, +0, 2886, 0, +1737, 3018, 0, +2382, 3151, 0, +2700, 3283, 0, +2934, 3415, 0, +3129, 3548, 0, +3304, 3680, 0, +3465, 3812, 0, +3618, 3944, 0, +3765, 4076, 0, +3908, 4095, 0, +0, 2315, 2623, +0, 2317, 2623, +0, 2320, 2623, +0, 2323, 2622, +0, 2327, 2622, +0, 2332, 2621, +0, 2339, 2621, +0, 2348, 2620, +0, 2361, 2619, +0, 2374, 2619, +0, 2392, 2619, +0, 2414, 2619, +0, 2442, 2619, +0, 2477, 2619, +0, 2520, 2619, +0, 2572, 2619, +0, 2619, 2604, +0, 2619, 2515, +0, 2619, 2357, +0, 2619, 1991, +0, 2752, 0, +0, 2885, 0, +1782, 3018, 0, +2394, 3151, 0, +2705, 3283, 0, +2937, 3415, 0, +3132, 3548, 0, +3305, 3680, 0, +3466, 3812, 0, +3619, 3944, 0, +3765, 4076, 0, +3908, 4095, 0, +0, 2300, 2623, +0, 2302, 2623, +0, 2304, 2623, +0, 2308, 2622, +0, 2312, 2622, +0, 2317, 2621, +0, 2325, 2621, +0, 2334, 2620, +0, 2347, 2619, +0, 2363, 2618, +0, 2381, 2618, +0, 2404, 2618, +0, 2432, 2618, +0, 2469, 2618, +0, 2512, 2618, +0, 2565, 2618, +0, 2618, 2608, +0, 2618, 2519, +0, 2618, 2363, +0, 2618, 2005, +0, 2751, 0, +0, 2885, 0, +1837, 3017, 0, +2408, 3150, 0, +2713, 3282, 0, +2942, 3415, 0, +3135, 3547, 0, +3307, 3680, 0, +3468, 3812, 0, +3620, 3944, 0, +3766, 4076, 0, +3909, 4095, 0, +0, 2278, 2623, +0, 2281, 2623, +0, 2283, 2623, +0, 2287, 2622, +0, 2291, 2622, +0, 2297, 2621, +0, 2304, 2621, +0, 2314, 2620, +0, 2328, 2619, +0, 2345, 2618, +0, 2367, 2616, +0, 2390, 2616, +0, 2420, 2616, +0, 2456, 2616, +0, 2501, 2616, +0, 2555, 2616, +0, 2616, 2613, +0, 2616, 2525, +0, 2616, 2372, +0, 2616, 2022, +0, 2750, 0, +0, 2883, 0, +1900, 3016, 0, +2427, 3150, 0, +2723, 3282, 0, +2947, 3414, 0, +3138, 3547, 0, +3310, 3679, 0, +3469, 3812, 0, +3621, 3944, 0, +3767, 4076, 0, +3910, 4095, 0, +0, 2248, 2623, +0, 2250, 2623, +0, 2253, 2623, +0, 2256, 2622, +0, 2261, 2622, +0, 2268, 2621, +0, 2276, 2621, +0, 2287, 2620, +0, 2301, 2619, +0, 2319, 2618, +0, 2342, 2616, +0, 2371, 2613, +0, 2402, 2613, +0, 2440, 2613, +0, 2487, 2613, +0, 2542, 2613, +0, 2607, 2613, +0, 2613, 2533, +0, 2613, 2382, +0, 2613, 2045, +0, 2748, 0, +0, 2882, 0, +1974, 3015, 0, +2452, 3149, 0, +2735, 3281, 0, +2956, 3414, 0, +3144, 3547, 0, +3314, 3679, 0, +3472, 3812, 0, +3623, 3944, 0, +3768, 4076, 0, +3910, 4095, 0, +0, 2205, 2623, +0, 2207, 2623, +0, 2210, 2623, +0, 2214, 2622, +0, 2219, 2622, +0, 2226, 2621, +0, 2235, 2621, +0, 2247, 2620, +0, 2262, 2619, +0, 2281, 2618, +0, 2306, 2616, +0, 2338, 2613, +0, 2377, 2610, +0, 2417, 2610, +0, 2466, 2610, +0, 2524, 2610, +0, 2592, 2610, +0, 2610, 2543, +0, 2610, 2396, +0, 2610, 2073, +0, 2746, 0, +0, 2880, 0, +2056, 3014, 0, +2482, 3148, 0, +2752, 3280, 0, +2966, 3414, 0, +3151, 3546, 0, +3318, 3679, 0, +3475, 3811, 0, +3625, 3944, 0, +3770, 4076, 0, +3912, 4095, 0, +0, 2138, 2623, +0, 2141, 2623, +0, 2144, 2623, +0, 2149, 2622, +0, 2155, 2622, +0, 2163, 2621, +0, 2173, 2621, +0, 2187, 2620, +0, 2204, 2619, +0, 2226, 2618, +0, 2255, 2616, +0, 2290, 2613, +0, 2333, 2610, +0, 2385, 2605, +0, 2437, 2605, +0, 2498, 2605, +0, 2570, 2605, +0, 2605, 2556, +0, 2605, 2414, +0, 2605, 2109, +0, 2742, 0, +817, 2878, 0, +2148, 3012, 0, +2521, 3146, 0, +2773, 3280, 0, +2979, 3413, 0, +3160, 3546, 0, +3325, 3678, 0, +3480, 3811, 0, +3628, 3943, 0, +3773, 4076, 0, +3913, 4095, 0, +0, 2032, 2623, +0, 2035, 2623, +0, 2039, 2623, +0, 2045, 2622, +0, 2052, 2622, +0, 2062, 2621, +0, 2075, 2621, +0, 2092, 2620, +0, 2113, 2619, +0, 2140, 2618, +0, 2174, 2616, +0, 2216, 2613, +0, 2266, 2610, +0, 2326, 2605, +611, 2395, 2599, +611, 2462, 2599, +611, 2538, 2599, +611, 2599, 2572, +611, 2599, 2437, +611, 2599, 2153, +0, 2738, 817, +1596, 2874, 0, +2247, 3010, 0, +2566, 3144, 0, +2800, 3278, 0, +2997, 3412, 0, +3171, 3545, 0, +3333, 3678, 0, +3486, 3810, 0, +3632, 3943, 0, +3776, 4075, 0, +3916, 4095, 0, +0, 1833, 2623, +0, 1838, 2623, +0, 1845, 2623, +0, 1853, 2622, +0, 1865, 2622, +0, 1880, 2621, +0, 1899, 2621, +0, 1923, 2620, +0, 1954, 2619, +0, 1991, 2618, +0, 2038, 2616, +0, 2093, 2613, +0, 2158, 2610, +0, 2233, 2605, +611, 2316, 2599, +1533, 2408, 2591, +1533, 2493, 2591, +1533, 2587, 2591, +1533, 2591, 2466, +1533, 2591, 2206, +738, 2731, 1362, +1932, 2870, 0, +2352, 3006, 0, +2622, 3142, 0, +2834, 3276, 0, +3019, 3410, 0, +3186, 3544, 0, +3344, 3677, 0, +3493, 3810, 0, +3638, 3943, 0, +3780, 4075, 0, +3919, 4095, 0, +0, 1232, 2623, +0, 1251, 2623, +0, 1275, 2623, +0, 1304, 2622, +0, 1342, 2622, +0, 1387, 2621, +0, 1441, 2621, +0, 1505, 2620, +0, 1578, 2619, +0, 1661, 2618, +0, 1752, 2616, +0, 1851, 2613, +0, 1956, 2610, +0, 2067, 2605, +611, 2183, 2599, +1533, 2303, 2591, +1883, 2425, 2579, +1883, 2533, 2579, +1883, 2579, 2502, +1883, 2579, 2267, +1667, 2723, 1664, +2173, 2863, 870, +2463, 3002, 0, +2687, 3138, 0, +2876, 3274, 0, +3047, 3408, 0, +3206, 3543, 0, +3358, 3676, 0, +3503, 3809, 0, +3646, 3942, 0, +3785, 4075, 0, +3923, 4095, 0, +0, 0, 2623, +0, 0, 2623, +0, 0, 2623, +0, 0, 2622, +0, 0, 2622, +0, 0, 2621, +0, 0, 2621, +0, 0, 2620, +0, 0, 2619, +0, 0, 2618, +0, 0, 2616, +0, 547, 2613, +0, 1330, 2610, +0, 1667, 2605, +611, 1908, 2599, +1533, 2108, 2591, +1883, 2284, 2579, +2129, 2447, 2563, +2129, 2563, 2545, +2129, 2563, 2339, +2114, 2711, 2015, +2372, 2855, 1796, +2579, 2995, 1006, +2761, 3134, 0, +2926, 3270, 0, +3082, 3406, 0, +3231, 3541, 0, +3376, 3675, 0, +3517, 3808, 0, +3655, 3941, 0, +3792, 4074, 0, +3928, 4095, 0, +0, 0, 2623, +0, 0, 2623, +0, 0, 2623, +0, 0, 2622, +0, 0, 2622, +0, 0, 2621, +0, 0, 2621, +0, 0, 2620, +0, 0, 2619, +0, 0, 2618, +0, 0, 2616, +0, 0, 2613, +0, 0, 2610, +705, 0, 2605, +1236, 611, 2599, +1533, 1533, 2591, +1883, 1981, 2579, +2129, 2258, 2563, +2331, 2475, 2541, +2331, 2541, 2420, +2391, 2696, 2261, +2549, 2843, 2147, +2699, 2987, 1930, +2845, 3128, 1137, +2986, 3266, 0, +3125, 3402, 0, +3263, 3538, 0, +3399, 3673, 0, +3534, 3807, 0, +3668, 3940, 0, +3801, 4073, 0, +3935, 4095, 0, +1952, 0, 2623, +1954, 0, 2623, +1956, 0, 2623, +1958, 0, 2622, +1962, 0, 2622, +1966, 0, 2621, +1972, 0, 2621, +1981, 0, 2620, +1991, 0, 2619, +2005, 0, 2618, +2022, 0, 2616, +2045, 0, 2613, +2073, 0, 2610, +2109, 0, 2605, +2153, 611, 2599, +2206, 1533, 2591, +2267, 1883, 2579, +2339, 2129, 2563, +2420, 2331, 2541, +2509, 2509, 2509, +2607, 2673, 2463, +2711, 2828, 2393, +2821, 2975, 2280, +2936, 3119, 2061, +3055, 3259, 1272, +3177, 3398, 0, +3302, 3535, 0, +3428, 3670, 0, +3556, 3805, 0, +3684, 3939, 0, +3814, 4072, 0, +3944, 4095, 0, +2473, 0, 2755, +2473, 0, 2755, +2474, 0, 2755, +2475, 0, 2755, +2476, 0, 2755, +2477, 0, 2754, +2479, 0, 2754, +2482, 0, 2753, +2485, 0, 2752, +2490, 0, 2751, +2496, 0, 2750, +2504, 0, 2748, +2515, 0, 2746, +2529, 0, 2742, +2547, 0, 2738, +2570, 738, 2731, +2598, 1664, 2723, +2634, 2015, 2711, +2678, 2261, 2696, +2673, 2463, 2607, +2673, 2552, 2463, +2828, 2810, 2393, +2929, 2975, 2280, +3022, 3119, 2061, +3122, 3259, 1272, +3230, 3398, 0, +3342, 3535, 0, +3459, 3670, 0, +3579, 3805, 0, +3702, 3939, 0, +3827, 4072, 0, +3954, 4095, 0, +2767, 0, 2887, +2767, 0, 2887, +2767, 0, 2887, +2768, 0, 2887, +2768, 0, 2887, +2769, 0, 2887, +2770, 0, 2886, +2772, 0, 2886, +2773, 0, 2885, +2776, 0, 2885, +2779, 0, 2883, +2784, 0, 2882, +2789, 0, 2880, +2797, 0, 2878, +2807, 0, 2874, +2820, 0, 2870, +2837, 870, 2863, +2855, 1796, 2852, +2843, 2147, 2797, +2828, 2393, 2711, +2828, 2393, 2522, +2828, 2603, 2393, +2975, 2898, 2280, +3116, 3119, 2061, +3199, 3259, 1272, +3291, 3398, 0, +3391, 3535, 0, +3497, 3670, 0, +3609, 3805, 0, +3725, 3939, 0, +3845, 4072, 0, +3968, 4095, 0, +2991, 0, 3019, +2991, 0, 3019, +2991, 0, 3019, +2991, 0, 3019, +2992, 0, 3019, +2992, 0, 3019, +2992, 0, 3018, +2993, 0, 3018, +2995, 0, 3018, +2996, 0, 3017, +2998, 0, 3016, +3001, 0, 3015, +3004, 0, 3014, +3009, 0, 3012, +3010, 0, 3004, +3006, 0, 2988, +3002, 0, 2966, +2995, 1006, 2935, +2987, 1930, 2890, +2975, 2280, 2821, +2975, 2280, 2680, +2975, 2280, 2377, +2975, 2664, 2280, +3119, 2995, 2061, +3259, 3233, 1272, +3362, 3398, 0, +3449, 3535, 0, +3543, 3670, 0, +3646, 3805, 0, +3754, 3939, 0, +3867, 4072, 0, +3984, 4095, 0, +3152, 0, 3120, +3152, 0, 3120, +3152, 0, 3120, +3151, 0, 3119, +3151, 0, 3119, +3151, 0, 3118, +3151, 0, 3117, +3151, 0, 3116, +3151, 0, 3115, +3150, 0, 3112, +3150, 0, 3110, +3149, 0, 3106, +3148, 0, 3100, +3146, 0, 3093, +3144, 0, 3084, +3142, 0, 3071, +3138, 0, 3053, +3134, 0, 3027, +3128, 1137, 2991, +3119, 2061, 2936, +3119, 2061, 2831, +3119, 2061, 2636, +3119, 2061, 2064, +3119, 2734, 2061, +3259, 3097, 1272, +3398, 3348, 0, +3516, 3535, 0, +3599, 3670, 0, +3690, 3805, 0, +3790, 3939, 0, +3895, 4072, 0, +4006, 4095, 0, +3284, 0, 3203, +3283, 0, 3203, +3283, 0, 3202, +3283, 0, 3202, +3283, 0, 3201, +3283, 0, 3201, +3283, 0, 3200, +3283, 0, 3199, +3283, 0, 3198, +3282, 0, 3196, +3282, 0, 3194, +3281, 0, 3191, +3280, 0, 3186, +3280, 0, 3180, +3278, 0, 3173, +3276, 0, 3162, +3274, 0, 3147, +3270, 0, 3126, +3266, 0, 3097, +3259, 1272, 3055, +3259, 1272, 2976, +3259, 1272, 2843, +3259, 1272, 2569, +3259, 1899, 1272, +3259, 2813, 1272, +3398, 3206, 0, +3535, 3467, 0, +3664, 3670, 0, +3744, 3805, 0, +3833, 3939, 0, +3930, 4072, 0, +4034, 4095, 0, +3416, 0, 3294, +3416, 0, 3294, +3416, 0, 3294, +3416, 0, 3293, +3416, 0, 3293, +3416, 0, 3293, +3415, 0, 3292, +3415, 0, 3291, +3415, 0, 3290, +3415, 0, 3289, +3414, 0, 3287, +3414, 0, 3284, +3414, 0, 3281, +3413, 0, 3276, +3412, 0, 3270, +3410, 0, 3261, +3408, 0, 3249, +3406, 0, 3233, +3402, 0, 3210, +3398, 0, 3177, +3398, 0, 3118, +3398, 0, 3025, +3398, 0, 2860, +3398, 0, 2458, +3398, 1484, 0, +3398, 2902, 0, +3535, 3321, 0, +3670, 3589, 0, +3805, 3802, 0, +3886, 3939, 0, +3973, 4072, 0, +4069, 4095, 0, +3548, 0, 3393, +3548, 0, 3393, +3548, 0, 3393, +3548, 0, 3393, +3548, 0, 3392, +3548, 0, 3392, +3548, 0, 3392, +3548, 0, 3391, +3548, 0, 3390, +3547, 0, 3389, +3547, 0, 3387, +3547, 0, 3385, +3546, 0, 3382, +3546, 0, 3379, +3545, 0, 3374, +3544, 0, 3367, +3543, 0, 3357, +3541, 0, 3344, +3538, 0, 3326, +3535, 0, 3302, +3535, 0, 3257, +3535, 0, 3190, +3535, 0, 3083, +3535, 0, 2881, +3535, 0, 2256, +3535, 0, 0, +3535, 2998, 0, +3670, 3439, 0, +3805, 3714, 0, +3939, 3929, 0, +4025, 4072, 0, +4095, 4095, 0, +3680, 0, 3499, +3680, 0, 3499, +3680, 0, 3499, +3680, 0, 3499, +3680, 0, 3498, +3680, 0, 3498, +3680, 0, 3497, +3680, 0, 3497, +3680, 0, 3496, +3680, 0, 3495, +3679, 0, 3494, +3679, 0, 3493, +3679, 0, 3490, +3678, 0, 3488, +3678, 0, 3483, +3677, 0, 3478, +3676, 0, 3471, +3675, 0, 3461, +3673, 0, 3447, +3670, 0, 3428, +3670, 0, 3395, +3670, 0, 3346, +3670, 0, 3273, +3670, 0, 3150, +3670, 0, 2908, +3670, 0, 1603, +3670, 0, 0, +3670, 3102, 0, +3805, 3561, 0, +3939, 3840, 0, +4072, 4058, 0, +4095, 4095, 0, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3610, +3812, 0, 3609, +3812, 0, 3609, +3812, 0, 3609, +3812, 0, 3608, +3812, 0, 3607, +3812, 0, 3606, +3812, 0, 3605, +3811, 0, 3604, +3811, 0, 3601, +3810, 0, 3598, +3810, 0, 3594, +3809, 0, 3588, +3808, 0, 3581, +3807, 0, 3570, +3805, 0, 3556, +3805, 0, 3531, +3805, 0, 3495, +3805, 0, 3443, +3805, 0, 3363, +3805, 0, 3227, +3805, 0, 2941, +3805, 0, 0, +3805, 0, 0, +3805, 3211, 0, +3939, 3685, 0, +4072, 3968, 0, +4095, 4095, 0, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3726, +3944, 0, 3725, +3944, 0, 3725, +3944, 0, 3725, +3944, 0, 3725, +3944, 0, 3724, +3944, 0, 3723, +3944, 0, 3722, +3944, 0, 3721, +3943, 0, 3719, +3943, 0, 3717, +3943, 0, 3713, +3942, 0, 3709, +3941, 0, 3703, +3940, 0, 3695, +3939, 0, 3684, +3939, 0, 3666, +3939, 0, 3640, +3939, 0, 3603, +3939, 0, 3547, +3939, 0, 3461, +3939, 0, 3313, +3939, 0, 2982, +3939, 0, 0, +3939, 0, 0, +3939, 3326, 0, +4072, 3810, 0, +4095, 4095, 0, +4076, 0, 3846, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3845, +4076, 0, 3844, +4076, 0, 3843, +4076, 0, 3843, +4076, 0, 3841, +4076, 0, 3840, +4075, 0, 3838, +4075, 0, 3836, +4075, 0, 3833, +4074, 0, 3828, +4073, 0, 3822, +4072, 0, 3814, +4072, 0, 3800, +4072, 0, 3781, +4072, 0, 3754, +4072, 0, 3715, +4072, 0, 3657, +4072, 0, 3566, +4072, 0, 3407, +4072, 0, 3031, +4072, 0, 0, +4072, 0, 0, +4072, 3444, 0, +4095, 3938, 0, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3968, +4095, 0, 3967, +4095, 0, 3967, +4095, 0, 3967, +4095, 0, 3966, +4095, 0, 3965, +4095, 0, 3964, +4095, 0, 3963, +4095, 0, 3961, +4095, 0, 3959, +4095, 0, 3955, +4095, 0, 3950, +4095, 0, 3944, +4095, 0, 3934, +4095, 0, 3920, +4095, 0, 3900, +4095, 0, 3872, +4095, 0, 3832, +4095, 0, 3772, +4095, 0, 3677, +4095, 0, 3509, +4095, 0, 3090, +4095, 0, 0, +4095, 0, 0, +4095, 3566, 0, +0, 2486, 2755, +0, 2487, 2755, +0, 2488, 2755, +0, 2490, 2755, +0, 2493, 2755, +0, 2496, 2755, +0, 2500, 2755, +0, 2505, 2755, +0, 2513, 2755, +0, 2523, 2755, +0, 2535, 2755, +0, 2552, 2755, +0, 2573, 2755, +0, 2599, 2755, +0, 2632, 2755, +0, 2673, 2755, +0, 2723, 2755, +0, 2755, 2727, +0, 2755, 2635, +0, 2755, 2473, +0, 2755, 2083, +0, 2887, 0, +0, 3019, 0, +1720, 3152, 0, +2481, 3284, 0, +2816, 3416, 0, +3056, 3548, 0, +3255, 3680, 0, +3432, 3812, 0, +3594, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2485, 2755, +0, 2486, 2755, +0, 2488, 2755, +0, 2489, 2755, +0, 2492, 2755, +0, 2495, 2755, +0, 2499, 2755, +0, 2505, 2755, +0, 2512, 2755, +0, 2522, 2755, +0, 2535, 2755, +0, 2551, 2755, +0, 2572, 2755, +0, 2598, 2755, +0, 2632, 2755, +0, 2673, 2755, +0, 2723, 2755, +0, 2755, 2727, +0, 2755, 2635, +0, 2755, 2473, +0, 2755, 2084, +0, 2887, 0, +0, 3019, 0, +1726, 3152, 0, +2482, 3283, 0, +2817, 3416, 0, +3057, 3548, 0, +3256, 3680, 0, +3432, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2484, 2755, +0, 2485, 2755, +0, 2486, 2755, +0, 2488, 2755, +0, 2491, 2755, +0, 2494, 2755, +0, 2498, 2755, +0, 2504, 2755, +0, 2511, 2755, +0, 2521, 2755, +0, 2533, 2755, +0, 2550, 2755, +0, 2571, 2755, +0, 2598, 2755, +0, 2631, 2755, +0, 2672, 2755, +0, 2722, 2755, +0, 2755, 2728, +0, 2755, 2636, +0, 2755, 2474, +0, 2755, 2086, +0, 2887, 0, +0, 3019, 0, +1735, 3152, 0, +2484, 3283, 0, +2817, 3416, 0, +3057, 3548, 0, +3256, 3680, 0, +3432, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2482, 2755, +0, 2483, 2755, +0, 2485, 2755, +0, 2487, 2755, +0, 2489, 2755, +0, 2492, 2755, +0, 2497, 2755, +0, 2502, 2755, +0, 2510, 2755, +0, 2520, 2755, +0, 2532, 2755, +0, 2549, 2755, +0, 2570, 2755, +0, 2596, 2755, +0, 2630, 2755, +0, 2671, 2755, +0, 2721, 2755, +0, 2755, 2728, +0, 2755, 2636, +0, 2755, 2475, +0, 2755, 2088, +0, 2887, 0, +0, 3019, 0, +1746, 3151, 0, +2486, 3283, 0, +2818, 3416, 0, +3058, 3548, 0, +3256, 3680, 0, +3432, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2479, 2755, +0, 2481, 2755, +0, 2482, 2755, +0, 2484, 2755, +0, 2487, 2755, +0, 2490, 2755, +0, 2495, 2755, +0, 2501, 2755, +0, 2508, 2755, +0, 2517, 2755, +0, 2530, 2755, +0, 2547, 2755, +0, 2568, 2755, +0, 2595, 2755, +0, 2628, 2755, +0, 2670, 2755, +0, 2720, 2755, +0, 2755, 2729, +0, 2755, 2637, +0, 2755, 2476, +0, 2755, 2091, +0, 2887, 0, +0, 3019, 0, +1760, 3151, 0, +2489, 3283, 0, +2820, 3416, 0, +3059, 3548, 0, +3257, 3680, 0, +3433, 3812, 0, +3595, 3944, 0, +3748, 4076, 0, +3896, 4095, 0, +0, 2476, 2755, +0, 2477, 2755, +0, 2479, 2755, +0, 2481, 2755, +0, 2484, 2755, +0, 2488, 2754, +0, 2492, 2754, +0, 2498, 2754, +0, 2505, 2754, +0, 2515, 2754, +0, 2528, 2754, +0, 2545, 2754, +0, 2566, 2754, +0, 2593, 2754, +0, 2627, 2754, +0, 2668, 2754, +0, 2718, 2754, +0, 2754, 2730, +0, 2754, 2638, +0, 2754, 2477, +0, 2754, 2094, +0, 2887, 0, +0, 3019, 0, +1779, 3151, 0, +2493, 3283, 0, +2822, 3416, 0, +3060, 3548, 0, +3258, 3680, 0, +3433, 3812, 0, +3595, 3944, 0, +3749, 4076, 0, +3896, 4095, 0, +0, 2472, 2755, +0, 2473, 2755, +0, 2475, 2755, +0, 2477, 2755, +0, 2480, 2755, +0, 2484, 2754, +0, 2489, 2754, +0, 2494, 2754, +0, 2502, 2754, +0, 2512, 2754, +0, 2525, 2754, +0, 2541, 2754, +0, 2563, 2754, +0, 2590, 2754, +0, 2624, 2754, +0, 2666, 2754, +0, 2716, 2754, +0, 2754, 2731, +0, 2754, 2640, +0, 2754, 2479, +0, 2754, 2099, +0, 2886, 0, +0, 3018, 0, +1802, 3151, 0, +2498, 3283, 0, +2824, 3415, 0, +3061, 3548, 0, +3258, 3680, 0, +3434, 3812, 0, +3596, 3944, 0, +3749, 4076, 0, +3896, 4095, 0, +0, 2466, 2755, +0, 2467, 2755, +0, 2469, 2755, +0, 2471, 2755, +0, 2474, 2755, +0, 2478, 2754, +0, 2483, 2754, +0, 2490, 2753, +0, 2497, 2753, +0, 2507, 2753, +0, 2521, 2753, +0, 2537, 2753, +0, 2559, 2753, +0, 2586, 2753, +0, 2620, 2753, +0, 2662, 2753, +0, 2713, 2753, +0, 2753, 2732, +0, 2753, 2641, +0, 2753, 2482, +0, 2753, 2105, +0, 2886, 0, +0, 3018, 0, +1832, 3151, 0, +2504, 3283, 0, +2827, 3415, 0, +3063, 3548, 0, +3260, 3680, 0, +3435, 3812, 0, +3596, 3944, 0, +3749, 4076, 0, +3897, 4095, 0, +0, 2457, 2755, +0, 2459, 2755, +0, 2460, 2755, +0, 2463, 2755, +0, 2466, 2755, +0, 2470, 2754, +0, 2475, 2754, +0, 2482, 2753, +0, 2491, 2752, +0, 2501, 2752, +0, 2514, 2752, +0, 2532, 2752, +0, 2553, 2752, +0, 2581, 2752, +0, 2616, 2752, +0, 2658, 2752, +0, 2710, 2752, +0, 2752, 2734, +0, 2752, 2644, +0, 2752, 2485, +0, 2752, 2113, +0, 2885, 0, +0, 3018, 0, +1869, 3151, 0, +2513, 3283, 0, +2832, 3415, 0, +3066, 3548, 0, +3261, 3680, 0, +3436, 3812, 0, +3597, 3944, 0, +3750, 4076, 0, +3897, 4095, 0, +0, 2446, 2755, +0, 2448, 2755, +0, 2449, 2755, +0, 2452, 2755, +0, 2455, 2755, +0, 2459, 2754, +0, 2464, 2754, +0, 2471, 2753, +0, 2481, 2752, +0, 2493, 2751, +0, 2506, 2751, +0, 2524, 2751, +0, 2546, 2751, +0, 2574, 2751, +0, 2609, 2751, +0, 2652, 2751, +0, 2704, 2751, +0, 2751, 2737, +0, 2751, 2647, +0, 2751, 2490, +0, 2751, 2123, +0, 2885, 0, +0, 3017, 0, +1915, 3150, 0, +2524, 3282, 0, +2837, 3415, 0, +3069, 3547, 0, +3264, 3680, 0, +3437, 3812, 0, +3598, 3944, 0, +3751, 4076, 0, +3898, 4095, 0, +0, 2431, 2755, +0, 2432, 2755, +0, 2434, 2755, +0, 2436, 2755, +0, 2440, 2755, +0, 2444, 2754, +0, 2450, 2754, +0, 2457, 2753, +0, 2467, 2752, +0, 2479, 2751, +0, 2495, 2750, +0, 2514, 2750, +0, 2536, 2750, +0, 2565, 2750, +0, 2601, 2750, +0, 2645, 2750, +0, 2697, 2750, +0, 2750, 2741, +0, 2750, 2651, +0, 2750, 2496, +0, 2750, 2137, +0, 2883, 0, +0, 3016, 0, +1969, 3150, 0, +2539, 3282, 0, +2845, 3414, 0, +3074, 3547, 0, +3267, 3679, 0, +3439, 3812, 0, +3600, 3944, 0, +3752, 4076, 0, +3898, 4095, 0, +0, 2409, 2755, +0, 2411, 2755, +0, 2413, 2755, +0, 2415, 2755, +0, 2419, 2755, +0, 2423, 2754, +0, 2429, 2754, +0, 2437, 2753, +0, 2447, 2752, +0, 2460, 2751, +0, 2477, 2750, +0, 2499, 2748, +0, 2522, 2748, +0, 2552, 2748, +0, 2589, 2748, +0, 2634, 2748, +0, 2687, 2748, +0, 2748, 2745, +0, 2748, 2657, +0, 2748, 2504, +0, 2748, 2155, +0, 2882, 0, +0, 3015, 0, +2033, 3149, 0, +2558, 3281, 0, +2855, 3414, 0, +3080, 3547, 0, +3271, 3679, 0, +3442, 3812, 0, +3602, 3944, 0, +3753, 4076, 0, +3899, 4095, 0, +0, 2379, 2755, +0, 2381, 2755, +0, 2383, 2755, +0, 2386, 2755, +0, 2389, 2755, +0, 2394, 2754, +0, 2400, 2754, +0, 2408, 2753, +0, 2419, 2752, +0, 2433, 2751, +0, 2451, 2750, +0, 2474, 2748, +0, 2503, 2746, +0, 2534, 2746, +0, 2572, 2746, +0, 2619, 2746, +0, 2674, 2746, +0, 2740, 2746, +0, 2746, 2665, +0, 2746, 2515, +0, 2746, 2177, +0, 2880, 0, +0, 3014, 0, +2106, 3148, 0, +2583, 3280, 0, +2867, 3414, 0, +3087, 3546, 0, +3276, 3679, 0, +3446, 3811, 0, +3604, 3944, 0, +3755, 4076, 0, +3901, 4095, 0, +0, 2335, 2755, +0, 2337, 2755, +0, 2339, 2755, +0, 2342, 2755, +0, 2346, 2755, +0, 2351, 2754, +0, 2358, 2754, +0, 2367, 2753, +0, 2379, 2752, +0, 2394, 2751, +0, 2414, 2750, +0, 2439, 2748, +0, 2470, 2746, +0, 2509, 2742, +0, 2550, 2742, +0, 2598, 2742, +0, 2656, 2742, +0, 2724, 2742, +0, 2742, 2675, +0, 2742, 2529, +0, 2742, 2206, +0, 2878, 0, +0, 3012, 0, +2189, 3146, 0, +2613, 3280, 0, +2884, 3413, 0, +3098, 3546, 0, +3282, 3678, 0, +3450, 3811, 0, +3607, 3943, 0, +3757, 4076, 0, +3903, 4095, 0, +0, 2269, 2755, +0, 2271, 2755, +0, 2274, 2755, +0, 2277, 2755, +0, 2281, 2755, +0, 2287, 2754, +0, 2295, 2754, +0, 2305, 2753, +0, 2319, 2752, +0, 2336, 2751, +0, 2359, 2750, +0, 2387, 2748, +0, 2422, 2746, +0, 2465, 2742, +0, 2517, 2738, +0, 2569, 2738, +0, 2631, 2738, +0, 2702, 2738, +0, 2738, 2688, +0, 2738, 2547, +0, 2738, 2241, +0, 2874, 0, +922, 3010, 0, +2280, 3144, 0, +2651, 3278, 0, +2906, 3412, 0, +3111, 3545, 0, +3291, 3678, 0, +3457, 3810, 0, +3612, 3943, 0, +3760, 4075, 0, +3905, 4095, 0, +0, 2162, 2755, +0, 2164, 2755, +0, 2167, 2755, +0, 2172, 2755, +0, 2177, 2755, +0, 2185, 2754, +0, 2195, 2754, +0, 2208, 2753, +0, 2224, 2752, +0, 2245, 2751, +0, 2273, 2750, +0, 2306, 2748, +0, 2348, 2746, +0, 2398, 2742, +0, 2458, 2738, +738, 2527, 2731, +738, 2594, 2731, +738, 2671, 2731, +738, 2731, 2705, +738, 2731, 2570, +738, 2731, 2285, +0, 2870, 963, +1723, 3006, 0, +2379, 3142, 0, +2698, 3276, 0, +2933, 3410, 0, +3129, 3544, 0, +3303, 3677, 0, +3465, 3810, 0, +3618, 3943, 0, +3765, 4075, 0, +3908, 4095, 0, +0, 1962, 2755, +0, 1966, 2755, +0, 1971, 2755, +0, 1977, 2755, +0, 1986, 2755, +0, 1997, 2754, +0, 2012, 2754, +0, 2031, 2753, +0, 2056, 2752, +0, 2086, 2751, +0, 2124, 2750, +0, 2170, 2748, +0, 2226, 2746, +0, 2291, 2742, +0, 2365, 2738, +738, 2448, 2731, +1664, 2540, 2723, +1664, 2626, 2723, +1664, 2719, 2723, +1664, 2723, 2598, +1664, 2723, 2338, +870, 2863, 1498, +2062, 3002, 0, +2484, 3138, 0, +2753, 3274, 0, +2966, 3408, 0, +3151, 3543, 0, +3319, 3676, 0, +3475, 3809, 0, +3626, 3942, 0, +3770, 4075, 0, +3912, 4095, 0, +0, 1353, 2755, +0, 1367, 2755, +0, 1386, 2755, +0, 1409, 2755, +0, 1439, 2755, +0, 1476, 2754, +0, 1521, 2754, +0, 1575, 2753, +0, 1638, 2752, +0, 1711, 2751, +0, 1794, 2750, +0, 1885, 2748, +0, 1983, 2746, +0, 2089, 2742, +0, 2200, 2738, +738, 2315, 2731, +1664, 2435, 2723, +2015, 2557, 2711, +2015, 2665, 2711, +2015, 2711, 2634, +2015, 2711, 2400, +1797, 2855, 1796, +2303, 2995, 1006, +2596, 3134, 0, +2818, 3270, 0, +3008, 3406, 0, +3179, 3541, 0, +3338, 3675, 0, +3490, 3808, 0, +3635, 3941, 0, +3777, 4074, 0, +3917, 4095, 0, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2754, +0, 0, 2754, +0, 0, 2753, +0, 0, 2752, +0, 0, 2751, +0, 0, 2750, +0, 0, 2748, +0, 678, 2746, +0, 1463, 2742, +0, 1799, 2738, +738, 2040, 2731, +1664, 2240, 2723, +2015, 2416, 2711, +2261, 2579, 2696, +2261, 2696, 2678, +2261, 2696, 2471, +2246, 2843, 2147, +2503, 2987, 1930, +2712, 3128, 1137, +2893, 3266, 0, +3059, 3402, 0, +3214, 3538, 0, +3363, 3673, 0, +3508, 3807, 0, +3649, 3940, 0, +3787, 4073, 0, +3924, 4095, 0, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2755, +0, 0, 2754, +0, 0, 2754, +0, 0, 2753, +0, 0, 2752, +0, 0, 2751, +0, 0, 2750, +0, 0, 2748, +0, 0, 2746, +0, 0, 2742, +817, 0, 2738, +1362, 738, 2731, +1664, 1667, 2723, +2015, 2114, 2711, +2261, 2391, 2696, +2463, 2607, 2673, +2463, 2673, 2552, +2522, 2828, 2393, +2680, 2975, 2280, +2831, 3119, 2061, +2976, 3259, 1272, +3118, 3398, 0, +3257, 3535, 0, +3395, 3670, 0, +3531, 3805, 0, +3666, 3939, 0, +3800, 4072, 0, +3934, 4095, 0, +2083, 0, 2755, +2084, 0, 2755, +2086, 0, 2755, +2088, 0, 2755, +2091, 0, 2755, +2094, 0, 2754, +2099, 0, 2754, +2105, 0, 2753, +2113, 0, 2752, +2123, 0, 2751, +2137, 0, 2750, +2155, 0, 2748, +2177, 0, 2746, +2206, 0, 2742, +2241, 0, 2738, +2285, 738, 2731, +2338, 1664, 2723, +2400, 2015, 2711, +2471, 2261, 2696, +2552, 2463, 2673, +2642, 2642, 2642, +2739, 2805, 2596, +2843, 2959, 2526, +2954, 3108, 2412, +3069, 3251, 2194, +3187, 3392, 1406, +3309, 3530, 0, +3434, 3667, 0, +3560, 3802, 0, +3688, 3937, 0, +3816, 4071, 0, +3946, 4095, 0, +2604, 0, 2887, +2604, 0, 2887, +2605, 0, 2887, +2605, 0, 2887, +2606, 0, 2887, +2607, 0, 2887, +2609, 0, 2886, +2611, 0, 2886, +2613, 0, 2885, +2617, 0, 2885, +2621, 0, 2883, +2628, 0, 2882, +2636, 0, 2880, +2647, 0, 2878, +2661, 0, 2874, +2678, 0, 2870, +2701, 870, 2863, +2730, 1796, 2855, +2766, 2147, 2843, +2810, 2393, 2828, +2805, 2596, 2739, +2805, 2684, 2596, +2959, 2942, 2526, +3061, 3108, 2412, +3154, 3251, 2194, +3255, 3392, 1406, +3362, 3530, 0, +3474, 3667, 0, +3591, 3802, 0, +3711, 3937, 0, +3834, 4071, 0, +3960, 4095, 0, +2898, 0, 3019, +2898, 0, 3019, +2898, 0, 3019, +2899, 0, 3019, +2899, 0, 3019, +2900, 0, 3019, +2901, 0, 3018, +2902, 0, 3018, +2903, 0, 3018, +2905, 0, 3017, +2907, 0, 3016, +2911, 0, 3015, +2915, 0, 3014, +2921, 0, 3012, +2928, 0, 3010, +2939, 0, 3006, +2952, 0, 3002, +2968, 1006, 2995, +2987, 1930, 2984, +2975, 2280, 2929, +2959, 2526, 2843, +2959, 2526, 2654, +2959, 2735, 2526, +3108, 3031, 2412, +3248, 3251, 2194, +3331, 3392, 1406, +3423, 3530, 0, +3523, 3667, 0, +3629, 3802, 0, +3741, 3937, 0, +3857, 4071, 0, +3977, 4095, 0, +3123, 0, 3152, +3123, 0, 3152, +3123, 0, 3152, +3123, 0, 3151, +3123, 0, 3151, +3124, 0, 3151, +3124, 0, 3151, +3125, 0, 3151, +3126, 0, 3151, +3127, 0, 3150, +3128, 0, 3150, +3131, 0, 3149, +3133, 0, 3148, +3137, 0, 3146, +3141, 0, 3144, +3142, 0, 3136, +3138, 0, 3120, +3134, 0, 3098, +3128, 1137, 3067, +3119, 2061, 3022, +3108, 2412, 2954, +3108, 2412, 2813, +3108, 2412, 2511, +3108, 2796, 2412, +3251, 3126, 2194, +3392, 3365, 1406, +3495, 3530, 0, +3581, 3667, 0, +3676, 3802, 0, +3777, 3937, 0, +3886, 4071, 0, +3999, 4095, 0, +3284, 0, 3252, +3283, 0, 3252, +3283, 0, 3252, +3283, 0, 3252, +3283, 0, 3251, +3283, 0, 3251, +3283, 0, 3250, +3283, 0, 3249, +3283, 0, 3248, +3282, 0, 3247, +3282, 0, 3244, +3281, 0, 3242, +3280, 0, 3238, +3280, 0, 3233, +3278, 0, 3225, +3276, 0, 3216, +3274, 0, 3203, +3270, 0, 3184, +3266, 0, 3159, +3259, 1272, 3122, +3251, 2194, 3069, +3251, 2194, 2963, +3251, 2194, 2768, +3251, 2195, 2194, +3251, 2866, 2194, +3392, 3230, 1406, +3530, 3480, 0, +3648, 3667, 0, +3731, 3802, 0, +3822, 3937, 0, +3921, 4071, 0, +4027, 4095, 0, +3416, 0, 3335, +3416, 0, 3335, +3416, 0, 3335, +3416, 0, 3335, +3416, 0, 3334, +3416, 0, 3334, +3415, 0, 3333, +3415, 0, 3333, +3415, 0, 3331, +3415, 0, 3330, +3414, 0, 3329, +3414, 0, 3326, +3414, 0, 3323, +3413, 0, 3319, +3412, 0, 3313, +3410, 0, 3305, +3408, 0, 3294, +3406, 0, 3279, +3402, 0, 3259, +3398, 0, 3230, +3392, 1406, 3187, +3392, 1406, 3108, +3392, 1406, 2976, +3392, 1406, 2701, +3392, 2025, 1406, +3392, 2945, 1406, +3530, 3339, 0, +3667, 3599, 0, +3796, 3802, 0, +3876, 3937, 0, +3965, 4071, 0, +4062, 4095, 0, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3426, +3548, 0, 3425, +3548, 0, 3425, +3548, 0, 3424, +3548, 0, 3423, +3547, 0, 3422, +3547, 0, 3421, +3547, 0, 3419, +3546, 0, 3416, +3546, 0, 3413, +3545, 0, 3408, +3544, 0, 3402, +3543, 0, 3393, +3541, 0, 3381, +3538, 0, 3365, +3535, 0, 3342, +3530, 0, 3309, +3530, 0, 3250, +3530, 0, 3157, +3530, 0, 2992, +3530, 0, 2593, +3530, 1621, 0, +3530, 3034, 0, +3667, 3453, 0, +3802, 3721, 0, +3937, 3934, 0, +4018, 4071, 0, +4095, 4095, 0, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3525, +3680, 0, 3524, +3680, 0, 3524, +3680, 0, 3523, +3680, 0, 3522, +3679, 0, 3521, +3679, 0, 3520, +3679, 0, 3517, +3678, 0, 3515, +3678, 0, 3511, +3677, 0, 3506, +3676, 0, 3499, +3675, 0, 3490, +3673, 0, 3477, +3670, 0, 3459, +3667, 0, 3434, +3667, 0, 3389, +3667, 0, 3323, +3667, 0, 3215, +3667, 0, 3014, +3667, 0, 2388, +3667, 0, 0, +3667, 3131, 0, +3802, 3571, 0, +3937, 3846, 0, +4071, 4061, 0, +4095, 4095, 0, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3631, +3812, 0, 3630, +3812, 0, 3630, +3812, 0, 3630, +3812, 0, 3629, +3812, 0, 3629, +3812, 0, 3628, +3812, 0, 3626, +3811, 0, 3625, +3811, 0, 3622, +3810, 0, 3620, +3810, 0, 3616, +3809, 0, 3610, +3808, 0, 3603, +3807, 0, 3593, +3805, 0, 3579, +3802, 0, 3560, +3802, 0, 3527, +3802, 0, 3479, +3802, 0, 3405, +3802, 0, 3282, +3802, 0, 3040, +3802, 0, 1737, +3802, 0, 0, +3802, 3234, 0, +3937, 3692, 0, +4071, 3972, 0, +4095, 4095, 0, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3742, +3944, 0, 3741, +3944, 0, 3741, +3944, 0, 3741, +3944, 0, 3740, +3944, 0, 3740, +3944, 0, 3739, +3944, 0, 3737, +3943, 0, 3736, +3943, 0, 3733, +3943, 0, 3730, +3942, 0, 3726, +3941, 0, 3720, +3940, 0, 3713, +3939, 0, 3702, +3937, 0, 3688, +3937, 0, 3663, +3937, 0, 3628, +3937, 0, 3575, +3937, 0, 3495, +3937, 0, 3359, +3937, 0, 3073, +3937, 0, 0, +3937, 0, 0, +3937, 3344, 0, +4071, 3816, 0, +4095, 4095, 0, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3858, +4076, 0, 3857, +4076, 0, 3857, +4076, 0, 3856, +4076, 0, 3856, +4076, 0, 3855, +4076, 0, 3854, +4076, 0, 3853, +4075, 0, 3851, +4075, 0, 3849, +4075, 0, 3846, +4074, 0, 3841, +4073, 0, 3835, +4072, 0, 3827, +4071, 0, 3816, +4071, 0, 3798, +4071, 0, 3772, +4071, 0, 3735, +4071, 0, 3679, +4071, 0, 3593, +4071, 0, 3445, +4071, 0, 3113, +4071, 0, 0, +4071, 0, 0, +4071, 3458, 0, +4095, 3943, 0, +4095, 0, 3978, +4095, 0, 3978, +4095, 0, 3978, +4095, 0, 3978, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3977, +4095, 0, 3976, +4095, 0, 3976, +4095, 0, 3975, +4095, 0, 3974, +4095, 0, 3972, +4095, 0, 3971, +4095, 0, 3968, +4095, 0, 3965, +4095, 0, 3961, +4095, 0, 3954, +4095, 0, 3946, +4095, 0, 3932, +4095, 0, 3913, +4095, 0, 3886, +4095, 0, 3847, +4095, 0, 3790, +4095, 0, 3699, +4095, 0, 3539, +4095, 0, 3164, +4095, 0, 0, +4095, 0, 0, +4095, 3576, 0, +0, 2618, 2887, +0, 2619, 2887, +0, 2620, 2887, +0, 2621, 2887, +0, 2623, 2887, +0, 2625, 2887, +0, 2628, 2887, +0, 2633, 2887, +0, 2638, 2887, +0, 2646, 2887, +0, 2655, 2887, +0, 2668, 2887, +0, 2684, 2887, +0, 2705, 2887, +0, 2732, 2887, +0, 2765, 2887, +0, 2806, 2887, +0, 2856, 2887, +0, 2887, 2859, +0, 2887, 2767, +0, 2887, 2604, +0, 2887, 2215, +0, 3019, 0, +0, 3152, 0, +1844, 3284, 0, +2613, 3416, 0, +2948, 3548, 0, +3188, 3680, 0, +3387, 3812, 0, +3564, 3944, 0, +3726, 4076, 0, +3880, 4095, 0, +0, 2617, 2887, +0, 2618, 2887, +0, 2619, 2887, +0, 2620, 2887, +0, 2622, 2887, +0, 2625, 2887, +0, 2628, 2887, +0, 2632, 2887, +0, 2638, 2887, +0, 2645, 2887, +0, 2655, 2887, +0, 2667, 2887, +0, 2684, 2887, +0, 2705, 2887, +0, 2731, 2887, +0, 2764, 2887, +0, 2805, 2887, +0, 2855, 2887, +0, 2887, 2859, +0, 2887, 2767, +0, 2887, 2604, +0, 2887, 2215, +0, 3019, 0, +0, 3152, 0, +1849, 3283, 0, +2614, 3416, 0, +2948, 3548, 0, +3188, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3726, 4076, 0, +3880, 4095, 0, +0, 2616, 2887, +0, 2617, 2887, +0, 2618, 2887, +0, 2620, 2887, +0, 2621, 2887, +0, 2624, 2887, +0, 2627, 2887, +0, 2631, 2887, +0, 2637, 2887, +0, 2644, 2887, +0, 2654, 2887, +0, 2667, 2887, +0, 2683, 2887, +0, 2704, 2887, +0, 2731, 2887, +0, 2764, 2887, +0, 2805, 2887, +0, 2855, 2887, +0, 2887, 2859, +0, 2887, 2767, +0, 2887, 2605, +0, 2887, 2217, +0, 3019, 0, +0, 3152, 0, +1856, 3283, 0, +2615, 3416, 0, +2949, 3548, 0, +3189, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3726, 4076, 0, +3880, 4095, 0, +0, 2615, 2887, +0, 2616, 2887, +0, 2617, 2887, +0, 2619, 2887, +0, 2620, 2887, +0, 2623, 2887, +0, 2626, 2887, +0, 2630, 2887, +0, 2636, 2887, +0, 2643, 2887, +0, 2653, 2887, +0, 2666, 2887, +0, 2682, 2887, +0, 2703, 2887, +0, 2730, 2887, +0, 2763, 2887, +0, 2804, 2887, +0, 2854, 2887, +0, 2887, 2860, +0, 2887, 2768, +0, 2887, 2605, +0, 2887, 2218, +0, 3019, 0, +0, 3151, 0, +1864, 3283, 0, +2617, 3416, 0, +2950, 3548, 0, +3189, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3727, 4076, 0, +3880, 4095, 0, +0, 2613, 2887, +0, 2614, 2887, +0, 2615, 2887, +0, 2617, 2887, +0, 2619, 2887, +0, 2621, 2887, +0, 2625, 2887, +0, 2629, 2887, +0, 2635, 2887, +0, 2642, 2887, +0, 2651, 2887, +0, 2664, 2887, +0, 2681, 2887, +0, 2702, 2887, +0, 2728, 2887, +0, 2762, 2887, +0, 2803, 2887, +0, 2853, 2887, +0, 2887, 2860, +0, 2887, 2768, +0, 2887, 2606, +0, 2887, 2220, +0, 3019, 0, +0, 3151, 0, +1875, 3283, 0, +2619, 3416, 0, +2951, 3548, 0, +3190, 3680, 0, +3388, 3812, 0, +3564, 3944, 0, +3727, 4076, 0, +3880, 4095, 0, +0, 2611, 2887, +0, 2612, 2887, +0, 2613, 2887, +0, 2614, 2887, +0, 2617, 2887, +0, 2619, 2887, +0, 2623, 2887, +0, 2627, 2887, +0, 2632, 2887, +0, 2640, 2887, +0, 2650, 2887, +0, 2662, 2887, +0, 2679, 2887, +0, 2700, 2887, +0, 2727, 2887, +0, 2761, 2887, +0, 2802, 2887, +0, 2852, 2887, +0, 2887, 2861, +0, 2887, 2769, +0, 2887, 2607, +0, 2887, 2223, +0, 3019, 0, +0, 3151, 0, +1890, 3283, 0, +2621, 3416, 0, +2952, 3548, 0, +3191, 3680, 0, +3389, 3812, 0, +3565, 3944, 0, +3727, 4076, 0, +3881, 4095, 0, +0, 2607, 2887, +0, 2608, 2887, +0, 2609, 2887, +0, 2611, 2887, +0, 2613, 2887, +0, 2616, 2887, +0, 2620, 2886, +0, 2624, 2886, +0, 2630, 2886, +0, 2637, 2886, +0, 2647, 2886, +0, 2660, 2886, +0, 2677, 2886, +0, 2698, 2886, +0, 2725, 2886, +0, 2759, 2886, +0, 2800, 2886, +0, 2850, 2886, +0, 2886, 2862, +0, 2886, 2770, +0, 2886, 2609, +0, 2886, 2226, +0, 3018, 0, +0, 3151, 0, +1908, 3283, 0, +2625, 3415, 0, +2954, 3548, 0, +3192, 3680, 0, +3390, 3812, 0, +3565, 3944, 0, +3727, 4076, 0, +3881, 4095, 0, +0, 2603, 2887, +0, 2604, 2887, +0, 2605, 2887, +0, 2607, 2887, +0, 2609, 2887, +0, 2612, 2887, +0, 2616, 2886, +0, 2621, 2886, +0, 2626, 2886, +0, 2634, 2886, +0, 2644, 2886, +0, 2657, 2886, +0, 2673, 2886, +0, 2695, 2886, +0, 2722, 2886, +0, 2756, 2886, +0, 2798, 2886, +0, 2848, 2886, +0, 2886, 2863, +0, 2886, 2772, +0, 2886, 2611, +0, 2886, 2231, +0, 3018, 0, +0, 3151, 0, +1932, 3283, 0, +2630, 3415, 0, +2956, 3548, 0, +3193, 3680, 0, +3391, 3812, 0, +3566, 3944, 0, +3728, 4076, 0, +3881, 4095, 0, +0, 2597, 2887, +0, 2598, 2887, +0, 2599, 2887, +0, 2601, 2887, +0, 2603, 2887, +0, 2606, 2887, +0, 2610, 2886, +0, 2615, 2886, +0, 2622, 2885, +0, 2629, 2885, +0, 2639, 2885, +0, 2652, 2885, +0, 2669, 2885, +0, 2691, 2885, +0, 2718, 2885, +0, 2752, 2885, +0, 2795, 2885, +0, 2845, 2885, +0, 2885, 2864, +0, 2885, 2773, +0, 2885, 2613, +0, 2885, 2237, +0, 3018, 0, +0, 3151, 0, +1962, 3283, 0, +2637, 3415, 0, +2960, 3548, 0, +3195, 3680, 0, +3392, 3812, 0, +3567, 3944, 0, +3728, 4076, 0, +3881, 4095, 0, +0, 2589, 2887, +0, 2589, 2887, +0, 2591, 2887, +0, 2592, 2887, +0, 2595, 2887, +0, 2598, 2887, +0, 2602, 2886, +0, 2607, 2886, +0, 2614, 2885, +0, 2623, 2885, +0, 2633, 2885, +0, 2647, 2885, +0, 2664, 2885, +0, 2685, 2885, +0, 2713, 2885, +0, 2748, 2885, +0, 2790, 2885, +0, 2842, 2885, +0, 2885, 2866, +0, 2885, 2776, +0, 2885, 2617, +0, 2885, 2245, +0, 3017, 0, +0, 3150, 0, +1999, 3282, 0, +2646, 3415, 0, +2964, 3547, 0, +3198, 3680, 0, +3394, 3812, 0, +3568, 3944, 0, +3729, 4076, 0, +3882, 4095, 0, +0, 2577, 2887, +0, 2578, 2887, +0, 2580, 2887, +0, 2581, 2887, +0, 2584, 2887, +0, 2587, 2887, +0, 2591, 2886, +0, 2596, 2886, +0, 2603, 2885, +0, 2613, 2885, +0, 2625, 2883, +0, 2639, 2883, +0, 2656, 2883, +0, 2678, 2883, +0, 2706, 2883, +0, 2741, 2883, +0, 2784, 2883, +0, 2836, 2883, +0, 2883, 2869, +0, 2883, 2779, +0, 2883, 2621, +0, 2883, 2255, +0, 3016, 0, +0, 3150, 0, +2045, 3282, 0, +2657, 3414, 0, +2970, 3547, 0, +3201, 3679, 0, +3396, 3812, 0, +3569, 3944, 0, +3730, 4076, 0, +3883, 4095, 0, +0, 2562, 2887, +0, 2563, 2887, +0, 2564, 2887, +0, 2566, 2887, +0, 2569, 2887, +0, 2572, 2887, +0, 2576, 2886, +0, 2581, 2886, +0, 2589, 2885, +0, 2599, 2885, +0, 2611, 2883, +0, 2628, 2882, +0, 2645, 2882, +0, 2668, 2882, +0, 2697, 2882, +0, 2733, 2882, +0, 2777, 2882, +0, 2829, 2882, +0, 2882, 2873, +0, 2882, 2784, +0, 2882, 2628, +0, 2882, 2269, +0, 3015, 0, +0, 3149, 0, +2100, 3281, 0, +2672, 3414, 0, +2977, 3547, 0, +3206, 3679, 0, +3399, 3812, 0, +3571, 3944, 0, +3732, 4076, 0, +3884, 4095, 0, +0, 2541, 2887, +0, 2542, 2887, +0, 2543, 2887, +0, 2545, 2887, +0, 2548, 2887, +0, 2551, 2887, +0, 2555, 2886, +0, 2561, 2886, +0, 2569, 2885, +0, 2579, 2885, +0, 2592, 2883, +0, 2609, 2882, +0, 2631, 2880, +0, 2654, 2880, +0, 2684, 2880, +0, 2721, 2880, +0, 2766, 2880, +0, 2820, 2880, +0, 2880, 2877, +0, 2880, 2789, +0, 2880, 2636, +0, 2880, 2287, +0, 3014, 0, +0, 3148, 0, +2164, 3280, 0, +2691, 3414, 0, +2987, 3546, 0, +3212, 3679, 0, +3403, 3811, 0, +3574, 3944, 0, +3734, 4076, 0, +3885, 4095, 0, +0, 2510, 2887, +0, 2511, 2887, +0, 2513, 2887, +0, 2515, 2887, +0, 2517, 2887, +0, 2521, 2887, +0, 2526, 2886, +0, 2532, 2886, +0, 2540, 2885, +0, 2551, 2885, +0, 2565, 2883, +0, 2583, 2882, +0, 2606, 2880, +0, 2636, 2878, +0, 2666, 2878, +0, 2704, 2878, +0, 2751, 2878, +0, 2807, 2878, +0, 2872, 2878, +0, 2878, 2797, +0, 2878, 2647, +0, 2878, 2309, +0, 3012, 0, +0, 3146, 0, +2237, 3280, 0, +2715, 3413, 0, +3000, 3546, 0, +3220, 3678, 0, +3408, 3811, 0, +3578, 3943, 0, +3736, 4076, 0, +3887, 4095, 0, +0, 2466, 2887, +0, 2467, 2887, +0, 2469, 2887, +0, 2471, 2887, +0, 2474, 2887, +0, 2478, 2887, +0, 2483, 2886, +0, 2490, 2886, +0, 2499, 2885, +0, 2511, 2885, +0, 2526, 2883, +0, 2546, 2882, +0, 2571, 2880, +0, 2602, 2878, +0, 2641, 2874, +0, 2681, 2874, +0, 2730, 2874, +0, 2788, 2874, +0, 2856, 2874, +0, 2874, 2807, +0, 2874, 2661, +0, 2874, 2338, +0, 3010, 0, +0, 3144, 0, +2320, 3278, 0, +2746, 3412, 0, +3016, 3545, 0, +3230, 3678, 0, +3415, 3810, 0, +3583, 3943, 0, +3739, 4075, 0, +3889, 4095, 0, +0, 2400, 2887, +0, 2401, 2887, +0, 2403, 2887, +0, 2406, 2887, +0, 2409, 2887, +0, 2413, 2887, +0, 2419, 2886, +0, 2427, 2886, +0, 2438, 2885, +0, 2451, 2885, +0, 2469, 2883, +0, 2491, 2882, +0, 2519, 2880, +0, 2554, 2878, +0, 2597, 2874, +0, 2649, 2870, +0, 2701, 2870, +0, 2763, 2870, +0, 2834, 2870, +0, 2870, 2820, +0, 2870, 2678, +0, 2870, 2374, +0, 3006, 0, +1068, 3142, 0, +2411, 3276, 0, +2784, 3410, 0, +3038, 3544, 0, +3243, 3677, 0, +3424, 3810, 0, +3589, 3943, 0, +3744, 4075, 0, +3893, 4095, 0, +0, 2292, 2887, +0, 2294, 2887, +0, 2296, 2887, +0, 2299, 2887, +0, 2304, 2887, +0, 2310, 2887, +0, 2317, 2886, +0, 2327, 2886, +0, 2340, 2885, +0, 2356, 2885, +0, 2378, 2883, +0, 2405, 2882, +0, 2439, 2880, +0, 2480, 2878, +0, 2530, 2874, +0, 2590, 2870, +870, 2659, 2863, +870, 2726, 2863, +870, 2803, 2863, +870, 2863, 2837, +870, 2863, 2701, +870, 2863, 2417, +0, 3002, 1109, +1857, 3138, 0, +2510, 3274, 0, +2830, 3408, 0, +3065, 3543, 0, +3261, 3676, 0, +3435, 3809, 0, +3597, 3942, 0, +3750, 4075, 0, +3897, 4095, 0, +0, 2091, 2887, +0, 2094, 2887, +0, 2098, 2887, +0, 2103, 2887, +0, 2110, 2887, +0, 2118, 2887, +0, 2129, 2886, +0, 2144, 2886, +0, 2163, 2885, +0, 2188, 2885, +0, 2218, 2883, +0, 2256, 2882, +0, 2302, 2880, +0, 2358, 2878, +0, 2423, 2874, +0, 2497, 2870, +870, 2580, 2863, +1796, 2672, 2855, +1796, 2758, 2855, +1796, 2852, 2855, +1796, 2855, 2730, +1796, 2855, 2470, +1006, 2995, 1635, +2195, 3134, 0, +2616, 3270, 0, +2886, 3406, 0, +3099, 3541, 0, +3283, 3675, 0, +3451, 3808, 0, +3608, 3941, 0, +3757, 4074, 0, +3903, 4095, 0, +0, 1472, 2887, +0, 1483, 2887, +0, 1497, 2887, +0, 1516, 2887, +0, 1540, 2887, +0, 1569, 2887, +0, 1606, 2886, +0, 1651, 2886, +0, 1706, 2885, +0, 1769, 2885, +0, 1843, 2883, +0, 1925, 2882, +0, 2016, 2880, +0, 2115, 2878, +0, 2220, 2874, +0, 2332, 2870, +870, 2447, 2863, +1796, 2567, 2855, +2147, 2689, 2843, +2147, 2797, 2843, +2147, 2843, 2766, +2147, 2843, 2532, +1930, 2987, 1930, +2436, 3128, 1137, +2727, 3266, 0, +2951, 3402, 0, +3140, 3538, 0, +3311, 3673, 0, +3470, 3807, 0, +3622, 3940, 0, +3768, 4073, 0, +3910, 4095, 0, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2886, +0, 0, 2886, +0, 0, 2885, +0, 0, 2885, +0, 0, 2883, +0, 0, 2882, +0, 0, 2880, +0, 817, 2878, +0, 1596, 2874, +0, 1932, 2870, +870, 2173, 2863, +1796, 2372, 2855, +2147, 2549, 2843, +2393, 2711, 2828, +2393, 2828, 2810, +2393, 2828, 2603, +2377, 2975, 2280, +2636, 3119, 2061, +2843, 3259, 1272, +3025, 3398, 0, +3190, 3535, 0, +3346, 3670, 0, +3495, 3805, 0, +3640, 3939, 0, +3781, 4072, 0, +3920, 4095, 0, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2887, +0, 0, 2886, +0, 0, 2886, +0, 0, 2885, +0, 0, 2885, +0, 0, 2883, +0, 0, 2882, +0, 0, 2880, +0, 0, 2878, +0, 0, 2874, +963, 0, 2870, +1498, 870, 2863, +1796, 1797, 2855, +2147, 2246, 2843, +2393, 2522, 2828, +2596, 2739, 2805, +2596, 2805, 2684, +2654, 2959, 2526, +2813, 3108, 2412, +2963, 3251, 2194, +3108, 3392, 1406, +3250, 3530, 0, +3389, 3667, 0, +3527, 3802, 0, +3663, 3937, 0, +3798, 4071, 0, +3932, 4095, 0, +2215, 0, 2887, +2215, 0, 2887, +2217, 0, 2887, +2218, 0, 2887, +2220, 0, 2887, +2223, 0, 2887, +2226, 0, 2886, +2231, 0, 2886, +2237, 0, 2885, +2245, 0, 2885, +2255, 0, 2883, +2269, 0, 2882, +2287, 0, 2880, +2309, 0, 2878, +2338, 0, 2874, +2374, 0, 2870, +2417, 870, 2863, +2470, 1796, 2855, +2532, 2147, 2843, +2603, 2393, 2828, +2684, 2596, 2805, +2774, 2774, 2774, +2871, 2937, 2728, +2976, 3092, 2658, +3085, 3239, 2544, +3201, 3383, 2326, +3320, 3524, 1536, +3441, 3662, 0, +3566, 3799, 0, +3692, 3934, 0, +3820, 4069, 0, +3949, 4095, 0, +2735, 0, 3019, +2735, 0, 3019, +2736, 0, 3019, +2736, 0, 3019, +2737, 0, 3019, +2738, 0, 3019, +2739, 0, 3018, +2740, 0, 3018, +2742, 0, 3018, +2745, 0, 3017, +2749, 0, 3016, +2753, 0, 3015, +2759, 0, 3014, +2767, 0, 3012, +2778, 0, 3010, +2792, 0, 3006, +2810, 0, 3002, +2833, 1006, 2995, +2862, 1930, 2987, +2898, 2280, 2975, +2942, 2526, 2959, +2937, 2728, 2871, +2937, 2816, 2728, +3092, 3074, 2658, +3193, 3239, 2544, +3286, 3383, 2326, +3387, 3524, 1536, +3494, 3662, 0, +3606, 3799, 0, +3723, 3934, 0, +3843, 4069, 0, +3966, 4095, 0, +3031, 0, 3152, +3031, 0, 3152, +3031, 0, 3152, +3031, 0, 3151, +3031, 0, 3151, +3032, 0, 3151, +3032, 0, 3151, +3033, 0, 3151, +3034, 0, 3151, +3036, 0, 3150, +3038, 0, 3150, +3040, 0, 3149, +3043, 0, 3148, +3047, 0, 3146, +3053, 0, 3144, +3061, 0, 3142, +3071, 0, 3138, +3084, 0, 3134, +3101, 1137, 3128, +3119, 2061, 3116, +3108, 2412, 3061, +3092, 2658, 2976, +3092, 2658, 2787, +3092, 2867, 2658, +3239, 3162, 2544, +3380, 3383, 2326, +3463, 3524, 1536, +3555, 3662, 0, +3655, 3799, 0, +3761, 3934, 0, +3873, 4069, 0, +3989, 4095, 0, +3254, 0, 3284, +3254, 0, 3283, +3255, 0, 3283, +3255, 0, 3283, +3255, 0, 3283, +3255, 0, 3283, +3256, 0, 3283, +3256, 0, 3283, +3257, 0, 3283, +3257, 0, 3282, +3259, 0, 3282, +3260, 0, 3281, +3262, 0, 3280, +3265, 0, 3280, +3269, 0, 3278, +3273, 0, 3276, +3274, 0, 3268, +3270, 0, 3252, +3266, 0, 3230, +3259, 1272, 3199, +3251, 2194, 3154, +3239, 2544, 3085, +3239, 2544, 2945, +3239, 2544, 2642, +3239, 2928, 2544, +3383, 3258, 2326, +3524, 3497, 1536, +3626, 3662, 0, +3713, 3799, 0, +3808, 3934, 0, +3910, 4069, 0, +4018, 4095, 0, +3416, 0, 3385, +3416, 0, 3385, +3416, 0, 3384, +3416, 0, 3384, +3416, 0, 3384, +3416, 0, 3384, +3415, 0, 3383, +3415, 0, 3382, +3415, 0, 3381, +3415, 0, 3380, +3414, 0, 3379, +3414, 0, 3376, +3414, 0, 3374, +3413, 0, 3370, +3412, 0, 3365, +3410, 0, 3358, +3408, 0, 3348, +3406, 0, 3335, +3402, 0, 3317, +3398, 0, 3291, +3392, 1406, 3255, +3383, 2326, 3201, +3383, 2326, 3095, +3383, 2326, 2900, +3383, 2326, 2328, +3383, 2998, 2326, +3524, 3362, 1536, +3662, 3612, 0, +3781, 3799, 0, +3863, 3934, 0, +3954, 4069, 0, +4054, 4095, 0, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3467, +3548, 0, 3466, +3548, 0, 3466, +3548, 0, 3466, +3548, 0, 3465, +3547, 0, 3464, +3547, 0, 3462, +3547, 0, 3461, +3546, 0, 3458, +3546, 0, 3455, +3545, 0, 3451, +3544, 0, 3445, +3543, 0, 3437, +3541, 0, 3426, +3538, 0, 3411, +3535, 0, 3391, +3530, 0, 3362, +3524, 1536, 3320, +3524, 1536, 3241, +3524, 1536, 3108, +3524, 1536, 2833, +3524, 2158, 1536, +3524, 3078, 1536, +3662, 3471, 0, +3799, 3731, 0, +3928, 3934, 0, +4008, 4069, 0, +4095, 4095, 0, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3558, +3680, 0, 3557, +3680, 0, 3557, +3680, 0, 3556, +3680, 0, 3556, +3679, 0, 3554, +3679, 0, 3553, +3679, 0, 3551, +3678, 0, 3548, +3678, 0, 3545, +3677, 0, 3540, +3676, 0, 3534, +3675, 0, 3525, +3673, 0, 3513, +3670, 0, 3497, +3667, 0, 3474, +3662, 0, 3441, +3662, 0, 3382, +3662, 0, 3289, +3662, 0, 3125, +3662, 0, 2724, +3662, 1753, 0, +3662, 3166, 0, +3799, 3585, 0, +3934, 3853, 0, +4069, 4066, 0, +4095, 4095, 0, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3657, +3812, 0, 3656, +3812, 0, 3656, +3812, 0, 3655, +3812, 0, 3654, +3812, 0, 3653, +3811, 0, 3652, +3811, 0, 3650, +3810, 0, 3647, +3810, 0, 3643, +3809, 0, 3638, +3808, 0, 3631, +3807, 0, 3622, +3805, 0, 3609, +3802, 0, 3591, +3799, 0, 3566, +3799, 0, 3522, +3799, 0, 3455, +3799, 0, 3347, +3799, 0, 3145, +3799, 0, 2519, +3799, 0, 0, +3799, 3262, 0, +3934, 3703, 0, +4069, 3978, 0, +4095, 4095, 0, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3763, +3944, 0, 3762, +3944, 0, 3762, +3944, 0, 3762, +3944, 0, 3761, +3944, 0, 3761, +3944, 0, 3760, +3944, 0, 3758, +3943, 0, 3757, +3943, 0, 3755, +3943, 0, 3752, +3942, 0, 3748, +3941, 0, 3742, +3940, 0, 3735, +3939, 0, 3725, +3937, 0, 3711, +3934, 0, 3692, +3934, 0, 3659, +3934, 0, 3611, +3934, 0, 3537, +3934, 0, 3414, +3934, 0, 3172, +3934, 0, 1863, +3934, 0, 0, +3934, 3366, 0, +4069, 3824, 0, +4095, 4095, 0, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3874, +4076, 0, 3873, +4076, 0, 3873, +4076, 0, 3873, +4076, 0, 3872, +4076, 0, 3872, +4076, 0, 3871, +4076, 0, 3869, +4075, 0, 3868, +4075, 0, 3865, +4075, 0, 3862, +4074, 0, 3858, +4073, 0, 3852, +4072, 0, 3845, +4071, 0, 3834, +4069, 0, 3820, +4069, 0, 3795, +4069, 0, 3760, +4069, 0, 3708, +4069, 0, 3627, +4069, 0, 3491, +4069, 0, 3205, +4069, 0, 0, +4069, 0, 0, +4069, 3475, 0, +4095, 3949, 0, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3990, +4095, 0, 3989, +4095, 0, 3989, +4095, 0, 3989, +4095, 0, 3988, +4095, 0, 3988, +4095, 0, 3986, +4095, 0, 3985, +4095, 0, 3983, +4095, 0, 3981, +4095, 0, 3978, +4095, 0, 3974, +4095, 0, 3968, +4095, 0, 3960, +4095, 0, 3949, +4095, 0, 3930, +4095, 0, 3904, +4095, 0, 3867, +4095, 0, 3812, +4095, 0, 3726, +4095, 0, 3577, +4095, 0, 3246, +4095, 0, 0, +4095, 0, 0, +4095, 3590, 0, +0, 2750, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2752, 3019, +0, 2754, 3019, +0, 2755, 3019, +0, 2758, 3019, +0, 2761, 3019, +0, 2765, 3019, +0, 2771, 3019, +0, 2778, 3019, +0, 2788, 3019, +0, 2800, 3019, +0, 2816, 3019, +0, 2837, 3019, +0, 2864, 3019, +0, 2897, 3019, +0, 2938, 3019, +0, 2988, 3019, +0, 3019, 2991, +0, 3019, 2898, +0, 3019, 2735, +0, 3019, 2346, +0, 3152, 0, +0, 3284, 0, +1977, 3416, 0, +2745, 3548, 0, +3080, 3680, 0, +3320, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2749, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2752, 3019, +0, 2753, 3019, +0, 2755, 3019, +0, 2757, 3019, +0, 2760, 3019, +0, 2765, 3019, +0, 2770, 3019, +0, 2777, 3019, +0, 2787, 3019, +0, 2800, 3019, +0, 2816, 3019, +0, 2837, 3019, +0, 2863, 3019, +0, 2897, 3019, +0, 2938, 3019, +0, 2987, 3019, +0, 3019, 2991, +0, 3019, 2898, +0, 3019, 2735, +0, 3019, 2346, +0, 3152, 0, +0, 3283, 0, +1981, 3416, 0, +2745, 3548, 0, +3080, 3680, 0, +3321, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2748, 3019, +0, 2749, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2752, 3019, +0, 2754, 3019, +0, 2757, 3019, +0, 2760, 3019, +0, 2764, 3019, +0, 2770, 3019, +0, 2777, 3019, +0, 2787, 3019, +0, 2799, 3019, +0, 2816, 3019, +0, 2836, 3019, +0, 2863, 3019, +0, 2896, 3019, +0, 2938, 3019, +0, 2987, 3019, +0, 3019, 2991, +0, 3019, 2898, +0, 3019, 2736, +0, 3019, 2347, +0, 3152, 0, +0, 3283, 0, +1986, 3416, 0, +2746, 3548, 0, +3081, 3680, 0, +3321, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2747, 3019, +0, 2748, 3019, +0, 2749, 3019, +0, 2750, 3019, +0, 2751, 3019, +0, 2753, 3019, +0, 2756, 3019, +0, 2759, 3019, +0, 2763, 3019, +0, 2769, 3019, +0, 2776, 3019, +0, 2786, 3019, +0, 2798, 3019, +0, 2815, 3019, +0, 2836, 3019, +0, 2863, 3019, +0, 2896, 3019, +0, 2937, 3019, +0, 2987, 3019, +0, 3019, 2991, +0, 3019, 2899, +0, 3019, 2736, +0, 3019, 2348, +0, 3151, 0, +0, 3283, 0, +1992, 3416, 0, +2747, 3548, 0, +3081, 3680, 0, +3321, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2746, 3019, +0, 2747, 3019, +0, 2747, 3019, +0, 2749, 3019, +0, 2750, 3019, +0, 2752, 3019, +0, 2755, 3019, +0, 2758, 3019, +0, 2762, 3019, +0, 2768, 3019, +0, 2775, 3019, +0, 2785, 3019, +0, 2797, 3019, +0, 2814, 3019, +0, 2835, 3019, +0, 2862, 3019, +0, 2895, 3019, +0, 2936, 3019, +0, 2986, 3019, +0, 3019, 2992, +0, 3019, 2899, +0, 3019, 2737, +0, 3019, 2350, +0, 3151, 0, +0, 3283, 0, +2000, 3416, 0, +2749, 3548, 0, +3082, 3680, 0, +3322, 3812, 0, +3520, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2744, 3019, +0, 2745, 3019, +0, 2746, 3019, +0, 2747, 3019, +0, 2749, 3019, +0, 2751, 3019, +0, 2753, 3019, +0, 2756, 3019, +0, 2761, 3019, +0, 2766, 3019, +0, 2774, 3019, +0, 2784, 3019, +0, 2796, 3019, +0, 2813, 3019, +0, 2834, 3019, +0, 2860, 3019, +0, 2894, 3019, +0, 2935, 3019, +0, 2985, 3019, +0, 3019, 2992, +0, 3019, 2900, +0, 3019, 2738, +0, 3019, 2352, +0, 3151, 0, +0, 3283, 0, +2011, 3416, 0, +2751, 3548, 0, +3083, 3680, 0, +3322, 3812, 0, +3521, 3944, 0, +3696, 4076, 0, +3859, 4095, 0, +0, 2742, 3019, +0, 2742, 3019, +0, 2743, 3019, +0, 2745, 3019, +0, 2746, 3019, +0, 2748, 3019, +0, 2751, 3018, +0, 2754, 3018, +0, 2759, 3018, +0, 2764, 3018, +0, 2772, 3018, +0, 2782, 3018, +0, 2794, 3018, +0, 2811, 3018, +0, 2832, 3018, +0, 2859, 3018, +0, 2892, 3018, +0, 2934, 3018, +0, 2984, 3018, +0, 3018, 2992, +0, 3018, 2901, +0, 3018, 2739, +0, 3018, 2354, +0, 3151, 0, +0, 3283, 0, +2026, 3415, 0, +2754, 3548, 0, +3084, 3680, 0, +3323, 3812, 0, +3521, 3944, 0, +3697, 4076, 0, +3859, 4095, 0, +0, 2738, 3019, +0, 2739, 3019, +0, 2740, 3019, +0, 2741, 3019, +0, 2743, 3019, +0, 2745, 3019, +0, 2748, 3018, +0, 2752, 3018, +0, 2756, 3018, +0, 2762, 3018, +0, 2769, 3018, +0, 2779, 3018, +0, 2792, 3018, +0, 2808, 3018, +0, 2830, 3018, +0, 2857, 3018, +0, 2890, 3018, +0, 2932, 3018, +0, 2982, 3018, +0, 3018, 2993, +0, 3018, 2902, +0, 3018, 2740, +0, 3018, 2358, +0, 3151, 0, +0, 3283, 0, +2044, 3415, 0, +2758, 3548, 0, +3086, 3680, 0, +3324, 3812, 0, +3522, 3944, 0, +3697, 4076, 0, +3860, 4095, 0, +0, 2734, 3019, +0, 2735, 3019, +0, 2735, 3019, +0, 2737, 3019, +0, 2738, 3019, +0, 2741, 3019, +0, 2744, 3018, +0, 2747, 3018, +0, 2752, 3018, +0, 2758, 3018, +0, 2766, 3018, +0, 2776, 3018, +0, 2789, 3018, +0, 2805, 3018, +0, 2827, 3018, +0, 2854, 3018, +0, 2888, 3018, +0, 2930, 3018, +0, 2980, 3018, +0, 3018, 2995, +0, 3018, 2903, +0, 3018, 2742, +0, 3018, 2362, +0, 3151, 0, +0, 3283, 0, +2068, 3415, 0, +2763, 3548, 0, +3089, 3680, 0, +3326, 3812, 0, +3523, 3944, 0, +3698, 4076, 0, +3860, 4095, 0, +0, 2728, 3019, +0, 2729, 3019, +0, 2729, 3019, +0, 2731, 3019, +0, 2732, 3019, +0, 2735, 3019, +0, 2738, 3018, +0, 2742, 3018, +0, 2747, 3018, +0, 2754, 3017, +0, 2761, 3017, +0, 2771, 3017, +0, 2784, 3017, +0, 2801, 3017, +0, 2823, 3017, +0, 2850, 3017, +0, 2885, 3017, +0, 2927, 3017, +0, 2977, 3017, +0, 3017, 2996, +0, 3017, 2905, +0, 3017, 2745, +0, 3017, 2369, +0, 3150, 0, +0, 3282, 0, +2098, 3415, 0, +2770, 3547, 0, +3092, 3680, 0, +3328, 3812, 0, +3524, 3944, 0, +3699, 4076, 0, +3861, 4095, 0, +0, 2720, 3019, +0, 2720, 3019, +0, 2721, 3019, +0, 2723, 3019, +0, 2724, 3019, +0, 2727, 3019, +0, 2730, 3018, +0, 2734, 3018, +0, 2739, 3018, +0, 2746, 3017, +0, 2755, 3016, +0, 2765, 3016, +0, 2778, 3016, +0, 2796, 3016, +0, 2817, 3016, +0, 2845, 3016, +0, 2880, 3016, +0, 2922, 3016, +0, 2974, 3016, +0, 3016, 2998, +0, 3016, 2907, +0, 3016, 2749, +0, 3016, 2377, +0, 3150, 0, +0, 3282, 0, +2135, 3414, 0, +2778, 3547, 0, +3096, 3679, 0, +3330, 3812, 0, +3526, 3944, 0, +3700, 4076, 0, +3862, 4095, 0, +0, 2708, 3019, +0, 2709, 3019, +0, 2710, 3019, +0, 2712, 3019, +0, 2713, 3019, +0, 2716, 3019, +0, 2719, 3018, +0, 2723, 3018, +0, 2728, 3018, +0, 2735, 3017, +0, 2745, 3016, +0, 2757, 3015, +0, 2770, 3015, +0, 2788, 3015, +0, 2810, 3015, +0, 2838, 3015, +0, 2873, 3015, +0, 2916, 3015, +0, 2968, 3015, +0, 3015, 3001, +0, 3015, 2911, +0, 3015, 2753, +0, 3015, 2387, +0, 3149, 0, +0, 3281, 0, +2180, 3414, 0, +2790, 3547, 0, +3102, 3679, 0, +3333, 3812, 0, +3528, 3944, 0, +3701, 4076, 0, +3863, 4095, 0, +0, 2693, 3019, +0, 2694, 3019, +0, 2695, 3019, +0, 2696, 3019, +0, 2698, 3019, +0, 2701, 3019, +0, 2703, 3018, +0, 2708, 3018, +0, 2714, 3018, +0, 2721, 3017, +0, 2731, 3016, +0, 2743, 3015, +0, 2759, 3014, +0, 2777, 3014, +0, 2800, 3014, +0, 2829, 3014, +0, 2865, 3014, +0, 2908, 3014, +0, 2961, 3014, +0, 3014, 3004, +0, 3014, 2915, +0, 3014, 2759, +0, 3014, 2401, +0, 3148, 0, +0, 3280, 0, +2234, 3414, 0, +2804, 3546, 0, +3110, 3679, 0, +3338, 3811, 0, +3531, 3944, 0, +3703, 4076, 0, +3864, 4095, 0, +0, 2672, 3019, +0, 2672, 3019, +0, 2673, 3019, +0, 2675, 3019, +0, 2677, 3019, +0, 2679, 3019, +0, 2683, 3018, +0, 2687, 3018, +0, 2693, 3018, +0, 2701, 3017, +0, 2711, 3016, +0, 2724, 3015, +0, 2741, 3014, +0, 2763, 3012, +0, 2786, 3012, +0, 2816, 3012, +0, 2853, 3012, +0, 2898, 3012, +0, 2952, 3012, +0, 3012, 3009, +0, 3012, 2921, +0, 3012, 2767, +0, 3012, 2419, +0, 3146, 0, +0, 3280, 0, +2298, 3413, 0, +2824, 3546, 0, +3119, 3678, 0, +3344, 3811, 0, +3535, 3943, 0, +3706, 4076, 0, +3866, 4095, 0, +0, 2641, 3019, +0, 2642, 3019, +0, 2643, 3019, +0, 2645, 3019, +0, 2647, 3019, +0, 2649, 3019, +0, 2653, 3018, +0, 2658, 3018, +0, 2664, 3018, +0, 2672, 3017, +0, 2683, 3016, +0, 2697, 3015, +0, 2715, 3014, +0, 2738, 3012, +0, 2767, 3010, +0, 2798, 3010, +0, 2836, 3010, +0, 2883, 3010, +0, 2939, 3010, +0, 3004, 3010, +0, 3010, 2928, +0, 3010, 2778, +0, 3010, 2441, +0, 3144, 0, +0, 3278, 0, +2371, 3412, 0, +2848, 3545, 0, +3132, 3678, 0, +3352, 3810, 0, +3540, 3943, 0, +3710, 4075, 0, +3868, 4095, 0, +0, 2597, 3019, +0, 2598, 3019, +0, 2599, 3019, +0, 2601, 3019, +0, 2603, 3019, +0, 2606, 3019, +0, 2610, 3018, +0, 2615, 3018, +0, 2622, 3018, +0, 2631, 3017, +0, 2643, 3016, +0, 2658, 3015, +0, 2678, 3014, +0, 2703, 3012, +0, 2734, 3010, +0, 2773, 3006, +0, 2813, 3006, +0, 2862, 3006, +0, 2920, 3006, +0, 2988, 3006, +0, 3006, 2939, +0, 3006, 2792, +0, 3006, 2470, +0, 3142, 0, +0, 3276, 0, +2453, 3410, 0, +2879, 3544, 0, +3149, 3677, 0, +3362, 3810, 0, +3547, 3943, 0, +3714, 4075, 0, +3872, 4095, 0, +0, 2530, 3019, +0, 2531, 3019, +0, 2533, 3019, +0, 2535, 3019, +0, 2537, 3019, +0, 2541, 3019, +0, 2545, 3018, +0, 2551, 3018, +0, 2559, 3018, +0, 2570, 3017, +0, 2583, 3016, +0, 2600, 3015, +0, 2623, 3014, +0, 2651, 3012, +0, 2686, 3010, +0, 2729, 3006, +0, 2781, 3002, +0, 2833, 3002, +0, 2895, 3002, +0, 2966, 3002, +0, 3002, 2952, +0, 3002, 2810, +0, 3002, 2505, +0, 3138, 0, +1202, 3274, 0, +2545, 3408, 0, +2917, 3543, 0, +3170, 3676, 0, +3376, 3809, 0, +3556, 3942, 0, +3721, 4075, 0, +3876, 4095, 0, +0, 2422, 3019, +0, 2424, 3019, +0, 2426, 3019, +0, 2428, 3019, +0, 2431, 3019, +0, 2435, 3019, +0, 2441, 3018, +0, 2449, 3018, +0, 2459, 3018, +0, 2471, 3017, +0, 2488, 3016, +0, 2510, 3015, +0, 2536, 3014, +0, 2570, 3012, +0, 2612, 3010, +0, 2662, 3006, +0, 2722, 3002, +1006, 2791, 2995, +1006, 2858, 2995, +1006, 2935, 2995, +1006, 2995, 2968, +1006, 2995, 2833, +1006, 2995, 2549, +0, 3134, 1211, +1990, 3270, 0, +2643, 3406, 0, +2963, 3541, 0, +3197, 3675, 0, +3393, 3808, 0, +3568, 3941, 0, +3729, 4074, 0, +3882, 4095, 0, +0, 2220, 3019, +0, 2222, 3019, +0, 2225, 3019, +0, 2229, 3019, +0, 2234, 3019, +0, 2241, 3019, +0, 2249, 3018, +0, 2261, 3018, +0, 2276, 3018, +0, 2294, 3017, +0, 2319, 3016, +0, 2350, 3015, +0, 2388, 3014, +0, 2434, 3012, +0, 2489, 3010, +0, 2554, 3006, +0, 2628, 3002, +1006, 2712, 2995, +1930, 2804, 2987, +1930, 2890, 2987, +1930, 2984, 2987, +1930, 2987, 2862, +1930, 2987, 2602, +1137, 3128, 1758, +2327, 3266, 0, +2749, 3402, 0, +3018, 3538, 0, +3231, 3673, 0, +3415, 3807, 0, +3583, 3940, 0, +3740, 4073, 0, +3890, 4095, 0, +0, 1594, 3019, +0, 1602, 3019, +0, 1613, 3019, +0, 1628, 3019, +0, 1646, 3019, +0, 1670, 3019, +0, 1700, 3018, +0, 1737, 3018, +0, 1782, 3018, +0, 1837, 3017, +0, 1900, 3016, +0, 1974, 3015, +0, 2056, 3014, +0, 2148, 3012, +0, 2247, 3010, +0, 2352, 3006, +0, 2463, 3002, +1006, 2579, 2995, +1930, 2699, 2987, +2280, 2821, 2975, +2280, 2929, 2975, +2280, 2975, 2898, +2280, 2975, 2664, +2064, 3119, 2061, +2569, 3259, 1272, +2860, 3398, 0, +3083, 3535, 0, +3273, 3670, 0, +3443, 3805, 0, +3603, 3939, 0, +3754, 4072, 0, +3900, 4095, 0, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3018, +0, 0, 3018, +0, 0, 3018, +0, 0, 3017, +0, 0, 3016, +0, 0, 3015, +0, 0, 3014, +0, 0, 3012, +0, 922, 3010, +0, 1723, 3006, +0, 2062, 3002, +1006, 2303, 2995, +1930, 2503, 2987, +2280, 2680, 2975, +2526, 2843, 2959, +2526, 2959, 2942, +2526, 2959, 2735, +2511, 3108, 2412, +2768, 3251, 2194, +2976, 3392, 1406, +3157, 3530, 0, +3323, 3667, 0, +3479, 3802, 0, +3628, 3937, 0, +3772, 4071, 0, +3913, 4095, 0, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3019, +0, 0, 3018, +0, 0, 3018, +0, 0, 3018, +0, 0, 3017, +0, 0, 3016, +0, 0, 3015, +0, 0, 3014, +0, 0, 3012, +0, 0, 3010, +0, 0, 3006, +1109, 0, 3002, +1635, 1006, 2995, +1930, 1930, 2987, +2280, 2377, 2975, +2526, 2654, 2959, +2728, 2871, 2937, +2728, 2937, 2816, +2787, 3092, 2658, +2945, 3239, 2544, +3095, 3383, 2326, +3241, 3524, 1536, +3382, 3662, 0, +3522, 3799, 0, +3659, 3934, 0, +3795, 4069, 0, +3930, 4095, 0, +2346, 0, 3019, +2346, 0, 3019, +2347, 0, 3019, +2348, 0, 3019, +2350, 0, 3019, +2352, 0, 3019, +2354, 0, 3018, +2358, 0, 3018, +2362, 0, 3018, +2369, 0, 3017, +2377, 0, 3016, +2387, 0, 3015, +2401, 0, 3014, +2419, 0, 3012, +2441, 0, 3010, +2470, 0, 3006, +2505, 0, 3002, +2549, 1006, 2995, +2602, 1930, 2987, +2664, 2280, 2975, +2735, 2526, 2959, +2816, 2728, 2937, +2906, 2906, 2906, +3003, 3069, 2860, +3107, 3223, 2790, +3218, 3372, 2676, +3333, 3515, 2457, +3452, 3656, 1663, +3574, 3794, 0, +3698, 3931, 0, +3824, 4066, 0, +3952, 4095, 0, +2868, 0, 3152, +2868, 0, 3152, +2869, 0, 3152, +2869, 0, 3151, +2869, 0, 3151, +2870, 0, 3151, +2871, 0, 3151, +2872, 0, 3151, +2873, 0, 3151, +2875, 0, 3150, +2878, 0, 3150, +2881, 0, 3149, +2886, 0, 3148, +2892, 0, 3146, +2901, 0, 3144, +2911, 0, 3142, +2925, 0, 3138, +2943, 0, 3134, +2965, 1137, 3128, +2995, 2061, 3119, +3031, 2412, 3108, +3074, 2658, 3092, +3069, 2860, 3003, +3069, 2948, 2860, +3223, 3206, 2790, +3325, 3372, 2676, +3418, 3515, 2457, +3519, 3656, 1663, +3626, 3794, 0, +3738, 3931, 0, +3855, 4066, 0, +3976, 4095, 0, +3162, 0, 3284, +3162, 0, 3283, +3163, 0, 3283, +3163, 0, 3283, +3163, 0, 3283, +3163, 0, 3283, +3164, 0, 3283, +3164, 0, 3283, +3165, 0, 3283, +3166, 0, 3282, +3168, 0, 3282, +3169, 0, 3281, +3172, 0, 3280, +3175, 0, 3280, +3180, 0, 3278, +3185, 0, 3276, +3193, 0, 3274, +3203, 0, 3270, +3216, 0, 3266, +3233, 1272, 3259, +3251, 2194, 3248, +3239, 2544, 3193, +3223, 2790, 3107, +3223, 2790, 2918, +3223, 2999, 2790, +3372, 3294, 2676, +3512, 3515, 2457, +3595, 3656, 1663, +3687, 3794, 0, +3787, 3931, 0, +3893, 4066, 0, +4005, 4095, 0, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3416, +3387, 0, 3415, +3388, 0, 3415, +3388, 0, 3415, +3389, 0, 3415, +3390, 0, 3414, +3391, 0, 3414, +3393, 0, 3414, +3395, 0, 3413, +3397, 0, 3412, +3401, 0, 3410, +3406, 0, 3408, +3406, 0, 3400, +3402, 0, 3384, +3398, 0, 3362, +3392, 1406, 3331, +3383, 2326, 3286, +3372, 2676, 3218, +3372, 2676, 3077, +3372, 2676, 2774, +3372, 3060, 2676, +3515, 3391, 2457, +3656, 3629, 1663, +3759, 3794, 0, +3845, 3931, 0, +3940, 4066, 0, +4042, 4095, 0, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3516, +3548, 0, 3515, +3548, 0, 3515, +3548, 0, 3514, +3547, 0, 3513, +3547, 0, 3512, +3547, 0, 3511, +3546, 0, 3509, +3546, 0, 3506, +3545, 0, 3502, +3544, 0, 3497, +3543, 0, 3490, +3541, 0, 3480, +3538, 0, 3467, +3535, 0, 3449, +3530, 0, 3423, +3524, 1536, 3387, +3515, 2457, 3333, +3515, 2457, 3227, +3515, 2457, 3032, +3515, 2457, 2459, +3515, 3130, 2457, +3656, 3494, 1663, +3794, 3745, 0, +3913, 3931, 0, +3995, 4066, 0, +4087, 4095, 0, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3599, +3680, 0, 3598, +3680, 0, 3598, +3680, 0, 3597, +3680, 0, 3597, +3679, 0, 3596, +3679, 0, 3595, +3679, 0, 3593, +3678, 0, 3590, +3678, 0, 3587, +3677, 0, 3583, +3676, 0, 3577, +3675, 0, 3569, +3673, 0, 3558, +3670, 0, 3543, +3667, 0, 3523, +3662, 0, 3494, +3656, 1663, 3452, +3656, 1663, 3373, +3656, 1663, 3240, +3656, 1663, 2965, +3656, 2289, 1663, +3656, 3210, 1663, +3794, 3603, 0, +3931, 3863, 0, +4060, 4066, 0, +4095, 4095, 0, +3812, 0, 3691, +3812, 0, 3691, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3690, +3812, 0, 3689, +3812, 0, 3689, +3812, 0, 3688, +3812, 0, 3687, +3811, 0, 3685, +3811, 0, 3683, +3810, 0, 3680, +3810, 0, 3677, +3809, 0, 3672, +3808, 0, 3666, +3807, 0, 3657, +3805, 0, 3646, +3802, 0, 3629, +3799, 0, 3606, +3794, 0, 3574, +3794, 0, 3515, +3794, 0, 3421, +3794, 0, 3256, +3794, 0, 2856, +3794, 1884, 0, +3794, 3298, 0, +3931, 3717, 0, +4066, 3985, 0, +4095, 4095, 0, +3944, 0, 3790, +3944, 0, 3790, +3944, 0, 3790, +3944, 0, 3790, +3944, 0, 3789, +3944, 0, 3789, +3944, 0, 3789, +3944, 0, 3789, +3944, 0, 3788, +3944, 0, 3788, +3944, 0, 3787, +3944, 0, 3786, +3944, 0, 3785, +3943, 0, 3784, +3943, 0, 3781, +3943, 0, 3779, +3942, 0, 3775, +3941, 0, 3770, +3940, 0, 3763, +3939, 0, 3754, +3937, 0, 3741, +3934, 0, 3723, +3931, 0, 3698, +3931, 0, 3654, +3931, 0, 3587, +3931, 0, 3479, +3931, 0, 3277, +3931, 0, 2650, +3931, 0, 0, +3931, 3395, 0, +4066, 3835, 0, +4095, 4095, 0, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3895, +4076, 0, 3894, +4076, 0, 3894, +4076, 0, 3893, +4076, 0, 3892, +4076, 0, 3891, +4076, 0, 3890, +4075, 0, 3889, +4075, 0, 3887, +4075, 0, 3884, +4074, 0, 3880, +4073, 0, 3874, +4072, 0, 3867, +4071, 0, 3857, +4069, 0, 3843, +4066, 0, 3824, +4066, 0, 3791, +4066, 0, 3743, +4066, 0, 3669, +4066, 0, 3546, +4066, 0, 3303, +4066, 0, 1985, +4066, 0, 0, +4066, 3498, 0, +4095, 3957, 0, +4095, 0, 4007, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4006, +4095, 0, 4005, +4095, 0, 4005, +4095, 0, 4005, +4095, 0, 4004, +4095, 0, 4003, +4095, 0, 4002, +4095, 0, 4000, +4095, 0, 3998, +4095, 0, 3994, +4095, 0, 3990, +4095, 0, 3984, +4095, 0, 3977, +4095, 0, 3966, +4095, 0, 3952, +4095, 0, 3927, +4095, 0, 3892, +4095, 0, 3840, +4095, 0, 3759, +4095, 0, 3623, +4095, 0, 3337, +4095, 0, 0, +4095, 0, 0, +4095, 3608, 0, +0, 2882, 3152, +0, 2883, 3152, +0, 2883, 3152, +0, 2884, 3152, +0, 2885, 3152, +0, 2886, 3152, +0, 2888, 3152, +0, 2890, 3152, +0, 2893, 3152, +0, 2898, 3152, +0, 2903, 3152, +0, 2911, 3152, +0, 2920, 3152, +0, 2933, 3152, +0, 2949, 3152, +0, 2970, 3152, +0, 2996, 3152, +0, 3030, 3152, +0, 3071, 3152, +0, 3120, 3152, +0, 3152, 3123, +0, 3152, 3031, +0, 3152, 2868, +0, 3152, 2478, +0, 3284, 0, +0, 3416, 0, +2104, 3548, 0, +2876, 3680, 0, +3211, 3812, 0, +3452, 3944, 0, +3651, 4076, 0, +3828, 4095, 0, +0, 2881, 3152, +0, 2882, 3152, +0, 2883, 3152, +0, 2883, 3152, +0, 2885, 3152, +0, 2886, 3152, +0, 2888, 3152, +0, 2890, 3152, +0, 2893, 3152, +0, 2897, 3152, +0, 2903, 3152, +0, 2910, 3152, +0, 2920, 3152, +0, 2932, 3152, +0, 2949, 3152, +0, 2970, 3152, +0, 2996, 3152, +0, 3029, 3152, +0, 3070, 3152, +0, 3120, 3152, +0, 3152, 3123, +0, 3152, 3031, +0, 3152, 2868, +0, 3152, 2478, +0, 3283, 0, +0, 3416, 0, +2107, 3548, 0, +2877, 3680, 0, +3212, 3812, 0, +3452, 3944, 0, +3651, 4076, 0, +3828, 4095, 0, +0, 2881, 3152, +0, 2881, 3152, +0, 2882, 3152, +0, 2883, 3152, +0, 2884, 3152, +0, 2885, 3152, +0, 2887, 3152, +0, 2890, 3152, +0, 2893, 3152, +0, 2897, 3152, +0, 2903, 3152, +0, 2910, 3152, +0, 2919, 3152, +0, 2932, 3152, +0, 2948, 3152, +0, 2969, 3152, +0, 2996, 3152, +0, 3029, 3152, +0, 3070, 3152, +0, 3120, 3152, +0, 3152, 3123, +0, 3152, 3031, +0, 3152, 2869, +0, 3152, 2479, +0, 3283, 0, +0, 3416, 0, +2111, 3548, 0, +2877, 3680, 0, +3212, 3812, 0, +3453, 3944, 0, +3651, 4076, 0, +3828, 4095, 0, +0, 2880, 3152, +0, 2881, 3152, +0, 2881, 3152, +0, 2882, 3151, +0, 2883, 3151, +0, 2885, 3151, +0, 2886, 3151, +0, 2889, 3151, +0, 2892, 3151, +0, 2896, 3151, +0, 2902, 3151, +0, 2909, 3151, +0, 2919, 3151, +0, 2932, 3151, +0, 2948, 3151, +0, 2969, 3151, +0, 2995, 3151, +0, 3029, 3151, +0, 3070, 3151, +0, 3119, 3151, +0, 3151, 3123, +0, 3151, 3031, +0, 3151, 2869, +0, 3151, 2480, +0, 3283, 0, +0, 3416, 0, +2115, 3548, 0, +2878, 3680, 0, +3213, 3812, 0, +3453, 3944, 0, +3652, 4076, 0, +3828, 4095, 0, +0, 2879, 3152, +0, 2880, 3152, +0, 2880, 3152, +0, 2881, 3151, +0, 2883, 3151, +0, 2884, 3151, +0, 2886, 3151, +0, 2888, 3151, +0, 2891, 3151, +0, 2895, 3151, +0, 2901, 3151, +0, 2908, 3151, +0, 2918, 3151, +0, 2931, 3151, +0, 2947, 3151, +0, 2968, 3151, +0, 2995, 3151, +0, 3028, 3151, +0, 3069, 3151, +0, 3119, 3151, +0, 3151, 3123, +0, 3151, 3031, +0, 3151, 2869, +0, 3151, 2481, +0, 3283, 0, +0, 3416, 0, +2122, 3548, 0, +2879, 3680, 0, +3213, 3812, 0, +3453, 3944, 0, +3652, 4076, 0, +3828, 4095, 0, +0, 2878, 3152, +0, 2878, 3152, +0, 2879, 3152, +0, 2880, 3151, +0, 2881, 3151, +0, 2883, 3151, +0, 2885, 3151, +0, 2887, 3151, +0, 2890, 3151, +0, 2895, 3151, +0, 2900, 3151, +0, 2907, 3151, +0, 2917, 3151, +0, 2930, 3151, +0, 2946, 3151, +0, 2967, 3151, +0, 2994, 3151, +0, 3027, 3151, +0, 3068, 3151, +0, 3118, 3151, +0, 3151, 3124, +0, 3151, 3032, +0, 3151, 2870, +0, 3151, 2482, +0, 3283, 0, +0, 3416, 0, +2130, 3548, 0, +2881, 3680, 0, +3214, 3812, 0, +3454, 3944, 0, +3652, 4076, 0, +3829, 4095, 0, +0, 2876, 3152, +0, 2877, 3152, +0, 2877, 3152, +0, 2878, 3151, +0, 2879, 3151, +0, 2881, 3151, +0, 2883, 3151, +0, 2885, 3151, +0, 2889, 3151, +0, 2893, 3151, +0, 2898, 3151, +0, 2906, 3151, +0, 2916, 3151, +0, 2928, 3151, +0, 2945, 3151, +0, 2966, 3151, +0, 2993, 3151, +0, 3026, 3151, +0, 3067, 3151, +0, 3117, 3151, +0, 3151, 3124, +0, 3151, 3032, +0, 3151, 2871, +0, 3151, 2484, +0, 3283, 0, +0, 3415, 0, +2141, 3548, 0, +2883, 3680, 0, +3215, 3812, 0, +3454, 3944, 0, +3653, 4076, 0, +3829, 4095, 0, +0, 2873, 3152, +0, 2874, 3152, +0, 2875, 3152, +0, 2876, 3151, +0, 2877, 3151, +0, 2879, 3151, +0, 2881, 3151, +0, 2883, 3151, +0, 2887, 3151, +0, 2891, 3151, +0, 2896, 3151, +0, 2904, 3151, +0, 2914, 3151, +0, 2927, 3151, +0, 2943, 3151, +0, 2964, 3151, +0, 2991, 3151, +0, 3025, 3151, +0, 3066, 3151, +0, 3116, 3151, +0, 3151, 3125, +0, 3151, 3033, +0, 3151, 2872, +0, 3151, 2487, +0, 3283, 0, +0, 3415, 0, +2156, 3548, 0, +2886, 3680, 0, +3216, 3812, 0, +3455, 3944, 0, +3653, 4076, 0, +3829, 4095, 0, +0, 2870, 3152, +0, 2871, 3152, +0, 2871, 3152, +0, 2872, 3151, +0, 2873, 3151, +0, 2875, 3151, +0, 2877, 3151, +0, 2880, 3151, +0, 2884, 3151, +0, 2888, 3151, +0, 2894, 3151, +0, 2902, 3151, +0, 2911, 3151, +0, 2924, 3151, +0, 2941, 3151, +0, 2962, 3151, +0, 2989, 3151, +0, 3023, 3151, +0, 3064, 3151, +0, 3115, 3151, +0, 3151, 3126, +0, 3151, 3034, +0, 3151, 2873, +0, 3151, 2490, +0, 3283, 0, +0, 3415, 0, +2174, 3548, 0, +2890, 3680, 0, +3218, 3812, 0, +3456, 3944, 0, +3654, 4076, 0, +3830, 4095, 0, +0, 2866, 3152, +0, 2866, 3152, +0, 2867, 3152, +0, 2868, 3151, +0, 2869, 3151, +0, 2871, 3151, +0, 2873, 3151, +0, 2876, 3151, +0, 2880, 3151, +0, 2885, 3150, +0, 2891, 3150, +0, 2898, 3150, +0, 2908, 3150, +0, 2921, 3150, +0, 2938, 3150, +0, 2959, 3150, +0, 2986, 3150, +0, 3020, 3150, +0, 3062, 3150, +0, 3112, 3150, +0, 3150, 3127, +0, 3150, 3036, +0, 3150, 2875, +0, 3150, 2495, +0, 3282, 0, +0, 3415, 0, +2198, 3547, 0, +2895, 3680, 0, +3221, 3812, 0, +3458, 3944, 0, +3655, 4076, 0, +3830, 4095, 0, +0, 2860, 3152, +0, 2860, 3152, +0, 2861, 3152, +0, 2862, 3151, +0, 2863, 3151, +0, 2865, 3151, +0, 2867, 3151, +0, 2870, 3151, +0, 2874, 3151, +0, 2879, 3150, +0, 2886, 3150, +0, 2894, 3150, +0, 2904, 3150, +0, 2917, 3150, +0, 2933, 3150, +0, 2955, 3150, +0, 2982, 3150, +0, 3017, 3150, +0, 3059, 3150, +0, 3110, 3150, +0, 3150, 3128, +0, 3150, 3038, +0, 3150, 2878, +0, 3150, 2501, +0, 3282, 0, +0, 3414, 0, +2228, 3547, 0, +2901, 3679, 0, +3224, 3812, 0, +3459, 3944, 0, +3656, 4076, 0, +3831, 4095, 0, +0, 2851, 3152, +0, 2852, 3152, +0, 2853, 3152, +0, 2854, 3151, +0, 2855, 3151, +0, 2857, 3151, +0, 2859, 3151, +0, 2862, 3151, +0, 2866, 3151, +0, 2871, 3150, +0, 2878, 3150, +0, 2887, 3149, +0, 2898, 3149, +0, 2911, 3149, +0, 2928, 3149, +0, 2950, 3149, +0, 2977, 3149, +0, 3012, 3149, +0, 3055, 3149, +0, 3106, 3149, +0, 3149, 3131, +0, 3149, 3040, +0, 3149, 2881, +0, 3149, 2509, +0, 3281, 0, +0, 3414, 0, +2265, 3547, 0, +2910, 3679, 0, +3228, 3812, 0, +3462, 3944, 0, +3658, 4076, 0, +3832, 4095, 0, +0, 2840, 3152, +0, 2841, 3152, +0, 2842, 3152, +0, 2842, 3151, +0, 2844, 3151, +0, 2845, 3151, +0, 2848, 3151, +0, 2851, 3151, +0, 2855, 3151, +0, 2860, 3150, +0, 2868, 3150, +0, 2877, 3149, +0, 2889, 3148, +0, 2903, 3148, +0, 2920, 3148, +0, 2942, 3148, +0, 2970, 3148, +0, 3005, 3148, +0, 3049, 3148, +0, 3100, 3148, +0, 3148, 3133, +0, 3148, 3043, +0, 3148, 2886, +0, 3148, 2520, +0, 3280, 0, +0, 3414, 0, +2311, 3546, 0, +2922, 3679, 0, +3234, 3811, 0, +3466, 3944, 0, +3660, 4076, 0, +3834, 4095, 0, +0, 2825, 3152, +0, 2825, 3152, +0, 2826, 3152, +0, 2827, 3151, +0, 2829, 3151, +0, 2830, 3151, +0, 2833, 3151, +0, 2836, 3151, +0, 2840, 3151, +0, 2846, 3150, +0, 2853, 3150, +0, 2863, 3149, +0, 2875, 3148, +0, 2892, 3146, +0, 2910, 3146, +0, 2932, 3146, +0, 2961, 3146, +0, 2997, 3146, +0, 3041, 3146, +0, 3093, 3146, +0, 3146, 3137, +0, 3146, 3047, +0, 3146, 2892, +0, 3146, 2533, +0, 3280, 0, +0, 3413, 0, +2365, 3546, 0, +2936, 3678, 0, +3241, 3811, 0, +3470, 3943, 0, +3663, 4076, 0, +3836, 4095, 0, +0, 2803, 3152, +0, 2804, 3152, +0, 2805, 3152, +0, 2806, 3151, +0, 2807, 3151, +0, 2809, 3151, +0, 2812, 3151, +0, 2815, 3151, +0, 2819, 3151, +0, 2825, 3150, +0, 2833, 3150, +0, 2843, 3149, +0, 2856, 3148, +0, 2873, 3146, +0, 2895, 3144, +0, 2919, 3144, +0, 2948, 3144, +0, 2985, 3144, +0, 3030, 3144, +0, 3084, 3144, +0, 3144, 3141, +0, 3144, 3053, +0, 3144, 2901, +0, 3144, 2551, +0, 3278, 0, +0, 3412, 0, +2429, 3545, 0, +2955, 3678, 0, +3251, 3810, 0, +3476, 3943, 0, +3667, 4075, 0, +3838, 4095, 0, +0, 2773, 3152, +0, 2773, 3152, +0, 2774, 3152, +0, 2775, 3151, +0, 2777, 3151, +0, 2779, 3151, +0, 2782, 3151, +0, 2785, 3151, +0, 2790, 3151, +0, 2796, 3150, +0, 2804, 3150, +0, 2815, 3149, +0, 2829, 3148, +0, 2847, 3146, +0, 2870, 3144, +0, 2900, 3142, +0, 2931, 3142, +0, 2969, 3142, +0, 3015, 3142, +0, 3071, 3142, +0, 3136, 3142, +0, 3142, 3061, +0, 3142, 2911, +0, 3142, 2573, +0, 3276, 0, +0, 3410, 0, +2502, 3544, 0, +2980, 3677, 0, +3264, 3810, 0, +3484, 3943, 0, +3672, 4075, 0, +3842, 4095, 0, +0, 2729, 3152, +0, 2729, 3152, +0, 2730, 3152, +0, 2732, 3151, +0, 2733, 3151, +0, 2735, 3151, +0, 2738, 3151, +0, 2742, 3151, +0, 2747, 3151, +0, 2754, 3150, +0, 2763, 3150, +0, 2775, 3149, +0, 2790, 3148, +0, 2810, 3146, +0, 2835, 3144, +0, 2867, 3142, +0, 2906, 3138, +0, 2946, 3138, +0, 2995, 3138, +0, 3053, 3138, +0, 3120, 3138, +0, 3138, 3071, +0, 3138, 2925, +0, 3138, 2602, +0, 3274, 0, +0, 3408, 0, +2585, 3543, 0, +3010, 3676, 0, +3281, 3809, 0, +3494, 3942, 0, +3679, 4075, 0, +3847, 4095, 0, +0, 2662, 3152, +0, 2663, 3152, +0, 2664, 3152, +0, 2665, 3151, +0, 2667, 3151, +0, 2670, 3151, +0, 2673, 3151, +0, 2678, 3151, +0, 2684, 3151, +0, 2691, 3150, +0, 2702, 3150, +0, 2715, 3149, +0, 2733, 3148, +0, 2755, 3146, +0, 2783, 3144, +0, 2818, 3142, +0, 2861, 3138, +0, 2913, 3134, +0, 2965, 3134, +0, 3027, 3134, +0, 3098, 3134, +0, 3134, 3084, +0, 3134, 2943, +0, 3134, 2638, +0, 3270, 0, +1325, 3406, 0, +2676, 3541, 0, +3048, 3675, 0, +3302, 3808, 0, +3507, 3941, 0, +3688, 4074, 0, +3853, 4095, 0, +0, 2554, 3152, +0, 2555, 3152, +0, 2556, 3152, +0, 2558, 3151, +0, 2560, 3151, +0, 2564, 3151, +0, 2568, 3151, +0, 2573, 3151, +0, 2581, 3151, +0, 2591, 3150, +0, 2604, 3150, +0, 2620, 3149, +0, 2642, 3148, +0, 2669, 3146, +0, 2703, 3144, +0, 2744, 3142, +0, 2795, 3138, +0, 2854, 3134, +1137, 2923, 3128, +1137, 2991, 3128, +1137, 3067, 3128, +1137, 3128, 3101, +1137, 3128, 2965, +1137, 3128, 2681, +0, 3266, 1375, +2121, 3402, 0, +2775, 3538, 0, +3095, 3673, 0, +3329, 3807, 0, +3525, 3940, 0, +3700, 4073, 0, +3861, 4095, 0, +0, 2352, 3152, +0, 2353, 3152, +0, 2355, 3152, +0, 2358, 3151, +0, 2362, 3151, +0, 2367, 3151, +0, 2373, 3151, +0, 2382, 3151, +0, 2394, 3151, +0, 2408, 3150, +0, 2427, 3150, +0, 2452, 3149, +0, 2482, 3148, +0, 2521, 3146, +0, 2566, 3144, +0, 2622, 3142, +0, 2687, 3138, +0, 2761, 3134, +1137, 2845, 3128, +2061, 2936, 3119, +2061, 3022, 3119, +2061, 3116, 3119, +2061, 3119, 2995, +2061, 3119, 2734, +1272, 3259, 1899, +2458, 3398, 0, +2881, 3535, 0, +3150, 3670, 0, +3363, 3805, 0, +3547, 3939, 0, +3715, 4072, 0, +3872, 4095, 0, +0, 1720, 3152, +0, 1726, 3152, +0, 1735, 3152, +0, 1746, 3151, +0, 1760, 3151, +0, 1779, 3151, +0, 1802, 3151, +0, 1832, 3151, +0, 1869, 3151, +0, 1915, 3150, +0, 1969, 3150, +0, 2033, 3149, +0, 2106, 3148, +0, 2189, 3146, +0, 2280, 3144, +0, 2379, 3142, +0, 2484, 3138, +0, 2596, 3134, +1137, 2712, 3128, +2061, 2831, 3119, +2412, 2954, 3108, +2412, 3061, 3108, +2412, 3108, 3031, +2412, 3108, 2796, +2194, 3251, 2195, +2701, 3392, 1406, +2992, 3530, 0, +3215, 3667, 0, +3405, 3802, 0, +3575, 3937, 0, +3735, 4071, 0, +3886, 4095, 0, +0, 0, 3152, +0, 0, 3152, +0, 0, 3152, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3150, +0, 0, 3150, +0, 0, 3149, +0, 0, 3148, +0, 0, 3146, +0, 0, 3144, +0, 1068, 3142, +0, 1857, 3138, +0, 2195, 3134, +1137, 2436, 3128, +2061, 2636, 3119, +2412, 2813, 3108, +2658, 2976, 3092, +2658, 3092, 3074, +2658, 3092, 2867, +2642, 3239, 2544, +2900, 3383, 2326, +3108, 3524, 1536, +3289, 3662, 0, +3455, 3799, 0, +3611, 3934, 0, +3760, 4069, 0, +3904, 4095, 0, +0, 0, 3152, +0, 0, 3152, +0, 0, 3152, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3151, +0, 0, 3150, +0, 0, 3150, +0, 0, 3149, +0, 0, 3148, +0, 0, 3146, +0, 0, 3144, +0, 0, 3142, +0, 0, 3138, +1211, 0, 3134, +1758, 1137, 3128, +2061, 2064, 3119, +2412, 2511, 3108, +2658, 2787, 3092, +2860, 3003, 3069, +2860, 3069, 2948, +2918, 3223, 2790, +3077, 3372, 2676, +3227, 3515, 2457, +3373, 3656, 1663, +3515, 3794, 0, +3654, 3931, 0, +3791, 4066, 0, +3927, 4095, 0, +2478, 0, 3152, +2478, 0, 3152, +2479, 0, 3152, +2480, 0, 3151, +2481, 0, 3151, +2482, 0, 3151, +2484, 0, 3151, +2487, 0, 3151, +2490, 0, 3151, +2495, 0, 3150, +2501, 0, 3150, +2509, 0, 3149, +2520, 0, 3148, +2533, 0, 3146, +2551, 0, 3144, +2573, 0, 3142, +2602, 0, 3138, +2638, 0, 3134, +2681, 1137, 3128, +2734, 2061, 3119, +2796, 2412, 3108, +2867, 2658, 3092, +2948, 2860, 3069, +3038, 3038, 3038, +3135, 3201, 2992, +3239, 3356, 2922, +3350, 3504, 2808, +3465, 3648, 2590, +3584, 3788, 1799, +3706, 3926, 0, +3830, 4063, 0, +3956, 4095, 0, +2999, 0, 3284, +2999, 0, 3283, +2999, 0, 3283, +2999, 0, 3283, +3000, 0, 3283, +3000, 0, 3283, +3001, 0, 3283, +3002, 0, 3283, +3003, 0, 3283, +3005, 0, 3282, +3006, 0, 3282, +3009, 0, 3281, +3013, 0, 3280, +3017, 0, 3280, +3023, 0, 3278, +3032, 0, 3276, +3042, 0, 3274, +3056, 0, 3270, +3074, 0, 3266, +3097, 1272, 3259, +3126, 2194, 3251, +3162, 2544, 3239, +3206, 2790, 3223, +3201, 2992, 3135, +3201, 3080, 2992, +3356, 3338, 2922, +3457, 3504, 2808, +3550, 3648, 2590, +3651, 3788, 1799, +3758, 3926, 0, +3870, 4063, 0, +3987, 4095, 0, +3294, 0, 3416, +3294, 0, 3416, +3294, 0, 3416, +3294, 0, 3416, +3295, 0, 3416, +3295, 0, 3416, +3295, 0, 3415, +3296, 0, 3415, +3296, 0, 3415, +3297, 0, 3415, +3298, 0, 3414, +3299, 0, 3414, +3301, 0, 3414, +3304, 0, 3413, +3307, 0, 3412, +3311, 0, 3410, +3317, 0, 3408, +3325, 0, 3406, +3335, 0, 3402, +3348, 0, 3398, +3365, 1406, 3392, +3383, 2326, 3380, +3372, 2676, 3325, +3356, 2922, 3239, +3356, 2922, 3051, +3356, 3132, 2922, +3504, 3426, 2808, +3644, 3648, 2590, +3728, 3788, 1799, +3820, 3926, 0, +3919, 4063, 0, +4025, 4095, 0, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3519, 0, 3548, +3520, 0, 3548, +3520, 0, 3548, +3520, 0, 3547, +3521, 0, 3547, +3522, 0, 3547, +3523, 0, 3546, +3525, 0, 3546, +3526, 0, 3545, +3529, 0, 3544, +3533, 0, 3543, +3538, 0, 3541, +3538, 0, 3532, +3535, 0, 3516, +3530, 0, 3495, +3524, 1536, 3463, +3515, 2457, 3418, +3504, 2808, 3350, +3504, 2808, 3209, +3504, 2808, 2907, +3504, 3192, 2808, +3648, 3523, 2590, +3788, 3761, 1799, +3891, 3926, 0, +3977, 4063, 0, +4072, 4095, 0, +3680, 0, 3649, +3680, 0, 3649, +3680, 0, 3649, +3680, 0, 3649, +3680, 0, 3648, +3680, 0, 3648, +3680, 0, 3648, +3680, 0, 3648, +3680, 0, 3647, +3680, 0, 3646, +3679, 0, 3646, +3679, 0, 3644, +3679, 0, 3643, +3678, 0, 3641, +3678, 0, 3638, +3677, 0, 3634, +3676, 0, 3629, +3675, 0, 3622, +3673, 0, 3612, +3670, 0, 3599, +3667, 0, 3581, +3662, 0, 3555, +3656, 1663, 3519, +3648, 2590, 3465, +3648, 2590, 3360, +3648, 2590, 3165, +3648, 2590, 2592, +3648, 3262, 2590, +3788, 3626, 1799, +3926, 3877, 0, +4045, 4063, 0, +4095, 4095, 0, +3812, 0, 3732, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3731, +3812, 0, 3730, +3812, 0, 3730, +3812, 0, 3729, +3812, 0, 3729, +3812, 0, 3728, +3811, 0, 3727, +3811, 0, 3725, +3810, 0, 3722, +3810, 0, 3719, +3809, 0, 3715, +3808, 0, 3709, +3807, 0, 3701, +3805, 0, 3690, +3802, 0, 3676, +3799, 0, 3655, +3794, 0, 3626, +3788, 1799, 3584, +3788, 1799, 3505, +3788, 1799, 3372, +3788, 1799, 3097, +3788, 2422, 1799, +3788, 3342, 1799, +3926, 3735, 0, +4063, 3995, 0, +4095, 4095, 0, +3944, 0, 3823, +3944, 0, 3823, +3944, 0, 3823, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3822, +3944, 0, 3821, +3944, 0, 3820, +3944, 0, 3820, +3944, 0, 3819, +3943, 0, 3817, +3943, 0, 3815, +3943, 0, 3813, +3942, 0, 3809, +3941, 0, 3805, +3940, 0, 3798, +3939, 0, 3790, +3937, 0, 3777, +3934, 0, 3761, +3931, 0, 3738, +3926, 0, 3706, +3926, 0, 3647, +3926, 0, 3553, +3926, 0, 3388, +3926, 0, 2988, +3926, 2023, 0, +3926, 3430, 0, +4063, 3849, 0, +4095, 4095, 0, +4076, 0, 3922, +4076, 0, 3922, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3921, +4076, 0, 3920, +4076, 0, 3919, +4076, 0, 3918, +4076, 0, 3917, +4075, 0, 3916, +4075, 0, 3913, +4075, 0, 3911, +4074, 0, 3907, +4073, 0, 3902, +4072, 0, 3895, +4071, 0, 3886, +4069, 0, 3873, +4066, 0, 3855, +4063, 0, 3830, +4063, 0, 3786, +4063, 0, 3719, +4063, 0, 3611, +4063, 0, 3409, +4063, 0, 2781, +4063, 0, 0, +4063, 3527, 0, +4095, 3968, 0, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4027, +4095, 0, 4026, +4095, 0, 4026, +4095, 0, 4026, +4095, 0, 4025, +4095, 0, 4024, +4095, 0, 4023, +4095, 0, 4021, +4095, 0, 4019, +4095, 0, 4016, +4095, 0, 4012, +4095, 0, 4006, +4095, 0, 3999, +4095, 0, 3989, +4095, 0, 3976, +4095, 0, 3956, +4095, 0, 3923, +4095, 0, 3875, +4095, 0, 3801, +4095, 0, 3679, +4095, 0, 3436, +4095, 0, 2137, +4095, 0, 0, +4095, 3630, 0, +0, 3014, 3284, +0, 3014, 3284, +0, 3014, 3284, +0, 3015, 3284, +0, 3016, 3284, +0, 3017, 3284, +0, 3018, 3284, +0, 3020, 3284, +0, 3022, 3284, +0, 3025, 3284, +0, 3030, 3284, +0, 3035, 3284, +0, 3043, 3284, +0, 3052, 3284, +0, 3065, 3284, +0, 3081, 3284, +0, 3102, 3284, +0, 3128, 3284, +0, 3162, 3284, +0, 3203, 3284, +0, 3252, 3284, +0, 3284, 3254, +0, 3284, 3162, +0, 3284, 2999, +0, 3284, 2609, +0, 3416, 0, +0, 3548, 0, +2237, 3680, 0, +3008, 3812, 0, +3344, 3944, 0, +3584, 4076, 0, +3784, 4095, 0, +0, 3014, 3284, +0, 3014, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3017, 3283, +0, 3018, 3283, +0, 3020, 3283, +0, 3022, 3283, +0, 3025, 3283, +0, 3029, 3283, +0, 3035, 3283, +0, 3042, 3283, +0, 3052, 3283, +0, 3065, 3283, +0, 3081, 3283, +0, 3102, 3283, +0, 3128, 3283, +0, 3162, 3283, +0, 3203, 3283, +0, 3252, 3283, +0, 3283, 3254, +0, 3283, 3162, +0, 3283, 2999, +0, 3283, 2609, +0, 3416, 0, +0, 3548, 0, +2239, 3680, 0, +3009, 3812, 0, +3344, 3944, 0, +3584, 4076, 0, +3784, 4095, 0, +0, 3013, 3284, +0, 3014, 3283, +0, 3014, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3018, 3283, +0, 3019, 3283, +0, 3022, 3283, +0, 3025, 3283, +0, 3029, 3283, +0, 3035, 3283, +0, 3042, 3283, +0, 3052, 3283, +0, 3064, 3283, +0, 3081, 3283, +0, 3101, 3283, +0, 3128, 3283, +0, 3161, 3283, +0, 3202, 3283, +0, 3252, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 2999, +0, 3283, 2610, +0, 3416, 0, +0, 3548, 0, +2242, 3680, 0, +3009, 3812, 0, +3344, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3012, 3284, +0, 3013, 3283, +0, 3013, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3017, 3283, +0, 3019, 3283, +0, 3021, 3283, +0, 3025, 3283, +0, 3029, 3283, +0, 3034, 3283, +0, 3042, 3283, +0, 3051, 3283, +0, 3064, 3283, +0, 3080, 3283, +0, 3101, 3283, +0, 3128, 3283, +0, 3161, 3283, +0, 3202, 3283, +0, 3252, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 2999, +0, 3283, 2611, +0, 3416, 0, +0, 3548, 0, +2246, 3680, 0, +3010, 3812, 0, +3344, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3012, 3284, +0, 3012, 3283, +0, 3013, 3283, +0, 3013, 3283, +0, 3014, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3018, 3283, +0, 3021, 3283, +0, 3024, 3283, +0, 3028, 3283, +0, 3034, 3283, +0, 3041, 3283, +0, 3051, 3283, +0, 3063, 3283, +0, 3080, 3283, +0, 3101, 3283, +0, 3127, 3283, +0, 3160, 3283, +0, 3201, 3283, +0, 3251, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 3000, +0, 3283, 2612, +0, 3416, 0, +0, 3548, 0, +2251, 3680, 0, +3011, 3812, 0, +3345, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3011, 3284, +0, 3011, 3283, +0, 3011, 3283, +0, 3012, 3283, +0, 3013, 3283, +0, 3014, 3283, +0, 3016, 3283, +0, 3018, 3283, +0, 3020, 3283, +0, 3023, 3283, +0, 3027, 3283, +0, 3033, 3283, +0, 3040, 3283, +0, 3050, 3283, +0, 3062, 3283, +0, 3079, 3283, +0, 3100, 3283, +0, 3127, 3283, +0, 3160, 3283, +0, 3201, 3283, +0, 3251, 3283, +0, 3283, 3255, +0, 3283, 3163, +0, 3283, 3000, +0, 3283, 2613, +0, 3416, 0, +0, 3548, 0, +2257, 3680, 0, +3012, 3812, 0, +3346, 3944, 0, +3585, 4076, 0, +3784, 4095, 0, +0, 3009, 3284, +0, 3010, 3283, +0, 3010, 3283, +0, 3011, 3283, +0, 3012, 3283, +0, 3013, 3283, +0, 3015, 3283, +0, 3016, 3283, +0, 3019, 3283, +0, 3022, 3283, +0, 3026, 3283, +0, 3032, 3283, +0, 3039, 3283, +0, 3049, 3283, +0, 3062, 3283, +0, 3078, 3283, +0, 3099, 3283, +0, 3126, 3283, +0, 3159, 3283, +0, 3200, 3283, +0, 3250, 3283, +0, 3283, 3256, +0, 3283, 3164, +0, 3283, 3001, +0, 3283, 2614, +0, 3415, 0, +0, 3548, 0, +2266, 3680, 0, +3014, 3812, 0, +3346, 3944, 0, +3586, 4076, 0, +3784, 4095, 0, +0, 3008, 3284, +0, 3008, 3283, +0, 3008, 3283, +0, 3009, 3283, +0, 3010, 3283, +0, 3011, 3283, +0, 3013, 3283, +0, 3015, 3283, +0, 3017, 3283, +0, 3021, 3283, +0, 3025, 3283, +0, 3031, 3283, +0, 3038, 3283, +0, 3047, 3283, +0, 3060, 3283, +0, 3077, 3283, +0, 3098, 3283, +0, 3125, 3283, +0, 3158, 3283, +0, 3199, 3283, +0, 3249, 3283, +0, 3283, 3256, +0, 3283, 3164, +0, 3283, 3002, +0, 3283, 2616, +0, 3415, 0, +0, 3548, 0, +2277, 3680, 0, +3016, 3812, 0, +3347, 3944, 0, +3586, 4076, 0, +3785, 4095, 0, +0, 3005, 3284, +0, 3005, 3283, +0, 3006, 3283, +0, 3007, 3283, +0, 3008, 3283, +0, 3009, 3283, +0, 3010, 3283, +0, 3013, 3283, +0, 3015, 3283, +0, 3018, 3283, +0, 3023, 3283, +0, 3029, 3283, +0, 3036, 3283, +0, 3046, 3283, +0, 3059, 3283, +0, 3075, 3283, +0, 3096, 3283, +0, 3123, 3283, +0, 3157, 3283, +0, 3198, 3283, +0, 3248, 3283, +0, 3283, 3257, +0, 3283, 3165, +0, 3283, 3003, +0, 3283, 2619, +0, 3415, 0, +0, 3548, 0, +2291, 3680, 0, +3019, 3812, 0, +3349, 3944, 0, +3587, 4076, 0, +3786, 4095, 0, +0, 3002, 3284, +0, 3002, 3283, +0, 3002, 3283, +0, 3003, 3283, +0, 3004, 3283, +0, 3005, 3283, +0, 3007, 3283, +0, 3009, 3283, +0, 3012, 3283, +0, 3016, 3282, +0, 3020, 3282, +0, 3026, 3282, +0, 3033, 3282, +0, 3043, 3282, +0, 3056, 3282, +0, 3073, 3282, +0, 3094, 3282, +0, 3121, 3282, +0, 3155, 3282, +0, 3196, 3282, +0, 3247, 3282, +0, 3282, 3257, +0, 3282, 3166, +0, 3282, 3005, +0, 3282, 2622, +0, 3415, 0, +0, 3547, 0, +2310, 3680, 0, +3023, 3812, 0, +3351, 3944, 0, +3588, 4076, 0, +3786, 4095, 0, +0, 2997, 3284, +0, 2998, 3283, +0, 2998, 3283, +0, 2999, 3283, +0, 3000, 3283, +0, 3001, 3283, +0, 3003, 3283, +0, 3005, 3283, +0, 3008, 3283, +0, 3012, 3282, +0, 3017, 3282, +0, 3023, 3282, +0, 3030, 3282, +0, 3040, 3282, +0, 3053, 3282, +0, 3070, 3282, +0, 3091, 3282, +0, 3118, 3282, +0, 3152, 3282, +0, 3194, 3282, +0, 3244, 3282, +0, 3282, 3259, +0, 3282, 3168, +0, 3282, 3006, +0, 3282, 2627, +0, 3414, 0, +0, 3547, 0, +2333, 3679, 0, +3027, 3812, 0, +3353, 3944, 0, +3590, 4076, 0, +3787, 4095, 0, +0, 2991, 3284, +0, 2992, 3283, +0, 2992, 3283, +0, 2993, 3283, +0, 2994, 3283, +0, 2995, 3283, +0, 2997, 3283, +0, 2999, 3283, +0, 3002, 3283, +0, 3006, 3282, +0, 3011, 3282, +0, 3018, 3281, +0, 3025, 3281, +0, 3035, 3281, +0, 3049, 3281, +0, 3065, 3281, +0, 3087, 3281, +0, 3114, 3281, +0, 3149, 3281, +0, 3191, 3281, +0, 3242, 3281, +0, 3281, 3260, +0, 3281, 3169, +0, 3281, 3009, +0, 3281, 2633, +0, 3414, 0, +0, 3547, 0, +2363, 3679, 0, +3034, 3812, 0, +3356, 3944, 0, +3592, 4076, 0, +3788, 4095, 0, +0, 2983, 3284, +0, 2983, 3283, +0, 2984, 3283, +0, 2985, 3283, +0, 2986, 3283, +0, 2987, 3283, +0, 2988, 3283, +0, 2991, 3283, +0, 2994, 3283, +0, 2998, 3282, +0, 3003, 3282, +0, 3010, 3281, +0, 3019, 3280, +0, 3029, 3280, +0, 3043, 3280, +0, 3060, 3280, +0, 3082, 3280, +0, 3109, 3280, +0, 3144, 3280, +0, 3186, 3280, +0, 3238, 3280, +0, 3280, 3262, +0, 3280, 3172, +0, 3280, 3013, +0, 3280, 2641, +0, 3414, 0, +0, 3546, 0, +2400, 3679, 0, +3043, 3811, 0, +3361, 3944, 0, +3594, 4076, 0, +3790, 4095, 0, +0, 2972, 3284, +0, 2972, 3283, +0, 2973, 3283, +0, 2973, 3283, +0, 2974, 3283, +0, 2976, 3283, +0, 2977, 3283, +0, 2980, 3283, +0, 2983, 3283, +0, 2987, 3282, +0, 2992, 3282, +0, 2999, 3281, +0, 3009, 3280, +0, 3021, 3280, +0, 3034, 3280, +0, 3052, 3280, +0, 3074, 3280, +0, 3102, 3280, +0, 3138, 3280, +0, 3180, 3280, +0, 3233, 3280, +0, 3280, 3265, +0, 3280, 3175, +0, 3280, 3017, +0, 3280, 2651, +0, 3413, 0, +0, 3546, 0, +2445, 3678, 0, +3054, 3811, 0, +3366, 3943, 0, +3597, 4076, 0, +3792, 4095, 0, +0, 2956, 3284, +0, 2957, 3283, +0, 2957, 3283, +0, 2958, 3283, +0, 2959, 3283, +0, 2960, 3283, +0, 2962, 3283, +0, 2965, 3283, +0, 2968, 3283, +0, 2972, 3282, +0, 2977, 3282, +0, 2985, 3281, +0, 2995, 3280, +0, 3007, 3280, +0, 3024, 3278, +0, 3041, 3278, +0, 3064, 3278, +0, 3093, 3278, +0, 3129, 3278, +0, 3173, 3278, +0, 3225, 3278, +0, 3278, 3269, +0, 3278, 3180, +0, 3278, 3023, +0, 3278, 2665, +0, 3412, 0, +0, 3545, 0, +2499, 3678, 0, +3069, 3810, 0, +3374, 3943, 0, +3602, 4075, 0, +3795, 4095, 0, +0, 2935, 3284, +0, 2935, 3283, +0, 2936, 3283, +0, 2936, 3283, +0, 2938, 3283, +0, 2939, 3283, +0, 2941, 3283, +0, 2943, 3283, +0, 2947, 3283, +0, 2951, 3282, +0, 2957, 3282, +0, 2965, 3281, +0, 2975, 3280, +0, 2988, 3280, +0, 3005, 3278, +0, 3027, 3276, +0, 3050, 3276, +0, 3080, 3276, +0, 3117, 3276, +0, 3162, 3276, +0, 3216, 3276, +0, 3276, 3273, +0, 3276, 3185, +0, 3276, 3032, +0, 3276, 2683, +0, 3410, 0, +0, 3544, 0, +2562, 3677, 0, +3088, 3810, 0, +3384, 3943, 0, +3608, 4075, 0, +3799, 4095, 0, +0, 2904, 3284, +0, 2905, 3283, +0, 2905, 3283, +0, 2906, 3283, +0, 2907, 3283, +0, 2909, 3283, +0, 2911, 3283, +0, 2914, 3283, +0, 2917, 3283, +0, 2922, 3282, +0, 2928, 3282, +0, 2936, 3281, +0, 2947, 3280, +0, 2961, 3280, +0, 2979, 3278, +0, 3002, 3276, +0, 3031, 3274, +0, 3062, 3274, +0, 3100, 3274, +0, 3147, 3274, +0, 3203, 3274, +0, 3268, 3274, +0, 3274, 3193, +0, 3274, 3042, +0, 3274, 2706, +0, 3408, 0, +0, 3543, 0, +2636, 3676, 0, +3112, 3809, 0, +3396, 3942, 0, +3616, 4075, 0, +3804, 4095, 0, +0, 2860, 3284, +0, 2860, 3283, +0, 2861, 3283, +0, 2862, 3283, +0, 2863, 3283, +0, 2865, 3283, +0, 2867, 3283, +0, 2870, 3283, +0, 2874, 3283, +0, 2879, 3282, +0, 2886, 3282, +0, 2895, 3281, +0, 2907, 3280, +0, 2922, 3280, +0, 2942, 3278, +0, 2967, 3276, +0, 2998, 3274, +0, 3037, 3270, +0, 3078, 3270, +0, 3126, 3270, +0, 3184, 3270, +0, 3252, 3270, +0, 3270, 3203, +0, 3270, 3056, +0, 3270, 2734, +0, 3406, 0, +0, 3541, 0, +2718, 3675, 0, +3143, 3808, 0, +3413, 3941, 0, +3626, 4074, 0, +3811, 4095, 0, +0, 2793, 3284, +0, 2793, 3283, +0, 2794, 3283, +0, 2795, 3283, +0, 2797, 3283, +0, 2799, 3283, +0, 2801, 3283, +0, 2805, 3283, +0, 2809, 3283, +0, 2815, 3282, +0, 2823, 3282, +0, 2833, 3281, +0, 2847, 3280, +0, 2865, 3280, +0, 2886, 3278, +0, 2915, 3276, +0, 2950, 3274, +0, 2993, 3270, +0, 3045, 3266, +0, 3097, 3266, +0, 3159, 3266, +0, 3230, 3266, +0, 3266, 3216, +0, 3266, 3074, +0, 3266, 2770, +0, 3402, 0, +1477, 3538, 0, +2809, 3673, 0, +3181, 3807, 0, +3434, 3940, 0, +3640, 4073, 0, +3820, 4095, 0, +0, 2684, 3284, +0, 2685, 3283, +0, 2686, 3283, +0, 2688, 3283, +0, 2690, 3283, +0, 2692, 3283, +0, 2695, 3283, +0, 2700, 3283, +0, 2705, 3283, +0, 2713, 3282, +0, 2723, 3282, +0, 2735, 3281, +0, 2752, 3280, +0, 2773, 3280, +0, 2800, 3278, +0, 2834, 3276, +0, 2876, 3274, +0, 2926, 3270, +0, 2986, 3266, +1272, 3055, 3259, +1272, 3122, 3259, +1272, 3199, 3259, +1272, 3259, 3233, +1272, 3259, 3097, +1272, 3259, 2813, +0, 3398, 1484, +2256, 3535, 0, +2908, 3670, 0, +3227, 3805, 0, +3461, 3939, 0, +3657, 4072, 0, +3832, 4095, 0, +0, 2481, 3284, +0, 2482, 3283, +0, 2484, 3283, +0, 2486, 3283, +0, 2489, 3283, +0, 2493, 3283, +0, 2498, 3283, +0, 2504, 3283, +0, 2513, 3283, +0, 2524, 3282, +0, 2539, 3282, +0, 2558, 3281, +0, 2583, 3280, +0, 2613, 3280, +0, 2651, 3278, +0, 2698, 3276, +0, 2753, 3274, +0, 2818, 3270, +0, 2893, 3266, +1272, 2976, 3259, +2194, 3069, 3251, +2194, 3154, 3251, +2194, 3248, 3251, +2194, 3251, 3126, +2194, 3251, 2866, +1406, 3392, 2025, +2593, 3530, 0, +3014, 3667, 0, +3282, 3802, 0, +3495, 3937, 0, +3679, 4071, 0, +3847, 4095, 0, +0, 1844, 3284, +0, 1849, 3283, +0, 1856, 3283, +0, 1864, 3283, +0, 1875, 3283, +0, 1890, 3283, +0, 1908, 3283, +0, 1932, 3283, +0, 1962, 3283, +0, 1999, 3282, +0, 2045, 3282, +0, 2100, 3281, +0, 2164, 3280, +0, 2237, 3280, +0, 2320, 3278, +0, 2411, 3276, +0, 2510, 3274, +0, 2616, 3270, +0, 2727, 3266, +1272, 2843, 3259, +2194, 2963, 3251, +2544, 3085, 3239, +2544, 3193, 3239, +2544, 3239, 3162, +2544, 3239, 2928, +2328, 3383, 2326, +2833, 3524, 1536, +3125, 3662, 0, +3347, 3799, 0, +3537, 3934, 0, +3708, 4069, 0, +3867, 4095, 0, +0, 0, 3284, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3282, +0, 0, 3282, +0, 0, 3281, +0, 0, 3280, +0, 0, 3280, +0, 0, 3278, +0, 0, 3276, +0, 1202, 3274, +0, 1990, 3270, +0, 2327, 3266, +1272, 2569, 3259, +2194, 2768, 3251, +2544, 2945, 3239, +2790, 3107, 3223, +2790, 3223, 3206, +2790, 3223, 2999, +2774, 3372, 2676, +3032, 3515, 2457, +3240, 3656, 1663, +3421, 3794, 0, +3587, 3931, 0, +3743, 4066, 0, +3892, 4095, 0, +0, 0, 3284, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3283, +0, 0, 3282, +0, 0, 3282, +0, 0, 3281, +0, 0, 3280, +0, 0, 3280, +0, 0, 3278, +0, 0, 3276, +0, 0, 3274, +0, 0, 3270, +1375, 0, 3266, +1899, 1272, 3259, +2195, 2194, 3251, +2544, 2642, 3239, +2790, 2918, 3223, +2992, 3135, 3201, +2992, 3201, 3080, +3051, 3356, 2922, +3209, 3504, 2808, +3360, 3648, 2590, +3505, 3788, 1799, +3647, 3926, 0, +3786, 4063, 0, +3923, 4095, 0, +2609, 0, 3284, +2609, 0, 3283, +2610, 0, 3283, +2611, 0, 3283, +2612, 0, 3283, +2613, 0, 3283, +2614, 0, 3283, +2616, 0, 3283, +2619, 0, 3283, +2622, 0, 3282, +2627, 0, 3282, +2633, 0, 3281, +2641, 0, 3280, +2651, 0, 3280, +2665, 0, 3278, +2683, 0, 3276, +2706, 0, 3274, +2734, 0, 3270, +2770, 0, 3266, +2813, 1272, 3259, +2866, 2194, 3251, +2928, 2544, 3239, +2999, 2790, 3223, +3080, 2992, 3201, +3170, 3170, 3170, +3267, 3333, 3124, +3372, 3488, 3054, +3482, 3636, 2940, +3597, 3780, 2721, +3716, 3920, 1928, +3838, 4058, 0, +3962, 4095, 0, +3132, 0, 3416, +3132, 0, 3416, +3132, 0, 3416, +3132, 0, 3416, +3132, 0, 3416, +3133, 0, 3416, +3133, 0, 3415, +3134, 0, 3415, +3135, 0, 3415, +3136, 0, 3415, +3137, 0, 3414, +3139, 0, 3414, +3142, 0, 3414, +3145, 0, 3413, +3150, 0, 3412, +3156, 0, 3410, +3164, 0, 3408, +3175, 0, 3406, +3189, 0, 3402, +3206, 0, 3398, +3230, 1406, 3392, +3258, 2326, 3383, +3294, 2676, 3372, +3338, 2922, 3356, +3333, 3124, 3267, +3333, 3212, 3124, +3488, 3470, 3054, +3589, 3636, 2940, +3682, 3780, 2721, +3783, 3920, 1928, +3890, 4058, 0, +4002, 4095, 0, +3426, 0, 3548, +3426, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3427, 0, 3548, +3428, 0, 3548, +3428, 0, 3548, +3429, 0, 3547, +3429, 0, 3547, +3430, 0, 3547, +3432, 0, 3546, +3434, 0, 3546, +3436, 0, 3545, +3440, 0, 3544, +3444, 0, 3543, +3450, 0, 3541, +3457, 0, 3538, +3467, 0, 3535, +3480, 0, 3530, +3497, 1536, 3524, +3515, 2457, 3512, +3504, 2808, 3457, +3488, 3054, 3372, +3488, 3054, 3183, +3488, 3264, 3054, +3636, 3558, 2940, +3776, 3780, 2721, +3860, 3920, 1928, +3952, 4058, 0, +4051, 4095, 0, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3651, 0, 3680, +3652, 0, 3680, +3652, 0, 3680, +3652, 0, 3680, +3653, 0, 3679, +3653, 0, 3679, +3654, 0, 3679, +3655, 0, 3678, +3657, 0, 3678, +3659, 0, 3677, +3662, 0, 3676, +3665, 0, 3675, +3670, 0, 3673, +3670, 0, 3664, +3667, 0, 3648, +3662, 0, 3626, +3656, 1663, 3595, +3648, 2590, 3550, +3636, 2940, 3482, +3636, 2940, 3341, +3636, 2940, 3038, +3636, 3324, 2940, +3780, 3655, 2721, +3920, 3893, 1928, +4023, 4058, 0, +4095, 4095, 0, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3781, +3812, 0, 3780, +3812, 0, 3780, +3812, 0, 3779, +3812, 0, 3778, +3812, 0, 3777, +3811, 0, 3777, +3811, 0, 3775, +3810, 0, 3773, +3810, 0, 3770, +3809, 0, 3766, +3808, 0, 3761, +3807, 0, 3754, +3805, 0, 3744, +3802, 0, 3731, +3799, 0, 3713, +3794, 0, 3687, +3788, 1799, 3651, +3780, 2721, 3597, +3780, 2721, 3492, +3780, 2721, 3296, +3780, 2721, 2722, +3780, 3394, 2721, +3920, 3758, 1928, +4058, 4008, 0, +4095, 4095, 0, +3944, 0, 3864, +3944, 0, 3864, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3863, +3944, 0, 3862, +3944, 0, 3862, +3944, 0, 3861, +3944, 0, 3860, +3943, 0, 3859, +3943, 0, 3857, +3943, 0, 3854, +3942, 0, 3851, +3941, 0, 3847, +3940, 0, 3841, +3939, 0, 3833, +3937, 0, 3822, +3934, 0, 3808, +3931, 0, 3787, +3926, 0, 3758, +3920, 1928, 3716, +3920, 1928, 3637, +3920, 1928, 3504, +3920, 1928, 3229, +3920, 2556, 1928, +3920, 3474, 1928, +4058, 3867, 0, +4095, 4095, 0, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3955, +4076, 0, 3954, +4076, 0, 3954, +4076, 0, 3954, +4076, 0, 3954, +4076, 0, 3953, +4076, 0, 3953, +4076, 0, 3953, +4076, 0, 3952, +4076, 0, 3950, +4075, 0, 3949, +4075, 0, 3947, +4075, 0, 3945, +4074, 0, 3941, +4073, 0, 3937, +4072, 0, 3930, +4071, 0, 3921, +4069, 0, 3910, +4066, 0, 3893, +4063, 0, 3870, +4058, 0, 3838, +4058, 0, 3779, +4058, 0, 3685, +4058, 0, 3520, +4058, 0, 3119, +4058, 2157, 0, +4058, 3562, 0, +4095, 3982, 0, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4054, +4095, 0, 4053, +4095, 0, 4053, +4095, 0, 4053, +4095, 0, 4053, +4095, 0, 4052, +4095, 0, 4051, +4095, 0, 4051, +4095, 0, 4049, +4095, 0, 4048, +4095, 0, 4046, +4095, 0, 4043, +4095, 0, 4039, +4095, 0, 4034, +4095, 0, 4027, +4095, 0, 4018, +4095, 0, 4005, +4095, 0, 3987, +4095, 0, 3962, +4095, 0, 3918, +4095, 0, 3851, +4095, 0, 3743, +4095, 0, 3541, +4095, 0, 2915, +4095, 0, 0, +4095, 3659, 0, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3152, 3416, +0, 3155, 3416, +0, 3158, 3416, +0, 3162, 3416, +0, 3168, 3416, +0, 3175, 3416, +0, 3184, 3416, +0, 3197, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3261, 3416, +0, 3294, 3416, +0, 3335, 3416, +0, 3385, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2741, +0, 3548, 0, +0, 3680, 0, +2367, 3812, 0, +3140, 3944, 0, +3475, 4076, 0, +3716, 4095, 0, +0, 3146, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3152, 3416, +0, 3154, 3416, +0, 3158, 3416, +0, 3162, 3416, +0, 3168, 3416, +0, 3175, 3416, +0, 3184, 3416, +0, 3197, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3261, 3416, +0, 3294, 3416, +0, 3335, 3416, +0, 3385, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2741, +0, 3548, 0, +0, 3680, 0, +2369, 3812, 0, +3140, 3944, 0, +3475, 4076, 0, +3717, 4095, 0, +0, 3145, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3150, 3416, +0, 3152, 3416, +0, 3154, 3416, +0, 3157, 3416, +0, 3162, 3416, +0, 3167, 3416, +0, 3175, 3416, +0, 3184, 3416, +0, 3197, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3260, 3416, +0, 3294, 3416, +0, 3335, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2742, +0, 3548, 0, +0, 3680, 0, +2371, 3812, 0, +3140, 3944, 0, +3476, 4076, 0, +3717, 4095, 0, +0, 3145, 3416, +0, 3145, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3150, 3416, +0, 3151, 3416, +0, 3154, 3416, +0, 3157, 3416, +0, 3161, 3416, +0, 3167, 3416, +0, 3174, 3416, +0, 3184, 3416, +0, 3196, 3416, +0, 3213, 3416, +0, 3234, 3416, +0, 3260, 3416, +0, 3293, 3416, +0, 3335, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3294, +0, 3416, 3132, +0, 3416, 2742, +0, 3548, 0, +0, 3680, 0, +2374, 3812, 0, +3141, 3944, 0, +3476, 4076, 0, +3717, 4095, 0, +0, 3144, 3416, +0, 3145, 3416, +0, 3145, 3416, +0, 3146, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3148, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3154, 3416, +0, 3157, 3416, +0, 3161, 3416, +0, 3166, 3416, +0, 3174, 3416, +0, 3184, 3416, +0, 3196, 3416, +0, 3212, 3416, +0, 3233, 3416, +0, 3260, 3416, +0, 3293, 3416, +0, 3334, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3295, +0, 3416, 3132, +0, 3416, 2743, +0, 3548, 0, +0, 3680, 0, +2377, 3812, 0, +3142, 3944, 0, +3476, 4076, 0, +3717, 4095, 0, +0, 3144, 3416, +0, 3144, 3416, +0, 3144, 3416, +0, 3145, 3416, +0, 3145, 3416, +0, 3146, 3416, +0, 3147, 3416, +0, 3149, 3416, +0, 3151, 3416, +0, 3153, 3416, +0, 3156, 3416, +0, 3160, 3416, +0, 3166, 3416, +0, 3173, 3416, +0, 3183, 3416, +0, 3196, 3416, +0, 3212, 3416, +0, 3233, 3416, +0, 3259, 3416, +0, 3293, 3416, +0, 3334, 3416, +0, 3384, 3416, +0, 3416, 3387, +0, 3416, 3295, +0, 3416, 3133, +0, 3416, 2744, +0, 3548, 0, +0, 3680, 0, +2382, 3812, 0, +3143, 3944, 0, +3477, 4076, 0, +3717, 4095, 0, +0, 3143, 3416, +0, 3143, 3416, +0, 3143, 3416, +0, 3144, 3416, +0, 3144, 3416, +0, 3145, 3416, +0, 3147, 3415, +0, 3148, 3415, +0, 3150, 3415, +0, 3152, 3415, +0, 3155, 3415, +0, 3160, 3415, +0, 3165, 3415, +0, 3173, 3415, +0, 3182, 3415, +0, 3195, 3415, +0, 3211, 3415, +0, 3232, 3415, +0, 3259, 3415, +0, 3292, 3415, +0, 3333, 3415, +0, 3383, 3415, +0, 3415, 3387, +0, 3415, 3295, +0, 3415, 3133, +0, 3415, 2745, +0, 3548, 0, +0, 3680, 0, +2389, 3812, 0, +3144, 3944, 0, +3477, 4076, 0, +3718, 4095, 0, +0, 3141, 3416, +0, 3141, 3416, +0, 3142, 3416, +0, 3142, 3416, +0, 3143, 3416, +0, 3144, 3416, +0, 3145, 3415, +0, 3147, 3415, +0, 3149, 3415, +0, 3151, 3415, +0, 3154, 3415, +0, 3158, 3415, +0, 3164, 3415, +0, 3171, 3415, +0, 3181, 3415, +0, 3194, 3415, +0, 3210, 3415, +0, 3231, 3415, +0, 3258, 3415, +0, 3291, 3415, +0, 3333, 3415, +0, 3382, 3415, +0, 3415, 3388, +0, 3415, 3296, +0, 3415, 3134, +0, 3415, 2746, +0, 3548, 0, +0, 3680, 0, +2397, 3812, 0, +3145, 3944, 0, +3478, 4076, 0, +3718, 4095, 0, +0, 3139, 3416, +0, 3140, 3416, +0, 3140, 3416, +0, 3141, 3416, +0, 3141, 3416, +0, 3142, 3416, +0, 3144, 3415, +0, 3145, 3415, +0, 3147, 3415, +0, 3150, 3415, +0, 3153, 3415, +0, 3157, 3415, +0, 3163, 3415, +0, 3170, 3415, +0, 3180, 3415, +0, 3192, 3415, +0, 3209, 3415, +0, 3230, 3415, +0, 3257, 3415, +0, 3290, 3415, +0, 3331, 3415, +0, 3381, 3415, +0, 3415, 3388, +0, 3415, 3296, +0, 3415, 3135, +0, 3415, 2748, +0, 3548, 0, +0, 3680, 0, +2408, 3812, 0, +3147, 3944, 0, +3479, 4076, 0, +3719, 4095, 0, +0, 3137, 3416, +0, 3137, 3416, +0, 3138, 3416, +0, 3138, 3416, +0, 3139, 3416, +0, 3140, 3416, +0, 3141, 3415, +0, 3143, 3415, +0, 3145, 3415, +0, 3147, 3415, +0, 3151, 3415, +0, 3155, 3415, +0, 3161, 3415, +0, 3168, 3415, +0, 3178, 3415, +0, 3191, 3415, +0, 3207, 3415, +0, 3228, 3415, +0, 3255, 3415, +0, 3289, 3415, +0, 3330, 3415, +0, 3380, 3415, +0, 3415, 3389, +0, 3415, 3297, +0, 3415, 3136, +0, 3415, 2751, +0, 3547, 0, +0, 3680, 0, +2422, 3812, 0, +3151, 3944, 0, +3480, 4076, 0, +3720, 4095, 0, +0, 3134, 3416, +0, 3134, 3416, +0, 3134, 3416, +0, 3135, 3416, +0, 3135, 3416, +0, 3136, 3416, +0, 3138, 3415, +0, 3139, 3415, +0, 3141, 3415, +0, 3144, 3415, +0, 3148, 3414, +0, 3152, 3414, +0, 3158, 3414, +0, 3165, 3414, +0, 3175, 3414, +0, 3188, 3414, +0, 3205, 3414, +0, 3226, 3414, +0, 3253, 3414, +0, 3287, 3414, +0, 3329, 3414, +0, 3379, 3414, +0, 3414, 3390, +0, 3414, 3298, +0, 3414, 3137, +0, 3414, 2754, +0, 3547, 0, +0, 3679, 0, +2441, 3812, 0, +3154, 3944, 0, +3482, 4076, 0, +3721, 4095, 0, +0, 3129, 3416, +0, 3129, 3416, +0, 3130, 3416, +0, 3130, 3416, +0, 3131, 3416, +0, 3132, 3416, +0, 3133, 3415, +0, 3135, 3415, +0, 3137, 3415, +0, 3140, 3415, +0, 3144, 3414, +0, 3149, 3414, +0, 3155, 3414, +0, 3162, 3414, +0, 3172, 3414, +0, 3185, 3414, +0, 3202, 3414, +0, 3223, 3414, +0, 3250, 3414, +0, 3284, 3414, +0, 3326, 3414, +0, 3376, 3414, +0, 3414, 3391, +0, 3414, 3299, +0, 3414, 3139, +0, 3414, 2759, +0, 3547, 0, +0, 3679, 0, +2465, 3812, 0, +3159, 3944, 0, +3485, 4076, 0, +3722, 4095, 0, +0, 3123, 3416, +0, 3123, 3416, +0, 3124, 3416, +0, 3124, 3416, +0, 3125, 3416, +0, 3126, 3416, +0, 3127, 3415, +0, 3129, 3415, +0, 3131, 3415, +0, 3134, 3415, +0, 3138, 3414, +0, 3143, 3414, +0, 3150, 3414, +0, 3158, 3414, +0, 3168, 3414, +0, 3181, 3414, +0, 3198, 3414, +0, 3219, 3414, +0, 3247, 3414, +0, 3281, 3414, +0, 3323, 3414, +0, 3374, 3414, +0, 3414, 3393, +0, 3414, 3301, +0, 3414, 3142, +0, 3414, 2765, +0, 3546, 0, +0, 3679, 0, +2494, 3811, 0, +3166, 3944, 0, +3488, 4076, 0, +3724, 4095, 0, +0, 3115, 3416, +0, 3115, 3416, +0, 3115, 3416, +0, 3116, 3416, +0, 3117, 3416, +0, 3118, 3416, +0, 3119, 3415, +0, 3121, 3415, +0, 3123, 3415, +0, 3126, 3415, +0, 3130, 3414, +0, 3135, 3414, +0, 3142, 3414, +0, 3151, 3413, +0, 3162, 3413, +0, 3175, 3413, +0, 3192, 3413, +0, 3214, 3413, +0, 3242, 3413, +0, 3276, 3413, +0, 3319, 3413, +0, 3370, 3413, +0, 3413, 3395, +0, 3413, 3304, +0, 3413, 3145, +0, 3413, 2773, +0, 3546, 0, +0, 3678, 0, +2531, 3811, 0, +3175, 3943, 0, +3492, 4076, 0, +3727, 4095, 0, +0, 3104, 3416, +0, 3104, 3416, +0, 3104, 3416, +0, 3105, 3416, +0, 3106, 3416, +0, 3106, 3416, +0, 3108, 3415, +0, 3110, 3415, +0, 3112, 3415, +0, 3115, 3415, +0, 3119, 3414, +0, 3125, 3414, +0, 3132, 3414, +0, 3141, 3413, +0, 3154, 3412, +0, 3167, 3412, +0, 3184, 3412, +0, 3206, 3412, +0, 3234, 3412, +0, 3270, 3412, +0, 3313, 3412, +0, 3365, 3412, +0, 3412, 3397, +0, 3412, 3307, +0, 3412, 3150, +0, 3412, 2784, +0, 3545, 0, +0, 3678, 0, +2576, 3810, 0, +3186, 3943, 0, +3498, 4075, 0, +3730, 4095, 0, +0, 3088, 3416, +0, 3088, 3416, +0, 3089, 3416, +0, 3089, 3416, +0, 3090, 3416, +0, 3091, 3416, +0, 3093, 3415, +0, 3094, 3415, +0, 3097, 3415, +0, 3100, 3415, +0, 3104, 3414, +0, 3110, 3414, +0, 3117, 3414, +0, 3127, 3413, +0, 3140, 3412, +0, 3156, 3410, +0, 3174, 3410, +0, 3196, 3410, +0, 3225, 3410, +0, 3261, 3410, +0, 3305, 3410, +0, 3358, 3410, +0, 3410, 3401, +0, 3410, 3311, +0, 3410, 3156, +0, 3410, 2797, +0, 3544, 0, +0, 3677, 0, +2631, 3810, 0, +3201, 3943, 0, +3505, 4075, 0, +3735, 4095, 0, +0, 3067, 3416, +0, 3067, 3416, +0, 3067, 3416, +0, 3068, 3416, +0, 3069, 3416, +0, 3070, 3416, +0, 3071, 3415, +0, 3073, 3415, +0, 3076, 3415, +0, 3079, 3415, +0, 3083, 3414, +0, 3089, 3414, +0, 3097, 3414, +0, 3107, 3413, +0, 3120, 3412, +0, 3137, 3410, +0, 3159, 3408, +0, 3183, 3408, +0, 3212, 3408, +0, 3249, 3408, +0, 3294, 3408, +0, 3348, 3408, +0, 3408, 3406, +0, 3408, 3317, +0, 3408, 3164, +0, 3408, 2815, +0, 3543, 0, +0, 3676, 0, +2694, 3809, 0, +3220, 3942, 0, +3515, 4075, 0, +3741, 4095, 0, +0, 3036, 3416, +0, 3036, 3416, +0, 3037, 3416, +0, 3038, 3416, +0, 3038, 3416, +0, 3039, 3416, +0, 3041, 3415, +0, 3043, 3415, +0, 3046, 3415, +0, 3049, 3415, +0, 3054, 3414, +0, 3060, 3414, +0, 3069, 3414, +0, 3079, 3413, +0, 3093, 3412, +0, 3111, 3410, +0, 3134, 3408, +0, 3164, 3406, +0, 3194, 3406, +0, 3233, 3406, +0, 3279, 3406, +0, 3335, 3406, +0, 3400, 3406, +0, 3406, 3325, +0, 3406, 3175, +0, 3406, 2838, +0, 3541, 0, +0, 3675, 0, +2767, 3808, 0, +3244, 3941, 0, +3528, 4074, 0, +3748, 4095, 0, +0, 2992, 3416, +0, 2992, 3416, +0, 2992, 3416, +0, 2993, 3416, +0, 2994, 3416, +0, 2996, 3416, +0, 2997, 3415, +0, 2999, 3415, +0, 3002, 3415, +0, 3006, 3415, +0, 3011, 3414, +0, 3018, 3414, +0, 3027, 3414, +0, 3039, 3413, +0, 3055, 3412, +0, 3074, 3410, +0, 3099, 3408, +0, 3131, 3406, +0, 3170, 3402, +0, 3210, 3402, +0, 3259, 3402, +0, 3317, 3402, +0, 3384, 3402, +0, 3402, 3335, +0, 3402, 3189, +0, 3402, 2866, +0, 3538, 0, +0, 3673, 0, +2850, 3807, 0, +3275, 3940, 0, +3545, 4073, 0, +3759, 4095, 0, +0, 2925, 3416, +0, 2925, 3416, +0, 2926, 3416, +0, 2927, 3416, +0, 2928, 3416, +0, 2929, 3416, +0, 2931, 3415, +0, 2934, 3415, +0, 2937, 3415, +0, 2942, 3415, +0, 2947, 3414, +0, 2956, 3414, +0, 2966, 3414, +0, 2979, 3413, +0, 2997, 3412, +0, 3019, 3410, +0, 3047, 3408, +0, 3082, 3406, +0, 3125, 3402, +0, 3177, 3398, +0, 3230, 3398, +0, 3291, 3398, +0, 3362, 3398, +0, 3398, 3348, +0, 3398, 3206, +0, 3398, 2902, +0, 3535, 0, +1603, 3670, 0, +2941, 3805, 0, +3313, 3939, 0, +3566, 4072, 0, +3772, 4095, 0, +0, 2816, 3416, +0, 2817, 3416, +0, 2817, 3416, +0, 2818, 3416, +0, 2820, 3416, +0, 2822, 3416, +0, 2824, 3415, +0, 2827, 3415, +0, 2832, 3415, +0, 2837, 3415, +0, 2845, 3414, +0, 2855, 3414, +0, 2867, 3414, +0, 2884, 3413, +0, 2906, 3412, +0, 2933, 3410, +0, 2966, 3408, +0, 3008, 3406, +0, 3059, 3402, +0, 3118, 3398, +1406, 3187, 3392, +1406, 3255, 3392, +1406, 3331, 3392, +1406, 3392, 3365, +1406, 3392, 3230, +1406, 3392, 2945, +0, 3530, 1621, +2388, 3667, 0, +3040, 3802, 0, +3359, 3937, 0, +3593, 4071, 0, +3790, 4095, 0, +0, 2613, 3416, +0, 2614, 3416, +0, 2615, 3416, +0, 2617, 3416, +0, 2619, 3416, +0, 2621, 3416, +0, 2625, 3415, +0, 2630, 3415, +0, 2637, 3415, +0, 2646, 3415, +0, 2657, 3414, +0, 2672, 3414, +0, 2691, 3414, +0, 2715, 3413, +0, 2746, 3412, +0, 2784, 3410, +0, 2830, 3408, +0, 2886, 3406, +0, 2951, 3402, +0, 3025, 3398, +1406, 3108, 3392, +2326, 3201, 3383, +2326, 3286, 3383, +2326, 3380, 3383, +2326, 3383, 3258, +2326, 3383, 2998, +1536, 3524, 2158, +2724, 3662, 0, +3145, 3799, 0, +3414, 3934, 0, +3627, 4069, 0, +3812, 4095, 0, +0, 1977, 3416, +0, 1981, 3416, +0, 1986, 3416, +0, 1992, 3416, +0, 2000, 3416, +0, 2011, 3416, +0, 2026, 3415, +0, 2044, 3415, +0, 2068, 3415, +0, 2098, 3415, +0, 2135, 3414, +0, 2180, 3414, +0, 2234, 3414, +0, 2298, 3413, +0, 2371, 3412, +0, 2453, 3410, +0, 2545, 3408, +0, 2643, 3406, +0, 2749, 3402, +0, 2860, 3398, +1406, 2976, 3392, +2326, 3095, 3383, +2676, 3218, 3372, +2676, 3325, 3372, +2676, 3372, 3294, +2676, 3372, 3060, +2459, 3515, 2457, +2965, 3656, 1663, +3256, 3794, 0, +3479, 3931, 0, +3669, 4066, 0, +3840, 4095, 0, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3414, +0, 0, 3414, +0, 0, 3414, +0, 0, 3413, +0, 0, 3412, +0, 0, 3410, +0, 0, 3408, +0, 1325, 3406, +0, 2121, 3402, +0, 2458, 3398, +1406, 2701, 3392, +2326, 2900, 3383, +2676, 3077, 3372, +2922, 3239, 3356, +2922, 3356, 3338, +2922, 3356, 3132, +2907, 3504, 2808, +3165, 3648, 2590, +3372, 3788, 1799, +3553, 3926, 0, +3719, 4063, 0, +3875, 4095, 0, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3416, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3415, +0, 0, 3414, +0, 0, 3414, +0, 0, 3414, +0, 0, 3413, +0, 0, 3412, +0, 0, 3410, +0, 0, 3408, +0, 0, 3406, +0, 0, 3402, +1484, 0, 3398, +2025, 1406, 3392, +2326, 2328, 3383, +2676, 2774, 3372, +2922, 3051, 3356, +3124, 3267, 3333, +3124, 3333, 3212, +3183, 3488, 3054, +3341, 3636, 2940, +3492, 3780, 2721, +3637, 3920, 1928, +3779, 4058, 0, +3918, 4095, 0, +2741, 0, 3416, +2741, 0, 3416, +2742, 0, 3416, +2742, 0, 3416, +2743, 0, 3416, +2744, 0, 3416, +2745, 0, 3415, +2746, 0, 3415, +2748, 0, 3415, +2751, 0, 3415, +2754, 0, 3414, +2759, 0, 3414, +2765, 0, 3414, +2773, 0, 3413, +2784, 0, 3412, +2797, 0, 3410, +2815, 0, 3408, +2838, 0, 3406, +2866, 0, 3402, +2902, 0, 3398, +2945, 1406, 3392, +2998, 2326, 3383, +3060, 2676, 3372, +3132, 2922, 3356, +3212, 3124, 3333, +3302, 3302, 3302, +3399, 3466, 3256, +3504, 3620, 3186, +3614, 3768, 3072, +3729, 3912, 2854, +3848, 4052, 2063, +3970, 4095, 0, +3264, 0, 3548, +3264, 0, 3548, +3264, 0, 3548, +3264, 0, 3548, +3264, 0, 3548, +3265, 0, 3548, +3265, 0, 3548, +3265, 0, 3548, +3266, 0, 3548, +3267, 0, 3547, +3268, 0, 3547, +3269, 0, 3547, +3271, 0, 3546, +3274, 0, 3546, +3278, 0, 3545, +3282, 0, 3544, +3288, 0, 3543, +3296, 0, 3541, +3307, 0, 3538, +3321, 0, 3535, +3339, 0, 3530, +3362, 1536, 3524, +3391, 2457, 3515, +3426, 2808, 3504, +3470, 3054, 3488, +3466, 3256, 3399, +3466, 3344, 3256, +3620, 3603, 3186, +3721, 3768, 3072, +3814, 3912, 2854, +3915, 4052, 2063, +4022, 4095, 0, +3558, 0, 3680, +3558, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3559, 0, 3680, +3560, 0, 3680, +3560, 0, 3680, +3561, 0, 3679, +3562, 0, 3679, +3563, 0, 3679, +3564, 0, 3678, +3566, 0, 3678, +3568, 0, 3677, +3572, 0, 3676, +3576, 0, 3675, +3582, 0, 3673, +3589, 0, 3670, +3599, 0, 3667, +3612, 0, 3662, +3629, 1663, 3656, +3648, 2590, 3644, +3636, 2940, 3589, +3620, 3186, 3504, +3620, 3186, 3315, +3620, 3396, 3186, +3768, 3691, 3072, +3908, 3912, 2854, +3992, 4052, 2063, +4084, 4095, 0, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3783, 0, 3812, +3784, 0, 3812, +3784, 0, 3812, +3784, 0, 3812, +3784, 0, 3812, +3785, 0, 3812, +3785, 0, 3811, +3786, 0, 3811, +3787, 0, 3810, +3789, 0, 3810, +3791, 0, 3809, +3794, 0, 3808, +3797, 0, 3807, +3802, 0, 3805, +3802, 0, 3796, +3799, 0, 3781, +3794, 0, 3759, +3788, 1799, 3728, +3780, 2721, 3682, +3768, 3072, 3614, +3768, 3072, 3473, +3768, 3072, 3171, +3768, 3456, 3072, +3912, 3787, 2854, +4052, 4025, 2063, +4095, 4095, 0, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3913, +3944, 0, 3912, +3944, 0, 3912, +3944, 0, 3912, +3944, 0, 3911, +3944, 0, 3910, +3944, 0, 3910, +3943, 0, 3909, +3943, 0, 3907, +3943, 0, 3905, +3942, 0, 3902, +3941, 0, 3898, +3940, 0, 3893, +3939, 0, 3886, +3937, 0, 3876, +3934, 0, 3863, +3931, 0, 3845, +3926, 0, 3820, +3920, 1928, 3783, +3912, 2854, 3729, +3912, 2854, 3624, +3912, 2854, 3428, +3912, 2854, 2854, +3912, 3526, 2854, +4052, 3890, 2063, +4095, 4095, 0, +4076, 0, 3996, +4076, 0, 3996, +4076, 0, 3996, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3995, +4076, 0, 3994, +4076, 0, 3994, +4076, 0, 3993, +4076, 0, 3992, +4075, 0, 3991, +4075, 0, 3989, +4075, 0, 3986, +4074, 0, 3983, +4073, 0, 3979, +4072, 0, 3973, +4071, 0, 3965, +4069, 0, 3954, +4066, 0, 3940, +4063, 0, 3919, +4058, 0, 3890, +4052, 2063, 3848, +4052, 2063, 3769, +4052, 2063, 3636, +4052, 2063, 3361, +4052, 2689, 2063, +4052, 3606, 2063, +4095, 4000, 0, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4087, +4095, 0, 4086, +4095, 0, 4086, +4095, 0, 4086, +4095, 0, 4085, +4095, 0, 4085, +4095, 0, 4084, +4095, 0, 4083, +4095, 0, 4082, +4095, 0, 4080, +4095, 0, 4077, +4095, 0, 4073, +4095, 0, 4069, +4095, 0, 4062, +4095, 0, 4054, +4095, 0, 4042, +4095, 0, 4025, +4095, 0, 4002, +4095, 0, 3970, +4095, 0, 3911, +4095, 0, 3818, +4095, 0, 3653, +4095, 0, 3253, +4095, 2266, 0, +4095, 3695, 0, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3285, 3548, +0, 3287, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3300, 3548, +0, 3307, 3548, +0, 3317, 3548, +0, 3329, 3548, +0, 3346, 3548, +0, 3367, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3426, +0, 3548, 3264, +0, 3548, 2873, +0, 3680, 0, +0, 3812, 0, +2497, 3944, 0, +3271, 4076, 0, +3608, 4095, 0, +0, 3278, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3284, 3548, +0, 3287, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3300, 3548, +0, 3307, 3548, +0, 3317, 3548, +0, 3329, 3548, +0, 3346, 3548, +0, 3367, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3426, +0, 3548, 3264, +0, 3548, 2873, +0, 3680, 0, +0, 3812, 0, +2498, 3944, 0, +3272, 4076, 0, +3608, 4095, 0, +0, 3278, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3287, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3300, 3548, +0, 3307, 3548, +0, 3317, 3548, +0, 3329, 3548, +0, 3346, 3548, +0, 3366, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3264, +0, 3548, 2873, +0, 3680, 0, +0, 3812, 0, +2500, 3944, 0, +3272, 4076, 0, +3608, 4095, 0, +0, 3277, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3286, 3548, +0, 3290, 3548, +0, 3294, 3548, +0, 3299, 3548, +0, 3307, 3548, +0, 3316, 3548, +0, 3329, 3548, +0, 3345, 3548, +0, 3366, 3548, +0, 3393, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3264, +0, 3548, 2874, +0, 3680, 0, +0, 3812, 0, +2502, 3944, 0, +3272, 4076, 0, +3608, 4095, 0, +0, 3277, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3280, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3286, 3548, +0, 3289, 3548, +0, 3293, 3548, +0, 3299, 3548, +0, 3307, 3548, +0, 3316, 3548, +0, 3329, 3548, +0, 3345, 3548, +0, 3366, 3548, +0, 3392, 3548, +0, 3426, 3548, +0, 3467, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3264, +0, 3548, 2874, +0, 3680, 0, +0, 3812, 0, +2505, 3944, 0, +3273, 4076, 0, +3608, 4095, 0, +0, 3276, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3286, 3548, +0, 3289, 3548, +0, 3293, 3548, +0, 3299, 3548, +0, 3306, 3548, +0, 3316, 3548, +0, 3328, 3548, +0, 3344, 3548, +0, 3365, 3548, +0, 3392, 3548, +0, 3425, 3548, +0, 3466, 3548, +0, 3516, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3265, +0, 3548, 2875, +0, 3680, 0, +0, 3812, 0, +2508, 3944, 0, +3273, 4076, 0, +3609, 4095, 0, +0, 3276, 3548, +0, 3276, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3285, 3548, +0, 3288, 3548, +0, 3292, 3548, +0, 3298, 3548, +0, 3305, 3548, +0, 3315, 3548, +0, 3328, 3548, +0, 3344, 3548, +0, 3365, 3548, +0, 3392, 3548, +0, 3425, 3548, +0, 3466, 3548, +0, 3515, 3548, +0, 3548, 3519, +0, 3548, 3427, +0, 3548, 3265, +0, 3548, 2876, +0, 3680, 0, +0, 3812, 0, +2513, 3944, 0, +3274, 4076, 0, +3609, 4095, 0, +0, 3275, 3548, +0, 3275, 3548, +0, 3275, 3548, +0, 3275, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3278, 3548, +0, 3279, 3548, +0, 3280, 3548, +0, 3282, 3548, +0, 3284, 3548, +0, 3287, 3548, +0, 3292, 3548, +0, 3297, 3548, +0, 3305, 3548, +0, 3314, 3548, +0, 3327, 3548, +0, 3343, 3548, +0, 3364, 3548, +0, 3391, 3548, +0, 3424, 3548, +0, 3466, 3548, +0, 3515, 3548, +0, 3548, 3520, +0, 3548, 3428, +0, 3548, 3265, +0, 3548, 2877, +0, 3680, 0, +0, 3812, 0, +2520, 3944, 0, +3276, 4076, 0, +3610, 4095, 0, +0, 3273, 3548, +0, 3273, 3548, +0, 3274, 3548, +0, 3274, 3548, +0, 3275, 3548, +0, 3275, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3279, 3548, +0, 3281, 3548, +0, 3283, 3548, +0, 3286, 3548, +0, 3291, 3548, +0, 3296, 3548, +0, 3303, 3548, +0, 3313, 3548, +0, 3326, 3548, +0, 3342, 3548, +0, 3363, 3548, +0, 3390, 3548, +0, 3423, 3548, +0, 3465, 3548, +0, 3514, 3548, +0, 3548, 3520, +0, 3548, 3428, +0, 3548, 3266, +0, 3548, 2878, +0, 3680, 0, +0, 3812, 0, +2528, 3944, 0, +3277, 4076, 0, +3611, 4095, 0, +0, 3271, 3548, +0, 3272, 3548, +0, 3272, 3548, +0, 3272, 3548, +0, 3273, 3548, +0, 3273, 3548, +0, 3274, 3548, +0, 3276, 3548, +0, 3277, 3548, +0, 3279, 3547, +0, 3282, 3547, +0, 3285, 3547, +0, 3289, 3547, +0, 3295, 3547, +0, 3302, 3547, +0, 3312, 3547, +0, 3325, 3547, +0, 3341, 3547, +0, 3362, 3547, +0, 3389, 3547, +0, 3422, 3547, +0, 3464, 3547, +0, 3513, 3547, +0, 3547, 3520, +0, 3547, 3429, +0, 3547, 3267, +0, 3547, 2880, +0, 3680, 0, +0, 3812, 0, +2539, 3944, 0, +3279, 4076, 0, +3612, 4095, 0, +0, 3269, 3548, +0, 3269, 3548, +0, 3269, 3548, +0, 3270, 3548, +0, 3270, 3548, +0, 3271, 3548, +0, 3272, 3548, +0, 3273, 3548, +0, 3275, 3548, +0, 3277, 3547, +0, 3280, 3547, +0, 3283, 3547, +0, 3287, 3547, +0, 3293, 3547, +0, 3300, 3547, +0, 3310, 3547, +0, 3323, 3547, +0, 3339, 3547, +0, 3361, 3547, +0, 3387, 3547, +0, 3421, 3547, +0, 3462, 3547, +0, 3512, 3547, +0, 3547, 3521, +0, 3547, 3429, +0, 3547, 3268, +0, 3547, 2883, +0, 3679, 0, +0, 3812, 0, +2553, 3944, 0, +3282, 4076, 0, +3613, 4095, 0, +0, 3266, 3548, +0, 3266, 3548, +0, 3266, 3548, +0, 3267, 3548, +0, 3267, 3548, +0, 3268, 3548, +0, 3269, 3548, +0, 3270, 3548, +0, 3271, 3548, +0, 3274, 3547, +0, 3277, 3547, +0, 3280, 3547, +0, 3285, 3547, +0, 3290, 3547, +0, 3298, 3547, +0, 3307, 3547, +0, 3320, 3547, +0, 3337, 3547, +0, 3358, 3547, +0, 3385, 3547, +0, 3419, 3547, +0, 3461, 3547, +0, 3511, 3547, +0, 3547, 3522, +0, 3547, 3430, +0, 3547, 3269, +0, 3547, 2886, +0, 3679, 0, +0, 3812, 0, +2572, 3944, 0, +3286, 4076, 0, +3615, 4095, 0, +0, 3261, 3548, +0, 3261, 3548, +0, 3261, 3548, +0, 3262, 3548, +0, 3262, 3548, +0, 3263, 3548, +0, 3264, 3548, +0, 3265, 3548, +0, 3267, 3548, +0, 3269, 3547, +0, 3272, 3547, +0, 3276, 3547, +0, 3281, 3546, +0, 3287, 3546, +0, 3294, 3546, +0, 3304, 3546, +0, 3317, 3546, +0, 3334, 3546, +0, 3355, 3546, +0, 3382, 3546, +0, 3416, 3546, +0, 3458, 3546, +0, 3509, 3546, +0, 3546, 3523, +0, 3546, 3432, +0, 3546, 3271, +0, 3546, 2891, +0, 3679, 0, +0, 3811, 0, +2596, 3944, 0, +3291, 4076, 0, +3617, 4095, 0, +0, 3255, 3548, +0, 3255, 3548, +0, 3256, 3548, +0, 3256, 3548, +0, 3256, 3548, +0, 3257, 3548, +0, 3258, 3548, +0, 3259, 3548, +0, 3261, 3548, +0, 3263, 3547, +0, 3266, 3547, +0, 3270, 3547, +0, 3275, 3546, +0, 3282, 3546, +0, 3290, 3546, +0, 3300, 3546, +0, 3313, 3546, +0, 3330, 3546, +0, 3351, 3546, +0, 3379, 3546, +0, 3413, 3546, +0, 3455, 3546, +0, 3506, 3546, +0, 3546, 3525, +0, 3546, 3434, +0, 3546, 3274, +0, 3546, 2897, +0, 3678, 0, +0, 3811, 0, +2625, 3943, 0, +3297, 4076, 0, +3621, 4095, 0, +0, 3247, 3548, +0, 3247, 3548, +0, 3247, 3548, +0, 3248, 3548, +0, 3248, 3548, +0, 3249, 3548, +0, 3250, 3548, +0, 3251, 3548, +0, 3253, 3548, +0, 3255, 3547, +0, 3258, 3547, +0, 3262, 3547, +0, 3268, 3546, +0, 3275, 3546, +0, 3284, 3545, +0, 3294, 3545, +0, 3307, 3545, +0, 3324, 3545, +0, 3346, 3545, +0, 3374, 3545, +0, 3408, 3545, +0, 3451, 3545, +0, 3502, 3545, +0, 3545, 3526, +0, 3545, 3436, +0, 3545, 3278, +0, 3545, 2905, +0, 3678, 0, +0, 3810, 0, +2662, 3943, 0, +3306, 4075, 0, +3625, 4095, 0, +0, 3236, 3548, +0, 3236, 3548, +0, 3236, 3548, +0, 3237, 3548, +0, 3237, 3548, +0, 3238, 3548, +0, 3239, 3548, +0, 3240, 3548, +0, 3242, 3548, +0, 3244, 3547, +0, 3247, 3547, +0, 3251, 3547, +0, 3257, 3546, +0, 3264, 3546, +0, 3273, 3545, +0, 3285, 3544, +0, 3299, 3544, +0, 3316, 3544, +0, 3339, 3544, +0, 3367, 3544, +0, 3402, 3544, +0, 3445, 3544, +0, 3497, 3544, +0, 3544, 3529, +0, 3544, 3440, +0, 3544, 3282, +0, 3544, 2916, +0, 3677, 0, +0, 3810, 0, +2708, 3943, 0, +3318, 4075, 0, +3630, 4095, 0, +0, 3220, 3548, +0, 3220, 3548, +0, 3221, 3548, +0, 3221, 3548, +0, 3222, 3548, +0, 3222, 3548, +0, 3223, 3548, +0, 3225, 3548, +0, 3226, 3548, +0, 3229, 3547, +0, 3232, 3547, +0, 3236, 3547, +0, 3242, 3546, +0, 3249, 3546, +0, 3259, 3545, +0, 3272, 3544, +0, 3288, 3543, +0, 3306, 3543, +0, 3329, 3543, +0, 3357, 3543, +0, 3393, 3543, +0, 3437, 3543, +0, 3490, 3543, +0, 3543, 3533, +0, 3543, 3444, +0, 3543, 3288, +0, 3543, 2929, +0, 3676, 0, +0, 3809, 0, +2762, 3942, 0, +3333, 4075, 0, +3638, 4095, 0, +0, 3198, 3548, +0, 3199, 3548, +0, 3199, 3548, +0, 3200, 3548, +0, 3200, 3548, +0, 3201, 3548, +0, 3202, 3548, +0, 3203, 3548, +0, 3205, 3548, +0, 3208, 3547, +0, 3211, 3547, +0, 3216, 3547, +0, 3221, 3546, +0, 3229, 3546, +0, 3239, 3545, +0, 3253, 3544, +0, 3270, 3543, +0, 3291, 3541, +0, 3315, 3541, +0, 3344, 3541, +0, 3381, 3541, +0, 3426, 3541, +0, 3480, 3541, +0, 3541, 3538, +0, 3541, 3450, +0, 3541, 3296, +0, 3541, 2947, +0, 3675, 0, +0, 3808, 0, +2826, 3941, 0, +3351, 4074, 0, +3648, 4095, 0, +0, 3168, 3548, +0, 3168, 3548, +0, 3168, 3548, +0, 3169, 3548, +0, 3170, 3548, +0, 3171, 3548, +0, 3172, 3548, +0, 3173, 3548, +0, 3175, 3548, +0, 3178, 3547, +0, 3182, 3547, +0, 3186, 3547, +0, 3192, 3546, +0, 3201, 3546, +0, 3211, 3545, +0, 3225, 3544, +0, 3243, 3543, +0, 3267, 3541, +0, 3296, 3538, +0, 3326, 3538, +0, 3365, 3538, +0, 3411, 3538, +0, 3467, 3538, +0, 3532, 3538, +0, 3538, 3457, +0, 3538, 3307, +0, 3538, 2970, +0, 3673, 0, +0, 3807, 0, +2899, 3940, 0, +3376, 4073, 0, +3661, 4095, 0, +0, 3124, 3548, +0, 3124, 3548, +0, 3124, 3548, +0, 3125, 3548, +0, 3125, 3548, +0, 3126, 3548, +0, 3128, 3548, +0, 3129, 3548, +0, 3132, 3548, +0, 3135, 3547, +0, 3138, 3547, +0, 3144, 3547, +0, 3151, 3546, +0, 3160, 3546, +0, 3171, 3545, +0, 3186, 3544, +0, 3206, 3543, +0, 3231, 3541, +0, 3263, 3538, +0, 3302, 3535, +0, 3342, 3535, +0, 3391, 3535, +0, 3449, 3535, +0, 3516, 3535, +0, 3535, 3467, +0, 3535, 3321, +0, 3535, 2998, +0, 3670, 0, +0, 3805, 0, +2982, 3939, 0, +3407, 4072, 0, +3677, 4095, 0, +0, 3056, 3548, +0, 3057, 3548, +0, 3057, 3548, +0, 3058, 3548, +0, 3059, 3548, +0, 3060, 3548, +0, 3061, 3548, +0, 3063, 3548, +0, 3066, 3548, +0, 3069, 3547, +0, 3074, 3547, +0, 3080, 3547, +0, 3087, 3546, +0, 3098, 3546, +0, 3111, 3545, +0, 3129, 3544, +0, 3151, 3543, +0, 3179, 3541, +0, 3214, 3538, +0, 3257, 3535, +0, 3309, 3530, +0, 3362, 3530, +0, 3423, 3530, +0, 3495, 3530, +0, 3530, 3480, +0, 3530, 3339, +0, 3530, 3034, +0, 3667, 0, +1737, 3802, 0, +3073, 3937, 0, +3445, 4071, 0, +3699, 4095, 0, +0, 2948, 3548, +0, 2948, 3548, +0, 2949, 3548, +0, 2950, 3548, +0, 2951, 3548, +0, 2952, 3548, +0, 2954, 3548, +0, 2956, 3548, +0, 2960, 3548, +0, 2964, 3547, +0, 2970, 3547, +0, 2977, 3547, +0, 2987, 3546, +0, 3000, 3546, +0, 3016, 3545, +0, 3038, 3544, +0, 3065, 3543, +0, 3099, 3541, +0, 3140, 3538, +0, 3190, 3535, +0, 3250, 3530, +1536, 3320, 3524, +1536, 3387, 3524, +1536, 3463, 3524, +1536, 3524, 3497, +1536, 3524, 3362, +1536, 3524, 3078, +0, 3662, 1753, +2519, 3799, 0, +3172, 3934, 0, +3491, 4069, 0, +3726, 4095, 0, +0, 2745, 3548, +0, 2745, 3548, +0, 2746, 3548, +0, 2747, 3548, +0, 2749, 3548, +0, 2751, 3548, +0, 2754, 3548, +0, 2758, 3548, +0, 2763, 3548, +0, 2770, 3547, +0, 2778, 3547, +0, 2790, 3547, +0, 2804, 3546, +0, 2824, 3546, +0, 2848, 3545, +0, 2879, 3544, +0, 2917, 3543, +0, 2963, 3541, +0, 3018, 3538, +0, 3083, 3535, +0, 3157, 3530, +1536, 3241, 3524, +2457, 3333, 3515, +2457, 3418, 3515, +2457, 3512, 3515, +2457, 3515, 3391, +2457, 3515, 3130, +1663, 3656, 2289, +2856, 3794, 0, +3277, 3931, 0, +3546, 4066, 0, +3759, 4095, 0, +0, 2104, 3548, +0, 2107, 3548, +0, 2111, 3548, +0, 2115, 3548, +0, 2122, 3548, +0, 2130, 3548, +0, 2141, 3548, +0, 2156, 3548, +0, 2174, 3548, +0, 2198, 3547, +0, 2228, 3547, +0, 2265, 3547, +0, 2311, 3546, +0, 2365, 3546, +0, 2429, 3545, +0, 2502, 3544, +0, 2585, 3543, +0, 2676, 3541, +0, 2775, 3538, +0, 2881, 3535, +0, 2992, 3530, +1536, 3108, 3524, +2457, 3227, 3515, +2808, 3350, 3504, +2808, 3457, 3504, +2808, 3504, 3426, +2808, 3504, 3192, +2592, 3648, 2590, +3097, 3788, 1799, +3388, 3926, 0, +3611, 4063, 0, +3801, 4095, 0, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3547, +0, 0, 3547, +0, 0, 3547, +0, 0, 3546, +0, 0, 3546, +0, 0, 3545, +0, 0, 3544, +0, 0, 3543, +0, 0, 3541, +0, 1477, 3538, +0, 2256, 3535, +0, 2593, 3530, +1536, 2833, 3524, +2457, 3032, 3515, +2808, 3209, 3504, +3054, 3372, 3488, +3054, 3488, 3470, +3054, 3488, 3264, +3038, 3636, 2940, +3296, 3780, 2721, +3504, 3920, 1928, +3685, 4058, 0, +3851, 4095, 0, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3548, +0, 0, 3547, +0, 0, 3547, +0, 0, 3547, +0, 0, 3546, +0, 0, 3546, +0, 0, 3545, +0, 0, 3544, +0, 0, 3543, +0, 0, 3541, +0, 0, 3538, +0, 0, 3535, +1621, 0, 3530, +2158, 1536, 3524, +2457, 2459, 3515, +2808, 2907, 3504, +3054, 3183, 3488, +3256, 3399, 3466, +3256, 3466, 3344, +3315, 3620, 3186, +3473, 3768, 3072, +3624, 3912, 2854, +3769, 4052, 2063, +3911, 4095, 0, +2873, 0, 3548, +2873, 0, 3548, +2873, 0, 3548, +2874, 0, 3548, +2874, 0, 3548, +2875, 0, 3548, +2876, 0, 3548, +2877, 0, 3548, +2878, 0, 3548, +2880, 0, 3547, +2883, 0, 3547, +2886, 0, 3547, +2891, 0, 3546, +2897, 0, 3546, +2905, 0, 3545, +2916, 0, 3544, +2929, 0, 3543, +2947, 0, 3541, +2970, 0, 3538, +2998, 0, 3535, +3034, 0, 3530, +3078, 1536, 3524, +3130, 2457, 3515, +3192, 2808, 3504, +3264, 3054, 3488, +3344, 3256, 3466, +3434, 3434, 3434, +3531, 3598, 3388, +3636, 3752, 3318, +3746, 3900, 3204, +3861, 4044, 2986, +3980, 4095, 2192, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3396, 0, 3680, +3397, 0, 3680, +3397, 0, 3680, +3398, 0, 3680, +3399, 0, 3679, +3400, 0, 3679, +3401, 0, 3679, +3403, 0, 3678, +3406, 0, 3678, +3410, 0, 3677, +3414, 0, 3676, +3420, 0, 3675, +3429, 0, 3673, +3439, 0, 3670, +3453, 0, 3667, +3471, 0, 3662, +3494, 1663, 3656, +3523, 2590, 3648, +3558, 2940, 3636, +3603, 3186, 3620, +3598, 3388, 3531, +3598, 3477, 3388, +3752, 3735, 3318, +3853, 3900, 3204, +3947, 4044, 2986, +4047, 4095, 2192, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3691, 0, 3812, +3692, 0, 3812, +3692, 0, 3812, +3693, 0, 3812, +3694, 0, 3811, +3695, 0, 3811, +3696, 0, 3810, +3698, 0, 3810, +3700, 0, 3809, +3704, 0, 3808, +3708, 0, 3807, +3714, 0, 3805, +3721, 0, 3802, +3731, 0, 3799, +3745, 0, 3794, +3761, 1799, 3788, +3780, 2721, 3776, +3768, 3072, 3721, +3752, 3318, 3636, +3752, 3318, 3447, +3752, 3528, 3318, +3900, 3822, 3204, +4040, 4044, 2986, +4095, 4095, 2192, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3915, 0, 3944, +3916, 0, 3944, +3916, 0, 3944, +3916, 0, 3944, +3917, 0, 3944, +3917, 0, 3943, +3918, 0, 3943, +3920, 0, 3943, +3921, 0, 3942, +3923, 0, 3941, +3926, 0, 3940, +3929, 0, 3939, +3934, 0, 3937, +3934, 0, 3928, +3931, 0, 3913, +3926, 0, 3891, +3920, 1928, 3860, +3912, 2854, 3814, +3900, 3204, 3746, +3900, 3204, 3605, +3900, 3204, 3302, +3900, 3588, 3204, +4044, 3919, 2986, +4095, 4095, 2192, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4045, +4076, 0, 4044, +4076, 0, 4044, +4076, 0, 4044, +4076, 0, 4043, +4076, 0, 4043, +4076, 0, 4042, +4075, 0, 4041, +4075, 0, 4039, +4075, 0, 4037, +4074, 0, 4034, +4073, 0, 4030, +4072, 0, 4025, +4071, 0, 4018, +4069, 0, 4008, +4066, 0, 3995, +4063, 0, 3977, +4058, 0, 3952, +4052, 2063, 3915, +4044, 2986, 3861, +4044, 2986, 3755, +4044, 2986, 3561, +4044, 2986, 2987, +4044, 3659, 2986, +4095, 4023, 2192, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4087, +4095, 0, 4072, +4095, 0, 4051, +4095, 0, 4022, +4095, 2192, 3980, +4095, 2192, 3901, +4095, 2192, 3768, +4095, 2192, 3494, +4095, 2814, 2192, +4095, 3738, 2192, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3427, 3680, +0, 3432, 3680, +0, 3440, 3680, +0, 3449, 3680, +0, 3462, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3558, +0, 3680, 3396, +0, 3680, 3005, +0, 3812, 0, +0, 3944, 0, +2626, 4076, 0, +3404, 4095, 0, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3432, 3680, +0, 3439, 3680, +0, 3449, 3680, +0, 3462, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3558, +0, 3680, 3396, +0, 3680, 3005, +0, 3812, 0, +0, 3944, 0, +2627, 4076, 0, +3404, 4095, 0, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3432, 3680, +0, 3439, 3680, +0, 3449, 3680, +0, 3462, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3005, +0, 3812, 0, +0, 3944, 0, +2628, 4076, 0, +3404, 4095, 0, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3415, 3680, +0, 3416, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3432, 3680, +0, 3439, 3680, +0, 3449, 3680, +0, 3461, 3680, +0, 3478, 3680, +0, 3499, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3649, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3006, +0, 3812, 0, +0, 3944, 0, +2630, 4076, 0, +3405, 4095, 0, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3416, 3680, +0, 3419, 3680, +0, 3422, 3680, +0, 3426, 3680, +0, 3431, 3680, +0, 3439, 3680, +0, 3448, 3680, +0, 3461, 3680, +0, 3478, 3680, +0, 3498, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3648, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3006, +0, 3812, 0, +0, 3944, 0, +2632, 4076, 0, +3405, 4095, 0, +0, 3409, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3414, 3680, +0, 3416, 3680, +0, 3418, 3680, +0, 3421, 3680, +0, 3426, 3680, +0, 3431, 3680, +0, 3438, 3680, +0, 3448, 3680, +0, 3461, 3680, +0, 3477, 3680, +0, 3498, 3680, +0, 3525, 3680, +0, 3558, 3680, +0, 3599, 3680, +0, 3648, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3006, +0, 3812, 0, +0, 3944, 0, +2635, 4076, 0, +3405, 4095, 0, +0, 3408, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3414, 3680, +0, 3415, 3680, +0, 3418, 3680, +0, 3421, 3680, +0, 3425, 3680, +0, 3431, 3680, +0, 3438, 3680, +0, 3448, 3680, +0, 3460, 3680, +0, 3477, 3680, +0, 3497, 3680, +0, 3524, 3680, +0, 3557, 3680, +0, 3598, 3680, +0, 3648, 3680, +0, 3680, 3651, +0, 3680, 3559, +0, 3680, 3396, +0, 3680, 3007, +0, 3812, 0, +0, 3944, 0, +2639, 4076, 0, +3406, 4095, 0, +0, 3408, 3680, +0, 3408, 3680, +0, 3408, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3413, 3680, +0, 3415, 3680, +0, 3417, 3680, +0, 3420, 3680, +0, 3425, 3680, +0, 3430, 3680, +0, 3437, 3680, +0, 3447, 3680, +0, 3460, 3680, +0, 3476, 3680, +0, 3497, 3680, +0, 3524, 3680, +0, 3557, 3680, +0, 3598, 3680, +0, 3648, 3680, +0, 3680, 3652, +0, 3680, 3559, +0, 3680, 3397, +0, 3680, 3008, +0, 3812, 0, +0, 3944, 0, +2644, 4076, 0, +3407, 4095, 0, +0, 3406, 3680, +0, 3407, 3680, +0, 3407, 3680, +0, 3407, 3680, +0, 3408, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3410, 3680, +0, 3411, 3680, +0, 3412, 3680, +0, 3414, 3680, +0, 3416, 3680, +0, 3420, 3680, +0, 3424, 3680, +0, 3429, 3680, +0, 3437, 3680, +0, 3446, 3680, +0, 3459, 3680, +0, 3475, 3680, +0, 3496, 3680, +0, 3523, 3680, +0, 3556, 3680, +0, 3597, 3680, +0, 3647, 3680, +0, 3680, 3652, +0, 3680, 3560, +0, 3680, 3397, +0, 3680, 3009, +0, 3812, 0, +0, 3944, 0, +2650, 4076, 0, +3408, 4095, 0, +0, 3405, 3680, +0, 3405, 3680, +0, 3405, 3680, +0, 3406, 3680, +0, 3406, 3680, +0, 3407, 3680, +0, 3407, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3411, 3680, +0, 3413, 3680, +0, 3415, 3680, +0, 3418, 3680, +0, 3423, 3680, +0, 3428, 3680, +0, 3436, 3680, +0, 3445, 3680, +0, 3458, 3680, +0, 3475, 3680, +0, 3495, 3680, +0, 3522, 3680, +0, 3556, 3680, +0, 3597, 3680, +0, 3646, 3680, +0, 3680, 3652, +0, 3680, 3560, +0, 3680, 3398, +0, 3680, 3011, +0, 3812, 0, +0, 3944, 0, +2659, 4076, 0, +3410, 4095, 0, +0, 3403, 3680, +0, 3403, 3680, +0, 3404, 3680, +0, 3404, 3680, +0, 3404, 3680, +0, 3405, 3680, +0, 3406, 3680, +0, 3406, 3680, +0, 3408, 3680, +0, 3409, 3680, +0, 3411, 3679, +0, 3414, 3679, +0, 3417, 3679, +0, 3421, 3679, +0, 3427, 3679, +0, 3434, 3679, +0, 3444, 3679, +0, 3457, 3679, +0, 3473, 3679, +0, 3494, 3679, +0, 3521, 3679, +0, 3554, 3679, +0, 3596, 3679, +0, 3646, 3679, +0, 3679, 3653, +0, 3679, 3561, +0, 3679, 3399, +0, 3679, 3013, +0, 3812, 0, +0, 3944, 0, +2670, 4076, 0, +3412, 4095, 0, +0, 3401, 3680, +0, 3401, 3680, +0, 3401, 3680, +0, 3401, 3680, +0, 3402, 3680, +0, 3402, 3680, +0, 3403, 3680, +0, 3404, 3680, +0, 3405, 3680, +0, 3407, 3680, +0, 3409, 3679, +0, 3412, 3679, +0, 3415, 3679, +0, 3419, 3679, +0, 3425, 3679, +0, 3432, 3679, +0, 3442, 3679, +0, 3455, 3679, +0, 3472, 3679, +0, 3493, 3679, +0, 3520, 3679, +0, 3553, 3679, +0, 3595, 3679, +0, 3644, 3679, +0, 3679, 3653, +0, 3679, 3562, +0, 3679, 3400, +0, 3679, 3015, +0, 3812, 0, +0, 3944, 0, +2684, 4076, 0, +3415, 4095, 0, +0, 3398, 3680, +0, 3398, 3680, +0, 3398, 3680, +0, 3398, 3680, +0, 3399, 3680, +0, 3399, 3680, +0, 3400, 3680, +0, 3401, 3680, +0, 3402, 3680, +0, 3404, 3680, +0, 3406, 3679, +0, 3409, 3679, +0, 3413, 3679, +0, 3417, 3679, +0, 3422, 3679, +0, 3430, 3679, +0, 3440, 3679, +0, 3453, 3679, +0, 3469, 3679, +0, 3490, 3679, +0, 3517, 3679, +0, 3551, 3679, +0, 3593, 3679, +0, 3643, 3679, +0, 3679, 3654, +0, 3679, 3563, +0, 3679, 3401, +0, 3679, 3018, +0, 3811, 0, +0, 3944, 0, +2703, 4076, 0, +3419, 4095, 0, +0, 3393, 3680, +0, 3393, 3680, +0, 3393, 3680, +0, 3394, 3680, +0, 3394, 3680, +0, 3395, 3680, +0, 3395, 3680, +0, 3396, 3680, +0, 3397, 3680, +0, 3399, 3680, +0, 3401, 3679, +0, 3404, 3679, +0, 3408, 3679, +0, 3413, 3678, +0, 3419, 3678, +0, 3426, 3678, +0, 3436, 3678, +0, 3449, 3678, +0, 3466, 3678, +0, 3488, 3678, +0, 3515, 3678, +0, 3548, 3678, +0, 3590, 3678, +0, 3641, 3678, +0, 3678, 3655, +0, 3678, 3564, +0, 3678, 3403, +0, 3678, 3023, +0, 3811, 0, +0, 3943, 0, +2726, 4076, 0, +3424, 4095, 0, +0, 3387, 3680, +0, 3387, 3680, +0, 3387, 3680, +0, 3388, 3680, +0, 3388, 3680, +0, 3388, 3680, +0, 3389, 3680, +0, 3390, 3680, +0, 3392, 3680, +0, 3393, 3680, +0, 3395, 3679, +0, 3398, 3679, +0, 3402, 3679, +0, 3407, 3678, +0, 3414, 3678, +0, 3422, 3678, +0, 3432, 3678, +0, 3445, 3678, +0, 3462, 3678, +0, 3483, 3678, +0, 3511, 3678, +0, 3545, 3678, +0, 3587, 3678, +0, 3638, 3678, +0, 3678, 3657, +0, 3678, 3566, +0, 3678, 3406, +0, 3678, 3029, +0, 3810, 0, +0, 3943, 0, +2756, 4075, 0, +3430, 4095, 0, +0, 3379, 3680, +0, 3379, 3680, +0, 3379, 3680, +0, 3379, 3680, +0, 3380, 3680, +0, 3380, 3680, +0, 3381, 3680, +0, 3382, 3680, +0, 3383, 3680, +0, 3385, 3680, +0, 3387, 3679, +0, 3390, 3679, +0, 3394, 3679, +0, 3400, 3678, +0, 3407, 3678, +0, 3416, 3677, +0, 3426, 3677, +0, 3439, 3677, +0, 3456, 3677, +0, 3478, 3677, +0, 3506, 3677, +0, 3540, 3677, +0, 3583, 3677, +0, 3634, 3677, +0, 3677, 3659, +0, 3677, 3568, +0, 3677, 3410, +0, 3677, 3037, +0, 3810, 0, +0, 3943, 0, +2793, 4075, 0, +3439, 4095, 0, +0, 3367, 3680, +0, 3368, 3680, +0, 3368, 3680, +0, 3368, 3680, +0, 3369, 3680, +0, 3369, 3680, +0, 3370, 3680, +0, 3371, 3680, +0, 3372, 3680, +0, 3374, 3680, +0, 3376, 3679, +0, 3379, 3679, +0, 3384, 3679, +0, 3389, 3678, +0, 3396, 3678, +0, 3405, 3677, +0, 3418, 3676, +0, 3431, 3676, +0, 3448, 3676, +0, 3471, 3676, +0, 3499, 3676, +0, 3534, 3676, +0, 3577, 3676, +0, 3629, 3676, +0, 3676, 3662, +0, 3676, 3572, +0, 3676, 3414, +0, 3676, 3048, +0, 3809, 0, +0, 3942, 0, +2839, 4075, 0, +3450, 4095, 0, +0, 3352, 3680, +0, 3352, 3680, +0, 3353, 3680, +0, 3353, 3680, +0, 3353, 3680, +0, 3354, 3680, +0, 3354, 3680, +0, 3356, 3680, +0, 3357, 3680, +0, 3359, 3680, +0, 3361, 3679, +0, 3364, 3679, +0, 3368, 3679, +0, 3374, 3678, +0, 3381, 3678, +0, 3391, 3677, +0, 3404, 3676, +0, 3420, 3675, +0, 3438, 3675, +0, 3461, 3675, +0, 3490, 3675, +0, 3525, 3675, +0, 3569, 3675, +0, 3622, 3675, +0, 3675, 3665, +0, 3675, 3576, +0, 3675, 3420, +0, 3675, 3061, +0, 3808, 0, +0, 3941, 0, +2893, 4074, 0, +3465, 4095, 0, +0, 3330, 3680, +0, 3331, 3680, +0, 3331, 3680, +0, 3331, 3680, +0, 3332, 3680, +0, 3332, 3680, +0, 3333, 3680, +0, 3334, 3680, +0, 3336, 3680, +0, 3337, 3680, +0, 3340, 3679, +0, 3343, 3679, +0, 3348, 3679, +0, 3354, 3678, +0, 3361, 3678, +0, 3371, 3677, +0, 3385, 3676, +0, 3402, 3675, +0, 3423, 3673, +0, 3447, 3673, +0, 3477, 3673, +0, 3513, 3673, +0, 3558, 3673, +0, 3612, 3673, +0, 3673, 3670, +0, 3673, 3582, +0, 3673, 3429, +0, 3673, 3079, +0, 3807, 0, +0, 3940, 0, +2957, 4073, 0, +3484, 4095, 0, +0, 3300, 3680, +0, 3300, 3680, +0, 3300, 3680, +0, 3301, 3680, +0, 3301, 3680, +0, 3302, 3680, +0, 3303, 3680, +0, 3304, 3680, +0, 3305, 3680, +0, 3307, 3680, +0, 3310, 3679, +0, 3314, 3679, +0, 3318, 3679, +0, 3325, 3678, +0, 3333, 3678, +0, 3344, 3677, +0, 3358, 3676, +0, 3376, 3675, +0, 3399, 3673, +0, 3428, 3670, +0, 3459, 3670, +0, 3497, 3670, +0, 3543, 3670, +0, 3599, 3670, +0, 3664, 3670, +0, 3670, 3589, +0, 3670, 3439, +0, 3670, 3102, +0, 3805, 0, +0, 3939, 0, +3031, 4072, 0, +3509, 4095, 0, +0, 3255, 3680, +0, 3256, 3680, +0, 3256, 3680, +0, 3256, 3680, +0, 3257, 3680, +0, 3258, 3680, +0, 3258, 3680, +0, 3260, 3680, +0, 3261, 3680, +0, 3264, 3680, +0, 3267, 3679, +0, 3271, 3679, +0, 3276, 3679, +0, 3282, 3678, +0, 3291, 3678, +0, 3303, 3677, +0, 3319, 3676, +0, 3338, 3675, +0, 3363, 3673, +0, 3395, 3670, +0, 3434, 3667, +0, 3474, 3667, +0, 3523, 3667, +0, 3581, 3667, +0, 3648, 3667, +0, 3667, 3599, +0, 3667, 3453, +0, 3667, 3131, +0, 3802, 0, +0, 3937, 0, +3113, 4071, 0, +3539, 4095, 0, +0, 3188, 3680, +0, 3188, 3680, +0, 3189, 3680, +0, 3189, 3680, +0, 3190, 3680, +0, 3191, 3680, +0, 3192, 3680, +0, 3193, 3680, +0, 3195, 3680, +0, 3198, 3680, +0, 3201, 3679, +0, 3206, 3679, +0, 3212, 3679, +0, 3220, 3678, +0, 3230, 3678, +0, 3243, 3677, +0, 3261, 3676, +0, 3283, 3675, +0, 3311, 3673, +0, 3346, 3670, +0, 3389, 3667, +0, 3441, 3662, +0, 3494, 3662, +0, 3555, 3662, +0, 3626, 3662, +0, 3662, 3612, +0, 3662, 3471, +0, 3662, 3166, +0, 3799, 0, +1863, 3934, 0, +3205, 4069, 0, +3577, 4095, 0, +0, 3080, 3680, +0, 3080, 3680, +0, 3081, 3680, +0, 3081, 3680, +0, 3082, 3680, +0, 3083, 3680, +0, 3084, 3680, +0, 3086, 3680, +0, 3089, 3680, +0, 3092, 3680, +0, 3096, 3679, +0, 3102, 3679, +0, 3110, 3679, +0, 3119, 3678, +0, 3132, 3678, +0, 3149, 3677, +0, 3170, 3676, +0, 3197, 3675, +0, 3231, 3673, +0, 3273, 3670, +0, 3323, 3667, +0, 3382, 3662, +1663, 3452, 3656, +1663, 3519, 3656, +1663, 3595, 3656, +1663, 3656, 3629, +1663, 3656, 3494, +1663, 3656, 3210, +0, 3794, 1884, +2650, 3931, 0, +3303, 4066, 0, +3623, 4095, 0, +0, 2876, 3680, +0, 2877, 3680, +0, 2877, 3680, +0, 2878, 3680, +0, 2879, 3680, +0, 2881, 3680, +0, 2883, 3680, +0, 2886, 3680, +0, 2890, 3680, +0, 2895, 3680, +0, 2901, 3679, +0, 2910, 3679, +0, 2922, 3679, +0, 2936, 3678, +0, 2955, 3678, +0, 2980, 3677, +0, 3010, 3676, +0, 3048, 3675, +0, 3095, 3673, +0, 3150, 3670, +0, 3215, 3667, +0, 3289, 3662, +1663, 3373, 3656, +2590, 3465, 3648, +2590, 3550, 3648, +2590, 3644, 3648, +2590, 3648, 3523, +2590, 3648, 3262, +1799, 3788, 2422, +2988, 3926, 0, +3409, 4063, 0, +3679, 4095, 0, +0, 2237, 3680, +0, 2239, 3680, +0, 2242, 3680, +0, 2246, 3680, +0, 2251, 3680, +0, 2257, 3680, +0, 2266, 3680, +0, 2277, 3680, +0, 2291, 3680, +0, 2310, 3680, +0, 2333, 3679, +0, 2363, 3679, +0, 2400, 3679, +0, 2445, 3678, +0, 2499, 3678, +0, 2562, 3677, +0, 2636, 3676, +0, 2718, 3675, +0, 2809, 3673, +0, 2908, 3670, +0, 3014, 3667, +0, 3125, 3662, +1663, 3240, 3656, +2590, 3360, 3648, +2940, 3482, 3636, +2940, 3589, 3636, +2940, 3636, 3558, +2940, 3636, 3324, +2722, 3780, 2721, +3229, 3920, 1928, +3520, 4058, 0, +3743, 4095, 0, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3679, +0, 0, 3679, +0, 0, 3679, +0, 0, 3678, +0, 0, 3678, +0, 0, 3677, +0, 0, 3676, +0, 0, 3675, +0, 0, 3673, +0, 1603, 3670, +0, 2388, 3667, +0, 2724, 3662, +1663, 2965, 3656, +2590, 3165, 3648, +2940, 3341, 3636, +3186, 3504, 3620, +3186, 3620, 3603, +3186, 3620, 3396, +3171, 3768, 3072, +3428, 3912, 2854, +3636, 4052, 2063, +3818, 4095, 0, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3680, +0, 0, 3679, +0, 0, 3679, +0, 0, 3679, +0, 0, 3678, +0, 0, 3678, +0, 0, 3677, +0, 0, 3676, +0, 0, 3675, +0, 0, 3673, +0, 0, 3670, +0, 0, 3667, +1753, 0, 3662, +2289, 1663, 3656, +2590, 2592, 3648, +2940, 3038, 3636, +3186, 3315, 3620, +3388, 3531, 3598, +3388, 3598, 3477, +3447, 3752, 3318, +3605, 3900, 3204, +3755, 4044, 2986, +3901, 4095, 2192, +3005, 0, 3680, +3005, 0, 3680, +3005, 0, 3680, +3006, 0, 3680, +3006, 0, 3680, +3006, 0, 3680, +3007, 0, 3680, +3008, 0, 3680, +3009, 0, 3680, +3011, 0, 3680, +3013, 0, 3679, +3015, 0, 3679, +3018, 0, 3679, +3023, 0, 3678, +3029, 0, 3678, +3037, 0, 3677, +3048, 0, 3676, +3061, 0, 3675, +3079, 0, 3673, +3102, 0, 3670, +3131, 0, 3667, +3166, 0, 3662, +3210, 1663, 3656, +3262, 2590, 3648, +3324, 2940, 3636, +3396, 3186, 3620, +3477, 3388, 3598, +3566, 3566, 3566, +3664, 3730, 3520, +3768, 3884, 3450, +3878, 4032, 3336, +3993, 4095, 3118, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3528, 0, 3812, +3529, 0, 3812, +3529, 0, 3812, +3530, 0, 3812, +3530, 0, 3812, +3531, 0, 3812, +3532, 0, 3811, +3534, 0, 3811, +3536, 0, 3810, +3538, 0, 3810, +3542, 0, 3809, +3546, 0, 3808, +3552, 0, 3807, +3561, 0, 3805, +3571, 0, 3802, +3585, 0, 3799, +3603, 0, 3794, +3626, 1799, 3788, +3655, 2721, 3780, +3691, 3072, 3768, +3735, 3318, 3752, +3730, 3520, 3664, +3730, 3609, 3520, +3884, 3867, 3450, +3986, 4032, 3336, +4079, 4095, 3118, +3822, 0, 3944, +3822, 0, 3944, +3822, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3823, 0, 3944, +3824, 0, 3944, +3824, 0, 3944, +3824, 0, 3944, +3825, 0, 3944, +3826, 0, 3943, +3827, 0, 3943, +3828, 0, 3943, +3830, 0, 3942, +3832, 0, 3941, +3836, 0, 3940, +3840, 0, 3939, +3846, 0, 3937, +3853, 0, 3934, +3863, 0, 3931, +3877, 0, 3926, +3893, 1928, 3920, +3912, 2854, 3908, +3900, 3204, 3853, +3884, 3450, 3768, +3884, 3450, 3579, +3884, 3660, 3450, +4032, 3955, 3336, +4095, 4095, 3118, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4047, 0, 4076, +4048, 0, 4076, +4048, 0, 4076, +4048, 0, 4076, +4049, 0, 4076, +4049, 0, 4075, +4050, 0, 4075, +4051, 0, 4075, +4053, 0, 4074, +4055, 0, 4073, +4058, 0, 4072, +4061, 0, 4071, +4066, 0, 4069, +4066, 0, 4060, +4063, 0, 4045, +4058, 0, 4023, +4052, 2063, 3992, +4044, 2986, 3947, +4032, 3336, 3878, +4032, 3336, 3737, +4032, 3336, 3435, +4032, 3720, 3336, +4095, 4051, 3118, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4084, +4095, 2192, 4047, +4095, 3118, 3993, +4095, 3118, 3888, +4095, 3118, 3693, +4095, 3118, 3121, +4095, 3791, 3118, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3552, 3812, +0, 3554, 3812, +0, 3559, 3812, +0, 3564, 3812, +0, 3572, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3691, 3812, +0, 3732, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3137, +0, 3944, 0, +0, 4076, 0, +2761, 4095, 0, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3559, 3812, +0, 3564, 3812, +0, 3572, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3691, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3137, +0, 3944, 0, +0, 4076, 0, +2762, 4095, 0, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3559, 3812, +0, 3564, 3812, +0, 3572, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3137, +0, 3944, 0, +0, 4076, 0, +2762, 4095, 0, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3558, 3812, +0, 3564, 3812, +0, 3571, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3138, +0, 3944, 0, +0, 4076, 0, +2764, 4095, 0, +0, 3541, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3558, 3812, +0, 3564, 3812, +0, 3571, 3812, +0, 3581, 3812, +0, 3594, 3812, +0, 3610, 3812, +0, 3631, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3138, +0, 3944, 0, +0, 4076, 0, +2765, 4095, 0, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3548, 3812, +0, 3551, 3812, +0, 3554, 3812, +0, 3558, 3812, +0, 3564, 3812, +0, 3571, 3812, +0, 3581, 3812, +0, 3593, 3812, +0, 3609, 3812, +0, 3630, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3138, +0, 3944, 0, +0, 4076, 0, +2767, 4095, 0, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3546, 3812, +0, 3548, 3812, +0, 3550, 3812, +0, 3553, 3812, +0, 3558, 3812, +0, 3563, 3812, +0, 3571, 3812, +0, 3580, 3812, +0, 3593, 3812, +0, 3609, 3812, +0, 3630, 3812, +0, 3657, 3812, +0, 3690, 3812, +0, 3731, 3812, +0, 3781, 3812, +0, 3812, 3783, +0, 3812, 3691, +0, 3812, 3528, +0, 3812, 3139, +0, 3944, 0, +0, 4076, 0, +2770, 4095, 0, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3546, 3812, +0, 3548, 3812, +0, 3550, 3812, +0, 3553, 3812, +0, 3557, 3812, +0, 3563, 3812, +0, 3570, 3812, +0, 3580, 3812, +0, 3593, 3812, +0, 3609, 3812, +0, 3630, 3812, +0, 3656, 3812, +0, 3690, 3812, +0, 3730, 3812, +0, 3780, 3812, +0, 3812, 3784, +0, 3812, 3691, +0, 3812, 3529, +0, 3812, 3139, +0, 3944, 0, +0, 4076, 0, +2773, 4095, 0, +0, 3540, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3549, 3812, +0, 3552, 3812, +0, 3557, 3812, +0, 3562, 3812, +0, 3570, 3812, +0, 3579, 3812, +0, 3592, 3812, +0, 3608, 3812, +0, 3629, 3812, +0, 3656, 3812, +0, 3689, 3812, +0, 3730, 3812, +0, 3780, 3812, +0, 3812, 3784, +0, 3812, 3691, +0, 3812, 3529, +0, 3812, 3140, +0, 3944, 0, +0, 4076, 0, +2778, 4095, 0, +0, 3538, 3812, +0, 3538, 3812, +0, 3539, 3812, +0, 3539, 3812, +0, 3539, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3542, 3812, +0, 3543, 3812, +0, 3544, 3812, +0, 3546, 3812, +0, 3548, 3812, +0, 3552, 3812, +0, 3556, 3812, +0, 3562, 3812, +0, 3569, 3812, +0, 3579, 3812, +0, 3591, 3812, +0, 3607, 3812, +0, 3629, 3812, +0, 3655, 3812, +0, 3689, 3812, +0, 3729, 3812, +0, 3779, 3812, +0, 3812, 3784, +0, 3812, 3692, +0, 3812, 3530, +0, 3812, 3141, +0, 3944, 0, +0, 4076, 0, +2785, 4095, 0, +0, 3537, 3812, +0, 3537, 3812, +0, 3537, 3812, +0, 3538, 3812, +0, 3538, 3812, +0, 3538, 3812, +0, 3539, 3812, +0, 3540, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3543, 3812, +0, 3545, 3812, +0, 3547, 3812, +0, 3551, 3812, +0, 3555, 3812, +0, 3561, 3812, +0, 3568, 3812, +0, 3577, 3812, +0, 3590, 3812, +0, 3606, 3812, +0, 3628, 3812, +0, 3654, 3812, +0, 3688, 3812, +0, 3729, 3812, +0, 3778, 3812, +0, 3812, 3784, +0, 3812, 3692, +0, 3812, 3530, +0, 3812, 3143, +0, 3944, 0, +0, 4076, 0, +2793, 4095, 0, +0, 3535, 3812, +0, 3536, 3812, +0, 3536, 3812, +0, 3536, 3812, +0, 3536, 3812, +0, 3537, 3812, +0, 3537, 3812, +0, 3538, 3812, +0, 3538, 3812, +0, 3540, 3812, +0, 3541, 3812, +0, 3544, 3812, +0, 3546, 3812, +0, 3549, 3812, +0, 3553, 3812, +0, 3559, 3812, +0, 3566, 3812, +0, 3576, 3812, +0, 3589, 3812, +0, 3605, 3812, +0, 3626, 3812, +0, 3653, 3812, +0, 3687, 3812, +0, 3728, 3812, +0, 3777, 3812, +0, 3812, 3785, +0, 3812, 3693, +0, 3812, 3531, +0, 3812, 3145, +0, 3944, 0, +0, 4076, 0, +2804, 4095, 0, +0, 3533, 3812, +0, 3533, 3812, +0, 3533, 3812, +0, 3533, 3812, +0, 3534, 3812, +0, 3534, 3812, +0, 3534, 3812, +0, 3535, 3812, +0, 3536, 3812, +0, 3537, 3812, +0, 3539, 3812, +0, 3541, 3812, +0, 3544, 3811, +0, 3547, 3811, +0, 3552, 3811, +0, 3557, 3811, +0, 3564, 3811, +0, 3574, 3811, +0, 3587, 3811, +0, 3604, 3811, +0, 3625, 3811, +0, 3652, 3811, +0, 3685, 3811, +0, 3727, 3811, +0, 3777, 3811, +0, 3811, 3785, +0, 3811, 3694, +0, 3811, 3532, +0, 3811, 3147, +0, 3944, 0, +0, 4076, 0, +2818, 4095, 0, +0, 3530, 3812, +0, 3530, 3812, +0, 3530, 3812, +0, 3530, 3812, +0, 3530, 3812, +0, 3531, 3812, +0, 3531, 3812, +0, 3532, 3812, +0, 3533, 3812, +0, 3534, 3812, +0, 3536, 3812, +0, 3538, 3812, +0, 3541, 3811, +0, 3545, 3811, +0, 3549, 3811, +0, 3554, 3811, +0, 3562, 3811, +0, 3572, 3811, +0, 3585, 3811, +0, 3601, 3811, +0, 3622, 3811, +0, 3650, 3811, +0, 3683, 3811, +0, 3725, 3811, +0, 3775, 3811, +0, 3811, 3786, +0, 3811, 3695, +0, 3811, 3534, +0, 3811, 3151, +0, 3943, 0, +0, 4076, 0, +2837, 4095, 0, +0, 3525, 3812, +0, 3525, 3812, +0, 3525, 3812, +0, 3526, 3812, +0, 3526, 3812, +0, 3526, 3812, +0, 3527, 3812, +0, 3528, 3812, +0, 3528, 3812, +0, 3530, 3812, +0, 3531, 3812, +0, 3533, 3812, +0, 3536, 3811, +0, 3540, 3811, +0, 3545, 3810, +0, 3551, 3810, +0, 3559, 3810, +0, 3569, 3810, +0, 3582, 3810, +0, 3598, 3810, +0, 3620, 3810, +0, 3647, 3810, +0, 3680, 3810, +0, 3722, 3810, +0, 3773, 3810, +0, 3810, 3787, +0, 3810, 3696, +0, 3810, 3536, +0, 3810, 3155, +0, 3943, 0, +0, 4075, 0, +2861, 4095, 0, +0, 3519, 3812, +0, 3519, 3812, +0, 3519, 3812, +0, 3520, 3812, +0, 3520, 3812, +0, 3520, 3812, +0, 3521, 3812, +0, 3521, 3812, +0, 3522, 3812, +0, 3523, 3812, +0, 3525, 3812, +0, 3528, 3812, +0, 3530, 3811, +0, 3534, 3811, +0, 3540, 3810, +0, 3547, 3810, +0, 3554, 3810, +0, 3564, 3810, +0, 3577, 3810, +0, 3594, 3810, +0, 3616, 3810, +0, 3643, 3810, +0, 3677, 3810, +0, 3719, 3810, +0, 3770, 3810, +0, 3810, 3789, +0, 3810, 3698, +0, 3810, 3538, +0, 3810, 3161, +0, 3943, 0, +0, 4075, 0, +2890, 4095, 0, +0, 3511, 3812, +0, 3511, 3812, +0, 3511, 3812, +0, 3511, 3812, +0, 3511, 3812, +0, 3512, 3812, +0, 3513, 3812, +0, 3513, 3812, +0, 3514, 3812, +0, 3515, 3812, +0, 3517, 3812, +0, 3520, 3812, +0, 3522, 3811, +0, 3526, 3811, +0, 3532, 3810, +0, 3539, 3810, +0, 3548, 3809, +0, 3558, 3809, +0, 3571, 3809, +0, 3588, 3809, +0, 3610, 3809, +0, 3638, 3809, +0, 3672, 3809, +0, 3715, 3809, +0, 3766, 3809, +0, 3809, 3791, +0, 3809, 3700, +0, 3809, 3542, +0, 3809, 3169, +0, 3942, 0, +0, 4075, 0, +2927, 4095, 0, +0, 3499, 3812, +0, 3499, 3812, +0, 3500, 3812, +0, 3500, 3812, +0, 3500, 3812, +0, 3501, 3812, +0, 3501, 3812, +0, 3502, 3812, +0, 3503, 3812, +0, 3504, 3812, +0, 3506, 3812, +0, 3508, 3812, +0, 3511, 3811, +0, 3516, 3811, +0, 3521, 3810, +0, 3528, 3810, +0, 3537, 3809, +0, 3550, 3808, +0, 3563, 3808, +0, 3581, 3808, +0, 3603, 3808, +0, 3631, 3808, +0, 3666, 3808, +0, 3709, 3808, +0, 3761, 3808, +0, 3808, 3794, +0, 3808, 3704, +0, 3808, 3546, +0, 3808, 3180, +0, 3941, 0, +0, 4074, 0, +2973, 4095, 0, +0, 3484, 3812, +0, 3484, 3812, +0, 3484, 3812, +0, 3485, 3812, +0, 3485, 3812, +0, 3485, 3812, +0, 3486, 3812, +0, 3487, 3812, +0, 3488, 3812, +0, 3489, 3812, +0, 3491, 3812, +0, 3493, 3812, +0, 3496, 3811, +0, 3501, 3811, +0, 3506, 3810, +0, 3514, 3810, +0, 3523, 3809, +0, 3536, 3808, +0, 3552, 3807, +0, 3570, 3807, +0, 3593, 3807, +0, 3622, 3807, +0, 3657, 3807, +0, 3701, 3807, +0, 3754, 3807, +0, 3807, 3797, +0, 3807, 3708, +0, 3807, 3552, +0, 3807, 3194, +0, 3940, 0, +0, 4073, 0, +3027, 4095, 0, +0, 3462, 3812, +0, 3462, 3812, +0, 3463, 3812, +0, 3463, 3812, +0, 3463, 3812, +0, 3464, 3812, +0, 3464, 3812, +0, 3465, 3812, +0, 3466, 3812, +0, 3468, 3812, +0, 3469, 3812, +0, 3472, 3812, +0, 3475, 3811, +0, 3480, 3811, +0, 3486, 3810, +0, 3493, 3810, +0, 3503, 3809, +0, 3517, 3808, +0, 3534, 3807, +0, 3556, 3805, +0, 3579, 3805, +0, 3609, 3805, +0, 3646, 3805, +0, 3690, 3805, +0, 3744, 3805, +0, 3805, 3802, +0, 3805, 3714, +0, 3805, 3561, +0, 3805, 3211, +0, 3939, 0, +0, 4072, 0, +3090, 4095, 0, +0, 3432, 3812, +0, 3432, 3812, +0, 3432, 3812, +0, 3432, 3812, +0, 3433, 3812, +0, 3433, 3812, +0, 3434, 3812, +0, 3435, 3812, +0, 3436, 3812, +0, 3437, 3812, +0, 3439, 3812, +0, 3442, 3812, +0, 3446, 3811, +0, 3450, 3811, +0, 3457, 3810, +0, 3465, 3810, +0, 3475, 3809, +0, 3490, 3808, +0, 3508, 3807, +0, 3531, 3805, +0, 3560, 3802, +0, 3591, 3802, +0, 3629, 3802, +0, 3676, 3802, +0, 3731, 3802, +0, 3796, 3802, +0, 3802, 3721, +0, 3802, 3571, +0, 3802, 3234, +0, 3937, 0, +0, 4071, 0, +3164, 4095, 0, +0, 3387, 3812, +0, 3388, 3812, +0, 3388, 3812, +0, 3388, 3812, +0, 3388, 3812, +0, 3389, 3812, +0, 3390, 3812, +0, 3391, 3812, +0, 3392, 3812, +0, 3394, 3812, +0, 3396, 3812, +0, 3399, 3812, +0, 3403, 3811, +0, 3408, 3811, +0, 3415, 3810, +0, 3424, 3810, +0, 3435, 3809, +0, 3451, 3808, +0, 3470, 3807, +0, 3495, 3805, +0, 3527, 3802, +0, 3566, 3799, +0, 3606, 3799, +0, 3655, 3799, +0, 3713, 3799, +0, 3781, 3799, +0, 3799, 3731, +0, 3799, 3585, +0, 3799, 3262, +0, 3934, 0, +0, 4069, 0, +3246, 4095, 0, +0, 3320, 3812, +0, 3321, 3812, +0, 3321, 3812, +0, 3321, 3812, +0, 3322, 3812, +0, 3322, 3812, +0, 3323, 3812, +0, 3324, 3812, +0, 3326, 3812, +0, 3328, 3812, +0, 3330, 3812, +0, 3333, 3812, +0, 3338, 3811, +0, 3344, 3811, +0, 3352, 3810, +0, 3362, 3810, +0, 3376, 3809, +0, 3393, 3808, +0, 3415, 3807, +0, 3443, 3805, +0, 3479, 3802, +0, 3522, 3799, +0, 3574, 3794, +0, 3626, 3794, +0, 3687, 3794, +0, 3759, 3794, +0, 3794, 3745, +0, 3794, 3603, +0, 3794, 3298, +0, 3931, 0, +1985, 4066, 0, +3337, 4095, 0, +0, 3211, 3812, +0, 3212, 3812, +0, 3212, 3812, +0, 3213, 3812, +0, 3213, 3812, +0, 3214, 3812, +0, 3215, 3812, +0, 3216, 3812, +0, 3218, 3812, +0, 3221, 3812, +0, 3224, 3812, +0, 3228, 3812, +0, 3234, 3811, +0, 3241, 3811, +0, 3251, 3810, +0, 3264, 3810, +0, 3281, 3809, +0, 3302, 3808, +0, 3329, 3807, +0, 3363, 3805, +0, 3405, 3802, +0, 3455, 3799, +0, 3515, 3794, +1799, 3584, 3788, +1799, 3651, 3788, +1799, 3728, 3788, +1799, 3788, 3761, +1799, 3788, 3626, +1799, 3788, 3342, +0, 3926, 2023, +2781, 4063, 0, +3436, 4095, 0, +0, 3008, 3812, +0, 3009, 3812, +0, 3009, 3812, +0, 3010, 3812, +0, 3011, 3812, +0, 3012, 3812, +0, 3014, 3812, +0, 3016, 3812, +0, 3019, 3812, +0, 3023, 3812, +0, 3027, 3812, +0, 3034, 3812, +0, 3043, 3811, +0, 3054, 3811, +0, 3069, 3810, +0, 3088, 3810, +0, 3112, 3809, +0, 3143, 3808, +0, 3181, 3807, +0, 3227, 3805, +0, 3282, 3802, +0, 3347, 3799, +0, 3421, 3794, +1799, 3505, 3788, +2721, 3597, 3780, +2721, 3682, 3780, +2721, 3776, 3780, +2721, 3780, 3655, +2721, 3780, 3394, +1928, 3920, 2556, +3119, 4058, 0, +3541, 4095, 0, +0, 2367, 3812, +0, 2369, 3812, +0, 2371, 3812, +0, 2374, 3812, +0, 2377, 3812, +0, 2382, 3812, +0, 2389, 3812, +0, 2397, 3812, +0, 2408, 3812, +0, 2422, 3812, +0, 2441, 3812, +0, 2465, 3812, +0, 2494, 3811, +0, 2531, 3811, +0, 2576, 3810, +0, 2631, 3810, +0, 2694, 3809, +0, 2767, 3808, +0, 2850, 3807, +0, 2941, 3805, +0, 3040, 3802, +0, 3145, 3799, +0, 3256, 3794, +1799, 3372, 3788, +2721, 3492, 3780, +3072, 3614, 3768, +3072, 3721, 3768, +3072, 3768, 3691, +3072, 3768, 3456, +2854, 3912, 2854, +3361, 4052, 2063, +3653, 4095, 0, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3811, +0, 0, 3811, +0, 0, 3810, +0, 0, 3810, +0, 0, 3809, +0, 0, 3808, +0, 0, 3807, +0, 0, 3805, +0, 1737, 3802, +0, 2519, 3799, +0, 2856, 3794, +1799, 3097, 3788, +2721, 3296, 3780, +3072, 3473, 3768, +3318, 3636, 3752, +3318, 3752, 3735, +3318, 3752, 3528, +3302, 3900, 3204, +3561, 4044, 2986, +3768, 4095, 2192, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3812, +0, 0, 3811, +0, 0, 3811, +0, 0, 3810, +0, 0, 3810, +0, 0, 3809, +0, 0, 3808, +0, 0, 3807, +0, 0, 3805, +0, 0, 3802, +0, 0, 3799, +1884, 0, 3794, +2422, 1799, 3788, +2721, 2722, 3780, +3072, 3171, 3768, +3318, 3447, 3752, +3520, 3664, 3730, +3520, 3730, 3609, +3579, 3884, 3450, +3737, 4032, 3336, +3888, 4095, 3118, +3137, 0, 3812, +3137, 0, 3812, +3137, 0, 3812, +3138, 0, 3812, +3138, 0, 3812, +3138, 0, 3812, +3139, 0, 3812, +3139, 0, 3812, +3140, 0, 3812, +3141, 0, 3812, +3143, 0, 3812, +3145, 0, 3812, +3147, 0, 3811, +3151, 0, 3811, +3155, 0, 3810, +3161, 0, 3810, +3169, 0, 3809, +3180, 0, 3808, +3194, 0, 3807, +3211, 0, 3805, +3234, 0, 3802, +3262, 0, 3799, +3298, 0, 3794, +3342, 1799, 3788, +3394, 2721, 3780, +3456, 3072, 3768, +3528, 3318, 3752, +3609, 3520, 3730, +3698, 3698, 3698, +3796, 3862, 3652, +3900, 4016, 3583, +4010, 4095, 3469, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3660, 0, 3944, +3661, 0, 3944, +3661, 0, 3944, +3661, 0, 3944, +3662, 0, 3944, +3663, 0, 3944, +3664, 0, 3943, +3665, 0, 3943, +3667, 0, 3943, +3670, 0, 3942, +3674, 0, 3941, +3678, 0, 3940, +3685, 0, 3939, +3692, 0, 3937, +3703, 0, 3934, +3717, 0, 3931, +3735, 0, 3926, +3758, 1928, 3920, +3787, 2854, 3912, +3822, 3204, 3900, +3867, 3450, 3884, +3862, 3652, 3796, +3862, 3741, 3652, +4016, 3999, 3583, +4095, 4095, 3469, +3954, 0, 4076, +3954, 0, 4076, +3954, 0, 4076, +3954, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3955, 0, 4076, +3956, 0, 4076, +3956, 0, 4076, +3957, 0, 4076, +3958, 0, 4075, +3959, 0, 4075, +3960, 0, 4075, +3962, 0, 4074, +3964, 0, 4073, +3968, 0, 4072, +3972, 0, 4071, +3978, 0, 4069, +3985, 0, 4066, +3995, 0, 4063, +4008, 0, 4058, +4025, 2063, 4052, +4044, 2986, 4040, +4032, 3336, 3986, +4016, 3583, 3900, +4016, 3583, 3711, +4016, 3792, 3583, +4095, 4087, 3469, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 2192, 4095, +4095, 3118, 4079, +4095, 3469, 4010, +4095, 3469, 3869, +4095, 3469, 3568, +4095, 3853, 3469, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3704, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3823, 3944, +0, 3864, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3822, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3704, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3823, 3944, +0, 3864, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3822, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3704, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3823, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3822, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3790, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3269, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3691, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3726, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3270, +0, 4076, 0, +0, 4095, 0, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3690, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3725, 3944, +0, 3742, 3944, +0, 3763, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3270, +0, 4076, 0, +0, 4095, 0, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3680, 3944, +0, 3683, 3944, +0, 3686, 3944, +0, 3690, 3944, +0, 3696, 3944, +0, 3703, 3944, +0, 3713, 3944, +0, 3725, 3944, +0, 3741, 3944, +0, 3762, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3913, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3270, +0, 4076, 0, +0, 4095, 0, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3678, 3944, +0, 3680, 3944, +0, 3682, 3944, +0, 3686, 3944, +0, 3690, 3944, +0, 3695, 3944, +0, 3703, 3944, +0, 3712, 3944, +0, 3725, 3944, +0, 3741, 3944, +0, 3762, 3944, +0, 3789, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3912, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3660, +0, 3944, 3271, +0, 4076, 0, +0, 4095, 0, +0, 3672, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3678, 3944, +0, 3680, 3944, +0, 3682, 3944, +0, 3685, 3944, +0, 3689, 3944, +0, 3695, 3944, +0, 3702, 3944, +0, 3712, 3944, +0, 3725, 3944, +0, 3741, 3944, +0, 3762, 3944, +0, 3788, 3944, +0, 3822, 3944, +0, 3863, 3944, +0, 3912, 3944, +0, 3944, 3915, +0, 3944, 3823, +0, 3944, 3661, +0, 3944, 3271, +0, 4076, 0, +0, 4095, 0, +0, 3671, 3944, +0, 3671, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3681, 3944, +0, 3685, 3944, +0, 3689, 3944, +0, 3694, 3944, +0, 3702, 3944, +0, 3711, 3944, +0, 3724, 3944, +0, 3740, 3944, +0, 3761, 3944, +0, 3788, 3944, +0, 3821, 3944, +0, 3862, 3944, +0, 3912, 3944, +0, 3944, 3916, +0, 3944, 3824, +0, 3944, 3661, +0, 3944, 3272, +0, 4076, 0, +0, 4095, 0, +0, 3670, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3672, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3676, 3944, +0, 3678, 3944, +0, 3680, 3944, +0, 3684, 3944, +0, 3688, 3944, +0, 3694, 3944, +0, 3701, 3944, +0, 3711, 3944, +0, 3723, 3944, +0, 3740, 3944, +0, 3761, 3944, +0, 3787, 3944, +0, 3820, 3944, +0, 3862, 3944, +0, 3911, 3944, +0, 3944, 3916, +0, 3944, 3824, +0, 3944, 3661, +0, 3944, 3273, +0, 4076, 0, +0, 4095, 0, +0, 3669, 3944, +0, 3669, 3944, +0, 3669, 3944, +0, 3669, 3944, +0, 3670, 3944, +0, 3670, 3944, +0, 3670, 3944, +0, 3671, 3944, +0, 3671, 3944, +0, 3673, 3944, +0, 3674, 3944, +0, 3675, 3944, +0, 3677, 3944, +0, 3679, 3944, +0, 3683, 3944, +0, 3687, 3944, +0, 3692, 3944, +0, 3700, 3944, +0, 3710, 3944, +0, 3722, 3944, +0, 3739, 3944, +0, 3760, 3944, +0, 3786, 3944, +0, 3820, 3944, +0, 3861, 3944, +0, 3910, 3944, +0, 3944, 3916, +0, 3944, 3824, +0, 3944, 3662, +0, 3944, 3275, +0, 4076, 0, +0, 4095, 0, +0, 3667, 3944, +0, 3667, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3668, 3944, +0, 3669, 3944, +0, 3670, 3944, +0, 3671, 3944, +0, 3672, 3944, +0, 3673, 3944, +0, 3676, 3944, +0, 3678, 3944, +0, 3681, 3944, +0, 3685, 3944, +0, 3691, 3944, +0, 3699, 3944, +0, 3708, 3944, +0, 3721, 3944, +0, 3737, 3944, +0, 3758, 3944, +0, 3785, 3944, +0, 3819, 3944, +0, 3860, 3944, +0, 3910, 3944, +0, 3944, 3917, +0, 3944, 3825, +0, 3944, 3663, +0, 3944, 3277, +0, 4076, 0, +0, 4095, 0, +0, 3665, 3944, +0, 3665, 3944, +0, 3665, 3944, +0, 3665, 3944, +0, 3665, 3944, +0, 3666, 3944, +0, 3666, 3944, +0, 3666, 3944, +0, 3667, 3944, +0, 3668, 3944, +0, 3669, 3944, +0, 3671, 3944, +0, 3673, 3944, +0, 3676, 3943, +0, 3679, 3943, +0, 3683, 3943, +0, 3689, 3943, +0, 3697, 3943, +0, 3706, 3943, +0, 3719, 3943, +0, 3736, 3943, +0, 3757, 3943, +0, 3784, 3943, +0, 3817, 3943, +0, 3859, 3943, +0, 3909, 3943, +0, 3943, 3917, +0, 3943, 3826, +0, 3943, 3664, +0, 3943, 3279, +0, 4076, 0, +0, 4095, 0, +0, 3661, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3662, 3944, +0, 3663, 3944, +0, 3663, 3944, +0, 3664, 3944, +0, 3665, 3944, +0, 3666, 3944, +0, 3668, 3944, +0, 3670, 3944, +0, 3673, 3943, +0, 3677, 3943, +0, 3681, 3943, +0, 3687, 3943, +0, 3694, 3943, +0, 3704, 3943, +0, 3717, 3943, +0, 3733, 3943, +0, 3755, 3943, +0, 3781, 3943, +0, 3815, 3943, +0, 3857, 3943, +0, 3907, 3943, +0, 3943, 3918, +0, 3943, 3827, +0, 3943, 3665, +0, 3943, 3283, +0, 4075, 0, +0, 4095, 0, +0, 3657, 3944, +0, 3657, 3944, +0, 3657, 3944, +0, 3657, 3944, +0, 3658, 3944, +0, 3658, 3944, +0, 3658, 3944, +0, 3659, 3944, +0, 3659, 3944, +0, 3661, 3944, +0, 3662, 3944, +0, 3663, 3944, +0, 3666, 3944, +0, 3668, 3943, +0, 3672, 3943, +0, 3677, 3943, +0, 3683, 3943, +0, 3691, 3943, +0, 3701, 3943, +0, 3713, 3943, +0, 3730, 3943, +0, 3752, 3943, +0, 3779, 3943, +0, 3813, 3943, +0, 3854, 3943, +0, 3905, 3943, +0, 3943, 3920, +0, 3943, 3828, +0, 3943, 3667, +0, 3943, 3287, +0, 4075, 0, +0, 4095, 0, +0, 3651, 3944, +0, 3651, 3944, +0, 3651, 3944, +0, 3651, 3944, +0, 3652, 3944, +0, 3652, 3944, +0, 3652, 3944, +0, 3653, 3944, +0, 3653, 3944, +0, 3654, 3944, +0, 3656, 3944, +0, 3657, 3944, +0, 3659, 3944, +0, 3662, 3943, +0, 3666, 3943, +0, 3672, 3943, +0, 3679, 3942, +0, 3686, 3942, +0, 3696, 3942, +0, 3709, 3942, +0, 3726, 3942, +0, 3748, 3942, +0, 3775, 3942, +0, 3809, 3942, +0, 3851, 3942, +0, 3902, 3942, +0, 3942, 3921, +0, 3942, 3830, +0, 3942, 3670, +0, 3942, 3293, +0, 4075, 0, +0, 4095, 0, +0, 3643, 3944, +0, 3643, 3944, +0, 3643, 3944, +0, 3643, 3944, +0, 3643, 3944, +0, 3644, 3944, +0, 3644, 3944, +0, 3645, 3944, +0, 3645, 3944, +0, 3646, 3944, +0, 3648, 3944, +0, 3649, 3944, +0, 3651, 3944, +0, 3655, 3943, +0, 3659, 3943, +0, 3664, 3943, +0, 3671, 3942, +0, 3680, 3941, +0, 3690, 3941, +0, 3703, 3941, +0, 3720, 3941, +0, 3742, 3941, +0, 3770, 3941, +0, 3805, 3941, +0, 3847, 3941, +0, 3898, 3941, +0, 3941, 3923, +0, 3941, 3832, +0, 3941, 3674, +0, 3941, 3302, +0, 4074, 0, +0, 4095, 0, +0, 3631, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3632, 3944, +0, 3633, 3944, +0, 3633, 3944, +0, 3634, 3944, +0, 3635, 3944, +0, 3636, 3944, +0, 3638, 3944, +0, 3640, 3944, +0, 3644, 3943, +0, 3648, 3943, +0, 3653, 3943, +0, 3660, 3942, +0, 3669, 3941, +0, 3682, 3940, +0, 3695, 3940, +0, 3713, 3940, +0, 3735, 3940, +0, 3763, 3940, +0, 3798, 3940, +0, 3841, 3940, +0, 3893, 3940, +0, 3940, 3926, +0, 3940, 3836, +0, 3940, 3678, +0, 3940, 3312, +0, 4073, 0, +0, 4095, 0, +0, 3616, 3944, +0, 3616, 3944, +0, 3616, 3944, +0, 3616, 3944, +0, 3617, 3944, +0, 3617, 3944, +0, 3617, 3944, +0, 3618, 3944, +0, 3619, 3944, +0, 3620, 3944, +0, 3621, 3944, +0, 3623, 3944, +0, 3625, 3944, +0, 3628, 3943, +0, 3632, 3943, +0, 3638, 3943, +0, 3646, 3942, +0, 3655, 3941, +0, 3668, 3940, +0, 3684, 3939, +0, 3702, 3939, +0, 3725, 3939, +0, 3754, 3939, +0, 3790, 3939, +0, 3833, 3939, +0, 3886, 3939, +0, 3939, 3929, +0, 3939, 3840, +0, 3939, 3685, +0, 3939, 3326, +0, 4072, 0, +0, 4095, 0, +0, 3594, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3595, 3944, +0, 3596, 3944, +0, 3596, 3944, +0, 3597, 3944, +0, 3598, 3944, +0, 3600, 3944, +0, 3602, 3944, +0, 3604, 3944, +0, 3607, 3943, +0, 3612, 3943, +0, 3618, 3943, +0, 3626, 3942, +0, 3635, 3941, +0, 3649, 3940, +0, 3666, 3939, +0, 3688, 3937, +0, 3711, 3937, +0, 3741, 3937, +0, 3777, 3937, +0, 3822, 3937, +0, 3876, 3937, +0, 3937, 3934, +0, 3937, 3846, +0, 3937, 3692, +0, 3937, 3344, +0, 4071, 0, +0, 4095, 0, +0, 3564, 3944, +0, 3564, 3944, +0, 3564, 3944, +0, 3564, 3944, +0, 3564, 3944, +0, 3565, 3944, +0, 3565, 3944, +0, 3566, 3944, +0, 3567, 3944, +0, 3568, 3944, +0, 3569, 3944, +0, 3571, 3944, +0, 3574, 3944, +0, 3578, 3943, +0, 3583, 3943, +0, 3589, 3943, +0, 3597, 3942, +0, 3608, 3941, +0, 3622, 3940, +0, 3640, 3939, +0, 3663, 3937, +0, 3692, 3934, +0, 3723, 3934, +0, 3761, 3934, +0, 3808, 3934, +0, 3863, 3934, +0, 3928, 3934, +0, 3934, 3853, +0, 3934, 3703, +0, 3934, 3366, +0, 4069, 0, +0, 4095, 0, +0, 3520, 3944, +0, 3520, 3944, +0, 3520, 3944, +0, 3520, 3944, +0, 3520, 3944, +0, 3521, 3944, +0, 3521, 3944, +0, 3522, 3944, +0, 3523, 3944, +0, 3524, 3944, +0, 3526, 3944, +0, 3528, 3944, +0, 3531, 3944, +0, 3535, 3943, +0, 3540, 3943, +0, 3547, 3943, +0, 3556, 3942, +0, 3568, 3941, +0, 3583, 3940, +0, 3603, 3939, +0, 3628, 3937, +0, 3659, 3934, +0, 3698, 3931, +0, 3738, 3931, +0, 3787, 3931, +0, 3845, 3931, +0, 3913, 3931, +0, 3931, 3863, +0, 3931, 3717, +0, 3931, 3395, +0, 4066, 0, +0, 4095, 0, +0, 3452, 3944, +0, 3452, 3944, +0, 3453, 3944, +0, 3453, 3944, +0, 3453, 3944, +0, 3454, 3944, +0, 3454, 3944, +0, 3455, 3944, +0, 3456, 3944, +0, 3458, 3944, +0, 3459, 3944, +0, 3462, 3944, +0, 3466, 3944, +0, 3470, 3943, +0, 3476, 3943, +0, 3484, 3943, +0, 3494, 3942, +0, 3507, 3941, +0, 3525, 3940, +0, 3547, 3939, +0, 3575, 3937, +0, 3611, 3934, +0, 3654, 3931, +0, 3706, 3926, +0, 3758, 3926, +0, 3820, 3926, +0, 3891, 3926, +0, 3926, 3877, +0, 3926, 3735, +0, 3926, 3430, +0, 4063, 0, +2137, 4095, 0, +0, 3344, 3944, +0, 3344, 3944, +0, 3344, 3944, +0, 3344, 3944, +0, 3345, 3944, +0, 3346, 3944, +0, 3346, 3944, +0, 3347, 3944, +0, 3349, 3944, +0, 3351, 3944, +0, 3353, 3944, +0, 3356, 3944, +0, 3361, 3944, +0, 3366, 3943, +0, 3374, 3943, +0, 3384, 3943, +0, 3396, 3942, +0, 3413, 3941, +0, 3434, 3940, +0, 3461, 3939, +0, 3495, 3937, +0, 3537, 3934, +0, 3587, 3931, +0, 3647, 3926, +1928, 3716, 3920, +1928, 3783, 3920, +1928, 3860, 3920, +1928, 3920, 3893, +1928, 3920, 3758, +1928, 3920, 3474, +0, 4058, 2157, +2915, 4095, 0, +0, 3140, 3944, +0, 3140, 3944, +0, 3140, 3944, +0, 3141, 3944, +0, 3142, 3944, +0, 3143, 3944, +0, 3144, 3944, +0, 3145, 3944, +0, 3147, 3944, +0, 3151, 3944, +0, 3154, 3944, +0, 3159, 3944, +0, 3166, 3944, +0, 3175, 3943, +0, 3186, 3943, +0, 3201, 3943, +0, 3220, 3942, +0, 3244, 3941, +0, 3275, 3940, +0, 3313, 3939, +0, 3359, 3937, +0, 3414, 3934, +0, 3479, 3931, +0, 3553, 3926, +1928, 3637, 3920, +2854, 3729, 3912, +2854, 3814, 3912, +2854, 3908, 3912, +2854, 3912, 3787, +2854, 3912, 3526, +2063, 4052, 2689, +3253, 4095, 0, +0, 2497, 3944, +0, 2498, 3944, +0, 2500, 3944, +0, 2502, 3944, +0, 2505, 3944, +0, 2508, 3944, +0, 2513, 3944, +0, 2520, 3944, +0, 2528, 3944, +0, 2539, 3944, +0, 2553, 3944, +0, 2572, 3944, +0, 2596, 3944, +0, 2625, 3943, +0, 2662, 3943, +0, 2708, 3943, +0, 2762, 3942, +0, 2826, 3941, +0, 2899, 3940, +0, 2982, 3939, +0, 3073, 3937, +0, 3172, 3934, +0, 3277, 3931, +0, 3388, 3926, +1928, 3504, 3920, +2854, 3624, 3912, +3204, 3746, 3900, +3204, 3853, 3900, +3204, 3900, 3822, +3204, 3900, 3588, +2987, 4044, 2986, +3494, 4095, 2192, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3943, +0, 0, 3943, +0, 0, 3943, +0, 0, 3942, +0, 0, 3941, +0, 0, 3940, +0, 0, 3939, +0, 0, 3937, +0, 1863, 3934, +0, 2650, 3931, +0, 2988, 3926, +1928, 3229, 3920, +2854, 3428, 3912, +3204, 3605, 3900, +3450, 3768, 3884, +3450, 3884, 3867, +3450, 3884, 3660, +3435, 4032, 3336, +3693, 4095, 3118, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3944, +0, 0, 3943, +0, 0, 3943, +0, 0, 3943, +0, 0, 3942, +0, 0, 3941, +0, 0, 3940, +0, 0, 3939, +0, 0, 3937, +0, 0, 3934, +0, 0, 3931, +2023, 0, 3926, +2556, 1928, 3920, +2854, 2854, 3912, +3204, 3302, 3900, +3450, 3579, 3884, +3652, 3796, 3862, +3652, 3862, 3741, +3711, 4016, 3583, +3869, 4095, 3469, +3269, 0, 3944, +3269, 0, 3944, +3269, 0, 3944, +3269, 0, 3944, +3270, 0, 3944, +3270, 0, 3944, +3270, 0, 3944, +3271, 0, 3944, +3271, 0, 3944, +3272, 0, 3944, +3273, 0, 3944, +3275, 0, 3944, +3277, 0, 3944, +3279, 0, 3943, +3283, 0, 3943, +3287, 0, 3943, +3293, 0, 3942, +3302, 0, 3941, +3312, 0, 3940, +3326, 0, 3939, +3344, 0, 3937, +3366, 0, 3934, +3395, 0, 3931, +3430, 0, 3926, +3474, 1928, 3920, +3526, 2854, 3912, +3588, 3204, 3900, +3660, 3450, 3884, +3741, 3652, 3862, +3830, 3830, 3830, +3928, 3994, 3784, +4032, 4095, 3714, +3791, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3792, 0, 4076, +3793, 0, 4076, +3793, 0, 4076, +3793, 0, 4076, +3794, 0, 4076, +3795, 0, 4076, +3796, 0, 4075, +3797, 0, 4075, +3799, 0, 4075, +3802, 0, 4074, +3805, 0, 4073, +3810, 0, 4072, +3816, 0, 4071, +3824, 0, 4069, +3835, 0, 4066, +3849, 0, 4063, +3867, 0, 4058, +3890, 2063, 4052, +3919, 2986, 4044, +3955, 3336, 4032, +3999, 3583, 4016, +3994, 3784, 3928, +3994, 3873, 3784, +4095, 4095, 3714, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4087, 0, 4095, +4088, 0, 4095, +4088, 0, 4095, +4088, 0, 4095, +4088, 0, 4095, +4089, 0, 4095, +4089, 0, 4095, +4090, 0, 4095, +4091, 0, 4095, +4092, 0, 4095, +4094, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 0, 4095, +4095, 2192, 4095, +4095, 3118, 4095, +4095, 3469, 4095, +4095, 3714, 4032, +4095, 3714, 3844, +4095, 3924, 3714, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3819, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3846, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3922, 4076, +0, 3955, 4076, +0, 3996, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3791, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3819, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3922, 4076, +0, 3955, 4076, +0, 3996, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3819, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3955, 4076, +0, 3996, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3955, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3954, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3823, 4076, +0, 3828, 4076, +0, 3836, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3955, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3401, +0, 4095, 0, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3828, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3402, +0, 4095, 0, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3811, 4076, +0, 3812, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3828, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3858, 4076, +0, 3874, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3402, +0, 4095, 0, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3815, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3828, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3857, 4076, +0, 3873, 4076, +0, 3895, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4045, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3402, +0, 4095, 0, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3814, 4076, +0, 3818, 4076, +0, 3822, 4076, +0, 3827, 4076, +0, 3835, 4076, +0, 3845, 4076, +0, 3857, 4076, +0, 3873, 4076, +0, 3894, 4076, +0, 3921, 4076, +0, 3954, 4076, +0, 3995, 4076, +0, 4044, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3792, +0, 4076, 3403, +0, 4095, 0, +0, 3804, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3814, 4076, +0, 3817, 4076, +0, 3821, 4076, +0, 3827, 4076, +0, 3834, 4076, +0, 3844, 4076, +0, 3856, 4076, +0, 3873, 4076, +0, 3894, 4076, +0, 3921, 4076, +0, 3953, 4076, +0, 3995, 4076, +0, 4044, 4076, +0, 4076, 4047, +0, 4076, 3955, +0, 4076, 3793, +0, 4076, 3403, +0, 4095, 0, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3809, 4076, +0, 3811, 4076, +0, 3813, 4076, +0, 3816, 4076, +0, 3821, 4076, +0, 3826, 4076, +0, 3834, 4076, +0, 3843, 4076, +0, 3856, 4076, +0, 3872, 4076, +0, 3893, 4076, +0, 3920, 4076, +0, 3953, 4076, +0, 3994, 4076, +0, 4044, 4076, +0, 4076, 4048, +0, 4076, 3955, +0, 4076, 3793, +0, 4076, 3404, +0, 4095, 0, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3806, 4076, +0, 3807, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3812, 4076, +0, 3816, 4076, +0, 3820, 4076, +0, 3826, 4076, +0, 3833, 4076, +0, 3843, 4076, +0, 3855, 4076, +0, 3872, 4076, +0, 3892, 4076, +0, 3919, 4076, +0, 3953, 4076, +0, 3994, 4076, +0, 4043, 4076, +0, 4076, 4048, +0, 4076, 3956, +0, 4076, 3793, +0, 4076, 3405, +0, 4095, 0, +0, 3801, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3802, 4076, +0, 3802, 4076, +0, 3802, 4076, +0, 3803, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3807, 4076, +0, 3809, 4076, +0, 3812, 4076, +0, 3814, 4076, +0, 3819, 4076, +0, 3824, 4076, +0, 3832, 4076, +0, 3841, 4076, +0, 3854, 4076, +0, 3871, 4076, +0, 3891, 4076, +0, 3918, 4076, +0, 3952, 4076, +0, 3993, 4076, +0, 4043, 4076, +0, 4076, 4048, +0, 4076, 3956, +0, 4076, 3794, +0, 4076, 3407, +0, 4095, 0, +0, 3799, 4076, +0, 3799, 4076, +0, 3799, 4076, +0, 3799, 4076, +0, 3800, 4076, +0, 3800, 4076, +0, 3800, 4076, +0, 3801, 4076, +0, 3801, 4076, +0, 3802, 4076, +0, 3803, 4076, +0, 3804, 4076, +0, 3805, 4076, +0, 3808, 4076, +0, 3810, 4076, +0, 3813, 4076, +0, 3817, 4076, +0, 3823, 4076, +0, 3830, 4076, +0, 3840, 4076, +0, 3853, 4076, +0, 3869, 4076, +0, 3890, 4076, +0, 3917, 4076, +0, 3950, 4076, +0, 3992, 4076, +0, 4042, 4076, +0, 4076, 4049, +0, 4076, 3957, +0, 4076, 3795, +0, 4076, 3409, +0, 4095, 0, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3797, 4076, +0, 3798, 4076, +0, 3798, 4076, +0, 3798, 4076, +0, 3799, 4076, +0, 3800, 4076, +0, 3801, 4076, +0, 3803, 4076, +0, 3805, 4076, +0, 3808, 4075, +0, 3811, 4075, +0, 3816, 4075, +0, 3821, 4075, +0, 3829, 4075, +0, 3838, 4075, +0, 3851, 4075, +0, 3868, 4075, +0, 3889, 4075, +0, 3916, 4075, +0, 3949, 4075, +0, 3991, 4075, +0, 4041, 4075, +0, 4075, 4049, +0, 4075, 3958, +0, 4075, 3796, +0, 4075, 3411, +0, 4095, 0, +0, 3793, 4076, +0, 3793, 4076, +0, 3793, 4076, +0, 3794, 4076, +0, 3794, 4076, +0, 3794, 4076, +0, 3794, 4076, +0, 3795, 4076, +0, 3795, 4076, +0, 3796, 4076, +0, 3797, 4076, +0, 3798, 4076, +0, 3800, 4076, +0, 3802, 4076, +0, 3805, 4075, +0, 3809, 4075, +0, 3813, 4075, +0, 3818, 4075, +0, 3826, 4075, +0, 3836, 4075, +0, 3849, 4075, +0, 3865, 4075, +0, 3887, 4075, +0, 3913, 4075, +0, 3947, 4075, +0, 3989, 4075, +0, 4039, 4075, +0, 4075, 4050, +0, 4075, 3959, +0, 4075, 3797, +0, 4075, 3415, +0, 4095, 0, +0, 3789, 4076, +0, 3789, 4076, +0, 3789, 4076, +0, 3789, 4076, +0, 3790, 4076, +0, 3790, 4076, +0, 3790, 4076, +0, 3790, 4076, +0, 3791, 4076, +0, 3791, 4076, +0, 3793, 4076, +0, 3794, 4076, +0, 3795, 4076, +0, 3798, 4076, +0, 3801, 4075, +0, 3804, 4075, +0, 3810, 4075, +0, 3815, 4075, +0, 3823, 4075, +0, 3833, 4075, +0, 3846, 4075, +0, 3862, 4075, +0, 3884, 4075, +0, 3911, 4075, +0, 3945, 4075, +0, 3986, 4075, +0, 4037, 4075, +0, 4075, 4051, +0, 4075, 3960, +0, 4075, 3799, +0, 4075, 3419, +0, 4095, 0, +0, 3783, 4076, +0, 3783, 4076, +0, 3783, 4076, +0, 3783, 4076, +0, 3783, 4076, +0, 3784, 4076, +0, 3784, 4076, +0, 3784, 4076, +0, 3785, 4076, +0, 3785, 4076, +0, 3787, 4076, +0, 3787, 4076, +0, 3789, 4076, +0, 3792, 4076, +0, 3795, 4075, +0, 3798, 4075, +0, 3803, 4075, +0, 3810, 4074, +0, 3818, 4074, +0, 3828, 4074, +0, 3841, 4074, +0, 3858, 4074, +0, 3880, 4074, +0, 3907, 4074, +0, 3941, 4074, +0, 3983, 4074, +0, 4034, 4074, +0, 4074, 4053, +0, 4074, 3962, +0, 4074, 3802, +0, 4074, 3426, +0, 4095, 0, +0, 3774, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3775, 4076, +0, 3776, 4076, +0, 3776, 4076, +0, 3777, 4076, +0, 3777, 4076, +0, 3778, 4076, +0, 3780, 4076, +0, 3781, 4076, +0, 3784, 4076, +0, 3787, 4075, +0, 3790, 4075, +0, 3796, 4075, +0, 3803, 4074, +0, 3812, 4073, +0, 3822, 4073, +0, 3835, 4073, +0, 3852, 4073, +0, 3874, 4073, +0, 3902, 4073, +0, 3937, 4073, +0, 3979, 4073, +0, 4030, 4073, +0, 4073, 4055, +0, 4073, 3964, +0, 4073, 3805, +0, 4073, 3434, +0, 4095, 0, +0, 3763, 4076, +0, 3763, 4076, +0, 3763, 4076, +0, 3764, 4076, +0, 3764, 4076, +0, 3764, 4076, +0, 3764, 4076, +0, 3765, 4076, +0, 3765, 4076, +0, 3766, 4076, +0, 3767, 4076, +0, 3768, 4076, +0, 3770, 4076, +0, 3773, 4076, +0, 3776, 4075, +0, 3780, 4075, +0, 3785, 4075, +0, 3792, 4074, +0, 3801, 4073, +0, 3814, 4072, +0, 3827, 4072, +0, 3845, 4072, +0, 3867, 4072, +0, 3895, 4072, +0, 3930, 4072, +0, 3973, 4072, +0, 4025, 4072, +0, 4072, 4058, +0, 4072, 3968, +0, 4072, 3810, +0, 4072, 3444, +0, 4095, 0, +0, 3748, 4076, +0, 3748, 4076, +0, 3748, 4076, +0, 3748, 4076, +0, 3748, 4076, +0, 3749, 4076, +0, 3749, 4076, +0, 3749, 4076, +0, 3750, 4076, +0, 3751, 4076, +0, 3752, 4076, +0, 3753, 4076, +0, 3755, 4076, +0, 3757, 4076, +0, 3760, 4075, +0, 3765, 4075, +0, 3770, 4075, +0, 3777, 4074, +0, 3787, 4073, +0, 3800, 4072, +0, 3816, 4071, +0, 3834, 4071, +0, 3857, 4071, +0, 3886, 4071, +0, 3921, 4071, +0, 3965, 4071, +0, 4018, 4071, +0, 4071, 4061, +0, 4071, 3972, +0, 4071, 3816, +0, 4071, 3458, +0, 4095, 0, +0, 3726, 4076, +0, 3726, 4076, +0, 3726, 4076, +0, 3727, 4076, +0, 3727, 4076, +0, 3727, 4076, +0, 3727, 4076, +0, 3728, 4076, +0, 3728, 4076, +0, 3729, 4076, +0, 3730, 4076, +0, 3732, 4076, +0, 3734, 4076, +0, 3736, 4076, +0, 3739, 4075, +0, 3744, 4075, +0, 3750, 4075, +0, 3757, 4074, +0, 3768, 4073, +0, 3781, 4072, +0, 3798, 4071, +0, 3820, 4069, +0, 3843, 4069, +0, 3873, 4069, +0, 3910, 4069, +0, 3954, 4069, +0, 4008, 4069, +0, 4069, 4066, +0, 4069, 3978, +0, 4069, 3824, +0, 4069, 3475, +0, 4095, 0, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3696, 4076, +0, 3697, 4076, +0, 3697, 4076, +0, 3698, 4076, +0, 3699, 4076, +0, 3700, 4076, +0, 3701, 4076, +0, 3703, 4076, +0, 3706, 4076, +0, 3710, 4075, +0, 3714, 4075, +0, 3721, 4075, +0, 3729, 4074, +0, 3740, 4073, +0, 3754, 4072, +0, 3772, 4071, +0, 3795, 4069, +0, 3824, 4066, +0, 3855, 4066, +0, 3893, 4066, +0, 3940, 4066, +0, 3995, 4066, +0, 4060, 4066, +0, 4066, 3985, +0, 4066, 3835, +0, 4066, 3498, +0, 4095, 0, +0, 3651, 4076, +0, 3651, 4076, +0, 3651, 4076, +0, 3652, 4076, +0, 3652, 4076, +0, 3652, 4076, +0, 3653, 4076, +0, 3653, 4076, +0, 3654, 4076, +0, 3655, 4076, +0, 3656, 4076, +0, 3658, 4076, +0, 3660, 4076, +0, 3663, 4076, +0, 3667, 4075, +0, 3672, 4075, +0, 3679, 4075, +0, 3688, 4074, +0, 3700, 4073, +0, 3715, 4072, +0, 3735, 4071, +0, 3760, 4069, +0, 3791, 4066, +0, 3830, 4063, +0, 3870, 4063, +0, 3919, 4063, +0, 3977, 4063, +0, 4045, 4063, +0, 4063, 3995, +0, 4063, 3849, +0, 4063, 3527, +0, 4095, 0, +0, 3584, 4076, +0, 3584, 4076, +0, 3585, 4076, +0, 3585, 4076, +0, 3585, 4076, +0, 3585, 4076, +0, 3586, 4076, +0, 3586, 4076, +0, 3587, 4076, +0, 3588, 4076, +0, 3590, 4076, +0, 3592, 4076, +0, 3594, 4076, +0, 3597, 4076, +0, 3602, 4075, +0, 3608, 4075, +0, 3616, 4075, +0, 3626, 4074, +0, 3640, 4073, +0, 3657, 4072, +0, 3679, 4071, +0, 3708, 4069, +0, 3743, 4066, +0, 3786, 4063, +0, 3838, 4058, +0, 3890, 4058, +0, 3952, 4058, +0, 4023, 4058, +0, 4058, 4008, +0, 4058, 3867, +0, 4058, 3562, +0, 4095, 0, +0, 3475, 4076, +0, 3475, 4076, +0, 3476, 4076, +0, 3476, 4076, +0, 3476, 4076, +0, 3477, 4076, +0, 3477, 4076, +0, 3478, 4076, +0, 3479, 4076, +0, 3480, 4076, +0, 3482, 4076, +0, 3485, 4076, +0, 3488, 4076, +0, 3492, 4076, +0, 3498, 4075, +0, 3505, 4075, +0, 3515, 4075, +0, 3528, 4074, +0, 3545, 4073, +0, 3566, 4072, +0, 3593, 4071, +0, 3627, 4069, +0, 3669, 4066, +0, 3719, 4063, +0, 3779, 4058, +2063, 3848, 4052, +2063, 3915, 4052, +2063, 3992, 4052, +2063, 4052, 4025, +2063, 4052, 3890, +2063, 4052, 3606, +0, 4095, 2266, +0, 3271, 4076, +0, 3272, 4076, +0, 3272, 4076, +0, 3272, 4076, +0, 3273, 4076, +0, 3273, 4076, +0, 3274, 4076, +0, 3276, 4076, +0, 3277, 4076, +0, 3279, 4076, +0, 3282, 4076, +0, 3286, 4076, +0, 3291, 4076, +0, 3297, 4076, +0, 3306, 4075, +0, 3318, 4075, +0, 3333, 4075, +0, 3351, 4074, +0, 3376, 4073, +0, 3407, 4072, +0, 3445, 4071, +0, 3491, 4069, +0, 3546, 4066, +0, 3611, 4063, +0, 3685, 4058, +2063, 3769, 4052, +2986, 3861, 4044, +2986, 3947, 4044, +2986, 4040, 4044, +2986, 4044, 3919, +2986, 4044, 3659, +2192, 4095, 2814, +0, 2626, 4076, +0, 2627, 4076, +0, 2628, 4076, +0, 2630, 4076, +0, 2632, 4076, +0, 2635, 4076, +0, 2639, 4076, +0, 2644, 4076, +0, 2650, 4076, +0, 2659, 4076, +0, 2670, 4076, +0, 2684, 4076, +0, 2703, 4076, +0, 2726, 4076, +0, 2756, 4075, +0, 2793, 4075, +0, 2839, 4075, +0, 2893, 4074, +0, 2957, 4073, +0, 3031, 4072, +0, 3113, 4071, +0, 3205, 4069, +0, 3303, 4066, +0, 3409, 4063, +0, 3520, 4058, +2063, 3636, 4052, +2986, 3755, 4044, +3336, 3878, 4032, +3336, 3986, 4032, +3336, 4032, 3955, +3336, 4032, 3720, +3121, 4095, 3118, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4075, +0, 0, 4075, +0, 0, 4075, +0, 0, 4074, +0, 0, 4073, +0, 0, 4072, +0, 0, 4071, +0, 0, 4069, +0, 1985, 4066, +0, 2781, 4063, +0, 3119, 4058, +2063, 3361, 4052, +2986, 3561, 4044, +3336, 3737, 4032, +3583, 3900, 4016, +3583, 4016, 3999, +3583, 4016, 3792, +3568, 4095, 3469, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4076, +0, 0, 4075, +0, 0, 4075, +0, 0, 4075, +0, 0, 4074, +0, 0, 4073, +0, 0, 4072, +0, 0, 4071, +0, 0, 4069, +0, 0, 4066, +0, 0, 4063, +2157, 0, 4058, +2689, 2063, 4052, +2986, 2987, 4044, +3336, 3435, 4032, +3583, 3711, 4016, +3784, 3928, 3994, +3784, 3994, 3873, +3844, 4095, 3714, +3401, 0, 4076, +3401, 0, 4076, +3401, 0, 4076, +3401, 0, 4076, +3401, 0, 4076, +3402, 0, 4076, +3402, 0, 4076, +3402, 0, 4076, +3403, 0, 4076, +3403, 0, 4076, +3404, 0, 4076, +3405, 0, 4076, +3407, 0, 4076, +3409, 0, 4076, +3411, 0, 4075, +3415, 0, 4075, +3419, 0, 4075, +3426, 0, 4074, +3434, 0, 4073, +3444, 0, 4072, +3458, 0, 4071, +3475, 0, 4069, +3498, 0, 4066, +3527, 0, 4063, +3562, 0, 4058, +3606, 2063, 4052, +3659, 2986, 4044, +3720, 3336, 4032, +3792, 3583, 4016, +3873, 3784, 3994, +3962, 3962, 3962, +4060, 4095, 3916, +3924, 0, 4095, +3924, 0, 4095, +3924, 0, 4095, +3924, 0, 4095, +3924, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3925, 0, 4095, +3926, 0, 4095, +3926, 0, 4095, +3927, 0, 4095, +3927, 0, 4095, +3929, 0, 4095, +3930, 0, 4095, +3932, 0, 4095, +3935, 0, 4095, +3938, 0, 4095, +3943, 0, 4095, +3949, 0, 4095, +3957, 0, 4095, +3968, 0, 4095, +3982, 0, 4095, +4000, 0, 4095, +4023, 2192, 4095, +4051, 3118, 4095, +4087, 3469, 4095, +4095, 3714, 4095, +4095, 3916, 4060, +4095, 4005, 3916, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3946, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4007, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3533, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3946, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3533, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3533, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3978, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3924, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3943, 4095, +0, 3945, 4095, +0, 3947, 4095, +0, 3951, 4095, +0, 3955, 4095, +0, 3961, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4054, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3943, 4095, +0, 3945, 4095, +0, 3947, 4095, +0, 3950, 4095, +0, 3955, 4095, +0, 3960, 4095, +0, 3968, 4095, +0, 3977, 4095, +0, 3990, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4053, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3941, 4095, +0, 3943, 4095, +0, 3945, 4095, +0, 3947, 4095, +0, 3950, 4095, +0, 3954, 4095, +0, 3960, 4095, +0, 3967, 4095, +0, 3977, 4095, +0, 3989, 4095, +0, 4006, 4095, +0, 4027, 4095, +0, 4053, 4095, +0, 4086, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4087, +0, 4095, 3925, +0, 4095, 3534, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3943, 4095, +0, 3944, 4095, +0, 3947, 4095, +0, 3950, 4095, +0, 3954, 4095, +0, 3960, 4095, +0, 3967, 4095, +0, 3977, 4095, +0, 3989, 4095, +0, 4005, 4095, +0, 4026, 4095, +0, 4053, 4095, +0, 4086, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3925, +0, 4095, 3535, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3944, 4095, +0, 3946, 4095, +0, 3950, 4095, +0, 3954, 4095, +0, 3959, 4095, +0, 3967, 4095, +0, 3976, 4095, +0, 3989, 4095, +0, 4005, 4095, +0, 4026, 4095, +0, 4053, 4095, +0, 4086, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3925, +0, 4095, 3536, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3943, 4095, +0, 3946, 4095, +0, 3949, 4095, +0, 3953, 4095, +0, 3959, 4095, +0, 3966, 4095, +0, 3976, 4095, +0, 3988, 4095, +0, 4005, 4095, +0, 4026, 4095, +0, 4052, 4095, +0, 4085, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3926, +0, 4095, 3537, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3936, 4095, +0, 3936, 4095, +0, 3937, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3939, 4095, +0, 3941, 4095, +0, 3942, 4095, +0, 3945, 4095, +0, 3948, 4095, +0, 3952, 4095, +0, 3958, 4095, +0, 3965, 4095, +0, 3975, 4095, +0, 3988, 4095, +0, 4004, 4095, +0, 4025, 4095, +0, 4051, 4095, +0, 4085, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4088, +0, 4095, 3926, +0, 4095, 3538, +0, 3933, 4095, +0, 3933, 4095, +0, 3933, 4095, +0, 3933, 4095, +0, 3934, 4095, +0, 3934, 4095, +0, 3934, 4095, +0, 3934, 4095, +0, 3935, 4095, +0, 3935, 4095, +0, 3936, 4095, +0, 3937, 4095, +0, 3938, 4095, +0, 3940, 4095, +0, 3941, 4095, +0, 3944, 4095, +0, 3947, 4095, +0, 3951, 4095, +0, 3957, 4095, +0, 3964, 4095, +0, 3974, 4095, +0, 3986, 4095, +0, 4003, 4095, +0, 4024, 4095, +0, 4051, 4095, +0, 4084, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4089, +0, 4095, 3927, +0, 4095, 3539, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3933, 4095, +0, 3933, 4095, +0, 3934, 4095, +0, 3935, 4095, +0, 3936, 4095, +0, 3938, 4095, +0, 3940, 4095, +0, 3942, 4095, +0, 3945, 4095, +0, 3950, 4095, +0, 3955, 4095, +0, 3963, 4095, +0, 3972, 4095, +0, 3985, 4095, +0, 4002, 4095, +0, 4023, 4095, +0, 4049, 4095, +0, 4083, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4089, +0, 4095, 3927, +0, 4095, 3541, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3929, 4095, +0, 3930, 4095, +0, 3930, 4095, +0, 3930, 4095, +0, 3931, 4095, +0, 3932, 4095, +0, 3932, 4095, +0, 3934, 4095, +0, 3935, 4095, +0, 3937, 4095, +0, 3940, 4095, +0, 3944, 4095, +0, 3948, 4095, +0, 3953, 4095, +0, 3961, 4095, +0, 3971, 4095, +0, 3983, 4095, +0, 4000, 4095, +0, 4021, 4095, +0, 4048, 4095, +0, 4082, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4090, +0, 4095, 3929, +0, 4095, 3544, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3926, 4095, +0, 3927, 4095, +0, 3927, 4095, +0, 3927, 4095, +0, 3927, 4095, +0, 3928, 4095, +0, 3929, 4095, +0, 3930, 4095, +0, 3932, 4095, +0, 3934, 4095, +0, 3937, 4095, +0, 3941, 4095, +0, 3945, 4095, +0, 3951, 4095, +0, 3959, 4095, +0, 3968, 4095, +0, 3981, 4095, +0, 3998, 4095, +0, 4019, 4095, +0, 4046, 4095, +0, 4080, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4091, +0, 4095, 3930, +0, 4095, 3547, +0, 3921, 4095, +0, 3921, 4095, +0, 3921, 4095, +0, 3921, 4095, +0, 3921, 4095, +0, 3922, 4095, +0, 3922, 4095, +0, 3922, 4095, +0, 3923, 4095, +0, 3923, 4095, +0, 3924, 4095, +0, 3925, 4095, +0, 3926, 4095, +0, 3927, 4095, +0, 3930, 4095, +0, 3933, 4095, +0, 3937, 4095, +0, 3942, 4095, +0, 3947, 4095, +0, 3955, 4095, +0, 3965, 4095, +0, 3978, 4095, +0, 3994, 4095, +0, 4016, 4095, +0, 4043, 4095, +0, 4077, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4092, +0, 4095, 3932, +0, 4095, 3552, +0, 3915, 4095, +0, 3915, 4095, +0, 3915, 4095, +0, 3915, 4095, +0, 3915, 4095, +0, 3916, 4095, +0, 3916, 4095, +0, 3916, 4095, +0, 3917, 4095, +0, 3917, 4095, +0, 3918, 4095, +0, 3919, 4095, +0, 3920, 4095, +0, 3922, 4095, +0, 3924, 4095, +0, 3927, 4095, +0, 3931, 4095, +0, 3936, 4095, +0, 3943, 4095, +0, 3950, 4095, +0, 3961, 4095, +0, 3974, 4095, +0, 3990, 4095, +0, 4012, 4095, +0, 4039, 4095, +0, 4073, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4094, +0, 4095, 3935, +0, 4095, 3558, +0, 3907, 4095, +0, 3907, 4095, +0, 3907, 4095, +0, 3907, 4095, +0, 3907, 4095, +0, 3908, 4095, +0, 3908, 4095, +0, 3908, 4095, +0, 3908, 4095, +0, 3909, 4095, +0, 3910, 4095, +0, 3910, 4095, +0, 3912, 4095, +0, 3913, 4095, +0, 3916, 4095, +0, 3919, 4095, +0, 3923, 4095, +0, 3928, 4095, +0, 3935, 4095, +0, 3944, 4095, +0, 3954, 4095, +0, 3968, 4095, +0, 3984, 4095, +0, 4006, 4095, +0, 4034, 4095, +0, 4069, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3938, +0, 4095, 3566, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3896, 4095, +0, 3897, 4095, +0, 3897, 4095, +0, 3898, 4095, +0, 3898, 4095, +0, 3899, 4095, +0, 3901, 4095, +0, 3903, 4095, +0, 3905, 4095, +0, 3908, 4095, +0, 3912, 4095, +0, 3917, 4095, +0, 3924, 4095, +0, 3934, 4095, +0, 3946, 4095, +0, 3960, 4095, +0, 3977, 4095, +0, 3999, 4095, +0, 4027, 4095, +0, 4062, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3943, +0, 4095, 3576, +0, 3880, 4095, +0, 3880, 4095, +0, 3880, 4095, +0, 3880, 4095, +0, 3880, 4095, +0, 3881, 4095, +0, 3881, 4095, +0, 3881, 4095, +0, 3881, 4095, +0, 3882, 4095, +0, 3883, 4095, +0, 3884, 4095, +0, 3885, 4095, +0, 3887, 4095, +0, 3889, 4095, +0, 3893, 4095, +0, 3897, 4095, +0, 3903, 4095, +0, 3910, 4095, +0, 3920, 4095, +0, 3932, 4095, +0, 3949, 4095, +0, 3966, 4095, +0, 3989, 4095, +0, 4018, 4095, +0, 4054, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3949, +0, 4095, 3590, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3859, 4095, +0, 3860, 4095, +0, 3860, 4095, +0, 3861, 4095, +0, 3862, 4095, +0, 3863, 4095, +0, 3864, 4095, +0, 3866, 4095, +0, 3868, 4095, +0, 3872, 4095, +0, 3876, 4095, +0, 3882, 4095, +0, 3890, 4095, +0, 3900, 4095, +0, 3913, 4095, +0, 3930, 4095, +0, 3952, 4095, +0, 3976, 4095, +0, 4005, 4095, +0, 4042, 4095, +0, 4087, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3957, +0, 4095, 3608, +0, 3828, 4095, +0, 3828, 4095, +0, 3828, 4095, +0, 3828, 4095, +0, 3828, 4095, +0, 3829, 4095, +0, 3829, 4095, +0, 3829, 4095, +0, 3830, 4095, +0, 3830, 4095, +0, 3831, 4095, +0, 3832, 4095, +0, 3834, 4095, +0, 3836, 4095, +0, 3838, 4095, +0, 3842, 4095, +0, 3847, 4095, +0, 3853, 4095, +0, 3861, 4095, +0, 3872, 4095, +0, 3886, 4095, +0, 3904, 4095, +0, 3927, 4095, +0, 3956, 4095, +0, 3987, 4095, +0, 4025, 4095, +0, 4072, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3968, +0, 4095, 3630, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3784, 4095, +0, 3785, 4095, +0, 3786, 4095, +0, 3786, 4095, +0, 3787, 4095, +0, 3788, 4095, +0, 3790, 4095, +0, 3792, 4095, +0, 3795, 4095, +0, 3799, 4095, +0, 3804, 4095, +0, 3811, 4095, +0, 3820, 4095, +0, 3832, 4095, +0, 3847, 4095, +0, 3867, 4095, +0, 3892, 4095, +0, 3923, 4095, +0, 3962, 4095, +0, 4002, 4095, +0, 4051, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 3982, +0, 4095, 3659, +0, 3716, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3717, 4095, +0, 3718, 4095, +0, 3718, 4095, +0, 3719, 4095, +0, 3720, 4095, +0, 3721, 4095, +0, 3722, 4095, +0, 3724, 4095, +0, 3727, 4095, +0, 3730, 4095, +0, 3735, 4095, +0, 3741, 4095, +0, 3748, 4095, +0, 3759, 4095, +0, 3772, 4095, +0, 3790, 4095, +0, 3812, 4095, +0, 3840, 4095, +0, 3875, 4095, +0, 3918, 4095, +0, 3970, 4095, +0, 4022, 4095, +0, 4084, 4095, +0, 4095, 4095, +0, 4095, 4095, +0, 4095, 4000, +0, 4095, 3695, +0, 3608, 4095, +0, 3608, 4095, +0, 3608, 4095, +0, 3608, 4095, +0, 3608, 4095, +0, 3609, 4095, +0, 3609, 4095, +0, 3610, 4095, +0, 3611, 4095, +0, 3612, 4095, +0, 3613, 4095, +0, 3615, 4095, +0, 3617, 4095, +0, 3621, 4095, +0, 3625, 4095, +0, 3630, 4095, +0, 3638, 4095, +0, 3648, 4095, +0, 3661, 4095, +0, 3677, 4095, +0, 3699, 4095, +0, 3726, 4095, +0, 3759, 4095, +0, 3801, 4095, +0, 3851, 4095, +0, 3911, 4095, +2192, 3980, 4095, +2192, 4047, 4095, +2192, 4095, 4095, +2192, 4095, 4095, +2192, 4095, 4023, +2192, 4095, 3738, +0, 3404, 4095, +0, 3404, 4095, +0, 3404, 4095, +0, 3405, 4095, +0, 3405, 4095, +0, 3405, 4095, +0, 3406, 4095, +0, 3407, 4095, +0, 3408, 4095, +0, 3410, 4095, +0, 3412, 4095, +0, 3415, 4095, +0, 3419, 4095, +0, 3424, 4095, +0, 3430, 4095, +0, 3439, 4095, +0, 3450, 4095, +0, 3465, 4095, +0, 3484, 4095, +0, 3509, 4095, +0, 3539, 4095, +0, 3577, 4095, +0, 3623, 4095, +0, 3679, 4095, +0, 3743, 4095, +0, 3818, 4095, +2192, 3901, 4095, +3118, 3993, 4095, +3118, 4079, 4095, +3118, 4095, 4095, +3118, 4095, 4051, +3118, 4095, 3791, +0, 2761, 4095, +0, 2762, 4095, +0, 2762, 4095, +0, 2764, 4095, +0, 2765, 4095, +0, 2767, 4095, +0, 2770, 4095, +0, 2773, 4095, +0, 2778, 4095, +0, 2785, 4095, +0, 2793, 4095, +0, 2804, 4095, +0, 2818, 4095, +0, 2837, 4095, +0, 2861, 4095, +0, 2890, 4095, +0, 2927, 4095, +0, 2973, 4095, +0, 3027, 4095, +0, 3090, 4095, +0, 3164, 4095, +0, 3246, 4095, +0, 3337, 4095, +0, 3436, 4095, +0, 3541, 4095, +0, 3653, 4095, +2192, 3768, 4095, +3118, 3888, 4095, +3469, 4010, 4095, +3469, 4095, 4095, +3469, 4095, 4087, +3469, 4095, 3853, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 2137, 4095, +0, 2915, 4095, +0, 3253, 4095, +2192, 3494, 4095, +3118, 3693, 4095, +3469, 3869, 4095, +3714, 4032, 4095, +3714, 4095, 4095, +3714, 4095, 3924, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +0, 0, 4095, +2266, 0, 4095, +2814, 2192, 4095, +3118, 3121, 4095, +3469, 3568, 4095, +3714, 3844, 4095, +3916, 4060, 4095, +3916, 4095, 4005, +3533, 0, 4095, +3533, 0, 4095, +3533, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3534, 0, 4095, +3535, 0, 4095, +3536, 0, 4095, +3537, 0, 4095, +3538, 0, 4095, +3539, 0, 4095, +3541, 0, 4095, +3544, 0, 4095, +3547, 0, 4095, +3552, 0, 4095, +3558, 0, 4095, +3566, 0, 4095, +3576, 0, 4095, +3590, 0, 4095, +3608, 0, 4095, +3630, 0, 4095, +3659, 0, 4095, +3695, 0, 4095, +3738, 2192, 4095, +3791, 3118, 4095, +3853, 3469, 4095, +3924, 3714, 4095, +4005, 3916, 4095, +4095, 4095, 4095] + } +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.dds b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.dds new file mode 100644 index 0000000000..d48a60e5cf --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.dds @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd3fe7e7f016c1a3b2c3e8db5fbd23efbc8d8717c01fac4cf39b1ae7b3ae9325 +size 41559412 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr new file mode 100644 index 0000000000..9daa58f75c --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:facad074b84df87a0ab4baaf2bd95552e6eca3fed79a56875c9815f32d885b8a +size 11949493 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/.gitignore b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/.gitignore new file mode 100644 index 0000000000..fd2792f73e --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/.gitignore @@ -0,0 +1 @@ +User_Env.bat \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat new file mode 100644 index 0000000000..2c5809ec15 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat @@ -0,0 +1,52 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Set up and run O3DE Python CMD prompt +:: Sets up the DccScriptingInterface_Env, +:: Puts you in the CMD within the dev environment + +:: Set up window +TITLE O3DE Color Grading CMD +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +%~d0 +cd %~dp0 +PUSHD %~dp0 + +SETLOCAL ENABLEDELAYEDEXPANSION + +:: if the user has set up a custom env call it +IF EXIST "%~dp0User_env.bat" CALL %~dp0User_env.bat + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_Tools.bat + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE Color Grading Python CMD ... +echo _____________________________________________________________________ +echo. + +:: Change to root dir +CD /D .. + +:: Create command prompt with environment +CALL %windir%\system32\cmd.exe + +ENDLOCAL + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat new file mode 100644 index 0000000000..730170dce7 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat @@ -0,0 +1,129 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Sets up environment for O3DE DCC tools and code access + +:: Set up window +TITLE O3DE Color Grading Env Core +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Skip initialization if already completed +IF "%O3DE_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE Color Grading Core Env ... +echo _____________________________________________________________________ +echo. + +IF "%CMD_LAUNCHERS%"=="" (set CMD_LAUNCHERS=%~dp0) +echo CMD_LAUNCHERS = %CMD_LAUNCHERS% + +:: add to the PATH +SET PATH=%CMD_LAUNCHERS%;%PATH% + +:: Constant Vars (Global) +:: global debug flag (propogates) +:: The intent here is to set and globally enter a debug mode +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates earliest debugger connection +:: we support attaching to WingIDE... PyCharm and VScode in the future +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: Override this to control the setting +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: This maps up to the \Dev folder +IF "%DEV_REL_PATH%"=="" (set DEV_REL_PATH=..\..\..\..\..\..) +echo DEV_REL_PATH = %DEV_REL_PATH% + +:: You can define the project name +IF "%O3DE_PROJECT_NAME%"=="" ( + for %%a in (%CD%..\..) do set O3DE_PROJECT_NAME=%%~na + ) +echo O3DE_PROJECT_NAME = %O3DE_PROJECT_NAME% + +CD /D ..\ +IF "%O3DE_PROJECT_PATH%"=="" (set O3DE_PROJECT_PATH=%CD%) +echo O3DE_PROJECT_PATH = %O3DE_PROJECT_PATH% + +IF "%ABS_PATH%"=="" (set ABS_PATH=%CD%) +echo ABS_PATH = %ABS_PATH% + +:: Save current directory and change to target directory +pushd %ABS_PATH% + +:: Change to root Lumberyard dev dir +CD /d %DEV_REL_PATH% +IF "%O3DE_DEV%"=="" (set O3DE_DEV=%CD%) +echo O3DE_DEV = %O3DE_DEV% +:: Restore original directory +popd + +:: dcc scripting interface gem path +:: currently know relative path to this gem +set DCCSIG_PATH=%O3DE_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface +echo DCCSIG_PATH = %DCCSIG_PATH% + +:: Change to DCCsi root dir +CD /D %DCCSIG_PATH% + +:: per-dcc sdk path +set DCCSI_SDK_PATH=%DCCSIG_PATH%\SDK +echo DCCSI_SDK_PATH = %DCCSI_SDK_PATH% + +:: temp log location specific to this gem +set DCCSI_LOG_PATH=%DCCSIG_PATH%\.temp\logs +echo DCCSI_LOG_PATH = %DCCSI_LOG_PATH% + +:: O3DE build path +IF "%TAG_O3DE_BUILD_PATH%"=="" (set TAG_O3DE_BUILD_PATH=build) +echo TAG_O3DE_BUILD_PATH = %TAG_O3DE_BUILD_PATH% + +IF "%O3DE_BUILD_PATH%"=="" (set O3DE_BUILD_PATH=%O3DE_DEV%\%TAG_O3DE_BUILD_PATH%) +echo O3DE_BUILD_PATH = %O3DE_BUILD_PATH% + +IF "%O3DE_BIN_PATH%"=="" (set O3DE_BIN_PATH=%O3DE_BUILD_PATH%\bin\profile) +echo O3DE_BIN_PATH = %O3DE_BIN_PATH% + +:: add to the PATH +SET PATH=%O3DE_BUILD_PATH%;%DCCSIG_PATH%;%DCCSI_AZPY_PATH%;%PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat new file mode 100644 index 0000000000..83b7382dc6 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat @@ -0,0 +1,102 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Sets up extended environment for O3DE and DCCsi python + +:: Skip initialization if already completed +IF "%O3DE_ENV_PY_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +CALL %~dp0\Env_Core.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE Color Grading Python Env ... +echo _____________________________________________________________________ +echo. + +:: Python Version +:: Ideally these are set to match the O3DE python distribution +:: \python\runtime +IF "%DCCSI_PY_VERSION_MAJOR%"=="" (set DCCSI_PY_VERSION_MAJOR=3) +echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% + +:: PY version Major +IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) +echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% + +IF "%DCCSI_PY_VERSION_RELEASE%"=="" (set DCCSI_PY_VERSION_RELEASE=10) +echo DCCSI_PY_VERSION_RELEASE = %DCCSI_PY_VERSION_RELEASE% + +:: shared location for 64bit python 3.7 DEV location +:: this defines a DCCsi sandbox for lib site-packages by version +:: \Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\3rdParty\Python\Lib +set DCCSI_PYTHON_PATH=%DCCSIG_PATH%\3rdParty\Python +echo DCCSI_PYTHON_PATH = %DCCSI_PYTHON_PATH% + +:: add access to a Lib location that matches the py version (example: 3.7.x) +:: switch this for other python versions like maya (2.7.x) +IF "%DCCSI_PYTHON_LIB_PATH%"=="" (set DCCSI_PYTHON_LIB_PATH=%DCCSI_PYTHON_PATH%\Lib\%DCCSI_PY_VERSION_MAJOR%.x\%DCCSI_PY_VERSION_MAJOR%.%DCCSI_PY_VERSION_MINOR%.x\site-packages) +echo DCCSI_PYTHON_LIB_PATH = %DCCSI_PYTHON_LIB_PATH% + +:: add to the PATH +SET PATH=%DCCSI_PYTHON_LIB_PATH%;%PATH% + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%O3DE_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: location for O3DE python 3.7 location +set DCCSI_PY_BASE=%DCCSI_PYTHON_INSTALL%\python.cmd +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% + +set DCCSI_PY_IDE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_EXE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python\python.exe +echo DCCSI_PY_EXE = %DCCSI_PY_EXE% + +set DCCSI_PY_IDE_PACKAGES=%DCCSI_PY_IDE%\Lib\site-packages +echo DCCSI_PY_IDE_PACKAGES = %DCCSI_PY_IDE_PACKAGES% + +set DCCSI_FEATURECOMMON_SCRIPTS=%O3DE_DEV%\Gems\Atom\Feature\Common\Editor\Scripts +echo DCCSI_FEATURECOMMON_SCRIPTS = %DCCSI_FEATURECOMMON_SCRIPTS% + +set DCCSI_COLORGRADING_SCRIPTS=%DCCSI_FEATURECOMMON_SCRIPTS%\ColorGrading +echo DCCSI_COLORGRADING_SCRIPTS = %DCCSI_COLORGRADING_SCRIPTS% + +:: add to the PATH +SET PATH=%DCCSI_PYTHON_INSTALL%;%DCCSI_PY_IDE%;%DCCSI_PY_IDE_PACKAGES%;%DCCSI_PY_EXE%;%DCCSI_COLORGRADING_SCRIPTS%;%PATH% + +:: add all python related paths to PYTHONPATH for package imports +set PYTHONPATH=%DCCSIG_PATH%;%DCCSI_PYTHON_LIB_PATH%;%O3DE_BIN_PATH%;%DCCSI_COLORGRADING_SCRIPTS%;%DCCSI_FEATURECOMMON_SCRIPTS%;%PYTHONPATH% +echo PYTHONPATH = %PYTHONPATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_ENV_PY_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Tools.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Tools.bat new file mode 100644 index 0000000000..27c8960ca3 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Tools.bat @@ -0,0 +1,88 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + + +:: Sets ocio and oiio tools for O3DE Color Grading + +:: Skip initialization if already completed +IF "%O3DE_ENV_TOOLS_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE Color Grading Tools Env ... +echo _____________________________________________________________________ +echo. + +::SET oiio_bin=%O3DE_PROJECT_PATH%\Tools\oiio\build\bin\Release +::SET oiiotool=%oiio_bin%\oiiotool.exe + +:: Libs that ocio uses +SET vcpkg_bin=%O3DE_DEV%\Tools\ColorGrading\vcpkg\installed\x64-windows\bin +:: add to path +SET PATH=%PATH%;%vcpkg_bin% + +SET ocio_bin=%O3DE_DEV%\Tools\ColorGrading\ocio\build\src\OpenColorIO\Release +echo ocio_bin = %ocio_bin% +:: add to the PATH +SET PATH=%PATH%;%ocio_bin% + +IF "%OCIO_APPS%"=="" (set OCIO_APPS=%O3DE_DEV%\Tools\ColorGrading\ocio\build\src\apps) +echo OCIO_APPS = %OCIO_APPS% + +SET ociobakelut=%OCIO_APPS%\ociobakelut\Release +echo ociobakelut = %ociobakelut% +SET PATH=%PATH%;%ociobakelut% + +SET ociocheck=%OCIO_APPS%\ociocheck\Release +SET PATH=%PATH%;%ociocheck% + +SET ociochecklut=%OCIO_APPS%\ociochecklut\Release +SET PATH=%PATH%;%ociochecklut% + +SET ocioconvert=%OCIO_APPS%\ocioconvert\Release +SET PATH=%PATH%;%ocioconvert% + +SET ociodisplay=%OCIO_APPS%\ociodisplay\Release +SET PATH=%PATH%;%ociodisplay% + +SET ociolutimage=%OCIO_APPS%\ociolutimage\Release +SET PATH=%PATH%;%ociolutimage% + +SET ociomakeclf=%OCIO_APPS%\ociomakeclf\Release +SET PATH=%PATH%;%ociomakeclf% + +SET ocioperf=%OCIO_APPS%\ocioperf\Release +SET PATH=%PATH%;%ocioperf% + +SET ociowrite=%OCIO_APPS%\ociowrite\Release +SET PATH=%PATH%;%ociowrite% + +::ENDLOCAL + +:: Set flag so we don't initialize this environment twice +SET O3DE_ENV_TOOLS_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat new file mode 100644 index 0000000000..4c297f53a9 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat @@ -0,0 +1,67 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Sets up environment for Lumberyard DCC tools and code access + +:: Skip initialization if already completed +IF "%DCCSI_ENV_WINGIDE_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: WingIDE version Major +IF "%DCCSI_WING_VERSION_MAJOR%"=="" (set DCCSI_WING_VERSION_MAJOR=7) +:: WingIDE version Major +IF "%DCCSI_WING_VERSION_MINOR%"=="" (set DCCSI_WING_VERSION_MINOR=1) + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_IDE%\python.exe + +:: put project env variables/paths here +set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% +IF "%WING_PROJ%"=="" (set WING_PROJ=%O3DE_PROJECT_PATH%\.solutions\.wing\o3de_color_grading_%DCCSI_WING_VERSION_MAJOR%x.wpr) + +::SETLOCAL ENABLEDELAYEDEXPANSION + +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE Color Grading Environment ... +echo _____________________________________________________________________ +echo. + +echo DCCSI_WING_VERSION_MAJOR = %DCCSI_WING_VERSION_MAJOR% +echo DCCSI_WING_VERSION_MINOR = %DCCSI_WING_VERSION_MINOR% +echo WINGHOME = %WINGHOME% +echo WING_PROJ = %WING_PROJ% + +:: add to the PATH +SET PATH=%WINGHOME%;%PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET DCCSI_ENV_WINGIDE_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat new file mode 100644 index 0000000000..93f5fb7fa6 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat @@ -0,0 +1,99 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Launches Wing IDE and the O3de Color Grading project files + +:: Set up window +TITLE O3DE Color Grading Launch WingIDE 7x +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: if the user has set up a custom env call it +IF EXIST "%~dp0User_env.bat" CALL %~dp0User_env.bat + +:: Constant Vars (Global) +:: global debug (propogates) +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=True) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates debugger connection +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=True) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=10) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Initialize env +CALL %~dp0\Env_Core.bat +CALL %~dp0\Env_Python.bat +CALL %~dp0\Env_WingIDE.bat +echo. +echo _____________________________________________________________________ +echo. +echo ~ WingIDE Version %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% +echo ~ Launching O3DE %LY_PROJECT% project in WingIDE %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% ... +echo _____________________________________________________________________ +echo. + +echo LY_DEV = %LY_DEV% + +:: shared location for default O3DE python location +set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python +echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% + +:: Wing and other IDEs probably prefer access directly to the python.exe +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +echo DCCSI_PY_IDE = %DCCSI_PY_IDE% + +:: ide and debugger plug +set DCCSI_PY_BASE=%DCCSI_PY_IDE%\python.exe +echo DCCSI_PY_BASE = %DCCSI_PY_BASE% + +:: ide and debugger plug +set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% +echo DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT% + +:: if the user has set up a custom env call it +IF EXIST "%~dp0User_Dev.bat" CALL %~dp0User_Dev.bat + +echo. + +:: Change to root dir +CD /D %O3DE_PROJECT_PATH% + +IF EXIST "%WINGHOME%\bin\wing.exe" ( + start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%" +) ELSE ( + Where wing.exe 2> NUL + IF ERRORLEVEL 1 ( + echo wing.exe could not be found + pause + ) ELSE ( + start "" wing.exe "%WING_PROJ%" + ) +) + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/README.txt b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/README.txt new file mode 100644 index 0000000000..d876dd671d --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/README.txt @@ -0,0 +1,26 @@ +# +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +These are commandline tools for color grading workflow and authoring LUTs externally. +Note: may require OpenColorIO (ocio) and/or OpenImageIO (oiio) to be set up properly. + +CMD_ColorGradingTools.bat :: opens a configured window env context in CMD +Env_Core.bat :: core O3DE env hooks (any envars DCCSI_ shares some overlay with DccScriptingInterface Gem) +Env_Python.bat :: sets up access and configures env for O3DE python (to run externally) +Env_Tools.bat :: hooks for ocio and oiio + :: note: currently you must build coio tools/apps yourself (we used vcpkg and cmake gui) + :: note: oiio, it's .pyd and oiiotool should build in O3DE (if you have troubel issue a ticket to investigate) +Env_WingIDE.bat :: hooks for WingIDE (a python IDE and debugger) + :: note: feel free to configure a different IDE, user choice. +Launch_WingIDE-7-1.bat :: this will launch WingIDE with envar hooks and access to O3DE python (for authroing, debugging) + :: note: you will need to make sure wingstub.py is configured correctly + :: note: you will need to create the wing project file/path (see Env_WingIDE.bat) +User_Env.bat.template :: this is an example of overriding or extending the envar hooks (set local engine root, or branch path, etc.) + :: note: to use, copy and rename to User_Env.bat + :: bote: we use this to primarily enable the debugging related envar hooks \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template new file mode 100644 index 0000000000..558505f80f --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template @@ -0,0 +1,41 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: copy this file, rename to User_Env.bat (remove .template) +:: use this file to override any local properties that differ from base + +:: Skip initialization if already completed +IF "%O3DE_USER_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +SETLOCAL ENABLEDELAYEDEXPANSION + +SET O3DE_DEV=C:\Depot\o3de-engine +::SET OCIO_APPS=C:\Depot\o3de-engine\Tools\ColorGrading\ocio\build\src\apps +SET TAG_LY_BUILD_PATH=build +SET DCCSI_GDEBUG=True +SET DCCSI_DEV_MODE=True + +SET WING_PROJ=%O3DE_PROJECT_PATH%\.solutions\.wing\o3de_color_grading_%DCCSI_WING_VERSION_MAJOR%x.wpr + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_USER_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/readme.txt b/Gems/Atom/Feature/Common/Tools/ColorGrading/readme.txt new file mode 100644 index 0000000000..ffa6e9d9e5 --- /dev/null +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/readme.txt @@ -0,0 +1,98 @@ +################################ +# create identity LUT +ociolutimage --generate --cubesize 16 --output C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_16_LUT.exr + +NOTE: ociolutimage is a OpenColorIO (ocio) app. O3DE does NOT currently build these, however you can build them yourself. + for example, we used vcpkg and cmake gui to build them locally. + we intend to add a fully built integration of ocio in the future. + for now, we have provided all of the LUTs below so that most users will not need the ocio tools. + +################################ +# create base 16x16x16 LUT shaped for grading in 48-nits (LDR), in 1000-nits (HDR), 2000nits, 4000-nits +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_16_LUT.exr --op pre-grading --shaper Log2-48nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-48nits_16_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_16_LUT.exr --op pre-grading --shaper Log2-1000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-1000nits_16_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_16_LUT.exr --op pre-grading --shaper Log2-2000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-2000nits_16_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_16_LUT.exr --op pre-grading --shaper Log2-4000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-4000nits_16_LUT.exr + + +################################ +# create base 32x32x32 LUT shaped for grading in 48-nits (LDR), in 1000-nits (HDR), 2000nits, 4000-nits +ociolutimage --generate --cubesize 32 --output C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr --op pre-grading --shaper Log2-48nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-48nits_32_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr --op pre-grading --shaper Log2-1000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-1000nits_32_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr --op pre-grading --shaper Log2-2000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-2000nits_32_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr --op pre-grading --shaper Log2-4000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-4000nits_32_LUT.exr + + +################################ +# create base 64x64x64 LUT shaped for grading in 48-nits (LDR), in 1000-nits (HDR), 2000nits, 4000-nits +# LUT size 64 broken output without --maxwidth 4096!!! +ociolutimage --generate --cubesize 64 --maxwidth 4096 --output C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_64_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_64_LUT.exr --op pre-grading --shaper Log2-48nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-48nits_64_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_64_LUT.exr --op pre-grading --shaper Log2-1000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-1000nits_64_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_64_LUT.exr --op pre-grading --shaper Log2-2000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-2000nits_64_LUT.exr + +python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_64_LUT.exr --op pre-grading --shaper Log2-4000nits --o C:\Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-4000nits_64_LUT.exr + + +################################ +# Photoshop, Basics +Examples: C:\Depot\o3de-engine\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\TestData\Photoshop\ + HDR_in_LDR_Log2-48nits\LUT_PreShaped_Composite\* + + 1. This must be installed (righ-click) before launching photoshop: + Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\from_ACEScg_to_sRGB.icc + ^ this is to be used as 'custom color proof' (ACES view transform) + + 2. This is the O3DE 'displaymapper passthrough' capture, re-saved as a .exr: + "ColorGrading\Resources\TestData\Photoshop\Log2-48nits\framebuffer_ACEScg_to_sRGB_icc.exr" + ^ open in photoshop, color proof with the above .icc + the image should proof such that it looks the same as camera in O3DE viewport + with the Displaymapper set to ACES + + 3. Composite this base LUT in a layer on top: + "Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-48nits_32_LUT.exr" + ^ this is a pre-shaped 32x32x32 LUT we generated above + + 4. Color Grade using adjustment layers (and hope for the best, some photoshop grades may cause values to clip) + + 5. Select/crop just the LUT, 'Copy Merged' into a new document, save into a folder such as: + "ColorGrading\Resources\TestData\Photoshop\Log2-48nits\i_shaped\test_hue-sat_32_LUT.exr" + ^ this lut is post-grade BUT still shaped (need to inv shape back to normailzed 0-1 values) + + 6. Use the provided cmd/python tools, we need to inverse shape: + + Run: "Gems\Atom\Feature\Common\Tools\ColorGrading\cmdline\CMD_ColorGradingTools.bat" + + C:\Depot\o3de-engine\Gems\Atom\Feature\Common\Tools\ColorGrading>> + + python %DCCSI_COLORGRADING_SCRIPTS%\lut_helper.py --i "Resources\TestData\TestData\Photoshop\Log2-48nits\i_shaped\test_hue-sat_32_LUT.exr" --op post-grading --shaper Log2-48nits --o Resources\TestData\Photoshop\Log2-48nits\o_invShaped\test_hue-sat_32_LUT -l -a + + ^ this will inv-shaped LUT (3DL's are normalized in 0-1 space, values may clip!!!) + ^ -e generates LUT as .exr + ^ -l generates a .3DL version + ^ -a generates a .azasset version <-- this copies/moves to an asset folder + +Using LUTs In-engine: + Only the .azasset needs to be copied to a O3DE project assets folder to use in engine, example: + "C:\Depot\o3de-engine\Gems\Atom\Feature\Common\Assets\ColorGrading\TestData\Photoshop\inv-Log2-48nits\test_hue-sat_32_LUT.azasset" + ^ this is just an example path within the engine folder + + The .azasset can be loaded into a 'Look Modification Component' + + If there are multiple properly configured 'Look Modification Components' you can blend LUTs/Looks (in world space, in a cinematic, etc.) + + By default LUTs utilize linear sampling, but you can use the following CVAR to improve quality for 'any difficult lut': + r_lutSampleQuality=0, linear + r_lutSampleQuality=1, b-spline 7 taps + r_lutSampleQuality=2, b-spline 19 taps (highest quality) \ No newline at end of file From e15634a86775703d898a09487f5ab1e9f9b76b50 Mon Sep 17 00:00:00 2001 From: mrieggeramzn <61609885+mrieggeramzn@users.noreply.github.com> Date: Mon, 30 Aug 2021 21:16:54 +0000 Subject: [PATCH 024/355] Adding receiver plane bias to directional shadows (#3305) * Adding receiver plane bias to directional shadows * fixing whitespace issue * Slight spelling change --- .../Features/Shadow/BicubicPcfFilters.azsli | 89 +++++++++++-------- .../Shadow/DirectionalLightShadow.azsli | 18 +++- .../Shadow/ReceiverPlaneDepthBias.azsli | 38 ++++++++ ...irectionalLightFeatureProcessorInterface.h | 4 + .../DirectionalLightFeatureProcessor.cpp | 5 ++ .../DirectionalLightFeatureProcessor.h | 6 ++ .../CoreLights/DirectionalLightBus.h | 8 ++ .../DirectionalLightComponentConfig.h | 4 + .../DirectionalLightComponentConfig.cpp | 4 +- .../DirectionalLightComponentController.cpp | 19 +++- .../DirectionalLightComponentController.h | 2 + .../EditorDirectionalLightComponent.cpp | 10 ++- 12 files changed, 163 insertions(+), 44 deletions(-) create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/BicubicPcfFilters.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/BicubicPcfFilters.azsli index 37e8634543..65cbeb5874 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/BicubicPcfFilters.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/BicubicPcfFilters.azsli @@ -8,6 +8,8 @@ #pragma once +#include "ReceiverPlaneDepthBias.azsli" + // Pcf filtering taken from legacy Cry/Lumberyard ShadowCommon.cfi. // // Approximate an expensive but smooth bicubic filter by taking multiple bilinear samples and then weighting the samples appropriately. @@ -28,8 +30,12 @@ struct SampleShadowMapBicubicParameters float invShadowMapSize; SamplerComparisonState samplerState; float comparisonValue; + + // Optionally pass in a non-zero value into the receiverPlaneDepthBias to reduce shadow acne with large Pcf kernels + float2 receiverPlaneDepthBias; }; + float SampleShadowMapBicubic_4Tap(SampleShadowMapBicubicParameters param) { // Compute the shadow map UV and fractionals. @@ -47,13 +53,19 @@ float SampleShadowMapBicubic_4Tap(SampleShadowMapBicubicParameters param) float2 uv1 = (fractionalUV / weights1) + 1.0; // Accumulate the shadow results and return the resolve value. - float shadow; + float shadow = 0; + + const float2 uvOffsets[4] = {float2(uv0.x, uv0.y), float2(uv1.x, uv0.y), float2(uv0.x, uv1.y), float2(uv1.x, uv1.y)}; + const float weights[4] = {weights0.x * weights0.y, weights1.x * weights0.y, weights0.x * weights1.y, weights1.x * weights1.y}; + + [unroll] + for(int i = 0 ; i < 4; ++i) + { + const float2 texCoordOffset = uvOffsets[i] * param.invShadowMapSize; + const float fragmentDistance = param.comparisonValue + ApplyReceiverPlaneDepthBias(param.receiverPlaneDepthBias, texCoordOffset); + shadow += weights[i] * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + texCoordOffset, param.shadowPos.z), fragmentDistance); + } - shadow = weights0.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights1.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights0.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights1.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow /= 16.0; return shadow * shadow; } @@ -80,20 +92,26 @@ float SampleShadowMapBicubic_9Tap(SampleShadowMapBicubicParameters param) float2 uv1 = (3.0 + fractionalUV) / weights1; float2 uv2 = (fractionalUV / weights2) + 2.0; + + const float2 uvOffsets[9] = {float2(uv0.x, uv0.y), float2(uv1.x, uv0.y), float2(uv2.x, uv0.y), + float2(uv0.x, uv1.y), float2(uv1.x, uv1.y), float2(uv2.x, uv1.y), + float2(uv0.x, uv2.y), float2(uv1.x, uv2.y), float2(uv2.x, uv2.y) }; + + const float weights[9] = {weights0.x * weights0.y, weights1.x * weights0.y, weights2.x * weights0.y, + weights0.x * weights1.y, weights1.x * weights1.y, weights2.x * weights1.y, + weights0.x * weights2.y, weights1.x * weights2.y, weights2.x * weights2.y}; + // Accumulate the shadow results and return the resolve value. - float shadowResult; - - shadowResult = weights0.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadowResult += weights1.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadowResult += weights2.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); + float shadowResult = 0; - shadowResult += weights0.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadowResult += weights1.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadowResult += weights2.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - - shadowResult += weights0.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadowResult += weights1.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadowResult += weights2.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); + [unroll] + for(int i = 0 ; i < 9 ; ++i) + { + const float2 texCoordOffset = uvOffsets[i] * param.invShadowMapSize; + const float fragmentDistance = param.comparisonValue + ApplyReceiverPlaneDepthBias(param.receiverPlaneDepthBias, texCoordOffset); + + shadowResult += weights[i] * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + texCoordOffset, param.shadowPos.z), fragmentDistance); + } shadowResult /= 144.0; return shadowResult * shadowResult; @@ -123,28 +141,27 @@ float SampleShadowMapBicubic_16Tap(SampleShadowMapBicubicParameters param) float2 uv2 = -((7.0 * fractionalUV + 5.0) / weights2) + 1.0; float2 uv3 = -(fractionalUV / weights3) + 3.0; - // Accumulate the shadow results and return the resolve value. - float shadow; + const float2 uvOffsets[16] = {float2(uv0.x, uv0.y), float2(uv1.x, uv0.y), float2(uv2.x, uv0.y), float2(uv3.x, uv0.y), + float2(uv0.x, uv1.y), float2(uv1.x, uv1.y), float2(uv2.x, uv1.y), float2(uv3.x, uv1.y), + float2(uv0.x, uv2.y), float2(uv1.x, uv2.y), float2(uv2.x, uv2.y), float2(uv3.x, uv2.y), + float2(uv0.x, uv3.y), float2(uv1.x, uv3.y), float2(uv2.x, uv3.y), float2(uv3.x, uv3.y)}; - shadow = weights0.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights1.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights2.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights3.x * weights0.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv3.x, uv0.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); + const float weights[16] = {weights0.x * weights0.y, weights1.x * weights0.y, weights2.x * weights0.y, weights3.x * weights0.y, + weights0.x * weights1.y, weights1.x * weights1.y, weights2.x * weights1.y, weights3.x * weights1.y, + weights0.x * weights2.y, weights1.x * weights2.y, weights2.x * weights2.y, weights3.x * weights2.y, + weights0.x * weights3.y, weights1.x * weights3.y, weights2.x * weights3.y, weights3.x * weights3.y}; - shadow += weights0.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights1.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights2.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights3.x * weights1.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv3.x, uv1.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); + // Accumulate the shadow results and return the resolve value. + float shadow = 0; - shadow += weights0.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights1.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights2.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights3.x * weights2.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv3.x, uv2.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); + [unroll] + for(int i = 0 ; i < 16 ; ++i) + { + const float2 texCoordOffset = uvOffsets[i] * param.invShadowMapSize; + const float fragmentDistance = param.comparisonValue + ApplyReceiverPlaneDepthBias(param.receiverPlaneDepthBias, texCoordOffset); - shadow += weights0.x * weights3.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv0.x, uv3.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights1.x * weights3.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv1.x, uv3.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights2.x * weights3.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv2.x, uv3.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); - shadow += weights3.x * weights3.y * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + float2(uv3.x, uv3.y) * param.invShadowMapSize, param.shadowPos.z), param.comparisonValue); + shadow += weights[i] * param.shadowMap.SampleCmpLevelZero(param.samplerState, float3(texelCenter + texCoordOffset, param.shadowPos.z), fragmentDistance); + } shadow /= 2704; return shadow * shadow; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli index 8b3eedf2aa..8df13bd19a 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli @@ -14,6 +14,7 @@ #include "Shadow.azsli" #include "ShadowmapAtlasLib.azsli" #include "BicubicPcfFilters.azsli" +#include "ReceiverPlaneDepthBias.azsli" // Before including this azsli file, a PassSrg must be defined with the following members: // Texture2DArray m_directionalLightShadowmap; @@ -23,6 +24,7 @@ // This matchs ShadowFilterMethod in ShadowConstants.h enum class ShadowFilterMethod {None, Pcf, Esm, EsmPcf}; option ShadowFilterMethod o_directional_shadow_filtering_method = ShadowFilterMethod::None; +option bool o_directional_shadow_receiver_plane_bias_enable = true; // DirectionalLightShadow calculates lit ratio for a directional light. class DirectionalLightShadow @@ -107,6 +109,8 @@ class DirectionalLightShadow float m_slopeBias[ViewSrg::MaxCascadeCount]; float3 m_normalVector; DebugInfo m_debugInfo; + float3 m_shadowPosDX[ViewSrg::MaxCascadeCount]; + float3 m_shadowPosDY[ViewSrg::MaxCascadeCount]; }; // This outputs the coordinate in shadowmap Texture space of the given point. @@ -438,6 +442,7 @@ float DirectionalLightShadow::SamplePcfBicubic(float3 shadowCoord, uint indexOfC { const uint filteringSampleCount = ViewSrg::m_directionalLightShadows[m_lightIndex].m_filteringSampleCount; const uint size = ViewSrg::m_directionalLightShadows[m_lightIndex].m_shadowmapSize; + const uint cascadeCount = ViewSrg::m_directionalLightShadows[m_lightIndex].m_cascadeCount; Texture2DArray shadowmap = PassSrg::m_directionalLightShadowmap; @@ -448,7 +453,8 @@ float DirectionalLightShadow::SamplePcfBicubic(float3 shadowCoord, uint indexOfC param.invShadowMapSize = rcp(size); param.comparisonValue = shadowCoord.z; param.samplerState = SceneSrg::m_hwPcfSampler; - + param.receiverPlaneDepthBias = o_directional_shadow_receiver_plane_bias_enable ? ComputeReceiverPlaneDepthBias(m_shadowPosDX[indexOfCascade], m_shadowPosDY[indexOfCascade]) : 0; + if (filteringSampleCount <= 4) { return SampleShadowMapBicubic_4Tap(param); @@ -476,6 +482,16 @@ float DirectionalLightShadow::GetVisibility( shadow.m_debugInfo.m_cascadeIndex = 0; shadow.m_debugInfo.m_usePcfFallback = false; + if (o_directional_shadow_receiver_plane_bias_enable) + { + [unroll] + for(int i = 0 ; i < ViewSrg::MaxCascadeCount ; ++i) + { + shadow.m_shadowPosDX[i] = ddx_fine(shadowCoords[i]); + shadow.m_shadowPosDY[i] = ddy_fine(shadowCoords[i]); + } + } + // Calculate slope bias const float3 lightDirection = normalize(SceneSrg::m_directionalLights[lightIndex].m_direction); diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli new file mode 100644 index 0000000000..6225bb3434 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli @@ -0,0 +1,38 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +// Use ddx/ddy to attempt to predict the slope of the receiver plane (the triangle we are shading) and adjust the pcf comparision depth accordingly +// See Section 20.5 Large Pcf Kernels in "Introduction to 3D Game Programming with DirectX 12" for a good explanation and diagrams of the problem +// Solution from: +// https://web.archive.org/web/20120220010450/http://developer.amd.com/media/gpu_assets/Isidoro-ShadowMapping.pdf +// Another implementation example: https://github.com/TheRealMJP/Shadows +float2 ComputeReceiverPlaneDepthBias(float3 projCoordsDDX, float3 projCoordsDDY) +{ + const float invDet = 1.0f / ((projCoordsDDX.x * projCoordsDDY.y) - (projCoordsDDX.y * projCoordsDDY.x)); + + float2 receiverPlaneDepthBias; + + receiverPlaneDepthBias.x = projCoordsDDY.y * projCoordsDDX.z - projCoordsDDX.y * projCoordsDDY.z; + receiverPlaneDepthBias.y = projCoordsDDX.x * projCoordsDDY.z - projCoordsDDY.x * projCoordsDDX.z; + receiverPlaneDepthBias *= invDet; + + return receiverPlaneDepthBias; +} + +// For each sample in the Pcf kernel, offset the z comparison depth value by the amount returned by this function. +// receiverPlaneDepthBias should be the input from ComputeReceiverPlaneDepthBias() +float ApplyReceiverPlaneDepthBias(const float2 receiverPlaneDepthBias, const float2 texCoordOffset) +{ + float fragmentDepthBias = dot(receiverPlaneDepthBias, texCoordOffset); + // Because ddx/ddy can only give us a very rough approximation of the underlying surface, we might introduce acne by biasing away from the camera. + // Clamping this will remove this effect + fragmentDepthBias = min(fragmentDepthBias, 0.0); + return fragmentDepthBias; +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h index 8dc8f1bade..3244c8249e 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h @@ -168,6 +168,10 @@ namespace AZ //! Sets the shadowmap Pcf method. virtual void SetPcfMethod(LightHandle handle, PcfMethod method) = 0; + + //! Sets whether the directional shadowmap should use receiver plane bias. + //! This attempts to reduce shadow acne when using large pcf filters. + virtual void SetShadowReceiverPlaneBiasEnabled(LightHandle handle, bool enable) = 0; }; } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp index e0812f633a..44f95a8b85 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp @@ -202,6 +202,7 @@ namespace AZ { uint32_t shadowFilterMethod = m_shadowData.at(nullptr).GetData(m_shadowingLightHandle.GetIndex()).m_shadowFilterMethod; RPI::ShaderSystemInterface::Get()->SetGlobalShaderOption(m_directionalShadowFilteringMethodName, AZ::RPI::ShaderOptionValue{shadowFilterMethod}); + RPI::ShaderSystemInterface::Get()->SetGlobalShaderOption(m_directionalShadowReceiverPlaneBiasEnableName, AZ::RPI::ShaderOptionValue{ m_shadowProperties.GetData(m_shadowingLightHandle.GetIndex()).m_isReceiverPlaneBiasEnabled }); const uint32_t cascadeCount = m_shadowData.at(nullptr).GetData(m_shadowingLightHandle.GetIndex()).m_cascadeCount; ShadowProperty& property = m_shadowProperties.GetData(m_shadowingLightHandle.GetIndex()); @@ -616,6 +617,10 @@ namespace AZ m_shadowBufferNeedsUpdate = true; } + void DirectionalLightFeatureProcessor::SetShadowReceiverPlaneBiasEnabled(LightHandle handle, bool enable) + { + m_shadowProperties.GetData(handle.GetIndex()).m_isReceiverPlaneBiasEnabled = enable; + } void DirectionalLightFeatureProcessor::OnRenderPipelineAdded(RPI::RenderPipelinePtr pipeline) { diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h index 4c486c4540..d57b3aaf2b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h @@ -177,6 +177,10 @@ namespace AZ // Shadow filter method of the light ShadowFilterMethod m_shadowFilterMethod = ShadowFilterMethod::None; + + // If true, this will reduce the shadow acne introduced by large pcf kernels by estimating the angle of the triangle being shaded + // with the ddx/ddy functions. + bool m_isReceiverPlaneBiasEnabled = true; }; static void Reflect(ReflectContext* context); @@ -218,6 +222,7 @@ namespace AZ void SetFilteringSampleCount(LightHandle handle, uint16_t count) override; void SetShadowBoundaryWidth(LightHandle handle, float boundaryWidth) override; void SetPcfMethod(LightHandle handle, PcfMethod method) override; + void SetShadowReceiverPlaneBiasEnabled(LightHandle handle, bool enable) override; const Data::Instance GetLightBuffer() const; uint32_t GetLightCount() const; @@ -371,6 +376,7 @@ namespace AZ Name m_lightTypeName = Name("directional"); Name m_directionalShadowFilteringMethodName = Name("o_directional_shadow_filtering_method"); + Name m_directionalShadowReceiverPlaneBiasEnableName = Name("o_directional_shadow_receiver_plane_bias_enable"); static constexpr const char* FeatureProcessorName = "DirectionalLightFeatureProcessor"; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h index 086f68f80f..610578ee2d 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h @@ -185,6 +185,14 @@ namespace AZ //! This sets the type of Pcf (percentage-closer filtering) to use. //! @param method The Pcf method to use. virtual void SetPcfMethod(PcfMethod method) = 0; + + //! Gets whether the directional shadowmap should use receiver plane bias. + //! This attempts to reduce shadow acne when using large pcf filters. + virtual bool GetShadowReceiverPlaneBiasEnabled() const = 0; + + //! Sets whether the directional shadowmap should use receiver plane bias. + //! @param enable flag specifying whether to enable the receiver plane bias feature + virtual void SetShadowReceiverPlaneBiasEnabled(bool enable) = 0; }; using DirectionalLightRequestBus = EBus; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h index e7fe692213..e9e5778086 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h @@ -115,6 +115,10 @@ namespace AZ PcfMethod m_pcfMethod = PcfMethod::Bicubic; + //! Whether not to enable the receiver plane bias. + //! This uses partial derivatives to reduce shadow acne when using large pcf kernels. + bool m_receiverPlaneBiasEnabled = true; + bool IsSplitManual() const; bool IsSplitAutomatic() const; bool IsCascadeCorrectionDisabled() const; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp index 86fb97aeba..24ce566fb4 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp @@ -21,7 +21,7 @@ namespace AZ if (auto* serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(7) + ->Version(8) ->Field("Color", &DirectionalLightComponentConfig::m_color) ->Field("IntensityMode", &DirectionalLightComponentConfig::m_intensityMode) ->Field("Intensity", &DirectionalLightComponentConfig::m_intensity) @@ -41,7 +41,7 @@ namespace AZ ->Field("PcfPredictionSampleCount", &DirectionalLightComponentConfig::m_predictionSampleCount) ->Field("PcfFilteringSampleCount", &DirectionalLightComponentConfig::m_filteringSampleCount) ->Field("Pcf Method", &DirectionalLightComponentConfig::m_pcfMethod) - ; + ->Field("ShadowReceiverPlaneBiasEnabled", &DirectionalLightComponentConfig::m_receiverPlaneBiasEnabled); } } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp index 642e50d104..6bf449803b 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp @@ -88,6 +88,8 @@ namespace AZ ->Event("SetFilteringSampleCount", &DirectionalLightRequestBus::Events::SetFilteringSampleCount) ->Event("GetPcfMethod", &DirectionalLightRequestBus::Events::GetPcfMethod) ->Event("SetPcfMethod", &DirectionalLightRequestBus::Events::SetPcfMethod) + ->Event("GetShadowReceiverPlaneBiasEnabled", &DirectionalLightRequestBus::Events::GetShadowReceiverPlaneBiasEnabled) + ->Event("SetShadowReceiverPlaneBiasEnabled", &DirectionalLightRequestBus::Events::SetShadowReceiverPlaneBiasEnabled) ->VirtualProperty("Color", "GetColor", "SetColor") ->VirtualProperty("Intensity", "GetIntensity", "SetIntensity") ->VirtualProperty("AngularDiameter", "GetAngularDiameter", "SetAngularDiameter") @@ -104,7 +106,8 @@ namespace AZ ->VirtualProperty("SofteningBoundaryWidth", "GetSofteningBoundaryWidth", "SetSofteningBoundaryWidth") ->VirtualProperty("PredictionSampleCount", "GetPredictionSampleCount", "SetPredictionSampleCount") ->VirtualProperty("FilteringSampleCount", "GetFilteringSampleCount", "SetFilteringSampleCount") - ->VirtualProperty("PcfMethod", "GetPcfMethod", "SetPcfMethod"); + ->VirtualProperty("PcfMethod", "GetPcfMethod", "SetPcfMethod") + ->VirtualProperty("ShadowReceiverPlaneBiasEnabled", "GetShadowReceiverPlaneBiasEnabled", "SetShadowReceiverPlaneBiasEnabled"); ; } } @@ -539,6 +542,7 @@ namespace AZ SetPredictionSampleCount(m_configuration.m_predictionSampleCount); SetFilteringSampleCount(m_configuration.m_filteringSampleCount); SetPcfMethod(m_configuration.m_pcfMethod); + SetShadowReceiverPlaneBiasEnabled(m_configuration.m_receiverPlaneBiasEnabled); // [GFX TODO][ATOM-1726] share config for multiple light (e.g., light ID). // [GFX TODO][ATOM-2416] adapt to multiple viewports. @@ -637,6 +641,17 @@ namespace AZ m_configuration.m_pcfMethod = method; m_featureProcessor->SetPcfMethod(m_lightHandle, method); } - + + bool DirectionalLightComponentController::GetShadowReceiverPlaneBiasEnabled() const + { + return m_configuration.m_receiverPlaneBiasEnabled; + } + + void DirectionalLightComponentController::SetShadowReceiverPlaneBiasEnabled(bool enable) + { + m_configuration.m_receiverPlaneBiasEnabled = enable; + m_featureProcessor->SetShadowReceiverPlaneBiasEnabled(m_lightHandle, enable); + } + } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h index 4684852ff1..6b788c241c 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h @@ -84,6 +84,8 @@ namespace AZ void SetFilteringSampleCount(uint32_t count) override; PcfMethod GetPcfMethod() const override; void SetPcfMethod(PcfMethod method) override; + bool GetShadowReceiverPlaneBiasEnabled() const override; + void SetShadowReceiverPlaneBiasEnabled(bool enable) override; private: friend class EditorDirectionalLightComponent; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp index 9f0e06f203..18d9ad70e0 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp @@ -164,9 +164,13 @@ namespace AZ ->EnumAttribute(PcfMethod::Bicubic, "Bicubic") ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary search") ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) - ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsShadowPcfDisabled); - ; - + ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsShadowPcfDisabled) + ->DataElement( + Edit::UIHandlers::CheckBox, &DirectionalLightComponentConfig::m_receiverPlaneBiasEnabled, + "Shadow Receiver Plane Bias Enable", + "This reduces shadow acne when using large pcf kernels.") + ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) + ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsShadowPcfDisabled); } } From ce962415d226e026d651c9af3fc6ff9af672a138 Mon Sep 17 00:00:00 2001 From: evanchia Date: Mon, 30 Aug 2021 14:20:51 -0700 Subject: [PATCH 025/355] Moving fixed smoke test from sandbox to smoke suite Signed-off-by: evanchia --- .../Gem/PythonTests/smoke/CMakeLists.txt | 12 ------------ .../smoke/test_RemoteConsole_CPULoadLevel_Works.py | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt index 5374b0d318..3fc4f3db0e 100644 --- a/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/smoke/CMakeLists.txt @@ -73,17 +73,5 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) AutomatedTesting.GameLauncher AutomatedTesting.Assets ) - ly_add_pytest( - NAME AutomatedTesting::LoadLevelCPU - TEST_SUITE sandbox - PATH ${CMAKE_CURRENT_LIST_DIR}/test_RemoteConsole_CPULoadLevel_Works.py - TIMEOUT 100 - RUNTIME_DEPENDENCIES - AZ::AssetProcessor - AZ::PythonBindingsExample - Legacy::Editor - AutomatedTesting.GameLauncher - AutomatedTesting.Assets - ) endif() diff --git a/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py b/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py index 701dcfab10..6522514f2f 100644 --- a/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py +++ b/AutomatedTesting/Gem/PythonTests/smoke/test_RemoteConsole_CPULoadLevel_Works.py @@ -24,7 +24,7 @@ from ly_remote_console.remote_console_commands import ( @pytest.mark.parametrize("launcher_platform", ["windows"]) @pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("level", ["Simple"]) -@pytest.mark.SUITE_sandbox +@pytest.mark.SUITE_smoke class TestRemoteConsoleLoadLevelWorks(object): @pytest.fixture def remote_console_instance(self, request): From cdcdcb0777f3836615f36b7719fdb5433b6d558f Mon Sep 17 00:00:00 2001 From: AMZN-nggieber <52797929+AMZN-nggieber@users.noreply.github.com> Date: Mon, 30 Aug 2021 14:22:17 -0700 Subject: [PATCH 026/355] Remove Tab Overlay on Project Manager Startup + More Fixes (#3666) * Refocuses from tab to button on projects screen fist time it is opened Signed-off-by: nggieber * Adds border highlighting to big buttons when they are focused Signed-off-by: nggieber * Fixes issues where project buttons aren't found or deleted on projects screen Signed-off-by: nggieber * Adds tooltip to project name showing project path Signed-off-by: nggieber --- .../Resources/ProjectManager.qss | 13 ++++++--- .../Source/ProjectButtonWidget.cpp | 1 + .../ProjectManager/Source/ProjectsScreen.cpp | 27 +++++++++++++------ .../Tools/ProjectManager/Source/ScreensCtrl.h | 2 +- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Code/Tools/ProjectManager/Resources/ProjectManager.qss b/Code/Tools/ProjectManager/Resources/ProjectManager.qss index 1bd261da00..a45a79dcfc 100644 --- a/Code/Tools/ProjectManager/Resources/ProjectManager.qss +++ b/Code/Tools/ProjectManager/Resources/ProjectManager.qss @@ -213,6 +213,10 @@ QTabBar::tab:focus { stop: 0 #555555, stop: 1.0 #777777); } +#horizontalSeparatingLine { + color: #666666; +} + /************** Project Settings **************/ #projectSettings { margin-top:42px; @@ -293,8 +297,6 @@ QTabBar::tab:focus { border:none; } - - #projectSettingsTab::tab-bar { left: 60px; } @@ -360,6 +362,10 @@ QTabBar::tab:focus { color: #1e70eb; } +#firstTimeContent > QPushButton:focus { + border: 1px solid #1e70eb; +} + #firstTimeContent > QPushButton:pressed { border: 1px solid #0e60eb; color: #0e60eb; @@ -400,7 +406,8 @@ QTabBar::tab:focus { } #projectButton > #labelButton:hover, -#projectButton > #labelButton:pressed { +#projectButton > #labelButton:pressed, +#projectButton > #labelButton:focus { border:1px solid #1e70eb; } diff --git a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp index 5bae3b807a..0f51524341 100644 --- a/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectButtonWidget.cpp @@ -192,6 +192,7 @@ namespace O3DE::ProjectManager projectFooter->setLayout(hLayout); { QLabel* projectNameLabel = new QLabel(m_projectInfo.GetProjectDisplayName(), this); + projectNameLabel->setToolTip(m_projectInfo.m_path); hLayout->addWidget(projectNameLabel); QMenu* menu = new QMenu(this); diff --git a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp index aa231afef2..81d4047db5 100644 --- a/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectsScreen.cpp @@ -65,6 +65,16 @@ namespace O3DE::ProjectManager vLayout->addWidget(m_stack); connect(reinterpret_cast(parent), &ScreensCtrl::NotifyBuildProject, this, &ProjectsScreen::SuggestBuildProject); + + // Will focus whatever button it finds so the Project tab is not focused on start-up + QTimer::singleShot(0, this, [this] + { + QPushButton* foundButton = m_stack->currentWidget()->findChild(); + if (foundButton) + { + foundButton->setFocus(); + } + }); } ProjectsScreen::~ProjectsScreen() @@ -166,7 +176,7 @@ namespace O3DE::ProjectManager ProjectButton* ProjectsScreen::CreateProjectButton(const ProjectInfo& project) { ProjectButton* projectButton = new ProjectButton(project, this); - m_projectButtons.insert(project.m_path, projectButton); + m_projectButtons.insert(QDir::toNativeSeparators(project.m_path), projectButton); m_projectsFlowLayout->addWidget(projectButton); connect(projectButton, &ProjectButton::OpenProject, this, &ProjectsScreen::HandleOpenProject); @@ -193,7 +203,7 @@ namespace O3DE::ProjectManager QSet keepProject; for (const ProjectInfo& project : projectsVector) { - keepProject.insert(project.m_path); + keepProject.insert(QDir::toNativeSeparators(project.m_path)); } // Clear flow and delete buttons for removed projects @@ -204,6 +214,7 @@ namespace O3DE::ProjectManager if (!keepProject.contains(projectButtonsIter.key())) { + projectButtonsIter.value()->deleteLater(); projectButtonsIter = m_projectButtons.erase(projectButtonsIter); } else @@ -215,7 +226,7 @@ namespace O3DE::ProjectManager QString buildProjectPath = ""; if (m_currentBuilder) { - buildProjectPath = m_currentBuilder->GetProjectInfo().m_path; + buildProjectPath = QDir::toNativeSeparators(m_currentBuilder->GetProjectInfo().m_path); } // Put currently building project in front, then queued projects, then sorts alphabetically @@ -249,13 +260,13 @@ namespace O3DE::ProjectManager // Add any missing project buttons and restore buttons to default state for (const ProjectInfo& project : projectsVector) { - if (!m_projectButtons.contains(project.m_path)) + if (!m_projectButtons.contains(QDir::toNativeSeparators(project.m_path))) { - m_projectButtons.insert(project.m_path, CreateProjectButton(project)); + m_projectButtons.insert(QDir::toNativeSeparators(project.m_path), CreateProjectButton(project)); } else { - auto projectButtonIter = m_projectButtons.find(project.m_path); + auto projectButtonIter = m_projectButtons.find(QDir::toNativeSeparators(project.m_path)); if (projectButtonIter != m_projectButtons.end()) { projectButtonIter.value()->RestoreDefaultState(); @@ -273,7 +284,7 @@ namespace O3DE::ProjectManager for (const ProjectInfo& project : m_buildQueue) { - auto projectIter = m_projectButtons.find(project.m_path); + auto projectIter = m_projectButtons.find(QDir::toNativeSeparators(project.m_path)); if (projectIter != m_projectButtons.end()) { projectIter.value()->SetProjectButtonAction( @@ -288,7 +299,7 @@ namespace O3DE::ProjectManager for (const ProjectInfo& project : m_requiresBuild) { - auto projectIter = m_projectButtons.find(project.m_path); + auto projectIter = m_projectButtons.find(QDir::toNativeSeparators(project.m_path)); if (projectIter != m_projectButtons.end()) { if (project.m_buildFailed) diff --git a/Code/Tools/ProjectManager/Source/ScreensCtrl.h b/Code/Tools/ProjectManager/Source/ScreensCtrl.h index f046adbe78..7132d64dd0 100644 --- a/Code/Tools/ProjectManager/Source/ScreensCtrl.h +++ b/Code/Tools/ProjectManager/Source/ScreensCtrl.h @@ -19,7 +19,7 @@ QT_FORWARD_DECLARE_CLASS(QTabWidget) namespace O3DE::ProjectManager { - class ScreenWidget; + QT_FORWARD_DECLARE_CLASS(ScreenWidget); class ScreensCtrl : public QWidget From 862df096dbbebfde51de6dd34289bfa86d02ac5d Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Mon, 30 Aug 2021 14:33:01 -0700 Subject: [PATCH 027/355] Add file information to Version; improve Method deserialization warnings; add SC unit test content to builders Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Tools/UpgradeTool/VersionExplorer.cpp | 12 ++++---- .../Code/Include/ScriptCanvas/Core/Core.cpp | 2 ++ .../Code/Include/ScriptCanvas/Core/Core.h | 22 ++++++++++---- .../ScriptCanvas/Libraries/Core/Method.cpp | 29 +++++++++++++++++-- Gems/ScriptCanvasTesting/Code/CMakeLists.txt | 1 + 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index a7dbac759e..1a952262c4 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -674,6 +674,9 @@ namespace ScriptCanvasEditor void VersionExplorer::InspectAsset(AZ::Data::Asset& asset, AZ::Data::AssetInfo& assetInfo) { + ++m_inspectedAssets; + ++m_currentAssetIndex; + Log("InspectAsset: %s", asset.GetHint().c_str()); AZ::Entity* scriptCanvasEntity = nullptr; if (asset.GetType() == azrtti_typeid()) @@ -694,10 +697,9 @@ namespace ScriptCanvasEditor bool onlyShowOutdatedGraphs = m_ui->onlyShowOutdated->isChecked(); bool forceUpgrade = m_ui->forceUpgrade->isChecked(); - + if (!forceUpgrade && onlyShowOutdatedGraphs && graphComponent->GetVersion().IsLatest()) { - ++m_currentAssetIndex; ScanComplete(asset); Log("InspectAsset: %s, is at latest", asset.GetHint().c_str()); return; @@ -754,15 +756,11 @@ namespace ScriptCanvasEditor } QString absolutePath = QDir(watchFolder.c_str()).absoluteFilePath(info.m_relativePath.c_str()); - connect(browseButton, &QPushButton::clicked, [absolutePath] { AzQtComponents::ShowFileOnDesktop(absolutePath); }); + m_ui->tableWidget->setCellWidget(static_cast(m_inspectedAssets), static_cast(ColumnBrowse), browseButton); - - ++m_inspectedAssets; - ++m_currentAssetIndex; - ScanComplete(asset); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp index a5e73005c1..6e2cf87af4 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp @@ -139,6 +139,7 @@ namespace ScriptCanvas serializeContext->Class() ->Field("_grammarVersion", &VersionData::grammarVersion) ->Field("_runtimeVersion", &VersionData::runtimeVersion) + ->Field("_fileVersion", &VersionData::fileVersion) ; } } @@ -154,5 +155,6 @@ namespace ScriptCanvas { grammarVersion = GrammarVersion::Current; runtimeVersion = RuntimeVersion::Current; + fileVersion = FileVersion::Current; } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h index 03bcb8450f..a1fa8c3d0b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h @@ -71,6 +71,13 @@ namespace ScriptCanvas using NodePtrList = AZStd::vector; using NodePtrConstList = AZStd::vector; + enum class PropertyStatus : AZ::u8 + { + Getter, + None, + Setter, + }; + enum class GrammarVersion : int { Initial = -1, @@ -89,11 +96,13 @@ namespace ScriptCanvas Current, }; - enum class PropertyStatus : AZ::u8 + enum class FileVersion : int { - Getter, - None, - Setter, + Initial = -1, + JSON = 0, + + // add new entries above + Current, }; struct VersionData @@ -106,10 +115,13 @@ namespace ScriptCanvas GrammarVersion grammarVersion = GrammarVersion::Initial; RuntimeVersion runtimeVersion = RuntimeVersion::Initial; + FileVersion fileVersion = FileVersion::Initial; bool operator == (const VersionData& rhs) const { - return grammarVersion == rhs.grammarVersion && runtimeVersion == rhs.runtimeVersion; + return grammarVersion == rhs.grammarVersion + && runtimeVersion == rhs.runtimeVersion + && fileVersion == rhs.fileVersion; } bool IsLatest() const diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp index eb1ee501a9..793224fd86 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp @@ -681,6 +681,13 @@ namespace ScriptCanvas outType = eventType; return true; } + + AZ_Warning("Script Canvas" + , !m_warnOnMissingFunction + , "Could not find event: %s, in bus: %s, anywhere in BehaviorContext" + , methodName.c_str() + , m_className.c_str()); + return false; } break; @@ -693,6 +700,12 @@ namespace ScriptCanvas outType = EventType::Count; return true; } + + AZ_Warning("Script Canvas" + , !m_warnOnMissingFunction + , "Could not find free method: %s anywhere in BehaviorContext" + , methodName.c_str()); + return false; } break; @@ -709,15 +722,27 @@ namespace ScriptCanvas outType = EventType::Count; return true; } + + AZ_Warning("Script Canvas" + , !m_warnOnMissingFunction + , "Could not find method or property: %s in class %s: , anywhere in BehaviorContext" + , methodName.c_str() + , m_className.c_str()); + return false; } break; - default: - AZ_Warning("Script Canvas", !m_warnOnMissingFunction, "unsupported method type in method"); + default: break; } } + AZ_Warning("Script Canvas" + , !m_warnOnMissingFunction + , "Could not find overloaded method: %s, class or event name: %s, anywhere in BehaviorContext" + , methodName.c_str() + , m_className.c_str()); + return false; } diff --git a/Gems/ScriptCanvasTesting/Code/CMakeLists.txt b/Gems/ScriptCanvasTesting/Code/CMakeLists.txt index 29360912d8..499bb84c2d 100644 --- a/Gems/ScriptCanvasTesting/Code/CMakeLists.txt +++ b/Gems/ScriptCanvasTesting/Code/CMakeLists.txt @@ -77,6 +77,7 @@ ly_add_target( # By default, the above module is used only in tools: ly_create_alias(NAME ScriptCanvasTesting.Tools NAMESPACE Gem TARGETS Gem::ScriptCanvasTesting.Editor) +ly_create_alias(NAME ScriptCanvasTesting.Builders NAMESPACE Gem TARGETS Gem::ScriptCanvasTesting.Editor) ################################################################################ # Tests From a7309cf2eb5fd4c39731a32fae8b6b68dee99205 Mon Sep 17 00:00:00 2001 From: jiaweig <51759646+jiaweig-amzn@users.noreply.github.com> Date: Mon, 30 Aug 2021 14:57:46 -0700 Subject: [PATCH 028/355] ATOM-16346 Change Atom setreg path (#3690) * Changed path Amazon to O3DE. Fixed issues that setreg is not loaded in game launchers. Signed-off-by: jiaweig * Add brackets. Signed-off-by: jiaweig --- .../Application/GameApplication.cpp | 6 +++++ .../RHI.Reflect/PlatformLimitsDescriptor.h | 2 +- .../RHI.Reflect/PlatformLimitsDescriptor.cpp | 2 +- Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp | 2 +- .../DX12/PlatformLimitsDescriptor.h | 2 ++ .../RHI.Reflect/PlatformLimitsDescriptor.cpp | 23 +++++++++++++++++++ .../Registry/PhysicalDeviceDriverInfo.setreg | 2 +- .../Platform/Android/PlatformLimits.setreg | 2 +- .../Platform/Linux/PlatformLimits.setreg | 2 +- .../Platform/Mac/PlatformLimits.setreg | 2 +- .../Platform/Windows/PlatformLimits.setreg | 2 +- .../Platform/iOS/PlatformLimits.setreg | 2 +- 12 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp b/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp index b4d61d7ac1..c42720311c 100644 --- a/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp +++ b/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp @@ -55,6 +55,12 @@ namespace AzGameFramework AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_TargetBuildDependencyRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); +#if AZ_TRAIT_OS_IS_HOST_OS_PLATFORM && (defined (AZ_DEBUG_BUILD) || defined(AZ_PROFILE_BUILD)) + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_EngineRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_GemRegistries(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); +#endif + // Used the lowercase the platform name since the bootstrap.game...setreg is being loaded // from the asset cache root where all the files are in lowercased from regardless of the filesystem case-sensitivity static constexpr char filename[] = "bootstrap.game." AZ_BUILD_CONFIGURATION_TYPE "." AZ_TRAIT_OS_PLATFORM_CODENAME_LOWER ".setreg"; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PlatformLimitsDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PlatformLimitsDescriptor.h index 2d85420694..a239242b33 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PlatformLimitsDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI.Reflect/PlatformLimitsDescriptor.h @@ -68,7 +68,7 @@ namespace AZ HeapMemoryHintParameters m_usageHintParameters; HeapAllocationStrategy m_heapAllocationStrategy = HeapAllocationStrategy::MemoryHint; - void LoadPlatformLimitsDescriptor(const char* rhiName); + virtual void LoadPlatformLimitsDescriptor(const char* rhiName); }; class PlatformLimits final diff --git a/Gems/Atom/RHI/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp b/Gems/Atom/RHI/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp index 250f03716d..eaaefe6065 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp @@ -77,7 +77,7 @@ namespace AZ void PlatformLimitsDescriptor::LoadPlatformLimitsDescriptor(const char* rhiName) { auto settingsRegistry = AZ::SettingsRegistry::Get(); - AZStd::string platformLimitsRegPath = AZStd::string::format("/Amazon/Atom/RHI/PlatformLimits/%s", rhiName); + AZStd::string platformLimitsRegPath = AZStd::string::format("/O3DE/Atom/RHI/PlatformLimits/%s", rhiName); if (!(settingsRegistry && settingsRegistry->GetObject(this, azrtti_typeid(this), platformLimitsRegPath.c_str()))) { diff --git a/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp b/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp index b03cb34140..a381209d2b 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/RHISystem.cpp @@ -147,7 +147,7 @@ namespace AZ // Some GPU drivers have known issues and it is recommended to update or use other versions. auto settingsRegistry = AZ::SettingsRegistry::Get(); PhysicalDeviceDriverValidator physicalDriverValidator; - if (!(settingsRegistry && settingsRegistry->GetObject(physicalDriverValidator, "/Amazon/Atom/RHI/PhysicalDeviceDriverInfo"))) + if (!(settingsRegistry && settingsRegistry->GetObject(physicalDriverValidator, "/O3DE/Atom/RHI/PhysicalDeviceDriverInfo"))) { AZ_Printf("RHISystem", "Failed to get settings registry for GPU driver Info."); } diff --git a/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/PlatformLimitsDescriptor.h b/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/PlatformLimitsDescriptor.h index cbf1fd11f6..1f22599b38 100644 --- a/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/PlatformLimitsDescriptor.h +++ b/Gems/Atom/RHI/DX12/Code/Include/Atom/RHI.Reflect/DX12/PlatformLimitsDescriptor.h @@ -65,6 +65,8 @@ namespace AZ AZStd::unordered_map> m_descriptorHeapLimits; FrameGraphExecuterData m_frameGraphExecuterData; + + void LoadPlatformLimitsDescriptor(const char* rhiName) override; }; } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp index 980264aa9b..77b41d6ffc 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI.Reflect/PlatformLimitsDescriptor.cpp @@ -7,6 +7,7 @@ */ #include #include +#include namespace AZ { @@ -39,5 +40,27 @@ namespace AZ ; } } + + void PlatformLimitsDescriptor::LoadPlatformLimitsDescriptor(const char* rhiName) + { + auto settingsRegistry = AZ::SettingsRegistry::Get(); + AZStd::string platformLimitsRegPath = AZStd::string::format("/O3DE/Atom/RHI/PlatformLimits/%s", rhiName); + if (!(settingsRegistry && settingsRegistry->GetObject(this, azrtti_typeid(this), platformLimitsRegPath.c_str()))) + { + AZ_Warning( + "Device", false, "Platform limits for %s %s is not loaded correctly. Will use default values.", + AZ_TRAIT_OS_PLATFORM_NAME, rhiName); + + // Map default value must be initialized after attempting to serialize (and result in failure). + // Otherwise, serialization won't overwrite the default values. + m_descriptorHeapLimits = AZStd::unordered_map>({ + { AZStd::string("DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV"), { 1000000, 1000000 } }, + { AZStd::string("DESCRIPTOR_HEAP_TYPE_SAMPLER"), { 2048, 2048 } }, + { AZStd::string("DESCRIPTOR_HEAP_TYPE_RTV"), { 2048, 0 } }, + { AZStd::string("DESCRIPTOR_HEAP_TYPE_DSV"), { 2048, 0 } } + }); + } + + } } } diff --git a/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg b/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg index 823b9e5fcd..ecb2a0fb54 100644 --- a/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg +++ b/Gems/Atom/RHI/Registry/PhysicalDeviceDriverInfo.setreg @@ -8,7 +8,7 @@ // { - "Amazon": + "O3DE": { "Atom": { diff --git a/Gems/Atom/RHI/Registry/Platform/Android/PlatformLimits.setreg b/Gems/Atom/RHI/Registry/Platform/Android/PlatformLimits.setreg index 6ce3c88bbb..683098138f 100644 --- a/Gems/Atom/RHI/Registry/Platform/Android/PlatformLimits.setreg +++ b/Gems/Atom/RHI/Registry/Platform/Android/PlatformLimits.setreg @@ -8,7 +8,7 @@ // { - "Amazon": + "O3DE": { "Atom": { diff --git a/Gems/Atom/RHI/Registry/Platform/Linux/PlatformLimits.setreg b/Gems/Atom/RHI/Registry/Platform/Linux/PlatformLimits.setreg index 7c60aeb098..ce1e65fb40 100644 --- a/Gems/Atom/RHI/Registry/Platform/Linux/PlatformLimits.setreg +++ b/Gems/Atom/RHI/Registry/Platform/Linux/PlatformLimits.setreg @@ -8,7 +8,7 @@ // { - "Amazon": + "O3DE": { "Atom": { diff --git a/Gems/Atom/RHI/Registry/Platform/Mac/PlatformLimits.setreg b/Gems/Atom/RHI/Registry/Platform/Mac/PlatformLimits.setreg index 508287b762..b16e72b625 100644 --- a/Gems/Atom/RHI/Registry/Platform/Mac/PlatformLimits.setreg +++ b/Gems/Atom/RHI/Registry/Platform/Mac/PlatformLimits.setreg @@ -8,7 +8,7 @@ // { - "Amazon": + "O3DE": { "Atom": { diff --git a/Gems/Atom/RHI/Registry/Platform/Windows/PlatformLimits.setreg b/Gems/Atom/RHI/Registry/Platform/Windows/PlatformLimits.setreg index dd1273953b..240f8b041c 100644 --- a/Gems/Atom/RHI/Registry/Platform/Windows/PlatformLimits.setreg +++ b/Gems/Atom/RHI/Registry/Platform/Windows/PlatformLimits.setreg @@ -8,7 +8,7 @@ // { - "Amazon": + "O3DE": { "Atom": { diff --git a/Gems/Atom/RHI/Registry/Platform/iOS/PlatformLimits.setreg b/Gems/Atom/RHI/Registry/Platform/iOS/PlatformLimits.setreg index 508287b762..b16e72b625 100644 --- a/Gems/Atom/RHI/Registry/Platform/iOS/PlatformLimits.setreg +++ b/Gems/Atom/RHI/Registry/Platform/iOS/PlatformLimits.setreg @@ -8,7 +8,7 @@ // { - "Amazon": + "O3DE": { "Atom": { From e8fa1dca58dd0f238cf3178e0432850212e9b745 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 15:21:13 -0700 Subject: [PATCH 029/355] Improves runtime dependencies input dependency (#3665) Changes how runtime dependencies are hooked as dependencies to create depenedencies to the inputs This makes it that if an input to the runtime dependencies changes, it gets re-copied (e.g. a 3rdParty changes or a file added through ly_add_target_files) Closes Issue #3391 Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzFramework/IO/LocalFileIO.cpp | 21 +++++----- .../Code/Tests/TestFramework/AWSCoreFixture.h | 1 + cmake/LYWrappers.cmake | 39 +++++++++++++++++-- cmake/LyAutoGen.cmake | 2 +- cmake/Platform/Common/Install_common.cmake | 3 +- .../Common/RuntimeDependencies_common.cmake | 20 +++++++--- .../runtime_dependencies_common.cmake.in | 2 + 7 files changed, 67 insertions(+), 21 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp index 076cce4965..aca7a41950 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp @@ -673,18 +673,17 @@ namespace AZ { AZ_Assert(path && path[0] != '%', "%% is deprecated, @ is the only valid alias token"); AZStd::string_view pathView(path); - AZStd::string_view aliasKey; - AZStd::string_view aliasValue; - for (const auto& alias : m_aliases) - { - AZStd::string_view key{ alias.first }; - if (AZ::StringFunc::StartsWith(pathView, key)) // we only support aliases at the front of the path + + const auto found = AZStd::find_if(m_aliases.begin(), m_aliases.end(), + [pathView](const auto& alias) { - aliasKey = key; - aliasValue = alias.second; - break; - } - } + return pathView.starts_with(alias.first); + }); + + using string_view_pair = AZStd::pair; + auto [aliasKey, aliasValue] = (found != m_aliases.end()) ? string_view_pair(*found) + : string_view_pair{}; + size_t requiredResolvedPathSize = pathView.size() - aliasKey.size() + aliasValue.size() + 1; AZ_Assert(path != resolvedPath && resolvedPathSize >= requiredResolvedPathSize, "Resolved path is incorrect"); // we assert above, but we also need to properly handle the case when the resolvedPath buffer size diff --git a/Gems/AWSCore/Code/Tests/TestFramework/AWSCoreFixture.h b/Gems/AWSCore/Code/Tests/TestFramework/AWSCoreFixture.h index 9d33d96215..a5c2bf6475 100644 --- a/Gems/AWSCore/Code/Tests/TestFramework/AWSCoreFixture.h +++ b/Gems/AWSCore/Code/Tests/TestFramework/AWSCoreFixture.h @@ -132,6 +132,7 @@ public: AZ::IO::FileIOBase::SetInstance(nullptr); delete m_localFileIO; + m_localFileIO = nullptr; if (m_otherFileIO) { diff --git a/cmake/LYWrappers.cmake b/cmake/LYWrappers.cmake index 1a8e805f91..3dfef0bbbf 100644 --- a/cmake/LYWrappers.cmake +++ b/cmake/LYWrappers.cmake @@ -29,6 +29,20 @@ define_property(TARGET PROPERTY GEM_MODULE ]] ) +define_property(TARGET PROPERTY RUNTIME_DEPENDENCIES_DEPENDS + BRIEF_DOCS "Defines the dependencies the runtime dependencies of a target has" + FULL_DOCS [[ + Property which is queried through generator expressions at the moment + the target is declared so a custom command that will do the copies can + be generated later. Custom commands need to be declared in the same folder + the target is declared, however, runtime dependencies need all targets + to be declared, so it is done towards the end of CMake parsing. When + runtime dependencies are processed, this target property is filled so the + right dependencies are set for the custom command. + This property contains all the files that are going to be copied to the output + when the target gets built. + ]] +) #! ly_add_target: adds a target and provides parameters for the common configurations. # @@ -310,16 +324,35 @@ function(ly_add_target) set_property(GLOBAL APPEND PROPERTY LY_ALL_TARGET_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}) endif() + # Custom commands need to be declared in the same folder as the target that they use. + # Not all the targets will require runtime dependencies, but we will generate at least an + # empty file for them. set(runtime_dependencies_list SHARED MODULE EXECUTABLE APPLICATION) if(NOT ly_add_target_IMPORTED AND linking_options IN_LIST runtime_dependencies_list) - add_custom_command(TARGET ${ly_add_target_NAME} POST_BUILD + # the stamp file will be the one that triggers the execution of the custom rule. At the end + # of running the copy of runtime dependencies, the stamp file is touched so the timestamp is updated. + # Adding a config as part of the name since the stamp file is added to the VS project. + # Note the STAMP_OUTPUT_FILE need to match with the one used in runtime dependencies (e.g. RuntimeDependencies_common.cmake) + set(STAMP_OUTPUT_FILE ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}_$.stamp) + add_custom_command( + OUTPUT ${STAMP_OUTPUT_FILE} + DEPENDS "$>" COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}.cmake - DEPENDS ${CMAKE_BINARY_DIR}/runtime_dependencies/${ly_add_target_NAME}.cmake - MESSAGE "Copying runtime dependencies..." + COMMENT "Copying ${ly_add_target_NAME} runtime dependencies to output..." VERBATIM ) + # Unfortunately the VS generator cannot deal with generation expressions as part of the file name, wrapping the + # stamp file on each configuration so it gets properly excluded by the generator + unset(stamp_files_per_config) + foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) + set(stamp_file_conf ${CMAKE_BINARY_DIR}/runtime_dependencies/${conf}/${ly_add_target_NAME}_${conf}.stamp) + set_source_files_properties(${stamp_file_conf} PROPERTIES GENERATED TRUE SKIP_AUTOGEN TRUE) + list(APPEND stamp_files_per_config $<$:${stamp_file_conf}>) + endforeach() + target_sources(${ly_add_target_NAME} PRIVATE ${stamp_files_per_config}) + endif() if(ly_add_target_AUTOGEN_RULES) diff --git a/cmake/LyAutoGen.cmake b/cmake/LyAutoGen.cmake index 4aec0f9726..2f5891d837 100644 --- a/cmake/LyAutoGen.cmake +++ b/cmake/LyAutoGen.cmake @@ -34,8 +34,8 @@ function(ly_add_autogen) add_custom_command( OUTPUT ${AUTOGEN_OUTPUTS} DEPENDS ${AZCG_DEPENDENCIES} - COMMAND ${CMAKE_COMMAND} -E echo "Running AutoGen for ${ly_add_autogen_NAME}" COMMAND ${LY_PYTHON_CMD} "${LY_ROOT_FOLDER}/cmake/AzAutoGen.py" "${CMAKE_BINARY_DIR}/Azcg/TemplateCache/" "${CMAKE_CURRENT_BINARY_DIR}/Azcg/Generated/" "${CMAKE_CURRENT_SOURCE_DIR}" "${AZCG_INPUTFILES}" "${ly_add_autogen_AUTOGEN_RULES}" + COMMENT "Running AutoGen for ${ly_add_autogen_NAME}" VERBATIM ) set_target_properties(${ly_add_autogen_NAME} PROPERTIES AUTOGEN_INPUT_FILES "${AZCG_INPUTFILES}") diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index bee2349e75..0bd598f70e 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -486,7 +486,8 @@ endfunction()" ly_get_runtime_dependencies(runtime_dependencies ${target}) foreach(runtime_dependency ${runtime_dependencies}) unset(runtime_command) - ly_get_runtime_dependency_command(runtime_command ${runtime_dependency}) + unset(runtime_depend) # unused, but required to be passed to ly_get_runtime_dependency_command + ly_get_runtime_dependency_command(runtime_command runtime_depend ${runtime_dependency}) string(CONFIGURE "${runtime_command}" runtime_command @ONLY) list(APPEND runtime_commands ${runtime_command}) endforeach() diff --git a/cmake/Platform/Common/RuntimeDependencies_common.cmake b/cmake/Platform/Common/RuntimeDependencies_common.cmake index a669602ff7..dbc8513c97 100644 --- a/cmake/Platform/Common/RuntimeDependencies_common.cmake +++ b/cmake/Platform/Common/RuntimeDependencies_common.cmake @@ -113,7 +113,7 @@ function(ly_get_runtime_dependencies ly_RUNTIME_DEPENDENCIES ly_TARGET) unset(target_locations) get_target_property(target_locations ${ly_TARGET} ${imported_property}) if(target_locations) - list(APPEND all_runtime_dependencies ${target_locations}) + list(APPEND all_runtime_dependencies "${target_locations}") else() # Check if the property exists for configurations unset(target_locations) @@ -156,7 +156,7 @@ function(ly_get_runtime_dependencies ly_RUNTIME_DEPENDENCIES ly_TARGET) endfunction() -function(ly_get_runtime_dependency_command ly_RUNTIME_COMMAND ly_TARGET) +function(ly_get_runtime_dependency_command ly_RUNTIME_COMMAND ly_RUNTIME_DEPEND ly_TARGET) # To optimize this, we are going to cache the commands for the targets we requested. A lot of targets end up being # dependencies of other targets. @@ -166,6 +166,8 @@ function(ly_get_runtime_dependency_command ly_RUNTIME_COMMAND ly_TARGET) # We already walked through this target get_property(cached_command GLOBAL PROPERTY LY_RUNTIME_DEPENDENCY_COMMAND_${ly_TARGET}) set(${ly_RUNTIME_COMMAND} ${cached_command} PARENT_SCOPE) + get_property(cached_depend GLOBAL PROPERTY LY_RUNTIME_DEPENDENCY_DEPEND_${ly_TARGET}) + set(${ly_RUNTIME_DEPEND} "${cached_depend}" PARENT_SCOPE) return() endif() @@ -223,6 +225,8 @@ function(ly_get_runtime_dependency_command ly_RUNTIME_COMMAND ly_TARGET) set_property(GLOBAL PROPERTY LY_RUNTIME_DEPENDENCY_COMMAND_${ly_TARGET} "${runtime_command}") set(${ly_RUNTIME_COMMAND} ${runtime_command} PARENT_SCOPE) + set_property(GLOBAL PROPERTY LY_RUNTIME_DEPENDENCY_DEPEND_${ly_TARGET} "${source_file}") + set(${ly_RUNTIME_DEPEND} "${source_file}" PARENT_SCOPE) endfunction() @@ -245,17 +249,20 @@ function(ly_delayed_generate_runtime_dependencies) unset(runtime_dependencies) unset(LY_COPY_COMMANDS) + unset(runtime_depends) ly_get_runtime_dependencies(runtime_dependencies ${target}) foreach(runtime_dependency ${runtime_dependencies}) unset(runtime_command) - ly_get_runtime_dependency_command(runtime_command ${runtime_dependency}) + unset(runtime_depend) + ly_get_runtime_dependency_command(runtime_command runtime_depend ${runtime_dependency}) string(APPEND LY_COPY_COMMANDS ${runtime_command}) + list(APPEND runtime_depends ${runtime_depend}) endforeach() - # Generate the output file + # Generate the output file, note the STAMP_OUTPUT_FILE need to match with the one defined in LYWrappers.cmake + set(STAMP_OUTPUT_FILE ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${target}_$.stamp) set(target_file_dir "$") - set(target_file "$") ly_file_read(${LY_RUNTIME_DEPENDENCIES_TEMPLATE} template_file) string(CONFIGURE "${LY_COPY_COMMANDS}" LY_COPY_COMMANDS @ONLY) string(CONFIGURE "${template_file}" configured_template_file @ONLY) @@ -263,6 +270,9 @@ function(ly_delayed_generate_runtime_dependencies) OUTPUT ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${target}.cmake CONTENT "${configured_template_file}" ) + + # set the property that is consumed from the custom command generated in LyWrappers.cmake + set_target_properties(${target} PROPERTIES RUNTIME_DEPENDENCIES_DEPENDS "${runtime_depends}") endforeach() diff --git a/cmake/Platform/Common/runtime_dependencies_common.cmake.in b/cmake/Platform/Common/runtime_dependencies_common.cmake.in index bb280f895b..6e41dbaad1 100644 --- a/cmake/Platform/Common/runtime_dependencies_common.cmake.in +++ b/cmake/Platform/Common/runtime_dependencies_common.cmake.in @@ -22,3 +22,5 @@ function(ly_copy source_file target_directory) endfunction() @LY_COPY_COMMANDS@ + +file(TOUCH @STAMP_OUTPUT_FILE@) From 0e3c4cfb3a49ff8a88083a68971b862754fc32f6 Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Mon, 30 Aug 2021 17:49:19 -0500 Subject: [PATCH 030/355] Updated Terrain Gem Info (#3688) Improved description, removed unused icon, and added documentation link. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> --- Gems/Terrain/gem.json | 8 ++++---- Gems/Terrain/preview.png | 3 --- 2 files changed, 4 insertions(+), 7 deletions(-) delete mode 100644 Gems/Terrain/preview.png diff --git a/Gems/Terrain/gem.json b/Gems/Terrain/gem.json index ccf034d399..c01ea7e534 100644 --- a/Gems/Terrain/gem.json +++ b/Gems/Terrain/gem.json @@ -1,10 +1,10 @@ { "gem_name": "Terrain", - "display_name": "Terrain (WIP)", + "display_name": "Terrain", "license": "Apache-2.0 Or MIT", "origin": "Open 3D Engine - o3de.org", - "summary": "The Terrain Gem is a WIP (work-in-progress) Gem for providing terrain services including authoring workflows, rendering, and physics.", + "summary": "The Terrain Gem is an experimental terrain system. The terrain system maps height, color, and surface data to regions of the world, provides gradient-based and shape-based authoring tools and workflows, includes specialized rendering for efficient display, and integrates with physics for physical simulation.", "canonical_tags": [ "Gem" ], - "user_tags": [ "Environment", "Terrain" ], - "icon_path": "preview.png" + "user_tags": [ "Environment", "Tools", "Design", "Terrain" ], + "documentation_url": "https://o3de.org/docs/user-guide/gems/reference/terrain/" } diff --git a/Gems/Terrain/preview.png b/Gems/Terrain/preview.png deleted file mode 100644 index 2f1ed47754..0000000000 --- a/Gems/Terrain/preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d6204c6730e5675791765ca194e9b1cbec282208e280507de830afc2805e5fa -size 41127 From 0df55c3a7f91d9715407ceb5628bf13f4fdd4944 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:10:08 -0700 Subject: [PATCH 031/355] enabling warn format security and some fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/Util/MemoryBlock.cpp | 2 +- .../Include/AzManipulatorTestFramework/ActionDispatcher.h | 4 ++-- .../Source/RetainedModeActionDispatcher.cpp | 6 +++--- Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp | 4 +--- Code/Legacy/CrySystem/LevelSystem/SpawnableLevelSystem.cpp | 5 +---- Code/Legacy/CrySystem/Log.cpp | 4 ++-- Code/Legacy/CrySystem/SystemCFG.cpp | 2 +- Code/Legacy/CrySystem/XConsole.cpp | 4 ++-- Gems/AssetMemoryAnalyzer/Code/Source/DebugImGUI.cpp | 4 ++-- cmake/Platform/Common/Clang/Configurations_clang.cmake | 1 - 10 files changed, 15 insertions(+), 21 deletions(-) diff --git a/Code/Editor/Util/MemoryBlock.cpp b/Code/Editor/Util/MemoryBlock.cpp index e840a1735e..b7ae017113 100644 --- a/Code/Editor/Util/MemoryBlock.cpp +++ b/Code/Editor/Util/MemoryBlock.cpp @@ -78,7 +78,7 @@ bool CMemoryBlock::Allocate(int size, int uncompressedSize) { QString str; str = QStringLiteral("CMemoryBlock::Allocate failed to allocate %1Mb of Memory").arg(size / (1024 * 1024)); - CryLogAlways(str.toUtf8().data()); + CryLogAlways("%s", str.toUtf8().data()); QMessageBox::critical(QApplication::activeWindow(), QString(), str + QString("\r\nSandbox will try to reduce its working memory set to free memory for this allocation.")); GetIEditor()->ReduceMemory(); diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h index 11ed31e864..523e6a30a7 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h @@ -150,7 +150,7 @@ namespace AzManipulatorTestFramework template DerivedDispatcherT* ActionDispatcher::MouseLButtonDown() { - Log("Mouse left button down"); + Log("%s", "Mouse left button down"); MouseLButtonDownImpl(); return static_cast(this); } @@ -158,7 +158,7 @@ namespace AzManipulatorTestFramework template DerivedDispatcherT* ActionDispatcher::MouseLButtonUp() { - Log("Mouse left button up"); + Log("%s", "Mouse left button up"); MouseLButtonUpImpl(); return static_cast(this); } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp b/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp index ca08142371..8f82bb09b1 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp @@ -24,7 +24,7 @@ namespace AzManipulatorTestFramework { const char* error = "Couldn't add action to sequence, dispatcher is locked (you must call ResetSequence() \ before adding actions to this dispatcher)"; - Log(error); + Log("%s", error); AZ_Assert(false, "Error: %s", error); } @@ -108,7 +108,7 @@ namespace AzManipulatorTestFramework RetainedModeActionDispatcher* RetainedModeActionDispatcher::ResetSequence() { - Log("Resetting the action sequence"); + Log("%s", "Resetting the action sequence"); m_actions.clear(); m_dispatcher.ResetEvent(); m_locked = false; @@ -117,7 +117,7 @@ namespace AzManipulatorTestFramework RetainedModeActionDispatcher* RetainedModeActionDispatcher::Execute() { - Log("Executing %u actions", m_actions.size()); + Log("%s", "Executing %u actions", m_actions.size()); for (auto& action : m_actions) { action(); diff --git a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp index fe87c3f784..d5ef2dd3b8 100644 --- a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp +++ b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp @@ -824,9 +824,7 @@ void CLevelSystem::LogLoadingTime() sChain = " (Chained)"; } - AZStd::string text; - text.format("Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); - gEnv->pLog->Log(text.c_str()); + gEnv->pLog->Log("Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); } void CLevelSystem::GetMemoryUsage(ICrySizer* pSizer) const diff --git a/Code/Legacy/CrySystem/LevelSystem/SpawnableLevelSystem.cpp b/Code/Legacy/CrySystem/LevelSystem/SpawnableLevelSystem.cpp index 72d74ea1c1..a82c4a6914 100644 --- a/Code/Legacy/CrySystem/LevelSystem/SpawnableLevelSystem.cpp +++ b/Code/Legacy/CrySystem/LevelSystem/SpawnableLevelSystem.cpp @@ -468,10 +468,7 @@ namespace LegacyLevelSystem sChain = " (Chained)"; } - AZStd::string text; - text.format( - "Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); - gEnv->pLog->Log(text.c_str()); + gEnv->pLog->Log("Game Level Load Time: [%s] Level %s loaded in %.2f seconds%s", vers, m_lastLevelName.c_str(), m_fLastLevelLoadTime, sChain); } ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CrySystem/Log.cpp b/Code/Legacy/CrySystem/Log.cpp index 68b9621f74..c08d5870e9 100644 --- a/Code/Legacy/CrySystem/Log.cpp +++ b/Code/Legacy/CrySystem/Log.cpp @@ -593,11 +593,11 @@ void CLog::LogPlus(const char* szFormat, ...) if (bfile) { - LogToFilePlus(szTemp); + LogToFilePlus("%s", szTemp); } if (bconsole) { - LogToConsolePlus(szTemp); + LogToConsolePlus("%s", szTemp); } } diff --git a/Code/Legacy/CrySystem/SystemCFG.cpp b/Code/Legacy/CrySystem/SystemCFG.cpp index 0f67fdc2e1..b6b664f62d 100644 --- a/Code/Legacy/CrySystem/SystemCFG.cpp +++ b/Code/Legacy/CrySystem/SystemCFG.cpp @@ -190,7 +190,7 @@ void CSystem::LogVersion() #else strftime(s, 128, "Log Started at %c", today); #endif - CryLogAlways(s); + CryLogAlways("%s", s); CryLogAlways("Built on " __DATE__ " " __TIME__); diff --git a/Code/Legacy/CrySystem/XConsole.cpp b/Code/Legacy/CrySystem/XConsole.cpp index bb8316981a..1677cb06a5 100644 --- a/Code/Legacy/CrySystem/XConsole.cpp +++ b/Code/Legacy/CrySystem/XConsole.cpp @@ -376,12 +376,12 @@ void CXConsole::LogChangeMessage(const char* name, const bool isConst, const boo if (allowChange) { - gEnv->pLog->LogWarning(logMessage.c_str()); + gEnv->pLog->LogWarning("%s", logMessage.c_str()); gEnv->pLog->LogWarning("Modifying marked variables will not be allowed in Release mode!"); } else { - gEnv->pLog->LogError(logMessage.c_str()); + gEnv->pLog->LogError("%s", logMessage.c_str()); } } diff --git a/Gems/AssetMemoryAnalyzer/Code/Source/DebugImGUI.cpp b/Gems/AssetMemoryAnalyzer/Code/Source/DebugImGUI.cpp index aecac5fa34..c9c123cf70 100644 --- a/Gems/AssetMemoryAnalyzer/Code/Source/DebugImGUI.cpp +++ b/Gems/AssetMemoryAnalyzer/Code/Source/DebugImGUI.cpp @@ -200,7 +200,7 @@ namespace AssetMemoryAnalyzer switch (ap->m_codePoint->m_category) { case AllocationCategories::HEAP: - ImGui::Text(FormatUtils::FormatCodePoint(*ap->m_codePoint)); + ImGui::Text("%s", FormatUtils::FormatCodePoint(*ap->m_codePoint)); heapSummary.m_allocationCount = static_cast(ap->m_allocations.size()); heapSummary.m_allocatedMemory = ap->m_totalAllocatedMemory; break; @@ -247,7 +247,7 @@ namespace AssetMemoryAnalyzer { if (text) { - ImGui::Text(text); + ImGui::Text("%s", text); ImGui::SameLine(); } diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 17a89fc1cd..dbaf9b0bf0 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -22,7 +22,6 @@ ly_append_configurations_options( "-Wno-#pragma-messages" -Wno-absolute-value -Wno-dynamic-class-memaccess - -Wno-format-security -Wno-inconsistent-missing-override -Wno-invalid-offsetof -Wno-multichar From f5485fa675548a20b856e0427c50e440c3c8fbdf Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:27:55 -0700 Subject: [PATCH 032/355] merge lastest; add extra data to scan result Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../View/Windows/Tools/UpgradeTool/VersionExplorer.cpp | 10 ++++++---- .../View/Windows/Tools/UpgradeTool/VersionExplorer.ui | 3 +++ .../Code/Include/ScriptCanvas/Core/Core.cpp | 10 ++++++++++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index ae2433d7fc..fdc2ea490b 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -697,8 +697,10 @@ namespace ScriptCanvasEditor bool onlyShowOutdatedGraphs = m_ui->onlyShowOutdated->isChecked(); bool forceUpgrade = m_ui->forceUpgrade->isChecked(); - - if (!forceUpgrade && onlyShowOutdatedGraphs && graphComponent->GetVersion().IsLatest()) + ScriptCanvas::VersionData graphVersion = graphComponent->GetVersion(); + + + if (!forceUpgrade && onlyShowOutdatedGraphs && graphVersion.IsLatest()) { ScanComplete(asset); Log("InspectAsset: %s, is at latest", asset.GetHint().c_str()); @@ -842,8 +844,8 @@ namespace ScriptCanvasEditor } else { - spinnerText.append(QString::asprintf(" - Discovered: %zu, Inspected: %zu, Failed: %zu" - , m_discoveredAssets, m_inspectedAssets, m_failedAssets)); + spinnerText.append(QString::asprintf(" - Discovered: %zu, Inspected: %zu, Failed: %zu, Upgradeable: %zu" + , m_discoveredAssets, m_inspectedAssets, m_failedAssets, m_assetsToUpgrade.size())); } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui index 53e9401194..0cd67bcf22 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui @@ -369,6 +369,9 @@ Update Reporting Only + + true + diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp index 14d54b1fd6..9ec941d269 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp @@ -135,6 +135,16 @@ namespace ScriptCanvas if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) { serializeContext->Class() + ->Version(2, [](AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) + { + if (classElement.GetVersion() < 2) + { + FileVersion fileVersion = ScriptCanvas::FileVersion::Initial; + classElement.AddElementWithData(context, "_fileVersion", fileVersion); + } + + return true; + }) ->Field("_grammarVersion", &VersionData::grammarVersion) ->Field("_runtimeVersion", &VersionData::runtimeVersion) ->Field("_fileVersion", &VersionData::fileVersion) From 319f770a642d33a1b3c3243e1b14c51cbe5a6ca2 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:50:59 -0700 Subject: [PATCH 033/355] enabling warns Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Platform/Common/Clang/Configurations_clang.cmake | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 17a89fc1cd..02a94f4e72 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -18,23 +18,13 @@ ly_append_configurations_options( # Disabled warnings (please do not disable any others without first consulting ly-warnings) -Wrange-loop-analysis - -Wno-unknown-warning-option - "-Wno-#pragma-messages" - -Wno-absolute-value - -Wno-dynamic-class-memaccess + -Wno-unknown-warning-option # used as a way to mark warnings that are MSVC only -Wno-format-security -Wno-inconsistent-missing-override - -Wno-invalid-offsetof - -Wno-multichar -Wno-parentheses -Wno-reorder - -Wno-self-assign -Wno-switch - -Wno-tautological-compare -Wno-undefined-var-template - -Wno-unknown-pragmas - # Workaround for compiler seeing file case differently from what OS show in console. - -Wno-nonportable-include-path COMPILATION_DEBUG -O0 # No optimization From 863e4ebc6eb9d2a49fc70043ca2afa6e99e70b81 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:51:31 -0700 Subject: [PATCH 034/355] unnecessary pragmas incompatible with clang Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/EditorPanelUtils.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Code/Editor/EditorPanelUtils.cpp b/Code/Editor/EditorPanelUtils.cpp index 12e9457474..a270de5978 100644 --- a/Code/Editor/EditorPanelUtils.cpp +++ b/Code/Editor/EditorPanelUtils.cpp @@ -47,7 +47,6 @@ struct ToolTip class CEditorPanelUtils_Impl : public IEditorPanelUtils { - #pragma region Drag & Drop public: void SetViewportDragOperation(void(* dropCallback)(CViewport* viewport, int dragPointX, int dragPointY, void* custom), void* custom) override { @@ -56,8 +55,7 @@ public: GetIEditor()->GetViewManager()->GetView(i)->SetGlobalDropCallback(dropCallback, custom); } } - #pragma endregion - #pragma region Preview Window + public: int PreviewWindow_GetDisplaySettingsDebugFlags(CDisplaySettings* settings) override @@ -72,8 +70,6 @@ public: settings->SetDebugFlags(flags); } - #pragma endregion - #pragma region Shortcuts protected: QVector hotkeys; bool m_hotkeysAreEnabled; @@ -408,8 +404,6 @@ public: return m_hotkeysAreEnabled; } - #pragma endregion - #pragma region ToolTip protected: QMap m_tooltips; @@ -539,7 +533,6 @@ public: } return GetToolTip(path).disabledContent; } - #pragma endregion ToolTip }; IEditorPanelUtils* CreateEditorPanelUtils() From 328b07bd6407afcfa2b11285d52081577b209529 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:51:53 -0700 Subject: [PATCH 035/355] assignments to itself Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp | 1 - .../External/CubeMapGen/CCubeMapProcessor.cpp | 2 -- 2 files changed, 3 deletions(-) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp index 170805aa57..9e1fa7339b 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp @@ -297,7 +297,6 @@ namespace ImageProcessingAtom if (trimZeros) { /* set i0 and i1 to the nonzero support of the filter */ - i0 = i0; i1 = i1 = lastnonzero + 1; } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/External/CubeMapGen/CCubeMapProcessor.cpp b/Gems/Atom/Asset/ImageProcessingAtom/External/CubeMapGen/CCubeMapProcessor.cpp index 8a4d727e8c..dc8af67877 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/External/CubeMapGen/CCubeMapProcessor.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/External/CubeMapGen/CCubeMapProcessor.cpp @@ -616,8 +616,6 @@ namespace ImageProcessingAtom a_FilterExtents[oppositeFaceIdx].Augment((a_SrcSize-1), (a_SrcSize-1), 0); } } - - minV=minV; } From c34aecafa3bd0192b4f66192fc2e512aa5974e7e Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:52:15 -0700 Subject: [PATCH 036/355] pragma lib, moved to cmake Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/Platform/Windows/editor_lib_windows.cmake | 5 +++++ Code/Editor/Settings.cpp | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Code/Editor/Platform/Windows/editor_lib_windows.cmake b/Code/Editor/Platform/Windows/editor_lib_windows.cmake index 7a325ca97e..8c61e18096 100644 --- a/Code/Editor/Platform/Windows/editor_lib_windows.cmake +++ b/Code/Editor/Platform/Windows/editor_lib_windows.cmake @@ -5,3 +5,8 @@ # SPDX-License-Identifier: Apache-2.0 OR MIT # # + +set(LY_BUILD_DEPENDENCIES + PRIVATE + Gdi32.lib +) diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 8672bad5c4..94b5668efc 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -35,7 +35,6 @@ #include "CryEdit.h" #include "MainWindow.h" -#pragma comment(lib, "Gdi32.lib") ////////////////////////////////////////////////////////////////////////// // Global Instance of Editor settings. From 8102999a057cf662412b6d3f96a4d78459692529 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:53:33 -0700 Subject: [PATCH 037/355] using uint here will slice the value of npos Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/PhysX/Code/Source/EditorColliderComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp index c337ab0a85..4aa240eaae 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp @@ -796,7 +796,7 @@ namespace PhysX entityRigidbody->GetRigidBody()->IsKinematic() == false) { AZStd::string assetPath = m_shapeConfiguration.m_physicsAsset.m_configuration.m_asset.GetHint().c_str(); - const uint lastSlash = static_cast(assetPath.rfind('/')); + const size_t lastSlash = assetPath.rfind('/'); if (lastSlash != AZStd::string::npos) { assetPath = assetPath.substr(lastSlash + 1); From 9aca449f2b1ac289f8c46f4b97ee9794de7e289b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 16:53:49 -0700 Subject: [PATCH 038/355] unnecessary comparison to itself Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Editor/Source/EditorAutomationTests/InteractionTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/InteractionTests.cpp b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/InteractionTests.cpp index 7a6f628431..264583c1a9 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/InteractionTests.cpp +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/InteractionTests.cpp @@ -176,7 +176,7 @@ namespace ScriptCanvasDeveloper ProcessCreationSet(); } } - else if (stateId == stateId == m_duplicateCheckpoint->GetStateId()) + else if (stateId == m_duplicateCheckpoint->GetStateId()) { if (m_createdSet.empty()) { From b64272a9114ecdeb5542e5c052bd75b453046d72 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 30 Aug 2021 17:23:50 -0700 Subject: [PATCH 039/355] remove unused lib Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/Platform/Windows/editor_lib_windows.cmake | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Code/Editor/Platform/Windows/editor_lib_windows.cmake b/Code/Editor/Platform/Windows/editor_lib_windows.cmake index 8c61e18096..7a325ca97e 100644 --- a/Code/Editor/Platform/Windows/editor_lib_windows.cmake +++ b/Code/Editor/Platform/Windows/editor_lib_windows.cmake @@ -5,8 +5,3 @@ # SPDX-License-Identifier: Apache-2.0 OR MIT # # - -set(LY_BUILD_DEPENDENCIES - PRIVATE - Gdi32.lib -) From a5f9cc2d6101276d6629082f3c7eb1ed245bb67a Mon Sep 17 00:00:00 2001 From: jromnoa Date: Mon, 30 Aug 2021 17:56:23 -0700 Subject: [PATCH 040/355] use wait_for_condition() on newly created material cache files and wait for them to exist before continuing to prevent race condition Signed-off-by: jromnoa --- .../hydra_AtomMaterialEditor_BasicTests.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py index 130482cb99..9047b4c871 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py @@ -33,6 +33,7 @@ MATERIAL_TYPE_PATH = os.path.join( azlmbr.paths.devroot, "Gems", "Atom", "Feature", "Common", "Assets", "Materials", "Types", "StandardPBR.materialtype", ) +CACHE_FILE_EXTENSION = ".azmaterial" def run(): @@ -109,16 +110,22 @@ def run(): expected_color_1 = math.Color(0.5, 0.5, 0.5, 1.0) material_editor.set_property(document_id, property_name, expected_color_1) target_path_1 = os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Materials", NEW_MATERIAL_1) + cache_file_name_1 = os.path.splitext(NEW_MATERIAL_1) # Example output: ('test_material_1', '.material') + cache_file_1 = f"{cache_file_name_1[0]}{CACHE_FILE_EXTENSION}" + target_path_1_cache = os.path.join(azlmbr.paths.devassets, "Cache", "pc", "materials", cache_file_1) material_editor.save_document_as_copy(document_id, target_path_1) - time.sleep(2.0) + material_editor.wait_for_condition(lambda: os.path.exists(target_path_1_cache), 4.0) # 8) Test Case: Saving as a Child Material # Assign new color to the material file save the document as child expected_color_2 = math.Color(0.75, 0.75, 0.75, 1.0) material_editor.set_property(document_id, property_name, expected_color_2) target_path_2 = os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Materials", NEW_MATERIAL_2) + cache_file_name_2 = os.path.splitext(NEW_MATERIAL_1) # Example output: ('test_material_2', '.material') + cache_file_2 = f"{cache_file_name_2[0]}{CACHE_FILE_EXTENSION}" + target_path_2_cache = os.path.join(azlmbr.paths.devassets, "Cache", "pc", "materials", cache_file_2) material_editor.save_document_as_child(document_id, target_path_2) - time.sleep(2.0) + material_editor.wait_for_condition(lambda: os.path.exists(target_path_2_cache), 4.0) # Close/Reopen documents material_editor.close_all_documents() From 16ed1e18829d2058e9b824d9bfac77132d7424bf Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Mon, 30 Aug 2021 18:27:14 -0700 Subject: [PATCH 041/355] More status reporting, fixed widget row index tracking for upgrader tool Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Code/Editor/Components/GraphUpgrade.cpp | 13 ++ .../ScriptCanvas/Components/GraphUpgrade.h | 12 +- .../Tools/UpgradeTool/VersionExplorer.cpp | 149 ++++++++++-------- .../Tools/UpgradeTool/VersionExplorer.h | 9 +- 4 files changed, 107 insertions(+), 76 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp index d89aac8ca3..f1c9a1455b 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp @@ -678,6 +678,7 @@ namespace ScriptCanvasEditor if (m_asset != asset) { m_asset = asset; + SetDebugPrefix(asset.GetHint()); } } @@ -753,4 +754,16 @@ namespace ScriptCanvasEditor { m_isVerbose = isVerbose; } + + const AZStd::string& StateMachine::GetDebugPrefix() const + { + return m_debugPrefix; + } + + void StateMachine::SetDebugPrefix(AZStd::string_view prefix) + { + m_debugPrefix = prefix; + } + + } diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h index d39bb30f3c..89ee0f3b55 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h @@ -135,11 +135,16 @@ namespace ScriptCanvasEditor void SetVerbose(bool isVerbose); + const AZStd::string& GetDebugPrefix() const; + + void SetDebugPrefix(AZStd::string_view); + AZStd::shared_ptr m_currentState = nullptr; AZStd::vector> m_states; private: bool m_isVerbose = true; + AZStd::string m_debugPrefix; }; //! This state machine will collect and share a variety of data from the EditorGraph @@ -349,6 +354,7 @@ namespace ScriptCanvasEditor int EvaluateTransition() override; }; + template void ScriptCanvasEditor::State::Log(const char* format, ...) { @@ -360,8 +366,10 @@ namespace ScriptCanvasEditor azvsnprintf(sBuffer, sizeof(sBuffer), format, ArgList); sBuffer[sizeof(sBuffer) - 1] = '\0'; va_end(ArgList); - - AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "%s\n", sBuffer); + AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data() + , "%s-%s\n" + , m_stateMachine->GetDebugPrefix().c_str() + , sBuffer); } } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index fdc2ea490b..6b396d88ba 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -171,13 +171,13 @@ namespace ScriptCanvasEditor } else { - m_ui->tableWidget->insertRow(static_cast(m_inspectedAssets)); + m_ui->tableWidget->insertRow(static_cast(m_currentAssetRowIndex)); QTableWidgetItem* rowName = new QTableWidgetItem ( tr(AZStd::string::format("Error: %s", assetToUpgrade.m_relativePath.c_str()).c_str())); + m_ui->tableWidget->setItem(static_cast(m_currentAssetRowIndex), static_cast(ColumnAsset), rowName); + ++m_currentAssetRowIndex; - m_ui->tableWidget->setItem(static_cast(m_inspectedAssets), static_cast(ColumnAsset), rowName); Log("SystemTick::ProcessState::Scan: %s post-blocking load, problem loading asset", assetToUpgrade.m_relativePath.c_str()); - ++m_currentAssetIndex; ++m_failedAssets; ScanComplete(m_currentAsset); } @@ -190,7 +190,7 @@ namespace ScriptCanvasEditor { OperationResult result = BackupGraph(*m_inProgressAsset); // Make the backup - if (result == OperationResult::BackupSuccess) + if (result == OperationResult::BackupSuccess || result == OperationResult::SkipBackup) { Log("SystemTick::ProcessState::Upgrade: Backup Success %s ", m_inProgressAsset->GetHint().c_str()); QList items = m_ui->tableWidget->findItems(m_inProgressAsset->GetHint().c_str(), Qt::MatchFlag::MatchExactly); @@ -230,11 +230,13 @@ namespace ScriptCanvasEditor void VersionExplorer::OnUpgradeAll() { - AZ::Interface::Get()->SetIsUpgrading(true); - m_state = ProcessState::Upgrade; + // cache these + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; + ScriptCanvas::Grammar::g_printAbstractCodeModel = false; + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; + AZ::Interface::Get()->SetIsUpgrading(true); m_inProgressAsset = m_assetsToUpgrade.begin(); - AZ::Debug::TraceMessageBus::Handler::BusConnect(); AZ::SystemTickBus::Handler::BusConnect(); } @@ -422,6 +424,8 @@ namespace ScriptCanvasEditor AZStd::string tmpFileName; bool tmpFilesaved = false; + constexpr const size_t k_maxAttemps = 10; + // here we are saving the graph to a temp file instead of the original file and then copying the temp file to the original file. // This ensures that AP will not a get a file change notification on an incomplete graph file causing it to fail processing. Temp files are ignored by AP. if (AZ::IO::CreateTempFileName(fullPath.c_str(), tmpFileName)) @@ -447,7 +451,7 @@ namespace ScriptCanvasEditor { if (tmpFilesaved) { - PerformMove(asset, tmpFileName, fullPath); + PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); } } else @@ -458,7 +462,7 @@ namespace ScriptCanvasEditor if (tmpFilesaved) { - PerformMove(asset, tmpFileName, fullPath); + PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); } } else @@ -484,7 +488,7 @@ namespace ScriptCanvasEditor if (tmpFilesaved) { - PerformMove(asset, tmpFileName, fullPath); + PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); } } @@ -494,28 +498,53 @@ namespace ScriptCanvasEditor } } - void VersionExplorer::PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target) + void VersionExplorer::PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target + , size_t remainingAttempts) { VersionExplorerCpp::FileEventHandler fileEventHandler; - auto moveResult = AZ::IO::SmartMove(source.c_str(), target.c_str()); - if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success) + if (remainingAttempts == 0) { - // Bump the slice asset up in the asset processor's queue. - AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str()); - AZ::SystemTickBus::QueueFunction([this, asset]() { GraphUpgradeComplete(asset); }); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s. giving up", target.c_str()); + GraphUpgradeComplete(asset, OperationResult::CopyFinalFailed); + } + else if (remainingAttempts == 2) + { + auto streamer = AZ::Interface::Get(); + AZ::IO::FileRequestPtr flushRequest = streamer->FlushCaches(); + streamer->SetRequestCompleteCallback(flushRequest + , [this, asset, remainingAttempts, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) + { + // Continue saving. + AZ::SystemTickBus::QueueFunction( + [this, asset, remainingAttempts, source, target](){ PerformMove(asset, source, target, remainingAttempts - 1); }); + }); + streamer->QueueRequest(flushRequest); } else { - auto streamer = AZ::Interface::Get(); - AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); - streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) + auto moveResult = AZ::IO::SmartMove(source.c_str(), target.c_str()); + if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success) + { + auto streamer = AZ::Interface::Get(); + AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); + // Bump the slice asset up in the asset processor's queue. + AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str()); + AZ::SystemTickBus::QueueFunction([this, asset]() { GraphUpgradeComplete(asset); }); + } + else + { + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s. trying again", target.c_str()); + auto streamer = AZ::Interface::Get(); + AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); + streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target, remainingAttempts]([[maybe_unused]] AZ::IO::FileRequestHandle request) { // Continue saving. - AZ::SystemTickBus::QueueFunction([this, asset, source, target]() { RetryMove(asset, source, target); }); + AZ::SystemTickBus::QueueFunction([this, asset, source, target, remainingAttempts]() { PerformMove(asset, source, target, remainingAttempts - 1); }); }); - streamer->QueueRequest(flushRequest); - } + streamer->QueueRequest(flushRequest); + } + } } void VersionExplorer::GraphUpgradeComplete(const AZ::Data::Asset asset, OperationResult result ) @@ -594,6 +623,10 @@ namespace ScriptCanvasEditor { doneButton->setToolTip("Failed to create the backup folder"); } + else if (result == OperationResult::CopyFinalFailed) + { + doneButton->setToolTip("Failed to copy final file to the source destination"); + } } m_ui->tableWidget->setCellWidget(row, ColumnStatus, doneButton); @@ -632,6 +665,7 @@ namespace ScriptCanvasEditor m_assetsToInspect.clear(); m_ui->tableWidget->setRowCount(0); m_inspectedAssets = 0; + m_currentAssetRowIndex = 0; IUpgradeRequests* upgradeRequests = AZ::Interface::Get(); m_assetsToInspect = upgradeRequests->GetAssetsToUpgrade(); DoScan(); @@ -639,9 +673,14 @@ namespace ScriptCanvasEditor void VersionExplorer::DoScan() { - AZ::SystemTickBus::Handler::BusConnect(); - m_state = ProcessState::Scan; + // cache pre-tool values (make a little widget that does that, actually + // so one can destroy it and reset it + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; + ScriptCanvas::Grammar::g_printAbstractCodeModel = false; + ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; + + AZ::SystemTickBus::Handler::BusConnect(); AZ::Debug::TraceMessageBus::Handler::BusConnect(); if (!m_assetsToInspect.empty()) @@ -649,7 +688,7 @@ namespace ScriptCanvasEditor m_discoveredAssets = m_assetsToInspect.size(); m_failedAssets = 0; m_inspectedAssets = 0; - + m_currentAssetRowIndex = 0; m_ui->progressFrame->setVisible(true); m_ui->progressBar->setRange(0, aznumeric_cast(m_assetsToInspect.size())); m_ui->progressBar->setValue(0); @@ -667,16 +706,13 @@ namespace ScriptCanvasEditor void VersionExplorer::BackupComplete() { - m_currentAssetIndex = 0; + m_currentAssetRowIndex = 0; m_ui->progressBar->setValue(0); DoScan(); } void VersionExplorer::InspectAsset(AZ::Data::Asset& asset, AZ::Data::AssetInfo& assetInfo) { - ++m_inspectedAssets; - ++m_currentAssetIndex; - Log("InspectAsset: %s", asset.GetHint().c_str()); AZ::Entity* scriptCanvasEntity = nullptr; if (asset.GetType() == azrtti_typeid()) @@ -707,9 +743,9 @@ namespace ScriptCanvasEditor return; } - m_ui->tableWidget->insertRow(static_cast(m_inspectedAssets)); + m_ui->tableWidget->insertRow(static_cast(m_currentAssetRowIndex)); QTableWidgetItem* rowName = new QTableWidgetItem(tr(asset.GetHint().c_str())); - m_ui->tableWidget->setItem(static_cast(m_inspectedAssets), static_cast(ColumnAsset), rowName); + m_ui->tableWidget->setItem(static_cast(m_currentAssetRowIndex), static_cast(ColumnAsset), rowName); if (forceUpgrade || !graphComponent->GetVersion().IsLatest()) { @@ -733,14 +769,10 @@ namespace ScriptCanvasEditor }); - m_ui->tableWidget->setCellWidget(static_cast(m_inspectedAssets), static_cast(ColumnAction), rowGoToButton); - m_ui->tableWidget->setCellWidget(static_cast(m_inspectedAssets), static_cast(ColumnStatus), spinner); + m_ui->tableWidget->setCellWidget(static_cast(m_currentAssetRowIndex), static_cast(ColumnAction), rowGoToButton); + m_ui->tableWidget->setCellWidget(static_cast(m_currentAssetRowIndex), static_cast(ColumnStatus), spinner); } - QToolButton* browseButton = new QToolButton(this); - browseButton->setToolTip(AzQtComponents::fileBrowserActionName()); - browseButton->setIcon(QIcon(":/stylesheet/img/UI20/browse-edit.svg")); - char resolvedBuffer[AZ_MAX_PATH_LEN] = { 0 }; AZStd::string path = AZStd::string::format("@devroot@/%s", asset.GetHint().c_str()); AZ::IO::FileIOBase::GetInstance()->ResolvePath(path.c_str(), resolvedBuffer, AZ_MAX_PATH_LEN); @@ -752,18 +784,22 @@ namespace ScriptCanvasEditor AZStd::string watchFolder; QByteArray assetNameUtf8 = asset.GetHint().c_str(); AzToolsFramework::AssetSystemRequestBus::BroadcastResult(result, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, assetNameUtf8, info, watchFolder); - if (!result) - { - AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Failed to locate asset info for '%s'.", assetNameUtf8.constData()); - } + + AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), result, "Failed to locate asset info for '%s'.", assetNameUtf8.constData()); + + QToolButton* browseButton = new QToolButton(this); + browseButton->setToolTip(AzQtComponents::fileBrowserActionName()); + browseButton->setIcon(QIcon(":/stylesheet/img/UI20/browse-edit.svg")); QString absolutePath = QDir(watchFolder.c_str()).absoluteFilePath(info.m_relativePath.c_str()); connect(browseButton, &QPushButton::clicked, [absolutePath] { AzQtComponents::ShowFileOnDesktop(absolutePath); }); - m_ui->tableWidget->setCellWidget(static_cast(m_inspectedAssets), static_cast(ColumnBrowse), browseButton); + m_ui->tableWidget->setCellWidget(static_cast(m_currentAssetRowIndex), static_cast(ColumnBrowse), browseButton); ScanComplete(asset); + ++m_inspectedAssets; + ++m_currentAssetRowIndex; } void VersionExplorer::UpgradeSingle @@ -778,7 +814,7 @@ namespace ScriptCanvasEditor { asset.BlockUntilLoadComplete(); - if (!asset.IsReady()) + if (asset.IsReady()) { AZ::Interface::Get()->SetIsUpgrading(true); m_isUpgradingSingleGraph = true; @@ -803,7 +839,7 @@ namespace ScriptCanvasEditor { Log("ScanComplete: %s", asset.GetHint().c_str()); m_inProgress = false; - m_ui->progressBar->setValue(aznumeric_cast(m_currentAssetIndex)); + m_ui->progressBar->setValue(aznumeric_cast(m_currentAssetRowIndex)); m_ui->scanButton->setEnabled(true); m_inspectingAsset = m_assetsToInspect.erase(m_inspectingAsset); @@ -932,31 +968,6 @@ namespace ScriptCanvasEditor return CaptureLogFromTraceBus(window, message); } - void VersionExplorer::RetryMove(const AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target) - { - auto normTarget = target; - AzFramework::StringFunc::Path::Normalize(normTarget); - auto moveResult = AZ::IO::SmartMove(source.c_str(), normTarget.c_str()); - if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success) - { - // Bump the slice asset up in the asset processor's queue. - AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str()); - - AZ::SystemTickBus::QueueFunction([this, asset]() { GraphUpgradeComplete(asset); }); - } - else - { - auto streamer = AZ::Interface::Get(); - AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); - streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) - { - // Continue saving. - AZ::SystemTickBus::QueueFunction([this, asset, source, target]() { RetryMove(asset, source, target); }); - }); - streamer->QueueRequest(flushRequest); - } - } - void VersionExplorer::closeEvent(QCloseEvent* event) { m_keepEditorAlive.reset(); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index 6cacc570f8..4dd67fef58 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -115,7 +115,8 @@ namespace ScriptCanvasEditor BackupSuccess, BackupFail, BackupFail_CreateFolder, - BackupFail_FileNotFound + BackupFail_FileNotFound, + CopyFinalFailed, }; void GraphUpgradeComplete(const AZ::Data::Asset, OperationResult result = OperationResult::Success); @@ -123,7 +124,7 @@ namespace ScriptCanvasEditor bool IsUpgrading() const; bool m_inProgress = false; - size_t m_currentAssetIndex = 0; + size_t m_currentAssetRowIndex = 0; size_t m_inspectedAssets = 0; size_t m_failedAssets = 0; size_t m_discoveredAssets = 0; @@ -159,8 +160,6 @@ namespace ScriptCanvasEditor OperationResult BackupGraph(const AZ::Data::Asset&); void UpgradeGraph(const AZ::Data::Asset&); - void RetryMove(const AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target); - void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset asset, OperationResult result = OperationResult::Success); void OnGraphUpgradeComplete(AZ::Data::Asset&, bool skipped = false) override; @@ -169,7 +168,7 @@ namespace ScriptCanvasEditor void closeEvent(QCloseEvent* event) override; bool m_overwriteAll = false; - void PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target); + void PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target, size_t remainingAttempts); void Log(const char* format, ...); }; From 9752fb009af5008d65a11d39370219c46b768ea1 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com> Date: Tue, 31 Aug 2021 09:25:03 +0100 Subject: [PATCH 042/355] Added pdbs for python windows in order to allow python/c++ debugging on VS (#3661) * Added pdbs for python windows in order to allow python/c++ debugging on VS Signed-off-by: Garcia Ruiz * Modified other places where rev1 was used Signed-off-by: Garcia Ruiz Co-authored-by: Garcia Ruiz --- Gems/AWSClientAuth/cdk/README.md | 2 +- .../DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat | 2 +- .../DccScriptingInterface/Launchers/Windows/Env_Python.bat | 2 +- .../DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat | 2 +- .../Launchers/Windows/Launch_MayaPy_PyCharmPro.bat | 2 +- .../DccScriptingInterface/Launchers/Windows/Launch_VScode.bat | 2 +- .../Launchers/Windows/Launch_WingIDE-7-1.bat | 2 +- .../Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat | 2 +- .../Launchers/Windows/Setuo_copy_oiio.bat | 2 +- cmake/LYPython.cmake | 4 ++-- python/python.cmd | 2 +- python/python.sh | 2 +- 12 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Gems/AWSClientAuth/cdk/README.md b/Gems/AWSClientAuth/cdk/README.md index 3bc2b59fc1..d0cc966578 100644 --- a/Gems/AWSClientAuth/cdk/README.md +++ b/Gems/AWSClientAuth/cdk/README.md @@ -13,7 +13,7 @@ Run from cdk directory within gem. Optional set up python path to LY Python ``` -set PATH="..\..\..\python\runtime\python-3.7.10-rev1-windows\python\";%PATH% +set PATH="..\..\..\python\runtime\python-3.7.10-rev2-windows\python\";%PATH% ``` This project is set up like a standard Python project. Use python interpreter from Open3d to setup python dependencies diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat index 296245d171..67f2c3d81e 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_PyCharm.bat @@ -34,7 +34,7 @@ CALL %~dp0\Env_Python.bat CALL %~dp0\Env_Qt.bat :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: ide and debugger plug diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat index 7492811a1d..196d7b09bb 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Python.bat @@ -67,7 +67,7 @@ echo DCCSI_PY_BASE = %DCCSI_PY_BASE% set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% set DCCSI_PY_IDE_PACKAGES=%DCCSI_PY_IDE%\Lib\site-packages diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat index 2532acce1f..56209ca5aa 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_WingIDE.bat @@ -28,7 +28,7 @@ CALL %~dp0\Env_Python.bat CALL %~dp0\Env_Qt.bat :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: ide and debugger plug diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat index bbccbba304..d98b8d81e7 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_MayaPy_PyCharmPro.bat @@ -63,7 +63,7 @@ set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: ide and debugger plug diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat index 46b32f4fb0..120584ed6a 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_VScode.bat @@ -68,7 +68,7 @@ set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: ide and debugger plug diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat index aa3ca76a72..c933670bab 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_WingIDE-7-1.bat @@ -62,7 +62,7 @@ set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: ide and debugger plug diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat index f223d68ebb..631250d06b 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Launch_mayapy_WingIDE-7-1.bat @@ -62,7 +62,7 @@ set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python echo DCCSI_PYTHON_INSTALL = %DCCSI_PYTHON_INSTALL% :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +set DCCSI_PY_IDE = %DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: ide and debugger plug diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat index 1a43e624c9..590e634d54 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Setuo_copy_oiio.bat @@ -18,7 +18,7 @@ set LY_DEV=..\..\..\..\..\.. :: shared location for default O3DE python location set DCCSI_PYTHON_INSTALL=%LY_DEV%\Python -set PY_SITE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python\Lib\site-packages +set PY_SITE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev2-windows\python\Lib\site-packages set PACKAGE_LOC=C:\Depot\3rdParty\packages\openimageio-2.1.16.0-rev1-windows\OpenImageIO\2.1.16.0\win_x64\bin diff --git a/cmake/LYPython.cmake b/cmake/LYPython.cmake index 21e220f1d8..eeb9f97a55 100644 --- a/cmake/LYPython.cmake +++ b/cmake/LYPython.cmake @@ -29,8 +29,8 @@ elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin" ) ly_set(LY_PYTHON_PACKAGE_HASH 3f65801894e4e44b5faa84dd85ef80ecd772dcf728cdd2d668a6e75978a32695) elseif (${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows" ) ly_set(LY_PYTHON_VERSION 3.7.10) - ly_set(LY_PYTHON_PACKAGE_NAME python-3.7.10-rev1-windows) - ly_set(LY_PYTHON_PACKAGE_HASH 851383addea5c54b7c6398860d04606c1053f1157c2edd801ec3d47394f73136) + ly_set(LY_PYTHON_PACKAGE_NAME python-3.7.10-rev2-windows) + ly_set(LY_PYTHON_PACKAGE_HASH 06d97488a2dbabe832ecfa832a42d3e8a7163ba95e975f032727331b0f49d280) endif() # settings and globals diff --git a/python/python.cmd b/python/python.cmd index 04c55c50c7..70c79e6789 100644 --- a/python/python.cmd +++ b/python/python.cmd @@ -17,7 +17,7 @@ SETLOCAL SET CMD_DIR=%~dp0 SET CMD_DIR=%CMD_DIR:~0,-1% -SET PYTHONHOME=%CMD_DIR%\runtime\python-3.7.10-rev1-windows\python +SET PYTHONHOME=%CMD_DIR%\runtime\python-3.7.10-rev2-windows\python IF EXIST "%PYTHONHOME%" GOTO PYTHONHOME_EXISTS diff --git a/python/python.sh b/python/python.sh index 590845dbd5..642878485b 100755 --- a/python/python.sh +++ b/python/python.sh @@ -19,7 +19,7 @@ DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" if [[ "$OSTYPE" == *"darwin"* ]]; then PYTHON=$DIR/runtime/python-3.7.10-rev1-darwin/Python.framework/Versions/3.7/bin/python3 elif [[ "$OSTYPE" == "msys" ]]; then - PYTHON=$DIR/runtime/python-3.7.10-rev1-windows/python/python.exe + PYTHON=$DIR/runtime/python-3.7.10-rev2-windows/python/python.exe else PYTHON=$DIR/runtime/python-3.7.10-rev2-linux/python/bin/python fi From d784ff8c57cefff7efd2b6bda71a053b5efda867 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com> Date: Tue, 31 Aug 2021 09:27:14 +0100 Subject: [PATCH 043/355] Added debugger attachment utilities to the engine, fixed crash when showing console variables, improvements to timeout handling and small cleanup (#3591) * Added debugger attachment utilities to the engine, fixed crash when showing console variables Signed-off-by: Garcia Ruiz * Removed unused variables Signed-off-by: Garcia Ruiz * Removed unneded check Signed-off-by: Garcia Ruiz * Small fix for crashes/timeouts Signed-off-by: Garcia Ruiz * Removed unused variable, fixed compile error Signed-off-by: Garcia Ruiz * Fix compile Signed-off-by: Garcia Ruiz * Addressed esteban comments * Addressed tom comments Co-authored-by: Garcia Ruiz --- Code/Editor/Controls/ConsoleSCB.cpp | 4 + Code/Editor/CryEdit.cpp | 19 ++- Code/Editor/CryEditPy.cpp | 13 ++ Code/Framework/AzCore/AzCore/Debug/Trace.cpp | 36 ++++++ Code/Framework/AzCore/AzCore/Debug/Trace.h | 2 + .../Common/Apple/AzCore/Debug/Trace_Apple.cpp | 7 + .../UnixLike/AzCore/Debug/Trace_UnixLike.cpp | 7 + .../WinAPI/AzCore/Debug/Trace_WinAPI.cpp | 39 ++++++ .../ly_test_tools/o3de/editor_test.py | 121 ++++++++++++------ 9 files changed, 210 insertions(+), 38 deletions(-) diff --git a/Code/Editor/Controls/ConsoleSCB.cpp b/Code/Editor/Controls/ConsoleSCB.cpp index aed148976f..6b12348880 100644 --- a/Code/Editor/Controls/ConsoleSCB.cpp +++ b/Code/Editor/Controls/ConsoleSCB.cpp @@ -573,6 +573,10 @@ static CVarBlock* VarBlockFromConsoleVars() IVariable* pVariable = nullptr; for (int i = 0; i < cmdCount; i++) { + if (!cmds[i].data()) + { + continue; + } ICVar* pCVar = console->GetCVar(cmds[i].data()); if (!pCVar) { diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index ca139cc506..fe7b0a06be 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -551,7 +551,9 @@ public: { "NSDocumentRevisionsDebugMode", nsDocumentRevisionsDebugMode}, { "skipWelcomeScreenDialog", m_bSkipWelcomeScreenDialog}, { "autotest_mode", m_bAutotestMode}, - { "regdumpall", dummy } + { "regdumpall", dummy }, + { "attach-debugger", dummy }, // Attaches a debugger for the current application + { "wait-for-debugger", dummy }, // Waits until a debugger is attached to the current application }; QString dummyString; @@ -2290,7 +2292,7 @@ int CCryEditApp::IdleProcessing(bool bBackgroundUpdate) int res = 0; if (bIsAppWindow || m_bForceProcessIdle || m_bKeepEditorActive // Automated tests must always keep the editor active, or they can get stuck - || m_bAutotestMode) + || m_bAutotestMode || m_bRunPythonTestScript) { res = 1; bActive = true; @@ -4011,6 +4013,19 @@ extern "C" int AZ_DLL_EXPORT CryEditMain(int argc, char* argv[]) { CryAllocatorsRAII cryAllocatorsRAII; + // Debugging utilities + for (int i = 1; i < argc; ++i) + { + if (azstricmp(argv[i], "--attach-debugger") == 0) + { + AZ::Debug::Trace::AttachDebugger(); + } + else if (azstricmp(argv[i], "--wait-for-debugger") == 0) + { + AZ::Debug::Trace::WaitForDebugger(); + } + } + // ensure the EditorEventsBus context gets created inside EditorLib [[maybe_unused]] const auto& editorEventsContext = AzToolsFramework::EditorEvents::Bus::GetOrCreateContext(); diff --git a/Code/Editor/CryEditPy.cpp b/Code/Editor/CryEditPy.cpp index 10fd56c134..7a407aac37 100644 --- a/Code/Editor/CryEditPy.cpp +++ b/Code/Editor/CryEditPy.cpp @@ -401,6 +401,16 @@ inline namespace Commands { return static_cast(GetIEditor()->GetEditorConfigPlatform()); } + + bool PyAttachDebugger() + { + return AZ::Debug::Trace::AttachDebugger(); + } + + bool PyWaitForDebugger(float timeoutSeconds = -1.f) + { + return AZ::Debug::Trace::WaitForDebugger(timeoutSeconds); + } } namespace AzToolsFramework @@ -448,6 +458,9 @@ namespace AzToolsFramework addLegacyGeneral(behaviorContext->Method("start_process_detached", PyStartProcessDetached, nullptr, "Launches a detached process with an optional space separated list of arguments.")); addLegacyGeneral(behaviorContext->Method("launch_lua_editor", PyLaunchLUAEditor, nullptr, "Launches the Lua editor, may receive a list of space separate file paths, or an empty string to only open the editor.")); + addLegacyGeneral(behaviorContext->Method("attach_debugger", PyAttachDebugger, nullptr, "Prompts for attaching the debugger")); + addLegacyGeneral(behaviorContext->Method("wait_for_debugger", PyWaitForDebugger, behaviorContext->MakeDefaultValues(-1.f), "Pauses this thread execution until the debugger has been attached")); + // this will put these methods into the 'azlmbr.legacy.checkout_dialog' module auto addCheckoutDialog = [](AZ::BehaviorContext::GlobalMethodBuilder methodBuilder) { diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp index 74ecee40e5..26c702c13a 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp @@ -25,6 +25,7 @@ #include #include #include +#include namespace AZ { @@ -33,6 +34,7 @@ namespace AZ namespace Platform { #if defined(AZ_ENABLE_DEBUG_TOOLS) + bool AttachDebugger(); bool IsDebuggerPresent(); void HandleExceptions(bool isEnabled); void DebugBreak(); @@ -141,6 +143,40 @@ namespace AZ #endif } + bool + Trace::AttachDebugger() + { +#if defined(AZ_ENABLE_DEBUG_TOOLS) + return Platform::AttachDebugger(); +#else + return false; +#endif + } + + bool + Trace::WaitForDebugger(float timeoutSeconds/*=-1.f*/) + { +#if defined(AZ_ENABLE_DEBUG_TOOLS) + using AZStd::chrono::system_clock; + using AZStd::chrono::time_point; + using AZStd::chrono::milliseconds; + + milliseconds timeoutMs = milliseconds(aznumeric_cast(timeoutSeconds * 1000)); + system_clock clock; + time_point start = clock.now(); + auto hasTimedOut = [&clock, start, timeoutMs]() + { + return timeoutMs.count() >= 0 && (clock.now() - start) >= timeoutMs; + }; + + while (!AZ::Debug::Trace::IsDebuggerPresent() && !hasTimedOut()) + { + AZStd::this_thread::sleep_for(milliseconds(1)); + } + return AZ::Debug::Trace::IsDebuggerPresent(); +#endif + } + //========================================================================= // HandleExceptions // [8/3/2009] diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.h b/Code/Framework/AzCore/AzCore/Debug/Trace.h index bae074281c..b00a1cd921 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.h +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.h @@ -49,6 +49,8 @@ namespace AZ */ static const char* GetDefaultSystemWindow(); static bool IsDebuggerPresent(); + static bool AttachDebugger(); + static bool WaitForDebugger(float timeoutSeconds = -1.f); /// True or false if we want to handle system exceptions. static void HandleExceptions(bool isEnabled); diff --git a/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Debug/Trace_Apple.cpp b/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Debug/Trace_Apple.cpp index 4ae25bfaf9..f9d4806bcb 100644 --- a/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Debug/Trace_Apple.cpp +++ b/Code/Framework/AzCore/Platform/Common/Apple/AzCore/Debug/Trace_Apple.cpp @@ -56,6 +56,13 @@ namespace AZ return ((info.kp_proc.p_flag & P_TRACED) != 0); } + bool AttachDebugger() + { + // Not supported yet + AZ_Assert(false, "AttachDebugger() is not supported for Mac platform yet"); + return false; + } + void HandleExceptions(bool) {} diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Debug/Trace_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Debug/Trace_UnixLike.cpp index 545a712df8..e9c0234ffa 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Debug/Trace_UnixLike.cpp +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Debug/Trace_UnixLike.cpp @@ -60,6 +60,13 @@ namespace AZ return s_debuggerDetected; } + bool AttachDebugger() + { + // Not supported yet + AZ_Assert(false, "AttachDebugger() is not supported for Unix platform yet"); + return false; + } + void HandleExceptions(bool) {} diff --git a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Debug/Trace_WinAPI.cpp b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Debug/Trace_WinAPI.cpp index 02c1988215..28d3459ba3 100644 --- a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Debug/Trace_WinAPI.cpp +++ b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Debug/Trace_WinAPI.cpp @@ -49,6 +49,45 @@ namespace AZ } } + bool AttachDebugger() + { + if (IsDebuggerPresent()) + { + return true; + } + + // Launch vsjitdebugger.exe, this app is always present in System32 folder + // with an installation of any version of visual studio. + // It will open a debugging dialog asking the user what debugger to use + + STARTUPINFOW startupInfo = {0}; + startupInfo.cb = sizeof(startupInfo); + PROCESS_INFORMATION processInfo = {0}; + + wchar_t cmdline[MAX_PATH]; + swprintf_s(cmdline, L"vsjitdebugger.exe -p %li", ::GetCurrentProcessId()); + bool success = ::CreateProcessW( + NULL, // No module name (use command line) + cmdline, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // No handle inheritance + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &startupInfo, // Pointer to STARTUPINFO structure + &processInfo); // Pointer to PROCESS_INFORMATION structure + + if (success) + { + ::WaitForSingleObject(processInfo.hProcess, INFINITE); + ::CloseHandle(processInfo.hProcess); + ::CloseHandle(processInfo.hThread); + return true; + } + return false; + } + void DebugBreak() { __debugbreak(); diff --git a/Tools/LyTestTools/ly_test_tools/o3de/editor_test.py b/Tools/LyTestTools/ly_test_tools/o3de/editor_test.py index 4e15f32b37..781977cf33 100644 --- a/Tools/LyTestTools/ly_test_tools/o3de/editor_test.py +++ b/Tools/LyTestTools/ly_test_tools/o3de/editor_test.py @@ -59,6 +59,11 @@ class EditorTestBase(ABC): timeout = 180 # Test file that this test will run test_module = None + # Attach debugger when running the test, useful for debugging crashes. This should never be True on production. + # It's also recommended to switch to EditorSingleTest for debugging in isolation + attach_debugger = False + # Wait until a debugger is attached at the startup of the test, this is another way of debugging. + wait_for_debugger = False # Test that will be run alone in one editor class EditorSingleTest(EditorTestBase): @@ -117,8 +122,9 @@ class Result: class Pass(Base): @classmethod - def create(cls, output : str, editor_log : str): + def create(cls, test_spec : EditorTestBase, output : str, editor_log : str): r = cls() + r.test_spec = test_spec r.output = output r.editor_log = editor_log return r @@ -135,8 +141,9 @@ class Result: class Fail(Base): @classmethod - def create(cls, output, editor_log : str): + def create(cls, test_spec : EditorTestBase, output, editor_log : str): r = cls() + r.test_spec = test_spec r.output = output r.editor_log = editor_log return r @@ -157,9 +164,10 @@ class Result: class Crash(Base): @classmethod - def create(cls, output : str, ret_code : int, stacktrace : str, editor_log : str): + def create(cls, test_spec : EditorTestBase, output : str, ret_code : int, stacktrace : str, editor_log : str): r = cls() r.output = output + r.test_spec = test_spec r.ret_code = ret_code r.stacktrace = stacktrace r.editor_log = editor_log @@ -187,9 +195,10 @@ class Result: class Timeout(Base): @classmethod - def create(cls, output : str, time_secs : float, editor_log : str): + def create(cls, test_spec : EditorTestBase, output : str, time_secs : float, editor_log : str): r = cls() r.output = output + r.test_spec = test_spec r.time_secs = time_secs r.editor_log = editor_log return r @@ -210,9 +219,10 @@ class Result: class Unknown(Base): @classmethod - def create(cls, output : str, extra_info : str, editor_log : str): + def create(cls, test_spec : EditorTestBase, output : str, extra_info : str, editor_log : str): r = cls() r.output = output + r.test_spec = test_spec r.editor_log = editor_log r.extra_info = extra_info return r @@ -255,7 +265,7 @@ class EditorTestSuite(): def editor_test_data(self, request): class TestData(): def __init__(self): - self.results = {} + self.results = {} # Dict of str(test_spec.__name__) -> Result self.asset_processor = None test_data = TestData() @@ -548,7 +558,7 @@ class EditorTestSuite(): for test_spec in test_spec_list: name = editor_utils.get_module_filename(test_spec.test_module) if name not in found_jsons.keys(): - results[test_spec.__name__] = Result.Unknown.create(output, "Couldn't find any test run information on stdout", editor_log_content) + results[test_spec.__name__] = Result.Unknown.create(test_spec, output, "Couldn't find any test run information on stdout", editor_log_content) else: result = None json_result = found_jsons[name] @@ -564,9 +574,9 @@ class EditorTestSuite(): log_start = end if json_result["success"]: - result = Result.Pass.create(json_output, cur_log) + result = Result.Pass.create(test_spec, json_output, cur_log) else: - result = Result.Fail.create(json_output, cur_log) + result = Result.Fail.create(test_spec, json_output, cur_log) results[test_spec.__name__] = result return results @@ -587,8 +597,13 @@ class EditorTestSuite(): test_spec : EditorTestBase, cmdline_args : List[str] = []): test_cmdline_args = self.global_extra_cmdline_args + cmdline_args - if test_spec.use_null_renderer or (test_spec.use_null_renderer is None and self.use_null_renderer): + test_spec_uses_null_renderer = getattr(test_spec, "use_null_renderer", None) + if test_spec_uses_null_renderer or (test_spec_uses_null_renderer is None and self.use_null_renderer): test_cmdline_args += ["-rhi=null"] + if test_spec.attach_debugger: + test_cmdline_args += ["--attach-debugger"] + if test_spec.wait_for_debugger: + test_cmdline_args += ["--wait-for-debugger"] # Cycle any old crash report in case it wasn't cycled properly editor_utils.cycle_crash_report(run_id, workspace) @@ -610,18 +625,18 @@ class EditorTestSuite(): editor_log_content = editor_utils.retrieve_editor_log_content(run_id, log_name, workspace) if return_code == 0: - test_result = Result.Pass.create(output, editor_log_content) + test_result = Result.Pass.create(test_spec, output, editor_log_content) else: has_crashed = return_code != EditorTestSuite._TEST_FAIL_RETCODE if has_crashed: - test_result = Result.Crash.create(output, return_code, editor_utils.retrieve_crash_output(run_id, workspace, self._TIMEOUT_CRASH_LOG), None) + test_result = Result.Crash.create(test_spec, output, return_code, editor_utils.retrieve_crash_output(run_id, workspace, self._TIMEOUT_CRASH_LOG), None) editor_utils.cycle_crash_report(run_id, workspace) else: - test_result = Result.Fail.create(output, editor_log_content) + test_result = Result.Fail.create(test_spec, output, editor_log_content) except WaitTimeoutError: editor.kill() editor_log_content = editor_utils.retrieve_editor_log_content(run_id, log_name, workspace) - test_result = Result.Timeout.create(output, test_spec.timeout, editor_log_content) + test_result = Result.Timeout.create(test_spec, output, test_spec.timeout, editor_log_content) editor_log_content = editor_utils.retrieve_editor_log_content(run_id, log_name, workspace) results = self._get_results_using_output([test_spec], output, editor_log_content) @@ -629,13 +644,17 @@ class EditorTestSuite(): return results # Starts an editor executable with a list of tests and returns a dict of the result of every test ran within that editor - # instance. In case of failure this function also parses the editor output to find out what specific tests that failed + # instance. In case of failure this function also parses the editor output to find out what specific tests failed def _exec_editor_multitest(self, request, workspace, editor, run_id : int, log_name : str, test_spec_list : List[EditorTestBase], cmdline_args=[]): test_cmdline_args = self.global_extra_cmdline_args + cmdline_args if self.use_null_renderer: test_cmdline_args += ["-rhi=null"] + if any([t.attach_debugger for t in test_spec_list]): + test_cmdline_args += ["--attach-debugger"] + if any([t.wait_for_debugger for t in test_spec_list]): + test_cmdline_args += ["--wait-for-debugger"] # Cycle any old crash report in case it wasn't cycled properly editor_utils.cycle_crash_report(run_id, workspace) @@ -661,35 +680,65 @@ class EditorTestSuite(): if return_code == 0: # No need to scrap the output, as all the tests have passed for test_spec in test_spec_list: - results[test_spec.__name__] = Result.Pass.create(output, editor_log_content) + results[test_spec.__name__] = Result.Pass.create(test_spec, output, editor_log_content) else: + # Scrap the output to attempt to find out which tests failed. + # This function should always populate the result list, if it didn't find it, it will have "Unknown" type of result results = self._get_results_using_output(test_spec_list, output, editor_log_content) + assert len(results) == len(test_spec_list), "bug in _get_results_using_output(), the number of results don't match the tests ran" + + # If the editor crashed, find out in which test it happened and update the results has_crashed = return_code != EditorTestSuite._TEST_FAIL_RETCODE if has_crashed: - crashed_test = None - for key, result in results.items(): + crashed_result = None + for test_spec_name, result in results.items(): if isinstance(result, Result.Unknown): - if not crashed_test: + if not crashed_result: + # The first test with "Unknown" result (no data in output) is likely the one that crashed crash_error = editor_utils.retrieve_crash_output(run_id, workspace, self._TIMEOUT_CRASH_LOG) editor_utils.cycle_crash_report(run_id, workspace) - results[key] = Result.Crash.create(output, return_code, crash_error, result.editor_log) - crashed_test = results[key] + results[test_spec_name] = Result.Crash.create(result.test_spec, output, return_code, crash_error, result.editor_log) + crashed_result = result else: - results[key] = Result.Unknown.create(output, f"This test has unknown result, test '{crashed_test.__name__}' crashed before this test could be executed", result.editor_log) + # If there are remaning "Unknown" results, these couldn't execute because of the crash, update with info about the offender + results[test_spec_name].extra_info = f"This test has unknown result, test '{crashed_result.test_spec.__name__}' crashed before this test could be executed" - except WaitTimeoutError: - results = self._get_results_using_output(test_spec_list, output, editor_log_content) - editor_log_content = editor_utils.retrieve_editor_log_content(run_id, log_name, workspace) + # if all the tests ran, the one that has caused the crash is the last test + if not crashed_result: + crash_error = editor_utils.retrieve_crash_output(run_id, workspace, self._TIMEOUT_CRASH_LOG) + editor_utils.cycle_crash_report(run_id, workspace) + results[test_spec_name] = Result.Crash.create(crashed_result.test_spec, output, return_code, crash_error, crashed_result.editor_log) + + + except WaitTimeoutError: editor.kill() - for key, result in results.items(): + + output = editor.get_output() + editor_log_content = editor_utils.retrieve_editor_log_content(run_id, log_name, workspace) + + # The editor timed out when running the tests, get the data from the output to find out which ones ran + results = self._get_results_using_output(test_spec_list, output, editor_log_content) + assert len(results) == len(test_spec_list), "bug in _get_results_using_output(), the number of results don't match the tests ran" + + # Similar logic here as crashes, the first test that has no result is the one that timed out + timed_out_result = None + for test_spec_name, result in results.items(): if isinstance(result, Result.Unknown): - results[key] = Result.Timeout.create(result.output, total_timeout, result.editor_log) - # FIX-ME + if not timed_out_result: + results[test_spec_name] = Result.Timeout.create(result.test_spec, result.output, self.timeout_editor_shared_test, result.editor_log) + timed_out_result = result + else: + # If there are remaning "Unknown" results, these couldn't execute because of the timeout, update with info about the offender + results[test_spec_name].extra_info = f"This test has unknown result, test '{timed_out_result.test_spec.__name__}' timed out before this test could be executed" + + # if all the tests ran, the one that has caused the timeout is the last test, as it didn't close the editor + if not timed_out_result: + results[test_spec_name] = Result.Timeout.create(timed_out_result.test_spec, results[test_spec_name].output, self.timeout_editor_shared_test, result.editor_log) return results - # Runs a single test with the given specs, used by the collector to register the test - def _run_single_test(self, request, workspace, editor, editor_test_data, test_spec : EditorTestBase): + # Runs a single test (one editor, one test) with the given specs + def _run_single_test(self, request, workspace, editor, editor_test_data, test_spec : EditorSingleTest): self._setup_editor_test(editor, workspace, editor_test_data) extra_cmdline_args = [] if hasattr(test_spec, "extra_cmdline_args"): @@ -700,8 +749,8 @@ class EditorTestSuite(): test_name, test_result = next(iter(results.items())) self._report_result(test_name, test_result) - # Runs a batch of tests in one single editor with the given spec list - def _run_batched_tests(self, request, workspace, editor, editor_test_data, test_spec_list : List[EditorTestBase], extra_cmdline_args=[]): + # Runs a batch of tests in one single editor with the given spec list (one editor, multiple tests) + def _run_batched_tests(self, request, workspace, editor, editor_test_data, test_spec_list : List[EditorSharedTest], extra_cmdline_args=[]): if not test_spec_list: return @@ -710,8 +759,8 @@ class EditorTestSuite(): assert results is not None editor_test_data.results.update(results) - # Runs multiple editors with one test on each editor - def _run_parallel_tests(self, request, workspace, editor, editor_test_data, test_spec_list : List[EditorTestBase], extra_cmdline_args=[]): + # Runs multiple editors with one test on each editor (multiple editor, one test each) + def _run_parallel_tests(self, request, workspace, editor, editor_test_data, test_spec_list : List[EditorSharedTest], extra_cmdline_args=[]): if not test_spec_list: return @@ -747,8 +796,8 @@ class EditorTestSuite(): for result in results_per_thread: editor_test_data.results.update(result) - # Runs multiple editors with a batch of tests for each editor - def _run_parallel_batched_tests(self, request, workspace, editor, editor_test_data, test_spec_list : List[EditorTestBase], extra_cmdline_args=[]): + # Runs multiple editors with a batch of tests for each editor (multiple editor, multiple tests each) + def _run_parallel_batched_tests(self, request, workspace, editor, editor_test_data, test_spec_list : List[EditorSharedTest], extra_cmdline_args=[]): if not test_spec_list: return From 77e630085b190ed1182f7b00c965a723a625ca71 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com> Date: Tue, 31 Aug 2021 10:04:24 +0100 Subject: [PATCH 044/355] Overhaul physics test organization (#3684) * Moved files Signed-off-by: Garcia Ruiz * Fixes for moved files Signed-off-by: Garcia Ruiz * Removed tmp file Signed-off-by: Garcia Ruiz Co-authored-by: Garcia Ruiz --- .../editor_python_test_tools/asset_utils.py | 47 +++++ .../PythonTests/physics/ImportPathHelper.py | 11 -- .../physics/TestSuite_InDevelopment.py | 96 +++++----- .../Gem/PythonTests/physics/TestSuite_Main.py | 26 +-- .../physics/TestSuite_Main_Optimized.py | 177 +++++++++-------- .../PythonTests/physics/TestSuite_Periodic.py | 178 +++++++++--------- .../PythonTests/physics/TestSuite_Sandbox.py | 8 +- .../PythonTests/physics/TestSuite_Utils.py | 6 +- ...654881_CharacterController_SwitchLevels.py | 8 - ...00000_RigidBody_EnablingGravityWorksPoC.py | 8 - ...ablingGravityWorksUsingNotificationsPoC.py | 8 - .../C14861498_ConfirmError_NoPxMesh.py | 8 - .../C14861500_DefaultSetting_ColliderShape.py | 5 - ...01_PhysXCollider_RenderMeshAutoAssigned.py | 7 +- ...4861502_PhysXCollider_AssetAutoAssigned.py | 7 +- ...C14861504_RenderMeshAsset_WithNoPxAsset.py | 9 +- ...78018_ShapeColliderWithNoShapeComponent.py | 5 - .../C19578021_ShapeCollider_CanBeAdded.py | 5 - ...19723164_ShapeColliders_WontCrashEditor.py | 5 - ...rShapeCollider_CollidesWithPhysXTerrain.py | 5 - .../C3510644_Collider_CollisionGroups.py | 8 - ...695_PhysXCollider_AddMultipleSurfaceFbx.py | 7 +- .../C4976227_Collider_NewGroup.py | 8 - .../C4976236_AddPhysxColliderComponent.py | 7 +- ...on_SameCollisionlayerSameCollisiongroup.py | 8 - ...n_SameCollisionGroupDiffCollisionLayers.py | 8 - ...44_Collider_SameGroupSameLayerCollision.py | 8 - ...976245_PhysXCollider_CollisionLayerTest.py | 8 - ...982593_PhysXCollider_CollisionLayerTest.py | 8 - ...82595_Collider_TriggerDisablesCollision.py | 8 - .../C4982797_Collider_ColliderOffset.py | 5 - ...4982798_Collider_ColliderRotationOffset.py | 5 - ...982800_PhysXColliderShape_CanBeSelected.py | 5 - ...982801_PhysXColliderShape_CanBeSelected.py | 5 - ...982802_PhysXColliderShape_CanBeSelected.py | 5 - .../C4982803_Enable_PxMesh_Option.py | 7 +- ...eRegion_DirectionHasNoAffectOnMagnitude.py | 8 - ...580_ForceRegion_SplineModifiedTransform.py | 9 - ...12905527_ForceRegion_MagnitudeDeviation.py | 9 - ...5528_ForceRegion_WithNonTriggerCollider.py | 15 +- ...5879_ForceRegion_HighLinearDampingForce.py | 8 - ...932040_ForceRegion_CubeExertsWorldForce.py | 8 - ...orceRegion_LocalSpaceForceOnRigidBodies.py | 8 - ...C5932042_PhysXForceRegion_LinearDamping.py | 8 - ...043_ForceRegion_SimpleDragOnRigidBodies.py | 5 - ...32044_ForceRegion_PointForceOnRigidBody.py | 8 - .../C5932045_ForceRegion_Spline.py | 8 - ...9_RigidBody_ForceRegionSpherePointForce.py | 8 - ...760_PhysXForceRegion_PointForceExertion.py | 8 - ...1_ForceRegion_PhysAssetExertsPointForce.py | 9 - ...763_ForceRegion_ForceRegionImpulsesCube.py | 5 - ..._ForceRegion_ForceRegionImpulsesCapsule.py | 5 - .../C5959765_ForceRegion_AssetGetsImpulsed.py | 5 - .../C5959808_ForceRegion_PositionOffset.py | 8 - .../C5959809_ForceRegion_RotationalOffset.py | 8 - ...0_ForceRegion_ForceRegionCombinesForces.py | 8 - ...ceRegion_ExertsSeveralForcesOnRigidBody.py | 5 - ...5968760_ForceRegion_CheckNetForceChange.py | 8 - ...90546_ForceRegion_SliceFileInstantiates.py | 8 - ...547_ForceRegion_ParentChildForceRegions.py | 8 - ...550_ForceRegion_WorldSpaceForceNegative.py | 8 - ...551_ForceRegion_LocalSpaceForceNegative.py | 8 - ...90552_ForceRegion_LinearDampingNegative.py | 8 - ...orceRegion_SimpleDragForceOnRigidBodies.py | 8 - ...C6090554_ForceRegion_PointForceNegative.py | 8 - ...5_ForceRegion_SplineFollowOnRigidBodies.py | 8 - .../C6321601_Force_HighValuesDirectionAxes.py | 9 - .../C14976307_Gravity_SetGravityWorks.py | 8 - .../{ => general}/C15425929_Undo_Redo.py | 8 - .../C19536274_GetCollisionName_PrintsName.py | 7 +- ...19536277_GetCollisionName_PrintsNothing.py | 7 +- ...2500_EditorComponents_WorldBodyBusWorks.py | 8 - ..._Verify_Terrain_RigidBody_Collider_Mesh.py | 8 - ...6131473_StaticSlice_OnDynamicSliceSpawn.py | 8 - ...18243580_Joints_Fixed2BodiesConstrained.py | 8 - .../C18243581_Joints_FixedBreakable.py | 8 - ...8243582_Joints_FixedLeadFollowerCollide.py | 8 - ...18243583_Joints_Hinge2BodiesConstrained.py | 8 - ...43584_Joints_HingeSoftLimitsConstrained.py | 5 - ...8243585_Joints_HingeNoLimitsConstrained.py | 8 - ...8243586_Joints_HingeLeadFollowerCollide.py | 8 - .../C18243587_Joints_HingeBreakable.py | 8 - ...C18243588_Joints_Ball2BodiesConstrained.py | 8 - ...243589_Joints_BallSoftLimitsConstrained.py | 5 - ...18243590_Joints_BallNoLimitsConstrained.py | 8 - ...18243591_Joints_BallLeadFollowerCollide.py | 8 - .../C18243592_Joints_BallBreakable.py | 8 - ...C18243593_Joints_GlobalFrameConstrained.py | 8 - .../physics/{ => joints}/JointsHelper.py | 4 - .../{ => material}/AddModifyDelete_Utils.py | 0 ...DefaultLibraryUpdatedAcrossLevels_after.py | 8 - ...efaultLibraryUpdatedAcrossLevels_before.py | 8 - ...735_Materials_DefaultLibraryConsistency.py | 8 - ...Materials_DefaultMaterialLibraryChanges.py | 5 - ...096740_Material_LibraryUpdatedCorrectly.py | 7 +- ...21_Material_ComponentsInSyncWithLibrary.py | 8 - ...935_Material_LibraryUpdatedAcrossLevels.py | 9 - ...s_CharacterControllerMaterialAssignment.py | 8 - ...al_AddModifyDeleteOnCharacterController.py | 8 - ...977601_Material_FrictionCombinePriority.py | 9 - ...526_Material_RestitutionCombinePriority.py | 8 - ...044455_Material_libraryChangesInstantly.py | 8 - .../C4044456_Material_FrictionCombine.py | 8 - .../C4044457_Material_RestitutionCombine.py | 8 - .../C4044459_Material_DynamicFriction.py | 8 - .../C4044460_Material_StaticFriction.py | 8 - .../C4044461_Material_Restitution.py | 8 - ...044694_Material_EmptyLibraryUsesDefault.py | 8 - ...4697_Material_PerfaceMaterialValidation.py | 8 - ...8315_Material_AddModifyDeleteOnCollider.py | 8 - ...577_Materials_MaterialAssignedToTerrain.py | 8 - ...25579_Material_AddModifyDeleteOnTerrain.py | 8 - .../C4925580_Material_RagdollBonesMaterial.py | 8 - ..._Material_AddModifyDeleteOnRagdollBones.py | 8 - .../C5296614_PhysXMaterial_ColliderShape.py | 8 - .../{ => material}/Physmaterial_Editor.py | 0 .../C13895144_Ragdoll_ChangeLevel.py | 8 - .../C14654882_Ragdoll_ragdollAPTest.py | 8 - .../C17411467_AddPhysxRagdollComponent.py | 8 - .../C28978033_Ragdoll_WorldBodyBusTests.py | 8 - .../C13351703_COM_NotIncludeTriggerShapes.py | 8 - ...13352089_RigidBodies_MaxAngularVelocity.py | 5 - ...4976194_RigidBody_PhysXComponentIsValid.py | 5 - ...76195_RigidBodies_InitialLinearVelocity.py | 8 - ...6197_RigidBodies_InitialAngularVelocity.py | 5 - ...9_RigidBodies_LinearDampingObjectMotion.py | 8 - ..._RigidBody_AngularDampingObjectRotation.py | 5 - .../C4976201_RigidBody_MassIsAssigned.py | 8 - ...igidBody_StopsWhenBelowKineticThreshold.py | 8 - .../C4976204_Verify_Start_Asleep_Condition.py | 8 - ...976206_RigidBodies_GravityEnabledActive.py | 8 - ...6207_PhysXRigidBodies_KinematicBehavior.py | 8 - .../C4976209_RigidBody_ComputesCOM.py | 8 - .../C4976210_COM_ManualSetting.py | 5 - ...8_RigidBodies_InertiaObjectsNotComputed.py | 8 - ...5340400_RigidBody_ManualMomentOfInertia.py | 8 - .../C12712452_ScriptCanvas_CollisionEvents.py | 8 - ...712453_ScriptCanvas_MultipleRaycastNode.py | 8 - ...54_ScriptCanvas_OverlapNodeVerification.py | 8 - ...2455_ScriptCanvas_ShapeCastVerification.py | 8 - .../C14195074_ScriptCanvas_PostUpdateEvent.py | 8 - .../C14902097_ScriptCanvas_PreUpdateEvent.py | 5 - ...14902098_ScriptCanvas_PostPhysicsUpdate.py | 8 - ...criptCanvas_SetKinematicTargetTransform.py | 8 - .../C6224408_ScriptCanvas_EntitySpawn.py | 8 - .../C6274125_ScriptCanvas_TriggerEvents.py | 8 - ...8019_Terrain_TerrainTexturePainterWorks.py | 5 - .../C15308217_NoCrash_LevelSwitch.py | 8 - .../C3510642_Terrain_NotCollideWithTerrain.py | 8 - ...8_PhysXTerrain_CollidesWithPhysXTerrain.py | 8 - ...ysxterrain_AddPhysxterrainNoEditorCrash.py | 8 - ..._MultipleTerrains_CheckWarningInConsole.py | 9 - ...89528_Terrain_MultipleTerrainComponents.py | 8 - ...31_Warning_TerrainSliceTerrainComponent.py | 8 - ...032082_Terrain_MultipleResolutionsValid.py | 8 - .../physics/{ => utils}/FileManagement.py | 0 .../{ => utils}/UtilTest_Managed_Files.py | 5 - .../UtilTest_Physmaterial_Editor.py | 2 - .../UtilTest_PhysxConfig_Default.py | 0 .../UtilTest_PhysxConfig_Override.py | 0 .../UtilTest_Tracer_PicksErrorsAndWarnings.py | 5 - 161 files changed, 316 insertions(+), 1333 deletions(-) create mode 100644 AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/asset_utils.py delete mode 100755 AutomatedTesting/Gem/PythonTests/physics/ImportPathHelper.py rename AutomatedTesting/Gem/PythonTests/physics/{ => character_controller}/C14654881_CharacterController_SwitchLevels.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C100000_RigidBody_EnablingGravityWorksPoC.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C14861498_ConfirmError_NoPxMesh.py (95%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C14861500_DefaultSetting_ColliderShape.py (95%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C14861501_PhysXCollider_RenderMeshAutoAssigned.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C14861502_PhysXCollider_AssetAutoAssigned.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C14861504_RenderMeshAsset_WithNoPxAsset.py (95%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C19578018_ShapeColliderWithNoShapeComponent.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C19578021_ShapeCollider_CanBeAdded.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C19723164_ShapeColliders_WontCrashEditor.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C3510644_Collider_CollisionGroups.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4976227_Collider_NewGroup.py (95%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4976236_AddPhysxColliderComponent.py (95%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4976244_Collider_SameGroupSameLayerCollision.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4976245_PhysXCollider_CollisionLayerTest.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982593_PhysXCollider_CollisionLayerTest.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982595_Collider_TriggerDisablesCollision.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982797_Collider_ColliderOffset.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982798_Collider_ColliderRotationOffset.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982800_PhysXColliderShape_CanBeSelected.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982801_PhysXColliderShape_CanBeSelected.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982802_PhysXColliderShape_CanBeSelected.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => collider}/C4982803_Enable_PxMesh_Option.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C12868580_ForceRegion_SplineModifiedTransform.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C12905527_ForceRegion_MagnitudeDeviation.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C12905528_ForceRegion_WithNonTriggerCollider.py (89%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C15845879_ForceRegion_HighLinearDampingForce.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5932040_ForceRegion_CubeExertsWorldForce.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5932042_PhysXForceRegion_LinearDamping.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5932043_ForceRegion_SimpleDragOnRigidBodies.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5932044_ForceRegion_PointForceOnRigidBody.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5932045_ForceRegion_Spline.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959759_RigidBody_ForceRegionSpherePointForce.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959760_PhysXForceRegion_PointForceExertion.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959761_ForceRegion_PhysAssetExertsPointForce.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959763_ForceRegion_ForceRegionImpulsesCube.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959765_ForceRegion_AssetGetsImpulsed.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959808_ForceRegion_PositionOffset.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959809_ForceRegion_RotationalOffset.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5959810_ForceRegion_ForceRegionCombinesForces.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C5968760_ForceRegion_CheckNetForceChange.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090546_ForceRegion_SliceFileInstantiates.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090547_ForceRegion_ParentChildForceRegions.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090550_ForceRegion_WorldSpaceForceNegative.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090551_ForceRegion_LocalSpaceForceNegative.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090552_ForceRegion_LinearDampingNegative.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090554_ForceRegion_PointForceNegative.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6090555_ForceRegion_SplineFollowOnRigidBodies.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => force_region}/C6321601_Force_HighValuesDirectionAxes.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C14976307_Gravity_SetGravityWorks.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C15425929_Undo_Redo.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C19536274_GetCollisionName_PrintsName.py (93%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C19536277_GetCollisionName_PrintsNothing.py (93%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C29032500_EditorComponents_WorldBodyBusWorks.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => general}/C6131473_StaticSlice_OnDynamicSliceSpawn.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243580_Joints_Fixed2BodiesConstrained.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243581_Joints_FixedBreakable.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243582_Joints_FixedLeadFollowerCollide.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243583_Joints_Hinge2BodiesConstrained.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243584_Joints_HingeSoftLimitsConstrained.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243585_Joints_HingeNoLimitsConstrained.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243586_Joints_HingeLeadFollowerCollide.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243587_Joints_HingeBreakable.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243588_Joints_Ball2BodiesConstrained.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243589_Joints_BallSoftLimitsConstrained.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243590_Joints_BallNoLimitsConstrained.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243591_Joints_BallLeadFollowerCollide.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243592_Joints_BallBreakable.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/C18243593_Joints_GlobalFrameConstrained.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => joints}/JointsHelper.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/AddModifyDelete_Utils.py (100%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15096735_Materials_DefaultLibraryConsistency.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15096737_Materials_DefaultMaterialLibraryChanges.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15096740_Material_LibraryUpdatedCorrectly.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15308221_Material_ComponentsInSyncWithLibrary.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15425935_Material_LibraryUpdatedAcrossLevels.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C15563573_Material_AddModifyDeleteOnCharacterController.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C18977601_Material_FrictionCombinePriority.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C18981526_Material_RestitutionCombinePriority.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044455_Material_libraryChangesInstantly.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044456_Material_FrictionCombine.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044457_Material_RestitutionCombine.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044459_Material_DynamicFriction.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044460_Material_StaticFriction.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044461_Material_Restitution.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044694_Material_EmptyLibraryUsesDefault.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4044697_Material_PerfaceMaterialValidation.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4888315_Material_AddModifyDeleteOnCollider.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4925577_Materials_MaterialAssignedToTerrain.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4925579_Material_AddModifyDeleteOnTerrain.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4925580_Material_RagdollBonesMaterial.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C4925582_Material_AddModifyDeleteOnRagdollBones.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/C5296614_PhysXMaterial_ColliderShape.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => material}/Physmaterial_Editor.py (100%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => ragdoll}/C13895144_Ragdoll_ChangeLevel.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => ragdoll}/C14654882_Ragdoll_ragdollAPTest.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => ragdoll}/C17411467_AddPhysxRagdollComponent.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => ragdoll}/C28978033_Ragdoll_WorldBodyBusTests.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C13351703_COM_NotIncludeTriggerShapes.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C13352089_RigidBodies_MaxAngularVelocity.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976194_RigidBody_PhysXComponentIsValid.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976195_RigidBodies_InitialLinearVelocity.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976197_RigidBodies_InitialAngularVelocity.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976199_RigidBodies_LinearDampingObjectMotion.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976200_RigidBody_AngularDampingObjectRotation.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976201_RigidBody_MassIsAssigned.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976204_Verify_Start_Asleep_Condition.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976206_RigidBodies_GravityEnabledActive.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976207_PhysXRigidBodies_KinematicBehavior.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976209_RigidBody_ComputesCOM.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976210_COM_ManualSetting.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C4976218_RigidBodies_InertiaObjectsNotComputed.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => rigid_body}/C5340400_RigidBody_ManualMomentOfInertia.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C12712452_ScriptCanvas_CollisionEvents.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C12712453_ScriptCanvas_MultipleRaycastNode.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C12712454_ScriptCanvas_OverlapNodeVerification.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C12712455_ScriptCanvas_ShapeCastVerification.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C14195074_ScriptCanvas_PostUpdateEvent.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C14902097_ScriptCanvas_PreUpdateEvent.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C14902098_ScriptCanvas_PostPhysicsUpdate.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C14976308_ScriptCanvas_SetKinematicTargetTransform.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C6224408_ScriptCanvas_EntitySpawn.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => script_canvas}/C6274125_ScriptCanvas_TriggerEvents.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C13508019_Terrain_TerrainTexturePainterWorks.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C15308217_NoCrash_LevelSwitch.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C3510642_Terrain_NotCollideWithTerrain.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C5689524_MultipleTerrains_CheckWarningInConsole.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C5689528_Terrain_MultipleTerrainComponents.py (96%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C5689531_Warning_TerrainSliceTerrainComponent.py (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => terrain}/C6032082_Terrain_MultipleResolutionsValid.py (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => utils}/FileManagement.py (100%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => utils}/UtilTest_Managed_Files.py (89%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => utils}/UtilTest_Physmaterial_Editor.py (99%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => utils}/UtilTest_PhysxConfig_Default.py (100%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => utils}/UtilTest_PhysxConfig_Override.py (100%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/physics/{ => utils}/UtilTest_Tracer_PicksErrorsAndWarnings.py (97%) mode change 100755 => 100644 diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/asset_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/asset_utils.py new file mode 100644 index 0000000000..ece7670a9e --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/asset_utils.py @@ -0,0 +1,47 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# Built-in Imports +from __future__ import annotations + +# Open 3D Engine Imports +import azlmbr.bus as bus +import azlmbr.asset as azasset +import azlmbr.math as math + + +class Asset: + """ + Used to find Asset Id by its path and path of asset by its Id + If a component has any asset property, then this class object can be called as: + asset_id = editor_python_test_tools.editor_entity_utils.EditorComponent.get_component_property_value() + asset = asset_utils.Asset(asset_id) + """ + def __init__(self, id: azasset.AssetId): + self.id: azasset.AssetId = id + + # Creation functions + @classmethod + def find_asset_by_path(cls, path: str, RegisterType: bool = False) -> Asset: + """ + :param path: Absolute file path of the asset + :param RegisterType: Whether to register the asset if it's not in the database, + default to false for the general case + :return: Asset object associated with file path + """ + asset_id = azasset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetIdByPath", path, math.Uuid(), RegisterType) + assert asset_id.is_valid(), f"Couldn't find Asset with path: {path}" + asset = cls(asset_id) + return asset + + # Methods + def get_path(self) -> str: + """ + :return: Absolute file path of Asset + """ + assert self.id.is_valid(), "Invalid Asset Id" + return azasset.AssetCatalogRequestBus(bus.Broadcast, "GetAssetPathById", self.id) diff --git a/AutomatedTesting/Gem/PythonTests/physics/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/physics/ImportPathHelper.py deleted file mode 100755 index 0e395664ad..0000000000 --- a/AutomatedTesting/Gem/PythonTests/physics/ImportPathHelper.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - -def init(): - import os - import sys - sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py index 2c5cca4f24..dad37297cc 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py @@ -13,25 +13,25 @@ import pytest import os import sys -from .FileManagement import FileManagement as fm +from .utils.FileManagement import FileManagement as fm sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') -@pytest.mark.parametrize("spec", ["all"]) +from base import TestAutomationBase + @pytest.mark.parametrize("project", ["AutomatedTesting"]) -@pytest.mark.system class TestAutomation(TestAutomationBase): @fm.file_revert("ragdollbones.physmaterial", r"AutomatedTesting\Levels\Physics\C4925582_Material_AddModifyDeleteOnRagdollBones") def test_C4925582_Material_AddModifyDeleteOnRagdollBones(self, request, workspace, editor): - from . import C4925582_Material_AddModifyDeleteOnRagdollBones as test_module + from .material import C4925582_Material_AddModifyDeleteOnRagdollBones as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C4925580_Material_RagdollBonesMaterial(self, request, workspace, editor): - from . import C4925580_Material_RagdollBonesMaterial as test_module + from .material import C4925580_Material_RagdollBonesMaterial as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -40,7 +40,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c15308221_material_componentsinsyncwithlibrary.physmaterial", r"AutomatedTesting\Levels\Physics\C15308221_Material_ComponentsInSyncWithLibrary") def test_C15308221_Material_ComponentsInSyncWithLibrary(self, request, workspace, editor): - from . import C15308221_Material_ComponentsInSyncWithLibrary as test_module + from .material import C15308221_Material_ComponentsInSyncWithLibrary as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -48,7 +48,7 @@ class TestAutomation(TestAutomationBase): # BUG: LY-107723") def test_C14976308_ScriptCanvas_SetKinematicTargetTransform(self, request, workspace, editor): - from . import C14976308_ScriptCanvas_SetKinematicTargetTransform as test_module + from .script_canvas import C14976308_ScriptCanvas_SetKinematicTargetTransform as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -58,7 +58,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c4925579_material_addmodifydeleteonterrain.physmaterial", r"AutomatedTesting\Levels\Physics\C4925579_Material_AddModifyDeleteOnTerrain") def test_C4925579_Material_AddModifyDeleteOnTerrain(self, request, workspace, editor): - from . import C4925579_Material_AddModifyDeleteOnTerrain as test_module + from .material import C4925579_Material_AddModifyDeleteOnTerrain as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -66,7 +66,7 @@ class TestAutomation(TestAutomationBase): # Failing, PhysXTerrain def test_C13508019_Terrain_TerrainTexturePainterWorks(self, request, workspace, editor): - from . import C13508019_Terrain_TerrainTexturePainterWorks as test_module + from .terrain import C13508019_Terrain_TerrainTexturePainterWorks as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -74,7 +74,7 @@ class TestAutomation(TestAutomationBase): # Failing, PhysXTerrain def test_C4925577_Materials_MaterialAssignedToTerrain(self, request, workspace, editor): - from . import C4925577_Materials_MaterialAssignedToTerrain as test_module + from .material import C4925577_Materials_MaterialAssignedToTerrain as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -82,7 +82,7 @@ class TestAutomation(TestAutomationBase): # Failing, PhysXTerrain def test_C15096735_Materials_DefaultLibraryConsistency(self, request, workspace, editor): - from . import C15096735_Materials_DefaultLibraryConsistency as test_module + from .material import C15096735_Materials_DefaultLibraryConsistency as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -92,13 +92,13 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("all_ones_1.physmaterial", r"AutomatedTesting\Levels\Physics\C15096737_Materials_DefaultMaterialLibraryChanges") @fm.file_override("default.physxconfiguration", "C15096737_Materials_DefaultMaterialLibraryChanges.physxconfiguration", "AutomatedTesting") def test_C15096737_Materials_DefaultMaterialLibraryChanges(self, request, workspace, editor): - from . import C15096737_Materials_DefaultMaterialLibraryChanges as test_module + from .material import C15096737_Materials_DefaultMaterialLibraryChanges as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C4976242_Collision_SameCollisionlayerSameCollisiongroup(self, request, workspace, editor): - from . import C4976242_Collision_SameCollisionlayerSameCollisiongroup as test_module + from .collider import C4976242_Collision_SameCollisionlayerSameCollisiongroup as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -109,7 +109,7 @@ class TestAutomation(TestAutomationBase): "Material_DefaultLibraryUpdatedAcrossLevels_before.physxconfiguration", "AutomatedTesting", search_subdirs=True) def test_levels_before(self, request, workspace, editor): - from . import C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before as test_module_0 + from .material import C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before as test_module_0 expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module_0, expected_lines, unexpected_lines) @@ -119,7 +119,7 @@ class TestAutomation(TestAutomationBase): "Material_DefaultLibraryUpdatedAcrossLevels_after.physxconfiguration", "AutomatedTesting", search_subdirs=True) def test_levels_after(self, request, workspace, editor): - from . import C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after as test_module_1 + from .material import C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after as test_module_1 expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module_1, expected_lines, unexpected_lines) @@ -128,7 +128,7 @@ class TestAutomation(TestAutomationBase): test_levels_after(self, request, workspace, editor) def test_C14654882_Ragdoll_ragdollAPTest(self, request, workspace, editor): - from . import C14654882_Ragdoll_ragdollAPTest as test_module + from .ragdoll import C14654882_Ragdoll_ragdollAPTest as test_module expected_lines = [] unexpected_lines = test_module.UnexpectedLines.lines @@ -136,14 +136,14 @@ class TestAutomation(TestAutomationBase): @fm.file_override("default.physxconfiguration", "C12712454_ScriptCanvas_OverlapNodeVerification.physxconfiguration") def test_C12712454_ScriptCanvas_OverlapNodeVerification(self, request, workspace, editor): - from . import C12712454_ScriptCanvas_OverlapNodeVerification as test_module + from .script_canvas import C12712454_ScriptCanvas_OverlapNodeVerification as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C4044460_Material_StaticFriction(self, request, workspace, editor): - from . import C4044460_Material_StaticFriction as test_module + from .material import C4044460_Material_StaticFriction as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -154,7 +154,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c4888315_material_addmodifydeleteoncollider.physmaterial", r"AutomatedTesting\Levels\Physics\C4888315_Material_AddModifyDeleteOnCollider") def test_C4888315_Material_AddModifyDeleteOnCollider(self, request, workspace, editor): - from . import C4888315_Material_AddModifyDeleteOnCollider as test_module + from .material import C4888315_Material_AddModifyDeleteOnCollider as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -164,7 +164,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c15563573_material_addmodifydeleteoncharactercontroller.physmaterial", r"AutomatedTesting\Levels\Physics\C15563573_Material_AddModifyDeleteOnCharacterController") def test_C15563573_Material_AddModifyDeleteOnCharacterController(self, request, workspace, editor): - from . import C15563573_Material_AddModifyDeleteOnCharacterController as test_module + from .material import C15563573_Material_AddModifyDeleteOnCharacterController as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -173,7 +173,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c4888315_material_addmodifydeleteoncollider.physmaterial", r"AutomatedTesting\Levels\Physics\C4888315_Material_AddModifyDeleteOnCollider") def test_C4888315_Material_AddModifyDeleteOnCollider(self, request, workspace, editor): - from . import C4888315_Material_AddModifyDeleteOnCollider as test_module + from .material import C4888315_Material_AddModifyDeleteOnCollider as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -185,7 +185,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c15563573_material_addmodifydeleteoncharactercontroller.physmaterial", r"AutomatedTesting\Levels\Physics\C15563573_Material_AddModifyDeleteOnCharacterController") def test_C15563573_Material_AddModifyDeleteOnCharacterController(self, request, workspace, editor): - from . import C15563573_Material_AddModifyDeleteOnCharacterController as test_module + from .material import C15563573_Material_AddModifyDeleteOnCharacterController as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -194,7 +194,7 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("c4044455_material_librarychangesinstantly.physmaterial", r"AutomatedTesting\Levels\Physics\C4044455_Material_LibraryChangesInstantly") def test_C4044455_Material_libraryChangesInstantly(self, request, workspace, editor): - from . import C4044455_Material_libraryChangesInstantly as test_module + from .material import C4044455_Material_libraryChangesInstantly as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -204,103 +204,103 @@ class TestAutomation(TestAutomationBase): @fm.file_revert("C15425935_Material_LibraryUpdatedAcrossLevels.physmaterial", r"AutomatedTesting\Levels\Physics\C15425935_Material_LibraryUpdatedAcrossLevels") def test_C15425935_Material_LibraryUpdatedAcrossLevels(self, request, workspace, editor): - from . import C15425935_Material_LibraryUpdatedAcrossLevels as test_module + from .material import C15425935_Material_LibraryUpdatedAcrossLevels as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C4976199_RigidBodies_LinearDampingObjectMotion(self, request, workspace, editor): - from . import C4976199_RigidBodies_LinearDampingObjectMotion as test_module + from .rigid_body import C4976199_RigidBodies_LinearDampingObjectMotion as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5689518_PhysXTerrain_CollidesWithPhysXTerrain(self, request, workspace, editor): - from . import C5689518_PhysXTerrain_CollidesWithPhysXTerrain as test_module + from .terrain import C5689518_PhysXTerrain_CollidesWithPhysXTerrain as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(self, request, workspace, editor): - from . import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module + from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C29032500_EditorComponents_WorldBodyBusWorks(self, request, workspace, editor): - from . import C29032500_EditorComponents_WorldBodyBusWorks as test_module + from .general import C29032500_EditorComponents_WorldBodyBusWorks as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C14861498_ConfirmError_NoPxMesh(self, request, workspace, editor, launcher_platform): - from . import C14861498_ConfirmError_NoPxMesh as test_module + from .collider import C14861498_ConfirmError_NoPxMesh as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5959763_ForceRegion_ForceRegionImpulsesCube(self, request, workspace, editor, launcher_platform): - from . import C5959763_ForceRegion_ForceRegionImpulsesCube as test_module + from .force_region import C5959763_ForceRegion_ForceRegionImpulsesCube as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5689531_Warning_TerrainSliceTerrainComponent(self, request, workspace, editor, launcher_platform): - from . import C5689531_Warning_TerrainSliceTerrainComponent as test_module + from .terrain import C5689531_Warning_TerrainSliceTerrainComponent as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(self, request, workspace, editor, launcher_platform): - from . import C5689522_Physxterrain_AddPhysxterrainNoEditorCrash as test_module + from .terrain import C5689522_Physxterrain_AddPhysxterrainNoEditorCrash as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5689524_MultipleTerrains_CheckWarningInConsole(self, request, workspace, editor, launcher_platform): - from . import C5689524_MultipleTerrains_CheckWarningInConsole as test_module + from .terrain import C5689524_MultipleTerrains_CheckWarningInConsole as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5689528_Terrain_MultipleTerrainComponents(self, request, workspace, editor, launcher_platform): - from . import C5689528_Terrain_MultipleTerrainComponents as test_module + from .terrain import C5689528_Terrain_MultipleTerrainComponents as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C5689528_Terrain_MultipleTerrainComponents(self, request, workspace, editor, launcher_platform): - from . import C5689528_Terrain_MultipleTerrainComponents as test_module + from .terrain import C5689528_Terrain_MultipleTerrainComponents as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C6321601_Force_HighValuesDirectionAxes(self, request, workspace, editor, launcher_platform): - from . import C6321601_Force_HighValuesDirectionAxes as test_module + from .force_region import C6321601_Force_HighValuesDirectionAxes as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C6032082_Terrain_MultipleResolutionsValid(self, request, workspace, editor, launcher_platform): - from . import C6032082_Terrain_MultipleResolutionsValid as test_module + from .terrain import C6032082_Terrain_MultipleResolutionsValid as test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) def test_C12905527_ForceRegion_MagnitudeDeviation(self, request, workspace, editor, launcher_platform): - from . import C12905527_ForceRegion_MagnitudeDeviation as test_module + from .force_region import C12905527_ForceRegion_MagnitudeDeviation as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -308,7 +308,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243580_Joints_Fixed2BodiesConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243580_Joints_Fixed2BodiesConstrained as test_module + from .joints import C18243580_Joints_Fixed2BodiesConstrained as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -316,7 +316,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243583_Joints_Hinge2BodiesConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243583_Joints_Hinge2BodiesConstrained as test_module + from .joints import C18243583_Joints_Hinge2BodiesConstrained as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -324,7 +324,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243588_Joints_Ball2BodiesConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243588_Joints_Ball2BodiesConstrained as test_module + from .joints import C18243588_Joints_Ball2BodiesConstrained as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -332,7 +332,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243581_Joints_FixedBreakable(self, request, workspace, editor, launcher_platform): - from . import C18243581_Joints_FixedBreakable as test_module + from .joints import C18243581_Joints_FixedBreakable as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -340,7 +340,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243587_Joints_HingeBreakable(self, request, workspace, editor, launcher_platform): - from . import C18243587_Joints_HingeBreakable as test_module + from .joints import C18243587_Joints_HingeBreakable as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -348,7 +348,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243592_Joints_BallBreakable(self, request, workspace, editor, launcher_platform): - from . import C18243592_Joints_BallBreakable as test_module + from .joints import C18243592_Joints_BallBreakable as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -356,7 +356,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243585_Joints_HingeNoLimitsConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243585_Joints_HingeNoLimitsConstrained as test_module + from .joints import C18243585_Joints_HingeNoLimitsConstrained as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -364,7 +364,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243590_Joints_BallNoLimitsConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243590_Joints_BallNoLimitsConstrained as test_module + from .joints import C18243590_Joints_BallNoLimitsConstrained as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -372,7 +372,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243582_Joints_FixedLeadFollowerCollide(self, request, workspace, editor, launcher_platform): - from . import C18243582_Joints_FixedLeadFollowerCollide as test_module + from .joints import C18243582_Joints_FixedLeadFollowerCollide as test_module expected_lines = [] unexpected_lines = ["Assert"] @@ -380,7 +380,7 @@ class TestAutomation(TestAutomationBase): # Removed from active suite to meet 60 minutes limit in AR job def test_C18243593_Joints_GlobalFrameConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243593_Joints_GlobalFrameConstrained as test_module + from .joints import C18243593_Joints_GlobalFrameConstrained as test_module expected_lines = [] unexpected_lines = ["Assert"] diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py index bda4dae82b..de4828e36a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py @@ -12,7 +12,7 @@ import pytest import os import sys -from .FileManagement import FileManagement as fm +from .utils.FileManagement import FileManagement as fm from ly_test_tools import LAUNCHERS sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') @@ -29,58 +29,58 @@ revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', ' class TestAutomation(TestAutomationBase): def test_C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform): - from . import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module + from .collider import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(self, request, workspace, editor, launcher_platform): - from . import C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies as test_module + from .force_region import C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4044459_Material_DynamicFriction.setreg_override', 'AutomatedTesting/Registry') def test_C4044459_Material_DynamicFriction(self, request, workspace, editor, launcher_platform): - from . import C4044459_Material_DynamicFriction as test_module + from .material import C4044459_Material_DynamicFriction as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976243_Collision_SameCollisionGroupDiffCollisionLayers(self, request, workspace, editor, launcher_platform): - from . import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module + from .collider import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C14654881_CharacterController_SwitchLevels(self, request, workspace, editor, launcher_platform): - from . import C14654881_CharacterController_SwitchLevels as test_module + from .character_controller import C14654881_CharacterController_SwitchLevels as test_module self._run_test(request, workspace, editor, test_module) def test_C17411467_AddPhysxRagdollComponent(self, request, workspace, editor, launcher_platform): - from . import C17411467_AddPhysxRagdollComponent as test_module + from .ragdoll import C17411467_AddPhysxRagdollComponent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C12712453_ScriptCanvas_MultipleRaycastNode(self, request, workspace, editor, launcher_platform): - from . import C12712453_ScriptCanvas_MultipleRaycastNode as test_module + from .script_canvas import C12712453_ScriptCanvas_MultipleRaycastNode as test_module # Fixme: unexpected_lines = ["Assert"] + test_module.Lines.unexpected self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4982593_PhysXCollider_CollisionLayer.setreg_override', 'AutomatedTesting/Registry') def test_C4982593_PhysXCollider_CollisionLayerTest(self, request, workspace, editor, launcher_platform): - from . import C4982593_PhysXCollider_CollisionLayerTest as test_module + from .collider import C4982593_PhysXCollider_CollisionLayerTest as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C18243586_Joints_HingeLeadFollowerCollide(self, request, workspace, editor, launcher_platform): - from . import C18243586_Joints_HingeLeadFollowerCollide as test_module + from .joints import C18243586_Joints_HingeLeadFollowerCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982803_Enable_PxMesh_Option(self, request, workspace, editor, launcher_platform): - from . import C4982803_Enable_PxMesh_Option as test_module + from .collider import C4982803_Enable_PxMesh_Option as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(self, request, workspace, editor, launcher_platform): - from . import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module - self._run_test(request, workspace, editor, test_module) \ No newline at end of file + from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module + self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py index 75e226fba1..ce68bb10b5 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py @@ -12,7 +12,7 @@ import inspect from ly_test_tools import LAUNCHERS from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite -from .FileManagement import FileManagement as fm +from .utils.FileManagement import FileManagement as fm # Custom test spec, it provides functionality to override files class EditorSingleTest_WithFileOverrides(EditorSingleTest): @@ -54,7 +54,6 @@ class EditorSingleTest_WithFileOverrides(EditorSingleTest): fm._restore_file(f, file_list[f]) -@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarly.") @pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) @@ -67,14 +66,14 @@ class TestAutomation(EditorTestSuite): ######################################### # Non-atomic tests: These need to be run in a single editor because they have custom setup and teardown class C4044459_Material_DynamicFriction(EditorSingleTest_WithFileOverrides): - from . import C4044459_Material_DynamicFriction as test_module + from .material import C4044459_Material_DynamicFriction as test_module files_to_override = [ ('physxsystemconfiguration.setreg', 'C4044459_Material_DynamicFriction.setreg_override') ] base_dir = "AutomatedTesting/Registry" class C4982593_PhysXCollider_CollisionLayerTest(EditorSingleTest_WithFileOverrides): - from . import C4982593_PhysXCollider_CollisionLayerTest as test_module + from .collider import C4982593_PhysXCollider_CollisionLayerTest as test_module files_to_override = [ ('physxsystemconfiguration.setreg', 'C4982593_PhysXCollider_CollisionLayer.setreg_override') ] @@ -82,268 +81,268 @@ class TestAutomation(EditorTestSuite): ######################################### class C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(EditorSharedTest): - from . import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module + from .collider import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module class C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(EditorSharedTest): - from . import C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies as test_module + from .force_region import C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies as test_module class C15425929_Undo_Redo(EditorSharedTest): - from . import C15425929_Undo_Redo as test_module + from .general import C15425929_Undo_Redo as test_module class C4976243_Collision_SameCollisionGroupDiffCollisionLayers(EditorSharedTest): - from . import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module + from .collider import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module class C14654881_CharacterController_SwitchLevels(EditorSharedTest): - from . import C14654881_CharacterController_SwitchLevels as test_module + from .character_controller import C14654881_CharacterController_SwitchLevels as test_module class C17411467_AddPhysxRagdollComponent(EditorSharedTest): - from . import C17411467_AddPhysxRagdollComponent as test_module + from .ragdoll import C17411467_AddPhysxRagdollComponent as test_module class C12712453_ScriptCanvas_MultipleRaycastNode(EditorSharedTest): - from . import C12712453_ScriptCanvas_MultipleRaycastNode as test_module + from .script_canvas import C12712453_ScriptCanvas_MultipleRaycastNode as test_module class C18243586_Joints_HingeLeadFollowerCollide(EditorSharedTest): - from . import C18243586_Joints_HingeLeadFollowerCollide as test_module + from .joints import C18243586_Joints_HingeLeadFollowerCollide as test_module class C4982803_Enable_PxMesh_Option(EditorSharedTest): - from . import C4982803_Enable_PxMesh_Option as test_module + from .collider import C4982803_Enable_PxMesh_Option as test_module class C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(EditorSharedTest): - from . import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module + from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module class C3510642_Terrain_NotCollideWithTerrain(EditorSharedTest): - from . import C3510642_Terrain_NotCollideWithTerrain as test_module + from .terrain import C3510642_Terrain_NotCollideWithTerrain as test_module class C4976195_RigidBodies_InitialLinearVelocity(EditorSharedTest): - from . import C4976195_RigidBodies_InitialLinearVelocity as test_module + from .rigid_body import C4976195_RigidBodies_InitialLinearVelocity as test_module class C4976206_RigidBodies_GravityEnabledActive(EditorSharedTest): - from . import C4976206_RigidBodies_GravityEnabledActive as test_module + from .rigid_body import C4976206_RigidBodies_GravityEnabledActive as test_module class C4976207_PhysXRigidBodies_KinematicBehavior(EditorSharedTest): - from . import C4976207_PhysXRigidBodies_KinematicBehavior as test_module + from .rigid_body import C4976207_PhysXRigidBodies_KinematicBehavior as test_module class C5932042_PhysXForceRegion_LinearDamping(EditorSharedTest): - from . import C5932042_PhysXForceRegion_LinearDamping as test_module + from .force_region import C5932042_PhysXForceRegion_LinearDamping as test_module class C5932043_ForceRegion_SimpleDragOnRigidBodies(EditorSharedTest): - from . import C5932043_ForceRegion_SimpleDragOnRigidBodies as test_module + from .force_region import C5932043_ForceRegion_SimpleDragOnRigidBodies as test_module class C5959760_PhysXForceRegion_PointForceExertion(EditorSharedTest): - from . import C5959760_PhysXForceRegion_PointForceExertion as test_module + from .force_region import C5959760_PhysXForceRegion_PointForceExertion as test_module class C5959764_ForceRegion_ForceRegionImpulsesCapsule(EditorSharedTest): - from . import C5959764_ForceRegion_ForceRegionImpulsesCapsule as test_module + from .force_region import C5959764_ForceRegion_ForceRegionImpulsesCapsule as test_module class C5340400_RigidBody_ManualMomentOfInertia(EditorSharedTest): - from . import C5340400_RigidBody_ManualMomentOfInertia as test_module + from .rigid_body import C5340400_RigidBody_ManualMomentOfInertia as test_module class C4976210_COM_ManualSetting(EditorSharedTest): - from . import C4976210_COM_ManualSetting as test_module + from .rigid_body import C4976210_COM_ManualSetting as test_module class C4976194_RigidBody_PhysXComponentIsValid(EditorSharedTest): - from . import C4976194_RigidBody_PhysXComponentIsValid as test_module + from .rigid_body import C4976194_RigidBody_PhysXComponentIsValid as test_module class C5932045_ForceRegion_Spline(EditorSharedTest): - from . import C5932045_ForceRegion_Spline as test_module + from .force_region import C5932045_ForceRegion_Spline as test_module class C4982797_Collider_ColliderOffset(EditorSharedTest): - from . import C4982797_Collider_ColliderOffset as test_module + from .collider import C4982797_Collider_ColliderOffset as test_module class C4976200_RigidBody_AngularDampingObjectRotation(EditorSharedTest): - from . import C4976200_RigidBody_AngularDampingObjectRotation as test_module + from .rigid_body import C4976200_RigidBody_AngularDampingObjectRotation as test_module class C5689529_Verify_Terrain_RigidBody_Collider_Mesh(EditorSharedTest): - from . import C5689529_Verify_Terrain_RigidBody_Collider_Mesh as test_module + from .general import C5689529_Verify_Terrain_RigidBody_Collider_Mesh as test_module class C5959810_ForceRegion_ForceRegionCombinesForces(EditorSharedTest): - from . import C5959810_ForceRegion_ForceRegionCombinesForces as test_module + from .force_region import C5959810_ForceRegion_ForceRegionCombinesForces as test_module class C5959765_ForceRegion_AssetGetsImpulsed(EditorSharedTest): - from . import C5959765_ForceRegion_AssetGetsImpulsed as test_module + from .force_region import C5959765_ForceRegion_AssetGetsImpulsed as test_module class C6274125_ScriptCanvas_TriggerEvents(EditorSharedTest): - from . import C6274125_ScriptCanvas_TriggerEvents as test_module + from .script_canvas import C6274125_ScriptCanvas_TriggerEvents as test_module # needs to be updated to log for unexpected lines # expected_lines = test_module.LogLines.expected_lines class C6090554_ForceRegion_PointForceNegative(EditorSharedTest): - from . import C6090554_ForceRegion_PointForceNegative as test_module + from .force_region import C6090554_ForceRegion_PointForceNegative as test_module class C6090550_ForceRegion_WorldSpaceForceNegative(EditorSharedTest): - from . import C6090550_ForceRegion_WorldSpaceForceNegative as test_module + from .force_region import C6090550_ForceRegion_WorldSpaceForceNegative as test_module class C6090552_ForceRegion_LinearDampingNegative(EditorSharedTest): - from . import C6090552_ForceRegion_LinearDampingNegative as test_module + from .force_region import C6090552_ForceRegion_LinearDampingNegative as test_module class C5968760_ForceRegion_CheckNetForceChange(EditorSharedTest): - from . import C5968760_ForceRegion_CheckNetForceChange as test_module + from .force_region import C5968760_ForceRegion_CheckNetForceChange as test_module class C12712452_ScriptCanvas_CollisionEvents(EditorSharedTest): - from . import C12712452_ScriptCanvas_CollisionEvents as test_module + from .script_canvas import C12712452_ScriptCanvas_CollisionEvents as test_module class C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(EditorSharedTest): - from . import C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude as test_module + from .force_region import C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude as test_module class C4976204_Verify_Start_Asleep_Condition(EditorSharedTest): - from . import C4976204_Verify_Start_Asleep_Condition as test_module + from .rigid_body import C4976204_Verify_Start_Asleep_Condition as test_module class C6090546_ForceRegion_SliceFileInstantiates(EditorSharedTest): - from . import C6090546_ForceRegion_SliceFileInstantiates as test_module + from .force_region import C6090546_ForceRegion_SliceFileInstantiates as test_module class C6090551_ForceRegion_LocalSpaceForceNegative(EditorSharedTest): - from . import C6090551_ForceRegion_LocalSpaceForceNegative as test_module + from .force_region import C6090551_ForceRegion_LocalSpaceForceNegative as test_module class C6090553_ForceRegion_SimpleDragForceOnRigidBodies(EditorSharedTest): - from . import C6090553_ForceRegion_SimpleDragForceOnRigidBodies as test_module + from .force_region import C6090553_ForceRegion_SimpleDragForceOnRigidBodies as test_module class C4976209_RigidBody_ComputesCOM(EditorSharedTest): - from . import C4976209_RigidBody_ComputesCOM as test_module + from .rigid_body import C4976209_RigidBody_ComputesCOM as test_module class C4976201_RigidBody_MassIsAssigned(EditorSharedTest): - from . import C4976201_RigidBody_MassIsAssigned as test_module + from .rigid_body import C4976201_RigidBody_MassIsAssigned as test_module class C12868580_ForceRegion_SplineModifiedTransform(EditorSharedTest): - from . import C12868580_ForceRegion_SplineModifiedTransform as test_module + from .force_region import C12868580_ForceRegion_SplineModifiedTransform as test_module class C12712455_ScriptCanvas_ShapeCastVerification(EditorSharedTest): - from . import C12712455_ScriptCanvas_ShapeCastVerification as test_module + from .script_canvas import C12712455_ScriptCanvas_ShapeCastVerification as test_module class C4976197_RigidBodies_InitialAngularVelocity(EditorSharedTest): - from . import C4976197_RigidBodies_InitialAngularVelocity as test_module + from .rigid_body import C4976197_RigidBodies_InitialAngularVelocity as test_module class C6090555_ForceRegion_SplineFollowOnRigidBodies(EditorSharedTest): - from . import C6090555_ForceRegion_SplineFollowOnRigidBodies as test_module + from .force_region import C6090555_ForceRegion_SplineFollowOnRigidBodies as test_module class C6131473_StaticSlice_OnDynamicSliceSpawn(EditorSharedTest): - from . import C6131473_StaticSlice_OnDynamicSliceSpawn as test_module + from .general import C6131473_StaticSlice_OnDynamicSliceSpawn as test_module class C5959808_ForceRegion_PositionOffset(EditorSharedTest): - from . import C5959808_ForceRegion_PositionOffset as test_module + from .force_region import C5959808_ForceRegion_PositionOffset as test_module @pytest.mark.xfail(reason="Something with the CryRenderer disabling is causing this test to fail now.") class C13895144_Ragdoll_ChangeLevel(EditorSharedTest): - from . import C13895144_Ragdoll_ChangeLevel as test_module + from .ragdoll import C13895144_Ragdoll_ChangeLevel as test_module class C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(EditorSharedTest): - from . import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module + from .force_region import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module @pytest.mark.xfail(reason="This test will sometimes fail as the ball will continue to roll before the timeout is reached.") class C4976202_RigidBody_StopsWhenBelowKineticThreshold(EditorSharedTest): - from . import C4976202_RigidBody_StopsWhenBelowKineticThreshold as test_module + from .rigid_body import C4976202_RigidBody_StopsWhenBelowKineticThreshold as test_module class C13351703_COM_NotIncludeTriggerShapes(EditorSharedTest): - from . import C13351703_COM_NotIncludeTriggerShapes as test_module + from .rigid_body import C13351703_COM_NotIncludeTriggerShapes as test_module class C5296614_PhysXMaterial_ColliderShape(EditorSharedTest): - from . import C5296614_PhysXMaterial_ColliderShape as test_module + from .material import C5296614_PhysXMaterial_ColliderShape as test_module class C4982595_Collider_TriggerDisablesCollision(EditorSharedTest): - from . import C4982595_Collider_TriggerDisablesCollision as test_module + from .collider import C4982595_Collider_TriggerDisablesCollision as test_module class C14976307_Gravity_SetGravityWorks(EditorSharedTest): - from . import C14976307_Gravity_SetGravityWorks as test_module + from .general import C14976307_Gravity_SetGravityWorks as test_module class C4044694_Material_EmptyLibraryUsesDefault(EditorSharedTest): - from . import C4044694_Material_EmptyLibraryUsesDefault as test_module + from .material import C4044694_Material_EmptyLibraryUsesDefault as test_module class C15845879_ForceRegion_HighLinearDampingForce(EditorSharedTest): - from . import C15845879_ForceRegion_HighLinearDampingForce as test_module + from .force_region import C15845879_ForceRegion_HighLinearDampingForce as test_module class C4976218_RigidBodies_InertiaObjectsNotComputed(EditorSharedTest): - from . import C4976218_RigidBodies_InertiaObjectsNotComputed as test_module + from .rigid_body import C4976218_RigidBodies_InertiaObjectsNotComputed as test_module class C14902098_ScriptCanvas_PostPhysicsUpdate(EditorSharedTest): - from . import C14902098_ScriptCanvas_PostPhysicsUpdate as test_module + from .script_canvas import C14902098_ScriptCanvas_PostPhysicsUpdate as test_module # Note: Test needs to be updated to log for unexpected lines # unexpected_lines = ["Assert"] + test_module.Lines.unexpected class C5959761_ForceRegion_PhysAssetExertsPointForce(EditorSharedTest): - from . import C5959761_ForceRegion_PhysAssetExertsPointForce as test_module + from .force_region import C5959761_ForceRegion_PhysAssetExertsPointForce as test_module # Marking the Test as expected to fail using the xfail decorator due to sporadic failure on Automated Review: SPEC-3146 # The test still runs, but a failure of the test doesn't result in the test run failing @pytest.mark.xfail(reason="Test Sporadically fails with message [ NOT FOUND ] Success: Bar1 : Expected angular velocity") class C13352089_RigidBodies_MaxAngularVelocity(EditorSharedTest): - from . import C13352089_RigidBodies_MaxAngularVelocity as test_module + from .rigid_body import C13352089_RigidBodies_MaxAngularVelocity as test_module class C18243584_Joints_HingeSoftLimitsConstrained(EditorSharedTest): - from . import C18243584_Joints_HingeSoftLimitsConstrained as test_module + from .joints import C18243584_Joints_HingeSoftLimitsConstrained as test_module class C18243589_Joints_BallSoftLimitsConstrained(EditorSharedTest): - from . import C18243589_Joints_BallSoftLimitsConstrained as test_module + from .joints import C18243589_Joints_BallSoftLimitsConstrained as test_module class C18243591_Joints_BallLeadFollowerCollide(EditorSharedTest): - from . import C18243591_Joints_BallLeadFollowerCollide as test_module + from .joints import C18243591_Joints_BallLeadFollowerCollide as test_module class C19578018_ShapeColliderWithNoShapeComponent(EditorSharedTest): - from . import C19578018_ShapeColliderWithNoShapeComponent as test_module + from .collider import C19578018_ShapeColliderWithNoShapeComponent as test_module class C14861500_DefaultSetting_ColliderShape(EditorSharedTest): - from . import C14861500_DefaultSetting_ColliderShape as test_module + from .collider import C14861500_DefaultSetting_ColliderShape as test_module class C19723164_ShapeCollider_WontCrashEditor(EditorSharedTest): - from . import C19723164_ShapeColliders_WontCrashEditor as test_module + from .collider import C19723164_ShapeColliders_WontCrashEditor as test_module class C4982800_PhysXColliderShape_CanBeSelected(EditorSharedTest): - from . import C4982800_PhysXColliderShape_CanBeSelected as test_module + from .collider import C4982800_PhysXColliderShape_CanBeSelected as test_module class C4982801_PhysXColliderShape_CanBeSelected(EditorSharedTest): - from . import C4982801_PhysXColliderShape_CanBeSelected as test_module + from .collider import C4982801_PhysXColliderShape_CanBeSelected as test_module class C4982802_PhysXColliderShape_CanBeSelected(EditorSharedTest): - from . import C4982802_PhysXColliderShape_CanBeSelected as test_module + from .collider import C4982802_PhysXColliderShape_CanBeSelected as test_module class C12905528_ForceRegion_WithNonTriggerCollider(EditorSharedTest): - from . import C12905528_ForceRegion_WithNonTriggerCollider as test_module + from .force_region import C12905528_ForceRegion_WithNonTriggerCollider as test_module # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] class C5932040_ForceRegion_CubeExertsWorldForce(EditorSharedTest): - from . import C5932040_ForceRegion_CubeExertsWorldForce as test_module + from .force_region import C5932040_ForceRegion_CubeExertsWorldForce as test_module class C5932044_ForceRegion_PointForceOnRigidBody(EditorSharedTest): - from . import C5932044_ForceRegion_PointForceOnRigidBody as test_module + from .force_region import C5932044_ForceRegion_PointForceOnRigidBody as test_module class C5959759_RigidBody_ForceRegionSpherePointForce(EditorSharedTest): - from . import C5959759_RigidBody_ForceRegionSpherePointForce as test_module + from .force_region import C5959759_RigidBody_ForceRegionSpherePointForce as test_module class C5959809_ForceRegion_RotationalOffset(EditorSharedTest): - from . import C5959809_ForceRegion_RotationalOffset as test_module + from .force_region import C5959809_ForceRegion_RotationalOffset as test_module class C15096740_Material_LibraryUpdatedCorrectly(EditorSharedTest): - from . import C15096740_Material_LibraryUpdatedCorrectly as test_module + from .material import C15096740_Material_LibraryUpdatedCorrectly as test_module class C4976236_AddPhysxColliderComponent(EditorSharedTest): - from . import C4976236_AddPhysxColliderComponent as test_module + from .collider import C4976236_AddPhysxColliderComponent as test_module @pytest.mark.xfail(reason="This will fail due to this issue ATOM-15487.") class C14861502_PhysXCollider_AssetAutoAssigned(EditorSharedTest): - from . import C14861502_PhysXCollider_AssetAutoAssigned as test_module + from .collider import C14861502_PhysXCollider_AssetAutoAssigned as test_module class C14861501_PhysXCollider_RenderMeshAutoAssigned(EditorSharedTest): - from . import C14861501_PhysXCollider_RenderMeshAutoAssigned as test_module + from .collider import C14861501_PhysXCollider_RenderMeshAutoAssigned as test_module class C4044695_PhysXCollider_AddMultipleSurfaceFbx(EditorSharedTest): - from . import C4044695_PhysXCollider_AddMultipleSurfaceFbx as test_module + from .collider import C4044695_PhysXCollider_AddMultipleSurfaceFbx as test_module class C14861504_RenderMeshAsset_WithNoPxAsset(EditorSharedTest): - from . import C14861504_RenderMeshAsset_WithNoPxAsset as test_module + from .collider import C14861504_RenderMeshAsset_WithNoPxAsset as test_module class C100000_RigidBody_EnablingGravityWorksPoC(EditorSharedTest): - from . import C100000_RigidBody_EnablingGravityWorksPoC as test_module + from .collider import C100000_RigidBody_EnablingGravityWorksPoC as test_module class C4982798_Collider_ColliderRotationOffset(EditorSharedTest): - from . import C4982798_Collider_ColliderRotationOffset as test_module + from .collider import C4982798_Collider_ColliderRotationOffset as test_module class C15308217_NoCrash_LevelSwitch(EditorSharedTest): - from . import C15308217_NoCrash_LevelSwitch as test_module + from .terrain import C15308217_NoCrash_LevelSwitch as test_module class C6090547_ForceRegion_ParentChildForceRegions(EditorSharedTest): - from . import C6090547_ForceRegion_ParentChildForceRegions as test_module + from .force_region import C6090547_ForceRegion_ParentChildForceRegions as test_module class C19578021_ShapeCollider_CanBeAdded(EditorSharedTest): - from . import C19578021_ShapeCollider_CanBeAdded as test_module + from .collider import C19578021_ShapeCollider_CanBeAdded as test_module class C15425929_Undo_Redo(EditorSharedTest): - from . import C15425929_Undo_Redo as test_module + from .general import C15425929_Undo_Redo as test_module diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py index 3d86db1014..fca7e0e3af 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py @@ -12,7 +12,7 @@ import pytest import os import sys -from .FileManagement import FileManagement as fm +from .utils.FileManagement import FileManagement as fm from ly_test_tools import LAUNCHERS sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') @@ -30,219 +30,219 @@ class TestAutomation(TestAutomationBase): @revert_physics_config def test_C3510642_Terrain_NotCollideWithTerrain(self, request, workspace, editor, launcher_platform): - from . import C3510642_Terrain_NotCollideWithTerrain as test_module + from .terrain import C3510642_Terrain_NotCollideWithTerrain as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976195_RigidBodies_InitialLinearVelocity(self, request, workspace, editor, launcher_platform): - from . import C4976195_RigidBodies_InitialLinearVelocity as test_module + from .rigid_body import C4976195_RigidBodies_InitialLinearVelocity as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976206_RigidBodies_GravityEnabledActive(self, request, workspace, editor, launcher_platform): - from . import C4976206_RigidBodies_GravityEnabledActive as test_module + from .rigid_body import C4976206_RigidBodies_GravityEnabledActive as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976207_PhysXRigidBodies_KinematicBehavior(self, request, workspace, editor, launcher_platform): - from . import C4976207_PhysXRigidBodies_KinematicBehavior as test_module + from .rigid_body import C4976207_PhysXRigidBodies_KinematicBehavior as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5932042_PhysXForceRegion_LinearDamping(self, request, workspace, editor, launcher_platform): - from . import C5932042_PhysXForceRegion_LinearDamping as test_module + from .force_region import C5932042_PhysXForceRegion_LinearDamping as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5932043_ForceRegion_SimpleDragOnRigidBodies(self, request, workspace, editor, launcher_platform): - from . import C5932043_ForceRegion_SimpleDragOnRigidBodies as test_module + from .force_region import C5932043_ForceRegion_SimpleDragOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5959760_PhysXForceRegion_PointForceExertion(self, request, workspace, editor, launcher_platform): - from . import C5959760_PhysXForceRegion_PointForceExertion as test_module + from .force_region import C5959760_PhysXForceRegion_PointForceExertion as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5959764_ForceRegion_ForceRegionImpulsesCapsule(self, request, workspace, editor, launcher_platform): - from . import C5959764_ForceRegion_ForceRegionImpulsesCapsule as test_module + from .force_region import C5959764_ForceRegion_ForceRegionImpulsesCapsule as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5340400_RigidBody_ManualMomentOfInertia(self, request, workspace, editor, launcher_platform): - from . import C5340400_RigidBody_ManualMomentOfInertia as test_module + from .rigid_body import C5340400_RigidBody_ManualMomentOfInertia as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976210_COM_ManualSetting(self, request, workspace, editor, launcher_platform): - from . import C4976210_COM_ManualSetting as test_module + from .rigid_body import C4976210_COM_ManualSetting as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976194_RigidBody_PhysXComponentIsValid(self, request, workspace, editor, launcher_platform): - from . import C4976194_RigidBody_PhysXComponentIsValid as test_module + from .rigid_body import C4976194_RigidBody_PhysXComponentIsValid as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5932045_ForceRegion_Spline(self, request, workspace, editor, launcher_platform): - from . import C5932045_ForceRegion_Spline as test_module + from .force_region import C5932045_ForceRegion_Spline as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4044457_Material_RestitutionCombine.setreg_override', 'AutomatedTesting/Registry') def test_C4044457_Material_RestitutionCombine(self, request, workspace, editor, launcher_platform): - from . import C4044457_Material_RestitutionCombine as test_module + from .material import C4044457_Material_RestitutionCombine as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4044456_Material_FrictionCombine.setreg_override', 'AutomatedTesting/Registry') def test_C4044456_Material_FrictionCombine(self, request, workspace, editor, launcher_platform): - from . import C4044456_Material_FrictionCombine as test_module + from .material import C4044456_Material_FrictionCombine as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982797_Collider_ColliderOffset(self, request, workspace, editor, launcher_platform): - from . import C4982797_Collider_ColliderOffset as test_module + from .collider import C4982797_Collider_ColliderOffset as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976200_RigidBody_AngularDampingObjectRotation(self, request, workspace, editor, launcher_platform): - from . import C4976200_RigidBody_AngularDampingObjectRotation as test_module + from .rigid_body import C4976200_RigidBody_AngularDampingObjectRotation as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5689529_Verify_Terrain_RigidBody_Collider_Mesh(self, request, workspace, editor, launcher_platform): - from . import C5689529_Verify_Terrain_RigidBody_Collider_Mesh as test_module + from .general import C5689529_Verify_Terrain_RigidBody_Collider_Mesh as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5959810_ForceRegion_ForceRegionCombinesForces(self, request, workspace, editor, launcher_platform): - from . import C5959810_ForceRegion_ForceRegionCombinesForces as test_module + from .force_region import C5959810_ForceRegion_ForceRegionCombinesForces as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5959765_ForceRegion_AssetGetsImpulsed(self, request, workspace, editor, launcher_platform): - from . import C5959765_ForceRegion_AssetGetsImpulsed as test_module + from .force_region import C5959765_ForceRegion_AssetGetsImpulsed as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6274125_ScriptCanvas_TriggerEvents(self, request, workspace, editor, launcher_platform): - from . import C6274125_ScriptCanvas_TriggerEvents as test_module + from .script_canvas import C6274125_ScriptCanvas_TriggerEvents as test_module # FIXME: expected_lines = test_module.LogLines.expected_lines self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090554_ForceRegion_PointForceNegative(self, request, workspace, editor, launcher_platform): - from . import C6090554_ForceRegion_PointForceNegative as test_module + from .force_region import C6090554_ForceRegion_PointForceNegative as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090550_ForceRegion_WorldSpaceForceNegative(self, request, workspace, editor, launcher_platform): - from . import C6090550_ForceRegion_WorldSpaceForceNegative as test_module + from .force_region import C6090550_ForceRegion_WorldSpaceForceNegative as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090552_ForceRegion_LinearDampingNegative(self, request, workspace, editor, launcher_platform): - from . import C6090552_ForceRegion_LinearDampingNegative as test_module + from .force_region import C6090552_ForceRegion_LinearDampingNegative as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5968760_ForceRegion_CheckNetForceChange(self, request, workspace, editor, launcher_platform): - from . import C5968760_ForceRegion_CheckNetForceChange as test_module + from .force_region import C5968760_ForceRegion_CheckNetForceChange as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C12712452_ScriptCanvas_CollisionEvents(self, request, workspace, editor, launcher_platform): - from . import C12712452_ScriptCanvas_CollisionEvents as test_module + from .script_canvas import C12712452_ScriptCanvas_CollisionEvents as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(self, request, workspace, editor, launcher_platform): - from . import C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude as test_module + from .force_region import C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976204_Verify_Start_Asleep_Condition(self, request, workspace, editor, launcher_platform): - from . import C4976204_Verify_Start_Asleep_Condition as test_module + from .rigid_body import C4976204_Verify_Start_Asleep_Condition as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090546_ForceRegion_SliceFileInstantiates(self, request, workspace, editor, launcher_platform): - from . import C6090546_ForceRegion_SliceFileInstantiates as test_module + from .force_region import C6090546_ForceRegion_SliceFileInstantiates as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090551_ForceRegion_LocalSpaceForceNegative(self, request, workspace, editor, launcher_platform): - from . import C6090551_ForceRegion_LocalSpaceForceNegative as test_module + from .force_region import C6090551_ForceRegion_LocalSpaceForceNegative as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090553_ForceRegion_SimpleDragForceOnRigidBodies(self, request, workspace, editor, launcher_platform): - from . import C6090553_ForceRegion_SimpleDragForceOnRigidBodies as test_module + from .force_region import C6090553_ForceRegion_SimpleDragForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976209_RigidBody_ComputesCOM(self, request, workspace, editor, launcher_platform): - from . import C4976209_RigidBody_ComputesCOM as test_module + from .rigid_body import C4976209_RigidBody_ComputesCOM as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976201_RigidBody_MassIsAssigned(self, request, workspace, editor, launcher_platform): - from . import C4976201_RigidBody_MassIsAssigned as test_module + from .rigid_body import C4976201_RigidBody_MassIsAssigned as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C18981526_Material_RestitutionCombinePriority.setreg_override', 'AutomatedTesting/Registry') def test_C18981526_Material_RestitutionCombinePriority(self, request, workspace, editor, launcher_platform): - from . import C18981526_Material_RestitutionCombinePriority as test_module + from .material import C18981526_Material_RestitutionCombinePriority as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C12868580_ForceRegion_SplineModifiedTransform(self, request, workspace, editor, launcher_platform): - from . import C12868580_ForceRegion_SplineModifiedTransform as test_module + from .force_region import C12868580_ForceRegion_SplineModifiedTransform as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C12712455_ScriptCanvas_ShapeCastVerification(self, request, workspace, editor, launcher_platform): - from . import C12712455_ScriptCanvas_ShapeCastVerification as test_module + from .script_canvas import C12712455_ScriptCanvas_ShapeCastVerification as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976197_RigidBodies_InitialAngularVelocity(self, request, workspace, editor, launcher_platform): - from . import C4976197_RigidBodies_InitialAngularVelocity as test_module + from .rigid_body import C4976197_RigidBodies_InitialAngularVelocity as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090555_ForceRegion_SplineFollowOnRigidBodies(self, request, workspace, editor, launcher_platform): - from . import C6090555_ForceRegion_SplineFollowOnRigidBodies as test_module + from .force_region import C6090555_ForceRegion_SplineFollowOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6131473_StaticSlice_OnDynamicSliceSpawn(self, request, workspace, editor, launcher_platform): - from . import C6131473_StaticSlice_OnDynamicSliceSpawn as test_module + from .general import C6131473_StaticSlice_OnDynamicSliceSpawn as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5959808_ForceRegion_PositionOffset(self, request, workspace, editor, launcher_platform): - from . import C5959808_ForceRegion_PositionOffset as test_module + from .force_region import C5959808_ForceRegion_PositionOffset as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C18977601_Material_FrictionCombinePriority.setreg_override', 'AutomatedTesting/Registry') def test_C18977601_Material_FrictionCombinePriority(self, request, workspace, editor, launcher_platform): - from . import C18977601_Material_FrictionCombinePriority as test_module + from .material import C18977601_Material_FrictionCombinePriority as test_module self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( reason="Something with the CryRenderer disabling is causing this test to fail now.") @revert_physics_config def test_C13895144_Ragdoll_ChangeLevel(self, request, workspace, editor, launcher_platform): - from . import C13895144_Ragdoll_ChangeLevel as test_module + from .ragdoll import C13895144_Ragdoll_ChangeLevel as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(self, request, workspace, editor, launcher_platform): - from . import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module + from .force_region import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module self._run_test(request, workspace, editor, test_module) # Marking the test as an expected failure due to sporadic failure on Automated Review: LYN-2580 @@ -252,96 +252,96 @@ class TestAutomation(TestAutomationBase): @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4044697_Material_PerfaceMaterialValidation.setreg_override', 'AutomatedTesting/Registry') def test_C4044697_Material_PerfaceMaterialValidation(self, request, workspace, editor, launcher_platform): - from . import C4044697_Material_PerfaceMaterialValidation as test_module + from .material import C4044697_Material_PerfaceMaterialValidation as test_module self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( reason="This test will sometimes fail as the ball will continue to roll before the timeout is reached.") @revert_physics_config def test_C4976202_RigidBody_StopsWhenBelowKineticThreshold(self, request, workspace, editor, launcher_platform): - from . import C4976202_RigidBody_StopsWhenBelowKineticThreshold as test_module + from .rigid_body import C4976202_RigidBody_StopsWhenBelowKineticThreshold as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C13351703_COM_NotIncludeTriggerShapes(self, request, workspace, editor, launcher_platform): - from . import C13351703_COM_NotIncludeTriggerShapes as test_module + from .rigid_body import C13351703_COM_NotIncludeTriggerShapes as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5296614_PhysXMaterial_ColliderShape(self, request, workspace, editor, launcher_platform): - from . import C5296614_PhysXMaterial_ColliderShape as test_module + from .material import C5296614_PhysXMaterial_ColliderShape as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982595_Collider_TriggerDisablesCollision(self, request, workspace, editor, launcher_platform): - from . import C4982595_Collider_TriggerDisablesCollision as test_module + from .collider import C4982595_Collider_TriggerDisablesCollision as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C14976307_Gravity_SetGravityWorks(self, request, workspace, editor, launcher_platform): - from . import C14976307_Gravity_SetGravityWorks as test_module + from .general import C14976307_Gravity_SetGravityWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.setreg_override', 'AutomatedTesting/Registry') def test_C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(self, request, workspace, editor, launcher_platform): - from . import C15556261_PhysXMaterials_CharacterControllerMaterialAssignment as test_module + from .material import C15556261_PhysXMaterials_CharacterControllerMaterialAssignment as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4044694_Material_EmptyLibraryUsesDefault(self, request, workspace, editor, launcher_platform): - from . import C4044694_Material_EmptyLibraryUsesDefault as test_module + from .material import C4044694_Material_EmptyLibraryUsesDefault as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C15845879_ForceRegion_HighLinearDampingForce(self, request, workspace, editor, launcher_platform): - from . import C15845879_ForceRegion_HighLinearDampingForce as test_module + from .force_region import C15845879_ForceRegion_HighLinearDampingForce as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4976218_RigidBodies_InertiaObjectsNotComputed(self, request, workspace, editor, launcher_platform): - from . import C4976218_RigidBodies_InertiaObjectsNotComputed as test_module + from .rigid_body import C4976218_RigidBodies_InertiaObjectsNotComputed as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C14902098_ScriptCanvas_PostPhysicsUpdate(self, request, workspace, editor, launcher_platform): - from . import C14902098_ScriptCanvas_PostPhysicsUpdate as test_module + from .script_canvas import C14902098_ScriptCanvas_PostPhysicsUpdate as test_module # Fixme: unexpected_lines = ["Assert"] + test_module.Lines.unexpected self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4976245_PhysXCollider_CollisionLayerTest.setreg_override', 'AutomatedTesting/Registry') def test_C4976245_PhysXCollider_CollisionLayerTest(self, request, workspace, editor, launcher_platform): - from . import C4976245_PhysXCollider_CollisionLayerTest as test_module + from .collider import C4976245_PhysXCollider_CollisionLayerTest as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4976244_Collider_SameGroupSameLayerCollision.setreg_override', 'AutomatedTesting/Registry') def test_C4976244_Collider_SameGroupSameLayerCollision(self, request, workspace, editor, launcher_platform): - from . import C4976244_Collider_SameGroupSameLayerCollision as test_module + from .collider import C4976244_Collider_SameGroupSameLayerCollision as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxdefaultsceneconfiguration.setreg','C14195074_ScriptCanvas_PostUpdateEvent.setreg_override', 'AutomatedTesting/Registry') def test_C14195074_ScriptCanvas_PostUpdateEvent(self, request, workspace, editor, launcher_platform): - from . import C14195074_ScriptCanvas_PostUpdateEvent as test_module + from .script_canvas import C14195074_ScriptCanvas_PostUpdateEvent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4044461_Material_Restitution.setreg_override', 'AutomatedTesting/Registry') def test_C4044461_Material_Restitution(self, request, workspace, editor, launcher_platform): - from . import C4044461_Material_Restitution as test_module + from .material import C4044461_Material_Restitution as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxdefaultsceneconfiguration.setreg','C14902097_ScriptCanvas_PreUpdateEvent.setreg_override', 'AutomatedTesting/Registry') def test_C14902097_ScriptCanvas_PreUpdateEvent(self, request, workspace, editor, launcher_platform): - from . import C14902097_ScriptCanvas_PreUpdateEvent as test_module + from .script_canvas import C14902097_ScriptCanvas_PreUpdateEvent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C5959761_ForceRegion_PhysAssetExertsPointForce(self, request, workspace, editor, launcher_platform): - from . import C5959761_ForceRegion_PhysAssetExertsPointForce as test_module + from .force_region import C5959761_ForceRegion_PhysAssetExertsPointForce as test_module self._run_test(request, workspace, editor, test_module) # Marking the Test as expected to fail using the xfail decorator due to sporadic failure on Automated Review: SPEC-3146 @@ -349,138 +349,138 @@ class TestAutomation(TestAutomationBase): @pytest.mark.xfail(reason="Test Sporadically fails with message [ NOT FOUND ] Success: Bar1 : Expected angular velocity") @revert_physics_config def test_C13352089_RigidBodies_MaxAngularVelocity(self, request, workspace, editor, launcher_platform): - from . import C13352089_RigidBodies_MaxAngularVelocity as test_module + from .rigid_body import C13352089_RigidBodies_MaxAngularVelocity as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C18243584_Joints_HingeSoftLimitsConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243584_Joints_HingeSoftLimitsConstrained as test_module + from .joints import C18243584_Joints_HingeSoftLimitsConstrained as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C18243589_Joints_BallSoftLimitsConstrained(self, request, workspace, editor, launcher_platform): - from . import C18243589_Joints_BallSoftLimitsConstrained as test_module + from .joints import C18243589_Joints_BallSoftLimitsConstrained as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C18243591_Joints_BallLeadFollowerCollide(self, request, workspace, editor, launcher_platform): - from . import C18243591_Joints_BallLeadFollowerCollide as test_module + from .joints import C18243591_Joints_BallLeadFollowerCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C4976227_Collider_NewGroup.setreg_override', 'AutomatedTesting/Registry') def test_C4976227_Collider_NewGroup(self, request, workspace, editor, launcher_platform): - from . import C4976227_Collider_NewGroup as test_module + from .collider import C4976227_Collider_NewGroup as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C19578018_ShapeColliderWithNoShapeComponent(self, request, workspace, editor, launcher_platform): - from . import C19578018_ShapeColliderWithNoShapeComponent as test_module + from .collider import C19578018_ShapeColliderWithNoShapeComponent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C14861500_DefaultSetting_ColliderShape(self, request, workspace, editor, launcher_platform): - from . import C14861500_DefaultSetting_ColliderShape as test_module + from .collider import C14861500_DefaultSetting_ColliderShape as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C19723164_ShapeCollider_WontCrashEditor(self, request, workspace, editor, launcher_platform): - from . import C19723164_ShapeColliders_WontCrashEditor as test_module + from .collider import C19723164_ShapeColliders_WontCrashEditor as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982800_PhysXColliderShape_CanBeSelected(self, request, workspace, editor, launcher_platform): - from . import C4982800_PhysXColliderShape_CanBeSelected as test_module + from .collider import C4982800_PhysXColliderShape_CanBeSelected as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982801_PhysXColliderShape_CanBeSelected(self, request, workspace, editor, launcher_platform): - from . import C4982801_PhysXColliderShape_CanBeSelected as test_module + from .collider import C4982801_PhysXColliderShape_CanBeSelected as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982802_PhysXColliderShape_CanBeSelected(self, request, workspace, editor, launcher_platform): - from . import C4982802_PhysXColliderShape_CanBeSelected as test_module + from .collider import C4982802_PhysXColliderShape_CanBeSelected as test_module self._run_test(request, workspace, editor, test_module) def test_C12905528_ForceRegion_WithNonTriggerCollider(self, request, workspace, editor, launcher_platform): - from . import C12905528_ForceRegion_WithNonTriggerCollider as test_module + from .force_region import C12905528_ForceRegion_WithNonTriggerCollider as test_module # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] self._run_test(request, workspace, editor, test_module) def test_C5932040_ForceRegion_CubeExertsWorldForce(self, request, workspace, editor, launcher_platform): - from . import C5932040_ForceRegion_CubeExertsWorldForce as test_module + from .force_region import C5932040_ForceRegion_CubeExertsWorldForce as test_module self._run_test(request, workspace, editor, test_module) def test_C5932044_ForceRegion_PointForceOnRigidBody(self, request, workspace, editor, launcher_platform): - from . import C5932044_ForceRegion_PointForceOnRigidBody as test_module + from .force_region import C5932044_ForceRegion_PointForceOnRigidBody as test_module self._run_test(request, workspace, editor, test_module) def test_C5959759_RigidBody_ForceRegionSpherePointForce(self, request, workspace, editor, launcher_platform): - from . import C5959759_RigidBody_ForceRegionSpherePointForce as test_module + from .force_region import C5959759_RigidBody_ForceRegionSpherePointForce as test_module self._run_test(request, workspace, editor, test_module) def test_C5959809_ForceRegion_RotationalOffset(self, request, workspace, editor, launcher_platform): - from . import C5959809_ForceRegion_RotationalOffset as test_module + from .force_region import C5959809_ForceRegion_RotationalOffset as test_module self._run_test(request, workspace, editor, test_module) def test_C15096740_Material_LibraryUpdatedCorrectly(self, request, workspace, editor, launcher_platform): - from . import C15096740_Material_LibraryUpdatedCorrectly as test_module + from .material import C15096740_Material_LibraryUpdatedCorrectly as test_module self._run_test(request, workspace, editor, test_module) def test_C4976236_AddPhysxColliderComponent(self, request, workspace, editor, launcher_platform): - from . import C4976236_AddPhysxColliderComponent as test_module + from .collider import C4976236_AddPhysxColliderComponent as test_module self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( reason="This will fail due to this issue ATOM-15487.") def test_C14861502_PhysXCollider_AssetAutoAssigned(self, request, workspace, editor, launcher_platform): - from . import C14861502_PhysXCollider_AssetAutoAssigned as test_module + from .collider import C14861502_PhysXCollider_AssetAutoAssigned as test_module self._run_test(request, workspace, editor, test_module) def test_C14861501_PhysXCollider_RenderMeshAutoAssigned(self, request, workspace, editor, launcher_platform): - from . import C14861501_PhysXCollider_RenderMeshAutoAssigned as test_module + from .collider import C14861501_PhysXCollider_RenderMeshAutoAssigned as test_module self._run_test(request, workspace, editor, test_module) def test_C4044695_PhysXCollider_AddMultipleSurfaceFbx(self, request, workspace, editor, launcher_platform): - from . import C4044695_PhysXCollider_AddMultipleSurfaceFbx as test_module + from .collider import C4044695_PhysXCollider_AddMultipleSurfaceFbx as test_module self._run_test(request, workspace, editor, test_module) def test_C14861504_RenderMeshAsset_WithNoPxAsset(self, request, workspace, editor, launcher_platform): - from . import C14861504_RenderMeshAsset_WithNoPxAsset as test_module + from .collider import C14861504_RenderMeshAsset_WithNoPxAsset as test_module self._run_test(request, workspace, editor, test_module) def test_C100000_RigidBody_EnablingGravityWorksPoC(self, request, workspace, editor, launcher_platform): - from . import C100000_RigidBody_EnablingGravityWorksPoC as test_module + from .collider import C100000_RigidBody_EnablingGravityWorksPoC as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config @fm.file_override('physxsystemconfiguration.setreg','C3510644_Collider_CollisionGroups.setreg_override', 'AutomatedTesting/Registry') def test_C3510644_Collider_CollisionGroups(self, request, workspace, editor, launcher_platform): - from . import C3510644_Collider_CollisionGroups as test_module + from .collider import C3510644_Collider_CollisionGroups as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C4982798_Collider_ColliderRotationOffset(self, request, workspace, editor, launcher_platform): - from . import C4982798_Collider_ColliderRotationOffset as test_module + from .collider import C4982798_Collider_ColliderRotationOffset as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C15308217_NoCrash_LevelSwitch(self, request, workspace, editor, launcher_platform): - from . import C15308217_NoCrash_LevelSwitch as test_module + from .terrain import C15308217_NoCrash_LevelSwitch as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C6090547_ForceRegion_ParentChildForceRegions(self, request, workspace, editor, launcher_platform): - from . import C6090547_ForceRegion_ParentChildForceRegions as test_module + from .force_region import C6090547_ForceRegion_ParentChildForceRegions as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C19578021_ShapeCollider_CanBeAdded(self, request, workspace, editor, launcher_platform): - from . import C19578021_ShapeCollider_CanBeAdded as test_module + from .collider import C19578021_ShapeCollider_CanBeAdded as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config def test_C15425929_Undo_Redo(self, request, workspace, editor, launcher_platform): - from . import C15425929_Undo_Redo as test_module + from .general import C15425929_Undo_Redo as test_module self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py index 255016ddd6..0346df2ebd 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py @@ -12,7 +12,7 @@ import pytest import os import sys -from .FileManagement import FileManagement as fm +from .utils.FileManagement import FileManagement as fm from ly_test_tools import LAUNCHERS sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') @@ -30,13 +30,13 @@ class TestAutomation(TestAutomationBase): ## Seems to be flaky, need to investigate def test_C19536274_GetCollisionName_PrintsName(self, request, workspace, editor, launcher_platform): - from . import C19536274_GetCollisionName_PrintsName as test_module + from .general import C19536274_GetCollisionName_PrintsName as test_module # Fixme: expected_lines=["Layer Name: Right"] self._run_test(request, workspace, editor, test_module) ## Seems to be flaky, need to investigate def test_C19536277_GetCollisionName_PrintsNothing(self, request, workspace, editor, launcher_platform): - from . import C19536277_GetCollisionName_PrintsNothing as test_module + from .general import C19536277_GetCollisionName_PrintsNothing as test_module # All groups present in the PhysX Collider that could show up in test # Fixme: collision_groups = ["All", "None", "All_NoTouchBend", "All_3", "None_1", "All_NoTouchBend_1", "All_2", "None_1_1", "All_NoTouchBend_1_1", "All_1", "None_1_1_1", "All_NoTouchBend_1_1_1", "All_4", "None_1_1_1_1", "All_NoTouchBend_1_1_1_1", "GroupLeft", "GroupRight"] # Fixme: for group in collision_groups: @@ -49,5 +49,5 @@ class TestAutomation(TestAutomationBase): reason="Editor crashes and errors about files accessed by multiple processes appear in the log.") @revert_physics_config def test_C15425929_Undo_Redo(self, request, workspace, editor, launcher_platform): - from . import C15425929_Undo_Redo as test_module + from .general import C15425929_Undo_Redo as test_module self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Utils.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Utils.py index 9f4edba18b..a3fd5c741f 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Utils.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Utils.py @@ -29,14 +29,14 @@ class TestUtils(TestAutomationBase): :param request: Built in pytest object, and is needed to call the pytest "addfinalizer" teardown command. :editor: Fixture containing editor details """ - from . import UtilTest_Physmaterial_Editor as physmaterial_editor_test_module + from .utils import UtilTest_Physmaterial_Editor as physmaterial_editor_test_module expected_lines = [] unexpected_lines = ["Assert"] self._run_test(request, workspace, editor, physmaterial_editor_test_module, expected_lines, unexpected_lines) def test_UtilTest_Tracer_PicksErrorsAndWarnings(self, request, workspace, editor): - from . import UtilTest_Tracer_PicksErrorsAndWarnings as testcase_module + from .utils import UtilTest_Tracer_PicksErrorsAndWarnings as testcase_module self._run_test(request, workspace, editor, testcase_module, [], []) def test_FileManagement_FindingFiles(self, workspace): @@ -262,7 +262,7 @@ class TestUtils(TestAutomationBase): ) @fm.file_override("default.physxconfiguration", "UtilTest_PhysxConfig_Override.physxconfiguration") def test_UtilTest_Managed_Files(self, request, workspace, editor): - from . import UtilTest_Managed_Files as test_module + from .utils import UtilTest_Managed_Files as test_module expected_lines = [] unexpected_lines = ["Assert"] diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py b/AutomatedTesting/Gem/PythonTests/physics/character_controller/C14654881_CharacterController_SwitchLevels.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py rename to AutomatedTesting/Gem/PythonTests/physics/character_controller/C14654881_CharacterController_SwitchLevels.py index 975c5ee787..3976bcf25c --- a/AutomatedTesting/Gem/PythonTests/physics/C14654881_CharacterController_SwitchLevels.py +++ b/AutomatedTesting/Gem/PythonTests/physics/character_controller/C14654881_CharacterController_SwitchLevels.py @@ -53,11 +53,6 @@ def C14654881_CharacterController_SwitchLevels(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -93,8 +88,5 @@ def C14654881_CharacterController_SwitchLevels(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14654881_CharacterController_SwitchLevels) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C100000_RigidBody_EnablingGravityWorksPoC.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C100000_RigidBody_EnablingGravityWorksPoC.py index 58d92fd313..f3d3e02d8e --- a/AutomatedTesting/Gem/PythonTests/physics/C100000_RigidBody_EnablingGravityWorksPoC.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C100000_RigidBody_EnablingGravityWorksPoC.py @@ -25,11 +25,6 @@ class Tests(): def C100000_RigidBody_EnablingGravityWorksPoC(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -77,8 +72,5 @@ def C100000_RigidBody_EnablingGravityWorksPoC(): helper.exit_game_mode(Tests.exit_game_mode) if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C100000_RigidBody_EnablingGravityWorksPoC) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py index 77e8c73604..997ea8a5a6 --- a/AutomatedTesting/Gem/PythonTests/physics/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py @@ -24,11 +24,6 @@ def C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -84,8 +79,5 @@ def C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(): helper.exit_game_mode(Tests.exit_game_mode) if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861498_ConfirmError_NoPxMesh.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C14861498_ConfirmError_NoPxMesh.py index 622f2aac35..731f114b8c --- a/AutomatedTesting/Gem/PythonTests/physics/C14861498_ConfirmError_NoPxMesh.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861498_ConfirmError_NoPxMesh.py @@ -48,11 +48,6 @@ def C14861498_ConfirmError_NoPxMesh(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -85,8 +80,5 @@ def C14861498_ConfirmError_NoPxMesh(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14861498_ConfirmError_NoPxMesh) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861500_DefaultSetting_ColliderShape.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C14861500_DefaultSetting_ColliderShape.py index 0827ee540a..aed856f530 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861500_DefaultSetting_ColliderShape.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861500_DefaultSetting_ColliderShape.py @@ -40,9 +40,7 @@ def C14861500_DefaultSetting_ColliderShape(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -70,8 +68,5 @@ def C14861500_DefaultSetting_ColliderShape(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14861500_DefaultSetting_ColliderShape) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py index 1a4fe471a4..73c94a2dfb --- a/AutomatedTesting/Gem/PythonTests/physics/C14861501_PhysXCollider_RenderMeshAutoAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py @@ -48,13 +48,11 @@ def C14861501_PhysXCollider_RenderMeshAutoAssigned(): import os # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset # Asset paths STATIC_MESH = os.path.join("assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.azmodel") @@ -91,8 +89,5 @@ def C14861501_PhysXCollider_RenderMeshAutoAssigned(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14861501_PhysXCollider_RenderMeshAutoAssigned) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861502_PhysXCollider_AssetAutoAssigned.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C14861502_PhysXCollider_AssetAutoAssigned.py index 490708007e..b8c0e4a529 --- a/AutomatedTesting/Gem/PythonTests/physics/C14861502_PhysXCollider_AssetAutoAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861502_PhysXCollider_AssetAutoAssigned.py @@ -47,13 +47,11 @@ def C14861502_PhysXCollider_AssetAutoAssigned(): import os # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset # Open 3D Engine Imports import azlmbr.legacy.general as general @@ -93,8 +91,5 @@ def C14861502_PhysXCollider_AssetAutoAssigned(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14861502_PhysXCollider_AssetAutoAssigned) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861504_RenderMeshAsset_WithNoPxAsset.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C14861504_RenderMeshAsset_WithNoPxAsset.py index 589245e884..1a63f478fd --- a/AutomatedTesting/Gem/PythonTests/physics/C14861504_RenderMeshAsset_WithNoPxAsset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C14861504_RenderMeshAsset_WithNoPxAsset.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def run(): +def C14861504_RenderMeshAsset_WithNoPxAsset(): """ Summary: Create entity with Mesh component and assign a render mesh that has no physics asset to the Mesh component. @@ -52,14 +52,12 @@ def run(): import os # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset # Open 3D Engine Imports import azlmbr.asset as azasset @@ -102,4 +100,5 @@ def run(): if __name__ == "__main__": - run() + from editor_python_test_tools.utils import Report + Report.start_test(C14861504_RenderMeshAsset_WithNoPxAsset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C19578018_ShapeColliderWithNoShapeComponent.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C19578018_ShapeColliderWithNoShapeComponent.py index 478910e56c..3da42eb40f --- a/AutomatedTesting/Gem/PythonTests/physics/C19578018_ShapeColliderWithNoShapeComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C19578018_ShapeColliderWithNoShapeComponent.py @@ -47,9 +47,7 @@ def C19578018_ShapeColliderWithNoShapeComponent(): """ # Built-in Imports - import ImportPathHelper as imports - imports.init() # Helper Imports from editor_python_test_tools.utils import Report @@ -92,8 +90,5 @@ def C19578018_ShapeColliderWithNoShapeComponent(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C19578018_ShapeColliderWithNoShapeComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C19578021_ShapeCollider_CanBeAdded.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C19578021_ShapeCollider_CanBeAdded.py index cf5aac6e98..0ec9908f2d --- a/AutomatedTesting/Gem/PythonTests/physics/C19578021_ShapeCollider_CanBeAdded.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C19578021_ShapeCollider_CanBeAdded.py @@ -44,9 +44,7 @@ def C19578021_ShapeCollider_CanBeAdded(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -90,8 +88,5 @@ def C19578021_ShapeCollider_CanBeAdded(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C19578021_ShapeCollider_CanBeAdded) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C19723164_ShapeColliders_WontCrashEditor.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C19723164_ShapeColliders_WontCrashEditor.py index f6f21a5322..7d277a734d --- a/AutomatedTesting/Gem/PythonTests/physics/C19723164_ShapeColliders_WontCrashEditor.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C19723164_ShapeColliders_WontCrashEditor.py @@ -40,9 +40,7 @@ def C19723164_ShapeColliders_WontCrashEditor(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity @@ -96,8 +94,5 @@ def C19723164_ShapeColliders_WontCrashEditor(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C19723164_ShapeColliders_WontCrashEditor) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py index 9258cf8547..9094ba68c6 --- a/AutomatedTesting/Gem/PythonTests/physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py @@ -51,9 +51,7 @@ def C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(): import os import sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity import azlmbr.legacy.general as general import azlmbr.bus @@ -134,8 +132,5 @@ def C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C3510644_Collider_CollisionGroups.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C3510644_Collider_CollisionGroups.py index e41aecf4fe..28638cc2a6 --- a/AutomatedTesting/Gem/PythonTests/physics/C3510644_Collider_CollisionGroups.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C3510644_Collider_CollisionGroups.py @@ -90,11 +90,6 @@ def C3510644_Collider_CollisionGroups(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -362,8 +357,5 @@ def C3510644_Collider_CollisionGroups(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C3510644_Collider_CollisionGroups) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py index 538f28ff36..cfe6f3962c --- a/AutomatedTesting/Gem/PythonTests/physics/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py @@ -48,13 +48,11 @@ def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): import os # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset # Constants PHYSICS_ASSET_INDEX = 7 # Hardcoded enum index value for Shape property @@ -107,8 +105,5 @@ def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044695_PhysXCollider_AddMultipleSurfaceFbx) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976227_Collider_NewGroup.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4976227_Collider_NewGroup.py index e123067f54..e9704d6be5 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976227_Collider_NewGroup.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976227_Collider_NewGroup.py @@ -51,11 +51,6 @@ def C4976227_Collider_NewGroup(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -84,8 +79,5 @@ def C4976227_Collider_NewGroup(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976227_Collider_NewGroup) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976236_AddPhysxColliderComponent.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4976236_AddPhysxColliderComponent.py index d4b7d85169..e4341bb148 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976236_AddPhysxColliderComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976236_AddPhysxColliderComponent.py @@ -42,14 +42,12 @@ def C4976236_AddPhysxColliderComponent(): """ # Helper file Imports - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset helper.init_idle() # 1) Load the level @@ -84,8 +82,5 @@ def C4976236_AddPhysxColliderComponent(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976236_AddPhysxColliderComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py index 86dd81a6de..86ef5b6ed4 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py @@ -62,11 +62,6 @@ def C4976242_Collision_SameCollisionlayerSameCollisiongroup(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -188,8 +183,5 @@ def C4976242_Collision_SameCollisionlayerSameCollisiongroup(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976242_Collision_SameCollisionlayerSameCollisiongroup) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py index f1a646e964..893d0d06f6 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py @@ -66,11 +66,6 @@ def C4976243_Collision_SameCollisionGroupDiffCollisionLayers(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -127,8 +122,5 @@ def C4976243_Collision_SameCollisionGroupDiffCollisionLayers(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976243_Collision_SameCollisionGroupDiffCollisionLayers) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976244_Collider_SameGroupSameLayerCollision.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4976244_Collider_SameGroupSameLayerCollision.py index 1d1f0aba35..44ea29de76 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976244_Collider_SameGroupSameLayerCollision.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976244_Collider_SameGroupSameLayerCollision.py @@ -62,11 +62,6 @@ def C4976244_Collider_SameGroupSameLayerCollision(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -185,8 +180,5 @@ def C4976244_Collider_SameGroupSameLayerCollision(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976244_Collider_SameGroupSameLayerCollision) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976245_PhysXCollider_CollisionLayerTest.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4976245_PhysXCollider_CollisionLayerTest.py index 9d2c6f5fb4..a7c9152744 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976245_PhysXCollider_CollisionLayerTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4976245_PhysXCollider_CollisionLayerTest.py @@ -67,11 +67,6 @@ def C4976245_PhysXCollider_CollisionLayerTest(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -223,8 +218,5 @@ def C4976245_PhysXCollider_CollisionLayerTest(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976245_PhysXCollider_CollisionLayerTest) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982593_PhysXCollider_CollisionLayerTest.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982593_PhysXCollider_CollisionLayerTest.py index 500515f707..3fdb9d3403 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982593_PhysXCollider_CollisionLayerTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982593_PhysXCollider_CollisionLayerTest.py @@ -67,11 +67,6 @@ def C4982593_PhysXCollider_CollisionLayerTest(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -231,8 +226,5 @@ def C4982593_PhysXCollider_CollisionLayerTest(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982593_PhysXCollider_CollisionLayerTest) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982595_Collider_TriggerDisablesCollision.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982595_Collider_TriggerDisablesCollision.py index 23e43cd741..d3b0faa6d4 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982595_Collider_TriggerDisablesCollision.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982595_Collider_TriggerDisablesCollision.py @@ -75,11 +75,6 @@ def C4982595_Collider_TriggerDisablesCollision(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components @@ -234,8 +229,5 @@ def C4982595_Collider_TriggerDisablesCollision(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982595_Collider_TriggerDisablesCollision) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982797_Collider_ColliderOffset.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982797_Collider_ColliderOffset.py index 9ede25e5a0..d4d8ab15fd --- a/AutomatedTesting/Gem/PythonTests/physics/C4982797_Collider_ColliderOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982797_Collider_ColliderOffset.py @@ -87,9 +87,7 @@ def C4982797_Collider_ColliderOffset(): import sys # Internal editor imports - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -332,8 +330,5 @@ def C4982797_Collider_ColliderOffset(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982797_Collider_ColliderOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982798_Collider_ColliderRotationOffset.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982798_Collider_ColliderRotationOffset.py index c0bc208d48..8368b9a66f --- a/AutomatedTesting/Gem/PythonTests/physics/C4982798_Collider_ColliderRotationOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982798_Collider_ColliderRotationOffset.py @@ -86,9 +86,7 @@ def C4982798_Collider_ColliderRotationOffset(): :return: None """ - import ImportPathHelper as imports - imports.init() # Internal editor imports @@ -300,8 +298,5 @@ def C4982798_Collider_ColliderRotationOffset(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982798_Collider_ColliderRotationOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982800_PhysXColliderShape_CanBeSelected.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982800_PhysXColliderShape_CanBeSelected.py index abfa6c44a1..0f1b9c6070 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982800_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982800_PhysXColliderShape_CanBeSelected.py @@ -43,9 +43,7 @@ def C4982800_PhysXColliderShape_CanBeSelected(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -91,8 +89,5 @@ def C4982800_PhysXColliderShape_CanBeSelected(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982800_PhysXColliderShape_CanBeSelected) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982801_PhysXColliderShape_CanBeSelected.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982801_PhysXColliderShape_CanBeSelected.py index 0d5aa39941..33b7dc0b48 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982801_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982801_PhysXColliderShape_CanBeSelected.py @@ -43,9 +43,7 @@ def C4982801_PhysXColliderShape_CanBeSelected(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -103,8 +101,5 @@ def C4982801_PhysXColliderShape_CanBeSelected(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982801_PhysXColliderShape_CanBeSelected) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982802_PhysXColliderShape_CanBeSelected.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982802_PhysXColliderShape_CanBeSelected.py index 7eec3b070a..4881c5b9a0 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982802_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982802_PhysXColliderShape_CanBeSelected.py @@ -43,9 +43,7 @@ def C4982802_PhysXColliderShape_CanBeSelected(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -103,8 +101,5 @@ def C4982802_PhysXColliderShape_CanBeSelected(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982802_PhysXColliderShape_CanBeSelected) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982803_Enable_PxMesh_Option.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py rename to AutomatedTesting/Gem/PythonTests/physics/collider/C4982803_Enable_PxMesh_Option.py index 340b9c7785..7497ae8253 --- a/AutomatedTesting/Gem/PythonTests/physics/C4982803_Enable_PxMesh_Option.py +++ b/AutomatedTesting/Gem/PythonTests/physics/collider/C4982803_Enable_PxMesh_Option.py @@ -57,13 +57,11 @@ def C4982803_Enable_PxMesh_Option(): import os # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset import azlmbr.math as math # Open 3D Engine Imports @@ -141,8 +139,5 @@ def C4982803_Enable_PxMesh_Option(): helper.exit_game_mode(Tests.exit_game_mode) if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4982803_Enable_PxMesh_Option) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py index aae57cffc8..11488b14c2 --- a/AutomatedTesting/Gem/PythonTests/physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py @@ -86,11 +86,6 @@ def C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -283,8 +278,5 @@ def C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868580_ForceRegion_SplineModifiedTransform.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C12868580_ForceRegion_SplineModifiedTransform.py index f21dde6ae0..4e052a1b00 --- a/AutomatedTesting/Gem/PythonTests/physics/C12868580_ForceRegion_SplineModifiedTransform.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868580_ForceRegion_SplineModifiedTransform.py @@ -73,12 +73,6 @@ def C12868580_ForceRegion_SplineModifiedTransform(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -168,8 +162,5 @@ def C12868580_ForceRegion_SplineModifiedTransform(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12868580_ForceRegion_SplineModifiedTransform) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905527_ForceRegion_MagnitudeDeviation.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C12905527_ForceRegion_MagnitudeDeviation.py index 6df2d545da..c9d411b873 --- a/AutomatedTesting/Gem/PythonTests/physics/C12905527_ForceRegion_MagnitudeDeviation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905527_ForceRegion_MagnitudeDeviation.py @@ -54,12 +54,6 @@ def C12905527_ForceRegion_MagnitudeDeviation(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -144,8 +138,5 @@ def C12905527_ForceRegion_MagnitudeDeviation(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12905527_ForceRegion_MagnitudeDeviation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905528_ForceRegion_WithNonTriggerCollider.py old mode 100755 new mode 100644 similarity index 89% rename from AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C12905528_ForceRegion_WithNonTriggerCollider.py index ca5a29e182..93453b29c0 --- a/AutomatedTesting/Gem/PythonTests/physics/C12905528_ForceRegion_WithNonTriggerCollider.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905528_ForceRegion_WithNonTriggerCollider.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def run(): +def C12905528_ForceRegion_WithNonTriggerCollider(): """ Summary: Create entity with PhysX Force Region component. Check that user is warned if new PhysX Collider component is @@ -43,13 +43,10 @@ def run(): :return: None """ - # Helper file Imports - import ImportPathHelper as imports - + import azlmbr.legacy.general as general from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import Report - imports.init() from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -66,11 +63,14 @@ def run(): Report.result(Tests.add_physx_force_region, test_entity.has_component("PhysX Force Region")) # 4) Start the Tracer to catch any errors and warnings + Report.info("Starting warning monitoring") with Tracer() as section_tracer: # 5) Add the PhysX Collider component test_entity.add_component("PhysX Collider") Report.result(Tests.add_physx_collider, test_entity.has_component("PhysX Collider")) - + general.idle_wait_frames(1) + Report.info("Ending warning monitoring") + # ) Verify there is warning in the logs success_condition = section_tracer.has_warnings # Checking if warning exist and the exact warning is caught in the expected lines in Test file @@ -78,4 +78,5 @@ def run(): if __name__ == "__main__": - run() + from editor_python_test_tools.utils import Report + Report.start_test(C12905528_ForceRegion_WithNonTriggerCollider) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C15845879_ForceRegion_HighLinearDampingForce.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C15845879_ForceRegion_HighLinearDampingForce.py index 1021186a9b..d4807476c2 --- a/AutomatedTesting/Gem/PythonTests/physics/C15845879_ForceRegion_HighLinearDampingForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C15845879_ForceRegion_HighLinearDampingForce.py @@ -56,11 +56,6 @@ def C15845879_ForceRegion_HighLinearDampingForce(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -169,8 +164,5 @@ def C15845879_ForceRegion_HighLinearDampingForce(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15845879_ForceRegion_HighLinearDampingForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932040_ForceRegion_CubeExertsWorldForce.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5932040_ForceRegion_CubeExertsWorldForce.py index db3d4708ce..969a203502 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932040_ForceRegion_CubeExertsWorldForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932040_ForceRegion_CubeExertsWorldForce.py @@ -65,11 +65,6 @@ def C5932040_ForceRegion_CubeExertsWorldForce(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -183,8 +178,5 @@ def C5932040_ForceRegion_CubeExertsWorldForce(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5932040_ForceRegion_CubeExertsWorldForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py index 09965214b2..15c77ba17e --- a/AutomatedTesting/Gem/PythonTests/physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py @@ -65,11 +65,6 @@ def C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -161,8 +156,5 @@ def C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932042_PhysXForceRegion_LinearDamping.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5932042_PhysXForceRegion_LinearDamping.py index c05e71573f..5112729cc2 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932042_PhysXForceRegion_LinearDamping.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932042_PhysXForceRegion_LinearDamping.py @@ -71,11 +71,6 @@ def C5932042_PhysXForceRegion_LinearDamping(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -269,8 +264,5 @@ def C5932042_PhysXForceRegion_LinearDamping(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5932042_PhysXForceRegion_LinearDamping) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py index d88232ff78..cd81315e73 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932043_ForceRegion_SimpleDragOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py @@ -42,9 +42,7 @@ def C5932043_ForceRegion_SimpleDragOnRigidBodies(): # Setup path import os, sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -139,8 +137,5 @@ def C5932043_ForceRegion_SimpleDragOnRigidBodies(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5932043_ForceRegion_SimpleDragOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932044_ForceRegion_PointForceOnRigidBody.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5932044_ForceRegion_PointForceOnRigidBody.py index 58eec3a9be..23760909db --- a/AutomatedTesting/Gem/PythonTests/physics/C5932044_ForceRegion_PointForceOnRigidBody.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932044_ForceRegion_PointForceOnRigidBody.py @@ -65,11 +65,6 @@ def C5932044_ForceRegion_PointForceOnRigidBody(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -189,8 +184,5 @@ def C5932044_ForceRegion_PointForceOnRigidBody(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5932044_ForceRegion_PointForceOnRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932045_ForceRegion_Spline.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5932045_ForceRegion_Spline.py index ea9ca060c0..e74f5cc6e0 --- a/AutomatedTesting/Gem/PythonTests/physics/C5932045_ForceRegion_Spline.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932045_ForceRegion_Spline.py @@ -70,11 +70,6 @@ def C5932045_ForceRegion_Spline(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -162,8 +157,5 @@ def C5932045_ForceRegion_Spline(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5932045_ForceRegion_Spline) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py index 3bfad9d770..99baeb1fff --- a/AutomatedTesting/Gem/PythonTests/physics/C5959759_RigidBody_ForceRegionSpherePointForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py @@ -38,11 +38,6 @@ def C5959759_RigidBody_ForceRegionSpherePointForce(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -150,8 +145,5 @@ def C5959759_RigidBody_ForceRegionSpherePointForce(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959759_RigidBody_ForceRegionSpherePointForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959760_PhysXForceRegion_PointForceExertion.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959760_PhysXForceRegion_PointForceExertion.py index 85d15aec33..6648b41d31 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959760_PhysXForceRegion_PointForceExertion.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959760_PhysXForceRegion_PointForceExertion.py @@ -63,11 +63,6 @@ def C5959760_PhysXForceRegion_PointForceExertion(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -223,8 +218,5 @@ def C5959760_PhysXForceRegion_PointForceExertion(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959760_PhysXForceRegion_PointForceExertion) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py index 1e58a8d975..c77fc39a77 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959761_ForceRegion_PhysAssetExertsPointForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py @@ -61,12 +61,6 @@ def C5959761_ForceRegion_PhysAssetExertsPointForce(): import os import sys - - import ImportPathHelper as imports - - imports.init() - - import azlmbr import azlmbr.legacy.general as general import azlmbr.bus as bus @@ -140,8 +134,5 @@ def C5959761_ForceRegion_PhysAssetExertsPointForce(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959761_ForceRegion_PhysAssetExertsPointForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py index 6123381588..8bea169a82 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959763_ForceRegion_ForceRegionImpulsesCube.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py @@ -42,9 +42,7 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): # Setup path import os, sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -165,8 +163,5 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959763_ForceRegion_ForceRegionImpulsesCube) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py index 9e4ef9379a..4ce345a5eb --- a/AutomatedTesting/Gem/PythonTests/physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py @@ -42,9 +42,7 @@ def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): # Setup path import os, sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -167,8 +165,5 @@ def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959764_ForceRegion_ForceRegionImpulsesCapsule) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959765_ForceRegion_AssetGetsImpulsed.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959765_ForceRegion_AssetGetsImpulsed.py index 3a28208805..36ecddb3ca --- a/AutomatedTesting/Gem/PythonTests/physics/C5959765_ForceRegion_AssetGetsImpulsed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959765_ForceRegion_AssetGetsImpulsed.py @@ -45,9 +45,7 @@ def C5959765_ForceRegion_AssetGetsImpulsed(): # Setup path import os, sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -169,8 +167,5 @@ def C5959765_ForceRegion_AssetGetsImpulsed(): helper.exit_game_mode(Tests.exit_game_mode) if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959765_ForceRegion_AssetGetsImpulsed) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959808_ForceRegion_PositionOffset.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959808_ForceRegion_PositionOffset.py index 4b70fcc734..480869457c --- a/AutomatedTesting/Gem/PythonTests/physics/C5959808_ForceRegion_PositionOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959808_ForceRegion_PositionOffset.py @@ -124,11 +124,6 @@ def C5959808_ForceRegion_PositionOffset(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -405,8 +400,5 @@ def C5959808_ForceRegion_PositionOffset(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959808_ForceRegion_PositionOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959809_ForceRegion_RotationalOffset.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959809_ForceRegion_RotationalOffset.py index ccf05cfe5d..d26aebab8d --- a/AutomatedTesting/Gem/PythonTests/physics/C5959809_ForceRegion_RotationalOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959809_ForceRegion_RotationalOffset.py @@ -125,11 +125,6 @@ def C5959809_ForceRegion_RotationalOffset(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -405,8 +400,5 @@ def C5959809_ForceRegion_RotationalOffset(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959809_ForceRegion_RotationalOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py index 330a2662ab..b7660926d5 --- a/AutomatedTesting/Gem/PythonTests/physics/C5959810_ForceRegion_ForceRegionCombinesForces.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py @@ -65,11 +65,6 @@ def C5959810_ForceRegion_ForceRegionCombinesForces(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -234,8 +229,5 @@ def C5959810_ForceRegion_ForceRegionCombinesForces(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5959810_ForceRegion_ForceRegionCombinesForces) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py index 068238e64d..b1f8d27900 --- a/AutomatedTesting/Gem/PythonTests/physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py @@ -55,9 +55,7 @@ def C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(): Second force region: Name = "Force Region Simple Drag" Applies a drag force on both spheres Setup path """ - import ImportPathHelper as imports - imports.init() import azlmbr.legacy.general as general @@ -175,8 +173,5 @@ def C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968760_ForceRegion_CheckNetForceChange.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C5968760_ForceRegion_CheckNetForceChange.py index 41d5b93eb7..d64a0564f4 --- a/AutomatedTesting/Gem/PythonTests/physics/C5968760_ForceRegion_CheckNetForceChange.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968760_ForceRegion_CheckNetForceChange.py @@ -61,11 +61,6 @@ def C5968760_ForceRegion_CheckNetForceChange(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -163,8 +158,5 @@ def C5968760_ForceRegion_CheckNetForceChange(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5968760_ForceRegion_CheckNetForceChange) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090546_ForceRegion_SliceFileInstantiates.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090546_ForceRegion_SliceFileInstantiates.py index f1c13291e3..0c360edee5 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090546_ForceRegion_SliceFileInstantiates.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090546_ForceRegion_SliceFileInstantiates.py @@ -63,11 +63,6 @@ def C6090546_ForceRegion_SliceFileInstantiates(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -138,8 +133,5 @@ def C6090546_ForceRegion_SliceFileInstantiates(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090546_ForceRegion_SliceFileInstantiates) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090547_ForceRegion_ParentChildForceRegions.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090547_ForceRegion_ParentChildForceRegions.py index 2091a1a1f4..f466680e0c --- a/AutomatedTesting/Gem/PythonTests/physics/C6090547_ForceRegion_ParentChildForceRegions.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090547_ForceRegion_ParentChildForceRegions.py @@ -72,11 +72,6 @@ def C6090547_ForceRegion_ParentChildForceRegions(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.math as lymath @@ -199,8 +194,5 @@ def C6090547_ForceRegion_ParentChildForceRegions(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090547_ForceRegion_ParentChildForceRegions) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py index 7b0586586b..7d6a8966b2 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090550_ForceRegion_WorldSpaceForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py @@ -69,11 +69,6 @@ def C6090550_ForceRegion_WorldSpaceForceNegative(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -243,8 +238,5 @@ def C6090550_ForceRegion_WorldSpaceForceNegative(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090550_ForceRegion_WorldSpaceForceNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py index 6025777d86..48d08666fd --- a/AutomatedTesting/Gem/PythonTests/physics/C6090551_ForceRegion_LocalSpaceForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py @@ -69,11 +69,6 @@ def C6090551_ForceRegion_LocalSpaceForceNegative(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -243,8 +238,5 @@ def C6090551_ForceRegion_LocalSpaceForceNegative(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090551_ForceRegion_LocalSpaceForceNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090552_ForceRegion_LinearDampingNegative.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090552_ForceRegion_LinearDampingNegative.py index 07f399a41a..100a07d346 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090552_ForceRegion_LinearDampingNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090552_ForceRegion_LinearDampingNegative.py @@ -68,11 +68,6 @@ def C6090552_ForceRegion_LinearDampingNegative(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -242,8 +237,5 @@ def C6090552_ForceRegion_LinearDampingNegative(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090552_ForceRegion_LinearDampingNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py index 57f6d13d8e..7b5904a3d7 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py @@ -63,11 +63,6 @@ def C6090553_ForceRegion_SimpleDragForceOnRigidBodies(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -174,8 +169,5 @@ def C6090553_ForceRegion_SimpleDragForceOnRigidBodies(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090553_ForceRegion_SimpleDragForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090554_ForceRegion_PointForceNegative.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090554_ForceRegion_PointForceNegative.py index fd3846a801..0b6b9a8b58 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090554_ForceRegion_PointForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090554_ForceRegion_PointForceNegative.py @@ -69,11 +69,6 @@ def C6090554_ForceRegion_PointForceNegative(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -243,8 +238,5 @@ def C6090554_ForceRegion_PointForceNegative(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090554_ForceRegion_PointForceNegative) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py index 800e9245dc..7a642c6c59 --- a/AutomatedTesting/Gem/PythonTests/physics/C6090555_ForceRegion_SplineFollowOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py @@ -65,11 +65,6 @@ def C6090555_ForceRegion_SplineFollowOnRigidBodies(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -176,8 +171,5 @@ def C6090555_ForceRegion_SplineFollowOnRigidBodies(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6090555_ForceRegion_SplineFollowOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6321601_Force_HighValuesDirectionAxes.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py rename to AutomatedTesting/Gem/PythonTests/physics/force_region/C6321601_Force_HighValuesDirectionAxes.py index 6c94e7aea9..47cc085479 --- a/AutomatedTesting/Gem/PythonTests/physics/C6321601_Force_HighValuesDirectionAxes.py +++ b/AutomatedTesting/Gem/PythonTests/physics/force_region/C6321601_Force_HighValuesDirectionAxes.py @@ -90,11 +90,6 @@ def C6321601_Force_HighValuesDirectionAxes(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -246,10 +241,6 @@ def C6321601_Force_HighValuesDirectionAxes(): Report.result(Tests.error_not_found, not has_physx_error()) - if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6321601_Force_HighValuesDirectionAxes) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py b/AutomatedTesting/Gem/PythonTests/physics/general/C14976307_Gravity_SetGravityWorks.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C14976307_Gravity_SetGravityWorks.py index 1b50863ccd..335ef75649 --- a/AutomatedTesting/Gem/PythonTests/physics/C14976307_Gravity_SetGravityWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C14976307_Gravity_SetGravityWorks.py @@ -60,11 +60,6 @@ def C14976307_Gravity_SetGravityWorks(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -122,8 +117,5 @@ def C14976307_Gravity_SetGravityWorks(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14976307_Gravity_SetGravityWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py b/AutomatedTesting/Gem/PythonTests/physics/general/C15425929_Undo_Redo.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C15425929_Undo_Redo.py index 9595030b4b..f74c1d10cb --- a/AutomatedTesting/Gem/PythonTests/physics/C15425929_Undo_Redo.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C15425929_Undo_Redo.py @@ -44,11 +44,6 @@ def C15425929_Undo_Redo(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -91,8 +86,5 @@ def C15425929_Undo_Redo(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15425929_Undo_Redo) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py b/AutomatedTesting/Gem/PythonTests/physics/general/C19536274_GetCollisionName_PrintsName.py old mode 100755 new mode 100644 similarity index 93% rename from AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C19536274_GetCollisionName_PrintsName.py index 4c035eea96..abf2045ed4 --- a/AutomatedTesting/Gem/PythonTests/physics/C19536274_GetCollisionName_PrintsName.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C19536274_GetCollisionName_PrintsName.py @@ -17,7 +17,7 @@ class Tests(): # fmt: on -def run(): +def C19536274_GetCollisionName_PrintsName(): """ Summary: Loads a level that contains an entity with script canvas and PhysX Collider components @@ -43,9 +43,7 @@ def run(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import TestHelper as helper @@ -66,4 +64,5 @@ def run(): if __name__ == "__main__": - run() + from editor_python_test_tools.utils import Report + Report.start_test(C19536274_GetCollisionName_PrintsName) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py b/AutomatedTesting/Gem/PythonTests/physics/general/C19536277_GetCollisionName_PrintsNothing.py old mode 100755 new mode 100644 similarity index 93% rename from AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C19536277_GetCollisionName_PrintsNothing.py index 1bf5248a1f..a0d242542f --- a/AutomatedTesting/Gem/PythonTests/physics/C19536277_GetCollisionName_PrintsNothing.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C19536277_GetCollisionName_PrintsNothing.py @@ -17,7 +17,7 @@ class Tests(): # fmt: on -def run(): +def C19536277_GetCollisionName_PrintsNothing(): """ Summary: Loads a level that contains an entity with script canvas and PhysX Collider components @@ -43,9 +43,7 @@ def run(): :return: None """ # Helper Files - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.editor_entity_utils import EditorEntity as Entity from editor_python_test_tools.utils import TestHelper as helper @@ -66,4 +64,5 @@ def run(): if __name__ == "__main__": - run() + from editor_python_test_tools.utils import Report + Report.start_test(C19536277_GetCollisionName_PrintsNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py b/AutomatedTesting/Gem/PythonTests/physics/general/C29032500_EditorComponents_WorldBodyBusWorks.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C29032500_EditorComponents_WorldBodyBusWorks.py index a022cc7011..0f7f91dafb --- a/AutomatedTesting/Gem/PythonTests/physics/C29032500_EditorComponents_WorldBodyBusWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C29032500_EditorComponents_WorldBodyBusWorks.py @@ -82,11 +82,6 @@ def C29032500_EditorComponents_WorldBodyBusWorks(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import math @@ -154,8 +149,5 @@ def C29032500_EditorComponents_WorldBodyBusWorks(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C29032500_EditorComponents_WorldBodyBusWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py b/AutomatedTesting/Gem/PythonTests/physics/general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py index 1436a98536..f011e65972 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py @@ -58,11 +58,6 @@ def C5689529_Verify_Terrain_RigidBody_Collider_Mesh(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -106,8 +101,5 @@ def C5689529_Verify_Terrain_RigidBody_Collider_Mesh(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5689529_Verify_Terrain_RigidBody_Collider_Mesh) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py b/AutomatedTesting/Gem/PythonTests/physics/general/C6131473_StaticSlice_OnDynamicSliceSpawn.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py rename to AutomatedTesting/Gem/PythonTests/physics/general/C6131473_StaticSlice_OnDynamicSliceSpawn.py index 16fff25a25..e28893dee3 --- a/AutomatedTesting/Gem/PythonTests/physics/C6131473_StaticSlice_OnDynamicSliceSpawn.py +++ b/AutomatedTesting/Gem/PythonTests/physics/general/C6131473_StaticSlice_OnDynamicSliceSpawn.py @@ -58,11 +58,6 @@ def C6131473_StaticSlice_OnDynamicSliceSpawn(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -103,8 +98,5 @@ def C6131473_StaticSlice_OnDynamicSliceSpawn(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6131473_StaticSlice_OnDynamicSliceSpawn) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243580_Joints_Fixed2BodiesConstrained.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243580_Joints_Fixed2BodiesConstrained.py index 24adc2ff71..ceabb91a28 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243580_Joints_Fixed2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243580_Joints_Fixed2BodiesConstrained.py @@ -49,11 +49,6 @@ def C18243580_Joints_Fixed2BodiesConstrained(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -99,8 +94,5 @@ def C18243580_Joints_Fixed2BodiesConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243580_Joints_Fixed2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243581_Joints_FixedBreakable.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243581_Joints_FixedBreakable.py index fb3da2c4e5..716df85c67 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243581_Joints_FixedBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243581_Joints_FixedBreakable.py @@ -48,11 +48,6 @@ def C18243581_Joints_FixedBreakable(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -98,8 +93,5 @@ def C18243581_Joints_FixedBreakable(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243581_Joints_FixedBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243582_Joints_FixedLeadFollowerCollide.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243582_Joints_FixedLeadFollowerCollide.py index 0c7a1d7007..0f130a300b --- a/AutomatedTesting/Gem/PythonTests/physics/C18243582_Joints_FixedLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243582_Joints_FixedLeadFollowerCollide.py @@ -50,11 +50,6 @@ def C18243582_Joints_FixedLeadFollowerCollide(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -93,8 +88,5 @@ def C18243582_Joints_FixedLeadFollowerCollide(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243582_Joints_FixedLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243583_Joints_Hinge2BodiesConstrained.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243583_Joints_Hinge2BodiesConstrained.py index e91a4a495e..e9b11bc198 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243583_Joints_Hinge2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243583_Joints_Hinge2BodiesConstrained.py @@ -52,11 +52,6 @@ def C18243583_Joints_Hinge2BodiesConstrained(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -116,8 +111,5 @@ def C18243583_Joints_Hinge2BodiesConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243583_Joints_Hinge2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243584_Joints_HingeSoftLimitsConstrained.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243584_Joints_HingeSoftLimitsConstrained.py index d4bf9308d2..e100b61494 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243584_Joints_HingeSoftLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243584_Joints_HingeSoftLimitsConstrained.py @@ -54,9 +54,7 @@ def C18243584_Joints_HingeSoftLimitsConstrained(): import sys import math - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -142,8 +140,5 @@ def C18243584_Joints_HingeSoftLimitsConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243584_Joints_HingeSoftLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243585_Joints_HingeNoLimitsConstrained.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243585_Joints_HingeNoLimitsConstrained.py index 3a734e1ef0..90ac80b1fa --- a/AutomatedTesting/Gem/PythonTests/physics/C18243585_Joints_HingeNoLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243585_Joints_HingeNoLimitsConstrained.py @@ -52,11 +52,6 @@ def C18243585_Joints_HingeNoLimitsConstrained(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -112,8 +107,5 @@ def C18243585_Joints_HingeNoLimitsConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243585_Joints_HingeNoLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243586_Joints_HingeLeadFollowerCollide.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243586_Joints_HingeLeadFollowerCollide.py index f22b1b0c9c..2b5b95939f --- a/AutomatedTesting/Gem/PythonTests/physics/C18243586_Joints_HingeLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243586_Joints_HingeLeadFollowerCollide.py @@ -49,11 +49,6 @@ def C18243586_Joints_HingeLeadFollowerCollide(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -92,8 +87,5 @@ def C18243586_Joints_HingeLeadFollowerCollide(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243586_Joints_HingeLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243587_Joints_HingeBreakable.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243587_Joints_HingeBreakable.py index c11851bde4..b1ea7e123a --- a/AutomatedTesting/Gem/PythonTests/physics/C18243587_Joints_HingeBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243587_Joints_HingeBreakable.py @@ -50,11 +50,6 @@ def C18243587_Joints_HingeBreakable(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -110,8 +105,5 @@ def C18243587_Joints_HingeBreakable(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243587_Joints_HingeBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243588_Joints_Ball2BodiesConstrained.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243588_Joints_Ball2BodiesConstrained.py index 107140d7d0..fd8556660a --- a/AutomatedTesting/Gem/PythonTests/physics/C18243588_Joints_Ball2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243588_Joints_Ball2BodiesConstrained.py @@ -51,11 +51,6 @@ def C18243588_Joints_Ball2BodiesConstrained(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -114,8 +109,5 @@ def C18243588_Joints_Ball2BodiesConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243588_Joints_Ball2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243589_Joints_BallSoftLimitsConstrained.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243589_Joints_BallSoftLimitsConstrained.py index 2c6f1f34b0..30747bc2eb --- a/AutomatedTesting/Gem/PythonTests/physics/C18243589_Joints_BallSoftLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243589_Joints_BallSoftLimitsConstrained.py @@ -55,9 +55,7 @@ def C18243589_Joints_BallSoftLimitsConstrained(): import sys import math - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -135,8 +133,5 @@ def C18243589_Joints_BallSoftLimitsConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243589_Joints_BallSoftLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243590_Joints_BallNoLimitsConstrained.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243590_Joints_BallNoLimitsConstrained.py index b5de805d16..990f4f826b --- a/AutomatedTesting/Gem/PythonTests/physics/C18243590_Joints_BallNoLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243590_Joints_BallNoLimitsConstrained.py @@ -54,11 +54,6 @@ def C18243590_Joints_BallNoLimitsConstrained(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -113,8 +108,5 @@ def C18243590_Joints_BallNoLimitsConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243590_Joints_BallNoLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243591_Joints_BallLeadFollowerCollide.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243591_Joints_BallLeadFollowerCollide.py index 2e73232bd9..47422d1508 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243591_Joints_BallLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243591_Joints_BallLeadFollowerCollide.py @@ -49,11 +49,6 @@ def C18243591_Joints_BallLeadFollowerCollide(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -92,8 +87,5 @@ def C18243591_Joints_BallLeadFollowerCollide(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243591_Joints_BallLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243592_Joints_BallBreakable.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243592_Joints_BallBreakable.py index 6539b1b413..6182c312dc --- a/AutomatedTesting/Gem/PythonTests/physics/C18243592_Joints_BallBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243592_Joints_BallBreakable.py @@ -49,11 +49,6 @@ def C18243592_Joints_BallBreakable(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -108,8 +103,5 @@ def C18243592_Joints_BallBreakable(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243592_Joints_BallBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243593_Joints_GlobalFrameConstrained.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/C18243593_Joints_GlobalFrameConstrained.py index 63708d7571..bd527f10f8 --- a/AutomatedTesting/Gem/PythonTests/physics/C18243593_Joints_GlobalFrameConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/C18243593_Joints_GlobalFrameConstrained.py @@ -53,11 +53,6 @@ def C18243593_Joints_GlobalFrameConstrained(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -121,8 +116,5 @@ def C18243593_Joints_GlobalFrameConstrained(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18243593_Joints_GlobalFrameConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py b/AutomatedTesting/Gem/PythonTests/physics/joints/JointsHelper.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py rename to AutomatedTesting/Gem/PythonTests/physics/joints/JointsHelper.py index 12c05c3ced..6226f42534 --- a/AutomatedTesting/Gem/PythonTests/physics/JointsHelper.py +++ b/AutomatedTesting/Gem/PythonTests/physics/joints/JointsHelper.py @@ -5,10 +5,6 @@ For complete copyright and license terms please see the LICENSE at the root of t SPDX-License-Identifier: Apache-2.0 OR MIT """ -import ImportPathHelper as imports - -imports.init() - from editor_python_test_tools.utils import Report import azlmbr.legacy.general as general import azlmbr.bus diff --git a/AutomatedTesting/Gem/PythonTests/physics/AddModifyDelete_Utils.py b/AutomatedTesting/Gem/PythonTests/physics/material/AddModifyDelete_Utils.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/AddModifyDelete_Utils.py rename to AutomatedTesting/Gem/PythonTests/physics/material/AddModifyDelete_Utils.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py index 96e05b88fb..de1945bc8d --- a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py @@ -99,11 +99,6 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -285,8 +280,5 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py index 95e3acefd7..46262f3f77 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py @@ -92,11 +92,6 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -237,8 +232,5 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15096735_Materials_DefaultLibraryConsistency.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15096735_Materials_DefaultLibraryConsistency.py index 18ffe68415..75c9849756 --- a/AutomatedTesting/Gem/PythonTests/physics/C15096735_Materials_DefaultLibraryConsistency.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15096735_Materials_DefaultLibraryConsistency.py @@ -140,11 +140,6 @@ def C15096735_Materials_DefaultLibraryConsistency(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -417,8 +412,5 @@ def C15096735_Materials_DefaultLibraryConsistency(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15096735_Materials_DefaultLibraryConsistency) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15096737_Materials_DefaultMaterialLibraryChanges.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15096737_Materials_DefaultMaterialLibraryChanges.py index 4dae4c536c..a4c65fc24c --- a/AutomatedTesting/Gem/PythonTests/physics/C15096737_Materials_DefaultMaterialLibraryChanges.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15096737_Materials_DefaultMaterialLibraryChanges.py @@ -107,9 +107,7 @@ def C15096737_Materials_DefaultMaterialLibraryChanges(): import os import sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -293,8 +291,5 @@ def C15096737_Materials_DefaultMaterialLibraryChanges(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15096737_Materials_DefaultMaterialLibraryChanges) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15096740_Material_LibraryUpdatedCorrectly.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15096740_Material_LibraryUpdatedCorrectly.py index 341597e36a..88c51bae8a --- a/AutomatedTesting/Gem/PythonTests/physics/C15096740_Material_LibraryUpdatedCorrectly.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15096740_Material_LibraryUpdatedCorrectly.py @@ -49,15 +49,13 @@ def C15096740_Material_LibraryUpdatedCorrectly(): # Built-in Imports import os - import ImportPathHelper as imports - imports.init() # Helper file Imports from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper - from asset_utils import Asset + from editor_python_test_tools.asset_utils import Asset # Open 3D Engine Imports import azlmbr.asset as azasset @@ -101,8 +99,5 @@ def C15096740_Material_LibraryUpdatedCorrectly(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15096740_Material_LibraryUpdatedCorrectly) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15308221_Material_ComponentsInSyncWithLibrary.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15308221_Material_ComponentsInSyncWithLibrary.py index 349e824a49..b29709e95b --- a/AutomatedTesting/Gem/PythonTests/physics/C15308221_Material_ComponentsInSyncWithLibrary.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15308221_Material_ComponentsInSyncWithLibrary.py @@ -105,11 +105,6 @@ def C15308221_Material_ComponentsInSyncWithLibrary(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components @@ -244,8 +239,5 @@ def C15308221_Material_ComponentsInSyncWithLibrary(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15308221_Material_ComponentsInSyncWithLibrary) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15425935_Material_LibraryUpdatedAcrossLevels.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15425935_Material_LibraryUpdatedAcrossLevels.py index 283b8e3d55..91452a1173 --- a/AutomatedTesting/Gem/PythonTests/physics/C15425935_Material_LibraryUpdatedAcrossLevels.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15425935_Material_LibraryUpdatedAcrossLevels.py @@ -112,12 +112,6 @@ def C15425935_Material_LibraryUpdatedAcrossLevels(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -307,8 +301,5 @@ def C15425935_Material_LibraryUpdatedAcrossLevels(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15425935_Material_LibraryUpdatedAcrossLevels) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py index 88abe8dcd1..4d806cda11 --- a/AutomatedTesting/Gem/PythonTests/physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py @@ -79,11 +79,6 @@ def C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -202,8 +197,5 @@ def C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15556261_PhysXMaterials_CharacterControllerMaterialAssignment) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py b/AutomatedTesting/Gem/PythonTests/physics/material/C15563573_Material_AddModifyDeleteOnCharacterController.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C15563573_Material_AddModifyDeleteOnCharacterController.py index ca00b30479..cf38ddc11c --- a/AutomatedTesting/Gem/PythonTests/physics/C15563573_Material_AddModifyDeleteOnCharacterController.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C15563573_Material_AddModifyDeleteOnCharacterController.py @@ -107,11 +107,6 @@ def C15563573_Material_AddModifyDeleteOnCharacterController(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.math as lymath @@ -197,8 +192,5 @@ def C15563573_Material_AddModifyDeleteOnCharacterController(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15563573_Material_AddModifyDeleteOnCharacterController) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py b/AutomatedTesting/Gem/PythonTests/physics/material/C18977601_Material_FrictionCombinePriority.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C18977601_Material_FrictionCombinePriority.py index 14103ad223..4cef743854 --- a/AutomatedTesting/Gem/PythonTests/physics/C18977601_Material_FrictionCombinePriority.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C18977601_Material_FrictionCombinePriority.py @@ -126,12 +126,6 @@ def C18977601_Material_FrictionCombinePriority(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -357,8 +351,5 @@ def C18977601_Material_FrictionCombinePriority(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18977601_Material_FrictionCombinePriority) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py b/AutomatedTesting/Gem/PythonTests/physics/material/C18981526_Material_RestitutionCombinePriority.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C18981526_Material_RestitutionCombinePriority.py index 696eb1115a..9663453df2 --- a/AutomatedTesting/Gem/PythonTests/physics/C18981526_Material_RestitutionCombinePriority.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C18981526_Material_RestitutionCombinePriority.py @@ -126,11 +126,6 @@ def C18981526_Material_RestitutionCombinePriority(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -417,8 +412,5 @@ def C18981526_Material_RestitutionCombinePriority(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C18981526_Material_RestitutionCombinePriority) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044455_Material_libraryChangesInstantly.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044455_Material_libraryChangesInstantly.py index 8a84f5302f..8eb2e7e9a4 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044455_Material_libraryChangesInstantly.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044455_Material_libraryChangesInstantly.py @@ -173,11 +173,6 @@ def C4044455_Material_libraryChangesInstantly(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -478,8 +473,5 @@ def C4044455_Material_libraryChangesInstantly(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044455_Material_libraryChangesInstantly) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044456_Material_FrictionCombine.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044456_Material_FrictionCombine.py index 3048224d79..8c3b389264 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044456_Material_FrictionCombine.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044456_Material_FrictionCombine.py @@ -91,11 +91,6 @@ def C4044456_Material_FrictionCombine(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -213,8 +208,5 @@ def C4044456_Material_FrictionCombine(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044456_Material_FrictionCombine) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044457_Material_RestitutionCombine.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044457_Material_RestitutionCombine.py index 2ba038c928..a20c7e49f7 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044457_Material_RestitutionCombine.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044457_Material_RestitutionCombine.py @@ -96,11 +96,6 @@ def C4044457_Material_RestitutionCombine(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -245,8 +240,5 @@ def C4044457_Material_RestitutionCombine(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044457_Material_RestitutionCombine) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044459_Material_DynamicFriction.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044459_Material_DynamicFriction.py index 096a1bc742..cdf2816f17 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044459_Material_DynamicFriction.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044459_Material_DynamicFriction.py @@ -82,11 +82,6 @@ def C4044459_Material_DynamicFriction(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -191,8 +186,5 @@ def C4044459_Material_DynamicFriction(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044459_Material_DynamicFriction) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044460_Material_StaticFriction.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044460_Material_StaticFriction.py index 9730b28e73..5558f01222 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044460_Material_StaticFriction.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044460_Material_StaticFriction.py @@ -80,11 +80,6 @@ def C4044460_Material_StaticFriction(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -188,8 +183,5 @@ def C4044460_Material_StaticFriction(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044460_Material_StaticFriction) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044461_Material_Restitution.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044461_Material_Restitution.py index 9cb54331cb..b077af1593 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044461_Material_Restitution.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044461_Material_Restitution.py @@ -87,11 +87,6 @@ def C4044461_Material_Restitution(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -230,8 +225,5 @@ def C4044461_Material_Restitution(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044461_Material_Restitution) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044694_Material_EmptyLibraryUsesDefault.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044694_Material_EmptyLibraryUsesDefault.py index 4cf092d3bf..8cba90cba8 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044694_Material_EmptyLibraryUsesDefault.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044694_Material_EmptyLibraryUsesDefault.py @@ -66,11 +66,6 @@ def C4044694_Material_EmptyLibraryUsesDefault(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components @@ -189,8 +184,5 @@ def C4044694_Material_EmptyLibraryUsesDefault(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044694_Material_EmptyLibraryUsesDefault) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4044697_Material_PerfaceMaterialValidation.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4044697_Material_PerfaceMaterialValidation.py index e365a799aa..9ee8d404d7 --- a/AutomatedTesting/Gem/PythonTests/physics/C4044697_Material_PerfaceMaterialValidation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4044697_Material_PerfaceMaterialValidation.py @@ -107,11 +107,6 @@ def C4044697_Material_PerfaceMaterialValidation(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -302,8 +297,5 @@ def C4044697_Material_PerfaceMaterialValidation(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4044697_Material_PerfaceMaterialValidation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4888315_Material_AddModifyDeleteOnCollider.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4888315_Material_AddModifyDeleteOnCollider.py index d66cf17b5f..61c378d287 --- a/AutomatedTesting/Gem/PythonTests/physics/C4888315_Material_AddModifyDeleteOnCollider.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4888315_Material_AddModifyDeleteOnCollider.py @@ -90,11 +90,6 @@ def C4888315_Material_AddModifyDeleteOnCollider(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.math as lymath @@ -176,8 +171,5 @@ def C4888315_Material_AddModifyDeleteOnCollider(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4888315_Material_AddModifyDeleteOnCollider) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4925577_Materials_MaterialAssignedToTerrain.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4925577_Materials_MaterialAssignedToTerrain.py index feafce07d5..219e12fdb2 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925577_Materials_MaterialAssignedToTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4925577_Materials_MaterialAssignedToTerrain.py @@ -76,11 +76,6 @@ def C4925577_Materials_MaterialAssignedToTerrain(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -305,8 +300,5 @@ def C4925577_Materials_MaterialAssignedToTerrain(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4925577_Materials_MaterialAssignedToTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4925579_Material_AddModifyDeleteOnTerrain.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4925579_Material_AddModifyDeleteOnTerrain.py index db2093047e..8b3d72a932 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925579_Material_AddModifyDeleteOnTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4925579_Material_AddModifyDeleteOnTerrain.py @@ -91,11 +91,6 @@ def C4925579_Material_AddModifyDeleteOnTerrain(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.math as lymath @@ -176,8 +171,5 @@ def C4925579_Material_AddModifyDeleteOnTerrain(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4925579_Material_AddModifyDeleteOnTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4925580_Material_RagdollBonesMaterial.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4925580_Material_RagdollBonesMaterial.py index 203db0bd39..96316b1cdf --- a/AutomatedTesting/Gem/PythonTests/physics/C4925580_Material_RagdollBonesMaterial.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4925580_Material_RagdollBonesMaterial.py @@ -66,11 +66,6 @@ def C4925580_Material_RagdollBonesMaterial(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components @@ -194,8 +189,5 @@ def C4925580_Material_RagdollBonesMaterial(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4925580_Material_RagdollBonesMaterial) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py b/AutomatedTesting/Gem/PythonTests/physics/material/C4925582_Material_AddModifyDeleteOnRagdollBones.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C4925582_Material_AddModifyDeleteOnRagdollBones.py index acdfb98411..0abfae08f9 --- a/AutomatedTesting/Gem/PythonTests/physics/C4925582_Material_AddModifyDeleteOnRagdollBones.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C4925582_Material_AddModifyDeleteOnRagdollBones.py @@ -92,11 +92,6 @@ def C4925582_Material_AddModifyDeleteOnRagdollBones(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components @@ -212,8 +207,5 @@ def C4925582_Material_AddModifyDeleteOnRagdollBones(): Report.info("Modified max bouce: " + str(modified_ragdoll.bounces[0])) if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4925582_Material_AddModifyDeleteOnRagdollBones) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics/material/C5296614_PhysXMaterial_ColliderShape.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py rename to AutomatedTesting/Gem/PythonTests/physics/material/C5296614_PhysXMaterial_ColliderShape.py index 82275d1b0d..de7ed4db9b --- a/AutomatedTesting/Gem/PythonTests/physics/C5296614_PhysXMaterial_ColliderShape.py +++ b/AutomatedTesting/Gem/PythonTests/physics/material/C5296614_PhysXMaterial_ColliderShape.py @@ -60,11 +60,6 @@ def C5296614_PhysXMaterial_ColliderShape(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -152,8 +147,5 @@ def C5296614_PhysXMaterial_ColliderShape(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5296614_PhysXMaterial_ColliderShape) diff --git a/AutomatedTesting/Gem/PythonTests/physics/Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics/material/Physmaterial_Editor.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/physics/material/Physmaterial_Editor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C13895144_Ragdoll_ChangeLevel.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py rename to AutomatedTesting/Gem/PythonTests/physics/ragdoll/C13895144_Ragdoll_ChangeLevel.py index 28baa2bcf3..c7ff00a7e3 --- a/AutomatedTesting/Gem/PythonTests/physics/C13895144_Ragdoll_ChangeLevel.py +++ b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C13895144_Ragdoll_ChangeLevel.py @@ -58,11 +58,6 @@ def C13895144_Ragdoll_ChangeLevel(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -104,8 +99,5 @@ def C13895144_Ragdoll_ChangeLevel(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C13895144_Ragdoll_ChangeLevel) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C14654882_Ragdoll_ragdollAPTest.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py rename to AutomatedTesting/Gem/PythonTests/physics/ragdoll/C14654882_Ragdoll_ragdollAPTest.py index 024126ef55..56784b0c72 --- a/AutomatedTesting/Gem/PythonTests/physics/C14654882_Ragdoll_ragdollAPTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C14654882_Ragdoll_ragdollAPTest.py @@ -69,11 +69,6 @@ def C14654882_Ragdoll_ragdollAPTest(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -129,8 +124,5 @@ def C14654882_Ragdoll_ragdollAPTest(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14654882_Ragdoll_ragdollAPTest) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C17411467_AddPhysxRagdollComponent.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/ragdoll/C17411467_AddPhysxRagdollComponent.py index ea58f84dad..9c02239d73 --- a/AutomatedTesting/Gem/PythonTests/physics/C17411467_AddPhysxRagdollComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C17411467_AddPhysxRagdollComponent.py @@ -9,7 +9,6 @@ Test Case Title : Check that Physx Ragdoll component can be added without errors """ - # fmt: off class Tests(): create_test_entity = ("Entity created successfully", "Failed to create Entity") @@ -45,10 +44,6 @@ def C17411467_AddPhysxRagdollComponent(): :return: None """ - # Helper file Imports - import ImportPathHelper as imports - - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import TestHelper as helper @@ -93,8 +88,5 @@ def C17411467_AddPhysxRagdollComponent(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C17411467_AddPhysxRagdollComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py rename to AutomatedTesting/Gem/PythonTests/physics/ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py index b22bcf5a36..d917449daf --- a/AutomatedTesting/Gem/PythonTests/physics/C28978033_Ragdoll_WorldBodyBusTests.py +++ b/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py @@ -45,11 +45,6 @@ def C28978033_Ragdoll_WorldBodyBusTests(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus from editor_python_test_tools.utils import Report @@ -116,8 +111,5 @@ def C28978033_Ragdoll_WorldBodyBusTests(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C28978033_Ragdoll_WorldBodyBusTests) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13351703_COM_NotIncludeTriggerShapes.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13351703_COM_NotIncludeTriggerShapes.py index a9e7727890..56f44503ae --- a/AutomatedTesting/Gem/PythonTests/physics/C13351703_COM_NotIncludeTriggerShapes.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13351703_COM_NotIncludeTriggerShapes.py @@ -55,11 +55,6 @@ def C13351703_COM_NotIncludeTriggerShapes(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -93,8 +88,5 @@ def C13351703_COM_NotIncludeTriggerShapes(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C13351703_COM_NotIncludeTriggerShapes) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py index 2342545a87..41635ecc47 --- a/AutomatedTesting/Gem/PythonTests/physics/C13352089_RigidBodies_MaxAngularVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py @@ -123,9 +123,7 @@ def C13352089_RigidBodies_MaxAngularVelocity(): import math import time - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -281,8 +279,5 @@ def C13352089_RigidBodies_MaxAngularVelocity(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C13352089_RigidBodies_MaxAngularVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py index 79c3e06814..b0b69d6d91 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976194_RigidBody_PhysXComponentIsValid.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py @@ -54,9 +54,7 @@ def C4976194_RigidBody_PhysXComponentIsValid(): import os, sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -110,8 +108,5 @@ def C4976194_RigidBody_PhysXComponentIsValid(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976194_RigidBody_PhysXComponentIsValid) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py index 6bddae76f4..f13a7232fa --- a/AutomatedTesting/Gem/PythonTests/physics/C4976195_RigidBodies_InitialLinearVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py @@ -58,11 +58,6 @@ def C4976195_RigidBodies_InitialLinearVelocity(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -132,8 +127,5 @@ def C4976195_RigidBodies_InitialLinearVelocity(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976195_RigidBodies_InitialLinearVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py index 73c1e88f79..7f400051ec --- a/AutomatedTesting/Gem/PythonTests/physics/C4976197_RigidBodies_InitialAngularVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py @@ -72,9 +72,7 @@ def C4976197_RigidBodies_InitialAngularVelocity(): import sys import math - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -177,8 +175,5 @@ def C4976197_RigidBodies_InitialAngularVelocity(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976197_RigidBodies_InitialAngularVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py index 08b212d1e7..502478f13c --- a/AutomatedTesting/Gem/PythonTests/physics/C4976199_RigidBodies_LinearDampingObjectMotion.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py @@ -56,11 +56,6 @@ def C4976199_RigidBodies_LinearDampingObjectMotion(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -270,8 +265,5 @@ def C4976199_RigidBodies_LinearDampingObjectMotion(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976199_RigidBodies_LinearDampingObjectMotion) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py index b889276554..77dfe4c483 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976200_RigidBody_AngularDampingObjectRotation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py @@ -61,9 +61,7 @@ def C4976200_RigidBody_AngularDampingObjectRotation(): import sys import math - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -285,8 +283,5 @@ def C4976200_RigidBody_AngularDampingObjectRotation(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976200_RigidBody_AngularDampingObjectRotation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976201_RigidBody_MassIsAssigned.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976201_RigidBody_MassIsAssigned.py index 17fd0827c1..54f589da1e --- a/AutomatedTesting/Gem/PythonTests/physics/C4976201_RigidBody_MassIsAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976201_RigidBody_MassIsAssigned.py @@ -101,11 +101,6 @@ def C4976201_RigidBody_MassIsAssigned(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr @@ -373,8 +368,5 @@ def C4976201_RigidBody_MassIsAssigned(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976201_RigidBody_MassIsAssigned) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py index 53415bf43a..655c33304d --- a/AutomatedTesting/Gem/PythonTests/physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py @@ -124,11 +124,6 @@ def C4976202_RigidBody_StopsWhenBelowKineticThreshold(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -326,8 +321,5 @@ def C4976202_RigidBody_StopsWhenBelowKineticThreshold(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976202_RigidBody_StopsWhenBelowKineticThreshold) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976204_Verify_Start_Asleep_Condition.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976204_Verify_Start_Asleep_Condition.py index 6c21912d11..ff3111aa55 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976204_Verify_Start_Asleep_Condition.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976204_Verify_Start_Asleep_Condition.py @@ -62,11 +62,6 @@ def C4976204_Verify_Start_Asleep_Condition(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -112,8 +107,5 @@ def C4976204_Verify_Start_Asleep_Condition(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976204_Verify_Start_Asleep_Condition) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976206_RigidBodies_GravityEnabledActive.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976206_RigidBodies_GravityEnabledActive.py index 96c62f26ea..e6b50eb2bf --- a/AutomatedTesting/Gem/PythonTests/physics/C4976206_RigidBodies_GravityEnabledActive.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976206_RigidBodies_GravityEnabledActive.py @@ -64,11 +64,6 @@ def C4976206_RigidBodies_GravityEnabledActive(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -145,8 +140,5 @@ def C4976206_RigidBodies_GravityEnabledActive(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976206_RigidBodies_GravityEnabledActive) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py index 81bed2bbde..65814bd438 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976207_PhysXRigidBodies_KinematicBehavior.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py @@ -59,11 +59,6 @@ def C4976207_PhysXRigidBodies_KinematicBehavior(): # Setup path import os import sys - import ImportPathHelper as imports - - imports.init() - - import azlmbr.legacy.general as general import azlmbr.bus from editor_python_test_tools.utils import Report @@ -132,8 +127,5 @@ def C4976207_PhysXRigidBodies_KinematicBehavior(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976207_PhysXRigidBodies_KinematicBehavior) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976209_RigidBody_ComputesCOM.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976209_RigidBody_ComputesCOM.py index f3f57b2b65..27d4ea1356 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976209_RigidBody_ComputesCOM.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976209_RigidBody_ComputesCOM.py @@ -86,11 +86,6 @@ def C4976209_RigidBody_ComputesCOM(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -173,8 +168,5 @@ def C4976209_RigidBody_ComputesCOM(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976209_RigidBody_ComputesCOM) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976210_COM_ManualSetting.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976210_COM_ManualSetting.py index 9373f20850..cbbefb5a0e --- a/AutomatedTesting/Gem/PythonTests/physics/C4976210_COM_ManualSetting.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976210_COM_ManualSetting.py @@ -69,9 +69,7 @@ def C4976210_COM_ManualSetting(): """ # internal editor imports - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -298,8 +296,5 @@ def C4976210_COM_ManualSetting(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976210_COM_ManualSetting) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py index ef19a00042..eb87fd0c68 --- a/AutomatedTesting/Gem/PythonTests/physics/C4976218_RigidBodies_InertiaObjectsNotComputed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py @@ -39,11 +39,6 @@ def C4976218_RigidBodies_InertiaObjectsNotComputed(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus as bus import azlmbr.components @@ -161,8 +156,5 @@ def C4976218_RigidBodies_InertiaObjectsNotComputed(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C4976218_RigidBodies_InertiaObjectsNotComputed) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py rename to AutomatedTesting/Gem/PythonTests/physics/rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py index 7daf9d3dc8..92d3945391 --- a/AutomatedTesting/Gem/PythonTests/physics/C5340400_RigidBody_ManualMomentOfInertia.py +++ b/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py @@ -67,11 +67,6 @@ def C5340400_RigidBody_ManualMomentOfInertia(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus from editor_python_test_tools.utils import Report @@ -160,8 +155,5 @@ def C5340400_RigidBody_ManualMomentOfInertia(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5340400_RigidBody_ManualMomentOfInertia) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712452_ScriptCanvas_CollisionEvents.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712452_ScriptCanvas_CollisionEvents.py index 3d3011ef26..6806d5acc8 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712452_ScriptCanvas_CollisionEvents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712452_ScriptCanvas_CollisionEvents.py @@ -67,11 +67,6 @@ def C12712452_ScriptCanvas_CollisionEvents(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components @@ -201,8 +196,5 @@ def C12712452_ScriptCanvas_CollisionEvents(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12712452_ScriptCanvas_CollisionEvents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py index 2e4c0a3fe2..edbbde4c94 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712453_ScriptCanvas_MultipleRaycastNode.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py @@ -75,11 +75,6 @@ def C12712453_ScriptCanvas_MultipleRaycastNode(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -199,8 +194,5 @@ def C12712453_ScriptCanvas_MultipleRaycastNode(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12712453_ScriptCanvas_MultipleRaycastNode) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py index f741f0d019..5829e5850c --- a/AutomatedTesting/Gem/PythonTests/physics/C12712454_ScriptCanvas_OverlapNodeVerification.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py @@ -97,11 +97,6 @@ def C12712454_ScriptCanvas_OverlapNodeVerification(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -320,8 +315,5 @@ def C12712454_ScriptCanvas_OverlapNodeVerification(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12712454_ScriptCanvas_OverlapNodeVerification) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py index 581c6033e9..8ce59d2b29 --- a/AutomatedTesting/Gem/PythonTests/physics/C12712455_ScriptCanvas_ShapeCastVerification.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py @@ -67,11 +67,6 @@ def C12712455_ScriptCanvas_ShapeCastVerification(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -137,8 +132,5 @@ def C12712455_ScriptCanvas_ShapeCastVerification(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C12712455_ScriptCanvas_ShapeCastVerification) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py index 08adccfc60..2c833ba5f3 --- a/AutomatedTesting/Gem/PythonTests/physics/C14195074_ScriptCanvas_PostUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py @@ -61,11 +61,6 @@ def C14195074_ScriptCanvas_PostUpdateEvent(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -182,8 +177,5 @@ def C14195074_ScriptCanvas_PostUpdateEvent(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14195074_ScriptCanvas_PostUpdateEvent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py index 2a2ce3aaf6..4d48ce34a6 --- a/AutomatedTesting/Gem/PythonTests/physics/C14902097_ScriptCanvas_PreUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py @@ -64,9 +64,7 @@ def C14902097_ScriptCanvas_PreUpdateEvent(): import os import sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -189,8 +187,5 @@ def C14902097_ScriptCanvas_PreUpdateEvent(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14902097_ScriptCanvas_PreUpdateEvent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py index b977b9ae10..5cb0b1431e --- a/AutomatedTesting/Gem/PythonTests/physics/C14902098_ScriptCanvas_PostPhysicsUpdate.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py @@ -75,11 +75,6 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -110,8 +105,5 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14902098_ScriptCanvas_PostPhysicsUpdate) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py index 2827ba5f16..9e8331f369 --- a/AutomatedTesting/Gem/PythonTests/physics/C14976308_ScriptCanvas_SetKinematicTargetTransform.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py @@ -91,11 +91,6 @@ def C14976308_ScriptCanvas_SetKinematicTargetTransform(): # Setup path import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus import azlmbr.components @@ -220,8 +215,5 @@ def C14976308_ScriptCanvas_SetKinematicTargetTransform(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C14976308_ScriptCanvas_SetKinematicTargetTransform) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6224408_ScriptCanvas_EntitySpawn.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6224408_ScriptCanvas_EntitySpawn.py index c458073799..12e4a25b4d --- a/AutomatedTesting/Gem/PythonTests/physics/C6224408_ScriptCanvas_EntitySpawn.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6224408_ScriptCanvas_EntitySpawn.py @@ -60,11 +60,6 @@ def C6224408_ScriptCanvas_EntitySpawn(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -144,8 +139,5 @@ def C6224408_ScriptCanvas_EntitySpawn(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6224408_ScriptCanvas_EntitySpawn) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6274125_ScriptCanvas_TriggerEvents.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py rename to AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6274125_ScriptCanvas_TriggerEvents.py index 0e7ca0c8d3..5fc4261607 --- a/AutomatedTesting/Gem/PythonTests/physics/C6274125_ScriptCanvas_TriggerEvents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6274125_ScriptCanvas_TriggerEvents.py @@ -66,11 +66,6 @@ def C6274125_ScriptCanvas_TriggerEvents(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -128,8 +123,5 @@ def C6274125_ScriptCanvas_TriggerEvents(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6274125_ScriptCanvas_TriggerEvents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C13508019_Terrain_TerrainTexturePainterWorks.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C13508019_Terrain_TerrainTexturePainterWorks.py index 87534ffd58..9822b933d1 --- a/AutomatedTesting/Gem/PythonTests/physics/C13508019_Terrain_TerrainTexturePainterWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C13508019_Terrain_TerrainTexturePainterWorks.py @@ -40,9 +40,7 @@ def C13508019_Terrain_TerrainTexturePainterWorks(): # Setup path import os, sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -137,8 +135,5 @@ def C13508019_Terrain_TerrainTexturePainterWorks(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C13508019_Terrain_TerrainTexturePainterWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py index 0fc5c65db3..f3641b12bc --- a/AutomatedTesting/Gem/PythonTests/physics/C15308217_NoCrash_LevelSwitch.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py @@ -62,11 +62,6 @@ def C15308217_NoCrash_LevelSwitch(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -106,8 +101,5 @@ def C15308217_NoCrash_LevelSwitch(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C15308217_NoCrash_LevelSwitch) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C3510642_Terrain_NotCollideWithTerrain.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C3510642_Terrain_NotCollideWithTerrain.py index c3e1ac018c..09522da31a --- a/AutomatedTesting/Gem/PythonTests/physics/C3510642_Terrain_NotCollideWithTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C3510642_Terrain_NotCollideWithTerrain.py @@ -65,11 +65,6 @@ def C3510642_Terrain_NotCollideWithTerrain(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus @@ -168,8 +163,5 @@ def C3510642_Terrain_NotCollideWithTerrain(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C3510642_Terrain_NotCollideWithTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py index b586c0b096..a10cc72ed2 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py @@ -47,11 +47,6 @@ def C5689518_PhysXTerrain_CollidesWithPhysXTerrain(): """ import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general import azlmbr.bus from editor_python_test_tools.utils import Report @@ -113,8 +108,5 @@ def C5689518_PhysXTerrain_CollidesWithPhysXTerrain(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5689518_PhysXTerrain_CollidesWithPhysXTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py index 0c1d0d4d1c..8e42f9f77c --- a/AutomatedTesting/Gem/PythonTests/physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py @@ -58,11 +58,6 @@ def C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general from editor_python_test_tools.utils import Report @@ -105,8 +100,5 @@ def C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5689522_Physxterrain_AddPhysxterrainNoEditorCrash) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py index 04912dd401..ba74716544 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689524_MultipleTerrains_CheckWarningInConsole.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py @@ -60,12 +60,6 @@ def C5689524_MultipleTerrains_CheckWarningInConsole(): import os import sys - - import ImportPathHelper as imports - - imports.init() - - import azlmbr.legacy.general as general from editor_python_test_tools.utils import Report @@ -107,8 +101,5 @@ def C5689524_MultipleTerrains_CheckWarningInConsole(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5689524_MultipleTerrains_CheckWarningInConsole) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689528_Terrain_MultipleTerrainComponents.py old mode 100755 new mode 100644 similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C5689528_Terrain_MultipleTerrainComponents.py index a5a8d65788..fb1fd01724 --- a/AutomatedTesting/Gem/PythonTests/physics/C5689528_Terrain_MultipleTerrainComponents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689528_Terrain_MultipleTerrainComponents.py @@ -60,11 +60,6 @@ def C5689528_Terrain_MultipleTerrainComponents(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -103,8 +98,5 @@ def C5689528_Terrain_MultipleTerrainComponents(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5689528_Terrain_MultipleTerrainComponents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689531_Warning_TerrainSliceTerrainComponent.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C5689531_Warning_TerrainSliceTerrainComponent.py index 2eaa55eacf..68ddaba5ed --- a/AutomatedTesting/Gem/PythonTests/physics/C5689531_Warning_TerrainSliceTerrainComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689531_Warning_TerrainSliceTerrainComponent.py @@ -65,11 +65,6 @@ def C5689531_Warning_TerrainSliceTerrainComponent(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -115,8 +110,5 @@ def C5689531_Warning_TerrainSliceTerrainComponent(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C5689531_Warning_TerrainSliceTerrainComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C6032082_Terrain_MultipleResolutionsValid.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py rename to AutomatedTesting/Gem/PythonTests/physics/terrain/C6032082_Terrain_MultipleResolutionsValid.py index 6bb44323a2..66615e1937 --- a/AutomatedTesting/Gem/PythonTests/physics/C6032082_Terrain_MultipleResolutionsValid.py +++ b/AutomatedTesting/Gem/PythonTests/physics/terrain/C6032082_Terrain_MultipleResolutionsValid.py @@ -80,11 +80,6 @@ def C6032082_Terrain_MultipleResolutionsValid(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -209,8 +204,5 @@ def C6032082_Terrain_MultipleResolutionsValid(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C6032082_Terrain_MultipleResolutionsValid) diff --git a/AutomatedTesting/Gem/PythonTests/physics/FileManagement.py b/AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/FileManagement.py rename to AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Managed_Files.py old mode 100755 new mode 100644 similarity index 89% rename from AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py rename to AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Managed_Files.py index 2e6e854c7d..49747da443 --- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Managed_Files.py +++ b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Managed_Files.py @@ -13,11 +13,6 @@ class Tests: def run(): import os import sys - - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Physmaterial_Editor.py old mode 100755 new mode 100644 similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Physmaterial_Editor.py index ec870d12c4..27d670d1e8 --- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Physmaterial_Editor.py +++ b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Physmaterial_Editor.py @@ -50,9 +50,7 @@ def run(): """ import os import sys - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_PhysxConfig_Default.py b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Default.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/UtilTest_PhysxConfig_Default.py rename to AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Default.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_PhysxConfig_Override.py b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Override.py old mode 100755 new mode 100644 similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/UtilTest_PhysxConfig_Override.py rename to AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Override.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py rename to AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py index 92405498d2..136bcfc03d --- a/AutomatedTesting/Gem/PythonTests/physics/UtilTest_Tracer_PicksErrorsAndWarnings.py +++ b/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py @@ -30,11 +30,6 @@ def run(): import os import sys - - import ImportPathHelper as imports - - imports.init() - import azlmbr.legacy.general as general from editor_python_test_tools.utils import Report From 79c98fe6a34bb2427430f048f0019d1f14450feb Mon Sep 17 00:00:00 2001 From: AMZN-Igarri <82394219+AMZN-Igarri@users.noreply.github.com> Date: Tue, 31 Aug 2021 14:29:17 +0200 Subject: [PATCH 045/355] [Fix] Editor Crash in Debug Mode (#3647) * Fixed Crash AssetBrowserTableView Signed-off-by: igarri * Fixed comments Signed-off-by: igarri * fixed lamda capture Signed-off-by: igarri * Capturing object in lambda Signed-off-by: igarri --- .../AssetBrowser/AssetBrowserTableModel.cpp | 78 ++++++++++++------- .../AssetBrowser/AssetBrowserTableModel.h | 10 ++- 2 files changed, 58 insertions(+), 30 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp index efa47e600d..d0999c5c56 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp @@ -25,19 +25,47 @@ namespace AzToolsFramework AZ_Assert( m_filterModel, "Error in AssetBrowserTableModel initialization, class expects source model to be an AssetBrowserFilterModel."); + connect(sourceModel, &QAbstractItemModel::rowsInserted, this, &AssetBrowserTableModel::UpdateTableModelMaps); + connect(sourceModel, &QAbstractItemModel::rowsRemoved, this, &AssetBrowserTableModel::UpdateTableModelMaps); + connect(sourceModel, &QAbstractItemModel::modelAboutToBeReset, this, &AssetBrowserTableModel::beginResetModel); + connect( + sourceModel, &QAbstractItemModel::modelReset, this, + [this]() + { + { + QSignalBlocker sb(this); + UpdateTableModelMaps(); + } + endResetModel(); + }); + connect(sourceModel, &QAbstractItemModel::layoutChanged, this, &AssetBrowserTableModel::UpdateTableModelMaps); + connect(sourceModel, &QAbstractItemModel::dataChanged, this, &AssetBrowserTableModel::SourceDataChanged); + + QSortFilterProxyModel::setSourceModel(sourceModel); } QModelIndex AssetBrowserTableModel::mapToSource(const QModelIndex& proxyIndex) const { Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() == this); - if (!proxyIndex.isValid()) + if (!proxyIndex.isValid() || !m_indexMap.contains(proxyIndex.row())) { return QModelIndex(); } return m_indexMap[proxyIndex.row()]; } + QModelIndex AssetBrowserTableModel::mapFromSource(const QModelIndex& sourceIndex) const + { + Q_ASSERT(!sourceIndex.isValid() || sourceIndex.model() == sourceModel()); + if (!sourceIndex.isValid() || !m_rowMap.contains(sourceIndex)) + { + return QModelIndex(); + } + + return createIndex(m_rowMap[sourceIndex], sourceIndex.column()); + } + QVariant AssetBrowserTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role == Qt::DisplayRole && orientation == Qt::Horizontal) @@ -49,20 +77,8 @@ namespace AzToolsFramework QVariant AssetBrowserTableModel::data(const QModelIndex& index, int role) const { - auto sourceIndex = mapToSource(index); - if (!sourceIndex.isValid()) - { - return QVariant(); - } - - AssetBrowserEntry* entry = GetAssetEntry(sourceIndex); - if (entry == nullptr) - { - AZ_Assert(false, "AssetBrowserTableModel - QModelIndex does not reference an AssetEntry. Source model is not valid."); - return QVariant(); - } - - return sourceIndex.data(role); + Q_ASSERT(index.isValid() && index.model() == this); + return sourceModel()->data(mapToSource(index), role); } QModelIndex AssetBrowserTableModel::parent([[maybe_unused]] const QModelIndex& child) const @@ -76,14 +92,28 @@ namespace AzToolsFramework return QModelIndex(); } + void AssetBrowserTableModel::SourceDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) + { + for (int row = topLeft.row(); row <= bottomRight.row(); ++row) + { + if (!m_indexMap.contains(row)) + { + UpdateTableModelMaps(); + return; + } + } + } + QModelIndex AssetBrowserTableModel::index(int row, int column, const QModelIndex& parent) const { + Q_ASSERT(!parent.isValid()); + return parent.isValid() ? QModelIndex() : createIndex(row, column, m_indexMap[row].internalPointer()); } int AssetBrowserTableModel::rowCount(const QModelIndex& parent) const { - return !parent.isValid() ? m_indexMap.size() : 0; + return !parent.isValid() ? m_indexMap.size() : sourceModel()->rowCount(parent); } int AssetBrowserTableModel::BuildTableModelMap( @@ -103,13 +133,11 @@ namespace AzToolsFramework QModelIndex index = model->index(currentRow, 0, parent); AssetBrowserEntry* entry = GetAssetEntry(m_filterModel->mapToSource(index)); // We only want to see the source assets. - if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source) + if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source || + entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product) { - beginInsertRows(parent, row, row); m_indexMap[row] = index; - endInsertRows(); - - Q_EMIT dataChanged(index, index); + m_rowMap[index] = row; ++row; ++m_displayedItemsCounter; } @@ -143,12 +171,8 @@ namespace AzToolsFramework void AssetBrowserTableModel::UpdateTableModelMaps() { emit layoutAboutToBeChanged(); - if (!m_indexMap.isEmpty()) - { - beginRemoveRows(m_indexMap.first(), m_indexMap.first().row(), m_indexMap.last().row()); - m_indexMap.clear(); - endRemoveRows(); - } + m_indexMap.clear(); + m_rowMap.clear(); AzToolsFramework::EditorSettingsAPIBus::BroadcastResult( m_numberOfItemsDisplayed, &AzToolsFramework::EditorSettingsAPIBus::Handler::GetMaxNumberOfItemsShownInSearchView); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h index d80e2bd093..04559fbfbc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h @@ -30,12 +30,11 @@ namespace AzToolsFramework AZ_CLASS_ALLOCATOR(AssetBrowserTableModel, AZ::SystemAllocator, 0); explicit AssetBrowserTableModel(QObject* parent = nullptr); - void UpdateTableModelMaps(); - //////////////////////////////////////////////////////////////////// // QSortFilterProxyModel void setSourceModel(QAbstractItemModel* sourceModel) override; QModelIndex mapToSource(const QModelIndex& proxyIndex) const override; + QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override; QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; QModelIndex parent(const QModelIndex& child) const override; @@ -45,16 +44,21 @@ namespace AzToolsFramework int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant headerData(int section, Qt::Orientation orientation, int role /* = Qt::DisplayRole */) const override; //////////////////////////////////////////////////////////////////// - private: AssetBrowserEntry* GetAssetEntry(QModelIndex index) const; int BuildTableModelMap(const QAbstractItemModel* model, const QModelIndex& parent = QModelIndex(), int row = 0); + public slots: + void UpdateTableModelMaps(); + + private slots: + void SourceDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); private: int m_numberOfItemsDisplayed = 50; int m_displayedItemsCounter = 0; QPointer m_filterModel; QMap m_indexMap; + QMap m_rowMap; }; } // namespace AssetBrowser } // namespace AzToolsFramework From fe6238bbb80babc3dbd827b55407d1e64c421175 Mon Sep 17 00:00:00 2001 From: moraaar Date: Tue, 31 Aug 2021 14:55:58 +0100 Subject: [PATCH 046/355] Update Blast gem to use newer version of Blast 3p package, which fixes Blast gem on monolithic builds. (#3754) Signed-off-by: moraaar --- Gems/Blast/Code/Platform/Windows/PAL_windows.cmake | 2 ++ cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/Blast/Code/Platform/Windows/PAL_windows.cmake b/Gems/Blast/Code/Platform/Windows/PAL_windows.cmake index bf05e5c7eb..cab1497a7c 100644 --- a/Gems/Blast/Code/Platform/Windows/PAL_windows.cmake +++ b/Gems/Blast/Code/Platform/Windows/PAL_windows.cmake @@ -7,3 +7,5 @@ # set(PAL_TRAIT_BLAST_SUPPORTED TRUE) + +ly_associate_package(PACKAGE_NAME Blast-v1.1.7_rc2-9-geb169fe-rev2-windows TARGETS Blast PACKAGE_HASH ac3ab4c778194f9e8413b95b87116032a336f58d55f489e941c8932609f892ff) \ No newline at end of file diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 2655b7247f..10b56f90d9 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -27,7 +27,6 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform # platform-specific: ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-windows TARGETS AWSGameLiftServerSDK PACKAGE_HASH a0586b006e4def65cc25f388de17dc475e417dc1e6f9d96749777c88aa8271b0) -ly_associate_package(PACKAGE_NAME Blast-v1.1.7_rc2-9-geb169fe-rev1-windows TARGETS Blast PACKAGE_HASH 216df71f4ffaf4a6ea3f2e77e5f27d68f2325e717fbd1626b00c785b82cd1b67) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 803e10b94006b834cbbdd30f562a8ddf04174c2cb6956c8399ec164ef8418d1f) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-windows TARGETS SPIRVCross PACKAGE_HASH 7d601ea9d625b1d509d38bd132a1f433d7e895b16adab76bac6103567a7a6817) ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-windows TARGETS freetype PACKAGE_HASH 88dedc86ccb8c92f14c2c033e51ee7d828fa08eafd6475c6aa963938a99f4bf3) From fe2bf07c55b5f1af182016e990fc7205add03d7a Mon Sep 17 00:00:00 2001 From: moraaar Date: Tue, 31 Aug 2021 14:56:37 +0100 Subject: [PATCH 047/355] Fixed blast asset reflection, which was generating a wrong Id for the Asset class type due to 'const' (#3756) Signed-off-by: moraaar --- Gems/Blast/Code/Source/Components/BlastFamilyComponent.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h b/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h index c27a738b05..99957d0fce 100644 --- a/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h +++ b/Gems/Blast/Code/Source/Components/BlastFamilyComponent.h @@ -107,7 +107,7 @@ namespace Blast BlastMeshData* m_meshDataComponent = nullptr; // Configurations - const AZ::Data::Asset m_blastAsset; + AZ::Data::Asset m_blastAsset; const BlastMaterialId m_materialId{}; Physics::MaterialId m_physicsMaterialId; const BlastActorConfiguration m_actorConfiguration{}; From 0d728a76778cb0ca88caa5c07f17162fac668b2a Mon Sep 17 00:00:00 2001 From: sharmajs-amzn <82233357+sharmajs-amzn@users.noreply.github.com> Date: Tue, 31 Aug 2021 07:22:09 -0700 Subject: [PATCH 048/355] Added new index on SourceDependency Table (#3648) Signed-off-by: sharmajs-amzn <82233357+sharmajs-amzn@users.noreply.github.com> --- .../AssetDatabase/AssetDatabaseConnection.h | 1 + .../native/AssetDatabase/AssetDatabase.cpp | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetDatabase/AssetDatabaseConnection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetDatabase/AssetDatabaseConnection.h index a59dbfbda4..d9c83107e3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetDatabase/AssetDatabaseConnection.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetDatabase/AssetDatabaseConnection.h @@ -65,6 +65,7 @@ namespace AzToolsFramework AddedScanTimeSecondsSinceEpochField = 29, ChangedSortFunctionFromQSortToStdStableSort = 30, RemoveOutputPrefixFromScanFolders, + AddedSourceIndexForSourceDependencyTable, //Add all new versions before this DatabaseVersionCount, LatestVersion = DatabaseVersionCount - 1 diff --git a/Code/Tools/AssetProcessor/native/AssetDatabase/AssetDatabase.cpp b/Code/Tools/AssetProcessor/native/AssetDatabase/AssetDatabase.cpp index 4d2053c6d1..9be991eb0b 100644 --- a/Code/Tools/AssetProcessor/native/AssetDatabase/AssetDatabase.cpp +++ b/Code/Tools/AssetProcessor/native/AssetDatabase/AssetDatabase.cpp @@ -758,6 +758,14 @@ namespace AssetProcessor "FileID = :fileid;"; static const auto s_DeleteFileQuery = MakeSqlQuery(DELETE_FILE, DELETE_FILE_STATEMENT, LOG_NAME, SqlParam(":fileid")); + + static const char* CREATEINDEX_SOURCEDEPENDENCY_SOURCE = "AssetProcesser::CreateIndexSourceSourceDependency"; + static const char* CREATEINDEX_SOURCEDEPENDENCY_SOURCE_STATEMENT = + "CREATE INDEX IF NOT EXISTS Source_SourceDependency ON SourceDependency (Source);"; + + static const char* DROPINDEX_BUILDERGUID_SOURCE_SOURCEDEPENDENCY = "AssetProcesser::DropIndexBuilderGuid_Source_SourceDependency"; + static const char* DROPINDEX_BUILDERGUID_SOURCE_SOURCEDEPENDENCY_STATEMENT = + "DROP INDEX IF EXISTS BuilderGuid_Source_SourceDependency;"; } AssetDatabaseConnection::AssetDatabaseConnection() @@ -1033,6 +1041,15 @@ namespace AssetProcessor // sqlite doesn't not support altering a table to remove a column // This is fine as the extra OutputPrefix column will not be queried + if (foundVersion == AssetDatabase::DatabaseVersion::RemoveOutputPrefixFromScanFolders) + { + if (m_databaseConnection->ExecuteOneOffStatement(DROPINDEX_BUILDERGUID_SOURCE_SOURCEDEPENDENCY) && m_databaseConnection->ExecuteOneOffStatement(CREATEINDEX_SOURCEDEPENDENCY_SOURCE)) + { + foundVersion = AssetDatabase::DatabaseVersion::AddedSourceIndexForSourceDependencyTable; + AZ_TracePrintf(AssetProcessor::ConsoleChannel, "Upgraded Asset Database to version %i (AddedSourceIndexForSourceDependencyTable)\n", foundVersion) + } + } + if (foundVersion == CurrentDatabaseVersion()) { dropAllTables = false; @@ -1306,6 +1323,12 @@ namespace AssetProcessor m_databaseConnection->AddStatement(CREATEINDEX_SCANFOLDERS_FILES, CREATEINDEX_SCANFOLDERS_FILES_STATEMENT); m_createStatements.push_back(CREATEINDEX_SCANFOLDERS_FILES); + m_databaseConnection->AddStatement(CREATEINDEX_SOURCEDEPENDENCY_SOURCE, CREATEINDEX_SOURCEDEPENDENCY_SOURCE_STATEMENT); + m_createStatements.push_back(CREATEINDEX_SOURCEDEPENDENCY_SOURCE); + + m_databaseConnection->AddStatement(DROPINDEX_BUILDERGUID_SOURCE_SOURCEDEPENDENCY, DROPINDEX_BUILDERGUID_SOURCE_SOURCEDEPENDENCY_STATEMENT); + m_createStatements.push_back(DROPINDEX_BUILDERGUID_SOURCE_SOURCEDEPENDENCY); + m_databaseConnection->AddStatement(DELETE_AUTO_SUCCEED_JOBS, DELETE_AUTO_SUCCEED_JOBS_STATEMENT); } From c128760ed001b891b2c9b68dfb87d56ccd21714a Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 09:31:42 -0700 Subject: [PATCH 049/355] removes leftover of performance build Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Assets/Engine/Config/performance.cfg | 6 ------ Code/Framework/AzCore/AzCore/Debug/Trace.h | 2 +- Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h | 6 +++--- Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp | 4 ++-- .../AzFramework/AzFramework/Asset/AssetCatalog.cpp | 4 ++-- Code/Legacy/CryCommon/ProjectDefines.h | 6 +++--- Code/Legacy/CrySystem/SystemInit.cpp | 4 ---- Code/Legacy/CrySystem/XConsole.cpp | 2 +- .../Source/Platform/Windows/RHI/WSISurface_Windows.cpp | 1 + .../Code/Include/ScriptCanvas/Execution/ExecutionBus.h | 2 +- .../Execution/Interpreted/ExecutionInterpretedAPI.cpp | 9 ++------- .../Include/ScriptCanvas/Execution/RuntimeComponent.cpp | 2 +- Gems/ScriptCanvas/Code/Source/SystemComponent.cpp | 2 +- 13 files changed, 18 insertions(+), 32 deletions(-) delete mode 100644 Assets/Engine/Config/performance.cfg diff --git a/Assets/Engine/Config/performance.cfg b/Assets/Engine/Config/performance.cfg deleted file mode 100644 index 153209c20d..0000000000 --- a/Assets/Engine/Config/performance.cfg +++ /dev/null @@ -1,6 +0,0 @@ -e_StatoscopeScreenshotCapturePeriod = 1 - -e_StatoscopeDataGroups = Oulm -sys_pakLogInvalidFileAccess = 1 -e_StatoscopeWriteTimeout = 10 -e_StatoscopeConnectTimeout = 10 \ No newline at end of file diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.h b/Code/Framework/AzCore/AzCore/Debug/Trace.h index bae074281c..e2727a407a 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.h +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.h @@ -276,7 +276,7 @@ namespace AZ #define AZ_Printf(window, ...) AZ::Debug::Trace::Instance().Printf(window, __VA_ARGS__); -#if !defined(RELEASE) || defined(PERFORMANCE_BUILD) +#if !defined(RELEASE) // Unconditional critical error log, enabled up to Performance config #define AZ_Fatal(window, format, ...) AZ::Debug::Trace::Instance().Printf(window, "[FATAL] " format "\n", ##__VA_ARGS__); #define AZ_Crash() AZ::Debug::Trace::Instance().Crash(); diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h index f02c37492b..fe586ce078 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h +++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h @@ -1290,13 +1290,13 @@ namespace AZ const EventArray& GetEvents() const; -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) // m_scriptPath is only available in non-Release mode +#if !defined(_RELEASE) // m_scriptPath is only available in non-Release mode AZStd::string m_scriptPath; #endif AZStd::string GetScriptPath() const { -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) // m_scriptPath is only available in non-Release mode +#if !defined(_RELEASE) // m_scriptPath is only available in non-Release mode return m_scriptPath; #else return{}; @@ -1305,7 +1305,7 @@ namespace AZ void SetScriptPath(const char* scriptPath) { -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) // m_scriptPath is only available in non-Release mode +#if !defined(_RELEASE) // m_scriptPath is only available in non-Release mode m_scriptPath = scriptPath; #else AZ_UNUSED(scriptPath); diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp index 531c91bcf4..7cfc57cb7e 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp @@ -3727,7 +3727,7 @@ LUA_API const Node* lua_getDummyNode() if (m_handler) { -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) +#if !defined(_RELEASE) const AZStd::string_view luaString("Lua"); lua_Debug info; for (int level = 0; lua_getstack(m_lua, level, &info); ++level) @@ -3739,7 +3739,7 @@ LUA_API const Node* lua_getDummyNode() break; } } -#endif//defined(PERFORMANCE_BUILD) || !defined(_RELEASE) +#endif BindEvents(scriptTable); diff --git a/Code/Framework/AzFramework/AzFramework/Asset/AssetCatalog.cpp b/Code/Framework/AzFramework/AzFramework/Asset/AssetCatalog.cpp index 3411c06f28..9b1946701c 100644 --- a/Code/Framework/AzFramework/AzFramework/Asset/AssetCatalog.cpp +++ b/Code/Framework/AzFramework/AzFramework/Asset/AssetCatalog.cpp @@ -987,7 +987,7 @@ namespace AzFramework void AssetCatalog::AddCatalogEntry(AZStd::shared_ptr deltaCatalog) { AZStd::lock_guard lock(m_deltaCatalogMutex); -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) +#if !defined(_RELEASE) for (const auto& thisElement : m_deltaCatalogList) { if (thisElement == deltaCatalog) @@ -1010,7 +1010,7 @@ namespace AzFramework AZ_Warning("AssetCatalog", false, "Catalog name %p can't be inserted at slot %u", deltaCatalog.get(), catalogIndex); return; } -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) +#if !defined(_RELEASE) for (const auto& thisElement : m_deltaCatalogList) { if (thisElement == deltaCatalog) diff --git a/Code/Legacy/CryCommon/ProjectDefines.h b/Code/Legacy/CryCommon/ProjectDefines.h index f7f73f111b..b443fc9ce0 100644 --- a/Code/Legacy/CryCommon/ProjectDefines.h +++ b/Code/Legacy/CryCommon/ProjectDefines.h @@ -27,7 +27,7 @@ #define AZ_RESTRICTED_SECTION PROJECTDEFINES_H_SECTION_STATS_AGENT #include AZ_RESTRICTED_FILE(ProjectDefines_h) #elif defined(WIN32) || defined(WIN64) - #if !defined(_RELEASE) || defined(PERFORMANCE_BUILD) + #if !defined(_RELEASE) #define ENABLE_STATS_AGENT #endif #endif @@ -71,7 +71,7 @@ #define REMOTE_ASSET_PROCESSOR #endif -#if (!defined(_RELEASE) || defined(PERFORMANCE_BUILD)) +#if (!defined(_RELEASE) #define USE_HTTP_WEBSOCKETS 0 #endif @@ -97,7 +97,7 @@ #endif #endif -#if (!defined(_RELEASE) || defined(PERFORMANCE_BUILD)) +#if (!defined(_RELEASE) #ifndef ENABLE_PROFILING_CODE #define ENABLE_PROFILING_CODE #endif diff --git a/Code/Legacy/CrySystem/SystemInit.cpp b/Code/Legacy/CrySystem/SystemInit.cpp index d5efff2748..a335dae112 100644 --- a/Code/Legacy/CrySystem/SystemInit.cpp +++ b/Code/Legacy/CrySystem/SystemInit.cpp @@ -1433,10 +1433,6 @@ AZ_POP_DISABLE_WARNING #endif } -#if defined(PERFORMANCE_BUILD) - LoadConfiguration("performance.cfg"); -#endif - ////////////////////////////////////////////////////////////////////////// if (g_cvars.sys_asserts == 0) { diff --git a/Code/Legacy/CrySystem/XConsole.cpp b/Code/Legacy/CrySystem/XConsole.cpp index bb8316981a..1cc9696a06 100644 --- a/Code/Legacy/CrySystem/XConsole.cpp +++ b/Code/Legacy/CrySystem/XConsole.cpp @@ -297,7 +297,7 @@ void CXConsole::Init(ISystem* pSystem) AzFramework::InputChannelEventListener::Connect(); AzFramework::InputTextEventListener::Connect(); -#if defined(_RELEASE) && !defined(PERFORMANCE_BUILD) +#if defined(_RELEASE) static const int kDeactivateConsoleDefault = 1; #else static const int kDeactivateConsoleDefault = 0; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp index 02c776293d..d7e4bd2556 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Windows/RHI/WSISurface_Windows.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace AZ { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionBus.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionBus.h index 37a78a88f4..ebe591e15f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionBus.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/ExecutionBus.h @@ -15,7 +15,7 @@ #include -#if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) +#if !defined(_RELEASE) // the markers are defined in test, but the system that listens for calls won't always be enabled #define SCRIPT_CANVAS_PERFORMANCE_TRACKING_ENABLED #endif diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp index d7a4c360ac..e93fd1263d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp @@ -465,12 +465,7 @@ namespace ScriptCanvas lua_register(lua, k_UnpackDependencyConstructionArgsFunctionName, &UnpackDependencyConstructionArgs); lua_register(lua, k_UnpackDependencyConstructionArgsLeafFunctionName, &UnpackDependencyConstructionArgsLeaf); -#if defined(PERFORMANCE_BUILD) - lua_pushboolean(lua, true); - lua_setglobal(lua, k_InterpretedConfigurationPerformance); - lua_pushboolean(lua, false); - lua_setglobal(lua, k_InterpretedConfigurationRelease); -#elif defined(_RELEASE) +#if defined(_RELEASE) lua_pushboolean(lua, false); lua_setglobal(lua, k_InterpretedConfigurationPerformance); lua_pushboolean(lua, true); @@ -481,7 +476,7 @@ namespace ScriptCanvas lua_setglobal(lua, k_InterpretedConfigurationPerformance); lua_pushboolean(lua, false); lua_setglobal(lua, k_InterpretedConfigurationRelease); -#endif//defined(PERFORMANCE_BUILD) +#endif lua_register(lua, k_GetRandomSwitchControlNumberName, &GetRandomSwitchControlNumber); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp index 6d652136cd..c1b0d51ac8 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp @@ -19,7 +19,7 @@ #include #include -#if !defined(_RELEASE) && !defined(PERFORMANCE_BUILD) +#if !defined(_RELEASE) #define SCRIPT_CANVAS_RUNTIME_ASSET_CHECK #endif diff --git a/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp b/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp index ba02fa8a62..5d6b98f7cb 100644 --- a/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp +++ b/Gems/ScriptCanvas/Code/Source/SystemComponent.cpp @@ -34,7 +34,7 @@ namespace ScriptCanvasSystemComponentCpp { -#if !defined(_RELEASE) && !defined(PERFORMANCE_BUILD) +#if !defined(_RELEASE) const int k_infiniteLoopDetectionMaxIterations = 1000000; const int k_maxHandlerStackDepth = 25; #else From 8656a2c1073c095cfbafc79fc9e541b2ed65b66b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 09:36:18 -0700 Subject: [PATCH 050/355] PR comments Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp index 9e1fa7339b..46bac7c595 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp @@ -297,7 +297,7 @@ namespace ImageProcessingAtom if (trimZeros) { /* set i0 and i1 to the nonzero support of the filter */ - i1 = i1 = lastnonzero + 1; + i0 = i1 = lastnonzero + 1; } if (sumiWeights != WEIGHTONE) From 6e3b03dfaa89bab530013c7599d504f1145d7e21 Mon Sep 17 00:00:00 2001 From: Mike Chang <62353586+amzn-changml@users.noreply.github.com> Date: Tue, 31 Aug 2021 09:47:57 -0700 Subject: [PATCH 051/355] Install and configure Ubuntu nodes with Nvidia drivers and NiceDCV (#3728) These scripts will configure build and test Ubuntu 18/20 nodes with: Nvidia gaming drivers for GPU instances (g4dn) lightdm for Ubuntu 18 and gdm3 for Ubuntu 20 (wayland is disabled here, but should have xcb capabilities) NiceDCV for remote console access Note: Does not include user setup and firewall configurations Signed-off-by: Mike Chang --- .../Platform/Linux/install-ubuntu-gpu.sh | 94 +++++++++++++++++++ .../Platform/Linux/install-ubuntu-nicedcv.sh | 78 +++++++++++++++ 2 files changed, 172 insertions(+) create mode 100755 scripts/build/build_node/Platform/Linux/install-ubuntu-gpu.sh create mode 100755 scripts/build/build_node/Platform/Linux/install-ubuntu-nicedcv.sh diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-gpu.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-gpu.sh new file mode 100755 index 0000000000..033d32369c --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-gpu.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# + +# This script must be run as root +if [[ $EUID -ne 0 ]] +then + echo "This script must be run as root (sudo)" + exit 1 +fi + +# Install latest updates to AWS drivers and GCC (to build display driver) +# +echo Updating OS and tools +apt-get update -y +apt-get upgrade -y linux-aws +apt-get install -y gcc make linux-headers-$(uname -r) + +# Install Desktop environment with tools. Nice is only compatible with Gnome +# +echo Installing desktop environment and tools +apt-get install ubuntu-desktop mesa-utils vulkan-tools awscli unzip -y + +# Setup X desktop manager (Wayland needs to be turned off for GDM3) +# +if [ "`cat /etc/issue | grep 18.04`" != "" ] ; then + apt-get install lightdm -y +else + apt-get install gdm3 -y + sed -i 's/#WaylandEnable=false/WaylandEnable=false/g' /etc/gdm3/custom.conf + systemctl restart gdm3 +fi + +# Set desktop environment to start by default +# +systemctl get-default +systemctl set-default graphical.target +systemctl isolate graphical.target + +# Prepare for the nVidia driver by disabling nouveau +# +cat << EOF | sudo tee --append /etc/modprobe.d/blacklist.conf +blacklist vga16fb +blacklist nouveau +blacklist rivafb +blacklist nvidiafb +blacklist rivatv +EOF + +# Blocking nouveau from activating during grub startup +# +echo 'GRUB_CMDLINE_LINUX="rdblacklist=nouveau"' >> /etc/default/grub +update-grub + +# Copy drivers to local, then install +# +aws s3 cp --recursive s3://nvidia-gaming/linux/latest/ /tmp +cd /tmp +unzip NVIDIA-Linux-x86_64* \ +&& rm NVIDIA-Linux-x86_64* \ +&& chmod +x Linux/NVIDIA-Linux-x86_64*.run \ +&& Linux/NVIDIA-Linux-x86_64*.run --accept-license \ + --no-questions \ + --no-backup \ + --ui=none \ + --install-libglvnd \ +&& nvidia-xconfig --preserve-busid --enable-all-gpus \ +&& rm -rf /tmp/Linux + +# Download and configure licenses (needed for VMs and multiuser) +# +cat << EOF | sudo tee -a /etc/nvidia/gridd.conf +vGamingMarketplace=2 +EOF +curl -o /etc/nvidia/GridSwCert.txt "https://nvidia-gaming.s3.amazonaws.com/GridSwCert-Archive/GridSwCertLinux_2021_10_2.cert" + +# Optimize settings if headless +# +if [ ! $DISPLAY ] ; then + echo Headless instance found. Disabling HardDPMS + if [ ! $(grep '"HardDPMS" "false"' /etc/X11/xorg.conf) ]; then + sed -i '/BusID */ a\ + Option "HardDPMS" "false"' /etc/X11/xorg.conf + fi +fi + +echo Install complete! +read -t 10 -p "Rebooting in 10 seconds. Press enter to reboot this instance now or CTRL+c to cancel" +reboot now + diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-nicedcv.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-nicedcv.sh new file mode 100755 index 0000000000..d566c94c21 --- /dev/null +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-nicedcv.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# + +# This script must be run as root +if [[ $EUID -ne 0 ]] +then + echo "This script must be run as root (sudo)" + exit 1 +fi + +# Download Nice DCV +# +echo Downloading Nice-DCV +mkdir /tmp/nice-dcv +cd /tmp/nice-dcv +curl -sSL https://d1uj6qtbmh3dt5.cloudfront.net/NICE-GPG-KEY | gpg --import - + +if [ "`cat /etc/issue | grep 18.04`" != "" ] ; then + dcv_server=`curl --silent --output - https://download.nice-dcv.com/ | \ +grep href | egrep "$dcv_version" | egrep "ubuntu1804" | grep Server | \ +sed -e 's/.*http/http/' -e 's/tgz.*/tgz/' | head -1` +else + dcv_server=`curl --silent --output - https://download.nice-dcv.com/ | \ +grep href | egrep "$dcv_version" | egrep "ubuntu2004" | grep Server | \ +sed -e 's/.*http/http/' -e 's/tgz.*/tgz/' | head -1` +fi + +# Install Nice DCV +# +echo Installing DCV from $dcv_server +wget $dcv_server \ +&& tar zxvf nice-dcv-*ubun*.tgz +cd nice-dcv-*64 +apt install -y ./nice-*amd64.ubuntu*.deb \ +&& usermod -aG video dcv \ +&& rm -rf /tmp/nice-dcv + +# Setup multiuser environment for DCV +# +systemctl isolate multi-user.target +sleep 1 +dcvgladmin enable +systemctl isolate graphical.target + +# Check if DCV localuser for X has been setup correctly +# +if [ $(DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') xhost | grep "SI:localuser:dcv$") ]; then + echo DCV localuser validated +else + echo [ERROR] DCV localuser not found. Output should be: SI:localuser:dcv. Exiting with 1 + exit 1 +fi + +# Configure DCV for auto start sessions and performance +# +sed -i "s/#create-session = true/create-session = true/g" /etc/dcv/dcv.conf +sed -i "s/#owner=\"session-owner\"/owner=\"$LOGNAME\"/g" /etc/dcv/dcv.conf +sed -i "s/#target-fps=30/target-fps=0/g" /etc/dcv/dcv.conf + +# Enable and start the DCV server +# +systemctl enable dcvserver +systemctl start dcvserver + +# Output the DCV installation diagnostics +# +dcvgldiag + +# Start a DCV session to login +# +IP_ADDR=$(curl http://checkip.amazonaws.com) +echo Starting DCV desktop session for $LOGNAME. Session can be accessed at https://$IP_ADDR:8443 +dcv create-session --type=console --owner $LOGNAME desktop From 7248029e6753ec2b49d165e0bc2acb76ac0050af Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 10:07:05 -0700 Subject: [PATCH 052/355] Android fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzCore/Tests/AZStd/Any.cpp | 4 ++++ Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp | 4 ++++ Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp | 6 ++++++ .../Code/Include/Platform/Android/Atom_RHI_Vulkan_Android.h | 2 +- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Code/Framework/AzCore/Tests/AZStd/Any.cpp b/Code/Framework/AzCore/Tests/AZStd/Any.cpp index 4040573462..d6e31ea07b 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Any.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Any.cpp @@ -480,7 +480,9 @@ namespace UnitTest TEST_F(AnyTest, Any_CopyAssignSelfEmpty_IsEmpty) { any a; + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") a = a; + AZ_POP_DISABLE_WARNING EXPECT_TRUE(a.empty()); } @@ -491,7 +493,9 @@ namespace UnitTest any a((TypeParam(1))); EXPECT_EQ(TypeParam::s_count, 1); + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") a = a; + AZ_POP_DISABLE_WARNING EXPECT_EQ(TypeParam::s_count, 1); EXPECT_EQ(any_cast(a).val(), 1); diff --git a/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp b/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp index 58ab71096b..6bfda10ddc 100644 --- a/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp @@ -285,7 +285,9 @@ namespace UnitTest // Invocation and self-assignment global_int = 0; + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") v1 = v1; + AZ_POP_DISABLE_WARNING v1(); AZ_TEST_ASSERT(global_int == 3); @@ -294,7 +296,9 @@ namespace UnitTest // Invocation and self-assignment global_int = 0; + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") v1 = (v1); + AZ_POP_DISABLE_WARNING v1(); AZ_TEST_ASSERT(global_int == 5); diff --git a/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp b/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp index c852fd35bb..f50da28b1f 100644 --- a/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp @@ -920,7 +920,9 @@ namespace UnitTest AZStd::shared_ptr p1; + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") p1 = p1; + AZ_POP_DISABLE_WARNING EXPECT_EQ(p1, p1); EXPECT_FALSE(p1); @@ -950,7 +952,9 @@ namespace UnitTest { AZStd::shared_ptr p1; + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") p1 = p1; + AZ_POP_DISABLE_WARNING EXPECT_EQ(p1, p1); EXPECT_FALSE(p1); @@ -996,7 +1000,9 @@ namespace UnitTest using X = SharedPtr::test::X; AZStd::shared_ptr p1; + AZ_PUSH_DISABLE_WARNING(, "-Wself-assign-overloaded") p1 = p1; + AZ_POP_DISABLE_WARNING EXPECT_EQ(p1, p1); EXPECT_FALSE(p1); diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_Android.h b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_Android.h index 9289423b37..b8e83ab8a3 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_Android.h +++ b/Gems/Atom/RHI/Vulkan/Code/Include/Platform/Android/Atom_RHI_Vulkan_Android.h @@ -8,7 +8,7 @@ #pragma once #include -#include +#include #include #include #include From dd3bdcd3f4088afdaec060678c1f8258735945ee Mon Sep 17 00:00:00 2001 From: Nicholas Van Sickle Date: Tue, 31 Aug 2021 11:08:11 -0700 Subject: [PATCH 053/355] Fix some Qt warnings (#3731) -Fix a missing QPainter::restore call -Remove 0px font sizes from our qss, which was just getting ignored by Qt and triggering a warning Signed-off-by: nvsickle --- .../ComponentEntityEditorPlugin/UI/Outliner/EntityOutliner.qss | 2 -- Code/Editor/Style/NewEditorStylesheet.qss | 1 - .../AzToolsFramework/UI/Outliner/EntityOutliner.qss | 2 -- .../AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp | 1 + 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/EntityOutliner.qss b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/EntityOutliner.qss index 1b6f04d06d..de35f91678 100644 --- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/EntityOutliner.qss +++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/EntityOutliner.qss @@ -48,7 +48,6 @@ OutlinerCheckBox spacing: 0px; padding: 0px; line-height: 0px; - font-size: 0px; margin: 0px; background-color: none; max-height: 20px; @@ -66,7 +65,6 @@ OutlinerCheckBox::indicator spacing: 0px; padding: 0px; line-height: 0px; - font-size: 0px; margin: 0; } diff --git a/Code/Editor/Style/NewEditorStylesheet.qss b/Code/Editor/Style/NewEditorStylesheet.qss index d92ec33357..1de8634b4c 100644 --- a/Code/Editor/Style/NewEditorStylesheet.qss +++ b/Code/Editor/Style/NewEditorStylesheet.qss @@ -2505,7 +2505,6 @@ OutlinerCheckBox spacing: 0px; padding: 0px; line-height: 0px; - font-size: 0px; margin: 2px 2px 0 2px; background-color: none; max-height: 20px; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss index 8e569eb134..15ff8b1b67 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutliner.qss @@ -43,7 +43,6 @@ AzToolsFramework--EntityOutlinerCheckBox padding: 0; padding-right: 2px; line-height: 0px; - font-size: 0px; margin: 0px; max-height: 20px; max-width: 18px; @@ -59,7 +58,6 @@ AzToolsFramework--EntityOutlinerCheckBox::indicator spacing: 0px; padding: 0px; line-height: 0px; - font-size: 0px; margin: 3px 0 0 0; max-width: 18px; width: 18px; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp index 708a6d9b13..73a28a3edc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp @@ -99,5 +99,6 @@ namespace AzToolsFramework // Draw border at the bottom painter->drawLine(rect.bottomLeft(), rect.bottomRight()); + painter->restore(); } } From 9fc824d98bf9105d15213f5736050462c0f843ab Mon Sep 17 00:00:00 2001 From: Junbo Liang <68558268+junbo75@users.noreply.github.com> Date: Tue, 31 Aug 2021 11:15:04 -0700 Subject: [PATCH 054/355] Create config files automatically and UX style updates (#3514) --- Code/Editor/MainWindow.qrc | 2 + Code/Editor/res/error_report_helper.svg | 14 + Code/Editor/res/o3de_application_reverse.svg | 9 + .../AWSResourceMappingConstants.h | 2 +- .../AWSResourceMappingManagerTest.cpp | 22 + .../controller/view_edit_controller.py | 37 +- .../manager/view_manager.py | 2 +- .../model/error_messages.py | 8 +- .../model/notification_label_text.py | 11 +- .../model/view_size_constants.py | 11 +- .../style/base_style_sheet.qss | 56 +- .../style/editormainwindow_resources.py | 54803 ++++++++-------- .../unit/controller/test_error_controller.py | 29 + .../controller/test_view_edit_controller.py | 43 +- .../tests/unit/utils/test_json_utils.py | 28 +- .../ResourceMappingTool/utils/json_utils.py | 36 +- .../view/common_view_components.py | 52 +- .../ResourceMappingTool/view/error_page.py | 29 +- .../view/view_edit_page.py | 63 +- .../Config/default_aws_resource_mappings.json | 6 + .../Registry/awscoreconfiguration.setreg | 10 + Templates/DefaultProject/template.json | 12 + 22 files changed, 27846 insertions(+), 27439 deletions(-) create mode 100644 Code/Editor/res/error_report_helper.svg create mode 100644 Code/Editor/res/o3de_application_reverse.svg create mode 100644 Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_error_controller.py create mode 100644 Templates/DefaultProject/Template/Config/default_aws_resource_mappings.json create mode 100644 Templates/DefaultProject/Template/Registry/awscoreconfiguration.setreg diff --git a/Code/Editor/MainWindow.qrc b/Code/Editor/MainWindow.qrc index fd207ebe13..4506a4a2a8 100644 --- a/Code/Editor/MainWindow.qrc +++ b/Code/Editor/MainWindow.qrc @@ -76,6 +76,7 @@ res/o3de_editor.ico + res/o3de_application_reverse.svg res/Eye.svg @@ -152,6 +153,7 @@ res/error_report_error.svg res/error_report_warning.svg res/error_report_comment.svg + res/error_report_helper.svg particles_tree_00.png particles_tree_01.png particles_tree_02.png diff --git a/Code/Editor/res/error_report_helper.svg b/Code/Editor/res/error_report_helper.svg new file mode 100644 index 0000000000..d61970d163 --- /dev/null +++ b/Code/Editor/res/error_report_helper.svg @@ -0,0 +1,14 @@ + + + Icons / Notification / Helpers + + + + + + + + + + + \ No newline at end of file diff --git a/Code/Editor/res/o3de_application_reverse.svg b/Code/Editor/res/o3de_application_reverse.svg new file mode 100644 index 0000000000..841affe8ba --- /dev/null +++ b/Code/Editor/res/o3de_application_reverse.svg @@ -0,0 +1,9 @@ + + + o3de icon + + + + + + \ No newline at end of file diff --git a/Gems/AWSCore/Code/Include/Private/ResourceMapping/AWSResourceMappingConstants.h b/Gems/AWSCore/Code/Include/Private/ResourceMapping/AWSResourceMappingConstants.h index ee052617e3..97eb5b6492 100644 --- a/Gems/AWSCore/Code/Include/Private/ResourceMapping/AWSResourceMappingConstants.h +++ b/Gems/AWSCore/Code/Include/Private/ResourceMapping/AWSResourceMappingConstants.h @@ -68,7 +68,7 @@ namespace AWSCore }, "AccountIdString": { "type": "string", - "pattern": "^[0-9]{12}$" + "pattern": "^[0-9]{12}$|EMPTY" }, "NonEmptyString": { "type": "string", diff --git a/Gems/AWSCore/Code/Tests/ResourceMapping/AWSResourceMappingManagerTest.cpp b/Gems/AWSCore/Code/Tests/ResourceMapping/AWSResourceMappingManagerTest.cpp index 91d85c2f99..d438a99f83 100644 --- a/Gems/AWSCore/Code/Tests/ResourceMapping/AWSResourceMappingManagerTest.cpp +++ b/Gems/AWSCore/Code/Tests/ResourceMapping/AWSResourceMappingManagerTest.cpp @@ -66,6 +66,13 @@ R"({ "Region": "123", "Version": "123" })"; +static constexpr const char TEST_TEMPLATE_RESOURCE_MAPPING_CONFIG_FILE[] = + R"({ + "AWSResourceMappings": {}, + "AccountId": "EMPTY", + "Region": "us-west-2", + "Version": "1.0.0" +})"; class AWSResourceMappingManagerTest : public AWSCoreFixture @@ -190,6 +197,21 @@ TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_Confi EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Ready); } +TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseTemplateConfigFile_ConfigDataIsNotEmpty) +{ + CreateTestConfigFile(TEST_TEMPLATE_RESOURCE_MAPPING_CONFIG_FILE); + m_resourceMappingManager->ActivateManager(); + + AZStd::string actualAccountId; + AZStd::string actualRegion; + AWSResourceMappingRequestBus::BroadcastResult(actualAccountId, &AWSResourceMappingRequests::GetDefaultAccountId); + AWSResourceMappingRequestBus::BroadcastResult(actualRegion, &AWSResourceMappingRequests::GetDefaultRegion); + EXPECT_EQ(m_reloadConfigurationCounter, 0); + EXPECT_FALSE(actualAccountId.empty()); + EXPECT_FALSE(actualRegion.empty()); + EXPECT_TRUE(m_resourceMappingManager->GetStatus() == AWSResourceMappingManager::Status::Ready); +} + TEST_F(AWSResourceMappingManagerTest, ActivateManager_ParseValidConfigFile_ConfigDataIsNotEmptyWithMultithreadCalls) { CreateTestConfigFile(TEST_VALID_RESOURCE_MAPPING_CONFIG_FILE); diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py index 54d0a29fea..bdfe7fa11e 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/controller/view_edit_controller.py @@ -68,12 +68,17 @@ class ViewEditController(QObject): # convert model resources into json dict json_dict: Dict[str, any] = \ json_utils.convert_resources_to_json_dict(self._proxy_model.get_resources(), self._config_file_json_source) + + configuration: Configuration = self._configuration_manager.configuration + if json_dict.get(json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME) == \ + json_utils.RESOURCE_MAPPING_ACCOUNTID_TEMPLATE_VALUE: + json_dict[json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] = configuration.account_id + if json_dict == self._config_file_json_source: # skip because no difference found against existing json file return True # try to write in memory json content into json file - configuration: Configuration = self._configuration_manager.configuration try: config_file_full_path: str = file_utils.join_path(configuration.config_directory, config_file_name) json_utils.write_into_json_file(config_file_full_path, json_dict) @@ -103,31 +108,6 @@ class ViewEditController(QObject): for resource in resources: self._proxy_model.load_resource(resource) - def _create_new_config_file(self) -> None: - configuration: Configuration = self._configuration_manager.configuration - self._set_default_region(configuration) - - try: - new_config_file_path: str = file_utils.join_path( - configuration.config_directory, constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_NAME) - json_utils.create_empty_resource_mapping_file( - new_config_file_path, configuration.account_id, configuration.region) - except IOError as e: - logger.exception(e) - self.set_notification_frame_text_sender.emit(str(e)) - return - - self._rescan_config_directory() - - def _set_default_region(self, configuration: Configuration): - default_region = configuration.region - if not default_region or default_region == 'aws-global': - self.set_notification_frame_text_sender.emit( - notification_label_text.VIEW_EDIT_PAGE_CREATE_NEW_CONFIG_FILE_NO_DEFAULT_REGION_MESSAGE) - logger.warning(notification_label_text.VIEW_EDIT_PAGE_CREATE_NEW_CONFIG_FILE_NO_DEFAULT_REGION_MESSAGE) - - configuration.region = constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_REGION - def _delete_table_row(self) -> None: indices: List[QModelIndex] = self._table_view.selectedIndexes() self._proxy_model.remove_resources(indices) @@ -246,14 +226,13 @@ class ViewEditController(QObject): self._view_edit_page.save_changes_button.clicked.connect(self._save_changes) self._view_edit_page.search_filter_input.returnPressed.connect(self._filter_based_on_search_text) self._view_edit_page.cancel_button.clicked.connect(self._cancel) - self._view_edit_page.create_new_button.clicked.connect(self._create_new_config_file) self._view_edit_page.rescan_button.clicked.connect(self._rescan_config_directory) def _setup_page_start_state(self) -> None: configuration: Configuration = self._configuration_manager.configuration self._view_edit_page.set_current_main_view_index(ViewEditPageConstants.NOTIFICATION_PAGE_INDEX) - self._view_edit_page.set_config_files(configuration.config_files) self._view_edit_page.set_config_location(configuration.config_directory) + self._view_edit_page.set_config_files(configuration.config_files) def _switch_to_import_resources_page(self) -> None: if self._view_edit_page.import_resources_combobox.currentIndex() == -1: @@ -297,5 +276,5 @@ class ViewEditController(QObject): def setup(self) -> None: """Setting view edit page starting state and bind interactions with its corresponding behavior""" - self._setup_page_start_state() self._setup_page_interactions_behavior() + self._setup_page_start_state() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py index e6ca6a1480..f6d51155ad 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/manager/view_manager.py @@ -44,7 +44,7 @@ class ViewManager(object): def __init__(self) -> None: if ViewManager.__instance is None: self._main_window: QMainWindow = QMainWindow() - self._main_window.setWindowIcon(QIcon(":/Application/res/o3de_editor.ico")) + self._main_window.setWindowIcon(QIcon(":/Application/o3de_application_reverse.svg")) self._main_window.setWindowTitle("Resource Mapping") self._main_window.setGeometry(0, 0, view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/error_messages.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/error_messages.py index 93d1ee1754..4316c145ba 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/error_messages.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/error_messages.py @@ -5,11 +5,11 @@ For complete copyright and license terms please see the LICENSE at the root of t SPDX-License-Identifier: Apache-2.0 OR MIT """ +ERROR_PAGE_TOOL_SETUP_ERROR_TITLE: str = "AWS credentials are missing or invalid" + ERROR_PAGE_TOOL_SETUP_ERROR_MESSAGE: str = \ - "AWS credentials are missing or invalid. See " \ - ""\ - "documentation for details." \ - "
Check log file under Gems/AWSCore/Code/Tool/ResourceMappingTool for further information." + "Use our "\ + "documentation to setup your AWS credentials. " VIEW_EDIT_PAGE_SAVING_FAILED_WITH_INVALID_ROW_ERROR_MESSAGE: str = \ "Row {} have errors. Please correct errors or delete the row to proceed." diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py index ecd6d8282c..80ea934209 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/notification_label_text.py @@ -13,6 +13,7 @@ ERROR_PAGE_OK_TEXT: str = "OK" VIEW_EDIT_PAGE_CONFIG_FILE_TEXT: str = "Config File" VIEW_EDIT_PAGE_CONFIG_LOCATION_TEXT: str = "Config Location:" +VIEW_EDIT_PAGE_INVALID_CONFIG_LOCATION_TEXT: str = "Invalid Location" VIEW_EDIT_PAGE_ADD_ROW_TEXT: str = "Add Row" VIEW_EDIT_PAGE_DELETE_ROW_TEXT: str = "Delete Row" VIEW_EDIT_PAGE_SAVE_CHANGES_TEXT: str = "Save Changes" @@ -23,17 +24,11 @@ VIEW_EDIT_PAGE_RESCAN_TEXT: str = "Rescan" VIEW_EDIT_PAGE_CONFIG_FILES_PLACEHOLDER_TEXT: str = "Found {} config files" VIEW_EDIT_PAGE_SEARCH_PLACEHOLDER_TEXT: str = "Search by Key Name, Type, Name/ID, Account ID or Region" VIEW_EDIT_PAGE_IMPORT_RESOURCES_PLACEHOLDER_TEXT: str = "Import Additional Resources" -VIEW_EDIT_PAGE_CREATE_NEW_CONFIG_FILE_NO_DEFAULT_REGION_MESSAGE: str = \ - f"Resource mapping file {constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_NAME} is created"\ - f" with {constants.RESOURCE_MAPPING_DEFAULT_CONFIG_FILE_REGION} as the default region. "\ - f"See "\ - f"documentation "\ - f"for configuring the AWS credentials and default region." VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE: str = "Please select the Config file you would like to view and modify..." +VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_TITLE: str = "Unable to locate a resource mapping config file" VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE: str = \ - "

Unable to locate a resource mapping config file.

"\ - "

We can either make this file for you or you can rescan your directory.

" + "

Please select your project's config file directory using the browse tool in the upper right.

" VIEW_EDIT_PAGE_SAVING_SUCCEED_MESSAGE: str = "Config file {} is saved successfully." IMPORT_RESOURCES_PAGE_BACK_TEXT: str = "Back" diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py index 2ce4279502..85b636bfbf 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/model/view_size_constants.py @@ -14,13 +14,14 @@ MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM: int = 15 INTERACTION_COMPONENT_HEIGHT: int = 25 """error page related constants""" -ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT: int = 10 -ERROR_PAGE_LAYOUT_MARGIN_TOPBOTTOM: int = 10 +ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT: int = 25 +ERROR_PAGE_LAYOUT_MARGIN_TOPBOTTOM: int = 20 +ERROR_PAGE_LAYOUT_SPACING: int = 15 -ERROR_PAGE_MAIN_WINDOW_WIDTH: int = 600 -ERROR_PAGE_MAIN_WINDOW_HEIGHT: int = 145 +ERROR_PAGE_MAIN_WINDOW_WIDTH: int = 100 +ERROR_PAGE_MAIN_WINDOW_HEIGHT: int = 75 -ERROR_PAGE_NOTIFICATION_AREA_HEIGHT: int = 100 +ERROR_PAGE_NOTIFICATION_AREA_HEIGHT: int = 30 ERROR_PAGE_FOOTER_AREA_HEIGHT: int = 45 OK_BUTTON_WIDTH: int = 90 diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss index d8f61713a7..51791dc519 100644 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/base_style_sheet.qss @@ -35,6 +35,17 @@ QComboBox line-height: 16px; } +[HighlightField=true] +{ + border:3px solid #E57829; +} + +[HighlightText=true] +{ + font-weight: bold; + color: #E57829; +} + QToolTip { color: black; @@ -356,7 +367,7 @@ QScrollBar::handle:hover } /* NotificationFrame */ -QFrame#NotificationFrame +NotificationFrame { background-color: transparent; border: 1px solid #E57829; @@ -365,17 +376,38 @@ QFrame#NotificationFrame padding: 4px; } -QFrame#ErrorPage +NotificationFrame QLabel#NotificationIcon { - background-color: #2d2d2d; - border: 1px solid #4A90E2; - border-radius: 2px; - margin: 0px; - padding: 15px; -} - -QFrame#ErrorPage QLabel#NotificationIcon -{ - padding-left: 15px; + padding-left: 0px; padding-right: 15px; } + +NotificationFrame QLabel#NotificationTitle +{ + font-size: 15px; + font-weight: bold; +} + +NotificationFrame#ErrorPage +{ + background-color: transparent; + border: none; +} + +NotificationFrame#ErrorPage QLabel#NotificationIcon +{ + qproperty-alignment: "AlignTop"; +} + +NotificationFrame#ErrorPage QLabel#NotificationTitle +{ + padding-top: 0px; + text-align: top; +} + +NotificationFrame#ErrorPage QLabel#NotificationContent +{ + padding-top: 0px; + text-align: top; + qproperty-wordWrap: false; +} diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/editormainwindow_resources.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/editormainwindow_resources.py index 64ad2212ea..36303e40cd 100644 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/editormainwindow_resources.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/style/editormainwindow_resources.py @@ -1,27257 +1,27546 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - -from PySide2 import QtCore - -qt_resource_data = b"\ -\x00\x00\x01\x84\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01KIDATx\xdac`\x18\x05\xa3`\ -\x14\x0c&\x10\x91\x90\xe3\x18\x99\x98{\x08\x88\xf7\x810\ -\x90\xbf\x1f\xca\xd6\xa6\x8b\x03\x80\x165\x01-\xfd\x0f\xc3\ -@>\x8c\x1dK\xaf\x10h\x00Y\x0a\xc3@\xfe_(\ -{5\x10\x9b\x01\xf9V@\x1a\x8e\x89\xe4[\x03\xb1>\ -\xa5\x0e\x80\x87\x06\x05|\xf5\x81v\x80\x1e1i\xa0\x01\ -\x1a\xe7\x7f\xa1\x96\xff\x83\xf2o\x00\xf1\x19 \xff\x0c\x88\ -\x86a\x12\xf8\x97\x81X\x85\x9c\x10\x00\xd1\x13\xe8\x99\x0d\ -\xd1\x1d\xf0\x05Hs\x00\xb1\x1b\x10_\x07\xf2o\x02\xe9\ -\x1b0\x0c\x0a\x192\xf8\xb7\x80\xf80\x10\xb3\x12\xe3\x80\ -\x1ah\xd4<\xa4B\x1a@\xe6\xcf%\x94\x06@q\xff\ -\x1d\xea\xa8tX\xba\x80\xa6\x89\xbfhi\x84T>\xc8\ -,)b\xa2\xa0\x0c\xea\xa8gxr\x05\xa9|\xdc\xbe\ -Gs\xc0+ f\x06\xf23)\xb4\x10\x1b_\x94\x18\ -\x07\xe4A\xf9\xaf\xa9\xec\x80i\x84\xca\x81F\xa0\xa2W\ -@\xcc\x04\xc4i0C(\x8c\xf3\xbf\xd04\xf5\x03\xc8\ -\x97!\x94\x0d\xdb\x81\x8ar\xa0\x8ey\x8a%\x15S\x12\ -\x02\xd3\x88)\x07R\xa0\x96gQ1\xceA\xec_@\ -,A\x8c\x03\x98\x81\x0a9\xa1\x89\x90\x9a\xf9~\x1a)\ -\xa5\xa1\x0a\x10o\x07\xe2\xcd@\x8d\x9b\x81\xf4&\x18&\ -\x93\xbf\x14\x88yF\x9b{\xa3`\x14\x0cZ\x00\x00\xef\ -\xad\x00\xe1,\x84\xf5\xf4\x00\x00\x00\x00IEND\xae\ -B`\x82\ -\x00\x00\x02h\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x02/IDATx\xda\xed\x96\xcb+\xc4Q\ -\x14\xc7\xe7\xe11\xcd\x90\xc9L\x1a\x22e\xe4\x91YL\ -\x13\x8a\xa2lllX\xa1\x94WQ\xc6\xb3\xd8x\xd4\ -\x10\x0bE\x8d\x14\xfe\x03\x0b\x89\xb2\x96\xc4\xc2B\xf2(\ -\x22\x0by,lH\x16\x1e5\x8d\xef\xad\xab\x8e\x99{\ -~\xbfYZ\xfcn};\xbf\xee\xe7\x9e\xf3;\xfd\xee\ -\xb9\xe7wM\xa6\xff0Z;\x07J\xa0\xf5\x96\x8e\xfe\ -a\x8d5\xed\xe0\x1b\xb0\x95\x0c\xb7\x83\x87aW\xc4\xb3\ -j\x0dx\x00l\x13\xea\x8au>\x82\xa2X\x10\x85\xf5\ -+\x82g\x13~\xcf$0.\xb9P\x88I\xe0Jr\ -!/u\xde!/(P\x04\xcf\x80\x22\x92\x9f0\x09\ -t\x93\x04\x82L\x02\x07\x92G \x0f\x056\xa8\x07\x93\ -\x15\xdc\x16\x80\x8bm\x0a\xc2:5\xb6\xa9\x09\xbcY\x83\ -\xa7\x83\x8b\x18>\x931\x8c\xa1(\x90L\x14\x87Uk\ -\x0d\xb8[\x87\xdb\x11'M\xe7=.\xc8\x1c;9)\ -\x8f\xe1\x13\xacC\xe1d\x85\xce\xe51[e\x02W\x83\ -G\xe41\xaba\x12\x5c\x94\xfc\x02\xb2Q\xe7k\xd2\x07\ -j\x15\xc1\xbd\x84\xbf0\x09\xcc\x93>\x10Vp3\xf8\ -\x03iDe43\xd1f_1y\xc8m\x03\xe6\xb7\ -\xc0\xdf`\xc7\x18^\x0c~'^\x02\x952I\x0e\x81\ -\xbdC\xdb\x90%\x16Z\xf4\xeaD\xafF\x12\xac5\xab\ -q\xe2\x8c\xa1*\x8c\x5ch\x19E\xd6\xa6\xb1\xa6\x01\x5c\ -\x5c6\xb8\x0aO\x02\x17\xfdd\x1aJf\x8aX\x1c\xe7\ -5\xa81\xd6y\x9f\x9cs\x9f\x22x\x16\xe1\xb7L\x02\ -#\xa4\x0fL0\x09\x9c\x91>\x90O\xc1\xee\xaf3l\ -\x91\xc2\xd1E\xf8%\x13|\xf07Ih\x94I\xf2X\ -r\xa1\xbc?\xff\x01\xd1\x8e1Y\xaf\xb1\x05U\xe0!\ -\xd8\x1c\x8d>\xd1\xcb\xdd\x86$\xf7\x80\xcfp\xad\xda\x18\ -F/p\xc6\xfd\xa1\xe2\x8b(3\x81\x0b\x89C\xef\xe2\ -\xa3\x9a\xec\x83>\x10\xe0\x146\x85q\x14G\xf5\x0bv\ -\x96\xe1~\xf0gq_\x80\x02L\x82S`\x22\xc6\xde\ -\x9ff\x05pC\xcey\x9d\xc2\xb1\x90\xf0W&\xf8\x02\ -\xe9\x03K\x0an\x01\x7f$}\xa0\x8cf\x1f\x84>e\ -\xa7J\xd5\xf9\x02s\x09|\x81r&I\xd1\xaa\xbf\xe3\ -\xbe\x00\xb9\x94\xea\xd5\x80\xde\xa5\xd4\x91@\x0d\xb8\xffU\ -\xf1\xff\x00\xf0W\x81\xb2\xb1-\xb20\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\xa1\xcb\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0b\x22\x00\x00\x0b\x22\x01\x09\xe1\ -O\xa2\x00\x00\xa1`IDATx^]\xfdg{\ -cI\xb2\xa5\x89\xf2\x0fMF\x04\xb5\x04@\x90\x00\x08\ -j\xad\xb5\xd6Zk\x15\xd4:\x14\x19Z\xeb\x88\x8c\x94\ -\x91:\xab\xb2\xeaTU\xd7Q=\xdd}\xfav\xf7\xcc\ -<\xf7\xfe\x13\xbb\xef\xf2MFe\xcf\x07{\x00\x92 \ -\xf6\xden\xcb\xcc\x96\xb9\x9b\x9b\xc7\x84\xc7\x1f[\x04\xc9\ -Ar'\x9eZ\xf1\xec+\xabX\xfe`5\xeb\xdfX\ -\xc3\xd6\xf7\xd6\xb4\xf3\xa35\xec|o5\x1b_Y\xc5\ -\xea;+Y|n\x05\xb3\x0f-:qf\xe1\xa1c\ -\xcb\xea\xdd\xb2@\xfb\x92\xa57MYZ\xfd\x88\xa5\xd6\ -\x0dyR?li\x0dc\x96\xd68\x8eLx\xaf\xfc\ -\x9cZ7b)\xb5\xc3\x96\x5c3dI\xd5\xc3\xc8\xa8\ -%\xd5LXr\xdd\x8c\xa54,Xj\xd3\x8a\xa5\xb7\ -\xae\x9b\xafs\xdb\x02\xbd\x07\x16\x1c\xe0\x1a\x83\xd7,{\ -Hr\x82\x1c\xf2\xbb=\xcb\xec\xdf\xb6\xcc\xbe\x0dd\x1d\ -Y\xb3\xcc\xde\x15\xcb\xec^\xb2\xcc\xae\x05\xf3\xb7\xcdX\ -F\xd3\xa8\xa5\xd6\xf6ZRE\xab\xc5\x17\xd7ZlA\ -\xa5]\xce\xaf\xb0K\x055v\xa5\xb8\xd5\x12\xaa\x87,\ -\xade\xd1\xb2\x07\x0e\xadp\xe6\xa1U\xae\xbc\xb3\xba\xcd\ -o\xac~\xeb;\xabZ\xfb\xc2\x0a\xe7\x9e3.w,\ -\x93k\xfb\xfa\x0e\xcc\xd7\xb3o\xfen^\xbb\x90\xce]\ -^w-\xd8\x7f\xc8\xb8\xdd\xb4\xc2\xf9\xfbV\xb6\xfa\xcc\ -*\xd6_Y\xf9\xfaK+\xe5}\xf1\xf2c+Z~\ -\x80\xdc\xb3\xfc\xc5\xdb\x96;\x7fj\xd1\xb93\xe4\x8e\xe5\ --<\xb0\xd2\xf5\x17V\xbb\xf3\xceZ\x0e\xbe\xb0\xee\xe3\ -\xaf\xad\xff\xda\xb76p\xed\xa3\x0d\xde\xf8\xd1F\xef\xfc\ -\xc9&\x1e\xff\xb3M\xbd\xf8\xaf6\xf7\xfa\xffc\xf3\xaf\ -\xff\x87-\xbc\xf9\x1f\xb6\xf2\xf6\x7f\xd9*\xb2\xfc\xfa\x7f\ -\xda\xc2\x8b\xffn\x93\x8f\xfe\xdd\xfaO\xffj]\xd7\xfe\ -h\xedG\xbf:\xe9:\xf9\xa3\xf5\xdd\xfc\x8b\x0d\xdf\xfe\ -\xbb\x8d\xdf\xffw\x9b~\xfc_m\xe6\xc9\x7f\xd8\xe4\xc3\ -\xffb\xa3w\xff\xcdzo\xfc\xcd\x9a\xf7\xff`5\x9b\ -\xdfs\xcf_[Ld\xec\xaeE\xc6\xeeYt\xfc\xbe\ -\xe5M>\xb2\xe2\xb9\x17\x0c\xc6{\xab\xbd\xfa\xb552\ -\x18\xcd\xbb?X\xf3\xcewV\xbf\xf9\x95U\xaf\xbd\xb3\ -\xf2\xa5\x17V2\xf7\xc8\x0a&y\xa8\x91k\x16\xe9\xdf\ -\xb5\xec\xee5\x0b\xb6\xcf[\xa0e\xca\xfc\xcd\xe3\xe6k\ -\x92L\x98\xafy\xd22.\x84\x9f\xd3\x01Az=\xa0\ -\xa8\x93r\xc6\x00\x82\x14?e\xc9\xf5s\x96\xd2\xb8h\ -\xa9\xcd\xab\x96\xd6v\xd52:\xb6\x18l\x94\xdcwd\ -A\xa7\xfc\xeb\x96=\x8c\x00\x80\xacA~7\xb0\xcf\xdf\ -\x04\x90\x0d\xf3\xf7\xac\xf1\xd9\x15d\xc9\xfc\x9d(\xbfc\ -\xce|\xadS\x5c\x0b0\xd6\xf6YRe\xbb%\x944\ -Z\x5cQ\xad])D\x8a\x1a-\xb6\xb4\xd3\x12kF\ -\x1d\x00\x82\xbd{\x967~f\xa5sO\xadr\xe9\x8d\ -U\xf1\xec\xe5\x0b\xaf\xacp\x1a\x90\x8f\x9d9\xe0I\xd1\ -\x99\xbd\xe7\xd2sd\x81\xee}\x0b\x00\x88`\xff\x91\x85\ -G\xaf[\xde\xd4\x19\x80\xb9o\xc5\x0b\x8c\xdf\x22\x8a_\ -xh\x85\x0b\xf7\x91\xbbV\xb8x\xd7\xf2\xe6Q\xfc\xec\ --\xcb\x99\xb9e\x91\xe9S\xcb\x99\xbem\x05\x80\xa6\x14\ -\x90T\xaf=\xb3\xc6\x8d\x17\xd6\xba\xf5\xca\xdav\xdeX\ -\xc7\xfe\x07\xeb\xb9\xfe\xd1\x06n\xffj\xc3\x0f\xfebc\ -\x8f\xfe\xeed\xea\xc9?\xdb\xc2\xf3\x7f\xb5\x85g\xffb\ -s\x8f\xff\x93M?\xf8'\x1b\xbc\xf5\xb3\xb5\xee\x7fe\ -\x8d\xdb\x1f\x90/\xd0\xd5\xd7\xd6~\xf8\xbd\xf5\xdc\xf8\xd5\ -\x06\xce\xfe\xc9F\xee\xfd'\x1b\x7f\xf8o\x00\xe5?\xdb\ -\xf8\x83\x7f\xb3\xa1;\x7f\xb7\xee\xeb\x7f\xb6\xa6\xbd\x1f\xac\ -\xea\xea\x97\x5c\xff\x1d\x00\x18\xbd\x09\x8aO\xb1\xfe;V\ -0\x0d2\x17\x9ec\x01\xb2\x86/\xadi\xfb[k\xd9\ -\xfd\x0e\xf9\x160|iu\xeb\xef\x18\xa0\x17V6\xff\ -\xc8\x8a\xa6n[\xfe\xd8u\xcb\x1d:\xb0\x9c\xbeM\x0b\ -w\xafZ6\x0a\xc8F\x01Y\xed\xb3\x16l\x9b\xb5L\ -$\xd0:k\xfe\x96i\x80\x018\xf0\x12\x12_\xe3\x94\ -e4\xce\xa0\xa4yKk\x92\xe2W,\x0d\xabOo\ -\xdf\xb4\x8c\xce\x1d\xf3i\x805\xd8\xfd'\x0e\x00Y\x00\ - \x0bEd\x0d\xea\xe7c\x00p\xc0\xdfv\xf9\x0c@\ -\xe9\xb9\x8a\xf2W\xb1\xca%\xf3u,\x98O\xd6\xdf\x8c\ -\xc7i\x18\xb6\x94\x1a\x01\xa0\xc3\x12\xcaZ,\xbe\xb4\xd9\ -\xe2Jx-\xeb\xb4\x84\xaa\x01@7\x89\xa7Y\xb6`\ -\xcf\x8eE\x86\xafY>\xcf_4\xfd\xc8Jf\x9eX\ -\xd1\xe4\x03\xcbC\xf9\xfa\xbdW>\x7f\xd7\xaa\x16\xefY\xcd\xca\ -C\xab_\x7f\x8a\xc1\xbd\xb6\xb6\xc3\x0f\xd6\x81W\xe8\xbe\ -\xf1\xbd\x93\xbe\x9b\xdf\xdb\xe8\xd9\x8f6r\xfa\x1d^\xe2\ -k\xeb;\xfe`\xad\xdb/\xadj\xf9\xa1U,=@\ -/\x8f1\xda\x97\xd6\xb4\xfb\xde\xda\x8e\xbe\xb1\xae\xeb?\ -X\xef)@\xb8\xfd\x9b\x0d\xdc\xf9\xb3\xf5\x9d\xfe\x91\xdf\ -\xfd\x8c\xc7\xf9\x887\x7foe\xcb/\xf0\x5c\x8f-&\ -:\x0e\x82'o\xa2\xfc\xdbX\xff}+_~\x8a\xfb\ -\x7f\x8d\xc5\xbf\xf7P\xb5\xf3\xa55\xf3\xda\xc8?\xd5\xf1\ -\xfb\xea\x95\xe7V\x01\xd2Kf\xeeX\xe1\xc4M\xcb\x1f\ -9\xb6\xbc\xc1=\x8b\x0elY\xb4\xef*`X\xb3H\ -\xef*\x80X\x01\x10K\x96\x85R\x82ms\x16\x04\x08\ -\x9e\xcc\xf33\x96\xd7\xb6j\x99\xed(\x0fk\xf7u\xa0\ -\xf4\xae=\x14\x7f\x80B\xb1\xb0>\x06\xb9\x1f\xcb\x1b\x90\ -\xd2\xaf;\x10\x04\x9d\xf2/\xe4\x08\xd7\x8c\x12\x08\x05\x01\ -<\x81\xbfg\x83\xff\x07\x04\xed\x8b\x96\xd1\x0a\xb0\xf06\ -\x0aA\xc9\xb5\xfd\x96T\xd5\x0d\x08\xba\x10^\xab\xfa\xf1\ -:#\x80\x03\x00\xb6.\xe21\xd6Q\xe8\x0e\xa1\x0cW\ ->\x02\x98GO-o\xf4\xccr\x87Q\x10\xd7\x09\xf7\ -\x1fXv\xdf\xaee\xf5\xe0\xeee\xf1(>\xc8\xbdI\ -\xe4\x9d2\x09\x0d\x99x\x90L\xbeC\x12\xec\xc5\x1b\xe2\ -\x9dB\xc3\x87x\xd5#\xcb\x99<\xb1\xdc\x99\xeb\x16E\ -\x22\xd37,\xb12\xc0V\xbd\ -\x06\x88\xb6_X\xe3\xde[k9\xfc\xdcZ\x8f\xbe@\ -\xd0\xe1\xfe\xe7\xd6\xb0\xfd\xd6\xaa\x09=eK\x8f\xf0X\ -w-\x1f\xf0\xc5\xe4q\xd1\xfc\x99\x9bV\x04ZKp\ -Y\xe5 \xaaz\xed\x89\xd5\xae?C\xe1\xcf\x91\x97V\ -\xb7\xfa\xd2jAL\xf5\xd23\xab\x5cxles\x0f\ -\xacdZ\x00\xb8e\x05\xa3\xdc\xc4\xc8\xa1\xe5\x0fs#\ -\xc3\xbb\x967\xbc\x83W\xd8\xb2\x9c\xfe\x0d\x0b\xf7\xaeY\ -\xa8k\x19\xaf\x80g D\x84x\x0dw\xaeX\xa4{\ -\x03\x90\xec\x12>\x0e-\xa4\x18?p\x822O,\x80\ -\xf8Q|\x00q\x00\x90\x07\xe8g\xc0q\xb5\x99\xb2>\ -^\xb3\x1c'@\xc4?\x18\xbcL\x06<\xd0\xbb\x0d\x00\ -\xd6-\x03`\xa5\xb7\xccX*\xa1&E\x00\xa8\x1b\x04\ -\x04\x03\x96\xc2kj=._\xde\xa7m\xc1\x02\x9d\x84\ -\xac\xdeM\x94\xb5k\xa1\xa1}\x0b\x0f\x1f G(\xe4\ -\xc4B\x5c/\x9bke\xf7\xee[6\x8a\xcfF\xb1\xd9\ -(9\xc4\xefB\xdc_h\x10%\x02J\xdds\x10\x00\ -\x04\xba\x01o\x07a\x0b@K\x1c\xa8\xf0\x88!\xc6!\ -2q`Q\x14\xe3\x000u\xc3B\xe37\x9c'\x13\ -x\x5c\x18\xc1\xdbevm\x01\xae-\xae\xb9ea\x8c\ -(\x87\xb1\xcb\x1d\xde\x02\x14\xdb(v\xd7\x0a&\xf6\x90\ -}+\x9e>D\xe1'V1{he\xd3\xbbV<\ -\xb1i\xd1!\xf1\x1e\x7f\xe4\x00!\x9e\x8e\xec\xf2\x00;\x963@X\ -\xe8]w\x9e \xdc\xc5\xcd!9\xbc\xcf\xed\xbdj\xb9\ -\xb8\xef\x5c\x94\x97\x8b5Dq\x87\xe1\xb1\x9b\x96\x85\x0b\ -\xcd\xc4\x0a\x03X\xbb\x1f\xc5\xfb5HX\x9cbm\x00\ ->\x10\xe8\xd9s\x03\xee\xb9\x5c\x06\x94\xff\xd1\xff\x85\x00\ -`pP\x9ec\xcb2\xda\x09%-s\x00`\x12B\ -\x09\xc7\x80\x94\xa64\xc07D@\x09C\x19x\x88@\ -\xf7:\x83\xb5\x85\xe2\xf7,2\x8a\x95\x8e\x1fC\xf6\xf8\ -\xceQ\x11L)U\xca\xe1z\x90P\x7f\xc7&\xaf\x9b\ -\x16D\xc9\x02E\x88P\x14\x199\xe5\xfa\xa7\x8e\x97\xe8\ -~\xfc]\x9b\x96\xde\xb6L\x18\x9b\xb7\x94\xe6YB\xd9\ -\x19\xf7\xd1M\xc6h\x9b\xe7\xdb\ -a\x8cw!\xed{\x84\xa8}\xe4\xc0r'\x8f,:\ -y\x8c\x9cXL\xc1\x0cDe\xd6\x93\x22\x85\x81\xa9[\ -V\x02ZK&\xafY1R4y\x1d\x81\xe9\xe2\xee\ -\x0b\xe4\xf2Aq\x9eb?\x03\x16E\xf19\x83\xfb\x16\ -\x19\xdc\xe5\x15\xc4\x0fn#B2\x16@8\xc8\xeeY\ -\xb5\x10J\x8f 9\xbc\xcf\x05\x10\xf9\x03 \x1b\x8b\xcb\ -\xe7\xff\xf3\xf8\xbe\x5c\xae\x17\x01\x84\xa1\x09\x06\x94\xdf\x05\ -\xb0\xec\x00V\x1e`\xc0\xfdX\xa1\xc8\xa0\xbfk\x07\x81\ -\xf5c\x91\x22\x81\x22^\x11\xbcO\x0e\xe4+\x02\x10\xb3\ -\x01\x81<\x81\xbf\x1be8\x10\xcc\xa3\x10\xb2\x8a\xa6i\ -^\x91\x16\x14\xd36\x8f\xa5.;\x00\x04\xfb\xb9\xbf!\ -\x5c\xff(\xd6?\x8er\xc6\xb1\xf81<\x8d\xae\xad\xeb\ -b\x9d.,\xc1I\x1c\x08\xb8v\x90{\x91\xe2B\xc3\ -x\x80\xa1\x1b\x84\xa7#>\xb7\xcd\xf5V\xb9\xc6\x9c%\ -\x13V\x92\x1a&-\xb9i\xd2R[QL\x07\xdc\xa7\ -{\x01O\xb6\x0a@7p\xfbx\x9ba\x80\x06\x00\xc2\ -|G\x18/\x12\x22\x94\xb8\xf0\xd2\xb5A&\xb5l~\ -B\xa4\xafe\xc2e0\xe9MCp$\xa4i\xd8\xd2\ -\x9bG\x10~\xd7\x0c\x81n!\x93j\x01\xd4N\xf43\ -\xc4\xba\x15\x92\x0d\xf1\xcdh\x9b\xe6\xbeg\xe0Cs\x5c\ -{\x1e\xa3\xc0\xdb\xe1\x192\x07\x00\xe3\xe0\xba\x85F\xb6\ -\x00\xc5>`8f\xdc\xd1#\x844\xa6d\xe99\xee\ -\x82\xb4E\xc4N`\x90\x92\xb1\x8c\x5c,$g\x00\xa5\ -\x22a$$w\x89\x84%X\xb0'\xfc\x9e\x18\x1c\x92\ -E\xe1\xf6\xb2Qz\x16J\xce\x82\x99\x07Qz\x10\xab\ -\xcf&\x04\xc8\x0b8\x00\xf0\xf7<\xbe+\x0f\xb7\x9b;\ -\xc25\x88{\xd1\x09b-7\x94=\x86\x8b\x1f\xc1\xda\ -\xf9[\x00\x92\x17 \xfe\x06 _\x01\xdc\xaf\xdc\xac\x06\ -\xdb\x01\x00R&\xab\x8f@\xa6\xc4\xa6s \x5ca\xee\ -9\x8b\xc1\x0dpO>\xc2Kz\x87\xb2\x09\xac\xb2u\ -\xc9IZ\x9b'\x19\x00\xc0\xd7\xb5\x827A)\xfd\xdc\ -\xa7S\x0c\xeewd\x87Wb\xbcx\x85\xc2\x8d<\x0f\ -|$\x00/\xc9D\x82\xe7\xde\xc7\x0b?\xe2&\xf2N\ -\x5c\x0b\xcbM\x83K\xa44\xcd8\x00$\x03\x80\x14R\ -\xdeT8H\x1aDT\x8a\xf1\xb5\xcf\x00\xdeE\xee\x1d\ -\x83\xe8\xc7\xeb\x10\x02r\xe0\x18\xd1\x91[\xb8p\x80 \ -\x22\xd9\xb3i\x99\x1d\x90X\xb2\xa8t\xc8k*\xdc%\ -\xa5\xa6\xc7\x92\xab\xbbH\x97\xbb\x09c\xbc\xaf\xebC\xfa\ -!\xaf\x10\xd8\x06\xc9 \xd7\xe2\xb3\x8d\x0amx8]\ -\x13\xf0\xe9\xbai\x80(\x8dk\xa7\xb5O[z'@\ -\xe8\xc5\xb3\x0c\xe0\x8dF\xe1j\x18t\xfe\xccm+\x9a\ -\x7fH\xc6\xf2\xd4b*\xaf~n\xe5\xabo\x88\xff\xcf\ - \x82\xf7\xb1\xec\x1b(\x1dW\x0b\xc3\x0ev\xc95\xad\ -\xe3^H\xb5\x10\xc5\xceL\x5cU\x90\xd7\xac.\x09\x83\ -\xe8\x04\x85#\x99\x1a\x5c\xdcX@.\x90x\x1fh\xc7\ -\x9dA\x04\x9d\x17\xe8Y\xb7\x1c\xe2n\x94\xfc=\x0a\x88\ -\x22\x10\xb80 \x0b\x112\xb2P@p\x18\x05\x0f\x91\ -\xda\xe1I\x02\x90\xcaL<\x8b\xac:\xb3_ \xd8\x05\ -\x00\x02\x011S\x8c\x9c\xf0\x91=v\x0d\xaf\xc1\x00N\ -*\xb6B\x16\x01\x94\xf3\x02\xf0\x81\x0cy\x82N\x01\xe1\ -*\x16\xba\xce@\xac\x01\x00<\x03 H\x87'dp\ -_J\x19\x03\xa4\x8e\x01\xcd\x1fh\x1e\x01\x00\x07\x01P\ -\x96\x14\x22\x1e\x00\x07\x099\xc1\xeae\xf9(_\xe1G\ - \xd0=\xf8\xbb\x15r\xf8^R\xc9\xd4&\xd2X@\ - I\xd5|\x88\x14\xa1\xb0\x83b\x94\x02\xfb\xb0\xec\x00\ -\xdcG|\x22\xc2wDG\xb0\xbe\xd1[\x18\x01c\x0d\ -\xe8\xb2\x19\x97L\xc6\xcd\x87\xe7HG\xa1\x9aGI\x11\ -w\xa9A\xe1\xff/IrBv\x03H\xc4q\xc4u\ -R\x95Z7\xa0tB\x9f\xe6\x5c\x04\xc0T\xae\x9b\x06\ -!\xf6\xc2\x11\xe0#\xc2\ -\x00\xd6\xef\xc3\x12\x15\x16\x02()\xa0\xf9\x00\x88[\x90\ -0\x14$\x15\xd5\xe7\xfd|\xb7O\x84\x10o\x91\xc1\xfd\ -g\x10_3p\xe1\xe9m\xb2T\x00\xd0\xbc\x88\xcc\xe1\ -J\x19\x18\xc8\xa2\x14\xe3\xee\xb5\x83g\x121D\xa9\xd9\ -(7\x8c\x92#\x837 dX\xaa2\x02\x5c\xb6,\ -W$Qia\xa6\x00I\xec\xcf\xc0\xfd+\x95\x14\x08\ -\xd2\x9a\x17x%\xad\x15\x0f\x10\x08\xce'\xbf\xd2\x01\x83\ -\xafu\xce\x19N\x08\x8f\x19\xc5S\xe5\xc1w\xf2\xe0>\ -\xb9\x84\xd2\x1c\xee?\x84Qduc`\x18\x8dOJ\ -#e\xd6\xff\xa5\xa3P\x89\xfb\xae\xfaq\x801\x0a(\ -.&\xd1\x06\x01\xc2\x10\xdeA\x80\xe1\xef\x0d\x80\xa7i\ -\x96\xffE\xe0A\x19\x0ay\x18_\x00\xce\x95%oN\ -\x88-\x9c\xbf\x87\xb1C\xee\xb7\xde\x93\x0e~c\x9d\xc7\ -?ZL7\xf9b\xe3\xee\x97V\xbe\xf2\x12rp\x8f\ -\xd8\x08\x19S\xec\x85\xfc\x88\xd5\xa6\xc9\x85\xb6\xf0p\x90\ -\x9ct\xbe\xd8\x87\xf8y\xd0@+\xf1M\x22@\x00\x8c\ -\x00\xaf~~\xfe\xbd\xe8\xf7Y\xb8\xe3\x10n9\xdc\x03\ -?`\xe0\xc2H\x88\xf7A,4\xc0\xdf|\x9aE\x04\ -(\xe9\xdcp:\x8a\xc8\xc0\x8b\xf8\xb9i\x7f?\xe4\x08\ -O!\x00\xf8\x09\x07Np\xc3nVN\x82g\xf0c\ -\xb1~\x06\xd5\xafT\x10\x8f\xe5\xc3\xf2}R\x0c\xca\xd7\ -L\xa2f\xeb\xfc\x12\xcd-h\x8e\xa1m\x8d\xc1\x01\xcc\ -(,\x83g\xca\xe09|\xbc\xf7\x03\xf0L<]\x16\ -\xf7\x15\xe6{s\xb0\xd2\x1c\xb9j\xdc\xbdK\x07q\xf9\ -!\xae\x9f\xa5\x94O\x9e\xa8c\xc3}W\xba@\xc5\xf7\ -\xa5;Y!\x0e\xaf\xa0@\x0cE)\xa6\x9e\x9fW\x19\ -@\xb6\xb2\x1e\xdc\x7f\xee\xc8\x89\xe5+s\x9a\xba\xed\xd2\ -\xee|\xc2X.\x9e,B\xf8\x09\xf1\xbcAB\xa7<\ -\xa8\x9fp\xe0g\x5c\x9f\x89\xc7\x08:\x81x\ -t\x10&\x88\x93\xd9XV\xa8G\x96\x8f\xdbWJ\xc5\ -\xfb,\x00\x16\xe03RF\x1a\xc8Mm\xf4\x08[Z\ -\x1b\xe8\xd5\xa4\x0e\x83\xe1\xc3-K\xc9R\xb6\x0f\x05\xf8\ -\xb0|)?\x83\xef\xc8\xe0;2\xf8\xdet\x067\x83\ -P\x95\x81\x05+\xf6\xa7\xe3\x96\xd3\xdb5\x9b\x08(\x14\ -\xc3{4y\x83\xa7\xd0+\x1e$SdR\xd7&<\ -\x04\xf8\x5c&\xaf\x02c\x16^#\xa4\x18MF\x91C\ -\x88\xc9\x19\x22\x97'\x14\x86\x19\x8bl\xdd/\xd7\xf2\xfe\ -o\x03\x85\x5cE\x94v*\xfd\xe3\xbd#\x8bb\xf3\xfa\ -\xcc\x16!\x11OBV\x12\xc2#E\xf0bQ2\xa5\ -|M\x19\xa3\xf4\xa2\xd9{d[\xf7\x1c\xe9\xce\x87\x84\ -\xe5b\x999\xa4\xd1a\x88\xb4R\xc1`\xcf\x06\xf7,\ -\xc1C*\x0c+<\xa0L?^V\x80M\x85k\xa4\ -\xa0\xf4d\x94\xafi\xf4\xe4\x1aV.\ -k/D\xf1E\xf3\x0f\xdc$L\xf9\xf2#8\xd7}\ -\x97z\xe7C\xca\x22dE\xd9x2\xa5\xa7N\xe9<\ -o\x10\xd0k\xc63\x0b\x91N\x02x7\x97\xe6\x8ao\ -\xd4\x93m\xd4\x8c\x9d\xaf\xa3\x90\xee\xd6)L\xa0\x17\x9e\ -\xdf\x8f\xd1\xb9y\x05\x9e@\x00\x10@\x95e\x9c[\ -\xbb\x03\x80\xb2\x1d\x94\x0fA\x94\x08\x0c\x01\xcds\xa0\x17\ -\x19\xa4K9k\xc7\xddz\x86$\xa9\x8eq\x83\x03\xe8\ -o\x19\xa4\x93\x01t\x98\x05h\xc2\x84\x9c\xa8\xb2:X\ -\x7f\xc1\x9c@p\xd7\x8a\x97\xeeA\x00\x1f\x01\x82g\xd6\ -\xb6\xff\xcab\x0a\xa7oXt\x5c\xd3\x92\x9al\xc1\xda\ -x\xe8\x0c\x91>,S\x00\x90\xd2=!\x0e5+\xbe\ -\xad2\x10\x905,!\x93\xc1\xc8B\xe9!\x5ck\x18\ -\xeb\xce\xc1E\xe7\x10/\xf5z\xa1h)\xffB\x22<\ -\x98\x16\x8fr\xe4\x9ex\xe0l\x91@\xd8\xb1b\xa6\x08\ -Lj\xa3\xc8\x93\x08\x10y\xb4\xf8\x0610\x00\x00\xe4\ -\x0e3!wN\x18\x08Y\x83r~\x111'\x00\xc2\ -\x0f\x10}\xf2(\x88\xf8K&\x96\xa9\x19\xbb\x9c1\x1e\ -|\xf6\xb1[\xc4\xaaXye\x15\xab\x92\xd7(\xe0\x15\ -\x16\xf9\xc2\x8a\xe6\x9eY\xe1\xccc\x0c\xe0\x1e\x83u\x8b\ -AS\x06\xb0\x8b\xdb\xe5;]\x88\x02P\xcd\x00\xacE\ -\xe3\x22\xe3\xc0\xf2\xf1,R~\xd6 \x19\xc8\xf0)\xd7\ -\xb8\x8d\xe2\xef\xa2x\xb9uM\xb1\x22(>\x8f\xb8\xeb\ -\x04\x05\xe490\xdc\xc1\xd3b\x89N\xf9w\x00%\xe0\ -\x1c\x87_\x0c\xe8\xd9D\x88%\x1b.vg\xcb\x0b\x01\ -FI\x96V?\x19\x03)7\x95qJ\xaa\x9f\xb0D\ -\xc8_\x02\x5c \x01R\xa8\xf7JA\xf57e9~\ -B\xa2@\x14R(\x83hF\xf1\x02\xd1)\x84\xeb)\ -\x13\xc8\xe3\xb5p\xf6\xa6\x95\xcc\x9fZ\x8c\xdc\x8d\x06V\ -3i>\xc5}\xacR\x1e@\x0f/\xf4\xfb!6\x9e\ -\xe8\xe7s\xc5kb\x04+P\xb6\x10\x92\x95\xe1JE\ -\x98\xa2\xc3\x5cL2\x04\x8b>\x8f\x9f\x9e\x17\x80\x5c!\ -\x11\xae\x93\x03a\xcb\xe1\x01#\x90\x9e\x90\x18*n>\ -\x93\xf8\xe6Sz\xe6H\x19\xfc\xc2e\x10\xe4\xce\xca0\ -\x94f\xa2\xec,\xee/\x8b\xff\xd7\xf2sP\xaf\xdcw\ -\x16\xdf\xffI\x00\x98\x16v4\x1f\x9fE\x98\xc9\xe6~\ -\x22\x9a\xd7\x9f\xbc\xcf\x83>u$\xb7b\xed\xb5K\x7f\ -\xaa\xd6\xdf\xc2\x86\xdfZ\xd9\xca\x1b\xdc\xe2+\x97\x02\x17\ -\xce\xe2\x11&Q\xe6\xa8\x8ca\xdf}\x7fPs\x0f<\ -k\xa0\x13W\xdf\x85K\x86Gd\x91\x16z\x16\xcfg\ -\xc7Q.\xdf_\x80G)\x9c}\xe4\xbe\xa3\x00W/\ -eG\x89\xef\x11R\xd4\xc8\x04\x16>\xa6\x99FM`\ -\x1d\xe1uN\xf0>\xd7y=&\xe5\x16\xdf\xd0=\x03\ -\xdan<*\xbcGK\xdcY\x9a{!~\xe7\x11B\ -\xc4\x1d\xf24c\x8a'\x08IGx8\xf1\xb1d\x98\ -\xbf\x07\x82aK\xa8\x1d\xb1D\xb2\x84dx\x94f\x22\ -}\xf0\x00y\x0c\x01G\xcb\xe7!@\x1d\x22M\xce\x86\ -kd\x911\x051v-\xa9\x07\x09s1\x9a`\x91\ -\xc8\xb5z\x0cZ\x0b+\xc4=,@3TY\xfcN\ -\xf1:\x9b\xcf\xc8\xda\xb3dY\x9a\x16u\xb1\x93\xf8\xa5\ -T\x09\xf7\xa7\x85\x14OH\x9b\x86\xbc\x85\x94\x90\xe6\xd1\ -Q^\x88\xef\x09\xf3}.\x15\x84\xd8i\xe1\xc8M\x15\ -\xf3\xb0\xd9\x9a8\x12\x08\xf0\x04\x9a\x0d\x0b82\xe9\x89\ -G$5\xcf \x22\xc9}\xf0P\xfa\xce\x90<\x08\xe1\ -*\x0ca\xd3B\x8e\x13\x0d\x10\xa2\x1a\x85\x08\xf9\xb5\x96\ -r\x9dr\xb4\xc2\xb7\x00\x00\x96\x9f\x03\x02\xbc\xc0\xeaK\ -@\xf0\x1a\x00\xe0\x05\xf0\x08\xa5\xfc\xbeh\xfe\x11\x96\x8b\ -\xd2\xc65KG\x08\xe0\xbb\xb3\xf1`\xd9\xe7s\x02\xa1\ -\x01\x14>t\x06\xa0n\xf3\x19B\x06\xdf\x9bGH)\ -\x9c{\x845?\xc5\xb3<\xb7\xca\x15\x85\xd2\xc7.\xb6\ -\xe7\xcd\x9cZXs\x13\xc4\xf6\xe0\xa0\xe6.\xf0Z\x80\ -=\xd0\xb3\xee&\xcc\x22<\x7f\x98t\xd7{~1\x7f\ -<+\xa2e\xedL\xe5\xec\x9aY%~\x17A\xdeJ\ -\xf1&ex\x95\x92\x09\xc2\x85V'\x01\xa4O\xd9\x07\ -\xa19\x19\xf6\x9f\x88\xfbO$3Hl\x98\xb0d\xcd\ -|\x0a\x00\x18\xb0\x00\x90\x89\x17\xd0\xd2\xb9\xc2I\xa6x\ -\x04?\x07\x18?\x17N\xd1\xa9$&@\x8c\xd6<\xbb\ -\x1f\xcb\xb9\x10}0\x0bt\x88\x08i\xc2&\x8aE\xe4\ -2\xb8Q\xdc{\x14\x92\xa3\x19,O\xe9\x0c2V\x90\ -O,- \x85\xd4\x92j\xee(\xb1\x14\x00\x84\xb0J\ -)-\x0b4f#!,9\x8c\xcb\xcf\xe1\xc1s\x07\ -\xb7-wh\x9b\xef\xc2\x1b0\x18\x9e7\xe0\xb3\xb0\xdd\ -,\xa5c(=H|\xd7\x8a\xa1^\xf5\xb3H\xa5x\ -\x83f 5\xfd\xac\xfc9G,\x17\x89\xf0\xde\x13~\ -\x1e\xc1\x13\x11\xcf\xf3\xb8\x97\xfc)\x01\x80\x98\x8f\xa2J\ -\x16P\xce\x22\xb1w\x09Y~j\xc5\x8bOP\xfcc\ -\xac\x16\x85\x11\xb3\xa3.\x1d\x03DR>\x03\xa6\x95\xba\ -\xf0\xf9\xdc\x7ft\x0cw>\xf1\x00\x90\xc0\x1df\x1e\xb9\ -\x82\x98\xc2\xb9\x87V\xc6w\xd4\xc2\xaa[\xb6_#\xaf\ -\xacq\xe3\xa9U\xa9\x00dJ\xcb\xd7\x1aS\x19\x94\xb2\ -\x12\xc2\x08i\xa1K\xa3Q\x90\xe6J.\xc4M\x98u\ -\xe0\xf1:I\xa9{V\xf0<\x02\xc0\x0e$\xf2\xc4J\ -\x08\x1d\xe5\x10\xc7J\x00Z\xa1\x05\xb8I@\xaa\xb9\x88\ -ntD\x18N\x87\xf3\xb85\x08\x91hxT*\x1e\ -T\xd7\x12\x99\x8c`\xe9\xca>\xa2\xf0\x80\xc80\xe1\x0a\ -@\x8bC]L\xa8\x05\xf4\x1dH\x8c\x98\xabf\xb7T\ -y\x93\x89\x82\xb5\xcc\xaaU\xb6\x08.#*\x97\x85\x14\ -\xe0\xc2\x0a\xb5d\xc9\x97\x15\xe0\x8e\x0a\xc7\xb5^@^\ -\xc9\xe0\x951\xb8\xaa\x0f(e@\x0a\x88\x81Q<\x80\ -\x18\xb5f\xbdD\xf2\xbc\x89\x22ra,<\x8c\x8b\x13\ -\x00\xf2p{Z8\xca\x1f\xddw\x927B\xaa\xe4\xa6\ -\x9e\xc5\x0d\x142\xf08\xf2>\x22\x98\xf2\x00\xb0\xf0\x10\ -`\xd2\xdf\xa4|M#\xe7\x89\xe1\x8e!\xdc\x97\xd2(\ -1i'zh\xc7\xc0\x05\x02B\xc0\x04\xf1yR\xa1\ -\x00\xef\x84D\xf5:\xe5\xbd\x8a \xe5\xa0xY}H\ -\xee\x12pi\xba\xd6-\xd3*\x94\xe1E\x14\xdb\xf3\xa7\ -p\xed(\xbe\xd0)^\x96\x0f\xa1\xd3\xd2\xf9\xe2Ck\ -\xdaxf]{\xaf\xac{\xef\xa5\xb5m=\xb1\xba\x95\ -;V0\xa1\xd5K\xcdF*;\xd1<\x8a\xea\x1e\x94\ -F\xc3q p\xeeU5\x11Xl\xb0}\x8eg]\ -\xe0\xf9\x96\xe0Hk\x18\x1c^\x01\x83\x10\x18\x8b\x09#\ -\xe5\x90\xc7J-\xc6!Z\x85\xcd\x1f'\xf4\xc8\x13\xe0\ -a\x15\xf2\x02\x8c\x93\xe3m\x22\xee\xce\xf5\xe3i\x87\xf7\ -\xad\x90\xf4\xb2\x08b_D\xec\xd7\x1a\x8e<\xa3\x96\xaf\ -U\xd7\xe02\x16\xe7\xd9N,&\x17\x0b\x8e\x8e\x8b\x05\ -\xe3\xe2\xb0\x1c\xad\xb0ET\xdc\xa0\x14\x86/)\xc0\x95\ -\x15j\xad\x9a\xc1\x16\x08\x0aa\xca%\x90\xa5JHN\ -\x0d\x03P\x8b\xdb\xabY~b\x15\xaa\x82\x99\xe2{\x18\ -8\xb9O\xcd\xaaerc\x9a\x0c\xcal\xd7\x84\xc8\x12\ -\xc8]\xe5!\xaf:\xcb\xcf\x13\x00\xc6\x0e\xf8\xfeC^\ -\x11\xe2a.\x0a\x94\xb7\x11I\x8c`\xed\x0a\x1d\xd9\x9a\ -G\x90(\x8c\x88C`\xa1\xb9\x9aM\xe3>\xf2P\xde\ -\x05\x00\xc2C\x90&b\x9b\xf2i\xa5q\xb2\x00\x97\xd2\ -i\xda\x18P\xbb*\x22\xb9A\xd2-\x89J\xcaD\xb6\ -\xa4(\x0d\x9a\x98\xb3\x08\xa6\xf8\x84\xb7\xe2\x088\xc6\xf1\ -\x0c\x0e@x6\xc0\x9dG\x98\xc8\x83\xddk\x11%_\ -\x8bf\xb3\xa7(\xfc\x9e\xb5o>B\x1eZ\xcb:c\ -\xb2\xc0\xb8\x8d*m\xc3B\x9d\xf2\xc9\xa4\x1c\xc1\xc5=\ -\x93\xbe\xa5\xfdN\xd2\x01A\x16\x00\x08a\xfda\x01\xa0\ -\x97\xf1\xe9\x07\xf4x\x0e\x01R\x0bo\xaa\xbb(#{\ -\xa8 },c\xbc\x0b\x09\x09yd\x1a\xf2t\x0a{\ -Y\x8c\x95RG\xf7\x0cH\x10\x8e\x95\x8b\xd1\x16O\xdf\ -\xc2@o#0\x7f\xee[\x9eY\xa48{P\xe1\x0c\ -/=r\xc6w\xdc\xb6\x98\xe2\xf9g\xa0\xf9\x89#1\ -\xf9Z\x0b\xe0A\x9d\xc5(\x9d\x11\x08\x88\x8b\xf9(\xbf\ -@\x1e\x00\x17+)f\xe0+g\xcex\xd8{V\xbb\ -\xf4\x00 <\xb0r\x15\x18hiW\xf3\xe5\xa4|A\ -,6S\x88T\x5c\x07\x00\x99\x1d\x80@\xb5\x01=\xab\ -\xb8\xf1\x0d,^ \xd8\xe5\xbb\xf7\xf10\x87N\xf2G\ -\xb5\xac|hy\xc4\xf6(\xca\xca\xc1\x8b\x84\x01\x92\xac\ -_\xf3\x09aBS\x0e\xee\xd9\x03\xc0\x89\x93(\xde@\ -\x96\x1f\xd2D\x0a\x96\x93%\x12E\xa8\xf1D\xef5\xe5\ -\xec)\xd9O\x88\xc9\xe8\x22m\xec\xc4%\x03\xc8t\xee\ -+\x0d7\xac\x05\x1d\xa5\x92Z\xdc\xd14\xafV\x1c\xb5\ -l\x1b\x1a\x85\xe5;\x81\x1b \x11\x18uD\xa1\x82\xeb\ -\xcaC\xe6\x8d\x1dY\xc5\xecukX\xbae\x8d\xcb7\ -\xad~Q\xe3rh\xb9C\xcaL4/\xb1\xe0V\x0a\ -E\xda4\x81#\x00x\x82\x07p\xb3w3\x00`\xd1\ -\xc2\xe7\x0bf\x11 \xc9\xc7{\xe52\xce9\x18\ -\x80\xc0\x1dR\xba(\x10\x88\xb4\xa2\xfcl\x80S\x80\xe1\ -\x96\x93eT\xa2\x97*\xc2^\x05\xa1\xae\x80p\x18\x19\ -\xbd\x83\xdc\x05\xd8\xe8y\xf2!\xfa~l1e\x8b\xcf\ -A\x16\x04f\xe9\x19\xaf\xc4I\xad\x12\xc1de\xcd\x02\ -\x80bH\x94\x0bE\xa5\x14Y\x1fR\x88{*\x87\xc9\ -Vc\x015\x0bw\xac\x1a)S\x09\x94\x06\x08Tf\ -\x8b\x95\xe3\x9e4\xf8YZ~e\xd03yH\x89V\ -\x09E|<\x10\x10\x0a\x00@\x11.\xb3x\x92\x98\xa7\ -%hX\xb3\xbcM\x81f\xcf\xb0\xe0\x5c\xacY\xd7u\ -\xd7\xe6\x1er\x01\xa0\xabA@\x14\x0arP~\x18\xcb\ -\x97\xf2\xc5\xa63\xf9~\x91\xaa\x80\xe6\xf7Q\xb2[g\ -g@\x03\x9aM\xe35\x83\x90\xa4T\xc9\xd5\x0d(n\ -6\xcd\x91?\x93\x81(\xcf\xef\x12q\xd2b\x13 \xe6\ -\xb9%\x99<{&\xd7U\xcdA\x90{q\xec\x19\x0f\ -\xa2\x9c]YL\xfe\xe0\xa6\x95\x8en[\xf9\xd8\xb6\x95\ -\x8emZ\xe1\x90\xc2\x15it+\xdf\xaf\xc5!Y>\ -9z\x0a\x0a\x97\xe2\xf5\xdeM\xaa\x9dO\xa8es\x7f\ -\xdeB\x19\x9e\x91\xf0\x18\xc1#iZZ\xeb0\x01\xa5\ -s\xf2J(X\x99\x89\xe39\x0e\xf0\xc8'\xf2\x0b\xf8\ -\x19\x1b\x85.)_\x9f)\xc4\xf5W`\x9c\xd5x\x8d\ -\x1a\xf8N\xd5\xd2S\xbc\xd5#G\x8as5\xff1\x85\ -\xf2I}\x0bg\x9f\x08\x00OP\xfe\x13\xc8\x8b\x08\x0c\ -\xae\xdc\xc5\x1a\xf2T\x01\x00\xf4\xe70\x18\x1e\xa3\xf7\xe6\ -\xf0e\x91Q\x90VD\xdc.#\x95)\x9f\xbaf\xe5\ -\xd3\xd7Q\x1c\xf1\x98\x8bk.=\x84\xa5\xaa\x94*\x1b\ -T\xba\xd94\xac1\x88\xfb\xff\x04\x82.@ >@\ -&P\x08\x00\xca\xa6N\x08)7\xacj\xee\x96U\xcd\ -\xde\xe2\xe7\x1bVL\xe8q@\x10\x07A\x0a\xb1\xb6\xa2\ -\xf1\xe3OR\xc0\xcfQb\x9d\x9bBu\xca\x87ek\ -\x1d\x01\xc5k\x81\xc7-\xf2\xa0h\xb7\x82\xc9 \xaa\xf4\ -\xcb\xa5v\x9al\x01\x0c\x0e\x18.\xdde\xa05i\xd4\ -\xad\xd4\xef\xc8-\xf7f\x11c\x83R>\x03\xad\xa5i\ -?\x80\xf6\xf3<~\xc7\xa0a\xcf(\xc6\x07\x90\xfc\x9a\ -\xeb\xe7:!H\x9cD\xf5\x90*\x7f\xf35K\xf1S\ -\x96\xa2i[Y>JOE\xe9\xa9\x9aQm\x12\x1f\ -\x80\x10jB\x8dLGs!\x9a\x13\xc9\x19\x80\x14\x0f\ -\x89\xe0\xe2\x81t\x8f\x5cC\x00\xd0\xab\xcb\xc8dL\x1a\ -K\xc6\xfeB\xb2?\x09\xe3\x0c(\xc5a\xc2\x84\xbe<\ -\xbc\x94b\x7f\xc9\xec\x1d\xc7!*0j\xf1\x87\xe2\x99\ -{V$\x91\x81;\xb9O\x08 F\x94\xe2\xbe+H\ -_*\x17!6\xf3\xf7H=nc\x95\xb7\x18`/\ -\x9dSi\x94\xe6\xb75\xeb\x17\x14#gPs\xb8\xf1\ -<\x10\x9b?\xb8Ez\xa22\xb0\x1d\xe2\x97j\x03\xfe\ -w\xc9\x06\xd1\xaa\x11\x90efv\xc9\x22=\xe6\x1b\xec\ -\x5ct1\xafhd\xc7*\xa7\x8e\xacf\xf6\x9a\xd5\xcd\ -\xdf\xc0\xab\x5cw\xc0*\x84\x13\xe4\x0f\x13\x07\x87w\xf1\ -\x06{\x00\xe2\x00`\x1cy2y\x08\x08\xf6\xb8&\xe1\ -\x01N\xa1\xfa\x03-E;\xe5\xb7{\xcaw\xa5_(\ -X\xae4\x0b\xab\x0e)\xae\xf3<.S\x00\xa89\x0c\ -\x94\xe6\xfb\x95\xb2j\xd5/\x87\x98\x18\x1d\xbb\x83{\xbc\ -M\x0a\xa7\x22\x93\xeb\x16\xe4\xf3\x81\x81C\x94\xaf\x15I\ -\x84\xd0\xe6RfB\x85&\xcb4\xff\x9e\xaeU\xb8\x06\ -b\xfa\xb9\xa4jF\x137\xef\xc9\xb9\xf2\xa5x\xd26\ -7\xb1\x06s\xcf \x97w\xe5c\xe2HR.\x8a\xcd\ -V\xcd\x858\x8c\x96\xc85\x0d\xcd\xd8\xb9\xf0\xa5\xbf\xe3\ -\x11\xe4\x15\x5cH\xd5\xff\x08|\xe7\xe2y8\x9e_\x9e\ -\xb6W\x04r\xdb\x85Dq\xa3\xfc\x09\x0c\x09\xbeR\x06\ -\x17(W\xb5\xd7\xec\x19\x9c\xe2\x94\xf4\xf2\x96\xe5O\xaa\ -\x88\xf5\x86\xc5\xe4\x8b\xe8\xe1\xceKfn\xa2x\x88\x03\ -\xaf\xaa\x08\x12\xf1\x8b2HZ\xd0P:'\xc5k\xde\ -_\x8b?\x01\x88\x8d\x8a;\xb3\x18\xecl\x06]u\x7f\ -!,<\xa4<\x17`(\xa5\x0b\xf1P*\x14\xb9\x00\ -\x80\xf3\x00\xce5k\x92g\x8e\xef\x82\xfc\x00\x88\xc2\xc1\ -\xab\xb8\xcf\x1d\xab\x9a\xdc\xb7\xea\xa9\x03\xab\x98\xd8\xb3\xa2\ -\xe1-\xcb\xed\xc7-\xc2\x8as\xfa\xd7\xc8\x1a6\xe0\x1d\ -\xb8\xd9\xa9=\xab\x98\xde\xe3u\xd7J\xc6\xf9\xcc `\ -\xecUX\x81h\x9e\xd7 \xf8\xb5\xd6\xaf\xd54\x06&\ -\x13o\xa5\x8a^Y\xb5H]\x14\xc5j\xb2Gq\xb4\ -P\x0b$\x9a#\x9fy\x80\x90\x12\xce>\xb3b\xcd\x0a\ -\xce>\x86\xe4\xdd'K\x80\xd0\x92I\x84\xc8jB\xe2\ -\x03C0o\xf1\x1b\xbeO\xdf\xebf\x09\xa5P7M\ -.\xb7~\xe1\xe2/\xc4\xb3z\xa7x\x80\xa2\x99UM\ -\xe2\xb8\x096)R\x96-\x05\xa3\xe8 \xca\xcfR\x18\ -\x13\x91\x05\x00\x9a\x07p\xeb\x02x\xaaLy)\xc0\xa6\ -5\x13w=\xe7A\xe4I\xf8nD\xd3\xe8.\xbdT\ -Z\x09\xef\xd0\x8a\xa2V\x16#x\x93\xe8\x88H\xf6\xb1\ -\x95\xe2\xa1+\xf0\xb0\xe52\xae\x19\xbc5^[3\x90\ -\xca\xf2b\x22Xn\x8e\x8a9q\xc5\x85\x13X\x16\xf1\ -\xb8\x08\x0b\x14)SUPXV\xcc\x8d\x04eM\xb0\ -\xda\x80f\xea\x9a\xbd2\xef@\xf3\xa4e\xb6L\xe1\xf6\ -fI\xd7\x16\xf0\x0c\xaa\x00Z\xe5\xf3\x02\x02y;\xca\ -\xbf\xa8\x16\x0a\x09\x9d\xddZ\x1d\xd4J\xa1\x5c'\xa9\x0f\ -\x9f/\x80\xf5\x96\xa1\xf0\x0a\xe2h%J.\x1b\xde\xb0\ -\xfc>\xe2b7\xe4\xa8\x1bv\xdc\xb3Hl\x5c\xc1S\ -\x00\x94I>7\xb5\xe5^K\xc6\xae\xc2G\xb4\xd4:\ -\x8f\x85\xcc\x03\x809\x0f\x5c\xca\xab5\xa9\xa4\x01&l\ -\xb9B\xd2\xa1\x1b\x907\x88-\xa9k\x81X1n\xb1\ -d\x11\xb7Hl,_~i\x15+\xef\x90\xf7ns\ -H\xf9\xd2+x\x10\xa4xF\xeb#\xca\x904\x01\x04\ -\xb9\x85uk\xa2IdK\xdf-\xf7\xad\x18\x9e\xeeV\ -I=\x00\xfcC\xbc8\x9f\x0e\xbf\xf0a,n\xb9\x99\ -\xf1\xd3\xac\xa6j d\xa9Y2\x0c\xdc~\x96S>\ -\x0aGa\x9a;\xd0\xfb \x0a\xd4\x8a\xa0@\xac\x19\xd2\ -\xf4s\x22\xa9p\x92\x5c\xaf\xbd\x14\xe3\xc8\x98\x93\x94\xfa\ -1\x806\x0e\x18 \x95*<\x01\xfcA\xc69\x1b2\ -\xac\x22S\xd5g\x16\xe1=K\xa7\x0e\x9d\x94\xe0=\x0b\ -\xc75\x8f\xa2*\xafm\x8b\x09\xc2\xca\xe5B\xe5JU\ -\xcf\xa78\xa4\x14-\x97\xf8\xaa\xca\x9d\xdf\x03@)\x9d\ -_h#\x7f\xf55N c\xc88`\x98\xc43L\ -;\xab\x0e\x8a\xed\xa3\x00\x91?y\x82\xb0\x5c\x92\x9bP\ -\x22D\xf0]\x02F6\xee,\x9b\xef\x8b0 \x05<\ -l)\x00\xac\x18\xdd\xb5\xca\xd1\x1d\x00\xb0i\x05}+\ -\x96#\xe5w\xc9K\xccA\x92\x16\x085\xcbV<\xba\ -\x86\xe2\x91\xd1U\x88\xe82\x1e\x02\x0f\xd45\xcb\xf5f\ -\x19`\x00\x80G\xf2\x0aR\x96\x08\x05\xb24\xa5F\x9a\ -\x0d;B\x81\xd7\x01\x806p\xdcE\xf9\x0f\xacl\xe5\ -\xb1U\xae\xbf\xb0\xea\x0d\xed\x81\xf8\x02\xf9\xca\xea7\xbe\ -\xb4\xda5\xc0\x001.Q\xce\xaf\x8c\x08/\x10q\xca\ -W\xfeL\xfa(\xe5\x93\xd9h\xdaZK\xe3N\xf9.\ -\xbf\xbf\x08\x03S\x80b\x9a\x1c_S\xda\x0b\xa4\xc0\xe2\ -<\xde\x18g\xf7\xf1\xdcx\xb6\xec\x01\xd2Z\xf2\xfd,\ -8P\x10\xc9$\x94\x06\x00D\x00\xa5y\xfb\x1c\xb4\x9a\ -\xa90\xa1:\x8cYK\xe1\xfb\x93\xeb\xc7\xdd\xd4o\xa2\ -\xa6~\xab\x07\x91\x01KD\x92j\x06-\xa5n\x84{\ -\x98\xe0\x9e\xce\x01\x80'\x16\x00B\x22\x95\xe84\x8f0\ -[0F(e|\xf3y\x1f\xe5w\x9a\x81\xcd\xc4+\ -\xc7x\xb1\x12\xa5\x11\xa3\xc3\x179:\xcaW\xa5\xaf\xdb\ -\xf4!R'\x02\xe5\xd2:\x08\x93sG\xb84-\xd8\ -\xe8\xa2\xa0/\xa3q\x12\xe2\x83W\xd0\x1c\xbe*\x85p\ -q\xaasS\xcd\xa0\x9b\xb8\xe1\xbb\x1cs\x87Q\xe7\x12\ -S\xa3\x90\xaa\x1c\x14\x93\x8b\x85\x16B\xb2J`\xb6e\ -\x90\xba\xf21\x90\xcaM\x16\xe2\xdasU\x05\x8bug\ -w\xce8\x09w\xcf\xc1\x94\xe7\xf9\xdf\x05\xcbE\xf4>\ -\xa4\xaaY,_\x1e (\xcb\x97\xfbg\xd0\xddB\x96\ -\x8b\xb5+\x96\x01\xc9\xf3w\xc9\xd5\x02f\xae\x13U\xc8\ -S,\x5c\x82\x1c\xad=\xb5\x9a\x8d\xd7V\xbf\xf5\xb95\ -l}a\x8d\x9b\x1f\xacn\xed\x8dU.\xc0\x9a\xa7\xef\ -\x91N\x89\x07\x1d\xbb\xa9g\xa5\x94\xae\x80E3z\xca\ -\xebQt*\xd6\x98\x825\xaaH#\x15\x05\xa9,+\ -\x03e\xf9P\x9a\xd62\x82\xb8d\xcd}d\xc3u\xb2\ -\x01uv\xff2\x8c~\x09\x01\x14x\xb5 \x9e.\xc0\ -\xdf\xb4\x0e\xa0B\x18\xa5\xa6i\x0d\x0f\x81\xe4\x15\x11\x0ar\x07\x95\x13\ -k\x105\x98\x80\x0b\xd1k\xa0\x1dO\xd3>\xc5=\xf3\ -\xbec\x06\xd1\xfd{ V\xf5L\x06\x0f\xa5\xb2/\xad\ -\x8cI\x5c\x09\x18\xca\xf03\xc0A\xb9E\x88e.\xcf\ -\xa7\xda\xf82@P\xb5\xfa\xd4\xed\xa8\xa9\xbb\xfa\x0a\xe5\ -\xe3\x114]\xccXs\x02\x11\ -\x94\xab\xc9\x197g\xaf\xf9zrhW\x17@\xa6 \ -\x90\xa8\xd2U\xa5T\xaa\xa7\xcbG\xc1ES\xf7\x5c\x1e\ -Z6G\xca9\xff\x94\xb4\x04\xd1^<\xa4z\xe1\x99\ -\xd5,=?\xcfWq\xcd\xa4\x82\x85\x10\xc2(\xf9\xb4\ -\xea\xe1\xfd\xed\x22:\xb8V\x15:\xe2qT\xe3\xafJ\ -\xd8\x14m\xfel\xc6\xeaTIK\xecK\x03\xc8\xca\xed\ -U\x0a\x9eD\x5cL\xa8\x1bf \x87p\x9d\xc3\x00a\ -\x0cw\x0ap \x8b!\x5co\x14\x90\x17LA|a\ -\xc6\xe5d>\x95\x5cW\x93&\xe5\xe2\x07\x137\x9d\xf7\ -\x0bCb\xb5\x1a\xa9ei\xa5t\x8a\xbbRzb\xf5\ -\x08\x83\x8fEV\xfeCT\x98\x91R\x87\xf5\x036U\ -D\x85\x18\xec\x08\xde/B\x8c\x95W\xcdRyv'\ -\xe0h\x1b\xc63\x0d\x00\xca\x01\xee\x1d\xd0\xf0\x0c\xc9<\ -K\x12\xa14\xb1~\xd4Sz\xcd\x90\xc5U\x0dX,\ -J\x8fE\xe9W\xca{\xecJY\xb7\xc5:\x01\x00\xe5\ -\xb2|mv\x19u\xe9f6\xc0V\xf5\xb6\xdb]\xe4\ -vx\x9d\x91\xe7\x9f\x02\xf2\x9b\x84.M\xf3k)y\ -\x8b\x90\xa2\x0a&-k\xab~\x91\xb1\xd2\xc2\x11\x9e;\ -F\xec9\x0c\x11+P>>w\x13e\xdc\xb5\x86\xb5\ -G\xd6\xba\xf1\xd4:6\x9f[\xfb\xc6sk\xbd\xfa\xcc\ -\x1aV\x89\x99\x90\xa7b\xb1h\x01A\xf3\xe50bW\ -\xf0!\xe9\xe5\xbd\xea\x00T\x11\xe3V\x08!]\xa3\x9a\ -\x17\xe7\x7ff\x1e[\xd9\xc2s\x06\xfa\x95U\xad\xbc\xb6\ -\xea\xd5\xd7V\xc3k\x0d\xaf\xb5\xb8\xdc\xba\xabo\xacv\ -\x9d\xbf\xad>\xb1\xd2\x05\xd5\xcaifO\xeb\xfa\xaa\xef\ -W\xb95\x83\x7f\xb1\xea\xc5\x83'\x12\xf3\x12\xa5\xe0\xfa\ -\x11g1Z\x05K\xc6:\x93\x88\xbdZ\x16\x8d'.\ -\xc6Uuc9\xda\x07\xd8\x85\xc5\xf6\xf2\xc0\xc3\xcec\ -d\xe3vs4\x039y\x02\xfb'\xeb\x01\x04\x92\x12\ -\xd2\xa5\x22\xbc^\x9e&W\xa4|\x14\xa9\x02K\xb9\xf9\ -$\x17{\xa5|\x09\xf7P\xcd\xef\x9c\xe0\xa2k\x95\xee\ -\x09\xa4\xcaB\x94\x95\x90\xcb\xe315\x81\xa6I\xaa\x10\ -^G\x045\xa3e\x84\xb0\xd1k\xc95\x9d\xfc\xbf6\ -\xa7v\xe3\xd6q\xe5N\xfa\x9c\xc4U\xc9\xbdK\xfa-\ -\xb6\x1c\x00H\xca$x\x81\xf2\x01,\x7f\x10\xe5\x8f\xa0\ -|\xc2\x0c\x8aT\xb5\x92\xf6fH\xf1.\xa3\x99#l\ -\x01b\xadu\xe4\xe0\x054y\xa4\x14\xd3\x15\xf7\x92\x81\ -x\x05>\xe2-\xe2,\x18\x12\xa1#F7\x98\x87E\ -\x94\xe2\x12kV\x1fZ\xf3\xd6s\xeb>xkc7\ -\xbe\xb0\xf9;\xdf\xda\xe2\xddom\xf6\xeck\x1b9y\ -o\xad\x00BS\xbe\x8a\x8d\xb9\x90\xaa(9tt\x80\ -\x87\x1d\xe0u\x90\x9f\xb1\xf8\x5c\xa7\xf8\xbbd\x15\x0f\xc8\ -C\x1f\x93s>\xb5\xd2\xf9\x97V\xb9\xfc\xc6\xaa\xd7\xdf\ -Y\xcd\xd5wV\xbb\xf1\x16\xb7\xfb\x86\xf7\x80\x00\xa9\xc6\ -\x05W\xad?\xb3\xf2\x15\xad\xdc\x9d\xc2\xbc\x0f\x88\x91\xeb\ -\x96\x8ekK\x22\xd6&\xd4N\xa0\xd4\x09^'\xb1\xec\ -I\x94?n\x09(Z\x92\xc8\xdf\x93\xc8\xb3\x93H\xb7\ -\x12a\xde\x09Xb\x1c\xae3\xb6\x12\x8b)\xef`\xd0\ -:\x18\xb4n\x06m\x80A\x98\xf0\xbc\xc0\xd0\xa6\xbbF\ ->\xe9P\x01)o\xc1\x946\xbc@\x125\xcb\xa6x\ -\x0f9\x15\x97\x10\xc1\xd3\xba\xbbW}#\x12&\x85\xe3\ -\xaa\xeb\xe7a\xe4*\x07W\x15\x92\xea\x10E\xdc\xe0I\ -\x18@xD\xeb(\x8c\x81\x16m\x00\x81*\x81\x15\x9e\ -\xd2\xb1ro\xb3j\x97%Ttr_]\x08 \x95\ -K\xaf\xecq1=\x1e\xe5\xc7c\xdd\xf1UC\x08\xde\ -\x00e'T\xe1\xcd\x00[b\x8d\xbc\x90\xd6\x144k\ -\xa9l\x02\x0f\xc3\xf8\xe7\xe3\x9d\xdd\xe2\xd4\xfc\x03Wy\ -\xa4\xfa\xbf\xc8\x98\xf6\x1e\xee\xb9I/\xcd\x13\xa8\xeaJ\ -\xd9\x88\x0f\xcbW\x88\x92\xe7\xf0\xb5@\xe4\x91\x98\x5c\xcd\ -\xac\xcd\x9e\x92\x06=\x84\x0c\xbd\xb4\xd6\x83\xf76x\xf3\ -k[z\xfc\x93\x1d\xbe\xfd\x93]{\xff';x\xf5\ -\x07[\xbe\xff\xd1z\xf7_\xe3\xbe\xb9\xc8\x98,\x1c\x91\ -\xc2\x87\x15\x1an\xe3A\xee\x92F\xde\xc7}\x8b=?\ -E\xf1/q\xb1op\xb1\xef\xdd~\xfbZ1l\x88\ -V\xed\xd6{\xab\xd9|mUW\x9f[\x05\xf1\xb7\x5c\ -\xe5Q\xb8\xe0\xe2E\x95N\x9d\x91\x7f\x93o\x93\x85\x88\ -\x11gp\xf3\xa9 7\xb9y\x19R\xb4\xf2;Y\xe4\ -w\xf3\x96DN\x9c\xd4\x04H\xf8\xd9\x09?'\x82\xf0\ -\x04<\x85\xe2g\x02\x16\x95\xc8\xc0&U\xf7C\xd4\x88\ -\x97\xcaVD\x18\xf1\x02\xa1\xa1-\x94\xb5\x87\x9b\xd4\x0a\ -\xa2\xa6W\xbd\xa5`\x15\x9eh\x11K\x03&k\xd1\x9a\ -{\x12\x16\x97T\xa7\xd02\x87\xcb\xd6\x12\xec\x1a\xbcb\ -\x93\xf8\xad\x125\xdd+\xe9\xe1 \xf7\xad\xa5\xf0\x09Y\ -\xa0\x96\x98\xef\xb9ei-\xd8h\x7f\x85\x06?M\xe9\ -\x1b\xcaM\xa8\xe8\xff$\xf1z\xad\x84\xd1W\xc9\xba\x87\ -\xbc\x10s\x0e\xb6\xc4:\x11A-\xf7jQI\xcb\xca\ -\xaaz\xde5\xed-\xd4\x0e\xa5\xa8\x96\xbcU\x84\xa2z\ -\x86\xb9\x07\x16\x9d\xbama,_\xd3\xd5\x9a\xfa\xf6\xb2\ -\x15Ur\xcd\xbb\xeb\xfb\x91\x00\x5c\xe6b]F\xc4?\ -&\x1f7X\xa28\xb8\xfe\xd4\xeav\xb4\xa3\xf4\x0b\x1b\ -8\xfdh+\xcf\xffh\xd7\xbf\xfa\xbb\x9d}\xf3\xcfv\ -\xfd\xc3_m\xe3\xc9\xcf6pD\xae\xbc\xf0\xc0\xb4\x9f\ ->\x8a\xd2\xf3\xc6\xb4A\x94\x9cz\x1a\x17?\xfb\xcc\xca\ -\xe6_\xe0\xea_\xa2\xf4\xb7\xb8\xf3/\xadq\xeb\xa3\xb5\ -\xed\xffh\x1dG?Y\xc7\xf1\x0f\xd6r\xf05\x00\x00\ -\x14\xb0o\xb1\xf0B\x5c\xaf\xae\xafmJ\xd1\x89k \ -\xf7\x18\xe5\x1fX&1\xcd+\xf5f\x80U\xab\xd0\xa3\ -\xbd\x7fG\xa4tG\x0c\xf8!\x8cy\xcf\xd2:\xb6-\ -\xb5}\xc3R\xb0\x86\x148Hr\xeb*\x02Xp\x8d\ -\x02B\xb2\xcb\x9b5\x19\xe3\xe5\xe5J\xd9D\xe4\xb4\x83\ -\xd8\xafy\x02\xd22\xf5\x17P\x9f\x01\x15]\xba\x1a<\ -2\x1e\xada\xa8\x08T\x936\x9a\xb2MQ\xe1E\xc3\ -\x1c\x1eF`[\xb2\x14\x14\x91\xda\xae\xba\xc4=\xee\xed\ -\x00\xe5k\xad@\x1bSnY\x08\x82\x1bA\xf9\xd1\xe9\ -\x87\x96+\x99\xbc\x07!\xc3\x13\xa8@\x86\x10\x99\xa5\x82\ -Rm\x85\x97R\xa5\xdcZ\xac\xba\x86\x10\x82w\x93$\ -\xab_\x02\x22\xc0%\xd6\xcf\x12\xd6\xb8>\x1e&M%\ -\xed*o\xd7~B\xbc\xad\xae\x15\x1e\xbfc9\xba\xd6\ -\xccC\xe4\x81E&\xef\x00\xc0\x1b\xfc\x9d\xb1\x82\x9f]\ -\xd4uj\xf2\xc8\xc7\xf7\xf8y\x0d06JK\x95\xa2\ -\xbb4Q\xf3\x00\x05\xf3*\x14|\x88R\x9eY5\xca\ -i\xd8\xfb\xdczn|\xb4\x85\xa7\xbf\xd9\xd1W\xffb\ -7\xbf\xfd7;\xf9\xe2\x9fm\xfd\xd9\x1fm\xe0\xe4+\ -\xe2\xf8S\xcb\xd3\x83\xa1\xf8\xfc\xa9GV<\xfb\xc4)\ -\xbdr\xe9\xb5U\xae\x90B\xad\xa0\xfc\xb5\x0f\xd6\xb2\xf7\ -\x9d\x0d\xde\xfa\xa3M?\xf8\xab\xcd>\xfa\x9bM=\xf8\ -\x93\xf5\xdd\xfc\x88\x97y\xe5\xea\xe2\xb4)5\x07W\xa5\ -\xd2\xa7l\xd2M\x95*]\x886{\xb8-\xd4\x9a\x85\ -\x1b\xd3\xd4\xec=,\xeb\xa1E\xc6\x1fYh\xf4\x01\x7f\ -\xbb\xcb\xa0\xdf\x02$'\x96\xd1\xb3oi]\x80\xa1\x03\ -0\x90\xf2\xa5\xe2\x8e\xd3T\xba\xad\x12n\x95\xaeu)\ -\x85\xf5D\x9b<55\xec\xe6\xf2\xc9VTN\xae\xbd\ -\x04\xday\x14\xec\xe7\xda\x02\x01\x04W\x9f\xf1\xa9\xe0\x94\ -TR\xde\xc6y\x19\x94\x9f\xd4\xb2b\xc9mW\xb9\xd6\ -\xb6\xa5w\xed\x03\x80C\xf3\xf7\x03LxO&\x16\x19\ -$\xbb\xc9\xd6T2^ Gc\x84\x17\xc8W:\xa9\ -Wy\x06\xc2\xa3v\x1be\xaa\xcbH\x1b\xdf\xd1r\x15\ -`\x12B\x1a\x89\xcf\x0dX9\xc0H\x05l\xc9\x02\x9d\ -S\xfe\x8a\x03y\xba\xf65\x08l\xfd\xc7\x969\x04\xd8\ -\xb4\xb4\x0b\x00B\x5c#\xbe\ -G%}\xae\x88W\x15^J\x89\x19\xe7\x08\xc41\xa6\ -@\xe5\xc90\xe0b\xad7\xe3\x92+\xaf\xbe\xb0\xa6\xfd\ -\xf76t\xfb;[z\xf1'\xbb\xfa\xf6\xaf\xb6\xf6\xea\ -\x9fl\xe6\xc1/\xd6u\x0c\x00V^@4p9\xb3\ -\x8f\xad\x106\xaf\x961\xe5\xcb\xaf\xac\x12B\xa7r+\ -I\xf5\xfa[\xac\xfe#\xff\xf3'\xdbx\xfd\xcf\xb6\xf5\ -\xe6\x9fm\xed\xc5\x9fm\xf4\xec\x1b\xb7\xd7=\x9ft\xcf\ -\xd5\xdeA\xb8T}sQ\x01\x9b\x0dk\xd5\x0e\xda\x88\ -\xd6\xbb\x19\xb8<\xcd\xc8\xa9xs\xf9\x9d\x95\xac|\xb0\ -\xe2\xe5/\xf8\xf9\xbd\xe5\xcd\xbe\x06\xfd\xcf\xb0\xb8\xfb\x0c\ -\xfc-\xf310\xe9x\x0a\x01!\x0d\x85\xab\x9d\x8bW\ -\xb4\xa9%S\xae\xc5g\xa2\xaa\xe1\x93\xe5\xc8U\xf7\xe1\ -e\xb0t\x95D\x09\x00\xf24\xaa\x15pB\xca$\x0b\ -\xca\x808i7Q\x0a\x83\x98\xec\x04\xe5\xb7\xae\x01\xb2\ -MKE!\xe9j\x17\x03\x00|\xdaL*\x10`\x99\ -\x99\xda1Lh\x94\x82\xb4\x9e\x90\x8bK.$.\xab\ -\x12\xa9\x8cL\xa7t\xe1\x85\x15\xc2\x89r\x00q\xf6\xc0\ -\x19q\xfc:`\xc0\x83tr?\xed\xbb\xa4\xb9\x00\x97\ -k\xa4\xa3\xacT\x89v4u\x02\x94\xee}\x80~\x01\ -6\x81@\xd7\xb9\xc5un;\x09\x02\xac\xc0\xd0\x0dw\ -/\x19\xdd\x02\x80X?\xdf%n\x02\x80\x02*\x91g\ -\x5c\xb4/Ben\xe1\xe1k\xa6\xd66Q\xf8CL\ ->\xcc>\x9f\x9bT\xc5\xaa\xa4@3ex\x84\xba\xed\ -\x97\xd6q\xed\x83\xf5\x9e~k}\x84\x84\xee\xeb\xdfX\ -\xd3\xde\x07\xd7\x07\xa7xY=p\x9e\xa3\x14\xdc\xbd\x94\ -N\xfe\x5c\xb1*\x12\xc7\x83\xaa\xf6\x1c \xb5\x01\xa2\xe9\ -{?\xd8:\xa1\xe4\xea\xf3?\xd8\xd2\xa3\xefl\xe0\x18\ -\xa0,\x9e\x12o\xb5|\x89U*?\xd5\xdc\x82\x16\x9c\ -\xb0\xa2\x10\xc4R\x03\x17A\xf9\xb9(\xbf\x88L\xa1l\ -\xf3K\xab\xda\xf9\xcej\xf7\x7fB~\xb6\xea\x9d\x1f\xad\ -l\xe3#\x7f\xfb\x02\x80\xbc\xc6\x02\x1ey\x030p\xcd\ -|\xb8HI\xa0\x1f7\x89\xe2C\xfc>\x07\xef\x91\x07\ -/Qm\xa0\xaa\x7f\x0b\xb4$\x8a\xa5\xaa~_\xeda\ -\x9c\xbb\x94\x90\xba\xb9\xf2s\xbd\xc73dh\xc1\x87\xd4\ -\xd6\xdb[\xe8y\x95t\x066\x1d/\x92\x0e\xc0|\xbd\ -\x84#Dn\xd9/\x10\x10\x0ad\xa1\xb2\xc2L2\xa4\ -,-\xd9\xe2\xe1\x04v\xcd\x9e\xc4\x89\ -,_\xca\x17\xf0\x18h\x1f.8\x83g\xf2i\xfa\x1c\ -\x8e\x11!\xe5,\x22\xc3\xaa#\x9dn?\xfc\x0a.\xf4\ -\x9d\xb5\x1d\xaa\xf9\xd6\xb7VM\xa8,\x9b\x7f\x05\x7fz\ -ne\xf0\xa8\xd2\xf1\xbbV\x84\x82\xf2\xb9/eV\xda\ -\x98\x9a\xd5\x07\xa9C2\x7f\xdf\x9a\x86\xebi?\x82@\ -\x90\x09\xd03y\x95\x07\xf2\x9aY\x09\xd4\xaa\xf7\x83\x08\ -\xba\xf2uO\xf1Ay\x0dH{\xf6\x18a\x08\xf2\x18\ -\x11I\x9d\x06\x00\xa1\x11\x5c\x22\xaeX\xabR\x81\x8by\ -h\x08\x92\x0f\x92\x10\x18\x86\x1cM\x9cX\x04\xa2\x96\x07\ -W(\x80,\x16-#\x22pK\xc46\xe5\xec\xb3d\ -\x02\x93\x00fTK\x99\xaabY\xc7\xba6\xadd\xea\ -\xc0\x9aWnY\xcf\xd6]\xeb\xdd\xbcm\x1dk7\xac\ -zz\xcf\xad\xf0\xb9\x05\x0e\x11\x14M+\x13k\xb5\xba\ -\xe6v\xe5j\xdf<1?2\x05\xb1\x81[\xe4/\xa2\ -4\xc2I\xe5\xce\x17Vw\xfc\xd1\x9an\xfch\xcd7\ -~\xb6\x86\x93\x9f\x00\xc1\xf7V\xbe\xf1\x0d\xf7\xf3\x01\xaf\ -\xf5\x1aK{\x0e/y\x049\x85\x18\x8d\xc0\x19F\xee\ -\x12\xe3\xee\x01\xee\x87\x96\x07\x00\x0a\xe1)%\xa4\xa2\xa5\ -H1\xdf\x9b\x0fyR\x93\x09\xb9\xfd\x0c\x14\x9d\x069\ -Lm#\xcdj\x9d\xc6\xf5k\x7f\xff<\x1cb\xc5-\ -\xca\xb8Z\x02\x11D\x94\x1f\xc4\x05\x07QPP1_\ -B\xfa+\xeb\xd2\x0e!Y\x5c\x86\xbc\x856\xa8\xc0\xb8\ -57\xaf\x86\x0fy#\xdb\xd6\xb4v\xcf\x86\xae\x7f\xb0\ -\x89\xdb\xdf\xdb\xe4\xdd_l\xe4\xf4gk\xdf\xfb\xda\xcd\ -\x89h\xed\xa1B\x93d(\xa5\x14\xeb,&\x84\xe4\xe3\ -\xe2s\x86\x14\xb2T\xca\xa5M;\xd7\xb9\x07\xae\xad\x8c\ -\xc3\x09\x80@\x02x!\x81\xcf/\xaf$\xf7\xcf=\xb8\ -\xfd\x90\x0e\x00Z\xc6\xf6\x88\xa3\xc2F\xa6\xc2\x06\x06\x16\ -\x9a\xbcka\xae%\x12\x19\xe3j\xe54Y\x00\xfa\xb5\ -\x1b'\x95\xdc0\xa5\x19ie0:\x97,];v\ -\x07\x19\x80\xd1\x03\x90s\x8crN\xf8G\x18\xfb\xe41\ -\xeeZJ\x13\x81\xd2\xd2\xa6V\xe0\xc4\xb0\x17x\xe8%\ -\x0b\xa3\xe8\xc2\xe1-+\x1d\xdbA\xb6@\xf6\x86E\xfb\ -\xb1z\xe5\xc4\xca\xb1[\x17\x11m\x0c]\xe6\x7f\xb0\x16\ -\xc8\x97:r\x85A\xa8c\xb7\xa03W\x0b2\x8bO\ -\xac\x04\xafS\xb9\xfd\xc6j\x0f>\xe0\x09\xbe\xb6\x06\xf8\ -E\xdd\xc1\xf7V\xb3\xf3\x83Um~OJ\xf9\x11\xe2\ -\x09?Y\xc6\xc5.\xa0\xe4\xd9\x97V\x04G\xc8\x9f\x84\ -\xb0\x92\x92\x16\xcc\xbe@\xe9*\x03\x7f\x0b\xcf\x11\x9fx\ -E\xea\xf4\x18\xaeq\x8b\xc1\xd9\xc5\xb5+\xd6\x93\xf3k\ -V\xee|\xdf}z\xcb\x04\xf1s\x0e\x0f\xa5\x85\x1c\xd5\ -\x14\x10\xaa\xe0*\x1e\x00P\x86b\xbd\x06\xd4\x81@^\ -@\xec\x1b\x97\x0d\xf9J%\x0bq\xb5\x00\xa4\xa3\x19\x8d\ -\xe3\x16\xe9Z\xb0\x86\xf9c\x1b9|j\xd3\xa7\xefm\ -\xee\xee76y\xfb[\xeb\xd8\x03\xdc\xcbxXrx\ -\x95\x7f\x97\xc0}\x8aa\xf2\x85x\xc2\x06C\xa2\xcd\x15a^s&\x89\x8b\xb3\xb7\ -\xc9T\x1eX\x05|\xa4\x9eT\xb5\xed\xe4{\xeb\xbc\xf9\ -\xab\xf5\x9c\x92^\x22\xbd\xbc\x1f:\xfd\xc5\xc6o\xffj\ -\xa3\xbc\x8e\xde\xfa\xc5\xa6\xef\xfcf\xe3g\xa4\xaf\xd7\x7f\ -F~\xb2\x9ek\xda\x0a\xff\x05<\x86\x10\xa0\xcd\xb0|\ -\xb7\xbf\x7f\x13\x00h\xbf\xdd\x88%VkF\xae\xcd\x12\ -*[-\x09 \x08\x04\xea8\xe6*\x8c\xc8\xab\x95>\ -jS\x85\xfa\x15\xb8\x12z\x14\xef\x94\x8fb\x02\xdc\xbb\ -\xebe@\xb8\x10o\xf0\xb9\xa9\xe4yR\xbb)\x0b4\ -MZq\xff\xb25\xcf\xeeZ\xe7\xca\x91\xf5\x5c\xbda\ -]WO\xadzNet\xbbn\xb5N\xcb\xe6\xd9\x84\ -\x1b\xcdB\x06\x01Q\xa6\x96\xb2!r\xda\xb3!\xee\xe1\ -\xb6\xc7\xf3\xfd>@\x98\x01\x18\xdd\xe6X\xa5\xbd-j\ -QC\xca\xda\x8c\xf2[\x18\xd3V\x94\xdf\xa6P\x84\xd2\ -\x01\x80\x9b/\xc1;\xa4\xc2KR\xf9\xbf4B}\x06\ -\xd7\xf2i\xaeep\x17\x00\x10\xe7\xd4E\x22\x9dAH\ -S\x87\xad&\xdc\x7f\xe34\xaep\xda\x12\x9d\xcc8I\ -\x16\xa2\xf5@\x9a!k!^:\xc5\x03\x02D\xe9\x92\ -\xbaeh\x7f\x9e\x1a\x1e\xb9:6-\x1d\xab\xf2\xc5\x11\ -=\x5c<\x03\xa78\xea\xedC\x00}\x221\x9aD\x11\ -C\xc5E\x05A\xbd\x98\xb3z\xf5\x84\xc6!\xa4\xe2\x1e\ -\x13\xa4+\x93Z\xc7\xc7J\xe6\xeeX)\xd9I\x8d\xc8\ -\xd4\xf1\x176r\xf7'\x9b~\xf2'\x9b\x7f\xfeO6\ -\xf7\x04E\xdf\xfd\x1e\xe5\x7fkSw\xbe\xb5\xf1\xd3\xaf\ -m\x82\xece\xe9\xe1\xcf6\x7f\xef'\x1b\xbd\xf9\xd1F\ -n~k\x83\xd7\xbf\xb6\xc6m\x88\xe0\xf2\x03x\x01\x84\ -hD\x939\x022\xc0\xaf\xd3L\x5c\x97\xc5\x97\xb78\ -I\xacl\xb7d\x00\x91\xa2\xae\xa7n\xc3\xaa\xf6\xdd\x01\ -d=\x93f\x0b\xe1\x0e^\xbb:)\x9fl@\x1e\x00\ -\x0b\x0bh\xf1E\xd3\xbf\xbdd\x14\x10\xc9\x8c\xd6y\xf3\ -3\xae\xd1\xaey+\x1d\x5c\xb1\x8a\x91\x15\xbc\xc1\x9a\x95\ -\x8d\xaa\x10\x94\xef#\xd4\xaaa\x85V\x1a]\xc1G\x9d\ -\x96\x805\x0b\xa8\x95A-\x0b3\xce\x18T*\xe3\x9a\ -J\x86\x92\x0a\xb8R\x19\xd3T\xa5\xa9\x00 \x9dT1\ -]\x16\xdf\xa6\xf0#\xc5\x13\xd2\x9c\xa0|B\x81&\xad\ -4G\x92\xc6\xff\xa7AL\xd3{%\x18}\x1fY\x0e\ -\x12\xe3\xebY\x858\xe0\x86\x89\xdb>\xe2\xb3\xeb\xb5\xc7\ -\x83\xca\xc2SPr\xf2\xf9DHr\xa3\xa6$\xb58\ -\xa3\xc6\x8eR\xfe\xcay\xae\xea\xddH\x86,\x1b\x94i\ -\xe3\xa6\x8a\x18/\xc4U\xb5\x92\xee\xa9\x9a&\x82{\xd7\ -\x0eZ\xd5\xdbGx\xd5\xbc\xf9\xa7\xee\x9f\xaa\xba\x1d\x82\ -h\xa1\x94,\x08eh\x0cR9\xb6\xcf\xe7\x0eH\x97\ -\x8eL\xbbm\xd4\xe2\xac\xee\xea#\x1b\xb8\xf1\xc1V\x9e\ -\xffjG_\xfd\xddn|\xfcW;\xfa\xe2/\xb6\xf2\ -\xe4[\x9b\xb9\xf3\xd6\xc6o<\xb7\xc1\xc3\xc76L\xbc\ -\x9d=}g\xd37\xdf\xda\xd0\xe1K\x1b:zi}\ -\x07x\x8f5\x98\xf6\xec\x09\xdf\xa9\xf4\x93\xf0\xd5>\x0d\ -\xe8\xd5h\xa1\x0f\x00tZB\x05\x1e\xa0\xbc\x95\xd7v\ -@\xa0p\xa0\xde<\x02\xc18\x166\x03\xc8\x09i=\ -\xeb\xfc/\x80\xd6b\x0b\xcf\xa5\xb4\xcf/\x0f\xc0\xcf^\ -{\x1b\x00\x80g\x11\x99\xd6zF:\x9cJ]S\x03\ -\x84\x14\x7f\xd3\xa8\xf9\x1bG\xcc\xa7N\xa6|o\x92\x9b\ -\x02\x1e\xc4\xeb\x0cZ|\xc5\x80\xc5],\x02\x95k\x19\ -x\xc8\x12j\xf0\xc8\xf5\x18\xa2\xa6\xbd1\xb6$\x8cM\ -\xb3\x9e\x9a\x01M#\xc7\xcf\x10\x07\xe8\xda\x87\xc8z\x92\ -\xde\xa9Y\xd2\x1d\xf4\xb2\xe9\xe6,RP\xbe\x00\x93\xa6\ -0\xdf\xbdJ\x0a\x0b\xd7\x03\xf4\x92\x0c\xde\xc7\xb8V\xab\ -\x17B8P\x91\xa2\x10\xae\xc5\x0d}\xb9\xa6!SZ\ -\xd7\xdd\x1c|j\xb3\x17\xb7\xd3P~\x1a7!\xc5{\ -92\xa8r\x00P\xca\xc4\xff\x7fR>.\x0d\x8e\xa1\ -\x9c_\xe5\xcbZ\x9e\xd4nU\x89\xdb\x8a\x8d\xc5\xab\x16\ -N\x9b4\xfc\xa0\xd1\x07q\xf4C\x14%\x81\x81U\x06\ -w\x1d\x80h\x0d\x7f\x8b\xb4m\xcf\x8ag\x8e\xaca\xfd\ -\xb6M\x9e\xbd\xb5\xa3\xcf\x7f\xb5g\x7f\xf87{\xfb\x97\ -\xff\xd3\x1e\xff\xf4\x17\xdb}\xfe\x85\xcd\xdd|h\x03;\ -\xd7\xac}e\xcf:V\x0elx\xe7\xa6\x0dn\xdf\xb4\ -\xce\xd5\x13\xeb\x5c\xe3\xf7H\xe5\xcc\x8e\xe5\x0d\xafBR\ -\xc5K\xa6\xb0<-\x19\xf7\xa1h\xad\xb1w!\x1d(\ -\xa3\x03\xe5w\xba\x9f\x93\xf0\x02j8\x99R7L\x5c\ -\x1f\xc7bg\xf0n\x8b<\x1b\xbc\xa0\x0f\xb0+{\x92\ -\xdb\xefE\x11\xb2z\x9e\xc3\xafLG\x03\x0c\xf9Ko\ -S5\xb0\xa6x\x15b\x06\x00V/\x00\xebF\xba<\ -)\xeb\xb6\xc42~\x87\xc4KJ{,N\xe2\x96~\ -\xfb\x09I\x1e\x08\x12\xea\x00A#\x86\x88\x0e\x92[\xd6\ -\xd0\x09\xe3\x8eu+\xc6gh\xa2\x08\xb2\xa7I\xa0t\ -\xb8T:Y\x95\xf3\x14\xe8 \x0d\x02\x9b\xaeu\x15g\ -\xf1\x00\xbe\x17\xaf\xa4{S\xe9:\x82\x07\xe0\x86\xc9W\ -\x03}rk\xb0}\xdcX61M\xb3hJ\x1f\xfc\ -\xa4\x19n\xee]\x17s\xeeFn\xc7\x13\x17\x83\x1c\x08\ -@\x17.\xc9\xa7\x18)\xf7\xffI\xf9W\x11^\x19(\ -\xcd;\x87\x86v]AF\x88\xb8\x97\xad]\xb1\x03\xba\ -.\x83\xd5\x0d1\xec\x9c\xc3M\xcd\x22\xb8\xc3\xae\x19n\ -n\x96kC\xc0PTv\xff\x12\x8cx\xd5\x0a\xc77\ -\xac~\xf9\xd0\xa6n>\xb6\x9b\x9f\x7f\xb4\xf7\x7f\xfa\x9b\ -}\xfb\xb7\x7f\xb6\xd7?\xfdj\x07O^\xd8\xc4\xde\x89\ -\xb5\xcc.[\xf9\xe0\xa4\x95\x0dLZ\xfd\xf8\xbc\xd5\x8d\ -\xcd[\xc5\xd0\xb4U\x0c\xcf\xe2~\xe7,\xafw\xc2\xb2\ -\xda\x87-\xd0:\x08C\xef\xb3\x94\xdan\x94\x8f\xe2\x89\ -\xf9\xff\x9b\x08\x0c\xbc&U\xf3\xf7\xea^\x148`\xa9\ -\xf0\x04\xb7\xa0\xe4\xb2\x03<\x01\x16\x15P\xda\xac\xcd&\ -p\x1c\x91I5\xb7Hk\xc3\xab\xb4N`4c\x84\ -S\xbcK=\x96^\xa3E\x1f8\x06J\x8f/\xebD\ -\xd1\x1dN\x12\xd5\xb7\xb8\x14 \xf1%\x9e\xc4\x95v\ -\x9f\x83\xa0\x0f\xaf\xa0E-\x15\x88(,/\xf2\x9d\xea\ -\x89\x80.p\xf3\xbeN\xf5s \xec\x90\xef\xfbd\xb0\ -x\xdft\x8c8\x95\xac&\x19o\x9e\x02P\xd3Pr\ -:J\xf7\x8c\x0b\x03G<\x80\xf2;\x95\x84\xa5\xa30\ -\xcd\x82\xa9\xe5\xaa6>\x84 a\x11\xcd\xc6iN{\ -\xf46i\x1e\xa9R\xff5<\x04\x17Q\x9e\xdb)\x86\ -\xb9\xc1\x0d\x00\x86s\xe5K4u\xfaI\xf9R\xba\x13\ -M\x86\x88A#\xbcfq\xe1 n7\xd8G~M\ -\xfcS/\xbb\x8cN\xf2\xee\xb6q\x1el\x98P3h\ -I\x8d\x03p\x8e~\xf7\x9a\xc2\xcfi-C\xc4Q\xad\ -\xe5\x8fZ\xb8g\xc2\xca\xc6\x97lp\xe7\xc4\xf6\x9e\xbc\ -\xb4g\x1f\x7f\xb0\xf7?\xffj\x8f\xbf\xfc\xda6\xce\xee\ -Y\xf7\xd2\xba\x15v\x0dY\xa0\xb6\xcd2\xaa\x9a,P\ -\xd3l~\xc4W\xddd>\xbd\xafk\xb5\x8c\x9a\x16K\ -\xadF\xaaZ-\x19\xc2\x97\x88\xcbO\xc4\xdd;\xabw\ -\x1e\x00\x8bD\xe9\x89Ux\x04\xac_\xcaO\xaa&\x0c\ -\xd4\xaa\xdb\xe8\x08\xa4P^`\x0a\x82;C\xb8$\xd7\ -oS!\x8a\xac\x5c\x04\x9a4\x92\xcf%\x126\x12\xf8\ -\x0e\xd5\x22$\xc8\x93\xa8_1\xd7\x88/kC\xe9\xad\ -(\x19\x9eQ\xdc\xec^\x13J\x087%\xfc\xbe\xb8\xdd\ -\xe2\x90\xd8\xe2\x0e\x8b-\xe9\xb4X\x81\x80P\xa0e\xe1\ -\xc4\x1a\xbe[\xeb\x04\xeaQ\x80{\x0ft\x8b;\xc1\xa3\ -\xfa$\x10Q\xcdDb\xf5\xda\xf5\x94J\xb6\x95\xdc6\ -e\x89-c\x84\x8cQB\x05\xfc\x05\xa3\xca\xe8&\x0b\ -\xeb\x85\x98\x93\xd6\xfb\xc5\x01\x00\xae&\xbfbD0\xd2\ -5\xe3\x85\xdbWK\x12\x15O\xe6\x90#F'\xef\xf3\ -\x0aS\x1e\xbb\x039\xf3@\xa0\x99.\xbf\x9bi\xf2\xa6\ -\x1a\xddvr\xdc\xbfS>$\xc3+u\xf6f\xc0\x9c\ -\xf2Q|&\x08\xd4\xfc\x80\x96a}XxF\xc74\ -\xc0\xe1\xa6\xda\xb0\x8e\x16\x94.\x85\xd7\xe3\xfajA\x7f\ -u\x87\xc5U1\x10U\x0c\x88\xd88\xaf\x92\xc4\xeav\ -,\xa8\xc3\xd2\xea\xbb,\xd29l\x8d3\xab6up\ -\xd3\xf6\x1f\xbe\xb0\x9b/\xde\xda\xfe\x83\xa76\xb9sl\ -\xf5c3\x96\xdd\xd0a\xc9\xa55\x96PX\x89TX\ -BQ\x85%\x16WZbI\x95%\x95T[Ri\ --\x16W\x8f4\xe2v\x9b\x11\x14P.\x00\xa0,)\ -\xbf\xaa\x97\xeb\x89\x0f\xf4\xf3\xca\xbd\xd5H\xa1X\xb0Z\ -\xdc\xd7\x8d\x90\xdf_\x08\x83\x8b\xe8w\xea\xd6\x95X}\ -a\xe1<\x03J\x8e+iB\x99\x0d(\xb5\xde\x93\xa2\ -Z\x8b-\xfc\xbd\xd4\xf1\xbb\x06@\xd0\xe4\x01\x02\x10\xc4\ -\x95\xf0\xec%\x00\x00o\x10K8\x88\x85\x13\xc4\xab\x00\ -\xa5N\xbb\x7f!\xda0z\x11\xe70\xfa\xd0V\xf5\x1c\ -$b}?9v\ -\xcf\x88E[{p\xf7M\x96\x5c&%\xcb\xea+\xb0\ -xI%V\x8f\xf5\xe3\x15\x12KQ>\xd6\x1f_\x8a\ -\xf2\x1d\xb8\x00\x9d,\x16\x00\xc4\xf1\xbd\xf1\x0e\x00\x03X\ -\xbb,\x9bA\xc2\xed&7\x92\x05A\xbe\x12Uqt\ -^r\xa6\x92\xb4\x04<\x83\x0aNd\xf5\x22u\xbf\x07\ -\xc0\x95b\x0f\x00\x97\x0b\xaa\xecr^9R\x8a\xe2\x8b\ -\x9d\x5c\x91\xf0sl~\x19\x00\xa8\xc4;\xd4\xf2?\x8d\ -\x0e\xe4q\xfc\x7f,\x1c!\xb6\x12\xf2'\xf05`\xf9\ -\x90m\x91;\x15\x9c\x84\xd1Kt\x1a\xe5\xcf=r\x92\ -;\x03\x00 \xd4\xda\xe5\x9c\x81\xebOi\x1cu\xe3\x19\ -[\xd1lWx\xd6+x=I,^/\xae\x82g\ -\x16\xc1%\xa4%\xd4\x00\x12\x95\xcd\x01\xe2\x98\xd8rb\ -]\x8d\x0a'U\xa5JzC>\x1b\x1eU\xaav\xd7\ -\xa2\x84\x00\xb7\x99p\xf2\x11i\xd8\x13+\x98~\xea$\ -\x7fJ\xa7\x8b\ - (\x00\x04\x85x\x81b@PnW\x8a\xf0\x14\x84\ -\x89+\x80\xf2\x0a\xdf\x15+`\x01\xb4\x94\xd6\x05G\xec\ -4\x03\x18\x998\xb3\xe8\x0c\xfa\x98G\x1fH\xee\xac\x0a\ -BH\xa3!\xd5\x01\xd29\xb5\x86M\xaeW\xd6\xd0\x86\ -\xc2\x1b\xf8\xbej\xbbL\x08\xbc\x5c\x00\x00y\xd55b\ -\xb9F,\xdeF\xcf\x1d\xab\xe7\xe6~cbE@\x18\ -\x5cU\xbdj\x0aS)\x8d\xb6FG\xc6@\x9b\xbah\ -M=\xb4\x02m\x9d\x9aWO\xe1W\xc8k+\xd6\x89\ -\x1a\xb3\xcf\x1c8\xd4A#t\xbe\xc6\xeez\xf4ha\ -\xa7[\x8a\xd6\x19\x02\xc7\xae\xfc\xbb|\xf2\xaeU\x81\xd6\ -\xca\x99\xdbV:qby\x83x\x1aBCF\x8b\xa6\ -\x9e\xe5f\xe5n\x89\xa3\xff\x9b\xc8\x0d+\xb6\xca\xd5\xe2\ --\xb0\x8a\x84\x0a@\x82\x8bt\x0c\x9a\x81\x8e\xc7\xd5\xc6\ -\x13O\xe3p\xb3\xb1XZ\x5cA\x19q\xb5\x9c\xbfa\ -\xf5R|e\x1dd\xaf\x1e\xd2Wo)\xd5\x80\x04b\ -\x98XI8q\xa1\xa6\xcd.3\x10\x97$\xb8\xdf\xcf\ -\x90\xcbR$\xd6\xa1vu*\xa7rM\xa9\x00\xb0\xda\ -\xd3\xa5\x91V%\xb5.\xe2\x05T\xa38\x82\xd7\xd2`\ -\xff\x8e\xd5\x0b\x00r\xe1|OlI\xb3]\xc6\xb5_\ -f\xd0/\xa1\x00\x07\x80\xdcB@\x90\x87\xe4\x02\x82(\ -\xde\x80\xd7\xbc|\xbb\x9c\x8fg\x90\xa2t\xa2\x09\xca\x11\ -\x00\xe2\xc4=\x00Z\xaa\xa6\xd6\x95F+}V\xa3\xa7\ -i<\xb3j\xfeP|h\xfc\x10`\x90\xae\xf7h\xce\ -F\xc6$#\xc2\x03a\x0cWJt2\x0a\xd6\x8f\x87\ -\xb9\x5c \x10\x10\x86\x0a\x01\x99;1\x05\xa0)D!\ -\x97\x8b\x9a\x00@\xb1\xe2\xa0R!\xf2\x5c\x15\x0d\x12\xcb\ -\xb5\xe0\xa0\xa5Ym\x94\xcc#\xde\x14\xcc=\xb6\xe2\xc5\ -\xe7V\xba\xa2\x05\x15\x00\xb0\x04\x00\xe6_\x10\x8b\x1e\xe1\ --\xce\x08\x07\xd7a\xa3\x87X\xfd\x9ee#\x11\xde\xe7\ -\xf1\xbb\x12\xf8C\xf5\xec\x13k]{m}\xbb\x9f\xdb\ -\xe0\xfe{\xeb\xdd~n-\xeac?\xbek!\x11\x92\ -&n\xde\x91)\x89\xb7\xdd\xc9\x131j\x84\xfbr@\ -\xa8\x04\x04b\xc5b\xc7\x90\xa5\xd8\x22\x90\x5c\x00\xa2\xf3\ -x\xb0\x5c\x01\xa0\x02\x00T\xe1R\x89\xabeX{e\ -\x03Jo\xb2\x94\x9aFK\xadmB\x9a-Y\xf1\x10\ -\x8f!\xbe\x11\x8b\xd5_Fi\x97\xce\xe53\xbd\xa2\xcc\ -81\xfe\x86Q\x88\xea\x1c\x83\x8f\xb7\xea\xdf\x22\x85\xda\ -v\xf9tr\xfb\x0a^@\xc5\xa7\xe7^\x00\x0e\x10\x8f\ -\xa7\x8a/\xfb\x07\x08\x14Vbq\xe7Wp\xebR\xea\ -%\x94\xe0\xbc\x00\xae\xff\x12\x1e\xc0\x03A\xd4\x13@p\ -\x09O\xe0\xfe^P\x03h\x00\x00\xdf\xa5\xb2\xf0\xc4z\ -\x11e\x98\xbb&\x9d\xb4\xc1cT\x9eY\xdd[4o\ -\x02\xf1&uN\x85\xed'\x13\xd7\x13\xe0E\xf1z\xae\ -\xf2\x06\xc0Ws\xae|\x89\x94.\xd1\xef\xea\x183)\ -\x1f\xef\xe08\x8a'1n\x22\xa2B\x8d\x88\xd5u\x1a\ -\x96\xc8C\x0a\xf9\xd9\x83*h\xb8\xe1\xaaF\xf2\xb5\x95\ -X\xe7\xe1,=\xb3\x22\xa4p\xe1\x19\xbf{\xc2\xdf\x1e\ -pS\xe2\x04j\x0c\x01w\x18<\xb1\x5c8D\x11D\ -\xa5\x1c\x82R;\xff\xd4Z\xd6\xde\xda\xf0\xe1G[\xba\ -\xfb\xabm>\xf9\xcd\xd6\x1f\xfc`3\xd7\xdfX\xc7\xea\ --+\x1a\x22\x05\xc5\x0bh\x7f\x9b\xd6 R\xe4\xf6\xb4\ -\xdb\xc6\xc9\xf9\xfe7\xac\xcd\xb1l\xcd\x96\xc9\x03\x08\x00\ -J\x97\x0a\x01@\xbe\x00\x00\xa3F\xe2\x0a\xea<\x8f\x80\ -\x15%h*\xb7\xaa\x85\xffk\xe1\xff\x9b-\xa5\x0e\xa9\ -\xe7}\x1d\x19E\x0d\x8c\x1f\xbe\x11G\x18\xb9\x82\xfb\xbe\ -LH\xb9Lh\xb9\xa4Wm\xbc\xc0\xfd&\xd5+\xfd\ -$\xdd\xeb\xc2 4i\x02\x10\xd2PDJ\xa7j\x0f\ -U\xa4:\x0f\xa9\x22\xd5\x02\xa0\x09\xdc\x97<\xa8\xf3L\ -\x02@)V\x08\xb9t\xae\x16\xb2y\xc5\x9dU\x04\x17\ -\x90+\xce\x87\x0b\xe4\x15a\xfd\x00!\x17 \xe4\xe6;\ -`|\x06x?\x03\xcc\x97\x8aZ\xed2\xcf'\xf6\x9f\ -\xc0w\xa7@\xd6\x14\xdb\x03\xdc\x83\x0aY3yU\xa9\ -|:d:\x19\xa6\x9fX\xcbu\xaby\x16b~l\ -\x99\x94\xcfX(\x9cp=\x11Le\x1a\xb1(<\x96\ -\x90$n\x22\xef\xe4\xdd\x9f\x84{%\xe3\x88I\x22\xcf\ -T\xd7ImgV\x17J\xf5\xa2S'\x0d5A\xc8\ -V\xf3\x85\xb1\x13\xdc\xcf\x0d\x08\xc7-\xcb\x9b\xc5#\x10\ -{rU{>\x0dA\x9c\x84\x14j\xf9\x16\x85\xe7\x8d\ -y\xbb\x7f\xca\xa6\xb1\xfa\xf9\x87\xd6\xb0\xfc\xdc\x9a\xd7P\ -\xf4\xd6\x07\x9b\xb8\xf9\xa3m?\xff\x8b\xdd\xf8\xfc\xefv\ -\xf2\xf6\xcf\xb6\xf9\xf0\x1b\x1b\xde}`\x15c\xdb\xee\xa0\ -)\xedm\x93\xa2SP\xb8\x07\x82\x7f\x88@\x90\x04Q\ -U\xc5l\x82\xd2\xa22,\x8e\x1b\x8fc\xb0\xe2\x00A\ -\x1c(\x8e\xc7\x95%`=\x09\x0c|\x02\x16\xe8\xa6s\ -+[\xcfA\xe0)?\xb5\xb1\xdd\xd2\x1a\xbbyOn\ -\xef\x06\xae\xef|\xf3\x85^\xfb=\xe1\xbd\xb6])\x87\ -O\xe2s)-\xe4\xfe\xed\xe3n\x82*\x15\x12+\x00\ -\xa4\x90\xf6\xa6\xb4\x03\x04M\xcb\x8a\x18\xd6Nb}\xc3\ -X_/\xd6\xaf\xfc]\x83\xab\x81\xd6\x80\x0b\x04M\xc4\ -c\x85\x03H!\xd6x\x09w\xec\xf1\x82R\x84W\xc2\ -\xd7g\x80\xf7\xb3B\x94_\xdcM\x18\xd0\x9e\x80!\xc2\ -\x0b)\xb2\xc6D'\xaf\xa9\xeb8\x80\xcc\xd0\xb9\x01d\ -P\xa9dOIdN\x09\xca\x9c\x5c\xc6D\xca\x09\xd8\ -b\xc9pb\x8b\xa4\xf8\x1a\xc6Ei&\xe4R\x1e^\ -!S\xb3\x8e\xf2V<\xa3\x17N5+9`1)\ -0\xcd\xd4\xc6y\xdc\xbf\xb6Uii\xd6\xab\x84QK\ -\x15mZ\x0c\x0e\x10\xd3\x87\xf0\x08#\xb8\xecQ\x01\x82\ -Td\x1ck\x9f\xb8I\xa6 \xb2\xa8](\xda\x83~\ -\xd7\xea\x96\x1fY\xd3\xda3k\xdf|e\x9d\xdb\xef\xac\ -m\xf3\x9d\xb5\x22C\xd7\xbe\xb1\xd5G\xbf\xd8\xe1\x9b?\ -\xdb\xc1\xab_m\xe3\xe1W6\xbc'\x00l\xb9\x1d\xc6\ -)Xx2qO]\xb0u\xa6\xcf?\x80 O\xa0\ -\x85\x9a\x09\x14\x09\x10\xaa\x00\x82f\xc6\xdc\x94)\xae\xd2\ -\xe5\xcdp\x18$\x01R\xa3,\xc1\x09\xac^S\xbaI\ -\xc4\xc4\xe4Z)\xbe\x93\x01\xecE\x06\x18\xccA\xbc\x0d\ -\xbc\xa2\x16\xcb\x85_\xc4\x13^\x12H\xf9$\xaa\xc9\xd7\ -\xf6+\x97\x8a\xc2\x9ac\x95F\x91B%4\x0dYR\ -\xdb\xac%u\xaeZ2ioJ\xd76`\xd8\xb2\xe4\ -\xb6uR\xa9E\xacu\x12\xe0\x0c\xa1\x08\xfe\xd7\x85\x01\ -\xee\x8b\x10\x13/!\xabQ\xa6\xa1\x90s\x05p^\x01\ -\x18\x97\x1dI\x14(p\xc3\xc5\x0a\x17\x9d\xfcM\x9b?\ -\xe0\x16\x15\xe3\xe7\x82w!\x15T\xe8K\x82\x1c'C\ -zS\xaa\xda\xe15\xad\x90Y\x00\x8f\xc5\xc7\x97\xa1\xe0\ -2Y?\x02\xd8\x048\xcd?\xb8I&\x1d\x8d\x87\xa1\ -$pO*?\xffG\xc99\x9c\xcb\x95\x9dk\xbf\xc3\ -\xa4\xc5\xe8\x8c>\xd7\xf0\xb8C\xdb\x91\xc9\xe9\x95\xd7\x93\ -\xcai]@\xd5AN\xb4N\xa0\xdd\xa4}\x9b\xc4\xa3\ -\x1d\xf8\xc1!\xa9\xe2uB\x00\x96\xaf\xc2\xc7\x99\xbb\xae\ -QT+\x8a\xef\xd8~k\xdd{\x9f;i\xdexm\ -\xb5+\xcf\xacc\xe7\xb5M\xde\xfc\xc2\xd6\x1e~D\xbe\ -\xb6\x85\xb37\xaeJ\xa8l\x84\xeb\x80\xee\x14\x08U\x12\ -\x84*\x09\x8bt@8\x07\x81\x9a-\xb8\xce\x1aHJ\ -\xfd4\xe0 \xe6q\xf3\xf2Z\x0e\xc1\xb8nG\xc2P\ -zBE\x977PX\xb66`\xe8\xcc\xc0\xd4\xfa^\ -Kk\xe8%\xcc\xf4\x9b\xbfu\xc8|\xad:yc\x04\ -\xc0kzV\x16\x06\xbfP\x88Q\xf3e\xf1\x0d\x00!\ -V\xef\x91\xb8\x1a\xbbT\x02\x93&\xae^\x91\x9b%\xc5\ -J &'unXJ\xcf\xae\xa5@\x0cS!\xbb\ -)\xedW!\x86\x0b\x16\xc7}\xc52\xd0.\x8d\xe3~\ -\xe2\x091n6\x91\x0c\xc7\x11Zq\x06\xf8\x8c\x00\x17\ -\xa7\xb0\x81b\xe3+\x95J\x0a|J-g\xf0:\x84\ -\x96z\xd2\xce\xbay~7\x8d\xa5\x8e\xf1\x8c<'\xbc\ -@\xde-\x11v\x9f\x88\x9bO\xe0\xbe\xe2\xc5uJ\xb0\ -r)\x1dB+\x90\xb9\xcd&.%U\xb6\xd4\x8b!\ -\xc0%\x04\x22\x19N5\x06t^r\x9eT\xaf\xfd\x06\ -s\x90\xddE\x8b\xc9h\xdf\xf0\xd2\x1dP\xad\x22\x83\x80\ -\x13\x01A\x877\xae!\xaa\x8f\xf3j\xe4\xb4\xd9\xc05\ -\x22\x22\xad\xd3\xd6\xa3<-\xd3b\xf9e\x8b\x8f\xac\x11\ -\xe5w\x1d|\xb0\x9e\xc3/\x9dt\xee\xbd\xb7\xda\xd5g\ -\xaeKU\xd5\xc2]k]\x7f`}{Ol`\xff\ -\xb1\xf5l\xdf\xb5\x86\x85#\xcb\xef\xc7\xe30\xb0\xc9(\ -\xdf\xb3^\x06\xcdm\xe4\xd0aO\x9aiS\xa3\x05<\ -\x94+\x97>\x97zrc\xe5\xe8n\x83\xa6\x08\x22\x0f\ -\x89\xd25\xd7\xee\x1d\x0e5d\xe9\x0dC\x96A\x8c\xcc\ -\xc0]f`\xf1\xbe\x96!\x000j\xfe6\xed\xa2\x1d\ -\x83x\x0a\x5c\xe7 P\xf8\x81p\xba0$E\x89\xd9\ -c\xa5r\xa7b\xf1\x97\x19\xe4\xcb\x15XiM\xaf]\ -i\x1c\xb782\x81\x04\xd2\xe5$\xc6(\xa5\x8b\xf4\x10\ -@h\x95.\x81A\x8d\xc7\xc2D\xe0\x94!hJX\ -\xe7\x15\xb9\xc3#Zf\x11M\xe5\xaai\xd4<\x03\xcf\ -38Pk\x09x\xce\xad\xae\xa6\x91fju/M\ -k\xf7\xadW!w\xcb\x80b\x16\xe5\x01<\x94\xa9\xd0\ -\x96\x08\xb1L\x90\xe2I\xf1$q%\x9a\xd3\xd0\xf2\xb5\ -\x94\xcf}kb\xca\xad,\xe2\xd5\x90\xc4J\x14/\xe1\ -;\x1c\x00jd\xf5\xbf\x03\x00\xde+\xe6\xe2\xa0FW\ -K\x06\xb2\xd5\x06EG\xa0y \xd0\xe2\x8e\xa6y\x09\ -\x09n\x96O\xa5Q\xde\xd2\xae\x00\x90?}\xea:c\ -V\xae>\xb5\xd6\xbdw\xd6w\xedk\xe4\x1b\xeb>\xfa\ -\xd2\xdav\xdeZ\xe5\xe2C\xb8\xc1\x0d\xcb\xc3c\x14\x8d\ -\x1dZ\xd9\x94\xe4\xc0J&v-\x7f\x08v\xdb\xc1\xc0\ -\xd4\xa1\x04\xe5\xdf\xb8NM\xf6(\xdf\x17\xe1\x93\xcb\xd7\ -d\x8c\xea\xe4\xb5\x1d*\xadq\x09\xc5-c\xc1H\x93\ -v\xed\xe8\xf7x\x85\x06\x85\x8aQ>\xa7\xc1\x1eC\xe1\ -(\xb9y\xcc\xfc(\xda\x93Q\x0b\xb4\x8e}\x12\x0f\x00\ -\xfa\xbc\xa6s\xe1?\x88^S\x00\x8eV\xfd\xb4\x16\xa0\ -\xe5\xe0\x0b\x02wY@(m\xb4K\x15\xedv\x09\x90\ -]\x86\xac\xc6B\x96\xe3\x95\x12\xb6i\x9f\x00a\x01\x00\ -\xb8\x89\x22\x00+\xf6\xaem\xddZ\x1f\xf0\xb5\xc3\xe21\ -\x1e\xd7\xe8\x01cr\x87o\xa8Z\xa8\x19 \xf0y\xd7\ -=\xa4e\xd1\x85]\xad\xc0\xaa\x06\xaa\x9c\xd2\xd6mw|\x1dc\xaa2\ -\xb5\xec\xb1\x9b\xa6\xcac\xedo\xd0\xb17\xa9\xad\xf2\x1c\ -p\xa5F\x8c\xa5^\xde\x050h\xf9\x1a\xaf\x94\xc8\xf8\ -%\xd5b\xedx0\xafm\xec$\x0a\xf6$\xa9\x86\xd7\ -\xaa\x09\x84\xdf\x0b\x00n\x9f\xa1@\xa0-\xe8\x02\xeb\x8c\ -\xc5\x08\xbd)\xa08\x95\x0b\xa5\x13\xff}(Zk\xdb\ -:\x8bO\x00p=l\x9cxu\xfcjC\xaen\x19\ -\xaeO\xde\xe4u\xd7\xf2\x5c\xed\xe6\xab\xd7\x1f[\x8dZ\ -\xa5\xae\xa9\xa1!i\xe3\xf4M\xac\x1f\xae\x00\x89\xd4\x16\ -f\x1d-\xab\x93D\xb5\x9c\xea\xce\xf5\xc3b\xd5\xdc \ -Q\x1b\x22\x15\xb7\x94F\xc9\xd5\x11\x17\x93\xb8Im\x9b\ -J\xa9\xd76f,_\xab`(\xdd\xf5\xe8\xef\x06\xa0\ -*\x88\x94\xb7\x12hU~u\x1e\xaa\xfc\x00\xcc-<\ -ui;\xb6Z\xc6\xa8\xaf\x80\xf6\xec\xa3x\xc2\x81\x18\ -\xb4\xc2C\x1a\x03\x99F\xe8I\xd5\x86M\x85 \x07\x00\ -@W\xa7\xc9\x141e\x119M\xe9\x9e\xb3w\xe43\ -\x09@\xb8\x04\x104\x81\x14+\xd0*\xfc(Um\x84\ -\xa7\xa0L\xb5\xaf\x17\x7frar@-Xd0\x90\ -h\x80\xa0\xbaBw\xe8\x83\x03\xacd\x01#\xe0^\x01\ -\x85\xba\x82\xa9\xd1\xa5\xebA8\xa1z\xc8S\x0b\x8e\x02\ -\x02Rj\xef\xa4\x14<\xb4+\xdcY\xe0\x1axE2\ -\x02o\x99Y\x9eK\xa1R\xe3\xc9xi;\x1c^E\ -\xee=Y[\xcb\xc4+d\xed\x02\x02J\x17\xd7H\xc0\ -\xb0\xb4\xd9V\x9bl\x13\xe0U1\x09\xa06\x91\x9bO\ -\x22\x03p+\x83\xb8{\xd7\xa3\x9fx\xef2\x01!\xf8\ -w\xa2\x22\x08\xf5\xb0\x09\xa9\xeb\x84Z\xbdN\x9dX\xf1\ -\xfcM\x94N\x0a\xb8t\xe6\xde\xebw*\x13\x8fh\x03\ -f\x9fz\x05/\xba>B\x81\x96i\x94\xc0\xcd\x12s\ -]~\xff\x89\xcc\x117\xc5\xeeI}\xe4\xa2d\xf9)\ -\x8a\xf7\xb8}\xb7\xfbV;f\xa4\xfc\x9e\x03\xae\x7f\xc4\ -\xf5\x8f\x11^\xfb\x0e\xb8'B\x97\xc2\x95H+^\xc6\ -\xef*\x9b\xb4\x07p\x06\x0b\x9bp\xee>\x0d\xa5\xab\xbe\ -/\xadA \xd0\x92.a@\xa7k\x09\x8c\x90PM\ -\xfcx|\x80{\x80@\xc6kk9._\xcc\xfa2\ -J\xbf\x5c\xa8\x09\x9djR\xb5*\x84TN\xa0\x00\x08\ -n\xf71\x16\x98\x8c'H\x93\xd5\xab\xec\xcdU>\xe9\ -\xf9O\xcc5\xb1\x1cR\xc7/\xc6\xad[u\x92\x9e\xb7\ -R\x09\x98'\xf2Z\x8b\x84V\xc6H\xbd\x04\xd4\xf1\x14\ -\x10h\x8f_p\xe4:\x008q\xe5f\xae\xd2\x88\xbf\ -\x07\xfa\xd0M\xf7\x12!\x9b\xefP\xf9:\xf7\x9f\xae\xb9\ -\x02\xbe\xcb\xb5\xd7\x07P:\xb2\xc6kq\xcf\xd8\xe9X\ -^\x08\xaa\xc6\xd2\xedo\xc4\xe2U]$\xc5\xab\xd63\ -\xa1\x01\x00$\xa1t\x89f\xb9R@c*\xa22i\ -oc\x84\x88\xdf\xb9\x80\xc0\x0b\xc9\xec\x05\xb5\xfd\xebn\ -\x1f@tL{\xed\x0f\x08\x07\x90\xba\xe9CRB\xed\ -\xb8\x95\x05\x5c\xb5\x90v\xe1\xf6,\xe3\x01\x16\x88\xf7s\ -x\x00\xe2b\x13\x83Ej\x97\x8a\x8bJ\xd6\x1e\xfbJ\ -\xdc\x93D\xae\xaa\x06\xb4j\xe9S\x07I7\xad\xa0|\ -\x15\x9el\x9a\xce\x13\xd6Y~\x17\x9b\x1c\x5c/?\xc9\ -\x80\x80p\xe8V1\xe5\xb1\x04ZGX;\x18\xe86\ -\x0d4\x83\x84\x82\xc5\x0f\xe4\xf2\xc5\x11\xd2[t\xc6\xde\ -\xb4\x0b\x19\xe9\x88\x0e\x94\xd4!\x15\xc9\xe4\xdb\x17\x8b<\ -n\xaf>\xae^\x0a\xd6\xf4\xac@\xe0\x00P\xa0\x09\x9b\ -r@@.\xaf\x09\x1e\xbc\x84>\xab\xb3\x02\xb5\x93Y\ -1\xdc\xb5\xd9U%3\x19R\xae\xd2\xe5\xe1=\x00\xa0\ -\x95R\x15\xcdr=\x14\xa6\xeakw\xba\x98\x14\xa7\x16\ -=\x8co\x16F\xe5\xba\x84\xa9\xa9\x03\x00r-\xea\x08\ -\xb5\xae\xd8\x14\x8f\x1b\x18\xc4\xe3\x91\x96\x07\xc8\xc6\xd4\xed\ -D-\xf1\xd4\x11\xcd\xed\xf4\xe5\x99ur\x9bz9\xb9\ -\x1e\xcb:/\x01b\x1f\xd0nb\x15\xde\x22:\x9b9\ -U[\xdb\xb4\xddMee\x84\x22IL:n=\x8d\ -\xc1K\xc3\xda\xd3\x88Si\xb8\xd3t\xb9\xaa\x0e\xcd\x09\ -\x9c\xd7\x09v\xe0\xae\xdcz>(\xeb\x9a\x83,\xe2\xce\ -{\x97P\xc0\x8a\x85\x86\xd7-\xa2S*G\xb1\xf6a\ -b\xfd\xe0:\x96\xb9\xc2C\x81\xec\xaeyn\x0c\xe1\x7f\ -\xdd\xc1\xd2\xf2\x04\xbaa\xcd\xb3C\xa0\xb4S6\xe3|\ -cdj\xfd\x12H\xc5\x0b5\x01\xc2\x16\xeeCU/\ -\x1d*@Q\x97k\x06\xa1\xef\xc4\xd5$\x04\x07\xaeC\ -\x94T*}\x0e\x02m\xf1R\x99\xf6\x80\x8aKw\xf9\ -\xac\x16p\x08\x19\x8a\xb50o\x0d\xb2:h9kA\ -\xd9\x19\xe2\x1fz\x1e\x95\xbac}:\xac\xca;d\x92\ -\xcc\xa2\x11W\x89;M\x00\x08^\x93\x09\xad\xc9\x03\x02\ -\xf2\xec\xcb0\xeeK0\xef\xcf\x8a*\x91*B\x01\x00\ -\x10\x09S\xb9\x18|FUUR\x9evZ\xe9\xc0\x08\ -\xd7\xa9c\xe2\xba\xe5\x8c\xa0T5\x83\xd2\x22X\xe7\xc5\ -\x98\xea\x15\xa0*,\x88\x1f\xa0\x03\xd7\x81\x14e\xebH\ -\xdcO\x95\xc6\xe7\x00p\x9dJ\xf5w\x85b\xc2\x85k\ -\x83+\xaf\xd1\x83\x11\xe2\x91\xa3\x84\x9a\x5c\xc0\x93?L\ -X\x068\xb9\x8cI\x0e^2\xd4{\xc4g\x19\x17\x9d\ -\xc9\xac\xcd\xac\xdaf\xe6\xb6\x9a\xa9\xb2\x18\x81\xf3\xc5\xa8\ -\x98Q\xe5\xc6:}\xcb\xd7K\xac\x01Ejq\xee\xd5\ -\xfak\x80\xd4cGk\xf9S\xbc\xe2R\xdb\x89\xa9\x9d\ -\x93X\x1bD\xabw\x0e\x0b\x5cD\x09 \x10\x09\x92\xd6\ -\xb9J\x1f\x94\xee\x83\xe1\xeb$o\xf5\xf6\xc9\xd4i\xe2\ -\x02\xc0y#*\xb54Q\xeb\xd7\x1c\x5cx\x84\x1b\x0c\ -u\xf1\x80(:\xd0\xb9\xc7\xff\xeeq\x0f\xda\xe2\xa4}\ -~\xc7\xc4?\x9d%\x8c\xd2\x07\xb41B\xa2\xf7\x02\x02\ -\x22\x00\x0cy\xc7\xb1\xba#Y5p\x03\xda%#\xe0\ -lp\xbf\xf2\x22\xaa`&c\xc0\xf5\xea\xf4P\xef\x18\ -\x1a\xf1\x05\x06\x9fP\xe7\xea\x17\x90\x8b\xa5\xeb\x00^O\ -V\xa9V3\xda\x1b!\x17\xafn#\xb1\x95m\xa4\x83\ -\x00\xa1\xa2\xd1.W6\xdb\x95*ro\x1d\xe6H\x98\ -\xc9\x90\x05Cv\xa3S\xa7\x96?w\xdf\x0a\xe7\xd5Q\ -\xfc\x1e\x1eQ=\x97oXt\xf4\xd8\xc5xo?$\ -a\xe2\x9cS\xe9\x9cB\x15\xc3\xaa;\xbbS<\xca\x93\ -\xa8S\xa9vG\x07\xd5\xe6]\x95\xd2\xfc]\xa9\xb7\x0e\ -\xb5R\xbb|\xb5\x9f\xd1\x18\xaa\x8d\x9f\xba\xa8\x16\x8d_\ -\xb7\x12<\x8ez\x1b\x95N\xdf\xe3\xfd]+\x1c\xbb\x0d\ -\x18N\xf9\xdc\x0d<1c\xd3\xab\xede*\xeaQ\x99\ -\x9f\x8e\xe6el\x09\xa31*kV\xea\xe1\xaarU\ -\xd2\xcc\x8d\xb9\xa3c\xe4\x09\xda\x15\x83\xc9\xc3\x9b&\x18\ -\x10\xdch\x13\xb1\xb4\x99<\xbbu\x98\x81$\xaf\xee\x9a\ -\xe0\xb3\xd3<\x0cV>\x00\x10\x06\x96x\xaf\x86H\x9e\ -\xf5\xfbQ\xbc\x18\xff\x85\xf2\xd5\x09;\x97\x98\xa8\xf6\xf3\ -E\xe37I\x0dO\xadp\x14\x8b\x19a\xa0\x86\xb5\x15\ -\x8a\x9b\xd5\xee\x15D\xdb\xad\xb5\xe350\xa8\xbdo\xc8\ -\xc0M\x06\x0c\x00\xe0\x05\xdcY=\x88;\xbd\x03\x10\x84\ -!L9\x13g\x10\xa8\xdb\xe6\xba|\xf2\xbf:lZ\ -s\x1b^\xd9\x9a\x0aXI\xc1D\x16\xa5p\x80\xae\xfe\ -\xbb\xea\xb5\xab\x86Jj\xb1\xa2\xee\x99\xae\x83\xa6\xf6\x22\ -\x0c\x12R\x00\x87\xfa\xefk\xe1'\x1e\xb2\x1aG\x86\x10\ -[\xd3mWj\x01\x83\xea\x18\xe0\x13I\xe2\x18\xb8v\ -\x1d\x0a\xa1\x89\xb1<,\xbfp\xfe\x91\x15-<6\x1d\ -B\xe1N\x10\xd1\x112\x93\xb7\x09\x07\xb7\x00\x82<\x02\ -\xd6\x89r%j?\x17Q\x13j5\xd9\xd69\xc8\x88\ -2\x00q\x80lm\xd9\xd3\x1e\x09\x09@Pc\xe8\x08\ -zR\x8f\xa6<~\xa7\x8d$\xc5R\xfa\xccm+\x03\ -l:W@M\xa1+\xe6\x9fX\xf9\xecc+\x99z\ -\x08\x08\xee\x02\x823@\xc0w3vY\xbd\x8c\xab\x04\ -@\x04$\x8ce\x8cw\x22\xb7\x10v\xe8P\xa6\x83\xa3\ -Ta\xf2\xe9\x94*\x88\x8a\xe6\xa3\xbd\x93\xb8\xb5l\xdc\ -\xc3\xcf\xbd\xfc\xbe\x1f\x0b\x1b\xc2\xd2\xc7`\xe5\xd3\xb8\xb9\ -\x05\x08\xcf2\xb2j9\xea\xf0\xd5\xbf\x86\xfbQ\xbf@\ -\xaf/\xf0?\x9aC\x1fZ\xd1\xa4\xd7\xc2\xb4\x04\xc4\xaa\ -\x1d[\xf1\x14\x037\xa5\x03\x1en;+\x0aO\xdd\xb2\ -l\x1e.\x8bA\xcb\x1c9\xc5\x1d\xf2\xcaCd\xe2\x09\ -2\x15\x0apm\x17'ui)Z\xd3\xd1yj\xec\ -\xc8\xa0\xe71\x08\xb93\x0f]\xf1\x84\xbc\xc5\xc5\x86M\ -\x9f\xb6\x83\xf3\x5c\xae\xec\x8d\xc1\x97B\x8af\xefZ\x85\ -\xda\xddk\xb3\xc9\xe6\x0b\xe4\xb9U\xaf>\xb2b\xd2W\ -u\x0cQ\x86\x91\xd2\x02I&\xafO\x80G\xc4\x93-\ -\xc4\xc3%\x12E\x1c\x95\xc6*\xad\xed\xdfF\x89\xc7\xa6\ -C'\x0aP\xb8N\x11)\x9c{\xcc{dF\x1d\xd8\ -\x1f\xf2\x5c\xaa\xa9\xb8OHP\xab\xf7\xdb\x96\x0fX/\ -\xc4;\xd3@\xbb\x98yn\xed\x88\x02\xcc\xd9*\x97\x07\ -\x00\xda\xb7\xa9\x06\x95\xaa\xa0vg \xc0/\x0a&\xd4\ -\xea\x15K\x9f{`\xe5\x8b\x8f\xadR\xa7\x80.\xbf@\ -^Z\xc5\xd2K+_xae\xb3O\x19S\xeec\ -\xec\x1e\x06w\x8a\xe1\xe1!\xb1\xfa`7a\xa5\x1bn\ -\x81\xf8{T\xe7\x09\x004\x90\x22RZ\xfdS~\x1f\ -\xc2\x15\x09\x0c\xea\xb2\xa9-[\x9a\xc1R\x93\xc2$\xe5\ -\xeb\xaef\xae\x83\x5c\xb9\x9d\xf4\xa2\x03 t; \xf8\ -\xf1\x06\xa1\xbe\x19\x14\xbf\x84%\xafa\xd1\x9b o\x8b\ -\x14\x90\xf4\x06r\xa3nY9XU.,W\x16\xa6\ -\x83\x0c\x8ag\x00\x00\xe8U?\xfcb\x1d\xab\xa6n\xe3\ -3X\xc9\xcc\x0d\x0bOs\xc3:u\x03\xf7\xa9\xbdl\ -\xda\x0b\x1f\x1c\xc2\x03h\x7f\x9c<\x80\x00\xa0\x8c\x00\xe5\ -f\xb92\xa9\x9b\x96;\x8b\xcbe@\x0a\x96\x9eY\xc1\ -\xe23\xd79C\xcd%\xb4\x87/\x88K\xd5.\x1e\xb9\ -V\xb5\x7f-\xd0a\x17\x0b\x0fI]\x9fY\xc3\xcek\ -k>xk\xadGo\xad\xed\xf0\x8d5\xed\xbc\xb0\xaa\ -\x15\x14\x897P\xba\x9bNV\xa4\ -m\xce\x08a\x19\xae%\xaa\xe2O\xbfv\xbb\x8a=.\ -\x02\x00\xe5\x90J\xd54\xd7\xdc\x86\xb4\xb8\x19\xa9DU\ -\xd6\xd6v\x92\x86\xf4C\xf6&@\xda\x02\x8a_\x07y\ -;V8~\xe0f\x00\xdd!\xd1\xb8\xac\x5cP\xac\xa3\ -R\xddAH\x13:\x89\x5c\xfb\xe1\xce\xf7\xc4\x8d\xab'\ -\xfe1\xec\xf9\xc8r&\x0f-DV\x91\xcdk\xd68\ -n\x9e\xbfg9\xb7\x88G\xd0\x86L\xed\x93\xd3\x8e\x22\ -Gn4kIlU\xc5\x0c^#w\x1e\x0b[\xc4\ -\xe2\x16\x1fY.\xb18\x82\xeb\x0dc1!\x06P\xaf\ -Q,G'~\x94-\xe9\x00\xc5gV\xbf\xf3\xd2\x9a\ -\x0e^Y\xf3\xe1\x0bk9xf\xad\xfbO\xadq\xfb\ -\xa1U\xad\xdeu\xcd\xaa\xc2X\xb6\xe6ER\xb5\xe1S\ -\x9ba\xce\xa7lu4\xad\xb8F\x18\xe5\xe8\x940\x1d\ -GS\xbe\xf4\x1cy\xe9\x9a@\xe8$\xb2\x02\x94^0\ -\xf3\x1c\xe5\xbf\x04\x1c:\x9bY\x0az\xcb\xdf_[\xc9\ -\xfcs\x00\x80\x85\x12\xab\xf3\x08\x83\xaa\xebsG\xd7\xab\ -\xb7\x80\x13\x85d\xb5\xcb\xd1\xf68\x8cB\xde\x11\xefR\ -\x04\xc0t\xc6\x91\x0e\xbf\xaa\xdax\xe7\xce\xfe\xad\xba\xaa\ -C?\xdf[\xf1\xc2\x1b\xae\xf7\x02O\xf3\x94q\xe6\xf9\ -\x87\xefat<\x03\x00 \xce\x03\x94l\ -\xe2\xa4\xe2\xa3\xeeS\xe9\xa0#\x8bn\x03\xa4\xaab \ -T\x9aq\xd4v2\xbcK\xee\xac\xca\xa7p\xab\xa4c\ -9j\x99\x86\xa7\xc9\x9d#\xcc\x00\x8e\xb2\xd5'N\xf9\ -\x9a\xb4\xaa\xddzl\xb5\x9b\xf7\xb0\xa4\x9bX\xfd\xb1U\ -.\x1d\x10C\xb5\x01\x05F=\xb9\x8f1\xa8/\x8fJ\ -\xe0\xe1\x10-\x9a\x90R*\x07\x9bW\xd5\x93R>\x9e\ -A\x8d\xa7u\x12h\xe9\x82w\x80\x94\xe7\x01\x1e\xe3\xcd\ -$z\xff\x82\xdf\xbd\xb6\xd2\xa5\xb7\x00\x0f\x00,\x0a\x10\ -x\x86\xc9{\xae\xd1\x96\x0e\xa5V1M@E\xb6\xee\ -\x15\xe6\xaf}\x87\xd2\x09\xc0\xd0\xa4P\xe4\xbc\x99C\x01\ -\xf1\xbd\x18\xa0\x95\xb9\x13\xd0\xdeX\x85N>[z\x83\ -W\xd1\xd6\xf8\xc7\x84\xb6\xfbx\xad;\x90MB(\xb1\ ->K\xe5\xe3\x9d<\x83\xf6sh\x17\x97\xdbQ\x04\x98\ -I\x11\xd3\xbat\x00\xe7\x01\x00\xe0B\xae\xef\x8c.\x86\ -\x1b\x0a\x83H\x81@\xbc@\xb5\xe6\xda\xc5\x9b\xdc0\xed\ -\xe6\x98]\x0b3W\x9fwQ\x97\xd7m\xe9\x90\xa3@\ -\xd3\xb0\x85;\xa7\x01\xc0\xb2\x15\xa1\xb8\xb2\xe9k\x0c\xe4\ -\x1db\x94\xac\xed\x89\x95-?u'V\x97\xea\xe0\x02\ -\x91#,Q\x1eA-\xd4t\xea\xb8;\x1f\xd7\xa5g\ -d\x0e\xca \xcek\xd8u\xe4yP=\x0a`\xbaY\ -c\x0c\xc8(\xf7\x0a!\xd2\xe1\xd1\xda\xf6\xac\xc9!\xb7\ -5J\x0bX\xfa.u\xdav+\x95\x90,\xa5`p\ -\x8d(\xae2\x0c\x85R5\xa1\xd0\xb9Cj\x1b\ -\x97\x87\xcbw\xad\xe3\xe0Z\xae=\x8dKU\xb5\xd3G\ -\x82\x95\xe2\xcd\x94\xa3\x0b\x04\x1e\x000Du\xf4\xc0[\ -\xe4@&s\x09\x1b*\x07\xd7!\x97y\xaa\x10V%\ -\x962\x22\xf5\x01\xd0V1\xcd\xa1\xb89\x95yK\xad\ -\x83\xabhR\xadn\x06\x99&\x8c\xc3a4M, \ -\xb4j\xe5\x11\x92\x0f\x08b\x5c'\x09\x11A\xf2\xea\x10\ -d\xcbm\xda\x14\x13%\xae\x8a\x08j\xe3\x87z\xf5i\ -+\xb8k\xe6\xd0A\xbe\xdf\xb9\xe2\xce\x08\x08\x93\x02E\ -\xba\x16\x9d\x84\x11\x9d|\x15\xee[\xc7\xb5o\xc3\xb2\x19\ -d\xc8\x5c\xc1j>Hlje\xa3%\x95TY|A\xa9\xc5\ -\xe7\x17[B\x01R\x5cn\x89e\xd5\x96\xc8\xdf\x12\xab\ -[-Q\xdd=I\x01\x93j\xb5OP\x99\x10\xa2\xf7\ -\xbc\xa64\xa8\xc8d\x84\xfb?\xdf2\xa6\xc5.\xadI\ -tk\xc6\x14\x0f\x86g\xd2Q.ZA\x0dq\x7fj\ -4\xa1\xd2y-d)\xbcj\xc3\xad\xb7\x90\xc4\x18k\ -\xcb\x9dVf\x05\x02\xc2\x81\x1aQ\xa8\xa5K\x04\x008\ -\xe5\xe3\x01r\x05\x22\xf4\xa3\x83\x8f\xa2\x0b\x067-\ -_\xfdwQ|\x18ku\xcd\x91y\xaf\xa9\xe0\xf0\xf0\ -&\x80\xda\xc6\x02\xf8\xec\xcc\x11D\xe8&\xd6\x7f\x9b\x94\ -\xe5\x1e\xf1\x96\xb89{\x8a%\x92\xe3\xe2Ju\xbe\xbe\ -\xeb\xcb\x8b\x87\xd1Z\xbf@\x90\x5c\xafU;\xcd?\x8c\ -a\x89X_\xdb\x14\xe4e\xc1\xedr\xf5i/\xe3\xa0\ -v\x13\xc3\x96I\x91\xdc\xe1N\xb8\xd5\x90\xd8\xbe\xa6\x87\ -\xdd\x926\xf7\xcdgu \xa3\xdfmPQ\x0b\xf7q\ -\xcb\x90\xd2\xaa\xda-Y;\x84\x0a\xab,!\xbf\xdc\xe2\ -sK-.Z\x8c\x14Z\x5c.\x92Wdq\x05%\ -\x16W\x5c\x01\xe7Q\xa1i\xbd%\x947\x10\xfe\x1a\xbd\ -W~\x8e\xd7\x1e\x832\xfd\xdc\x02X:\xe0C\xbdn\ -\xc7\xaf\xb74-O\xe1M\xf5\xfa\xdaum\xad\x05\xac\ -\x98\x16\x82\xdc\x01\xd0\x8d*\x00\xd1\xd4\xf7$\xafX\xa8\ -\x96\xbdQL\x1a\x8a\xd1\xbeKu\xfa\x129\xd7\xbc\x88\ -vj\xe9@/w\xa8\x17\xfcI\xe72)t\xaac\ -{J\xed\x90%\xb9\x92y-\xa6IT$\xd3\xebB\ -u|\xa5*\x97\x09\xdb*\xa7\x03\x10\xdae\xa4\xc5 \ -\xaf\x09\xa5\x1a_\xceXLB\xc5\xb0[7N\xe5\x17\ ->\xd0\xa4\xae\x96!\x14\xad\x16\xe9\x9ayr\x07@!\ -\xda\xdd\xab\x83\x08\x0b\xc6\xbc\x83\x9dJ'O\xact\x02\ -W?\xbeg\x85XWTs\xff\xe4\xfdA7\xd0\xe7\ -3\x81\x9d3\xc4\xb7\x19B\xc9,\x80X\x02\xb9W\x89\ -Y\xbb\xa4~'V\x86g(\x83i\x17\xb9UC\xb2\ -\x0fMBqm-\x93\xaa\x10\xc4k\xcc\xac\x92p-\ -\x0fk\xbd\xbb\x97\x9b\x1e\x00\xbd\xdck\xdb,\xaer\x85\ -\xd0\xb0\x09)\xc4\xdd\xaa\xe5\x9c\x96R\xc92\x94;\x8b\ -\xbf\x04\x14[Ic\xbdC\xa5q\x89\x0cV\xaaV\xce\ -\xb4\xd1\x93L&\xa9X\xca\xaf\xb1$IA\x8d%\xe6\ -W\x03\x84J\x80Pf\xb19Ev%\xa7\xd0\xae\x00\ -\x86+\xb9\xbc\xcf+\xb1X{\x98\xd16\x8a\x82\xa7\ -\xf1 \xcb\x90\xaem\xc8\x17\x00\x02\x00e\x0b\xa4Q\xa4\ -o:\xc2E\x93\x1d\x02\x9b_[\xce\xe5\x165Pd\ -\x1f\x89B3)\xa86bh>B\xed\x5c\xd4\xcc)\ -\x83A\xd0n\xd7 \x9e(8\x827\x80Sh>=\ -\x80'Sv\xa0r\xb74H\x90\x0aJRA{*\ -\x03\x9e\xc2\xa0$\x97\x01\x80\x92FK.i\xb0\x94\xd2\ -&\xa4\x05i\x06\x14XsA\xad\xc5\xe7U\xe2\x05P\ -4^!\x16\xafp%\x0a\x08\x04\x86h\xc1'\x89u\ -\xaf\x85\xee\xef\xb1\xb9\xe5x\x8cZK(l\xc1\xab\xf4\ -\xe0]\x08\x09\x18\x94\xbf\x11\x0e\xc3sd4\xe2\xb5\xea\ -\x15\x93\xb1tU\xe5hM^\x16\xe9J\xc3\xb4\x0dL\ -[\xc1\xcf\x97\xc4U\xc3W\xa6\x9e\xc2C\xeeh95\ -\xad\x8e`\x88\x1a\xff\x0a\xc6\xa9z\xe9\xaeU\xcci\x16\ -\x900;L(\xeb\xd6fU\xc6\xb7E}\x8d\xf0\x96\ -\xcd\x00\x88\xb1O\x82K\xa9c\xba\xf6\x18\xa8\xf8\xf5\x0a\ -\xdf\x7f\xa9\xb4\xd3.\x93\xc5].iCZ\xed\x0a\x02\ -\x00T\xb9\xea\xed\x91SM]:V\xa2\x93?t~\ -]\x1e\xa9\x95:h\x97J\xe9\xb3w\xacR\x87K\xe9\ -\x00\xa2\x19\x08\xde\xd45w\x14\x89\x94\x9f\xab=\xfc}\ -\x9a\xf5\xf3\x8a=\xdc\x9a\x7f\x83J\xadT\xac\xd0\x8b\xd2\ -\xbcx\x99\x0e\x18\x02\xedS\xee\xb3\xf9c{\x84\x80\x9b\ -\x84\x83\x07V\xbd\xf6\x14rH\x96@\x9e+\x82\xa3\xb3\ -\xfeu0\xb5\x80\x90\xa1\xa6\x14\xae\xc7\xae\xca\xb5T\xb1\ -\xd3\xef\x81@\xe1AS\xb1\xf24*\x97\xee\xc7\xdd\x13\ -\xf3\xfd\xc4~\xd7-K+\x88\xdaI\xdbA\xcc%\xef\ -\xcd\x04\x0c\x01\xbe+\x83\xefJ\xab\x06\xecd0i\xd5\ -d15\xdcWM\x1f\xef\xb9G5\x96\xd6F\xcd\xa2\ -\x06Wf\x1e\x87W\x88\x05\x0c\xb1\x02C\x14/\x80g\ -\x88uJ\xf7\x00\x10\x0b0\xe2\xf8}\x5cn\x05\xde\xa3\ -\xce\x92\x8a\xda-\xad\x82g\x84|e\xb7@\x0c!Z\ -\xd90\xee\xcc\x16\xc2\x1b \xf8\xdf\x01\xa0\xfa\xc0\x81s\ -+\xedv\x15\xc5\xaa\xdeM(iw\xc5\x9c\x89\x00!\ -\xa5z\xc8|\x8d\xd3\x10\xd55\xbc\xec\x915\x10:\xbb\ -w\x9eX\xcf\xeeC\xeb\xdc>\xb3\xe6u\xa5\xdb\xea\x18\ -\xbeLX\x80\x97\x0dh\xe7\xb5j\x12\x08#dV\xc9\ -\xcdZ\xfe\x1d\x03\x04C\xe7 \xe8B:\xcc\xdb\x19\xd4\ -\xea\xd2\xf9\x18\xb7\xf9\x92|>^\xdb\xa4\x19\x10\x15K\ -\x04\x19\xd4\x1c\xe2\xba\x8eg\xd3IS\x95\xa4PU0\ -\xfaJ\xac\xb5\x1c\xab\xd5!D:[ \x0fr%\xcb\ -\x0f\xf7.[V\x17\x04\x88L\xc0\xafE#\xe2\x9f\x03\ -@\xadJ\xbb@\xb3\xb6Y\x03\x82\x94\xba>R\x93Q\ -\xd39?y#[^{\xfa\xf5'\xd6\xb0\xf3\xc6\x1a\ -w?X\xdd\xd6\xe7\x10\xc5\xb7p\x85\xe7\xb8\xba\x07\xb0\ -j\x80\xa0\xe2\x0f\x91#\xb9PGt\x86\x01\xc2 !\ -\xc1+\xb4LV}\x01\xb16\xad\x03\x97H\x5c\xd4!\ -\xd8j\x8f\x96\x05;\x0e\x0f\xdc\xc4Jn\x03\xd2;V\ -0|\xcb\xf2\x06\x8f,\xa7\x17\xa5t\x12\xea \x97A\ -\xee5\x13\xf2\xa6\x8c&C\xc5\x15\xd5\x84\x1b)B;\ -u\x8b\x18\x97\xc2&\x80\x00\x18\xf2\xb5\xf7\x007\x9fW\ -\x81\x94#\x00\x02\xf7\xaf\xd78~\x8e\x07(\x89|6\ -\x05\xeb\xf7\xd5L:\xe5G\xbb\xf7-\x8f{\x88\xf6\x1e\ -Y\x88T5\xa0\xba\x86\x06u\x0f\x13+?\xaft\x86\ -\xf0z\x1bM\x07x&B\x1c\x9e \x09KM*\xeb\ -r\xaf)\x80=\xbd~\x1c\xf0.\xc0\xb3v\xdc\x86\x9a\ -\xe1\x83\xe76v\xf2\xdcF\xaf=\xb1\xbe\x83{V\xb7\ -\xa2\xb5\x8c=\xb2\x02B\xf4\xd8!\x19\x06\xe4PF\x00\ -g\x13qW\xf6\xa6\x8d\xad:\x87\xc0\xab\x19$\x9c\x02\ -~\x85\x0b5\xc1\x88QW,m\xceL\xac\xed\x86\x88\ -\xf4\xe3\xaa\xc7,\x9b\xfcWn\xbaD\xf9\xfc\xc2m\xab\ -\x82\xb0U.\xea\x0c\xbaS\x5c\xb7N\x12\xd5qk\xf0\ -\x04\xed\xf7W\xf5M;\xfcA\xe4\xaaY5\xec\xaa\xb4\ -Q\x95\x0d,T\xf5~\xb5<\x9c\x06V\x16\x867\xc8\ -\xc0\x0bduN\x03\x80\xabV\xbep\xc3\x1a\xb6\x9eZ\ -\xdb\xd1\x07\xeb\xbc\xfe\xd1:\xae\xfd`-G\xdf\x03\x88\ -o\xacj\xeds\xd7f\xbe`\x82J\xd6\xb0\x88\x87\xd9\xb5\ -\xda\xb5\xdb\xd6\xb2\xff\xc2\xba\xae\x7f\xb0\xbe\xb3\x8f\xd6\x0f\ -\x08\xfa\xef\xfc\xc1\xfan\xfff=\xb7~\xb3\xae\x93?\ -Z\xfb\xfeO\xd6\xbc\xf1\xad\xd5-\xbf\xb7\xca\xd9\x17\x90\ -\xcf\xc7\x84\xa7\x07V4\x86\xf0Z2\xf1\xc8\x01\xa4b\ -^\xd6\xfe\xb9\xd5\x01\x9a\xc6\x9d\xef\xacy\xffGk=\ -\xfc\x09\xf9\xc1\x9a\xf6\x00\xc0\xc6[w\x08s\xa1\xe6\x1f\ -H=\xb3T>&\xbe\x22O\x85B\xbd\x9d3(\xdf\ -\xf1\x0c\xd5\xdb\xc1\x17\xc8\x1etB\x98J\xadt\xd6\x8e\ -6\x8d*\xadS1\xaa\x8f1\xc8P\xaa\xa7\xcf\x10\xab\ -\xfdp\x8c`\xeb*\x00%+B\xe1\xda\x1f\x99\xeb\x1a\ ->\xde \x8b\x22\xa7w\xfd\x15\x8e\xed\xa2\xd9\xa3\xa6\x94\ -?e*X\xaa\xcb\x14T.\xcew\xb9\xfd\xfb\x18W\ -\xb2t\x03\xe1\xd5\x81\x9b\x85p\xad\xda\xa9\x03\xabW\xaf\ -\xa4\xd9\x13\xab\xc5C\x17\xaa\xe1v7Y\x01\x86\xa0z\ -\x0au!Ok^\xe7;VP8\xd6\xaf\xcc\x03/\ -)q\xe1\xe7\x5cRI=\x95\xa1\xc4\xa4\xaa\x22F-\ -\xe2:\x17]\xd7\xa8\x001=kx\xcb\xc2\xa3\xbb\x16\ -\x81\xe1\xabS\x97v\x05\x05\x07A.nH\x07/\xa7\ -\x92\xdb\xba#Z@S\x22\xb1\xcc\xabF%>\xcb\xcd\ -\x90\xc7'\xe2\xd6<\xe1\xbd\x03\x81j\xfd4\xa8\xbd\xa0\ -\xbb\x97A\x1f\xe4\xa6\xf1\x02#+\x10\xc1\x03,\xf5\x0c\ -+}l\xedGo\xac\xfb\xc6\x97\xd6{\xeb;\xeb?\ -\xfb\xd9\x06\xce\xfeh\xfd\xa7\xbfY\xdf\x8d?Z\xf7\xf1\ -/\xd6\xb1\xf7\x835c\xd1\x0dWQ\xa6\x9a?\x22\x8d\ -W\xbf\xb2\xf6\x9do\xad\xfb\xe0{\xeb=\x06<|\xb6\ -\xff\xd6\x9f\xac\xeb\xe6o\xd6q\xfdWk;A\xf9\xfb\ -j\x12\xf9\xc6*Vt\x82\xc9\xa9\xe9\xa8\xfa`\xd72\ -!\x0b\xf0_X\xbeS\xbe\xe2#\xf7\x09hS\x9a\x08\ -\x0b\xad\xa4b<\xafkx\xa1B\x0e\xa5\xc5*\xcc \ -\xdb\x08A\x90\xb3U\xef7\xa8\xe2\x8e\xf3\xbe\x08Xv\ -\xb0\x93\xd4\x14\x00\x84\xe0!\x11\x94\x9d3\x08\xd8T\x98\ -1z\xc7r\x08K\x91\xb1;\x16\xc6+\xa8\x8eA \ -Pk\xf7tM\xcfb\xa9\xea\xc4\xe6\xa4\x19\x01tI\ -\x00,\x19IQA\x0e\xa9of\xe7\xbcE\xdc\xe4\xdb\ -\xb2\x855\x19\xd7\xb9j\x01\x00\x97\x8e\xb2\xd3\x90\xd4\x06\ -\x94^\xb7\x88\xc1\xcd\x91\xefk\xfa~\xd2\xcb\xfb\xc5\x9d\ -\x5c\xea\xa9\x13O\x14:\xbd\x99A\x81-&\xa5m\x89\ -\x0bx\xedB\x5c-`\xf7\x1aV\xae\xa5N\xed\x02\xe2\ -\xe1\x10m\x11\xd3yv\x17\xe7\xe1k\x8d<\xd9\xcd`\ -q\x83nzQ\x02\xc1Qy\xb4\xfeF\x8cs\xafz\ -\x10\x80\xa2R+o\x070\xee\xb3\x0e\x06\xde\xd8\x8fE\ -\x0d\x935La\x1d\xcbX\xe46\xe9\xe0\x09@\xb8\x03\ -\x10\xe0\x04\x87o\xad\xfb\xdaW\xd6w\xeb{\x1b8\x05\ -\x08\xa7\xbf\xa2\xd4_\xad\xe7\xfa/x\x84\x9f\xad\x030\ -\xb4\x0b\x10'x\x8a\x9b\x7f\xb2\xa9\xfb\x7f\xb3\x85'\xff\ -l\x8b\xcf\xfe\xd5\x16\x9f\xff\x9bM?\xfd;\xe1\xe47\ -k\xbd\xf6\x9d\xd5\xef\xe15 \x9aE\xf3g\x96\x0bw\ -\xc9&\xbb\xd1Ii\x8a\xad\xae\x22Y\xbbq%\x9a<\ -\x11\xb1\xe4\xf7\xda\x94\xa9\xbe\x89j\x9f\xa7\x1a\xbc \xde\ -Bg\x1ahuPk\x0c\xd1\xa9\x9bn\x8d!\xaa\xb6\ -\xf7S\xeao\x8cu\xab\xa2\xc7\xb9\xf9}g\x8dY\xbc\ -\x86 \x81r\xcb:\x926wR\xd3\xb8O\xdc\x8e\xea\ -\xc8\xf8]>\x7f\x1d\xb2\xba\x8b']uqZ3t\ -*\xd3v\xfb\x0b\xb4\xf9T\x00he\xfcZ\xb1`\xb5\ -\xb1\xc5S\x09\x94\xee\xe0,\x8c\xccY0\xd6\x9dJz\ -\x99R\xc7\xe7Pz2\xdc(I\x8a\xaf\x82\xf4\x91\x8a\ -\xbacgH'\xf5\x9a\xa0\x0d&\xae*X\x15\xc1\x18\ -'\xd7\xd2Q;\xaeGPJ\x9b\x0a\x05\xbd\xe9^)\ -Xu\xed\xae\xb8R\xacZ3N(^u\x82^w\ -\xd0\x7f\x88\x88W\x1a\x0f\xe0\x1aE\xa9v\xa0\x83\xfc\xfd\ -BT\x89\xa3\xbf\xe9\xb3\x8e\xf0\x88\xacM\xe0\x9a\xb45\ -\x8b\x1c\xb7i\x10\xf79B\x9a6I\xca\x07\xb2\xe1\x1d\ -\xf9\x13\xa4\x86:?x\xed\x1e1\xfb\x99\xb5\x1d\xbc\xb1\ -\xce\xe3\x0f\xd6}\xf2\x15\x80\xf8\xda:\xaf}c\xed\xd7\ ->Z\xfb\x8d\x1f\xad\xe3\xd6/\xd6M\x98\x18~\xf0W\ -[|\xf5\xaf\xb6\xfe\xee?\xdb\xda\xdb\x7f\xb7\xe5\xd7\xff\ -bSO\xfel\x1d7\xbe\xb5\x9a\x9dWVJ\xea\x94\ -\x07w\xc9\x06\xd0\xfe\x0eU\xc82\x08Xy\x1c9q\ -,\xe9\x96\xfa\xf1hBD{\x03\xe5\xbdR\xb4\x8b\x07\ -\x17\xaf2/uP\xd3\xd15\x1e\x00\xf0\x86\x22\x8f\x93\ -\x84\xc4\x19\xb2\x0b\xb2\xa1\x5c\x1dqCZ\x1c\x99\xba\x0d\ -\x08\xce\xe0N\xb7\xc8>\xae[\xb0\x070\xf4\x1c\xb9x\ -,B\xaac\xdb\xd5\xb5m2^\xe9g\x17c\xdd\x03\ -\xdc{\x00@\x17\xe3\x8fB\x9bb\x83v\x8d|\x02\x00\ -\x17S\xbe\xaa\x1e\xb9\xaa\x0f\xcc`0\xd4G\xc8u\x02\ -\xedSQ\xc4\x0enOK\xaf\xca\x10\xd4N]\xc0\xc0\ -+h\xb5K\xcaw^\x83\xc1\x13\xdb\x96\xf2\xbb\x17x\ -\xd5\xba\xff4\xa9\x0d\xa9\xa3\xbaV5\xc0\x0b\xeaQ\x84\ -\x8a,\x95B*%#3\xd1*\xa0\x8aJ3;f\ -\x89\xa9\xb0k\xfe7S\xc5\xa6\xfd\xa4n\xc3X\xe3\xf8\ -\xb6\x85\xa7\xf7\xac`\xf1\xd0\xaa\xd6\xafY\xdd\xe6u\xab\ -Y?\x86\xe5\xef[\xc1\xb4\xb6\xb5\xcb\x9a\xb1\x8c&\xa5\ -\xa2\xc4\xf6j\xe2=\xd6\xefu\xe1\x82\xf0a\xf9\xca\x8b\ -\x05rw@\x04\x0aw\xc0\x05\xe0\xda\x8e\xe5\x8aI\x09\ -\x8d\xb2Pg\x08\x840-\xee\xb8Jg\x81\x14@\x07\ -\xe1\x07\xd9:\x17\x99\xdc[\x07P\x14\x12\xdfK\x94\xa5\ -\xa8\x00D\x95?\x0b:\x1f\xe9\x85\x15\xce=s\x05\x22\ -\x02IX-\xe6U\xf0\x01\x00\xdc\xa9 (\xdc)\x05\ -\xde\xa0n\x9f*\xd4Hi\xdf@'KX?\x06\x89\ -\xeb\x96E\x0b\x00J\xdb\xdc\xa1\x8f.\x04\x13\xb6\xe55\ -\x94\xde\xc9C\xe0\xee\x93D`\x11\xb5\xd4Q\xdf'\x1d\ -w'\xb2\x97\xaa\xddUR\xbe\xeb1\xa8]U\x07x\ -l\xd5J\xee[\x8c\xeb\x80\x85\xeb\xf7\x94\xafmCr\ -7r\x19X\x06\xee\xc6-\xa2\xc8B $j)\xef\ -C\x99Z\xea\x0cB\x14\xb3q\x89\xe1!-\xb3\xc2z\ -y\xd56(u\x08\xd5\xf1\xe8\xae[6\xdeCLZ\ -e\xe5\xea\xc9\xab\x1e\x81\xb2~\x9d\xdf\x97\x06\x17\xd0Y\ -~\xaeEku\x17\x0f\xaa\x06M\xb0\xf0Zn^=\ -t\x9dh\xb2BG\xa4\xea\xd8\xb7\x01\xdc\x9dz\xf9\x03\ -\x12\xbcEr\x1b\xf7\xd6\xc9\xf7\xf5N[\xe6\xc0\x0c^\ -\x88\x10\xd2?\xc5\x83\xa9t\x9d\xfb\xc7\xb3$\xaa\x13\x99\ -k\xda\xc8\xf7j\xd7\xef'\xa6\xaf)j\xad2\xea\xbe\ -T\xc6\xae\x9dP\xdc\xb7\xac\x1f\xc5\x8b\x95{\x87>\xa8\ -N\x81\x01\xe7s\xe9J\xf5 \x87\xfefR2\xb5\x8b\ -%{\xd2\xb2x6\x80\xd7A\x91\xf9\xe3\xb7\xcd; \ -\xf3\xa5\x95/\xbf\xb5\xf2\x95wV\xb6\xf2\x16\x0e\xf2\xda\ -\x8a\x00A\xc1\x9c\x08\xe0}\xf8\x802\x80\x13\xc0s\xc0\ -8j^@\xa2\x94\xd0\xab\xdd\xd7^\x08\xb5\x81Mj\ -\x5c\xf4t\x22\x97\x8e25Q$\xf2\x97\x06/\x10\xf7\ -J\x15y\xe4\x1e]6\x86\xbe\xdc\x16t\x94\xef:\x97\ -\xf1|\xee\xffd\xc8\x18\xb6\xdc\xbeZ\x00\xf8;\xb6I\ -\x155=\xae\x1215\x98\xde\xb0\x18\xa5\x09Z&\xd4\ -\xd6\xe6x\x5c\x88\xa6\x0c5\xc5\xaaT\xc8\xc5\x1c5+\ -r\x1b+\x18\x04\x18\xa9\x5c\xb4v\xb9\x04q\x85\xda\x1d\ -\xa4I!m|\x10\xc9\xca\xd6\xb61\x11'H\xa3\xda\ -\xc4kyW[\x97t\xf8B\x9av\xe5J\x9aG\xdd\ -t\xb3\x94\x9a\xa4\xd5+\xd5\x18~\x9a\x8e\xee\xc02\xbb\ -\x11Y(\xaf\xea\xdf\xc7\xdf]3\xc72\xbd\x22\xe7\xfb\ -\xe0\xdd\xc9\xa0j1W\xc7w\xd4w\x02bO\x12\xd4\ -\xd0AM'\xf9\x9b>\x13\xcf5\xbc\xef\x04`\x88V\ -\x175g\xe1:\x81\xe9\x189\xac_\x80\xfd\x04Z,\ -^g\xf4\xa7\xe36\xd3\xc9\x93\xd3\xf1\x84\xe9\xa4\xb4\xda\ -\xd1\xe4\x94\x0f#\xcf\x84(\xea\xf8{\x9d\x0f\xac\xd3\xd5\ -sGN\xacH\x85\xa6*\xcb^yi\x95:\x80z\ -\xfd\x9d\x13\x95n\x95\xae\xc8\x13\xe0\x05\xa6\x1f\xc0\x13N\ -\xdd\x92\xb5\xdb\xd6&\x00\xb85\x0b<\x806\xc2\xb4\x12\ -\x06\x9aW\xf1\x84R>\xee_\x06y\x0e\x00q\x00\xdd\ -\xb3\xbc\x91k\xd3\x0f!O\xe15\x99\x9f\x93\xc8\x0c4\ -\xe9\x96HJ\x9b\xe0\x84\xf7\x18\xb0\xba\xbd\xab\xd6@\x8d\ -\xbd\xb5\xe4\x9f\xd1J\x18\xd7>K\x1dx\xd9@\xf8 \ -\x83\x88\x89\xab\x80\x11K\xb4*\x05\x82\xb4@\xa1\xedQ\ -\x1e\x08.\x88\x87@ \xf4\xc9z\xa7\x19\xa8Yn\x5c\ -\xb1z\x09\xd6\xbb\x86\xe5\x0b\x04[\x16\xea\xc7\x0b\xa8\xe6\ -^!\x02\xf7\xefN\xf2f\xd0\xd4^US\xc4\xb2z\ -7[\xa85\x02\x94\xac\xae\x1eq%\xcd\x16[\xdc\x08\ -1k\x22.\xab\xdd\x09\xe4\xacL[\xb2\xb4CW\xfb\ -\xf4\x1b\xbd\x8e\x9aH\x82V\xeb\xf8\xbc\xa6e\xe3\xf4w\ -\x00\xa1\xedY\x97\xb5s\xa7\xbc\xc9\xc9\x95r\xbeO]\ -\xc0\xb4\xc1\xb3R\x80R\xb3\x06\xafa\x83\x00\x90\xa4Y\ -\ -\xb9\x7f\xbeX\xb5{:\xf3G\xe7\xd4k\xb7\xabw\xfa\ -$i\xd1\xb0\xb7]\xdc\x89\xab\xf4\xdd\x01\x04\x1b\x0c\x12\ -\x5cA\x9fo\x9b\x03\x08\x0c`# \xd02.\x00H\ -V\xd3\x22Y2\x00P\xef\xdc+\x05\xea\xa6U\x07\x10\ -\xb4\x1b\xb7\xfe\x5c\xf9\xb5\xe7\x00\xb8P\xbe\x07\x80+\x80\ -\xe32\x00\xb8T\xdc\x8a\xd2\xdb\xce\xa5\xf5\xd3\x1aw\xac\ -z\xf5\xaa\x0d\xec'9\xef!\x04\xe84\x8f\x7f\xd1~\ -FG\xc3\xa6K\x18\xcct\x065\x1d\xc5g\x90+g\ -\x10\x163PH\xba\x04\x10\xb8\xbf\xf1\x99\x0c,Mg\ -\xee\xeb8y\xed\xf9\xcfF\x99\xda\x09\x1c\x1d\xbfa:\ -\xad\xdbm\x03\xd3!\x17d\x06\xd1\x09\xc9\x91;\xeb \ -G\xbd\x95D\x92\xe1H\xfa?\x85\x1b\xed]\x14\xc7\x10\ -\x89S+Z\x85_\xb5\x8e\x91b$\xcaP.\x00\xa0\ -\xc6\x0f\x0a\x03^\x9bZ\xbc\x81\x13\xbc\xb3\x08\xbb\xe6\x03\ -x\x06\x85\x02\xcd\x1e&\xab\x8c_\x93u\x22\xb0J3\ -?q\x05\xfe\xce3+\xe5M\xd0\xca\xa0\xf6>2\x16\ -1\xf1M \x0f\xcb\x8c\xaf\x1f&\xee\xfc.\xf6\xa3|\ -m\x0b\x13\xf1s\x9d\xc3 <\xae\xe9A7)\x906\ -B\xf20a2\x80\x9cQ=$\x83\xc0\x83G\x95\x12\ -\xb9\x87\xc5\x1b\xf4\xc3\x09\xc4\x92U&\xa6\xddA\x9dX\ -\x8d\xbc\x86\x80 O\x00\xd8\x92d\x99\xb8~\x0f\x04u\ -\xe7\x00\xf0\xe4\x12\xca\xbe\x8c\xd2/\xe7\xab\xe7\xae\xac^\ -\x9f!T\xe0\x1d.\x94\xffYI\xbb}V\xaa>\x7f\ -\x9d\xae\xe7\x9f:_\xc6^t\xe9\x02\x14\xde\x0a\xde\xb9\ -\xf0\xb3W\xad\xa3>DjFE\x18`\xe0\x9d\xa0\xe8\ -4\xd8\xb6\x13\x5c\xaf\x13\xde\xa7\xe2&S\x01C*\x03\ -\x9dJH\x10`Dl\xb5mNg-eiZ\x18\ -\x00\xb8\xdd;\xc3\x9a\xf5;\xc4\xc2\xb5X\x06)\xd6\xe4\ -\x91z#\xa8.QS\xc5\x9aO\xd0\xc4\x1a\x99\x94\xc6\ -Ss,\x8a\xe7\xca\xb6t\x91\x14P\xd5O^\xda\xa4\ -\xc1\x04\xf4\xbc&Wz\x92REv\x02\x00RP~\ -\x0a\x03,Qc*\x15r\xa8TMi\xb1fF\xd5\ -\xb4!K\x0a\x1f\xf5\xb6o\x85\xb5\xb1\xa6o\x1f\xc0\xef\ -`$(\x9c\x8cB%n:B\xc7\x1d\xdf\x8eBd\ -\xf5N\x5cvD\x86\xe1@ \xc5\xe8Tt\x8c\x10\xe3\ -\x8b\x93`\xe9\xf1b\xf6\x80\xd3\xb5tq\xa9 @\xf8\ -\xa4|\xadJ\x02\x00\xdd\x97&\x81\x00\x808D\x8a\x8a\ -N\x00\x81\x97\xbaJ\x88\xf9\x9aY\x04\xb8:e=\xb1\ -^M!&P>\xafx\xf6\x04\xf8YL\x22\x16\xae\ -9g\x89;\x18\x8a\x9bR\x1f\x1b1b\xb9*-r\ -H\xf1nkr?\xb1]\xee]\x9d+\xc9\xfde\xed\ -\xd1\xf1C\xa7x\x1d\xc7\x1e\x1e\xe5oC\x9b|F[\ -\xc4E\x0eQ\xf8\xe0U\xcb'M,\xe4oE#\xbc\ -\x0eoZ~\xff\x8aE\xbaf-K={\xea\xff\x01\ -\x02\xf1\x01)\xfd3b\xfeg\xe7\x00\xb8\x5c\x80\xe5K\ -\xf9X\xb1\xd7\xe0P-\xd5\xa4\xf4.\x94\xdf\x83\xf4\xda\ -%\xd5\xbb92\xab\xd8I*\xa4\x936\xca\x08m\xfc\ -\xdd\xe5\xfdj.\xa9\x89\x1f\x95[\xa9\x0b\x89\xa6~\xf9\ -\x9c\xbah]\x9c\xe2\x9d\xc8\xff\xa8\x05]R\x85\x06\x19\ -\x17\xcb\xa0{5z\xe7B\xecu$Li\xad\xa6\x89\ -\xb1n\xb7\x19EE\xa9\xc3\xc8\xc01\x1e\xef\x00\xe5\xc3\ -\xec;\xb6\xe0H\xe4\xf7\xa4Z\xee\x087\xf7\xba\xe1D\ -\xe7*\xb9\xc3\xb34\xa7\x02Q\x96\x91\xc9\xd8\xd4\xb0\xdb\ -\xedADI\xf1R\x94\xe2\xb5\xc2\x03\xfc\xc0u\xf6r\ -`\xe0\x9ep\xff\xc9\x10\xf4d\xcd^\xf2;\x15\x97\xb8\ -\x0ej\x02\x81\xd6\x06H\xe9U\x83\xa8\xdfy'\x9f\xab\ -\xef\x82\xdc\xbe\xc2\xc79\xa8\xf8\xfeD\xae\x97\x00\xf8b\ -R\x94N\xb8x\xa1\x19/M\xf5\xe2\xa6:u\xd0\x13\ -\xae^q\x0e\xe5\x8b\xdd\xab#\xc8\xc5\x89\x1f\x91\x91=\ -\x8b\x8e\x1dX\x1e\xca\xcfG\xf9y\x13\x00at\x97\xbf\ -\x83|\x95$\xf5\x00\x9enx\x02\xee_^@\x07'\ -\x16\x8d\xefY\xe9\xc4\xbek\x10\xa53\x04s\xfb\x97,\ -\xd49c\x01\xd2\xc2Truu\x09\x8b\x13\xa9\xc3\xda\ -/\xa9k&\x22\xe5_QGP\xe7\xc2\xd5C\x08\x92\ -\xaa\x82F\x14v\x05\xe5]\xc6b/c\xc1W\xb0\xd8\ -8\xd7\xff\x86\x87u\x82\x9b\x13\xcbE\x89\xde\xa2\x88\x1a\ -/j&P+\x7f\x84:\xf7\x9e\xf8\x8a\x88l\x094\ -\xf1\x02\x8dZ\xb2\xa9S\x09 P\xa3F\xb7\x98\x82\xeb\ -U\xd7N\xa5Ub\xda:\x90!\xbd\x97g\x1c\x14\x00\ -\xb4R\xeaUQ\x87\x01@X{\xf2\xfb\x04\x84#\x04\ -P\xf4\xdd\xe0w\xa7\xde\xb4\xf0\xe0)!\xe2\x16\xef\xaf\ -a\x18\x87\x84Q\xaf\xc3\xba\x1ap\xc9\xe0\xd4=L\x8b\ -3\xee\xf8{\xbdb\xb9Z\x14rk\x03\xfcN^\x22\ -I\xf7\x80\xfbV\x88Vog)W\xe0p\xab{Z\ -\x0f\xa8U\x95\xb0\xb7&\xe0X\xbe\xd2z\xc7+Tz\ -\xa6\xb5\x01=\x0f\xbf\xe7\xef^\x97\x10\x01@\xeeB\x84\ -D\xcaG\xe9\xda>\xadrj5!\xc8F\xd4\xe0I\ -;{\xc3\xb8\xf1\xb0&~\x90\x88\xce\xf0\x19\xd9\xb1<\ -u\x07A\xf2\xb0\xee\xa8&\x83\xf8\x8c\x0eTRg\x11\ -\xd7V\x8e\x98'\xa2\x98;\xec\xed\x15,\x99:B\x0e\ -\xadhB{\xdb\xd7I\xa3\x16\x5c\x09\x99N\xe2\xd0$\ -\x86,\xf6JI\x97])\xd6\x5c=RDL/\x16\ -0\xe4\xd6{\x9c\x82\xdcC\x80\xe48\x1e\x22\x0e\xeb\x88\ -#\x97\x8d\xaf\x9f\xe7\x814\xa1\xb5\xf8;Y` \xf9\ -\xbd\xe6\xd3yPgI\xce\x9aD\xbap\x7f\xb8t\x0d\ -F\x1c\x00\x89\x05\x10q(]\xe2V\xcf\xf43\xa0Q\ --]\x1c\x96\x13\xcf`ky;\x19\x22\x9c\x06\x01\xce\ -\xe0\x99\x02Z\x0a\x86\xffD \x80Q\xedNV_\xe5\ -q\xed\xf5\xd3\xa6\x8d\x07\x18\x86\x96\x9e\x9f[\xc9\xec\x1b\ -+\x9b\x7fg\xe5\x0bo\xadl\xe15\xe9\xa2\xa6\x88\xef\ -Y\xee\xd8-\xc6\xf1\x84\x90\xaa\x89 -\x09{L\xdd\ -\xad\x0a^\x00\x00\x8f,q\xcc^i\x1daZi\x9e\ -\xab \x92\xf25m\x8f\xd2=\xe5{\xab\x81z\x9f\xa4\ -T\xb2j\x1c\xa5C,\xdd\xb3\x09\x04\xe7\x00\xc0P\xe2\ -\xf5\xec\x8cA<\xff\x1b\xe3\x8e\x82\xc3\x0d\xb9\xa5`\x94\ -\xa7]8Y(22\xb8iQ$\xd7\x89\xe2\xf8\x06\ -\xf1\x5c1\xfd\xaas\xeb\xb9r\xe5#[\xc8\xb6\xb3\xf0\ -\x5c\x00\xa0]\xc0jx\xa4\xb0\xa1\x87rm\xe5\xf0 \ -\x11\x88Q\xde\xe8\xa1\x15\xc0\x88\x0b\xe51\x00MD\xfb\ -\x00\xd5L\x02b\x98\xaa\xbcU\xae\x09\x85\xe8\x06]\x83\ -Du\xca,\x1f\x81\xb8q\xd3\x92\x0a\xdec\xd9j\xa8\ -\x98\x88b\x13\x9b\x97\xce\x17NV\x19$O\x92Z\xd6\ -\xf9\xf9*\xb2aIm\x88\xa6T\x11\x1d\xf9\x9e\xcc\xef\ -5\xc3\x96\xc2g\x92\x9b\xf8l\xe3\x12\xa0\xd0\xfa\xc7,\ -\x03\xa14\x0c\x8b\xd0\xc0\x9d\xaf\xa1{ \x1b\xb5X\x94\ -\x1f'\xf2\x84B\x925C\xa8\x850m3\x1fF\xf9\ -0\xff\xfc\x99{V2\xff\xc4\xca\x17\xc9\xf9\x97\xdfX\ -\xe5\xca;\xd3\xf1\xf9\xb5\x1b_[\xc3\xf6\xf7\xd6\xbc\xfb\ -\xb3\xb5\xec\xfdb-\xbc6\xf2s\xed\xd5\xaf\xacrU\ -{\x04\x9f\x93\x1e>p\xdb\xd4\xc5\x1f2\xbb\xb6\xe0\x06\ -xb\xe5\xea<\x9f\xeb<&\xe5\xb7\xf1\x9e1Jn\ -;_\x16\xc6\x0biB\xc8\xb9~\xac_n_\x93:\ -i\xea\xaer.)\xf5\xaa\x09\x98=\x7f\x1em\xec\x95\ -7\xd0l\xa1\xc2\x08\x1e\x12\xe5{\x02\x00\xd2\x1d\xd9\x83\ -\xe9\xc3\xd2}\xbd\xcb\x969\xb0\x86\x8b\xd7\xf6.\xdc6\ -\x96Z\xac\xd7Q,\x1e\xa5\x87\xfbp\xe9\xbd\xc4\xef\xbe\ -\x15\x00\xb1fy(1\x0f H\xa2\x10\xbf\x08\x8c7\ -\x1b\x00x$\x88\x94\xa7[\x80 l\x0c\x1cX\x8ev\ -\x09+c\x807D\xf0\x08Y}\xea\xc6\xa19j\x11\ -\x17\x11\x18\x89&+\x18\xe4\xa65O\x1aW-\xad\x1e\ -\x16[G\x1aS\x8f4.3\x08kN\xa1Z4Q\ -\xbb\xd6\x0bI&\xee\xa6t\xee {\x96\xda\xb5oi\ -\xddG\x96\xd6s\xfcI\xd2\xf99\xbd\xeb\x10\xa0\x1f\xe0\ -\xed\xf8\x8c\xce\xd4k\xd39\x00\x1b\x1e0TE\x030\ -t\x0fI\x0ch\x22\x03\x1b\x8f\xc7\x88\x97\x07\xd1D\x0d\ -1=]S\xb6jJ1r\xcbr&\xeeX\xc1\xec\ -C+[zaU\xeb\xef\xacn\xebKk\xdc\xfd\xd6\ -Z\x0e\x7f\xb0\xee\xeb\xbf\xda\xd0\xed\x7f\xb2\xb1\xfb\x7f\xb7\ -\xa9\x87\xff\x86\xfc\xbb\x8d\xdc\xfd\x17\xeb\xbb\xf57\xeb8\ -\xf9\xa3\xb5\x1c\xfch\xf5;\xdf\xb8\xad\xddej\xbe\xad\ -\xbe\xcb#\xd7\xf1\xba\xbb\x8e#\x880:n\xc0\xd8H\ -\xf9)\xed\xc4\xf4V\xa4E\xf3\xfa3.\x1bI\xd3L\ -%c\xe6\xc3\x10\xfc\xad\x8c%<\xc3\x9b\xe2\xdd\x01H\ -\x9bn\xfc\xf4,\xee\xd0\x0b\x9eC\xab\x81nE\xd0\x89\ -W\x15\xa4mc1iX_\x9a\x9a)\xb5M38\ -\xb3\xa47j\xf4\xb0\x82\xcb\xde ^o\x13\xb7\xb7\xad\ -x\x0c\x00@\xecB=K\xae\xe1S\xa8\x9b\xcf`\xbd\ -\xd1\x01\x800\xb8\x86\xac[\x0e\x9eA\xed_\xdc\xe9\x97\ -d\x0cY=R\xfe\x9e\x8bw\xe1AR$\xeduW\ -\xca\xa4\xfd\x80\x10\xc9\x00\xdeF\x0bEnZ\xd3mS\ -\xd2\xea!\xee\xb0\xe7\x08ph\xe3\xa4:Z =\xd7\ -\x01\xca1!E\xfb\xd9\x0f\x9c\x12\xd2\xba\xd5\xa6u\xd7\ -\xbd\xa6u\xeb\xe7}~F\xb1\xdd(\xba\xf7\x1a.\xfa\ -\xa6\xf9\x07\xce,s\xe8\xaee\x0e\xdf\xe3\x15\x19\xbc\xeb\ -~\xe7\xeb\xbf\x89\x05_G\xae\xc1\xe4\xbd\xf63\xea\x98\ -\xe1\xda\xa7\x00\x12_\xc7>\x83\x0f8\xf0\x22)\x02\x9a\ -S\xfc\x9e\xfbl\xf6\xd0mr|\x9d\x9f\xf0\xd4\x8a\x17\ -\x9e[\xc5\xca+\xab\xd9xg\x0d;_\xa0\xd4o\xac\ -\xfd\xe4{\x1b8\xfb\x83\xcd>\xf9\x9bm\xbe\xff?\xed\ -\xe0\xeb\xffa\xc7\x1f\xff\x1f^\xff\x1f[{\xf7?m\ -\xea\xe9\x7f\xb3\xa1{\xffj\xbdg\x00\xe1\xc6o\xd6t\ -\xf8\xbd\xd5l~ne\xcb\xcfM\xcd1\x9c'pe\ -b\x22\x87b\xf3(\xae\x05KGt\xa6\xb3\xeb*\x06\ -I\x0f\x02\x90l2\x8b0\x86\x16\xc5\x1b\xe5\xf2\x7f\xd1\ -!\xd5D\xaa\xf4\x8c1\xeb;a\xcc~_\x17\xb8t\ -n`\xca\x16P<\x04S\xe2J\xc2RT\x0e\xed\x8a\ -\x0f\x87\xb9\xc8\x08\x17\x9f\x80\xf4\xcdY\xc1\xc8*\x8a\xdf\ -p\xca/\x1c\xd9\xb4\x1cu\xfc\xc0Kdv\xcc\xb9\xb2\ -\xf1\xac\xce9\xcb\x06\x08\x02E\x08\xcf\x11\xc2;dk\ -[\x18\x8a\x15w\xc8\xee\x917\x808\x92\x1a\x85\x05\x82\ -\x01\xd2$\ -\x22\xad|Bz\xf9\x84\xf8\xfa\x98l\xe3\x01)\x17\xca\ -\x84H\xf9PXz\xdf\xa1\xa5\xf5\xa2\xf8\x9e=\x14\xce\ -\x83\xaa\xb8\xa2\x1f\x05\x0e\xde\xb2\xac\xe1;\x16\x1a{`\ -\xe1\x89'\x963\xf9\x1cy\x81\xab~\xce\xef\x9eX\xd6\ -\xc8\x03\xc0p\x87\xf8-p\xa8y\xc4]~\x7f\xdf\x22\ -c\x0f\xb9\xc6C\xc0y\x8f\xdc\xfe\xcc\xd4>\xc5\xdf\xcb\ -w\xc2\xea%\xb2z\x1dI\xaf\x13\xc9uRJ\xe1\xf4\ -c\xcf\xedc\xbd\xd5k/\xacn\xe35\xee\xfd\xad\xb5\ -\xec\x7fn\xfd7?\xda\xf2\xf3?\xd9\xb5o\xfe\xb3\xdd\ -\xfb\xe5\x7f\xda\xa3\xdf\xfe\x7fv\xe7\x97\xff\xaf\xed~\xf5\ -\xbfl\xf6\xe5\x7f\xb5\x91G\xfff\xfdx\x86\xae\xdb\x7f\ -\xb1\xd6\xeb\xbfX\xdd\xeeWV\xbe\xfa\x92Pr\x97\xf4\ -Y\x00P\xb6\x80g\xd4^I\xc5\xfb\x06H\xb2\x0aC\ -q\xfd>\xb8@\x10p\x14\x10R\xab&\xaf[\xed\xec\ -M\xab_<\xb3\xfaem\x16\xb9m\x05\xae3\x99\xb8\ -\x05 \xe8\xd7\xeenU\x1c\xe9\xccGyOo\xceA\ -\xbd\x1eD \xd5\x85]\xfb/c\xbcs\xf14E\xda\ -\xcd/\xbd\xcd\x1b\xd9]S\x967\xb8\x04[_\xc7\xfd\ -oZ\x01\xec>\x82r\x03\xed\x0b\xa6\xa3N} \xd3\ -\xdf\x0a\x83\xd7\x9a\x80\x96Fubx\xd7\xa2i[\x98\ -j\xed\xb4\xd9SS\xc1\xd9 4D^\x1c\xc6\x13\x84\ -\x05\x04\xe5\xc9\xbc\xcf\xe2w\x0a\x0f\xfe.\xc4mNU\ -C\x04\x94?\xae-\xd0\xb8D\x9dJ\xb2\xfc\x1e\xf9\x9c\ -\xf7\x9f[\xde\xdc[\xcb\x99za\xd9X\x9f\x94\x97\xce\ -\xc3\xa5\xe2.S\xb1\x964\xbeG;\x85\xb5\x9f>{\ -D\xdb\xb2\x89\xabSO\x19\xd0W\x96\x0f\x01\xcb\x9fy\ -c\xd1\xa9W\x00\xe2\x99e\x8f=\xb2\xe0\xe8}\xe4.\ -\xdf\xa5\x06\x12j'\x83\xf5\xcd\xea\xb3/\xf9\xbfgX\ -\xf8#R\xbb\xbb\x00\x0e0aQjH\x91\xcdkh\ -\xf8&\x008%\xfb\x81\xec\xe1\xfe\xd5\xd2F\xf3\xffe\ -\x0b\xf7\xbc\xcd-\xab\x0f\xadv\xfd\x91u\x1e\xbc\xb2\xb9\ -\xfb\xdf\xd8\xe1\xfb?\xd9\xe9\xc7\x7f\xb1{?\xfd7\xbb\ -\xfd\xe3\x7f\xb7\xdd/\xff\x8b\xcd\xbe\xf8W\x1b{\xfcw\ -\x1bz\xf87\x00\xf0'k\xbe\xfe\x93\xd5\xee}ie\ -k\xdc\xc3\xccmWk\x18\xe8\xc63j\x8e\x00\xcf\xac\ -\xfe\xc5\xaaYL\xab\x1buk\x11\x99\xad\x8b\x16\xc1\xbb\ -V\xa0\xfc\x8e\xf5\x07\xd6\xbd\xf5\xd0zv\x1eZ\xf7\xee\ -CkX\xbd\x0d\xe9\xbc\x06@\xd5R\x06\xc0\xaa\xbf\x03\ -^X\xfd\x91\xdcz\x01)\xa1\xb2\x19\xafHD\xa5\xfa\ -\xfd\xe8\xbc\xcfb\xb4\x1a\xe7\x8eM+\xef0\xf5\xecM\ -\xab\x1b\xb4`\xeb\xa4Eq\xf1\x05\xc4\xfd\x02b{\x1e\ -9oX\x04\x91\xb8\xe4\xe6\xcd\x9b\xd4\xf1s\x06 \x00\ -\x06\x15Nj\xaa\x17\xb2r!\x81vZyEb4e\xaaY3\xf5\xdf\xf7\ -\xf6\x07\x8eZ\x00\xc5\x86\xb1\xe2(\xa4.wp\x97\xf8\ -N\x8e\xaf\xc9 \x15\x83\xb4\xaf\x00\x84e'R\xb2$\ -\xa05u5y\x80\xb4\xf8\xb4\xc2F\x9c\xf2\x93^f\ -\x92\xda\x04A\xa0\xe2U\x08\xf6\x1cBY!\xc0\x10\xc2\ -u\xabN^9\xb1*du<]t\xea\xb1\xe5\xa3\ -\x8c\xe2\xd5w\x0c\xcaWV\xb3\xff\x9d\xd5\x1f\xff\x8c\xfc\ -j5\x07?\x03\x88\xef\x00\xc1\x07\xcb\xc1Cd\xa1h\ -?nY\x0d\x0eTD\xa1FP\xb2T\x1db%\x17\ -\xed\xf5\xe6y\xeeZ\xb4\x14L?\xb3<\x94\xaa\xb2\xac\ -\xf0\xe8\x1d\xbc\xc4\xa9\x93\xd0\xe8\x99+\xe3\xca\x9b\xd2\xe7\ -\xb96\xd7\xcfS\xd9\xd6\xd8]\x94\x8d\x1b\x1d\xe2\xfb\xe0\ -.9\x83\x87\x08$V2\x84\x0c\x8b\xd0\x1e\x02\x06~\ -\xcfk\x0eV\x9b3\xb4O\x06\xb4\x03\x09\xde\xb4B\xb2\ -\xa1\xfa\xd9#\xeb]\xbfe#\xbb\xf7l\xea\xf8\xa9\xcd\ -\x9f\xbe\xb5\xa9\xd3\xcf\xdd\x99\xc7=7\xbe\xb4\xce\x1b_\ -Y\xdd\xde;\x80\xfe\xcc\x0a\xf0 \x11,:\xc88{\ -\x0aSY\x9e7g\x7fQ\x09\xa4\x92\xf3,\x5c\x7f\x8e\ -\xf6\x08\x8e\x01\xb2\xa5\xfb(\xfe\x09 \xb8kmk\xc7\ -\xd6\xb4\xb4c\xa5c\xf2\xbe:\xebh\x12\x12I|o\ -\xc1\xddkvWS\xbex\x91X\xd2\xec+(\xff\xb2\ -\xa6\xcdK\xdb\x916\xa4\xd5b\xdcVb7\x0b\xa6\x8b\ -\x8d\xc3,\xb5\xda\xa5m\xde\xdb\x10\x0b\xf5\xf7\xc1\xad\x90\ -\xaf\xe6\xf0>\xacF\xd1}Z\xe8!\xbe+\xc6#\x22\ -|\xdaQ\xac\x93\xc2u\x5c\xbc\xda\x95f\x00\x00\x1fi\ -\x8c\xbfy\x110\x01\x12\xd2\x9b`\x1b\x1c\xa2}\x1d\xee\ -\x00B\x01\x81<\x80\xce\xc7W\x85\x8c\x00\x903\xa5\xbe\ ->x\x80\xe5\xd7V\xb6\xf1\xc1\xaa\xf7\xbe\xb1\x86\x93\x1f\ -\xac\xf1\xba@\xf03?\x7fo\xa5\xa4P\xf9\x0bo\x88\ -\xebOP \xf1zH\xe5U\xb8h\x80\x14Baa\ -b_\x0e\xdf\x17E\xb9\x12)2\xcc\xef\xdd\x89\xe5\x00\ -N\xdb\xdf\x83d%j\xce\x90\xa5p\xe4\x08\xea\x89S\ -v\x0e.^$J\xc7\xde8\xce\xd2\xb7G\xd8#|\ -\xe1F\xc3<\xa3\x96~\x95\xe1h^?[\x13cX\ -bXmb\xfa\x0f\xf0j<\x0b\xe1,\x0b>\x13j\ -_\xb3|\xdcx\x19VXIz\x5c;y`m\xcb\ -7\xadu\xed\x8e5\xae\xdf\xb3\x86\x8d\x87p\x06\x1d\xbf\ -\x03\xd7\x99VS\x8ec\x94\x0f\xc9\xe4\xfb\xd5\xd7\xd0M\ -\xdf*^\x9f3wu\x15\xd7\xb6r\xf1\xa9(\xba(\ -\x9c\xd3\xfeC\xb7C\x18\xb9\xa2\xb9\x16'\xdd\x16\ -\x8b\xc4x\x95\xa5b\x87\xc4\x9d\xe6U\xd2\x10\xcd\xf9\x13\ -\xafq{\xb9c\xa7\xae\x9dI\xde\xf8\xa9s}9Z\ -\xf0\x18\xe4ox\x04\xad\xf8\xa9\xc5K\xb6\xa6\x88\x19 \ -\xcd\x1c\xba\xe9M\x1e\xc2\x87\xe5\xfb`\xf6~r\xf4L\ -HH\xb0\xc3k_\x9aE\xba\xa6\x13\xc54_\xaec\ -\xe6B\x1al\x07\x80;X\x81\x5c2\x96\xb8\xf8\xc2J\ -\xd6\xdfZ\xe5\xee\x17(\xfe#\x00\xf8\xd1\x1a\xaf\xfdd\ -u\xa4W\x95\xdb\x1f\xadd\xf5K+\x5cx\x87\xbb~\ -\x89\xc5B\x14\xc7\x94B\x9dy\x8a\xee\x97\xa2Q2\x1e\ -&S\xfc\x82\xeb\xfa\x00\x9e\xb7\x1d\x0bbE\xc6!\xd1\ -|\xbc\xee\xd3\x8f\xb2\xbc\xe3\xee\x95\xba\xa2\xc0s\xc9\x86\ -[8o\xc5\xefC\xdcw\xf6\xb9d\xf1{\xcd\xe0e\ -\x13_\xdd*\xe0\xd8M\xcbgl\x0a\xc6\xce \xcd7\ -\x09\x95x\x0cy7=\xaf@\x8f\x01dq\xad\x02<\ -C\xe9\xd8\xbe\x95M\x1d[\xf9\xec\x0d\xb7'Rk(\ -Yx\x0e\xb5\xb6\xf1\x03,\xd5#\xaa\x0c\xed\xf7g3\ -\xebg\x1f\xd7\xcd\x04\xb0*\x22\x89\x8e\x9fY\xfe\xe4\x1d\ -\xc2\x8e\x1aB\x12~F\xf7\x08\xd5\x10\xf0\xf6)\xf3\xab\ -\xd95!\x5c\x07g\x5clp\x89G\xf1\x09*}?\ -_]\xd4\x8c\xa8&\xbe\xe2\xabF\xdd$X|\xf58\ -i 9dz\xfb\x06\xeeG\x95\xbd\x07\x16\xc4\xb5\x86\ -\xd4\xb4Q\xb3Z\xd3\xeao\x83\x90\xa7\xe6\x81<\xb5\x88\ -\x8f\x0c\x03\x00M\x0bk\xb5K\x0b\x22\xbd\x9a\xf0\xb9\xf0\ -\x00\x02\x80D\xef\x19Xr\xf3\xac\xae]\x14\x8e\xb2q\ -\xd3!Y\x8a,\xaf\x8fl@Y\x01 \xd3I\x98\x11\ -\x1d'\x0f\xb1\xcaQ\xf7\x8b\x99\xfb\xb8\xc5GV\xa2\xa2\ -\x0a\x98u\xed\xc1\x97V\x7f\xf4-\xf1\xf2{\xab\xdd\xfd\ -\xc1\xaa\xb7~\xb0\xaa\xab\xdfY\xd5\xda7V\xb5\x02W\ -\xc0#\x94(\x96\x03\xa2( \xd05\x82(O\x1bJ\ -}*\x84\xc4\x82TC\xef\x8e\x9e\x11\x03Vl\xe5\xd5\ -m\x8f\x82\x15\xa7\xab\x00D\xde\x0a\x90\x04\xb8\x7f\x85\xb9\ -,@!\x85\x87\x00\xac6vfK\xbaP<\xcau\ -^\x83\xfb\x8e\xc2\xb6\xf3\xa6t\x14\xfd\x03+\x9d{\x84\ -R\x91\x99\x07V\xacf\x0ej\xea\xa0\xb0\x841\x05Z\ -\xe1A\xe4\xf69x\xcd(\x9eC!5\x8a\xe2u\xfc\ -\xbc\xca\xd0\xd4\xbcR\x85\xa7Z\xbau\xc5\xa1j\xdd\xe2\ -j\x04w\xd1\x87\x00BZ\xcc\xf7\xa9uO\xf4\xd3\x89\ -\xa1\xea\x12\xa2if\x9e\x15^\xe0\x87\xe4i\xc9:\x19\ -\xe5&Vj\xba[\xa2\x121-x\x0d\xbb\x95C\xd7\ -oA\x93m\x9a&\xc6\xbbx\x15\xe0\x0b\x16\x93\xc1\x85\ -|*\x14\x84\x90\xb9\x1e\xbc(?4\xa6C\x09E\xca\ -\xb0\xc89d\xf6!\x17Vy\xb3\xdc\xacn^^\x02\ ->\xa0\xee\x1b\x9dX\x92\x8a*qS>\x1eB\x13\x19\ -\x99\xce\xd2\x15\xe7\x09\x1b\x903\xb9\xd6\x1c\xb9gD\x84\ -*\x0c\x9a=\x11\x07\xe0A\x5cw2\x91A\x84\xf7\xaa\ -\xb2\xd5\xe1T\xc5\xcb\x8f\xacb\xe3\xa5\xd5\xec~\xb0\xfa\ -\xfd\x8f\xd6p\xf0\x935\x1e\xfcjM\x07\x7f\xb0\xe6\xfd\ -_\xacy\x17\xef\x00Y\xac]\x837\xcc\x93\x9bc\x1d\ -\xea\x95\x1b\xc1}\x87 \x9fA\x94\xea\x17aE\xe1\xa9\ -\xc4T\xad\xa2\xb9\x83\x15T3\xc7{W\x17H\xbc\xcd\ -`\x00\x03\x84/\x852\x85\xb5\x10\xb9\xb52\x96\x08\xf7\ -\x1f\xd1\xe6\x0e\xed4&\xb7\x0e\xcb8D6\xa5`\xac\ -_\xcd!\x0b\xb9\xcf\xd2\x85\x07\xae\xe1d\xd5\xca\x132\ -\x02\xd2\xc3y\x5c\xbc\xa6{\x19\xcb\xec\xdec\xc6\x83\xf1\ -=\xaf\xc3S\xbb6\xe7\x99\x5c\x0a\x8c\xcb\xe7\x1e]\xc1\ -\x86f\x01\x05\x00\x8cF\xfd|\x95~\xfaU<\xaa\xbe\ -\x81\x18\x89k\x14\x05\x00\xa2\x02\x80\x80\xa0\xfe\x82xh\ -\xe5\xffa\x0c*\xc8\xff\xa9\xdcK\x07k\xa8G\x90&\ -yRk\x09!\xb5d\x13Hr\x1d\x06\x80\xb7O\xaa\ -\x9f5\xd5\x81z\xc7\xd0\xaf\xea\xf8\xf8C\xf3\xf3\xa0j\ -\x17\x17DQ\xd9\xa3\x10$\xac\xc9\x03\xc0\x13R0\x04\ -\x00\xe4\xaa\x9cI\xad\xcc5\x89\xa3\xd50m\xc7\x86\xf0\ -\xb9\xeeYn\x05Qnu\xcd)_\xf1=\xc2@\xe5\ -\xe2\xde\xf3\xf9\xae\xfc\xc9{^c#\x90\xab\xa6\x88j\ -\x94\xa4\xd2(\x1dT\x1d\xd6r\xaa\x13\x06\x17Q\xbbt\ -\xcd\xaf\xe7N\x9d\xc2\xce\xef\xbb\x06S\xd5[o\x01\xc0\ -\xd7\xd6D\x18h9\xfe\xc5\xda\xae\xfd\xc1\xdaO~\xb1\ -\xf6\xa3\x1f\xadu\xff\x1bk\xdc|o5+\xcf\xac|\ -\x0e\x8b\x04\xa4y\x90\xb5(\xa1)BX\x0aAP\x83\ -d*\x01W\x9a\x86\xe5\xbbM\xab\x12\xf2`\x94\xaf\xc9\ -\x15q\x17-|\xa9\x0f\xaf\xb8\x8ebm..=\x17\ -\xb2(\x89\xc25\xd4s/\xa2T\x15#\x11o\x08\x13\ -\x0eU\xe1\xa3\xa5\xf0\xa2\xf9[V\xb1z\xdfj6\x9e\ -X\xfd\xf6K\xab\xe3~\xab\xd7\xc9f\xdc6\xf7G\x80\ -\x1e\xf2\xd9\xa7.^\x8c\xb3\xfa!\xbb\x1a@\x00\xc0\x98\ -\xb9\xf2n\x09\x5c\xe9\x1f=\x824\xf1t\xe0\xda\xc5\xa9\ -e|\xa6v\xfcb(\xd9j0%O\x80\xf2\xd5\x9f\ -\xb0\x10oY\x04 \x0a\x09\x9f\xb9\x10`\xb5\x83\xcd\xec\ -:\xc4\x10w\xe0a\x80\xac\x89\xf0\xd7\xb8\x82\x97#\xf4\ -\xa1t\xb7\xff\xb0\x19\x80\x9c\x83-\x15o\x13\xe3\x07\xa1\ -\x01\x10\xae\x06\x85\xbf\xef\x16\xa6\xc6D\xd1iX1!\ - \x8a\xabS?[m\x8f\x0a\xf4\x90^\xc0\xf8\xbd\x1e\ -\xc2\x9a\x9aT\xcd\xf9\x02qU\xde@\xb3\x80\x22G\xc4\ -+)\x1f\x96]\xc8\x0d\x16\xcd>\x22%{\xec\xda\xa8\ -\x16p\xd3r\x9d\xea~)@\x85G\x09\x05\xa3\x84\x87\ -QB\x0b\xccZ-\xde\xa2\x137`\xef:{@]\ -\xc6\x1e[5^\xa0~\xf7=\xd6\xff\x855\x1f~m\ --G_[3\xef\x9bv\xdfY\xc3\xd6K<\x00\xd6\ -\x07\xa9*\x9b%\x1d\x9b<\xb6\x02\xbe+oh\xc7r\ -\xf1TQ\xd2\xa1\x88Z\xd5j+\xf8\xf9I\xe6:\x8b\ -/\xbd]\xa2z\x87\x157\xf9\x92\x8d\xf2#R>\xc0\ -\xcc\xbdX\xdcQ\x96\x00A\xcd\xd5\xe4\xd4\x08F\x01\x10\ -\xb4\x0bY\x00wK\xe4|\xb7\xba\xa3G'w!u\ -\xd7\xadr\xe3\x1e\xec\xfe\x855\x1e~\x0e`\xbft\x8d\ -\x1cK\x97IE\xd5\xc0Q\x13ZC\xa4\x97\x03\xe7^\ -A-lTz\xee\xaau\xe6=q\x0bsZ\x95\xbd\ -\xeaJ\xd4\xb5\xc7\xc2\x8f7\x0b\xe0\xea\xd51\x5c\x8d\xa3\ -U\x7f\xa0\xc3\xba\x0aT\x83\xb8\x84\xb7YQ\x152a\ -p\xde\xe3D\xe1\xa1{\xdc\xd7-\x80\xc05:\x0e \ -\xf4\xf0!\xb5\x8dk\x13\x1f\x02`\x18\xa9\xe3\x1ax\xa1\ -4\x80\x18\xa3\xce\xdc\xea\xc5\xaf\xa6\x0ajJ\xa4n\x95\ -j\xb6\xac\xadN\x8a\xcb\x12u\xab\xcc\x06\xf1\x99X\x95\ -V\xf9>mi\x96(\xfe\x80d\x95SkbG\xe5\ -\xce\xae\x7f/\x00\xc8\xe5\x7f\x0b\xa6\xef\xe3&q\x89\xf3\ -\x8f\xadx\x01\x99\x7f\xc8\xcf\x0c\xec\xa4\xb6L\x1d\x02\xaa\ -\x1dR8\xed\xba\xb9\x0a)\x22\xee\x8e\x90N\x01\x88\xbc\ -\x89\x13\xc0s\x93\x07;3\xf5\xf5\xab\xbe\xfa\xd8j6\ -\xd5\xdc\xf1)\x16\xf6\xc4j\xd6\xef\xe3r\xf9\xdb\xe2u\ -\xe2\xef\xb1\x95L\x1f\xa0|\xb5RQ3jdt\xd7\ -\xf2G\xbcfV\xf9\xc3;\xae\x99\x85\xd6+\xc2\x5c+\ -\xab_\x0d\xa3\xe1-X\xbd\x0a]\xdc9H\x03\x80O\ -\xd9\xce(\x04M\xaeUm\xd8\xf0^\xb9\x84\xc3\xe8\xa8\ -Z\xb2\xe1\x01\xc88\xc4e\x82\x90C1sm\x8f\xf7\ -w\x91\x9f\x0f\xadX\xde\xcc\xae\x95\xae\xdc\xb0\xea\x9d\xc7\ -\xd6x\xf4\xce\x9a\x8e\xbe\xb2\x06\xbcV\xed\xf6Wx\x83\ -/Q\xd2;+\x99{\x89\xc5\x12R\xe5a\xb1j\x11\ -JM\xfbj\xeb\x5c2\xa9\x9e*v\xdc\x16\xeeFm\ -\xfeP\xfd\xbf\xc0\xcau\xba \xab\xdc\xab:\x8e\x85\xe4\ -\xdd\xc6\xafaH\xb7\x01\xc0c<\xcf+\xab$\x04\x96\ -\x09h\xb3\xaf\xf8\x9b\x07\x82P\x1f\x9e\xbc\x87\xd0\xda}\ -\x02\x7f\x01\xb0\xf0\x8a\x00\xbcLaZ\xba\xca\xd0\x0c,\ -\xde&&\xb5\x05\x14\x8a\x08\xb6ijV\xb5\xf1|P\ -\x08\x17\xa3\xd6\xec\x1a\xa2\x03\xa5]/~\xe2\xaak \ -\x0dR]\xcd<\xaf\xaa\xa1\xd7\x97\xa9\xab\x95f\xf5\xb4\ -ARiYD\x00`\x10\x05\x80b,\xbf\x14\xe5\x97\ -.A\xee\xd4\x1eN\xfb\xea&D\x02a\xb8}\xc4\xe9\ -\x9ey\xf3!\xfe\xdeE\x00H\x0a:\xb4\xc1\xa0o\xe3\ -AP\xe8\x14\x8a%\xaf.\x9dG\xc9\xf3G\x0c\x22?\ -3\xd8\x85\x13\x1b\x967\xba\x82R\xd5\xe4q\x9etl\ -\x8eM\xb0u*T\ -\xads/\x90\xc9\xb1#+\x9a9\xb32\x08s\xc5\xd2\ -\x0b+[|\xc58\xbdp\xcb\xd0\xd1\xe1{x*\xc2\ -E/\xe9q7\xf7\xdc\xb9cA\xb8G@\x04]\x99\ -\x10^'M!\xa7y\x854\xb0^\x85\x89\xdaf\xa4\ -\xc5\x07m\x1fRQ\x08\x08\x87\xf5\xea|\x1e\xb7y\x81\ -\x87\x96\xf2\x1dq\x91\x8b:\x97\x7f(\x9e\xcf\x00\x1am\ -x\x14p4\x80\xf2\x00J!\x8bp\xf9%\x0bZ5\ -\x83-\xabJv\xfe\x14>\x009\x1c\x96\xf5\xcds\xad\ -I\xd8/\x0f\x8a\xa4wL\xf0]\xda#8\xcfC.\ -\xe1rQ\xf0\xf0\x0a\x0a]\xe6u\x09E\xcc\xa3\x04\x06\ -\xbc{\x02\xf76\x02s\x1f \xce\xf5\x11\xe7\xd4y\xc4\ -;\x1f0\xd0>\xc2\xdf\xa7\xb0\xd6E\xcb\xd3Z\x06\x9e\ -\xa1l\xde\xdbgX\xb1$\xc2\x86W\x9a\x91\x85\xe3\xca\ -\x07\xbd\xa6\xd8^\xd3\x06\x89\x9e\x93\xe7\xd6^{\xbcb\ -\xa6\x04\xcf\x18D\x14\xda4\x85\x9d\x85k\xf6\x8e\xc3_\ -\xc2\xcd\xce\xf1\xf7Y\x9ew\x09\x00\x008\x00Z\xbe~\ -\xc7jv\x9e[\xdd>\xbc\xe5\xe0s\xb2\x97\x0fV\xbb\ -\xf7\xde\xaa\xb4=}\xfd9!\x01\x0f8\xa7\x19K\x19\ -\x17\xf1\x9e\xefImV\xe5\xce\x08\xe4\xd4\xebQ\xa0\x96\ -o\x92$\xde'\x93\xc7\xa7\xd6\x0c\xc2\xf2\x87]Q\xad\ -\x8ak\x83x\x1e5\xb7\x88\x02\xa0|xS\x91:\x88\ -\xc3\x0b\x94\x09\xe5\xcaS\x11\xa6Bx\xf6,\x9e'\x88\ -a\x070RM\xcc\xb9\xb2\xf7\xa69/3Bt\x22\ -Y\x8c+(lPQ!\xbf\xe0\x03\xaa\x1fO\xd3\x9e\ -s\xe5\xa0\x8e\xb1\x92\xca\x10\xdb\x03\xae\x94\x89\xdf!\xf2\ -\x14\x19\x9a\x82\xd5\xf2\xa568\xa0t\x1d\xe5\xa2\xe9X\ -\x1d\xe0\x10\x86G(gU_`\xf5\xd1-Y\x90\x00\ -\x86\xb9\x1b\xc4\x7f-\x07\xaf3\xa8s\xe4\xe7\xda\xec\xd0\ -\xcf\xc3w\x83\xfe.\x88Y\x0f\xee\xaf\x0f\xef\x82b[\ -\x87@\xec\x88Sh\xa0\x8d\x87o\x1d\x84\xad\xf7[Z\ -\x83z\x0duZ\xb2:\x96W\xb5Z\xa2\x9aV#I\ -\x95-\x96R\xd3\xce\xdf\x01\x02\xff\x17\xec\x99\xe1:\xab\ -\x90\xb0\x1d\xee\xe1\x18\x00B\xd4\x96\xe1\x09\x80\xb0H\xc7\ -\xdf\xc2A\x94[\x0b\xe0\xeeH\x15\x18tj\xf3\x85\xe8\ -\xac\x80\xab\x8c\x83J\xb77\xf9>\xb9|o\x1cT\xe7\ -\x97\xa5R\xf8\xdeU\xbc\x0698 \xcd\x19\xbbJ\x96\ -\x84WZ8\xb1\xd2\xd5;V\xb1\xf9\xc4*\xb6^X\ -\x05\x84\xb0|\xeb\xb9\x95m<%\xad}HVs\x0f\ -\x90\x90\xcbO\xebtvyY\xf1)\x18\xbb\xac\x9f\xec\ -D\x15O\xae\x96Q5\x8c\xc5:\xf9\xb3\xcd\x92J;\ -\x5c\x05uje\x8f\xa9\xb9Uz\x1d\xe3\xd0\xc0\x984\ -Ox@\xe8Z\xb1\x08\xa9x\x0e\xe19G\x13W\xdd\ -\x90pt\xa4\x0c(\x80>\xfd\x84\x93\x0c\xa5\xbb\xa4\xbd\ -idCi\xa4\x8b*p\xf5\xfa\x14MY\x8c\x8a\x11\ -\xd5IJ\x1d=\xdc6\xe4\xa6iWb\xec\xd5\x06\xc2\ -\xec?M\x96(\xdf\x07\x10X\x80\x8fTI\xadY\xb5\ -\x08\xa3<\xd5\xb5\x9b\x95\xe0\xfa\xb5\xef=B\x1c\x15\xdb\ -wm\xd4g\xd5J\x1dF?s\x0d\x8f\x00At\xca\ -'5\x93\xf2\xeb\xd5;H=\xeeZMG\xbaK\xf4\ ->\xa1\xaa\x8d\x1c\x96\x87\x97\x92\xcf%\xb1\x0a\xa9l\xc3\ -B\xf8{y\x0b\x83\xd5d\xf1\xa5\x8d\x16_\xd2\xe0$\ -\x91\x9f\x93\xf9L:\xdf\x19h\x1b'V/\xc2\x8c\xb7\ -\xdc\xa6R\xb5\xba)\xc1\xf3\x94\xcc{\x80,\x98Q6\ -\xa2~\xbd\x10[\xc0\x1b\xe8\xdc\xc5-n\x00\xbe5\x8c\ -a\x85X\xacs\x81\xb5cZu\xfb\x22j\x1e\x10d\ -\x0cZ\xaeU\xd1\x8b\xaa\x9f4\xef\x1e\xd1J\xe98\xfc\ -bj\x8f\x8c\x09\x02\xba\xc4\xb3\xaeB~\xd7\x1eX\xc1\ -\xda}\xcb_\x06l\x0b\xb7,:\x07y\x9bQ7t\ -\x91\xddm\xc2\x86\x88\x1e^\xb7U\xc5\x9a#\xa6vq\ -WT\xefX\xdcnW\x0a[\xbcR8$\xbe\xa8\xc5\ -\x12\x00D\x22@H*\x03\xf8\x15^\x8f\xe6Tu[\ -\xa9\xed'\xc5\x1dB\xc9c\x16 \xc3\x094M:\xf1\ -7jC\xcb\xb8[DJQ\xfd\xa0\xf6a \xae\xef\ -\xa2\x0b1^\x95\xb1\x9aG\xc6\xa8s\x94\x8eEI\xa8\ -\x1d\xb4\x04\x95\x86\xabq\x82Z\xb6\x02\x04U\xc0\xea|\ -\x9b\xcc\xf3R\xf0\xa0\xca\x9b\xfbq\x95}\x00@\x84P\ -=\xfd\x1c\x08p\xa5\x00A\x04R\x05\x92\xea\xa1/\x92\ -\xa7\x9e\xfbE3zU;\xf8=\xcf\xf2q\xef\x19(\ -H-V\xd5~5\xa1R\x1b7\xb4\x89\xe3w\xe2j\ -\xf9\xd5\x91\x5c\x070#:\xf9\xda\x89\x8aC\x9b\x90\x06\ -\x8b+\xaaGj-\xae\x10\xe15Q=\xff\x00\x80\xbf\ -q\xc8B\x9ds\x96;\xb8I\xfc?\x81 \x9eY\xf9\ -\xe2]\xe4\xbe\xcb\xd7\xd5\xd7\xbfp\x16\xc5\x90\x89hU\ -/J\xda\x1b\xd614\xc4J_\xdb.\xdeg\x8bp\ -x\x15R\xa6\xca!y\x82M\xc2\x9d6r\x88\xf9\xc3\ -\x11x\xc6\xc8\x90\xea\x1bD\x1a\x05\xe8m\x9ey\x0bv\ -\xbema\x94\x9b3K\x16\xb3p\xc3r\x90\xc8<\x06\ -1E\x18\x81\x8f\xf8\x87\xc8\x92\x08k\xbe>\x9e\xbf\x9b\ -\xcc\xa9C%fcn\xcc\xe3\xb0\xecX\x5c\xbe;C\ -X\x00\xd0)\xe2(^@\x88E\xe2\x0a\x19\x13^\x05\ -\x06w.p\x89\xc0\xdf\x04\xe8\x9b\x01D\x1b\xde\xa1\xc3\ -\xd2\xaa\xba\x10y\x89^KE\xd4\xf1,I\xfb<\xdc\ -^\xc1^\x070'\x15\x12t\x8e\xc4\xf1>F\x9b\x09\ -]\x17/\xd0\xa4N\x9c\x89 *\xd1\xed\xd2\xc5]h\ -\x07P'\xc4\xcc\x9d\x12\x86\xdb\x1bX\xc7\xda\x89)\xb8\ -.\xd7\xb3\x97T\xc8k\xd2\xbcK\xfc\x17\xa9\x22\x03\x18\ -:t{\x05r\xc7\x8f\x19\xe0#H\xc9>\x84\x85\xc1\ -\x19T\x87m\x1e\xbe\x1d\xf7\xd34lI\x5cO]-\ -\x13\xb4e\xab\x02/\xa0\xf3v\xcf\xc5\x9d z.\xee\ -\xe4kU\x03\x970\x08\xeaiX\xd4\xc8\xa0\xd4Yl\ -A\x0dRmW\x0a\xd4\xa5\xb3\x0awYg\xa9U\x1d\ -\x96\xd9\xa5T}\x10\xc3\xc1\ -[x\x0d\xf8\x03\x1e.gD\xab\x84\xaaoPg2\ -\xed\x13P\xe7\xd2U\x0b\x0c3>\xda\x96>\xca\xf8@\ -F\xd3\xfb\x16,\xa5\x0b\x86\x0f\xe8\x93ZG,\xa9\x99\ -go\xc2\x12\x09}\xf1\xb5\xbd\x16\xc7\x18\xc4a\xd5n\ -;\x5c\x09\xcaw\xd2\x06\x10$\xaa\x89$$\xa86\xb2\ -\xa8\x0d\x01\x14<\xff\x15\xc0\x7f\xa5\xb8\x8e\xf1\xa8\xf7\xbc\ -\x1f`H\xc2P\x92\xca\xf0\x9a\xe5xL\xb7\x0b\xaa\x07\ -\xe5kM\x80q\xbe\x98\xfc\x92\xa8\x18\xd6UCK\xfa\ --\xc6\xf5\xa7\xe3&\xd4\xc6\xcd\x9dD) \xd4\x0f\xe2\ -\x0aGp\x7f\xe3(l\x1ab4G\x1a\x02\x0b\xedU\ -\x1bw\xc8D\xcf\x92\xeb'\x94\x0e\x19r\x0d\x14H\xa5\ -\xdcA\x93\xa4S^\xd9\xb8\xd2\x15/\xe5\x0a1(j\ -;\x17\xe8\xd4\xa6\x0a\xe2P\xb3&`\x04\x00\xb9#\xae\ -\xa5\x9bts\xd6\xbf\x13\x1dq\xae]\xbc\xda\xc6\xed\xca\ -\xba\x19\x00\xed\x09\xc0\xfac\x0b\xeb=\xe5\xe7W\xd9\x95\ -\xbc\x0a\xa4\x9c\xf7\xe5\x00\xa0\xc6\xd2\xe1\x00\xd9m\x13V\ -\xc0u\xcbI!k\xc8:\xea\xd6\x9e[-\xe4\xabZ\ -\x1d\xcbI\x9bJ\x01@1,\x5c\x9dIu\xf2\xa9\xe6\ -\x1b\x0a\xd4\xe6\x1d\xce\xa2^>\xca\xd3\xb3\xfan\x00z\ -\xbc\x82\xaa\x92\x06\xcfH\x81\xd5\xd7\x87\x94Xs\x01\x00\ -@\x8bG!\xb2\x06\xad\x0dhu\xd4\xf58\x86\xc8\xa5\ -\xb4LXJ\x1b\xaf\x1d\xa4r\xb2p\x94\x9e\x88\xc2\xe3\ -\xeb\xb1\xf0\xda\x1e\x8b\xad\xe9\xc2\xdaQ(!-\x8ep\ -\xa6S\xcau\xa2xl\xa9\x94\xad\xe3\xe3\xbd\x9dM\x92\ -\xcb\x02B\xa9\xceg\x00$\xa5}\xbc\xaa`V\xbd\x0d\ -\xf47m\x81\x03\x08\x88N\x0bw\x07K\xab\xd1'\x06\ -#\xe2\xa8-\xe2\xaet\xfc|\xb2\xcbkE\xa7\x02R\ -@\xa8=\x06U\x84\x80s \xc4\xa8\xf7\xbf6M\xba\ -\xe6\x81\x17[\xb4\xd5\xd0I[\xb3\xf1\x06\xa9M#\xc4\ -\xc7Q\xdc\xf6\x18\xe4O\x9d9!\x14(3\xbd\x93\xfc\ -_\x8d\xa5.N\xe0\x22LHt\xea\x96\xd2\x15\xb5c\ -\xf1\xb7\xcd\xc2\xd4\xb5\xab\x96\x98\xd44\x06\xfb\x1c5w\ -b\xa7<\x0c\xae/Y[\xc0\xb5\x07Q\xcd\x0c\xb4+\ -Y\xe2b\x94\xe6\xb1\x85P\xdc\x15 p\x00`p\xdc\ -\xce\xa0\x025m\xac\xb6\xd8\xdcJ\x8b\x8d\xa2\xfc\xdc2\ -\x8b\x03\x00I%\xb5\xe6\xab\xed\xb4(\xd6V6\xb6g\ -u\xb8\xfc\xe6\xab\xaf\xadu\xfb\x0b'M\x9b\xef\xadv\ -\xed\xb5\xe9\x8c\x1d\x81\xa0\x88<\xba\x80\x10\xe5dJ\x8b\ -^ZA\x94ruT\xccM'\xe1\x11-\x19k\xea\ -\xf5\x09$\x0f\xd1\x8a\xe5\xf8]\x97\x16fA\x1e\xfd\xb0\ -k\xb5sMR\xf95\xc0\xf5\xf6V\x22\x0am\xb5\x12\ -\xbc\x18\xa0\x8c\x85\xa0^\xa9\xd0\xc6\xd5\x06\xbb\x5cV\xef\ -\xe4J)\xafX\xef\x15\x81\xbaX\x96\x8d\xe0\xe1\xae\x10\ -\xea.c\xcdZ\xb2\xbdR\xa6\x15\xbc\x01\xaf\xaa\x97W\ -\xb7\x9a\x87\xb7P\xb7\xcf+Xz\x1c\x96\xee6\xbcJ\ -\xe1\x8c\x9d:\x84\x88\xdc\xb9\x13\xd7!\x80iJ\xf9\x5c\ -}\xa1j\x0c\xe0\x1bM\xda/\x00\xf9\xd3\xfe\x82*\xc6\ -\xb9R}\x02\x89\x0bj\x11\x9b\xe4\xbc\x00\x1e@5\xfa\ -\xe7\xa2\x8a\x91d\x00\xa1\x06\x8f)\xda\xc0\xd10\xe8\x00\ -q\xd1\xcd#\xbd\x1d2\x87\xa2}j\x00!\xe9\x00\x10\ -\xe4\xab*\x16I\x87P\xa6\x83\xc0t\xd2\x9b\x0c\x09D\ -'\xa3\x01 \xa9\xbc\x09Ik\x10:E\x04G]\xbe\ -+q\x1d-.r\xe1\x0b\x008f\xcc \x16\xe1\xfe\ -\xb5K(\x0f\xeb\xcf\xad\xb28\x00\xe0$\xaf\xd2\xe2\x09\ -\x05\xc9e\x8d\x16h\xe8\xb3<\xbcT\xd5\xf4\xb1\xb5\x5c\ -}f\xdd\x07_Y\xff\xb5\x9fl\xe0\xc6/\xd6\x7f\xfd\ -'\xeb:\xfc\xceZw\xbe\xc0+\xbc\xb2rMH\xc9\ -\xf2U\xd9\xab\xb5\x07\xc4\xcd\xad\xbb\xa5d\x08\xe2\xa8W\ -\xfe\x95\xaf\x0a\xa5\xf9\xd7V\xbc\xf8\xc6\x8a\x17^Af\ -\x9fZ.\x9fQM\x83\x96\xbbS Rj,\xe9\xdc\ -\xb3\x00\xeav:\xc3Q\xca$\xb8\xe9\xb2\x1a\x94]\x85\ -\xb2+\xedRq\x85'E\x95\xc4\xf8j\x040\xe3\xd2\ -\xb5\x1fB\xa2c\xebuZ\xa9\xb7\xe3\x19\x00`\xcd*\ -\xe2p\xe5\xe9H,\xe9`,\xc6)\x89\x97\x07\x15\xc9\ -\x83\xe1\xabg\x80*\x8a\xd5\x03\xc0G\xb6\xa2\xce\xef.\ -=\xd7\x8a\xa8\x13\x11X\xad\x8a\x02\x08M\xdei1\x8c\ -\xb1VG\x91\x98\x14\xbeT\x1d)u\xfc\xfa\x85\xb83\ -\xef\xcf\xdd\xb3v\xd4&\xba\xb3\xf0\x11\xd7\xf2\x15\xb4\x91\ -\x93\xea\xfc_50T'\x0f\x9f:j!R\xbej\ -\xd9\xd4L!]\x8b,u\xe3\xe6\xab\x1bs\xe2\x87\x95\ -\xfa\xb5\xcbV\x0c\x15I'\xeb\x10\x08R\xe5\xa6\xceE\ -uj\x0e\x08nO\x9c6n\xf0\xa0\xe7\xa9\x91\x068\ -V\xbb\x84\xf2\x19\xd4\xbcZ\x8b\xcf\xab\xb3x\xde\xc7\x17\ -\xeaL\xfdF\xe2\x7f\xbb\x05[\x86-\x7fp\xc5j\x16\ -nZ\xc7\xeek\x14\xff\xbd\x8d\xde\xf9\x93M\xde\xff\x0b\ -\xf2O6v\xfb7\x1b\xbc\xfe3\x7f\xfb\xda\xeaV^\ -[\xa9V:\xc7\xceP\xa8\x94O\xe6\xa2\xe5or\xe9\ -\x82I\xd5\xfd=\x810\xbe\xb4\xd2\xa5\xf7V\xbe\xfa\x95\ -\x95\xaf!+\x9f[\xf1\xfc\x0b\xcb\x1b\xbb\x0d\x00v\xcd\ -G\xea\x9c\xaceV\xc5\xe7|\xac\x99\xfb\xba\x22\x80\xe6\ -\xe3\xa1\xc4M\x0a+\x01E\xb9]*(\xb5\xcf\x0aJ\ -\xec\xff\xc8/\xb6\xcf\xf2Kx_\xc6\xef\x00\x81B\x19\ -\xf7\xef\xb6\xbd\xb9\xddO\x00\xe0|w\xf3\x15m\x93\xc7\ -8\xa5\xf8x\x94\xa5\xbd\x09\xf1\x8ca\x1cc\x96\xc0\xf8\ -%5O[\xaa\xb6\xb4\x93\x96\xaa\xdd\x5c\x96Rp\xbc\ -\x96j\x17\xb3\xdc\x11{\xea\x18Jz\xde\xab\xad\xe8{\ -xf\xa5\xb2\xab\xaeXG\xfaIS\xdf\x07\xc6<\xc6\ -\x1d\x09'+\xc4%\xbb\xd6\xae\x88\xb6\x86\xab\xe3D\x12\ -\xe8s\x1cAa\x02Q\xd7n5l\xd6\xe6\xcaT\x14\ -\x95&\x104k\xcb\xb8\xb6Z\xc3l% L;n\ -3\x1a\xa6\xcd\x87{\xf4#\x01\x09H\xf5K\x88G>\ -\xcdnq\xf14\xae\xab\xefQgL\xed\xd8ueP\ -\x02\x01\x0f\xecR\x15\xc5)\x15\xach\xbf\x1f\xec\xf8S\ -\xff^$\xbe\x88\xd8\xc7\x80%\x12\x13\x93\xcb\xdb,\x0d\ -\xb7\x1bl\x1d\xb3\xbc\xa15\xab^\xbci\x9d\xfbol\ -\xe8\xf4G\x9bz\xf8\x17\x9b\x7f\xaa\x16r\xffl\xf3\x8f\ -\xff\x93M\xdd\xfb\x8b\x0d]\xff\xd5\xda\xb7\xbf\xb1\x1aY\ -\xf5\xc4#\xcb\x1b\xc1\xe2q\xfd*\x0a\x91\x07P\x9fb\ -\x9d\xc3S\xba\xf8\xce*\xd6\xbf\xb1\xaa\xad\xef\xadz\xfb\ -{\xab\xda\xfc\x06\x10\xbc\xb5B\xb5zQ\x06\x84\xe5\xa5\ -\x08\x00\x10\xb6\xd8|brn\x1d\x82\xc5\xe7b\xddx\ -\xa7\xcb\xf0\x93Kye\xf6Y\x1e\xca\xcf+F\xf4\x0a\ -\x18\x08Y\x97\x00\xc8\xe5\x02\xc8,^\xc3c\xf7\xda\xcc\ -\xaa\x0d\xac\x10b\xad\xe9\xe3\xd6]U\x10c\xa6\x1dC\ -I\xda4\xc2\xf5\xd4>.\xa5U\xedo\x08\xbb\xf0.\ -\x9d2\x1a\x06\xb4Q\xf5!\x9ay\xce\xeb3R\xcd\xc7\ -\x16\x19\xbbOv\x02\x7fqU\xc2\x00A \xe8\xd4v\ -\xb5U<\x01 \xc0K\xeb\x94\x96\x18\x1dh\xa0\xe3S\ -\xd3Z=\x05j\x81\xc7k'J*\xe8\xbaN\x11\x9f\ -a\x91\x02\xc3\xc5\x86JmLt\x00\xc0\x8au\x18t\ -:\xb9\xa7+-\x97\xebo&,`\x19\xb2\x0eu\xe7\ -\xcel\xbc\x10~\xe6A\xfc\xc4'\x1fq(]\xff\x0f\ -QQ\x8bV\xe5\xaa\x0e\x04\x00@\xd7U\x9f}\xed{\ -s\x84E[\xb9\xcaa\xb2e\x10B\xb7\xe9\x13 \xb8\ -\xadbJ\x15\xc9\x8f\x89\x85\xc9\x95\x9d|W\x8f\x05Z\ -\xd5\x81t\xd9\xaa\x16\xae[\xcf\xd1\x1b\x9b\xba\xff\xb3-\ -\xbf\xfcO\xb6\xf9\xee\xdfl\x0bY{\xf5/\xb6\xf0\xc4\ -\x03\xc1\xe0\xf5?Z\xfb\xce\xf7V\xb7\xfc\xc1\xcag^\ -X\xd1\xc4C,\x1b\xb7\x8f\xe4M>\xb4\x82\xd9\x17V\ -\xb2\xf4\xb9\x95_\xfdhU\xdb?Z\xf5.\xb2\xf3\xd1\ -*7>w\xd3\xday\xea\x0d\xd8\xb5\x0e\xd0\x89\xa9J\ -\xab\xc4\xd8\x0b\xb0^\x01!\x8f\xf8\x8e\x87\xd2\xb6\xf6\xcb\ -(Z\xcavR(\xe1wE\x00E\x8d/\xd4\x99\x9c\ -X\x9fX\xa6\xe6\xd0=\xa4\xb1\xfd\x96\xceX\xc8K\xfa\ -[\xe7,\xb3c\xd5\xed\xb1P\x15\x93\x8aB$\x01\x85\ -\x1eD\xb3\xae*V\x8dL\xdc\xb3\xfc\xb9\xe7V\xac\xb5\ -\x86\xb5/\xadd\xf5\x0b+Zz\xc7\xef^\x98\xaa\xab\ -\xd5\xa2.\xa4\xa6\xdb\x9a\xacS}\x81&\xf0:5\xdb\ -\xab)\xfc%\x8bq\xdd/5\x1f\xde\xef\x1dk\xaa\xc9\ -\x1eW\x97\x8e\xabH\xc5\x92\xbdmH\xda\x90\x88\x97\x10\ -\xc9@1\xeaJ\xe5\x1a\x16a\xc9N\xb4\x95\x5cn\x1f\ -\xe5\xeb\xbc^\x95\x85\xf9\x897\x01$\xb3\x05i\xf6$\ -\xd0\x041T\x01\x86\x00@\xacW\x9f\x80\x14\xc0\xe5\xfa\ -\xef\xd6\x9cw\xc1\xc2[\x88\xc4x\x1b\x17`\xd3\xb5\x0c\ -\xb0\x03\xc2\x10\x96\xc1@\xab\x97\xaf\xd2\xc3r\x08\x90\xd2\ -\x1dBS2\xe45\xb5\xae\x17\xee1d\xd9=sV\ -1{h\x03\xc7/m\xf9\xe9\xcf\xb6\xf3\xfeov\xfc\ -\xf5\xbf\xd8\xe1\x97\x7f\xb7\xf5W\xffds\x8f\x7f\x03\x18\ -\x7f\xb2\xd1\xdb\x7f\x86\x1f\xfcf\x1d{?[\xe3U\xbc\ -\xc1\xf2{+\x9b\xf7\xe6\xd3\x8bt\xf6\xde\xe2{+]\ -\xf9\xda\xca\xae~o\xe5\x9b?X\xd9\xe6\xb7\xbc\xff`\ -%+/\xadp\xee>dP\x99\x80V\xd9\x96\x1c\x11\ -L\x86Y'\xc0\xd6\xe3\x8aa\xeeE\xb0\xf5\x22b\xb8\ -B\x83\xbc\x03\x96-\xa6\xaf\x8e&jX\xf1\x0f\xf2\xd6\ -\xe7\x9e_\x86\x90\x81\xe7\x0b0\x86\xd9(%\xa7g\xc3\ -\xf2\x06\x0f\xac\x88\xb0\xa4C5K\xa6\x1fX\xf1\xf4#\ -+\x82\x84\xea\x90\xa8\xbc\xf1\xfbp\x16\x9dJ\xaa\xc3\xa3\ -^[\xd9\xea\x07\xab\xe4\xfe\xaa\xf0R\x95\xdb\xdfY\xd9\ -\xc6\xd7V\xb4\xf2\xfe\x13\x08\x94\xc1d\x13\x1eT\xec\x93\ -\xd9{@\xc6\x06\x90H\xdf\xd5\xe9-FK\x8b\x92\x5c\ -\xbdB\x88t\x14Z\x16)\x8e\x90\xa2\xf9~\xafF\xcd\ -[\xf9K\xc3\xa2\xd3\x9b\xd4C\xe7\xbc\x8f\x8e\xdc=\x1e\ -\xc3\xc5|Y\xbe\x0aBu\xaaV\x87\xb2\x00\xf2b\x80\ -\x94\xc9wh.Z\xb5\x81\x22M>\xbeK\xd5+\xa9\ -R8^%\xd9\x91P\xb8\x07a\xc5\x01Lupn\ -\x87\xeb<\xa2-O\xbc\x0a\x0c\x80\xce\xb1W\x97!\x88\ -\xa3\x88\xa8B^k\x19\xc4\xba>>\xd3\xc7\xfd\x0dr\ -\xcdI+\x1e\xdf\xb0\x9e\xbd\xfb\xb6\xf0\xe0\x83m\xbc\xfc\ -\xde\xf6\xde\xfdd[\xaf\x7f\xb0\xb9\x07_\xd9\xf0\xe9\x17\ -\x84\x86\x8f6t\xf6\x8b\x0d\xdc\xfa\xcdz\x00A\xfb\xc1\ -/\xd6\xc4\xc0\xd5`A\xe5\x00\xa1\x84\xb8_\xb2\xf2\x85\ -\x95\xae\x7fk\xa5\x1b\xdfY\xc9\xc6\xb7V\xb4\xf6\xc1\x0a\ -\x96_X\xee\x9c\x8a8U\xc4\xa2\x85\xa3],t\xc3\ -2\xdb\xd7\xf0x\xb0\xecZ\xf2\xfd\xea\x09\x94\xab\xedm\ -J\xb7\xc4gd8\xda\xc8y!c\xa6^\xca:\x80\ -J\x9e\xd3\xa7\x9eCx\xe0l\xc6L\x8aW\xef\xdf\xb2\ -\xc9S\xab\xc6\xcb\xd4\xaf\xbd!{\xf9\xc2\x9a\xb7\xbe\xb6\ -\xa6-\xd5=|c\xf5\xeb_Y\x0d\x0a\xafZA\xb0\ -\xf6\xaa\xf5\xaf\xadz\xf3\xa3\xd5\xec\xfc\xe0\xbcT\x15\xaf\ -\xe5[\x1f\xadd\xfdK+\x5c|ky\x00:g\xe2\ -\xb1\xa9\x862\x9bP\x97\xad\x22\x95\xe1\x1b\x08\x1el\xe4\ -\xba\xc5\xe8(2\x15|\xe4\xcf=\xb2\xfcY\xefT*\ -\xd5\xbe\xab\xc6N\x85\x94Z\xb7\x16\x18$\xaa\xb3\xcbt\ -\x8b%0L\xadY+\x07V\x9e\ -B'\x89\xe7\xe9g\x17W\xdb\ -\xa7\xb9\xcb]\xc8DP\x04* 0\x85\x1c\x05E\xa0\ -\xc4\x04\xde\x03!\x00\xe7%8\x9fB\xaa~\xccn\x05\ -h\xc2x\xdaF\x04\xd49$7\xd1\xdf\x06\xf6\x9d\x12\ -h\xf2\xec\xbe \xe5e\x08\xe0}\x04\xfd\x1d\xb2\x03|\ -\x00q'\x04\xd2\x80\xc6\x0e\xc6\xa4[\x8c\xa9r\xbff\ -\xd1\xb7\x01\xbcr?\xa1\xbe\xcc\x1a\xcb\xe4\x9c\x8c\x00\x9a\ -y9\xa0o\xa1?\x06\x197\x87\x1d\xe8\xea\xce!\x1b\ -n\x12\xed7\x12<\x8b!\xf4\x880\xcb\x04\xf4c\xc8\ -$\x10\x12\xde+<\x9e\x9c+^$$\x91\x18\x02G\ -\xacg\x81\x1e;\xd0C<\x02j\xd0\xc3\x90\xab\xc03\ -\x11\xf1\xb2*\x22\x1c\x91\x9a>;&\xf0m\xd2\x89X\ -\x14X\xf3\xa3\xee\xb3\xecdB\x8e\xd9\xb9\xd1\xd6\xc9@\ ->\xfa\xb5\xf3\xf5\x84\x90\xcf\x8a\xc0\x84\xdb\x87\x8e\x0f\x16\ -\xde\xdbiw3\x00\xbd\x0aI\xd9\xbe3\xc3\xe1,\xfd\ -\x8e\xa3\x96G\xbb,\xd8#y\x03d\xcc\x04\xf6LI\ -5\x15\xf4\x18\xcd\xc8!\x81&\x13x\xb2\xb0G\xa8\x98\ -\xd7\x97J\xea\x93v5\xda\xdbu\xf0f\x14\x07\x92\xfc\ -\xb1y\xcd\xadt\xa3\xf6\xa1\xb7\xd0\x1e\x08\xf6HR9\ -\x17\x9d.Q\x88JMX\xe3E\x11\xc8\xf9\x91\x84\xf7\ -6\x92\x90d\xdf\x972\x84\xd10\xd7\xf9\x22\x02'^\ -\xd7?\xed\xed\x0f\xbc\xcbE!\xdb\xbc\xce\x86SF_\ -w\x8ev\x01Hy\xe1\x9cN\xb5.\xcf\xf0\x0d\xfa:\ -G\x83\xaa\xe2\x16:\x1d\xdb\x0d\xe0\x5c\x0f;d\x81\xc7\ -k\xf3\xee\x13\xb6\xb6_\x18x\x11B\xac\xd8\xfc.\xa5\ -\x1f`t\x8aZ\x1d\xe5v\x8c\xd0M\xa6#$\x9db\ -1&\xcfu\xde\xb2q\x9f\x90\x9d\x86\xbe\xbd\xe8<\xc7\ -\xfb2\xf7\x0f\xe6\x1c\xe5c!G\x1c\xdd\x88\x0e\xe8\x1a\ -\x85\x8f\xea.\xef\x842G\xf0z\x99e\x88\xdb\xbc\x96\ -\xabn\xecx\xf1_\xa0JA\x0d\x0a\x0d\x0a Icons / Noti\ -fication / Error\ - - black\ -\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\x0d\ -\x0a\ -\x00\x00\x01u\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01\xd0\xa2K@\xfc\x1f\ -\x84\x81\xfc\xff06\x10\xbf\x02\xf2\xe7\x00i9Z\xf8\ -\xd8\x02\x88\x9f\xa3Y\x08r\xc0_4>\x8c\xddHM\ -_G\x00\xf1?\xa8\xe1 \xfa/\x0c\xe3\xe0\x83\xd5\x02\ -\xf1\x1a \x9f\x91R\xcbA>\xff\x87\xc7\xc7\x84\xf83\ -(u\xc03\x12-\xc4\x16%n\xe4\xc6{>\x11q\ -N\x8c\x03\xae\x93\xeb\xfb\x8b0C\x09\xc49!>\xc8\ -\x0c}r\xf29H\xe3?\x0aC\x00\xc6\xaf!\xd5\x01\ -\x0e\x14Z\x88\xce_C\xaa\x03B\xa8\xec\x80\x03\xa4\xc6\ -\xbf\x0f\x09\xf9\x9e\x984\xb0\x95\xd4\x10P\xa7r\x08L\ -\x22\xd5\x01l\xd0\xb2\xfd?\x95\x1c\x10@N90\x9b\ -\x0a\x0e\x00\xe5\xa2\x9f@\xccDN9 \x0d3\x84\x82\ -4\x00\xd2\xdfBIQ\x5cOa\x08\xdc\x01\xd2\xcc\x94\ -V\xc5k\xc8t\xc0\x1b _\x99\x1am\x01F \x9e\ -\x81\xa5\x01\x82+\xceAl\x90\xcf\x95\xa9\xdd\x1ar\x07\ -\x1az\x13\x9a\xaf\xe1\x8eA\xe3\xff\x04\xc59\x10\xb3\xd0\ -\xb2=\xa8\x0f\xc4\xb5@\xbc\x16h\xd1! \xbd\x1d\x88\ -\xa7\x00q \x90\xcf\xcc0\x0aF\xc1( \x11\x00\x00\ -\x90\xbf\xd0E\xdf\x04S\xa8\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x02\xaa\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x02qIDATx\xda\xedWMHTQ\ -\x14\xd6q,\x0c\x1db\xd0d\xa86\x814!\x11A\ -\x90\x92H\x14\xc4@\xaef\x11\xb5\x10l'\xe4l\xc4\ -\x85\xcb\x1aA\x88@\xc2E0\xad\x1c1h!\xd3\xa6\ -\x7f\x9a\x84\x90hg$$\xb6\xa84]\x88\x039\x8b\ -\x18)g\xf2;\xf0=8\x5c\xdfLo\x86\xb9\xd2b\ -\x1e||s\xcf\xb9\xef\xdes\xbew\xce}o\xea\xea\ -jW\xed*\xe3\xba>0\x14\xbbq3\xf6\x07w\ -\xe9q\x8d\x8fN\x00\x15+\x80\x88E\xbe\x0f\xe0\x97\xe0\ -\xa8\x11\x80\x1f\xf6\xcfF\x9f;\x9c\x01\xb7x\xad\x01\xd8\ -\xafJ{\x82g\xc0>\xbd\xc9)#\xab\x84\x11D\x08\ -\xf8i\xcc\xd9\x06\xcex\xad\x01U?\x82M\xa0IG\ -\x16fF\x1b|\xdb\xc9\xa4Qc\x81n\xd8w\xd4I\ -\x17\xf5\xda\x05\xac\x15\xb9oM6\xe7>M\xfa\xe60\ -#{\x0c\xf4\x02\x05\x8e{\x8cM\xae\xd1>\xec\x92\xa1\ -S\x039\xad\x00~\x1f\x06\xb6\xe8\x93\xb5\xbf\x01\x1b\xc5\ -\x14Hq<\xa0\x14\x09\x19\x1b\x9d.QK\x17E)\ -c\xfe\x0b*s\x8f\xe3\x1f\xa5\x14H)\xdb]\xda\xa4\ -\x00\x0fU\xd8A\x0f\xb8\xc6;\x8e}\x12\xc0?\x15P\ -\xf6I\xda\xbfK\xa1\x96\xd1UG0\xff53\x9f\x07\ -\xfbio\xf0\xac\x80\xf2\xddR5\x91\x04\xce;\xad\xa7\ -\xe6\xc8\xc2\xb2\xe9%9%\xd5\xf7\xc1}\xa0\xde\x98\xe7\ -]\x01\xe5\xef\x90\xd7\xadz\xcfK\xab}\x05/\x81\x97\ -\xc1\xeb\xf2\x1aV\xfeW\xe0\xb3.\xeb\x94\xaf\x80\x91\xe9\ -1`\x10\x90#y\x1e\xf8\x04,\x00r4'\xe4[\ -\x10h/q\xbf\xd4\xc0\xaa\x9b\x02'\x9d\xc8-\x7fU\ -\x1f\xe49\xb1G\x01\xe9\xe1\x1d\xf6\xf0\x09Ko\xd2\x03\ -\xc0C*\xbd\xe06a\x92\xcf\xf0\x17x\x0e\x9c\x06\xa7\ -\xab\xc4o\xc1\x19U#}\xc5\xa2\x1c\x01\x16Y\xa9\xab\ -U\xc6\x0a\xf0\x1e\x88xyV\x8d\x98\xd8Xe\xf6\xff\ -\x97\x7f\xf7v\x01&\xc7\xb3\xa0\x90\xee\xe83\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x02\xae\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a Icons / Noti\ -fication / Warni\ -ng\x0d\x0a \ -\x0d\x0a \ -\x0d\x0a <\ -polygon id=\x22Tria\ -ngle\x22 points=\x2212\ - 2 22 22 2 22\x22><\ -/polygon>\x0d\x0a \ - \x0d\x0a <\ -/g>\x0d\x0a\x0d\x0a\ -\x00\x00\x06\x8c\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a Icons / Icon\ - Grid\x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \x0d\x0a \ - \ -\x0d\x0a \x0d\x0a \ - <\ -use xlink:href=\x22\ -#path-1\x22>\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x01\x12\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\xd9IDATx\xdac`\x18\x05\xa3`\ -\x14\x8c\x82\xa1\x06\x22\x13s\xd9\x818\x15\x887G$\ -\xe4\x5c\x00\xd2\x87\x80\xb8\x1b\x88Uhn9\xd0BG\ -\xa0Eo\x80\xf8?\x08\x03\xf9\xffal(\xbf\x87\x96\ ->w\xc2b\xe1_4>\x88^F\x0b\x9f\xb3\x03\xf1\ -k\x98\xa50\x0c\xe4\xff\xc3\xc2\x07\xa9\x09\xa2\xb6\xefS\ -q\xf8\x18\x17\xff4\xb5\x1d\xb0\x91D\x07\x800\x0f5\ -\x1dp\x9e\x0c\x07(R3\x0d\x1c\x84&\xb0\x7fD\xa4\ -\x81\xbf\xd0t N\xcd\x10\xe8\x221\x04^\x011#\ -5\x1d\xa0\x04\xb5\xe0\x1f\x91\x0e\xe8\xa0E9\xd0Cd\ -9\xf0\x0c\x889hU\x18-\x83\xc6/,4\x90\xe3\ -\x1cl9\x90V\xa1u]\x10\x04\xca\xe7hE1(\ -\xce;\x81|\x0e\x06z\x01P>\x07Z\xa8\x08\xa4\xc5\ -\xa9\x9a\xe0F\xc1(\x18\x05\xa3\x80\xde\x00\x00*\x106\ -\x97\x13c\xdc\xaf\x00\x00\x00\x00IEND\xaeB`\ -\x82\ -\x00\x00\x01\xf5\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01\xbcIDATx\xdac`\x18\x05\xa3\x80\ -D\x10\x91\x90#\x06\xc4\xd7\x80\xf8jdb\xeeU\x10\ -\x0d\xc47\x81\xb8\x84.\x0e\x00Z\xaa\x02\xc4\xffA\x18\ -h\xe9\x7f\x18\x1b\x88\x17\xd1\xcb\x01\xcaH\x0e\xf8\x8b\xe4\ -\x80\x05#\xc3\x01@KU@A\x0f\xb5\xfc\x1f\x88\x86\ -\xf2\x17\x8c\x98(P\xc4\xe1\x80\xf9\xb4\xb4T\x0e\x88u\ -\x81\x16j\x01\xe9(\x1c\x0e\xd8\x0b\xe4k\x00i\x1d(\ -f\xa1V\x9c3\x02\xf1mX\x96\x83\xc5?Z\x1a\xf8\ -\x8b&\x0f\xc2\xce\xd4\x0c\x01\x17\xa8\xe1\xff\x90|\x8c\x1e\ -\x02\xc8\xf2\x1bi\x11\x0d\xe9h\x05\x0f6\x07\x80\xe8\xab\ -\xe4Z\xc0NDtL'\xe0\x80W@Z\x92\x80=\ -L\xd8\x0cV\x06\xe27@\xc9\x07@\xba\x06\x14\xefx\ -\x1c\xb1\x17K9\x00\xa2\xff\x00\xf9\x16\xf8\xea\x10\xa0\xfc\ -J \xfd\x1c\x88\xeb\xd1]\xa5\x87V\xb6o\xc7\xe3\x03\ -\x1e \xbe\x8f%\x04\xa2\xf0\xe8\x11\x02\xe2gH\xe6\xcf\ -CW\xa0\x8b\xc5\xc0\xe9x\x0c\x94\x05\xe2\x1fH\x06\xb6\ -\x11\x08\xf6#h\xe6\xcf%\xc6\x01 ~\x00\x1eC\x9d\ -\xa1q\xbe\x94\x80\xe5yX\xd2\xcc\x5c\xf4\xf8\xd1\x85\xfa\ -\x069_\x83\xb2\xd47 \xadFA\xce1FJ#\ -\xb04\x03r\x08\xd1!\x00\xa2_\x03\xb1\x12\x99\x96\x7f\ -\xc0\x91k\x88v\x00\x8c\xff\x05\x88#\x88\xb4\x98\x0b\x88\ -\xab\x81\xf8/\x9er\x83d\x07\xc0\xf8\x17\x81t\x19\x10\ -\x9b\x03\xb1(\x90\xcf\x0b\xa2\xa1\xb9(\x06T%\x03\xe9\ -7x\xf4\x93\x94\x06\xfebI\x13\xc8e\xfd\x7f<|\ -l\xfa\xc9J\x03\xb4\xe2c8@\x9b\xce\x0e\x98\x8e\xad\ -t{KDeC-~\x18\xb6\xb2:\x84\x848\xa6\ -\x84\xbf\x1e_m\xa7\x04TT\x07\xc4\x13\x81x\x02\x90\ -?\x01D\xc30\x85\xfc. \xdfo\xb4k\x87\x0e\x00\ -\x0bqL\xd4T\x13W`\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x00\xd5\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00jIDAT8Oc\xfc\xff\xff\ -?\x03%\x80\x09Jc\x80\xc522\xffA\x18\xca\xc5\ -\x09\xb0\x1a@\x8cF\x18\x00{\x01\x9f\x86\xd8'O\x18\ -\xa1L\xac\x00\xa7\x17`\x80\x90k\xc0\x06\x10\xb2\x05\x9f\ -!\x04]\x00\x03 C\xb0\x19D0\x0c`\x00\x97+\ -\x09\xba\x00\xa4\x11\x9f\x17Q\x0c \xa4\x18\x1b\xc0\x99\x12\ -a\xde\x22d \xed\x922\xb1`\xc8\x1b\xc0\xc0\x00\x00\ -\x1d[2\xc1\xc0t\xc2\x0d\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x00\xeb\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\xb2IDATx\xdac`\x18\x05\xa3`\ -\x14\x8c\x82Q0\x14Adb\xae:\x10O\x8eH\xc8\ -\xd9\x0f\xa4\xd7\x00q8\xdd,\x07Z\x1a\x0f\xc4\x7f\x81\ -\xf8?\xd0\xe2\xff \x1a\x8a\xb7\x00\xf9\xcc\xb4\xb6\x1c\xe4\ -\xf3\xbf \x8b\xa1\x96\xc3\xd9P~\x1b\xad\x1d0\x19\xcd\ -Bt\x07\xbc\x05\xd2l\xb4t\xc0~\x02\x0e\xf8\x0d\xa4\ -\x15i\x99\xf8VA\xe3\xfb/\xd4\xf2\x7f06\x10\xff\ -\x03\xf2\xbf\x02i\x11Z\x86@\x18\x81\x108H\x8f,\ -\xb8\x19\xc9\xc2\x7fH\x0e\x00\xf9^\x95\x1e\x0e`\x06\xe2\ -6 ~\x0b\xb4\xf0\x0f\xc8b >\x04\xc4\xaat-\ -\x8c\x80\x96\xb3\x81\x12\x1c\x90\x16\x1d-\x9aG\xc1(\x18\ -\x05\xa3`H\x03\x00\xac\xe7\x98*\x92\x10\x95\xa4\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x03\x0b\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x02\xd2IDATx\xda\xed\x97MH\x94Q\ -\x18\x85\xd5i\x0a-\x17\xba0\xcc1!\x88\xc2(\x0b\ -\x92\x5cLFn*\x88Z\x05J(\xd3&*4B\ -\xfbq\xd5\xa2\xc2 \xa4\xb2_Z\xb4\x88\x8aP\x82)\ -\x22\xab\x85\x14Q\x8b\x16\x81\xf4\xb7h!\x16\x95\x05-\ -\x8a\x8a\xd2t\xea\x1c8\x1f\xbc\xdc\xee7)\xe9H\xe0\ -\xc0\xe1r\xee\xf3\xcd\xbd\xef\xf7\xce\xfdy'+k\xea\ -\x83O\xdd\x96\xa6\x1d\xd0\xc1\x10\xb6\x11\xba\x09\x1d\x0e\xe1\ -\xab\xa0\x1b\xd0\xb1\xdaDc\xae\x87/\x86\x92\xd09\xf0\ -\xc2\xb0\x00NC\xbf\xf0@\x9b\xed\x87\xaff\x7f \xf8\ -\xf3\x0e_\x84\xfe\x94\xe1\xb7\x1c>\x1b\xfd?\x0c\x7f\xe2\ -\x0d\x00\xa0\x03\xe2C?\xed[\xc0?b\xbf\x94\xd2 \ -s\x0dOzx\xa5\xe1\x1d\x86\x07A\xac\xf7e\xa0Z\ -\x90\x0f\xd5\xaa\xaf0\xf8\x12t\xd9\xf0f\xf1\x5c\xf8\xef\ -\xe2]\xd0\x90x\xbbx\x04\xfe\xb5x\x0f4 \xde\xe9\ -\x0b`:\xf4N\x0f\x5cT\xdff\x13\x00S\xfdL\xbe\ -G\xbc\xc6\xf0\x95\xd0]\xf9\x97\xe2\xe5\x86\xd7A\x17\xe4\ -?\x86\xad\x83.=\xd0'\x7fI\xfe\x8d\xfcQ\xf9\xcf\ -P\x0etD\x9eY\x88@\xbb\xcd\x84\xb3\xa0\x9d\xc6\xe7\ -C\x9b\x8c/\xf7\xad\x83D\x90fh!\xf4J\xbeS\ -|\xad\xe1\xcb\xb9\xa0\xe4\x1f\x88/3|\x03tG\xbe\ -O\xbc\x18~D\xbc\xd5\x97\x81\x22\x13a\xb7\xf9\xcd\xeb\ -\xc5\xa3\xf0#\x1e\xbeO<\x1b\xfe\xbd\xf8}\xe8\x9b\xf8\ -I\xf3\x92\xbd\xe2\x8f\xc3v\xc3Cg\xdbq\x0b\xe5\x1b\ -\x9et8\x03*3\xfc\x84\xc3\xd9V\x1a\xbe\xc7\xf0\x12\ -_\x00+\x9c\x01\xf6:|\x01\xfa\x07\x0d?\xee\xd9\xf7\ -\x9f\x0c\xbf\xea\xf0(\xfa?\x88\xc7\xc2\xb2\x10\x87\xcep\ -M\x84\xf0\xa5\xd0)h;\xd3\xee\xe1\xf3\x98\x09\xa8\x85\ -\xbb\xcb\xc3K!\x9e\x9a\x05\xff\xfd\xfd\x11,Z\xae\x93\ -\xc8d\x04P\xaaE\xc8\x00\xf22\x1e\x00&\x8fa\xe2\ -a\xee\x14\xdf-\x98\x89\x0c\xc40\xf1\xb020)\x01\ -\x14+\x00\x1e\xc5\xd1L\xa5\xbd\x0c\x93q\xfbm\x85Z\ -\xb5\x06\x86\xa0&\xf6\xc1oC[0\x91o]\xe5\xdc\ -\xef)\xd6\x01\xc6\x0frmLt\xea\x1b\x9c\xa3\xd8\x9e\ -\x9c\xf1L\xfd\xfe\x87<\x01$2\xbd\x08\xaf\x99\xdb\xb3\ -}<\x16X\xceX\x9f\xc7\xc4/\xd0v\xff\xf3\x5c\x18\ -\xe8\xac\xb9>\xbfB\xcfY\xbb\xc17\xa2]\x92f\xa0\ -\xec4\x19\xca\x03\xafA{\x00\xba\x0d\xf5k\xdb\x06Y\ -\x8b\x87\x05\xe0\xde\xe7\xd4\x80J6\x06\xc4A\xe7Cs\ -T\xe5P%\xac\xffY\x09\xa1\xdd\x0f\xdd\x83\xbe\xa4\x19\ -\xef\x8f\x00\xaa\xa0]\xbc\xffY\xfbA\xd7\xa1\xb7\x7f\x19\ -`\xb4\x9e\xe5\xfaS\xd5\x98mh[tn\x14\x8df\ -\xa1\xf1-\x1b\xa0+P\xbf\xa9\xf9l\x9d\xefz\x9e\x0b\ -\xbd,V\xe0\xd7\xa0\x9d1\x9e'\xe1L\x0cZ\x01\xad\ -\xe3\xff\x07\xf8z\xd6\x8c\xacx\xa1\xd5,F\xd0N\x9b\ -\xfa\xb3;\x96\xcfo\xe5\xb5\xdc\x8eP\x05\x84\xb2\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xe0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00uIDAT8O\xd5R\xed\x0e\ -\x80 \x08\xd4\xd6{\x83ON\x9d\x03\xe7,\xd0\xd5\xfa\ -\xd1m|(p\x0a\x9aE$\xbd\xc1\xa6\xf6\x82R\x8a\ -@t\xe9\xe2\x96\x00\x85D\x94u\x19b\x87\x1aOZ\ --\xae\xc0\x0c\x98\xf94R\xfdQ\xa2\x18\xa49OI\ -\xdc!\xf6@K\xeeP\xc12;=\x8aWe\x09c\ -rTh\xd2Z\xb0\xa7\xb3\xeb\xea\xf6\x14\xeeO4\x92\ -\xd9\x93~\xf7\x95W\xf1{\x82\x94\x0e\xd4\x89\xe2k\x0c\ -\xdb\xee*\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xa6\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00mIDATx\xdac`\x18\x05\xa3`\ -\x14\x8c\x82Q0\x0a\x86*\x88L\xcc\xad\x89H\xc89\ -\x07\xa4\xd7\x00\xb1\x14\xbd-\xaf\x05\xe2\xff@\x07\xfc\x07\ -\xd1@\xfc\x98\xde\x0e8\x03u\xc0_\xa8\x03@X\x85\ -n\x0e\x00Z\xbc\x1a\xea\xfb\x7f@\x1a\x84A\x8e\xe1\xa2\ -g\x08H\x82\x82\x1d)\x0aR\x07$!\x02\x1d\xa0\x02\ -\xb4\x9ck4K\x8e\x82Q0\x0aF\xc1(\x18\xd2\x00\ -\x00e^3\xba\x9ez\xe49\x00\x00\x00\x00IEN\ -D\xaeB`\x82\ -\x00\x00\x00\xef\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\xb6IDATx\xdac`\x18\x05H \ -21\x97\x11\x88C\x81\xb8\x18\x88\x0b\xa9\x88\x8b\xa0\xd8\ -\x05\x9f\xe5\xdc@|\x19\x88\xff\xd3\x18o\xc0\xe5\x80i\ -d\x18\xf6\x1b)\xe4\xf0a\x16 \xf6\x01\xe27P}\ -)\xd8\x1cp\x85\x0c\x07\xfc!1\x8aM\xa1\xfaVb\ -\x93\xbcFk\x07@\xed\xf9\x00\xc4\x9b\x06\xd2\x01\xcf\x06\ -\xda\x01\xcfG\x1d0\xea\x80Q\x07\x8c:`\xd4\x01\xa3\ -\x0e\x18u\xc0\xa8\x03\x06\xad\x03\xae\xd3\xa1Q\xca\x8e\xb3\ -i\x0e\x14\xdcK\x07\x07\xac\x83\xea\xeb\xc6&iEf\ -Gc\x11\x10/#\x80W\x01\xf1{\xa8\xfa\xaf@,\ -\x8e\xcb\x85\xd6@|\x08\x88\xef\x92\x80\x1f\x10\x89\xef\x01\ -\xf1\x16 V\x1c\xed\x04#\x03\x00u\xbb\x07\x04\xef\x85\ -8\x87\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xfe\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00\x93IDAT8O\xa5\x93[\x12\ -\xc0\x10\x0cE\xb1\x0d\xb6fs\xb55]G;!\x94\ -4\x8f\x0fg\xa6\xa3&rs\xe3\xe1\xaf\x18\x1fw@\ -\xc8w\xf5\xf8\xbf\x91k\xf5\xf0\xe1T$\x94\x98~\x0e\ -\xb4D*\xdcZ\xd0\x12J\xfa\x0a\x80[Z0\xe0(\ -\xb2\x8asn\x9b\xc0Z\x85Csh:\x18\xd0\xde\x07\ -\xe6\x1e\x0c$\x97\xa6\x03H\xd4Z\xdc\x04\xac\xc5\x1c\xe2\ -M\x1cmi\x82p\xacS\x80;\xe3\x15)\xdeZ\xe0\ -\x82tc!\x0e\xebp:\xe9\xf7@\xa9\xbc\xc2\xad;\ -\x7f\x8d8\xaap\xd6;\xce\xbd\xfa\x8fW\xbc\x9c\xc2\xae\ -\xed\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\x8b\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00RIDATx\xdac`\x18\x05\xa3`\ -\x14\x8c\x82Q0\x0aF\x01\x99 21\xd77\x22!\ -\xe7.\x90\x9e7P\x0e\xb8\x0bt\xc0\x7f \x0d\xc2\xa6\ -tw\x00\xd0\xf29 \xcb\x81\xf4+ \x16\x1c\x90P\ -\x00Zl\x0at\x84\xe0h\x82\x1c\x05\xa3`\x14\x8c\x82\ -Q0\x0a(\x01\x00\x9bf\x16\x9e7\xad\x98\xae\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x02\x02\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01\xc9IDATx\xda\xedW\xbbJ\x03A\ -\x14MLc)XJTD\x91\xd8\xf9\x016V\x82\ -A4I\x13AH\xc4\x80\x8d\x96\x96NZ\xbf\xc4\xca\ -GH\x14T,\xf4\x17\xfc\x89<\xf0E\xea\xac\x9e\x0b\ -we\x18fwgv\xb2\x09B\x16\x0e7\xb3\x99\xdd\ -{\xee\x9c3\x8fM\xa5&\x97\xe3\xb5_=M\x8f+\ -\xf1N\xb9z\xd2F\xec\x03g#M\x8e\xc4\x05\xe0G\ -\x81\x18U\xe5%\xc0\x03(\xe9\x80\xa2\x8f\xc4I \xc1\ -\xae\x92P%@Q$Uy\x81\x13\x84\x11\xf0\xf8w\ -}\xd8\x95\x17Yg\x8f\x92J\xd0\xb5\xbd\xa1z\x02\xd5\ -\x14C4\x8fj\x0bg\xb7[&\xd4y\xa2\x1e\xb7\xf2\ -=\x03\xcd\x07\x86\x9e\x10\xb6\x95\x97\x14=eDy\xc0\ -\xcd\x13\xe4vIsb\xff\x02l\x02e\xb4?\x1cG\ -DDU\xbe\xae<\xd0dR\xb3\xc0\x14\xdaY\xc4\xae\ -\xa3'*a\x04\x84\xf4\xc0\x1d'\xaf\x01\xf4\xa2\x0e\xfe\ -\x9fG$\xb4\x1d\x084\xc3\x08\xe4Y\xaf\x16\xb7\x0f\xa5\ -\xf9O\xb1\x0b,\x02s\xc0{\x0cOP\xff\xf3(\x0f\ -T8\x1ehf\x01\xc5\x1e\x8fB\x96HX\x8e@\xcb\ -\xd4\x88G\xca4R_\xf8M$h$|9\x0c\x08\ -\x5c\x99&\xaf\x19\xbe\xb0Gr .\xf8\xc6\x0c\xe9\x7f\ -mtp\x91\xf6y\xcf@S\xeaG\xc6\x9c\x016\x02\ -\xf6\x0a\xbawo\xb3\x00]\xc6p\xf5\x160\x1d Y\ -\xc3v\x05\x5c\xc1\x83_\x16\x04\x1eX\xb6\xe3\xd8\x9ak\ -<\xb0\x06|\x1a\x10x\xe6\xfey\xcdn\xd9p\xdd\x05\ -s@?`\x9e\xd3\xbdW\xee\xb7-\xad\xf7\xf6\x9aG\ -\x8c\xc4\x12\x91\xd0h\xfe$\x9d\x8a\xd5u\xe2f\xd8'\ -\xa1\x9c/\x07'xD\xcc\x00\xcb\x12\xa1?\xcd\xd1N\ -'q\x16$O\xbcq\x82\x8ct\xffB\x22p;\x96\ -\x8f\x13\xda\x1d\x81\xd5\xc9\xf7\xe1\xbf\xbe~\x01}\x06\x5c\ -\x02\xc1U\xc6\xe7\x00\x00\x00\x00IEND\xaeB`\ -\x82\ -\x00\x00\x00\xd0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00eIDAT8O\xd5\x91Q\x0e\ -\xc0 \x08Cq\xd9\xbd\x99'g\xe9\x06\x06q&\xea\ -\xcf\xb6\xf7SBLmC\x12\x11\x029\xe7{\xe8\xc0\ -\xcc\x09o\xa0\xba\xba\xd8T\x87\x89\x1fM\x1b\x00o2\ -UA\xc7\x8aa\x83\x88\x19.U\xf0\xec\xaa\x85^T\ -#&}\xbfBc\x00gs\xe7\xa3\xd6'~p\x05\ -$\xf3\xbb\xef]\xa1$X\x83\xe8\x04\x88\xd4H\x07\xd8\ -\xd9\x12\x13\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01/\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00\xc4IDAT8O\xa5\x92\xd1\x0d\ -\xc3 \x0cD\x01E\xcd\x10\xcd\x0e\xedB\x99.\x0b\xa5\ -;\xa4CD\x8d\x94\xf6\x5c\x83\x8ck\xc3G\x9fD\x04\ -\x0e\x1cg\x9b\xf8Z/g\xf8\x834\xdc\xf7\xc8\xf3\x8a\ -\xe1\xb6G\x0c^\xba\xa4c\x1d\x7f\x1c@t\x99&\xd3\ -\x99\x16N\xf8\xe4`\x1e\xcb\xd59\xfc\x11>\x1e\xe3\x89\ -\xc1\xa1@5\xa0C\xce\x8d\xf3s\x8b\x96\xcb\x0c9\x80\ -\xe2\xbcmf\xbep\xe3\xd5\x09\x90@\x0f\x12\xe1\xf48\ -T\xe8\xa7\xc0\xced\xde\x92\xca\x016\xcbT0\xd7E\ -\xd3\x14\x01\xb9\x19\x85\xe3p\x17\xf7%\xe6|[\xb7\xa3\ -\xb8\xc5\x81\xae\xb4\xb6nu\x02\xed%\x01z \xaa\xd7\ -\xba\xe2\xf8o\x89\x90@\xeb\xa1H\xac}U\x17$\xad\ -\xdc%\xae\x80\xc4\xb2\xfe%\x847o\x1ay\x8cB\x12\ -\xd5\x15\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xe6\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01\xadIDATx\xda\xedW\xcdJ\xc3@\ -\x10\xeeK\x88 ^D\x11\x11\xd1\xda\x1f\x22^l\xd2\ -J\x9e\xa1\xde\x0az\xb3\x82\x17\x05\x1f@(\xf8\xb0\x05\ -\x1blS\xd38\x1f\xec\xc2\x12v6\xbb\x9b\x04`\xb8]\x8e\xe6\xb0\xd8\xa2\x0cO\xb8\xcf\x02\x12\ -\xde\x97\xf4\xab\xc9y\xcaq;\xc8\x0a\x8c\xc9\xd4\x04\x1c\ -9\xb1u\xe0\xd4\xc0\xfd\xa1E\xcdp\xb3\xe3\xc6%\xff\ -\xcfJNe\xce#\xdb\x01&\xe6\xbf\xaa\xbf\xf0\xa9\x83\ -'\x91\xd3\xad\xeb<'\xf9+DB\xe8/\xaat\xc2\ -\x19]p\xe0\xc9\x1f\xf8eu\xd1\xfe\xb7h\xd7\xbf_\ -\x7f\xb3\xb1^\xeamg8\x00\x00\x00\x00\x00IEN\ -D\xaeB`\x82\ -\x00\x00\x00\xd0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00eIDAT8O\xd5\x91Q\x0e\ -\xc0 \x08Cq\xd9\xbd\x99'g\xe9\x06\x06q&\xea\ -\xcf\xb6\xf7SBLmC\x12\x11\x029\xe7{\xe8\xc0\ -\xcc\x09o\xa0\xba\xba\xd8T\x87\x89\x1fM\x1b\x00o2\ -UA\xc7\x8aa\x83\x88\x19.U\xf0\xec\xaa\x85^T\ -#&}\xbfBc\x00gs\xe7\xa3\xd6'~p\x05\ -$\xf3\xbb\xef]\xa1$X\x83\xe8\x04\x88\xd4H\x07\xd8\ -\xd9\x12\x13\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\x05\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00\x9aIDAT8O\xa5Sm\x0a\ -\x80 \x0c\x9d\x12\x05]\xa6\xdf\x9d\xa6\xb3u\x9a\xfe\xd6\ -e\x82(\xb0&j*\xfb\x08z0\xd6\xb4\xbd\xf7&\ -j\x9cs\xf0\x07\xf6\xda:\x92a\x99z\x87\x11J\x16\ -\xb6\x19\x0e\x13\xbe\x13\xa4F\x14\xccE\xfd\x08R\xc38\ -\xefI\x00\x1bkA\x1b2\x8b\x9c\x9cr\xeb\x09r\x15\ -\x0a\x92C\xd5A\x04\x92PD\xea\x19Dp.U\x07\ -\xd8(\x8dX\x10h?S`ob\x1cK\x22\xf4\xf7\ -\x01\x090\xce\xb5}\xd2[\xd7\xc1\xed\xb3\x9b_\xd7\x8a\ -\x22\x0f\xcdQ\x8c\xff\xaf1d\x11\xdc\x8b\x05\x00\xb8\x01\ -\xef\x94\xd6@\xd4\x8c1\xa7\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x01\x88\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01OIDATx\xdac`\x18\x05t\x00\ -\xd1I\xb9<\x03iy\x03\x10\x7f\x04b\xc9\x81\xb0<\ -\x0c\x88\xffC\xf1m f\xa7\xa7\xe5\xe6@\xfc\x17\xc9\ -\x01 \xbc\x9b^\x96K\x03\xf1k4\xcba\xb8\x9f\xd6\ -\x963\x02\xf1\x1d\x1c\x96\xc3p<\xad\x1d\xe1\x01\xc4\xbe\ -@\xec\x0e\xc4\xb7\xa0\x966\x01\xb1\x17\x10\xfb\x03\xb1\x12\ -=\xd3\xc2\x09\xa8\x03<\x07*\x1b\x9e\x84:\xc0\x87X\ -\x0d\xea@\xcc\x0f\xc5\x1aP>>,\x0f\xc4,@,\ -F\xb1\x03\x80\x8av@\x15\x17B\xf1\x7f\x22\xf0U \ -V\x80\xb2\xb7\x90\xed\x00\xa0\x02\x0e \xfe\x0aU\x9c\x0b\ -\xc5\xc48\xe0\x1c4\x14`|\xb5\x81v\x80\xfa\xa8\x03\ -\xd0\xcc=\x0b\x15\xf7\x1d(\x07\x14\x03\xf1Jtq\xba\ -9\x80\x94\x02c\xd09\xa0\x80H\x07\x5c\xa6\x85\x03\xf2\ -\x80X\x18\x88\x83\x818\x10\x0f\x0e\x82\xd6\xfb\x92\xd4v\ -\xc0cP\xe3\x01\x88w\x11\x89OQ\xdb\x01\xc4\xe0\xdf\ -@\xfc\x0b\x88\xff\xa0\x89S\xc5\x01_\x09\xb5d\xa1\xd1\ -S\x01\xc4\x86Hu\x08\xd5\x1c\xf0\x05\x88E\x08\xa8?\ -\x04U\xdbF+\x07\x08\x10P\xbf\x1e\xaa\x0e\x14\x0a\xdb\ -\xa9\xed\x00P\xfc\xd6\x03q\x11\x01\x5c\x0c\xcd\xb2wp\ -\xd5\x86\xa4:\xa2\x05\xea\xabo\xd0\x04\xf6\x9b\x00\x86\xa9\ -\xf9\x0eu\xfcvj4\xa1\xd8\xa1\xa1A2\x1e\xed\x84\ -\x92\x03\x00\xf9}\xdcv\x87\xa5\xe0^\xe3\x07\xa0\xd1\xc6\x9f\xc8\x81\xcf\xc5T\ -\x81;\xb0\xdb^0\x12\x9ac\x5c\x0f%\xa0N\xf1\x07\ -\x9a\xf3\xaa\xbd`\x18\xbf\xca\xb8\x06\x1a\x0c>+n\x93\ -\x03o\x8a;\xa1\xa1\x7f;\x80?\xe4@\xb7c\xb0\xdc\ -\xc6\xae\x07\xcf6\x1e\x07^\x02;PL\xa7\x16\xc3\x96\ -\xd8\x87\xcc\x04\xdfd\x9c\x04/\x83\xfa\x8asq\xcdg\ -\x14\xc5)`\xce\xe7\xe0\x0fW\xd8\xd85t\xc2\x98!\ -\x9d\xcf\x87X\xce\xe7\xc2^nNN\x05O3\x1e\x0b\ -\xbe\xd9\xd6DB\x5c\x10;\xf0\xac\x85\xfc\x12h\x96q\ -\xad\x1c<#~[s^\x123\xccC\xa0[-\x05\ -\x8b\xa0A\xe0\xd3\xe2\xbdr\xe05\xf1o\xd0\xc5\xee\xc0\ -A{a\x09Tg\xbc\x81\xf94\xee\xd0\x9c\xc3\xf6\xc2\ -\x22\xa8\xc9x%4\xc6\xf8\xb0\x1c\xf8\xd2\x16\xe1X_\ -\x03\xdcR/b\xb0A\xdc\x07\xda\x04\xde\x0e\x9b\xa7\xb1\ -%\xe0\x97aS\xe2\x09\x5c\xbc\xb0\xf5\xe2~\xe0-\xb0\ -\xdbx-'\x97\xe3\x9as&\x8a+q\xbd\x07\xaa\xf9\ -\xa7Z\x90\x888\x0b7\xf6\xf61pn\xc4\x89\x88{\ -b^v\xf4\x9c~\xff\xc5a\xb0I!\xee\xe0\x82\x81\ -J\xa1?\x15\xc2i\xd1\xbe\xdf$^-\xfeZk\xa4\ -\x1a\xdc\xa9\xf0\xa6\xe8\x08\xf8S\xf1:9\xb8>\xd4\x05\ -(\xc7\x1d\xf8\xc2r\x5c\x0d5\x1a?\x05\x0d7>\xa9\ -9G-\xc7\xe5\xd0\xc3\xc6\x5c7E\xc6\xed\x8a\xe87\ -\xb6\x06\x92\x1e:\x96\xd9S\x18\xdc\x0f\x9b\x09]\x0a\xf1\ -\xcb\xbe\x87-\xd5=\xcf\x83\x7f\x86\xbdG\xbc\x14\xfc\x13\ -,\x0bR\x0f\xd5\x09:\xf5-T\xc81\xed\x94_B\ -\xce\xc1w\x89_\xe0{2\xba\xcd\x0f\x9e]\x0b}\x05\ -\xafv\x88Y\xfb\xdb\xc0\x1f\xb2\x00il\x03\xf8\x08\xf7\ -\xbbU\xbd4\xec\xd3\xe2a\xe0\xfd\xb0\xef1e\x8aR\ -\x0b\xa3\xc2\xba\x22\x9e-n\x89\x1d\xf8\xccr\x5c\xc9\x83\ -\xc5x\xa3\x8aS\xe0\x13\x9a\x93\xb6\x1cs\xd1\xae2^\ -\xc7\x0aiLG\x99\xda\xa3\xb6\x06\x0a}\x0d<\xa1\x9b\ -\x99\x9f\x81\xd0\xd5a2\xec<(K;\x84\xdc\xaa9\ -[\xc5'\xa0\xfe\xd0\x8c\xe0$4Su\xe1\x07\xf16\ -9\xbdK\xdc\x01\x0d\x88\xa3P\x1c\x0e\x1a\xf1\x08\xf0\x18\ -c\x1eXe\xd1\xbe/\x09\xfd\x82\xf82\xaf\xf3r\xa2\ -\xb0\xdc)\x8f\ -\xc3\xce\x15\xf7\x047\xaa\x17\xe8%\x07nT\x0aG\x8b\ -\x0b\xc47\xc4\x0e\xb4Y\x8e\xd9\x5c,6^\x05]d\ -\x9c\xd6\x9c\x03\x96c\x9ezu\xc6\x0d\xd0(\xe3\x83r\ -\xe0#[\x03\xa3<\x94\xaf[\xcey\xec.4nV\ -\x8e\x03\x87\x83\xe5-\xcb9_v\xa7\xf1\xdd\xd0p\xe3\ -w\xe5\xf4\xfbbj\x84G\x80_\xd8\xc0\xf3\xdc\xc6\x16\ -\xe8\xa1=\xc4U\xe0\xfb\xb9\xdd\xc2VU\xc8'\xd9\x87\ -\xb0\x07\x5cj|\x15\xb8\x99\xf7\x8a\x87\x88Sq\x0a\x98\ -\xf3I\xb8a\xa4\x8d\x95\x80\xab\x8c\x07\xab\xe1\xc8\xb1\xc3\ -j2\xb7\xa8\xbd\x90'd\x85\xf1P\xf0\x14\xae\x0fq\ -6\xae\xa7\x9e\xd7\x8e\xe9aaK\x9dU\x11\xba\xcer\ -\xce\xe6\x82\x13O\x8a_\xd1\x9c\x9d\xe2_\xd9|\xb0\xd8\ -X\xce\xd99q;\xff(n\xb5r~\xee<\x81\xf2\ -|\x0d\x1c\xb2\x1cO\x84V\x18\xb7\xf0K\x8c\x8fkN\ -\xdar\x5c\xaa\x1d\x13x-4\xde8\xad\xb3\xa1\xdd\xd6\ -\xc0x\x8f@\x15[-\xf6\xf5\xa17\xa0\xd7\xe0\xbdl\ -\xb74\xc65r\x00v\xba8\x05f;\xbfF<\x80\ -\x87\x0c\xec\x1e\xae)9\xf9 w\x0b4Yc\xdfy\ -\x8e\xb2Y\xb4\x1c\xa7\xb4\xf7\x03o\xe6\xee0>\xa59\ -\xc7,\xc7\x15\xd0\x1a\xe3G\xa0\xa4q\xbb\xa2\xf3\x9d\xad\ -\x81\xa4G\x80\xfb\xfd4\x06?\xa6gQ\x04RQ\x04\ -V\xffK\x04\x8a-\x02\x15Q\x04\x1a\xe5t\x93x_\ -\x9c*>0\xcf\xbb\x14\x9e\x01\xa1\xbb\xb5H\xe5G<\ -(\x14*\xfb\xc7#a\x9c\x19\x8a\x90=7?\xa3;\ -\xfd\xfe\x02\x18\xfc\x86\x85\xa5`T\xfb\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x00\xfc\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00\x91IDAT8O\xa5S\x81\x0d\ -\x80 \x0c\x03b\xf4\x1c\xff\xffB\xcf1\x9a\xa0%T\ -q\xbaa\xa4I\x1dts\x14P\x1fct-\x08\xdb\ -<\xbcv\x80\xae\xe5n\x80\x03\xc9u\xea\x8fp\xc5\x92\ -\xd0J=mA\xae\xd4\x8d\x8bG\x84\xce1 \xe7\x09\ -\xec\xca\x8e\x92V\x0e<\x07\x7f\x9b\x84l\xc4\x04l\xab\ -\x87\x8a.\xb5\xd5\xad|z\xb0@\x16[/\x92\xe7\x16\ -x\xc2\xb4\x9b\xe5*\xd4/\x91M\x1e\xd7V \xd5\xd0\ -J\xcd\xae\x96W\x93_\xb5\xdb\xa4d\xcd\x11\xd9\xfe7\ -\xe6hB\xbf\x15\xe7v\xf1\xcd\xb3\xd1w\xeb$X\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x02\x14\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x01\xdbIDATx\xda\xed\x97\xbfKBQ\ -\x14\xc7E\xa1!\x10,tk\x08\xda\x02\x1bj\x8eR\ -hj\xd1!\xe8\xd7\x90\x8deCS\xd1\xd2\xd8\xd2\x16\ -iC\xb4e\xf8'\xb4i:YTCC\x8bA\x16\ -M\x85IF\x93\xda\xf7\xbc\x8er\xb9\xdcgO\xbb*\ -\xc1{\xf0\xe1\xf0\xe5\x1d\xef\xfdz\xcey\xf7\xa9\xc3a\ -_\x1d\xbe\x96V7\x92\xe0\x0e\x0cu}\xf3\xc5\x955\ -\x176~\x0650\xd6}\x03\x91\xa8\x0b&\x0a\xa0\x06\ -\xfc\xbd\xaa@\x81+`\x1b\xf0\xdb3\xd0\xabs\xe0\x91\ -\x0d\x8cZq\xbc\x8f\xc4\x0b\xe0\x01G\xd0i\xc4T\x1d\ -\xe8\x94\xa43\x88\x9b`\x02\x9c@\x0f#\xd2\xb7^\x06\ -\x0b\xd0\x14_\xd9\xc0\x16\xf4<\xdf\x1bQm>\x83\x9e\ -\xd5\xb8_>p%\xe8\x1f\xd4\x9a\x8c\x06YS\xbf=\ -\xa0,\xdc\xaf\x82\x8a\xf4\xf9YU\xa9Bt\x93\xddz\ -AN\xd0\x06\xb4\x90\xa4)\xc6@\x80\xf5;b?\x18\ -\x07\xb4qU\x91\xbfk\xd6+\x1d\x06\x8a\x88n^o\ -N\xf1\xf9D\xb3a\xd1j\x80\xdb\xba#\xe4g\xa1\x9d\ -\xcd\x060$\xf4\xc8\x0br\xac+\x0d\x22\xd1\xaa\xa4\xe9\ -~\x0c\x04\xb8\xc7ED\xb7\xb4\xee)x\x02\x03\xbf=\ -.\xda+\xc0\xeb:\xe9\xa9\xb2\xf2\xbcv\xc4@+\x07\ -\x86l\xe0Ra@5\xd5q-\x06\xa4\x19\x18\x04\xe7\ -\xd0\x1f\x88\xa5\x06\x91hI\xd2\x9f\x88{`\xdal\x06\ -\xda\xad\xc0\x14\xa0\xc3\xc8\xcb\xd500\xd1>\xb0\xae\xbb\ -\x05b\x89[\xd1\xda\x0c\xbc\x80\x03\xe88\xf7\xd8@\xd0\ -1I\x97u\xcf@\xdaB\xfe-\xf2\xef\x11'A^\ -\xf7\x0cd,\xe4\xd7[\x10\x06y\x1d-\x08\x0b\x06\xd2\ -\x16\xf2\x0f\x91\x7fL\xefy\xf0 \xbc\x8c\xda6\x10\x14\ -\x0c|\x81\x1b*3b\x03I\xd3A\x95C\xbc\xa67\ -\x1f\x1bxC\xec\xfb\xcbo\xb8m,r\xc6$\xa1\x93\ -F\xacc\xae)?\x01\x1d\xb0\xff\x0b\xfe\xbb\xeb\x1b\xc9\ -\xfb\xd7\x13\xad&L\xa9\x00\x00\x00\x00IEND\xae\ -B`\x82\ -\x00\x00\x00\xd0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00eIDAT8O\xdd\x93\xd1\x0a\ -\x800\x08E]?.~\xb9atc\xc55\xad\x97\ -\xa0\xf32\x86\xf3p\x057\xdc]\x18f\xc6\x0b;\xaa\ -:\xe2<\x04s\x03\x8aA&\xc2\x9be\xbb]\x88&\ -4\xce2\x06\x15\x80\x8e\xe4V\x10d#\x80RP\xf1\ -Z\x80d\xdf%\x00\x7f\x12T\x1b\x97qJ\x10\x92\xa7\ -\x22:BG\x84z\xfa\x9d{\x88\xac\x1d\xf5-\x8f\xc3\ -r\xe1\x95\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x04M\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x04\x14IDATx\xda\xcdW}L\xceQ\ -\x14~U$\x94\xbc\xd2\x87,\x9f\xf3\xe6\xcd|d-\ -LS\x93lY6\x9f+[MM\x85B\xc3l6\ -b\xfc!B\xd6\x1f\xac\x86\x0cM\x96\xcfe\xb3\xd9d\ -\xf3\xfdG#\xf9\x1c\xcd\xb0\xcc\x98\xaf\xc9V!y\xce\ -\x9c\xcb\xd3\xf5\xf2\xf7\xdb\xf6\xec\xbe\xe7\xf9\x9ds~\xe7\ -w\xefs\xef=9\x1c\xde\xf0\x97\x91\xbd2\x1a8\x9e\ -\xbe\xa4\xb0\x88\xb8`\xd8\x071\x96\x00=\x85\x83\xed\x87\ -\xdf\xdb\x81*\xc0I\xbe\x85@\x0d\x9e\xbb\x89\x9b\x0b\xfb\ -$\xc6\x14\xc3\xc1\x8e\x85}\x0a\xc8\xb1\x0b\xb8\x05t\xc1\ -\xa1\x0b\xe3\x04\xe5\xf6\xa9-\xc8\xd3\x049j\x0b*\xd4\ -o\x9c\xe1\xf0\xfc\x8er}\x80o\x1a\xdfI\x05<\xa2\ -\xf8\x91\x5c@\x1d\x150B\xb9b*`\x9e&\x98C\ -\x09\xb6\xa9\xdf0*\xe0\x82r>\xc0'\x8d\x7fC\x05\ -\x5cU\xdfN \xdcA\x0fz\x03y \xe3\xac\x99\xc9\ -\x02\x9f\xca\x1c\xecY@\x96\xc5\xc5\x02\xcb\xe0\x1f@\xdc\ -P\xd8\x05\x18#(_ l\xe1\xc6:\xbc\xea\x0f\x95\ -\x0d\x14q\xa1\xb24\xe2z\xc0\xde\x841\xdf\xf2]\x0a\ -\x08\xefK\xdcl\x8d\x0f!Nfe\x17F7\xcdJ\ -\x04\xecR`\x86]\xc0\x15\xd2\x80[\xb92\xd2@\xa6\ -&\xc8 \x0d\x94\xd3\x0e2\x1a\xb8\xa9\x5c/\xa0]\xe3\ -\xdb\xa8\x80\xbb\x14\x1f\xc5kXo^f\xb6\x12\xc6R\ -S\x14\x90\xa9\x893\xd4\x16\x94\xa9_\xb4\xe1\xf0\xfc\x9a\ -r\xfe\xc0\x17\x8do\xa5\x0f\xbdM\xf1Q<\x0325\ -;@.$N\x92l\xd6=\xde\x83\xf8\x02`\x0b\x0b\ -Nv\x09\xb0\x13\xfe\x83\x89\x9b\x02{\x0f\xc6\xf1\x960\ -\x85K\xf5:\x11\xf6\x05\xb2Qa\x9c\xb5\xbd\xd2\xf9$\ -S\xdf\x99@\xba\xc5\xc9\x09\x97\x03\xff~\xc4\x0d\xd7\xad\ -\x1dI\xf9\xfa\xc3\xce\x05b\x1c\xd6\x8bN\x93\x06\x86*\ -\xb7\x814\x90f\xd4NkX\xac~Q\xa4\x81:\xe5\ -|\x81\xb7\x1a\xdfBE\xd5\xabo\x1b\x10\xc6_\xd0@\ -\xbb`\x92r\x15\xb4\x0b\x96k\xe2\x5cR\xf1!\xf5\x1b\ -O\xbb\xa0\x89\x8e\xe2\x1f&\x9e>\xf4\x09\xc5\x8f\xb2/\ -\xa3Z8\xac#.\x08\xf6\x11\x8c\xbb\x01?\xf3e\x22\ -6\xe0\xa8\x5cV\xe4[\x04\x9c\xc4\xf31\xc4\xcd\x87}\ -\xce\xba\x8c&\xc0\x16.\xd7\xbbD\x88\xca\xe4\xd4\x9b.\ -\xdb\xd1\x12W\x1f\xd8\xc9|b\x9a\ -\x07\x95\xba\x86\xdf1\x86*\x97O\x1aH\xd4\xa4\xd3h\ -\x0d\x0b\xd5o\x10\xf0U\xe3\xab(g\xb3\xc67QQ\ -g4\xf6#0\x80\x0b\xb8G\x22\x9c\xac\xdca*`\ -\xb5&(\xa0\x02\xaa\xd5/\x8eD\xf8\xd8\xe8\x87\xf2\xb1\ -\x08\x9fQ\xbc\x8b\x0bH\x00\x1a\xe1\xb0\x9f8\xd9^\xd7\ -1\x9e\x95\x844\xad\xd2\xd1\xdc\x90}N\xbe\xe5\xc0]\ -Y\x06\x16&\xec\x07ryQ\x01ri\xdd\x97\x8b\xcb\ -\xe1u\x7f\xd2\x09\xa1\xc2\x00K\x5c\x91rU[~N\ -`\x88\xc5\xf5\xee\xd6b\xfd\xb9\xce]\x1e\xde\xe32\xdb\ -\x9a\xc9\x12]\xb3wf\x7fc\x5c\xa0k\xd8\x0eL\xd4\ -\x82\xe4\xd0i\xd35\x5cL\xeb\xfdZ\xe3K\xb9\xcf\xd4\ -\xf8K\xf4A\x15\x1a\xfbT\x0e+.\xe0!\x89&A\ -\xb9c$\xc2\xb5\x9a`\x15\x89\xa8F\xfd\xa6\x92\x08\x9b\ -MGm\x8bPg\xe4\x05\xc5\xbby\xaa\x17\x01\xefA\ -^\x943A9\xe9v_I\xa7\x0b\x84k\x92P\xfc\ -\x96;]x3+\xb2\xb7\xcf\x03\x1f\xa4_\xa0\x9c{\ -a\x7f\xc6\xb8\x95\xbb)\xd8\xc2UK\x9c\xd7\x890\xd8\ -\xaeJ\xaeWiL,?\x7f\xe9n-\xce\x87\xef\x06\ -\x8awzx\x8f\xd3\xd3\xcbW\x88\xb8\x10\xd0(\xfd\x9c\ -r\x892]\x18[\xcc\xcd\x05{8~\xbf\x04Z\xe5\ -\x98\xa5\x82\x1a\xb4\x07\x5cM9O\xc0\x96\x13\xb2\x92\x0a\ -\x92f\xb6\x03\xb8l\xfe\xdb\xfa}MR?\x90\xa4\x5c\ -\x0d\xf5\x03\xeb5\xe9\x1a\xea\x07j\xcd\xf1L\xfd\xc0s\ -\xf3\xe5\x94\xaf\xcbhE>\x86\xe2c\x1cV\x9f\xd7\xae\ -]\xab?\xcd@\xeb\x7ff \x85\xce\x00\x99\x81\x0e\xd9\ -%\x94\xb3Vg\xe0\x00}\xe8F\xbd7\xba\xcf\x80Y\ -\x1b\x0f\x1a\x08\xfa\x87\x06\x82\xecC\xc7\xd3\xda\xfeu\xeb\ -\xfd\xf2\x0d\xf1*\xf1\xff\x04\x8f\x07^\xb5\xbe\xa8\x80\xde\ -\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xd0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00eIDAT8O\xdd\x93\xd1\x0a\ -\x800\x08E]?.~\xb9atc\xc55\xad\x97\ -\xa0\xf32\x86\xf3p\x057\xdc]\x18f\xc6\x0b;\xaa\ -:\xe2<\x04s\x03\x8aA&\xc2\x9be\xbb]\x88&\ -4\xce2\x06\x15\x80\x8e\xe4V\x10d#\x80RP\xf1\ -Z\x80d\xdf%\x00\x7f\x12T\x1b\x97qJ\x10\x92\xa7\ -\x22:BG\x84z\xfa\x9d{\x88\xac\x1d\xf5-\x8f\xc3\ -r\xe1\x95\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00C\x13\ -\x00\ -\x01\x9f\xd1x\x9c\xed\x1d\x09\x5c\x8c\xdb\xf7\x9bR!\xd4\ -\xc3#)e\x8dl\xf9{\xc8Z\xf6}_\x1f\x22<\ -\xbb\x92\x84,\xd5\x90%d\x97\x9d,E$B\xa4\x92\ -\x22\x22k\x12\xd9[H4\xed{\xd3\xcc|\xff{\xee\ -\xf7MM\xd3LM3\x93&\xba\xbf\xdfy\xbdI\xf3\ -}\xf7\xdes\xee\xd9\xef9\x04\xc1 T\x09\x18\x0cB\ -\x9f\x98\xa7M\x10\x0b\xd0\xff3\x99\xd4\xe7\xb65\x19D\ -\x18\xfa\x9d\xa9)\xfdy\x00A\xa4\xb7`\x10FF\xd4\ -g\x8f\xd6\x04\xd1d>\xfa?}\xfa\xb3&A\xdc\xdb\ -\xc1 45\xa9\xcf\x8bj\x10\xc4\xe2\xe3\x0cb\xfb\xb8\ -1C\xeb\xd6\xd6\xae\x8d\x1e]w\xf8\xb0A\x13\xe0_\ -\x01j\xc2\xabgZ{\xa0wj\x1b\x0e\x1f\xd4\x7f\x92\ -\xed\x87\xe4\xcf\xa3\x975\x88\xfa\xa2\x9a\xf6\xa8\xd5\x18+\ -\xa2\xc1\x86\xe8e\xdeM\xe3w\x5c>1\xe4\xb9\xd9?\ -\xb5/\xd5\xb09p\xd0\xccP\xe5\xcc\xe5'\xdb\xa6]\ -\xf3h9\xcd\xac\xd6\xf8I?\xaf\x98\xaeh|\xd9P\ -\xc9\xac\xf9 \xb7\x05C\x0f\x8c\xaeU\xbf\xc5\x88\xc6\xcf\ -'\xef\x98\xda\xff\xf9\xf1\xd0eg{t\xeb\xb4\xeb\x80\ -\xf1\xf6\xe8\x87\xcf\xb4\xe6-{\xa4\xd75\xd3\xa4k&\ -\xa7\xbb\xe9\xf4\xb4\xf4w\x09G3\xbb%\xe4Y\xfb\xe9\ -8=>~\x8c\x11\x9c\x909\xfcp\xc8\x94\x93\xd7n\ -\xae&\xec\x08\xe7\xd9\x8c\x98\x06\xdc\x97\xdf\xec\xdb\x11\xe4\ -\x1b\x87\xa0\xd3\xe4\xda9\xad\xbf\xec\xdb\xdf\xe9\xc8I\xf4\ -\xf7\x1b\xfcf\xbex\xc3\x08o2\x83\xe58%\xcc\xe4\ -\x95C\xb2r\xfb^.\x8765\xaa\xa9\x1e\xae4\x17\ -\xfd\xdd5}\xb3\xb6\x9e\xb7\xffG\xf4\x9a\xb7\xd4\x8c\xd8\ -\xca8\xa1j\xa5z9)\xf2HC\xe6\x05b\x01c\ -\x94\xd7\x83\xde\x87\xdc\xd5\xffk\x14U\x83i\x7f\x98\xac\ -=\xfda\xea\xfeN\x1a~\x1f\xfe\xc7lG\x98\x18\x07\ -\xae\x8a\xf9A\x84\xa7f5>=\x99\xd3\xe9g\xc6^\ -\x83\x8e\xcay\x8c`e\x83[ut\x9a\x10hns\ -\x88\xd9\x03\x97~ip1\xae\x1d3uJ\x9c\xee\xc4\ -\x08\x95\x8b\x87\xe6)\x99\xea\xdd\x0c\x22\xbc\xe2\xd6\x0c?\ -\xbc\xcdc\xd3|\x22\xba\xff\xd2\xbf\xdd\xdc\xd4'n\xcf\ -`\x9c\x9e\xca\xd1\xf2\xd9\x11\xdd\xc9\xac\xd9Ym\xb7\xd3\ -*\xfdg\xbe\xd1\x1f\xd7\x0b&\x16\xcd\xfc\xdb\xf5Dg\ -\x15\xaf\xa5i\xbbl\xfa\xefh\xd7\x84X\xa7\xe7\xa0\xb3\ -,\xf1@@\x07e\xad\x89\x8b\x9dM/\x12\xe1C\xb3\ -S\x1d\x1d\xd7\x7f\xb3\x1c\xcb\x989i\xce[\xfd\xc3O\ -c\x996\xcd\x99\x1bV\x92k\xbc3\x0e\x14\x9cd\xa4\ -\x05\xf0N66\xf8\xa0\x14\xde8\xed\xd3\xa3\x80\xec\xbc\ -A\xb3\xae\x13^\xdd\xbc\xf5\xd3\xe3\xcevd\xbex7\ -\xbdN\xf0K\xf3x\x83\xd4D\xe5\xb4\x1b\xb3\x1a\x0fz\ -\xf7E)\xfcBN\xca\xc0\x19\xb7F\x0e:\xd6n\x91\ -\xd7\xc6\x83f\x9d\x17\xadW7]\x9eA\xd6\x99b\x7f\ -vnH\xf8te\xbb\xd5w=,\x18\xa7\xc7\xa6^\ -\x0b\x1b;i\x96\x9e\x8f\xa6\xd6-\x96\x8aE-\xf4\xb0\ -\x0f*\x84\xc9\xa6\x9d\xeb\x9cr^\xd7\x8b\x19\x1a\xf8b\ -\xda\x8b\x0c\xe2\x87\xb3\xd7\xe7mo\x13\x0c\xce&~\x8e\ -b\xedv\xefP\x97\xe0\xd6\x9d\xe9\xcd\x1e\xad\xe9\x17\xa9\ -\xe290\xf8:\x81^\xfe\xbf-\xee\xcd\xcd\x87\x13\xde\ -\x19\x0d\x8e>\xb9\xaei\xd4\x97\x98\x96\xbf\xbd\xc3\x9c\xe1\ -5\x8fh\x13\x979\x83\x0e\xfd\xafo\x8dQ\xea\x84\xdd\ -\x87\xb8M\xcf\x1bo~\xbc\xb4\xd3\x91\x9e\x83\x17=\x99\ -`n\x17{\x7f\xcf\xf5\xa8-\x8f'\xde]f\xb3\x9c\ -11G\xb9\xed\xb4/\x1f;\xd9\x0dv\xea\xd3J%\ -&s\xc8\xa9V\xcb\x8c\x89,\xb5\xf5\xf6*kR\x9b\ -\xef\xf7&:\xd6\x98\x90\xcd\x99\xdf\xb5\x99\xaa\xbf\xc6\x14\ -\xfb\x16\xed\xec\x16Y\xb9X|f\x9c6\x09\xe9\xd3\xc1\ -N\xc5\xa9\x8f\xe5\xed}\xdc\x1a\x89\x89J\xde\xd1c\xdd\ -\x0e6L\xd4\xd2X\xe4\xa6n\xa5\x87^\x7fi\xd1\xd0\ -\x93f\x1b\x8f)\x9bF?\xf3\x1e\xcb\xd6m\xf0j=\ -;\xf1\xfd\x22\x9f\xf3\x9d\x98wW\xe5\xa6F\xa4\x1et\ -z\xc2^xs\xc6\xee\xa8\xd7*1+\xb9\x83\x96x\ -^\xdc=E\x97`/\x09\xea\x1a\x91\xba\xdb\xc9\xb0\xd7\ -\xc4\xa7\x87\xe6\xde\xf4!B\xdd\xa3\x9b\xfc5\xd9=\xd1\ -\x7f\xfad\xe2\x87\xa3\xbaYD\xea\x0e\xa7K\x11\x93\x93\ -\x991w\x1d\x99l\xeb\xe8\xe8{\x8bMZ\x18\x0c\xef\ -\xdfTs\x94K\x81\xde%\xdd\x1a\xce\x1b]\x5c\x1f/\ -\xfep\xe6\xcd\xe7\x1d\x86\xb7\x08\xdb\x5c\x03k\x9f\x86\x86\ ->J\x97\x163f\x12\xedM\xf6M\xbc9\xcfu\xf4\ -\xbac\xb9\xf9jw\x0fu\xb0k\x15\xb9y%\xd7k\ -\x15\xc95y\x9bk\xd43\xa8]~#'7\xbb\xba\ -\xfa\xb3RL\x0e\xd5%\xec>\x9e\xe9\x14\xb6\x7f\xe8\x00\ -5\xcd\xa6K<\x0bR_v\x9c\xdf\x84\xf8\xb6\xca\x0c\ -\xd1\xa9z\xfb\xf4\xddj\xee\xbcy\xee\x9d\x82\xa7F\xb4\ -6h1\xf1\xa0\xd7\xd3\xd6\xca\xa6\xb33\x1d\x86\xf8G\ -\x0e\xfaoG\xd7u'y\xa6~\x8d\x82U~\xd6o\ -\xb0\xefb\xa7\x83\xec9~\x84y\xa6\xebc\xb3\x11o\ -\x7fj(\x99F'_\x18\xe9\xef3\xe8\xbfK\x9d\x02\ --\x83.LRg\xaeqh\xb1\x86}\xda\xf2\xf01\ -U\x9dC\x9dZ\x87\xed\xd8z\xfc\xaf:y\x9a\xb5\xba\ -\xc5\x9e\x0b\x0fX?(\xebvN\xe6\x84\xfaa\xban\ -=V\xe6\x9b\x04\x8dJ\xd1?\x196g\x95\x9d\x86'\ -+ b\xf9\xf6\x7fB\x88\xd0\xda\x0ei\xb3\x88\x1f-\ -\xb7\x98E\xb8\xb7Z_\xc7\xa6\xe0\xaf\xba=\xbe\x9e\x9b\ -\xa7\xa6Y\xb7GB{\xfb@rJ\xeb!\x9a\xcf\x02\ -\x9f\xc4\xed\xc9\xee\xdbj\x7f\xefa\xad\xd6\xb8u\xde\x18\ -e\xb3*\xf4\xad\x7f\xed5u\x0c-\x19uF\x1e\xde\ -{\xf9\xafZ\xdd\xe6\x9c\xfe\xb8\xe7\x80\x01\xc7i\xebq\ -\xcd\xba\xa9\xbe5#\x93\xa2L\x98\xc3~\x04\xab\xf5\xef\ -\xe2{\xf0\xe1'\xcf\x0e\xb3\xda\xac1\xf2=8\xb8\xd7\ -\x01\xcf\xcc\xbf=F\x84\xb4\x9d\xd6d\x1a\xa7\xa3qG\ -\xb3^\xff\x8b2_\xaenYOoH\xab\xff\xd8\xc3\ -\xd3\xcek\xfd\xc8\x09j\x5c{\xe5\xc8\x7fG\x91\xb7v\ -\xf9\xb9w\x98Q\xf3\xad\xf1\xae\xda\x0c\xab!\xfe6\xb3\ -\xfe\xfb'h\xfd\xee\xa5k\xbe\xdb\xb4\xd9\xd6\xbe\xc1\xe2\ -\x89\xbc\xe4SV7\xae\xbb\x04\x1d\xbco:\xcd,:\ -\xe4Y\x5c\xa3f\xe4\xf5\x87FF/\x8f\xde7\xf9\xa6\ -l\xea\xdab\xd1\xe1N'?\x0e\x1e0\x1aM*\xbc\ -\x81ehp-\x870\xfb\x1e\xc7\xef\x1d\x1b\xf6\x83\xe8\ -t\xb2^L\xc4O\x02mL\x1f\xde|\xf5\x03\x99\xc7\ -\xef\xf4\xdb\xb58\xd5\xd9+\xbb\xc96\xa7\x86\xb7\x08\xb6\ -\xdb\xc8\xef\xdd\xef15^Yu\x1d\xb3\xba\xe0\xaf\xbe\ -W>\xc7{\xfa5m\xda2M\xa7\xaf\x83\x81\xb6e\ -\xe8s\xab\xaeh\xca\xf7\xbfq\xe0\x95\xdb\xfd\xdc/\xdb\ -\x5c;qI\xe3\xc3\xbd\xb3\xa9*\xc1\x06\x11\xee\xd6\xbd\ -\xe6M\x0aL\xb0]\x19\xa2l\xf1\xcaH\xf9\xf4\x89}\ -\xbc)\xceY\xbes-\xdb\x1d_\xfe\xf7\xb8\xd1\x19\xab\ -\xcc~6\x0aNd7\x8b{\xdd\x94\xa2\x9e\x0e\xedg\ -\xac\x08\xb2\x0bZ\xec=={\xf3\xf1.7n[\xfc\ -\x9b\xff9X\xab\xb3V\xd3%!yY\xaa\x8e\xa7\xd7\ -\xd9\x85.o\xa8\xc14s&'9\x10G\xdcoG\ -[\xae\x9e\xdfy~\xcc\xe6\xec\xab\xb1\x8d\xf6\x853>\ -5\xe9\xfbL\xdfc\x96k\xfa\xf1\x05\xfaA\xb9\xb3\x03\ -l.N\x1a\xf7i\xb9\xde\x8f\x9c\xa8@\xe3\xf3\x7f\xad\ -\xde\xec\xfcQ\xab\xbfU\xca\xeb)\xcec\x97[9\x9f\ -\xbe\xb3:\xf0\xc5\x05\xe7F\xa6\xae6\xdb\xdd\x1a\xe6|\ -T\xf3\xe7\x8e\x18}tp\xc8\xf3\x13\xbcK!\xa6\xbe\ -z{\xfc\xf7\xcc\xb5\xb6W\xff\xfa\xba\xa9\xce\xc8v^\ -\x1a\xc1\x13[\x12\x1f\xdcG\xb6\x8cuxD\x0e\xf5\xaf\ -\xf9w\x17B\xbbkD\xf4\x8e{_\x1a\xa1\xa7\x99\xcf\ -\xed\xde\xd2L\xe7\x8d\x8fr\xea)\xd5\xa4\x03\x9dvm\ -\x9e\xac\xaeV\xeby\xf8\xca;\xc3\xfdk\xeen\x5c'\ -\xcfje\x9ef3\xb3\xbeK\x0a2\x16>\xccf\xdc\ -A+\xea\xbc\x5c\xbe\ -\xd9jaV\xcd!l\x8d\x16\xf5\xaf\x9f\xef\x9c\xb4Y\ -\xc3\xd5\x8bXZC\xb9_\x1f\xffu\x91\x99fJ3\ -\xee\x9aeg\xcdoyF9\xbf\xb5+\xb3\xbb\xf9\xd4\ -w\xf3\x8d<\xb7\xec\x1d\x96\xd2\xd6,l\xddn\xcf\x19\ -\xdd{\xdcF\x13\xeb\xfb\xe8\xf8\x8a\xa5\x89^\x06\x015\ -\x0e9\x04\xb48\xd3f\xe2\xf7\xb7\xedU\xee?\x8b\x9b\ -\xf2YoV\x0b?O\x1b\xc2J?|]K\xae\x17\ -\x22L+^J\xd3\x97[\x98\xf1f\x84\xe7\xdd\xe0!\ -\xfa\x08\x95\xce\x0fI\x8e\xf2\xd8+\xbeQ\xddN\xe7f\ -\xdc\xfc\xd0\x95\x810\xbc\xcf\xc5iV\x03t0\xc3\xb2\ -\xe7\x8d\x88\xaes\xd9|-1\xe95\xd9\xc3\xf1\xda\xbe\ -!^\xc6\xf5L\xb7\x0e\xfb\xc1Lx\xab>\xad\x19\xb1\ -z\xcc\x8d7\x13\x8fN\x9e\xadN\x10\x06\xef\xebz\xef\ -\xeab\xfc\xc3E\xd3\xfb\x1fB\xfb\xfd\xfc[Sv\xf5\ -\xe9\xe5\xb9\xae\xbd\xfe\x93\x8d\xa63\xd6\xb6\xab\x81\x84B\ -o5\xefYw.\x05\xd5\xf7\xfcR;\xed~\xe3\xf1\ -\xddf\xd5b\x8cT\x0e\xbe\xc23\x09\x7fg\xc6\x89_\ -z\xd3\xb5\xd1\xeb[\x91\xdfW2Vg\x0e\xa8y\xfb\ -\xac\xca\xde\x17\xdf\xb4\xfdwz~Q\x22|:\xde\x7f\ -lo\xa9\xc1x\xaa\x14\xfc\x82\xe7p\xce.o\xb3\xbd\ -\xb3\xcb\x93u3\xd9*6J-k|2\xd6]\xfa\ -/a\xecN.\x1f\x17\xf8wp\xc7\xfb\xff\xf9u\xab\ -\xd1!\xc0\x0b\xfd\xc2\x95\xec1k\xbe\xcb\xacU\x17\x06\ -4\xf0\x990ud\xfc\xd2\x85\x87\x16\xddn\xb2f\xc8\ -\x9e#\xab\x17\xed\xac\xdd\xa1`JO\xf4%\xdb\x8b\xb6\ -\xea\xc1\xef<\xc3\x13\x0f=\xb9\xb4\xc2*\x81u\x92S\ -+\xe8f\x8d\xcb\xe3\xc7|\xfd/\xd6z\x9b\xab\xf1\x1b\ -\xc4/B\xef.\x9a8\xf7\xc6\xf4\xae\xd3\xea\x13\xab-\ -\xdd\x16\xbf\xd5\xb1oq1g\x14a\xfe\xbc\xd1\x9c\xd0\ -\xae\x7f\xbf\x0e\xb28jm\x9c\x10\x10lK\xae\xecR\ -\xcf@\x97}{\xf0\xb2s\x93o<\xd8\xfa!mn\ -;O\x0e{\xdf\x12\xf8\xde\x95\x99]\xcf\x91\x1a\x8bf\ -\xec\xbdz%\xb5\xdd\xcdv\x8b\xae\x9d\xfa:\xfa\xc8?\ -\xf1\x81\x1f\x1c\xbe\x7fIdwj\x93\xb0&s\xc6j\ -\x8d\x9c[\xe6?\xe6Y\xbc\xecg\xb0\xf5^\xee\xe1M\ -\xc6\xeb{\xc7\xe7\xd5\x1d\xea\xb5\x98a|\x99\x5c\x8e\xb8\ -\xa1f-\xbf5\xdb\xf4]vG\x1e\xfb\xf7S\xe8\xb3\ -\xb8\xee\x9b&\xf6\xab\x93s+.\xe3\xa2\xe3\x08\xe7\x95\ -\x93\xdak\xa5\xc5\xbe\xf81\xe7DP\xc1\x10\xff\xb6u\ -\xaf]V7W\xbb\xc1&U\xdf\xf8\xd6\xf4L\xf0\xe7\ -\x9dq\xbd\x92ek?2,`r\xaf\x03!\xdf8\ -m\xda$\xf4\xe8\x12\x9e\xfc(~\x22\xc3\xdd\xc4q\x80\ -\xf2g\xfbG{\xd4\x8e|\xf9rs\xe5?\xef\x92z\ -\xbfWWIq.\xb8\x98\xcd\x1e\xf3b\xf9\x5c\x8e\xc1\ -\xc2\xa4]&\x88\xb1\xbal\xff\xa7_A\xce\xd8\xd6\xd3\ -\xdb\xbdq\xaa{\xb3\xe7\xa5\xf8\x09\xcf\xb2\x08\xef\x1b\xa4\ -\x09\xf7\xb8\xdf\xc2\x84\x8bw\x1b\x11\xe3\xe6\xf5\x0a_\x82\ -\xb8\xbd\xb1Cn\xdd\x17\xd1v_\x9d^~C3\xfa\ -\xd9\x22\xf29\xa7\x11s`\x01\xc9\xcc7\xab\xdd\xdev\ -\xf1No\xc4k_|\x19\x13\xfb62z\xc4\xd5H\ -\xe7\xad\xc7\xbb\xe4\x0c>n\xd3%q\xee\x12\x02\x11\xff\ -G\x7f\xc2\x93\xb5\xfe\xd0?K'\xbb\xd6\xcb\x8a\xeb\xca\ -hp\xa3\xc9\x89\xc0\x93\x13\xfcgX\xfd\x9c\x14\xbcO\ -c\xd9\xd1/J\xb7s\xd2:\xb6I\xf0\xed`\xb2\xea\ -\xd1\xa5\xce\x8e\x8936\xfb-\x1e?\xba\xa3\xb3e\xff\ -\x96\x8f\x1e\xce\x083\xde\xf8x\xf1(\x8b\xb1\x8dv\xff\ -Pz\xdb\x89g\xb4\x94\x17t$\xd1\x8c0Ug\xb8\ -\xa4n\x9d\xa2M.V~\xbd\xf3\xe3\x88+O\xf5\x92\ -,V|\xeaY\xef\xd0\x95u\xaf\x1a9,\x8b{2\ -H;\x90\xe4\x05mp\xb0\x5c\xb0\x22 \xb6\xdf\xc9\xc9\ -\x8d\xdf\xd7\xd2;\x15\xe5[sd\xab5i\xef}Y\ -#\xb6f\x9f|\xd52b\xb0\xc7v\xaf\x96#\xb6\x7f\ -\xabW?\xec$g\xb8\xd7+\xef\xd5\xadr\xc3\x1a\xf0\ -\x8e}\xb7\xf7J$\x9b~?\x14io\xd4\xd6v\x9c\ -Wo\xd7\xcdHrd\xae\x89\x8ey\xf1\xe3/\xf7\xb7\ -u\x17\x05L\xd6{\xe6\xbbi\xb2A/\xb7\x99:5\ -\xd1~\x9fH\xca\x99\x17\xb39h\xae\x8a\x0f\xbb\xd3I\ -t\xa4\x1b\x10[4\x12\xee\x84\xbf\x1c7i\xed\xa0O\ -c~\x8e\xaa7\xb5M\x04\xbb\xd6\x04\xaf\x88\x87aM\ -\x9b.\x99GD\xce\xbb\xf2\x83\xb1\xd3z\xa3\xf9d2\ -Z\xff\xe6\xe0#]\xea\xf6\xcc5\xdcy8L\xb7\xd5\ -\xfe\x80\xdd\xd3\x82[&\x7f\x08\x09\x22L\x8fjZM\ -h\x8f\x94\xc6\xb6S\xb4j\x866\xfc\x1a\xd6\xe0\xad\xc6\ -\xf5wo|\xff\x193\xd8>\x7f]\x8fh\xed\xb3l\ -\x8fFJc\x16\xab\xb4\xd5%\xb6D\x1c\x9d\xc9c\xd4\ -\xf7l\xf2|Y\xd7\xa1G\x1b\xb0u\xb9\xf1K\xbd\xce\ -\xf6\x9e\xe3\xfdj\xf1\xa4\xda\x8c\x0b>J:\x0d\x88\xd5\ -K\xff\xd3arW\xf7\xf4=\xff\xa5\x85\xb6\xe5\x84\xb9\ -a>\x0d\xa632\xa6\x0e\x1f\xff\xc6\xf2\xafP\xfb\x80\ -\xe9\xce\xef7&\xf4\x18\x10\xc7\xaa\xd1\xe2\x8c\xf2\x93\xab\ -\xea\xe6\xc4\xc1\xf1\x96;\x8dr>\xbeY\xb89\xf8\x00\ -+9b\xf0=D`\xaa\xcc\x06\xad\xf7\x07$\xf9\xf6\ -\x9e\xd6\xc2\xcfq\xc6D\x87\x9d\x9d_\xea&Y\xf4o\ -\x15\xe9\xb6\xccs/c\x5c(\xa2\x7fD\x0c\xc3\x1b;\ -j\x1bu9\x1e\xd6y\xe0a\x9b+A\x93\xdf\x8f\x1e\ -\x18\xf9\x99\xd8\xf3\xb8FT\xb3\xbb\x7f\xeb1u\xf3\xb3\ -Ng\xcdo\xbb\x93az\xe5\x96\xff\xdd\x9d+b\x0d\ -j\xee\xbag\x8a\x04\xc4\xe3\xec6\x0b\xba\xc6}\xed\x91\ -\xd0\xd0B\xc5\x88x\xdc\xc0m\x06\xc3\xb0\xaf\xf7$'\ -\x86\xe9)\xa4\x02<\xfc\xc69\xf4\x8e\xd5\xd4\xa0\xcd\xc5\ -\xad\xe8\x17\xcd?\xd76\xce\xbd\xc8\xa9\x1f?\xb7\x0e\x91\ -Q\xc7\xc2Q\xdbo\x0as\x87\xf2F\xf4\xa1a\xd8\x14\ -\xe6\x8aE\x97Fh\x11\xdf\xda!\xfa=\xdbU\xe9\xd2\ -M\xa5\xc8\xa6.\x9ai?\x12\xc7\xef\x8b\xea\xb6\xda\xa7\ -\xf9\xfa\xcf\xeb\x0f\xfd\xe5\xe9d06\xcfe\xdd\x80\xf0\ -L\x86y\xd2\xc8\xb6\xfd\xaf\x9b$\xce\x0f=\xefS\x7f\ -\xac\xfa\xa5\xd5W\x1c\x13\x02\x88\xfd\x13\xbb\xe6\x9e\x9a\xef\ -\x16}w\xe1\xf0\xcf[&\xf7\x8e\xba\x97\xc9\x08_9\ -\xb3\xcd\xbe]\xa3\x07\x0e\x0b\xfd:\xfb\xdb\xf4\xd9\x86^\ -ji\x1b\x88avZ]w.\xe3\x8d\x1c\xd1jM\ -\x07\x93\xc0K:./V\xc1o\xb3I\xaf/\xef\x8f\ -\xe4\x18tk\xaa\xd9\xf3\xfc\x0bc\xe6\x05eS\xeb1\ -ow?\x1f}\xf1\xfa\xcf\xe8\xff\xa6\xcf\xd9\xb7\xb7\xd7\ -\x9b1'\xf7\xd7\xdc\xcb\xd6ws\x1d\xd5rWd\xc2\ -\xe9\x88\xe9\xc4X5\xe6$\xd2a\xf7s\x87\xd6n]\ -{^[AL^\xa0\xd4G\x97\x18\xba\xa5\xdf\xe6\xc3\ -:\xdc\xa9['\xb57u9\x8a\xfe\xc84\xeb\xf6\xb3\ -m{\x87]\xf2\xeb\xef\xd6\xd8\x8b\xf73\xf9\xe5\xfd\xd7\ -\x0c\xfd7u&\xae\xda6\xad\xf3\xba\xe6\x91J\xe3\xe6\ -\x1b\xeee\x98w\xadG\x5c\x1a\xbc.d\xdc\xe2S\xf5\ -\x88\xc9\xec9\xad\x1e\xb1<\xbb\xf4\xd5%\xea\x1b+\x9b\ -\x12FV\x9b\xcc\x88\x16\xadm\xfdf\x84\x12\xfa\x19F\ -\xaa\xcc\xe7_l7\x84o\x8f\xbcOx\x1f\x8dR;\ -9\xacc\x1d\xa2\x85\xc6<\xe2\xdd(\x97n1\x83\x08\ -\xe5\xe0\xd5}g\xae7\xad=\x87\xd0\x5c\xab\xa5\xcc\xec\ -3\xf6fH\xaf\xa4\x07\xe8OG|\xec\xbfo\xc8\xdc\ -yZ\x17\xedj\xeeX\xdb\x8bh\xd5\xac\xc6\xf8\xc5\xbd\ -\xdb\xd6\xdf\xd0b\xd2\xbeG{\xfbr-\x0e\x1e9\x90\ -k\xbdr\xe2\xe0Y\x0e\xfa\xcf\xd0\x147v$n\x0e\ -S\xc9\xd0KRz|`\xba\xcb\x85\x88\xf3{g\xe5\ -\xee\x1b\xa7\xefy\xbd\x9d\xf3\x05e\xfd\xc0v7:E\ -\xb3\x9e\x8fq\x19\xd6\xf7\x90\xe7\x93!\xad\xd0\xb4/>\ -\xef\xb9~sN\x0b7\x8d\xe17C'\xadm\xf3\x00\ -=\xc3\xe5~\x92\x92G\xffK\xad\xcf?i\xa8\x1f\x93\ -Nh\xf6\xd66\xb4a\xde`\xd4\xde[{\xeed6\ -\xc9|\xa4L\xec\x1d\xf9\x15\xe9\x19?}S\xd6\x0e\xd4\ -{\xbaA\xd5\xd0B=!\x9f\xd8\x9b\xb8\xf3\xe4\xa4\xff\ -\xc6\x1a_\xad\xad\xbaanGb\xf2y\x82\xa1J\xd4\ -\xbf:_\xc9\xdc\xdbw\xcb\x1eUu\xed$\x8b\xbf\xd7\ -[LVE\xbff\xbe\xbb\xa7\xc9L:\x1c\xceza\ -g\xb82\xf9\xf5Q\x1de\xd3\xd6\xfb\xf5B\xe3'\xaa\ -\xb9G\xdf5@\x8a\xe1)W^W\xdb~D\xab\x06\ -=\xb5-\xbf\x9f\xd5g\xec\xbf\xe7\x19A\xe8\x07\x13\x84\ -~@g\x0e:&?}S\xdb!-\xb0%\xd7\x9a\ -\xa1\xff>\xbe\xc3\x16\x06\x11\xb3\xc5\xdcpO\x96\xaf\xf5\ -h\xe6.\xd5\xf53\x1e\xaa\xce~}\xf4\x84\xf5\xb6\xbd\ -\xc8\xea\x7f\xd6\xc1r\xe7]\xde\xbbq\xc7\xb3Z\xa7\xd5\ -\x09[\xea5=^M\x8bX\xbb\xbfy\xf0\x14f_\ -\xa4M\xec\xe8\xb7\xbb/\xf7x\xd2\xae\xf3\x0dU\x99c\ -\xd8!s\xda\x07O\xbf\xc7\x1c\xcb\xd1~\xd9\xc1r\xf8\ -\xec\xad\x1aF\x84M\x84\xde\x8ba\x0e\xed\x17\xd6\xe8`\ -\x93oc\x9a\x95br\xe3\xb6\xd7\xb3\x96\xc1[\xb4\x08\ -\x7f\x9b6\x06\xfd\x1a!]jo\xd6|+\xf7a\x1e\ -\xb5\xba\xc4\x06\x04\xd9\xa8\xdf\xd0Q5e\xfc\xd4X\x8c\ -\x14\xef\x91\x17zv\x5ct\xab\xf7\xb9m\xee;\xf5\xbf\ -\xdc\xef\xb0\x8d1\xcet\x8b\xc6\xe2e\x1e\xbb\x947\xb5\ -\xf1\xb7\xe9\xa5\x7f\x97\xdct\xe9\xb9\x03\x93\x91v\x0a1\ -\xc0\xb0\xb5\xef5k\xaan\x18\xf1\xe9\xda'\xfd\xfaK\ -\xea\xeb\xe5)3\x1f\x05-\x1b\xd1\xf8L\x07U\xd3\xbf\ -\xfe\xeewy\xa3\xa5I\xe8\xdd\xbdd\x5c\xaf\xcf\xb9\x87\ -w;\x99\xac\xf0\xf3\xbfk\xd0\xef\xd6\xa4Z\xca\xa7\x1f\ -\x7f\x9a0e\xbbZ\xf7\xb9\x03-\xe2FO5\x08\xe8\ -\xban\xd0\xf6\x7f]\x86\xabX\xb6u1\x22F\xdc\xce\ -\x1d\xb5K#\xb9`d\xff\xd6w\x1f\x8c\xe9\x1a\xe1\xa0\ -\xd9\x92\xbb\xa4\xcf\x12\xbb\xe5HC\xdc\xbcC\x8bh=\ -\xea\xc5r\xc3.\x8b\xe69\xab\x0d\xeb1\xef\xe4\x7f\xde\ -\xbe\x83\x8fv9\x18\x96\xdf\xb1\xf5\xdd\xa1\xe8\xdbO\x8e\ -\xd8\x9e\x1fb=4\xe4\xb9\xadMv\xdb\x81\xa7k#\ -\xbd;\xc5\xb9\xd9\xbeNC\xbe\xe4em\xb5\xf9+\xe7\ -!\xd1\xf6\xeb\x97eC\x8ef-\xa8\x994\xf6\xe6\xd2\ -\x7fz\x06\xb9G\xa6\x04\xc5\xa3/\x0e[h\xfd\xc4G\ -\x89\xc8\xbe\x1bc8>\xfd\x83ql\x0a\xdaJ\xc3\x09\ -\x17\xff&<\xf2\x07\x1f>\x1f\xd7m\xc5\x93\xcfz\xe6\ -\xc4\xa4\x83/\xbe\x1d\x1ci\xfdU\xfd\xe5{\x86\x85\x0f\ -\x19\x96\xbd\xda\xdd\xd0$\xe6D\x80I0\xf1.\xea\xc1\ -\xb2!\x17\xcf\x9d`\xaei\x1e\x13\xbfJi\xdel\x9f\ -v]?\xccn\xdb/0\xf6\x08\xfc\xb3\xc7\x13\xaf\x8b\ -\xbe\x11\x83\xf3L\x8dbB\xcey\x0e\xed\xeb;7\xdc\ -6:bl\xae\xcb~\xf4D\xd7\xdc\xce\xa1\x84\x07R\ -\xecn\xed\xff\xd8\x93\xf1a\xc7\xbd\xa1S\xf7\xac\x8bc\ -\x9cE[x*\xbaf\xbb\x8f\x19~\xdd\xb2}'\xcc\ -\x1b\xf2\x06\xcd\xe0\xe7\x87\x10\xdf'\xf6\xb7\x91\x98\xe9\xe3\ -\xf7%\xe5\xc3\xd0\xed\x8e\x0c=dCL\xb0\xf4\xbe\x1a\ -\xfeiB\xa3\x03\x99K.\xeb{\xa9(\x9f\x1e\x81\x98\ -\xdd\x88\xd1\xea\x8d\xda_ne\xb9\xa4\xaes\x96\xde\x83\ -\xcc\xa6\xcd\xe3C\x92?\x0c\xcc\xf6\xdf\x8e\x1e\x14i\xce\ -\xb9P\xb7u\xb3\x86\x97\x06-m\xa3\x17rr|\xbe\ -A\xac\xb6\x9d\xde\x9e+\xcdV=\x98\xb0\xe8B]\xce\ -\xdfs\x89\xc8\xc7\xed\x86\x9b %\x1d\xc9\x01\xad\x82\xb3\ -\xa3\xf3kOz\xec\x917\xe6h<\xd2W\x8cx\x07\ -V\x9e\xe7\xee\xe8B,98,%\x06\x09\xfb\x88\x87\ -\x1e#\x8cb\x06.\xf3\xa8\xbb\x93\xccWC\x9b>\xde\ -\x7f)\xd2\x9f\xe3\xaa*\xf7\xcb\xfa\xe1\xd0\xc3\xfar-\xa4T\x0f\ -\x1a0z\xf7\xb2\xb7\xa9\x8f~\xe4\x8e\x5c\xe3\xfa\xec>\ -\xb1(\x1c)acN\xa5\xb5\xbf\xa1\xe2r\xd4\xd9\xb4\ -\xad\x0e\xcb\xa9\xee\xf0\xc3#\xde\xbal\xf7\xf9Z\xc0\xdd\ -\xf2\xa9\xf1+\xa5+}9#\xdf\xbb\xdf\xff\xef\xd4R\ -\x8dh\xff\x94\x95\x0b\x88#\xdf\x9e\x0c\x9a\x9e?x\xc0\ -\xa4 D\xa8\xedUagG\xcd\xadS\xfb\x7f5>\ --\xb4\xb6\x7f\xfaj\xa7\x9d\xe1\x1c\xe2\xc8c\x0b\xe5A\ -n\x93yK5N\x06\xbe\xbbP_\x95\x196%j\ -\xcd\x0a\xa4\xf7oe\xaa\xdf\x0e\xccP\xaeC\x8cDS\ -\xae\xc3\xd8\x969 ^\x0d\xd91#\xfc\xf5-\x0f \ -\xec$%7|TC\xe7qK\x17\x13\x95;\xeaL\ -r\xc4\xe1\xd0]\xce)\xc4\xc0\xe0\x9e}&\xe43\x02\ -_\xdcP7\xef2ou\xb0E\xe6#K\x9b\xe4\xd8\ -\x19W'\xf1\xfa\xb4$\x1a\xb9\xa9\xc7-\x18R\x13\x1d\ -\xb6\xe1\x8d\xb7\x8c\x08_\xb0<\xe2\xca\x89\x84\xab\xe6\x8c\ -\x18-\xa6\x17\x9a\xfc\xd3.Mw\xd8>D\xa6'R\ -\x05\x1d\x8f>\xb4\xf8y\xf6]G\x15o\x15\xf3\x80\xb0\ -\xfc\xd1H\xa1\x8b\xab\xb3Q\x09\x99M+rr\x5cg\ -\xe9\x9e\xfb\x97 fw:\xec\xf82a\xe0\xc2e\xc9\ -c\x89\xe4\x08\xf7\x8c\x1d\xe6\xc1\xdbR;\xab\xe8\xde\xbc\ -\xe8t\xfc\xc1\x85\x1e3\x03\xfc\xaf\xd6\xbe\xe8b\xfb\xe8\ -\xda\xccN\xb9_\xf4c6\xd9\x5c\xbc\xf3@\xab\xb1\xd5\ -\x93\x9c\xb9\x96\xd7\xfc\xefn\xbb\xe1;q\xd6\x15\x8ei\ -\x7f\xb3\x85D\xcd\xe3G\x9e[\x052G\xfb,M~\ -\xdf\xc6\xe1\x8c\xca\xd7\x1e[\x18\xc17\x89\x01\xce\x83\x07\ -\xaeP\xd35\xfc\xd9*\xd4\xd4\xb5\xc1\xd8\x94k\xc3\xee\ -^\xb9\xa1rzo\xbakw\xa4\xe09X?gn\ -GV\xb2\xf1\xfa\xe3Q>\x8f7\xa5\x1f\xe7\xe8\xeb\x13\ -\xf5j\x18\x22\xf6\xa1\xd2c\x9bF\x80\xf5\x8c\x8e\xbd\x9f\ -u\x9c\xbf\x02-\x7fj\xf2\x97y\xfb#G\xdc\xf9\xaa\ -E4\xd4PR\x0a\x9e\xf83b\xdf\x82\x05+\x9a\xba\ -\xda\x05\xecF6\xf4q\xafnGf<\x89\xe3|\xee\ -\x01\x8ap{\x87\xc5c\xd5\xc9q:\xc4\x8d\x08\xf7s\ -\xb9\x8b?+\xa9\xde\xb3\x9f\x12\x95k\x85\x9e\xd3)\xe0\ -K\xf4\xfaUwn\xab\x87\xab\xc4\xac\xf9Y\x7f\xc2b\ -\xc4\xff\x0f\x8fU\x03=\xf7\xef\x8fK\x8f7\xdf\xf7\xe9\ -^\xe0\xc2\xe3\xb3f\x84~tr\xb8\xf2\xa0\xf7!\x86\ -\x97z\xda,\x820E[\xb4\x860\x8bpw\xcb\xd8\ -\xc4\xd0C\xa2\xa1K\xf7\xc8\xef\xef\xbblB{\xfci\ -\xfd\xa1\xd8\xcfw\xbb?m\x9f\xbe\xdbA\xdb\xe1q\xbc\ -uk_\x15W%\xcd\x03\x9d\xda\xb9\x1c~\xf1\xcd\xa8\ -\xe7\xd5\xcf\xd9>\x13W\xd7\xf3\xb7\x9e\x911\x17)\xd9\ -G\xfe\xfdt\x1f\xbd!):j\xe1\xa5<5\xf7\xe9\ -\x84\x1da\xef\xd2\xa9\xdd\x9b6Zis\xdc\xc8\xd3_\ -\xf7|2<\xf4\xe2[V\xcbg\xb7\xee\xe4\x05\xef~\ -\xcf\xbbY?u\x9a\x11o\xdcuu\xc2\xbbi\x8c\xcd\ -\xbeq\x0d\xd0\xcbu\xd60/\x9e\xf1\x8ex\xd9q~\ -\xcf\xbc\xc5\xbbs\x8f\x91\xa6\xf9\x9d\x08\x82C\xc4\x9c\xb7\ -\xd9~\xb1\x1fb0G\x8e4\xf5\x9d\xfd\xbe\x8b#\xb2\x01\xbe\xcf\ -\x9a\x9f>\xb7\xddS\xfb\xc0n\xf6m\xb3C\xac;2\ -;Yu\x0fvq6\xfdQ\xab\x07\xd2\x8dW[]\ -\xf8\xdc\xb56\x9a\xe5\x07\x86\xdb\xd55\xd3b\x93\x0f\xe8\ -q{\x1cLV\xc2\xeb_H,t\x1b9\xfa\xad\xba\ -\xea\x86\xfc\x90\xfe{T785\x8b\x1ap/om\ -_\xe7\x11\x81\x88\x16\xde\x98\xacI\x8f0^t\xd0\xc5\ -\xec\xfekD1\x09\x0fM.G\xaa\x10>mB\x9a\ -\xfc\xdc\x7f \xdby\x87\xdf\xec\xf8\xcb\x0dk^~7\ -\xa2\xe0\xca'\x87\xb6\x1f\x95\x08c\xada\xdf\x94\xf4\xea\ -\xf0\x9a\x8c\xe8\xab>.\xa9\xb7\xe6\xbe\x03\x93/\x87\x14\ -\xa8\x04+[\x85\x8ckqaD\x7f\xcf\x90\xf9\x93\xeb\ -0]l\x87\xd6^\xa6\xa2\xd9\xf3\xcd\x9au\xba\x9d<\ -\x8f\x0d\x8f5~W[\xdf\xfaXC\x1f\xff\x19\xaf\xee\ -2\x82\xa7\x10\xfbZ&\xaf\xcfU\xcb9\xaa\xd2\xf6A\ -\x13F\x8bGm{g\xcc\xf68\xf6/s\xc0<\xec\ -\x0c\x9c\xb0\xca\xcc\xcb_\x85\xb0Z\xa5\xbfO\xf9\xe0\xcc\ -\xec\xa9#\xbc:\x12\xc4\xed\xb6\xdc\x14'\x8f\xb3\xc7\x12\ -\x17\x8df\x9c6\x19e5\x92\xad[\x7f\xfcp\xdf\x1d\ -zy\xef\xc7\x8e6#\xe08L%\xec\x22R\x0f9\ -e4\x9a\x12\xa7K^\x8a\xef\x1c\xf9Z\xc5hf\x8d\ -(U\xcd\x8b-\xb6\xf4\x0aHX\xa5\xc2\xbc\xeb\xa5\x19\ -\xa04h\xc9\xed\xc9\xb7\xdfL\xed\x98\x98\xa8\xa4\xd5k\ -\xdeR\x13%\xadC\xf6\xb9\x83\x9auGH\xcb\xbb~\ -*\xe8\xdd\xb0\xc6\xc1V\x7f\xf5\x99\xb8w\xd8\x13%\xed\ -\x13G\x97\xb6%\xb2\xdc\xb7\xeah\xe8_\x9f];\xf8\ -\xe1\x92C\x05S\x22\xd2\xea\xed[\x17\xed\xc8RvJ\ -Zu\xed\x8b\xbdC\xf3\x89\xb7\x9c\xcc\xb6\xaf\x19\xb5\xb1\ -\xb9\xe9\x7f\x87w\xae;\xb9\xf4\xc8\xe2\xf5\x83\xae>\xe8\ -\xdd\xcc\xdc\xf5\xb9\x9a\x93\xc7\x1c\x8d,\xff\x05\xb5'\xf6\ -\xd8>{\xfb\x9a\x995\x062\x1f\x1bjd\xf5Z\xa0\ -\xfdz\xecv\xf3\x9a\x9a\xff\xde\xcfz\xa21M\x93 \ -\xd0\xef\xff;4\xc9>\xf8,Ah)\x0djs\xed\ -r\x86r#U\x22XS\x7f\xc9^w\x17=oc\ -\x82\xb9\xa1\xa6\xd5\x8e\xbd\x1e\xdd\x1b{]\xe10\xeb2\ -\x88o\x17j\x06\xd5\x98Z\xa7~\xb2\x81J\xcc\xc8\xae\ -\x17\xd8\x86\xd7\x92//\xb2\x8b\xbd\x9f\x10sCyP\ -|\x07\x22\xef\xd3\xe5\xc1\xfd\xdexg{\xdb\xda\xfd\x8c\ -K \x96\xadw\x1cT\xaf\x8b\x8aWF\xe7w\xf9g\ -\xeb\xf6\xad\xf7\xc9\x09{\xbcG\x13\xc9\xb7\x82\x8c\xf7\xf5\ -\x9a\x10~*a\xcfG\xee}\xbf\x99c\x10Q\x9e\xee\ -z\xeb\xadZL\xbf\xdb\x81Zk_+\x8dZ\xe7q\ -\xa1Y\x1c\xc3\xfc\x87\xb3\x97\x9d\xb2W7\xd3o\x7f\xfb\ -\xa2\xfd\x8d\x1e\xd6\xc8\xf4(A\x80\xdf\xbc\xb1\xcf\xdb\xe0\ -&?\xafk\xfe\xfb\xa3\x9dO\x00\xef\xbaM\xff\x83\xb5\ -\x01\x1d\x16Z\xc1\xc6\xb6u\x9a\xf8=\xfd\x1f\xb3K\xef\ -\xa1y\xb9\xe7\xfe#\xb4\xb2,\xefE\xc5\xe87\xef9\ -\xa3\xf6\x87\xfe'\xa3\x875v;\x12\xc1 \x08\x1c\xc3\ -\xe8bT\xf3\xf1\xda\x09\xe1c\xde\xec\xee\xe1oqx\ -\xf2A\x0d\xc2\xb1Y\x8d\xc6\xa7U\xfa\x1f\xb6Y\xebd\ -8m\xeb\x94t=\x8f\xe9\xe9uw\xd7b\x0e`k\ -\xa1\xa7\x987\xbf\x18\xdf\xce\xe7<\xef\xa0M\xffK\xf1\ -\x8f\x09\xa3\x1f7T\x1b\x13\x1bTn\xd5\x1e\x16\xfa?\ -\xa6\xde\xe9\xcf\xc9\x87\xdd\xd5'\xb6\x1f\xaaf\xda\xdc\xae\ -\xff\xab\xa9\xe1\xf5\xda\xfd\xa4\xc2\x16>\xf3\x03L\x86u\ -\x8c\xe9\xb2s\xa9\xd2\xe9\xbd_\xfe\xa7\xa5j\xa5=\xbd\ -\xc7\x193\xffQ\xdf\x16\xb5[\xf4\xbc\xe0\xdfE\x17\xd2\ -:\x8cl\xfc\xb8\xc3\x95:\xcc\xb9\xebX\xa75\x82\x0d\ -\xd8W\xed\xcc\xdb\x8e[\xdcn\xd1\xd3\x95\x8d\x09N\xe3\ -\x0f\xdb\x03\xd4#\xb6\x5c\xdfa\xa0t\xba\xa1\xdd\x943\ -\x1a\xd35\xb3~\x9a\xf0j\xd4Q\xbd:\xac\xbfg\x0c\ -s\xca\xfb\x89\xe1\x86\xebG\xf8\x9b\xaf~\xa2F\xfc\xb5\ -\xf65\xa9\xdc\xc0\xa2\x87\x91\x96\xb6\xdfr\x08[\x0d\x1f\ -\x08\x1c\x11\ -\xe8\x15\xd5\xf2\xbe\ -\xeaA:\x8d\xbbr\xdb\x05\x02\xf8\x07\xbb\xa2Z\xcf\xaf\ -\xba\x10K\xe3Pb\xfc\x0b\xe0^\x8fUm\xdf\xff\x0e\ -\x10\xc2\x12\xf0\x11I\x88{\xf0+\xeeV\x80\xb9W\x83\ -|`7K\xc0W,\x01\xfe\xc1\xb7\x5c\xed\xd3\xfd}\ - \x85\xc6\xa9X\xfc\x0b\xe0\x1ebK~\x0a0\xe7j\ -\x90/\xf8\xb1\x04\xe2\x86\xa5\xe0\x1f\xe2\x8b\xd5\xb6\xde\xef\ -\x07\xf94nK\xe0_\x00\xf7\x90_\x10\xaa\x00s\xad\ -\x86\x8a\x81P\x96@\x0e\x89\x08\xfc\xcfb\xfdI\xb9\x1b\ -\xcbu\x11\xe8\x90,\xcb\xa64h\x93,\x0bm\xea\xff\ -\xad\xf5\x114'Y+\xf4\x05~O\xff\x9b\xa5\x0e\xf5\ -=\xf8~e\xaf\xa1|\x00\xb85\x13\x83\x7f\xc81\xbb\ -\xa5\x00s\xfc\x05\xf8Fx\x5c\xa1G&\xad\xed@&\ -o\xecI\xa6\xed\x9fHf\x9cYJf^\xb6#\xb3\ -o\xed\x22\xb3\xfd\x0f\x90\xb9\x0f\xce\x91\xb9\xa1\xee\xe8\xe7\ -Y2\xdbo\x1f\xfa\xbd3\x99yi\x1d\x99\xe1\xba\x88\ -L\xdd3\x86Lfv'\x93l\xdbS\xcf\x85\xe7\xc1\ -s\xad\xaa\x04=\xf8\xd0\xb8\x16>\xfb\x90g\xf8\x1b\xe6\ -\xeb\xe9\xd2\xe7U\x17\xe3+u\xe702\xf3\xe2\x1a2\ -\xe7\xbe+\xc9\xfe\x18JrS\xbe\x91\xbc\x9c4\x92\xc7\ -\xce#I\x1e\x8f,up\xb9\xe8\xefrI^v*\ -\xc9I\x8a!\xd9\xefC\xc8\x9c\xa0cd\xc69K2\ -e\xdb\x002i\xb5\x01\xcd\x17\x14\x9a\x16\x92i\x5c\x0b\ -\xe7\xf28*\xc0\xdc\xe4\x07p\xd6\x11\xafNZ\xd5\x86\ -L\xdd=\x86\xcc\xbe\xb9\x13\xe3\x8b\x9b\xc1Bx\xe4\x94\ -\x8e\xe7r\x0e^A>\xc9M\xfdN\xe6G\xdc&\xb3\ -\xbc\xec\xc9\x14\xa7Ad\xd2\xca\x96\x94\xacPL\x19\xe1\ -(\x84{\xb0\x0b\x1e*\xc0\xbc\xe4\x83wt\xfe\x92\xed\ -\xfe\x87\xce\xa5\x05\x99\xff\xea\x16\xc9\xcdL\x92+\xbeK\ -\x1d\x88G\x00O\xc9{r\x99L?f\x8ee\x0c\x9f\ -\xffT\xfa\xde\x14\xc1CV\xf1\x1cR\xb8o\x90\xa4\x00\ -\xf3\x92\x03\xde\xbb\x229\xbd\x96,\x88~\x86\xcee\xde\ -\xaf\xc3\xbb\x88\xc1\xcb\xcb$\xd9\xef\xee\x91\x19g-(\ -]\x01\xf8\x81b\xc8\x85$\x1a\xe7|\xfc\xc3\x9d\x93\xaa\ -{7\x03\x9d\xaf\xa45m\xd1>/#\xd9_\x9e\x91\ -$\x87]\xa9x\x17\x1e\xc3m9\xf6\xb3\xfc\x8e\x83\xf3\xfd\x1d\xf6C\ -\xffB\x1a\xc8c\x15\xd5\xdd`W>\x8eK\x07\xc0=\ -/+\xb9\xb2\xd1T\xa1\xe3\x17\xd3\x00\x9bUT\x8bD\ -q\xf1\x8f\xe4=\xf0\xfc\xdf\xf5\xdc\x0b\x8f\x82\xf8(2\ -u\xd7\xa8_A\x03\x8a\x8f\x7f\xb4\x07\xa0\xeb\xfdJy\ -\x0f\xf6\x04//\x8b\xe4e\xa7\x90\xdc\xac\x14\x1c\xeb\xe1\ -\xe5e\xffR\x9f\x12\xfbs\x18\x99\xb2\xb9_E\xd3\x80\ -b\xe3\x9f\xb6\xf1*T\xcf\xe7\xf1Hnf2\xf6\x19\ -\xe6>\xba@f\xdd\xd8\x86cy\xe0\xb7O\xdd3\x16\ -\x9f\xc3\xd4}\xe31\xff\xc9<\xbf\x92\xcc\xbe\xb9\x83\xcc\ -{z\x19\xd9\xefo\x10]\xa4U\xdc\xbc\xd0\xc8{q\ -\x9dLZ\xd7\xa9\x22\xe3\x06\x8a\x8b\x7f\x88\xd5\xaei\x87\ -\xed\xfb\x8a\x18\xbc\x9ct2?*\x98\xcc\xf2v\xc4\xbe\ -C\xbc\xcf\xd6-\x04\xf2;\x04r<,u\x8arC\ -\xe0\xe7\xca\x968\xb6\x04r\x1ar\x02\x80>y\xf9\xd9\ -\xf2\x9f$\x97Cf\xfb\xee\xa6rP*\xc6O\xa8\xb8\ -\xf8G\x00~=y\xfbv \x0e\x98\xfb\xd8\x83Ls\ -\xf9\x97L\xb25,\xc2o\xb9\xce\x98nal\x19~\ -&\xaf\xefL\xa6\x9fZ\x80\xfd\xfb 7\xe49xH\ -\xfe\x00\xef\xa9 9\xa0\x98\xf8G\xf8\x00\xbe\xcbI\x8e\ -\x93\xdf>\xb2\xf3\xc8\xfc\xf0\x9bd\xda\x81)\xe8\xfc\xb6\ -\x90o\x5c\x9e\x9fg\x80\xf8U\xfa\xc9\xffpN\x89<\ -\xf3\x0b\x0ab_\x92\xc9L\xe3\x8a\xa0\x01\xc5\xc3?\x9f\ -\xef?\xbf&\xb7\xfd\x03\xdd\x11\xf2\xb6\xe0\xb9\x15\x1a\x7f\ -\xa5\xe9 y\xc3\xff\x90\x1e\xe1D\xe5\x99\xc8e\xf0\xc8\ -\x9c\x80\x83\xb4\x1c\xf8\xcd\xf1\x8f\xce~\xc6\x99er\x8a\ -\xe3\xf1H\xf6\xbb\xfbX\xbeS\xb9\x01\xbf(\xd6\x06\xe7\ -t\x85\x1e\x99~\xc4\x8c,\xf8\x1a!\x87u v\x92\ -\xfe\x13\xd9A\xe3\xe5\xed#V,\xfc\x83,Ez\x15\ -\xd8>2\x0f\x1e\x97\xccE\xbac2\xb3\x07}\xe6+\ -\x87\x96S\xb7\x0f\x22\xf3\xdf\x06\xc9\xbe\x1e4\xf2\x9e]\ -!\x93V\xb5&\xe5\xc8\xbf\x14\x0c\xff:8o\x87\xe4\ -\x14\xc8\x8e\xfb\xb0KdR\xe5\xc5\xd5\x04h\xa0)\x99\ -\xb2\xb1'\xd6\x0de\x1d`o\xa6\x1d\xfaW\x9e\xf4\xac\ -8\xf8\xc7z\xb4\x11\x95\xbb#\xdb.\xe1s\xaf\x10\xb8\ -\x17\xa0k\xec\xc7x\x1f\x223\x0d\xe4=\xbbJ&\xd9\ -\xc8\x8d\x07(\x0e\xfe\x11MC\xfe=\xe4V\xcb2@\ -\xdec\x9e\xaf(\xb8\x17\xa0\x81\xd4\x1dCIN|\x94\ -L\xeb\xe3f%\x93\xa9{\xc7\xc9\x8b\x07(\x08\xfe\x91\ -\xce\xbf\xca\x00\xdbg\xb2\x0c\xd0\xf3\xb1\xaeWY\xf2^\ -\x02\x1aH?1\x0f\xdb\xf4\xb2\x8c\x9c\xc0\xc3X\xbf\xfc\ -m\xf0\x0fg\xc3y\x84L\xf6\x12\xd8\xf7`\xe3)X\ -\x8eu\x09:\x07\x1f#\xe4\xfc\x80\x9c\x92v@\x8c0\ -\xd9\xa1\xbb\xfeA\xef?\xbfR\xea\xd8:\xe4\ -\xd0\xa6\x1f\x9eYu\xce\xbe\x00\xdd\x83\xbe\x22m\x9c\x00\ -\xe2\x97i\x07\xa7\xca\xba\xee\xca\xc7\xbf\x95\x1e\x99\x13|\ -B\xaa=\x80\x0165\xbeW\xa5\xe8r_\x04\xfe\xc1\ -'\xc0\xf9\xf1I\xca\x95\xf3\xc8\xac\xab\x1b\xab6\xfe\xe9\ -\xfb\xd8`\xb3K\xb7\x05h\x0f\xaemV<[_R\ -\xb0\xd6\xc7\xb5\x05\xa4\x1d\xb9\x8f\xce\xcb\xaa\x03T2\xfe\ -up\x0d\x05\xb8G/\x15\xfa\x91\x1d\x9d\xb6gl\xd5\ -\xe3\xfd|(\xf4yIwG\x15\xe2\xcc\xf8n\xb1\xf4\ -\xbc\xafr\xf1\x0f\xf1\x91=cp~\x9d4\xa3 \xf6\ -\x15}w\xa6\x8a\xf1~>\x80\x0c\xd8jJr\xd3~\ -H\xb5~NR\xac\xac~\x80J\xc6\x7fSd\xc7.\ -\x90:\xd6\x0b\xb9a\xf8\xfe\x5cU\xd1\xfbK\xe0_\x17\ -\x9f_\xf6\xc7GR\xad\x1f\xf2\x16Sw\x0e\xaf\xc2\xf8\ -\xd7&3/\xae\x95Z\x07\x86\x5c\xcc*\xcb\xfb\xf9\xb0\ -\xb2\x05\x99\xfb\xf8\xa2T\xeb\xe7\xe5f\xcaj\xfbT.\ -\xfe-\xb41\x0e\xa5\x1a\xc8^\x84|\x5c\x9c\x93Y\xd9\ -8\x94\x05\x10\xee\xb2\xfd\xf7K\x87\x7fv.u\x87\xb8\ -*\xe3\xff\xf6\x1e\xe9\xd6\x9e\x9f\x8ds\xed\xaa\xfc\xf9G\ -\xf4\x0by\xaeR\xc5\x03\x10\xdf\xcc\xbch+\xcb\x19\xa8\ -\xba\xf8\xcf\xcd\x90w.D\xa5\xe1\x1fp(\x95\x0c\xc4\ -\xf8_\xfbg\xe2\x1f\xd9~`;T\xc2\x9d\xe9\x0a\xc0\ -\xbf\x94:\xd0\x9f\x8c\xff\xbcL\xaa\x96\xce\x9f~\xfe/\ -\xfd\xa1\xf8G6\xa3\x9cb\xa0\x95\x0bh\x0fp\xec[\ -\x9a\xc1- 3=VWi\xfcg]\xdf*\xe5\xda\ -e\xd6}\x14\x03\x90\xed\x0e\xf9<\xd2\x0c\xea\x0c,\xa8\ -\xba\xfa?\xf0\xbe\x0b\xab\xa4\xce\xf7\x85\x1a\xbdU\xd6\xf7\ -\x8fA\x17\xe7r\xe6=\xf7\x96\x0e\xff\x10\x03t\x99V\ -\x85\xf1\xdf\x14\xdf\xb3\x95\xf6\xce\x1c\xd4{\xabRq\x7f\ -a\xa0\xef\x0e\x16\xc4\xbd\x92j\xfd\x90/\x97\xe24\xb0\ -\xea\xfa\xff\xe8\x9cX\xf0cJ38?>\x90\xc9\xf6\ -\xdd\xaa\xb4\xff\x1f\xfc\xb7\xd2\xd6\xa6\xe5\xfc\xf8\x88k\x9d\ -V\xd9\xf8\x0f\xd0\xbf}W\x8cGi\x06\xf0\x8d\xb4#\ -U0\xf7\x83\x0fh\xdeR\xeb\xfeh\xc0\xbd\x22|\xa7\ -\xb1\xaa\xe2\x1f\xe4\xdfj\x032?\xc2O\xaa\xf5\xc3\xc8\ -\x09p\xa9|\x8f+5\xfes\xee\x80\xde#\ -3\xed+ \xfe\xab\xe8\x99\x96\x14 \xe7\xcdy8\xc9\ -aI\x97\xf3\x08\x03\xe7}\x1c1\xfb=\xee\xff\x08A\ -\xd2\xea\xb6\x94M\x83\xf7J[\xa06\xd3o@\x13r\ -\xaam#'\xde\xafx\xf8\xb7nN\xd5S\x8b\xbaG\ -\xe6\xdc=\x8a\xefHA\x0d>\xf0q`?\x1f\xbfO\ -\xdf\xf2\xaaK\x13YW\x99\xb2\xd54\x83\x9c\xf7\xeb[\ -\xe5\xc5#+\x06\xff\xfc\x1e{\xe5\xd1M\xf9w\x01\x04\ -s!9l\x1c\xe7\x87\xfb\xae\xe0\xeb\x85Zx\x90\xef\ -\x04\xf7\xc5\x92\x90\xee\xcf\xe2\xf7\xd7*F\x13\x95\x8fc\ -\xd1\xeb\xd3\xa1j\xd8\xcaX\x13\x8a\x9b\x1c\x87\xfb\xcc\xc9\ -)\xee!\x1f\xfc\x0b\xf6TD\x9f!\xa7\x15d\x1c\xf4\ -\xd9\x93\xf8\x9e:\xd8\xc3[L\xca\xac\xf1\x0b\xb9\xf2\xdc\ -\x8cD\xb2 \xe6\x05\xce\xff\x85\xfb\x1f\x10C\x80\xef&\ -\xadmO\xf7\xea\xe4\xd3\x84\x82\xd0\x03\xd4\xb0\xdd?\x09\ -\xfbke\x1d\xd0kP\x8e\xf6\xaet\xf8\x17\xec\x99\x8a\ -e\x9a!\xa2\xc9\x81\xb8njN\xd0Q\xaa\xa7bV\ -2\x99\x1f~\x0b\xcbs\x89\xf0 C,\x08\xbe\x03t\ -\x03\xef\x85\xde:\x99\x977\x90i.S\xc9d\xfb\x7f\ -\xe4U'Av\xdc#\x1e&\xeb\x80\x9er\x10/\x91\ -c\xceS\xf9\xf0O\xf3Y\xd0a\xe0\xbcA\x1fT\xa8\ -K\x07\xfd\xcd\xb8\xe9?J\xc85\xcc\xab\x1c{K\xc6\ -\xab\xd0\xb3\xe1,\xcbe \xbb\x0ah\x22\xf7\x89'\xd5\ -\x8f\xb32\xf4\x04\x9a\xe6\xa1\xde\x07\xe7\xe7g\xb9,+\ -\xe7\xee\x11y\xfb\xba$\xc4?\xe5\xa7\x87\xf3\x09\xf9:\ -\xf9o\xee\xa2\xf3\x16_\xe6\xfdu\x9c\xa3\x0b\xb5K\xcb\ -\xb4St\xb1,\x97w\xad\xdf\x9c{\xa7*\xe7\xfcC\ -/:[C2\xcb{\x93\xdcj@r\x12>P=\ -b\xe4\x9b\xef \x19\xfe\xe98\x1d\xf8\xdb\xcb;p\xfd\ -\xe2\xb2\xe6\x0c2\x04\xe2\xe0H\xa6\xcbm\x94\xea\x1f\xaf\ -\xa8\xfa\x9f\xd4:\xa1\x96\x0d\xd8x\xf2\xaa]\x0c\xcf\xc9\ -\xf4\xdcP\x11\xfa\x8c\xe4\xe7_\xcaX\x15\xf0\x8a2c\ -\x94\xfc\x1a\x10H\xaf\x93\xd7\xc0\xb91H\xee\x96\xe0=\ -\xd0\xf3\x9b\x9f3\x22\x97\xfe{\xba\x85\xf2\x18\xees\x03\ -\xbd\xcb\xb3n1\x0c\xe8\x0f%\xe3=O\x19\xf1\xdfL\ -j\xf9\x0cr\xa2\xa8\xd7\xa1\xf8g\x83]'\xed=X\ -Q\x03\xe7F\x80\xfeWl\xcf(9\x96\xed\xbb\x0b\xdb\ -\xd0)\xdb\xfac\xba.\x9fO\x81_\xfb\x9b\xd2\x7f\xe1\ -y\xa9\xce#q\x7fxN\xc2{\x99j\x18\x89\x5c\x07\ -\xaeiVa\xbd@\xca\x85\x7f\xa87\x01\xe7\xaa<\x03\ -\xdfQBzb\xa9:\x00Z\x1b\x9c\x1by\x0e|f\ -\x84u?~\xad\xa17\x81\xf8o\xb8\xc9_1O\x83\ -\x1c\x0c\xb0U!\x06\x09\xb1H\xfc\x1d\x0bm\xda\xffH\ -\x83\x05m\xdb\xa2gB\xdd\x15\xe8'\x0e}\xbe\xe1=\ -\xb2\xd4\xae)m\x80\x0e\x9by\xdeZ\x0e\ -;\x90\xcc]\x87i#\xd3s=\xf6K\xe6\xdc;\x89\ -{\x89s\xbeGQ5\xfcd\x88\xdf\x949\xd0\x9c\xa0\ -N\x1c\x0b\xf8\x93\x22\xe0\x9f\xaf\xa3\x87]*\xf7R\xd8\ -Q\xc1\xe2u\x00\x9a\xae\xe4a\x1f\xf3\x07\xe8K\xd0\xf7\ -\xbd\x04\xcf\x11\x87\x7fq\x83\xcb\xa5r\xb3*\x12\xcfb\ -F\xde3o\xda\xc7\xaf@\xfd\x7f@\x07@<\xaf\xbc\ -2\xaeT\x1d\x00\xd7\x80\x18+sM\xccb\xefCg\ -\x19t\xf0\x12\xef+/\xfe+i@\xadh\xa8\x11\xa8\ -p\xfd\xbf@\x07\xd87\xa1\xdc}\x8f(\x1d`\xb1h\ -\x1d\x00\xc9V\x88\xf3\xc8\xb3\xb7\x16\xe4\x92%o\xe8\x22\ -9\xffW\xa0\x01\xb8\x87z\xe1\x0a\xd9\xff\x0fx5\xda\ -Wiz\x1a`\xdf\x95\x98gJ{\xffE\xdc\x00\x9d\ -.I\x94\xdcTp\xfc\xffb\xdc\x97\x1f\xff\x00\xd6\xcd\ -\xc9\xdcP\xb7\xb2\x17\x83\xe4&\xf4\xea\x84:\xa7\xb9\x0f\ -\xceQ\xf9\x0a\xd6B\xbeK:\x1e\xce\xd7\xc7\xe55\xb2\ -o\xee\x14\xcdk\x14\x15\xffh\xaf\xf2\x9ezUF\xdd\ -\xf2\xf2\xe3\x1f\xe7\xac\x8b\xb8\xaf\x8ct\x02\x90\xe1\x18\xdf\ -\x88>\xe0o ?\x11\xd7g\x02\xbc\x8b\x8aY@\x1e\ -\x9cC7\x92\x93\xf8En[\x09w\xe22N\x89\xb9\ -\x13\xa7\x80\xf8\x87\x5c\x9el\xbf\xfd\xb8\x1eh%\xdce\ -\xe3\xe3_\xf2\xfe\xcf\xa0\xaf!\xbc\x82_\x1b|\x01\x90\ -\xc3\x086\x01\xe8\x85i{\xc7\xd1\xf8n.YL^\ -J\x9fBi\x03lq\xb1\xf1q\x05\xc3?\xd0}\x86\ -\x9b\x15\x95\xc7P9\xb1j~\xff\xe7r\xf4\x7f\xa7x\ -v\xc6\xd9e\xb8\xff!\xaeA[\x98\x87Q\xce\x1c\x0c\ -\xa8}\xe2e'\xd7=e\x7fyJ\x9f%\xd1\xb6\xa6\ -\x22\xe0\x1f\xfc\x9cy\xe17i\x1b\xa5R\xf3\x98\xf8\xfd\ -\xdfM\x10\xb0$\xff\x9e\xaeP\x8e\x85\xf0\xfcK\xcb\xd5\ -\x16\xf4\xc7\xe9\xe08=\xc8>\x90\x1b\x98\xa7\xc8\xe8\x03\ -\x86\xfb \xb8\x8f\xa7\xa8y+\x00\xfe\xc1w\x04>\xa5\ -\xc2\xde\x93\x95\x83w>\xb0h\xdc\xb7D\x10-\x97g\ -\xae\xd0\xc7>R\xf0\xb3\xe2\x5cNA\x80\xdfa\xff\xaa\ -@Lv9\xe5W\x82\xbb\x1c\x10\x03\x82z\x98\xe0K\ -\x07?\x1c\xc4\xb8\xf7 \x0a\xd2\x0eL\xa2{6T\ -\xfa\x1e\xfc\xa9\x90G\xe3\xb8\xf0\xec\x0b\xe1\xbf1\x82P\ -\xe9\x9f\xaf+$C\x85Aa\xed\xa1?\x05Bi\x1c\ -\x17\xc3\xbf\x10\x0d,@\x90\xaf\x00s\xad\x06\xf9B>\ -\x8d\xdb\x12\xb8\x17\xc2?\xd8\x05~\x0a0\xdfj\x90/\ -\xf8\xb1\x04l>QC\x80\x06\x86#HQ\x809W\ -\x83| \x85\xc6\xa9X\xdc\x0b\xe1\x1f\xfc\xc2\xbb\x15`\ -\xde\xd5 \x1f\xd8\xcd*\xf2\xf5\x8b\xc5\xbf\x10\x0d\xe8!\ -\x08Q\x80\xb9W\x83l\x10B\xe3\xb2L\xdc\x8b\xa0\x81\ -\x81\x08\xbe)\xc0\x1a\xaaA:\x88E0\xa0<\xb8\x17\ -\xc2?\x83E\xe9\x8c\xe9\x0a\xb0\x96j(\x1f\x00\xce\xe6\ -\xd38,\x17\xfe\x85h@\x15\x81\x03\xab\xda&\xacJ\ -\x90O\xe3LU\x1a\xdc\x8b\xa0\x81:\x08vT\xd3@\ -\x95\x80|\x1aWud\xc1}5\x0dTI\x90+\xee\ -\xc5\xd0\x80\x03\xabZ\x1fPDH\xa7q#W\xdc\x8b\ -\xa0\x01\x90)\xa0W\xc4*\xc0\x9a\xab\x81\x82X\x1a'\ -2\xc9\xfbr\xd0\x00\xe8\x94`WT\xfb\x07*\x1fB\ -h\x5cH\xa5\xe7\xcb@\x03|\x1f\x11\xf8\x96\xaa}\xc5\ -\xbf\x1eR\xe8\xbd\xd7\x13\xc4\xc9\xaf\x18B4\x00~E\ -\xf0-C|\xa1Z7\xacx\xc8\xa7\xf7z8K\xc0\ -\xa7\xfb\xabp_\x0a\x1d@l\x09|E\x10c\x962\ -\x87\xa4\x1aJ\x81\x13\xd5\xa3zT\x8f\ -\xeaQ=D\x0ef\xf1\x8fe\xf2\xd3\xe0\xe2\x9fK\xf0\ -\xe7\x98\xe2\x9f\xd5\x84?\x0b\xcb\x83\xb2\xe4\x87\xb0\xbc\x11\ -\x96G\xc2\xf2\xaa\x84<+6A\xe5\x92\xf2PX^\ -\x0a\xcbSay+,\x8fK\xc8kay^\x5c\xde\ -\xb7E?L\x09j\xdf\x19\x84>\xf5{\xf4\x8b\x96\x9d\ -(\x90t\x88\xd0[\xfeB\xd0\x17\xc1r\x04G\x11\xdc\ -D\x10TIp\x93\x9e\xc3rzN\x7f\xc9K\xc7\x12\ -z\x0e\xf8\xe0\x0d\x11\xaccQ~y\xb0\xdd9\xac\xca\ -\xb7)\xf9\xc0\xa1\xe7\x14B\xcf\xd1\x90%\x107(\xef\ ->\x08\xad]\x1f\x81\x13\x828\x05X\xa7\xa4\x10G\xcf\ -Y\xbf\xbc{ \xf0\xf7J\x08& x\xa5\x00\xeb\x91\ -\x16^\xd1kP\x92d\x0f\x04\xd6^\x13\x81-\x824\ -\x05X\x83\xac\x90F\xaf\xa5fi{ \xb4\xf6-,\ -E\xe8\x9d)?`\xd3k\x12\xb9\x07\xac\xe24o\xfb\ -\x9b\xad]p\x0flY\x22\xce\x82\xc0\xfa\xe1\xac\xfc\x0e\ -4/\x0e\xd2\xe85\x16\xae\x9fU\x9c\xcfWe^'\ -)\xbcb\x09\xc9\x05\x16%+\x9d*\x7fn\xbf\xec\xfe\ -\xbc\x13\xab\xb8~\x00\xfa\xc2/\x94\xef\xbaE\xb58\xa0\ -\xee\x06\xd4\xd2Z\xd9\x92\xaa1\x08}\x9c\xa0\xd6,\xfc\ -]\xc5\xf5\xfc\x8c\xa3\xd7\xcc_\xff\xfa_\xb2n\xbav\ -\x14\xf4\xd6\x84\x9a\x0a\x19\xee\xd6dN\xe0!\x5c\xdb<\ -?*\x88d\x7fzL\xb2\xdf?\xc0\xfdgr\x1f\x9c\ -\xc5u\x0f\xd3\x0eM\xc7\xf5\x94q\xcf;\x5c\x0bIn\ -{\xb1\x8eU\xa4\xcfWl\xbe\x0f\xae\x97\xa5\x87k\xf8\ -f\xdd\xd8\x86\xd7I\xf5Z)\xbb\xe7\x04\xd4\x97\x80\xbe\ -O\xb9\x0f\xddp\x0d\x02\xa8\xf5&\xa7}\x08a\x15\xd9\ -2\x15\x14\xcf\xd4\xa5\xeb'\x9a\xe2Z\x87\xd03C\x96\ -\x01\xf56\xf2\xdf\x06\xe1\x9aET}a\x99\xee\xdd'\ -\xb3\x8a\xec8\xf9\xdb2\xb8\xdec\x1b\x5coI\x9e\xb5\ -\xc0\xf1>\xe4e\xe3\x9a\xb0P\xb3I\x86\xda\x03\x1cV\ -\x91\x0d+\xdf\xb5\xa39A\x9d\xcb\xdcG\xe7\xe5\xda\x03\ -Cx@\xbd2\x5c\x1bSz\xfe\xc8\xb7\xdf\xe5\x8aw\ -\xa8\x87\x0a\xfc\xecW\x0c\xa8\xef\x96q\xd6B\xda\xf9\xf2\ -}\x17r[{\xf2\xa6^\xb8N\xe4\xaf\x1c\xd0\x97\x19\ -j\x9bIA\x07Ar[?\xd4\xe1\x5c\xdb\x11\xf7\x87\ -\x96xp\x0aHNR,\xc9~w\x9f\xcc}|\x91\ -\xcc\x09>\x81\xe5\x1e\xd4\xe0+\xf8\x16I\xd5\x84\x95t\ -\x0f\xd2~\x90i.\xff\x96\x97\x1f\xc8o\xfdH\x87\xc9\ -\xf6\xdf\x8ff\x22\x81L\xcb\xcd\xc4\xb5\xc2q\xdf{D\ -/T\xefJ\xbd\x22\xfc!\xfd\x07\xeaiA_\x1e\xa8\ -/\x0c\xfd\x02%\x19\x05q\x11\xf8y\xe5\x90\x0b\xf2Y\ -?\xd4\xfc?4C\xa2\x1eB\xec\xcfad\xfa\xd1Y\ -t\x8fF\xedR\xeb\xba\xf2u?\xa8?\x0c\xb4\xc1\xcb\ -\xcb,\xf3\xf9\xb9\x0f\xce\x88\xaf\x15^\x11\xeb\x07\xba\xb7\ -m\x8f\xf8\xdd\xbd\xd2'\xc6\xe5\x90\xb9\xa1\xeeT\xff\xca\ -\xf2\xea/\xb0G\xd6\xfa\xb8>\x7fY:\x04\x9c\x19\xd0\ -\x19%\xac\x9b)\xfb\xfa\xa1\xcf\xe7\x99\xa5\xa5\xcb9\x1e\ -\x17\xf7m\xa6\xfa\xc6K+\xaf)]*\xfd\xc8,\x5c\ -\x1b\xb8\xb4\x01\xfc\x03j\xc2J\xb0\xc72\xae_\x17\xeb\ -8e\xf5\xba\xc9{\xe9C\xd7\x11\x95C\x9d$\xf4\x8c\ -\x0c\xb7\xe5X\x17\x14\xbb\xdd9\x19\xa2\xfb\xe4\xca{\xfd\ -\xe8\xf9\xd03\x13\xd7\xdd\x1538I1d\x8a\xd3 \ -\x89\xeb\xb8JD\x07\xe8|C\xff\xa1\xd2\x06\xeeMU\ -\xb6<\x94y\xfdY\xd7\xb7\x95:\x8fl\x9f\xed\xf2\xaf\ -\x17\x8cd\x5c\xca\xb6\x81\xb8&\x9f\xb8\x015\x19\xa9^\ -\x83\xa5\xee\x81l\xebG6\x08\xf4\xb7\x12\x8f\xfbXJ\ -G\xaf\xa0z\xc9\xb9\xf7O\x8b}7\xf0A\xa83_\ -\x06\xddI\xbf~\xdc?\xfd\x1fl\x9b\x8a\x1b\xd0C\x07\ -\xfb6*`\xed\xb0.\xb0\x87\xc1>\x16\xbd\x01<2\ -\xf3\xbc\x8d\x98^\xe9rX?\x9c\xfd\x1dC\xb1\xee)\ -nd^\xb2-\xeb\xfd\xd2\x03\xe8\xda\xcc\x1e\xa5\xda\x96\ -\xa0\x8f\x95\xa1\x0f\xca\xb4~\xa8\x09.n\xff\xa1\xb64\ -\xfc\xbb\xfc\xf8\x9e0P\xb2\xa74[\x03\xf7M\x11\xec\ -\xcb!\xd7\xf5kc=\x0etx\x91\xeb\xcfJ!S\ -\x9d\x87W\xe0\xfa\x9ba=\x19\xf4hq#\xef\xc5\xf5\ -\xb2\xce_\x85\xad\x9f\x9b\x99\x8c\xce\xc7\x90\x8a\xad\x8d\x88\ -t\xc2\xbc\x17\xe2{,C\xbf\x95B_jE\xac\xff\ -\xf0L\x5c'_$\xfe\xa1o\xc7\xde\xf1\x15\x8b\x7f\x90\ -?o\xee\x8a_\xffS/\xcaoZ!\xeboJ\xf5\ -\xb8\xcd\x11c\xa3\x22}\x1f\xec\xbb\x8a\xe3\x7f\xba\xd8F\ -\x04;Y\xdc\xc8\x09:^q\xf2\x1f\xfc<\x9bz\x97\ -j\x8fH\xa8\x83I\x07\xb0\xff\xce#K\xd5=\xb3\xae\ -0+N\xfe[Q}G\xf2\x9e_\xc32\x08\xf4\x80\ -b\x80~\x07\xf4\x87m\x9e\x8a\x88\xeb\x80\xee\xe9\xed(\ -v\xed\xd0\xeb\x00\xf7\xe7\xac\xb0\xf5S\x00>\x9fd\xfb\ -\xae\xb8\xdfw\x09\x80~\xbd\xc2\xfdA\xe5D\xfb\xa0\xdb\ -\x16D?\x13\xbb~\xd0=\x93\xcb\xf6\x85\xc8\xbc\xfeB\ -?\x85E\x13\x04\xda\xc5\xfb\x06T\x18\xed\xeb\xe0\x1e\x06\ -\xa5\xf5:\xc1\xb2\xafl?\x88\xe4\xeb\x17\xd7\x0b\x01\xf8\ -\xc0\xd6\xfe\xd8\x07\x0b1-\x0a\xe7\xcd\x8b\xc7\xf7\xe4\xb9\ -\x0fp\xee\xb7\x0fA\xe7+Z\xec\xdaa_\xa0\x7f\x87\ -L\xf6\xefr\x81\x9a\xc7\xd0\xcbl\xa31\xd5\x83P\xf8\ -,\xc39\xbc\x016 \x0f\xf3\xa2\x82\xf8\xb7\xd8\xde\xcf\ -\xbe\xe5L\xa6\x9f\xfc\x0f\xdbi\xb8o\xcc\x0a=\xd9\xf7\ -\x01\xbd\x0bb\x81\xf9Q\xc1\xe2\xd7N\x92\xb8\x973\xee\ -\xe1(\xad\xfd\x8b\xe8\x06\xde\x03\xfa+\xac\x0d\xe2\x91`\ -\xc7C?\xd0\x12{\x8a\xf4+\xe8\x0d&\xfa\x10\xb2q\ -\x0f\x9d\x82\x98\x97d.\xb2\x85Rw\x8d\x94\xde\x16D\ -\xef\x05yS\x9a\xbd\x89\x07\x8fKf]\xb6\x93T\xef\ -*\xbe\xfe\xe5T\xads\xe8A\xc5\xf9\xf9\x19\xd7\xbb/\ -~\xa6\x84\xf4)>\x1f\xfa\xfa\xba\xf49a\x9a\xe4 \ -}qv\xd1\xfeI\x14\xd7\xa6i\x10\xf1P\x88\xf3\x14\ -\xc4\xbc(\xf35\x10[\x95\xac\x17\x97(\xfc\xeb\xe2\x18\ -<\xf4\xdf\x12\x89\xce\x9f\x9f\xa8X4\xff\xd9\xd07\x16\ -l\xc0\xcc\xa4\xb2\x97\x9f\xfa\x9d\xea\x93gI\xf5\x81K\ -;0\x19=\xab;\x89\xed\x93\x12\xfd8\xb4\xa9\xbfC\ -sI\xdb7\x1e\xc7~%\xf1-\xc3\xf9\x93@\xe6\x95\ -N\xff\x88>\xb3\xfd\x0f\x88~~\xbe\x90M\x07}\xee\ -O/.\xd97Y\xc4\xc0=\x12\xd6\xb4\xa3\xe2\xa2X\ -v=\xa7\xe2\xda\xa1\xe7\xc9L\xcf\xf5d\xfa1s\xbc\ -'\xe0\xbb\x05^\x0a=\xa7\xa0\xf7\x94$\xeb\xa66\x98\ -C\xf9\x9aJ\xd7w\xcb^?\xf8\x15\x8e\xcfE\xc8\x16\ -\xad\xd7g]\xdfZ\xb4~\xd8+4OI\x06\xf8\xeb\ -\x8a\xceL\xc7\x92\xfd\xe6\x11\xaf\xa0\xfaI\xe4\x89\xec\x03\ -X\xfa\xe0\xe1\xe7S\xfe\xe5r\xf1X\x91\xf8\x87~s\ -\xdc\x94\xaf\x22\xdfD\xf1\x80\x16\xd4\xd9\x04\xfb\x03\xf1F\ -IF\xa6\xe7\xba\xc23\x8f\xf1\x1f\x17Q\xf6\x97$Z\ -:\x0f\xd3Pao\xb2\xf2\xf1U\x91\xfc\x1fb3\x90\ -g\x80\x07\xf4AK\xfe\x8a}\xdc\xd9\xb7\xf7`\x1a\xc5\ -:\x1d\xf8_\x90\x8e\x07\xfd<\xcb\x9cb^6\xf5=\ -9\xaf\x1f|/9\x81\x87e\xf1\xad\xc3\xdaK\xc6\xbf\ -\xd1\x1c3\xce-\xc7\xb178\x0b)\x8e\xbd\xe9x\x15\ -_\xa7\xd1\xa5}\xdf\xa3%\xeas\xcda\xc5\x90\xc9L\ -\xe3B]H\x1e\xeb\x87\x98`\xe6\xf9\x95\xb2\xf6\x99\xe6\ -\xe7\xcf\x8b\xf87=\x81~Zz\x98\xbe`\xde\x18`\ -\xbf\xd1\xdf\x80\xae\x07}\xb4\xa8\x9e\x8d\x8f\xd0\x99\x89\x17\ -\xe9\x0f\x83\xd8\x18\x15\xe3l&\xf3\xfa\x81\xc7C\x1c-\ -\xc5i \x8ds\x99t*\xfe\xdd\x01\xf1\xf9/\xb4\x9d\ -\x9b\xff\xee\x1e\x96\xf3\x05_#\xb1\xcf\x89\xeaw\xa4S\ -\xc8\x0b\x81\xf7\x00\xdf\x009\x9duu\x13\x99\x17\xe6\x89\ -\xf5\x1e\xf0\x8f\xe6\xdcq)\xc2\x11\x7f\xfd\xa5\xd8\xed%\ -\x06\xe2\xed`\xcf@l\x1cb\xc2\x98\xff\xc8\xeeS\xe7\ -\xe7\xbf\x94\x9e\xff\x04\xeb\xdf6\xa0\x98\x8c\xe7$~\xc6\ -g\xbfd\xbfW\xc1>\x8e\x14\xcd@\xec\x87\xa2\xfd\xa2\ -\xbf\x85\xb3\x94\x89t\xb4b=\xfa\xd09\xc2\xfc?7\ -\x13\xef\x19\xce\x0b@2\x13\xd6\x0c\xba<\xee\x01Z\x98\ -\x03'\xd3\xba\xf9\xc0\xcf\x7f*=\xff\x8d\xbf\xfe\x0cV\ -\xd1\xfaA\x0f*\xb1~Q\xdf\xd5\x15\xdf/\x12~\x07\ -v\x05\xf4\xa8\xdbj\x8ay\x09\xf0\xc8\xd4\xbd\xe3\xb1N\ -\x05{\x86\xf5\x05\xf8[\xbeM)\x9fu\xf3\x81\x9f\xff\ -Vz\xfe#\xce_3\xc1k\xc68\xca\xcd\xc0zh\ -\xf2\x06\x89\xec\x8b\xb2Ad\x8f6\x1dy\x9c\xed\xb2`\ -=K\xc2\xfcW\xe0]\x80\x93\xd4]\xa30\xe0x\xe6\ -J\x89s\x0c\x14\x11\x84\xf3_\xcb\xce\x7f\xb6\x14\xc0\x91\ -\xe2\xf6?\x95\x14\x84\xf3\x9f\xff\xd8\xfc\xf7?\xfd\xfeC\ -\xf5\xfd\x97\xea\xfbO\xd5\xf7\xdf\xc4\xde\x05\xfb\xa3\xee?\ -\x8a\xd8\x83?\xee\xfe\xab\x98=\xf8\xa3\xee?\x97\xb2\x0f\ -\xbf\xdd\xfdw\xba\xcc\x00I\xd7?\xe0\xd7\xd9\xe1\xd7\xd3\ -\xe1\xd7\xd1\xe1\xd7\xcb\xe1\xd7\xc5\xe1\xd7k\xa8\xae{S\ -\xc9\x83I\xfd(\xc4G0\xf5\x93_\x1f\x83_\x07\x83\ -_\xff\x82_\xe7\xc2\x84\x8fw\xa8\x13a\x84\xc0\x9c\x10\ -\xa8\x13\xd1\xaa\xec:\x11\x22\xce\x85\x06\x82A\x086!\ -\xb8\x8e\xe0\x19\x82\x08\x16\xc5\x83\xe5\x09\x11\xf4\xb3\xaf\xd3\ -\xef\x1aD\xbf[b\xba\x171os\x04\x81\x08R\x7f\ -\x01\xaf\x12\x86T\xfa\xdd\xe6\xc2\xeb\x90`\xee=\x10\xf8\ -\x22(\xa8\x84y\x0bC\x01=\x97\x1e\xe2\xd6 4\xf7\ -\xc9\x08b\x14`\xde\xc2\x10C\xcf\xad\xd8\x1aD\xcc\x9d\ -\xa5\x00s\x15\x07,\xe15\xb0\x8a\xd3\x8c\x22\xee\xbb(\ -<\x14\xa3%\x16u>|\x15`n\x92\x82/\xab\xf8\ -\x99\x863.\xdf\xb3Z\xccw\xa6#\xe4O\xd3&%\ -\x8b3\x8b\x85\x02z\xce\xfc\xbd\x0f\x94\xcf\xbc\xe9\xb8\xf6\ -\x0a}\x9cW\x011\xdb\xac+\x0ed\xce\x9dC\xd8\xdf\ -\x9bs\xff\x14\x99\xed\xbb\x1b\xdf\x8f\x06\x7f[a|G\ -:\xbfS \xabH6\xc9\xce\xdf\xd1\xbc!\xef\x16\xe6\ -\x9c\x1bv\x11\xc7vx\x05yb\x82\x15<\x92\x97\x93\ -F\xb2\xbf<%\xb3|\x9c\xb0\x1fU\x8a\xbc\xa0TV\ -\x91\x5c\x95m\xcf\xd1{S\xf7\x8c\xc1\xf1\x8b\xd2\xee\x8f\ -\x88\x1b\xe0\x93\x87|\x10|\xaf\xa0|y\xad|\x9d@\ -J\x1a\xa7b\xad\x10'\x87{~\xb2\x0d\x1e\xce\x9f\x01\ -\x7fn9\xe8\x89\xaf\xcfH5w\xf0\x1fC.\xbaX\ -:\x91b@\xdc5m\xffDI\xd7\xc0\xd7\xc5\xca?\ -\x7f\xeb\xe68\x97\xa9\xb4\x5c3\xbc\xab\xec\x5c\x9c\xe3\xc1\ -\xcf}\xc4\xf7\x02\xca\x88\xe3\xc3\xdf\xe2\x9c\xa0\xb2i\x89\ -\xafG\x96s\xefu\xf0\xbdX\x88?\x8b\x9f\xc3'\x1c\ -\xe7\x85\xbc\x0b\xb8\xab\x02yS\x90\xe3\x02\xb9\xdbp\xcf\ -\x0a\x9f\x95R\xee\xa1\xb2?=\xa2cA\xa5\xae\xe1U\ -\xb9\xe7O\xe7!\x88\x8b\xaf\xc3\x9ar\x82\x8e\x15\xdd\xf7\ -,\x96w(\xc0\xff\xd1\xb9I?2\x13\xf1\xa0'b\ -\xd7\x00\xeb/\xe3\x9e@\xf9\xe7\x8f\x00\xf8\xb9\xc8\xb9g\ -\xa7\x91\x99\x1e\xab\x0b\xf3\x08\xca|\x16\xce{\xeb\x8ep\ -\xe1#\xf2y\x90c\x06\xb9\x87\xa5\xc4\x06\xcb7\x7f\xfa\ -\x0e;'9\xae\xe4\xdc\x0b\xf2\xa9<8\xfc\xb7\xe5\xe0\ -\xe3\xb0\x06\xfb\x7fH\xf6\x87\x07\xa2q\x10|B~\xfb\ -\x8f\xde\x95yi\x9d\xc8\xf7@^(\x8e\xc5K\xa3\x13\ -\xc0\x9d\x97}\x13D\xe6{Q\xb9a\xdd\xc5\xe1\xb3|\ -\xf3\xb7n!\xf2^\x07\xc4\x1f\x0b\xf3H\xca;w>\ -\xac\xd0\xc3:F\x89\x81\xf0\x0a\xb9\x1eb\x9e-\xf9\xfc\ -!/\x1f\xf1\x10\xce\x8f\x92\xe7\x16\xee\xb9\x83\xee S\ -\x5c\x13\xdf\xb5\x9e^\x227\x11\x06\xe8L2\xcf\x1fr\ -\xfa\xb6\x0f\x11y\xaf+\xdbo\xbf\xec\xf1w|o\xae\ -\x1b\xce\xaf,A\x9bO/\x8b\xcb_+\xc7\xfc)\x1a\ -\x15\xa5\xdfd^(\xf3>\x9c\x04@\xe7H\x22\xbe/\ -< G\x0a\xe7\xe3\xc8:\xff\xfd\x93\xf0\xfd\xb1\xe2\xc4\ -\xcf\xa5j<\xc8\xe1>\x09\xce\xef\x12q_\x9d\xfd\xee\ -\x1e\x95\xe7$\xe3\xfc!\x87\x81\x97\x97Ur\xff/\xad\ -\x95\xcf\xfe\xafi\x87u\xea\x12\xfb\x1f\x19 \xfb\xfe\x8b\ -\xc8w\xe1\x8f\x9c{'e\xcfy\xc0\xf9D\xbdpN\ -\x9d\xf0\xa0\xee\xeb\x89\xfc^\xb9\xf8\x0f\xe4W\xe6G\xde\ -\xc1\xb6\x09\xbe\x9b\x02\x80\xfe\x1f\xf2\xb4\x81ve\xe3?\ -\xdad\xfa\xa9\x85\x22\xef\xfbg]\xdb\x22;\xff\x01\x80\ -\xdc\xa1\xf5\x9d\xa9;$p\xb7\x04\xc9M\x0c\x90s\x22\ -\xd3}\x12]L\xdf\x90\x9f/\xf8\x1e\xce\x19\x17:c\xf9\xaf\ -\xfdp\xce\x1b\xf0\xe5\xack\x9b\xb1\x1e\x09:2\xce\xb3\ --_\x9e1}_x\x98H\xb9\x08#\xfb\xe6\x8e\xd2\ -t\xc1b\xf3\x07\x19\x0awKA\x87\x843S\x10\x1f\ -\x85u\xe1bg\x0c\xe9o\xdc\xb4\x84\xe28F\xf6\x17\ -\xd8(\xec\xcfO0\x0d\x17\xe1\xa2\x14|\xd0~\x07\xb8\ -\xeb\x07w\xeaE\x0d\x90e8?M\x92\xf9\xc3>\xec\ -\x1c^\xe2\xee~A\xec+:\x87W\x97\xbe\xdb=\xab\ -T{\x11\xdf\xed\xb6\xd0\xc6x\xc2:\x85\xa0\xbfG \ -O\x15\xceM\xd6\xd5\x8d\xe2k\x05p9d\xe6\xe5\x0d\ -\x92\xdb/X\xbf)\x99\xf7\x0by\x99p\x1f\x8f\xff~\ -\xe0\x05\xe2\x06\xe8q\x90\xef\x96\xb8L\x0b\xd9XVX\ -nfyo\xc2k\x06\xff\x04\xc8o\xb8;\x095\xd3\ -\x00\xb7\xa5\xd9\x91\x14O+3\xef\xbb8\xfd\x8b\xb9\xb3\ -\x02\xb5\xca\xf0\xbe\xc1\xbf?\xbd\x22\xf6\x9d\x9c\x84\xf7\xd4\ -\xfd\x1at\x9e!\x8f\xb1p]H\x87\x84\xfcE|>\ -%\xb9\x13\xf0>\xa4(/\xb8\xf4\xf3\xc3\x8f{\x14\x9e\ -%\xb0A\x0a\xdf\x8b\xecS\xc8\xa3\xc4\xfa\x0d\xdc/X\ -\xdbQ,\xad\xc2\x80\x9cu\x9c\xbf\x86\xd6\x0a\xb8\x97f\ -\xe4\xbf\xbd[\x16\xcd\x0b\x02?fC\xcf_\x07\xf3\x82\ -\xdcG\x1eh\x1d\x0e\xf8lQw\xab\x9a\xe19\xe1\xda\ -\x16\xe9?\xc5\xbe;\xdboo!\x8d\x97w\xfe\xa0\x97\ -@-\x1a\xea~\x94\xc4\xfe\x1f~\xbc\xa9\xe8w\xc0\xff\ -VPwW\xc0\xee\x815\xa4\xee\x1d\x87\xcf\x1b\xf8+\ -3\x5c\x17\x93\xd9\xc8\xae\xc69\xae\x90;)\xe0C\x00\ -\x1e\xce\xbf\xf3\x92\xe9eW\xcal\x05\xe6\xcd\xce\xc3\xf4\ -\x82m\x94\x95\xe5\xce\xff\xe5\xc7\xcaD\xf27\xb8\xc3\x01\ -\xf2\x0f\xe8\x16\xdf\x99\xb5\xd0.\xba\xbb\x079\xaahM\ -\xb0\xb6\xcc\x0b\xab\xf0\x9a\x0a\xf1\x0e\xf2\xe8\xf4b|\x07\ -\x18\xe7}\x0b\x9eSn\x01>\xe7@\x97\xc0\xa3\xa1f\ -a\x92\xad\xa1\xb4\xf6\x03?\xceW\xd2\x7f\x8b\xe6\x01\xbc\ -\x9f?\xc0?YB\xc7,\xbc\xcbW\xb2\xde\x14\xe8\x03\ -8o\xfb\xe0T\x5c_\x09x\x00\x9c#\xb8\xbb\x07\xbe\ -g|\x9f\x91\x9fw,\x9d\xee\xc7\xf7\xdf\x8a\xf6\x9f\xa3\ -\xf9\x00\x0f)\x88\x0dG\xf0\x12\xdf;(\xf7\x1e\x15\xf3\ -\xf7\x0b\x82\x5cj\xa7\xf2\xfd\xe7b\xe3\x17Pk\x09p\ -\x8bA\xb4\xfdPY \x18\xbf(=~T\x91\xf7u\ -\xa5\x07\xe1\xf8\x11?~W\x15zt\x8b\x8a\xdfU\xd9\ -\xf8iU\x8f_\xff\x0e\xf9\x03\xbfC\xfeFU\xcd\x9f\ -\xc1yD\x1a\x04\x11\x03?\xd5\x08\x22\x18~*\xd3\xf9\ -G\xd5Y`2\x0f&\xfc\x87Q\xb4\xaf1\xf0S\xad\ -h\xdf!OK\x9f\xa0z\xfa\x14\xe6ii\x8a\xce\xd3\ -\x12\xc2e\x0d\x16\x95\x1b\xb8\x07\xc1c\x16\xc5\x1f\xbeJ\ -\x091\xf43\xf6\xd0\xcf\xac!L3B\xefn\x8e\xe0\ -\x10\x82\xc4\x0a8w\x89\xf4\xb3\x9b\x8b8K\x00\xffC\ -\x10V\x01\xef\x15\x860\xfa]\xc2\xeb\xfe\x15\xef\x16\x9c\ -\x03\x7f\x1fj\xd0\xfbR\xceg\xe8\x8a\xd6!%\xb73\ -\x0e\xb1\x8ahMr|\xd3\xbayaM|d\x1b\x81\ -\x9f\x18|;\xe9\xc7\xe6P9\x13\xe0\xd3-\xbbfj\ -\x22\xab\x88\xce%{7\xc4\xe4\xd6\x1b\xe1\xbc\x02\x5c\x93\ -\x1ej\x09\x09\xda\xedP\xbf\x22-\x01\xc7\xa2\xc0\xee\xc2\ -\xbam\xe9\xfb\xc1?c\x12\xac[\x07\xfb9\xe0\xbd\x12\ -\xd5\xc1G\xf6\x19\xd8\xcbP\xf3\xae\x949\xf0\xcfw\x99\ -\xefN?6\xbb\x14\x9f\x10W\xec\x9c\xa0\xde\x5c)v\ -?\x9f\xb7\x94\xb2\xe7:\x18\xcf\x90K\x22\xbc>\xf0)\ -\x80\x9f\x11h\x00\xd7@\xf0\xdfO\xf91\x84\xfc?P\ -\x03\x04|\x1c\x22\xf4\xf5\xaf\xa5\xbf_\x17\xfb\x8a\xc0\xaf\ -)8\xc0\x7f\x07\xef\xa4\xfch\xc5\xed'\xb0\xff\xc07\ -Y\xbc\xce\x17\x8f\xcc\xba\xbe\xa5\xfc\xef\x07\xbf\xde\x89y\ -\xc5\xfcz\xb0\x0f\xa9\xb8N\x9a\xb6h\xfa\xa6\xf7\x19h\ -T\xf0n5\xcc9ycOa<\x94\xfe~\xf0k\ -\x85y\x0a\xe0\x99C\xc7d\xca\xb07\xe9\xfc\x1b\xa8g\ -U\xb4\x05<\xea\xfey\xf1\xef\x8a\x7f?\xf8\x0d\xd1^\ -\x82?\x80?\x0a\xbeGIZ\xa7\x86\x8a\x8b\xb9\xfc[\ -\xcc\xf7-\x22^\x22\xfe\xfdP3\xd5i`\xb1\xb8N\ -\xde\x93\xcbd\x19y\x0f\xc5\xe7\x0f~\xcf\x9f\x9f\x04\xce\ -\xc2\x03:\x9e+\xc9\xfb\x9bb\xba\x17\xac\x17\x00\xfeM\ -\xc9\xf9\xab.\xb6\xaf\xe1Ny\xe1\xfe\xc5\xbc\xc0|S\ -\x80nJ\x7f\xff\xf6!\xc5\xea\xa5\xe5>\xf6\x90\xf0\xdd\ -\xf4\xfa\x11\xaf\x14\xc4\x1f\xc4@\x85\xe2I\xa5\xe3\x1f\xed\ -\x1f\xf0\x0f\xa0y\xc8\xad\xc0\xb9\x08\x92\xc6\xa3p\xbd\xbd\ -1\xc5\xf6/\xef\xd9\x15\xe18\x84\x88\xf7\x0b\xd8\xf5\xe8\ -o\x81\x06!\xbf\x07\xe7\xf9@\xcc\x03\x7f_2\xbb_\ -\xd0\xcf\x04CD=\xa4\xa2\xf7\xf3{\xbd ~S\x18\ -[\xa1c\xeb\xe0\x7f\x84\xfc\x0c\x88\xf3\xe2{\xde6\xad\ -K\xc5;U\x93eN1\xdc\x81\x5c\x02?\xa9\xc8\xf3\ -\x0fy~;\x86\xe2\xde2 _\xf2^\x5c\xa3\xe8\xd4\ -B\x9b\xaa\x1b\xc6?\xc2\xe8,A\x1c2\xeb\x86\x13Y\ -8g\xe1\x18\x02:\xf7\xe0\x8b\x17\x96\x15\x98vK\xc6\ -\x80\xa8\xf7C]\x1c\xc4\xbf\x0b\xe7\x9a\xfe\x83\x92\xe3\xe8\ -\x99\xa2r/ 7\x12\xe2\x18\x10\xa7\x009\x0b\xf1\x11\ -\xf0\xbd\xc13\xa0\x86\xa5p\xfe\x16\xf8\xcaD\xf0>\x81\ -\xf5\xf3\xcf:\x95\xc3\x00\xfc\x16\xea\xeb\x80\xfc\xc6\xf2V\ -`\x80\xcf\x1e\xeaxB\x0c\x0c\xd7\x92E<\x11\xf2\x93\ -\xb0\xbfVD\xdc\x01\xf2\xc5\xc0\x17*&g\x8d\xd6\x91\ -\xa9\xda\x80\xb9\xf7]1\xae3\x5c\x17b\xff6\xe4\xba\ -B\x1cVp\x80\x9f\x1bbU\xc9\x1b\x8c\x8a\xf1\x16Q\ -\x03\xea2\xc1\xbe\x94\xc23\xf8\xfa9\xf5\xd9\xba\x05\xf6\ -E\x83\xdf\x16x5\xd0>\xaeOq}+>;\xd0\ -?\x04\xe2\xc4\x98F\x817\x8b\x88\xcd\x81\xdf\x19jU\ -\x80\x5c\x869\x96\x91\xab\xc7\xb7\x0d\x8ax.Z\x1b\xd4\ -\x82\x85\xb8\x1b\xce\x0f\x82\x18(\x9d\xfb\x0by\xa4\xb8\x9e\ -\x14\xf0`\xc8SC4\x9e\xed\xbb\x0b\xe7\xffB\xedJ\ -\x1cs<<\x93\xf2\xc1JVG\x8eo\x97$\x16\xf1\ -\xac\xce\xb8n\x0d\xc8p*\x8fX\xe0\x19\xc2>?\xc1\ -\xfb\xed\x82y\xd5\x92\xf9\x05\xf9\xfagI\xfd[\xfa\xdc\ -\xe5\xf2\x00_\xff\xe6\xdb\x1fO*\xf8}\x82 h\x7f\ -(\x82\xfdUi\xf6ge\xdb\xdf\xccJ\xf4\xc6\xc0\xbb\ -\xc1O\xa1IP\xbe\x8aB?E\x8d\x92~\x0az\xce\ -\x0d\x100\x11\xbcG\x90\x8e C\x0c\xa4\xd3\x7f\xc3\xa4\ -\xbf\xc3\xff\xee9\x04\xdc\x12\xb8\x11\x7fv\xb9\xf4w\xf8\ -\xef\xe5\x96\xf8\x1e\xe4C >\x0du\xe7 \xa6\x07\xf9\ -'B|\x82+0\xe7b\xdf\x858\x19\xd4\xbc\x05\xdd\ -\x06\xc7\x82\xe9\xdeeX\xbe\xad-\xc6{\xf8\xeb-\xe4\ -C\xa0\x8f\xf0\xfbH\x80L\x86\x5c\xd7\xfc\x08\xbf\xc2\xba\ -3\xa0\xeb\x0a\xd4\x92\xe5\xefU\xe1\xf7!\xf7\x0f\x06<\ -\x03\xea\xc9\xe0\xba\xd7\xd6\xcd\xb1\xbc\x80\xb8\x92\x90\xbe\x9e\ -Q\xf8\xfd\xc2zDo\xb0n\x8c\xf3\xe2-\x04\xe2g\ -\x88_S\xb9\x08\xf9T~\x1b\x15\xdf\x11\xf8>U\x1f\ -\x06x<\xe4d\x95\xc8o\xc49\x08]q\xfdH\x88\ -\x9b'Q9*E\xdf\x07\x1b\x0b\xed7\xd4\xc3\xc3}\ -;\x84\xeb\xe5\xf2\xeb\xb1!\x1d\x02rQh\x1eN}\ -\x1fz\x06B\xdcxe\x0b\xec+H?\xb5\x80\xea\xaf\ -\x22X\xbb\x13\xfd?U\x9f\x93\xc4u\x04i}\x1f\x7f\ -\x1f\xf0\x022\x15\xea{\x81M\x08\xf8\x02\x9d\x18\xea\x99\ -\xa6\xee\x1c\x86\xf5\xf5\xec\xdb{q\xcc\x98\x9b\x9e\x88\xf5\ -OZ\xfee\xa0\x9f\xe9`\x93\xc1\x9cqn\x08]\x03\ -\x12\xf2xA\xbe\xc2w\xf89p \xfb\xa0G\x8a\x00\ -\xbdP\xf4\x8c\xf0\x93q\xde\x1a\xe7\x99C>\x04\xe8f\ -\xd0O\x03\xe4 \xc4z\xa1\x87\x16\xc4[\xa9\xbb\x0a\xc5\ -\xe8\x98:\x0b\xcbu\xb9)\xdb\x07Sz\xa0`\xcc\x16\ -\xeau\x01\x9e\xf8=\xe2\x8a\xcb\x1e>\xfdR\xe7g\xb9\ -\x0e\xb7\x1c\xb2I\xf0\xfc\xc8t~e\x1d\xff\x07\x9d\xab\ -\xf3\x85\ -\x00\x00_\x84\ -I\ -I*\x00\x08\x00\x00\x00\x17\x00\xfe\x00\x04\x00\x01\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ -\x00\x04\x00\x00\x00\x22\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ -\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00\x11\x01\x04\x00\x01\x00\x00\x00@T\x00\x00\x12\x01\x03\ -\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ -\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x17\x01\x04\x00\x01\x00\x00\x00\x17\x0b\x00\x00\x1a\x01\x05\ -\x00\x01\x00\x00\x00*\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ -\x002\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ -\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ -\x00$\x00\x00\x00:\x01\x00\x002\x01\x02\x00\x14\x00\x00\ -\x00^\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ -\x00\xfa8\x00\x00r\x01\x00\x00I\x86\x01\x00\x8c\x0d\x00\ -\x00l:\x00\x00i\x87\x04\x00\x01\x00\x00\x00X_\x00\ -\x00s\x87\x07\x00H\x0c\x00\x00\xf8G\x00\x00\x00\x00\x00\ -\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\ -\x00\x00\xf9\x15\x00\x10'\x00\x00Adobe P\ -hotoshop CC 2015\ -.5 (Windows)\x00201\ -7:03:08 11:38:26\ -\x00\x0a\x0a \x0a \ -\x0a pain\ -t.net 4.0.9\x0a \ - 2017-03-0\ -7T11:32:29-08:00\ -\x0a 2017-\ -03-08T11:38:26-0\ -8:00\x0a <\ -xmp:MetadataDate\ ->2017-03-08T11:3\ -8:26-08:00\x0a \ - image/tiff\x0a \ - 3\x0a \ - sR\ -GB IEC61966-2.1<\ -/photoshop:ICCPr\ -ofile>\x0a \ -\x0a \ - \x0a \ - adobe\ -:docid:photoshop\ -:94a27cdb-0433-1\ -1e7-b02d-9f84d9f\ -5a326\x0a \ - \x0a <\ -/photoshop:Docum\ -entAncestors>\x0a \ - xmp.iid\ -:d3f831c7-1693-8\ -248-a9a0-2c4f91d\ -81b49\x0a \ - adobe:docid:\ -photoshop:c7bad1\ -dd-0436-11e7-b02\ -d-9f84d9f5a326\x0a xmp.did:a36\ -4ea4e-2280-ea40-\ -ae73-10beb7a78ae\ -8\x0a \ - \x0a \ - \x0a \ - \x0a \ - <\ -stEvt:action>cre\ -ated\x0a \ - xmp.iid:\ -a364ea4e-2280-ea\ -40-ae73-10beb7a7\ -8ae8\x0a \ - 2017-03-07\ -T11:32:29-08:00<\ -/stEvt:when>\x0a \ - <\ -stEvt:softwareAg\ -ent>Adobe Photos\ -hop CC 2015.5 (W\ -indows)\x0a \ - \x0a \ - \x0a \ - saved\x0a \ - <\ -stEvt:instanceID\ ->xmp.iid:d3f831c\ -7-1693-8248-a9a0\ --2c4f91d81b49\ -\x0a \ - 2\ -017-03-08T11:38:\ -26-08:00\x0a \ - Ado\ -be Photoshop CC \ -2015.5 (Windows)\ -\x0a \ - /\x0a \ - \x0a <\ -/rdf:Seq>\x0a \ - \x0a \x0a \ -\x0a\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \x0a8BIM\x04\ -%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x008BIM\x04:\x00\x00\x00\ -\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x0bprintOutput\x00\x00\x00\x05\ -\x00\x00\x00\x00PstSbool\x01\x00\x00\x00\ -\x00Inteenum\x00\x00\x00\x00Int\ -e\x00\x00\x00\x00Clrm\x00\x00\x00\x0fpri\ -ntSixteenBitbool\ -\x00\x00\x00\x00\x0bprinterName\ -TEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0fpr\ -intProofSetupObj\ -c\x00\x00\x00\x0c\x00P\x00r\x00o\x00o\x00f\x00\ - \x00S\x00e\x00t\x00u\x00p\x00\x00\x00\x00\x00\ -\x0aproofSetup\x00\x00\x00\x01\x00\ -\x00\x00\x00Bltnenum\x00\x00\x00\x0cb\ -uiltinProof\x00\x00\x00\x09p\ -roofCMYK\x008BIM\x04;\x00\ -\x00\x00\x00\x02-\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x12printOutputOp\ -tions\x00\x00\x00\x17\x00\x00\x00\x00Cpt\ -nbool\x00\x00\x00\x00\x00Clbrbo\ -ol\x00\x00\x00\x00\x00RgsMbool\x00\ -\x00\x00\x00\x00CrnCbool\x00\x00\x00\x00\ -\x00CntCbool\x00\x00\x00\x00\x00Lb\ -lsbool\x00\x00\x00\x00\x00Ngtvb\ -ool\x00\x00\x00\x00\x00EmlDbool\ -\x00\x00\x00\x00\x00Intrbool\x00\x00\x00\ -\x00\x00BckgObjc\x00\x00\x00\x01\x00\x00\ -\x00\x00\x00\x00RGBC\x00\x00\x00\x03\x00\x00\x00\x00\ -Rd doub@o\xe0\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00Grn doub@o\xe0\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00Bl doub\ -@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00BrdT\ -UntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00Bld UntF#Rlt\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Rslt\ -UntF#Pxl@b\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x0avectorDatabo\ -ol\x01\x00\x00\x00\x00PgPsenum\x00\ -\x00\x00\x00PgPs\x00\x00\x00\x00PgPC\x00\ -\x00\x00\x00LeftUntF#Rlt\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Top U\ -ntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00Scl UntF#Prc@\ -Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10cropW\ -henPrintingbool\x00\ -\x00\x00\x00\x0ecropRectBott\ -omlong\x00\x00\x00\x00\x00\x00\x00\x0ccr\ -opRectLeftlong\x00\x00\ -\x00\x00\x00\x00\x00\x0dcropRectRi\ -ghtlong\x00\x00\x00\x00\x00\x00\x00\x0bc\ -ropRectToplong\x00\x00\ -\x00\x00\x008BIM\x03\xed\x00\x00\x00\x00\x00\x10\x00\ -\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\x00\x00\x01\x00\x018\ -BIM\x04&\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00?\x80\x00\x008BIM\x03\xee\x00\ -\x00\x00\x00\x00\x0d\x0cTransparen\ -cy\x008BIM\x04\x15\x00\x00\x00\x00\x00\x1e\x00\ -\x00\x00\x0d\x00T\x00r\x00a\x00n\x00s\x00p\x00\ -a\x00r\x00e\x00n\x00c\x00y\x00\x008BI\ -M\x045\x00\x00\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\xff\ -\xff\x00\x00\x00\x00\x00\x00\x00d\x01\x008BIM\x04\ -\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ -\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\ -\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\ -\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\ -\x008BIM'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x018BIM\x03\xf5\x00\x00\x00\ -\x00\x00H\x00/ff\x00\x01\x00lff\x00\x06\x00\ -\x00\x00\x00\x00\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\ -\x06\x00\x00\x00\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\ -\x00\x00\x06\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00\ --\x00\x00\x00\x06\x00\x00\x00\x00\x00\x018BIM\x03\ -\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ -\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ -\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\x03\xe8\x00\x008BIM\x04\x00\x00\x00\x00\ -\x00\x00\x02\x00\x008BIM\x04\x02\x00\x00\x00\x00\x00\ -\x02\x00\x008BIM\x040\x00\x00\x00\x00\x00\x01\x01\ -\x008BIM\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\ -\x00\x00\x0a8BIM\x04\x08\x00\x00\x00\x00\x00\x10\x00\ -\x00\x00\x01\x00\x00\x02@\x00\x00\x02@\x00\x00\x00\x008\ -BIM\x04\x1e\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008\ -BIM\x04\x1a\x00\x00\x00\x00\x035\x00\x00\x00\x06\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00null\x00\x00\ -\x00\x02\x00\x00\x00\x06boundsObjc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ -\x00\x04\x00\x00\x00\x00Top long\x00\x00\ -\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ -\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ -\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ -\x00`\x00\x00\x00\x06slicesVlLs\ -\x00\x00\x00\x01Objc\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x05slice\x00\x00\x00\x12\x00\x00\x00\x07s\ -liceIDlong\x00\x00\x00\x00\x00\x00\ -\x00\x07groupIDlong\x00\x00\x00\ -\x00\x00\x00\x00\x06originenum\x00\ -\x00\x00\x0cESliceOrigin\x00\ -\x00\x00\x0dautoGenerated\ -\x00\x00\x00\x00Typeenum\x00\x00\x00\x0a\ -ESliceType\x00\x00\x00\x00Im\ -g \x00\x00\x00\x06boundsObjc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ -\x00\x04\x00\x00\x00\x00Top long\x00\x00\ -\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ -\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ -\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ -\x00`\x00\x00\x00\x03urlTEXT\x00\x00\x00\ -\x01\x00\x00\x00\x00\x00\x00nullTEXT\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00MsgeTEX\ -T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x06altTa\ -gTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0ec\ -ellTextIsHTMLboo\ -l\x01\x00\x00\x00\x08cellTextTE\ -XT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x09horz\ -Alignenum\x00\x00\x00\x0fESl\ -iceHorzAlign\x00\x00\x00\x07\ -default\x00\x00\x00\x09vertA\ -lignenum\x00\x00\x00\x0fESli\ -ceVertAlign\x00\x00\x00\x07d\ -efault\x00\x00\x00\x0bbgColo\ -rTypeenum\x00\x00\x00\x11ESl\ -iceBGColorType\x00\x00\ -\x00\x00None\x00\x00\x00\x09topOut\ -setlong\x00\x00\x00\x00\x00\x00\x00\x0al\ -eftOutsetlong\x00\x00\x00\ -\x00\x00\x00\x00\x0cbottomOutse\ -tlong\x00\x00\x00\x00\x00\x00\x00\x0brig\ -htOutsetlong\x00\x00\x00\x00\ -\x008BIM\x04(\x00\x00\x00\x00\x00\x0c\x00\x00\x00\ -\x02?\xf0\x00\x00\x00\x00\x00\x008BIM\x04\x14\x00\ -\x00\x00\x00\x00\x04\x00\x00\x00\x0d8BIM\x04\x0c\x00\ -\x00\x00\x00\x043\x00\x00\x00\x01\x00\x00\x000\x00\x00\x00\ -0\x00\x00\x00\x90\x00\x00\x1b\x00\x00\x00\x04\x17\x00\x18\x00\ -\x01\xff\xd8\xff\xed\x00\x0cAdobe_CM\x00\ -\x01\xff\xee\x00\x0eAdobe\x00d\x80\x00\x00\x00\ -\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\x09\x08\x0c\x09\x09\x0c\ -\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\ -\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\ -\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\ -\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x000\x000\ -\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\x03\ -\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\ -\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\ -\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\x00\ -\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\ -\x00\x02\x11\x03\x04!\x121\x05AQa\x13\x22q\x81\ -2\x06\x14\x91\xa1\xb1B#$\x15R\xc1b34r\ -\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\ -\x83&D\x93TdE\xc2\xa3t6\x17\xd2U\xe2e\ -\xf2\xb3\x84\xc3\xd3u\xe3\xf3F'\x94\xa4\x85\xb4\x95\xc4\ -\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\ -\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\ -\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\ -\x055\x01\x00\x02\x11\x03!1\x12\x04AQaq\x22\ -\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$\ -b\xe1r\x82\x92CS\x15cs4\xf1%\x06\x16\xa2\ -\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17dEU6\ -te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\ -\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\ -\xa6\xb6\xc6\xd6\xe6\xf6'7GWgw\x87\x97\xa7\xb7\ -\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5\ -T\x92@\xce\xbe\xdcl+\xef\xa6\xa7d[S\x1c\xea\ -\xe9f\xae{\x80\xf6\xb0\x7fY\xc9)\x8e_Q\xe9\xf8\ -Q\xf6\xcc\x9a\xb1\xf7}\x1fU\xedd\xff\x00Wy\xf7\ -\x22\xd1\x91\x8f\x93X\xb7\x1e\xd6]S\xb8}n\x0ei\ -\xfe\xd3%\xab\x98\xe8?Uq\xf31\x7fju\xfa\x9d\ -\x95\xd4\xb3\x7fI`\xbbp\xd8\xd3\xfc\xdd~\x94\xb7g\ -\xb3\xf3\x1d\xfc\xc7\xf3?\xe0\xd0rzs~\xab\xf5\xcc\ -\x0c\xae\x98\xe73\x03\xa9\x5c\xdc\x5c\xacB\xe2[\xb9\xda\ -Wcw\xeew\xb7\xe9\xfe\xfd\x7f\xcd\xff\x005v\xc4\ -\x94\xf6)$\x92J\x7f\xff\xd0\xf5U\x9b\xd6\xfa\xf6\x17\ -E\xaa\xb7\xe4\x8b,}\xee-\xaa\x9a\x9b\xb9\xee#W\ -}\x22\xc6\xedo\xf5\x96\x92\xe5\xfe\xbd\xfe\x87\x1f\xa6\xf5\ -\x01\xa3\xb0\xf3kt\xf84\xcb\x9d\xff\x00\x9e\x98\x92\x94\ ->\xb7\xf5[\xc4\xe1t\x0c\xab\x01\xfa.\xb6k\x1f\xf9\ -\xed\xcd\xff\x00\xa6\xb3\xba\x9d\x1f\x5cz\x8d\xf4u,\x9c\ -*q\x9b\xd3w_UN\xb09\xbb\x84Y\xea=\x8c\ -s\x9fe\x8d\xf4\xfd\x9f\xcd\xad\xff\x00\xad\xcf\xeau\xf4\ -Km\xe9\xaf5\xbe\xb2\x1f{\xd8@x\xa5\xb2\xeb\x9d\ -S\x8f\xd1s\x7f\xcf\xf4\xfdOO\xf4\x89\xfe\xaa]\x99\ -\x97\xf5~\x8bs\xec\x17\xbe\xdd\xfb^L\xb8\xd7\xb9\xcd\ -\xaf\xd5#\xfc&\xcf\xa7\xff\x00\x82~\x91%6>\xaf\ -\xf5Gun\x8f\x8d\x9fcZ\xcb.i\xf5\x1a\xd9\xda\ -\x1c\xd7:\xb7\xed\xdd\xee\xda\xed\x9b\x96\x8a\xe6?\xc5\xf9\ -,\xe9\x19\x18\x8e>\xecL\xabj\x8f\x01\xedw\xfdV\ -\xf5\xd3\xa4\xa7\xff\xd1\xf5U\x87\xf5\xd3\x0d\xf9\x7fV\xf2\ -\xd9[\x0d\x9606\xc65\xa2O\xb1\xcds\xf6\xb4\x7f\ -\xc1\xef[\x89$\xa7\x92\xa3\xeb\xadY8\x8c\xa2\x9e\x97\ -\x97\xd4\x1ek\x0c\xb86\xb0kq\xdb\xb6\xc1\xfe\x13u\ -n\xfeS\x13\xe3u_\xad\x1e\x8b1\xfa_\xd5\xe6a\ -\xe3\xd66\xd6\xcbl\x0ckG\x95_\xab\xae\xb1$\x94\ -\xe0}U\xe9\x1dK\x01\xd9\xf9]G\xd3\xae\xec\xfb\xbd\ -oB\xa2KX}\xc5\xee\xdc\x7f}\xcf\xfa\x1e\xff\x00\ -\xf8\xc5\xbe\x92I)\xff\xd9\x008BIM\x04!\x00\ -\x00\x00\x00\x00a\x00\x00\x00\x01\x01\x00\x00\x00\x0f\x00A\ -\x00d\x00o\x00b\x00e\x00 \x00P\x00h\x00o\ -\x00t\x00o\x00s\x00h\x00o\x00p\x00\x00\x00\x19\ -\x00A\x00d\x00o\x00b\x00e\x00 \x00P\x00h\ -\x00o\x00t\x00o\x00s\x00h\x00o\x00p\x00 \ -\x00C\x00C\x00 \x002\x000\x001\x005\x00.\ -\x005\x00\x00\x00\x01\x00\x00\x00\x0cHLino\x02\ -\x10\x00\x00mntrRGB XYZ \x07\ -\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00acspM\ -SFT\x00\x00\x00\x00IEC sRGB\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\ -\x01\x00\x00\x00\x00\xd3-HP \x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11cprt\x00\ -\x00\x01P\x00\x00\x003desc\x00\x00\x01\x84\x00\ -\x00\x00lwtpt\x00\x00\x01\xf0\x00\x00\x00\x14b\ -kpt\x00\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\ -\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\x00\x02,\x00\ -\x00\x00\x14bXYZ\x00\x00\x02@\x00\x00\x00\x14d\ -mnd\x00\x00\x02T\x00\x00\x00pdmdd\x00\ -\x00\x02\xc4\x00\x00\x00\x88vued\x00\x00\x03L\x00\ -\x00\x00\x86view\x00\x00\x03\xd4\x00\x00\x00$l\ -umi\x00\x00\x03\xf8\x00\x00\x00\x14meas\x00\ -\x00\x04\x0c\x00\x00\x00$tech\x00\x00\x040\x00\ -\x00\x00\x0crTRC\x00\x00\x04<\x00\x00\x08\x0cg\ -TRC\x00\x00\x04<\x00\x00\x08\x0cbTRC\x00\ -\x00\x04<\x00\x00\x08\x0ctext\x00\x00\x00\x00C\ -opyright (c) 199\ -8 Hewlett-Packar\ -d Company\x00\x00desc\x00\ -\x00\x00\x00\x00\x00\x00\x12sRGB IEC6\ -1966-2.1\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x12sRGB IEC6196\ -6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00XYZ \x00\x00\x00\x00\x00\ -\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccXYZ \x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\ -YZ \x00\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\ -\x00\x03\x90XYZ \x00\x00\x00\x00\x00\x00b\x99\x00\ -\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\ -\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\ -\x00\x00\x00\x00\x00\x00\x16IEC http:\ -//www.iec.ch\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x16IEC http\ -://www.iec.ch\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00desc\x00\ -\x00\x00\x00\x00\x00\x00.IEC 61966\ --2.1 Default RGB\ - colour space - \ -sRGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\ -IEC 61966-2.1 De\ -fault RGB colour\ - space - sRGB\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00,R\ -eference Viewing\ - Condition in IE\ -C61966-2.1\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00,Reference \ -Viewing Conditio\ -n in IEC61966-2.\ -1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00view\x00\ -\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\ -\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01X\ -YZ \x00\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00\ -W\x1f\xe7meas\x00\x00\x00\x00\x00\x00\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x02\x8f\x00\x00\x00\x02sig \x00\x00\x00\x00C\ -RT curv\x00\x00\x00\x00\x00\x00\x04\x00\x00\ -\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00\ -(\x00-\x002\x007\x00;\x00@\x00E\x00J\x00\ -O\x00T\x00Y\x00^\x00c\x00h\x00m\x00r\x00\ -w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\ -\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\ -\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\ -\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\ -\x1f\x01%\x01+\x012\x018\x01>\x01E\x01L\x01\ -R\x01Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\ -\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\ -\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\ -\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02\ -T\x02]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\ -\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\ -\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03\ -O\x03Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\ -\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\ -\x13\x04 \x04-\x04;\x04H\x04U\x04c\x04q\x04\ -~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\ -\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05\ -g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\ -\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06\ -j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\ -\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\ -\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\ -\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\ -\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09\ -d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\ -\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\ -\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\ -\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0c\ -C\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\ -\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\ -\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\ -\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\ -\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10\ -~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11\ -m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12\ -d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13\ -c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14\ -j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15\ -x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\ -\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\ -\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\ -\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\ -\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b\ -;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c\ -{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\ -\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\ -\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A \ -l \x98 \xc4 \xf0!\x1c!H!u!\xa1!\ -\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#\ -8#f#\x94#\xc2#\xf0$\x1f$M$|$\ -\xab$\xda%\x09%8%h%\x97%\xc7%\xf7&\ -'&W&\x87&\xb7&\xe8'\x18'I'z'\ -\xab'\xdc(\x0d(?(q(\xa2(\xd4)\x06)\ -8)k)\x9d)\xd0*\x02*5*h*\x9b*\ -\xcf+\x02+6+i+\x9d+\xd1,\x05,9,\ -n,\xa2,\xd7-\x0c-A-v-\xab-\xe1.\ -\x16.L.\x82.\xb7.\xee/$/Z/\x91/\ -\xc7/\xfe050l0\xa40\xdb1\x121J1\ -\x821\xba1\xf22*2c2\x9b2\xd43\x0d3\ -F3\x7f3\xb83\xf14+4e4\x9e4\xd85\ -\x135M5\x875\xc25\xfd676r6\xae6\ -\xe97$7`7\x9c7\xd78\x148P8\x8c8\ -\xc89\x059B9\x7f9\xbc9\xf9:6:t:\ -\xb2:\xef;-;k;\xaa;\xe8<' >`>\ -\xa0>\xe0?!?a?\xa2?\xe2@#@d@\ -\xa6@\xe7A)AjA\xacA\xeeB0BrB\ -\xb5B\xf7C:C}C\xc0D\x03DGD\x8aD\ -\xceE\x12EUE\x9aE\xdeF\x22FgF\xabF\ -\xf0G5G{G\xc0H\x05HKH\x91H\xd7I\ -\x1dIcI\xa9I\xf0J7J}J\xc4K\x0cK\ -SK\x9aK\xe2L*LrL\xbaM\x02MJM\ -\x93M\xdcN%NnN\xb7O\x00OIO\x93O\ -\xddP'PqP\xbbQ\x06QPQ\x9bQ\xe6R\ -1R|R\xc7S\x13S_S\xaaS\xf6TBT\ -\x8fT\xdbU(UuU\xc2V\x0fV\x5cV\xa9V\ -\xf7WDW\x92W\xe0X/X}X\xcbY\x1aY\ -iY\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\ -\xe5\x5c5\x5c\x86\x5c\xd6]']x]\xc9^\x1a^\ -l^\xbd_\x0f_a_\xb3`\x05`W`\xaa`\ -\xfcaOa\xa2a\xf5bIb\x9cb\xf0cCc\ -\x97c\xebd@d\x94d\xe9e=e\x92e\xe7f\ -=f\x92f\xe8g=g\x93g\xe9h?h\x96h\ -\xeciCi\x9ai\xf1jHj\x9fj\xf7kOk\ -\xa7k\xfflWl\xafm\x08m`m\xb9n\x12n\ -kn\xc4o\x1eoxo\xd1p+p\x86p\xe0q\ -:q\x95q\xf0rKr\xa6s\x01s]s\xb8t\ -\x14tpt\xccu(u\x85u\xe1v>v\x9bv\ -\xf8wVw\xb3x\x11xnx\xccy*y\x89y\ -\xe7zFz\xa5{\x04{c{\xc2|!|\x81|\ -\xe1}A}\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\ -\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\ -\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\ -\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x89\ -3\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8c\ -c\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\ -\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\ -\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x96\ -4\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\ -\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\ -\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0\ -i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\ -\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7\ -n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\ -\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\ -\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2\ -K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\ -\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\ -\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\ -\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1\ -g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5\ -K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9\ -:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd\ -5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1\ -<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5\ -N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9\ -l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\ -\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\ -\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\ -\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea\ -[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\ -\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\ -\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\ -\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\ -\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\ -\x00 P8$\x16\x0d\x07\x84BaP\xb8d6\x1d\ -\x0f\x88DbQ8\xa4V-\x17\x8cFcQ\xb8\xe4\ -v=\x1f\x90HdR9$\x96M'\x94JeR\ -\xb9d\xb6]/\x98LfS9\xa4\xd6m7\x9cN\ -gS\xb9\xe4\xf6}?\xa0PhT:%\x16\x8dG\ -\xa4RiT\xbae6\x9dO\xa8TjU:\xa5V\ -\xadW\xacVkU\xba\xe5v\xbd_\xb0XlV;\ -%\x96\x10\x01\x07ZDA\x1b`\xac\x1bo\x0f\x81\xae\ -A\x10\x0d\xd4\x02\xf9\xbc<\x1eW\xb6\xe3\xc6\xfc\xda\xbf\ -<[vl&\x166\x0a\xc4\x06\x84x\xb2\xb6,F\ -Y\xb6\x04E@\x5c\xa02(\xfc\xcc=\xdd\x99\xb6c\ -\x83<\xb2n\xe8U\x0f]#\x93\x0d\xa7\xc3\x04\xf5C\ -\x01n\xb4\xde\x1e\xd8\x12\xc1\x1b0\xac\xb1\xf1\xb7v7\ -\xf7J\xe6\xce\xf5:\xea\xe02\xb5\x1c:\xc8\xbf\x8cu\ -\x19\xf2O\xe0N`.x\xfd\xe8>\x18\xbd3cc\ -\xac\x9d\xe2vi ~\xe0K\x923?\x8b\x10*b\x1eA\x04\xa8U\x05\x8dH\ -\xc1\xdd\x07\x9aN\x01\xd4e\x9c\xf0\xa9\x82\xd2\x1e\xa7)\ -\xfd\x0d\x9f,\xa0\x0a\xb7\xad\xe1\x105\x11\x88\x00\x94L\ -\x16\x02\x11HP\x81\x80(\xc1\xad\x17\x93\x064d6\ -\xc3g\xf1\xf9\x03G\x09(]\x1d\x8eA\xc4|F\xa2\ -\x90\x91\x94fH\x83\xe1\xcb#\x97\xb0\x11\xff\x02\x22\xe0\ -\x14\x9c\x02\x832\x88|\x18\xca\x83\xe4F\x0d\x08\x08\xc1\ -\xa1-\x90\xe6T\xbc=G3\x0a;\x13\x02Ah\xa1\ -3\x99\x0e`\x08\x05\x22\x06\xdc\xdcR\x18s\x88\xcc\xcc\ -\x1f\x87\xbaP\xbb\x00MhZ8\x86\xf3\xe9\x12\xbb\x00\ -h\x82\xf0|\x9d\xe5U\x0c\x14=\x87\xb9\xd51Q\x88\ -\xa8\x93G\x96\xc0\xed$$\xa2\x0d\x09\xbaT\x97\xf4\xc8\ -\xbd\x1a\x9fI\xa07O\x88b\x0dDR1\x00P0\ -\x88\x1bUIB`U\x83\x05\x1bW\xa1\xa0]d\x0d\ -\x8a\xf5\xa9\xb359\xc8\x5c0r\x15\xb5\xe8`\xdb\x9f\ -\x07jx\x0b\xd8\x81\xd0\x9bc\x98\x12p\x04\x02\xa1\x94\ -\xe1Wg\x85\x8c\x0b\x07XZ\x88 ik\x90A\x95\ -\xb4>\xa2\x13\x89\x864\x1a\xf7\x092\xa2\x077)\x1f\ -=\x0e\x08\x84\xb6h\x11\x12\xf1\x94<\xda\xb5\x83\xb8\x03\ -\x82U\xa8\xael6`Cj\x85\xd1'QQ\x7f\x84\ -\x87\xde\x04y\xa8\x80\x1e\x0c\x04\x0axI\xa1\x14\x82\x01\ -:\x18y\xe2\x07\x05\x9eU\x85s\xa1\xedx\xcc/\x10\ -X7\x07X\xe9\x22\x887F\xf9\x5c]\xe4\x82\x9a\x99\ -\x8d\x0d\xf8\xe8tH!\x92Q\xfcWf\x01\x99\xdb\x99\ -\x9a\x18\xc3\xe0\xf9\x01\xe2\xb6tkT\xa0\xd2\x1e\x7f\x96\ -Z\x08zth\x86*\x98\x04\xe9\x00\xbet+\x1a\xf7\ -\x98\x22\x86\x17\x9a\x88\xaaoj\x85fl\xf7\xe1\x81D\ -\xce(\x18\xef\x90 \x86h\x87A\x86Y\xec\x82\x06\x5c\ -\xa8\x0a;I\x96\x0a\xed\x81\xa2\x18an\x03#\xcc\xec\ -j\xef\x80\x03Y\x01`\xd6\xd8\x0a\x86\xb7D\xa2\x0c\x87\ -\xe8#\xfe[\x89G\x1f\x0c[\xaa\x827\x14X\x04\x1c\ -h\x9e\x86FF0\xdcjr\x84\x9e\xebx\xd3\xe0\xd8\ -\x87\xcc\x88\x86o<@:\x07\xe9\xf2\xaaQ\xe2M#\ -I\xf2\x11\x97'\xca\xf2\xfdj\xb35\x018H\xa6h\ -\x81\xfd\xa8J\x86\x18=\xc8\xc6\xde\x9b$\xf7]\xdf\xaa\ -\xaf\xc0,\x1ckf4X\x86\x17^H\xa4\xcf\x1c\x05\ -\x7f\x81\xe7\xaa!\xf7\xa4M\x85\x1e\xa8\xc9\x96\xc0G\xe9\ -_\xed\x86\xcc\xd9\xd8gz\x1f\x0a\x92\xc8\x85B\x97\xcc\ -g`\xc0\x18\x0e\x86\x1d\xffi\xad^\x95\xa1\x8d9\xf1\ -~\x8a-\xca\x1c\x91\xd3\xd0\xe2\x88s\xc6i\x02\xffD\ -\x03\xf5\x80E\x05\xf4\x80v\x966\x11\x00 !\x83\xda\ -\x06\x0ef`+\x81\xa4\x0c\x1e\xc3\x9e\x01\xc1Rz\x95\ -\xc2\x10L\x83B\xf1\xe3\x90\xb1\xf5\x07\xc7\x84!\x1e\x03\ -e<\x0fHL8\xc7\x0c)\x16*\xa4m\x0a(-\ -\x0b\xc8\xaa\x1e\x01\x8d \x04\x81d@\x08KH\x0e\x04\ -\x802\x1e\x01\xd8h\x06\x1b\xf8>v\xa0=\xdb\x923\ -\xf89\x05\xd3\x91\x0d\xf0\x88lC\x07\x5c\x87\x80kx\ -\x03p&!\x82f\x18\x0ab\x18$\x87 \x8e\x1a\x01\ -epO\x10x\xee\x1aB\xc22\x03\x96-\x13\x8a\xe2\ -x\x86L\xe1\xbcC\xe6\x90\x05\xa2\xec?\x87\x800\x0e\ -\xb0\xc0O\x1bU(\x19\x80\xa5a\xe4\x8b\xa7\x96g\x9e\ -th(\xcb(\x02\xb7\xb0i\x0eA!\x91\x05q\xda\ -\x1c\x82%\xe6\x04\x95\xc3NQ\x90\xb0P*\xc1\x80\x18\ -d\x11>k\xc0\xaeN\x06\xb0E'\xc2\xa9\xaa\x02`\ -\xbd\x1c#Q\xf6\xc5\x96\x00\xeci\xd2<\x86!Q\xce\ -0\x9b \xb3p2d\x9cH\x80\x8f-\xc5\x84\x8a,\ -\x08\xd4~,\x01\xd5\x09\x87\xa0\xe2\x89\x90\x88\xc0\x17\xe1\ -\xb2\x86\x074\x1f\x1fC\xc6e\x0e\xf5\x06<\x10@<\ -\x12\xa0\x9ej\x06\x22\x190\x07\x18\xac\x9b@\xb6e\x0f\ -\x19hL$ N\x9cC\x0d\xe1\x03r\x98\xe8G\xc2\ -\x89\x1dl@y\x8d\xe3\x027!\x10\xd6\x89\x93\xb0p\ -\xcc\x01\xc4\xc0\x87\xdb\x04#i\xf4\x1b\x88\xa3\x8c\x0b\xc3\ -\xa9\x0ct#\xe6m\x0a\xc0\x5c`F\xd4\xdf%\xe0\x9a\ -\x86\x06\x00\x81C\xc4\xf90e\xca\x0cv\xcd\x8a\x10\xb4\ -\xa0\x90\xe8Pc\xb9`N\xb6\x22\xa2GL\xf8\x1e\x84\ -\xd2N\x02\xb0\xd6\x0e\xe9@\x94\x22\x02\xe2\x96\x04\xb1\xc5\ -K\xc5\xb5\x0a%\xce(#\x0a\xf7\x1a\x08\x02\x81\x18\x97\ -\x94vv\x0e\x02\xf6<\x86\xeb\xed\x1d\xe3QiS\xf1\ -\xbb=\x94\x18\xef*\x8ep%\xd4\xd1vD\x06=Q\ -\x0e#N\xaa2\xcadK\x168M\x181\x04\x86Q\ -\xd1\xa5W\xc4ta\x1aS\xd1]\xcd\xd3\x87\x16\xc2\xad\ -i\x1a\xb1\xec\x85\xa2\xf1\xac&\x06%q\x0d5\x5c\x96\ -P\xf0\x80(h`&\x0b\xd0.\x06\x8aZ\xfc\x07\x92\ -P\xfdQ\x8f\xa4\x044\xb1\xaf\x02H`\xe6\xb1B\xfc\ -ZX\xd0\x85]\x09X0\xb2A\xe4\x1bYQ\x0c\xf6\ -\x07\xf8\xfd~\x00\xca\xb1-J\xb20\x1b\xfc\xb3!T\ -\xfcoPP[\x19\xec\x81%\x03\xf6\xac&\xcbp\x8e\ -,\x88\x83Q\x17\x8dM\xaa\x93KBc\x82\xb47\x95\ --\x84b&\xe1\xb6)S\xa0\xf5%\x93DK \xb0\ -U\x5c\xc8\x5c\xe8\xa0\xa0\xbe\x84Z\x92J\x99\x01s\xb2\ -\x19\xe9\xe0\x86.\xe0\xf0\xba\xc4I,\xb0\x8f\xdcG\x82\ -\x9b\xbc\x19\xae\xa1\x0b\x1d7\x8cc)\x91~\x17\xaa1\ -(G`\xb9\x1e\xa3\xf2 -o\x80DH\xe3\x94^\ -\xdc\xe2H\xd7\x97\xb0\xd8\x86\x80\x5c\x86[\xe1Gy\xab\ -\xd9*\x004\xd0WSzrE\xe7\xb4}\x0a\x0fx\ -g\x92E$\x07BC\xa5q\x04>\xb8\x8c@\xd5[\ -\x84\xbd\xf6$\xed\xa4(\xb6\xb6\xdaC\x10\x90\xc8\x8c\x82\ -\xc0\x1c\x92\x8bCg\xc9\x03\x86\x1cb\xe1\xc1\xa9BG\ -\x1d\x82\xa61\x1ar\x10\x86.\xb5\xda\x97\x97\x86\x1a$\ -\xa1\x0f\x1e\x0as\x1c\x16\x08b\xbbP\xc2\xa8\x15O\x89\ -\xf4H\xab\xb0\xa0\xaf!|\x90A!\xce\xbf\xc5@%\ -\xb8$\x82\x19@x\xa4C\x1d\xe0\x9ew#\x041\xe3\ -\xa2J\xb6\x81\x90|Z\xe0\xd0A\x90\xc6-\x90\xc1T\ -\xc0\x1c$\x93\x0ea\xe0*\xdb\x88\xfc\xe8b`\xae\xd2\ -\x12I\xc4\x13\x86\x18\x18\xcf@\xf0\x86R\xf1\xc4-)\ -`\xb8\x09\xb9x\x92\x18\xe0\xaf\x8f\x02\x18\xa8\xb3\x16i\ -^\xd9\xc4 I,\xfd\xa1$\x14\x8b9\xcfbI\x92\ -rY\x0c\x1dzlf=\xb1^\x0d\x88\x18\xff\xd0\x84\ -~Q\x03\x07\xcc\x14\x86m\xe1!V4Z\x04+\x14\ -9\x85\xf9$\xcckem\x92\x0a\x8d\x90\xc1L\xa6$\ -\x97\xac:#\xe0p\x22\xc8e b`\xb2T\xea2\ -<\xbe@\xa2\xf6\x1bRH\x85\xc9`\xbf\x0b!q#\ -\x91\x0d,j\xac\xa0\x0cG\x1c\xa0\xd4\x12.Et\x92\ -{V\x07\xc2u\xae\x16+5\x0d\x8f\xc8\x1f\xa3\x87p\ -\xd3\xd8\xc4u@\x1cH#\x82\xc4\ -i\xcd\x07\x02(\x8a\xef\x08Y@\x08!\x83\xd2\x19`\ -\xf6\x19\xf0\xc4\xb2\xe2nP\x0b\xf6\xfbH\xb6\x91H\xb6\ -k(\xf2\x8a\x07`&\x0e\xc8\x11\x8e\xc2\x19\x0a\x03\x0b\ -\x02&g\x05\xec\x1b+\xf6\xf5g*r#\xc8#e\ -\x00M@\x15\x08\xe8\xe6\x03\xe8\xaa\x8a\xa7\xc8\x81/\xb4\ -k\xc2\x90\x99A\xe0\xb3i\xd8\x1b\xf0\xec\x22\xc0\x02x\ -\xa7\x84?B\x16\xf4a\xb8\x14\xcf@\x17\xc0\xb6 \x8b\ -\xf6\x8f0\x9cEH\xb2D\x00E\x0aF\x9ck\xc8d\ -+\x8a@\x171\x5c\x0a\x0cC\x12b4\x08Qh\x14\ -\xa0I\x16\xe0\xb4\x9a\xe8L\x1c.\xde\x18\xe8\xab\x10\xa6\ -\x9c\xd5C\x88\x99A\xe4\x95\xc1\x80H\x81\x98\x0f\xe6f\ -\x1d\xa6k\x16B8\xb2@`\x0f\x0e8\x10\xe9J\xdc\ -\xa9|\x9e\xc9\x88\xa7\xe1\xb6X\x01\xda\xa3\xa9R\xa8\xc9\ -\xb1\x19\xc2H\xebn\xba\x9cN\xbe+i\xd1\x1b\xe2\xf6\ -\x9d\xc2\xfc\x1bi\x86\x84!\xac\x9e\x89\xec\xc8\xd1\xc4'\ -\xe7`\xb5\xc1ds\x82v\x1f\xe9R\x9b\x040\x1c\xaa\ -(\x9dQ\xfe0!\xb2\x9d\xeaA\x1e\x91\xea+0\xa4\ -\xae\xc1D\xa6\xe7\x1e#jv7\x11\x22\x9d\x81\xbc\x8c\ -!\xaa\x9ef \x1b\xec\xd4\xa92\x12Z\xa4\xf0\xeam\ -\xbe\x09\xa9\x1e\x97\x91\x1c\xa2\xe2\xfc\x1b\x8a\x85\x1e& \ -\x1b\xd1\xfe\xf2\xf2;%\xf2a&2e&ri&\ -\xb2m&\xf2q'2u'ry'\xb2}'\xf2\ -\x81(2\x85(r\x89(\xb2\x8d(\xf2\x91)2\x95\ -)r\x98(\x22\x02\x00\x03\x00\x01\xa0\x03\x00\x01\x00\x00\ -\x00\x01\x00\x00\x00\x02\xa0\x04\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x03\xa0\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\ -\x00\x00\x02\x9e\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a <\ -/g>\x0d\x0a\x0d\x0a\ -\x00\x00\x02\xa4\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Icons / \ -System / Carat /\ - White / Default\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a <\ -polygon id=\x22Tria\ -ngle\x22 fill=\x22#FFF\ -FFF\x22 transform=\x22\ -translate(8.0000\ -00, 8.000000) sc\ -ale(1, -1) trans\ -late(-8.000000, \ --8.000000) \x22 poi\ -nts=\x228 6 12 10 4\ - 10\x22>\x0d\ -\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x05!\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / slice \ -/ standard copy \ -2\x0d\x0a <\ -desc>Created wit\ -h Sketch.\ -\x0d\x0a \x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\ -\x0a \x0d\x0a\ - \x0d\x0a \ - \x0d\x0a\x0d\x0a\ -\ -\x00\x00\x035\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / layer \ -/ default\x0d\x0a Cre\ -ated with Sketch\ -.\x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \ -\x0d\x0a \ - \x0d\x0a \ -\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x04\xa0\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Not active - \ -Default\x0d\ -\x0a Creat\ -ed with Sketch.<\ -/desc>\x0d\x0a \x0d\x0a <\ -g id=\x22icon-/-out\ -liner-/-entity-/\ --Not-active---De\ -fault\x22 stroke=\x22n\ -one\x22 stroke-widt\ -h=\x221\x22 fill=\x22none\ -\x22 fill-rule=\x22eve\ -nodd\x22>\x0d\x0a \ -\x0d\x0a \ - \x0d\x0a\x0d\x0a\ -\x00\x00\x09\x94\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a <\ -g id=\x22Sky-Icon-/\ --System-/-View\x22 \ -transform=\x22trans\ -late(-1.000000, \ --1.000000)\x22>\x0d\x0a \ - \x0d\x0a \ - \x0d\ -\x0a \x0d\x0a <\ -path d=\x22M7.06342\ -091,12.9074237 L\ -7.88176629,12.08\ -90784 C8.2054235\ -6,12.1935613 8.5\ -5066739,12.25000\ -46 8.90909425,12\ -.2500046 C10.754\ -2281,12.2500046 \ -12.2500046,10.75\ -42281 12.2500046\ -,8.90909425 C12.\ -2500046,8.550667\ -39 12.1935613,8.\ -20542356 12.0890\ -784,7.88176629 L\ -13.4371592,6.533\ -68547 C14.319022\ -1,7.17645386 15.\ -2844155,7.968256\ -79 16.3333395,8.\ -90909425 C13.022\ -4727,11.8787923 \ -10.5438307,13.36\ -36414 8.89741345\ -,13.3636414 C8.3\ -7051833,13.36364\ -14 7.75918749,13\ -.2115688 7.06342\ -091,12.9074237 Z\ - M5.69216773,12.\ -1787833 C4.48306\ -461,11.4370945 3\ -.08062505,10.347\ -1982 1.48484904,\ -8.90909425 C4.78\ -014139,5.9393961\ -7 7.25099619,4.4\ -5454713 8.897413\ -45,4.45454713 C9\ -.76312087,4.4545\ -4713 10.8589211,\ -4.865077 12.1848\ -142,5.68613676 L\ -11.2977095,6.573\ -24152 C10.691167\ -6,5.95308542 9.8\ -450802,5.5681839\ -1 8.90909425,5.5\ -6818391 C7.06396\ -042,5.56818391 5\ -.56818391,7.0639\ -6042 5.56818391,\ -8.90909425 C5.56\ -818391,9.8450802\ - 5.95308542,10.6\ -911676 6.5732415\ -2,11.2977095 L5.\ -69216773,12.1787\ -833 Z M8.8358430\ -8,11.1350016 L11\ -.1461965,8.82464\ -811 C11.1472437,\ -8.85266758 11.14\ -77719,8.88081938\ - 11.1477719,8.90\ -909425 C11.14777\ -19,10.1391835 10\ -.1480347,11.1363\ -678 8.91479629,1\ -1.1363678 C8.888\ -36881,11.1363678\ - 8.86204856,11.1\ -359099 8.8358430\ -8,11.1350016 Z M\ -7.3616286,10.509\ -3224 C6.94241377\ -,10.1044297 6.68\ -182069,9.5371166\ -3 6.68182069,8.9\ -0909425 C6.68182\ -069,7.67900503 7\ -.68155792,6.6818\ -2069 8.91479629,\ -6.68182069 C9.54\ -237304,6.6818206\ -9 10.1094814,6.9\ -4005568 10.51514\ -44,7.35580661 L7\ -.3616286,10.5093\ -224 Z\x22 id=\x22Combi\ -ned-Shape\x22 fill=\ -\x22#E9E9E9\x22>\x0d\x0a <\ -polygon id=\x22Rect\ -angle-25\x22 fill=\x22\ -#E9E9E9\x22 transfo\ -rm=\x22translate(8.\ -582044, 8.280986\ -) rotate(45.0000\ -00) translate(-8\ -.582044, -8.2809\ -86) \x22 points=\x227.\ -7813425 0.916636\ -365 9.38274632 0\ -.913653421 9.358\ -23763 15.6483178\ - 7.7813425 15.61\ -58919\x22>\x0d\x0a \x0d\ -\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x05\x1f\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / slice \ -/ Editor only -\ - Saved\x0d\x0a\ - Create\ -d with Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a \ -\x0d\x0a\x0d\x0a\ -\x00\x00\x02\x9e\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a <\ -/g>\x0d\x0a\x0d\x0a\ -\x00\x00\x05#\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / slice \ -/ Editor only -\ - Updated\ -\x0d\x0a Crea\ -ted with Sketch.\ -\x0d\x0a \x0d\x0a \ -\x0d\x0a \ - \x0d\x0a\ - \x0d\x0a\ -\x0d\x0a\ -\x00\x00\x06\x09\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / lock /\ - on\x0d\x0a \ - Created w\ -ith Sketch.\x0d\x0a \x0d\x0a \ - \x0d\x0a\ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\ - \ -\x0d\x0a \ - \x0d\x0a \ -\x0d\x0a \x0d\x0a\ -\x0d\x0a\ -\x00\x00\x15\xa4\ -I\ -I*\x00B\x08\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ -\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ --\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ -$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ -S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ -O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ -\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ -B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ -\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ -o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ -\xc4Sp\xd8\x9cf6\x7f\x8b\xc7drS<\x86O\ --\x97\x93\xe5s\x19\xbc\xe4k5\x9d\xd0hk\xd5\x8d\ -\x16\x97M-\xd2Q\x00:\xbb\xf1\xaf\x5c\x1a}\xecG\ -pQ\x94\x14c\x05\x0e\xc1B;\xa8K\xbe\x0a\xf0\x82\ -\xb8\xf5`\x16|\x15\x9c\x04\xe41\x12\xbc\xb75\xf7?\ -\x94\xd4\xd0\xf8v\xc3?T7 .AJ\x10Q\xbc\ -\x14\x036\x90\xc1\x19pUx\x0f\xcc\xa5K\xfa\x5cx\ -\x0e\x8d\x0b\x9f2\xe9\xd7M\x1f1\xc4\x80\xe1 )\xc1\ -@\x95g\xe7\x93\xcc\x01\x92\x0fI.c+\xafzc\ -\x03&\x0f\x8a\xa44\xc1\x80\xe9\xfb\x07\x91\xa8(\xaa\xbd\ -\x15\xa8(\xe4MC\x07\x12\xa7\x04*\xef\x0a\x8d\x05(\ -\xa3\xfcD\x03\x1d\x11(\xe6\x90\x0fh(\x16\xc4\x1e\xc8\ -)\x0a\x03\xc6\x04i'\x19\x9f*<8\x96F\xe9\x5c\ -@\x9f\x0c\xd1\xe8\x8c\x82\x92h(L\xd1\x1bh(\xdd\ -\x0c\x13E\xc2\x87\x1c\xa5RbS\x1d\xa6q\x10\xfe\x01\ -D\xa7A\x06\x90\x0fM:\x1eD\x032\xe8\xf6@\xcc\ -\x07\xf2s'%\x13\x22O(%\x83|\xd4\x08\x1e\xf3\ -iL\x82\x892\xd2&\xe1\x97\x00D\xec,\x923\xcb\ -\x80\x99L\xcb\x83\xda\x9f\xcd\x09;\xaa3\x85I\x01`\ -\x82\x84\xb3\x92:n9\x00 \xa0KR\x06\xac:\xa5\ -O\xa9-\x02\x91G\xa30\x86\xf2 \xa0m\x14\x93\x9e\ -\x8f\xf8\xa3\x01\x17\x89M*\x92T\xe9\x1d.\x8dPb\ -*@X\xa0\xa0M>\x98\x1f\x0e\x18\x9cL\xd7\x05\xda\ -KT\xa4U\xe2=U\xa2\xb4\xcc~\x82V\x08 \x10\ -\xa99\xa8!X\x82\x96\xef\xf9\xc2\x06Z\x07!\xebi\ -\x9f\xee\x1b`\xd8\x97\xa8(8\xae\x1f\x08(\x9f$\x17\ -H\xf5|\x8e\xdch\xe5\x80\x88>c@\x8e\x7f]\x94\ -=\x8c\xa6\x1c\x00\x15\xe4:\x02\xf7\xa9_0\x103\x15\ -\x83\x1e\x9b\x88(F\xb1\x1f\x17\x90\x04(\x13\x18)r\ -\xcfO\xe9\xf5\xca\x8d\xdc\xe8\x5c\x184\x86\xb0y\xfa`\ -\xd6*a\x18\x05\xe3\x03\xf1\x1f\x8d\x9e\xe8\xf53~\xa0\ -\x97\xfa\xcf\x16\xa0\x81\xfc\x90f\x22\xd8^\x11\x0f(\xb8\ -j\x0dL\x83\xc8)\x92\x82\x83\x0a5\xf4\x00\x0d\x92A\ -.\x94\xe3\xf7\xf2\xdcs\xbf\xe1\xbc\x04\xf5\xa29R3\ -\xa3#\x18h\xdb\xa5\x81\xc7\xce\x9cb\xa0\xa1b\x8e\xe1\ -\x8c\x95\xc12N\xa5\xf9\xeeB\xba\x1a@~\xbc\x1e\x11\ -{\x09\xe6\x87i\x08\xbe\xca\x8bR\xe9\x00\x03A\x96h\ -(\x96\xa6\x14\x12@\xc2\x99\xeb@\x06D\xbc\x16Z\xb0\ -\xa0\xe1\xe5\x886\xce\x8a\xef\xe8\xa5/L\x8f\x88)\x07\ -xc\x00XU\x8d\x91\xf8\xeae\xba\xee\xeb\xc3\x86;\ -\xea\xc4R\x15\xc0\xa2|\xc2%\x1d\xdd!\xed\xd8\x7f\x17\ -\xe8(\x06\xa6\x0c\xb2A8\x9c\xf2\x0c\x13\xfa\x82\x07\x92\ -Ff\xa8o\xb2^\x12\x9e\xbazX\xdb\xa6\xe9\xc6\x92\ -\x0a\x0f\xa9\x87\x0d\x11$\x1f}E\xf9\x9f0\xf2*\x08\ -\x18I\x07\xb75\xa2\xf6i\xe3\xa7A\x91\xa9\x00\xe4\xa6\ -\xb8dN\xac<'\xbdK\x10\xe1\x90:\xb1\x01\xe5\xb4\ -}\x8a\x848|\x93d\xdb\xa2\x00\x00b\x9a\xff\x88\x10\ -\x16(\x9e{La\xdfF\x83\xceY*zF\xdej\ -wt\x8e\xc9\x01\x12T\x9cp\x00\x01\xef\x01\xec\xbc6\ -\xb6c\x8e\x18r`\xa2`G\xbf\x97\xc4O\xd4\x18\xb5\ - \xa1(\xa9\x0d\xd4\x90\x09\x0a\x1b\x0f\x04D\x80\x02\x92\ -\x97>\xdbH\x22\x89)\x87\x0cY\xc0\xb0\x9d\x03\x8aR\ -\x83\x1b)\x08\xa9\x0cT\x90\x0f\x0c\x1a\x99t$\x10 \ -\x15!\xb0\xd5\x81L((\xea\x0d\x92\x00\x05dS\xc5\ -\xa2H\x09\xb0\xc5\x1e\x8a\xf3\xb4T\x87\xb3VEe\x19\ -\xf0\x10\xf5\x067\xc8( *C\x19$\x1b3\x04\xa6\ -F\x11\x05\x07\xa5Ho5g\x22\xec\xa0y>Pj\ -\xe8\x82\x04H\xb8\x92\x22\xf9zS#iD\x15!r\ -\xd5\x82D:(\xcb\xa4D\x12\x00\xeeT\x87\xc2]\x03\ - =|\x0f\xa2\xea\xa6`\xe9\x04O`\x00\x05=C\ -V! X}\x8eE\x14\xd7\x06\xb0>?$\x80\xdd\ -tE5\x81\x048\x16/\x8b\xaa\x83\x08\x04\x82\x19\x94\ -\xe1\xf4\x01e\x00!\x12\x92\x8dd\x94X\x9aC\x8e\x9a\ -\x99\x15$\x14+\x15\x22\x00\x8cM@\xce\xa0\x084\x1e\ -\x11\x09\x85B\xe1\x90\xd8t>!\x11\x00\x19\xa2\x88\x98\ -9\xda%\x19\x8dF\xe1)\xe8\x1ah\xc6\xff\x91G$\ -\x92XD\x89\xff&\x95G\x002\xd0\x01\xa6`\x22~\ -\xcc\xda\x10pl\xaeq\x1aq\x86g\x82D\x0c\xfd\xf5\ -9\xa1P\xe1G\xfa0\x19\xcfInA\xc3\xb4Jt\ -)\xdf-\x00\x8bS5W,\xa2\x9fY\xacVi\xd5\ -(I\x9e\xc0^\x94(k\x96X1\xa6>\x98\xb3Z\ -\xe31C1\xa2\x0e\x97\xb6Q*Ez\xaaeU'\ -\x91\xdc\xe5u\xbb\xe4\x9a\xbd\x0c\xb7'\xe0\xe6\x0b\xfc\xe1\ -\xc4\x0d\xc5\x0a\x91\xb8\xd7\xae\x1e\xd8j\xc9\x03\x1f\x99V\ -\xb53!$\xa9&\xae\xe6xe\xfb3\x1a\xd0hb\ -X\x18]\x18\xfe\x08\xa4\xb9\xd8\xd0q\x8e\x92H\xa5\x8f\ -\x976\x15\x9br\x9a\x0eY\xda\xe9e\xac\xc06\xfcx\ -\x93\xe1>s\xf7\xbd\xdcCG\xc7\x86i\xa1\xc6\xdep\ -q\xf3\xd1d\xc1\xc3\x5c\xa8}H\xd7wKu\xa3\x96\ -\xe3l\x1d%\xdc\x889*C\x8b\xbb\x97\x91\xc6\xf1B\ -\xb9>\xb872#\x925\x0c2\xaf\xc6\x1c\x1c\x19\xee\ -\x84\xca`\xc7H\xf9\x1c\xfd!+r\x0a\x83\x22\xcf|\ -\x02\x83\x9e`\x1c\x16\x1e\x12\xf0q\xa4\xd1=PC\xda\ -\xf7>\x08\xd0\xd1\x0c\x09'\xf46Y \xe0$\x10\x85\ -\x12\xe0|F;\x91q1\xe6\xd29\xc3h\x1c}E\ -\xa4ZP3D\x08I\xf8\x01F\xa2a1\x1c\x17)\ -,(\xf5\xc7\x8f\x14,\x92-\xcd\xa2\x0cP \xe0\x1c\ -d\x84\x1d\x088\xf0\x83\x94\xc8\xf9\xf6\xa25\x0aB\x92\ --\xa0\xe4:\x0e\x0b\xc9\x089\xfa\xc2\xa3\xe5\x22q\x1f\ -;\x93\x0b\xad %P\xc0\xd0,Cg\xf1G\x0fK\ -HQ\xe0\x83\x96\x089q\x1a\x80G\x08\x0b<\x1c\x88\ -A\xf7>\x03\x93P>\x83\x89\x088\xa0\x83\x82\x13r\ -\x12~\xce\xa2\xe4pL\x15\x0a$\xc6\xe5R\x0e<\xca\ -\x9c\xac\x038\xa8\x947\x080\x0bC\xd3\xac9\xf8\xa9\ -\x0b+\xb9X\xaeRM\xddL\xda\xd2\x8a\x22\xddB \ -\xc5:\x0e\x04S\xd5\x92\x88|7(\xfc\xe4\xb5\xd5\x0d\ -\x85t\xd2UJ\xca`4\x86i\x99\xfaW \xe0\xf5\ -gd#G\x12\x0e)\xa3\xe6c\x0f^46\x8b3\ -_,\xcbp(\xa9\x15\x09@\x87d\xdb\xa8A~\x03\ -\xdc\x22\xbb\x84I\x9dm%\xa6\xc8]\x0c=\xaa\xb9\x95\ -Wp\x06^^$B\x0e:[\xd2\xd2\xa4G\x08w\ -\xd0\xec+_\xb2\xe5O\x09@7R\xffv4\x93<\ -5\x0d\x92(8K{7f\xe2\xa47\xae\xe5\xb6\x05\ -\x80\xbfX\x1a\xf9\x82\xb7r\x93V9 \xe3\xdb\xf1\x86\ -\xa9\xecz\x0cC\x5c 9\x1br8\x91\x96.\xb9\xe5\ -\x8bf2\xf7R\xc0\xdaPE \xe2\xd6B\x93\x15\x19\ -0\xebrOU\x9e]\x5c\xe2\xb0\xaa]\x9c\x22h\xa0\ -d\x83\x8d\xc88\xb0\x83\x80\xf6\xf6T\x00\x15PX\x06\ -H\xc1\xc4\xb9\x9b\xa2\xe8\x0b6\xb4\xb2\xe6\x16LT\x0a\ -\xc5\xa7\xd0\xafA\xa5\x01\xfc\xda\xda\x9f\x889\x858\xce\ -\xa5M\x18uh\xae+\xf9\x95\xe8O^\xbd\xb9 \xe3\ -~\xf6\x08\x1e\xfb\xf0p\xa9\x06)C^\x83)\xa85\ -\x0c\x83\x02(\x5c\xe0\x83\x1d\xe89\xc6\x83\x9a\x13\xa9\x9e\ -\xa9\x19\x1a\xb7\x1d\xbc\xa3z\xe5K\xbbs<\xf7?\xd0\ -:\xdc\xdfC\xd2t\xbd2#\xd1\xf4\xfdWW\xd3u\ -=g_\xd8k<\xefc\xdav\xbd_]\xdbw=\ -\xd4'\xd9\xf7}\xf7\x7fn\xf7\x1e\x07\x87\xe2/\x9e\x17\ -\x8b\xe4y4\x7f{\xe5y\xbes3\xe3\xf9\xfe\x97\xa6\ -\x86\xfa>\xa7\xaf\xeb\xfa\xde\xc7\xb7\xe7{^\xe7\xbf\xe2\ -\xfb\xdf\x07\xc7\xdf|_'\xcf\xda\xfc\xdfG\xd7\xd6}\ -_g\xdf\xd2\xfd\xdf\x87\xe7\xcf~_\xa7\xef\x9c~\xdf\ -\xc7\xf7\xe0\xf9\x9f\xe3\xffwo\xea\x00@4\xb4@@\ -\x00\x13\x00\xfe\x00\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\ -\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x01\x01\x04\x00\x01\ -\x00\x00\x00`\x00\x00\x00\x02\x01\x03\x00\x04\x00\x00\x00,\ -\x09\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\ -\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00\x11\x01\x04\x00\x01\ -\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x04\ -\x00\x00\x00\x16\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x17\ -\x01\x04\x00\x01\x00\x00\x009\x08\x00\x00\x1a\x01\x05\x00\x01\ -\x00\x00\x004\x09\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00<\ -\x09\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\ -\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\x00\x10\ -\x00\x00\x00D\x09\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00R\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00S\ -\x01\x03\x00\x04\x00\x00\x00T\x09\x00\x00s\x87\x07\x00H\ -\x0c\x00\x00\x5c\x09\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\ -\x00\x08\x00\x802\x02\x00\xe8\x03\x00\x00\x802\x02\x00\xe8\ -\x03\x00\x00paint.net 4.0\ -.9\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x0cHL\ -ino\x02\x10\x00\x00mntrRGB X\ -YZ \x07\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00a\ -cspMSFT\x00\x00\x00\x00IEC s\ -RGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-HP \x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11c\ -prt\x00\x00\x01P\x00\x00\x003desc\x00\ -\x00\x01\x84\x00\x00\x00lwtpt\x00\x00\x01\xf0\x00\ -\x00\x00\x14bkpt\x00\x00\x02\x04\x00\x00\x00\x14r\ -XYZ\x00\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\ -\x00\x02,\x00\x00\x00\x14bXYZ\x00\x00\x02@\x00\ -\x00\x00\x14dmnd\x00\x00\x02T\x00\x00\x00pd\ -mdd\x00\x00\x02\xc4\x00\x00\x00\x88vued\x00\ -\x00\x03L\x00\x00\x00\x86view\x00\x00\x03\xd4\x00\ -\x00\x00$lumi\x00\x00\x03\xf8\x00\x00\x00\x14m\ -eas\x00\x00\x04\x0c\x00\x00\x00$tech\x00\ -\x00\x040\x00\x00\x00\x0crTRC\x00\x00\x04<\x00\ -\x00\x08\x0cgTRC\x00\x00\x04<\x00\x00\x08\x0cb\ -TRC\x00\x00\x04<\x00\x00\x08\x0ctext\x00\ -\x00\x00\x00Copyright (c)\ - 1998 Hewlett-Pa\ -ckard Company\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00\x12sRGB \ -IEC61966-2.1\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x12sRGB IEC\ -61966-2.1\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ -\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccX\ -YZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\xa2\x00\ -\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\ -\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\ -\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfd\ -esc\x00\x00\x00\x00\x00\x00\x00\x16IEC h\ -ttp://www.iec.ch\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16IEC \ -http://www.iec.c\ -h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00.IEC 6\ -1966-2.1 Default\ - RGB colour spac\ -e - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00.IEC 61966-2.\ -1 Default RGB co\ -lour space - sRG\ -B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00,Reference Vie\ -wing Condition i\ -n IEC61966-2.1\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00,Refere\ -nce Viewing Cond\ -ition in IEC6196\ -6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\ -iew\x00\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\ -\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\ -\x00\x00\x01XYZ \x00\x00\x00\x00\x00L\x09V\x00\ -P\x00\x00\x00W\x1f\xe7meas\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x02sig \x00\ -\x00\x00\x00CRT curv\x00\x00\x00\x00\x00\ -\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\ -\x1e\x00#\x00(\x00-\x002\x007\x00;\x00@\x00\ -E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00\ -m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\ -\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\ -\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\ -\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\ -\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01\ -E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01\ -|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\ -\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\ -\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02\ -A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\ -\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\ -\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x03\ -8\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\ -\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\ -\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04\ -c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\ -\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05\ -I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\ -\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06\ -H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\ -\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07\ -a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\ -\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\ -\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09\ -:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\ -\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\ -\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0b\ -Q\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\ -\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\ -\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\ -\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\ -\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f\ -^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10\ -C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x11\ -1\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12\ -&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\ -#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14\ -'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x15\ -4\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16\ -I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17\ -e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\ -\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\ -\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\ -\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c\ -*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1d\ -p\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\ -\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \ -\x15 A l \x98 \xc4 \xf0!\x1c!H!\ -u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\ -\xdd#\x0a#8#f#\x94#\xc2#\xf0$\x1f$\ -M$|$\xab$\xda%\x09%8%h%\x97%\ -\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'\ -I'z'\xab'\xdc(\x0d(?(q(\xa2(\ -\xd4)\x06)8)k)\x9d)\xd0*\x02*5*\ -h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\ -\x05,9,n,\xa2,\xd7-\x0c-A-v-\ -\xab-\xe1.\x16.L.\x82.\xb7.\xee/$/\ -Z/\x91/\xc7/\xfe050l0\xa40\xdb1\ -\x121J1\x821\xba1\xf22*2c2\x9b2\ -\xd43\x0d3F3\x7f3\xb83\xf14+4e4\ -\x9e4\xd85\x135M5\x875\xc25\xfd676\ -r6\xae6\xe97$7`7\x9c7\xd78\x148\ -P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:\ -6:t:\xb2:\xef;-;k;\xaa;\xe8<\ -'\ - >`>\xa0>\xe0?!?a?\xa2?\xe2@\ -#@d@\xa6@\xe7A)AjA\xacA\xeeB\ -0BrB\xb5B\xf7C:C}C\xc0D\x03D\ -GD\x8aD\xceE\x12EUE\x9aE\xdeF\x22F\ -gF\xabF\xf0G5G{G\xc0H\x05HKH\ -\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\ -\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\ -\x02MJM\x93M\xdcN%NnN\xb7O\x00O\ -IO\x93O\xddP'PqP\xbbQ\x06QPQ\ -\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\ -\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\ -\x5cV\xa9V\xf7WDW\x92W\xe0X/X}X\ -\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[\ -E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']x]\ -\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`\ -W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\ -\xf0cCc\x97c\xebd@d\x94d\xe9e=e\ -\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h\ -?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\ -\xf7kOk\xa7k\xfflWl\xafm\x08m`m\ -\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\ -\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s\ -]s\xb8t\x14tpt\xccu(u\x85u\xe1v\ ->v\x9bv\xf8wVw\xb3x\x11xnx\xccy\ -*y\x89y\xe7zFz\xa5{\x04{c{\xc2|\ -!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\ -#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x82\ -0\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85\ -G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88\ -i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\ -\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\ -\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\ -\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95\ -_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\ -\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\ -\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\ -\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\ -\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\ -\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\ -\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\ -\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1\ -`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\ -\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\ -\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\ -\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0\ -p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4\ -Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8\ -=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc\ -5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd0\ -9\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4\ -I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8\ -d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\ -\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\ -\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\ -\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9\ -F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\ -\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\ -\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6\ -m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\ -\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xff\ -m\xff\xff\ -\x00\x00\x89\xf8\ -I\ -I*\x00\x08\x00\x00\x00\x18\x00\xfe\x00\x04\x00\x01\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ -\x00\x04\x00\x00\x00.\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ -\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00\x11\x01\x04\x00\x01\x00\x00\x00\xfcS\x00\x00\x12\x01\x03\ -\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ -\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x17\x01\x04\x00\x01\x00\x00\x00\xf9\x12\x00\x00\x1a\x01\x05\ -\x00\x01\x00\x00\x006\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ -\x00>\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ -\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ -\x00\x22\x00\x00\x00F\x01\x00\x002\x01\x02\x00\x14\x00\x00\ -\x00h\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ -\x00\xf68\x00\x00|\x01\x00\x00I\x86\x01\x00B\x0d\x00\ -\x00r:\x00\x00i\x87\x04\x00\x01\x00\x00\x00\xf8f\x00\ -\x00s\x87\x07\x00H\x0c\x00\x00\xb4G\x00\x00\x5c\x93\x07\ -\x00\xd0\x22\x00\x00$g\x00\x00\x00\x00\x00\x00\x08\x00\x08\ -\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\x00\x00\xf9\x15\ -\x00\x10'\x00\x00Adobe Photo\ -shop CC 2017 (Wi\ -ndows)\x002017:04:0\ -4 11:01:55\x00\ -\x0a\x0a \ - \x0a \x0a \ - paint.net \ -4.0.9\x0a \ - 2017-03-01T11:2\ -0:20-08:00\x0a \ - 2017-04-04T\ -11:01:55-07:00\x0a\ - 2017-\ -04-04T11:01:55-0\ -7:00\x0a \ - imag\ -e/tiff\x0a 3\x0a \ - sRGB IEC\ -61966-2.1\ -\x0a \x0a \ - \x0a \ - adobe:docid\ -:photoshop:6e5b1\ -c59-1960-11e7-ba\ -e7-e6e7a5cd2814<\ -/rdf:li>\x0a \ - \x0a\ - \x0a \ - xmp.iid:db7b2\ -8e8-30e9-e04f-9f\ -78-916e5c5110e6<\ -/xmpMM:InstanceI\ -D>\x0a ad\ -obe:docid:photos\ -hop:bf3203a1-196\ -0-11e7-bae7-e6e7\ -a5cd2814\x0a \ - x\ -mp.did:8f625742-\ -0048-e64f-ab3c-d\ -4b1a5a27a24\x0a \ -\x0a\ - \x0a \ - \x0a \ - created\x0a \ - \ -xmp.iid:8f6257\ -42-0048-e64f-ab3\ -c-d4b1a5a27a24\x0a \ - \ -2017-03-01T11:20\ -:20-08:00\x0a \ - Ad\ -obe Photoshop CC\ - 2017 (Windows)<\ -/stEvt:softwareA\ -gent>\x0a \ - \x0a \ - \x0a\ - \ - \ -saved\x0a \ - xmp.iid\ -:db7b28e8-30e9-e\ -04f-9f78-916e5c5\ -110e6\x0a \ - 2017-04-0\ -4T11:01:55-07:00\ -\x0a \ - \ -Adobe Photo\ -shop CC 2017 (Wi\ -ndows)\x0a \ - <\ -stEvt:changed>/<\ -/stEvt:changed>\x0a\ - <\ -/rdf:li>\x0a \ - \x0a\ - \x0a \ -\x0a \ -\x0a\x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \x0a8BIM\x04%\x00\x00\x00\x00\x00\x10\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008BI\ -M\x04:\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\ -\x01\x00\x00\x00\x00\x00\x0bprintOutp\ -ut\x00\x00\x00\x05\x00\x00\x00\x00PstSbo\ -ol\x01\x00\x00\x00\x00Inteenum\x00\ -\x00\x00\x00Inte\x00\x00\x00\x00Clrm\x00\ -\x00\x00\x0fprintSixteenB\ -itbool\x00\x00\x00\x00\x0bprint\ -erNameTEXT\x00\x00\x00\x01\x00\x00\ -\x00\x00\x00\x0fprintProofSe\ -tupObjc\x00\x00\x00\x0c\x00P\x00r\x00\ -o\x00o\x00f\x00 \x00S\x00e\x00t\x00u\x00\ -p\x00\x00\x00\x00\x00\x0aproofSetu\ -p\x00\x00\x00\x01\x00\x00\x00\x00Bltnenu\ -m\x00\x00\x00\x0cbuiltinProo\ -f\x00\x00\x00\x09proofCMYK\x008\ -BIM\x04;\x00\x00\x00\x00\x02-\x00\x00\x00\x10\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x12printOu\ -tputOptions\x00\x00\x00\x17\x00\ -\x00\x00\x00Cptnbool\x00\x00\x00\x00\x00\ -Clbrbool\x00\x00\x00\x00\x00Rgs\ -Mbool\x00\x00\x00\x00\x00CrnCbo\ -ol\x00\x00\x00\x00\x00CntCbool\x00\ -\x00\x00\x00\x00Lblsbool\x00\x00\x00\x00\ -\x00Ngtvbool\x00\x00\x00\x00\x00Em\ -lDbool\x00\x00\x00\x00\x00Intrb\ -ool\x00\x00\x00\x00\x00BckgObjc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00RGBC\x00\x00\ -\x00\x03\x00\x00\x00\x00Rd doub@o\ -\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Grn do\ -ub@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Bl\ - doub@o\xe0\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00BrdTUntF#Rlt\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Bld Un\ -tF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00RsltUntF#Pxl@b\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0avector\ -Databool\x01\x00\x00\x00\x00PgP\ -senum\x00\x00\x00\x00PgPs\x00\x00\x00\ -\x00PgPC\x00\x00\x00\x00LeftUnt\ -F#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00Top UntF#Rlt\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00Scl Unt\ -F#Prc@Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x10cropWhenPrintin\ -gbool\x00\x00\x00\x00\x0ecropRe\ -ctBottomlong\x00\x00\x00\x00\ -\x00\x00\x00\x0ccropRectLeft\ -long\x00\x00\x00\x00\x00\x00\x00\x0dcrop\ -RectRightlong\x00\x00\x00\ -\x00\x00\x00\x00\x0bcropRectTop\ -long\x00\x00\x00\x00\x008BIM\x03\xed\x00\ -\x00\x00\x00\x00\x10\x00\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\ -\x00\x00\x01\x00\x018BIM\x04&\x00\x00\x00\x00\x00\ -\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x80\x00\x008\ -BIM\x03\xee\x00\x00\x00\x00\x00\x0d\x0cTran\ -sparency\x008BIM\x04\x15\x00\ -\x00\x00\x00\x00\x1e\x00\x00\x00\x0d\x00T\x00r\x00a\x00\ -n\x00s\x00p\x00a\x00r\x00e\x00n\x00c\x00\ -y\x00\x008BIM\x045\x00\x00\x00\x00\x00\x11\x00\ -\x00\x00\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00d\x01\ -\x008BIM\x04\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\ -\x008BIM\x04\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\ -\x1e8BIM\x04\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\ -\x1e8BIM\x03\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\ -\x00\x00\x00\x00\x00\x01\x008BIM'\x10\x00\x00\x00\ -\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\x00\x00\x018BI\ -M\x03\xf5\x00\x00\x00\x00\x00H\x00/ff\x00\x01\x00\ -lff\x00\x06\x00\x00\x00\x00\x00\x01\x00/ff\x00\ -\x01\x00\xa1\x99\x9a\x00\x06\x00\x00\x00\x00\x00\x01\x002\x00\ -\x00\x00\x01\x00Z\x00\x00\x00\x06\x00\x00\x00\x00\x00\x01\x00\ -5\x00\x00\x00\x01\x00-\x00\x00\x00\x06\x00\x00\x00\x00\x00\ -\x018BIM\x03\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\ -\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x008BI\ -M\x04\x00\x00\x00\x00\x00\x00\x02\x00\x018BIM\x04\ -\x02\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ -0\x00\x00\x00\x00\x00\x02\x01\x018BIM\x04-\x00\ -\x00\x00\x00\x00\x06\x00\x01\x00\x00\x00\x048BIM\x04\ -\x08\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x02@\x00\ -\x00\x02@\x00\x00\x00\x008BIM\x04\x1e\x00\x00\x00\ -\x00\x00\x04\x00\x00\x00\x008BIM\x04\x1a\x00\x00\x00\ -\x00\x035\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\ -\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00null\x00\x00\x00\x02\x00\x00\x00\x06bo\ -undsObjc\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00Rct1\x00\x00\x00\x04\x00\x00\x00\x00To\ -p long\x00\x00\x00\x00\x00\x00\x00\x00Le\ -ftlong\x00\x00\x00\x00\x00\x00\x00\x00Bt\ -omlong\x00\x00\x00`\x00\x00\x00\x00Rg\ -htlong\x00\x00\x00`\x00\x00\x00\x06sl\ -icesVlLs\x00\x00\x00\x01Objc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x05slice\x00\ -\x00\x00\x12\x00\x00\x00\x07sliceIDlo\ -ng\x00\x00\x00\x00\x00\x00\x00\x07groupI\ -Dlong\x00\x00\x00\x00\x00\x00\x00\x06ori\ -ginenum\x00\x00\x00\x0cESlic\ -eOrigin\x00\x00\x00\x0dautoG\ -enerated\x00\x00\x00\x00Type\ -enum\x00\x00\x00\x0aESliceTy\ -pe\x00\x00\x00\x00Img \x00\x00\x00\x06bo\ -undsObjc\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00Rct1\x00\x00\x00\x04\x00\x00\x00\x00To\ -p long\x00\x00\x00\x00\x00\x00\x00\x00Le\ -ftlong\x00\x00\x00\x00\x00\x00\x00\x00Bt\ -omlong\x00\x00\x00`\x00\x00\x00\x00Rg\ -htlong\x00\x00\x00`\x00\x00\x00\x03ur\ -lTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00n\ -ullTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00MsgeTEXT\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x06altTagTEXT\x00\x00\x00\ -\x01\x00\x00\x00\x00\x00\x0ecellTextI\ -sHTMLbool\x01\x00\x00\x00\x08ce\ -llTextTEXT\x00\x00\x00\x01\x00\x00\ -\x00\x00\x00\x09horzAlignenu\ -m\x00\x00\x00\x0fESliceHorzA\ -lign\x00\x00\x00\x07default\x00\ -\x00\x00\x09vertAlignenum\ -\x00\x00\x00\x0fESliceVertAl\ -ign\x00\x00\x00\x07default\x00\x00\ -\x00\x0bbgColorTypeenu\ -m\x00\x00\x00\x11ESliceBGCol\ -orType\x00\x00\x00\x00None\x00\x00\ -\x00\x09topOutsetlong\x00\ -\x00\x00\x00\x00\x00\x00\x0aleftOutse\ -tlong\x00\x00\x00\x00\x00\x00\x00\x0cbot\ -tomOutsetlong\x00\x00\x00\ -\x00\x00\x00\x00\x0brightOutset\ -long\x00\x00\x00\x00\x008BIM\x04(\x00\ -\x00\x00\x00\x00\x0c\x00\x00\x00\x02?\xf0\x00\x00\x00\x00\x00\ -\x008BIM\x04\x14\x00\x00\x00\x00\x00\x04\x00\x00\x00\ -\x048BIM\x04\x0c\x00\x00\x00\x00\x03\xeb\x00\x00\x00\ -\x01\x00\x00\x000\x00\x00\x000\x00\x00\x00\x90\x00\x00\x1b\ -\x00\x00\x00\x03\xcf\x00\x18\x00\x01\xff\xd8\xff\xed\x00\x0cA\ -dobe_CM\x00\x01\xff\xee\x00\x0eAdo\ -be\x00d\x80\x00\x00\x00\x01\xff\xdb\x00\x84\x00\x0c\x08\ -\x08\x08\x09\x08\x0c\x09\x09\x0c\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\ -\x0c\x0f\x15\x18\x13\x13\x15\x13\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\ -\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\ -\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\x10\x14\x0e\x0e\x0e\x14\x14\x0e\ -\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\ -\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\ -\xc0\x00\x11\x08\x000\x000\x03\x01\x22\x00\x02\x11\x01\x03\ -\x11\x01\xff\xdd\x00\x04\x00\x03\xff\xc4\x01?\x00\x00\x01\x05\ -\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\ -\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x01\x00\x01\x05\x01\x01\x01\ -\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\ -\x06\x07\x08\x09\x0a\x0b\x10\x00\x01\x04\x01\x03\x02\x04\x02\x05\ -\x07\x06\x08\x05\x03\x0c3\x01\x00\x02\x11\x03\x04!\x121\ -\x05AQa\x13\x22q\x812\x06\x14\x91\xa1\xb1B#\ -$\x15R\xc1b34r\x82\xd1C\x07%\x92S\xf0\ -\xe1\xf1cs5\x16\xa2\xb2\x83&D\x93TdE\xc2\ -\xa3t6\x17\xd2U\xe2e\xf2\xb3\x84\xc3\xd3u\xe3\xf3\ -F'\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\ -\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf67GWg\ -w\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\x02\x01\x02\x04\ -\x04\x03\x04\x05\x06\x07\x07\x06\x055\x01\x00\x02\x11\x03!\ -1\x12\x04AQaq\x22\x13\x052\x81\x91\x14\xa1\xb1\ -B#\xc1R\xd1\xf03$b\xe1r\x82\x92CS\x15\ -cs4\xf1%\x06\x16\xa2\xb2\x83\x07&5\xc2\xd2D\ -\x93T\xa3\x17dEU6te\xe2\xf2\xb3\x84\xc3\xd3\ -u\xe3\xf3F\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\ -\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6'7\ -GWgw\x87\x97\xa7\xb7\xc7\xff\xda\x00\x0c\x03\x01\x00\ -\x02\x11\x03\x11\x00?\x00\xf4<\xdc\xcc\x96d\x9a\xa9;\ -@\x80\x00\x00\x92O\xc6P\xfd~\xab\xe0\xff\x00\xfbl\ -\x7f\xe4R\xc9\xff\x00\x95\x1b\xfdz\xff\x00\xef\xabU\xce\ -\x0dis\xb4\x00I>A%9^\xbfU\xf0\x7f\xfd\ -\xb6?\xf2)z\xfdW\xc1\xff\x00\xf6\xd8\xff\x00\xc8\xa2\ -UU\xf9\xe0\xdde\x8e\xaa\x92}\x95\xb7\xc0x\xa7{\ -o\xe9\xeem\x82\xc3n9 =\xae\xd4\x89\xee\x12R\ -/_\xaa\xf8?\xfc\xc1\xff\x00\x91D\xc0\xcc\xc8\xb3#\ -\xd2\xb4\xee\x04\x1e@\x04\x11\xfdU\xa4\xb20\x7f\xe5\x03\ -\xff\x00\x5c\xfc\xa9)\xff\xd0\xef\xf2\x7f\xe5F\xff\x00^\ -\xbf\xfb\xea\xb9\x9f\x7f\xa7W\xa6\x1a\x5c\xfb\x81c@\xf3\ -\x11\xfcU<\x9f\xf9Q\xbf\xd7\xaf\xfe\xfa\xacu\x0f\xe9\ -\x18\x9f\xf1\x9f\xc5\x89)\x1e>NU\x14\xb6\xaf\xb2\xbd\ -\xdbg\xdd\xa8\xe4\xcf\xee\xa8\xe5]\x95\x93I\xa8\xe2\xbd\ -\x92A\x9dO\x1f\xd9\x0a\xdfP\xb6\xea\xb1\xf7\xd3\xa1\x90\ -\x1c\xee`x\xa9aYu\x98\xed}\xdfH\xcc\x1e$\ -~k\x92R\xd8y\x02\xfa\xa7ik\x98v\xb8\x1f\x10\ -\xa8`\xff\x00\xca\x07\xfe\xb9\xf9U\x9e\x97\xf4.\xff\x00\ -\x8d*\xb6\x0f\xfc\xa0\x7f\xeb\x9f\x95%?\xff\xd1\xef\xf2\ -\x7f\xe5F\xff\x00^\xbf\xfb\xea?R;,\xc6\xb4\x83\ -\xb1\x8f\x97\x11\xf1i\xff\x00\xbe\xa8f\xe1d\xbf$\xdb\ -P\x90b\x0c\xc1\x04!\xfd\x9b\xaa~\xf3\xff\x00\xed\xcf\ -\xfc\xc9%'\xb7\xa8\xe1[[\xabxyk\x84\x1d\x08\ -N\xce\xa7\x86\xc65\x8d\x0f\x0dh\x00\x0d\xa7\x80\xab\xfd\ -\x9b\xaa~\xf3\xff\x00\xed\xcf\xf6\xa5\xf6n\xa9\xfb\xcf\xff\ -\x00\xb7?\xda\x92\x9b\x1d(\x1fJ\xd7A\x0du\x84\xb4\ -\x9e\xe1V\xc1\xff\x00\x94\x0f\xc6\xcf\xca\x9f\xec\xddS\xf7\ -\x9f\xff\x00n\x7f\xe6H\xb88Y\x15\xdf\xea\xda\x03@\ -\x04s$\x92\x92\x9f\xff\xd9\x008BIM\x04!\x00\ -\x00\x00\x00\x00]\x00\x00\x00\x01\x01\x00\x00\x00\x0f\x00A\ -\x00d\x00o\x00b\x00e\x00 \x00P\x00h\x00o\ -\x00t\x00o\x00s\x00h\x00o\x00p\x00\x00\x00\x17\ -\x00A\x00d\x00o\x00b\x00e\x00 \x00P\x00h\ -\x00o\x00t\x00o\x00s\x00h\x00o\x00p\x00 \ -\x00C\x00C\x00 \x002\x000\x001\x007\x00\x00\ -\x00\x01\x00\x00\x00\x0cHLino\x02\x10\x00\x00m\ -ntrRGB XYZ \x07\xce\x00\x02\x00\ -\x09\x00\x06\x001\x00\x00acspMSFT\x00\ -\x00\x00\x00IEC sRGB\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\ -\x00\xd3-HP \x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x11cprt\x00\x00\x01P\x00\ -\x00\x003desc\x00\x00\x01\x84\x00\x00\x00lw\ -tpt\x00\x00\x01\xf0\x00\x00\x00\x14bkpt\x00\ -\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\x18\x00\ -\x00\x00\x14gXYZ\x00\x00\x02,\x00\x00\x00\x14b\ -XYZ\x00\x00\x02@\x00\x00\x00\x14dmnd\x00\ -\x00\x02T\x00\x00\x00pdmdd\x00\x00\x02\xc4\x00\ -\x00\x00\x88vued\x00\x00\x03L\x00\x00\x00\x86v\ -iew\x00\x00\x03\xd4\x00\x00\x00$lumi\x00\ -\x00\x03\xf8\x00\x00\x00\x14meas\x00\x00\x04\x0c\x00\ -\x00\x00$tech\x00\x00\x040\x00\x00\x00\x0cr\ -TRC\x00\x00\x04<\x00\x00\x08\x0cgTRC\x00\ -\x00\x04<\x00\x00\x08\x0cbTRC\x00\x00\x04<\x00\ -\x00\x08\x0ctext\x00\x00\x00\x00Copyr\ -ight (c) 1998 He\ -wlett-Packard Co\ -mpany\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00\x12sRGB IEC61966\ --2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\ -sRGB IEC61966-2.\ -1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\ -\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ -\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\x90X\ -YZ \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\x85\x00\ -\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\x00$\xa0\x00\ -\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\x00\x00\ -\x00\x00\x16IEC http://ww\ -w.iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x16IEC http://w\ -ww.iec.ch\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00.IEC 61966-2.1\ - Default RGB col\ -our space - sRGB\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.IEC \ -61966-2.1 Defaul\ -t RGB colour spa\ -ce - sRGB\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00,Refer\ -ence Viewing Con\ -dition in IEC619\ -66-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00,Reference View\ -ing Condition in\ - IEC61966-2.1\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00view\x00\x00\x00\x00\x00\ -\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\xcc\x00\ -\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ \x00\ -\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\xe7m\ -eas\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8f\x00\ -\x00\x00\x02sig \x00\x00\x00\x00CRT c\ -urv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\ -\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00-\x00\ -2\x007\x00;\x00@\x00E\x00J\x00O\x00T\x00\ -Y\x00^\x00c\x00h\x00m\x00r\x00w\x00|\x00\ -\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa4\x00\ -\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\ -\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\ -\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01%\x01\ -+\x012\x018\x01>\x01E\x01L\x01R\x01Y\x01\ -`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\ -\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\ -\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\ -\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02]\x02\ -g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\ -\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\ -\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03\ -f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\ -\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04\ --\x04;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\ -\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\ -\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\ -\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\ -\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\ -\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\ -\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\ -\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08\ -F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\ -\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\ -\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a\ -=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\ -\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\ -\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0c\ -u\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d\ -@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\ -\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\ -\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\ -\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\ -\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\ -\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\ -\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\x83\x13\ -\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\ -\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\ -\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\ -\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\ -\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19\ - \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1a\ -Q\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\ -\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\ -\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\ -\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1f\ -i\x1f\x94\x1f\xbf\x1f\xea \x15 A l \x98 \ -\xc4 \xf0!\x1c!H!u!\xa1!\xce!\xfb\x22\ -'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#8#f#\ -\x94#\xc2#\xf0$\x1f$M$|$\xab$\xda%\ -\x09%8%h%\x97%\xc7%\xf7&'&W&\ -\x87&\xb7&\xe8'\x18'I'z'\xab'\xdc(\ -\x0d(?(q(\xa2(\xd4)\x06)8)k)\ -\x9d)\xd0*\x02*5*h*\x9b*\xcf+\x02+\ -6+i+\x9d+\xd1,\x05,9,n,\xa2,\ -\xd7-\x0c-A-v-\xab-\xe1.\x16.L.\ -\x82.\xb7.\xee/$/Z/\x91/\xc7/\xfe0\ -50l0\xa40\xdb1\x121J1\x821\xba1\ -\xf22*2c2\x9b2\xd43\x0d3F3\x7f3\ -\xb83\xf14+4e4\x9e4\xd85\x135M5\ -\x875\xc25\xfd676r6\xae6\xe97$7\ -`7\x9c7\xd78\x148P8\x8c8\xc89\x059\ -B9\x7f9\xbc9\xf9:6:t:\xb2:\xef;\ --;k;\xaa;\xe8<' >`>\xa0>\xe0?\ -!?a?\xa2?\xe2@#@d@\xa6@\xe7A\ -)AjA\xacA\xeeB0BrB\xb5B\xf7C\ -:C}C\xc0D\x03DGD\x8aD\xceE\x12E\ -UE\x9aE\xdeF\x22FgF\xabF\xf0G5G\ -{G\xc0H\x05HKH\x91H\xd7I\x1dIcI\ -\xa9I\xf0J7J}J\xc4K\x0cKSK\x9aK\ -\xe2L*LrL\xbaM\x02MJM\x93M\xdcN\ -%NnN\xb7O\x00OIO\x93O\xddP'P\ -qP\xbbQ\x06QPQ\x9bQ\xe6R1R|R\ -\xc7S\x13S_S\xaaS\xf6TBT\x8fT\xdbU\ -(UuU\xc2V\x0fV\x5cV\xa9V\xf7WDW\ -\x92W\xe0X/X}X\xcbY\x1aYiY\xb8Z\ -\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\x5c5\x5c\ -\x86\x5c\xd6]']x]\xc9^\x1a^l^\xbd_\ -\x0f_a_\xb3`\x05`W`\xaa`\xfcaOa\ -\xa2a\xf5bIb\x9cb\xf0cCc\x97c\xebd\ -@d\x94d\xe9e=e\x92e\xe7f=f\x92f\ -\xe8g=g\x93g\xe9h?h\x96h\xeciCi\ -\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\xffl\ -Wl\xafm\x08m`m\xb9n\x12nkn\xc4o\ -\x1eoxo\xd1p+p\x86p\xe0q:q\x95q\ -\xf0rKr\xa6s\x01s]s\xb8t\x14tpt\ -\xccu(u\x85u\xe1v>v\x9bv\xf8wVw\ -\xb3x\x11xnx\xccy*y\x89y\xe7zFz\ -\xa5{\x04{c{\xc2|!|\x81|\xe1}A}\ -\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\ -\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\ -\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\ -\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\ -\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d\ -1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90\ -n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\ -\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\ -\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\xfc\x9a\ -h\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\ -\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1\ -G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\ -\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8\ -R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\ -\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\ -\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb3\ -8\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\ -\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\ -\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\ -\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2\ -_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6\ -F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca\ -8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce\ -6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2\ -?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6\ -U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xda\ -v\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\ -\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\ -\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\ -\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xeb\ -p\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\ -\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf4\ -4\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\ -\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd\ -)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\x00 P8\ -$\x16\x0d\x07\x84BaP\xb8d6\x1d\x0f\x88Db\ -Q8\xa4V-\x17\x8cFcQ\xb8\xe4v=\x1f\x90\ -HdR9$\x96M'\x94JeR\xb9d\xb6]\ -/\x98A\x00\x930(*l\x0c\x9c\x03\x02\x13`P\ -0\x07?\x02?\xe8O\xe8X\x06 \x01\xa4\x00hO\ -\xfa$\x1a\x93H\x82R\xdf\xf0J}J\x06\xff\xa4\x80\ -\xa9t\xd0\x05\x1a\x07U\xa5\xd5\xeb\xf4\xfa\x8d\x86\x05S\ -\x81S\xe9VhK\xfc\x05o\x01\xd5\xaa\xf6\xca\x8d~\ -\x0fh\xb4\xd2\x00P\x8a\x95\x92\xefK\xb0P\xacW\x9a\ -M\xca\x9dI\xbe]05\xca\xf0\x02\x98\xfe\xc8>\xf2\ -O\xa7\xa6U\xe2\xf3\xcc<2O\xb7\xce\x1aSO\x07\ -\xe8Bcm!\x10\x87\xa7)\x89\xb5C\x00v\xb4#\ -?\x01\x81*\x98\x88]\xf7i\x87\xa4g\xb18+\x1e\ -\xe7\x01\xb7\x8e\xed\xaa\x17:\x15\xfa\x0d\xba\xde\xda\xf7\x98\ -Ln;\x7f\xbe\xe2\xf0!\x99\xec\x0d\xe2\xbbj\xe8T\ -\xab\x18^\x7f6\x9f\x90\xc8uz\xbb>\xcf\x81\xfc\xf8\ -\xf4=\x9c\xbe\xb6\xf3#\xdc\xbaa|VN\x0f\xa3c\ -6\xfa\x94\x04\xbfAb\xcf\xf4\xe0)\xc0\x03:r\x08\ --\xebzc\x03\xc1\x10L\x15\x05>\xe6\x94\x1cc\x13\ -p\x89\x04h\xc2\x86+\xee\x90\x00\xd0\xc8\x10(C\x83\ - \xdb\x0f\x91\x00LD\x05\xc1q,M\x13\xc5\x09B\ -\xa4fE\x85\xf9\x17\x17\x8d\xa6\xfcdk\xb9\x08\xb0;\ -\x1b\x84\x84LtV5A0_\x14\xc8\x12\x0c\x85!\ -\xa2\xe7\xd4\x8c|\x93RI\x00SI\x84|\x8c}\x1f\ -(\xc4\x0a\x01\x07\xb2\xa8\x9aCK\x058\x0f-\x812\ -$\xbd/\xcc\x13\x0a\x04gL\x86\x08\xed3\x8a\x87\x84\ -\xd4v#\x09\x98\x08\x02\x8a\xf3\x88\xda7\xce\x84\x5c\xa7\ -1O\x13\xcc\xf5\x03\x9d\x13\xe9\xc44P\x02\x11\xc9A\ -\x9b\xa8\xc42\x03\x01\x03-\x14?\x0c\x14h\xf0\xe3O\ -t\x8d%I\xa3\xe7\x95,w\x0c\x94\xc8|oS\x86\ -\xad\x0d\x0d\x0d\x95\x09\x0e\xfe\x8b#}!JU\x15M\ -T\x873\x07\x99\xe1E\x0c\xa1\xf1\xb9Y\x9ah\xc4\xb6\ -\x03\x810\xf8\xdaDN\x22\xb8\xdbS\xc4\xae\x13\x9bU\ -\xc8q\xab\xae\xe1\xa1V\x15UV\x9e\x14\xc8\xc8\x1e\x9b\ -\xb6\x89\xa9O\xd1\x03u\xacD\xd7\xb5\xfb\xa4\x89\xaaF\ -\xdd\xbch\x9e\xb7\x09\xe6\xea\xcav\x13\xa8\xe0\x1f\xb7I\ -\xfb;\xb8\x8e\xdb\xb2\xf29Wr\xd4\x82<\xc8E\x80\ -\xe3\xbb\xab+\xa3d9\xd7\xdd\xe3}-\xd0-\xec\xe0\ -X\xc8\xa3\xc6\xe4\xbc\xce\xc5\xde\xbf\xb9`\x04\xdc\x02\x84\ -X\x88T\x05\xe2\x80r8\xca\x9e\x87\x8d\x9c\x1e\xd6f\ -\xe5j\x8b\xd6\xe0MB6\x10\xe2\xc6L7^\xe8\x89\ -\xf9\x95\x9fc\xa6\x5c(\x9a\xf9\x89\x9be!\xf72\x87\ -\x02\x80xN\x15\x80:\xb6\x15 \xed.\x92\x9d\xea\x81\ -\xe8O\x06R\xe9\xad\x97r\xb5\x9b\xae\x17\xa6\x8c\xe0`\ -\xeec\xcdr\xbb\xb9\xa5\x93|\xdd\xb4\x83\xcc\x08\xeb\x80\ -\xa8\xf9\xaf\x93an\xc4\x1cb\xec\xb0\xc7\xb3\x87\x96\x89\ -\xbbi\xe4\x12\xe6GQ\xbf\xa3z8\xfb\x8c\xdb\xa8~\ -i\xef\x06E\x89\xbd\xef\x88>\xb8\x08\x82\xb1\xd1\x12U\ -\x86\x5c(~\x8eY\x9b\xa8\xcc\x1f\xdb\xc6\xd9\xa5[K\ -\x95\xd5y9h\xe8{\xefX\x07\xc6\xa74d\xef\xa8\ -\xbcD\x04\x81a\x0fD\x14\x82\x9d(2\x0a\xf5\x00\xd3\ -Z\x07\x02G\x7f\x5cu\x9d\x9d\x89\xccu\xf6\x8758\ -o\x1a\xd0\xbf:\x8a\x82\x1d\xe8)\x17\x91epa\xe1\ -\x87\x9c\xaa\x1d\x8ccT\xce9Zr\x15\xc6\xdf\x93\x0b\ -\x19E\xb6\x89I\xe7\xc8\xcf\xeb\x88\x1b\xc1\xa7\xbdwh\ -Gz\x08\x02\x82\x07\xc4(|B\x00\x9e\xd2\x06\xc2%\ -\x0e\x04#\x07\xb7\xdcy\x98\xdf\x89n`~\x85\x8b\xe2\ -a\x16_q\xecz{\xbe\xf7|\xf0\x1e\x13\xc4x\xc4\ -5f=p\xce\x10\x06\xd4\x09\x1a+P\x049%H\ -\xdc\x88\xd9\xf7\x80\xc1\x01\x07\x0d!\x8e\xf7I\xe0\x0c\x0b\ -\x90l9\xc1\xb0\xb8\x1d \xc90MC\xc0v\x09\xc8\ -L \xc5l)\x13\x0e\xe9\xce\xbd\xf0(\x22\xa1\x80\xad\ -p\xa0\xc8\x1f6V2\xe2\x81\xfc\x09\x1bP-\xb6\xbc\ -\xe5D\xf4\x1e\x92\xfc\x22\x8e]E9\x976\xdf\x02<\ -I\x0b\x01\xce&\x09\x03\xf4\x04\x80\xbaD=c\x94o\ -\x08X\xac\x19\x86TY\x17\xad\xf1\xd5\x81!\x19\x17\xc5\ -t3p\xe4mf9\x86:\xc7\xc8\xb3!rKf\ -\x01\x90\xc6\xe8\xdd\x9e\xd3\xdcR)L5GQ\x0a\xa3\ -C\x00xRk\xa8~\x08\xe8\xfc\x1cEL\x81\x12\x8a\ -\xaa\x17@\x00c!\xc1\xe9\x1c\x5c#\xd4y6p\xc6\ -\x0f#;\xcddP\xfd\x93\xc6\xd2\x16\xca\xc7\xe0\xfbs\ -\x11\xc5=\x00Y<\x01\x9c\x10\xab\x07\xd2\x8c'=\xd1\ -Y)\xc4\xb0\x88\x95A\xadI\xb7\xf7\x02\x8e\xe1\x9c5\ -\x8c\x86f3<\xc8z\x02V\xb0n[\x09\xc9\xb9\x99\ -70\xe6\x86\xa3\x9cO!\xf6b\x09\xc0\x9f1\xc3\x19\ - \x1dS,r\x8d\x89\x9c3\x9dp\xef\x1dO \xd0\ -\x80\xf8\x9f\x14\x01T\xd9\x06\xb0\xb8\x90\x09y\xbc\x1f\x04\ -\xec\xe1\x10\xa9\xeaWC\x01\x14+d81\x912\xcd\ -W1\xb6\xd4\xdb#K\x91D\x11\xb1\xe9\x91\x18\xde\xe2\ -\xe4\xe2`\x81\xf109\x89\x020\xa5\x87\x90\xee\x15T\ -\x0cJ\x8b\x8a\x0c)\x8f\xa0\xe0\x1b\x0c\x18\xa4\x82z\x1c\ -\x0c\x02e\x11\x0c\x13\x1c'\x867>\x89\x16\xe1K\x0e\ -\xb4l)?A\x80,\x13\x0c\x85E\xe2\xbat\xce\xb2\ -4\xf2!\xc4:\x87\x93\xc6\x1f2H\x1eG$\xc0\xfb\ -cs\x02a$ IM\xc1jL\x14\xc3=\x9c\x11\ -\x02\xa4)j\x00\x8e\x135\x0c?\x8fz\x8c=IC\ -\xdf\x02a\xca\xa6\x09\x00\x95S\xc2\xe1\x14\x7fC\xcd\x0e\ -\x05\x00H;\xaa\xc0\xeaH\x93\x96\x18\xd2W\x11-\x22\ -,\x91\x96\xeeJ \x11\xc7\xab\x0e)\xa2D\x125\xac\ -Z\x83\xba\xdc\x12\x88\x85F\x1e\xe3\xd6\x8d\x87P\xa2{\ -\x86@\xbbD\xd4D&\x05\xe0\xfd_\xc4\xf5=!\xe2\ -\xae\xc2\x09W\x04\x1b\x12$.\x9c\xd3\xa2DIb\x15\ -\x01^\xc5*\x81\x95\x92J\xcfR!=\xdb\xbbyH\ -\x00\xd2\xce\x04\x011g\xc5\xf9\x10I\xe3\xe2\x5c\x84\xa4\ -X3-\x0aC\x096\xac-\x88\x1b\x5c(\x97a\x0a\ -\xa6!V\xda\x02\xa1\xc7m\xc6\xe2@\xab\x93\x9e\xaf\x11\ -\xb7\x90\xc6\xeb\x15,W3\xcd\xcaYg-/\xa2-\ -iE\x22B\xe6\x0b@ys\xc2Y\x10\xb9\x82@:\ -\x0aK\xac#S\xd0w\xbbBR\xda\x05YXC\xe8\ -\x18\xaa\x12\x93\x986\xa4\x08]\x17\xc4`\xafx`\xc0\ -\x1eCa\xe3J`T\x92\x8dw\x16!\x11:cL\ -\xe2:%\x83\x22\xf2\xfe\x0e\xc5\x0e\x01\xc8dg\x0bx\ -\x0c\x18\xae\xa1\xfa\x9e\x98\xa0\x0b\x01\xa2\xbf\x06\x0d\xc8\x9e\ -\x05\x88`\xe9\xc2C\x8c%\xe1P=n\x9a\xeb\x82\x15\ -\x92\xc6E.\x19\x1a\xda.\x09\x15d2\xe4D\x85l\ -L\x1b,q\x09z\xb0N|\xa0\xb3N\x10\xc2\x9e\x1a\ -\x22\x17\xa07\x0a\x8cl$\xd5UL\x0eB8-c\ -\xd0\xe2D \xf03\x99\xc3`g\x22kwc'U\ -\xees\x0e5\xc7\xcbv\xdfK\xe0\x89\x93\x87\x18\xb5\x05\ -\x07\xbc\xac&B\x8eY\x0c\xc4@$e\xd04\xecG\ -`\xe7U@\xbf2\x03\xa9\xc2'F)\x10\x12\x99\xac\ -<\x0a\x0c\xdc\x22r3]\xb1v\xf6\x93\x99l\x96\xb7\ -\xb2m\xc2y\xf6V\xfa\x91($\xf6 \xac\x17D\xa2\ -KB\x0b`u\xa1\xc2I\x0c\xaeC\xd5*\x83\xd0\x18\ -\xdf%p\xbb\xd2Uh\x87\xcaqY*e^qp\ -\x10\x032\x02\xf0w\x8aHDe\xac2\xd8\x8b>\xbc\ -IYr\x88\xfb\x1fR\xfe\xfc\xa0\xbat4\x11\xea?\ -!c\x8bZ\x0d\xb0\xa5\xad\xc13\xdd\x19:\xec}\x9b\ -\x03dB\xe8\xf0\xb0e\xc1\xd0(\xa2jD\xf0o[\ -\xc5\xb8\xcf\x1c\xcb_\x08w|\xae\x22\xbe\xd4\x04\x1e\xcc\ -eD\x13\xa4\x85\xd8\xea\x95\xc42\x84\x8d\x80\xa9\xb7\xc1\ -K\xdd~#\x18|_\xf2\x19M#\xc3dD\xb6*\ -\x18\xe1\xcb}\x9d\xa2.L\xda\x0a\xeezg\xd9\xed\x94\ -\xa3\x85\x9aD\xa3\x0f~\x0fJ/\xb7\x0f\xae\xdf\x0a\x9b\ -\x85\xdd\xee=\xca\x86p\x01\x0b\x9d\xea\xf4\x16\xecg}\ -b\xf7vuc9\xdd\xc7o7'\xb4\xb6Y\x0d\xcf\ -\xf0\x1f@\xa2m\xf80\xf7\xf2#\xe0\x14+\x81pG\ -;\xc1\xb77\x0aZ\x5c3\x87>\x09\x0d\x220\xec\x8c\ -c{\xca[\xe2LL\x15\xb1G\x19\x8d\xc6N\x09\xf1\ -\xdd\xf7\xbfw\xf9\x0b\xdb\xbc\x97q?\x1e\x0e\x01\xb8I\ -\x0a\xe1i\xc7\x86\xa2Y]\x86\xb8\x89\x19\xa5\x0d\xda\xc9\ -\x11w\xd6\x1c:\xc0\x8b\xbb\xa1\xafi\x90m\xab\xbe\x90\ -_\x1f\xe4.\x83\x91\xed\xed\xc1\xd1w')\xe9\x5c\xaf\ -\xa6i\xa9^\x22Ee%\xeb\xa4\x15\xc4\xb7nip\ -\xaf\x9f\x18\xde\xd6_|O\x8e\xc0\x82\xbb\x17A!]\ -\x0f\xb3\xf0^\x8d\xda\x88OK\x0a\xfd5\x05\xee\xc9\xcf\ -\xd4H\xc6\xa2V8\x84\x8a>\xb6\xdf\x8fB\xd0p\x97\ -\xba\xab\x9e\xa0\xed\x04\x81\xef\xf8\xbe\xf4C\xb8\x04zP\ -\x14C5\xa0\xe2\x1br8\x1d\xbd\xd1m\xeb\xc7$\x9e\ -\x00\xa0\x18\x86#!\xbe5\xd5 /\xa6(&WJ\ -\xa1\x10*\xa3\x17s \x94\x00w\xc1>\xef\x88\x92\xe7\ -6\xc4\xff\x08\x81\xbdU\x00\x1a\x02\x0f>$\xc5?\x9b\ -\x86\xben\x1b\x00\xff\xd9\x04\xef\xf5\x04-\xd5\xbe(\x7f\ -\x00\x89\x17?\x8cT\x12\xcd\x8fI9\x84\xec\x1e\x10\xe3\ -\xe3\x91H\xd4\x885A\x1a\xeb\xefl\x92MP%\x00\ -#\x17\xdcO\x1e\x88_\x0a\xdc\xac\x0f`\xb4\x85\x82B\ -\xf1\xc8dp\xa9d\xe2G\x92Y\xef(\x22fB\xcf\ -g\xa2\xf9\x82\x04\xfeh\xe4$(\xac\x10\xa1L\x89 \ -\x8e\x0b/\xf4R\x8c\xdc\x14\x01\x0e\xcda(\x0fBI\ -\x00\x8f \x22\xe5\x98\x9d\xc5\xa4\x92P\x1c\x88%\x86\x22\ -h\x88V+\x94#\xc0q\x06`\x8b\x04\x01u\x03e\ -T<\x01\xfa\xe1\x8fl\x1a\xe2@\xc8\xec\xe8#)\x16\ -\x1eNf\xcf\x0e,\xfe\x223\x02B@\x0fP\x98\x13\ -\x0dn\x0a@\xcf\x07\x06\xf6\x12\xb0\xa8\x0fA?\x0a\xe1\ -\x0e$\x0b\xce\x8b\xeb\xd4x\x8ec\x08\x87\x94\xfd\xb0\x18\ -\xf9%\xae\xfa\xf0 \x00\x0e6\x82\x8f<$\x10@\x17\ -0f\x07\x00\x8c\x22\x08\xb2\x19Ay\x07P\xa4$G\ ->\x01\x8d:\xf5\xa2\x1e\x16\x10\xfc\x13a\x09\x10,\xb6\ -#\xe9\xaa\x02k\xd0\x15\xf0\x82#\x07\x90\xe2\x8c\xf2\xf9\ -\x05p\xef%\xb4\xefk\x8e\xd5MX\x98\x22@I!\ -4\x18\x0f\xf2!\xed\x1a\x01\x8d\x17\x0e\xe2B\xa6\xe0H\ -\x05\x8cl\x15\x08\xd0!\xa1k\x15!D\x0f\xf1X\x0b\ -\xf0~\xceHb\xd90\xcf\x11m\xe3\x08\xca\xc6\xda1\ -#\x05\xac\xfc\xef\xab2\xfe\x82?\x13\x114p\xc2!\ -\x13\xb1?\x14\x02?\x14QH\xc6\xd1N!\x91R\x16\ -\xb1W\x15\xb0\xb4\xe1\xed\xdb\x00\xca\xbeU\xcf\xd9\x16\xce\ -\xf1\x17\x10\xce\xc5g\xb0\xda\xc27\x18\x116!\xd1\x88\ -\xa8\xf1\x8d\x18\xeao\x191L\x22\x11\x9b\x19\xe0\xff\x15\ -\xc2>\xe9\xe9a\x1a\x8f\xd4\x96\xa6<\xe2\xcd\xeb\x17M\ -\xef\x12\x8b\x92\xd5\xa2;\x1c\x11\x85\x13\x84\xab\x13\xd1\xc9\ -\x1c\xa2;\x19\x11K\x19b\x17\x1dqY\x1d\xb1\xa2\xe5\ -\xcaG\x16Nt!p\x87\x08\xae+\x16\xed\xe8\xbe\x91\ -\xf0\xef\x8dT\xcan\xfe#\x91\xfc\x06H\xc7\x1cR\x03\ -\x18\xb2\x08#r\x0d\x19Q\xd5\x15R\x17\x1d\xc2<\xc8\ -\xf2!\x12EX31\xaf\x22\xac\xf4\x92\x90\x1f\x22\x22\ -\x15\x09Q~I1\x83$\x11\x87$r\x06@\xe07\ -(`B\x06r\x8c\x08\x08\x5c\xcc\x01\xcf\x0eax\xcc\ -\x01\xd0A2O\x1d\x22\x1f!Q\xa0#\xf0I\x1eB\ -4\xee\xa7\x17\x0cB$\xc4p\xca\xf9rp!0^\ -\x88\xd1-'q3\x1c\x22\x1b\x1cj\xe6%\x8fJ\x01\ -\x00\x14rP\xcc\x9e\xaab\x84\xc18\x10P:\x11\x09\ -0\x1f\x82Y*2\x10!R\xa9!\x91\xdf\x16\x0bx\ -\xfd0\x11\x11\x90\x8ed\xef6\x1fR9\x17\xc2=#\ -\xf2C-2\x81-bN\xbf\xf0:\x19\x04z\x06\x02\ -0\x18\xb34\x16\xc4\xe8\x0d\xeb\xa2%r\xf9%1\x9d\ -%q^p\x0e\xa1+\x023+G\x19\x1b\x11\x1c\xb8\ -ew\x09\x021,pc\x1f\xb2y-\x02\x19-J\ -\x90$\xe6\xde\x8f\x08\xf4#\xe1\x0f7\xe0\xd0\x85!Z\ -\x13\x22Q42\xa7%R\xaa#\xcf\x1c\xc3q\xff+\ -*\xc0\xf2mI5\xb1!\x0c\xf2u1\xb3k9\xb3\ - \xd1\xd2H$\x22r\x01\xeb\xf8\x17\x81\xd6a\xe2@\ -\xab\x01\xdc\x1d,\xba\x09\x004hbE8\xc2\x1d/\ -\xf2X#\xb1\x0ax\x10\x0b'\xcd\xde\xe2qk&\x93\ -\xa5\x1bR\xc2!\x13e\x1f\x92=:\xf3\xe9$S\xb5\ -(\x22C\x0d\xf0j\xcdpn$\xe4\x00\x0a`N\x1c\ -4\x1c\x1bBI=\x91Q9\x13\x019Q\xa4\xf1\xf3\ -P#\x12'\x0c3X\xfd\xc9\xe55\xf3\x10#jb\ -\x93r;\x1b\xf4\x011\xf3o23r$@\x83E\ -\xa0\xa2\x80\x02P\xc8,\x86\xc8\xa2GBQ\x99B\x93\ -\xde#\x91\xe0\xee\x10J\x22\xcf$VS\xa3C\xd1\x1f\ -?R`\xe3K\x91\x06\x13\xfdD\xd2\xcf;\x14S@\ -s$$J\x1c\x04\xe0`\xa8\x01J\x19\xe2P\xc5\xe0\ -&\x1e4\xb4\x1d\xd4#\x1c\xf2\x0f4Q\xd9G\x227\ -\x10\xb1\x0f\x11\x22.\xb7\xe7\x95\x01r\xbbC\xee/\x17\ -3b\xe7\x8d\x01\x0dr\xcd'\xb4P!sp$\x84\ -\xa6\x15\xd4\xf4\x1b@9O\xa0F$\x0bN\x17\xef\x9e\ -\x08S\x8bK\xd2Q8\xf3G9\x22;%\xc8\x05?\ -b\x0fCe\x9f+\x82#+\xc9t[3\x131p\ -'?\xf4\x97@3\xb3 T\x9e$\xa0\x8bT \xad\ -7\xe1\x0e\x15\x228\x8f\x88&\x1a\x15T\xcd\x22OF\ -\xd2\x13G\x13J\x02\xac\xe70\x8e\xa42\xcb\x81H0\ -\xc7Hr.\xefR2!\xe7\xaas\x01\xabX!\x95\ -\x12\xf4O'\xf4\x9dEbR\x0cU\x94\x0f@\xd3Y\ -\xa1\x08\xc5#\xef\x02\xa0\xcc\x16\x95\xa8\x142\xf7P\xd2\ -\xa5=\xb5a*\xd4.\xc9\x00{\x16umM5q\ -MuuM\xb3\xa9\x17\x91\xbc#S\x1dX\xd5=Y\ -\x02Xda\x0c\x8f\x00\xf2\x22\x11\x02\x10\x80\xcb\x0f\xc1\ -`\x13\x82aU\xd2\xfd[t-!\xc7\x83L\xc2-\ -\x16\x85cRB!R\x8cK,\x14\x8a!\x95~\x88\ -\xb5\x82\x1a\xb5\x87NsmN\xd4T&\x00\xbfb\xe0\ -\xecWL\xe0!\xe0\xf1c\xa0\xad;\xe1W_u\xb1\ -/\xa2\x13=\xd2\x1a\x85\xf1\xa6\x86\x8b\xdc\xd9\xcaW?\ -4@z5.\xdf3\x196\x957N\xa2\x15N\xe2\ -_b\xe0\xbfc$?cb\x1dc\xa0\xf1c\xeb\xf9\ -d\x22__\x96K_\xd5\x16\xc3$v\xeeU\x1c \ -\xd6\x08\x07\xd6\x0c!\xef\xdfWt\xdcH\xa4\x8e\xc5\x94\ -K]U\x8b \x15\x8fb\xd61cB!h\x16\x84\ -\x17\x96\x88%\xd6\x8c!\x16M0'\x01Vl\x92#\ -p\x86\x91\xc9!\x5cu'M\x93`\x22\xf4F\x88\xb5\ -\xd2#5\xd7k\x95\xda&\x0a\x9e\x09@\xb8\x10W\x04\ -\x14b Y\xc0yUA\xa1U\x96\xcddt\xc14\ -\x91\x084T\xcbV\x91\x14\xde\x16\x0bC\xa2&}h\ -\x1cn6b\xef\xd6gST\xe9]\x93\xb6%\x8f\xec\ -\xb0\x81V\x1a\xc8\x9e\x8a\x22\x0ev\xe1\xaa\xc0`\xb6\x06\ -P\x05Z\xf1GK\xf5\x11L6N\x80\x12_W\xad\ -\x99>\xd7+?\x14\x855\xc1\x11n\xa2-:\xb6i\ -s\xf6\xf9t\x22^\x04\x17\x90\x05\x07$t@B\x05\ -!\xady\xe1\x96\xd0\x81$\x0e\xe9\x96\x1dA\xcb*\x17\ -\x19vw\x1c#\xd4\xc9\x0b\x96\x04\x22\xb6\x9fj\x22\x1c\ -\xd4\xc5\xaf\x1e\xf4\xdf\x1fT\x91,\xb3\xadf\xb7A@\ -\x92J#\x16\xce \xf6\xd3%\xb6\x94pi\xd2\x07\xd0\ -\xcfG\xf4\xd5nu\xcb|\xd6\xacJ\x0f\x9e\xfa4\xe5\ -}w\x89@V\xfb}\xe25~\x22\x0d~b:\xfc\ -\xf7\xbe\x22\x97\xf5nV\x0em\xc5D\xca\x0f\xe42f\ -7a\xf6#\x80\x96'f\xf6+\x81\x023\x81B\x0b\ -\x81\x8299x:\x22\xb0\x87Y@\xc4\x07i\xdf\x05\ -X+sMR\xd5q\xf7}W\x87\x84\xe2\x11g\x18\ -@\x22\xf8D \x98H#r\xafeO\xd4\x82n\xab\ -&\xa6H\x88\x15\xcf#veS4\x95\x80\xb5;x\ -\xd8r\x22Xv xz#Tw9\x98\x81\x01\x15\ -o\x1e\xb2-\x5c\xd6\x9a \xb7\x84#\x8b>\x13\x01|\ -\xb3\x80h\x08\x22 \xbb@\xee\x0a\x81\xf3\x8da\xf1\x89\ -\xe2.\x03X\xe0\x04\x04\xce\x0e\xc9\x06!\xf5\xa8\x16\x81\ -@\x10\x18\xf4\x0c7j\xa4x\x1e\x22sU|B\x1b\ -jx\xb9ab\x17\x8b\xe26\x94,^\x0a\x98\xdcO\ -\x0b\xac\x14\x81\x1a\xba`\xe9d\xee!C4\xcf\x5c0\ -\x15\x82V\xa5n\x94C\x82\xf7\xd1,\x8aj#\xa9\xf6\ -\x89\xb9\x1aLM\x86\x0a-\x83\x92\x96S\x00\xf3S&\ -N\xedr\xd5\xc8\x92x\x8a\xcf\x97qH\xcf9N(\ -,$\x0c\x12\x01\xb2\x0e\x039|\x03\xf9JH\x17\x9e\ -\x1a\xc1\x97\x85@u/5b\xc3V\x99\x90\xc2\x15M\ -\x193\x8bMJCMO\x93\xa23n\xe5co\x22\ -8\x06\xb9\xb4\x08A'\x9b\xa1qC\x88)\xc2\x0aS\x82\x81\ -*\xcf\xcf\x18\x0b\xfcH\x06P\x09\x8c\xae\xbd\xc9\xbb\x9e\ -\xa1>\x0a\x91\xa3\x05\x83\x87\xdc\x1cG \xa2\xaa\xf4V\ -\xa0\xa3\x90i\x0b\x9cJ\x9c\x0a\xab\xbc\x0a4\x12\xa2\x9a\ -\x91\x08\x0c|D\x83\x92\x0a> \xa0[\x10{ \xa4\ -(\x1d\x17\x91\xa14d|\xa8\xf0\xdaY\x1b%p\xfa\ -|\xf9\x19\x822\x0aI\xa0\xa13Dn6\xa3k\x92\ -\x19\x97\x0a\x1cp\x95IiLt\xe7\x1f\xe0\x11\x9d)\ -\x90i\x00\xf4\xd3\xa1\xe4L\x8e=6\xa7\xf2s&\xa5\ -\x13\x02O'\xa5\x8e\x99\x9e\x08\x1f\xb3IJ\x82\x89R\ -\xc2,\x5c\x00s\x88\xb2\x18\xce\x8e\x03\xdb\x03\xb1\xf3\xc2\ -}2$\xf2\x99\x9c\x15:\xc7\xf1`\x82\x84\xb3r:\ -nN \x18\xa1:\x06&\xac8\xa5LI4\xf8\x91\ -5\xc6h\x86\x90\x15\xe8(\x1bC$\xe7\xa3\xfc\x01\x0a\ -P\x08d]\xa54\x8aKS$\x94\x9a5?\x08\x94\ -\x09d\x82\x814\xe2`|S\xe2uER$\x95B\ -\x81='\xb5R+\x1eG\xc8!b\x82\x81\x0a\x93\x96\ -\x82\x15\x8d\xa9n\xda\x9c@M\x9cq\xcd'\xe9\xfe~\ -Z\x80\xd5\xa8~\x17\xa8(8\xae\x1f\x08(\x9f\x0b\x86\ -\x85\xd2=]$W\x22=_\x22\x11\xe0\x8e\x82\xd0h\ -%\x8a\xa5\x9c-\xa8\xe7Q\x15\xf2\xea-\x1e\x1bh(\ -H\xb1[\xa8 \xa1p\x17,\xf5x\x9e\x5c\xc8\xed\xd0\ -\x85\xcf\xc1\xad\x02` \xa0R\x98F\x82\xd8\x88\xfa\x0f\ -b\x87\xba=|_KA\xec\xda\x87\xf29\x98\x8b`\ -\xa8\xe6B\x8d\xe0\xe84x\x0f \xa6J\x0a\x0c(\xd2\ -\xf2\x086\xdc\x04\xb2S\x8c \x97\xda\xdat<\xa08\ -l\xf4\x05\xafSG\x0e\xa8\xb9\x1a5\x83\x9bZ(\x1c\ -yi\x06*\x0a\x16)\x83-\xc0N%\xf9\xa0\x01\x9b\ -.F\x90\x17\xab\x87\x81N\xb4y\xa1\xda\x123\xaf#\ -\x14\x9a@\x00\xd2\xa5\x9a\x0a%\xa8\xed\xa9A#\x8c)\ -\x9e\xa5\xaa.\xa5\x94\x8e(6\xba\x02\x0d\xb0\x22\xfb\xc2\ --I\xd2\xa3\xe2@A\xa9\x87\x02\x0a\x15\xdc\x11be\ -\xb7\xaf\xad\xa8\xf1#\x91(V\xf4\x8a\xf1\xe8\xa4u\x1e\ -\x07\x88.\x18\x82\x00zn\x9e\x9c\xf1\x0b\xfb\xf8\x82\x07\ -\x97\x06T\xa8n\xd2V\x06\x9d\xba:)\xb5\xa3\xe9\x06\ -\x92\x0a\x0f\xa9\x87\x0d\x09p\x1f|\xe3\xe5|\xe6\xacG\ -p\x00\x06\x1c/\x22\x89\xf7\xe8\x93\xa3\x1e\x11\xb0\xaa\xa4\ -E\x5c\x03\xba{\xce\xb0\xed\xa9\x05#\x8f\xfe\x0a#\xe9\ -\x22\x06\x87\xad4M9\xf0\x18\xa6\xd1\x22\x0d\x19\xcb\xa7\ -~c\x12w\x81\x1f(<\x15\xfd\x07\xa4k\xd3\xa7S\ -\xf0\xec\x90q\xaa~,\x82\x01\xfd\xa7\x97\xdb\xe3,s\ -j9TD\x7f\xd6\xe9J\x12\x95\x16\xa9\xb0\xa9\x0d\xd5\ -\xc0\xdc\x09\xe8\xd2\x81@\x88\x90\x00RR\x83\x87\xda\xaf\ - \x89\x08\xa7\x8b4\x8e\x13\x9f\xf9JR\xa3e \x95\ -!\x8a\xb8\x1c\xa9\x82G\x82\xf8\x82\x84\x12\xa46\x128\ -)\x83%\x1dJ\xb8`\x00\xacJa\xb5\x16\x89\x1c&\ -\x984x\xa6W\xf1R\x1e\xe9\x1d\x87\x14g\xa8C\xd4\ -\xa8\xdf \xa0\x80\xa9\x0cu\xc0\x0e\x8c\x1a\x95\x18D\x80\ -\x1e\x95!\xbe\x91\xc1\x14+(\xcaU\x5c\x00\x00\x88T\ -\x86\xf2\xe0\x04p\xd8\xf9A\xc8&T\x85\xd2G]p\ -\xf9\xf6\x13\x95*\x22\x08+\xca)\xe3\xe1\xf2\x80\x80\x1e\ -\x0b#\x80\xfa.\xa8\xf2\x07\x10D\xec\x00!\xe9N\x10\ -\xa9\x1d\x14FH\x00O\xd3\xf0\x1f$\x03t\x82\xb9\x92\ -\x9e\x10\xd7\x04$.\x89\xf8\x1f\xb0\xb2\xa4>\x8d\xa8!\ -TK\x1d\xa0\xc6RltT\xa8\xa9$\x01X\xa6\x90\ -\x00\x0c\x09\x183\x82\x9d@\x10\x88L*\x17\x0c\x86\xc3\ -\xa1\xf1\x08\x8cJ&\x00fE\x910\x93\xb4R7\x1c\ -\x8e\xc2\xd3\xe3I\x09\x89\xff$\x8fI\xa4\xf0\xa9#\xfe\ -Q,\x8f@\x80 \x06\x94\xc8D\xfa\x9a\xb4! \xd9\ -l\xea8\xe3\x04O\x84\x82\xca\x0b\xeawD\xa2\xc3\x1a\ -\x94\x803\xe2\x96\xdb\x84\x87\xa8\xd5\x08c\xc0\x07T\x16\ -\x0cj\xeeYUF\xb7Z\xad\xd4%\xf0\xb6u\x88\xbc\ -\xfe\xb2\xa8k\xd5\xe9y\xa6\x0a3LZ-\xf1\xd6m\ -\xc8\xcf*\xb7\x5c(\xd2\xf2\xc5\xb1S)\x92\xdd\xe7U\ -\xdb\xfc\xb2\xc1\x0e\xb93S\xf2\xa3\x06\x0av\xe2\x02c\ -\x85C\x0c\x8b\xd7\x17\x7fhe\x81o\xcc\xcb^\x12\x1d\ -\xcaI\xe5\xe9\xbba\x9a\x1d\x81\xcfGt\xbah\xde\x12\ -\x1a\xe2\xd6\x82][\x06,$c\xa9\x8e\xcb\xd4\xb6\xc2\ -\xe6\xd6\xbd\x16f)a%\xad\xde\xaa\x04\xcd\x06\xf1\x87\ -bnK\xe7I~\xe1D\xf5\x1c\xe8~\xae \xd3\xea\ -\x87_=\x86D$5\xd1\x8d\x9a\xe4#D\xb7vM\ -\x866J\x92~8\x9b\x96\xa8\x03\x1b\xd5\xc6.X\x97\ -C\xd3}\x95\xfd!\xdd8\x9b?\xf60~\xff\x8c4\ -$\x0c}\xd0\xc3\xfd/\x1d\x16\xc2:\x03C\x1b\xd4\x1d\ -\x08F\x10\x84\xc2\x0aBO0\x0a\x15\x0fC(`\xd1\ -G\x1f8\x0e\x1c}\xdf\x94qb3\x84\x95\x94\xfe,\ -\xd0\x90\x0e\x12B\x92\xf2X\x0a\x8b\x87\x80\xa61<\xdb\ -Sj5\x03\x8f(\xe0\x8aBFx\xa9\x0c?R\xf1\ -1l.\x12xy\xf4\x91^\x98\x81\xe4\x5c\x85\xc4\xa8\ -\xa0\x8a#\xd4,\xe7BG\x94$\xa6x\x0f\xb5\x19H\ -5\x14\xa5-\xc1B\x08\x84$\x17\x94\x10\xa8\xfd\x02\x18\ -\x16\xc2\x91\x80sc\xd9\x1d\xe3\x92R\xc8\x88Y\x89J\ -9>cC\x0e\xf4$\xb0Bd4 \xe2\x01g\xf3\ -\x91\x0a>\xe80qNK\xc4\x94\xa8PBA\x09\xda\ ->\x85@!v\x18\x0c\x8au\x1amwigFo\ -N\xe2!R%\xa5\x10\x80\x12\x8d\xa8\x9ac\xf1\xc0x\ -\x0a\xb5z\x98s\xaa\xa7\x0a\x9aQ\x9b\xda)\x08\xa7\xc0\ -\x00\x22\xa3\xad\x95\x17-\x08\x16^\x02\xbdw\xab\x1b\xba\ -\xfd\xb5\xab\x95\xb6\x183J\x8a\xe5:\xb7\xb2\x91\xe3\x8d\ -/\x14\x96\xc31\x94\xb0Z\x9bM\xa6\xb0\xd6\xf6\xf4\x14\ -K\xca\x94\xa8B\xb2\xed\xf40\xc0\xa3\xc5jH\xebm\ -mVz\xe8e-u\xfd*\x00\xe2\x22!*\x1d.\ -\x0a\xd8\x8f[\x07d\xbe\xa5\xaa\xe6\xb8\xaa\xeab\xee\xc6\ -\xd6\x22\x89\x16RI\x09\x09/GD\xddBF\xf7\x80\ -\xb5\x84\xaf\xe6\x0b\x10_\xf0\x07:Z\x97\x0f\x81\xc9\x09\ -\x1f\x10\x90/\x08V\xd94 \x86\x03\xb225\xc9\x09\ -\xab\x99\xb2\xfc\xc3\xf2\xa8+\x14\x80\xdf\xb3<\x1b\x7f\x8f\ -\xd2-\x09\x16q\xe4\xb0\xa9\x9f\xc0Q\xd0/\xcf\xa8\x1b\ -+\x12\xaf\xb2\xc8\x0f.\x9d\xacT\xa8nBEt$\ -\x07\xbd\x144 \xa9K\xc9+C8B4%\xc3X\ -[\xf4k.\x22\x05R\xa1a\x09\x14\x12\xa0\xf9\x09\xa8\ -\x5c+\xe8\x00\x80\x10\x82\xc1\x8e\x01\x0a\x86D0:\xb5\ -d?ZZ7e\xa5\x02\xdd\x12\x84\xc8\xd2\x04Y\x93\ -\xf08\x89[D 0K\xc1\xd4\xa8\x11\xa2\xd0\x98D\ -\x00\x9e\x10\x83\xc1\x098\xd0\x93>\x8f46\xe3\x1c.\ -\xe6\xb8\xfd\xed\xa7\xd1\x1f}\xe3\x9d\xe8\xba>\x93w\xe7\ -\xfa^\xa3\xa9\xea\xb1\x1e\x9f\xab\xeb\xba\xfe\xc1(\xe8{\ -\x1e\xd3\xb5\xde\xfb>\xdb\xb9\xee\xb4\x1e\xb7\xbb\xef\xbb\xfe\ -\x8b\xb8\xf0\x01E\x01L\x01R\x01Y\x01`\x01g\x01n\x01\ -u\x01|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\ -\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\ -\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x02\ -8\x02A\x02K\x02T\x02]\x02g\x02q\x02z\x02\ -\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\ -\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03\ --\x038\x03C\x03O\x03Z\x03f\x03r\x03~\x03\ -\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\ -\xec\x03\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04\ -U\x04c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\ -\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05\ -:\x05I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\ -\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x06\ -7\x06H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\ -\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07\ -O\x07a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\ -\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\ -\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09\ -%\x09:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\ -\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\ -\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b\ -9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\ -\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\ -\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\ -\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0e\ -d\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0f\ -A\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10\ -&\x10C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\ -\x13\x111\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\ -\x07\x12&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\ -\x03\x13#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\ -\x06\x14'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\ -\x12\x154\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16\ -&\x16I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17\ -A\x17e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18\ -e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\ -\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\ -\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\ -\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1d\ -G\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\ -\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\ -\xea \x15 A l \x98 \xc4 \xf0!\x1c!\ -H!u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\ -\xaf\x22\xdd#\x0a#8#f#\x94#\xc2#\xf0$\ -\x1f$M$|$\xab$\xda%\x09%8%h%\ -\x97%\xc7%\xf7&'&W&\x87&\xb7&\xe8'\ -\x18'I'z'\xab'\xdc(\x0d(?(q(\ -\xa2(\xd4)\x06)8)k)\x9d)\xd0*\x02*\ -5*h*\x9b*\xcf+\x02+6+i+\x9d+\ -\xd1,\x05,9,n,\xa2,\xd7-\x0c-A-\ -v-\xab-\xe1.\x16.L.\x82.\xb7.\xee/\ -$/Z/\x91/\xc7/\xfe050l0\xa40\ -\xdb1\x121J1\x821\xba1\xf22*2c2\ -\x9b2\xd43\x0d3F3\x7f3\xb83\xf14+4\ -e4\x9e4\xd85\x135M5\x875\xc25\xfd6\ -76r6\xae6\xe97$7`7\x9c7\xd78\ -\x148P8\x8c8\xc89\x059B9\x7f9\xbc9\ -\xf9:6:t:\xb2:\xef;-;k;\xaa;\ -\xe8<' >`>\xa0>\xe0?!?a?\xa2?\ -\xe2@#@d@\xa6@\xe7A)AjA\xacA\ -\xeeB0BrB\xb5B\xf7C:C}C\xc0D\ -\x03DGD\x8aD\xceE\x12EUE\x9aE\xdeF\ -\x22FgF\xabF\xf0G5G{G\xc0H\x05H\ -KH\x91H\xd7I\x1dIcI\xa9I\xf0J7J\ -}J\xc4K\x0cKSK\x9aK\xe2L*LrL\ -\xbaM\x02MJM\x93M\xdcN%NnN\xb7O\ -\x00OIO\x93O\xddP'PqP\xbbQ\x06Q\ -PQ\x9bQ\xe6R1R|R\xc7S\x13S_S\ -\xaaS\xf6TBT\x8fT\xdbU(UuU\xc2V\ -\x0fV\x5cV\xa9V\xf7WDW\x92W\xe0X/X\ -}X\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\ -\xf5[E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']\ -x]\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\ -\x05`W`\xaa`\xfcaOa\xa2a\xf5bIb\ -\x9cb\xf0cCc\x97c\xebd@d\x94d\xe9e\ -=e\x92e\xe7f=f\x92f\xe8g=g\x93g\ -\xe9h?h\x96h\xeciCi\x9ai\xf1jHj\ -\x9fj\xf7kOk\xa7k\xfflWl\xafm\x08m\ -`m\xb9n\x12nkn\xc4o\x1eoxo\xd1p\ -+p\x86p\xe0q:q\x95q\xf0rKr\xa6s\ -\x01s]s\xb8t\x14tpt\xccu(u\x85u\ -\xe1v>v\x9bv\xf8wVw\xb3x\x11xnx\ -\xccy*y\x89y\xe7zFz\xa5{\x04{c{\ -\xc2|!|\x81|\xe1}A}\xa1~\x01~b~\ -\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\ -\xcd\x820\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\ -\xe3\x85G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\ -\x04\x88i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b\ -0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8e\ -f\x8e\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\ -\xa8\x92\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\ -\xf4\x95_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98\ -L\x98\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\ -\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\ -\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\ -\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\ -\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\ -\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xad\ -D\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\ -\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\ -\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8\ -Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc\ -!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\ -\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\ -\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\ -\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\ -\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\ -\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\ -\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\ -\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\ -\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe0\ -6\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4\ -s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\ -\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\ -\x11\xed\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1\ -r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\ -\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfa\ -W\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\ -\xdc\xffm\xff\xff\ -\x00\x00\x03\xaa\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Default - Sav\ -ed\x0d\x0a \ -Created wi\ -th Sketch.\x0d\x0a \x0d\x0a \x0d\x0a \ - \x0d\x0a \x0d\ -\x0a\x0d\x0a\ -\x00\x00\x04q\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Editor only -\ - Default\ -\x0d\x0a Crea\ -ted with Sketch.\ -\x0d\x0a \x0d\x0a \ -\x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\x0d\x0a\ -\ -\x00\x00\x02\x9b\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - <\ -/circle>\x0d\x0a \ - \x0d\x0a \ -\x0d\x0a\x0d\x0a\ -\x00\x00#k\ -\x00\ -\x00\xf0\x80x\x9c\xed\x5c\x07\x5c\x93\xc7\xdf\xbf'\x09\x09\ -[\xb62\xc4\x88\x03\x17#\xcc\x10\x01\xd9CE\x11\x10\ -\xd4\xbaB\xf2\x00\x91,\x930\xc4=\xaaV\xad\x03\xad\ -\x0b\xb7\xd6=\xea^\xad\xd6\x89V\xabu\xb7\xd5\xb6\x8e\ -?\xae*\xe2`\xa3y\xef\x9e$\x10\x14\x15$\x8a\xf6\ -}\xbe\xf9\xdc\x93\xbb\xdf\xdd\xfd\xd6\xddsw\xcf\xb8'\ -&\x06t\x02\x00\xe8\x83\x16\xe0\x15\xa0\xc1\x18\x06T\x07\ -*\xf17\x14\x1e0\xad8\x85\x88\xc3r\x98+FU\ -\xd3aa\x8c\xae\x8eS\xe0\xc1\x5c\xc3'q!f\xa1\ -U\xc6Z\x1dG\xb5m\xb4x6\xd7\x94\x9f\x0d0;\ -\xa0\xa7\x8ac>\x98}u<\x10s\xd0\xe2\xd3AK\ -\x16\x0b\x1d\x81\x13\x8cE`\x1eD\xdc\x0a\xc6\xd3\xb0\xb8\ -\x9a\xf2\x94\x1f\xd1\x91\xb3\x16&GM<\x08\x18\x90\xde\ -\x0c\x00\x7f\xa7\xc9\xd1\x88n\xea\x08\xe3\x1eS\x04\x1a\x1d\ -\xee.\x9c\x22Ge\x8c\xa3\x00\xe8\x1e;w \x8a\x1b\ -\xec\x83\xf4\xe3\xc8/\xd0O\xaa\x9fa\xd58\x00\x9c\xcd\ -4\xff\xc1|I2\xce\x8cM\x93($\xf24\x89\x94\ -\x19\x1a\xca\xf4pg\xf92;$\x09\xc4|I\x96\xbc\ -#@I\x8e\xbb\x07\xc7\xdd\x93\xc9\xf2\xe1x\xf8p\xbc\ -X\xc0\xbf[\xb6\x94\xcbK\xc7\x15\xccda\xb8\x9c'\x13H\x15\x02\x89\x98\x89\ -\xd2\xdcdI\x86\x22\xc0\xc9\xc9\x90\xa9\x05\xb5]\x22i\ -\xb5 \xb1\xdc\x95\xb0\xd1\x95'\x11\xb9es\xa5n,\ -Ww\xb7\xba*\xf1y\xd5u\xa4\x192!\xa1\x1a\x9f\ -\xe7\x86\x0bq\x11.V\xc8a=V\x9d\xf5\xa4\x9a\xb6\ -\xab[du\xf6[\x05Cmcb\xde\xad\xafHT\ -gM\xb9\x22\x9f\xef\xc3\xe6\xe1P\x0b\x1cOv\ -\xf1\xf3\xf3rwa\xb3y\x9e.\xbe\xc9\x1e\xde\xc9\xc9\ -\x1e8\xd7\xdd\xc3\x8bh\xcb\xda\xd5\xdf`\xad\x91\xaef\ -M\x98\xca\xf3\xf4\xc0}\xfd\xd8.)\xfc\x14\x96\x8b\xb7\ -\x9f\x17\xdf\xc5\xcf;\xc5\xcf\x85\xeb\xe5\xc3\xf2e\xf9&\ -\xfbp\xb9\xbe\x1a\xd6Z\xd5\xdf`\xdd[&\x80\xa31\ -W\xd8H\x11u\xb0yCT\x94\x00ynD\x1dm\ -\x1b\x8f\x0f\x7f[\xdb\x12\xe3\xa6\x94+\x93\xe3hT\x08\ -p\xd2\x0c\x0bNoT@u\x88\xd1\x85\xc3\xe5\xa1\x11\ -7\x90G\x9c\xf8\xb0\xc1kQ\xdf^M\xf0f\x03\xd6\ -\xcf\x05oT\x7f\xbb\x8c\xac4\x5c\xfc\xae\x01K\xab\xd4\ -\xdb\x99\xc8%)\x8a,\xae\x0c\x0fN\x85\x9e\xae\xcfh\ -QW\xb57\xfc]\xe7y\xa1\x93\x86\x90s3\x1b\xd7\ -\x0c\x9e)\xbe>\xc98\xcb\xc7\x85\xcd\xe7y\xb8p\xd9\ -^\xb0\x05\x90\x0f}\xbdY\x9e\x9e\xbe\x1e\x5c/\x16\x8b\ -\xdf\xb8f\x80m\xc0\xd2\x1a\xad\x9b\xae\x19j\xd8\xf3\xd2\ -\xb8\xe2T\x9c\x1f\xe8\xa6\xa9\xa8!|I-W\xbf\x11\ -\xb0\x91-\xe7\xf3\xdfj9\x15\xb5\xf6\x98\xa8\x19g_\ -\x1bCUE\xb5\x96\x99\xaa5\xac\x9bz\x11\x0b\xd7\xcf\ -n\xd5\x0b\xe8\xba\x14\xd6=H!\xa4\x10R\x08)\x84\ -\x14B\x0a!\x85\x90BH!\xa4\x10R\x08)\x84\x14\ -B\x0a!\x85\x90BH!\xa4\x10R\x08)\x84\x14B\ -\x0a!\x85\x90BH!\xa4\x10R\x08)\x84\x14B\x0a\ -!\x85\x90BH!\xa4\x10R\x08)\x84\x14B\x0a!\ -\x85\x90BH!\xa4\x10R\x08)\x84\x14B\x0a\xd1\xb1\ -\x10\xc3\x9a-\xa9\xb8\x98\x1f\xe0\x94\xe5\xd4-\xd0\x01\x1b\ -\x00\xa8\xf6\xed\x22\x1d(\x80\xd8`\xcb\x0e\x89\x8e\xa1\xb5\ -#v\xc3\x9a\xfdz\xbeb\xf4\xfa\xfcC\x06z\xd2\xcc\ -\xad\xdb\xf4\x8e\xf5\x22\xf28D^\x01\xca\xd7\xec'\x06\ -FR\x99@\xac\xe8\x9d\xa1\x90f(`\x12m\xec\x05\ -\xb1rE|\xb2D\x22$JD\x8b\x158.\xce\x10\ -i\xe2\xe8?T(C\xe9fD\xddxA6*\x11\ -\x22P\xa0:5\x8f\xf0\x85\ -\xca6\x8a:E\xa9\x95rW\xe9\xa8\xf6\xb5\x0b\x91\xa2\ -\x13\xfe\xb0%(\xfa\xea^A\xb4\x0d%H\x15\xd4u\ -\x1dk\xb7\x0c\xcd\x0e\xc5\xa8\xde\xd5\x96\xab0T\x1dT\ -\xdey\x13\xda4\xed\xb2u\x16\xd0\xa0fp\x03\xe2\x0c\ -\xa1Pe\x10\xa0'K2\xc4|\xf9kc\x0bO\xc1\ -\xd2\xa8\x89NH\xad\x93\x01\xbcv\xd6\x80\x90\x9a\xb3\x8b\ -P#\xae\xe6\xe4Ai\xba\x5c(\xe0\xe1\xf2DaO\ -t\xfac\xb5\xe4\xe8\x11y0b\x01\x03\x83HD\x87\ -i\xf1f\xa4\xca$\x19\xd2Z$\xba\x84\xd8\x97\xab\x19\ -\xd9\xc3\xe3Q%\xd5^]\x986\xe1f($\x91\xb8\ -\x18\x97\xa1}\xb2\x84\xf6#\xa4\x9a\x89\xc9PU\x18Q\ -PN\xb4(\x95\xf9\x09\xec\xa7f\xc8\x84\xb5\xa67\xc2\ -\xf9\xb5)1\xf2\xd4\xdaS \x9d+T$pSk\ -\xd1Ly8\xac\x87g+\xa2\xe5Q\x091=5\x83\ -\xac\xbe\x86\x5c\xab\xb0A\x9aD\x96\x13,\x14\xa4j<\ -\xd5Le|\x94\x86\x8c\xbc\xcb\xc7S\xb8\x19\xc4(k\ -\x90\x89\xcb\x14u\x14O\xd4\x90k\x177JN%\xf6\ -\xd1k9\xd7\x5cU!$\xb2:\x03\xa9\xd1K\x22F\ -\xff\x06\x0a\x89\x14N\xa5r\x5c\xdbq\x86B\xe8\xc87\ -\xa8\xc6\xc9\xc4p\xfd\x06\xddH\x86\x06\xe5\xd7\xc8\xc4\x19\ -\xd4AU\x0f\x06J\xb7\x22PC\xb7\x22\xa2\xa8\x09U\ -g\xa51\x91\xdc\xa9v\xd1PU\xc0`\x17@g\x02\ -m\x01h\x010\xe5\xef\xca\xc7\xc0\x98\xd8=9$4\ -\x06\xa6\x0b\x81)\x91\x02\xfcq\xa8\x9e\xf2:\x98\x04\x8c\ -\xf5\xf5\xf5\x0d\xf4\x8d\x0d\x0c\x8c\xcd\x8d\x0c\x8d\xcc\xad\x9b\ -\x19\x1b7\xb3naiimi\xd9\xc2\xdc\x98\x80\xfa\ -\xafn`&FF&\xa6&f\xa6\xa6fV\xa6\xa6\ -\xa6V\xe8`j\xa5\xaab^\x1f\x06\xca\x9f\x81\xb9>\ -T~(\x15s\x02\x14s\x8cj\x8e)\xff\x82\x86\xd2\ -\x95\xc7\xb1nPK=\x8c\x80\xdaqT\x80Qhz\ -t\x86\xbe\x81\xa1\x11\xf6z&\x06(TM\xa6\x19\xc0\ -h\x18\x95B\xa3\xe81\xe8\xfazTcO\x98iN\ -\xa5\xb5\xb6`\xe9\x05\xf7\xe1Z:\x0d\x1f\xefA\xb7\x9a\ -\xb3r{H\x9b\xb6\xd6qG\x92=\xbdd\x13.\x84\ -2\xda\xe5\xc6\x17\xddz\xca\x93{\xdb\xac\xda1\xb1}\ -\xd8\xdc\x04~\xf8\xd1\xd5\x0a\x9f\xe6\x17\xfb\xde\xc6\x9f\xed\ -\x9ct\xecR\xc6\x9d\xe7\x11\xce\xf3\xd6|\xbd\xeb\xbb\xe3\ -\x97\xff\xf7\xe2\xfb\xdd'\xae\x14\x14'\xa6dN\x9e\xbf\ -v\xcf\xc9\xabwK|#\x93R\xb3\xa6,X\xb77\ -\xff\xda\xbdRs@\xa1@mi\x84N\x0c\xba\x9e7\ -\xa1Bk\x96\x05\x0dj0\xdc\xc9R\xcfc\xfc\x1c+\ -\xa4\xc1\x91\xb8\x0bE\x9em\x93o\xc9&\xe4\x86\xc6[\ -\xf3\xe4^O\xdb\xd1\x91\x02\x8c\xf6\xdeG/B%V\ -7\xe7\x87\xf7\xf5Q\xe0\xb7\xabUx\xbb\x06\xce5*\ -(\xff\x04\xc6TB\xa69\xe8\x06\x8a\x13r\xa3\xdbu\ -l\x9b\x1b\xdd=\xbamn\x5cnt\xdbyk\xd4\x84\ -\xde\xca\xdf\x8a\xfb\x1a\x89\xf0\xbey\x8e\x0a\xc3a6\x89\ -g\xfa\xf5{\xba\x7f\xdd\x8e\xeei\x17\xae\xb4?\xeaj\ -vq\xf4\x9a\xcc\xb2- \xd8\xc2x\xe2\x91~\xe5\xd9\ -n+\x0a%\x07\x0e;\xde\xa98\xbd}\xa7(\xbf\xe4\ -\xa5\xcf\x98\x07\x8f\x8b\xa2{\x9df\x1aph\xcdSn\ -\xffp\xe4\x87Q\xbb\x95`C\x7f\xdf\x82A#\x16\x1c\ -\xec\xf5\xabC\xeb\xb6\xebD\xfb\xf7ms\xef\xd2*\xa0\ -\xdb\xc39\xe3iQ\x97]G\xd8\xcc\xd8\xb4\xde#_\ -\xf0\xd7\xbaI\xf3\x0a\xd7l\xba}7i\xb6W\xc9\x8f\ -\xb2\x7f\x0a\x13-\x08\xcd\x94@y\x81\xd0\xd7\xfb\xb9G\ -^\xf8\xf0\xd5\xcb\x1e\xdb]\xaaJ\xecx\xc5\xd2\xe9\xde\ - \xf9\xb2\x91K\xfd\xa7\xf0\xbd\xe6}\xbfn\xe2`\xeb\ -\x19\x17V^m\xb6\xa6\xd5\x86\xbeO\x8bF\x8f\x92\xf3\ -z\xfa\xb3\xc75\xa3\x85l\xb3\xb9\x90\x9a\x19\xb0\xa1\xa3\ -\xebH\xbb\xb3\xebv\x8f\xf3^\xe5egJ\xd9\xfa\xed\ -\x933\x07z,\xbe\xb6\x0f\xdb:\xee\xe7\xaf;\x17\x89\ -W\xe6\xfd= \xec\xe4\x94\x97\xdft\xa4:\xdee\xfb\ -\xadu`wNm\xd6q\xbf\xf5\xbf\xdf\x7f[\x11Z\ -\xb69\xa1\xe7\xc8\xa51\xbff?\xcax\xde\xf2b\xfc\ -\x8fP\xadu\xca\x8b\x84R\xec\x11\x0a\xce\xf4%\x97^\ -\xf4\xda\x12\x18\xd5Y\xeel\xbb\xc8\xfaq\xe6\xccV\xe1\ -\x7f\xeb%_\x8f\x7f8\x82w\xdc,w\xa9\xe9\xdc\xa1\ -]F\x0f:r#\x90\x11\x9e\xeel\xf3\xe3\xe4c\xbb\ -\xa4\x15\xae\x0e_O\xef;k\xc3\xadG\xee7w=\ -|8o\xdf\x98\xd96]\x0fKs\x97\xfc\xfb\xf4q\ -\xfe\x98k\xdfveK\x13\x96/\x10\xcd3\x1cR8\ -\xb1\xf5_/\x1em\xfd_\xb1q\xd2\xd5~\xf6\x0f\xcf\ -\xcf\x9c\xa8\x04mwZ\xc4\xcd\xd9\xde\xc1\xf7\xc6\xd5Y\ -\xab\xbc\x87?\x0b\xfe\x8a\xed}\xf1\x17l}\xe1\xf25\ -\x85\xcfr\xf3`+v\x1f\xab\xbc\xa4jb\xc3\xaa\x9c\ -')\xd7fM\x9c\xd2\xda\xba\xed\xbc;C\xc6\x8f\x8e\ -\x18\x10\x10\x91\xbd\xb7lw\xe2 \x8b\xe9\x9b\xb6(A\ -\xf4\xb7Y\xc7)\xb9\xcbF\xf7_M\xa9\xec\xb9/G\ -\xf84\xabh\xd85Q\xc6\xce\xfb\xdb\xb7\x94\x01\xab\xdc\ -\xf8Es/\x19\xd9\x1f\x980\x88z\xe3\xd2\xf9\x13\x1b\ -\xbfo~=\xb4\xd4=\x7fzo\xc6\xed\xbd\xdf\xf5\xdc\ -L\x1f\x9c\xb5\xf3\xf7W\xf7\xb6GG\x0f\xdf\xd1\x7f\xf6\ -\xaf\xbf\x9aE\xccdl\x8f\x88]\xbb6\xbe\xdf\x96\x89\ -\xc1e\xe5\x1b\xd6\xacS^~W_\xfbC5\x9e\xb5\ -&\xce\xd8A\x80Xy\xa0\x8f \x05\x03>\xbc\x18J\ -\x86\x0bC&\xbc4J\x83q\x05\x0cr\x22\x86.\x83\ -\x9a\xbf\xa7\x04\x13\x84\xc2\x1f\x13.\xc7\xdc\x01\x0b\xf8\xaa\ -\x07F\xe3\xa8\x9e\x02\xb1\x84\x02\x17\x0b\x22x\xfd\x81\xbe\ -\x81\xd2\xaf\xff\x00&\xe3\x1c\x5c,\x18\xc05\x0a\x9c\x16\ -\xb9<\xb94&>\x22\x81\x98D\xc3C\x99\xe8C)\ -\xa0\x16J\xae\xaa\xa6\xa1K.Q\xb1L&h\x18\xcc\ -yR\x19\x9cd\xb0X\x18\xf7\xe4\xe3r8-c\x93\ -`\x5c\x98\xa5\x90\x22:\x1a\xe3\xad\x92\xd3Q\x9c\x82F\ -w+\x19T\x10\xc6[\xa0x\xaa*\xde\x85(\xa3\x8a\ -\x07\xa18_$\x86\xcb\x01\x0a\xd2Y\xca\x17\xf1Q\x1c\ -}\x11jjf\x06Z&P{\xc2\xf8\xe4L\x01\x9e\ -\x05\xe3\x97a\xbc\xad0C$\x80q\xb4\x02\xb5\x12\xe1\ -\x5c\xb8t!\xe6\x8f\xb6\x0a\x9c\x97\x06\xe3h\x05h,\ -K\x88\x83W24\x7f8\x07\x1b\xa7j\xc5\x93\xb5\xe2\ -\x0a81#\xa3B%\xd2\x11\xc4\x0c\xc6\xec\xc0\xeb\xc8\ -d\xf9\xf9\xb1\x99Qx\x96\x10W(\x5cb\xe1\x05;\ -W\xc6g\x86JDR\xae\x18\xae\xefU6\x13\xb0x\ -\xe3#4Z\x8ezgf=\x81\xdaV\x15{\xde\x87\ -h3\xcc\xe6l\x0d\xad\xaer\x92Up~\x85\xab}\ -\xea\xec\x1aZ\xf2\x22\x00\xf6~\x0d@\x8b?khm\ -W\xc0>\x0a\xdbm\xcfy-{lP\x7f\xd1\xfa\xf8\ -\x94\x00\xe7\xb9\x22\x87V\xe3\xbd\x05\xea\x01-y\xae\x88\ -]\xb5{\x98a\xaa\x15\x0c\x13\xf9\x8d\x07\xd7)\x192\ -&\xbc\xfe\xe2\xe1L\x97\xd7;\xf1\x07W\xac[\x8f.\ -qx\x0a\x8e\xae\xf3pf\x22\xece\xf02\x156\xb7\ -\x98/ \xbe\xa3%\x10\xbf\xad\x11?\xb0\xdakP\xf5\ -k\x08\xcb5\xaf\x80\xd5\x10W`v\xde\x0aP\x1f\x9f\ -\x054K#@\x1d\xb8\x0c\xe6`\xd5\xed\xd6\xd3 \x11\ -\xa03/\xa9\xd5=U\xbf'P\xc7\xe5\x04e\x16:\ -\xc8\x05\xc4\x22\x1a\x84\xc6%0y\x19\xb2LU\x1e\xb1\ -n\xd6\x83\xd7\x88\xcd\x80\x15\xb0\x85\xd7\xb3m@\x07x\ -u\xe7\x01\x07\x99\xae \x08\x84\x83\xee\xa07\xbc\xbe\xed\ -\x0f\x06\xc3+\xda4 \x82W\xb7Y`\x14\x18\x0f&\ -\x83\xe9`6\xf8\x0e,\x06\xcb\xc1\x1a\xb0\x01l\x05;\ -\xc0^\xf0#8\x02N\x823\xe07p\x05\x5c\x077\ -A\x01\xf8\x17\x14\x81\x12P\x09\x172\x0c\xcc\x04\xb3\xc4\ -l\xb1VX;\xac3\xe6\x81\xb1\xb1@,\x1c\xeb\x89\ -\xc5a\xfd\xb1\xa1X*&\xc62\xb0Q\xd8Dl:\ -\x96\x8b-\xc6Vb\x1b\xb0\xed\xd8~\xec\x08v\x1a\xbb\ -\x80\xfd\x81\xdd\xc2\x1e`\xcf\xb0\x0a\x0a\x95bL\xb1\xa2\ -\xb4\xa4\xb4\xa7\xb8Q\xd8\x94`J\x0fJ\x02e\x10%\ -\x952\x9c\x92C\x99D\x99IYHYE\xd9L\xd9\ -C9B9C\xb9B\xb9I\xf9\x97RL\x05T#\ -\xaa\x0d\xb55\xd5\x85\xca\xa6\x86R{S\x07PS\xa8\ -2\xea\x18\xea4\xea|\xea*\xeaV\xea\x01j>\xf5\ -\x12\xf5&\xf5\x11\xb5\x9cF\xa7Y\xd2\x984\x17ZW\ -Z\x14\xad/\x8dG\x1bN\x1bC\x9bA[L[O\ -\xdbC;N\xbbD\xbbE+\xa2\xbd\xd23\xd1s\xd0\ -\xeb\xac\xc7\xd1\x8b\xd6\xeb\xa7\x97\xaa\x97\xa57Yo\xbe\ -\xdeZ\xbd\xddz'\xf4\xae\xe8\x15\xe8\x95\xd0\xe9t\x1b\ -\xba3\xdd\x97\x1eE\xefO\x1fF\x1fI\x9fA_J\ -\xdfF\xff\x99~\x81~\x87^\xcc`0l\x19\x9d\x19\ -\x01\x8c\xde\x0c.C\xc1\x98\xccX\xc4\xd8\xcc8\xcc\xb8\ -\xc8(`\x94\xe9\x1b\xe9\xb7\xd2\xf7\xd0\x8f\xd0\x1f\xa0/\ -\xd6\x9f\xa0?_\x7f\xa3\xfe!\xfd\x8b\xfa\xf7\xf4+\x0d\ -\xcc\x0c\xda\x19p\x0cz\x1b\xf0\x0dF\x18\xcc2Xc\ -p\xc0\xe0\xbcA\x81A\xa5\xa1\xb9\xa1\xb3a\x80a\x82\ -\xe10\xc3\xf1\x86\x0b\x0d\xb7\x1a\x9e0\xbca\xf8\xdc\xc8\ -\xc8\xc8\xc9\xc8\xcf\xa8\x8f\x91\xc0h\x9c\xd1B\xa3\x1f\x8c\ -N\x19\xdd2*7\xb60\xeed\x1cj<\xd08\xc3\ -x\xa6\xf1:\xe3\x9f\x8d\xff0~nbb\xd2\xde$\ -\xc8d\x80\x89\xc2d\xa6\xc9\x06\x93c&\x7f\x9b\x94\x99\ -Z\x9a\xba\x9aF\x9b\xf2M\xc7\x9a\xe6\x99\xee1\xbdh\ -Z\xd8\xcc\xa0Y\xbbf\xc1\xcd\x067\xcbi6\xbf\xd9\ -\xcef\xe7\x9b=230ko\x16j\xc65\x1bc\ -\x96g\xb6\xdf\xec\x9aY\xb1\xb9\xa59\xcb\xbc\xb7\xb9\xc8\ -|\x86\xf9F\xf3\xd3\xe6\xf7-\x18\x16\xed-\xc2-\xf8\ -\x16\x93,V[\x1c\xb3\xb8cI\xb5lc\x19j\xc9\ -\xb3\x9ch\xb9\xc6\xf2\x84e\x81\x15\xdd\xca\xd9*\xdaj\ -\x98\xd5t\xab-V\xe7\xac\x8a\xac-\xac\xbd\xac\x13\xad\ -\xb3\xad\xf3\xac\x7f\xb2\xbeiC\xb5io\x13m#\xb4\ -\x99e\xb3\xc3\xe6\xaaME\xf3\x96\xcd\x83\x9b\xe3\xcd\xbf\ -i\xbe\xb5\xf9\xc5\xe6\xa5-\xec[\x04\xb5\xc0[Lk\ -\xb1\xad\xc5\x95\x16\x15\xb6L\xdbp\xdbt\xdb9\xb6{\ -m\xff\xb2\xa3\xd9u\xb2\xebc\x97e\xb7\xcc\xee\x84\xdd\ -#{+\xfb\xae\xf6<\xfbi\xf6;\xec\xfft\xa08\ -tr\x88s\x18\xe9\xb0\xda\xe1\xacCqK\xc7\x96\x91\ --\xa5-\x17\xb5<\xd6\xf2\x91\xa3\x8dc\x90\xe30\xc7\ -y\x8e\x87\x1c\x1f\xb4\xb2l\x15\xd8J\xd0j^\xab\xc3\ -\xad\x1e2\xad\x99\xc1L!s!\xf38\xb3\xa8\xb5C\ -\xeb\xa8\xd6\x19\xadW\xb6>\xd7\xba\xd2\xc9\xd9\xa9\xaf\xd3\ -\x04\xa7mN\x7f\xb51l\xc3n\x93\xd2f^\x9b\xa3\ -m\x8a\xda\xb6j\x1b\xd3vT\xdbMm\xfflg\xd0\ -\x8e\xdd.\xad\xdd\x82v\xf9\xedJ\xdb;\xb7Oj?\ -\xa5\xfd\xde\xf6\xf7\x9d[8G;\xe78or\xbe\xd1\ -\xc1\xa4C\xb7\x0e\xc3;\xac\xeap\xb9#\xbd#\xbbc\ -z\xc7\xa5\x1d\x7f\xebD\xe9\xe4\xdd)\xadS^\xa7\xf3\ -\x9d)\x9d}:\x0b:/\xed|\xa1\x8b^\x17\xbf.\ -\xe2.\xab\xba\x5cs1v\x09v\xc9t\xd9\xe4r\xcb\ -\xd5\xc6\xb5\xa7\xeb\x04\xd7\xbd\xae\x85nm\xdd\x06\xb8\xcd\ -q\xcbw{\xe5\xee\xed.t_\xe3~\x9de\xc1\xea\ -\xce\x9a\xc0:\xc0z\xe6\xd1\xc9\x83\xe7\x91\xe7q\xd9\xd3\ -\xc43\xc2s\xac\xe7>\xcf\xa7^\x9d\xbdp\xafe^\ -\xbf{[z\xc7xO\xf1>\xea\xfd\xd2\xc7\xd7G\xe6\ -\xb3\xd5\xe7\x81o[\xdf\xa1\xbeK|\xaf\xb1\xad\xd8\xb1\ -\xec\x19\xecS~z~!~c\xfd~\xf4+\xe7\xf8\ -p\x14\x9c\x1d\x9c']]\xba\xa6w\xdd\xd8\xf5\xbe\xbf\ -\xb3?\xee\xbf\xc6\xffN\x80S\x007`e\xc0\xcd@\ -f\xe0\xd0\xc0\x15\x817\xbb\xb5\xee\xc6\xed\xb6\xaa\xdb\xed\ -\xa06A\xfc\xa0\xb5A\xf7\x82;\x06\x0f\x0b\xde\x1c\x5c\ -\x18\xe2\x1e\x22\x0b\xd9\x1dR\x1a\xca\x09\x1d\x1d\xfas\x18\ -5,2lZ\xd8\xb9p\x8b\xf0\xbe\xe1\x8b\xc3\xff\x8e\ -p\x8aH\x8d\xd8\x14Q\x14\xe9\x1d92\xf2\xe7(\xbd\ -\xa8\x1eQs\xa2\xaeE\xb7\x8c\xe6Eo\x88.\xea\xee\ -\xdb}t\xf7\xe3=\x8c{\xc4\xf7X\xdc\xe3v\xcfN\ -=e=\x0f\xc4Pb\xba\xc7\xcc\x8d\xb9\xd1\xab]/\ -q\xaf\xbd\xbdA\xef\xe8\xdes{\xff\x15\xeb\x1c;<\ -\xf6`\x1fz\x9f\xd8>y}\xee\xc6\xb1\xe2F\xc5\xe5\ -\xc7[\xc6\x0f\x89\xdf\x18_\x92\x10\x920+\xe1z\xdf\ -\x0e}3\xfa\x1eMl\x9680qCbiRX\ -Rn\xd2\xcd~n\xfdF\xf7;\xd3\xdf\xae\xbf\xa0\xff\ -\xbe\x01\x8c\x01\x89\x03\xd6\x0e(\xfe*\xfc\xab\xef\xbe*\ -\x18\xe8=p\xf2\xc0\xab\x83\x9c\x07e\x0f:=\xd8n\ -\xb0p\xf0OC\x9a\x0d\xe1\x0e\xd99Toh\xd2\xd0\ -\x8dC\xab\xb8\xbd\xb9\xab\xb8\xc5\xc9\xd1\xc9K\x92\x8bx\ -\xa1\xbc\x05\xbc\x7f\xf9A\xfcy\xfc\x07x\x00\x9e\x8b\xdf\ -K\x09H\xc9M\xb9\x9f\x1a\x90:7\xf5AZ\xb7\xb4\ -\xf9i\x8f\x04\xa1\x82\xc5\x82\xa7\xc3\xa2\x86-\x1fV\x9a\ -\xde;}]\xbaR\x98$\xdc&\xd2\x17\x0d\x15\xed\x17\ -[\x88\xd3\xc5\xc7%\x8e\x92l\xc9\x05ig\xe9d\xe9\ -\xcd\xe1\x9c\xe1\xdf\x0d/\x92\xf5\x90\xad\x95c\xf2A\xf2\ -}\x0a+\xb8\x98:\x9b\xd1!\xe3\xeb\x8c[\x99\x81\x99\ -y\x99eY\x89Y;\xb3\xcd\xb3\xc5\xd9gGt\x1a\ -\xf1\xcd\x88{9\x119\xdf\x8f\xa4\x8d\xe4\x8d<:\xaa\ -\xf5\xa8\xf1\xa3n\x8d\x0e\x1e\xbdr\x0c6&y\xcc\xd1\ -\xb1m\xc6N\x1a[0.r\xdc\xfa\xf1\x86\xe3\xd3\xc7\ -\xff:\xc1}B\xee\x84\x17\x13\x93&\x1e\x98\xd4r\xd2\ -\xb8Iw\xbe\x8e\xfcz\xd3d\xd3\xc9\xb2\xc9\xd7\xa6t\ -\x9d\xb2|*m\xaa`\xea\xb9o<\xbfY\xf4\xcd\xab\ -i\xfci\xbfLw\x9f>\x7fz\xd5\x0c\xde\x8c_\xbe\ -e}\xbb\xf0[\xe5\xcc\x94\x99\xe7f\xf9\xccZ6\x9b\ ->[<\xfb\xea\x9cns\xd6\xe7\x9a\xe7\xe6\xe4\xde\x99\ -\x1b3w\xcf<\xe6\xbci\xf3^|7\xe4\xbb\xd3\xf3\ -\xbd\xe6/_`\xb8 c\xc1\xcd\x85=\x17\xee[\xd4\ -v\xd1\xecEU\x8b\xd3\x16_\xc9\x0b\xc9\xdb\xb6\xc4a\ -\xc97KJ\x97\xf2\x97^\x5c\x16\xb4l\xeb\xf2\x96\xcb\ -\xa7/\xafX!X\xf1\xfb\xca\xc8\x95{V\xb5_5\ -\x7f5}u\xe6\xea\xbbk\x12\xd7\xe4\x7f\xcf\xfe~\xc3\ -Z\xbb\xb5\xd3\xd7\xbe\x5c'^ws}\xdc\xfa\xe3\x1b\ -|7l\xd8\xe8\xb0q\xd6&\xca\xa6\x8cM\x0f6\x0f\ -\xdc\xfc\xdb\x96\xb0-\xfb\xb6\xbal]\xb9\xcdf\xdb\xf4\ -\x1f\xc0\x0f\x19?<\xdc>t\xfb\xd5\x1d=v\x1c\xdd\ -\xc9\xde\xb9uW\xbb]Kv[\xee\x9e\xb6\x07\xdb3\ -bO\xd1\xde\xb4\xbd7\xf7\xf5\xdfwa\x7f\xf7\xfdG\ -\x0ft=\xb0\xfb\xa0\xeb\xc1u?\xb6\xfe1\xef'\xeb\ -\x9ff\x1d2<4\xe9\x90\xf2p\xce\xe1\xe2\x9f\xa5?\ -?:\x92z\xe4\xce\xd1!G\xaf\x1f\xebw\xec\xf2\xf1\ ->\xc7\xcf\x9d\xe8q\xe2\xd4\xc9\x88\x93\xc7\xf2\x83\xf3\x0f\ -\x9f\x0a8\xf5\xe3i\xce\xe9\xfd\xbf\xb0\x7f\xd9{\xc6\xe7\ -\xcc\x9e\xb3\xdegw\xff\xea\xfd\xeb\xees>\xe7\xf6\x9c\ -\xf7=\xbf\xef7\xbf\xdf\x0e\x5c\xf0\xbfp\xe8b\xb7\x8b\ -G.\x85]:y9\xfa\xf2\x99+\xbd\xae\x5c\xb8\xda\ -\xf7\xea\xef\xd7\x06^\xbb\xf9;\xff\xf7\xfb\x7f\x08\xffx\ -\xfag\xe6\x9f\x95\xd7\xc7\xdd\xd0\xbb1\xed/\xb3\xbf\xe6\ -\xff\xed\xf0\xf7\xaa\x7f:\xfe\xb3\xed\xa6\xcf\xcd\x9fn\x85\ -\xdd:{;\xfe\xf6\xf5;\xbc;\xff\xfeO\xfe\xbf\xaa\ -\x82IwM\xee\xce\xbf\xd7\xea\xde\x86\xfb\x1e\xf7\x7f|\ -\x10\xf1\xe0\xb7\x87_=,\xf8W\xfao\xe5\xa3\xc9\x8f\ -\xcd\x1f/)\xecP\xb8\xebI\xd0\x93\xb3E\xfd\x8a\x0a\ -\x9e\xca\x9e*\x9f\xcdxn\xfb|\xdd\x0b\xaf\x17G\x8b\ -c\x8b\xff.\x11\x95T\x96N+\xb3-[_\xce.\ -\xcf\xafH\xaa\xb8W\x99U\xc5\xa8Z\xf8\xb2\xe3\xcb\x03\ -\xafz\xbc\xba\xa1\x14U\xdf\x8f&A\x82\x04\x09\x12$\ -H\x90 A\x82\x04\x09\x12$H\x90 A\x82\x04\x09\ -\x12$H\x90 A\x82\x84\x1a\xb1\xb1\xb1\xfc\x9c\x9c\x9c\ -\x85zzz\xf4\xf7\x97&\xa1K\xb8\xba\xba\xfa\xe5\xe7\ -\xe7\x97\x9f={V\xb9l\xd9\xb2\x13VVV\xb6M\ -\xad\xd3\xff\x17\xd8\xdb\xdb;\x1d>|\xf8\x09\xf2\xbd&\ -\xec\xdd\xbb\xb7\x00\xb5IS\xeb\xf6_\x07\x1ak\x0e\x1e\ -<\xf8P\xdb\xf7\x9ap\xf2\xe4\xc9\xb2\xb8\xb8\xb8\x94\xa6\ -\xd6\xf1\xbf\x8cE\x8b\x16\x1d\xae\xcb\xf7\xda\x01\xce\x09\x8b\ -\xe8t:\xa3\xb1\xb2\xac\xad\xad\xed\xc2\xc2\xc2\xfa\x0a\x85\ -\xc2)s\xe7\xce\xdd\xb7q\xe3\xc6+\xfb\xf6\xed\xbb\x0b\ -\xdb\xb9\x14\x05\x14\xdf\xb4i\xd3\xd5y\xf3\xe6\xed\x17\x89\ -DS\xc3\xc3\xc3\x13Q\x1d]\xd8\xf99\x22))I\ -\xf4>\xdfk\x02\x9a\x13>\xc4\x17666\xf6C\x86\ -\x0c\xc9Z\xbe|y\xfe\x993g^\xd5W\x9e&\xa0\ -:+W\xae<=t\xe8\xd0\xec\xe6\xcd\x9b\xb7\xfc\x18\ -~h*\x8c\x1c9rqC|\xa1\x9e\x138\xf5\xe1\ -\xed\xe2\xe2\xc2\x9e\x16X,V\xc0\x81\x03\x07\xee7\xc4\xfe\xd7\xe7\ -\x044\x8f\xa31\xe2\xd8\xb1c/>\xb6\xef5\xe1\xf8\ -\xf1\xe3\xc5\xc9\xc9\xc99\xba\x98\x9b\x9a\x1a\xa8\xdf\xa2q\ -\xb6!\xf6k\xe6\x046\x9b\x1d\xb1u\xeb\xd6?>\x95\ -\xdf_\x0f\xdb\xb6m\xbb\xce\xe1p\xa2\x9a\xda\x87\x8d\x05\ -\xecG\xfac\xc6\x8cY\xd6\x10\xdb\x8f\x1e=\xfa\xbc\xa9\ -\xfc\xfez@k&\x0aDS\xfb\xb1\xb1h\xe8\x9c\xf0\ -9\x85\xdc\xdc\xdc\xbd&&&fM\xed\xc3\xc6\xe2C\ -\xe6\x84\xcf%\xa0\xf1\xc8\xc9\xc9\xa9sS\xfb\xb0\xb1\xf8\ -\x909\xe1s\x09h\x5c\xf4\xf5\xf5\x0doj\x1f6\x16\ -\xea9aiS\xfb\xf3C\x02\xba\xa6\xfe/\xb4\x01B\ -ff\xe6\x5c]\xf9\x05]\xc7)\x14\x8a9h\xcd\x02\ -\xc7\x89N\x86\x86\x86&0\x18;::\xb6\xdf\xb3g\ -\xcf\x1d]\xb7\x01Z\x9f5\xb5\xff\x1a\x03??\xbfH\ -dGc}\xb1s\xe7\xce\x9b!!!\xf1\xefZ\xa3\ -\xa0\xb1\xfbc\x9c\x07\xc8\x86O\xe93]\xa1S\xa7N\ -\xde\xe8:\xa7\xb1>@\xcfu\x18\x0c\x86\xc1\xfb\xe4}\ -\x0c\xff\xa3\x80l\x80\xb6x}\x0a\x9f\xe9\x0a\xe8\xfa~\ -\xff\xfe\xfd\xf7ta?\xba\xb7Y\x9f\xfb6\x1f\xcb\xff\ -( [\xbe\x94{xFFF\xa6\x1b6l\xb8\xa4\ -K\xfb\xd1\xf3\xb5\xb8\xb8\xb8\xd4w\xc9\xfd\x98\xfeGa\ -\xdd\xbau\x17\xd0|\xf3\xa9\xfc\xf8!@\xdfk\x9a=\ -{\xf6\xae\x8f\xe5\x03t\xdf\xf5m\xf7l>\xb6\xffQ\ -\x989s\xe6v\xadoR}v\xe0\xf1x\xa3>\xb6\ -\x0f\x96-[v\x12=\x1bx]\xf6\xa7\xf0?\x0a\xe8\ -\x99DS\xf8\xf6}pww\xf7\xff\xe5\x97_\xaa>\ -\x85\x0f\xd0\x9c\xe0\xe6\xe6\xd6U[\xfe\xa7\xf2?z\x96\ -\xd0\xa5K\x17\xdf\xa6\xf2s]@c>Z#6\xd6\ -\xb6\x86<\xe7BsB|||\xf5\x17\x7f>\x95\xff\ -Q\xd8\xbau\xeb\x9f\xfa\xfa\xfa\x86M\xe9sm\x0c\x1f\ ->\xfc[]\xd85q\xe2\xc45\x0d]7\x8d\x1a5\ -*\x0f\xcd\x09\x9f\xd2\xff(\xa4\xa6\xa6\x8eoj\xbf#\ -\xa0{\x86\xba\xba\x97\xec\xe9\xe9\x19\x84\xc6\xf6\x15+V\ -\x9cjH=\xf4\x8cx\xc7\x8e\x1d\xff|J\xff\x1f:\ -t\xa8\x10]{7\xb5\xff\x07\x0f\x1e\x9c\xa9\x0b{N\ -\x9c8QB\xa3\xd1\x88\x0f\x96\xa3\xfe\xd7\x86\xaelY\ -\xbat\xe9\xf1\xba\xf8\xa3u\xce\x87\xce\x09o\xd3y\xe1\ -\xc2\x85\x87t\xa1\xf3\xe6\xcd\x9b\xaf}<\xcf\xd6\x0fh\ -\xdc\xd0\x85-\xb3f\xcd\xda\xf96\x19\x1f:'\xd4u\ -\x9d\x800c\xc6\x8cm\xba\xd0\x19\xd9\xfe\xf1<[?\ -\xe8j\xdeC\xd7U\xef\x92\x83\xfa3\xea\xd7\x0d\xe1Y\ -\xd7u\x02B^^\xdeQ]\xe8\x0cm\xff\xfb\xe3y\ -\xb6~\x98?\x7f\xfeA]\xd8\xb2}\xfb\xf6\xbf\xea#\ -\x0f\xad\xf95\xef[\xd7'\xa09\x01\xcd#\xda\x058\x1cN\xb4.\xae\x0b\xb2\xb2\xb2\xbe\xfb\x90\xf7\ -\x0e\xd039\xf4\xeePc\xe5#\x1b\xbe\xd4=\x02\xdd\ -\xbbw\x1f\xa8\x8b6@\xeb\x9a\x9e={\x0e\xd1<\x1f\ -x\x17\xd0\xfa5&&f\xa8.\xde\xc1\x86\xba\xbfD\ -6|\x0a_},DFF\xf6\xd7\xd5\xf51z\xe6\ -\x84\xae{\xd0\xfeR\xb4O\x0f\xbdg\x8d\x02\x8a#\x1a\ -Z\x7f\xbd\xbe\x1f\xbc\xb1}\xbf\xb1\xf3\xd0\xe7\x80\xd0\xd0\ -\xd0\x84\xa6x>\xa5\xab\x80\xde\xe3\xfe\xdc\xd7=\xefC\ -PPP\xac.\xde\xc5m\xaa\x80\xf63|)\xeb\x9f\ -\xb7\xa1c\xc7\x8e\x9e\xe8\xfa\xaa\xa9}\xf9\xa1\x01\xcd)\ -\xe8=\xa7\xa6\xf6cc`fff\xb5`\xc1\x82\x9f\ -\x9a\xda\x97\x1f\x1a\xd0\xf3\x84/}N\xa0P(Tt\ -\xaf\xb3\xa9}\xa9\x09h\xbf}C\xaf\x19\xff\x0bs\x02\ -\xbaF\xf8\xd4\xefMi\x07\xf4\xce\x85\xbf\xbf\x7f\x0f\xa4\ -\x0b\xba\x97\x8f\xf6%7\xa4\xbezNphj?6\ -\x06M\xb1\xff\x1d\xc9\xaak\xff;J\xa3\xfd\xf9\x0d\xe1\ -\x85\xe6\x04\xb4\xe7\xb3\xa9\xfc\xa7+\xa0\xb5\xc5\xd7_\x7f\ -\xbd\xf6S\x8c5\xef\xeb\xb3\xe8;\x15\xe8{\x15\xf5\xe5\ -\x89\xe6\x04\xb4\xf7\xf9S\xf9\xeac\x02\xad\x91\xc6\x8f\x1f\ -\xbf\xb2!\xf6\xbf/\xa0\xfbp\x13&LX\xd5\x90}\ -D\xe8\xdeQC\xe7\x84\xcf\xf9\xdetCannn\ -\x8d\xbe3\x84\xd6J\x1fr\xed\x86\xea\xa0\xf7\xac\xfa\xf5\ -\xeb'\xb6\xb0\xb0\xb0\xf9\x10\x1d\x1a:' Y\xba\xf6\ -\xc3\xe7\x00SSSs4W\xa31\x1b}\xa3\x06=\ -w\xdf\xb2e\xcb\xefh\xec\x85\xe1\x01\x8a\xa3g\xeb\xdf\ -|\xf3\xcd&T\xa6k\xd7\xae\xddQ\x1d]\xc8F\xf3\ -S}\xee\xe3}N\xcf\x83\xff\x8b\xe8\xd3\xa7\x0f\xfe\xb6\ -1\x11\xb5\xfd\x97\xbe\x16\xfd\x12\x80\xbe\xeb\xf8\xfa\x9c\x80\ -\xdeM\xfd\xd2\xd7\xa0_\x12\xd0\xf7M5s\x02\x9a\xd7\ -\xffK\xdf4\xfbR\xa0\x99\x13\xd0w\x7f\x9bZ\x17\x12\ -$H\x90 A\x82\x04\x09\x12$H\x90 A\x82\x04\ -\x09\x12$H\x90 A\x82\x04\x09\x12$H\x90\xa8\x06\ -u\x05\x06\xa8\xf0\x1f\x83?\xb0\x82\x02hD\x1c\x80\xa1\ -+\xa85qU\xd1`\xbe$\x19g\xc6\xa6I\x14\x12\ -y\x9aD\xca\x0c\x93\xf02D\xb8X\xc1\x0c\xe3*\xb8\ -\xcc\x10\xa1\x84\x97\x0e\xd8!\xd111\x092\xe2=$\ -\x14\xef\xc9\x1d!\x03\xc0\xc0\x8f\xe0c\x01\x03\xdaI\x17\ -\x03C\x02\xa0)\x95\x00\xd0J\x09\xd6\x85D~!@\ -\xdf7/D\xf5\xc4\x12\x99H\x09\xf4\x91\x02\x9a\xf7\xed\ -;\x00\x80j\xbc?0\xe2\xd3\xb8R\x9c\xc9B|\x84\ -\x19b\xf4\xed\x19+\x18\x18 \x1e\xa4\x01.\x90\x02\x1c\ -0\x01K\xa5\x9fP,G{,irX\x85H\x8f\ -\x10\xa0g\xba\xc8r[\x94\xe6\x09\x93\x85(\x8d\xa9\xed\ -\x11\x88S\xb2\xd5\xf9D:]\x9c.\xd1N\x0b\xe5\xd2\ -\x94Zi\x9e\x10\xf1\xd7\xd7\xb8\x1b\xd1\xe4i\x22$\x03\ -\xed\xe9\xc3\x08\x19\x19r\x85:\x1b\xbd\x9fg\xa6\xf6:\ -\xac%\xc2\x15\x5c>t\xae\x9ab \xe4\x8e\xc0e\x09\ -\x02\x11\xce\x97d$\x07_m\x17Y\x94\xc4\xdaK\xf0\ -L\xc9\x96I\xd5uk\x03\x83\xb2\x0d\x8110\x02\xf6\ -\xa09\xb0\x86\xbf\xe6\xc0\x12\x963V\xffl\xe0\xcfZ\ -\xfd\xb3\x84\xa1\x05Q\xc2\x068T\xff\xec\x81\x1dA\xb1\ -\x84^D\xa5P\x8d\x16\xc0\xb6\x9a\x839\xa4\xb7Ps\ -\xb6\x87r\x8c\xa1<\xfd\x97\x80\xc2_H?\x02^\x01\ -\x9a_\xb9\xf2\x84\xedQ\xa0\x04\x98\xd3\x93WJ\xac\xc0\ -\xef\x18lf\xfa\xc3*%V\x96r\x1c\xeaw\xb8\x5c\ -\x89-b<\x05&v}\xa7\xec\xbbr\xb7\xb4\xf4\xee\ -\xd5\xfdS\x13\xed\xfe\x07\x80\xa8T\x89\x9d\xb0+\x06T\ -\xfb\xac\xfcW\xc5J\xea\xab\xd3\xd9-\xef\x01\xb0\xb8\x04\ -r\xe1\x94\x01\x0a{}\xe5\x13%\xa5r#\xe7\x01\xe4\ -\x98^Q\x8a8V\x02\xcca\xe3\x03%\xb6\xd9\xf1_\ -$2\xe0~\x89\x92\xbe\x88\x01\x00=\xfb\xc5=%\xa5\ -8\x87\xf1\x18\xea\x849\x9c.QRO\xd8E\xfcq\ -G\x89]\x8f*\x04/\x01\xa6\xbf\xacD\x09\x9e\xff\xa3\ -\xc4\xa6R\x8a\x00\xe4\x92^qY\x89\xed5{\x0a*\ -\x10\x17\x18\xbf\xde\xf9\x19(GUa\xfcy\xf8sP\ -\x06\xeb,\x85\xf1\xd2\xf0\x17\xa0\x04\x80\xb9O\x94\x8c\x82\ -9Q\x9dL\x8c\xdb\xdf)\x84\xd4\x88bP\x0a\xb0\xc8\ -\xd2\xa7J\xca\xcdxJ%\x00\xd7\x1fCjd\x09\xaa\ -\xe7]\xfcT\x89-4(\x87\xc4GJ\xac\xd8\xab\x14\ -1v\xbcW\xa4\xc4\xeer\x10\xf1_%v\xafe\x19\ -\x92lz\x09\xf2*O\xad\x80\xc4\x87J\xec\x82I9\ -R\x0d\xdb\x05\x0b,fTA\x22\xb4t;V\x01\x89\ -`\x14\x8c\x9e\xb4\x7f\x09i\xf7\x95 \xab\x02T\xc13\ -\xa7\xea>\xe4\xd8\xf5\x15A\xc3*}+\x91\x9d\xa67\ -\x9f*\xc1\xabR%\xad<\x0d\xd2\xef)\xb1?\x0d\xab\ - \x1d|\x0b\xa5\xaf\xb9W\xa2\xa4\xe41\xae\xdfU\x82\ -\xf1U\xc8Of\xcf\x8b\x94\x94 \xfbS\xd0\xe3\xf9\xff\ -\xdcUb\x85\xc6/!\x19d\x16)i%z\x80\xb1\ -\x04\xba\xac\xb2@\x09\x86\x13\xd4\xddEJp\x03J\x10\ -\xa0\x96\xa8\x18[\xee\x0c\xfe\x80\x94\x1dD\x1e\x8a\x1d\x87\ -*u\x85\x12\xb0<\x06\xd4\xf7\x10\xa4\x5c#\xf2J`\ -l'4K%\xc6\x1e\x9a\xb5\x0dRJ\x88\xbc\x7f`\ -\xec$\xf4\x03#\xaf\x04\x99\x02\xf5<\x0a)\x7f\x13y\ -\x07a\xec/\xe8\xcd\xb4r$O\xa0\x96\xb2\x9f\xc8\x9b\ -\x0a\xad)\xa5\xc3\xcc\xaewaK/a\xe8\x15\xc3\xac\ -I(\x0bkU\x05\xa3!\xb0m\xec\xf3!\xcfS\xf1\ -\xb0d\xb9\xddK\xe4\x82\x0d0cz\x89J\x18x\x01\ -\x13\xcb\x90g0\xa7g\xb0\xb5n\xd3\x8b\x91$\xe8\xaf\ -'PC\xa8\xe3`\x98\x9f\xf6\x02\x09\x80\xfeN\xaaD\ -M\xb0\x1c\x96\xbbe\x04i\xf6'\x1f*\xc1b\xd4,\ -\x98\xc19\xe8\xee5\xcf!\xd3\xc5\xb0\xa9\xcf2*P\ -\xab\xb6,\x80\xc4a\xcf\x00\x96Z\xfeD\x89\xfd\xcf\xbe\ -\x1c\xb5\xbf\xfb\xf3gJ\xec\x95\x0cR9O!\xa3g\ -ne\xa8\xabDW\xc1\xf8w&P\xb8\xe9B\x18\xab\ -\x8a*E\xddj \xa4R\xee\x0e\xd1+\x07\x14\xfa\xd0\ -\xfb\x90\xfer`\x09\xec\x84X\x7fh\x9bA\xe1\xb2D\ -\xb6\x83\x03;q\xf9\x13\xc8\xbcjX\x09\x80\x95\x13*\ -/)\xb1\xa5\x8c2\x00\xb5\x8b-\x85\xf1\xd3P(\xd4\ -\xca\xf3\x16\x8c\xdf\xf7\xaf\x00P\xac\xd5O0^1\xac\ -\x12<\x05\x18u:<\x13\xd6\x17\x94\xa0J/\xc1\x13\ -\xa8\xc7\xf5;J\xda\x8d\x1e\xc0\xee\x04\xa4\x9dvx\x85\ -\x06k\xd59\xf5\x22\x87\x01\xbd\xcaX\x04\xfd|?\x00\ -\x80G\xd0\xfc\xb5\xb0/\xaew\x80\x86\xa6\x94\x95*)\ -\x15\xe9\xe0!\xa0x\xae,\x83'k\xf9*\xd8\xd91\ -\x0ed\x0c\x16\xdf\x07Tk\xd1O\x95\xf0\xc4\xae<$\ -\xb6\x81\x8a\xd9\x9d(U\x02q\x0101\x8f\xce\xd9\x98\ -\xff\xfb\xfd\x07\xbf\x9f\xda\x94\xd3\xdd\xbc\x08`\xf4\x85p\ -\x90X\x06\xe0p\x81\x97U))\xa7\x18\xe0\x18\xc0\xfc\ -\x0a^)\xa9\xf7\x1c`\x97\x004\xdb\x13\xcar\xce+\ -p\x04*\xb5\x90\xff\x12\x0d{\x94\xa6\xf8\x1d8\xdb\x14\ -?\xd2\xda\xff\xb0\xb5\xeauT\x8c\x1c\xedo0U\xad\ -q\x08x\x8cS\xe7\xc5r\x15\x0a\xcd\xda\x22BU\xce\ -X\xbb\x1c:\xfc\x1f\x02\xea)+\ -\x00\x00\x80\x08\ -I\ -I*\x00\x08\x00\x00\x00\x18\x00\xfe\x00\x04\x00\x01\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ -\x00\x04\x00\x00\x00.\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ -\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00\x11\x01\x04\x00\x01\x00\x00\x00NS\x00\x00\x12\x01\x03\ -\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ -\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x17\x01\x04\x00\x01\x00\x00\x000\x12\x00\x00\x1a\x01\x05\ -\x00\x01\x00\x00\x006\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ -\x00>\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ -\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ -\x00\x22\x00\x00\x00F\x01\x00\x002\x01\x02\x00\x14\x00\x00\ -\x00h\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ -\x00\x1f8\x00\x00|\x01\x00\x00I\x86\x01\x00j\x0d\x00\ -\x00\x9c9\x00\x00i\x87\x04\x00\x01\x00\x00\x00\x80e\x00\ -\x00s\x87\x07\x00H\x0c\x00\x00\x06G\x00\x00\x5c\x93\x07\ -\x00X\x1a\x00\x00\xace\x00\x00\x00\x00\x00\x00\x08\x00\x08\ -\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\x00\x00\xf9\x15\ -\x00\x10'\x00\x00Adobe Photo\ -shop CC 2017 (Wi\ -ndows)\x002017:04:0\ -4 11:01:25\x00\ -\x0a\x0a \ - \x0a \x0a \ - paint.net \ -4.0.9\x0a \ - 2017-03-01T11:2\ -0:20-08:00\x0a \ - 2017-04-04T\ -11:01:25-07:00\x0a\ - 2017-\ -04-04T11:01:25-0\ -7:00\x0a \ - imag\ -e/tiff\x0a 3\x0a \ - sRGB IEC\ -61966-2.1\ -\x0a xmp.\ -iid:7284f562-66e\ -c-6d4b-bfaf-a292\ -c87d086e\x0a \ - adobe:doc\ -id:photoshop:aca\ -ee4ff-1960-11e7-\ -bae7-e6e7a5cd281\ -4\x0a xmp.did:\ -15df0628-f397-b6\ -41-8e6b-37248a21\ -c43f\x0a\ - \x0a \ - \x0a \ - \x0a\ - \ - \ -created\x0a \ - xmp.i\ -id:15df0628-f397\ --b641-8e6b-37248\ -a21c43f\x0a \ - 2017-03\ --01T11:20:20-08:\ -00\x0a\ - \ - Adobe Pho\ -toshop CC 2017 (\ -Windows)\x0a \ - \x0a \ - \x0a \ - saved\x0a \ - \ -xmp.iid:7284f5\ -62-66ec-6d4b-bfa\ -f-a292c87d086e\x0a \ - \ -2017-04-04T11:01\ -:25-07:00\x0a \ - Ad\ -obe Photoshop CC\ - 2017 (Windows)<\ -/stEvt:softwareA\ -gent>\x0a \ - /\x0a \ - \x0a \x0a \ - \x0a \x0a <\ -/rdf:RDF>\x0a\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \x0a\x008BIM\x04\ -%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x008BIM\x04:\x00\x00\x00\ -\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x0bprintOutput\x00\x00\x00\x05\ -\x00\x00\x00\x00PstSbool\x01\x00\x00\x00\ -\x00Inteenum\x00\x00\x00\x00Int\ -e\x00\x00\x00\x00Clrm\x00\x00\x00\x0fpri\ -ntSixteenBitbool\ -\x00\x00\x00\x00\x0bprinterName\ -TEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0fpr\ -intProofSetupObj\ -c\x00\x00\x00\x0c\x00P\x00r\x00o\x00o\x00f\x00\ - \x00S\x00e\x00t\x00u\x00p\x00\x00\x00\x00\x00\ -\x0aproofSetup\x00\x00\x00\x01\x00\ -\x00\x00\x00Bltnenum\x00\x00\x00\x0cb\ -uiltinProof\x00\x00\x00\x09p\ -roofCMYK\x008BIM\x04;\x00\ -\x00\x00\x00\x02-\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x12printOutputOp\ -tions\x00\x00\x00\x17\x00\x00\x00\x00Cpt\ -nbool\x00\x00\x00\x00\x00Clbrbo\ -ol\x00\x00\x00\x00\x00RgsMbool\x00\ -\x00\x00\x00\x00CrnCbool\x00\x00\x00\x00\ -\x00CntCbool\x00\x00\x00\x00\x00Lb\ -lsbool\x00\x00\x00\x00\x00Ngtvb\ -ool\x00\x00\x00\x00\x00EmlDbool\ -\x00\x00\x00\x00\x00Intrbool\x00\x00\x00\ -\x00\x00BckgObjc\x00\x00\x00\x01\x00\x00\ -\x00\x00\x00\x00RGBC\x00\x00\x00\x03\x00\x00\x00\x00\ -Rd doub@o\xe0\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00Grn doub@o\xe0\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00Bl doub\ -@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00BrdT\ -UntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00Bld UntF#Rlt\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Rslt\ -UntF#Pxl@b\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x0avectorDatabo\ -ol\x01\x00\x00\x00\x00PgPsenum\x00\ -\x00\x00\x00PgPs\x00\x00\x00\x00PgPC\x00\ -\x00\x00\x00LeftUntF#Rlt\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Top U\ -ntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00Scl UntF#Prc@\ -Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10cropW\ -henPrintingbool\x00\ -\x00\x00\x00\x0ecropRectBott\ -omlong\x00\x00\x00\x00\x00\x00\x00\x0ccr\ -opRectLeftlong\x00\x00\ -\x00\x00\x00\x00\x00\x0dcropRectRi\ -ghtlong\x00\x00\x00\x00\x00\x00\x00\x0bc\ -ropRectToplong\x00\x00\ -\x00\x00\x008BIM\x03\xed\x00\x00\x00\x00\x00\x10\x00\ -\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\x00\x00\x01\x00\x018\ -BIM\x04&\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00?\x80\x00\x008BIM\x03\xee\x00\ -\x00\x00\x00\x00\x0d\x0cTransparen\ -cy\x008BIM\x04\x15\x00\x00\x00\x00\x00\x1e\x00\ -\x00\x00\x0d\x00T\x00r\x00a\x00n\x00s\x00p\x00\ -a\x00r\x00e\x00n\x00c\x00y\x00\x008BI\ -M\x045\x00\x00\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\xff\ -\xff\x00\x00\x00\x00\x00\x00\x00d\x01\x008BIM\x04\ -\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ -\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\ -\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\ -\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\ -\x008BIM'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x018BIM\x03\xf5\x00\x00\x00\ -\x00\x00H\x00/ff\x00\x01\x00lff\x00\x06\x00\ -\x00\x00\x00\x00\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\ -\x06\x00\x00\x00\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\ -\x00\x00\x06\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00\ --\x00\x00\x00\x06\x00\x00\x00\x00\x00\x018BIM\x03\ -\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ -\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ -\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\x03\xe8\x00\x008BIM\x04\x00\x00\x00\x00\ -\x00\x00\x02\x00\x008BIM\x04\x02\x00\x00\x00\x00\x00\ -\x02\x00\x008BIM\x040\x00\x00\x00\x00\x00\x01\x01\ -\x008BIM\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\ -\x00\x00\x038BIM\x04\x08\x00\x00\x00\x00\x00$\x00\ -\x00\x00\x01\x00\x00\x02@\x00\x00\x02@\x00\x00\x00\x04\x00\ -\x00\x01+\x00\x00\x00\x0a\xc5\x00\x00\x00\x01\x1b\x01\x00\x00\ -\x0a\xd5\x018BIM\x04\x1e\x00\x00\x00\x00\x00\x04\x00\ -\x00\x00\x008BIM\x04\x1a\x00\x00\x00\x00\x035\x00\ -\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\ -\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00nu\ -ll\x00\x00\x00\x02\x00\x00\x00\x06bounds\ -Objc\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rc\ -t1\x00\x00\x00\x04\x00\x00\x00\x00Top lo\ -ng\x00\x00\x00\x00\x00\x00\x00\x00Leftlo\ -ng\x00\x00\x00\x00\x00\x00\x00\x00Btomlo\ -ng\x00\x00\x00`\x00\x00\x00\x00Rghtlo\ -ng\x00\x00\x00`\x00\x00\x00\x06slices\ -VlLs\x00\x00\x00\x01Objc\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x05slice\x00\x00\x00\x12\x00\ -\x00\x00\x07sliceIDlong\x00\x00\ -\x00\x00\x00\x00\x00\x07groupIDlon\ -g\x00\x00\x00\x00\x00\x00\x00\x06origine\ -num\x00\x00\x00\x0cESliceOri\ -gin\x00\x00\x00\x0dautoGener\ -ated\x00\x00\x00\x00Typeenum\ -\x00\x00\x00\x0aESliceType\x00\x00\ -\x00\x00Img \x00\x00\x00\x06bounds\ -Objc\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rc\ -t1\x00\x00\x00\x04\x00\x00\x00\x00Top lo\ -ng\x00\x00\x00\x00\x00\x00\x00\x00Leftlo\ -ng\x00\x00\x00\x00\x00\x00\x00\x00Btomlo\ -ng\x00\x00\x00`\x00\x00\x00\x00Rghtlo\ -ng\x00\x00\x00`\x00\x00\x00\x03urlTEX\ -T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00nullT\ -EXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Msg\ -eTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x06a\ -ltTagTEXT\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x0ecellTextIsHTM\ -Lbool\x01\x00\x00\x00\x08cellTe\ -xtTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x09\ -horzAlignenum\x00\x00\x00\ -\x0fESliceHorzAlign\ -\x00\x00\x00\x07default\x00\x00\x00\x09v\ -ertAlignenum\x00\x00\x00\x0f\ -ESliceVertAlign\x00\ -\x00\x00\x07default\x00\x00\x00\x0bbg\ -ColorTypeenum\x00\x00\x00\ -\x11ESliceBGColorTy\ -pe\x00\x00\x00\x00None\x00\x00\x00\x09to\ -pOutsetlong\x00\x00\x00\x00\x00\ -\x00\x00\x0aleftOutsetlon\ -g\x00\x00\x00\x00\x00\x00\x00\x0cbottomO\ -utsetlong\x00\x00\x00\x00\x00\x00\x00\ -\x0brightOutsetlong\ -\x00\x00\x00\x00\x008BIM\x04(\x00\x00\x00\x00\x00\ -\x0c\x00\x00\x00\x02?\xf0\x00\x00\x00\x00\x00\x008BI\ -M\x04\x14\x00\x00\x00\x00\x00\x04\x00\x00\x00\x048BI\ -M\x04\x0c\x00\x00\x00\x00\x04\x02\x00\x00\x00\x01\x00\x00\x00\ -0\x00\x00\x000\x00\x00\x00\x90\x00\x00\x1b\x00\x00\x00\x03\ -\xe6\x00\x18\x00\x01\xff\xd8\xff\xed\x00\x0cAdobe\ -_CM\x00\x01\xff\xee\x00\x0eAdobe\x00d\ -\x80\x00\x00\x00\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\x09\x08\ -\x0c\x09\x09\x0c\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\ -\x13\x13\x15\x13\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\ -\x0d\x10\x0e\x0e\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\ -\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\ -\x000\x000\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xdd\ -\x00\x04\x00\x03\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\ -\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\ -\x07\x08\x09\x0a\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\ -\x0a\x0b\x10\x00\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\ -\x03\x0c3\x01\x00\x02\x11\x03\x04!\x121\x05AQa\ -\x13\x22q\x812\x06\x14\x91\xa1\xb1B#$\x15R\xc1\ -b34r\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs\ -5\x16\xa2\xb2\x83&D\x93TdE\xc2\xa3t6\x17\ -\xd2U\xe2e\xf2\xb3\x84\xc3\xd3u\xe3\xf3F'\x94\xa4\ -\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\ -\x86\x96\xa6\xb6\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\ -\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\ -\x06\x07\x07\x06\x055\x01\x00\x02\x11\x03!1\x12\x04A\ -Qaq\x22\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\ -\xd1\xf03$b\xe1r\x82\x92CS\x15cs4\xf1\ -%\x06\x16\xa2\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17\ -dEU6te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\ -\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5V\ -fv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6'7GWgw\ -\x87\x97\xa7\xb7\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\ -\x00?\x00\xf4<\xdc\xcc\x96d\x9a\xa9;@\x80\x00\x00\ -\x92O\xc6P\xfd~\xab\xe0\xff\x00\xfbl\x7f\xe4R\xc9\ -\xff\x00\x95\x1b\xfdz\xff\x00\xef\xabR\xcb\x19[\x0b\xec\ -!\xad\x1c\x92\x92\x9c\xbf_\xaa\xf8?\xfe\xdb\x1f\xf9\x14\ -\xbd~\xab\xe0\xff\x00\xfbl\x7f\xe4T\xed\xea\xee\x9f\xd0\ -\xb0\x06\xfe\xf3\xff\x00\xf2#\xff\x00$\x95]]\xd3\xfa\ -f\x02\xd3\xf9\xcc\xff\x00\xc8\x9f\xfc\x92Ja\xeb\xf5_\ -\x07\xff\x00\x98?\xf2(\x98\x19\x99\x16dzV\x9d\xc0\ -\x83\xc8\x00\x82?\xaa\xb4+\xb1\x960>\xb2\x1c\xd3\xc1\ -\x0b+\x07\xfeP?\xf5\xcf\xca\x92\x9f\xff\xd0\xef\xf2\x7f\ -\xe5F\xff\x00^\xbf\xfb\xea\x16fS\xb2-\xff\x00\x83\ -i\x867\xfe\xff\x00\xfd\xa4\x5c\x9f\xf9Q\xbf\xd7\xaf\xfe\ -\xfa\x87\x9b\x8a\xec{\x09\x03\xf4O>\xc3\xe0O\xe6\x1f\ -\xfb\xeaJnt\xecJ\x85-\xb9\xed\x0e{\xf5\x13\xac\ -\x0e\xd0\xa9dc\xde-\xb5\xfe\x9b\x85a\xce;\xbbD\ -\xf2\xad\xe0f\xd4\xda\x856\xb81\xcc\xd1\xa4\xe8\x08\xf8\ -\xa5\x9f\x9bS\xaa4\xd4\xe0\xf7?G\x11\xa8\x03\xe2\x92\ -\x9a\x98y.\xc7\xb4\x7f\xa3y\x01\xe3\xfe\xff\x00\xfd\x94\ -L\x1d:\x8b\x87\x9d\x9f\x95C\x0b\x15\xd9\x16\x87\x11\xfa\ -&\x19q\xf1#\xf3\x07\xfd\xf9O\x07^\xa2\xe3\xe7g\ -\xe5IO\xff\xd1\xef\xf2\x7f\xe5F\xff\x00^\xbf\xfb\xea\ -\xd4{\x1a\xf6\x96<\x074\xe8A\xe1g\xe6\xe1d\xbf\ -$\xdbP\x90b\x0c\xc1\x04!\xfd\x9b\xaa~\xf3\xff\x00\ -\xed\xcf\xfc\xc9%&\xb7\xa4\xb4\x99\xa6\xc2\xd1\xfb\xae\x1b\ -\x87\xdf\xf4\x92\xab\xa4\xb4\x19\xba\xc2\xe1\xfb\xad\x1bG\xdf\ -\xf4\x90~\xcd\xd5?y\xff\x00\xf6\xe7\xfed\x97\xd9\xba\ -\xa7\xef?\xfe\xdc\xff\x00\xcc\x92S\xa8\xc65\x8d\x0c`\ -\x0dh\xd0\x01\xc2\xca\xc1\xff\x00\x94\x0f\xc6\xcf\xca\x9f\xec\ -\xddS\xf7\x9f\xff\x00n\x7f\xe6H\xb88Y\x15\xdf\xea\ -\xda\x03@\x04s$\x92\x92\x9f\xff\xd98BIM\x04\ -!\x00\x00\x00\x00\x00]\x00\x00\x00\x01\x01\x00\x00\x00\x0f\ -\x00A\x00d\x00o\x00b\x00e\x00 \x00P\x00h\ -\x00o\x00t\x00o\x00s\x00h\x00o\x00p\x00\x00\ -\x00\x17\x00A\x00d\x00o\x00b\x00e\x00 \x00P\ -\x00h\x00o\x00t\x00o\x00s\x00h\x00o\x00p\ -\x00 \x00C\x00C\x00 \x002\x000\x001\x007\ -\x00\x00\x00\x01\x00\x00\x00\x0cHLino\x02\x10\x00\ -\x00mntrRGB XYZ \x07\xce\x00\ -\x02\x00\x09\x00\x06\x001\x00\x00acspMSF\ -T\x00\x00\x00\x00IEC sRGB\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\ -\x00\x00\x00\xd3-HP \x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x11cprt\x00\x00\x01\ -P\x00\x00\x003desc\x00\x00\x01\x84\x00\x00\x00\ -lwtpt\x00\x00\x01\xf0\x00\x00\x00\x14bkp\ -t\x00\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\ -\x18\x00\x00\x00\x14gXYZ\x00\x00\x02,\x00\x00\x00\ -\x14bXYZ\x00\x00\x02@\x00\x00\x00\x14dmn\ -d\x00\x00\x02T\x00\x00\x00pdmdd\x00\x00\x02\ -\xc4\x00\x00\x00\x88vued\x00\x00\x03L\x00\x00\x00\ -\x86view\x00\x00\x03\xd4\x00\x00\x00$lum\ -i\x00\x00\x03\xf8\x00\x00\x00\x14meas\x00\x00\x04\ -\x0c\x00\x00\x00$tech\x00\x00\x040\x00\x00\x00\ -\x0crTRC\x00\x00\x04<\x00\x00\x08\x0cgTR\ -C\x00\x00\x04<\x00\x00\x08\x0cbTRC\x00\x00\x04\ -<\x00\x00\x08\x0ctext\x00\x00\x00\x00Cop\ -yright (c) 1998 \ -Hewlett-Packard \ -Company\x00\x00desc\x00\x00\x00\ -\x00\x00\x00\x00\x12sRGB IEC619\ -66-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x12sRGB IEC61966-\ -2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3\ -Q\x00\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ\ - \x00\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\ -\x90XYZ \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\ -\x85\x00\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\x00$\ -\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\ -\x00\x00\x00\x00\x16IEC http://\ -www.iec.ch\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x16IEC http:/\ -/www.iec.ch\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\ -\x00\x00\x00\x00.IEC 61966-2\ -.1 Default RGB c\ -olour space - sR\ -GB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.IE\ -C 61966-2.1 Defa\ -ult RGB colour s\ -pace - sRGB\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00desc\x00\x00\x00\x00\x00\x00\x00,Ref\ -erence Viewing C\ -ondition in IEC6\ -1966-2.1\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00,Reference Vi\ -ewing Condition \ -in IEC61966-2.1\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00view\x00\x00\x00\ -\x00\x00\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\ -\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ\ - \x00\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\ -\xe7meas\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\ -\x8f\x00\x00\x00\x02sig \x00\x00\x00\x00CRT\ - curv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\ -\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00\ --\x002\x007\x00;\x00@\x00E\x00J\x00O\x00\ -T\x00Y\x00^\x00c\x00h\x00m\x00r\x00w\x00\ -|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\ -\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\ -\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\ -\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01\ -%\x01+\x012\x018\x01>\x01E\x01L\x01R\x01\ -Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\ -\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\ -\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\ -\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02\ -]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\ -\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\ -\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03\ -Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\ -\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04\ - \x04-\x04;\x04H\x04U\x04c\x04q\x04~\x04\ -\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\ -\xfe\x05\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05\ -w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\ -\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06\ -{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\ -\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\ -\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x08\ -2\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\ -\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09\ -y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a\ -'\x0a=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\ -\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\ -\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\ -\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d\ -&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\ -\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\ -\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\ -\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\ -\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\ -\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\ -\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\ -\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\ -\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\ -\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\ -\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\ -\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\ -\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a\ -*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1b\ -c\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\ -\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\ -\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f\ ->\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A l \ -\x98 \xc4 \xf0!\x1c!H!u!\xa1!\xce!\ -\xfb\x22'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#8#\ -f#\x94#\xc2#\xf0$\x1f$M$|$\xab$\ -\xda%\x09%8%h%\x97%\xc7%\xf7&'&\ -W&\x87&\xb7&\xe8'\x18'I'z'\xab'\ -\xdc(\x0d(?(q(\xa2(\xd4)\x06)8)\ -k)\x9d)\xd0*\x02*5*h*\x9b*\xcf+\ -\x02+6+i+\x9d+\xd1,\x05,9,n,\ -\xa2,\xd7-\x0c-A-v-\xab-\xe1.\x16.\ -L.\x82.\xb7.\xee/$/Z/\x91/\xc7/\ -\xfe050l0\xa40\xdb1\x121J1\x821\ -\xba1\xf22*2c2\x9b2\xd43\x0d3F3\ -\x7f3\xb83\xf14+4e4\x9e4\xd85\x135\ -M5\x875\xc25\xfd676r6\xae6\xe97\ -$7`7\x9c7\xd78\x148P8\x8c8\xc89\ -\x059B9\x7f9\xbc9\xf9:6:t:\xb2:\ -\xef;-;k;\xaa;\xe8<' >`>\xa0>\ -\xe0?!?a?\xa2?\xe2@#@d@\xa6@\ -\xe7A)AjA\xacA\xeeB0BrB\xb5B\ -\xf7C:C}C\xc0D\x03DGD\x8aD\xceE\ -\x12EUE\x9aE\xdeF\x22FgF\xabF\xf0G\ -5G{G\xc0H\x05HKH\x91H\xd7I\x1dI\ -cI\xa9I\xf0J7J}J\xc4K\x0cKSK\ -\x9aK\xe2L*LrL\xbaM\x02MJM\x93M\ -\xdcN%NnN\xb7O\x00OIO\x93O\xddP\ -'PqP\xbbQ\x06QPQ\x9bQ\xe6R1R\ -|R\xc7S\x13S_S\xaaS\xf6TBT\x8fT\ -\xdbU(UuU\xc2V\x0fV\x5cV\xa9V\xf7W\ -DW\x92W\xe0X/X}X\xcbY\x1aYiY\ -\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\x5c\ -5\x5c\x86\x5c\xd6]']x]\xc9^\x1a^l^\ -\xbd_\x0f_a_\xb3`\x05`W`\xaa`\xfca\ -Oa\xa2a\xf5bIb\x9cb\xf0cCc\x97c\ -\xebd@d\x94d\xe9e=e\x92e\xe7f=f\ -\x92f\xe8g=g\x93g\xe9h?h\x96h\xeci\ -Ci\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\ -\xfflWl\xafm\x08m`m\xb9n\x12nkn\ -\xc4o\x1eoxo\xd1p+p\x86p\xe0q:q\ -\x95q\xf0rKr\xa6s\x01s]s\xb8t\x14t\ -pt\xccu(u\x85u\xe1v>v\x9bv\xf8w\ -Vw\xb3x\x11xnx\xccy*y\x89y\xe7z\ -Fz\xa5{\x04{c{\xc2|!|\x81|\xe1}\ -A}\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80\ -G\x80\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83\ -W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86\ -r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\ -\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\ -\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\ -\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93\ -M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\ -\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\ -\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9d\ -d\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\ -\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4\ -V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\ -\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xab\ -u\xab\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\ -\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\ -\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6\ -y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba\ -;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\ -\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\ -\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\ -\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\ -\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\ -\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\ -\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\ -\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\ -\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\ -\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2\ -S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\ -\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\ -\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef\ -@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\ -\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\ -\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\ -\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\x00 \ -P8$\x16\x0d\x07\x84BaP\xb8d6\x1d\x0f\x88\ -DbQ8\xa4V-\x17\x8cFcQ\xb8\xe4v=\ -\x1f\x90HdR9$\x96M'\x94JeR\xb9d\ -\xb6]/\x98A\x00\x930(*l\x0c\x9c\x03\x02\x13\ -`P0\x07?\x02?\xe8O\xe8X\x06 \x01\xa4\x00\ -hO\xfa$\x1a\x93H\x82R\xdf\xf0J}J\x06\xff\ -\xa4\x80\xa9t\xd0\x05\x1a\x07U\xa5\xd5\xeb\xf4\xfa\x8d\x86\ -\x05S\x81S\xe9VhK\xfc\x05o\x01\xd5\xaa\xf6\xca\ -\x8d~\x0fh\xb4\xd2\x00P\x8a\x95\x92\xefK\xb0P\xac\ -W\x9aM\xca\x9dI\xbe]05\xca\xf0\x02\x98\xfe\xc8\ ->\xf2O\xa7\xa6U\xe2\xf3\xcc<2O\xb7\xce\x1aS\ -O\x07\xe8Bcm!\x10\x87\xa7)\x89\xb5C\x00v\ -\xb4#?\x01\x81*\x98\x88]\xf7i\x87\xa4g\xb18\ -+\x1e\xe7\x01\xb7\x8e\xed\xaa\x17:\x15\xfa\x0d\xba\xde\xda\ -\xf7\x98Ln;\x7f\xbe\xe2\xf0!\x99\xec\x0d\xe2\xbbj\ -\xe8T\xab\x18^\x7f6\x9f\x90\xc8uz\xbb>\xcf\x81\ -\xfc\xf8\xf4=\x9c\xbe\xb6\xf3#\xdc\xbaa|VN\x0f\ -\xa3c6\xfa\x94\x04\xbfAb\xcf\xf4\xe0)\xc0\x03:\ -r\x08-\xebzc\x03\xc1\x10L\x15\x05>\xe6\x94\x1c\ -c\x13p\x89\x04h\xc2\x86+\xee\x90\x00\xd0\xc8\x10(\ -C\x83 \xdb\x0f\x91\x00LD\x05\xc1q,M\x13\xc5\ -\x09B\xa4fE\x85\xf9\x17\x17\x8d\xa6\xfcdk\xb9\x08\ -\xb0;\x1b\x84\x84LtV5A0_\x14\xc8\x12\x0c\ -\x85!\xa2\xe7\xd4\x8c|\x93RI\x00SI\x84|\x8c\ -}\x1f(\xc4\x0a\x01\x07\xb2\xa8\x9aCK\x058\x0f-\ -\x812$\xbd/\xcc\x13\x0a\x04gL\x86\x08\xed3\x8a\ -\x87\x84\xd4v#\x09\x98\x08\x02\x8a\xf3\x88\xda7\xce\x84\ -\x5c\xa71O\x13\xcc\xf5\x03\x9d\x13\xe9\xc44P\x02\x11\ -\xc9A\x9b\xa8\xc42\x03\x01\x03-\x14?\x0c\x14h\xf0\ -\xe3Ot\x8d%I\xa3\xe7\x95,w\x0c\x94\xc8|o\ -S\x86\xad\x0d\x0d\x0d\x95\x09\x0e\xfe\x8b#}!JU\ -\x15MT\x873\x07\x99\xe1E\x0c\xa1\xf1\xb9Y\x9ah\ -\xc4\xb6\x03\x810\xf8\xdaDN\x22\xb8\xdbS\xc4\xae\x13\ -\x9bU\xc8q\xab\xae\xe1\xa1V\x15UV\x9e\x14\xc8\xc8\ -\x1e\x9b\xb6\x89\xa9O\xd1\x03u\xacD\xd7\xb5\xfb\xa4\x89\ -\xaaF\xdd\xbch\x9e\xb7\x09\xe6\xea\xcav\x13\xa8\xe0\x1f\ -\xb7I\xfb;\xb8\x8e\xdb\xb2\xf29Wr\xd4\x82<\xc8\ -E\x80\xe3\xbb\xab+\xa3d9\xd7\xdd\xe3}-\xd0-\ -\xec\xe0X\xc8\xa3\xc6\xe4\xbc\xce\xc5\xde\xbf\xb9`\x04\xdc\ -\x02\x84X\x88T\x05\xe2\x80r8\xca\x9e\x87\x8d\x9c\x1e\ -\xd6f\xe5j\x8b\xd6\xe0MB6\x10\xe2\xc6L7^\ -\xe8\x89\xf9\x95\x9fc\xa6\x5c(\x9a\xf9\x89\x9be!\xf7\ -2\x87\x02\x80xN\x15\x80:\xb6\x15 \xed.\x92\x9d\ -\xea\x81\xe8O\x06R\xe9\xad\x97r\xb5\x9b\xae\x17\xa6\x8c\ -\xe0`\xeec\xcdr\xbb\xb9\xa5\x93|\xdd\xb4\x83\xcc\x08\ -\xeb\x80\xa8\xf9\xaf\x93an\xc4\x1cb\xec\xb0\xc7\xb3\x87\ -\x96\x89\xbbi\xe4\x12\xe6GQ\xbf\xa3z8\xfb\x8c\xdb\ -\xa8~i\xef\x06E\x89\xbd\xef\x88>\xb8\x08\x82\xb1\xd1\ -\x12U\x86\x5c(~\x8eY\x9b\xa8\xcc\x1f\xdb\xc6\xd9\xa5\ -[K\x95\xd5y9h\xe8{\xefX\x07\xc6\xa74d\ -\xef\xbc\xee\xfa\x08t\x00\xa4^E\x95\xc1\x87L\x1er\ -\xa8v1\x8dS8\xe5i\xc8W\x1b~L,e\x16\ -\xda%'\x9f#?t o\x06\x9e\xf5\xcfx\x15W\ -@\x08tQ\x7fK\xd3\xf5(m\x99\xdd\x0c\xe2\x01\xb5\ -\xe7\x9a6\xa0\x11\xc9T\x9b\x926\xfb\xf9\x82\x04\x1ci\ -\x18\xfe\x0f\xbdJx`\xa1\x15\xf1\x95\xbc(d\x1fl\ -\xb8\xcf\x14\x1f\xf9\xe6\xd7\xa3\xb6\xf65\x17g\xda\xdf\x88\ -\xa7/Es<\xdf\xbf\xfd\xcfmh\x1c\x04\x84d\x01\ -\x15\xcf\x99\xc3\x91\xb5\x98\xe6\x18\xeb\x1f\x22\xcc\x85\xc9-\ -\x97\x92C\x1b\xa3vw\xae\xfd\xfeAT\xc0\xf8]\x18\ -\xae\x060l\x1e\x91\xc5\xc2=G\x93g\x0c`\xf2\x04\ -\xbb\x06D\xfc\x99<\x0f!l\xac~\x0f\xb71\x04\xe0\ -\xb41K\xcd\xfd\xc0\xa3\xb7\xcc\xfa 1\x99\x81\x0e\xbd\ -\xf8\x00\x95\xac\x1b\x96\xc2rnfM\xcc9\xa1\xa8\xe7\ -!\x91\x02\x02\xb1,\x0d\x02\xf8\x9c\x0e\xc1DQ\x06Q\ -D\x14\x03\x10-\x15\xc0\xeb\xfe\x021h\x82)a\xe4\ -;\xd6`\xe9\x8cC\x8cl\xc6Q\x9e6#@\xce\x1a\ -\x11\xacb\x0e\xb8\xdc9\xa1\x8c4|b(V\xc1\xb0\ -c\x07a\xca\xaecm\xa9\xb6@\xb7\x22\x88 s\xb6\ -\x220E\xc5\xc3\x07=\x15\xc0\xb0\x1b\x09R,.\x04\ -\x09\x1c\x14\x01\x5c\x91\x06\xf0\xa8\x8f\x15!\xad%\xc6X\ -\xbf\x93B\xbc\x5cI\xd1J\x9fG@\xe3o\x90a\xe3\ -Gh\xf0F\x9d[\xeb}\xaf\xbe??\x16H\xf5H\ -\xe4,\x1fln#D\x85P\xd8\x81h8T\x81\xc0\ -\xd3\x840\xa6l\x0d\x92`]C\xf2M\x0b\xf1^)\ -\xe6@\x90B\x83Dc)8\xe4\xf9%3\x88\x87O\ -\xe2\x12\xc3\xd7$\xfc\xc8\xe3\xb8}r\xd5=\x01y\xbc\ -\x07\x03\x8c\xe1\x11\xc1\x12r\x05W\xf6/\xa7@\xad\x11\ -\xd3\xac9J\x01\xc4\x98_\x0cs\x8e\xb0rJ\x10\x97\ -\x96\xee\xe5[\xd2\x9a\xf0\xa6A\x11\x09\x08\xdd\xdb\xcaD\ -\x00\xb4\x0c\x03\x05\xba\x0c\x1c\xa1\x10|D@%\x12D\ -\x90\x00z\x07\xc0\xf6\x13\xd4LB\x8aJ,#]\xc2\ -@\x99\xf1\xd2h\x91\xb7V\xc6\xe6\xac\xadW2\x01\xca\ -O\xd7-\x11\x1f\xc4\xdcE \xe2\x96\x04d\xce\x1d\x84\ -\x98\x1e\xa6@\x9a\x87\x11\x11\xc7M\xc6\xe3\xa3\x0d\xa3\x1a\ -\x9e\x0b\x84L\xf8`\x08\x8c\x15\xee\x98\x18\x03\xc7\xd2<\ -eS\xd0\x84\xd06\x92\xbfR',\xa5\xa3\xfaA\x09\ -L4\xd5Q\x06\x18j\xc0z\xa6\xa4\x80P\xd5\xd1\x12\ -%k\x00zhd\xba\x1a8!Y\x0d\xe0\xf2\xe1\x84\ --\xa2\x90\x91VC\x0f\xc4HV\xaeA\xb2z\x90\x87\ -p\xf6d1.\x01\xb5\xec\x08\x08J\xfc)A\xdd\x81\ -\x09Ul\x93\xd3\xc1\x8c.\x03\xdd\x89\x0b+0\x96Q\ -\xb9\xe7\x1d\xea;\x98q\xae>\x1e\xb6\xf9`\xf5\xcc\x9b\ -\xeb\xaf$\xa5\x88\x82 UPE\x852\x03\xc0\x96\xc2\ -\x12\xean8\xc6\xe3.\x0e\x81A\xb5)\xe2Oc\xa8\ -\xec\xa82\xd6IoYJD\xec\xa7\xe5N\x22Oa\ -\xdd\xbd\xb7\xbaI\xcd 6\x08u\x04W\x93\xc0\x1bi\ -PP\xf6\xb9C\xd2\x97\x85#\xdc2\x05\xd9$\x86\x90\ -f'\x02\xf0w]H<\x07\x9a\x90\xf0\x8b(p\x11\ -\x5c&\xc5\x98\x1fc\xea\x22\xd5\x22D\x0d\xef@D\x9d\ -b8Y2\x1b\x90\x90\x12x\xf8\x0eW\xcc'\x5c\xfb\ -\xa2G\xe5#\xa4\xa8\x8e\xa2\x93:\xa3-R_uK\ -\xa4\x8a\xfa\xec\x10i\xfff\xc8\xe5,\x07\x01\x1a\xf5\x8b\ -\x1b\xbc\x91#p\xeb\x1c\xc2\xf7\x0a\x0a\xcb\x0c-\xe7t\ -b\x1d#\x8c\xa9D\xb0*\x06\x84\xbe!\x17\xb2 \x0e\ -'\xab\xe3|\xc3\x90O\xb9\xe2\xe8\x8eO\x17\xc9Z(\ -\xf5\xb3\x7f\x16O\x01+\xb9\x03n\xa4\x1d\x99\x82T\x04\ -\x8d\x83\x9c|\x11\xc4nA\x16\x18=\x14\x8e|\x8c8\ -D\x86I\x0es\x14W\xd62\x22+\xf2\x80\xdbF\xe0\ -t\x12);\xe2\x1c\xf2\xc0P\x18\xf9l\x5c\x91\x8c]\ -\x1d1\x85\xb2c6\xd1\xc7cW'\x81/\xe9\x0d\xb7\ -\x8f6\xdf\x11\x89\x22\x0a\xc1\xa8\x99\xceC\x00\x04gP\ -\x14\x90(\xb0\xa4\x11\xa2c>\x07\xda =\xc8\xe6P\ -\x15\xf9I\x1c*\xaa =\x9f\x5c\x97\x1a\xc30\x8a_\ -\x985\x07+L cx\xd2\x1e\xd7\x0a\xe4\x15\xab\xa6\ -i\x82\x06M\xec\xe6\xd2&\x065\x00\x1e\xab\xa2\x84d\ -\x81=L\x06\x111\xe6\xa7B\xafV\x09bI\xa0\xb4\ -&To\x83\xb7Z\x0e\x80\xbf\xad\xc1\xb4\xa0\x94D>\ -\xb2\xc3g\x0b\x0e3\x15Hn\xd3\xe4\x8b\xdd\xe0\xe1\xb1\ -\xc4XU\xd9A\xaf\x02\x90\x5c\x0f\x8f\x08q9\x01\xc2\ -wj\x0cPG\xb5\xc1b@\xaf\xc2\x102\x8b\x0d\xbc\ -'\x09F\xb0\xcayU\xcfY5\x9c\x0f \xf8\xf3!\ -\x9a\xf4D\x8a\xc9M\xb3H#\x89n\xdaR\x91T\xcc\ -\xd1\x8e'\xf6:\x90\xbb@\x84\x94\xf1\x1f\xbf\xc5\x98<\ -\xe0A- \x0bN\x0c(\x04\x07\x09\x0c$\xb3qh\ -W\xbe|F\x10\xb2\xcb\x01\xcc(,l\xbe\xf9u\xfc\ -\xd2U\xd0\xed\x8f=&\xde\x16\xb9\x00p\x88w\x8fN\ -\xa0\xeb~B\x96p|P\x01\xa0A\xa4\x01\xcd\xcb\xc7\ -\x06\x97\x05z\x1f\x86e\x1d\xc7\x0cD\xa79\x0f\x02\x83\ -\x9e\x08\x92\x11\x0d\x04GA\x15P\x13x\x108\xbc;\ -\xde\xce\xf4\xad\xc9sKW>\x8a@\x9d\xc7+\x08:\ -x\x83_\xb4\x92&\x86\x038\xdbU\xfbn\xed\xf2a\ -\xc3u\x94\x16\x98p\x88\x1eR\xa2\x05\xa3\xad\x89\x19\xde\ -N/\xa5\x11H\x18\x88/\x09\x1a\xd9\xee\xf8\x82m)\ -\x90)\xc6\x90\x19\xef@} da\xce8B\x8f\x81\ -\x04\xb2\xcb\xaf\xf3n\x1d\x12G\x17\x89\x1b|\x80-\x03\ -\x0d\x0f\xc5\xf3\x09\x19\xa3\xee\xb6\xb6\xf6\xe6\xdd\x0a\x1d\xa7\ -O\x00\x1d\xce\x0a\x00\x09\xc2\x1cDm\x06\x0ba\xc9\x22\ -\x0a/L\x22\x84\x97\xa9\x0e\xe8'\xb0nK\x08'=\ -\x80\x82\xcf\x82`?\xf9\x0e3\x1eVk\xad\x8f\x90\x9a\ -\xdcy\x9d4B\xdf\xba\xb1\x96\xb5\xec\x06\x81\x01k\xf1\ -\xc7\x19<\x01\x89\x13\xa9\x22\xc1\x980=g\x86\xec6\ -\x13\xa3\x84\xcf\xac\x07\x99\x0c\xf2\xed$b\x0f\x8f-'\ -ms7q#>s[\x85\xf0\xec\xae\xb9\xf2C\x1f\ -?\xac{\x83\xff\xdc\x03\xfc\x22\x08\xf5\xb7\xbc\x81\xef\xf1\ -\x1e\x1c\xbe8\xb5\x14w\x12\xfd\xe9\x1f\xbcu\xae\xda\x22\ -j\xdeZ\xed.\xd3-\xf0\xa4\xeeH\xb7\xaeL\x120\ -\x18\x16\xab\x02\x07k\x06He\x06\x1c\x81\xbaC\x80\xa0\ -\xf5\xc4\x14\x03\x904\x04F\x1e$\x8b\xd6\x16KD\xa6\ -\x84\x86\xe2\x01f\x100L\x0c+\x88\xfbb.ul\ -\xc8\xb6\xce\x96W\x0d\xec[P\x0e!\xcf\x82\x7f(\x8e\ -\x15\xd0p\x1b0BH\x89\x96\x18\xae\xc8\xa6\xaff\x17\ -\xc0i\x08`\x82H\x83\xe8\x1c\x01\xb0s\x09\xe4\xbfo\ -5\x05\x8cf\xfc\x09\xac\xc0pdXb&\xf3\x81\x8b\ -\x0a\xe1\xec\xbd\xc4\x86\x18\x90\xb8\x16\x8d\x8e\x0e\x00\x9a\xa6\ -\xab\x88\x91\xc0\x80\x0a\x04\x88\xfda\xf2\x1e\xe0\x97\x0d`\ -<\x9eO\x22#\x0e\xd6q\x90\xa0\xde\xb0\xa4\xf3J\xee\ -wh&\x16P\xf4\x1b\xe05\x0f\xa0@H\x8b|\x0c\ -Q\x04\x07Jj\xf6\x018\x18J\x88\x94\xe4\x82\xe5\xe1\ -\xcc\x1b\xef\xca\x06\xea\xcd\x0d\xe2.\xbbEb\xf2\xb0\x04\ -\x8f\xecl\xa9\xb0\xa8\xb7jP\xf8G6\x12\xd1@\x17\ -k\x82\x08\x84\x88=a\xca\x1b\xc0\x9f\x15 F\xa6\xb0\ -p\x15\xd0t\xa6d\x88\xc5f\xbe\x0f\x80\xb6\x830\x98\ -\xf7\xe2\x14\xfb\xaf\xbe\xcc\xb0\xa3\x13-\xef\x13lr\xbc\ -k4o'$\xfc\xafVHk\xe2\xfd\xc0~\x01\xe4\ -.{\xe6\x1e\x18\x11\xa0\x1e\x0c\xea\x01\x0c\xeeHj&\ -\x13\xc1\x0a\xee\xe1#\x09g\x91\x17\x09\xec3'\xd7\x00\ -\x22$d/z~\x91\x80\xdf1\x84\xc7g|\xef@\ -2\x03\xe1c\x1d\xe1\xba\xebD\x86\xaa\xa0\xd2\x08a\x97\ -\x1e\xe1|\x7f`g\x1f`~\xceA2\xfa\x04\x86>\ -\xe0\x9d `B>\xf0\xdc\xf6\xe25\x0e1\xc4\x220\ -\x06\x88\x10\x0a\xf3Pj\xec\xc0\x00\xe8!\x10\x15)\xc8\ -\x08\x80\xacH\x8c\xf2\x11\x8c\x92\x12\x00\xea\x7fj\xe0\x0b\ -\xd2D\x0e\xc4\x89\x0fAd\x13\xe1\x05% \xc4\xb6\x0d\ - \xc6,\xc7\x09\xf1y\x0e\x85v\xfcB0\xf3\x82\x09\ -\x03@8\x04D\x98\x14\xc1\xa0\xb8\xc4\x80\xc3A\xc7\x02\ -\xc0I\x19\xa5\x88\xa0`\x0a\x00\xcd`\xd4\x000\x03\xc4\ -\x80Y\x85z\x05\x81\xd5*!\xca\xdd\x8a\xcf!\x0e\xd5\ -\x1c\x0d\xe7\x0ep^\xa4rfd\xeeF\xbc\x8aR\xbc\ -\xc2\x0a\xfa\xc0\x98\x0b\xce\x12\x10\x01BH\x92(\x0d!\ -Y-\xa10o\x84\x00\x0a`\xce\x0f2\xe9-\xe4\x86\ -\x0fR\xf0\x0b\x01u/aR \x8c\xbf*\xa0d\x80\ -\xb2\x12\x9aq*\xbb\x92\xb7\x062 \xdfJ\x00\xee\x82\ -\x17,\xe1?,\x80\xc0H\x09\xdc\xd9@\xaa\x05A\xef\ -2\xe1\xeaRj\x16\x01r\xda\x15\x81\xae\x9b\xc0.\x03\ -\xa4\x80\xdb\xc1`\x13m\xb6\x0c\xc2\x104 \x1e\x02g\ -F\xe3\x13\x02\xb22a\x05\xcf-\x06\x10\xeb\x1b\xc2\x11\ -\x222\xc4!\x11\xa6\x01-\xa8\x13\xa1\x8a\x04\xf3\x80\x06\ -$\x80\x93\xa1p\x14\xb1f\x0b\x85&\xdbaJ\x09\x13\ -\x98\x0bD\x80\x8d\x01\xb0\x19\xb1\x04\x0c@v\xa3\x22\x0e\ -\xf6\xc7\xce\xff\xd1w6Q/6\x92\xbav\x89be\ -\x88^\xdf\x82\x19)@:\x13\xf3\xd0\x19\x0c<\x03D\ -\x80p@\xd6\xd5\x81V\xd5\xc4\xc0W\xa0\xd8\x0e\xb3\xec\ -\x12d\x81*!\xd4\x1c\xa5\x1a\x0c\x00o?A\xca\xdd\ -f\xbb\x122\xad\x0e\x13\x08VS\x0d6r\xb8\xcc\xf0\ -\xa7&\xb1;\x06\xc9l\x223\x80\x04\xe0`B!6\ -\x18o\x94D\xc2\xa5\x01\x81\x22\x0e\x8c\xf2\x11\xc4\x81$\ -@\xbc\x0e\xaf\xd0\xf3B@\xb9A\xec\x1ef6\xd8\x82\ -\x1d5@'\x052Z\xd8*AA3\xbbAlo\ -\x1c\xf0\x10\x1fNJ{\x821\x01\xe0\x92\xfe\xc1g\x1e\ -DQ3\xa1,\x12t\x8c\x0f\x0d\xd2%\x8d\xa4\x87\xe1\ -\x14\x0aT\x9c\x0c\xe4\x80<\x01\xfb\x0b\xe0\x98\xb0\xca|\ -\x22k\x1d\x16\xf0f!\xb1u\x00\x12\xb5AJ\xe0[\ -2\xbf\x18s\x18#I\x16\x09@\xb9,\xe1AHD\ -N\x1d\x94\xdc\x1c\xeer\x12\x80\xf38\x81L\xfe\x225\ -(\xc0\x0d9\x80\x90\x0bG$?@$\x02\xf4\xa22\ -\x01\xfb,\xe0\xc0\x16\xd5\x0c\x14\x821%\x8b!%\xc7\ -XY\xf1-\x1cq1A\x90\xecH\xe70\x1a\xb5,\ -\x19BAO@\xb3%!\x04\x14t\xd8H\x0e\x8f\x1a\ -\x01\x80\x16\x0c\xb6\x18\xe1p\x9d\xd3\xf4\x1c\x82\x08\xc4\x92\ -\x94\x03\xd4}\x19@\xa0\xf8\x80 H\x94\xa4\x0f\xd5l\ -\x0b\xb3\x88\x14\xecZt/\xb4\x9e\x93l \xef'Q\ -\xd4iR\x13\xbdRU~\xc0\xd3\x14\xc1\x02?\x22\xe0\ -\xa8\x10\xb5\x9c\x14\xe9\x80\xfe\x84P\x98k\x12\x0f`\xb4\ -\x17\x95\xb0\x15b@\xed\x14b\xf2LdV2\x16\x22\ -\x12\x1a\xae.\x9dX\xe2\x0aw\x15+R\xe2Q\x0c\x80\ -\xa0K\x01\x0c\x14\xec\x89ZB^w\x15\xaa\x0b,\x98\ -$\x93\xb0\xd8\x15\xbc}M\x86\xa9Qz\x11\x12h\x22\ -\xf2l%`S`\xa0f\x835[^BQ(\x13\ -\xec\x0e\xa0\xa4\xd1M\x18\xb5\xf4\x06Gm\xdf\x5c\xc2\x09\ -\x09\xd5\xc1K\xf4k1\x16, p\xeey\xb5\x94%\ -G\xc3\x22\x81S\x08`h\x08V\x14#\xe1\x9bea\ -\x80\x0f\x16\x5c\x0a\xc1\xdff!\xd6\xb1\xa6\xbbW\xb5\x16\ -#O\xba\xec\x95\x1f!\x95#`\x22,\x96S\xc7L\ -\xa2b6\x00\x06r@\xb9h\xe0\xe9e\x22-'a\ -\x1e\xf5!$\x0e\xc8X\x1f\x82aE\xd4af\xf5\xf6\ -\x1e0Z\x9fD@\xb2\xee\xe5Y3\xc8D\xb4|\xb5\ -A$\xe6\xf6\x94 \x90&\x1b\xaa\x82\x0d\xf0\xb8\x18\x81\ -j\xa7\xe7C\x16\xd1\xbbKb\x19c\x00}\x5c\x22\x1e\ -\xed\xf3\xbe\x0d\xd4\xc7\x1dO:H\x14\xf0\xf4J\x10l\ -\xea\x14Djk2\xe1\xee\x1e\xb3\xd0\x13\xe1\x0c\xcf*\ -0H\xe4\x81j\x88\x02\x15\xf0T\x22\xd6\xe9n\xc2\x1c\ -\xbb\xd4\xc3\x13T\x1c\xbck\xca\x88\xe4\xf4\x91\x006N\ -\x80\xde\x11`\x8ft\xa0\xb2\x7fr\xf6\x17ASC\x80\ -\xe8\xc3UTL\x0d\xd8\x15h\xec\x07\xcf5\x12\x94\x10\ -\xe3\xb5\xffF\xe20\xea%\x00\xeanLUV\x0a\x05\ - f~`\x8bx\xa0\xaeP\xe0\x0eL#\xee\x17w\ -\x98\x15!Qy\xe1%b\x05'[\x96\xad@\xce6\ -\xbbwp\xb6\xe5Ek\x8f\xc62f7R\xc1\xabS\ -\x07<\x86\x97J\x08\xe0\xb1]\x97gZ\x22V\x98a\ -\x9f}\xa1\x87TAau!P\x1d\xd7\xe8\x1dIG\ -W\x87\xc70\x13\x04#/\xbb:`v\xf7k+{\ -f\xe3+\xf7;B(b\x8bIp\x07\x14&\x06$\ -z\x06\x13\xcc\xf8\x80#VB\xbeU\xa8\xc032\x80\ -\x8c\xa1\xb2\x19\xe7\xda\x1a\x0b|\xe8\xe8c_.4\x1e\ -\x07\xb3E\x92\xb7\x1c\xb3\x13\x1d-\xf7hV\xcb\x85b\ -7*\x91%r\x83-Fw\xb30\xf3knO\x81\ -k\xd8U\x85\x98t\x22\xd7\xa9\x11W\xac\x1e\x11\xc3c\ -U\x89F\xd75`Xqo\xb8w\x89\x22%\x84\x15\ -\x19\x86H\x15\x86\x96\xf3\x80\x92\xc3s\xd8\x95\x8a\xb8\x97\ -\x7f\x0c\xc1@\xb1'+\x0e\xd9\x88Vx\x95\xc6J\xb7\ -4q\x06\x8d9\x01Ty\x8a\xd8\xd0!\xd2\xa9b\xb8\ -l!U\x82u\xd8f\x22\x970Z\xf6|\x22\xb6\x80\ -\x7f\x16C\x8d8\xf4 \x98]\x8bXa%\xf63&\ -2\xb6\xe9\xad1\x84\xf2\xc1\x13\xd8\xa9\x8fy\x14 \xb8\ -\x99FO)Xx\xbe\x84\xe6H~y\x0d\x80\xb9\x17\ -\x92\xe2\x06\xa8\x17\x22\xff\xa27g*\xd9\x92\x15\xc5R\ -7t\x22\xe9e\x22\x80\xd4FA\xbeF\x82\xe8.\xe3\ -v^B\xb2_C\x19\x96\x06p+b\xbfJT\x84\ -/\x02\xd5\x96\x83zic\x96;Y^6\xa2\x86`\ -\x09\x81\x97B\x1c+#\x0ciF\x9c\x1f\xc1\xfb\x97\xe3\ -\x1cjf\x04-#j \xe3\x94\x1f\xc3\x8c9\xa2\xb7\ -\x96b\x87\x82\x00\xd7\x9ba\x0b\x81\xaa\x8f\x89\xcf\xc3+\ -\xc2>\x96F\x0ak&\x08j\xa3\x14;\x85\xfc!\x86\ -\xa2_\xa5\xe4\x5c\xecpj\xc2\x0b\x9eFl_\xd9\xe0\ -^&\x7f\x9d4\xb7\x9eFy\x9c\xe2\x84]\x82\xcf\x95\ -e\xda^\x06\x1fD\xc2\x07r\xb8\xbd\x945\x8b\x94y\ -1\xa1\xa4\xf7\xa1\x19\x05\x8eD5s1\x7f\xa1\xda,\ -O.\x8e}vw\xa1@\x12\x0dZ<\x10\x97\x01\xa2\ -\xfaDO7\xe8\x1d\xc1\xd4\xe5`\x84S\x81\xbc\xb5\xcb\ -\xbaC \x0fh\xe0\xb8\x0e\x91\xe8\x10z\x0d\xa4zl\ -$\xbaT\x1a\xd7D\x09N\xfc\x1c\x220\x98\x00\x83\xa8\ - \xa3\x04\xc1\x02\x140\xb5\xa6\xfa\x90AC\xcdN\x88\ -\xe6\x0d\x87V#\x02\x9f\x0458\x14L\xde\x06\xda\x93\ -\xaa\xe4\x10\xd6\x81\xda\x1d\x19L\x18:\xbc\x16T\xa4#\ -\x86B\x97\xa0\xa9\x0b\xe1\x19O\xc0-\xab\x1a\xd4$\xe7\ -W'a \x15:\xe0\x12a\xe3\xaea\xda$\x87\xfc\ -\x02Q\x94\x09\xd0\x0a\xda\xe0F\x05r\x8dy\x22'\x9d\ -\xb9\xd9\x9dC\xac^\x19\xeb\xb0\xa3\x93\x9e\xfb\x0f\xb0c\ -\xb3\x9d\xa3\xc5\x9f\xc3\xac\x9e\xb9\xef\x95\xbb\x1e_\x99\xca\ -!Y\xf2a\xbb*_\xe6j)k\xe2\x1c;@\x1b\ -1\xde\x16!=[\x01x\x15zJ\x1d\x22P)\xe6\ -B\xdch\xa8\x06PCVB\x9fN\xd9\xdc`e\xf9\ -\x9d\xb9\xe4gC\xb0h\x05\xfd\x9d\xa6\x8a2\x02\x08g\ -\x14\xa5\xb2Y\xd0a\xa2\xa4j\x86\x1a`\x1a\x00X\xe0\ -\x02<\xdb\x8f\x99\xe2\x05\x99\xc2\xdf\xb7\x99\x5c8\x1bu\ -\x8c`\x01\xb7\xe1\xfd\xb2b\x0eJe\xd4\x1f\xbb\x82@\ -\xb0\xd0\x1f\x18(\xb4\xe1\xb9\xa7)@\x1c7\x0c\x1e\xbb\ -.$\xa2\x9e\x98\x06\x1f\xb9\x03\xb4\x22\x99\xf8A\x1b\xb8\ -H[\xea$[\xf2K\xc3\xcc\x98t\xa5\xbd\xba\xd7\xc0\ -<\x05\xc0|\x09\xc0\xbc\x0d\xc0\xe2\x08 \x00\x00\x03\ -\x00\x01\xa0\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\xa0\x04\ -\x00\x01\x00\x00\x00`\x00\x00\x00\x03\xa0\x04\x00\x01\x00\x00\ -\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00Adobe\ - Photoshop Docum\ -ent Data Block\x00M\ -IB8nrTM\x00\x00\x00\x00MIB8r\ -yaL\xdc\x19\x00\x00\x01\x00\x03\x00\x00\x00\x03\x00\x00\ -\x00]\x00\x00\x00\x5c\x00\x00\x00\x04\x00\xff\xff\x9b\x0b\x00\ -\x00\x00\x00C\x04\x00\x00\x01\x00C\x04\x00\x00\x02\x00C\ -\x04\x00\x00MIB8mron\xff\x00\x08\x00<\ -\x01\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\xff\xff\x00\ -\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\ -\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\ -\x00\xff\xff\x07Layer 0MIB8i\ -nul\x14\x00\x00\x00\x07\x00\x00\x00L\x00a\x00y\ -\x00e\x00r\x00 \x000\x00\x00\x00MIB8r\ -snl\x04\x00\x00\x00ryalMIB8d\ -iyl\x04\x00\x00\x00\x03\x00\x00\x00MIB8l\ -blc\x04\x00\x00\x00\x01\x00\x00\x00MIB8x\ -fni\x04\x00\x00\x00\x00\x00\x00\x00MIB8o\ -knk\x04\x00\x00\x00\x00\x00\x00\x00MIB8f\ -psl\x04\x00\x00\x00\x00\x00\x00\x00MIB8r\ -lcl\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M\ -IB8dmhsH\x00\x00\x00\x01\x00\x00\x00M\ -IB8tsuc\x00\x00\x00\x004\x00\x00\x00\x10\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x00\x00met\ -adata\x01\x00\x00\x00\x09\x00\x00\x00lay\ -erTimebuod\xc2\x93A\xe0\xf78\ -\xd6A\x00MIB8prxf\x10\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ -\x00S\x00O\x00\x0f\x00\x0c\x00\x0a\x00\x09\x00\x09\x00\x09\ -\x00\x09\x00\x15\x00I\x00K\x00\x12\x00\x14\x00\x14\x00\x12\ -\x00\x13\x00\x13\x00\x13\x00#\x00!\x00\x1e\x00\x1d\x00\x1f\ -\x00\x1d\x00\x1d\x00\x1d\x00\x1c\x00\x1e\x00\x1d\x00(\x00'\ -\x00&\x00&\x00&\x00%\x00$\x00$\x00\x22\x00 \ -\x00 \x00\x1e\x00\x22\x00\x1f\x00\x1e\x00\x1e\x00\x1f\x00!\ -\x00 \x00 \x00#\x00!\x00%\x00%\x00$\x00'\ -\x00(\x00(\x00+\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1c\ -\x00\x1d\x00\x1e\x00\x1e\x00\x1f\x00 \x00#\x00\x13\x00\x13\ -\x00\x13\x00\x12\x00\x14\x00\x12\x00\x13\x00\x13\x00M\x00L\ -\x00\x09\x00\x09\x00\x08\x00\x09\x00\x0a\x00\x0a\x00\x0c\x00L\ -\x00W\x00 \x00\xfd\x00\x04\x05\x11!-1\xfe/\xfc\ -0\x181//0110010/1/0\ -010/0110/01\xfe0\x0a/2\ -1100/00//\xfe1\x000\xfe1\x05\ -010/01\xfe0\xfe1\xff0\x081/0\ -/-'\x18\x08\x01\xfe\x00\xff\x00\x07\x01\x14X\xab\xdb\ -\xec\xf0\xf0\xfd\xf1\x00\xf0\xfe\xf1\x00\xf2\xfd\xf1\xff\xf0\x01\ -\xf1\xf0\xf8\xf1\x03\xf0\xf1\xf1\xf0\xfe\xf1\xfe\xf0\x07\xf1\xf0\ -\xf0\xf1\xf1\xf0\xf1\xf0\xfc\xf1\xff\xf0\x1b\xf1\xf0\xf0\xf1\xf2\ -\xf1\xf0\xf1\xf0\xf1\xf1\xf2\xf0\xf1\xf0\xf1\xf0\xf0\xf1\xf0\xee\ -\xe4\xc2|.\x06\x00\x00\xff\x00\x03\x16\x86\xed\xfd\xb3\xff\ -\x04\xf9\xbfA\x06\x00\x03\x00\x08l\xf4\xb0\xff\x03\xfe\xbd\ -*\x01\x02\x00$\xd0\xae\xff\x02\xf8x\x07\x02\x02O\xf6\ -\xad\xff\x01\xc0\x14\x02\x05r\xfd\xad\xff\x01\xe1#\x02\x08\ -\x86\xfe\xad\xff\x01\xed+\x02\x08\x8f\xfe\xad\xff\x01\xef-\ -\x02\x09\x91\xfe\xf1\xff\x00\xfe\xdb\xff\xfe\xfe\xfd\xff\x00\xfe\ -\xec\xff\x01\xef,\x02\x08\x91\xfe\xfa\xff\x17\xfe\xcf\xc2\xc3\ -\xc2\xc4\xc3\xc4\xc3\xc3\xc4\xc4\xc1\xc3\xc3\xc2\xc3\xc2\xc2\xc3\ -\xc2\xc3\xc4\xc4\xfe\xc2\xfd\xc3\x0a\xc2\xc3\xc3\xc2\xc3\xc3\xc2\ -\xc3\xc2\xc2\xc1\xfe\xc3\xff\xc4\xf9\xc3\x06\xc4\xc3\xc3\xc4\xc2\ -\xc3\xc4\xfe\xc3\xff\xc2\x01\xc7\xf1\xf9\xff\x01\xf0-\x02\x09\ -\x90\xfe\xfa\xff\x03\xfaK\x18\x17\xfc\x18\x16\x17\x18\x16\x19\ -\x17\x18\x19\x19\x18\x19\x18\x17\x18\x19\x19\x18\x17\x17\x19\x17\ -\x17\x19\x17\xfb\x18\x11\x17\x16\x18\x16\x19\x19\x17\x18\x18\x19\ -\x18\x18\x19\x17\x19\x18\x19\x18\xfd\x19\x08\x18\x19\x19\x18\x19\ -\x19\x17,\xc7\xf9\xff\x01\xf0,\x01\x09\x90\xf9\xff\x01\xf9\ -8\xc0\x00\x01\x15\xc0\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\ -\xff\x01\xf97\xc0\x00\x02\x14\xc2\xfe\xfa\xff\x01\xf0-\x02\ -\x09\x90\xfe\xfa\xff\x01\xf88\xc0\x00\x02\x14\xc2\xfe\xfa\xff\ -\x01\xef/\x01\x08\x90\xf9\xff\x01\xf99\xc0\x00\x01\x14\xc1\ -\xf9\xff\x01\xf0/\x02\x09\x90\xfe\xfa\xff\x01\xf97\xc0\x00\ -\x01\x12\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf9\ -8\xc0\x00\x01\x14\xc2\xf9\xff\x01\xf1-\x02\x09\x90\xfe\xfa\ -\xff\x01\xfa8\xc0\x00\x01\x15\xc1\xf9\xff\x01\xef-\x01\x09\ -\x92\xf9\xff\x01\xf97\xe7\x00\x0d\x1aU\x87\xb8\xd5\xe6\xf7\ -\xf7\xe6\xd6\xb9\x88V\x1a\xe8\x00\x01\x15\xc2\xf9\xff\x01\xef\ -,\x02\x09\x91\xfe\xfa\xff\x01\xf98\xea\x00\x03\x1bw\xc7\ -\xfe\xf5\xff\x03\xfe\xc9x\x1d\xeb\x00\x01\x14\xc2\xf9\xff\x01\ -\xf0/\x01\x09\x90\xf9\xff\x01\xfa7\xec\x00\x028\xa8\xfb\ -\xef\xff\x02\xfb\xaa:\xed\x00\x01\x15\xc2\xf9\xff\x01\xef-\ -\x01\x09\x91\xf9\xff\x01\xf87\xee\x00\x01\x1c\xaa\xe9\xff\x01\ -\xac\x1e\xef\x00\x02\x14\xc1\xfe\xfa\xff\x01\xef/\x02\x08\x90\ -\xfe\xfa\xff\x01\xf98\xf0\x00\x02\x06x\xf4\xe7\xff\x02\xf5\ -z\x07\xf1\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\x91\xfe\ -\xfa\xff\x01\xf97\xf1\x00\x01F\xd9\xe3\xff\x01\xdbH\xf2\ -\x00\x01\x14\xc3\xf9\xff\x01\xf0/\x02\x09\x91\xfe\xfa\xff\x01\ -\xfa7\xf3\x00\x01\x02\x85\xdf\xff\x01\x88\x02\xf4\x00\x01\x15\ -\xc1\xf9\xff\x01\xf1-\x02\x09\x92\xfe\xfa\xff\x01\xf88\xf4\ -\x00\x01\x10\xb5\xdd\xff\x01\xb7\x10\xf5\x00\x01\x15\xc2\xf9\xff\ -\x01\xf0.\x01\x09\x90\xf9\xff\x01\xf98\xf5\x00\x01*\xda\ -\xdb\xff\x01\xdb+\xf6\x00\x01\x15\xc2\xf9\xff\x01\xf0.\x02\ -\x09\x90\xfe\xfa\xff\x01\xf99\xf6\x00\x01C\xf2\xd9\xff\x01\ -\xf3E\xf7\x00\x02\x15\xc3\xfe\xfa\xff\x01\xef-\x01\x08\x91\ -\xf9\xff\x01\xf97\xf7\x00\x01D\xf6\xd7\xff\x01\xf7E\xf8\ -\x00\x02\x14\xc2\xfe\xfa\xff\x01\xf0/\x02\x09\x91\xfe\xfa\xff\ -\x01\xf98\xf8\x00\x01F\xf7\xf0\xff\x07\xe5\x91H*\x0d\ -\x0c&\xe3\xee\xff\x01\xf7F\xf9\x00\x01\x14\xc1\xf9\xff\x01\ -\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf98\xf9\x00\x01G\xf7\ -\xf1\xff\x02\xe0S\x02\xfb\x00\x00\xdb\xed\xff\x01\xf7G\xfa\ -\x00\x01\x14\xc1\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\ -\xf99\xfa\x00\x015\xf5\xf1\xff\x01\x8c\x09\xf9\x00\x00\xdb\ -\xec\xff\x01\xf54\xfb\x00\x01\x14\xc2\xf9\xff\x01\xf1.\x02\ -\x09\x92\xfe\xfa\xff\x01\xf99\xfb\x00\x01\x1e\xe7\xf2\xff\x01\ -\xfdj\xf7\x00\x00\xdb\xeb\xff\x01\xe7\x1d\xfc\x00\x01\x15\xc1\ -\xf9\xff\x01\xf0/\x02\x08\x93\xfe\xfa\xff\x01\xf98\xfc\x00\ -\x01\x0e\xd3\xf1\xff\x00d\xf6\x00\x00\xdb\xea\xff\x01\xd1\x0d\ -\xfd\x00\x02\x15\xc1\xfe\xfa\xff\x01\xef.\x02\x09\x91\xfe\xfa\ -\xff\x01\xf98\xfd\x00\x01\x01\xb4\xf1\xff\x00\x9f\xf5\x00\x00\ -\xdb\xe9\xff\x01\xb1\x01\xfe\x00\x01\x14\xc1\xf9\xff\x01\xef-\ -\x01\x08\x8f\xf9\xff\x01\xf99\xfd\x00\x00|\xf1\xff\x01\xdf\ -\x0a\xf5\x00\x00\xdb\xe8\xff\x00w\xfe\x00\x02\x15\xbf\xfe\xfa\ -\xff\x01\xee.\x02\x09\x92\xfe\xfa\xff\x01\xf89\xfe\x00\x01\ -<\xfc\xf1\xff\x00d\xf4\x00\x00\xdb\xe8\xff\x05\xfb7\x00\ -\x00\x14\xc2\xf9\xff\x01\xef.\x01\x09\x91\xf9\xff\x05\xf98\ -\x00\x00\x0e\xe0\xf1\xff\x01\xe0\x05\xf4\x00\x00\xdb\xe7\xff\x04\ -\xda\x0a\x00\x14\xc1\xf9\xff\x01\xf0-\x02\x09\x90\xfe\xfa\xff\ -\x04\xf98\x00\x00\x8d\xf0\xff\x00\x89\xf3\x00\x00\xdb\xe6\xff\ -\x03\x81\x00\x14\xc1\xf9\xff\x01\xef,\x02\x09\x90\xfe\xfa\xff\ -\x04\xf97\x00\x10\xf3\xf0\xff\x00@\xf3\x00\x00\xdb\xe6\xff\ -\x03\xee\x0c\x15\xc2\xf9\xff\x01\xf1.\x01\x09\x91\xf9\xff\x03\ -\xf98\x00v\xf0\xff\x01\xf6\x05\xf3\x00\x00\xdb\xe5\xff\x02\ -q\x14\xc3\xf9\xff\x01\xf1.\x02\x09\x92\xfe\xfa\xff\x03\xf9\ -9\x00\xb5\xf0\xff\x00\xdc\xf2\x00\x00\x22\xf7'\x00\xd9\xf0\ -\xff\x02\xb2\x13\xc2\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\ -\x03\xf97\x00\xd9\xf0\xff\x00\xc4\xe7\x00\x00\xbe\xf0\xff\x03\ -\xd7\x15\xc2\xfe\xfa\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x03\ -\xf98\x00\xf6\xf0\xff\x00\xb3\xe7\x00\x00\xaf\xf0\xff\x02\xf6\ -\x14\xc1\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\x03\xf88\ -\x00\xdf\xf0\xff\x00\xc6\xe7\x00\x00\xc2\xf0\xff\x02\xde\x15\xc1\ -\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x03\xf97\x00\xbb\ -\xf0\xff\x00\xdd\xe7\x00\x00\xd9\xf0\xff\x03\xb9\x14\xc2\xfe\xfa\ -\xff\x01\xf1.\x02\x09\x91\xfe\xfa\xff\x03\xf98\x00\x88\xf0\ -\xff\x01\xf7\x06\xe9\x00\x01\x05\xf5\xf0\xff\x03\x84\x15\xc2\xfe\ -\xfa\xff\x01\xef.\x02\x09\x90\xfe\xfa\xff\x04\xf98\x00\x1f\ -\xfc\xf0\xff\x00B\xe9\x00\x00?\xf0\xff\x03\xf9\x1a\x14\xc1\ -\xf9\xff\x01\xef.\x02\x09\x92\xfe\xfa\xff\x04\xf97\x00\x00\ -\xa9\xf0\xff\x00\x8b\xe9\x00\x00\x89\xf0\xff\x03\x9e\x00\x15\xc2\ -\xf9\xff\x01\xf0.\x01\x09\x91\xf9\xff\x05\xf98\x00\x00\x22\ -\xf2\xf1\xff\x01\xe2\x06\xeb\x00\x01\x06\xe1\xf1\xff\x04\xef\x1b\ -\x00\x15\xc1\xf9\xff\x01\xef.\x01\x09\x91\xf9\xff\x01\xf97\ -\xfe\x00\x00^\xf0\xff\x00h\xeb\x00\x00g\xf0\xff\x04W\ -\x00\x00\x14\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\ -\xf98\xfd\x00\x00\x9f\xf1\xff\x01\xe1\x0b\xed\x00\x01\x0b\xe2\ -\xf1\xff\x00\x9a\xfe\x00\x01\x13\xc0\xf9\xff\x01\xf0.\x02\x09\ -\x91\xfe\xfa\xff\x01\xf97\xfd\x00\x01\x09\xce\xf1\xff\x00\xa4\ -\xed\x00\x00\xa5\xf1\xff\x01\xcc\x07\xfe\x00\x01\x14\xc1\xf9\xff\ -\x01\xf1.\x01\x09\x91\xf9\xff\x01\xfa8\xfc\x00\x01\x1d\xe5\ -\xf1\xff\x00j\xef\x00\x00l\xf1\xff\x01\xe4\x1b\xfd\x00\x01\ -\x15\xc1\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf97\ -\xfb\x00\x010\xf3\xf2\xff\x01\xfer\xf1\x00\x01u\xfe\xf2\ -\xff\x01\xf2/\xfc\x00\x01\x13\xc2\xf9\xff\x01\xf0-\x02\x09\ -\x91\xfe\xfa\xff\x01\xf99\xfa\x00\x01I\xfc\xf1\xff\x01\x95\ -\x0d\xf5\x00\x01\x0e\x98\xf1\xff\x01\xfcH\xfb\x00\x02\x15\xc2\ -\xfe\xfa\xff\x01\xf1.\x01\x09\x92\xf9\xff\x01\xf98\xf9\x00\ -\x01\x5c\xfc\xf1\xff\x02\xe6_\x05\xf9\x00\x02\x06`\xe8\xf1\ -\xff\x01\xfc\x5c\xfa\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\ -\x91\xfe\xfa\xff\x01\xf86\xf8\x00\x01Y\xfc\xf0\xff\x09\xee\ -\x9eV8\x1c\x1c8V\x9f\xef\xf0\xff\x01\xfcY\xf9\x00\ -\x02\x14\xc1\xfe\xfa\xff\x01\xf0-\x02\x09\x91\xfe\xfa\xff\x01\ -\xf98\xf7\x00\x01T\xfb\xd7\xff\x01\xfbU\xf8\x00\x01\x14\ -\xc2\xf9\xff\x01\xf0.\x02\x09\x92\xfe\xfa\xff\x01\xf86\xf6\ -\x00\x01P\xf7\xd9\xff\x01\xf8Q\xf7\x00\x01\x14\xc1\xf9\xff\ -\x01\xf0/\x01\x09\x91\xf9\xff\x01\xf98\xf5\x00\x013\xe1\ -\xdb\xff\x01\xe24\xf6\x00\x02\x15\xc1\xfe\xfa\xff\x01\xf0.\ -\x02\x09\x91\xfe\xfa\xff\x01\xf88\xf4\x00\x01\x14\xbd\xdd\xff\ -\x01\xbf\x15\xf5\x00\x01\x15\xc2\xf9\xff\x01\xf1-\x01\x09\x91\ -\xf9\xff\x01\xfa8\xf3\x00\x01\x03\x8b\xdf\xff\x01\x8e\x04\xf4\ -\x00\x01\x13\xc2\xf9\xff\x01\xf0.\x01\x08\x90\xf9\xff\x01\xf9\ -8\xf1\x00\x01I\xdb\xe3\xff\x01\xdcK\xf2\x00\x02\x14\xc2\ -\xfe\xfa\xff\x01\xf0.\x01\x09\x91\xf9\xff\x01\xf98\xf0\x00\ -\x02\x06x\xf4\xe7\xff\x02\xf4z\x07\xf1\x00\x01\x13\xc2\xf9\ -\xff\x01\xf0.\x02\x08\x91\xfe\xfa\xff\x01\xf97\xee\x00\x01\ -\x1b\xa6\xe9\xff\x01\xa8\x1c\xef\x00\x02\x15\xc0\xfe\xfa\xff\x01\ -\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf89\xec\x00\x023\xa1\ -\xf8\xef\xff\x02\xf9\xa24\xed\x00\x01\x14\xc2\xf9\xff\x01\xef\ --\x01\x09\x90\xf9\xff\x01\xf96\xea\x00\x03\x15m\xbd\xfb\ -\xf5\xff\x03\xfb\xben\x16\xeb\x00\x01\x14\xc0\xf9\xff\x01\xf1\ -,\x01\x09\x90\xf9\xff\x01\xf97\xe7\x00\x0d\x11Iz\xaa\ -\xc7\xd8\xe8\xe9\xd8\xc8\xabzJ\x11\xe8\x00\x01\x14\xc1\xf9\ -\xff\x01\xef/\x02\x09\x90\xfe\xfa\xff\x01\xf98\xc0\x00\x01\ -\x15\xc1\xf9\xff\x01\xf0-\x02\x09\x91\xfe\xfa\xff\x01\xf98\ -\xc0\x00\x01\x14\xc2\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\ -\x01\xf98\xc0\x00\x01\x14\xc1\xf9\xff\x01\xf0-\x01\x09\x91\ -\xf9\xff\x01\xf97\xc0\x00\x01\x14\xc1\xf9\xff\x01\xef.\x02\ -\x09\x90\xfe\xfa\xff\x01\xf99\xc0\x00\x02\x15\xc1\xfe\xfa\xff\ -\x01\xf0-\x01\x08\x91\xf9\xff\x01\xfa8\xc0\x00\x01\x15\xc1\ -\xf9\xff\x01\xf0.\x02\x09\x92\xfe\xfa\xff\x01\xf97\xc0\x00\ -\x01\x14\xc1\xf9\xff\x01\xf0-\x02\x09\x90\xfe\xfa\xff\x01\xf9\ -7\xc0\x00\x01\x14\xc3\xf9\xff\x01\xf1-\x02\x09\x91\xfe\xfa\ -\xff\x02\xfad;\xfe:\xfe9\x1589;;9:\ -:8;9:7:9:;99;:98\ -\xfd:\xff8\x017;\xfc9\x09;:9;;8\ -:979\xfe:\xff9\x09:89::8;\ -9J\xcf\xf9\xff\x01\xf0-\x01\x09\x91\xf8\xff\x00\xfa\xfd\ -\xf9\x08\xf8\xf9\xf9\xf8\xf9\xf8\xf8\xf9\xf8\xfd\xf9\x06\xfa\xf9\ -\xf9\xf8\xf9\xf8\xf8\xfe\xf9\x00\xf8\xfe\xf9\x0e\xf8\xf9\xf9\xf8\ -\xf9\xf8\xf9\xf8\xf8\xf9\xf8\xf9\xf9\xf8\xf8\xfd\xf9\x00\xf8\xfe\ -\xf9\x05\xf8\xf9\xf9\xf8\xfa\xfa\xfe\xf9\xff\xf8\x01\xf9\xfe\xf9\ -\xff\x01\xf0.\x02\x09\x91\xfe\xad\xff\x01\xf0.\x02\x08\x91\ -\xfe\xad\xff\x01\xee-\x01\x09\x8d\xac\xff\x01\xe9+\x02\x07\ -{\xfe\xad\xff\x01\xd5\x1f\x02\x04U\xf6\xae\xff\x02\xfd\xa3\ -\x0f\x02\x01'\xc9\xae\xff\x02\xe7Q\x03\x03\x00\x09]\xe9\ -\xb0\xff\x03\xf0\x80\x13\x00\xff\x00\x03\x12`\xcc\xf7\xfb\xfe\ -\x00\xff\xfc\xfe\x00\xff\xfe\xfe\x02\xff\xfe\xff\xfe\xfe\x05\xff\ -\xfe\xfe\xff\xfe\xff\xfd\xfe\x0a\xff\xfe\xff\xfe\xfe\xff\xfe\xff\ -\xff\xfe\xfe\xfc\xff\xff\xfe\xfe\xff\x04\xfe\xff\xfe\xff\xff\xfb\ -\xfe\xff\xff\xff\xfe\x02\xff\xfe\xff\xfc\xfe\x06\xfd\xf5\xcel\ -\x17\x00\x00\xff\x00\x08\x01\x0a.`\x86\x96\x97\x92\x92\xfe\ -\x91\xff\x92\x13\x93\x92\x92\x91\x92\x92\x90\x91\x92\x91\x90\x91\ -\x92\x91\x91\x93\x91\x91\x94\x91\xfc\x92\x05\x91\x92\x91\x91\x90\ -\x92\xfe\x91\x0f\x90\x92\x92\x93\x91\x90\x92\x92\x90\x92\x91\x90\ -\x91\x92\x92\x90\xfd\x91\x03\x93\x91\x90\x90\xfe\x91\x0b\x93\x90\ -\x90\x92\x8ayU+\x0c\x01\x00\x00\xfd\x00\x04\x01\x05\x0a\ -\x0c\x0b\xfb\x0a\x00\x09\xf2\x0a\xff\x09\xf0\x0a\x00\x09\xf6\x0a\ -\x00\x09\xee\x0a\x02\x08\x04\x01\xfd\x00\x01\x00\x02\x00\x02\x00\ -\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ -\x02\x00\x02\x00\x02\x00\x02\x00\x06\x00\x06\x00\x06\x00\x06\x00\ -\x06\x00\x11\x00\x10\x00\x0c\x00\x0c\x00\x0e\x00\x0c\x00\x0f\x00\ -\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x12\x00\x11\x00\x14\x00\x10\x00\ -\x12\x00\x14\x00\x12\x00\x0e\x00\x0f\x00\x0f\x00\x10\x00\x0e\x00\ -\x0a\x00\x06\x00\x08\x00\x08\x00\x06\x00\x08\x00\x10\x00\x11\x00\ -\x14\x00\x16\x00\x16\x00\x15\x00\x14\x00\x14\x00\x17\x00\x14\x00\ -\x16\x00\x0c\x00\x0a\x00\x0e\x00\x0f\x00\x0f\x00\x0c\x00\x0e\x00\ -\x0e\x00\x0e\x00\x10\x00\x13\x00\x06\x00\x06\x00\x06\x00\x06\x00\ -\x06\x00\x06\x00\x06\x00\x06\x00\x02\x00\x02\x00\x02\x00\x02\x00\ -\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ -\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ -\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xf4\xcc\xc1\xff\ -\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\ -\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xe8\x00\x03\xcd\ -\xcc\xcc\xcd\xf8\xcc\x00\xcd\xe8\x00\xf5\xcc\xf4\xcc\xeb\x00\x02\ -\xcf\xcd\xcd\xf1\xcc\x00\xd3\xeb\x00\xf5\xcc\xf4\xcc\xed\x00\xea\ -\xcc\x00\xce\xed\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xd1\xe6\xcc\xef\ -\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\xcc\x00\xda\xf1\x00\xf5\ -\xcc\xf4\xcc\xf2\x00\xe0\xcc\x00\xcd\xf2\x00\xf5\xcc\xf4\xcc\xf4\ -\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\xcc\xf5\x00\ -\x00\xcf\xdb\xcc\x00\xcf\xf5\x00\xf5\xcc\xf4\xcc\xf6\x00\x00\xce\ -\xd9\xcc\x00\xcf\xf6\x00\xf5\xcc\xf4\xcc\xf7\x00\x00\xcd\xd7\xcc\ -\x00\xce\xf7\x00\xf5\xcc\xf4\xcc\xf8\x00\x00\xce\xd5\xcc\x00\xce\ -\xf8\x00\xf5\xcc\xf4\xcc\xf9\x00\xec\xcc\x04\xcd\xce\xd7\xd4\xd0\ -\xeb\xcc\xf9\x00\xf5\xcc\xf4\xcc\xfa\x00\xee\xcc\x01\xcd\xff\xfb\ -\x00\xea\xcc\xfa\x00\xf5\xcc\xf4\xcc\xfb\x00\x00\xce\xef\xcc\x00\ -\xe2\xf9\x00\xea\xcc\x00\xcd\xfb\x00\xf5\xcc\xf4\xcc\xfc\x00\xee\ -\xcc\xf7\x00\xe9\xcc\x00\xd3\xfc\x00\xf5\xcc\xf4\xcc\xfd\x00\x00\ -\xda\xef\xcc\xf6\x00\xe8\xcc\x00\xd7\xfd\x00\xf5\xcc\xf4\xcc\xfe\ -\x00\x00\xff\xf0\xcc\x00\xcd\xf5\x00\xe7\xcc\x00\xff\xfe\x00\xf5\ -\xcc\xf4\xcc\xfe\x00\x00\xcd\xef\xcc\xf5\x00\xe7\xcc\x00\xcd\xfe\ -\x00\xf5\xcc\xf4\xcc\xff\x00\xee\xcc\xf4\x00\xe5\xcc\xff\x00\xf5\ -\xcc\xf4\xcc\x01\x00\xda\xee\xcc\xf4\x00\xe4\xcc\x00\x00\xf5\xcc\ -\xf4\xcc\x00\x00\xee\xcc\xf3\x00\xe5\xcc\x01\xcd\x00\xf5\xcc\xf4\ -\xcc\x00\xcf\xef\xcc\x00\xcf\xf3\x00\xe4\xcc\x00\xd4\xf5\xcc\xf4\ -\xcc\x00\xcd\xee\xcc\xf3\x00\xe4\xcc\x00\xcd\xf5\xcc\xe1\xcc\xf2\ -\x00\x00\xd2\xf7\xd1\xe2\xcc\xe1\xcc\xe7\x00\xe2\xcc\xe2\xcc\x00\ -\xcd\xe7\x00\xe2\xcc\xe1\xcc\xe7\x00\x00\xcd\xe3\xcc\xe1\xcc\xe7\ -\x00\xe2\xcc\xe1\xcc\x00\xd4\xe9\x00\xe1\xcc\xf4\xcc\x00\xcd\xee\ -\xcc\xe9\x00\x00\xce\xef\xcc\x00\xcd\xf5\xcc\xf4\xcc\x01\x00\xcd\ -\xf0\xcc\x00\xcd\xe9\x00\xee\xcc\x00\x00\xf5\xcc\xf4\xcc\x01\x00\ -\xd2\xef\xcc\x00\xd4\xeb\x00\x00\xd4\xef\xcc\x01\xcf\x00\xf5\xcc\ -\xf4\xcc\xff\x00\x00\xce\xf0\xcc\x00\xcd\xeb\x00\x00\xcd\xf0\xcc\ -\x02\xcd\x00\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xf0\xcc\x00\xd0\ -\xed\x00\x00\xd0\xf0\xcc\x00\xcd\xfe\x00\xf5\xcc\xf4\xcc\xfe\x00\ -\x00\xe2\xf0\xcc\x00\xcd\xed\x00\xf0\xcc\x01\xcd\xda\xfe\x00\xf5\ -\xcc\xf4\xcc\xfd\x00\x00\xd3\xef\xcc\xef\x00\x00\xcd\xf0\xcc\x00\ -\xcf\xfd\x00\xf5\xcc\xf4\xcc\xfc\x00\x00\xcf\xf0\xcc\x00\xcd\xf1\ -\x00\xef\xcc\x00\xce\xfc\x00\xf5\xcc\xf4\xcc\xfb\x00\x00\xce\xf0\ -\xcc\x01\xcd\xd7\xf5\x00\x00\xda\xef\xcc\x00\xcd\xfb\x00\xf5\xcc\ -\xf4\xcc\xfa\x00\x00\xcd\xed\xcc\xf9\x00\x00\xd4\xee\xcc\x00\xcd\ -\xfa\x00\xf5\xcc\xf4\xcc\xf9\x00\x00\xce\xeb\xcc\xff\xd1\xff\xcc\ -\x00\xcd\xee\xcc\x00\xce\xf9\x00\xf5\xcc\xf4\xcc\xf8\x00\x00\xce\ -\xd4\xcc\xf8\x00\xf5\xcc\xf4\xcc\xf7\x00\xd5\xcc\xf7\x00\xf5\xcc\ -\xf4\xcc\xf6\x00\x00\xcd\xd9\xcc\x00\xcd\xf6\x00\xf5\xcc\xf4\xcc\ -\xf5\x00\x01\xcc\xcd\xdc\xcc\x00\xce\xf5\x00\xf5\xcc\xf4\xcc\xf4\ -\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\xcc\xf2\x00\ -\x00\xce\xe0\xcc\xf2\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\xcc\ -\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xcf\xe7\xcc\x00\xd1\ -\xef\x00\xf5\xcc\xf4\xcc\xed\x00\x00\xcd\xeb\xcc\x00\xcd\xed\x00\ -\xf5\xcc\xf4\xcc\xeb\x00\x02\xce\xcd\xcd\xf1\xcc\x00\xd0\xeb\x00\ -\xf5\xcc\xf4\xcc\xe8\x00\x04\xd2\xce\xcc\xcc\xcd\xfa\xcc\x01\xce\ -\xd2\xe8\x00\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\ -\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\ -\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\ -\xcc\xc1\xff\xf5\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\ -\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\x01\x00\x02\ -\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\ -\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x06\x00\x06\x00\x06\ -\x00\x06\x00\x06\x00\x11\x00\x10\x00\x0c\x00\x0c\x00\x0e\x00\x0c\ -\x00\x0f\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x12\x00\x11\x00\x14\ -\x00\x10\x00\x12\x00\x14\x00\x12\x00\x0e\x00\x0f\x00\x0f\x00\x10\ -\x00\x0e\x00\x0a\x00\x06\x00\x08\x00\x08\x00\x06\x00\x08\x00\x10\ -\x00\x11\x00\x14\x00\x16\x00\x16\x00\x15\x00\x14\x00\x14\x00\x17\ -\x00\x14\x00\x16\x00\x0c\x00\x0a\x00\x0e\x00\x0f\x00\x0f\x00\x0c\ -\x00\x0e\x00\x0e\x00\x0e\x00\x10\x00\x13\x00\x06\x00\x06\x00\x06\ -\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x02\x00\x02\x00\x02\ -\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\ -\x00\x02\x00\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\ -\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xf4\ -\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\ -\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xe8\ -\x00\x03\xcd\xcc\xcc\xcd\xf8\xcc\x00\xcd\xe8\x00\xf5\xcc\xf4\xcc\ -\xeb\x00\x02\xcf\xcd\xcd\xf1\xcc\x00\xd3\xeb\x00\xf5\xcc\xf4\xcc\ -\xed\x00\xea\xcc\x00\xce\xed\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xd1\ -\xe6\xcc\xef\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\xcc\x00\xda\ -\xf1\x00\xf5\xcc\xf4\xcc\xf2\x00\xe0\xcc\x00\xcd\xf2\x00\xf5\xcc\ -\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\ -\xcc\xf5\x00\x00\xcf\xdb\xcc\x00\xcf\xf5\x00\xf5\xcc\xf4\xcc\xf6\ -\x00\x00\xce\xd9\xcc\x00\xcf\xf6\x00\xf5\xcc\xf4\xcc\xf7\x00\x00\ -\xcd\xd7\xcc\x00\xce\xf7\x00\xf5\xcc\xf4\xcc\xf8\x00\x00\xce\xd5\ -\xcc\x00\xce\xf8\x00\xf5\xcc\xf4\xcc\xf9\x00\xec\xcc\x04\xcd\xce\ -\xd7\xd4\xd0\xeb\xcc\xf9\x00\xf5\xcc\xf4\xcc\xfa\x00\xee\xcc\x01\ -\xcd\xff\xfb\x00\xea\xcc\xfa\x00\xf5\xcc\xf4\xcc\xfb\x00\x00\xce\ -\xef\xcc\x00\xe2\xf9\x00\xea\xcc\x00\xcd\xfb\x00\xf5\xcc\xf4\xcc\ -\xfc\x00\xee\xcc\xf7\x00\xe9\xcc\x00\xd3\xfc\x00\xf5\xcc\xf4\xcc\ -\xfd\x00\x00\xda\xef\xcc\xf6\x00\xe8\xcc\x00\xd7\xfd\x00\xf5\xcc\ -\xf4\xcc\xfe\x00\x00\xff\xf0\xcc\x00\xcd\xf5\x00\xe7\xcc\x00\xff\ -\xfe\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xef\xcc\xf5\x00\xe7\xcc\ -\x00\xcd\xfe\x00\xf5\xcc\xf4\xcc\xff\x00\xee\xcc\xf4\x00\xe5\xcc\ -\xff\x00\xf5\xcc\xf4\xcc\x01\x00\xda\xee\xcc\xf4\x00\xe4\xcc\x00\ -\x00\xf5\xcc\xf4\xcc\x00\x00\xee\xcc\xf3\x00\xe5\xcc\x01\xcd\x00\ -\xf5\xcc\xf4\xcc\x00\xcf\xef\xcc\x00\xcf\xf3\x00\xe4\xcc\x00\xd4\ -\xf5\xcc\xf4\xcc\x00\xcd\xee\xcc\xf3\x00\xe4\xcc\x00\xcd\xf5\xcc\ -\xe1\xcc\xf2\x00\x00\xd2\xf7\xd1\xe2\xcc\xe1\xcc\xe7\x00\xe2\xcc\ -\xe2\xcc\x00\xcd\xe7\x00\xe2\xcc\xe1\xcc\xe7\x00\x00\xcd\xe3\xcc\ -\xe1\xcc\xe7\x00\xe2\xcc\xe1\xcc\x00\xd4\xe9\x00\xe1\xcc\xf4\xcc\ -\x00\xcd\xee\xcc\xe9\x00\x00\xce\xef\xcc\x00\xcd\xf5\xcc\xf4\xcc\ -\x01\x00\xcd\xf0\xcc\x00\xcd\xe9\x00\xee\xcc\x00\x00\xf5\xcc\xf4\ -\xcc\x01\x00\xd2\xef\xcc\x00\xd4\xeb\x00\x00\xd4\xef\xcc\x01\xcf\ -\x00\xf5\xcc\xf4\xcc\xff\x00\x00\xce\xf0\xcc\x00\xcd\xeb\x00\x00\ -\xcd\xf0\xcc\x02\xcd\x00\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xf0\ -\xcc\x00\xd0\xed\x00\x00\xd0\xf0\xcc\x00\xcd\xfe\x00\xf5\xcc\xf4\ -\xcc\xfe\x00\x00\xe2\xf0\xcc\x00\xcd\xed\x00\xf0\xcc\x01\xcd\xda\ -\xfe\x00\xf5\xcc\xf4\xcc\xfd\x00\x00\xd3\xef\xcc\xef\x00\x00\xcd\ -\xf0\xcc\x00\xcf\xfd\x00\xf5\xcc\xf4\xcc\xfc\x00\x00\xcf\xf0\xcc\ -\x00\xcd\xf1\x00\xef\xcc\x00\xce\xfc\x00\xf5\xcc\xf4\xcc\xfb\x00\ -\x00\xce\xf0\xcc\x01\xcd\xd7\xf5\x00\x00\xda\xef\xcc\x00\xcd\xfb\ -\x00\xf5\xcc\xf4\xcc\xfa\x00\x00\xcd\xed\xcc\xf9\x00\x00\xd4\xee\ -\xcc\x00\xcd\xfa\x00\xf5\xcc\xf4\xcc\xf9\x00\x00\xce\xeb\xcc\xff\ -\xd1\xff\xcc\x00\xcd\xee\xcc\x00\xce\xf9\x00\xf5\xcc\xf4\xcc\xf8\ -\x00\x00\xce\xd4\xcc\xf8\x00\xf5\xcc\xf4\xcc\xf7\x00\xd5\xcc\xf7\ -\x00\xf5\xcc\xf4\xcc\xf6\x00\x00\xcd\xd9\xcc\x00\xcd\xf6\x00\xf5\ -\xcc\xf4\xcc\xf5\x00\x01\xcc\xcd\xdc\xcc\x00\xce\xf5\x00\xf5\xcc\ -\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\ -\xcc\xf2\x00\x00\xce\xe0\xcc\xf2\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\ -\xd4\xe3\xcc\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xcf\xe7\ -\xcc\x00\xd1\xef\x00\xf5\xcc\xf4\xcc\xed\x00\x00\xcd\xeb\xcc\x00\ -\xcd\xed\x00\xf5\xcc\xf4\xcc\xeb\x00\x02\xce\xcd\xcd\xf1\xcc\x00\ -\xd0\xeb\x00\xf5\xcc\xf4\xcc\xe8\x00\x04\xd2\xce\xcc\xcc\xcd\xfa\ -\xcc\x01\xce\xd2\xe8\x00\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\ -\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\ -\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\ -\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ -\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ -\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ -\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x06\x00\ -\x06\x00\x06\x00\x06\x00\x06\x00\x11\x00\x10\x00\x0c\x00\x0c\x00\ -\x0e\x00\x0c\x00\x0f\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x12\x00\ -\x11\x00\x14\x00\x10\x00\x12\x00\x14\x00\x12\x00\x0e\x00\x0f\x00\ -\x0f\x00\x10\x00\x0e\x00\x0a\x00\x06\x00\x08\x00\x08\x00\x06\x00\ -\x08\x00\x10\x00\x11\x00\x14\x00\x16\x00\x16\x00\x15\x00\x14\x00\ -\x14\x00\x17\x00\x14\x00\x16\x00\x0c\x00\x0a\x00\x0e\x00\x0f\x00\ -\x0f\x00\x0c\x00\x0e\x00\x0e\x00\x0e\x00\x10\x00\x13\x00\x06\x00\ -\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x02\x00\ -\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ -\x02\x00\x02\x00\x02\x00\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ -\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ -\xa8\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\ -\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\ -\xf4\xcc\xe8\x00\x03\xcd\xcc\xcc\xcd\xf8\xcc\x00\xcd\xe8\x00\xf5\ -\xcc\xf4\xcc\xeb\x00\x02\xcf\xcd\xcd\xf1\xcc\x00\xd3\xeb\x00\xf5\ -\xcc\xf4\xcc\xed\x00\xea\xcc\x00\xce\xed\x00\xf5\xcc\xf4\xcc\xef\ -\x00\x00\xd1\xe6\xcc\xef\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\ -\xcc\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xf2\x00\xe0\xcc\x00\xcd\xf2\ -\x00\xf5\xcc\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\ -\xf5\xcc\xf4\xcc\xf5\x00\x00\xcf\xdb\xcc\x00\xcf\xf5\x00\xf5\xcc\ -\xf4\xcc\xf6\x00\x00\xce\xd9\xcc\x00\xcf\xf6\x00\xf5\xcc\xf4\xcc\ -\xf7\x00\x00\xcd\xd7\xcc\x00\xce\xf7\x00\xf5\xcc\xf4\xcc\xf8\x00\ -\x00\xce\xd5\xcc\x00\xce\xf8\x00\xf5\xcc\xf4\xcc\xf9\x00\xec\xcc\ -\x04\xcd\xce\xd7\xd4\xd0\xeb\xcc\xf9\x00\xf5\xcc\xf4\xcc\xfa\x00\ -\xee\xcc\x01\xcd\xff\xfb\x00\xea\xcc\xfa\x00\xf5\xcc\xf4\xcc\xfb\ -\x00\x00\xce\xef\xcc\x00\xe2\xf9\x00\xea\xcc\x00\xcd\xfb\x00\xf5\ -\xcc\xf4\xcc\xfc\x00\xee\xcc\xf7\x00\xe9\xcc\x00\xd3\xfc\x00\xf5\ -\xcc\xf4\xcc\xfd\x00\x00\xda\xef\xcc\xf6\x00\xe8\xcc\x00\xd7\xfd\ -\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xff\xf0\xcc\x00\xcd\xf5\x00\xe7\ -\xcc\x00\xff\xfe\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xef\xcc\xf5\ -\x00\xe7\xcc\x00\xcd\xfe\x00\xf5\xcc\xf4\xcc\xff\x00\xee\xcc\xf4\ -\x00\xe5\xcc\xff\x00\xf5\xcc\xf4\xcc\x01\x00\xda\xee\xcc\xf4\x00\ -\xe4\xcc\x00\x00\xf5\xcc\xf4\xcc\x00\x00\xee\xcc\xf3\x00\xe5\xcc\ -\x01\xcd\x00\xf5\xcc\xf4\xcc\x00\xcf\xef\xcc\x00\xcf\xf3\x00\xe4\ -\xcc\x00\xd4\xf5\xcc\xf4\xcc\x00\xcd\xee\xcc\xf3\x00\xe4\xcc\x00\ -\xcd\xf5\xcc\xe1\xcc\xf2\x00\x00\xd2\xf7\xd1\xe2\xcc\xe1\xcc\xe7\ -\x00\xe2\xcc\xe2\xcc\x00\xcd\xe7\x00\xe2\xcc\xe1\xcc\xe7\x00\x00\ -\xcd\xe3\xcc\xe1\xcc\xe7\x00\xe2\xcc\xe1\xcc\x00\xd4\xe9\x00\xe1\ -\xcc\xf4\xcc\x00\xcd\xee\xcc\xe9\x00\x00\xce\xef\xcc\x00\xcd\xf5\ -\xcc\xf4\xcc\x01\x00\xcd\xf0\xcc\x00\xcd\xe9\x00\xee\xcc\x00\x00\ -\xf5\xcc\xf4\xcc\x01\x00\xd2\xef\xcc\x00\xd4\xeb\x00\x00\xd4\xef\ -\xcc\x01\xcf\x00\xf5\xcc\xf4\xcc\xff\x00\x00\xce\xf0\xcc\x00\xcd\ -\xeb\x00\x00\xcd\xf0\xcc\x02\xcd\x00\x00\xf5\xcc\xf4\xcc\xfe\x00\ -\x00\xcd\xf0\xcc\x00\xd0\xed\x00\x00\xd0\xf0\xcc\x00\xcd\xfe\x00\ -\xf5\xcc\xf4\xcc\xfe\x00\x00\xe2\xf0\xcc\x00\xcd\xed\x00\xf0\xcc\ -\x01\xcd\xda\xfe\x00\xf5\xcc\xf4\xcc\xfd\x00\x00\xd3\xef\xcc\xef\ -\x00\x00\xcd\xf0\xcc\x00\xcf\xfd\x00\xf5\xcc\xf4\xcc\xfc\x00\x00\ -\xcf\xf0\xcc\x00\xcd\xf1\x00\xef\xcc\x00\xce\xfc\x00\xf5\xcc\xf4\ -\xcc\xfb\x00\x00\xce\xf0\xcc\x01\xcd\xd7\xf5\x00\x00\xda\xef\xcc\ -\x00\xcd\xfb\x00\xf5\xcc\xf4\xcc\xfa\x00\x00\xcd\xed\xcc\xf9\x00\ -\x00\xd4\xee\xcc\x00\xcd\xfa\x00\xf5\xcc\xf4\xcc\xf9\x00\x00\xce\ -\xeb\xcc\xff\xd1\xff\xcc\x00\xcd\xee\xcc\x00\xce\xf9\x00\xf5\xcc\ -\xf4\xcc\xf8\x00\x00\xce\xd4\xcc\xf8\x00\xf5\xcc\xf4\xcc\xf7\x00\ -\xd5\xcc\xf7\x00\xf5\xcc\xf4\xcc\xf6\x00\x00\xcd\xd9\xcc\x00\xcd\ -\xf6\x00\xf5\xcc\xf4\xcc\xf5\x00\x01\xcc\xcd\xdc\xcc\x00\xce\xf5\ -\x00\xf5\xcc\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\ -\xf5\xcc\xf4\xcc\xf2\x00\x00\xce\xe0\xcc\xf2\x00\xf5\xcc\xf4\xcc\ -\xf1\x00\x00\xd4\xe3\xcc\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xef\x00\ -\x00\xcf\xe7\xcc\x00\xd1\xef\x00\xf5\xcc\xf4\xcc\xed\x00\x00\xcd\ -\xeb\xcc\x00\xcd\xed\x00\xf5\xcc\xf4\xcc\xeb\x00\x02\xce\xcd\xcd\ -\xf1\xcc\x00\xd0\xeb\x00\xf5\xcc\xf4\xcc\xe8\x00\x04\xd2\xce\xcc\ -\xcc\xcd\xfa\xcc\x01\xce\xd2\xe8\x00\xf5\xcc\xf4\xcc\xc1\xff\xf5\ -\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\ -\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\ -\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xa8\xcc\xa8\xcc\xa8\ -\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\ -\xcc\xa8\xccMIB8ksML\x0e\x00\x00\x00\x00\ -\x00\xff\xff\x00\x00\x00\x00\x00\x002\x00\x80\x00\x00\x00M\ -IB8ttaP\x00\x00\x00\x00MIB8k\ -sMF\x0c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\ -\x002\x00\x00\x00\x00\x00\ -\x00\x00\x05}\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22 standalone=\x22\ -no\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - eye on<\ -/title>\x0d\x0a Created with \ -Sketch.\x0d\x0a\ - \x0d\x0a \x0d\x0a <\ -path d=\x22M62.3998\ -86,20.262032 C61\ -.0656979,18.1619\ -773 49.0033003,3\ -.55271368e-15 32\ -.0083577,3.55271\ -368e-15 C15.0134\ -15,3.55271368e-1\ -5 2.9510174,18.1\ -619773 1.5499679\ -5,20.262032 C-0.\ -516655982,23.447\ -0641 -0.51665598\ -2,27.7140347 1.5\ -4996795,30.97200\ -66 C2.9510174,32\ -.9991215 15.0134\ -15,50.9422798 32\ -.0083577,50.9422\ -798 C49.0033003,\ -50.9422798 61.06\ -56979,32.9991215\ - 62.399886,30.97\ -20066 C64.533371\ -3,27.7140347 64.\ -5333713,23.44706\ -41 62.399886,20.\ -262032 L62.39988\ -6,20.262032 Z M3\ -2.0083577,39.943\ -5857 C24.6110597\ -,39.9435857 18.6\ -786333,33.503620\ -9 18.6786333,25.\ -4711399 C18.6786\ -333,17.5115986 2\ -4.6110597,10.998\ -6941 32.0083577,\ -10.9986941 C32.7\ -407935,10.998694\ -1 33.4732293,11.\ -0716338 34.14184\ -3,11.2175131 L34\ -.141843,23.15530\ -55 L45.1405371,2\ -3.1553055 C45.27\ -12206,23.8786238\ - 45.338082,24.67\ -48819 45.338082,\ -25.4711399 C45.3\ -38082,33.5036209\ - 39.3387943,39.9\ -435857 32.008357\ -7,39.9435857 L32\ -.0083577,39.9435\ -857 Z\x22 id=\x22Shape\ -\x22 fill=\x22#CCCCCC\x22\ ->\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x1f\xef\ -\x00\ -\x00\xe4\x14x\x9c\xed\x5c\x07\x5cS\xc7\x1f\xbf\x0c\x12\xf6\ -^2c\x98*\x10\xc2&\xc8\xde\x0a\x82l\x14\x85\x90\ -\x04\x88\x84$f\x80\xab\xe2\xaa\xd6U\x95\xba\xb5uo\ -\xc5\xd6]\xad\xdb\xd6Z\xf7\xb6u\xfc\xb1\xd6\xbaW\x15\ -\xb5\xa8\xf0\xbf{!\x10\x10-J\x00\xfb\xff\xbfo>\ -\xf7r\xef\xd6o\xdc\xbd\xbb\xdf\xdd\xbb{\x89\x89\xa0;\ -\x00@\x13\x98\x83Z@\x86>\x02P\x5cH\xd8_\x1e\ -\xbc\x10T\xfcD\xcc\x0f\xd3\x11\xcc\x09\xa4\xfap\x98\x98\ -@\xa9\xf7\x13\xe1\xc5HYN\xeam\x82\xb1J\x1a\xb3\ -z?\x96[\xa5L\x0be\xfa\xe9\x80`\x054\x14~\ -\x82\x1d\xc1\xba\xc1\xefL\xb0Q)\xc7U\x85\x16\x13]\ -\x01\x1d\xfa<\x08^\x98\xdf\x14\xfa\x93\x09)\x8d\xe9\x89\ -?\xa0\xab\x9f5\xbc\xe5\x8e\x8fG~C\x1a\x00\xfe\xa3\ -&\xf0\x95to\xdc\x9e \x05T\x00t\xe3\x00\x88]\ -\x8c\xe4\x87\xfaP\xfc\xb4_\x8f\x02\xc0\xc5P\xf9\x1f\xce\ -\x15\xe5\xf3h\xc9E\x22\x99HZ$\x12\xd3\x22#i\ -^\x9eL\x7f\x9ak&_\xc8\x15\x95I\xbb\x01t\xcb\ -\xf2\xf4byz\xd3\x98\xbe,/o\x96\xa7\x0f\xe8\x19\ -:D\xcc\xe6\x14\xf3d\xb4|^!_\x18L\x7f\xb4\ -k/\x9d\xc6\xe7\x06\xd33}\x13=\x13\xc5\x91\xbc\x22\ -~\xdc0\x09/uX\x9f4\xce\xb0bN \x97\x1e\ -\x1a\xa2\xdds\x08kH\x89\xb8\x84'c\xd3\x86\x94\x08\ -\x84R\xd6\x90`:\x1b\xd1gA?\x0af\xd0iX\ -\x12Yq0]\xc1XVb2-R$\xe1\xd1|\ -=\xfc\xdc9L\xef\x00\x9a\x7f\xa0\x07\xd370\xc0\xcb\ -\xc7\x0d1\xea\xc7\xf0\x0cd0}\xdc=\x99,\xcf@\ -\x96'\x93V\x0fz\x886\xbc\xf6\x94p\x0bX)Q\ -1\xf5\xe4\xe0]0\xbdH&\x13\xb3\x18\x8c\xb2\xb22\ -\x8f2o\x0f\x91\xa4\x90\xc1\x0c\x0c\x0cdxz1\xbc\ -\xbc\xdca\x0aw\xe9P\xa1\x8c=\xc4](uP\x14\ -\xa2,'\x8a'\xe5H\xf8b\x19_$\xa4\xa1{v\ -\xbeH.\x0b\xa6\xd3\xb5i*\xa8\x97\xabD\xdc@H\ -(\xf5\xc0d\xf4\xe0\x88J\x18C\xd8b\x06\xd3\xc3\x93\ -\xd1R&.\xa7!\x8fX.\x11`\xacq9\x0c\x9e\ -\x80W\xc2\x13\xca\xa40\x1f\xb3\xc5|be\xdd\xb5L\ -\xb2!\xfa\x9d\x84!\xb7\x89\x89\xef\xe7\xb7\xa4\xa4\xc5\x9c\ -RYt\xa9\xec\xfd9\xa5iC\xc5\x05\xee\x01\xcc|&|\xc6|}\xb9<\x0e\ -\xd3\xcb\x97\xeb\x8b\xe9\xa0i\xf6\xb7\x8a\x8e\x12q\xe4\xa8\ -\xe9\xd6\x17\xcd\xfd\xc0\xa2U\xb2\xbfUt\x92\x84\x0f\xbb\ -\x1d\xb6\xa0\x8d$Z(\xe6-Rq|\xa9L$\x19\ -\x1a\xd2\xa4\xf9c\x1dB*op\xd3Pe\x84\x80\x8f\ -u\x10b\xb6D\xcaC\xcd?\x98\xael\xff\xf4\xb72\ -\xa0<\xd8c\xc4bsP\xd7\x12\xc2\xc1Z8\xb7'\ -\xa3I\xe8\xbb\xb3\xf1?\xb6\x02\xdf\xca\xfen\x1aeE\ -<\xe1\xfb\x9eL\x95T\xef.D**\x90\x95\xb1%\ -\xbc\xf0B\xa8\xe9\x90\x7f\x1cw\x94\xa56\xcd\xf6\x96\xbe\ -\x19\x0a\x857\xab\x1e\xc6\xdb\xf5\xa3\xac\xf3f\xf5\xa9H\ -\xaa\xd2\xb7+\x06\x0eF\xfd\xc8\x01\x07-F\xc3\xa8\xd5\ -\x92p\xea\x07N\x04'\x82\x13\xc1\x89\xe0Dp\x228\ -\x11\x9c\x08N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\ -\x9c\x08N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\x9c\ -\x08N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\x9c\x08\ -N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\x9c\x08N\ -\x04'\x82\x13\xc1\x89\xe0Dp\x22j&\xa2\xddx\x0e\ -\x8c'\xe4\x06\xd3\xcb\xe8\xa1! \x22>\x91\xec\x84\ -\x9d93\x04\xcd\x80\xc5\xb10\xef\xcd\xfax\xect\x1e\ -\xd0\x11K\xf8BY\x92\x5c&\x96\xcb\xe0-:&\x07\ -\x92\xa5\xb2\xd4|\x91H\x80\xa5\x88\x17\xcax<\xa1\xbc\ -D\xe9G\xff\x91\x02\x09\xba7\xc0\xf2\xa6\xf2\x87\xa0\x14\ -\x11|\x19\xca\xd3X&O\xd2\x87]\xc2K\x8b\xceJ\ -k \xa6\xc8\x90,\x11\x89\x0aRy2\xb98)\x7f\ -\x10\x07\x06\xeb\x82d \x01\x22\xf8+\x004\x90\x0ax\ -@\x06\xe4@\x8ce\xd1\x167\xa4V\x16\x13!\x90\x09\ -\xeb9\xd2\xcd\x97\xf3\x052\xbe\x10+\x12\xdeka\xa9\ -#\x13\xb3{+$\x0eB\xe9\x89\xeeM$6V\x91\ -8\x09;y \x85\xa1\x16\x98\x5cb\x99P)\x04\x14\ -2_\xd2p\x93R(Ml\x8c\x91\x08#\x1bo\x84\ -\xb2\xc6\x9b\x84|\x81\xb4\xe1\xa6O\xa1\xac\xb4\xe1&\xba\ -D\x10\xd5p\x03\xf5\xd8Xt\x04\xa7\xb8\xb0^\x11\x0a\ -\x06AJlD$P\x1c\x9b\x04)\x5c\x1a\x8d+\x92\ -\xe7\x87\x89\xaa\x1a*3V\x22|+,B\xf0v\xba\ -\x08\x097-](\x8bqH\x11\xc8T\x1bC\x84\x80\ -Kk)\ -\x8b\xae2\x06\xb1\xa0\x12\xae\xa7\x0cO\xe1\x17\x16\xa9F\ -\xe8(# o\x0d\xc1\xa8\xe5\x90\x1e(x\x00q@\ -q\xf6\xb3\xfe\x1fkU\xceX\x9c~\xa3\x04\xa1\xa3\xea\ -s=T\x90\xd3M\x93\xb0\x85R1[\xc2\x13r\x86\ -*Z\xa2\x19\x16c\x87bA\x1al\xedl \x04R\ -\xd8\xc6\xd9\xd0\xcf\x83~\x0e\x18Z\xff\x94\xfab)\x8d\ -0z\xa0\xae\xae\x9e\x04\x97\xa0\x88\xb5\xc5\xee\xc8J>\ -\xc9z\x0d\xf7v\xd8}\x97\xa6\xf7\xa4\xa7\xd8\xbd\x96\x92\ -SE).\x8a\xfeA[\xd9\xe0\x14r\x91\xaa1\x7f\ -\x1c`\x14\x14\xc0\x18\x01\xbcR\xea3)B\x96\xcc\x9b\ -\xdf\x10\xe2\x85]\xfb\xc1\xab2\xc4\x17\xbb\xba7\x86`\ -e\xbe\xc4\xfcb$IK \xddF\xd1\xea\x8f\xc3t\ -\xa1\x90\x8dX\x7fGlr\xe7\xa9\xe0\xb1^\xab\xee\xd8\ -\x1d\x05\xd3\x07\x09\x0b\xd1\xac\xaf\x7f\xac\x16\x88a\x0aW\ -\x9f\xd7\xaeY\x1dX!\x1f\xc9\xb7Ar\x05\xf2\xea\x9d\ -B;oC5L5m\x8b\x09\x94h\xec\xc6\x80P\ -.\x10(\x04\x02\x94|\x91\x5c\xc8\x956\xebE82\ -\xa6\x92M\xf4\xe8\xa94{\xd0\xec\xf9\x00\x11\x8d\xcf\x11\ -\xc6FJ\xe3c\x82\xee)R\x01\x9f\xc3\x93f\x08\x12\ -\xd0\x83NhBG\x03\x8b\x83\x1ec\xe8\xa8\xd8M|\ -\x94J\xd9\xd4B\x89H.n\x12D\x11a\xc7\xff\x94\ -}xt*\xca\xa48\x12\x08\xef\xf5\xd8r\x99(\x96\ -'\xe4I\xd0q<\x8c\xfb\xa1b\xe5\x10\xa4\xadH\x8c\ -BPL|I!\xad\x03\xe4'\xc9%\x82&\x03\x19\ -\xa6\xfc\xa6!\x89\xd2\xc2\xa6\x83\x1d\x85-\x90\xa5\xb1\x0b\ -\x9b\x84\xe9sx0\x1fo\x88,^\x1a\x97\x96\x98\xa0\ -\xecN5\x95\xc1M\x12k\x15\x89$\xc3\xc2\x05\xfcB\ -\xa5\xa6\x0c\x14\xc2\xc7)\x83\x91v\xb9\xbc\x02\xb6\x1c\xeb\ -O\xb5Jy\x12Y\x0b\xc93\x94\xc1M\x93\xeb\xe4\x17\ -b\xa7\x5cU\x94k\xa4\xc8\x10\x11\xdb\x10\x81\xd8\xe8#\ -\x12\xa2\x7f-\x99H\x0c\x07M)OUq\xda\x02\xa8\ -\xc8\xb7Bu\xf3\xb1\x8e\xf9\xadp\x1d\x09\xea~\x9b\x05\ -cO\x90\xab\x22\x1ft\xc4\xd0\xc7\xa01\xdc\x14\xf3\xa2\ -*T<\x95\xba\x98b\x8f\xd6\xab(O\xe1\x08\xb0\x09\ -\xa0'\x81\xb2\x11X\x02B\xdd\xa5\xba\x07@\x17;\xe5\ -\x98\x1b\x99\x08\xef\x1f\x02}\xec\x0epG\xa1|u\x97\ -\xc18\xa0\xab\xa9\xa9\xa9\xa5\xa9\xab\xa5\xa5k\xa4\xa3\xad\ -cdf\xa0\xabk`fibbfbbi\xa4\ -\x8b\xa1\xfe\xafe\x10\xf4tt\xf4\xf4\xf5\x0c\xf5\xf5\x0d\ -M\xf5\xf5\xf5M\xd1E\xdfT\x91\xc5\xa85\x05\xd4\xed\ -\x03F\x9a\x90\xf9<\x12\x81\x0e\x88F\x04\x92\x11\xa1\xee\ -*\x14\x94Rw\x88\x10\x0a\xb9\xd4 `\xa8W\x1c\x09\ -\x10\x88d\x0d\x0aUSK[\x87\xd0<\x92\x00\x88$\ -e\xa4! \x90\x09$\x22\x99\xa8A\xa5hj\x90t\ -\xbda\xa4\x11\x89\xdc\xd5\x98\xa9\x11\xde\x97mB\x1f<\ -\xda\x8bb:c\xc9w\x11\x0e\x8ef)\xfb\xf3\xbd}\ -$cNGR\x9d*R\x1f_\x7f\xc2\x91\xfa\x9a/\ -\xdd4\xd69\xea\xab4n\xf4\x81e2?\x8b3\xe9\ -\xbf\xf3\xfe\xda<\xee\xe0Y\xf9\x8d\xa71.3\x97\x7f\ -\xbee\xd6\xa1s\x7f<[\xb1\xf5\xc7\xf37\xab3\x0a\ -J\xc7\xcf^\xb9\xed\xa7\x0b\x7f>\xf7\x8f\xcd,,\x9b\ -0g\xd5\xf6\xc3\x17o\xbd0\x02D\x22\xe4\x96\x8c\xf1\ -D\xa5h\xf8b,te\x1a\x93!\x07\x83\xe9&\x1a\ -^\xa3g\x98\x22\x0e\xf6\xa7\x9c~\xec\xed\x98\x7f]2\ -\xa6\x222\xd5\x8c#\xf5y\xe2DA\x0cP\x9d}\x0f\ -\x9c\x81L,\xb3\xe0F\xa7\xfb\xc9x\xbf7\xb0\xf0n\ -\x0e\x5c\x1aY\xa8\xfb\x0d\xe8\x920\x9aF \x14T\xa7\ -U\xc4;us\xac\x88\xef\x15\xefX\x91R\x11\xef8\ -sy}@R\xdd\xa9\xea4\xb7\x05\xbfN\x9dV\x10\ -\xb9\xdfm\xcd\x8a\x87z\xd6S\x08!\x17\xc6\xa5U\xa4\ -F.\xaf^h\xb7!v\xdd\xa4G\xe2Z\xc9\xaa\xa2\ -\xe7\xf67\xfdk_o\xac\x94\xae{\xd3o\xeb\xf7\xf6\ -[Y\xd6\xb5G\x17^\x1d\x90uz\xf6\x90:\xe0T\ -Y\xf6f{>\xa8y\x9a\x1e \x12\x16\x04\xdd\xbb\x9b\ -n\xfb\xe5\xe11V\x03^\xbd\xfa\xfa\xf5\xe5\xf2\x8a\x8a\ -oV\x9c(\xee\x97\xf3\xbb\xd5\xe95.a\xe6\xbc:\ -\x90\xbdS?h\xb2\xe0\xf8\xfa\x19'\x8el\xae\x03\xc1\ -\xd4\x8d\xc1ww\x97\xad\x91\xf7\xd7\xfaeKM\xf9\x82\ -\xde>y\xb5\x87o\x95g\xdf\x0bv\x0aY\x11{A\ -8vz\xd5oO\x8b\xc9O\xf6\x14\xd7\x81\x93K&\ -'V\x16\xcf\xb79csv\xb5Cr\xe6Tw\xfd\ -Y\x17\x87\xcd\xe9\xf5m\x90\xf9\xd9;\xb5r\xc6\xf9\x09\ -\xaf\xec\x17\xbc)p\x5cu\xbe\x22;X\xe7\x9e\x9d}\ -\xd6\xda.5n+'n\x1a#\xaf\xddZ\xf8\xf4\xd2\ -V\x85\xf8u\xa0\xee4\xa6\x94@\xfb\xac\x9a7\x03\xec\ -\x8d\xfb\x1b\x1c\xdd\x16m\xb6\xe8\xf5\xcb:\xf0\x07s\xe8\ -\xca\x98\xe8_\xfdC^]\x13l;\xc8\x18\xfe\xbd\x13\ -d$\xe6\xda\x8as\xc2_\xbe\xfdY\xfa\xc5\xfa\x91\xf7\ -\x08o\xacc\x9f\xa7;\xce\x9cc>;\xf7\xab\x01\x8c\ -\xad[\xfc\x0eS\x16\xe4>\xebgp+pXh\x9f\ -\x9aU\xa7\x9et\x17\x9c\xba\xb2j\x86\xf3\xe5\xddO\x1f\ -\x17>-\xc9\xda\x9bZ\xe3\xac_\x1es\xa4t\x00\xbb\ -v\xeb.\xd2\xde\xc0%S\xad\x07\xf4\xdf\xeb{y\xfd\ -0o\x8f\xbb{\xd3\x1e\x98q\x85\xc7o\x9f\xf0;lV`\x82\xa7U\xd5e\xea#\xcf:\x10p\ -\xa6bQ6l:\xa9ug0\xad\x85\xa4W\x8f]\ -q\xf9L\xcd\xd7[\x02\xec\xe3\x0f\xed\x99P\xea\xe6r\ -\xb9VtJrb\xe0\xba\x8b,\x8f\xd0\xac\x83>\xfd\ -\x1fl\xddyVT\xba\xab\x0e\xd0\x1e\x9d\x1c\xc8[4\ -z\xd6\xd9\xbfr'\xcf<>\xdb\xfb\xa1\xc3\xe6K\xe5\ -\x81_\xc6'\xb1k\x19\x9b\xb3\xee\xe7L!\x96\xc7\x1d\ -\xae9n\xe7..\xb6\xad\xe5\xcc\xab\x03\x89\xf2\xd9\x99\ -\x03\xd6\xcbK}\x82\xa7\x19\xfe\xb9#\x8e\xf6\x9c\xb6\x91\ -\xbe\xff\xf8\x91}\xbf\x14dxo\xeb\x9f=}\xb8\xd1\ -\xd5J\xfb\x9d7\xaf\xe4}6\xe2\xce\x9c\x0cJq\xee\ -\xd4\xa2\x9ad\x9dK\xe5k\xb3\x1f\xd5\x81\xc5\x153n\ ->\x1b\xb9\xec\x14\xa3,\xf9v\xaa\xb0\xdbE\x07\xf2\x91\ -\xb3\x7f\xdb\xef\xae\x03\x8b`\xdb\x19\x97\xfd\x9f~#7\ -\xb1\xab\x07\xce\x9a\x9a\xe1\xb3\xedp\xf6\x9e\xbbW\x8f\xfa\ -\xe9\xed*\x9f\xb5\xeb\xdc\xf3\x0d9u`\xe3\xd7^\xf3\ -\x7f>P\xfcWIhL8\x87Z=\xf9M\x1dx\ -f\xa15kFAF\xf4<\xf3\xc3k\x8a'\x7f\xbd\ -\x8521DoP\xaf\x98-{6>[\xc7Z\x95\ -\xbav\xfc\xd8;\x9e\x13\xae=\xdc?\xea\xd5\xde\x935\ -zi\x8f\x9fx\x1c\xffe\xa3\xf9\x17~W\x1el\xb8\ -\x92\x974\xaf\xc7\xd9\x1a\xfb\xe8\xc3\xb7_\xe6O\xda}\ -aW\xff\x0d\x0fo\x95\xffa\xfd\xf7\xc4n\xa71]\ -\x9eU<\x96}\xef^\xb5\xa6\xae\xe3\xd4\x04&\x9c+\ -\xf7/\x96\x0d7\xf8k@\x1d\xf8,\x13>\x9b\xf3\xab\ -Ekm3W\xed\xd8\xb3\xd2\xe6\x87\x91\x17\xd2\x1cG\ -\xd7\x01\xad\x8c\xcaA\x07ic\xc9\xe16\x9f\xdf\xff\xd9\ -\x82\xcd\xe6v\xd9k\xb7.i\xf2\xa5\x8b\xe5\xe7\xc93\ -\xff\x06\xe4\xb9\xc4\xf8*\xf7\x13_U\xc7\xae\xad\xa6R\ -/\x1d\x9c8\xed\xda\xd1(\xe3\xd0\xaa\xbb\xa7O\x0c\x9c\ -\xd0\xc7\xdc

\xf3\xee\xea\x97\xdfM\x15\xbd\x89\x8b\ -\x8dO\x0a\x15\x9d\xdbS\xf1\xf0\x9b+\xfdFW>\x1f\ -\xbe`\xd6\xd1\x17\xe5\x8c\x17\xf3^\x7f\xde\x9fZyK\ -6b\xfc\xb3\x93\xebi\x0fX}\x17\xfa\x16Ox\xed\ -\xb07\xa8\xa6\x0e$\xbd\xe9~7}\xc4}\xdd>K\ -\xbe\xbc/\xd8\xf9\xe3\xac]\xdf\xfda\x7f\x8d\xb3\xd7\xf7\ -H\xb7\xa0\x9c\x8b[\x02\x97\x07V\x1a_\xd4\x0b\xa7\xee\ -\xe8\xb3$\xd1\xb7o\xefn+\x96\xcc\xca e\x9d\xde\ -GHt\x0a\xad;\xf7\xbe>\xe8W\xc58\xd7\x15\xeb\ -\xc9\x07\x00\xcc\x22\x85#7\x08\x07\x5c8\x1d\xce\x87S\ -\x03\x1a\x9c\x1c\x17A\xbf\x0c:)\xe6C\x13a\x8b\x7f\ -HA\x03\x91\xf0G\x83f\xba'`\x02\xff\xfa\x01S\ -7.\x81/\x14\x11\xa1\x11Y\x02g\xa0\xe8\xcb\x15Y\ -\xd9\xfdh\xd4\x13\xd0\x88\xd4\x82\xb6+4\x97\xd8\x1c\xa9\ -815&\x0d3\xae\xa2#i\xe8\xf3\x16\xa0\x09\x9e\ -_P\x98'g\xdd\xe3\x92i4\xf0a0\xe2\x88%\ -2\xf4U\x1d\xe8\xf7\xe6\xf2\xa4\xd0\x5c#\x8c\x83~A\ -\x99L\x8c\xc2\xd1\xd8o\x9a_\x8c\xfcD4\xea\x9bJ\ - \x83\xd0o\x89\xfc\x85\x0a\xbf\x1b\x96F\xe1\x0fC~\ -n\x89\x10\x9a\x89D\xc4\xb3\x98[\xc2E\xfeC\xd0\xff\ -E\xa9\x1c\x99\x8f\xa4\x04\xe8\x1f_\xca\xe7\x95A\xff9\ -\xe8w\x14\xc8K\xf8\xd0\x8ff&\xa6%<64i\ -1\xbb\xc2Q\xc6\xe3\x14A?\x9a\x19\xe8J\xd2R\xe0\ -\x5c\x96\xdc\x13\xdaf\xba\x85*\xfe|\x15\xbf\x0c\x1al\ -H\xa8H\x91x(f\xd9\xd0\x5c9\xddh\xcc\xc0\xc0\ -\x00Z\x1c\xafL\xc0\x93\xc9\xdc\x93\xd9\x9cb\xb6\x84K\ -\x8b\x14\x95\x88\xd9B8\xc3S\xc8\x8c\xc1\xf8\xadO\x87\ -\xa8(\xea\xbd\x91\xad\x04\xaa[\x85\xefi_\xac\xce\x08\ -\xe6\xc7\x1a\xc3ZJ'Z\x0a\xed.8\x0b$Mo\ -\x0c\xcb\x9f\x07\xc0\xf6\xcf\x01\xb0\xfc\xad1\xccq1l\ -\xa3\xb0\xde\xb6\x9dT\x91\xc7\x1c\xb5\x17\x95\x8f\xfc\xf0y\ -\x1c\x0f\xa4\xd0\x06\xfcc\x82V@\x85\x9e\x07*\xaeA\ -=\xb4(\x85eKCz\xe3@\xfbU.\xa1\xc1\x19\ -8\x87Gso\xde\x88?:c\xcb|\xb8\xa5\xf0\x0a\ -xh\xa6\xcf\xa3e\xc0V\xc6\x17\x16\xc2\xea\x16r\xf9\ -\xd8\xf7\x8a\xf8\xc2wU\xe2Gfk\x06E\xbb\x860\ -Y^\x0bLs=\x80\xe1IS@zp\x0c\x90M\ -t\x00)\xe7\x1b\x18Ch\xa8\xb7\x04\xad\x0c\x80\x9e\xbc\ -L\xfb[\x8av\x8f\xa1\x85i&q\x1a\xbaH\xf9\xd8\ -\xe4\x0aD\xa6\xa4\xd18rI\xa9\x22\x0e\x9bOi\x00\ -m\xd8I\x99\x82.\xc0\x0e8\x00W8\xeb\xf7\x82\x9d\ -L\x10\x08\x03\xd1\xa0\x17H\x02i \x1b\x0c\x04\x1c\xd8\ -\x19\x95\x00\x09(\x03#\xc0h0\x1eL\x06\xd3\xc1,\ -0\x1f,\x02\xcb\xc1\x1aP\x096\x81\xed\xe0\x07\xb0\x1f\ -\xfc\x04\x8e\x82S\xe0<\xb8\x0c\xaa\xc0Mp\x0f<\x06\ -\xcf\xc1+h\xe0R\x09z\x04\x13B\x17\x82=\xc1\x89\ -\xd0\x83\xe0E\x08 \x84\x10\xa2\x09\x09\x84\x14B6!\ -\x8fPH\x10\x12\xe4\x84\x11\x84\xb1\x84\xc9\x84\x0a\xc2|\ -\xc2\x12\xc2\x1a\xc2w\x84\xef\x09\xfb\x09G\x08\xa7\x09\xbf\ -\x12\xae\x13\xee\x10\xfe\x22\xd4\x10ID]\xa2)\xd1\x96\ -\xe8Ld\x10\x03\x88\xe1\xc4\xde\xc44\xe2\x00b!q\ -0q\x18q\x1c\xf1K\xe2\x5c\xe2R\xe2z\xe26\xe2\ -~\xe2Q\xe2yb\x15\xf1\x1e\xb1\x9a\x04H:$s\ -RW\x92;)\x80\x14IJ\x22\xf5#\x15\x90$\xa4\ -\x91\xa4I\xa4\xd9\xa4\xa5\xa4J\xd2N\xd2a\xd2YR\ -\x15\xe9>\xe9o2\x85lB\xa6\x91\xdd\xc9A\xe48\ -r:\x99C\x1eL\x1eI\x9eB\x9eO^M\xdeF\ ->D>K\xbeN~L\xae\xd5\xd0\xd3\xb0\xd1\xe8\xa1\ -\xc1\xd2\x88\xd7\xc8\xd2(\xd4(\xd3\x18\xaf1[c\xa5\ -\xc6V\x8d\x1f5\xcek\xdc\xd4xN\xa1P\xcc).\ -\x14\x7fJ\x1c%\x9b2\x882\x9c2\x85\xf25e#\ -e\x1f\xe54\xe5\x06\x05\x0eh\xd4.\xd4\x1e\xd4`j\ -\x12\x95M\x95Q\xc7S\xe7Q\xd7S\xf7R\xcfPo\ -R_j\xeah\xdakzi\xc6h\xf6\xd3\x14j\x8e\ -\xd1\x9c\xad\xb9Vs\x8f\xe6\x19\xcd[\x9a\xaf\xb4\x0c\xb5\ -\x9c\xb4XZIZ\x5c\xad\xa1Z\xd3\xb4\x96k\xed\xd4\ -:\xa9uS\xeb\x95\xb6\x91\xb6\x8bv\xb0v\x9a\xf6 \ -\xed\xd1\xdas\xb5+\xb5\x7f\xd4\xbe\xa2\xfdTGG\x87\ -\xae\x13\xa8\xd3W\x87\xaf3Jg\xae\xce\xb7:?\xeb\ -\x5c\xd7\xf9[\xd7X\xb7\xbbn\xa4n\x8e\xae\x5c\xf7K\ -\xddU\xba\xfbt\x7f\xd5}\xaa\xa7\xa7\xe7\xac\x17\xa6\xd7\ -OO\xa6\xf7\xa5\xde\x1a\xbd\x83z\xd7\xf4^\xea\x9b\xe8\ -{\xe8\xc7\xebs\xf5\xcb\xf5\x17\xe8o\xd3?\xa3\xff\xd0\ -@\xcb\xc0\xc9 \xdc`\xa0\xc10\x83\xd9\x06\x9b\x0dN\ -\x1a\xdc7\xd42t6\x8c4d\x1b\x8e4\x5c`\xf8\ -\xbd\xe1E\xc3j#\x13#\xa6Q\x92Q\x89\xd1\x14\xa3\ -\xb5FG\x8cn\x1bS\x8d\x9d\x8d\xa3\x8d\xb9\xc6\xe3\x8c\ -\x97\x19\x1f4\xbeaB2q0\x894\xe1\x98\x8c5\ -Yn\xf2\xa3\xc9MS\x8a\xa9\x8bi\xbc\xe9 \xd3\xc9\ -\xa6\x1bLO\x98>636\xf31\xcb0\x1bb\xb6\ -\xc0l\xb7Y\x959\xc9\xdc\xd9<\xde\x5c`>\xcd|\ -\x93\xf9\x05\xf3\x1a\x0b[\x8bp\x0b\x9e\xc5D\x8bJ\x8b\ -3\x16/,\xad-\xc3,y\x96\x93,7Z\x9e\xb7\ -\xac\xe9B\xeb\x12\xdd\xa5\xb8\xcb\x8c.\xdb\xbb\x5c\xb5\x22\ -[u\xb7\xeakUf\xf5\x8d\xd5\x8fV\xf7\xadM\xad\ -\x83\xac9\xd6\x93\xac7Y\xfffC\xb4\xe9n\x93b\ -3\xdcf\x99\xcd1\x9bj[;\xdbX[\xb1\xed<\ -\xdb\x83\xb6\xf7\xed\xcc\xed\xc2\xec\x06\xd9\xcd\xb4\xdbcw\ -\xc7\xde\xc4>\xc4\x9eo?\xd3~\xaf\xfd]\x9a\x19-\ -\x9c&\xa0\xcd\xa5\x1d\xa2=\xeej\xd35\xae\xab\xbc\xeb\ -\x92\xae'\xba\xbe\xa2\xbb\xd0\xd3\xe9c\xe8\x1b\xe9W\x1d\ -\xb4\x1d\x02\x1c\x0a\x1cf:\x1cpx\xech\xef\x98\xe8\ -8\xc2q\x9d\xe3oNZN\x01NENs\x9c\x0e\ -;\xbdpvq\xcet\x9e\xe0\xbc\xdd\xf9\xb6\x8b\xa5K\ -\xbc\xcb0\x97u.W\x5c\xf5\x5cC]\x07\xbb.u\ -=\xd7\x8d\xd2-\xa0[q\xb7\xaf\xbb\x9d\xeaN\xec\xee\ -\xdb\xbd\xa8\xfb\x82\xee'{\x10{\xf8\xf5\xe0\xf7\xf8\xba\ -\xc7i7\x0d\xb7@7\xa1\xdbR\xb7\x8b\xee\xba\xee\xe1\ -\xee\xa5\xee\xeb\xdc\xaf{\x98{$x\x8c\xf1\xd8\xee\xf1\ -\x90\xe1\xc8\xe8\xc7\x98\xc18\xcc\xa8\xf5\xf4\xf5\x14x.\ -\xf7\xbc\xcc4f\xf6b\x8ea\xeed\xfe\xe5\xd5\xdd\x8b\ -\xe3\xb5\xc0\xeb\x9c\xb7\x9ew\x8cw\xb9\xf7\x0e\xef'>\ -=|x>\xdf\xf8\x5c\xf25\xf1M\xf4\x9d\xe0{\xc0\ -\xf7\x8d\x9f\xbf\x9f\xc4\xaf\xd2\xef\x8e\xbf\xa3\x7f\x9e\xffB\ -\xff\x8b\x01\xa6\x01\xc9\x01S\x02~\x0e\xd4\x08\x8c\x08,\ -\x0f\xfc!\xf0o\x96\x1fK\xc6\xda\xc4z\x14\xe4\x1eT\ -\x1c\xb46\xe8vO\x97\x9e\xbc\x9e\xcb{\xde\x08\xa6\x07\ -\xb3\x83\x97\x04W\x85\xd0B\xf2B\x16\x87T\x85v\x0d\ -e\x87.\x0d\xfd=\xcc!\x8c\x1b\xb62\xecVx\xb7\ -\xf0A\xe1\xeb\xc3\x1fFxFH\x22\xb6F\xbc\x88d\ -E~\x16\xb9/\x8a\x14\x15\x1b5)\xeaD\xb4qt\ -z\xf4\xfc\xe8k1\xf4\x98\xc2\x98u1\x8fc}c\ -\x87\xc7\xee\x8b\xd3\x88\xeb\x1d7#\xeeb\xbcm<'\ -~M\xfc\xe3^\xfe\xbd>\xebu\xa8\xb7n\xef\xd4\xde\ -\xf3{\xff\x9e\xd0=A\x92\xb03\x91\x98\xd8+\xf1\xab\ -\xc4+}\x9c\xfa\x08\xfblO\x02I\xf1I_%]\ -MvI\x1e\x9c\xbc\xab/\xa5or\xdf\x05}\xffL\ -a\xa6\x8cH9\x9cj\x92\x9a\x9b\xba6\xf5yZD\ -\xda\xb4\xb4\xcb\xe9\xae\xe9\xf2\xf4\x03\x19\x06\x199\x19k\ -2^dFeVdVe1\xb2>\xcb:\x9am\ -\x95\xcd\xcf\xde\xd1\x8f\xda/\xa3\xdf\xca~\xd5\xfd\xa3\xfb\ -\xcf\xea\x7f3\xc77g|\xce\x85\x01.\x03\x86\x0c8\ -2\xd0j\xa0`\xe0\xee\x5c\x83\x5cv\xee\xe6<\x8d\xbc\ -\xcc\xbc\xb5y\xaf\xd9I\xec\xa5\xec\xea\xfc\xf8\xfc\x85\xf9\ -\x8f9\x91\x9c9\x9c{\xdc0\xeeL\xee\x1d^0\xaf\ -\x82w\xab \xb8\xa0\xa2\xe0vap\xe1W\x85w\x8a\ -B\x8bf\x17\xdd\xe7G\xf2\xe7\xf3\x9f\x0c\x8a\x1b\xb4h\ -\xd0\x8b\xe2\xa4\xe2U\xc5u\x82L\xc1\xc6\x12\xcd\x92\xbc\ -\x92\xef\x85\xc6\xc2b\xe1!\x91\x9dh\x88\xe8\xb4\xb8\x87\ -x\xbc\xb8j0k\xf0\xac\xc1\x8f%\xbd%+\xa5\x04\ -\xe9\x00\xe9\x0e\x99)4\xa6\x8e\xc9]\xe5\x9f\xcb\xaf\x97\ -\x86\x94.(}Y\x96Q\xb6y\x88\xd1\x10\xe1\x90c\ -C\xbb\x0f\x9d8\xf4\xd6\xb0\x98a+\x86\x93\x87s\x86\ -\x1f\x18\xd1u\xc4\xe8\x11\xd7?\x0b\xffl\xc9H\xc2\xc8\ -\xfc\x91\x07\xca\x1d\xca\xc7\x95\xdf\x1c\x15;j\xf5h\xed\ -\xd1\xc5\xa3\x8f\x8f\xf1\x1cS1\xe6\xd9\xd8\xcc\xb1;\xc7\ -\xd9\x8e\x1b5\xee\xc6\xe7\xb1\x9f\xaf\x1b\xaf?^2\xfe\ -\xe2\x84\xa0\x09\x8b\xbe \x7f\xc1\xff\xe2\xc4D\xef\x89\xf3\ -&\xd6N\xe2N\xfae\xb2\xe7\xe4\xd9\x93_O\xe1L\ -\xf9e*s\xea\xdc\xa9u_\x16|yb\x9a\xdf\xb4\ -o\xa6S\xa6\x0b\xa7_\x98\x11:cu\x85Q\xc5\xb0\ -\x8a\x1b_%~\xb5m&m\xe6\xa4\x99\xcff\xe5\xce\ -:2\xdbg\xf6\xa29\xdas\xe4s\xaa\xe6&\xcc\xdd\ -1\xcfq\xde\xf4y\xaf\xe7\x17\xcd?\xbf b\xc1\xc6\ -\x856\x0b'.|\xf15\xf7\xeb3\xdf\x84}S\xb9\ -\xc8v\xd1\xe4E5\x8b\xf9\x8b/-\x89]\xb2m\xa9\ -\xf3\xd2\xd9\xcb(\xcbJ\x97\xfd\xb9\ -\xf1\xbe\xfb\xfb\x0b\xf7\xdf8\x90{\xe0\xf2\xc1\xac\x83\xe7\ -\x0e\xf5=t\xe2\xc7\xde?\xfe\xfcS\xccO\x07\x0f\x87\ -\x1f\xde\xfbs\xf0\xcf?\x1ca\x1d\xf9\xfe\x97\x80_\xb6\ -\x1f\xf5;\xba\xed\x98\xef\xb1\xad\xc7}\x8fo=\xe1w\ -b\xdbI\xff\x93;N\x05\x9e\xday\xba\xe7\xe9=g\ -B\xcf\xec?\x1bu\xf6\xa7s\xf1\xe7\x8e\x9e\xefs\xfe\ -\xf4\x85\xf4\x0b\x97.\xe6\x5c\xac\xba\xc4\xbdt\xfbW\xc1\ -\xafO~+\xfd\xed\xd5\xe5QW4\xaeL\xbajx\ -u\xf65\x9bkK\xff\xd3\xed?\x1b\xab\xfc\xaav_\ -\x8f\xba~\xec\xf7\xd4\xdf/\xdf\xe0\xdc\xb8\xf7\x87\xf4\x8f\ -\xd77\xc7\xfd\xa9\xf7\xe7\xec[\xf6\xb7\xd6\xdc\xf6\xba\xfd\ -\xc3\x9d\x98;\xa7\xee\xf6\xbf{\xf3\x9e\xf8\xde\xab\xfb\xe3\ -\x1f\x18=X\xf8\xd0\xf5\xe1\x96Ga\x8f\x8e=\xcez\ -|\xf3\x89\xe4I\xdd_S\x9evy\xba\xea\x99\xcf\xb3\ -\x03\xd5\xc9\xd5\xd7\x9e\x97<\x7f\xf5b\xd2\xcb./W\ -\xff\x1d\xf0\xf7\xe1\x9a\xcc\x9a[\xaf\xca^S_\xcf}\ -\xd3\xed\xcd\xce\xda\xde\xb5W\xeaJ\x1a\xdeH\xe0\xc0\x81\ -\x03\x07\x0e\x1c8p\xe0\xc0\x81\x03\x07\x0e\x1c8p\xe0\ -\xc0\x81\x03\x07\x0e\x1c8p\xe0\xc0\x81\x03\x07\x8e\xffc\ -\x90\xc9dMGG\xc7\xac\xce\xe6\xe3\xff\x15aaa\ -\x8b\x0a\x0a\x0a\xea\xe0\xff7\xa8.:\x9b\x9f\xff'\xa0\ -v\x8ft\xaft)))Guuu\xed\xda\x83\x96\ -\x8e\x8e\x8e\x15\x9dNO\xf7\xf3\xf3\x9b\xd0\xabW\xaf\x1d\ -\x19\x19\x19\xe7srr\xfe\xe4p8/\x90C~\x18\ -v\x01\xc6}\xef\xef\xef\xff\x85\x83\x83C\x06\xca\xd3\x1e\ -\xbc|*@\xed\x1d\xb5{\xd5:\x188p\xe0]k\ -k\xebw\xec\xf2\xfd0@\xfdY{zz\x96%'\ -'\x1f\x86e\xd7\xaa\xd2i\xa5\xab\xed\xdb\xb7\xef\x11X\ -\xc6\x10\xd8.l\xd5\xc1\xd3\xa7\x0877\xb7\x12.\x97\ -[\xa3\x94\x9b\xc7\xe3\xbdvww\x17}ly\x16\x16\ -\x16\x01QQQ\xaba9\xaf>B\xe7-:T\x16\ -,s\xad\xa5\xa5%K\x9d\xb2\x7f*\x80r\x05\x0d\x18\ -0\xe0\x96\xaa\xcc\x91\x91\x91+\xe13\xa2\xdd\xda2`\ -\x1b\xb5A:R\x97\xce\xdf\xe5\xa2\xa3\xa3\xd7\xb7W?\ -\xd9\x99\xd0\xd6\xd6\xee\x02\xfb\x8a\x9fTeMKK;\ -\xad\xaf\xafO\x7f_>\x12\x89DA}D~~\xfe\ -\xb3\xf6\xd6\xbd\xd2AZ\xd5L&s\x18\xa4M\xed(\ -\xfdt\x04\x90.CBB\xe6\xa9\xca\x9a\x97\x97\xf7\xd0\ -\xd6\xd66\xb6\xa5\xf46661\x99\x99\x99\xbfv\x94\ -\xde\x9b\xbb\xac\xac\xac\xcb\x90\xb7\xb8\x8e\xd6S{\xc3\xd5\ -\xd55\x1f\x8e\x09/Ud}\x83\xc6R\xe59g\xf8\ -G\x84\xb6\xcc\xe7\x9d\xa5\xf7\xe6\x0e\xd9L\x88\xa7\xce\xd6\ -\x9b:ann\xee\xdb\xbf\x7f\xff\xdfU\xe5\x8c\x89\x89\ -\xd9\x80\xfa\xf9\xf8\xf8\xf8\xad\x9d\xad\xf3\xe6\x0e\xda\xae\xdb\ -\xa9T\xea[\xdf:\xfa7CKK\xcb,11q\ -\xaf\xaa\x9c\xf0\xb9\xf8\xbb\xb3u\xfd\xbe\xfe\xc8\xd8\xd8\xb8\ -Gg\xebM\x9d \x12\x89d\x16\x8b5\xa3\xb3u\xdb\ -Z\x07\xc7\xe6\xa7p\x5c\x8a\xeel\xbd\xa9\x13P\x9e\xa8\ -O\xb9\xdd7whN\xfd\xbfR\x07\xc8\xc6A\xf2\xa8\ -C/9997\xd1\xb3\x84l\x16##\xa3\xee\x14\ -\x0aEOCCC\xd7\xd0\xd0\xd0\x19\x8e57\xda\xa1\ -\x0eb:[\x7fm\x01\xb2;\xd5\xa1\xfb~\xfd\xfaU\ -\xd1\xe9\xf4\xd4\xf7\xd9(\xa8\xefn\x8f\xe7\xe0]\xb6\xf3\ -\xa7\x0ed\xff\xa0yN[u\x10\x10\x100\x05\xce\xa3\ -\xb5\xfe\x89^{\xe8\x1f9$\x83\x99\x99\x99OG\xe8\ -L]@\xf3\xfb\xe6\xeb\x11\x1f\xe1\xde\xf4\xe8\xd1cP\ -ki\xb6\x97\xfe\x91C\xb2\xfc[\xd6\xf0`\x9f\xac\x9f\ -\x9e\x9e~\xb6\xad2\x7f\xe8\x1a^{\xea\x1f9\xb4\x96\ -\x82\xc6\x9b\xf6\xd2\x9b:\x80\xe6\xb7qqq[\xd4!\ -/\xea\xf3MMM[\xfd\xa5\x90\xf6\xd6?r\xb1\xb1\ -\xb1\xdf\xa9|\xab\xec\x93\x83\x97\x97\xd7\x085\xc8\xd9\xb0\ -\xd6\x0f\xc7\xbf\xe7\xce\xce\xce\x03ZC\xbb#\xf4\x8f\x1c\ -ZGio=~\x0c,--{\xa2\xb5\xff\xb6\xca\ -\x87\xec\xcb\xbc\xbc\xbc\xc7\xcd\xc2\xa6\xa3y\xdc\xfb\xe8w\ -\x94\xfe\xd1\xbb\x04h[\xf8w\x94^[\x03\xd4\xe7\xa3\ -\xfeB\x1d}\x0e\xd4\xb3\x86\x81\x81\x81\x13\x1cC\xce\xa9\ -\xc6\xf5\xe9\xd3\xe7\x80\xb6\xb6\xb6\xc5\xbbx\xe8(\xfd#\ -\x07i\xfd\xf6!\xef6\xda\x1b\x81\x81\x81S\xd5!\x97\ -\xbf\xbf\xffDe\x99h^\xd5\xfc}\x0c\x9c\x7f\xfd\xf1\ -\xae\xb6\xd7\x91\xfaG\xce\xc7\xc7gt\xc7i\xf8\xdd@\ -k\x86h\xcdD\x1d2YYY\x855/\x1f\xbd\x9b\ -Q\xed\xd7\xd0:\x86\xab\xab+\xb7y\xba\x8e\xd6?z\ -\xaf\x81\xdaH\x87(\xf9=\x80\xfa)U\x87H\x15h\x8d\xa8\xf9\xf8\ -\x8a\xd6\x92\x0c\x0c\x0c\x1cQ\xd9\xd0^\xb8\xdeV>\xe1\ -\xdc\xf7\x91r\xde\xf1\xa9\xc0\xd9\xd9y\xa0:\xdaU\xf7\ -\xee\xdd?\xf0+\xdao\x03\xf5\xf1={\xf6\x9c\xd9\x5c\ -gAAA_\xa9\x83G\x07\x07\x87Lu\xe8L\xdd\ -P\x9e\x87i\x8bC\xedS\xb5\xbfh\x0bP\x9bh\xf6\ -\xfe\xffc\xce\x114qh\xddC\x1d\xbc\xb5\x07\x90\xed\ -\xdd|\x8d\xe0c\x1c\x9c\xe3.W\x17O\xa6\xa6\xa6^\ -\xeaX\x1bG.%%\xe5\xd8\xa7\xbeg\x1a\xbd\xa7F\ -\xfbt\xda*\xeb\x87\xbc{\xff'\xa8c\x8d\x10\x8d\xeb\ -\x9fZ\x9f\xff.\xc06\xe7\xa9\x865\xe9Z\x0f\x0f\x0f\ -I[yA6h[\xfb\x1dd[\x98\x98\x980\xd4\ -\xa1\x9b\x8e\x82\x9d\x9d]\xbc:\xe6\x05p\x1c\x9d\xf51\ -\xfb\x0e\xd0;\xb9\xe0\xe0\xe0\xb9m\xa5\x8fd\xf8\xb7\x9e\ -\x11prr\xcaQG\x1d\xa0\xf3\x8dp,\xcd}\xd7\ -\xfb\x01U \x1b\xd3\xc5\xc5%\xaf\xf9\xda\xd0\xc7\xea\x1e\ -\xc9\xd0\x11\xbaj/8::f\xabk~\x8c\xde9\ -\xa1y\x0f:_\x8a\xe6Z\xe8,\x01r\xc8\x8f\xc2\x90\ -\xfd\x85\xecLu\xd0B<#\xde;[\x7f\xea\x00\x9d\ -NOS\xe7y\xc6\xf6vH\xf7\xe8\xbcqg\xebM\ -\x9d\xa0\xd1h\xc9\xea\xda\x07\xdd\x11.00\xf0\xcb\x7f\ -\xda\xf3\xf2o\x83\x99\x99\x99\xb7:\xe6\xff\xed\xe5T\xcf\ -1#\x87\xce\xee\xa03<\x9d\xad7uBSS\xd3\ -4!!awg\xeb\xba\xb9C\xba\xd6\xd7\xd7\xa7\xc5\ -\xc4\xc4T\xaa\x86\xa35)\xb4\x97\xbb\xb3\xf5\xa6N\xc0\ -\xe7\x9a\x84\xd6:;[\xe7-\xf55h\x7f\xa7\x97\x97\ -\xd7p\x18\xfeF\xe5\xb9x\x89\xcetv\xb6\xde\xd4\x0d\ -4G\xe8\x8c}#J\x87\xf6\x5c@\x1ez\xb7\xc4\x1b\ -\xb2\xf9\x91\xbd\xa5\x9a\x1e\xceEf\xb7\xc6\x06\xfe7\xa1\ -\x93\xce\xbf?k\xcd\xf9w\xb4\xae\x8e\xf6\x9d\xab\xe6M\ -JJ\xfa\x11\x9d\xf5\xef(\xfdt\x14\xd0\xda\x0a\xfaf\ -D{\xeb\x1e}\xdb\x03\xcd\x19Z\xcb\x17\xda\xe7\xd9\x9c\ -/4\x1fD\xdf\xbchO}t\x16\x90\x8d\x14\x1e\x1e\ -\xbe\xa4\xd9\xf9\xf969\xf4\xae\x10\xed\x8dh\xcb9\x22\ -\xb4\x16\xd5l\x1fd\x8d:\xd7\x08?5 \xbb\x0f}\ -\xdb\x06\xd9J\x1f3wCy\xd0>+X\x86\x10\x96\ -e\xae\x0e\x9e\xac\xac\xac\xc2\xd17\x8eT\xe9\xa09\xf7\ -\xff\xfa\xb7\xbf\xa8T\xaa\x11\x1a\xabQ\x9f\x8d\xde\xe7\xa2\ -o2eff^Bk\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - <\ -/circle>\x0d\x0a \ - \x0d\x0a \ -\x0d\x0a\x0d\x0a\ -\x00\x00\x04\x5c\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / error / Edit\ -or only\x0d\ -\x0a Creat\ -ed with Sketch.<\ -/desc>\x0d\x0a \x0d\x0a \ -\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x15\xcc\ -I\ -I*\x00j\x08\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ -\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ --\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ -$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ -S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ -O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ -\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ -B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ -\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ -o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ -\xc4Sp\xd6`\x0e6\xb4\xd0\xc8\x02\xdf\xb91L\x14\ -3\x05\x0dH\x02PWX\x0b<\xe6\xc6\x80\x5c\xc0]\ -#XY\xa7}Vqx\x0a\xc5\xcfCJflB\ -\x90R\x86\x84\x9f \x22AA\x11\xd7\x9e\x85o X\ -\x828K-8\xb1\xe9G\xd5\xda96\x1d|\xf5\xa9\ -\xcf\x06>:G8)\xd2\x0a\x0c\x9e; \xa8>\x10\ -!1\xc5\xd4\xcf9vo\x1dw\x9b6f\xfaK\x12\ -\x04\x84\x14/RohL\xc3?\xa2\xf6s\xe5\xb1~\ -+~y\x5c\x80\x04\xf4\x99\xa4*\x0a<,G\xe3B\ -8\xbe\x81\x99(\x99\xbfK\x04\x1a\xac\xbf\x893\x9ej\ -\x00\xce\x91\xf0U\xa0\xa2r\xde\xd0\x92\xd0H\xd6\xab\xa4\ -+\xec\x1e\xabB)+bf\x13\x88(\xc6\x94\x1c\xa8\ -)\x9c\x82\x9dH)\xe2\xd0\x82I\x03\xde\x82\x06\xa8+\ -f\x924#\xe4\x13\x01%\x11\x1b\x0a\xd6\xaeQ*;\ -\x13\x8d\xe8+\xda\x8e\x1d\xc8)*\x82\x94\xc1\xa4\xa4l\ -\x22\xc9\x00\x02h\xcb\x01\x81\xf9-\x8c\x11R\x0a\x05\xa3\ -1\x08\x00)JA\xa1`\x92\xc8J\xd4\xd2\xa9\xc8\xc8\ -\xc4N\x16\xa0\xa6z\x0a\x01\xa2\xb3\x11\x1c\x02O\x03\xf8\ -a=\x9e\xa9y\xad?\x82g\xb5\x05%\x80\x02\xe22\ -y\xcf\x00 I=\x86\x11\x8a;5\xaa\xd4\x82\x9f6\ -\xa2\xf19j\x82\x89H\xa9\xea\xcf\x00B\x88eO\x97\ -j\x19\x9dQ\x8b\xc7\xf5LONh\x93BJ\xc1#\ -b=I*\x95\x82\x9bJ\x22F}l 2g\xe9\ -~\x8a\x9f\x14\xc4\xcb]\xa9\x918\xb6\x82\x94H(\x04\ -\x88\x9fm\x08U\x04\x9b\x88\xd5d\xb2H\x90\xdb\x1c\x8d\ -D\xe5\xa2\x0a%\xa2\xa3\xa4\xcaF\xab0\x01(\x90C\ -\xe8\xa1)2\x8d\xb6u\xa2\xbaY\xea]h\x86\xc2n\ -\x8b\xa4\xed \x80:\x22i\xc1!\x8bB~\xab&\xbd\ -\xf4\x06\x9e\xb7\xed\x9a\x82\x02\xc8\x89\xc72\x83\xd74\xc4\ -\xbd\xdc\xebm\xd6\x86@\x02\x9a@VULh\xdd\x04\ -\x92k\x1cNG \xa3\x8a*\x19\xcc\xb1|\xeb\x84\xae\ -WJ\x95\x85\xa1p\x012\x90\x0c\xc8\xa852\x9c\xeb\ -\x1dFg\x07U1\xfcb\xe2 \x08\xf1\x04\x912\xae\ -@\xb7\xe4J>H\x85D\xe5\xb2\x0a$\xa2'\xac\xca\ -\xec-\x19x+\x99Q\xc8\x849\x0fgX:\xf1\x9e\ -\xa8\xd9\xfa\x13\x13\x9a\x08(^\x88\x9bs(L\xb7\xc4\ -\xe7\xda\x0a\x02\x22%\x84\xca(\xea+\xf6\xa8\xa2\xea\xc8\ -DO\xa6\x82\xa8\x89\xb12\xb2\xabtO^\xde(\x89\ -\x932\x87\x1bLE\x9d\xad\x1bj\x0f\x13\xb8\xe8$\xc0\ -\x88nr\x96\xea\xb6\xee\xe8-\xe4\x88\x1a\x93,\xe1\x8f\ -\xeaK\xae\xd6\xa2pH7\x09/\xee[\xa6\xc0\xd8\xef\ -\x00\x07\x1e\x87\xf22\x97&\x96\xf0\x0bo.\xa1\xf3(\ -/7\xc3s\xbcW>ft=\x1a\x1d\xd2\x86\x9d:\ -'\xd5\xa8\xdd\xe2\x7f\xd6\xa0\x9dx\x01\xc3\xa1\xfcHi\ -\xc5\xad\x9cn\xf3\xc8r[\xf2\xf5\xdf'\xde\x00\x01\xe1\ -x\x88w\x8d\xe4->WD\x88\xf7\x1d\xd2\xed\xd4\xad\ -\x9e\x82{\xc1\x1b_(\x0ey}\x12j\x08\x05k\x94\ -\xe0v\xb7\xe6G\x22\x0a\x03\x22&\xbe\xb52\xecH\x8f\ -\xc4\xa1\x7fi\xdc\x22\x95\x99xk$\x0a\xb8\x82\x02s\ -\x12K\x13\x10\xd14\x22%\x04\x8a\x82\x14\xffI\xf4\x10\ -'&\xbd\x09\x81$,+\x88(?\x80\xe5\x14V\x9d\ -\xd0\xb4x \x91\xe2|\x05\x8c\xd7\xa2qLAB\xcc\ -\x1b]F4C\xa0\x90\xf5\x08KT#,J\xd8g\ -\x84Vd.\xa1QS\x1f\xa6\x84\x16\xa9\xf0d\xfd\x9e\ -|2,(\x00L\x10P\xcf\x0eJ\xb0zA\x22\x1d\ -\xbf\xb9R\xdc\x80\x05\xc9\x05\x08\xc4T^/x\x90\xe5\ -\x1a@\x00}\xe4D\xd0\x89\xb8|\xcab\x0cN-\xa8\ -\x00`A\x92$\xa2@b\x8cO\xb1\x5c\x89\x99\x01\xa0\ -\x0b\x12\xd8\xfc\x1adTQ \x90\xbf\x13K\xc4d\x8c\ -\xc4F4F\xa8\xd9\x1bL\x84pKq\xcc\x8aGS\ -\xe9\x1d\xe3\x0cy=1\x94\x82A\xa8\xf8\x9e#J|\ -\x8f\xe4J7H(\xe5\x1d#\xb4x.\xb1\xeaF\xc6\ -y!\x1f\xa4\x99\x10\x92\xb1\xc6B\x119\x0c\x0c\xe4C\ -\x08\x8cE\xb2N\x00\x09\x1cD#\xec\x92\x94$>Q\ -\xc891!\xe4\xd1t\x95\xb2\xbc\x87\xcb\x10a\x1a\xc9\ -\xdcn\x04*\xe4 \x12\x00(hG8\x07\x99B\xf0\ -\xe2\x8e\x82{-d\xbc\x85\x932&M\x90\x06k5\ -\x80\x00\x82\x8f\xe0\xb0\x88L*\x0a\x04\x86\x83\x06\x11\x07\ -\xac.'\x14\x8a\xc5\xa1,\xc8\xc8*\x10\x88\x84\x1b!\ -\x00\x18\xbb\xec\x03$A\x0c\xa4\xe8\x89 \x05\xf9\x17\x96\ -\xcb\xa2\x8d\x09\x88\xb1\xf94i\xcb\xe1J!\x9c\xe8\xbf\ -7\x9e\xcf\xa7\xf4\x08\xbb\xfe\x87A\xa2\xd1\xa8\xf18\x14\ -\x0e\x11\x07\x9b\xc3@\x90\xf8\x8d\x22z\xda\xaa\x81\xdeU\ -\x86D aS\x82\xad\x86\x96\x02]v\x7f1hL\ -\xe6\xb4\x09\xcc\xee\xc7l\xb6\xcbho\xfbu\xca\xe7J\ -\x82A\xa7\xb4\xfa\x88\xc2%s\x89\xc6Y\x88xA\xe2\ -\xe7*4N\x86i\x9b\xecN\xcbg~M\xa7\xf6\xa1\ -\x9c\xf3\x15\x94\xae\xdc2\xb9\x8a\x0d\xd6\x99x\x87D/\ -y[\xf8>\x10\xeb\x84\x01r\x8e\x9c8jT\xfe\xca\ -\xe3&\x98\xebN\x1f'\x99\xda\xcf\xb2\xfbm\xcc_7\ -w\xa7g\xaaYFw\x08\x8a\xfe\xe2\xae\xb6\xd4\xf1>\ -}\xb5\xae\x99l1\xf3\xec\x8e\xd3u\xd4\x8an:\xbd\ -\x88.\xf0\x01M\x97\xdes\xf7\xccU\xfc\xa3\x08Wu\ -\x06v\x01\xa3;\x9bf\xe7\xec\xad}\x9f\x8c\x17\xaf\xf2\ -\xddv\xfb\xb2\xee\xff\x03\x14\xcf\xfe\x8c\x0f\xd8\x00\xcfm\ -\x80\x88\x10\x13\x0b s\xb9\xecc]\x04\xf5\xd2}_\ -\x17\xd2\x0fm_vuPx\x19U\xc0\x02R\x9c\xc4\ -\x14#e\x0b\xf7\xa4Bm\x9a\xf5\xa1\x90l\xe1'b\ -\x11\x8a\x19XQ\xbe\x85\x9f\xb6a\x7f\x15\x90\x82\xa5r\ -?\x008\xe0@\x0cc\xb3\x16#s\xa2WF'\x8a\ -\xdb\xa8\xaaC_b\xd7y\xbfh\x1dE\xfczB\x08\ -D\x81@>\x90\x81\x99\xe9(]X\x91\xb1\x89\x9f\x09\ -\x19\xb5\x91e\xd5\xbaH~d\xa7\x85\xd8R\x88e\xc0\ -yP\x06W\xa4\x9c|\xa5\x9817\x83\xa6\x06f_\ -\x9d\x169\x89-~\xa4\xb7eJ\x1d\x97\x02%@\x15\ -\x9e\x92\xaeo\x8f\xe5\xa9\x06\x5c\x9d\xd8\xa9\xda\x8bR'\ -\x94^{\x99]Y\xfa\x80\xa0\xa8J\x19\xed\x90 \xd9\ -\x0a\x8e_h\xdayE\xa4\x11jI\xf2\xa5T:\x05\ -?\xa0\xd6\x0a\x15\xf1\x9c\x1e\xf6J\xa1\xa7\xd4J\xc9l\ -\xa8\xd1Z\x95\xf1R\x85\xc5\xc0\xa3Oc\x80\x0c<\x8e\ -\xc3\x18\xf6\xae\xa1\xe7\x14\xbes\xadV\xda\x82\xcbOk\ -tR\xb9vMKP\x12>-sY\x08\x05\xd1s\ -V\x04\x02\x03(\x1c,\x94\xecjj\x88\xa7(\xab9\ -S\xb3n\x94\xba\xd0D\xed'\xd5\x7f\x0a\x11\xc4 )\ -J\x8c\xb0\x0a\xf9\x1d\xec3\x96(\xab\xe5\xba\xc6\xece\ -\xabL\x0a\xa2@\x97gr\x15^\xa9<\x16\xfe\xb1\xeb\ -\x07O\x0dPn\xbcII\xc1\xd9\xc8\xbb\x0b\xc5d;\ -\xfe\x89\xc0q\xb5\x03\x14\xc8\x10\x8b\xb9\x0b\xbc2;\x92\ -\x0b\xc42\x84\xff\x22\xca2T+'\xcb%\x8c?\x00\ -\xc4s5\x0b\x04\xce\x11\x5c\xc1\x09\xcc\xb3\xb8\xfa\xe5\xb2\ -\x12\xeb+@E\xb2\xec\x8dJ/\x90\x81\x05=J\x85\ -E\xc0\xf8\xd1\x9f\x10\x81\x08%4\xe4\x90\xa0I\xc3!\ -\x87S\xceW\x1dy\x0bR\xaa\xd0\x00T\xd8vt$\ -\x8da\xc7M\xa1\x13\xd22\x05(oB\x09\x0d\xb7h\ -\x14Xr\xc3uB\xb6\xfcl\xd8\xdf\x80\xd3\xd7\x81t\ -\x01\xfd\xeb,2\xd8p\xe9\x08K8W\xcf:\xda\x12\ -\xa0\x01\x7f\x88\x90R\xe1\xa6\xe3.\xc3\xd1*\x0d\x98s\ -_|\xca9\xecK\x90BVP\xc5\xb0\x95\xd0P\xb7\ -\x97\xa2\xcc \x1b\xad\x18B\xee\xc0\xdeBz\x0c\x83\xb4\ -\xea\xbb~\xe2\xe9\xed\xbb\x9e\xf3\xbd\x9d;\xbe\xfb\xc1\xf0\ -\x9f/\x03\xc3\xf1\xbcy\xd7\x8e\xf2<\xbf1\xf5\xf1|\ -\xdfC\xd1\xc8|\xafK\xd5\xf5\x96\xef?\xd7\xf6\xbd\xbf\ -g\xdb\xf7\xbd/w\xdf\xf8\xbc\xbf\x87\xe3\xf9\xbc/\x97\ -\xe7\xfa\xbb\x9f\xa7\xeb\xfb\xb8\xcf\xb7\xef\xfc\xb6\x8f\xc7\xf3\ -\xfd\xb4o\xd7\xf7\xfe\xb2\xc4\x04\x13\x00\xfe\x00\x04\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00`\ -\x00\x00\x00\x01\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x02\ -\x01\x03\x00\x04\x00\x00\x00T\x09\x00\x00\x03\x01\x03\x00\x01\ -\x00\x00\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\ -\x01\x03\x00\x01\x00\x00\x00\x04\x00\x00\x00\x16\x01\x04\x00\x01\ -\x00\x00\x00`\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00b\ -\x08\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\x5c\x09\x00\x00\x1b\ -\x01\x05\x00\x01\x00\x00\x00d\x09\x00\x00\x1c\x01\x03\x00\x01\ -\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\ -\x00\x00\x001\x01\x02\x00\x10\x00\x00\x00l\x09\x00\x00=\ -\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00R\x01\x03\x00\x01\ -\x00\x00\x00\x02\x00\x00\x00S\x01\x03\x00\x04\x00\x00\x00|\ -\x09\x00\x00s\x87\x07\x00H\x0c\x00\x00\x84\x09\x00\x00\x00\ -\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x802\x02\x00\xe8\ -\x03\x00\x00\x802\x02\x00\xe8\x03\x00\x00paint\ -.net 4.0.9\x00\x01\x00\x01\x00\x01\ -\x00\x01\x00\x00\x00\x0cHLino\x02\x10\x00\x00m\ -ntrRGB XYZ \x07\xce\x00\x02\x00\ -\x09\x00\x06\x001\x00\x00acspMSFT\x00\ -\x00\x00\x00IEC sRGB\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\ -\x00\xd3-HP \x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x11cprt\x00\x00\x01P\x00\ -\x00\x003desc\x00\x00\x01\x84\x00\x00\x00lw\ -tpt\x00\x00\x01\xf0\x00\x00\x00\x14bkpt\x00\ -\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\x18\x00\ -\x00\x00\x14gXYZ\x00\x00\x02,\x00\x00\x00\x14b\ -XYZ\x00\x00\x02@\x00\x00\x00\x14dmnd\x00\ -\x00\x02T\x00\x00\x00pdmdd\x00\x00\x02\xc4\x00\ -\x00\x00\x88vued\x00\x00\x03L\x00\x00\x00\x86v\ -iew\x00\x00\x03\xd4\x00\x00\x00$lumi\x00\ -\x00\x03\xf8\x00\x00\x00\x14meas\x00\x00\x04\x0c\x00\ -\x00\x00$tech\x00\x00\x040\x00\x00\x00\x0cr\ -TRC\x00\x00\x04<\x00\x00\x08\x0cgTRC\x00\ -\x00\x04<\x00\x00\x08\x0cbTRC\x00\x00\x04<\x00\ -\x00\x08\x0ctext\x00\x00\x00\x00Copyr\ -ight (c) 1998 He\ -wlett-Packard Co\ -mpany\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00\x12sRGB IEC61966\ --2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\ -sRGB IEC61966-2.\ -1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\ -\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ -\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\x90X\ -YZ \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\x85\x00\ -\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\x00$\xa0\x00\ -\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\x00\x00\ -\x00\x00\x16IEC http://ww\ -w.iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x16IEC http://w\ -ww.iec.ch\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00.IEC 61966-2.1\ - Default RGB col\ -our space - sRGB\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.IEC \ -61966-2.1 Defaul\ -t RGB colour spa\ -ce - sRGB\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00,Refer\ -ence Viewing Con\ -dition in IEC619\ -66-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00,Reference View\ -ing Condition in\ - IEC61966-2.1\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00view\x00\x00\x00\x00\x00\ -\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\xcc\x00\ -\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ \x00\ -\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\xe7m\ -eas\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8f\x00\ -\x00\x00\x02sig \x00\x00\x00\x00CRT c\ -urv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\ -\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00-\x00\ -2\x007\x00;\x00@\x00E\x00J\x00O\x00T\x00\ -Y\x00^\x00c\x00h\x00m\x00r\x00w\x00|\x00\ -\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa4\x00\ -\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\ -\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\ -\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01%\x01\ -+\x012\x018\x01>\x01E\x01L\x01R\x01Y\x01\ -`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\ -\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\ -\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\ -\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02]\x02\ -g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\ -\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\ -\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03\ -f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\ -\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04\ --\x04;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\ -\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\ -\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\ -\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\ -\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\ -\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\ -\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\ -\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08\ -F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\ -\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\ -\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a\ -=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\ -\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\ -\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0c\ -u\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d\ -@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\ -\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\ -\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\ -\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\ -\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\ -\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\ -\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\x83\x13\ -\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\ -\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\ -\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\ -\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\ -\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19\ - \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1a\ -Q\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\ -\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\ -\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\ -\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1f\ -i\x1f\x94\x1f\xbf\x1f\xea \x15 A l \x98 \ -\xc4 \xf0!\x1c!H!u!\xa1!\xce!\xfb\x22\ -'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#8#f#\ -\x94#\xc2#\xf0$\x1f$M$|$\xab$\xda%\ -\x09%8%h%\x97%\xc7%\xf7&'&W&\ -\x87&\xb7&\xe8'\x18'I'z'\xab'\xdc(\ -\x0d(?(q(\xa2(\xd4)\x06)8)k)\ -\x9d)\xd0*\x02*5*h*\x9b*\xcf+\x02+\ -6+i+\x9d+\xd1,\x05,9,n,\xa2,\ -\xd7-\x0c-A-v-\xab-\xe1.\x16.L.\ -\x82.\xb7.\xee/$/Z/\x91/\xc7/\xfe0\ -50l0\xa40\xdb1\x121J1\x821\xba1\ -\xf22*2c2\x9b2\xd43\x0d3F3\x7f3\ -\xb83\xf14+4e4\x9e4\xd85\x135M5\ -\x875\xc25\xfd676r6\xae6\xe97$7\ -`7\x9c7\xd78\x148P8\x8c8\xc89\x059\ -B9\x7f9\xbc9\xf9:6:t:\xb2:\xef;\ --;k;\xaa;\xe8<' >`>\xa0>\xe0?\ -!?a?\xa2?\xe2@#@d@\xa6@\xe7A\ -)AjA\xacA\xeeB0BrB\xb5B\xf7C\ -:C}C\xc0D\x03DGD\x8aD\xceE\x12E\ -UE\x9aE\xdeF\x22FgF\xabF\xf0G5G\ -{G\xc0H\x05HKH\x91H\xd7I\x1dIcI\ -\xa9I\xf0J7J}J\xc4K\x0cKSK\x9aK\ -\xe2L*LrL\xbaM\x02MJM\x93M\xdcN\ -%NnN\xb7O\x00OIO\x93O\xddP'P\ -qP\xbbQ\x06QPQ\x9bQ\xe6R1R|R\ -\xc7S\x13S_S\xaaS\xf6TBT\x8fT\xdbU\ -(UuU\xc2V\x0fV\x5cV\xa9V\xf7WDW\ -\x92W\xe0X/X}X\xcbY\x1aYiY\xb8Z\ -\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\x5c5\x5c\ -\x86\x5c\xd6]']x]\xc9^\x1a^l^\xbd_\ -\x0f_a_\xb3`\x05`W`\xaa`\xfcaOa\ -\xa2a\xf5bIb\x9cb\xf0cCc\x97c\xebd\ -@d\x94d\xe9e=e\x92e\xe7f=f\x92f\ -\xe8g=g\x93g\xe9h?h\x96h\xeciCi\ -\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\xffl\ -Wl\xafm\x08m`m\xb9n\x12nkn\xc4o\ -\x1eoxo\xd1p+p\x86p\xe0q:q\x95q\ -\xf0rKr\xa6s\x01s]s\xb8t\x14tpt\ -\xccu(u\x85u\xe1v>v\x9bv\xf8wVw\ -\xb3x\x11xnx\xccy*y\x89y\xe7zFz\ -\xa5{\x04{c{\xc2|!|\x81|\xe1}A}\ -\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\ -\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\ -\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\ -\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\ -\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d\ -1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90\ -n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\ -\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\ -\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\xfc\x9a\ -h\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\ -\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1\ -G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\ -\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8\ -R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\ -\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\ -\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb3\ -8\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\ -\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\ -\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\ -\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2\ -_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6\ -F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca\ -8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce\ -6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2\ -?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6\ -U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xda\ -v\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\ -\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\ -\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\ -\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xeb\ -p\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\ -\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf4\ -4\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\ -\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd\ -)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\ -\x00\x00\x03\xae\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Default - Upd\ -ated\x0d\x0a \ - Created \ -with Sketch.\x0d\x0a <\ -/defs>\x0d\x0a \ -\x0d\x0a \x0d\x0a <\ -/g>\x0d\x0a\x0d\x0a\ -\x00\x00\x04\x8d\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / error / Not \ -active \x0d\ -\x0a Creat\ -ed with Sketch.<\ -/desc>\x0d\x0a \x0d\x0a \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x04s\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Editor only \ -- Updated\x0d\x0a Cre\ -ated with Sketch\ -.\x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\ - \x0d\x0a\ -\x0d\x0a\ -\x00\x00\x15\x0a\ -I\ -I*\x00\xa8\x07\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ -\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ --\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ -$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ -S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ -O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ -\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ -B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ -\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ -o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ -\xc4Sp\xd6`\x0e6\xb5 \x05\xc1E0P\xcc\x14\ -5\x05\x09A]pW6r\x0a\xd6\xc6\x80_U\x9c\ -^\x02\xb1s\xd0\xd2\xa4\x01H)B\x0aO\x82\x91 \ -\xa0\x88\xeb\xce\x0a\xb7\x82\xac`\xab-\x0b\xd2\x8f\xa5\xb4\ -p,:\x99\xec\x80\x19\x059\xc1N\x90^<\xed\xd9\ -\x05A\xc1S\x1a\x1d\x1c\xf3\x85f\xeb\xd7x\x93i\x01\ -b\x0a\x90\x82\x85\xeaM\xe8)\x9bB\xbd\x9c\xf6l^\ -\xaa\xdfnW \x01AP\xb0S\xc5\x89\xf9\x058\xe8\ -R\x93?e\x83\xfa\xac\xbd\xcb\x82\x04\x03 \xa5Z\x0a\ -'.\x84\xb3B5\xaa\xe9\x0a\xfa\xff\xaa\xd0\x0aJ\x90\ -\x13\x88(\xc6\x94\x1c\xa8)\x9c\x82\x9dH)\xe2\xcc<\ -((j\x82\xb5\x898\xf8\xd0\xbeiD \xc2\xb4\xeb\ -\x94$\x8e\xa4\x03{\xbe\x8e\x9d\xc8)*\x82\x94\xcd\x09\ -\xb0\x8b$\x00\x0a\x0a\x18 \xa3\x04,\x82\xb2(\xc4\x1c\ -\x00\x0aM\x09a\x09\xc5\xab\xacV\xaaE\xf22\x04\x16\ -\xa0\xa6z\x0a\x01\xa2\xb29\x1c\x82\x8f\xed\x09\xeb\x06\x82\ -q\x9a\x08.#-\xb2\x08\x1240\xeca&\xae\x92\ -z\xa7(\xa2\xe9\x01j\x82\x89H\xac\xbe\x82\x0a-\x09\ -v\xa1\xa4\x02\xf2\x0aOJ\xe8\xa9*\xd0\x8d\x88\xf4\xdc\ -\xabP\xea|\xe0\xbb B\x02\x0a_\xa2\xa7\xc4\xe8\xd0\ -\xd2\x0ab@-\xa0\xa5\x12\x0a\xf8\xa2\x07\xda\x0a\x154\ -&\xe25D\xaa\x95\x22\x9bE\xa2)\x01h\x82\x89h\ -\xa8\xe8\xd0\x91\xad\x22\x04\xfd\xa0\x90b(J4#m\ -G6.u2\x99T!\x8e2\x0a\xe7\xa0\x80:\x22\ -i\xa0\xa1\x8bB~\xd6G\xf8\x1a\x82\xd4H ,\x88\ -\x9cm\x08=]\xc8\xeb\xddx\xb6X\x08Z@)\xa0\ -\xa5b*74$\x9a\xc6\x90Kh \xe2\x8a\x86m\ -\x0c7,\xdbk}|\xa5\xdb\xa8R@L\xbc\xa8\xa8\ -4\xd0\x9c\xf7:\x04\x1d \xa6**<4$Ly\ -x\xad\xd7\x9a\x95z\xa1)\x01l\x82\x89(\x89\xea\xd0\ -\xb9\xab:@\x0a\xc3\x88\xac\x14\xc6\xd6\xc9n\x10\xb6\xe1\ -J>\x18\x84$\x06\x82\x0a\x17\xa2&\xdbB\x13^H\ -\x15<\x82\x00\x88\x89`\xd0\x8a8=\xb2\xbcd*6\ -F\x83\xa4\x13P\x01\x8c\x22\x06\xc3B\xc9\xe1(\x15%\ -b\xa2&KB\x1cf\xcb\xf6r\xa2\xe7h2@\xdf\ - \x92*\x1f\xa11\xba&A\xa3 \xb62 j4\ -2\xa5\xe1\x9b\xc9\xd8\xfb\x18\xc7f\xda\xa0\x01\xab!\xda\ -\xc0\x03\xad-\x89\x06\x8e\x00k\xc8~\xc0\xc6\xecX\xf6\ -\xc96\xec\xcb\x1e\xa2\xa8\x1f\xfbV\xd8\x86\xed\xdb\x83L\ -\x7f\xee{\xaa\x1d\xbb\x80;\xca'\xa7\xb5[\xea\xc5\xbf\ -\xa0\x9a\x9c\x88\x88\xf0\xb9o\x11\xae\xa2\x9aJ\x80\xf0fD\x18aE\ -\x81\xad\xa4d\xbal\xdaU,\x81\xcb\xa6\xd3\x18\x1c\xce\ -\xa5\x5c\xae\xceb\xb5\xeb\x0d\x8a\x0d@\x00Af\xd40\ -\x0c:\xc7\x09\x95!\xe0\xc7\x8b`\x00\xd1#L\xdc\xa1\ -\x15Il\xde\xb2\x00\xad\xdd\xef\xf3\xb9\xd6\x03\x076\xb2\ -\xd9\xe6\xb6\x9b]\xb2T\x0f\x83:\xe0\xc0[\x93\xa6\x0c\ -\x1a\x91\xbf\xae\xf7\x9a\xb5\xeee\x84\xce\xcb\xf0Y\xed\x0c\ -G\x0dB\x91\xe2\xacr\xa2,\x19u\xa1\x13\xc8\xdbY\ -\x88\xadT\x01W\x9a\xdf/\xda-\xccR\xc1\xba\xde\xc0\ -\xf4\x96\x8d6\xc5\xfeQ\x83+\xb4#9\x1b;\x87\xb3\ -\xda\xcd6\xfb\xed\xf6\x83\xa3\xa2\xe0b8W)U2\ -\x06\xcf\xd0\x84\xe4n\xeee\xea\xb1\x9c\xeanz~l\ -\xefZi\x89\xe1\x80\xa0\xdb\x08\x18\x8e\xe4\xbf\x91\x90\xb0\ -\x99\x9d\xa6n\xb5\xe9\xd1z\x1f\xd6\x01\xebK\xde\xd6\x0d\ -*\x15\x90b\xa5aIP1\x01#1_\x86\xc9\xe3\ -m\x9eX\x02\x10?\xe1W\xa9\x06a\xde\xc7a\x9eJ\ -\x87\xa4\x18\x84G\x13s\xe9\x06\x19\x922\x85\xfe\x84Y\ -\xa7\x91\xfc\x86 V\xf2/_\xe0$\xa2\x04n\x92\xa2\ -\x19\x06\x1eSq\x95#'\x1d(\xad\xfa\x8bW\xd8\xc9\ -\x80\x7f\xe4U\x864I\xe3g\x9d\x15\x1d\x90b%7\ -\x15\x922\xae@J\xe1'>\x14\x92\x1a\x88\xc6[X\ -\xa4\xa4\x9aL\x8a\x8f\xf9=\x03\x94SiM\x0c\x95[\ -\xd7\xe5\xceK\xdd\x09z\x5c\x85\xe7\x19~\x1aiTI\ -\xb2N\x94%)RVs_\xb9\x12tXdz\x09\ ->\x98\x119\x89\xa1J\x85\xc4\x18\xa3M\xc3\xc8:~\ -\x96&\xf9j\x85ShJY;\xa1\xd1*&\x1eE\ -A$\x18\xd6A\x81tL\xd5A\x83$\x8e%\x9ee\ -x\xb2\x13\x8b\xa9\x9a^]\xac\x13\xdam\x11\xa7d\xd3\ -\xfc(F\x10`\xa5\x062\xd0a\xdd#9^\x99\xb6\ -\x80n+4\xf2\x98\xb2\x13J\xd5\x10\xad\xec\xbaJ\xad\ -\x96j\xfbA8\xb2\xadT\x9a\xcdC\xec\xfbbc\x9f\ -\xe4;\x1e\xddg\xeb+\x89(\xb6\x90\x9br\xe5\x85\xad\ -\xfa\xba\x81\xba\xae9\xce\xef\xb9\xa7g\x06x\xbc\xab\x8b\ -\xb2\xd3\xbb\xafu~\xf1\xbf\x13\xfb\xd1\xd7\xbd\xaf\xf6v\ -\xc5\xb80K\xf7\x08D\x8b\xe4\x18AM\xc5D\x18\xf8\ -\xc2\x9a \x81\x06%\x13r\x81\x06\x18q4\xa6\xe4\xc7\ -\x00\x09\xac\x00\xc41\xfcL\x8dA\x87L\x91x\xc7\xb1\ -\xc1\xbd\x06$2\x9c)\xc5@\xcb\x0c\xc1\x06\xb5\xf0@\ -6\x12\x07\xf3[\x8a\xbf@\xc3\xa4\x1a\x0b\xcds{\xc9\ -#\x00\x12\xa7\xdd\x03.\x19\x0c\xf2\x99=\x10`\xd9#\ -5\xf4K\xffT\xba\xb4f\xec\xff\x0cPh\xa5\x03\x0b\ -t\xd9\x14\xc2\xc6\x923{Y\xd85m\x83i\xda\xac\ -\xbd\xa3k\xdb\xb6\xf9{m\xdc7=\xd2\xc4\xca\xf7]\ -\xe3y\xdd\xaf\xed\xeb}\xdf\xaa\xbd\xff\x81\xe0\xa9\xed\xf3\ -\x83\xe1\xb8usr\xe28\xbe1m\xdd\xf8\xdeC\x91\ -\xe3\xb8^K\x95\xe5\xb8\xae[\x99\xde\xb9\x8ek\x9d\xdc\ -\xf9\xce{\xa1\xda\xba\x0e\x8b\xa5\xd0\xf8\xfe\x9b\xa9\xdb\xfa\ -N\xab\xad\xc1\x10\x10\x00\x13\x00\xfe\x00\x04\x00\x01\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x01\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ -\x00\x04\x00\x00\x00\x92\x08\x00\x00\x03\x01\x03\x00\x01\x00\x00\ -\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\ -\x00\x01\x00\x00\x00\x04\x00\x00\x00\x16\x01\x04\x00\x01\x00\x00\ -\x00`\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x9f\x07\x00\ -\x00\x1a\x01\x05\x00\x01\x00\x00\x00\x9a\x08\x00\x00\x1b\x01\x05\ -\x00\x01\x00\x00\x00\xa2\x08\x00\x00\x1c\x01\x03\x00\x01\x00\x00\ -\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x001\x01\x02\x00\x10\x00\x00\x00\xaa\x08\x00\x00=\x01\x03\ -\x00\x01\x00\x00\x00\x02\x00\x00\x00R\x01\x03\x00\x01\x00\x00\ -\x00\x02\x00\x00\x00S\x01\x03\x00\x04\x00\x00\x00\xba\x08\x00\ -\x00s\x87\x07\x00H\x0c\x00\x00\xc2\x08\x00\x00\x00\x00\x00\ -\x00\x08\x00\x08\x00\x08\x00\x08\x00\x802\x02\x00\xe8\x03\x00\ -\x00\x802\x02\x00\xe8\x03\x00\x00paint.n\ -et 4.0.9\x00\x01\x00\x01\x00\x01\x00\x01\ -\x00\x00\x00\x0cHLino\x02\x10\x00\x00mnt\ -rRGB XYZ \x07\xce\x00\x02\x00\x09\x00\ -\x06\x001\x00\x00acspMSFT\x00\x00\x00\ -\x00IEC sRGB\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3\ --HP \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x11cprt\x00\x00\x01P\x00\x00\x00\ -3desc\x00\x00\x01\x84\x00\x00\x00lwtp\ -t\x00\x00\x01\xf0\x00\x00\x00\x14bkpt\x00\x00\x02\ -\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\x18\x00\x00\x00\ -\x14gXYZ\x00\x00\x02,\x00\x00\x00\x14bXY\ -Z\x00\x00\x02@\x00\x00\x00\x14dmnd\x00\x00\x02\ -T\x00\x00\x00pdmdd\x00\x00\x02\xc4\x00\x00\x00\ -\x88vued\x00\x00\x03L\x00\x00\x00\x86vie\ -w\x00\x00\x03\xd4\x00\x00\x00$lumi\x00\x00\x03\ -\xf8\x00\x00\x00\x14meas\x00\x00\x04\x0c\x00\x00\x00\ -$tech\x00\x00\x040\x00\x00\x00\x0crTR\ -C\x00\x00\x04<\x00\x00\x08\x0cgTRC\x00\x00\x04\ -<\x00\x00\x08\x0cbTRC\x00\x00\x04<\x00\x00\x08\ -\x0ctext\x00\x00\x00\x00Copyrig\ -ht (c) 1998 Hewl\ -ett-Packard Comp\ -any\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\ -\x12sRGB IEC61966-2\ -.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12sR\ -GB IEC61966-2.1\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\ -\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\x00\x00\ -\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\x90XYZ\ - \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\ -\xdaXYZ \x00\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\ -\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\x00\x00\x00\x00\ -\x16IEC http://www.\ -iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x16IEC http://www\ -.iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\ -.IEC 61966-2.1 D\ -efault RGB colou\ -r space - sRGB\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00.IEC 61\ -966-2.1 Default \ -RGB colour space\ - - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00des\ -c\x00\x00\x00\x00\x00\x00\x00,Referen\ -ce Viewing Condi\ -tion in IEC61966\ --2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\ -Reference Viewin\ -g Condition in I\ -EC61966-2.1\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00view\x00\x00\x00\x00\x00\x13\xa4\ -\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\ -\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ \x00\x00\x00\ -\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\xe7mea\ -s\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\ -\x02sig \x00\x00\x00\x00CRT cur\ -v\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\ -\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00-\x002\x00\ -7\x00;\x00@\x00E\x00J\x00O\x00T\x00Y\x00\ -^\x00c\x00h\x00m\x00r\x00w\x00|\x00\x81\x00\ -\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\ -\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\ -\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\ -\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01%\x01+\x01\ -2\x018\x01>\x01E\x01L\x01R\x01Y\x01`\x01\ -g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\ -\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\ -\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02\ -&\x02/\x028\x02A\x02K\x02T\x02]\x02g\x02\ -q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\ -\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\ -\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03f\x03\ -r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\ -\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04-\x04\ -;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\x9a\x04\ -\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\ -\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\x86\x05\ -\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\ -\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\x8c\x06\ -\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07\ -+\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\xac\x07\ -\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08F\x08\ -Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\ -\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\x8f\x09\ -\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0a\ -T\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\ -\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\ -\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\ -\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0d\ -Z\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e\ -.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\ -\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\ -\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\xb9\x10\ -\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\xaa\x11\ -\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\xa3\x12\ -\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\x83\x13\xa4\x13\ -\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\xad\x14\ -\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\xbd\x15\ -\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\ -\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\ -\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19\ -E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1a\ -w\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\ -\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\ -\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e\ -@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\ -\x94\x1f\xbf\x1f\xea \x15 A l \x98 \xc4 \ -\xf0!\x1c!H!u!\xa1!\xce!\xfb\x22'\x22\ -U\x22\x82\x22\xaf\x22\xdd#\x0a#8#f#\x94#\ -\xc2#\xf0$\x1f$M$|$\xab$\xda%\x09%\ -8%h%\x97%\xc7%\xf7&'&W&\x87&\ -\xb7&\xe8'\x18'I'z'\xab'\xdc(\x0d(\ -?(q(\xa2(\xd4)\x06)8)k)\x9d)\ -\xd0*\x02*5*h*\x9b*\xcf+\x02+6+\ -i+\x9d+\xd1,\x05,9,n,\xa2,\xd7-\ -\x0c-A-v-\xab-\xe1.\x16.L.\x82.\ -\xb7.\xee/$/Z/\x91/\xc7/\xfe050\ -l0\xa40\xdb1\x121J1\x821\xba1\xf22\ -*2c2\x9b2\xd43\x0d3F3\x7f3\xb83\ -\xf14+4e4\x9e4\xd85\x135M5\x875\ -\xc25\xfd676r6\xae6\xe97$7`7\ -\x9c7\xd78\x148P8\x8c8\xc89\x059B9\ -\x7f9\xbc9\xf9:6:t:\xb2:\xef;-;\ -k;\xaa;\xe8<' >`>\xa0>\xe0?!?\ -a?\xa2?\xe2@#@d@\xa6@\xe7A)A\ -jA\xacA\xeeB0BrB\xb5B\xf7C:C\ -}C\xc0D\x03DGD\x8aD\xceE\x12EUE\ -\x9aE\xdeF\x22FgF\xabF\xf0G5G{G\ -\xc0H\x05HKH\x91H\xd7I\x1dIcI\xa9I\ -\xf0J7J}J\xc4K\x0cKSK\x9aK\xe2L\ -*LrL\xbaM\x02MJM\x93M\xdcN%N\ -nN\xb7O\x00OIO\x93O\xddP'PqP\ -\xbbQ\x06QPQ\x9bQ\xe6R1R|R\xc7S\ -\x13S_S\xaaS\xf6TBT\x8fT\xdbU(U\ -uU\xc2V\x0fV\x5cV\xa9V\xf7WDW\x92W\ -\xe0X/X}X\xcbY\x1aYiY\xb8Z\x07Z\ -VZ\xa6Z\xf5[E[\x95[\xe5\x5c5\x5c\x86\x5c\ -\xd6]']x]\xc9^\x1a^l^\xbd_\x0f_\ -a_\xb3`\x05`W`\xaa`\xfcaOa\xa2a\ -\xf5bIb\x9cb\xf0cCc\x97c\xebd@d\ -\x94d\xe9e=e\x92e\xe7f=f\x92f\xe8g\ -=g\x93g\xe9h?h\x96h\xeciCi\x9ai\ -\xf1jHj\x9fj\xf7kOk\xa7k\xfflWl\ -\xafm\x08m`m\xb9n\x12nkn\xc4o\x1eo\ -xo\xd1p+p\x86p\xe0q:q\x95q\xf0r\ -Kr\xa6s\x01s]s\xb8t\x14tpt\xccu\ -(u\x85u\xe1v>v\x9bv\xf8wVw\xb3x\ -\x11xnx\xccy*y\x89y\xe7zFz\xa5{\ -\x04{c{\xc2|!|\x81|\xe1}A}\xa1~\ -\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\ -\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\xba\x84\ -\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\xd7\x87\ -;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\xfe\x8a\ -d\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\ -\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\ -\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\xb6\x94\ - \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\x0a\x97\ -u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\ -\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e\ -@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\ -\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa5\ -8\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\ -\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\ -\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\ -\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\ -\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7\ -h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb\ -.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\ -\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\ -\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\ -\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\ -\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\ -\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\ -\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\ -\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\ -\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf\ -)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3\ -c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\ -\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xebp\xeb\ -\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0\ -X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\ -\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf9\ -8\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\ -\xba\xfeK\xfe\xdc\xffm\xff\xff\ -\x00\x00\x04o\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Editor only \ -- Saved\x0d\ -\x0a Creat\ -ed with Sketch.<\ -/desc>\x0d\x0a \x0d\x0a <\ -g id=\x22icon-/-out\ -liner-/-entity-/\ ---Editor-only---\ -Saved\x22 stroke=\x22n\ -one\x22 stroke-widt\ -h=\x221\x22 fill=\x22none\ -\x22 fill-rule=\x22eve\ -nodd\x22>\x0d\x0a \ -\x0d\x0a \ -\x0d\x0a\x0d\x0a\ -\x00\x00\x07\x1d\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22 standalone=\x22\ -no\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - lock on\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \x0d\x0a \ -\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x05\x1d\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / slice \ -/ standard copy<\ -/title>\x0d\x0a Created with \ -Sketch.\x0d\x0a\ - \x0d\x0a \x0d\x0a \ -\x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x04\xa0\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Not active - \ -Updated\x0d\ -\x0a Creat\ -ed with Sketch.<\ -/desc>\x0d\x0a \x0d\x0a <\ -g id=\x22icon-/-out\ -liner-/-entity-/\ --Not-active---Up\ -dated\x22 stroke=\x22n\ -one\x22 stroke-widt\ -h=\x221\x22 fill=\x22none\ -\x22 fill-rule=\x22eve\ -nodd\x22>\x0d\x0a \ -\x0d\x0a \ - \x0d\x0a\x0d\x0a\ -\x00\x00\x04\x9c\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Not active - \ -Saved\x0d\x0a \ - Created\ - with Sketch.\x0d\x0a \ -\x0d\x0a \x0d\x0a \ -\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x06\xdc\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Group 13\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\ - \ -\x0d\x0a \ - \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x03\x87\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Loop v2\x0d\x0a Cr\ -eated with Sketc\ -h.\x0d\x0a <\ -g id=\x22icon-/-out\ -liner-/-entity-/\ --Loop-v2\x22 stroke\ -=\x22none\x22 stroke-w\ -idth=\x221\x22 fill=\x22n\ -one\x22 fill-rule=\x22\ -evenodd\x22>\x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00_l\ -I\ -I*\x00\x08\x00\x00\x00\x17\x00\xfe\x00\x04\x00\x01\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ -\x00\x04\x00\x00\x00\x22\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ -\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00\x11\x01\x04\x00\x01\x00\x00\x00DS\x00\x00\x12\x01\x03\ -\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ -\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x17\x01\x04\x00\x01\x00\x00\x00\xfa\x0b\x00\x00\x1a\x01\x05\ -\x00\x01\x00\x00\x00*\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ -\x002\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ -\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ -\x00$\x00\x00\x00:\x01\x00\x002\x01\x02\x00\x14\x00\x00\ -\x00^\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ -\x00\xfa8\x00\x00r\x01\x00\x00I\x86\x01\x00\x90\x0c\x00\ -\x00l:\x00\x00i\x87\x04\x00\x01\x00\x00\x00@_\x00\ -\x00s\x87\x07\x00H\x0c\x00\x00\xfcF\x00\x00\x00\x00\x00\ -\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\ -\x00\x00\xf9\x15\x00\x10'\x00\x00Adobe P\ -hotoshop CC 2015\ -.5 (Windows)\x00201\ -7:03:08 11:37:45\ -\x00\x0a\x0a \x0a \ -\x0a pain\ -t.net 4.0.9\x0a \ - 2017-03-0\ -7T11:32:29-08:00\ -\x0a 2017-\ -03-08T11:37:45-0\ -8:00\x0a <\ -xmp:MetadataDate\ ->2017-03-08T11:3\ -7:45-08:00\x0a \ - image/tiff\x0a \ - 3\x0a \ - sR\ -GB IEC61966-2.1<\ -/photoshop:ICCPr\ -ofile>\x0a \ -\x0a \ - \x0a \ - adobe\ -:docid:photoshop\ -:94a27cdb-0433-1\ -1e7-b02d-9f84d9f\ -5a326\x0a \ - \x0a <\ -/photoshop:Docum\ -entAncestors>\x0a \ - xmp.iid\ -:16fdf09c-857d-9\ -44e-9783-e127cb1\ -b9cf4\x0a \ - adobe:docid:\ -photoshop:9f9351\ -ac-0436-11e7-b02\ -d-9f84d9f5a326\x0a xmp.did:ca7\ -71a70-f965-e14f-\ -9103-360465543db\ -f\x0a \ - \x0a \ - \x0a \ - \x0a \ - <\ -stEvt:action>cre\ -ated\x0a \ - xmp.iid:\ -ca771a70-f965-e1\ -4f-9103-36046554\ -3dbf\x0a \ - 2017-03-07\ -T11:32:29-08:00<\ -/stEvt:when>\x0a \ - <\ -stEvt:softwareAg\ -ent>Adobe Photos\ -hop CC 2015.5 (W\ -indows)\x0a \ - \x0a \ - \x0a \ - saved\x0a \ - <\ -stEvt:instanceID\ ->xmp.iid:16fdf09\ -c-857d-944e-9783\ --e127cb1b9cf4\ -\x0a \ - 2\ -017-03-08T11:37:\ -45-08:00\x0a \ - Ado\ -be Photoshop CC \ -2015.5 (Windows)\ -\x0a \ - /\x0a \ - \x0a <\ -/rdf:Seq>\x0a \ - \x0a \x0a \ -\x0a\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \x0a8BIM\x04\ -%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x008BIM\x04:\x00\x00\x00\ -\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x0bprintOutput\x00\x00\x00\x05\ -\x00\x00\x00\x00PstSbool\x01\x00\x00\x00\ -\x00Inteenum\x00\x00\x00\x00Int\ -e\x00\x00\x00\x00Clrm\x00\x00\x00\x0fpri\ -ntSixteenBitbool\ -\x00\x00\x00\x00\x0bprinterName\ -TEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0fpr\ -intProofSetupObj\ -c\x00\x00\x00\x0c\x00P\x00r\x00o\x00o\x00f\x00\ - \x00S\x00e\x00t\x00u\x00p\x00\x00\x00\x00\x00\ -\x0aproofSetup\x00\x00\x00\x01\x00\ -\x00\x00\x00Bltnenum\x00\x00\x00\x0cb\ -uiltinProof\x00\x00\x00\x09p\ -roofCMYK\x008BIM\x04;\x00\ -\x00\x00\x00\x02-\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x12printOutputOp\ -tions\x00\x00\x00\x17\x00\x00\x00\x00Cpt\ -nbool\x00\x00\x00\x00\x00Clbrbo\ -ol\x00\x00\x00\x00\x00RgsMbool\x00\ -\x00\x00\x00\x00CrnCbool\x00\x00\x00\x00\ -\x00CntCbool\x00\x00\x00\x00\x00Lb\ -lsbool\x00\x00\x00\x00\x00Ngtvb\ -ool\x00\x00\x00\x00\x00EmlDbool\ -\x00\x00\x00\x00\x00Intrbool\x00\x00\x00\ -\x00\x00BckgObjc\x00\x00\x00\x01\x00\x00\ -\x00\x00\x00\x00RGBC\x00\x00\x00\x03\x00\x00\x00\x00\ -Rd doub@o\xe0\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00Grn doub@o\xe0\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00Bl doub\ -@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00BrdT\ -UntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00Bld UntF#Rlt\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Rslt\ -UntF#Pxl@b\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x0avectorDatabo\ -ol\x01\x00\x00\x00\x00PgPsenum\x00\ -\x00\x00\x00PgPs\x00\x00\x00\x00PgPC\x00\ -\x00\x00\x00LeftUntF#Rlt\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Top U\ -ntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00Scl UntF#Prc@\ -Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10cropW\ -henPrintingbool\x00\ -\x00\x00\x00\x0ecropRectBott\ -omlong\x00\x00\x00\x00\x00\x00\x00\x0ccr\ -opRectLeftlong\x00\x00\ -\x00\x00\x00\x00\x00\x0dcropRectRi\ -ghtlong\x00\x00\x00\x00\x00\x00\x00\x0bc\ -ropRectToplong\x00\x00\ -\x00\x00\x008BIM\x03\xed\x00\x00\x00\x00\x00\x10\x00\ -\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\x00\x00\x01\x00\x018\ -BIM\x04&\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00?\x80\x00\x008BIM\x03\xee\x00\ -\x00\x00\x00\x00\x0d\x0cTransparen\ -cy\x008BIM\x04\x15\x00\x00\x00\x00\x00\x1e\x00\ -\x00\x00\x0d\x00T\x00r\x00a\x00n\x00s\x00p\x00\ -a\x00r\x00e\x00n\x00c\x00y\x00\x008BI\ -M\x045\x00\x00\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\xff\ -\xff\x00\x00\x00\x00\x00\x00\x00d\x01\x008BIM\x04\ -\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ -\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\ -\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\ -\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\ -\x008BIM'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\ -\x00\x00\x00\x00\x00\x00\x018BIM\x03\xf5\x00\x00\x00\ -\x00\x00H\x00/ff\x00\x01\x00lff\x00\x06\x00\ -\x00\x00\x00\x00\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\ -\x06\x00\x00\x00\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\ -\x00\x00\x06\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00\ --\x00\x00\x00\x06\x00\x00\x00\x00\x00\x018BIM\x03\ -\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ -\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ -\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\x03\xe8\x00\x008BIM\x04\x00\x00\x00\x00\ -\x00\x00\x02\x00\x008BIM\x04\x02\x00\x00\x00\x00\x00\ -\x02\x00\x008BIM\x040\x00\x00\x00\x00\x00\x01\x01\ -\x008BIM\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\ -\x00\x00\x0a8BIM\x04\x08\x00\x00\x00\x00\x00\x10\x00\ -\x00\x00\x01\x00\x00\x02@\x00\x00\x02@\x00\x00\x00\x008\ -BIM\x04\x1e\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008\ -BIM\x04\x1a\x00\x00\x00\x00\x035\x00\x00\x00\x06\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00null\x00\x00\ -\x00\x02\x00\x00\x00\x06boundsObjc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ -\x00\x04\x00\x00\x00\x00Top long\x00\x00\ -\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ -\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ -\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ -\x00`\x00\x00\x00\x06slicesVlLs\ -\x00\x00\x00\x01Objc\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x05slice\x00\x00\x00\x12\x00\x00\x00\x07s\ -liceIDlong\x00\x00\x00\x00\x00\x00\ -\x00\x07groupIDlong\x00\x00\x00\ -\x00\x00\x00\x00\x06originenum\x00\ -\x00\x00\x0cESliceOrigin\x00\ -\x00\x00\x0dautoGenerated\ -\x00\x00\x00\x00Typeenum\x00\x00\x00\x0a\ -ESliceType\x00\x00\x00\x00Im\ -g \x00\x00\x00\x06boundsObjc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ -\x00\x04\x00\x00\x00\x00Top long\x00\x00\ -\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ -\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ -\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ -\x00`\x00\x00\x00\x03urlTEXT\x00\x00\x00\ -\x01\x00\x00\x00\x00\x00\x00nullTEXT\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00MsgeTEX\ -T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x06altTa\ -gTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0ec\ -ellTextIsHTMLboo\ -l\x01\x00\x00\x00\x08cellTextTE\ -XT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x09horz\ -Alignenum\x00\x00\x00\x0fESl\ -iceHorzAlign\x00\x00\x00\x07\ -default\x00\x00\x00\x09vertA\ -lignenum\x00\x00\x00\x0fESli\ -ceVertAlign\x00\x00\x00\x07d\ -efault\x00\x00\x00\x0bbgColo\ -rTypeenum\x00\x00\x00\x11ESl\ -iceBGColorType\x00\x00\ -\x00\x00None\x00\x00\x00\x09topOut\ -setlong\x00\x00\x00\x00\x00\x00\x00\x0al\ -eftOutsetlong\x00\x00\x00\ -\x00\x00\x00\x00\x0cbottomOutse\ -tlong\x00\x00\x00\x00\x00\x00\x00\x0brig\ -htOutsetlong\x00\x00\x00\x00\ -\x008BIM\x04(\x00\x00\x00\x00\x00\x0c\x00\x00\x00\ -\x02?\xf0\x00\x00\x00\x00\x00\x008BIM\x04\x14\x00\ -\x00\x00\x00\x00\x04\x00\x00\x00\x0c8BIM\x04\x0c\x00\ -\x00\x00\x00\x038\x00\x00\x00\x01\x00\x00\x000\x00\x00\x00\ -0\x00\x00\x00\x90\x00\x00\x1b\x00\x00\x00\x03\x1c\x00\x18\x00\ -\x01\xff\xd8\xff\xed\x00\x0cAdobe_CM\x00\ -\x01\xff\xee\x00\x0eAdobe\x00d\x80\x00\x00\x00\ -\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\x09\x08\x0c\x09\x09\x0c\ -\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\ -\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\ -\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\ -\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x000\x000\ -\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\x03\ -\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\ -\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\ -\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\x00\ -\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\ -\x00\x02\x11\x03\x04!\x121\x05AQa\x13\x22q\x81\ -2\x06\x14\x91\xa1\xb1B#$\x15R\xc1b34r\ -\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\ -\x83&D\x93TdE\xc2\xa3t6\x17\xd2U\xe2e\ -\xf2\xb3\x84\xc3\xd3u\xe3\xf3F'\x94\xa4\x85\xb4\x95\xc4\ -\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\ -\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\ -\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\ -\x055\x01\x00\x02\x11\x03!1\x12\x04AQaq\x22\ -\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$\ -b\xe1r\x82\x92CS\x15cs4\xf1%\x06\x16\xa2\ -\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17dEU6\ -te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\ -\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\ -\xa6\xb6\xc6\xd6\xe6\xf6'7GWgw\x87\x97\xa7\xb7\ -\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5\ -T\x92P\xb5\xceensZ^\xe6\x82CG$\xa4\ -\xa5YuU\xff\x008\xf6\xb2x\xdc@N\xd7\xb1\xe3\ -s\x1c\x1c\xdf\x10d*X\xb8,\xb1\x9e\xbe[K\xee\ -\xb3S\xbb\xb0\xec6\xa6}#\x07&\xa7\xd2H\xaa\xe7\ -\x06=\x93\x22O\x05%:\x09$\x92J\x7f\xff\xd0\xf5\ -T\x1c\x9c\xaa\xf1\x9a\x0b\xe4\x97\x18kZ$\x94eK\ -\xaa{YM\xbd\xeb\xb0\x1f\x97\xfa\x84\x94\xb7\xdb\xefw\ -\xf3x\xaf>\x05\xda\x7f\x04+\x9b\xd4.s.}m\ -`\xa6\x5c\xd6\x93:\xf3:|\x15\xac\xf3x\xc6s\xa9\ -0F\xae#\x9d\xa3\xe9mK\x05\xd6Y\x88\xd7Zw\ -\x17L\x1e\xf1:nIL\xf1/7\xe3\xb2\xd2\x00.\ -\xe4\x0e$\x1d\xa8\xca\x97J\xd3\x1d\xf5\x9ekyj\xba\ -\x92\x9f\xff\xd1\xf5UW\xa8\xd6l\xc3\xb0\x01$A\x00\ -y\x1f\xfc\x8a\xb4\x92Jh7\xa95\xf5\x86\xb6\x8b-\ -1\x0e\x86\xe8t\xd7\xc5&_\x9b\xb42\x8cA[\x06\ -\x808\xc0\x1f/b\xbe\x92Jj`\xe3\xddQ\xb5\xf7\ -@u\xae\xdd\xb5\xbc\x05m$\x92S\xff\xd98BI\ -M\x04!\x00\x00\x00\x00\x00a\x00\x00\x00\x01\x01\x00\x00\ -\x00\x0f\x00A\x00d\x00o\x00b\x00e\x00 \x00P\ -\x00h\x00o\x00t\x00o\x00s\x00h\x00o\x00p\ -\x00\x00\x00\x19\x00A\x00d\x00o\x00b\x00e\x00 \ -\x00P\x00h\x00o\x00t\x00o\x00s\x00h\x00o\ -\x00p\x00 \x00C\x00C\x00 \x002\x000\x001\ -\x005\x00.\x005\x00\x00\x00\x01\x00\x00\x00\x0cHL\ -ino\x02\x10\x00\x00mntrRGB X\ -YZ \x07\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00a\ -cspMSFT\x00\x00\x00\x00IEC s\ -RGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-HP \x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11c\ -prt\x00\x00\x01P\x00\x00\x003desc\x00\ -\x00\x01\x84\x00\x00\x00lwtpt\x00\x00\x01\xf0\x00\ -\x00\x00\x14bkpt\x00\x00\x02\x04\x00\x00\x00\x14r\ -XYZ\x00\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\ -\x00\x02,\x00\x00\x00\x14bXYZ\x00\x00\x02@\x00\ -\x00\x00\x14dmnd\x00\x00\x02T\x00\x00\x00pd\ -mdd\x00\x00\x02\xc4\x00\x00\x00\x88vued\x00\ -\x00\x03L\x00\x00\x00\x86view\x00\x00\x03\xd4\x00\ -\x00\x00$lumi\x00\x00\x03\xf8\x00\x00\x00\x14m\ -eas\x00\x00\x04\x0c\x00\x00\x00$tech\x00\ -\x00\x040\x00\x00\x00\x0crTRC\x00\x00\x04<\x00\ -\x00\x08\x0cgTRC\x00\x00\x04<\x00\x00\x08\x0cb\ -TRC\x00\x00\x04<\x00\x00\x08\x0ctext\x00\ -\x00\x00\x00Copyright (c)\ - 1998 Hewlett-Pa\ -ckard Company\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00\x12sRGB \ -IEC61966-2.1\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x12sRGB IEC\ -61966-2.1\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ -\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccX\ -YZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\xa2\x00\ -\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\ -\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\ -\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfd\ -esc\x00\x00\x00\x00\x00\x00\x00\x16IEC h\ -ttp://www.iec.ch\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16IEC \ -http://www.iec.c\ -h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00.IEC 6\ -1966-2.1 Default\ - RGB colour spac\ -e - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00.IEC 61966-2.\ -1 Default RGB co\ -lour space - sRG\ -B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00,Reference Vie\ -wing Condition i\ -n IEC61966-2.1\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00,Refere\ -nce Viewing Cond\ -ition in IEC6196\ -6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\ -iew\x00\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\ -\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\ -\x00\x00\x01XYZ \x00\x00\x00\x00\x00L\x09V\x00\ -P\x00\x00\x00W\x1f\xe7meas\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x02sig \x00\ -\x00\x00\x00CRT curv\x00\x00\x00\x00\x00\ -\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\ -\x1e\x00#\x00(\x00-\x002\x007\x00;\x00@\x00\ -E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00\ -m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\ -\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\ -\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\ -\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\ -\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01\ -E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01\ -|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\ -\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\ -\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02\ -A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\ -\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\ -\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x03\ -8\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\ -\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\ -\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04\ -c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\ -\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05\ -I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\ -\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06\ -H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\ -\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07\ -a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\ -\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\ -\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09\ -:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\ -\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\ -\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0b\ -Q\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\ -\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\ -\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\ -\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\ -\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f\ -^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10\ -C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x11\ -1\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12\ -&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\ -#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14\ -'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x15\ -4\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16\ -I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17\ -e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\ -\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\ -\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\ -\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c\ -*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1d\ -p\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\ -\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \ -\x15 A l \x98 \xc4 \xf0!\x1c!H!\ -u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\ -\xdd#\x0a#8#f#\x94#\xc2#\xf0$\x1f$\ -M$|$\xab$\xda%\x09%8%h%\x97%\ -\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'\ -I'z'\xab'\xdc(\x0d(?(q(\xa2(\ -\xd4)\x06)8)k)\x9d)\xd0*\x02*5*\ -h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\ -\x05,9,n,\xa2,\xd7-\x0c-A-v-\ -\xab-\xe1.\x16.L.\x82.\xb7.\xee/$/\ -Z/\x91/\xc7/\xfe050l0\xa40\xdb1\ -\x121J1\x821\xba1\xf22*2c2\x9b2\ -\xd43\x0d3F3\x7f3\xb83\xf14+4e4\ -\x9e4\xd85\x135M5\x875\xc25\xfd676\ -r6\xae6\xe97$7`7\x9c7\xd78\x148\ -P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:\ -6:t:\xb2:\xef;-;k;\xaa;\xe8<\ -'\ - >`>\xa0>\xe0?!?a?\xa2?\xe2@\ -#@d@\xa6@\xe7A)AjA\xacA\xeeB\ -0BrB\xb5B\xf7C:C}C\xc0D\x03D\ -GD\x8aD\xceE\x12EUE\x9aE\xdeF\x22F\ -gF\xabF\xf0G5G{G\xc0H\x05HKH\ -\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\ -\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\ -\x02MJM\x93M\xdcN%NnN\xb7O\x00O\ -IO\x93O\xddP'PqP\xbbQ\x06QPQ\ -\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\ -\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\ -\x5cV\xa9V\xf7WDW\x92W\xe0X/X}X\ -\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[\ -E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']x]\ -\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`\ -W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\ -\xf0cCc\x97c\xebd@d\x94d\xe9e=e\ -\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h\ -?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\ -\xf7kOk\xa7k\xfflWl\xafm\x08m`m\ -\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\ -\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s\ -]s\xb8t\x14tpt\xccu(u\x85u\xe1v\ ->v\x9bv\xf8wVw\xb3x\x11xnx\xccy\ -*y\x89y\xe7zFz\xa5{\x04{c{\xc2|\ -!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\ -#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x82\ -0\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85\ -G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88\ -i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\ -\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\ -\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\ -\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95\ -_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\ -\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\ -\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\ -\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\ -\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\ -\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\ -\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\ -\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1\ -`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\ -\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\ -\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\ -\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0\ -p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4\ -Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8\ -=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc\ -5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd0\ -9\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4\ -I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8\ -d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\ -\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\ -\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\ -\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9\ -F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\ -\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\ -\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6\ -m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\ -\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xff\ -m\xff\xff\x80\x00 P8$\x16\x0d\x07\x84BaP\ -\xb8d6\x1d\x0f\x88DbQ8\xa4V-\x17\x8cF\ -cQ\xb8\xe4v=\x1f\x90HdR9$\x96M'\ -\x94JeR\xb9d\xb6]/\x98LfS9\xa4\xd6\ -m7\x9cNgS\xb9\xe4\xf6}?\xa0PhT:\ -%\x16\x8dG\xa4RiT\xbae6\x9dO\xa8Tj\ -U:\xa5V\xadW\xacVkU\xba\xe5v\xbd_\xb0\ -XlV;%\x96\x0a\x01\xb4\x00Cv\xb1\x15\xb4D\ -+\x0c\xdcC\xe0\xeb\xa0F\xd2\x01y\xde^\x0e;\xe3\ -q\xc5\x7fm_\xdcM\xbb6\x17\x0d\x1b\x0a\xe2CD\ -\x5caX\x8f\x8f,\x88rB\xa0VT\x19\x14|\xe6\ -^\xedl\xe31\x85\x9fY.tJ\x87V\x95\xc9\x87\ -\xd4a\xc4\xda\xb1\x81g\x5co\x1elIa\x1d\xa0V\ -X\xf0\xdc;\x17\xdb\xb5r\xc7|\x9dj\xf0YZ\x9e\ -%d\xbd\xc7:\x99yG\xf0O4\x17<}t_\ -\x08\x9e\xa1\xb3|\xb1N\xf1{T\x9b\xa08$f\xf0\ -\x1f\xcb\x1e3u1_\xe7M\xa5\xfdG\xd7w\xb5\xd3\ -\xdb\xf8NA\x7f0rS\xec\xb9\x16\xfeG\x15FO\ -\xf5v6\xc0\x02A\xfd\x01\x9f\xcf\x8c\x0c\x98\x8e\xf0I\ -**\xc1\x83R0m\xc2\x06\x938k\x19fl,\ -`\x9dp\xc9\xca\xe8\x9fG\xcb\xe6\x05\x81\xabX6\x11\ -\x06q(\x80\x11\xc5\x01`A\x15\x85\x0b\xba0V\xc6\ -\x04\xc1\x15\x19\x8d\xa7\xecl~@\xf1\xcaJ-\xc7\x83\ -\x90\xe3\x1f\x91\xa8\xa3\x82j\x99D\xb4\x8c>\x19rI\ -{\x02@\xa8\xb8\x09'\x80\xa1\x94\xa4\x1f\x0cr\xa8\xf9\ -\x12\x86b\x020O\xcb\x849+/\x8fQ\xd4\xc4\x8e\ -\x84\x93(ZPM\x06@\x115\x81H\x81m7\x94\ -\x84,\xe433'\xc9\xee\x94\x00S\xc8\x04-O\x83\ -\x88\xdd?\x913\xd0\x06\x88\x1eT)\xde*Q\x01C\ -\xdaw\x1dS\x1d\x1c\x8a\x92T\x89l\x1dR\x82J \ -]S\x05H\xffM\x8b\xc7\xdd<}&\x81\xb5D!\ -\x90u)H\x09\xd5\x00\xc2 ZU\x85\x09\x01W\x8c\ -\x14}d\x86\x82\xd5\xa87\x18\x15\xa6\xcb\x9a\x04\xb9\xe8\ -[Ju\x1c\x8dp\xb2\x18\x1e6)\xda\x9e\x05\xd6H\ -tMY\x86\x04\x9e\x02\x00\xa8e<}\x9fB\xbd\xac\ -\x160L%gm\xa0\x83E\xbcA\x0c\x97\x08\xfa\x88\ -\x10\xd7(\xd0W]\x04\xca\x889]\x84|\xf8-\x0e\ -\x08\x84\xd0P\x11\x0f\xb1(<\xdb\x95\x9b\xba\x09W\x06\ -\xc3h\x08\xb6\xc8]\x16u\x0a\x18(H{a\x07\x9a\ -\x88\x03a\x80AO\x87\x9a\x00\xfe$\x13\xa1\x876,\ -p\x0a\xd8\xc8V|c\x87\xb5\xf31c\x81\xbbH \x86\x19\xfbi\x863\xee\ -\x02\x04\x98\xa8\x14[\xa9\x96\x15o\x01\xa2\x19R\x90c\ -#\xae\xec\xec.\xd2\xef\xa2\x03[\xc0T\x1a\xdd\xe3\x84\ -\xa4\x19\x07\xe8$\xfe7\x09F7$[\xaa\x84o,\ -X\x07\xfc\xc8\x9e\x86\x11|\xe8\xdcT\xf4\x04\x9f\x03|\ -\xd4A\xb0\x87\xd2\x88\x96a4@C\x87\xca\xa9H\x92\ -T\x9d+\xces\xdd\x01S\xd1t}\xca\xb0\x03\xf7\x80\ -N\x1eS\x9a \xf7\x84\x12\xa1\x84\x17\x8c1\x96^I\ -=\xddy\x8a\xab\xf2\x16\x87\x04\xf7\xa4cE\xc8X\xeb\ -\xeb\x8aE\xff\xb4W\xf9\xbe\xea\xa2>|\x04\xde\x0a(\ -\x0c\x99\xa4\x06~\xb8\xe2\xf0ll}\x86w\xbd\xf7\xa9\ -+pTR~\x86v\x18\x03\x00\xe8a\xbd\xfd\x9a\xd1\ -\xe0\xb6\x0cV\x9a\xa0~\x10\x0du\xae\xc1\x1c\xbb\xc3\x89\ -\x10uB\x05\xd5\x08\x08\x09\x03\xca\x0b\xf7\x00\xedTV\ -\x0d\x805\x05\xc1\x01\x0cC#\xacs\x05\xd8<\x0d\x07\ -d!\x1c\xf0B\x12\x13\xd0k\x09\xc2\x12F\x12\xc2\xf1\ -\xea\x90\xa2\xf2<\xc7\x80\xe1\x86Ce=\x00!\xd1\x0d\ -\xc7\x18\xc1\x87B\xc4Z\xc3\xd1E\x09b\x01\x152\xa0\ -(\x06/\xf0,\x88\x81\x08\x1c\x89@\x90\x0cD\xd0:\ -\xaa\x00\x98\x18\x061L\x1f< <\xf1\x09\x18\xc8\x8b\ -B\xe8FE\xd0\xde8#\x00\xd8\x88.\xea!\x80\xd5\ -k\x11\xe0\xb8\x1a\x04\x11X\x13\x19 B\x0a@\xecq\ -\x04\x91(\x0e\x028\x8c\xae\xd5\xe9:B\x03li\x06\ -\x18\xfc\x0eX\xe0\xf8c\xd1\x8c\xad\xc3Uv\xcf\x99\xf8\ -\x17\x91@u\xa9\x01 -#@\xb4P\x03\x12(\x0b\ -\x81\xd6$\x07\xc1<\x94\x03\xa0RN\x01\x98$V\x1e\ -\xb8u{/nB\x14u\x9e\x01\x5c04\x8e\x80\x91\ -\x14\x020W%\xc1:\x22\x04@>Z\x01$\xd6\x02\ -\x00[XQ\xc2\xce^\x0a\x01\x03/\xc3\x0c\xa5'\xcd\ -\xa4\x06\x81\x04\x18\x15CXD\x99AT\xd5\x82`^\ -\x8eG\xe4\xd1\x1fr\x04{\x1b\x81\xe0;\x1a\xc2\xfb!\ -\x83:n\x0c#\xc0\x19\x9cl\xc2'\x11\xc4\x0e\x82G\ -,#E\x81n\x05e\x81\x1b\x0f\xd1\xf8\xc0\xe1\xb8\xe8\ -\x1cQ\x80p\x0d\x83\x046\xa1\x90\xe1\x1b0ls\x0f\ -I\xfc\x1b\xf0\xb8\x1a\ -\xe2hK\x00\x80\x130\xc4\xe2\x02\x1e\xebn\xb3\x09\x02\ -2\x13\xb0\xd4\x18\x80_\x0d\xa0v!\x87\xd8\x1b\x01\x9c\ -\xe3\xa0h\xe0%\x1c\xb9\xcb\x98\xfe\x82\x16<\xe1^\x13\ -d\xe4\x10\xa0\xcd\x0d\x021\x01\xa0\xfa\x13\x80\x9f\x10\xed\ -v!l\x06\xd8\xcb<[e\xfa\x96\x02\x18\xc8\x81\x94\ -\x17\x8c\x82\x0dP\x01\x10B-\x06.A\x06\x8f\xd2i\ -/D\x06l\xc2\x1b,\xc6;h$\xe5@ \x02\xa8\ -\x90\x0f1T\x12\xe9\xd4!\x91B\x19\xeb\xc5\x13\x02,\ -\xe8\xce\x90\xb2.\x94!\xea\xc8\x0a\x86P\x15\xa2\xa0\x86\ -\xa9\x10\x02\x0c\x92\x9b\x22\xe8\x02Np\x8d\x8f\x10\xb9\xc7\ -\x08C\xe0\x1cHC\x84\xfdj=\x16B(\x8d\xc0R\ -\xfe!\xa4\x00q\xac\x00\x82\x18\x85@\xf6zA<\xbb\ -\xc2nPH\xa0\x92\x89*\xb5\xa9\xd4\xb5\xaf\x10\x93\x80\ -(\x03$>\x01\xa7x\x00\xe0\x12&\x01G\x1e!\x18\ -\x121\xe8\xa7\x91\xa0\x22oh\xe5\xa1\xb2\xc9\x82\x18v\ -\xc1&\xca\xe3\xca#e\x04\x96\xe0\x14\xc9\x22\xe2\x03 \ ->\x8d\x89.\x8d\xa3&\xb9\xc94\xc9\x22\x90\xa0\x8b\xc4\ -b\xc1\xcc\x1b\xf1\xee\x22b\xef\x1b\x81\x8cy\xe3\xf6!\ -aq#\xe1L|\x00\xf8\x0bb\x08\xc9\x91\xd1!\x06\ -$\x04\xcf\x10\xe7\x09e\x19F\xb1\x17\xed^+\x8a\xb8\ -\xcb\xec\xee\x1aa\x91\x22\xe24\x10\x92t\x14\xa0\x91'\ -\xa0\xb4!\x8d\x91&\xa1\x8e\x8d\x92\x0e\x03\xe9\x88\x02.\ -\x148\xb0\xae\x1e\xa1\xe4B\xc1\x9a\x18\x011* \xfe\ -g!\xb4grp#\x80\xc1+ \xf0\xf0\xa0\xd8\x10\ -\xe4r\xae\xe9\xe0\x86\xe3\x04\x1cC\x02/\xe1\xb6\xa9\x81\ -\xda\xb3\xcc\x06\xc7J\x9e\x1cr\xae$\x8f\x92\xf9o\x9a\ -+\x8aA-j\xfc\xa4\xe2\xf8\x1bj\x5c\xa5a\xac\xd9\ -\x0af\xd3r\xde'\xf1\xda\x01!\x1f0\xa1du\x02\ -p\xe0,\x07-\xa5~\x1c\xb2\xd0\xb3\xc86\x1c\xa9\xf2\ -\x1b*P\x1b\x8f\x8a\xab\xa6\x130\x22\xb5\x19Mr\x14\ -G2\x07\xe76#j\xee\xc0k\xd6\x1b\xed\xa6\xa5a\ -\xaa\xa5\xd3J\x9e!\xc2\xb1S4[\x88j\xf8\x00{\ -6`\x9a\x96\x80\x1e\x02N2\x1f\x8a&\x86(d\x1b\ -S+\x0b\x81\xbe\x1a\xcd\xa71\xb0\x095\xf3\x8d8\xf3\ -\x9193\x959s\x999\xb3\x9d9\xf3\xa1:3\xa5\ -:s\xa9:\xb3\xad:\xf3\xb1;3\xb5;s\xb9;\ -\xb3\xbd;\xf3\xc1<3\xc5\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Default\x0d\x0a Cr\ -eated with Sketc\ -h.\x0d\x0a <\ -defs>\x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \x0d\ -\x0a\x0d\x0a\ -\x00\x00\x03\x87\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / entity\ - / Loop v2\x0d\x0a Cr\ -eated with Sketc\ -h.\x0d\x0a <\ -g id=\x22icon-/-out\ -liner-/-entity-/\ --Loop-v2\x22 stroke\ -=\x22none\x22 stroke-w\ -idth=\x221\x22 fill=\x22n\ -one\x22 fill-rule=\x22\ -evenodd\x22>\x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x19\xf8\ -\x00\ -\x00\xe0\x1cx\x9c\xed\x9c\x09\x5c\x14\xd5\x1f\xc0\xdf\xec\xc5\ -\xb5\xdc\x87\x17\xea\x8a\x1c^\xdc7\xca\xb9\xa0\xa0\x22\x08\ -xf\xc9\xb2;\xc0\xea\xb2\xbb\xee\x01hVj\xa6\xa5\ -\x96Gf^e\x1e\x99GiY\x1e\x99\x1d\x9af\x87\ -\x7f\xcb\xdb\xb2\x03\xf3oj\x99Q\xa6V\x9a\xfc\x7f\xbf\ -Y\x16\x06\x04E\x19\xc0\xfe\xcd\x97\x0f\xb3o\xde\xf5\xfb\ -\xbd\xdf\xbcy\xd7\xcc\x9b\xccL\xd2\x8b\x10bK\xbc\xc8\ -M\x22\x02\x17E,\x07!\xf3\x93\x0f\x07\x8a\xe5\x160\ -n\x88GyQ\xc2j\x7f\x88LI\xaa\xdd\x028\xb8\ -Z\xf3\xc9\xaa\xa4\xdcXq<\xab\xddLjV\x9e\xed\ -\xac\xf1\xe7\x11\xaa#\x11[\xdcT\x17\xaaS\x8d\xdb\x9f\ -\xf2f\xe5\xd3\x83%+\x14\x8f\xc4\x07\x5cAT\x18\xe3\ -\xf6\x00w6\x95S\x1b_\xb0\x0b\x8fQ\x9d\xe0T5\ -#\x03\xdd\xd2\x1e\x84DO\x99\xa9\xb6\xca\xfd\xaer\xa6\ -\x91\xd8\x80\x7f:!\xf2uX~\xb0\x87\xe5\xcf\xfe\xc6\ -\x14B\x02\x5c\xac\xbf\xc9*]\x01-\xcb.\xd6\x99t\ -\xc6b\x9d^&\x97\xcb\xc2BB\xa3e=F\xa8\xb5\ -*]\x99\xb1'\xc1\xd3\xb8\x90\xb0\xb8\x90pYhd\ -\x5cX88H\xbf\xc4r\xbdB9\x9e6\xc9\x0a\xe8\ -\x22\xb56\xde\xe7\x97w\xde\xf7\x91\xa9U\xf1>#\x22\ -3C2\xf5r\xbaX\x9d>\xc9@\xe7N\x1a\x92\xa7\ -\x9c4^\x19\xab\xf2IL\xb0\xefW\x1eW^\xa2/\ -\xa1M\x0aYy\x89Fk\x8c+\x8f\xf7Q\xa0\xfc8\ -p\xa3w\xb0\x8f\x8c\x89b\x1a\x1f\xefcQldf\ -\xb6L\xae3\xd0\xb2\xc8\xa0\xa8@ehx\x8c,:\ -6(426&,\xa2\x0f*\x1a\x15\x1c\x12\x1b\x1c\ -\x1a\x11\x18\x12\x1a\x17\x12\x1b\x17\x12*\xab\xc6'\xc1\x1e\ -\x8e\xfd\x0c\xaa\xc2\xb8\x9c\xd4\xfe\xd5\xe2\xe0,\xde\xa7\xd8\ -d\xd2\xc7\x05\x07\x97\x95\x95\x05\x95\x85\x07\xe9\x0cE\xc1\ -\xa1\xb1\xb1\xb1\xc1!a\xc1aa\x81\x10#\xd08Q\ -kR\x94\x07j\x8d\xdd-\x99X\xf3I\xa5\x8dJ\x83\ -ZoR\xeb\xb4284($\xb8\xa1D*eM\x1a\ -\xbd\xd9\xa0aTS)\x83i\x0d]BkMFH\ -\x17\xda`:\xbd\xf5\xda5,\xb2&\xb8Q\xc1\xa0m\ -f\xe6\xed\xf5-)i0\xa5\xd1\x94Vj\xba}J\ -c\xdeD=\x1d\x9cC\x1buf\x83\x92N+\x85\xa2\ -\xd4\xda\x15M\x0b\xd2\xe3\xe4\x06Za\xa2S\xe1?\x01\ -k[`HX`Hx\x1e\xd4\xb6\x90\xa8\xb8\xb0\xc8\ -\xc0\x90\x98\xb8\x90\x90~\xc1\xf5b\xd6\xcb#S\xa7R\ -\x17Nl \x0f\xa6\xc6\xb2\xf3`\xc5\xac\x9f\x07\xd4A\ -\x95\xc2\xa4hR.\xec\xb8\xac|T\xca\xb8B\x9d\xa1\ -DaJP\x97(\x8a\xe8`\x93\xba\xb0\xb0_p\xad\ -/+j\xcd\xa5\x89\x93\xeb4:\x03\xe8E'\x84\xf7\ -\x0bn\xc8\xbb\xc1T\x19ry\xb6AW\xa8\xd6\xd0\x09\ -\xc6\x9c\x01)\xb2\x8c4yThlTT`XP\ -(;\x1bV\xbc\xba\x05\xce\xcc\x8c\xcb\xd0\x1aM\x0a\xad\ -\x92\xceHM\x00\x8f \xb5Z\x15WX\x18AG\x85\ -\xc7D\x05\xd2\x85\xe1t`(\x1dA\x07\x16D+c\ -\x02\xa3\x14\x11\x91ttxAX\xb4R\xc5\xd8\xa0n\ -\xf2[\xb2N\xd5)\xcdXu\xab\xb3V\xdde\xd6\xac\ -\xe4\xb7d\x9dePC\xb3\xa3\xd04SD\x03\xd9\xdc\ -\x22*]m4\xe9\x0c\x13\x13\xeaT\x7f\xa6A\xc8\xa5\ -'\xd4\xf5\xb5\x06h\xd4L\x03\xa1W\x18\x8c4V\xff\ -x\x1fk\xfd\xf7\xb9%\x01\xa6an\xa38\x85\x12\x9b\ -\x96\x04%S\xc3A\xc5:\xbe\x8d'S\xdf\xeb\x05\xbc\ -%y\xe32\xca\x8ai\xed\xed\xeeLV\xac\xc631\ -\xea\x0aMe\x0a\x03\x9d\x5c\x04\x96N\xb8c\xbfc\xcd\ -\xb5n\xb2[\xec\x1dl1x\xbd\xcb\x13|\xeb\xf5\xb1\ -^\xf3z\xd7\xd3\x12\x95\xd5\xb6[:\x8e\xe0\xea\x9e\x03\ -:\xad\xe0\x9a^\xab\xa1\xc2q\x0f/\x84\x17\xc2\x0b\xe1\ -\x85\xf0Bx!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\ -\xf0Bx!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0\ -Bx!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0B\ -x!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0Bx\ -!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0Bx!\ -\x1c\x0b\xb1\xaf\xdd\x07FkU\xf1>e>\x89\x09$\ -&%#S\xe4\xc7\xec9s!\xf5`\xc2\xe2\x18\xe7\ -\xd9\xeapfw\x1eq\xd0\x1b\xd4ZS\x96\xd9\xa47\ -\x9b\xe0\x14\xb7\xc9\x91l\xa3)\xb7@\xa7\xd3012\ -\xb4&\x9a\xd6\x9aK\xacn\xfc\x95k\x0cx\xee\xcc\xa4\ -\xcdU\x97c\x8c\x14\xb5\x09\xd3\xd4\xe6I\x1b\x86(J\ -\xe8\xbc\xb4\x91y5\xc2,\x09\xb2\x0d:]a.m\ -2\xeb\xb3\x0a\xc6)\xc1[J\xb2\x89\x81\xe8\xe0\xaf\x90\ -\xc8H.\xa1\x89\x89\x98\x89\x9eIb\xaf\xaf\x89m\xcd\ -&Ec\xd2Vk$-0\xab5&\xb5\x96\xc9\x12\ -\xce\xed\x98\xd8\xf2\xccQ\x83,%\xee\x8b\xf1\x05\x81u\ -J\xec\xc6*q\x16\xb3\xf3\xc0\x08\xbe\xed\x98r\xe9M\ -Zk!\xa0\x90\x05\x86\x9a\x93\x9c\x22cfm\x88A\ -+\xaf=\xd1\x9ajO\x06\x17h\x8c5'C\x8aL\ -\xa55'i%\x9a\xd4\x9a\x13\xb0cm\xd6)\xca\xf1\ -E\xd5\x86\xb0(Hr\x06\xa4\xc8\x89e\xdb$\xc9Q\ -\xc9d*\x9d\xb9 IWQs1\x07\x18\xb4\xb7\xf8\ -\xa5hn\x8d\x97bP\xe5\x0d\xd3\x9a\xfaw\xcf\xd1\x98\ -\xd8\x95!E\xa3\x925\xe4\x9fc\xd4\x98\x18\xff\xecr\ -MRN\x8d\xb7})\xad4\xe9\x0c\xa9\x0a\x93\xa2\xa6\ -Vd\x17e\x1b\xad\xb5\x02\xdd\xd5\xbfr\xc6\x08t\xa1\ -\xa9\xa1\xec\xf3t\xfa\x06\xc5\xe6*5\x16\xffl\x832\ -iT\x8d\xb7\x8b\xd2\xa0\xd3\x8f(\xa6\xe1\xe2\xc2\xf5R\ -k\x8b\xac\x16s\xc2\x80\x1c\xd0)Eg2\xe9J4\ -:mQu\x12\xa95\x04U`\xf9;Z\xfds\xd4\ -E\xc5\xec\x00\x07k\x00\xe8V\xe3\x8d5G\xf8\xb3E\ -\x07\x92N,{?\xab\x7f\x99Z\xe5\xcf\x849\xd5\x96\ - qJu\xaaK\x16q\xd2<\x83Bk\xd4+\x0c\ -\xb4V9\xd1R\x13=\x99\x90.\x18J\xf2\xa0\xb6+\ -\x88\x96\x18\xa1\x8e+\xc0M\x83[I&V\xdf\xa5\x91\ -LLWF\x1e\xa9\xaa\xaa\x16\xa1\xa2,\xa1\x9d\x993\ -\x91UO\x91c\xcdy\x17\xe6\xbcC\xdds\xe1e\xe6\ -\xdc\xce\xaa\xa9%\x97\x00K\xfb`o\xadp\x96r\x09\ -\xaf0\xeet\x12\x5cX\x08!\x1a8J\xaa\x13Y|\ -V.YZ\xe3\x13\xc6\x1cG\xc3\xd1\xea\x13\xc9\x1c\x03\ -k}\x98<\xff`\xdcz,IC\x08\xcfc0\xf7\ -a\x8c-,e\x13T\x9f\x09\xea\x9c\x85Xt\xac\xb6\ -j`\x9d0\xdb\xeak\xcf\x5c\x01A\x92\xe5\xbf:\xac\ -K=\xfbwD\x970\xb2\xa6\xd4\x16\xf2\xab\xff-\x96\ -\xb9\x15\xb6\x1f;n\x83\x11\xac\xd46aDk\xd6h\ -,\x0a\x13I\x81\xce\xacU\x19\xeb\xb5 JS\xa8U\ -M\xbc\xedXU\x9e\xd4\xbb7HJ\xed=\xc4\xa8\x91\ -S{\x8b\xe0\xb9\xc4\xa8Q+i\xe3p\xcd`\xbc\xc9\ -\xa9:r\xc4L\x188\xdc\xe0\xdf\x869\xc9He\xe5\ -mSd\xd0\x99\xf5u\xbc$:f\xeb\x9f\xb5\xfdN\ -\xcb\xc5D\x96\xed\x80p\xee\xa80\x9bt\x03h-m\ -\xc0\xadx\x8c\xf6\x13\xf5\xd6\xee\xc7\xde\x12\x19}0$\ -\xa3\xa4H\xd6\x0a\xe5\x17\x9a\x0d\x9a:\x9d\x18c\xfc\xba\ ->\x99\xc6\xa2\xba\x1d\x9dD\xa11\xe5)\x8a\xea\xf89\ -)iHG\x97\x9b2\x8c\xe9y\x99\x83\xadM\xa9\xad\ -\xd5\xbbNd\xbbb\x9daR\xb2F]d\xb5\x94\xb3\ -\xa5\xf0\xe9Vo\xb4\xae\x8a.T\x98\x99\xb6\xd4\xae\x94\ -6\x98\x1a\x88>\xdc\xea]7\xbaCA\x11\xb3\xc3\x95\ -e\x5cWK\x82\x94\x015\x01\xa8\xc6\x10\x9d\x16\x7f\xed\ -L:=t\x98F\x9am8{\x0d\x18\xf2\x16_i\ -\x01\xd3(\xdf\xe2\xef`\xc0\xa6\xb7\x9e7s\x07\xf5\xb0\ -\xa4\x83\x7fAb%\xa9\xf5\xf7`\x9cx\x09\x85\xcc9\ -\xc6 \x82\x93\xd5&\xca\xb7\xfcSP\x05\x98;a\x17\ -iO\xa8\xaa\x93U?\x13)\xb3\xc3q\xac<\x13\xce\ -/\x11'\xe6\x8c\xa8\xa6`\xba\xaaSd:\x91\xda\xda\ -\xda\xda\xd9J\xed\xec\xa4\xae\x0e\xf6\x0e\xae\x9e\xceR\xa9\ -\xb3g{wwOw\xf7\xf6\xaeR\x86\xea\x9f\x86\xa1\ -\x1c\x1d\x1c\x1c\x9d\x1c]\x9c\x9c\x5c<\x9c\x9c\x9c<\xf0\ -\xe0\xe4aI\xe2\xda\x94\x0c\xaa> \xae\xb6\xa0|\xbe\ -\x90\xf2!\x02WJ\xe8JU}\x03\x05\x95T\xed\xa5\ -\x12AK1\xc5Pm8!\xa1\x04\x22\xb1\xc4\xc6\xd6\ -\xce\xde\x81\xaa\x1fH\x11\x81\xd0\x1a\xe8B(\x11%\x14\ -\x88\x04b\x1b\x89\xadX(\x0d\x87@W\xa1\xa8\x9b[\ -\xa88y\xa8\xc2\xddg\xc2\xd40\x89\xc7\xfc\x95o\xa4\ -t\xf7\xf5\xcc\xd9]\x10\x1ea\x98vHn\xe3\xb7 \ -\xb7\xf2\xf4\xafJc\xa4\xd7\xaa-\x8f\xfb\xa7>\x9b\xa7\ -J\xdb\xb3\xda\x14\xd5\xee\xf0\xb0\xef\xe9\xdf\xde\x9c\xfe\xe1\ -\x11\xf3\x99\xcb\xfd\x03\x16\xaey\xe2\xad\xe7\xf6\x1e\xfd\xef\ -\xef/o\xddw\xec\xec\x95\xe1\x85\xa53\x16\xad\xdd\xf6\ -\xd1\xf1\x1f\xaeF\x0f\x18QT6\xf3\xf9W\xb6\xef?\ -q\xee\x9a+\x11\x08@[\x11\xa3\x93\x8dD\x1c\xc9\xa8\ -\xd0-\xd4M\x04\x1aL\xf0q\x17\x87M\x9d\xef\x81\x1a\ -\xec\xce9T\x19\xee[p\xda0m\x81<\xd7Si\ -\x8c\xf8\xd5O\x82\x0a\xd8\xf8G\xee9\x0cJ\xacn\xa7\ -J\x1b\x16e\xa2\xbf\xafQ\xa1q\x0d\x02jU\xa8\xfa\ -\x8aH\x85\x8cLW\x92H\xae\xe4-\xc8\xf0\xeb\xe9\xbb\ - c`\x86\xef\x82\x9c\x05\x19\xbe\x0b\xd7T{dU\ -}q\xbb\xc0C\xb7\x0b<|\xbb\xc0#\xb7\x0b\ -!\xc02\xd4m\x03\x9b\x08^[\x8b\xeb\xf2P\xe6\x9a\ -Q^\x07j\xfd\x1a\x8a\xa7[\x05m0\x8c\x06\x85\xf3\ -j\xfd\x0a\x96\x10\xb2\xfd\x09B\xda\x7fU\xeb\xe7\xfb\x12\ -\xd4Q\xb8n\xdb>g\x95\xc7\x0b\xeb\x0b\xebc\x1fj\ -Z\x19\x84\x06\xad\xe1\x8e\x11\x9a\x00K^\x10fWc\ -\x1eY\xaa\xa5\x97\x93\xa1\xdd\x94\xd0\x97\x99\x0d2\x18\x89\ -+iY`\xfdJ|\xcf\x09\x1b\xd6\xa3O\x0e]H\ -\xe3\x88\x9f\x96\x0d\x87Z\x06\x13\x16\xb8\xdcZ\x95\x9a\xf9\ -n\x89Z\xdb\xd8E\xbc\xc7d\xf5\xb0\xd4k\xc0}\xcd\ -M\xe216\x88\xb8|\xeeA\x84?\x1f \x22w\x07\ -\x22\x1c\xf3\x22\x84P5\xd7m\xb0\xddp\x82w\xde\x88\ -\xae\xe7,\xf5\x9e\xa1\x81!\xa7`.\x1e\x8cjf\xa0\ -E\xe49y2\xa5\xd9Pj\x09c\xc6Vb\x98C\ -8\x13\x0f\xd2\x01f6\xddI\x0f\x18\xfd\x87A#\xd3\ -\x97$\x9142\x90d\xc1Lg\x14y\x08\xe66\xc5\ -\xa4\x04\xe69ed2\x99Jf\x90\xd9d\x1ey\x8e\ -,%+\xc8\x1a\xb2\x9el\x22[\xc8v\xb2\x8b\xec&\ -\x1f\x91\xcf\xc8\x17\xe4\x189E*\xc8Y\xf2\x13\xa9$\ -W\xc9u\xe8\xecl(G\xca\x9d\xea@u\xa5\xfc\xa8\ -\xdeT\x18\x15C%Pi\xd4`*\x87\x1aE\xe5S\ -E\x94\x962S\x93\xa9\xc7\xa9\xd9\xd4\x02j)\xb5\x92\ -ZO\xbdA\xbdM\xed\xa6>\xa1\x0eQ_R\xa7\xa9\ -\x0b\xd4o\xd4_\x02\xa1@*\xf0\x10t\x16\xf8\x0b\x82\ -\x051\x82d\xc1 A\x9e\xe0AA\x91`\x82`\x92\ -`\xba\xe0\x19\xc1b\xc1*\xc1\xab\x82m\x82\xdd\x82\xcf\ -\x04\xc7\x04\x15\x82\x9f\x04W\x84D\xe8 \xf4\x12v\x13\ -\x06\x0ac\x84ra\x96p\xb4\xb0Ph\x10>*\x9c\ -%\x5c$\x5c%\xdc$\xdc)\xdc/<\x22\xac\x10^\ -\x14\xfe)\x92\x88\xdcE2Q\xa0\xa8\xaf(]4L\ -\xa4\x14M\x10=*\x9a#Z*Z'\xda&\xda+\ -:\x22:-\xaa\x14\xdd\x14;\x8a\xbd\xc5\xbd\xc5q\xe2\ -\x0c\xf1Hq\x91\xb8L\xb7;kw\xdd\xde\xd5>\xc0>\xde>\xcf~\x9c\ -\xfdT\xfb\xc5\xf6\x9b\xec\xf7\xd9\x7fm\x7f\xd9\xc1\xc1\xc1\ -\xc7!\xd6a\xa8\x83\xdaa\x8a\xc3b\x87\xd7\x1d>v\ -8\xed\xf0\xa7\xd4M\xdaK*\x97\x8e\x91\x9a\xa5\xcfH\ -_\x91~ \xfdRz\xd9\xd1\xd1\xd1\xdf1\xc9q\xb4\ -\xa3\xc9\xf1\x19\xc7\xf5\x8e\x1f:~\xeb\xf8\x87\x93\xbbS\ -\x90S\x86\x93\xca\xe91\xa7eN\xdb\x9c\x0e;]r\ -\xb6s\xf6sNv~\xc8y\x92\xf3\x22\xe77\x9d?\ -w\xbe\xe8b\xe7\xe2\xef\x22wQ\xb8<\xea\xb2\xcc\xe5\ -m\x97\x13.W\x5c\xdd]C]\xb3\x5cK\x5c\xe7\xb8\ -np\xfd\xc4\xf5\xbc\x9b\x8d\x9b\xbf[\x9a\x9b\xcam\xba\ -\xdbj\xb7\x0f\xdd\xce\xb8\x0b\xdd\xbb\xbb\xcb\xdd\x95\xee\x8f\ -\xbb\xafq\xdf\xe7~\xd6C\xe2\x11\xe0\x91\xe11\xcec\ -\xb6\xc7k\x1e\x07=*=\xdd<#<\x87{\x96{\ -.\xf3|\xd7\xb3\xc2K\xe8\xe5\xef\x95\xe1\xa5\xf1\x9a\xeb\ -\xb5\xc5\xeb\xb8\xd7_\xed:\xb7KnG\xb7{\xaa\xdd\ -\xa6v\x87\xdb]k\xdf\xa9}R{\xba\xfd\xac\xf6\x9b\ -\xdb\x1fk\xffW\x07Y\x87\xb4\x0e\xe3;\xcc\xef\xb0\xbd\ -\xc37\x1dE\x1d{u\x1c\xda\xb1\xac\xe3\x8b\x1d\xf7u\ -\xbc\xd8\xc9\xa3S\xdfN\xcaN\xb3:m\xe9\xf4\x95\xb7\ -\xc0\xbb\x97w\x8e\xf7\xc3\xde\xab\xbd\x0fx_\xe9\xdc\xa5\ -\xf3\x80\xce\xfa\xceK:\x7f\xd8\xf9b\x17\xaf.I]\ -\xc6uY\xd8\xe5\xbd.\x17\xba\xbawM\xe8\xaa\xee\xba\ -\xb0\xeb\xfb]\x7f\x94y\xca\x92e\x1a\xd9b\xd9^Y\ -e7\xefn\xe9\xdd\xcc\xddVv;\xd8\xed\xbaO\x80\ -\xcf0\x9fi>\x9b}\xbe\xe9n\xdf=\xa6{a\xf7\ -\x85\xdd\xf7t\xaf\xf4\xed\xea\x9b\xe9;\xd9w\xa3\xefW\ -~v~1~\xc5~\xcf\xfb\xed\xf7\xbb\xe6\x1f\xe0?\ -\xc2\x7f\xa6\xffv\xff\xf3\x01\xed\x032\x02&\x05l\x0c\ -\xf8\xba\x87c\x8f\xc4\x1e\x13z\xac\xeaq\xb4\xa7\xa4g\ -L\xcf\xf1=_\xe8\xf9E/A\xaf\xc8^\xc5\xbd\x96\ -\xf5\xfa\xbc\xb7\xa0wTou\xef\x17z\x1f\xea#\xee\ -\x13\xdbG\xdbgU\x9f\x13\x81\xd2\xc0\xe4\xc0\xd2\xc0\x8d\ -\x81\xa7\x83\xbc\x82\x06\x07M\x0b\xda\x1et)\xd87x\ -t\xf0\xfc\xe0\xfd\xc17C\x22C4!kBN\x85\ -\xba\x85\x0e\x0c\x9d\x16\xba3\xf4\xb7\xb0^a\xca\xb0e\ -aG\xc3\x1d\xc3\xfb\x87?\x16\xbe#\xfc\xd7\x88\xde\x11\ -t\xc4\x8b\x11'#\xdd#3#gF\xee\x89\xfc;\ -*:\xca\x10\xb5)\xeaB\xb4ot~\xf4\xf2\xe8\x13\ -1\x1e1\xd91sb>\x8e\x15\xc7\xa6\xc4>\x16\xbb\ -+\xf6\xcf\xb8\xa88S\xdc\x96\xb8_\xfa\x06\xf6\x1d\xdf\ -wC\xdf\xf3\xfd\x02\xfa\xd1\xfd\xd6\xf4;\x13\xef\x13\xaf\ -\x88_\x19_\x91 K\xc8Ox)\xa1\x22\xb1[\xa2\ -\x22qU\xe2\xf7I\xdd\x93TIk\x93\xce%\xf7L\ -\x1e\x97\xfcj\xf2\xa5\x94\x90\x14C\xca\xd6\x94k\xf28\ -\xf9#\xf2\x0fR\x85\xa9\x03Rg\xa5\x1eLsK\x1b\ -\x96\xb64\xed\xdb\xfe>\xfd\x8b\xfao\xec_9 r\ -\xc0\xc3\x03>H\x17\xa7\x0fJ\x9f\x9f~\x22\xa3s\x86\ -2c}F\xe5\xc0\xe8\x81\x8f\x0c\xdc;H:(w\ -\xd0\xd2A\xdf\x0f\xee5\xd80xg\xa6 s`\xe6\ -\xb3\x99_\x0f\xf1\x1b\xa2\x1d\xb2=\x8bded=\x9b\ -\xf5Mv@\xf6\x84\xecw\x86J\x86f\x0f]6\xf4\ -\x87\x9c\xd0\x9c\xc99\xfbs\xdds\xc7\xe6n\xc8\xbd\x9a\ -\x97\x9277\xef\xd4\xb0\x1e\xc3\xcc\xc3\xf6\x0cw\x1e>\ -f\xf8\xfa\xe1\xd7F\xa4\x8eX0\xa2bd\xf0\xc8G\ -F~6\xaa\xe3(\xf5\xa8\x1d\xa3mF\x0f\x1f\xbdv\ -\xf4\x95\x07\xd2\x1ex\xee\x81\xb3c\x22\xc7\xcc\x18s\xfc\ -\xc1\x80\x07\xcb\x1f\xfc\xe4\xa1\x8e\x0fi\x1ezw\xac\xf3\ -X\xc5\xd87\xf3\xc5\xf9#\xf27\xe4\xdfPd)V\ -)\xae\x14d\x14,/\xa8T\xca\x95\xcf+\x7fR%\ -\xa9\x16\xaa.\xd0\xf1\xf4\x02\xfa\x5ca|\xe1\x82\xc2\xf3\ -E\xf1E\xcf\x16](N,^T|Q-W/\ -U\xff:.}\xdc\x8aq\xd7\xc6g\x8d\x7fe|\x95\ -f\x84fs\x89mI~\xc9\xdbZ7\xedx\xed^\ -]\x17]\xb9\xee\x90\xbe\xb7~\x86\xbebB\xdc\x84\xe7\ -&T\x1a\x06\x19\xd6\x1a)\xe3\x83\xc6\x1d&\x0f\x18L\ -\x1d0\xf70?a>]\x9aP\xba\xac\xf4\x8f\xb2\xe1\ -eo\x96\xbb\x96k\xcb\x0fL\xec5\xf1\xa9\x89\xe7&\ -\xf5\x9f\xf4\xf2\xc3\xa2\x87\x95\x0f\xef\x99\xdcm\xf2\xd4\xc9\ -\xa7\x1fI~d\xe5\xa3\xd4\xa3\x05\x8f\xeey\xac\xfbc\ -\xd3\x1f;;e\xc0\x94uS\xed\xa7\x8e\x9f\xfa\x9fi\ -!\xd3\x16L\xfb\xfd\xf1\x11\x8f\xef\x9c\xdey\xfa\x94\xe9\ -g\x9e\x18\xf0\xc4\xc6\x19N3\x0c3N\xcc\xec;s\ -\xc5\x93\xa2'\xd5O\x1e|*\xfc\xa9%O\xdd\x9c\xa5\ -\x9a\xf5\xe9\xec\x90\xd9\x8bf\xdf\x98\xa3\x9c\xf3\xe9\xd3\xa1\ -O/~\xba\xea\x99\xc2g\x0e\xce\x8d\x9a\xfb\xe2<\xc9\ -<\xed\xbc\xe3\xf3\x13\xe7\xaf[\xe0\xba`\xd2\x823\xcf\ -f>\xbbm\xa1l\xe1\xac\x85\xbf?7\xf6\xb9O\x16\ -E,Z\xf1\xbc\xfd\xf3\xe6\xe7+\x16\x0f^\xbcc\x89\ -\xef\x92yKn,-^zlY\xca\xb2\xcd\xcb\xbd\ -\x97?\xb5\xfc\xda\x0b\xaa\x17\x0e\xbf\x98\xf4\xe2\xa6\x15\x9d\ -W\xcc^\xf1\xd7K\xea\x97N\xae\x1c\xb0r\xdb*\xff\ -U\x8bVKV\x97\xae\xfea\xcd\xf05\xfb_\x8ey\ -y\xfd\xda\x8ekg\xaf\xfd\xfb\x15\xed+\x15\xebr\xd6\ -\xed]\x1f\xbd~\xfd\x06\xef\x0ds7\x0a6\x9a7^\ -xu\xcc\xab_\xbc\x96\xfa\xda\x8eM\x81\x9bVn\xf6\ -\xda<\xfbu\xf2\xba\xf9\xf5\x1f\xdf\xc8\x7f\xe3\xf8\x96A\ -[\xf6\xbc\x19\xf3\xe6\xa6\xb7\xfc\xdeZ\xbe\xd5}\xeb\xac\ -m\xd4\xb6\x89\xdb*\xb7\x17o\xaf\xd81j\xc7\xa1\xb7\ -\x07\xbe\xbdgg\xdf\x9d[\xdf\x09z\xe7\x95]\xddv\ --{\xd7\xf3\xdd\xb9\xef\xd9\xbf7\xfd\xbd\xaa\xf7'\xbd\ -\x7f\xe5\x03\xfd\x07\x17w\x17\xed>\xb3g\xec\x9eS\x1f\ -\x8e\xfc\xf0\xe8\xde\xa1{\x0f\xee\x1b\xb4\xef\xe3\x8f\xfa\x7f\ -\xf4\xe1\xfe\xe4\xfd\xef\x7f\x1c\xff\xf1\xaeO\xe2>y\xfb\ -\xd3\x98O\xb7\x7f\x16\xf5\xd9\xb6\x03\x91\x07\xb6\xfe'\xf2\ -?[\x0fF\x1d\xdc\xf6y\xf4\xe7;\xbe\x88\xfdb\xe7\ -\xa1~\x87\xde;\x9cxx\xf7\x91\xd4#\x1f\x1d\xcd8\ -\xfa\xd9\xb1!\xc7\x0e\x1d\x1fv\xfc\xe4\x891'*N\ -\xaaN\x9e\xffR\xf3\xe5\xaf_\x95~u\xfd\xd4\x94\xaf\ -\xc5_\xcf\xfa\xc6\xe5\x9bE\xdfz\x7f\xbb\xea\xbb\x9e\xdf\ -m\xae\x88\xaax\xf7t\xea\xe9\x03\xdf\xe7~\x7f\xea\x8c\ -\xf2\xccO\xff5\xfe\xf7\xc6\xd9\xe9?8\xfe\xb0\xe8\x5c\ -\xd7s\xeb\xcf\x87\x9d\xdfu\xa1\xff\x85/~|\xe0\xc7\ -\xb3?\xe9\x7f\xba~q\xc6\xcf\xae?/\xbf\xd4\xe3\xd2\ -[\xbf$\xfdr\xa0rd\xe5\xd9_\x0d\xbfV\xfd6\ -\xe7r\x87\xcb\xaf\xfc\x1e\xf1\xfb\x9e+\xd9W\xbe\xbdZ\ -r\xf5\xfa\xb5Y\x7ft\xf8c\xdd\x9f1\x7f\xee\xffk\ -\xc4_\xe7\xae\x97\xdd\xb0\xb9\xb1\xf8\xef\x9e\x7f\xef\xbc9\ -\xe8\xe6\xd7U%5+\x93<<<<<<<<\ -<<<<<<<<<<<<<<<<\ -<<<<<\xffbl\x81\x91@[\xeb\xf1oe\ -\x05\x80{e^\x04\xf0Z\xb4\xb5>\xff&\xb0\xde\xb3\ -\xf7+}\x06t\x01ZBVG`\x180\x13\xd8\x01\ -\x1c\x03~\x00\xaeU\x83\xee\xe3\xc0\xdb\xc0\x93\xc0p\x00\ -\xd3\xb4\x84.\xf7\x0bX\xdf\xb1\xde\xb3\xaf\xc1\x8f@\x0a\ -\xc0E\xfe\x9d\x802`?p\x13hx\x97Z\xe3`\ -\x9aO\x80r\xa03\xc0\x85N\xf7#%\xc0_\x80\xb5\ -\xdc7\x00\x1dp\xaf\xf9\xc5\x00\xeb\x80\xeb\xc0\xdd\xda\xbc\ -10\xaf\x0d@\x1c\xc0e\xd9\xef\x17\xfa\x02\xe7\x00v\ -\x99\xd7\x02\xf6@S\xf3\xf0\x06\xd0F\x5c\xd9\xbc1^\ -\x05Z\xaa\x9dlK:\x00\x1f\x01\xec\xb2\x1e\x02|\x80\ -\xdb\xa5\x93\x00\xd8F\xfc\x0e\xb4\xb4\xed\xad\x5c\x01&\x01\ -6@k\xd9\xa75@[.\x01\xd8e\xbd\x04\x0c\x00\ -\x1a\x8a\xdf\x1f\xf8\x12h-\xbb\xd7\xe7\x14\x90\x0e\xb4\xb6\ -\x9dZ\x9a\x02\xe0\x0f\xc0Z\xce\xbf\x01\xecK\xad{\x1e\ -\x05\xc0\x13@[\xd9\xbd>8fB\x9d\xda\xdan\x5c\ -\x12\x09|\x0f\xb0\xcb\xf9\x1a\x80\xed\xfcV\xa0\xadl\xdd\ -\x18\xdb\x01\x17\xa0\xad\xed\xc6%\x9e\xc0\xfb\x00\xbb\x9c\x7f\ -\x02md\xe2;\x82\xedQo\xa0\xad\xed\xc6%\x22`\ ->\xd0\xd6\xb6m*\x97\x814\xa0\xad\xed\xc6%\xa9\xc0\ -\xfd\x5c\xef\xeb\x83s\xea\xff\x97k\x80c\x1c,\x0f\x17\ -v9\x0b\xe0\xbd\x84c\x96^\x80#\x80\xdfB\xf0\x07\ -\xce\x00\x5c\xc8\xb0\x82:\xa3\xeemm\xbf\xe6\x80\xe3N\ -.l_\x01\xe4\x02\xb7\x1b\xa3`\xdb\xcd\x85\xdd\xd9\xa0\ -\xee\x8d\x8d\x9d\xefwp\xfc\x83\xf3\x9c\xe6\xda`\x0e`\ -\x07\xdcI^K\xd8\x1f\xc12D\x00\xada3\xae\xc0\ -\xf9}\xfd\xf5\x88\xbb\x05\xe7\x0c\xe3\x80\xa6\xcal)\xfb\ -#X\x96\x7f\xca\x1a\x1e~\xc7\xe6\x08\xd0\xdc2\xdf\xed\ -\x1a^K\xda\x1f\xc1\xb5\x14\xecoZ\xcan\x5c\x80\xf3\ -\xdb\xb7\x00.\xca\x8bm~(\xd0T\xd9-m\x7f\xe4\ -\x0d\x80\xf5\xdd\xa2\xfb\x8e\xc9@s\xcb\xc8^\xeb\xbf\x0a\ -<\x084Evk\xd8\x1f\xc1u\x94\x96\xb6\xe3\xbd\xd0\ -\x0f\xc0\xb5\xff\xe6\x96\x0f\xc7\x97\x95\x00\xdbo\x1e\x80\xf3\ -\xb8\xdb\xc9o-\xfb\xe3\xb3\x84h\xa0\xb5\xec\xda\x14\xb0\ -\xcd\xc7\xf6\xa2\xb9e\xc3<\xc4\x80\x1fp\x14`\x87\xed\ -\x01\xda\x01\x8d\xe9\xd0Z\xf6G\xbe\x02\xee\xe6\xd9FK\ -\xf34\xc0E\xb9\x9e\x02\xacy\xe2\xbc\xaa\xfe\xf3\x98\xff\ -\x02\x8d\xd5\xbd\xd6\xb4?2\x15h=\x0b7\x0e\xae\x19\ -\xe2\x9a\x09\x17eJ\x02\xea\xe7\x8f\xcff\xd8\xed\x1a\xae\ -c\xa8T*U\xfdx\xadm\x7f|\xae\x81u\xa4U\ -\x8c|\x1bJ\x01.\xca\x83}-\xb6=\x0d\xc9\xc0\xf5\ -\xa3\x8b\x00;\xfeR\x00\x9f\xf7X\xe3\xb4\xb6\xfd\x91\x09\ -@\xebY\xbaa\xb8Z\xcb\xff\x1a\xb8\x9d\x1c\xfc`\xf9\ -A\x80\x9d\xe6c\x00\xdf\x93\xc0p|\xce\x19\xd0D\xb8\ -z\xe6\xb6\x05h\x1d+7\x0eWe\xd9\x0b\xdcI\x16\ -\xaeC\xac\x06\xd8\xe9\xce\x03\x09\xc0\xdd\xe8\xfc\x1e\xc0\x85\ -\xce'\x80{\xb7\x1c7`\xbb\xc1EY\xde\x04\x9a*\ -S\x0f\xb0\xdfOA\xb7F\xa3\xd145\xfdf\x80\x0b\ -\x9d\xb1\xec\xf7f5\xee\xf8\x0e\xe0\xa2,\xf8\xee\xc4\xdd\ -\xc8\xc5:\x8fu\x9f\x9d\xc7*\xa0)ku8\x96\xe5\ -B\xe7o\x81{\xb7\x1c7\xbc\x03pQ\x96o\x80\xbb\ -\x95\x8dm?\xf6\x01\xec|\xb0\x8f\xc0\xbe\xe2v\xe9\xb8\ -j3\xf1}\xc7{6\x1cG\xe0\xbb\x03\x5c\x94\x05\xd7\ -\xda\xd9\xe3\x99\xa6\x82\xef\xf0,\x07\xd8y\xe1X\x09\xc7\ -L\x0d\xc5\xc71\x16\x17\xeb\xe2\xc8t\xa0\xf9\x16l\x1e\ -]\x01.\xd6\x1d\x90\xe6\xbc;Z\x08\xb0\x9fq\xa2N\ -f\xa0~\xbcD\x80\x0b]Q\xd6\xfd\xf2\x8e\xefz\x80\ -\x8b2\xcd\x06\x9a\xa3\x07\xbe;\x8asdv\x9e8\x87\ -v\x00\xacqp\x8e\xcd\x85\xae\xf8\xeeq\xf3-\xc7\x0d\ -8\xf6\xfe\x0dhn\x99\xf0}\xa1{i\x83\xd8\xe0\x1a\ -Q\xfd\xfe\x15\xd7\x92|\x01\xcc\xfb4\xd0\x5c=\x7f\x01\ -\xac\xf3\x8e\xfb\x85\x87\x80\xe6\x96\x0b)\x06\x9a\xab\x0b\xb6\ -\xf1\x0b\x81\xfa6{\x16\xe0B\xc7\x11\x00\x176\xe3\x1a\ -\xeb~\x98\xe6\x80\xf5\x93\xdd^4\x07\xac\x13\xec\xe7\xff\ -\xf7\xb2\x8f\xa0>\xb8\xee\xc1\x85n-\x01\x8e\xbd\xeb\xaf\ -\x11\xdc\x0bk\x00\xaet\x0a\x03\xb8X\x1bG\x0e\x00\xf7\ -\xfb;\xd3\xf8\x9c\x1a\xdf\xd3inY\xef\xe6\xd9\xfb\x9d\ -\xe0b\x8d\x10\xfb\xf5\xfb\xad\xcdo\x8c\x10\xa0\xb9k\xd2\ -\xd8V\x18\x80\xe6\xea\x82c\xd0\xe6\xb6;8\xb6\x08\x06\ -\xb8\xb0Mk\x91\x01p1/x\x0e\xb8\x97\xf7\x0e\xf0\ -\x99\xdcb\xa0\xb9\xf2\xb1\x0c\xff\xd4=\x02c\x00.\xae\ -\x01\xeeo\x1c\x0b4\xf6|\x80\x0d\x8e1\xf3\x81\xfak\ -C\xf7j{,Ck\xd8\xaa\xa5\x18\x05p5?\xc6\ -gN8\xef\xc1\xfd\xa58\xd7\xf2\xae\x06\xdd\xe8\x87\xe3\ -/\x1cgr!\x0buF\xdd\xdb\xda~\x5c\x90\x07p\ -\xb9\x9f\xb1\xa5A\xdb\xe3~\xe3\xb6\xb6\x1b\x97d\x03\x5c\ -\xbd\x07\xdd\x1a<\x03\xdc\xe9\x9d\x97\x7f\x1a\xe1\x00\x17\xf3\ -\xff\x96\x82\xbd\x8f\x19\xc1\xbd;\xb8\x87\xa7\xad\xed\xc6%\ -\x1e\xc0\xbb@[\xd9\xb81\xd0\xd6\xf8\xdc`\x13\xc0\xf6\ -\xc75)|\x97\xbb\xad\xed\xc6%B\x00\xd7:\xdb\xca\ -\xd6\xf5a\xb75\xf8~\xe7\xc3\x00\xbe\x7fm\x0d\xc7\xbd\ -\x9c\xb8\xa7\xb3\xad\xed\xc658Gh\x8b\xf7F\xac\xe0\ -;\x17\x83\x80\x86t\xc31?\x8e\xb7\xd8\xf1\x17\x01M\ -\x19\x03\xff\x93h\x8b\xfd\xef(\xab)\xfb\xdfq]\x1d\ -\xdf;g\xa7\xdd\x07\xe0^\xff\xd6\xb2Ok\x81k+\ -\xf8\xcd\x88\x96\xb6=~\xdb\x03\xe7\x0cM\xd5\x0b\xdf\xf3\ -\xac\xaf\x17\xce\x07\xf1\x9b\x17-i\x8f\xb6\x02\xc7H+\ -\x01\xf6\xfe\xf9\xe6\x82\xcf\x0a\xf1\xdd\x88\xe6\xec#\xc2\xb5\ -(\xf6<\x12\xc7J\x5c\xae\x11\xdeo\xe0\xb8\x0f\xbfm\ -\x83c\xa5{\x99\xbba\x1a|\xcfJ\x0bx\x01\x5c\xe8\ -\x94\x0c\xe07\x8e\xd8rp\xce\xfd\xff\xfe\xed/W\x00\ -\xfbjl\xb3\xf1y.~\x93\xe9$\x80k<\x17\x00\ -t\xe3{(\x1b\x01\x8c3\x10\xc04-\xa1\x0b\xae\xaf\ -\xe3\xb7\xbe\xd8\xd7\x80\xff\x06^\xeb\x82\xf5\x9d\xfd\xed\xbb\ -\xb6\xd6\xe7\xdf\x0a\xd6\xfb\xff\xf7\xb6\x87\x87\x87\x87\x87\x87\ -\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\ -\x87\x87\x87\x87\x87\x87\x87\x87\xe7\x1f\x81\xf0%\x8a\x08\xe1\ -\x97\x82?\xf2\x92\x80\x88\x187!\xf9/\x09k\xdd\x96\ -\xa8\xff\x03;\xbc\xca\x99\ -\x00\x00\x087\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / slice \ -/ not active - s\ -aved\x0d\x0a \ - Created \ -with Sketch.\x0d\x0a <\ -/defs>\x0d\x0a \ -\x0d\x0a \x0d\x0a <\ -path d=\x22M3.11645\ -814,1.98491547 C\ -1.81085731,3.256\ -48192 1,5.033548\ -03 1,7 C1,10.691\ -145 3.85693233,1\ -3.7150177 7.4801\ -6927,13.9809903 \ -C7.55923919,13.9\ -867947 7.5433296\ -9,11.4601372 7.4\ -3244079,6.401017\ -95 C4.76920501,3\ -.70741298 3.3305\ -4412,2.23537882 \ -3.11645814,1.984\ -91547 Z\x22 id=\x22Com\ -bined-Shape\x22>\x0d\x0a \ - \x0d\x0a <\ -path d=\x22M14.9826\ -165,6.50282053 C\ -14.7276121,2.868\ -84654 11.6988335\ -,0 8,0 C6.821531\ -33,0 5.71107957,\ -0.29121506 4.736\ -68211,0.80560781\ - C5.52211072,1.5\ -7704166 8.929157\ -37,4.97484587 10\ -.4514738,6.50452\ -22 C10.82345,6.5\ -0282053 14.72604\ -01,6.5045222 14.\ -9826165,6.502820\ -53 Z\x22 id=\x22Combin\ -ed-Shape\x22>\x0d\x0a <\ -path d=\x22M12.3449\ -55,7.6097276 C12\ -.344955,7.609727\ -6 13.3370708,7.7\ -3374209 14.60803\ -62,8.42756253 C1\ -4.2393452,8.7623\ -7994 12.344955,1\ -0.6534218 12.344\ -955,10.6534218 L\ -12.344955,7.6097\ -276 Z\x22 id=\x22Trian\ -gle-2\x22 transform\ -=\x22translate(13.4\ -76496, 9.131575)\ - rotate(90.00000\ -0) translate(-13\ -.476496, -9.1315\ -75) \x22>\x0d\x0a \ - \x0d\x0a \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x05(\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \x0d\ -\x0a \x0d\x0a <\ -/g>\x0d\x0a \x0d\x0a<\ -/svg>\x0d\x0a\ -\x00\x00\x05\x14\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a <\ -g id=\x22lock_on_No\ -tTransparent\x22 tr\ -ansform=\x22transla\ -te(3.000000, 1.0\ -00000)\x22 fill=\x22#E\ -9E9E9\x22 fill-rule\ -=\x22nonzero\x22>\x0d\x0a \ - \x0d\x0a \x0d\ -\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x07o\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / out\ -liner / visible \ -/ mixed state - \ -hover\x0d\x0a \ - Created\ - with Sketch.\x0d\x0a \x0d\x0a\ - \ -\x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \ - \x0d\x0a \ - \ -\x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ -\x0d\x0a\x0d\x0a\ -\x00\x001/\ -\x00\ -\x01\x04 x\x9c\xed=\x07@SW\xd7\xf7%\xec\xa5\ -lpF\x147#\xcc$\xa8\x88\xb8P\xa9\x0a\x8a\xa3\ -\xfaIH\xc2\xd0\x90`\x12\xdc\xab\xcb~\xd5\xd6\x81\xd6\ -]m\xd5\xda\xaa\xd5\xd6Zg\x9d\xe0.8\xab\xb6\xda\ -\xe1\xde\x0a8\x90\x99\xfc\xe7\xbc\xe4a\x8c\x8c\xa0Q\xfb\ -\xf7\xcb\x0d\xe7\xbd;\xce=\xe7\xdcs\xef;\xf7\xdc\xfb\ -\x06\xb1\xb1\xa4-!\xc4\x86x\x115\xb1\x80\x18E\xb4\ -\x076}J\x84\x03\xa5\x17g\xd1q\xc0\xa3\xfc)\xb6\ -.\x1f\x90)+]\x9c\x05\x07g\x86\xce\x90\x06\x94\x8b\ -\x1e\x8e\xbb.\x8e\xb5=\xf4hz2\xf8s\x08\xd5\x80\ -Xj\xe3T\x18\xd5\xb02\xde\x89j\xa4G\xa7\xb5\x1e\ -/.\x1e\x89\x0f\xc4\xbaSAt\xdc\x0d\xe2\xa9T\xdc\ -3|\xd6.\xa7\xe7\x0d\xc3x\ -\x83_!\xbf'\xea\x05\xf4\xa4\xfd\xd9\x95O#\xa4U\ -}\xe6\x1c%\x96'I8\xfdR\xe5*\xb92U\x9e\ -\xc1\x89\x8e\xe6\x04\x05r\xc39\xad\x07\xa5\xc9\xc4\xf2\xb1\ -\xca6\x04\x93\x82\xc0\x10\xf8\xe3p\xb9\x82 \x9e\x80\x1b\ -F:D\x8e\xcb\x10\x8aFIT\x9c$IJ\x9a\xac\ -\xa3O\xfe\xcf{}8i\xe2\x8e>\x83Bc\x03c\ -3\xa2%\xa9i='($\xf1\x13\xde\x19 \x9a0\ -J\xc4\x17\xfbDv\xb2\xeb0N0.=#]\xa2\ -\x12r\xc6\xa5KeJ\xc1\xb8\x8e>B\xe4/\x808\ -f\x07\xf8ph\x14\xd5\xa8\x8e>Z\xc1\x06\xc7\xf6\xe3\ -D\xcb\x15\x12N\xa8\x7f\x98\x9f\x88\x1b\xcc\xe3\x84\xf3\xfd\ -\xb9\xa1|^PH{\x144, \x90\x1f\xc0\x0d\xf1\ -\x0b\xe4\x0a\x02\xf9\x82@.G\x17|:\xd9\xc1\xb1\x83\ -B\x9c,\x88\xeb\xda]\xc7\x0eR\x1d}RU\xaa\x0c\ -A@\xc0\xd8\xb1c\xfd\xc7\x06\xfb\xcb\x15)\x01\x5c>\ -\x9f\x1f\x10\x18\x14\x10\x14\xe4\x07\x18~\xca\xf12\x95p\ -\x9c\x9fL\xd9\x5cK\x84\xa1\xd3U\xa2\x14)\xd22T\ -ir\x19\x07\xd3\xc2$y\xa6\xaa\xa3\x8f\x8f\x1dG/\ -\xe8\xda\x95\x9eQ\xc9H\xa6\xf4\xa7\xdb\xe8/\x92\xa7\x07\ -\x8c\x13f\x04p\xfd\x03\x03\xaa\xaa$\x16U\xd6\xc9\xc8\ -THi\xd1\xc4\xa2\x00\x89T\x92.\x91\xa9\x94P\x8f\ -[e\xbd\x0c\xa6\xef\xaafYY\x5c-c\x9066\ -\xb6fy\xd3\xd3\xab\xac\xa9Tu\x1b\xa3\xaa\xb9\xa6r\ -\xc0\xf8\x0cI@\x9cD)\xcfT\x88$\xdd\xc6@S\ -\x9e\xe9\x15U\x0b\xdc\x05\xd1\x0a\x89P%\xe9\x0a\xd0\x09\ -G\x9b_`\x90_`\xf0\x00n\xa8 0L\x10\x14\ -\xea\x17\xc8\x13\x04\x06v\x080\xc04\xa0\x11+\x17\xa7\ -%\x8f\xd7\xa3\x01\x83\x22d\x003b\xfd\x02\xc3+i\ -\xe8a\x1a\xd2\x801(\x16\xaa\x84FQ\xd1\xc7\xad\xaa\ -=r\xc5\x00\xb9\x5c\xda\xa9\xd6\x0bL\xafa\xba*z\ -\xd4\xc4\x22A\xb2\x5c\x91.TuJK\x17\xa6H\x02\ -Ti\xc9\xc9\x1d\x02\x9e\xe5\xea\xa1Vv\xb4 Z.\ -\x95+\xa0\x95\x92N\xc1\x1d\x02\xaa\xca\xae\xb2VLt\ -t?\x85<9M*\xe9\xa4\x8c\xeb\xd1\x85\x13\xd3-\ -:\x8c\xcb\x0f\x0b\xf3\x0b\xf2\xe7\xea\x93\xd1\xc3\xab\x92N\ -W\xb9(\x13Gl\x94L$QB\x93\x94\x9d\x9e\x1b\ -9\xf4\xb5\xd4E\x98\xf2|.S M\xeb\xa4\xb5\x08\ -b\xb9(M\xfcll\x0b\x84\x22\xa1D\x12\x92\x9c\xec\ -\x07\x22\x05\xfaq\xb9\x92p\xbf$!\x1c$a\x92p\ -a\xa8H\x1c\xc4\xe3\x86t\x08\xd0\x91\xa8\x8e4(\xda\ -_\x0cd\x93\x93C$a\xc1\xbc0?Ir\xb0\xc4\ -\x8f+\x09\x91\xf8%\x85\x8bx~a\xc2\x90PIx\ -pRP\xb8H\x5c51m\xee\xf3\xe2\xeb+\xa7\xa6\ -\xc6w\xa0/4A\x8cL\xa9\x12BqLWZ\x9e\ -4\x90\x87\x1f\x1a,\x11\xf3\xf9\xc9~ S\xb2_R\ -(\xc8#\x0c\x0a\x0c\xf3\x13\x06\x07\x07qy\x81a\x10\ -\x0f\xa1\x87\xc9\xf3\xd5_ \xcdp\x87\xb2\xaa\xb5\x18\x1e\ -\x12\x1c\xce\x0b\xe2\x89Q\x8b!Z-\xf2D!I~\ -\xe2\xb0d\x89(\x5c\x98\xc4\x0b\x16\x051\x8c\xf4\x88\xbd\ -\xc0\xa8\xaf\x22\x0d\xcc\xbeP\xaa\x87S\xa9[Qp\x90\ -$\x9c\xcf\xf3K\x16's\xfdB\xf9!b?~h\ -2\xdfO\x18\x12\xc6\x0d\xe7\x86'\x85\x09\x85\xe1\x0c\x8b\ -*\xc8\xbc\xc0\xaag\x1a\xeaq|\x15\x83(^2\xba\ -\xba\x9e\xa6\x0dt\x86P\xa1\x94\xa0\xf9\xe9\xe8\xc3\xd8\x1f\ -\x9f\x17*`\x1d\xda\x8c\xc1\x08C\xd3\xdeID[\x18\ -\xe8\xfe\xe7r\xab\xaf\x96\xf6bw\x1a\xa7\x82\x17\xaaW\ -\xcfcl\xaaDV\x93e\xd4\xc3\xaa\x9e\x88R\x9e\xac\ -\x1a+TH\xa2R@\xd3\xc6\x98\xa5\xaa\xaa\xbd\xa0\xef\ -Z.\xb9W\xe8\x08\xa5p\xcc\xabuCprxX\ -\x92\x04\xac6O,\x0a\xf2\x13\xf2B\xa0\x07P\x87\xe1\ -\xa1\xdc\xe0\xe0\xf0 a\x08\x97+~\xb5n\x80>\xe0\ -\x0aB\xb8o\xbf\x1b\x9e\x91\x17\xa5\x0ae)\x12q\xa7\ -\x00\xa6\x22\x93\xf1\xff\xa9\xe7\x8c\xb3\x87/\xd7sUN\ -\xe8\xff\x82\x9e\xd3\xe6>o\x13\x19;k`C\xb5\xa8\ -z\xfe\xac\xd6Y\x0e\xd0y\xcb\xe0\xa8\x07Tz\xeaU\ -\x09l\xfa`fbfbfbfbfbfb\ -fbfbfbfbfbfbfbfb\ -fbfbfbfbfbfbfbfb\ -fbfbfbfbfbfbfbfb\ -fbfbfbfbfbfbfbfb\ -fbfbfbfbfbfbfbfb\ -b&v\xcf\xde}\x95\xc8\xc4\x1d}\xc6\xfaDv\x22\ -\x8d\xa8\xa1\x84\xdd\xd0\xb7G\xe5\x99E\xe8Wzy]\ -bb-|\xe9\xf7o\xeb\x1f\x1e\xeey]\xb5E\xf6\ -\xe4\xe2\x1e\xfe\xfc}\xb7\xc7\x0f\xa3\xcb\x04t\xd9u,\ -g\xde`&\xf6\x19\x8a4\x99\xaao\xa6*#S\x05\ -I|\x95\x98\xf4S\xaa\xe2\x93\xe4r)\x8d\x11#S\ -I$\xb2\xcct&\x8e\xe7h\xa9\x02\xd3\xf5\xe8\xba\xf1\ -i\xe3\x10\xa3K\x9a\x0a\xeb<\xa3)Q\xbc#L\x97\ -\x0c\xe86x@%3m\x85~\x0a\xb9<9^\xa2\ -\xca\xcc\xe8\x9b4R\x04\xd9\x0e\xa4\x1fQ\x109\xfc\x92\ -\x09\x87\xc4\x13\x09Q\x91L\x92AW\xb1\xcb\xa8\xc4f\ -\xc8t\x91\xaad:\x89\x1c\x922\xd3\xa4\xaa4\x19M\ -\x12\xd2\xb64vt\xec\x90\xdeZmD >\xcb\xef\ -\xb9\x16\xbb\xe8\xb5\xb8/\xfdF\x82R\xfb\xae3\xb4+\ -C%c\x1a\x01\x8dLRT&\xe2R\x94\xb1\xcfJ\ -\x14\xb2\xe8g\x09\x99\xeaY\xa2O\x92TY\x99x'\ -E5\xa62\xd1-]\xda\xb52\x01z|F\xba\x8b\ -hT\x8aN\x11Z\x01I\x5c\x8f.\xd1D\xfbj9\ -\x89\x13s8byfRg\xf9%\xc2\x84\x1e\x0a\xd9\ -\x0by]\xa4/\xe2uQ\x88\x07\x0c\x94\xa9\xba7\x8f\ -\x93\xaa\x88^\xe8\x22\x15s\xaa\xca\x8fSJUt~\ -\xbfq\xd2\xceq\x95\xd9vc$\x22\x95\x5c\xd1U\xa8\ -\x12V\x8e\x8a~)\xfd\x94\xcc\xa8\xc0\xb8\xee\x1cM+\ -A\x92\xac\xaa\x8a\xfc\x00yF\x95l\xe3ERm~\ -?\x85\xa8\xf3\x90\xca\xec\xfa\x22\x85?\xf0\xeb\xb5\xc7_o\ -9x\xf6\xfa\x93\x84\xe41\xd3\x17\xac\xd9z\xe8\xdc\x8d\ -\xa2\xf0\x1e\x83R\xc6~\xbc\xf0\x9bm\x87\xcf\xdf|\xea\ -LX,\x90\xd6\x82\x96\xc9\xda\xca2\x94\x16\xa1\x19\xd7\ -\xc5\x02$\x18\xed\xe3j\x19\xf4\xde\x5c7\x94`\x7f\xdc\ -\xa9\x82\xe0\x16I\x97\x15\xefgE\xc7\xbb\x8b\x94!\x85\ -\xbeV(\x80u\xcb\xd0\xec\xd3 \xc4*Oq\xb7\x81\ -a*\xc9\x95J\x11\xaa\x97\xa0\xd53\x114\x17\x88\x03\ -\x9b\xe6\xe9L\x22\xc9\x93\x86\xf9\x12\xf7\x85{g\xe5\x1c\ -X\xd7j}\xf1\xc0b\x0d\xd9\xd4w}\xd3S\xe7:\ -\x9c\xb86\xe4\xec\xb9\xbbM\xbc\xf6\xfbw\xb0\x98\xffW\ -\xc5\xc6\xa9\xa7\xa6D\xde\xeb]\xb4CC\xba!\x12\xbb\ -h\xcc\x88\x07S\x9a\x05\xfc\xfe\xfb\xd4\x1d\xc5\x1f\xce_\ -QY\x10p\xe1f\x85\xe7U\xf5\x81z\xda\x92\xbd)\ -\x12\xf5\xcd+.qSu\xd9{G\xadx\ -\x9a\xea\xb2.qj\xef\xef\xafLm\x16\xf3\xce\x02Y\ -|\xea\xc6\x90\x80\xa9\xa7\xd2\xca7\x0e>6\xf6\xc2\xdd\ -\x0d\x99\xb3\x1e\xa8\x9a\xb0\x7f\xe8\x17\xd3k\xe8\xe0P\xe1\ -\xe0\xfd\x8e\x7f&\x96F]P7\xed1\xf2\xfb\xcf>\ -*\xfatl\xc75M\x1a\x93&\x0e\x166[gF\ -l\xba\x1f\x13\x13\xbc\xe8\x9c\xa4\xe3w\xd4\x06g2z\ -_\xe7\xeeO\xaf\xff\x11\xe37\xea\xcfF\xb7\x1c\x1c\xd7\ -\xe6g\xef\x9cn\xbd\x87\xb3\xe8\xe4\xea\xd5~\xcaE\x97\ -n,\xca\xf8\xb5\xfe\xd6\xc0\x87\x87\xa2CO\x1f\xaah\ -\xa6!S\xec\xbd\xdf\x99\xf9E\xec\x86\x1f\xc6\x08f;\ -\xff\xd1bM\xad\x8d9]sc\xfa(R3=\xf9\ -\x1f\xcf\x1a:\xa9\x8b\xcb\x1f\xc7\x0e\xc9\xbaM|gV\ -\x83-\x7fY&\xfd\xfe\xee\x9d\xf1\xa2\x03\xbc\x16\xdfD\ -\xaf\xbe\x10\xb6g\xe3\xa5\x07M\xe7\xac\x1f\xc2\xdbr-\ -\xac\xf1\xaa\x8fOe\x5ck?\xf4\xdedy=\xe1\xc7\ -Nv\xa7\xd7\xaf\x8b\xbb\xd4\xb1\xdf\xe0\x07\xd7F\xba\xc4\ -\xaf\x98\xd2q{\xfe\x85\xc2oR\x9c\xec>_\x9c\xf0\ -{\xe7\xaf\xd5\x97\xce4\xfb\xb3\xf8#e\xaboE\x9d\ -~\xdc\x97#.\xbe\xd5)r\xd7\xe6\xb8\xb8\xb9\xa3\xbf\ -\xcd|\x1a\xfa\xc1\xaca\x93X.\xbf\xef\xdb\xb8\xa0\x9f\ -cW\xde\xcf\xb7#N\xec\xf7\xe5\x8f\x1fqZZc\ -\x93\xce\xd4\xd2?\x17<\xba\x87\x0eq\xbcP\xf8\xed\xe5\ -\x9c93\xb2z\x8d\x96\xef\xdb3\x8f\xbb{\xc5\xae\xbf\ -\xaf\xb8g\x9ej-X\xb2\x5cro\xd4\xecO\xc8\xea\ -o\xa8\xc1\xab\xac\xca\xfe\xcb\xdd\xb4bW\xfe%\x8f\x9f\ -\xd3\xd6N\x1f|\xe8\xa7\xe2i\xac%\xbd\x14\x0f'\x08\ -E\xe1q\xbd/M\x5c2\xbex\xcb\xc0\x95e\xa9S\ -nx\x15\xa6]*Ox\xb8\xf6\xf3i\xbf\x1c/\x9a\ -\xd8\xf4\x8f\xa26m\x8emQ\x7f=kR\xf7\xab\x81\ -?\xed\xd4\x0ak/\xb8a5\xb4\xc8\xa9A\xe2\xa4\x05\ -\xb3{\xa9\x85\x7f\x9fSS\xbe\x91\x9a_\x1f\xcb6\x94\ -\xff9\xd5e\xf3\xe0\xa7\x09\x97\x8a\xbc2.m\xb8\xb8\ -V\x92\xdb~\xaa\xdd\x8a{K4\xe4t\xd3\x1d\xbe\xa1\ -\x9d\xfe^\xa8\x9eS\x91S\x96U6eDi\xf4\xd3\ -z\x0f\x124D\xbc\xb9\xa2YYVE\xd6\x89\xc7\x1f\ -?\x88\x89\xed\xbb\xed\xba\x86\xac\x8e\xccP_\xdb\xa3\xc3\ -\xfd|\xef\xef\xed5\xa4\xe7\x94k{\xb5\x98\xf1\xf1\xf7\ -K\xa6\xde\xae\xf7G\xe4\x8e\x00\x06\xf7\xba\xbc\xa8w$\ -0\x08\xd0a\xce\xff\x95\xa1\xdf\x9b\xc1}W\xcb\xa0\xb7\ -\x16\xd1\x97\x7f\x5c\xb9\xfc\xcaM\xefVq\x09\xdf\xf4j\ -\xfa\xe5\xd8\xa5{\xa7\xf5o\xdcr\xc7\xd9k\x1f)v\ -\xfe\x1e\xcf\xf6j\xf6\x15\xb4\xe7w\xed\xac\xd7\x8c\xb6\xeb\ -\xc3\x09\xed\x9f\xc2\ -i29\x0b\x5c\xcatX\x8f\xe2Wx\x06\x0f\x19\xca\ -\xb1>\x0e.\xa5-x\xb2\xe0<\x09E\xca\x8c\xd8\xf8\ -\xee\x03hW\xab[4\x07?\xd5C\x9e\x0bE\xe7\xb4\ -\xce\xca\x19\xbf\x9e\xfd8\x1cR\xb7\xe0,\xcaP\x80+\ -B\xf5\x83x\xb0X\xa2\x04\xe7\x8d\xfa\x10\xe2\xd2\xb1\xaa\ -\x0c\xccGO\xc0-i\x14\xc6Y\xe8\x03\xb8)@@\ -\x88{a\x83\xa4\xa7\ -\xa8\x1a\x0b\x8d\x0c\xd8\xb7\xda\xd8\xa3\xfet\x9fQ\x1e\xb9\ -\xcf\xf2\xaa\xc2\x93\xaf\x04/\x0c\xd6\x84\xec9\xcf\xf2\x92\ -\x16\x13\xb2\xed#B\xbc.<\xcbk\xf1%\x8cQ\xe8\ -\xb7\xad'\xf4\xda\xe3\x81\xe3E\xef\xf3gi\x12\x91?\ -*\xb42\xd4\x8a`D\xd0\xe3\xe7\x8f\xe4*\xd5\xc3\xe9\ -\xaa\xf5s9\xa87\x11x\xb3\x99\x0a\x0e\xac\xc7E\x12\ -\x8e\x9f\xe1 ~\xe9\x8aU\xcb\xd1>N\x92,\xc1u\ -\xbf\x84\x93\x00\xa3,M\x96\x02\xdd-\x13\xa7\xd1_r\ -K\x93U\xd7\x89/Y\xcd h\xc75\x04\xd7\xd5j\ -\xe26\xc2\x9f\xd4?\xe1F\xd8\xf7s\x89\x85\xab=a\ -\x0f[\x0e%Te\xbf\xf5\xb1M x\xe5\x0djz\ -S;\xee\xe9P\xc5\xa2\x935\x1b\x0f\xca4z\xa9E\ -\xa2\xe3\x06pD\x99\x8a1\xda2zueI\xec\xc0\ -H\xb9\x11o\xd2\x844'\xad\x89\x1f\x18\x9ap\x12A\ -:\x93n\xa4\x17\xe9K\x06\x90!\xe4?D\x04\xc6(\ -\x9d(\xc8X2\x89\xbcG\xa6\x93\x99d\x0e\xf9\x9c,\ -!+\xc8j\xb2\x96l$?\x92md\x17\xd9O\x0e\ -\x91_\xc8Ir\x96\x5c$\x97\xc8ur\x97\x14\x90\x22\ -R\x06\xee\xae5\xe5H\xb9R\xdeTS\xca\x97jG\ -\x05Q<\xaa\x13\xd5\x8d\xeaC\xc5QC\xa8D*\x85\ -\x92Q\x99\xd4$\xea\x03j&\x95E-\xa1\xbe\xa2\xd6\ -R\x9b\xa8\x1d\xd4~\xea(u\x8a\xfa\x9d\xbaL\xdd\xa6\ -\x1eR\xa5,6\xcb\x81\xe5\xc6j\xccj\xc9\x0a`\xf1\ -XQ\xac\xde\xac\x01\xac\xe1\xac\x14\xd6h\xd6\x04\xd6\x87\ -\xacY\xacE\xac\x95\xac\xefX[Y\xfbY\xbf\xb0\xce\ -\xb2.\xb1\xee\xb2\x9e\xb0\x09\xdb\x9e\xed\xc1n\xc6\xf6c\ -\xf3\xd8\xd1\xec\xbe\xec\xa1\xecd\xb6\x82=\x85=\x83\xbd\ -\x80\xbd\x92\xbd\x91\xbd\x93}\x98}\x86}\x89}\x8f]\ -bae\xe1j\xc1\xb1\xf0\xb3\x88\xb0\xe8i1\xd0B\ -d1\xdab\x8a\xc5\xa7\x16K,\xbe\xb5\xd8jq\xc0\ -\xe2\x8c\xc5e\x8b\x02\x0b\xb5\xa5\xa3e#\xcbv\x96\x02\ -\xcb\x18\xcb\xc1\x96)\x96c-\xa7[.\xb0\x5cc\xb9\ -\xc5\xf2\xa0\xe5Y\xcb\xeb\x96EVVV\x1eV\xad\xac\ -\xc2\xadzZ\x0d\xb1\x1ai5\xd1\xeaS\xab/\xac\xbe\ -\xb7\xdagu\xca\xea\xaa\xd5\x13kkko\xebv\xd6\ -\x1d\xad\xfbZ\x0b\xadU\xd6\xd3\xad\x17[\x7fg\xbd\xd7\ -\xfa\xb4\xf5u\xebb\x1b{\x9b\xa66A6\xddm\x86\ -\xda\xc8l\xde\xb7Y`\xb3\xcef\x8f\xcdi\x9b\x9b6\ -e\xb6\xf5m}m\x05\xb6}m\xc5\xb6\xe3mg\xdb\ -\xae\xb6\xddi{\xc2\xf6\xbam\x99\x9d\xb3]+\xbb\x8e\ -v\x03\xecF\xda\xbdg\xb7\xc8n\xa3\xddA\xbb?\xec\ -\x1e\xd9\xdb\xdb\xfb\xd8\xf3\xed\xfb\xdb\xa7\xd9O\xb3_d\ -\xff\x83\xfd\x11\xfb\xcb\xf6%\x0e.\x0em\x1d\xa2\x1d\x86\ -9d:\xccr\xf8\xc6a\x9f\xc3\xef\x0e\x8f\x1c\x1d\x1d\ -[:vv\x1c\xea\xa8r\x9c\xe5\xb8\xd61\xc7\xf1/\ -\xc7b'W'\x7f\xa7\x18'\xb1\xd3T\xa7\xa5N[\ -\x9dN;=\xa8g[\xcf\xb7^T\xbd\xff\xd4\x9bP\ -oA\xbd\xcd\xf5N\xd4\xbbW\xdf\xb6~\xcb\xfa\xd1\xf5\ -\x85\xf5\xa7\xd4_Z\x7fG\xfd\xf3\xf5\x9f8\xbb:s\ -\x9d\xfb:\xa7;\x7f\xea\xbc\xce\xf9\xa8\xf3-\x17k\x97\ -\x96.\xdd\x5c\xc4.\x1f\xba\xacr\xc9q\xb9\xea\xcav\ -m\xee\x1a\xed*r\xfd\xc0u\xb5\xebA\xd7\xebnV\ -n\xad\xdcb\xdcF\xba\xcdt\xdb\xe0v\xdc\xad\xc0\xdd\ -\xc5=\xc4=\xc1}\x9c\xfbR\xf7\xdd\xee\x97<\xd8\x1e\ --=b<\xa4\x1e\xb3=~\xf48\xe7Q\xea\xd9\xd8\ -3\xcaS\xe2\xf9\x89\xe7F\xcf\xd3\x9eO\xbd\x1azu\ -\xf6\x92x\xcd\xf0\xfa\xde\xeb\xacW\xa97\xc7\xbb\x9b\xf7\ -(\xef\xb9\xde\xdb\xbc\xffl`\xd1\xa0m\x83\xfe\x0d\xc6\ -6X\xde\xe0`\x83{\x0d\xdd\x1aF4\x145\x9c\xd1\ -\xf0\xc7\x86\x17\x1a\xb1\x1a\xb5m\x14\xd7hb\xa3U\x8d\ -r\x1b=i\xdc\xa4q\x8f\xc6\x19\x8d\x177\xcei|\ -\xaf\x89G\x93\xceMF6\x99\xdfdO\x93\xdbM]\ -\x9bvj\x9a\xd6t~\xd3\xbdM\xefp\xdc9Q\x1c\ -)g\x11\xe7\x00\xa7\xa0Y\xa3f=\x9be6\xfb\xaa\ -\xd9\xf1fe>\xad|\x06\xfa\xbc\xef\xf3\xbd\xcf\x9f\xcd\ -\xed\x9a\xf3\x9a'7\x9f\xdf<\xbbyA\x8b\xa6-b\ -[Lj\xb1\xbe\xc5\x05_[_\x9eo\xaa\xefB\xdf\ -\xc3\xbeO[\xb6j9\xa8\xe5\xc7-\xb7\xb5\xbc\xd5\xca\ -\xabUL\xab\x09\xad\xd6\xb7\xfa\xa3\xb5c\xeb\xc8\xd6\xa3\ -[\xafl\xfdk\x1b\xab6\xbc6\xa3\xda|\xd1\xe6d\ -[V\xdb\xd0\xb6\xa9m\x97\xb6=\xd1\x8e\xd5.\xac]\ -Z\xbb/\xda\x9djo\xd9\x9e\xdf^\xd6~e\xfb\xf3\ -~\x0e~Q~c\xfc\xd6\xfb]\xf6\xf7\xf0\xef\xe3\xff\ -\xbe\xff6\xff\x07\x01-\x02\x86\x06\xcc\x0d8\x1c\xa0\x0e\ -\x0c\x0d\x94\x06\xae\x0e\xbc\xc8u\xe1\xf6\xe2\xbe\xcf\xdd\xc9\ -}\x18\xd46H\x14\xb44\xe8\xd7`\xc7\xe0\xee\xc1S\ -\x83\xb7\x07\x17\x86\xb4\x0b\x91\x84,\x0f\xf9-\xd454\ -6\xf4\xe3\xd0\xec\xd0\x8a\xb0\xf00E\xd8\xc6\xb0\xdb\xe1\ --\xc2\x13\xc3\x97\x85\x9f\xe7\xb9\xf1\xfa\xf1>\xe5\x1d\xe1\ -[\xf2\xbb\xf0\xa7\xf2w\xf1K\x04a\x02\x95\xe0GA\ -~\x84_\xc4\xa8\x88u\x11\xb7:\xb4\xea \xe9\xb0\xba\ -\xc3\xd5\x8e>\x1d\x85\x1d\xbf\xeax\xa9\x13\xa7Sb\xa7\ -/;]\x8al\x16)\x8c\x5c\x19y\xa5s\xf3\xce\xe2\ -\xcek:\xdf\x8cj\x1352\xea\xbb\xa8\x07]\x02\xbb\ -(\xbal\xe9\xf24Z\x10=9z_Wv\xd7\x1e\ -]gt=\xde\xcd\xa5\xdb\xc0nK\xba\xfd\xd5\xdd\xa7\ -{J\xf7\xf5\xdd\x0bz\x84\xf6\x98\xd8c_O\xcb\x9e\ -\xbd{\xce\xedy>\xa6q\x8c(fmLA\xaf\xf0\ -^\x93{\x1d\xe8\xed\xd0;\xbe\xf7\x92\xdeW\xfa\xb4\xed\ -\xa3\xe8\xb33\x96\x15\xdb+v^\xec\x1f\xef\xf8\xbe#\ -{g[_\xd27\xa6\xef\xbc\xbe\x7f\xf6k\xd5ot\ -\xbf\x9f\xfb[\xf5\xef\xd7\x7fi\xff\x1bq\xdc\xb8Iq\ -\x87\xe3]\xe3G\xc4\xaf\x8b/\x1a\xd0e\xc0\xec\x01\x17\ -\x07\xb6\x1e\x9890;\xa1^\xc2\xb0\x84\xb5\x09O\x07\ -u\x1d\x945\xe8\xd2\xe0\x80\xc1\x93\x07\xff2\xa4\xc1\x90\ -\xb4!\xdb\x87Z\x0fM\x18\xbaf\xe8\x93w\xbb\xbd\xfb\ -\xf9\xbb\xd7\x87\x85\x0e\x9b>\xec\xdc\xf0V\xc3\xc7\x0d?\ -\xfa\x9f\x06\xff\x91\xfeg\xf7\x88z#\x84#6'Z\ -&\x0eJ\x5c\x97X.\xec+\x5c)|\x92\x14\x93\xb4\ -,\xa9@\x14-Z(\xba+\xee,\x9e/\xbe-\xe9\ -(\xc9\x92\xdcL\xee\x98\x9c\x95|+\xa5c\xca\xbc\x94\ -\xdb\xa9\x91\xa9\x0bR\xef\xa5E\xa7-I+\x1c\xd9s\ -\xe4\x8a\x91OG\xf5\x1d\xf5\xcd(\x8dt\x90\xf4\xfbt\ -\x9b\xf4\xc4\xf4\x1d2\x17\xd9(\xd9\x01y\x13\xf98\xf9\ -\xa9\x8cv\x19\xd33.\x8d\x16\x8c\xfe|t\x81\xa2\xb7\ -b\x8d\x92R\x0eWnW\xb9\x813\x95\x9b\xd9:\xf3\ -\xa3\xcc\xcbc:\x8dY:\xa6xl\xc2\xd8\xcd\xe3\x9c\ -\xc7\xc9\xc6\xe5\x8eo;\xfe\x93\xf17't\x9f\xf0\xf5\ -D\x8b\x89\xa2\x89\xd9\x93\x9aMzo\xd2\xe5\xc9Q\x93\ -\xbf\x9aBMI\x9a\x92=\xb5\xf9\xd4\x0f\xa7^\x9f\xd6\ -c\xda\xb7\xef\xd9\xbd7\xea\xbd\xbc\xf7\x03\xdf\xcfz\xff\ -\xf1\x07\x83>\xd8\xf9a\xe3\x0f\xa7}x\xf5\xa3\x1e\x1f\ -\xad\x9f\xee4]1\xfd\xfc\xc7\x11\x1f\xaf\xf8\xaf\xc5\x7f\ -\xd3\xfe{\xfc\x93\xe0O\x16\x7f\xa2\x9e!\x9eqlf\ -\xe0\xcc\x053\xcb?\x15}z\xec3\xeeg\x8b>\xd3\ -\xccJ\x9eu|v\xd8\xec\xe5s\xac\xe6\xc8\xe6\x9c\x9b\ -\x1b9\xf7\xdb,\xe7\xac\x09YW\xe7\xc5\xce\xdb:\x9f\ -3\x7f\xc6\xfc\xc7\x9f\x8f\xf8\xfc\xe8\x82\x90\x05+\x16\xda\ --\xcc\x5cxiQ\x9fE\xdb\x17\xb7XY\xf6\xf4\ -\x0b\xf1\x17\xa7\x97w^\xbeqE\xe3\x153W\x94~\ -\x99\xf6\xe5o_\xf5\xf8j\xeb\xca\x96+\x17\xac\xb2Z\ -5f\xd5\x8d\xd5\x09\xab\x0f\x7f\xcd\xfbz\xed\x9a\x06k\ -f\xae\xa9\xf8F\xf6\xcd\xa5o\xe3\xbe=\xb06|\xed\ -\xdau\x8d\xd6\xcd^\xcfZ\x9f\xb9\xfe\xf6w\xc3\xbe;\ -\xb9\xa1\xeb\x86\xed\x1b\xfd6~\xf5\xbd\xc7\xf73\x7f \ -?d\xfepgS\xe2\xa6s?\xf6\xfe1{3o\ -\xf3\xc6\x9f|\x7fZ\xb6\xc5u\xcb\x8c\xad\xd4\xd6\xf1[\ -\x0b\xb6\xa5n\xbb\xb4}\xc8\xf6S;z\xed\xc8\xde\x19\ -\xb1s\xcb\xcf\xfe?\x7f\xb3\xab\xd9\xae\xa5\xbb\xddw\xcf\ -\xdec\xb7\xe7\xc3=\x9a\xbd\x13\xf6>\xd9\x97\xb1\xef\xde\ -\xfe\x94\xfdW\xb3Gd_\xcc\x19\x9c\xf3\xeb\x81\xfe\x07\ -\x8e\x1f\xec}\xf0\xc8\xa1\xee\x87r\x0eG\x1d\xde{\xa4\ -\xe3\x91]G\x05Gw\x1c\xe3\x1d\xdb\xf6K\xd8/[\ -sCs\xb7\xe4\x85\xe6m9\x1ev|\xeb\x89\xf0\x13\ -\xdbO\xf2O\xee<\xd5\xe1\xd4\x9e\xd3\x91\xa7\xf7\x9f\xe9\ -z\xe6\xd0\xaf1\xbf\xfer\xf6\x9d\xb3\xa7\xce\x0d<\xf7\ -\xdb\xf9a\xe7/\xfd&\xfe\xed\xd6\xef\xd2\xdf\x0b/\x8c\ -\xb9Pvq\xda\x1f\x96\x7f\xcc\xf8\xb3\xfe\x9f\x0b\xfej\ -\xf4\xd7\xca\xbf\xdb\xfc\xfd\xfd\xa5\xb0K\xbb/w\xbd\x9c\ -{%\xfe\xca\xc5\xab\xa2\xabw\xaf)\xaf\x95_\xff\xf0\ -\x86\xe3\x8d\x057\x9b\xde\x5c{+\xe8\xd6\xae\xdb\xddo\ -\x9f\xbc\xf3\xee\x9d\xebw3\xee\x96\xdd\x9b~\xdf\xf9\xfe\ -\xb2\x07\xad\x1f\xfc\x94\xdf9?\xb7`p\xc1\xf5BE\ -\xa1\xe6\xe1\xa7\x8f\xbc\x1f}\xf38\xe4q\xf6\x93~O\ -\xfe*J/*{:\xa3\xd8\xbb\xf8\xdb\x12^\xc9\xe1\ -\xd2A\xa57\xcb\xc6\x96[\x97/\xaahS\xb1S\xdd\ -[\xfd\x87&\xbd\xf2\xfe\x849\x98\x839\x98\xc3?*\ -XXXX:9997h\xd0\xa0Y\x8b\x16-\ -\xfcZ\xb5j\xc5m\xd9\xb2e\x80\x1e\x04\x1a\x82\x01\x0e\ -\x9d\xd6\xe5\xe9\x97c<@\x0f\xf7\x85\xb2*\xea\x06\x18\ -\xe00\x10\xd0\xbau\xeb C>\x06\xf2\x050\xfc\xf4\ -\xf1\xaaJ\xd7\xc4\xcb\x10\xdf\xa0\xbdt=\xd4S\xd3\xa6\ -M[\xb9\xba\xbaz\xc1:\xc4F\xefN\x83\xd1\x01\xeb\ -\xd4\xaf_\xdf\xad{\xf7\xee\x83?\xf9\xe4\x93\xf5\xdf\x7f\ -\xff\xfd\xc5\xdd\xbbw\xdf\xdb\xb7o_\x01\xc2\xfe\xfd\xfb\ -\x0b\xf5\xc10/;;\xfbaU8\x0c^U4\xaa\ -\x02}<\xc3:\x0c=}\x9aU\xe1W\xc7\xab\xba\xba\ -\x8c\xecU\xd5\xc72\xc3|C:{\xf6\xecy\xb0u\ -\xeb\xd6kK\x97.\xcd\x16\x89D\x93|}}\xfd-\ ---\xadj\xd7\xfa\xb3\xe0\xe2\xe2\xe21j\xd4\xa8\xe9\ -@\xeb\xfe\xb1c\xc7*rss5f\xa8;\x1c>\ -|\xb8d\xf1\xe2\xc5{CBB\xa2\x8c\xed\x03\xbcf\ -\x12\x12\x12\xa4999\x8f\xdf\xb6\xfc\xff\x06\xf8\xe5\x97\ -_\xd4\x0b\x17.\xdc\xed\xe3\xe3\xd3\xd6\x18[\xd4\xb8q\ -\xe3\x16k\xd6\xac9\xf9\xb6\xe5\xfe7\xc1\xa1C\x87\x8a\ -\x13\x13\x13\xc7\xc1\xd8\xb6\xaeI\xf7,\x08\x91\x91\x91}\ -\x0f\x1e\xae\x0dj\xd2\xbf\xb5\xb5\ -\xb5\xadJ\xa5\x9ak\x0a\xfd\xff\x93\xfb\x10ec\xe0M\ -\xc9\x8d\xfao\xde\xbcy\xfb\xda\xc6\xbf1\xfa\xc7r\xf0\ -\x91N\xe0\x1ac\xd9\xb2e9x\xfe\xe2\x8b/\x0e`\ -\x9c93q\x04\x98{\xf63y\xfau\xf4\xe3\xfa\xf8\ -L\x19\x93\xaf\x0f\xfayU\xc5\x99z\xfa<\xf5i\x1b\ -\xd23\x04C\xf9\xf5e3\x94\x03a\xc5\x8a\x15\x87q\ -\xedU\x9b\xfeqmf\xcc\xf8W*\x95sj\xd3\xff\ -\x91#GJ;t\xe8\xd0\x1b\xd7\xd8\xb0V\xf3\xc4\xb3\ -!0\xf9\xb8\x96sss\xf3f\xd2\x18G`\xe2\xfa\ -\xb8\xfae\x98\x87\xc0\xd4\xd5\x8fW\xc5O\xaf\x8e\x87>\ -_\xc3:\x0c}&\xce\xd0\xd5/c\xea\x19\xcaj\x18\ -\xc7\xba8\xa6\xb1\x0f\x8c\xd1\x7fm\xe3\x9f\xd1\x7fm\xb4\ -p]\xe7\xe7\xe7\xc7\xab\x89\xd6\xffJpvvvG\ -\xdf\xd2\x18\xfb\x83{\x115\xd12\xd6\xfe\xa3\xfe\xdb\xb7\ -o\x1f\xfe\xa6\xda\xf8O\x0e\xe8\xd3\xa3\x1d\xaaMg\xa6\ -\xb4?\xb8\x9e3\x8f\x7fm0V\xff8\xfeq\x7f\xb4\ -&Z8\xff\x1ak\x7f\xfc\xfd\xfd\xf9L\xbd~\xfd\xfa\ -\x89'L\x98\xb0\xa8\xae\xfb|\xff\x86\x80\xfa\xc7\xb9\xde\ -\x18\xfb_\x9b\xfe\x8d\x1d\xff\xfa\xf6\x07\xfb\x01\xd3\x98\xbf\ -|\xf9\xf2\x838/\xbd\x99\x96\xff3\x82\x93\x93\x93\x8b\ -\xb1\xf6\xdfT\xfe?3\xff6l\xd8\xd0\x07\xe9\xea\x97\ -m\xdb\xb6\xed\xba\xfe\xb5\xf1o\x0f\x8c\xfd\xa9M\xff\xe8\ -\xa3\x9a\xd2\xff\xe4r\xb9\x1d\x7f\xfe\xf9\xe7;\xd5\xcd\x0f\ -qqq\xc9oJ\x07o3\xe8\xfc\x9fZ\xed\x8f\xb1\ -\xe3?333\xcb\x18\xfb\xbfz\xf5\xea\xbc\xda\xf0`\ -NX\x5c\xdb\x9e\xab1\x01\xef\xf1)\x14\x8aY\xe8g\ -\xef\xde\xbd\xfb.\xf6\xaf\xfe\x1e!\xc61\x0f\xef\xd1!\ -\x0e\xee\xa1`\x9dW\xe5kL@\xfd\x1b3\xfe\x8dY\ -\xff\x1ak\x7f\xa0\xbd\xe5\xb5\xf1c\x00\xe7\x04ww\xf7\ -\x06umW\x9b6m\x82\xb3\xb2\xb2\xb6\xe6\xe4\xe4<\ -2\x96\x97!\xe0=\xa4y\xf3\xe6m\x07[\xf9\xda|\ -ec\xedO]\xe6\xdf\xdah\xd5u\x7fZ7'\x08\ -\x8ci\x0f\xfaR\xb8W\xfb\xb2:\xaf\x0e\xb6n\xddz\ -5>>>\xa5v\x09\xea\x16\xea2\xfe\x8d\x9d\x7fk\ -\xa3\x85\xd7\xba\x5c.\x9f\x89\xf3\x80\xb1\xed\xafmNh\ -\xd7\xae](\xea\xc8\xd4z\xaf\xa2\x1f\xae\x99r\xed\xc2\ -\xf8\x9f\xa6\xf4\xff\x8d\xf5\x7fp\x0e\xde\xb9s\xe7\xad\xba\ -\xb4\xdfpN\xb0\xb3\xb3s@\x1b\xf1\xba\xf5n\x08\x9f\ -\x7f\xfe\xf9N\x07\x07\x07\xa7\x9a\xf4aL0v\xfc\x1b\ -\xbb\xfe\xad\xeb\xfe\x83\x87\x87G\xa3\xaf\xbe\xfa\xeah]\ -\xda\xce\xcc\x09B\xa1p<\xb3vx\x1b\x80\xd7\xafX\ -,\x9e\xf4*\xfa\xc7\xf1\x8f\xfb\xa1\xc6\xe8\xdf\x18\xfbo\ -\x8c\xfeQn\xfd\xfd\x1f\xbcn\xa6L\x99\xb2\xbc\x8em\ -\x7fkz7\x04\xf4\x99, \xbc\x8c\xfe\x8d\xf5?\x8d\ -\xf5\xff\xd1\xff|\xd9\xfd\x9f\x84\x84\x84Qu\x99\x13\xfe\ -I\xb0k\xd7\xae\xbb\xde\xde\xdeM_F\xff\xc6\xda\x1f\ -c\xf6?_u\xff\xf9e\xe6\x84\x7f\x0a\xe0\xd8\xe9\xdc\ -\xb9s\xdf\xb7\xad\x7fc\xec\x7fM{\x0c/3'\xfc\ -S\x00\xdb\x9e\x98\x988\xb6.\xfaG\xfbo\x8c\xffS\ -\x9b\xfda\xee?\x1a3\xfek\xdb\xff\xd7\xcd\x09_ \ -~^^\xde[\xd7k]\xc1\xd8>\xa8\xcb\xfe\xbf\xa9\ -\xe6\xdf\xba\xdc\xff\x9a5k\xd6&S\xe9\x04\xd7\xdd\xf8\ -l\x1e\xfa,\x9d:u\x8a\x05\x1f\x0a\xef\x07z\xf2\xf9\ -\xfc\xeeuY\x93\x1b\x0b\xe8\x9f\x19\xa3\x7fc\xf7\x9fM\ -y\xff\xcb\x18\xfd'%%M0\x85\x1e\x8e\x1e=Z\ -\x96\x91\x911\xb3&\x1f\xe5u\xcd\xfb\xd8\x86\x7f\xa2\xfe\ -k\xdbc\xee\xd3\xa7\xcf\x08S\xb4\xff\x9bo\xbe9U\ -\xaf^=\x97\x9a{\xfa\xf5\xe9\x1f\xa1w\xef\xde\xc3k\ -\xd2\xbf\xb1\xfb\xcf\xc6\xe8\xdf\x18\xff\xb36\xfd\xe3\xb5a\ -\xaag\x18\xb7o\xdf~\xc3\x98\xbd\xa3\xd7\xa9\x7flK\ -u{x\xc6\xfa\xff\xc6\xd8\x7f\x9c3\xc7\x8c\x193\xef\ -U\xec\x0f\xf8>\x0da}\xf0\xd4\x94\xedG~qq\ -q5\xee\x9d\xbd\xeeu\x07\xb6\x09\xe7\x9b\xea\xf4o\x8c\ -\xff\xf3\xba\xed?>?\x0d\xbe\xff\xedWmku\xfe\ -\xd2\xc4\x89\x13\x97Tw?\xe1M\xac\xfbv\xec\xd8q\ -\x13\xdb\xa8\xcf\xd7X\xfbo\xac\xff\x89\xf7.\x8c\x19\x8f\ -U\xd9\x9f\x85\x0b\x17\xeez\xdd:X\xbe|\xf9!\xbc\ -\xc6\xde\x86\xfe\x11\xf0\x9e\x84>_\x1c\xff\xf8\x8eKm\ -c\x16\xdfK2\x95\xfd\xc7\xfd\x07C\xfd\x0f\x1c8p\ -\xe4\x9bh?\x02\xce\x09\x01\x01\x01\x11oC\xff\x08\xef\ -\xbc\xf3N\x92\xfe\xf87v\xff\xdfX\xfbS\x1b-C\ -\xfb\x83\xe3\x11}\xc47\xd5~F\x86\xf8\xf8\xf8\xca/\ -\xfe\xbcI\xfd#/\xe6]\x8a\xba\xf8\x9f\xa6\xba\xffn\ -\xa8\xffU\xabV\xe5\x9a\xa2]\xeb\xd6\xad;\x8b6\xb6\ -.u&M\x9a\xb4\x14\xe7\x847\xbd\xef\x07c~\x7f\ -]\xf4o\xec\xfd\xdf\xba>\xff\x83{\x86\xa6zf{\ -\xe8\xd0\xa1\x19x-}\xf9\xe5\x97G\xeaR\x0f\xf7\x8f\ -\xdf\xb4\xfe\xb1\xcd\xb8\xf66v\xff\xcdX\xff\xbf\xae\xf6\ -\x07\xe6\xa3-\xa6j\x93\x8d\x8d\x8d\x1d\xd2\xc4\xf1ZSW\xfdcx\x999\xe1\ -e\x01t4\x87\xe1\xab\xb3?o\xe5\xfd#\xc3\xfa?\ -\xfc\xf0\xc3\xc5Wm\x1b\xfat\xf8\xee\xf4\xcb\xf4\x01\xce\ -\x09x\x7f\xe0u\xea~\xc3\x86\x0d\xe7\xf5y\xe2\xfa\xd7\ -\x18\xfd\xbf\xae\xf5\xaf\x81,.\xa6\xf8v\xd0\xe6\xcd\x9b\ -\xff~\x19\xfdc\xc09\x01\xef\x93\xbd\x0e\xddC\xdb\x9e\ -\x18>3m\xec\xfck\xca\xfd7\x9c\xc3\xaa\xbb\xff\x8b\ -\xf7\xa9M\xf1,\xce\xf4\xe9\xd3\xbf}\xd9>\xc0\x80\xf7\ -\x8bM9'`\x9b\x18\x9b\xaf\x1f\xde\xf6\xfa\xab\xaa\xd0\ -\xbd{\xf7A\xa6\x98\x8f\xf1\xd9\xadW\xe9\x03|n\xc2\ -\x14\xcf\x02`[\xbav\xed:\xb0*\x1eu\xd9\x7f3\ -\xa5\xfek{\xfe\xc7T~\xf6\xbau\xeb\xceT\xf5\xdc\ -Am\x01\xe7\x02\xbc\x9fc\x0a\x19jzG\xc0\xd8\xf5\ -W]\xf6\x9fk\x93\xc7\xd8\xe7\xdf\xc6\x8f\x1f\xbf\xd0D\ -\xd7~\x05\xfa\xf9\xcc\xfd\x81\x9a\x02\xfa\xaf\xb8\xd65\xd5\ -\xf3G\xd8\x86\x9a\xf8\xbd\x8d\xf7_p\xff\xad]\xbbv\ -a\xb5\xe9\x02\x03\xee\xc7\x9bB\x0f\x08(\x17\xae{\xf0\ -\x19\x0d|O\x0f\xdf\x19C\xc08\xe6\xa1\xffe\xca\xfb\ -0@\xab\x02\x9f+\xa8\xa9}\xc6\xbe\xffej\xfbS\ -\x97w\xd8F\x8f\x1e\xfd\xa9\xa9t\xf26\x00\x9f\xe3\xae\ -\xee~B]\xde?5\xe5\xf3'\xc6\x8e\x7f&H\xa5\ -\xd2\x8f\xdf\xb6\x1e_\x05\xf0}\x86\xaa\xee'\x98\xfa\xfb\ -\x1b/\xb3\xff`l\xe8\xd5\xab\xd7\xb07\xfd\x9c\x8a)\ -\x01\xef7\x06\x06\x06v\xd0o\x93\xb1\xcf\x1f\x9ar\xfd\ -\xf5*\xdf\xffi\xd2\xa4IK\xf0\x85Mr\xff\xefm\ -\x00\xae}\xf4\xe7\x84\xba<\xff`\xaa\xf7\xafkZ\x7f\ -\x19\x13\xf0;A\xb8\xd7\xf9\xb6u\xc9\xc0\x86\x0d\x1b~\ -\xdb\xbe}\xfb\xf5\xba\xd4a\xe6\x04S\xde\x7f\xaf\xcb\xf7\ -\x97L\xf1\x0e9\xae\x11\xde\xe6\xfb\x92\xc8;99y\ -\x1a\xca\x82\xef#\xe3{\xc9u\xa9\x8fs\x02\xea\xd4\xd4\ -\xf7\xdf\xdf\x94\xfe1\xfc\x93\xde\x7f\xc7\xf1\x8c\xef\xe7\xd7\ -\x85\x0e>\x7f\x83\xef\x88\x98j\xfc\xbf\xad\xef\xef\xe1\xde\ -\xca\xe6\xcd\x9b/\xbdn\xbd\xe3\xb7=p\xcdP\x93,\ -\xf8\x9d\x0a\x9c\xe3\x8c\xa5Y\xdd\xb7\x5c\xf5\xc1\x94\xfb?\ -U=\xffl\xaa\x80>\x12\xac\xa3\xfe0\xb5\xde7m\ -\xda\xf4gM\xef\x11\x19\x06\xdc;\xc2\xef\xb6\x98\x8a\xbf\ -\xb1\xfa7\xd6\xfe\xd7\xd5\xff\xafk\xe0p8\xad\xf1\x7f\ -\x9f\xbc\x8a\xaf\x84\xcfY\xcd\x981c\x03\xfe\xef\x83\x97\ -\x91\xe1e\xe6\x84\xea\x00\xfd\x1fS~\x7f\xf5M~\xff\ -\xb3a\xc3\x86\xcdp\xaeF\x9b\x8d\xdf\xa8\xc1o2\xa1\ -\x0c\xb8\xc7\x83\x80\xf1\xec\xec\xecGX\x8680\xa7N\ -\xc5:\xa6\xe0\x8d\xbe\x1a~\xdb\xd1\x14\xe3\xdf\x94\xdf?\ -\xfc_\xfb\xfeg\xff\xfe\xfd%\xd5\xcd\x09\xf8\xecXm\ -\xfa\x7f\x9b\xfb?\xff\x96\x80s\x9e\xe1\x9c\x80\xef\xbb\x19\ -\xf3\xad\x857\xf1\xfe\xdd\xffB\xc0\xef\x9b2s\x02\xea\ -A \x10\xc4\x98\xf2\xfd\x17S}\xff\xe1\xdf\x1c\x989\ -\x01\xf7\xbdM\xfd\xfc\x95)\xbe\x7f\xf2\xbf\x14\xea\xb2\xff\ -f\xaa\xef\x9f\xbc\xea\xfe\xcf\xbf)\xd4\xe5\xfd\xf7\xd7\xf5\ -\xfc\xe1\xffrx[\xef?\x9a\xf5\xaf\x0duy\xff\xcb\ -T\xfe'\xda\x1f\x9c{\xf0\x99?\x5c\xa7\xeb\x01\x9f\x01\ -\xb4OxF\x1c\x1d\x1e\x9f\xc1\xc32\xfd<\xecK\xbd\ -\xfa\x02\xbd2\xbe\x1e\x0f\x86\xa6>?\x9a\x16\x02\xd2\xd0\ -\xaf\xa7\x0f\xfa4\x18y\xf4h\xf1u\xfc\xf9\xfeU\xb7\ -E\xc0\xb4\xa5*\xf9#\x22\x22z\xe1\xff\xc2y\x93\xfe\ -\x0f\xd3\x07x\x1d\xe8\x03\xaeO\x0c\xe3x\xd6\x8f\x1b\xd6\ -\xd1\xa7SU\x9d\xaah\xd7\xc4\xab&\x9eU\xd15\x86\ -6\xcah\xd8^}Z\xc6\xdc\xf37\xe5\xfd/3\xd4\ -\x1dL\xb9\xffl\x86\xba\x03\xee\x05\x1ac\x7fF\x8f\x1e\ -\xfd\xd9\xdb\x96\xf5\xdf\x08\xb8Oa\xc4\xff\x1f\xb4NJ\ -J\x9ah\x1e\xff\xa6\x07|\x16\xb2\xb6\xef\xbb\xb2\xd9l\ -\x0b|\xce\xd4\xfc\xffgM\x0b\xb8G\xfe\xfe\xfb\xef\xaf\ -rpp\xa8W\x93\xfe\xf1\xff3\xe3\xff\x8e\xff\xff\xfa\ -\xed\xd4\x7f*\xe0\xfb\xfbQQQ\xfdY,\x16\xbb&\ -\xfd3s@\xaf^\xbd\x86\x9b\xe2;bf\xd0\xfa=\ -\xf8\x8c\x05>\xa7R\x9b\xee\x99\x80\xffS)666\ -\x11\xbf\xeb\x83\xcf\xcf\xeb\xff\xbfP\xc3\xff\x1djL>\ -\x93\xae.\xbf&\x9c\xea\xca\xf4\xf3\x0c\xf3\x0d\xa1\xaa\xb2\ -\x9ahT\xc5\xdfXY\x11\xd0\xde\x1c8p\xe0\xc9\xd7\ -_\x7f}\xeb\xac_\xce\xc4\ -qO\x83I\xe3\xd90\x8d\x80u\xf5\xe2\xf3\xf5\xeb\xeb\ -\x83a=\xa4e(\x0f\x93\xc7\xc8d\x98\xa7_G_\ -\x16}Y\xf5A\x9f\x86a9\x961\xf9X_&\x93\ -\xcd\xc0\xef\xe6\xe2<\x8a\xfe\x0e>_\x83\xfa\xac\x8b\xfe\ -\xf5\xfb\x01\xff'9\xf6\x05\xd2\xb1\xb5\xb5\xb5\xc7xU\ -\x80v\xab\xba2c\x00\xeb\xbf*\x8d\x97\x95\xc5T|\ -\x19\xc0u\x14\xfa2/\xabws0\x07s0\x877\ -\x14\xd8_R\x04\xfdR\x0a~\xe4K\x16\xb1\xa0\xe3\x84\ -$~\xc9~\x16\xd7\xa2F\x89\xe5I\x12N\xbfT\xb9\ -J\xaeL\x95gp\xba\xcaE\x99\xe9\x12\x99\x8a\xd3U\ -\xa8\x12r\xbaH\xe5\xa2Q\x84\xd7%&6v\x80B\ -\x86\xf8\x18\xef#\x1c\xaf \xa4A\x02M\x87\xad\x03|\ -\x0em\x18\xb1\xd0h\x08q\xa0\xdfi\xb0\x88\xc2r8\ -\xb2\xf0\x88\xf5drE\xba\x86\xd8\xa0\x00\xcc\x13\xf7\xad\ -\x09\xc1\x1a\xb5\x83u|\xaa0C\xc2\xe1\x22\x1di\xa6\ -\x0c\xbf>\x83_\x8b\xb4&\xf1$\x95\x08I\x06\x91\x10\ -\x0e\xe1j\xe5\x93\xca\x94\x0a\x14@\x09U\xe8\xf4\xf84\ -1\xa6\x01\xbc1-\x92&I1M\xe9\xda\x93&K\ -\x1e\xa7+\xa7\xd3\xa3d\xa3\xe4\xfai\xa92#\xf9\xb9\ -\xb4H\x8a\xf4m\x18uc\x9e25\x1dy\xf4\xc4\xc6\ -\xd1<2\x95*]q\x08@}\x9d\xd6\xa1V\xbaD\ -%\x14\x83ru9\xb6R\xe1x\x89b@Z\xbaD\ -,\xcfL\x8a:\xc7+\xc9\x90\xf4\xb8B\xd3L\x1e\xa7\ -\xc8\xd0\xd5}>P\xd0\xea\xbe\xa4\x1eq v\xc4V\ -\xf7s'1\xa47q\x01\xad\xb8\x11O\xe2M\x1a\x00\ -\xb4&\xcdA+\xcd\xe1\xe7\x03\xe7\xc6\xa4\x11i\x02\xd0\ -\x92\xf8\x92\x16pl\x05\xd0\x02\xca\x9a\xd1\x18\x1c\xc0n\ -\x039\xdac\x0b\xc0\xc1Z\xbe4vK\xfa\xd7\x16\xea\ -6\xd2QiF\xff\x1aC\xac9p\xf3\x02p\x07\xbe\ -.\xc4\x15~\xb1\xa4\x0f-\x91\x0d\x80\x1d\xfc\x1c =\ -\x88p*\x88\x85\xa5s3?\xae:\xa0<\xd0\x8b\x1b\ -\x10\x10\xc8\xe5\x06\x06r\x03\x03\xb8\x01\xf4\x09\x93pP\ -\x07\xda\x05\x04a\x09\xe4\x06\x04\xa8\xb9$P\xcd\xb5\x0c\ -\xd4\x15\xa9\xb9\x9a@\x1b\xc0\x0f\xf0k\xe5eC\xa9\x89\ -\x86XSn\x83\xd7_\xbcWPPQH\x0a\xd4\x85\ -\xe4aE\xa1\xa6\x80*,(.d\x17\x14\x16B\x8e\ -\xba\xc0\xba\xb0\x00\xa3\x85\x05\xe5P\xd4\x10\x13\x0f1U\ -X\xf8\x10\x8f\x90,xp-{\x92\xbf\x15\x8c2\xc2\ -\xf6\x98~\xbfb\xb3\xc6\xa2do\x94\x15\x8cj\x1b\xe9\ -\xe3\x1f4l\xf5\xee\xb6\x14\x8b\xb48\xb9Q\xc3*\x1e\ -g\xcdb\xf5-\xda\xa0\xa1\xf6\xb9\xb1,\x15\x15\x10\xb9\ -\xdc\x9ce3]\x0d\x91\xfb\xedX6\xb31\x92\xef\xc7\ -\xb2\x9d\xab.\xd4\x10\xf5E\x8dZ]\x01\xe7{\x90\xd9\ -\x9ee3W]\xaa\xf1T\x9f\xc8\xce\xc9>\x90s \ -'\xe7\xc0\x81\xfd99\x90\x80?\x88\xab\xb3+r\xec\ -\xb21\x83\xce\xdb\xaf\xce\xd1\x1c(\xc9\xb1B<(\x86\ -T6u\xb8\xb0DC\x15\x00\xf59@\x88]\xda\xdb\ -\xcb\xb3\xdc\xcb\xc3\xd3\xcb\xc3\xdb\xd3\xcb\xdb\xdb\xcb\xdb\x8b\ ->yzz\xe3_\x99\x97\xb3\xa7\x07\x14A\x19\x94x\ -y{\x22B\x85\xb7\x0d\x8d\xe9\xed\xd9\xfe0\x92jO\ -\xd9\xce\x81s\x09o\x1f\xa1\xdc\xf7A,\xdf\x1fE/\ -\x85\xac\xf0}\x84\xe5\x96\x8dQ\x86!U\xcc\xab\xcc\xcb\ -\x0f\xa0l\xa0\xa6U\x09\x9f\x10\xf1\x22\xab\x83\x84r\xdb\ -\x8f\x04\x03\xb4\xa8\xd6%\xe1\x84_\xa29\xe8}\x88P\ -.4]?-]v\x09\xcf'_\xad\xa1\xae\xf3\x0f\ -C\x95l()\xd4Qg\x95v\xbcS\x0e<\x92\x8f\ -\x80(\xfb\xe9*\x94m\x16\x0a\x97\x07\x87\xc5\xd6\x85\xc4\ -\x91;\xeb\xf0\xdd\xe2\x0a\x8d\xa6\xa2\xf8\xde\xe1\xd9\xdc[\ -\x80\x87\x04@\xb14iR\xfeTC\x1dl\xf0\x84\xb0\ -\x82\xb7>z\xa4a=\xde\x1e~W\xc7\xa3 \x80n\ -'\xa9(\x02\xce\x82bB\x89/\xdf\xd7PWS\xee\ -3$\x80\xd5\xdc\x12\xe8\xdd\x99\xa5OQ\x842B\x85\ -^\xbd\xad\xa1\xae\xf1\xf2\xa1\xc1\xfb\xb5\x0df\xd9\xcc\xd1\ -6\xa0\xe3\xad\x22\x8d\xe5bk0s\xdb\xafk\xa8\x9d\ -N\x85:*\x05\xba6Z@\xe3\x1b\x1d-\xd2\xb0\x0f\ -6\x18_rUC\x95Nz\x08r\xe4\xe8\xd4\x83\x18\ -\x96\xa5\xe1`\x07\x96\x17iH\xc9\xdf\x1a\xea\xb0\xc5c\ -]\x93Q\x17YZMW\x10jT\xe9\xaf\x1a\xean\ -\xd3'\x0cy\x7f\xa6\xb3\xca\x09\xd5\xf1\x16\x94\x95\xf6-\ -\xaa,\xd3uQ\x09\x1fdot\x14\x0a\xd5c\x9f\x12\ -\x96{\x0e-\xbb\x1fe3\x17k\x86\x97\x12\xca\xe6\x8b\ -3\x1a2\xb6\xb8\xb2s\x03\x98\x0e\xe7\x15\x13\xb2)_\ -c]~rR\xac\xb7g\xf7\xf2\xfb\x1a2\xbe\x84\xe9\ -\xd7\xcaa\xc1+!dB\x81\x86U6\xd3\xa2\x8c\x90\ -\xd2{\x1a2\xa1\xf4\x05$~)!#\x0a4\xd4)\ -\x17\xc0.\xbd\xab!\xc3\xcb\x98\xde\xf6\xd7\xb5\x90\x16\x94\ -W\x01H7\x04Z$\xaa\x22\xbc\x5c\xa7\x07\x10\xcaf\ -\x9e\x96\x1dd5|\xfa\x00b)@\xb3\xf4\x8e\x86z\ -\xea]\x01\xed\xd2\xf6\xc93\xa9@]\xac\xdb@c\x89\ -u9\xa0A\xd7\xddd\xa9uba\xebgc\xeb\xf9\ -\x15\x84\xec\x82\xa2C\x0d!RzKC\xb6\xaa\x81\xd2\ -^$\xf0\x80\x11\xab\x98\xaf&d\xe4M\x90*\x02\x22\ -\xa575\x16I0\xcf\xd0c\xc4\x9f\x1e#\x96%<\ -B\x1a\x96\xdd\x80^N\xd5\x22\x94\x82\xc1\xdd\xafw]\ -Z F.4\xec\xec\xcd\x22\x0dk\xa9u\xe9\x0d\x0d\ -{\xbf\x16\x05\x87\xea\x1c\xdd\x08i\xaa\x06-f4<\ -\x02C\xf20\xa2\xa8=\xdd\xb5\x0a\xa2\xd9\xc00#[\ -\xf25l;b\xbd\x0c\x86\x89\xfa\xba\x86\xf5\x03=\x84\ -\x18\x05\xb2\xe1\xca\xbbS\xa0!\xa5\xd0\xf24\x1c\xb5e\ -\xf3Jz\x92\x12\xa0y\xcb5[\xaf3\xd8\xc0\x0ar\ -I!(2\x02\x04\xa2\x96ZC\xbf=(\x80\x02w\ -\xed\x00\xd0!\xb2\x80c\xbe\x86\xdc\x82n\xd1\x0a\xd5\x10\ -4y#_\xa3S\x22C\xae\x98G\xca\x80\xdcC\xe8\ -t\xeb\xa5E\xa8'Pf\x01\x0e\x08\xddE\xfb\x8c\xed\ -}\x14\x0f.\xb6\xd4\x12\x10\xaf4\x0d\xf4\x09\x82\xb0\xef\ -i\xc7]a\xa5|\x05\xe9\x0e\x03\xdb#\x93\xf35,n\xa5hY\ -:\xa5\x92+\xc0\xf3X\x91V6R\x0a\xec.\x90\xca\ -\x8b\x87\xe9\xbdH0\xcdT\xb9\xc3\x13\x94\x0c\xfaO\x1d\ -L\xb4\xa2kQ\xe0*\x01I\x17\x03\x9d5\x8fQ\xa4\ -[\x1a\x8b90\x04\xf4\x8d\x18=\xde\xc8E\xa0R\xe6\ -\x018\x0d\x0f\xdd\xd1\x90\xf30\xdc\x5c\xf7=w\x15\x84\ -C\xd7\xb8\x14\xc14\xf0\xf7#\x10h\x09\xcc\x01O\x9c\ -\x98A\xa9\xebf\xaa\x14\x07x8LL\xe4[0\x12\ -)%\xa0\xef\xf2\xe0\x8aJ\x0bXI\x0aze\x10\xce\ -(\x9b\x00K\xf0\x148\xab\x07BEW}\xb3\xa3\xbd\ -\xec&\xc3\xc0;\xe3\x0dmkx\x16\x9a0\xa9\x0cF\ -\xb8N\xdf:k\x8a\x17\xf0B\xe8\xaf\x8a\xa5v%\x84\ -\xe5\xb0\x0c.A\xb2\xb0\xd4\xc0\x84Q\xc5a`\x0d\xe6\ -\xe5kl\xd5\x17f\x8bCC\xc5\xb3/\xaaA\xb4\x8a\ -\x91\xa5\x8c=|\xc6\x95\xf7\x94\x90OOk\xa8/\xe0\ -\xd2\xd3\x99\xdb\xca\xab)\xac\x88\x90\x8f\xa1\xec(\x5cr\ -\xcc\x0c\xa1\xd32\x0fd\x1cVvFC\xdd\xea\xa0f\ -.\xe8J\xdd\x15\xf3@\xaf-\x1f\x9c\x01K9\x92h\ -{\xb0\xd0\x8f\xd1\x18h\xd3\xea\x18\xd8\xcd\xdf\xae\x83\x8d\ -\xfd\xc2Z7\xdc\xe9\xf9\x08\xc8\x825\x9e\x5cz\x15.\ -\xcbi\xa4\xc1A@8\xea\xaf\x1b\xe6\x0c\xdf\x02B\xe9\ -\x0c7t\x86\xf5b\x18LwNi\x85\xb6\xd1)\xfb\ -\x01\xa1\x82/\x81\xa1\xb8\x1c\x0azI.~\xaa\xd1h\ -\xad(#\x1c\xff\x1e\x88\xfe\x07\xcc \x7f\x0e\x87\xf1(\ -\xb8\x9e\xaf\x9dAh\xfeaw\x08\xab\xf5\xfa\x070\xff\ -<\xd8\xd0\x16\x1a\xd1\xe0 tH!3\xcf\x86\xdf$\ -\x8e\xcd&\xef\xbc\xfa\xa8\xa4\xa2\xa2\xe4\xd1\xd5\x9dS\x9b\ -\x814V\x8b\x0a\xe9\xf9Eg\xc1y0gJ\x8a\xcb\ -\xe1\x1a{\xaesy0\xc7\xf2\xaf\xc3\xd4y\xfb\xe8s\ -\xf34\xef\x00\xb1\xf4>\xa8)\x89\xd1\xda f\x0c\xe7\ -\x10\x0b\xabE\xe2\xca\x0bD79\xec\xab\xd4\xb4nJ\ -(\xa5g\xfe\xfd\xfa\x9d\x863?\xf5\x9cE\xd3e\xe5\ -\xe8f(\xdaZ\x94\x8a#\xd4\x025\xdf\x9d\xc7\x8f\x88\ -\xe0\x0b\x04<8\x84\x0b\xf8\x82\x08>?B\xc0\xe7U\ -\x084<*<\xa2\x9co\x0b\xa9\x88\x08\x9e\x80\x1f\xce\ -W\x0b4|[\x01O\x8b\xdc\xeb\x04#m1\xda\xb0\ -\x12\x9b\xe2\x92\x92\xe2\x92b\xf8\xab(\xb1*\xd5\xc6\xd5\ -%\x04\xc0I[B\x97A\x0c\xca1\xd7\x12\xe3\xa5\xa5\ -\xea\x12M1U\xa2\xae\xbc\xec60\xfd\x08\x91\x07@\ -\xfd\xb3\xef@_\xedX\xd6\x131\xe3lS\x96\xc5\xc0\ -\x22p\xe2*V\xd5cQ\xad\x8eB\xecf\x7f6\x9b\ -\xd8\x0e\xbf\x0dN^\xc14W\xf4\xff\x5c\x12s\x9f\x96\ -\x81cY\x0e\xa0V\xb34j8Z\x02@\xa4Bm\ -G'\xe1\x00\xc7r<\x80\xf5\xc0T\x19\x80\x86F.\ -W[U<9.\xf5D_\xd2\x86\xb2\xf3O\x9c\xbe\ -`aV\x96z\xae&\xcbu^V\xd6\xdc\xac\xac9\ -s\xb3\xe6\x22\xcc\x9d7w\xee\xfc\xb9\xe5Y\x96\x18\x9f\ -\x03\x18\xf5\xe6de\xcd\x83X\xd6\x1c\x1a!kN\xc5\ -\x5c6\xa4\xe7\xa8\xe7\xda\xcf\x9b3'k\xc6\xf8\x81\xed\ -\x1c`\xb9\x00N4ei\xe7`_\x06\x8e\xffC;\ -\x8dm\x01\x9c\x8b\x00\x1e\xd8\xb1l,\xa8\x0a\x5c\x1a\xb0\ -j\xf8Y\x81;nE\xff\x9caY\xe1\x00?'p\ -\xd3\xb51\x078\xbb@\xbe\x1b}\xf6\x00p\x82%\x86\ -=\x1c\x9d\xe8\x85\x86\x03}\xb4\xa1q\xb4\xcb\x0cw\xfa\ -\xecI\x83\x16\xc3\x11~\x0et\x0d\xfc\xb9\xeax=\xfb\ -U#\xd7\xb7\xb9\xd5\xff\x1e\xe7\xee\xd7<\x81#\xf4G\ -\xeeA\x88\xe5\xe7\x1e\x82\xe3\x83\xdc\xc3p\xbc\x9f{\x04\ -\x8ews\x0b\x09;/77\xaf8\x97\xe4\xdd\x22O\ -r\xef\xe4\x82\x17x\x04-\x92\xe3\x15:\x8d\x92\xe3\ -\x05t\xd7B\xcb\xf2\xca+5_\x00\x95N?\x01\xf5\ -\xe6W*\x1f\xe6\xcf\xbc\xfb\xa0~r\x12QKu\xfd\ -H\xf2\xee\xe6jNh\xe8\xc6Py\xba\xbe\x83\xe91\ -\xefd\xae\x96\xdaSr\x22W\xcb\xab\x88\xce\xd5J\x02\ -\xf3[n\xde)\x9d\xfaa&\xb8\x81\x03*\xef\x16$\ -\x1e\x02\xd6%h\xfeM\x88\x17\xea\x06\xa0\x9a`I>\ -\xc8\x0a=x\xa2\x14\x9a\xf48\xf7>\xcd\x1a\x07\xd8]\ -H\xdd%j\x1c\xd0\xa0\x82{\x90\xbaE,N\xe0\x90\ -/\x05\x91N\x14\x90\xfb\x90uX\x93\x0f\xc7C\x9a\x02\ -8\x1e\xd4\x14\xc2\xf1\x80\xe6a\xe5\xe5cx\xac\xeer\ -3\x1b\x10\xb3\x011\x1b\x10\xb3\x011\x1b\x10\xb3\x011\ -\x1b\x10\xb3\x01y\x0b\x06D{\x8f)V9\x8a\x10\xb8\ -\x84\xe9\xfb?t\x08\x9a\xa6\xbb\xd7\xd2O\xa8R1\xf7\ -]\xbak\xf1\x1c\xf4\xf1\xf0\xf0\x7f\xa8-\xb6Q\ -\x00\x00\x09t\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Sky Icon\ - / System / View\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\ -\x0a \ - \x0d\x0a\ - \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \ - \x0d\x0a \ - <\ -/polygon>\x0d\x0a \ - \x0d\ -\x0a \x0d\x0a \x0d\ -\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x14\xc4\ -I\ -I*\x00b\x07\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ -\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ --\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ -$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ -S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ -O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ -\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ -B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ -\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ -o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ -\xc4Sp\xd8\x9cf6\x7f\x8b\xc7drS<\x86O\ --\x97\x93\xe5s\x19\xbc\xe4k5\x9d\xd0hk\xd5\x8d\ -\x16\x97M-\xd2Q\x00:\xbb\xf4\x805\x05\x1d\xc1F\ -PQ\x8c\x14;\x05\x08\xee!.\xf8+\xc2\x0a\xe3\x82\ -\xb3\xe0\xac\xe8+\x13V\x01s_s\xf9MM\x0f\x8f\ -l\x90\x06\xe0\xa5\xc8)B\x0a7\x82\x80f\xd2\x18#\ -.\x0a\xaf\x82\xa9x\xfc\x0bG.e\xe6\x98\xf3\xeb\xb2\ -\x01\xc4\x14\xe1\x05)\xc1@\x95g\xe7~\x0a\x90\xe3\xb1\ -\xbd|\xda\x17\xa2`\xf5,\x88\x13n\x82\x11\xa8(\xaa\ -\xbd\x15\xa8(\xe4\xe3\x9cJ\x9b\xfc\xab\xbb\x8a4\x00\xa2\ -\xa4\x002\x0a9\xa0\xa3\xda\x0a\x05\xb1\x07\xb2\x0aB\xa0\ -\xa4k\x8e|\xa8\xf0zY\x13%p\x9a|\x90\x08\xc8\ -)&\x82\x84\xcd\x11\xb6\x82\x8d\xce9p\xa1\xc5\x09T\ -r\x94\xc5Na\xfe\x01 \xa4\x1a\x0a=4\xe8y\x11\ -\x0c\xb8\xe7\xf2s\x1d\xa5\x12bO\x1e\xc4\xe8\x10 \x82\ -\x94\xc8(\x93\x22\xa2\xd1\xba\x08,\xb8\xed\xf3\xce\xfe1\ -\xf3\x02}(3(\x10T\x82\x96\x08(K,#\xa6\ -\xe3\xaa\xe3\x9a\xb0\x82\x95'$\xd3\x22D\x90\x08o\xb2\ -\x08\x06\xcd\x899\xe8\x82\x8a.9x\x94\xce\x89-\x0a\ -\x92N\xcc\xf2\x04\x22\xa0\xa5\x8a\x0a\x04\xcf\xa9\x81\xf0\x82\ -\x89\xce9wCLI\xed\x0e\x91\xd1(\xacYF\xa0\ -\xa0B\xa4\xe4\xa0\x85b\x0a[\xa0\xa7\x0a\x0ar#\xe8\ -+^\x82\x17\xa8(8\xaeRh \x9e\xe3\x97H\xf5\ -7;\xd3)\xe5:\xd1\x9f\xe2<\xd1P\xa9\x87\x02\x0a\ -:;\xf2J,\x90M\xc8 F\xb1V\xa0\x00\xa0\xe3\ -\x974T#\x0aW\xa9\xdd~\x85\xa4\x01\xaa\x0a`\xd1\ -\xeaa\x18\x82\x8f\xce9\xef] Vh\x01g\xac\xf0\ -\xf2\x08\x1f\xb8\xe6e\x97l\xa7U\xda=m\xa0\xc9\x00\ -<\x82\x99((0\xa3IH \xd8\xe3\x92\xf4%\xd2\ -\x82\xdd\x8ba\xce\xeb\xbck\xb5\xe9%\xe1\xe9\xb5\xb6\x90\ -\x01\xc8)\x8a\x82\x85\x8a`\xc8\xe3\x93\xb0\x85\xd5\x84\xad\ -\xe6\x92\x0a\x1e8\xe7\x9a\x1d{#\xb9B9;$\x0e\ -\xd2\x08Y\xa0\xa2Z\x98P8\xe3\x0c}\x8f\xafE\x94\ -\xde\xd5\xda\xf7\xce\x22\x9a\xe5H\xdeX\x81\x0f\x92\x0d\x8a\ -\x82\x85W6o\x840C\xbb\x8eE!Z\x0d\xac\xa5\ -EI\x00z\x82\x97\xe8(\x06\xa6\x0c\xae99\x88\x1f\ -\xf9\xc2\xfe\xfa\xa0\x99#W~\xaa\x19\xecq\x9f\xa6\x8e\ -~(\x82\xe4H >\xa6UH J\xe3\x9f{\x06\ -\xc4\xc2Fh `\xe3\x9e\xda\x923\xc1#\x1br\x05\ -\x02\xa0\x83\x92\xa4D\xb8\xe3\xc55\x83\xd9\xccq\x02\xe3\ -\x90\x1c\x22/\xcb#2\x9a\x08\xf2\x00\x00b\xa4 8\ -\xf7\x02yfi\x8ckx\x82_h$\xfe\xa3s\x08\ -\xc0\xec\x82\x91*\x95\xce\x82\x01\xfb\xc7\x1f\xb0\xf4\xac\x97\ -\x14\x82\x11\xf1.\xd8\x9b\x16\xa8(\x94\xa9\x1b\xae8I\ -\xb5\x9f\xe1\x12\x0a\x02\xa5\x99\x86\xec\xa9y\xc0\x00\x9d\xdf\ -mJ)\xb3\x18*F+\x8e\x1e0i\x06\xb2\x82\x08\ -\x0a\x91\xb0\x82\x85>\xa2\x9bw\x00\x14\x82\x9eZ8\xe2\ -o\xba\x81<\x08#\xac\xa7\xfd\x10\xe7Y\xdf\xa6\xa6\xfa\ -\x0a\x10*F3\x8elL\x11 \x18D\x15\xab\x94\xf1\ -\xbc\xeeJ#\xad\x22\xea\x5c\x82\x04B\xa47\x8e; \ -9D\x08m&\xa2\xa4\xb5H H|\xc51#\x90\ -@\xeeT\x96\x8b\xb55c\xe8\xba\x92\x07\x98A\x12\xf0\ -\x00\x01EHB\x10P\xfb\x06\xca[s \x83u\xad\ -\x15 \x86q\xc5\xf4% O\x84\x82=\xf2\x9d\x09\x08\ - ! \xaa\x91l=R~\xe1\x87\xf8\xa9 \xa1X\ -\xa9\x10\x04`\x06\x06u\x00A\xa0\xf0\x88L*\x17\x0c\ -\x86\xc3\xa1\xf1\x08\x88\x01\xff\x14D\xc1\xce\xd1(\xccj\ -7\x09O@\xc0&8\xa3\xfe9$\x92\xc2$Ri\ -Lr?\x13\x8a\x08\xa0\xed\x0886U4\x8d8\xe0\ -\xe2H\xfb\xeak<\x9e\xc2\xa4@h;r\x0e\x1d\x9f\ -Q\xa1N\xf88\xb6>\xe5\x94Q\xe8\xf4\xea|\xfaY\ -'\x8a\x17\xa0\xea\x1a\x95j\x0ci\x8f\xa6+v\x08\xcc\ -\x88\xd1\x07K\xd8i\xe5x\xfa\xaa\xab#\xb3\xca\xaa6\ -\xe9-R\x17\x22O\xc1\xcc\x17\x19\xa3\x8a\x0e*\x8f\xbd\ -o6\x19\x102\x0e\xd6\xa2`%)\xa8\xf9\x9e\x19p\ -\xc3\xd8\xa2\x98\xe9\x5c\x0e\x1b\x22\x04A\xd8\xd0q\x8eF\ -H\xa5\x8f\x973t\xf9\x12\x9a\x0eY\xd0F\xd9\x90q\ -\xe4}\xf3\x8c\xc8i\xa28\xdd|2\xe7\x0e\x91\x07 \ -\xec\x988ke\x125\xc7\xd2\xdb\xc8\xe4\x88\xdb\x07I\ -pb\x0eH8\xe2\x99\x10\xd8\xf1\xe0\xfc\xeex\x03i\ -\xb0\x8a\x0c \xec8>\x0f\xa5'\x83\x9d#\xe8\xee\xe4\ -&E\x05\x83E\xa0\xc0\x1f\x14\x1d\xe7\xa9\x8f\xb4\xa3]\ -\x1e\x7f\xc7\x8f\xd4\xf8E\x090u\x94\x1c\x09\xea\x85Y\ -\x90a\xdd\x1f{\x18\xe4\x88\x0eA\xc8\xb4\x1cf\x7fP\ -\x93\xf1\x07\x13\x11\xf2\xe5%|\xdc\x18M\xbc}RD\ -\x89\x9fA\x8a\x04\x1c\x03\x82\xd0\x83\xa1\x07\x1e\x10r\x99\ -\x1f>\xd3\xe5\x01\x07\x16\xd0r\x1d\x07\x05\xe1\xf4\x1c\xfd\ -]\xd1\xf2\x914\x85[(\xdd\xaf\x85\xd2\x94\x88XA\ -\xca7\xee0B\x8f\x04\x1c\xb0A\xcb\x84\x1c\xe1A\xdc\ -\x94)\xb7A\x81\xf4\x1cHA\xc5\x04\x1c\x10\x90\x90\x98\ -\xc9\x06\x17\x11\xf2\xa2(k\xa0\xb8\xe5\xa6\x8e\xd3T\x88\ -T\x89\x10p\x16W\x9a\x97\x985\x06\x16Q\xf2\xb1R\ -\x98Z\x09\xcd\x9b\x98\xe5\xe3\xfeTA\x8at\x1d\x96\x9a\ -\xe7\xf4\xf4\xf8i\x11\xf9\x19`\x9dY\x1a\x1d\x8e\x9d\xda\ -\x14P3A\xca\xe4\x1c\x1e\xa0)4i{A\x854\ -}\xa8\x5ch\x96\x1e\x9c`(\xb5m\x22\x05\x10yu\ -\x06\x10\xe9J\xa1\x08/\xd0u\xa5\x03:\xe8\x89}\xfd\ -\xa7\x97\x9a\x81gH\xa1\xe4\x18\x88w\xaa\x99\xa9\xe1A\ -\x87d~Y\x9d+\x17\xaa\xb3\x5ckZ\xc0\xff~\x10\ -bE\x07\x09k\xc6\x99CA\x86\xf4|\xb6x\xace\ -\xba\xd8Y\xec\x86\x9a)A\x87$\x1c{v\xad\x05\x1d\ -\x7fA\x88d\x1c\x8dj\xe1\xfbi\x81\xb1\x1e+q\xd2\ -H\x81\xb4\x1c\x8aA\xc5\xab\x91&\xa9@\x01\xd5\x1f\x93\ -'\xfb\xb6\x86\xbb\xdd\xcb\xc60H\x83$\x1cnA\xe3\ -\xe4\x18\x07\xaaZ\xc4\x19k\xb3\x11\xf36\xf9KV\xd9\ -\x83\x03t\xb0ZM\x22\x05j\xc9M\x07\x0f\xe4\x16\x82\ -m\x00\x0c)\x15\x07*Q\xf3\xab\x16kq\x8a\xcb\x1a\ -s\xf1\xcc\xb9\x06H\xa5d\x188fs\xb4\x19EA\ -\xb3\x80\x00\x11B\xe4D\x19IA\x93t\x191A\x8c\ -\xf4\x1c\xc8G\xf4l\xd5\xf6\xcc,\x5c\xcbQ\xd5\xb5}\ -a\xbc\xc0u\x9ds]\xd7\xb5-\x7fa\xd8\xb64\xf7\ -[\xd96}\xa3.\xd9\xb6\x9d\xb3m\xa06\xbd\xbbq\ -\xdc\xb5MOs\xdd\xb7{Cp\xde7\xbd\xf2\xd9\xd5\ -w\xde\x03\x81\xd6\xb7\xfe\x0b\x85\xe1\x97\x9d\xeb\x87\xe2\xb8\ -\xb6\xd7\x84\xe38\xfeA&\xe2y\x1eS\x86\xe4\xf9^\ -c}\xe5\xf9\x9esv\xe6\xf9\xde\x83m\xe7\xfa\x1e\x93\ -d\xe8\xfa^\xa3^\xe9\xfa\x9e\xb3W\xea\xfa\xde\xc3\x16\ -\xeb\xfb\x1e\xd2\xa9\xec\xfb^\xe3\x00\xe3\xbb\x9e\xf3d@\ -@\x13\x00\xfe\x00\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\ -\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x01\x01\x04\x00\x01\ -\x00\x00\x00`\x00\x00\x00\x02\x01\x03\x00\x04\x00\x00\x00L\ -\x08\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\ -\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00\x11\x01\x04\x00\x01\ -\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x04\ -\x00\x00\x00\x16\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x17\ -\x01\x04\x00\x01\x00\x00\x00Z\x07\x00\x00\x1a\x01\x05\x00\x01\ -\x00\x00\x00T\x08\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00\x5c\ -\x08\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\ -\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\x00\x10\ -\x00\x00\x00d\x08\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\ -\x00\x00\x00R\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00S\ -\x01\x03\x00\x04\x00\x00\x00t\x08\x00\x00s\x87\x07\x00H\ -\x0c\x00\x00|\x08\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\ -\x00\x08\x00\x802\x02\x00\xe8\x03\x00\x00\x802\x02\x00\xe8\ -\x03\x00\x00paint.net 4.0\ -.9\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x0cHL\ -ino\x02\x10\x00\x00mntrRGB X\ -YZ \x07\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00a\ -cspMSFT\x00\x00\x00\x00IEC s\ -RGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-HP \x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11c\ -prt\x00\x00\x01P\x00\x00\x003desc\x00\ -\x00\x01\x84\x00\x00\x00lwtpt\x00\x00\x01\xf0\x00\ -\x00\x00\x14bkpt\x00\x00\x02\x04\x00\x00\x00\x14r\ -XYZ\x00\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\ -\x00\x02,\x00\x00\x00\x14bXYZ\x00\x00\x02@\x00\ -\x00\x00\x14dmnd\x00\x00\x02T\x00\x00\x00pd\ -mdd\x00\x00\x02\xc4\x00\x00\x00\x88vued\x00\ -\x00\x03L\x00\x00\x00\x86view\x00\x00\x03\xd4\x00\ -\x00\x00$lumi\x00\x00\x03\xf8\x00\x00\x00\x14m\ -eas\x00\x00\x04\x0c\x00\x00\x00$tech\x00\ -\x00\x040\x00\x00\x00\x0crTRC\x00\x00\x04<\x00\ -\x00\x08\x0cgTRC\x00\x00\x04<\x00\x00\x08\x0cb\ -TRC\x00\x00\x04<\x00\x00\x08\x0ctext\x00\ -\x00\x00\x00Copyright (c)\ - 1998 Hewlett-Pa\ -ckard Company\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00\x12sRGB \ -IEC61966-2.1\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x12sRGB IEC\ -61966-2.1\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ -\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccX\ -YZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\xa2\x00\ -\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\ -\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\ -\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfd\ -esc\x00\x00\x00\x00\x00\x00\x00\x16IEC h\ -ttp://www.iec.ch\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16IEC \ -http://www.iec.c\ -h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ -esc\x00\x00\x00\x00\x00\x00\x00.IEC 6\ -1966-2.1 Default\ - RGB colour spac\ -e - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00.IEC 61966-2.\ -1 Default RGB co\ -lour space - sRG\ -B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ -\x00\x00,Reference Vie\ -wing Condition i\ -n IEC61966-2.1\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00,Refere\ -nce Viewing Cond\ -ition in IEC6196\ -6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\ -iew\x00\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\ -\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\ -\x00\x00\x01XYZ \x00\x00\x00\x00\x00L\x09V\x00\ -P\x00\x00\x00W\x1f\xe7meas\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x02sig \x00\ -\x00\x00\x00CRT curv\x00\x00\x00\x00\x00\ -\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\ -\x1e\x00#\x00(\x00-\x002\x007\x00;\x00@\x00\ -E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00\ -m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\ -\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\ -\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\ -\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\ -\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01\ -E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01\ -|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\ -\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\ -\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02\ -A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\ -\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\ -\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x03\ -8\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\ -\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\ -\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04\ -c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\ -\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05\ -I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\ -\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06\ -H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\ -\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07\ -a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\ -\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\ -\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09\ -:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\ -\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\ -\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0b\ -Q\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\ -\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\ -\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\ -\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\ -\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f\ -^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10\ -C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x11\ -1\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12\ -&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\ -#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14\ -'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x15\ -4\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16\ -I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17\ -e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\ -\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\ -\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\ -\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c\ -*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1d\ -p\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\ -\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \ -\x15 A l \x98 \xc4 \xf0!\x1c!H!\ -u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\ -\xdd#\x0a#8#f#\x94#\xc2#\xf0$\x1f$\ -M$|$\xab$\xda%\x09%8%h%\x97%\ -\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'\ -I'z'\xab'\xdc(\x0d(?(q(\xa2(\ -\xd4)\x06)8)k)\x9d)\xd0*\x02*5*\ -h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\ -\x05,9,n,\xa2,\xd7-\x0c-A-v-\ -\xab-\xe1.\x16.L.\x82.\xb7.\xee/$/\ -Z/\x91/\xc7/\xfe050l0\xa40\xdb1\ -\x121J1\x821\xba1\xf22*2c2\x9b2\ -\xd43\x0d3F3\x7f3\xb83\xf14+4e4\ -\x9e4\xd85\x135M5\x875\xc25\xfd676\ -r6\xae6\xe97$7`7\x9c7\xd78\x148\ -P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:\ -6:t:\xb2:\xef;-;k;\xaa;\xe8<\ -'\ - >`>\xa0>\xe0?!?a?\xa2?\xe2@\ -#@d@\xa6@\xe7A)AjA\xacA\xeeB\ -0BrB\xb5B\xf7C:C}C\xc0D\x03D\ -GD\x8aD\xceE\x12EUE\x9aE\xdeF\x22F\ -gF\xabF\xf0G5G{G\xc0H\x05HKH\ -\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\ -\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\ -\x02MJM\x93M\xdcN%NnN\xb7O\x00O\ -IO\x93O\xddP'PqP\xbbQ\x06QPQ\ -\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\ -\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\ -\x5cV\xa9V\xf7WDW\x92W\xe0X/X}X\ -\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[\ -E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']x]\ -\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`\ -W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\ -\xf0cCc\x97c\xebd@d\x94d\xe9e=e\ -\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h\ -?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\ -\xf7kOk\xa7k\xfflWl\xafm\x08m`m\ -\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\ -\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s\ -]s\xb8t\x14tpt\xccu(u\x85u\xe1v\ ->v\x9bv\xf8wVw\xb3x\x11xnx\xccy\ -*y\x89y\xe7zFz\xa5{\x04{c{\xc2|\ -!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\ -#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x82\ -0\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85\ -G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88\ -i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\ -\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\ -\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\ -\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95\ -_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\ -\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\ -\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\ -\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\ -\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\ -\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\ -\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\ -\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1\ -`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\ -\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\ -\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\ -\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0\ -p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4\ -Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8\ -=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc\ -5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd0\ -9\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4\ -I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8\ -d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\ -\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\ -\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\ -\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9\ -F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\ -\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\ -\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6\ -m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\ -\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xff\ -m\xff\xff\ -\x00\x00\x08A\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - icon / o\ -utliner / slice \ -/ not active - s\ -aved copy\x0d\x0a Cre\ -ated with Sketch\ -.\x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\ - \x0d\x0a \ - \x0d\x0a \ - \ -\x0d\x0a \ - \x0d\x0a\ - \x0d\x0a \ - \x0d\x0a\x0d\x0a\ -\ -\x00\x00\x09\xa3\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Artboard\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a\ - \ -\x0d\x0a \ -\x0d\x0a \ -\x0d\x0a \x0d\x0a\ - \x0d\x0a\ -\x0d\x0a\ -\x00\x00\x02\xb6\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a \ - Icons / \ -System / Carat /\ - White / Default\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a <\ -polygon id=\x22Tria\ -ngle\x22 fill=\x22#FFF\ -FFF\x22 transform=\x22\ -translate(8.0000\ -00, 8.000000) sc\ -ale(1, -1) rotat\ -e(90.000000) tra\ -nslate(-8.000000\ -, -8.000000) \x22 p\ -oints=\x228 6 12 10\ - 4 10\x22>\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x8e\x0c\ -I\ -I*\x00\x08\x00\x00\x00\x19\x00\xfe\x00\x04\x00\x01\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ -\x00\x04\x00\x00\x00:\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ -\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00\x11\x01\x04\x00\x01\x00\x00\x00`V\x00\x00\x12\x01\x03\ -\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ -\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x17\x01\x04\x00\x01\x00\x00\x00\xd9\x15\x00\x00\x1a\x01\x05\ -\x00\x01\x00\x00\x00B\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ -\x00J\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ -\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ -\x00\x22\x00\x00\x00R\x01\x00\x002\x01\x02\x00\x14\x00\x00\ -\x00t\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ -\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ -\x00\x1a;\x00\x00\x88\x01\x00\x00\xbb\x83\x07\x00\x0f\x00\x00\ -\x00\xa2<\x00\x00I\x86\x01\x00f\x0d\x00\x00\xb2<\x00\ -\x00i\x87\x04\x00\x01\x00\x00\x00\x0a\x0a \x0a\ - \x0a \ - Adobe Photosho\ -p CC 2015.5 (Win\ -dows)\x0a \ - 2017-03-07T11:3\ -2:29-08:00\x0a \ - 2017-04-04T\ -11:28-07:00\x0a \ - 2017-04-\ -04T11:28-07:00\x0a image/tiff\ -\x0a \ - 3\x0a sRGB IEC61966-\ -2.1\x0a \ - \x0a \x0a \ - a\ -dobe:docid:photo\ -shop:94a27cdb-04\ -33-11e7-b02d-9f8\ -4d9f5a326\x0a \ - adobe:\ -docid:photoshop:\ -acaee4ff-1960-11\ -e7-bae7-e6e7a5cd\ -2814\x0a \ - \x0a \x0a \ - xmp.iid:\ -fa5f33a4-5729-d3\ -41-9ab8-5edce3a2\ -68a4\x0a \ - adobe:docid:p\ -hotoshop:696e80e\ -4-1964-11e7-8c4b\ --d6fec7ab83c2\ -\x0a xmp.did:ca77\ -1a70-f965-e14f-9\ -103-360465543dbf\ -\x0a \ - \x0a \ - \x0a \ - \x0a \ - crea\ -ted\x0a \ - xmp.iid:c\ -a771a70-f965-e14\ -f-9103-360465543\ -dbf\x0a \ - 2017-03-07T\ -11:32:29-08:00\x0a \ - Adobe Photosh\ -op CC 2015.5 (Wi\ -ndows)\x0a \ - \x0a \ - \x0a \ - saved\x0a \ - \ -xmp.iid:16fdf09c\ --857d-944e-9783-\ -e127cb1b9cf4\x0a\ - \ - 20\ -17-03-08T11:37:4\ -5-08:00\x0a \ - Adob\ -e Photoshop CC 2\ -015.5 (Windows)<\ -/stEvt:softwareA\ -gent>\x0a \ - /\x0a \ - \x0a \ - \x0a \ - saved\x0a \ - xmp.\ -iid:fa5f33a4-572\ -9-d341-9ab8-5edc\ -e3a268a4\x0a \ - 2017-0\ -4-04T11:28-07:00\ -\x0a \ - \ -Adobe Photo\ -shop CC 2017 (Wi\ -ndows)\x0a \ - <\ -stEvt:changed>/<\ -/stEvt:changed>\x0a\ - <\ -/rdf:li>\x0a \ - \x0a\ - \x0a \ -\x0a \ -\x0a\x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a\ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \x0a \ - \ - \ - \ - \ - \ - \ -\x0a \ - \x0a\x1c\x01Z\x00\x03\x1b%G\x1c\x02\x00\x00\x02\x00\x00\ -\x008BIM\x04%\x00\x00\x00\x00\x00\x10\xcd\xcf\xfa\ -}\xa8\xc7\xbe\x09\x05pv\xae\xaf\x05\xc3N8BI\ -M\x04:\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\ -\x01\x00\x00\x00\x00\x00\x0bprintOutp\ -ut\x00\x00\x00\x05\x00\x00\x00\x00PstSbo\ -ol\x01\x00\x00\x00\x00Inteenum\x00\ -\x00\x00\x00Inte\x00\x00\x00\x00Clrm\x00\ -\x00\x00\x0fprintSixteenB\ -itbool\x00\x00\x00\x00\x0bprint\ -erNameTEXT\x00\x00\x00\x01\x00\x00\ -\x00\x00\x00\x0fprintProofSe\ -tupObjc\x00\x00\x00\x0c\x00P\x00r\x00\ -o\x00o\x00f\x00 \x00S\x00e\x00t\x00u\x00\ -p\x00\x00\x00\x00\x00\x0aproofSetu\ -p\x00\x00\x00\x01\x00\x00\x00\x00Bltnenu\ -m\x00\x00\x00\x0cbuiltinProo\ -f\x00\x00\x00\x09proofCMYK\x008\ -BIM\x04;\x00\x00\x00\x00\x02-\x00\x00\x00\x10\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x12printOu\ -tputOptions\x00\x00\x00\x17\x00\ -\x00\x00\x00Cptnbool\x00\x00\x00\x00\x00\ -Clbrbool\x00\x00\x00\x00\x00Rgs\ -Mbool\x00\x00\x00\x00\x00CrnCbo\ -ol\x00\x00\x00\x00\x00CntCbool\x00\ -\x00\x00\x00\x00Lblsbool\x00\x00\x00\x00\ -\x00Ngtvbool\x00\x00\x00\x00\x00Em\ -lDbool\x00\x00\x00\x00\x00Intrb\ -ool\x00\x00\x00\x00\x00BckgObjc\ -\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00RGBC\x00\x00\ -\x00\x03\x00\x00\x00\x00Rd doub@o\ -\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Grn do\ -ub@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Bl\ - doub@o\xe0\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00BrdTUntF#Rlt\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Bld Un\ -tF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00RsltUntF#Pxl@b\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0avector\ -Databool\x01\x00\x00\x00\x00PgP\ -senum\x00\x00\x00\x00PgPs\x00\x00\x00\ -\x00PgPC\x00\x00\x00\x00LeftUnt\ -F#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00Top UntF#Rlt\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00Scl Unt\ -F#Prc@Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x10cropWhenPrintin\ -gbool\x00\x00\x00\x00\x0ecropRe\ -ctBottomlong\x00\x00\x00\x00\ -\x00\x00\x00\x0ccropRectLeft\ -long\x00\x00\x00\x00\x00\x00\x00\x0dcrop\ -RectRightlong\x00\x00\x00\ -\x00\x00\x00\x00\x0bcropRectTop\ -long\x00\x00\x00\x00\x008BIM\x03\xed\x00\ -\x00\x00\x00\x00\x10\x00\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\ -\x00\x00\x01\x00\x018BIM\x04&\x00\x00\x00\x00\x00\ -\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x80\x00\x008\ -BIM\x03\xee\x00\x00\x00\x00\x00\x0d\x0cTran\ -sparency\x008BIM\x04\x15\x00\ -\x00\x00\x00\x00\x1e\x00\x00\x00\x0d\x00T\x00r\x00a\x00\ -n\x00s\x00p\x00a\x00r\x00e\x00n\x00c\x00\ -y\x00\x008BIM\x045\x00\x00\x00\x00\x00\x11\x00\ -\x00\x00\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00d\x01\ -\x008BIM\x04\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\ -\x008BIM\x03\xf2\x00\x00\x00\x00\x00\x0a\x00\x00\xff\ -\xff\xff\xff\xff\xff\x00\x008BIM\x04\x0d\x00\x00\x00\ -\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\x19\x00\x00\x00\ -\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\xf3\x00\x00\x00\ -\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\x008BI\ -M'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x018BIM\x03\xf5\x00\x00\x00\x00\x00H\x00\ -/ff\x00\x01\x00lff\x00\x06\x00\x00\x00\x00\x00\ -\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\x06\x00\x00\x00\ -\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\x00\x00\x06\x00\ -\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00-\x00\x00\x00\ -\x06\x00\x00\x00\x00\x00\x018BIM\x03\xf8\x00\x00\x00\ -\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ -\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ -\xe8\x00\x008BIM\x04\x00\x00\x00\x00\x00\x00\x02\x00\ -\x008BIM\x04\x02\x00\x00\x00\x00\x00\x02\x00\x008\ -BIM\x040\x00\x00\x00\x00\x00\x01\x01\x008BI\ -M\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\x00\x00\x038\ -BIM\x04\x08\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\ -\x00\x02@\x00\x00\x02@\x00\x00\x00\x008BIM\x04\ -\x1e\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ -\x1a\x00\x00\x00\x00\x035\x00\x00\x00\x06\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ -\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00null\x00\x00\x00\x02\x00\x00\ -\x00\x06boundsObjc\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00Rct1\x00\x00\x00\x04\x00\x00\ -\x00\x00Top long\x00\x00\x00\x00\x00\x00\ -\x00\x00Leftlong\x00\x00\x00\x00\x00\x00\ -\x00\x00Btomlong\x00\x00\x00`\x00\x00\ -\x00\x00Rghtlong\x00\x00\x00`\x00\x00\ -\x00\x06slicesVlLs\x00\x00\x00\x01\ -Objc\x00\x00\x00\x01\x00\x00\x00\x00\x00\x05sl\ -ice\x00\x00\x00\x12\x00\x00\x00\x07slice\ -IDlong\x00\x00\x00\x00\x00\x00\x00\x07gr\ -oupIDlong\x00\x00\x00\x00\x00\x00\x00\ -\x06originenum\x00\x00\x00\x0cE\ -SliceOrigin\x00\x00\x00\x0da\ -utoGenerated\x00\x00\x00\x00\ -Typeenum\x00\x00\x00\x0aESli\ -ceType\x00\x00\x00\x00Img \x00\x00\ -\x00\x06boundsObjc\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00Rct1\x00\x00\x00\x04\x00\x00\ -\x00\x00Top long\x00\x00\x00\x00\x00\x00\ -\x00\x00Leftlong\x00\x00\x00\x00\x00\x00\ -\x00\x00Btomlong\x00\x00\x00`\x00\x00\ -\x00\x00Rghtlong\x00\x00\x00`\x00\x00\ -\x00\x03urlTEXT\x00\x00\x00\x01\x00\x00\x00\ -\x00\x00\x00nullTEXT\x00\x00\x00\x01\x00\ -\x00\x00\x00\x00\x00MsgeTEXT\x00\x00\x00\ -\x01\x00\x00\x00\x00\x00\x06altTagTEX\ -T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0ecellT\ -extIsHTMLbool\x01\x00\x00\ -\x00\x08cellTextTEXT\x00\x00\ -\x00\x01\x00\x00\x00\x00\x00\x09horzAlig\ -nenum\x00\x00\x00\x0fESliceH\ -orzAlign\x00\x00\x00\x07defa\ -ult\x00\x00\x00\x09vertAlign\ -enum\x00\x00\x00\x0fESliceVe\ -rtAlign\x00\x00\x00\x07defau\ -lt\x00\x00\x00\x0bbgColorTyp\ -eenum\x00\x00\x00\x11ESliceB\ -GColorType\x00\x00\x00\x00No\ -ne\x00\x00\x00\x09topOutsetl\ -ong\x00\x00\x00\x00\x00\x00\x00\x0aleftO\ -utsetlong\x00\x00\x00\x00\x00\x00\x00\ -\x0cbottomOutsetlon\ -g\x00\x00\x00\x00\x00\x00\x00\x0brightOu\ -tsetlong\x00\x00\x00\x00\x008BI\ -M\x04(\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x02?\xf0\x00\ -\x00\x00\x00\x00\x008BIM\x04\x14\x00\x00\x00\x00\x00\ -\x04\x00\x00\x00\x0d8BIM\x04\x0c\x00\x00\x00\x00\x03\ -\xfb\x00\x00\x00\x01\x00\x00\x000\x00\x00\x000\x00\x00\x00\ -\x90\x00\x00\x1b\x00\x00\x00\x03\xdf\x00\x18\x00\x01\xff\xd8\xff\ -\xed\x00\x0cAdobe_CM\x00\x01\xff\xee\x00\ -\x0eAdobe\x00d\x80\x00\x00\x00\x01\xff\xdb\x00\ -\x84\x00\x0c\x08\x08\x08\x09\x08\x0c\x09\x09\x0c\x11\x0b\x0a\x0b\ -\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\x13\x18\x11\x0c\ -\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\x10\x14\x0e\x0e\ -\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\ -\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ -\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x000\x000\x03\x01\x22\x00\ -\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\x03\xff\xc4\x01?\ -\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\ -\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x01\x00\x01\ -\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\ -\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\x00\x01\x04\x01\x03\ -\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\x00\x02\x11\x03\ -\x04!\x121\x05AQa\x13\x22q\x812\x06\x14\x91\ -\xa1\xb1B#$\x15R\xc1b34r\x82\xd1C\x07\ -%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\x83&D\x93\ -TdE\xc2\xa3t6\x17\xd2U\xe2e\xf2\xb3\x84\xc3\ -\xd3u\xe3\xf3F'\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\ -\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6\ -7GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\ -\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\x055\x01\x00\ -\x02\x11\x03!1\x12\x04AQaq\x22\x13\x052\x81\ -\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$b\xe1r\x82\ -\x92CS\x15cs4\xf1%\x06\x16\xa2\xb2\x83\x07&\ -5\xc2\xd2D\x93T\xa3\x17dEU6te\xe2\xf2\ -\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\ -\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\ -\xe6\xf6'7GWgw\x87\x97\xa7\xb7\xc7\xff\xda\x00\ -\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf4<\xdc\xcc\x96\ -d\x9a\xa9;@\x80\x00\x00\x92O\xc6P\xfd~\xab\xe0\ -\xff\x00\xfbl\x7f\xe4R\xc9\xff\x00\x95\x1b\xfdz\xff\x00\ -\xef\xabN\xd79\x95\xb9\xcdi{\x9a\x09\x0d\x1c\x92\x92\ -\x9c\xa7e\xf5\x16}79\xb3\xc6\xe6\xb4~V\xa7n\ -OSp\x96\x978\x1e\xe1\x80\x8f\xc1\xaa\xc6.\x0bl\ -g\xaf\x96\xd2\xfb\xac\xd4\xee\x9d\x07a\xb53\xea\x18Y\ -5>\x92EW81\xec\x99\x12x))\x0f\xaf\xd5\ -|\x1f\xfe`\xff\x00\xc8\xa2`fdY\x91\xe9Zw\ -\x02\x0f \x02\x08\xfe\xaa\xd2Y\x18?\xf2\x81\xff\x00\xae\ -~T\x94\xff\x00\xff\xd0\xef\xf2\x7f\xe5F\xff\x00^\xbf\ -\xfb\xea\xd0\xc9\xca\xaf\x19\xa0\xbeIq\x86\xb5\xa2IY\ -\xf9?\xf2\xa3\x7f\xaf_\xfd\xf5Y\xea\x9e\xd6Soz\ -\xec\x07\xe5\xfe\xa1%-\xf6\xfb\xdd\xfc\xde+\xcf\x81v\ -\x9f\xc1\x0a\xe6\xf5\x0b\x9c\xcb\x9f[X)\x975\xa4\xce\ -\xbc\xce\x9f\x05k<\xde1\x9c\xeaL\x11\xab\x88\xe7h\ -\xfa[R\xc1u\x96b5\xd6\x9d\xc5\xd3\x07\xbcN\x9b\ -\x92S\x01E\x01L\x01\ -R\x01Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\ -\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\ -\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\ -\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02\ -T\x02]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\ -\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\ -\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03\ -O\x03Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\ -\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\ -\x13\x04 \x04-\x04;\x04H\x04U\x04c\x04q\x04\ -~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\ -\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05\ -g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\ -\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06\ -j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\ -\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\ -\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\ -\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\ -\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09\ -d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\ -\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\ -\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\ -\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0c\ -C\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\ -\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\ -\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\ -\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\ -\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10\ -~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11\ -m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12\ -d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13\ -c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14\ -j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15\ -x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\ -\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\ -\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\ -\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\ -\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b\ -;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c\ -{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\ -\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\ -\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A \ -l \x98 \xc4 \xf0!\x1c!H!u!\xa1!\ -\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#\ -8#f#\x94#\xc2#\xf0$\x1f$M$|$\ -\xab$\xda%\x09%8%h%\x97%\xc7%\xf7&\ -'&W&\x87&\xb7&\xe8'\x18'I'z'\ -\xab'\xdc(\x0d(?(q(\xa2(\xd4)\x06)\ -8)k)\x9d)\xd0*\x02*5*h*\x9b*\ -\xcf+\x02+6+i+\x9d+\xd1,\x05,9,\ -n,\xa2,\xd7-\x0c-A-v-\xab-\xe1.\ -\x16.L.\x82.\xb7.\xee/$/Z/\x91/\ -\xc7/\xfe050l0\xa40\xdb1\x121J1\ -\x821\xba1\xf22*2c2\x9b2\xd43\x0d3\ -F3\x7f3\xb83\xf14+4e4\x9e4\xd85\ -\x135M5\x875\xc25\xfd676r6\xae6\ -\xe97$7`7\x9c7\xd78\x148P8\x8c8\ -\xc89\x059B9\x7f9\xbc9\xf9:6:t:\ -\xb2:\xef;-;k;\xaa;\xe8<' >`>\ -\xa0>\xe0?!?a?\xa2?\xe2@#@d@\ -\xa6@\xe7A)AjA\xacA\xeeB0BrB\ -\xb5B\xf7C:C}C\xc0D\x03DGD\x8aD\ -\xceE\x12EUE\x9aE\xdeF\x22FgF\xabF\ -\xf0G5G{G\xc0H\x05HKH\x91H\xd7I\ -\x1dIcI\xa9I\xf0J7J}J\xc4K\x0cK\ -SK\x9aK\xe2L*LrL\xbaM\x02MJM\ -\x93M\xdcN%NnN\xb7O\x00OIO\x93O\ -\xddP'PqP\xbbQ\x06QPQ\x9bQ\xe6R\ -1R|R\xc7S\x13S_S\xaaS\xf6TBT\ -\x8fT\xdbU(UuU\xc2V\x0fV\x5cV\xa9V\ -\xf7WDW\x92W\xe0X/X}X\xcbY\x1aY\ -iY\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\ -\xe5\x5c5\x5c\x86\x5c\xd6]']x]\xc9^\x1a^\ -l^\xbd_\x0f_a_\xb3`\x05`W`\xaa`\ -\xfcaOa\xa2a\xf5bIb\x9cb\xf0cCc\ -\x97c\xebd@d\x94d\xe9e=e\x92e\xe7f\ -=f\x92f\xe8g=g\x93g\xe9h?h\x96h\ -\xeciCi\x9ai\xf1jHj\x9fj\xf7kOk\ -\xa7k\xfflWl\xafm\x08m`m\xb9n\x12n\ -kn\xc4o\x1eoxo\xd1p+p\x86p\xe0q\ -:q\x95q\xf0rKr\xa6s\x01s]s\xb8t\ -\x14tpt\xccu(u\x85u\xe1v>v\x9bv\ -\xf8wVw\xb3x\x11xnx\xccy*y\x89y\ -\xe7zFz\xa5{\x04{c{\xc2|!|\x81|\ -\xe1}A}\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\ -\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\ -\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\ -\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x89\ -3\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8c\ -c\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\ -\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\ -\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x96\ -4\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\ -\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\ -\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0\ -i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\ -\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7\ -n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\ -\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\ -\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2\ -K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\ -\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\ -\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\ -\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1\ -g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5\ -K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9\ -:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd\ -5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1\ -<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5\ -N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9\ -l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\ -\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\ -\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\ -\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea\ -[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\ -\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\ -\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\ -\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\ -\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\ -\x00 P8$\x16\x0d\x07\x84BaP\xb8d6\x1d\ -\x0f\x88DbQ8\xa4V-\x17\x8cFcQ\xb8\xe4\ -v=\x1f\x90HdR9$\x96M'\x94JeR\ -\xb9d\xb6]/\x98A\x00\x930(*l\x0c\x9c\x03\ -\x02\x13`P0\x07?\x02?\xe8O\xe8X\x06 \x01\ -\xa4\x00hO\xfa$\x1a\x93H\x82R\xdf\xf0J}J\ -\x06\xff\xa4\x80\xa9t\xd0\x05\x1a\x07U\xa5\xd5\xeb\xf4\xfa\ -\x8d\x86\x05S\x81S\xe9VhK\xfc\x05o\x01\xd5\xaa\ -\xf6\xca\x8d~\x0fh\xb4\xd2\x00P\x8a\x95\x92\xefK\xb0\ -P\xacW\x9aM\xca\x9dI\xbe]05\xca\xf0\x02\x98\ -\xfe\xc8>\xf2O\xa7\xa6U\xe2\xf3\xcc<2O\xb7\xce\ -\x1aSO\x07\xe8Bcm!\x10\x87\xa7)\x89\xb5C\ -\x00v\xb4#?\x01\x81*\x98\x88]\xf7i\x87\xa4g\ -\xb18+\x1e\xe7\x01\xb7\x8e\xed\xaa\x17:\x15\xfa\x0d\xba\ -\xde\xda\xf7\x98Ln;\x7f\xbe\xe2\xf0!\x99\xec\x0d\xe2\ -\xbbj\xe8T\xab\x18^\x7f6\x9f\x90\xc8uz\xbb>\ -\xcf\x81\xfc\xf8\xf4=\x9c\xbe\xb6\xf3#\xdc\xbaa|V\ -N\x0f\xa3c6\xfa\x94\x04\xbfAb\xcf\xf4\xe0)\xc0\ -\x03:r\x08-\xebzc\x03\xc1\x10L\x15\x05>\xe6\ -\x94\x1cc\x13p\x89\x04h\xc2\x86+\xee\x90\x00\xd0\xc8\ -\x10(C\x83 \xdb\x0f\x91\x00LD\x05\xc1q,M\ -\x13\xc5\x09B\xa4fE\x85\xf9\x17\x17\x8d\xa6\xfcdk\ -\xb9\x08\xb0;\x1b\x84\x84LtV5A0_\x14\xc8\ -\x12\x0c\x85!\xa2\xe7\xd4\x8c|\x93RI\x00SI\x84\ -|\x8c}\x1f(\xc4\x0a\x01\x07\xb2\xa8\x9aCK\x058\ -\x0f-\x812$\xbd/\xcc\x13\x0a\x04gL\x86\x08\xed\ -3\x8a\x87\x84\xd4v#\x09\x98\x08\x02\x8a\xf3\x88\xda7\ -\xce\x84\x5c\xa71O\x13\xcc\xf5\x03\x9d\x13\xe9\xc44P\ -\x02\x11\xc9A\x9b\xa8\xc42\x03\x01\x03-\x14?\x0c\x14\ -h\xf0\xe3Ot\x8d%I\xa3\xe7\x95,w\x0c\x94\xc8\ -|oS\x86\xad\x0d\x0d\x0d\x95\x09\x0e\xfe\x8b#}!\ -JU\x15MT\x873\x07\x99\xe1E\x0c\xa1\xf1\xb9Y\ -\x9ah\xc4\xb6\x03\x810\xf8\xdaDN\x22\xb8\xdbS\xc4\ -\xae\x13\x9bU\xc8q\xab\xae\xe1\xa1V\x15UV\x9e\x14\ -\xc8\xc8\x1e\x9b\xb6\x89\xa9O\xd1\x03u\xacD\xd7\xb5\xfb\ -\xa4\x89\xaaF\xdd\xbch\x9e\xb7\x09\xe6\xea\xcav\x13\xa8\ -\xe0\x1f\xb7I\xfb;\xb8\x8e\xdb\xb2\xf29Wr\xd4\x82\ -<\xc8E!C\x81\x17\xc8\x10\x05P\xe0<\xdc\x02\xa0\ -\x97Q\xf8|\xe0\x87\xc6\x08|\x9e\xefA\xf0{C\ -<\x01\x08\x0eli\xb9\xd4\xf2k@p\x12xa\xfd\ -\xfd\x06\xe5&+\xe0\x80\x9b\x12\xf0L>\x8e\xe8,:\ -]\xbb\xe7\x02\x0f\xa5\x17\xbe\xc7\xdc\xfc\x08z\xcc\x80!\ -\x9c 6\x11\xb44V\xa0\x08yn\x89\xcb\x198F\ -\x10\x10p\xd2\x18\xe9\x85\x90\x00\xb0\x1c%!\xc0\xb9p\ -\xa0\xb5\xc3\xb9\xe1\x93\x0f\xc5\xda\xba\x09\x0b\xd5T\xc1\xa0\ -(\x22\xa2@\xadw\xc0\xc8\x1f8\x86J\xf0\xc1\xfc&\ -\x85\x0eA\xfc*(\x1b\x08\x08s\xd0QOI\xea&\ -\x10\xef\x17\xc4\xa8U\x8cA\xa8\x8c\x0c\xb9\x5c\ -/b!\x16_\xf1,\x1f8\xa0\xc6\x1f#\xb83\x08\ -\x04`O\xcb\xd1\x0e%f\x00zRq\x19\xf5\x0a\xe0\ -c1\xc1\xe9\x1c\x5c#\xd4yK`y%\x1f\xbb.\ -\x8a\xcc\xceM\x10\xb6n?\x07\xdb\xd1\x93\xc9\x00\x12M\ -\xd0Z('\x00\xc8_@(\x88\x0bi\xcc)\x04,\ -\xe9\x0c\xcc\x1c{\x92\x84\xa6\x16\xa7\x80qZ\xc1\xb8D\ -\xb6\xe2\x1e\xa5\x87\x90\xef\x0a\x93\xec\x14Aa\xdc:\x93\ -\xd3\xb9wb\xb2Z<\x133$\xdf\xb4T\x013\xcd\ -l'(Z>\xc7\xd3\xd1zcQ\xea\xa2\x91%E\ -\xc5\xb0:\xa3A$\x88\x0b\xaa<*C\xfd!\x0b\xc8\ -]\x04\x1a@l\x10\xc4\x1d)\x14\x80N\x96\x01\x82 \ --)\x80\xa1\x10\x14\xcc0P\x17\x01!El\xc7\x06\ -3&H\x99\x96N\xe3\x5c|\x96yH\x82L\xbf\xd7\ -\x9ed\xe2\x84\xdbD\xa0Z\xa6\x01\xb9\x04+F\xcb\xdc\ -!\x83\xaa\xaa\x0eEH\x0c\x07\x8dY\x1d\xa9\x00\x17U\ -\xd0t\x92D\xd0\xc0_\xf2l\xc9\xab\xd0X8\xab@\ -\xdbL3\x12\x0e\xd3\xaaxF\x9f\x94P\x8aSE\xc9\ -B\xc275\xc7\xdb'\xa2tU\x05\xa8\x00\xd0 \x96\ -p}\x22\x09`C\x06\x81]a\xc4\xcaa\x0eV,\ -G\xcf\x00\xb4\x1c\x08\x84\xe0\x14\x02\x22\x1c\x09@\xf2\x98\ -]\xcd8\xad\xd4\x19WP\x86U4^\x5c\x0d#\x8f\ -\xfe(W\xb4\x13\x22\xaax\xd8w$2\x7f\x0e\xa48\ -\x14\x01 \xf6\xb6C\xcd0\xaf\x81Om\xc6\x80\x1f\xb7\ -@\x9c\x86\x0ek|8\x02\xb5\xc1\x05l({$H\ -\x8df\xa6D\xd5!P\x8a\x01W2.\xbe-\x0c\xd4\ -\xa8\xc4BN-+\x1bLK\xc9\ -\xc8\x0f\x15x\x0ck\x01\x5c\x0c\x06\x8e\x99Kd\xe8P\ -h\x8cU&~\x80\x90\x17\x15\x98Lk\xc0\x80\x22C\ -\x22\xf8w\x0a\xa2\xf7\x0e\x0a\xcb\x8c\xfa$`\x8c\x15\xef\ -\xb4\x18\x03\xc8\x9c'\xc8\x90\xe8\x12;\ -\xa0\xa4ne\xcc\xd7\x17}\xea\x12\xb8\xa1\x97\x04+\x06\ -\xcb\x94B_\xfc/\xba\xe4\xb4\xa7\xe0`*\x06\xb28\ -*\x06\xb688H\xf2\x09<\xc2P\xc6\xceB\xdd\xdb\ -\x88\xdc\xec,\x1a\x90?\x09\xe41\xf5\x06\xe1S\x9f\xc4\ -\x9d\xf0\xa6\xf7\xcadbw\xa3\x19\xab\xa2\xa2\xae\xc4j\ -\xea\xb9\xa78\x91)0C\xa4\xc1\x12\xb0\x08\x07\xfe\xed\ -\xe8\xb8\x92\xa34o>\x22\xfc\xfd\xa04\x13\xa8\xb9\x14\ -\xefCE\xbd\x11B\x9f\xcd\xd2\xc5\xc4P\xfb\xc2\xf8c\ -\x0c\xdf*\x91e\xb6\xdcS\x8d\x16\xb0\x07\x81)\x0c\x10\ -Z\xec1\x8b-|'\xb5\x08\x15\x98\xa0\xbfb\x03\xbc\ -\xbeB$\x94[\xcb\x04U|P\xcbDF\xef\xec\x5c\ -\xa2\x9a\xc5H\xc3\xb0p'\xb6\xc0\xc6\x90\x01\xd7n\x05\ -&\xce/\xc5~\x1f\x83s\x17\x12>\xfb\xf6C\xab\x8b\ -\x99\xb9\xd9e\x5c\xe2\xc5}\xb1\xc8>\x8d\xcc{Q1\ -8 \xf8&\xedxd\xbd&@~\xbdp\xbc\x0d\x86\ -\xc7\x01\x19\xdb\x8a#\xc4\x9c\xa7\x5c\x0c\xb6\x87[\xcf\x22\ -\xfcn\xe5\xb5\xaa\xc8\x9e\xf2\xd1\xfb\xd101\xd0D\x0a\ -\x85'\x19\x19\xcb\xf4\x86)\xc1\xbc5\xa5\x08[\x064\ -\x91!\x5c~\x0c\xef\xa2m\xf4\xe1:\x9b\x85\xe2\xb5w\ -Qx\x81\x12\xd5\xb0\x0bW\xf1D\xc1b\xc3\x90\x8e\xb1\ -\xc1\xc4\x88V\x01\x03\xa5k[\xe8\x98\xb7\xcc\x8deV\ -O\xa9\xf7f[\xb89{s\x90\xdeg\x099\xaf6\ -H+\xf7\x09\x8a\xc1\xb0\x06\xba\xc0 !\x91\xb8u\x8e\ -`\xbb\xd7\xc1\xa0\xec\xecC\x9e\xcc8\x0a\x07\xc1\xc8\xce\ -\xe9x\x9b\xaff!\xa0\xe1\xdb\xc4\x5cb\x0a\xa1\xafx\ -\x10n%\x01z\x92A\x06\xbd\xec!J\xb1,/$\ -\x02\xcc\x1c>\x0cl\xa54\xfa:\x07\x18\xc1\xf1B\xc4\ -Z\xf8\xd1D\x89\xb2\x88\x89\x15\x95\xbb\xba\x90W\x84\xe6\ -zA\x15\x92\xfc;\xca\x90N\xef'\xfb\xc9!'\x80\ -1\xd3\x81h\xe8\x06\xc1\x08\x1c\xf5@\x90\x0cz\xd0;\ -K\x00\x98\x18\xa7@\xfb[\xeb\x92F{\x86@\xba\xc4\ -!\xbc\xfa\x0e\x01\xb0L90\x8a\x89\x5c\xa2\xce*\xfd\ -\x95BH\xb2\xf8rY\xb2\x87\x8f\xad\x5c\x83\xb5\x87\xa1\ -!$\xf0\x06\xd4\xcfM\xd6\x00\xd0 \xd6\xe0\x98\x10\xfd\ -\xd0R\x8d\xc0\xe8$\xf5@p\x11\xfaZ\xa4\x8ac0\ -a\xfd@\xe6\xe2\x12\xc7r\x22?\x80\xaa\x91\xfet\x81\ -\xcf\x81\xdf\x0b\xfc\xc9\x14e\xbd+.\xffB\x04\x7f\xea\ -\xfc\x08.\xa2K\xe4\xa6kbr\x01\x80\x1e\x02\xf0\x14\ -\x03\xac \x02\xd0\x1a\xf6\x001\x01@.\x03\xabt\x03\ -\xe0O\x02@:i\xe0(\x03.8\xda\x8d\xb8\x0e\xad\ -\xbcm\x02X\xad\x87\xd6\xe8\x822\xf2\xe7\x88\xff\x22&\ -\xf3ev\xd9\xed\x18\xa9\x09:\xe2b\x5c_\xec\xd2\x06\ -\x8f\xc6\x04\x88\xf4\x04`W\x02\xa0N\xf4\xe0D4 \ -\x1e\x02E\xf4\x86\xc3\x5c\xfaB4\x16p\x90\x14\x01\x03\ -\x09`\xc3\x04g\xd0\xa7\x0e\xd0#\x0b\xea~\x8d\x96\xff\ -G\x22\x9ag\xf6\xff\xc0\x00\xf3\xe2P\xc7@\x1a\x02\x0e\ -\xe4\x0d`\x89\x0c`\xaaG\xa4\x7f\x08\xc2(\xaf\x0b\x88\ -ua\xd8\xc2\xc9\x14!\x84\xc8\x19\xc1\x84\x8a\x10\x9c\x83\ -p\xa0\xf8\x8azU\xca~ZM\x12f\x08\xae\xe9\xaa\ -\xc8\xa2\x0a$\xc6BD\xfc\x00H\xce\xc1\x1a\x16\x0e,\ -\x05p\xd0`KZ\xf0\xe1\xc4\xf7\xa1\xb0\xad\x01\xc4\x1b\ -O\x06\x1c!\xb2\xeb\x81\xcc~O\xecY\x80\xf1\x13\xe1\ -*\x09\xd1D\x0cB\x18\x1d1L\x1cez\x05\xa7\xe4\ -%\x0b\xe2\xf8PL#\x0e\x8c~\x90T\x22PX\x11\ -\x10\x5c#0\xb8#\xe5\xfe\x13\x91x\x18`Y\x17\xe0\ -nRf\xbe\x1d\xf1\x88\x1dc\xd6\x1c\xa1\xbc\x1cq\x94\ -\x1b\x8e<\x1a\xd1$\x1c\xf1\xa0\x1c1 \xb6A\xec\xb6\ -\x826\x9ea\x14\xdf\xc0\xea!\x87\xfe\x7f@]\x12\x81\ -\xb4%\x08\x8c\xc4,F}\xc9\x94\x5c!\xe4\xe8\xeeZ\ -\xa1O\xf8\xe9\x8eb\xa8\xea \xf9\xe8d$\x00\x9b\x1e\ -\xa0\xc0\xa4 \xfe\x13\xe2`<\xca\xb2\x1e!\xdb\x14\xc1\ -\xd2\x1cq\xc1\x12\x81\xb6mA\xda\x1d\x11\xfa\x1d\xc7V\ -\xeb\xab~\x9f\xc1\xd3\x1a\x81\xe8A,\xb8\x0dk\xc2\x12\ -\x82 N\x80\xde\x09a\x8b#al%\x10\x80\x02q\ -\xc9\x15\xe2.~N\x14x\xee\x5cy\x8d\xdf\x10\x02\x16\ -\xda+\xfe#\xd1\xc8j\xa0\x80\x0a\x020`Q\x88\x1d\ -\xf2\x18\x1c\xc1\xc0Pa\xc8q\xa7\x1d\x19A\xc6\x1br\ -t\x1b\xb1 \xfe\xc7n\xd2n\xfc\x17b \x11\xd2\x94\ -\x0e$\x98\x14\xcb\xd0$\xf1Z\x15\xad\xcb\x0bRH\xe5\ -\x92L\xe1\xae^\xc5\xa5\x86\xe20`\xba\xd0d#\xaa\ -\xc0\x180\xa2 \xf2j\x1daK,\xe1\x1c\x8c\xd1\xa0\ -\x1c\xe1\xc2\xaa\x81\xd4\x1c\x91W\x0d\x02\x16\xfc`F\x15\ -R\xec\x1a\xb0:!J\x9e\x13\x01\x0f/\xa0\xd3\x1cP\ -\x9e\xe4\xe8\x98\xf8\xa8\xa1\x16b#\x16\xaea+g\xfc\ -H\xec\xc5+\xe29\x09a\x02\x14 \x972`\xbc\xeb\ -h\xdc\x1c\xd3&\x09`<<\x01\xfb.K\x9eCN\ -\xaa\x1a\xef\xb0\xebB\x16E\x81\x98\x17\xea\xfc\x08QX\ -\xec\xcc\xa5\x0f\x024\xd9%c\x0a\xb0V\xa8r\xb3%\ -1\xde\xba\x83'\x10m\xa6#\xef\xd4\x0c \xf2\x0ds\ -\x80\x10\xcd\xf6\x1f\xc1\xfa\xe4 e0\xd3<\x22J\xc0\ -\x18\x0c\xdc!q\x8e\x1b\xd1R\xfd\xa2G\x04\x88<\xc4\ -\xb0\xb5\x16%\x9f9\x02\x1f1\x12\xb4#\x11r#\xc0\ -}< \x9b)A\x1c\x16B \xc3,6\xc3\xa4\x12\ -\x91\xe0\x8b=\xa0\xac\xf4\xe0C\x0d\x81\xa1>a\x88\x16\ -\xf3\xec\x14\xa1\xef?!\xea%\x91>\x0f\x01,\x9f`\ -\xa9/\xe2\x16k\xe7\xf4\x05\xf1\xc0$\x92\xa3*rT\ -\xb9c30\xb1\xd6\xdd\x8dS\x0b4\x16!3\xbe#\ -\xa0KB\xe0],\xe1J\x19\xe6\x1e!!'C\xe0\ -\xf0\x144D\x11\x22X_\x0b\xcc\x0ea\x1e\x0a4T\ -\x0c\xd4:!\x08b\x18\xc0\xfdF \xbd(\x22P\xe4\ -)F\x94\xa2 \x0dTt\x08\x81\x95G\xa1z$\x8f\ -\x82\xf8s\x07\x0f!\xe1A\xd2\xae\xe9%\xae\xcb\x91\xdd\ -1Q\xe0\xa2(\xb7%\xa2;\x0b\xc0 \xb5, \x02\ -\xe2\x18\x9c\xc1l\x14tb\x0f\xd3*$\xe2\x9e\x98\xb2\ -a&B/\x12\x14N\x0a\x01\xb3L\xe1\x9e$\x8a4\ -\x07@\x90\xd3,\xe8!\xef\xe0\x11\x00\xd4\xea\xa1/A\ -\x0d\x07\x15\xcd\x0a\xe5FK$\xae\x18\xdd\x8b\xa2\x7fo\ -\x9a\xa93\x1c#\xec\x88\x14L\x8c\xc9\x02\x18\x93\xd3z\ -\x07\x22P\x91\xf3\x96$\x0c\xe4\x18\xc1p\x9ej8$\ -px\xcf\xe1R\x1aj\xc6!k$\xb2\x88p\xb2\xe2\ -F\xf2*\x095\xd0OA\xaf1A\xef56\x91l\ -fo\x9b7J\xf8$+\x08\x14\xe0\x8dV`\xb0\xaa\ -j\xab@\x00U\x1a\x91\xac$Jf\x10\x01@\x09\x95\ -\x80\x0b\xe2@\xecA\xd8\x1c\xf4T\x0a K?!\xef\ -?b>\xf4n\xaa\x1b\x0f\xac\x03b\x18\xd7\xc1d\x13\ -\xcdv\x10@\xc7H\x13\x02\x11UF\x06I!5\xea\ -\x0e\xf8\xeb?+\x12P\xe1\xf4\x997\x0a!PN\xf0\ -$il\x0f\x80\xd3]\xe1\x06!\x8b\x88\xee@U-\ -a\xc2$\x95\x0bP\xe0T\xc9\x22>k\xee\xe4\x05s\ -\x9e$\x91x\x13\x81\x86\xdc\xa2\x18\x18v\x10\x16\x89H\ -\x0e \x9a$\x92>}T\x85[\xee\xd2\xe5ec;\ -B\x1d;\x93m\x5c\xeb\xf974\x9f\x10\x82CV`\ -\x8c\x0a\xeb\x08\x15\x13\x878\xa9C8\xf5P$\x13\x97\ -9\xa2=\x22\x0c\xb8\x05q $\x95{W\xf5\x82!\ -\x88\xd0\x1a\xc1\x98\x0b\xf6t\x06\xc6$\x22\xf4\x83,b\ --;\x00{b\xc2\x1b\x16\xb1n#\x0a\xf0\x9bU\x06\ -#\xc7@\xe3!H\x19\xb4Z \xf3S4\xc1~$\ -\x8a\xfc\xb0\x052\xb0B?(4\x00\x05*\xf0$\x8e\ -\xbe\x0b\xa0\xe9#\x01\x16\xb5\x88.\xcb\x80Y\x0d\x82A\ -TV\x80\x22\xb3`VO\x91U%p\xbf63;\ -\xd68\xbf\xd6<$\x08\x8c\xb0\xe1\x5c\x1bL,!\x91\ -\xf0\x0b\xef\x1a\x16\xaf\x1e$q\x0d.\xc1T\x1a\xa0\x0b\ -q`\x0c#\x8dh\x121\x10\xb2\x02O< |\x09\ -\xd3\xc8\x16\x22\x18`S\x8d6B5#\xf2CO.\ -\x10d\xab\xedn0\xadno9Bb\x10\xe9\xe8`\ -\xfa\x02HJu\xf2\x05\x17`\x06B\x19P\xa1\x16\xd3\ - \xec%\x12'\x22\xa2(*T\xb0\x14r\xfa\x10\xe0\ -\xd3:BL\xcd kP\xa7l!\xf3\xd0\xc3\x81z\ -\xc3\xc2?A(?u\x02\x0fhV\x88!\x8f\xf6Z\ -\xe5\xb3P0c]bL\x12\x17\xb8\x16\x87H\x07\x80\ -\x96!\x8d\xbe\x15\xf0>\x0aBYL'$\xc6\x80P\ -!\x8a\xf0@\x00\xa6\x05\x16\x02%w\xd4\x15\x17\xe8\x1a\ -U6!K*\x0f5;mt\xee\xa77Abw\ -E\x0a\x97I6wM6\xb5\xcc#\x07\xfez)Q\ -x\xe2M2\x13%2\x82\x18\x8c\xcb\xd6\x0b\x80f\x91\ -\x02V4\xe0\x86\x0a\x87v\x15b!R\x95\x22\x17\x02\ -Y\x02\x0bR\xc0\x22\x19\x09\x01g\x09P\x99oU\xb7\ -\x7f\xcaw*\x83-tu\xc7O\xd7O6\xf67]\ -7\xb2\xf4\x02H\xed\xe0\xe0\x11\x98&\x0eb\x18\xfe\xd5\ -\xe9 \xc1\xd0%\x8a\xdcB!6\x18B!{\x81 \ -\x0e\x96\x9c\x94\xc2Wq`\x0a\x00\xd50\x1a\x8fj!\ -\x8d^\x0cX\xb0\x07XT\xdcj\xdb\x7f\xf0\xa5b\x80\ -}zb\x17z\xa9\xe9IP\xb5\x81(\xb7\x81tj\ -\x94V\x17\x89\xc6\xf2(Vt\x0b\xe0mf\xe1\x98%\ -\x8fk~\x81P\x1aE\xf0!\x96\xf8\x13+\x08\x0d\x02\ -`\x98\x01*\x17@o\x90\xa0\x8bV\xd2\xdfm\x12\xe2\ -#V\x7fT\x98\xbe\x89\xed\xd4\xc5U\xc9h\xe2/B\ -\xa2H\x07\x190\x08\xcb*\x17\x22 \x0f\xb9<\x0b\x93\ -\xec\x16\xe1KD\xa45q\x01\xa9.\x82\x19q\xf7\x22\ -&\x0ep\xb1\xa9\xe1rB\x14`K\x1c\x06*\x80#\ -\x95D\xf2\x97\xa0 \xd2\xabb\xb6S\x80\x8d\xdb\x80\xd8\ -\xcf1\x88\x04\xdeu,\xb7u1SBh!\x8e|\ -\xe8\x02_l6\xc6N\xa2\x10\xfe\xc8\xa1s\x82R\xee\ -@\xd4\xc3!*\x22\x18t\x09\x81\x89\x9b\xa1k\x96\xd7\ -\xfb$V\x83\x1d\x09\x9d\x9a\x82!h\xd5X\xae\xe6q\ -iW\xb4$\xa7\xb9400!\x97\x94\x15\x93\xd0A\ --'\x83\x00\xa6\x99a\xe7\x84\xc1>FA\xbe\x1a\xe4\ -\x12\x97 \x80\x13:\x09j\xa2\x1fv\xd7h#\x97<\ -\x91\x81_\x9cB+\x97x\xc3\x97\xa2$\xba\x04@\xd1\ -qq+\xad\x1d\x9d\xa2P\x13\xba8\x18\x8d\x88\x05\xe0\ -v!\x8e\x02\x1b\x01\x9dl ig\xb3\x92!sG\ -48\xf6!h \x15\xe16\x9d!\x0a\x0c\xc29:\ -\x94\x15\x86\x8d\xd1\x8c\x18\xc4!Y\xd1P\x0d\xa1\xa3\x19\ -\x88$\xd9<\x0f\xa18\x09\xfa\x8d[\x22\x17\x0d\x95\xe9\ -,\xbaR#\x0bS\x07\x82\x19G\xa1\x94\x17\x94t\x0d\ -Y\x0e#z\x16\xc4Z\x1c\x22\x9a!\xa7b\x12\xd9\xb7\ -\xad;\xb9+n\xed\xa5U\xe2Q\x99\xd6\xc8\xc1\x22\x85\ -\x82`gL\xe1\xb3M:\x9a!E\xfa\x83@+>\ -\x00\xf3\xae\xe1/\x11b\x19\xad\xc1\x9f8\xd9\xc0u\x18\ -6\xf6p\xb5m\xf9\xcd;uU18\x10H\xf0\x03\ -\x00bSr\x97-)W0!\xeb\xc2\x0a\x8b\xbc\x15\ -\xa5TJd\x07JP\xdc5\xa0%\x10\xcf\xb7}S\ -F\xcc\xc04\x86\xa6D\x22x\x17\x8e1\x82#s\xa9\ -\xabb'\xb0\x98\x07\x16\x90\xaef\x1a-n\xca d\ -\xf8\xd4%o\xba\x04 S\x8f\x01\xa46\x03d!n\ -\xfc\x0fm\xb0\x13\xd3\x84D\xa6\x88\xf6\x10%\x02r\xe9\ -\x11r\xe9}P4\x03(\xe4e\xa2`\x14{\xa8\x11\ -\x81#\xba\xf1\xb7\xb5U\xb7[\xb6%\x16\x11\xd1\x8b\x00\ -\xc4\x07yj\xd5\x0d\x14r\x95[c\xb3v%L\x03\ -o\x81\xb3J\xa2\x19S\x01&\xcf\xa28h\x89\xc7J\ -@3\xbe\xe0>\xfbp*\xfb\x8f\xba\x05SG\x03\x14\ -\xa4OE\x998\xcb|\x1c\xc1\xbf\xa6\xb8Wm\xa2(\ -\xb9\x88H\xed\x97J\x9aP\xfc\xd5V4\x8b:\x81i\ -bJ)\xfb\x86\x18\xcd\xac!\x81q\xc3\xa1L\xde\xc0\ -\xb6 \x94\xab\xb9\xfb\xf7}Q\x0d\x07\xdbH\xc2\xc4\x06\ -\xf4n\xf3!\xd4\xcb\xa8\x223m\x99\x1d$x_\x80\ -XcnY\x7f\x5c\xb0\xb5\x92\xc2V\x10\x9c|\x14\xa0\ -\x91\xc8 \xb4!\x95\xec\x80\x81\x8e\xfb{\xee\x03 ?\ -\x0b\xc0#j:\xe2 \x8c\xaa\x8da\x9a\x18\x011\xca\ -\xa0\xfe\xbd\xd5\xb5\x8b\x90K\x8b\xc2/\x05\x07\x8b\xa2S\ -\x0f\xb0\xfa\xc4\x22\xdcx%E\x1a\x0c\x00\xf0r\x5c\x9e\ -!\xb1\x1c\x82\xc1\xd5\x12\x12\x06\xad1\xfa\x1d\xb2\xcb\x0d\ -\x92\x83 \x01\xc7\x0e\xae\x0a\xf8\x5c\x14\x22p\xa6Y\xfb\ -\x0bb\xf5U\x92\x9c\xc9\xac\x94\xa1\x88\x89\x91\x88\xd8\x90\ -\xeaF\xbf\xce\xc5\x07\x191\x94\x1bq%\x19\xb5\xed\x1a\ -kfOY\x1bHu\xc0U\xd4\x8dO\xbcqB'\ -\xf9\xa7\x0e\x9c\x85\xceiu\x82^e\xa1\x1f\xd5!d\ -\xd2dL*P\xd9\xcf\x12\xdc\x1c\xbc\xe7,\xae\xb8\x1c\ -\xb1.\x1b2|\x1b\x92\x0d!\xfd/\x08\xd9n\xb99\ -r \xbc\xfe~\xbcn\x22\x9a\xc0\x9e\x9d\x08\xc5\xf9\xd6\ -\x8b|`%\x9bIZ\xe1D\xcf,\xf6#f\x05\x0d\ -\x91\x8e\x1b\xf3\x9e\xe3\xc1\xab\x12]\xae\xf0\xe1\xc3(\x9c\ -\xd6\x22\xfce\xd3X\x00\x1e4\xf8\x9a1\xdb\xc7}\x0d\ -o$\x10JxzJ\xa0z\x09\xb0\x80\x02I\xae\x1f\ -\x86H\x1e\x11.\x1b]s\x9f\xc1\xad9\xfdc\x91}\ -\xc3\xcfP\xef\xdc\x99\x1e~}\x01\xb5\xfc\xc2\x8a\xbc#\ -B]E\x104\x9do\x1b\xd3\xe0>%0\x087\x1c\ -\x96\x0c\xca\x99\xc8\xca\xfe\x11\x9c\xfc\xc5n\xa2.\xaf\x14\ -\xe2\x0dY\xfc\x1a\xec\x18\xc1\xde'\xe4\xe2D\x07~T\ -\x09S\x80\x0da\x0at\x0cO\x86\x09+\xc7\x14\xfe\x81\ -\xc2>\xaf\x1aP9\xc6\x92b&\xee1C\xb9\xe7b\ -\x18nF\x84cG\x9co\x02\x0b\xe8\xde\x86^E\xce\ -;&\x99\xe7\xddE\xe8\xc6\xf7\xe9\xa2\x85C\xa5\x8d\xe9\ -`\x02_\xf0\xb4 \x9a\xbb\xcc\x1e9\x80\xbcu\xd8>\ -Q\xec.\xa5\xebt\x8e\xed\xa5\xab\xac>=\xec^\xd5\ -\xdc9\xa4s=\x03h\xa4\xb9\xaa\xa1\x09F\xde\xd7\xee\ -\xbe$\xb5\xb3S\xdbE\xa8\x00\xf8&\x0e\x95\xde\x0d!\ -\x07\xeb>\xed\xf0e#\x19\xb20\x09U\xec#\x1b|\ -\x08?\x18\x0a8\x1d\xba_\x09\xf2.l<\xdc:\x17\ -\x01L\x90\xa0\xd9\xe0\x06&)/\xb7\xda\x00W\xf3\xe0\ -m\xf2_D\xda\x98\x85\xe4/\x14\x18!e3\x828\ -e\xb80\x0a\x98t\x11\x90\x1b\xf4\x7fdRG\xe5)\ -\xa1!\xbe\x1c\xe6$\x89\x14\xcf \x9dIPr\x05x\ -\xa0\x00\xff6c\x02\x1cnE\xe1\xe9%\xed\xe7\xe3\xac\ -<_\x95\xe8?\x94n_\x98\xc5\xde\xac\x22\x1f\xa6c\ ->\x94oE\xdb\xf8~y\xe8\x9f\x9f\xf9\xa6\x82)f\ -\xbf\xd6\xe7\xc4\x13\xc1y\xfc\xa1W!\xc2P)\xe6[\ -\x10\xd7`\x05\x00d\xfbt\xa4)\xf6\xbf\xfb\x22\x0en\ -?\xbc,\xff\xb0 F\x8c;\x06\x9a \x0f\xf7\xf8\x06\ -\x09\x05\x82@\xa0@\x08P\x00\x05\x0d\x01?\xa2\x0f\xe8\ -\x5c2\x1a\x03\x88\xbf`\xd18\xd4l\x01\x08\x81\xc1c\ -\xd18\xf48\x05!\x8eH\xe1\xd184E\xfd(\x86\ -\xc4\xe5\x92H\xf4z\x0d\x19\x85\xcb&\xd1\xc8\x5c\x92Y\ -&\x85NcRG\xed\x0d\xfb\x13\x92>i\x0f\x87\x9d\ --\xde\xe3\xa77\x1b\xd5\x16\xb3\xa2\xa8\xe1{\xd5\xde\xb3\ -\xe9\xd5n\xb9]\x8eA\x80v\x10%\x8c\x08\x05\x99L\ -\xe15\xe9<\x22\x81j\xb7[\xeb\x95\xabm\xc2\xe9u\ -\x9dM \xb7k\xd4v\xd9y\xbd\xdf\xf0\x11\xa9e\x11\ -\xf9\x17\xad`q\x18\x9cV/\x19\x8d\xc7c\xf2\x19\x1c\ -\x96O)\x95\xcbe\xf3\x19\x9c\xd6o9\x9d\xcfg\xf4\ -\x1a\x1d\x16\x8fI{\x80\x80\x00\x00\x00\x03\x00\x01\xa0\x03\ -\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\xa0\x04\x00\x01\x00\x00\ -\x00`\x00\x00\x00\x03\xa0\x04\x00\x01\x00\x00\x00`\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00Adobe Pho\ -toshop Document \ -Data Block\x00MIB8n\ -rTM\x00\x00\x00\x00MIB8ryaL$\ -!\x00\x00\x01\x00\x03\x00\x00\x00\x03\x00\x00\x00]\x00\x00\ -\x00\x5c\x00\x00\x00\x04\x00\xff\xff\x88\x0d\x00\x00\x00\x00\x0c\ -\x06\x00\x00\x01\x00\x0c\x06\x00\x00\x02\x00\x0c\x06\x00\x00M\ -IB8mron\xff\x00\x08\x00<\x01\x00\x00\x00\ -\x00\x00\x00(\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\ -\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\ -\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x07\ -Layer 0MIB8inul\x14\ -\x00\x00\x00\x07\x00\x00\x00L\x00a\x00y\x00e\x00r\ -\x00 \x000\x00\x00\x00MIB8rsnl\x04\ -\x00\x00\x00ryalMIB8diyl\x04\ -\x00\x00\x00\x03\x00\x00\x00MIB8lblc\x04\ -\x00\x00\x00\x01\x00\x00\x00MIB8xfni\x04\ -\x00\x00\x00\x00\x00\x00\x00MIB8oknk\x04\ -\x00\x00\x00\x00\x00\x00\x00MIB8fpsl\x04\ -\x00\x00\x00\x04\x00\x00\x00MIB8rlcl\x08\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00MIB8d\ -mhsH\x00\x00\x00\x01\x00\x00\x00MIB8t\ -suc\x00\x00\x00\x004\x00\x00\x00\x10\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x08\x00\x00\x00metadat\ -a\x01\x00\x00\x00\x09\x00\x00\x00layerTi\ -mebuod\xc5\xa4\xf3l\xf98\xd6A\x00M\ -IB8prxf\x10\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00S\x00O\ -\x00\x0f\x00\x0c\x00\x0a\x00\x09\x00\x09\x00\x09\x00\x09\x00\x15\ -\x00K\x00K\x00\x1e\x00\x1e\x00\x1e\x00\x1c\x00)\x00'\ -\x00(\x00$\x00'\x00\x22\x00'\x00$\x00&\x00%\ -\x00%\x00 \x00\x1d\x00\x1c\x00\x1c\x00\x1d\x00\x1b\x00\x1d\ -\x00!\x00\x22\x00#\x00%\x00!\x00$\x00+\x00+\ -\x00,\x00+\x00(\x00%\x00&\x00.\x00/\x00.\ -\x00+\x00-\x00-\x00.\x00-\x00.\x00/\x00-\ -\x00.\x00-\x00.\x00-\x00-\x00*\x00%\x00#\ -\x00(\x00,\x00+\x00,\x00,\x00%\x00#\x00!\ -\x00&\x00\x22\x00!\x00\x13\x00\x14\x00L\x00\x09\x00\x09\ -\x00\x08\x00\x09\x00\x0a\x00\x0a\x00\x0c\x00L\x00W\x00 \ -\x00\xfd\x00\x04\x05\x11!-1\xfe/\xfc0\x181/\ -/0110010/1/0010/\ -0110/01\xfe0\x0a/21100\ -/00//\xfe1\x000\xfe1\x05010/\ -01\xfe0\xfe1\xff0\x081/0/-'\x18\ -\x08\x01\xfe\x00\xff\x00\x07\x01\x14X\xab\xdb\xec\xf0\xf0\xfd\ -\xf1\x00\xf0\xfe\xf1\x00\xf2\xfd\xf1\xff\xf0\x01\xf1\xf0\xf8\xf1\ -\x03\xf0\xf1\xf1\xf0\xfe\xf1\xfe\xf0\x07\xf1\xf0\xf0\xf1\xf1\xf0\ -\xf1\xf0\xfc\xf1\xff\xf0\x1b\xf1\xf0\xf0\xf1\xf2\xf1\xf0\xf1\xf0\ -\xf1\xf1\xf2\xf0\xf1\xf0\xf1\xf0\xf0\xf1\xf0\xee\xe4\xc2|.\ -\x06\x00\x00\xff\x00\x03\x16\x86\xed\xfd\xb3\xff\x04\xf9\xbfA\ -\x06\x00\x03\x00\x08l\xf4\xb0\xff\x03\xfe\xbd*\x01\x02\x00\ -$\xd0\xae\xff\x02\xf8x\x07\x02\x02O\xf6\xad\xff\x01\xc0\ -\x14\x02\x05r\xfd\xad\xff\x01\xe1#\x02\x08\x86\xfe\xad\xff\ -\x01\xed+\x02\x08\x8f\xfe\xad\xff\x01\xef-\x02\x09\x91\xfe\ -\xf1\xff\x00\xfe\xdb\xff\xfe\xfe\xfd\xff\x00\xfe\xec\xff\x01\xef\ -,\x02\x08\x91\xfe\xfa\xff\x17\xfe\xcf\xc2\xc3\xc2\xc4\xc3\xc4\ -\xc3\xc3\xc4\xc4\xc1\xc3\xc3\xc2\xc3\xc2\xc2\xc3\xc2\xc3\xc4\xc4\ -\xfe\xc2\xff\xc3\x0c\xcb\xd5\xdc\xe1\xe1\xdd\xd5\xcc\xc2\xc3\xc2\ -\xc2\xc1\xfe\xc3\xff\xc4\xf9\xc3\x06\xc4\xc3\xc3\xc4\xc2\xc3\xc4\ -\xfe\xc3\xff\xc2\x01\xc7\xf1\xf9\xff\x01\xf0-\x02\x09\x90\xfe\ -\xfa\xff\x03\xfaK\x18\x17\xfc\x18\x14\x17\x18\x16\x19\x17\x18\ -\x19\x19\x18\x19\x18\x17\x18\x19\x19\x18\x17/~\xce\xf4\xfb\ -\xff\x13\xf7\xc8\x810\x18\x16\x19\x19\x17\x18\x18\x19\x18\x18\ -\x19\x17\x19\x18\x19\x18\xfd\x19\x08\x18\x19\x19\x18\x19\x19\x17\ -,\xc7\xf9\xff\x01\xf0,\x01\x09\x90\xf9\xff\x01\xf98\xeb\ -\x00\x020\x9f\xea\xf5\xff\x02\xeb\x996\xe8\x00\x01\x15\xc0\ -\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\x01\xf97\xec\x00\ -\x01u\xf4\xf1\xff\x01\xf7c\xe9\x00\x02\x14\xc2\xfe\xfa\xff\ -\x01\xf0-\x02\x09\x90\xfe\xfa\xff\x01\xf88\xee\x00\x01\x12\ -\x91\xed\xff\x01\x9a\x17\xeb\x00\x02\x14\xc2\xfe\xfa\xff\x01\xef\ -/\x01\x08\x90\xf9\xff\x01\xf99\xef\x00\x01\x0e\xc7\xeb\xff\ -\x01\xba\x02\xec\x00\x01\x14\xc1\xf9\xff\x01\xf0/\x02\x09\x90\ -\xfe\xfa\xff\x01\xf97\xef\x00\x00\x95\xfa\xff\x09\xd1\x9c]\ -B;Hj\xaa\xd6\xfe\xfa\xff\x01\x97\x04\xed\x00\x01\x12\ -\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf98\xf0\ -\x00\x00r\xfb\xff\x02\xc9E\x02\xfa\x00\x02\x05C\xbf\xfa\ -\xff\x00\x86\xed\x00\x01\x14\xc2\xf9\xff\x01\xf1-\x02\x09\x90\ -\xfe\xfa\xff\x01\xfa8\xf1\x00\x01-\xf5\xfc\xff\x01\xa3\x09\ -\xf6\x00\x02\x02s\xfc\xfc\xff\x01\xee\x16\xee\x00\x01\x15\xc1\ -\xf9\xff\x01\xef-\x01\x09\x92\xf9\xff\x01\xf97\xf1\x00\x00\ -\xb6\xfc\xff\x01\xa8\x06\xf3\x00\x01C\xe7\xfc\xff\x00\xa0\xee\ -\x00\x01\x15\xc2\xf9\xff\x01\xef,\x02\x09\x91\xfe\xfa\xff\x01\ -\xf98\xf2\x00\x01\x1b\xf4\xfd\xff\x01\xe3\x13\xf1\x00\x01:\ -\xfa\xfd\xff\x01\xf9%\xef\x00\x01\x14\xc2\xf9\xff\x01\xf0/\ -\x01\x09\x90\xf9\xff\x01\xfa7\xf2\x00\x00\x82\xfc\xff\x00g\ -\xef\x00\x00\x8f\xfc\xff\x00\x87\xef\x00\x01\x15\xc2\xf9\xff\x01\ -\xef-\x01\x09\x91\xf9\xff\x01\xf87\xf3\x00\x01\x12\xea\xfd\ -\xff\x01\xe9\x0d\xef\x00\x01\x08\xd8\xfd\xff\x01\xdf\x0a\xf0\x00\ -\x02\x14\xc1\xfe\xfa\xff\x01\xef/\x02\x08\x90\xfe\xfa\xff\x01\ -\xf98\xf3\x00\x00n\xfc\xff\x00\xad\xed\x00\x00o\xfd\xff\ -\x01\xfd0\xf0\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\x91\ -\xfe\xfa\xff\x01\xf97\xf4\x00\x01\x0f\xe5\xfd\xff\x01\xfe;\ -\xed\x00\x01\x17\xee\xfd\xff\x00T\xf0\x00\x01\x14\xc3\xf9\xff\ -\x01\xf0/\x02\x09\x91\xfe\xfa\xff\x01\xfa7\xf4\x00\x01(\ -\xef\xfd\xff\x01\xc2\x02\xec\x00\x00\xcb\xfd\xff\x00c\xf0\x00\ -\x01\x15\xc1\xf9\xff\x01\xf1-\x02\x09\x92\xfe\xfa\xff\x01\xf8\ -8\xf4\x00\x06\x01\x1bP\xc0\xff\xffI\xeb\x00\x00\xb0\xfd\ -\xff\x00m\xf0\x00\x01\x15\xc2\xf9\xff\x01\xf0.\x01\x09\x90\ -\xf9\xff\x01\xf98\xf0\x00\x02C\x87\x07\xeb\x00\x00\xb6\xfd\ -\xff\x00m\xf0\x00\x01\x15\xc2\xf9\xff\x01\xf0.\x02\x09\x90\ -\xfe\xfa\xff\x01\xf99\xd8\x00\x01\x09\xda\xfd\xff\x00b\xf0\ -\x00\x02\x15\xc3\xfe\xfa\xff\x01\xef-\x01\x08\x91\xf9\xff\x01\ -\xf97\xd8\x00\x018\xfe\xfd\xff\x00Q\xf0\x00\x02\x14\xc2\ -\xfe\xfa\xff\x01\xf0/\x02\x09\x91\xfe\xfa\xff\x01\xf98\xd8\ -\x00\x00\x9b\xfd\xff\x01\xfc2\xf0\x00\x01\x14\xc1\xf9\xff\x01\ -\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf98\xd9\x00\x01*\xf8\ -\xfd\xff\x01\xd5\x06\xf0\x00\x01\x14\xc1\xf9\xff\x01\xf0.\x02\ -\x09\x91\xfe\xfa\xff\x01\xf99\xd9\x00\x00\x8e\xfc\xff\x00\x80\ -\xef\x00\x01\x14\xc2\xf9\xff\x01\xf1.\x02\x09\x92\xfe\xfa\xff\ -\x01\xf99\xda\x00\x01\x07\xdf\xfd\xff\x01\xe5\x19\xef\x00\x01\ -\x15\xc1\xf9\xff\x01\xf0/\x02\x08\x93\xfe\xfa\xff\x01\xf98\ -\xda\x00\x01B\xfe\xfd\xff\x04\xef\xc8\xca\xad^\xf2\x00\x02\ -\x15\xc1\xfe\xfa\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\x01\xf9\ -8\xe0\x00\x06\x0c\x22Cg\x84\x9c\xda\xf7\xff\x01\xb9(\ -\xf4\x00\x01\x14\xc1\xf9\xff\x01\xef-\x01\x08\x8f\xf9\xff\x01\ -\xf99\xe6\x00\x07\x0d(Hn\x97\xbb\xde\xf4\xf1\xff\x01\ -\xd1\x0a\xf5\x00\x02\x15\xbf\xfe\xfa\xff\x01\xee.\x02\x09\x92\ -\xfe\xfa\xff\x01\xf89\xef\x00\x0a\x02\x0e\x1d:Pf~\ -\x9b\xc2\xdf\xf8\xea\xff\x00Q\xf5\x00\x01\x14\xc2\xf9\xff\x01\ -\xef.\x01\x09\x91\xf9\xff\x01\xf98\xf4\x00\x07\x059]\ -\x88\xaf\xd1\xe3\xee\xe2\xff\x00\x9f\xf5\x00\x01\x14\xc1\xf9\xff\ -\x01\xf0-\x02\x09\x90\xfe\xfa\xff\x01\xf98\xf6\x00\x02\x10\ -{\xd0\xe3\xff\x03\xfa\xf0\xdc\xed\xfd\xff\x00\xc1\xf5\x00\x01\ -\x14\xc1\xf9\xff\x01\xef,\x02\x09\x90\xfe\xfa\xff\x01\xf97\ -\xf7\x00\x01$\xd4\xe8\xff\x0a\xfb\xe5\xc7\x9fyR8)\ -\x18\x08\x9d\xfd\xff\x01\xe2\x0f\xf6\x00\x01\x15\xc2\xf9\xff\x01\ -\xf1.\x01\x09\x91\xf9\xff\x01\xf98\xf8\x00\x01\x05\xc8\xed\ -\xff\x07\xf7\xe2\xc0\x9crJ+\x0d\xf9\x00\x00\x8a\xfd\xff\ -\x01\xf8&\xf6\x00\x01\x14\xc3\xf9\xff\x01\xf1.\x02\x09\x92\ -\xfe\xfa\xff\x01\xf99\xf8\x00\x00`\xf4\xff\x09\xfd\xea\xcd\ -\xa7\x82jXC#\x0c\xf3\x00\x00k\xfc\xff\x00J\xf6\ -\x00\x01\x13\xc2\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\ -\xf97\xf8\x00\x00\xaf\xfa\xff\x07\xfb\xe6\xc6\xa3wR/\ -\x11\xeb\x00\x00D\xfc\xff\x00p\xf6\x00\x02\x15\xc2\xfe\xfa\ -\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf98\xf8\x00\x00\ -\xc1\xfd\xff\x04\xeaxJ+\x0f\xe5\x00\x01#\xf8\xfd\xff\ -\x00\x97\xf6\x00\x01\x14\xc1\xf9\xff\x01\xef.\x02\x09\x91\xfe\ -\xfa\xff\x01\xf88\xf8\x00\x00\xa1\xfd\xff\x01\xe5\x03\xe2\x00\ -\x01\x08\xdf\xfd\xff\x00\xbe\xf6\x00\x01\x15\xc1\xf9\xff\x01\xef\ --\x02\x09\x91\xfe\xfa\xff\x01\xf97\xf8\x00\x00y\xfd\xff\ -\x01\xfc.\xe1\x00\x00\xc0\xfd\xff\x01\xdd\x0a\xf7\x00\x02\x14\ -\xc2\xfe\xfa\xff\x01\xf1.\x02\x09\x91\xfe\xfa\xff\x01\xf98\ -\xf8\x00\x00M\xfc\xff\x00T\xf3\x00\x05?\x95\xb6\xa2f\ -\x0b\xf5\x00\x00\x96\xfd\xff\x01\xf7&\xf7\x00\x02\x15\xc2\xfe\ -\xfa\xff\x01\xef.\x02\x09\x90\xfe\xfa\xff\x01\xf98\xf8\x00\ -\x01.\xfd\xfd\xff\x00w\xf5\x00\x02\x08\x97\xfd\xfd\xff\x01\ -\xc5#\xf6\x00\x00r\xfc\xff\x00C\xf7\x00\x01\x14\xc1\xf9\ -\xff\x01\xef.\x02\x09\x92\xfe\xfa\xff\x01\xf97\xf8\x00\x01\ -\x10\xe8\xfd\xff\x00\xa2\xf6\x00\x01\x01\xaf\xfa\xff\x01\xe11\ -\xf7\x00\x00H\xfc\xff\x00i\xf7\x00\x01\x15\xc2\xf9\xff\x01\ -\xf0.\x01\x09\x91\xf9\xff\x01\xf98\xf7\x00\x00\xcb\xfd\xff\ -\x00\xc7\xf6\x00\x00?\xf8\xff\x00\xb7\xf7\x00\x01'\xfa\xfd\ -\xff\x00\x87\xf7\x00\x01\x15\xc1\xf9\xff\x01\xef.\x01\x09\x91\ -\xf9\xff\x01\xf97\xf7\x00\x00\xa7\xfd\xff\x01\xe3\x0d\xf7\x00\ -\x00\xa0\xf8\xff\x01\xe6\x0b\xf8\x00\x01\x0c\xe4\xfd\xff\x00\x9d\ -\xf7\x00\x01\x14\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\ -\x01\xf98\xf7\x00\x00|\xfd\xff\x01\xf5\x1f\xf7\x00\x00\xcb\ -\xf8\xff\x01\xf7\x22\xf7\x00\x00\xc3\xfd\xff\x00\xb3\xf7\x00\x01\ -\x13\xc0\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf97\ -\xf7\x00\x00W\xfd\xff\x01\xfc.\xf7\x00\x00\xc0\xf8\xff\x01\ -\xf3\x1e\xf7\x00\x00\xa0\xfd\xff\x01\xcb\x01\xf8\x00\x01\x14\xc1\ -\xf9\xff\x01\xf1.\x01\x09\x91\xf9\xff\x01\xfa8\xf7\x00\x01\ -0\xfd\xfd\xff\x00A\xf7\x00\x00\x82\xf8\xff\x01\xdc\x05\xf7\ -\x00\x00t\xfd\xff\x01\xe8\x14\xf8\x00\x01\x15\xc1\xf9\xff\x01\ -\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf97\xf7\x00\x01\x14\xee\ -\xfd\xff\x00^\xf7\x00\x01$\xf9\xf9\xff\x00\x90\xf6\x00\x00\ -N\xfd\xff\x01\xfb-\xf8\x00\x01\x13\xc2\xf9\xff\x01\xf0-\ -\x02\x09\x91\xfe\xfa\xff\x01\xf99\xf7\x00\x01\x02\xcd\xfd\xff\ -\x00\x8a\xf6\x00\x00k\xfb\xff\x02\xfe\xa1\x0a\xf6\x00\x005\ -\xfc\xff\x00T\xf8\x00\x02\x15\xc2\xfe\xfa\xff\x01\xf1.\x01\ -\x09\x92\xf9\xff\x01\xf98\xf6\x00\x00\xb4\xfd\xff\x00\xae\xf5\ -\x00\x01P\xd7\xfd\xff\x01\xfa\x22\xf5\x00\x01(\xfa\xfd\xff\ -\x00x\xf8\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\x91\xfe\ -\xfa\xff\x01\xf86\xf6\x00\x00\xa1\xfd\xff\x01\xd1\x04\xf5\x00\ -\x00T\xfc\xff\x00H\xf5\x00\x01\x18\xf0\xfd\xff\x00\x9f\xf8\ -\x00\x02\x14\xc1\xfe\xfa\xff\x01\xf0-\x02\x09\x91\xfe\xfa\xff\ -\x01\xf98\xf6\x00\x00\x8c\xfd\xff\x01\xee\x18\xf5\x00\x00=\ -\xfc\xff\x00s\xf5\x00\x01\x06\xda\xfd\xff\x00\xc6\xf8\x00\x01\ -\x14\xc2\xf9\xff\x01\xf0.\x02\x09\x92\xfe\xfa\xff\x01\xf86\ -\xf6\x00\x00r\xfd\xff\x01\xfe4\xf5\x00\x01%\xf7\xfd\xff\ -\x00\x98\xf4\x00\x00\xba\xfd\xff\x01\xe3\x0f\xf9\x00\x01\x14\xc1\ -\xf9\xff\x01\xf0/\x01\x09\x91\xf9\xff\x01\xf98\xf6\x00\x00\ -F\xfc\xff\x00[\xf5\x00\x01\x08\xdc\xfd\xff\x00\x90\xf4\x00\ -\x00\x8f\xfd\xff\x01\xfb,\xf9\x00\x02\x15\xc1\xfe\xfa\xff\x01\ -\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf88\xf6\x00\x01'\xfa\ -\xfd\xff\x00\x80\xf4\x00\x00t\xfe\xff\x01\xee-\xf4\x00\x00\ -j\xfc\xff\x00K\xf9\x00\x01\x15\xc2\xf9\xff\x01\xf1-\x01\ -\x09\x91\xf9\xff\x01\xfa8\xf6\x00\x01\x0b\xe2\xfd\xff\x00\xab\ -\xf3\x00\x03D\x97\x8a)\xf3\x00\x00@\xfc\xff\x00u\xf9\ -\x00\x01\x13\xc2\xf9\xff\x01\xf0.\x01\x08\x90\xf9\xff\x01\xf9\ -8\xf5\x00\x00\xc4\xfd\xff\x01\xcd\x01\xe2\x00\x01 \xf7\xfd\ -\xff\x00\x9a\xf9\x00\x02\x14\xc2\xfe\xfa\xff\x01\xf0.\x01\x09\ -\x91\xf9\xff\x01\xf98\xf5\x00\x00\x9c\xfd\xff\x01\xeb\x15\xe1\ -\x00\x00\xd8\xfd\xff\x00\xbb\xf9\x00\x01\x13\xc2\xf9\xff\x01\xf0\ -.\x02\x08\x91\xfe\xfa\xff\x01\xf97\xf5\x00\x00t\xfd\xff\ -\x01\xfe1\xe4\x00\x03\x07\x1c=\xd4\xfd\xff\x00\xce\xf9\x00\ -\x02\x15\xc0\xfe\xfa\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\ -\xf89\xf5\x00\x00N\xfc\xff\x00S\xec\x00\x09\x02\x12\x22\ -3Ei\x8f\xb7\xd7\xf1\xfb\xff\x00\xc9\xf9\x00\x01\x14\xc2\ -\xf9\xff\x01\xef-\x01\x09\x90\xf9\xff\x01\xf96\xf5\x00\x01\ -)\xfb\xfd\xff\x00z\xf2\x00\x08\x03\x1a7Z\x85\xa8\xd0\ -\xe9\xf6\xf4\xff\x00\x8b\xf9\x00\x01\x14\xc0\xf9\xff\x01\xf1,\ -\x01\x09\x90\xf9\xff\x01\xf97\xf5\x00\x01\x0f\xe8\xfd\xff\x00\ -\x92\xf9\x00\x08\x03\x0d\x1d\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / Globa\ -l\x0d\x0a <\ -desc>Created wit\ -h Sketch.\ -\x0d\x0a \x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x09\xba\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / Camer\ -a\x0d\x0a <\ -desc>Created wit\ -h Sketch.\ -\x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \ -\x0d\x0a \ - \x0d\x0a \x0d\ -\x0a\x0d\x0a\ -\x00\x00\x00\xab\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x0d\x08\x06\x00\x00\x00\xa0\xbb\xee$\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -UIDAT8Oc\xfc\xff\xff?\x03%\x80\x09\ -J\x93\x0d\xf0\x1a\xd0\xd8\xd8H\xd0y\x04]@\xc8\x10\ -\x940\xc0\xa7\xb8\xbe\xbe\x9e\x11\xcaD\x01D\x87\x01.\ -\xc3I\x0aDl\x86\x90d\x006o\x10m\x00\xae0\ -\xc0\x9b\x90`N\xc6\xa5\x19\x04\x08\xba\x00\x9ff\x10\x18\ -\xe8\xa4\xcc\xc0\x00\x00\x9d\xda\x22\x8d\x12\xa2\xae,\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x05{\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / viewp\ -ort\x0d\x0a \ - Created w\ -ith Sketch.\x0d\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \ -\x0d\x0a\x0d\x0a\ -\x00\x00\x00\xca\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x0d\x08\x06\x00\x00\x00\xa0\xbb\xee$\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x00_IDAT8O\xc5\x91\xc1\x0e\ -\xc0 \x08C\xc1\x1f\x07\xbe\x9c\x05'\x86\xc4\xb9\x89\x1e\ -\xf6.r\xa1\xd2\x16U\x15\x0c\x11\xb9\x87\x07\x88\x08\xdb\ -8\x80\xcc<]\x5c\xa1\xb4w\x9b\xff\x05z\x88\x19b\ -\xe0\xe9\x10\xbd\x11\x17I[\xf0E\x17*o\x1d\xcf\x88\ -\x16\x8eB\xb4\xcf\xab\xc0\xc9\x15\xfd\x82\x1d\x11c\xa81\ -\xfa\xfb\x06\xe0\x02\xfbk*\x0b\x22\xb70[\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x06\x06\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a Icons / Edit\ -or / EMFX / Moti\ -on\x0d\x0a \ -\x0d\x0a \ -\x0d\x0a \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x00\xa0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x0d\x08\x06\x00\x00\x00\xa0\xbb\xee$\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ -\xa8d\x00\x00\x005IDAT8Oclhh\ -\xf8\xcf\x80\x06\xea\xeb\xeb\x19\xa1L\x82\x80\x09J\x93\x0d\ -\xb0\xba\x80\x18\x00s%\xd9.hll\x04[L\xb1\ -\x17F\x0d\x185\x80\x81\x81\x81\x01\x00\xc0\x1c\x0a\x95\xd5\ -0\x97g\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x11\xc7\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / Debug\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \ - \x0d\x0a \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x12>\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / Exper\ -imental\x0d\ -\x0a Creat\ -ed with Sketch.<\ -/desc>\x0d\x0a \x0d\x0a <\ -path d=\x22M15.1323\ -36,4.99076918 C1\ -5.5178274,4.9907\ -6918 15.8485779,\ -5.34903984 16.04\ -13236,5.67028261\ - C16.2340693,5.9\ -9152539 16.20194\ -5,6.90832486 16.\ -0413236,7.261691\ -92 C15.7410536,7\ -.67565898 15.559\ -016,8.029019 15.\ -4952109,8.321771\ -96 C15.4376576,8\ -.58583981 15.459\ -0738,9.15831061 \ -15.5594594,10.03\ -91844 C17.808158\ -9,11.0992855 19.\ -0519645,13.44435\ -78 18.9234674,15\ -.9500515 C18.797\ -9586,19.0877716 \ -16.2512974,21.89\ -56839 13.1394393\ -,22.1143917 L12.\ -9162275,22.12557\ -98 L12.1999856,2\ -2.1255798 C8.794\ -81215,22.1255798\ - 6,19.0982307 6,\ -15.660933 C6,13.\ -3376593 7.088222\ -19,11.2234803 9.\ -09581042,10.1537\ -076 L9.3226506,1\ -0.0391844 L9.162\ -02921,8.06479886\ - L8.71228932,7.2\ -6169192 C8.55166\ -793,6.90832486 8\ -.64804077,5.9915\ -2539 8.84078643,\ -5.67028261 C9.04\ -316938,5.3811641\ -2 9.51285982,5.0\ -6205304 9.885797\ -26,5.00112201 L1\ -0.0060269,4.9907\ -6918 L15.132336,\ -4.99076918 Z M14\ -.5477747,9.22030\ -884 L10.3382049,\ -9.22030884 L10.3\ -087674,10.505628\ -3 C10.3087674,10\ -.5645034 10.2793\ -298,10.6233785 1\ -0.2204547,10.652\ -8161 C8.30701393\ -,11.5065051 7.07\ -063679,13.419945\ -9 7.07063679,15.\ -5394495 C7.07063\ -679,18.5420797 9\ -.54339107,20.985\ -3965 12.5754588,\ -20.8970838 C15.3\ -720262,20.838208\ -7 17.6681551,18.\ -5715173 17.78590\ -53,15.8043875 C1\ -7.9036555,13.626\ -0087 16.6378408,\ -11.5359426 14.63\ -60874,10.6528161\ - C14.5919311,10.\ -6307379 14.56433\ -34,10.5921011 14\ -.5532943,10.5493\ -247 L14.5477747,\ -10.5056283 L14.5\ -477747,9.2203088\ -4 Z M16.248292,1\ -5.5813393 C16.43\ -33656,15.5813393\ - 16.5920002,15.6\ -606566 16.697756\ -5,15.792852 C16.\ -8035128,15.92504\ -74 16.856391,16.\ -1101211 16.82995\ -19,16.2951947 C1\ -6.6977565,17.009\ -05 16.4069265,18\ -.0137353 15.6930\ -712,18.806908 C1\ -4.4693191,20.158\ -1342 12.6801281,\ -20.2309765 12.48\ -27708,20.2344561\ - L12.4146244,20.\ -2346187 C12.0973\ -553,20.2346187 1\ -0.4581319,20.155\ -3014 9.29481208,\ -18.806908 C8.501\ -63946,17.8815399\ - 8.2108095,16.92\ -97328 8.10505315\ -,16.2951947 C8.0\ -7861407,16.11012\ -11 8.10505315,15\ -.9250474 8.23724\ -859,15.792852 C8\ -.32185367,15.687\ -0957 8.44030078,\ -15.6321024 8.579\ -05311,15.6007985\ - L8.68671307,15.\ -5813393 L16.2482\ -92,15.5813393 Z \ -M13.525066,16.42\ -73901 C12.996284\ -3,16.4273901 12.\ -5468198,16.87685\ -46 12.5468198,17\ -.4056363 C12.520\ -3807,17.9344181 \ -12.9698452,18.38\ -38826 13.525066,\ -18.3838826 C14.0\ -538478,18.383882\ -6 14.5033123,17.\ -9344181 14.50331\ -23,17.4056363 C1\ -4.5033123,16.876\ -8546 14.0538478,\ -16.4273901 13.52\ -5066,16.4273901 \ -Z M10.5110101,16\ -.5331465 C10.114\ -4238,16.5331465 \ -9.79715474,16.82\ -39764 9.82359382\ -,17.2205627 C9.8\ -2359382,17.59070\ -99 10.1408629,17\ -.907979 10.51101\ -01,17.907979 C10\ -.8811573,17.9079\ -79 11.1984264,17\ -.5907099 11.1984\ -264,17.2205627 C\ -11.1984264,16.85\ -04155 10.8811573\ -,16.5331465 10.5\ -110101,16.533146\ -5 Z M11.0960618,\ -12.7156002 C11.6\ -351612,12.715600\ -2 12.0891397,13.\ -1695787 12.08913\ -97,13.7086781 C1\ -2.0891397,14.247\ -7775 11.6351612,\ -14.701756 11.096\ -0618,14.701756 C\ -10.5569624,14.70\ -1756 10.1029839,\ -14.2477775 10.10\ -29839,13.7086781\ - C10.1029839,13.\ -1695787 10.55696\ -24,12.7156002 11\ -.0960618,12.7156\ -002 Z M12.429623\ -6,10.4173342 C12\ -.8268547,10.4173\ -342 13.1389649,1\ -0.7294444 13.138\ -9649,11.1266755 \ -C13.1389649,11.5\ -239067 12.826854\ -7,11.8360169 12.\ -4296236,11.83601\ -69 C12.0323924,1\ -1.8360169 11.720\ -2822,11.5239067 \ -11.7202822,11.12\ -66755 C11.720282\ -2,10.7294444 12.\ -0323924,10.41733\ -42 12.4296236,10\ -.4173342 Z M14.4\ -300245,6.2371834\ -4 L10.39708,6.23\ -718344 C10.16157\ -96,6.23718344 9.\ -95551678,6.35493\ -364 9.83776658,6\ -.5609965 C9.7396\ -4141,6.73271554 \ -9.72328721,6.924\ -87734 9.77166837\ -,7.10341063 L9.8\ -0832903,7.208622\ -62 L10.39708,8.0\ -9174915 L10.3970\ -8,8.60845497 L14\ -.5919794,8.60845\ -497 L14.5919794,\ -8.09174915 L15.0\ -187755,7.2086226\ -2 C15.1365257,7.\ -00255976 15.1070\ -882,6.76705935 1\ -4.989338,6.56099\ -65 C14.8715878,6\ -.35493364 14.665\ -5249,6.23718344 \ -14.4300245,6.237\ -18344 Z M12.3728\ -762,6.5763594 C1\ -2.7984811,6.5763\ -594 13.1389649,6\ -.91684325 13.138\ -9649,7.34244807 \ -C13.1389649,7.76\ -805289 12.798481\ -1,8.10853674 12.\ -3728762,8.108536\ -74 C11.9472714,8\ -.10853674 11.606\ -7876,7.76805289 \ -11.6067876,7.342\ -44807 C11.606787\ -6,6.91684325 11.\ -9472714,6.576359\ -4 12.3728762,6.5\ -763594 Z M14.933\ -6824,2 C15.64302\ -38,2 16.2388706,\ -2.53909944 16.23\ -88706,3.27681446\ - C16.2388706,4.0\ -1452947 15.64302\ -38,4.58200257 14\ -.9336824,4.58200\ -257 C14.2243411,\ -4.58200257 13.62\ -84943,4.04290313\ - 13.6284943,3.30\ -518811 C13.62849\ -43,2.56747309 14\ -.2243411,2 14.93\ -36824,2 Z\x22 id=\x22C\ -ombined-Shape\x22 f\ -ill=\x22#FFFFFF\x22 fi\ -ll-rule=\x22nonzero\ -\x22>\x0d\x0a <\ -/g>\x0d\x0a\x0d\x0a\ -\x00\x00\x04\x17\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / Files\ -\x0d\x0a Created with\ - Sketch.\x0d\ -\x0a \x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x03i\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a \x0d\x0a <\ -title>icon / Pre\ -ferences / Gizmo\ -s\x0d\x0a <\ -desc>Created wit\ -h Sketch.\ -\x0d\x0a \x0d\x0a \ - \x0d\x0a \x0d\x0a\ -\x0d\x0a\ -\x00\x00\x00[\ -\x00\ -\x00\x01Fx\x9c\x8d\x8c1\x0a\x800\x10\x04\xe7\xacD\ -P;\xeb\x94\x96>\xc1\xa7\xf9d\xad\x05\xcf\x8d\x88B\ -\xc0\x98Y\x86\x83cY\xa80B\x80V\x99\x0c\x06`\ -\x94z1KS\x22\x0b/\xd5m\xc4\xdd)\xa2\x93\xcd\ -\xb7\xfd~Pk5\xde\x5c\xef\xdaI\xf0\x12\xb6\xbc+\ -\xf6\xf8\xd7M9\x01\x0cb\x81\xee\ -\x00\x00\x00[\ -\x00\ -\x00\x01Fx\x9c\xc5\xc81\x0e@@\x18D\xe1\xf9W\ -!**\xad-\x95n\xc0\xcd\xec\xd1\x1c\xc5\x11\x94\x0a\ -\xf1\xec\xc6\x8a\x0bH|\x93\xd7\x8c\xe4d\xf2^jT\ -i0\xa9\x95\xd4\xc7\xe2\xa5)fqI\xd0\xcb\xe5\x12\ -@\x7f\xe3q\xcep\x8c\xb0w\xb0\xd5\xb0\x96\xb0\x14\x10\ -\xec\xfe\xbe.\xbb\x00\x9d\x16jC\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x0c\x00\x04\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x07\xf8\x00\x00\x07\xf8\x00\x00\x0f\xfc\x00\x00\x0f\xfc\ -\x00\x00\x1f\xfc\x00\x00\x1f\xfe\x00\x00?\xfe\x00\x00/\xfe\ -\x00\x00o\xfe\x00\x00\xef\xfe\x00\x00\xcf\xf6\x00\x00\x0d\xb6\ -\x00\x00\x0d\xb4\x00\x00\x0d\xb0\x00\x00\x0d\x80\x00\x00\x0c\x00\ -\x00\x00\x0c\x00\x00\x00\x0c\x00\x00\x00\x0c\x00\x00\x00\x0c\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x03\ -\xff\xff\xf0\x03\xff\xff\xf0\x03\xff\xff\xe0\x01\xff\xff\xe0\x01\ -\xff\xff\xc0\x01\xff\xff\xc0\x00\xff\xff\x80\x00\xff\xff\x80\x00\ -\xff\xff\x00\x00\xff\xfe\x00\x00\xff\xfe\x00\x00\xff\xfe \x00\ -\xff\xff\xe0\x01\xff\xff\xe0\x03\xff\xff\xe0\x0f\xff\xff\xe0\x7f\ -\xff\xff\xe1\xff\xff\xff\xe1\xff\xff\xff\xe1\xff\xff\xff\xe1\xff\ -\xff\xff\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x00\xa7\ -\x00\ -\x00\x0c\xbex\x9c\xed\x921\x0a\xc20\x18\x85_t\xe8\ -Rp\x13\xc7\x8e=\x867\xf0J\x1e\xc1cx\x0c\xc1\ -\x8btsut(<_\x8bC1\x12K\x93\xdfA\ -\xfe\x0f\x1e\x09\x09\xf9^\x02\x01V\x08h\x1a\x8c\xe3\xb9\ -\x06\xb6\x00ZEK\xd8+\x01;\x8c\xd4p\x1c\xc7q\ -\x9c?\x85\x11\xa6\xf2\x82\xfe\x8f\xf2R\x15\x09\xf9\x0f\xfc\ -\x99\x15_\xe59\xfe\xa9\xc1\xce?\xe7!\x8b+\xe2\xb7\ -\xbci\x8b\xf8c\xdbt\x92}\xf7\x94\xbf\xa0\xdc\x08k\ -\xbf\x11\xe9\x0f9\x8f~C>*\xf2\xaetk\xf22\ -$\x90G\x05C\xd4rR\xba\xf0\xda?\x90W\x9d\xbb\ -)O\x85i\xaa%\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x06\x00\x06\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x000\x00\x00\x000\x00\x00\x000\x00\ -\x00\x01\xfe\x00\x00\x01\xfe\x00\x00\x000\x00\x00\x000\x00\ -\x00\x001\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\x00\x03\x00\ -\x00\x00\x06\x00\x00\x00F\x00\x00\x00l\x00\x00\x00|\x00\ -\x00\x00\x7f\x80\x00\x00\x7f\x00\x00\x00~\x00\x00\x00|\x00\ -\x00\x00x\x00\x00\x00p\x00\x00?\xe0\x00\x00 \x00\ -\x00 \x00\x00 \x00\x00 \x00\x00 \x00\ -\x00 \x00\x00 \x00\x00?\xe0\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xcf\xff\xff\xff\xcf\xff\xff\xff\xcf\xff\ -\xff\xfe\x01\xff\xff\xfe\x01\xff\xff\xff\xcf\xff\xff\xff\xce\x7f\ -\xff\xff\xcc?\xff\xff\xfc?\xff\xff\xf8\x7f\xff\xffx\x7f\ -\xff\xff0\xff\xff\xff\x10\xff\xff\xff\x01\xff\xff\xff\x00\x1f\ -\xff\xff\x00?\xff\xff\x00\x7f\xff\xff\x00\xff\xff\xff\x01\xff\ -\xff\xff\x03\xff\xff\x80\x07\xff\xff\x80\x0f\xff\xff\x9f\xcf\xff\ -\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\ -\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x80\x0f\xff\xff\x80\x0f\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x00`\ -\x00\ -\x00\x01Fx\x9cc``b`dPP``\xe0\ -f\xe0e0`d`\x10c``\xd0\x00b\xa0\x10\ -\x83\x03\x103\x02!\x0840 \x00\x13\x14\x83\xc0\xff\ -\xff\xff\x19H\x025@\x1c\x82\x03\x0b\xe0\x91\xab\xc1m\ -\xe4\x7fR@3&\xfe\xdd\xbc\xff\xff\xe7\xe6\xf9\xff\x1f\ -0\xf0\x83i\x10\x1f\x9b:\x5c\x00\x00\x81\xb3~\xf0\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x03\x80\x00\x00\x02\x80\x00\x00\x02\x80\ -\x00\x00\x02\x80\x00\x00\x02\x80\x00\x00\x04@\x00\x00\x0c`\ -\x00\x03\xf0\x1f\x80\x02\x01\x00\x80\x03\xf0\x1f\x80\x00\x0c`\ -\x00\x00\x04@\x00\x00\x02\x80\x00\x00\x02\x80\x00\x00\x02\x80\ -\x00\x00\x02\x80\x00\x00\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\ -\xff\xff\xfe\xff\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xfc\x7f\ -\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xf9?\xff\xff\xf1\x1f\ -\xff\xfc\x03\x80\x7f\xf0\x1e\xf0\x1f\xfc\x03\x80\x7f\xff\xf1\x1f\ -\xff\xff\xf9?\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xfc\x7f\ -\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xfe\xff\xff\xff\xfe\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x10\x00\x0d\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\ - \x01\x00\x00@\x00\xc0\x01\x80\x008\x0e\x00\x00\x07\xf0\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\xff\xff\xcf\xf8\xff\xff\ -\x8f\xfc?\xfe\x1f\xfe\x07\xe0?\xff\x00\x00\x7f\xff\xc0\x01\ -\xff\xff\xf8\x0f\xff\xff\xff\xff\xff\xff\xff\x7f\xff\xff\xfe?\ -\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xfe?\ -\xff\xff\xff\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x00X\ -\x00\ -\x00\x01Fx\x9c\xc5\xcd1\x0a\x800\x0cF\xe1\x97.\ -\xe2\xa4\x93k;:z\x83z\xb3\xf6\xc8\xbdA\xfc\x0b\ -\x05A\x9c\x5c|\xe1#\x90\xa1\x85\x80\x91\x12\xac\xcc\x1c\ -\x06\x1b\xb0\x8bN\x9cb\x9a^\xe5.\x0c=w\xe7\xef\ -\xfc\xa5V>+\x92\x1bDYd\x1a;\xea\xd9,\xe5\ -\xf9\xd7\x05'\x93i\xe6\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x1e\x00\x00\x00\x1e\x00\ -\x00\x00\x1e\x00\x00\x00\x1e\x00\x00\x18\x1e\x00\x00\x14\x0c\x00\ -\x00\x12\x00\x00\x00\x11\xe0\x00\x00\x10\x10\x00\x00\x10 \x00\ -\x00\x10@\x00\x00\x10\x80\x00\x00\x11\x00\x00\x00\x12\x00\x00\ -\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xf3\xff\xff\xff\xe1\xff\xff\xff\xc0\xff\xff\xff\xc0\xff\ -\xff\xff\xc0\xff\xff\xff\xc0\xff\xff\xe7\xc0\xff\xff\xe3\xe1\xbf\ -\xff\xe1\xf3\xbf\xff\xe0\x1e\x0f\xff\xe0\x0f\xbf\xff\xe0\x1f\xbf\ -\xff\xe0?\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ -\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x00\x00\x18\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xf0\x00\x00\x00\x88\x00\x00\x00\x84\x00\x00\x00\x82\x00\x00\ -\x00A\x00\x00\x00 \x80\x00\x00\x10@\x00\x00\x0b\xa0\x00\ -\x00\x05\xd6\x00\x00\x02\xe9\x00\x00\x01a\x00\x00\x00\x81\x00\ -\x00\x00@\x80\x00\x00\x80@\x00\x00\x80 \x00\x00p \ -\x00\x00\x08 \x00\x00\x04@\x00\x00\x03\x80\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\x0f\xff\xff\xff\x07\xff\xff\xff\x03\xff\xff\xff\x01\xff\xff\ -\xff\x80\xfc\xff\x0f\xc0~|c\xe0?1\xf9\xf0\x1f\x87\ -\xff\xf8\x09\xfd\xff\xfc\x00\xf8\xff\xfe\x00\xf0\x7f\xff\x00\xfd\ -\xdb\xff\x80}\xdb\xff\x00=\xdb\xff\x00\x1d\xc3\xff\x80\x1d\ -\xdb\xff\xf0\x1d\xdb\xff\xf8=\xdb\xff\xfcp\x7f\xff\xff\xf8\ -\xff\xff\xff\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x01\x00\x01\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x18\x00\x00\x00\x18\x00\x00\x00\x18\x00\x00\x00\xff\x00\x00\ -\x00\xff\x00\x00\x00\x18\x00\x00\x00\x18\x00\x00\x00\x18\xc0\x00\ -\x00\x00\xc0\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\ -\x00#\x00\x00\x006\x00\x00\x00>\x00\x00\x00?\xc0\x00\ -\x00?\x80\x00\x00?\x00\x00\x00>\x00\x00\x00<\x00\x00\ -\x008\x00\x00\x000\x00\x00\x00 \x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\x00\xff\xff\ -\xff\x00\xff\xff\xff\xe7\xff\xff\xff\xe7?\xff\xff\xe6\x1f\xff\ -\xff\xfe\x1f\xff\xff\xfc?\xff\xff\xbc?\xff\xff\x98\x7f\xff\ -\xff\x88\x7f\xff\xff\x80\xff\xff\xff\x80\x0f\xff\xff\x80\x1f\xff\ -\xff\x80?\xff\xff\x80\x7f\xff\xff\x80\xff\xff\xff\x81\xff\xff\ -\xff\x83\xff\xff\xff\x87\xff\xff\xff\x8f\xff\xff\xff\x9f\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xe0\ -\x00\x00\x18\x18\x00\x00 \x04\x00\x00@\x02\x00\x00\x80\x01\ -\x00\x01\x00\x00\x80\x01\x00\x00\x80\x02\x00\x00@\x02\x00\x00\ -@\x02\x02\x00@\x02\x02\x00\x00\x02\x03\x00\x00\x02\x00\x00\ -\x00\x01\x00\x7f\x80\x01\x00 \x80\x00\x80\x10\x80\x00@\x08\ -\x80\x00 \x04\x80\x00\x18\x1a\x80\x00\x07\xe1\x80\x00\x00\x00\ -\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x1f\ -\xff\xff\xe0\x07\xff\xff\xc7\xe3\xff\xff\x9f\xf9\xff\xff?\xfc\ -\xff\xfe\x7f\xfe\x7f\xfe\x7f\xfe\x7f\xfc\xff\xff?\xfc\xff\xff\ -?\xfc\xfc\x7f?\xfc\xfc\x7f\xff\xfc\xfc\x7f\xff\xfc\xff\xff\ -\xff\xfe\x7f\x80\x7f\xfe\x7f\xc0\x7f\xff?\xe0\x7f\xff\x9f\xf0\ -\x7f\xff\xc7\xe0\x7f\xff\xe0\x04\x7f\xff\xf8\x1e\x7f\xff\xff\xff\ -\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x80\x00\x00\x04@\ -\x00\x00\x08 \x00\x00\x02\x80\x00\x00\x22\x88\x00\x00B\x84\ -\x00\x00\x9e\xf2\x00\x01\x00\x01\x00\x00\x9e\xf2\x00\x00B\x84\ -\x00\x00\x22\x88\x00\x00\x02\x80\x00\x00\x08 \x00\x00\x04@\ -\x00\x00\x02\x80\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xfc\x7f\xff\xff\xf8?\ -\xff\xff\xf0\x1f\xff\xff\xfc\x7f\xff\xff\xdcw\xff\xff\x9cs\ -\xff\xff\x00\x01\xff\xfe\x00\x00\xff\xff\x00\x01\xff\xff\x9cs\ -\xff\xff\xdcw\xff\xff\xfc\x7f\xff\xff\xf0\x1f\xff\xff\xf8?\ -\xff\xff\xfc\x7f\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x04\x00\x06\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x03\xe0\x00\x00\x03\xe8\x00\x00\x03\xe0\x00\x00\x03\xe8\ -\x00\x00\x00\x08\x00\x00\x01\xf0\x00\x00\x0c\x00\x00\x00\x0c\x00\ -\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ -\x00\x1f\x00\x00\x00\x13@\x00\x00\x13@\x00\x00\x1f@\x00\ -\x00\x00@\x00\x00\x0f\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x0f\ -\xff\xff\xf8\x07\xff\xff\xf8\x03\xff\xff\xf8\x03\xff\xff\xf8\x03\ -\xff\xff\xf8\x03\xff\xff\xf0\x03\xff\xff\xe0\x03\xff\xff\xe1\xff\ -\xff\xff\x93\xff\xff\xff\x0f\xff\xff\xff\x0f\xff\xff\xc0\x1f\xff\ -\xff\xc0?\xff\xff\xc0\x1f\xff\xff\xc0\x1f\xff\xff\xc0\x1f\xff\ -\xff\xc0\x1f\xff\xff\xe0\x1f\xff\xff\xf0\x1f\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x01\x00\x01\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\ -\x00\x0e\x00\x00\x00\x0e\x00\x00\x00\x00\x80\x00\x00\x01@\x00\ -\x00\x00\xa0\x00\x00\x00P\x00\x00\x00(\x00\x00\x00\x14\x00\ -\x00\x00\x0a\x00\x00\x00\x05\x00\x00\x00\x02\x80\x00\x00\xc1\x00\ -\x00\x00\xc0\xe0\x00\x01\x80\xe0\x00\x01\x80\xe0\x00\x03\x00\x00\ -\x00#\x00\x00\x006\x00\x00\x00>\x00\x00\x00?\xc0\x00\ -\x00?\x80\x00\x00?\x00\x00\x00>\x00\x00\x00<\x00\x00\ -\x008\x00\x00\x000\x00\x00\x00 \x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf1\xff\xff\xff\xe0\xff\xff\ -\xff\xe0\xff\xff\xff\xe0\xff\xff\xff\xf0\x7f\xff\xff\xfe?\xff\ -\xff\xff\x1f\xff\xff\xff\x8f\xff\xff\xff\xc7\xff\xff\xff\xe3\xff\ -\xff\xff\xf1\xff\xff\xff\xf8\xff\xff\xff<\x7f\xff\xfe\x1e\x1f\ -\xff\xfe\x1e\x0f\xff\xfc>\x0f\xff\xbc>\x0f\xff\x98\x7f\x1f\ -\xff\x88\x7f\xff\xff\x80\xff\xff\xff\x80\x0f\xff\xff\x80\x1f\xff\ -\xff\x80?\xff\xff\x80\x7f\xff\xff\x80\xff\xff\xff\x81\xff\xff\ -\xff\x83\xff\xff\xff\x87\xff\xff\xff\x8f\xff\xff\xff\x9f\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x01\x00\x01\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\ -\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\ -\x00\x00\xc0\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\ -\x00#\x00\x00\x006\x00\x00\x00>\x00\x00\x00?\xc0\x00\ -\x00?\x80\x00\x00?\x00\x00\x00>\x00\x00\x00<\x00\x00\ -\x008\x00\x00\x000\x00\x00\x00 \x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\ -\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff?\xff\xff\xfe\x1f\xff\ -\xff\xfe\x1f\xff\xff\xfc?\xff\xff\xbc?\xff\xff\x98\x7f\xff\ -\xff\x88\x7f\xff\xff\x80\xff\xff\xff\x80\x0f\xff\xff\x80\x1f\xff\ -\xff\x80?\xff\xff\x80\x7f\xff\xff\x80\xff\xff\xff\x81\xff\xff\ -\xff\x83\xff\xff\xff\x87\xff\xff\xff\x8f\xff\xff\xff\x9f\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x00\xc9\ -\x00\ -\x00\x0c\xbex\x9cc``b`dPP`\x00\x83\ -\x15<\x0c\x0cb@Z\x03\x88AB\x0e@\xcc\xc8 \ -\x01\x91\xe4a\x18@`<\x93\x04D\xba\xe13\xff\xff\ -g\x98I4\x22\xd5\x0a\x88\xf9g\x88C\xa3\xe6\x8f\x9a\ -?\x10\xe6\x13\x8f\xc8\xcbb4\xcc\xbf\xc3\x0e\xfc\x07\x83\ -!j\xfe\xa8\xe31\xcd\xa4\xb5\xf9\x103i\x142\xff\ -Q\x01\xad\xcd\xa7\xbaE45\x1c\xab\xf9T4\x1c\xd3\ -|\xea\x1a\x8ef>\xd5\x0dG6\x9f\x16\x863\xd0\xa5\ -\xc0\xa1\x9d\xe1C\x1a\x80\xc2\xfd\x01\x83\xfd\xff\x03\x0c\xf2\ -\x041H\x1d\x18\x00\xa9\x7f\xf2\x10\xfc\x07\xc8\xde\x03\xc4\ -3\xea\xff\xff\xef\x00\xe2\x06\xa0t\x03?\x10\x03\xe5\x1a\ -\x80\xe2\x0dP\xb1F n\x06\xe2v \xee\x07\xe2\xf9\ -\xd0\x04\x05\x00\x85\x1b/\xe1\ -\x00\x00\x00\x5c\ -\x00\ -\x00\x01Fx\x9cc``b`dPP``\x10\ -`\xe0d0`d`\x10c``\xd0\x00b\xa0\x10\ -\x83\x03\x103\x02!\x0840 \x00\x13\x14\x83\xc0\xff\ -\xff\xff\x19\x06\x1a\xfc\x87\x81\x1f\xf2\xd4\xc7\x0d\x8c\xff\xff\ -\x1f`\xfe\xff\xff\x01\xfb\xff\xff\x1f\xf8!b\x7f\xec\xff\ -\xff\xffW\x0f\xb7\x16\x00\xb3\x96jC\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x07\x00\x18\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x01\xe0\x00\x00\x01\x10\x00\x00\x01\x08\x00\x00\x01\x04\x00\ -\x00\x00\x82\x00\x00\x00A\x00\x00\x00 \x80\x00\x00\x17@\ -\x00\x00\x0b\xac\x00\x00\x05\xd2\x00\x00\x02\xc2\x00\x00\x01\x02\ -\x00\x00\x00\x81\x00\x00\x01\x00\x80\x00\x01\x00@\x00\x00\xe0\ -@\x00\x00\x10@\x00\x00\x08\x80\x00\x00\x07\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xfe\x1f\xff\xff\xfe\x0f\xff\xff\xfe\x07\xff\xff\xfe\x03\xff\ -\xff\xff\x01\xff\xff\xff\x80\xff\xff\xff\xc0\x7f\xff\xff\xe0?\ -\xff\xff\xf0\x13\xff\xff\xf8\x01\xff\xff\xfc\x01\xff\xff\xfe\x01\ -\xff\xff\xff\x00\xff\xff\xfe\x00\x7f\xff\xfe\x00?\xff\xff\x00\ -?\xff\xff\xe0?\xff\xff\xf0\x7f\xff\xff\xf8\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x11\x00\x0d\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff?\xff\xff\xff\x1f\xff\ -\xff\xff\x8f\xff\xff\xff\xc4\x0f\xff\xff\xe1\xe7\xff\xff\xf3\xf3\ -\xff\xff\xe3\xf9\xff\xff\xef\xfd\xff\xff\xef\xfd\xff\xff\xef\xfd\ -\xff\xff\xef\xfd\xff\xff\xe7\xf9\xff\xff\xf3\xf3\xff\xff\xf9\xe7\ -\xff\xff\xfc\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x07\x00\x0e\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf8\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xf7\xff\xff\xff\xe7\xff\xff\xff\xe7\ -\xff\xff\xff\x0f\xff\xff\xfe\x7f\xff\xff\xfe\x7f\xff\xfe\xfe\xff\ -\xff\xff~\xff\xff\xfe \x01\xff\xff\x00\x01\xff\xfe0\x03\ -\xff\xff~\xff\xff\xfe\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x18\x00\x00\x00\x14\x00\x00\x00\x12\x00\x00\ -\x00\x11\xf8\x00\x00\x10\x08\x00\x00\x10\x10\x00\x00\x10 \x00\ -\x00\x10@\x00\x00\x10\x80\x00\x00\x11\x00\x00\x00\x12\x00\x00\ -\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xe7\xff\xff\xff\xe3\xff\xff\xff\xe1\xff\xff\ -\xff\xe0\x07\xff\xff\xe0\x07\xff\xff\xe0\x0f\xff\xff\xe0\x1f\xff\ -\xff\xe0?\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ -\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x10\x00\x08\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xf0\x00\x00\x07\xf0\ -\x00\x00\x0f\xf8\x00\x00\x1f\xf8\x00\x00\x1f\xfc\x00\x00?\xfc\ -\x00\x00w\xfc\x00\x00g\xfe\x00\x00\x07\xf6\x00\x00\x0d\xb6\ -\x00\x00\x0d\xb2\x00\x00\x19\xb0\x00\x00\x19\xb0\x00\x00\x01\x80\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xfc\x0f\xff\xff\xf8\x07\xff\xff\xf0\x07\ -\xff\xff\xe0\x03\xff\xff\xc0\x03\xff\xff\xc0\x01\xff\xff\x80\x01\ -\xff\xff\x00\x01\xff\xff\x00\x00\xff\xff\x90\x00\xff\xff\xe0\x00\ -\xff\xff\xe0\x00\xff\xff\xc0\x05\xff\xff\xc0\x07\xff\xff\xe4\x0f\ -\xff\xff\xfe\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0a\x00\ -\x00\x00\x11\x00\x00\x00*\x80\x00\x18[@\x00\x14\x80 \ -\x00\x12[@\x00\x11\xea\x80\x00\x10\x11\x00\x00\x10*\x00\ -\x00\x10D\x00\x00\x10\x80\x00\x00\x11\x00\x00\x00\x12\x00\x00\ -\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff\xf1\xff\ -\xff\xff\xe0\xff\xff\xff\xd1\x7f\xff\xe7\x80?\xff\xe3\x00\x1f\ -\xff\xe1\x80?\xff\xe0\x11\x7f\xff\xe0\x00\xff\xff\xe0\x11\xff\ -\xff\xe0;\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ -\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00?\xff\x80\x00!\x00\x80\x00!*\x80\x00!T\ -\x80\x00!*\x80\x00!T\x80\x00!*\x80\x00!T\ -\x80\x00!\x00\x80\x00!\xfe\x80\x00 \x00\x80\x00 \x00\ -\x80\x00 \x00\x80\x00 \x00\x80\x00?\xff\x80\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xc0\x00\x7f\xff\xc0\x00\x7f\xff\xce\x00\x7f\xff\xce\x00\ -\x7f\xff\xce\x00\x7f\xff\xce\x00\x7f\xff\xce\x00\x7f\xff\xce\x00\ -\x7f\xff\xce\x00\x7f\xff\xce\x00\x7f\xff\xcf\xfe\x7f\xff\xcf\xfe\ -\x7f\xff\xcf\xfe\x7f\xff\xc0\x00\x7f\xff\xc0\x00\x7f\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x14\x00\x00\ -\x00\x12\x00\x00\x00\x15\xf0\x00\x00\x16\x10\x00\x00\x17\xa0\x00\ -\x00\x17@\x00\x00\x16\x80\x00\x00\x15\x00\x00\x00\x12\x00\x00\ -\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xff\xff\xff\xe3\xff\xff\ -\xff\xe1\xff\xff\xff\xe0\x0f\xff\xff\xe0\x0f\xff\xff\xe0\x1f\xff\ -\xff\xe0?\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ -\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x06\x00\x06\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x01\xfe\x00\x00\x01\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\x00\x03\x00\ -\x00\x00\x06\x00\x00\x00F\x00\x00\x00l\x00\x00\x00|\x00\ -\x00\x00\x7f\x80\x00\x00\x7f\x00\x00\x00~\x00\x00\x00|\x00\ -\x00\x00x\x00\x00\x00p\x00\x00?\xe0\x00\x00 \x00\ -\x00 \x00\x00 \x00\x00 \x00\x00 \x00\ -\x00 \x00\x00 \x00\x00?\xe0\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xfe\x01\xff\xff\xfe\x01\xff\xff\xff\xff\xff\xff\xff\xfe\x7f\ -\xff\xff\xfc?\xff\xff\xfc?\xff\xff\xf8\x7f\xff\xffx\x7f\ -\xff\xff0\xff\xff\xff\x10\xff\xff\xff\x01\xff\xff\xff\x00\x1f\ -\xff\xff\x00?\xff\xff\x00\x7f\xff\xff\x00\xff\xff\xff\x01\xff\ -\xff\xff\x03\xff\xff\x80\x07\xff\xff\x80\x0f\xff\xff\x9f\xcf\xff\ -\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\ -\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x80\x0f\xff\xff\x80\x0f\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x0b\x00\x09\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x18\ -\x00\x00\x000\x00\x00\x000\x00\x00\x00`\x00\x00\x04`\ -\x00\x00\x06\xc0\x00\x00\x07\xc0\x00\x00\x07\xf8\x00\x00\x07\xf0\ -\x00\x00\x07\xe0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x01\xff\x00\ -\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\ -\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\xff\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xe7\xff\xff\xff\xc3\xff\xff\xff\xc3\ -\xff\xff\xff\x87\xff\xff\xf7\x87\xff\xff\xf3\x0f\xff\xff\xf1\x0f\ -\xff\xff\xf0\x1f\xff\xff\xf0\x01\xff\xff\xf0\x03\xff\xff\xf0\x07\ -\xff\xff\xf0\x0f\xff\xff\xf0\x1f\xff\xfc\x00?\xff\xfc\x00\x7f\ -\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\ -\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\x00\x7f\ -\xff\xfc\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x00V\ -\x00\ -\x00\x01Fx\x9c\xc5\xc8\xb1\x0d\x800\x0cD\xd1\xef4\ -\x88\x0a*\xda\xa4\xa4d\x03\xd8\xcc\x8c\x9c\x0d\xccE\x8a\ -D\x01\x15\x0d\xdfz\xb2t\x900J\x81\x99\x91\xcd`\ -\x01V\xd1\xc4!\xa6k\x9d\xdc\xa5\xae\x15\x11\xfc]<\ -s\xd9+d\x99d\xe8?W\xd7\xee\xe1\x12_\xbcu\ -\x01\xec\xfbi\xe6\ -\x00\x00\x01F\ -\x00\ -\x00\x02\x00\x01\x00 \x00\x00\x10\x00\x11\x000\x01\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ -\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ -\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfc\x1f\xc0\x00\x04\x10\ -\x00\x00\x04\x10\x00\x00\x04\x10\x00\x00\x04\x10\x00\x00\x04\x10\ -\x00\x00\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\xfc\x01\xc0\x1f\xfc\x01\xc0\x1f\xfc\x01\xc0\ -\x1f\xff\xf1\xc7\xff\xff\xf1\xc7\xff\xff\xf1\xc7\xff\xff\xf0\x07\ -\xff\xff\xf0\x07\xff\xff\xf0\x07\xff\xff\xff\x7f\xff\xff\xfe?\ -\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xfe?\ -\xff\xff\xff\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ -\xff\xff\xff\xff\xff\ -\x00\x00\x00\xef\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\ -\x01\xc7o\xa8d\x00\x00\x00\x18tEXtSof\ -tware\x00paint.net \ -4.0.6\xfc\x8cc\xdf\x00\x00\x00mIDA\ -T8O\xb5\x8c\xd1\x0a\xc0 \x0c\x03\xfdt\xff\xbc\xb3\ -\x83d]\xa8\xd82\xf6p\xa2\xc7\x99af\x9fHe\ -\x87\xe7\xb2\xae\x15\xd0\xf3\xdf}Htb\xce\xb9\xbe\xc9\ -\x80\xcb\x0a\xdb\x01\x88\x13\xff\x0d\xec@\x08\xdc\xa5\x03.\ -\x15\x8dc\xcb7$DD\xe3\xccQBD4\xce\x1c\ -%DD\xe3\xccQBD4\xce\x1ce\x07|\xe6\x80\ -\xe3\xab\x15\xd0\x83\xd7\xa3\x8f\x8d\x0b\xd1.k\xedV\x14\ -\x8b0\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xd0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00\x09pHYs\x00\x00\x0e\xc2\x00\x00\x0e\xc2\ -\x01\x15(J\x80\x00\x00\x00\x18tEXtSof\ -tware\x00paint.net \ -4.0.6\xfc\x8cc\xdf\x00\x00\x00NIDA\ -T8O\xdd\x8c\xc1\x09\x00 \x0c\x03\xbb\xffT\xdd\xac\ -\x1a\xb0\x82\xb6*U\x10\xf4q\x8f\x5cBHD\x8ep\ -e\x04+\xb2\x02+\xa7XQ\xc6\xcc\x9c\xe3\xd8\xd5\xce\ -\x88\x7f\x0e<\xee\x1e`\xacl\x1f\xcc\x5c\xed\x8cx\xff\ -\x00`\xd8\x8f=\x07\x9a\x10G(\x01oN\x98?\xf6\ -\xff\xda\xc5\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xd4\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00\x09pHYs\x00\x00\x0e\xc2\x00\x00\x0e\xc2\ -\x01\x15(J\x80\x00\x00\x00\x18tEXtSof\ -tware\x00paint.net \ -4.0.6\xfc\x8cc\xdf\x00\x00\x00RIDA\ -T8O\xed\x8fA\x0a\xc00\x08\x04}\xba?\xb7\xce\ -a/a\xa1m\xbc\xe4\x90\xc0\x043\xd1\x05\xa3\xaaF\ -X\xf9\x07+\xa1\x0fW\x97\xfe_X\x09\x0a\xc8\xcc~\ -\xfa\x1e\xb0R0<\x0a\xf8\x82\x95\xa0\x15V\xbfb%\ -(`{\x85\x1bpB\x000<\x0ax\xa7\xe2\x01V\ -T\xcf_\x16\xfbf\x81\x00\x00\x00\x00IEND\xae\ -B`\x82\ -\x00\x00\x03\xea\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x93\x00\x00\x00\x15\x08\x06\x00\x00\x00B\x0c\xdc\xd0\ -\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ -\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ -\x09pHYs\x00\x00\x0b\x11\x00\x00\x0b\x11\x01\x7fd\ -_\x91\x00\x00\x03\x7fIDAThC\xed\x9a\xbbN\ -*Q\x14\x86\x07Cb,\xec}#\x1e\x81\xc6\xca\xbb\ -!\xbe\x81\x8d\x8d\x8d%\x0d=Zig\xb4\xd0\xc4H\ -c(H,\x88\x85Zx\x04\x04\x01\xaf\xf1\x0e\xe2\x92\ -o\x9d\xb3\xf7\x19\x07\xf4\xe4h5\xb0\xff\xe4\x97q\xad\ -=4|\xf9\xf7\x9a\x0d^,\x16\x93n\x9e\x9e\x9e\x96\ -\xa9\xa9)\x99\x9c\x9ctvV\xc3\x03\x5ct\xe3\x05w\ -\xc0\xb4\xbe\xbe.\xa7\xa7\xbf\xda>\x95\xf3\xf3s\xb9\xb8\ -\xb8\x90\xeb\xebk\xb9\xb9\xb9q\xeeS\xf3\xf9\xc3\x01<\ -\xc0\x05|\x04\xb9\xc1\x16& :;;\x93B\xa1 \ -\xb5ZMnoo\xe5\xe1\xe1A\x9e\x9f\x9f\xa5\xd1h\ -8\xf7\xb9\xe1\x00\x1e\xe0\x02>\xe0\x04f:`\xa2X\ -n\x83T*\x95\x94\xc2\xc7\xc7G}\x83V\xab%o\ -ooj\xa7\xfe\x95a\x00\x1e\xe0\x02>\xe0\x04^\x08\ - \x0b\x13 U\xabU-\x12i\x10\xf8\xfa\xfa\xea\x00\ -\xeaS\xb1\x9d\xe5\xf3y\xc9d2\xb2\xb9\xb9\xa9\xde\xdd\ -\xdd\xd5\x1a=\xbf\xe0\x05nLB)L\x14 \x0d\x90\ -\xa0\x0f\x98\x9a\xcd\xa6\xec\xec\xec\xc8\xd2\xd2\x92\x0e^\x98\ -kj\xf4\x9czO\xc7\xc7\xc7\xb2\xbd\xbd\xadpt3\ -=\xd6\x98\xa0\x81\x17\xb81@y\xa4\x12{ \xd1e\ -\x12\x09XVVV$\x1e\x8fw5=\xd6\xb8\xf4\xea\ -\x1d\x01\xc9\xc6\xc6F\x07@A\xb3\x86\xb5\xb0\x82\xe1\x06\ -~\xe8y\x95JE\x87*\xf6B\xe0\xc0\x10\x0843\ -33\xb2\xba\xba*\xc5bQ\xcd55z\xac\xe1\xcd\ -\x9c\xc2/\xb6/\x7f\x22\xed\xed\xed\xd9\xebn5\xd6r\ -\x0f\xac\xc0\x0d\xfcP\xd7dbJg{C,X\x5c\ -\x5cT`\x80'(j\xf4XC\xcc\xb9t\x0a\xbf\x98\ -\x87\xfc\xd0\xa0\xc3\xc3C[\xe3\x1a\xf9\x81\xe2\x1e\x047\ -\xf0C\xcd\x830?\x144'&&\x14\x18\xd2((\ -j\xf4Xs\x7f\x7f\xef`\xea\x011`\x1bH\xb0\x81\ -\x87W\xff\xb5\x7f\x0d\xf7 >\x7f\xf8\xa1\xe6]^^\ -\xca\xcb\xcb\xcb\x07\x98\xc6\xc7\xc7\xff\x09\x13k\x887\xa7\ -\xf0\x8b'6?(\xd8@\x84\x82 a\xeeAp\x03\ -?\xd4<\xa6q3/!`ZXXP`\xbe\xda\ -\xe6X\x03Lf{t\x0a\xaf~\x0a\x13\xfcP\xf3\xae\ -\xae\xae:\x92\xc9\x00\xf3\xd5\x00\x9eN\xa7\xe5\xee\xee\xce\ -\xde\xe7\x14^}g\x9b\xe3\x1c\x0a}H&\xb69\xff\ -\xcc\xc4+\xe7\x06\xc9dR\xa1\xf9\xcc\x89DBO@\ -]2\x85_?\x19\xc0\xe1\xc5\xceL\x0c\xe0L\xe3\x9e\ -\xe7\xd9&\x89srr\x22\xcb\xcb\xcb2??/c\ -ccj\xaeS\xa9\x94M\xa7\xb9\xb99==7 \ -:\x85S\xdf=\x1a@\x84\x89}\x9ac\x9b\xe3X\x1c\ -\x98\x0cP\x9c\x1f\x01T\xb9\x5c\xd6\x03\xaa\x83\x83\x03\xf5\ -\xd1\xd1\x91\xfe\x9f\xcdfevv\xd6\x02\xc5\xa1\x95S\ -\xb8\xf5\xdf\x87\x96\xad\xdfg\x92\xccK\xf0CO\xe9!\ -\xa6\x86\x86\x86d``@\xd6\xd6\xd6\xf4\xcd\x01\x8a:\ -\x8f\xff\x0c\xda\x18\xc00i\x94\xcb\xe5\x14\xa8\xd1\xd1Q\ -\x85\xcb)\xfc\x02\x12\x7fB\x05M\xcf\x80\x84`\xc4\xa4\ -\x92\xfd\xd5\x00\xc0\x0c\x0e\x0e\xdat\x1a\x19\x19\xd1\xc5\x9f\ -\x09\x22\xeb\xf5\xba\xec\xef\xef\xcb\xd6\xd6\x96\x90nN\xbd\ -!\xb6/\xe6!\x86r\x9e\xd8\xb0\xf9\xa2\xb7\xde\xee5\ -\x9a\x7fgd3+\xd9_\x0d\xf0\x07\x0d\x0f\x0fK$\ -\x12\x91h4\xaa\xaff\xcb\xfbLL\xf0\xc4\x1b =\ -==\xfd\xa9:\xf5\xba\x08\x12\x12\x89\xcf\xdc\x0f\x92\x85\ -\x09\xd3\xe0\xcc\xa9V\xab* \xec\x85\x0cW\xdc\xec\x06\ -\xec\xfe\x96a\x00\x1e\xe0\x82Q'\x08\x12\xb609;\ -\xff\xcc1y\x07P\x7f\x17\xd6Q\x02K\x02\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x01\xbb\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc9V%\x04\ -\x00\x00\x01\x82IDAT(\x91\x8d\xd2O\x88\x8eQ\ -\x14\x06\xf0\xdf7\xf3\xa6Qc#\xb1\x9b\xbe\xc6\xd0,\ -,&\x1dM\x8aI\xa9Ql\xecg\xa1H2J\xb3\ -\xb2\xb4\xc5\xdeJ\x91\xb5\xa6\xc8\xbf\xa5P\x16rD\xb1\ -\xa0\x11\x92\x92\x05if\xc1\xa4)\x8b\xf7}\xa7\xfb}\ ->\xe5Y\x9d{\xcf}\xce9\xf7yN\xc7\x7f 3\ -Gq\x0a\xdb#b\xbe\xbd\xaf\x9a\xe4\x16\x8c\x16\xefW\ -\x22\xe2[fV8\x8e1\x5c\xc1\x91\xa2\xe0H\xa7\x09\ -\xf6a\x02\xd3x\x8aw\x98\xc5\x14~c\xa5(<\x8c\ -M\xd8\xda)*m\xc0\x09\x1c\xc5$\xae\xe3E\xdf\x0f\ -f\xf0\x18\x9b\xf1\xbd\xca\xcc\xcb\xf8\x899\xbc\xc7%\xdc\ -\xc78\xe6\xf1*\x22\xae5\x0d\xba\x11q+3\xbb\x98\ -\x1a\xc2g,#\xb0\x18\x11w\x22b\x0d\x8bX\xc0\xd5\ -\xcc<4H\xc8*\x22.\x16\xa3\x97\xb9\xc9\x22\xde\x9f\ -\x99\x0f0\x91\x99\xc3\xed\xe5\xd0\xa0\x8a\x0d\xde\x16\xf1K\ -\xdcS\x0b\xfa\x05\xc7z\xc8\x99\xb9\x13\x072s.3\ -\xf7\xe2\x1c\x96p\x13\x9fp7\x22\xf6\xe0\xb4\xda\xb2\x91\ -\xaa\xa8\xbe\x80\x8f8\x8b\xdd\xf8\x85\x0b\xb8\x81\xd5\xa6\xc1\ -\x13\xb5\xa5\xb7\xf1\xbc\x1c\xfb\x07\xb6E\xc446\xe2\x0d\ -\x0e\xab}\xff\x80nC\x9a\x8d\x88\x93\x11\xb1T\xfa\xbc\ -\xabI\xee\x88\x88\xb5\xcc\x9c\xc1\xa36\xdd\x8c\xdc\x83\xf5\ -\xce\x11\xf1\x1a\xcb\x8dM\x1aqZ\x8c\xf7\x13\xfb\x05\x1b\ -S/I\x8b\xce?\xe2\xbf\xc9\xf8\x8a3\xc5\xf9Y\x11\ -\xf7,@\x8bu\xb5#bU\xeda\x8b\x87\xea-;\ -\x88\xf3\x83\xc8\x7f\x00k\xb9|\xe7dF#\x7f\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\x01\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x12\x08\x06\x00\x00\x00\x84\x9e\x84\x0f\ -\x00\x00\x00\xc8IDAT8\x8d\xa5\xd3=N\x031\ -\x10\x86\xe1gQ\x02]\xe8R\xf3\x97\x0e\xaa\xbd\x12E\ -.\x10J\x84\xc4=\xd2%\x12\x15\x11\xe7\xd8\x8d\x10\xa2\ -\xe5 H\x88M\x11G\xdaX\xded1_7\xdf\xe8\ -\x9d\xf1\x8c\xed\xa2i\x1am\xd5u-\xd2\x19\xbec\xb3\ -,K'\xb1\x99\xd0\x03\xceS\x89>\xf0\x04W\xb9\xf0\ -\xf5\x7f\xe0\x9b\x5cx\x841.s\xe0]\xc7,x\x12\ -\x15\xd9\xd3\xa0\x03\xba\xc3\x10\xb7!\xbe@i;\xffJ\ -\xb8\xf7.x\x88\x0aE\x88OC\xfc\x8a\x97c\xc7^\ -\xe3-\xf2~\xf1\xd86\x0e\xcd\xfc\x84\xf6\xdb]\xe2\xb3\ -/\xfcn;\x1f\xfc\x84b{:\xb6\xed]\xf79\xbe\ -\xfe\x0a\x7f`\x81\xe7T\xb2k\xdbm\xddK|I(\ -\xaa\xaa\xea\xc1\xa75\xc0\x14\xb3\x1cx\x03\xb2\x99!K\ -\xef\xfb\x80\xb9\x00\x00\x00\x00IEND\xaeB`\x82\ -\ -\x00\x00\x02\x1e\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x18\x00\x00\x00\x11\x08\x06\x00\x00\x00\xc7xl0\ -\x00\x00\x01\xe5IDAT8\x8d\x95\xd4]h\x8ea\ -\x18\x07\xf0\xdflIQC\xf2q\x22\x8a\x92\xe2\xd8G\ -!\x0e\x97\x16j\x07D\x88\x94R\xcb\xe7\xa2\x9c\x8d\x92\ -\x906\x16K\xf9\x96!\xc7\xac\xa4\x90\x83\xb7)\x07r\ -\x22\x12\xcd\xc1\x88%\x8b\xf9:\xb8\xafw\xef\xd3\xb3g\ -\xeb\xdd\xbf\x9e\xee\xfb\xbe\xee\xeb\xb9\xfe\xd7\xe7]S*\ -\x95\xea\xf1\xd5pl\xc2\x0d\x5c\xc7\xc6\xdc\xddy\xec.\ -\xf8g\x18\xc6\xe1\x07\x9a\xb0\x03\xbf\xf0\x1d\x9b\xf1$t\ -\xce\xe2p\xec\xbbC\xb7\xb3\x1a\xe3P\x87At\xc5y\ -:\x8ea1\xae\x85\xac\x84\xd3\xf8\x8c-\xe8\xad\xd6x\ -9\x82,N\xe0\x19\xf6bY\xc8Z\xb0\x14\xbb\xc6j\ -\xbc\x88\xe0Ox9\x80\xcbX\x81\xa3\xb8\x82\xbb\x19\xbd\ -\x16\xfc\xcb}\x0dq\xf72+\xcf\x13\xc0\x1b\xec\xc3<\ -<\x0c\xaf\xf7\xe4t\xeeK\xb5x\x1f\xe7\xfd\xe8\xc9\xec\ -\xbbc\xdf^D\x00\x17\xc3\x93\xf1hC\x7f\xee\xfe\xb5\ -T\xb7\x8e8ORI\xdf\x03\xcc\xc0_\xb4\x8eD\xb0\ -\x06\x8bB\xe9\x10f\x8e\xe2\xc8\x00\xb6\xaa\xa4{v\xfc\ -\xfb\x14\xbdE\x04\xf5\xb8\x84W\xd2,L\x93\xda\xb2\xa6\ -@\xb7\x0f71\x07\xabC\xb66\xd6;\x0c/2\x9c\ -\xc1\xac\xf0\xea\x96T\xe0\x06\xec\x1c!\x8a\xb6X\xb7\xc5\ -\xbaN\x8a\xbc\xab\x88\xa01\x0c\x1f\x97\xfa\x1f\x9a\xf1\x01\ -\xa7\xa4\xc2\xe7\xf1\x02\x8f\xb1\x1e\xf3\xb1J\xa4\xa7LP\ -\x8b)\x11f\x87T\xc0\xf6\x90\xc3O\x1c\xc4D\x5c\xc5\ -TL\xce\x91\x9c\xc3\x04)-\xb5\xb1*\x13,\xc4\x17\ -\xbc\x95\x8a\xb9\x00\x9fB\x0e'\xa57\x09\x96H\x13\xfd\ -.Gp\x0f\xad\x98+\xa5ghf\xea\xa4^n*\ -\x08\xbd\xdc\xe3\x9dx\x94\xbb\x1b\xcc\x9d\x7f\xe36\x8eH\ -3\xf01K\xf0M\xe5-*B\x8f\xca\x10\xe5\xb1]\ -\xea\xb6\xe78\x10\xb2\x0bY\x85\xbaQ\x0cW\x83f)\ -\xbd}\xd8 \xbd\xc0\xd9'\xa5\xb0M\xc7\x82~\xac\xc4\ -r)\x95\x8dR\x0d\x86\xf0\x1f\x84\xf8v\x1d=\x86M\ -P\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01p\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x12\x00\x00\x00\x12\x08\x06\x00\x00\x00V\xce\x8eW\ -\x00\x00\x017IDAT8\x8d\x9d\x93\xc1J\xc3@\ -\x14EO\xa2\xa0\xa0\xa2\x05\x11\xba\xf3#\xde\xd2\x8d\xf4\ -\x1b\xc4\x1fp'\x88\xa0\x82Pp\xa3\xa2;\xc5\x95\xee\ -\x14\x7f\xe7\x82\x1f\xe1\xc6\x8d\xa4P\xb5\x9a\xb4\xd5E_\ -a\x88IF\xbc0d\xde\xcd\xc9\x9d7a\x06\x22\x92\ -\xb4#i/\xc6\xcd\xc6\x00\xe0\x02\x98\x01n\x9a\xa04\ -\xd6\x0d\xb0\x0a\xb4|\xfe\xbf \xef\xa6j\xfe\xf7 I\ -\x9d\xa0\xfc\x06\x0aI\x9b\x91\x85\xeb%i \xe9#\xc6\ -\xfd\xeaH\xd2v\xc9\xfa\xf4\x112\x07\x92\xe6+\x83$\ -\xedK\xca\x80\xdbR\xd0\x08(J\xde!\xd0\x93t)\ -)\x05H$\xed\x02g\xc0J\x00\x0e\x81\xdcC\x16\x99\ -\xfc\xa3w&\xc7`\xce\x9fS\xbd\x01\xdd\x14x\x02^\ -K+\x0e\x80\x9e\x8f\xb1\x07\xf5\xdd\xcf\xbd\x9e\xea\x0b\xc8\ -\x92`k\x1d\xe0\x0eh\x9b\xd9B\xe0g@afk\ -\x81\xf7\x0c,\x03'fvM\x95$m\x94\xea\xbe\x87\ -\x85\xdeV\xe5\xc7M\x92\x94K\x1a\xc4\xb8\xa4\xee\x85_\ -\x89.\xb0\xee\xd6\x0bplf\x0fU|\xd3\x15\xb9\x07\ -\xdaA\xbd\x04<\xd6\xc1\xb5Af6\x04\xae\x02\xeb\xd4\ -\xcc\xc6u|\xed\xd6\x00\xfc\xb0\xf5\x81\xdc\xccZMl\ -\xe3\xed\xf7\x0e\xce\x81\xa3&\x0e\xe0\x07\x81\x1e\x7f\x14\x8c\ -;\xe7\x95\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01{\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x12\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1b\x06/\x5c\ -\x00\x00\x01BIDAT8\x8d\x95\xd3?K\xdbQ\ -\x14\xc6\xf1OB\xaa\x9bb\xfd\xb3IQ\xc8(\x08\x97\ -:\x1b\xa8\x9d\x5c\xb5\xd0\xcdEqt\x93\x80\xef\xa0o\ -\xa0N.\x0e\xba\xd61\x10p\x90\x0a\xbf\x0cm\x17\xb3\ -\xb8\xb8H\x15u\x8a\xa0`\x1c\xe2\ -\x06\x15\x9c`$\xa5t\x05\xc5\x1c\x90\x11\xccD^\xc6\ -%\xfe\xbf\x1e\x96r\x80\x86P\xc5'\x1c\xe3\x0b4\x1a\ -\x8d:\x96\xf3\x80\xae\x03\x92\xd0\x88\x05\x8b8(\x0c\xd8\ -\xa3\x02\xbec\x12-L\x04T\x00k\xfd*\xaa\xa0\x1e\ -y\x1b\xfb]\xe0RJmz7{\x12\x9b\x91\x0f\xf5\ -\xf0\xb4c\xe9\x07\x1aG\x0d\x19\xf6\xfa\xc0\xde\xa2\xdb\xd5\ -fq\x869/\x8d-\xe1a\x10\xd02\x8eB\x7f\xc0\ -\x1a\xa6p\x8b\x0d\x0c\xe3g\x9c\xef\xe8\x98\x9d\xce(\xe2\ -\x17\x96B?\x06d=*\xdb\xc5\xbf\xd0\xeb\x98\xeeU\ -Q!\xcb\xb2\xc3\xc8\x7fx\x9f\x93Y\x5c\xe07F\xf1\ -5<\xb5\xa8\xf4/\x9a\xb17\x81\xfb\x12Vc#\x0b\ -\xc8\x06\xb6\xb1\x82C\xfc\xc1|\x17O\x13\x0b8E9\ -\xcf_\xeb\x16\xafC\xa9\xe8}\x1e\xb60\x86\xcf\xa1\xbf\ -\x85\xae\x0e\xe09\xef|\xfe\x16\xee\xf0\x14\xfa)t\xab\ -\x9f'\xa5t\x07\xcf)mR\xad\xb7y\x8e\x81\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x02,\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x11\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf01\x94_\ -\x00\x00\x01\xf3IDAT8\x8de\xd3K\x88\x8fa\ -\x14\x06\xf0\xdf\x7f\xfc\x95\xb0@\x22\x9a\x92{\xe4\x9aS\ -\x9a\x85\xb2\x125R\xee\xa5L)\x16\xa6\x90\x8d\xb2D\ -\x12Rl$\xc9(I.Qr\xbf\xaf\xa4\x8e\x14\xd1\ -\xe4R\xc8\x06\xc9%\xb7$,\xbeW}\x8dSo_\ -o\xe7;\xcf\xfb<\xe79\xa7\xa1Gd\xe6h\xac\xc1\ -\x1c\x8c\xc1\x1f\xf4\xc2C\x9c\xc6\xc1\x88\xf8X\xafi\xa9\ -\x15\xf7\xce\xcc\x9d\xb8\x83N\xbc\xc5R\xdcB_\x1c\xc5\ -(<\xcd\xcc5u\x90F\x01\xe8\x8bs\xf8\x8c\x09\x18\ -_\xf2kq\x11\x0b1\xb5\xb0\x9a\x82\xa18\x1b\x11\x9d\ -u&\xc70\x02W\xf1\x18\xaf\xb0>\x22\xf6G\xc4\x0b\ -\xfc\xc4Jt`:V\xa0-3;\xa1\x91\x99m\xb8\ -\x81O\x18\x19\x11\xdf3s\x11N\xe15\x9e\xe1:\x96\ -a\x12\xeeEDd\xe6\xf4\x22\xbd\xb5\x05\xdb\xd1\x07;\ -\x22\xe2{a\xb6\xa4|[1\x1bG#br\x91z\ -937`0\xbebs#3_c\x0b\xc6\xe1\x01\ -\xba\x0b\xb3~\x05\xa8;\x22&\xd4\x0c8\x8b\x05\xe5z\ -\x18\x93\x9a\x18\x80\x13\xf8P\x12\xcf0\x11\xf3\xcay\x92\ -\x99\xcd\x88\xf8\xe5\xff8\x8e\xad\xcdri\xd6\x12\x8f\x22\ -\xe2\x15\x0e\xe0@fvcca\xfc\x02\x17\xf0\xa3<\ -\xf4\x05?Z\xf0\x06]\xd8\x8d\x9b\xb8_\xa3>Ye\ -w/\x95{\xad\xd8\x13\x11\xcb\xb1\x17\x97\xf0\xb1Y\xa4\ -tFD{)\xec\xca\xcc{8\x89\x81=\xe8o\xab\ -\xc9Z\xa22\xe4H#3\x87\xe0)fFDwf\ -v\xa9\xe6\x01\x16\xe16\xc6b\xbe\xaa\xd9\x0f\xf0\x5c5\ -\x9c\xdf0\xbc%\x22\xdeb\x03\xceg\xe6*\xf4\xae\xbd\ -\x9c\x11\xf1^5|\xab\xb1\x1e\x87\xd0^\xfa\xd2\x1e\x11\ -\xbf\x1b5\xfd\xeb\xb0\x09g\xb0\x0b\x8b1\xab\xa4\xaf\x14\ -\x80q\xb8[\xfa\xd3\x11\x11W\xa8-`D\xec+\xf4\ -g\xa8\xf6%0\x0c\xfd\x8b\x0b\xd7\xf0\xae\xb0j\xfb\x07\ -@Y\xc0\x9e\x91\x99\xd30W\xb5\xb5\x83J\xf1C\x9c\ -\x8f\x88\x97=\xff\xff\x0b\x84C\xb2\xa8\xaa\xc4\xf2\x0e\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x00\xee\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0a\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x907\xff\x05\ -\x00\x00\x00\xb5IDAT(\x91}\xd0\xa1\x8aBQ\ -\x14\x85\xe1O\xb9\xcdd\x9b\xeek\x08\xbe\xc7X\x0c:\ -\x08\xfa V\x1f@\xb1h1\xcc4\xc1l\xbc0\xc1\ -7\x10\x83ED\xc3\x14\x83\x96s`s\xb9\xcc\x82\x13\ -\xf6f\xb1\xfe\xb5O\xa3,\xcbO\xac\xfd\xafY\x11\x86\ -\x01\xfe\xc2\xdc\xc0\x1c\x1f8F\xe3\x0f\xeea\x9e&\xd3\ -\x0e\x9b&N\xd8\xe2\x19L\x1d\xccp\xc3\x17\x148\xa4\ -\x17\x91\x0b\xb4R\xea\x19\x9a5\xc5'\xe8%\xe4*/\ -\xab\xc6\x8c\xbcgdV<&\x22\x87\x19Y\x97\x98\x91\ -{,\xab}rbF>0\xc2+x\xc6\xb8\x145\ -\xc8S%\xac/}\xf88!\x0f\xf8F\xbb\x8eZ\xa0\ -\x9b\x16]\x5c\xab\xdd\x92~\xdf\xc4\xcd&:\xc3\xef\xf7\ -E\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x015\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ -\x00\x00\x00\xfcIDAT(\x91\x95\xd0\xcf*D\x01\ -\x14\xc7\xf1\xcf\xcc\xcaB<\x06YX\x9d\xe6\x09\x94\x12\ -SJ\x9a\x97\xb0'\x8bY\xc8+XY\x121\xfe\x16\ -\x1b;ew\x1e@\xd9YX\xb0A\xd9\x10c\xe1\xca\ -\xedv\xa7\xc6os:\xe7\xf4\xfd\xfdN\xa7\x91\x99\xab\ -\xf8\xc0aD\xdc\xfb\x87\x1a\x99\xd9\xc1\x1e\xfa\xb8\xc1\x01\ -\x8e\x22\xe2a\x18x\x14O\x18)\xcd\xfb\xb8\xc6>\x8e\ -#\xe2\xb1\x16\x86\xcc\x06Z\xa5\xb1W#\xc4HW\x92\xccZ\xcf5\x97\ -i|8\xb0\x14h\x0e\xcc\x06^\x06\xb6\x03#\xf0~\ -\xfdU\xf5@aq\xa2\x8d\xf7\xfe\x00p\x13\xf0\xb8\xb3\ -\xe6\x9bx(\x80M\xc0 `\x82\xb3f\xd1U\xf1\x80\ -\xf7\xfe-\xa0-0/e\x1c\xc0Y\x03\x88\x22\xe0_\ -`Faq\x22+}M:@\xfc\xca\xf1\xc0?\xc0\ -{\x99\xeb\xce&\x0f\x03K\x80N\xde\xfb\xe7\xb3\xd1\xd9\ -`\x08\xa4\xd2\x03\x08q\xed\x07\xb4\x8f\x06\x0f\x03'\x80\ -\xe1\xc02g\xcd\xd8K\xec\xed\x05T\x02\xbb\x81\xbd@\ -\x0f\xa0\x03p\x168\x00\xac\x13B\xcc+\x8b\x89*\x00\ -\x0a\x8b'u\xf6\xbe\xee\x1d\xe0]g\xcda\xa9t\x0d\ -!\xc1\xceE\xa37\x12J-E\xe7\x81\xcd\xc0\xa7 \ -\x968\x9bD*\xdd\x1f(\x06F\xc6C\xa7>\xae6\ -\xeah\x09\xb4\x89\xbc\xfd\xc0@g\xcd\xef1\x04~p\ -\xfc\xe2\x1f\xa5\xd2}\x9d5-\x80\x02\xef}\x0bg\xcd\ -\xad\xce\x9a\x9b\xbd\xf7\xad\x81\x83@\x0d\xb0\x03x\x04X\ -\x0c\xbeZ*\xbd\x03\xd8\x0a\xbc\x12\xc3\xba?\x1a\x1a\xeb\ -\xaci\xee\xac\xe9\xec\xaci\x8b\x10]\x81R\xe0.`\ -Qz\x0e\x5c\x1b\xc7N\xc0\xf7R\xe9!\xce\x9a/W\ -\x94.\xb8\x18+!N\x01]\x81]\xce\x9a<`*\ -\xe0\x09\xd5\x90\x1b\xc5*\x81{\x81\xe9q\xde\xa5^\x8e\ -\x94$\x8f8k\x14\xf0\x0bP \x95n0\x09o\x00\ -\xd6I\xa5'\xd4K\x16!\xee\x8f\x07>-\x95\xdeD\ -\xa8\x7f\x80\x95\xc0\x9b\xc01\xa07\xb0\x0f\x18\x10\xd7z\ -]\x22\xf7\x0e\x03\xcd\x80\x8e\x97\xaa\x82k\x80\x85R\xe9\ -\x0fR\x0c\xef\xfd\x9d\xf1\xef@B\xad\x7f\x0d\xf4u\xd6\ -\x8cv\xd6\xcc\x11B\xdc\x02L\x8b\x8au\x94\xed\x9e\xa9\ -8\x96g?\xa0\xcaYs\xbc\xb12|C*\xbd\x22\ -\x96_N\xe4\xfd\x09\x14:k\x06;k*S\x82e\ -%I\x9c5\xb3@\xf4\x04R\xdd\xb0\x8fT\xba^\xb5\ -x\xef_\x8fa[\x09\x17\xaa \xf1\x82\xf7\xfe\x93\xff\ -9\xc8fg\xcd\x00\xa9\xf4d`\xb7\xb3\xe6B\xbb-\ -,Nt\x00r\xcaJ\x92\xbb\xd37H\xa5\xf7\x00w\ -\xc7\xe9\x82\xe8\x95n\xc0\xcf\xd1K=\x9c5\x87\xb2m\ -D\x0fK\xa5\xf79k\xe6\x0a!\xd6\xa7\x19\x19\xe3\xbd\ -?\xea\xbd\xdf%\x95\xde\x94\xd1\xfd\xaa\xe2\xf8\x1b0\x11\ -\xf8\x22\xfeZ\x01S\x9c5\x87R\xb1\xce\x96\xbaK\xa5\ -\x97\x96\xd5G\xba\xf7\xe3\xd7\x00\x0c\xf2\x9eQikg\ -S|\xe0;`\x18\xa1Z\xca\x9c5\x1f\xa6\x84\x9a\x8a\ -\x05\xe73\xe6u\x8d\xcc!4\xb4\x96\x97\x92i\xca\x01\ -v9k\xc6e\xf0^\x03\xce\xc4\xff\x1b\x84`u\xda\ -Z\xca\xe8\xb7\xc0\x83\xc0\x1a\x02d\x17I\xa5_m\xea\ -\x016:kr\xa5\xd2oK\xa5\x87\xa5\x98\xce\x9a5\ -@\x8e\x10\xe26g\xcd\x90\x8c\xf0\xb4\x8fcW`\xbe\ -\xb3f\x04\xf0,P\x0d\xcc\x91Jw\x86\xd8\x01{\xe5\ -\xe5\xf7!\x80LCT\x0a\x8c\xcc\xcd\xcb\xd7\x84\x98\x0f\ -\xcd\xcd\xcb?\xb1\xb3\xa2|;\xc0\xce\x8a\xf2\x9a\x9d?\ -m=\x99\x12\x96Jw\xcb\xcd\xcb\xff\x8cP\xebg\x80\ -\x22g\xcd\xbc([\x9d\x9b\x97\x7f\x1ax\x06h\xb6\xb3\ -\xa2|Cc\x1e\x98\xe9\xacQ\x01\xeb9\x1ay\xad\x81\ -\xc5R\xe9-R\xe9\x87.\x1aN \x95\x9eE@\xc1\ -\xc7\x22\xbb\xc2Y\xb32]\xa1\x10b\x01p\x12\x18\x0d\ -\x1738\x93j\x81\xf1\xce\x9a\xd2\xb4\x8d\xfb\xbd\xf7\x00\ -\x1b\x09\x19^\x00l\x91J\xaf\x03~\x00?\x09hG\ -hT\x06\x98L\xe8\xf9\xf5\xa8\xac$\x89Tz\x1b0\ -X*\xdd\xa6!\x0fT\x03O\xa6\x1b\x07\xf0\xdeW\x10\ -2\xb8\xa3\xb3f(0\x85\x00FO\x033\xa2\xf1J\ -\xe0>B\xb2A@\xcd\x86\xe8v\x02\xaa\xfe\x9d\xf2@\ -m\x1c\x8f\x00O8kvK\xa5G\x01\xab\xa2\xfb!\ - \xe5!\xe0\x1e\xa9\xf4^\xa0g\xe4W\x11\xe0\xb7?\ -\x01\x8c~%\xe0?@\x95T\x9a\x94\x0e\xa9tw`\ -&\xa1#\xaer\xd6\xc4V\xfc\xe2\xa4\x1c_W7\x15\ -\x98\xed\xac9&\x95>\x97\x16\x9ej\xe0zB=\xa7\ -\xa8\x06\xf8\x0aX*\x84X^V\x92D\x16'r\xf1\ -\xbe\x18\x18E\xc8\xfc\xf4\xdb\xd6\xe9\xb8\xff\xba8\xdf\x85\ -\x10\x8f\xba\x92\xe4\x89\x86\xafd\xc5\x89\x07\xf0\xfe%B\ -&\xb7#\x5c4\x0f\x02\x7f\x01c\x80\xe5\xce\x9a\xa2\x06\ -\xf7*\xdd\x9b\xd0\xef+\xe3\xd83\xea\xa8\x8d\xdeY+\ -\x84XT\xefJ\x96-\x8d\x1e7\x11!\xc4\x1f\x044\ -\xeb\xe2\xac\xa9\xca\x94\x91J/\x04&\x10\x10\xd35\xa6\ -\xb3I\xad8\xde\x90\x16\x12\xba\xdc\xf4\xccu\xa9\xf4\x1d\ -\x80\x02\x8e\x08!\x1a5\xde\xe4\x03\x00\x08!\xe6\x02\xc7\ -\x81\x84T\xfa\xa94\xe3\x00\xcb\x09q\x9eV\x96\xe5\xf3\ -\xec\xb2\xde\x86R\xe9\x02`-\xa1,?\x22@\xeex\ -\xc2}\xf0sg\xcd\xf0lu]\xd6\xdb0^H\x9e\ -\x03N\x01\x09`~4\xbeL\x08\x91\xb5\xf1\xcb\xf6@\ -\x9a' `H\xeay\xbe\xa7\xa9:\xfe\x03\x5c\xaa\xea\ -&\xfd\x17M\xd2\x00\x00\x00%tEXtdat\ -e:create\x002016-01\ --08T15:18:18+00:\ -00\x01E\x99\xf0\x00\x00\x00%tEXtda\ -te:modify\x002016-0\ -1-08T15:18:18+00\ -:00p\x18!L\x00\x00\x00\x00IEND\xae\ -B`\x82\ -\x00\x00\x00\xce\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0c\x00\x00\x00\x0c\x08\x06\x00\x00\x00Vu\x5c\xe7\ -\x00\x00\x00\x95IDAT(\x91\x9d\xd0\xb1\x09\x02Q\ -\x10E\xd1\xb3\x22\x08\xb6a,\x98\xd9\x80\x81\xa0e\x88\ -\x91%\x18Z\x82\x89b\x19\x0a\x826 \xfc`\xc1\xd8\ -\xd0\x16\x04#\x0d\xfe.\xac\xe8\xdf\x05_x\x87\xcb\xcc\ -\x9b,\x84\xf0\xc2\x01S1{L$\xd2\xc6\x19y\x85\ -\xe5\xe8\xa4\x84,\x84\x90\x9a%7lp\xc5\xba`\x0b\ -\xf4\xeb\x84\xb9\xd8\xa1\x14\xc6\x1a:\xf4\xf0\xa8\xb0\x19\xba\ -)\xa1\xd5|\xf5\xf7\x86\x9b\xcf\xb7\xee\x9aN\xda\x8a\xa5\ -\xcb\x1cqO\x09\x7f\xbd\xf5\x84\x0b\x96\x05[aX'\ -\x8c\xf0\xac\xb0A\xc1~\xe6\x0d\xc9\xd6\x1dQ\xcd\xba\xaa\ -\xa1\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01}\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x01DIDAT8\x8d\x95\xd2\xb1KVQ\ -\x14\x00\xf0\xdf\xf7Qa\xe2\x12N\x91\x93\x85MN\x9d\ -\xa1E\x10\x84\x86j\xd4M\x87\x96\xc0\xdd]\xb7hh\ -\x8d \xa1!A\x1cZ\x85\xa6j*\xf2P\xe0\x90\xe2\ -\x1f\x10\x88A\x86aa|\xe2\xf0\xae\xa1\xaf\x0b\xe6\x99\ -\xde;\xf7\x9c\xdf=\x5cNG\x89\xcc\xbc\x829Lb\ -\x18\x7f\x90X\xc4RD\x1c\xaaD\xa74\x8f\xe25\xae\ -\x96\xfc/\xf40P\xfeW1\x15\x11\xfbm\xa0[n\ -^=\xd1\x0c\x971\x8bql\xe2.\x9e\xd5&\xe8\x96\ -\xb1\x87*g\xdf#\xe2\x1d\xc6\xf0\x153\x99y\xab\x06\ -L\xd5d\xecBD|\xc3\xa3\x92\xfb\xa7\xf6\x82\xe6\xc1\ -~\xa3\xaf\x0dd\xe6\x00\x06\xb1Qr\xd7k@\x0f{\ -xP\x90\x9f\xd8\xc6+\xdcl\xd5\xf7j\xc0:\x02[\ -\x11\xf1\xe9\xf8 3\xdb\x13\xc1\xe7v\xa2\x8b\x17\xe5\xfb\ -if\xf6W\x9ahv\xe2\x00/k\x13,b\x06\xb7\ -\xb1\x96\x99\xf3x\x8f\x8b\xa5\xe6\x00\x97\xf0\x04;m\xe0\ -x\x91\x06\xb1\x82\x89\xca\xed=,c\x1a\x1fq'\x22\ -~\x9c\x02\x0a\xd2\xc1=\xcd*\x8fh\xb61\xf1\x5c\xf3\ -\xa8_4\xfbr\x0a\xf9\x0b\x9c\x15\x99y\x03oq\x0d\ -\x1f0\x11\x11\xfb\xff\x0dT\x907\xb8\x7f.\xa0\x82<\ ->7p\x02Y\xc0\xc3#S\xefd\xae\x0f\x1eB$\ -\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01x\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x12\x08\x06\x00\x00\x00R;^j\ -\x00\x00\x01?IDAT8\x8d\x9d\xd3=K\x5cA\ -\x14\xc6\xf1\xdf\xae\x06\x04\x8bt\xdb\xa8\x88q#\xa2\xd8\ -X\xa4\xb2\x15\x041\xd8\x05\xa2\x95\xe5\xd6!\xd8,n\ -!~\x06+IJ\xf3\x09\x94\x10P\x904n\x11H\ -0$\xf8\x02.\x0b\x0a\x16Vb\xe1\x8a\x8538\x19\ -]\xc2\xfa\xc0\xe5\x9e\xf3\x1c\xce\x7f\xce\x9d\x99[\xa8\xd7\ -\xeb\x12\xad\xa1\x8a\x96\x7fu\x89\x97\x99w\x8a\xc1bf\ -\x8e\xa3O\x07\xca\x01\xaf\xc2\xf3,@\x01\xe5N\x01\xdd\ -I\xdc\x8f\x9e6\x80\x1d\xf4\x86E&\xf0\x13\xe7\xf9\x04\ -\xb1q\xe8\x09\xc0<\xa6\xf1\x19%|\xc2B\x0ex\x9d\ -\x81r\xbd\xc0J\x88\xabq\xfa\x22\xc6BS\x0a\x18\xc5\ -\x1c\xba\x12\xc0\x12\x86C<\x82\xf7\x110\x80#|\x0c\ -\xc5\x12~\xe3\x9d\x87\xfb\xd0\x13VMUEw\x11\xdb\ -\xf8\x9e\x15oPK\xf2\x8a\xc7\xf7\xa3\x8c\xc5\xb8\x07\xb5\ -\xac\xb8\x81\xc3$ob\x06?B\xbe\x857hD\xc0\ -W\xec\x85\xf8\x1a\xab\x19p3Lz\x10\xf2_\xd8\xc7\ -\xb7\xf4\x14\xe2\x0e\xaf\xa3\xe1i\x1d\x87\xf7Q4\xe2E\ -Z\xc6$\xce\xdc\x9f\xc2\x97\xe0Wp\x91\x00N\xda\x01\ -\xa60\x1b\xe2\xb7I\xc3\x876\x13\xfc\x8dF\xfe3\xfd\ -O\xc7\xb8\x92|b\xa7\x80&\xfe\xe0\xf6\xb9\x80\x16v\ -S\xe3\x0e3\xc49\xa5\x12)N:\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x01\x1b\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0e\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x99\xdc_\x7f\ -\x00\x00\x00\xe2IDAT(\x91\x9d\xd1/K\x83Q\ -\x14\x06\xf0\xdf\xe6\x8aE\x98_`&\x83U\x10\xbf\x82\ -\x98\x9d0\x16\x945\xbb \xd6\x05\xcd.\x88}j\xb1\ -\x0cV4\x1b_\x164\xac\xb8b\x96\x81\xc5 2\x16\ -v\x06\x97\xd7wC|\xe0p\xcfs\xce\xf3\xdcs\xff\ -\x94\xb2,\xbb\xc0\x99\xdf8\xc1u\xe4}\xec\xa7\xcd2\ -\xeePG7j\xc3\xe0O\x89\xee\x12\xc7\xf8\xc2\x18\xcd\ -\x0a^#z\xd8\xc4\x0e\xaa\x18%\xc6g\x1ca\x15\x0d\ -\xf4\xcaI\xf3\x1b\x07\xf8\xc0\x15\xb6\x93^\x1d-tb\ -\x80\xd4\x08\xefh\xa2\x82\x07\xacc\x037\x18\xe04\xbd\ -c\x1e\x8fh\x87\xa1\x8b\xdb\xd0\x1d\xc6\xa9\x88\x9d\x8b\xd0\ -\xc6.\xf6\x827\xf0\x96\x0a\x8a&\xc2\x04\xe7\x91\x0fq\ -\x9f\x17,2\xc2On\xfd\xb3q)\xfem,z\x9c\ -\x15\xacE\xccy\xd5\xec\xde\x9f\xcb\x8c[x\xc9\xf1\xb1\ -\xd9\x1f\xd7\xe6\xc5)P\xcb+^\xfd\x05+R\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xcf\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x01\x96IDAT8\x8dm\xd3M\x88\x8eQ\ -\x14\x07\xf0\xdf\xf3\xf4R\x83\x8d\x05\xc5\xbc\x14)\xcd\x8a\ -\x95(R\x13\xa5\xac\xcc\xc6GMJY\x8cX(K\ -\x99\x8c\x05\x9a\xb1b\xc3b\xc6\x82R2\xd9\xc8(_\ -eA\x16b\xa1\xde\x84\x89Y\xccBB\xa4\x19\x1f\xc3\ -\xe2\x9e\x9b\xdb\x93S\xb7\xdb9\xf7\x9c\x7f\xff\xf3?\xe7\ -V\x9dN\xc7\x7fl\x1b\xfa\xb1\x05m\xfc\xc6\x1bL`\ -\x0c/sb\xd5\x00X\x82\xab\xd8^\xc4>\xa3\x85E\ -\xe1\xcf\xe1\x22\x8eb\xb6.\x12\xdbxZ\x14\x7f\xc3q\ -,\xc7\x0a\x9c\xc3\x0f\xd4\x18\xc0=,\xc8\x0cj<\xc6\ -\x06\xcc\xe0\x12\xce`\xba\xd1\xda\x1a\x0ca\x0f*\x8ce\ -\x80\xfd\xb8\x8c)\xf4\xe2uQ\xd4\x1d\xa0\x1f\x8b\xd8F\ -\x5c\xc1\xea\xdc\xc2\xc1\xb8\x87\x1b\xc5\x83x\x8bI\x9c\xc4\ -\xc2\x88?\xc1mT5\xba\xb0)\x1e\xde5(\x0fc\ -/n\xe20\x9ec}\xa1\x91VP\xccLv\xe2\x96\ -46\xf8\x8e\xf18-i\xac\xfb\xd0\x87u\x19\xa0\x9c\ -\xc44\x0ea-\x1e\xe2\x0e\xbe\xc6\xdb/<\x88C\xd2\ -L\x8d\xf7\x98\x8d\xe0+\x9c\xc7(\xce\xe2\x83\xb4<\x03\ -X\xdah\xefE\x06\x98\xc1\xfd\x08\xce\x8b\xfb\x19zp\ -,\xee\xc1L\xb9\xb0\x1e\xfem\xe2\x0eI\xd5I\x1c\x08\ -\xfa\xa5U\xf8S\xf8}\xb8\x86\xb9\xdc\xff\x84$\xd4\xaa\ -\xe8q\x5cZ\x9al\xb9xs\x80\xdf\x08\xb6\xa7K\x01\ -\xfb\xa5m\x84]\xd2\x87\x19\xc1b\xac\x8c\xa2G\xd8\x1a\ -9\xa3\x18j~\xa6.\x9c\xc2\x11\xcc\x8f\xd8\xcfh\xa1\ -\x15\xfe'\x9c\xc0\x85R\x83\xa6\xb5\xb1[\x9a\xfb2i\ -\x84S\xb8\x8b\xeb\xf8\x92\x13\xff\x02w\x5ckPMg\ -\xdc\xa5\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\x86\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x0e\x08\x06\x00\x00\x00\xf0\x8aF\xef\ -\x00\x00\x01MIDAT(\x91\x85\xd21K\xd6Q\ -\x14\x06\xf0\x9fW\x0a)jhh\xc8h\x91\x1c5\xe9\ -PRIC\x82\x0e\xd9 !\x82\xd1j\x1f \xa8o\ -\xd0\x16\xb4\xb4\xd4\xe6`\xb4DB\xadA\xe0\x10\x1dT\ -hlh\x11A\x8c\x8ah\x10\xa9lx\xef?^\xfe\ -\xf0\xf2\x9e\xe9\x9e\xe79\xcf}\xce9\x9c\x01\xad\xc8\xcc\ -\x9bX\xc6\x15\x9c\xc2O|\xc4s\xbc\x8c\x88\xbfM\xed\ -@\x97\xe8\x18V0\x8f/X\xc3W\x9c\xc6\x0cF\xf1\ -\x1e\xb7#b\xaf-^\xc3\x1c\x1e\xe0qD\xfc\xee\xe2\ -\x0a\xee\xe2)>a*\x22\x0e\x1ar!3\x0f3\xf3\ -~{\x8c\xd6H\xb3\xb5\xee\xe1\x7f\xe7\xcc\x5c\xc7qL\ -D\xc4a\x9f\x0f^\xe0\x1a\xce\x95\xcc<\x89I\xac\xf6\ -\x13\xd6X\xc50F\x0b.\xa3`;3\x8f\xf4q=\ -\x8a]\xfc\xc1\xa5\x82G\x95\x1b\xc7\xab>\xaeou\x96\ -:\x88{\x05\x17*1\x86\xc1\xcc\x1c\xe9\xe1:\x82)\ -|\xab\xd0\xc5\x82\x1f5\xb9\x8e7X\xea\xe1z\x07\xef\ -p\xb5\x01\x0a>\xd7\xf7\x10~a\xb1\x87xI\xe7p\ -\xa6k\xbeY\xf0\xba\xab\xe0\x06\xf62s\xac\xd5\xf2$\ -\xcec\x1f'*\xbcR\xf0\x04\x9b\x15\x98\xc7\x87\xae\xb9\ -\x9a\xd8\xc7\x16n\xd5|\x03\xcf\x9a#9\xab\xb3\xe93\ -X\x88\x88\xf5v\xcf\x999\xa1\xb3\xed\xef\x98\x8e\x88\x9d\ -\x7fI\x1dq\x82#,l\xf1\x00\x00\x00\x00IEN\ -D\xaeB`\x82\ -\x00\x00\x01\xc6\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x11\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf01\x94_\ -\x00\x00\x01\x8dIDAT8\x8d\x9d\xd3M\x88\xcda\ -\x14\x06\xf0\xdf\x9d\x99\xcd\xd8h\xc6,$ERS\xcc\ -4\xa5\x135\xd9\xcclg(\x12\x1b\x0b)\x16>v\ -\x16\xa2,(\xcdF\xcab\xa6\x1b[\x85\x22+K\xf9\ -X\xb9\x0ee!#D\x16\xa8!\x09\xc9\xc2\xc7\xe2\xff\ -\xcet\xfb\xd7\xcc\x8dS\xef\xe6=\xe7<\xcfs\xbe\x1a\ -\xfe\xd32\xb3\x89\xfd8\xde\xe8\x108\x82\xb5X\x85\xd5\ -\xe8F\x17\xd6c\x1bz\xd0\xea\xe9@x\x06O1\x83\ -\xe5\xd8\x83e\xb8\x82\xbeBp\xa2{\x09\x15\x1bp\x16\ -\xc3\xe8G/\x9ax\x84\x83\xd8\x87\x81\x88hv-\x02\ -\xb0\x157\xf0\x10o\xd1\x8a\x88i\x0c\xe04\x0eG\xc4\ -\x17\xfcVj\x9aO\x5c\x89\xbdE\xe2\x1b\xac@\x94w\ -)3[8R\x00~df?>B#3\x03\xc7\ -\xd0\xc0\xbb\xc26\x8a\x8b\x111U\x08\xee\xa8\x9ay\x0b\ -\xcf\xf1\x12?\xf1=\x22\xee\xf7\x14\xc6\xed\xc51\x8b\xc7\ -\xb8\x80'm\x15\xee\xc4H\x01\x1a\xc4I|\xc2\x98\xc2\ -.3\xc7q\x0d\xbb#\xe2\xf6b\xcd.\xb1S\x98\xc0\ -xD\xccQ\xcd\x5cI\xdc\x81\xcb\x999\xf9/\x00\x0b\ -J\xda\x82\xb6\xe0\xaejt\xdfj\xbeI\x9c\xc7h;\ -\xc0\x82\x926{\x8d\xafu\x80b\xef\x8bo\xae\xee\xa8\ -o\xec\x90jCef/\x8e\xe2\x05n\xe2\x19\x063\ -\xb3;\x22~-\xa5d\x08\xb3\x99y\x08\xaf\xb0\x19\xa7\ -\xf0@5\xf6\x0fXWWR\x07\x19\xc6\x01\xd5qM\ -D\xc4.l\xc29Lc\x0d6v*\xe73\xc6\x22\ -\xe2\xde\xfcGD\xfc\xc1\xd5\xcc\xbc\xae\xba\x97\xbe:\xc8\ -_\xc6l\x83y\x0c\xda\xbaW\x00\x00\x00\x00IEN\ -D\xaeB`\x82\ -\x00\x00\x01\x89\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x15\x00\x00\x00\x14\x08\x06\x00\x00\x00bKv3\ -\x00\x00\x01PIDAT8\x8d\xad\xd4\xb1K[Q\ -\x14\xc7\xf1O$\xb4\xee\x12j\xabq\xaaYJ\x05\xc9\ -_P\x07\x17\x07\x17\xc1BE:T\x90\xae\x9d\x0a\xed\ -\xa0t\x13\x97v\xc8\xd8\xc5\xc1E7\xdduN\x16\xa5\ -\x94\xd6M#m\x05'\x95XQ\xe2\x90\x9b\x12\x02\xef\ -\xbd\x9b\x92\x1f\x5c.<\xce\xf9\xf2;\xf7\xc7y\xb9f\ -\xb3)I\xb5Z\x0d\x9e\xe3\x00oQ)\x97\xcb\x89\xf5\ -m\x0ddV\xfc\x87b\xa1?P\x8d\x85\xe6\x92\xc6\x0f\ -\xa3\xc3C\xdc\xe16\x16\x1a\xe3\xf4o\x00\xe6\xf1\x1a\xab\ -\xfd\x80\xe6\xb1\x88\xef\xf8\x8a\xc7\x18\xc7`RC\xd6\xf8\ -S\xa8\xa0\x94\xd0\x7f\x86S\xd4q\x1c\xee\xbd|\x86\xcb\ -}\xac\xe1#\xc6\xc2\xb7?\xf8\xd6\x01\xfb\x85\x93p\xd7\ -\xf1;W\xadF\x85\xfa\x00\xcbx\x8f\x1d\xbcI+\x8e\ -y\xd3\x12n\xf0\x19O\xb1\x9d\xd5\x10\x03\xdd\xc2\x86V\ -8W\xd8\xcdj\xe8|\xd3A\x8c\xe0\x09F;\xee!\ -\xbc\xc2\xbcV\xfa\x9f\xb4B\x91\xb4\xb2y\xbc\xc44&\ -\x03\xb4\x90b`\x093x\x81\x9fiN7\xc3\xe9t\ -\x5c\x0c.\x8bx\x87\x09\x9cc\x1d_p\x99\x04lC\ -\xbbu\x8d\xa3p`\x01\x1f\xb4\x82\xbaH\x83\xa5A\xbb\ -5\x8bF\x0c\xac\xad\x98\xf4\x1bx\x86\xb9Xh\xe2\x9a\ -\xf2oU\x0b8\xc4\x8a>\xfe\xa4\x87\xf1(\xcab\x0f\ -\xd0\x9eu\x0f\xb5UQ\xc4\x18\x14\xeam\x00\x00\x00\x00\ -IEND\xaeB`\x82\ -\x00\x00\x01J\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0d\x00\x00\x00\x0d\x08\x06\x00\x00\x00r\xeb\xe4|\ -\x00\x00\x01\x11IDAT(\x91\x85\xd2\xbf+\xc4q\ -\x1c\xc7\xf1\xc7\x9d\x93\xe4\xa2\xcb \x8b\xb2(\x7f\x00\x03\ -e2\xa0\x94\xd1 \xeab\xb1 \x0b2#\x93,\x16\ -\x89\x0c&E\xba\xc2\xa0\x84\x81\xbe\xc9$\xeb1\xa9\xeb\ -&\x8b\x1f\xc9p\x9f\xab\xef\xe9\xe2=\xbe?\xaf\xe7\xe7\ -\xf5\xfa|z%\xa2(\xca\xa3M\xe5\xaca\x11\x0bX\ -\xfduv\x9d\xc24\xd2\xd8@\x0b\xe6p\x11\x04Gx\ -\xc5\x16^\xb0\x84B\x0a\xb9 x\xc3\x09\x06\xb0\x19v\ -O\x98G\x0ac\xb8\x85d\xcc6\x87\xed\x00M\x85\xdd\ -0&\xb1R\x06 \x11EQ\xcc\xe2\x1c\xcb\xe8\xc0z\x5c\x14\xff\ -\xbdN\xdc\xe3,\xc4\x83\x1a\x5c\xa2\x07C8-;e\ -\xd0\x8c=\xbc+\xd5\xa7.@)\xa5\x86|`G\xa9\ -n\x99$\x8a(\xa0\x0bMxD6@Y\xdc\x85K\ -Z\x91G\xf1\x07i\x04=o\x03\x18\x5c\xb7\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x02\x15\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x13\x00\x00\x00\x14\x08\x06\x00\x00\x00oU\x06t\ -\x00\x00\x01\xdcIDAT8\x8d\x9d\xd4]h\xcfQ\ -\x1c\xc7\xf1\xd7\x7ff)\xe5\xa15\xca\x05\x174\xb5\xd4\ -\x94\x8b\xb1%\xb1\xac<\xa4(S\xd4.\xdcz\xb8q\ -\xe7F\x89\xc2\x8dZ+)\x96I\xc9\xe4!\x91\x9a\x84\ -\x95q\xf1\xbf\xf0\xfc\x90;#\xa1\x11.H\xcd\x5c|\ -\xcf?\xbf\xfe\xfe\xff\xfd\xd6N\x9d\xce\xefw\x1e\xde\xe7\ -\x9c\xcf\xf7\xf3=\x85b\xb1h\x02\xa5\x06\xbbS]\x88\ -W8\x8a\xb3\xd9I\xb5\x13\x00MA/\xba\xd2\xff\x07\ -4\xa1\x0f\xd3q\x22\xbbc\x1e\xe8L\x02\xbdG+\xe6\ -a#\xc6p \xcb\xc8\x83m\xc5z\xbcD\x1b\x1e\xa4\ -\xfe\x1b\xf8\x84\xb9\x98Q\x9a<\xde5g\xe2\xb9\xd0\xe8\ -\x07F3c+1\x07\x1f\xf1}\xbc\x93M\xc3)\x8c\ -\xe0Ij{Q\x97\xc6\x97\xe2\x0a\x0a8\x84?\xd5N\ -6\x0bW\xb1\x0a_q_\xe8\xd4\x85~!\xfe\x00\xea\ -q\x1c=\xd9\xc5YX\x03n\xa1\x19/\xb0\x0d\xef\xd2\ -\xce\xab\xf1\x13w\x84F=\xd8W~\xa5\x12lv\xda\ -\xb1\x19\x0f\xb1\x01\x97\xb1\x1c\x17D\xe4v\xa4\xf9G\xb0\ -?\xf5\xfd\x07\xab\xc3\xcd\xa4\xc5\x10\xd6\x09Q\xcfc\x85\ -\x7f\xfe\xfa\x85\xbd2\xbe\xaa\x04\xdb\x8e\x16<\x126(\ -E\xe7\xa4\xd0\xaf\x15SqOD\xafj\xa9\xc1\xb2\xf4\ -\xdd\x8do\x99\xb1\xcd\xb8\x8bMx\x9c\x07*\xc1\x86\xd3\ -w{\xa6\x7f\x0f.b\xb10\xec\xeb\xfd7\x08\xdf\xb5\xd4\xa6\xe3w\x88\x1c\x5c\x92&\ -<\xc3.\x0cV8@\xbf\xc8\xcfF!\xc55\xe1\x82\ -\xa6B\xd9\x134?\xb5\xc3*\x84>\x95v\x5c\x12\xe9\ -\xf6[\xb8a\x04[\xca\xd3\xe9m\xaa\xd5@p[\x04\ -e,\x81F\xb1\x16\x83y\xafF\xa5\xd2\x88\xd3\x227\ -\x89g\xea\x1c\x16L\x06v\x1d\x8b\xc4\xd5:\xf1Y<\ -\x96\x03\x93\x81\x1d\xc6\x1b\xac\x11\xf6\xe9\x10\xd69\xf8\x17\ --\x83l\x7f\xf5\xb9\xae\x1b\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x02\xff\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ -\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ -\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ -bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ -\x00\x09pHYs\x00\x00\x0b\x12\x00\x00\x0b\x12\x01\xd2\ -\xdd~\xfc\x00\x00\x00\x07tIME\x07\xe0\x01\x08\x0f\ -\x12,c4\xebp\x00\x00\x01\xeeIDATX\xc3\ -\xed\x95\xbdk\x14A\x18\xc6\x7fo\x12D\x09\x09\x82 \ -h#H\x02\x16I\x99\xbf }\xdap\xdb\xc8\x92\xca\ -\xe2\x16\xff\x00\xc12U\x88\xec\x15!\xd5\x14\xe2\x1e)\ -\x02Q\xc4t6\x92\xc2\x90\xc6B,\xceBN\x11<\ -\x0c\xf9 \x09\x5c>nR\xdc\x9c\xbeYw7\x93\x8f\ -\xce}\x96\x81w\xe6}v\xe6\xd9g\xde\x99\x85\x12%\ -J\xfc\xef\x90\xbcD%\xac\xde\x03\x06]\xd7*\xfeA\ -\xdd\xd4~\xa6\xb8\x0f\x81\xfb\xc0\x100\x00\x1c\x01m`\ -\x17\xd8\xac\x9b\xda\xb7\xbcu\xfa\xf2\x95\xc9\xa2 \x0d\xa0\ -!\xc8W\xd7\x1a@3\x08\xa3\xf5 \x8c\x1e)\xeec\ -A>\x08\xf2\x0ex#\xc8\xaa \xef\x05\xd9\x00\xee\x04\ -a\xc4\x85\x05\x00\x87\xea\xeb;\xca\x85~`\x02\xf8\xa8\ -&>*\x98g\xb7h\x0b\x06\xce\xdd\xa4\xae\xedS\x89\ -\x89\xdf\x06at\x17X\x03F\x80a\xe0)\xf0\x22\xc5\ -\x9f\x06\xda\x89\x89_{\xcc\x9d\xef\x80uO/\x06H\ -L\xdc\x02\x9e\xdb?Y;\xa9\xb9\x8a\xe7\xb5x\xa1\x03\ -\xe2\xea\xd3b\x11D\x17\xeb'\xf9[\xbb\x0f4W\x8b\ -\xbd\xb2\x80\x02\xec\x03\xc7\xee\xdd\xe1,B\x10FO\x80\ -&\xb0e\xb1;\x82|NL|m\x02\x8e\x81\x13\xf7\ -\xee\xcd\x8c\xfcR\xaa?v)\x07\xb4\x95)[\xc5b\ -{\x9e\xf7g\xe4\xcf\xed{\x09H\xd5\x80N\xdd\x12\xe4\ -\x86\x8b\xdb\x9a\xeb\xf8\xd3\x82\x9c$&^\xf6\xb1\xb3\xcf\ -\x87\x94\xc2m\x15og\x11|\x17\xbf\x88\x80\x8e\x8a'\ -U\xfc\xe5\x12\x1fp\x06\xbe50^\x09\xab[\xc0(\ -\xf0\xccb-\xdd\x0b\xeaU\x9a\x0bP\x09\xabU\xa0\x05\ -\x1c\xb8\xb6\x0d\xfc\xaa\x9b\xda\x0fo\x01\xbd\xb3\xefj`\ -V\x0bs{\xbe\x9a\x98xEs]~)}/\xb8\ -\xfe\x18\xe0/\xc0\xa9n\xd1=r\x1a-\xe0eb\xe2\ -95\xb6\x07\xfc\xe6\xdf\x7fB\x07\xf8\x0e,\x90\xf3\xbf\ -(\x120\x935X7\xb5\xac\xe1y\xd7\xb2\x9c\x04 \ -\xef\x22*Q\xa2D\x89S\xad\x83\xa9\xe2\x81\x96I:\ -\x00\x00\x00%tEXtdate:cre\ -ate\x002016-01-08T1\ -5:18:44+00:00\x8e\x05\xfd\ -\xe0\x00\x00\x00%tEXtdate:mo\ -dify\x002016-01-08T\ -15:18:44+00:00\xffX\ -E\x5c\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xeb\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x11\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf01\x94_\ -\x00\x00\x01\xb2IDAT8\x8d\x95\xd3Oh\xcfq\ -\x18\x07\xf0\xd7\xf7\xb7%s\x908(.\x8aYM\x19\ -y\x14\x8a\x1c89\xb98\x92\x9b\x96\x7f3\xb2&\x9b\ -?5\x89\xb3\xc2\x8a\x5c8)M\x9a\x03Jqz\x0e\ -\x86\x83\x03\x07\xb2\xd5\xe4_\x88R3\x87\xdfw\xf5m\ -~#O}\xeaS\xef\xe7\xfd\xee\xfd|\x9e\xcf\xbb0\ -Cef+\xce\xa1\x1d\x0f\xd1\x13\x11\xef\x1b\xf5\x16\x0d\ -\xc8\x813X\x8d\x05\x15h\x14\x8fq$\x22^7\x14\ -\xc9\xcc-\xe8\xc7J\xcc\x9d\xc9!\xde!q4\x22\x9e\ -C\x91\x99;p\x18+0\xe7/\xe4\xe9\xf5\x09#\xe8\ -\xada\x02\xcd\xe5\xf9\xdf\x9a\xc0\xaf\x022\xb3\xc0nt\ -\xa3\x0dM\xffp\xf0\x04]\x111\x02\xb5\x12X\x8e]\ -X\x88>\xbc\xc0\xe44\xf2\x07\xdc\xc1N\xacCWf\ -\xce\x83Zf>\xc2S\xbcA[D\x0c\xa0\x03\xa7\xf0\ -\x0a\xe3\x18\xc2\x86\x88\xd8\x16\x11\xb7\xd57\xb7\x0c\xe3\x99\ -y\xbdY}m\xab\xb0V}3\x0f\x22\xe2'Nd\ -\xe6Y\xcc\x8f\x88\xd1);\x99Y\xc3&\xb4\xe23\xee\ -O\xbd\xc9,\x9c\xc4\x01\xbc\xc5\xfe\x88\x18\xae\xceR\x92\ -;\xcb\xbeB}\xa3W\x22b\xb2\xc8\xcc\x96\xd2zg\ -i\x7f\x08{\xf1\x11\xfb0\x8cC\xe8\xc1w\x9c/\xef\ -\x05\x8ec\xb0\xc8\xcc\xaf\x98\x8d\xed\xe5\xbc2\xb3\xb9$\ -\xf6\xa2\x05c\xe8\x8e\x88\x9b%^\xe04\x8e\xe1e\x91\ -\x99m\xb8\x88\xf5\xb8\x85\xce\xa9\x8cdf\x13\xda#\xe2\ -Ye\xac\x0e\x5c.\xdf\xef\x06\x0eV\xbf\xfd\x12\x0cb\ -#\xeebOD\x8cU\xf05\xb8\xa4\x1e\xc8k\xea\x19\ -\xfaB\xe3\x00..\x9dm\xc5=\x5c\xc0\x00\x96\xe2\xaa\ -zf\xbeU9\x7f\x88T\xc4\x16\x95\x02\x9bK\xfb}\ -\x11\xf1\xa3Q\xefos\xf3\x98\x0b\x981\xe3\xce\x00\x00\ -\x00\x00IEND\xaeB`\x82\ -\x00\x00\x02\x91\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x14\x00\x00\x00\x11\x08\x06\x00\x00\x00\xddD\x8c\xbe\ -\x00\x00\x02XIDAT8\x8d}\x93QhVe\ -\x18\xc7\x7f\xcf\xc7>(u\xcb\xae\xc4\xd01\x91\x85|\ -Q\x9a\x9eH\xac\xad\x18\x12\x14\xee\xb2\xb0\xebH(\x1a\ -\x0c\x04a\xdd\x85\x17\x0e\x12/\x82\x04\xe92\xbf`\x22\ -\x08\x0e\xbb\x182%\xb5\xa0\xde\xb352\xa9\x1b\xa9\x8b\ -\xe9\x96\xae\xf8J\xc4\xc2\xfau\xd1\xfb\xe9\xd9\xe7\xf2\xb9\ -9\xe79\xe7\xf9\xff\xfe\xff\x07\xde\x17:J]\xa3\x8e\ -\xa8g\xd5y\xf5\xb6\xba\xa4\xce\xa9\x1f\xa9;;5Y\ -\x87\xfa\xc0\xc7\xb7\xd4\x9b\xea\xd5\x0c|^\xedS\x9fR\ -\x87\xd5O\xd4[\xea\xa4\xfa\xc4C\x81\xd9\xfd\x8e\xfa\xae\ -\xfa\xb1\xba\xf1\x7f\x92lR\xcf\xa9\xd7\xd4-+\x02\xd5\ -\xd1\xbc\xda.\xb5\xa6\x9eZ\x09V\x11\xd7\xd5\x93y\x93\ -\xb5\xcb\x80joN6\xa6nW_S\x0f?\x0c\x98\ -\x01\xab\xd4\x9f\xd5\x0f\xab\xc0.\xe0m\xe0Z\x9e\xdb\x09\ -\xec\x02\xba\xd5O\x81_\x81q\xe0zD,\x03F\xc4\ -mu\x0a\x18P\x1f\x01\xee\x00\x84:\x0bLD\xc4x\ -vz\x07\xb8\x1c\x11\x17\xd4\xae\x99\x99\x99iu.\x22\ -N\xf7\xf4\xf4|\xd1\xdf\xdf\xffg\x9e[\x0d<\x0b<\ -\x07\x5c\x8c\x88o\x00j\xc0\x93\xc0\xb7\x15\xf3.\xe0\xaf\ -\x9c\xe2\xaez\x1exO\x9dj\xb5Z\x8beYN\xa4\ -\x94^_XXx\x1c\xf8\x0ah\x02\x7f\xb4\xc55\xe0\ -Q\xa0U\x01.\x01\xab*}\xb3\xf2\xfe\x98\xfa\x06p\ -b~~\xbeY\x96\xe5\x9a\x88\xf8\x05X\xac\x02\x17\x81\ -\xde\x8a\xe8\x07\xe0\x99vS\x14\xc5\x8f@by}\x07\ -\x0c\x15E\xd1\x0e\xf2{\x15\xf8%\xf0Jex\x0ex\ -\xa9\x03\xd0\xec\xe8\x9f\x06\x0e\xb6\x9b\x88\xf8\xbb\x0a\xfc\x0c\ -xS\xddP\xf9\xf9\x93\xda\x00Pw4\x1a\x8du\x80\ -\xc0\x11\xe0b\xd6\x8e\xa5\x94\xf6u\x18\x11j\x0d\xf8\x1e\ -\xa8\x03G\xf3\xb3\x17\xd8\x03\x5c\x00\xae\x00\xcd\xb2,_\ -\x05\x8e\xe5\x10\x1f\x00\xefg\x93\xe1\xa2(>\xbf\x07\xcc\ -)\x1aY\x5c\x02\x07\xf8\xef\x5c\x0e\x02/\x03#\x11\xd1\ -q\xeb!\xa5\xb4\x1b8\x0et\x03\x83EQ\x94\xed\x95\ -\x89\x88+\xc0\x00\xb0\x19\x98\x00\x86\x80I`\x1a8\xa1\ -n\xcd\xc6\xf56\xb0(\x8a\xb3\xc06\xe0\x12p&\xa5\ -\xd4w/a\xbb\xf2a\xdd\x0f\x8c\xe6\xd5\xbf\x06~\x03\ -\xb6\x00S\xc0\xa1\x88\xb8\xd1\x91\xb4\x96\xd7\xdf\x0b\x0c.\ -\xbfO\xf7\xc1u\xe0\x05`+\xb0\x1e\xb8\x09\x9c\x03f\ -#\xe2\x9f\x954)\xa5\x17\x81}\xff\x02\xe28ya\ -\x96\xfd\xc4\x97\x00\x00\x00\x00IEND\xaeB`\x82\ -\ -\x00\x00\x04x\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ -\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ -\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ -bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ -\x00\x09oFFs\x00\x00\x01@\x00\x00\x00\x00\x00s\ -\x05\xb7\x16\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\ -\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\ -\x07\xdf\x0c\x12\x0e\x1b\x0b$&IW\x00\x00\x00\x09v\ -pAg\x00\x00\x03@\x00\x00\x00 \x00\xbe\xe6\x89Z\ -\x00\x00\x03=IDATX\xc3\xe5\x97MhUG\ -\x14\xc7\x7f'\xba\xf3\xa3`\xa3Q\xb1\xa9-(*\xb5\ -(6\x96 \xadP\xdc\xc4\x16\x04\xad\xe0}\xbb\xa1\xb8\ -\xb0p\x1fZ\xa8\x8b\x82\xe8\xa6\x14\xba\x11\xee\x05\x15\x17\ -N\xa1p/h\xa4.\x0b\x8d\xa4\xa4i\xd4E\x055\ -~ H\xd1*\xa95DP*\x88\xf6\x9d.\xdey\ -\x8f\xf1a\xde\xbb\xe6C\x17\x9e\xcd\x999\x1f\x9c\xff\x9c\ -\xff\xdc\x99\xb9\xf0\x8aE\x8a\x04\x95\x5c\x19`\x8f\xa2?\ -\xe4>\xbd\xff*\x00\xfc\x02lR\xf4\x0fA>\xc8|\ -\x12\xfa\xf6\x03\xf3\x81S\x99O\xfa\xcc\xd6\x03lVT\ -\x049\x92\xf9d\x18 r\xf1^A:\x81\x93\x99O\ -\xfa\x01f\x16(~\x14\xd8d\xd3u\xc0I`[\x10\ -\xf21\xf0\x090\x0f\xe83\xdb\x97\xc0g6\x1e\x05\x86\ -K\xae\x8c\xa2_\x03\xed\xc0O\xb5\xe4\xb6f\xc5#\x17\ -\xefUt\xa7\xa2\xaah\x05PE\xb7F.\xfe\xbe\x16\ -\xa3\xe8iEQ\xf4\xbd\xc0\xd6\xadh}l\xfam\xa0\ -\xddbO\xb7\x04`\xbc\x7f+\xc8cA\x9e\x0a\xd2\x06\ -\xfcg\xf3\xafJ\xae\xdc^\xe5P\x06\x05A\x90w\x22\ -\x17Sr\xe5E\x82\xbc)\xc8C\xe0\xb1 \xdd\x16\xb7\ -\xca\xf4\x95\xdc\xa7\xb4\x04`\xb2\ -y/0\x02\xcc1\xb0k\xcc~.\xac\xd3\x94\x82\xdc\ -\xa7c\x99O\xfe\x01\xc6\xcc\xf4 \xf3\xc9hP\xbc\x06\ -\xf4b\xb0G6\xda\xf8\x14p\xd9\xc6\x1b\x80\xb5\x0d\x80\ -[\x03\x088\x95\x1a\xa7\xe3\xf8\xcf\x99\xbfK\xd1.\xe3\ -y\x10\x18\xb2q\xb7\xa2\xab-\xf6\xec\x0b\x030\x8e\x9b\ -\xf9\x07\xcd\xdf#\xc8rAn\xe5>\x1d\x03\x86,w\ -\x8b \x8b\x80G\xb9O\xaf\x85\xb9-?\xc3\x82\xf2\xbb\ -\xe9\x95\xa6\x7f6}\xde\xf4\x0a\xd3\xfd\x8d\x89\x85:\xd0\ -J2\x9f\xdc\x00\x1eA\x9d\xa7~\x80\xdc\xa7\x0f\x80+\ -A\xe8\xaf\x13\x02`<\xb6\x8a9\x03\x88\xc5\x0e\x04\xf6\ -\x0bA\xfePc^!\x0aj\xfc7\x03!\xc8nE\ -\x97\x0b\xa2\x99O\xae\x06\xf6\x03T?\xc9\x8a\xa2}\x8d\ -yS\xb5\x07\xb0\xf3~\xf89\xf6\xeb\xc0\xf5\xf1\xf2\xa6\ -d\x0fLF\x0au\xa0\x15\xff\xd3\x0e\xa0\xc8\x1eh&\ -v=\xc7\x8an\x0e\xef\x01xy\x14,\x03z\x80[\ -%W^\xfa\xc2\x1d\x00*\xa6\xe7\x96\x5c\xb9\xa3\x96\xa7\ -\xe83'\xe48\xf3\xa7\xc0\x1bfz\x0b\xb8Tr\xe5\ -O3\x9f\x0cT\xbb[@\x22\x17\x1f\x07\xb6O\xb2\x0b\ -\x15\xab'\xc0\x13`q\xee\xd3\xd1\x22/\xa2\x13\xc0\xe7\ -\xc0\xdf\xf6$\xab\xd3V\xb0\x03\x15\xe0]`\xa5\xa2j\ -\xfe\xdf\xa8\xbe\x94\x9aS\x10\xb9\xb8\x97\xea\xf3\xeb&\xd0\ -\x95\xfb\xf4\xdeD\x96^r\xe5]\xc0![\xfd\xb1\xcc\ -'_\xd4|mA\xd0\xda\x86\xa4<(\xde\x9d\xf9d\ -B\xc5Mf\x98\xfe&,^\x07\x10\xb9x\x81\xa2\xe7\ -#\x17\x1f\xb6y\xa6\xe8\x0e\xe0\x8e\xa2\x1ff>\x19\x99\ -Dq\x14\xedUtc\xee\xd3\xef\x1a}b\xab]\x0a\ -\xfci\x9c\xfdEu\xb7\xdeV\xf4\xfd\xa9\xfe\x0fh\x94\ -\x1a\x05\xed\xa6+V\xfc_`\xfdt\x17\x0f\x01t4\ -\xd8g\x01\xfb\xa6\xbbx\x1d\x80\xa2\xf3\xec\x98m\xd3\xfa\ -\xed\xaf\xbb\x22\x17G\xd3\x0d`&\x80 ?\x02\x9d\x8a\ ->\x11d\x04\xb8\x0b\xdcU\xf4\xc2\xcb\xe8\xc2\xeb-\xff\ -\x03Q\x9bYF6Y\xf5\xec\x00\x00\x00%tEX\ -tdate:create\x00201\ -5-12-18T14:27:11\ -+00:00YM\xe3\xc6\x00\x00\x00%tE\ -Xtdate:modify\x0020\ -15-12-18T14:27:1\ -1+00:00(\x10[z\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x01U\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ -\x00\x00\x01\x1cIDAT8\x8d\xa5\x92?K\xc3P\ -\x14\xc5\x7f\xa9\x11%\x8b\x1d\x5c\x5c\x05\x05'\xa1\xdcM\ -\xfc\x02*n\xd9\x5c]\xc5/P\x1c;\xf9=\x1cU\ -\xea\x87\x10\x0eq\x12\xc4\xa5\x11\x8b\xe0\xa6(4R\x9a\ -8\xe4EB\xdaj\x82\x07\x1e\x8f\xfb\xe7\x9c\xfb\xce\xe3\ -z\x922 c6\x92J\xbc\x08\xf8\xc0\x17\xb0\x04\x8c\ -}G\xf6f\x90\x07f\xb6^NH:\x05B3\xdb\ -\x91t\x09\x1cx\xee\x05\xef\x15r\xcbM\xb8\x02\xd2R\ -~\x1b\xd8\x04\xae\x81=`\xc1\x07\x86\xc0\xee\x1c\x0b\xbf\ -\xe1\x0c\xe8\xfb\xc0\xc4\xcc\xe2\xa6lIm \xf5\x8bD\ -\x14E!\xb0_\x93\xff\x9c\xa6\xe99\xe4?Z\xe0(\ -\x08\x82\xc3:\xec$I\x1e\x0a\x81V\xcd\x89s\xf1o\ -\x81\xb2\x85\xa7\xd1ht\x0b,\x03\x9f\x95\xda\x9a;\x8f\ -\xc0[\x96e\xe3)\x81N\xa7s2o\x8a\xa4\x10\xb8\ -\x00\xb6\x80.\xd0\x03V\x9aX\x18\xba\xde\x04\xd8 _\ -\x22\x9a\x08\x0c\x80;\xe0\x1ex1\xb3\x9b)\x0b\x7f\xe0\ -\x158&_\xef\xbe\xa4\xdeOER\x5cS\xa4\xe8_\ -uw[R\xecI\xfa\x00&MD\x1c< \xfe\x06\ -\x8cB^q\x9bC\x89i\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x01\xf9\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ -\x00\x00\x01\xc0IDAT8\x8d\x9d\xd4M\x88\x8eQ\ -\x14\x07\xf0\xdf\xc3\xe4c\xf0\x8e\xa4\xa4X!a3\xf9\ -*55)!\x0b\x1f\xb1bMYH\x0a)+\x91\ -\x22\x89a%I\x16^5Y\xf8JV>J\x91G\ -Y(\xb11,$\xe3{2\xc64bq\xcfSO\ -\x0f\xaf\xf7\xcd\xa9[\xb7s\xcf\xfd\x9f\xff\xf9\x9fso\ -\x96\xe7\xb9\x16\xac\x1b\x07\xb0\x10\xef\xd0\x83S\xf8U\x0e\ -jk\x01h#.E\xec\x10f\xe1$j8T\x0e\ -\x1c\xd5\x04h-.\x22\xc3\x0eL\xc4\xb2\x00\xdd\x8b\xb1\ -\xad\x82M\x93J\xc9\xb0\x05\xa7\xf1\x13\x0fbM\xc2\x8c\ -\xf2\x85fe\xce\xc58|\xae$\xe9\xc40\xde6c\ -\xb6\x14O#p\x00\xe70=\xce:p\x0d\x93q\x16\ -\xdf\xfe\x05\xb6\x1a\xb7\xb1\x00/\xf1\x15\x1b$}j\xb8\ -\x89%\xb8\x87=U\x16e\xb05\xb8\x82v\x1c\xc4l\ -I\x93\xed\xb8\x80\x1b\x92\xf8O\xa4\xc6\x0c6\x02\xebB\ -/\xc6`\x1f\x1e\x06\xab\x13\x18\xc1\xf9\x88y\x8c\x15\xf8\ -R\x05\x225`\x1e\xae\x07\xa3\xfd8\x82\xc5\xd2@n\ -\x8b\x05w\xb0\xbe\x11P\x01v\x5c\x12\xf6(\x0e\x87?\ -\xc7|l\xc2L<\x0a\xe6#q^\xc3\x1c\xbcF\x7f\ -\xb9\xcc\xe5\xf8\x18\xac\x0a\x1b\x8d]\x18\x8f\xab\xa8\x97\x80\ -`w$\xe1\ -M\xd9\xf9\x1b\x87\xd0i\x8b\x22\xfc\x9f\xfe\x00\x00\x00\x00\ -IEND\xaeB`\x82\ -\x00\x00\x02\xbf\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x16\x00\x00\x00\x13\x08\x06\x00\x00\x00\x94y\xfd\x88\ -\x00\x00\x02\x86IDAT8\x8d\x8d\xd4]\x88\x97U\ -\x10\x06\xf0\xdf\x7fQ\xd0B\xdb2)\x08D]\xc9B\ -\xec\xa6!\x03\xa3\xb2 \xd1J(\x0d#\x13\x14\x0b\x8b\ -\xc0\x82\xad\x9b0\x0a\xa4@\x906BJ\x141\xb0 \ -$\xfb\xf0\x22r\xefV\xcc\x14fS\xe8\x036HJ\ -J\x0d!\xdd\xf2\x03#\xda.\xceYx\xf7M\xc9\x81\ -\xc3\xcb{f\xe693\xcf|t\xb4$3\xc7\xe1s\ -\x04\x0e\xe3B=k#\xe2\xf7js5^\xc63\xf8\ -\x0bK#\xe2@\x13\xa7\xab\x0d\x8c\xf9\x98\x80)8\x8e\ -\x07\xb1\x0c\xab*\xe8t|\x85n\xf4\xe0\x05\xack\x83\ -\x5c\x0a\xf8Z\x1c\x8d\x88\x11|\x8a\x91z\x7fCfN\ -\xc3\x00\xfa\x22\xe2\xb9\x888\x83\x1f0\xf5J\x80\x7f\xc5\ -4\x88\x88\xdd\x98\x8e\xdb\xf0\x08\x0e\xe1\xd5\x88\xd8\xd1\xb0\ -\x9f\x81_\xae\x04\xf8{\xcc\xcd\xcc\xf1\x15\xfc\x18\xbe\xc5\ -QL\xc2`\xcb\xfeN\x1c\xf9_\xe0\x888W\x9d\xef\ -o\x5c\xf7*\x94<\x81\x0fk\xf1Fe)\xf6\xb4q\ -:\xcd\x9f\xcc\x9c\x80\xdb\xf1\x12f)\xb4\xdc\x84[p\ -\xb1\x9en\x9c\xc0\xcf8\x85\x05X\x83\xfd\x11qb\x0c\ -pf\xce\xc3\x8b\xd5h\x10\x07\xf1<\x1e\xc5f\xbc\x16\ -\x11\xbb\xaa\xedU\xf8\x0e\xaf`%~\xabXw\xe1\x1c\ -\xb6bk'3{\xf1,6`wD\x9c\xad\x00\x9b\ -p7\xceD\xc4\x03\xad\xcc\x96\xe0\x0d\xa5\x83f7|\ -\xee\xa8\x01\xcd\x91\x99g3\xb3\xbb\xcdQf\xf6d\xe6\ -Hf\xceo\xeb\xaa\xfe\xeb\xcc|\xeb2\xba\xf7\xc6\xd5\ -\xb47d\xe6\xfa\x88\x18n\xe8\x17\xd4\xd4\x1e\xc2\x97-\ -\xc7\x99J\x1bv5\xee\x16b\x0b~\xc4\xad\x9d\xcc\x9c\ -Tix\x12\xfd\xf5\x1c\xc4'\x95\xa2\x0fp_D\x0c\ -5@\xf6`/\x1eG\x1f\xfe\xac\xdf9\xd5\xe4\xe9N\ -\xc3\xf8\x1a,Rx]X#\x1a\xc2u\x18V\xc6\x98\ -\xc2\xeb\x12\xa5\xc8=\x98\x88/p\x12O\xe1\x18\xe6\x8d\ -i\xb7\xc6#\xdbq\x00\x9f\xe1Fl\xc2\xdf\x15`#\ -\x1eS\x86\xe64~\xc2\x8c\x88\xf8\xa3\xf6\xf7\x85\x88\xf8\ -\xe7?\xc0\x99\xb9\x02\xef\xe0\xe1\x88\xd8W\xef\xaeG\xd6\ -\x94\xdf\x8e\x88m\x0d\xfb]\xf8h\xb4\x1dGe\xcc\xe4\ -e\xe6l\xbc\x8f\xc9x\xb3\xa1:]#\xbc\x19\xfbZ\ -\xb1\x0c\xe0\x9ev\x80\xed\x91\x1eVv/\x85+\x99\xd9\ -\xa5\x0c\xc9De\xff\xf6g\xe6\xac\x86\xcf\x90\xc2\xf5\xe5\ -\x81#\xe2$V+\x85Z\x91\x99\x93\x95\xd59S\xa1\ -f\x07\xd6c 3\xefm\xb8\x8eh\xc9\xa5\xb6[\xbf\ -\xb26\xfb\xf0M=\x8b#\xe2|}|'\x96\xe3\xdd\ -\xcc\xfc\x18\xaf+E\x1d#\xff\x02\xad\xb1\xf2$\x9a\xc7\ -|\xa6\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x02=\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x13\x00\x00\x00\x12\x08\x06\x00\x00\x00\xb9\x0c\xe5i\ -\x00\x00\x02\x04IDAT8\x8d\xad\xd4\xcfKTa\ -\x14\xc6\xf1\xaf6\x5cc&\x09\x84\x89\x91\x81\x82D.\ -.t\xa3\xa9\xa0\xb6\x17\x83\xcc\x7f\xa0\xeex\xab\x8d\x08\ -\xd5JJC\x0b\xda\x14ZV\x1b\xdf\xdew\xfa!\xb4\ -S\xaaM\xe0\xca\x19#52\xf1N\xbd\x17\xa1\xc8\x8d\ -\xad\xd2`\xae\xc9\x85\x99\xdb\xa2\x94\x8c\x08g\xecY\x9d\ -\xc5\xe1\xc3\xe1p8%Z\xeb\x1bV\xc2\xee\xa3\xc8\xbc\ -\x9aIm\xd7%Z\xeb\x00\xb8\x0b\xf4Z\x09;\xd8\x0b\ -V\x0a\xb0\xbc\xbc\xdc\x03H%\xc5\xbeb'\xdc\xc6n\ -\xde\x1a\xe6\x83\xd6g\x80Y%\x85\xb1'\xcc\xf7}\xd6\ -\xd6\xd6p2\x99z`RI\x11.\x1a\x03\x10B2\ -<|\x9b\x85\x85\x85v\xe0\x8d\x92\xa2\xbch,\x08~\ -\xee\xfe\xfb\xe6&\xa9t\xba\x06\x98RRT\x14\x85E\ -\xa3QB\xa1\x10cc\x0fP\xea!ss\xf3\x8d\xc0\ -[%E\xac`\xac\xaa\xea(\x03\xfd\x97\xa9\xac\x8ca\ -\x18\x06\xd9l\x96\x89\x89\xc9#\xc0\xb4\x92\xe2pA\x18\ -@<\x1e\xffxu\xa0\x7f\xa3\xa1\xbe\x9e\xc7O\xc6y\ -\xf6\xfc\x05s\xf3\xf3\xd5A\x10\xcc*)\xaa\x0b\xc2\x80\ -\xd7eeeM\xb6\x9d\xd0\xdd\xdd\x16\x87\xa2QV>\ -\xaf\x90L>\x8a\xe5\xf3\xf9i%Em!\x18V\xc2\ -v\x80\x86\xd6\x96\x96doo\x0f\xef\x16\x17I\xa5\xd3\ -8\x99L,\x97\xcb\xa5\x94\x14\x8d\xbb\xc6~\x81\x9e\x95\ -\xb0\xadxm\x9a\xe6\ -\xd3\xad\xa6\xd0V\xb1\xb4\xe408t\xad\x02\xf8\xe7\xa1\ -\x1e\x88Dp2\xefY_\xfff\x9c\xea<9\xee\xba\ -\xee~\xd34\x93;0\xcf\xf3\xf0<\xef_\xce\x8ed\ -\xb3Y\x06\x87\xae\x97^\xbaxA\xba\xae\x1b6M\xf3\ -\xfe\xd6?\xfb\x1f\xe9\xfb\x01\xfd\x9c\xd6\xcao\xa8\xd4\xb1\ -\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\x5c\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0c\x00\x00\x00\x0c\x08\x06\x00\x00\x00Vu\x5c\xe7\ -\x00\x00\x01#IDAT(\x91m\x90?(\x84\x01\ -\x18\xc6\x7f\xef\xe7\x9b.\x03\xc9\xec\x06\x8aA\xc8`P\ -$\xebe0\xd8t\x03\x83\xc5`30;\x93U\xf9\ -su\x06\x8b\xc5\x22euJ1*\x97l\xca \x94\ -\xae\xfcI\xfd,\xdf\xe9K\x9e\xf1\xe9\xfd=\xcf\xd3\x0b\ -\x99\xd4.\xb5\xa2\xde\xa97\xea\xadZW\xcbjB^\ -\xea\x88\xdaP\xb7\xd5\xc9\x9c_T\xab\xea\x89Z\xc8'\ -7\xd4!u\x8d\x7f\xa4\xae\xaa5\x80P7\x80\x01\xe0\ -\x1c\x98\x02\x8e\x80\xb3\x88x\xf8\x03\xdd\x03s)0\x03\ -\x8cEDS\x058\x05Jj\x118\x88\x88[\xb5\x1b\ -\xa8\x03\xb3)@D4[I\x11\xf1\x08\xec\xa8)\xb0\ -\xac\xf6\x03\x83@\x15XJ\x80\xb6\x5cs\x9a\x03\xbf#\ -b\x0b(\x01_\xc0\x07\xf0\x91\x00\xcfY=@\xaaF\ -\xb6\xb9S]\x07\x8e\x81v`\x02\xb8\x0e\xb5\x0c\xcc\x02\ -+\x999\x0c\xbc\x00\xef\xc0nD\xbcf\xe0<0\x8e\ -\x9a\xa8\x97jM\x9dV7\xd5\xbe\xdcw:\xd4\x0bu\ -\x11\xa0U_\x00\xb6\x81\x1e`\x0f\x18\x02\xde\xb2\xdd\x0b\ -@%\x22\xf6\x7f\x81\x5c\xdah6\xaf\x17\xf8\x04\xae\x80\ -\xc3\x88xj\xdd\xfc\x00\xa7\xf6\xbd\x96\x10\xb6\xbf\xd9\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xd0\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x14\x00\x00\x00\x10\x08\x06\x00\x00\x00\x16\x18_\x1b\ -\x00\x00\x01\x97IDAT8\x8d\xad\xd4\xcf\x8bOQ\ -\x18\xc7\xf1\xd7w\x9aIJ\x8a\xac\xfc\xc8ld$\x0b\ -\xd33ca!ij\xa2\x99\xd9XY\xda\xd9Q\x9a\ -\x85\xc2\x1f )Jb\xa9l\xa7(EJ\x84,\x1e\ -\xc2\x86\x155\x89\x05\x9b\xafh\xfcfq\xcf\x9d\xb9\xa6\ -kL\x8dO\xdd\xee\xe9~\xde\xcf\xe7\xdc{\xcfsN\ -GQf\xae\xc55L\xe39n\xe0nD\xfc\xd2P\ -fn\xc38\x02\x1bq'\x22\x8e\xd4~O\x81\x86q\ -\x00\x83\x05\x1a\xc4\x15\xbc\xc8\xcc\xbd\x85\xd9\x93\x99\x0f\xf0\ -\x0c\x93X\x81\x01\xec\xca\xcc-\x7f\x04\x96\xb0\xa3e|\ -6\x22F#b\x1d\x0e\xe2tf>\xc4-|\xc1>\ -\xac\x89\x88\x11\xbc\xc4v\x9c\x9c\x0d\xcc\xcc{\x18\xc6X\ -y\xf6\xa96#\xe2>Na\x07ND\xc4\xee\x88\xb8\ -\x1e\x11\xdf\x0a\xf2\x1dO1\x9a\x99\x1b\xea7\xdc\x89\x9b\ -xW\xa0\x1a\xae\xf5\xa3\xdc/k\xd7\x13\x5c\xc2tf\ -\x1e\xee\xf9\x0b\xd4Tw\x11\xccq\xcc\xa0\x7f1\x81\xff\ -TD|\xc6W\xe6\x16\xe5\xbf\xa9-pI\x93\xb4\x15\ -\xaf\x5cJ}o\x0b\xb4?3\xfb0\x15\x11\xef\xd1i\ -\x9a\x99\xb9\x1a#\xd8\x8a~<^(\xb0\x8b!U\xf3\ -\x9e\xc9\xccc\xf8P\xbcU\x999\xa9j\xf6e\xf8\xa8\ -Z\xd9\x99f@'3\x7f\xe2*\xa6\xcc\xb5H\x9fj\ -\x07\x8c\x95\xe2Mx\x8d\xb7\xb8\xad\xea\xbd:hya\ -\xce\xe3b/.\xe0\x10&Z>\xbf\xa9\xf5\xe5\x1aZ\ -\x80y\xd3\x81\xcc\xdc\x5cfjj@\xb5;\xe6\xff\x96\ -\x09\xd5\x894_\xdd\x88x\xd5i1f\x95\x99\xe3\xaa\ -\xa3\xaa\x0e}\x14\x11\xe7\x16\xaa\xf9\x0d\xa0\xcdx<3\ -\xa5\x8a\xf0\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01X\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc9V%\x04\ -\x00\x00\x01\x1fIDAT(\x91\x95\xd0\xbf\xab\xcfQ\ -\x1c\xc7\xf1\xc7\xe7v\xb8r\x19X\x94\x1feq\x07\x85\ -\xd4{`0\xf9\x03\x84R\x18\xac\x06\x832Q\xca\xbf\ -`Q\x06\xfe\x03\x0c\xba\x7f\xc3]^\x0b\x912(%\ -E\x08I_\xe12\xdcs\xeb\x9b\xe9x\xd6\xbbsz\ -\x9d\xf7\xb3\xf7\xe9=%\xd9\x84\x078l\x8c\xaf\xb8W\ -U\xb7\xa7$\x87\xf0tP\x9cg\xd7\x02\xde\xe3\xe7\x7f\ -\x8a\xcf\xf1i\x82$\xcb88(~\xc1jU\xcdZ\ -\x0f\x1a>\x0f\xcak\xd8\x86\xd9\x94\xe4\x12n\xe0\xc5\xa0\ -<\xe1(\xce5\x9c\xc0\xf5\xaaz8(Kr\x19\xa7\ -\x1b^\xe2T\x92\xb5Aw\x09WpkJ\xb2\xb5\x7f\ -{\xef\xa0\xfc\x1d+U\xb5\xd2\xf0\xabO\xff0(\xff\ -\xb1\xbeq\x0b\xb8\x8a\x0b\xd6\x171\xc2\x22\xee$9\xd3\ -\xb0\x8c\xbbU\xf5hP\x96\xe4\x1b\x8e5\xac\xe2Z\x92\ -#\x83\xeev\x9c\xc7\xd9\x86\xfb\xf8\x88\xfd\xff4\xed\xc0\ -\x01<\xc1\x8f\xb9\xfc\x0d\x8eW\xd5\xeb)\xc9nl\xee\ -\x0f\xfbp\xb3\xdf\xb7`'\xde\xe17\x1e\xf7\xda`\xd6\ -p\x11{z\xb0\x88\xb7s\x0d\xaf\xfa\xb9\x84\x93\xbd6\ -x\xf6\x17\xf1zO\xd5\x8bA\xa4\xa9\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x01\x0a\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x08\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x94\xc2/8\ -\x00\x00\x00\xd1IDAT\x18\x95]\xd1\xbf/\xc3a\ -\x10\xc7\xf1\x97'\xd5\xc9h\x11F\x83\xe8\x82\xa4\xb1\x96\ -\x8d\x8dAl\x9a\x0e\xfe\x83\xae\x1d\x18\xc4`\xa71\x1b\ -\x0c\x12\x8b\xc9`\xd3\xe1;t3h\x18-\x12\x93(\ -\xea\xc7\xe0\x9e4\xf5I\x9e\xdc=w\xef{\xee\xc9\xdd\ -XQ\x14B\xab8B\x05\x1d\xec\xe01Er\x06\x97\ -X\xc01^q\x81R)\x80\x06&\xd0\xc7\x1efq\ -\x8b\xad\x0c\xac\x87=\xc7s\x9c;l&T\xb1\x14@\ -\x17\xe5\xf0oPM\xd8\xc5x\x04\x9b\x86\xeaa*\xa1\ -\x15\xbd\xa1\x8d\x8f\xf0\xdf\xf0\x95\xf0\x84\x83H\x9c\x18\xd5\ -K\xfe\xe4!~\x02\xce\x9aF/\xcf\xe1\x1d\xfb\xff\xaa\ -\x17\xd1\xcd\xc0<\xceP\x8f\xfb$Vp\x9d[\xdcc\ -\x19\xdb\xf8F\x0d\x0f\xb8\xca/|b\xcd\xdf\x0eN1\ -\x87\x0d\x0c~\x01]'-R\x7f\xd2\xe3\xe9\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x01~\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc9V%\x04\ -\x00\x00\x01EIDAT(\x91\x85\xd2\xbbjVQ\ -\x14\x04\xe0/\x1a\xa3h\xe5\x05A\xd0\x17\x10\x04\x85\x05\ -\xa6P\x10D\xb0\xb5\xb0\xb2Jc\xa1\x9d\x85\x8d\x01\xb1\ -\x15\x1b\x0b\x11\x0b\xf1\x15\x22v\xa9,l\x84)R\x05\ -\x84\x08\x0a\x81\x88\x22\xa8` x\x89\xc5\xd9\x07~\x0f\ -\xffe`\xc3\xda\xb3Xkf\x0f[\x92\x0fIN\x1b\ -A\x92\x85$\x17\xcd\xc0\x5c\x92]\x5c\xc5\xbb\xc6\xed\xc3\ -S\x5c\xc6\xc3V\x8f\xc3v?\xbc\x85\x13\xb3\x94\x06x\ -\xb9\xa7\x15\xd7q\xb8\x9d#x\x81\xbf\xb89\xc2\x0f\xcf\ -\x0dIv\x93\x9c\x1d]\x99d.\xc9\xc9Y\xd2\xbd\xed\ -Gx\x82E|\xc27\x5c\xc2\xca\x14\xee\xf5X\xe5!\ -\x92\x1cL\xf2|\xe8\xa6W\xbe\xa5\x0bm\x1c\x16\xb0\x8c\ -3\xcd\xc12\xbeb\xab\x1f^k!L\xc21\x1c\xc2\ -\x0e>\xeb\xc2\x5c\x9do\xcd\xa5\xaaZ\x9bb{/\xee\ -\xe1qU}\x1f\xda\xbe\x80\xb7\xd8\x8f?m\xf3\x01l\ -O\xe2\xaa\xeag\xaf|\x05\x1fq\x0e_\xf0C\x97\xe8\ -\xea\x14\xeeU?\xbcRU\x9bIvp\x17\xf7\xabj\ -\xbd\xf56G^\xf0\x1f\xd7\xdb~\x80_\xb8\xad\xfb\xa6\ -\x1bx\x86\xdf\x93r\xc0\xfb^y\x11Gq\xbc\xddO\ -\xe1Z[8\x09o\xe6\xdb[\xefT\xd5z\x92\xf3\xba\ -\xdf\xb6TU\x1bS\x06\xc1?\xb7?\x88\x1a\xfe<\x0d\ -\xb2\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x02\xce\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x17\x00\x00\x00\x13\x08\x06\x00\x00\x00{\xbb\x96\xb6\ -\x00\x00\x02\x95IDAT8\x8du\xd5]\x88\x96U\ -\x10\x07\xf0\xdf\xbe\xec\xa6\xb5R\x86\x19\x15Kx\x11F\ -B\x118\xb1\x98e\x94PT\x0a\xf6\xa9\x90\x10^I\ -Y$\xacE7\x19!D]\xa4E\x1f.\xa1\x88\x22\ -\xde\x88X\x04]\xecEEA\x9f'D\x12\x17\xb2\x94\ -\xa4\x15\xc2\xb0\xb7R\xa3\x0f\xb2\x8b3k\x8f\xcf\xbe\x0e\ -\x1c\x9e\xe7\x9c\x99\xf9\xcf\xccyf\xfeO\x9f\x96\x94R\ -\xfa\xf1>\x02\xfb\xf0G\xae\xd58\x91f}8\x93\xcf\ -\x95X\x86\x19\xf8\x02\x9b\xf0\x0bt\xda\xe0X\x88\xe9\x98\ -\x85c\xb8\x17\x0f\xe2\xd1\xd4Ok\xd8n\xc5\x0e\xdc\x8f\ -\x1b\xf0\x0c>\xc7\xec\xf3\x81_\x8a\xc3\x11q\x06\xefd\ -\x860\x13\x17\xe3\x82<{\x00\xabR\xf7\x0fn\xc6s\ -\x98\x8b7\xce\x07>\x81\xab!\x22\xf6`Nf5\x8c\ -\x058\x95vO4|\xf6\xe2\x086\xa3\x8b\x870\xb7\ -\x17\xf8A\x5c_J\x19\xc8\x00Gq\x00_\xe3'\xfc\ -\x9b\xd5-j\xf8\xbc\x95\xcf\x93\xd8\xae~\x8b\x15S\xc0\ -#\xe2T\x02-n\x1c\xaf\xc1\x8f\xf86\xf7\x8b\x1aU\ -\xef\xc3G\xad*\xe0\xb6\xbe&p)e:\xe6\xe3i\ -\x5c\x93\x80Wa\x00\xa3\xd8\x95\xc0kqK\xba\x8d\xab\ -w<\x99\xfdL\xb5[\x8eu\x12t\xb8\x94\xb2;\xc1\ -\xd6c?\x86\xf02\xfe\xc6\xe3\x11\xf1\x1a\x8e'\xd8p\ -#\xa7\xebpQc\xdf\xc5o\xb8\xac\xbf\x942\x82\xc7\ -\xb0\x01\xab\x22\xe2d\x06\x1c\xc4\x8b\xf8!\x22>l8\ -\x1f\xc4\x96\xf4\xa1\xde\xf3\x16\xe7J\x17C\xfdx\x01C\ -\x11\xd1m\x19l\xc6\x93\xb8\xd5Ty\x1e\x0f\xab\xb3\xb0\ --\xc1\xdar\xa2\xa36\xfd\x86R\xca%-\xe5\xedj\ -\xdb\xdd\xd9\xc3\xf18F\xd4\xfe~\xb5\x87~\x16&\xfa\ -q\x9fz%\xdf\x97R\xc60\x96\x01GR7ZJ\ -\xd9\x16\x11\x13-\x80\x1d\xea@\x1dn\x9d_\x8eA\x8c\ -\x9f\xed\x96\xcc\xfcn\xb5\x1b\xeeR\x87g\x5c\xe5\x8c/\ -\xf1\xba\xda\xa2\xa7{d\xda\x94%x\x0f#}\xbd\xb4\ -\xa5\x94\xad\xf8\x14\xef\xe2\x0a<\x8bO\xd4\x1e\xee\xe2/\ -\xdc\x84\x1b\xf1\x9d\xda\xe7\x9341\xaa\x92\xdc\xbc)C\ -TJyD%\xaaC\x11\xf1sD\x1c\xc0SX\x9a\ -k0M/\xc4\xdb\xf8\x00\x1b\xf3lHe\xc9\xcf0\ -\xdei\x01_\x8b\x9d*Aml\xa8\xba\xf8\x1dwd\ -\xd6\xf01v\xe7\xfbZ\xbc\xa4\x12\xdd@&3\x85\xb8\ -~U\xb9\x1b\x8ef\xc0\x8e:\x81\x83x\x13W6\xec\ -W\xe2\x95\x0c\xbeN\xe5\x94%\xf8Jn\xda\xd7\xb2<\ -#/\xce,v\xaa\x1c\xbe,\x03O\xc3\x9fm?\xff\ -\xff@\xceJ/V\x1cS)w\x13\xbe\xc9uOD\ -LV\xd4\x0bX\x1b\x18\xfe\x03:\x81\xbf\x95\xfd\x1fR\ -q\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01]\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0e\x00\x00\x00\x0e\x08\x06\x00\x00\x00\x1fH-\xd1\ -\x00\x00\x01$IDAT(\x91\x9d\xd2!K\xa4a\ -\x14\xc5\xf1\xdf\xbcc\x90\xc5\xb5\xd8\xd7\xb22i\xda\xfd\ -\x00b\xd02A6\xca&\xd3\xb2U\x90A\xfc\x00&\ -\x8b\xb8[D\x10\xd4\x22\x82\xc5f\xb5\xb8\xb7\x88\x96\x0d\ -\xe6M\xc2*\x83\x82\x08\x1a\xe6\x1dy}w4\xeci\ -\x0f\xf7\xfc9\xf7\x1e\x1e\x99\xf9\xcd\x7f\xa8\x91\x99W8\ -\x88\x88\xee{\xc6\xcc\x1c\xc5\x0c:X.pQ\x0e\xd6\ -\xde\x00\xda\x99y\x84k\x1cc*\x22z\x05\x94i\x8f\ -o\xc0\x97\xf8\x88\x0f\xe5{\x17\x8a\xc14\x22V\xf1w\ -\x08\xdc\xc14np\x8f\xc3W`\x09\xafU\xe1\xccl\ -c\x1f\xa7\xf8\x8c\xa5\x88\xe8\xd1/\xe7(\x22\xe6kw\ -u\xd1*\x93~\xe1kDC\xc7x\x17\xfa*\x00\xe6\ -KG\x079=z\xde\xaek\xf8{\x85\x5c\xa3S\x0b\ -(C\x22!\x1c\xc1ry\x9e\x91\x17_~.\xb0\x89\ -\xf5\x8b+#\xe7.\x94\xcd\xa69c\x9d\x1d@()\ -\x9b\x14vJ\xc0\xd9{\x06\xbf\xaf\x80m\xd3\xbe\xdab\ -\xad\x07\xa8z\xbd~ \x02\xcd\xf2\xbb\xa1f\x89}\x89\ -\x8e\x14\x19\x22\x96\x04\xfe\xa8\x94\xe7\x97\xb76\x1f\x1e\x88\ -@\xdc(\xd6\xcaw=\xdd6N\x00\xc3@\x09\x9d\x1b\ -\x14\xfajV\x80Z.\xbf\xf7\x15\xef\x94\x80\x0d\xb50\ -,\x81\xd7\x0c\x81[\xe8\xec\xe9\x00\x09\xe0%`(\x99\ -J\x93/\x14Y_\xf3:&`7\xednC\xc0\xc2\ -VAo>\xda\xdeZ\x07H\xa6\xd2\xa03h\x1e\xa2\ -?\xc7aX\xb9DD\xf9\xf8\xaf?]\xe7\xfa\xd7\x9f\ -\xdb\xbe\xf4\xad\x14\xf19~\xac\x94\xa2\xaf\xdfF\x98_\ -\x1f\xc6\xcc)k(e\x9dp!\xa0\xcb\x1e\xaf\x8a\x10\ -d\x0b\xbdv\xbd\xf2\xe7\x22\xe6\x81#\xb9B/\xe3\x13\ -\x93\xb6?\x1aPT\x03\xd2\xb1C\xf1\xe2\xf8\xc4\xa4\x07\ -\x9cg\xb7p\xb5[\x8c\x8dOL\xce\x1aR\x05\xb4\xf3\ -6@W\xc8\xfb\x11\xb0O\xed{\xe6\x0b#mH\x8c\ -\x00\x0fBs\xb1\xc0\xf9n\xb6\xbb\x9bp\xc9\xee\x13\xf0\ -\xeeWh4\xea\x1b\xae\x1b\xfb\x18\x1dN%\xb3a\xc2\ -\x9c\xee\x11\xf0-0\x80~v\x934\x97\xec\xdf\x1bU\ -5\xb4\xb3\xda\xfaP\xa2\xdf\x8c\xdb^u\x99`E\xbc\ -\xe7F\xce\x8c\x8eqj\xf8,\xdd\xdd)\x84\xb3\x9b\xba\ -\xa5R(\xd9\xe0\xde\xec\x0c\x99l\x9e\x9eb\x1f\x8e\xe3\ -\xea\xa7O)\xa4\x94T\xca\xf7\x00\xe8\x1f\x18\xc2q\x1c\ -\x84\x10\xbe\xd7I)Y\xf5\xaa\xccLO\xb10w\x97\ -g\xf8_\xe1\x1f\x16\x8f\x0dW\xeaa@l\x00\x00\x00\ -%tEXtdate:create\ -\x002015-12-18T14:2\ -7:00+00:003\x90\xe8\xec\x00\x00\ -\x00%tEXtdate:modif\ -y\x002015-12-18T14:\ -27:00+00:00B\xcdPP\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xa9\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0f\x00\x00\x00\x0e\x08\x06\x00\x00\x00\xf0\x8aF\xef\ -\x00\x00\x01pIDAT(\x91}\xd2\xbbk\x94Q\ -\x14\x04\xf0\xdf.A\x22\xd8\x88O\xb0\xf0Q\xf9\x8a\xa8\ -\x1c\x9bhaa\x1b%\x01\x11\x8b\xfc\x01\x06A1+\ -\x096Z\x88HH\x0am\x04\x03*ha\xe3\xa3\xb3\ -\x08\x98*\x12\xe5@\x1a1\x08V\x0a\x8a\x06\x82b*\ -\x1bS\xec\xfd`\xf7#\xe4\xb4wf\xce\xcc\x9c\xdb\xb0\ -\xc6d\xe6~\xdc\xc1!\xbc\xc3XD\xfc\xaa\xe3\x1a5\ -R?n\xe2\x046w<\xfd\xc4\x5c\x11\xf9\xd2E\xce\ -\xcc\xb3h\xe1\x186\xad\xe5\xa6\xcc2>\xe0VD\xbc\ -od\xe63\x0ca\xe3:\xa4\xfa\xfc\xc5\xedj\xf30\ -\xae\xe10z\xd6!\xfd\xc1|\xd9<_\x01\xdf\xe2\x22\ -\xbea7\xfat\xf7\xb1\xac]\xdc\x06|\xc5Ghf\ -\xe6,\x16\xf1\x19\x17\xb4s\xdf\xc0',\xe15NF\ -\xc4\x00\x86\xb1\x05?2\xf3IO\xb1q\x14\xc7\xb1'\ -\x22\x16q73\xa7\xb0-\x22\xbew88\x82\x83X\ -\xc1\x5c\x95\xb9\x17\xafp\xaaX\x1a\x89\x88\x85\x8a\x91\x99\ -\xe70\x89\xed\x98\x8e\x88\x1642s\x1c\xa3%\xcb%\ -\x9c\xc6\xf5\x92\xff)\xae\xe0\xbf\xf6)\x9b\x98(\x9ac\ -M\x0c\xa2\x17/\xb1\x10\x11\x13\xd8\x81\xc7\xa5\xc4\x91\x88\ -\xd8\x1b\x11/0S\xca\xdd\x89\xf3\x95\xed\x03x\xa8}\ -\xaa\x07\xe5\x14\xff:lo\xc5=\x0c\xe0\x0d.G\xc4\ -R\xfd{\xee\xc34\x02\x8fp\x1fS8S\x9c]\x8d\ -\x88\xdf\x15\xbe\x8b\xdc!\xb2\xab\x88\xf4\xe39Z\x11\xb1\ -R\xc7\xad\x02\xcc\x87tf \xe3\x97\xea\x00\x00\x00\x00\ -IEND\xaeB`\x82\ -\x00\x00\x01\x04\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x08\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x94\xc2/8\ -\x00\x00\x00\xcbIDAT\x18\x95]\xd0!K\x83a\ -\x14\xc5\xf1\xdf\x1e\xa7\xc5j\x19[\xb1\xc9\x92\x22\xab\x82\ -\xc1\xb0\xa8\xc1l\xda\x17\x10\xeb`\x03\x0d~\x82\x81\xb2\ -:0\x18\xd6V\xdc\xa2\xe1\x05WDP\xd1\xb8\xe2\x07\ -\x105\x18\xde\xfb\xe0\xf0\x94{9\xfc9\x97{*E\ -Q\xc0&\xae\xb0\x87G\x9c\xe2\x0e\x12\xaa\xb8\xc57\x06\ -\xd8\xc6\x18\x8d\x0c\x1c\x87\xd9C\x1f\x9fXG'\x03G\ -x\xc2=>p\xa3\xd4A\x06Z\x98\x86\xb9\x86y\xec\ -\xbbh%\xd4\xf0\xeaOg1W\xd1IX\x89\xbb\xf0\ -\x15\xdf\x08\xaf\x9b\xe2\xee\xb2\x06\x01^`\x91\xf0\x8c\xfa\ -\x12\xb0\xc09.E\x07\x0f\xd8\xf9\x97\xd2\xcfK\xc2\x04\ -\xfb\xd8\x08\xef\x04#4s\xc2\x04o\x119\xc3\x10\xef\ -x\xc9\x09?8\xc4\x16\xae\x95\x85\xb5\x95\xd5\xfb\x05\x08\ -|+}\x8e\x949\xf5\x00\x00\x00\x00IEND\xae\ -B`\x82\ -\x00\x00\x06\x1d\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ -\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ -\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ -bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ -\x00\x09oFFs\x00\x00\x01\x00\x00\x00\x00\x00\x00|\ -]\xbdz\x00\x00\x00\x09pHYs\x00\x00\x0b\x12\x00\ -\x00\x0b\x12\x01\xd2\xdd~\xfc\x00\x00\x00\x07tIME\ -\x07\xdf\x0c\x12\x0e\x1b\x00\xb3\xf4\x90\xdf\x00\x00\x00\x09v\ -pAg\x00\x00\x02`\x00\x00\x00 \x00\x1f=\x87\xd8\ -\x00\x00\x04\xe2IDATX\xc3\xed\x97YlTU\ -\x18\x80\xbf\xdb\xb9C;3]fa\xe8\x02\xb4@\x99\ -.\xd0R*\xb4\x104b\xc2\xea\x86\x18\x97 \xea\x83\ -F4\xfaf4F_\x5c\xde$\xf2\xa0\x0f&FE\ -\xe2\x83\x01#\xa6\x88@@)E\x81\xcaRZ\xbaP\ -\xbaP\xa4\xdbl\x1d\x0b\x85v\x98i;\xbd>\xdcs\ -\x87)\x9d\xa5`|\xd2?\xb99\xe7\xfc\xe7\xfc\xe7\xff\ -\xce\xb9\xff\xf9\xcf\xbd\xf0_\x17\xe9^\x0d\x93S\x0cX\ -\xac3\x99\x91\x9c\x82N\x96\x19\x1f\x1b%\x18\x08\xf0\xd7\ -\x80\x9bP(\xf4\xef\x00\xd8\xecY\xcc\xce\x9d\x8f}V\ -6\xf6\xac\xd91\xc7\x0dx\x9c\xf8\xbc.\xdc\xfd\xbdx\ -\x5c\xbd\xff\x1c \xddleaa\x09\x05\x8b\xca4\xd5\ -\xeb\xc0\x9b\x80#\xca\xf03\xc0\x0f\xc0\x1e\xa0\xbf\xf7j\ -\x17\xed\x17\xeb\xf1y\xdd\xf7\x06`\xb6\xd8\xd8\xb0i\x0b\ -RR\x12\xc0W\xc0f \x1d\x98\x00\xde\x07N\x01)\ -b\xae\x5c\xe0\x9b\x08\xf3s\xc0c\x80\xf7\xf7_\x7f\xc6\ -\xd9w\xf5\xee\x00\xcc\x16\x1b\x1b7o\x05\xb0\x00>\xe0\ -i\xa0J\xeb\xbf\xe5\x1f\xc1`4\x85\xc7\x8f\x8f\x8f!\ -\xcbz\xadY\x00\xb4\x8b\xfas\xc0\x9e\xdf~\xd9\x8f\xab\ -\xbf{\x92\x8f\xa4x\x00y\x0b\x0a\xb5j\x0fP\x01T\ -\xdd\xb8>\xa8\xe9\xca\x0dF\xd3v\xe08\xd0\x08\x9c\x96\ -e\xfd\x0e`\x0e@(\x14\xea\x10\x0b<\x09\xec\x06^\ -Z\xbd~\x136{\xd6\xf4v\xc0:3\x93\xf5\x8f?\ -\x0b\xf02\xf09`\x08\x06\x03$'\xa7d\x02M\xc0\ -\xac8\xec\xe7\x81\xe5\x11\xed\xb3b\x019\xed\x17/\xb8\ -\x1a\xce\x9eH\xbc\x03s\xf3\xf2\xb5\xea\x87@\x99p\x0e\ -\xe0N\xe0\x1c`\x19\xa0\x88\xd7\x00P)\xcao\x1dE\ -\xa5\x98\xd2\xd2\x13\x03dXl\x88\x09\xe6\x02\x1dMu\ -\xb5Z\xd7\xa7L_\x0e\x00f\xcd9\xb0.I\xa7\xc3\ ->+'1@\xce\xdcy\x00\xcf\x00-\xa0\x9emW\ -_7\xa8\xc7\xef\xebi\x028\x80\x8fD\xfd\x0bM\x99\ -\x9a\x9e\x11\x1f\xc0f\xcf\xd4\xaa\xaf\x01}\x8a\xa2pc\ -\xe8\x1a\xe7jk\xb89t\x0d`\x1b\xb0e\x9a\x10/\ -\x88r4\xacQ\x94D;\x10\x8e\xcdl\xa0\x5c\x92$\ -\xd22,\xf8GnRsd\x1fW:[\x01\xbe\x17\ -\x03\xb7'\x00\xb0\x8a2\x9c:\x83\xc1@|\x00\xb1\xfd\ -\x002\xf0\xaa\xd7\xdd\xaf\xad\x1c\xff\xc80gOVS\ -sd\x1f\x97\xdbZ\x00\xde\x05\xd6\xc4\x01xO\x94o\ -\x01]\xa0\xbe\xce\x98\x00\x16\x9b\x9d\xc5e\x15\xa0\x1e=\ -\x80\xfd\x91\x06\x9ax\x9c\xbd\xd4\xfdQC\xed\xf1\xc3\x00\ -\xc7\x80w\xa28\xf7\x00\x1f\xa3&\xb2\xd5\xc0\x06\x9f\xd7\ -\xc5\xf5A_l\x809\xb9\xe1\xe3\xf7\x06\xf0\x0a\x80\xbb\ -\xbf'\xe6\xf2z\xfe\xec\xe4Rs=\xc0'\xc0:\xc0\ -\x1f\xd1]!\xcaZ\xd4\x14\xdd\xd5T\x7fz\x92\xbd|\ -\xe7\x84\xb2^\x1f\xd9\xdc\xa9(\x0a\xa3\xa3A\xe2Ic\ -\xdd)<\xce\x1e*\x1fX{\xd4hJ5E\x19R\ -\x04\x14{\x5c}x]}\x93:\xa6\xec\xc0\xc4\xe4\xbb\ -\xfc\xb2$I\xdc\xff\xd0F\x8c\xa6\xb4\xb8\x10ng/\ -\x87\x7f\xda\xcd\x89\xea\x03(\xb7\xa3\xfcm \x84\x88\xea\ -\x96\x863S\xec\xa6\x00\xb8o\xdf\xdf\x0f\x02\xf9\x80\x92\ -n\xb6\xe2(.%\x91\x8c\x06\x03\xd8\xecYH\x92d\ -A\xcd\x84\x1f\x00:\x80\xeaC?\x12-\x96\xa6\x00x\ -\x9c\xbd4\xab\xa4'\x22\xf5#\xc37\x13\x02\x00\xcc_\ -X\x0c\xf0\x99h\xa6\xf9G\x869zpoT\xe7\x10\ -%\x06\x00|\x93\x07\x8f\x03\xa4\x18\x8c\x94\x96\xaf\x00\xa0\ -\xb3\xad\x99\xc0-\xff\x14\xbb\x0c\x8bM\xbb\x9e\x9f\xd7\xec\ -N\x1e;\xc8\xa0\xcf\x1b\x138*\xc0\x80\xd7\xa5UO\ -\x03+\x01J\x96V\x86\xfb\x0d\xc6TZ.\x9c\xc1?\ -2|\xdb\xb9\xd9J\xee\xbc\x85\x8c\x8f\x8d!\xeb\xf5\xdf\ -\x09\x08R\xd3\xccq\x01\xa2&\xa2\x89P\x88+\x1d\xad\ -\x00O\x09\x95\x22\x9e\x10\xf0\xf0\x82\x82E8\x8a\x96\x00\ -`\xb1\xdaYr\xdfJ6n\xde\xca\xe2\xa5\x95\xc8z\ -\xfd*\xa0\x5c\xcc]\x90=;7\xee+\x8by\x19\xb5\ -_l@Q\x14'j\x04k\xcf#\xc0!`g^\ -~!\xa5\xe5+\xd8\xf0\xc4\x16\x16\x95UX$I\xda\ -. O\x01%b\x9a]\xf3\x1d\xc5\xe8d9&@\ -\xdcO\xb2\x0c\xb3\x15{f\x0e\x06\xa3\x89\xa4$\x1d\xc5\ -K\x96i\xbbQ\xad(\xcaZI\x92@M\xb1;\x80\ -\x00\xf0\x22\xb0W\x98\x97\x00\xcd\x80Ts\xb8\x0a\xcf\x1d\ -\xe7?n\x0ch2t}\x90!\xf1\x09\x96\xb7\xa0 \ -\xb2k\x8d$I_\xa2\xde\x8a\x00\xfb\x80'\x01.5\ -\x9d'\x10\xf0\x93_X\xd2\x92\x9ea\x91n\x0c]c\ -\xc0\xe3\x8a\xe9#.@\xa4\x0cx\x5c\x8c\x8f\x8d\x22\xeb\ -g\xecB\x8d\x8dm\xa8A\xfa(0\xd8\xd1\xda\xc8\xd5\ -\xae\xb6p\xc0u_\xe9\xc0QTJg[3\x13\x13\ -\xb1\x7fT\xee\xea\xc7\xa4l\xf9*\x1cE\xa5\xc8\xfa\x19\ -a]wW;]\x9d\xadSR\xect\xe5\xae\x7f\xcd\ -dY\x8f=3\x1b\x9dNf\xc0\xeb\x22\x18\xb8uO\ -\x8e\xff\x17M\xfe\x06<\xc9\x9b\xa3b\xcb\x06=\x00\x00\ -\x00%tEXtdate:creat\ -e\x002015-12-18T14:\ -27:00+00:003\x90\xe8\xec\x00\ -\x00\x00%tEXtdate:modi\ -fy\x002015-12-18T14\ -:27:00+00:00B\xcdPP\ -\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01Z\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0e\x00\x00\x00\x11\x08\x06\x00\x00\x00\xed\xc8\x9d\x9f\ -\x00\x00\x01!IDAT(\x91\xc5\xd3\xbf+\xc5Q\ -\x18\xc7\xf1\xd7\xe5\x86\xe4\x12\x8b\xd1j5\xca\x8f.!\ -\xe4\x0fP\xc4\xceD\x06e\x91\x12\x7f\x81\xcd \x19d\ -\xb0\xc8d\x91\xc1f\xfe\xda\xc8b\x10I\xa9\x9b\x9f\xc3\ -9\xd7\x8f\xd3\xa5L>u\x86\xf3<\xe7\xfd\x9c\xf3\x9c\ ->O.\xcb\xb2\x02\x96\xd1\xe0S\x8d\xa8\xf6]\xb5\xa8\ -/o\xf2x\xc0\x0e\x0ep\x85M\xdc\xe35\x01\x1fQ\ -\xc2\x14\x86\xf21x\x86N\x1c\xa2\x1d\x0b\x15@\x98A\ -\x11\xc5\xaa/\xc1Kt\xa3\x03\xbb\xa8K\xa0E\xcc\xa3\ -\x17YU\x92\xbc\xc30\x9ep\x84\x96\x18_\xc5$z\ -pQ\xee1U\x09\x13X\xc3)N\xe2+\x8a\xb8)\ -\x1f\xaa\x04\xc2[|\xda\x05\xc6\xd1/|\xd8\x87rY\ -\x96\xfd\xc0\xfe\xae\xb4\xc7\xff\x07g1\xf8Wp\x09s\ -\xd8\xc6t\x9a\xac\xf4\xab9\xaccD0D\x93\xe0\xa8\ -6\xac\xfctc\x0e\x1b\xa2\xadp\x8dstaL\xf0\ -q>\x05\xab\xb1%xu\x00\xb7_r\xd7\xe8C\xab\ -0\x0c\x852X\x83=\xc1b\xa3\xb1`s\xb2\x0a\xb1\ -\xe7\x17\x1c\xe7\x85\x19\xdb\xc7P,\xf2(\x8c\xdas\xd2\ -F)\xe6\xc0;/f:\x9b\xed\xa3J\x96\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x02\x0c\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0e\x00\x00\x00\x0f\x08\x06\x00\x00\x00\xd4\x14\xfet\ -\x00\x00\x01\xd3IDAT(\x91\x8d\x90\xbfk\x13a\ -\x18\xc7?wy#I\x04\xc1HMq(m\x22\xa5\ -\x15/\x15DA\xed\xdda\x8d.\x82q\xabm\x97\x03\ -AJ]\x5cJ\x97\xc6?\xc2\x1f\xc5\xd1\xc9\xae\xea\x5c\ -\xa5w7\xd4\xa1\x08=\x0bbQ\xc8-\xd23%C\ -\x04\xf1\x02i\x1c\xbc\xf7\xed\x05\x1c|\xb6\xef\xe7\x9e\xe7\ -\x9e\xf7\xf9hc\xe5\xca7\x8ej\xd6\xb6\xccm\xd7\xf3\ -\x17\x81\xe5\x84m\xdb\x969\xebz\xfe4\xe0\xcbF\xf1\ -\xec\xe9\x93\xb2\x0c\xcf\xd7\xd6\x86\x01n\xd6j\xe3\xf5\xfa\ -\x9d2\xc0\x97\xbd\xbd_\xc1\xce\x0e\x86a\x14\x1f7V\ -\xd5\x06Q*\x95\x8e\x82\xc8\xea\x00\xb9|>#y\x14\ -E:\xff(\xd1\xe9t>\xcb\xa0\xebz\x07\xa0\x7fx\ -\xf8]\xf28\x8e\xbf\x02d2\x99V\x14E\xea\xa9\x9a\ -\xe38\xb7S?\xda\x02\xda@\x05\x98HX;\xe1'\ -\x80)\xb5\xd1\xf5\xfcG\xa9\xc1\xd0\xb6\xcc\xb6\xeb\xf9\x97\ -\x80\xfb\x09\xdb\xb5-s\xcb\xf5\xfcq\xe0\xa5\x1al4\ -Vk2\xac\xbfZ\x1f\x01v\xa7\xaf]\xbdx}f\ -\xa6\x06\x106\xc3\xa10l2991\xfcpiI\ -\x89\x14U\xc3P\xeb^\x17\xde\x08\x80\x93\xc5S\xc7\x14\ -\xef\xf7\xb3a\xd8D\x88\xac> \xb2\xdb\xed\x1e\xa8\x83\ -5-\xfe\xdb\xdb\xff)y\xaf\xd7kKqi\x91\x9a\ -\xe38\xf7R7\xbe\x03Z\xc09\xa0\x9a\xb0\x03`\x03\ -(\x02W\xd2r.\xa4\x06?\xd8\x96\xd9r=\xff4\ - y\xd3\xb6\xcc\x0d\xd7\xf3\xcf\x00J\xa4XX\x98_\ -\x91as\xd3}\x0f4\x0d\xe3\xfc\xadj\xb5\xba\x02\xd0\ -\xfa\xd1\xfa\x18\xc7\xbf_\x9c\xadTF\xe6\xe6\xe7\x94H\ -q\xb7^W\xeb\x82\xe0S\x0e`tt\xec\xb8\xe4A\ -\x10\xe4<\xcf#_(\x0c\x88\x14\xfcgi\x9a\x16\x0f\ -\x88t\x1c\xe7A\xea\xfb[`?\xb9\xefr\xc2\xf6\x13\ ->\x04\xdc\x90\x8d\x7f\x00\xbf\x16\xa5`bD\x0f\x81\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01}\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x14\x00\x00\x00\x10\x08\x06\x00\x00\x00\x16\x18_\x1b\ -\x00\x00\x01DIDAT8\x8d\xad\x93A+DQ\ -\x18\x86\x1f#\x8d\xc8l\x94\x14QC\x16\xa2,N\x83\ -\x8d\x8dbJI\x8d,X($\x14\x0b!)%;\ -eq\xcb\xf0c\xf8\x09\xde\x95\xad\x85\xb2\xb1\xb1`c\ -cc\xe1\xbb:\x9d\xb9\xf72x7_\xefw\xcf\xf7\ -\x9c\xf7\x9e\xd3\x81\x14I:\x95\x94K\xfb\x9e\xa6\xc4\x01\ -I\x1d\xc0!0\xf7/@`\x15h\x02v\xeb\x056\ -\x84\x0d\xfb\xcd\x07\xa0\xc7Z%\xe7\xdc\xed_\x12\xcex\ -0\x80\xbdz\x12&\x017\x03_\x91\xd4\xfb+\xa0\xa4\ -\x22P6\xfbl\xb5\x11\xd8\x0e\xd6\x95$u\xfd$\xe1\ -\x06\x9f\xe7\xfa\x0eL\x02\xaf\xd6_\x97T0\xd8(p\ -\x03D\x99@Iy`\xc5\xec\x95s\xee\xce\x1bj\x03\ -\xd6\x0cv\x0d\x14\x80yI\xd3Y\x09\x17\x80v\xe0\x0d\ -8\xb3^\xe4\xa5\xdc\xf7`\xb1\xaa\x92\x9a\xd3\x80\xf1e\ -\x5c8\xe7\x9e\x00\x9cs/^\xca\xce\x00\x06\xd0\x0f\x1c\ -\xd4\x00%\x8d\x00\xe3\x96\xe6<\x18\xf2S&\xe9HR\ -_\x98p\xcb\xea=p,i\xca6\x9a\x05.\x81\xc7\ -\x0c`\x1e\xa8~\x01\xed\xf6\x96\xcc;`\x07\x980?\ -\x06,\x02\xc3\x19@\x80\xb2\xa4J\x9cp\x19h\x09\x16\ -\x14\xad\x0e|\x03\xf2\x15Ij\xcdQ\xfb2\x00\x06\xad\ -\x0e\xd5\x01\xec\x06N>\x00o\x01\x5c\xe2;\xefo\xbb\ -\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01u\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0b\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc0\xbd\x85~\ -\x00\x00\x01\xcfy\xce=g\xa2!\xc9n\x5c\xc3!\xfc\ -\xc2F\xfc\xc0\xcd\xaaz\xaf\x13\x1eO\xf22\xc9i\x1d\ -\x92\xcc%YJr\x0e&I\xb6c\x11g\xaaj\xc5\ -\x14\x92l\xc6s\x5c\x18p\x19\xb7\xd6\x13BU\xfd\xc6\ -%\xdc\x18p\x0cO\xd6\x13v\x05\xaf\xb1m\x06?\xab\ -j\xb5\xb5\xdc\x87\xa3X\xc6a\xec\xac\xaag\xad\xe6\xdb\ -\x80\x17IN\xb5\x87\x19\xdci\xe7>\xb64\x93\x03X\ -\x19\xf0\x10\x0bIf\xab\xea\x03\x96\xb0\x80/U\xf58\ -\xc9&\xdc\xc5\xed\xa1\xaa\xfe\xe2js\xd3\xfe\x7f\x11\xef\ -Z~\x1d\x0f\xaa\xea\xfb\xd0\x06x\x85!\xc9\x0e|\xc5\ -,\xc6\xed\x9c\xc0S\x18\xba\xa1\x971\xdfo!\xc9A\ -\xbc\xa9\xaa\xb5q\xa0\x11\x8fp\x0f[\xb1\x17Gp\x12\ -WF\xc1d\xcai\xb1\x85k\xed\xdeSUs#\xdf\ -;\xc3.\xec\xef\xf2?=9-\xfe\x88U\xfck]\ -7\xf4\xe40%>\x8f\xb7\xf8\x8cO8\xdb\x93\xff\x01\ -?\x07g7v\xdb#C\x00\x00\x00\x00IEND\ -\xaeB`\x82\ -\x00\x00\x01\x03\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x13\x00\x00\x00\x11\x08\x06\x00\x00\x00?\x98\x97\xc7\ -\x00\x00\x00\xcaIDAT8\x8d\xed\xd2=J\x03Q\ -\x14@\xe1od2\xa6\x11W\x90F\xec\xd2Y\x84\x08\ -.!\xe0\x02DHe\xe1n\xa6\xb2Nm'$\xa5\ -\x16YA\xba\xb1\xb0\xb1\xc8\x16\x04GL\x8a\x99\xe0\xf8\ -\x08f^\xb4\xf4\xc0\xe5\x15\x17\xce\xbb\x7fIQ\x14\x0f\ -\xb8\xd0\x9e\x15\xae1\x0b\x13)Fx\xc6\x02\x07;D\ -=\x0cq\xba-\x99\x22\xc1\x13n[Tu\x82\x17\x5c\ -\xa1\xdfp\x1ca\x99\xb6\x104\xf9\xa8\xdfA\x1d\xdf\xd8\ -\xd5V\xc8\xab\xaa\x930\xee\xf0\x16+\xfb\x89\xf7\xb0\xcd\ -.&\xf5o1\x9cQ\x0d\xaf\xc9\xa1j\xbb\xe3H\xd9\ -\x14\xf9\xb6\x05\x94\xb8\x8f\x94\x1d#\xff\xcb\x99Eo\xf3\ -_\xf6%\xfb\xfc\xa5\xa7D\xb69\x8dKt\x90\xed)\ -K6\xb29\xceq\xd3H\xae\xf6\xa8\xecq\x0d\xfe\xb1\ -\x1c=z\xc7\xebp\x00\x00\x00\x00IEND\xaeB\ -`\x82\ -\x00\x00\x01)\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x12\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1b\x06/\x5c\ -\x00\x00\x00\xf0IDAT8\x8d\xd5\xd2/K\x83Q\ -\x18\x05\xf0\xdf\xe6\x9a`0h1\xbb&\x13\xee'\x10\ -\xf4KX\xd4l\x10\xecV\x99E\xa3q3\x1b\xd4b\ -5\x18\x9f0\x0d6\x83`S\x04\xa3 \xce\xe0\x8b\xbc\ -\x5c\xdc\xdd\x16=\xed\xdc?\xe7\x1c\xce\xf34\x22bh\ -4\xeeRJ\x9d\xc2\xfd/\x9a\x93<\xfa\x9fB-l\ -\xd7\xf8:^0\xa8\xf8\xdb\xa4B\x8d:\x89\x88\x1e\x06\ -)\xa5\x93\xec|\x07\x07\x05\x9d\xe7V\xc9%\x22\xf6\xd1\ -\xc7\x1c\xeeG\x88\xb5\xd1\xcd\x13]c\x15\xef\x18b\x09\ -\x9f\xb8\xc40\xa5\xb4\xf5\x87Y\x07\x17y\xa2W\x9c\xe3\ -\x0a\x0b\xd8\xc5)\xe6\xb1RJ_\xec(\x22\x9a)\xa5\ -\xaf\x88\xd8\xc3qA\xe7)\x8f\xd9\xab>M\x8db\xd9\ -5\x83\xb1\x89\xc6M\xed\x01\x87\x15\xedOS\xf626\ -#\xe2\xc8\xcf\xd6\xcf\xe0\x0c\xb7x,\x99\xe6B\x1b\x98\ -\xc5G\xc5o\xd0\xc5\x22\xd6*\xf7\x1cm\xb2\xa9\x8d\xc2\ -$\x9b\xfd\x0d1\x8aV\x95q\x1f\x8eP\x00\x00\x00\x00\ -IEND\xaeB`\x82\ -\x00\x00\x02\x01\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x11\x00\x00\x00\x14\x08\x06\x00\x00\x00k\xa0\xd6I\ -\x00\x00\x01\xc8IDAT8\x8d}\xd3\xcf\x8b\xcdQ\ -\x18\xc7\xf1\xd7\xdc\xaeD\xc9(4\xca\x1d\x1b\x16\xc4\xea\ -\xa2\x98\x85\xc5\x10eAhJj\x84\xf8\x0b\xb0\xc4\xca\ -\x86\xa4&c\xd6\xb2\xa04%\xc9\x8f\xe4\xc7$\xc4\xbd\ -+3S\x16\x16D\x94_%\xc5\x8c\xb8\x16\xe7\xf96\ -\xdf\xf9\xba\xdf9\x9b\xcfs\xcey\xce\xfb<\xcfy\x9e\ -\xd3\xd1j\xb5\xb4\x1b\xcdf\x13\x06q\x1c?by\x1f\ -&p-\xef\xdb\xd1h4\xdaBb\xf4c>\x06b\ -~\x13\xfb\xf19\xefT)9\xbc+\xf4\x0a6\x87=\ -\x0b\xbf\x8a\x802\xc8\x06\x5c\xc5JLb\x07:\xb1\x08\ -\xbbs~\x8bq\x06\xab\xdbAN\xa2\x8a\x13\xb9\xb5\x87\ -x\x1f\xba0\xa2\xbb\x8e\xa7\x18+B6bk\xd8}\ -\x11\x0d\x5c\x08\xdd\x84\xb3x\x80\x1e\x0c\xa3U\x84d\xb7\ -\x7f\x88T\xb3\xf9eSo\xb1\x0d\x7f\xf07;\x94\x87\ -\xac\x8b(\xbec\x8b\xf4\x1e}X\x8e\x9f\x18\x0a\xbf/\ -\x91Rov>\x0f9\x1a:\x841\x5c\x8a\xfdc\xb1\ ->\x18\xe0\xf31\xdf\x89&\xb6g}\xd2\x8d\xd7\xb1\xd9\ -\x1d\xe9\xac\xc2\xa8T\xd6\xa5\xf8\x8a\xf5x\x9e\xbbx6\ -\xe6f\x91\x1c\x92*2\x1c\x00\x18\xc7]\xcc\x91\x9a\x0e\ -\xe6\xe1H\x0e2\x81o\x95\x08\xf9@.\xe4\xfc\xb8\x18\ -z0\xf4I\xf8N+HEj\xae\x1a\xde`\xa4\x00\ -\xb9\x15i\xac\xc1\x0a\xe9\x81\xefDZ\xd3 \xbda\xdf\ -@\xf17N\xc6!R\xc5\xe0\x14\x9e\xe5\x9d\xaa\xe8\x0a\ -\xfb\x95\xf6c<\xb4\x06\xf5z\xfd?\x87\x8a\xa9&\xaa\ -\x95@\x96\x85~,\xd9W\xc1\xbd\xb0\xfb\xb1\xa0\xb0\xbf\ -\x04{\xc2\xbe?\x13d\x04\x8f\xa5\xb4nc\xad\xf4\xed\ -{\xa4\x12wJ\x9f\xede\x19\xa4\x1a\xba\x17\x8f\xa4W\ -\x7fQ\xf0\x19\xc5\xe12@\x16\x09\xbc\x8b\x08\xce\xe1-\ -~K\x1d|Zj\x81O3A\xfe\x015\x8de<\ -wk\x85?\x00\x00\x00\x00IEND\xaeB`\x82\ -\ -\x00\x00\x01\xba\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x15\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf9\xda4%\ -\x00\x00\x01\x81IDAT8\x8d\xa5\xd1M\x88\x8ea\ -\x14\xc6\xf1\xdf\xfb6>\x92\x92|Dij4\xa1\xec\ -8\x1b+5\xb1\x18f\xa1f\xc5J1\xc3DVR\ -H!+;\x14\xc9J\xd2lf\xe3\xabdg)\x97\ -\x94\xb2\xb1 e\xc9\xdeJ\x16\x9eW\x8f\xe9\x19\x93q\ -V\xe7>\xd7\xb9\xfe\xf7\xb9\xef\xd3\xb3\x84H\xd2\xc3.\ -L\xe0 f\xaa\xea\xcd@\xef/`\xda\x94d\xef_\ -\xb8}\x5c\xc0e\xacn\x03ah\x01\xd3q\xec\xc1\xcb\ -\x05\xf4Q\x8c\xe1\x1df\xbbn\x9c?e\x1fS\x18O\ -\xb2\xbdC_\x87\xc7\xb8\x86\xdd\xb87\xbf\xa7k\xd2q\ -\x0c7\xf9\x19\x9cj\x01\x97\xe3\x01\xceV\xd5\x93\xa6\xfc\ -m\xd1Iq\xb2\x95\x1fM\xb2\xb6\x01\xf6p\x15\x17\x07\ -\xc0$\x9b;\xfc\x7fB\x93\x0c\xe3@\xab\xb4\x0a\xd3M\ -^\xb8SUo[\xfaX\x92\x1d\x8bM:\xd5Q;\ -\x9dd\xa8\xaa^W\xd5\xe7$\xd3IF\x1am\x16\x97\ -\x92l\xe8\x84&\x19\xc2\xb1\x8e\xd7l\xc1d\xd33\x83\ -\xbb\xb8\x01U\xf5\x03\xd71\x97d\xe5\xc0\xd0kA'\ -1\xd7\x01\x85W\xb8\x8f\xdb\xad\xdaDU=k\xbc7\ -\xb1\x11\x87\xd1kC_`\xff\x02\xd0\xae\xf8\x88\x9dU\ -\xf5=\xc9\x1a|@\xf0\xb4\xdf\x00G\xb1\xef\x1f\x80\xb0\ -\x15\xe7\x9a|\x19>\xf9\xb5\xe4m\x83?\x9d\xd6\xfa\x8a\ -\x7f\x88\xf3IF\xaa\xea+\xae\xe0=FzIV\xe0\ -\x0b\xd6/\x01\x0a\x8f\xaa\xea\x10\xbf\x97=\xd6Kr\x04\ -\x0f\x97\x08\x1c\xc4xU=\x1f\x1c\xfa8\xf1\x9f@\xb8\ -\xd5\xbc\x18\xfc\x049\xa0\x7f\x85\xe9\xdfLL\x00\x00\x00\ -\x00IEND\xaeB`\x82\ -\x00\x00\x01\xb8\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x11\x00\x00\x00\x12\x08\x06\x00\x00\x00\xbd\xf95T\ -\x00\x00\x01\x7fIDAT8\x8d\x95\xd3;hTQ\ -\x10\xc6\xf1\xdf\xbd((jv;\x05+\xc1\xad\x04!\ -0\x8d\x8d\x16\x82\x88H*A\xd2\xd9\xf8\xa8\x04\x1b5\ -\x82\x9d\x06;\xed\xc4B\x10\x0b\xedl$\xb0`e\x93\ -\x22\x0e\xda\x1bS\x89/\x10\x82\x16\xc1g\xb4\xc8\x89\x5c\ -\xd7\xbb\xbbf\xe0p\x98\xef|\xe7\xcf\xcc\x1cN\x95\x99\ -\xbd\x88X\xb4\xc1\xc8\xccI\x5cA\xa7\xca\xcc{\x98\xc6\ -\x02nF\xc4\xa31\x97\x8f\xe1\x01:E\xba[ef\ -\x0f/\x1b\xbek\x11qu\x0ch\x19\xdd\x92\xee\xadK\ -+\xcbE\xf8\x85'c\x00w\x0a\xe03>F\xc4R\ -]\xce\xfa\x98\xc3\x0f\xf43\xb3;\x04p\x02\xa7\xf18\ -\x22:8\x05\xeb\x903\x11q\x1c\xfb\xf0\xd5\xda|\x06\ -\x01{p\x1f\xd7#b\x0a\x22b\x0e\xaa\x16\xf3v<\ -\xc3+\xac\xcf\xa6\xc6C\xcc\xb4\x0d\xfe\x1fH\x03\xf6\x0d\ -\x9b\x1b\xd2\xdb\x88\xd8\xdd\xe6\xad\xdb\xc4\x12+\x03\xf9\xf7\ -a\xc6Q\x90\xff\x8eQ\x90\xc1\xb3m\x1b\x82d\xe6I\ -\xac\xe2ic\xc9\xcc\x1bm\xfe\xb6\xd7\x99\xc5y\xf4\x22\ -\xe2]C\xdf\x82\xf7\xd6\x9e\xffhD\xac\xfeUIf\ -\x1e){\x1f\x971\xdd\x04@D|\xc1A\x1c\xc6R\ -f\xee\xcc\xcc\x99?\x95d\xe6\xa7R~\x17\xb7\x22\xe2\ -\xc2\xb0\xfe3\xf3\x1cn\x17\xffJD\xec\xa8\xca\x97~\ -^<\x1f\x22b\xd70@\x81L\xe05&\x8at\xa0\ -\xc6\xc5\x86gkf\x1e\x1a\x05\xc1$\x16\xf1\xb3\xe4\x97\ -\xaa\xcc\x9c\xc7\x1b\xccF\xc4\x8b1\x80fE\x9bp\x16\ -\xfb\x7f\x03$D\x8d]u\xca0\xbc\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x04\xe6\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a Set object h\ -eight 1\x0d\ -\x0a \ -\x0d\x0a \x0d\x0a \x0d\x0a \ - \x0d\ -\x0a \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x01h\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x0c\x00\x00\x00\x10\x08\x06\x00\x00\x00\x22a\x9e\x07\ -\x00\x00\x01/IDAT(\x91m\xd2!H\x9dQ\ -\x14\x07\xf0\xdf\xf7=\xf0\xa5!\x82\x93\x85\x85\x81E\x96\ -\x0c\x074mma\xb0\xf0\x94\x19\xb5Y\xc4<\x1cC\ -\x04\xe3\xb3\x8a\x0b\xa6\x85\x85\x19\x1e\x0c\x8b\xc50\xb4\xdd\ -&cF\x8b\x08o,\x092\xa6\x8c\x85w\x95\x8f\xbb\ -\xef\xa4{\xcf\xff\x9c\xff\xff\xfc\xcf\xbd\x95\x96H)=\ -\xc5\x17\xbc\x89\x88_M\xacn)\xee`\x0f\x17\xd8(\ -\xf1\xaaQ8\x89>z\xe8\xe0;\xa6\xf1\x0d[\x11q\ -\xf6\xa0\x90R\x9a\xc1\x0f,c\x1cG\x111\x8f)\xec\ -\xe3 \xa5\xb4\x04UJ\xa9\x9b\xe5\x9f4\x94\xb7#b\ -\xb3\xa1>\x85\x13\xf4j\xac`\xa2\x18\xf5\xb2y\x89\x88\ -!\xde\xe1C\x8d\xb7\xe8\x16\x0d\xbfK\xb38\xc4\x5c\xdd\ -\xc2\xde\x1a\x11q{o\xfa\xbc\x05\xaf\xcaD\xf6qS\ -\x1b\xed\xfc\xba\xc0\x1f\xb7\x90\xac\xe1\xa0\x8e\x88S\x1c\xe3\ -O\x03|V\xb0/b\x01;UN\x8c\xe13^\xe1\ -\x11\xce\xf2\xf99V3\xc1bD\x5cV\x05\xd3\x1c\xd6\ -\xf1\x1a?q\x87M\x0c\x22\xe2o\xab\xb9\xdc\xd8\xc7\x0b\ -|\x8a\x88\xdd&\xf6\xdf\xe7\xcb\xf1\x1e_\xf1\xb1\x04\xee\ -=\xcc\xe2\xa5\xd1\x9bt\x8d\xfeP'/b\x98G\xbb\ -\xc2\xe0\x1f\x06\xdbU3\x9dA\x19\x09\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x01O\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x13\x00\x00\x00\x12\x08\x06\x00\x00\x00\xb9\x0c\xe5i\ -\x00\x00\x01\x16IDAT8\x8d\xe5\xd4=/DA\ -\x14\xc6\xf1\xdf\xae\xcd\x8d\xd7H\xd8\x88\xc6&tJ\x89\ -B\x22\xdb)t(\x84\x8f\xe0\xa5\xf09T:\x85\x1a\ -A\xa3Pjt\xbe\x00\xb2\x05\xd1\xa0\x14B\x16\xbb\x89\ -(\xee\xacl.\xb9w\xb3JOu\xe6\xccs\xfe9\ -3g2\xb9J\xa5r\x8e)\xed\xe9\x18\xcb\xa8A\x01\ -\xe3a\xe3\x05\xcf(\xe2!\x050\x84W\xf4a\x01\x07\ -\x0d`!\x18\xea(a\x04\xdb(\xa7\xc0\xf6\xb0\x8f+\ -\x9c\x06\xe0!\x96\xf2\xc1P\xc5S\xabg\x0b\xba\xc5l\ -\xa8\x9b\xc7Q>\xdd\x9f\xa9kl\x84x\xae\xf0\x8b\xa1\ -\x88\xc5\x14@)\xb1\xde\xc5\x16\x06\x92\xb0{\x9ca\x06\ -\x11z\x9a\xf6\xde\xf0\x8eK\xf1}5\xf4)\x1e\xc8\x0f\ -\xd8#VS\xbaJU\x12\xd6\x8b\x15td\xd4U\xb1\ -\x83\x8f\xe6dr\x00\xa3Xo\xa1\x895Lfu\x06\ -w\xd8\xcc\x80\x95\x91K&\xff\xfa4\xfe3\xac\x0b\x83\ -m2\x22\xf1\x0f\xf2=\xcdH\xfc\xedT\xd1\x89\x9b\x0c\ -\xc00&\xc4\xef\xb1?\xd4\xd4\x0a\xb8\xc0t\x00F\xc1\ -<\xd6BG\xddMq\x1d'_\xecY0\xc6f\xd8\ -\x84\x84\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01/\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x08\x00\x00\x00\x10\x08\x06\x00\x00\x00+\x8a>}\ -\x00\x00\x00\xf6IDAT(\x91m\xd0=+\x86\x01\ -\x18\xc5\xf1\xdf\xf3\x84\xb2\xb0\x89\xf4$\xe4\xa5\x8c\xae\x12\ -\x8b\x922\xd9\x18\x14\xa3\x85\xd5\x8a\xcf`\x90\xcd\xcb&\ -e\x91\xcc>\xc0UH^V\x93A\x8aE\x8a\xb0\xdc\ -wn\xe5l\xd7\xe9\x7f\xaeN\xa7\xa6Pf\x0e\xe1\x1c\ -w\x98\x8e\x88/\xa8\xfb\xd5\x22v\xd0\x8e\xd1\xd2\xac\x02\ -\x9fh\xa0\x05\x1f\xa5\xd9T\x01\x0ep\x8dK\x5c\xfd\xf7\ -\xe1\x15\x0f\xb8\x8d\x88\xef\xff\x80u\x0cb&3;\xff\ -\x00\x99\xb9\x899\x1c\xe1\x19W\x999\x09\xb5\x02\xb8,\ -\xfa\xacb\x1e\xb3h\xc5[Sfv\xa1\x1f\x138\xc4\ -MD\xf4\x14\xc1\xaezQn\x19Cx/v\x00\x11\ -\xf1X+\x8f\xcc\x5c\xc2\x02\xc60\x1c\x11O\xd5\x92\x0d\ -\xac\xe1\x0c7\xb8\xc8\xcc6\xa8gf3\xb6\xd1\x8bc\ -\xec\xa3\x03\x93\xe5\x92\x1b\xf8\xc2xD\x85\x9fX\x87\xdbU\x95uc\x11\x97\xca~\x0f\ -L\xe2\x03:\xaa\xc8&p\x00\x9f\xb1'~o\xc5\xd1\ - \xf8\x1e\x1d\xec\xca\x93\xd5\xd1\x17\xfey\xf4\x87?\x8d\ -\xe7-\x84u\xdc\xc0\xee\xc8\xe9\xc7\xeb\x88\x1dA_\x0d\ -\xab\xf1\x02\x9bsU\x5c\xc1}\xcc\xa0\x177q(\xda\ -k\xc5(\xae\xe3G\x863\xd8\x88\xf7\xf8\xaa\x1dk\xd1\ -\x89_xT\x10\xef\xc5\x02F2I\xa7\x078\x8b\xb7\ -\xb9\xc4\x83\xb8\x16\xf6\x02\x8e\xe3[.\xe72\xb6b2\ -\x93\xf6iTZ\xceV\xec\x97\xa6\xda\x90\xb4|\x22\xad\ -\xc2>i\x00+8-i9\x90I\xda\xac\xa0\x81\xc1\ -hk\x18\x87\xb1\x1c\xb1\xf1x\x9f\xf5g\xff\xaeb\x1e\ -\xe7h_\x8d\xa6\xa4\xcdX\xb4\x9e?\x9f\x8b\xd1\xd2\x89\ - \xf9K\xe3<\xd9;\xec\x95v\xa8\xec\xd4j\xd2d\ -{\xf2dE\xe7\xb4\x05C\xd2\x94\x8ap\x17\x17\x8a\x02\ -Ed$]f\xc3\xde\x86\x0d\xd2\xad~\x91$(-\ -\xb9\x0a\xc3\xb8\x855x\xa9\xfd\xbc\xfe\x8bl\x08\xa7\xa2\ -\xca)l\xafJ\xfe\x0dZUP\xe3\xae\x0f\xedJ\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xfc\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x17\x00\x00\x00\x12\x08\x06\x00\x00\x00\xb0\xe7E\x13\ -\x00\x00\x01\xc3IDAT8\x8d\xad\xd4\xcd\x8bNa\ -\x1c\xc6\xf1\xcf\x19/y\x9d\x85\x97\x14)\xa4\xcc\xc8\x82\ -\xe6\x96\x14EY(Rd\xa3\x89$\x8d\x05\xe5e\x1a\ -ec\x83\xb2\xb2\x90\x8d\x8d\x05v\x96vVVV\xd7\ -)\x7f\x02\xf2\x0f\xc8[\x8a\x1e\x8b\xe7\x9czL\xe7\x99\ -\x19q\xd5\xa9\xfb\xba\xbb\x7f\xdf\xdf\xd5\xef>\xe7T\xbd\ -^\xcfBT\xd7u\x85\xb3\x18\xc7G|\xc6\xb3\x89\x89\ -\x89\xa1\x80\xc5\x0b\x22\xf7u\x1d\xebJ)\xb7 \xc9X\ -\xb3\xf7`X\xc1HUU\xba\x9e\xba\xaeo\xd7u\xbd\ -\xac\xf5\xf8\x81WIv'9\x84\xefX?\xac\xbe\xaa\ -*#]\x1d\x93\x8cb\xa6\x19\xc3\x1f*\xa5\xbc\xc5[\ -\x9c\xd4\x1f\xcfPu\xc2q\x0e\xab0\x9d\xa4=\xf3\x0b\ -cI.b\x0b\xde\xe9\xcf}\xe1\xf0$\x15.7v\ -\x07\x8e5\xeb\xc7\xf8\x86\x8d8\x82Q<\x9b\x0b\xdeu\ -\xa1\x8716\xe0o\xe2e)\xa5\x87\xa7\x1daV\x96\ -R\xbe.(9\xae\xcc\xf2\x07\x92\xec\x9d#\xe0\xda$\ -\x17\xe6\x85'\xd9\x8c\x13\x1d\xe7ff\x9d\xdb\xde6,\ -\xa5|\xc0\xd2$\xa7\xe7K~\x09\x8b:\xe0\xa7\x92l\ -m\xc1x\x8d'I\xda\xb1>\xc6T\x92\x83\x9d\xf0$\ -K1\xd5\x01\xd64\xbc\x91dg\x03\xde\x84]\xb8\xd1\ -\xa4\xef\xe1\x1a^$\x19o\x8b\xaa\x01\xf8$\x9e\x0f\x81\ -\xc3W\xfd\x0fg\xdd\xc0\xde7\xec,\xa5\xbco\x18\xf7\ -0\x893\xf898\x96\xcb\xe6\xd6\xcaY`X\x81G\ -\x03\xfe.\x96\xe0\x0d\x0e\x8e4\x1d\xf7`\xff<\xf0a\ -:\x9e\xe4d\xb3\xde\xd7\xc0a[\x9b|\xf6\xeb\xf7\xb7\ -z\x98du)\xe55\xb6\xe1\x0e6TI\xd6\xe8\xff\ -#\x96\xffc\x83\x07\xa5\x94\xe9\xd6$Y5\x82\xf3\xff\ -\x01\x0cW\x93\xecnM)\xe5\xcbb\xfd\xdb\xfd\xf4\x1f\ -\xe0p\x1fG[\xf3\x1b\xdb,\x90K\x95\x7f\xdek\x00\ -\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x01\xb8\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x15\x00\x00\x00\x0e\x08\x06\x00\x00\x00\xc0\x06W\xce\ -\x00\x00\x01\x7fIDAT8\x8d\x8d\xd3\xbdk\x15Q\ -\x10\xc6\xe1g\xaf\x17EQ\xd1\x18E\x04\xb1\xd2F\xcb\ -\x01k\x0b\xed\x82\xa4NH\xa1EH\xa7]\x08\xa2H\ -\x04M\xa5\x85 \x8a \xe2_ X(\x08\x8aU\xc0\ -)\xc5\xc2&\x85\xe2g\xe7G\x22\x92\x0f\x8b\xdd\xab\xeb\ -\x82\xbbw\xba3\xf3\xce\xef\xcc9\xe7=\x85Fd\xe6\ -fLa\x0cG\xb1\x17[\xd1\xaf$k\xf8\x81\x0fx\ -\x81k\x11\xb1Tg\x145\xd8q\xdc\xc11\xf4\x9a\x9b\ -u\xc4\x1bLF\xc4\xcb?\xd0\xcc\xbc\x8b\xb3\x0d\xe1\x0a\ ->\xe3#~V\xb9-\xd5\xe4\xfb\xb0\xa3\xa1\xdf\xc0\xa5\ -\x88\x98/2\xf3\x02\xe6k\xa0\x07\xb8\x12\x11o\xdbF\ -\xcb\xcc]\x98\xab\x86\x19\xa9\x95\xc6\x8b\xcc\xfc\x86\xedx\ -\x84\xd3\x11\xb1>\xd4\x81\xff\xdd`\x12\xd71\x8awE\ -fn`-\x22\xfa\xed\xad\x9d\xe0Sx\x82\xf5\xc1\x83\ -l\xca\xcc\xd7\x999\xd2\xd27h\x9e\xce\xccC\xb5\xf5\ -\x91\xcc|\x8e\xc7U\xaa(2sYi\x19\xf8\x8a=\ -\x11\xb1\xda\x00\xf5q\x15\xd3\xca\x07\x9a\xc5+,(m\ -W\x8f\xef}\xdc\xc6\xb9*\xb1\x13\x13\xb8_\xc1F\x95\ -6\x1b\xf3\xd7\xa7p\x11\xdb\xfes\x98\x87\xbd\x888\x8f\ -\xa7\xb5\xe4\xfe\x0a8\xa3\xb4\xd4x\x03\xa8\x05\xf8\x1eg\ -z\x10\x11'1\x83/\xaa\xab\x88\x88[\xb8\xa7\xf4_\ -W\xac\xe2\x19\x0eG\xc4\xaf\xa2K\x9d\x99\x07\xb1\x88\x03\ -\x8d\xd22\x96\x94_\xf5rD|\x1a\x14:\xa15\xf8\ -\x14n`7f#ba\xd8\xdea\xe073\xf3D\ -\x9b\xe67\xefB~?\xd8\xe7\x90V\x00\x00\x00\x00I\ -END\xaeB`\x82\ -\x00\x00\x02\x0e\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00\x12\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1b\x06/\x5c\ -\x00\x00\x01\xd5IDAT8\x8dm\xd3M\x88\xceQ\ -\x14\x06\xf0\xdf;\xc6\x82)\xb10jl|5\x92\x8f\ -1u\x94\x90\x95\x95\x9a\x94\x12j2\x09[\x1a6,\ -H6\xa3|\x84\xcd\xa4h\xb2\xd1\x88\x99\x85\xaf\x86\xa4\ -\x88l\x8ef\x8a\x15K\xb3@hR\x94\x91X\xbc\xd7\ -\xf4\xce\xbf9u\xeb\x9e\xf3\x9c\x9es\xces\xef\xa9e\ -\xe6\x1cl\xc3hD\x8c\x9b\xc12\xb3\x0fK\xd0\x1d\x11\ -\x7ff\xca\xa9e\xe6\x03\xcc\xc5j\xb4G\xc4Df\x1e\ -\xc2A\xec\x88\x88\x8f\x999\x86\xa5h-g/\x1eF\ -\xc4\xdb\xffDMh\xc7\x1d\xfc\xc5\xfc\x12_\x8cuh\ -)\xfe0\xceD\xc4/\xdc,\xd8\x93\xc6\x8e\x9a\xb0\x1f\ -[\xf1\x1c\x9b!\x22N\xe3\x18\x96\x97\xbce\xf8Z\xee\ -\xdf\xb0\x16\x9f\xa7\x11E\xc4\x8b\x88\xd8\x8d\xe38\x95\x99\ -\x07\x0a6\x80\xdd\xe5\xde\x82\xef\x99\xb9\x08kp\xf6\x7f\ -\xd1)\x8d\x1a\x9d\xcc\x5c\x88\x07\x18\x88\x88\xfe\xcc<\x82\ -\x11\x5cB?\x8e\xe2bD\xdc\xcd\xcc\x1az\x8b\xb6\xe7\ -\xa6\x11\x15\xb2\x16\xdc\xc6c\x5c+z\xacG'\x86\x22\ -b\xa4\xe4m\xc1u\x0caC\xad\x04[\xd1\x19\x11\x8f\ -\x8a?\x1b]\x111\xdcP`\x05\xc6\x11\xd8\xa4\xfee\ -6b\x14\xef\x9bK\xde\x05tg\xe63L\x94Xo\ -\xa5\xd9\x85\xb8\x887x\x8dA\xcc\xc3J\xdco$\x1a\ -\xc3\x95\x88\xf8\xdd\xd0EG\xe9b\x01\xda\xcah7*\ -\x05\xdeR\x11\xbb\xa2\xd5N\xec\xc2>u\x91g\xe1G\ -\x19\xe9\x9e\xfa\x83L\x15m\x9a\x81\xa0\x96\x99'\xd1\x83\ -\x9e\x92<\x88=\x11q\x19?q\xb5\xe83e\xd5\xe7\ -\xefB\x1f>\xa8\xaf\xc7d\x03\xf6\xb2h\xf4N\xfdC\ -\xdej\xdc\xbbf\xd3m;V\xa9/\xe7d\x05\x9b\xc0\ -y\xf5\xbd\xec\xa8.ou\xb4\xc3h\x8b\x88\xb1\xea\xc8\ -\xea{\xd8\x87/XQ\x05\xa7uT\xf4\xf84\x03\x09\ -\x9c\xc0\x19<\xc5\xab*\xf8\x0f\xdd\xdb\x9d,w\xcc\x1f\ -\xb4\x00\x00\x00\x00IEND\xaeB`\x82\ -\x00\x00\x04\xe9\ -\x89\ -PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ -\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ -\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ -\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ -\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ -\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ -bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ -\x00\x09oFFs\x00\x00\x02\xc0\x00\x00\x00\x00\x00\x5c\ -]\xb9S\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\ -\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\ -\x07\xdf\x0c\x12\x0e\x1b\x0b$&IW\x00\x00\x00\x09v\ -pAg\x00\x00\x03@\x00\x00\x00 \x00\xbe\xe6\x89Z\ -\x00\x00\x03\xaeIDATX\xc3\xed\xd6]\x88UU\ -\x14\x07\xf0\xdf\x98\x8e\x96\xa8QIjA\x1f\x04BD\ -\xd0KQ\xf8\x12\x91\x11=\x04\xf5b'\x85\x8e\x88\x8d\ -i\xa7\x14\x02\xc3\xc2\xbe\xa0\xcc,8f\x1aa\xa7/\ -N\x11J\x05RP\xe1C\x1f\x86\x0f\xbe\x98(\x94\x1a\ -F\x94\x85Y\x98\xcd\x80:\xde\x1e\xf6\xbe\xce\x9e\xdb\xbd\ -3:MO\xb5\xe0p\xf7\xddg\x9d\xb5\xfe{}\xfc\ -\xf7\xe2\xbf.]\xcdE\x96\x17Oa\xc5(\xdb\x9f]\ -W\xe5'C)\x8cM\xd6+p\x02\x07p\xec\x1f:\ -\x9e\x82\x19\xb8\x1a\xa7\x0d\x00\x0e\xd4Uy\xc5h\x1c=\ -\xcb\x8b\x06N\x0e\xa7\xd7\x0a\xe0X\x07cS\xb0\x11\x1b\ -\xeb\xaa\xfch\x04``a\x8c\xcc\xea\xba*;\x02h\ -~\xb0\x16S\xf1\x07&`\x12n\xc7\xac,/\xde\xc5\ -\xf7Q\xb5\x0b\xefa:\xaeCo]\x95/%\xa6\x9a\ -5\xb6\x04k\x84\x14\x8f\xc9\xf2bU\x13D[\x00\x98\ -\x17\xd1\xf6cL\xb2\x7f!\xee\x8b\xc0\xc6\xe3\xec\x08\xe6\ -Z,C\x1fR\x00?dy\xb1\x00O\xa3;>\xcb\ -\xb0j\xc8\x08\xe0!\xcc\xc48\xfc\x88\x8bp\x17.\xc0\ -Y\xf1\x99\x8f\x8b\xb1\x07G\xe2i\x8f&6\x1e\x8b\xfa\ -\xeb\x92\xbdo1o\xd8\x14\xd4U\xf9J\x9b\xb4lC\ -\x95\xa4d\x0dz\xea\xaa\xdc\x89\x9dh\xad\x8d?\xf1L\ -\xf2\xffg\xcc\xaf\xabr{\xaa\xd4\xa9\x06\xee\xc0e\x06\ -\xaa\xb8\x0b\xbf\xe1~\xac\xc6\xb9B\x9b\xbd\x9d\xe5\xc5-\ -uU~\x99\xe5\xc5R\xf4\xd5U\xb9!\xcb\x8b\x1e<\ -\x19\xc16\x9d\xcf\xa9\xab\xf2\x8bV_\x9dR\xb0\x14\xb3\ -\xda\xec7\xe2\xd3\x1f\xd30\x11\x1fdy\xb1\x0c+\x85\ -\x22\xdb\x80\xf5-a\x9f\xdf\xce\xf9P\x006\xe2\xb3\xe8\ -,\x95cx\x1d7\x09\xc56\x1e\xe7\xc7P/\xc0\x8c\ -,/~O\xf4\x8f\x0a9\xdf\xde\xc1O\xc7\x1ax\xcd\ -\xd0\xf2j\x96\x17\xbdX+\x14\xdat\xbc)tLw\ -\xd4\xd9\x8f|(\xe7\x1d\x01dyq'.\xd5\x99\xc9\ -\xba\xf0\x0b\x1eF)\xb4\xe3\x84\xe4\xfd^<\x81\xc3\xc3\ -\x1c\xa4c\x0a\x1e\xd4\xbe\x06Ri\x08\xfd\xbcI\xe0\x8d\ -T\xd6\xc7\xc8\xcc\xc6\xae\x91\x00x\x03\xdb\x87\x89\xc0.\ -\xa1\x1d\x97\xb7y\xbfR`\xbfm#\x8a@;\x1eh\ -\x95,/\x16\x09\x0c\xd7\x94\xc3\x02qM\xc2d\xa10\ -\x17c\xdf\x19\x03\xc8\xf2b\xb9p\x95\xa6\x11\xe8\xc2q\ -!\xbf\x87\xf0\x82\xd0\x05\xf0\x13\xee\xc1%x\xd6\x00O\ -\xbc\x95\xe5\xc5\xaduU~~\xa6)\xb8M\xfb\x1a8\ -.\xe4\xbe;\xd9\xfbF\xa0\xdd\x0f\xe3\xbbE\x06\xc8j\ -\x22\xde\xcf\xf2ba]\x95\x9b\xcf\x04\xc0\xa3\xf1\x04M\ -\x1eh\xa0W`\xc7\xc7\x13\x00G1\x17\x07\xe3o\x1f\ -\xb6\xc6\xc8\xad\x13:\xe3<\xbc\x98\xe5Eo\xbb\xab<\ -\x1d\xc9\x1a\xd8SW\xe5\x95\x1d\xd2r\xaf\xc0rM\xd9\ -\x8f\xb9uU~\xd5F\x17z\x84V\x9c\x1a\xb7\x8f\x08\ -t<\x08D[\x00\x09\x0f4\x84Ke\x1c\x9e3\x90\ -\xf3}x$\x86\xf9S\xc9< \xcc\x077\xe0F\xec\ -\x10Z\xb2\xf9\xddA,I\xd31\x1c\x0f\xf4\x0b\xfc\xde\ -\x9d\x80=\x89\xcbQ\xc7\xbd9\x06\xe6\x81\x13\xd8\x1d\xed\ -.\xc6\xddx@ \xabnL\xc3\xcbY^l\x1en\ - i\xf2@\xbfPd\xd7\x08\x83\xc8^a.\x98\x8e\ -\x9b\xe3\xfb\xdd\x06\xcf\x03\xdf\x09\x83\x0bL\xab\xab\xf2\xf9\ -,/~\x8d\xe9\xeb\x12\xae\xf0S\x8eN\x8b\x07\xb2\xbc\ -\x98\x1c\xc3\xbb\xa5\xae\xca\x1dq{K\xa2\xf2\xb5d\x1e\ -\xc8\xf2\xe2\xfa\xb8lD{\x9b\xb2\xbc\x18\x8b\xee\xba*\ -7\xa5\xb6[\x01\x8cI\x8ahr\xb2\xdf\x10\xfa\xfbP\ -\x043\x94\x1c\xc19q}\xaa\xc6\xea\xaa|'\xda\x1d\ -$\xad\x00f\xc6b\x1c-\x19D\xe5i\xe8\xdb\x01\xc8\ -p\x95\xbf\xcf\x00#\x95\x06>\x1e\xc5\xc3\xfc/\xff\x8e\ -\xfc\x05\x99&,\xa0:Dw\xab\x00\x00\x00%tE\ -Xtdate:create\x0020\ -15-12-18T14:27:1\ -1+00:00YM\xe3\xc6\x00\x00\x00%t\ -EXtdate:modify\x002\ -015-12-18T14:27:\ -11+00:00(\x10[z\x00\x00\x00\x00\ -IEND\xaeB`\x82\ -\x00\x00\x04~\ -\x00\ -\x00\x01\x00\x01\x00\x10\x10\x00\x00\x00\x00 \x00h\x04\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ -\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ -\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ ->\x00\x00\x00\xa1\x00\x00\x00\xd6\x00\x00\x00\xeb\x00\x00\x00\ -\xec\x00\x00\x00\xd8\x00\x00\x00\xa7\x00\x00\x00G\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x9e\x02\x022\ -\xff\x04\x10\x81\xff\x03#\xaa\xff\x02,\xbb\xff\x02-\xbc\ -\xff\x03$\xac\xff\x03\x12\x85\xff\x02\x028\xff\x00\x00\x00\ -\xac\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x0c\x00\x00\x00\xbb\x03\x08\x5c\xff\x02/\xcb\ -\xff\x00;\xca\xff\x00:\xca\xff\x009\xca\xff\x009\xca\ -\xff\x00:\xca\xff\x00;\xca\xff\x022\xcb\xff\x03\x09b\ -\xff\x00\x00\x00\xc9\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x98\x04\x08^\xff\x015\xca\xff\x00:\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x00:\xca\xff\x018\xca\ -\xff\x03\x09c\xff\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\ -0\x00\x00\x00\xfd\x02.\xc8\xff\x00:\xca\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x00:\xca\ -\xff\x022\xcb\xff\x02\x027\xff\x00\x00\x00E\x00\x00\x00\ -\x92\x04\x0eu\xff\x00:\xca\xff\x008\xca\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x00;\xca\xff\x03\x13\x87\xff\x00\x00\x00\xaa\x00\x00\x00\ -\xce\x02\x1f\xa4\xff\x00:\xc9\xff\x008\xc9\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x00:\xca\xff\x03%\xaf\xff\x00\x00\x00\xdc\x00\x00\x00\ -\xea\x02)\xb9\xff\x01:\xca\xff\x088\xd1\xff\x098\xd1\ -\xff\x078\xd0\xff\x058\xce\xff\x038\xcd\xff\x028\xcc\ -\xff\x018\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ -\xff\x009\xca\xff\x02-\xbd\xff\x00\x00\x00\xed\x00\x00\x00\ -\xe8\x02)\xb8\xff\x0d:\xd6\xff\x139\xdb\xff\x118\xd9\ -\xff\x0f8\xd7\xff\x0d8\xd6\xff\x0b8\xd4\xff\x0a8\xd3\ -\xff\x088\xd1\xff\x068\xcf\xff\x048\xce\xff\x028\xcb\ -\xff\x009\xc9\xff\x02-\xbd\xff\x00\x00\x00\xed\x00\x00\x00\ -\xcb\x06\x1d\xa5\xff\x1b;\xe2\xff\x1a9\xe2\xff\x189\xe0\ -\xff\x179\xde\xff\x159\xdd\xff\x139\xdb\xff\x129\xda\ -\xff\x108\xd8\xff\x0e8\xd7\xff\x0c8\xd5\xff\x0a8\xd3\ -\xff\x01:\xcb\xff\x03$\xad\xff\x00\x00\x00\xd9\x00\x00\x00\ -\x8b\x07\x0dr\xff\x22;\xe8\xff\x22:\xe9\xff 9\xe7\ -\xff\x1e9\xe5\xff\x1c9\xe3\xff\x1b9\xe2\xff\x199\xe0\ -\xff\x179\xdf\xff\x169\xdd\xff\x149\xdc\xff\x139\xdb\ -\xff\x07;\xd0\xff\x03\x11\x82\xff\x00\x00\x00\xa3\x00\x00\x00\ -(\x00\x00\x00\xfa\x1c+\xd7\xff,;\xf2\xff(:\xee\ -\xff&:\xec\xff$:\xeb\xff#:\xe9\xff!:\xe7\ -\xff\x1f9\xe6\xff\x1d9\xe4\xff\x1c9\xe3\xff\x1b;\xe2\ -\xff\x090\xd1\xff\x02\x02/\xff\x00\x00\x00;\x00\x00\x00\ -\x00\x00\x00\x00\x88\x07\x08[\xff,5\xf1\xff3;\xf8\ -\xff.;\xf3\xff,:\xf1\xff*:\xf0\xff(:\xee\ -\xff':\xed\xff%:\xeb\xff&;\xec\xff\x1c6\xe3\ -\xff\x04\x08]\xff\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x05\x00\x00\x00\xaa\x08\x08[\xff)+\xe2\ -\xff8;\xfc\xff7;\xfc\xff4;\xf9\xff2;\xf8\ -\xff1;\xf6\xff/;\xf5\xff#/\xe5\xff\x06\x08`\ -\xff\x00\x00\x00\xbb\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x88\x00\x00\x00\ -\xf6\x0e\x0ex\xff\x1e\x1f\xb8\xff)+\xda\xff)+\xdb\ -\xff\x1d!\xba\xff\x0e\x0f~\xff\x00\x00\x00\xfb\x00\x00\x00\ -\x96\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -+\x00\x00\x00\x8a\x00\x00\x00\xc8\x00\x00\x00\xe7\x00\x00\x00\ -\xe8\x00\x00\x00\xcb\x00\x00\x00\x91\x00\x00\x003\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ -\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ -\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ -\x00\x00\x03F\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a source contr\ -ol connected\x0d\x0a \x0d\x0a \ - \x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x03J\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a source contr\ -ol - not setup\x0d\x0a \x0d\x0a\ - \x0d\x0a \x0d\ -\x0a\x0d\x0a\ -\x00\x00\x04~\ -\x00\ -\x00\x01\x00\x01\x00\x10\x10\x00\x00\x00\x00 \x00h\x04\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ -\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ -\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x1a\x1c\ ->\x1c\x0f\x1b\xa1\x1c\x13\x1b\xd6\x1b\x1e\x1b\xeb\x19\x1d\x1a\ -\xec\x17\x0f\x17\xd8\x13\x05\x11\xa7\x0d\x09\x0cG\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00###\x0a#\x19\x22\x9e!$\x22\ -\xff\x18q!\xff\x0d\xb6\x1e\xff\x09\xd0\x1d\xff\x09\xd2\x1d\ -\xff\x0d\xba\x1f\xff\x16x \xff\x18!\x19\xff\x10\x05\x0f\ -\xac\x0f\x0f\x0f\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00%&%\x0c'\x1b&\xbb\x1fK$\xff\x09\xcd\x1d\ -\xff\x00\xfd\x19\xff\x00\xfb\x18\xff\x00\xf7\x18\xff\x00\xf6\x18\ -\xff\x00\xfa\x18\xff\x00\xff\x19\xff\x0a\xd7\x1f\xff\x18P\x1e\ -\xff\x12\x06\x11\xc9\x04\x05\x05\x13\x00\x00\x00\x00\x00\x00\x00\ -\x00-#,\x98\x22I&\xff\x03\xe6\x1a\xff\x00\xfb\x18\ -\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ -\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf9\x18\xff\x05\xf1\x1c\ -\xff\x18P\x1e\xff\x11\x06\x11\xaf\x00\x00\x00\x00.,.\ -0+.+\xfd\x08\xc8\x1c\xff\x00\xfb\x18\xff\x00\xf0\x19\ -\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ -\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xfa\x18\ -\xff\x09\xd7\x1e\xff\x19\x22\x1a\xff\x0c\x09\x0cE3&1\ -\x92\x1dk%\xff\x00\xfb\x18\xff\x00\xf0\x19\xff\x00\xf0\x18\ -\xff\x00\xf0\x18\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ -\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ -\xff\x00\xff\x19\xff\x16x \xff\x14\x07\x13\xaa3'2\ -\xce\x0f\xa5\x1f\xff\x00\xfc\x17\xff\x00\xf0\x17\xff\x01\xf0\x1a\ -\xff\x02\xf0\x1b\xff\x00\xf0\x19\xff\x00\xf0\x18\xff\x00\xf0\x18\ -\xff\x00\xf0\x18\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ -\xff\x00\xfa\x18\xff\x0c\xba\x1f\xff\x1a\x12\x19\xdc5/4\ -\xea\x07\xc2\x1a\xff\x03\xf9\x1b\xff!\xf27\xff%\xf2:\ -\xff\x1e\xf24\xff\x16\xf1-\xff\x0f\xf1&\xff\x08\xf0!\ -\xff\x04\xf0\x1c\xff\x01\xf0\x1a\xff\x00\xf0\x18\xff\x00\xf0\x18\ -\xff\x00\xf7\x18\xff\x08\xd1\x1d\xff\x1b\x1f\x1c\xed616\ -\xe8\x07\xc1\x1b\xff:\xfcO\xffT\xf5e\xffH\xf4Z\ -\xffA\xf4S\xff9\xf4M\xff1\xf3F\xff*\xf2?\ -\xff\x22\xf27\xff\x1a\xf10\xff\x12\xf1*\xff\x08\xf0 \ -\xff\x00\xf7\x17\xff\x08\xd0\x1d\xff\x1d \x1d\xed8.7\ -\xcb \xa1.\xffs\xff\x82\xffr\xf6\x80\xffi\xf6x\ -\xffb\xf6q\xffZ\xf6k\xffS\xf5d\xffL\xf5]\ -\xffD\xf4W\xff=\xf4P\xff6\xf3I\xff-\xf2A\ -\xff\x06\xfb\x1f\xff\x0b\xb5\x1d\xff \x17\x1f\xd9;2:\ -\x8b3i9\xff\x91\xff\x9d\xff\x95\xfa\x9f\xff\x8b\xf8\x96\ -\xff\x83\xf8\x8f\xff{\xf7\x88\xfft\xf7\x82\xffm\xf7{\ -\xffe\xf6t\xff^\xf6n\xffV\xf5g\xffS\xf5d\ -\xff\x1d\xfe5\xff\x13q\x1d\xff\x1f\x12\x1e\xa3><=\ -(262\xfa\x83\xc4\x8a\xff\xbf\xff\xc7\xff\xac\xfa\xb4\ -\xff\xa5\xfa\xae\xff\x9d\xf9\xa7\xff\x96\xf9\xa0\xff\x8e\xf9\x99\ -\xff\x87\xf8\x92\xff\x7f\xf7\x8c\xffx\xf7\x85\xfft\xff\x83\ -\xff(\xce9\xff\x1f' \xff!\x1e!;\x00\x00\x00\ -\x00>;>\x88DME\xff\xbd\xe3\xc2\xff\xdb\xff\xdf\ -\xff\xc7\xfd\xcc\xff\xbe\xfb\xc4\xff\xb6\xfb\xbe\xff\xaf\xfa\xb7\ -\xff\xa8\xfa\xb0\xff\xa1\xfa\xaa\xff\xa3\xff\xad\xffx\xeb\x84\ -\xff$M(\xff'\x1f&\x9f\x00\x00\x00\x00\x00\x00\x00\ -\x00<=<\x05979\xaaLPL\xff\xba\xc7\xbb\ -\xff\xf1\xff\xf4\xff\xee\xff\xf0\xff\xe2\xff\xe6\xff\xda\xff\xdf\ -\xff\xd5\xff\xda\xff\xcd\xff\xd3\xff\x9b\xd0\xa0\xff9M;\ -\xff#\x1d#\xbb\x0d\x0e\x0d\x0b\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00CCC\x04<;<\x889:9\ -\xf6lnl\xff\xa4\xa8\xa4\xff\xc3\xcb\xc4\xff\xc1\xcd\xc2\ -\xff\xa2\xb0\xa3\xffitj\xff333\xfb,'+\ -\x96$$$\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00BBB\ -+555\x8a111\xc8444\xe7333\ -\xe8-+-\xcb,*,\x911113\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ -\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ -\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ -\x00\x00\x03L\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a source contr\ -ol - warning v2<\ -/title>\x0d\x0a \ -\x0d\x0a \ -\x0d\x0a \x0d\x0a\x0d\x0a\ -\x00\x00\x04~\ -\x00\ -\x00\x01\x00\x01\x00\x10\x10\x00\x00\x00\x00 \x00h\x04\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ -\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ -\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ ->\x00\x00\x00\xa1\x00\x00\x00\xd6\x00\x00\x00\xeb\x00\x00\x00\ -\xec\x00\x00\x00\xd8\x00\x00\x00\xa7\x00\x00\x00G\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x9e\x0148\ -\xff\x02\x8c\x92\xff\x01\xbf\xc1\xff\x01\xd5\xd4\xff\x01\xd6\xd5\ -\xff\x01\xc2\xc3\xff\x01\x91\x97\xff\x01;@\xff\x00\x00\x00\ -\xac\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x0c\x00\x00\x00\xbb\x01bh\xff\x01\xe7\xe6\ -\xff\x00\xec\xe6\xff\x00\xec\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xec\xe6\xff\x00\xec\xe6\xff\x01\xe8\xe6\xff\x01io\ -\xff\x00\x00\x00\xc9\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x98\x02cj\xff\x00\xea\xe6\xff\x00\xec\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xec\xe6\xff\x01\xeb\xe6\ -\xff\x01jp\xff\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\ -0\x00\x00\x00\xfd\x01\xe4\xe4\xff\x00\xec\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xec\xe6\ -\xff\x01\xe8\xe6\xff\x019>\xff\x00\x00\x00E\x00\x00\x00\ -\x92\x02~\x84\xff\x00\xec\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xec\xe6\xff\x01\x93\x9a\xff\x00\x00\x00\xaa\x00\x00\x00\ -\xce\x02\xb7\xba\xff\x00\xec\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xec\xe6\xff\x01\xc6\xc6\xff\x00\x00\x00\xdc\x00\x00\x00\ -\xea\x01\xd3\xd3\xff\x00\xec\xe6\xff\x04\xeb\xe9\xff\x04\xeb\xe9\ -\xff\x03\xeb\xe9\xff\x02\xeb\xe8\xff\x02\xeb\xe7\xff\x01\xeb\xe7\ -\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ -\xff\x00\xeb\xe6\xff\x01\xd7\xd6\xff\x00\x00\x00\xed\x00\x00\x00\ -\xe8\x01\xd0\xd1\xff\x06\xec\xec\xff\x09\xeb\xee\xff\x08\xeb\xed\ -\xff\x07\xeb\xec\xff\x06\xeb\xeb\xff\x05\xeb\xeb\xff\x05\xeb\xea\ -\xff\x04\xeb\xe9\xff\x03\xeb\xe8\xff\x02\xeb\xe8\xff\x01\xeb\xe7\ -\xff\x00\xeb\xe6\xff\x01\xd7\xd6\xff\x00\x00\x00\xed\x00\x00\x00\ -\xcb\x03\xb4\xb9\xff\x0d\xec\xf1\xff\x0d\xeb\xf1\xff\x0c\xeb\xf0\ -\xff\x0b\xeb\xef\xff\x0a\xeb\xef\xff\x09\xeb\xee\xff\x08\xeb\xed\ -\xff\x07\xeb\xed\xff\x07\xeb\xec\xff\x06\xeb\xeb\xff\x05\xeb\xea\ -\xff\x01\xec\xe6\xff\x01\xc2\xc4\xff\x00\x00\x00\xd9\x00\x00\x00\ -\x8b\x03x\x7f\xff\x10\xec\xf4\xff\x10\xec\xf4\xff\x0f\xec\xf3\ -\xff\x0e\xec\xf3\xff\x0e\xeb\xf2\xff\x0d\xeb\xf1\xff\x0c\xeb\xf1\ -\xff\x0b\xeb\xf0\xff\x0a\xeb\xef\xff\x09\xeb\xee\xff\x09\xeb\xee\ -\xff\x03\xec\xe9\xff\x01\x8d\x93\xff\x00\x00\x00\xa3\x00\x00\x00\ -(\x00\x00\x00\xfa\x0d\xd9\xe5\xff\x15\xec\xf9\xff\x13\xec\xf7\ -\xff\x12\xec\xf6\xff\x11\xec\xf5\xff\x10\xec\xf5\xff\x10\xec\xf4\ -\xff\x0f\xec\xf3\xff\x0e\xeb\xf2\xff\x0d\xeb\xf2\xff\x0d\xec\xf1\ -\xff\x04\xe7\xe9\xff\x0115\xff\x00\x00\x00;\x00\x00\x00\ -\x00\x00\x00\x00\x88\x03^e\xff\x15\xe9\xf8\xff\x18\xec\xfb\ -\xff\x16\xec\xf9\xff\x15\xec\xf9\xff\x14\xec\xf8\xff\x13\xec\xf7\ -\xff\x12\xec\xf6\xff\x12\xec\xf6\xff\x12\xec\xf6\xff\x0d\xea\xf1\ -\xff\x02ci\xff\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x05\x00\x00\x00\xaa\x03]d\xff\x13\xd9\xea\ -\xff\x1a\xec\xfe\xff\x1a\xec\xfd\xff\x19\xec\xfc\xff\x18\xec\xfb\ -\xff\x17\xec\xfb\xff\x17\xec\xfa\xff\x11\xe3\xf1\xff\x03cj\ -\xff\x00\x00\x00\xbb\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x88\x00\x00\x00\ -\xf6\x06w\x81\xff\x0e\xb2\xc0\xff\x13\xd1\xe2\xff\x13\xd2\xe2\ -\xff\x0e\xb6\xc3\xff\x07~\x88\xff\x00\x00\x00\xfb\x00\x00\x00\ -\x96\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -+\x00\x00\x00\x8a\x00\x00\x00\xc8\x00\x00\x00\xe7\x00\x00\x00\ -\xe8\x00\x00\x00\xcb\x00\x00\x00\x91\x00\x00\x003\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ -\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ -\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ -\x00\x00\x04~\ -\x00\ -\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00 \x00h\x04\x00\ -\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ -\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ -\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|||\ ->|||\xa1|||\xd6|||\xeb|||\ -\xec|||\xd8|||\xa7|||G\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00|||\x0a|||\x9e\x89\x89\x89\ -\xff\x9e\x9e\x9e\xff\xa8\xa8\xa8\xff\xac\xac\xac\xff\xad\xad\xad\ -\xff\xa9\xa9\xa9\xff\x9f\x9f\x9f\xff\x8b\x8b\x8b\xff|||\ -\xac|||\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00|||\x0c|||\xbb\x94\x94\x94\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\x96\x96\x96\ -\xff|||\xc9|||\x13\x00\x00\x00\x00\x00\x00\x00\ -\x00|||\x98\x95\x95\x95\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\x96\x96\x96\xff|||\xaf\x00\x00\x00\x00|||\ -0|||\xfd\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\x8a\x8a\x8a\xff|||E|||\ -\x92\x9b\x9b\x9b\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\x9f\x9f\x9f\xff|||\xaa|||\ -\xce\xa6\xa6\xa6\xff\xaf\xaf\xaf\xff\xaf\xaf\xaf\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xaa\xaa\xaa\xff|||\xdc|||\ -\xea\xac\xac\xac\xff\xb0\xb0\xb0\xff\xb3\xb3\xb3\xff\xb4\xb4\xb4\ -\xff\xb3\xb3\xb3\xff\xb2\xb2\xb2\xff\xb1\xb1\xb1\xff\xb1\xb1\xb1\ -\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ -\xff\xb0\xb0\xb0\xff\xad\xad\xad\xff|||\xed|||\ -\xe8\xac\xac\xac\xff\xb6\xb6\xb6\xff\xb9\xb9\xb9\xff\xb8\xb8\xb8\ -\xff\xb7\xb7\xb7\xff\xb6\xb6\xb6\xff\xb5\xb5\xb5\xff\xb4\xb4\xb4\ -\xff\xb3\xb3\xb3\xff\xb2\xb2\xb2\xff\xb2\xb2\xb2\xff\xb0\xb0\xb0\ -\xff\xaf\xaf\xaf\xff\xad\xad\xad\xff|||\xed|||\ -\xcb\xa8\xa8\xa8\xff\xbd\xbd\xbd\xff\xbc\xbc\xbc\xff\xbb\xbb\xbb\ -\xff\xbb\xbb\xbb\xff\xba\xba\xba\xff\xb9\xb9\xb9\xff\xb8\xb8\xb8\ -\xff\xb7\xb7\xb7\xff\xb6\xb6\xb6\xff\xb5\xb5\xb5\xff\xb4\xb4\xb4\ -\xff\xb0\xb0\xb0\xff\xa9\xa9\xa9\xff|||\xd9|||\ -\x8b\x9b\x9b\x9b\xff\xc0\xc0\xc0\xff\xc0\xc0\xc0\xff\xbf\xbf\xbf\ -\xff\xbe\xbe\xbe\xff\xbd\xbd\xbd\xff\xbd\xbd\xbd\xff\xbc\xbc\xbc\ -\xff\xbb\xbb\xbb\xff\xba\xba\xba\xff\xb9\xb9\xb9\xff\xb9\xb9\xb9\ -\xff\xb3\xb3\xb3\xff\x9e\x9e\x9e\xff|||\xa3|||\ -(|||\xfa\xba\xba\xba\xff\xc5\xc5\xc5\xff\xc3\xc3\xc3\ -\xff\xc2\xc2\xc2\xff\xc1\xc1\xc1\xff\xc1\xc1\xc1\xff\xc0\xc0\xc0\ -\xff\xbf\xbf\xbf\xff\xbe\xbe\xbe\xff\xbd\xbd\xbd\xff\xbd\xbd\xbd\ -\xff\xb4\xb4\xb4\xff\x88\x88\x88\xff|||;\x00\x00\x00\ -\x00|||\x88\x95\x95\x95\xff\xc5\xc5\xc5\xff\xc8\xc8\xc8\ -\xff\xc6\xc6\xc6\xff\xc5\xc5\xc5\xff\xc4\xc4\xc4\xff\xc3\xc3\xc3\ -\xff\xc3\xc3\xc3\xff\xc2\xc2\xc2\xff\xc2\xc2\xc2\xff\xbd\xbd\xbd\ -\xff\x95\x95\x95\xff|||\x9f\x00\x00\x00\x00\x00\x00\x00\ -\x00|||\x05|||\xaa\x95\x95\x95\xff\xc0\xc0\xc0\ -\xff\xcb\xcb\xcb\xff\xca\xca\xca\xff\xc9\xc9\xc9\xff\xc8\xc8\xc8\ -\xff\xc7\xc7\xc7\xff\xc7\xc7\xc7\xff\xc0\xc0\xc0\xff\x96\x96\x96\ -\xff|||\xbb|||\x0b\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00|||\x04|||\x88|||\ -\xf6\x9e\x9e\x9e\xff\xb3\xb3\xb3\xff\xbe\xbe\xbe\xff\xbf\xbf\xbf\ -\xff\xb3\xb3\xb3\xff\xa0\xa0\xa0\xff|||\xfb|||\ -\x96|||\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|||\ -+|||\x8a|||\xc8|||\xe7|||\ -\xe8|||\xcb|||\x91|||3\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ -\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ -\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ -\x00\x00\x03D\ -<\ -?xml version=\x221.\ -0\x22 encoding=\x22UTF\ --8\x22?>\x0d\x0a\x0d\x0a source contr\ -ol error v2\x0d\x0a \x0d\x0a \ - \x0d\ -\x0a \x0d\x0a\x0d\x0a\ -" - -qt_resource_name = b"\ -\x00\x0f\ -\x04T\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x000\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04S\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x005\x00.\x00p\x00n\x00g\ -\x00\x09\ -\x0a\xc5\xacG\ -\x00w\ -\x00a\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x06Z\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x000\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04_\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x009\x00.\x00p\x00n\x00g\ -\x00\x16\ -\x0eE\x9e\x87\ -\x00e\ -\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00e\x00r\x00r\x00o\ -\x00r\x00.\x00s\x00v\x00g\ -\x00\x09\ -\x08\xbcm\xc2\ -\x00s\ -\x00t\x00a\x00t\x00u\x00s\x00b\x00a\x00r\ -\x00\x0f\ -\x04P\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x004\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04\x5c\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x008\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00\xf0&'\ -\x00e\ -\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00w\x00a\x00r\x00n\ -\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ -\x00\x18\ -\x0c\x85t\xe7\ -\x00e\ -\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00c\x00o\x00m\x00m\ -\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ -\x00\x0a\ -\x03\xd6;g\ -\x00M\ -\x00a\x00i\x00n\x00W\x00i\x00n\x00d\x00o\x00w\ -\x00\x0f\ -\x04U\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x003\x00.\x00p\x00n\x00g\ -\x00\x09\ -\x0c\xe6\xbd#\ -\x00v\ -\x00i\x00e\x00w\x00p\x00a\x00n\x00e\x00s\ -\x00\x0f\ -\x04a\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x007\x00.\x00p\x00n\x00g\ -\x00\x07\ -\x0a\xc9\xa6S\ -\x00c\ -\x00u\x00r\x00s\x00o\x00r\x00s\ -\x00\x15\ -\x06S\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x007\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04R\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x002\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04^\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x006\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x06P\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x006\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04W\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x001\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04S\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x005\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x06a\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x005\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04T\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x000\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04P\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x004\x00.\x00p\x00n\x00g\ -\x00\x03\ -\x00\x00x\xc3\ -\x00r\ -\x00e\x00s\ -\x00\x14\ -\x07\x22u\xc7\ -\x00a\ -\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x003\x00.\ -\x00p\x00n\x00g\ -\x00\x05\ -\x00O\xa6S\ -\x00I\ -\x00c\x00o\x00n\x00s\ -\x00\x15\ -\x06^\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x004\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04U\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x003\x00.\x00p\x00n\x00g\ -\x00\x14\ -\x07!u\xc7\ -\x00a\ -\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x002\x00.\ -\x00p\x00n\x00g\ -\x00\x15\ -\x06_\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x003\ -\x00.\x00p\x00n\x00g\ -\x00\x0b\ -\x0f\x08B\x1e\ -\x00A\ -\x00p\x00p\x00l\x00i\x00c\x00a\x00t\x00i\x00o\x00n\ -\x00\x0f\ -\x04R\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x002\x00.\x00p\x00n\x00g\ -\x00\x14\ -\x07(u\xc7\ -\x00a\ -\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x001\x00.\ -\x00p\x00n\x00g\ -\x00\x0f\ -\x04a\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x007\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x06\x5c\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x002\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x04W\x95'\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x001\x00.\x00p\x00n\x00g\ -\x00\x14\ -\x07'u\xc7\ -\x00a\ -\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x000\x00.\ -\x00p\x00n\x00g\ -\x00\x0f\ -\x04^\x95\xc7\ -\x00b\ -\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x006\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x06]\x7fG\ -\x00p\ -\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x001\ -\x00.\x00p\x00n\x00g\ -\x00\x0f\ -\x0e\x0f\xf3\xff\ -\x00o\ -\x003\x00d\x00e\x00_\x00e\x00d\x00i\x00t\x00o\x00r\x00.\x00i\x00c\x00o\ -\x00\x14\ -\x0b\x1b&\xb6\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00D\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\ -\x00t\x00i\x00f\ -\x00\x17\ -\x0c\x9a\xdb\xc7\ -\x00l\ -\x00o\x00c\x00k\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00d\x00e\x00f\x00a\x00u\ -\x00l\x00t\x00.\x00s\x00v\x00g\ -\x00\x10\ -\x07T\xb1'\ -\x00D\ -\x00e\x00f\x00a\x00u\x00l\x00t\x00_\x00o\x00p\x00e\x00n\x00.\x00s\x00v\x00g\ -\x00\x19\ -\x0e\xd2\x13\xe7\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00.\x00s\x00v\x00g\ -\x00\x0e\ -\x0b\xd8M\x87\ -\x00l\ -\x00a\x00y\x00e\x00r\x00_\x00i\x00c\x00o\x00n\x00.\x00s\x00v\x00g\ -\x00\x15\ -\x01\xaf\x1c'\ -\x00E\ -\x00n\x00t\x00i\x00t\x00y\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\ -\x00.\x00s\x00v\x00g\ -\x00\x19\ -\x05\xf2\xd2\x07\ -\x00v\ -\x00i\x00s\x00_\x00o\x00n\x00_\x00N\x00o\x00t\x00T\x00r\x00a\x00n\x00s\x00p\x00a\ -\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ -\x00\x1c\ -\x05A\x11\x07\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00E\x00d\x00i\x00t\ -\x00o\x00r\x00_\x00O\x00n\x00l\x00y\x00.\x00s\x00v\x00g\ -\x00\x16\ -\x0c>\x8f\xc7\ -\x00v\ -\x00i\x00s\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00d\x00e\x00f\x00a\x00u\x00l\ -\x00t\x00.\x00s\x00v\x00g\ -\x00%\ -\x0f-\x08'\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\x00y\ -\x00.\x00s\x00v\x00g\ -\x00\x0a\ -\x01\xb91\x87\ -\x00l\ -\x00o\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ -\x00\x0f\ -\x05bA^\ -\x00E\ -\x00y\x00e\x00_\x00O\x00p\x00e\x00n\x00_\x00H\x00i\x00d\x00d\x00e\x00n\ -\x00\x1b\ -\x05K\x05V\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00E\ -\x00n\x00a\x00b\x00l\x00e\x00d\x00.\x00t\x00i\x00f\ -\x00\x0c\ -\x0f^26\ -\x00E\ -\x00y\x00e\x00_\x00O\x00p\x00e\x00n\x00.\x00t\x00i\x00f\ -\x00\x10\ -\x03\xcaZG\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00.\x00s\x00v\x00g\ -\x00\x16\ -\x06\x8e\x16\xc7\ -\x00E\ -\x00n\x00t\x00i\x00t\x00y\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\ -\x00y\x00.\x00s\x00v\x00g\ -\x00\x1b\ -\x04\xe2\x14'\ -\x00l\ -\x00o\x00c\x00k\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00t\x00r\x00a\x00n\x00s\ -\x00p\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ -\x00\x0d\ -\x01m\xcf\x96\ -\x00E\ -\x00y\x00e\x00_\x00S\x00l\x00a\x00s\x00h\x00.\x00t\x00i\x00f\ -\x00\x14\ -\x0e\x00\x9e6\ -\x00E\ -\x00y\x00e\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00O\x00p\x00e\x00n\x00.\ -\x00t\x00i\x00f\ -\x00\x07\ -\x0c\xf8ZG\ -\x00E\ -\x00y\x00e\x00.\x00s\x00v\x00g\ -\x00\x14\ -\x07T)\xf6\ -\x00E\ -\x00y\x00e\x00_\x00S\x00l\x00a\x00s\x00h\x00_\x00H\x00i\x00d\x00d\x00e\x00n\x00.\ -\x00t\x00i\x00f\ -\x00\x1a\ -\x00\xe3\x5c\xa7\ -\x00v\ -\x00i\x00s\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00t\x00r\x00a\x00n\x00s\x00p\ -\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ -\x00/\ -\x0a\xf8TG\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\x00y\ -\x00_\x00U\x00n\x00s\x00a\x00v\x00a\x00b\x00l\x00e\x00.\x00s\x00v\x00g\ -\x00\x13\ -\x09+\x00\xf6\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00E\x00n\x00a\x00b\x00l\x00e\x00d\x00.\x00t\ -\x00i\x00f\ -\x00\x19\ -\x07,\xf6\x07\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00.\x00s\x00v\x00g\ -\x00.\ -\x07\x84Qg\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\x00_\ -\x00U\x00n\x00s\x00a\x00v\x00a\x00b\x00l\x00e\x00.\x00s\x00v\x00g\ -\x00%\ -\x08\xc2\x87g\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\x00y\ -\x00.\x00s\x00v\x00g\ -\x00\x19\ -\x0e\x89\x90\x16\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00E\x00n\x00a\x00b\x00l\x00e\x00d\x00_\x00H\ -\x00o\x00v\x00e\x00r\x00.\x00t\x00i\x00f\ -\x00\x1c\ -\x0bd6G\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00E\x00d\x00i\x00t\ -\x00o\x00r\x00_\x00O\x00n\x00l\x00y\x00.\x00s\x00v\x00g\ -\x00\x0b\ -\x052\xac\xa7\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00.\x00s\x00v\x00g\ -\x00\x10\ -\x08Y\x11\xa7\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00.\x00s\x00v\x00g\ -\x00$\ -\x05\xcb\xc5\xc7\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\x00.\ -\x00s\x00v\x00g\ -\x00\x1b\ -\x0e\xf5\xfe\xc7\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00N\x00o\x00t\x00_\ -\x00A\x00c\x00t\x00i\x00v\x00e\x00.\x00s\x00v\x00g\ -\x00\x0c\ -\x0e=1\x87\ -\x00u\ -\x00n\x00l\x00o\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ -\x00\x1a\ -\x00\x9cw\x07\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00U\x00n\x00s\x00a\ -\x00v\x00a\x00b\x00l\x00e\x00.\x00s\x00v\x00g\ -\x00\x1a\ -\x0a\xe9\xdc\x96\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00D\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00_\ -\x00H\x00o\x00v\x00e\x00r\x00.\x00t\x00i\x00f\ -\x00\x0a\ -\x00\xb5\xd1\xa7\ -\x00E\ -\x00n\x00t\x00i\x00t\x00y\x00.\x00s\x00v\x00g\ -\x00#\ -\x08\x0b\xd5\x87\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00U\x00n\x00s\x00a\x00v\x00a\x00b\x00l\x00e\x00.\x00s\ -\x00v\x00g\ -\x00\x13\ -\x0e\x1c\x0e\xf6\ -\x00E\ -\x00y\x00e\x00_\x00S\x00l\x00a\x00s\x00h\x00_\x00H\x00o\x00v\x00e\x00r\x00.\x00t\ -\x00i\x00f\ -\x00\x1b\ -\x03\x98\x0c'\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00N\x00o\x00t\x00_\ -\x00A\x00c\x00t\x00i\x00v\x00e\x00.\x00s\x00v\x00g\ -\x00\x17\ -\x03\xf8\xf5g\ -\x00l\ -\x00o\x00c\x00k\x00_\x00o\x00n\x00_\x00t\x00r\x00a\x00n\x00s\x00p\x00a\x00r\x00e\ -\x00n\x00t\x00.\x00s\x00v\x00g\ -\x00\x1a\ -\x00\xb2\x86\xa7\ -\x00l\ -\x00o\x00c\x00k\x00_\x00o\x00n\x00_\x00N\x00o\x00t\x00T\x00r\x00a\x00n\x00s\x00p\ -\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ -\x00\x08\ -\x00\x95Ug\ -\x00v\ -\x00i\x00s\x00b\x00.\x00s\x00v\x00g\ -\x00\x15\ -\x0c\x87\x8f\xd6\ -\x00E\ -\x00y\x00e\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00S\x00l\x00a\x00s\x00h\ -\x00.\x00t\x00i\x00f\ -\x00\x0f\ -\x09\xcbq\xa7\ -\x00v\ -\x00i\x00s\x00b\x00_\x00h\x00i\x00d\x00d\x00e\x00n\x00.\x00s\x00v\x00g\ -\x00\x12\ -\x02{\xf5\x96\ -\x00E\ -\x00y\x00e\x00_\x00O\x00p\x00e\x00n\x00_\x00H\x00o\x00v\x00e\x00r\x00.\x00t\x00i\ -\x00f\ -\x00$\ -\x0a9L\xa7\ -\x00S\ -\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00M\x00o\x00d\x00i\ -\x00f\x00i\x00e\x00d\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\x00.\ -\x00s\x00v\x00g\ -\x00\x16\ -\x05\x5c\xa1g\ -\x00v\ -\x00i\x00s\x00_\x00o\x00n\x00_\x00t\x00r\x00a\x00n\x00s\x00p\x00a\x00r\x00e\x00n\ -\x00t\x00.\x00s\x00v\x00g\ -\x00\x12\ -\x0cS?'\ -\x00D\ -\x00e\x00f\x00a\x00u\x00l\x00t\x00_\x00c\x00l\x00o\x00s\x00e\x00d\x00.\x00s\x00v\ -\x00g\ -\x00\x1c\ -\x0d\x1b}6\ -\x00P\ -\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00D\ -\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00t\x00i\x00f\ -\x00\x12\ -\x06\xdb\x9dg\ -\x00P\ -\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x001\x00.\x00p\x00n\ -\x00g\ -\x00\x0a\ -\x08v\x9cg\ -\x00G\ -\x00l\x00o\x00b\x00a\x00l\x00.\x00s\x00v\x00g\ -\x00\x0a\ -\x0c\x8dj\xa7\ -\x00C\ -\x00a\x00m\x00e\x00r\x00a\x00.\x00s\x00v\x00g\ -\x00\x12\ -\x06\xd8\x9dg\ -\x00P\ -\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x000\x00.\x00p\x00n\ -\x00g\ -\x00\x0c\ -\x0d\x08\xc6'\ -\x00V\ -\x00i\x00e\x00w\x00p\x00o\x00r\x00t\x00.\x00s\x00v\x00g\ -\x00\x12\ -\x06\xe1\x9dg\ -\x00P\ -\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x003\x00.\x00p\x00n\ -\x00g\ -\x00\x0a\ -\x00k\xd7\xa7\ -\x00M\ -\x00o\x00t\x00i\x00o\x00n\x00.\x00s\x00v\x00g\ -\x00\x12\ -\x06\xde\x9dg\ -\x00P\ -\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x002\x00.\x00p\x00n\ -\x00g\ -\x00\x09\ -\x09\xba\xcf\xa7\ -\x00D\ -\x00e\x00b\x00u\x00g\x00.\x00s\x00v\x00g\ -\x00\x10\ -\x03l\x17\xc7\ -\x00E\ -\x00x\x00p\x00e\x00r\x00i\x00m\x00e\x00n\x00t\x00a\x00l\x00.\x00s\x00v\x00g\ -\x00\x09\ -\x02\xc6\xc0\xc7\ -\x00F\ -\x00i\x00l\x00e\x00s\x00.\x00s\x00v\x00g\ -\x00\x0a\ -\x04o\x98\xe7\ -\x00G\ -\x00i\x00z\x00m\x00o\x00s\x00.\x00s\x00v\x00g\ -\x00\x07\ -\x0f\x07J\x02\ -\x00h\ -\x00i\x00t\x00.\x00c\x00u\x00r\ -\x00\x0e\ -\x06\x0c\xfb\x82\ -\x00a\ -\x00r\x00r\x00o\x00w\x00_\x00d\x00o\x00w\x00n\x00.\x00c\x00u\x00r\ -\x00\x0b\ -\x06\x89\xd9\x82\ -\x00c\ -\x00u\x00r\x00s\x00o\x00r\x001\x00.\x00c\x00u\x00r\ -\x00\x0b\ -\x06\x80\xd9\x82\ -\x00c\ -\x00u\x00r\x00s\x00o\x00r\x002\x00.\x00c\x00u\x00r\ -\x00\x17\ -\x06h\xad\xa2\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00s\x00o\x00_\x00s\x00e\x00l\x00_\x00p\x00l\ -\x00u\x00s\x00.\x00c\x00u\x00r\ -\x00\x0d\ -\x08\x8c:\xe2\ -\x00l\ -\x00e\x00f\x00t\x00r\x00i\x00g\x00h\x00t\x00.\x00c\x00u\x00r\ -\x00\x0e\ -\x03\x0c\x0f\xc2\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00H\x00i\x00t\x00.\x00c\x00u\x00r\ -\x00\x12\ -\x03\xfe\x1c\x82\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00s\x00m\x00o\x00o\x00t\x00h\x00.\x00c\x00u\ -\x00r\ -\x00\x11\ -\x06\x8d\xde\x82\ -\x00a\ -\x00r\x00r\x00o\x00w\x00_\x00u\x00p\x00r\x00i\x00g\x00h\x00t\x00.\x00c\x00u\x00r\ -\ -\x00\x0e\ -\x02\xc2\xa5\x82\ -\x00a\ -\x00r\x00r\x00_\x00a\x00d\x00d\x00k\x00e\x00y\x00.\x00c\x00u\x00r\ -\x00\x15\ -\x07\x0a7B\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00g\x00e\x00t\x00h\x00e\x00i\x00g\x00h\x00t\ -\x00.\x00c\x00u\x00r\ -\x00\x10\ -\x08\x83\x1e\x22\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00p\x00l\x00u\x00s\x00.\x00c\x00u\x00r\ -\x00\x11\ -\x0d\xbf%b\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00r\x00o\x00t\x00a\x00t\x00e\x00.\x00c\x00u\x00r\ -\ -\x00\x0f\ -\x07\xb5h\x82\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00m\x00o\x00v\x00e\x00.\x00c\x00u\x00r\ -\x00\x13\ -\x00.\xa8\x22\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00l\x00i\x00n\x00k\x00n\x00o\x00w\x00.\x00c\ -\x00u\x00r\ -\x00\x10\ -\x07\x0b\x1e\x82\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00l\x00i\x00n\x00k\x00.\x00c\x00u\x00r\ -\x00\x11\ -\x01\x93\x0c\x22\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00m\x00i\x00n\x00u\x00s\x00.\x00c\x00u\x00r\ -\ -\x00\x13\ -\x0aQ\xeab\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00D\x00r\x00a\x00g\x00I\x00t\x00e\x00m\x00.\x00c\ -\x00u\x00r\ -\x00\x0c\ -\x0b\xd0gb\ -\x00a\ -\x00r\x00r\x00o\x00w\x00_\x00u\x00p\x00.\x00c\x00u\x00r\ -\x00\x0f\ -\x0eO\xc8\x02\ -\x00p\ -\x00i\x00c\x00k\x00_\x00c\x00u\x00r\x00s\x00o\x00r\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x0el\xec\xa2\ -\x00c\ -\x00u\x00r\x000\x000\x000\x000\x001\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x0em\xec\xa2\ -\x00c\ -\x00u\x00r\x000\x000\x000\x000\x002\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x0en\xec\xa2\ -\x00c\ -\x00u\x00r\x000\x000\x000\x000\x003\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x05\xaa\xdb\xa2\ -\x00h\ -\x00a\x00n\x00d\x00D\x00r\x00a\x00g\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x0eo\xec\xa2\ -\x00c\ -\x00u\x00r\x000\x000\x000\x000\x004\x00.\x00c\x00u\x00r\ -\x00\x10\ -\x03y\xfd\xc2\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00s\x00c\x00a\x00l\x00e\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x0ep\xec\xa2\ -\x00c\ -\x00u\x00r\x000\x000\x000\x000\x005\x00.\x00c\x00u\x00r\ -\x00\x0c\ -\x02\xaeA\x82\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00.\x00c\x00u\x00r\ -\x00\x15\ -\x0eb\xe8\x22\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00s\x00o\x00_\x00s\x00e\x00l\x00e\x00c\x00t\ -\x00.\x00c\x00u\x00r\ -\x00\x13\ -\x096M\x02\ -\x00a\ -\x00r\x00r\x00o\x00w\x00_\x00d\x00o\x00w\x00n\x00r\x00i\x00g\x00h\x00t\x00.\x00c\ -\x00u\x00r\ -\x00\x13\ -\x0f\xbas\x02\ -\x00p\ -\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00f\x00l\x00a\x00t\x00t\x00e\x00n\x00.\x00c\ -\x00u\x00r\ -\x00\x0c\ -\x0fy\xb7\xc7\ -\x00m\ -\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00.\x00p\x00n\x00g\ -\x00\x10\ -\x0a5o'\ -\x00h\ -\x00i\x00d\x00e\x00_\x00h\x00e\x00l\x00p\x00e\x00r\x00s\x00.\x00p\x00n\x00g\ -\x00\x10\ -\x0a\x9d~\xc7\ -\x00d\ -\x00i\x00s\x00p\x00l\x00a\x00y\x00_\x00i\x00n\x00f\x00o\x00.\x00p\x00n\x00g\ -\x00\x17\ -\x04\xb0\xfe\xc7\ -\x00e\ -\x00d\x00i\x00t\x00w\x00i\x00t\x00h\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00d\x00a\ -\x00r\x00k\x00.\x00p\x00n\x00g\ -\x00\x08\ -\x06b\x87\xf3\ -\x00t\ -\x00o\x00o\x00l\x00b\x00a\x00r\x00s\ -\x00\x1d\ -\x08\xa8\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x005\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x98q\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x004\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x000\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x004\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00N\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x006\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xd5\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x002\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xa7\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x004\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x005\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x003\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00C\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x005\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xd4\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x001\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\xecq\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x001\x000\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00$\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x002\x000\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xa6\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x003\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x9aq\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x002\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x002\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x002\x00.\x00p\x00n\x00g\ -\x00\x1e\ -\x076,\x87\ -\x00p\ -\x00r\x00o\x00c\x00e\x00d\x00u\x00r\x00a\x00l\x00m\x00a\x00t\x00e\x00r\x00i\x00a\ -\x00l\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xd3\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x000\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xa5\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x002\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x9fq\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x001\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x007\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x001\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00E\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x003\x00.\x00p\x00n\x00g\ -\x00\x13\ -\x0c\xd0\x1e\x87\ -\x00m\ -\x00i\x00s\x00c\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x000\x00.\x00p\ -\x00n\x00g\ -\x00\x1d\ -\x08\xa4\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x001\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x9cq\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x000\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x004\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x000\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xdb\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x008\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00B\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x002\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x97q\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x009\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00?\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x009\x00.\x00p\x00n\x00g\ -\x00\x10\ -\x0f\xf1A\xe7\ -\x00O\ -\x00b\x00j\x00S\x00e\x00l\x00e\x00c\x00t\x00i\x00o\x00n\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xa3\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x000\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xda\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x007\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00G\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x001\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xac\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x009\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x94q\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x008\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00<\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x008\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xd9\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x006\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00#\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x002\x005\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00D\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x000\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xab\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x008\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x99q\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x007\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00A\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x007\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00O\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x009\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xd8\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x005\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00 \xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x002\x004\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xaa\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x007\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x96q\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x006\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00>\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x006\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00L\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x008\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x9d|'\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x003\ -\x00.\x00s\x00v\x00g\ -\x00\x1d\ -\x08\xd7\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x004\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00%\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x002\x003\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xa9\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x000\x006\x00.\x00p\x00n\x00g\ -\x00\x15\ -\x0e\x9bq\xa7\ -\x00o\ -\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x005\ -\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x003\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x001\x005\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00Q\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x000\x007\x00.\x00p\x00n\x00g\ -\x00\x1d\ -\x08\xd6\xaf\xe7\ -\x00s\ -\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ -\x00o\x00l\x00b\x00a\x00r\x00-\x001\x003\x00.\x00p\x00n\x00g\ -\x00\x18\ -\x00\x22\xce\x87\ -\x00e\ -\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ -\x00-\x002\x002\x00.\x00p\x00n\x00g\ -\x00\x10\ -\x0c\x99\xf5\x1f\ -\x00b\ -\x00a\x00l\x00l\x00_\x00o\x00f\x00f\x00l\x00i\x00n\x00e\x00.\x00i\x00c\x00o\ -\x00\x1c\ -\x0d\xbb\x8bG\ -\x00s\ -\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00_\x00c\x00o\ -\x00n\x00n\x00e\x00c\x00t\x00e\x00d\x00.\x00s\x00v\x00g\ -\x00\x1c\ -\x03ZJ\xe7\ -\x00s\ -\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00-\x00n\x00o\ -\x00t\x00_\x00s\x00e\x00t\x00u\x00p\x00.\x00s\x00v\x00g\ -\x00\x0f\ -\x0a\x0d'\xdf\ -\x00b\ -\x00a\x00l\x00l\x00_\x00o\x00n\x00l\x00i\x00n\x00e\x00.\x00i\x00c\x00o\ -\x00\x1d\ -\x03\xe3zG\ -\x00s\ -\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00-\x00w\x00a\ -\x00r\x00n\x00i\x00n\x00g\x00_\x00v\x002\x00.\x00s\x00v\x00g\ -\x00\x10\ -\x0c\xa1\xe6\x1f\ -\x00b\ -\x00a\x00l\x00l\x00_\x00p\x00e\x00n\x00d\x00i\x00n\x00g\x00.\x00i\x00c\x00o\ -\x00\x11\ -\x08tl?\ -\x00b\ -\x00a\x00l\x00l\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00i\x00c\x00o\ -\ -\x00\x1b\ -\x00\x22\x12'\ -\x00s\ -\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00_\x00e\x00r\ -\x00r\x00o\x00r\x00_\x00v\x002\x00.\x00s\x00v\x00g\ -" - -qt_resource_struct = b"\ -\x00\x00\x00\x00\x00\x02\x00\x00\x00)\x00\x00\x00\x01\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x0c\x00\x00\x00\xc5\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x03\xe2\x00\x02\x00\x00\x002\x00\x00\x00\x93\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x01F\x00\x00\x00\x00\x00\x01\x00\x00\xb19\ -\x00\x00\x01y+\x8f\x93\xf2\ -\x00\x00\x01\xb2\x00\x02\x00\x00\x00\x01\x00\x00\x00Y\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x03\x84\x00\x00\x00\x00\x00\x01\x00\x00\xc6s\ -\x00\x00\x01x\xc7F\xf7\x89\ -\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x01\x00\x00\xad\x12\ -\x00\x00\x01x\xc7F\xf7\xee\ -\x00\x00\x04\xc0\x00\x00\x00\x00\x00\x01\x00\x00\xceG\ -\x00\x00\x01x\xc7F\xf7\xd7\ -\x00\x00\x02p\x00\x00\x00\x00\x00\x01\x00\x00\xbec\ -\x00\x00\x01x\xc7F\xf8\x08\ -\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xc3\xef\ -\x00\x00\x01x\xc7F\xf8\x04\ -\x00\x00\x00$\x00\x00\x00\x00\x00\x01\x00\x00\x01\x88\ -\x00\x00\x01x\xc7F\xf7\x88\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01x\xc7F\xf7\xd9\ -\x00\x00\x03`\x00\x00\x00\x00\x00\x01\x00\x00\xc5\xe4\ -\x00\x00\x01x\xc7F\xf85\ -\x00\x00\x04\x22\x00\x00\x00\x00\x00\x01\x00\x00\xca\x80\ -\x00\x00\x01x\xc7F\xf7\xa9\ -\x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\xba{\ -\x00\x00\x01x\xc7F\xf7\xed\ -\x00\x00\x05f\x00\x00\x00\x00\x00\x01\x00\x00\xd6\xb3\ -\x00\x00\x01x\xc7F\xf7\x85\ -\x00\x00\x02\xe8\x00\x00\x00\x00\x00\x01\x00\x00\xc3E\ -\x00\x00\x01x\xc7F\xf88\ -\x00\x00\x01\x22\x00\x00\x00\x00\x00\x01\x00\x00\xae\x8b\ -\x00\x00\x01x\xc7F\xf7\x81\ -\x00\x00\x02\x94\x00\x00\x00\x00\x00\x01\x00\x00\xbfR\ -\x00\x00\x01x\xc7F\xf7|\ -\x00\x00\x05\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xd9\x9f\ -\x00\x00\x01x\xc7F\xf6\xe8\ -\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\xa6\x97\ -\x00\x00\x01x\xc7F\xf7}\ -\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01\x00\x00\xbb\x91\ -\x00\x00\x01x\xc7F\xf7\x82\ -\x00\x00\x05\x12\x00\x00\x00\x00\x00\x01\x00\x00\xd0\xa7\ -\x00\x00\x01x\xc7F\xf6\xeb\ -\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xc2a\ -\x00\x00\x01x\xc7F\xf8\x07\ -\x00\x00\x02@\x00\x00\x00\x00\x00\x01\x00\x00\xbd\x8a\ -\x00\x00\x01x\xc7F\xf8\x13\ -\x00\x00\x00`\x00\x00\x00\x00\x00\x01\x00\x00\xa5\xc3\ -\x00\x00\x01x\xc7F\xf8\x17\ -\x00\x00\x056\x00\x00\x00\x00\x00\x01\x00\x00\xd5\xb3\ -\x00\x00\x01x\xc7F\xf7\xf5\ -\x00\x00\x05\xdc\x00\x00\x00\x00\x00\x01\x00\x00\xdd\xf0\ -\x00\x00\x01x\xc7F\xf8&\ -\x00\x00\x03\xf2\x00\x00\x00\x00\x00\x01\x00\x00\xc9M\ -\x00\x00\x01x\xc7F\xf7\xf1\ -\x00\x00\x04t\x00\x00\x00\x00\x00\x01\x00\x00\xcd>\ -\x00\x00\x01x\xc7F\xf7\xf2\ -\x00\x00\x030\x00\x00\x00\x00\x00\x01\x00\x00\xc4\xe2\ -\x00\x00\x01x\xc7F\xf7\xf3\ -\x00\x00\x04F\x00\x00\x00\x00\x00\x01\x00\x00\xccj\ -\x00\x00\x01x\xc7F\xf8\x11\ -\x00\x00\x03\xb4\x00\x00\x00\x00\x00\x01\x00\x00\xc8y\ -\x00\x00\x01x\xc7F\xf8\x12\ -\x00\x00\x05\x8a\x00\x00\x00\x00\x00\x01\x00\x00\xd8\xcb\ -\x00\x00\x01x\xc7F\xf8\x15\ -\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\xcf\xd3\ -\x00\x00\x01x\xc7F\xf8\x16\ -\x00\x00\x00\xe6\x00\x02\x00\x00\x00\x01\x00\x00\x00P\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00H\x00\x00\x00\x00\x00\x01\x00\x00\x03\xf4\ -\x00\x00\x01x\xc7G\x01\xc4\ -\x00\x00\x02,\x00\x02\x00\x00\x00\x01\x00\x00\x000\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x01|\x00\x00\x00\x00\x00\x01\x00\x00\xb3\xeb\ -\x00\x00\x01y+\x8f\x93\xef\ -\x00\x00\x01\xf0\x00\x02\x00\x00\x00\x04\x00\x00\x00,\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00\xa9\x0c\ -\x00\x00\x01y+\x8f\x93\xf0\ -\x00\x00\x04\xa4\x00\x02\x00\x00\x00\x01\x00\x00\x00*\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x01\x00\x00\x00+\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x06\x0c\x00\x01\x00\x00\x00\x01\x00\x00\xde\xc4\ -\x00\x00\x01y\xd2\xb2\xf5B\ -\x00\x00\x16\x86\x00\x00\x00\x00\x00\x01\x00\x05\x9eC\ -\x00\x00\x01x\xc7F\xed\xa9\ -\x00\x00\x16:\x00\x00\x00\x00\x00\x01\x00\x05\x9c\x97\ -\x00\x00\x01x\xc7F\xf0\x97\ -\x00\x00\x16`\x00\x00\x00\x00\x00\x01\x00\x05\x9dk\ -\x00\x00\x01x\xc7F\xeb4\ -\x00\x00\x16\x1c\x00\x00\x00\x00\x00\x01\x00\x05\x9b\xa4\ -\x00\x00\x01x\xc7F\xf0\x87\ -\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x1f\x00\x00\x001\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x13\xb4\x00\x00\x00\x00\x00\x01\x00\x05\x88\x11\ -\x00\x00\x01x\xc7D\x85\xca\ -\x00\x00\x14\x06\x00\x00\x00\x00\x00\x01\x00\x05\x8a\xa5\ -\x00\x00\x01x\xc7D\x85\xcc\ -\x00\x00\x15v\x00\x00\x00\x00\x00\x01\x00\x05\x97l\ -\x00\x00\x01x\xc7D\x85\xc3\ -\x00\x00\x12\xf0\x00\x00\x00\x00\x00\x01\x00\x05\x81\x9f\ -\x00\x00\x01x\xc7D\x83\xc5\ -\x00\x00\x12|\x00\x00\x00\x00\x00\x01\x00\x05~\xaf\ -\x00\x00\x01x\xc7D\x85\xbb\ -\x00\x00\x152\x00\x00\x00\x00\x00\x01\x00\x05\x94\xd8\ -\x00\x00\x01x\xc7D\x85e\ -\x00\x00\x12\x9e\x00\x00\x00\x00\x00\x01\x00\x05\x7f\xf9\ -\x00\x00\x01x\xc7D\x85\xd0\ -\x00\x00\x14\xf6\x00\x00\x00\x00\x00\x01\x00\x05\x92D\ -\x00\x00\x01x\xc7D\x84\xb4\ -\x00\x00\x11\xce\x00\x01\x00\x00\x00\x01\x00\x05z\xad\ -\x00\x00\x01x\xc7D\x83\xca\ -\x00\x00\x12(\x00\x00\x00\x00\x00\x01\x00\x05}\x01\ -\x00\x00\x01x\xc7D\x85\xd2\ -\x00\x00\x12\x0c\x00\x01\x00\x00\x00\x01\x00\x05|V\ -\x00\x00\x01x\xc7D\x84\x12\ -\x00\x00\x11\xf0\x00\x00\x00\x00\x00\x01\x00\x05{\x0c\ -\x00\x00\x01x\xc7D\x84\x12\ -\x00\x00\x12\xc8\x00\x01\x00\x00\x00\x01\x00\x05\x81C\ -\x00\x00\x01x\xc7D\x83\xcf\ -\x00\x00\x13\x12\x00\x00\x00\x00\x00\x01\x00\x05\x82\xe9\ -\x00\x00\x01x\xc7D\x85\xc7\ -\x00\x00\x13\xe0\x00\x00\x00\x00\x00\x01\x00\x05\x89[\ -\x00\x00\x01x\xc7D\x85\xc8\ -\x00\x00\x13\x90\x00\x00\x00\x00\x00\x01\x00\x05\x86\xc7\ -\x00\x00\x01x\xc7D\x85d\ -\x00\x00\x13B\x00\x00\x00\x00\x00\x01\x00\x05\x843\ -\x00\x00\x01x\xc7D\x85\xce\ -\x00\x00\x12\x5c\x00\x01\x00\x00\x00\x01\x00\x05~K\ -\x00\x00\x01x\xc7D\x85-\ -\x00\x00\x15\xc4\x00\x01\x00\x00\x00\x01\x00\x05\x9a\x00\ -\x00\x00\x01x\xc7D\x83\xcb\ -\x00\x00\x14.\x00\x01\x00\x00\x00\x01\x00\x05\x8b\xef\ -\x00\x00\x01x\xc7D\x85\xb9\ -\x00\x00\x14Z\x00\x01\x00\x00\x00\x01\x00\x05\x8c\xbc\ -\x00\x00\x01x\xc7D\x83\xcc\ -\x00\x00\x13h\x00\x00\x00\x00\x00\x01\x00\x05\x85}\ -\x00\x00\x01x\xc7D\x85d\ -\x00\x00\x14x\x00\x00\x00\x00\x00\x01\x00\x05\x8d\x1c\ -\x00\x00\x01x\xc7D\x85\xb6\ -\x00\x00\x15\x94\x00\x00\x00\x00\x00\x01\x00\x05\x98\xb6\ -\x00\x00\x01x\xc7D\x85\xd4\ -\x00\x00\x14\x9c\x00\x00\x00\x00\x00\x01\x00\x05\x8ef\ -\x00\x00\x01x\xc7D\x84\x0b\ -\x00\x00\x14\xba\x00\x00\x00\x00\x00\x01\x00\x05\x8f\xb0\ -\x00\x00\x01x\xc7D\x84\x0d\ -\x00\x00\x14\xd8\x00\x00\x00\x00\x00\x01\x00\x05\x90\xfa\ -\x00\x00\x01x\xc7D\x84\x0e\ -\x00\x00\x15\x14\x00\x00\x00\x00\x00\x01\x00\x05\x93\x8e\ -\x00\x00\x01x\xc7D\x84\x0e\ -\x00\x00\x15X\x00\x00\x00\x00\x00\x01\x00\x05\x96\x22\ -\x00\x00\x01x\xc7D\x84\x0f\ -\x00\x00\x11\xba\x00\x01\x00\x00\x00\x01\x00\x05zN\ -\x00\x00\x01x\xc7D\x84\xb5\ -\x00\x00\x15\xf0\x00\x00\x00\x00\x00\x01\x00\x05\x9aZ\ -\x00\x00\x01x\xc7D\x85\xc5\ -\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x08\x00\x00\x00Q\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00$\x98\x00\x00\x00\x00\x00\x01\x00\x062&\ -\x00\x00\x01y+\x8f\x94\x0d\ -\x00\x00#\xa8\x00\x00\x00\x00\x00\x01\x00\x06\x1e\x02\ -\x00\x00\x01y+\x8f\x94\x0b\ -\x00\x00$\x0a\x00\x00\x00\x00\x00\x01\x00\x06%\xd2\ -\x00\x00\x01y+\x8f\x94\x0b\ -\x00\x00$p\x00\x00\x00\x00\x00\x01\x00\x06-\xa4\ -\x00\x00\x01x\xc7F\xf7d\ -\x00\x00#\xe6\x00\x00\x00\x00\x00\x01\x00\x06!P\ -\x00\x00\x01x\xc7F\xf6\xff\ -\x00\x00#D\x00\x00\x00\x00\x00\x01\x00\x06\x166\ -\x00\x00\x01x\xc7F\xf6\xed\ -\x00\x00$J\x00\x00\x00\x00\x00\x01\x00\x06)\x22\ -\x00\x00\x01x\xc7F\xf6\xf0\ -\x00\x00#j\x00\x00\x00\x00\x00\x01\x00\x06\x1a\xb8\ -\x00\x00\x01y+\x8f\x94\x0c\ -\x00\x00\x16\xba\x00\x02\x00\x00\x009\x00\x00\x00Z\ -\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00 :\x00\x00\x00\x00\x00\x01\x00\x05\xf9\x0c\ -\x00\x00\x01x\xc7F\xf0|\ -\x00\x00#\x0e\x00\x00\x00\x00\x00\x01\x00\x06\x11I\ -\x00\x00\x01x\xc7F\xed\xa1\ -\x00\x00\x1e\xb2\x00\x00\x00\x00\x00\x01\x00\x05\xe9\xce\ -\x00\x00\x01x\xc7F\xef\xf0\ -\x00\x00\x19\x08\x00\x00\x00\x00\x00\x01\x00\x05\xb65\ -\x00\x00\x01x\xc7F\xf0\xa1\ -\x00\x00!\xbc\x00\x00\x00\x00\x00\x01\x00\x06\x07\x15\ -\x00\x00\x01x\xc7F\xf0W\ -\x00\x00\x17@\x00\x00\x00\x00\x00\x01\x00\x05\xa4\xf5\ -\x00\x00\x01x\xc7F\xed\xd6\ -\x00\x00\x19\xae\x00\x00\x00\x00\x00\x01\x00\x05\xba\x04\ -\x00\x00\x01x\xc7F\xe9{\ -\x00\x00\x22b\x00\x00\x00\x00\x00\x01\x00\x06\x0b{\ -\x00\x00\x01x\xc7F\xef\xab\ -\x00\x00\x1b\xde\x00\x00\x00\x00\x00\x01\x00\x05\xcc\xc5\ -\x00\x00\x01x\xc7F\xcb~\ -\x00\x00\x18,\x00\x00\x00\x00\x00\x01\x00\x05\xac:\ -\x00\x00\x01x\xc7F\xf0\x90\ -\x00\x00\x1a\xd6\x00\x00\x00\x00\x00\x01\x00\x05\xc1\xd7\ -\x00\x00\x01x\xc7F\xe9@\ -\x00\x00\x1e<\x00\x00\x00\x00\x00\x01\x00\x05\xe3\x8d\ -\x00\x00\x01x\xc7F\xf0=\ -\x00\x00 \xe0\x00\x00\x00\x00\x00\x01\x00\x05\xfdE\ -\x00\x00\x01x\xc7F\xf0\x03\ -\x00\x00\x1c\xba\x00\x00\x00\x00\x00\x01\x00\x05\xd7Z\ -\x00\x00\x01x\xc7F\xed\xd8\ -\x00\x00\x1f\x8e\x00\x00\x00\x00\x00\x01\x00\x05\xf4\x02\ -\x00\x00\x01x\xc7F\xed\xda\ -\x00\x00\x1cT\x00\x00\x00\x00\x00\x01\x00\x05\xd2\x9a\ -\x00\x00\x01x\xc7F\xcc\x09\ -\x00\x00\x18b\x00\x00\x00\x00\x00\x01\x00\x05\xad,\ -\x00\x00\x01x\xc7F\xe9f\ -\x00\x00\x1e\xe8\x00\x00\x00\x00\x00\x01\x00\x05\xeb{\ -\x00\x00\x01x\xc7F\xe9\x86\ -\x00\x00\x1b\x0c\x00\x00\x00\x00\x00\x01\x00\x05\xc3%\ -\x00\x00\x01x\xc7F\xcb\xfe\ -\x00\x00\x1d\x96\x00\x00\x00\x00\x00\x01\x00\x05\xde+\ -\x00\x00\x01x\xc7F\xe9\x82\ -\x00\x00!\x16\x00\x00\x00\x00\x00\x01\x00\x05\xff\x03\ -\x00\x00\x01x\xc7F\xe7N\ -\x00\x00\x17v\x00\x00\x00\x00\x00\x01\x00\x05\xa7\x17\ -\x00\x00\x01x\xc7F\xe97\ -\x00\x00\x1f\xc4\x00\x00\x00\x00\x00\x01\x00\x05\xf6\x12\ -\x00\x00\x01x\xc7F\xe7\xa5\ -\x00\x00\x22\x98\x00\x00\x00\x00\x00\x01\x00\x06\x0d{\ -\x00\x00\x01x\xc7F\xe6\xb8\ -\x00\x00\x19\xe4\x00\x00\x00\x00\x00\x01\x00\x05\xbb#\ -\x00\x00\x01x\xc7F\xef\xeb\ -\x00\x00\x1d\x16\x00\x00\x00\x00\x00\x01\x00\x05\xda\xfb\ -\x00\x00\x01x\xc7F\xef\xe2\ -\x00\x00\x1bn\x00\x00\x00\x00\x00\x01\x00\x05\xc8A\ -\x00\x00\x01x\xc7F\xef\x93\ -\x00\x00\x1af\x00\x00\x00\x00\x00\x01\x00\x05\xbe\x80\ -\x00\x00\x01x\xc7F\xef\xee\ -\x00\x00\x19>\x00\x00\x00\x00\x00\x01\x00\x05\xb7\x07\ -\x00\x00\x01x\xc7F\xf00\ -\x00\x00\x17\xec\x00\x00\x00\x00\x00\x01\x00\x05\xaa\x0a\ -\x00\x00\x01x\xc7F\xed\xd3\ -\x00\x00\x16\xd0\x00\x00\x00\x00\x00\x01\x00\x05\xa21\ -\x00\x00\x01x\xc7F\xef\xe6\ -\x00\x00!\xf2\x00\x00\x00\x00\x00\x01\x00\x06\x08h\ -\x00\x00\x01x\xc7F\xf0f\ -\x00\x00 p\x00\x00\x00\x00\x00\x01\x00\x05\xfa\x13\ -\x00\x00\x01x\xc7F\xf0k\ -\x00\x00\x1f\x1e\x00\x00\x00\x00\x00\x01\x00\x05\xec\x83\ -\x00\x00\x01x\xc7F\xed\xc2\ -\x00\x00\x1d\xcc\x00\x00\x00\x00\x00\x01\x00\x05\xdf9\ -\x00\x00\x01x\xc7F\xf0\x0e\ -\x00\x00\x1a&\x00\x00\x00\x00\x00\x01\x00\x05\xbc\xf6\ -\x00\x00\x01x\xc7F\xf0%\ -\x00\x00\x18\x98\x00\x00\x00\x00\x00\x01\x00\x05\xaee\ -\x00\x00\x01x\xc7F\xf0I\ -\x00\x00\x17\xac\x00\x00\x00\x00\x00\x01\x00\x05\xa8\x8b\ -\x00\x00\x01x\xc7F\xf0,\ -\x00\x00\x22\xce\x00\x00\x00\x00\x00\x01\x00\x06\x0f7\ -\x00\x00\x01x\xc7F\xed\xdd\ -\x00\x00!|\x00\x00\x00\x00\x00\x01\x00\x06\x05\xa9\ -\x00\x00\x01x\xc7F\xf04\ -\x00\x00\x1f\xfa\x00\x00\x00\x00\x00\x01\x00\x05\xf7\x93\ -\x00\x00\x01x\xc7F\xf0*\ -\x00\x00\x1er\x00\x00\x00\x00\x00\x01\x00\x05\xe4\xee\ -\x00\x00\x01x\xc7F\xed\xc6\ -\x00\x00\x1dV\x00\x00\x00\x00\x00\x01\x00\x05\xdc\xcf\ -\x00\x00\x01x\xc7F\xf0@\ -\x00\x00\x1c\x14\x00\x00\x00\x00\x00\x01\x00\x05\xd1A\ -\x00\x00\x01x\xc7F\xf0K\ -\x00\x00\x1bB\x00\x00\x00\x00\x00\x01\x00\x05\xc5>\ -\x00\x00\x01x\xc7F\xed\xcb\ -\x00\x00\x1e\x0c\x00\x00\x00\x00\x00\x01\x00\x05\xe0\xbb\ -\x00\x00\x01x\xc7F\xed\xc8\ -\x00\x00 \xb0\x00\x00\x00\x00\x00\x01\x00\x05\xfb@\ -\x00\x00\x01x\xc7F\xef\xa6\ -\x00\x00\x1c\x8a\x00\x00\x00\x00\x00\x01\x00\x05\xd4\x97\ -\x00\x00\x01x\xc7F\xed\xce\ -\x00\x00\x17\x10\x00\x00\x00\x00\x00\x01\x00\x05\xa3\xf0\ -\x00\x00\x01x\xc7F\xf0\x80\ -\x00\x00\x1f^\x00\x00\x00\x00\x00\x01\x00\x05\xf2\xa4\ -\x00\x00\x01x\xc7F\xf0:\ -\x00\x00\x19~\x00\x00\x00\x00\x00\x01\x00\x05\xb8\x88\ -\x00\x00\x01x\xc7F\xf0(\ -\x00\x00\x222\x00\x00\x00\x00\x00\x01\x00\x06\x09\x9b\ -\x00\x00\x01x\xc7F\xef\xdd\ -\x00\x00\x1b\xae\x00\x00\x00\x00\x00\x01\x00\x05\xca0\ -\x00\x00\x01x\xc7F\xed\xd1\ -\x00\x00!L\x00\x00\x00\x00\x00\x01\x00\x06\x00\xbf\ -\x00\x00\x01y+\x8f\x93{\ -\x00\x00\x1a\xa6\x00\x00\x00\x00\x00\x01\x00\x05\xc0J\ -\x00\x00\x01x\xc7F\xf0\x0c\ -\x00\x00\x18\xd8\x00\x00\x00\x00\x00\x01\x00\x05\xaf\xbd\ -\x00\x00\x01x\xc7F\xed\xa4\ -\x00\x00\x1c\xf0\x00\x00\x00\x00\x00\x01\x00\x05\xd9\x9b\ -\x00\x00\x01x\xc7F\xe9<\ -\x00\x00\x0e\xba\x00\x00\x00\x00\x00\x01\x00\x04/>\ -\x00\x00\x01y+\x8f\x94\x12\ -\x00\x00\x0d\x0a\x00\x00\x00\x00\x00\x01\x00\x03\x98\x9f\ -\x00\x00\x01y+\x8f\x93\xdc\ -\x00\x00\x0e\x80\x00\x00\x00\x00\x00\x01\x00\x04*&\ -\x00\x00\x01y+\x8f\x94\x08\ -\x00\x00\x0d~\x00\x00\x00\x00\x00\x01\x00\x03\xfb\x9a\ -\x00\x00\x01y+\x8f\x93\xcd\ -\x00\x00\x09\xf6\x00\x00\x00\x00\x00\x01\x00\x039/\ -\x00\x00\x01y+\x8f\x94\x10\ -\x00\x00\x09f\x00\x01\x00\x00\x00\x01\x00\x02p@\ -\x00\x00\x01x\xc7F\xf5\xfe\ -\x00\x00\x07\x12\x00\x00\x00\x00\x00\x01\x00\x01\x8f\x0b\ -\x00\x00\x01y+\x8f\x93\xce\ -\x00\x00\x08:\x00\x00\x00\x00\x00\x01\x00\x01\xaa3\ -\x00\x00\x01y+\x8f\x94\x0a\ -\x00\x00\x0f$\x00\x00\x00\x00\x00\x01\x00\x04q\x5c\ -\x00\x00\x01x\xc7F\xf6G\ -\x00\x00\x0e\x10\x00\x00\x00\x00\x00\x01\x00\x04\x1c\xbf\ -\x00\x00\x01y+\x8f\x93\xe3\ -\x00\x00\x08\xd2\x00\x00\x00\x00\x00\x01\x00\x02e~\ -\x00\x00\x01y+\x8f\x93\xd6\ -\x00\x00\x0eL\x00\x00\x00\x00\x00\x01\x00\x04$\xfa\ -\x00\x00\x01y+\x8f\x94\x09\ -\x00\x00\x09*\x00\x00\x00\x00\x00\x01\x00\x02m\xa1\ -\x00\x00\x01y+\x8f\x94\x07\ -\x00\x00\x0c \x00\x00\x00\x00\x00\x01\x00\x03|9\ -\x00\x00\x01y+\x8f\x93\xd5\ -\x00\x00\x07z\x00\x00\x00\x00\x00\x01\x00\x01\x9dG\ -\x00\x00\x01y+\x8f\x93\xdf\ -\x00\x00\x08x\x00\x00\x00\x00\x00\x01\x00\x01\xc5\xe8\ -\x00\x00\x01x\xc7F\xf6*\ -\x00\x00\x0f\x9c\x00\x00\x00\x00\x00\x01\x00\x04\x8ei\ -\x00\x00\x01y+\x8f\x94\x12\ -\x00\x00\x08T\x00\x00\x00\x00\x00\x01\x00\x01\xb0@\ -\x00\x00\x01x\xc7F\xf61\ -\x00\x00\x0cb\x00\x00\x00\x00\x00\x01\x00\x03\x88{\ -\x00\x00\x01y+\x8f\x93\xda\ -\x00\x00\x07B\x00\x00\x00\x00\x00\x01\x00\x01\x93\xaf\ -\x00\x00\x01y+\x8f\x94\x11\ -\x00\x00\x08\xf8\x00\x00\x00\x00\x00\x01\x00\x02i,\ -\x00\x00\x01y+\x8f\x93\xce\ -\x00\x00\x0a\xc0\x00\x00\x00\x00\x00\x01\x00\x03U\xfe\ -\x00\x00\x01y+\x8f\x93\xd8\ -\x00\x00\x09\xc8\x00\x01\x00\x00\x00\x01\x00\x03\x19<\ -\x00\x00\x01x\xc7F\xf5\xf8\ -\x00\x00\x06\x92\x00\x00\x00\x00\x00\x01\x00\x01\x84\x05\ -\x00\x00\x01y+\x8f\x93\xcc\ -\x00\x00\x0a\xf8\x00\x00\x00\x00\x00\x01\x00\x03Y\xb0\ -\x00\x00\x01y+\x8f\x93\xdb\ -\x00\x00\x0d\x98\x00\x00\x00\x00\x00\x01\x00\x03\xff8\ -\x00\x00\x01y+\x8f\x93\xdc\ -\x00\x00\x0c<\x00\x00\x00\x00\x00\x01\x00\x03\x83Z\ -\x00\x00\x01y+\x8f\x93\xde\ -\x00\x00\x0bZ\x00\x00\x00\x00\x00\x01\x00\x03^A\ -\x00\x00\x01y+\x8f\x93\xd8\ -\x00\x00\x0a\x94\x00\x00\x00\x00\x00\x01\x00\x03@.\ -\x00\x00\x01x\xc7F\xf60\ -\x00\x00\x0f\x00\x00\x00\x00\x00\x00\x01\x00\x04g\xe4\ -\x00\x00\x01y+\x8f\x94\x13\ -\x00\x00\x0fN\x00\x00\x00\x00\x00\x01\x00\x04\x86$\ -\x00\x00\x01y+\x8f\x93\xe2\ -\x00\x00\x0dD\x00\x00\x00\x00\x00\x01\x00\x03\x9c*\ -\x00\x00\x01x\xc7F\xf6\x18\ -\x00\x00\x0a0\x00\x00\x00\x00\x00\x01\x00\x03;\xce\ -\x00\x00\x01y+\x8f\x93\xd9\ -\x00\x00\x060\x00\x00\x00\x00\x00\x01\x00\x01!\xdb\ -\x00\x00\x01x\xc7F\xf6\x1b\ -\x00\x00\x0b\xe2\x00\x00\x00\x00\x00\x01\x00\x03w\xc6\ -\x00\x00\x01y+\x8f\x93\xd7\ -\x00\x00\x06\xf0\x00\x00\x00\x00\x00\x01\x00\x01\x8b\xd2\ -\x00\x00\x01y+\x8f\x93\xfd\ -\x00\x00\x07\xb8\x00\x00\x00\x00\x00\x01\x00\x01\xa2j\ -\x00\x00\x01y+\x8f\x94\x0f\ -\x00\x00\x0f\xce\x00\x00\x00\x00\x00\x01\x00\x04\x98\x10\ -\x00\x00\x01y+\x8f\x93\xcb\ -\x00\x00\x0e\xd0\x00\x01\x00\x00\x00\x01\x00\x046\xb1\ -\x00\x00\x01x\xc7F\xf5\xf3\ -\x00\x00\x06^\x00\x00\x00\x00\x00\x01\x00\x01\x81c\ -\x00\x00\x01y+\x8f\x94\x06\ -\x00\x00\x09\xb4\x00\x00\x00\x00\x00\x01\x00\x03\x13\xbb\ -\x00\x00\x01y+\x8f\x93\xd0\ -\x00\x00\x0f\xf8\x00\x00\x00\x00\x00\x01\x00\x04\x9a\xca\ -\x00\x00\x01x\xc7F\xf5\xf0\ -\x00\x00\x09\x86\x00\x00\x00\x00\x00\x01\x00\x02\x93\xaf\ -\x00\x00\x01x\xc7F\xf6$\ -\x00\x00\x0d\xe4\x00\x01\x00\x00\x00\x01\x00\x04\x02\xc3\ -\x00\x00\x01x\xc7F\xf6\x04\ -\x00\x00\x0c\xec\x00\x00\x00\x00\x00\x01\x00\x03\x91\xbf\ -\x00\x00\x01y+\x8f\x94\x0e\ -\x00\x00\x0b\xaa\x00\x00\x00\x00\x00\x01\x00\x03b\xb8\ -\x00\x00\x01x\xc7F\xf6L\ -\x00\x00\x06\xb8\x00\x00\x00\x00\x00\x01\x00\x01\x86\xad\ -\x00\x00\x01y+\x8f\x93\xe0\ -\x00\x00\x0c\xb0\x00\x00\x00\x00\x00\x01\x00\x03\x8d\x1f\ -\x00\x00\x01y+\x8f\x93\xdd\ -\x00\x00\x07\xea\x00\x00\x00\x00\x00\x01\x00\x01\xa5\x0c\ -\x00\x00\x01y+\x8f\x93\xe1\ -\x00\x00\x08\xb4\x00\x00\x00\x00\x00\x01\x00\x02O\xe4\ -\x00\x00\x01x\xc7F\xf6D\ -\x00\x00\x11\x06\x00\x00\x00\x00\x00\x01\x00\x05H\x0b\ -\x00\x00\x01y+\x8f\x93\xd4\ -\x00\x00\x11\x88\x00\x00\x00\x00\x00\x01\x00\x05r\xc6\ -\x00\x00\x01y+\x8f\x93\xd1\ -\x00\x00\x11b\x00\x00\x00\x00\x00\x01\x00\x05`\x84\ -\x00\x00\x01y+\x8f\x93\xcf\ -\x00\x00\x11\xa0\x00\x00\x00\x00\x00\x01\x00\x05v\xe1\ -\x00\x00\x01y+\x8f\x93\xd2\ -\x00\x00\x10\x94\x00\x00\x00\x00\x00\x01\x00\x05A\x0f\ -\x00\x00\x01x\xc7F\xf8/\ -\x00\x00\x106\x00\x00\x00\x00\x00\x01\x00\x05(\xda\ -\x00\x00\x01x\xc7F\xf8,\ -\x00\x00\x11 \x00\x00\x00\x00\x00\x01\x00\x05N\x15\ -\x00\x00\x01x\xc7F\xf83\ -\x00\x00\x10\xdc\x00\x00\x00\x00\x00\x01\x00\x05G=\ -\x00\x00\x01x\xc7F\xf8(\ -\x00\x00\x10`\x00\x00\x00\x00\x00\x01\x00\x05)g\ -\x00\x00\x01y+\x8f\x93\xd3\ -\x00\x00\x11J\x00\x00\x00\x00\x00\x01\x00\x05N\xb9\ -\x00\x00\x01y+\x8f\x93\xca\ -\x00\x00\x10z\x00\x00\x00\x00\x00\x01\x00\x057Q\ -\x00\x00\x01y+\x8f\x93\xc9\ -\x00\x00\x10\xbe\x00\x00\x00\x00\x00\x01\x00\x05A\xbe\ -\x00\x00\x01y+\x8f\x93\xe3\ -" - -def qInitResources(): - QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) - -def qCleanupResources(): - QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) - -qInitResources() +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +from PySide2 import QtCore + +qt_resource_data = b"\ +\x00\x00\x01\x84\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01KIDATx\xdac`\x18\x05\xa3`\ +\x14\x0c&\x10\x91\x90\xe3\x18\x99\x98{\x08\x88\xf7\x810\ +\x90\xbf\x1f\xca\xd6\xa6\x8b\x03\x80\x165\x01-\xfd\x0f\xc3\ +@>\x8c\x1dK\xaf\x10h\x00Y\x0a\xc3@\xfe_(\ +{5\x10\x9b\x01\xf9V@\x1a\x8e\x89\xe4[\x03\xb1>\ +\xa5\x0e\x80\x87\x06\x05|\xf5\x81v\x80\x1e1i\xa0\x01\ +\x1a\xe7\x7f\xa1\x96\xff\x83\xf2o\x00\xf1\x19 \xff\x0c\x88\ +\x86a\x12\xf8\x97\x81X\x85\x9c\x10\x00\xd1\x13\xe8\x99\x0d\ +\xd1\x1d\xf0\x05Hs\x00\xb1\x1b\x10_\x07\xf2o\x02\xe9\ +\x1b0\x0c\x0a\x192\xf8\xb7\x80\xf80\x10\xb3\x12\xe3\x80\ +\x1ah\xd4<\xa4B\x1a@\xe6\xcf%\x94\x06@q\xff\ +\x1d\xea\xa8tX\xba\x80\xa6\x89\xbfhi\x84T>\xc8\ +,)b\xa2\xa0\x0c\xea\xa8gxr\x05\xa9|\xdc\xbe\ +Gs\xc0+ f\x06\xf23)\xb4\x10\x1b_\x94\x18\ +\x07\xe4A\xf9\xaf\xa9\xec\x80i\x84\xca\x81F\xa0\xa2W\ +@\xcc\x04\xc4i0C(\x8c\xf3\xbf\xd04\xf5\x03\xc8\ +\x97!\x94\x0d\xdb\x81\x8ar\xa0\x8ey\x8a%\x15S\x12\ +\x02\xd3\x88)\x07R\xa0\x96gQ1\xceA\xec_@\ +,A\x8c\x03\x98\x81\x0a9\xa1\x89\x90\x9a\xf9~\x1a)\ +\xa5\xa1\x0a\x10o\x07\xe2\xcd@\x8d\x9b\x81\xf4&\x18&\ +\x93\xbf\x14\x88yF\x9b{\xa3`\x14\x0cZ\x00\x00\xef\ +\xad\x00\xe1,\x84\xf5\xf4\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x02h\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x02/IDATx\xda\xed\x96\xcb+\xc4Q\ +\x14\xc7\xe7\xe11\xcd\x90\xc9L\x1a\x22e\xe4\x91YL\ +\x13\x8a\xa2lllX\xa1\x94WQ\xc6\xb3\xd8x\xd4\ +\x10\x0bE\x8d\x14\xfe\x03\x0b\x89\xb2\x96\xc4\xc2B\xf2(\ +\x22\x0by,lH\x16\x1e5\x8d\xef\xad\xab\x8e\x99{\ +~\xbfYZ\xfcn};\xbf\xee\xe7\x9e\xf3;\xfd\xee\ +\xb9\xe7wM\xa6\xff0Z;\x07J\xa0\xf5\x96\x8e\xfe\ +a\x8d5\xed\xe0\x1b\xb0\x95\x0c\xb7\x83\x87aW\xc4\xb3\ +j\x0dx\x00l\x13\xea\x8au>\x82\xa2X\x10\x85\xf5\ ++\x82g\x13~\xcf$0.\xb9P\x88I\xe0Jr\ +!/u\xde!/(P\x04\xcf\x80\x22\x92\x9f0\x09\ +t\x93\x04\x82L\x02\x07\x92G \x0f\x056\xa8\x07\x93\ +\x15\xdc\x16\x80\x8bm\x0a\xc2:5\xb6\xa9\x09\xbcY\x83\ +\xa7\x83\x8b\x18>\x931\x8c\xa1(\x90L\x14\x87Uk\ +\x0d\xb8[\x87\xdb\x11'M\xe7=.\xc8\x1c;9)\ +\x8f\xe1\x13\xacC\xe1d\x85\xce\xe51[e\x02W\x83\ +G\xe41\xaba\x12\x5c\x94\xfc\x02\xb2Q\xe7k\xd2\x07\ +j\x15\xc1\xbd\x84\xbf0\x09\xcc\x93>\x10Vp3\xf8\ +\x03iDe43\xd1f_1y\xc8m\x03\xe6\xb7\ +\xc0\xdf`\xc7\x18^\x0c~'^\x02\x952I\x0e\x81\ +\xbdC\xdb\x90%\x16Z\xf4\xeaD\xafF\x12\xac5\xab\ +q\xe2\x8c\xa1*\x8c\x5ch\x19E\xd6\xa6\xb1\xa6\x01\x5c\ +\x5c6\xb8\x0aO\x02\x17\xfdd\x1aJf\x8aX\x1c\xe7\ +5\xa81\xd6y\x9f\x9cs\x9f\x22x\x16\xe1\xb7L\x02\ +#\xa4\x0fL0\x09\x9c\x91>\x90O\xc1\xee\xaf3l\ +\x91\xc2\xd1E\xf8%\x13|\xf07Ih\x94I\xf2X\ +r\xa1\xbc?\xff\x01\xd1\x8e1Y\xaf\xb1\x05U\xe0!\ +\xd8\x1c\x8d>\xd1\xcb\xdd\x86$\xf7\x80\xcfp\xad\xda\x18\ +F/p\xc6\xfd\xa1\xe2\x8b(3\x81\x0b\x89C\xef\xe2\ +\xa3\x9a\xec\x83>\x10\xe0\x146\x85q\x14G\xf5\x0bv\ +\x96\xe1~\xf0gq_\x80\x02L\x82S`\x22\xc6\xde\ +\x9ff\x05pC\xcey\x9d\xc2\xb1\x90\xf0W&\xf8\x02\ +\xe9\x03K\x0an\x01\x7f$}\xa0\x8cf\x1f\x84>e\ +\xa7J\xd5\xf9\x02s\x09|\x81r&I\xd1\xaa\xbf\xe3\ +\xbe\x00\xb9\x94\xea\xd5\x80\xde\xa5\xd4\x91@\x0d\xb8\xffU\ +\xf1\xff\x00\xf0W\x81\xb2\xb1-\xb20\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\xa1\xcb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0b\x22\x00\x00\x0b\x22\x01\x09\xe1\ +O\xa2\x00\x00\xa1`IDATx^]\xfdg{\ +cI\xb2\xa5\x89\xf2\x0fMF\x04\xb5\x04@\x90\x00\x08\ +j\xad\xb5\xd6Zk\x15\xd4:\x14\x19Z\xeb\x88\x8c\x94\ +\x91:\xab\xb2\xeaTU\xd7Q=\xdd}\xfav\xf7\xcc\ +<\xf7\xfe\x13\xbb\xef\xf2MFe\xcf\x07{\x00\x92 \ +\xf6\xden\xcb\xcc\x96\xb9\x9b\x9b\xc7\x84\xc7\x1f[\x04\xc9\ +Ar'\x9eZ\xf1\xec+\xabX\xfe`5\xeb\xdfX\ +\xc3\xd6\xf7\xd6\xb4\xf3\xa35\xec|o5\x1b_Y\xc5\ +\xea;+Y|n\x05\xb3\x0f-:qf\xe1\xa1c\ +\xcb\xea\xdd\xb2@\xfb\x92\xa57MYZ\xfd\x88\xa5\xd6\ +\x0dyR?li\x0dc\x96\xd68\x8eLx\xaf\xfc\ +\x9cZ7b)\xb5\xc3\x96\x5c3dI\xd5\xc3\xc8\xa8\ +%\xd5LXr\xdd\x8c\xa54,Xj\xd3\x8a\xa5\xb7\ +\xae\x9b\xafs\xdb\x02\xbd\x07\x16\x1c\xe0\x1a\x83\xd7,{\ +Hr\x82\x1c\xf2\xbb=\xcb\xec\xdf\xb6\xcc\xbe\x0dd\x1d\ +Y\xb3\xcc\xde\x15\xcb\xec^\xb2\xcc\xae\x05\xf3\xb7\xcdX\ +F\xd3\xa8\xa5\xd6\xf6ZRE\xab\xc5\x17\xd7ZlA\ +\xa5]\xce\xaf\xb0K\x055v\xa5\xb8\xd5\x12\xaa\x87,\ +\xade\xd1\xb2\x07\x0e\xadp\xe6\xa1U\xae\xbc\xb3\xba\xcd\ +o\xac~\xeb;\xabZ\xfb\xc2\x0a\xe7\x9e3.w,\ +\x93k\xfb\xfa\x0e\xcc\xd7\xb3o\xfen^\xbb\x90\xce]\ +^w-\xd8\x7f\xc8\xb8\xdd\xb4\xc2\xf9\xfbV\xb6\xfa\xcc\ +*\xd6_Y\xf9\xfaK+\xe5}\xf1\xf2c+Z~\ +\x80\xdc\xb3\xfc\xc5\xdb\x96;\x7fj\xd1\xb93\xe4\x8e\xe5\ +-<\xb0\xd2\xf5\x17V\xbb\xf3\xceZ\x0e\xbe\xb0\xee\xe3\ +\xaf\xad\xff\xda\xb76p\xed\xa3\x0d\xde\xf8\xd1F\xef\xfc\ +\xc9&\x1e\xff\xb3M\xbd\xf8\xaf6\xf7\xfa\xffc\xf3\xaf\ +\xff\x87-\xbc\xf9\x1f\xb6\xf2\xf6\x7f\xd9*\xb2\xfc\xfa\x7f\ +\xda\xc2\x8b\xffn\x93\x8f\xfe\xdd\xfaO\xffj]\xd7\xfe\ +h\xedG\xbf:\xe9:\xf9\xa3\xf5\xdd\xfc\x8b\x0d\xdf\xfe\ +\xbb\x8d\xdf\xffw\x9b~\xfc_m\xe6\xc9\x7f\xd8\xe4\xc3\ +\xffb\xa3w\xff\xcdzo\xfc\xcd\x9a\xf7\xff`5\x9b\ +\xdfs\xcf_[Ld\xec\xaeE\xc6\xeeYt\xfc\xbe\ +\xe5M>\xb2\xe2\xb9\x17\x0c\xc6{\xab\xbd\xfa\xb552\ +\x18\xcd\xbb?X\xf3\xcewV\xbf\xf9\x95U\xaf\xbd\xb3\ +\xf2\xa5\x17V2\xf7\xc8\x0a&y\xa8\x91k\x16\xe9\xdf\ +\xb5\xec\xee5\x0b\xb6\xcf[\xa0e\xca\xfc\xcd\xe3\xe6k\ +\x92L\x98\xafy\xd22.\x84\x9f\xd3\x01Az=\xa0\ +\xa8\x93r\xc6\x00\x82\x14?e\xc9\xf5s\x96\xd2\xb8h\ +\xa9\xcd\xab\x96\xd6v\xd52:\xb6\x18l\x94\xdcwd\ +A\xa7\xfc\xeb\x96=\x8c\x00\x80\xacA~7\xb0\xcf\xdf\ +\x04\x90\x0d\xf3\xf7\xac\xf1\xd9\x15d\xc9\xfc\x9d(\xbfc\ +\xce|\xadS\x5c\x0b0\xd6\xf6YRe\xbb%\x944\ +Z\x5cQ\xad])D\x8a\x1a-\xb6\xb4\xd3\x12kF\ +\x1d\x00\x82\xbd{\x967~f\xa5sO\xadr\xe9\x8d\ +U\xf1\xec\xe5\x0b\xaf\xacp\x1a\x90\x8f\x9d9\xe0I\xd1\ +\x99\xbd\xe7\xd2sd\x81\xee}\x0b\x00\x88`\xff\x91\x85\ +G\xaf[\xde\xd4\x19\x80\xb9o\xc5\x0b\x8c\xdf\x22\x8a_\ +xh\x85\x0b\xf7\x91\xbbV\xb8x\xd7\xf2\xe6Q\xfc\xec\ +-\xcb\x99\xb9e\x91\xe9S\xcb\x99\xbem\x05\x80\xa6\x14\ +\x90T\xaf=\xb3\xc6\x8d\x17\xd6\xba\xf5\xca\xdav\xdeX\ +\xc7\xfe\x07\xeb\xb9\xfe\xd1\x06n\xffj\xc3\x0f\xfebc\ +\x8f\xfe\xeed\xea\xc9?\xdb\xc2\xf3\x7f\xb5\x85g\xffb\ +s\x8f\xff\x93M?\xf8'\x1b\xbc\xf5\xb3\xb5\xee\x7fe\ +\x8d\xdb\x1f\x90/\xd0\xd5\xd7\xd6~\xf8\xbd\xf5\xdc\xf8\xd5\ +\x06\xce\xfe\xc9F\xee\xfd'\x1b\x7f\xf8o\x00\xe5?\xdb\ +\xf8\x83\x7f\xb3\xa1;\x7f\xb7\xee\xeb\x7f\xb6\xa6\xbd\x1f\xac\ +\xea\xea\x97\x5c\xff\x1d\x00\x18\xbd\x09\x8aO\xb1\xfe;V\ +0\x0d2\x17\x9ec\x01\xb2\x86/\xadi\xfb[k\xd9\ +\xfd\x0e\xf9\x160|iu\xeb\xef\x18\xa0\x17V6\xff\ +\xc8\x8a\xa6n[\xfe\xd8u\xcb\x1d:\xb0\x9c\xbeM\x0b\ +w\xafZ6\x0a\xc8F\x01Y\xed\xb3\x16l\x9b\xb5L\ +$\xd0:k\xfe\x96i\x80\x018\xf0\x12\x12_\xe3\x94\ +e4\xce\xa0\xa4yKk\x92\xe2W,\x0d\xabOo\ +\xdf\xb4\x8c\xce\x1d\xf3i\x805\xd8\xfd'\x0e\x00Y\x00\ + \x0bEd\x0d\xea\xe7c\x00p\xc0\xdfv\xf9\x0c@\ +\xe9\xb9\x8a\xf2W\xb1\xca%\xf3u,\x98O\xd6\xdf\x8c\ +\xc7i\x18\xb6\x94\x1a\x01\xa0\xc3\x12\xcaZ,\xbe\xb4\xd9\ +\xe2Jx-\xeb\xb4\x84\xaa\x01@7\x89\xa7Y\xb6`\ +\xcf\x8eE\x86\xafY>\xcf_4\xfd\xc8Jf\x9eX\ +\xd1\xe4\x03\xcbC\xf9\xfa\xbdW>\x7f\xd7\xaa\x16\xefY\xcd\xca\ +C\xab_\x7f\x8a\xc1\xbd\xb6\xb6\xc3\x0f\xd6\x81W\xe8\xbe\ +\xf1\xbd\x93\xbe\x9b\xdf\xdb\xe8\xd9\x8f6r\xfa\x1d^\xe2\ +k\xeb;\xfe`\xad\xdb/\xadj\xf9\xa1U,=@\ +/\x8f1\xda\x97\xd6\xb4\xfb\xde\xda\x8e\xbe\xb1\xae\xeb?\ +X\xef)@\xb8\xfd\x9b\x0d\xdc\xf9\xb3\xf5\x9d\xfe\x91\xdf\ +\xfd\x8c\xc7\xf9\x887\x7foe\xcb/\xf0\x5c\x8f-&\ +:\x0e\x82'o\xa2\xfc\xdbX\xff}+_~\x8a\xfb\ +\x7f\x8d\xc5\xbf\xf7P\xb5\xf3\xa55\xf3\xda\xc8?\xd5\xf1\ +\xfb\xea\x95\xe7V\x01\xd2Kf\xeeX\xe1\xc4M\xcb\x1f\ +9\xb6\xbc\xc1=\x8b\x0elY\xb4\xef*`X\xb3H\ +\xef*\x80X\x01\x10K\x96\x85R\x82ms\x16\x04\x08\ +\x9e\xcc\xf33\x96\xd7\xb6j\x99\xed(\x0fk\xf7u\xa0\ +\xf4\xae=\x14\x7f\x80B\xb1\xb0>\x06\xb9\x1f\xcb\x1b\x90\ +\xd2\xaf;\x10\x04\x9d\xf2/\xe4\x08\xd7\x8c\x12\x08\x05\x01\ +<\x81\xbfg\x83\xff\x07\x04\xed\x8b\x96\xd1\x0a\xb0\xf06\ +\x0aA\xc9\xb5\xfd\x96T\xd5\x0d\x08\xba\x10^\xab\xfa\xf1\ +:#\x80\x03\x00\xb6.\xe21\xd6Q\xe8\x0e\xa1\x0cW\ +>\x02\x98GO-o\xf4\xccr\x87Q\x10\xd7\x09\xf7\ +\x1fXv\xdf\xaee\xf5\xe0\xeee\xf1(>\xc8\xbdI\ +\xe4\x9d2\x09\x0d\x99x\x90L\xbeC\x12\xec\xc5\x1b\xe2\ +\x9dB\xc3\x87x\xd5#\xcb\x99<\xb1\xdc\x99\xeb\x16E\ +\x22\xd37,\xb12\xc0V\xbd\ +\x06\x88\xb6_X\xe3\xde[k9\xfc\xdcZ\x8f\xbe@\ +\xd0\xe1\xfe\xe7\xd6\xb0\xfd\xd6\xaa\x09=eK\x8f\xf0X\ +w-\x1f\xf0\xc5\xe4q\xd1\xfc\x99\x9bV\x04ZKp\ +Y\xe5 \xaaz\xed\x89\xd5\xae?C\xe1\xcf\x91\x97V\ +\xb7\xfa\xd2jAL\xf5\xd23\xab\x5cxles\x0f\ +\xacdZ\x00\xb8e\x05\xa3\xdc\xc4\xc8\xa1\xe5\x0fs#\ +\xc3\xbb\x967\xbc\x83W\xd8\xb2\x9c\xfe\x0d\x0b\xf7\xaeY\ +\xa8k\x19\xaf\x80g D\x84x\x0dw\xaeX\xa4{\ +\x03\x90\xec\x12>\x0e-\xa4\x18?p\x822O,\x80\ +\xf8Q|\x00q\x00\x90\x07\xe8g\xc0q\xb5\x99\xb2>\ +^\xb3\x1c'@\xc4?\x18\xbcL\x06<\xd0\xbb\x0d\x00\ +\xd6-\x03`\xa5\xb7\xccX*\xa1&E\x00\xa8\x1b\x04\ +\x04\x03\x96\xc2kj=._\xde\xa7m\xc1\x02\x9d\x84\ +\xac\xdeM\x94\xb5k\xa1\xa1}\x0b\x0f\x1f G(\xe4\ +\xc4B\x5c/\x9bke\xf7\xee[6\x8a\xcfF\xb1\xd9\ +(9\xc4\xefB\xdc_h\x10%\x02J\xdds\x10\x00\ +\x04\xba\x01o\x07a\x0b@K\x1c\xa8\xf0\x88!\xc6!\ +2q`Q\x14\xe3\x000u\xc3B\xe37\x9c'\x13\ +x\x5c\x18\xc1\xdbevm\x01\xae-\xae\xb9ea\x8c\ +(\x87\xb1\xcb\x1d\xde\x02\x14\xdb(v\xd7\x0a&\xf6\x90\ +}+\x9e>D\xe1'V1{he\xd3\xbbV<\ +\xb1i\xd1!\xf1\x1e\x7f\xe4\x00!\x9e\x8e\xec\xf2\x00;\x963@X\ +\xe8]w\x9e \xdc\xc5\xcd!9\xbc\xcf\xed\xbdj\xb9\ +\xb8\xef\x5c\x94\x97\x8b5Dq\x87\xe1\xb1\x9b\x96\x85\x0b\ +\xcd\xc4\x0a\x03X\xbb\x1f\xc5\xfb5HX\x9cbm\x00\ +>\x10\xe8\xd9s\x03\xee\xb9\x5c\x06\x94\xff\xd1\xff\x85\x00\ +`pP\x9ec\xcb2\xda\x09%-s\x00`\x12B\ +\x09\xc7\x80\x94\xa64\xc07D@\x09C\x19x\x88@\ +\xf7:\x83\xb5\x85\xe2\xf7,2\x8a\x95\x8e\x1fC\xf6\xf8\ +\xceQ\x11L)U\xca\xe1z\x90P\x7f\xc7&\xaf\x9b\ +\x16D\xc9\x02E\x88P\x14\x199\xe5\xfa\xa7\x8e\x97\xe8\ +~\xfc]\x9b\x96\xde\xb6L\x18\x9b\xb7\x94\xe6YB\xd9\ +\x19\xf7\xd1M\xc6h\x9b\xe7\xdb\ +a\x8cw!\xed{\x84\xa8}\xe4\xc0r'\x8f,:\ +y\x8c\x9cXL\xc1\x0cDe\xd6\x93\x22\x85\x81\xa9[\ +V\x02ZK&\xafY1R4y\x1d\x81\xe9\xe2\xee\ +\x0b\xe4\xf2Aq\x9eb?\x03\x16E\xf19\x83\xfb\x16\ +\x19\xdc\xe5\x15\xc4\x0fn#B2\x16@8\xc8\xeeY\ +\xb5\x10J\x8f 9\xbc\xcf\x05\x10\xf9\x03 \x1b\x8b\xcb\ +\xe7\xff\xf3\xf8\xbe\x5c\xae\x17\x01\x84\xa1\x09\x06\x94\xdf\x05\ +\xb0\xec\x00V\x1e`\xc0\xfdX\xa1\xc8\xa0\xbfk\x07\x81\ +\xf5c\x91\x22\x81\x22^\x11\xbcO\x0e\xe4+\x02\x10\xb3\ +\x01\x81<\x81\xbf\x1be8\x10\xcc\xa3\x10\xb2\x8a\xa6i\ +^\x91\x16\x14\xd36\x8f\xa5.;\x00\x04\xfb\xb9\xbf!\ +\x5c\xff(\xd6?\x8er\xc6\xb1\xf81<\x8d\xae\xad\xeb\ +b\x9d.,\xc1I\x1c\x08\xb8v\x90{\x91\xe2B\xc3\ +x\x80\xa1\x1b\x84\xa7#>\xb7\xcd\xf5V\xb9\xc6\x9c%\ +\x13V\x92\x1a&-\xb9i\xd2R[QL\x07\xdc\xa7\ +{\x01O\xb6\x0a@7p\xfbx\x9ba\x80\x06\x00\xc2\ +|G\x18/\x12\x22\x94\xb8\xf0\xd2\xb5A&\xb5l~\ +B\xa4\xafe\xc2e0\xe9MCp$\xa4i\xd8\xd2\ +\x9bG\x10~\xd7\x0c\x81n!\x93j\x01\xd4N\xf43\ +\xc4\xba\x15\x92\x0d\xf1\xcdh\x9b\xe6\xbeg\xe0Cs\x5c\ +{\x1e\xa3\xc0\xdb\xe1\x192\x07\x00\xe3\xe0\xba\x85F\xb6\ +\x00\xc5>`8f\xdc\xd1#\x844\xa6d\xe99\xee\ +\x82\xb4E\xc4N`\x90\x92\xb1\x8c\x5c,$g\x00\xa5\ +\x22a$$w\x89\x84%X\xb0'\xfc\x9e\x18\x1c\x92\ +E\xe1\xf6\xb2Qz\x16J\xce\x82\x99\x07Qz\x10\xab\ +\xcf&\x04\xc8\x0b8\x00\xf0\xf7<\xbe+\x0f\xb7\x9b;\ +\xc25\x88{\xd1\x09b-7\x94=\x86\x8b\x1f\xc1\xda\ +\xf9[\x00\x92\x17 \xfe\x06 _\x01\xdc\xaf\xdc\xac\x06\ +\xdb\x01\x00R&\xab\x8f@\xa6\xc4\xa6s \x5ca\xee\ +9\x8b\xc1\x0dpO>\xc2Kz\x87\xb2\x09\xac\xb2u\ +\xc9IZ\x9b'\x19\x00\xc0\xd7\xb5\x827A)\xfd\xdc\ +\xa7S\x0c\xeewd\x87Wb\xbcx\x85\xc2\x8d<\x0f\ +|$\x00/\xc9D\x82\xe7\xde\xc7\x0b?\xe2&\xf2N\ +\x5c\x0b\xcbM\x83K\xa44\xcd8\x00$\x03\x80\x14R\ +\xdeT8H\x1aDT\x8a\xf1\xb5\xcf\x00\xdeE\xee\x1d\ +\x83\xe8\xc7\xeb\x10\x02r\xe0\x18\xd1\x91[\xb8p\x80 \ +\x22\xd9\xb3i\x99\x1d\x90X\xb2\xa8t\xc8k*\xdc%\ +\xa5\xa6\xc7\x92\xab\xbbH\x97\xbb\x09c\xbc\xaf\xebC\xfa\ +!\xaf\x10\xd8\x06\xc9 \xd7\xe2\xb3\x8d\x0amx8]\ +\x13\xf0\xe9\xbai\x80(\x8dk\xa7\xb5O[z'@\ +\xe8\xc5\xb3\x0c\xe0\x8dF\xe1j\x18t\xfe\xccm+\x9a\ +\x7fH\xc6\xf2\xd4b*\xaf~n\xe5\xabo\x88\xff\xcf\ + \x82\xf7\xb1\xec\x1b(\x1dW\x0b\xc3\x0ev\xc95\xad\ +\xe3^H\xb5\x10\xc5\xceL\x5cU\x90\xd7\xac.\x09\x83\ +\xe8\x04\x85#\x99\x1a\x5c\xdcX@.\x90x\x1fh\xc7\ +\x9dA\x04\x9d\x17\xe8Y\xb7\x1c\xe2n\x94\xfc=\x0a\x88\ +\x22\x10\xb80 \x0b\x112\xb2P@p\x18\x05\x0f\x91\ +\xda\xe1I\x02\x90\xcaL<\x8b\xac:\xb3_ \xd8\x05\ +\x00\x02\x011S\x8c\x9c\xf0\x91=v\x0d\xaf\xc1\x00N\ +*\xb6B\x16\x01\x94\xf3\x02\xf0\x81\x0cy\x82N\x01\xe1\ +*\x16\xba\xce@\xac\x01\x00<\x03 H\x87'dp\ +_J\x19\x03\xa4\x8e\x01\xcd\x1fh\x1e\x01\x00\x07\x01P\ +\x96\x14\x22\x1e\x00\x07\x099\xc1\xeae\xf9(_\xe1G\ + \xd0=\xf8\xbb\x15r\xf8^R\xc9\xd4&\xd2X@\ + I\xd5|\x88\x14\xa1\xb0\x83b\x94\x02\xfb\xb0\xec\x00\ +\xdcG|\x22\xc2wDG\xb0\xbe\xd1[\x18\x01c\x0d\ +\xe8\xb2\x19\x97L\xc6\xcd\x87\xe7HG\xa1\x9aGI\x11\ +w\xa9A\xe1\xff/IrBv\x03H\xc4q\xc4u\ +R\x95Z7\xa0tB\x9f\xe6\x5c\x04\xc0T\xae\x9b\x06\ +!\xf6\xc2\x11\xe0#\xc2\ +\x00\xd6\xef\xc3\x12\x15\x16\x02()\xa0\xf9\x00\x88[\x90\ +0\x14$\x15\xd5\xe7\xfd|\xb7O\x84\x10o\x91\xc1\xfd\ +g\x10_3p\xe1\xe9m\xb2T\x00\xd0\xbc\x88\xcc\xe1\ +J\x19\x18\xc8\xa2\x14\xe3\xee\xb5\x83g\x121D\xa9\xd9\ +(7\x8c\x92#\x837 dX\xaa2\x02\x5c\xb6,\ +W$Qia\xa6\x00I\xec\xcf\xc0\xfd+\x95\x14\x08\ +\xd2\x9a\x17x%\xad\x15\x0f\x10\x08\xce'\xbf\xd2\x01\x83\ +\xafu\xce\x19N\x08\x8f\x19\xc5S\xe5\xc1w\xf2\xe0>\ +\xb9\x84\xd2\x1c\xee?\x84Qduc`\x18\x8dOJ\ +#e\xd6\xff\xa5\xa3P\x89\xfb\xae\xfaq\x801\x0a(\ +.&\xd1\x06\x01\xc2\x10\xdeA\x80\xe1\xef\x0d\x80\xa7i\ +\x96\xffE\xe0A\x19\x0ay\x18_\x00\xce\x95%oN\ +\x88-\x9c\xbf\x87\xb1C\xee\xb7\xde\x93\x0e~c\x9d\xc7\ +?ZL7\xf9b\xe3\xee\x97V\xbe\xf2\x12rp\x8f\ +\xd8\x08\x19S\xec\x85\xfc\x88\xd5\xa6\xc9\x85\xb6\xf0p\x90\ +\x9ct\xbe\xd8\x87\xf8y\xd0@+\xf1M\x22@\x00\x8c\ +\x00\xaf~~\xfe\xbd\xe8\xf7Y\xb8\xe3\x10n9\xdc\x03\ +?`\xe0\xc2H\x88\xf7A,4\xc0\xdf|\x9aE\x04\ +(\xe9\xdcp:\x8a\xc8\xc0\x8b\xf8\xb9i\x7f?\xe4\x08\ +O!\x00\xf8\x09\x07Np\xc3nVN\x82g\xf0c\ +\xb1~\x06\xd5\xafT\x10\x8f\xe5\xc3\xf2}R\x0c\xca\xd7\ +L\xa2f\xeb\xfc\x12\xcd-h\x8e\xa1m\x8d\xc1\x01\xcc\ +(,\x83g\xca\xe09|\xbc\xf7\x03\xf0L<]\x16\ +\xf7\x15\xe6{s\xb0\xd2\x1c\xb9j\xdc\xbdK\x07q\xf9\ +!\xae\x9f\xa5\x94O\x9e\xa8c\xc3}W\xba@\xc5\xf7\ +\xa5;Y!\x0e\xaf\xa0@\x0cE)\xa6\x9e\x9fW\x19\ +@\xb6\xb2\x1e\xdc\x7f\xee\xc8\x89\xe5+s\x9a\xba\xed\xd2\ +\xee|\xc2X.\x9e,B\xf8\x09\xf1\xbcAB\xa7<\ +\xa8\x9fp\xe0g\x5c\x9f\x89\xc7\x08:\x81x\ +t\x10&\x88\x93\xd9XV\xa8G\x96\x8f\xdbWJ\xc5\ +\xfb,\x00\x16\xe03RF\x1a\xc8Mm\xf4\x08[Z\ +\x1b\xe8\xd5\xa4\x0e\x83\xe1\xc3-K\xc9R\xb6\x0f\x05\xf8\ +\xb0|)?\x83\xef\xc8\xe0;2\xf8\xdet\x067\x83\ +P\x95\x81\x05+\xf6\xa7\xe3\x96\xd3\xdb5\x9b\x08(\x14\ +\xc3{4y\x83\xa7\xd0+\x1e$SdR\xd7&<\ +\x04\xf8\x5c&\xaf\x02c\x16^#\xa4\x18MF\x91C\ +\x88\xc9\x19\x22\x97'\x14\x86\x19\x8bl\xdd/\xd7\xf2\xfe\ +o\x03\x85\x5cE\x94v*\xfd\xe3\xbd#\x8bb\xf3\xfa\ +\xcc\x16!\x11OBV\x12\xc2#E\xf0bQ2\xa5\ +|M\x19\xa3\xf4\xa2\xd9{d[\xf7\x1c\xe9\xce\x87\x84\ +\xe5b\x999\xa4\xd1a\x88\xb4R\xc1`\xcf\x06\xf7,\ +\xc1C*\x0c+<\xa0L?^V\x80M\x85k\xa4\ +\xa0\xf4d\x94\xafi\xf4\xe4\x1aV.\ +k/D\xf1E\xf3\x0f\xdc$L\xf9\xf2#8\xd7}\ +\x97z\xe7C\xca\x22dE\xd9x2\xa5\xa7N\xe9<\ +o\x10\xd0k\xc63\x0b\x91N\x02x7\x97\xe6\x8ao\ +\xd4\x93m\xd4\x8c\x9d\xaf\xa3\x90\xee\xd6)L\xa0\x17\x9e\ +\xdf\x8f\xd1\xb9y\x05\x9e@\x00\x10@\x95e\x9c[\ +\xbb\x03\x80\xb2\x1d\x94\x0fA\x94\x08\x0c\x01\xcds\xa0\x17\ +\x19\xa4K9k\xc7\xddz\x86$\xa9\x8eq\x83\x03\xe8\ +o\x19\xa4\x93\x01t\x98\x05h\xc2\x84\x9c\xa8\xb2:X\ +\x7f\xc1\x9c@p\xd7\x8a\x97\xeeA\x00\x1f\x01\x82g\xd6\ +\xb6\xff\xcab\x0a\xa7oXt\x5c\xd3\x92\x9al\xc1\xda\ +x\xe8\x0c\x91>,S\x00\x90\xd2=!\x0e5+\xbe\ +\xad2\x10\x905,!\x93\xc1\xc8B\xe9!\x5ck\x18\ +\xeb\xce\xc1E\xe7\x10/\xf5z\xa1h)\xffB\x22<\ +\x98\x16\x8fr\xe4\x9ex\xe0l\x91@\xd8\xb1b\xa6\x08\ +Lj\xa3\xc8\x93\x08\x10y\xb4\xf8\x0610\x00\x00\xe4\ +\x0e3!wN\x18\x08Y\x83r~\x111'\x00\xc2\ +\x0f\x10}\xf2(\x88\xf8K&\x96\xa9\x19\xbb\x9c1\x1e\ +|\xf6\xb1[\xc4\xaaXye\x15\xab\x92\xd7(\xe0\x15\ +\x16\xf9\xc2\x8a\xe6\x9eY\xe1\xccc\x0c\xe0\x1e\x83u\x8b\ +AS\x06\xb0\x8b\xdb\xe5;]\x88\x02P\xcd\x00\xacE\ +\xe3\x22\xe3\xc0\xf2\xf1,R~\xd6 \x19\xc8\xf0)\xd7\ +\xb8\x8d\xe2\xef\xa2x\xb9uM\xb1\x22(>\x8f\xb8\xeb\ +\x04\x05\xe490\xdc\xc1\xd3b\x89N\xf9w\x00%\xe0\ +\x1c\x87_\x0c\xe8\xd9D\x88%\x1b.vg\xcb\x0b\x01\ +FI\x96V?\x19\x03)7\x95qJ\xaa\x9f\xb0D\ +\xc8_\x02\x5c \x01R\xa8\xf7JA\xf57e9~\ +B\xa2@\x14R(\x83hF\xf1\x02\xd1)\x84\xeb)\ +\x13\xc8\xe3\xb5p\xf6\xa6\x95\xcc\x9fZ\x8c\xdc\x8d\x06V\ +3i>\xc5}\xacR\x1e@\x0f/\xf4\xfb!6\x9e\ +\xe8\xe7s\xc5kb\x04+P\xb6\x10\x92\x95\xe1JE\ +\x98\xa2\xc3\x5cL2\x04\x8b>\x8f\x9f\x9e\x17\x80\x5c!\ +\x11\xae\x93\x03a\xcb\xe1\x01#\x90\x9e\x90\x18*n>\ +\x93\xf8\xe6Sz\xe6H\x19\xfc\xc2e\x10\xe4\xce\xca0\ +\x94f\xa2\xec,\xee/\x8b\xff\xd7\xf2sP\xaf\xdcw\ +\x16\xdf\xffI\x00\x98\x16v4\x1f\x9fE\x98\xc9\xe6~\ +\x22\x9a\xd7\x9f\xbc\xcf\x83>u$\xb7b\xed\xb5K\x7f\ +\xaa\xd6\xdf\xc2\x86\xdfZ\xd9\xca\x1b\xdc\xe2+\x97\x02\x17\ +\xce\xe2\x11&Q\xe6\xa8\x8ca\xdf}\x7fPs\x0f<\ +k\xa0\x13W\xdf\x85K\x86Gd\x91\x16z\x16\xcfg\ +\xc7Q.\xdf_\x80G)\x9c}\xe4\xbe\xa3\x00W/\ +eG\x89\xef\x11R\xd4\xc8\x04\x16>\xa6\x99FM`\ +\x1d\xe1uN\xf0>\xd7y=&\xe5\x16\xdf\xd0=\x03\ +\xdan<*\xbcGK\xdcY\x9a{!~\xe7\x11B\ +\xc4\x1d\xf24c\x8a'\x08IGx8\xf1\xb1d\x98\ +\xbf\x07\x82aK\xa8\x1d\xb1D\xb2\x84dx\x94f\x22\ +}\xf0\x00y\x0c\x01G\xcb\xe7!@\x1d\x22M\xce\x86\ +kd\x911\x051v-\xa9\x07\x09s1\x9a`\x91\ +\xc8\xb5z\x0cZ\x0b+\xc4=,@3TY\xfcN\ +\xf1:\x9b\xcf\xc8\xda\xb3dY\x9a\x16u\xb1\x93\xf8\xa5\ +T\x09\xf7\xa7\x85\x14OH\x9b\x86\xbc\x85\x94\x90\xe6\xd1\ +Q^\x88\xef\x09\xf3}.\x15\x84\xd8i\xe1\xc8M\x15\ +\xf3\xb0\xd9\x9a8\x12\x08\xf0\x04\x9a\x0d\x0b82\xe9\x89\ +G$5\xcf \x22\xc9}\xf0P\xfa\xce\x90<\x08\xe1\ +*\x0ca\xd3B\x8e\x13\x0d\x10\xa2\x1a\x85\x08\xf9\xb5\x96\ +r\x9dr\xb4\xc2\xb7\x00\x00\x96\x9f\x03\x02\xbc\xc0\xeaK\ +@\xf0\x1a\x00\xe0\x05\xf0\x08\xa5\xfc\xbeh\xfe\x11\x96\x8b\ +\xd2\xc65KG\x08\xe0\xbb\xb3\xf1`\xd9\xe7s\x02\xa1\ +\x01\x14>t\x06\xa0n\xf3\x19B\x06\xdf\x9bGH)\ +\x9c{\x845?\xc5\xb3<\xb7\xca\x15\x85\xd2\xc7.\xb6\ +\xe7\xcd\x9cZXs\x13\xc4\xf6\xe0\xa0\xe6.\xf0Z\x80\ +=\xd0\xb3\xee&\xcc\x22<\x7f\x98t\xd7{~1\x7f\ +<+\xa2e\xedL\xe5\xec\x9aY%~\x17A\xdeJ\ +\xf1&ex\x95\x92\x09\xc2\x85V'\x01\xa4O\xd9\x07\ +\xa19\x19\xf6\x9f\x88\xfbO$3Hl\x98\xb0d\xcd\ +|\x0a\x00\x18\xb0\x00\x90\x89\x17\xd0\xd2\xb9\xc2I\xa6x\ +\x04?\x07\x18?\x17N\xd1\xa9$&@\x8c\xd6<\xbb\ +\x1f\xcb\xb9\x10}0\x0bt\x88\x08i\xc2&\x8aE\xe4\ +2\xb8Q\xdc{\x14\x92\xa3\x19,O\xe9\x0c2V\x90\ +O,- \x85\xd4\x92j\xee(\xb1\x14\x00\x84\xb0J\ +)-\x0b4f#!,9\x8c\xcb\xcf\xe1\xc1s\x07\ +\xb7-wh\x9b\xef\xc2\x1b0\x18\x9e7\xe0\xb3\xb0\xdd\ +,\xa5c(=H|\xd7\x8a\xa1^\xf5\xb3H\xa5x\ +\x83f 5\xfd\xac\xfc9G,\x17\x89\xf0\xde\x13~\ +\x1e\xc1\x13\x11\xcf\xf3\xb8\x97\xfc)\x01\x80\x98\x8f\xa2J\ +\x16P\xce\x22\xb1w\x09Y~j\xc5\x8bOP\xfcc\ +\xac\x16\x85\x11\xb3\xa3.\x1d\x03DR>\x03\xa6\x95\xba\ +\xf0\xf9\xdc\x7ft\x0cw>\xf1\x00\x90\xc0\x1df\x1e\xb9\ +\x82\x98\xc2\xb9\x87V\xc6w\xd4\xc2\xaa[\xb6_#\xaf\ +\xacq\xe3\xa9U\xa9\x00dJ\xcb\xd7\x1aS\x19\x94\xb2\ +\x12\xc2\x08i\xa1K\xa3Q\x90\xe6J.\xc4M\x98u\ +\xe0\xf1:I\xa9{V\xf0<\x02\xc0\x0e$\xf2\xc4J\ +\x08\x1d\xe5\x10\xc7J\x00Z\xa1\x05\xb8I@\xaa\xb9\x88\ +ntD\x18N\x87\xf3\xb85\x08\x91hxT*\x1e\ +T\xd7\x12\x99\x8c`\xe9\xca>\xa2\xf0\x80\xc80\xe1\x0a\ +@\x8bC]L\xa8\x05\xf4\x1dH\x8c\x98\xabf\xb7T\ +y\x93\x89\x82\xb5\xcc\xaaU\xb6\x08.#*\x97\x85\x14\ +\xe0\xc2\x0a\xb5d\xc9\x97\x15\xe0\x8e\x0a\xc7\xb5^@^\ +\xc9\xe0\x951\xb8\xaa\x0f(e@\x0a\x88\x81Q<\x80\ +\x18\xb5f\xbdD\xf2\xbc\x89\x22ra,<\x8c\x8b\x13\ +\x00\xf2p{Z8\xca\x1f\xddw\x927B\xaa\xe4\xa6\ +\x9e\xc5\x0d\x142\xf08\xf2>\x22\x98\xf2\x00\xb0\xf0\x10\ +`\xd2\xdf\xa4|M#\xe7\x89\xe1\x8e!\xdc\x97\xd2(\ +1i'zh\xc7\xc0\x05\x02B\xc0\x04\xf1yR\xa1\ +\x00\xef\x84D\xf5:\xe5\xbd\x8a \xe5\xa0xY}H\ +\xee\x12pi\xba\xd6-\xd3*\x94\xe1E\x14\xdb\xf3\xa7\ +p\xed(\xbe\xd0)^\x96\x0f\xa1\xd3\xd2\xf9\xe2Ck\ +\xdaxf]{\xaf\xac{\xef\xa5\xb5m=\xb1\xba\x95\ +;V0\xa1\xd5K\xcdF*;\xd1<\x8a\xea\x1e\x94\ +F\xc3q p\xeeU5\x11Xl\xb0}\x8eg]\ +\xe0\xf9\x96\xe0Hk\x18\x1c^\x01\x83\x10\x18\x8b\x09#\ +\xe5\x90\xc7J-\xc6!Z\x85\xcd\x1f'\xf4\xc8\x13\xe0\ +a\x15\xf2\x02\x8c\x93\xe3m\x22\xee\xce\xf5\xe3i\x87\xf7\ +\xad\x90\xf4\xb2\x08b_D\xec\xd7\x1a\x8e<\xa3\x96\xaf\ +U\xd7\xe02\x16\xe7\xd9N,&\x17\x0b\x8e\x8e\x8b\x05\ +\xe3\xe2\xb0\x1c\xad\xb0ET\xdc\xa0\x14\x86/)\xc0\x95\ +\x15j\xad\x9a\xc1\x16\x08\x0aa\xca%\x90\xa5JHN\ +\x0d\x03P\x8b\xdb\xabY~b\x15\xaa\x82\x99\xe2{\x18\ +8\xb9O\xcd\xaaerc\x9a\x0c\xcal\xd7\x84\xc8\x12\ +\xc8]\xe5!\xaf:\xcb\xcf\x13\x00\xc6\x0e\xf8\xfeC^\ +\x11\xe2a.\x0a\x94\xb7\x11I\x8c`\xed\x0a\x1d\xd9\x9a\ +G\x90(\x8c\x88C`\xa1\xb9\x9aM\xe3>\xf2P\xde\ +\x05\x00\xc2C\x90&b\x9b\xf2i\xa5q\xb2\x00\x97\xd2\ +i\xda\x18P\xbb*\x22\xb9A\xd2-\x89J\xcaD\xb6\ +\xa4(\x0d\x9a\x98\xb3\x08\xa6\xf8\x84\xb7\xe2\x088\xc6\xf1\ +\x0c\x0e@x6\xc0\x9dG\x98\xc8\x83\xddk\x11%_\ +\x8bf\xb3\xa7(\xfc\x9e\xb5o>B\x1eZ\xcb:c\ +\xb2\xc0\xb8\x8d*m\xc3B\x9d\xf2\xc9\xa4\x1c\xc1\xc5=\ +\x93\xbe\xa5\xfdN\xd2\x01A\x16\x00\x08a\xfda\x01\xa0\ +\x97\xf1\xe9\x07\xf4x\x0e\x01R\x0bo\xaa\xbb(#{\ +\xa8 },c\xbc\x0b\x09\x09yd\x1a\xf2t\x0a{\ +Y\x8c\x95RG\xf7\x0cH\x10\x8e\x95\x8b\xd1\x16O\xdf\ +\xc2@o#0\x7f\xee[\x9eY\xa48{P\xe1\x0c\ +/=r\xc6w\xdc\xb6\x98\xe2\xf9g\xa0\xf9\x89#1\ +\xf9Z\x0b\xe0A\x9d\xc5(\x9d\x11\x08\x88\x8b\xf9(\xbf\ +@\x1e\x00\x17+)f\xe0+g\xcex\xd8{V\xbb\ +\xf4\x00 <\xb0r\x15\x18hiW\xf3\xe5\xa4|A\ +,6S\x88T\x5c\x07\x00\x99\x1d\x80@\xb5\x01=\xab\ +\xb8\xf1\x0d,^ \xd8\xe5\xbb\xf7\xf10\x87N\xf2G\ +\xb5\xac|hy\xc4\xf6(\xca\xca\xc1\x8b\x84\x01\x92\xac\ +_\xf3\x09aBS\x0e\xee\xd9\x03\xc0\x89\x93(\xde@\ +\x96\x1f\xd2D\x0a\x96\x93%\x12E\xa8\xf1D\xef5\xe5\ +\xec)\xd9O\x88\xc9\xe8\x22m\xec\xc4%\x03\xc8t\xee\ ++\x0d7\xac\x05\x1d\xa5\x92Z\xdc\xd14\xafV\x1c\xb5\ +l\x1b\x1a\x85\xe5;\x81\x1b \x11\x18uD\xa1\x82\xeb\ +\xcaC\xe6\x8d\x1dY\xc5\xecukX\xbae\x8d\xcb7\ +\xad~Q\xe3rh\xb9C\xcaL4/\xb1\xe0V\x0a\ +E\xda4\x81#\x00x\x82\x07p\xb3w3\x00`\xd1\ +\xc2\xe7\x0bf\x11 \xc9\xc7{\xe52\xce9\x18\ +\x80\xc0\x1dR\xba(\x10\x88\xb4\xa2\xfcl\x80S\x80\xe1\ +\x96\x93eT\xa2\x97*\xc2^\x05\xa1\xae\x80p\x18\x19\ +\xbd\x83\xdc\x05\xd8\xe8y\xf2!\xfa~l1e\x8b\xcf\ +A\x16\x04f\xe9\x19\xaf\xc4I\xad\x12\xc1de\xcd\x02\ +\x80bH\x94\x0bE\xa5\x14Y\x1fR\x88{*\x87\xc9\ +Vc\x015\x0bw\xac\x1a)S\x09\x94\x06\x08Tf\ +\x8b\x95\xe3\x9e4\xf8YZ~e\xd03yH\x89V\ +\x09E|<\x10\x10\x0a\x00@\x11.\xb3x\x92\x98\xa7\ +%hX\xb3\xbcM\x81f\xcf\xb0\xe0\x5c\xacY\xd7u\ +\xd7\xe6\x1er\x01\xa0\xabA@\x14\x0arP~\x18\xcb\ +\x97\xf2\xc5\xa63\xf9~\x91\xaa\x80\xe6\xf7Q\xb2[g\ +g@\x03\x9aM\xe35\x83\x90\xa4T\xc9\xd5\x0d(n\ +6\xcd\x91?\x93\x81(\xcf\xef\x12q\xd2b\x13 \xe6\ +\xb9%\x99<{&\xd7U\xcdA\x90{q\xec\x19\x0f\ +\xa2\x9c]YL\xfe\xe0\xa6\x95\x8en[\xf9\xd8\xb6\x95\ +\x8emZ\xe1\x90\xc2\x15it+\xdf\xaf\xc5!Y>\ +9z\x0a\x0a\x97\xe2\xf5\xdeM\xaa\x9dO\xa8es\x7f\ +\xdeB\x19\x9e\x91\xf0\x18\xc1#iZZ\xeb0\x01\xa5\ +s\xf2J(X\x99\x89\xe39\x0e\xf0\xc8'\xf2\x0b\xf8\ +\x19\x1b\x85.)_\x9f)\xc4\xf5W`\x9c\xd5x\x8d\ +\x1a\xf8N\xd5\xd2S\xbc\xd5#G\x8as5\xff1\x85\ +\xf2I}\x0bg\x9f\x08\x00OP\xfe\x13\xc8\x8b\x08\x0c\ +\xae\xdc\xc5\x1a\xf2T\x01\x00\xf4\xe70\x18\x1e\xa3\xf7\xe6\ +\xf0e\x91Q\x90VD\xdc.#\x95)\x9f\xbaf\xe5\ +\xd3\xd7Q\x1c\xf1\x98\x8bk.=\x84\xa5\xaa\x94*\x1b\ +T\xba\xd94\xac1\x88\xfb\xff\x04\x82.@ >@\ +&P\x08\x00\xca\xa6N\x08)7\xacj\xee\x96U\xcd\ +\xde\xe2\xe7\x1bVL\xe8q@\x10\x07A\x0a\xb1\xb6\xa2\ +\xf1\xe3OR\xc0\xcfQb\x9d\x9bBu\xca\x87ek\ +\x1d\x01\xc5k\x81\xc7-\xf2\xa0h\xb7\x82\xc9 \xaa\xf4\ +\xcb\xa5v\x9al\x01\x0c\x0e\x18.\xdde\xa05i\xd4\ +\xad\xd4\xef\xc8-\xf7f\x11c\x83R>\x03\xad\xa5i\ +?\x80\xf6\xf3<~\xc7\xa0a\xcf(\xc6\x07\x90\xfc\x9a\ +\xeb\xe7:!H\x9cD\xf5\x90*\x7f\xf35K\xf1S\ +\x96\xa2i[Y>JOE\xe9\xa9\x9aQm\x12\x1f\ +\x80\x10jB\x8dLGs!\x9a\x13\xc9\x19\x80\x14\x0f\ +\x89\xe0\xe2\x81t\x8f\x5cC\x00\xd0\xab\xcb\xc8dL\x1a\ +K\xc6\xfeB\xb2?\x09\xe3\x0c(\xc5a\xc2\x84\xbe<\ +\xbc\x94b\x7f\xc9\xec\x1d\xc7!*0j\xf1\x87\xe2\x99\ +{V$\x91\x81;\xb9O\x08 F\x94\xe2\xbe+H\ +_*\x17!6\xf3\xf7H=nc\x95\xb7\x18`/\ +\x9dSi\x94\xe6\xb75\xeb\x17\x14#gPs\xb8\xf1\ +<\x10\x9b?\xb8Ez\xa22\xb0\x1d\xe2\x97j\x03\xfe\ +w\xc9\x06\xd1\xaa\x11\x90efv\xc9\x22=\xe6\x1b\xec\ +\x5ct1\xafhd\xc7*\xa7\x8e\xacf\xf6\x9a\xd5\xcd\ +\xdf\xc0\xab\x5cw\xc0*\x84\x13\xe4\x0f\x13\x07\x87w\xf1\ +\x06{\x00\xe2\x00`\x1cy2y\x08\x08\xf6\xb8&\xe1\ +\x01N\xa1\xfa\x03-E;\xe5\xb7{\xcaw\xa5_(\ +X\xae4\x0b\xab\x0e)\xae\xf3<.S\x00\xa89\x0c\ +\x94\xe6\xfb\x95\xb2j\xd5/\x87\x98\x18\x1d\xbb\x83{\xbc\ +M\x0a\xa7\x22\x93\xeb\x16\xe4\xf3\x81\x81C\x94\xaf\x15I\ +\x84\xd0\xe6RfB\x85&\xcb4\xff\x9e\xaeU\xb8\x06\ +b\xfa\xb9\xa4jF\x137\xef\xc9\xb9\xf2\xa5x\xd26\ +7\xb1\x06s\xcf \x97w\xe5c\xe2HR.\x8a\xcd\ +V\xcd\x858\x8c\x96\xc85\x0d\xcd\xd8\xb9\xf0\xa5\xbf\xe3\ +\x11\xe4\x15\x5cH\xd5\xff\x08|\xe7\xe2y8\x9e_\x9e\ +\xb6W\x04r\xdb\x85Dq\xa3\xfc\x09\x0c\x09\xbeR\x06\ +\x17(W\xb5\xd7\xec\x19\x9c\xe2\x94\xf4\xf2\x96\xe5O\xaa\ +\x88\xf5\x86\xc5\xe4\x8b\xe8\xe1\xceKfn\xa2x\x88\x03\ +\xaf\xaa\x08\x12\xf1\x8b2HZ\xd0P:'\xc5k\xde\ +_\x8b?\x01\x88\x8d\x8a;\xb3\x18\xecl\x06]u\x7f\ +!,<\xa4<\x17`(\xa5\x0b\xf1P*\x14\xb9\x00\ +\x80\xf3\x00\xce5k\x92g\x8e\xef\x82\xfc\x00\x88\xc2\xc1\ +\xab\xb8\xcf\x1d\xab\x9a\xdc\xb7\xea\xa9\x03\xab\x98\xd8\xb3\xa2\ +\xe1-\xcb\xed\xc7-\xc2\x8as\xfa\xd7\xc8\x1a6\xe0\x1d\ +\xb8\xd9\xa9=\xab\x98\xde\xe3u\xd7J\xc6\xf9\xcc `\ +\xecUX\x81h\x9e\xd7 \xf8\xb5\xd6\xaf\xd54\x06&\ +\x13o\xa5\x8a^Y\xb5H]\x14\xc5j\xb2Gq\xb4\ +P\x0b$\x9a#\x9fy\x80\x90\x12\xce>\xb3b\xcd\x0a\ +\xce>\x86\xe4\xdd'K\x80\xd0\x92I\x84\xc8jB\xe2\ +\x03C0o\xf1\x1b\xbeO\xdf\xebf\x09\xa5P7M\ +.\xb7~\xe1\xe2/\xc4\xb3z\xa7x\x80\xa2\x99UM\ +\xe2\xb8\x096)R\x96-\x05\xa3\xe8 \xca\xcfR\x18\ +\x13\x91\x05\x00\x9a\x07p\xeb\x02x\xaaLy)\xc0\xa6\ +5\x13w=\xe7A\xe4I\xf8nD\xd3\xe8.\xbdT\ +Z\x09\xef\xd0\x8a\xa2V\x16#x\x93\xe8\x88H\xf6\xb1\ +\x95\xe2\xa1+\xf0\xb0\xe52\xae\x19\xbc5^[3\x90\ +\xca\xf2b\x22Xn\x8e\x8a9q\xc5\x85\x13X\x16\xf1\ +\xb8\x08\x0b\x14)SUPXV\xcc\x8d\x04eM\xb0\ +\xda\x80f\xea\x9a\xbd2\xef@\xf3\xa4e\xb6L\xe1\xf6\ +fI\xd7\x16\xf0\x0c\xaa\x00Z\xe5\xf3\x02\x02y;\xca\ +\xbf\xa8\x16\x0a\x09\x9d\xddZ\x1d\xd4J\xa1\x5c'\xa9\x0f\ +\x9f/\x80\xf5\x96\xa1\xf0\x0a\xe2h%J.\x1b\xde\xb0\ +\xfc>\xe2b7\xe4\xa8\x1bv\xdc\xb3Hl\x5c\xc1S\ +\x00\x94I>7\xb5\xe5^K\xc6\xae\xc2G\xb4\xd4:\ +\x8f\x85\xcc\x03\x809\x0f\x5c\xca\xab5\xa9\xa4\x01&l\ +\xb9B\xd2\xa1\x1b\x907\x88-\xa9k\x81X1n\xb1\ +d\x11\xb7Hl,_~i\x15+\xef\x90\xf7ns\ +H\xf9\xd2+x\x10\xa4xF\xeb#\xca\x904\x01\x04\ +\xb9\x85uk\xa2IdK\xdf-\xf7\xad\x18\x9e\xeeV\ +I=\x00\xfcC\xbc8\x9f\x0e\xbf\xf0a,n\xb9\x99\ +\xf1\xd3\xac\xa6j d\xa9Y2\x0c\xdc~\x96S>\ +\x0aGa\x9a;\xd0\xfb \x0a\xd4\x8a\xa0@\xac\x19\xd2\ +\xf4s\x22\xa9p\x92\x5c\xaf\xbd\x14\xe3\xc8\x98\x93\x94\xfa\ +1\x806\x0e\x18 \x95*<\x01\xfcA\xc69\x1b2\ +\xac\x22S\xd5g\x16\xe1=K\xa7\x0e\x9d\x94\xe0=\x0b\ +\xc75\x8f\xa2*\xafm\x8b\x09\xc2\xca\xe5B\xe5JU\ +\xcf\xa78\xa4\x14-\x97\xf8\xaa\xca\x9d\xdf\x03@)\x9d\ +_h#\x7f\xf55N c\xc88`\x98\xc43L\ +;\xab\x0e\x8a\xed\xa3\x00\x91?y\x82\xb0\x5c\x92\x9bP\ +\x22D\xf0]\x02F6\xee,\x9b\xef\x8b0 \x05<\ +l)\x00\xac\x18\xdd\xb5\xca\xd1\x1d\x00\xb0i\x05}+\ +\x96#\xe5w\xc9K\xccA\x92\x16\x085\xcbV<\xba\ +\x86\xe2\x91\xd1U\x88\xe82\x1e\x02\x0f\xd45\xcb\xf5f\ +\x19`\x00\x80G\xf2\x0aR\x96\x08\x05\xb24\xa5F\x9a\ +\x0d;B\x81\xd7\x01\x806p\xdcE\xf9\x0f\xacl\xe5\ +\xb1U\xae\xbf\xb0\xea\x0d\xed\x81\xf8\x02\xf9\xca\xea7\xbe\ +\xb4\xda5\xc0\x001.Q\xce\xaf\x8c\x08/\x10q\xca\ +W\xfeL\xfa(\xe5\x93\xd9h\xdaZK\xe3N\xf9.\ +\xbf\xbf\x08\x03S\x80b\x9a\x1c_S\xda\x0b\xa4\xc0\xe2\ +<\xde\x18g\xf7\xf1\xdcx\xb6\xec\x01\xd2Z\xf2\xfd,\ +8P\x10\xc9$\x94\x06\x00D\x00\xa5y\xfb\x1c\xb4\x9a\ +\xa90\xa1:\x8cYK\xe1\xfb\x93\xeb\xc7\xdd\xd4o\xa2\ +\xa6~\xab\x07\x91\x01KD\x92j\x06-\xa5n\x84{\ +\x98\xe0\x9e\xce\x01\x80'\x16\x00B\x22\x95\xe84\x8f0\ +[0F(e|\xf3y\x1f\xe5w\x9a\x81\xcd\xc4+\ +\xc7x\xb1\x12\xa5\x11\xa3\xc3\x179:\xcaW\xa5\xaf\xdb\ +\xf4!R'\x02\xe5\xd2:\x08\x93sG\xb84-\xd8\ +\xe8\xa2\xa0/\xa3q\x12\xe2\x83W\xd0\x1c\xbe*\x85p\ +q\xaasS\xcd\xa0\x9b\xb8\xe1\xbb\x1cs\x87Q\xe7\x12\ +S\xa3\x90\xaa\x1c\x14\x93\x8b\x85\x16B\xb2J`\xb6e\ +\x90\xba\xf21\x90\xcaM\x16\xe2\xdasU\x05\x8bug\ +w\xce8\x09w\xcf\xc1\x94\xe7\xf9\xdf\x05\xcbE\xf4>\ +\xa4\xaaY,_\x1e (\xcb\x97\xfbg\xd0\xddB\x96\ +\x8b\xb5+\x96\x01\xc9\xf3w\xc9\xd5\x02f\xae\x13U\xc8\ +S,\x5c\x82\x1c\xad=\xb5\x9a\x8d\xd7V\xbf\xf5\xb95\ +l}a\x8d\x9b\x1f\xacn\xed\x8dU.\xc0\x9a\xa7\xef\ +\x91N\x89\x07\x1d\xbb\xa9g\xa5\x94\xae\x80E3z\xca\ +\xebQt*\xd6\x98\x825\xaaH#\x15\x05\xa9,+\ +\x03e\xf9P\x9a\xd62\x82\xb8d\xcd}d\xc3u\xb2\ +\x01uv\xff2\x8c~\x09\x01\x14x\xb5 \x9e.\xc0\ +\xdf\xb4\x0e\xa0B\x18\xa5\xa6i\x0d\x0f\x81\xe4\x15\x11\x0ar\x07\x95\x13\ +k\x105\x98\x80\x0b\xd1k\xa0\x1dO\xd3>\xc5=\xf3\ +\xbec\x06\xd1\xfd{ V\xf5L\x06\x0f\xa5\xb2/\xad\ +\x8cI\x5c\x09\x18\xca\xf03\xc0A\xb9E\x88e.\xcf\ +\xa7\xda\xf82@P\xb5\xfa\xd4\xed\xa8\xa9\xbb\xfa\x0a\xe5\ +\xe3\x114]\xccXs\x02\x11\ +\x94\xab\xc9\x197g\xaf\xf9zrhW\x17@\xa6 \ +\x90\xa8\xd2U\xa5T\xaa\xa7\xcbG\xc1ES\xf7\x5c\x1e\ +Z6G\xca9\xff\x94\xb4\x04\xd1^<\xa4z\xe1\x99\ +\xd5,=?\xcfWq\xcd\xa4\x82\x85\x10\xc2(\xf9\xb4\ +\xea\xe1\xfd\xed\x22:\xb8V\x15:\xe2qT\xe3\xafJ\ +\xd8\x14m\xfel\xc6\xeaTIK\xecK\x03\xc8\xca\xed\ +U\x0a\x9eD\x5cL\xa8\x1bf \x87p\x9d\xc3\x00a\ +\x0cw\x0ap \x8b!\x5co\x14\x90\x17LA|a\ +\xc6\xe5d>\x95\x5cW\x93&\xe5\xe2\x07\x137\x9d\xf7\ +\x0bCb\xb5\x1a\xa9ei\xa5t\x8a\xbbRzb\xf5\ +\x08\x83\x8fEV\xfeCT\x98\x91R\x87\xf5\x036U\ +D\x85\x18\xec\x08\xde/B\x8c\x95W\xcdRyv'\ +\xe0h\x1b\xc63\x0d\x00\xca\x01\xee\x1d\xd0\xf0\x0c\xc9<\ +K\x12\xa14\xb1~\xd4Sz\xcd\x90\xc5U\x0dX,\ +J\x8fE\xe9W\xca{\xecJY\xb7\xc5:\x01\x00\xe5\ +\xb2|mv\x19u\xe9f6\xc0V\xf5\xb6\xdb]\xe4\ +vx\x9d\x91\xe7\x9f\x02\xf2\x9b\x84.M\xf3k)y\ +\x8b\x90\xa2\x0a&-k\xab~\x91\xb1\xd2\xc2\x11\x9e;\ +F\xec9\x0c\x11+P>>w\x13e\xdc\xb5\x86\xb5\ +G\xd6\xba\xf1\xd4:6\x9f[\xfb\xc6sk\xbd\xfa\xcc\ +\x1aV\x89\x99\x90\xa7b\xb1h\x01A\xf3\xe50bW\ +\xf0!\xe9\xe5\xbd\xea\x00T\x11\xe3V\x08!]\xa3\x9a\ +\x17\xe7\x7ff\x1e[\xd9\xc2s\x06\xfa\x95U\xad\xbc\xb6\ +\xea\xd5\xd7V\xc3k\x0d\xaf\xb5\xb8\xdc\xba\xabo\xacv\ +\x9d\xbf\xad>\xb1\xd2\x05\xd5\xcaifO\xeb\xfa\xaa\xef\ +W\xb95\x83\x7f\xb1\xea\xc5\x83'\x12\xf3\x12\xa5\xe0\xfa\ +\x11g1Z\x05K\xc6:\x93\x88\xbdZ\x16\x8d'.\ +\xc6Uuc9\xda\x07\xd8\x85\xc5\xf6\xf2\xc0\xc3\xcec\ +d\xe3vs4\x039y\x02\xfb'\xeb\x01\x04\x92\x12\ +\xd2\xa5\x22\xbc^\x9e&W\xa4|\x14\xa9\x02K\xb9\xf9\ +$\x17{\xa5|\x09\xf7P\xcd\xef\x9c\xe0\xa2k\x95\xee\ +\x09\xa4\xcaB\x94\x95\x90\xcb\xe315\x81\xa6I\xaa\x10\ +^G\x045\xa3e\x84\xb0\xd1k\xc95\x9d\xfc\xbf6\ +\xa7v\xe3\xd6q\xe5N\xfa\x9c\xc4U\xc9\xbdK\xfa-\ +\xb6\x1c\x00H\xca$x\x81\xf2\x01,\x7f\x10\xe5\x8f\xa0\ +|\xc2\x0c\x8aT\xb5\x92\xf6fH\xf1.\xa3\x99#l\ +\x01b\xadu\xe4\xe0\x054y\xa4\x14\xd3\x15\xf7\x92\x81\ +x\x05>\xe2-\xe2,\x18\x12\xa1#F7\x98\x87E\ +\x94\xe2\x12kV\x1fZ\xf3\xd6s\xeb>xkc7\ +\xbe\xb0\xf9;\xdf\xda\xe2\xddom\xf6\xeck\x1b9y\ +o\xad\x00BS\xbe\x8a\x8d\xb9\x90\xaa(9tt\x80\ +\x87\x1d\xe0u\x90\x9f\xb1\xf8\x5c\xa7\xf8\xbbd\x15\x0f\xc8\ +C\x1f\x93s>\xb5\xd2\xf9\x97V\xb9\xfc\xc6\xaa\xd7\xdf\ +Y\xcd\xd5wV\xbb\xf1\x16\xb7\xfb\x86\xf7\x80\x00\xa9\xc6\ +\x05W\xad?\xb3\xf2\x15\xad\xdc\x9d\xc2\xbc\x0f\x88\x91\xeb\ +\x96\x8ekK\x22\xd6&\xd4N\xa0\xd4\x09^'\xb1\xec\ +I\x94?n\x09(Z\x92\xc8\xdf\x93\xc8\xb3\x93H\xb7\ +\x12a\xde\x09Xb\x1c\xae3\xb6\x12\x8b)\xef`\xd0\ +:\x18\xb4n\x06m\x80A\x98\xf0\xbc\xc0\xd0\xa6\xbbF\ +>\xe9P\x01)o\xc1\x946\xbc@\x125\xcb\xa6x\ +\x0f9\x15\x97\x10\xc1\xd3\xba\xbbW}#\x12&\x85\xe3\ +\xaa\xeb\xe7a\xe4*\x07W\x15\x92\xea\x10E\xdc\xe0I\ +\x18@xD\xeb(\x8c\x81\x16m\x00\x81*\x81\x15\x9e\ +\xd2\xb1ro\xb3j\x97%Ttr_]\x08 \x95\ +K\xaf\xecq1=\x1e\xe5\xc7c\xdd\xf1UC\x08\xde\ +\x00e'T\xe1\xcd\x00[b\x8d\xbc\x90\xd6\x144k\ +\xa9l\x02\x0f\xc3\xf8\xe7\xe3\x9d\xdd\xe2\xd4\xfc\x03Wy\ +\xa4\xfa\xbf\xc8\x98\xf6\x1e\xee\xb9I/\xcd\x13\xa8\xeaJ\ +\xd9\x88\x0f\xcbW\x88\x92\xe7\xf0\xb5@\xe4\x91\x98\x5c\xcd\ +\xac\xcd\x9e\x92\x06=\x84\x0c\xbd\xb4\xd6\x83\xf76x\xf3\ +k[z\xfc\x93\x1d\xbe\xfd\x93]{\xff';x\xf5\ +\x07[\xbe\xff\xd1z\xf7_\xe3\xbe\xb9\xc8\x98,\x1c\x91\ +\xc2\x87\x15\x1an\xe3A\xee\x92F\xde\xc7}\x8b=?\ +E\xf1/q\xb1op\xb1\xef\xdd~\xfbZ1l\x88\ +V\xed\xd6{\xab\xd9|mUW\x9f[\x05\xf1\xb7\x5c\ +\xe5Q\xb8\xe0\xe2E\x95N\x9d\x91\x7f\x93o\x93\x85\x88\ +\x11gp\xf3\xa9 7\xb9y\x19R\xb4\xf2;Y\xe4\ +w\xf3\x96DN\x9c\xd4\x04H\xf8\xd9\x09?'\x82\xf0\ +\x04<\x85\xe2g\x02\x16\x95\xc8\xc0&U\xf7C\xd4\x88\ +\x97\xcaVD\x18\xf1\x02\xa1\xa1-\x94\xb5\x87\x9b\xd4\x0a\ +\xa2\xa6W\xbd\xa5`\x15\x9eh\x11K\x03&k\xd1\x9a\ +{\x12\x16\x97T\xa7\xd02\x87\xcb\xd6\x12\xec\x1a\xbcb\ +\x93\xf8\xad\x125\xdd+\xe9\xe1 \xf7\xad\xa5\xf0\x09Y\ +\xa0\x96\x98\xef\xb9ei-\xd8h\x7f\x85\x06?M\xe9\ +\x1b\xcaM\xa8\xe8\xff$\xf1z\xad\x84\xd1W\xc9\xba\x87\ +\xbc\x10s\x0e\xb6\xc4:\x11A-\xf7jQI\xcb\xca\ +\xaaz\xde5\xed-\xd4\x0e\xa5\xa8\x96\xbcU\x84\xa2z\ +\x86\xb9\x07\x16\x9d\xbama,_\xd3\xd5\x9a\xfa\xf6\xb2\ +\x15Ur\xcd\xbb\xeb\xfb\x91\x00\x5c\xe6b]F\xc4?\ +&\x1f7X\xa28\xb8\xfe\xd4\xeav\xb4\xa3\xf4\x0b\x1b\ +8\xfdh+\xcf\xffh\xd7\xbf\xfa\xbb\x9d}\xf3\xcfv\ +\xfd\xc3_m\xe3\xc9\xcf6pD\xae\xbc\xf0\xc0\xb4\x9f\ +>\x8a\xd2\xf3\xc6\xb4A\x94\x9cz\x1a\x17?\xfb\xcc\xca\ +\xe6_\xe0\xea_\xa2\xf4\xb7\xb8\xf3/\xadq\xeb\xa3\xb5\ +\xed\xffh\x1dG?Y\xc7\xf1\x0f\xd6r\xf05\x00\x00\ +\x14\xb0o\xb1\xf0B\x5c\xaf\xae\xafmJ\xd1\x89k \ +\xf7\x18\xe5\x1fX&1\xcd+\xf5f\x80U\xab\xd0\xa3\ +\xbd\x7fG\xa4tG\x0c\xf8!\x8cy\xcf\xd2:\xb6-\ +\xb5}\xc3R\xb0\x86\x148Hr\xeb*\x02Xp\x8d\ +\x02B\xb2\xcb\x9b5\x19\xe3\xe5\xe5J\xd9D\xe4\xb4\x83\ +\xd8\xafy\x02\xd22\xf5\x17P\x9f\x01\x15]\xba\x1a<\ +2\x1e\xada\xa8\x08T\x936\x9a\xb2MQ\xe1E\xc3\ +\x1c\x1eF`[\xb2\x14\x14\x91\xda\xae\xba\xc4=\xee\xed\ +\x00\xe5k\xad@\x1bSnY\x08\x82\x1bA\xf9\xd1\xe9\ +\x87\x96+\x99\xbc\x07!\xc3\x13\xa8@\x86\x10\x99\xa5\x82\ +Rm\x85\x97R\xa5\xdcZ\xac\xba\x86\x10\x82w\x93$\ +\xab_\x02\x22\xc0%\xd6\xcf\x12\xd6\xb8>\x1e&M%\ +\xed*o\xd7~B\xbc\xad\xae\x15\x1e\xbfc9\xba\xd6\ +\xccC\xe4\x81E&\xef\x00\xc0\x1b\xfc\x9d\xb1\x82\x9f]\ +\xd4uj\xf2\xc8\xc7\xf7\xf8y\x0d06JK\x95\xa2\ +\xbb4Q\xf3\x00\x05\xf3*\x14|\x88R\x9eY5\xca\ +i\xd8\xfb\xdczn|\xb4\x85\xa7\xbf\xd9\xd1W\xffb\ +7\xbf\xfd7;\xf9\xe2\x9fm\xfd\xd9\x1fm\xe0\xe4+\ +\xe2\xf8S\xcb\xd3\x83\xa1\xf8\xfc\xa9GV<\xfb\xc4)\ +\xbdr\xe9\xb5U\xae\x90B\xad\xa0\xfc\xb5\x0f\xd6\xb2\xf7\ +\x9d\x0d\xde\xfa\xa3M?\xf8\xab\xcd>\xfa\x9bM=\xf8\ +\x93\xf5\xdd\xfc\x88\x97y\xe5\xea\xe2\xb4)5\x07W\xa5\ +\xd2\xa7l\xd2M\x95*]\x886{\xb8-\xd4\x9a\x85\ +\x1b\xd3\xd4\xec=,\xeb\xa1E\xc6\x1fYh\xf4\x01\x7f\ +\xbb\xcb\xa0\xdf\x02$'\x96\xd1\xb3oi]\x80\xa1\x03\ +0\x90\xf2\xa5\xe2\x8e\xd3T\xba\xad\x12n\x95\xaeu)\ +\x85\xf5D\x9b<55\xec\xe6\xf2\xc9VTN\xae\xbd\ +\x04\xday\x14\xec\xe7\xda\x02\x01\x04W\x9f\xf1\xa9\xe0\x94\ +TR\xde\xc6y\x19\x94\x9f\xd4\xb2b\xc9mW\xb9\xd6\ +\xb6\xa5w\xed\x03\x80C\xf3\xf7\x03LxO&\x16\x19\ +$\xbb\xc9\xd6T2^ Gc\x84\x17\xc8W:\xa9\ +Wy\x06\xc2\xa3v\x1be\xaa\xcbH\x1b\xdf\xd1r\x15\ +`\x12B\x1a\x89\xcf\x0dX9\xc0H\x05l\xc9\x02\x9d\ +S\xfe\x8a\x03y\xba\xf65\x08l\xfd\xc7\x969\x04\xd8\ +\xb4\xb4\x0b\x00B\x5c#\xbe\ +G%}\xae\x88W\x15^J\x89\x19\xe7\x08\xc41\xa6\ +@\xe5\xc90\xe0b\xad7\xe3\x92+\xaf\xbe\xb0\xa6\xfd\ +\xf76t\xfb;[z\xf1'\xbb\xfa\xf6\xaf\xb6\xf6\xea\ +\x9fl\xe6\xc1/\xd6u\x0c\x00V^@4p9\xb3\ +\x8f\xad\x106\xaf\x961\xe5\xcb\xaf\xac\x12B\xa7r+\ +I\xf5\xfa[\xac\xfe#\xff\xf3'\xdbx\xfd\xcf\xb6\xf5\ +\xe6\x9fm\xed\xc5\x9fm\xf4\xec\x1b\xb7\xd7=\x9ft\xcf\ +\xd5\xdeA\xb8T}sQ\x01\x9b\x0dk\xd5\x0e\xda\x88\ +\xd6\xbb\x19\xb8<\xcd\xc8\xa9xs\xf9\x9d\x95\xac|\xb0\ +\xe2\xe5/\xf8\xf9\xbd\xe5\xcd\xbe\x06\xfd\xcf\xb0\xb8\xfb\x0c\ +\xfc-\xf310\xe9x\x0a\x01!\x0d\x85\xab\x9d\x8bW\ +\xb4\xa9%S\xae\xc5g\xa2\xaa\xe1\x93\xe5\xc8U\xf7\xe1\ +e\xb0t\x95D\x09\x00\xf24\xaa\x15pB\xca$\x0b\ +\xca\x808i7Q\x0a\x83\x98\xec\x04\xe5\xb7\xae\x01\xb2\ +MKE!\xe9j\x17\x03\x00|\xdaL*\x10`\x99\ +\x99\xda1Lh\x94\x82\xb4\x9e\x90\x8bK.$.\xab\ +\x12\xa9\x8cL\xa7t\xe1\x85\x15\xc2\x89r\x00q\xf6\xc0\ +\x19q\xfc:`\xc0\x83tr?\xed\xbb\xa4\xb9\x00\x97\ +k\xa4\xa3\xacT\x89v4u\x02\x94\xee}\x80~\x01\ +6\x81@\xd7\xb9\xc5un;\x09\x02\xac\xc0\xd0\x0dw\ +/\x19\xdd\x02\x80X?\xdf%n\x02\x80\x02*\x91g\ +\x5c\xb4/Ben\xe1\xe1k\xa6\xd66Q\xf8CL\ +>\xcc>\x9f\x9bT\xc5\xaa\xa4@3ex\x84\xba\xed\ +\x97\xd6q\xed\x83\xf5\x9e~k}\x84\x84\xee\xeb\xdfX\ +\xd3\xde\x07\xd7\x07\xa7xY=p\x9e\xa3\x14\xdc\xbd\x94\ +N\xfe\x5c\xb1*\x12\xc7\x83\xaa\xf6\x1c \xb5\x01\xa2\xe9\ +{?\xd8:\xa1\xe4\xea\xf3?\xd8\xd2\xa3\xefl\xe0\x18\ +\xa0,\x9e\x12o\xb5|\x89U*?\xd5\xdc\x82\x16\x9c\ +\xb0\xa2\x10\xc4R\x03\x17A\xf9\xb9(\xbf\x88L\xa1l\ +\xf3K\xab\xda\xf9\xcej\xf7\x7fB~\xb6\xea\x9d\x1f\xad\ +l\xe3#\x7f\xfb\x02\x80\xbc\xc6\x02\x1ey\x030p\xcd\ +|\xb8HI\xa0\x1f7\x89\xe2C\xfc>\x07\xef\x91\x07\ +/Qm\xa0\xaa\x7f\x0b\xb4$\x8a\xa5\xaa~_\xeda\ +\x9c\xbb\x94\x90\xba\xb9\xf2s\xbd\xc73dh\xc1\x87\xd4\ +\xd6\xdb[\xe8y\x95t\x066\x1d/\x92\x0e\xc0|\xbd\ +\x84#Dn\xd9/\x10\x10\x0ad\xa1\xb2\xc2L2\xa4\ +,-\xd9\xe2\xe1\x04v\xcd\x9e\xc4\x89\ +,_\xca\x17\xf0\x18h\x1f.8\x83g\xf2i\xfa\x1c\ +\x8e\x11!\xe5,\x22\xc3\xaa#\x9dn?\xfc\x0a.\xf4\ +\x9d\xb5\x1d\xaa\xf9\xd6\xb7VM\xa8,\x9b\x7f\x05\x7fz\ +ne\xf0\xa8\xd2\xf1\xbbV\x84\x82\xf2\xb9/eV\xda\ +\x98\x9a\xd5\x07\xa9C2\x7f\xdf\x9a\x86\xebi?\x82@\ +\x90\x09\xd03y\x95\x07\xf2\x9aY\x09\xd4\xaa\xf7\x83\x08\ +\xba\xf2uO\xf1Ay\x0dH{\xf6\x18a\x08\xf2\x18\ +\x11I\x9d\x06\x00\xa1\x11\x5c\x22\xaeX\xabR\x81\x8by\ +h\x08\x92\x0f\x92\x10\x18\x86\x1cM\x9cX\x04\xa2\x96\x07\ +W(\x80,\x16-#\x22pK\xc46\xe5\xec\xb3d\ +\x02\x93\x00fTK\x99\xaabY\xc7\xba6\xadd\xea\ +\xc0\x9aWnY\xcf\xd6]\xeb\xdd\xbcm\x1dk7\xac\ +zz\xcf\xad\xf0\xb9\x05\x0e\x11\x14M+\x13k\xb5\xba\ +\xe6v\xe5j\xdf<1?2\x05\xb1\x81[\xe4/\xa2\ +4\xc2I\xe5\xce\x17Vw\xfc\xd1\x9an\xfch\xcd7\ +~\xb6\x86\x93\x9f\x00\xc1\xf7V\xbe\xf1\x0d\xf7\xf3\x01\xaf\ +\xf5\x1aK{\x0e/y\x049\x85\x18\x8d\xc0\x19F\xee\ +\x12\xe3\xee\x01\xee\x87\x96\x07\x00\x0a\xe1)%\xa4\xa2\xa5\ +H1\xdf\x9b\x0fyR\x93\x09\xb9\xfd\x0c\x14\x9d\x069\ +Lm#\xcdj\x9d\xc6\xf5k\x7f\xff<\x1cb\xc5-\ +\xca\xb8Z\x02\x11D\x94\x1f\xc4\x05\x07QPP1_\ +B\xfa+\xeb\xd2\x0e!Y\x5c\x86\xbc\x856\xa8\xc0\xb8\ +57\xaf\x86\x0fy#\xdb\xd6\xb4v\xcf\x86\xae\x7f\xb0\ +\x89\xdb\xdf\xdb\xe4\xdd_l\xe4\xf4gk\xdf\xfb\xda\xcd\ +\x89h\xed\xa1B\x93d(\xa5\x14\xeb,&\x84\xe4\xe3\ +\xe2s\x86\x14\xb2T\xca\xa5M;\xd7\xb9\x07\xae\xad\x8c\ +\xc3\x09\x80@\x02x!\x81\xcf/\xaf$\xf7\xcf=\xb8\ +\xfd\x90\x0e\x00Z\xc6\xf6\x88\xa3\xc2F\xa6\xc2\x06\x06\x16\ +\x9a\xbcka\xae%\x12\x19\xe3j\xe54Y\x00\xfa\xb5\ +\x1b'\x95\xdc0\xa5\x19ie0:\x97,];v\ +\x07\x19\x80\xd1\x03\x90s\x8crN\xf8G\x18\xfb\xe41\ +\xeeZJ\x13\x81\xd2\xd2\xa6V\xe0\xc4\xb0\x17x\xe8%\ +\x0b\xa3\xe8\xc2\xe1-+\x1d\xdbA\xb6@\xf6\x86E\xfb\ +\xb1z\xe5\xc4\xca\xb1[\x17\x11m\x0c]\xe6\x7f\xb0\x16\ +\xc8\x97:r\x85A\xa8c\xb7\xa03W\x0b2\x8bO\ +\xac\x04\xafS\xb9\xfd\xc6j\x0f>\xe0\x09\xbe\xb6\x06\xf8\ +E\xdd\xc1\xf7V\xb3\xf3\x83Um~OJ\xf9\x11\xe2\ +\x09?Y\xc6\xc5.\xa0\xe4\xd9\x97V\x04G\xc8\x9f\x84\ +\xb0\x92\x92\x16\xcc\xbe@\xe9*\x03\x7f\x0b\xcf\x11\x9fx\ +E\xea\xf4\x18\xaeq\x8b\xc1\xd9\xc5\xb5+\xd6\x93\xf3k\ +V\xee|\xdf}z\xcb\x04\xf1s\x0e\x0f\xa5\x85\x1c\xd5\ +\x14\x10\xaa\xe0*\x1e\x00P\x86b\xbd\x06\xd4\x81@^\ +@\xec\x1b\x97\x0d\xf9J%\x0bq\xb5\x00\xa4\xa3\x19\x8d\ +\xe3\x16\xe9Z\xb0\x86\xf9c\x1b9|j\xd3\xa7\xefm\ +\xee\xee76y\xfb[\xeb\xd8\x03\xdc\xcbxXrx\ +\x95\x7f\x97\xc0}\x8aa\xf2\x85x\xc2\x06C\xa2\xcd\x15a^s&\x89\x8b\xb3\xb7\ +\xc9T\x1eX\x05|\xa4\x9eT\xb5\xed\xe4{\xeb\xbc\xf9\ +\xab\xf5\x9c\x92^\x22\xbd\xbc\x1f:\xfd\xc5\xc6o\xffj\ +\xa3\xbc\x8e\xde\xfa\xc5\xa6\xef\xfcf\xe3g\xa4\xaf\xd7\x7f\ +F~\xb2\x9ek\xda\x0a\xff\x05<\x86\x10\xa0\xcd\xb0|\ +\xb7\xbf\x7f\x13\x00h\xbf\xdd\x88%VkF\xae\xcd\x12\ +*[-\x09 \x08\x04\xea8\xe6*\x8c\xc8\xab\x95>\ +jS\x85\xfa\x15\xb8\x12z\x14\xef\x94\x8fb\x02\xdc\xbb\ +\xebe@\xb8\x10o\xf0\xb9\xa9\xe4yR\xbb)\x0b4\ +MZq\xff\xb25\xcf\xeeZ\xe7\xca\x91\xf5\x5c\xbda\ +]WO\xadzNet\xbbn\xb5N\xcb\xe6\xd9\x84\ +\x1b\xcdB\x06\x01Q\xa6\x96\xb2!r\xda\xb3!\xee\xe1\ +\xb6\xc7\xf3\xfd>@\x98\x01\x18\xdd\xe6X\xa5\xbd-j\ +QC\xca\xda\x8c\xf2[\x18\xd3V\x94\xdf\xa6P\x84\xd2\ +\x01\x80\x9b/\xc1;\xa4\xc2KR\xf9\xbf4B}\x06\ +\xd7\xf2i\xaeep\x17\x00\x10\xe7\xd4E\x22\x9dAH\ +S\x87\xad&\xdc\x7f\xe34\xaep\xda\x12\x9d\xcc8I\ +\x16\xa2\xf5@\x9a!k!^:\xc5\x03\x02D\xe9\x92\ +\xbaeh\x7f\x9e\x1a\x1e\xb9:6-\x1d\xab\xf2\xc5\x11\ +=\x5c<\x03\xa78\xea\xedC\x00}\x221\x9aD\x11\ +C\xc5E\x05A\xbd\x98\xb3z\xf5\x84\xc6!\xa4\xe2\x1e\ +\x13\xa4+\x93Z\xc7\xc7J\xe6\xeeX)\xd9I\x8d\xc8\ +\xd4\xf1\x176r\xf7'\x9b~\xf2'\x9b\x7f\xfeO6\ +\xf7\x04E\xdf\xfd\x1e\xe5\x7fkSw\xbe\xb5\xf1\xd3\xaf\ +m\x82\xece\xe9\xe1\xcf6\x7f\xef'\x1b\xbd\xf9\xd1F\ +n~k\x83\xd7\xbf\xb6\xc6m\x88\xe0\xf2\x03x\x01\x84\ +hD\x939\x022\xc0\xaf\xd3L\x5c\x97\xc5\x97\xb78\ +I\xacl\xb7d\x00\x91\xa2\xae\xa7n\xc3\xaa\xf6\xdd\x01\ +d=\x93f\x0b\xe1\x0e^\xbb:)\x9fl@\x1e\x00\ +\x0b\x0bh\xf1E\xd3\xbf\xbdd\x14\x10\xc9\x8c\xd6y\xf3\ +3\xae\xd1\xaey+\x1d\x5c\xb1\x8a\x91\x15\xbc\xc1\x9a\x95\ +\x8d\xaa\x10\x94\xef#\xd4\xaaa\x85V\x1a]\xc1G\x9d\ +\x96\x805\x0b\xa8\x95A-\x0b3\xce\x18T*\xe3\x9a\ +J\x86\x92\x0a\xb8R\x19\xd3T\xa5\xa9\x00 \x9dT1\ +]\x16\xdf\xa6\xf0#\xc5\x13\xd2\x9c\xa0|B\x81&\xad\ +4G\x92\xc6\xff\xa7AL\xd3{%\x18}\x1fY\x0e\ +\x12\xe3\xebY\x858\xe0\x86\x89\xdb>\xe2\xb3\xeb\xb5\xc7\ +\x83\xca\xc2SPr\xf2\xf9DHr\xa3\xa6$\xb58\ +\xa3\xc6\x8eR\xfe\xcay\xae\xea\xddH\x86,\x1b\x94i\ +\xe3\xa6\x8a\x18/\xc4U\xb5\x92\xee\xa9\x9a&\x82{\xd7\ +\x0eZ\xd5\xdbGx\xd5\xbc\xf9\xa7\xee\x9f\xaa\xba\x1d\x82\ +h\xa1\x94,\x08eh\x0cR9\xb6\xcf\xe7\x0eH\x97\ +\x8eL\xbbm\xd4\xe2\xac\xee\xea#\x1b\xb8\xf1\xc1V\x9e\ +\xffjG_\xfd\xddn|\xfcW;\xfa\xe2/\xb6\xf2\ +\xe4[\x9b\xb9\xf3\xd6\xc6o<\xb7\xc1\xc3\xc76L\xbc\ +\x9d=}g\xd37\xdf\xda\xd0\xe1K\x1b:zi}\ +\x07x\x8f5\x98\xf6\xec\x09\xdf\xa9\xf4\x93\xf0\xd5>\x0d\ +\xe8\xd5h\xa1\x0f\x00tZB\x05\x1e\xa0\xbc\x95\xd7v\ +@\xa0p\xa0\xde<\x02\xc18\x166\x03\xc8\x09i=\ +\xeb\xfc/\x80\xd6b\x0b\xcf\xa5\xb4\xcf/\x0f\xc0\xcf^\ +{\x1b\x00\x80g\x11\x99\xd6zF:\x9cJ]S\x03\ +\x84\x14\x7f\xd3\xa8\xf9\x1bG\xcc\xa7N\xa6|o\x92\x9b\ +\x02\x1e\xc4\xeb\x0cZ|\xc5\x80\xc5],\x02\x95k\x19\ +x\xc8\x12j\xf0\xc8\xf5\x18\xa2\xa6\xbd1\xb6$\x8cM\ +\xb3\x9e\x9a\x01M#\xc7\xcf\x10\x07\xe8\xda\x87\xc8z\x92\ +\xde\xa9Y\xd2\x1d\xf4\xb2\xe9\xe6,RP\xbe\x00\x93\xa6\ +0\xdf\xbdJ\x0a\x0b\xd7\x03\xf4\x92\x0c\xde\xc7\xb8V\xab\ +\x17B8P\x91\xa2\x10\xae\xc5\x0d}\xb9\xa6!SZ\ +\xd7\xdd\x1c|j\xb3\x17\xb7\xd3P~\x1a7!\xc5{\ +92\xa8r\x00P\xca\xc4\xff\x7fR>.\x0d\x8e\xa1\ +\x9c_\xe5\xcbZ\x9e\xd4nU\x89\xdb\x8a\x8d\xc5\xab\x16\ +N\x9b4\xfc\xa0\xd1\x07q\xf4C\x14%\x81\x81U\x06\ +w\x1d\x80h\x0d\x7f\x8b\xb4m\xcf\x8ag\x8e\xaca\xfd\ +\xb6M\x9e\xbd\xb5\xa3\xcf\x7f\xb5g\x7f\xf87{\xfb\x97\ +\xff\xd3\x1e\xff\xf4\x17\xdb}\xfe\x85\xcd\xdd|h\x03;\ +\xd7\xac}e\xcf:V\x0elx\xe7\xa6\x0dn\xdf\xb4\ +\xce\xd5\x13\xeb\x5c\xe3\xf7H\xe5\xcc\x8e\xe5\x0d\xafBR\ +\xc5K\xa6\xb0<-\x19\xf7\xa1h\xad\xb1w!\x1d(\ +\xa3\x03\xe5w\xba\x9f\x93\xf0\x02j8\x99R7L\x5c\ +\x1f\xc7bg\xf0n\x8b<\x1b\xbc\xa0\x0f\xb0+{\x92\ +\xdb\xefE\x11\xb2z\x9e\xc3\xafLG\x03\x0c\xf9Ko\ +S5\xb0\xa6x\x15b\x06\x00V/\x00\xebF\xba<\ +)\xeb\xb6\xc42~\x87\xc4KJ{,N\xe2\x96~\ +\xfb\x09I\x1e\x08\x12\xea\x00A#\x86\x88\x0e\x92[\xd6\ +\xd0\x09\xe3\x8eu+\xc6gh\xa2\x08\xb2\xa7I\xa0t\ +\xb8T:Y\x95\xf3\x14\xe8 \x0d\x02\x9b\xaeu\x15g\ +\xf1\x00\xbe\x17\xaf\xa4{S\xe9:\x82\x07\xe0\x86\xc9W\ +\x03}rk\xb0}\xdcX61M\xb3hJ\x1f\xfc\ +\xa4\x19n\xee]\x17s\xeeFn\xc7\x13\x17\x83\x1c\x08\ +@\x17.\xc9\xa7\x18)\xf7\xffI\xf9W\x11^\x19(\ +\xcd;\x87\x86v]AF\x88\xb8\x97\xad]\xb1\x03\xba\ +.\x83\xd5\x0d1\xec\x9c\xc3M\xcd\x22\xb8\xc3\xae\x19n\ +n\x96kC\xc0PTv\xff\x12\x8cx\xd5\x0a\xc77\ +\xac~\xf9\xd0\xa6n>\xb6\x9b\x9f\x7f\xb4\xf7\x7f\xfa\x9b\ +}\xfb\xb7\x7f\xb6\xd7?\xfdj\x07O^\xd8\xc4\xde\x89\ +\xb5\xcc.[\xf9\xe0\xa4\x95\x0dLZ\xfd\xf8\xbc\xd5\x8d\ +\xcd[\xc5\xd0\xb4U\x0c\xcf\xe2~\xe7,\xafw\xc2\xb2\ +\xda\x87-\xd0:\x08C\xef\xb3\x94\xdan\x94\x8f\xe2\x89\ +\xf9\xff\x9b\x08\x0c\xbc&U\xf3\xf7\xea^\x148`\xa9\ +\xf0\x04\xb7\xa0\xe4\xb2\x03<\x01\x16\x15P\xda\xac\xcd&\ +p\x1c\x91I5\xb7Hk\xc3\xab\xb4N`4c\x84\ +S\xbcK=\x96^\xa3E\x1f8\x06J\x8f/\xebD\ +\xd1\x1dN\x12\xd5\xb7\xb8\x14 \xf1%\x9e\xc4\x95v\ +\x9f\x83\xa0\x0f\xaf\xa0E-\x15\x88(,/\xf2\x9d\xea\ +\x89\x80.p\xf3\xbeN\xf5s \xec\x90\xef\xfbd\xb0\ +x\xdft\x8c8\x95\xac&\x19o\x9e\x02P\xd3Pr\ +:J\xf7\x8c\x0b\x03G<\x80\xf2;\x95\x84\xa5\xa30\ +\xcd\x82\xa9\xe5\xaa6>\x84 a\x11\xcd\xc6iN{\ +\xf46i\x1e\xa9R\xff5<\x04\x17Q\x9e\xdb)\x86\ +\xb9\xc1\x0d\x00\x86s\xe5K4u\xfaI\xf9R\xba\x13\ +M\x86\x88A#\xbcfq\xe1 n7\xd8G~M\ +\xfcS/\xbb\x8cN\xf2\xee\xb6q\x1el\x98P3h\ +I\x8d\x03p\x8e~\xf7\x9a\xc2\xcfi-C\xc4Q\xad\ +\xe5\x8fZ\xb8g\xc2\xca\xc6\x97lp\xe7\xc4\xf6\x9e\xbc\ +\xb4g\x1f\x7f\xb0\xf7?\xffj\x8f\xbf\xfc\xda6\xce\xee\ +Y\xf7\xd2\xba\x15v\x0dY\xa0\xb6\xcd2\xaa\x9a,P\ +\xd3l~\xc4W\xddd>\xbd\xafk\xb5\x8c\x9a\x16K\ +\xadF\xaaZ-\x19\xc2\x97\x88\xcbO\xc4\xdd;\xabw\ +\x1e\x00\x8bD\xe9\x89Ux\x04\xac_\xcaO\xaa&\x0c\ +\xd4\xaa\xdb\xe8\x08\xa4P^`\x0a\x82;C\xb8$\xd7\ +oS!\x8a\xac\x5c\x04\x9a4\x92\xcf%\x126\x12\xf8\ +\x0e\xd5\x22$\xc8\x93\xa8_1\xd7\x88/kC\xe9\xad\ +(\x19\x9eQ\xdc\xec^\x13J\x087%\xfc\xbe\xb8\xdd\ +\xe2\x90\xd8\xe2\x0e\x8b-\xe9\xb4X\x81\x80P\xa0e\xe1\ +\xc4\x1a\xbe[\xeb\x04\xeaQ\x80{\x0ft\x8b;\xc1\xa3\ +\xfa$\x10Q\xcdDb\xf5\xda\xf5\x94J\xb6\x95\xdc6\ +e\x89-c\x84\x8cQB\x05\xfc\x05\xa3\xca\xe8&\x0b\ +\xeb\x85\x98\x93\xd6\xfb\xc5\x01\x00\xae&\xbfbD0\xd2\ +5\xe3\x85\xdbWK\x12\x15O\xe6\x90#F'\xef\xf3\ +\x0aS\x1e\xbb\x039\xf3@\xa0\x99.\xbf\x9bi\xf2\xa6\ +\x1a\xddvr\xdc\xbfS>$\xc3+u\xf6f\xc0\x9c\ +\xf2Q|&\x08\xd4\xfc\x80\x96a}XxF\xc74\ +\xc0\xe1\xa6\xda\xb0\x8e\x16\x94.\x85\xd7\xe3\xfajA\x7f\ +u\x87\xc5U1\x10U\x0c\x88\xd88\xaf\x92\xc4\xeav\ +,\xa8\xc3\xd2\xea\xbb,\xd29l\x8d3\xab6up\ +\xd3\xf6\x1f\xbe\xb0\x9b/\xde\xda\xfe\x83\xa76\xb9sl\ +\xf5c3\x96\xdd\xd0a\xc9\xa55\x96PX\x89TX\ +BQ\x85%\x16WZbI\x95%\x95T[Ri\ +-\x16W\x8f4\xe2v\x9b\x11\x14P.\x00\xa0,)\ +\xbf\xaa\x97\xeb\x89\x0f\xf4\xf3\xca\xbd\xd5H\xa1X\xb0Z\ +\xdc\xd7\x8d\x90\xdf_\x08\x83\x8b\xe8w\xea\xd6\x95X}\ +a\xe1<\x03J\x8e+iB\x99\x0d(\xb5\xde\x93\xa2\ +Z\x8b-\xfc\xbd\xd4\xf1\xbb\x06@\xd0\xe4\x01\x02\x10\xc4\ +\x95\xf0\xec%\x00\x00o\x10K8\x88\x85\x13\xc4\xab\x00\ +\xa5N\xbb\x7f!\xda0z\x11\xe70\xfa\xd0V\xf5\x1c\ +$b}?9v\ +\xcf\x88E[{p\xf7M\x96\x5c&%\xcb\xea+\xb0\ +xI%V\x8f\xf5\xe3\x15\x12KQ>\xd6\x1f_\x8a\ +\xf2\x1d\xb8\x00\x9d,\x16\x00\xc4\xf1\xbd\xf1\x0e\x00\x03X\ +\xbb,\x9bA\xc2\xed&7\x92\x05A\xbe\x12Uqt\ +^r\xa6\x92\xb4\x04<\x83\x0aNd\xf5\x22u\xbf\x07\ +\xc0\x95b\x0f\x00\x97\x0b\xaa\xecr^9R\x8a\xe2\x8b\ +\x9d\x5c\x91\xf0sl~\x19\x00\xa8\xc4;\xd4\xf2?\x8d\ +\x0e\xe4q\xfc\x7f,\x1c!\xb6\x12\xf2'\xf05`\xf9\ +\x90m\x91;\x15\x9c\x84\xd1Kt\x1a\xe5\xcf=r\x92\ +;\x03\x00 \xd4\xda\xe5\x9c\x81\xebOi\x1cu\xe3\x19\ +[\xd1lWx\xd6+x=I,^/\xae\x82g\ +\x16\xc1%\xa4%\xd4\x00\x12\x95\xcd\x01\xe2\x98\xd8rb\ +]\x8d\x0a'U\xa5JzC>\x1b\x1eU\xaav\xd7\ +\xa2\x84\x00\xb7\x99p\xf2\x11i\xd8\x13+\x98~\xea$\ +\x7fJ\xa7\x8b\ + (\x00\x04\x85x\x81b@PnW\x8a\xf0\x14\x84\ +\x89+\x80\xf2\x0a\xdf\x15+`\x01\xb4\x94\xd6\x05G\xec\ +4\x03\x18\x998\xb3\xe8\x0c\xfa\x98G\x1fH\xee\xac\x0a\ +BH\xa3!\xd5\x01\xd29\xb5\x86M\xaeW\xd6\xd0\x86\ +\xc2\x1b\xf8\xbej\xbbL\x08\xbc\x5c\x00\x00y\xd55b\ +\xb9F,\xdeF\xcf\x1d\xab\xe7\xe6~cbE@\x18\ +\x5cU\xbdj\x0aS)\x8d\xb6FG\xc6@\x9b\xbah\ +M=\xb4\x02m\x9d\x9aWO\xe1W\xc8k+\xd6\x89\ +\x1a\xb3\xcf\x1c8\xd4A#t\xbe\xc6\xeez\xf4ha\ +\xa7[\x8a\xd6\x19\x02\xc7\xae\xfc\xbb|\xf2\xaeU\x81\xd6\ +\xca\x99\xdbV:qby\x83x\x1aBCF\x8b\xa6\ +\x9e\xe5f\xe5n\x89\xa3\xff\x9b\xc8\x0d+\xb6\xca\xd5\xe2\ +-\xb0\x8a\x84\x0a@\x82\x8bt\x0c\x9a\x81\x8e\xc7\xd5\xc6\ +\x13O\xe3p\xb3\xb1XZ\x5cA\x19q\xb5\x9c\xbfa\ +\xf5R|e\x1dd\xaf\x1e\xd2Wo)\xd5\x80\x04b\ +\x98XI8q\xa1\xa6\xcd.3\x10\x97$\xb8\xdf\xcf\ +\x90\xcbR$\xd6\xa1vu*\xa7rM\xa9\x00\xb0\xda\ +\xd3\xa5\x91V%\xb5.\xe2\x05T\xa38\x82\xd7\xd2`\ +\xff\x8e\xd5\x0b\x00r\xe1|OlI\xb3]\xc6\xb5_\ +f\xd0/\xa1\x00\x07\x80\xdcB@\x90\x87\xe4\x02\x82(\ +\xde\x80\xd7\xbc|\xbb\x9c\x8fg\x90\xa2t\xa2\x09\xca\x11\ +\x00\xe2\xc4=\x00Z\xaa\xa6\xd6\x95F+}V\xa3\xa7\ +i<\xb3j\xfeP|h\xfc\x10`\x90\xae\xf7h\xce\ +F\xc6$#\xc2\x03a\x0cWJt2\x0a\xd6\x8f\x87\ +\xb9\x5c \x10\x10\x86\x0a\x01\x99;1\x05\xa0)D!\ +\x97\x8b\x9a\x00@\xb1\xe2\xa0R!\xf2\x5c\x15\x0d\x12\xcb\ +\xb5\xe0\xa0\xa5Ym\x94\xcc#\xde\x14\xcc=\xb6\xe2\xc5\ +\xe7V\xba\xa2\x05\x15\x00\xb0\x04\x00\xe6_\x10\x8b\x1e\xe1\ +-\xce\x08\x07\xd7a\xa3\x87X\xfd\x9ee#\x11\xde\xe7\ +\xf1\xbb\x12\xf8C\xf5\xec\x13k]{m}\xbb\x9f\xdb\ +\xe0\xfe{\xeb\xdd~n-\xeac?\xbek!\x11\x92\ +&n\xde\x91)\x89\xb7\xdd\xc9\x131j\x84\xfbr@\ +\xa8\x04\x04b\xc5b\xc7\x90\xa5\xd8\x22\x90\x5c\x00\xa2\xf3\ +x\xb0\x5c\x01\xa0\x02\x00T\xe1R\x89\xabeX{e\ +\x03Jo\xb2\x94\x9aFK\xadmB\x9a-Y\xf1\x10\ +\x8f!\xbe\x11\x8b\xd5_Fi\x97\xce\xe53\xbd\xa2\xcc\ +81\xfe\x86Q\x88\xea\x1c\x83\x8f\xb7\xea\xdf\x22\x85\xda\ +v\xf9tr\xfb\x0a^@\xc5\xa7\xe7^\x00\x0e\x10\x8f\ +\xa7\x8a/\xfb\x07\x08\x14Vbq\xe7Wp\xebR\xea\ +%\x94\xe0\xbc\x00\xae\xff\x12\x1e\xc0\x03A\xd4\x13@p\ +\x09O\xe0\xfe^P\x03h\x00\x00\xdf\xa5\xb2\xf0\xc4z\ +\x11e\x98\xbb&\x9d\xb4\xc1cT\x9eY\xdd[4o\ +\x02\xf1&uN\x85\xed'\x13\xd7\x13\xe0E\xf1z\xae\ +\xf2\x06\xc0Ws\xae|\x89\x94.\xd1\xef\xea\x183)\ +\x1f\xef\xe08\x8a'1n\x22\xa2B\x8d\x88\xd5u\x1a\ +\x96\xc8C\x0a\xf9\xd9\x83*h\xb8\xe1\xaaF\xf2\xb5\x95\ +X\xe7\xe1,=\xb3\x22\xa4p\xe1\x19\xbf{\xc2\xdf\x1e\ +pS\xe2\x04j\x0c\x01w\x18<\xb1\x5c8D\x11D\ +\xa5\x1c\x82R;\xff\xd4Z\xd6\xde\xda\xf0\xe1G[\xba\ +\xfb\xabm>\xf9\xcd\xd6\x1f\xfc`3\xd7\xdfX\xc7\xea\ +-+\x1a\x22\x05\xc5\x0bh\x7f\x9b\xd6 R\xe4\xf6\xb4\ +\xdb\xc6\xc9\xf9\xfe7\xac\xcd\xb1l\xcd\x96\xc9\x03\x08\x00\ +J\x97\x0a\x01@\xbe\x00\x00\xa3F\xe2\x0a\xea<\x8f\x80\ +\x15%h*\xb7\xaa\x85\xffk\xe1\xff\x9b-\xa5\x0e\xa9\ +\xe7}\x1d\x19E\x0d\x8c\x1f\xbe\x11G\x18\xb9\x82\xfb\xbe\ +LH\xb9Lh\xb9\xa4Wm\xbc\xc0\xfd&\xd5+\xfd\ +$\xdd\xeb\xc2 4i\x02\x10\xd2PDJ\xa7j\x0f\ +U\xa4:\x0f\xa9\x22\xd5\x02\xa0\x09\xdc\x97<\xa8\xf3L\ +\x02@)V\x08\xb9t\xae\x16\xb2y\xc5\x9dU\x04\x17\ +\x90+\xce\x87\x0b\xe4\x15a\xfd\x00!\x17 \xe4\xe6;\ +`|\x06x?\x03\xcc\x97\x8aZ\xed2\xcf'\xf6\x9f\ +\xc0w\xa7@\xd6\x14\xdb\x03\xdc\x83\x0aY3yU\xa9\ +|:d:\x19\xa6\x9fX\xcbu\xaby\x16b~l\ +\x99\x94\xcfX(\x9cp=\x11Le\x1a\xb1(<\x96\ +\x90$n\x22\xef\xe4\xdd\x9f\x84{%\xe3\x88I\x22\xcf\ +T\xd7ImgV\x17J\xf5\xa2S'\x0d5A\xc8\ +V\xf3\x85\xb1\x13\xdc\xcf\x0d\x08\xc7-\xcb\x9b\xc5#\x10\ +{rU{>\x0dA\x9c\x84\x14j\xf9\x16\x85\xe7\x8d\ +y\xbb\x7f\xca\xa6\xb1\xfa\xf9\x87\xd6\xb0\xfc\xdc\x9a\xd7P\ +\xf4\xd6\x07\x9b\xb8\xf9\xa3m?\xff\x8b\xdd\xf8\xfc\xefv\ +\xf2\xf6\xcf\xb6\xf9\xf0\x1b\x1b\xde}`\x15c\xdb\xee\xa0\ +)\xedm\x93\xa2SP\xb8\x07\x82\x7f\x88@\x90\x04Q\ +U\xc5l\x82\xd2\xa22,\x8e\x1b\x8fc\xb0\xe2\x00A\ +\x1c(\x8e\xc7\x95%`=\x09\x0c|\x02\x16\xe8\xa6s\ ++[\xcfA\xe0)?\xb5\xb1\xdd\xd2\x1a\xbbyOn\ +\xef\x06\xae\xef|\xf3\x85^\xfb=\xe1\xbd\xb6])\x87\ +O\xe2s)-\xe4\xfe\xed\xe3n\x82*\x15\x12+\x00\ +\xa4\x90\xf6\xa6\xb4\x03\x04M\xcb\x8a\x18\xd6Nb}\xc3\ +X_/\xd6\xaf\xfc]\x83\xab\x81\xd6\x80\x0b\x04M\xc4\ +c\x85\x03H!\xd6x\x09w\xec\xf1\x82R\x84W\xc2\ +\xd7g\x80\xf7\xb3B\x94_\xdcM\x18\xd0\x9e\x80!\xc2\ +\x0b)\xb2\xc6D'\xaf\xa9\xeb8\x80\xcc\xd0\xb9\x01d\ +P\xa9dOIdN\x09\xca\x9c\x5c\xc6D\xca\x09\xd8\ +b\xc9pb\x8b\xa4\xf8\x1a\xc6Ei&\xe4R\x1e^\ +!S\xb3\x8e\xf2V<\xa3\x17N5+9`1)\ +0\xcd\xd4\xc6y\xdc\xbf\xb6Uii\xd6\xab\x84QK\ +\x15mZ\x0c\x0e\x10\xd3\x87\xf0\x08#\xb8\xecQ\x01\x82\ +Td\x1ck\x9f\xb8I\xa6 \xb2\xa8](\xda\x83~\ +\xd7\xea\x96\x1fY\xd3\xda3k\xdf|e\x9d\xdb\xef\xac\ +m\xf3\x9d\xb5\x22C\xd7\xbe\xb1\xd5G\xbf\xd8\xe1\x9b?\ +\xdb\xc1\xab_m\xe3\xe1W6\xbc'\x00l\xb9\x1d\xc6\ +)Xx2qO]\xb0u\xa6\xcf?\x80 O\xa0\ +\x85\x9a\x09\x14\x09\x10\xaa\x00\x82f\xc6\xdc\x94)\xae\xd2\ +\xe5\xcdp\x18$\x01R\xa3,\xc1\x09\xac^S\xbaI\ +\xc4\xc4\xe4Z)\xbe\x93\x01\xecE\x06\x18\xccA\xbc\x0d\ +\xbc\xa2\x16\xcb\x85_\xc4\x13^\x12H\xf9$\xaa\xc9\xd7\ +\xf6+\x97\x8a\xc2\x9ac\x95F\x91B%4\x0dYR\ +\xdb\xac%u\xaeZ2ioJ\xd76`\xd8\xb2\xe4\ +\xb6uR\xa9E\xacu\x12\xe0\x0c\xa1\x08\xfe\xd7\x85\x01\ +\xee\x8b\x10\x13/!\xabQ\xa6\xa1\x90s\x05p^\x01\ +\x18\x97\x1dI\x14(p\xc3\xc5\x0a\x17\x9d\xfcM\x9b?\ +\xe0\x16\x15\xe3\xe7\x82w!\x15T\xe8K\x82\x1c'C\ +zS\xaa\xda\xe15\xad\x90Y\x00\x8f\xc5\xc7\x97\xa1\xe0\ +2Y?\x02\xd8\x048\xcd?\xb8I&\x1d\x8d\x87\xa1\ +$pO*?\xffG\xc99\x9c\xcb\x95\x9dk\xbf\xc3\ +\xa4\xc5\xe8\x8c>\xd7\xf0\xb8C\xdb\x91\xc9\xe9\x95\xd7\x93\ +\xcai]@\xd5AN\xb4N\xa0\xdd\xa4}\x9b\xc4\xa3\ +\x1d\xf8\xc1!\xa9\xe2uB\x00\x96\xaf\xc2\xc7\x99\xbb\xae\ +QT+\x8a\xef\xd8~k\xdd{\x9f;i\xdexm\ +\xb5+\xcf\xacc\xe7\xb5M\xde\xfc\xc2\xd6\x1e~D\xbe\ +\xb6\x85\xb37\xaeJ\xa8l\x84\xeb\x80\xee\x14\x08U\x12\ +\x84*\x09\x8bt@8\x07\x81\x9a-\xb8\xce\x1aHJ\ +\xfd4\xe0 \xe6q\xf3\xf2Z\x0e\xc1\xb8nG\xc2P\ +zBE\x977PX\xb66`\xe8\xcc\xc0\xd4\xfa^\ +Kk\xe8%\xcc\xf4\x9b\xbfu\xc8|\xad:yc\x04\ +\xc0kzV\x16\x06\xbfP\x88Q\xf3e\xf1\x0d\x00!\ +V\xef\x91\xb8\x1a\xbbT\x02\x93&\xae^\x91\x9b%\xc5\ +J &'unXJ\xcf\xae\xa5@\x0cS!\xbb\ +)\xedW!\x86\x0b\x16\xc7}\xc52\xd0.\x8d\xe3~\ +\xe2\x091n6\x91\x0c\xc7\x11Zq\x06\xf8\x8c\x00\x17\ +\xa7\xb0\x81b\xe3+\x95J\x0a|J-g\xf0:\x84\ +\x96z\xd2\xce\xbay~7\x8d\xa5\x8e\xf1\x8c<'\xbc\ +@\xde-\x11v\x9f\x88\x9bO\xe0\xbe\xe2\xc5uJ\xb0\ +r)\x1dB+\x90\xb9\xcd&.%U\xb6\xd4\x8b!\ +\xc0%\x04\x22\x19N5\x06t^r\x9eT\xaf\xfd\x06\ +s\x90\xddE\x8b\xc9h\xdf\xf0\xd2\x1dP\xad\x22\x83\x80\ +\x13\x01A\x877\xae!\xaa\x8f\xf3j\xe4\xb4\xd9\xc05\ +\x22\x22\xad\xd3\xd6\xa3<-\xd3b\xf9e\x8b\x8f\xac\x11\ +\xe5w\x1d|\xb0\x9e\xc3/\x9dt\xee\xbd\xb7\xda\xd5g\ +\xaeKU\xd5\xc2]k]\x7f`}{Ol`\xff\ +\xb1\xf5l\xdf\xb5\x86\x85#\xcb\xef\xc7\xe30\xb0\xc9(\ +\xdf\xb3^\x06\xcdm\xe4\xd0aO\x9aiS\xa3\x05<\ +\x94+\x97>\x97zrc\xe5\xe8n\x83\xa6\x08\x22\x0f\ +\x89\xd25\xd7\xee\x1d\x0e5d\xe9\x0dC\x96A\x8c\xcc\ +\xc0]f`\xf1\xbe\x96!\x000j\xfe6\xed\xa2\x1d\ +\x83x\x0a\x5c\xe7 P\xf8\x81p\xba0$E\x89\xd9\ +c\xa5r\xa7b\xf1\x97\x19\xe4\xcb\x15XiM\xaf]\ +i\x1c\xb782\x81\x04\xd2\xe5$\xc6(\xa5\x8b\xf4\x10\ +@h\x95.\x81A\x8d\xc7\xc2D\xe0\x94!hJX\ +\xe7\x15\xb9\xc3#Zf\x11M\xe5\xaai\xd4<\x03\xcf\ +38Pk\x09x\xce\xad\xae\xa6\x91fju/M\ +k\xf7\xadW!w\xcb\x80b\x16\xe5\x01<\x94\xa9\xd0\ +\x96\x08\xb1L\x90\xe2I\xf1$q%\x9a\xd3\xd0\xf2\xb5\ +\x94\xcf}kb\xca\xad,\xe2\xd5\x90\xc4J\x14/\xe1\ +;\x1c\x00jd\xf5\xbf\x03\x00\xde+\xe6\xe2\xa0FW\ +K\x06\xb2\xd5\x06EG\xa0y \xd0\xe2\x8e\xa6y\x09\ +\x09n\x96O\xa5Q\xde\xd2\xae\x00\x90?}\xea:c\ +V\xae>\xb5\xd6\xbdw\xd6w\xedk\xe4\x1b\xeb>\xfa\ +\xd2\xdav\xdeZ\xe5\xe2C\xb8\xc1\x0d\xcb\xc3c\x14\x8d\ +\x1dZ\xd9\x94\xe4\xc0J&v-\x7f\x08v\xdb\xc1\xc0\ +\xd4\xa1\x04\xe5\xdf\xb8NM\xf6(\xdf\x17\xe1\x93\xcb\xd7\ +d\x8c\xea\xe4\xb5\x1d*\xadq\x09\xc5-c\xc1H\x93\ +v\xed\xe8\xf7x\x85\x06\x85\x8aQ>\xa7\xc1\x1eC\xe1\ +(\xb9y\xcc\xfc(\xda\x93Q\x0b\xb4\x8e}\x12\x0f\x00\ +\xfa\xbc\xa6s\xe1?\x88^S\x00\x8eV\xfd\xb4\x16\xa0\ +\xe5\xe0\x0b\x02wY@(m\xb4K\x15\xedv\x09\x90\ +]\x86\xac\xc6B\x96\xe3\x95\x12\xb6i\x9f\x00a\x01\x00\ +\xb8\x89\x22\x00+\xf6\xaem\xddZ\x1f\xf0\xb5\xc3\xe21\ +\x1e\xd7\xe8\x01cr\x87o\xa8Z\xa8\x19 \xf0y\xd7\ +=\xa4e\xd1\x85]\xad\xc0\xaa\x06\xaa\x9c\xd2\xd6mw|\x1dc\xaa2\ +\xb5\xec\xb1\x9b\xa6\xcac\xedo\xd0\xb17\xa9\xad\xf2\x1c\ +p\xa5F\x8c\xa5^\xde\x050h\xf9\x1a\xaf\x94\xc8\xf8\ +%\xd5b\xedx0\xafm\xec$\x0a\xf6$\xa9\x86\xd7\ +\xaa\x09\x84\xdf\x0b\x00n\x9f\xa1@\xa0-\xe8\x02\xeb\x8c\ +\xc5\x08\xbd)\xa08\x95\x0b\xa5\x13\xff}(Zk\xdb\ +:\x8bO\x00p=l\x9cxu\xfcjC\xaen\x19\ +\xaeO\xde\xe4u\xd7\xf2\x5c\xed\xe6\xab\xd7\x1f[\x8dZ\ +\xa5\xae\xa9\xa1!i\xe3\xf4M\xac\x1f\xae\x00\x89\xd4\x16\ +f\x1d-\xab\x93D\xb5\x9c\xea\xce\xf5\xc3b\xd5\xdc \ +Q\x1b\x22\x15\xb7\x94F\xc9\xd5\x11\x17\x93\xb8Im\x9b\ +J\xa9\xd76f,_\xab`(\xdd\xf5\xe8\xef\x06\xa0\ +*\x88\x94\xb7\x12hU~u\x1e\xaa\xfc\x00\xcc-<\ +ui;\xb6Z\xc6\xa8\xaf\x80\xf6\xec\xa3x\xc2\x81\x18\ +\xb4\xc2C\x1a\x03\x99F\xe8I\xd5\x86M\x85 \x07\x00\ +@W\xa7\xc9\x141e\x119M\xe9\x9e\xb3w\xe43\ +\x09@\xb8\x04\x104\x81\x14+\xd0*\xfc(Um\x84\ +\xa7\xa0L\xb5\xaf\x17\x7frar@-Xd0\x90\ +h\x80\xa0\xbaBw\xe8\x83\x03\xacd\x01#\xe0^\x01\ +\x85\xba\x82\xa9\xd1\xa5\xebA8\xa1z\xc8S\x0b\x8e\x02\ +\x02Rj\xef\xa4\x14<\xb4+\xdcY\xe0\x1axE2\ +\x02o\x99Y\x9eK\xa1R\xe3\xc9xi;\x1c^E\ +\xee=Y[\xcb\xc4+d\xed\x02\x02J\x17\xd7H\xc0\ +\xb0\xb4\xd9V\x9bl\x13\xe0U1\x09\xa06\x91\x9bO\ +\x22\x03p+\x83\xb8{\xd7\xa3\x9fx\xef2\x01!\xf8\ +w\xa2\x22\x08\xf5\xb0\x09\xa9\xeb\x84Z\xbdN\x9dX\xf1\ +\xfcM\x94N\x0a\xb8t\xe6\xde\xebw*\x13\x8fh\x03\ +f\x9fz\x05/\xba>B\x81\x96i\x94\xc0\xcd\x12s\ +]~\xff\x89\xcc\x117\xc5\xeeI}\xe4\xa2d\xf9)\ +\x8a\xf7\xb8}\xb7\xfbV;f\xa4\xfc\x9e\x03\xae\x7f\xc4\ +\xf5\x8f\x11^\xfb\x0e\xb8'B\x97\xc2\x95H+^\xc6\ +\xef*\x9b\xb4\x07p\x06\x0b\x9bp\xee>\x0d\xa5\xab\xbe\ +/\xadA \xd0\x92.a@\xa7k\x09\x8c\x90PM\ +\xfcx|\x80{\x80@\xc6kk9._\xcc\xfa2\ +J\xbf\x5c\xa8\x09\x9djR\xb5*\x84TN\xa0\x00\x08\ +n\xf71\x16\x98\x8c'H\x93\xd5\xab\xec\xcdU>\xe9\ +\xf9O\xcc5\xb1\x1cR\xc7/\xc6\xad[u\x92\x9e\xb7\ +R\x09\x98'\xf2Z\x8b\x84V\xc6H\xbd\x04\xd4\xf1\x14\ +\x10h\x8f_p\xe4:\x008q\xe5f\xae\xd2\x88\xbf\ +\x07\xfa\xd0M\xf7\x12!\x9b\xefP\xf9:\xf7\x9f\xae\xb9\ +\x02\xbe\xcb\xb5\xd7\x07P:\xb2\xc6kq\xcf\xd8\xe9X\ +^\x08\xaa\xc6\xd2\xedo\xc4\xe2U]$\xc5\xab\xd63\ +\xa1\x01\x00$\xa1t\x89f\xb9R@c*\xa22i\ +oc\x84\x88\xdf\xb9\x80\xc0\x0b\xc9\xec\x05\xb5\xfd\xebn\ +\x1f@tL{\xed\x0f\x08\x07\x90\xba\xe9CRB\xed\ +\xb8\x95\x05\x5c\xb5\x90v\xe1\xf6,\xe3\x01\x16\x88\xf7s\ +x\x00\xe2b\x13\x83Ej\x97\x8a\x8bJ\xd6\x1e\xfbJ\ +\xdc\x93D\xae\xaa\x06\xb4j\xe9S\x07I7\xad\xa0|\ +\x15\x9el\x9a\xce\x13\xd6Y~\x17\x9b\x1c\x5c/?\xc9\ +\x80\x80p\xe8V1\xe5\xb1\x04ZGX;\x18\xe86\ +\x0d4\x83\x84\x82\xc5\x0f\xe4\xf2\xc5\x11\xd2[t\xc6\xde\ +\xb4\x0b\x19\xe9\x88\x0e\x94\xd4!\x15\xc9\xe4\xdb\x17\x8b<\ +n\xaf>\xae^\x0a\xd6\xf4\xac@\xe0\x00P\xa0\x09\x9b\ +r@@.\xaf\x09\x1e\xbc\x84>\xab\xb3\x02\xb5\x93Y\ +1\xdc\xb5\xd9U%3\x19R\xae\xd2\xe5\xe1=\x00\xa0\ +\x95R\x15\xcdr=\x14\xa6\xeakw\xba\x98\x14\xa7\x16\ +=\x8co\x16F\xe5\xba\x84\xa9\xa9\x03\x00r-\xea\x08\ +\xb5\xae\xd8\x14\x8f\x1b\x18\xc4\xe3\x91\x96\x07\xc8\xc6\xd4\xed\ +D-\xf1\xd4\x11\xcd\xed\xf4\xe5\x99ur\x9bz9\xb9\ +\x1e\xcb:/\x01b\x1f\xd0nb\x15\xde\x22:\x9b9\ +U[\xdb\xb4\xddMee\x84\x22IL:n=\x8d\ +\xc1K\xc3\xda\xd3\x88Si\xb8\xd3t\xb9\xaa\x0e\xcd\x09\ +\x9c\xd7\x09v\xe0\xae\xdcz>(\xeb\x9a\x83,\xe2\xce\ +{\x97P\xc0\x8a\x85\x86\xd7-\xa2S*G\xb1\xf6a\ +b\xfd\xe0:\x96\xb9\xc2C\x81\xec\xaeyn\x0c\xe1\x7f\ +\xdd\xc1\xd2\xf2\x04\xbaa\xcd\xb3C\xa0\xb4S6\xe3|\ +cdj\xfd\x12H\xc5\x0b5\x01\xc2\x16\xeeCU/\ +\x1d*@Q\x97k\x06\xa1\xef\xc4\xd5$\x04\x07\xaeC\ +\x94T*}\x0e\x02m\xf1R\x99\xf6\x80\x8aKw\xf9\ +\xac\x16p\x08\x19\x8a\xb50o\x0d\xb2:h9kA\ +\xd9\x19\xe2\x1fz\x1e\x95\xbac}:\xac\xca;d\x92\ +\xcc\xa2\x11W\x89;M\x00\x08^\x93\x09\xad\xc9\x03\x02\ +\xf2\xec\xcb0\xeeK0\xef\xcf\x8a*\x91*B\x01\x00\ +\x10\x09S\xb9\x18|FUUR\x9evZ\xe9\xc0\x08\ +\xd7\xa9c\xe2\xba\xe5\x8c\xa0T5\x83\xd2\x22X\xe7\xc5\ +\x98\xea\x15\xa0*,\x88\x1f\xa0\x03\xd7\x81\x14e\xebH\ +\xdcO\x95\xc6\xe7\x00p\x9dJ\xf5w\x85b\xc2\x85k\ +\x83+\xaf\xd1\x83\x11\xe2\x91\xa3\x84\x9a\x5c\xc0\x93?L\ +X\x068\xb9\x8cI\x0e^2\xd4{\xc4g\x19\x17\x9d\ +\xc9\xac\xcd\xac\xdaf\xe6\xb6\x9a\xa9\xb2\x18\x81\xf3\xc5\xa8\ +\x98Q\xe5\xc6:}\xcb\xd7K\xac\x01Ejq\xee\xd5\ +\xfak\x80\xd4cGk\xf9S\xbc\xe2R\xdb\x89\xa9\x9d\ +\x93X\x1bD\xabw\x0e\x0b\x5cD\x09 \x10\x09\x92\xd6\ +\xb9J\x1f\x94\xee\x83\xe1\xeb$o\xf5\xf6\xc9\xd4i\xe2\ +\x02\xc0y#*\xb54Q\xeb\xd7\x1c\x5cx\x84\x1b\x0c\ +u\xf1\x80(:\xd0\xb9\xc7\xff\xeeq\x0f\xda\xe2\xa4}\ +~\xc7\xc4?\x9d%\x8c\xd2\x07\xb41B\xa2\xf7\x02\x02\ +\x22\x00\x0cy\xc7\xb1\xba#Y5p\x03\xda%#\xe0\ +lp\xbf\xf2\x22\xaa`&c\xc0\xf5\xea\xf4P\xef\x18\ +\x1a\xf1\x05\x06\x9fP\xe7\xea\x17\x90\x8b\xa5\xeb\x00^O\ +V\xa9V3\xda\x1b!\x17\xafn#\xb1\x95m\xa4\x83\ +\x00\xa1\xa2\xd1.W6\xdb\x95*ro\x1d\xe6H\x98\ +\xc9\x90\x05Cv\xa3S\xa7\x96?w\xdf\x0a\xe7\xd5Q\ +\xfc\x1e\x1eQ=\x97oXt\xf4\xd8\xc5xo?$\ +a\xe2\x9cS\xe9\x9cB\x15\xc3\xaa;\xbbS<\xca\x93\ +\xa8S\xa9vG\x07\xd5\xe6]\x95\xd2\xfc]\xa9\xb7\x0e\ +\xb5R\xbb|\xb5\x9f\xd1\x18\xaa\x8d\x9f\xba\xa8\x16\x8d_\ +\xb7\x12<\x8ez\x1b\x95N\xdf\xe3\xfd]+\x1c\xbb\x0d\ +\x18N\xf9\xdc\x0d<1c\xd3\xab\xede*\xeaQ\x99\ +\x9f\x8e\xe6el\x09\xa31*kV\xea\xe1\xaarU\ +\xd2\xcc\x8d\xb9\xa3c\xe4\x09\xda\x15\x83\xc9\xc3\x9b&\x18\ +\x10\xdch\x13\xb1\xb4\x99<\xbbu\x98\x81$\xaf\xee\x9a\ +\xe0\xb3\xd3<\x0cV>\x00\x10\x06\x96x\xaf\x86H\x9e\ +\xf5\xfbQ\xbc\x18\xff\x85\xf2\xd5\x09;\x97\x98\xa8\xf6\xf3\ +E\xe37I\x0dO\xadp\x14\x8b\x19a\xa0\x86\xb5\x15\ +\x8a\x9b\xd5\xee\x15D\xdb\xad\xb5\xe350\xa8\xbdo\xc8\ +\xc0M\x06\x0c\x00\xe0\x05\xdcY=\x88;\xbd\x03\x10\x84\ +!L9\x13g\x10\xa8\xdb\xe6\xba|\xf2\xbf:lZ\ +s\x1b^\xd9\x9a\x0aXI\xc1D\x16\xa5p\x80\xae\xfe\ +\xbb\xea\xb5\xab\x86Jj\xb1\xa2\xee\x99\xae\x83\xa6\xf6\x22\ +\x0c\x12R\x00\x87\xfa\xefk\xe1'\x1e\xb2\x1aG\x86\x10\ +[\xd3mWj\x01\x83\xea\x18\xe0\x13I\xe2\x18\xb8v\ +\x1d\x0a\xa1\x89\xb1<,\xbfp\xfe\x91\x15-<6\x1d\ +B\xe1N\x10\xd1\x112\x93\xb7\x09\x07\xb7\x00\x82<\x02\ +\xd6\x89r%j?\x17Q\x13j5\xd9\xd69\xc8\x88\ +2\x00q\x80lm\xd9\xd3\x1e\x09\x09@Pc\xe8\x08\ +zR\x8f\xa6<~\xa7\x8d$\xc5R\xfa\xccm+\x03\ +l:W@M\xa1+\xe6\x9fX\xf9\xecc+\x99z\ +\x08\x08\xee\x02\x823@\xc0w3vY\xbd\x8c\xab\x04\ +@\x04$\x8ce\x8cw\x22\xb7\x10v\xe8P\xa6\x83\xa3\ +Ta\xf2\xe9\x94*\x88\x8a\xe6\xa3\xbd\x93\xb8\xb5l\xdc\ +\xc3\xcf\xbd\xfc\xbe\x1f\x0b\x1b\xc2\xd2\xc7`\xe5\xd3\xb8\xb9\ +\x05\x08\xcf2\xb2j9\xea\xf0\xd5\xbf\x86\xfbQ\xbf@\ +\xaf/\xf0?\x9aC\x1fZ\xd1\xa4\xd7\xc2\xb4\x04\xc4\xaa\ +\x1d[\xf1\x14\x037\xa5\x03\x1en;+\x0aO\xdd\xb2\ +l\x1e.\x8bA\xcb\x1c9\xc5\x1d\xf2\xcaCd\xe2\x09\ +2\x15\x0apm\x17'ui)Z\xd3\xd1yj\xec\ +\xc8\xa0\xe71\x08\xb93\x0f]\xf1\x84\xbc\xc5\xc5\x86M\ +\x9f\xb6\x83\xf3\x5c\xae\xec\x8d\xc1\x97B\x8af\xefZ\x85\ +\xda\xddk\xb3\xc9\xe6\x0b\xe4\xb9U\xaf>\xb2b\xd2W\ +u\x0cQ\x86\x91\xd2\x02I&\xafO\x80G\xc4\x93-\ +\xc4\xc3%\x12E\x1c\x95\xc6*\xad\xed\xdfF\x89\xc7\xa6\ +C'\x0aP\xb8N\x11)\x9c{\xcc{dF\x1d\xd8\ +\x1f\xf2\x5c\xaa\xa9\xb8OHP\xab\xf7\xdb\x96\x0fX/\ +\xc4;\xd3@\xbb\x98yn\xed\x88\x02\xcc\xd9*\x97\x07\ +\x00\xda\xb7\xa9\x06\x95\xaa\xa0vg \xc0/\x0a&\xd4\ +\xea\x15K\x9f{`\xe5\x8b\x8f\xadR\xa7\x80.\xbf@\ +^Z\xc5\xd2K+_xae\xb3O\x19S\xeec\ +\xec\x1e\x06w\x8a\xe1\xe1!\xb1\xfa`7a\xa5\x1bn\ +\x81\xf8{T\xe7\x09\x004\x90\x22RZ\xfdS~\x1f\ +\xc2\x15\x09\x0c\xea\xb2\xa9-[\x9a\xc1R\x93\xc2$\xe5\ +\xeb\xaef\xae\x83\x5c\xb9\x9d\xf4\xa2\x03 t; \xf8\ +\xf1\x06\xa1\xbe\x19\x14\xbf\x84%\xafa\xd1\x9b o\x8b\ +\x14\x90\xf4\x06r\xa3nY9XU.,W\x16\xa6\ +\x83\x0c\x8ag\x00\x00\xe8U?\xfcb\x1d\xab\xa6n\xe3\ +3X\xc9\xcc\x0d\x0bOs\xc3:u\x03\xf7\xa9\xbdl\ +\xda\x0b\x1f\x1c\xc2\x03h\x7f\x9c<\x80\x00\xa0\x8c\x00\xe5\ +f\xb92\xa9\x9b\x96;\x8b\xcbe@\x0a\x96\x9eY\xc1\ +\xe23\xd79C\xcd%\xb4\x87/\x88K\xd5.\x1e\xb9\ +V\xb5\x7f-\xd0a\x17\x0b\x0fI]\x9fY\xc3\xcek\ +k>xk\xadGo\xad\xed\xf0\x8d5\xed\xbc\xb0\xaa\ +\x15\x14\x897P\xba\x9bNV\xa4\ +m\xce\x08a\x19\xae%\xaa\xe2O\xbfv\xbb\x8a=.\ +\x02\x00\xe5\x90J\xd54\xd7\xdc\x86\xb4\xb8\x19\xa9DU\ +\xd6\xd6v\x92\x86\xf4C\xf6&@\xda\x02\x8a_\x07y\ +;V8~\xe0f\x00\xdd!\xd1\xb8\xac\x5cP\xac\xa3\ +R\xddAH\x13:\x89\x5c\xfb\xe1\xce\xf7\xc4\x8d\xab'\ +\xfe1\xec\xf9\xc8r&\x0f-DV\x91\xcdk\xd68\ +n\x9e\xbfg9\xb7\x88G\xd0\x86L\xed\x93\xd3\x8e\x22\ +Gn4kIlU\xc5\x0c^#w\x1e\x0b[\xc4\ +\xe2\x16\x1fY.\xb18\x82\xeb\x0dc1!\x06P\xaf\ +Q,G'~\x94-\xe9\x00\xc5gV\xbf\xf3\xd2\x9a\ +\x0e^Y\xf3\xe1\x0bk9xf\xad\xfbO\xadq\xfb\ +\xa1U\xad\xdeu\xcd\xaa\xc2X\xb6\xe6ER\xb5\xe1S\ +\x9ba\xce\xa7lu4\xad\xb8F\x18\xe5\xe8\x940\x1d\ +GS\xbe\xf4\x1cy\xe9\x9a@\xe8$\xb2\x02\x94^0\ +\xf3\x1c\xe5\xbf\x04\x1c:\x9bY\x0az\xcb\xdf_[\xc9\ +\xfcs\x00\x80\x85\x12\xab\xf3\x08\x83\xaa\xebsG\xd7\xab\ +\xb7\x80\x13\x85d\xb5\xcb\xd1\xf68\x8cB\xde\x11\xefR\ +\x04\xc0t\xc6\x91\x0e\xbf\xaa\xdax\xe7\xce\xfe\xad\xba\xaa\ +C?\xdf[\xf1\xc2\x1b\xae\xf7\x02O\xf3\x94q\xe6\xf9\ +\x87\xefat<\x03\x00 \xce\x03\x94l\ +\xe2\xa4\xe2\xa3\xeeS\xe9\xa0#\x8bn\x03\xa4\xaab \ +T\x9aq\xd4v2\xbcK\xee\xac\xca\xa7p\xab\xa4c\ +9j\x99\x86\xa7\xc9\x9d#\xcc\x00\x8e\xb2\xd5'N\xf9\ +\x9a\xb4\xaa\xddzl\xb5\x9b\xf7\xb0\xa4\x9bX\xfd\xb1U\ +.\x1d\x10C\xb5\x01\x05F=\xb9\x8f1\xa8/\x8fJ\ +\xe0\xe1\x10-\x9a\x90R*\x07\x9bW\xd5\x93R>\x9e\ +A\x8d\xa7u\x12h\xe9\x82w\x80\x94\xe7\x01\x1e\xe3\xcd\ +$z\xff\x82\xdf\xbd\xb6\xd2\xa5\xb7\x00\x0f\x00,\x0a\x10\ +x\x86\xc9{\xae\xd1\x96\x0e\xa5V1M@E\xb6\xee\ +\x15\xe6\xaf}\x87\xd2\x09\xc0\xd0\xa4P\xe4\xbc\x99C\x01\ +\xf1\xbd\x18\xa0\x95\xb9\x13\xd0\xdeX\x85N>[z\x83\ +W\xd1\xd6\xf8\xc7\x84\xb6\xfbx\xad;\x90MB(\xb1\ +>K\xe5\xe3\x9d<\x83\xf6sh\x17\x97\xdbQ\x04\x98\ +I\x11\xd3\xbat\x00\xe7\x01\x00\xe0B\xae\xef\x8c.\x86\ +\x1b\x0a\x83H\x81@\xbc@\xb5\xe6\xda\xc5\x9b\xdc0\xed\ +\xe6\x98]\x0b3W\x9fwQ\x97\xd7m\xe9\x90\xa3@\ +\xd3\xb0\x85;\xa7\x01\xc0\xb2\x15\xa1\xb8\xb2\xe9k\x0c\xe4\ +\x1db\x94\xac\xed\x89\x95-?u'V\x97\xea\xe0\x02\ +\x91#,Q\x1eA-\xd4t\xea\xb8;\x1f\xd7\xa5g\ +d\x0e\xca \xcek\xd8u\xe4yP=\x0a`\xbaY\ +c\x0c\xc8(\xf7\x0a!\xd2\xe1\xd1\xda\xf6\xac\xc9!\xb7\ +5J\x0bX\xfa.u\xdav+\x95\x90,\xa5`p\ +\x8d(\xae2\x0c\x85R5\xa1\xd0\xb9Cj\x1b\ +\x97\x87\xcbw\xad\xe3\xe0Z\xae=\x8dKU\xb5\xd3G\ +\x82\x95\xe2\xcd\x94\xa3\x0b\x04\x1e\x000Du\xf4\xc0[\ +\xe4@&s\x09\x1b*\x07\xd7!\x97y\xaa\x10V%\ +\x962\x22\xf5\x01\xd0V1\xcd\xa1\xb89\x95yK\xad\ +\x83\xabhR\xadn\x06\x99&\x8c\xc3a4M, \ +\xb4j\xe5\x11\x92\x0f\x08b\x5c'\x09\x11A\xf2\xea\x10\ +d\xcbm\xda\x14\x13%\xae\x8a\x08j\xe3\x87z\xf5i\ ++\xb8k\xe6\xd0A\xbe\xdf\xb9\xe2\xce\x08\x08\x93\x02E\ +\xba\x16\x9d\x84\x11\x9d|\x15\xee[\xc7\xb5o\xc3\xb2\x19\ +d\xc8\x5c\xc1j>Hlje\xa3%\x95TY|A\xa9\xc5\ +\xe7\x17[B\x01R\x5cn\x89e\xd5\x96\xc8\xdf\x12\xab\ +[-Q\xdd=I\x01\x93j\xb5OP\x99\x10\xa2\xf7\ +\xbc\xa64\xa8\xc8d\x84\xfb?\xdf2\xa6\xc5.\xadI\ +tk\xc6\x14\x0f\x86g\xd2Q.ZA\x0dq\x7fj\ +4\xa1\xd2y-d)\xbcj\xc3\xad\xb7\x90\xc4\x18k\ +\xcb\x9dVf\x05\x02\xc2\x81\x1aQ\xa8\xa5K\x04\x008\ +\xe5\xe3\x01r\x05\x22\xf4\xa3\x83\x8f\xa2\x0b\x067-\ +_\xfdwQ|\x18ku\xcd\x91y\xaf\xa9\xe0\xf0\xf0\ +&\x80\xda\xc6\x02\xf8\xec\xcc\x11D\xe8&\xd6\x7f\x9b\x94\ +\xe5\x1e\xf1\x96\xb89{\x8a%\x92\xe3\xe2Ju\xbe\xbe\ +\xeb\xcb\x8b\x87\xd1Z\xbf@\x90\x5c\xafU;\xcd?\x8c\ +a\x89X_\xdb\x14\xe4e\xc1\xedr\xf5i/\xe3\xa0\ +v\x13\xc3\x96I\x91\xdc\xe1N\xb8\xd5\x90\xd8\xbe\xa6\x87\ +\xdd\x926\xf7\xcdgu \xa3\xdfmPQ\x0b\xf7q\ +\xcb\x90\xd2\xaa\xda-Y;\x84\x0a\xab,!\xbf\xdc\xe2\ +sK-.Z\x8c\x14Z\x5c.\x92Wdq\x05%\ +\x16W\x5c\x01\xe7Q\xa1i\xbd%\x947\x10\xfe\x1a\xbd\ +W~\x8e\xd7\x1e\x832\xfd\xdc\x02X:\xe0C\xbdn\ +\xc7\xaf\xb74-O\xe1M\xf5\xfa\xdaum\xad\x05\xac\ +\x98\x16\x82\xdc\x01\xd0\x8d*\x00\xd1\xd4\xf7$\xafX\xa8\ +\x96\xbdQL\x1a\x8a\xd1\xbeKu\xfa\x129\xd7\xbc\x88\ +vj\xe9@/w\xa8\x17\xfcI\xe72)t\xaac\ +{J\xed\x90%\xb9\x92y-\xa6IT$\xd3\xebB\ +u|\xa5*\x97\x09\xdb*\xa7\x03\x10\xdae\xa4\xc5 \ +\xaf\x09\xa5\x1a_\xceXLB\xc5\xb0[7N\xe5\x17\ +>\xd0\xa4\xae\x96!\x14\xad\x16\xe9\x9ayr\x07@!\ +\xda\xdd\xab\x83\x08\x0b\xc6\xbc\x83\x9dJ'O\xact\x02\ +W?\xbeg\x85XWTs\xff\xe4\xfdA7\xd0\xe7\ +3\x81\x9d3\xc4\xb7\x19B\xc9,\x80X\x02\xb9W\x89\ +Y\xbb\xa4~'V\x86g(\x83i\x17\xb9UC\xb2\ +\x0fMBqm-\x93\xaa\x10\xc4k\xcc\xac\x92p-\ +\x0fk\xbd\xbb\x97\x9b\x1e\x00\xbd\xdck\xdb,\xaer\x85\ +\xd0\xb0\x09)\xc4\xdd\xaa\xe5\x9c\x96R\xc92\x94;\x8b\ +\xbf\x04\x14[Ic\xbdC\xa5q\x89\x0cV\xaaV\xce\ +\xb4\xd1\x93L&\xa9X\xca\xaf\xb1$IA\x8d%\xe6\ +W\x03\x84J\x80Pf\xb19Ev%\xa7\xd0\xae\x00\ +\x86+\xb9\xbc\xcf+\xb1X{\x98\xd16\x8a\x82\xa7\ +\xf1 \xcb\x90\xaem\xc8\x17\x00\x02\x00e\x0b\xa4Q\xa4\ +o:\xc2E\x93\x1d\x02\x9b_[\xce\xe5\x165Pd\ +\x1f\x89B3)\xa86bh>B\xed\x5c\xd4\xcc)\ +\x83A\xd0n\xd7 \x9e(8\x827\x80Sh>=\ +\x80'Sv\xa0r\xb74H\x90\x0aJRA{*\ +\x03\x9e\xc2\xa0$\x97\x01\x80\x92FK.i\xb0\x94\xd2\ +&\xa4\x05i\x06\x14XsA\xad\xc5\xe7U\xe2\x05P\ +4^!\x16\xafp%\x0a\x08\x04\x86h\xc1'\x89u\ +\xaf\x85\xee\xef\xb1\xb9\xe5x\x8cZK(l\xc1\xab\xf4\ +\xe0]\x08\x09\x18\x94\xbf\x11\x0e\xc3sd4\xe2\xb5\xea\ +\x15\x93\xb1tU\xe5hM^\x16\xe9J\xc3\xb4\x0dL\ +[\xc1\xcf\x97\xc4U\xc3W\xa6\x9e\xc2C\xeeh95\ +\xad\x8e`\x88\x1a\xff\x0a\xc6\xa9z\xe9\xaeU\xcci\x16\ +\x900;L(\xeb\xd6fU\xc6\xb7E}\x8d\xf0\x96\ +\xcd\x00\x88\xb1O\x82K\xa9c\xba\xf6\x18\xa8\xf8\xf5\x0a\ +\xdf\x7f\xa9\xb4\xd3.\x93\xc5].iCZ\xed\x0a\x02\ +\x00T\xb9\xea\xed\x91SM]:V\xa2\x93?t~\ +]\x1e\xa9\x95:h\x97J\xe9\xb3w\xacR\x87K\xe9\ +\x00\xa2\x19\x08\xde\xd45w\x14\x89\x94\x9f\xab=\xfc}\ +\x9a\xf5\xf3\x8a=\xdc\x9a\x7f\x83J\xadT\xac\xd0\x8b\xd2\ +\xbcx\x99\x0e\x18\x02\xedS\xee\xb3\xf9c{\x84\x80\x9b\ +\x84\x83\x07V\xbd\xf6\x14rH\x96@\x9e+\x82\xa3\xb3\ +\xfeu0\xb5\x80\x90\xa1\xa6\x14\xae\xc7\xae\xca\xb5T\xb1\ +\xd3\xef\x81@\xe1AS\xb1\xf24*\x97\xee\xc7\xdd\x13\ +\xf3\xfd\xc4~\xd7-K+\x88\xdaI\xdbA\xcc%\xef\ +\xcd\x04\x0c\x01\xbe+\x83\xefJ\xab\x06\xecd0i\xd5\ +d15\xdcWM\x1f\xef\xb9G5\x96\xd6F\xcd\xa2\ +\x06Wf\x1e\x87W\x88\x05\x0c\xb1\x02C\x14/\x80g\ +\x88uJ\xf7\x00\x10\x0b0\xe2\xf8}\x5cn\x05\xde\xa3\ +\xce\x92\x8a\xda-\xad\x82g\x84|e\xb7@\x0c!Z\ +\xd90\xee\xcc\x16\xc2\x1b \xf8\xdf\x01\xa0\xfa\xc0\x81s\ ++\xedv\x15\xc5\xaa\xdeM(iw\xc5\x9c\x89\x00!\ +\xa5z\xc8|\x8d\xd3\x10\xd55\xbc\xec\x915\x10:\xbb\ +w\x9eX\xcf\xeeC\xeb\xdc>\xb3\xe6u\xa5\xdb\xea\x18\ +\xbeLX\x80\x97\x0dh\xe7\xb5j\x12\x08#dV\xc9\ +\xcdZ\xfe\x1d\x03\x04C\xe7 \xe8B:\xcc\xdb\x19\xd4\ +\xea\xd2\xf9\x18\xb7\xf9\x92|>^\xdb\xa4\x19\x10\x15K\ +\x04\x19\xd4\x1c\xe2\xba\x8eg\xd3IS\x95\xa4PU0\ +\xfaJ\xac\xb5\x1c\xab\xd5!D:[ \x0fr%\xcb\ +\x0f\xf7.[V\x17\x04\x88L\xc0\xafE#\xe2\x9f\x03\ +@\xadJ\xbb@\xb3\xb6Y\x03\x82\x94\xba>R\x93Q\ +\xd39?y#[^{\xfa\xf5'\xd6\xb0\xf3\xc6\x1a\ +w?X\xdd\xd6\xe7\x10\xc5\xb7p\x85\xe7\xb8\xba\x07\xb0\ +j\x80\xa0\xe2\x0f\x91#\xb9PGt\x86\x01\xc2 !\ +\xc1+\xb4LV}\x01\xb16\xad\x03\x97H\x5c\xd4!\ +\xd8j\x8f\x96\x05;\x0e\x0f\xdc\xc4Jn\x03\xd2;V\ +0|\xcb\xf2\x06\x8f,\xa7\x17\xa5t\x12\xea \x97A\ +\xee5\x13\xf2\xa6\x8c&C\xc5\x15\xd5\x84\x1b)B;\ +u\x8b\x18\x97\xc2&\x80\x00\x18\xf2\xb5\xf7\x007\x9fW\ +\x81\x94#\x00\x02\xf7\xaf\xd78~\x8e\x07(\x89|6\ +\x05\xeb\xf7\xd5L:\xe5G\xbb\xf7-\x8f{\x88\xf6\x1e\ +Y\x88T5\xa0\xba\x86\x06u\x0f\x13+?\xaft\x86\ +\xf0z\x1bM\x07x&B\x1c\x9e \x09KM*\xeb\ +r\xaf)\x80=\xbd~\x1c\xf0.\xc0\xb3v\xdc\x86\x9a\ +\xe1\x83\xe76v\xf2\xdcF\xaf=\xb1\xbe\x83{V\xb7\ +\xa2\xb5\x8c=\xb2\x02B\xf4\xd8!\x19\x06\xe4PF\x00\ +g\x13qW\xf6\xa6\x8d\xad:\x87\xc0\xab\x19$\x9c\x02\ +~\x85\x0b5\xc1\x88QW,m\xceL\xac\xed\x86\x88\ +\xf4\xe3\xaa\xc7,\x9b\xfcWn\xbaD\xf9\xfc\xc2m\xab\ +\x82\xb0U.\xea\x0c\xbaS\x5c\xb7N\x12\xd5qk\xf0\ +\x04\xed\xf7W\xf5M;\xfcA\xe4\xaaY5\xec\xaa\xb4\ +Q\x95\x0d,T\xf5~\xb5<\x9c\x06V\x16\x867\xc8\ +\xc0\x0bduN\x03\x80\xabV\xbep\xc3\x1a\xb6\x9eZ\ +\xdb\xd1\x07\xeb\xbc\xfe\xd1:\xae\xfd`-G\xdf\x03\x88\ +o\xacj\xeds\xd7f\xbe`\x82J\xd6\xb0\x88\x87\xd9\xb5\ +\xda\xb5\xdb\xd6\xb2\xff\xc2\xba\xae\x7f\xb0\xbe\xb3\x8f\xd6\x0f\ +\x08\xfa\xef\xfc\xc1\xfan\xfff=\xb7~\xb3\xae\x93?\ +Z\xfb\xfeO\xd6\xbc\xf1\xad\xd5-\xbf\xb7\xca\xd9\x17\x90\ +\xcf\xc7\x84\xa7\x07V4\x86\xf0Z2\xf1\xc8\x01\xa4b\ +^\xd6\xfe\xb9\xd5\x01\x9a\xc6\x9d\xef\xacy\xffGk=\ +\xfc\x09\xf9\xc1\x9a\xf6\x00\xc0\xc6[w\x08s\xa1\xe6\x1f\ +H=\xb3T>&\xbe\x22O\x85B\xbd\x9d3(\xdf\ +\xf1\x0c\xd5\xdb\xc1\x17\xc8\x1etB\x98J\xadt\xd6\x8e\ +6\x8d*\xadS1\xaa\x8f1\xc8P\xaa\xa7\xcf\x10\xab\ +\xfdp\x8c`\xeb*\x00%+B\xe1\xda\x1f\x99\xeb\x1a\ +>\xde \x8b\x22\xa7w\xfd\x15\x8e\xed\xa2\xd9\xa3\xa6\x94\ +?e*X\xaa\xcb\x14T.\xcew\xb9\xfd\xfb\x18W\ +\xb2t\x03\xe1\xd5\x81\x9b\x85p\xad\xda\xa9\x03\xabW\xaf\ +\xa4\xd9\x13\xab\xc5C\x17\xaa\xe1v7Y\x01\x86\xa0z\ +\x0au!Ok^\xe7;VP8\xd6\xaf\xcc\x03/\ +)q\xe1\xe7\x5cRI=\x95\xa1\xc4\xa4\xaa\x22F-\ +\xe2:\x17]\xd7\xa8\x001=kx\xcb\xc2\xa3\xbb\x16\ +\x81\xe1\xabS\x97v\x05\x05\x07A.nH\x07/\xa7\ +\x92\xdb\xba#Z@S\x22\xb1\xcc\xabF%>\xcb\xcd\ +\x90\xc7'\xe2\xd6<\xe1\xbd\x03\x81j\xfd4\xa8\xbd\xa0\ +\xbb\x97A\x1f\xe4\xa6\xf1\x02#+\x10\xc1\x03,\xf5\x0c\ ++}l\xedGo\xac\xfb\xc6\x97\xd6{\xeb;\xeb?\ +\xfb\xd9\x06\xce\xfeh\xfd\xa7\xbfY\xdf\x8d?Z\xf7\xf1\ +/\xd6\xb1\xf7\x835c\xd1\x0dWQ\xa6\x9a?\x22\x8d\ +W\xbf\xb2\xf6\x9do\xad\xfb\xe0{\xeb=\x06<|\xb6\ +\xff\xd6\x9f\xac\xeb\xe6o\xd6q\xfdWk;A\xf9\xfb\ +j\x12\xf9\xc6*Vt\x82\xc9\xa9\xe9\xa8\xfa`\xd72\ +!\x0b\xf0_X\xbeS\xbe\xe2#\xf7\x09hS\x9a\x08\ +\x0b\xad\xa4b<\xafkx\xa1B\x0e\xa5\xc5*\xcc \ +\xdb\x08A\x90\xb3U\xef7\xa8\xe2\x8e\xf3\xbe\x08Xv\ +\xb0\x93\xd4\x14\x00\x84\xe0!\x11\x94\x9d3\x08\xd8T\x98\ +1z\xc7r\x08K\x91\xb1;\x16\xc6+\xa8\x8eA \ +Pk\xf7tM\xcfb\xa9\xea\xc4\xe6\xa4\x19\x01tI\ +\x00,\x19IQA\x0e\xa9of\xe7\xbcE\xdc\xe4\xdb\ +\xb2\x855\x19\xd7\xb9j\x01\x00\x97\x8e\xb2\xd3\x90\xd4\x06\ +\x94^\xb7\x88\xc1\xcd\x91\xefk\xfa~\xd2\xcb\xfb\xc5\x9d\ +\x5c\xea\xa9\x13O\x14:\xbd\x99A\x81-&\xa5m\x89\ +\x0bx\xedB\x5c-`\xf7\x1aV\xae\xa5N\xed\x02\xe2\ +\xe1\x10m\x11\xd3yv\x17\xe7\xe1k\x8d<\xd9\xcd`\ +q\x83nzQ\x02\xc1Qy\xb4\xfeF\x8cs\xafz\ +\x10\x80\xa2R+o\x070\xee\xb3\x0e\x06\xde\xd8\x8fE\ +\x0d\x935La\x1d\xcbX\xe46\xe9\xe0\x09@\xb8\x03\ +\x10\xe0\x04\x87o\xad\xfb\xdaW\xd6w\xeb{\x1b8\x05\ +\x08\xa7\xbf\xa2\xd4_\xad\xe7\xfa/x\x84\x9f\xad\x030\ +\xb4\x0b\x10'x\x8a\x9b\x7f\xb2\xa9\xfb\x7f\xb3\x85'\xff\ +l\x8b\xcf\xfe\xd5\x16\x9f\xff\x9bM?\xfd;\xe1\xe47\ +k\xbd\xf6\x9d\xd5\xef\xe15 \x9aE\xf3g\x96\x0bw\ +\xc9&\xbb\xd1Ii\x8a\xad\xae\x22Y\xbbq%\x9a<\ +\x11\xb1\xe4\xf7\xda\x94\xa9\xbe\x89j\x9f\xa7\x1a\xbc \xde\ +Bg\x1ahuPk\x0c\xd1\xa9\x9bn\x8d!\xaa\xb6\ +\xf7S\xeao\x8cu\xab\xa2\xc7\xb9\xf9}g\x8dY\xbc\ +\x86 \x81r\xcb:\x926wR\xd3\xb8O\xdc\x8e\xea\ +\xc8\xf8]>\x7f\x1d\xb2\xba\x8b']uqZ3t\ +*\xd3v\xfb\x0b\xb4\xf9T\x00he\xfcZ\xb1`\xb5\ +\xb1\xc5S\x09\x94\xee\xe0,\x8c\xccY0\xd6\x9dJz\ +\x99R\xc7\xe7Pz2\xdc(I\x8a\xaf\x82\xf4\x91\x8a\ +\xbacgH'\xf5\x9a\xa0\x0d&\xae*X\x15\xc1\x18\ +'\xd7\xd2Q;\xaeGPJ\x9b\x0a\x05\xbd\xe9^)\ +Xu\xed\xae\xb8R\xacZ3N(^u\x82^w\ +\xd0\x7f\x88\x88W\x1a\x0f\xe0\x1aE\xa9v\xa0\x83\xfc\xfd\ +BT\x89\xa3\xbf\xe9\xb3\x8e\xf0\x88\xacM\xe0\x9a\xb45\ +\x8b\x1c\xb7i\x10\xf79B\x9a6I\xca\x07\xb2\xe1\x1d\ +\xf9\x13\xa4\x86:?x\xed\x1e1\xfb\x99\xb5\x1d\xbc\xb1\ +\xce\xe3\x0f\xd6}\xf2\x15\x80\xf8\xda:\xaf}c\xed\xd7\ +>Z\xfb\x8d\x1f\xad\xe3\xd6/\xd6M\x98\x18~\xf0W\ +[|\xf5\xaf\xb6\xfe\xee?\xdb\xda\xdb\x7f\xb7\xe5\xd7\xff\ +bSO\xfel\x1d7\xbe\xb5\x9a\x9dWVJ\xea\x94\ +\x07w\xc9\x06\xd0\xfe\x0eU\xc82\x08Xy\x1c9q\ +,\xe9\x96\xfa\xf1hBD{\x03\xe5\xbdR\xb4\x8b\x07\ +\x17\xaf2/uP\xd3\xd15\x1e\x00\xf0\x86\x22\x8f\x93\ +\x84\xc4\x19\xb2\x0b\xb2\xa1\x5c\x1dqCZ\x1c\x99\xba\x0d\ +\x08\xce\xe0N\xb7\xc8>\xae[\xb0\x070\xf4\x1c\xb9x\ +,B\xaac\xdb\xd5\xb5m2^\xe9g\x17c\xdd\x03\ +\xdc{\x00@\x17\xe3\x8fB\x9bb\x83v\x8d|\x02\x00\ +\x17S\xbe\xaa\x1e\xb9\xaa\x0f\xcc`0\xd4G\xc8u\x02\ +\xedSQ\xc4\x0enOK\xaf\xca\x10\xd4N]\xc0\xc0\ ++h\xb5K\xcaw^\x83\xc1\x13\xdb\x96\xf2\xbb\x17x\ +\xd5\xba\xff4\xa9\x0d\xa9\xa3\xbaV5\xc0\x0b\xeaQ\x84\ +\x8a,\x95B*%#3\xd1*\xa0\x8aJ3;f\ +\x89\xa9\xb0k\xfe7S\xc5\xa6\xfd\xa4n\xc3X\xe3\xf8\ +\xb6\x85\xa7\xf7\xac`\xf1\xd0\xaa\xd6\xafY\xdd\xe6u\xab\ +Y?\x86\xe5\xef[\xc1\xb4\xb6\xb5\xcb\x9a\xb1\x8c&\xa5\ +\xa2\xc4\xf6j\xe2=\xd6\xefu\xe1\x82\xf0a\xf9\xca\x8b\ +\x05rw@\x04\x0aw\xc0\x05\xe0\xda\x8e\xe5\x8aI\x09\ +\x8d\xb2Pg\x08\x840-\xee\xb8Jg\x81\x14@\x07\ +\xe1\x07\xd9:\x17\x99\xdc[\x07P\x14\x12\xdfK\x94\xa5\ +\xa8\x00D\x95?\x0b:\x1f\xe9\x85\x15\xce=s\x05\x22\ +\x02IX-\xe6U\xf0\x01\x00\xdc\xa9 (\xdc)\x05\ +\xde\xa0n\x9f*\xd4Hi\xdf@'KX?\x06\x89\ +\xeb\x96E\x0b\x00J\xdb\xdc\xa1\x8f.\x04\x13\xb6\xe55\ +\x94\xde\xc9C\xe0\xee\x93D`\x11\xb5\xd4Q\xdf'\x1d\ +w'\xb2\x97\xaa\xddUR\xbe\xeb1\xa8]U\x07x\ +l\xd5J\xee[\x8c\xeb\x80\x85\xeb\xf7\x94\xafmCr\ +7r\x19X\x06\xee\xc6-\xa2\xc8B $j)\xef\ +C\x99Z\xea\x0cB\x14\xb3q\x89\xe1!-\xb3\xc2z\ +y\xd56(u\x08\xd5\xf1\xe8\xae[6\xdeCLZ\ +e\xe5\xea\xc9\xab\x1e\x81\xb2~\x9d\xdf\x97\x06\x17\xd0Y\ +~\xaeEku\x17\x0f\xaa\x06M\xb0\xf0Zn^=\ +t\x9dh\xb2BG\xa4\xea\xd8\xb7\x01\xdc\x9dz\xf9\x03\ +\x12\xbcEr\x1b\xf7\xd6\xc9\xf7\xf5N[\xe6\xc0\x0c^\ +\x88\x10\xd2?\xc5\x83\xa9t\x9d\xfb\xc7\xb3$\xaa\x13\x99\ +k\xda\xc8\xf7j\xd7\xef'\xa6\xaf)j\xad2\xea\xbe\ +T\xc6\xae\x9dP\xdc\xb7\xac\x1f\xc5\x8b\x95{\x87>\xa8\ +N\x81\x01\xe7s\xe9J\xf5 \x87\xfefR2\xb5\x8b\ +%{\xd2\xb2x6\x80\xd7A\x91\xf9\xe3\xb7\xcd; \ +\xf3\xa5\x95/\xbf\xb5\xf2\x95wV\xb6\xf2\x16\x0e\xf2\xda\ +\x8a\x00A\xc1\x9c\x08\xe0}\xf8\x802\x80\x13\xc0s\xc0\ +8j^@\xa2\x94\xd0\xab\xdd\xd7^\x08\xb5\x81Mj\ +\x5c\xf4t\x22\x97\x8e25Q$\xf2\x97\x06/\x10\xf7\ +J\x15y\xe4\x1e]6\x86\xbe\xdc\x16t\x94\xef:\x97\ +\xf1|\xee\xffd\xc8\x18\xb6\xdc\xbeZ\x00\xf8;\xb6I\ +\x155=\xae\x1215\x98\xde\xb0\x18\xa5\x09Z&\xd4\ +\xd6\xe6x\x5c\x88\xa6\x0c5\xc5\xaaT\xc8\xc5\x1c5+\ +r\x1b+\x18\x04\x18\xa9\x5c\xb4v\xb9\x04q\x85\xda\x1d\ +\xa4I!m|\x10\xc9\xca\xd6\xb61\x11'H\xa3\xda\ +\xc4kyW[\x97t\xf8B\x9av\xe5J\x9aG\xdd\ +t\xb3\x94\x9a\xa4\xd5+\xd5\x18~\x9a\x8e\xee\xc02\xbb\ +\x11Y(\xaf\xea\xdf\xc7\xdf]3\xc72\xbd\x22\xe7\xfb\ +\xe0\xdd\xc9\xa0j1W\xc7w\xd4w\x02bO\x12\xd4\ +\xd0AM'\xf9\x9b>\x13\xcf5\xbc\xef\x04`\x88V\ +\x175g\xe1:\x81\xe9\x189\xac_\x80\xfd\x04Z,\ +^g\xf4\xa7\xe36\xd3\xc9\x93\xd3\xf1\x84\xe9\xa4\xb4\xda\ +\xd1\xe4\x94\x0f#\xcf\x84(\xea\xf8{\x9d\x0f\xac\xd3\xd5\ +sGN\xacH\x85\xa6*\xcb^yi\x95:\x80z\ +\xfd\x9d\x13\x95n\x95\xae\xc8\x13\xe0\x05\xa6\x1f\xc0\x13N\ +\xdd\x92\xb5\xdb\xd6&\x00\xb85\x0b<\x806\xc2\xb4\x12\ +\x06\x9aW\xf1\x84R>\xee_\x06y\x0e\x00q\x00\xdd\ +\xb3\xbc\x91k\xd3\x0f!O\xe15\x99\x9f\x93\xc8\x0c4\ +\xe9\x96HJ\x9b\xe0\x84\xf7\x18\xb0\xba\xbd\xab\xd6@\x8d\ +\xbd\xb5\xe4\x9f\xd1J\x18\xd7>K\x1dx\xd9@\xf8 \ +\x83\x88\x89\xab\x80\x11K\xb4*\x05\x82\xb4@\xa1\xedQ\ +\x1e\x08.\x88\x87@ \xf4\xc9z\xa7\x19\xa8Yn\x5c\ +\xb1z\x09\xd6\xbb\x86\xe5\x0b\x04[\x16\xea\xc7\x0b\xa8\xe6\ +^!\x02\xf7\xefN\xf2f\xd0\xd4^US\xc4\xb2z\ +7[\xa85\x02\x94\xac\xae\x1eq%\xcd\x16[\xdc\x08\ +1k\x22.\xab\xdd\x09\xe4\xacL[\xb2\xb4CW\xfb\ +\xf4\x1b\xbd\x8e\x9aH\x82V\xeb\xf8\xbc\xa6e\xe3\xf4w\ +\x00\xa1\xedY\x97\xb5s\xa7\xbc\xc9\xc9\x95r\xbeO]\ +\xc0\xb4\xc1\xb3R\x80R\xb3\x06\xafa\x83\x00\x90\xa4Y\ +\ +\xb9\x7f\xbeX\xb5{:\xf3G\xe7\xd4k\xb7\xabw\xfa\ +$i\xd1\xb0\xb7]\xdc\x89\xab\xf4\xdd\x01\x04\x1b\x0c\x12\ +\x5cA\x9fo\x9b\x03\x08\x0c`# \xd02.\x00H\ +V\xd3\x22Y2\x00P\xef\xdc+\x05\xea\xa6U\x07\x10\ +\xb4\x1b\xb7\xfe\x5c\xf9\xb5\xe7\x00\xb8P\xbe\x07\x80+\x80\ +\xe32\x00\xb8T\xdc\x8a\xd2\xdb\xce\xa5\xf5\xd3\x1aw\xac\ +z\xf5\xaa\x0d\xec'9\xef!\x04\xe84\x8f\x7f\xd1~\ +FG\xc3\xa6K\x18\xcct\x065\x1d\xc5g\x90+g\ +\x10\x163PH\xba\x04\x10\xb8\xbf\xf1\x99\x0c,Mg\ +\xee\xeb8y\xed\xf9\xcfF\x99\xda\x09\x1c\x1d\xbfa:\ +\xad\xdbm\x03\xd3!\x17d\x06\xd1\x09\xc9\x91;\xeb \ +G\xbd\x95D\x92\xe1H\xfa?\x85\x1b\xed]\x14\xc7\x10\ +\x89S+Z\x85_\xb5\x8e\x91b$\xcaP.\x00\xa0\ +\xc6\x0f\x0a\x03^\x9bZ\xbc\x81\x13\xbc\xb3\x08\xbb\xe6\x03\ +x\x06\x85\x02\xcd\x1e&\xab\x8c_\x93u\x22\xb0J3\ +?q\x05\xfe\xce3+\xe5M\xd0\xca\xa0\xf6>2\x16\ +1\xf1M \x0f\xcb\x8c\xaf\x1f&\xee\xfc.\xf6\xa3|\ +m\x0b\x13\xf1s\x9d\xc3 <\xae\xe9A7)\x906\ +B\xf20a2\x80\x9cQ=$\x83\xc0\x83G\x95\x12\ +\xb9\x87\xc5\x1b\xf4\xc3\x09\xc4\x92U&\xa6\xddA\x9dX\ +\x8d\xbc\x86\x80 O\x00\xd8\x92d\x99\xb8~\x0f\x04u\ +\xe7\x00\xf0\xe4\x12\xca\xbe\x8c\xd2/\xe7\xab\xe7\xae\xac^\ +\x9f!T\xe0\x1d.\x94\xffYI\xbb}V\xaa>\x7f\ +\x9d\xae\xe7\x9f:_\xc6^t\xe9\x02\x14\xde\x0a\xde\xb9\ +\xf0\xb3W\xad\xa3>DjFE\x18`\xe0\x9d\xa0\xe8\ +4\xd8\xb6\x13\x5c\xaf\x13\xde\xa7\xe2&S\x01C*\x03\ +\x9dJH\x10`Dl\xb5mNg-eiZ\x18\ +\x00\xb8\xdd;\xc3\x9a\xf5;\xc4\xc2\xb5X\x06)\xd6\xe4\ +\x91z#\xa8.QS\xc5\x9aO\xd0\xc4\x1a\x99\x94\xc6\ +Ss,\x8a\xe7\xca\xb6t\x91\x14P\xd5O^\xda\xa4\ +\xc1\x04\xf4\xbc&Wz\x92REv\x02\x00RP~\ +\x0a\x03,Qc*\x15r\xa8TMi\xb1fF\xd5\ +\xb4!K\x0a\x1f\xf5\xb6o\x85\xb5\xb1\xa6o\x1f\xc0\xef\ +`$(\x9c\x8cB%n:B\xc7\x1d\xdf\x8eBd\ +\xf5N\x5cvD\x86\xe1@ \xc5\xe8Tt\x8c\x10\xe3\ +\x8b\x93`\xe9\xf1b\xf6\x80\xd3\xb5tq\xa9 @\xf8\ +\xa4|\xadJ\x02\x00\xdd\x97&\x81\x00\x808D\x8a\x8a\ +N\x00\x81\x97\xbaJ\x88\xf9\x9aY\x04\xb8:e=\xb1\ +^M!&P>\xafx\xf6\x04\xf8YL\x22\x16\xae\ +9g\x89;\x18\x8a\x9bR\x1f\x1b1b\xb9*-r\ +H\xf1nkr?\xb1]\xee]\x9d+\xc9\xfde\xed\ +\xd1\xf1C\xa7x\x1d\xc7\x1e\x1e\xe5oC\x9b|F[\ +\xc4E\x0eQ\xf8\xe0U\xcb'M,\xe4oE#\xbc\ +\x0eoZ~\xff\x8aE\xbaf-K={\xea\xff\x01\ +\x02\xf1\x01)\xfd3b\xfeg\xe7\x00\xb8\x5c\x80\xe5K\ +\xf9X\xb1\xd7\xe0P-\xd5\xa4\xf4.\x94\xdf\x83\xf4\xda\ +%\xd5\xbb92\xab\xd8I*\xa4\x936\xca\x08m\xfc\ +\xdd\xe5\xfdj.\xa9\x89\x1f\x95[\xa9\x0b\x89\xa6~\xf9\ +\x9c\xbah]\x9c\xe2\x9d\xc8\xff\xa8\x05]R\x85\x06\x19\ +\x17\xcb\xa0{5z\xe7B\xecu$Li\xad\xa6\x89\ +\xb1n\xb7\x19EE\xa9\xc3\xc8\xc01\x1e\xef\x00\xe5\xc3\ +\xec;\xb6\xe0H\xe4\xf7\xa4Z\xee\x087\xf7\xba\xe1D\ +\xe7*\xb9\xc3\xb34\xa7\x02Q\x96\x91\xc9\xd8\xd4\xb0\xdb\ +\xedADI\xf1R\x94\xe2\xb5\xc2\x03\xfc\xc0u\xf6r\ +`\xe0\x9ep\xff\xc9\x10\xf4d\xcd^\xf2;\x15\x97\xb8\ +\x0ej\x02\x81\xd6\x06H\xe9U\x83\xa8\xdfy'\x9f\xab\ +\xef\x82\xdc\xbe\xc2\xc79\xa8\xf8\xfeD\xae\x97\x00\xf8b\ +R\x94N\xb8x\xa1\x19/M\xf5\xe2\xa6:u\xd0\x13\ +\xae^q\x0e\xe5\x8b\xdd\xab#\xc8\xc5\x89\x1f\x91\x91=\ +\x8b\x8e\x1dX\x1e\xca\xcfG\xf9y\x13\x00at\x97\xbf\ +\x83|\x95$\xf5\x00\x9enx\x02\xee_^@\x07'\ +\x16\x8d\xefY\xe9\xc4\xbek\x10\xa53\x04s\xfb\x97,\ +\xd49c\x01\xd2\xc2Truu\x09\x8b\x13\xa9\xc3\xda\ +/\xa9k&\x22\xe5_QGP\xe7\xc2\xd5C\x08\x92\ +\xaa\x82F\x14v\x05\xe5]\xc6b/c\xc1W\xb0\xd8\ +8\xd7\xff\x86\x87u\x82\x9b\x13\xcbE\x89\xde\xa2\x88\x1a\ +/j&P+\x7f\x84:\xf7\x9e\xf8\x8a\x88l\x094\ +\xf1\x02\x8dZ\xb2\xa9S\x09 P\xa3F\xb7\x98\x82\xeb\ +U\xd7N\xa5Ub\xda:\x90!\xbd\x97g\x1c\x14\x00\ +\xb4R\xeaUQ\x87\x01@X{\xf2\xfb\x04\x84#\x04\ +P\xf4\xdd\xe0w\xa7\xde\xb4\xf0\xe0)!\xe2\x16\xef\xaf\ +a\x18\x87\x84Q\xaf\xc3\xba\x1ap\xc9\xe0\xd4=L\x8b\ +3\xee\xf8{\xbdb\xb9Z\x14rk\x03\xfcN^\x22\ +I\xf7\x80\xfbV\x88Vog)W\xe0p\xab{Z\ +\x0f\xa8U\x95\xb0\xb7&\xe0X\xbe\xd2z\xc7+Tz\ +\xa6\xb5\x01=\x0f\xbf\xe7\xef^\x97\x10\x01@\xeeB\x84\ +D\xcaG\xe9\xda>\xadrj5!\xc8F\xd4\xe0I\ +;{\xc3\xb8\xf1\xb0&~\x90\x88\xce\xf0\x19\xd9\xb1<\ +u\x07A\xf2\xb0\xee\xa8&\x83\xf8\x8c\x0eTRg\x11\ +\xd7V\x8e\x98'\xa2\x98;\xec\xed\x15,\x99:B\x0e\ +\xadhB{\xdb\xd7I\xa3\x16\x5c\x09\x99N\xe2\xd0$\ +\x86,\xf6JI\x97])\xd6\x5c=RDL/\x16\ +0\xe4\xd6{\x9c\x82\xdcC\x80\xe48\x1e\x22\x0e\xeb\x88\ +#\x97\x8d\xaf\x9f\xe7\x814\xa1\xb5\xf8;Y` \xf9\ +\xbd\xe6\xd3yPgI\xce\x9aD\xbap\x7f\xb8t\x0d\ +F\x1c\x00\x89\x05\x10q(]\xe2V\xcf\xf43\xa0Q\ +-]\x1c\x96\x13\xcf`ky;\x19\x22\x9c\x06\x01\xce\ +\xe0\x99\x02Z\x0a\x86\xffD \x80Q\xedNV_\xe5\ +q\xed\xf5\xd3\xa6\x8d\x07\x18\x86\x96\x9e\x9f[\xc9\xec\x1b\ ++\x9b\x7fg\xe5\x0bo\xadl\xe15\xe9\xa2\xa6\x88\xef\ +Y\xee\xd8-\xc6\xf1\x84\x90\xaa\x89 -\x09{L\xdd\ +\xad\x0a^\x00\x00\x8f,q\xcc^i\x1daZi\x9e\ +\xab \x92\xf25m\x8f\xd2=\xe5{\xab\x81z\x9f\xa4\ +T\xb2j\x1c\xa5C,\xdd\xb3\x09\x04\xe7\x00\xc0P\xe2\ +\xf5\xec\x8cA<\xff\x1b\xe3\x8e\x82\xc3\x0d\xb9\xa5`\x94\ +\xa7]8Y(22\xb8iQ$\xd7\x89\xe2\xf8\x06\ +\xf1\x5c1\xfd\xaas\xeb\xb9r\xe5#[\xc8\xb6\xb3\xf0\ +\x5c\x00\xa0]\xc0jx\xa4\xb0\xa1\x87rm\xe5\xf0 \ +\x11\x88Q\xde\xe8\xa1\x15\xc0\x88\x0b\xe51\x00MD\xfb\ +\x00\xd5L\x02b\x98\xaa\xbcU\xae\x09\x85\xe8\x06]\x83\ +Du\xca,\x1f\x81\xb8q\xd3\x92\x0a\xdec\xd9j\xa8\ +\x98\x88b\x13\x9b\x97\xce\x17NV\x19$O\x92Z\xd6\ +\xf9\xf9*\xb2aIm\x88\xa6T\x11\x1d\xf9\x9e\xcc\xef\ +5\xc3\x96\xc2g\x92\x9b\xf8l\xe3\x12\xa0\xd0\xfa\xc7,\ +\x03\xa14\x0c\x8b\xd0\xc0\x9d\xaf\xa1{ \x1b\xb5X\x94\ +\x1f'\xf2\x84B\x925C\xa8\x850m3\x1fF\xf9\ +0\xff\xfc\x99{V2\xff\xc4\xca\x17\xc9\xf9\x97\xdfX\ +\xe5\xca;\xd3\xf1\xf9\xb5\x1b_[\xc3\xf6\xf7\xd6\xbc\xfb\ +\xb3\xb5\xec\xfdb-\xbc6\xf2s\xed\xd5\xaf\xacrU\ +{\x04\x9f\x93\x1e>p\xdb\xd4\xc5\x1f2\xbb\xb6\xe0\x06\ +xb\xe5\xea<\x9f\xeb<&\xe5\xb7\xf1\x9e1Jn\ +;_\x16\xc6\x0biB\xc8\xb9~\xac_n_\x93:\ +i\xea\xaer.)\xf5\xaa\x09\x98=\x7f\x1em\xec\x95\ +7\xd0l\xa1\xc2\x08\x1e\x12\xe5{\x02\x00\xd2\x1d\xd9\x83\ +\xe9\xc3\xd2}\xbd\xcb\x969\xb0\x86\x8b\xd7\xf6.\xdc6\ +\x96Z\xac\xd7Q,\x1e\xa5\x87\xfbp\xe9\xbd\xc4\xef\xbe\ +\x15\x00\xb1fy(1\x0f H\xa2\x10\xbf\x08\x8c7\ +\x1b\x00x$\x88\x94\xa7[\x80 l\x0c\x1cX\x8ev\ +\x09+c\x807D\xf0\x08Y}\xea\xc6\xa19j\x11\ +\x17\x11\x18\x89&+\x18\xe4\xa65O\x1aW-\xad\x1e\ +\x16[G\x1aS\x8f4.3\x08kN\xa1Z4Q\ +\xbb\xd6\x0bI&\xee\xa6t\xee {\x96\xda\xb5oi\ +\xddG\x96\xd6s\xfcI\xd2\xf99\xbd\xeb\x10\xa0\x1f\xe0\ +\xed\xf8\x8c\xce\xd4k\xd39\x00\x1b\x1e0TE\x030\ +t\x0fI\x0ch\x22\x03\x1b\x8f\xc7\x88\x97\x07\xd1D\x0d\ +1=]S\xb6jJ1r\xcbr&\xeeX\xc1\xec\ +C+[zaU\xeb\xef\xacn\xebKk\xdc\xfd\xd6\ +Z\x0e\x7f\xb0\xee\xeb\xbf\xda\xd0\xed\x7f\xb2\xb1\xfb\x7f\xb7\ +\xa9\x87\xff\x86\xfc\xbb\x8d\xdc\xfd\x17\xeb\xbb\xf57\xeb8\ +\xf9\xa3\xb5\x1c\xfch\xf5;\xdf\xb8\xad\xddej\xbe\xad\ +\xbe\xcb#\xd7\xf1\xba\xbb\x8e#\x880:n\xc0\xd8H\ +\xf9)\xed\xc4\xf4V\xa4E\xf3\xfa3.\x1bI\xd3L\ +%c\xe6\xc3\x10\xfc\xad\x8c%<\xc3\x9b\xe2\xdd\x01H\ +\x9bn\xfc\xf4,\xee\xd0\x0b\x9eC\xab\x81nE\xd0\x89\ +W\x15\xa4mc1iX_\x9a\x9a)\xb5M38\ +\xb3\xa47j\xf4\xb0\x82\xcb\xde ^o\x13\xb7\xb7\xad\ +x\x0c\x00@\xecB=K\xae\xe1S\xa8\x9b\xcf`\xbd\ +\xd1\x01\x800\xb8\x86\xac[\x0e\x9eA\xed_\xdc\xe9\x97\ +d\x0cY=R\xfe\x9e\x8bw\xe1AR$\xeduW\ +\xca\xa4\xfd\x80\x10\xc9\x00\xdeF\x0bEnZ\xd3mS\ +\xd2\xea!\xee\xb0\xe7\x08ph\xe3\xa4:Z =\xd7\ +\x01\xca1!E\xfb\xd9\x0f\x9c\x12\xd2\xba\xd5\xa6u\xd7\ +\xbd\xa6u\xeb\xe7}~F\xb1\xdd(\xba\xf7\x1a.\xfa\ +\xa6\xf9\x07\xce,s\xe8\xaee\x0e\xdf\xe3\x15\x19\xbc\xeb\ +~\xe7\xeb\xbf\x89\x05_G\xae\xc1\xe4\xbd\xf63\xea\x98\ +\xe1\xda\xa7\x00\x12_\xc7>\x83\x0f8\xf0\x22)\x02\x9a\ +S\xfc\x9e\xfbl\xf6\xd0mr|\x9d\x9f\xf0\xd4\x8a\x17\ +\x9e[\xc5\xca+\xab\xd9xg\x0d;_\xa0\xd4o\xac\ +\xfd\xe4{\x1b8\xfb\x83\xcd>\xf9\x9bm\xbe\xff?\xed\ +\xe0\xeb\xffa\xc7\x1f\xff\x1f^\xff\x1f[{\xf7?m\ +\xea\xe9\x7f\xb3\xa1{\xffj\xbdg\x00\xe1\xc6o\xd6t\ +\xf8\xbd\xd5l~ne\xcb\xcfM\xcd1\x9c'pe\ +b\x22\x87b\xf3(\xae\x05KGt\xa6\xb3\xeb*\x06\ +I\x0f\x02\x90l2\x8b0\x86\x16\xc5\x1b\xe5\xf2\x7f\xd1\ +!\xd5D\xaa\xf4\x8c1\xeb;a\xcc~_\x17\xb8t\ +n`\xca\x16P<\x04S\xe2J\xc2RT\x0e\xed\x8a\ +\x0f\x87\xb9\xc8\x08\x17\x9f\x80\xf4\xcdY\xc1\xc8*\x8a\xdf\ +p\xca/\x1c\xd9\xb4\x1cu\xfc\xc0Kdv\xcc\xb9\xb2\ +\xf1\xac\xce9\xcb\x06\x08\x02E\x08\xcf\x11\xc2;dk\ +[\x18\x8a\x15w\xc8\xee\x917\x808\x92\x1a\x85\x05\x82\ +\x01\xd2$\ +\x22\xad|Bz\xf9\x84\xf8\xfa\x98l\xe3\x01)\x17\xca\ +\x84H\xf9PXz\xdf\xa1\xa5\xf5\xa2\xf8\x9e=\x14\xce\ +\x83\xaa\xb8\xa2\x1f\x05\x0e\xde\xb2\xac\xe1;\x16\x1a{`\ +\xe1\x89'\x963\xf9\x1cy\x81\xab~\xce\xef\x9eX\xd6\ +\xc8\x03\xc0p\x87\xf8-p\xa8y\xc4]~\x7f\xdf\x22\ +c\x0f\xb9\xc6C\xc0y\x8f\xdc\xfe\xcc\xd4>\xc5\xdf\xcb\ +w\xc2\xea%\xb2z\x1dI\xaf\x13\xc9uRJ\xe1\xf4\ +c\xcf\xedc\xbd\xd5k/\xacn\xe35\xee\xfd\xad\xb5\ +\xec\x7fn\xfd7?\xda\xf2\xf3?\xd9\xb5o\xfe\xb3\xdd\ +\xfb\xe5\x7f\xda\xa3\xdf\xfe\x7fv\xe7\x97\xff\xaf\xed~\xf5\ +\xbfl\xf6\xe5\x7f\xb5\x91G\xfff\xfdx\x86\xae\xdb\x7f\ +\xb1\xd6\xeb\xbfX\xdd\xeeWV\xbe\xfa\x92Pr\x97\xf4\ +Y\x00P\xb6\x80g\xd4^I\xc5\xfb\x06H\xb2\x0aC\ +q\xfd>\xb8@\x10p\x14\x10R\xab&\xaf[\xed\xec\ +M\xab_<\xb3\xfaem\x16\xb9m\x05\xae3\x99\xb8\ +\x05 \xe8\xd7\xeenU\x1c\xe9\xccGyOo\xceA\ +\xbd\x1eD \xd5\x85]\xfb/c\xbcs\xf14E\xda\ +\xcd/\xbd\xcd\x1b\xd9]S\x967\xb8\x04[_\xc7\xfd\ +oZ\x01\xec>\x82r\x03\xed\x0b\xa6\xa3N} \xd3\ +\xdf\x0a\x83\xd7\x9a\x80\x96Fubx\xd7\xa2i[\x98\ +j\xed\xb4\xd9SS\xc1\xd9 4D^\x1c\xc6\x13\x84\ +\x05\x04\xe5\xc9\xbc\xcf\xe2w\x0a\x0f\xfe.\xc4mNU\ +C\x04\x94?\xae-\xd0\xb8D\x9dJ\xb2\xfc\x1e\xf9\x9c\ +\xf7\x9f[\xde\xdc[\xcb\x99za\xd9X\x9f\x94\x97\xce\ +\xc3\xa5\xe2.S\xb1\x964\xbeG;\x85\xb5\x9f>{\ +D\xdb\xb2\x89\xabSO\x19\xd0W\x96\x0f\x01\xcb\x9fy\ +c\xd1\xa9W\x00\xe2\x99e\x8f=\xb2\xe0\xe8}\xe4.\ +\xdf\xa5\x06\x12j'\x83\xf5\xcd\xea\xb3/\xf9\xbfgX\ +\xf8#R\xbb\xbb\x00\x0e0aQjH\x91\xcdkh\ +\xf8&\x008%\xfb\x81\xec\xe1\xfe\xd5\xd2F\xf3\xffe\ +\x0b\xf7\xbc\xcd-\xab\x0f\xadv\xfd\x91u\x1e\xbc\xb2\xb9\ +\xfb\xdf\xd8\xe1\xfb?\xd9\xe9\xc7\x7f\xb1{?\xfd7\xbb\ +\xfd\xe3\x7f\xb7\xdd/\xff\x8b\xcd\xbe\xf8W\x1b{\xfcw\ +\x1bz\xf87\x00\xf0'k\xbe\xfe\x93\xd5\xee}ie\ +k\xdc\xc3\xccmWk\x18\xe8\xc63j\x8e\x00\xcf\xac\ +\xfe\xc5\xaaYL\xab\x1buk\x11\x99\xad\x8b\x16\xc1\xbb\ +V\xa0\xfc\x8e\xf5\x07\xd6\xbd\xf5\xd0zv\x1eZ\xf7\xee\ +CkX\xbd\x0d\xe9\xbc\x06@\xd5R\x06\xc0\xaa\xbf\x03\ +^X\xfd\x91\xdcz\x01)\xa1\xb2\x19\xafHD\xa5\xfa\ +\xfd\xe8\xbc\xcfb\xb4\x1a\xe7\x8eM+\xef0\xf5\xecM\ +\xab\x1b\xb4`\xeb\xa4Eq\xf1\x05\xc4\xfd\x02b{\x1e\ +9oX\x04\x91\xb8\xe4\xe6\xcd\x9b\xd4\xf1s\x06 \x00\ +\x06\x15Nj\xaa\x17\xb2r!\x81vZyEb4e\xaaY3\xf5\xdf\xf7\ +\xf6\x07\x8eZ\x00\xc5\x86\xb1\xe2(\xa4.wp\x97\xf8\ +N\x8e\xaf\xc9 \x15\x83\xb4\xaf\x00\x84e'R\xb2$\ +\xa05u5y\x80\xb4\xf8\xb4\xc2F\x9c\xf2\x93^f\ +\x92\xda\x04A\xa0\xe2U\x08\xf6\x1cBY!\xc0\x10\xc2\ +u\xabN^9\xb1*du<]t\xea\xb1\xe5\xa3\ +\x8c\xe2\xd5w\x0c\xcaWV\xb3\xff\x9d\xd5\x1f\xff\x8c\xfc\ +j5\x07?\x03\x88\xef\x00\xc1\x07\xcb\xc1Cd\xa1h\ +?nY\x0d\x0eTD\xa1FP\xb2T\x1db%\x17\ +\xed\xf5\xe6y\xeeZ\xb4\x14L?\xb3<\x94\xaa\xb2\xac\ +\xf0\xe8\x1d\xbc\xc4\xa9\x93\xd0\xe8\x99+\xe3\xca\x9b\xd2\xe7\ +\xb96\xd7\xcfS\xd9\xd6\xd8]\x94\x8d\x1b\x1d\xe2\xfb\xe0\ +.9\x83\x87\x08$V2\x84\x0c\x8b\xd0\x1e\x02\x06~\ +\xcfk\x0eV\x9b3\xb4O\x06\xb4\x03\x09\xde\xb4B\xb2\ +\xa1\xfa\xd9#\xeb]\xbfe#\xbb\xf7l\xea\xf8\xa9\xcd\ +\x9f\xbe\xb5\xa9\xd3\xcf\xdd\x99\xc7=7\xbe\xb4\xce\x1b_\ +Y\xdd\xde;\x80\xfe\xcc\x0a\xf0 \x11,:\xc88{\ +\x0aSY\x9e7g\x7fQ\x09\xa4\x92\xf3,\x5c\x7f\x8e\ +\xf6\x08\x8e\x01\xb2\xa5\xfb(\xfe\x09 \xb8kmk\xc7\ +\xd6\xb4\xb4c\xa5c\xf2\xbe:\xebh\x12\x12I|o\ +\xc1\xddkvWS\xbex\x91X\xd2\xec+(\xff\xb2\ +\xa6\xcdK\xdb\x916\xa4\xd5b\xdcVb7\x0b\xa6\x8b\ +\x8d\xc3,\xb5\xda\xa5m\xde\xdb\x10\x0b\xf5\xf7\xc1\xad\x90\ +\xaf\xe6\xf0>\xacF\xd1}Z\xe8!\xbe+\xc6#\x22\ +|\xdaQ\xac\x93\xc2u\x5c\xbc\xda\x95f\x00\x00\x1fi\ +\x8c\xbfy\x110\x01\x12\xd2\x9b`\x1b\x1c\xa2}\x1d\xee\ +\x00B\x01\x81<\x80\xce\xc7W\x85\x8c\x00\x903\xa5\xbe\ +>x\x80\xe5\xd7V\xb6\xf1\xc1\xaa\xf7\xbe\xb1\x86\x93\x1f\ +\xac\xf1\xba@\xf03?\x7fo\xa5\xa4P\xf9\x0bo\x88\ +\xebOP \xf1zH\xe5U\xb8h\x80\x14Baa\ +b_\x0e\xdf\x17E\xb9\x12)2\xcc\xef\xdd\x89\xe5\x00\ +N\xdb\xdf\x83d%j\xce\x90\xa5p\xe4\x08\xea\x89S\ +v\x0e.^$J\xc7\xde8\xce\xd2\xb7G\xd8#|\ +\xe1F\xc3<\xa3\x96~\x95\xe1h^?[\x13cX\ +bXmb\xfa\x0f\xf0j<\x0b\xe1,\x0b>\x13j\ +_\xb3|\xdcx\x19VXIz\x5c;y`m\xcb\ +7\xadu\xed\x8e5\xae\xdf\xb3\x86\x8d\x87p\x06\x1d\xbf\ +\x03\xd7\x99VS\x8ec\x94\x0f\xc9\xe4\xfb\xd5\xd7\xd0M\ +\xdf*^\x9f3wu\x15\xd7\xb6r\xf1\xa9(\xba(\ +\x9c\xd3\xfeC\xb7C\x18\xb9\xa2\xb9\x16'\xdd\x16\ +\x8b\xc4x\x95\xa5b\x87\xc4\x9d\xe6U\xd2\x10\xcd\xf9\x13\ +\xafq{\xb9c\xa7\xae\x9dI\xde\xf8\xa9s}9Z\ +\xf0\x18\xe4ox\x04\xad\xf8\xa9\xc5K\xb6\xa6\x88\x19 \ +\xcd\x1c\xba\xe9M\x1e\xc2\x87\xe5\xfb`\xf6~r\xf4L\ +HH\xb0\xc3k_\x9aE\xba\xa6\x13\xc54_\xaec\ +\xe6B\x1al\x07\x80;X\x81\x5c2\x96\xb8\xf8\xc2J\ +\xd6\xdfZ\xe5\xee\x17(\xfe#\x00\xf8\xd1\x1a\xaf\xfdd\ +u\xa4W\x95\xdb\x1f\xadd\xf5K+\x5cx\x87\xbb~\ +\x89\xc5B\x14\xc7\x94B\x9dy\x8a\xee\x97\xa2Q2\x1e\ +&S\xfc\x82\xeb\xfa\x00\x9e\xb7\x1d\x0bbE\xc6!\xd1\ +|\xbc\xee\xd3\x8f\xb2\xbc\xe3\xee\x95\xba\xa2\xc0s\xc9\x86\ +[8o\xc5\xefC\xdcw\xf6\xb9d\xf1{\xcd\xe0e\ +\x13_\xdd*\xe0\xd8M\xcbgl\x0a\xc6\xce \xcd7\ +\x09\x95x\x0cy7=\xaf@\x8f\x01dq\xad\x02<\ +C\xe9\xd8\xbe\x95M\x1d[\xf9\xec\x0d\xb7'Rk(\ +Yx\x0e\xb5\xb6\xf1\x03,\xd5#\xaa\x0c\xed\xf7g3\ +\xebg\x1f\xd7\xcd\x04\xb0*\x22\x89\x8e\x9fY\xfe\xe4\x1d\ +\xc2\x8e\x1aB\x12~F\xf7\x08\xd5\x10\xf0\xf6)\xf3\xab\ +\xd95!\x5c\x07g\x5clp\x89G\xf1\x09*}?\ +_]\xd4\x8c\xa8&\xbe\xe2\xabF\xdd$X|\xf58\ +i 9dz\xfb\x06\xeeG\x95\xbd\x07\x16\xc4\xb5\x86\ +\xd4\xb4Q\xb3Z\xd3\xeao\x83\x90\xa7\xe6\x81<\xb5\x88\ +\x8f\x0c\x03\x00M\x0bk\xb5K\x0b\x22\xbd\x9a\xf0\xb9\xf0\ +\x00\x02\x80D\xef\x19Xr\xf3\xac\xae]\x14\x8e\xb2q\ +\xd3!Y\x8a,\xaf\x8fl@Y\x01 \xd3I\x98\x11\ +\x1d'\x0f\xb1\xcaQ\xf7\x8b\x99\xfb\xb8\xc5GV\xa2\xa2\ +\x0a\x98u\xed\xc1\x97V\x7f\xf4-\xf1\xf2{\xab\xdd\xfd\ +\xc1\xaa\xb7~\xb0\xaa\xab\xdfY\xd5\xda7V\xb5\x02W\ +\xc0#\x94(\x96\x03\xa2( \xd05\x82(O\x1bJ\ +}*\x84\xc4\x82TC\xef\x8e\x9e\x11\x03Vl\xe5\xd5\ +m\x8f\x82\x15\xa7\xab\x00D\xde\x0a\x90\x04\xb8\x7f\x85\xb9\ +,@!\x85\x87\x00\xac6vfK\xbaP<\xcau\ +^\x83\xfb\x8e\xc2\xb6\xf3\xa6t\x14\xfd\x03+\x9d{\x84\ +R\x91\x99\x07V\xacf\x0ej\xea\xa0\xb0\x841\x05Z\ +\xe1A\xe4\xf69x\xcd(\x9eC!5\x8a\xe2u\xfc\ +\xbc\xca\xd0\xd4\xbcR\x85\xa7Z\xbau\xc5\xa1j\xdd\xe2\ +j\x04w\xd1\x87\x00BZ\xcc\xf7\xa9uO\xf4\xd3\x89\ +\xa1\xea\x12\xa2if\x9e\x15^\xe0\x87\xe4i\xc9:\x19\ +\xe5&Vj\xba[\xa2\x121-x\x0d\xbb\x95C\xd7\ +oA\x93m\x9a&\xc6\xbbx\x15\xe0\x0b\x16\x93\xc1\x85\ +|*\x14\x84\x90\xb9\x1e\xbc(?4\xa6C\x09E\xca\ +\xb0\xc89d\xf6!\x17Vy\xb3\xdc\xacn^^\x02\ +>\xa0\xee\x1b\x9dX\x92\x8a*qS>\x1eB\x13\x19\ +\x99\xce\xd2\x15\xe7\x09\x1b\x903\xb9\xd6\x1c\xb9gD\x84\ +*\x0c\x9a=\x11\x07\xe0A\x5cw2\x91A\x84\xf7\xaa\ +\xb2\xd5\xe1T\xc5\xcb\x8f\xacb\xe3\xa5\xd5\xec~\xb0\xfa\ +\xfd\x8f\xd6p\xf0\x935\x1e\xfcjM\x07\x7f\xb0\xe6\xfd\ +_\xacy\x17\xef\x00Y\xac]\x837\xcc\x93\x9bc\x1d\ +\xea\x95\x1b\xc1}\x87 \x9fA\x94\xea\x17aE\xe1\xa9\ +\xc4T\xad\xa2\xb9\x83\x15T3\xc7{W\x17H\xbc\xcd\ +`\x00\x03\x84/\x852\x85\xb5\x10\xb9\xb52\x96\x08\xf7\ +\x1f\xd1\xe6\x0e\xed4&\xb7\x0e\xcb8D6\xa5`\xac\ +_\xcd!\x0b\xb9\xcf\xd2\x85\x07\xae\xe1d\xd5\xca\x132\ +\x02\xd2\xc3y\x5c\xbc\xa6{\x19\xcb\xec\xdec\xc6\x83\xf1\ +=\xaf\xc3S\xbb6\xe7\x99\x5c\x0a\x8c\xcb\xe7\x1e]\xc1\ +\x86f\x01\x05\x00\x8cF\xfd|\x95~\xfaU<\xaa\xbe\ +\x81\x18\x89k\x14\x05\x00\xa2\x02\x80\x80\xa0\xfe\x82xh\ +\xe5\xffa\x0c*\xc8\xff\xa9\xdcK\x07k\xa8G\x90&\ +yRk\x09!\xb5d\x13Hr\x1d\x06\x80\xb7O\xaa\ +\x9f5\xd5\x81z\xc7\xd0\xaf\xea\xf8\xf8C\xf3\xf3\xa0j\ +\x17\x17DQ\xd9\xa3\x10$\xac\xc9\x03\xc0\x13R0\x04\ +\x00\xe4\xaa\x9cI\xad\xcc5\x89\xa3\xd50m\xc7\x86\xf0\ +\xb9\xeeYn\x05Qnu\xcd)_\xf1=\xc2@\xe5\ +\xe2\xde\xf3\xf9\xae\xfc\xc9{^c#\x90\xab\xa6\x88j\ +\x94\xa4\xd2(\x1dT\x1d\xd6r\xaa\x13\x06\x17Q\xbbt\ +\xcd\xaf\xe7N\x9d\xc2\xce\xef\xbb\x06S\xd5[o\x01\xc0\ +\xd7\xd6D\x18h9\xfe\xc5\xda\xae\xfd\xc1\xdaO~\xb1\ +\xf6\xa3\x1f\xadu\xff\x1bk\xdc|o5+\xcf\xac|\ +\x0e\x8b\x04\xa4y\x90\xb5(\xa1)BX\x0aAP\x83\ +d*\x01W\x9a\x86\xe5\xbbM\xab\x12\xf2`\x94\xaf\xc9\ +\x15q\x17-|\xa9\x0f\xaf\xb8\x8ebm..=\x17\ +\xb2(\x89\xc25\xd4s/\xa2T\x15#\x11o\x08\x13\ +\x0eU\xe1\xa3\xa5\xf0\xa2\xf9[V\xb1z\xdfj6\x9e\ +X\xfd\xf6K\xab\xe3~\xab\xd7\xc9f\xdc6\xf7G\x80\ +\x1e\xf2\xd9\xa7.^\x8c\xb3\xfa!\xbb\x1a@\x00\xc0\x98\ +\xb9\xf2n\x09\x5c\xe9\x1f=\x824\xf1t\xe0\xda\xc5\xa9\ +e|\xa6v\xfcb(\xd9j0%O\x80\xf2\xd5\x9f\ +\xb0\x10oY\x04 \x0a\x09\x9f\xb9\x10`\xb5\x83\xcd\xec\ +:\xc4\x10w\xe0a\x80\xac\x89\xf0\xd7\xb8\x82\x97#\xf4\ +\xa1t\xb7\xff\xb0\x19\x80\x9c\x83-\x15o\x13\xe3\x07\xa1\ +\x01\x10\xae\x06\x85\xbf\xef\x16\xa6\xc6D\xd1iX1!\ + \x8a\xabS?[m\x8f\x0a\xf4\x90^\xc0\xf8\xbd\x1e\ +\xc2\x9a\x9aT\xcd\xf9\x02qU\xde@\xb3\x80\x22G\xc4\ ++)\x1f\x96]\xc8\x0d\x16\xcd>\x22%{\xec\xda\xa8\ +\x16p\xd3r\x9d\xea~)@\x85G\x09\x05\xa3\x84\x87\ +QB\x0b\xccZ-\xde\xa2\x137`\xef:{@]\ +\xc6\x1e[5^\xa0~\xf7=\xd6\xff\x855\x1f~m\ +-G_[3\xef\x9bv\xdfY\xc3\xd6K<\x00\xd6\ +\x07\xa9*\x9b%\x1d\x9b<\xb6\x02\xbe+oh\xc7r\ +\xf1TQ\xd2\xa1\x88Z\xd5j+\xf8\xf9I\xe6:\x8b\ +/\xbd]\xa2z\x87\x157\xf9\x92\x8d\xf2#R>\xc0\ +\xcc\xbdX\xdcQ\x96\x00A\xcd\xd5\xe4\xd4\x08F\x01\x10\ +\xb4\x0bY\x00wK\xe4|\xb7\xba\xa3G'w!u\ +\xd7\xadr\xe3\x1e\xec\xfe\x855\x1e~\x0e`\xbft\x8d\ +\x1cK\x97IE\xd5\xc0Q\x13ZC\xa4\x97\x03\xe7^\ +A-lTz\xee\xaau\xe6=q\x0bsZ\x95\xbd\ +\xeaJ\xd4\xb5\xc7\xc2\x8f7\x0b\xe0\xea\xd51\x5c\x8d\xa3\ +U\x7f\xa0\xc3\xba\x0aT\x83\xb8\x84\xb7YQ\x152a\ +p\xde\xe3D\xe1\xa1{\xdc\xd7-\x80\xc05:\x0e \ +\xf4\xf0!\xb5\x8dk\x13\x1f\x02`\x18\xa9\xe3\x1ax\xa1\ +4\x80\x18\xa3\xce\xdc\xea\xc5\xaf\xa6\x0ajJ\xa4n\x95\ +j\xb6\xac\xadN\x8a\xcb\x12u\xab\xcc\x06\xf1\x99X\x95\ +V\xf9>mi\x96(\xfe\x80d\x95SkbG\xe5\ +\xce\xae\x7f/\x00\xc8\xe5\x7f\x0b\xa6\xef\xe3&q\x89\xf3\ +\x8f\xadx\x01\x99\x7f\xc8\xcf\x0c\xec\xa4\xb6L\x1d\x02\xaa\ +\x1dR8\xed\xba\xb9\x0a)\x22\xee\x8e\x90N\x01\x88\xbc\ +\x89\x13\xc0s\x93\x07;3\xf5\xf5\xab\xbe\xfa\xd8j6\ +\xd5\xdc\xf1)\x16\xf6\xc4j\xd6\xef\xe3r\xf9\xdb\xe2u\ +\xe2\xef\xb1\x95L\x1f\xa0|\xb5RQ3jdt\xd7\ +\xf2G\xbcfV\xf9\xc3;\xae\x99\x85\xd6+\xc2\x5c+\ +\xab_\x0d\xa3\xe1-X\xbd\x0a]\xdc9H\x03\x80O\ +\xd9\xce(\x04M\xaeUm\xd8\xf0^\xb9\x84\xc3\xe8\xa8\ +Z\xb2\xe1\x01\xc88\xc4e\x82\x90C1sm\x8f\xf7\ +w\x91\x9f\x0f\xadX\xde\xcc\xae\x95\xae\xdc\xb0\xea\x9d\xc7\ +\xd6x\xf4\xce\x9a\x8e\xbe\xb2\x06\xbcV\xed\xf6Wx\x83\ +/Q\xd2;+\x99{\x89\xc5\x12R\xe5a\xb1j\x11\ +JM\xfbj\xeb\x5c2\xa9\x9e*v\xdc\x16\xeeFm\ +\xfeP\xfd\xbf\xc0\xcau\xba \xab\xdc\xab:\x8e\x85\xe4\ +\xdd\xc6\xafaH\xb7\x01\xc0c<\xcf+\xab$\x04\x96\ +\x09h\xb3\xaf\xf8\x9b\x07\x82P\x1f\x9e\xbc\x87\xd0\xda}\ +\x02\x7f\x01\xb0\xf0\x8a\x00\xbcLaZ\xba\xca\xd0\x0c,\ +\xde&&\xb5\x05\x14\x8a\x08\xb6ijV\xb5\xf1|P\ +\x08\x17\xa3\xd6\xec\x1a\xa2\x03\xa5]/~\xe2\xaak \ +\x0dR]\xcd<\xaf\xaa\xa1\xd7\x97\xa9\xab\x95f\xf5\xb4\ +ARiYD\x00`\x10\x05\x80b,\xbf\x14\xe5\x97\ +.A\xee\xd4\x1eN\xfb\xea&D\x02a\xb8}\xc4\xe9\ +\x9ey\xf3!\xfe\xdeE\x00H\x0a:\xb4\xc1\xa0o\xe3\ +AP\xe8\x14\x8a%\xaf.\x9dG\xc9\xf3G\x0c\x22?\ +3\xd8\x85\x13\x1b\x967\xba\x82R\xd5\xe4q\x9etl\ +\x8eM\xb0u*T\ +\xads/\x90\xc9\xb1#+\x9a9\xb32\x08s\xc5\xd2\ +\x0b+[|\xc58\xbdp\xcb\xd0\xd1\xe1{x*\xc2\ +E/\xe9q7\xf7\xdc\xb9cA\xb8G@\x04]\x99\ +\x10^'M!\xa7y\x854\xb0^\x85\x89\xdaf\xa4\ +\xc5\x07m\x1fRQ\x08\x08\x87\xf5\xea|\x1e\xb7y\x81\ +\x87\x96\xf2\x1dq\x91\x8b:\x97\x7f(\x9e\xcf\x00\x1am\ +x\x14p4\x80\xf2\x00J!\x8bp\xf9%\x0bZ5\ +\x83-\xabJv\xfe\x14>\x009\x1c\x96\xf5\xcds\xad\ +I\xd8/\x0f\x8a\xa4wL\xf0]\xda#8\xcfC.\ +\xe1rQ\xf0\xf0\x0a\x0a]\xe6u\x09E\xcc\xa3\x04\x06\ +\xbc{\x02\xf76\x02s\x1f \xce\xf5\x11\xe7\xd4y\xc4\ +;\x1f0\xd0>\xc2\xdf\xa7\xb0\xd6E\xcb\xd3Z\x06\x9e\ +\xa1l\xde\xdbgX\xb1$\xc2\x86W\x9a\x91\x85\xe3\xca\ +\x07\xbd\xa6\xd8^\xd3\x06\x89\x9e\x93\xe7\xd6^{\xbcb\ +\xa6\x04\xcf\x18D\x14\xda4\x85\x9d\x85k\xf6\x8e\xc3_\ +\xc2\xcd\xce\xf1\xf7Y\x9ew\x09\x00\x008\x00Z\xbe~\ +\xc7jv\x9e[\xdd>\xbc\xe5\xe0s\xb2\x97\x0fV\xbb\ +\xf7\xde\xaa\xb4=}\xfd9!\x01\x0f8\xa7\x19K\x19\ +\x17\xf1\x9e\xefImV\xe5\xce\x08\xe4\xd4\xebQ\xa0\x96\ +o\x92$\xde'\x93\xc7\xa7\xd6\x0c\xc2\xf2\x87]Q\xad\ +\x8ak\x83x\x1e5\xb7\x88\x02\xa0|xS\x91:\x88\ +\xc3\x0b\x94\x09\xe5\xcaS\x11\xa6Bx\xf6,\x9e'\x88\ +a\x070RM\xcc\xb9\xb2\xf7\xa69/3Bt\x22\ +Y\x8c+(lPQ!\xbf\xe0\x03\xaa\x1fO\xd3\x9e\ +s\xe5\xa0\x8e\xb1\x92\xca\x10\xdb\x03\xae\x94\x89\xdf!\xf2\ +\x14\x19\x9a\x82\xd5\xf2\xa568\xa0t\x1d\xe5\xa2\xe9X\ +\x1d\xe0\x10\x86G(gU_`\xf5\xd1-Y\x90\x00\ +\x86\xb9\x1b\xc4\x7f-\x07\xaf3\xa8s\xe4\xe7\xda\xec\xd0\ +\xcf\xc3w\x83\xfe.\x88Y\x0f\xee\xaf\x0f\xef\x82b[\ +\x87@\xec\x88Sh\xa0\x8d\x87o\x1d\x84\xad\xf7[Z\ +\x83z\x0duZ\xb2:\x96W\xb5Z\xa2\x9aV#I\ +\x95-\x96R\xd3\xce\xdf\x01\x02\xff\x17\xec\x99\xe1:\xab\ +\x90\xb0\x1d\xee\xe1\x18\x00B\xd4\x96\xe1\x09\x80\xb0H\xc7\ +\xdf\xc2A\x94[\x0b\xe0\xeeH\x15\x18tj\xf3\x85\xe8\ +\xac\x80\xab\x8c\x83J\xb77\xf9>\xb9|o\x1cT\xe7\ +\x97\xa5R\xf8\xdeU\xbc\x0698 \xcd\x19\xbbJ\x96\ +\x84WZ8\xb1\xd2\xd5;V\xb1\xf9\xc4*\xb6^X\ +\x05\x84\xb0|\xeb\xb9\x95m<%\xad}HVs\x0f\ +\x90\x90\xcbO\xebtvyY\xf1)\x18\xbb\xac\x9f\xec\ +D\x15O\xae\x96Q5\x8c\xc5:\xf9\xb3\xcd\x92J;\ +\x5c\x05uje\x8f\xa9\xb9Uz\x1d\xe3\xd0\xc0\x984\ +Ox@\xe8Z\xb1\x08\xa9x\x0e\xe19G\x13W\xdd\ +\x90pt\xa4\x0c(\x80>\xfd\x84\x93\x0c\xa5\xbb\xa4\xbd\ +idCi\xa4\x8b*p\xf5\xfa\x14MY\x8c\x8a\x11\ +\xd5IJ\x1d=\xdc6\xe4\xa6iWb\xec\xd5\x06\xc2\ +\xec?M\x96(\xdf\x07\x10X\x80\x8fTI\xadY\xb5\ +\x08\xa3<\xd5\xb5\x9b\x95\xe0\xfa\xb5\xef=B\x1c\x15\xdb\ +wm\xd4g\xd5J\x1dF?s\x0d\x8f\x00At\xca\ +'5\x93\xf2\xeb\xd5;H=\xeeZMG\xbaK\xf4\ +>\xa1\xaa\x8d\x1c\x96\x87\x97\x92\xcf%\xb1\x0a\xa9l\xc3\ +B\xf8{y\x0b\x83\xd5d\xf1\xa5\x8d\x16_\xd2\xe0$\ +\x91\x9f\x93\xf9L:\xdf\x19h\x1b'V/\xc2\x8c\xb7\ +\xdc\xa6R\xb5\xba)\xc1\xf3\x94\xcc{\x80,\x98Q6\ +\xa2~\xbd\x10[\xc0\x1b\xe8\xdc\xc5-n\x00\xbe5\x8c\ +a\x85X\xacs\x81\xb5cZu\xfb\x22j\x1e\x10d\ +\x0cZ\xaeU\xd1\x8b\xaa\x9f4\xef\x1e\xd1J\xe98\xfc\ +bj\x8f\x8c\x09\x02\xba\xc4\xb3\xaeB~\xd7\x1eX\xc1\ +\xda}\xcb_\x06l\x0b\xb7,:\x07y\x9bQ7t\ +\x91\xddm\xc2\x86\x88\x1e^\xb7U\xc5\x9a#\xa6vq\ +WT\xefX\xdcnW\x0a[\xbcR8$\xbe\xa8\xc5\ +\x12\x00D\x22@H*\x03\xf8\x15^\x8f\xe6Tu[\ +\xa9\xed'\xc5\x1dB\xc9c\x16 \xc3\x094M:\xf1\ +7jC\xcb\xb8[DJQ\xfd\xa0\xf6a \xae\xef\ +\xa2\x0b1^\x95\xb1\x9aG\xc6\xa8s\x94\x8eEI\xa8\ +\x1d\xb4\x04\x95\x86\xabq\x82Z\xb6\x02\x04U\xc0\xea|\ +\x9b\xcc\xf3R\xf0\xa0\xca\x9b\xfbq\x95}\x00@\x84P\ +=\xfd\x1c\x08p\xa5\x00A\x04R\x05\x92\xea\xa1/\x92\ +\xa7\x9e\xfbE3zU;\xf8=\xcf\xf2q\xef\x19(\ +H-V\xd5~5\xa1R\x1b7\xb4\x89\xe3w\xe2j\ +\xf9\xd5\x91\x5c\x070#:\xf9\xda\x89\x8aC\x9b\x90\x06\ +\x8b+\xaaGj-\xae\x10\xe15Q=\xff\x00\x80\xbf\ +q\xc8B\x9ds\x96;\xb8I\xfc?\x81 \x9eY\xf9\ +\xe2]\xe4\xbe\xcb\xd7\xd5\xd7\xbfp\x16\xc5\x90\x89hU\ +/J\xda\x1b\xd614\xc4J_\xdb.\xdeg\x8bp\ +x\x15R\xa6\xca!y\x82M\xc2\x9d6r\x88\xf9\xc3\ +\x11x\xc6\xc8\x90\xea\x1bD\x1a\x05\xe8m\x9ey\x0bv\ +\xbema\x94\x9b3K\x16\xb3p\xc3r\x90\xc8<\x06\ +1E\x18\x81\x8f\xf8\x87\xc8\x92\x08k\xbe>\x9e\xbf\x9b\ +\xcc\xa9C%fcn\xcc\xe3\xb0\xecX\x5c\xbe;C\ +X\x00\xd0)\xe2(^@\x88E\xe2\x0a\x19\x13^\x05\ +\x06w.p\x89\xc0\xdf\x04\xe8\x9b\x01D\x1b\xde\xa1\xc3\ +\xd2\xaa\xba\x10y\x89^KE\xd4\xf1,I\xfb<\xdc\ +^\xc1^\x070'\x15\x12t\x8e\xc4\xf1>F\x9b\x09\ +]\x17/\xd0\xa4N\x9c\x89 *\xd1\xed\xd2\xc5]h\ +\x07P'\xc4\xcc\x9d\x12\x86\xdb\x1bX\xc7\xda\x89)\xb8\ +.\xd7\xb3\x97T\xc8k\xd2\xbcK\xfc\x17\xa9\x22\x03\x18\ +:t{\x05r\xc7\x8f\x19\xe0#H\xc9>\x84\x85\xc1\ +\x19T\x87m\x1e\xbe\x1d\xf7\xd34lI\x5cO]-\ +\x13\xb4e\xab\x02/\xa0\xf3v\xcf\xc5\x9d z.\xee\ +\xe4kU\x03\x970\x08\xeaiX\xd4\xc8\xa0\xd4Yl\ +A\x0dRmW\x0a\xd4\xa5\xb3\x0awYg\xa9U\x1d\ +\x96\xd9\xa5T}\x10\xc3\xc1\ +[x\x0d\xf8\x03\x1e.gD\xab\x84\xaaoPg2\ +\xed\x13P\xe7\xd2U\x0b\x0c3>\xda\x96>\xca\xf8@\ +F\xd3\xfb\x16,\xa5\x0b\x86\x0f\xe8\x93ZG,\xa9\x99\ +go\xc2\x12\x09}\xf1\xb5\xbd\x16\xc7\x18\xc4a\xd5n\ +;\x5c\x09\xcaw\xd2\x06\x10$\xaa\x89$$\xa86\xb2\ +\xa8\x0d\x01\x14<\xff\x15\xc0\x7f\xa5\xb8\x8e\xf1\xa8\xf7\xbc\ +\x1f`H\xc2P\x92\xca\xf0\x9a\xe5xL\xb7\x0b\xaa\x07\ +\xe5kM\x80q\xbe\x98\xfc\x92\xa8\x18\xd6UCK\xfa\ +-\xc6\xf5\xa7\xe3&\xd4\xc6\xcd\x9dD) \xd4\x0f\xe2\ +\x0aGp\x7f\xe3(l\x1ab4G\x1a\x02\x0b\xedU\ +\x1bw\xc8D\xcf\x92\xeb'\x94\x0e\x19r\x0d\x14H\xa5\ +\xdcA\x93\xa4S^\xd9\xb8\xd2\x15/\xe5\x0a1(j\ +;\x17\xe8\xd4\xa6\x0a\xe2P\xb3&`\x04\x00\xb9#\xae\ +\xa5\x9bts\xd6\xbf\x13\x1dq\xae]\xbc\xda\xc6\xed\xca\ +\xba\x19\x00\xed\x09\xc0\xfac\x0b\xeb=\xe5\xe7W\xd9\x95\ +\xbc\x0a\xa4\x9c\xf7\xe5\x00\xa0\xc6\xd2\xe1\x00\xd9m\x13V\ +\xc0u\xcbI!k\xc8:\xea\xd6\x9e[-\xe4\xabZ\ +\x1d\xcbI\x9bJ\x01@1,\x5c\x9dIu\xf2\xa9\xe6\ +\x1b\x0a\xd4\xe6\x1d\xce\xa2^>\xca\xd3\xb3\xfan\x00z\ +\xbc\x82\xaa\x92\x06\xcfH\x81\xd5\xd7\x87\x94Xs\x01\x00\ +@\x8bG!\xb2\x06\xad\x0dhu\xd4\xf58\x86\xc8\xa5\ +\xb4LXJ\x1b\xaf\x1d\xa4r\xb2p\x94\x9e\x88\xc2\xe3\ +\xeb\xb1\xf0\xda\x1e\x8b\xad\xe9\xc2\xdaQ(!-\x8ep\ +\xa6S\xcau\xa2xl\xa9\x94\xad\xe3\xe3\xbd\x9dM\x92\ +\xcb\x02B\xa9\xceg\x00$\xa5}\xbc\xaa`V\xbd\x0d\ +\xf47m\x81\x03\x08\x88N\x0bw\x07K\xab\xd1'\x06\ +#\xe2\xa8-\xe2\xaet\xfc|\xb2\xcbkE\xa7\x02R\ +@\xa8=\x06U\x84\x80s \xc4\xa8\xf7\xbf6M\xba\ +\xe6\x81\x17[\xb4\xd5\xd0I[\xb3\xf1\x06\xa9M#\xc4\ +\xc7Q\xdc\xf6\x18\xe4O\x9d9!\x14(3\xbd\x93\xfc\ +_\x8d\xa5.N\xe0\x22LHt\xea\x96\xd2\x15\xb5c\ +\xf1\xb7\xcd\xc2\xd4\xb5\xab\x96\x98\xd44\x06\xfb\x1c5w\ +b\xa7<\x0c\xae/Y[\xc0\xb5\x07Q\xcd\x0c\xb4+\ +Y\xe2b\x94\xe6\xb1\x85P\xdc\x15 p\x00`p\xdc\ +\xce\xa0\x025m\xac\xb6\xd8\xdcJ\x8b\x8d\xa2\xfc\xdc2\ +\x8b\x03\x00I%\xb5\xe6\xab\xed\xb4(\xd6V6\xb6g\ +u\xb8\xfc\xe6\xab\xaf\xadu\xfb\x0b'M\x9b\xef\xadv\ +\xed\xb5\xe9\x8c\x1d\x81\xa0\x88<\xba\x80\x10\xe5dJ\x8b\ +^ZA\x94ruT\xccM'\xe1\x11-\x19k\xea\ +\xf5\x09$\x0f\xd1\x8a\xe5\xf8]\x97\x16fA\x1e\xfd\xb0\ +k\xb5sMR\xf95\xc0\xf5\xf6V\x22\x0am\xb5\x12\ +\xbc\x18\xa0\x8c\x85\xa0^\xa9\xd0\xc6\xd5\x06\xbb\x5cV\xef\ +\xe4J)\xafX\xef\x15\x81\xbaX\x96\x8d\xe0\xe1\xae\x10\ +\xea.c\xcdZ\xb2\xbdR\xa6\x15\xbc\x01\xaf\xaa\x97W\ +\xb7\x9a\x87\xb7P\xb7\xcf+Xz\x1c\x96\xee6\xbcJ\ +\xe1\x8c\x9d:\x84\x88\xdc\xb9\x13\xd7!\x80iJ\xf9\x5c\ +}\xa1j\x0c\xe0\x1bM\xda/\x00\xf9\xd3\xfe\x82*\xc6\ +\xb9R}\x02\x89\x0bj\x11\x9b\xe4\xbc\x00\x1e@5\xfa\ +\xe7\xa2\x8a\x91d\x00\xa1\x06\x8f)\xda\xc0\xd10\xe8\x00\ +q\xd1\xcd#\xbd\x1d2\x87\xa2}j\x00!\xe9\x00\x10\ +\xe4\xab*\x16I\x87P\xa6\x83\xc0t\xd2\x9b\x0c\x09D\ +'\xa3\x01 \xa9\xbc\x09Ik\x10:E\x04G]\xbe\ ++q\x1d-.r\xe1\x0b\x008f\xcc \x16\xe1\xfe\ +\xb5K(\x0f\xeb\xcf\xad\xb28\x00\xe0$\xaf\xd2\xe2\x09\ +\x05\xc9e\x8d\x16h\xe8\xb3<\xbcT\xd5\xf4\xb1\xb5\x5c\ +}f\xdd\x07_Y\xff\xb5\x9fl\xe0\xc6/\xd6\x7f\xfd\ +'\xeb:\xfc\xceZw\xbe\xc0+\xbc\xb2rMH\xc9\ +\xf2U\xd9\xab\xb5\x07\xc4\xcd\xad\xbb\xa5d\x08\xe2\xa8W\ +\xfe\x95\xaf\x0a\xa5\xf9\xd7V\xbc\xf8\xc6\x8a\x17^Af\ +\x9fZ.\x9fQM\x83\x96\xbbS Rj,\xe9\xdc\ +\xb3\x00\xeav:\xc3Q\xca$\xb8\xe9\xb2\x1a\x94]\x85\ +\xb2+\xedRq\x85'E\x95\xc4\xf8j\x040\xe3\xd2\ +\xb5\x1fB\xa2c\xebuZ\xa9\xb7\xe3\x19\x00`\xcd*\ +\xe2p\xe5\xe9H,\xe9`,\xc6)\x89\x97\x07\x15\xc9\ +\x83\xe1\xabg\x80*\x8a\xd5\x03\xc0G\xb6\xa2\xce\xef.\ +=\xd7\x8a\xa8\x13\x11X\xad\x8a\x02\x08M\xdei1\x8c\ +\xb1VG\x91\x98\x14\xbeT\x1d)u\xfc\xfa\x85\xb83\ +\xef\xcf\xdd\xb3v\xd4&\xba\xb3\xf0\x11\xd7\xf2\x15\xb4\x91\ +\x93\xea\xfc_50T'\x0f\x9f:j!R\xbej\ +\xd9\xd4L!]\x8b,u\xe3\xe6\xab\x1bs\xe2\x87\x95\ +\xfa\xb5\xcbV\x0c\x15I'\xeb\x10\x08R\xe5\xa6\xceE\ +uj\x0e\x08nO\x9c6n\xf0\xa0\xe7\xa9\x91\x068\ +V\xbb\x84\xf2\x19\xd4\xbcZ\x8b\xcf\xab\xb3x\xde\xc7\x17\ +\xeaL\xfdF\xe2\x7f\xbb\x05[\x86-\x7fp\xc5j\x16\ +nZ\xc7\xeek\x14\xff\xbd\x8d\xde\xf9\x93M\xde\xff\x0b\ +\xf2O6v\xfb7\x1b\xbc\xfe3\x7f\xfb\xda\xeaV^\ +[\xa9V:\xc7\xceP\xa8\x94O\xe6\xa2\xe5or\xe9\ +\x82I\xd5\xfd=\x810\xbe\xb4\xd2\xa5\xf7V\xbe\xfa\x95\ +\x95\xaf!+\x9f[\xf1\xfc\x0b\xcb\x1b\xbb\x0d\x00v\xcd\ +G\xea\x9c\xaceV\xc5\xe7|\xac\x99\xfb\xba\x22\x80\xe6\ +\xe3\xa1\xc4M\x0a+\x01E\xb9]*(\xb5\xcf\x0aJ\ +\xec\xff\xc8/\xb6\xcf\xf2Kx_\xc6\xef\x00\x81B\x19\ +\xf7\xef\xb6\xbd\xb9\xddO\x00\xe0|w\xf3\x15m\x93\xc7\ +8\xa5\xf8x\x94\xa5\xbd\x09\xf1\x8ca\x1cc\x96\xc0\xf8\ +%5O[\xaa\xb6\xb4\x93\x96\xaa\xdd\x5c\x96Rp\xbc\ +\x96j\x17\xb3\xdc\x11{\xea\x18Jz\xde\xab\xad\xe8{\ +xf\xa5\xb2\xab\xaeXG\xfaIS\xdf\x07\xc6<\xc6\ +\x1d\x09'+\xc4%\xbb\xd6\xae\x88\xb6\x86\xab\xe3D\x12\ +\xe8s\x1cAa\x02Q\xd7n5l\xd6\xe6\xcaT\x14\ +\x95&\x104k\xcb\xb8\xb6Z\xc3l% L;n\ +3\x1a\xa6\xcd\x87{\xf4#\x01\x09H\xf5K\x88G>\ +\xcdnq\xf14\xae\xab\xefQgL\xed\xd8ueP\ +\x02\x01\x0f\xecR\x15\xc5)\x15\xach\xbf\x1f\xec\xf8S\ +\xff^$\xbe\x88\xd8\xc7\x80%\x12\x13\x93\xcb\xdb,\x0d\ +\xb7\x1bl\x1d\xb3\xbc\xa15\xab^\xbci\x9d\xfbol\ +\xe8\xf4G\x9bz\xf8\x17\x9b\x7f\xaa\x16r\xffl\xf3\x8f\ +\xff\x93M\xdd\xfb\x8b\x0d]\xff\xd5\xda\xb7\xbf\xb1\x1aY\ +\xf5\xc4#\xcb\x1b\xc1\xe2q\xfd*\x0a\x91\x07P\x9fb\ +\x9d\xc3S\xba\xf8\xce*\xd6\xbf\xb1\xaa\xad\xef\xadz\xfb\ +{\xab\xda\xfc\x06\x10\xbc\xb5B\xb5zQ\x06\x84\xe5\xa5\ +\x08\x00\x10\xb6\xd8|brn\x1d\x82\xc5\xe7b\xddx\ +\xa7\xcb\xf0\x93Kye\xf6Y\x1e\xca\xcf+F\xf4\x0a\ +\x18\x08Y\x97\x00\xc8\xe5\x02\xc8,^\xc3c\xf7\xda\xcc\ +\xaa\x0d\xac\x10b\xad\xe9\xe3\xd6]U\x10c\xa6\x1dC\ +I\xda4\xc2\xf5\xd4>.\xa5U\xedo\x08\xbb\xf0.\ +\x9d2\x1a\x06\xb4Q\xf5!\x9ay\xce\xeb3R\xcd\xc7\ +\x16\x19\xbbOv\x02\x7fqU\xc2\x00A \xe8\xd4v\ +\xb5U<\x01 \xc0K\xeb\x94\x96\x18\x1dh\xa0\xe3S\ +\xd3Z=\x05j\x81\xc7k'J*\xe8\xbaN\x11\x9f\ +a\x91\x02\xc3\xc5\x86JmLt\x00\xc0\x8au\x18t\ +:\xb9\xa7+-\x97\xebo&,`\x19\xb2\x0eu\xe7\ +\xcel\xbc\x10~\xe6A\xfc\xc4'\x1fq(]\xff\x0f\ +QQ\x8bV\xe5\xaa\x0e\x04\x00@\xd7U\x9f}\xed{\ +s\x84E[\xb9\xcaa\xb2e\x10B\xb7\xe9\x13 \xb8\ +\xadbJ\x15\xc9\x8f\x89\x85\xc9\x95\x9d|W\x8f\x05Z\ +\xd5\x81t\xd9\xaa\x16\xae[\xcf\xd1\x1b\x9b\xba\xff\xb3-\ +\xbf\xfcO\xb6\xf9\xee\xdfl\x0bY{\xf5/\xb6\xf0\xc4\ +\x03\xc1\xe0\xf5?Z\xfb\xce\xf7V\xb7\xfc\xc1\xcag^\ +X\xd1\xc4C,\x1b\xb7\x8f\xe4M>\xb4\x82\xd9\x17V\ +\xb2\xf4\xb9\x95_\xfdhU\xdb?Z\xf5.\xb2\xf3\xd1\ +*7>w\xd3\xday\xea\x0d\xd8\xb5\x0e\xd0\x89\xa9J\ +\xab\xc4\xd8\x0b\xb0^\x01!\x8f\xf8\x8e\x87\xd2\xb6\xf6\xcb\ +(Z\xcavR(\xe1wE\x00E\x8d/\xd4\x99\x9c\ +X\x9fX\xa6\xe6\xd0=\xa4\xb1\xfd\x96\xceX\xc8K\xfa\ +[\xe7,\xb3c\xd5\xed\xb1P\x15\x93\x8aB$\x01\x85\ +\x1eD\xb3\xae*V\x8dL\xdc\xb3\xfc\xb9\xe7V\xac\xb5\ +\x86\xb5/\xadd\xf5\x0b+Zz\xc7\xef^\x98\xaa\xab\ +\xd5\xa2.\xa4\xa6\xdb\x9a\xacS}\x81&\xf0:5\xdb\ +\xab)\xfc%\x8bq\xdd/5\x1f\xde\xef\x1dk\xaa\xc9\ +\x1eW\x97\x8e\xabH\xc5\x92\xbdmH\xda\x90\x88\x97\x10\ +\xc9@1\xeaJ\xe5\x1a\x16a\xc9N\xb4\x95\x5cn\x1f\ +\xe5\xeb\xbc^\x95\x85\xf9\x897\x01$\xb3\x05i\xf6$\ +\xd0\x041T\x01\x86\x00@\xacW\x9f\x80\x14\xc0\xe5\xfa\ +\xef\xd6\x9cw\xc1\xc2[\x88\xc4x\x1b\x17`\xd3\xb5\x0c\ +\xb0\x03\xc2\x10\x96\xc1@\xab\x97\xaf\xd2\xc3r\x08\x90\xd2\ +\x1dBS2\xe45\xb5\xae\x17\xee1d\xd9=sV\ +1{h\x03\xc7/m\xf9\xe9\xcf\xb6\xf3\xfeov\xfc\ +\xf5\xbf\xd8\xe1\x97\x7f\xb7\xf5W\xffds\x8f\x7f\x03\x18\ +\x7f\xb2\xd1\xdb\x7f\x86\x1f\xfcf\x1d{?[\xe3U\xbc\ +\xc1\xf2{+\x9b\xf7\xe6\xd3\x8bt\xf6\xde\xe2{+]\ +\xf9\xda\xca\xae~o\xe5\x9b?X\xd9\xe6\xb7\xbc\xff`\ +%+/\xadp\xee>dP\x99\x80V\xd9\x96\x1c\x11\ +L\x86Y'\xc0\xd6\xe3\x8aa\xeeE\xb0\xf5\x22b\xb8\ +B\x83\xbc\x03\x96-\xa6\xaf\x8e&jX\xf1\x0f\xf2\xd6\ +\xe7\x9e_\x86\x90\x81\xe7\x0b0\x86\xd9(%\xa7g\xc3\ +\xf2\x06\x0f\xac\x88\xb0\xa4C5K\xa6\x1fX\xf1\xf4#\ ++\x82\x84\xea\x90\xa8\xbc\xf1\xfbp\x16\x9dJ\xaa\xc3\xa3\ +^[\xd9\xea\x07\xab\xe4\xfe\xaa\xf0R\x95\xdb\xdfY\xd9\ +\xc6\xd7V\xb4\xf2\xfe\x13\x08\x94\xc1d\x13\x1eT\xec\x93\ +\xd9{@\xc6\x06\x90H\xdf\xd5\xe9-FK\x8b\x92\x5c\ +\xbdB\x88t\x14Z\x16)\x8e\x90\xa2\xf9~\xafF\xcd\ +[\xf9K\xc3\xa2\xd3\x9b\xd4C\xe7\xbc\x8f\x8e\xdc=\x1e\ +\xc3\xc5|Y\xbe\x0aBu\xaaV\x87\xb2\x00\xf2b\x80\ +\x94\xc9wh.Z\xb5\x81\x22M>\xbeK\xd5+\xa9\ +R8^%\xd9\x91P\xb8\x07a\xc5\x01Lupn\ +\x87\xeb<\xa2-O\xbc\x0a\x0c\x80\xce\xb1W\x97!\x88\ +\xa3\x88\xa8B^k\x19\xc4\xba>>\xd3\xc7\xfd\x0dr\ +\xcdI+\x1e\xdf\xb0\x9e\xbd\xfb\xb6\xf0\xe0\x83m\xbc\xfc\ +\xde\xf6\xde\xfdd[\xaf\x7f\xb0\xb9\x07_\xd9\xf0\xe9\x17\ +\x84\x86\x8f6t\xf6\x8b\x0d\xdc\xfa\xcdz\x00A\xfb\xc1\ +/\xd6\xc4\xc0\xd5`A\xe5\x00\xa1\x84\xb8_\xb2\xf2\x85\ +\x95\xae\x7fk\xa5\x1b\xdfY\xc9\xc6\xb7V\xb4\xf6\xc1\x0a\ +\x96_X\xee\x9c\x8a8U\xc4\xa2\x85\xa3],t\xc3\ +2\xdb\xd7\xf0x\xb0\xecZ\xf2\xfd\xea\x09\x94\xab\xedm\ +J\xb7\xc4gd8\xda\xc8y!c\xa6^\xca:\x80\ +J\x9e\xd3\xa7\x9eCx\xe0l\xc6L\x8aW\xef\xdf\xb2\ +\xc9S\xab\xc6\xcb\xd4\xaf\xbd!{\xf9\xc2\x9a\xb7\xbe\xb6\ +\xa6-\xd5=|c\xf5\xeb_Y\x0d\x0a\xafZA\xb0\ +\xf6\xaa\xf5\xaf\xadz\xf3\xa3\xd5\xec\xfc\xe0\xbcT\x15\xaf\ +\xe5[\x1f\xadd\xfdK+\x5c|ky\x00:g\xe2\ +\xb1\xa9\x862\x9bP\x97\xad\x22\x95\xe1\x1b\x08\x1el\xe4\ +\xba\xc5\xe8(2\x15|\xe4\xcf=\xb2\xfcY\xefT*\ +\xd5\xbe\xab\xc6N\x85\x94Z\xb7\x16\x18$\xaa\xb3\xcbt\ +\x8b%0L\xadY+\x07V\x9e\ +B'\x89\xe7\xe9g\x17W\xdb\ +\xa7\xb9\xcb]\xc8DP\x04* 0\x85\x1c\x05E\xa0\ +\xc4\x04\xde\x03!\x00\xe7%8\x9fB\xaa~\xccn\x05\ +h\xc2x\xdaF\x04\xd49$7\xd1\xdf\x06\xf6\x9d\x12\ +h\xf2\xec\xbe \xe5e\x08\xe0}\x04\xfd\x1d\xb2\x03|\ +\x00q'\x04\xd2\x80\xc6\x0e\xc6\xa4[\x8c\xa9r\xbff\ +\xd1\xb7\x01\xbcr?\xa1\xbe\xcc\x1a\xcb\xe4\x9c\x8c\x00\x9a\ +y9\xa0o\xa1?\x06\x197\x87\x1d\xe8\xea\xce!\x1b\ +n\x12\xed7\x12<\x8b!\xf4\x880\xcb\x04\xf4c\xc8\ +$\x10\x12\xde+<\x9e\x9c+^$$\x91\x18\x02G\ +\xacg\x81\x1e;\xd0C<\x02j\xd0\xc3\x90\xab\xc03\ +\x11\xf1\xb2*\x22\x1c\x91\x9a>;&\xf0m\xd2\x89X\ +\x14X\xf3\xa3\xee\xb3\xecdB\x8e\xd9\xb9\xd1\xd6\xc9@\ +>\xfa\xb5\xf3\xf5\x84\x90\xcf\x8a\xc0\x84\xdb\x87\x8e\x0f\x16\ +\xde\xdbiw3\x00\xbd\x0aI\xd9\xbe3\xc3\xe1,\xfd\ +\x8e\xa3\x96G\xbb,\xd8#y\x03d\xcc\x04\xf6LI\ +5\x15\xf4\x18\xcd\xc8!\x81&\x13x\xb2\xb0G\xa8\x98\ +\xd7\x97J\xea\x93v5\xda\xdbu\xf0f\x14\x07\x92\xfc\ +\xb1y\xcd\xadt\xa3\xf6\xa1\xb7\xd0\x1e\x08\xf6HR9\ +\x17\x9d.Q\x88JMX\xe3E\x11\xc8\xf9\x91\x84\xf7\ +6\x92\x90d\xdf\x972\x84\xd10\xd7\xf9\x22\x02'^\ +\xd7?\xed\xed\x0f\xbc\xcbE!\xdb\xbc\xce\x86SF_\ +w\x8ev\x01Hy\xe1\x9cN\xb5.\xcf\xf0\x0d\xfa:\ +G\x83\xaa\xe2\x16:\x1d\xdb\x0d\xe0\x5c\x0f;d\x81\xc7\ +k\xf3\xee\x13\xb6\xb6_\x18x\x11B\xac\xd8\xfc.\xa5\ +\x1f`t\x8aZ\x1d\xe5v\x8c\xd0M\xa6#$\x9db\ +1&\xcfu\xde\xb2q\x9f\x90\x9d\x86\xbe\xbd\xe8<\xc7\ +\xfb2\xf7\x0f\xe6\x1c\xe5c!G\x1c\xdd\x88\x0e\xe8\x1a\ +\x85\x8f\xea.\xef\x842G\xf0z\x99e\x88\xdb\xbc\x96\ +\xabn\xecx\xf1_\xa0JA\x0a\x0a Icons / Notifi\ +cation / Error -\ + black\x0a \ + \x0a\ + \x0a \ + \x0a \ +\ +\x0a \ +\x0a\x0a\ +\x00\x00\x01u\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01\xd0\xa2K@\xfc\x1f\ +\x84\x81\xfc\xff06\x10\xbf\x02\xf2\xe7\x00i9Z\xf8\ +\xd8\x02\x88\x9f\xa3Y\x08r\xc0_4>\x8c\xddHM\ +_G\x00\xf1?\xa8\xe1 \xfa/\x0c\xe3\xe0\x83\xd5\x02\ +\xf1\x1a \x9f\x91R\xcbA>\xff\x87\xc7\xc7\x84\xf83\ +(u\xc03\x12-\xc4\x16%n\xe4\xc6{>\x11q\ +N\x8c\x03\xae\x93\xeb\xfb\x8b0C\x09\xc49!>\xc8\ +\x0c}r\xf29H\xe3?\x0aC\x00\xc6\xaf!\xd5\x01\ +\x0e\x14Z\x88\xce_C\xaa\x03B\xa8\xec\x80\x03\xa4\xc6\ +\xbf\x0f\x09\xf9\x9e\x984\xb0\x95\xd4\x10P\xa7r\x08L\ +\x22\xd5\x01l\xd0\xb2\xfd?\x95\x1c\x10@N90\x9b\ +\x0a\x0e\x00\xe5\xa2\x9f@\xccDN9 \x0d3\x84\x82\ +4\x00\xd2\xdfBIQ\x5cOa\x08\xdc\x01\xd2\xcc\x94\ +V\xc5k\xc8t\xc0\x1b _\x99\x1am\x01F \x9e\ +\x81\xa5\x01\x82+\xceAl\x90\xcf\x95\xa9\xdd\x1ar\x07\ +\x1az\x13\x9a\xaf\xe1\x8eA\xe3\xff\x04\xc59\x10\xb3\xd0\ +\xb2=\xa8\x0f\xc4\xb5@\xbc\x16h\xd1! \xbd\x1d\x88\ +\xa7\x00q \x90\xcf\xcc0\x0aF\xc1( \x11\x00\x00\ +\x90\xbf\xd0E\xdf\x04S\xa8\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\xaa\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x02qIDATx\xda\xedWMHTQ\ +\x14\xd6q,\x0c\x1db\xd0d\xa86\x814!\x11A\ +\x90\x92H\x14\xc4@\xaef\x11\xb5\x10l'\xe4l\xc4\ +\x85\xcb\x1aA\x88@\xc2E0\xad\x1c1h!\xd3\xa6\ +\x7f\x9a\x84\x90hg$$\xb6\xa84]\x88\x039\x8b\ +\x18)g\xf2;\xf0=8\x5c\xdfLo\x86\xb9\xd2b\ +\x1e||s\xcf\xb9\xef\xdes\xbew\xce}o\xea\xea\ +jW\xed*\xe3\xba>0\x14\xbbq3\xf6\x07w\ +\xe9q\x8d\x8fN\x00\x15+\x80\x88E\xbe\x0f\xe0\x97\xe0\ +\xa8\x11\x80\x1f\xf6\xcfF\x9f;\x9c\x01\xb7x\xad\x01\xd8\ +\xafJ{\x82g\xc0>\xbd\xc9)#\xab\x84\x11D\x08\ +\xf8i\xcc\xd9\x06\xcex\xad\x01U?\x82M\xa0IG\ +\x16fF\x1b|\xdb\xc9\xa4Qc\x81n\xd8w\xd4I\ +\x17\xf5\xda\x05\xac\x15\xb9oM6\xe7>M\xfa\xe60\ +#{\x0c\xf4\x02\x05\x8e{\x8cM\xae\xd1>\xec\x92\xa1\ +S\x039\xad\x00~\x1f\x06\xb6\xe8\x93\xb5\xbf\x01\x1b\xc5\ +\x14Hq<\xa0\x14\x09\x19\x1b\x9d.QK\x17E)\ +c\xfe\x0b*s\x8f\xe3\x1f\xa5\x14H)\xdb]\xda\xa4\ +\x00\x0fU\xd8A\x0f\xb8\xc6;\x8e}\x12\xc0?\x15P\ +\xf6I\xda\xbfK\xa1\x96\xd1UG0\xff53\x9f\x07\ +\xfbio\xf0\xac\x80\xf2\xddR5\x91\x04\xce;\xad\xa7\ +\xe6\xc8\xc2\xb2\xe9%9%\xd5\xf7\xc1}\xa0\xde\x98\xe7\ +]\x01\xe5\xef\x90\xd7\xadz\xcfK\xab}\x05/\x81\x97\ +\xc1\xeb\xf2\x1aV\xfeW\xe0\xb3.\xeb\x94\xaf\x80\x91\xe9\ +1`\x10\x90#y\x1e\xf8\x04,\x00r4'\xe4[\ +\x10h/q\xbf\xd4\xc0\xaa\x9b\x02'\x9d\xc8-\x7fU\ +\x1f\xe49\xb1G\x01\xe9\xe1\x1d\xf6\xf0\x09Ko\xd2\x03\ +\xc0C*\xbd\xe06a\x92\xcf\xf0\x17x\x0e\x9c\x06\xa7\ +\xab\xc4o\xc1\x19U#}\xc5\xa2\x1c\x01\x16Y\xa9\xab\ +U\xc6\x0a\xf0\x1e\x88xyV\x8d\x98\xd8Xe\xf6\xff\ +\x97\x7f\xf7v\x01&\xc7\xb3\xa0\x90\xee\xe83\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x02\xa5\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a Icons / Notifi\ +cation / Warning\ +\x0a \x0a \x0a \x0a \x0a \x0a\x0a\ +\x00\x00\x06}\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a Icons / Icon G\ +rid\x0a \ +\x0a <\ +path d=\x22M7.02749\ +543,18.2117232 C\ +7.8834099,18.038\ +7856 8.54248262,\ +17.8471758 8.883\ +41584,17.6633902\ + L9.13660094,17.\ +5269066 L9.41318\ +015,17.6058648 C\ +10.2365316,17.84\ +09162 11.1075671\ +,17.9625414 12,1\ +7.9625414 C16.32\ +37915,17.9625414\ + 19.7799758,15.1\ +162719 19.779975\ +8,11.6803149 C19\ +.7799758,8.24435\ +789 16.3237915,5\ +.39808842 12,5.3\ +9808842 C7.67620\ +852,5.39808842 4\ +.22002417,8.2443\ +5789 4.22002417,\ +11.6803149 C4.22\ +002417,13.43386 \ +5.11977547,15.08\ +21543 6.6930318,\ +16.269688 L7.214\ +92385,16.6636253\ + L6.12154393,18.\ +3763334 C6.43148\ +919,18.3255971 6\ +.73578148,18.270\ +664 7.02749543,1\ +8.2117232 Z M3.9\ +4487569,20.05404\ +83 L5.67352379,1\ +7.3462342 C3.805\ +49981,15.9362024\ + 2.63427705,13.9\ +10191 2.63427705\ +,11.6589 C2.6342\ +7705,7.3991563 6\ +.82745404,3.9459\ +5171 12,3.945951\ +71 C17.172546,3.\ +94595171 21.3657\ +229,7.3991563 21\ +.3657229,11.6589\ + C21.3657229,15.\ +9186438 17.17254\ +6,19.3718483 12,\ +19.3718483 C10.9\ +251584,19.371848\ +3 9.89260571,19.\ +2227398 8.931178\ +29,18.9482703 C7\ +.61917454,19.655\ +5273 3.94487569,\ +20.0540483 3.944\ +87569,20.0540483\ + Z\x22 id=\x22path-1\x22>\ +\x0a \x0a \x0a <\ +g id=\x22Group\x22 tra\ +nsform=\x22translat\ +e(-2.000000, -3.\ +000000)\x22>\x0a \ + \x0a \ + \ +\x0a \ + \x0a \ + \x0a \ + \x0a \ +\x0a\x0a\ +\x00\x00\x01\x12\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\xd9IDATx\xdac`\x18\x05\xa3`\ +\x14\x8c\x82\xa1\x06\x22\x13s\xd9\x818\x15\x887G$\ +\xe4\x5c\x00\xd2\x87\x80\xb8\x1b\x88Uhn9\xd0BG\ +\xa0Eo\x80\xf8?\x08\x03\xf9\xffal(\xbf\x87\x96\ +>w\xc2b\xe1_4>\x88^F\x0b\x9f\xb3\x03\xf1\ +k\x98\xa50\x0c\xe4\xff\xc3\xc2\x07\xa9\x09\xa2\xb6\xefS\ +q\xf8\x18\x17\xff4\xb5\x1d\xb0\x91D\x07\x800\x0f5\ +\x1dp\x9e\x0c\x07(R3\x0d\x1c\x84&\xb0\x7fD\xa4\ +\x81\xbf\xd0t N\xcd\x10\xe8\x221\x04^\x011#\ +5\x1d\xa0\x04\xb5\xe0\x1f\x91\x0e\xe8\xa0E9\xd0Cd\ +9\xf0\x0c\x889hU\x18-\x83\xc6/,4\x90\xe3\ +\x1cl9\x90V\xa1u]\x10\x04\xca\xe7hE1(\ +\xce;\x81|\x0e\x06z\x01P>\x07Z\xa8\x08\xa4\xc5\ +\xa9\x9a\xe0F\xc1(\x18\x05\xa3\x80\xde\x00\x00*\x106\ +\x97\x13c\xdc\xaf\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x01\xf5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01\xbcIDATx\xdac`\x18\x05\xa3\x80\ +D\x10\x91\x90#\x06\xc4\xd7\x80\xf8jdb\xeeU\x10\ +\x0d\xc47\x81\xb8\x84.\x0e\x00Z\xaa\x02\xc4\xffA\x18\ +h\xe9\x7f\x18\x1b\x88\x17\xd1\xcb\x01\xcaH\x0e\xf8\x8b\xe4\ +\x80\x05#\xc3\x01@KU@A\x0f\xb5\xfc\x1f\x88\x86\ +\xf2\x17\x8c\x98(P\xc4\xe1\x80\xf9\xb4\xb4T\x0e\x88u\ +\x81\x16j\x01\xe9(\x1c\x0e\xd8\x0b\xe4k\x00i\x1d(\ +f\xa1V\x9c3\x02\xf1mX\x96\x83\xc5?Z\x1a\xf8\ +\x8b&\x0f\xc2\xce\xd4\x0c\x01\x17\xa8\xe1\xff\x90|\x8c\x1e\ +\x02\xc8\xf2\x1bi\x11\x0d\xe9h\x05\x0f6\x07\x80\xe8\xab\ +\xe4Z\xc0NDtL'\xe0\x80W@Z\x92\x80=\ +L\xd8\x0cV\x06\xe27@\xc9\x07@\xba\x06\x14\xefx\ +\x1c\xb1\x17K9\x00\xa2\xff\x00\xf9\x16\xf8\xea\x10\xa0\xfc\ +J \xfd\x1c\x88\xeb\xd1]\xa5\x87V\xb6o\xc7\xe3\x03\ +\x1e \xbe\x8f%\x04\xa2\xf0\xe8\x11\x02\xe2gH\xe6\xcf\ +CW\xa0\x8b\xc5\xc0\xe9x\x0c\x94\x05\xe2\x1fH\x06\xb6\ +\x11\x08\xf6#h\xe6\xcf%\xc6\x01 ~\x00\x1eC\x9d\ +\xa1q\xbe\x94\x80\xe5yX\xd2\xcc\x5c\xf4\xf8\xd1\x85\xfa\ +\x069_\x83\xb2\xd47 \xadFA\xce1FJ#\ +\xb04\x03r\x08\xd1!\x00\xa2_\x03\xb1\x12\x99\x96\x7f\ +\xc0\x91k\x88v\x00\x8c\xff\x05\x88#\x88\xb4\x98\x0b\x88\ +\xab\x81\xf8/\x9er\x83d\x07\xc0\xf8\x17\x81t\x19\x10\ +\x9b\x03\xb1(\x90\xcf\x0b\xa2\xa1\xb9(\x06T%\x03\xe9\ +7x\xf4\x93\x94\x06\xfebI\x13\xc8e\xfd\x7f<|\ +l\xfa\xc9J\x03\xb4\xe2c8@\x9b\xce\x0e\x98\x8e\xad\ +t{KDeC-~\x18\xb6\xb2:\x84\x848\xa6\ +\x84\xbf\x1e_m\xa7\x04TT\x07\xc4\x13\x81x\x02\x90\ +?\x01D\xc30\x85\xfc. \xdfo\xb4k\x87\x0e\x00\ +\x0bqL\xd4T\x13W`\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\xd5\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00jIDAT8Oc\xfc\xff\xff\ +?\x03%\x80\x09Jc\x80\xc522\xffA\x18\xca\xc5\ +\x09\xb0\x1a@\x8cF\x18\x00{\x01\x9f\x86\xd8'O\x18\ +\xa1L\xac\x00\xa7\x17`\x80\x90k\xc0\x06\x10\xb2\x05\x9f\ +!\x04]\x00\x03 C\xb0\x19D0\x0c`\x00\x97+\ +\x09\xba\x00\xa4\x11\x9f\x17Q\x0c \xa4\x18\x1b\xc0\x99\x12\ +a\xde\x22d \xed\x922\xb1`\xc8\x1b\xc0\xc0\x00\x00\ +\x1d[2\xc1\xc0t\xc2\x0d\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x00\xeb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\xb2IDATx\xdac`\x18\x05\xa3`\ +\x14\x8c\x82Q0\x14Adb\xae:\x10O\x8eH\xc8\ +\xd9\x0f\xa4\xd7\x00q8\xdd,\x07Z\x1a\x0f\xc4\x7f\x81\ +\xf8?\xd0\xe2\xff \x1a\x8a\xb7\x00\xf9\xcc\xb4\xb6\x1c\xe4\ +\xf3\xbf \x8b\xa1\x96\xc3\xd9P~\x1b\xad\x1d0\x19\xcd\ +Bt\x07\xbc\x05\xd2l\xb4t\xc0~\x02\x0e\xf8\x0d\xa4\ +\x15i\x99\xf8VA\xe3\xfb/\xd4\xf2\x7f06\x10\xff\ +\x03\xf2\xbf\x02i\x11Z\x86@\x18\x81\x108H\x8f,\ +\xb8\x19\xc9\xc2\x7fH\x0e\x00\xf9^\x95\x1e\x0e`\x06\xe2\ +6 ~\x0b\xb4\xf0\x0f\xc8b >\x04\xc4\xaat-\ +\x8c\x80\x96\xb3\x81\x12\x1c\x90\x16\x1d-\x9aG\xc1(\x18\ +\x05\xa3`H\x03\x00\xac\xe7\x98*\x92\x10\x95\xa4\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x03\x0b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x02\xd2IDATx\xda\xed\x97MH\x94Q\ +\x18\x85\xd5i\x0a-\x17\xba0\xcc1!\x88\xc2(\x0b\ +\x92\x5cLFn*\x88Z\x05J(\xd3&*4B\ +\xfbq\xd5\xa2\xc2 \xa4\xb2_Z\xb4\x88\x8aP\x82)\ +\x22\xab\x85\x14Q\x8b\x16\x81\xf4\xb7h!\x16\x95\x05-\ +\x8a\x8a\xd2t\xea\x1c8\x1f\xbc\xdc\xee7)\xe9H\xe0\ +\xc0\xe1r\xee\xf3\xcd\xbd\xef\xf7\xce\xfdy'+k\xea\ +\x83O\xdd\x96\xa6\x1d\xd0\xc1\x10\xb6\x11\xba\x09\x1d\x0e\xe1\ +\xab\xa0\x1b\xd0\xb1\xdaDc\xae\x87/\x86\x92\xd09\xf0\ +\xc2\xb0\x00NC\xbf\xf0@\x9b\xed\x87\xaff\x7f \xf8\ +\xf3\x0e_\x84\xfe\x94\xe1\xb7\x1c>\x1b\xfd?\x0c\x7f\xe2\ +\x0d\x00\xa0\x03\xe2C?\xed[\xc0?b\xbf\x94\xd2 \ +s\x0dOzx\xa5\xe1\x1d\x86\x07A\xac\xf7e\xa0Z\ +\x90\x0f\xd5\xaa\xaf0\xf8\x12t\xd9\xf0f\xf1\x5c\xf8\xef\ +\xe2]\xd0\x90x\xbbx\x04\xfe\xb5x\x0f4 \xde\xe9\ +\x0b`:\xf4N\x0f\x5cT\xdff\x13\x00S\xfdL\xbe\ +G\xbc\xc6\xf0\x95\xd0]\xf9\x97\xe2\xe5\x86\xd7A\x17\xe4\ +?\x86\xad\x83.=\xd0'\x7fI\xfe\x8d\xfcQ\xf9\xcf\ +P\x0etD\x9eY\x88@\xbb\xcd\x84\xb3\xa0\x9d\xc6\xe7\ +C\x9b\x8c/\xf7\xad\x83D\x90fh!\xf4J\xbeS\ +|\xad\xe1\xcb\xb9\xa0\xe4\x1f\x88/3|\x03tG\xbe\ +O\xbc\x18~D\xbc\xd5\x97\x81\x22\x13a\xb7\xf9\xcd\xeb\ +\xc5\xa3\xf0#\x1e\xbeO<\x1b\xfe\xbd\xf8}\xe8\x9b\xf8\ +I\xf3\x92\xbd\xe2\x8f\xc3v\xc3Cg\xdbq\x0b\xe5\x1b\ +\x9et8\x03*3\xfc\x84\xc3\xd9V\x1a\xbe\xc7\xf0\x12\ +_\x00+\x9c\x01\xf6:|\x01\xfa\x07\x0d?\xee\xd9\xf7\ +\x9f\x0c\xbf\xea\xf0(\xfa?\x88\xc7\xc2\xb2\x10\x87\xcep\ +M\x84\xf0\xa5\xd0)h;\xd3\xee\xe1\xf3\x98\x09\xa8\x85\ +\xbb\xcb\xc3K!\x9e\x9a\x05\xff\xfd\xfd\x11,Z\xae\x93\ +\xc8d\x04P\xaaE\xc8\x00\xf22\x1e\x00&\x8fa\xe2\ +a\xee\x14\xdf-\x98\x89\x0c\xc40\xf1\xb020)\x01\ +\x14+\x00\x1e\xc5\xd1L\xa5\xbd\x0c\x93q\xfbm\x85Z\ +\xb5\x06\x86\xa0&\xf6\xc1oC[0\x91o]\xe5\xdc\ +\xef)\xd6\x01\xc6\x0frmLt\xea\x1b\x9c\xa3\xd8\x9e\ +\x9c\xf1L\xfd\xfe\x87<\x01$2\xbd\x08\xaf\x99\xdb\xb3\ +}<\x16X\xceX\x9f\xc7\xc4/\xd0v\xff\xf3\x5c\x18\ +\xe8\xac\xb9>\xbfB\xcfY\xbb\xc17\xa2]\x92f\xa0\ +\xec4\x19\xca\x03\xafA{\x00\xba\x0d\xf5k\xdb\x06Y\ +\x8b\x87\x05\xe0\xde\xe7\xd4\x80J6\x06\xc4A\xe7Cs\ +T\xe5P%\xac\xffY\x09\xa1\xdd\x0f\xdd\x83\xbe\xa4\x19\ +\xef\x8f\x00\xaa\xa0]\xbc\xffY\xfbA\xd7\xa1\xb7\x7f\x19\ +`\xb4\x9e\xe5\xfaS\xd5\x98mh[tn\x14\x8df\ +\xa1\xf1-\x1b\xa0+P\xbf\xa9\xf9l\x9d\xefz\x9e\x0b\ +\xbd,V\xe0\xd7\xa0\x9d1\x9e'\xe1L\x0cZ\x01\xad\ +\xe3\xff\x07\xf8z\xd6\x8c\xacx\xa1\xd5,F\xd0N\x9b\ +\xfa\xb3;\x96\xcfo\xe5\xb5\xdc\x8eP\x05\x84\xb2\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xe0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00uIDAT8O\xd5R\xed\x0e\ +\x80 \x08\xd4\xd6{\x83ON\x9d\x03\xe7,\xd0\xd5\xfa\ +\xd1m|(p\x0a\x9aE$\xbd\xc1\xa6\xf6\x82R\x8a\ +@t\xe9\xe2\x96\x00\x85D\x94u\x19b\x87\x1aOZ\ +-\xae\xc0\x0c\x98\xf94R\xfdQ\xa2\x18\xa49OI\ +\xdc!\xf6@K\xeeP\xc12;=\x8aWe\x09c\ +rTh\xd2Z\xb0\xa7\xb3\xeb\xea\xf6\x14\xeeO4\x92\ +\xd9\x93~\xf7\x95W\xf1{\x82\x94\x0e\xd4\x89\xe2k\x0c\ +\xdb\xee*\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xa6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00mIDATx\xdac`\x18\x05\xa3`\ +\x14\x8c\x82Q0\x0a\x86*\x88L\xcc\xad\x89H\xc89\ +\x07\xa4\xd7\x00\xb1\x14\xbd-\xaf\x05\xe2\xff@\x07\xfc\x07\ +\xd1@\xfc\x98\xde\x0e8\x03u\xc0_\xa8\x03@X\x85\ +n\x0e\x00Z\xbc\x1a\xea\xfb\x7f@\x1a\x84A\x8e\xe1\xa2\ +g\x08H\x82\x82\x1d)\x0aR\x07$!\x02\x1d\xa0\x02\ +\xb4\x9ck4K\x8e\x82Q0\x0aF\xc1(\x18\xd2\x00\ +\x00e^3\xba\x9ez\xe49\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x00\xef\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\xb6IDATx\xdac`\x18\x05H \ +21\x97\x11\x88C\x81\xb8\x18\x88\x0b\xa9\x88\x8b\xa0\xd8\ +\x05\x9f\xe5\xdc@|\x19\x88\xff\xd3\x18o\xc0\xe5\x80i\ +d\x18\xf6\x1b)\xe4\xf0a\x16 \xf6\x01\xe27P}\ +)\xd8\x1cp\x85\x0c\x07\xfc!1\x8aM\xa1\xfaVb\ +\x93\xbcFk\x07@\xed\xf9\x00\xc4\x9b\x06\xd2\x01\xcf\x06\ +\xda\x01\xcfG\x1d0\xea\x80Q\x07\x8c:`\xd4\x01\xa3\ +\x0e\x18u\xc0\xa8\x03\x06\xad\x03\xae\xd3\xa1Q\xca\x8e\xb3\ +i\x0e\x14\xdcK\x07\x07\xac\x83\xea\xeb\xc6&iEf\ +Gc\x11\x10/#\x80W\x01\xf1{\xa8\xfa\xaf@,\ +\x8e\xcb\x85\xd6@|\x08\x88\xef\x92\x80\x1f\x10\x89\xef\x01\ +\xf1\x16 V\x1c\xed\x04#\x03\x00u\xbb\x07\x04\xef\x85\ +8\x87\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xfe\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\x93IDAT8O\xa5\x93[\x12\ +\xc0\x10\x0cE\xb1\x0d\xb6fs\xb55]G;!\x94\ +4\x8f\x0fg\xa6\xa3&rs\xe3\xe1\xaf\x18\x1fw@\ +\xc8w\xf5\xf8\xbf\x91k\xf5\xf0\xe1T$\x94\x98~\x0e\ +\xb4D*\xdcZ\xd0\x12J\xfa\x0a\x80[Z0\xe0(\ +\xb2\x8asn\x9b\xc0Z\x85Csh:\x18\xd0\xde\x07\ +\xe6\x1e\x0c$\x97\xa6\x03H\xd4Z\xdc\x04\xac\xc5\x1c\xe2\ +M\x1cmi\x82p\xacS\x80;\xe3\x15)\xdeZ\xe0\ +\x82tc!\x0e\xebp:\xe9\xf7@\xa9\xbc\xc2\xad;\ +\x7f\x8d8\xaap\xd6;\xce\xbd\xfa\x8fW\xbc\x9c\xc2\xae\ +\xed\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\x8b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00RIDATx\xdac`\x18\x05\xa3`\ +\x14\x8c\x82Q0\x0aF\x01\x99 21\xd77\x22!\ +\xe7.\x90\x9e7P\x0e\xb8\x0bt\xc0\x7f \x0d\xc2\xa6\ +tw\x00\xd0\xf29 \xcb\x81\xf4+ \x16\x1c\x90P\ +\x00Zl\x0at\x84\xe0h\x82\x1c\x05\xa3`\x14\x8c\x82\ +Q0\x0a(\x01\x00\x9bf\x16\x9e7\xad\x98\xae\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x02\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01\xc9IDATx\xda\xedW\xbbJ\x03A\ +\x14MLc)XJTD\x91\xd8\xf9\x016V\x82\ +A4I\x13AH\xc4\x80\x8d\x96\x96NZ\xbf\xc4\xca\ +GH\x14T,\xf4\x17\xfc\x89<\xf0E\xea\xac\x9e\x0b\ +we\x18fwgv\xb2\x09B\x16\x0e7\xb3\x99\xdd\ +{\xee\x9c3\x8fM\xa5&\x97\xe3\xb5_=M\x8f+\ +\xf1N\xb9z\xd2F\xec\x03g#M\x8e\xc4\x05\xe0G\ +\x81\x18U\xe5%\xc0\x03(\xe9\x80\xa2\x8f\xc4I \xc1\ +\xae\x92P%@Q$Uy\x81\x13\x84\x11\xf0\xf8w\ +}\xd8\x95\x17Yg\x8f\x92J\xd0\xb5\xbd\xa1z\x02\xd5\ +\x14C4\x8fj\x0bg\xb7[&\xd4y\xa2\x1e\xb7\xf2\ +=\x03\xcd\x07\x86\x9e\x10\xb6\x95\x97\x14=eDy\xc0\ +\xcd\x13\xe4vIsb\xff\x02l\x02e\xb4?\x1cG\ +DDU\xbe\xae<\xd0dR\xb3\xc0\x14\xdaY\xc4\xae\ +\xa3'*a\x04\x84\xf4\xc0\x1d'\xaf\x01\xf4\xa2\x0e\xfe\ +\x9fG$\xb4\x1d\x084\xc3\x08\xe4Y\xaf\x16\xb7\x0f\xa5\ +\xf9O\xb1\x0b,\x02s\xc0{\x0cOP\xff\xf3(\x0f\ +T8\x1ehf\x01\xc5\x1e\x8fB\x96HX\x8e@\xcb\ +\xd4\x88G\xca4R_\xf8M$h$|9\x0c\x08\ +\x5c\x99&\xaf\x19\xbe\xb0Gr .\xf8\xc6\x0c\xe9\x7f\ +mtp\x91\xf6y\xcf@S\xeaG\xc6\x9c\x016\x02\ +\xf6\x0a\xbawo\xb3\x00]\xc6p\xf5\x160\x1d Y\ +\xc3v\x05\x5c\xc1\x83_\x16\x04\x1eX\xb6\xe3\xd8\x9ak\ +<\xb0\x06|\x1a\x10x\xe6\xfey\xcdn\xd9p\xdd\x05\ +s@?`\x9e\xd3\xbdW\xee\xb7-\xad\xf7\xf6\x9aG\ +\x8c\xc4\x12\x91\xd0h\xfe$\x9d\x8a\xd5u\xe2f\xd8'\ +\xa1\x9c/\x07'xD\xcc\x00\xcb\x12\xa1?\xcd\xd1N\ +'q\x16$O\xbcq\x82\x8ct\xffB\x22p;\x96\ +\x8f\x13\xda\x1d\x81\xd5\xc9\xf7\xe1\xbf\xbe~\x01}\x06\x5c\ +\x02\xc1U\xc6\xe7\x00\x00\x00\x00IEND\xaeB`\ +\x82\ +\x00\x00\x00\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00eIDAT8O\xd5\x91Q\x0e\ +\xc0 \x08Cq\xd9\xbd\x99'g\xe9\x06\x06q&\xea\ +\xcf\xb6\xf7SBLmC\x12\x11\x029\xe7{\xe8\xc0\ +\xcc\x09o\xa0\xba\xba\xd8T\x87\x89\x1fM\x1b\x00o2\ +UA\xc7\x8aa\x83\x88\x19.U\xf0\xec\xaa\x85^T\ +#&}\xbfBc\x00gs\xe7\xa3\xd6'~p\x05\ +$\xf3\xbb\xef]\xa1$X\x83\xe8\x04\x88\xd4H\x07\xd8\ +\xd9\x12\x13\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01/\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\xc4IDAT8O\xa5\x92\xd1\x0d\ +\xc3 \x0cD\x01E\xcd\x10\xcd\x0e\xedB\x99.\x0b\xa5\ +;\xa4CD\x8d\x94\xf6\x5c\x83\x8ck\xc3G\x9fD\x04\ +\x0e\x1cg\x9b\xf8Z/g\xf8\x834\xdc\xf7\xc8\xf3\x8a\ +\xe1\xb6G\x0c^\xba\xa4c\x1d\x7f\x1c@t\x99&\xd3\ +\x99\x16N\xf8\xe4`\x1e\xcb\xd59\xfc\x11>\x1e\xe3\x89\ +\xc1\xa1@5\xa0C\xce\x8d\xf3s\x8b\x96\xcb\x0c9\x80\ +\xe2\xbcmf\xbep\xe3\xd5\x09\x90@\x0f\x12\xe1\xf48\ +T\xe8\xa7\xc0\xced\xde\x92\xca\x016\xcbT0\xd7E\ +\xd3\x14\x01\xb9\x19\x85\xe3p\x17\xf7%\xe6|[\xb7\xa3\ +\xb8\xc5\x81\xae\xb4\xb6nu\x02\xed%\x01z \xaa\xd7\ +\xba\xe2\xf8o\x89\x90@\xeb\xa1H\xac}U\x17$\xad\ +\xdc%\xae\x80\xc4\xb2\xfe%\x847o\x1ay\x8cB\x12\ +\xd5\x15\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xe6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01\xadIDATx\xda\xedW\xcdJ\xc3@\ +\x10\xeeK\x88 ^D\x11\x11\xd1\xda\x1f\x22^l\xd2\ +J\x9e\xa1\xde\x0az\xb3\x82\x17\x05\x1f@(\xf8\xb0\x05\ +\x1blS\xd38\x1f\xec\xc2\x12v6\xbb\x9b\x04`\xb8]\x8e\xe6\xb0\xd8\xa2\x0cO\xb8\xcf\x02\x12\ +\xde\x97\xf4\xab\xc9y\xcaq;\xc8\x0a\x8c\xc9\xd4\x04\x1c\ +9\xb1u\xe0\xd4\xc0\xfd\xa1E\xcdp\xb3\xe3\xc6%\xff\ +\xcfJNe\xce#\xdb\x01&\xe6\xbf\xaa\xbf\xf0\xa9\x83\ +'\x91\xd3\xad\xeb<'\xf9+DB\xe8/\xaat\xc2\ +\x19]p\xe0\xc9\x1f\xf8eu\xd1\xfe\xb7h\xd7\xbf_\ +\x7f\xb3\xb1^\xeamg8\x00\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x00\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00eIDAT8O\xd5\x91Q\x0e\ +\xc0 \x08Cq\xd9\xbd\x99'g\xe9\x06\x06q&\xea\ +\xcf\xb6\xf7SBLmC\x12\x11\x029\xe7{\xe8\xc0\ +\xcc\x09o\xa0\xba\xba\xd8T\x87\x89\x1fM\x1b\x00o2\ +UA\xc7\x8aa\x83\x88\x19.U\xf0\xec\xaa\x85^T\ +#&}\xbfBc\x00gs\xe7\xa3\xd6'~p\x05\ +$\xf3\xbb\xef]\xa1$X\x83\xe8\x04\x88\xd4H\x07\xd8\ +\xd9\x12\x13\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\x05\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\x9aIDAT8O\xa5Sm\x0a\ +\x80 \x0c\x9d\x12\x05]\xa6\xdf\x9d\xa6\xb3u\x9a\xfe\xd6\ +e\x82(\xb0&j*\xfb\x08z0\xd6\xb4\xbd\xf7&\ +j\x9cs\xf0\x07\xf6\xda:\x92a\x99z\x87\x11J\x16\ +\xb6\x19\x0e\x13\xbe\x13\xa4F\x14\xccE\xfd\x08R\xc38\ +\xefI\x00\x1bkA\x1b2\x8b\x9c\x9cr\xeb\x09r\x15\ +\x0a\x92C\xd5A\x04\x92PD\xea\x19Dp.U\x07\ +\xd8(\x8dX\x10h?S`ob\x1cK\x22\xf4\xf7\ +\x01\x090\xce\xb5}\xd2[\xd7\xc1\xed\xb3\x9b_\xd7\x8a\ +\x22\x0f\xcdQ\x8c\xff\xaf1d\x11\xdc\x8b\x05\x00\xb8\x01\ +\xef\x94\xd6@\xd4\x8c1\xa7\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\x88\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01OIDATx\xdac`\x18\x05t\x00\ +\xd1I\xb9<\x03iy\x03\x10\x7f\x04b\xc9\x81\xb0<\ +\x0c\x88\xffC\xf1m f\xa7\xa7\xe5\xe6@\xfc\x17\xc9\ +\x01 \xbc\x9b^\x96K\x03\xf1k4\xcba\xb8\x9f\xd6\ +\x963\x02\xf1\x1d\x1c\x96\xc3p<\xad\x1d\xe1\x01\xc4\xbe\ +@\xec\x0e\xc4\xb7\xa0\x966\x01\xb1\x17\x10\xfb\x03\xb1\x12\ +=\xd3\xc2\x09\xa8\x03<\x07*\x1b\x9e\x84:\xc0\x87X\ +\x0d\xea@\xcc\x0f\xc5\x1aP>>,\x0f\xc4,@,\ +F\xb1\x03\x80\x8av@\x15\x17B\xf1\x7f\x22\xf0U \ +V\x80\xb2\xb7\x90\xed\x00\xa0\x02\x0e \xfe\x0aU\x9c\x0b\ +\xc5\xc48\xe0\x1c4\x14`|\xb5\x81v\x80\xfa\xa8\x03\ +\xd0\xcc=\x0b\x15\xf7\x1d(\x07\x14\x03\xf1Jtq\xba\ +9\x80\x94\x02c\xd09\xa0\x80H\x07\x5c\xa6\x85\x03\xf2\ +\x80X\x18\x88\x83\x818\x10\x0f\x0e\x82\xd6\xfb\x92\xd4v\ +\xc0cP\xe3\x01\x88w\x11\x89OQ\xdb\x01\xc4\xe0\xdf\ +@\xfc\x0b\x88\xff\xa0\x89S\xc5\x01_\x09\xb5d\xa1\xd1\ +S\x01\xc4\x86Hu\x08\xd5\x1c\xf0\x05\x88E\x08\xa8?\ +\x04U\xdbF+\x07\x08\x10P\xbf\x1e\xaa\x0e\x14\x0a\xdb\ +\xa9\xed\x00P\xfc\xd6\x03q\x11\x01\x5c\x0c\xcd\xb2wp\ +\xd5\x86\xa4:\xa2\x05\xea\xabo\xd0\x04\xf6\x9b\x00\x86\xa9\ +\xf9\x0eu\xfcvj4\xa1\xd8\xa1\xa1A2\x1e\xed\x84\ +\x92\x03\x00\xf9}\xdcv\x87\xa5\x0a\x0a Icons / Notifi\ +cation / Helpers\ +\x0a \x0a <\ +g id=\x22Screen-1-C\ +opy-61\x22 transfor\ +m=\x22translate(-62\ +0.000000, -295.0\ +00000)\x22>\x0a \ + \x0a \ + \ +\x0a \ + \x0a \ + <\ +path d=\x22M12,2 C1\ +7.5228475,2 22,6\ +.4771525 22,12 C\ +22,17.5228475 17\ +.5228475,22 12,2\ +2 C6.4771525,22 \ +2,17.5228475 2,1\ +2 C2,6.4771525 6\ +.4771525,2 12,2 \ +Z M12.4748737,17\ + L10.4748737,17 \ +L10.4748737,20 L\ +12.4748737,20 L1\ +2.4748737,17 Z M\ +8.47487373,5 L5.\ +5,8.06066017 L6.\ +91421356,9.47487\ +373 L9.324,7 L14\ +.9,7 L16,7.888 L\ +16,11.306 L15.50\ +1,12 L10.4748737\ +,12 L10.4748737,\ +15 L12.4748737,1\ +5 L12.474,14 L16\ +.4748737,14 L17.\ +998,12 L18,12 L1\ +8,7 L15.4748737,\ +5 L8.47487373,5 \ +Z\x22 id=\x22Combined-\ +Shape\x22 fill=\x22#FF\ +FFFF\x22>\x0a \ + \x0a <\ +/g>\x0a \ +\x0a \x0a\ +\ +\x00\x00\x05\x08\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x04\xcfIDATx\xda\xcd\x97{h\x96e\ +\x18\xc6\xe7\xa6s\xfa9\xb5\xb9<\x90\x87r\x1e\xd6\xbe\ +\xda\xe667\x06\x1fQ\x9e*\x05\x0b\xc9S\x05\xa9%\ +\xea\x9a4bakk\x91&\xa9\xa0\x9df&\x82!\ +\xa2R1*,\xc1\x0e\xd8\xc8\xa2,;X\x19\xd5\x97\ +\xd3j\x85BZ\x14\xa5\xe5X\xd7%\xd7\x13\x97\x0f\x15\ +\xd2_\xfb\xe0\xe2~\x7f\xcf\xde\xe7}\xef\xf7\xbe\x9f\xe7\ +~\xeeedt\x87\xdf\xfc\x85\xcb\x0b\xa1]\xf3\x16\xd4\ +\xd6\x89{C\xeb\xc1\x9ba\xfbk\xec6\xf0s\xb0\x95\ +\xe2+\xc1\xcf\xc0\xd6\x88\xfb\x82\x1f\x85}\x12\xea\xc31\ +\xf0\x1d\xb8\xe6\x9cbq\x19\xae[\xa1E\xb1\x03\xef@\ +]\xb8\xa1\x0b6\x09\xd5\x1a\xaf\x85\xf2\x8d\x8fi\xce!\ +q\x97>\xe0^\xe3\x07\xa0\xd1\xc6\x9f\xc8\x81\xcf\xc5T\ +\x81;\xb0\xdb^0\x12\x9ac\x5c\x0f%\xa0N\xf1\x07\ +\x9a\xf3\xaa\xbd`\x18\xbf\xca\xb8\x06\x1a\x0c>+n\x93\ +\x03o\x8a;\xa1\xa1\x7f;\x80?\xe4@\xb7c\xb0\xdc\ +\xc6\xae\x07\xcf6\x1e\x07^\x02;PL\xa7\x16\xc3\x96\ +\xd8\x87\xcc\x04\xdfd\x9c\x04/\x83\xfa\x8asq\xcdg\ +\x14\xc5)`\xce\xe7\xe0\x0fW\xd8\xd85t\xc2\x98!\ +\x9d\xcf\x87X\xce\xe7\xc2^nNN\x05O3\x1e\x0b\ +\xbe\xd9\xd6DB\x5c\x10;\xf0\xac\x85\xfc\x12h\x96q\ +\xad\x1c<#~[s^\x123\xccC\xa0[-\x05\ +\x8b\xa0A\xe0\xd3\xe2\xbdr\xe05\xf1o\xd0\xc5\xee\xc0\ +A{a\x09Tg\xbc\x81\xf94\xee\xd0\x9c\xc3\xf6\xc2\ +\x22\xa8\xc9x%4\xc6\xf8\xb0\x1c\xf8\xd2\x16\xe1X_\ +\x03\xdcR/b\xb0A\xdc\x07\xda\x04\xde\x0e\x9b\xa7\xb1\ +%\xe0\x97aS\xe2\x09\x5c\xbc\xb0\xf5\xe2~\xe0-\xb0\ +\xdbx-'\x97\xe3\x9as&\x8a+q\xbd\x07\xaa\xf9\ +\xa7Z\x90\x888\x0b7\xf6\xf61pn\xc4\x89\x88{\ +b^v\xf4\x9c~\xff\xc5a\xb0I!\xee\xe0\x82\x81\ +J\xa1?\x15\xc2i\xd1\xbe\xdf$^-\xfeZk\xa4\ +\x1a\xdc\xa9\xf0\xa6\xe8\x08\xf8S\xf1:9\xb8>\xd4\x05\ +(\xc7\x1d\xf8\xc2r\x5c\x0d5\x1a?\x05\x0d7>\xa9\ +9G-\xc7\xe5\xd0\xc3\xc6\x5c7E\xc6\xed\x8a\xe87\ +\xb6\x06\x92\x1e:\x96\xd9S\x18\xdc\x0f\x9b\x09]\x0a\xf1\ +\xcb\xbe\x87-\xd5=\xcf\x83\x7f\x86\xbdG\xbc\x14\xfc\x13\ +,\x0bR\x0f\xd5\x09:\xf5-T\xc81\xed\x94_B\ +\xce\xc1w\x89_\xe0{2\xba\xcd\x0f\x9e]\x0b}\x05\ +\xafv\x88Y\xfb\xdb\xc0\x1f\xb2\x00il\x03\xf8\x08\xf7\ +\xbbU\xbd4\xec\xd3\xe2a\xe0\xfd\xb0\xef1e\x8aR\ +\x0b\xa3\xc2\xba\x22\x9e-n\x89\x1d\xf8\xccr\x5c\xc9\x83\ +\xc5x\xa3\x8aS\xe0\x13\x9a\x93\xb6\x1cs\xd1\xae2^\ +\xc7\x0aiLG\x99\xda\xa3\xb6\x06\x0a}\x0d<\xa1\x9b\ +\x99\x9f\x81\xd0\xd5a2\xec<(K;\x84\xdc\xaa9\ +[\xc5'\xa0\xfe\xd0\x8c\xe0$4Su\xe1\x07\xf16\ +9\xbdK\xdc\x01\x0d\x88\xa3P\x1c\x0e\x1a\xf1\x08\xf0\x18\ +c\x1eXe\xd1\xbe/\x09\xfd\x82\xf82\xaf\xf3r\xa2\ +\xb0\xdc)\x8f\ +\xc3\xce\x15\xf7\x047\xaa\x17\xe8%\x07nT\x0aG\x8b\ +\x0b\xc47\xc4\x0e\xb4Y\x8e\xd9\x5c,6^\x05]d\ +\x9c\xd6\x9c\x03\x96c\x9ezu\xc6\x0d\xd0(\xe3\x83r\ +\xe0#[\x03\xa3<\x94\xaf[\xcey\xec.4nV\ +\x8e\x03\x87\x83\xe5-\xcb9_v\xa7\xf1\xdd\xd0p\xe3\ +w\xe5\xf4\xfbbj\x84G\x80_\xd8\xc0\xf3\xdc\xc6\x16\ +\xe8\xa1=\xc4U\xe0\xfb\xb9\xdd\xc2VU\xc8'\xd9\x87\ +\xb0\x07\x5cj|\x15\xb8\x99\xf7\x8a\x87\x88Sq\x0a\x98\ +\xf3I\xb8a\xa4\x8d\x95\x80\xab\x8c\x07\xab\xe1\xc8\xb1\xc3\ +j2\xb7\xa8\xbd\x90'd\x85\xf1P\xf0\x14\xae\x0fq\ +6\xae\xa7\x9e\xd7\x8e\xe9aaK\x9dU\x11\xba\xcer\ +\xce\xe6\x82\x13O\x8a_\xd1\x9c\x9d\xe2_\xd9|\xb0\xd8\ +X\xce\xd99q;\xff(n\xb5r~\xee<\x81\xf2\ +|\x0d\x1c\xb2\x1cO\x84V\x18\xb7\xf0K\x8c\x8fkN\ +\xdar\x5c\xaa\x1d\x13x-4\xde8\xad\xb3\xa1\xdd\xd6\ +\xc0x\x8f@\x15[-\xf6\xf5\xa17\xa0\xd7\xe0\xbdl\ +\xb74\xc65r\x00v\xba8\x05f;\xbfF<\x80\ +\x87\x0c\xec\x1e\xae)9\xf9 w\x0b4Yc\xdfy\ +\x8e\xb2Y\xb4\x1c\xa7\xb4\xf7\x03o\xe6\xee0>\xa59\ +\xc7,\xc7\x15\xd0\x1a\xe3G\xa0\xa4q\xbb\xa2\xf3\x9d\xad\ +\x81\xa4G\x80\xfb\xfd4\x06?\xa6gQ\x04RQ\x04\ +V\xffK\x04\x8a-\x02\x15Q\x04\x1a\xe5t\x93x_\ +\x9c*>0\xcf\xbb\x14\x9e\x01\xa1\xbb\xb5H\xe5G<\ +(\x14*\xfb\xc7#a\x9c\x19\x8a\x90=7?\xa3;\ +\xfd\xfe\x02\x18\xfc\x86\x85\xa5`T\xfb\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x00\xfc\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00\x91IDAT8O\xa5S\x81\x0d\ +\x80 \x0c\x03b\xf4\x1c\xff\xffB\xcf1\x9a\xa0%T\ +q\xbaa\xa4I\x1dts\x14P\x1fct-\x08\xdb\ +<\xbcv\x80\xae\xe5n\x80\x03\xc9u\xea\x8fp\xc5\x92\ +\xd0J=mA\xae\xd4\x8d\x8bG\x84\xce1 \xe7\x09\ +\xec\xca\x8e\x92V\x0e<\x07\x7f\x9b\x84l\xc4\x04l\xab\ +\x87\x8a.\xb5\xd5\xad|z\xb0@\x16[/\x92\xe7\x16\ +x\xc2\xb4\x9b\xe5*\xd4/\x91M\x1e\xd7V \xd5\xd0\ +J\xcd\xae\x96W\x93_\xb5\xdb\xa4d\xcd\x11\xd9\xfe7\ +\xe6hB\xbf\x15\xe7v\xf1\xcd\xb3\xd1w\xeb$X\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x14\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x01\xdbIDATx\xda\xed\x97\xbfKBQ\ +\x14\xc7E\xa1!\x10,tk\x08\xda\x02\x1bj\x8eR\ +hj\xd1!\xe8\xd7\x90\x8deCS\xd1\xd2\xd8\xd2\x16\ +iC\xb4e\xf8'\xb4i:YTCC\x8bA\x16\ +M\x85IF\x93\xda\xf7\xbc\x8er\xb9\xdcgO\xbb*\ +\xc1{\xf0\xe1\xf0\xe5\x1d\xef\xfdz\xcey\xf7\xa9\xc3a\ +_\x1d\xbe\x96V7\x92\xe0\x0e\x0cu}\xf3\xc5\x955\ +\x176~\x0650\xd6}\x03\x91\xa8\x0b&\x0a\xa0\x06\ +\xfc\xbd\xaa@\x81+`\x1b\xf0\xdb3\xd0\xabs\xe0\x91\ +\x0d\x8cZq\xbc\x8f\xc4\x0b\xe0\x01G\xd0i\xc4T\x1d\ +\xe8\x94\xa43\x88\x9b`\x02\x9c@\x0f#\xd2\xb7^\x06\ +\x0b\xd0\x14_\xd9\xc0\x16\xf4<\xdf\x1bQm>\x83\x9e\ +\xd5\xb8_>p%\xe8\x1f\xd4\x9a\x8c\x06YS\xbf=\ +\xa0,\xdc\xaf\x82\x8a\xf4\xf9YU\xa9Bt\x93\xddz\ +AN\xd0\x06\xb4\x90\xa4)\xc6@\x80\xf5;b?\x18\ +\x07\xb4qU\x91\xbfk\xd6+\x1d\x06\x8a\x88n^o\ +N\xf1\xf9D\xb3a\xd1j\x80\xdb\xba#\xe4g\xa1\x9d\ +\xcd\x060$\xf4\xc8\x0br\xac+\x0d\x22\xd1\xaa\xa4\xe9\ +~\x0c\x04\xb8\xc7ED\xb7\xb4\xee)x\x02\x03\xbf=\ +.\xda+\xc0\xeb:\xe9\xa9\xb2\xf2\xbcv\xc4@+\x07\ +\x86l\xe0Ra@5\xd5q-\x06\xa4\x19\x18\x04\xe7\ +\xd0\x1f\x88\xa5\x06\x91hI\xd2\x9f\x88{`\xdal\x06\ +\xda\xad\xc0\x14\xa0\xc3\xc8\xcb\xd500\xd1>\xb0\xae\xbb\ +\x05b\x89[\xd1\xda\x0c\xbc\x80\x03\xe88\xf7\xd8@\xd0\ +1I\x97u\xcf@\xdaB\xfe-\xf2\xef\x11'A^\ +\xf7\x0cd,\xe4\xd7[\x10\x06y\x1d-\x08\x0b\x06\xd2\ +\x16\xf2\x0f\x91\x7fL\xefy\xf0 \xbc\x8c\xda6\x10\x14\ +\x0c|\x81\x1b*3b\x03I\xd3A\x95C\xbc\xa67\ +\x1f\x1bxC\xec\xfb\xcbo\xb8m,r\xc6$\xa1\x93\ +F\xacc\xae)?\x01\x1d\xb0\xff\x0b\xfe\xbb\xeb\x1b\xc9\ +\xfb\xd7\x13\xad&L\xa9\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x00\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00eIDAT8O\xdd\x93\xd1\x0a\ +\x800\x08E]?.~\xb9atc\xc55\xad\x97\ +\xa0\xf32\x86\xf3p\x057\xdc]\x18f\xc6\x0b;\xaa\ +:\xe2<\x04s\x03\x8aA&\xc2\x9be\xbb]\x88&\ +4\xce2\x06\x15\x80\x8e\xe4V\x10d#\x80RP\xf1\ +Z\x80d\xdf%\x00\x7f\x12T\x1b\x97qJ\x10\x92\xa7\ +\x22:BG\x84z\xfa\x9d{\x88\xac\x1d\xf5-\x8f\xc3\ +r\xe1\x95\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04M\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x04\x14IDATx\xda\xcdW}L\xceQ\ +\x14~U$\x94\xbc\xd2\x87,\x9f\xf3\xe6\xcd|d-\ +LS\x93lY6\x9f+[MM\x85B\xc3l6\ +b\xfc!B\xd6\x1f\xac\x86\x0cM\x96\xcfe\xb3\xd9d\ +\xf3\xfdG#\xf9\x1c\xcd\xb0\xcc\x98\xaf\xc9V!y\xce\ +\x9c\xcb\xd3\xf5\xf2\xf7\xdb\xf6\xec\xbe\xe7\xf9\x9ds~\xe7\ +w\xefs\xef=9\x1c\xde\xf0\x97\x91\xbd2\x1a8\x9e\ +\xbe\xa4\xb0\x88\xb8`\xd8\x071\x96\x00=\x85\x83\xed\x87\ +\xdf\xdb\x81*\xc0I\xbe\x85@\x0d\x9e\xbb\x89\x9b\x0b\xfb\ +$\xc6\x14\xc3\xc1\x8e\x85}\x0a\xc8\xb1\x0b\xb8\x05t\xc1\ +\xa1\x0b\xe3\x04\xe5\xf6\xa9-\xc8\xd3\x049j\x0b*\xd4\ +o\x9c\xe1\xf0\xfc\x8er}\x80o\x1a\xdfI\x05<\xa2\ +\xf8\x91\x5c@\x1d\x150B\xb9b*`\x9e&\x98C\ +\x09\xb6\xa9\xdf0*\xe0\x82r>\xc0'\x8d\x7fC\x05\ +\x5cU\xdfN \xdcA\x0fz\x03y \xe3\xac\x99\xc9\ +\x02\x9f\xca\x1c\xecY@\x96\xc5\xc5\x02\xcb\xe0\x1f@\xdc\ +P\xd8\x05\x18#(_ l\xe1\xc6:\xbc\xea\x0f\x95\ +\x0d\x14q\xa1\xb24\xe2z\xc0\xde\x841\xdf\xf2]\x0a\ +\x08\xefK\xdcl\x8d\x0f!Nfe\x17F7\xcdJ\ +\x04\xecR`\x86]\xc0\x15\xd2\x80[\xb92\xd2@\xa6\ +&\xc8 \x0d\x94\xd3\x0e2\x1a\xb8\xa9\x5c/\xa0]\xe3\ +\xdb\xa8\x80\xbb\x14\x1f\xc5kXo^f\xb6\x12\xc6R\ +S\x14\x90\xa9\x893\xd4\x16\x94\xa9_\xb4\xe1\xf0\xfc\x9a\ +r\xfe\xc0\x17\x8do\xa5\x0f\xbdM\xf1Q<\x0325\ +;@.$N\x92l\xd6=\xde\x83\xf8\x02`\x0b\x0b\ +Nv\x09\xb0\x13\xfe\x83\x89\x9b\x02{\x0f\xc6\xf1\x960\ +\x85K\xf5:\x11\xf6\x05\xb2Qa\x9c\xb5\xbd\xd2\xf9$\ +S\xdf\x99@\xba\xc5\xc9\x09\x97\x03\xff~\xc4\x0d\xd7\xad\ +\x1dI\xf9\xfa\xc3\xce\x05b\x1c\xd6\x8bN\x93\x06\x86*\ +\xb7\x814\x90f\xd4NkX\xac~Q\xa4\x81:\xe5\ +|\x81\xb7\x1a\xdfBE\xd5\xabo\x1b\x10\xc6_\xd0@\ +\xbb`\x92r\x15\xb4\x0b\x96k\xe2\x5cR\xf1!\xf5\x1b\ +O\xbb\xa0\x89\x8e\xe2\x1f&\x9e>\xf4\x09\xc5\x8f\xb2/\ +\xa3Z8\xac#.\x08\xf6\x11\x8c\xbb\x01?\xf3e\x22\ +6\xe0\xa8\x5cV\xe4[\x04\x9c\xc4\xf31\xc4\xcd\x87}\ +\xce\xba\x8c&\xc0\x16.\xd7\xbbD\x88\xca\xe4\xd4\x9b.\ +\xdb\xd1\x12W\x1f\xd8\xc9|b\x9a\ +\x07\x95\xba\x86\xdf1\x86*\x97O\x1aH\xd4\xa4\xd3h\ +\x0d\x0b\xd5o\x10\xf0U\xe3\xab(g\xb3\xc67QQ\ +g4\xf6#0\x80\x0b\xb8G\x22\x9c\xac\xdca*`\ +\xb5&(\xa0\x02\xaa\xd5/\x8eD\xf8\xd8\xe8\x87\xf2\xb1\ +\x08\x9fQ\xbc\x8b\x0bH\x00\x1a\xe1\xb0\x9f8\xd9^\xd7\ +1\x9e\x95\x844\xad\xd2\xd1\xdc\x90}N\xbe\xe5\xc0]\ +Y\x06\x16&\xec\x07ryQ\x01ri\xdd\x97\x8b\xcb\ +\xe1u\x7f\xd2\x09\xa1\xc2\x00K\x5c\x91rU[~N\ +`\x88\xc5\xf5\xee\xd6b\xfd\xb9\xce]\x1e\xde\xe32\xdb\ +\x9a\xc9\x12]\xb3wf\x7fc\x5c\xa0k\xd8\x0eL\xd4\ +\x82\xe4\xd0i\xd35\x5cL\xeb\xfdZ\xe3K\xb9\xcf\xd4\ +\xf8K\xf4A\x15\x1a\xfbT\x0e+.\xe0!\x89&A\ +\xb9c$\xc2\xb5\x9a`\x15\x89\xa8F\xfd\xa6\x92\x08\x9b\ +MGm\x8bPg\xe4\x05\xc5\xbby\xaa\x17\x01\xefA\ +^\x943A9\xe9v_I\xa7\x0b\x84k\x92P\xfc\ +\x96;]x3+\xb2\xb7\xcf\x03\x1f\xa4_\xa0\x9c{\ +a\x7f\xc6\xb8\x95\xbb)\xd8\xc2UK\x9c\xd7\x890\xd8\ +\xaeJ\xaeWiL,?\x7f\xe9n-\xce\x87\xef\x06\ +\x8awzx\x8f\xd3\xd3\xcbW\x88\xb8\x10\xd0(\xfd\x9c\ +r\x892]\x18[\xcc\xcd\x05{8~\xbf\x04Z\xe5\ +\x98\xa5\x82\x1a\xb4\x07\x5cM9O\xc0\x96\x13\xb2\x92\x0a\ +\x92f\xb6\x03\xb8l\xfe\xdb\xfa}MR?\x90\xa4\x5c\ +\x0d\xf5\x03\xeb5\xe9\x1a\xea\x07j\xcd\xf1L\xfd\xc0s\ +\xf3\xe5\x94\xaf\xcbhE>\x86\xe2c\x1cV\x9f\xd7\xae\ +]\xab?\xcd@\xeb\x7ff \x85\xce\x00\x99\x81\x0e\xd9\ +%\x94\xb3Vg\xe0\x00}\xe8F\xbd7\xba\xcf\x80Y\ +\x1b\x0f\x1a\x08\xfa\x87\x06\x82\xecC\xc7\xd3\xda\xfeu\xeb\ +\xfd\xf2\x0d\xf1*\xf1\xff\x04\x8f\x07^\xb5\xbe\xa8\x80\xde\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00eIDAT8O\xdd\x93\xd1\x0a\ +\x800\x08E]?.~\xb9atc\xc55\xad\x97\ +\xa0\xf32\x86\xf3p\x057\xdc]\x18f\xc6\x0b;\xaa\ +:\xe2<\x04s\x03\x8aA&\xc2\x9be\xbb]\x88&\ +4\xce2\x06\x15\x80\x8e\xe4V\x10d#\x80RP\xf1\ +Z\x80d\xdf%\x00\x7f\x12T\x1b\x97qJ\x10\x92\xa7\ +\x22:BG\x84z\xfa\x9d{\x88\xac\x1d\xf5-\x8f\xc3\ +r\xe1\x95\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x07\xe6\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a o3de icon\x0a \x0a \ + \x0a \ + \x0a \ + \x0a \x0a<\ +/svg>\ +\x00\x00C\x13\ +\x00\ +\x01\x9f\xd1x\x9c\xed\x1d\x09\x5c\x8c\xdb\xf7\x9bR!\xd4\ +\xc3#)e\x8dl\xf9{\xc8Z\xf6}_\x1f\x22<\ +\xbb\x92\x84,\xd5\x90%d\x97\x9d,E$B\xa4\x92\ +\x22\x22k\x12\xd9[H4\xed{\xd3\xcc|\xff{\xee\ +\xf7MM\xd3LM3\x93&\xba\xbf\xdfy\xbdI\xf3\ +}\xf7\xdes\xee\xd9\xef9\x04\xc1 T\x09\x18\x0cB\ +\x9f\x98\xa7M\x10\x0b\xd0\xff3\x99\xd4\xe7\xb65\x19D\ +\x18\xfa\x9d\xa9)\xfdy\x00A\xa4\xb7`\x10FF\xd4\ +g\x8f\xd6\x04\xd1d>\xfa?}\xfa\xb3&A\xdc\xdb\ +\xc1 45\xa9\xcf\x8bj\x10\xc4\xe2\xe3\x0cb\xfb\xb8\ +1C\xeb\xd6\xd6\xae\x8d\x1e]w\xf8\xb0A\x13\xe0_\ +\x01j\xc2\xabgZ{\xa0wj\x1b\x0e\x1f\xd4\x7f\x92\ +\xed\x87\xe4\xcf\xa3\x975\x88\xfa\xa2\x9a\xf6\xa8\xd5\x18+\ +\xa2\xc1\x86\xe8e\xdeM\xe3w\x5c>1\xe4\xb9\xd9?\ +\xb5/\xd5\xb09p\xd0\xccP\xe5\xcc\xe5'\xdb\xa6]\ +\xf3h9\xcd\xac\xd6\xf8I?\xaf\x98\xaeh|\xd9P\ +\xc9\xac\xf9 \xb7\x05C\x0f\x8c\xaeU\xbf\xc5\x88\xc6\xcf\ +'\xef\x98\xda\xff\xf9\xf1\xd0eg{t\xeb\xb4\xeb\x80\ +\xf1\xf6\xe8\x87\xcf\xb4\xe6-{\xa4\xd75\xd3\xa4k&\ +\xa7\xbb\xe9\xf4\xb4\xf4w\x09G3\xbb%\xe4Y\xfb\xe9\ +8=>~\x8c\x11\x9c\x909\xfcp\xc8\x94\x93\xd7n\ +\xae&\xec\x08\xe7\xd9\x8c\x98\x06\xdc\x97\xdf\xec\xdb\x11\xe4\ +\x1b\x87\xa0\xd3\xe4\xda9\xad\xbf\xec\xdb\xdf\xe9\xc8I\xf4\ +\xf7\x1b\xfcf\xbex\xc3\x08o2\x83\xe58%\xcc\xe4\ +\x95C\xb2r\xfb^.\x8765\xaa\xa9\x1e\xae4\x17\ +\xfd\xdd5}\xb3\xb6\x9e\xb7\xffG\xf4\x9a\xb7\xd4\x8c\xd8\ +\xca8\xa1j\xa5z9)\xf2HC\xe6\x05b\x01c\ +\x94\xd7\x83\xde\x87\xdc\xd5\xffk\x14U\x83i\x7f\x98\xac\ +=\xfda\xea\xfeN\x1a~\x1f\xfe\xc7lG\x98\x18\x07\ +\xae\x8a\xf9A\x84\xa7f5>=\x99\xd3\xe9g\xc6^\ +\x83\x8e\xcay\x8c`e\x83[ut\x9a\x10hns\ +\x88\xd9\x03\x97~ip1\xae\x1d3uJ\x9c\xee\xc4\ +\x08\x95\x8b\x87\xe6)\x99\xea\xdd\x0c\x22\xbc\xe2\xd6\x0c?\ +\xbc\xcdc\xd3|\x22\xba\xff\xd2\xbf\xdd\xdc\xd4'n\xcf\ +`\x9c\x9e\xca\xd1\xf2\xd9\x11\xdd\xc9\xac\xd9Ym\xb7\xd3\ +*\xfdg\xbe\xd1\x1f\xd7\x0b&\x16\xcd\xfc\xdb\xf5Dg\ +\x15\xaf\xa5i\xbbl\xfa\xefh\xd7\x84X\xa7\xe7\xa0\xb3\ +,\xf1@@\x07e\xad\x89\x8b\x9dM/\x12\xe1C\xb3\ +S\x1d\x1d\xd7\x7f\xb3\x1c\xcb\x989i\xce[\xfd\xc3O\ +c\x996\xcd\x99\x1bV\x92k\xbc3\x0e\x14\x9cd\xa4\ +\x05\xf0N66\xf8\xa0\x14\xde8\xed\xd3\xa3\x80\xec\xbc\ +A\xb3\xae\x13^\xdd\xbc\xf5\xd3\xe3\xcevd\xbex7\ +\xbdN\xf0K\xf3x\x83\xd4D\xe5\xb4\x1b\xb3\x1a\x0fz\ +\xf7E)\xfcBN\xca\xc0\x19\xb7F\x0e:\xd6n\x91\ +\xd7\xc6\x83f\x9d\x17\xadW7]\x9eA\xd6\x99b\x7f\ +vnH\xf8te\xbb\xd5w=,\x18\xa7\xc7\xa6^\ +\x0b\x1b;i\x96\x9e\x8f\xa6\xd6-\x96\x8aE-\xf4\xb0\ +\x0f*\x84\xc9\xa6\x9d\xeb\x9cr^\xd7\x8b\x19\x1a\xf8b\ +\xda\x8b\x0c\xe2\x87\xb3\xd7\xe7mo\x13\x0c\xce&~\x8e\ +b\xedv\xefP\x97\xe0\xd6\x9d\xe9\xcd\x1e\xad\xe9\x17\xa9\ +\xe290\xf8:\x81^\xfe\xbf-\xee\xcd\xcd\x87\x13\xde\ +\x19\x0d\x8e>\xb9\xaei\xd4\x97\x98\x96\xbf\xbd\xc3\x9c\xe1\ +5\x8fh\x13\x979\x83\x0e\xfd\xafo\x8dQ\xea\x84\xdd\ +\x87\xb8M\xcf\x1bo~\xbc\xb4\xd3\x91\x9e\x83\x17=\x99\ +`n\x17{\x7f\xcf\xf5\xa8-\x8f'\xde]f\xb3\x9c\ +11G\xb9\xed\xb4/\x1f;\xd9\x0dv\xea\xd3J%\ +&s\xc8\xa9V\xcb\x8c\x89,\xb5\xf5\xf6*kR\x9b\ +\xef\xf7&:\xd6\x98\x90\xcd\x99\xdf\xb5\x99\xaa\xbf\xc6\x14\ +\xfb\x16\xed\xec\x16Y\xb9X|f\x9c6\x09\xe9\xd3\xc1\ +N\xc5\xa9\x8f\xe5\xed}\xdc\x1a\x89\x89J\xde\xd1c\xdd\ +\x0e6L\xd4\xd2X\xe4\xa6n\xa5\x87^\x7fi\xd1\xd0\ +\x93f\x1b\x8f)\x9bF?\xf3\x1e\xcb\xd6m\xf0j=\ +;\xf1\xfd\x22\x9f\xf3\x9d\x98wW\xe5\xa6F\xa4\x1et\ +z\xc2^xs\xc6\xee\xa8\xd7*1+\xb9\x83\x96x\ +^\xdc=E\x97`/\x09\xea\x1a\x91\xba\xdb\xc9\xb0\xd7\ +\xc4\xa7\x87\xe6\xde\xf4!B\xdd\xa3\x9b\xfc5\xd9=\xd1\ +\x7f\xfad\xe2\x87\xa3\xbaYD\xea\x0e\xa7K\x11\x93\x93\ +\x991w\x1d\x99l\xeb\xe8\xe8{\x8bMZ\x18\x0c\xef\ +\xdfTs\x94K\x81\xde%\xdd\x1a\xce\x1b]\x5c\x1f/\ +\xfep\xe6\xcd\xe7\x1d\x86\xb7\x08\xdb\x5c\x03k\x9f\x86\x86\ +>J\x97\x163f\x12\xedM\xf6M\xbc9\xcfu\xf4\ +\xbac\xb9\xf9jw\x0fu\xb0k\x15\xb9y%\xd7k\ +\x15\xc95y\x9bk\xd43\xa8]~#'7\xbb\xba\ +\xfa\xb3RL\x0e\xd5%\xec>\x9e\xe9\x14\xb6\x7f\xe8\x00\ +5\xcd\xa6K<\x0bR_v\x9c\xdf\x84\xf8\xb6\xca\x0c\ +\xd1\xa9z\xfb\xf4\xddj\xee\xbcy\xee\x9d\x82\xa7F\xb4\ +6h1\xf1\xa0\xd7\xd3\xd6\xca\xa6\xb33\x1d\x86\xf8G\ +\x0e\xfaoG\xd7u'y\xa6~\x8d\x82U~\xd6o\ +\xb0\xefb\xa7\x83\xec9~\x84y\xa6\xebc\xb3\x11o\ +\x7fj(\x99F'_\x18\xe9\xef3\xe8\xbfK\x9d\x02\ +-\x83.LRg\xaeqh\xb1\x86}\xda\xf2\xf01\ +U\x9dC\x9dZ\x87\xed\xd8z\xfc\xaf:y\x9a\xb5\xba\ +\xc5\x9e\x0b\x0fX?(\xebvN\xe6\x84\xfaa\xban\ +=V\xe6\x9b\x04\x8dJ\xd1?\x196g\x95\x9d\x86'\ ++ b\xf9\xf6\x7fB\x88\xd0\xda\x0ei\xb3\x88\x1f-\ +\xb7\x98E\xb8\xb7Z_\xc7\xa6\xe0\xaf\xba=\xbe\x9e\x9b\ +\xa7\xa6Y\xb7GB{\xfb@rJ\xeb!\x9a\xcf\x02\ +\x9f\xc4\xed\xc9\xee\xdbj\x7f\xefa\xad\xd6\xb8u\xde\x18\ +e\xb3*\xf4\xad\x7f\xed5u\x0c-\x19uF\x1e\xde\ +{\xf9\xafZ\xdd\xe6\x9c\xfe\xb8\xe7\x80\x01\xc7i\xebq\ +\xcd\xba\xa9\xbe5#\x93\xa2L\x98\xc3~\x04\xab\xf5\xef\ +\xe2{\xf0\xe1'\xcf\x0e\xb3\xda\xac1\xf2=8\xb8\xd7\ +\x01\xcf\xcc\xbf=F\x84\xb4\x9d\xd6d\x1a\xa7\xa3qG\ +\xb3^\xff\x8b2_\xaenYOoH\xab\xff\xd8\xc3\ +\xd3\xcek\xfd\xc8\x09j\x5c{\xe5\xc8\x7fG\x91\xb7v\ +\xf9\xb9w\x98Q\xf3\xad\xf1\xae\xda\x0c\xab!\xfe6\xb3\ +\xfe\xfb'h\xfd\xee\xa5k\xbe\xdb\xb4\xd9\xd6\xbe\xc1\xe2\ +\x89\xbc\xe4SV7\xae\xbb\x04\x1d\xbco:\xcd,:\ +\xe4Y\x5c\xa3f\xe4\xf5\x87FF/\x8f\xde7\xf9\xa6\ +l\xea\xdab\xd1\xe1N'?\x0e\x1e0\x1aM*\xbc\ +\x81ehp-\x870\xfb\x1e\xc7\xef\x1d\x1b\xf6\x83\xe8\ +t\xb2^L\xc4O\x02mL\x1f\xde|\xf5\x03\x99\xc7\ +\xef\xf4\xdb\xb58\xd5\xd9+\xbb\xc96\xa7\x86\xb7\x08\xb6\ +\xdb\xc8\xef\xdd\xef15^Yu\x1d\xb3\xba\xe0\xaf\xbe\ +W>\xc7{\xfa5m\xda2M\xa7\xaf\x83\x81\xb6e\ +\xe8s\xab\xaeh\xca\xf7\xbfq\xe0\x95\xdb\xfd\xdc/\xdb\ +\x5c;qI\xe3\xc3\xbd\xb3\xa9*\xc1\x06\x11\xee\xd6\xbd\ +\xe6M\x0aL\xb0]\x19\xa2l\xf1\xcaH\xf9\xf4\x89}\ +\xbc)\xceY\xbes-\xdb\x1d_\xfe\xf7\xb8\xd1\x19\xab\ +\xcc~6\x0aNd7\x8b{\xdd\x94\xa2\x9e\x0e\xedg\ +\xac\x08\xb2\x0bZ\xec=={\xf3\xf1.7n[\xfc\ +\x9b\xff9X\xab\xb3V\xd3%!yY\xaa\x8e\xa7\xd7\ +\xd9\x85.o\xa8\xc14s&'9\x10G\xdcoG\ +[\xae\x9e\xdfy~\xcc\xe6\xec\xab\xb1\x8d\xf6\x853>\ +5\xe9\xfbL\xdfc\x96k\xfa\xf1\x05\xfaA\xb9\xb3\x03\ +l.N\x1a\xf7i\xb9\xde\x8f\x9c\xa8@\xe3\xf3\x7f\xad\ +\xde\xec\xfcQ\xab\xbfU\xca\xeb)\xcec\x97[9\x9f\ +\xbe\xb3:\xf0\xc5\x05\xe7F\xa6\xae6\xdb\xdd\x1a\xe6|\ +T\xf3\xe7\x8e\x18}tp\xc8\xf3\x13\xbcK!\xa6\xbe\ +z{\xfc\xf7\xcc\xb5\xb6W\xff\xfa\xba\xa9\xce\xc8v^\ +\x1a\xc1\x13[\x12\x1f\xdcG\xb6\x8cuxD\x0e\xf5\xaf\ +\xf9w\x17B\xbbkD\xf4\x8e{_\x1a\xa1\xa7\x99\xcf\ +\xed\xde\xd2L\xe7\x8d\x8fr\xea)\xd5\xa4\x03\x9dvm\ +\x9e\xac\xaeV\xeby\xf8\xca;\xc3\xfdk\xeen\x5c'\ +\xcfje\x9ef3\xb3\xbeK\x0a2\x16>\xccf\xdc\ +A+\xea\xbc\x5c\xbe\ +\xd9jaV\xcd!l\x8d\x16\xf5\xaf\x9f\xef\x9c\xb4Y\ +\xc3\xd5\x8bXZC\xb9_\x1f\xffu\x91\x99fJ3\ +\xee\x9aeg\xcdoyF9\xbf\xb5+\xb3\xbb\xf9\xd4\ +w\xf3\x8d<\xb7\xec\x1d\x96\xd2\xd6,l\xddn\xcf\x19\ +\xdd{\xdcF\x13\xeb\xfb\xe8\xf8\x8a\xa5\x89^\x06\x015\ +\x0e9\x04\xb48\xd3f\xe2\xf7\xb7\xedU\xee?\x8b\x9b\ +\xf2YoV\x0b?O\x1b\xc2J?|]K\xae\x17\ +\x22L+^J\xd3\x97[\x98\xf1f\x84\xe7\xdd\xe0!\ +\xfa\x08\x95\xce\x0fI\x8e\xf2\xd8+\xbeQ\xddN\xe7f\ +\xdc\xfc\xd0\x95\x810\xbc\xcf\xc5iV\x03t0\xc3\xb2\ +\xe7\x8d\x88\xaes\xd9|-1\xe95\xd9\xc3\xf1\xda\xbe\ +!^\xc6\xf5L\xb7\x0e\xfb\xc1Lx\xab>\xad\x19\xb1\ +z\xcc\x8d7\x13\x8fN\x9e\xadN\x10\x06\xef\xebz\xef\ +\xeab\xfc\xc3E\xd3\xfb\x1fB\xfb\xfd\xfc[Sv\xf5\ +\xe9\xe5\xb9\xae\xbd\xfe\x93\x8d\xa63\xd6\xb6\xab\x81\x84B\ +o5\xefYw.\x05\xd5\xf7\xfcR;\xed~\xe3\xf1\ +\xddf\xd5b\x8cT\x0e\xbe\xc23\x09\x7fg\xc6\x89_\ +z\xd3\xb5\xd1\xeb[\x91\xdfW2Vg\x0e\xa8y\xfb\ +\xac\xca\xde\x17\xdf\xb4\xfdwz~Q\x22|:\xde\x7f\ +lo\xa9\xc1x\xaa\x14\xfc\x82\xe7p\xce.o\xb3\xbd\ +\xb3\xcb\x93u3\xd9*6J-k|2\xd6]\xfa\ +/a\xecN.\x1f\x17\xf8wp\xc7\xfb\xff\xf9u\xab\ +\xd1!\xc0\x0b\xfd\xc2\x95\xec1k\xbe\xcb\xacU\x17\x06\ +4\xf0\x990ud\xfc\xd2\x85\x87\x16\xddn\xb2f\xc8\ +\x9e#\xab\x17\xed\xac\xdd\xa1`JO\xf4%\xdb\x8b\xb6\ +\xea\xc1\xef<\xc3\x13\x0f=\xb9\xb4\xc2*\x81u\x92S\ ++\xe8f\x8d\xcb\xe3\xc7|\xfd/\xd6z\x9b\xab\xf1\x1b\ +\xc4/B\xef.\x9a8\xf7\xc6\xf4\xae\xd3\xea\x13\xab-\ +\xdd\x16\xbf\xd5\xb1oq1g\x14a\xfe\xbc\xd1\x9c\xd0\ +\xae\x7f\xbf\x0e\xb28jm\x9c\x10\x10lK\xae\xecR\ +\xcf@\x97}{\xf0\xb2s\x93o<\xd8\xfa!mn\ +;O\x0e{\xdf\x12\xf8\xde\x95\x99]\xcf\x91\x1a\x8bf\ +\xec\xbdz%\xb5\xdd\xcdv\x8b\xae\x9d\xfa:\xfa\xc8?\ +\xf1\x81\x1f\x1c\xbe\x7fIdwj\x93\xb0&s\xc6j\ +\x8d\x9c[\xe6?\xe6Y\xbc\xecg\xb0\xf5^\xee\xe1M\ +\xc6\xeb{\xc7\xe7\xd5\x1d\xea\xb5\x98a|\x99\x5c\x8e\xb8\ +\xa1f-\xbf5\xdb\xf4]vG\x1e\xfb\xf7S\xe8\xb3\ +\xb8\xee\x9b&\xf6\xab\x93s+.\xe3\xa2\xe3\x08\xe7\x95\ +\x93\xdak\xa5\xc5\xbe\xf81\xe7DP\xc1\x10\xff\xb6u\ +\xaf]V7W\xbb\xc1&U\xdf\xf8\xd6\xf4L\xf0\xe7\ +\x9dq\xbd\x92ek?2,`r\xaf\x03!\xdf8\ +m\xda$\xf4\xe8\x12\x9e\xfc(~\x22\xc3\xdd\xc4q\x80\ +\xf2g\xfbG{\xd4\x8e|\xf9rs\xe5?\xef\x92z\ +\xbfWWIq.\xb8\x98\xcd\x1e\xf3b\xf9\x5c\x8e\xc1\ +\xc2\xa4]&\x88\xb1\xbal\xff\xa7_A\xce\xd8\xd6\xd3\ +\xdb\xbdq\xaa{\xb3\xe7\xa5\xf8\x09\xcf\xb2\x08\xef\x1b\xa4\ +\x09\xf7\xb8\xdf\xc2\x84\x8bw\x1b\x11\xe3\xe6\xf5\x0a_\x82\ +\xb8\xbd\xb1Cn\xdd\x17\xd1v_\x9d^~C3\xfa\ +\xd9\x22\xf29\xa7\x11s`\x01\xc9\xcc7\xab\xdd\xdev\ +\xf1No\xc4k_|\x19\x13\xfb62z\xc4\xd5H\ +\xe7\xad\xc7\xbb\xe4\x0c>n\xd3%q\xee\x12\x02\x11\xff\ +G\x7f\xc2\x93\xb5\xfe\xd0?K'\xbb\xd6\xcb\x8a\xeb\xca\ +hp\xa3\xc9\x89\xc0\x93\x13\xfcgX\xfd\x9c\x14\xbcO\ +c\xd9\xd1/J\xb7s\xd2:\xb6I\xf0\xed`\xb2\xea\ +\xd1\xa5\xce\x8e\x8936\xfb-\x1e?\xba\xa3\xb3e\xff\ +\x96\x8f\x1e\xce\x083\xde\xf8x\xf1(\x8b\xb1\x8dv\xff\ +Pz\xdb\x89g\xb4\x94\x17t$\xd1\x8c0Ug\xb8\ +\xa4n\x9d\xa2M.V~\xbd\xf3\xe3\x88+O\xf5\x92\ +,V|\xeaY\xef\xd0\x95u\xaf\x1a9,\x8b{2\ +H;\x90\xe4\x05mp\xb0\x5c\xb0\x22 \xb6\xdf\xc9\xc9\ +\x8d\xdf\xd7\xd2;\x15\xe5[sd\xab5i\xef}Y\ +#\xb6f\x9f|\xd52b\xb0\xc7v\xaf\x96#\xb6\x7f\ +\xabW?\xec$g\xb8\xd7+\xef\xd5\xadr\xc3\x1a\xf0\ +\x8e}\xb7\xf7J$\x9b~?\x14io\xd4\xd6v\x9c\ +Wo\xd7\xcdHrd\xae\x89\x8ey\xf1\xe3/\xf7\xb7\ +u\x17\x05L\xd6{\xe6\xbbi\xb2A/\xb7\x99:5\ +\xd1~\x9fH\xca\x99\x17\xb39h\xae\x8a\x0f\xbb\xd3I\ +t\xa4\x1b\x10[4\x12\xee\x84\xbf\x1c7i\xed\xa0O\ +c~\x8e\xaa7\xb5M\x04\xbb\xd6\x04\xaf\x88\x87aM\ +\x9b.\x99GD\xce\xbb\xf2\x83\xb1\xd3z\xa3\xf9d2\ +Z\xff\xe6\xe0#]\xea\xf6\xcc5\xdcy8L\xb7\xd5\ +\xfe\x80\xdd\xd3\x82[&\x7f\x08\x09\x22L\x8fjZM\ +h\x8f\x94\xc6\xb6S\xb4j\x866\xfc\x1a\xd6\xe0\xad\xc6\ +\xf5wo|\xff\x193\xd8>\x7f]\x8fh\xed\xb3l\ +\x8fFJc\x16\xab\xb4\xd5%\xb6D\x1c\x9d\xc9c\xd4\ +\xf7l\xf2|Y\xd7\xa1G\x1b\xb0u\xb9\xf1K\xbd\xce\ +\xf6\x9e\xe3\xfdj\xf1\xa4\xda\x8c\x0b>J:\x0d\x88\xd5\ +K\xff\xd3arW\xf7\xf4=\xff\xa5\x85\xb6\xe5\x84\xb9\ +a>\x0d\xa632\xa6\x0e\x1f\xff\xc6\xf2\xafP\xfb\x80\ +\xe9\xce\xef7&\xf4\x18\x10\xc7\xaa\xd1\xe2\x8c\xf2\x93\xab\ +\xea\xe6\xc4\xc1\xf1\x96;\x8dr>\xbeY\xb89\xf8\x00\ ++9b\xf0=D`\xaa\xcc\x06\xad\xf7\x07$\xf9\xf6\ +\x9e\xd6\xc2\xcfq\xc6D\x87\x9d\x9d_\xea&Y\xf4o\ +\x15\xe9\xb6\xccs/c\x5c(\xa2\x7fD\x0c\xc3\x1b;\ +j\x1bu9\x1e\xd6y\xe0a\x9b+A\x93\xdf\x8f\x1e\ +\x18\xf9\x99\xd8\xf3\xb8FT\xb3\xbb\x7f\xeb1u\xf3\xb3\ +Ng\xcdo\xbb\x93az\xe5\x96\xff\xdd\x9d+b\x0d\ +j\xee\xbag\x8a\x04\xc4\xe3\xec6\x0b\xba\xc6}\xed\x91\ +\xd0\xd0B\xc5\x88x\xdc\xc0m\x06\xc3\xb0\xaf\xf7$'\ +\x86\xe9)\xa4\x02<\xfc\xc69\xf4\x8e\xd5\xd4\xa0\xcd\xc5\ +\xad\xe8\x17\xcd?\xd76\xce\xbd\xc8\xa9\x1f?\xb7\x0e\x91\ +Q\xc7\xc2Q\xdbo\x0as\x87\xf2F\xf4\xa1a\xd8\x14\ +\xe6\x8aE\x97Fh\x11\xdf\xda!\xfa=\xdbU\xe9\xd2\ +M\xa5\xc8\xa6.\x9ai?\x12\xc7\xef\x8b\xea\xb6\xda\xa7\ +\xf9\xfa\xcf\xeb\x0f\xfd\xe5\xe9d06\xcfe\xdd\x80\xf0\ +L\x86y\xd2\xc8\xb6\xfd\xaf\x9b$\xce\x0f=\xefS\x7f\ +\xac\xfa\xa5\xd5W\x1c\x13\x02\x88\xfd\x13\xbb\xe6\x9e\x9a\xef\ +\x16}w\xe1\xf0\xcf[&\xf7\x8e\xba\x97\xc9\x08_9\ +\xb3\xcd\xbe]\xa3\x07\x0e\x0b\xfd:\xfb\xdb\xf4\xd9\x86^\ +ji\x1b\x88avZ]w.\xe3\x8d\x1c\xd1jM\ +\x07\x93\xc0K:./V\xc1o\xb3I\xaf/\xef\x8f\ +\xe4\x18tk\xaa\xd9\xf3\xfc\x0bc\xe6\x05eS\xeb1\ +ow?\x1f}\xf1\xfa\xcf\xe8\xff\xa6\xcf\xd9\xb7\xb7\xd7\ +\x9b1'\xf7\xd7\xdc\xcb\xd6ws\x1d\xd5rWd\xc2\ +\xe9\x88\xe9\xc4X5\xe6$\xd2a\xf7s\x87\xd6n]\ +{^[AL^\xa0\xd4G\x97\x18\xba\xa5\xdf\xe6\xc3\ +:\xdc\xa9['\xb57u9\x8a\xfe\xc84\xeb\xf6\xb3\ +m{\x87]\xf2\xeb\xef\xd6\xd8\x8b\xf73\xf9\xe5\xfd\xd7\ +\x0c\xfd7u&\xae\xda6\xad\xf3\xba\xe6\x91J\xe3\xe6\ +\x1b\xeee\x98w\xadG\x5c\x1a\xbc.d\xdc\xe2S\xf5\ +\x88\xc9\xec9\xad\x1e\xb1<\xbb\xf4\xd5%\xea\x1b+\x9b\ +\x12FV\x9b\xcc\x88\x16\xadm\xfdf\x84\x12\xfa\x19F\ +\xaa\xcc\xe7_l7\x84o\x8f\xbcOx\x1f\x8dR;\ +9\xacc\x1d\xa2\x85\xc6<\xe2\xdd(\x97n1\x83\x08\ +\xe5\xe0\xd5}g\xae7\xad=\x87\xd0\x5c\xab\xa5\xcc\xec\ +3\xf6fH\xaf\xa4\x07\xe8OG|\xec\xbfo\xc8\xdc\ +yZ\x17\xedj\xeeX\xdb\x8bh\xd5\xac\xc6\xf8\xc5\xbd\ +\xdb\xd6\xdf\xd0b\xd2\xbeG{\xfbr-\x0e\x1e9\x90\ +k\xbdr\xe2\xe0Y\x0e\xfa\xcf\xd0\x147v$n\x0e\ +S\xc9\xd0KRz|`\xba\xcb\x85\x88\xf3{g\xe5\ +\xee\x1b\xa7\xefy\xbd\x9d\xf3\x05e\xfd\xc0v7:E\ +\xb3\x9e\x8fq\x19\xd6\xf7\x90\xe7\x93!\xad\xd0\xb4/>\ +\xef\xb9~sN\x0b7\x8d\xe17C'\xadm\xf3\x00\ +=\xc3\xe5~\x92\x92G\xffK\xad\xcf?i\xa8\x1f\x93\ +Nh\xf6\xd66\xb4a\xde`\xd4\xde[{\xeed6\ +\xc9|\xa4L\xec\x1d\xf9\x15\xe9\x19?}S\xd6\x0e\xd4\ +{\xbaA\xd5\xd0B=!\x9f\xd8\x9b\xb8\xf3\xe4\xa4\xff\ +\xc6\x1a_\xad\xad\xbaanGb\xf2y\x82\xa1J\xd4\ +\xbf:_\xc9\xdc\xdbw\xcb\x1eUu\xed$\x8b\xbf\xd7\ +[LVE\xbff\xbe\xbb\xa7\xc9L:\x1c\xceza\ +g\xb82\xf9\xf5Q\x1de\xd3\xd6\xfb\xf5B\xe3'\xaa\ +\xb9G\xdf5@\x8a\xe1)W^W\xdb~D\xab\x06\ +=\xb5-\xbf\x9f\xd5g\xec\xbf\xe7\x19A\xe8\x07\x13\x84\ +~@g\x0e:&?}S\xdb!-\xb0%\xd7\x9a\ +\xa1\xff>\xbe\xc3\x16\x06\x11\xb3\xc5\xdcpO\x96\xaf\xf5\ +h\xe6.\xd5\xf53\x1e\xaa\xce~}\xf4\x84\xf5\xb6\xbd\ +\xc8\xea\x7f\xd6\xc1r\xe7]\xde\xbbq\xc7\xb3Z\xa7\xd5\ +\x09[\xea5=^M\x8bX\xbb\xbfy\xf0\x14f_\ +\xa4M\xec\xe8\xb7\xbb/\xf7x\xd2\xae\xf3\x0dU\x99c\ +\xd8!s\xda\x07O\xbf\xc7\x1c\xcb\xd1~\xd9\xc1r\xf8\ +\xec\xad\x1aF\x84M\x84\xde\x8ba\x0e\xed\x17\xd6\xe8`\ +\x93oc\x9a\x95br\xe3\xb6\xd7\xb3\x96\xc1[\xb4\x08\ +\x7f\x9b6\x06\xfd\x1a!]jo\xd6|+\xf7a\x1e\ +\xb5\xba\xc4\x06\x04\xd9\xa8\xdf\xd0Q5e\xfc\xd4X\x8c\ +\x14\xef\x91\x17zv\x5ct\xab\xf7\xb9m\xee;\xf5\xbf\ +\xdc\xef\xb0\x8d1\xcet\x8b\xc6\xe2e\x1e\xbb\x947\xb5\ +\xf1\xb7\xe9\xa5\x7f\x97\xdct\xe9\xb9\x03\x93\x91v\x0a1\ +\xc0\xb0\xb5\xef5k\xaan\x18\xf1\xe9\xda'\xfd\xfaK\ +\xea\xeb\xe5)3\x1f\x05-\x1b\xd1\xf8L\x07U\xd3\xbf\ +\xfe\xeewy\xa3\xa5I\xe8\xdd\xbdd\x5c\xaf\xcf\xb9\x87\ +w;\x99\xac\xf0\xf3\xbfk\xd0\xef\xd6\xa4Z\xca\xa7\x1f\ +\x7f\x9a0e\xbbZ\xf7\xb9\x03-\xe2FO5\x08\xe8\ +\xban\xd0\xf6\x7f]\x86\xabX\xb6u1\x22F\xdc\xce\ +\x1d\xb5K#\xb9`d\xff\xd6w\x1f\x8c\xe9\x1a\xe1\xa0\ +\xd9\x92\xbb\xa4\xcf\x12\xbb\xe5HC\xdc\xbcC\x8bh=\ +\xea\xc5r\xc3.\x8b\xe69\xab\x0d\xeb1\xef\xe4\x7f\xde\ +\xbe\x83\x8fv9\x18\x96\xdf\xb1\xf5\xdd\xa1\xe8\xdbO\x8e\ +\xd8\x9e\x1fb=4\xe4\xb9\xadMv\xdb\x81\xa7k#\ +\xbd;\xc5\xb9\xd9\xbeNC\xbe\xe4em\xb5\xf9+\xe7\ +!\xd1\xf6\xeb\x97eC\x8ef-\xa8\x994\xf6\xe6\xd2\ +\x7fz\x06\xb9G\xa6\x04\xc5\xa3/\x0e[h\xfd\xc4G\ +\x89\xc8\xbe\x1bc8>\xfd\x83ql\x0a\xdaJ\xc3\x09\ +\x17\xff&<\xf2\x07\x1f>\x1f\xd7m\xc5\x93\xcfz\xe6\ +\xc4\xa4\x83/\xbe\x1d\x1ci\xfdU\xfd\xe5{\x86\x85\x0f\ +\x19\x96\xbd\xda\xdd\xd0$\xe6D\x80I0\xf1.\xea\xc1\ +\xb2!\x17\xcf\x9d`\xaei\x1e\x13\xbfJi\xdel\x9f\ +v]?\xccn\xdb/0\xf6\x08\xfc\xb3\xc7\x13\xaf\x8b\ +\xbe\x11\x83\xf3L\x8dbB\xcey\x0e\xed\xeb;7\xdc\ +6:bl\xae\xcb~\xf4D\xd7\xdc\xce\xa1\x84\x07R\ +\xecn\xed\xff\xd8\x93\xf1a\xc7\xbd\xa1S\xf7\xac\x8bc\ +\x9cE[x*\xbaf\xbb\x8f\x19~\xdd\xb2}'\xcc\ +\x1b\xf2\x06\xcd\xe0\xe7\x87\x10\xdf'\xf6\xb7\x91\x98\xe9\xe3\ +\xf7%\xe5\xc3\xd0\xed\x8e\x0c=dCL\xb0\xf4\xbe\x1a\ +\xfeiB\xa3\x03\x99K.\xeb{\xa9(\x9f\x1e\x81\x98\ +\xdd\x88\xd1\xea\x8d\xda_ne\xb9\xa4\xaes\x96\xde\x83\ +\xcc\xa6\xcd\xe3C\x92?\x0c\xcc\xf6\xdf\x8e\x1e\x14i\xce\ +\xb9P\xb7u\xb3\x86\x97\x06-m\xa3\x17rr|\xbe\ +A\xac\xb6\x9d\xde\x9e+\xcdV=\x98\xb0\xe8B]\xce\ +\xdfs\x89\xc8\xc7\xed\x86\x9b %\x1d\xc9\x01\xad\x82\xb3\ +\xa3\xf3kOz\xec\x917\xe6h<\xd2W\x8cx\x07\ +V\x9e\xe7\xee\xe8B,98,%\x06\x09\xfb\x88\x87\ +\x1e#\x8cb\x06.\xf3\xa8\xbb\x93\xccWC\x9b>\xde\ +\x7f)\xd2\x9f\xe3\xaa*\xf7\xcb\xfa\xe1\xd0\xc3\xfar-\xa4T\x0f\ +\x1a0z\xf7\xb2\xb7\xa9\x8f~\xe4\x8e\x5c\xe3\xfa\xec>\ +\xb1(\x1c)acN\xa5\xb5\xbf\xa1\xe2r\xd4\xd9\xb4\ +\xad\x0e\xcb\xa9\xee\xf0\xc3#\xde\xbal\xf7\xf9Z\xc0\xdd\ +\xf2\xa9\xf1+\xa5+}9#\xdf\xbb\xdf\xff\xef\xd4R\ +\x8dh\xff\x94\x95\x0b\x88#\xdf\x9e\x0c\x9a\x9e?x\xc0\ +\xa4 D\xa8\xedUagG\xcd\xadS\xfb\x7f5>\ +-\xb4\xb6\x7f\xfaj\xa7\x9d\xe1\x1c\xe2\xc8c\x0b\xe5A\ +n\x93yK5N\x06\xbe\xbbP_\x95\x196%j\ +\xcd\x0a\xa4\xf7oe\xaa\xdf\x0e\xccP\xaeC\x8cDS\ +\xae\xc3\xd8\x969 ^\x0d\xd91#\xfc\xf5-\x0f \ +\xec$%7|TC\xe7qK\x17\x13\x95;\xeaL\ +r\xc4\xe1\xd0]\xce)\xc4\xc0\xe0\x9e}&\xe43\x02\ +_\xdcP7\xef2ou\xb0E\xe6#K\x9b\xe4\xd8\ +\x19W'\xf1\xfa\xb4$\x1a\xb9\xa9\xc7-\x18R\x13\x1d\ +\xb6\xe1\x8d\xb7\x8c\x08_\xb0<\xe2\xca\x89\x84\xab\xe6\x8c\ +\x18-\xa6\x17\x9a\xfc\xd3.Mw\xd8>D\xa6'R\ +\x05\x1d\x8f>\xb4\xf8y\xf6]G\x15o\x15\xf3\x80\xb0\ +\xfc\xd1H\xa1\x8b\xab\xb3Q\x09\x99M+rr\x5cg\ +\xe9\x9e\xfb\x97 fw:\xec\xf82a\xe0\xc2e\xc9\ +c\x89\xe4\x08\xf7\x8c\x1d\xe6\xc1\xdbR;\xab\xe8\xde\xbc\ +\xe8t\xfc\xc1\x85\x1e3\x03\xfc\xaf\xd6\xbe\xe8b\xfb\xe8\ +\xda\xccN\xb9_\xf4c6\xd9\x5c\xbc\xf3@\xab\xb1\xd5\ +\x93\x9c\xb9\x96\xd7\xfc\xefn\xbb\xe1;q\xd6\x15\x8ei\ +\x7f\xb3\x85D\xcd\xe3G\x9e[\x052G\xfb,M~\ +\xdf\xc6\xe1\x8c\xca\xd7\x1e[\x18\xc17\x89\x01\xce\x83\x07\ +\xaeP\xd35\xfc\xd9*\xd4\xd4\xb5\xc1\xd8\x94k\xc3\xee\ +^\xb9\xa1rzo\xbakw\xa4\xe09X?gn\ +GV\xb2\xf1\xfa\xe3Q>\x8f7\xa5\x1f\xe7\xe8\xeb\x13\ +\xf5j\x18\x22\xf6\xa1\xd2c\x9bF\x80\xf5\x8c\x8e\xbd\x9f\ +u\x9c\xbf\x02-\x7fj\xf2\x97y\xfb#G\xdc\xf9\xaa\ +E4\xd4PR\x0a\x9e\xf83b\xdf\x82\x05+\x9a\xba\ +\xda\x05\xecF6\xf4q\xafnGf<\x89\xe3|\xee\ +\x01\x8ap{\x87\xc5c\xd5\xc9q:\xc4\x8d\x08\xf7s\ +\xb9\x8b?+\xa9\xde\xb3\x9f\x12\x95k\x85\x9e\xd3)\xe0\ +K\xf4\xfaUwn\xab\x87\xab\xc4\xac\xf9Y\x7f\xc2b\ +\xc4\xff\x0f\x8fU\x03=\xf7\xef\x8fK\x8f7\xdf\xf7\xe9\ +^\xe0\xc2\xe3\xb3f\x84~tr\xb8\xf2\xa0\xf7!\x86\ +\x97z\xda,\x820E[\xb4\x860\x8bpw\xcb\xd8\ +\xc4\xd0C\xa2\xa1K\xf7\xc8\xef\xef\xbblB{\xfci\ +\xfd\xa1\xd8\xcfw\xbb?m\x9f\xbe\xdbA\xdb\xe1q\xbc\ +uk_\x15W%\xcd\x03\x9d\xda\xb9\x1c~\xf1\xcd\xa8\ +\xe7\xd5\xcf\xd9>\x13W\xd7\xf3\xb7\x9e\x911\x17)\xd9\ +G\xfe\xfdt\x1f\xbd!):j\xe1\xa5<5\xf7\xe9\ +\x84\x1da\xef\xd2\xa9\xdd\x9b6Zis\xdc\xc8\xd3_\ +\xf7|2<\xf4\xe2[V\xcbg\xb7\xee\xe4\x05\xef~\ +\xcf\xbbY?u\x9a\x11o\xdcuu\xc2\xbbi\x8c\xcd\ +\xbeq\x0d\xd0\xcbu\xd60/\x9e\xf1\x8ex\xd9q~\ +\xcf\xbc\xc5\xbbs\x8f\x91\xa6\xf9\x9d\x08\x82C\xc4\x9c\xb7\ +\xd9~\xb1\x1fb0G\x8e4\xf5\x9d\xfd\xbe\x8b#\xb2\x01\xbe\xcf\ +\x9a\x9f>\xb7\xddS\xfb\xc0n\xf6m\xb3C\xac;2\ +;Yu\x0fvq6\xfdQ\xab\x07\xd2\x8dW[]\ +\xf8\xdc\xb56\x9a\xe5\x07\x86\xdb\xd55\xd3b\x93\x0f\xe8\ +q{\x1cLV\xc2\xeb_H,t\x1b9\xfa\xad\xba\ +\xea\x86\xfc\x90\xfe{T785\x8b\x1ap/om\ +_\xe7\x11\x81\x88\x16\xde\x98\xacI\x8f0^t\xd0\xc5\ +\xec\xfekD1\x09\x0fM.G\xaa\x10>mB\x9a\ +\xfc\xdc\x7f \xdby\x87\xdf\xec\xf8\xcb\x0dk^~7\ +\xa2\xe0\xca'\x87\xb6\x1f\x95\x08c\xada\xdf\x94\xf4\xea\ +\xf0\x9a\x8c\xe8\xab>.\xa9\xb7\xe6\xbe\x03\x93/\x87\x14\ +\xa8\x04+[\x85\x8ckqaD\x7f\xcf\x90\xf9\x93\xeb\ +0]l\x87\xd6^\xa6\xa2\xd9\xf3\xcd\x9au\xba\x9d<\ +\x8f\x0d\x8f5~W[\xdf\xfaXC\x1f\xff\x19\xaf\xee\ +2\x82\xa7\x10\xfbZ&\xaf\xcfU\xcb9\xaa\xd2\xf6A\ +\x13F\x8bGm{g\xcc\xf68\xf6/s\xc0<\xec\ +\x0c\x9c\xb0\xca\xcc\xcb_\x85\xb0Z\xa5\xbfO\xf9\xe0\xcc\ +\xec\xa9#\xbc:\x12\xc4\xed\xb6\xdc\x14'\x8f\xb3\xc7\x12\ +\x17\x8df\x9c6\x19e5\x92\xad[\x7f\xfcp\xdf\x1d\ +zy\xef\xc7\x8e6#\xe08L%\xec\x22R\x0f9\ +e4\x9a\x12\xa7K^\x8a\xef\x1c\xf9Z\xc5hf\x8d\ +(U\xcd\x8b-\xb6\xf4\x0aHX\xa5\xc2\xbc\xeb\xa5\x19\ +\xa04h\xc9\xed\xc9\xb7\xdfL\xed\x98\x98\xa8\xa4\xd5k\ +\xdeR\x13%\xadC\xf6\xb9\x83\x9auGH\xcb\xbb~\ +*\xe8\xdd\xb0\xc6\xc1V\x7f\xf5\x99\xb8w\xd8\x13%\xed\ +\x13G\x97\xb6%\xb2\xdc\xb7\xeah\xe8_\x9f];\xf8\ +\xe1\x92C\x05S\x22\xd2\xea\xed[\x17\xed\xc8RvJ\ +Zu\xed\x8b\xbdC\xf3\x89\xb7\x9c\xcc\xb6\xaf\x19\xb5\xb1\ +\xb9\xe9\x7f\x87w\xae;\xb9\xf4\xc8\xe2\xf5\x83\xae>\xe8\ +\xdd\xcc\xdc\xf5\xb9\x9a\x93\xc7\x1c\x8d,\xff\x05\xb5'\xf6\ +\xd8>{\xfb\x9a\x995\x062\x1f\x1bjd\xf5Z\xa0\ +\xfdz\xecv\xf3\x9a\x9a\xff\xde\xcfz\xa21M\x93 \ +\xd0\xef\xff;4\xc9>\xf8,Ah)\x0djs\xed\ +r\x86r#U\x22XS\x7f\xc9^w\x17=oc\ +\x82\xb9\xa1\xa6\xd5\x8e\xbd\x1e\xdd\x1b{]\xe10\xeb2\ +\x88o\x17j\x06\xd5\x98Z\xa7~\xb2\x81J\xcc\xc8\xae\ +\x17\xd8\x86\xd7\x92//\xb2\x8b\xbd\x9f\x10sCyP\ +|\x07\x22\xef\xd3\xe5\xc1\xfd\xdexg{\xdb\xda\xfd\x8c\ +K \x96\xadw\x1cT\xaf\x8b\x8aWF\xe7w\xf9g\ +\xeb\xf6\xad\xf7\xc9\x09{\xbcG\x13\xc9\xb7\x82\x8c\xf7\xf5\ +\x9a\x10~*a\xcfG\xee}\xbf\x99c\x10Q\x9e\xee\ +z\xeb\xadZL\xbf\xdb\x81Zk_+\x8dZ\xe7q\ +\xa1Y\x1c\xc3\xfc\x87\xb3\x97\x9d\xb2W7\xd3o\x7f\xfb\ +\xa2\xfd\x8d\x1e\xd6\xc8\xf4(A\x80\xdf\xbc\xb1\xcf\xdb\xe0\ +&?\xafk\xfe\xfb\xa3\x9dO\x00\xef\xbaM\xff\x83\xb5\ +\x01\x1d\x16Z\xc1\xc6\xb6u\x9a\xf8=\xfd\x1f\xb3K\xef\ +\xa1y\xb9\xe7\xfe#\xb4\xb2,\xefE\xc5\xe87\xef9\ +\xa3\xf6\x87\xfe'\xa3\x875v;\x12\xc1 \x08\x1c\xc3\ +\xe8bT\xf3\xf1\xda\x09\xe1c\xde\xec\xee\xe1oqx\ +\xf2A\x0d\xc2\xb1Y\x8d\xc6\xa7U\xfa\x1f\xb6Y\xebd\ +8m\xeb\x94t=\x8f\xe9\xe9uw\xd7b\x0e`k\ +\xa1\xa7\x987\xbf\x18\xdf\xce\xe7<\xef\xa0M\xffK\xf1\ +\x8f\x09\xa3\x1f7T\x1b\x13\x1bTn\xd5\x1e\x16\xfa?\ +\xa6\xde\xe9\xcf\xc9\x87\xdd\xd5'\xb6\x1f\xaaf\xda\xdc\xae\ +\xff\xab\xa9\xe1\xf5\xda\xfd\xa4\xc2\x16>\xf3\x03L\x86u\ +\x8c\xe9\xb2s\xa9\xd2\xe9\xbd_\xfe\xa7\xa5j\xa5=\xbd\ +\xc7\x193\xffQ\xdf\x16\xb5[\xf4\xbc\xe0\xdfE\x17\xd2\ +:\x8cl\xfc\xb8\xc3\x95:\xcc\xb9\xebX\xa75\x82\x0d\ +\xd8W\xed\xcc\xdb\x8e[\xdcn\xd1\xd3\x95\x8d\x09N\xe3\ +\x0f\xdb\x03\xd4#\xb6\x5c\xdfa\xa0t\xba\xa1\xdd\x943\ +\x1a\xd35\xb3~\x9a\xf0j\xd4Q\xbd:\xac\xbfg\x0c\ +s\xca\xfb\x89\xe1\x86\xebG\xf8\x9b\xaf~\xa2F\xfc\xb5\ +\xf65\xa9\xdc\xc0\xa2\x87\x91\x96\xb6\xdfr\x08[\x0d\x1f\ +\x08\x1c\x11\ +\xe8\x15\xd5\xf2\xbe\ +\xeaA:\x8d\xbbr\xdb\x05\x02\xf8\x07\xbb\xa2Z\xcf\xaf\ +\xba\x10K\xe3Pb\xfc\x0b\xe0^\x8fUm\xdf\xff\x0e\ +\x10\xc2\x12\xf0\x11I\x88{\xf0+\xeeV\x80\xb9W\x83\ +|`7K\xc0W,\x01\xfe\xc1\xb7\x5c\xed\xd3\xfd}\ + \x85\xc6\xa9X\xfc\x0b\xe0\x1ebK~\x0a0\xe7j\ +\x90/\xf8\xb1\x04\xe2\x86\xa5\xe0\x1f\xe2\x8b\xd5\xb6\xde\xef\ +\x07\xf94nK\xe0_\x00\xf7\x90_\x10\xaa\x00s\xad\ +\x86\x8a\x81P\x96@\x0e\x89\x08\xfc\xcfb\xfdI\xb9\x1b\ +\xcbu\x11\xe8\x90,\xcb\xa64h\x93,\x0bm\xea\xff\ +\xad\xf5\x114'Y+\xf4\x05~O\xff\x9b\xa5\x0e\xf5\ +=\xf8~e\xaf\xa1|\x00\xb85\x13\x83\x7f\xc81\xbb\ +\xa5\x00s\xfc\x05\xf8Fx\x5c\xa1G&\xad\xed@&\ +o\xecI\xa6\xed\x9fHf\x9cYJf^\xb6#\xb3\ +o\xed\x22\xb3\xfd\x0f\x90\xb9\x0f\xce\x91\xb9\xa1\xee\xe8\xe7\ +Y2\xdbo\x1f\xfa\xbd3\x99yi\x1d\x99\xe1\xba\x88\ +L\xdd3\x86Lfv'\x93l\xdbS\xcf\x85\xe7\xc1\ +s\xad\xaa\x04=\xf8\xd0\xb8\x16>\xfb\x90g\xf8\x1b\xe6\ +\xeb\xe9\xd2\xe7U\x17\xe3+u\xe702\xf3\xe2\x1a2\ +\xe7\xbe+\xc9\xfe\x18JrS\xbe\x91\xbc\x9c4\x92\xc7\ +\xce#I\x1e\x8f,up\xb9\xe8\xefrI^v*\ +\xc9I\x8a!\xd9\xefC\xc8\x9c\xa0cd\xc69K2\ +e\xdb\x002i\xb5\x01\xcd\x17\x14\x9a\x16\x92i\x5c\x0b\ +\xe7\xf28*\xc0\xdc\xe4\x07p\xd6\x11\xafNZ\xd5\x86\ +L\xdd=\x86\xcc\xbe\xb9\x13\xe3\x8b\x9b\xc1Bx\xe4\x94\ +\x8e\xe7r\x0e^A>\xc9M\xfdN\xe6G\xdc&\xb3\ +\xbc\xec\xc9\x14\xa7Ad\xd2\xca\x96\x94\xacPL\x19\xe1\ +(\x84{\xb0\x0b\x1e*\xc0\xbc\xe4\x83wt\xfe\x92\xed\ +\xfe\x87\xce\xa5\x05\x99\xff\xea\x16\xc9\xcdL\x92+\xbeK\ +\x1d\x88G\x00O\xc9{r\x99L?f\x8ee\x0c\x9f\ +\xffT\xfa\xde\x14\xc1CV\xf1\x1cR\xb8o\x90\xa4\x00\ +\xf3\x92\x03\xde\xbb\x229\xbd\x96,\x88~\x86\xcee\xde\ +\xaf\xc3\xbb\x88\xc1\xcb\xcb$\xd9\xef\xee\x91\x19g-(\ +]\x01\xf8\x81b\xc8\x85$\x1a\xe7|\xfc\xc3\x9d\x93\xaa\ +{7\x03\x9d\xaf\xa45m\xd1>/#\xd9_\x9e\x91\ +$\x87]\xa9x\x17\x1e\xc3m9\xf6\xb3\xfc\x8e\x83\xf3\xfd\x1d\xf6C\ +\xffB\x1a\xc8c\x15\xd5\xdd`W>\x8eK\x07\xc0=\ +/+\xb9\xb2\xd1T\xa1\xe3\x17\xd3\x00\x9bUT\x8bD\ +q\xf1\x8f\xe4=\xf0\xfc\xdf\xf5\xdc\x0b\x8f\x82\xf8(2\ +u\xd7\xa8_A\x03\x8a\x8f\x7f\xb4\x07\xa0\xeb\xfdJy\ +\x0f\xf6\x04//\x8b\xe4e\xa7\x90\xdc\xac\x14\x1c\xeb\xe1\ +\xe5e\xffR\x9f\x12\xfbs\x18\x99\xb2\xb9_E\xd3\x80\ +b\xe3\x9f\xb6\xf1*T\xcf\xe7\xf1Hnf2\xf6\x19\ +\xe6>\xba@f\xdd\xd8\x86cy\xe0\xb7O\xdd3\x16\ +\x9f\xc3\xd4}\xe31\xff\xc9<\xbf\x92\xcc\xbe\xb9\x83\xcc\ +{z\x19\xd9\xefo\x10]\xa4U\xdc\xbc\xd0\xc8{q\ +\x9dLZ\xd7\xa9\x22\xe3\x06\x8a\x8b\x7f\x88\xd5\xaei\x87\ +\xed\xfb\x8a\x18\xbc\x9ct2?*\x98\xcc\xf2v\xc4\xbe\ +C\xbc\xcf\xd6-\x04\xf2;\x04r<,u\x8arC\ +\xe0\xe7\xca\x968\xb6\x04r\x1ar\x02\x80>y\xf9\xd9\ +\xf2\x9f$\x97Cf\xfb\xee\xa6rP*\xc6O\xa8\xb8\ +\xf8G\x00~=y\xfbv \x0e\x98\xfb\xd8\x83Ls\ +\xf9\x97L\xb25,\xc2o\xb9\xce\x98nal\x19~\ +&\xaf\xefL\xa6\x9fZ\x80\xfd\xfb 7\xe49xH\ +\xfe\x00\xef\xa9 9\xa0\x98\xf8G\xf8\x00\xbe\xcbI\x8e\ +\x93\xdf>\xb2\xf3\xc8\xfc\xf0\x9bd\xda\x81)\xe8\xfc\xb6\ +\x90o\x5c\x9e\x9fg\x80\xf8U\xfa\xc9\xffpN\x89<\ +\xf3\x0b\x0ab_\x92\xc9L\xe3\x8a\xa0\x01\xc5\xc3?\x9f\ +\xef?\xbf&\xb7\xfd\x03\xdd\x11\xf2\xb6\xe0\xb9\x15\x1a\x7f\ +\xa5\xe9 y\xc3\xff\x90\x1e\xe1D\xe5\x99\xc8e\xf0\xc8\ +\x9c\x80\x83\xb4\x1c\xf8\xcd\xf1\x8f\xce~\xc6\x99er\x8a\ +\xe3\xf1H\xf6\xbb\xfbX\xbeS\xb9\x01\xbf(\xd6\x06\xe7\ +t\x85\x1e\x99~\xc4\x8c,\xf8\x1a!\x87u v\x92\ +\xfe\x13\xd9A\xe3\xe5\xed#V,\xfc\x83,Ez\x15\ +\xd8>2\x0f\x1e\x97\xccE\xbac2\xb3\x07}\xe6+\ +\x87\x96S\xb7\x0f\x22\xf3\xdf\x06\xc9\xbe\x1e4\xf2\x9e]\ +!\x93V\xb5&\xe5\xc8\xbf\x14\x0c\xff:8o\x87\xe4\ +\x14\xc8\x8e\xfb\xb0KdR\xe5\xc5\xd5\x04h\xa0)\x99\ +\xb2\xb1'\xd6\x0de\x1d`o\xa6\x1d\xfaW\x9e\xf4\xac\ +8\xf8\xc7z\xb4\x11\x95\xbb#\xdb.\xe1s\xaf\x10\xb8\ +\x17\xa0k\xec\xc7x\x1f\x223\x0d\xe4=\xbbJ&\xd9\ +\xc8\x8d\x07(\x0e\xfe\x11MC\xfe=\xe4V\xcb2@\ +\xdec\x9e\xaf(\xb8\x17\xa0\x81\xd4\x1dCIN|\x94\ +L\xeb\xe3f%\x93\xa9{\xc7\xc9\x8b\x07(\x08\xfe\x91\ +\xce\xbf\xca\x00\xdbg\xb2\x0c\xd0\xf3\xb1\xaeWY\xf2^\ +\x02\x1aH?1\x0f\xdb\xf4\xb2\x8c\x9c\xc0\xc3X\xbf\xfc\ +m\xf0\x0fg\xc3y\x84L\xf6\x12\xd8\xf7`\xe3)X\ +\x8eu\x09:\x07\x1f#\xe4\xfc\x80\x9c\x92v@\x8c0\ +\xd9\xa1\xbb\xfeA\xef?\xbfR\xea\xd8:\xe4\ +\xd0\xa6\x1f\x9eYu\xce\xbe\x00\xdd\x83\xbe\x22m\x9c\x00\ +\xe2\x97i\x07\xa7\xca\xba\xee\xca\xc7\xbf\x95\x1e\x99\x13|\ +B\xaa=\x80\x0165\xbeW\xa5\xe8r_\x04\xfe\xc1\ +'\xc0\xf9\xf1I\xca\x95\xf3\xc8\xac\xab\x1b\xab6\xfe\xe9\ +\xfb\xd8`\xb3K\xb7\x05h\x0f\xaemV<[_R\ +\xb0\xd6\xc7\xb5\x05\xa4\x1d\xb9\x8f\xce\xcb\xaa\x03T2\xfe\ +up\x0d\x05\xb8G/\x15\xfa\x91\x1d\x9d\xb6gl\xd5\ +\xe3\xfd|(\xf4yIwG\x15\xe2\xcc\xf8n\xb1\xf4\ +\xbc\xafr\xf1\x0f\xf1\x91=cp~\x9d4\xa3 \xf6\ +\x15}w\xa6\x8a\xf1~>\x80\x0c\xd8jJr\xd3~\ +H\xb5~NR\xac\xac~\x80J\xc6\x7fSd\xc7.\ +\x90:\xd6\x0b\xb9a\xf8\xfe\x5cU\xd1\xfbK\xe0_\x17\ +\x9f_\xf6\xc7GR\xad\x1f\xf2\x16Sw\x0e\xaf\xc2\xf8\ +\xd7&3/\xae\x95Z\x07\x86\x5c\xcc*\xcb\xfb\xf9\xb0\ +\xb2\x05\x99\xfb\xf8\xa2T\xeb\xe7\xe5f\xcaj\xfbT.\ +\xfe-\xb41\x0e\xa5\x1a\xc8^\x84|\x5c\x9c\x93Y\xd9\ +8\x94\x05\x10\xee\xb2\xfd\xf7K\x87\x7fv.u\x87\xb8\ +*\xe3\xff\xf6\x1e\xe9\xd6\x9e\x9f\x8ds\xed\xaa\xfc\xf9G\ +\xf4\x0by\xaeR\xc5\x03\x10\xdf\xcc\xbch+\xcb\x19\xa8\ +\xba\xf8\xcf\xcd\x90w.D\xa5\xe1\x1fp(\x95\x0c\xc4\ +\xf8_\xfbg\xe2\x1f\xd9~`;T\xc2\x9d\xe9\x0a\xc0\ +\xbf\x94:\xd0\x9f\x8c\xff\xbcL\xaa\x96\xce\x9f~\xfe/\ +\xfd\xa1\xf8G6\xa3\x9cb\xa0\x95\x0bh\x0fp\xec[\ +\x9a\xc1- 3=VWi\xfcg]\xdf*\xe5\xda\ +e\xd6}\x14\x03\x90\xed\x0e\xf9<\xd2\x0c\xea\x0c,\xa8\ +\xba\xfa?\xf0\xbe\x0b\xab\xa4\xce\xf7\x85\x1a\xbdU\xd6\xf7\ +\x8fA\x17\xe7r\xe6=\xf7\x96\x0e\xff\x10\x03t\x99V\ +\x85\xf1\xdf\x14\xdf\xb3\x95\xf6\xce\x1c\xd4{\xabRq\x7f\ +a\xa0\xef\x0e\x16\xc4\xbd\x92j\xfd\x90/\x97\xe24\xb0\ +\xea\xfa\xff\xe8\x9cX\xf0cJ38?>\x90\xc9\xf6\ +\xdd\xaa\xb4\xff\x1f\xfc\xb7\xd2\xd6\xa6\xe5\xfc\xf8\x88k\x9d\ +V\xd9\xf8\x0f\xd0\xbf}W\x8cGi\x06\xf0\x8d\xb4#\ +U0\xf7\x83\x0fh\xdeR\xeb\xfeh\xc0\xbd\x22|\xa7\ +\xb1\xaa\xe2\x1f\xe4\xdfj\x032?\xc2O\xaa\xf5\xc3\xc8\ +\x09p\xa9|\x8f+5\xfes\xee\x80\xde#\ +3\xed+ \xfe\xab\xe8\x99\x96\x14 \xe7\xcdy8\xc9\ +aI\x97\xf3\x08\x03\xe7}\x1c1\xfb=\xee\xff\x08A\ +\xd2\xea\xb6\x94M\x83\xf7J[\xa06\xd3o@\x13r\ +\xaam#'\xde\xafx\xf8\xb7nN\xd5S\x8b\xbaG\ +\xe6\xdc=\x8a\xefHA\x0d>\xf0q`?\x1f\xbfO\ +\xdf\xf2\xaaK\x13YW\x99\xb2\xd54\x83\x9c\xf7\xeb[\ +\xe5\xc5#+\x06\xff\xfc\x1e{\xe5\xd1M\xf9w\x01\x04\ +s!9l\x1c\xe7\x87\xfb\xae\xe0\xeb\x85Zx\x90\xef\ +\x04\xf7\xc5\x92\x90\xee\xcf\xe2\xf7\xd7*F\x13\x95\x8fc\ +\xd1\xeb\xd3\xa1j\xd8\xcaX\x13\x8a\x9b\x1c\x87\xfb\xcc\xc9\ +)\xee!\x1f\xfc\x0b\xf6TD\x9f!\xa7\x15d\x1c\xf4\ +\xd9\x93\xf8\x9e:\xd8\xc3[L\xca\xac\xf1\x0b\xb9\xf2\xdc\ +\x8cD\xb2 \xe6\x05\xce\xff\x85\xfb\x1f\x10C\x80\xef&\ +\xadmO\xf7\xea\xe4\xd3\x84\x82\xd0\x03\xd4\xb0\xdd?\x09\ +\xfbke\x1d\xd0kP\x8e\xf6\xaet\xf8\x17\xec\x99\x8a\ +e\x9a!\xa2\xc9\x81\xb8njN\xd0Q\xaa\xa7bV\ +2\x99\x1f~\x0b\xcbs\x89\xf0 C,\x08\xbe\x03t\ +\x03\xef\x85\xde:\x99\x977\x90i.S\xc9d\xfb\x7f\ +\xe4U'Av\xdc#\x1e&\xeb\x80\x9er\x10/\x91\ +c\xceS\xf9\xf0O\xf3Y\xd0a\xe0\xbcA\x1fT\xa8\ +K\x07\xfd\xcd\xb8\xe9?J\xc85\xcc\xab\x1c{K\xc6\ +\xab\xd0\xb3\xe1,\xcbe \xbb\x0ah\x22\xf7\x89'\xd5\ +\x8f\xb32\xf4\x04\x9a\xe6\xa1\xde\x07\xe7\xe7g\xb9,+\ +\xe7\xee\x11y\xfb\xba$\xc4?\xe5\xa7\x87\xf3\x09\xf9:\ +\xf9o\xee\xa2\xf3\x16_\xe6\xfdu\x9c\xa3\x0b\xb5K\xcb\ +\xb4St\xb1,\x97w\xad\xdf\x9c{\xa7*\xe7\xfcC\ +/:[C2\xcb{\x93\xdcj@r\x12>P=\ +b\xe4\x9b\xef \x19\xfe\xe98\x1d\xf8\xdb\xcb;p\xfd\ +\xe2\xb2\xe6\x0c2\x04\xe2\xe0H\xa6\xcbm\x94\xea\x1f\xaf\ +\xa8\xfa\x9f\xd4:\xa1\x96\x0d\xd8x\xf2\xaa]\x0c\xcf\xc9\ +\xf4\xdcP\x11\xfa\x8c\xe4\xe7_\xcaX\x15\xf0\x8a2c\ +\x94\xfc\x1a\x10H\xaf\x93\xd7\xc0\xb91H\xee\x96\xe0=\ +\xd0\xf3\x9b\x9f3\x22\x97\xfe{\xba\x85\xf2\x18\xees\x03\ +\xbd\xcb\xb3n1\x0c\xe8\x0f%\xe3=O\x19\xf1\xdfL\ +j\xf9\x0cr\xa2\xa8\xd7\xa1\xf8g\x83]'\xed=X\ +Q\x03\xe7F\x80\xfeWl\xcf(9\x96\xed\xbb\x0b\xdb\ +\xd0)\xdb\xfac\xba.\x9fO\x81_\xfb\x9b\xd2\x7f\xe1\ +y\xa9\xce#q\x7fxN\xc2{\x99j\x18\x89\x5c\x07\ +\xaeiVa\xbd@\xca\x85\x7f\xa87\x01\xe7\xaa<\x03\ +\xdfQBzb\xa9:\x00Z\x1b\x9c\x1by\x0e|f\ +\x84u?~\xad\xa17\x81\xf8o\xb8\xc9_1O\x83\ +\x1c\x0c\xb0U!\x06\x09\xb1H\xfc\x1d\x0bm\xda\xffH\ +\x83\x05m\xdb\xa2gB\xdd\x15\xe8'\x0e}\xbe\xe1=\ +\xb2\xd4\xae)m\x80\x0e\x9by\xdeZ\x0e\ +;\x90\xcc]\x87i#\xd3s=\xf6K\xe6\xdc;\x89\ +{\x89s\xbeGQ5\xfcd\x88\xdf\x949\xd0\x9c\xa0\ +N\x1c\x0b\xf8\x93\x22\xe0\x9f\xaf\xa3\x87]*\xf7R\xd8\ +Q\xc1\xe2u\x00\x9a\xae\xe4a\x1f\xf3\x07\xe8K\xd0\xf7\ +\xbd\x04\xcf\x11\x87\x7fq\x83\xcb\xa5r\xb3*\x12\xcfb\ +F\xde3o\xda\xc7\xaf@\xfd\x7f@\x07@<\xaf\xbc\ +2\xaeT\x1d\x00\xd7\x80\x18+sM\xccb\xefCg\ +\x19t\xf0\x12\xef+/\xfe+i@\xadh\xa8\x11\xa8\ +p\xfd\xbf@\x07\xd87\xa1\xdc}\x8f(\x1d`\xb1h\ +\x1d\x00\xc9V\x88\xf3\xc8\xb3\xb7\x16\xe4\x92%o\xe8\x22\ +9\xffW\xa0\x01\xb8\x87z\xe1\x0a\xd9\xff\x0fx5\xda\ +Wiz\x1a`\xdf\x95\x98gJ{\xffE\xdc\x00\x9d\ +.I\x94\xdcTp\xfc\xffb\xdc\x97\x1f\xff\x00\xd6\xcd\ +\xc9\xdcP\xb7\xb2\x17\x83\xe4&\xf4\xea\x84:\xa7\xb9\x0f\ +\xceQ\xf9\x0a\xd6B\xbeK:\x1e\xce\xd7\xc7\xe55\xb2\ +o\xee\x14\xcdk\x14\x15\xffh\xaf\xf2\x9ezUF\xdd\ +\xf2\xf2\xe3\x1f\xe7\xac\x8b\xb8\xaf\x8ct\x02\x90\xe1\x18\xdf\ +\x88>\xe0o ?\x11\xd7g\x02\xbc\x8b\x8aY@\x1e\ +\x9cC7\x92\x93\xf8En[\x09w\xe22N\x89\xb9\ +\x13\xa7\x80\xf8\x87\x5c\x9el\xbf\xfd\xb8\x1eh%\xdce\ +\xe3\xe3_\xf2\xfe\xcf\xa0\xaf!\xbc\x82_\x1b|\x01\x90\ +\xc3\x086\x01\xe8\x85i{\xc7\xd1\xf8n.YL^\ +J\x9fBi\x03lq\xb1\xf1q\x05\xc3?\xd0}\x86\ +\x9b\x15\x95\xc7P9\xb1j~\xff\xe7r\xf4\x7f\xa7x\ +v\xc6\xd9e\xb8\xff!\xaeA[\x98\x87Q\xce\x1c\x0c\ +\xa8}\xe2e'\xd7=e\x7fyJ\x9f%\xd1\xb6\xa6\ +\x22\xe0\x1f\xfc\x9cy\xe17i\x1b\xa5R\xf3\x98\xf8\xfd\ +\xdfM\x10\xb0$\xff\x9e\xaeP\x8e\x85\xf0\xfcK\xcb\xd5\ +\x16\xf4\xc7\xe9\xe08=\xc8>\x90\x1b\x98\xa7\xc8\xe8\x03\ +\x86\xfb \xb8\x8f\xa7\xa8y+\x00\xfe\xc1w\x04>\xa5\ +\xc2\xde\x93\x95\x83w>\xb0h\xdc\xb7D\x10-\x97g\ +\xae\xd0\xc7>R\xf0\xb3\xe2\x5cNA\x80\xdfa\xff\xaa\ +@Lv9\xe5W\x82\xbb\x1c\x10\x03\x82z\x98\xe0K\ +\x07?\x1c\xc4\xb8\xf7 \x0a\xd2\x0eL\xa2{6T\ +\xfa\x1e\xfc\xa9\x90G\xe3\xb8\xf0\xec\x0b\xe1\xbf1\x82P\ +\xe9\x9f\xaf+$C\x85Aa\xed\xa1?\x05Bi\x1c\ +\x17\xc3\xbf\x10\x0d,@\x90\xaf\x00s\xad\x06\xf9B>\ +\x8d\xdb\x12\xb8\x17\xc2?\xd8\x05~\x0a0\xdfj\x90/\ +\xf8\xb1\x04l>QC\x80\x06\x86#HQ\x809W\ +\x83| \x85\xc6\xa9X\xdc\x0b\xe1\x1f\xfc\xc2\xbb\x15`\ +\xde\xd5 \x1f\xd8\xcd*\xf2\xf5\x8b\xc5\xbf\x10\x0d\xe8!\ +\x08Q\x80\xb9W\x83l\x10B\xe3\xb2L\xdc\x8b\xa0\x81\ +\x81\x08\xbe)\xc0\x1a\xaaA:\x88E0\xa0<\xb8\x17\ +\xc2?\x83E\xe9\x8c\xe9\x0a\xb0\x96j(\x1f\x00\xce\xe6\ +\xd38,\x17\xfe\x85h@\x15\x81\x03\xab\xda&\xacJ\ +\x90O\xe3LU\x1a\xdc\x8b\xa0\x81:\x08vT\xd3@\ +\x95\x80|\x1aWud\xc1}5\x0dTI\x90+\xee\ +\xc5\xd0\x80\x03\xabZ\x1fPDH\xa7q#W\xdc\x8b\ +\xa0\x01\x90)\xa0W\xc4*\xc0\x9a\xab\x81\x82X\x1a'\ +2\xc9\xfbr\xd0\x00\xe8\x94`WT\xfb\x07*\x1fB\ +h\x5cH\xa5\xe7\xcb@\x03|\x1f\x11\xf8\x96\xaa}\xc5\ +\xbf\x1eR\xe8\xbd\xd7\x13\xc4\xc9\xaf\x18B4\x00~E\ +\xf0-C|\xa1Z7\xacx\xc8\xa7\xf7z8K\xc0\ +\xa7\xfb\xabp_\x0a\x1d@l\x09|E\x10c\x962\ +\x87\xa4\x1aJ\x81\x13\xd5\xa3zT\x8f\ +\xeaQ=D\x0ef\xf1\x8fe\xf2\xd3\xe0\xe2\x9fK\xf0\ +\xe7\x98\xe2\x9f\xd5\x84?\x0b\xcb\x83\xb2\xe4\x87\xb0\xbc\x11\ +\x96G\xc2\xf2\xaa\x84<+6A\xe5\x92\xf2PX^\ +\x0a\xcbSay+,\x8fK\xc8kay^\x5c\xde\ +\xb7E?L\x09j\xdf\x19\x84>\xf5{\xf4\x8b\x96\x9d\ +(\x90t\x88\xd0[\xfeB\xd0\x17\xc1r\x04G\x11\xdc\ +D\x10TIp\x93\x9e\xc3rzN\x7f\xc9K\xc7\x12\ +z\x0e\xf8\xe0\x0d\x11\xaccQ~y\xb0\xdd9\xac\xca\ +\xb7)\xf9\xc0\xa1\xe7\x14B\xcf\xd1\x90%\x107(\xef\ +>\x08\xad]\x1f\x81\x13\x828\x05X\xa7\xa4\x10G\xcf\ +Y\xbf\xbc{ \xf0\xf7J\x08& x\xa5\x00\xeb\x91\ +\x16^\xd1kP\x92d\x0f\x04\xd6^\x13\x81-\x824\ +\x05X\x83\xac\x90F\xaf\xa5fi{ \xb4\xf6-,\ +E\xe8\x9d)?`\xd3k\x12\xb9\x07\xac\xe24o\xfb\ +\x9b\xad]p\x0flY\x22\xce\x82\xc0\xfa\xe1\xac\xfc\x0e\ +4/\x0e\xd2\xe85\x16\xae\x9fU\x9c\xcfWe^'\ +)\xbcb\x09\xc9\x05\x16%+\x9d*\x7fn\xbf\xec\xfe\ +\xbc\x13\xab\xb8~\x00\xfa\xc2/\x94\xef\xbaE\xb58\xa0\ +\xee\x06\xd4\xd2Z\xd9\x92\xaa1\x08}\x9c\xa0\xd6,\xfc\ +]\xc5\xf5\xfc\x8c\xa3\xd7\xcc_\xff\xfa_\xb2n\xbav\ +\x14\xf4\xd6\x84\x9a\x0a\x19\xee\xd6dN\xe0!\x5c\xdb<\ +?*\x88d\x7fzL\xb2\xdf?\xc0\xfdgr\x1f\x9c\ +\xc5u\x0f\xd3\x0eM\xc7\xf5\x94q\xcf;\x5c\x0bIn\ +{\xb1\x8eU\xa4\xcfWl\xbe\x0f\xae\x97\xa5\x87k\xf8\ +f\xdd\xd8\x86\xd7I\xf5Z)\xbb\xe7\x04\xd4\x97\x80\xbe\ +O\xb9\x0f\xddp\x0d\x02\xa8\xf5&\xa7}\x08a\x15\xd9\ +2\x15\x14\xcf\xd4\xa5\xeb'\x9a\xe2Z\x87\xd03C\x96\ +\x01\xf56\xf2\xdf\x06\xe1\x9aET}a\x99\xee\xdd'\ +\xb3\x8a\xec8\xf9\xdb2\xb8\xdec\x1b\x5coI\x9e\xb5\ +\xc0\xf1>\xe4e\xe3\x9a\xb0P\xb3I\x86\xda\x03\x1cV\ +\x91\x0d+\xdf\xb5\xa39A\x9d\xcb\xdcG\xe7\xe5\xda\x03\ +Cx@\xbd2\x5c\x1bSz\xfe\xc8\xb7\xdf\xe5\x8aw\ +\xa8\x87\x0a\xfc\xecW\x0c\xa8\xef\x96q\xd6B\xda\xf9\xf2\ +}\x17r[{\xf2\xa6^\xb8N\xe4\xaf\x1c\xd0\x97\x19\ +j\x9bIA\x07Ar[?\xd4\xe1\x5c\xdb\x11\xf7\x87\ +\x96xp\x0aHNR,\xc9~w\x9f\xcc}|\x91\ +\xcc\x09>\x81\xe5\x1e\xd4\xe0+\xf8\x16I\xd5\x84\x95t\ +\x0f\xd2~\x90i.\xff\x96\x97\x1f\xc8o\xfdH\x87\xc9\ +\xf6\xdf\x8ff\x22\x81L\xcb\xcd\xc4\xb5\xc2q\xdf{D\ +/T\xefJ\xbd\x22\xfc!\xfd\x07\xeaiA_\x1e\xa8\ +/\x0c\xfd\x02%\x19\x05q\x11\xf8y\xe5\x90\x0b\xf2Y\ +?\xd4\xfc?4C\xa2\x1eB\xec\xcfad\xfa\xd1Y\ +t\x8fF\xedR\xeb\xba\xf2u?\xa8?\x0c\xb4\xc1\xcb\ +\xcb,\xf3\xf9\xb9\x0f\xce\x88\xaf\x15^\x11\xeb\x07\xba\xb7\ +m\x8f\xf8\xdd\xbd\xd2'\xc6\xe5\x90\xb9\xa1\xeeT\xff\xca\ +\xf2\xea/\xb0G\xd6\xfa\xb8>\x7fY:\x04\x9c\x19\xd0\ +\x19%\xac\x9b)\xfb\xfa\xa1\xcf\xe7\x99\xa5\xa5\xcb9\x1e\ +\x17\xf7m\xa6\xfa\xc6K+\xaf)]*\xfd\xc8,\x5c\ +\x1b\xb8\xb4\x01\xfc\x03j\xc2J\xb0\xc72\xae_\x17\xeb\ +8e\xf5\xba\xc9{\xe9C\xd7\x11\x95C\x9d$\xf4\x8c\ +\x0c\xb7\xe5X\x17\x14\xbb\xdd9\x19\xa2\xfb\xe4\xca{\xfd\ +\xe8\xf9\xd03\x13\xd7\xdd\x1538I1d\x8a\xd3 \ +\x89\xeb\xb8JD\x07\xe8|C\xff\xa1\xd2\x06\xeeMU\ +\xb6<\x94y\xfdY\xd7\xb7\x95:\x8fl\x9f\xed\xf2\xaf\ +\x17\x8cd\x5c\xca\xb6\x81\xb8&\x9f\xb8\x015\x19\xa9^\ +\x83\xa5\xee\x81l\xebG6\x08\xf4\xb7\x12\x8f\xfbXJ\ +G\xaf\xa0z\xc9\xb9\xf7O\x8b}7\xf0A\xa83_\ +\x06\xddI\xbf~\xdc?\xfd\x1fl\x9b\x8a\x1b\xd0C\x07\ +\xfb6*`\xed\xb0.\xb0\x87\xc1>\x16\xbd\x01<2\ +\xf3\xbc\x8d\x98^\xe9rX?\x9c\xfd\x1dC\xb1\xee)\ +nd^\xb2-\xeb\xfd\xd2\x03\xe8\xda\xcc\x1e\xa5\xda\x96\ +\xa0\x8f\x95\xa1\x0f\xca\xb4~\xa8\x09.n\xff\xa1\xb64\ +\xfc\xbb\xfc\xf8\x9e0P\xb2\xa74[\x03\xf7M\x11\xec\ +\xcb!\xd7\xf5kc=\x0etx\x91\xeb\xcfJ!S\ +\x9d\x87W\xe0\xfa\x9ba=\x19\xf4hq#\xef\xc5\xf5\ +\xb2\xce_\x85\xad\x9f\x9b\x99\x8c\xce\xc7\x90\x8a\xad\x8d\x88\ +t\xc2\xbc\x17\xe2{,C\xbf\x95B_jE\xac\xff\ +\xf0L\x5c'_$\xfe\xa1o\xc7\xde\xf1\x15\x8b\x7f\x90\ +?o\xee\x8a_\xffS/\xcaoZ!\xeboJ\xf5\ +\xb8\xcd\x11c\xa3\x22}\x1f\xec\xbb\x8a\xe3\x7f\xba\xd8F\ +\x04;Y\xdc\xc8\x09:^q\xf2\x1f\xfc<\x9bz\x97\ +j\x8fH\xa8\x83I\x07\xb0\xff\xce#K\xd5=\xb3\xae\ +0+N\xfe[Q}G\xf2\x9e_\xc32\x08\xf4\x80\ +b\x80~\x07\xf4\x87m\x9e\x8a\x88\xeb\x80\xee\xe9\xed(\ +v\xed\xd0\xeb\x00\xf7\xe7\xac\xb0\xf5S\x00>\x9fd\xfb\ +\xae\xb8\xdfw\x09\x80~\xbd\xc2\xfdA\xe5D\xfb\xa0\xdb\ +\x16D?\x13\xbb~\xd0=\x93\xcb\xf6\x85\xc8\xbc\xfeB\ +?\x85E\x13\x04\xda\xc5\xfb\x06T\x18\xed\xeb\xe0\x1e\x06\ +\xa5\xf5:\xc1\xb2\xafl?\x88\xe4\xeb\x17\xd7\x0b\x01\xf8\ +\xc0\xd6\xfe\xd8\x07\x0b1-\x0a\xe7\xcd\x8b\xc7\xf7\xe4\xb9\ +\x0fp\xee\xb7\x0fA\xe7+Z\xec\xdaa_\xa0\x7f\x87\ +L\xf6\xefr\x81\x9a\xc7\xd0\xcbl\xa31\xd5\x83P\xf8\ +,\xc39\xbc\x016 \x0f\xf3\xa2\x82\xf8\xb7\xd8\xde\xcf\ +\xbe\xe5L\xa6\x9f\xfc\x0f\xdbi\xb8o\xcc\x0a=\xd9\xf7\ +\x01\xbd\x0bb\x81\xf9Q\xc1\xe2\xd7N\x92\xb8\x973\xee\ +\xe1(\xad\xfd\x8b\xe8\x06\xde\x03\xfa+\xac\x0d\xe2\x91`\ +\xc7C?\xd0\x12{\x8a\xf4+\xe8\x0d&\xfa\x10\xb2q\ +\x0f\x9d\x82\x98\x97d.\xb2\x85Rw\x8d\x94\xde\x16D\ +\xef\x05yS\x9a\xbd\x89\x07\x8fKf]\xb6\x93T\xef\ +*\xbe\xfe\xe5T\xads\xe8A\xc5\xf9\xf9\x19\xd7\xbb/\ +~\xa6\x84\xf4)>\x1f\xfa\xfa\xba\xf49a\x9a\xe4 \ +}qv\xd1\xfeI\x14\xd7\xa6i\x10\xf1P\x88\xf3\x14\ +\xc4\xbc(\xf35\x10[\x95\xac\x17\x97(\xfc\xeb\xe2\x18\ +<\xf4\xdf\x12\x89\xce\x9f\x9f\xa8X4\xff\xd9\xd07\x16\ +l\xc0\xcc\xa4\xb2\x97\x9f\xfa\x9d\xea\x93gI\xf5\x81K\ +;0\x19=\xab;\x89\xed\x93\x12\xfd8\xb4\xa9\xbfC\ +sI\xdb7\x1e\xc7~%\xf1-\xc3\xf9\x93@\xe6\x95\ +N\xff\x88>\xb3\xfd\x0f\x88~~\xbe\x90M\x07}\xee\ +O/.\xd97Y\xc4\xc0=\x12\xd6\xb4\xa3\xe2\xa2X\ +v=\xa7\xe2\xda\xa1\xe7\xc9L\xcf\xf5d\xfa1s\xbc\ +'\xe0\xbb\x05^\x0a=\xa7\xa0\xf7\x94$\xeb\xa66\x98\ +C\xf9\x9aJ\xd7w\xcb^?\xf8\x15\x8e\xcfE\xc8\x16\ +\xad\xd7g]\xdfZ\xb4~\xd8+4OI\x06\xf8\xeb\ +\x8a\xceL\xc7\x92\xfd\xe6\x11\xaf\xa0\xfaI\xe4\x89\xec\x03\ +X\xfa\xe0\xe1\xe7S\xfe\xe5r\xf1X\x91\xf8\x87~s\ +\xdc\x94\xaf\x22\xdfD\xf1\x80\x16\xd4\xd9\x04\xfb\x03\xf1F\ +IF\xa6\xe7\xba\xc23\x8f\xf1\x1f\x17Q\xf6\x97$Z\ +:\x0f\xd3Pao\xb2\xf2\xf1U\x91\xfc\x1fb3\x90\ +g\x80\x07\xf4AK\xfe\x8a}\xdc\xd9\xb7\xf7`\x1a\xc5\ +:\x1d\xf8_\x90\x8e\x07\xfd<\xcb\x9cb^6\xf5=\ +9\xaf\x1f|/9\x81\x87e\xf1\xad\xc3\xdaK\xc6\xbf\ +\xd1\x1c3\xce-\xc7\xb178\x0b)\x8e\xbd\xe9x\x15\ +_\xa7\xd1\xa5}\xdf\xa3%\xeas\xcda\xc5\x90\xc9L\ +\xe3B]H\x1e\xeb\x87\x98`\xe6\xf9\x95\xb2\xf6\x99\xe6\ +\xe7\xcf\x8b\xf87=\x81~Zz\x98\xbe`\xde\x18`\ +\xbf\xd1\xdf\x80\xae\x07}\xb4\xa8\x9e\x8d\x8f\xd0\x99\x89\x17\ +\xe9\x0f\x83\xd8\x18\x15\xe3l&\xf3\xfa\x81\xc7C\x1c-\ +\xc5i \x8ds\x99t*\xfe\xdd\x01\xf1\xf9/\xb4\x9d\ +\x9b\xff\xee\x1e\x96\xf3\x05_#\xb1\xcf\x89\xeaw\xa4S\ +\xc8\x0b\x81\xf7\x00\xdf\x009\x9duu\x13\x99\x17\xe6\x89\ +\xf5\x1e\xf0\x8f\xe6\xdcq)\xc2\x11\x7f\xfd\xa5\xd8\xed%\ +\x06\xe2\xed`\xcf@l\x1cb\xc2\x98\xff\xc8\xeeS\xe7\ +\xe7\xbf\x94\x9e\xff\x04\xeb\xdf6\xa0\x98\x8c\xe7$~\xc6\ +g\xbfd\xbfW\xc1>\x8e\x14\xcd@\xec\x87\xa2\xfd\xa2\ +\xbf\x85\xb3\x94\x89t\xb4b=\xfa\xd09\xc2\xfc?7\ +\x13\xef\x19\xce\x0b@2\x13\xd6\x0c\xba<\xee\x01Z\x98\ +\x03'\xd3\xba\xf9\xc0\xcf\x7f*=\xff\x8d\xbf\xfe\x0cV\ +\xd1\xfaA\x0f*\xb1~Q\xdf\xd5\x15\xdf/\x12~\x07\ +v\x05\xf4\xa8\xdbj\x8ay\x09\xf0\xc8\xd4\xbd\xe3\xb1N\ +\x05{\x86\xf5\x05\xf8[\xbeM)\x9fu\xf3\x81\x9f\xff\ +Vz\xfe#\xce_3\xc1k\xc68\xca\xcd\xc0zh\ +\xf2\x06\x89\xec\x8b\xb2Ad\x8f6\x1dy\x9c\xed\xb2`\ +=K\xc2\xfcW\xe0]\x80\x93\xd4]\xa30\xe0x\xe6\ +J\x89s\x0c\x14\x11\x84\xf3_\xcb\xce\x7f\xb6\x14\xc0\x91\ +\xe2\xf6?\x95\x14\x84\xf3\x9f\xff\xd8\xfc\xf7?\xfd\xfeC\ +\xf5\xfd\x97\xea\xfbO\xd5\xf7\xdf\xc4\xde\x05\xfb\xa3\xee?\ +\x8a\xd8\x83?\xee\xfe\xab\x98=\xf8\xa3\xee?\x97\xb2\x0f\ +\xbf\xdd\xfdw\xba\xcc\x00I\xd7?\xe0\xd7\xd9\xe1\xd7\xd3\ +\xe1\xd7\xd1\xe1\xd7\xcb\xe1\xd7\xc5\xe1\xd7k\xa8\xae{S\ +\xc9\x83I\xfd(\xc4G0\xf5\x93_\x1f\x83_\x07\x83\ +_\xff\x82_\xe7\xc2\x84\x8fw\xa8\x13a\x84\xc0\x9c\x10\ +\xa8\x13\xd1\xaa\xec:\x11\x22\xce\x85\x06\x82A\x086!\ +\xb8\x8e\xe0\x19\x82\x08\x16\xc5\x83\xe5\x09\x11\xf4\xb3\xaf\xd3\ +\xef\x1aD\xbf[b\xba\x171os\x04\x81\x08R\x7f\ +\x01\xaf\x12\x86T\xfa\xdd\xe6\xc2\xeb\x90`\xee=\x10\xf8\ +\x22(\xa8\x84y\x0bC\x01=\x97\x1e\xe2\xd6 4\xf7\ +\xc9\x08b\x14`\xde\xc2\x10C\xcf\xad\xd8\x1aD\xcc\x9d\ +\xa5\x00s\x15\x07,\xe15\xb0\x8a\xd3\x8c\x22\xee\xbb(\ +<\x14\xa3%\x16u>|\x15`n\x92\x82/\xab\xf8\ +\x99\x863.\xdf\xb3Z\xccw\xa6#\xe4O\xd3&%\ +\x8b3\x8b\x85\x02z\xce\xfc\xbd\x0f\x94\xcf\xbc\xe9\xb8\xf6\ +\x0a}\x9cW\x011\xdb\xac+\x0ed\xce\x9dC\xd8\xdf\ +\x9bs\xff\x14\x99\xed\xbb\x1b\xdf\x8f\x06\x7f[a|G\ +:\xbfS \xabH6\xc9\xce\xdf\xd1\xbc!\xef\x16\xe6\ +\x9c\x1bv\x11\xc7vx\x05yb\x82\x15<\x92\x97\x93\ +F\xb2\xbf<%\xb3|\x9c\xb0\x1fU\x8a\xbc\xa0TV\ +\x91\x5c\x95m\xcf\xd1{S\xf7\x8c\xc1\xf1\x8b\xd2\xee\x8f\ +\x88\x1b\xe0\x93\x87|\x10|\xaf\xa0|y\xad|\x9d@\ +J\x1a\xa7b\xad\x10'\x87{~\xb2\x0d\x1e\xce\x9f\x01\ +\x7fn9\xe8\x89\xaf\xcfH5w\xf0\x1fC.\xbaX\ +:\x91b@\xdc5m\xffDI\xd7\xc0\xd7\xc5\xca?\ +\x7f\xeb\xe68\x97\xa9\xb4\x5c3\xbc\xab\xec\x5c\x9c\xe3\xc1\ +\xcf}\xc4\xf7\x02\xca\x88\xe3\xc3\xdf\xe2\x9c\xa0\xb2i\x89\ +\xafG\x96s\xefu\xf0\xbdX\x88?\x8b\x9f\xc3'\x1c\ +\xe7\x85\xbc\x0b\xb8\xab\x02yS\x90\xe3\x02\xb9\xdbp\xcf\ +\x0a\x9f\x95R\xee\xa1\xb2?=\xa2cA\xa5\xae\xe1U\ +\xb9\xe7O\xe7!\x88\x8b\xaf\xc3\x9ar\x82\x8e\x15\xdd\xf7\ +,\x96w(\xc0\xff\xd1\xb9I?2\x13\xf1\xa0'b\ +\xd7\x00\xeb/\xe3\x9e@\xf9\xe7\x8f\x00\xf8\xb9\xc8\xb9g\ +\xa7\x91\x99\x1e\xab\x0b\xf3\x08\xca|\x16\xce{\xeb\x8ep\ +\xe1#\xf2y\x90c\x06\xb9\x87\xa5\xc4\x06\xcb7\x7f\xfa\ +\x0e;'9\xae\xe4\xdc\x0b\xf2\xa9<8\xfc\xb7\xe5\xe0\ +\xe3\xb0\x06\xfb\x7fH\xf6\x87\x07\xa2q\x10|B~\xfb\ +\x8f\xde\x95yi\x9d\xc8\xf7@^(\x8e\xc5K\xa3\x13\ +\xc0\x9d\x97}\x13D\xe6{Q\xb9a\xdd\xc5\xe1\xb3|\ +\xf3\xb7n!\xf2^\x07\xc4\x1f\x0b\xf3H\xca;w>\ +\xac\xd0\xc3:F\x89\x81\xf0\x0a\xb9\x1eb\x9e-\xf9\xfc\ +!/\x1f\xf1\x10\xce\x8f\x92\xe7\x16\xee\xb9\x83\xee S\ +\x5c\x13\xdf\xb5\x9e^\x227\x11\x06\xe8L2\xcf\x1fr\ +\xfa\xb6\x0f\x11y\xaf+\xdbo\xbf\xec\xf1w|o\xae\ +\x1b\xce\xaf,A\x9bO/\x8b\xcb_+\xc7\xfc)\x1a\ +\x15\xa5\xdfd^(\xf3>\x9c\x04@\xe7H\x22\xbe/\ +< G\x0a\xe7\xe3\xc8:\xff\xfd\x93\xf0\xfd\xb1\xe2\xc4\ +\xcf\xa5j<\xc8\xe1>\x09\xce\xef\x12q_\x9d\xfd\xee\ +\x1e\x95\xe7$\xe3\xfc!\x87\x81\x97\x97Ur\xff/\xad\ +\x95\xcf\xfe\xafi\x87u\xea\x12\xfb\x1f\x19 \xfb\xfe\x8b\ +\xc8w\xe1\x8f\x9c{'e\xcfy\xc0\xf9D\xbdpN\ +\x9d\xf0\xa0\xee\xeb\x89\xfc^\xb9\xf8\x0f\xe4W\xe6G\xde\ +\xc1\xb6\x09\xbe\x9b\x02\x80\xfe\x1f\xf2\xb4\x81ve\xe3?\ +\xdad\xfa\xa9\x85\x22\xef\xfbg]\xdb\x22;\xff\x01\x80\ +\xdc\xa1\xf5\x9d\xa9;$p\xb7\x04\xc9M\x0c\x90s\x22\ +\xd3}\x12]L\xdf\x90\x9f/\xf8\x1e\xce\x19\x17:c\xf9\xaf\ +\xfdp\xce\x1b\xf0\xe5\xack\x9b\xb1\x1e\x09:2\xce\xb3\ +-_\x9e1}_x\x98H\xb9\x08#\xfb\xe6\x8e\xd2\ +t\xc1b\xf3\x07\x19\x0awKA\x87\x843S\x10\x1f\ +\x85u\xe1bg\x0c\xe9o\xdc\xb4\x84\xe28F\xf6\x17\ +\xd8(\xec\xcfO0\x0d\x17\xe1\xa2\x14|\xd0~\x07\xb8\ +\xeb\x07w\xeaE\x0d\x90e8?M\x92\xf9\xc3>\xec\ +\x1c^\xe2\xee~A\xec+:\x87W\x97\xbe\xdb=\xab\ +T{\x11\xdf\xed\xb6\xd0\xc6x\xc2:\x85\xa0\xbfG \ +O\x15\xceM\xd6\xd5\x8d\xe2k\x05p9d\xe6\xe5\x0d\ +\x92\xdb/X\xbf)\x99\xf7\x0by\x99p\x1f\x8f\xff~\ +\xe0\x05\xe2\x06\xe8q\x90\xef\x96\xb8L\x0b\xd9XVX\ +nfyo\xc2k\x06\xff\x04\xc8o\xb8;\x095\xd3\ +\x00\xb7\xa5\xd9\x91\x14O+3\xef\xbb8\xfd\x8b\xb9\xb3\ +\x02\xb5\xca\xf0\xbe\xc1\xbf?\xbd\x22\xf6\x9d\x9c\x84\xf7\xd4\ +\xfd\x1at\x9e!\x8f\xb1p]H\x87\x84\xfcE|>\ +%\xb9\x13\xf0>\xa4(/\xb8\xf4\xf3\xc3\x8f{\x14\x9e\ +%\xb0A\x0a\xdf\x8b\xecS\xc8\xa3\xc4\xfa\x0d\xdc/X\ +\xdbQ,\xad\xc2\x80\x9cu\x9c\xbf\x86\xd6\x0a\xb8\x97f\ +\xe4\xbf\xbd[\x16\xcd\x0b\x02?fC\xcf_\x07\xf3\x82\ +\xdcG\x1eh\x1d\x0e\xf8lQw\xab\x9a\xe19\xe1\xda\ +\x16\xe9?\xc5\xbe;\xdboo!\x8d\x97w\xfe\xa0\x97\ +@-\x1a\xea~\x94\xc4\xfe\x1f~\xbc\xa9\xe8w\xc0\xff\ +VPwW\xc0\xee\x815\xa4\xee\x1d\x87\xcf\x1b\xf8+\ +3\x5c\x17\x93\xd9\xc8\xae\xc69\xae\x90;)\xe0C\x00\ +\x1e\xce\xbf\xf3\x92\xe9eW\xcal\x05\xe6\xcd\xce\xc3\xf4\ +\x82m\x94\x95\xe5\xce\xff\xe5\xc7\xcaD\xf27\xb8\xc3\x01\ +\xf2\x0f\xe8\x16\xdf\x99\xb5\xd0.\xba\xbb\x079\xaahM\ +\xb0\xb6\xcc\x0b\xab\xf0\x9a\x0a\xf1\x0e\xf2\xe8\xf4b|\x07\ +\x18\xe7}\x0b\x9eSn\x01>\xe7@\x97\xc0\xa3\xa1f\ +a\x92\xad\xa1\xb4\xf6\x03?\xceW\xd2\x7f\x8b\xe6\x01\xbc\ +\x9f?\xc0?YB\xc7,\xbc\xcbW\xb2\xde\x14\xe8\x03\ +8o\xfb\xe0T\x5c_\x09x\x00\x9c#\xb8\xbb\x07\xbe\ +g|\x9f\x91\x9fw,\x9d\xee\xc7\xf7\xdf\x8a\xf6\x9f\xa3\ +\xf9\x00\x0f)\x88\x0dG\xf0\x12\xdf;(\xf7\x1e\x15\xf3\ +\xf7\x0b\x82\x5cj\xa7\xf2\xfd\xe7b\xe3\x17Pk\x09p\ +\x8bA\xb4\xfdPY \x18\xbf(=~T\x91\xf7u\ +\xa5\x07\xe1\xf8\x11?~W\x15zt\x8b\x8a\xdfU\xd9\ +\xf8iU\x8f_\xff\x0e\xf9\x03\xbfC\xfeFU\xcd\x9f\ +\xc1yD\x1a\x04\x11\x03?\xd5\x08\x22\x18~*\xd3\xf9\ +G\xd5Y`2\x0f&\xfc\x87Q\xb4\xaf1\xf0S\xad\ +h\xdf!OK\x9f\xa0z\xfa\x14\xe6ii\x8a\xce\xd3\ +\x12\xc2e\x0d\x16\x95\x1b\xb8\x07\xc1c\x16\xc5\x1f\xbeJ\ +\x091\xf43\xf6\xd0\xcf\xac!L3B\xefn\x8e\xe0\ +\x10\x82\xc4\x0a8w\x89\xf4\xb3\x9b\x8b8K\x00\xffC\ +\x10V\x01\xef\x15\x860\xfa]\xc2\xeb\xfe\x15\xef\x16\x9c\ +\x03\x7f\x1fj\xd0\xfbR\xceg\xe8\x8a\xd6!%\xb73\ +\x0e\xb1\x8ahMr|\xd3\xbayaM|d\x1b\x81\ +\x9f\x18|;\xe9\xc7\xe6P9\x13\xe0\xd3-\xbbfj\ +\x22\xab\x88\xce%{7\xc4\xe4\xd6\x1b\xe1\xbc\x02\x5c\x93\ +\x1ej\x09\x09\xda\xedP\xbf\x22-\x01\xc7\xa2\xc0\xee\xc2\ +\xbam\xe9\xfb\xc1?c\x12\xac[\x07\xfb9\xe0\xbd\x12\ +\xd5\xc1G\xf6\x19\xd8\xcbP\xf3\xae\x949\xf0\xcfw\x99\ +\xefN?6\xbb\x14\x9f\x10W\xec\x9c\xa0\xde\x5c)v\ +?\x9f\xb7\x94\xb2\xe7:\x18\xcf\x90K\x22\xbc>\xf0)\ +\x80\x9f\x11h\x00\xd7@\xf0\xdfO\xf91\x84\xfc?P\ +\x03\x04|\x1c\x22\xf4\xf5\xaf\xa5\xbf_\x17\xfb\x8a\xc0\xaf\ +)8\xc0\x7f\x07\xef\xa4\xfch\xc5\xed'\xb0\xff\xc07\ +Y\xbc\xce\x17\x8f\xcc\xba\xbe\xa5\xfc\xef\x07\xbf\xde\x89y\ +\xc5\xfcz\xb0\x0f\xa9\xb8N\x9a\xb6h\xfa\xa6\xf7\x19h\ +T\xf0n5\xcc9ycOa<\x94\xfe~\xf0k\ +\x85y\x0a\xe0\x99C\xc7d\xca\xb07\xe9\xfc\x1b\xa8g\ +U\xb4\x05<\xea\xfey\xf1\xef\x8a\x7f?\xf8\x0d\xd1^\ +\x82?\x80?\x0a\xbeGIZ\xa7\x86\x8a\x8b\xb9\xfc[\ +\xcc\xf7-\x22^\x22\xfe\xfdP3\xd5i`\xb1\xb8N\ +\xde\x93\xcbd\x19y\x0f\xc5\xe7\x0f~\xcf\x9f\x9f\x04\xce\ +\xc2\x03:\x9e+\xc9\xfb\x9bb\xba\x17\xac\x17\x00\xfeM\ +\xc9\xf9\xab.\xb6\xaf\xe1Ny\xe1\xfe\xc5\xbc\xc0|S\ +\x80nJ\x7f\xff\xf6!\xc5\xea\xa5\xe5>\xf6\x90\xf0\xdd\ +\xf4\xfa\x11\xaf\x14\xc4\x1f\xc4@\x85\xe2I\xa5\xe3\x1f\xed\ +\x1f\xf0\x0f\xa0y\xc8\xad\xc0\xb9\x08\x92\xc6\xa3p\xbd\xbd\ +1\xc5\xf6/\xef\xd9\x15\xe18\x84\x88\xf7\x0b\xd8\xf5\xe8\ +o\x81\x06!\xbf\x07\xe7\xf9@\xcc\x03\x7f_2\xbb_\ +\xd0\xcf\x04CD=\xa4\xa2\xf7\xf3{\xbd ~S\x18\ +[\xa1c\xeb\xe0\x7f\x84\xfc\x0c\x88\xf3\xe2{\xde6\xad\ +K\xc5;U\x93eN1\xdc\x81\x5c\x02?\xa9\xc8\xf3\ +\x0fy~;\x86\xe2\xde2 _\xf2^\x5c\xa3\xe8\xd4\ +B\x9b\xaa\x1b\xc6?\xc2\xe8,A\x1c2\xeb\x86\x13Y\ +8g\xe1\x18\x02:\xf7\xe0\x8b\x17\x96\x15\x98vK\xc6\ +\x80\xa8\xf7C]\x1c\xc4\xbf\x0b\xe7\x9a\xfe\x83\x92\xe3\xe8\ +\x99\xa2r/ 7\x12\xe2\x18\x10\xa7\x009\x0b\xf1\x11\ +\xf0\xbd\xc13\xa0\x86\xa5p\xfe\x16\xf8\xcaD\xf0>\x81\ +\xf5\xf3\xcf:\x95\xc3\x00\xfc\x16\xea\xeb\x80\xfc\xc6\xf2V\ +`\x80\xcf\x1e\xeaxB\x0c\x0c\xd7\x92E<\x11\xf2\x93\ +\xb0\xbfVD\xdc\x01\xf2\xc5\xc0\x17*&g\x8d\xd6\x91\ +\xa9\xda\x80\xb9\xf7]1\xae3\x5c\x17b\xff6\xe4\xba\ +B\x1cVp\x80\x9f\x1bbU\xc9\x1b\x8c\x8a\xf1\x16Q\ +\x03\xea2\xc1\xbe\x94\xc23\xf8\xfa9\xf5\xd9\xba\x05\xf6\ +E\x83\xdf\x16x5\xd0>\xaeOq}+>;\xd0\ +?\x04\xe2\xc4\x98F\x817\x8b\x88\xcd\x81\xdf\x19jU\ +\x80\x5c\x869\x96\x91\xab\xc7\xb7\x0d\x8ax.Z\x1b\xd4\ +\x82\x85\xb8\x1b\xce\x0f\x82\x18(\x9d\xfb\x0by\xa4\xb8\x9e\ +\x14\xf0`\xc8SC4\x9e\xed\xbb\x0b\xe7\xffB\xedJ\ +\x1cs<<\x93\xf2\xc1JVG\x8eo\x97$\x16\xf1\ +\xac\xce\xb8n\x0d\xc8p*\x8fX\xe0\x19\xc2>?\xc1\ +\xfb\xed\x82y\xd5\x92\xf9\x05\xf9\xfagI\xfd[\xfa\xdc\ +\xe5\xf2\x00_\xff\xe6\xdb\x1fO*\xf8}\x82 h\x7f\ +(\x82\xfdUi\xf6ge\xdb\xdf\xccJ\xf4\xc6\xc0\xbb\ +\xc1O\xa1IP\xbe\x8aB?E\x8d\x92~\x0az\xce\ +\x0d\x100\x11\xbcG\x90\x8e C\x0c\xa4\xd3\x7f\xc3\xa4\ +\xbf\xc3\xff\xee9\x04\xdc\x12\xb8\x11\x7fv\xb9\xf4w\xf8\ +\xef\xe5\x96\xf8\x1e\xe4C >\x0du\xe7 \xa6\x07\xf9\ +'B|\x82+0\xe7b\xdf\x858\x19\xd4\xbc\x05\xdd\ +\x06\xc7\x82\xe9\xdeeX\xbe\xad-\xc6{\xf8\xeb-\xe4\ +C\xa0\x8f\xf0\xfbH\x80L\x86\x5c\xd7\xfc\x08\xbf\xc2\xba\ +3\xa0\xeb\x0a\xd4\x92\xe5\xefU\xe1\xf7!\xf7\x0f\x06<\ +\x03\xea\xc9\xe0\xba\xd7\xd6\xcd\xb1\xbc\x80\xb8\x92\x90\xbe\x9e\ +Q\xf8\xfd\xc2zDo\xb0n\x8c\xf3\xe2-\x04\xe2g\ +\x88_S\xb9\x08\xf9T~\x1b\x15\xdf\x11\xf8>U\x1f\ +\x06x<\xe4d\x95\xc8o\xc49\x08]q\xfdH\x88\ +\x9b'Q9*E\xdf\x07\x1b\x0b\xed7\xd4\xc3\xc3}\ +;\x84\xeb\xe5\xf2\xeb\xb1!\x1d\x02rQh\x1eN}\ +\x1fz\x06B\xdcxe\x0b\xec+H?\xb5\x80\xea\xaf\ +\x22X\xbb\x13\xfd?U\x9f\x93\xc4u\x04i}\x1f\x7f\ +\x1f\xf0\x022\x15\xea{\x81M\x08\xf8\x02\x9d\x18\xea\x99\ +\xa6\xee\x1c\x86\xf5\xf5\xec\xdb{q\xcc\x98\x9b\x9e\x88\xf5\ +OZ\xfee\xa0\x9f\xe9`\x93\xc1\x9cqn\x08]\x03\ +\x12\xf2xA\xbe\xc2w\xf89p \xfb\xa0G\x8a\x00\ +\xbdP\xf4\x8c\xf0\x93q\xde\x1a\xe7\x99C>\x04\xe8f\ +\xd0O\x03\xe4 \xc4z\xa1\x87\x16\xc4[\xa9\xbb\x0a\xc5\ +\xe8\x98:\x0b\xcbu\xb9)\xdb\x07Sz\xa0`\xcc\x16\ +\xeau\x01\x9e\xf8=\xe2\x8a\xcb\x1e>\xfdR\xe7g\xb9\ +\x0e\xb7\x1c\xb2I\xf0\xfc\xc8t~e\x1d\xff\x07\x9d\xab\ +\xf3\x85\ +\x00\x00_\x84\ +I\ +I*\x00\x08\x00\x00\x00\x17\x00\xfe\x00\x04\x00\x01\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ +\x00\x04\x00\x00\x00\x22\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ +\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00\x11\x01\x04\x00\x01\x00\x00\x00@T\x00\x00\x12\x01\x03\ +\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ +\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x17\x01\x04\x00\x01\x00\x00\x00\x17\x0b\x00\x00\x1a\x01\x05\ +\x00\x01\x00\x00\x00*\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ +\x002\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ +\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ +\x00$\x00\x00\x00:\x01\x00\x002\x01\x02\x00\x14\x00\x00\ +\x00^\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ +\x00\xfa8\x00\x00r\x01\x00\x00I\x86\x01\x00\x8c\x0d\x00\ +\x00l:\x00\x00i\x87\x04\x00\x01\x00\x00\x00X_\x00\ +\x00s\x87\x07\x00H\x0c\x00\x00\xf8G\x00\x00\x00\x00\x00\ +\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\ +\x00\x00\xf9\x15\x00\x10'\x00\x00Adobe P\ +hotoshop CC 2015\ +.5 (Windows)\x00201\ +7:03:08 11:38:26\ +\x00\x0a\x0a \x0a \ +\x0a pain\ +t.net 4.0.9\x0a \ + 2017-03-0\ +7T11:32:29-08:00\ +\x0a 2017-\ +03-08T11:38:26-0\ +8:00\x0a <\ +xmp:MetadataDate\ +>2017-03-08T11:3\ +8:26-08:00\x0a \ + image/tiff\x0a \ + 3\x0a \ + sR\ +GB IEC61966-2.1<\ +/photoshop:ICCPr\ +ofile>\x0a \ +\x0a \ + \x0a \ + adobe\ +:docid:photoshop\ +:94a27cdb-0433-1\ +1e7-b02d-9f84d9f\ +5a326\x0a \ + \x0a <\ +/photoshop:Docum\ +entAncestors>\x0a \ + xmp.iid\ +:d3f831c7-1693-8\ +248-a9a0-2c4f91d\ +81b49\x0a \ + adobe:docid:\ +photoshop:c7bad1\ +dd-0436-11e7-b02\ +d-9f84d9f5a326\x0a xmp.did:a36\ +4ea4e-2280-ea40-\ +ae73-10beb7a78ae\ +8\x0a \ + \x0a \ + \x0a \ + \x0a \ + <\ +stEvt:action>cre\ +ated\x0a \ + xmp.iid:\ +a364ea4e-2280-ea\ +40-ae73-10beb7a7\ +8ae8\x0a \ + 2017-03-07\ +T11:32:29-08:00<\ +/stEvt:when>\x0a \ + <\ +stEvt:softwareAg\ +ent>Adobe Photos\ +hop CC 2015.5 (W\ +indows)\x0a \ + \x0a \ + \x0a \ + saved\x0a \ + <\ +stEvt:instanceID\ +>xmp.iid:d3f831c\ +7-1693-8248-a9a0\ +-2c4f91d81b49\ +\x0a \ + 2\ +017-03-08T11:38:\ +26-08:00\x0a \ + Ado\ +be Photoshop CC \ +2015.5 (Windows)\ +\x0a \ + /\x0a \ + \x0a <\ +/rdf:Seq>\x0a \ + \x0a \x0a \ +\x0a\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \x0a8BIM\x04\ +%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x008BIM\x04:\x00\x00\x00\ +\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x0bprintOutput\x00\x00\x00\x05\ +\x00\x00\x00\x00PstSbool\x01\x00\x00\x00\ +\x00Inteenum\x00\x00\x00\x00Int\ +e\x00\x00\x00\x00Clrm\x00\x00\x00\x0fpri\ +ntSixteenBitbool\ +\x00\x00\x00\x00\x0bprinterName\ +TEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0fpr\ +intProofSetupObj\ +c\x00\x00\x00\x0c\x00P\x00r\x00o\x00o\x00f\x00\ + \x00S\x00e\x00t\x00u\x00p\x00\x00\x00\x00\x00\ +\x0aproofSetup\x00\x00\x00\x01\x00\ +\x00\x00\x00Bltnenum\x00\x00\x00\x0cb\ +uiltinProof\x00\x00\x00\x09p\ +roofCMYK\x008BIM\x04;\x00\ +\x00\x00\x00\x02-\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x12printOutputOp\ +tions\x00\x00\x00\x17\x00\x00\x00\x00Cpt\ +nbool\x00\x00\x00\x00\x00Clbrbo\ +ol\x00\x00\x00\x00\x00RgsMbool\x00\ +\x00\x00\x00\x00CrnCbool\x00\x00\x00\x00\ +\x00CntCbool\x00\x00\x00\x00\x00Lb\ +lsbool\x00\x00\x00\x00\x00Ngtvb\ +ool\x00\x00\x00\x00\x00EmlDbool\ +\x00\x00\x00\x00\x00Intrbool\x00\x00\x00\ +\x00\x00BckgObjc\x00\x00\x00\x01\x00\x00\ +\x00\x00\x00\x00RGBC\x00\x00\x00\x03\x00\x00\x00\x00\ +Rd doub@o\xe0\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00Grn doub@o\xe0\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00Bl doub\ +@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00BrdT\ +UntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00Bld UntF#Rlt\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Rslt\ +UntF#Pxl@b\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x0avectorDatabo\ +ol\x01\x00\x00\x00\x00PgPsenum\x00\ +\x00\x00\x00PgPs\x00\x00\x00\x00PgPC\x00\ +\x00\x00\x00LeftUntF#Rlt\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Top U\ +ntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00Scl UntF#Prc@\ +Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10cropW\ +henPrintingbool\x00\ +\x00\x00\x00\x0ecropRectBott\ +omlong\x00\x00\x00\x00\x00\x00\x00\x0ccr\ +opRectLeftlong\x00\x00\ +\x00\x00\x00\x00\x00\x0dcropRectRi\ +ghtlong\x00\x00\x00\x00\x00\x00\x00\x0bc\ +ropRectToplong\x00\x00\ +\x00\x00\x008BIM\x03\xed\x00\x00\x00\x00\x00\x10\x00\ +\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\x00\x00\x01\x00\x018\ +BIM\x04&\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00?\x80\x00\x008BIM\x03\xee\x00\ +\x00\x00\x00\x00\x0d\x0cTransparen\ +cy\x008BIM\x04\x15\x00\x00\x00\x00\x00\x1e\x00\ +\x00\x00\x0d\x00T\x00r\x00a\x00n\x00s\x00p\x00\ +a\x00r\x00e\x00n\x00c\x00y\x00\x008BI\ +M\x045\x00\x00\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\xff\ +\xff\x00\x00\x00\x00\x00\x00\x00d\x01\x008BIM\x04\ +\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ +\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\ +\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\ +\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +\x008BIM'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\ +\x00\x00\x00\x00\x00\x00\x018BIM\x03\xf5\x00\x00\x00\ +\x00\x00H\x00/ff\x00\x01\x00lff\x00\x06\x00\ +\x00\x00\x00\x00\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\ +\x06\x00\x00\x00\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\ +\x00\x00\x06\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00\ +-\x00\x00\x00\x06\x00\x00\x00\x00\x00\x018BIM\x03\ +\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ +\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ +\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\x03\xe8\x00\x008BIM\x04\x00\x00\x00\x00\ +\x00\x00\x02\x00\x008BIM\x04\x02\x00\x00\x00\x00\x00\ +\x02\x00\x008BIM\x040\x00\x00\x00\x00\x00\x01\x01\ +\x008BIM\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\ +\x00\x00\x0a8BIM\x04\x08\x00\x00\x00\x00\x00\x10\x00\ +\x00\x00\x01\x00\x00\x02@\x00\x00\x02@\x00\x00\x00\x008\ +BIM\x04\x1e\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008\ +BIM\x04\x1a\x00\x00\x00\x00\x035\x00\x00\x00\x06\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\ +\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00null\x00\x00\ +\x00\x02\x00\x00\x00\x06boundsObjc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ +\x00\x04\x00\x00\x00\x00Top long\x00\x00\ +\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ +\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ +\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ +\x00`\x00\x00\x00\x06slicesVlLs\ +\x00\x00\x00\x01Objc\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x05slice\x00\x00\x00\x12\x00\x00\x00\x07s\ +liceIDlong\x00\x00\x00\x00\x00\x00\ +\x00\x07groupIDlong\x00\x00\x00\ +\x00\x00\x00\x00\x06originenum\x00\ +\x00\x00\x0cESliceOrigin\x00\ +\x00\x00\x0dautoGenerated\ +\x00\x00\x00\x00Typeenum\x00\x00\x00\x0a\ +ESliceType\x00\x00\x00\x00Im\ +g \x00\x00\x00\x06boundsObjc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ +\x00\x04\x00\x00\x00\x00Top long\x00\x00\ +\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ +\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ +\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ +\x00`\x00\x00\x00\x03urlTEXT\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x00nullTEXT\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00MsgeTEX\ +T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x06altTa\ +gTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0ec\ +ellTextIsHTMLboo\ +l\x01\x00\x00\x00\x08cellTextTE\ +XT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x09horz\ +Alignenum\x00\x00\x00\x0fESl\ +iceHorzAlign\x00\x00\x00\x07\ +default\x00\x00\x00\x09vertA\ +lignenum\x00\x00\x00\x0fESli\ +ceVertAlign\x00\x00\x00\x07d\ +efault\x00\x00\x00\x0bbgColo\ +rTypeenum\x00\x00\x00\x11ESl\ +iceBGColorType\x00\x00\ +\x00\x00None\x00\x00\x00\x09topOut\ +setlong\x00\x00\x00\x00\x00\x00\x00\x0al\ +eftOutsetlong\x00\x00\x00\ +\x00\x00\x00\x00\x0cbottomOutse\ +tlong\x00\x00\x00\x00\x00\x00\x00\x0brig\ +htOutsetlong\x00\x00\x00\x00\ +\x008BIM\x04(\x00\x00\x00\x00\x00\x0c\x00\x00\x00\ +\x02?\xf0\x00\x00\x00\x00\x00\x008BIM\x04\x14\x00\ +\x00\x00\x00\x00\x04\x00\x00\x00\x0d8BIM\x04\x0c\x00\ +\x00\x00\x00\x043\x00\x00\x00\x01\x00\x00\x000\x00\x00\x00\ +0\x00\x00\x00\x90\x00\x00\x1b\x00\x00\x00\x04\x17\x00\x18\x00\ +\x01\xff\xd8\xff\xed\x00\x0cAdobe_CM\x00\ +\x01\xff\xee\x00\x0eAdobe\x00d\x80\x00\x00\x00\ +\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\x09\x08\x0c\x09\x09\x0c\ +\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\ +\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\ +\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\ +\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x000\x000\ +\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\x03\ +\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\ +\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\ +\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\x00\ +\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\ +\x00\x02\x11\x03\x04!\x121\x05AQa\x13\x22q\x81\ +2\x06\x14\x91\xa1\xb1B#$\x15R\xc1b34r\ +\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\ +\x83&D\x93TdE\xc2\xa3t6\x17\xd2U\xe2e\ +\xf2\xb3\x84\xc3\xd3u\xe3\xf3F'\x94\xa4\x85\xb4\x95\xc4\ +\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\ +\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\ +\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\ +\x055\x01\x00\x02\x11\x03!1\x12\x04AQaq\x22\ +\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$\ +b\xe1r\x82\x92CS\x15cs4\xf1%\x06\x16\xa2\ +\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17dEU6\ +te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\ +\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\ +\xa6\xb6\xc6\xd6\xe6\xf6'7GWgw\x87\x97\xa7\xb7\ +\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5\ +T\x92@\xce\xbe\xdcl+\xef\xa6\xa7d[S\x1c\xea\ +\xe9f\xae{\x80\xf6\xb0\x7fY\xc9)\x8e_Q\xe9\xf8\ +Q\xf6\xcc\x9a\xb1\xf7}\x1fU\xedd\xff\x00Wy\xf7\ +\x22\xd1\x91\x8f\x93X\xb7\x1e\xd6]S\xb8}n\x0ei\ +\xfe\xd3%\xab\x98\xe8?Uq\xf31\x7fju\xfa\x9d\ +\x95\xd4\xb3\x7fI`\xbbp\xd8\xd3\xfc\xdd~\x94\xb7g\ +\xb3\xf3\x1d\xfc\xc7\xf3?\xe0\xd0rzs~\xab\xf5\xcc\ +\x0c\xae\x98\xe73\x03\xa9\x5c\xdc\x5c\xacB\xe2[\xb9\xda\ +Wcw\xeew\xb7\xe9\xfe\xfd\x7f\xcd\xff\x005v\xc4\ +\x94\xf6)$\x92J\x7f\xff\xd0\xf5U\x9b\xd6\xfa\xf6\x17\ +E\xaa\xb7\xe4\x8b,}\xee-\xaa\x9a\x9b\xb9\xee#W\ +}\x22\xc6\xedo\xf5\x96\x92\xe5\xfe\xbd\xfe\x87\x1f\xa6\xf5\ +\x01\xa3\xb0\xf3kt\xf84\xcb\x9d\xff\x00\x9e\x98\x92\x94\ +>\xb7\xf5[\xc4\xe1t\x0c\xab\x01\xfa.\xb6k\x1f\xf9\ +\xed\xcd\xff\x00\xa6\xb3\xba\x9d\x1f\x5cz\x8d\xf4u,\x9c\ +*q\x9b\xd3w_UN\xb09\xbb\x84Y\xea=\x8c\ +s\x9fe\x8d\xf4\xfd\x9f\xcd\xad\xff\x00\xad\xcf\xeau\xf4\ +Km\xe9\xaf5\xbe\xb2\x1f{\xd8@x\xa5\xb2\xeb\x9d\ +S\x8f\xd1s\x7f\xcf\xf4\xfdOO\xf4\x89\xfe\xaa]\x99\ +\x97\xf5~\x8bs\xec\x17\xbe\xdd\xfb^L\xb8\xd7\xb9\xcd\ +\xaf\xd5#\xfc&\xcf\xa7\xff\x00\x82~\x91%6>\xaf\ +\xf5Gun\x8f\x8d\x9fcZ\xcb.i\xf5\x1a\xd9\xda\ +\x1c\xd7:\xb7\xed\xdd\xee\xda\xed\x9b\x96\x8a\xe6?\xc5\xf9\ +,\xe9\x19\x18\x8e>\xecL\xabj\x8f\x01\xedw\xfdV\ +\xf5\xd3\xa4\xa7\xff\xd1\xf5U\x87\xf5\xd3\x0d\xf9\x7fV\xf2\ +\xd9[\x0d\x9606\xc65\xa2O\xb1\xcds\xf6\xb4\x7f\ +\xc1\xef[\x89$\xa7\x92\xa3\xeb\xadY8\x8c\xa2\x9e\x97\ +\x97\xd4\x1ek\x0c\xb86\xb0kq\xdb\xb6\xc1\xfe\x13u\ +n\xfeS\x13\xe3u_\xad\x1e\x8b1\xfa_\xd5\xe6a\ +\xe3\xd66\xd6\xcbl\x0ckG\x95_\xab\xae\xb1$\x94\ +\xe0}U\xe9\x1dK\x01\xd9\xf9]G\xd3\xae\xec\xfb\xbd\ +oB\xa2KX}\xc5\xee\xdc\x7f}\xcf\xfa\x1e\xff\x00\ +\xf8\xc5\xbe\x92I)\xff\xd9\x008BIM\x04!\x00\ +\x00\x00\x00\x00a\x00\x00\x00\x01\x01\x00\x00\x00\x0f\x00A\ +\x00d\x00o\x00b\x00e\x00 \x00P\x00h\x00o\ +\x00t\x00o\x00s\x00h\x00o\x00p\x00\x00\x00\x19\ +\x00A\x00d\x00o\x00b\x00e\x00 \x00P\x00h\ +\x00o\x00t\x00o\x00s\x00h\x00o\x00p\x00 \ +\x00C\x00C\x00 \x002\x000\x001\x005\x00.\ +\x005\x00\x00\x00\x01\x00\x00\x00\x0cHLino\x02\ +\x10\x00\x00mntrRGB XYZ \x07\ +\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00acspM\ +SFT\x00\x00\x00\x00IEC sRGB\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\ +\x01\x00\x00\x00\x00\xd3-HP \x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11cprt\x00\ +\x00\x01P\x00\x00\x003desc\x00\x00\x01\x84\x00\ +\x00\x00lwtpt\x00\x00\x01\xf0\x00\x00\x00\x14b\ +kpt\x00\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\ +\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\x00\x02,\x00\ +\x00\x00\x14bXYZ\x00\x00\x02@\x00\x00\x00\x14d\ +mnd\x00\x00\x02T\x00\x00\x00pdmdd\x00\ +\x00\x02\xc4\x00\x00\x00\x88vued\x00\x00\x03L\x00\ +\x00\x00\x86view\x00\x00\x03\xd4\x00\x00\x00$l\ +umi\x00\x00\x03\xf8\x00\x00\x00\x14meas\x00\ +\x00\x04\x0c\x00\x00\x00$tech\x00\x00\x040\x00\ +\x00\x00\x0crTRC\x00\x00\x04<\x00\x00\x08\x0cg\ +TRC\x00\x00\x04<\x00\x00\x08\x0cbTRC\x00\ +\x00\x04<\x00\x00\x08\x0ctext\x00\x00\x00\x00C\ +opyright (c) 199\ +8 Hewlett-Packar\ +d Company\x00\x00desc\x00\ +\x00\x00\x00\x00\x00\x00\x12sRGB IEC6\ +1966-2.1\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x12sRGB IEC6196\ +6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00XYZ \x00\x00\x00\x00\x00\ +\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccXYZ \x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00X\ +YZ \x00\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\ +\x00\x03\x90XYZ \x00\x00\x00\x00\x00\x00b\x99\x00\ +\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\ +\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\ +\x00\x00\x00\x00\x00\x00\x16IEC http:\ +//www.iec.ch\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x16IEC http\ +://www.iec.ch\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00desc\x00\ +\x00\x00\x00\x00\x00\x00.IEC 61966\ +-2.1 Default RGB\ + colour space - \ +sRGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.\ +IEC 61966-2.1 De\ +fault RGB colour\ + space - sRGB\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00,R\ +eference Viewing\ + Condition in IE\ +C61966-2.1\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00,Reference \ +Viewing Conditio\ +n in IEC61966-2.\ +1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00view\x00\ +\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\ +\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01X\ +YZ \x00\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00\ +W\x1f\xe7meas\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x02\x8f\x00\x00\x00\x02sig \x00\x00\x00\x00C\ +RT curv\x00\x00\x00\x00\x00\x00\x04\x00\x00\ +\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00\ +(\x00-\x002\x007\x00;\x00@\x00E\x00J\x00\ +O\x00T\x00Y\x00^\x00c\x00h\x00m\x00r\x00\ +w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\ +\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\ +\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\ +\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\ +\x1f\x01%\x01+\x012\x018\x01>\x01E\x01L\x01\ +R\x01Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\ +\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\ +\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\ +\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02\ +T\x02]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\ +\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\ +\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03\ +O\x03Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\ +\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\ +\x13\x04 \x04-\x04;\x04H\x04U\x04c\x04q\x04\ +~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\ +\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05\ +g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\ +\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06\ +j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\ +\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\ +\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\ +\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\ +\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09\ +d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\ +\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\ +\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\ +\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0c\ +C\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\ +\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\ +\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\ +\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\ +\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10\ +~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11\ +m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12\ +d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13\ +c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14\ +j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15\ +x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\ +\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\ +\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\ +\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\ +\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b\ +;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c\ +{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\ +\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\ +\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A \ +l \x98 \xc4 \xf0!\x1c!H!u!\xa1!\ +\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#\ +8#f#\x94#\xc2#\xf0$\x1f$M$|$\ +\xab$\xda%\x09%8%h%\x97%\xc7%\xf7&\ +'&W&\x87&\xb7&\xe8'\x18'I'z'\ +\xab'\xdc(\x0d(?(q(\xa2(\xd4)\x06)\ +8)k)\x9d)\xd0*\x02*5*h*\x9b*\ +\xcf+\x02+6+i+\x9d+\xd1,\x05,9,\ +n,\xa2,\xd7-\x0c-A-v-\xab-\xe1.\ +\x16.L.\x82.\xb7.\xee/$/Z/\x91/\ +\xc7/\xfe050l0\xa40\xdb1\x121J1\ +\x821\xba1\xf22*2c2\x9b2\xd43\x0d3\ +F3\x7f3\xb83\xf14+4e4\x9e4\xd85\ +\x135M5\x875\xc25\xfd676r6\xae6\ +\xe97$7`7\x9c7\xd78\x148P8\x8c8\ +\xc89\x059B9\x7f9\xbc9\xf9:6:t:\ +\xb2:\xef;-;k;\xaa;\xe8<' >`>\ +\xa0>\xe0?!?a?\xa2?\xe2@#@d@\ +\xa6@\xe7A)AjA\xacA\xeeB0BrB\ +\xb5B\xf7C:C}C\xc0D\x03DGD\x8aD\ +\xceE\x12EUE\x9aE\xdeF\x22FgF\xabF\ +\xf0G5G{G\xc0H\x05HKH\x91H\xd7I\ +\x1dIcI\xa9I\xf0J7J}J\xc4K\x0cK\ +SK\x9aK\xe2L*LrL\xbaM\x02MJM\ +\x93M\xdcN%NnN\xb7O\x00OIO\x93O\ +\xddP'PqP\xbbQ\x06QPQ\x9bQ\xe6R\ +1R|R\xc7S\x13S_S\xaaS\xf6TBT\ +\x8fT\xdbU(UuU\xc2V\x0fV\x5cV\xa9V\ +\xf7WDW\x92W\xe0X/X}X\xcbY\x1aY\ +iY\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\ +\xe5\x5c5\x5c\x86\x5c\xd6]']x]\xc9^\x1a^\ +l^\xbd_\x0f_a_\xb3`\x05`W`\xaa`\ +\xfcaOa\xa2a\xf5bIb\x9cb\xf0cCc\ +\x97c\xebd@d\x94d\xe9e=e\x92e\xe7f\ +=f\x92f\xe8g=g\x93g\xe9h?h\x96h\ +\xeciCi\x9ai\xf1jHj\x9fj\xf7kOk\ +\xa7k\xfflWl\xafm\x08m`m\xb9n\x12n\ +kn\xc4o\x1eoxo\xd1p+p\x86p\xe0q\ +:q\x95q\xf0rKr\xa6s\x01s]s\xb8t\ +\x14tpt\xccu(u\x85u\xe1v>v\x9bv\ +\xf8wVw\xb3x\x11xnx\xccy*y\x89y\ +\xe7zFz\xa5{\x04{c{\xc2|!|\x81|\ +\xe1}A}\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\ +\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\ +\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\ +\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x89\ +3\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8c\ +c\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\ +\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\ +\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x96\ +4\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\ +\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\ +\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0\ +i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\ +\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7\ +n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\ +\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\ +\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2\ +K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\ +\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\ +\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\ +\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1\ +g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5\ +K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9\ +:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd\ +5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1\ +<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5\ +N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9\ +l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\ +\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\ +\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\ +\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea\ +[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\ +\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\ +\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\ +\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\ +\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\ +\x00 P8$\x16\x0d\x07\x84BaP\xb8d6\x1d\ +\x0f\x88DbQ8\xa4V-\x17\x8cFcQ\xb8\xe4\ +v=\x1f\x90HdR9$\x96M'\x94JeR\ +\xb9d\xb6]/\x98LfS9\xa4\xd6m7\x9cN\ +gS\xb9\xe4\xf6}?\xa0PhT:%\x16\x8dG\ +\xa4RiT\xbae6\x9dO\xa8TjU:\xa5V\ +\xadW\xacVkU\xba\xe5v\xbd_\xb0XlV;\ +%\x96\x10\x01\x07ZDA\x1b`\xac\x1bo\x0f\x81\xae\ +A\x10\x0d\xd4\x02\xf9\xbc<\x1eW\xb6\xe3\xc6\xfc\xda\xbf\ +<[vl&\x166\x0a\xc4\x06\x84x\xb2\xb6,F\ +Y\xb6\x04E@\x5c\xa02(\xfc\xcc=\xdd\x99\xb6c\ +\x83<\xb2n\xe8U\x0f]#\x93\x0d\xa7\xc3\x04\xf5C\ +\x01n\xb4\xde\x1e\xd8\x12\xc1\x1b0\xac\xb1\xf1\xb7v7\ +\xf7J\xe6\xce\xf5:\xea\xe02\xb5\x1c:\xc8\xbf\x8cu\ +\x19\xf2O\xe0N`.x\xfd\xe8>\x18\xbd3cc\ +\xac\x9d\xe2vi ~\xe0K\x923?\x8b\x10*b\x1eA\x04\xa8U\x05\x8dH\ +\xc1\xdd\x07\x9aN\x01\xd4e\x9c\xf0\xa9\x82\xd2\x1e\xa7)\ +\xfd\x0d\x9f,\xa0\x0a\xb7\xad\xe1\x105\x11\x88\x00\x94L\ +\x16\x02\x11HP\x81\x80(\xc1\xad\x17\x93\x064d6\ +\xc3g\xf1\xf9\x03G\x09(]\x1d\x8eA\xc4|F\xa2\ +\x90\x91\x94fH\x83\xe1\xcb#\x97\xb0\x11\xff\x02\x22\xe0\ +\x14\x9c\x02\x832\x88|\x18\xca\x83\xe4F\x0d\x08\x08\xc1\ +\xa1-\x90\xe6T\xbc=G3\x0a;\x13\x02Ah\xa1\ +3\x99\x0e`\x08\x05\x22\x06\xdc\xdcR\x18s\x88\xcc\xcc\ +\x1f\x87\xbaP\xbb\x00MhZ8\x86\xf3\xe9\x12\xbb\x00\ +h\x82\xf0|\x9d\xe5U\x0c\x14=\x87\xb9\xd51Q\x88\ +\xa8\x93G\x96\xc0\xed$$\xa2\x0d\x09\xbaT\x97\xf4\xc8\ +\xbd\x1a\x9fI\xa07O\x88b\x0dDR1\x00P0\ +\x88\x1bUIB`U\x83\x05\x1bW\xa1\xa0]d\x0d\ +\x8a\xf5\xa9\xb359\xc8\x5c0r\x15\xb5\xe8`\xdb\x9f\ +\x07jx\x0b\xd8\x81\xd0\x9bc\x98\x12p\x04\x02\xa1\x94\ +\xe1Wg\x85\x8c\x0b\x07XZ\x88 ik\x90A\x95\ +\xb4>\xa2\x13\x89\x864\x1a\xf7\x092\xa2\x077)\x1f\ +=\x0e\x08\x84\xb6h\x11\x12\xf1\x94<\xda\xb5\x83\xb8\x03\ +\x82U\xa8\xael6`Cj\x85\xd1'QQ\x7f\x84\ +\x87\xde\x04y\xa8\x80\x1e\x0c\x04\x0axI\xa1\x14\x82\x01\ +:\x18y\xe2\x07\x05\x9eU\x85s\xa1\xedx\xcc/\x10\ +X7\x07X\xe9\x22\x887F\xf9\x5c]\xe4\x82\x9a\x99\ +\x8d\x0d\xf8\xe8tH!\x92Q\xfcWf\x01\x99\xdb\x99\ +\x9a\x18\xc3\xe0\xf9\x01\xe2\xb6tkT\xa0\xd2\x1e\x7f\x96\ +Z\x08zth\x86*\x98\x04\xe9\x00\xbet+\x1a\xf7\ +\x98\x22\x86\x17\x9a\x88\xaaoj\x85fl\xf7\xe1\x81D\ +\xce(\x18\xef\x90 \x86h\x87A\x86Y\xec\x82\x06\x5c\ +\xa8\x0a;I\x96\x0a\xed\x81\xa2\x18an\x03#\xcc\xec\ +j\xef\x80\x03Y\x01`\xd6\xd8\x0a\x86\xb7D\xa2\x0c\x87\ +\xe8#\xfe[\x89G\x1f\x0c[\xaa\x827\x14X\x04\x1c\ +h\x9e\x86FF0\xdcjr\x84\x9e\xebx\xd3\xe0\xd8\ +\x87\xcc\x88\x86o<@:\x07\xe9\xf2\xaaQ\xe2M#\ +I\xf2\x11\x97'\xca\xf2\xfdj\xb35\x018H\xa6h\ +\x81\xfd\xa8J\x86\x18=\xc8\xc6\xde\x9b$\xf7]\xdf\xaa\ +\xaf\xc0,\x1ckf4X\x86\x17^H\xa4\xcf\x1c\x05\ +\x7f\x81\xe7\xaa!\xf7\xa4M\x85\x1e\xa8\xc9\x96\xc0G\xe9\ +_\xed\x86\xcc\xd9\xd8gz\x1f\x0a\x92\xc8\x85B\x97\xcc\ +g`\xc0\x18\x0e\x86\x1d\xffi\xad^\x95\xa1\x8d9\xf1\ +~\x8a-\xca\x1c\x91\xd3\xd0\xe2\x88s\xc6i\x02\xffD\ +\x03\xf5\x80E\x05\xf4\x80v\x966\x11\x00 !\x83\xda\ +\x06\x0ef`+\x81\xa4\x0c\x1e\xc3\x9e\x01\xc1Rz\x95\ +\xc2\x10L\x83B\xf1\xe3\x90\xb1\xf5\x07\xc7\x84!\x1e\x03\ +e<\x0fHL8\xc7\x0c)\x16*\xa4m\x0a(-\ +\x0b\xc8\xaa\x1e\x01\x8d \x04\x81d@\x08KH\x0e\x04\ +\x802\x1e\x01\xd8h\x06\x1b\xf8>v\xa0=\xdb\x923\ +\xf89\x05\xd3\x91\x0d\xf0\x88lC\x07\x5c\x87\x80kx\ +\x03p&!\x82f\x18\x0ab\x18$\x87 \x8e\x1a\x01\ +epO\x10x\xee\x1aB\xc22\x03\x96-\x13\x8a\xe2\ +x\x86L\xe1\xbcC\xe6\x90\x05\xa2\xec?\x87\x800\x0e\ +\xb0\xc0O\x1bU(\x19\x80\xa5a\xe4\x8b\xa7\x96g\x9e\ +th(\xcb(\x02\xb7\xb0i\x0eA!\x91\x05q\xda\ +\x1c\x82%\xe6\x04\x95\xc3NQ\x90\xb0P*\xc1\x80\x18\ +d\x11>k\xc0\xaeN\x06\xb0E'\xc2\xa9\xaa\x02`\ +\xbd\x1c#Q\xf6\xc5\x96\x00\xeci\xd2<\x86!Q\xce\ +0\x9b \xb3p2d\x9cH\x80\x8f-\xc5\x84\x8a,\ +\x08\xd4~,\x01\xd5\x09\x87\xa0\xe2\x89\x90\x88\xc0\x17\xe1\ +\xb2\x86\x074\x1f\x1fC\xc6e\x0e\xf5\x06<\x10@<\ +\x12\xa0\x9ej\x06\x22\x190\x07\x18\xac\x9b@\xb6e\x0f\ +\x19hL$ N\x9cC\x0d\xe1\x03r\x98\xe8G\xc2\ +\x89\x1dl@y\x8d\xe3\x027!\x10\xd6\x89\x93\xb0p\ +\xcc\x01\xc4\xc0\x87\xdb\x04#i\xf4\x1b\x88\xa3\x8c\x0b\xc3\ +\xa9\x0ct#\xe6m\x0a\xc0\x5c`F\xd4\xdf%\xe0\x9a\ +\x86\x06\x00\x81C\xc4\xf90e\xca\x0cv\xcd\x8a\x10\xb4\ +\xa0\x90\xe8Pc\xb9`N\xb6\x22\xa2GL\xf8\x1e\x84\ +\xd2N\x02\xb0\xd6\x0e\xe9@\x94\x22\x02\xe2\x96\x04\xb1\xc5\ +K\xc5\xb5\x0a%\xce(#\x0a\xf7\x1a\x08\x02\x81\x18\x97\ +\x94vv\x0e\x02\xf6<\x86\xeb\xed\x1d\xe3QiS\xf1\ +\xbb=\x94\x18\xef*\x8ep%\xd4\xd1vD\x06=Q\ +\x0e#N\xaa2\xcadK\x168M\x181\x04\x86Q\ +\xd1\xa5W\xc4ta\x1aS\xd1]\xcd\xd3\x87\x16\xc2\xad\ +i\x1a\xb1\xec\x85\xa2\xf1\xac&\x06%q\x0d5\x5c\x96\ +P\xf0\x80(h`&\x0b\xd0.\x06\x8aZ\xfc\x07\x92\ +P\xfdQ\x8f\xa4\x044\xb1\xaf\x02H`\xe6\xb1B\xfc\ +ZX\xd0\x85]\x09X0\xb2A\xe4\x1bYQ\x0c\xf6\ +\x07\xf8\xfd~\x00\xca\xb1-J\xb20\x1b\xfc\xb3!T\ +\xfcoPP[\x19\xec\x81%\x03\xf6\xac&\xcbp\x8e\ +,\x88\x83Q\x17\x8dM\xaa\x93KBc\x82\xb47\x95\ +-\x84b&\xe1\xb6)S\xa0\xf5%\x93DK \xb0\ +U\x5c\xc8\x5c\xe8\xa0\xa0\xbe\x84Z\x92J\x99\x01s\xb2\ +\x19\xe9\xe0\x86.\xe0\xf0\xba\xc4I,\xb0\x8f\xdcG\x82\ +\x9b\xbc\x19\xae\xa1\x0b\x1d7\x8cc)\x91~\x17\xaa1\ +(G`\xb9\x1e\xa3\xf2 -o\x80DH\xe3\x94^\ +\xdc\xe2H\xd7\x97\xb0\xd8\x86\x80\x5c\x86[\xe1Gy\xab\ +\xd9*\x004\xd0WSzrE\xe7\xb4}\x0a\x0fx\ +g\x92E$\x07BC\xa5q\x04>\xb8\x8c@\xd5[\ +\x84\xbd\xf6$\xed\xa4(\xb6\xb6\xdaC\x10\x90\xc8\x8c\x82\ +\xc0\x1c\x92\x8bCg\xc9\x03\x86\x1cb\xe1\xc1\xa9BG\ +\x1d\x82\xa61\x1ar\x10\x86.\xb5\xda\x97\x97\x86\x1a$\ +\xa1\x0f\x1e\x0as\x1c\x16\x08b\xbbP\xc2\xa8\x15O\x89\ +\xf4H\xab\xb0\xa0\xaf!|\x90A!\xce\xbf\xc5@%\ +\xb8$\x82\x19@x\xa4C\x1d\xe0\x9ew#\x041\xe3\ +\xa2J\xb6\x81\x90|Z\xe0\xd0A\x90\xc6-\x90\xc1T\ +\xc0\x1c$\x93\x0ea\xe0*\xdb\x88\xfc\xe8b`\xae\xd2\ +\x12I\xc4\x13\x86\x18\x18\xcf@\xf0\x86R\xf1\xc4-)\ +`\xb8\x09\xb9x\x92\x18\xe0\xaf\x8f\x02\x18\xa8\xb3\x16i\ +^\xd9\xc4 I,\xfd\xa1$\x14\x8b9\xcfbI\x92\ +rY\x0c\x1dzlf=\xb1^\x0d\x88\x18\xff\xd0\x84\ +~Q\x03\x07\xcc\x14\x86m\xe1!V4Z\x04+\x14\ +9\x85\xf9$\xcckem\x92\x0a\x8d\x90\xc1L\xa6$\ +\x97\xac:#\xe0p\x22\xc8e b`\xb2T\xea2\ +<\xbe@\xa2\xf6\x1bRH\x85\xc9`\xbf\x0b!q#\ +\x91\x0d,j\xac\xa0\x0cG\x1c\xa0\xd4\x12.Et\x92\ +{V\x07\xc2u\xae\x16+5\x0d\x8f\xc8\x1f\xa3\x87p\ +\xd3\xd8\xc4u@\x1cH#\x82\xc4\ +i\xcd\x07\x02(\x8a\xef\x08Y@\x08!\x83\xd2\x19`\ +\xf6\x19\xf0\xc4\xb2\xe2nP\x0b\xf6\xfbH\xb6\x91H\xb6\ +k(\xf2\x8a\x07`&\x0e\xc8\x11\x8e\xc2\x19\x0a\x03\x0b\ +\x02&g\x05\xec\x1b+\xf6\xf5g*r#\xc8#e\ +\x00M@\x15\x08\xe8\xe6\x03\xe8\xaa\x8a\xa7\xc8\x81/\xb4\ +k\xc2\x90\x99A\xe0\xb3i\xd8\x1b\xf0\xec\x22\xc0\x02x\ +\xa7\x84?B\x16\xf4a\xb8\x14\xcf@\x17\xc0\xb6 \x8b\ +\xf6\x8f0\x9cEH\xb2D\x00E\x0aF\x9ck\xc8d\ ++\x8a@\x171\x5c\x0a\x0cC\x12b4\x08Qh\x14\ +\xa0I\x16\xe0\xb4\x9a\xe8L\x1c.\xde\x18\xe8\xab\x10\xa6\ +\x9c\xd5C\x88\x99A\xe4\x95\xc1\x80H\x81\x98\x0f\xe6f\ +\x1d\xa6k\x16B8\xb2@`\x0f\x0e8\x10\xe9J\xdc\ +\xa9|\x9e\xc9\x88\xa7\xe1\xb6X\x01\xda\xa3\xa9R\xa8\xc9\ +\xb1\x19\xc2H\xebn\xba\x9cN\xbe+i\xd1\x1b\xe2\xf6\ +\x9d\xc2\xfc\x1bi\x86\x84!\xac\x9e\x89\xec\xc8\xd1\xc4'\ +\xe7`\xb5\xc1ds\x82v\x1f\xe9R\x9b\x040\x1c\xaa\ +(\x9dQ\xfe0!\xb2\x9d\xeaA\x1e\x91\xea+0\xa4\ +\xae\xc1D\xa6\xe7\x1e#jv7\x11\x22\x9d\x81\xbc\x8c\ +!\xaa\x9ef \x1b\xec\xd4\xa92\x12Z\xa4\xf0\xeam\ +\xbe\x09\xa9\x1e\x97\x91\x1c\xa2\xe2\xfc\x1b\x8a\x85\x1e& \ +\x1b\xd1\xfe\xf2\xf2;%\xf2a&2e&ri&\ +\xb2m&\xf2q'2u'ry'\xb2}'\xf2\ +\x81(2\x85(r\x89(\xb2\x8d(\xf2\x91)2\x95\ +)r\x98(\x22\x02\x00\x03\x00\x01\xa0\x03\x00\x01\x00\x00\ +\x00\x01\x00\x00\x00\x02\xa0\x04\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x03\xa0\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\ +\x00\x00\x02\x93\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a <\ +circle id=\x22Oval-\ +3\x22 cx=\x223.0315222\ +4\x22 cy=\x222.9313699\ +9\x22 r=\x222.5\x22>\x0a \x0a \x0a\x0a\ +\x00\x00\x02\x9b\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Icons / Sys\ +tem / Carat / Wh\ +ite / Default\x0a \ +Created with Ske\ +tch.\x0a \ +\ +\x0a <\ +/polygon>\x0a \x0a\x0a\ +\x00\x00\x05\x14\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / slice / s\ +tandard copy 2\x0a Created with Sk\ +etch.\x0a \ + \x0a \ + \x0a \x0a \ + \ +\x0a \ + \x0a \x0a \x0a\x0a\ +\x00\x00\x03(\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / layer / d\ +efault\x0a \ + Created\ + with Sketch.\x0a \x0a \x0a <\ +rect id=\x22Rectang\ +le\x22 x=\x220\x22 y=\x226\x22 \ +width=\x2212\x22 heigh\ +t=\x228\x22 rx=\x221\x22>\x0a \ + \x0a\ + \x0a \ + \x0a \x0a\ +\x0a\ +\x00\x00\x04\x96\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Not active - Def\ +ault\x0a \ + Created w\ +ith Sketch.\x0a \x0a \ +\x0a \x0a \x0a\x0a\ +\x00\x00\x09\x85\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\ +\x0a \x0a \ + \x0a \ + \ +\x0a \ + \x0a \ + \ +\x0a \ + \x0a <\ +/g>\x0a \x0a\x0a\ +\x00\x00\x05\x15\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / slice / \ +Editor only - Sa\ +ved\x0a \ +Created wi\ +th Sketch.\x0a \x0a \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x02\x93\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a <\ +circle id=\x22Oval-\ +3\x22 cx=\x223.0315222\ +4\x22 cy=\x222.9313699\ +9\x22 r=\x222.5\x22>\x0a \x0a \x0a\x0a\ +\x00\x00\x05\x19\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / slice / \ +Editor only - Up\ +dated\x0a \ + Created \ +with Sketch.\x0a \x0a \x0a \ +\x0a \ +\x0a\x0a\ +\x00\x00\x05\xfa\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / lock / on\ +\x0a Created with \ +Sketch.\x0a \ + \x0a \ +\x0a \ + \x0a \ + \x0a \ + \ +\x0a \ + \x0a \ + \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x15\xa4\ +I\ +I*\x00B\x08\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ +\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ +-\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ +$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ +S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ +O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ +\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ +B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ +\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ +o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ +\xc4Sp\xd8\x9cf6\x7f\x8b\xc7drS<\x86O\ +-\x97\x93\xe5s\x19\xbc\xe4k5\x9d\xd0hk\xd5\x8d\ +\x16\x97M-\xd2Q\x00:\xbb\xf1\xaf\x5c\x1a}\xecG\ +pQ\x94\x14c\x05\x0e\xc1B;\xa8K\xbe\x0a\xf0\x82\ +\xb8\xf5`\x16|\x15\x9c\x04\xe41\x12\xbc\xb75\xf7?\ +\x94\xd4\xd0\xf8v\xc3?T7 .AJ\x10Q\xbc\ +\x14\x036\x90\xc1\x19pUx\x0f\xcc\xa5K\xfa\x5cx\ +\x0e\x8d\x0b\x9f2\xe9\xd7M\x1f1\xc4\x80\xe1 )\xc1\ +@\x95g\xe7\x93\xcc\x01\x92\x0fI.c+\xafzc\ +\x03&\x0f\x8a\xa44\xc1\x80\xe9\xfb\x07\x91\xa8(\xaa\xbd\ +\x15\xa8(\xe4MC\x07\x12\xa7\x04*\xef\x0a\x8d\x05(\ +\xa3\xfcD\x03\x1d\x11(\xe6\x90\x0fh(\x16\xc4\x1e\xc8\ +)\x0a\x03\xc6\x04i'\x19\x9f*<8\x96F\xe9\x5c\ +@\x9f\x0c\xd1\xe8\x8c\x82\x92h(L\xd1\x1bh(\xdd\ +\x0c\x13E\xc2\x87\x1c\xa5RbS\x1d\xa6q\x10\xfe\x01\ +D\xa7A\x06\x90\x0fM:\x1eD\x032\xe8\xf6@\xcc\ +\x07\xf2s'%\x13\x22O(%\x83|\xd4\x08\x1e\xf3\ +iL\x82\x892\xd2&\xe1\x97\x00D\xec,\x923\xcb\ +\x80\x99L\xcb\x83\xda\x9f\xcd\x09;\xaa3\x85I\x01`\ +\x82\x84\xb3\x92:n9\x00 \xa0KR\x06\xac:\xa5\ +O\xa9-\x02\x91G\xa30\x86\xf2 \xa0m\x14\x93\x9e\ +\x8f\xf8\xa3\x01\x17\x89M*\x92T\xe9\x1d.\x8dPb\ +*@X\xa0\xa0M>\x98\x1f\x0e\x18\x9cL\xd7\x05\xda\ +KT\xa4U\xe2=U\xa2\xb4\xcc~\x82V\x08 \x10\ +\xa99\xa8!X\x82\x96\xef\xf9\xc2\x06Z\x07!\xebi\ +\x9f\xee\x1b`\xd8\x97\xa8(8\xae\x1f\x08(\x9f$\x17\ +H\xf5|\x8e\xdch\xe5\x80\x88>c@\x8e\x7f]\x94\ +=\x8c\xa6\x1c\x00\x15\xe4:\x02\xf7\xa9_0\x103\x15\ +\x83\x1e\x9b\x88(F\xb1\x1f\x17\x90\x04(\x13\x18)r\ +\xcfO\xe9\xf5\xca\x8d\xdc\xe8\x5c\x184\x86\xb0y\xfa`\ +\xd6*a\x18\x05\xe3\x03\xf1\x1f\x8d\x9e\xe8\xf53~\xa0\ +\x97\xfa\xcf\x16\xa0\x81\xfc\x90f\x22\xd8^\x11\x0f(\xb8\ +j\x0dL\x83\xc8)\x92\x82\x83\x0a5\xf4\x00\x0d\x92A\ +.\x94\xe3\xf7\xf2\xdcs\xbf\xe1\xbc\x04\xf5\xa29R3\ +\xa3#\x18h\xdb\xa5\x81\xc7\xce\x9cb\xa0\xa1b\x8e\xe1\ +\x8c\x95\xc12N\xa5\xf9\xeeB\xba\x1a@~\xbc\x1e\x11\ +{\x09\xe6\x87i\x08\xbe\xca\x8bR\xe9\x00\x03A\x96h\ +(\x96\xa6\x14\x12@\xc2\x99\xeb@\x06D\xbc\x16Z\xb0\ +\xa0\xe1\xe5\x886\xce\x8a\xef\xe8\xa5/L\x8f\x88)\x07\ +xc\x00XU\x8d\x91\xf8\xeae\xba\xee\xeb\xc3\x86;\ +\xea\xc4R\x15\xc0\xa2|\xc2%\x1d\xdd!\xed\xd8\x7f\x17\ +\xe8(\x06\xa6\x0c\xb2A8\x9c\xf2\x0c\x13\xfa\x82\x07\x92\ +Ff\xa8o\xb2^\x12\x9e\xbazX\xdb\xa6\xe9\xc6\x92\ +\x0a\x0f\xa9\x87\x0d\x11$\x1f}E\xf9\x9f0\xf2*\x08\ +\x18I\x07\xb75\xa2\xf6i\xe3\xa7A\x91\xa9\x00\xe4\xa6\ +\xb8dN\xac<'\xbdK\x10\xe1\x90:\xb1\x01\xe5\xb4\ +}\x8a\x848|\x93d\xdb\xa2\x00\x00b\x9a\xff\x88\x10\ +\x16(\x9e{La\xdfF\x83\xceY*zF\xdej\ +wt\x8e\xc9\x01\x12T\x9cp\x00\x01\xef\x01\xec\xbc6\ +\xb6c\x8e\x18r`\xa2`G\xbf\x97\xc4O\xd4\x18\xb5\ + \xa1(\xa9\x0d\xd4\x90\x09\x0a\x1b\x0f\x04D\x80\x02\x92\ +\x97>\xdbH\x22\x89)\x87\x0cY\xc0\xb0\x9d\x03\x8aR\ +\x83\x1b)\x08\xa9\x0cT\x90\x0f\x0c\x1a\x99t$\x10 \ +\x15!\xb0\xd5\x81L((\xea\x0d\x92\x00\x05dS\xc5\ +\xa2H\x09\xb0\xc5\x1e\x8a\xf3\xb4T\x87\xb3VEe\x19\ +\xf0\x10\xf5\x067\xc8( *C\x19$\x1b3\x04\xa6\ +F\x11\x05\x07\xa5Ho5g\x22\xec\xa0y>Pj\ +\xe8\x82\x04H\xb8\x92\x22\xf9zS#iD\x15!r\ +\xd5\x82D:(\xcb\xa4D\x12\x00\xeeT\x87\xc2]\x03\ + =|\x0f\xa2\xea\xa6`\xe9\x04O`\x00\x05=C\ +V! X}\x8eE\x14\xd7\x06\xb0>?$\x80\xdd\ +tE5\x81\x048\x16/\x8b\xaa\x83\x08\x04\x82\x19\x94\ +\xe1\xf4\x01e\x00!\x12\x92\x8dd\x94X\x9aC\x8e\x9a\ +\x99\x15$\x14+\x15\x22\x00\x8cM@\xce\xa0\x084\x1e\ +\x11\x09\x85B\xe1\x90\xd8t>!\x11\x00\x19\xa2\x88\x98\ +9\xda%\x19\x8dF\xe1)\xe8\x1ah\xc6\xff\x91G$\ +\x92XD\x89\xff&\x95G\x002\xd0\x01\xa6`\x22~\ +\xcc\xda\x10pl\xaeq\x1aq\x86g\x82D\x0c\xfd\xf5\ +9\xa1P\xe1G\xfa0\x19\xcfInA\xc3\xb4Jt\ +)\xdf-\x00\x8bS5W,\xa2\x9fY\xacVi\xd5\ +(I\x9e\xc0^\x94(k\x96X1\xa6>\x98\xb3Z\ +\xe31C1\xa2\x0e\x97\xb6Q*Ez\xaaeU'\ +\x91\xdc\xe5u\xbb\xe4\x9a\xbd\x0c\xb7'\xe0\xe6\x0b\xfc\xe1\ +\xc4\x0d\xc5\x0a\x91\xb8\xd7\xae\x1e\xd8j\xc9\x03\x1f\x99V\ +\xb53!$\xa9&\xae\xe6xe\xfb3\x1a\xd0hb\ +X\x18]\x18\xfe\x08\xa4\xb9\xd8\xd0q\x8e\x92H\xa5\x8f\ +\x976\x15\x9br\x9a\x0eY\xda\xe9e\xac\xc06\xfcx\ +\x93\xe1>s\xf7\xbd\xdcCG\xc7\x86i\xa1\xc6\xdep\ +q\xf3\xd1d\xc1\xc3\x5c\xa8}H\xd7wKu\xa3\x96\ +\xe3l\x1d%\xdc\x889*C\x8b\xbb\x97\x91\xc6\xf1B\ +\xb9>\xb872#\x925\x0c2\xaf\xc6\x1c\x1c\x19\xee\ +\x84\xca`\xc7H\xf9\x1c\xfd!+r\x0a\x83\x22\xcf|\ +\x02\x83\x9e`\x1c\x16\x1e\x12\xf0q\xa4\xd1=PC\xda\ +\xf7>\x08\xd0\xd1\x0c\x09'\xf46Y \xe0$\x10\x85\ +\x12\xe0|F;\x91q1\xe6\xd29\xc3h\x1c}E\ +\xa4ZP3D\x08I\xf8\x01F\xa2a1\x1c\x17)\ +,(\xf5\xc7\x8f\x14,\x92-\xcd\xa2\x0cP \xe0\x1c\ +d\x84\x1d\x088\xf0\x83\x94\xc8\xf9\xf6\xa25\x0aB\x92\ +-\xa0\xe4:\x0e\x0b\xc9\x089\xfa\xc2\xa3\xe5\x22q\x1f\ +;\x93\x0b\xad %P\xc0\xd0,Cg\xf1G\x0fK\ +HQ\xe0\x83\x96\x089q\x1a\x80G\x08\x0b<\x1c\x88\ +A\xf7>\x03\x93P>\x83\x89\x088\xa0\x83\x82\x13r\ +\x12~\xce\xa2\xe4pL\x15\x0a$\xc6\xe5R\x0e<\xca\ +\x9c\xac\x038\xa8\x947\x080\x0bC\xd3\xac9\xf8\xa9\ +\x0b+\xb9X\xaeRM\xddL\xda\xd2\x8a\x22\xddB \ +\xc5:\x0e\x04S\xd5\x92\x88|7(\xfc\xe4\xb5\xd5\x0d\ +\x85t\xd2UJ\xca`4\x86i\x99\xfaW \xe0\xf5\ +gd#G\x12\x0e)\xa3\xe6c\x0f^46\x8b3\ +_,\xcbp(\xa9\x15\x09@\x87d\xdb\xa8A~\x03\ +\xdc\x22\xbb\x84I\x9dm%\xa6\xc8]\x0c=\xaa\xb9\x95\ +Wp\x06^^$B\x0e:[\xd2\xd2\xa4G\x08w\ +\xd0\xec+_\xb2\xe5O\x09@7R\xffv4\x93<\ +5\x0d\x92(8K{7f\xe2\xa47\xae\xe5\xb6\x05\ +\x80\xbfX\x1a\xf9\x82\xb7r\x93V9 \xe3\xdb\xf1\x86\ +\xa9\xecz\x0cC\x5c 9\x1br8\x91\x96.\xb9\xe5\ +\x8bf2\xf7R\xc0\xdaPE \xe2\xd6B\x93\x15\x19\ +0\xebrOU\x9e]\x5c\xe2\xb0\xaa]\x9c\x22h\xa0\ +d\x83\x8d\xc88\xb0\x83\x80\xf6\xf6T\x00\x15PX\x06\ +H\xc1\xc4\xb9\x9b\xa2\xe8\x0b6\xb4\xb2\xe6\x16LT\x0a\ +\xc5\xa7\xd0\xafA\xa5\x01\xfc\xda\xda\x9f\x889\x858\xce\ +\xa5M\x18uh\xae+\xf9\x95\xe8O^\xbd\xb9 \xe3\ +~\xf6\x08\x1e\xfb\xf0p\xa9\x06)C^\x83)\xa85\ +\x0c\x83\x02(\x5c\xe0\x83\x1d\xe89\xc6\x83\x9a\x13\xa9\x9e\ +\xa9\x19\x1a\xb7\x1d\xbc\xa3z\xe5K\xbbs<\xf7?\xd0\ +:\xdc\xdfC\xd2t\xbd2#\xd1\xf4\xfdWW\xd3u\ +=g_\xd8k<\xefc\xdav\xbd_]\xdbw=\ +\xd4'\xd9\xf7}\xf7\x7fn\xf7\x1e\x07\x87\xe2/\x9e\x17\ +\x8b\xe4y4\x7f{\xe5y\xbes3\xe3\xf9\xfe\x97\xa6\ +\x86\xfa>\xa7\xaf\xeb\xfa\xde\xc7\xb7\xe7{^\xe7\xbf\xe2\ +\xfb\xdf\x07\xc7\xdf|_'\xcf\xda\xfc\xdfG\xd7\xd6}\ +_g\xdf\xd2\xfd\xdf\x87\xe7\xcf~_\xa7\xef\x9c~\xdf\ +\xc7\xf7\xe0\xf9\x9f\xe3\xffwo\xea\x00@4\xb4@@\ +\x00\x13\x00\xfe\x00\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\ +\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x01\x01\x04\x00\x01\ +\x00\x00\x00`\x00\x00\x00\x02\x01\x03\x00\x04\x00\x00\x00,\ +\x09\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\ +\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00\x11\x01\x04\x00\x01\ +\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x04\ +\x00\x00\x00\x16\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x17\ +\x01\x04\x00\x01\x00\x00\x009\x08\x00\x00\x1a\x01\x05\x00\x01\ +\x00\x00\x004\x09\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00<\ +\x09\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\ +\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\x00\x10\ +\x00\x00\x00D\x09\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00R\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00S\ +\x01\x03\x00\x04\x00\x00\x00T\x09\x00\x00s\x87\x07\x00H\ +\x0c\x00\x00\x5c\x09\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\ +\x00\x08\x00\x802\x02\x00\xe8\x03\x00\x00\x802\x02\x00\xe8\ +\x03\x00\x00paint.net 4.0\ +.9\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x0cHL\ +ino\x02\x10\x00\x00mntrRGB X\ +YZ \x07\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00a\ +cspMSFT\x00\x00\x00\x00IEC s\ +RGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-HP \x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11c\ +prt\x00\x00\x01P\x00\x00\x003desc\x00\ +\x00\x01\x84\x00\x00\x00lwtpt\x00\x00\x01\xf0\x00\ +\x00\x00\x14bkpt\x00\x00\x02\x04\x00\x00\x00\x14r\ +XYZ\x00\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\ +\x00\x02,\x00\x00\x00\x14bXYZ\x00\x00\x02@\x00\ +\x00\x00\x14dmnd\x00\x00\x02T\x00\x00\x00pd\ +mdd\x00\x00\x02\xc4\x00\x00\x00\x88vued\x00\ +\x00\x03L\x00\x00\x00\x86view\x00\x00\x03\xd4\x00\ +\x00\x00$lumi\x00\x00\x03\xf8\x00\x00\x00\x14m\ +eas\x00\x00\x04\x0c\x00\x00\x00$tech\x00\ +\x00\x040\x00\x00\x00\x0crTRC\x00\x00\x04<\x00\ +\x00\x08\x0cgTRC\x00\x00\x04<\x00\x00\x08\x0cb\ +TRC\x00\x00\x04<\x00\x00\x08\x0ctext\x00\ +\x00\x00\x00Copyright (c)\ + 1998 Hewlett-Pa\ +ckard Company\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00\x12sRGB \ +IEC61966-2.1\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x12sRGB IEC\ +61966-2.1\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ +\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccX\ +YZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\xa2\x00\ +\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\ +\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\ +\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfd\ +esc\x00\x00\x00\x00\x00\x00\x00\x16IEC h\ +ttp://www.iec.ch\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16IEC \ +http://www.iec.c\ +h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00.IEC 6\ +1966-2.1 Default\ + RGB colour spac\ +e - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00.IEC 61966-2.\ +1 Default RGB co\ +lour space - sRG\ +B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00,Reference Vie\ +wing Condition i\ +n IEC61966-2.1\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00,Refere\ +nce Viewing Cond\ +ition in IEC6196\ +6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\ +iew\x00\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\ +\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\ +\x00\x00\x01XYZ \x00\x00\x00\x00\x00L\x09V\x00\ +P\x00\x00\x00W\x1f\xe7meas\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x02sig \x00\ +\x00\x00\x00CRT curv\x00\x00\x00\x00\x00\ +\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\ +\x1e\x00#\x00(\x00-\x002\x007\x00;\x00@\x00\ +E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00\ +m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\ +\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\ +\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\ +\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\ +\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01\ +E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01\ +|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\ +\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\ +\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02\ +A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\ +\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\ +\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x03\ +8\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\ +\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\ +\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04\ +c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\ +\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05\ +I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\ +\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06\ +H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\ +\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07\ +a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\ +\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\ +\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09\ +:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\ +\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\ +\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0b\ +Q\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\ +\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\ +\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\ +\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\ +\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f\ +^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10\ +C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x11\ +1\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12\ +&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\ +#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14\ +'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x15\ +4\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16\ +I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17\ +e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\ +\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\ +\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\ +\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c\ +*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1d\ +p\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\ +\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \ +\x15 A l \x98 \xc4 \xf0!\x1c!H!\ +u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\ +\xdd#\x0a#8#f#\x94#\xc2#\xf0$\x1f$\ +M$|$\xab$\xda%\x09%8%h%\x97%\ +\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'\ +I'z'\xab'\xdc(\x0d(?(q(\xa2(\ +\xd4)\x06)8)k)\x9d)\xd0*\x02*5*\ +h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\ +\x05,9,n,\xa2,\xd7-\x0c-A-v-\ +\xab-\xe1.\x16.L.\x82.\xb7.\xee/$/\ +Z/\x91/\xc7/\xfe050l0\xa40\xdb1\ +\x121J1\x821\xba1\xf22*2c2\x9b2\ +\xd43\x0d3F3\x7f3\xb83\xf14+4e4\ +\x9e4\xd85\x135M5\x875\xc25\xfd676\ +r6\xae6\xe97$7`7\x9c7\xd78\x148\ +P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:\ +6:t:\xb2:\xef;-;k;\xaa;\xe8<\ +'\ + >`>\xa0>\xe0?!?a?\xa2?\xe2@\ +#@d@\xa6@\xe7A)AjA\xacA\xeeB\ +0BrB\xb5B\xf7C:C}C\xc0D\x03D\ +GD\x8aD\xceE\x12EUE\x9aE\xdeF\x22F\ +gF\xabF\xf0G5G{G\xc0H\x05HKH\ +\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\ +\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\ +\x02MJM\x93M\xdcN%NnN\xb7O\x00O\ +IO\x93O\xddP'PqP\xbbQ\x06QPQ\ +\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\ +\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\ +\x5cV\xa9V\xf7WDW\x92W\xe0X/X}X\ +\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[\ +E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']x]\ +\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`\ +W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\ +\xf0cCc\x97c\xebd@d\x94d\xe9e=e\ +\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h\ +?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\ +\xf7kOk\xa7k\xfflWl\xafm\x08m`m\ +\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\ +\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s\ +]s\xb8t\x14tpt\xccu(u\x85u\xe1v\ +>v\x9bv\xf8wVw\xb3x\x11xnx\xccy\ +*y\x89y\xe7zFz\xa5{\x04{c{\xc2|\ +!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\ +#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x82\ +0\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85\ +G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88\ +i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\ +\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\ +\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\ +\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95\ +_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\ +\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\ +\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\ +\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\ +\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\ +\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\ +\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\ +\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1\ +`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\ +\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\ +\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\ +\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0\ +p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4\ +Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8\ +=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc\ +5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd0\ +9\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4\ +I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8\ +d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\ +\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\ +\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\ +\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9\ +F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\ +\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\ +\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6\ +m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\ +\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xff\ +m\xff\xff\ +\x00\x00\x89\xf8\ +I\ +I*\x00\x08\x00\x00\x00\x18\x00\xfe\x00\x04\x00\x01\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ +\x00\x04\x00\x00\x00.\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ +\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00\x11\x01\x04\x00\x01\x00\x00\x00\xfcS\x00\x00\x12\x01\x03\ +\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ +\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x17\x01\x04\x00\x01\x00\x00\x00\xf9\x12\x00\x00\x1a\x01\x05\ +\x00\x01\x00\x00\x006\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ +\x00>\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ +\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ +\x00\x22\x00\x00\x00F\x01\x00\x002\x01\x02\x00\x14\x00\x00\ +\x00h\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ +\x00\xf68\x00\x00|\x01\x00\x00I\x86\x01\x00B\x0d\x00\ +\x00r:\x00\x00i\x87\x04\x00\x01\x00\x00\x00\xf8f\x00\ +\x00s\x87\x07\x00H\x0c\x00\x00\xb4G\x00\x00\x5c\x93\x07\ +\x00\xd0\x22\x00\x00$g\x00\x00\x00\x00\x00\x00\x08\x00\x08\ +\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\x00\x00\xf9\x15\ +\x00\x10'\x00\x00Adobe Photo\ +shop CC 2017 (Wi\ +ndows)\x002017:04:0\ +4 11:01:55\x00\ +\x0a\x0a \ + \x0a \x0a \ + paint.net \ +4.0.9\x0a \ + 2017-03-01T11:2\ +0:20-08:00\x0a \ + 2017-04-04T\ +11:01:55-07:00\x0a\ + 2017-\ +04-04T11:01:55-0\ +7:00\x0a \ + imag\ +e/tiff\x0a 3\x0a \ + sRGB IEC\ +61966-2.1\ +\x0a \x0a \ + \x0a \ + adobe:docid\ +:photoshop:6e5b1\ +c59-1960-11e7-ba\ +e7-e6e7a5cd2814<\ +/rdf:li>\x0a \ + \x0a\ + \x0a \ + xmp.iid:db7b2\ +8e8-30e9-e04f-9f\ +78-916e5c5110e6<\ +/xmpMM:InstanceI\ +D>\x0a ad\ +obe:docid:photos\ +hop:bf3203a1-196\ +0-11e7-bae7-e6e7\ +a5cd2814\x0a \ + x\ +mp.did:8f625742-\ +0048-e64f-ab3c-d\ +4b1a5a27a24\x0a \ +\x0a\ + \x0a \ + \x0a \ + created\x0a \ + \ +xmp.iid:8f6257\ +42-0048-e64f-ab3\ +c-d4b1a5a27a24\x0a \ + \ +2017-03-01T11:20\ +:20-08:00\x0a \ + Ad\ +obe Photoshop CC\ + 2017 (Windows)<\ +/stEvt:softwareA\ +gent>\x0a \ + \x0a \ + \x0a\ + \ + \ +saved\x0a \ + xmp.iid\ +:db7b28e8-30e9-e\ +04f-9f78-916e5c5\ +110e6\x0a \ + 2017-04-0\ +4T11:01:55-07:00\ +\x0a \ + \ +Adobe Photo\ +shop CC 2017 (Wi\ +ndows)\x0a \ + <\ +stEvt:changed>/<\ +/stEvt:changed>\x0a\ + <\ +/rdf:li>\x0a \ + \x0a\ + \x0a \ +\x0a \ +\x0a\x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \x0a8BIM\x04%\x00\x00\x00\x00\x00\x10\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x008BI\ +M\x04:\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x0bprintOutp\ +ut\x00\x00\x00\x05\x00\x00\x00\x00PstSbo\ +ol\x01\x00\x00\x00\x00Inteenum\x00\ +\x00\x00\x00Inte\x00\x00\x00\x00Clrm\x00\ +\x00\x00\x0fprintSixteenB\ +itbool\x00\x00\x00\x00\x0bprint\ +erNameTEXT\x00\x00\x00\x01\x00\x00\ +\x00\x00\x00\x0fprintProofSe\ +tupObjc\x00\x00\x00\x0c\x00P\x00r\x00\ +o\x00o\x00f\x00 \x00S\x00e\x00t\x00u\x00\ +p\x00\x00\x00\x00\x00\x0aproofSetu\ +p\x00\x00\x00\x01\x00\x00\x00\x00Bltnenu\ +m\x00\x00\x00\x0cbuiltinProo\ +f\x00\x00\x00\x09proofCMYK\x008\ +BIM\x04;\x00\x00\x00\x00\x02-\x00\x00\x00\x10\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x12printOu\ +tputOptions\x00\x00\x00\x17\x00\ +\x00\x00\x00Cptnbool\x00\x00\x00\x00\x00\ +Clbrbool\x00\x00\x00\x00\x00Rgs\ +Mbool\x00\x00\x00\x00\x00CrnCbo\ +ol\x00\x00\x00\x00\x00CntCbool\x00\ +\x00\x00\x00\x00Lblsbool\x00\x00\x00\x00\ +\x00Ngtvbool\x00\x00\x00\x00\x00Em\ +lDbool\x00\x00\x00\x00\x00Intrb\ +ool\x00\x00\x00\x00\x00BckgObjc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00RGBC\x00\x00\ +\x00\x03\x00\x00\x00\x00Rd doub@o\ +\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Grn do\ +ub@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Bl\ + doub@o\xe0\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00BrdTUntF#Rlt\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Bld Un\ +tF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00RsltUntF#Pxl@b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0avector\ +Databool\x01\x00\x00\x00\x00PgP\ +senum\x00\x00\x00\x00PgPs\x00\x00\x00\ +\x00PgPC\x00\x00\x00\x00LeftUnt\ +F#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00Top UntF#Rlt\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00Scl Unt\ +F#Prc@Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x10cropWhenPrintin\ +gbool\x00\x00\x00\x00\x0ecropRe\ +ctBottomlong\x00\x00\x00\x00\ +\x00\x00\x00\x0ccropRectLeft\ +long\x00\x00\x00\x00\x00\x00\x00\x0dcrop\ +RectRightlong\x00\x00\x00\ +\x00\x00\x00\x00\x0bcropRectTop\ +long\x00\x00\x00\x00\x008BIM\x03\xed\x00\ +\x00\x00\x00\x00\x10\x00\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\ +\x00\x00\x01\x00\x018BIM\x04&\x00\x00\x00\x00\x00\ +\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x80\x00\x008\ +BIM\x03\xee\x00\x00\x00\x00\x00\x0d\x0cTran\ +sparency\x008BIM\x04\x15\x00\ +\x00\x00\x00\x00\x1e\x00\x00\x00\x0d\x00T\x00r\x00a\x00\ +n\x00s\x00p\x00a\x00r\x00e\x00n\x00c\x00\ +y\x00\x008BIM\x045\x00\x00\x00\x00\x00\x11\x00\ +\x00\x00\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00d\x01\ +\x008BIM\x04\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\ +\x008BIM\x04\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\ +\x1e8BIM\x04\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\ +\x1e8BIM\x03\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\ +\x00\x00\x00\x00\x00\x01\x008BIM'\x10\x00\x00\x00\ +\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\x00\x00\x018BI\ +M\x03\xf5\x00\x00\x00\x00\x00H\x00/ff\x00\x01\x00\ +lff\x00\x06\x00\x00\x00\x00\x00\x01\x00/ff\x00\ +\x01\x00\xa1\x99\x9a\x00\x06\x00\x00\x00\x00\x00\x01\x002\x00\ +\x00\x00\x01\x00Z\x00\x00\x00\x06\x00\x00\x00\x00\x00\x01\x00\ +5\x00\x00\x00\x01\x00-\x00\x00\x00\x06\x00\x00\x00\x00\x00\ +\x018BIM\x03\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\ +\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x008BI\ +M\x04\x00\x00\x00\x00\x00\x00\x02\x00\x018BIM\x04\ +\x02\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ +0\x00\x00\x00\x00\x00\x02\x01\x018BIM\x04-\x00\ +\x00\x00\x00\x00\x06\x00\x01\x00\x00\x00\x048BIM\x04\ +\x08\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x02@\x00\ +\x00\x02@\x00\x00\x00\x008BIM\x04\x1e\x00\x00\x00\ +\x00\x00\x04\x00\x00\x00\x008BIM\x04\x1a\x00\x00\x00\ +\x00\x035\x00\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\ +\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00null\x00\x00\x00\x02\x00\x00\x00\x06bo\ +undsObjc\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00Rct1\x00\x00\x00\x04\x00\x00\x00\x00To\ +p long\x00\x00\x00\x00\x00\x00\x00\x00Le\ +ftlong\x00\x00\x00\x00\x00\x00\x00\x00Bt\ +omlong\x00\x00\x00`\x00\x00\x00\x00Rg\ +htlong\x00\x00\x00`\x00\x00\x00\x06sl\ +icesVlLs\x00\x00\x00\x01Objc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x05slice\x00\ +\x00\x00\x12\x00\x00\x00\x07sliceIDlo\ +ng\x00\x00\x00\x00\x00\x00\x00\x07groupI\ +Dlong\x00\x00\x00\x00\x00\x00\x00\x06ori\ +ginenum\x00\x00\x00\x0cESlic\ +eOrigin\x00\x00\x00\x0dautoG\ +enerated\x00\x00\x00\x00Type\ +enum\x00\x00\x00\x0aESliceTy\ +pe\x00\x00\x00\x00Img \x00\x00\x00\x06bo\ +undsObjc\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00Rct1\x00\x00\x00\x04\x00\x00\x00\x00To\ +p long\x00\x00\x00\x00\x00\x00\x00\x00Le\ +ftlong\x00\x00\x00\x00\x00\x00\x00\x00Bt\ +omlong\x00\x00\x00`\x00\x00\x00\x00Rg\ +htlong\x00\x00\x00`\x00\x00\x00\x03ur\ +lTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00n\ +ullTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00MsgeTEXT\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x06altTagTEXT\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x0ecellTextI\ +sHTMLbool\x01\x00\x00\x00\x08ce\ +llTextTEXT\x00\x00\x00\x01\x00\x00\ +\x00\x00\x00\x09horzAlignenu\ +m\x00\x00\x00\x0fESliceHorzA\ +lign\x00\x00\x00\x07default\x00\ +\x00\x00\x09vertAlignenum\ +\x00\x00\x00\x0fESliceVertAl\ +ign\x00\x00\x00\x07default\x00\x00\ +\x00\x0bbgColorTypeenu\ +m\x00\x00\x00\x11ESliceBGCol\ +orType\x00\x00\x00\x00None\x00\x00\ +\x00\x09topOutsetlong\x00\ +\x00\x00\x00\x00\x00\x00\x0aleftOutse\ +tlong\x00\x00\x00\x00\x00\x00\x00\x0cbot\ +tomOutsetlong\x00\x00\x00\ +\x00\x00\x00\x00\x0brightOutset\ +long\x00\x00\x00\x00\x008BIM\x04(\x00\ +\x00\x00\x00\x00\x0c\x00\x00\x00\x02?\xf0\x00\x00\x00\x00\x00\ +\x008BIM\x04\x14\x00\x00\x00\x00\x00\x04\x00\x00\x00\ +\x048BIM\x04\x0c\x00\x00\x00\x00\x03\xeb\x00\x00\x00\ +\x01\x00\x00\x000\x00\x00\x000\x00\x00\x00\x90\x00\x00\x1b\ +\x00\x00\x00\x03\xcf\x00\x18\x00\x01\xff\xd8\xff\xed\x00\x0cA\ +dobe_CM\x00\x01\xff\xee\x00\x0eAdo\ +be\x00d\x80\x00\x00\x00\x01\xff\xdb\x00\x84\x00\x0c\x08\ +\x08\x08\x09\x08\x0c\x09\x09\x0c\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\ +\x0c\x0f\x15\x18\x13\x13\x15\x13\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\ +\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\ +\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\x10\x14\x0e\x0e\x0e\x14\x14\x0e\ +\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\ +\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\ +\xc0\x00\x11\x08\x000\x000\x03\x01\x22\x00\x02\x11\x01\x03\ +\x11\x01\xff\xdd\x00\x04\x00\x03\xff\xc4\x01?\x00\x00\x01\x05\ +\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\ +\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x01\x00\x01\x05\x01\x01\x01\ +\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\ +\x06\x07\x08\x09\x0a\x0b\x10\x00\x01\x04\x01\x03\x02\x04\x02\x05\ +\x07\x06\x08\x05\x03\x0c3\x01\x00\x02\x11\x03\x04!\x121\ +\x05AQa\x13\x22q\x812\x06\x14\x91\xa1\xb1B#\ +$\x15R\xc1b34r\x82\xd1C\x07%\x92S\xf0\ +\xe1\xf1cs5\x16\xa2\xb2\x83&D\x93TdE\xc2\ +\xa3t6\x17\xd2U\xe2e\xf2\xb3\x84\xc3\xd3u\xe3\xf3\ +F'\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\ +\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf67GWg\ +w\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\x02\x01\x02\x04\ +\x04\x03\x04\x05\x06\x07\x07\x06\x055\x01\x00\x02\x11\x03!\ +1\x12\x04AQaq\x22\x13\x052\x81\x91\x14\xa1\xb1\ +B#\xc1R\xd1\xf03$b\xe1r\x82\x92CS\x15\ +cs4\xf1%\x06\x16\xa2\xb2\x83\x07&5\xc2\xd2D\ +\x93T\xa3\x17dEU6te\xe2\xf2\xb3\x84\xc3\xd3\ +u\xe3\xf3F\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\ +\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6'7\ +GWgw\x87\x97\xa7\xb7\xc7\xff\xda\x00\x0c\x03\x01\x00\ +\x02\x11\x03\x11\x00?\x00\xf4<\xdc\xcc\x96d\x9a\xa9;\ +@\x80\x00\x00\x92O\xc6P\xfd~\xab\xe0\xff\x00\xfbl\ +\x7f\xe4R\xc9\xff\x00\x95\x1b\xfdz\xff\x00\xef\xabU\xce\ +\x0dis\xb4\x00I>A%9^\xbfU\xf0\x7f\xfd\ +\xb6?\xf2)z\xfdW\xc1\xff\x00\xf6\xd8\xff\x00\xc8\xa2\ +UU\xf9\xe0\xdde\x8e\xaa\x92}\x95\xb7\xc0x\xa7{\ +o\xe9\xeem\x82\xc3n9 =\xae\xd4\x89\xee\x12R\ +/_\xaa\xf8?\xfc\xc1\xff\x00\x91D\xc0\xcc\xc8\xb3#\ +\xd2\xb4\xee\x04\x1e@\x04\x11\xfdU\xa4\xb20\x7f\xe5\x03\ +\xff\x00\x5c\xfc\xa9)\xff\xd0\xef\xf2\x7f\xe5F\xff\x00^\ +\xbf\xfb\xea\xb9\x9f\x7f\xa7W\xa6\x1a\x5c\xfb\x81c@\xf3\ +\x11\xfcU<\x9f\xf9Q\xbf\xd7\xaf\xfe\xfa\xacu\x0f\xe9\ +\x18\x9f\xf1\x9f\xc5\x89)\x1e>NU\x14\xb6\xaf\xb2\xbd\ +\xdbg\xdd\xa8\xe4\xcf\xee\xa8\xe5]\x95\x93I\xa8\xe2\xbd\ +\x92A\x9dO\x1f\xd9\x0a\xdfP\xb6\xea\xb1\xf7\xd3\xa1\x90\ +\x1c\xee`x\xa9aYu\x98\xed}\xdfH\xcc\x1e$\ +~k\x92R\xd8y\x02\xfa\xa7ik\x98v\xb8\x1f\x10\ +\xa8`\xff\x00\xca\x07\xfe\xb9\xf9U\x9e\x97\xf4.\xff\x00\ +\x8d*\xb6\x0f\xfc\xa0\x7f\xeb\x9f\x95%?\xff\xd1\xef\xf2\ +\x7f\xe5F\xff\x00^\xbf\xfb\xea?R;,\xc6\xb4\x83\ +\xb1\x8f\x97\x11\xf1i\xff\x00\xbe\xa8f\xe1d\xbf$\xdb\ +P\x90b\x0c\xc1\x04!\xfd\x9b\xaa~\xf3\xff\x00\xed\xcf\ +\xfc\xc9%'\xb7\xa8\xe1[[\xabxyk\x84\x1d\x08\ +N\xce\xa7\x86\xc65\x8d\x0f\x0dh\x00\x0d\xa7\x80\xab\xfd\ +\x9b\xaa~\xf3\xff\x00\xed\xcf\xf6\xa5\xf6n\xa9\xfb\xcf\xff\ +\x00\xb7?\xda\x92\x9b\x1d(\x1fJ\xd7A\x0du\x84\xb4\ +\x9e\xe1V\xc1\xff\x00\x94\x0f\xc6\xcf\xca\x9f\xec\xddS\xf7\ +\x9f\xff\x00n\x7f\xe6H\xb88Y\x15\xdf\xea\xda\x03@\ +\x04s$\x92\x92\x9f\xff\xd9\x008BIM\x04!\x00\ +\x00\x00\x00\x00]\x00\x00\x00\x01\x01\x00\x00\x00\x0f\x00A\ +\x00d\x00o\x00b\x00e\x00 \x00P\x00h\x00o\ +\x00t\x00o\x00s\x00h\x00o\x00p\x00\x00\x00\x17\ +\x00A\x00d\x00o\x00b\x00e\x00 \x00P\x00h\ +\x00o\x00t\x00o\x00s\x00h\x00o\x00p\x00 \ +\x00C\x00C\x00 \x002\x000\x001\x007\x00\x00\ +\x00\x01\x00\x00\x00\x0cHLino\x02\x10\x00\x00m\ +ntrRGB XYZ \x07\xce\x00\x02\x00\ +\x09\x00\x06\x001\x00\x00acspMSFT\x00\ +\x00\x00\x00IEC sRGB\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\ +\x00\xd3-HP \x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x11cprt\x00\x00\x01P\x00\ +\x00\x003desc\x00\x00\x01\x84\x00\x00\x00lw\ +tpt\x00\x00\x01\xf0\x00\x00\x00\x14bkpt\x00\ +\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\x18\x00\ +\x00\x00\x14gXYZ\x00\x00\x02,\x00\x00\x00\x14b\ +XYZ\x00\x00\x02@\x00\x00\x00\x14dmnd\x00\ +\x00\x02T\x00\x00\x00pdmdd\x00\x00\x02\xc4\x00\ +\x00\x00\x88vued\x00\x00\x03L\x00\x00\x00\x86v\ +iew\x00\x00\x03\xd4\x00\x00\x00$lumi\x00\ +\x00\x03\xf8\x00\x00\x00\x14meas\x00\x00\x04\x0c\x00\ +\x00\x00$tech\x00\x00\x040\x00\x00\x00\x0cr\ +TRC\x00\x00\x04<\x00\x00\x08\x0cgTRC\x00\ +\x00\x04<\x00\x00\x08\x0cbTRC\x00\x00\x04<\x00\ +\x00\x08\x0ctext\x00\x00\x00\x00Copyr\ +ight (c) 1998 He\ +wlett-Packard Co\ +mpany\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00\x12sRGB IEC61966\ +-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\ +sRGB IEC61966-2.\ +1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\ +\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ +\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\x90X\ +YZ \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\x85\x00\ +\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\x00$\xa0\x00\ +\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\x00\x00\ +\x00\x00\x16IEC http://ww\ +w.iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x16IEC http://w\ +ww.iec.ch\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00.IEC 61966-2.1\ + Default RGB col\ +our space - sRGB\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.IEC \ +61966-2.1 Defaul\ +t RGB colour spa\ +ce - sRGB\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00,Refer\ +ence Viewing Con\ +dition in IEC619\ +66-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00,Reference View\ +ing Condition in\ + IEC61966-2.1\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00view\x00\x00\x00\x00\x00\ +\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\xcc\x00\ +\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ \x00\ +\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\xe7m\ +eas\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8f\x00\ +\x00\x00\x02sig \x00\x00\x00\x00CRT c\ +urv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\ +\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00-\x00\ +2\x007\x00;\x00@\x00E\x00J\x00O\x00T\x00\ +Y\x00^\x00c\x00h\x00m\x00r\x00w\x00|\x00\ +\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa4\x00\ +\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\ +\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\ +\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01%\x01\ ++\x012\x018\x01>\x01E\x01L\x01R\x01Y\x01\ +`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\ +\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\ +\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\ +\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02]\x02\ +g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\ +\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\ +\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03\ +f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\ +\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04\ +-\x04;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\ +\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\ +\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\ +\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\ +\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\ +\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\ +\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\ +\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08\ +F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\ +\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\ +\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a\ +=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\ +\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\ +\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0c\ +u\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d\ +@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\ +\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\ +\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\ +\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\ +\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\ +\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\ +\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\x83\x13\ +\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\ +\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\ +\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\ +\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\ +\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19\ + \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1a\ +Q\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\ +\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\ +\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\ +\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1f\ +i\x1f\x94\x1f\xbf\x1f\xea \x15 A l \x98 \ +\xc4 \xf0!\x1c!H!u!\xa1!\xce!\xfb\x22\ +'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#8#f#\ +\x94#\xc2#\xf0$\x1f$M$|$\xab$\xda%\ +\x09%8%h%\x97%\xc7%\xf7&'&W&\ +\x87&\xb7&\xe8'\x18'I'z'\xab'\xdc(\ +\x0d(?(q(\xa2(\xd4)\x06)8)k)\ +\x9d)\xd0*\x02*5*h*\x9b*\xcf+\x02+\ +6+i+\x9d+\xd1,\x05,9,n,\xa2,\ +\xd7-\x0c-A-v-\xab-\xe1.\x16.L.\ +\x82.\xb7.\xee/$/Z/\x91/\xc7/\xfe0\ +50l0\xa40\xdb1\x121J1\x821\xba1\ +\xf22*2c2\x9b2\xd43\x0d3F3\x7f3\ +\xb83\xf14+4e4\x9e4\xd85\x135M5\ +\x875\xc25\xfd676r6\xae6\xe97$7\ +`7\x9c7\xd78\x148P8\x8c8\xc89\x059\ +B9\x7f9\xbc9\xf9:6:t:\xb2:\xef;\ +-;k;\xaa;\xe8<' >`>\xa0>\xe0?\ +!?a?\xa2?\xe2@#@d@\xa6@\xe7A\ +)AjA\xacA\xeeB0BrB\xb5B\xf7C\ +:C}C\xc0D\x03DGD\x8aD\xceE\x12E\ +UE\x9aE\xdeF\x22FgF\xabF\xf0G5G\ +{G\xc0H\x05HKH\x91H\xd7I\x1dIcI\ +\xa9I\xf0J7J}J\xc4K\x0cKSK\x9aK\ +\xe2L*LrL\xbaM\x02MJM\x93M\xdcN\ +%NnN\xb7O\x00OIO\x93O\xddP'P\ +qP\xbbQ\x06QPQ\x9bQ\xe6R1R|R\ +\xc7S\x13S_S\xaaS\xf6TBT\x8fT\xdbU\ +(UuU\xc2V\x0fV\x5cV\xa9V\xf7WDW\ +\x92W\xe0X/X}X\xcbY\x1aYiY\xb8Z\ +\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\x5c5\x5c\ +\x86\x5c\xd6]']x]\xc9^\x1a^l^\xbd_\ +\x0f_a_\xb3`\x05`W`\xaa`\xfcaOa\ +\xa2a\xf5bIb\x9cb\xf0cCc\x97c\xebd\ +@d\x94d\xe9e=e\x92e\xe7f=f\x92f\ +\xe8g=g\x93g\xe9h?h\x96h\xeciCi\ +\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\xffl\ +Wl\xafm\x08m`m\xb9n\x12nkn\xc4o\ +\x1eoxo\xd1p+p\x86p\xe0q:q\x95q\ +\xf0rKr\xa6s\x01s]s\xb8t\x14tpt\ +\xccu(u\x85u\xe1v>v\x9bv\xf8wVw\ +\xb3x\x11xnx\xccy*y\x89y\xe7zFz\ +\xa5{\x04{c{\xc2|!|\x81|\xe1}A}\ +\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\ +\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\ +\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\ +\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\ +\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d\ +1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90\ +n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\ +\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\ +\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\xfc\x9a\ +h\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\ +\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1\ +G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\ +\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8\ +R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\ +\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\ +\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb3\ +8\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\ +\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\ +\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\ +\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2\ +_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6\ +F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca\ +8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce\ +6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2\ +?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6\ +U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xda\ +v\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\ +\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\ +\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\ +\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xeb\ +p\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\ +\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf4\ +4\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\ +\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd\ +)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\x00 P8\ +$\x16\x0d\x07\x84BaP\xb8d6\x1d\x0f\x88Db\ +Q8\xa4V-\x17\x8cFcQ\xb8\xe4v=\x1f\x90\ +HdR9$\x96M'\x94JeR\xb9d\xb6]\ +/\x98A\x00\x930(*l\x0c\x9c\x03\x02\x13`P\ +0\x07?\x02?\xe8O\xe8X\x06 \x01\xa4\x00hO\ +\xfa$\x1a\x93H\x82R\xdf\xf0J}J\x06\xff\xa4\x80\ +\xa9t\xd0\x05\x1a\x07U\xa5\xd5\xeb\xf4\xfa\x8d\x86\x05S\ +\x81S\xe9VhK\xfc\x05o\x01\xd5\xaa\xf6\xca\x8d~\ +\x0fh\xb4\xd2\x00P\x8a\x95\x92\xefK\xb0P\xacW\x9a\ +M\xca\x9dI\xbe]05\xca\xf0\x02\x98\xfe\xc8>\xf2\ +O\xa7\xa6U\xe2\xf3\xcc<2O\xb7\xce\x1aSO\x07\ +\xe8Bcm!\x10\x87\xa7)\x89\xb5C\x00v\xb4#\ +?\x01\x81*\x98\x88]\xf7i\x87\xa4g\xb18+\x1e\ +\xe7\x01\xb7\x8e\xed\xaa\x17:\x15\xfa\x0d\xba\xde\xda\xf7\x98\ +Ln;\x7f\xbe\xe2\xf0!\x99\xec\x0d\xe2\xbbj\xe8T\ +\xab\x18^\x7f6\x9f\x90\xc8uz\xbb>\xcf\x81\xfc\xf8\ +\xf4=\x9c\xbe\xb6\xf3#\xdc\xbaa|VN\x0f\xa3c\ +6\xfa\x94\x04\xbfAb\xcf\xf4\xe0)\xc0\x03:r\x08\ +-\xebzc\x03\xc1\x10L\x15\x05>\xe6\x94\x1cc\x13\ +p\x89\x04h\xc2\x86+\xee\x90\x00\xd0\xc8\x10(C\x83\ + \xdb\x0f\x91\x00LD\x05\xc1q,M\x13\xc5\x09B\ +\xa4fE\x85\xf9\x17\x17\x8d\xa6\xfcdk\xb9\x08\xb0;\ +\x1b\x84\x84LtV5A0_\x14\xc8\x12\x0c\x85!\ +\xa2\xe7\xd4\x8c|\x93RI\x00SI\x84|\x8c}\x1f\ +(\xc4\x0a\x01\x07\xb2\xa8\x9aCK\x058\x0f-\x812\ +$\xbd/\xcc\x13\x0a\x04gL\x86\x08\xed3\x8a\x87\x84\ +\xd4v#\x09\x98\x08\x02\x8a\xf3\x88\xda7\xce\x84\x5c\xa7\ +1O\x13\xcc\xf5\x03\x9d\x13\xe9\xc44P\x02\x11\xc9A\ +\x9b\xa8\xc42\x03\x01\x03-\x14?\x0c\x14h\xf0\xe3O\ +t\x8d%I\xa3\xe7\x95,w\x0c\x94\xc8|oS\x86\ +\xad\x0d\x0d\x0d\x95\x09\x0e\xfe\x8b#}!JU\x15M\ +T\x873\x07\x99\xe1E\x0c\xa1\xf1\xb9Y\x9ah\xc4\xb6\ +\x03\x810\xf8\xdaDN\x22\xb8\xdbS\xc4\xae\x13\x9bU\ +\xc8q\xab\xae\xe1\xa1V\x15UV\x9e\x14\xc8\xc8\x1e\x9b\ +\xb6\x89\xa9O\xd1\x03u\xacD\xd7\xb5\xfb\xa4\x89\xaaF\ +\xdd\xbch\x9e\xb7\x09\xe6\xea\xcav\x13\xa8\xe0\x1f\xb7I\ +\xfb;\xb8\x8e\xdb\xb2\xf29Wr\xd4\x82<\xc8E\x80\ +\xe3\xbb\xab+\xa3d9\xd7\xdd\xe3}-\xd0-\xec\xe0\ +X\xc8\xa3\xc6\xe4\xbc\xce\xc5\xde\xbf\xb9`\x04\xdc\x02\x84\ +X\x88T\x05\xe2\x80r8\xca\x9e\x87\x8d\x9c\x1e\xd6f\ +\xe5j\x8b\xd6\xe0MB6\x10\xe2\xc6L7^\xe8\x89\ +\xf9\x95\x9fc\xa6\x5c(\x9a\xf9\x89\x9be!\xf72\x87\ +\x02\x80xN\x15\x80:\xb6\x15 \xed.\x92\x9d\xea\x81\ +\xe8O\x06R\xe9\xad\x97r\xb5\x9b\xae\x17\xa6\x8c\xe0`\ +\xeec\xcdr\xbb\xb9\xa5\x93|\xdd\xb4\x83\xcc\x08\xeb\x80\ +\xa8\xf9\xaf\x93an\xc4\x1cb\xec\xb0\xc7\xb3\x87\x96\x89\ +\xbbi\xe4\x12\xe6GQ\xbf\xa3z8\xfb\x8c\xdb\xa8~\ +i\xef\x06E\x89\xbd\xef\x88>\xb8\x08\x82\xb1\xd1\x12U\ +\x86\x5c(~\x8eY\x9b\xa8\xcc\x1f\xdb\xc6\xd9\xa5[K\ +\x95\xd5y9h\xe8{\xefX\x07\xc6\xa74d\xef\xa8\ +\xbcD\x04\x81a\x0fD\x14\x82\x9d(2\x0a\xf5\x00\xd3\ +Z\x07\x02G\x7f\x5cu\x9d\x9d\x89\xccu\xf6\x8758\ +o\x1a\xd0\xbf:\x8a\x82\x1d\xe8)\x17\x91epa\xe1\ +\x87\x9c\xaa\x1d\x8ccT\xce9Zr\x15\xc6\xdf\x93\x0b\ +\x19E\xb6\x89I\xe7\xc8\xcf\xeb\x88\x1b\xc1\xa7\xbdwh\ +Gz\x08\x02\x82\x07\xc4(|B\x00\x9e\xd2\x06\xc2%\ +\x0e\x04#\x07\xb7\xdcy\x98\xdf\x89n`~\x85\x8b\xe2\ +a\x16_q\xecz{\xbe\xf7|\xf0\x1e\x13\xc4x\xc4\ +5f=p\xce\x10\x06\xd4\x09\x1a+P\x049%H\ +\xdc\x88\xd9\xf7\x80\xc1\x01\x07\x0d!\x8e\xf7I\xe0\x0c\x0b\ +\x90l9\xc1\xb0\xb8\x1d \xc90MC\xc0v\x09\xc8\ +L \xc5l)\x13\x0e\xe9\xce\xbd\xf0(\x22\xa1\x80\xad\ +p\xa0\xc8\x1f6V2\xe2\x81\xfc\x09\x1bP-\xb6\xbc\ +\xe5D\xf4\x1e\x92\xfc\x22\x8e]E9\x976\xdf\x02<\ +I\x0b\x01\xce&\x09\x03\xf4\x04\x80\xbaD=c\x94o\ +\x08X\xac\x19\x86TY\x17\xad\xf1\xd5\x81!\x19\x17\xc5\ +t3p\xe4mf9\x86:\xc7\xc8\xb3!rKf\ +\x01\x90\xc6\xe8\xdd\x9e\xd3\xdcR)L5GQ\x0a\xa3\ +C\x00xRk\xa8~\x08\xe8\xfc\x1cEL\x81\x12\x8a\ +\xaa\x17@\x00c!\xc1\xe9\x1c\x5c#\xd4y6p\xc6\ +\x0f#;\xcddP\xfd\x93\xc6\xd2\x16\xca\xc7\xe0\xfbs\ +\x11\xc5=\x00Y<\x01\x9c\x10\xab\x07\xd2\x8c'=\xd1\ +Y)\xc4\xb0\x88\x95A\xadI\xb7\xf7\x02\x8e\xe1\x9c5\ +\x8c\x86f3<\xc8z\x02V\xb0n[\x09\xc9\xb9\x99\ +70\xe6\x86\xa3\x9cO!\xf6b\x09\xc0\x9f1\xc3\x19\ + \x1dS,r\x8d\x89\x9c3\x9dp\xef\x1dO \xd0\ +\x80\xf8\x9f\x14\x01T\xd9\x06\xb0\xb8\x90\x09y\xbc\x1f\x04\ +\xec\xe1\x10\xa9\xeaWC\x01\x14+d81\x912\xcd\ +W1\xb6\xd4\xdb#K\x91D\x11\xb1\xe9\x91\x18\xde\xe2\ +\xe4\xe2`\x81\xf109\x89\x020\xa5\x87\x90\xee\x15T\ +\x0cJ\x8b\x8a\x0c)\x8f\xa0\xe0\x1b\x0c\x18\xa4\x82z\x1c\ +\x0c\x02e\x11\x0c\x13\x1c'\x867>\x89\x16\xe1K\x0e\ +\xb4l)?A\x80,\x13\x0c\x85E\xe2\xbat\xce\xb2\ +4\xf2!\xc4:\x87\x93\xc6\x1f2H\x1eG$\xc0\xfb\ +cs\x02a$ IM\xc1jL\x14\xc3=\x9c\x11\ +\x02\xa4)j\x00\x8e\x135\x0c?\x8fz\x8c=IC\ +\xdf\x02a\xca\xa6\x09\x00\x95S\xc2\xe1\x14\x7fC\xcd\x0e\ +\x05\x00H;\xaa\xc0\xeaH\x93\x96\x18\xd2W\x11-\x22\ +,\x91\x96\xeeJ \x11\xc7\xab\x0e)\xa2D\x125\xac\ +Z\x83\xba\xdc\x12\x88\x85F\x1e\xe3\xd6\x8d\x87P\xa2{\ +\x86@\xbbD\xd4D&\x05\xe0\xfd_\xc4\xf5=!\xe2\ +\xae\xc2\x09W\x04\x1b\x12$.\x9c\xd3\xa2DIb\x15\ +\x01^\xc5*\x81\x95\x92J\xcfR!=\xdb\xbbyH\ +\x00\xd2\xce\x04\x011g\xc5\xf9\x10I\xe3\xe2\x5c\x84\xa4\ +X3-\x0aC\x096\xac-\x88\x1b\x5c(\x97a\x0a\ +\xa6!V\xda\x02\xa1\xc7m\xc6\xe2@\xab\x93\x9e\xaf\x11\ +\xb7\x90\xc6\xeb\x15,W3\xcd\xcaYg-/\xa2-\ +iE\x22B\xe6\x0b@ys\xc2Y\x10\xb9\x82@:\ +\x0aK\xac#S\xd0w\xbbBR\xda\x05YXC\xe8\ +\x18\xaa\x12\x93\x986\xa4\x08]\x17\xc4`\xafx`\xc0\ +\x1eCa\xe3J`T\x92\x8dw\x16!\x11:cL\ +\xe2:%\x83\x22\xf2\xfe\x0e\xc5\x0e\x01\xc8dg\x0bx\ +\x0c\x18\xae\xa1\xfa\x9e\x98\xa0\x0b\x01\xa2\xbf\x06\x0d\xc8\x9e\ +\x05\x88`\xe9\xc2C\x8c%\xe1P=n\x9a\xeb\x82\x15\ +\x92\xc6E.\x19\x1a\xda.\x09\x15d2\xe4D\x85l\ +L\x1b,q\x09z\xb0N|\xa0\xb3N\x10\xc2\x9e\x1a\ +\x22\x17\xa07\x0a\x8cl$\xd5UL\x0eB8-c\ +\xd0\xe2D \xf03\x99\xc3`g\x22kwc'U\ +\xees\x0e5\xc7\xcbv\xdfK\xe0\x89\x93\x87\x18\xb5\x05\ +\x07\xbc\xac&B\x8eY\x0c\xc4@$e\xd04\xecG\ +`\xe7U@\xbf2\x03\xa9\xc2'F)\x10\x12\x99\xac\ +<\x0a\x0c\xdc\x22r3]\xb1v\xf6\x93\x99l\x96\xb7\ +\xb2m\xc2y\xf6V\xfa\x91($\xf6 \xac\x17D\xa2\ +KB\x0b`u\xa1\xc2I\x0c\xaeC\xd5*\x83\xd0\x18\ +\xdf%p\xbb\xd2Uh\x87\xcaqY*e^qp\ +\x10\x032\x02\xf0w\x8aHDe\xac2\xd8\x8b>\xbc\ +IYr\x88\xfb\x1fR\xfe\xfc\xa0\xbat4\x11\xea?\ +!c\x8bZ\x0d\xb0\xa5\xad\xc13\xdd\x19:\xec}\x9b\ +\x03dB\xe8\xf0\xb0e\xc1\xd0(\xa2jD\xf0o[\ +\xc5\xb8\xcf\x1c\xcb_\x08w|\xae\x22\xbe\xd4\x04\x1e\xcc\ +eD\x13\xa4\x85\xd8\xea\x95\xc42\x84\x8d\x80\xa9\xb7\xc1\ +K\xdd~#\x18|_\xf2\x19M#\xc3dD\xb6*\ +\x18\xe1\xcb}\x9d\xa2.L\xda\x0a\xeezg\xd9\xed\x94\ +\xa3\x85\x9aD\xa3\x0f~\x0fJ/\xb7\x0f\xae\xdf\x0a\x9b\ +\x85\xdd\xee=\xca\x86p\x01\x0b\x9d\xea\xf4\x16\xecg}\ +b\xf7vuc9\xdd\xc7o7'\xb4\xb6Y\x0d\xcf\ +\xf0\x1f@\xa2m\xf80\xf7\xf2#\xe0\x14+\x81pG\ +;\xc1\xb77\x0aZ\x5c3\x87>\x09\x0d\x220\xec\x8c\ +c{\xca[\xe2LL\x15\xb1G\x19\x8d\xc6N\x09\xf1\ +\xdd\xf7\xbfw\xf9\x0b\xdb\xbc\x97q?\x1e\x0e\x01\xb8I\ +\x0a\xe1i\xc7\x86\xa2Y]\x86\xb8\x89\x19\xa5\x0d\xda\xc9\ +\x11w\xd6\x1c:\xc0\x8b\xbb\xa1\xafi\x90m\xab\xbe\x90\ +_\x1f\xe4.\x83\x91\xed\xed\xc1\xd1w')\xe9\x5c\xaf\ +\xa6i\xa9^\x22Ee%\xeb\xa4\x15\xc4\xb7nip\ +\xaf\x9f\x18\xde\xd6_|O\x8e\xc0\x82\xbb\x17A!]\ +\x0f\xb3\xf0^\x8d\xda\x88OK\x0a\xfd5\x05\xee\xc9\xcf\ +\xd4H\xc6\xa2V8\x84\x8a>\xb6\xdf\x8fB\xd0p\x97\ +\xba\xab\x9e\xa0\xed\x04\x81\xef\xf8\xbe\xf4C\xb8\x04zP\ +\x14C5\xa0\xe2\x1br8\x1d\xbd\xd1m\xeb\xc7$\x9e\ +\x00\xa0\x18\x86#!\xbe5\xd5 /\xa6(&WJ\ +\xa1\x10*\xa3\x17s \x94\x00w\xc1>\xef\x88\x92\xe7\ +6\xc4\xff\x08\x81\xbdU\x00\x1a\x02\x0f>$\xc5?\x9b\ +\x86\xben\x1b\x00\xff\xd9\x04\xef\xf5\x04-\xd5\xbe(\x7f\ +\x00\x89\x17?\x8cT\x12\xcd\x8fI9\x84\xec\x1e\x10\xe3\ +\xe3\x91H\xd4\x885A\x1a\xeb\xefl\x92MP%\x00\ +#\x17\xdcO\x1e\x88_\x0a\xdc\xac\x0f`\xb4\x85\x82B\ +\xf1\xc8dp\xa9d\xe2G\x92Y\xef(\x22fB\xcf\ +g\xa2\xf9\x82\x04\xfeh\xe4$(\xac\x10\xa1L\x89 \ +\x8e\x0b/\xf4R\x8c\xdc\x14\x01\x0e\xcda(\x0fBI\ +\x00\x8f \x22\xe5\x98\x9d\xc5\xa4\x92P\x1c\x88%\x86\x22\ +h\x88V+\x94#\xc0q\x06`\x8b\x04\x01u\x03e\ +T<\x01\xfa\xe1\x8fl\x1a\xe2@\xc8\xec\xe8#)\x16\ +\x1eNf\xcf\x0e,\xfe\x223\x02B@\x0fP\x98\x13\ +\x0dn\x0a@\xcf\x07\x06\xf6\x12\xb0\xa8\x0fA?\x0a\xe1\ +\x0e$\x0b\xce\x8b\xeb\xd4x\x8ec\x08\x87\x94\xfd\xb0\x18\ +\xf9%\xae\xfa\xf0 \x00\x0e6\x82\x8f<$\x10@\x17\ +0f\x07\x00\x8c\x22\x08\xb2\x19Ay\x07P\xa4$G\ +>\x01\x8d:\xf5\xa2\x1e\x16\x10\xfc\x13a\x09\x10,\xb6\ +#\xe9\xaa\x02k\xd0\x15\xf0\x82#\x07\x90\xe2\x8c\xf2\xf9\ +\x05p\xef%\xb4\xefk\x8e\xd5MX\x98\x22@I!\ +4\x18\x0f\xf2!\xed\x1a\x01\x8d\x17\x0e\xe2B\xa6\xe0H\ +\x05\x8cl\x15\x08\xd0!\xa1k\x15!D\x0f\xf1X\x0b\ +\xf0~\xceHb\xd90\xcf\x11m\xe3\x08\xca\xc6\xda1\ +#\x05\xac\xfc\xef\xab2\xfe\x82?\x13\x114p\xc2!\ +\x13\xb1?\x14\x02?\x14QH\xc6\xd1N!\x91R\x16\ +\xb1W\x15\xb0\xb4\xe1\xed\xdb\x00\xca\xbeU\xcf\xd9\x16\xce\ +\xf1\x17\x10\xce\xc5g\xb0\xda\xc27\x18\x116!\xd1\x88\ +\xa8\xf1\x8d\x18\xeao\x191L\x22\x11\x9b\x19\xe0\xff\x15\ +\xc2>\xe9\xe9a\x1a\x8f\xd4\x96\xa6<\xe2\xcd\xeb\x17M\ +\xef\x12\x8b\x92\xd5\xa2;\x1c\x11\x85\x13\x84\xab\x13\xd1\xc9\ +\x1c\xa2;\x19\x11K\x19b\x17\x1dqY\x1d\xb1\xa2\xe5\ +\xcaG\x16Nt!p\x87\x08\xae+\x16\xed\xe8\xbe\x91\ +\xf0\xef\x8dT\xcan\xfe#\x91\xfc\x06H\xc7\x1cR\x03\ +\x18\xb2\x08#r\x0d\x19Q\xd5\x15R\x17\x1d\xc2<\xc8\ +\xf2!\x12EX31\xaf\x22\xac\xf4\x92\x90\x1f\x22\x22\ +\x15\x09Q~I1\x83$\x11\x87$r\x06@\xe07\ +(`B\x06r\x8c\x08\x08\x5c\xcc\x01\xcf\x0eax\xcc\ +\x01\xd0A2O\x1d\x22\x1f!Q\xa0#\xf0I\x1eB\ +4\xee\xa7\x17\x0cB$\xc4p\xca\xf9rp!0^\ +\x88\xd1-'q3\x1c\x22\x1b\x1cj\xe6%\x8fJ\x01\ +\x00\x14rP\xcc\x9e\xaab\x84\xc18\x10P:\x11\x09\ +0\x1f\x82Y*2\x10!R\xa9!\x91\xdf\x16\x0bx\ +\xfd0\x11\x11\x90\x8ed\xef6\x1fR9\x17\xc2=#\ +\xf2C-2\x81-bN\xbf\xf0:\x19\x04z\x06\x02\ +0\x18\xb34\x16\xc4\xe8\x0d\xeb\xa2%r\xf9%1\x9d\ +%q^p\x0e\xa1+\x023+G\x19\x1b\x11\x1c\xb8\ +ew\x09\x021,pc\x1f\xb2y-\x02\x19-J\ +\x90$\xe6\xde\x8f\x08\xf4#\xe1\x0f7\xe0\xd0\x85!Z\ +\x13\x22Q42\xa7%R\xaa#\xcf\x1c\xc3q\xff+\ +*\xc0\xf2mI5\xb1!\x0c\xf2u1\xb3k9\xb3\ + \xd1\xd2H$\x22r\x01\xeb\xf8\x17\x81\xd6a\xe2@\ +\xab\x01\xdc\x1d,\xba\x09\x004hbE8\xc2\x1d/\ +\xf2X#\xb1\x0ax\x10\x0b'\xcd\xde\xe2qk&\x93\ +\xa5\x1bR\xc2!\x13e\x1f\x92=:\xf3\xe9$S\xb5\ +(\x22C\x0d\xf0j\xcdpn$\xe4\x00\x0a`N\x1c\ +4\x1c\x1bBI=\x91Q9\x13\x019Q\xa4\xf1\xf3\ +P#\x12'\x0c3X\xfd\xc9\xe55\xf3\x10#jb\ +\x93r;\x1b\xf4\x011\xf3o23r$@\x83E\ +\xa0\xa2\x80\x02P\xc8,\x86\xc8\xa2GBQ\x99B\x93\ +\xde#\x91\xe0\xee\x10J\x22\xcf$VS\xa3C\xd1\x1f\ +?R`\xe3K\x91\x06\x13\xfdD\xd2\xcf;\x14S@\ +s$$J\x1c\x04\xe0`\xa8\x01J\x19\xe2P\xc5\xe0\ +&\x1e4\xb4\x1d\xd4#\x1c\xf2\x0f4Q\xd9G\x227\ +\x10\xb1\x0f\x11\x22.\xb7\xe7\x95\x01r\xbbC\xee/\x17\ +3b\xe7\x8d\x01\x0dr\xcd'\xb4P!sp$\x84\ +\xa6\x15\xd4\xf4\x1b@9O\xa0F$\x0bN\x17\xef\x9e\ +\x08S\x8bK\xd2Q8\xf3G9\x22;%\xc8\x05?\ +b\x0fCe\x9f+\x82#+\xc9t[3\x131p\ +'?\xf4\x97@3\xb3 T\x9e$\xa0\x8bT \xad\ +7\xe1\x0e\x15\x228\x8f\x88&\x1a\x15T\xcd\x22OF\ +\xd2\x13G\x13J\x02\xac\xe70\x8e\xa42\xcb\x81H0\ +\xc7Hr.\xefR2!\xe7\xaas\x01\xabX!\x95\ +\x12\xf4O'\xf4\x9dEbR\x0cU\x94\x0f@\xd3Y\ +\xa1\x08\xc5#\xef\x02\xa0\xcc\x16\x95\xa8\x142\xf7P\xd2\ +\xa5=\xb5a*\xd4.\xc9\x00{\x16umM5q\ +MuuM\xb3\xa9\x17\x91\xbc#S\x1dX\xd5=Y\ +\x02Xda\x0c\x8f\x00\xf2\x22\x11\x02\x10\x80\xcb\x0f\xc1\ +`\x13\x82aU\xd2\xfd[t-!\xc7\x83L\xc2-\ +\x16\x85cRB!R\x8cK,\x14\x8a!\x95~\x88\ +\xb5\x82\x1a\xb5\x87NsmN\xd4T&\x00\xbfb\xe0\ +\xecWL\xe0!\xe0\xf1c\xa0\xad;\xe1W_u\xb1\ +/\xa2\x13=\xd2\x1a\x85\xf1\xa6\x86\x8b\xdc\xd9\xcaW?\ +4@z5.\xdf3\x196\x957N\xa2\x15N\xe2\ +_b\xe0\xbfc$?cb\x1dc\xa0\xf1c\xeb\xf9\ +d\x22__\x96K_\xd5\x16\xc3$v\xeeU\x1c \ +\xd6\x08\x07\xd6\x0c!\xef\xdfWt\xdcH\xa4\x8e\xc5\x94\ +K]U\x8b \x15\x8fb\xd61cB!h\x16\x84\ +\x17\x96\x88%\xd6\x8c!\x16M0'\x01Vl\x92#\ +p\x86\x91\xc9!\x5cu'M\x93`\x22\xf4F\x88\xb5\ +\xd2#5\xd7k\x95\xda&\x0a\x9e\x09@\xb8\x10W\x04\ +\x14b Y\xc0yUA\xa1U\x96\xcddt\xc14\ +\x91\x084T\xcbV\x91\x14\xde\x16\x0bC\xa2&}h\ +\x1cn6b\xef\xd6gST\xe9]\x93\xb6%\x8f\xec\ +\xb0\x81V\x1a\xc8\x9e\x8a\x22\x0ev\xe1\xaa\xc0`\xb6\x06\ +P\x05Z\xf1GK\xf5\x11L6N\x80\x12_W\xad\ +\x99>\xd7+?\x14\x855\xc1\x11n\xa2-:\xb6i\ +s\xf6\xf9t\x22^\x04\x17\x90\x05\x07$t@B\x05\ +!\xady\xe1\x96\xd0\x81$\x0e\xe9\x96\x1dA\xcb*\x17\ +\x19vw\x1c#\xd4\xc9\x0b\x96\x04\x22\xb6\x9fj\x22\x1c\ +\xd4\xc5\xaf\x1e\xf4\xdf\x1fT\x91,\xb3\xadf\xb7A@\ +\x92J#\x16\xce \xf6\xd3%\xb6\x94pi\xd2\x07\xd0\ +\xcfG\xf4\xd5nu\xcb|\xd6\xacJ\x0f\x9e\xfa4\xe5\ +}w\x89@V\xfb}\xe25~\x22\x0d~b:\xfc\ +\xf7\xbe\x22\x97\xf5nV\x0em\xc5D\xca\x0f\xe42f\ +7a\xf6#\x80\x96'f\xf6+\x81\x023\x81B\x0b\ +\x81\x8299x:\x22\xb0\x87Y@\xc4\x07i\xdf\x05\ +X+sMR\xd5q\xf7}W\x87\x84\xe2\x11g\x18\ +@\x22\xf8D \x98H#r\xafeO\xd4\x82n\xab\ +&\xa6H\x88\x15\xcf#veS4\x95\x80\xb5;x\ +\xd8r\x22Xv xz#Tw9\x98\x81\x01\x15\ +o\x1e\xb2-\x5c\xd6\x9a \xb7\x84#\x8b>\x13\x01|\ +\xb3\x80h\x08\x22 \xbb@\xee\x0a\x81\xf3\x8da\xf1\x89\ +\xe2.\x03X\xe0\x04\x04\xce\x0e\xc9\x06!\xf5\xa8\x16\x81\ +@\x10\x18\xf4\x0c7j\xa4x\x1e\x22sU|B\x1b\ +jx\xb9ab\x17\x8b\xe26\x94,^\x0a\x98\xdcO\ +\x0b\xac\x14\x81\x1a\xba`\xe9d\xee!C4\xcf\x5c0\ +\x15\x82V\xa5n\x94C\x82\xf7\xd1,\x8aj#\xa9\xf6\ +\x89\xb9\x1aLM\x86\x0a-\x83\x92\x96S\x00\xf3S&\ +N\xedr\xd5\xc8\x92x\x8a\xcf\x97qH\xcf9N(\ +,$\x0c\x12\x01\xb2\x0e\x039|\x03\xf9JH\x17\x9e\ +\x1a\xc1\x97\x85@u/5b\xc3V\x99\x90\xc2\x15M\ +\x193\x8bMJCMO\x93\xa23n\xe5co\x22\ +8\x06\xb9\xb4\x08A'\x9b\xa1qC\x88)\xc2\x0aS\x82\x81\ +*\xcf\xcf\x18\x0b\xfcH\x06P\x09\x8c\xae\xbd\xc9\xbb\x9e\ +\xa1>\x0a\x91\xa3\x05\x83\x87\xdc\x1cG \xa2\xaa\xf4V\ +\xa0\xa3\x90i\x0b\x9cJ\x9c\x0a\xab\xbc\x0a4\x12\xa2\x9a\ +\x91\x08\x0c|D\x83\x92\x0a> \xa0[\x10{ \xa4\ +(\x1d\x17\x91\xa14d|\xa8\xf0\xdaY\x1b%p\xfa\ +|\xf9\x19\x822\x0aI\xa0\xa13Dn6\xa3k\x92\ +\x19\x97\x0a\x1cp\x95IiLt\xe7\x1f\xe0\x11\x9d)\ +\x90i\x00\xf4\xd3\xa1\xe4L\x8e=6\xa7\xf2s&\xa5\ +\x13\x02O'\xa5\x8e\x99\x9e\x08\x1f\xb3IJ\x82\x89R\ +\xc2,\x5c\x00s\x88\xb2\x18\xce\x8e\x03\xdb\x03\xb1\xf3\xc2\ +}2$\xf2\x99\x9c\x15:\xc7\xf1`\x82\x84\xb3r:\ +nN \x18\xa1:\x06&\xac8\xa5LI4\xf8\x91\ +5\xc6h\x86\x90\x15\xe8(\x1bC$\xe7\xa3\xfc\x01\x0a\ +P\x08d]\xa54\x8aKS$\x94\x9a5?\x08\x94\ +\x09d\x82\x814\xe2`|S\xe2uER$\x95B\ +\x81='\xb5R+\x1eG\xc8!b\x82\x81\x0a\x93\x96\ +\x82\x15\x8d\xa9n\xda\x9c@M\x9cq\xcd'\xe9\xfe~\ +Z\x80\xd5\xa8~\x17\xa8(8\xae\x1f\x08(\x9f\x0b\x86\ +\x85\xd2=]$W\x22=_\x22\x11\xe0\x8e\x82\xd0h\ +%\x8a\xa5\x9c-\xa8\xe7Q\x15\xf2\xea-\x1e\x1bh(\ +H\xb1[\xa8 \xa1p\x17,\xf5x\x9e\x5c\xc8\xed\xd0\ +\x85\xcf\xc1\xad\x02` \xa0R\x98F\x82\xd8\x88\xfa\x0f\ +b\x87\xba=|_KA\xec\xda\x87\xf29\x98\x8b`\ +\xa8\xe6B\x8d\xe0\xe84x\x0f \xa6J\x0a\x0c(\xd2\ +\xf2\x086\xdc\x04\xb2S\x8c \x97\xda\xdat<\xa08\ +l\xf4\x05\xafSG\x0e\xa8\xb9\x1a5\x83\x9bZ(\x1c\ +yi\x06*\x0a\x16)\x83-\xc0N%\xf9\xa0\x01\x9b\ +.F\x90\x17\xab\x87\x81N\xb4y\xa1\xda\x123\xaf#\ +\x14\x9a@\x00\xd2\xa5\x9a\x0a%\xa8\xed\xa9A#\x8c)\ +\x9e\xa5\xaa.\xa5\x94\x8e(6\xba\x02\x0d\xb0\x22\xfb\xc2\ +-I\xd2\xa3\xe2@A\xa9\x87\x02\x0a\x15\xdc\x11be\ +\xb7\xaf\xad\xa8\xf1#\x91(V\xf4\x8a\xf1\xe8\xa4u\x1e\ +\x07\x88.\x18\x82\x00zn\x9e\x9c\xf1\x0b\xfb\xf8\x82\x07\ +\x97\x06T\xa8n\xd2V\x06\x9d\xba:)\xb5\xa3\xe9\x06\ +\x92\x0a\x0f\xa9\x87\x0d\x09p\x1f|\xe3\xe5|\xe6\xacG\ +p\x00\x06\x1c/\x22\x89\xf7\xe8\x93\xa3\x1e\x11\xb0\xaa\xa4\ +E\x5c\x03\xba{\xce\xb0\xed\xa9\x05#\x8f\xfe\x0a#\xe9\ +\x22\x06\x87\xad4M9\xf0\x18\xa6\xd1\x22\x0d\x19\xcb\xa7\ +~c\x12w\x81\x1f(<\x15\xfd\x07\xa4k\xd3\xa7S\ +\xf0\xec\x90q\xaa~,\x82\x01\xfd\xa7\x97\xdb\xe3,s\ +j9TD\x7f\xd6\xe9J\x12\x95\x16\xa9\xb0\xa9\x0d\xd5\ +\xc0\xdc\x09\xe8\xd2\x81@\x88\x90\x00RR\x83\x87\xda\xaf\ + \x89\x08\xa7\x8b4\x8e\x13\x9f\xf9JR\xa3e \x95\ +!\x8a\xb8\x1c\xa9\x82G\x82\xf8\x82\x84\x12\xa46\x128\ +)\x83%\x1dJ\xb8`\x00\xacJa\xb5\x16\x89\x1c&\ +\x984x\xa6W\xf1R\x1e\xe9\x1d\x87\x14g\xa8C\xd4\ +\xa8\xdf \xa0\x80\xa9\x0cu\xc0\x0e\x8c\x1a\x95\x18D\x80\ +\x1e\x95!\xbe\x91\xc1\x14+(\xcaU\x5c\x00\x00\x88T\ +\x86\xf2\xe0\x04p\xd8\xf9A\xc8&T\x85\xd2G]p\ +\xf9\xf6\x13\x95*\x22\x08+\xca)\xe3\xe1\xf2\x80\x80\x1e\ +\x0b#\x80\xfa.\xa8\xf2\x07\x10D\xec\x00!\xe9N\x10\ +\xa9\x1d\x14FH\x00O\xd3\xf0\x1f$\x03t\x82\xb9\x92\ +\x9e\x10\xd7\x04$.\x89\xf8\x1f\xb0\xb2\xa4>\x8d\xa8!\ +TK\x1d\xa0\xc6RltT\xa8\xa9$\x01X\xa6\x90\ +\x00\x0c\x09\x183\x82\x9d@\x10\x88L*\x17\x0c\x86\xc3\ +\xa1\xf1\x08\x8cJ&\x00fE\x910\x93\xb4R7\x1c\ +\x8e\xc2\xd3\xe3I\x09\x89\xff$\x8fI\xa4\xf0\xa9#\xfe\ +Q,\x8f@\x80 \x06\x94\xc8D\xfa\x9a\xb4! \xd9\ +l\xea8\xe3\x04O\x84\x82\xca\x0b\xeawD\xa2\xc3\x1a\ +\x94\x803\xe2\x96\xdb\x84\x87\xa8\xd5\x08c\xc0\x07T\x16\ +\x0cj\xeeYUF\xb7Z\xad\xd4%\xf0\xb6u\x88\xbc\ +\xfe\xb2\xa8k\xd5\xe9y\xa6\x0a3LZ-\xf1\xd6m\ +\xc8\xcf*\xb7\x5c(\xd2\xf2\xc5\xb1S)\x92\xdd\xe7U\ +\xdb\xfc\xb2\xc1\x0e\xb93S\xf2\xa3\x06\x0av\xe2\x02c\ +\x85C\x0c\x8b\xd7\x17\x7fhe\x81o\xcc\xcb^\x12\x1d\ +\xcaI\xe5\xe9\xbba\x9a\x1d\x81\xcfGt\xbah\xde\x12\ +\x1a\xe2\xd6\x82][\x06,$c\xa9\x8e\xcb\xd4\xb6\xc2\ +\xe6\xd6\xbd\x16f)a%\xad\xde\xaa\x04\xcd\x06\xf1\x87\ +bnK\xe7I~\xe1D\xf5\x1c\xe8~\xae \xd3\xea\ +\x87_=\x86D$5\xd1\x8d\x9a\xe4#D\xb7vM\ +\x866J\x92~8\x9b\x96\xa8\x03\x1b\xd5\xc6.X\x97\ +C\xd3}\x95\xfd!\xdd8\x9b?\xf60~\xff\x8c4\ +$\x0c}\xd0\xc3\xfd/\x1d\x16\xc2:\x03C\x1b\xd4\x1d\ +\x08F\x10\x84\xc2\x0aBO0\x0a\x15\x0fC(`\xd1\ +G\x1f8\x0e\x1c}\xdf\x94qb3\x84\x95\x94\xfe,\ +\xd0\x90\x0e\x12B\x92\xf2X\x0a\x8b\x87\x80\xa61<\xdb\ +Sj5\x03\x8f(\xe0\x8aBFx\xa9\x0c?R\xf1\ +1l.\x12xy\xf4\x91^\x98\x81\xe4\x5c\x85\xc4\xa8\ +\xa0\x8a#\xd4,\xe7BG\x94$\xa6x\x0f\xb5\x19H\ +5\x14\xa5-\xc1B\x08\x84$\x17\x94\x10\xa8\xfd\x02\x18\ +\x16\xc2\x91\x80sc\xd9\x1d\xe3\x92R\xc8\x88Y\x89J\ +9>cC\x0e\xf4$\xb0Bd4 \xe2\x01g\xf3\ +\x91\x0a>\xe80qNK\xc4\x94\xa8PBA\x09\xda\ +>\x85@!v\x18\x0c\x8au\x1amwigFo\ +N\xe2!R%\xa5\x10\x80\x12\x8d\xa8\x9ac\xf1\xc0x\ +\x0a\xb5z\x98s\xaa\xa7\x0a\x9aQ\x9b\xda)\x08\xa7\xc0\ +\x00\x22\xa3\xad\x95\x17-\x08\x16^\x02\xbdw\xab\x1b\xba\ +\xfd\xb5\xab\x95\xb6\x183J\x8a\xe5:\xb7\xb2\x91\xe3\x8d\ +/\x14\x96\xc31\x94\xb0Z\x9bM\xa6\xb0\xd6\xf6\xf4\x14\ +K\xca\x94\xa8B\xb2\xed\xf40\xc0\xa3\xc5jH\xebm\ +mVz\xe8e-u\xfd*\x00\xe2\x22!*\x1d.\ +\x0a\xd8\x8f[\x07d\xbe\xa5\xaa\xe6\xb8\xaa\xeab\xee\xc6\ +\xd6\x22\x89\x16RI\x09\x09/GD\xddBF\xf7\x80\ +\xb5\x84\xaf\xe6\x0b\x10_\xf0\x07:Z\x97\x0f\x81\xc9\x09\ +\x1f\x10\x90/\x08V\xd94 \x86\x03\xb225\xc9\x09\ +\xab\x99\xb2\xfc\xc3\xf2\xa8+\x14\x80\xdf\xb3<\x1b\x7f\x8f\ +\xd2-\x09\x16q\xe4\xb0\xa9\x9f\xc0Q\xd0/\xcf\xa8\x1b\ ++\x12\xaf\xb2\xc8\x0f.\x9d\xacT\xa8nBEt$\ +\x07\xbd\x144 \xa9K\xc9+C8B4%\xc3X\ +[\xf4k.\x22\x05R\xa1a\x09\x14\x12\xa0\xf9\x09\xa8\ +\x5c+\xe8\x00\x80\x10\x82\xc1\x8e\x01\x0a\x86D0:\xb5\ +d?ZZ7e\xa5\x02\xdd\x12\x84\xc8\xd2\x04Y\x93\ +\xf08\x89[D 0K\xc1\xd4\xa8\x11\xa2\xd0\x98D\ +\x00\x9e\x10\x83\xc1\x098\xd0\x93>\x8f46\xe3\x1c.\ +\xe6\xb8\xfd\xed\xa7\xd1\x1f}\xe3\x9d\xe8\xba>\x93w\xe7\ +\xfa^\xa3\xa9\xea\xb1\x1e\x9f\xab\xeb\xba\xfe\xc1(\xe8{\ +\x1e\xd3\xb5\xde\xfb>\xdb\xb9\xee\xb4\x1e\xb7\xbb\xef\xbb\xfe\ +\x8b\xb8\xf0\x01E\x01L\x01R\x01Y\x01`\x01g\x01n\x01\ +u\x01|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\ +\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\ +\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x02\ +8\x02A\x02K\x02T\x02]\x02g\x02q\x02z\x02\ +\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\ +\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03\ +-\x038\x03C\x03O\x03Z\x03f\x03r\x03~\x03\ +\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\ +\xec\x03\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04\ +U\x04c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\ +\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05\ +:\x05I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\ +\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x06\ +7\x06H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\ +\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07\ +O\x07a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\ +\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\ +\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09\ +%\x09:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\ +\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\ +\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b\ +9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\ +\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\ +\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\ +\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0e\ +d\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0f\ +A\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10\ +&\x10C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\ +\x13\x111\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\ +\x07\x12&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\ +\x03\x13#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\ +\x06\x14'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\ +\x12\x154\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16\ +&\x16I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17\ +A\x17e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18\ +e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\ +\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\ +\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\ +\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1d\ +G\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\ +\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\ +\xea \x15 A l \x98 \xc4 \xf0!\x1c!\ +H!u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\ +\xaf\x22\xdd#\x0a#8#f#\x94#\xc2#\xf0$\ +\x1f$M$|$\xab$\xda%\x09%8%h%\ +\x97%\xc7%\xf7&'&W&\x87&\xb7&\xe8'\ +\x18'I'z'\xab'\xdc(\x0d(?(q(\ +\xa2(\xd4)\x06)8)k)\x9d)\xd0*\x02*\ +5*h*\x9b*\xcf+\x02+6+i+\x9d+\ +\xd1,\x05,9,n,\xa2,\xd7-\x0c-A-\ +v-\xab-\xe1.\x16.L.\x82.\xb7.\xee/\ +$/Z/\x91/\xc7/\xfe050l0\xa40\ +\xdb1\x121J1\x821\xba1\xf22*2c2\ +\x9b2\xd43\x0d3F3\x7f3\xb83\xf14+4\ +e4\x9e4\xd85\x135M5\x875\xc25\xfd6\ +76r6\xae6\xe97$7`7\x9c7\xd78\ +\x148P8\x8c8\xc89\x059B9\x7f9\xbc9\ +\xf9:6:t:\xb2:\xef;-;k;\xaa;\ +\xe8<' >`>\xa0>\xe0?!?a?\xa2?\ +\xe2@#@d@\xa6@\xe7A)AjA\xacA\ +\xeeB0BrB\xb5B\xf7C:C}C\xc0D\ +\x03DGD\x8aD\xceE\x12EUE\x9aE\xdeF\ +\x22FgF\xabF\xf0G5G{G\xc0H\x05H\ +KH\x91H\xd7I\x1dIcI\xa9I\xf0J7J\ +}J\xc4K\x0cKSK\x9aK\xe2L*LrL\ +\xbaM\x02MJM\x93M\xdcN%NnN\xb7O\ +\x00OIO\x93O\xddP'PqP\xbbQ\x06Q\ +PQ\x9bQ\xe6R1R|R\xc7S\x13S_S\ +\xaaS\xf6TBT\x8fT\xdbU(UuU\xc2V\ +\x0fV\x5cV\xa9V\xf7WDW\x92W\xe0X/X\ +}X\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\ +\xf5[E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']\ +x]\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\ +\x05`W`\xaa`\xfcaOa\xa2a\xf5bIb\ +\x9cb\xf0cCc\x97c\xebd@d\x94d\xe9e\ +=e\x92e\xe7f=f\x92f\xe8g=g\x93g\ +\xe9h?h\x96h\xeciCi\x9ai\xf1jHj\ +\x9fj\xf7kOk\xa7k\xfflWl\xafm\x08m\ +`m\xb9n\x12nkn\xc4o\x1eoxo\xd1p\ ++p\x86p\xe0q:q\x95q\xf0rKr\xa6s\ +\x01s]s\xb8t\x14tpt\xccu(u\x85u\ +\xe1v>v\x9bv\xf8wVw\xb3x\x11xnx\ +\xccy*y\x89y\xe7zFz\xa5{\x04{c{\ +\xc2|!|\x81|\xe1}A}\xa1~\x01~b~\ +\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\ +\xcd\x820\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\ +\xe3\x85G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\ +\x04\x88i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b\ +0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8e\ +f\x8e\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\ +\xa8\x92\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\ +\xf4\x95_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98\ +L\x98\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\ +\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\ +\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\ +\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\ +\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\ +\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xad\ +D\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\ +\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\ +\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8\ +Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc\ +!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\ +\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\ +\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\ +\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\ +\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\ +\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\ +\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\ +\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\ +\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe0\ +6\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4\ +s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\ +\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\ +\x11\xed\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1\ +r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\ +\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfa\ +W\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\ +\xdc\xffm\xff\xff\ +\x00\x00\x03\xa0\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Default - Saved<\ +/title>\x0a Created with S\ +ketch.\x0a \ + \x0a\ + \x0a <\ +path d=\x22M13.6916\ +3,3.24686842 L8.\ +01783965,6.52512\ +131 L2.34404932,\ +3.24686842 L8,0.\ +481790242 L13.69\ +163,3.24686842 Z\ + M7.25035308,7.8\ +2264135 L7.25035\ +308,14.7689324 L\ +1.9912897,11.723\ +6967 L1.9912897,\ +4.79310939 L7.25\ +035308,7.8226413\ +5 Z M14.0326515,\ +11.6884321 L8.74\ +360561,14.776916\ +3 L8.74360561,7.\ +8257203 L14.0024\ +918,4.79949203 L\ +14.0326515,11.68\ +84321 Z\x22 id=\x22Sha\ +pe\x22 fill=\x22#4285F\ +4\x22 fill-rule=\x22no\ +nzero\x22>\x0a \ + \x0a\x0a\ +\x00\x00\x04g\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Editor only - De\ +fault\x0a \ + Created \ +with Sketch.\x0a \x0a \x0a \x0a \x0a<\ +/svg>\x0a\ +\x00\x00\x02\x90\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a \x0a \x0a \ + \x0a\x0a\ +\x00\x00#k\ +\x00\ +\x00\xf0\x80x\x9c\xed\x5c\x07\x5c\x93\xc7\xdf\xbf'\x09\x09\ +[\xb62\xc4\x88\x03\x17#\xcc\x10\x01\xd9CE\x11\x10\ +\xd4\xbaB\xf2\x00\x91,\x930\xc4=\xaaV\xad\x03\xad\ +\x0b\xb7\xd6=\xea^\xad\xd6\x89V\xabu\xb7\xd5\xb6\x8e\ +?\xae*\xe2`\xa3y\xef\x9e$\x10\x14\x15$\x8a\xf6\ +}\xbe\xf9\xdc\x93\xbb\xdf\xdd\xfd\xd6\xddsw\xcf\xb8'\ +&\x06t\x02\x00\xe8\x83\x16\xe0\x15\xa0\xc1\x18\x06T\x07\ +*\xf17\x14\x1e0\xad8\x85\x88\xc3r\x98+FU\ +\xd3aa\x8c\xae\x8eS\xe0\xc1\x5c\xc3'q!f\xa1\ +U\xc6Z\x1dG\xb5m\xb4x6\xd7\x94\x9f\x0d0;\ +\xa0\xa7\x8ac>\x98}u<\x10s\xd0\xe2\xd3AK\ +\x16\x0b\x1d\x81\x13\x8cE`\x1eD\xdc\x0a\xc6\xd3\xb0\xb8\ +\x9a\xf2\x94\x1f\xd1\x91\xb3\x16&GM<\x08\x18\x90\xde\ +\x0c\x00\x7f\xa7\xc9\xd1\x88n\xea\x08\xe3\x1eS\x04\x1a\x1d\ +\xee.\x9c\x22Ge\x8c\xa3\x00\xe8\x1e;w \x8a\x1b\ +\xec\x83\xf4\xe3\xc8/\xd0O\xaa\x9fa\xd58\x00\x9c\xcd\ +4\xff\xc1|I2\xce\x8cM\x93($\xf24\x89\x94\ +\x19\x1a\xca\xf4pg\xf92;$\x09\xc4|I\x96\xbc\ +#@I\x8e\xbb\x07\xc7\xdd\x93\xc9\xf2\xe1x\xf8p\xbc\ +X\xc0\xbf[\xb6\x94\xcbK\xc7\x15\xccda\xb8\x9c'\x13H\x15\x02\x89\x98\x89\ +\xd2\xdcdI\x86\x22\xc0\xc9\xc9\x90\xa9\x05\xb5]\x22i\ +\xb5 \xb1\xdc\x95\xb0\xd1\x95'\x11\xb9es\xa5n,\ +Ww\xb7\xba*\xf1y\xd5u\xa4\x192!\xa1\x1a\x9f\ +\xe7\x86\x0bq\x11.V\xc8a=V\x9d\xf5\xa4\x9a\xb6\ +\xab[du\xf6[\x05Cmcb\xde\xad\xafHT\ +gM\xb9\x22\x9f\xef\xc3\xe6\xe1P\x0b\x1cOv\ +\xf1\xf3\xf3rwa\xb3y\x9e.\xbe\xc9\x1e\xde\xc9\xc9\ +\x1e8\xd7\xdd\xc3\x8bh\xcb\xda\xd5\xdf`\xad\x91\xaef\ +M\x98\xca\xf3\xf4\xc0}\xfd\xd8.)\xfc\x14\x96\x8b\xb7\ +\x9f\x17\xdf\xc5\xcf;\xc5\xcf\x85\xeb\xe5\xc3\xf2e\xf9&\ +\xfbp\xb9\xbe\x1a\xd6Z\xd5\xdf`\xdd[&\x80\xa31\ +W\xd8H\x11u\xb0yCT\x94\x00ynD\x1dm\ +\x1b\x8f\x0f\x7f[\xdb\x12\xe3\xa6\x94+\x93\xe3hT\x08\ +p\xd2\x0c\x0bNoT@u\x88\xd1\x85\xc3\xe5\xa1\x11\ +7\x90G\x9c\xf8\xb0\xc1kQ\xdf^M\xf0f\x03\xd6\ +\xcf\x05oT\x7f\xbb\x8c\xac4\x5c\xfc\xae\x01K\xab\xd4\ +\xdb\x99\xc8%)\x8a,\xae\x0c\x0fN\x85\x9e\xae\xcfh\ +QW\xb57\xfc]\xe7y\xa1\x93\x86\x90s3\x1b\xd7\ +\x0c\x9e)\xbe>\xc98\xcb\xc7\x85\xcd\xe7y\xb8p\xd9\ +^\xb0\x05\x90\x0f}\xbdY\x9e\x9e\xbe\x1e\x5c/\x16\x8b\ +\xdf\xb8f\x80m\xc0\xd2\x1a\xad\x9b\xae\x19j\xd8\xf3\xd2\ +\xb8\xe2T\x9c\x1f\xe8\xa6\xa9\xa8!|I-W\xbf\x11\ +\xb0\x91-\xe7\xf3\xdfj9\x15\xb5\xf6\x98\xa8\x19g_\ +\x1bCUE\xb5\x96\x99\xaa5\xac\x9bz\x11\x0b\xd7\xcf\ +n\xd5\x0b\xe8\xba\x14\xd6=H!\xa4\x10R\x08)\x84\ +\x14B\x0a!\x85\x90BH!\xa4\x10R\x08)\x84\x14\ +B\x0a!\x85\x90BH!\xa4\x10R\x08)\x84\x14B\ +\x0a!\x85\x90BH!\xa4\x10R\x08)\x84\x14B\x0a\ +!\x85\x90BH!\xa4\x10R\x08)\x84\x14B\x0a!\ +\x85\x90BH!\xa4\x10R\x08)\x84\x14B\x0a\xd1\xb1\ +\x10\xc3\x9a-\xa9\xb8\x98\x1f\xe0\x94\xe5\xd4-\xd0\x01\x1b\ +\x00\xa8\xf6\xed\x22\x1d(\x80\xd8`\xcb\x0e\x89\x8e\xa1\xb5\ +#v\xc3\x9a\xfdz\xbeb\xf4\xfa\xfcC\x06z\xd2\xcc\ +\xad\xdb\xf4\x8e\xf5\x22\xf28D^\x01\xca\xd7\xec'\x06\ +FR\x99@\xac\xe8\x9d\xa1\x90f(`\x12m\xec\x05\ +\xb1rE|\xb2D\x22$JD\x8b\x158.\xce\x10\ +i\xe2\xe8?T(C\xe9fD\xddxA6*\x11\ +\x22P\xa0:5\x8f\xf0\x85\ +\xca6\x8a:E\xa9\x95rW\xe9\xa8\xf6\xb5\x0b\x91\xa2\ +\x13\xfe\xb0%(\xfa\xea^A\xb4\x0d%H\x15\xd4u\ +\x1dk\xb7\x0c\xcd\x0e\xc5\xa8\xde\xd5\x96\xab0T\x1dT\ +\xdey\x13\xda4\xed\xb2u\x16\xd0\xa0fp\x03\xe2\x0c\ +\xa1Pe\x10\xa0'K2\xc4|\xf9kc\x0bO\xc1\ +\xd2\xa8\x89NH\xad\x93\x01\xbcv\xd6\x80\x90\x9a\xb3\x8b\ +P#\xae\xe6\xe4Ai\xba\x5c(\xe0\xe1\xf2DaO\ +t\xfac\xb5\xe4\xe8\x11y0b\x01\x03\x83HD\x87\ +i\xf1f\xa4\xca$\x19\xd2Z$\xba\x84\xd8\x97\xab\x19\ +\xd9\xc3\xe3Q%\xd5^]\x986\xe1f($\x91\xb8\ +\x18\x97\xa1}\xb2\x84\xf6#\xa4\x9a\x89\xc9PU\x18Q\ +PN\xb4(\x95\xf9\x09\xec\xa7f\xc8\x84\xb5\xa67\xc2\ +\xf9\xb5)1\xf2\xd4\xdaS \x9d+T$pSk\ +\xd1Ly8\xac\x87g+\xa2\xe5Q\x091=5\x83\ +\xac\xbe\x86\x5c\xab\xb0A\x9aD\x96\x13,\x14\xa4j<\ +\xd5Le|\x94\x86\x8c\xbc\xcb\xc7S\xb8\x19\xc4(k\ +\x90\x89\xcb\x14u\x14O\xd4\x90k\x177JN%\xf6\ +\xd1k9\xd7\x5cU!$\xb2:\x03\xa9\xd1K\x22F\ +\xff\x06\x0a\x89\x14N\xa5r\x5c\xdbq\x86B\xe8\xc87\ +\xa8\xc6\xc9\xc4p\xfd\x06\xddH\x86\x06\xe5\xd7\xc8\xc4\x19\ +\xd4AU\x0f\x06J\xb7\x22PC\xb7\x22\xa2\xa8\x09U\ +g\xa51\x91\xdc\xa9v\xd1PU\xc0`\x17@g\x02\ +m\x01h\x010\xe5\xef\xca\xc7\xc0\x98\xd8=9$4\ +\x06\xa6\x0b\x81)\x91\x02\xfcq\xa8\x9e\xf2:\x98\x04\x8c\ +\xf5\xf5\xf5\x0d\xf4\x8d\x0d\x0c\x8c\xcd\x8d\x0c\x8d\xcc\xad\x9b\ +\x19\x1b7\xb3naiimi\xd9\xc2\xdc\x98\x80\xfa\ +\xafn`&FF&\xa6&f\xa6\xa6fV\xa6\xa6\ +\xa6V\xe8`j\xa5\xaab^\x1f\x06\xca\x9f\x81\xb9>\ +T~(\x15s\x02\x14s\x8cj\x8e)\xff\x82\x86\xd2\ +\x95\xc7\xb1nPK=\x8c\x80\xdaqT\x80Qhz\ +t\x86\xbe\x81\xa1\x11\xf6z&\x06(TM\xa6\x19\xc0\ +h\x18\x95B\xa3\xe81\xe8\xfazTcO\x98iN\ +\xa5\xb5\xb6`\xe9\x05\xf7\xe1Z:\x0d\x1f\xefA\xb7\x9a\ +\xb3r{H\x9b\xb6\xd6qG\x92=\xbdd\x13.\x84\ +2\xda\xe5\xc6\x17\xddz\xca\x93{\xdb\xac\xda1\xb1}\ +\xd8\xdc\x04~\xf8\xd1\xd5\x0a\x9f\xe6\x17\xfb\xde\xc6\x9f\xed\ +\x9ct\xecR\xc6\x9d\xe7\x11\xce\xf3\xd6|\xbd\xeb\xbb\xe3\ +\x97\xff\xf7\xe2\xfb\xdd'\xae\x14\x14'\xa6dN\x9e\xbf\ +v\xcf\xc9\xabwK|#\x93R\xb3\xa6,X\xb77\ +\xff\xda\xbdRs@\xa1@mi\x84N\x0c\xba\x9e7\ +\xa1Bk\x96\x05\x0dj0\xdc\xc9R\xcfc\xfc\x1c+\ +\xa4\xc1\x91\xb8\x0bE\x9em\x93o\xc9&\xe4\x86\xc6[\ +\xf3\xe4^O\xdb\xd1\x91\x02\x8c\xf6\xdeG/B%V\ +7\xe7\x87\xf7\xf5Q\xe0\xb7\xabUx\xbb\x06\xce5*\ +(\xff\x04\xc6TB\xa69\xe8\x06\x8a\x13r\xa3\xdbu\ +l\x9b\x1b\xdd=\xbamn\x5cnt\xdbyk\xd4\x84\ +\xde\xca\xdf\x8a\xfb\x1a\x89\xf0\xbey\x8e\x0a\xc3a6\x89\ +g\xfa\xf5{\xba\x7f\xdd\x8e\xeei\x17\xae\xb4?\xeaj\ +vq\xf4\x9a\xcc\xb2- \xd8\xc2x\xe2\x91~\xe5\xd9\ +n+\x0a%\x07\x0e;\xde\xa98\xbd}\xa7(\xbf\xe4\ +\xa5\xcf\x98\x07\x8f\x8b\xa2{\x9df\x1aph\xcdSn\ +\xffp\xe4\x87Q\xbb\x95`C\x7f\xdf\x82A#\x16\x1c\ +\xec\xf5\xabC\xeb\xb6\xebD\xfb\xf7ms\xef\xd2*\xa0\ +\xdb\xc39\xe3iQ\x97]G\xd8\xcc\xd8\xb4\xde#_\ +\xf0\xd7\xbaI\xf3\x0a\xd7l\xba}7i\xb6W\xc9\x8f\ +\xb2\x7f\x0a\x13-\x08\xcd\x94@y\x81\xd0\xd7\xfb\xb9G\ +^\xf8\xf0\xd5\xcb\x1e\xdb]\xaaJ\xecx\xc5\xd2\xe9\xde\ + \xf9\xb2\x91K\xfd\xa7\xf0\xbd\xe6}\xbfn\xe2`\xeb\ +\x19\x17V^m\xb6\xa6\xd5\x86\xbeO\x8bF\x8f\x92\xf3\ +z\xfa\xb3\xc75\xa3\x85l\xb3\xb9\x90\x9a\x19\xb0\xa1\xa3\ +\xebH\xbb\xb3\xebv\x8f\xf3^\xe5egJ\xd9\xfa\xed\ +\x933\x07z,\xbe\xb6\x0f\xdb:\xee\xe7\xaf;\x17\x89\ +W\xe6\xfd= \xec\xe4\x94\x97\xdft\xa4:\xdee\xfb\ +\xadu`wNm\xd6q\xbf\xf5\xbf\xdf\x7f[\x11Z\ +\xb69\xa1\xe7\xc8\xa51\xbff?\xcax\xde\xf2b\xfc\ +\x8fP\xadu\xca\x8b\x84R\xec\x11\x0a\xce\xf4%\x97^\ +\xf4\xda\x12\x18\xd5Y\xeel\xbb\xc8\xfaq\xe6\xccV\xe1\ +\x7f\xeb%_\x8f\x7f8\x82w\xdc,w\xa9\xe9\xdc\xa1\ +]F\x0f:r#\x90\x11\x9e\xeel\xf3\xe3\xe4c\xbb\ +\xa4\x15\xae\x0e_O\xef;k\xc3\xadG\xee7w=\ +|8o\xdf\x98\xd96]\x0fKs\x97\xfc\xfb\xf4q\ +\xfe\x98k\xdfveK\x13\x96/\x10\xcd3\x1cR8\ +\xb1\xf5_/\x1em\xfd_\xb1q\xd2\xd5~\xf6\x0f\xcf\ +\xcf\x9c\xa8\x04mwZ\xc4\xcd\xd9\xde\xc1\xf7\xc6\xd5Y\ +\xab\xbc\x87?\x0b\xfe\x8a\xed}\xf1\x17l}\xe1\xf25\ +\x85\xcfr\xf3`+v\x1f\xab\xbc\xa4jb\xc3\xaa\x9c\ +')\xd7fM\x9c\xd2\xda\xba\xed\xbc;C\xc6\x8f\x8e\ +\x18\x10\x10\x91\xbd\xb7lw\xe2 \x8b\xe9\x9b\xb6(A\ +\xf4\xb7Y\xc7)\xb9\xcbF\xf7_M\xa9\xec\xb9/G\ +\xf84\xabh\xd85Q\xc6\xce\xfb\xdb\xb7\x94\x01\xab\xdc\ +\xf8Es/\x19\xd9\x1f\x980\x88z\xe3\xd2\xf9\x13\x1b\ +\xbfo~=\xb4\xd4=\x7fzo\xc6\xed\xbd\xdf\xf5\xdc\ +L\x1f\x9c\xb5\xf3\xf7W\xf7\xb6GG\x0f\xdf\xd1\x7f\xf6\ +\xaf\xbf\x9aE\xccdl\x8f\x88]\xbb6\xbe\xdf\x96\x89\ +\xc1e\xe5\x1b\xd6\xacS^~W_\xfbC5\x9e\xb5\ +&\xce\xd8A\x80Xy\xa0\x8f \x05\x03>\xbc\x18J\ +\x86\x0bC&\xbc4J\x83q\x05\x0cr\x22\x86.\x83\ +\x9a\xbf\xa7\x04\x13\x84\xc2\x1f\x13.\xc7\xdc\x01\x0b\xf8\xaa\ +\x07F\xe3\xa8\x9e\x02\xb1\x84\x02\x17\x0b\x22x\xfd\x81\xbe\ +\x81\xd2\xaf\xff\x00&\xe3\x1c\x5c,\x18\xc05\x0a\x9c\x16\ +\xb9<\xb94&>\x22\x81\x98D\xc3C\x99\xe8C)\ +\xa0\x16J\xae\xaa\xa6\xa1K.Q\xb1L&h\x18\xcc\ +yR\x19\x9cd\xb0X\x18\xf7\xe4\xe3r8-c\x93\ +`\x5c\x98\xa5\x90\x22:\x1a\xe3\xad\x92\xd3Q\x9c\x82F\ +w+\x19T\x10\xc6[\xa0x\xaa*\xde\x85(\xa3\x8a\ +\x07\xa18_$\x86\xcb\x01\x0a\xd2Y\xca\x17\xf1Q\x1c\ +}\x11jjf\x06Z&P{\xc2\xf8\xe4L\x01\x9e\ +\x05\xe3\x97a\xbc\xad0C$\x80q\xb4\x02\xb5\x12\xe1\ +\x5c\xb8t!\xe6\x8f\xb6\x0a\x9c\x97\x06\xe3h\x05h,\ +K\x88\x83W24\x7f8\x07\x1b\xa7j\xc5\x93\xb5\xe2\ +\x0a81#\xa3B%\xd2\x11\xc4\x0c\xc6\xec\xc0\xeb\xc8\ +d\xf9\xf9\xb1\x99Qx\x96\x10W(\x5cb\xe1\x05;\ +W\xc6g\x86JDR\xae\x18\xae\xefU6\x13\xb0x\ +\xe3#4Z\x8ezgf=\x81\xdaV\x15{\xde\x87\ +h3\xcc\xe6l\x0d\xad\xaer\x92Up~\x85\xab}\ +\xea\xec\x1aZ\xf2\x22\x00\xf6~\x0d@\x8b?khm\ +W\xc0>\x0a\xdbm\xcfy-{lP\x7f\xd1\xfa\xf8\ +\x94\x00\xe7\xb9\x22\x87V\xe3\xbd\x05\xea\x01-y\xae\x88\ +]\xb5{\x98a\xaa\x15\x0c\x13\xf9\x8d\x07\xd7)\x192\ +&\xbc\xfe\xe2\xe1L\x97\xd7;\xf1\x07W\xac[\x8f.\ +qx\x0a\x8e\xae\xf3pf\x22\xece\xf02\x156\xb7\ +\x98/ \xbe\xa3%\x10\xbf\xad\x11?\xb0\xdakP\xf5\ +k\x08\xcb5\xaf\x80\xd5\x10W`v\xde\x0aP\x1f\x9f\ +\x054K#@\x1d\xb8\x0c\xe6`\xd5\xed\xd6\xd3 \x11\ +\xa03/\xa9\xd5=U\xbf'P\xc7\xe5\x04e\x16:\ +\xc8\x05\xc4\x22\x1a\x84\xc6%0y\x19\xb2LU\x1e\xb1\ +n\xd6\x83\xd7\x88\xcd\x80\x15\xb0\x85\xd7\xb3m@\x07x\ +u\xe7\x01\x07\x99\xae \x08\x84\x83\xee\xa07\xbc\xbe\xed\ +\x0f\x06\xc3+\xda4 \x82W\xb7Y`\x14\x18\x0f&\ +\x83\xe9`6\xf8\x0e,\x06\xcb\xc1\x1a\xb0\x01l\x05;\ +\xc0^\xf0#8\x02N\x823\xe07p\x05\x5c\x077\ +A\x01\xf8\x17\x14\x81\x12P\x09\x172\x0c\xcc\x04\xb3\xc4\ +l\xb1VX;\xac3\xe6\x81\xb1\xb1@,\x1c\xeb\x89\ +\xc5a\xfd\xb1\xa1X*&\xc62\xb0Q\xd8Dl:\ +\x96\x8b-\xc6Vb\x1b\xb0\xed\xd8~\xec\x08v\x1a\xbb\ +\x80\xfd\x81\xdd\xc2\x1e`\xcf\xb0\x0a\x0a\x95bL\xb1\xa2\ +\xb4\xa4\xb4\xa7\xb8Q\xd8\x94`J\x0fJ\x02e\x10%\ +\x952\x9c\x92C\x99D\x99IYHYE\xd9L\xd9\ +C9B9C\xb9B\xb9I\xf9\x97RL\x05T#\ +\xaa\x0d\xb55\xd5\x85\xca\xa6\x86R{S\x07PS\xa8\ +2\xea\x18\xea4\xea|\xea*\xeaV\xea\x01j>\xf5\ +\x12\xf5&\xf5\x11\xb5\x9cF\xa7Y\xd2\x984\x17ZW\ +Z\x14\xad/\x8dG\x1bN\x1bC\x9bA[L[O\ +\xdbC;N\xbbD\xbbE+\xa2\xbd\xd23\xd1s\xd0\ +\xeb\xac\xc7\xd1\x8b\xd6\xeb\xa7\x97\xaa\x97\xa57Yo\xbe\ +\xdeZ\xbd\xddz'\xf4\xae\xe8\x15\xe8\x95\xd0\xe9t\x1b\ +\xba3\xdd\x97\x1eE\xefO\x1fF\x1fI\x9fA_J\ +\xdfF\xff\x99~\x81~\x87^\xcc`0l\x19\x9d\x19\ +\x01\x8c\xde\x0c.C\xc1\x98\xccX\xc4\xd8\xcc8\xcc\xb8\ +\xc8(`\x94\xe9\x1b\xe9\xb7\xd2\xf7\xd0\x8f\xd0\x1f\xa0/\ +\xd6\x9f\xa0?_\x7f\xa3\xfe!\xfd\x8b\xfa\xf7\xf4+\x0d\ +\xcc\x0c\xda\x19p\x0cz\x1b\xf0\x0dF\x18\xcc2Xc\ +p\xc0\xe0\xbcA\x81A\xa5\xa1\xb9\xa1\xb3a\x80a\x82\ +\xe10\xc3\xf1\x86\x0b\x0d\xb7\x1a\x9e0\xbca\xf8\xdc\xc8\ +\xc8\xc8\xc9\xc8\xcf\xa8\x8f\x91\xc0h\x9c\xd1B\xa3\x1f\x8c\ +N\x19\xdd2*7\xb60\xeed\x1cj<\xd08\xc3\ +x\xa6\xf1:\xe3\x9f\x8d\xff0~nbb\xd2\xde$\ +\xc8d\x80\x89\xc2d\xa6\xc9\x06\x93c&\x7f\x9b\x94\x99\ +Z\x9a\xba\x9aF\x9b\xf2M\xc7\x9a\xe6\x99\xee1\xbdh\ +Z\xd8\xcc\xa0Y\xbbf\xc1\xcd\x067\xcbi6\xbf\xd9\ +\xcef\xe7\x9b=230ko\x16j\xc65\x1bc\ +\x96g\xb6\xdf\xec\x9aY\xb1\xb9\xa59\xcb\xbc\xb7\xb9\xc8\ +|\x86\xf9F\xf3\xd3\xe6\xf7-\x18\x16\xed-\xc2-\xf8\ +\x16\x93,V[\x1c\xb3\xb8cI\xb5lc\x19j\xc9\ +\xb3\x9ch\xb9\xc6\xf2\x84e\x81\x15\xdd\xca\xd9*\xdaj\ +\x98\xd5t\xab-V\xe7\xac\x8a\xac-\xac\xbd\xac\x13\xad\ +\xb3\xad\xf3\xac\x7f\xb2\xbeiC\xb5io\x13m#\xb4\ +\x99e\xb3\xc3\xe6\xaaME\xf3\x96\xcd\x83\x9b\xe3\xcd\xbf\ +i\xbe\xb5\xf9\xc5\xe6\xa5-\xec[\x04\xb5\xc0[Lk\ +\xb1\xad\xc5\x95\x16\x15\xb6L\xdbp\xdbt\xdb9\xb6{\ +m\xff\xb2\xa3\xd9u\xb2\xebc\x97e\xb7\xcc\xee\x84\xdd\ +#{+\xfb\xae\xf6<\xfbi\xf6;\xec\xfft\xa08\ +tr\x88s\x18\xe9\xb0\xda\xe1\xacCqK\xc7\x96\x91\ +-\xa5-\x17\xb5<\xd6\xf2\x91\xa3\x8dc\x90\xe30\xc7\ +y\x8e\x87\x1c\x1f\xb4\xb2l\x15\xd8J\xd0j^\xab\xc3\ +\xad\x1e2\xad\x99\xc1L!s!\xf38\xb3\xa8\xb5C\ +\xeb\xa8\xd6\x19\xadW\xb6>\xd7\xba\xd2\xc9\xd9\xa9\xaf\xd3\ +\x04\xa7mN\x7f\xb51l\xc3n\x93\xd2f^\x9b\xa3\ +m\x8a\xda\xb6j\x1b\xd3vT\xdbMm\xfflg\xd0\ +\x8e\xdd.\xad\xdd\x82v\xf9\xedJ\xdb;\xb7Oj?\ +\xa5\xfd\xde\xf6\xf7\x9d[8G;\xe78or\xbe\xd1\ +\xc1\xa4C\xb7\x0e\xc3;\xac\xeap\xb9#\xbd#\xbbc\ +z\xc7\xa5\x1d\x7f\xebD\xe9\xe4\xdd)\xadS^\xa7\xf3\ +\x9d)\x9d}:\x0b:/\xed|\xa1\x8b^\x17\xbf.\ +\xe2.\xab\xba\x5cs1v\x09v\xc9t\xd9\xe4r\xcb\ +\xd5\xc6\xb5\xa7\xeb\x04\xd7\xbd\xae\x85nm\xdd\x06\xb8\xcd\ +q\xcbw{\xe5\xee\xed.t_\xe3~\x9de\xc1\xea\ +\xce\x9a\xc0:\xc0z\xe6\xd1\xc9\x83\xe7\x91\xe7q\xd9\xd3\ +\xc43\xc2s\xac\xe7>\xcf\xa7^\x9d\xbdp\xafe^\ +\xbf{[z\xc7xO\xf1>\xea\xfd\xd2\xc7\xd7G\xe6\ +\xb3\xd5\xe7\x81o[\xdf\xa1\xbeK|\xaf\xb1\xad\xd8\xb1\ +\xec\x19\xecS~z~!~c\xfd~\xf4+\xe7\xf8\ +p\x14\x9c\x1d\x9c']]\xba\xa6w\xdd\xd8\xf5\xbe\xbf\ +\xb3?\xee\xbf\xc6\xffN\x80S\x007`e\xc0\xcd@\ +f\xe0\xd0\xc0\x15\x817\xbb\xb5\xee\xc6\xed\xb6\xaa\xdb\xed\ +\xa06A\xfc\xa0\xb5A\xf7\x82;\x06\x0f\x0b\xde\x1c\x5c\ +\x18\xe2\x1e\x22\x0b\xd9\x1dR\x1a\xca\x09\x1d\x1d\xfas\x18\ +5,2lZ\xd8\xb9p\x8b\xf0\xbe\xe1\x8b\xc3\xff\x8e\ +p\x8aH\x8d\xd8\x14Q\x14\xe9\x1d92\xf2\xe7(\xbd\ +\xa8\x1eQs\xa2\xaeE\xb7\x8c\xe6Eo\x88.\xea\xee\ +\xdb}t\xf7\xe3=\x8c{\xc4\xf7X\xdc\xe3v\xcfN\ +=e=\x0f\xc4Pb\xba\xc7\xcc\x8d\xb9\xd1\xab]/\ +q\xaf\xbd\xbdA\xef\xe8\xdes{\xff\x15\xeb\x1c;<\ +\xf6`\x1fz\x9f\xd8>y}\xee\xc6\xb1\xe2F\xc5\xe5\ +\xc7[\xc6\x0f\x89\xdf\x18_\x92\x10\x920+\xe1z\xdf\ +\x0e}3\xfa\x1eMl\x9680qCbiRX\ +Rn\xd2\xcd~n\xfdF\xf7;\xd3\xdf\xae\xbf\xa0\xff\ +\xbe\x01\x8c\x01\x89\x03\xd6\x0e(\xfe*\xfc\xab\xef\xbe*\ +\x18\xe8=p\xf2\xc0\xab\x83\x9c\x07e\x0f:=\xd8n\ +\xb0p\xf0OC\x9a\x0d\xe1\x0e\xd99Toh\xd2\xd0\ +\x8dC\xab\xb8\xbd\xb9\xab\xb8\xc5\xc9\xd1\xc9K\x92\x8bx\ +\xa1\xbc\x05\xbc\x7f\xf9A\xfcy\xfc\x07x\x00\x9e\x8b\xdf\ +K\x09H\xc9M\xb9\x9f\x1a\x90:7\xf5AZ\xb7\xb4\ +\xf9i\x8f\x04\xa1\x82\xc5\x82\xa7\xc3\xa2\x86-\x1fV\x9a\ +\xde;}]\xbaR\x98$\xdc&\xd2\x17\x0d\x15\xed\x17\ +[\x88\xd3\xc5\xc7%\x8e\x92l\xc9\x05ig\xe9d\xe9\ +\xcd\xe1\x9c\xe1\xdf\x0d/\x92\xf5\x90\xad\x95c\xf2A\xf2\ +}\x0a+\xb8\x98:\x9b\xd1!\xe3\xeb\x8c[\x99\x81\x99\ +y\x99eY\x89Y;\xb3\xcd\xb3\xc5\xd9gGt\x1a\ +\xf1\xcd\x88{9\x119\xdf\x8f\xa4\x8d\xe4\x8d<:\xaa\ +\xf5\xa8\xf1\xa3n\x8d\x0e\x1e\xbdr\x0c6&y\xcc\xd1\ +\xb1m\xc6N\x1a[0.r\xdc\xfa\xf1\x86\xe3\xd3\xc7\ +\xff:\xc1}B\xee\x84\x17\x13\x93&\x1e\x98\xd4r\xd2\ +\xb8Iw\xbe\x8e\xfcz\xd3d\xd3\xc9\xb2\xc9\xd7\xa6t\ +\x9d\xb2|*m\xaa`\xea\xb9o<\xbfY\xf4\xcd\xab\ +i\xfci\xbfLw\x9f>\x7fz\xd5\x0c\xde\x8c_\xbe\ +e}\xbb\xf0[\xe5\xcc\x94\x99\xe7f\xf9\xccZ6\x9b\ +>[<\xfb\xea\x9cns\xd6\xe7\x9a\xe7\xe6\xe4\xde\x99\ +\x1b3w\xcf<\xe6\xbci\xf3^|7\xe4\xbb\xd3\xf3\ +\xbd\xe6/_`\xb8 c\xc1\xcd\x85=\x17\xee[\xd4\ +v\xd1\xecEU\x8b\xd3\x16_\xc9\x0b\xc9\xdb\xb6\xc4a\ +\xc97KJ\x97\xf2\x97^\x5c\x16\xb4l\xeb\xf2\x96\xcb\ +\xa7/\xafX!X\xf1\xfb\xca\xc8\x95{V\xb5_5\ +\x7f5}u\xe6\xea\xbbk\x12\xd7\xe4\x7f\xcf\xfe~\xc3\ +Z\xbb\xb5\xd3\xd7\xbe\x5c'^ws}\xdc\xfa\xe3\x1b\ +|7l\xd8\xe8\xb0q\xd6&\xca\xa6\x8cM\x0f6\x0f\ +\xdc\xfc\xdb\x96\xb0-\xfb\xb6\xbal]\xb9\xcdf\xdb\xf4\ +\x1f\xc0\x0f\x19?<\xdc>t\xfb\xd5\x1d=v\x1c\xdd\ +\xc9\xde\xb9uW\xbb]Kv[\xee\x9e\xb6\x07\xdb3\ +bO\xd1\xde\xb4\xbd7\xf7\xf5\xdfwa\x7f\xf7\xfdG\ +\x0ft=\xb0\xfb\xa0\xeb\xc1u?\xb6\xfe1\xef'\xeb\ +\x9ff\x1d2<4\xe9\x90\xf2p\xce\xe1\xe2\x9f\xa5?\ +?:\x92z\xe4\xce\xd1!G\xaf\x1f\xebw\xec\xf2\xf1\ +>\xc7\xcf\x9d\xe8q\xe2\xd4\xc9\x88\x93\xc7\xf2\x83\xf3\x0f\ +\x9f\x0a8\xf5\xe3i\xce\xe9\xfd\xbf\xb0\x7f\xd9{\xc6\xe7\ +\xcc\x9e\xb3\xdegw\xff\xea\xfd\xeb\xees>\xe7\xf6\x9c\ +\xf7=\xbf\xef7\xbf\xdf\x0e\x5c\xf0\xbfp\xe8b\xb7\x8b\ +G.\x85]:y9\xfa\xf2\x99+\xbd\xae\x5c\xb8\xda\ +\xf7\xea\xef\xd7\x06^\xbb\xf9;\xff\xf7\xfb\x7f\x08\xffx\ +\xfag\xe6\x9f\x95\xd7\xc7\xdd\xd0\xbb1\xed/\xb3\xbf\xe6\ +\xff\xed\xf0\xf7\xaa\x7f:\xfe\xb3\xed\xa6\xcf\xcd\x9fn\x85\ +\xdd:{;\xfe\xf6\xf5;\xbc;\xff\xfeO\xfe\xbf\xaa\ +\x82IwM\xee\xce\xbf\xd7\xea\xde\x86\xfb\x1e\xf7\x7f|\ +\x10\xf1\xe0\xb7\x87_=,\xf8W\xfao\xe5\xa3\xc9\x8f\ +\xcd\x1f/)\xecP\xb8\xebI\xd0\x93\xb3E\xfd\x8a\x0a\ +\x9e\xca\x9e*\x9f\xcdxn\xfb|\xdd\x0b\xaf\x17G\x8b\ +c\x8b\xff.\x11\x95T\x96N+\xb3-[_\xce.\ +\xcf\xafH\xaa\xb8W\x99U\xc5\xa8Z\xf8\xb2\xe3\xcb\x03\ +\xafz\xbc\xba\xa1\x14U\xdf\x8f&A\x82\x04\x09\x12$\ +H\x90 A\x82\x04\x09\x12$H\x90 A\x82\x04\x09\ +\x12$H\x90 A\x82\x84\x1a\xb1\xb1\xb1\xfc\x9c\x9c\x9c\ +\x85zzz\xf4\xf7\x97&\xa1K\xb8\xba\xba\xfa\xe5\xe7\ +\xe7\x97\x9f={V\xb9l\xd9\xb2\x13VVV\xb6M\ +\xad\xd3\xff\x17\xd8\xdb\xdb;\x1d>|\xf8\x09\xf2\xbd&\ +\xec\xdd\xbb\xb7\x00\xb5IS\xeb\xf6_\x07\x1ak\x0e\x1e\ +<\xf8P\xdb\xf7\x9ap\xf2\xe4\xc9\xb2\xb8\xb8\xb8\x94\xa6\ +\xd6\xf1\xbf\x8cE\x8b\x16\x1d\xae\xcb\xf7\xda\x01\xce\x09\x8b\ +\xe8t:\xa3\xb1\xb2\xac\xad\xad\xed\xc2\xc2\xc2\xfa\x0a\x85\ +\xc2)s\xe7\xce\xdd\xb7q\xe3\xc6+\xfb\xf6\xed\xbb\x0b\ +\xdb\xb9\x14\x05\x14\xdf\xb4i\xd3\xd5y\xf3\xe6\xed\x17\x89\ +DS\xc3\xc3\xc3\x13Q\x1d]\xd8\xf99\x22))I\ +\xf4>\xdfk\x02\x9a\x13>\xc4\x17666\xf6C\x86\ +\x0c\xc9Z\xbe|y\xfe\x993g^\xd5W\x9e&\xa0\ +:+W\xae<=t\xe8\xd0\xec\xe6\xcd\x9b\xb7\xfc\x18\ +~h*\x8c\x1c9rqC|\xa1\x9e\x138\xf5\xe1\ +\xed\xe2\xe2\xc2\x9e\x16X,V\xc0\x81\x03\x07\xee7\xc4\xfe\xd7\xe7\ +\x044\x8f\xa31\xe2\xd8\xb1c/>\xb6\xef5\xe1\xf8\ +\xf1\xe3\xc5\xc9\xc9\xc99\xba\x98\x9b\x9a\x1a\xa8\xdf\xa2q\ +\xb6!\xf6k\xe6\x046\x9b\x1d\xb1u\xeb\xd6?>\x95\ +\xdf_\x0f\xdb\xb6m\xbb\xce\xe1p\xa2\x9a\xda\x87\x8d\x05\ +\xecG\xfac\xc6\x8cY\xd6\x10\xdb\x8f\x1e=\xfa\xbc\xa9\ +\xfc\xfez@k&\x0aDS\xfb\xb1\xb1h\xe8\x9c\xf0\ +9\x85\xdc\xdc\xdc\xbd&&&fM\xed\xc3\xc6\xe2C\ +\xe6\x84\xcf%\xa0\xf1\xc8\xc9\xc9\xa9sS\xfb\xb0\xb1\xf8\ +\x909\xe1s\x09h\x5c\xf4\xf5\xf5\x0doj\x1f6\x16\ +\xea9aiS\xfb\xf3C\x02\xba\xa6\xfe/\xb4\x01B\ +ff\xe6\x5c]\xf9\x05]\xc7)\x14\x8a9h\xcd\x02\ +\xc7\x89N\x86\x86\x86&0\x18;::\xb6\xdf\xb3g\ +\xcf\x1d]\xb7\x01Z\x9f5\xb5\xff\x1a\x03??\xbfH\ +dGc}\xb1s\xe7\xce\x9b!!!\xf1\xefZ\xa3\ +\xa0\xb1\xfbc\x9c\x07\xc8\x86O\xe93]\xa1S\xa7N\ +\xde\xe8:\xa7\xb1>@\xcfu\x18\x0c\x86\xc1\xfb\xe4}\ +\x0c\xff\xa3\x80l\x80\xb6x}\x0a\x9f\xe9\x0a\xe8\xfa~\ +\xff\xfe\xfd\xf7ta?\xba\xb7Y\x9f\xfb6\x1f\xcb\xff\ +( [\xbe\x94{xFFF\xa6\x1b6l\xb8\xa4\ +K\xfb\xd1\xf3\xb5\xb8\xb8\xb8\xd4w\xc9\xfd\x98\xfeGa\ +\xdd\xbau\x17\xd0|\xf3\xa9\xfc\xf8!@\xdfk\x9a=\ +{\xf6\xae\x8f\xe5\x03t\xdf\xf5m\xf7l>\xb6\xffQ\ +\x989s\xe6v\xadoR}v\xe0\xf1x\xa3>\xb6\ +\x0f\x96-[v\x12=\x1bx]\xf6\xa7\xf0?\x0a\xe8\ +\x99DS\xf8\xf6}pww\xf7\xff\xe5\x97_\xaa>\ +\x85\x0f\xd0\x9c\xe0\xe6\xe6\xd6U[\xfe\xa7\xf2?z\x96\ +\xd0\xa5K\x17\xdf\xa6\xf2s]@c>Z#6\xd6\ +\xb6\x86<\xe7BsB|||\xf5\x17\x7f>\x95\xff\ +Q\xd8\xbau\xeb\x9f\xfa\xfa\xfa\x86M\xe9sm\x0c\x1f\ +>\xfc[]\xd85q\xe2\xc45\x0d]7\x8d\x1a5\ +*\x0f\xcd\x09\x9f\xd2\xff(\xa4\xa6\xa6\x8eoj\xbf#\ +\xa0{\x86\xba\xba\x97\xec\xe9\xe9\x19\x84\xc6\xf6\x15+V\ +\x9cjH=\xf4\x8cx\xc7\x8e\x1d\xff|J\xff\x1f:\ +t\xa8\x10]{7\xb5\xff\x07\x0f\x1e\x9c\xa9\x0b{N\ +\x9c8QB\xa3\xd1\x88\x0f\x96\xa3\xfe\xd7\x86\xaelY\ +\xbat\xe9\xf1\xba\xf8\xa3u\xce\x87\xce\x09o\xd3y\xe1\ +\xc2\x85\x87t\xa1\xf3\xe6\xcd\x9b\xaf}<\xcf\xd6\x0fh\ +\xdc\xd0\x85-\xb3f\xcd\xda\xf96\x19\x1f:'\xd4u\ +\x9d\x800c\xc6\x8cm\xba\xd0\x19\xd9\xfe\xf1<[?\ +\xe8j\xdeC\xd7U\xef\x92\x83\xfa3\xea\xd7\x0d\xe1Y\ +\xd7u\x02B^^\xdeQ]\xe8\x0cm\xff\xfb\xe3y\ +\xb6~\x98?\x7f\xfeA]\xd8\xb2}\xfb\xf6\xbf\xea#\ +\x0f\xad\xf95\xef[\xd7'\xa09\x01\xcd#\xda\x058\x1cN\xb4.\xae\x0b\xb2\xb2\xb2\xbe\xfb\x90\xf7\ +\x0e\xd039\xf4\xeePc\xe5#\x1b\xbe\xd4=\x02\xdd\ +\xbbw\x1f\xa8\x8b6@\xeb\x9a\x9e={\x0e\xd1<\x1f\ +x\x17\xd0\xfa5&&f\xa8.\xde\xc1\x86\xba\xbfD\ +6|\x0a_},DFF\xf6\xd7\xd5\xf51z\xe6\ +\x84\xae{\xd0\xfeR\xb4O\x0f\xbdg\x8d\x02\x8a#\x1a\ +Z\x7f\xbd\xbe\x1f\xbc\xb1}\xbf\xb1\xf3\xd0\xe7\x80\xd0\xd0\ +\xd0\x84\xa6x>\xa5\xab\x80\xde\xe3\xfe\xdc\xd7=\xefC\ +PPP\xac.\xde\xc5m\xaa\x80\xf63|)\xeb\x9f\ +\xb7\xa1c\xc7\x8e\x9e\xe8\xfa\xaa\xa9}\xf9\xa1\x01\xcd)\ +\xe8=\xa7\xa6\xf6cc`fff\xb5`\xc1\x82\x9f\ +\x9a\xda\x97\x1f\x1a\xd0\xf3\x84/}N\xa0P(Tt\ +\xaf\xb3\xa9}\xa9\x09h\xbf}C\xaf\x19\xff\x0bs\x02\ +\xbaF\xf8\xd4\xefMi\x07\xf4\xce\x85\xbf\xbf\x7f\x0f\xa4\ +\x0b\xba\x97\x8f\xf6%7\xa4\xbezNphj?6\ +\x06M\xb1\xff\x1d\xc9\xaak\xff;J\xa3\xfd\xf9\x0d\xe1\ +\x85\xe6\x04\xb4\xe7\xb3\xa9\xfc\xa7+\xa0\xb5\xc5\xd7_\x7f\ +\xbd\xf6S\x8c5\xef\xeb\xb3\xe8;\x15\xe8{\x15\xf5\xe5\ +\x89\xe6\x04\xb4\xf7\xf9S\xf9\xeac\x02\xad\x91\xc6\x8f\x1f\ +\xbf\xb2!\xf6\xbf/\xa0\xfbp\x13&LX\xd5\x90}\ +D\xe8\xdeQC\xe7\x84\xcf\xf9\xdetCannn\ +\x8d\xbe3\x84\xd6J\x1fr\xed\x86\xea\xa0\xf7\xac\xfa\xf5\ +\xeb'\xb6\xb0\xb0\xb0\xf9\x10\x1d\x1a:' Y\xba\xf6\ +\xc3\xe7\x00SSSs4W\xa31\x1b}\xa3\x06=\ +w\xdf\xb2e\xcb\xefh\xec\x85\xe1\x01\x8a\xa3g\xeb\xdf\ +|\xf3\xcd&T\xa6k\xd7\xae\xddQ\x1d]\xc8F\xf3\ +S}\xee\xe3}N\xcf\x83\xff\x8b\xe8\xd3\xa7\x0f\xfe\xb6\ +1\x11\xb5\xfd\x97\xbe\x16\xfd\x12\x80\xbe\xeb\xf8\xfa\x9c\x80\ +\xdeM\xfd\xd2\xd7\xa0_\x12\xd0\xf7M5s\x02\x9a\xd7\ +\xffK\xdf4\xfbR\xa0\x99\x13\xd0w\x7f\x9bZ\x17\x12\ +$H\x90 A\x82\x04\x09\x12$H\x90 A\x82\x04\ +\x09\x12$H\x90 A\x82\x04\x09\x12$H\x90\xa8\x06\ +u\x05\x06\xa8\xf0\x1f\x83?\xb0\x82\x02hD\x1c\x80\xa1\ ++\xa85qU\xd1`\xbe$\x19g\xc6\xa6I\x14\x12\ +y\x9aD\xca\x0c\x93\xf02D\xb8X\xc1\x0c\xe3*\xb8\ +\xcc\x10\xa1\x84\x97\x0e\xd8!\xd111\x092\xe2=$\ +\x14\xef\xc9\x1d!\x03\xc0\xc0\x8f\xe0c\x01\x03\xdaI\x17\ +\x03C\x02\xa0)\x95\x00\xd0J\x09\xd6\x85D~!@\ +\xdf7/D\xf5\xc4\x12\x99H\x09\xf4\x91\x02\x9a\xf7\xed\ +;\x00\x80j\xbc?0\xe2\xd3\xb8R\x9c\xc9B|\x84\ +\x19b\xf4\xed\x19+\x18\x18 \x1e\xa4\x01.\x90\x02\x1c\ +0\x01K\xa5\x9fP,G{,irX\x85H\x8f\ +\x10\xa0g\xba\xc8r[\x94\xe6\x09\x93\x85(\x8d\xa9\xed\ +\x11\x88S\xb2\xd5\xf9D:]\x9c.\xd1N\x0b\xe5\xd2\ +\x94Zi\x9e\x10\xf1\xd7\xd7\xb8\x1b\xd1\xe4i\x22$\x03\ +\xed\xe9\xc3\x08\x19\x19r\x85:\x1b\xbd\x9fg\xa6\xf6:\ +\xac%\xc2\x15\x5c>t\xae\x9ab \xe4\x8e\xc0e\x09\ +\x02\x11\xce\x97d$\x07_m\x17Y\x94\xc4\xdaK\xf0\ +L\xc9\x96I\xd5uk\x03\x83\xb2\x0d\x8110\x02\xf6\ +\xa09\xb0\x86\xbf\xe6\xc0\x12\x963V\xffl\xe0\xcfZ\ +\xfd\xb3\x84\xa1\x05Q\xc2\x068T\xff\xec\x81\x1dA\xb1\ +\x84^D\xa5P\x8d\x16\xc0\xb6\x9a\x839\xa4\xb7Ps\ +\xb6\x87r\x8c\xa1<\xfd\x97\x80\xc2_H?\x02^\x01\ +\x9a_\xb9\xf2\x84\xedQ\xa0\x04\x98\xd3\x93WJ\xac\xc0\ +\xef\x18lf\xfa\xc3*%V\x96r\x1c\xeaw\xb8\x5c\ +\x89-b<\x05&v}\xa7\xec\xbbr\xb7\xb4\xf4\xee\ +\xd5\xfdS\x13\xed\xfe\x07\x80\xa8T\x89\x9d\xb0+\x06T\ +\xfb\xac\xfcW\xc5J\xea\xab\xd3\xd9-\xef\x01\xb0\xb8\x04\ +r\xe1\x94\x01\x0a{}\xe5\x13%\xa5r#\xe7\x01\xe4\ +\x98^Q\x8a8V\x02\xcca\xe3\x03%\xb6\xd9\xf1_\ +$2\xe0~\x89\x92\xbe\x88\x01\x00=\xfb\xc5=%\xa5\ +8\x87\xf1\x18\xea\x849\x9c.QRO\xd8E\xfcq\ +G\x89]\x8f*\x04/\x01\xa6\xbf\xacD\x09\x9e\xff\xa3\ +\xc4\xa6R\x8a\x00\xe4\x92^qY\x89\xed5{\x0a*\ +\x10\x17\x18\xbf\xde\xf9\x19(GUa\xfcy\xf8sP\ +\x06\xeb,\x85\xf1\xd2\xf0\x17\xa0\x04\x80\xb9O\x94\x8c\x82\ +9Q\x9dL\x8c\xdb\xdf)\x84\xd4\x88bP\x0a\xb0\xc8\ +\xd2\xa7J\xca\xcdxJ%\x00\xd7\x1fCjd\x09\xaa\ +\xe7]\xfcT\x89-4(\x87\xc4GJ\xac\xd8\xab\x14\ +1v\xbcW\xa4\xc4\xeer\x10\xf1_%v\xafe\x19\ +\x92lz\x09\xf2*O\xad\x80\xc4\x87J\xec\x82I9\ +R\x0d\xdb\x05\x0b,fTA\x22\xb4t;V\x01\x89\ +`\x14\x8c\x9e\xb4\x7f\x09i\xf7\x95 \xab\x02T\xc13\ +\xa7\xea>\xe4\xd8\xf5\x15A\xc3*}+\x91\x9d\xa67\ +\x9f*\xc1\xabR%\xad<\x0d\xd2\xef)\xb1?\x0d\xab\ + \x1d|\x0b\xa5\xaf\xb9W\xa2\xa4\xe41\xae\xdfU\x82\ +\xf1U\xc8Of\xcf\x8b\x94\x94 \xfbS\xd0\xe3\xf9\xff\ +\xdcUb\x85\xc6/!\x19d\x16)i%z\x80\xb1\ +\x04\xba\xac\xb2@\x09\x86\x13\xd4\xddEJp\x03J\x10\ +\xa0\x96\xa8\x18[\xee\x0c\xfe\x80\x94\x1dD\x1e\x8a\x1d\x87\ +*u\x85\x12\xb0<\x06\xd4\xf7\x10\xa4\x5c#\xf2J`\ +l'4K%\xc6\x1e\x9a\xb5\x0dRJ\x88\xbc\x7f`\ +\xec$\xf4\x03#\xaf\x04\x99\x02\xf5<\x0a)\x7f\x13y\ +\x07a\xec/\xe8\xcd\xb4r$O\xa0\x96\xb2\x9f\xc8\x9b\ +\x0a\xad)\xa5\xc3\xcc\xaewaK/a\xe8\x15\xc3\xac\ +I(\x0bkU\x05\xa3!\xb0m\xec\xf3!\xcfS\xf1\ +\xb0d\xb9\xddK\xe4\x82\x0d0cz\x89J\x18x\x01\ +\x13\xcb\x90g0\xa7g\xb0\xb5n\xd3\x8b\x91$\xe8\xaf\ +'PC\xa8\xe3`\x98\x9f\xf6\x02\x09\x80\xfeN\xaaD\ +M\xb0\x1c\x96\xbbe\x04i\xf6'\x1f*\xc1b\xd4,\ +\x98\xc19\xe8\xee5\xcf!\xd3\xc5\xb0\xa9\xcf2*P\ +\xab\xb6,\x80\xc4a\xcf\x00\x96Z\xfeD\x89\xfd\xcf\xbe\ +\x1c\xb5\xbf\xfb\xf3gJ\xec\x95\x0cR9O!\xa3g\ +ne\xa8\xabDW\xc1\xf8w&P\xb8\xe9B\x18\xab\ +\x8a*E\xddj \xa4R\xee\x0e\xd1+\x07\x14\xfa\xd0\ +\xfb\x90\xfer`\x09\xec\x84X\x7fh\x9bA\xe1\xb2D\ +\xb6\x83\x03;q\xf9\x13\xc8\xbcjX\x09\x80\x95\x13*\ +/)\xb1\xa5\x8c2\x00\xb5\x8b-\x85\xf1\xd3P(\xd4\ +\xca\xf3\x16\x8c\xdf\xf7\xaf\x00P\xac\xd5O0^1\xac\ +\x12<\x05\x18u:<\x13\xd6\x17\x94\xa0J/\xc1\x13\ +\xa8\xc7\xf5;J\xda\x8d\x1e\xc0\xee\x04\xa4\x9dvx\x85\ +\x06k\xd59\xf5\x22\x87\x01\xbd\xcaX\x04\xfd|?\x00\ +\x80G\xd0\xfc\xb5\xb0/\xaew\x80\x86\xa6\x94\x95*)\ +\x15\xe9\xe0!\xa0x\xae,\x83'k\xf9*\xd8\xd91\ +\x0ed\x0c\x16\xdf\x07Tk\xd1O\x95\xf0\xc4\xae<$\ +\xb6\x81\x8a\xd9\x9d(U\x02q\x0101\x8f\xce\xd9\x98\ +\xff\xfb\xfd\x07\xbf\x9f\xda\x94\xd3\xdd\xbc\x08`\xf4\x85p\ +\x90X\x06\xe0p\x81\x97U))\xa7\x18\xe0\x18\xc0\xfc\ +\x0a^)\xa9\xf7\x1c`\x97\x004\xdb\x13\xcar\xce+\ +p\x04*\xb5\x90\xff\x12\x0d{\x94\xa6\xf8\x1d8\xdb\x14\ +?\xd2\xda\xff\xb0\xb5\xeauT\x8c\x1c\xedo0U\xad\ +q\x08x\x8cS\xe7\xc5r\x15\x0a\xcd\xda\x22BU\xce\ +X\xbb\x1c:\xfc\x1f\x02\xea)+\ +\x00\x00\x80\x08\ +I\ +I*\x00\x08\x00\x00\x00\x18\x00\xfe\x00\x04\x00\x01\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ +\x00\x04\x00\x00\x00.\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ +\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00\x11\x01\x04\x00\x01\x00\x00\x00NS\x00\x00\x12\x01\x03\ +\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ +\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x17\x01\x04\x00\x01\x00\x00\x000\x12\x00\x00\x1a\x01\x05\ +\x00\x01\x00\x00\x006\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ +\x00>\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ +\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ +\x00\x22\x00\x00\x00F\x01\x00\x002\x01\x02\x00\x14\x00\x00\ +\x00h\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ +\x00\x1f8\x00\x00|\x01\x00\x00I\x86\x01\x00j\x0d\x00\ +\x00\x9c9\x00\x00i\x87\x04\x00\x01\x00\x00\x00\x80e\x00\ +\x00s\x87\x07\x00H\x0c\x00\x00\x06G\x00\x00\x5c\x93\x07\ +\x00X\x1a\x00\x00\xace\x00\x00\x00\x00\x00\x00\x08\x00\x08\ +\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\x00\x00\xf9\x15\ +\x00\x10'\x00\x00Adobe Photo\ +shop CC 2017 (Wi\ +ndows)\x002017:04:0\ +4 11:01:25\x00\ +\x0a\x0a \ + \x0a \x0a \ + paint.net \ +4.0.9\x0a \ + 2017-03-01T11:2\ +0:20-08:00\x0a \ + 2017-04-04T\ +11:01:25-07:00\x0a\ + 2017-\ +04-04T11:01:25-0\ +7:00\x0a \ + imag\ +e/tiff\x0a 3\x0a \ + sRGB IEC\ +61966-2.1\ +\x0a xmp.\ +iid:7284f562-66e\ +c-6d4b-bfaf-a292\ +c87d086e\x0a \ + adobe:doc\ +id:photoshop:aca\ +ee4ff-1960-11e7-\ +bae7-e6e7a5cd281\ +4\x0a xmp.did:\ +15df0628-f397-b6\ +41-8e6b-37248a21\ +c43f\x0a\ + \x0a \ + \x0a \ + \x0a\ + \ + \ +created\x0a \ + xmp.i\ +id:15df0628-f397\ +-b641-8e6b-37248\ +a21c43f\x0a \ + 2017-03\ +-01T11:20:20-08:\ +00\x0a\ + \ + Adobe Pho\ +toshop CC 2017 (\ +Windows)\x0a \ + \x0a \ + \x0a \ + saved\x0a \ + \ +xmp.iid:7284f5\ +62-66ec-6d4b-bfa\ +f-a292c87d086e\x0a \ + \ +2017-04-04T11:01\ +:25-07:00\x0a \ + Ad\ +obe Photoshop CC\ + 2017 (Windows)<\ +/stEvt:softwareA\ +gent>\x0a \ + /\x0a \ + \x0a \x0a \ + \x0a \x0a <\ +/rdf:RDF>\x0a\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \x0a\x008BIM\x04\ +%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x008BIM\x04:\x00\x00\x00\ +\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x0bprintOutput\x00\x00\x00\x05\ +\x00\x00\x00\x00PstSbool\x01\x00\x00\x00\ +\x00Inteenum\x00\x00\x00\x00Int\ +e\x00\x00\x00\x00Clrm\x00\x00\x00\x0fpri\ +ntSixteenBitbool\ +\x00\x00\x00\x00\x0bprinterName\ +TEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0fpr\ +intProofSetupObj\ +c\x00\x00\x00\x0c\x00P\x00r\x00o\x00o\x00f\x00\ + \x00S\x00e\x00t\x00u\x00p\x00\x00\x00\x00\x00\ +\x0aproofSetup\x00\x00\x00\x01\x00\ +\x00\x00\x00Bltnenum\x00\x00\x00\x0cb\ +uiltinProof\x00\x00\x00\x09p\ +roofCMYK\x008BIM\x04;\x00\ +\x00\x00\x00\x02-\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x12printOutputOp\ +tions\x00\x00\x00\x17\x00\x00\x00\x00Cpt\ +nbool\x00\x00\x00\x00\x00Clbrbo\ +ol\x00\x00\x00\x00\x00RgsMbool\x00\ +\x00\x00\x00\x00CrnCbool\x00\x00\x00\x00\ +\x00CntCbool\x00\x00\x00\x00\x00Lb\ +lsbool\x00\x00\x00\x00\x00Ngtvb\ +ool\x00\x00\x00\x00\x00EmlDbool\ +\x00\x00\x00\x00\x00Intrbool\x00\x00\x00\ +\x00\x00BckgObjc\x00\x00\x00\x01\x00\x00\ +\x00\x00\x00\x00RGBC\x00\x00\x00\x03\x00\x00\x00\x00\ +Rd doub@o\xe0\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00Grn doub@o\xe0\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00Bl doub\ +@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00BrdT\ +UntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00Bld UntF#Rlt\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Rslt\ +UntF#Pxl@b\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x0avectorDatabo\ +ol\x01\x00\x00\x00\x00PgPsenum\x00\ +\x00\x00\x00PgPs\x00\x00\x00\x00PgPC\x00\ +\x00\x00\x00LeftUntF#Rlt\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Top U\ +ntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00Scl UntF#Prc@\ +Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10cropW\ +henPrintingbool\x00\ +\x00\x00\x00\x0ecropRectBott\ +omlong\x00\x00\x00\x00\x00\x00\x00\x0ccr\ +opRectLeftlong\x00\x00\ +\x00\x00\x00\x00\x00\x0dcropRectRi\ +ghtlong\x00\x00\x00\x00\x00\x00\x00\x0bc\ +ropRectToplong\x00\x00\ +\x00\x00\x008BIM\x03\xed\x00\x00\x00\x00\x00\x10\x00\ +\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\x00\x00\x01\x00\x018\ +BIM\x04&\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00?\x80\x00\x008BIM\x03\xee\x00\ +\x00\x00\x00\x00\x0d\x0cTransparen\ +cy\x008BIM\x04\x15\x00\x00\x00\x00\x00\x1e\x00\ +\x00\x00\x0d\x00T\x00r\x00a\x00n\x00s\x00p\x00\ +a\x00r\x00e\x00n\x00c\x00y\x00\x008BI\ +M\x045\x00\x00\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\xff\ +\xff\x00\x00\x00\x00\x00\x00\x00d\x01\x008BIM\x04\ +\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ +\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\ +\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\ +\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +\x008BIM'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\ +\x00\x00\x00\x00\x00\x00\x018BIM\x03\xf5\x00\x00\x00\ +\x00\x00H\x00/ff\x00\x01\x00lff\x00\x06\x00\ +\x00\x00\x00\x00\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\ +\x06\x00\x00\x00\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\ +\x00\x00\x06\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00\ +-\x00\x00\x00\x06\x00\x00\x00\x00\x00\x018BIM\x03\ +\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ +\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ +\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\x03\xe8\x00\x008BIM\x04\x00\x00\x00\x00\ +\x00\x00\x02\x00\x008BIM\x04\x02\x00\x00\x00\x00\x00\ +\x02\x00\x008BIM\x040\x00\x00\x00\x00\x00\x01\x01\ +\x008BIM\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\ +\x00\x00\x038BIM\x04\x08\x00\x00\x00\x00\x00$\x00\ +\x00\x00\x01\x00\x00\x02@\x00\x00\x02@\x00\x00\x00\x04\x00\ +\x00\x01+\x00\x00\x00\x0a\xc5\x00\x00\x00\x01\x1b\x01\x00\x00\ +\x0a\xd5\x018BIM\x04\x1e\x00\x00\x00\x00\x00\x04\x00\ +\x00\x00\x008BIM\x04\x1a\x00\x00\x00\x00\x035\x00\ +\x00\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\ +\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00nu\ +ll\x00\x00\x00\x02\x00\x00\x00\x06bounds\ +Objc\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rc\ +t1\x00\x00\x00\x04\x00\x00\x00\x00Top lo\ +ng\x00\x00\x00\x00\x00\x00\x00\x00Leftlo\ +ng\x00\x00\x00\x00\x00\x00\x00\x00Btomlo\ +ng\x00\x00\x00`\x00\x00\x00\x00Rghtlo\ +ng\x00\x00\x00`\x00\x00\x00\x06slices\ +VlLs\x00\x00\x00\x01Objc\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x05slice\x00\x00\x00\x12\x00\ +\x00\x00\x07sliceIDlong\x00\x00\ +\x00\x00\x00\x00\x00\x07groupIDlon\ +g\x00\x00\x00\x00\x00\x00\x00\x06origine\ +num\x00\x00\x00\x0cESliceOri\ +gin\x00\x00\x00\x0dautoGener\ +ated\x00\x00\x00\x00Typeenum\ +\x00\x00\x00\x0aESliceType\x00\x00\ +\x00\x00Img \x00\x00\x00\x06bounds\ +Objc\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rc\ +t1\x00\x00\x00\x04\x00\x00\x00\x00Top lo\ +ng\x00\x00\x00\x00\x00\x00\x00\x00Leftlo\ +ng\x00\x00\x00\x00\x00\x00\x00\x00Btomlo\ +ng\x00\x00\x00`\x00\x00\x00\x00Rghtlo\ +ng\x00\x00\x00`\x00\x00\x00\x03urlTEX\ +T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00nullT\ +EXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Msg\ +eTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x06a\ +ltTagTEXT\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x0ecellTextIsHTM\ +Lbool\x01\x00\x00\x00\x08cellTe\ +xtTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x09\ +horzAlignenum\x00\x00\x00\ +\x0fESliceHorzAlign\ +\x00\x00\x00\x07default\x00\x00\x00\x09v\ +ertAlignenum\x00\x00\x00\x0f\ +ESliceVertAlign\x00\ +\x00\x00\x07default\x00\x00\x00\x0bbg\ +ColorTypeenum\x00\x00\x00\ +\x11ESliceBGColorTy\ +pe\x00\x00\x00\x00None\x00\x00\x00\x09to\ +pOutsetlong\x00\x00\x00\x00\x00\ +\x00\x00\x0aleftOutsetlon\ +g\x00\x00\x00\x00\x00\x00\x00\x0cbottomO\ +utsetlong\x00\x00\x00\x00\x00\x00\x00\ +\x0brightOutsetlong\ +\x00\x00\x00\x00\x008BIM\x04(\x00\x00\x00\x00\x00\ +\x0c\x00\x00\x00\x02?\xf0\x00\x00\x00\x00\x00\x008BI\ +M\x04\x14\x00\x00\x00\x00\x00\x04\x00\x00\x00\x048BI\ +M\x04\x0c\x00\x00\x00\x00\x04\x02\x00\x00\x00\x01\x00\x00\x00\ +0\x00\x00\x000\x00\x00\x00\x90\x00\x00\x1b\x00\x00\x00\x03\ +\xe6\x00\x18\x00\x01\xff\xd8\xff\xed\x00\x0cAdobe\ +_CM\x00\x01\xff\xee\x00\x0eAdobe\x00d\ +\x80\x00\x00\x00\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\x09\x08\ +\x0c\x09\x09\x0c\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\ +\x13\x13\x15\x13\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\ +\x0d\x10\x0e\x0e\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\ +\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\ +\x000\x000\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xdd\ +\x00\x04\x00\x03\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\ +\x01\x01\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\ +\x07\x08\x09\x0a\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\ +\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\ +\x0a\x0b\x10\x00\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\ +\x03\x0c3\x01\x00\x02\x11\x03\x04!\x121\x05AQa\ +\x13\x22q\x812\x06\x14\x91\xa1\xb1B#$\x15R\xc1\ +b34r\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs\ +5\x16\xa2\xb2\x83&D\x93TdE\xc2\xa3t6\x17\ +\xd2U\xe2e\xf2\xb3\x84\xc3\xd3u\xe3\xf3F'\x94\xa4\ +\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\ +\x86\x96\xa6\xb6\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\ +\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\ +\x06\x07\x07\x06\x055\x01\x00\x02\x11\x03!1\x12\x04A\ +Qaq\x22\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\ +\xd1\xf03$b\xe1r\x82\x92CS\x15cs4\xf1\ +%\x06\x16\xa2\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17\ +dEU6te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\ +\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5V\ +fv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6'7GWgw\ +\x87\x97\xa7\xb7\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\ +\x00?\x00\xf4<\xdc\xcc\x96d\x9a\xa9;@\x80\x00\x00\ +\x92O\xc6P\xfd~\xab\xe0\xff\x00\xfbl\x7f\xe4R\xc9\ +\xff\x00\x95\x1b\xfdz\xff\x00\xef\xabR\xcb\x19[\x0b\xec\ +!\xad\x1c\x92\x92\x9c\xbf_\xaa\xf8?\xfe\xdb\x1f\xf9\x14\ +\xbd~\xab\xe0\xff\x00\xfbl\x7f\xe4T\xed\xea\xee\x9f\xd0\ +\xb0\x06\xfe\xf3\xff\x00\xf2#\xff\x00$\x95]]\xd3\xfa\ +f\x02\xd3\xf9\xcc\xff\x00\xc8\x9f\xfc\x92Ja\xeb\xf5_\ +\x07\xff\x00\x98?\xf2(\x98\x19\x99\x16dzV\x9d\xc0\ +\x83\xc8\x00\x82?\xaa\xb4+\xb1\x960>\xb2\x1c\xd3\xc1\ +\x0b+\x07\xfeP?\xf5\xcf\xca\x92\x9f\xff\xd0\xef\xf2\x7f\ +\xe5F\xff\x00^\xbf\xfb\xea\x16fS\xb2-\xff\x00\x83\ +i\x867\xfe\xff\x00\xfd\xa4\x5c\x9f\xf9Q\xbf\xd7\xaf\xfe\ +\xfa\x87\x9b\x8a\xec{\x09\x03\xf4O>\xc3\xe0O\xe6\x1f\ +\xfb\xeaJnt\xecJ\x85-\xb9\xed\x0e{\xf5\x13\xac\ +\x0e\xd0\xa9dc\xde-\xb5\xfe\x9b\x85a\xce;\xbbD\ +\xf2\xad\xe0f\xd4\xda\x856\xb81\xcc\xd1\xa4\xe8\x08\xf8\ +\xa5\x9f\x9bS\xaa4\xd4\xe0\xf7?G\x11\xa8\x03\xe2\x92\ +\x9a\x98y.\xc7\xb4\x7f\xa3y\x01\xe3\xfe\xff\x00\xfd\x94\ +L\x1d:\x8b\x87\x9d\x9f\x95C\x0b\x15\xd9\x16\x87\x11\xfa\ +&\x19q\xf1#\xf3\x07\xfd\xf9O\x07^\xa2\xe3\xe7g\ +\xe5IO\xff\xd1\xef\xf2\x7f\xe5F\xff\x00^\xbf\xfb\xea\ +\xd4{\x1a\xf6\x96<\x074\xe8A\xe1g\xe6\xe1d\xbf\ +$\xdbP\x90b\x0c\xc1\x04!\xfd\x9b\xaa~\xf3\xff\x00\ +\xed\xcf\xfc\xc9%&\xb7\xa4\xb4\x99\xa6\xc2\xd1\xfb\xae\x1b\ +\x87\xdf\xf4\x92\xab\xa4\xb4\x19\xba\xc2\xe1\xfb\xad\x1bG\xdf\ +\xf4\x90~\xcd\xd5?y\xff\x00\xf6\xe7\xfed\x97\xd9\xba\ +\xa7\xef?\xfe\xdc\xff\x00\xcc\x92S\xa8\xc65\x8d\x0c`\ +\x0dh\xd0\x01\xc2\xca\xc1\xff\x00\x94\x0f\xc6\xcf\xca\x9f\xec\ +\xddS\xf7\x9f\xff\x00n\x7f\xe6H\xb88Y\x15\xdf\xea\ +\xda\x03@\x04s$\x92\x92\x9f\xff\xd98BIM\x04\ +!\x00\x00\x00\x00\x00]\x00\x00\x00\x01\x01\x00\x00\x00\x0f\ +\x00A\x00d\x00o\x00b\x00e\x00 \x00P\x00h\ +\x00o\x00t\x00o\x00s\x00h\x00o\x00p\x00\x00\ +\x00\x17\x00A\x00d\x00o\x00b\x00e\x00 \x00P\ +\x00h\x00o\x00t\x00o\x00s\x00h\x00o\x00p\ +\x00 \x00C\x00C\x00 \x002\x000\x001\x007\ +\x00\x00\x00\x01\x00\x00\x00\x0cHLino\x02\x10\x00\ +\x00mntrRGB XYZ \x07\xce\x00\ +\x02\x00\x09\x00\x06\x001\x00\x00acspMSF\ +T\x00\x00\x00\x00IEC sRGB\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\ +\x00\x00\x00\xd3-HP \x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x11cprt\x00\x00\x01\ +P\x00\x00\x003desc\x00\x00\x01\x84\x00\x00\x00\ +lwtpt\x00\x00\x01\xf0\x00\x00\x00\x14bkp\ +t\x00\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\ +\x18\x00\x00\x00\x14gXYZ\x00\x00\x02,\x00\x00\x00\ +\x14bXYZ\x00\x00\x02@\x00\x00\x00\x14dmn\ +d\x00\x00\x02T\x00\x00\x00pdmdd\x00\x00\x02\ +\xc4\x00\x00\x00\x88vued\x00\x00\x03L\x00\x00\x00\ +\x86view\x00\x00\x03\xd4\x00\x00\x00$lum\ +i\x00\x00\x03\xf8\x00\x00\x00\x14meas\x00\x00\x04\ +\x0c\x00\x00\x00$tech\x00\x00\x040\x00\x00\x00\ +\x0crTRC\x00\x00\x04<\x00\x00\x08\x0cgTR\ +C\x00\x00\x04<\x00\x00\x08\x0cbTRC\x00\x00\x04\ +<\x00\x00\x08\x0ctext\x00\x00\x00\x00Cop\ +yright (c) 1998 \ +Hewlett-Packard \ +Company\x00\x00desc\x00\x00\x00\ +\x00\x00\x00\x00\x12sRGB IEC619\ +66-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x12sRGB IEC61966-\ +2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3\ +Q\x00\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ\ + \x00\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\ +\x90XYZ \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\ +\x85\x00\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\x00$\ +\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\ +\x00\x00\x00\x00\x16IEC http://\ +www.iec.ch\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x16IEC http:/\ +/www.iec.ch\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\ +\x00\x00\x00\x00.IEC 61966-2\ +.1 Default RGB c\ +olour space - sR\ +GB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.IE\ +C 61966-2.1 Defa\ +ult RGB colour s\ +pace - sRGB\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00desc\x00\x00\x00\x00\x00\x00\x00,Ref\ +erence Viewing C\ +ondition in IEC6\ +1966-2.1\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00,Reference Vi\ +ewing Condition \ +in IEC61966-2.1\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00view\x00\x00\x00\ +\x00\x00\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\ +\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ\ + \x00\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\ +\xe7meas\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\ +\x8f\x00\x00\x00\x02sig \x00\x00\x00\x00CRT\ + curv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\ +\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00\ +-\x002\x007\x00;\x00@\x00E\x00J\x00O\x00\ +T\x00Y\x00^\x00c\x00h\x00m\x00r\x00w\x00\ +|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\ +\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\ +\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\ +\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01\ +%\x01+\x012\x018\x01>\x01E\x01L\x01R\x01\ +Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\ +\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\ +\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\ +\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02\ +]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\ +\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\ +\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03\ +Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\ +\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04\ + \x04-\x04;\x04H\x04U\x04c\x04q\x04~\x04\ +\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\ +\xfe\x05\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05\ +w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\ +\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06\ +{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\ +\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\ +\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x08\ +2\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\ +\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09\ +y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a\ +'\x0a=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\ +\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\ +\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\ +\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d\ +&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\ +\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\ +\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\ +\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\ +\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\ +\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\ +\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\ +\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\ +\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\ +\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\ +\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\ +\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\ +\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a\ +*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1b\ +c\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\ +\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\ +\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f\ +>\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A l \ +\x98 \xc4 \xf0!\x1c!H!u!\xa1!\xce!\ +\xfb\x22'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#8#\ +f#\x94#\xc2#\xf0$\x1f$M$|$\xab$\ +\xda%\x09%8%h%\x97%\xc7%\xf7&'&\ +W&\x87&\xb7&\xe8'\x18'I'z'\xab'\ +\xdc(\x0d(?(q(\xa2(\xd4)\x06)8)\ +k)\x9d)\xd0*\x02*5*h*\x9b*\xcf+\ +\x02+6+i+\x9d+\xd1,\x05,9,n,\ +\xa2,\xd7-\x0c-A-v-\xab-\xe1.\x16.\ +L.\x82.\xb7.\xee/$/Z/\x91/\xc7/\ +\xfe050l0\xa40\xdb1\x121J1\x821\ +\xba1\xf22*2c2\x9b2\xd43\x0d3F3\ +\x7f3\xb83\xf14+4e4\x9e4\xd85\x135\ +M5\x875\xc25\xfd676r6\xae6\xe97\ +$7`7\x9c7\xd78\x148P8\x8c8\xc89\ +\x059B9\x7f9\xbc9\xf9:6:t:\xb2:\ +\xef;-;k;\xaa;\xe8<' >`>\xa0>\ +\xe0?!?a?\xa2?\xe2@#@d@\xa6@\ +\xe7A)AjA\xacA\xeeB0BrB\xb5B\ +\xf7C:C}C\xc0D\x03DGD\x8aD\xceE\ +\x12EUE\x9aE\xdeF\x22FgF\xabF\xf0G\ +5G{G\xc0H\x05HKH\x91H\xd7I\x1dI\ +cI\xa9I\xf0J7J}J\xc4K\x0cKSK\ +\x9aK\xe2L*LrL\xbaM\x02MJM\x93M\ +\xdcN%NnN\xb7O\x00OIO\x93O\xddP\ +'PqP\xbbQ\x06QPQ\x9bQ\xe6R1R\ +|R\xc7S\x13S_S\xaaS\xf6TBT\x8fT\ +\xdbU(UuU\xc2V\x0fV\x5cV\xa9V\xf7W\ +DW\x92W\xe0X/X}X\xcbY\x1aYiY\ +\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\x5c\ +5\x5c\x86\x5c\xd6]']x]\xc9^\x1a^l^\ +\xbd_\x0f_a_\xb3`\x05`W`\xaa`\xfca\ +Oa\xa2a\xf5bIb\x9cb\xf0cCc\x97c\ +\xebd@d\x94d\xe9e=e\x92e\xe7f=f\ +\x92f\xe8g=g\x93g\xe9h?h\x96h\xeci\ +Ci\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\ +\xfflWl\xafm\x08m`m\xb9n\x12nkn\ +\xc4o\x1eoxo\xd1p+p\x86p\xe0q:q\ +\x95q\xf0rKr\xa6s\x01s]s\xb8t\x14t\ +pt\xccu(u\x85u\xe1v>v\x9bv\xf8w\ +Vw\xb3x\x11xnx\xccy*y\x89y\xe7z\ +Fz\xa5{\x04{c{\xc2|!|\x81|\xe1}\ +A}\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80\ +G\x80\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83\ +W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86\ +r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\ +\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\ +\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\ +\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93\ +M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\ +\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\ +\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9d\ +d\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\ +\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4\ +V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\ +\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xab\ +u\xab\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\ +\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\ +\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6\ +y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba\ +;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\ +\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\ +\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\ +\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\ +\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\ +\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\ +\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\ +\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\ +\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\ +\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2\ +S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\ +\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\ +\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef\ +@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\ +\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\ +\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\ +\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\x00 \ +P8$\x16\x0d\x07\x84BaP\xb8d6\x1d\x0f\x88\ +DbQ8\xa4V-\x17\x8cFcQ\xb8\xe4v=\ +\x1f\x90HdR9$\x96M'\x94JeR\xb9d\ +\xb6]/\x98A\x00\x930(*l\x0c\x9c\x03\x02\x13\ +`P0\x07?\x02?\xe8O\xe8X\x06 \x01\xa4\x00\ +hO\xfa$\x1a\x93H\x82R\xdf\xf0J}J\x06\xff\ +\xa4\x80\xa9t\xd0\x05\x1a\x07U\xa5\xd5\xeb\xf4\xfa\x8d\x86\ +\x05S\x81S\xe9VhK\xfc\x05o\x01\xd5\xaa\xf6\xca\ +\x8d~\x0fh\xb4\xd2\x00P\x8a\x95\x92\xefK\xb0P\xac\ +W\x9aM\xca\x9dI\xbe]05\xca\xf0\x02\x98\xfe\xc8\ +>\xf2O\xa7\xa6U\xe2\xf3\xcc<2O\xb7\xce\x1aS\ +O\x07\xe8Bcm!\x10\x87\xa7)\x89\xb5C\x00v\ +\xb4#?\x01\x81*\x98\x88]\xf7i\x87\xa4g\xb18\ ++\x1e\xe7\x01\xb7\x8e\xed\xaa\x17:\x15\xfa\x0d\xba\xde\xda\ +\xf7\x98Ln;\x7f\xbe\xe2\xf0!\x99\xec\x0d\xe2\xbbj\ +\xe8T\xab\x18^\x7f6\x9f\x90\xc8uz\xbb>\xcf\x81\ +\xfc\xf8\xf4=\x9c\xbe\xb6\xf3#\xdc\xbaa|VN\x0f\ +\xa3c6\xfa\x94\x04\xbfAb\xcf\xf4\xe0)\xc0\x03:\ +r\x08-\xebzc\x03\xc1\x10L\x15\x05>\xe6\x94\x1c\ +c\x13p\x89\x04h\xc2\x86+\xee\x90\x00\xd0\xc8\x10(\ +C\x83 \xdb\x0f\x91\x00LD\x05\xc1q,M\x13\xc5\ +\x09B\xa4fE\x85\xf9\x17\x17\x8d\xa6\xfcdk\xb9\x08\ +\xb0;\x1b\x84\x84LtV5A0_\x14\xc8\x12\x0c\ +\x85!\xa2\xe7\xd4\x8c|\x93RI\x00SI\x84|\x8c\ +}\x1f(\xc4\x0a\x01\x07\xb2\xa8\x9aCK\x058\x0f-\ +\x812$\xbd/\xcc\x13\x0a\x04gL\x86\x08\xed3\x8a\ +\x87\x84\xd4v#\x09\x98\x08\x02\x8a\xf3\x88\xda7\xce\x84\ +\x5c\xa71O\x13\xcc\xf5\x03\x9d\x13\xe9\xc44P\x02\x11\ +\xc9A\x9b\xa8\xc42\x03\x01\x03-\x14?\x0c\x14h\xf0\ +\xe3Ot\x8d%I\xa3\xe7\x95,w\x0c\x94\xc8|o\ +S\x86\xad\x0d\x0d\x0d\x95\x09\x0e\xfe\x8b#}!JU\ +\x15MT\x873\x07\x99\xe1E\x0c\xa1\xf1\xb9Y\x9ah\ +\xc4\xb6\x03\x810\xf8\xdaDN\x22\xb8\xdbS\xc4\xae\x13\ +\x9bU\xc8q\xab\xae\xe1\xa1V\x15UV\x9e\x14\xc8\xc8\ +\x1e\x9b\xb6\x89\xa9O\xd1\x03u\xacD\xd7\xb5\xfb\xa4\x89\ +\xaaF\xdd\xbch\x9e\xb7\x09\xe6\xea\xcav\x13\xa8\xe0\x1f\ +\xb7I\xfb;\xb8\x8e\xdb\xb2\xf29Wr\xd4\x82<\xc8\ +E\x80\xe3\xbb\xab+\xa3d9\xd7\xdd\xe3}-\xd0-\ +\xec\xe0X\xc8\xa3\xc6\xe4\xbc\xce\xc5\xde\xbf\xb9`\x04\xdc\ +\x02\x84X\x88T\x05\xe2\x80r8\xca\x9e\x87\x8d\x9c\x1e\ +\xd6f\xe5j\x8b\xd6\xe0MB6\x10\xe2\xc6L7^\ +\xe8\x89\xf9\x95\x9fc\xa6\x5c(\x9a\xf9\x89\x9be!\xf7\ +2\x87\x02\x80xN\x15\x80:\xb6\x15 \xed.\x92\x9d\ +\xea\x81\xe8O\x06R\xe9\xad\x97r\xb5\x9b\xae\x17\xa6\x8c\ +\xe0`\xeec\xcdr\xbb\xb9\xa5\x93|\xdd\xb4\x83\xcc\x08\ +\xeb\x80\xa8\xf9\xaf\x93an\xc4\x1cb\xec\xb0\xc7\xb3\x87\ +\x96\x89\xbbi\xe4\x12\xe6GQ\xbf\xa3z8\xfb\x8c\xdb\ +\xa8~i\xef\x06E\x89\xbd\xef\x88>\xb8\x08\x82\xb1\xd1\ +\x12U\x86\x5c(~\x8eY\x9b\xa8\xcc\x1f\xdb\xc6\xd9\xa5\ +[K\x95\xd5y9h\xe8{\xefX\x07\xc6\xa74d\ +\xef\xbc\xee\xfa\x08t\x00\xa4^E\x95\xc1\x87L\x1er\ +\xa8v1\x8dS8\xe5i\xc8W\x1b~L,e\x16\ +\xda%'\x9f#?t o\x06\x9e\xf5\xcfx\x15W\ +@\x08tQ\x7fK\xd3\xf5(m\x99\xdd\x0c\xe2\x01\xb5\ +\xe7\x9a6\xa0\x11\xc9T\x9b\x926\xfb\xf9\x82\x04\x1ci\ +\x18\xfe\x0f\xbdJx`\xa1\x15\xf1\x95\xbc(d\x1fl\ +\xb8\xcf\x14\x1f\xf9\xe6\xd7\xa3\xb6\xf65\x17g\xda\xdf\x88\ +\xa7/Es<\xdf\xbf\xfd\xcfmh\x1c\x04\x84d\x01\ +\x15\xcf\x99\xc3\x91\xb5\x98\xe6\x18\xeb\x1f\x22\xcc\x85\xc9-\ +\x97\x92C\x1b\xa3vw\xae\xfd\xfeAT\xc0\xf8]\x18\ +\xae\x060l\x1e\x91\xc5\xc2=G\x93g\x0c`\xf2\x04\ +\xbb\x06D\xfc\x99<\x0f!l\xac~\x0f\xb71\x04\xe0\ +\xb41K\xcd\xfd\xc0\xa3\xb7\xcc\xfa 1\x99\x81\x0e\xbd\ +\xf8\x00\x95\xac\x1b\x96\xc2rnfM\xcc9\xa1\xa8\xe7\ +!\x91\x02\x02\xb1,\x0d\x02\xf8\x9c\x0e\xc1DQ\x06Q\ +D\x14\x03\x10-\x15\xc0\xeb\xfe\x021h\x82)a\xe4\ +;\xd6`\xe9\x8cC\x8cl\xc6Q\x9e6#@\xce\x1a\ +\x11\xacb\x0e\xb8\xdc9\xa1\x8c4|b(V\xc1\xb0\ +c\x07a\xca\xaecm\xa9\xb6@\xb7\x22\x88 s\xb6\ +\x220E\xc5\xc3\x07=\x15\xc0\xb0\x1b\x09R,.\x04\ +\x09\x1c\x14\x01\x5c\x91\x06\xf0\xa8\x8f\x15!\xad%\xc6X\ +\xbf\x93B\xbc\x5cI\xd1J\x9fG@\xe3o\x90a\xe3\ +Gh\xf0F\x9d[\xeb}\xaf\xbe??\x16H\xf5H\ +\xe4,\x1fln#D\x85P\xd8\x81h8T\x81\xc0\ +\xd3\x840\xa6l\x0d\x92`]C\xf2M\x0b\xf1^)\ +\xe6@\x90B\x83Dc)8\xe4\xf9%3\x88\x87O\ +\xe2\x12\xc3\xd7$\xfc\xc8\xe3\xb8}r\xd5=\x01y\xbc\ +\x07\x03\x8c\xe1\x11\xc1\x12r\x05W\xf6/\xa7@\xad\x11\ +\xd3\xac9J\x01\xc4\x98_\x0cs\x8e\xb0rJ\x10\x97\ +\x96\xee\xe5[\xd2\x9a\xf0\xa6A\x11\x09\x08\xdd\xdb\xcaD\ +\x00\xb4\x0c\x03\x05\xba\x0c\x1c\xa1\x10|D@%\x12D\ +\x90\x00z\x07\xc0\xf6\x13\xd4LB\x8aJ,#]\xc2\ +@\x99\xf1\xd2h\x91\xb7V\xc6\xe6\xac\xadW2\x01\xca\ +O\xd7-\x11\x1f\xc4\xdcE \xe2\x96\x04d\xce\x1d\x84\ +\x98\x1e\xa6@\x9a\x87\x11\x11\xc7M\xc6\xe3\xa3\x0d\xa3\x1a\ +\x9e\x0b\x84L\xf8`\x08\x8c\x15\xee\x98\x18\x03\xc7\xd2<\ +eS\xd0\x84\xd06\x92\xbfR',\xa5\xa3\xfaA\x09\ +L4\xd5Q\x06\x18j\xc0z\xa6\xa4\x80P\xd5\xd1\x12\ +%k\x00zhd\xba\x1a8!Y\x0d\xe0\xf2\xe1\x84\ +-\xa2\x90\x91VC\x0f\xc4HV\xaeA\xb2z\x90\x87\ +p\xf6d1.\x01\xb5\xec\x08\x08J\xfc)A\xdd\x81\ +\x09Ul\x93\xd3\xc1\x8c.\x03\xdd\x89\x0b+0\x96Q\ +\xb9\xe7\x1d\xea;\x98q\xae>\x1e\xb6\xf9`\xf5\xcc\x9b\ +\xeb\xaf$\xa5\x88\x82 UPE\x852\x03\xc0\x96\xc2\ +\x12\xean8\xc6\xe3.\x0e\x81A\xb5)\xe2Oc\xa8\ +\xec\xa82\xd6IoYJD\xec\xa7\xe5N\x22Oa\ +\xdd\xbd\xb7\xbaI\xcd 6\x08u\x04W\x93\xc0\x1bi\ +PP\xf6\xb9C\xd2\x97\x85#\xdc2\x05\xd9$\x86\x90\ +f'\x02\xf0w]H<\x07\x9a\x90\xf0\x8b(p\x11\ +\x5c&\xc5\x98\x1fc\xea\x22\xd5\x22D\x0d\xef@D\x9d\ +b8Y2\x1b\x90\x90\x12x\xf8\x0eW\xcc'\x5c\xfb\ +\xa2G\xe5#\xa4\xa8\x8e\xa2\x93:\xa3-R_uK\ +\xa4\x8a\xfa\xec\x10i\xfff\xc8\xe5,\x07\x01\x1a\xf5\x8b\ +\x1b\xbc\x91#p\xeb\x1c\xc2\xf7\x0a\x0a\xcb\x0c-\xe7t\ +b\x1d#\x8c\xa9D\xb0*\x06\x84\xbe!\x17\xb2 \x0e\ +'\xab\xe3|\xc3\x90O\xb9\xe2\xe8\x8eO\x17\xc9Z(\ +\xf5\xb3\x7f\x16O\x01+\xb9\x03n\xa4\x1d\x99\x82T\x04\ +\x8d\x83\x9c|\x11\xc4nA\x16\x18=\x14\x8e|\x8c8\ +D\x86I\x0es\x14W\xd62\x22+\xf2\x80\xdbF\xe0\ +t\x12);\xe2\x1c\xf2\xc0P\x18\xf9l\x5c\x91\x8c]\ +\x1d1\x85\xb2c6\xd1\xc7cW'\x81/\xe9\x0d\xb7\ +\x8f6\xdf\x11\x89\x22\x0a\xc1\xa8\x99\xceC\x00\x04gP\ +\x14\x90(\xb0\xa4\x11\xa2c>\x07\xda =\xc8\xe6P\ +\x15\xf9I\x1c*\xaa =\x9f\x5c\x97\x1a\xc30\x8a_\ +\x985\x07+L cx\xd2\x1e\xd7\x0a\xe4\x15\xab\xa6\ +i\x82\x06M\xec\xe6\xd2&\x065\x00\x1e\xab\xa2\x84d\ +\x81=L\x06\x111\xe6\xa7B\xafV\x09bI\xa0\xb4\ +&To\x83\xb7Z\x0e\x80\xbf\xad\xc1\xb4\xa0\x94D>\ +\xb2\xc3g\x0b\x0e3\x15Hn\xd3\xe4\x8b\xdd\xe0\xe1\xb1\ +\xc4XU\xd9A\xaf\x02\x90\x5c\x0f\x8f\x08q9\x01\xc2\ +wj\x0cPG\xb5\xc1b@\xaf\xc2\x102\x8b\x0d\xbc\ +'\x09F\xb0\xcayU\xcfY5\x9c\x0f \xf8\xf3!\ +\x9a\xf4D\x8a\xc9M\xb3H#\x89n\xdaR\x91T\xcc\ +\xd1\x8e'\xf6:\x90\xbb@\x84\x94\xf1\x1f\xbf\xc5\x98<\ +\xe0A- \x0bN\x0c(\x04\x07\x09\x0c$\xb3qh\ +W\xbe|F\x10\xb2\xcb\x01\xcc(,l\xbe\xf9u\xfc\ +\xd2U\xd0\xed\x8f=&\xde\x16\xb9\x00p\x88w\x8fN\ +\xa0\xeb~B\x96p|P\x01\xa0A\xa4\x01\xcd\xcb\xc7\ +\x06\x97\x05z\x1f\x86e\x1d\xc7\x0cD\xa79\x0f\x02\x83\ +\x9e\x08\x92\x11\x0d\x04GA\x15P\x13x\x108\xbc;\ +\xde\xce\xf4\xad\xc9sKW>\x8a@\x9d\xc7+\x08:\ +x\x83_\xb4\x92&\x86\x038\xdbU\xfbn\xed\xf2a\ +\xc3u\x94\x16\x98p\x88\x1eR\xa2\x05\xa3\xad\x89\x19\xde\ +N/\xa5\x11H\x18\x88/\x09\x1a\xd9\xee\xf8\x82m)\ +\x90)\xc6\x90\x19\xef@} da\xce8B\x8f\x81\ +\x04\xb2\xcb\xaf\xf3n\x1d\x12G\x17\x89\x1b|\x80-\x03\ +\x0d\x0f\xc5\xf3\x09\x19\xa3\xee\xb6\xb6\xf6\xe6\xdd\x0a\x1d\xa7\ +O\x00\x1d\xce\x0a\x00\x09\xc2\x1cDm\x06\x0ba\xc9\x22\ +\x0a/L\x22\x84\x97\xa9\x0e\xe8'\xb0nK\x08'=\ +\x80\x82\xcf\x82`?\xf9\x0e3\x1eVk\xad\x8f\x90\x9a\ +\xdcy\x9d4B\xdf\xba\xb1\x96\xb5\xec\x06\x81\x01k\xf1\ +\xc7\x19<\x01\x89\x13\xa9\x22\xc1\x980=g\x86\xec6\ +\x13\xa3\x84\xcf\xac\x07\x99\x0c\xf2\xed$b\x0f\x8f-'\ +ms7q#>s[\x85\xf0\xec\xae\xb9\xf2C\x1f\ +?\xac{\x83\xff\xdc\x03\xfc\x22\x08\xf5\xb7\xbc\x81\xef\xf1\ +\x1e\x1c\xbe8\xb5\x14w\x12\xfd\xe9\x1f\xbcu\xae\xda\x22\ +j\xdeZ\xed.\xd3-\xf0\xa4\xeeH\xb7\xaeL\x120\ +\x18\x16\xab\x02\x07k\x06He\x06\x1c\x81\xbaC\x80\xa0\ +\xf5\xc4\x14\x03\x904\x04F\x1e$\x8b\xd6\x16KD\xa6\ +\x84\x86\xe2\x01f\x100L\x0c+\x88\xfbb.ul\ +\xc8\xb6\xce\x96W\x0d\xec[P\x0e!\xcf\x82\x7f(\x8e\ +\x15\xd0p\x1b0BH\x89\x96\x18\xae\xc8\xa6\xaff\x17\ +\xc0i\x08`\x82H\x83\xe8\x1c\x01\xb0s\x09\xe4\xbfo\ +5\x05\x8cf\xfc\x09\xac\xc0pdXb&\xf3\x81\x8b\ +\x0a\xe1\xec\xbd\xc4\x86\x18\x90\xb8\x16\x8d\x8e\x0e\x00\x9a\xa6\ +\xab\x88\x91\xc0\x80\x0a\x04\x88\xfda\xf2\x1e\xe0\x97\x0d`\ +<\x9eO\x22#\x0e\xd6q\x90\xa0\xde\xb0\xa4\xf3J\xee\ +wh&\x16P\xf4\x1b\xe05\x0f\xa0@H\x8b|\x0c\ +Q\x04\x07Jj\xf6\x018\x18J\x88\x94\xe4\x82\xe5\xe1\ +\xcc\x1b\xef\xca\x06\xea\xcd\x0d\xe2.\xbbEb\xf2\xb0\x04\ +\x8f\xecl\xa9\xb0\xa8\xb7jP\xf8G6\x12\xd1@\x17\ +k\x82\x08\x84\x88=a\xca\x1b\xc0\x9f\x15 F\xa6\xb0\ +p\x15\xd0t\xa6d\x88\xc5f\xbe\x0f\x80\xb6\x830\x98\ +\xf7\xe2\x14\xfb\xaf\xbe\xcc\xb0\xa3\x13-\xef\x13lr\xbc\ +k4o'$\xfc\xafVHk\xe2\xfd\xc0~\x01\xe4\ +.{\xe6\x1e\x18\x11\xa0\x1e\x0c\xea\x01\x0c\xeeHj&\ +\x13\xc1\x0a\xee\xe1#\x09g\x91\x17\x09\xec3'\xd7\x00\ +\x22$d/z~\x91\x80\xdf1\x84\xc7g|\xef@\ +2\x03\xe1c\x1d\xe1\xba\xebD\x86\xaa\xa0\xd2\x08a\x97\ +\x1e\xe1|\x7f`g\x1f`~\xceA2\xfa\x04\x86>\ +\xe0\x9d `B>\xf0\xdc\xf6\xe25\x0e1\xc4\x220\ +\x06\x88\x10\x0a\xf3Pj\xec\xc0\x00\xe8!\x10\x15)\xc8\ +\x08\x80\xacH\x8c\xf2\x11\x8c\x92\x12\x00\xea\x7fj\xe0\x0b\ +\xd2D\x0e\xc4\x89\x0fAd\x13\xe1\x05% \xc4\xb6\x0d\ + \xc6,\xc7\x09\xf1y\x0e\x85v\xfcB0\xf3\x82\x09\ +\x03@8\x04D\x98\x14\xc1\xa0\xb8\xc4\x80\xc3A\xc7\x02\ +\xc0I\x19\xa5\x88\xa0`\x0a\x00\xcd`\xd4\x000\x03\xc4\ +\x80Y\x85z\x05\x81\xd5*!\xca\xdd\x8a\xcf!\x0e\xd5\ +\x1c\x0d\xe7\x0ep^\xa4rfd\xeeF\xbc\x8aR\xbc\ +\xc2\x0a\xfa\xc0\x98\x0b\xce\x12\x10\x01BH\x92(\x0d!\ +Y-\xa10o\x84\x00\x0a`\xce\x0f2\xe9-\xe4\x86\ +\x0fR\xf0\x0b\x01u/aR \x8c\xbf*\xa0d\x80\ +\xb2\x12\x9aq*\xbb\x92\xb7\x062 \xdfJ\x00\xee\x82\ +\x17,\xe1?,\x80\xc0H\x09\xdc\xd9@\xaa\x05A\xef\ +2\xe1\xeaRj\x16\x01r\xda\x15\x81\xae\x9b\xc0.\x03\ +\xa4\x80\xdb\xc1`\x13m\xb6\x0c\xc2\x104 \x1e\x02g\ +F\xe3\x13\x02\xb22a\x05\xcf-\x06\x10\xeb\x1b\xc2\x11\ +\x222\xc4!\x11\xa6\x01-\xa8\x13\xa1\x8a\x04\xf3\x80\x06\ +$\x80\x93\xa1p\x14\xb1f\x0b\x85&\xdbaJ\x09\x13\ +\x98\x0bD\x80\x8d\x01\xb0\x19\xb1\x04\x0c@v\xa3\x22\x0e\ +\xf6\xc7\xce\xff\xd1w6Q/6\x92\xbav\x89be\ +\x88^\xdf\x82\x19)@:\x13\xf3\xd0\x19\x0c<\x03D\ +\x80p@\xd6\xd5\x81V\xd5\xc4\xc0W\xa0\xd8\x0e\xb3\xec\ +\x12d\x81*!\xd4\x1c\xa5\x1a\x0c\x00o?A\xca\xdd\ +f\xbb\x122\xad\x0e\x13\x08VS\x0d6r\xb8\xcc\xf0\ +\xa7&\xb1;\x06\xc9l\x223\x80\x04\xe0`B!6\ +\x18o\x94D\xc2\xa5\x01\x81\x22\x0e\x8c\xf2\x11\xc4\x81$\ +@\xbc\x0e\xaf\xd0\xf3B@\xb9A\xec\x1ef6\xd8\x82\ +\x1d5@'\x052Z\xd8*AA3\xbbAlo\ +\x1c\xf0\x10\x1fNJ{\x821\x01\xe0\x92\xfe\xc1g\x1e\ +DQ3\xa1,\x12t\x8c\x0f\x0d\xd2%\x8d\xa4\x87\xe1\ +\x14\x0aT\x9c\x0c\xe4\x80<\x01\xfb\x0b\xe0\x98\xb0\xca|\ +\x22k\x1d\x16\xf0f!\xb1u\x00\x12\xb5AJ\xe0[\ +2\xbf\x18s\x18#I\x16\x09@\xb9,\xe1AHD\ +N\x1d\x94\xdc\x1c\xeer\x12\x80\xf38\x81L\xfe\x225\ +(\xc0\x0d9\x80\x90\x0bG$?@$\x02\xf4\xa22\ +\x01\xfb,\xe0\xc0\x16\xd5\x0c\x14\x821%\x8b!%\xc7\ +XY\xf1-\x1cq1A\x90\xecH\xe70\x1a\xb5,\ +\x19BAO@\xb3%!\x04\x14t\xd8H\x0e\x8f\x1a\ +\x01\x80\x16\x0c\xb6\x18\xe1p\x9d\xd3\xf4\x1c\x82\x08\xc4\x92\ +\x94\x03\xd4}\x19@\xa0\xf8\x80 H\x94\xa4\x0f\xd5l\ +\x0b\xb3\x88\x14\xecZt/\xb4\x9e\x93l \xef'Q\ +\xd4iR\x13\xbdRU~\xc0\xd3\x14\xc1\x02?\x22\xe0\ +\xa8\x10\xb5\x9c\x14\xe9\x80\xfe\x84P\x98k\x12\x0f`\xb4\ +\x17\x95\xb0\x15b@\xed\x14b\xf2LdV2\x16\x22\ +\x12\x1a\xae.\x9dX\xe2\x0aw\x15+R\xe2Q\x0c\x80\ +\xa0K\x01\x0c\x14\xec\x89ZB^w\x15\xaa\x0b,\x98\ +$\x93\xb0\xd8\x15\xbc}M\x86\xa9Qz\x11\x12h\x22\ +\xf2l%`S`\xa0f\x835[^BQ(\x13\ +\xec\x0e\xa0\xa4\xd1M\x18\xb5\xf4\x06Gm\xdf\x5c\xc2\x09\ +\x09\xd5\xc1K\xf4k1\x16, p\xeey\xb5\x94%\ +G\xc3\x22\x81S\x08`h\x08V\x14#\xe1\x9bea\ +\x80\x0f\x16\x5c\x0a\xc1\xdff!\xd6\xb1\xa6\xbbW\xb5\x16\ +#O\xba\xec\x95\x1f!\x95#`\x22,\x96S\xc7L\ +\xa2b6\x00\x06r@\xb9h\xe0\xe9e\x22-'a\ +\x1e\xf5!$\x0e\xc8X\x1f\x82aE\xd4af\xf5\xf6\ +\x1e0Z\x9fD@\xb2\xee\xe5Y3\xc8D\xb4|\xb5\ +A$\xe6\xf6\x94 \x90&\x1b\xaa\x82\x0d\xf0\xb8\x18\x81\ +j\xa7\xe7C\x16\xd1\xbbKb\x19c\x00}\x5c\x22\x1e\ +\xed\xf3\xbe\x0d\xd4\xc7\x1dO:H\x14\xf0\xf4J\x10l\ +\xea\x14Djk2\xe1\xee\x1e\xb3\xd0\x13\xe1\x0c\xcf*\ +0H\xe4\x81j\x88\x02\x15\xf0T\x22\xd6\xe9n\xc2\x1c\ +\xbb\xd4\xc3\x13T\x1c\xbck\xca\x88\xe4\xf4\x91\x006N\ +\x80\xde\x11`\x8ft\xa0\xb2\x7fr\xf6\x17ASC\x80\ +\xe8\xc3UTL\x0d\xd8\x15h\xec\x07\xcf5\x12\x94\x10\ +\xe3\xb5\xffF\xe20\xea%\x00\xeanLUV\x0a\x05\ + f~`\x8bx\xa0\xaeP\xe0\x0eL#\xee\x17w\ +\x98\x15!Qy\xe1%b\x05'[\x96\xad@\xce6\ +\xbbwp\xb6\xe5Ek\x8f\xc62f7R\xc1\xabS\ +\x07<\x86\x97J\x08\xe0\xb1]\x97gZ\x22V\x98a\ +\x9f}\xa1\x87TAau!P\x1d\xd7\xe8\x1dIG\ +W\x87\xc70\x13\x04#/\xbb:`v\xf7k+{\ +f\xe3+\xf7;B(b\x8bIp\x07\x14&\x06$\ +z\x06\x13\xcc\xf8\x80#VB\xbeU\xa8\xc032\x80\ +\x8c\xa1\xb2\x19\xe7\xda\x1a\x0b|\xe8\xe8c_.4\x1e\ +\x07\xb3E\x92\xb7\x1c\xb3\x13\x1d-\xf7hV\xcb\x85b\ +7*\x91%r\x83-Fw\xb30\xf3knO\x81\ +k\xd8U\x85\x98t\x22\xd7\xa9\x11W\xac\x1e\x11\xc3c\ +U\x89F\xd75`Xqo\xb8w\x89\x22%\x84\x15\ +\x19\x86H\x15\x86\x96\xf3\x80\x92\xc3s\xd8\x95\x8a\xb8\x97\ +\x7f\x0c\xc1@\xb1'+\x0e\xd9\x88Vx\x95\xc6J\xb7\ +4q\x06\x8d9\x01Ty\x8a\xd8\xd0!\xd2\xa9b\xb8\ +l!U\x82u\xd8f\x22\x970Z\xf6|\x22\xb6\x80\ +\x7f\x16C\x8d8\xf4 \x98]\x8bXa%\xf63&\ +2\xb6\xe9\xad1\x84\xf2\xc1\x13\xd8\xa9\x8fy\x14 \xb8\ +\x99FO)Xx\xbe\x84\xe6H~y\x0d\x80\xb9\x17\ +\x92\xe2\x06\xa8\x17\x22\xff\xa27g*\xd9\x92\x15\xc5R\ +7t\x22\xe9e\x22\x80\xd4FA\xbeF\x82\xe8.\xe3\ +v^B\xb2_C\x19\x96\x06p+b\xbfJT\x84\ +/\x02\xd5\x96\x83zic\x96;Y^6\xa2\x86`\ +\x09\x81\x97B\x1c+#\x0ciF\x9c\x1f\xc1\xfb\x97\xe3\ +\x1cjf\x04-#j \xe3\x94\x1f\xc3\x8c9\xa2\xb7\ +\x96b\x87\x82\x00\xd7\x9ba\x0b\x81\xaa\x8f\x89\xcf\xc3+\ +\xc2>\x96F\x0ak&\x08j\xa3\x14;\x85\xfc!\x86\ +\xa2_\xa5\xe4\x5c\xecpj\xc2\x0b\x9eFl_\xd9\xe0\ +^&\x7f\x9d4\xb7\x9eFy\x9c\xe2\x84]\x82\xcf\x95\ +e\xda^\x06\x1fD\xc2\x07r\xb8\xbd\x945\x8b\x94y\ +1\xa1\xa4\xf7\xa1\x19\x05\x8eD5s1\x7f\xa1\xda,\ +O.\x8e}vw\xa1@\x12\x0dZ<\x10\x97\x01\xa2\ +\xfaDO7\xe8\x1d\xc1\xd4\xe5`\x84S\x81\xbc\xb5\xcb\ +\xbaC \x0fh\xe0\xb8\x0e\x91\xe8\x10z\x0d\xa4zl\ +$\xbaT\x1a\xd7D\x09N\xfc\x1c\x220\x98\x00\x83\xa8\ + \xa3\x04\xc1\x02\x140\xb5\xa6\xfa\x90AC\xcdN\x88\ +\xe6\x0d\x87V#\x02\x9f\x0458\x14L\xde\x06\xda\x93\ +\xaa\xe4\x10\xd6\x81\xda\x1d\x19L\x18:\xbc\x16T\xa4#\ +\x86B\x97\xa0\xa9\x0b\xe1\x19O\xc0-\xab\x1a\xd4$\xe7\ +W'a \x15:\xe0\x12a\xe3\xaea\xda$\x87\xfc\ +\x02Q\x94\x09\xd0\x0a\xda\xe0F\x05r\x8dy\x22'\x9d\ +\xb9\xd9\x9dC\xac^\x19\xeb\xb0\xa3\x93\x9e\xfb\x0f\xb0c\ +\xb3\x9d\xa3\xc5\x9f\xc3\xac\x9e\xb9\xef\x95\xbb\x1e_\x99\xca\ +!Y\xf2a\xbb*_\xe6j)k\xe2\x1c;@\x1b\ +1\xde\x16!=[\x01x\x15zJ\x1d\x22P)\xe6\ +B\xdch\xa8\x06PCVB\x9fN\xd9\xdc`e\xf9\ +\x9d\xb9\xe4gC\xb0h\x05\xfd\x9d\xa6\x8a2\x02\x08g\ +\x14\xa5\xb2Y\xd0a\xa2\xa4j\x86\x1a`\x1a\x00X\xe0\ +\x02<\xdb\x8f\x99\xe2\x05\x99\xc2\xdf\xb7\x99\x5c8\x1bu\ +\x8c`\x01\xb7\xe1\xfd\xb2b\x0eJe\xd4\x1f\xbb\x82@\ +\xb0\xd0\x1f\x18(\xb4\xe1\xb9\xa7)@\x1c7\x0c\x1e\xbb\ +.$\xa2\x9e\x98\x06\x1f\xb9\x03\xb4\x22\x99\xf8A\x1b\xb8\ +H[\xea$[\xf2K\xc3\xcc\x98t\xa5\xbd\xba\xd7\xc0\ +<\x05\xc0|\x09\xc0\xbc\x0d\xc0\xe2\x08 \x00\x00\x03\ +\x00\x01\xa0\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\xa0\x04\ +\x00\x01\x00\x00\x00`\x00\x00\x00\x03\xa0\x04\x00\x01\x00\x00\ +\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00Adobe\ + Photoshop Docum\ +ent Data Block\x00M\ +IB8nrTM\x00\x00\x00\x00MIB8r\ +yaL\xdc\x19\x00\x00\x01\x00\x03\x00\x00\x00\x03\x00\x00\ +\x00]\x00\x00\x00\x5c\x00\x00\x00\x04\x00\xff\xff\x9b\x0b\x00\ +\x00\x00\x00C\x04\x00\x00\x01\x00C\x04\x00\x00\x02\x00C\ +\x04\x00\x00MIB8mron\xff\x00\x08\x00<\ +\x01\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\xff\xff\x00\ +\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\ +\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\ +\x00\xff\xff\x07Layer 0MIB8i\ +nul\x14\x00\x00\x00\x07\x00\x00\x00L\x00a\x00y\ +\x00e\x00r\x00 \x000\x00\x00\x00MIB8r\ +snl\x04\x00\x00\x00ryalMIB8d\ +iyl\x04\x00\x00\x00\x03\x00\x00\x00MIB8l\ +blc\x04\x00\x00\x00\x01\x00\x00\x00MIB8x\ +fni\x04\x00\x00\x00\x00\x00\x00\x00MIB8o\ +knk\x04\x00\x00\x00\x00\x00\x00\x00MIB8f\ +psl\x04\x00\x00\x00\x00\x00\x00\x00MIB8r\ +lcl\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00M\ +IB8dmhsH\x00\x00\x00\x01\x00\x00\x00M\ +IB8tsuc\x00\x00\x00\x004\x00\x00\x00\x10\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x08\x00\x00\x00met\ +adata\x01\x00\x00\x00\x09\x00\x00\x00lay\ +erTimebuod\xc2\x93A\xe0\xf78\ +\xd6A\x00MIB8prxf\x10\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +\x00S\x00O\x00\x0f\x00\x0c\x00\x0a\x00\x09\x00\x09\x00\x09\ +\x00\x09\x00\x15\x00I\x00K\x00\x12\x00\x14\x00\x14\x00\x12\ +\x00\x13\x00\x13\x00\x13\x00#\x00!\x00\x1e\x00\x1d\x00\x1f\ +\x00\x1d\x00\x1d\x00\x1d\x00\x1c\x00\x1e\x00\x1d\x00(\x00'\ +\x00&\x00&\x00&\x00%\x00$\x00$\x00\x22\x00 \ +\x00 \x00\x1e\x00\x22\x00\x1f\x00\x1e\x00\x1e\x00\x1f\x00!\ +\x00 \x00 \x00#\x00!\x00%\x00%\x00$\x00'\ +\x00(\x00(\x00+\x00\x1d\x00\x1d\x00\x1d\x00\x1d\x00\x1c\ +\x00\x1d\x00\x1e\x00\x1e\x00\x1f\x00 \x00#\x00\x13\x00\x13\ +\x00\x13\x00\x12\x00\x14\x00\x12\x00\x13\x00\x13\x00M\x00L\ +\x00\x09\x00\x09\x00\x08\x00\x09\x00\x0a\x00\x0a\x00\x0c\x00L\ +\x00W\x00 \x00\xfd\x00\x04\x05\x11!-1\xfe/\xfc\ +0\x181//0110010/1/0\ +010/0110/01\xfe0\x0a/2\ +1100/00//\xfe1\x000\xfe1\x05\ +010/01\xfe0\xfe1\xff0\x081/0\ +/-'\x18\x08\x01\xfe\x00\xff\x00\x07\x01\x14X\xab\xdb\ +\xec\xf0\xf0\xfd\xf1\x00\xf0\xfe\xf1\x00\xf2\xfd\xf1\xff\xf0\x01\ +\xf1\xf0\xf8\xf1\x03\xf0\xf1\xf1\xf0\xfe\xf1\xfe\xf0\x07\xf1\xf0\ +\xf0\xf1\xf1\xf0\xf1\xf0\xfc\xf1\xff\xf0\x1b\xf1\xf0\xf0\xf1\xf2\ +\xf1\xf0\xf1\xf0\xf1\xf1\xf2\xf0\xf1\xf0\xf1\xf0\xf0\xf1\xf0\xee\ +\xe4\xc2|.\x06\x00\x00\xff\x00\x03\x16\x86\xed\xfd\xb3\xff\ +\x04\xf9\xbfA\x06\x00\x03\x00\x08l\xf4\xb0\xff\x03\xfe\xbd\ +*\x01\x02\x00$\xd0\xae\xff\x02\xf8x\x07\x02\x02O\xf6\ +\xad\xff\x01\xc0\x14\x02\x05r\xfd\xad\xff\x01\xe1#\x02\x08\ +\x86\xfe\xad\xff\x01\xed+\x02\x08\x8f\xfe\xad\xff\x01\xef-\ +\x02\x09\x91\xfe\xf1\xff\x00\xfe\xdb\xff\xfe\xfe\xfd\xff\x00\xfe\ +\xec\xff\x01\xef,\x02\x08\x91\xfe\xfa\xff\x17\xfe\xcf\xc2\xc3\ +\xc2\xc4\xc3\xc4\xc3\xc3\xc4\xc4\xc1\xc3\xc3\xc2\xc3\xc2\xc2\xc3\ +\xc2\xc3\xc4\xc4\xfe\xc2\xfd\xc3\x0a\xc2\xc3\xc3\xc2\xc3\xc3\xc2\ +\xc3\xc2\xc2\xc1\xfe\xc3\xff\xc4\xf9\xc3\x06\xc4\xc3\xc3\xc4\xc2\ +\xc3\xc4\xfe\xc3\xff\xc2\x01\xc7\xf1\xf9\xff\x01\xf0-\x02\x09\ +\x90\xfe\xfa\xff\x03\xfaK\x18\x17\xfc\x18\x16\x17\x18\x16\x19\ +\x17\x18\x19\x19\x18\x19\x18\x17\x18\x19\x19\x18\x17\x17\x19\x17\ +\x17\x19\x17\xfb\x18\x11\x17\x16\x18\x16\x19\x19\x17\x18\x18\x19\ +\x18\x18\x19\x17\x19\x18\x19\x18\xfd\x19\x08\x18\x19\x19\x18\x19\ +\x19\x17,\xc7\xf9\xff\x01\xf0,\x01\x09\x90\xf9\xff\x01\xf9\ +8\xc0\x00\x01\x15\xc0\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\ +\xff\x01\xf97\xc0\x00\x02\x14\xc2\xfe\xfa\xff\x01\xf0-\x02\ +\x09\x90\xfe\xfa\xff\x01\xf88\xc0\x00\x02\x14\xc2\xfe\xfa\xff\ +\x01\xef/\x01\x08\x90\xf9\xff\x01\xf99\xc0\x00\x01\x14\xc1\ +\xf9\xff\x01\xf0/\x02\x09\x90\xfe\xfa\xff\x01\xf97\xc0\x00\ +\x01\x12\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf9\ +8\xc0\x00\x01\x14\xc2\xf9\xff\x01\xf1-\x02\x09\x90\xfe\xfa\ +\xff\x01\xfa8\xc0\x00\x01\x15\xc1\xf9\xff\x01\xef-\x01\x09\ +\x92\xf9\xff\x01\xf97\xe7\x00\x0d\x1aU\x87\xb8\xd5\xe6\xf7\ +\xf7\xe6\xd6\xb9\x88V\x1a\xe8\x00\x01\x15\xc2\xf9\xff\x01\xef\ +,\x02\x09\x91\xfe\xfa\xff\x01\xf98\xea\x00\x03\x1bw\xc7\ +\xfe\xf5\xff\x03\xfe\xc9x\x1d\xeb\x00\x01\x14\xc2\xf9\xff\x01\ +\xf0/\x01\x09\x90\xf9\xff\x01\xfa7\xec\x00\x028\xa8\xfb\ +\xef\xff\x02\xfb\xaa:\xed\x00\x01\x15\xc2\xf9\xff\x01\xef-\ +\x01\x09\x91\xf9\xff\x01\xf87\xee\x00\x01\x1c\xaa\xe9\xff\x01\ +\xac\x1e\xef\x00\x02\x14\xc1\xfe\xfa\xff\x01\xef/\x02\x08\x90\ +\xfe\xfa\xff\x01\xf98\xf0\x00\x02\x06x\xf4\xe7\xff\x02\xf5\ +z\x07\xf1\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\x91\xfe\ +\xfa\xff\x01\xf97\xf1\x00\x01F\xd9\xe3\xff\x01\xdbH\xf2\ +\x00\x01\x14\xc3\xf9\xff\x01\xf0/\x02\x09\x91\xfe\xfa\xff\x01\ +\xfa7\xf3\x00\x01\x02\x85\xdf\xff\x01\x88\x02\xf4\x00\x01\x15\ +\xc1\xf9\xff\x01\xf1-\x02\x09\x92\xfe\xfa\xff\x01\xf88\xf4\ +\x00\x01\x10\xb5\xdd\xff\x01\xb7\x10\xf5\x00\x01\x15\xc2\xf9\xff\ +\x01\xf0.\x01\x09\x90\xf9\xff\x01\xf98\xf5\x00\x01*\xda\ +\xdb\xff\x01\xdb+\xf6\x00\x01\x15\xc2\xf9\xff\x01\xf0.\x02\ +\x09\x90\xfe\xfa\xff\x01\xf99\xf6\x00\x01C\xf2\xd9\xff\x01\ +\xf3E\xf7\x00\x02\x15\xc3\xfe\xfa\xff\x01\xef-\x01\x08\x91\ +\xf9\xff\x01\xf97\xf7\x00\x01D\xf6\xd7\xff\x01\xf7E\xf8\ +\x00\x02\x14\xc2\xfe\xfa\xff\x01\xf0/\x02\x09\x91\xfe\xfa\xff\ +\x01\xf98\xf8\x00\x01F\xf7\xf0\xff\x07\xe5\x91H*\x0d\ +\x0c&\xe3\xee\xff\x01\xf7F\xf9\x00\x01\x14\xc1\xf9\xff\x01\ +\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf98\xf9\x00\x01G\xf7\ +\xf1\xff\x02\xe0S\x02\xfb\x00\x00\xdb\xed\xff\x01\xf7G\xfa\ +\x00\x01\x14\xc1\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\ +\xf99\xfa\x00\x015\xf5\xf1\xff\x01\x8c\x09\xf9\x00\x00\xdb\ +\xec\xff\x01\xf54\xfb\x00\x01\x14\xc2\xf9\xff\x01\xf1.\x02\ +\x09\x92\xfe\xfa\xff\x01\xf99\xfb\x00\x01\x1e\xe7\xf2\xff\x01\ +\xfdj\xf7\x00\x00\xdb\xeb\xff\x01\xe7\x1d\xfc\x00\x01\x15\xc1\ +\xf9\xff\x01\xf0/\x02\x08\x93\xfe\xfa\xff\x01\xf98\xfc\x00\ +\x01\x0e\xd3\xf1\xff\x00d\xf6\x00\x00\xdb\xea\xff\x01\xd1\x0d\ +\xfd\x00\x02\x15\xc1\xfe\xfa\xff\x01\xef.\x02\x09\x91\xfe\xfa\ +\xff\x01\xf98\xfd\x00\x01\x01\xb4\xf1\xff\x00\x9f\xf5\x00\x00\ +\xdb\xe9\xff\x01\xb1\x01\xfe\x00\x01\x14\xc1\xf9\xff\x01\xef-\ +\x01\x08\x8f\xf9\xff\x01\xf99\xfd\x00\x00|\xf1\xff\x01\xdf\ +\x0a\xf5\x00\x00\xdb\xe8\xff\x00w\xfe\x00\x02\x15\xbf\xfe\xfa\ +\xff\x01\xee.\x02\x09\x92\xfe\xfa\xff\x01\xf89\xfe\x00\x01\ +<\xfc\xf1\xff\x00d\xf4\x00\x00\xdb\xe8\xff\x05\xfb7\x00\ +\x00\x14\xc2\xf9\xff\x01\xef.\x01\x09\x91\xf9\xff\x05\xf98\ +\x00\x00\x0e\xe0\xf1\xff\x01\xe0\x05\xf4\x00\x00\xdb\xe7\xff\x04\ +\xda\x0a\x00\x14\xc1\xf9\xff\x01\xf0-\x02\x09\x90\xfe\xfa\xff\ +\x04\xf98\x00\x00\x8d\xf0\xff\x00\x89\xf3\x00\x00\xdb\xe6\xff\ +\x03\x81\x00\x14\xc1\xf9\xff\x01\xef,\x02\x09\x90\xfe\xfa\xff\ +\x04\xf97\x00\x10\xf3\xf0\xff\x00@\xf3\x00\x00\xdb\xe6\xff\ +\x03\xee\x0c\x15\xc2\xf9\xff\x01\xf1.\x01\x09\x91\xf9\xff\x03\ +\xf98\x00v\xf0\xff\x01\xf6\x05\xf3\x00\x00\xdb\xe5\xff\x02\ +q\x14\xc3\xf9\xff\x01\xf1.\x02\x09\x92\xfe\xfa\xff\x03\xf9\ +9\x00\xb5\xf0\xff\x00\xdc\xf2\x00\x00\x22\xf7'\x00\xd9\xf0\ +\xff\x02\xb2\x13\xc2\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\ +\x03\xf97\x00\xd9\xf0\xff\x00\xc4\xe7\x00\x00\xbe\xf0\xff\x03\ +\xd7\x15\xc2\xfe\xfa\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x03\ +\xf98\x00\xf6\xf0\xff\x00\xb3\xe7\x00\x00\xaf\xf0\xff\x02\xf6\ +\x14\xc1\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\x03\xf88\ +\x00\xdf\xf0\xff\x00\xc6\xe7\x00\x00\xc2\xf0\xff\x02\xde\x15\xc1\ +\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x03\xf97\x00\xbb\ +\xf0\xff\x00\xdd\xe7\x00\x00\xd9\xf0\xff\x03\xb9\x14\xc2\xfe\xfa\ +\xff\x01\xf1.\x02\x09\x91\xfe\xfa\xff\x03\xf98\x00\x88\xf0\ +\xff\x01\xf7\x06\xe9\x00\x01\x05\xf5\xf0\xff\x03\x84\x15\xc2\xfe\ +\xfa\xff\x01\xef.\x02\x09\x90\xfe\xfa\xff\x04\xf98\x00\x1f\ +\xfc\xf0\xff\x00B\xe9\x00\x00?\xf0\xff\x03\xf9\x1a\x14\xc1\ +\xf9\xff\x01\xef.\x02\x09\x92\xfe\xfa\xff\x04\xf97\x00\x00\ +\xa9\xf0\xff\x00\x8b\xe9\x00\x00\x89\xf0\xff\x03\x9e\x00\x15\xc2\ +\xf9\xff\x01\xf0.\x01\x09\x91\xf9\xff\x05\xf98\x00\x00\x22\ +\xf2\xf1\xff\x01\xe2\x06\xeb\x00\x01\x06\xe1\xf1\xff\x04\xef\x1b\ +\x00\x15\xc1\xf9\xff\x01\xef.\x01\x09\x91\xf9\xff\x01\xf97\ +\xfe\x00\x00^\xf0\xff\x00h\xeb\x00\x00g\xf0\xff\x04W\ +\x00\x00\x14\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\ +\xf98\xfd\x00\x00\x9f\xf1\xff\x01\xe1\x0b\xed\x00\x01\x0b\xe2\ +\xf1\xff\x00\x9a\xfe\x00\x01\x13\xc0\xf9\xff\x01\xf0.\x02\x09\ +\x91\xfe\xfa\xff\x01\xf97\xfd\x00\x01\x09\xce\xf1\xff\x00\xa4\ +\xed\x00\x00\xa5\xf1\xff\x01\xcc\x07\xfe\x00\x01\x14\xc1\xf9\xff\ +\x01\xf1.\x01\x09\x91\xf9\xff\x01\xfa8\xfc\x00\x01\x1d\xe5\ +\xf1\xff\x00j\xef\x00\x00l\xf1\xff\x01\xe4\x1b\xfd\x00\x01\ +\x15\xc1\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf97\ +\xfb\x00\x010\xf3\xf2\xff\x01\xfer\xf1\x00\x01u\xfe\xf2\ +\xff\x01\xf2/\xfc\x00\x01\x13\xc2\xf9\xff\x01\xf0-\x02\x09\ +\x91\xfe\xfa\xff\x01\xf99\xfa\x00\x01I\xfc\xf1\xff\x01\x95\ +\x0d\xf5\x00\x01\x0e\x98\xf1\xff\x01\xfcH\xfb\x00\x02\x15\xc2\ +\xfe\xfa\xff\x01\xf1.\x01\x09\x92\xf9\xff\x01\xf98\xf9\x00\ +\x01\x5c\xfc\xf1\xff\x02\xe6_\x05\xf9\x00\x02\x06`\xe8\xf1\ +\xff\x01\xfc\x5c\xfa\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\ +\x91\xfe\xfa\xff\x01\xf86\xf8\x00\x01Y\xfc\xf0\xff\x09\xee\ +\x9eV8\x1c\x1c8V\x9f\xef\xf0\xff\x01\xfcY\xf9\x00\ +\x02\x14\xc1\xfe\xfa\xff\x01\xf0-\x02\x09\x91\xfe\xfa\xff\x01\ +\xf98\xf7\x00\x01T\xfb\xd7\xff\x01\xfbU\xf8\x00\x01\x14\ +\xc2\xf9\xff\x01\xf0.\x02\x09\x92\xfe\xfa\xff\x01\xf86\xf6\ +\x00\x01P\xf7\xd9\xff\x01\xf8Q\xf7\x00\x01\x14\xc1\xf9\xff\ +\x01\xf0/\x01\x09\x91\xf9\xff\x01\xf98\xf5\x00\x013\xe1\ +\xdb\xff\x01\xe24\xf6\x00\x02\x15\xc1\xfe\xfa\xff\x01\xf0.\ +\x02\x09\x91\xfe\xfa\xff\x01\xf88\xf4\x00\x01\x14\xbd\xdd\xff\ +\x01\xbf\x15\xf5\x00\x01\x15\xc2\xf9\xff\x01\xf1-\x01\x09\x91\ +\xf9\xff\x01\xfa8\xf3\x00\x01\x03\x8b\xdf\xff\x01\x8e\x04\xf4\ +\x00\x01\x13\xc2\xf9\xff\x01\xf0.\x01\x08\x90\xf9\xff\x01\xf9\ +8\xf1\x00\x01I\xdb\xe3\xff\x01\xdcK\xf2\x00\x02\x14\xc2\ +\xfe\xfa\xff\x01\xf0.\x01\x09\x91\xf9\xff\x01\xf98\xf0\x00\ +\x02\x06x\xf4\xe7\xff\x02\xf4z\x07\xf1\x00\x01\x13\xc2\xf9\ +\xff\x01\xf0.\x02\x08\x91\xfe\xfa\xff\x01\xf97\xee\x00\x01\ +\x1b\xa6\xe9\xff\x01\xa8\x1c\xef\x00\x02\x15\xc0\xfe\xfa\xff\x01\ +\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf89\xec\x00\x023\xa1\ +\xf8\xef\xff\x02\xf9\xa24\xed\x00\x01\x14\xc2\xf9\xff\x01\xef\ +-\x01\x09\x90\xf9\xff\x01\xf96\xea\x00\x03\x15m\xbd\xfb\ +\xf5\xff\x03\xfb\xben\x16\xeb\x00\x01\x14\xc0\xf9\xff\x01\xf1\ +,\x01\x09\x90\xf9\xff\x01\xf97\xe7\x00\x0d\x11Iz\xaa\ +\xc7\xd8\xe8\xe9\xd8\xc8\xabzJ\x11\xe8\x00\x01\x14\xc1\xf9\ +\xff\x01\xef/\x02\x09\x90\xfe\xfa\xff\x01\xf98\xc0\x00\x01\ +\x15\xc1\xf9\xff\x01\xf0-\x02\x09\x91\xfe\xfa\xff\x01\xf98\ +\xc0\x00\x01\x14\xc2\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\ +\x01\xf98\xc0\x00\x01\x14\xc1\xf9\xff\x01\xf0-\x01\x09\x91\ +\xf9\xff\x01\xf97\xc0\x00\x01\x14\xc1\xf9\xff\x01\xef.\x02\ +\x09\x90\xfe\xfa\xff\x01\xf99\xc0\x00\x02\x15\xc1\xfe\xfa\xff\ +\x01\xf0-\x01\x08\x91\xf9\xff\x01\xfa8\xc0\x00\x01\x15\xc1\ +\xf9\xff\x01\xf0.\x02\x09\x92\xfe\xfa\xff\x01\xf97\xc0\x00\ +\x01\x14\xc1\xf9\xff\x01\xf0-\x02\x09\x90\xfe\xfa\xff\x01\xf9\ +7\xc0\x00\x01\x14\xc3\xf9\xff\x01\xf1-\x02\x09\x91\xfe\xfa\ +\xff\x02\xfad;\xfe:\xfe9\x1589;;9:\ +:8;9:7:9:;99;:98\ +\xfd:\xff8\x017;\xfc9\x09;:9;;8\ +:979\xfe:\xff9\x09:89::8;\ +9J\xcf\xf9\xff\x01\xf0-\x01\x09\x91\xf8\xff\x00\xfa\xfd\ +\xf9\x08\xf8\xf9\xf9\xf8\xf9\xf8\xf8\xf9\xf8\xfd\xf9\x06\xfa\xf9\ +\xf9\xf8\xf9\xf8\xf8\xfe\xf9\x00\xf8\xfe\xf9\x0e\xf8\xf9\xf9\xf8\ +\xf9\xf8\xf9\xf8\xf8\xf9\xf8\xf9\xf9\xf8\xf8\xfd\xf9\x00\xf8\xfe\ +\xf9\x05\xf8\xf9\xf9\xf8\xfa\xfa\xfe\xf9\xff\xf8\x01\xf9\xfe\xf9\ +\xff\x01\xf0.\x02\x09\x91\xfe\xad\xff\x01\xf0.\x02\x08\x91\ +\xfe\xad\xff\x01\xee-\x01\x09\x8d\xac\xff\x01\xe9+\x02\x07\ +{\xfe\xad\xff\x01\xd5\x1f\x02\x04U\xf6\xae\xff\x02\xfd\xa3\ +\x0f\x02\x01'\xc9\xae\xff\x02\xe7Q\x03\x03\x00\x09]\xe9\ +\xb0\xff\x03\xf0\x80\x13\x00\xff\x00\x03\x12`\xcc\xf7\xfb\xfe\ +\x00\xff\xfc\xfe\x00\xff\xfe\xfe\x02\xff\xfe\xff\xfe\xfe\x05\xff\ +\xfe\xfe\xff\xfe\xff\xfd\xfe\x0a\xff\xfe\xff\xfe\xfe\xff\xfe\xff\ +\xff\xfe\xfe\xfc\xff\xff\xfe\xfe\xff\x04\xfe\xff\xfe\xff\xff\xfb\ +\xfe\xff\xff\xff\xfe\x02\xff\xfe\xff\xfc\xfe\x06\xfd\xf5\xcel\ +\x17\x00\x00\xff\x00\x08\x01\x0a.`\x86\x96\x97\x92\x92\xfe\ +\x91\xff\x92\x13\x93\x92\x92\x91\x92\x92\x90\x91\x92\x91\x90\x91\ +\x92\x91\x91\x93\x91\x91\x94\x91\xfc\x92\x05\x91\x92\x91\x91\x90\ +\x92\xfe\x91\x0f\x90\x92\x92\x93\x91\x90\x92\x92\x90\x92\x91\x90\ +\x91\x92\x92\x90\xfd\x91\x03\x93\x91\x90\x90\xfe\x91\x0b\x93\x90\ +\x90\x92\x8ayU+\x0c\x01\x00\x00\xfd\x00\x04\x01\x05\x0a\ +\x0c\x0b\xfb\x0a\x00\x09\xf2\x0a\xff\x09\xf0\x0a\x00\x09\xf6\x0a\ +\x00\x09\xee\x0a\x02\x08\x04\x01\xfd\x00\x01\x00\x02\x00\x02\x00\ +\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ +\x02\x00\x02\x00\x02\x00\x02\x00\x06\x00\x06\x00\x06\x00\x06\x00\ +\x06\x00\x11\x00\x10\x00\x0c\x00\x0c\x00\x0e\x00\x0c\x00\x0f\x00\ +\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x12\x00\x11\x00\x14\x00\x10\x00\ +\x12\x00\x14\x00\x12\x00\x0e\x00\x0f\x00\x0f\x00\x10\x00\x0e\x00\ +\x0a\x00\x06\x00\x08\x00\x08\x00\x06\x00\x08\x00\x10\x00\x11\x00\ +\x14\x00\x16\x00\x16\x00\x15\x00\x14\x00\x14\x00\x17\x00\x14\x00\ +\x16\x00\x0c\x00\x0a\x00\x0e\x00\x0f\x00\x0f\x00\x0c\x00\x0e\x00\ +\x0e\x00\x0e\x00\x10\x00\x13\x00\x06\x00\x06\x00\x06\x00\x06\x00\ +\x06\x00\x06\x00\x06\x00\x06\x00\x02\x00\x02\x00\x02\x00\x02\x00\ +\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ +\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ +\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xf4\xcc\xc1\xff\ +\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\ +\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xe8\x00\x03\xcd\ +\xcc\xcc\xcd\xf8\xcc\x00\xcd\xe8\x00\xf5\xcc\xf4\xcc\xeb\x00\x02\ +\xcf\xcd\xcd\xf1\xcc\x00\xd3\xeb\x00\xf5\xcc\xf4\xcc\xed\x00\xea\ +\xcc\x00\xce\xed\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xd1\xe6\xcc\xef\ +\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\xcc\x00\xda\xf1\x00\xf5\ +\xcc\xf4\xcc\xf2\x00\xe0\xcc\x00\xcd\xf2\x00\xf5\xcc\xf4\xcc\xf4\ +\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\xcc\xf5\x00\ +\x00\xcf\xdb\xcc\x00\xcf\xf5\x00\xf5\xcc\xf4\xcc\xf6\x00\x00\xce\ +\xd9\xcc\x00\xcf\xf6\x00\xf5\xcc\xf4\xcc\xf7\x00\x00\xcd\xd7\xcc\ +\x00\xce\xf7\x00\xf5\xcc\xf4\xcc\xf8\x00\x00\xce\xd5\xcc\x00\xce\ +\xf8\x00\xf5\xcc\xf4\xcc\xf9\x00\xec\xcc\x04\xcd\xce\xd7\xd4\xd0\ +\xeb\xcc\xf9\x00\xf5\xcc\xf4\xcc\xfa\x00\xee\xcc\x01\xcd\xff\xfb\ +\x00\xea\xcc\xfa\x00\xf5\xcc\xf4\xcc\xfb\x00\x00\xce\xef\xcc\x00\ +\xe2\xf9\x00\xea\xcc\x00\xcd\xfb\x00\xf5\xcc\xf4\xcc\xfc\x00\xee\ +\xcc\xf7\x00\xe9\xcc\x00\xd3\xfc\x00\xf5\xcc\xf4\xcc\xfd\x00\x00\ +\xda\xef\xcc\xf6\x00\xe8\xcc\x00\xd7\xfd\x00\xf5\xcc\xf4\xcc\xfe\ +\x00\x00\xff\xf0\xcc\x00\xcd\xf5\x00\xe7\xcc\x00\xff\xfe\x00\xf5\ +\xcc\xf4\xcc\xfe\x00\x00\xcd\xef\xcc\xf5\x00\xe7\xcc\x00\xcd\xfe\ +\x00\xf5\xcc\xf4\xcc\xff\x00\xee\xcc\xf4\x00\xe5\xcc\xff\x00\xf5\ +\xcc\xf4\xcc\x01\x00\xda\xee\xcc\xf4\x00\xe4\xcc\x00\x00\xf5\xcc\ +\xf4\xcc\x00\x00\xee\xcc\xf3\x00\xe5\xcc\x01\xcd\x00\xf5\xcc\xf4\ +\xcc\x00\xcf\xef\xcc\x00\xcf\xf3\x00\xe4\xcc\x00\xd4\xf5\xcc\xf4\ +\xcc\x00\xcd\xee\xcc\xf3\x00\xe4\xcc\x00\xcd\xf5\xcc\xe1\xcc\xf2\ +\x00\x00\xd2\xf7\xd1\xe2\xcc\xe1\xcc\xe7\x00\xe2\xcc\xe2\xcc\x00\ +\xcd\xe7\x00\xe2\xcc\xe1\xcc\xe7\x00\x00\xcd\xe3\xcc\xe1\xcc\xe7\ +\x00\xe2\xcc\xe1\xcc\x00\xd4\xe9\x00\xe1\xcc\xf4\xcc\x00\xcd\xee\ +\xcc\xe9\x00\x00\xce\xef\xcc\x00\xcd\xf5\xcc\xf4\xcc\x01\x00\xcd\ +\xf0\xcc\x00\xcd\xe9\x00\xee\xcc\x00\x00\xf5\xcc\xf4\xcc\x01\x00\ +\xd2\xef\xcc\x00\xd4\xeb\x00\x00\xd4\xef\xcc\x01\xcf\x00\xf5\xcc\ +\xf4\xcc\xff\x00\x00\xce\xf0\xcc\x00\xcd\xeb\x00\x00\xcd\xf0\xcc\ +\x02\xcd\x00\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xf0\xcc\x00\xd0\ +\xed\x00\x00\xd0\xf0\xcc\x00\xcd\xfe\x00\xf5\xcc\xf4\xcc\xfe\x00\ +\x00\xe2\xf0\xcc\x00\xcd\xed\x00\xf0\xcc\x01\xcd\xda\xfe\x00\xf5\ +\xcc\xf4\xcc\xfd\x00\x00\xd3\xef\xcc\xef\x00\x00\xcd\xf0\xcc\x00\ +\xcf\xfd\x00\xf5\xcc\xf4\xcc\xfc\x00\x00\xcf\xf0\xcc\x00\xcd\xf1\ +\x00\xef\xcc\x00\xce\xfc\x00\xf5\xcc\xf4\xcc\xfb\x00\x00\xce\xf0\ +\xcc\x01\xcd\xd7\xf5\x00\x00\xda\xef\xcc\x00\xcd\xfb\x00\xf5\xcc\ +\xf4\xcc\xfa\x00\x00\xcd\xed\xcc\xf9\x00\x00\xd4\xee\xcc\x00\xcd\ +\xfa\x00\xf5\xcc\xf4\xcc\xf9\x00\x00\xce\xeb\xcc\xff\xd1\xff\xcc\ +\x00\xcd\xee\xcc\x00\xce\xf9\x00\xf5\xcc\xf4\xcc\xf8\x00\x00\xce\ +\xd4\xcc\xf8\x00\xf5\xcc\xf4\xcc\xf7\x00\xd5\xcc\xf7\x00\xf5\xcc\ +\xf4\xcc\xf6\x00\x00\xcd\xd9\xcc\x00\xcd\xf6\x00\xf5\xcc\xf4\xcc\ +\xf5\x00\x01\xcc\xcd\xdc\xcc\x00\xce\xf5\x00\xf5\xcc\xf4\xcc\xf4\ +\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\xcc\xf2\x00\ +\x00\xce\xe0\xcc\xf2\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\xcc\ +\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xcf\xe7\xcc\x00\xd1\ +\xef\x00\xf5\xcc\xf4\xcc\xed\x00\x00\xcd\xeb\xcc\x00\xcd\xed\x00\ +\xf5\xcc\xf4\xcc\xeb\x00\x02\xce\xcd\xcd\xf1\xcc\x00\xd0\xeb\x00\ +\xf5\xcc\xf4\xcc\xe8\x00\x04\xd2\xce\xcc\xcc\xcd\xfa\xcc\x01\xce\ +\xd2\xe8\x00\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\ +\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\ +\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\ +\xcc\xc1\xff\xf5\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\ +\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\x01\x00\x02\ +\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\ +\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x06\x00\x06\x00\x06\ +\x00\x06\x00\x06\x00\x11\x00\x10\x00\x0c\x00\x0c\x00\x0e\x00\x0c\ +\x00\x0f\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x12\x00\x11\x00\x14\ +\x00\x10\x00\x12\x00\x14\x00\x12\x00\x0e\x00\x0f\x00\x0f\x00\x10\ +\x00\x0e\x00\x0a\x00\x06\x00\x08\x00\x08\x00\x06\x00\x08\x00\x10\ +\x00\x11\x00\x14\x00\x16\x00\x16\x00\x15\x00\x14\x00\x14\x00\x17\ +\x00\x14\x00\x16\x00\x0c\x00\x0a\x00\x0e\x00\x0f\x00\x0f\x00\x0c\ +\x00\x0e\x00\x0e\x00\x0e\x00\x10\x00\x13\x00\x06\x00\x06\x00\x06\ +\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x02\x00\x02\x00\x02\ +\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\ +\x00\x02\x00\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\ +\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xf4\ +\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\ +\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xe8\ +\x00\x03\xcd\xcc\xcc\xcd\xf8\xcc\x00\xcd\xe8\x00\xf5\xcc\xf4\xcc\ +\xeb\x00\x02\xcf\xcd\xcd\xf1\xcc\x00\xd3\xeb\x00\xf5\xcc\xf4\xcc\ +\xed\x00\xea\xcc\x00\xce\xed\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xd1\ +\xe6\xcc\xef\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\xcc\x00\xda\ +\xf1\x00\xf5\xcc\xf4\xcc\xf2\x00\xe0\xcc\x00\xcd\xf2\x00\xf5\xcc\ +\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\ +\xcc\xf5\x00\x00\xcf\xdb\xcc\x00\xcf\xf5\x00\xf5\xcc\xf4\xcc\xf6\ +\x00\x00\xce\xd9\xcc\x00\xcf\xf6\x00\xf5\xcc\xf4\xcc\xf7\x00\x00\ +\xcd\xd7\xcc\x00\xce\xf7\x00\xf5\xcc\xf4\xcc\xf8\x00\x00\xce\xd5\ +\xcc\x00\xce\xf8\x00\xf5\xcc\xf4\xcc\xf9\x00\xec\xcc\x04\xcd\xce\ +\xd7\xd4\xd0\xeb\xcc\xf9\x00\xf5\xcc\xf4\xcc\xfa\x00\xee\xcc\x01\ +\xcd\xff\xfb\x00\xea\xcc\xfa\x00\xf5\xcc\xf4\xcc\xfb\x00\x00\xce\ +\xef\xcc\x00\xe2\xf9\x00\xea\xcc\x00\xcd\xfb\x00\xf5\xcc\xf4\xcc\ +\xfc\x00\xee\xcc\xf7\x00\xe9\xcc\x00\xd3\xfc\x00\xf5\xcc\xf4\xcc\ +\xfd\x00\x00\xda\xef\xcc\xf6\x00\xe8\xcc\x00\xd7\xfd\x00\xf5\xcc\ +\xf4\xcc\xfe\x00\x00\xff\xf0\xcc\x00\xcd\xf5\x00\xe7\xcc\x00\xff\ +\xfe\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xef\xcc\xf5\x00\xe7\xcc\ +\x00\xcd\xfe\x00\xf5\xcc\xf4\xcc\xff\x00\xee\xcc\xf4\x00\xe5\xcc\ +\xff\x00\xf5\xcc\xf4\xcc\x01\x00\xda\xee\xcc\xf4\x00\xe4\xcc\x00\ +\x00\xf5\xcc\xf4\xcc\x00\x00\xee\xcc\xf3\x00\xe5\xcc\x01\xcd\x00\ +\xf5\xcc\xf4\xcc\x00\xcf\xef\xcc\x00\xcf\xf3\x00\xe4\xcc\x00\xd4\ +\xf5\xcc\xf4\xcc\x00\xcd\xee\xcc\xf3\x00\xe4\xcc\x00\xcd\xf5\xcc\ +\xe1\xcc\xf2\x00\x00\xd2\xf7\xd1\xe2\xcc\xe1\xcc\xe7\x00\xe2\xcc\ +\xe2\xcc\x00\xcd\xe7\x00\xe2\xcc\xe1\xcc\xe7\x00\x00\xcd\xe3\xcc\ +\xe1\xcc\xe7\x00\xe2\xcc\xe1\xcc\x00\xd4\xe9\x00\xe1\xcc\xf4\xcc\ +\x00\xcd\xee\xcc\xe9\x00\x00\xce\xef\xcc\x00\xcd\xf5\xcc\xf4\xcc\ +\x01\x00\xcd\xf0\xcc\x00\xcd\xe9\x00\xee\xcc\x00\x00\xf5\xcc\xf4\ +\xcc\x01\x00\xd2\xef\xcc\x00\xd4\xeb\x00\x00\xd4\xef\xcc\x01\xcf\ +\x00\xf5\xcc\xf4\xcc\xff\x00\x00\xce\xf0\xcc\x00\xcd\xeb\x00\x00\ +\xcd\xf0\xcc\x02\xcd\x00\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xf0\ +\xcc\x00\xd0\xed\x00\x00\xd0\xf0\xcc\x00\xcd\xfe\x00\xf5\xcc\xf4\ +\xcc\xfe\x00\x00\xe2\xf0\xcc\x00\xcd\xed\x00\xf0\xcc\x01\xcd\xda\ +\xfe\x00\xf5\xcc\xf4\xcc\xfd\x00\x00\xd3\xef\xcc\xef\x00\x00\xcd\ +\xf0\xcc\x00\xcf\xfd\x00\xf5\xcc\xf4\xcc\xfc\x00\x00\xcf\xf0\xcc\ +\x00\xcd\xf1\x00\xef\xcc\x00\xce\xfc\x00\xf5\xcc\xf4\xcc\xfb\x00\ +\x00\xce\xf0\xcc\x01\xcd\xd7\xf5\x00\x00\xda\xef\xcc\x00\xcd\xfb\ +\x00\xf5\xcc\xf4\xcc\xfa\x00\x00\xcd\xed\xcc\xf9\x00\x00\xd4\xee\ +\xcc\x00\xcd\xfa\x00\xf5\xcc\xf4\xcc\xf9\x00\x00\xce\xeb\xcc\xff\ +\xd1\xff\xcc\x00\xcd\xee\xcc\x00\xce\xf9\x00\xf5\xcc\xf4\xcc\xf8\ +\x00\x00\xce\xd4\xcc\xf8\x00\xf5\xcc\xf4\xcc\xf7\x00\xd5\xcc\xf7\ +\x00\xf5\xcc\xf4\xcc\xf6\x00\x00\xcd\xd9\xcc\x00\xcd\xf6\x00\xf5\ +\xcc\xf4\xcc\xf5\x00\x01\xcc\xcd\xdc\xcc\x00\xce\xf5\x00\xf5\xcc\ +\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\xf5\xcc\xf4\ +\xcc\xf2\x00\x00\xce\xe0\xcc\xf2\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\ +\xd4\xe3\xcc\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xef\x00\x00\xcf\xe7\ +\xcc\x00\xd1\xef\x00\xf5\xcc\xf4\xcc\xed\x00\x00\xcd\xeb\xcc\x00\ +\xcd\xed\x00\xf5\xcc\xf4\xcc\xeb\x00\x02\xce\xcd\xcd\xf1\xcc\x00\ +\xd0\xeb\x00\xf5\xcc\xf4\xcc\xe8\x00\x04\xd2\xce\xcc\xcc\xcd\xfa\ +\xcc\x01\xce\xd2\xe8\x00\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\ +\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\ +\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\ +\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ +\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ +\x01\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ +\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x06\x00\ +\x06\x00\x06\x00\x06\x00\x06\x00\x11\x00\x10\x00\x0c\x00\x0c\x00\ +\x0e\x00\x0c\x00\x0f\x00\x0e\x00\x0e\x00\x0e\x00\x0e\x00\x12\x00\ +\x11\x00\x14\x00\x10\x00\x12\x00\x14\x00\x12\x00\x0e\x00\x0f\x00\ +\x0f\x00\x10\x00\x0e\x00\x0a\x00\x06\x00\x08\x00\x08\x00\x06\x00\ +\x08\x00\x10\x00\x11\x00\x14\x00\x16\x00\x16\x00\x15\x00\x14\x00\ +\x14\x00\x17\x00\x14\x00\x16\x00\x0c\x00\x0a\x00\x0e\x00\x0f\x00\ +\x0f\x00\x0c\x00\x0e\x00\x0e\x00\x0e\x00\x10\x00\x13\x00\x06\x00\ +\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x06\x00\x02\x00\ +\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\ +\x02\x00\x02\x00\x02\x00\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ +\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\ +\xa8\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\ +\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\ +\xf4\xcc\xe8\x00\x03\xcd\xcc\xcc\xcd\xf8\xcc\x00\xcd\xe8\x00\xf5\ +\xcc\xf4\xcc\xeb\x00\x02\xcf\xcd\xcd\xf1\xcc\x00\xd3\xeb\x00\xf5\ +\xcc\xf4\xcc\xed\x00\xea\xcc\x00\xce\xed\x00\xf5\xcc\xf4\xcc\xef\ +\x00\x00\xd1\xe6\xcc\xef\x00\xf5\xcc\xf4\xcc\xf1\x00\x00\xd4\xe3\ +\xcc\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xf2\x00\xe0\xcc\x00\xcd\xf2\ +\x00\xf5\xcc\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\ +\xf5\xcc\xf4\xcc\xf5\x00\x00\xcf\xdb\xcc\x00\xcf\xf5\x00\xf5\xcc\ +\xf4\xcc\xf6\x00\x00\xce\xd9\xcc\x00\xcf\xf6\x00\xf5\xcc\xf4\xcc\ +\xf7\x00\x00\xcd\xd7\xcc\x00\xce\xf7\x00\xf5\xcc\xf4\xcc\xf8\x00\ +\x00\xce\xd5\xcc\x00\xce\xf8\x00\xf5\xcc\xf4\xcc\xf9\x00\xec\xcc\ +\x04\xcd\xce\xd7\xd4\xd0\xeb\xcc\xf9\x00\xf5\xcc\xf4\xcc\xfa\x00\ +\xee\xcc\x01\xcd\xff\xfb\x00\xea\xcc\xfa\x00\xf5\xcc\xf4\xcc\xfb\ +\x00\x00\xce\xef\xcc\x00\xe2\xf9\x00\xea\xcc\x00\xcd\xfb\x00\xf5\ +\xcc\xf4\xcc\xfc\x00\xee\xcc\xf7\x00\xe9\xcc\x00\xd3\xfc\x00\xf5\ +\xcc\xf4\xcc\xfd\x00\x00\xda\xef\xcc\xf6\x00\xe8\xcc\x00\xd7\xfd\ +\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xff\xf0\xcc\x00\xcd\xf5\x00\xe7\ +\xcc\x00\xff\xfe\x00\xf5\xcc\xf4\xcc\xfe\x00\x00\xcd\xef\xcc\xf5\ +\x00\xe7\xcc\x00\xcd\xfe\x00\xf5\xcc\xf4\xcc\xff\x00\xee\xcc\xf4\ +\x00\xe5\xcc\xff\x00\xf5\xcc\xf4\xcc\x01\x00\xda\xee\xcc\xf4\x00\ +\xe4\xcc\x00\x00\xf5\xcc\xf4\xcc\x00\x00\xee\xcc\xf3\x00\xe5\xcc\ +\x01\xcd\x00\xf5\xcc\xf4\xcc\x00\xcf\xef\xcc\x00\xcf\xf3\x00\xe4\ +\xcc\x00\xd4\xf5\xcc\xf4\xcc\x00\xcd\xee\xcc\xf3\x00\xe4\xcc\x00\ +\xcd\xf5\xcc\xe1\xcc\xf2\x00\x00\xd2\xf7\xd1\xe2\xcc\xe1\xcc\xe7\ +\x00\xe2\xcc\xe2\xcc\x00\xcd\xe7\x00\xe2\xcc\xe1\xcc\xe7\x00\x00\ +\xcd\xe3\xcc\xe1\xcc\xe7\x00\xe2\xcc\xe1\xcc\x00\xd4\xe9\x00\xe1\ +\xcc\xf4\xcc\x00\xcd\xee\xcc\xe9\x00\x00\xce\xef\xcc\x00\xcd\xf5\ +\xcc\xf4\xcc\x01\x00\xcd\xf0\xcc\x00\xcd\xe9\x00\xee\xcc\x00\x00\ +\xf5\xcc\xf4\xcc\x01\x00\xd2\xef\xcc\x00\xd4\xeb\x00\x00\xd4\xef\ +\xcc\x01\xcf\x00\xf5\xcc\xf4\xcc\xff\x00\x00\xce\xf0\xcc\x00\xcd\ +\xeb\x00\x00\xcd\xf0\xcc\x02\xcd\x00\x00\xf5\xcc\xf4\xcc\xfe\x00\ +\x00\xcd\xf0\xcc\x00\xd0\xed\x00\x00\xd0\xf0\xcc\x00\xcd\xfe\x00\ +\xf5\xcc\xf4\xcc\xfe\x00\x00\xe2\xf0\xcc\x00\xcd\xed\x00\xf0\xcc\ +\x01\xcd\xda\xfe\x00\xf5\xcc\xf4\xcc\xfd\x00\x00\xd3\xef\xcc\xef\ +\x00\x00\xcd\xf0\xcc\x00\xcf\xfd\x00\xf5\xcc\xf4\xcc\xfc\x00\x00\ +\xcf\xf0\xcc\x00\xcd\xf1\x00\xef\xcc\x00\xce\xfc\x00\xf5\xcc\xf4\ +\xcc\xfb\x00\x00\xce\xf0\xcc\x01\xcd\xd7\xf5\x00\x00\xda\xef\xcc\ +\x00\xcd\xfb\x00\xf5\xcc\xf4\xcc\xfa\x00\x00\xcd\xed\xcc\xf9\x00\ +\x00\xd4\xee\xcc\x00\xcd\xfa\x00\xf5\xcc\xf4\xcc\xf9\x00\x00\xce\ +\xeb\xcc\xff\xd1\xff\xcc\x00\xcd\xee\xcc\x00\xce\xf9\x00\xf5\xcc\ +\xf4\xcc\xf8\x00\x00\xce\xd4\xcc\xf8\x00\xf5\xcc\xf4\xcc\xf7\x00\ +\xd5\xcc\xf7\x00\xf5\xcc\xf4\xcc\xf6\x00\x00\xcd\xd9\xcc\x00\xcd\ +\xf6\x00\xf5\xcc\xf4\xcc\xf5\x00\x01\xcc\xcd\xdc\xcc\x00\xce\xf5\ +\x00\xf5\xcc\xf4\xcc\xf4\x00\x01\xff\xcd\xde\xcc\x00\xff\xf4\x00\ +\xf5\xcc\xf4\xcc\xf2\x00\x00\xce\xe0\xcc\xf2\x00\xf5\xcc\xf4\xcc\ +\xf1\x00\x00\xd4\xe3\xcc\x00\xda\xf1\x00\xf5\xcc\xf4\xcc\xef\x00\ +\x00\xcf\xe7\xcc\x00\xd1\xef\x00\xf5\xcc\xf4\xcc\xed\x00\x00\xcd\ +\xeb\xcc\x00\xcd\xed\x00\xf5\xcc\xf4\xcc\xeb\x00\x02\xce\xcd\xcd\ +\xf1\xcc\x00\xd0\xeb\x00\xf5\xcc\xf4\xcc\xe8\x00\x04\xd2\xce\xcc\ +\xcc\xcd\xfa\xcc\x01\xce\xd2\xe8\x00\xf5\xcc\xf4\xcc\xc1\xff\xf5\ +\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\ +\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xf4\ +\xcc\xc1\xff\xf5\xcc\xf4\xcc\xc1\xff\xf5\xcc\xa8\xcc\xa8\xcc\xa8\ +\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\xcc\xa8\ +\xcc\xa8\xccMIB8ksML\x0e\x00\x00\x00\x00\ +\x00\xff\xff\x00\x00\x00\x00\x00\x002\x00\x80\x00\x00\x00M\ +IB8ttaP\x00\x00\x00\x00MIB8k\ +sMF\x0c\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\ +\x002\x00\x00\x00\x00\x00\ +\x00\x00\x05s\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22 standalone=\x22\ +no\x22?>\x0a\x0a \x0a <\ +title>eye on\x0a C\ +reated with Sket\ +ch.\x0a <\ +defs>\x0a \ + \x0a\ + \x0a \x0a\x0a\ +\x00\x00\x1f\xef\ +\x00\ +\x00\xe4\x14x\x9c\xed\x5c\x07\x5cS\xc7\x1f\xbf\x0c\x12\xf6\ +^2c\x98*\x10\xc2&\xc8\xde\x0a\x82l\x14\x85\x90\ +\x04\x88\x84$f\x80\xab\xe2\xaa\xd6U\x95\xba\xb5uo\ +\xc5\xd6]\xad\xdb\xd6Z\xf7\xb6u\xfc\xb1\xd6\xbaW\x15\ +\xb5\xa8\xf0\xbf{!\x10\x10-J\x00\xfb\xff\xbfo>\ +\xf7r\xef\xd6o\xdc\xbd\xbb\xdf\xdd\xbb{\x89\x89\xa0;\ +\x00@\x13\x98\x83Z@\x86>\x02P\x5cH\xd8_\x1e\ +\xbc\x10T\xfcD\xcc\x0f\xd3\x11\xcc\x09\xa4\xfap\x98\x98\ +@\xa9\xf7\x13\xe1\xc5HYN\xeam\x82\xb1J\x1a\xb3\ +z?\x96[\xa5L\x0be\xfa\xe9\x80`\x054\x14~\ +\x82\x1d\xc1\xba\xc1\xefL\xb0Q)\xc7U\x85\x16\x13]\ +\x01\x1d\xfa<\x08^\x98\xdf\x14\xfa\x93\x09)\x8d\xe9\x89\ +?\xa0\xab\x9f5\xbc\xe5\x8e\x8fG~C\x1a\x00\xfe\xa3\ +&\xf0\x95to\xdc\x9e \x05T\x00t\xe3\x00\x88]\ +\x8c\xe4\x87\xfaP\xfc\xb4_\x8f\x02\xc0\xc5P\xf9\x1f\xce\ +\x15\xe5\xf3h\xc9E\x22\x99HZ$\x12\xd3\x22#i\ +^\x9eL\x7f\x9ak&_\xc8\x15\x95I\xbb\x01t\xcb\ +\xf2\xf4byz\xd3\x98\xbe,/o\x96\xa7\x0f\xe8\x19\ +:D\xcc\xe6\x14\xf3d\xb4|^!_\x18L\x7f\xb4\ +k/\x9d\xc6\xe7\x06\xd33}\x13=\x13\xc5\x91\xbc\x22\ +~\xdc0\x09/uX\x9f4\xce\xb0bN \x97\x1e\ +\x1a\xa2\xdds\x08kH\x89\xb8\x84'c\xd3\x86\x94\x08\ +\x84R\xd6\x90`:\x1b\xd1gA?\x0af\xd0iX\ +\x12Yq0]\xc1XVb2-R$\xe1\xd1|\ +=\xfc\xdc9L\xef\x00\x9a\x7f\xa0\x07\xd370\xc0\xcb\ +\xc7\x0d1\xea\xc7\xf0\x0cd0}\xdc=\x99,\xcf@\ +\x96'\x93V\x0fz\x886\xbc\xf6\x94p\x0bX)Q\ +1\xf5\xe4\xe0]0\xbdH&\x13\xb3\x18\x8c\xb2\xb22\ +\x8f2o\x0f\x91\xa4\x90\xc1\x0c\x0c\x0cdxz1\xbc\ +\xbc\xdca\x0aw\xe9P\xa1\x8c=\xc4](uP\x14\ +\xa2,'\x8a'\xe5H\xf8b\x19_$\xa4\xa1{v\ +\xbeH.\x0b\xa6\xd3\xb5i*\xa8\x97\xabD\xdc@H\ +(\xf5\xc0d\xf4\xe0\x88J\x18C\xd8b\x06\xd3\xc3\x93\ +\xd1R&.\xa7!\x8fX.\x11`\xacq9\x0c\x9e\ +\x80W\xc2\x13\xca\xa40\x1f\xb3\xc5|be\xdd\xb5L\ +\xb2!\xfa\x9d\x84!\xb7\x89\x89\xef\xe7\xb7\xa4\xa4\xc5\x9c\ +RYt\xa9\xec\xfd9\xa5iC\xc5\x05\xee\x01\xcc|&|\xc6|}\xb9<\x0e\ +\xd3\xcb\x97\xeb\x8b\xe9\xa0i\xf6\xb7\x8a\x8e\x12q\xe4\xa8\ +\xe9\xd6\x17\xcd\xfd\xc0\xa2U\xb2\xbfUt\x92\x84\x0f\xbb\ +\x1d\xb6\xa0\x8d$Z(\xe6-Rq|\xa9L$\x19\ +\x1a\xd2\xa4\xf9c\x1dB*op\xd3Pe\x84\x80\x8f\ +u\x10b\xb6D\xcaC\xcd?\x98\xael\xff\xf4\xb72\ +\xa0<\xd8c\xc4bsP\xd7\x12\xc2\xc1Z8\xb7'\ +\xa3I\xe8\xbb\xb3\xf1?\xb6\x02\xdf\xca\xfen\x1aeE\ +<\xe1\xfb\x9eL\x95T\xef.D**\x90\x95\xb1%\ +\xbc\xf0B\xa8\xe9\x90\x7f\x1cw\x94\xa56\xcd\xf6\x96\xbe\ +\x19\x0a\x857\xab\x1e\xc6\xdb\xf5\xa3\xac\xf3f\xf5\xa9H\ +\xaa\xd2\xb7+\x06\x0eF\xfd\xc8\x01\x07-F\xc3\xa8\xd5\ +\x92p\xea\x07N\x04'\x82\x13\xc1\x89\xe0Dp\x228\ +\x11\x9c\x08N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\ +\x9c\x08N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\x9c\ +\x08N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\x9c\x08\ +N\x04'\x82\x13\xc1\x89\xe0Dp\x228\x11\x9c\x08N\ +\x04'\x82\x13\xc1\x89\xe0Dp\x22j&\xa2\xddx\x0e\ +\x8c'\xe4\x06\xd3\xcb\xe8\xa1! \x22>\x91\xec\x84\ +\x9d93\x04\xcd\x80\xc5\xb10\xef\xcd\xfax\xect\x1e\ +\xd0\x11K\xf8BY\x92\x5c&\x96\xcb\xe0-:&\x07\ +\x92\xa5\xb2\xd4|\x91H\x80\xa5\x88\x17\xcax<\xa1\xbc\ +D\xe9G\xff\x91\x02\x09\xba7\xc0\xf2\xa6\xf2\x87\xa0\x14\ +\x11|\x19\xca\xd3X&O\xd2\x87]\xc2K\x8b\xceJ\ +k \xa6\xc8\x90,\x11\x89\x0aRy2\xb98)\x7f\ +\x10\x07\x06\xeb\x82d \x01\x22\xf8+\x004\x90\x0ax\ +@\x06\xe4@\x8ce\xd1\x167\xa4V\x16\x13!\x90\x09\ +\xeb9\xd2\xcd\x97\xf3\x052\xbe\x10+\x12\xdeka\xa9\ +#\x13\xb3{+$\x0eB\xe9\x89\xeeM$6V\x91\ +8\x09;y \x85\xa1\x16\x98\x5cb\x99P)\x04\x14\ +2_\xd2p\x93R(Ml\x8c\x91\x08#\x1bo\x84\ +\xb2\xc6\x9b\x84|\x81\xb4\xe1\xa6O\xa1\xac\xb4\xe1&\xba\ +D\x10\xd5p\x03\xf5\xd8Xt\x04\xa7\xb8\xb0^\x11\x0a\ +\x06AJlD$P\x1c\x9b\x04)\x5c\x1a\x8d+\x92\ +\xe7\x87\x89\xaa\x1a*3V\x22|+,B\xf0v\xba\ +\x08\x097-](\x8bqH\x11\xc8T\x1bC\x84\x80\ +Kk)\ +\x8b\xae2\x06\xb1\xa0\x12\xae\xa7\x0cO\xe1\x17\x16\xa9F\ +\xe8(# o\x0d\xc1\xa8\xe5\x90\x1e(x\x00q@\ +q\xf6\xb3\xfe\x1fkU\xceX\x9c~\xa3\x04\xa1\xa3\xea\ +s=T\x90\xd3M\x93\xb0\x85R1[\xc2\x13r\x86\ +*Z\xa2\x19\x16c\x87bA\x1al\xedl \x04R\ +\xd8\xc6\xd9\xd0\xcf\x83~\x0e\x18Z\xff\x94\xfab)\x8d\ +0z\xa0\xae\xae\x9e\x04\x97\xa0\x88\xb5\xc5\xee\xc8J>\ +\xc9z\x0d\xf7v\xd8}\x97\xa6\xf7\xa4\xa7\xd8\xbd\x96\x92\ +SE).\x8a\xfeA[\xd9\xe0\x14r\x91\xaa1\x7f\ +\x1c`\x14\x14\xc0\x18\x01\xbcR\xea3)B\x96\xcc\x9b\ +\xdf\x10\xe2\x85]\xfb\xc1\xab2\xc4\x17\xbb\xba7\x86`\ +e\xbe\xc4\xfcb$IK \xddF\xd1\xea\x8f\xc3t\ +\xa1\x90\x8dX\x7fGlr\xe7\xa9\xe0\xb1^\xab\xee\xd8\ +\x1d\x05\xd3\x07\x09\x0b\xd1\xac\xaf\x7f\xac\x16\x88a\x0aW\ +\x9f\xd7\xaeY\x1dX!\x1f\xc9\xb7Ar\x05\xf2\xea\x9d\ +B;oC5L5m\x8b\x09\x94h\xec\xc6\x80P\ +.\x10(\x04\x02\x94|\x91\x5c\xc8\x956\xebE82\ +\xa6\x92M\xf4\xe8\xa94{\xd0\xec\xf9\x00\x11\x8d\xcf\x11\ +\xc6FJ\xe3c\x82\xee)R\x01\x9f\xc3\x93f\x08\x12\ +\xd0\x83NhBG\x03\x8b\x83\x1ec\xe8\xa8\xd8M|\ +\x94J\xd9\xd4B\x89H.n\x12D\x11a\xc7\xff\x94\ +}xt*\xca\xa48\x12\x08\xef\xf5\xd8r\x99(\x96\ +'\xe4I\xd0q<\x8c\xfb\xa1b\xe5\x10\xa4\xadH\x8c\ +BPL|I!\xad\x03\xe4'\xc9%\x82&\x03\x19\ +\xa6\xfc\xa6!\x89\xd2\xc2\xa6\x83\x1d\x85-\x90\xa5\xb1\x0b\ +\x9b\x84\xe9sx0\x1fo\x88,^\x1a\x97\x96\x98\xa0\ +\xecN5\x95\xc1M\x12k\x15\x89$\xc3\xc2\x05\xfcB\ +\xa5\xa6\x0c\x14\xc2\xc7)\x83\x91v\xb9\xbc\x02\xb6\x1c\xeb\ +O\xb5Jy\x12Y\x0b\xc93\x94\xc1M\x93\xeb\xe4\x17\ +b\xa7\x5cU\x94k\xa4\xc8\x10\x11\xdb\x10\x81\xd8\xe8#\ +\x12\xa2\x7f-\x99H\x0c\x07M)OUq\xda\x02\xa8\ +\xc8\xb7Bu\xf3\xb1\x8e\xf9\xadp\x1d\x09\xea~\x9b\x05\ +cO\x90\xab\x22\x1ft\xc4\xd0\xc7\xa01\xdc\x14\xf3\xa2\ +*T<\x95\xba\x98b\x8f\xd6\xab(O\xe1\x08\xb0\x09\ +\xa0'\x81\xb2\x11X\x02B\xdd\xa5\xba\x07@\x17;\xe5\ +\x98\x1b\x99\x08\xef\x1f\x02}\xec\x0epG\xa1|u\x97\ +\xc18\xa0\xab\xa9\xa9\xa9\xa5\xa9\xab\xa5\xa5k\xa4\xa3\xad\ +cdf\xa0\xabk`fibbfbbi\xa4\ +\x8b\xa1\xfe\xafe\x10\xf4tt\xf4\xf4\xf5\x0c\xf5\xf5\x0d\ +M\xf5\xf5\xf5M\xd1E\xdfT\x91\xc5\xa85\x05\xd4\xed\ +\x03F\x9a\x90\xf9<\x12\x81\x0e\x88F\x04\x92\x11\xa1\xee\ +*\x14\x94Rw\x88\x10\x0a\xb9\xd4 `\xa8W\x1c\x09\ +\x10\x88d\x0d\x0aUSK[\x87\xd0<\x92\x00\x88$\ +e\xa4! \x90\x09$\x22\x99\xa8A\xa5hj\x90t\ +\xbda\xa4\x11\x89\xdc\xd5\x98\xa9\x11\xde\x97mB\x1f<\ +\xda\x8bb:c\xc9w\x11\x0e\x8ef)\xfb\xf3\xbd}\ +$cNGR\x9d*R\x1f_\x7f\xc2\x91\xfa\x9a/\ +\xdd4\xd69\xea\xab4n\xf4\x81e2?\x8b3\xe9\ +\xbf\xf3\xfe\xda<\xee\xe0Y\xf9\x8d\xa71.3\x97\x7f\ +\xbee\xd6\xa1s\x7f<[\xb1\xf5\xc7\xf37\xab3\x0a\ +J\xc7\xcf^\xb9\xed\xa7\x0b\x7f>\xf7\x8f\xcd,,\x9b\ +0g\xd5\xf6\xc3\x17o\xbd0\x02D\x22\xe4\x96\x8c\xf1\ +D\xa5h\xf8b,te\x1a\x93!\x07\x83\xe9&\x1a\ +^\xa3g\x98\x22\x0e\xf6\xa7\x9c~\xec\xed\x98\x7f]2\ +\xa6\x222\xd5\x8c#\xf5y\xe2DA\x0cP\x9d}\x0f\ +\x9c\x81L,\xb3\xe0F\xa7\xfb\xc9x\xbf7\xb0\xf0n\ +\x0e\x5c\x1aY\xa8\xfb\x0d\xe8\x920\x9aF \x14T\xa7\ +U\xc4;us\xac\x88\xef\x15\xefX\x91R\x11\xef8\ +sy}@R\xdd\xa9\xea4\xb7\x05\xbfN\x9dV\x10\ +\xb9\xdfm\xcd\x8a\x87z\xd6S\x08!\x17\xc6\xa5U\xa4\ +F.\xaf^h\xb7!v\xdd\xa4G\xe2Z\xc9\xaa\xa2\ +\xe7\xf67\xfdk_o\xac\x94\xae{\xd3o\xeb\xf7\xf6\ +[Y\xd6\xb5G\x17^\x1d\x90uz\xf6\x90:\xe0T\ +Y\xf6f{>\xa8y\x9a\x1e \x12\x16\x04\xdd\xbb\x9b\ +n\xfb\xe5\xe11V\x03^\xbd\xfa\xfa\xf5\xe5\xf2\x8a\x8a\ +oV\x9c(\xee\x97\xf3\xbb\xd5\xe95.a\xe6\xbc:\ +\x90\xbdS?h\xb2\xe0\xf8\xfa\x19'\x8el\xae\x03\xc1\ +\xd4\x8d\xc1ww\x97\xad\x91\xf7\xd7\xfaeKM\xf9\x82\ +\xde>y\xb5\x87o\x95g\xdf\x0bv\x0aY\x11{A\ +8vz\xd5oO\x8b\xc9O\xf6\x14\xd7\x81\x93K&\ +'V\x16\xcf\xb79csv\xb5Cr\xe6Tw\xfd\ +Y\x17\x87\xcd\xe9\xf5m\x90\xf9\xd9;\xb5r\xc6\xf9\x09\ +\xaf\xec\x17\xbc)p\x5cu\xbe\x22;X\xe7\x9e\x9d}\ +\xd6\xda.5n+'n\x1a#\xaf\xddZ\xf8\xf4\xd2\ +V\x85\xf8u\xa0\xee4\xa6\x94@\xfb\xac\x9a7\x03\xec\ +\x8d\xfb\x1b\x1c\xdd\x16m\xb6\xe8\xf5\xcb:\xf0\x07s\xe8\ +\xca\x98\xe8_\xfdC^]\x13l;\xc8\x18\xfe\xbd\x13\ +d$\xe6\xda\x8as\xc2_\xbe\xfdY\xfa\xc5\xfa\x91\xf7\ +\x08o\xacc\x9f\xa7;\xce\x9cc>;\xf7\xab\x01\x8c\ +\xad[\xfc\x0eS\x16\xe4>\xebgp+pXh\x9f\ +\x9aU\xa7\x9et\x17\x9c\xba\xb2j\x86\xf3\xe5\xddO\x1f\ +\x17>-\xc9\xda\x9bZ\xe3\xac_\x1es\xa4t\x00\xbb\ +v\xeb.\xd2\xde\xc0%S\xad\x07\xf4\xdf\xeb{y\xfd\ +0o\x8f\xbb{\xd3\x1e\x98q\x85\xc7o\x9f\xf0;lV`\x82\xa7U\xd5e\xea#\xcf:\x10p\ +\xa6bQ6l:\xa9ug0\xad\x85\xa4W\x8f]\ +q\xf9L\xcd\xd7[\x02\xec\xe3\x0f\xed\x99P\xea\xe6r\ +\xb9VtJrb\xe0\xba\x8b,\x8f\xd0\xac\x83>\xfd\ +\x1fl\xddyVT\xba\xab\x0e\xd0\x1e\x9d\x1c\xc8[4\ +z\xd6\xd9\xbfr'\xcf<>\xdb\xfb\xa1\xc3\xe6K\xe5\ +\x81_\xc6'\xb1k\x19\x9b\xb3\xee\xe7L!\x96\xc7\x1d\ +\xae9n\xe7..\xb6\xad\xe5\xcc\xab\x03\x89\xf2\xd9\x99\ +\x03\xd6\xcbK}\x82\xa7\x19\xfe\xb9#\x8e\xf6\x9c\xb6\x91\ +\xbe\xff\xf8\x91}\xbf\x14dxo\xeb\x9f=}\xb8\xd1\ +\xd5J\xfb\x9d7\xaf\xe4}6\xe2\xce\x9c\x0cJq\xee\ +\xd4\xa2\x9ad\x9dK\xe5k\xb3\x1f\xd5\x81\xc5\x153n\ +>\x1b\xb9\xec\x14\xa3,\xf9v\xaa\xb0\xdbE\x07\xf2\x91\ +\xb3\x7f\xdb\xef\xae\x03\x8b`\xdb\x19\x97\xfd\x9f~#7\ +\xb1\xab\x07\xce\x9a\x9a\xe1\xb3\xedp\xf6\x9e\xbbW\x8f\xfa\ +\xe9\xed*\x9f\xb5\xeb\xdc\xf3\x0d9u`\xe3\xd7^\xf3\ +\x7f>P\xfcWIhL8\x87Z=\xf9M\x1dx\ +f\xa15kFAF\xf4<\xf3\xc3k\x8a'\x7f\xbd\ +\x8521DoP\xaf\x98-{6>[\xc7Z\x95\ +\xbav\xfc\xd8;\x9e\x13\xae=\xdc?\xea\xd5\xde\x935\ +zi\x8f\x9fx\x1c\xffe\xa3\xf9\x17~W\x1el\xb8\ +\x92\x974\xaf\xc7\xd9\x1a\xfb\xe8\xc3\xb7_\xe6O\xda}\ +aW\xff\x0d\x0fo\x95\xffa\xfd\xf7\xc4n\xa71]\ +\x9eU<\x96}\xef^\xb5\xa6\xae\xe3\xd4\x04&\x9c+\ +\xf7/\x96\x0d7\xf8k@\x1d\xf8,\x13>\x9b\xf3\xab\ +Ekm3W\xed\xd8\xb3\xd2\xe6\x87\x91\x17\xd2\x1cG\ +\xd7\x01\xad\x8c\xcaA\x07ic\xc9\xe16\x9f\xdf\xff\xd9\ +\x82\xcd\xe6v\xd9k\xb7.i\xf2\xa5\x8b\xe5\xe7\xc93\ +\xff\x06\xe4\xb9\xc4\xf8*\xf7\x13_U\xc7\xae\xad\xa6R\ +/\x1d\x9c8\xed\xda\xd1(\xe3\xd0\xaa\xbb\xa7O\x0c\x9c\ +\xd0\xc7\xdc

\xf3\xee\xea\x97\xdfM\x15\xbd\x89\x8b\ +\x8dO\x0a\x15\x9d\xdbS\xf1\xf0\x9b+\xfdFW>\x1f\ +\xbe`\xd6\xd1\x17\xe5\x8c\x17\xf3^\x7f\xde\x9fZyK\ +6b\xfc\xb3\x93\xebi\x0fX}\x17\xfa\x16Ox\xed\ +\xb07\xa8\xa6\x0e$\xbd\xe9~7}\xc4}\xdd>K\ +\xbe\xbc/\xd8\xf9\xe3\xac]\xdf\xfda\x7f\x8d\xb3\xd7\xf7\ +H\xb7\xa0\x9c\x8b[\x02\x97\x07V\x1a_\xd4\x0b\xa7\xee\ +\xe8\xb3$\xd1\xb7o\xefn+\x96\xcc\xca e\x9d\xde\ +GHt\x0a\xad;\xf7\xbe>\xe8W\xc58\xd7\x15\xeb\ +\xc9\x07\x00\xcc\x22\x85#7\x08\x07\x5c8\x1d\xce\x87S\ +\x03\x1a\x9c\x1c\x17A\xbf\x0c:)\xe6C\x13a\x8b\x7f\ +HA\x03\x91\xf0G\x83f\xba'`\x02\xff\xfa\x01S\ +7.\x81/\x14\x11\xa1\x11Y\x02g\xa0\xe8\xcb\x15Y\ +\xd9\xfdh\xd4\x13\xd0\x88\xd4\x82\xb6+4\x97\xd8\x1c\xa9\ +815&\x0d3\xae\xa2#i\xe8\xf3\x16\xa0\x09\x9e\ +_P\x98'g\xdd\xe3\x92i4\xf0a0\xe2\x88%\ +2\xf4U\x1d\xe8\xf7\xe6\xf2\xa4\xd0\x5c#\x8c\x83~A\ +\x99L\x8c\xc2\xd1\xd8o\x9a_\x8c\xfcD4\xea\x9bJ\ + \x83\xd0o\x89\xfc\x85\x0a\xbf\x1b\x96F\xe1\x0fC~\ +n\x89\x10\x9a\x89D\xc4\xb3\x98[\xc2E\xfeC\xd0\xff\ +E\xa9\x1c\x99\x8f\xa4\x04\xe8\x1f_\xca\xe7\x95A\xff9\ +\xe8w\x14\xc8K\xf8\xd0\x8ff&\xa6%<64i\ +1\xbb\xc2Q\xc6\xe3\x14A?\x9a\x19\xe8J\xd2R\xe0\ +\x5c\x96\xdc\x13\xdaf\xba\x85*\xfe|\x15\xbf\x0c\x1al\ +H\xa8H\x91x(f\xd9\xd0\x5c9\xddh\xcc\xc0\xc0\ +\x00Z\x1c\xafL\xc0\x93\xc9\xdc\x93\xd9\x9cb\xb6\x84K\ +\x8b\x14\x95\x88\xd9B8\xc3S\xc8\x8c\xc1\xf8\xadO\x87\ +\xa8(\xea\xbd\x91\xad\x04\xaa[\x85\xefi_\xac\xce\x08\ +\xe6\xc7\x1a\xc3ZJ'Z\x0a\xed.8\x0b$Mo\ +\x0c\xcb\x9f\x07\xc0\xf6\xcf\x01\xb0\xfc\xad1\xccq1l\ +\xa3\xb0\xde\xb6\x9dT\x91\xc7\x1c\xb5\x17\x95\x8f\xfc\xf0y\ +\x1c\x0f\xa4\xd0\x06\xfcc\x82V@\x85\x9e\x07*\xaeA\ +=\xb4(\x85eKCz\xe3@\xfbU.\xa1\xc1\x19\ +8\x87Gso\xde\x88?:c\xcb|\xb8\xa5\xf0\x0a\ +xh\xa6\xcf\xa3e\xc0V\xc6\x17\x16\xc2\xea\x16r\xf9\ +\xd8\xf7\x8a\xf8\xc2wU\xe2Gfk\x06E\xbb\x860\ +Y^\x0bLs=\x80\xe1IS@zp\x0c\x90M\ +t\x00)\xe7\x1b\x18Ch\xa8\xb7\x04\xad\x0c\x80\x9e\xbc\ +L\xfb[\x8av\x8f\xa1\x85i&q\x1a\xbaH\xf9\xd8\ +\xe4\x0aD\xa6\xa4\xd18rI\xa9\x22\x0e\x9bOi\x00\ +m\xd8I\x99\x82.\xc0\x0e8\x00W8\xeb\xf7\x82\x9d\ +L\x10\x08\x03\xd1\xa0\x17H\x02i \x1b\x0c\x04\x1c\xd8\ +\x19\x95\x00\x09(\x03#\xc0h0\x1eL\x06\xd3\xc1,\ +0\x1f,\x02\xcb\xc1\x1aP\x096\x81\xed\xe0\x07\xb0\x1f\ +\xfc\x04\x8e\x82S\xe0<\xb8\x0c\xaa\xc0Mp\x0f<\x06\ +\xcf\xc1+h\xe0R\x09z\x04\x13B\x17\x82=\xc1\x89\ +\xd0\x83\xe0E\x08 \x84\x10\xa2\x09\x09\x84\x14B6!\ +\x8fPH\x10\x12\xe4\x84\x11\x84\xb1\x84\xc9\x84\x0a\xc2|\ +\xc2\x12\xc2\x1a\xc2w\x84\xef\x09\xfb\x09G\x08\xa7\x09\xbf\ +\x12\xae\x13\xee\x10\xfe\x22\xd4\x10ID]\xa2)\xd1\x96\ +\xe8Ld\x10\x03\x88\xe1\xc4\xde\xc44\xe2\x00b!q\ +0q\x18q\x1c\xf1K\xe2\x5c\xe2R\xe2z\xe26\xe2\ +~\xe2Q\xe2yb\x15\xf1\x1e\xb1\x9a\x04H:$s\ +RW\x92;)\x80\x14IJ\x22\xf5#\x15\x90$\xa4\ +\x91\xa4I\xa4\xd9\xa4\xa5\xa4J\xd2N\xd2a\xd2YR\ +\x15\xe9>\xe9o2\x85lB\xa6\x91\xdd\xc9A\xe48\ +r:\x99C\x1eL\x1eI\x9eB\x9eO^M\xdeF\ +>D>K\xbeN~L\xae\xd5\xd0\xd3\xb0\xd1\xe8\xa1\ +\xc1\xd2\x88\xd7\xc8\xd2(\xd4(\xd3\x18\xaf1[c\xa5\ +\xc6V\x8d\x1f5\xcek\xdc\xd4xN\xa1P\xcc).\ +\x14\x7fJ\x1c%\x9b2\x882\x9c2\x85\xf25e#\ +e\x1f\xe54\xe5\x06\x05\x0eh\xd4.\xd4\x1e\xd4`j\ +\x12\x95M\x95Q\xc7S\xe7Q\xd7S\xf7R\xcfPo\ +R_j\xeah\xdakzi\xc6h\xf6\xd3\x14j\x8e\ +\xd1\x9c\xad\xb9Vs\x8f\xe6\x19\xcd[\x9a\xaf\xb4\x0c\xb5\ +\x9c\xb4XZIZ\x5c\xad\xa1Z\xd3\xb4\x96k\xed\xd4\ +:\xa9uS\xeb\x95\xb6\x91\xb6\x8bv\xb0v\x9a\xf6 \ +\xed\xd1\xdas\xb5+\xb5\x7f\xd4\xbe\xa2\xfdTGG\x87\ +\xae\x13\xa8\xd3W\x87\xaf3Jg\xae\xce\xb7:?\xeb\ +\x5c\xd7\xf9[\xd7X\xb7\xbbn\xa4n\x8e\xae\x5c\xf7K\ +\xddU\xba\xfbt\x7f\xd5}\xaa\xa7\xa7\xe7\xac\x17\xa6\xd7\ +OO\xa6\xf7\xa5\xde\x1a\xbd\x83z\xd7\xf4^\xea\x9b\xe8\ +{\xe8\xc7\xebs\xf5\xcb\xf5\x17\xe8o\xd3?\xa3\xff\xd0\ +@\xcb\xc0\xc9 \xdc`\xa0\xc10\x83\xd9\x06\x9b\x0dN\ +\x1a\xdc7\xd42t6\x8c4d\x1b\x8e4\x5c`\xf8\ +\xbd\xe1E\xc3j#\x13#\xa6Q\x92Q\x89\xd1\x14\xa3\ +\xb5FG\x8cn\x1bS\x8d\x9d\x8d\xa3\x8d\xb9\xc6\xe3\x8c\ +\x97\x19\x1f4\xbeaB2q0\x894\xe1\x98\x8c5\ +Yn\xf2\xa3\xc9MS\x8a\xa9\x8bi\xbc\xe9 \xd3\xc9\ +\xa6\x1bLO\x98>636\xf31\xcb0\x1bb\xb6\ +\xc0l\xb7Y\x959\xc9\xdc\xd9<\xde\x5c`>\xcd|\ +\x93\xf9\x05\xf3\x1a\x0b[\x8bp\x0b\x9e\xc5D\x8bJ\x8b\ +3\x16/,\xad-\xc3,y\x96\x93,7Z\x9e\xb7\ +\xac\xe9B\xeb\x12\xdd\xa5\xb8\xcb\x8c.\xdb\xbb\x5c\xb5\x22\ +[u\xb7\xeakUf\xf5\x8d\xd5\x8fV\xf7\xadM\xad\ +\x83\xac9\xd6\x93\xac7Y\xfffC\xb4\xe9n\x93b\ +3\xdcf\x99\xcd1\x9bj[;\xdbX[\xb1\xed<\ +\xdb\x83\xb6\xf7\xed\xcc\xed\xc2\xec\x06\xd9\xcd\xb4\xdbcw\ +\xc7\xde\xc4>\xc4\x9eo?\xd3~\xaf\xfd]\x9a\x19-\ +\x9c&\xa0\xcd\xa5\x1d\xa2=\xeej\xd35\xae\xab\xbc\xeb\ +\x92\xae'\xba\xbe\xa2\xbb\xd0\xd3\xe9c\xe8\x1b\xe9W\x1d\ +\xb4\x1d\x02\x1c\x0a\x1cf:\x1cpx\xech\xef\x98\xe8\ +8\xc2q\x9d\xe3oNZN\x01NENs\x9c\x0e\ +;\xbdpvq\xcet\x9e\xe0\xbc\xdd\xf9\xb6\x8b\xa5K\ +\xbc\xcb0\x97u.W\x5c\xf5\x5cC]\x07\xbb.u\ +=\xd7\x8d\xd2-\xa0[q\xb7\xaf\xbb\x9d\xeaN\xec\xee\ +\xdb\xbd\xa8\xfb\x82\xee'{\x10{\xf8\xf5\xe0\xf7\xf8\xba\ +\xc7i7\x0d\xb7@7\xa1\xdbR\xb7\x8b\xee\xba\xee\xe1\ +\xee\xa5\xee\xeb\xdc\xaf{\x98{$x\x8c\xf1\xd8\xee\xf1\ +\x90\xe1\xc8\xe8\xc7\x98\xc18\xcc\xa8\xf5\xf4\xf5\x14x.\ +\xf7\xbc\xcc4f\xf6b\x8ea\xeed\xfe\xe5\xd5\xdd\x8b\ +\xe3\xb5\xc0\xeb\x9c\xb7\x9ew\x8cw\xb9\xf7\x0e\xef'>\ +=|x>\xdf\xf8\x5c\xf25\xf1M\xf4\x9d\xe0{\xc0\ +\xf7\x8d\x9f\xbf\x9f\xc4\xaf\xd2\xef\x8e\xbf\xa3\x7f\x9e\xffB\ +\xff\x8b\x01\xa6\x01\xc9\x01S\x02~\x0e\xd4\x08\x8c\x08,\ +\x0f\xfc!\xf0o\x96\x1fK\xc6\xda\xc4z\x14\xe4\x1eT\ +\x1c\xb46\xe8vO\x97\x9e\xbc\x9e\xcb{\xde\x08\xa6\x07\ +\xb3\x83\x97\x04W\x85\xd0B\xf2B\x16\x87T\x85v\x0d\ +e\x87.\x0d\xfd=\xcc!\x8c\x1b\xb62\xecVx\xb7\ +\xf0A\xe1\xeb\xc3\x1fFxFH\x22\xb6F\xbc\x88d\ +E~\x16\xb9/\x8a\x14\x15\x1b5)\xeaD\xb4qt\ +z\xf4\xfc\xe8k1\xf4\x98\xc2\x98u1\x8fc}c\ +\x87\xc7\xee\x8b\xd3\x88\xeb\x1d7#\xeeb\xbcm<'\ +~M\xfc\xe3^\xfe\xbd>\xebu\xa8\xb7n\xef\xd4\xde\ +\xf3{\xff\x9e\xd0=A\x92\xb03\x91\x98\xd8+\xf1\xab\ +\xc4+}\x9c\xfa\x08\xfblO\x02I\xf1I_%]\ +MvI\x1e\x9c\xbc\xab/\xa5or\xdf\x05}\xffL\ +a\xa6\x8cH9\x9cj\x92\x9a\x9b\xba6\xf5yZD\ +\xda\xb4\xb4\xcb\xe9\xae\xe9\xf2\xf4\x03\x19\x06\x199\x19k\ +2^dFeVdVe1\xb2>\xcb:\x9am\ +\x95\xcd\xcf\xde\xd1\x8f\xda/\xa3\xdf\xca~\xd5\xfd\xa3\xfb\ +\xcf\xea\x7f3\xc77g|\xce\x85\x01.\x03\x86\x0c8\ +2\xd0j\xa0`\xe0\xee\x5c\x83\x5cv\xee\xe6<\x8d\xbc\ +\xcc\xbc\xb5y\xaf\xd9I\xec\xa5\xec\xea\xfc\xf8\xfc\x85\xf9\ +\x8f9\x91\x9c9\x9c{\xdc0\xeeL\xee\x1d^0\xaf\ +\x82w\xab \xb8\xa0\xa2\xe0vap\xe1W\x85w\x8a\ +B\x8bf\x17\xdd\xe7G\xf2\xe7\xf3\x9f\x0c\x8a\x1b\xb4h\ +\xd0\x8b\xe2\xa4\xe2U\xc5u\x82L\xc1\xc6\x12\xcd\x92\xbc\ +\x92\xef\x85\xc6\xc2b\xe1!\x91\x9dh\x88\xe8\xb4\xb8\x87\ +x\xbc\xb8j0k\xf0\xac\xc1\x8f%\xbd%+\xa5\x04\ +\xe9\x00\xe9\x0e\x99)4\xa6\x8e\xc9]\xe5\x9f\xcb\xaf\x97\ +\x86\x94.(}Y\x96Q\xb6y\x88\xd1\x10\xe1\x90c\ +C\xbb\x0f\x9d8\xf4\xd6\xb0\x98a+\x86\x93\x87s\x86\ +\x1f\x18\xd1u\xc4\xe8\x11\xd7?\x0b\xffl\xc9H\xc2\xc8\ +\xfc\x91\x07\xca\x1d\xca\xc7\x95\xdf\x1c\x15;j\xf5h\xed\ +\xd1\xc5\xa3\x8f\x8f\xf1\x1cS1\xe6\xd9\xd8\xcc\xb1;\xc7\ +\xd9\x8e\x1b5\xee\xc6\xe7\xb1\x9f\xaf\x1b\xaf?^2\xfe\ +\xe2\x84\xa0\x09\x8b\xbe \x7f\xc1\xff\xe2\xc4D\xef\x89\xf3\ +&\xd6N\xe2N\xfae\xb2\xe7\xe4\xd9\x93_O\xe1L\ +\xf9e*s\xea\xdc\xa9u_\x16|yb\x9a\xdf\xb4\ +o\xa6S\xa6\x0b\xa7_\x98\x11:cu\x85Q\xc5\xb0\ +\x8a\x1b_%~\xb5m&m\xe6\xa4\x99\xcff\xe5\xce\ +:2\xdbg\xf6\xa29\xdas\xe4s\xaa\xe6&\xcc\xdd\ +1\xcfq\xde\xf4y\xaf\xe7\x17\xcd?\xbf b\xc1\xc6\ +\x856\x0b'.|\xf15\xf7\xeb3\xdf\x84}S\xb9\ +\xc8v\xd1\xe4E5\x8b\xf9\x8b/-\x89]\xb2m\xa9\ +\xf3\xd2\xd9\xcb(\xcbJ\x97\xfd\xb9\ +\xf1\xbe\xfb\xfb\x0b\xf7\xdf8\x90{\xe0\xf2\xc1\xac\x83\xe7\ +\x0e\xf5=t\xe2\xc7\xde?\xfe\xfcS\xccO\x07\x0f\x87\ +\x1f\xde\xfbs\xf0\xcf?\x1ca\x1d\xf9\xfe\x97\x80_\xb6\ +\x1f\xf5;\xba\xed\x98\xef\xb1\xad\xc7}\x8fo=\xe1w\ +b\xdbI\xff\x93;N\x05\x9e\xday\xba\xe7\xe9=g\ +B\xcf\xec?\x1bu\xf6\xa7s\xf1\xe7\x8e\x9e\xefs\xfe\ +\xf4\x85\xf4\x0b\x97.\xe6\x5c\xac\xba\xc4\xbdt\xfbW\xc1\ +\xafO~+\xfd\xed\xd5\xe5QW4\xaeL\xbajx\ +u\xf65\x9bkK\xff\xd3\xed?\x1b\xab\xfc\xaav_\ +\x8f\xba~\xec\xf7\xd4\xdf/\xdf\xe0\xdc\xb8\xf7\x87\xf4\x8f\ +\xd77\xc7\xfd\xa9\xf7\xe7\xec[\xf6\xb7\xd6\xdc\xf6\xba\xfd\ +\xc3\x9d\x98;\xa7\xee\xf6\xbf{\xf3\x9e\xf8\xde\xab\xfb\xe3\ +\x1f\x18=X\xf8\xd0\xf5\xe1\x96Ga\x8f\x8e=\xcez\ +|\xf3\x89\xe4I\xdd_S\x9evy\xba\xea\x99\xcf\xb3\ +\x03\xd5\xc9\xd5\xd7\x9e\x97<\x7f\xf5b\xd2\xcb./W\ +\xff\x1d\xf0\xf7\xe1\x9a\xcc\x9a[\xaf\xca^S_\xcf}\ +\xd3\xed\xcd\xce\xda\xde\xb5W\xeaJ\x1a\xdeH\xe0\xc0\x81\ +\x03\x07\x0e\x1c8p\xe0\xc0\x81\x03\x07\x0e\x1c8p\xe0\ +\xc0\x81\x03\x07\x0e\x1c8p\xe0\xc0\x81\x03\x07\x8e\xffc\ +\x90\xc9dMGG\xc7\xac\xce\xe6\xe3\xff\x15aaa\ +\x8b\x0a\x0a\x0a\xea\xe0\xff7\xa8.:\x9b\x9f\xff'\xa0\ +v\x8ft\xaft)))Guuu\xed\xda\x83\x96\ +\x8e\x8e\x8e\x15\x9dNO\xf7\xf3\xf3\x9b\xd0\xabW\xaf\x1d\ +\x19\x19\x19\xe7srr\xfe\xe4p8/\x90C~\x18\ +v\x01\xc6}\xef\xef\xef\xff\x85\x83\x83C\x06\xca\xd3\x1e\ +\xbc|*@\xed\x1d\xb5{\xd5:\x188p\xe0]k\ +k\xebw\xec\xf2\xfd0@\xfdY{zz\x96%'\ +'\x1f\x86e\xd7\xaa\xd2i\xa5\xab\xed\xdb\xb7\xef\x11X\ +\xc6\x10\xd8.l\xd5\xc1\xd3\xa7\x0877\xb7\x12.\x97\ +[\xa3\x94\x9b\xc7\xe3\xbdvww\x17}ly\x16\x16\ +\x16\x01QQQ\xaba9\xaf>B\xe7-:T\x16\ +,s\xad\xa5\xa5%K\x9d\xb2\x7f*\x80r\x05\x0d\x18\ +0\xe0\x96\xaa\xcc\x91\x91\x91+\xe13\xa2\xdd\xda2`\ +\x1b\xb5A:R\x97\xce\xdf\xe5\xa2\xa3\xa3\xd7\xb7W?\ +\xd9\x99\xd0\xd6\xd6\xee\x02\xfb\x8a\x9fTeMKK;\ +\xad\xaf\xafO\x7f_>\x12\x89DA}D~~\xfe\ +\xb3\xf6\xd6\xbd\xd2AZ\xd5L&s\x18\xa4M\xed(\ +\xfdt\x04\x90.CBB\xe6\xa9\xca\x9a\x97\x97\xf7\xd0\ +\xd6\xd66\xb6\xa5\xf46661\x99\x99\x99\xbfv\x94\ +\xde\x9b\xbb\xac\xac\xac\xcb\x90\xb7\xb8\x8e\xd6S{\xc3\xd5\ +\xd55\x1f\x8e\x09/Ud}\x83\xc6R\xe59g\xf8\ +G\x84\xb6\xcc\xe7\x9d\xa5\xf7\xe6\x0e\xd9L\x88\xa7\xce\xd6\ +\x9b:ann\xee\xdb\xbf\x7f\xff\xdfU\xe5\x8c\x89\x89\ +\xd9\x80\xfa\xf9\xf8\xf8\xf8\xad\x9d\xad\xf3\xe6\x0e\xda\xae\xdb\ +\xa9T\xea[\xdf:\xfa7CKK\xcb,11q\ +\xaf\xaa\x9c\xf0\xb9\xf8\xbb\xb3u\xfd\xbe\xfe\xc8\xd8\xd8\xb8\ +Gg\xebM\x9d \x12\x89d\x16\x8b5\xa3\xb3u\xdb\ +Z\x07\xc7\xe6\xa7p\x5c\x8a\xeel\xbd\xa9\x13P\x9e\xa8\ +O\xb9\xdd7whN\xfd\xbfR\x07\xc8\xc6A\xf2\xa8\ +C/9997\xd1\xb3\x84l\x16##\xa3\xee\x14\ +\x0aEOCCC\xd7\xd0\xd0\xd0\x19\x8e57\xda\xa1\ +\x0eb:[\x7fm\x01\xb2;\xd5\xa1\xfb~\xfd\xfaU\ +\xd1\xe9\xf4\xd4\xf7\xd9(\xa8\xefn\x8f\xe7\xe0]\xb6\xf3\ +\xa7\x0ed\xff\xa0yN[u\x10\x10\x100\x05\xce\xa3\ +\xb5\xfe\x89^{\xe8\x1f9$\x83\x99\x99\x99OG\xe8\ +L]@\xf3\xfb\xe6\xeb\x11\x1f\xe1\xde\xf4\xe8\xd1cP\ +ki\xb6\x97\xfe\x91C\xb2\xfc[\xd6\xf0`\x9f\xac\x9f\ +\x9e\x9e~\xb6\xad2\x7f\xe8\x1a^{\xea\x1f9\xb4\x96\ +\x82\xc6\x9b\xf6\xd2\x9b:\x80\xe6\xb7qqq[\xd4!\ +/\xea\xf3MMM[\xfd\xa5\x90\xf6\xd6?r\xb1\xb1\ +\xb1\xdf\xa9|\xab\xec\x93\x83\x97\x97\xd7\x085\xc8\xd9\xb0\ +\xd6\x0f\xc7\xbf\xe7\xce\xce\xce\x03ZC\xbb#\xf4\x8f\x1c\ +ZGio=~\x0c,--{\xa2\xb5\xff\xb6\xca\ +\x87\xec\xcb\xbc\xbc\xbc\xc7\xcd\xc2\xa6\xa3y\xdc\xfb\xe8w\ +\x94\xfe\xd1\xbb\x04h[\xf8w\x94^[\x03\xd4\xe7\xa3\ +\xfeB\x1d}\x0e\xd4\xb3\x86\x81\x81\x81\x13\x1cC\xce\xa9\ +\xc6\xf5\xe9\xd3\xe7\x80\xb6\xb6\xb6\xc5\xbbx\xe8(\xfd#\ +\x07i\xfd\xf6!\xef6\xda\x1b\x81\x81\x81S\xd5!\x97\ +\xbf\xbf\xffDe\x99h^\xd5\xfc}\x0c\x9c\x7f\xfd\xf1\ +\xae\xb6\xd7\x91\xfaG\xce\xc7\xc7gt\xc7i\xf8\xdd@\ +k\x86h\xcdD\x1d2YYY\x855/\x1f\xbd\x9b\ +Q\xed\xd7\xd0:\x86\xab\xab+\xb7y\xba\x8e\xd6?z\ +\xaf\x81\xdaH\x87(\xf9=\x80\xfa)U\x87H\x15h\x8d\xa8\xf9\xf8\ +\x8a\xd6\x92\x0c\x0c\x0c\x1cQ\xd9\xd0^\xb8\xdeV>\xe1\ +\xdc\xf7\x91r\xde\xf1\xa9\xc0\xd9\xd9y\xa0:\xdaU\xf7\ +\xee\xdd?\xf0+\xdao\x03\xf5\xf1={\xf6\x9c\xd9\x5c\ +gAAA_\xa9\x83G\x07\x07\x87Lu\xe8L\xdd\ +P\x9e\x87i\x8bC\xedS\xb5\xbfh\x0bP\x9bh\xf6\ +\xfe\xffc\xce\x114qh\xddC\x1d\xbc\xb5\x07\x90\xed\ +\xdd|\x8d\xe0c\x1c\x9c\xe3.W\x17O\xa6\xa6\xa6^\ +\xeaX\x1bG.%%\xe5\xd8\xa7\xbeg\x1a\xbd\xa7F\ +\xfbt\xda*\xeb\x87\xbc{\xff'\xa8c\x8d\x10\x8d\xeb\ +\x9fZ\x9f\xff.\xc06\xe7\xa9\x865\xe9Z\x0f\x0f\x0f\ +I[yA6h[\xfb\x1dd[\x98\x98\x980\xd4\ +\xa1\x9b\x8e\x82\x9d\x9d]\xbc:\xe6\x05p\x1c\x9d\xf51\ +\xfb\x0e\xd0;\xb9\xe0\xe0\xe0\xb9m\xa5\x8fd\xf8\xb7\x9e\ +\x11prr\xcaQG\x1d\xa0\xf3\x8dp,\xcd}\xd7\ +\xfb\x01U \x1b\xd3\xc5\xc5%\xaf\xf9\xda\xd0\xc7\xea\x1e\ +\xc9\xd0\x11\xbaj/8::f\xabk~\x8c\xde9\ +\xa1y\x0f:_\x8a\xe6Z\xe8,\x01r\xc8\x8f\xc2\x90\ +\xfd\x85\xecLu\xd0B<#\xde;[\x7f\xea\x00\x9d\ +NOS\xe7y\xc6\xf6vH\xf7\xe8\xbcqg\xebM\ +\x9d\xa0\xd1h\xc9\xea\xda\x07\xdd\x11.00\xf0\xcb\x7f\ +\xda\xf3\xf2o\x83\x99\x99\x99\xb7:\xe6\xff\xed\xe5T\xcf\ +1#\x87\xce\xee\xa03<\x9d\xad7uBSS\xd3\ +4!!awg\xeb\xba\xb9C\xba\xd6\xd7\xd7\xa7\xc5\ +\xc4\xc4T\xaa\x86\xa35)\xb4\x97\xbb\xb3\xf5\xa6N\xc0\ +\xe7\x9a\x84\xd6:;[\xe7-\xf55h\x7f\xa7\x97\x97\ +\xd7p\x18\xfeF\xe5\xb9x\x89\xcetv\xb6\xde\xd4\x0d\ +4G\xe8\x8c}#J\x87\xf6\x5c@\x1ez\xb7\xc4\x1b\ +\xb2\xf9\x91\xbd\xa5\x9a\x1e\xceEf\xb7\xc6\x06\xfe7\xa1\ +\x93\xce\xbf?k\xcd\xf9w\xb4\xae\x8e\xf6\x9d\xab\xe6M\ +JJ\xfa\x11\x9d\xf5\xef(\xfdt\x14\xd0\xda\x0a\xfaf\ +D{\xeb\x1e}\xdb\x03\xcd\x19Z\xcb\x17\xda\xe7\xd9\x9c\ +/4\x1fD\xdf\xbchO}t\x16\x90\x8d\x14\x1e\x1e\ +\xbe\xa4\xd9\xf9\xf969\xf4\xae\x10\xed\x8dh\xcb9\x22\ +\xb4\x16\xd5l\x1fd\x8d:\xd7\x08?5 \xbb\x0f}\ +\xdb\x06\xd9J\x1f3wCy\xd0>+X\x86\x10\x96\ +e\xae\x0e\x9e\xac\xac\xac\xc2\xd17\x8eT\xe9\xa09\xf7\ +\xff\xfa\xb7\xbf\xa8T\xaa\x11\x1a\xabQ\x9f\x8d\xde\xe7\xa2\ +o2eff^Bk\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a \x0a \x0a \ + \x0a\x0a\ +\x00\x00\x04S\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ + error / Editor \ +only\x0a \ + Created w\ +ith Sketch.\x0a \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x15\xcc\ +I\ +I*\x00j\x08\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ +\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ +-\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ +$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ +S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ +O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ +\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ +B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ +\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ +o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ +\xc4Sp\xd6`\x0e6\xb4\xd0\xc8\x02\xdf\xb91L\x14\ +3\x05\x0dH\x02PWX\x0b<\xe6\xc6\x80\x5c\xc0]\ +#XY\xa7}Vqx\x0a\xc5\xcfCJflB\ +\x90R\x86\x84\x9f \x22AA\x11\xd7\x9e\x85o X\ +\x828K-8\xb1\xe9G\xd5\xda96\x1d|\xf5\xa9\ +\xcf\x06>:G8)\xd2\x0a\x0c\x9e; \xa8>\x10\ +!1\xc5\xd4\xcf9vo\x1dw\x9b6f\xfaK\x12\ +\x04\x84\x14/RohL\xc3?\xa2\xf6s\xe5\xb1~\ ++~y\x5c\x80\x04\xf4\x99\xa4*\x0a<,G\xe3B\ +8\xbe\x81\x99(\x99\xbfK\x04\x1a\xac\xbf\x893\x9ej\ +\x00\xce\x91\xf0U\xa0\xa2r\xde\xd0\x92\xd0H\xd6\xab\xa4\ ++\xec\x1e\xabB)+bf\x13\x88(\xc6\x94\x1c\xa8\ +)\x9c\x82\x9dH)\xe2\xd0\x82I\x03\xde\x82\x06\xa8+\ +f\x924#\xe4\x13\x01%\x11\x1b\x0a\xd6\xaeQ*;\ +\x13\x8d\xe8+\xda\x8e\x1d\xc8)*\x82\x94\xc1\xa4\xa4l\ +\x22\xc9\x00\x02h\xcb\x01\x81\xf9-\x8c\x11R\x0a\x05\xa3\ +1\x08\x00)JA\xa1`\x92\xc8J\xd4\xd2\xa9\xc8\xc8\ +\xc4N\x16\xa0\xa6z\x0a\x01\xa2\xb3\x11\x1c\x02O\x03\xf8\ +a=\x9e\xa9y\xad?\x82g\xb5\x05%\x80\x02\xe22\ +y\xcf\x00 I=\x86\x11\x8a;5\xaa\xd4\x82\x9f6\ +\xa2\xf19j\x82\x89H\xa9\xea\xcf\x00B\x88eO\x97\ +j\x19\x9dQ\x8b\xc7\xf5LONh\x93BJ\xc1#\ +b=I*\x95\x82\x9bJ\x22F}l 2g\xe9\ +~\x8a\x9f\x14\xc4\xcb]\xa9\x918\xb6\x82\x94H(\x04\ +\x88\x9fm\x08U\x04\x9b\x88\xd5d\xb2H\x90\xdb\x1c\x8d\ +D\xe5\xa2\x0a%\xa2\xa3\xa4\xcaF\xab0\x01(\x90C\ +\xe8\xa1)2\x8d\xb6u\xa2\xbaY\xea]h\x86\xc2n\ +\x8b\xa4\xed \x80:\x22i\xc1!\x8bB~\xab&\xbd\ +\xf4\x06\x9e\xb7\xed\x9a\x82\x02\xc8\x89\xc72\x83\xd74\xc4\ +\xbd\xdc\xebm\xd6\x86@\x02\x9a@VULh\xdd\x04\ +\x92k\x1cNG \xa3\x8a*\x19\xcc\xb1|\xeb\x84\xae\ +WJ\x95\x85\xa1p\x012\x90\x0c\xc8\xa852\x9c\xeb\ +\x1dFg\x07U1\xfcb\xe2 \x08\xf1\x04\x912\xae\ +@\xb7\xe4J>H\x85D\xe5\xb2\x0a$\xa2'\xac\xca\ +\xec-\x19x+\x99Q\xc8\x849\x0fgX:\xf1\x9e\ +\xa8\xd9\xfa\x13\x13\x9a\x08(^\x88\x9bs(L\xb7\xc4\ +\xe7\xda\x0a\x02\x22%\x84\xca(\xea+\xf6\xa8\xa2\xea\xc8\ +DO\xa6\x82\xa8\x89\xb12\xb2\xabtO^\xde(\x89\ +\x932\x87\x1bLE\x9d\xad\x1bj\x0f\x13\xb8\xe8$\xc0\ +\x88nr\x96\xea\xb6\xee\xe8-\xe4\x88\x1a\x93,\xe1\x8f\ +\xeaK\xae\xd6\xa2pH7\x09/\xee[\xa6\xc0\xd8\xef\ +\x00\x07\x1e\x87\xf22\x97&\x96\xf0\x0bo.\xa1\xf3(\ +/7\xc3s\xbcW>ft=\x1a\x1d\xd2\x86\x9d:\ +'\xd5\xa8\xdd\xe2\x7f\xd6\xa0\x9dx\x01\xc3\xa1\xfcHi\ +\xc5\xad\x9cn\xf3\xc8r[\xf2\xf5\xdf'\xde\x00\x01\xe1\ +x\x88w\x8d\xe4->WD\x88\xf7\x1d\xd2\xed\xd4\xad\ +\x9e\x82{\xc1\x1b_(\x0ey}\x12j\x08\x05k\x94\ +\xe0v\xb7\xe6G\x22\x0a\x03\x22&\xbe\xb52\xecH\x8f\ +\xc4\xa1\x7fi\xdc\x22\x95\x99xk$\x0a\xb8\x82\x02s\ +\x12K\x13\x10\xd14\x22%\x04\x8a\x82\x14\xffI\xf4\x10\ +'&\xbd\x09\x81$,+\x88(?\x80\xe5\x14V\x9d\ +\xd0\xb4x \x91\xe2|\x05\x8c\xd7\xa2qLAB\xcc\ +\x1b]F4C\xa0\x90\xf5\x08KT#,J\xd8g\ +\x84Vd.\xa1QS\x1f\xa6\x84\x16\xa9\xf0d\xfd\x9e\ +|2,(\x00L\x10P\xcf\x0eJ\xb0zA\x22\x1d\ +\xbf\xb9R\xdc\x80\x05\xc9\x05\x08\xc4T^/x\x90\xe5\ +\x1a@\x00}\xe4D\xd0\x89\xb8|\xcab\x0cN-\xa8\ +\x00`A\x92$\xa2@b\x8cO\xb1\x5c\x89\x99\x01\xa0\ +\x0b\x12\xd8\xfc\x1adTQ \x90\xbf\x13K\xc4d\x8c\ +\xc4F4F\xa8\xd9\x1bL\x84pKq\xcc\x8aGS\ +\xe9\x1d\xe3\x0cy=1\x94\x82A\xa8\xf8\x9e#J|\ +\x8f\xe4J7H(\xe5\x1d#\xb4x.\xb1\xeaF\xc6\ +y!\x1f\xa4\x99\x10\x92\xb1\xc6B\x119\x0c\x0c\xe4C\ +\x08\x8cE\xb2N\x00\x09\x1cD#\xec\x92\x94$>Q\ +\xc891!\xe4\xd1t\x95\xb2\xbc\x87\xcb\x10a\x1a\xc9\ +\xdcn\x04*\xe4 \x12\x00(hG8\x07\x99B\xf0\ +\xe2\x8e\x82{-d\xbc\x85\x932&M\x90\x06k5\ +\x80\x00\x82\x8f\xe0\xb0\x88L*\x0a\x04\x86\x83\x06\x11\x07\ +\xac.'\x14\x8a\xc5\xa1,\xc8\xc8*\x10\x88\x84\x1b!\ +\x00\x18\xbb\xec\x03$A\x0c\xa4\xe8\x89 \x05\xf9\x17\x96\ +\xcb\xa2\x8d\x09\x88\xb1\xf94i\xcb\xe1J!\x9c\xe8\xbf\ +7\x9e\xcf\xa7\xf4\x08\xbb\xfe\x87A\xa2\xd1\xa8\xf18\x14\ +\x0e\x11\x07\x9b\xc3@\x90\xf8\x8d\x22z\xda\xaa\x81\xdeU\ +\x86D aS\x82\xad\x86\x96\x02]v\x7f1hL\ +\xe6\xb4\x09\xcc\xee\xc7l\xb6\xcbho\xfbu\xca\xe7J\ +\x82A\xa7\xb4\xfa\x88\xc2%s\x89\xc6Y\x88xA\xe2\ +\xe7*4N\x86i\x9b\xecN\xcbg~M\xa7\xf6\xa1\ +\x9c\xf3\x15\x94\xae\xdc2\xb9\x8a\x0d\xd6\x99x\x87D/\ +y[\xf8>\x10\xeb\x84\x01r\x8e\x9c8jT\xfe\xca\ +\xe3&\x98\xebN\x1f'\x99\xda\xcf\xb2\xfbm\xcc_7\ +w\xa7g\xaaYFw\x08\x8a\xfe\xe2\xae\xb6\xd4\xf1>\ +}\xb5\xae\x99l1\xf3\xec\x8e\xd3u\xd4\x8an:\xbd\ +\x88.\xf0\x01M\x97\xdes\xf7\xccU\xfc\xa3\x08Wu\ +\x06v\x01\xa3;\x9bf\xe7\xec\xad}\x9f\x8c\x17\xaf\xf2\ +\xddv\xfb\xb2\xee\xff\x03\x14\xcf\xfe\x8c\x0f\xd8\x00\xcfm\ +\x80\x88\x10\x13\x0b s\xb9\xecc]\x04\xf5\xd2}_\ +\x17\xd2\x0fm_vuPx\x19U\xc0\x02R\x9c\xc4\ +\x14#e\x0b\xf7\xa4Bm\x9a\xf5\xa1\x90l\xe1'b\ +\x11\x8a\x19XQ\xbe\x85\x9f\xb6a\x7f\x15\x90\x82\xa5r\ +?\x008\xe0@\x0cc\xb3\x16#s\xa2WF'\x8a\ +\xdb\xa8\xaaC_b\xd7y\xbfh\x1dE\xfczB\x08\ +D\x81@>\x90\x81\x99\xe9(]X\x91\xb1\x89\x9f\x09\ +\x19\xb5\x91e\xd5\xbaH~d\xa7\x85\xd8R\x88e\xc0\ +yP\x06W\xa4\x9c|\xa5\x9817\x83\xa6\x06f_\ +\x9d\x169\x89-~\xa4\xb7eJ\x1d\x97\x02%@\x15\ +\x9e\x92\xaeo\x8f\xe5\xa9\x06\x5c\x9d\xd8\xa9\xda\x8bR'\ +\x94^{\x99]Y\xfa\x80\xa0\xa8J\x19\xed\x90 \xd9\ +\x0a\x8e_h\xdayE\xa4\x11jI\xf2\xa5T:\x05\ +?\xa0\xd6\x0a\x15\xf1\x9c\x1e\xf6J\xa1\xa7\xd4J\xc9l\ +\xa8\xd1Z\x95\xf1R\x85\xc5\xc0\xa3Oc\x80\x0c<\x8e\ +\xc3\x18\xf6\xae\xa1\xe7\x14\xbes\xadV\xda\x82\xcbOk\ +tR\xb9vMKP\x12>-sY\x08\x05\xd1s\ +V\x04\x02\x03(\x1c,\x94\xecjj\x88\xa7(\xab9\ +S\xb3n\x94\xba\xd0D\xed'\xd5\x7f\x0a\x11\xc4 )\ +J\x8c\xb0\x0a\xf9\x1d\xec3\x96(\xab\xe5\xba\xc6\xece\ +\xabL\x0a\xa2@\x97gr\x15^\xa9<\x16\xfe\xb1\xeb\ +\x07O\x0dPn\xbcII\xc1\xd9\xc8\xbb\x0b\xc5d;\ +\xfe\x89\xc0q\xb5\x03\x14\xc8\x10\x8b\xb9\x0b\xbc2;\x92\ +\x0b\xc42\x84\xff\x22\xca2T+'\xcb%\x8c?\x00\ +\xc4s5\x0b\x04\xce\x11\x5c\xc1\x09\xcc\xb3\xb8\xfa\xe5\xb2\ +\x12\xeb+@E\xb2\xec\x8dJ/\x90\x81\x05=J\x85\ +E\xc0\xf8\xd1\x9f\x10\x81\x08%4\xe4\x90\xa0I\xc3!\ +\x87S\xceW\x1dy\x0bR\xaa\xd0\x00T\xd8vt$\ +\x8da\xc7M\xa1\x13\xd22\x05(oB\x09\x0d\xb7h\ +\x14Xr\xc3uB\xb6\xfcl\xd8\xdf\x80\xd3\xd7\x81t\ +\x01\xfd\xeb,2\xd8p\xe9\x08K8W\xcf:\xda\x12\ +\xa0\x01\x7f\x88\x90R\xe1\xa6\xe3.\xc3\xd1*\x0d\x98s\ +_|\xca9\xecK\x90BVP\xc5\xb0\x95\xd0P\xb7\ +\x97\xa2\xcc \x1b\xad\x18B\xee\xc0\xdeBz\x0c\x83\xb4\ +\xea\xbb~\xe2\xe9\xed\xbb\x9e\xf3\xbd\x9d;\xbe\xfb\xc1\xf0\ +\x9f/\x03\xc3\xf1\xbcy\xd7\x8e\xf2<\xbf1\xf5\xf1|\ +\xdfC\xd1\xc8|\xafK\xd5\xf5\x96\xef?\xd7\xf6\xbd\xbf\ +g\xdb\xf7\xbd/w\xdf\xf8\xbc\xbf\x87\xe3\xf9\xbc/\x97\ +\xe7\xfa\xbb\x9f\xa7\xeb\xfb\xb8\xcf\xb7\xef\xfc\xb6\x8f\xc7\xf3\ +\xfd\xb4o\xd7\xf7\xfe\xb2\xc4\x04\x13\x00\xfe\x00\x04\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00`\ +\x00\x00\x00\x01\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x02\ +\x01\x03\x00\x04\x00\x00\x00T\x09\x00\x00\x03\x01\x03\x00\x01\ +\x00\x00\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\ +\x01\x03\x00\x01\x00\x00\x00\x04\x00\x00\x00\x16\x01\x04\x00\x01\ +\x00\x00\x00`\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00b\ +\x08\x00\x00\x1a\x01\x05\x00\x01\x00\x00\x00\x5c\x09\x00\x00\x1b\ +\x01\x05\x00\x01\x00\x00\x00d\x09\x00\x00\x1c\x01\x03\x00\x01\ +\x00\x00\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\ +\x00\x00\x001\x01\x02\x00\x10\x00\x00\x00l\x09\x00\x00=\ +\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00R\x01\x03\x00\x01\ +\x00\x00\x00\x02\x00\x00\x00S\x01\x03\x00\x04\x00\x00\x00|\ +\x09\x00\x00s\x87\x07\x00H\x0c\x00\x00\x84\x09\x00\x00\x00\ +\x00\x00\x00\x08\x00\x08\x00\x08\x00\x08\x00\x802\x02\x00\xe8\ +\x03\x00\x00\x802\x02\x00\xe8\x03\x00\x00paint\ +.net 4.0.9\x00\x01\x00\x01\x00\x01\ +\x00\x01\x00\x00\x00\x0cHLino\x02\x10\x00\x00m\ +ntrRGB XYZ \x07\xce\x00\x02\x00\ +\x09\x00\x06\x001\x00\x00acspMSFT\x00\ +\x00\x00\x00IEC sRGB\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\ +\x00\xd3-HP \x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x11cprt\x00\x00\x01P\x00\ +\x00\x003desc\x00\x00\x01\x84\x00\x00\x00lw\ +tpt\x00\x00\x01\xf0\x00\x00\x00\x14bkpt\x00\ +\x00\x02\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\x18\x00\ +\x00\x00\x14gXYZ\x00\x00\x02,\x00\x00\x00\x14b\ +XYZ\x00\x00\x02@\x00\x00\x00\x14dmnd\x00\ +\x00\x02T\x00\x00\x00pdmdd\x00\x00\x02\xc4\x00\ +\x00\x00\x88vued\x00\x00\x03L\x00\x00\x00\x86v\ +iew\x00\x00\x03\xd4\x00\x00\x00$lumi\x00\ +\x00\x03\xf8\x00\x00\x00\x14meas\x00\x00\x04\x0c\x00\ +\x00\x00$tech\x00\x00\x040\x00\x00\x00\x0cr\ +TRC\x00\x00\x04<\x00\x00\x08\x0cgTRC\x00\ +\x00\x04<\x00\x00\x08\x0cbTRC\x00\x00\x04<\x00\ +\x00\x08\x0ctext\x00\x00\x00\x00Copyr\ +ight (c) 1998 He\ +wlett-Packard Co\ +mpany\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00\x12sRGB IEC61966\ +-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12\ +sRGB IEC61966-2.\ +1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\ +\x01\x00\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ +\x00\x00\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\x90X\ +YZ \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\x85\x00\ +\x00\x18\xdaXYZ \x00\x00\x00\x00\x00\x00$\xa0\x00\ +\x00\x0f\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\x00\x00\ +\x00\x00\x16IEC http://ww\ +w.iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x16IEC http://w\ +ww.iec.ch\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00.IEC 61966-2.1\ + Default RGB col\ +our space - sRGB\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00.IEC \ +61966-2.1 Defaul\ +t RGB colour spa\ +ce - sRGB\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00,Refer\ +ence Viewing Con\ +dition in IEC619\ +66-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00,Reference View\ +ing Condition in\ + IEC61966-2.1\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00view\x00\x00\x00\x00\x00\ +\x13\xa4\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\xcc\x00\ +\x04\x13\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ \x00\ +\x00\x00\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\xe7m\ +eas\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8f\x00\ +\x00\x00\x02sig \x00\x00\x00\x00CRT c\ +urv\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\ +\x0a\x00\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00-\x00\ +2\x007\x00;\x00@\x00E\x00J\x00O\x00T\x00\ +Y\x00^\x00c\x00h\x00m\x00r\x00w\x00|\x00\ +\x81\x00\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa4\x00\ +\xa9\x00\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\ +\xd0\x00\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\ +\xfb\x01\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01%\x01\ ++\x012\x018\x01>\x01E\x01L\x01R\x01Y\x01\ +`\x01g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\ +\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\ +\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\ +\x1d\x02&\x02/\x028\x02A\x02K\x02T\x02]\x02\ +g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\ +\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\ +\x0b\x03\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03\ +f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\ +\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04\ +-\x04;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\ +\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\ +\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\ +\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\ +\x06\x06\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\ +\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\ +\x19\x07+\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\ +\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08\ +F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\ +\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\ +\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a\ +=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\ +\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\ +\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0c\ +u\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d\ +@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\ +\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\ +\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\ +\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\ +\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\ +\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\ +\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\x83\x13\ +\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\ +\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\ +\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\ +\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\ +\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19\ + \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1a\ +Q\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\ +\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\ +\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\ +\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1f\ +i\x1f\x94\x1f\xbf\x1f\xea \x15 A l \x98 \ +\xc4 \xf0!\x1c!H!u!\xa1!\xce!\xfb\x22\ +'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#8#f#\ +\x94#\xc2#\xf0$\x1f$M$|$\xab$\xda%\ +\x09%8%h%\x97%\xc7%\xf7&'&W&\ +\x87&\xb7&\xe8'\x18'I'z'\xab'\xdc(\ +\x0d(?(q(\xa2(\xd4)\x06)8)k)\ +\x9d)\xd0*\x02*5*h*\x9b*\xcf+\x02+\ +6+i+\x9d+\xd1,\x05,9,n,\xa2,\ +\xd7-\x0c-A-v-\xab-\xe1.\x16.L.\ +\x82.\xb7.\xee/$/Z/\x91/\xc7/\xfe0\ +50l0\xa40\xdb1\x121J1\x821\xba1\ +\xf22*2c2\x9b2\xd43\x0d3F3\x7f3\ +\xb83\xf14+4e4\x9e4\xd85\x135M5\ +\x875\xc25\xfd676r6\xae6\xe97$7\ +`7\x9c7\xd78\x148P8\x8c8\xc89\x059\ +B9\x7f9\xbc9\xf9:6:t:\xb2:\xef;\ +-;k;\xaa;\xe8<' >`>\xa0>\xe0?\ +!?a?\xa2?\xe2@#@d@\xa6@\xe7A\ +)AjA\xacA\xeeB0BrB\xb5B\xf7C\ +:C}C\xc0D\x03DGD\x8aD\xceE\x12E\ +UE\x9aE\xdeF\x22FgF\xabF\xf0G5G\ +{G\xc0H\x05HKH\x91H\xd7I\x1dIcI\ +\xa9I\xf0J7J}J\xc4K\x0cKSK\x9aK\ +\xe2L*LrL\xbaM\x02MJM\x93M\xdcN\ +%NnN\xb7O\x00OIO\x93O\xddP'P\ +qP\xbbQ\x06QPQ\x9bQ\xe6R1R|R\ +\xc7S\x13S_S\xaaS\xf6TBT\x8fT\xdbU\ +(UuU\xc2V\x0fV\x5cV\xa9V\xf7WDW\ +\x92W\xe0X/X}X\xcbY\x1aYiY\xb8Z\ +\x07ZVZ\xa6Z\xf5[E[\x95[\xe5\x5c5\x5c\ +\x86\x5c\xd6]']x]\xc9^\x1a^l^\xbd_\ +\x0f_a_\xb3`\x05`W`\xaa`\xfcaOa\ +\xa2a\xf5bIb\x9cb\xf0cCc\x97c\xebd\ +@d\x94d\xe9e=e\x92e\xe7f=f\x92f\ +\xe8g=g\x93g\xe9h?h\x96h\xeciCi\ +\x9ai\xf1jHj\x9fj\xf7kOk\xa7k\xffl\ +Wl\xafm\x08m`m\xb9n\x12nkn\xc4o\ +\x1eoxo\xd1p+p\x86p\xe0q:q\x95q\ +\xf0rKr\xa6s\x01s]s\xb8t\x14tpt\ +\xccu(u\x85u\xe1v>v\x9bv\xf8wVw\ +\xb3x\x11xnx\xccy*y\x89y\xe7zFz\ +\xa5{\x04{c{\xc2|!|\x81|\xe1}A}\ +\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\ +\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\ +\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\ +\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\ +\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d\ +1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90\ +n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\ +\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\ +\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\xfc\x9a\ +h\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\ +\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1\ +G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\ +\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8\ +R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\ +\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\ +\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb3\ +8\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\ +\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\ +\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\ +\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2\ +_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6\ +F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca\ +8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce\ +6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2\ +?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6\ +U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xda\ +v\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\ +\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\ +\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\ +\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xeb\ +p\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\ +\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf4\ +4\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\ +\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd\ +)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\ +\x00\x00\x03\xa4\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Default - Update\ +d\x0a Created with\ + Sketch.\x0a\ + \x0a \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x04\x84\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +error / Not act\ +ive \x0a \ + Created w\ +ith Sketch.\x0a \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x04i\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ + Editor only - U\ +pdated\x0a \ + Created\ + with Sketch.\x0a <\ +/defs>\x0a \x0a \ +\x0a \ +\x0a\x0a\ +\x00\x00\x15\x0a\ +I\ +I*\x00\xa8\x07\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ +\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ +-\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ +$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ +S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ +O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ +\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ +B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ +\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ +o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ +\xc4Sp\xd6`\x0e6\xb5 \x05\xc1E0P\xcc\x14\ +5\x05\x09A]pW6r\x0a\xd6\xc6\x80_U\x9c\ +^\x02\xb1s\xd0\xd2\xa4\x01H)B\x0aO\x82\x91 \ +\xa0\x88\xeb\xce\x0a\xb7\x82\xac`\xab-\x0b\xd2\x8f\xa5\xb4\ +p,:\x99\xec\x80\x19\x059\xc1N\x90^<\xed\xd9\ +\x05A\xc1S\x1a\x1d\x1c\xf3\x85f\xeb\xd7x\x93i\x01\ +b\x0a\x90\x82\x85\xeaM\xe8)\x9bB\xbd\x9c\xf6l^\ +\xaa\xdfnW \x01AP\xb0S\xc5\x89\xf9\x058\xe8\ +R\x93?e\x83\xfa\xac\xbd\xcb\x82\x04\x03 \xa5Z\x0a\ +'.\x84\xb3B5\xaa\xe9\x0a\xfa\xff\xaa\xd0\x0aJ\x90\ +\x13\x88(\xc6\x94\x1c\xa8)\x9c\x82\x9dH)\xe2\xcc<\ +((j\x82\xb5\x898\xf8\xd0\xbeiD \xc2\xb4\xeb\ +\x94$\x8e\xa4\x03{\xbe\x8e\x9d\xc8)*\x82\x94\xcd\x09\ +\xb0\x8b$\x00\x0a\x0a\x18 \xa3\x04,\x82\xb2(\xc4\x1c\ +\x00\x0aM\x09a\x09\xc5\xab\xacV\xaaE\xf22\x04\x16\ +\xa0\xa6z\x0a\x01\xa2\xb29\x1c\x82\x8f\xed\x09\xeb\x06\x82\ +q\x9a\x08.#-\xb2\x08\x1240\xeca&\xae\x92\ +z\xa7(\xa2\xe9\x01j\x82\x89H\xac\xbe\x82\x0a-\x09\ +v\xa1\xa4\x02\xf2\x0aOJ\xe8\xa9*\xd0\x8d\x88\xf4\xdc\ +\xabP\xea|\xe0\xbb B\x02\x0a_\xa2\xa7\xc4\xe8\xd0\ +\xd2\x0ab@-\xa0\xa5\x12\x0a\xf8\xa2\x07\xda\x0a\x154\ +&\xe25D\xaa\x95\x22\x9bE\xa2)\x01h\x82\x89h\ +\xa8\xe8\xd0\x91\xad\x22\x04\xfd\xa0\x90b(J4#m\ +G6.u2\x99T!\x8e2\x0a\xe7\xa0\x80:\x22\ +i\xa0\xa1\x8bB~\xd6G\xf8\x1a\x82\xd4H ,\x88\ +\x9cm\x08=]\xc8\xeb\xddx\xb6X\x08Z@)\xa0\ +\xa5b*74$\x9a\xc6\x90Kh \xe2\x8a\x86m\ +\x0c7,\xdbk}|\xa5\xdb\xa8R@L\xbc\xa8\xa8\ +4\xd0\x9c\xf7:\x04\x1d \xa6**<4$Ly\ +x\xad\xd7\x9a\x95z\xa1)\x01l\x82\x89(\x89\xea\xd0\ +\xb9\xab:@\x0a\xc3\x88\xac\x14\xc6\xd6\xc9n\x10\xb6\xe1\ +J>\x18\x84$\x06\x82\x0a\x17\xa2&\xdbB\x13^H\ +\x15<\x82\x00\x88\x89`\xd0\x8a8=\xb2\xbcd*6\ +F\x83\xa4\x13P\x01\x8c\x22\x06\xc3B\xc9\xe1(\x15%\ +b\xa2&KB\x1cf\xcb\xf6r\xa2\xe7h2@\xdf\ + \x92*\x1f\xa11\xba&A\xa3 \xb62 j4\ +2\xa5\xe1\x9b\xc9\xd8\xfb\x18\xc7f\xda\xa0\x01\xab!\xda\ +\xc0\x03\xad-\x89\x06\x8e\x00k\xc8~\xc0\xc6\xecX\xf6\ +\xc96\xec\xcb\x1e\xa2\xa8\x1f\xfbV\xd8\x86\xed\xdb\x83L\ +\x7f\xee{\xaa\x1d\xbb\x80;\xca'\xa7\xb5[\xea\xc5\xbf\ +\xa0\x9a\x9c\x88\x88\xf0\xb9o\x11\xae\xa2\x9aJ\x80\xf0fD\x18aE\ +\x81\xad\xa4d\xbal\xdaU,\x81\xcb\xa6\xd3\x18\x1c\xce\ +\xa5\x5c\xae\xceb\xb5\xeb\x0d\x8a\x0d@\x00Af\xd40\ +\x0c:\xc7\x09\x95!\xe0\xc7\x8b`\x00\xd1#L\xdc\xa1\ +\x15Il\xde\xb2\x00\xad\xdd\xef\xf3\xb9\xd6\x03\x076\xb2\ +\xd9\xe6\xb6\x9b]\xb2T\x0f\x83:\xe0\xc0[\x93\xa6\x0c\ +\x1a\x91\xbf\xae\xf7\x9a\xb5\xeee\x84\xce\xcb\xf0Y\xed\x0c\ +G\x0dB\x91\xe2\xacr\xa2,\x19u\xa1\x13\xc8\xdbY\ +\x88\xadT\x01W\x9a\xdf/\xda-\xccR\xc1\xba\xde\xc0\ +\xf4\x96\x8d6\xc5\xfeQ\x83+\xb4#9\x1b;\x87\xb3\ +\xda\xcd6\xfb\xed\xf6\x83\xa3\xa2\xe0b8W)U2\ +\x06\xcf\xd0\x84\xe4n\xeee\xea\xb1\x9c\xeanz~l\ +\xefZi\x89\xe1\x80\xa0\xdb\x08\x18\x8e\xe4\xbf\x91\x90\xb0\ +\x99\x9d\xa6n\xb5\xe9\xd1z\x1f\xd6\x01\xebK\xde\xd6\x0d\ +*\x15\x90b\xa5aIP1\x01#1_\x86\xc9\xe3\ +m\x9eX\x02\x10?\xe1W\xa9\x06a\xde\xc7a\x9eJ\ +\x87\xa4\x18\x84G\x13s\xe9\x06\x19\x922\x85\xfe\x84Y\ +\xa7\x91\xfc\x86 V\xf2/_\xe0$\xa2\x04n\x92\xa2\ +\x19\x06\x1eSq\x95#'\x1d(\xad\xfa\x8bW\xd8\xc9\ +\x80\x7f\xe4U\x864I\xe3g\x9d\x15\x1d\x90b%7\ +\x15\x922\xae@J\xe1'>\x14\x92\x1a\x88\xc6[X\ +\xa4\xa4\x9aL\x8a\x8f\xf9=\x03\x94SiM\x0c\x95[\ +\xd7\xe5\xceK\xdd\x09z\x5c\x85\xe7\x19~\x1aiTI\ +\xb2N\x94%)RVs_\xb9\x12tXdz\x09\ +>\x98\x119\x89\xa1J\x85\xc4\x18\xa3M\xc3\xc8:~\ +\x96&\xf9j\x85ShJY;\xa1\xd1*&\x1eE\ +A$\x18\xd6A\x81tL\xd5A\x83$\x8e%\x9ee\ +x\xb2\x13\x8b\xa9\x9a^]\xac\x13\xdam\x11\xa7d\xd3\ +\xfc(F\x10`\xa5\x062\xd0a\xdd#9^\x99\xb6\ +\x80n+4\xf2\x98\xb2\x13J\xd5\x10\xad\xec\xbaJ\xad\ +\x96j\xfbA8\xb2\xadT\x9a\xcdC\xec\xfbbc\x9f\ +\xe4;\x1e\xddg\xeb+\x89(\xb6\x90\x9br\xe5\x85\xad\ +\xfa\xba\x81\xba\xae9\xce\xef\xb9\xa7g\x06x\xbc\xab\x8b\ +\xb2\xd3\xbb\xafu~\xf1\xbf\x13\xfb\xd1\xd7\xbd\xaf\xf6v\ +\xc5\xb80K\xf7\x08D\x8b\xe4\x18AM\xc5D\x18\xf8\ +\xc2\x9a \x81\x06%\x13r\x81\x06\x18q4\xa6\xe4\xc7\ +\x00\x09\xac\x00\xc41\xfcL\x8dA\x87L\x91x\xc7\xb1\ +\xc1\xbd\x06$2\x9c)\xc5@\xcb\x0c\xc1\x06\xb5\xf0@\ +6\x12\x07\xf3[\x8a\xbf@\xc3\xa4\x1a\x0b\xcds{\xc9\ +#\x00\x12\xa7\xdd\x03.\x19\x0c\xf2\x99=\x10`\xd9#\ +5\xf4K\xffT\xba\xb4f\xec\xff\x0cPh\xa5\x03\x0b\ +t\xd9\x14\xc2\xc6\x923{Y\xd85m\x83i\xda\xac\ +\xbd\xa3k\xdb\xb6\xf9{m\xdc7=\xd2\xc4\xca\xf7]\ +\xe3y\xdd\xaf\xed\xeb}\xdf\xaa\xbd\xff\x81\xe0\xa9\xed\xf3\ +\x83\xe1\xb8usr\xe28\xbe1m\xdd\xf8\xdeC\x91\ +\xe3\xb8^K\x95\xe5\xb8\xae[\x99\xde\xb9\x8ek\x9d\xdc\ +\xf9\xce{\xa1\xda\xba\x0e\x8b\xa5\xd0\xf8\xfe\x9b\xa9\xdb\xfa\ +N\xab\xad\xc1\x10\x10\x00\x13\x00\xfe\x00\x04\x00\x01\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x04\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x01\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ +\x00\x04\x00\x00\x00\x92\x08\x00\x00\x03\x01\x03\x00\x01\x00\x00\ +\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00\x11\x01\x04\x00\x01\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\ +\x00\x01\x00\x00\x00\x04\x00\x00\x00\x16\x01\x04\x00\x01\x00\x00\ +\x00`\x00\x00\x00\x17\x01\x04\x00\x01\x00\x00\x00\x9f\x07\x00\ +\x00\x1a\x01\x05\x00\x01\x00\x00\x00\x9a\x08\x00\x00\x1b\x01\x05\ +\x00\x01\x00\x00\x00\xa2\x08\x00\x00\x1c\x01\x03\x00\x01\x00\x00\ +\x00\x01\x00\x00\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x001\x01\x02\x00\x10\x00\x00\x00\xaa\x08\x00\x00=\x01\x03\ +\x00\x01\x00\x00\x00\x02\x00\x00\x00R\x01\x03\x00\x01\x00\x00\ +\x00\x02\x00\x00\x00S\x01\x03\x00\x04\x00\x00\x00\xba\x08\x00\ +\x00s\x87\x07\x00H\x0c\x00\x00\xc2\x08\x00\x00\x00\x00\x00\ +\x00\x08\x00\x08\x00\x08\x00\x08\x00\x802\x02\x00\xe8\x03\x00\ +\x00\x802\x02\x00\xe8\x03\x00\x00paint.n\ +et 4.0.9\x00\x01\x00\x01\x00\x01\x00\x01\ +\x00\x00\x00\x0cHLino\x02\x10\x00\x00mnt\ +rRGB XYZ \x07\xce\x00\x02\x00\x09\x00\ +\x06\x001\x00\x00acspMSFT\x00\x00\x00\ +\x00IEC sRGB\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3\ +-HP \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x11cprt\x00\x00\x01P\x00\x00\x00\ +3desc\x00\x00\x01\x84\x00\x00\x00lwtp\ +t\x00\x00\x01\xf0\x00\x00\x00\x14bkpt\x00\x00\x02\ +\x04\x00\x00\x00\x14rXYZ\x00\x00\x02\x18\x00\x00\x00\ +\x14gXYZ\x00\x00\x02,\x00\x00\x00\x14bXY\ +Z\x00\x00\x02@\x00\x00\x00\x14dmnd\x00\x00\x02\ +T\x00\x00\x00pdmdd\x00\x00\x02\xc4\x00\x00\x00\ +\x88vued\x00\x00\x03L\x00\x00\x00\x86vie\ +w\x00\x00\x03\xd4\x00\x00\x00$lumi\x00\x00\x03\ +\xf8\x00\x00\x00\x14meas\x00\x00\x04\x0c\x00\x00\x00\ +$tech\x00\x00\x040\x00\x00\x00\x0crTR\ +C\x00\x00\x04<\x00\x00\x08\x0cgTRC\x00\x00\x04\ +<\x00\x00\x08\x0cbTRC\x00\x00\x04<\x00\x00\x08\ +\x0ctext\x00\x00\x00\x00Copyrig\ +ht (c) 1998 Hewl\ +ett-Packard Comp\ +any\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\ +\x12sRGB IEC61966-2\ +.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x12sR\ +GB IEC61966-2.1\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\ +\x00\x00\x01\x16\xccXYZ \x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\x00\x00\ +\x00\x00\x00o\xa2\x00\x008\xf5\x00\x00\x03\x90XYZ\ + \x00\x00\x00\x00\x00\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\ +\xdaXYZ \x00\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\ +\x84\x00\x00\xb6\xcfdesc\x00\x00\x00\x00\x00\x00\x00\ +\x16IEC http://www.\ +iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x16IEC http://www\ +.iec.ch\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\ +.IEC 61966-2.1 D\ +efault RGB colou\ +r space - sRGB\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00.IEC 61\ +966-2.1 Default \ +RGB colour space\ + - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00des\ +c\x00\x00\x00\x00\x00\x00\x00,Referen\ +ce Viewing Condi\ +tion in IEC61966\ +-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00,\ +Reference Viewin\ +g Condition in I\ +EC61966-2.1\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00view\x00\x00\x00\x00\x00\x13\xa4\ +\xfe\x00\x14_.\x00\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\ +\x0b\x00\x03\x5c\x9e\x00\x00\x00\x01XYZ \x00\x00\x00\ +\x00\x00L\x09V\x00P\x00\x00\x00W\x1f\xe7mea\ +s\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\ +\x02sig \x00\x00\x00\x00CRT cur\ +v\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\ +\x0f\x00\x14\x00\x19\x00\x1e\x00#\x00(\x00-\x002\x00\ +7\x00;\x00@\x00E\x00J\x00O\x00T\x00Y\x00\ +^\x00c\x00h\x00m\x00r\x00w\x00|\x00\x81\x00\ +\x86\x00\x8b\x00\x90\x00\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\ +\xae\x00\xb2\x00\xb7\x00\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\ +\xd5\x00\xdb\x00\xe0\x00\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\ +\x01\x01\x07\x01\x0d\x01\x13\x01\x19\x01\x1f\x01%\x01+\x01\ +2\x018\x01>\x01E\x01L\x01R\x01Y\x01`\x01\ +g\x01n\x01u\x01|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\ +\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\ +\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02\ +&\x02/\x028\x02A\x02K\x02T\x02]\x02g\x02\ +q\x02z\x02\x84\x02\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\ +\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\ +\x16\x03!\x03-\x038\x03C\x03O\x03Z\x03f\x03\ +r\x03~\x03\x8a\x03\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\ +\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\x13\x04 \x04-\x04\ +;\x04H\x04U\x04c\x04q\x04~\x04\x8c\x04\x9a\x04\ +\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\ +\x1c\x05+\x05:\x05I\x05X\x05g\x05w\x05\x86\x05\ +\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\ +\x16\x06'\x067\x06H\x06Y\x06j\x06{\x06\x8c\x06\ +\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07\ ++\x07=\x07O\x07a\x07t\x07\x86\x07\x99\x07\xac\x07\ +\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\x1f\x082\x08F\x08\ +Z\x08n\x08\x82\x08\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\ +\xfb\x09\x10\x09%\x09:\x09O\x09d\x09y\x09\x8f\x09\ +\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0a\ +T\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\ +\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\ +\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\ +\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0d\ +Z\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e\ +.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\ +\x09\x0f%\x0fA\x0f^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\ +\xec\x10\x09\x10&\x10C\x10a\x10~\x10\x9b\x10\xb9\x10\ +\xd7\x10\xf5\x11\x13\x111\x11O\x11m\x11\x8c\x11\xaa\x11\ +\xc9\x11\xe8\x12\x07\x12&\x12E\x12d\x12\x84\x12\xa3\x12\ +\xc3\x12\xe3\x13\x03\x13#\x13C\x13c\x13\x83\x13\xa4\x13\ +\xc5\x13\xe5\x14\x06\x14'\x14I\x14j\x14\x8b\x14\xad\x14\ +\xce\x14\xf0\x15\x12\x154\x15V\x15x\x15\x9b\x15\xbd\x15\ +\xe0\x16\x03\x16&\x16I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\ +\xfa\x17\x1d\x17A\x17e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\ +\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19\ +E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1a\ +w\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\ +\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\ +\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e\ +@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\ +\x94\x1f\xbf\x1f\xea \x15 A l \x98 \xc4 \ +\xf0!\x1c!H!u!\xa1!\xce!\xfb\x22'\x22\ +U\x22\x82\x22\xaf\x22\xdd#\x0a#8#f#\x94#\ +\xc2#\xf0$\x1f$M$|$\xab$\xda%\x09%\ +8%h%\x97%\xc7%\xf7&'&W&\x87&\ +\xb7&\xe8'\x18'I'z'\xab'\xdc(\x0d(\ +?(q(\xa2(\xd4)\x06)8)k)\x9d)\ +\xd0*\x02*5*h*\x9b*\xcf+\x02+6+\ +i+\x9d+\xd1,\x05,9,n,\xa2,\xd7-\ +\x0c-A-v-\xab-\xe1.\x16.L.\x82.\ +\xb7.\xee/$/Z/\x91/\xc7/\xfe050\ +l0\xa40\xdb1\x121J1\x821\xba1\xf22\ +*2c2\x9b2\xd43\x0d3F3\x7f3\xb83\ +\xf14+4e4\x9e4\xd85\x135M5\x875\ +\xc25\xfd676r6\xae6\xe97$7`7\ +\x9c7\xd78\x148P8\x8c8\xc89\x059B9\ +\x7f9\xbc9\xf9:6:t:\xb2:\xef;-;\ +k;\xaa;\xe8<' >`>\xa0>\xe0?!?\ +a?\xa2?\xe2@#@d@\xa6@\xe7A)A\ +jA\xacA\xeeB0BrB\xb5B\xf7C:C\ +}C\xc0D\x03DGD\x8aD\xceE\x12EUE\ +\x9aE\xdeF\x22FgF\xabF\xf0G5G{G\ +\xc0H\x05HKH\x91H\xd7I\x1dIcI\xa9I\ +\xf0J7J}J\xc4K\x0cKSK\x9aK\xe2L\ +*LrL\xbaM\x02MJM\x93M\xdcN%N\ +nN\xb7O\x00OIO\x93O\xddP'PqP\ +\xbbQ\x06QPQ\x9bQ\xe6R1R|R\xc7S\ +\x13S_S\xaaS\xf6TBT\x8fT\xdbU(U\ +uU\xc2V\x0fV\x5cV\xa9V\xf7WDW\x92W\ +\xe0X/X}X\xcbY\x1aYiY\xb8Z\x07Z\ +VZ\xa6Z\xf5[E[\x95[\xe5\x5c5\x5c\x86\x5c\ +\xd6]']x]\xc9^\x1a^l^\xbd_\x0f_\ +a_\xb3`\x05`W`\xaa`\xfcaOa\xa2a\ +\xf5bIb\x9cb\xf0cCc\x97c\xebd@d\ +\x94d\xe9e=e\x92e\xe7f=f\x92f\xe8g\ +=g\x93g\xe9h?h\x96h\xeciCi\x9ai\ +\xf1jHj\x9fj\xf7kOk\xa7k\xfflWl\ +\xafm\x08m`m\xb9n\x12nkn\xc4o\x1eo\ +xo\xd1p+p\x86p\xe0q:q\x95q\xf0r\ +Kr\xa6s\x01s]s\xb8t\x14tpt\xccu\ +(u\x85u\xe1v>v\x9bv\xf8wVw\xb3x\ +\x11xnx\xccy*y\x89y\xe7zFz\xa5{\ +\x04{c{\xc2|!|\x81|\xe1}A}\xa1~\ +\x01~b~\xc2\x7f#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\ +\x0a\x81k\x81\xcd\x820\x82\x92\x82\xf4\x83W\x83\xba\x84\ +\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\x0e\x86r\x86\xd7\x87\ +;\x87\x9f\x88\x04\x88i\x88\xce\x893\x89\x99\x89\xfe\x8a\ +d\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\ +\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\ +\xd6\x91?\x91\xa8\x92\x11\x92z\x92\xe3\x93M\x93\xb6\x94\ + \x94\x8a\x94\xf4\x95_\x95\xc9\x964\x96\x9f\x97\x0a\x97\ +u\x97\xe0\x98L\x98\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\ +\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e\ +@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\ +\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa5\ +8\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\ +\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\ +\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\ +\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\ +\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7\ +h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb\ +.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\ +\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\ +\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\ +\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\ +\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\ +\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\ +\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\ +\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\ +\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf\ +)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3\ +c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\ +\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea[\xea\xe5\xebp\xeb\ +\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0\ +X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\ +\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf9\ +8\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\ +\xba\xfeK\xfe\xdc\xffm\xff\xff\ +\x00\x00\x04e\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ + Editor only - S\ +aved\x0a \ + Created w\ +ith Sketch.\x0a \x0a \ +\x0a \x0a \x0a\x0a\ +\x00\x00\x07\x13\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22 standalone=\x22\ +no\x22?>\x0a\x0a \x0a <\ +title>lock on\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \ + \ +\x0a \x0a \x0a\x0a\ +\x00\x00\x05\x10\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / slice / s\ +tandard copy\x0a C\ +reated with Sket\ +ch.\x0a <\ +defs>\x0a \ + \ +\x0a \ +\x0a \x0a \ +\x0a \x0a \ + \x0a\x0a\ +\x00\x00\x04\x96\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Not active - Upd\ +ated\x0a \ + Created w\ +ith Sketch.\x0a \x0a \ +\x0a \x0a \x0a\x0a\ +\x00\x00\x04\x92\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Not active - Sav\ +ed\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0a \x0a \x0a \ + \ +\x0a \x0a\ +\x0a\ +\x00\x00\x06\xcd\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Group 13\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a \ + \x0a \ + \x0a \ + \x0a \ + \x0a \ + \x0a \ + \x0a \ +\x0a\x0a\ +\x00\x00\x03~\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Loop v2\x0a\ + Create\ +d with Sketch.\x0a \x0a \x0a \ + \x0a\x0a\ +\x00\x00_l\ +I\ +I*\x00\x08\x00\x00\x00\x17\x00\xfe\x00\x04\x00\x01\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ +\x00\x04\x00\x00\x00\x22\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ +\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00\x11\x01\x04\x00\x01\x00\x00\x00DS\x00\x00\x12\x01\x03\ +\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ +\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x17\x01\x04\x00\x01\x00\x00\x00\xfa\x0b\x00\x00\x1a\x01\x05\ +\x00\x01\x00\x00\x00*\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ +\x002\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ +\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ +\x00$\x00\x00\x00:\x01\x00\x002\x01\x02\x00\x14\x00\x00\ +\x00^\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ +\x00\xfa8\x00\x00r\x01\x00\x00I\x86\x01\x00\x90\x0c\x00\ +\x00l:\x00\x00i\x87\x04\x00\x01\x00\x00\x00@_\x00\ +\x00s\x87\x07\x00H\x0c\x00\x00\xfcF\x00\x00\x00\x00\x00\ +\x00\x08\x00\x08\x00\x08\x00\x08\x00\x00\xf9\x15\x00\x10'\x00\ +\x00\x00\xf9\x15\x00\x10'\x00\x00Adobe P\ +hotoshop CC 2015\ +.5 (Windows)\x00201\ +7:03:08 11:37:45\ +\x00\x0a\x0a \x0a \ +\x0a pain\ +t.net 4.0.9\x0a \ + 2017-03-0\ +7T11:32:29-08:00\ +\x0a 2017-\ +03-08T11:37:45-0\ +8:00\x0a <\ +xmp:MetadataDate\ +>2017-03-08T11:3\ +7:45-08:00\x0a \ + image/tiff\x0a \ + 3\x0a \ + sR\ +GB IEC61966-2.1<\ +/photoshop:ICCPr\ +ofile>\x0a \ +\x0a \ + \x0a \ + adobe\ +:docid:photoshop\ +:94a27cdb-0433-1\ +1e7-b02d-9f84d9f\ +5a326\x0a \ + \x0a <\ +/photoshop:Docum\ +entAncestors>\x0a \ + xmp.iid\ +:16fdf09c-857d-9\ +44e-9783-e127cb1\ +b9cf4\x0a \ + adobe:docid:\ +photoshop:9f9351\ +ac-0436-11e7-b02\ +d-9f84d9f5a326\x0a xmp.did:ca7\ +71a70-f965-e14f-\ +9103-360465543db\ +f\x0a \ + \x0a \ + \x0a \ + \x0a \ + <\ +stEvt:action>cre\ +ated\x0a \ + xmp.iid:\ +ca771a70-f965-e1\ +4f-9103-36046554\ +3dbf\x0a \ + 2017-03-07\ +T11:32:29-08:00<\ +/stEvt:when>\x0a \ + <\ +stEvt:softwareAg\ +ent>Adobe Photos\ +hop CC 2015.5 (W\ +indows)\x0a \ + \x0a \ + \x0a \ + saved\x0a \ + <\ +stEvt:instanceID\ +>xmp.iid:16fdf09\ +c-857d-944e-9783\ +-e127cb1b9cf4\ +\x0a \ + 2\ +017-03-08T11:37:\ +45-08:00\x0a \ + Ado\ +be Photoshop CC \ +2015.5 (Windows)\ +\x0a \ + /\x0a \ + \x0a <\ +/rdf:Seq>\x0a \ + \x0a \x0a \ +\x0a\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \x0a8BIM\x04\ +%\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x008BIM\x04:\x00\x00\x00\ +\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x0bprintOutput\x00\x00\x00\x05\ +\x00\x00\x00\x00PstSbool\x01\x00\x00\x00\ +\x00Inteenum\x00\x00\x00\x00Int\ +e\x00\x00\x00\x00Clrm\x00\x00\x00\x0fpri\ +ntSixteenBitbool\ +\x00\x00\x00\x00\x0bprinterName\ +TEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0fpr\ +intProofSetupObj\ +c\x00\x00\x00\x0c\x00P\x00r\x00o\x00o\x00f\x00\ + \x00S\x00e\x00t\x00u\x00p\x00\x00\x00\x00\x00\ +\x0aproofSetup\x00\x00\x00\x01\x00\ +\x00\x00\x00Bltnenum\x00\x00\x00\x0cb\ +uiltinProof\x00\x00\x00\x09p\ +roofCMYK\x008BIM\x04;\x00\ +\x00\x00\x00\x02-\x00\x00\x00\x10\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x12printOutputOp\ +tions\x00\x00\x00\x17\x00\x00\x00\x00Cpt\ +nbool\x00\x00\x00\x00\x00Clbrbo\ +ol\x00\x00\x00\x00\x00RgsMbool\x00\ +\x00\x00\x00\x00CrnCbool\x00\x00\x00\x00\ +\x00CntCbool\x00\x00\x00\x00\x00Lb\ +lsbool\x00\x00\x00\x00\x00Ngtvb\ +ool\x00\x00\x00\x00\x00EmlDbool\ +\x00\x00\x00\x00\x00Intrbool\x00\x00\x00\ +\x00\x00BckgObjc\x00\x00\x00\x01\x00\x00\ +\x00\x00\x00\x00RGBC\x00\x00\x00\x03\x00\x00\x00\x00\ +Rd doub@o\xe0\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00Grn doub@o\xe0\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00Bl doub\ +@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00BrdT\ +UntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00Bld UntF#Rlt\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Rslt\ +UntF#Pxl@b\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x0avectorDatabo\ +ol\x01\x00\x00\x00\x00PgPsenum\x00\ +\x00\x00\x00PgPs\x00\x00\x00\x00PgPC\x00\ +\x00\x00\x00LeftUntF#Rlt\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Top U\ +ntF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00Scl UntF#Prc@\ +Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10cropW\ +henPrintingbool\x00\ +\x00\x00\x00\x0ecropRectBott\ +omlong\x00\x00\x00\x00\x00\x00\x00\x0ccr\ +opRectLeftlong\x00\x00\ +\x00\x00\x00\x00\x00\x0dcropRectRi\ +ghtlong\x00\x00\x00\x00\x00\x00\x00\x0bc\ +ropRectToplong\x00\x00\ +\x00\x00\x008BIM\x03\xed\x00\x00\x00\x00\x00\x10\x00\ +\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\x00\x00\x01\x00\x018\ +BIM\x04&\x00\x00\x00\x00\x00\x0e\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00?\x80\x00\x008BIM\x03\xee\x00\ +\x00\x00\x00\x00\x0d\x0cTransparen\ +cy\x008BIM\x04\x15\x00\x00\x00\x00\x00\x1e\x00\ +\x00\x00\x0d\x00T\x00r\x00a\x00n\x00s\x00p\x00\ +a\x00r\x00e\x00n\x00c\x00y\x00\x008BI\ +M\x045\x00\x00\x00\x00\x00\x11\x00\x00\x00\x01\x00\x00\xff\ +\xff\x00\x00\x00\x00\x00\x00\x00d\x01\x008BIM\x04\ +\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ +\x0d\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\ +\x19\x00\x00\x00\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\ +\xf3\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\ +\x008BIM'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\ +\x00\x00\x00\x00\x00\x00\x018BIM\x03\xf5\x00\x00\x00\ +\x00\x00H\x00/ff\x00\x01\x00lff\x00\x06\x00\ +\x00\x00\x00\x00\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\ +\x06\x00\x00\x00\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\ +\x00\x00\x06\x00\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00\ +-\x00\x00\x00\x06\x00\x00\x00\x00\x00\x018BIM\x03\ +\xf8\x00\x00\x00\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ +\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ +\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\x03\xe8\x00\x008BIM\x04\x00\x00\x00\x00\ +\x00\x00\x02\x00\x008BIM\x04\x02\x00\x00\x00\x00\x00\ +\x02\x00\x008BIM\x040\x00\x00\x00\x00\x00\x01\x01\ +\x008BIM\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\ +\x00\x00\x0a8BIM\x04\x08\x00\x00\x00\x00\x00\x10\x00\ +\x00\x00\x01\x00\x00\x02@\x00\x00\x02@\x00\x00\x00\x008\ +BIM\x04\x1e\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008\ +BIM\x04\x1a\x00\x00\x00\x00\x035\x00\x00\x00\x06\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\ +\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00null\x00\x00\ +\x00\x02\x00\x00\x00\x06boundsObjc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ +\x00\x04\x00\x00\x00\x00Top long\x00\x00\ +\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ +\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ +\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ +\x00`\x00\x00\x00\x06slicesVlLs\ +\x00\x00\x00\x01Objc\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x05slice\x00\x00\x00\x12\x00\x00\x00\x07s\ +liceIDlong\x00\x00\x00\x00\x00\x00\ +\x00\x07groupIDlong\x00\x00\x00\ +\x00\x00\x00\x00\x06originenum\x00\ +\x00\x00\x0cESliceOrigin\x00\ +\x00\x00\x0dautoGenerated\ +\x00\x00\x00\x00Typeenum\x00\x00\x00\x0a\ +ESliceType\x00\x00\x00\x00Im\ +g \x00\x00\x00\x06boundsObjc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00Rct1\x00\x00\ +\x00\x04\x00\x00\x00\x00Top long\x00\x00\ +\x00\x00\x00\x00\x00\x00Leftlong\x00\x00\ +\x00\x00\x00\x00\x00\x00Btomlong\x00\x00\ +\x00`\x00\x00\x00\x00Rghtlong\x00\x00\ +\x00`\x00\x00\x00\x03urlTEXT\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x00nullTEXT\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00MsgeTEX\ +T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x06altTa\ +gTEXT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0ec\ +ellTextIsHTMLboo\ +l\x01\x00\x00\x00\x08cellTextTE\ +XT\x00\x00\x00\x01\x00\x00\x00\x00\x00\x09horz\ +Alignenum\x00\x00\x00\x0fESl\ +iceHorzAlign\x00\x00\x00\x07\ +default\x00\x00\x00\x09vertA\ +lignenum\x00\x00\x00\x0fESli\ +ceVertAlign\x00\x00\x00\x07d\ +efault\x00\x00\x00\x0bbgColo\ +rTypeenum\x00\x00\x00\x11ESl\ +iceBGColorType\x00\x00\ +\x00\x00None\x00\x00\x00\x09topOut\ +setlong\x00\x00\x00\x00\x00\x00\x00\x0al\ +eftOutsetlong\x00\x00\x00\ +\x00\x00\x00\x00\x0cbottomOutse\ +tlong\x00\x00\x00\x00\x00\x00\x00\x0brig\ +htOutsetlong\x00\x00\x00\x00\ +\x008BIM\x04(\x00\x00\x00\x00\x00\x0c\x00\x00\x00\ +\x02?\xf0\x00\x00\x00\x00\x00\x008BIM\x04\x14\x00\ +\x00\x00\x00\x00\x04\x00\x00\x00\x0c8BIM\x04\x0c\x00\ +\x00\x00\x00\x038\x00\x00\x00\x01\x00\x00\x000\x00\x00\x00\ +0\x00\x00\x00\x90\x00\x00\x1b\x00\x00\x00\x03\x1c\x00\x18\x00\ +\x01\xff\xd8\xff\xed\x00\x0cAdobe_CM\x00\ +\x01\xff\xee\x00\x0eAdobe\x00d\x80\x00\x00\x00\ +\x01\xff\xdb\x00\x84\x00\x0c\x08\x08\x08\x09\x08\x0c\x09\x09\x0c\ +\x11\x0b\x0a\x0b\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\ +\x13\x18\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\ +\x10\x14\x0e\x0e\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\ +\x0c\x0c\x11\x11\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x000\x000\ +\x03\x01\x22\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\x03\ +\xff\xc4\x01?\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\ +\x00\x00\x00\x00\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\ +\x0b\x01\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\x00\ +\x01\x04\x01\x03\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\ +\x00\x02\x11\x03\x04!\x121\x05AQa\x13\x22q\x81\ +2\x06\x14\x91\xa1\xb1B#$\x15R\xc1b34r\ +\x82\xd1C\x07%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\ +\x83&D\x93TdE\xc2\xa3t6\x17\xd2U\xe2e\ +\xf2\xb3\x84\xc3\xd3u\xe3\xf3F'\x94\xa4\x85\xb4\x95\xc4\ +\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\ +\xc6\xd6\xe6\xf67GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\ +\xf7\x11\x00\x02\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\ +\x055\x01\x00\x02\x11\x03!1\x12\x04AQaq\x22\ +\x13\x052\x81\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$\ +b\xe1r\x82\x92CS\x15cs4\xf1%\x06\x16\xa2\ +\xb2\x83\x07&5\xc2\xd2D\x93T\xa3\x17dEU6\ +te\xe2\xf2\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\ +\x95\xc4\xd4\xe4\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\ +\xa6\xb6\xc6\xd6\xe6\xf6'7GWgw\x87\x97\xa7\xb7\ +\xc7\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf5\ +T\x92P\xb5\xceensZ^\xe6\x82CG$\xa4\ +\xa5YuU\xff\x008\xf6\xb2x\xdc@N\xd7\xb1\xe3\ +s\x1c\x1c\xdf\x10d*X\xb8,\xb1\x9e\xbe[K\xee\ +\xb3S\xbb\xb0\xec6\xa6}#\x07&\xa7\xd2H\xaa\xe7\ +\x06=\x93\x22O\x05%:\x09$\x92J\x7f\xff\xd0\xf5\ +T\x1c\x9c\xaa\xf1\x9a\x0b\xe4\x97\x18kZ$\x94eK\ +\xaa{YM\xbd\xeb\xb0\x1f\x97\xfa\x84\x94\xb7\xdb\xefw\ +\xf3x\xaf>\x05\xda\x7f\x04+\x9b\xd4.s.}m\ +`\xa6\x5c\xd6\x93:\xf3:|\x15\xac\xf3x\xc6s\xa9\ +0F\xae#\x9d\xa3\xe9mK\x05\xd6Y\x88\xd7Zw\ +\x17L\x1e\xf1:nIL\xf1/7\xe3\xb2\xd2\x00.\ +\xe4\x0e$\x1d\xa8\xca\x97J\xd3\x1d\xf5\x9ekyj\xba\ +\x92\x9f\xff\xd1\xf5UW\xa8\xd6l\xc3\xb0\x01$A\x00\ +y\x1f\xfc\x8a\xb4\x92Jh7\xa95\xf5\x86\xb6\x8b-\ +1\x0e\x86\xe8t\xd7\xc5&_\x9b\xb42\x8cA[\x06\ +\x808\xc0\x1f/b\xbe\x92Jj`\xe3\xddQ\xb5\xf7\ +@u\xae\xdd\xb5\xbc\x05m$\x92S\xff\xd98BI\ +M\x04!\x00\x00\x00\x00\x00a\x00\x00\x00\x01\x01\x00\x00\ +\x00\x0f\x00A\x00d\x00o\x00b\x00e\x00 \x00P\ +\x00h\x00o\x00t\x00o\x00s\x00h\x00o\x00p\ +\x00\x00\x00\x19\x00A\x00d\x00o\x00b\x00e\x00 \ +\x00P\x00h\x00o\x00t\x00o\x00s\x00h\x00o\ +\x00p\x00 \x00C\x00C\x00 \x002\x000\x001\ +\x005\x00.\x005\x00\x00\x00\x01\x00\x00\x00\x0cHL\ +ino\x02\x10\x00\x00mntrRGB X\ +YZ \x07\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00a\ +cspMSFT\x00\x00\x00\x00IEC s\ +RGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-HP \x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11c\ +prt\x00\x00\x01P\x00\x00\x003desc\x00\ +\x00\x01\x84\x00\x00\x00lwtpt\x00\x00\x01\xf0\x00\ +\x00\x00\x14bkpt\x00\x00\x02\x04\x00\x00\x00\x14r\ +XYZ\x00\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\ +\x00\x02,\x00\x00\x00\x14bXYZ\x00\x00\x02@\x00\ +\x00\x00\x14dmnd\x00\x00\x02T\x00\x00\x00pd\ +mdd\x00\x00\x02\xc4\x00\x00\x00\x88vued\x00\ +\x00\x03L\x00\x00\x00\x86view\x00\x00\x03\xd4\x00\ +\x00\x00$lumi\x00\x00\x03\xf8\x00\x00\x00\x14m\ +eas\x00\x00\x04\x0c\x00\x00\x00$tech\x00\ +\x00\x040\x00\x00\x00\x0crTRC\x00\x00\x04<\x00\ +\x00\x08\x0cgTRC\x00\x00\x04<\x00\x00\x08\x0cb\ +TRC\x00\x00\x04<\x00\x00\x08\x0ctext\x00\ +\x00\x00\x00Copyright (c)\ + 1998 Hewlett-Pa\ +ckard Company\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00\x12sRGB \ +IEC61966-2.1\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x12sRGB IEC\ +61966-2.1\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ +\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccX\ +YZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\xa2\x00\ +\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\ +\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\ +\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfd\ +esc\x00\x00\x00\x00\x00\x00\x00\x16IEC h\ +ttp://www.iec.ch\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16IEC \ +http://www.iec.c\ +h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00.IEC 6\ +1966-2.1 Default\ + RGB colour spac\ +e - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00.IEC 61966-2.\ +1 Default RGB co\ +lour space - sRG\ +B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00,Reference Vie\ +wing Condition i\ +n IEC61966-2.1\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00,Refere\ +nce Viewing Cond\ +ition in IEC6196\ +6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\ +iew\x00\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\ +\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\ +\x00\x00\x01XYZ \x00\x00\x00\x00\x00L\x09V\x00\ +P\x00\x00\x00W\x1f\xe7meas\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x02sig \x00\ +\x00\x00\x00CRT curv\x00\x00\x00\x00\x00\ +\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\ +\x1e\x00#\x00(\x00-\x002\x007\x00;\x00@\x00\ +E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00\ +m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\ +\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\ +\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\ +\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\ +\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01\ +E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01\ +|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\ +\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\ +\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02\ +A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\ +\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\ +\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x03\ +8\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\ +\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\ +\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04\ +c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\ +\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05\ +I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\ +\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06\ +H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\ +\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07\ +a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\ +\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\ +\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09\ +:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\ +\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\ +\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0b\ +Q\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\ +\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\ +\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\ +\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\ +\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f\ +^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10\ +C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x11\ +1\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12\ +&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\ +#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14\ +'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x15\ +4\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16\ +I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17\ +e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\ +\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\ +\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\ +\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c\ +*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1d\ +p\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\ +\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \ +\x15 A l \x98 \xc4 \xf0!\x1c!H!\ +u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\ +\xdd#\x0a#8#f#\x94#\xc2#\xf0$\x1f$\ +M$|$\xab$\xda%\x09%8%h%\x97%\ +\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'\ +I'z'\xab'\xdc(\x0d(?(q(\xa2(\ +\xd4)\x06)8)k)\x9d)\xd0*\x02*5*\ +h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\ +\x05,9,n,\xa2,\xd7-\x0c-A-v-\ +\xab-\xe1.\x16.L.\x82.\xb7.\xee/$/\ +Z/\x91/\xc7/\xfe050l0\xa40\xdb1\ +\x121J1\x821\xba1\xf22*2c2\x9b2\ +\xd43\x0d3F3\x7f3\xb83\xf14+4e4\ +\x9e4\xd85\x135M5\x875\xc25\xfd676\ +r6\xae6\xe97$7`7\x9c7\xd78\x148\ +P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:\ +6:t:\xb2:\xef;-;k;\xaa;\xe8<\ +'\ + >`>\xa0>\xe0?!?a?\xa2?\xe2@\ +#@d@\xa6@\xe7A)AjA\xacA\xeeB\ +0BrB\xb5B\xf7C:C}C\xc0D\x03D\ +GD\x8aD\xceE\x12EUE\x9aE\xdeF\x22F\ +gF\xabF\xf0G5G{G\xc0H\x05HKH\ +\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\ +\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\ +\x02MJM\x93M\xdcN%NnN\xb7O\x00O\ +IO\x93O\xddP'PqP\xbbQ\x06QPQ\ +\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\ +\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\ +\x5cV\xa9V\xf7WDW\x92W\xe0X/X}X\ +\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[\ +E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']x]\ +\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`\ +W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\ +\xf0cCc\x97c\xebd@d\x94d\xe9e=e\ +\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h\ +?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\ +\xf7kOk\xa7k\xfflWl\xafm\x08m`m\ +\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\ +\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s\ +]s\xb8t\x14tpt\xccu(u\x85u\xe1v\ +>v\x9bv\xf8wVw\xb3x\x11xnx\xccy\ +*y\x89y\xe7zFz\xa5{\x04{c{\xc2|\ +!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\ +#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x82\ +0\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85\ +G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88\ +i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\ +\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\ +\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\ +\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95\ +_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\ +\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\ +\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\ +\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\ +\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\ +\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\ +\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\ +\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1\ +`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\ +\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\ +\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\ +\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0\ +p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4\ +Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8\ +=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc\ +5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd0\ +9\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4\ +I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8\ +d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\ +\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\ +\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\ +\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9\ +F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\ +\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\ +\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6\ +m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\ +\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xff\ +m\xff\xff\x80\x00 P8$\x16\x0d\x07\x84BaP\ +\xb8d6\x1d\x0f\x88DbQ8\xa4V-\x17\x8cF\ +cQ\xb8\xe4v=\x1f\x90HdR9$\x96M'\ +\x94JeR\xb9d\xb6]/\x98LfS9\xa4\xd6\ +m7\x9cNgS\xb9\xe4\xf6}?\xa0PhT:\ +%\x16\x8dG\xa4RiT\xbae6\x9dO\xa8Tj\ +U:\xa5V\xadW\xacVkU\xba\xe5v\xbd_\xb0\ +XlV;%\x96\x0a\x01\xb4\x00Cv\xb1\x15\xb4D\ ++\x0c\xdcC\xe0\xeb\xa0F\xd2\x01y\xde^\x0e;\xe3\ +q\xc5\x7fm_\xdcM\xbb6\x17\x0d\x1b\x0a\xe2CD\ +\x5caX\x8f\x8f,\x88rB\xa0VT\x19\x14|\xe6\ +^\xedl\xe31\x85\x9fY.tJ\x87V\x95\xc9\x87\ +\xd4a\xc4\xda\xb1\x81g\x5co\x1elIa\x1d\xa0V\ +X\xf0\xdc;\x17\xdb\xb5r\xc7|\x9dj\xf0YZ\x9e\ +%d\xbd\xc7:\x99yG\xf0O4\x17<}t_\ +\x08\x9e\xa1\xb3|\xb1N\xf1{T\x9b\xa08$f\xf0\ +\x1f\xcb\x1e3u1_\xe7M\xa5\xfdG\xd7w\xb5\xd3\ +\xdb\xf8NA\x7f0rS\xec\xb9\x16\xfeG\x15FO\ +\xf5v6\xc0\x02A\xfd\x01\x9f\xcf\x8c\x0c\x98\x8e\xf0I\ +**\xc1\x83R0m\xc2\x06\x938k\x19fl,\ +`\x9dp\xc9\xca\xe8\x9fG\xcb\xe6\x05\x81\xabX6\x11\ +\x06q(\x80\x11\xc5\x01`A\x15\x85\x0b\xba0V\xc6\ +\x04\xc1\x15\x19\x8d\xa7\xecl~@\xf1\xcaJ-\xc7\x83\ +\x90\xe3\x1f\x91\xa8\xa3\x82j\x99D\xb4\x8c>\x19rI\ +{\x02@\xa8\xb8\x09'\x80\xa1\x94\xa4\x1f\x0cr\xa8\xf9\ +\x12\x86b\x020O\xcb\x849+/\x8fQ\xd4\xc4\x8e\ +\x84\x93(ZPM\x06@\x115\x81H\x81m7\x94\ +\x84,\xe433'\xc9\xee\x94\x00S\xc8\x04-O\x83\ +\x88\xdd?\x913\xd0\x06\x88\x1eT)\xde*Q\x01C\ +\xdaw\x1dS\x1d\x1c\x8a\x92T\x89l\x1dR\x82J \ +]S\x05H\xffM\x8b\xc7\xdd<}&\x81\xb5D!\ +\x90u)H\x09\xd5\x00\xc2 ZU\x85\x09\x01W\x8c\ +\x14}d\x86\x82\xd5\xa87\x18\x15\xa6\xcb\x9a\x04\xb9\xe8\ +[Ju\x1c\x8dp\xb2\x18\x1e6)\xda\x9e\x05\xd6H\ +tMY\x86\x04\x9e\x02\x00\xa8e<}\x9fB\xbd\xac\ +\x160L%gm\xa0\x83E\xbcA\x0c\x97\x08\xfa\x88\ +\x10\xd7(\xd0W]\x04\xca\x889]\x84|\xf8-\x0e\ +\x08\x84\xd0P\x11\x0f\xb1(<\xdb\x95\x9b\xba\x09W\x06\ +\xc3h\x08\xb6\xc8]\x16u\x0a\x18(H{a\x07\x9a\ +\x88\x03a\x80AO\x87\x9a\x00\xfe$\x13\xa1\x876,\ +p\x0a\xd8\xc8V|c\x87\xb5\xf31c\x81\xbbH \x86\x19\xfbi\x863\xee\ +\x02\x04\x98\xa8\x14[\xa9\x96\x15o\x01\xa2\x19R\x90c\ +#\xae\xec\xec.\xd2\xef\xa2\x03[\xc0T\x1a\xdd\xe3\x84\ +\xa4\x19\x07\xe8$\xfe7\x09F7$[\xaa\x84o,\ +X\x07\xfc\xc8\x9e\x86\x11|\xe8\xdcT\xf4\x04\x9f\x03|\ +\xd4A\xb0\x87\xd2\x88\x96a4@C\x87\xca\xa9H\x92\ +T\x9d+\xces\xdd\x01S\xd1t}\xca\xb0\x03\xf7\x80\ +N\x1eS\x9a \xf7\x84\x12\xa1\x84\x17\x8c1\x96^I\ +=\xddy\x8a\xab\xf2\x16\x87\x04\xf7\xa4cE\xc8X\xeb\ +\xeb\x8aE\xff\xb4W\xf9\xbe\xea\xa2>|\x04\xde\x0a(\ +\x0c\x99\xa4\x06~\xb8\xe2\xf0ll}\x86w\xbd\xf7\xa9\ ++pTR~\x86v\x18\x03\x00\xe8a\xbd\xfd\x9a\xd1\ +\xe0\xb6\x0cV\x9a\xa0~\x10\x0du\xae\xc1\x1c\xbb\xc3\x89\ +\x10uB\x05\xd5\x08\x08\x09\x03\xca\x0b\xf7\x00\xedTV\ +\x0d\x805\x05\xc1\x01\x0cC#\xacs\x05\xd8<\x0d\x07\ +d!\x1c\xf0B\x12\x13\xd0k\x09\xc2\x12F\x12\xc2\xf1\ +\xea\x90\xa2\xf2<\xc7\x80\xe1\x86Ce=\x00!\xd1\x0d\ +\xc7\x18\xc1\x87B\xc4Z\xc3\xd1E\x09b\x01\x152\xa0\ +(\x06/\xf0,\x88\x81\x08\x1c\x89@\x90\x0cD\xd0:\ +\xaa\x00\x98\x18\x061L\x1f< <\xf1\x09\x18\xc8\x8b\ +B\xe8FE\xd0\xde8#\x00\xd8\x88.\xea!\x80\xd5\ +k\x11\xe0\xb8\x1a\x04\x11X\x13\x19 B\x0a@\xecq\ +\x04\x91(\x0e\x028\x8c\xae\xd5\xe9:B\x03li\x06\ +\x18\xfc\x0eX\xe0\xf8c\xd1\x8c\xad\xc3Uv\xcf\x99\xf8\ +\x17\x91@u\xa9\x01 -#@\xb4P\x03\x12(\x0b\ +\x81\xd6$\x07\xc1<\x94\x03\xa0RN\x01\x98$V\x1e\ +\xb8u{/nB\x14u\x9e\x01\x5c04\x8e\x80\x91\ +\x14\x020W%\xc1:\x22\x04@>Z\x01$\xd6\x02\ +\x00[XQ\xc2\xce^\x0a\x01\x03/\xc3\x0c\xa5'\xcd\ +\xa4\x06\x81\x04\x18\x15CXD\x99AT\xd5\x82`^\ +\x8eG\xe4\xd1\x1fr\x04{\x1b\x81\xe0;\x1a\xc2\xfb!\ +\x83:n\x0c#\xc0\x19\x9cl\xc2'\x11\xc4\x0e\x82G\ +,#E\x81n\x05e\x81\x1b\x0f\xd1\xf8\xc0\xe1\xb8\xe8\ +\x1cQ\x80p\x0d\x83\x046\xa1\x90\xe1\x1b0ls\x0f\ +I\xfc\x1b\xf0\xb8\x1a\ +\xe2hK\x00\x80\x130\xc4\xe2\x02\x1e\xebn\xb3\x09\x02\ +2\x13\xb0\xd4\x18\x80_\x0d\xa0v!\x87\xd8\x1b\x01\x9c\ +\xe3\xa0h\xe0%\x1c\xb9\xcb\x98\xfe\x82\x16<\xe1^\x13\ +d\xe4\x10\xa0\xcd\x0d\x021\x01\xa0\xfa\x13\x80\x9f\x10\xed\ +v!l\x06\xd8\xcb<[e\xfa\x96\x02\x18\xc8\x81\x94\ +\x17\x8c\x82\x0dP\x01\x10B-\x06.A\x06\x8f\xd2i\ +/D\x06l\xc2\x1b,\xc6;h$\xe5@ \x02\xa8\ +\x90\x0f1T\x12\xe9\xd4!\x91B\x19\xeb\xc5\x13\x02,\ +\xe8\xce\x90\xb2.\x94!\xea\xc8\x0a\x86P\x15\xa2\xa0\x86\ +\xa9\x10\x02\x0c\x92\x9b\x22\xe8\x02Np\x8d\x8f\x10\xb9\xc7\ +\x08C\xe0\x1cHC\x84\xfdj=\x16B(\x8d\xc0R\ +\xfe!\xa4\x00q\xac\x00\x82\x18\x85@\xf6zA<\xbb\ +\xc2nPH\xa0\x92\x89*\xb5\xa9\xd4\xb5\xaf\x10\x93\x80\ +(\x03$>\x01\xa7x\x00\xe0\x12&\x01G\x1e!\x18\ +\x121\xe8\xa7\x91\xa0\x22oh\xe5\xa1\xb2\xc9\x82\x18v\ +\xc1&\xca\xe3\xca#e\x04\x96\xe0\x14\xc9\x22\xe2\x03 \ +>\x8d\x89.\x8d\xa3&\xb9\xc94\xc9\x22\x90\xa0\x8b\xc4\ +b\xc1\xcc\x1b\xf1\xee\x22b\xef\x1b\x81\x8cy\xe3\xf6!\ +aq#\xe1L|\x00\xf8\x0bb\x08\xc9\x91\xd1!\x06\ +$\x04\xcf\x10\xe7\x09e\x19F\xb1\x17\xed^+\x8a\xb8\ +\xcb\xec\xee\x1aa\x91\x22\xe24\x10\x92t\x14\xa0\x91'\ +\xa0\xb4!\x8d\x91&\xa1\x8e\x8d\x92\x0e\x03\xe9\x88\x02.\ +\x148\xb0\xae\x1e\xa1\xe4B\xc1\x9a\x18\x011* \xfe\ +g!\xb4grp#\x80\xc1+ \xf0\xf0\xa0\xd8\x10\ +\xe4r\xae\xe9\xe0\x86\xe3\x04\x1cC\x02/\xe1\xb6\xa9\x81\ +\xda\xb3\xcc\x06\xc7J\x9e\x1cr\xae$\x8f\x92\xf9o\x9a\ ++\x8aA-j\xfc\xa4\xe2\xf8\x1bj\x5c\xa5a\xac\xd9\ +\x0af\xd3r\xde'\xf1\xda\x01!\x1f0\xa1du\x02\ +p\xe0,\x07-\xa5~\x1c\xb2\xd0\xb3\xc86\x1c\xa9\xf2\ +\x1b*P\x1b\x8f\x8a\xab\xa6\x130\x22\xb5\x19Mr\x14\ +G2\x07\xe76#j\xee\xc0k\xd6\x1b\xed\xa6\xa5a\ +\xaa\xa5\xd3J\x9e!\xc2\xb1S4[\x88j\xf8\x00{\ +6`\x9a\x96\x80\x1e\x02N2\x1f\x8a&\x86(d\x1b\ +S+\x0b\x81\xbe\x1a\xcd\xa71\xb0\x095\xf3\x8d8\xf3\ +\x9193\x959s\x999\xb3\x9d9\xf3\xa1:3\xa5\ +:s\xa9:\xb3\xad:\xf3\xb1;3\xb5;s\xb9;\ +\xb3\xbd;\xf3\xc1<3\xc5\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Default\x0a\ + Create\ +d with Sketch.\x0a \ +\x0a \x0a <\ +path d=\x22M13.6916\ +3,3.24686842 L8.\ +01783965,6.52512\ +131 L2.34404932,\ +3.24686842 L8,0.\ +481790242 L13.69\ +163,3.24686842 Z\ + M7.25035308,7.8\ +2264135 L7.25035\ +308,14.7689324 L\ +1.9912897,11.723\ +6967 L1.9912897,\ +4.79310939 L7.25\ +035308,7.8226413\ +5 Z M14.0326515,\ +11.6884321 L8.74\ +360561,14.776916\ +3 L8.74360561,7.\ +8257203 L14.0024\ +918,4.79949203 L\ +14.0326515,11.68\ +84321 Z\x22 id=\x22Sha\ +pe\x22 fill=\x22#FFFFF\ +F\x22 fill-rule=\x22no\ +nzero\x22>\x0a \ + \x0a\x0a\ +\x00\x00\x03~\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / entity / \ +Loop v2\x0a\ + Create\ +d with Sketch.\x0a \x0a \x0a \ + \x0a\x0a\ +\x00\x00\x19\xf8\ +\x00\ +\x00\xe0\x1cx\x9c\xed\x9c\x09\x5c\x14\xd5\x1f\xc0\xdf\xec\xc5\ +\xb5\xdc\x87\x17\xea\x8a\x1c^\xdc7\xca\xb9\xa0\xa0\x22\x08\ +xf\xc9\xb2;\xc0\xea\xb2\xbb\xee\x01hVj\xa6\xa5\ +\x96Gf^e\x1e\x99GiY\x1e\x99\x1d\x9af\x87\ +\x7f\xcb\xdb\xb2\x03\xf3oj\x99Q\xa6V\x9a\xfc\x7f\xbf\ +Y\x16\x06\x04E\x19\xc0\xfe\xcd\x97\x0f\xb3o\xde\xf5\xfb\ +\xbd\xdf\xbcy\xd7\xcc\x9b\xccL\xd2\x8b\x10bK\xbc\xc8\ +M\x22\x02\x17E,\x07!\xf3\x93\x0f\x07\x8a\xe5\x160\ +n\x88GyQ\xc2j\x7f\x88LI\xaa\xdd\x028\xb8\ +Z\xf3\xc9\xaa\xa4\xdcXq<\xab\xddLjV\x9e\xed\ +\xac\xf1\xe7\x11\xaa#\x11[\xdcT\x17\xaaS\x8d\xdb\x9f\ +\xf2f\xe5\xd3\x83%+\x14\x8f\xc4\x07\x5cAT\x18\xe3\ +\xf6\x00w6\x95S\x1b_\xb0\x0b\x8fQ\x9d\xe0T5\ +#\x03\xdd\xd2\x1e\x84DO\x99\xa9\xb6\xca\xfd\xaer\xa6\ +\x91\xd8\x80\x7f:!\xf2uX~\xb0\x87\xe5\xcf\xfe\xc6\ +\x14B\x02\x5c\xac\xbf\xc9*]\x01-\xcb.\xd6\x99t\ +\xc6b\x9d^&\x97\xcb\xc2BB\xa3e=F\xa8\xb5\ +*]\x99\xb1'\xc1\xd3\xb8\x90\xb0\xb8\x90pYhd\ +\x5cX88H\xbf\xc4r\xbdB9\x9e6\xc9\x0a\xe8\ +\x22\xb56\xde\xe7\x97w\xde\xf7\x91\xa9U\xf1>#\x22\ +3C2\xf5r\xbaX\x9d>\xc9@\xe7N\x1a\x92\xa7\ +\x9c4^\x19\xab\xf2IL\xb0\xefW\x1eW^\xa2/\ +\xa1M\x0aYy\x89Fk\x8c+\x8f\xf7Q\xa0\xfc8\ +p\xa3w\xb0\x8f\x8c\x89b\x1a\x1f\xefcQldf\ +\xb6L\xae3\xd0\xb2\xc8\xa0\xa8@ehx\x8c,:\ +6(426&,\xa2\x0f*\x1a\x15\x1c\x12\x1b\x1c\ +\x1a\x11\x18\x12\x1a\x17\x12\x1b\x17\x12*\xab\xc6'\xc1\x1e\ +\x8e\xfd\x0c\xaa\xc2\xb8\x9c\xd4\xfe\xd5\xe2\xe0,\xde\xa7\xd8\ +d\xd2\xc7\x05\x07\x97\x95\x95\x05\x95\x85\x07\xe9\x0cE\xc1\ +\xa1\xb1\xb1\xb1\xc1!a\xc1aa\x81\x10#\xd08Q\ +kR\x94\x07j\x8d\xdd-\x99X\xf3I\xa5\x8dJ\x83\ +ZoR\xeb\xb4284($\xb8\xa1D*eM\x1a\ +\xbd\xd9\xa0aTS)\x83i\x0d]BkMFH\ +\x17\xda`:\xbd\xf5\xda5,\xb2&\xb8Q\xc1\xa0m\ +f\xe6\xed\xf5-)i0\xa5\xd1\x94Vj\xba}J\ +c\xdeD=\x1d\x9cC\x1buf\x83\x92N+\x85\xa2\ +\xd4\xda\x15M\x0b\xd2\xe3\xe4\x06Za\xa2S\xe1?\x01\ +k[`HX`Hx\x1e\xd4\xb6\x90\xa8\xb8\xb0\xc8\ +\xc0\x90\x98\xb8\x90\x90~\xc1\xf5b\xd6\xcb#S\xa7R\ +\x17Nl \x0f\xa6\xc6\xb2\xf3`\xc5\xac\x9f\x07\xd4A\ +\x95\xc2\xa4hR.\xec\xb8\xac|T\xca\xb8B\x9d\xa1\ +DaJP\x97(\x8a\xe8`\x93\xba\xb0\xb0_p\xad\ +/+j\xcd\xa5\x89\x93\xeb4:\x03\xe8E'\x84\xf7\ +\x0bn\xc8\xbb\xc1T\x19ry\xb6AW\xa8\xd6\xd0\x09\ +\xc6\x9c\x01)\xb2\x8c4yThlTT`XP\ +(;\x1bV\xbc\xba\x05\xce\xcc\x8c\xcb\xd0\x1aM\x0a\xad\ +\x92\xceHM\x00\x8f \xb5Z\x15WX\x18AG\x85\ +\xc7D\x05\xd2\x85\xe1t`(\x1dA\x07\x16D+c\ +\x02\xa3\x14\x11\x91ttxAX\xb4R\xc5\xd8\xa0n\ +\xf2[\xb2N\xd5)\xcdXu\xab\xb3V\xdde\xd6\xac\ +\xe4\xb7d\x9dePC\xb3\xa3\xd04SD\x03\xd9\xdc\ +\x22*]m4\xe9\x0c\x13\x13\xeaT\x7f\xa6A\xc8\xa5\ +'\xd4\xf5\xb5\x06h\xd4L\x03\xa1W\x18\x8c4V\xff\ +x\x1fk\xfd\xf7\xb9%\x01\xa6an\xa38\x85\x12\x9b\ +\x96\x04%S\xc3A\xc5:\xbe\x8d'S\xdf\xeb\x05\xbc\ +%y\xe32\xca\x8ai\xed\xed\xeeLV\xac\xc631\ +\xea\x0aMe\x0a\x03\x9d\x5c\x04\x96N\xb8c\xbfc\xcd\ +\xb5n\xb2[\xec\x1dl1x\xbd\xcb\x13|\xeb\xf5\xb1\ +^\xf3z\xd7\xd3\x12\x95\xd5\xb6[:\x8e\xe0\xea\x9e\x03\ +:\xad\xe0\x9a^\xab\xa1\xc2q\x0f/\x84\x17\xc2\x0b\xe1\ +\x85\xf0Bx!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\ +\xf0Bx!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0\ +Bx!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0B\ +x!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0Bx\ +!\xbc\x10^\x08/\x84\x17\xc2\x0b\xe1\x85\xf0Bx!\ +\x1c\x0b\xb1\xaf\xdd\x07FkU\xf1>e>\x89\x09$\ +&%#S\xe4\xc7\xec9s!\xf5`\xc2\xe2\x18\xe7\ +\xd9\xeapfw\x1eq\xd0\x1b\xd4ZS\x96\xd9\xa47\ +\x9b\xe0\x14\xb7\xc9\x91l\xa3)\xb7@\xa7\xd3012\ +\xb4&\x9a\xd6\x9aK\xacn\xfc\x95k\x0cx\xee\xcc\xa4\ +\xcdU\x97c\x8c\x14\xb5\x09\xd3\xd4\xe6I\x1b\x86(J\ +\xe8\xbc\xb4\x91y5\xc2,\x09\xb2\x0d:]a.m\ +2\xeb\xb3\x0a\xc6)\xc1[J\xb2\x89\x81\xe8\xe0\xaf\x90\ +\xc8H.\xa1\x89\x89\x98\x89\x9eIb\xaf\xaf\x89m\xcd\ +&Ec\xd2Vk$-0\xab5&\xb5\x96\xc9\x12\ +\xce\xed\x98\xd8\xf2\xccQ\x83,%\xee\x8b\xf1\x05\x81u\ +J\xec\xc6*q\x16\xb3\xf3\xc0\x08\xbe\xed\x98r\xe9M\ +Zk!\xa0\x90\x05\x86\x9a\x93\x9c\x22cfm\x88A\ ++\xaf=\xd1\x9ajO\x06\x17h\x8c5'C\x8aL\ +\xa55'i%\x9a\xd4\x9a\x13\xb0cm\xd6)\xca\xf1\ +E\xd5\x86\xb0(Hr\x06\xa4\xc8\x89e\xdb$\xc9Q\ +\xc9d*\x9d\xb9 IWQs1\x07\x18\xb4\xb7\xf8\ +\xa5hn\x8d\x97bP\xe5\x0d\xd3\x9a\xfaw\xcf\xd1\x98\ +\xd8\x95!E\xa3\x925\xe4\x9fc\xd4\x98\x18\xff\xecr\ +MRN\x8d\xb7})\xad4\xe9\x0c\xa9\x0a\x93\xa2\xa6\ +Vd\x17e\x1b\xad\xb5\x02\xdd\xd5\xbfr\xc6\x08t\xa1\ +\xa9\xa1\xec\xf3t\xfa\x06\xc5\xe6*5\x16\xffl\x832\ +iT\x8d\xb7\x8b\xd2\xa0\xd3\x8f(\xa6\xe1\xe2\xc2\xf5R\ +k\x8b\xac\x16s\xc2\x80\x1c\xd0)Eg2\xe9J4\ +:mQu\x12\xa95\x04U`\xf9;Z\xfds\xd4\ +E\xc5\xec\x00\x07k\x00\xe8V\xe3\x8d5G\xf8\xb3E\ +\x07\x92N,{?\xab\x7f\x99Z\xe5\xcf\x849\xd5\x96\ + qJu\xaaK\x16q\xd2<\x83Bk\xd4+\x0c\ +\xb4V9\xd1R\x13=\x99\x90.\x18J\xf2\xa0\xb6+\ +\x88\x96\x18\xa1\x8e+\xc0M\x83[I&V\xdf\xa5\x91\ +LLWF\x1e\xa9\xaa\xaa\x16\xa1\xa2,\xa1\x9d\x993\ +\x91UO\x91c\xcdy\x17\xe6\xbcC\xdds\xe1e\xe6\ +\xdc\xce\xaa\xa9%\x97\x00K\xfb`o\xadp\x96r\x09\ +\xaf0\xeet\x12\x5cX\x08!\x1a8J\xaa\x13Y|\ +V.YZ\xe3\x13\xc6\x1cG\xc3\xd1\xea\x13\xc9\x1c\x03\ +k}\x98<\xff`\xdcz,IC\x08\xcfc0\xf7\ +a\x8c-,e\x13T\x9f\x09\xea\x9c\x85Xt\xac\xb6\ +j`\x9d0\xdb\xeak\xcf\x5c\x01A\x92\xe5\xbf:\xac\ +K=\xfbwD\x970\xb2\xa6\xd4\x16\xf2\xab\xff-\x96\ +\xb9\x15\xb6\x1f;n\x83\x11\xac\xd46aDk\xd6h\ +,\x0a\x13I\x81\xce\xacU\x19\xeb\xb5 JS\xa8U\ +M\xbc\xedXU\x9e\xd4\xbb7HJ\xed=\xc4\xa8\x91\ +S{\x8b\xe0\xb9\xc4\xa8Q+i\xe3p\xcd`\xbc\xc9\ +\xa9:r\xc4L\x188\xdc\xe0\xdf\x869\xc9He\xe5\ +mSd\xd0\x99\xf5u\xbc$:f\xeb\x9f\xb5\xfdN\ +\xcb\xc5D\x96\xed\x80p\xee\xa80\x9bt\x03h-m\ +\xc0\xadx\x8c\xf6\x13\xf5\xd6\xee\xc7\xde\x12\x19}0$\ +\xa3\xa4H\xd6\x0a\xe5\x17\x9a\x0d\x9a:\x9d\x18c\xfc\xba\ +>\x99\xc6\xa2\xba\x1d\x9dD\xa11\xe5)\x8a\xea\xf89\ +)iHG\x97\x9b2\x8c\xe9y\x99\x83\xadM\xa9\xad\ +\xd5\xbbNd\xbbb\x9daR\xb2F]d\xb5\x94\xb3\ +\xa5\xf0\xe9Vo\xb4\xae\x8a.T\x98\x99\xb6\xd4\xae\x94\ +6\x98\x1a\x88>\xdc\xea]7\xbaCA\x11\xb3\xc3\x95\ +e\x5cWK\x82\x94\x015\x01\xa8\xc6\x10\x9d\x16\x7f\xed\ +L:=t\x98F\x9am8{\x0d\x18\xf2\x16_i\ +\x01\xd3(\xdf\xe2\xef`\xc0\xa6\xb7\x9e7s\x07\xf5\xb0\ +\xa4\x83\x7fAb%\xa9\xf5\xf7`\x9cx\x09\x85\xcc9\ +\xc6 \x82\x93\xd5&\xca\xb7\xfcSP\x05\x98;a\x17\ +iO\xa8\xaa\x93U?\x13)\xb3\xc3q\xac<\x13\xce\ +/\x11'\xe6\x8c\xa8\xa6`\xba\xaaSd:\x91\xda\xda\ +\xda\xda\xd9J\xed\xec\xa4\xae\x0e\xf6\x0e\xae\x9e\xceR\xa9\ +\xb3g{wwOw\xf7\xf6\xaeR\x86\xea\x9f\x86\xa1\ +\x1c\x1d\x1c\x1c\x9d\x1c]\x9c\x9c\x5c<\x9c\x9c\x9c<\xf0\ +\xe0\xe4aI\xe2\xda\x94\x0c\xaa> \xae\xb6\xa0|\xbe\ +\x90\xf2!\x02WJ\xe8JU}\x03\x05\x95T\xed\xa5\ +\x12AK1\xc5Pm8!\xa1\x04\x22\xb1\xc4\xc6\xd6\ +\xce\xde\x81\xaa\x1fH\x11\x81\xd0\x1a\xe8B(\x11%\x14\ +\x88\x04b\x1b\x89\xadX(\x0d\x87@W\xa1\xa8\x9b[\ +\xa88y\xa8\xc2\xddg\xc2\xd40\x89\xc7\xfc\x95o\xa4\ +t\xf7\xf5\xcc\xd9]\x10\x1ea\x98vHn\xe3\xb7 \ +\xb7\xf2\xf4\xafJc\xa4\xd7\xaa-\x8f\xfb\xa7>\x9b\xa7\ +J\xdb\xb3\xda\x14\xd5\xee\xf0\xb0\xef\xe9\xdf\xde\x9c\xfe\xe1\ +\x11\xf3\x99\xcb\xfd\x03\x16\xaey\xe2\xad\xe7\xf6\x1e\xfd\xef\ +\xef/o\xddw\xec\xec\x95\xe1\x85\xa53\x16\xad\xdd\xf6\ +\xd1\xf1\x1f\xaeF\x0f\x18QT6\xf3\xf9W\xb6\xef?\ +q\xee\x9a+\x11\x08@[\x11\xa3\x93\x8dD\x1c\xc9\xa8\ +\xd0-\xd4M\x04\x1aL\xf0q\x17\x87M\x9d\xef\x81\x1a\ +\xec\xce9T\x19\xee[p\xda0m\x81<\xd7Si\ +\x8c\xf8\xd5O\x82\x0a\xd8\xf8G\xee9\x0cJ\xacn\xa7\ +J\x1b\x16e\xa2\xbf\xafQ\xa1q\x0d\x02jU\xa8\xfa\ +\x8aH\x85\x8cLW\x92H\xae\xe4-\xc8\xf0\xeb\xe9\xbb\ + c`\x86\xef\x82\x9c\x05\x19\xbe\x0b\xd7T{dU\ +}q\xbb\xc0C\xb7\x0b<|\xbb\xc0#\xb7\x0b\ +!\xc02\xd4m\x03\x9b\x08^[\x8b\xeb\xf2P\xe6\x9a\ +Q^\x07j\xfd\x1a\x8a\xa7[\x05m0\x8c\x06\x85\xf3\ +j\xfd\x0a\x96\x10\xb2\xfd\x09B\xda\x7fU\xeb\xe7\xfb\x12\ +\xd4Q\xb8n\xdb>g\x95\xc7\x0b\xeb\x0b\xebc\x1fj\ +Z\x19\x84\x06\xad\xe1\x8e\x11\x9a\x00K^\x10fWc\ +\x1eY\xaa\xa5\x97\x93\xa1\xdd\x94\xd0\x97\x99\x0d2\x18\x89\ ++iY`\xfdJ|\xcf\x09\x1b\xd6\xa3O\x0e]H\ +\xe3\x88\x9f\x96\x0d\x87Z\x06\x13\x16\xb8\xdcZ\x95\x9a\xf9\ +n\x89Z\xdb\xd8E\xbc\xc7d\xf5\xb0\xd4k\xc0}\xcd\ +M\xe216\x88\xb8|\xeeA\x84?\x1f \x22w\x07\ +\x22\x1c\xf3\x22\x84P5\xd7m\xb0\xddp\x82w\xde\x88\ +\xae\xe7,\xf5\x9e\xa1\x81!\xa7`.\x1e\x8cjf\xa0\ +E\xe49y2\xa5\xd9Pj\x09c\xc6Vb\x98C\ +8\x13\x0f\xd2\x01f6\xddI\x0f\x18\xfd\x87A#\xd3\ +\x97$\x9142\x90d\xc1Lg\x14y\x08\xe66\xc5\ +\xa4\x04\xe69ed2\x99Jf\x90\xd9d\x1ey\x8e\ +,%+\xc8\x1a\xb2\x9el\x22[\xc8v\xb2\x8b\xec&\ +\x1f\x91\xcf\xc8\x17\xe4\x189E*\xc8Y\xf2\x13\xa9$\ +W\xc9u\xe8\xecl(G\xca\x9d\xea@u\xa5\xfc\xa8\ +\xdeT\x18\x15C%Pi\xd4`*\x87\x1aE\xe5S\ +E\x94\x962S\x93\xa9\xc7\xa9\xd9\xd4\x02j)\xb5\x92\ +ZO\xbdA\xbdM\xed\xa6>\xa1\x0eQ_R\xa7\xa9\ +\x0b\xd4o\xd4_\x02\xa1@*\xf0\x10t\x16\xf8\x0b\x82\ +\x051\x82d\xc1 A\x9e\xe0AA\x91`\x82`\x92\ +`\xba\xe0\x19\xc1b\xc1*\xc1\xab\x82m\x82\xdd\x82\xcf\ +\x04\xc7\x04\x15\x82\x9f\x04W\x84D\xe8 \xf4\x12v\x13\ +\x06\x0ac\x84ra\x96p\xb4\xb0Ph\x10>*\x9c\ +%\x5c$\x5c%\xdc$\xdc)\xdc/<\x22\xac\x10^\ +\x14\xfe)\x92\x88\xdcE2Q\xa0\xa8\xaf(]4L\ +\xa4\x14M\x10=*\x9a#Z*Z'\xda&\xda+\ +:\x22:-\xaa\x14\xdd\x14;\x8a\xbd\xc5\xbd\xc5q\xe2\ +\x0c\xf1Hq\x91\xb8L\xb7;kw\xdd\xde\xd5>\xc0>\xde>\xcf~\x9c\ +\xfdT\xfb\xc5\xf6\x9b\xec\xf7\xd9\x7fm\x7f\xd9\xc1\xc1\xc1\ +\xc7!\xd6a\xa8\x83\xdaa\x8a\xc3b\x87\xd7\x1d>v\ +8\xed\xf0\xa7\xd4M\xdaK*\x97\x8e\x91\x9a\xa5\xcfH\ +_\x91~ \xfdRz\xd9\xd1\xd1\xd1\xdf1\xc9q\xb4\ +\xa3\xc9\xf1\x19\xc7\xf5\x8e\x1f:~\xeb\xf8\x87\x93\xbbS\ +\x90S\x86\x93\xca\xe91\xa7eN\xdb\x9c\x0e;]r\ +\xb6s\xf6sNv~\xc8y\x92\xf3\x22\xe77\x9d?\ +w\xbe\xe8b\xe7\xe2\xef\x22wQ\xb8<\xea\xb2\xcc\xe5\ +m\x97\x13.W\x5c\xdd]C]\xb3\x5cK\x5c\xe7\xb8\ +np\xfd\xc4\xf5\xbc\x9b\x8d\x9b\xbf[\x9a\x9b\xcam\xba\ +\xdbj\xb7\x0f\xdd\xce\xb8\x0b\xdd\xbb\xbb\xcb\xdd\x95\xee\x8f\ +\xbb\xafq\xdf\xe7~\xd6C\xe2\x11\xe0\x91\xe11\xcec\ +\xb6\xc7k\x1e\x07=*=\xdd<#<\x87{\x96{\ +.\xf3|\xd7\xb3\xc2K\xe8\xe5\xef\x95\xe1\xa5\xf1\x9a\xeb\ +\xb5\xc5\xeb\xb8\xd7_\xed:\xb7KnG\xb7{\xaa\xdd\ +\xa6v\x87\xdb]k\xdf\xa9}R{\xba\xfd\xac\xf6\x9b\ +\xdb\x1fk\xffW\x07Y\x87\xb4\x0e\xe3;\xcc\xef\xb0\xbd\ +\xc37\x1dE\x1d{u\x1c\xda\xb1\xac\xe3\x8b\x1d\xf7u\ +\xbc\xd8\xc9\xa3S\xdfN\xcaN\xb3:m\xe9\xf4\x95\xb7\ +\xc0\xbb\x97w\x8e\xf7\xc3\xde\xab\xbd\x0fx_\xe9\xdc\xa5\ +\xf3\x80\xce\xfa\xceK:\x7f\xd8\xf9b\x17\xaf.I]\ +\xc6uY\xd8\xe5\xbd.\x17\xba\xbawM\xe8\xaa\xee\xba\ +\xb0\xeb\xfb]\x7f\x94y\xca\x92e\x1a\xd9b\xd9^Y\ +e7\xefn\xe9\xdd\xcc\xddVv;\xd8\xed\xbaO\x80\ +\xcf0\x9fi>\x9b}\xbe\xe9n\xdf=\xa6{a\xf7\ +\x85\xdd\xf7t\xaf\xf4\xed\xea\x9b\xe9;\xd9w\xa3\xefW\ +~v~1~\xc5~\xcf\xfb\xed\xf7\xbb\xe6\x1f\xe0?\ +\xc2\x7f\xa6\xffv\xff\xf3\x01\xed\x032\x02&\x05l\x0c\ +\xf8\xba\x87c\x8f\xc4\x1e\x13z\xac\xeaq\xb4\xa7\xa4g\ +L\xcf\xf1=_\xe8\xf9E/A\xaf\xc8^\xc5\xbd\x96\ +\xf5\xfa\xbc\xb7\xa0wTou\xef\x17z\x1f\xea#\xee\ +\x13\xdbG\xdbgU\x9f\x13\x81\xd2\xc0\xe4\xc0\xd2\xc0\x8d\ +\x81\xa7\x83\xbc\x82\x06\x07M\x0b\xda\x1et)\xd87x\ +t\xf0\xfc\xe0\xfd\xc17C\x22C4!kBN\x85\ +\xba\x85\x0e\x0c\x9d\x16\xba3\xf4\xb7\xb0^a\xca\xb0e\ +aG\xc3\x1d\xc3\xfb\x87?\x16\xbe#\xfc\xd7\x88\xde\x11\ +t\xc4\x8b\x11'#\xdd#3#gF\xee\x89\xfc;\ +*:\xca\x10\xb5)\xeaB\xb4ot~\xf4\xf2\xe8\x13\ +1\x1e1\xd91sb>\x8e\x15\xc7\xa6\xc4>\x16\xbb\ ++\xf6\xcf\xb8\xa88S\xdc\x96\xb8_\xfa\x06\xf6\x1d\xdf\ +wC\xdf\xf3\xfd\x02\xfa\xd1\xfd\xd6\xf4;\x13\xef\x13\xaf\ +\x88_\x19_\x91 K\xc8Ox)\xa1\x22\xb1[\xa2\ +\x22qU\xe2\xf7I\xdd\x93TIk\x93\xce%\xf7L\ +\x1e\x97\xfcj\xf2\xa5\x94\x90\x14C\xca\xd6\x94k\xf28\ +\xf9#\xf2\x0fR\x85\xa9\x03Rg\xa5\x1eLsK\x1b\ +\x96\xb64\xed\xdb\xfe>\xfd\x8b\xfao\xec_9 r\ +\xc0\xc3\x03>H\x17\xa7\x0fJ\x9f\x9f~\x22\xa3s\x86\ +2c}F\xe5\xc0\xe8\x81\x8f\x0c\xdc;H:(w\ +\xd0\xd2A\xdf\x0f\xee5\xd80xg\xa6 s`\xe6\ +\xb3\x99_\x0f\xf1\x1b\xa2\x1d\xb2=\x8bded=\x9b\ +\xf5Mv@\xf6\x84\xecw\x86J\x86f\x0f]6\xf4\ +\x87\x9c\xd0\x9c\xc99\xfbs\xdds\xc7\xe6n\xc8\xbd\x9a\ +\x97\x9277\xef\xd4\xb0\x1e\xc3\xcc\xc3\xf6\x0cw\x1e>\ +f\xf8\xfa\xe1\xd7F\xa4\x8eX0\xa2bd\xf0\xc8G\ +F~6\xaa\xe3(\xf5\xa8\x1d\xa3mF\x0f\x1f\xbdv\ +\xf4\x95\x07\xd2\x1ex\xee\x81\xb3c\x22\xc7\xcc\x18s\xfc\ +\xc1\x80\x07\xcb\x1f\xfc\xe4\xa1\x8e\x0fi\x1ezw\xac\xf3\ +X\xc5\xd87\xf3\xc5\xf9#\xf27\xe4\xdfPd)V\ +)\xae\x14d\x14,/\xa8T\xca\x95\xcf+\x7fR%\ +\xa9\x16\xaa.\xd0\xf1\xf4\x02\xfa\x5ca|\xe1\x82\xc2\xf3\ +E\xf1E\xcf\x16](N,^T|Q-W/\ +U\xff:.}\xdc\x8aq\xd7\xc6g\x8d\x7fe|\x95\ +f\x84fs\x89mI~\xc9\xdbZ7\xedx\xed^\ +]\x17]\xb9\xee\x90\xbe\xb7~\x86\xbebB\xdc\x84\xe7\ +&T\x1a\x06\x19\xd6\x1a)\xe3\x83\xc6\x1d&\x0f\x18L\ +\x1d0\xf70?a>]\x9aP\xba\xac\xf4\x8f\xb2\xe1\ +eo\x96\xbb\x96k\xcb\x0fL\xec5\xf1\xa9\x89\xe7&\ +\xf5\x9f\xf4\xf2\xc3\xa2\x87\x95\x0f\xef\x99\xdcm\xf2\xd4\xc9\ +\xa7\x1fI~d\xe5\xa3\xd4\xa3\x05\x8f\xeey\xac\xfbc\ +\xd3\x1f;;e\xc0\x94uS\xed\xa7\x8e\x9f\xfa\x9fi\ +!\xd3\x16L\xfb\xfd\xf1\x11\x8f\xef\x9c\xdey\xfa\x94\xe9\ +g\x9e\x18\xf0\xc4\xc6\x19N3\x0c3N\xcc\xec;s\ +\xc5\x93\xa2'\xd5O\x1e|*\xfc\xa9%O\xdd\x9c\xa5\ +\x9a\xf5\xe9\xec\x90\xd9\x8bf\xdf\x98\xa3\x9c\xf3\xe9\xd3\xa1\ +O/~\xba\xea\x99\xc2g\x0e\xce\x8d\x9a\xfb\xe2<\xc9\ +<\xed\xbc\xe3\xf3\x13\xe7\xaf[\xe0\xba`\xd2\x823\xcf\ +f>\xbbm\xa1l\xe1\xac\x85\xbf?7\xf6\xb9O\x16\ +E,Z\xf1\xbc\xfd\xf3\xe6\xe7+\x16\x0f^\xbcc\x89\ +\xef\x92yKn,-^zlY\xca\xb2\xcd\xcb\xbd\ +\x97?\xb5\xfc\xda\x0b\xaa\x17\x0e\xbf\x98\xf4\xe2\xa6\x15\x9d\ +W\xcc^\xf1\xd7K\xea\x97N\xae\x1c\xb0r\xdb*\xff\ +U\x8bVKV\x97\xae\xfea\xcd\xf05\xfb_\x8ey\ +y\xfd\xda\x8ekg\xaf\xfd\xfb\x15\xed+\x15\xebr\xd6\ +\xed]\x1f\xbd~\xfd\x06\xef\x0ds7\x0a6\x9a7^\ +xu\xcc\xab_\xbc\x96\xfa\xda\x8eM\x81\x9bVn\xf6\ +\xda<\xfbu\xf2\xba\xf9\xf5\x1f\xdf\xc8\x7f\xe3\xf8\x96A\ +[\xf6\xbc\x19\xf3\xe6\xa6\xb7\xfc\xdeZ\xbe\xd5}\xeb\xac\ +m\xd4\xb6\x89\xdb*\xb7\x17o\xaf\xd81j\xc7\xa1\xb7\ +\x07\xbe\xbdgg\xdf\x9d[\xdf\x09z\xe7\x95]\xddv\ +-{\xd7\xf3\xdd\xb9\xef\xd9\xbf7\xfd\xbd\xaa\xf7'\xbd\ +\x7f\xe5\x03\xfd\x07\x17w\x17\xed>\xb3g\xec\x9eS\x1f\ +\x8e\xfc\xf0\xe8\xde\xa1{\x0f\xee\x1b\xb4\xef\xe3\x8f\xfa\x7f\ +\xf4\xe1\xfe\xe4\xfd\xef\x7f\x1c\xff\xf1\xaeO\xe2>y\xfb\ +\xd3\x98O\xb7\x7f\x16\xf5\xd9\xb6\x03\x91\x07\xb6\xfe'\xf2\ +?[\x0fF\x1d\xdc\xf6y\xf4\xe7;\xbe\x88\xfdb\xe7\ +\xa1~\x87\xde;\x9cxx\xf7\x91\xd4#\x1f\x1d\xcd8\ +\xfa\xd9\xb1!\xc7\x0e\x1d\x1fv\xfc\xe4\x891'*N\ +\xaaN\x9e\xffR\xf3\xe5\xaf_\x95~u\xfd\xd4\x94\xaf\ +\xc5_\xcf\xfa\xc6\xe5\x9bE\xdfz\x7f\xbb\xea\xbb\x9e\xdf\ +m\xae\x88\xaax\xf7t\xea\xe9\x03\xdf\xe7~\x7f\xea\x8c\ +\xf2\xccO\xff5\xfe\xf7\xc6\xd9\xe9?8\xfe\xb0\xe8\x5c\ +\xd7s\xeb\xcf\x87\x9d\xdfu\xa1\xff\x85/~|\xe0\xc7\ +\xb3?\xe9\x7f\xba~q\xc6\xcf\xae?/\xbf\xd4\xe3\xd2\ +[\xbf$\xfdr\xa0rd\xe5\xd9_\x0d\xbfV\xfd6\ +\xe7r\x87\xcb\xaf\xfc\x1e\xf1\xfb\x9e+\xd9W\xbe\xbdZ\ +r\xf5\xfa\xb5Y\x7ft\xf8c\xdd\x9f1\x7f\xee\xffk\ +\xc4_\xe7\xae\x97\xdd\xb0\xb9\xb1\xf8\xef\x9e\x7f\xef\xbc9\ +\xe8\xe6\xd7U%5+\x93<<<<<<<<\ +<<<<<<<<<<<<<<<<\ +<<<<<\xffbl\x81\x91@[\xeb\xf1oe\ +\x05\x80{e^\x04\xf0Z\xb4\xb5>\xff&\xb0\xde\xb3\ +\xf7+}\x06t\x01ZBVG`\x180\x13\xd8\x01\ +\x1c\x03~\x00\xaeU\x83\xee\xe3\xc0\xdb\xc0\x93\xc0p\x00\ +\xd3\xb4\x84.\xf7\x0bX\xdf\xb1\xde\xb3\xaf\xc1\x8f@\x0a\ +\xc0E\xfe\x9d\x802`?p\x13hx\x97Z\xe3`\ +\x9aO\x80r\xa03\xc0\x85N\xf7#%\xc0_\x80\xb5\ +\xdc7\x00\x1dp\xaf\xf9\xc5\x00\xeb\x80\xeb\xc0\xdd\xda\xbc\ +10\xaf\x0d@\x1c\xc0e\xd9\xef\x17\xfa\x02\xe7\x00v\ +\x99\xd7\x02\xf6@S\xf3\xf0\x06\xd0F\x5c\xd9\xbc1^\ +\x05Z\xaa\x9dlK:\x00\x1f\x01\xec\xb2\x1e\x02|\x80\ +\xdb\xa5\x93\x00\xd8F\xfc\x0e\xb4\xb4\xed\xad\x5c\x01&\x01\ +6@k\xd9\xa75@[.\x01\xd8e\xbd\x04\x0c\x00\ +\x1a\x8a\xdf\x1f\xf8\x12h-\xbb\xd7\xe7\x14\x90\x0e\xb4\xb6\ +\x9dZ\x9a\x02\xe0\x0f\xc0Z\xce\xbf\x01\xecK\xad{\x1e\ +\x05\xc0\x13@[\xd9\xbd>8fB\x9d\xda\xdan\x5c\ +\x12\x09|\x0f\xb0\xcb\xf9\x1a\x80\xed\xfcV\xa0\xadl\xdd\ +\x18\xdb\x01\x17\xa0\xad\xed\xc6%\x9e\xc0\xfb\x00\xbb\x9c\x7f\ +\x02md\xe2;\x82\xedQo\xa0\xad\xed\xc6%\x22`\ +>\xd0\xd6\xb6m*\x97\x814\xa0\xad\xed\xc6%\xa9\xc0\ +\xfd\x5c\xef\xeb\x83s\xea\xff\x97k\x80c\x1c,\x0f\x17\ +v9\x0b\xe0\xbd\x84c\x96^\x80#\x80\xdfB\xf0\x07\ +\xce\x00\x5c\xc8\xb0\x82:\xa3\xeemm\xbf\xe6\x80\xe3N\ +.l_\x01\xe4\x02\xb7\x1b\xa3`\xdb\xcd\x85\xdd\xd9\xa0\ +\xee\x8d\x8d\x9d\xefwp\xfc\x83\xf3\x9c\xe6\xda`\x0e`\ +\x07\xdcI^K\xd8\x1f\xc12D\x00\xada3\xae\xc0\ +\xf9}\xfd\xf5\x88\xbb\x05\xe7\x0c\xe3\x80\xa6\xcal)\xfb\ +#X\x96\x7f\xca\x1a\x1e~\xc7\xe6\x08\xd0\xdc2\xdf\xed\ +\x1a^K\xda\x1f\xc1\xb5\x14\xecoZ\xcan\x5c\x80\xf3\ +\xdb\xb7\x00.\xca\x8bm~(\xd0T\xd9-m\x7f\xe4\ +\x0d\x80\xf5\xdd\xa2\xfb\x8e\xc9@s\xcb\xc8^\xeb\xbf\x0a\ +<\x084Evk\xd8\x1f\xc1u\x94\x96\xb6\xe3\xbd\xd0\ +\x0f\xc0\xb5\xff\xe6\x96\x0f\xc7\x97\x95\x00\xdbo\x1e\x80\xf3\ +\xb8\xdb\xc9o-\xfb\xe3\xb3\x84h\xa0\xb5\xec\xda\x14\xb0\ +\xcd\xc7\xf6\xa2\xb9e\xc3<\xc4\x80\x1fp\x14`\x87\xed\ +\x01\xda\x01\x8d\xe9\xd0Z\xf6G\xbe\x02\xee\xe6\xd9FK\ +\xf34\xc0E\xb9\x9e\x02\xacy\xe2\xbc\xaa\xfe\xf3\x98\xff\ +\x02\x8d\xd5\xbd\xd6\xb4?2\x15h=\x0b7\x0e\xae\x19\ +\xe2\x9a\x09\x17eJ\x02\xea\xe7\x8f\xcff\xd8\xed\x1a\xae\ +c\xa8T*U\xfdx\xadm\x7f|\xae\x81u\xa4U\ +\x8c|\x1bJ\x01.\xca\x83}-\xb6=\x0d\xc9\xc0\xf5\ +\xa3\x8b\x00;\xfeR\x00\x9f\xf7X\xe3\xb4\xb6\xfd\x91\x09\ +@\xebY\xbaa\xb8Z\xcb\xff\x1a\xb8\x9d\x1c\xfc`\xf9\ +A\x80\x9d\xe6c\x00\xdf\x93\xc0p|\xce\x19\xd0D\xb8\ +z\xe6\xb6\x05h\x1d+7\x0eWe\xd9\x0b\xdcI\x16\ +\xaeC\xac\x06\xd8\xe9\xce\x03\x09\xc0\xdd\xe8\xfc\x1e\xc0\x85\ +\xce'\x80{\xb7\x1c7`\xbb\xc1EY\xde\x04\x9a*\ +S\x0f\xb0\xdfOA\xb7F\xa3\xd145\xfdf\x80\x0b\ +\x9d\xb1\xec\xf7f5\xee\xf8\x0e\xe0\xa2,\xf8\xee\xc4\xdd\ +\xc8\xc5:\x8fu\x9f\x9d\xc7*\xa0)ku8\x96\xe5\ +B\xe7o\x81{\xb7\x1c7\xbc\x03pQ\x96o\x80\xbb\ +\x95\x8dm?\xf6\x01\xec|\xb0\x8f\xc0\xbe\xe2v\xe9\xb8\ +j3\xf1}\xc7{6\x1cG\xe0\xbb\x03\x5c\x94\x05\xd7\ +\xda\xd9\xe3\x99\xa6\x82\xef\xf0,\x07\xd8y\xe1X\x09\xc7\ +L\x0d\xc5\xc71\x16\x17\xeb\xe2\xc8t\xa0\xf9\x16l\x1e\ +]\x01.\xd6\x1d\x90\xe6\xbc;Z\x08\xb0\x9fq\xa2N\ +f\xa0~\xbcD\x80\x0b]Q\xd6\xfd\xf2\x8e\xefz\x80\ +\x8b2\xcd\x06\x9a\xa3\x07\xbe;\x8asdv\x9e8\x87\ +v\x00\xacqp\x8e\xcd\x85\xae\xf8\xeeq\xf3-\xc7\x0d\ +8\xf6\xfe\x0dhn\x99\xf0}\xa1{i\x83\xd8\xe0\x1a\ +Q\xfd\xfe\x15\xd7\x92|\x01\xcc\xfb4\xd0\x5c=\x7f\x01\ +\xac\xf3\x8e\xfb\x85\x87\x80\xe6\x96\x0b)\x06\x9a\xab\x0b\xb6\ +\xf1\x0b\x81\xfa6{\x16\xe0B\xc7\x11\x00\x176\xe3\x1a\ +\xeb~\x98\xe6\x80\xf5\x93\xdd^4\x07\xac\x13\xec\xe7\xff\ +\xf7\xb2\x8f\xa0>\xb8\xee\xc1\x85n-\x01\x8e\xbd\xeb\xaf\ +\x11\xdc\x0bk\x00\xaet\x0a\x03\xb8X\x1bG\x0e\x00\xf7\ +\xfb;\xd3\xf8\x9c\x1a\xdf\xd3inY\xef\xe6\xd9\xfb\x9d\ +\xe0b\x8d\x10\xfb\xf5\xfb\xad\xcdo\x8c\x10\xa0\xb9k\xd2\ +\xd8V\x18\x80\xe6\xea\x82c\xd0\xe6\xb6;8\xb6\x08\x06\ +\xb8\xb0Mk\x91\x01p1/x\x0e\xb8\x97\xf7\x0e\xf0\ +\x99\xdcb\xa0\xb9\xf2\xb1\x0c\xff\xd4=\x02c\x00.\xae\ +\x01\xeeo\x1c\x0b4\xf6|\x80\x0d\x8e1\xf3\x81\xfak\ +C\xf7j{,Ck\xd8\xaa\xa5\x18\x05p5?\xc6\ +gN8\xef\xc1\xfd\xa58\xd7\xf2\xae\x06\xdd\xe8\x87\xe3\ +/\x1cgr!\x0buF\xdd\xdb\xda~\x5c\x90\x07p\ +\xb9\x9f\xb1\xa5A\xdb\xe3~\xe3\xb6\xb6\x1b\x97d\x03\x5c\ +\xbd\x07\xdd\x1a<\x03\xdc\xe9\x9d\x97\x7f\x1a\xe1\x00\x17\xf3\ +\xff\x96\x82\xbd\x8f\x19\xc1\xbd;\xb8\x87\xa7\xad\xed\xc6%\ +\x1e\xc0\xbb@[\xd9\xb81\xd0\xd6\xf8\xdc`\x13\xc0\xf6\ +\xc75)|\x97\xbb\xad\xed\xc6%B\x00\xd7:\xdb\xca\ +\xd6\xf5a\xb75\xf8~\xe7\xc3\x00\xbe\x7fm\x0d\xc7\xbd\ +\x9c\xb8\xa7\xb3\xad\xed\xc658Gh\x8b\xf7F\xac\xe0\ +;\x17\x83\x80\x86t\xc31?\x8e\xb7\xd8\xf1\x17\x01M\ +\x19\x03\xff\x93h\x8b\xfd\xef(\xab)\xfb\xdfq]\x1d\ +\xdf;g\xa7\xdd\x07\xe0^\xff\xd6\xb2Ok\x81k+\ +\xf8\xcd\x88\x96\xb6=~\xdb\x03\xe7\x0cM\xd5\x0b\xdf\xf3\ +\xac\xaf\x17\xce\x07\xf1\x9b\x17-i\x8f\xb6\x02\xc7H+\ +\x01\xf6\xfe\xf9\xe6\x82\xcf\x0a\xf1\xdd\x88\xe6\xec#\xc2\xb5\ +(\xf6<\x12\xc7J\x5c\xae\x11\xdeo\xe0\xb8\x0f\xbfm\ +\x83c\xa5{\x99\xbba\x1a|\xcfJ\x0bx\x01\x5c\xe8\ +\x94\x0c\xe07\x8e\xd8rp\xce\xfd\xff\xfe\xed/W\x00\ +\xfbjl\xb3\xf1y.~\x93\xe9$\x80k<\x17\x00\ +t\xe3{(\x1b\x01\x8c3\x10\xc04-\xa1\x0b\xae\xaf\ +\xe3\xb7\xbe\xd8\xd7\x80\xff\x06^\xeb\x82\xf5\x9d\xfd\xed\xbb\ +\xb6\xd6\xe7\xdf\x0a\xd6\xfb\xff\xf7\xb6\x87\x87\x87\x87\x87\x87\ +\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\x87\ +\x87\x87\x87\x87\x87\x87\x87\x87\xe7\x1f\x81\xf0%\x8a\x08\xe1\ +\x97\x82?\xf2\x92\x80\x88\x187!\xf9/\x09k\xdd\x96\ +\xa8\xff\x03;\xbc\xca\x99\ +\x00\x00\x08'\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / slice / n\ +ot active - save\ +d\x0a Created with\ + Sketch.\x0a\ + \x0a \x0a \ + \x0a \ + \x0a \ + \x0a \ + \ +\x0a \ + \x0a <\ +rect id=\x22Rectang\ +le-22-Copy-2\x22 tr\ +ansform=\x22transla\ +te(7.409295, 7.7\ +12904) rotate(-4\ +5.000000) transl\ +ate(-7.409295, -\ +7.712904) \x22 x=\x226\ +.40929495\x22 y=\x22-1\ +.28709556\x22 width\ +=\x222\x22 height=\x2218\x22\ +>\x0a \ + \x0a \x0a<\ +/svg>\x0a\ +\x00\x00\x05\x1d\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a\ + \x0a \ + \x0a \ + \x0a \ +\x0a\x0a\ +\x00\x00\x05\x09\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\ +\x0a \x0a \ + \x0a \ + \x0a \ +\x0a\x0a\ +\x00\x00\x07^\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outlin\ +er / visible / m\ +ixed state - hov\ +er\x0a <\ +desc>Created wit\ +h Sketch.\ +\x0a \x0a \ + \x0a \ + \x0a \ + \ +\x0a \ + \x0a\ + \ + \ +\x0a \ + \x0a \ + \x0a \ + \x0a\ + \x0a \ + \x0a\x0a\ +\x00\x001/\ +\x00\ +\x01\x04 x\x9c\xed=\x07@SW\xd7\xf7%\xec\xa5\ +lpF\x147#\xcc$\xa8\x88\xb8P\xa9\x0a\x8a\xa3\ +\xfaIH\xc2\xd0\x90`\x12\xdc\xab\xcb~\xd5\xd6\x81\xd6\ +]m\xd5\xda\xaa\xd5\xd6Zg\x9d\xe0.8\xab\xb6\xda\ +\xe1\xde\x0a8\x90\x99\xfc\xe7\xbc\xe4a\x8c\x8c\xa0Q\xfb\ +\xf7\xcb\x0d\xe7\xbd;\xce=\xe7\xdcs\xef;\xf7\xdc\xfb\ +\x06\xb1\xb1\xa4-!\xc4\x86x\x115\xb1\x80\x18E\xb4\ +\x076}J\x84\x03\xa5\x17g\xd1q\xc0\xa3\xfc)\xb6\ +.\x1f\x90)+]\x9c\x05\x07g\x86\xce\x90\x06\x94\x8b\ +\x1e\x8e\xbb.\x8e\xb5=\xf4hz2\xf8s\x08\xd5\x80\ +Xj\xe3T\x18\xd5\xb02\xde\x89j\xa4G\xa7\xb5\x1e\ +/.\x1e\x89\x0f\xc4\xbaSAt\xdc\x0d\xe2\xa9T\xdc\ +3|\xd6.\xa7\xe7\x0d\xc3x\ +\x83_!\xbf'\xea\x05\xf4\xa4\xfd\xd9\x95O#\xa4U\ +}\xe6\x1c%\x96'I8\xfdR\xe5*\xb92U\x9e\ +\xc1\x89\x8e\xe6\x04\x05r\xc39\xad\x07\xa5\xc9\xc4\xf2\xb1\ +\xca6\x04\x93\x82\xc0\x10\xf8\xe3p\xb9\x82 \x9e\x80\x1b\ +F:D\x8e\xcb\x10\x8aFIT\x9c$IJ\x9a\xac\ +\xa3O\xfe\xcf{}8i\xe2\x8e>\x83Bc\x03c\ +3\xa2%\xa9i='($\xf1\x13\xde\x19 \x9a0\ +J\xc4\x17\xfbDv\xb2\xeb0N0.=#]\xa2\ +\x12r\xc6\xa5KeJ\xc1\xb8\x8e>B\xe4/\x808\ +f\x07\xf8ph\x14\xd5\xa8\x8e>Z\xc1\x06\xc7\xf6\xe3\ +D\xcb\x15\x12N\xa8\x7f\x98\x9f\x88\x1b\xcc\xe3\x84\xf3\xfd\ +\xb9\xa1|^PH{\x144, \x90\x1f\xc0\x0d\xf1\ +\x0b\xe4\x0a\x02\xf9\x82@.G\x17|:\xd9\xc1\xb1\x83\ +B\x9c,\x88\xeb\xda]\xc7\x0eR\x1d}RU\xaa\x0c\ +A@\xc0\xd8\xb1c\xfd\xc7\x06\xfb\xcb\x15)\x01\x5c>\ +\x9f\x1f\x10\x18\x14\x10\x14\xe4\x07\x18~\xca\xf12\x95p\ +\x9c\x9fL\xd9\x5cK\x84\xa1\xd3U\xa2\x14)\xd22T\ +ir\x19\x07\xd3\xc2$y\xa6\xaa\xa3\x8f\x8f\x1dG/\ +\xe8\xda\x95\x9eQ\xc9H\xa6\xf4\xa7\xdb\xe8/\x92\xa7\x07\ +\x8c\x13f\x04p\xfd\x03\x03\xaa\xaa$\x16U\xd6\xc9\xc8\ +THi\xd1\xc4\xa2\x00\x89T\x92.\x91\xa9\x94P\x8f\ +[e\xbd\x0c\xa6\xef\xaafYY\x5c-c\x9066\ +\xb6fy\xd3\xd3\xab\xac\xa9Tu\x1b\xa3\xaa\xb9\xa6r\ +\xc0\xf8\x0cI@\x9cD)\xcfT\x88$\xdd\xc6@S\ +\x9e\xe9\x15U\x0b\xdc\x05\xd1\x0a\x89P%\xe9\x0a\xd0\x09\ +G\x9b_`\x90_`\xf0\x00n\xa8 0L\x10\x14\ +\xea\x17\xc8\x13\x04\x06v\x080\xc04\xa0\x11+\x17\xa7\ +%\x8f\xd7\xa3\x01\x83\x22d\x003b\xfd\x02\xc3+i\ +\xe8a\x1a\xd2\x801(\x16\xaa\x84FQ\xd1\xc7\xad\xaa\ +=r\xc5\x00\xb9\x5c\xda\xa9\xd6\x0bL\xafa\xba*z\ +\xd4\xc4\x22A\xb2\x5c\x91.TuJK\x17\xa6H\x02\ +Ti\xc9\xc9\x1d\x02\x9e\xe5\xea\xa1Vv\xb4 Z.\ +\x95+\xa0\x95\x92N\xc1\x1d\x02\xaa\xca\xae\xb2VLt\ +t?\x85<9M*\xe9\xa4\x8c\xeb\xd1\x85\x13\xd3-\ +:\x8c\xcb\x0f\x0b\xf3\x0b\xf2\xe7\xea\x93\xd1\xc3\xab\x92N\ +W\xb9(\x13Gl\x94L$QB\x93\x94\x9d\x9e\x1b\ +9\xf4\xb5\xd4E\x98\xf2|.S M\xeb\xa4\xb5\x08\ +b\xb9(M\xfcll\x0b\x84\x22\xa1D\x12\x92\x9c\xec\ +\x07\x22\x05\xfaq\xb9\x92p\xbf$!\x1c$a\x92p\ +a\xa8H\x1c\xc4\xe3\x86t\x08\xd0\x91\xa8\x8e4(\xda\ +_\x0cd\x93\x93C$a\xc1\xbc0?Ir\xb0\xc4\ +\x8f+\x09\x91\xf8%\x85\x8bx~a\xc2\x90PIx\ +pRP\xb8H\x5c51m\xee\xf3\xe2\xeb+\xa7\xa6\ +\xc6w\xa0/4A\x8cL\xa9\x12BqLWZ\x9e\ +4\x90\x87\x1f\x1a,\x11\xf3\xf9\xc9~ S\xb2_R\ +(\xc8#\x0c\x0a\x0c\xf3\x13\x06\x07\x07qy\x81a\x10\ +\x0f\xa1\x87\xc9\xf3\xd5_ \xcdp\x87\xb2\xaa\xb5\x18\x1e\ +\x12\x1c\xce\x0b\xe2\x89Q\x8b!Z-\xf2D!I~\ +\xe2\xb0d\x89(\x5c\x98\xc4\x0b\x16\x051\x8c\xf4\x88\xbd\ +\xc0\xa8\xaf\x22\x0d\xcc\xbeP\xaa\x87S\xa9[Qp\x90\ +$\x9c\xcf\xf3K\x16's\xfdB\xf9!b?~h\ +2\xdfO\x18\x12\xc6\x0d\xe7\x86'\x85\x09\x85\xe1\x0c\x8b\ +*\xc8\xbc\xc0\xaag\x1a\xeaq|\x15\x83(^2\xba\ +\xba\x9e\xa6\x0dt\x86P\xa1\x94\xa0\xf9\xe9\xe8\xc3\xd8\x1f\ +\x9f\x17*`\x1d\xda\x8c\xc1\x08C\xd3\xdeID[\x18\ +\xe8\xfe\xe7r\xab\xaf\x96\xf6bw\x1a\xa7\x82\x17\xaaW\ +\xcfcl\xaaDV\x93e\xd4\xc3\xaa\x9e\x88R\x9e\xac\ +\x1a+TH\xa2R@\xd3\xc6\x98\xa5\xaa\xaa\xbd\xa0\xef\ +Z.\xb9W\xe8\x08\xa5p\xcc\xabuCprxX\ +\x92\x04\xac6O,\x0a\xf2\x13\xf2B\xa0\x07P\x87\xe1\ +\xa1\xdc\xe0\xe0\xf0 a\x08\x97+~\xb5n\x80>\xe0\ +\x0aB\xb8o\xbf\x1b\x9e\x91\x17\xa5\x0ae)\x12q\xa7\ +\x00\xa6\x22\x93\xf1\xff\xa9\xe7\x8c\xb3\x87/\xd7sUN\ +\xe8\xff\x82\x9e\xd3\xe6>o\x13\x19;k`C\xb5\xa8\ +z\xfe\xac\xd6Y\x0e\xd0y\xcb\xe0\xa8\x07Tz\xeaU\ +\x09l\xfa`fbfbfbfbfbfb\ +fbfbfbfbfbfbfbfb\ +fbfbfbfbfbfbfbfb\ +fbfbfbfbfbfbfbfb\ +fbfbfbfbfbfbfbfb\ +fbfbfbfbfbfbfbfb\ +b&v\xcf\xde}\x95\xc8\xc4\x1d}\xc6\xfaDv\x22\ +\x8d\xa8\xa1\x84\xdd\xd0\xb7G\xe5\x99E\xe8Wzy]\ +bb-|\xe9\xf7o\xeb\x1f\x1e\xeey]\xb5E\xf6\ +\xe4\xe2\x1e\xfe\xfc}\xb7\xc7\x0f\xa3\xcb\x04t\xd9u,\ +g\xde`&\xf6\x19\x8a4\x99\xaao\xa6*#S\x05\ +I|\x95\x98\xf4S\xaa\xe2\x93\xe4r)\x8d\x11#S\ +I$\xb2\xcct&\x8e\xe7h\xa9\x02\xd3\xf5\xe8\xba\xf1\ +i\xe3\x10\xa3K\x9a\x0a\xeb<\xa3)Q\xbc#L\x97\ +\x0c\xe86x@%3m\x85~\x0a\xb9<9^\xa2\ +\xca\xcc\xe8\x9b4R\x04\xd9\x0e\xa4\x1fQ\x109\xfc\x92\ +\x09\x87\xc4\x13\x09Q\x91L\x92AW\xb1\xcb\xa8\xc4f\ +\xc8t\x91\xaad:\x89\x1c\x922\xd3\xa4\xaa4\x19M\ +\x12\xd2\xb64vt\xec\x90\xdeZmD >\xcb\xef\ +\xb9\x16\xbb\xe8\xb5\xb8/\xfdF\x82R\xfb\xae3\xb4+\ +C%c\x1a\x01\x8dLRT&\xe2R\x94\xb1\xcfJ\ +\x14\xb2\xe8g\x09\x99\xeaY\xa2O\x92TY\x99x'\ +E5\xa62\xd1-]\xda\xb52\x01z|F\xba\x8b\ +hT\x8aN\x11Z\x01I\x5c\x8f.\xd1D\xfbj9\ +\x89\x13s8byfRg\xf9%\xc2\x84\x1e\x0a\xd9\ +\x0by]\xa4/\xe2uQ\x88\x07\x0c\x94\xa9\xba7\x8f\ +\x93\xaa\x88^\xe8\x22\x15s\xaa\xca\x8fSJUt~\ +\xbfq\xd2\xceq\x95\xd9vc$\x22\x95\x5c\xd1U\xa8\ +\x12V\x8e\x8a~)\xfd\x94\xcc\xa8\xc0\xb8\xee\x1cM+\ +A\x92\xac\xaa\x8a\xfc\x00yF\x95l\xe3ERm~\ +?\x85\xa8\xf3\x90\xca\xec\xfa\x22\x85?\xf0\xeb\xb5\xc7_o\ +9x\xf6\xfa\x93\x84\xe41\xd3\x17\xac\xd9z\xe8\xdc\x8d\ +\xa2\xf0\x1e\x83R\xc6~\xbc\xf0\x9bm\x87\xcf\xdf|\xea\ +LX,\x90\xd6\x82\x96\xc9\xda\xca2\x94\x16\xa1\x19\xd7\ +\xc5\x02$\x18\xed\xe3j\x19\xf4\xde\x5c7\x94`\x7f\xdc\ +\xa9\x82\xe0\x16I\x97\x15\xefgE\xc7\xbb\x8b\x94!\x85\ +\xbeV(\x80u\xcb\xd0\xec\xd3 \xc4*Oq\xb7\x81\ +a*\xc9\x95J\x11\xaa\x97\xa0\xd53\x114\x17\x88\x03\ +\x9b\xe6\xe9L\x22\xc9\x93\x86\xf9\x12\xf7\x85{g\xe5\x1c\ +X\xd7j}\xf1\xc0b\x0d\xd9\xd4w}\xd3S\xe7:\ +\x9c\xb86\xe4\xec\xb9\xbbM\xbc\xf6\xfbw\xb0\x98\xffW\ +\xc5\xc6\xa9\xa7\xa6D\xde\xeb]\xb4CC\xba!\x12\xbb\ +h\xcc\x88\x07S\x9a\x05\xfc\xfe\xfb\xd4\x1d\xc5\x1f\xce_\ +QY\x10p\xe1f\x85\xe7U\xf5\x81z\xda\x92\xbd)\ +\x12\xf5\xcd+.qSu\xd9{G\xadx\ +\x9a\xea\xb2.qj\xef\xef\xafLm\x16\xf3\xce\x02Y\ +|\xea\xc6\x90\x80\xa9\xa7\xd2\xca7\x0e>6\xf6\xc2\xdd\ +\x0d\x99\xb3\x1e\xa8\x9a\xb0\x7f\xe8\x17\xd3k\xe8\xe0P\xe1\ +\xe0\xfd\x8e\x7f&\x96F]P7\xed1\xf2\xfb\xcf>\ +*\xfatl\xc75M\x1a\x93&\x0e\x166[gF\ +l\xba\x1f\x13\x13\xbc\xe8\x9c\xa4\xe3w\xd4\x06g2z\ +_\xe7\xeeO\xaf\xff\x11\xe37\xea\xcfF\xb7\x1c\x1c\xd7\ +\xe6g\xef\x9cn\xbd\x87\xb3\xe8\xe4\xea\xd5~\xcaE\x97\ +n,\xca\xf8\xb5\xfe\xd6\xc0\x87\x87\xa2CO\x1f\xaah\ +\xa6!S\xec\xbd\xdf\x99\xf9E\xec\x86\x1f\xc6\x08f;\ +\xff\xd1bM\xad\x8d9]sc\xfa(R3=\xf9\ +\x1f\xcf\x1a:\xa9\x8b\xcb\x1f\xc7\x0e\xc9\xbaM|gV\ +\x83-\x7fY&\xfd\xfe\xee\x9d\xf1\xa2\x03\xbc\x16\xdfD\ +\xaf\xbe\x10\xb6g\xe3\xa5\x07M\xe7\xac\x1f\xc2\xdbr-\ +\xac\xf1\xaa\x8fOe\x5ck?\xf4\xdedy=\xe1\xc7\ +Nv\xa7\xd7\xaf\x8b\xbb\xd4\xb1\xdf\xe0\x07\xd7F\xba\xc4\ +\xaf\x98\xd2q{\xfe\x85\xc2oR\x9c\xec>_\x9c\xf0\ +{\xe7\xaf\xd5\x97\xce4\xfb\xb3\xf8#e\xaboE\x9d\ +~\xdc\x97#.\xbe\xd5)r\xd7\xe6\xb8\xb8\xb9\xa3\xbf\ +\xcd|\x1a\xfa\xc1\xaca\x93X.\xbf\xef\xdb\xb8\xa0\x9f\ +cW\xde\xcf\xb7#N\xec\xf7\xe5\x8f\x1fqZZc\ +\x93\xce\xd4\xd2?\x17<\xba\x87\x0eq\xbcP\xf8\xed\xe5\ +\x9c93\xb2z\x8d\x96\xef\xdb3\x8f\xbb{\xc5\xae\xbf\ +\xaf\xb8g\x9ej-X\xb2\x5cro\xd4\xecO\xc8\xea\ +o\xa8\xc1\xab\xac\xca\xfe\xcb\xdd\xb4bW\xfe%\x8f\x9f\ +\xd3\xd6N\x1f|\xe8\xa7\xe2i\xac%\xbd\x14\x0f'\x08\ +E\xe1q\xbd/M\x5c2\xbex\xcb\xc0\x95e\xa9S\ +nx\x15\xa6]*Ox\xb8\xf6\xf3i\xbf\x1c/\x9a\ +\xd8\xf4\x8f\xa26m\x8emQ\x7f=kR\xf7\xab\x81\ +?\xed\xd4\x0ak/\xb8a5\xb4\xc8\xa9A\xe2\xa4\x05\ +\xb3{\xa9\x85\x7f\x9fSS\xbe\x91\x9a_\x1f\xcb6\x94\ +\xff9\xd5e\xf3\xe0\xa7\x09\x97\x8a\xbc2.m\xb8\xb8\ +V\x92\xdb~\xaa\xdd\x8a{K4\xe4t\xd3\x1d\xbe\xa1\ +\x9d\xfe^\xa8\x9eS\x91S\x96U6eDi\xf4\xd3\ +z\x0f\x124D\xbc\xb9\xa2YYVE\xd6\x89\xc7\x1f\ +?\x88\x89\xed\xbb\xed\xba\x86\xac\x8e\xccP_\xdb\xa3\xc3\ +\xfd|\xef\xef\xed5\xa4\xe7\x94k{\xb5\x98\xf1\xf1\xf7\ +K\xa6\xde\xae\xf7G\xe4\x8e\x00\x06\xf7\xba\xbc\xa8w$\ +0\x08\xd0a\xce\xff\x95\xa1\xdf\x9b\xc1}W\xcb\xa0\xb7\ +\x16\xd1\x97\x7f\x5c\xb9\xfc\xcaM\xefVq\x09\xdf\xf4j\ +\xfa\xe5\xd8\xa5{\xa7\xf5o\xdcr\xc7\xd9k\x1f)v\ +\xfe\x1e\xcf\xf6j\xf6\x15\xb4\xe7w\xed\xac\xd7\x8c\xb6\xeb\ +\xc3\x09\xed\x9f\xc2\ +i29\x0b\x5c\xcatX\x8f\xe2Wx\x06\x0f\x19\xca\ +\xb1>\x0e.\xa5-x\xb2\xe0<\x09E\xca\x8c\xd8\xf8\ +\xee\x03hW\xab[4\x07?\xd5C\x9e\x0bE\xe7\xb4\ +\xce\xca\x19\xbf\x9e\xfd8\x1cR\xb7\xe0,\xcaP\x80+\ +B\xf5\x83x\xb0X\xa2\x04\xe7\x8d\xfa\x10\xe2\xd2\xb1\xaa\ +\x0c\xccGO\xc0-i\x14\xc6Y\xe8\x03\xb8)@@\ +\x88{a\x83\xa4\xa7\ +\xa8\x1a\x0b\x8d\x0c\xd8\xb7\xda\xd8\xa3\xfet\x9fQ\x1e\xb9\ +\xcf\xf2\xaa\xc2\x93\xaf\x04/\x0c\xd6\x84\xec9\xcf\xf2\x92\ +\x16\x13\xb2\xed#B\xbc.<\xcbk\xf1%\x8cQ\xe8\ +\xb7\xad'\xf4\xda\xe3\x81\xe3E\xef\xf3gi\x12\x91?\ +*\xb42\xd4\x8a`D\xd0\xe3\xe7\x8f\xe4*\xd5\xc3\xe9\ +\xaa\xf5s9\xa87\x11x\xb3\x99\x0a\x0e\xac\xc7E\x12\ +\x8e\x9f\xe1 ~\xe9\x8aU\xcb\xd1>N\x92,\xc1u\ +\xbf\x84\x93\x00\xa3,M\x96\x02\xdd-\x13\xa7\xd1_r\ +K\x93U\xd7\x89/Y\xcd h\xc75\x04\xd7\xd5j\ +\xe26\xc2\x9f\xd4?\xe1F\xd8\xf7s\x89\x85\xab=a\ +\x0f[\x0e%Te\xbf\xf5\xb1M x\xe5\x0djz\ +S;\xee\xe9P\xc5\xa2\x935\x1b\x0f\xca4z\xa9E\ +\xa2\xe3\x06pD\x99\x8a1\xda2zueI\xec\xc0\ +H\xb9\x11o\xd2\x844'\xad\x89\x1f\x18\x9ap\x12A\ +:\x93n\xa4\x17\xe9K\x06\x90!\xe4?D\x04\xc6(\ +\x9d(\xc8X2\x89\xbcG\xa6\x93\x99d\x0e\xf9\x9c,\ +!+\xc8j\xb2\x96l$?\x92md\x17\xd9O\x0e\ +\x91_\xc8Ir\x96\x5c$\x97\xc8ur\x97\x14\x90\x22\ +R\x06\xee\xae5\xe5H\xb9R\xdeTS\xca\x97jG\ +\x05Q<\xaa\x13\xd5\x8d\xeaC\xc5QC\xa8D*\x85\ +\x92Q\x99\xd4$\xea\x03j&\x95E-\xa1\xbe\xa2\xd6\ +R\x9b\xa8\x1d\xd4~\xea(u\x8a\xfa\x9d\xbaL\xdd\xa6\ +\x1eR\xa5,6\xcb\x81\xe5\xc6j\xccj\xc9\x0a`\xf1\ +XQ\xac\xde\xac\x01\xac\xe1\xac\x14\xd6h\xd6\x04\xd6\x87\ +\xacY\xacE\xac\x95\xac\xefX[Y\xfbY\xbf\xb0\xce\ +\xb2.\xb1\xee\xb2\x9e\xb0\x09\xdb\x9e\xed\xc1n\xc6\xf6c\ +\xf3\xd8\xd1\xec\xbe\xec\xa1\xecd\xb6\x82=\x85=\x83\xbd\ +\x80\xbd\x92\xbd\x91\xbd\x93}\x98}\x86}\x89}\x8f]\ +bae\xe1j\xc1\xb1\xf0\xb3\x88\xb0\xe8i1\xd0B\ +d1\xdab\x8a\xc5\xa7\x16K,\xbe\xb5\xd8jq\xc0\ +\xe2\x8c\xc5e\x8b\x02\x0b\xb5\xa5\xa3e#\xcbv\x96\x02\ +\xcb\x18\xcb\xc1\x96)\x96c-\xa7[.\xb0\x5cc\xb9\ +\xc5\xf2\xa0\xe5Y\xcb\xeb\x96EVVV\x1eV\xad\xac\ +\xc2\xadzZ\x0d\xb1\x1ai5\xd1\xeaS\xab/\xac\xbe\ +\xb7\xdagu\xca\xea\xaa\xd5\x13kkko\xebv\xd6\ +\x1d\xad\xfbZ\x0b\xadU\xd6\xd3\xad\x17[\x7fg\xbd\xd7\ +\xfa\xb4\xf5u\xebb\x1b{\x9b\xa66A6\xddm\x86\ +\xda\xc8l\xde\xb7Y`\xb3\xcef\x8f\xcdi\x9b\x9b6\ +e\xb6\xf5m}m\x05\xb6}m\xc5\xb6\xe3mg\xdb\ +\xae\xb6\xddi{\xc2\xf6\xbam\x99\x9d\xb3]+\xbb\x8e\ +v\x03\xecF\xda\xbdg\xb7\xc8n\xa3\xddA\xbb?\xec\ +\x1e\xd9\xdb\xdb\xfb\xd8\xf3\xed\xfb\xdb\xa7\xd9O\xb3_d\ +\xff\x83\xfd\x11\xfb\xcb\xf6%\x0e.\x0em\x1d\xa2\x1d\x86\ +9d:\xccr\xf8\xc6a\x9f\xc3\xef\x0e\x8f\x1c\x1d\x1d\ +[:vv\x1c\xea\xa8r\x9c\xe5\xb8\xd61\xc7\xf1/\ +\xc7b'W'\x7f\xa7\x18'\xb1\xd3T\xa7\xa5N[\ +\x9dN;=\xa8g[\xcf\xb7^T\xbd\xff\xd4\x9bP\ +oA\xbd\xcd\xf5N\xd4\xbbW\xdf\xb6~\xcb\xfa\xd1\xf5\ +\x85\xf5\xa7\xd4_Z\x7fG\xfd\xf3\xf5\x9f8\xbb:s\ +\x9d\xfb:\xa7;\x7f\xea\xbc\xce\xf9\xa8\xf3-\x17k\x97\ +\x96.\xdd\x5c\xc4.\x1f\xba\xacr\xc9q\xb9\xea\xcav\ +m\xee\x1a\xed*r\xfd\xc0u\xb5\xebA\xd7\xebnV\ +n\xad\xdcb\xdcF\xba\xcdt\xdb\xe0v\xdc\xad\xc0\xdd\ +\xc5=\xc4=\xc1}\x9c\xfbR\xf7\xdd\xee\x97<\xd8\x1e\ +-=b<\xa4\x1e\xb3=~\xf48\xe7Q\xea\xd9\xd8\ +3\xcaS\xe2\xf9\x89\xe7F\xcf\xd3\x9eO\xbd\x1azu\ +\xf6\x92x\xcd\xf0\xfa\xde\xeb\xacW\xa97\xc7\xbb\x9b\xf7\ +(\xef\xb9\xde\xdb\xbc\xffl`\xd1\xa0m\x83\xfe\x0d\xc6\ +6X\xde\xe0`\x83{\x0d\xdd\x1aF4\x145\x9c\xd1\ +\xf0\xc7\x86\x17\x1a\xb1\x1a\xb5m\x14\xd7hb\xa3U\x8d\ +r\x1b=i\xdc\xa4q\x8f\xc6\x19\x8d\x177\xcei|\ +\xaf\x89G\x93\xceMF6\x99\xdfdO\x93\xdbM]\ +\x9bvj\x9a\xd6t~\xd3\xbdM\xefp\xdc9Q\x1c\ +)g\x11\xe7\x00\xa7\xa0Y\xa3f=\x9be6\xfb\xaa\ +\xd9\xf1fe>\xad|\x06\xfa\xbc\xef\xf3\xbd\xcf\x9f\xcd\ +\xed\x9a\xf3\x9a'7\x9f\xdf<\xbbyA\x8b\xa6-b\ +[Lj\xb1\xbe\xc5\x05_[_\x9eo\xaa\xefB\xdf\ +\xc3\xbeO[\xb6j9\xa8\xe5\xc7-\xb7\xb5\xbc\xd5\xca\ +\xabUL\xab\x09\xad\xd6\xb7\xfa\xa3\xb5c\xeb\xc8\xd6\xa3\ +[\xafl\xfdk\x1b\xab6\xbc6\xa3\xda|\xd1\xe6d\ +[V\xdb\xd0\xb6\xa9m\x97\xb6=\xd1\x8e\xd5.\xac]\ +Z\xbb/\xda\x9djo\xd9\x9e\xdf^\xd6~e\xfb\xf3\ +~\x0e~Q~c\xfc\xd6\xfb]\xf6\xf7\xf0\xef\xe3\xff\ +\xbe\xff6\xff\x07\x01-\x02\x86\x06\xcc\x0d8\x1c\xa0\x0e\ +\x0c\x0d\x94\x06\xae\x0e\xbc\xc8u\xe1\xf6\xe2\xbe\xcf\xdd\xc9\ +}\x18\xd46H\x14\xb44\xe8\xd7`\xc7\xe0\xee\xc1S\ +\x83\xb7\x07\x17\x86\xb4\x0b\x91\x84,\x0f\xf9-\xd454\ +6\xf4\xe3\xd0\xec\xd0\x8a\xb0\xf00E\xd8\xc6\xb0\xdb\xe1\ +-\xc2\x13\xc3\x97\x85\x9f\xe7\xb9\xf1\xfa\xf1>\xe5\x1d\xe1\ +[\xf2\xbb\xf0\xa7\xf2w\xf1K\x04a\x02\x95\xe0GA\ +~\x84_\xc4\xa8\x88u\x11\xb7:\xb4\xea \xe9\xb0\xba\ +\xc3\xd5\x8e>\x1d\x85\x1d\xbf\xeax\xa9\x13\xa7Sb\xa7\ +/;]\x8al\x16)\x8c\x5c\x19y\xa5s\xf3\xce\xe2\ +\xcek:\xdf\x8cj\x1352\xea\xbb\xa8\x07]\x02\xbb\ +(\xbal\xe9\xf24Z\x10=9z_Wv\xd7\x1e\ +]gt=\xde\xcd\xa5\xdb\xc0nK\xba\xfd\xd5\xdd\xa7\ +{J\xf7\xf5\xdd\x0bz\x84\xf6\x98\xd8c_O\xcb\x9e\ +\xbd{\xce\xedy>\xa6q\x8c(fmLA\xaf\xf0\ +^\x93{\x1d\xe8\xed\xd0;\xbe\xf7\x92\xdeW\xfa\xb4\xed\ +\xa3\xe8\xb33\x96\x15\xdb+v^\xec\x1f\xef\xf8\xbe#\ +{g[_\xd27\xa6\xef\xbc\xbe\x7f\xf6k\xd5ot\ +\xbf\x9f\xfb[\xf5\xef\xd7\x7fi\xff\x1bq\xdc\xb8Iq\ +\x87\xe3]\xe3G\xc4\xaf\x8b/\x1a\xd0e\xc0\xec\x01\x17\ +\x07\xb6\x1e\x9890;\xa1^\xc2\xb0\x84\xb5\x09O\x07\ +u\x1d\x945\xe8\xd2\xe0\x80\xc1\x93\x07\xff2\xa4\xc1\x90\ +\xb4!\xdb\x87Z\x0fM\x18\xbaf\xe8\x93w\xbb\xbd\xfb\ +\xf9\xbb\xd7\x87\x85\x0e\x9b>\xec\xdc\xf0V\xc3\xc7\x0d?\ +\xfa\x9f\x06\xff\x91\xfeg\xf7\x88z#\x84#6'Z\ +&\x0eJ\x5c\x97X.\xec+\x5c)|\x92\x14\x93\xb4\ +,\xa9@\x14-Z(\xba+\xee,\x9e/\xbe-\xe9\ +(\xc9\x92\xdcL\xee\x98\x9c\x95|+\xa5c\xca\xbc\x94\ +\xdb\xa9\x91\xa9\x0bR\xef\xa5E\xa7-I+\x1c\xd9s\ +\xe4\x8a\x91OG\xf5\x1d\xf5\xcd(\x8dt\x90\xf4\xfbt\ +\x9b\xf4\xc4\xf4\x1d2\x17\xd9(\xd9\x01y\x13\xf98\xf9\ +\xa9\x8cv\x19\xd33.\x8d\x16\x8c\xfe|t\x81\xa2\xb7\ +b\x8d\x92R\x0eWnW\xb9\x813\x95\x9b\xd9:\xf3\ +\xa3\xcc\xcbc:\x8dY:\xa6xl\xc2\xd8\xcd\xe3\x9c\ +\xc7\xc9\xc6\xe5\x8eo;\xfe\x93\xf17't\x9f\xf0\xf5\ +D\x8b\x89\xa2\x89\xd9\x93\x9aMzo\xd2\xe5\xc9Q\x93\ +\xbf\x9aBMI\x9a\x92=\xb5\xf9\xd4\x0f\xa7^\x9f\xd6\ +c\xda\xb7\xef\xd9\xbd7\xea\xbd\xbc\xf7\x03\xdf\xcfz\xff\ +\xf1\x07\x83>\xd8\xf9a\xe3\x0f\xa7}x\xf5\xa3\x1e\x1f\ +\xad\x9f\xee4]1\xfd\xfc\xc7\x11\x1f\xaf\xf8\xaf\xc5\x7f\ +\xd3\xfe{\xfc\x93\xe0O\x16\x7f\xa2\x9e!\x9eqlf\ +\xe0\xcc\x053\xcb?\x15}z\xec3\xeeg\x8b>\xd3\ +\xccJ\x9eu|v\xd8\xec\xe5s\xac\xe6\xc8\xe6\x9c\x9b\ +\x1b9\xf7\xdb,\xe7\xac\x09YW\xe7\xc5\xce\xdb:\x9f\ +3\x7f\xc6\xfc\xc7\x9f\x8f\xf8\xfc\xe8\x82\x90\x05+\x16\xda\ +-\xcc\x5cxiQ\x9fE\xdb\x17\xb7XY\xf6\xf4\ +\x0b\xf1\x17\xa7\x97w^\xbeqE\xe3\x153W\x94~\ +\x99\xf6\xe5o_\xf5\xf8j\xeb\xca\x96+\x17\xac\xb2Z\ +5f\xd5\x8d\xd5\x09\xab\x0f\x7f\xcd\xfbz\xed\x9a\x06k\ +f\xae\xa9\xf8F\xf6\xcd\xa5o\xe3\xbe=\xb06|\xed\ +\xdau\x8d\xd6\xcd^\xcfZ\x9f\xb9\xfe\xf6w\xc3\xbe;\ +\xb9\xa1\xeb\x86\xed\x1b\xfd6~\xf5\xbd\xc7\xf73\x7f \ +?d\xfepgS\xe2\xa6s?\xf6\xfe1{3o\ +\xf3\xc6\x9f|\x7fZ\xb6\xc5u\xcb\x8c\xad\xd4\xd6\xf1[\ +\x0b\xb6\xa5n\xbb\xb4}\xc8\xf6S;z\xed\xc8\xde\x19\ +\xb1s\xcb\xcf\xfe?\x7f\xb3\xab\xd9\xae\xa5\xbb\xddw\xcf\ +\xdec\xb7\xe7\xc3=\x9a\xbd\x13\xf6>\xd9\x97\xb1\xef\xde\ +\xfe\x94\xfdW\xb3Gd_\xcc\x19\x9c\xf3\xeb\x81\xfe\x07\ +\x8e\x1f\xec}\xf0\xc8\xa1\xee\x87r\x0eG\x1d\xde{\xa4\ +\xe3\x91]G\x05Gw\x1c\xe3\x1d\xdb\xf6K\xd8/[\ +sCs\xb7\xe4\x85\xe6m9\x1ev|\xeb\x89\xf0\x13\ +\xdbO\xf2O\xee<\xd5\xe1\xd4\x9e\xd3\x91\xa7\xf7\x9f\xe9\ +z\xe6\xd0\xaf1\xbf\xfer\xf6\x9d\xb3\xa7\xce\x0d<\xf7\ +\xdb\xf9a\xe7/\xfd&\xfe\xed\xd6\xef\xd2\xdf\x0b/\x8c\ +\xb9Pvq\xda\x1f\x96\x7f\xcc\xf8\xb3\xfe\x9f\x0b\xfej\ +\xf4\xd7\xca\xbf\xdb\xfc\xfd\xfd\xa5\xb0K\xbb/w\xbd\x9c\ +{%\xfe\xca\xc5\xab\xa2\xabw\xaf)\xaf\x95_\xff\xf0\ +\x86\xe3\x8d\x057\x9b\xde\x5c{+\xe8\xd6\xae\xdb\xddo\ +\x9f\xbc\xf3\xee\x9d\xebw3\xee\x96\xdd\x9b~\xdf\xf9\xfe\ +\xb2\x07\xad\x1f\xfc\x94\xdf9?\xb7`p\xc1\xf5BE\ +\xa1\xe6\xe1\xa7\x8f\xbc\x1f}\xf38\xe4q\xf6\x93~O\ +\xfe*J/*{:\xa3\xd8\xbb\xf8\xdb\x12^\xc9\xe1\ +\xd2A\xa57\xcb\xc6\x96[\x97/\xaahS\xb1S\xdd\ +[\xfd\x87&\xbd\xf2\xfe\x849\x98\x839\x98\xc3?*\ +XXXX:9997h\xd0\xa0Y\x8b\x16-\ +\xfcZ\xb5j\xc5m\xd9\xb2e\x80\x1e\x04\x1a\x82\x01\x0e\ +\x9d\xd6\xe5\xe9\x97c<@\x0f\xf7\x85\xb2*\xea\x06\x18\ +\xe00\x10\xd0\xbau\xeb C>\x06\xf2\x050\xfc\xf4\ +\xf1\xaaJ\xd7\xc4\xcb\x10\xdf\xa0\xbdt=\xd4S\xd3\xa6\ +M[\xb9\xba\xbaz\xc1:\xc4F\xefN\x83\xd1\x01\xeb\ +\xd4\xaf_\xdf\xad{\xf7\xee\x83?\xf9\xe4\x93\xf5\xdf\x7f\ +\xff\xfd\xc5\xdd\xbbw\xdf\xdb\xb7o_\x01\xc2\xfe\xfd\xfb\ +\x0b\xf5\xc10/;;\xfbaU8\x0c^U4\xaa\ +\x02}<\xc3:\x0c=}\x9aU\xe1W\xc7\xab\xba\xba\ +\x8c\xecU\xd5\xc72\xc3|C:{\xf6\xecy\xb0u\ +\xeb\xd6kK\x97.\xcd\x16\x89D\x93|}}\xfd-\ +--\xadj\xd7\xfa\xb3\xe0\xe2\xe2\xe21j\xd4\xa8\xe9\ +@\xeb\xfe\xb1c\xc7*rss5f\xa8;\x1c>\ +|\xb8d\xf1\xe2\xc5{CBB\xa2\x8c\xed\x03\xbcf\ +\x12\x12\x12\xa4999\x8f\xdf\xb6\xfc\xff\x06\xf8\xe5\x97\ +_\xd4\x0b\x17.\xdc\xed\xe3\xe3\xd3\xd6\x18[\xd4\xb8q\ +\xe3\x16k\xd6\xac9\xf9\xb6\xe5\xfe7\xc1\xa1C\x87\x8a\ +\x13\x13\x13\xc7\xc1\xd8\xb6\xaeI\xf7,\x08\x91\x91\x91}\ +\x0f\x1e\xae\x0dj\xd2\xbf\xb5\xb5\ +\xb5\xadJ\xa5\x9ak\x0a\xfd\xff\x93\xfb\x10ec\xe0M\ +\xc9\x8d\xfao\xde\xbcy\xfb\xda\xc6\xbf1\xfa\xc7r\xf0\ +\x91N\xe0\x1ac\xd9\xb2e9x\xfe\xe2\x8b/\x0e`\ +\x9c93q\x04\x98{\xf63y\xfau\xf4\xe3\xfa\xf8\ +L\x19\x93\xaf\x0f\xfayU\xc5\x99z\xfa<\xf5i\x1b\ +\xd23\x04C\xf9\xf5e3\x94\x03a\xc5\x8a\x15\x87q\ +\xedU\x9b\xfeqmf\xcc\xf8W*\x95sj\xd3\xff\ +\x91#GJ;t\xe8\xd0\x1b\xd7\xd8\xb0V\xf3\xc4\xb3\ +!0\xf9\xb8\x96sss\xf3f\xd2\x18G`\xe2\xfa\ +\xb8\xfae\x98\x87\xc0\xd4\xd5\x8fW\xc5O\xaf\x8e\x87>\ +_\xc3:\x0c}&\xce\xd0\xd5/c\xea\x19\xcaj\x18\ +\xc7\xba8\xa6\xb1\x0f\x8c\xd1\x7fm\xe3\x9f\xd1\x7fm\xb4\ +p]\xe7\xe7\xe7\xc7\xab\x89\xd6\xffJpvvvG\ +\xdf\xd2\x18\xfb\x83{\x115\xd12\xd6\xfe\xa3\xfe\xdb\xb7\ +o\x1f\xfe\xa6\xda\xf8O\x0e\xe8\xd3\xa3\x1d\xaaMg\xa6\ +\xb4?\xb8\x9e3\x8f\x7fm0V\xff8\xfeq\x7f\xb4\ +&Z8\xff\x1ak\x7f\xfc\xfd\xfd\xf9L\xbd~\xfd\xfa\ +\x89'L\x98\xb0\xa8\xae\xfb|\xff\x86\x80\xfa\xc7\xb9\xde\ +\x18\xfb_\x9b\xfe\x8d\x1d\xff\xfa\xf6\x07\xfb\x01\xd3\x98\xbf\ +|\xf9\xf2\x838/\xbd\x99\x96\xff3\x82\x93\x93\x93\x8b\ +\xb1\xf6\xdfT\xfe?3\xff6l\xd8\xd0\x07\xe9\xea\x97\ +m\xdb\xb6\xed\xba\xfe\xb5\xf1o\x0f\x8c\xfd\xa9M\xff\xe8\ +\xa3\x9a\xd2\xff\xe4r\xb9\x1d\x7f\xfe\xf9\xe7;\xd5\xcd\x0f\ +qqq\xc9oJ\x07o3\xe8\xfc\x9fZ\xed\x8f\xb1\ +\xe3?333\xcb\x18\xfb\xbfz\xf5\xea\xbc\xda\xf0`\ +NX\x5c\xdb\x9e\xab1\x01\xef\xf1)\x14\x8aY\xe8g\ +\xef\xde\xbd\xfb.\xf6\xaf\xfe\x1e!\xc61\x0f\xef\xd1!\ +\x0e\xee\xa1`\x9dW\xe5kL@\xfd\x1b3\xfe\x8dY\ +\xff\x1ak\x7f\xa0\xbd\xe5\xb5\xf1c\x00\xe7\x04ww\xf7\ +\x06umW\x9b6m\x82\xb3\xb2\xb2\xb6\xe6\xe4\xe4<\ +2\x96\x97!\xe0=\xa4y\xf3\xe6m\x07[\xf9\xda|\ +ec\xedO]\xe6\xdf\xdah\xd5u\x7fZ7'\x08\ +\x8ci\x0f\xfaR\xb8W\xfb\xb2:\xaf\x0e\xb6n\xddz\ +5>>>\xa5v\x09\xea\x16\xea2\xfe\x8d\x9d\x7fk\ +\xa3\x85\xd7\xba\x5c.\x9f\x89\xf3\x80\xb1\xed\xafmNh\ +\xd7\xae](\xea\xc8\xd4z\xaf\xa2\x1f\xae\x99r\xed\xc2\ +\xf8\x9f\xa6\xf4\xff\x8d\xf5\x7fp\x0e\xde\xb9s\xe7\xad\xba\ +\xb4\xdfpN\xb0\xb3\xb3s@\x1b\xf1\xba\xf5n\x08\x9f\ +\x7f\xfe\xf9N\x07\x07\x07\xa7\x9a\xf4aL0v\xfc\x1b\ +\xbb\xfe\xad\xeb\xfe\x83\x87\x87G\xa3\xaf\xbe\xfa\xeah]\ +\xda\xce\xcc\x09B\xa1p<\xb3vx\x1b\x80\xd7\xafX\ +,\x9e\xf4*\xfa\xc7\xf1\x8f\xfb\xa1\xc6\xe8\xdf\x18\xfbo\ +\x8c\xfeQn\xfd\xfd\x1f\xbcn\xa6L\x99\xb2\xbc\x8em\ +\x7fkz7\x04\xf4\x99, \xbc\x8c\xfe\x8d\xf5?\x8d\ +\xf5\xff\xd1\xff|\xd9\xfd\x9f\x84\x84\x84Qu\x99\x13\xfe\ +I\xb0k\xd7\xae\xbb\xde\xde\xdeM_F\xff\xc6\xda\x1f\ +c\xf6?_u\xff\xf9e\xe6\x84\x7f\x0a\xe0\xd8\xe9\xdc\ +\xb9s\xdf\xb7\xad\x7fc\xec\x7fM{\x0c/3'\xfc\ +S\x00\xdb\x9e\x98\x988\xb6.\xfaG\xfbo\x8c\xffS\ +\x9b\xfda\xee?\x1a3\xfek\xdb\xff\xd7\xcd\x09_ \ +~^^\xde[\xd7k]\xc1\xd8>\xa8\xcb\xfe\xbf\xa9\ +\xe6\xdf\xba\xdc\xff\x9a5k\xd6&S\xe9\x04\xd7\xdd\xf8\ +l\x1e\xfa,\x9d:u\x8a\x05\x1f\x0a\xef\x07z\xf2\xf9\ +\xfc\xeeuY\x93\x1b\x0b\xe8\x9f\x19\xa3\x7fc\xf7\x9fM\ +y\xff\xcb\x18\xfd'%%M0\x85\x1e\x8e\x1e=Z\ +\x96\x91\x911\xb3&\x1f\xe5u\xcd\xfb\xd8\x86\x7f\xa2\xfe\ +k\xdbc\xee\xd3\xa7\xcf\x08S\xb4\xff\x9bo\xbe9U\ +\xaf^=\x97\x9a{\xfa\xf5\xe9\x1f\xa1w\xef\xde\xc3k\ +\xd2\xbf\xb1\xfb\xcf\xc6\xe8\xdf\x18\xff\xb36\xfd\xe3\xb5a\ +\xaag\x18\xb7o\xdf~\xc3\x98\xbd\xa3\xd7\xa9\x7flK\ +u{x\xc6\xfa\xff\xc6\xd8\x7f\x9c3\xc7\x8c\x193\xef\ +U\xec\x0f\xf8>\x0da}\xf0\xd4\x94\xedG~qq\ +q5\xee\x9d\xbd\xeeu\x07\xb6\x09\xe7\x9b\xea\xf4o\x8c\ +\xff\xf3\xba\xed?>?\x0d\xbe\xff\xedWmku\xfe\ +\xd2\xc4\x89\x13\x97Tw?\xe1M\xac\xfbv\xec\xd8q\ +\x13\xdb\xa8\xcf\xd7X\xfbo\xac\xff\x89\xf7.\x8c\x19\x8f\ +U\xd9\x9f\x85\x0b\x17\xeez\xdd:X\xbe|\xf9!\xbc\ +\xc6\xde\x86\xfe\x11\xf0\x9e\x84>_\x1c\xff\xf8\x8eKm\ +c\x16\xdfK2\x95\xfd\xc7\xfd\x07C\xfd\x0f\x1c8p\ +\xe4\x9bh?\x02\xce\x09\x01\x01\x01\x11oC\xff\x08\xef\ +\xbc\xf3N\x92\xfe\xf87v\xff\xdfX\xfbS\x1b-C\ +\xfb\x83\xe3\x11}\xc47\xd5~F\x86\xf8\xf8\xf8\xca/\ +\xfe\xbcI\xfd#/\xe6]\x8a\xba\xf8\x9f\xa6\xba\xffn\ +\xa8\xffU\xabV\xe5\x9a\xa2]\xeb\xd6\xad;\x8b6\xb6\ +.u&M\x9a\xb4\x14\xe7\x847\xbd\xef\x07c~\x7f\ +]\xf4o\xec\xfd\xdf\xba>\xff\x83{\x86\xa6zf{\ +\xe8\xd0\xa1\x19x-}\xf9\xe5\x97G\xeaR\x0f\xf7\x8f\ +\xdf\xb4\xfe\xb1\xcd\xb8\xf66v\xff\xcdX\xff\xbf\xae\xf6\ +\x07\xe6\xa3-\xa6j\x93\x8d\x8d\x8d\x1d\xd2\xc4\xf1ZSW\xfdcx\x999\xe1\ +e\x01t4\x87\xe1\xab\xb3?o\xe5\xfd#\xc3\xfa?\ +\xfc\xf0\xc3\xc5Wm\x1b\xfat\xf8\xee\xf4\xcb\xf4\x01\xce\ +\x09x\x7f\xe0u\xea~\xc3\x86\x0d\xe7\xf5y\xe2\xfa\xd7\ +\x18\xfd\xbf\xae\xf5\xaf\x81,.\xa6\xf8v\xd0\xe6\xcd\x9b\ +\xff~\x19\xfdc\xc09\x01\xef\x93\xbd\x0e\xddC\xdb\x9e\ +\x18>3m\xec\xfck\xca\xfd7\x9c\xc3\xaa\xbb\xff\x8b\ +\xf7\xa9M\xf1,\xce\xf4\xe9\xd3\xbf}\xd9>\xc0\x80\xf7\ +\x8bM9'`\x9b\x18\x9b\xaf\x1f\xde\xf6\xfa\xab\xaa\xd0\ +\xbd{\xf7A\xa6\x98\x8f\xf1\xd9\xadW\xe9\x03|n\xc2\ +\x14\xcf\x02`[\xbav\xed:\xb0*\x1eu\xd9\x7f3\ +\xa5\xfek{\xfe\xc7T~\xf6\xbau\xeb\xceT\xf5\xdc\ +Am\x01\xe7\x02\xbc\x9fc\x0a\x19jzG\xc0\xd8\xf5\ +W]\xf6\x9fk\x93\xc7\xd8\xe7\xdf\xc6\x8f\x1f\xbf\xd0D\ +\xd7~\x05\xfa\xf9\xcc\xfd\x81\x9a\x02\xfa\xaf\xb8\xd65\xd5\ +\xf3G\xd8\x86\x9a\xf8\xbd\x8d\xf7_p\xff\xad]\xbbv\ +a\xb5\xe9\x02\x03\xee\xc7\x9bB\x0f\x08(\x17\xae{\xf0\ +\x19\x0d|O\x0f\xdf\x19C\xc08\xe6\xa1\xffe\xca\xfb\ +0@\xab\x02\x9f+\xa8\xa9}\xc6\xbe\xffej\xfbS\ +\x97w\xd8F\x8f\x1e\xfd\xa9\xa9t\xf26\x00\x9f\xe3\xae\ +\xee~B]\xde?5\xe5\xf3'\xc6\x8e\x7f&H\xa5\ +\xd2\x8f\xdf\xb6\x1e_\x05\xf0}\x86\xaa\xee'\x98\xfa\xfb\ +\x1b/\xb3\xff`l\xe8\xd5\xab\xd7\xb07\xfd\x9c\x8a)\ +\x01\xef7\x06\x06\x06v\xd0o\x93\xb1\xcf\x1f\x9ar\xfd\ +\xf5*\xdf\xffi\xd2\xa4IK\xf0\x85Mr\xff\xefm\ +\x00\xae}\xf4\xe7\x84\xba<\xff`\xaa\xf7\xafkZ\x7f\ +\x19\x13\xf0;A\xb8\xd7\xf9\xb6u\xc9\xc0\x86\x0d\x1b~\ +\xdb\xbe}\xfb\xf5\xba\xd4a\xe6\x04S\xde\x7f\xaf\xcb\xf7\ +\x97L\xf1\x0e9\xae\x11\xde\xe6\xfb\x92\xc8;99y\ +\x1a\xca\x82\xef#\xe3{\xc9u\xa9\x8fs\x02\xea\xd4\xd4\ +\xf7\xdf\xdf\x94\xfe1\xfc\x93\xde\x7f\xc7\xf1\x8c\xef\xe7\xd7\ +\x85\x0e>\x7f\x83\xef\x88\x98j\xfc\xbf\xad\xef\xef\xe1\xde\ +\xca\xe6\xcd\x9b/\xbdn\xbd\xe3\xb7=p\xcdP\x93,\ +\xf8\x9d\x0a\x9c\xe3\x8c\xa5Y\xdd\xb7\x5c\xf5\xc1\x94\xfb?\ +U=\xffl\xaa\x80>\x12\xac\xa3\xfe0\xb5\xde7m\ +\xda\xf4gM\xef\x11\x19\x06\xdc;\xc2\xef\xb6\x98\x8a\xbf\ +\xb1\xfa7\xd6\xfe\xd7\xd5\xff\xafk\xe0p8\xad\xf1\x7f\ +\x9f\xbc\x8a\xaf\x84\xcfY\xcd\x981c\x03\xfe\xef\x83\x97\ +\x91\xe1e\xe6\x84\xea\x00\xfd\x1fS~\x7f\xf5M~\xff\ +\xb3a\xc3\x86\xcdp\xaeF\x9b\x8d\xdf\xa8\xc1o2\xa1\ +\x0c\xb8\xc7\x83\x80\xf1\xec\xec\xecGX\x8680\xa7N\ +\xc5:\xa6\xe0\x8d\xbe\x1a~\xdb\xd1\x14\xe3\xdf\x94\xdf?\ +\xfc_\xfb\xfeg\xff\xfe\xfd%\xd5\xcd\x09\xf8\xecXm\ +\xfa\x7f\x9b\xfb?\xff\x96\x80s\x9e\xe1\x9c\x80\xef\xbb\x19\ +\xf3\xad\x857\xf1\xfe\xdd\xffB\xc0\xef\x9b2s\x02\xea\ +A \x10\xc4\x98\xf2\xfd\x17S}\xff\xe1\xdf\x1c\x989\ +\x01\xf7\xbdM\xfd\xfc\x95)\xbe\x7f\xf2\xbf\x14\xea\xb2\xff\ +f\xaa\xef\x9f\xbc\xea\xfe\xcf\xbf)\xd4\xe5\xfd\xf7\xd7\xf5\ +\xfc\xe1\xffrx[\xef?\x9a\xf5\xaf\x0duy\xff\xcb\ +T\xfe'\xda\x1f\x9c{\xf0\x99?\x5c\xa7\xeb\x01\x9f\x01\ +\xb4OxF\x1c\x1d\x1e\x9f\xc1\xc32\xfd<\xecK\xbd\ +\xfa\x02\xbd2\xbe\x1e\x0f\x86\xa6>?\x9a\x16\x02\xd2\xd0\ +\xaf\xa7\x0f\xfa4\x18y\xf4h\xf1u\xfc\xf9\xfeU\xb7\ +E\xc0\xb4\xa5*\xf9#\x22\x22z\xe1\xff\xc2y\x93\xfe\ +\x0f\xd3\x07x\x1d\xe8\x03\xaeO\x0c\xe3x\xd6\x8f\x1b\xd6\ +\xd1\xa7SU\x9d\xaah\xd7\xc4\xab&\x9eU\xd15\x86\ +6\xcah\xd8^}Z\xc6\xdc\xf37\xe5\xfd/3\xd4\ +\x1dL\xb9\xffl\x86\xba\x03\xee\x05\x1ac\x7fF\x8f\x1e\ +\xfd\xd9\xdb\x96\xf5\xdf\x08\xb8Oa\xc4\xff\x1f\xb4NJ\ +J\x9ah\x1e\xff\xa6\x07|\x16\xb2\xb6\xef\xbb\xb2\xd9l\ +\x0b|\xce\xd4\xfc\xffgM\x0b\xb8G\xfe\xfe\xfb\xef\xaf\ +rpp\xa8W\x93\xfe\xf1\xff3\xe3\xff\x8e\xff\xff\xfa\ +\xed\xd4\x7f*\xe0\xfb\xfbQQQ\xfdY,\x16\xbb&\ +\xfd3s@\xaf^\xbd\x86\x9b\xe2;bf\xd0\xfa=\ +\xf8\x8c\x05>\xa7R\x9b\xee\x99\x80\xffS)666\ +\x11\xbf\xeb\x83\xcf\xcf\xeb\xff\xbfP\xc3\xff\x1djL>\ +\x93\xae.\xbf&\x9c\xea\xca\xf4\xf3\x0c\xf3\x0d\xa1\xaa\xb2\ +\x9ahT\xc5\xdfXY\x11\xd0\xde\x1c8p\xe0\xc9\xd7\ +_\x7f}\xeb\xac_\xce\xc4\ +qO\x83I\xe3\xd90\x8d\x80u\xf5\xe2\xf3\xf5\xeb\xeb\ +\x83a=\xa4e(\x0f\x93\xc7\xc8d\x98\xa7_G_\ +\x16}Y\xf5A\x9f\x86a9\x961\xf9X_&\x93\ +\xcd\xc0\xef\xe6\xe2<\x8a\xfe\x0e>_\x83\xfa\xac\x8b\xfe\ +\xf5\xfb\x01\xff'9\xf6\x05\xd2\xb1\xb5\xb5\xb5\xc7xU\ +\x80v\xab\xba2c\x00\xeb\xbf*\x8d\x97\x95\xc5T|\ +\x19\xc0u\x14\xfa2/\xabws0\x07s0\x877\ +\x14\xd8_R\x04\xfdR\x0a~\xe4K\x16\xb1\xa0\xe3\x84\ +$~\xc9~\x16\xd7\xa2F\x89\xe5I\x12N\xbfT\xb9\ +J\xaeL\x95gp\xba\xcaE\x99\xe9\x12\x99\x8a\xd3U\ +\xa8\x12r\xbaH\xe5\xa2Q\x84\xd7%&6v\x80B\ +\x86\xf8\x18\xef#\x1c\xaf \xa4A\x02M\x87\xad\x03|\ +\x0em\x18\xb1\xd0h\x08q\xa0\xdfi\xb0\x88\xc2r8\ +\xb2\xf0\x88\xf5drE\xba\x86\xd8\xa0\x00\xcc\x13\xf7\xad\ +\x09\xc1\x1a\xb5\x83u|\xaa0C\xc2\xe1\x22\x1di\xa6\ +\x0c\xbf>\x83_\x8b\xb4&\xf1$\x95\x08I\x06\x91\x10\ +\x0e\xe1j\xe5\x93\xca\x94\x0a\x14@\x09U\xe8\xf4\xf84\ +1\xa6\x01\xbc1-\x92&I1M\xe9\xda\x93&K\ +\x1e\xa7+\xa7\xd3\xa3d\xa3\xe4\xfai\xa92#\xf9\xb9\ +\xb4H\x8a\xf4m\x18uc\x9e25\x1dy\xf4\xc4\xc6\ +\xd1<2\x95*]q\x08@}\x9d\xd6\xa1V\xbaD\ +%\x14\x83ru9\xb6R\xe1x\x89b@Z\xbaD\ +,\xcfL\x8a:\xc7+\xc9\x90\xf4\xb8B\xd3L\x1e\xa7\ +\xc8\xd0\xd5}>P\xd0\xea\xbe\xa4\x1eq v\xc4V\ +\xf7s'1\xa47q\x01\xad\xb8\x11O\xe2M\x1a\x00\ +\xb4&\xcdA+\xcd\xe1\xe7\x03\xe7\xc6\xa4\x11i\x02\xd0\ +\x92\xf8\x92\x16pl\x05\xd0\x02\xca\x9a\xd1\x18\x1c\xc0n\ +\x039\xdac\x0b\xc0\xc1Z\xbe4vK\xfa\xd7\x16\xea\ +6\xd2QiF\xff\x1aC\xac9p\xf3\x02p\x07\xbe\ +.\xc4\x15~\xb1\xa4\x0f-\x91\x0d\x80\x1d\xfc\x1c =\ +\x88p*\x88\x85\xa5s3?\xae:\xa0<\xd0\x8b\x1b\ +\x10\x10\xc8\xe5\x06\x06r\x03\x03\xb8\x01\xf4\x09\x93pP\ +\x07\xda\x05\x04a\x09\xe4\x06\x04\xa8\xb9$P\xcd\xb5\x0c\ +\xd4\x15\xa9\xb9\x9a@\x1b\xc0\x0f\xf0k\xe5eC\xa9\x89\ +\x86XSn\x83\xd7_\xbcWPPQH\x0a\xd4\x85\ +\xe4aE\xa1\xa6\x80*,(.d\x17\x14\x16B\x8e\ +\xba\xc0\xba\xb0\x00\xa3\x85\x05\xe5P\xd4\x10\x13\x0f1U\ +X\xf8\x10\x8f\x90,xp-{\x92\xbf\x15\x8c2\xc2\ +\xf6\x98~\xbfb\xb3\xc6\xa2do\x94\x15\x8cj\x1b\xe9\ +\xe3\x1f4l\xf5\xee\xb6\x14\x8b\xb48\xb9Q\xc3*\x1e\ +g\xcdb\xf5-\xda\xa0\xa1\xf6\xb9\xb1,\x15\x15\x10\xb9\ +\xdc\x9ce3]\x0d\x91\xfb\xedX6\xb31\x92\xef\xc7\ +\xb2\x9d\xab.\xd4\x10\xf5E\x8dZ]\x01\xe7{\x90\xd9\ +\x9ee3W]\xaa\xf1T\x9f\xc8\xce\xc9>\x90s \ +'\xe7\xc0\x81\xfd99\x90\x80?\x88\xab\xb3+r\xec\ +\xb21\x83\xce\xdb\xaf\xce\xd1\x1c(\xc9\xb1B<(\x86\ +T6u\xb8\xb0DC\x15\x00\xf59@\x88]\xda\xdb\ +\xcb\xb3\xdc\xcb\xc3\xd3\xcb\xc3\xdb\xd3\xcb\xdb\xdb\xcb\xdb\x8b\ +>yzz\xe3_\x99\x97\xb3\xa7\x07\x14A\x19\x94x\ +y{\x22B\x85\xb7\x0d\x8d\xe9\xed\xd9\xfe0\x92jO\ +\xd9\xce\x81s\x09o\x1f\xa1\xdc\xf7A,\xdf\x1fE/\ +\x85\xac\xf0}\x84\xe5\x96\x8dQ\x86!U\xcc\xab\xcc\xcb\ +\x0f\xa0l\xa0\xa6U\x09\x9f\x10\xf1\x22\xab\x83\x84r\xdb\ +\x8f\x04\x03\xb4\xa8\xd6%\xe1\x84_\xa29\xe8}\x88P\ +.4]?-]v\x09\xcf'_\xad\xa1\xae\xf3\x0f\ +C\x95l()\xd4Qg\x95v\xbcS\x0e<\x92\x8f\ +\x80(\xfb\xe9*\x94m\x16\x0a\x97\x07\x87\xc5\xd6\x85\xc4\ +\x91;\xeb\xf0\xdd\xe2\x0a\x8d\xa6\xa2\xf8\xde\xe1\xd9\xdc[\ +\x80\x87\x04@\xb14iR\xfeTC\x1dl\xf0\x84\xb0\ +\x82\xb7>z\xa4a=\xde\x1e~W\xc7\xa3 \x80n\ +'\xa9(\x02\xce\x82bB\x89/\xdf\xd7PWS\xee\ +3$\x80\xd5\xdc\x12\xe8\xdd\x99\xa5OQ\x842B\x85\ +^\xbd\xad\xa1\xae\xf1\xf2\xa1\xc1\xfb\xb5\x0df\xd9\xcc\xd1\ +6\xa0\xe3\xad\x22\x8d\xe5bk0s\xdb\xafk\xa8\x9d\ +N\x85:*\x05\xba6Z@\xe3\x1b\x1d-\xd2\xb0\x0f\ +6\x18_rUC\x95Nz\x08r\xe4\xe8\xd4\x83\x18\ +\x96\xa5\xe1`\x07\x96\x17iH\xc9\xdf\x1a\xea\xb0\xc5c\ +]\x93Q\x17YZMW\x10jT\xe9\xaf\x1a\xean\ +\xd3'\x0cy\x7f\xa6\xb3\xca\x09\xd5\xf1\x16\x94\x95\xf6-\ +\xaa,\xd3uQ\x09\x1fdot\x14\x0a\xd5c\x9f\x12\ +\x96{\x0e-\xbb\x1fe3\x17k\x86\x97\x12\xca\xe6\x8b\ +3\x1a2\xb6\xb8\xb2s\x03\x98\x0e\xe7\x15\x13\xb2)_\ +c]~rR\xac\xb7g\xf7\xf2\xfb\x1a2\xbe\x84\xe9\ +\xd7\xcaa\xc1+!dB\x81\x86U6\xd3\xa2\x8c\x90\ +\xd2{\x1a2\xa1\xf4\x05$~)!#\x0a4\xd4)\ +\x17\xc0.\xbd\xab!\xc3\xcb\x98\xde\xf6\xd7\xb5\x90\x16\x94\ +W\x01H7\x04Z$\xaa\x22\xbc\x5c\xa7\x07\x10\xcaf\ +\x9e\x96\x1dd5|\xfa\x00b)@\xb3\xf4\x8e\x86z\ +\xea]\x01\xed\xd2\xf6\xc93\xa9@]\xac\xdb@c\x89\ +u9\xa0A\xd7\xddd\xa9uba\xebgc\xeb\xf9\ +\x15\x84\xec\x82\xa2C\x0d!RzKC\xb6\xaa\x81\xd2\ +^$\xf0\x80\x11\xab\x98\xaf&d\xe4M\x90*\x02\x22\ +\xa575\x16I0\xcf\xd0c\xc4\x9f\x1e#\x96%<\ +B\x1a\x96\xdd\x80^N\xd5\x22\x94\x82\xc1\xdd\xafw]\ +Z F.4\xec\xec\xcd\x22\x0dk\xa9u\xe9\x0d\x0d\ +{\xbf\x16\x05\x87\xea\x1c\xdd\x08i\xaa\x06-f4<\ +\x02C\xf20\xa2\xa8=\xdd\xb5\x0a\xa2\xd9\xc00#[\ +\xf25l;b\xbd\x0c\x86\x89\xfa\xba\x86\xf5\x03=\x84\ +\x18\x05\xb2\xe1\xca\xbbS\xa0!\xa5\xd0\xf24\x1c\xb5e\ +\xf3Jz\x92\x12\xa0y\xcb5[\xaf3\xd8\xc0\x0ar\ +I!(2\x02\x04\xa2\x96ZC\xbf=(\x80\x02w\ +\xed\x00\xd0!\xb2\x80c\xbe\x86\xdc\x82n\xd1\x0a\xd5\x10\ +4y#_\xa3S\x22C\xae\x98G\xca\x80\xdcC\xe8\ +t\xeb\xa5E\xa8'Pf\x01\x0e\x08\xddE\xfb\x8c\xed\ +}\x14\x0f.\xb6\xd4\x12\x10\xaf4\x0d\xf4\x09\x82\xb0\xef\ +i\xc7]a\xa5|\x05\xe9\x0e\x03\xdb#\x93\xf35,n\xa5hY\ +:\xa5\x92+\xc0\xf3X\x91V6R\x0a\xec.\x90\xca\ +\x8b\x87\xe9\xbdH0\xcdT\xb9\xc3\x13\x94\x0c\xfaO\x1d\ +L\xb4\xa2kQ\xe0*\x01I\x17\x03\x9d5\x8fQ\xa4\ +[\x1a\x8b90\x04\xf4\x8d\x18=\xde\xc8E\xa0R\xe6\ +\x018\x0d\x0f\xdd\xd1\x90\xf30\xdc\x5c\xf7=w\x15\x84\ +C\xd7\xb8\x14\xc14\xf0\xf7#\x10h\x09\xcc\x01O\x9c\ +\x98A\xa9\xebf\xaa\x14\x07x8LL\xe4[0\x12\ +)%\xa0\xef\xf2\xe0\x8aJ\x0bXI\x0aze\x10\xce\ +(\x9b\x00K\xf0\x148\xab\x07BEW}\xb3\xa3\xbd\ +\xec&\xc3\xc0;\xe3\x0dmkx\x16\x9a0\xa9\x0cF\ +\xb8N\xdf:k\x8a\x17\xf0B\xe8\xaf\x8a\xa5v%\x84\ +\xe5\xb0\x0c.A\xb2\xb0\xd4\xc0\x84Q\xc5a`\x0d\xe6\ +\xe5kl\xd5\x17f\x8bCC\xc5\xb3/\xaaA\xb4\x8a\ +\x91\xa5\x8c=|\xc6\x95\xf7\x94\x90OOk\xa8/\xe0\ +\xd2\xd3\x99\xdb\xca\xab)\xac\x88\x90\x8f\xa1\xec(\x5cr\ +\xcc\x0c\xa1\xd32\x0fd\x1cVvFC\xdd\xea\xa0f\ +.\xe8J\xdd\x15\xf3@\xaf-\x1f\x9c\x01K9\x92h\ +{\xb0\xd0\x8f\xd1\x18h\xd3\xea\x18\xd8\xcd\xdf\xae\x83\x8d\ +\xfd\xc2Z7\xdc\xe9\xf9\x08\xc8\x825\x9e\x5cz\x15.\ +\xcbi\xa4\xc1A@8\xea\xaf\x1b\xe6\x0c\xdf\x02B\xe9\ +\x0c7t\x86\xf5b\x18LwNi\x85\xb6\xd1)\xfb\ +\x01\xa1\x82/\x81\xa1\xb8\x1c\x0azI.~\xaa\xd1h\ +\xad(#\x1c\xff\x1e\x88\xfe\x07\xcc \x7f\x0e\x87\xf1(\ +\xb8\x9e\xaf\x9dAh\xfeaw\x08\xab\xf5\xfa\x070\xff\ +<\xd8\xd0\x16\x1a\xd1\xe0 tH!3\xcf\x86\xdf$\ +\x8e\xcd&\xef\xbc\xfa\xa8\xa4\xa2\xa2\xe4\xd1\xd5\x9dS\x9b\ +\x814V\x8b\x0a\xe9\xf9Eg\xc1y0gJ\x8a\xcb\ +\xe1\x1a{\xaesy0\xc7\xf2\xaf\xc3\xd4y\xfb\xe8s\ +\xf34\xef\x00\xb1\xf4>\xa8)\x89\xd1\xda f\x0c\xe7\ +\x10\x0b\xabE\xe2\xca\x0bD79\xec\xab\xd4\xb4nJ\ +(\xa5g\xfe\xfd\xfa\x9d\x863?\xf5\x9cE\xd3e\xe5\ +\xe8f(\xdaZ\x94\x8a#\xd4\x025\xdf\x9d\xc7\x8f\x88\ +\xe0\x0b\x04<8\x84\x0b\xf8\x82\x08>?B\xc0\xe7U\ +\x084<*<\xa2\x9co\x0b\xa9\x88\x08\x9e\x80\x1f\xce\ +W\x0b4|[\x01O\x8b\xdc\xeb\x04#m1\xda\xb0\ +\x12\x9b\xe2\x92\x92\xe2\x92b\xf8\xab(\xb1*\xd5\xc6\xd5\ +%\x04\xc0I[B\x97A\x0c\xca1\xd7\x12\xe3\xa5\xa5\ +\xea\x12M1U\xa2\xae\xbc\xec60\xfd\x08\x91\x07@\ +\xfd\xb3\xef@_\xedX\xd6\x131\xe3lS\x96\xc5\xc0\ +\x22p\xe2*V\xd5cQ\xad\x8eB\xecf\x7f6\x9b\ +\xd8\x0e\xbf\x0dN^\xc14W\xf4\xff\x5c\x12s\x9f\x96\ +\x81cY\x0e\xa0V\xb34j8Z\x02@\xa4Bm\ +G'\xe1\x00\xc7r<\x80\xf5\xc0T\x19\x80\x86F.\ +W[U<9.\xf5D_\xd2\x86\xb2\xf3O\x9c\xbe\ +`aV\x96z\xae&\xcbu^V\xd6\xdc\xac\xac9\ +s\xb3\xe6\x22\xcc\x9d7w\xee\xfc\xb9\xe5Y\x96\x18\x9f\ +\x03\x18\xf5\xe6de\xcd\x83X\xd6\x1c\x1a!kN\xc5\ +\x5c6\xa4\xe7\xa8\xe7\xda\xcf\x9b3'k\xc6\xf8\x81\xed\ +\x1c`\xb9\x00N4ei\xe7`_\x06\x8e\xffC;\ +\x8dm\x01\x9c\x8b\x00\x1e\xd8\xb1l,\xa8\x0a\x5c\x1a\xb0\ +j\xf8Y\x81;nE\xff\x9caY\xe1\x00?'p\ +\xd3\xb51\x078\xbb@\xbe\x1b}\xf6\x00p\x82%\x86\ +=\x1c\x9d\xe8\x85\x86\x03}\xb4\xa1q\xb4\xcb\x0cw\xfa\ +\xecI\x83\x16\xc3\x11~\x0et\x0d\xfc\xb9\xeax=\xfb\ +U#\xd7\xb7\xb9\xd5\xff\x1e\xe7\xee\xd7<\x81#\xf4G\ +\xeeA\x88\xe5\xe7\x1e\x82\xe3\x83\xdc\xc3p\xbc\x9f{\x04\ +\x8ews\x0b\x09;/77\xaf8\x97\xe4\xdd\x22O\ +r\xef\xe4\x82\x17x\x04-\x92\xe3\x15:\x8d\x92\xe3\ +\x05t\xd7B\xcb\xf2\xca+5_\x00\x95N?\x01\xf5\ +\xe6W*\x1f\xe6\xcf\xbc\xfb\xa0~r\x12QKu\xfd\ +H\xf2\xee\xe6jNh\xe8\xc6Py\xba\xbe\x83\xe91\ +\xefd\xae\x96\xdaSr\x22W\xcb\xab\x88\xce\xd5J\x02\ +\xf3[n\xde)\x9d\xfaa&\xb8\x81\x03*\xef\x16$\ +\x1e\x02\xd6%h\xfeM\x88\x17\xea\x06\xa0\x9a`I>\ +\xc8\x0a=x\xa2\x14\x9a\xf48\xf7>\xcd\x1a\x07\xd8]\ +H\xdd%j\x1c\xd0\xa0\x82{\x90\xbaE,N\xe0\x90\ +/\x05\x91N\x14\x90\xfb\x90uX\x93\x0f\xc7C\x9a\x02\ +8\x1e\xd4\x14\xc2\xf1\x80\xe6a\xe5\xe5cx\xac\xeer\ +3\x1b\x10\xb3\x011\x1b\x10\xb3\x011\x1b\x10\xb3\x011\ +\x1b\x10\xb3\x01y\x0b\x06D{\x8f)V9\x8a\x10\xb8\ +\x84\xe9\xfb?t\x08\x9a\xa6\xbb\xd7\xd2O\xa8R1\xf7\ +]\xbak\xf1\x1c\xf4\xf1\xf0\xf0\x7f\xa8-\xb6Q\ +\x00\x00\x09a\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Sky Icon / \ +System / View\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a \ + \x0a \ + \x0a \ + \x0a \ + \ + \ +\x0a \ + \ +\x0a \ + <\ +/path>\x0a \ + \x0a \ + \x0a \x0a \x0a\ + \x0a\x0a\ +\ +\x00\x00\x14\xc4\ +I\ +I*\x00b\x07\x00\x00\x80?\xe0@\x08$\x16\x0d\x07\ +\x84BaP\xb8d6\x1d\x0f\x88DbQ8\xa4V\ +-\x17\x8cFcQ\xb8\xe4v\x0b\x02\x7f\xc7\xa4R9\ +$\x96M'\x94JeR\xb8\xa4\x82Y/\x98Lf\ +S9\xa4\xd6a.\x9bNgS\xb9\xe4\xf6}#\x9c\ +O\xe8T:%\x16\x8d/\xa0\xd1\xe9T\xbae6\x9d\ +\x1f\x81\xd3\xeaU:\xa5V\x91Q\xabVkU\xba\xe4\ +B\x93]\xb0XlU*\xfd\x8e\xcdg\xb4N\xec\xb6\ +\x9be\xb6\xdd&\xb5\xdb\xeeW;\xa4J\xe3u\xbc^\ +o7{\xd5\xf6\xfdi\xbe_\xf0X:\xde\x07\x09\x87\ +\xc4Sp\xd8\x9cf6\x7f\x8b\xc7drS<\x86O\ +-\x97\x93\xe5s\x19\xbc\xe4k5\x9d\xd0hk\xd5\x8d\ +\x16\x97M-\xd2Q\x00:\xbb\xf4\x805\x05\x1d\xc1F\ +PQ\x8c\x14;\x05\x08\xee!.\xf8+\xc2\x0a\xe3\x82\ +\xb3\xe0\xac\xe8+\x13V\x01s_s\xf9MM\x0f\x8f\ +l\x90\x06\xe0\xa5\xc8)B\x0a7\x82\x80f\xd2\x18#\ +.\x0a\xaf\x82\xa9x\xfc\x0bG.e\xe6\x98\xf3\xeb\xb2\ +\x01\xc4\x14\xe1\x05)\xc1@\x95g\xe7~\x0a\x90\xe3\xb1\ +\xbd|\xda\x17\xa2`\xf5,\x88\x13n\x82\x11\xa8(\xaa\ +\xbd\x15\xa8(\xe4\xe3\x9cJ\x9b\xfc\xab\xbb\x8a4\x00\xa2\ +\xa4\x002\x0a9\xa0\xa3\xda\x0a\x05\xb1\x07\xb2\x0aB\xa0\ +\xa4k\x8e|\xa8\xf0zY\x13%p\x9a|\x90\x08\xc8\ +)&\x82\x84\xcd\x11\xb6\x82\x8d\xce9p\xa1\xc5\x09T\ +r\x94\xc5Na\xfe\x01 \xa4\x1a\x0a=4\xe8y\x11\ +\x0c\xb8\xe7\xf2s\x1d\xa5\x12bO\x1e\xc4\xe8\x10 \x82\ +\x94\xc8(\x93\x22\xa2\xd1\xba\x08,\xb8\xed\xf3\xce\xfe1\ +\xf3\x02}(3(\x10T\x82\x96\x08(K,#\xa6\ +\xe3\xaa\xe3\x9a\xb0\x82\x95'$\xd3\x22D\x90\x08o\xb2\ +\x08\x06\xcd\x899\xe8\x82\x8a.9x\x94\xce\x89-\x0a\ +\x92N\xcc\xf2\x04\x22\xa0\xa5\x8a\x0a\x04\xcf\xa9\x81\xf0\x82\ +\x89\xce9wCLI\xed\x0e\x91\xd1(\xacYF\xa0\ +\xa0B\xa4\xe4\xa0\x85b\x0a[\xa0\xa7\x0a\x0ar#\xe8\ ++^\x82\x17\xa8(8\xaeRh \x9e\xe3\x97H\xf5\ +7;\xd3)\xe5:\xd1\x9f\xe2<\xd1P\xa9\x87\x02\x0a\ +:;\xf2J,\x90M\xc8 F\xb1V\xa0\x00\xa0\xe3\ +\x974T#\x0aW\xa9\xdd~\x85\xa4\x01\xaa\x0a`\xd1\ +\xeaa\x18\x82\x8f\xce9\xef] Vh\x01g\xac\xf0\ +\xf2\x08\x1f\xb8\xe6e\x97l\xa7U\xda=m\xa0\xc9\x00\ +<\x82\x99((0\xa3IH \xd8\xe3\x92\xf4%\xd2\ +\x82\xdd\x8ba\xce\xeb\xbck\xb5\xe9%\xe1\xe9\xb5\xb6\x90\ +\x01\xc8)\x8a\x82\x85\x8a`\xc8\xe3\x93\xb0\x85\xd5\x84\xad\ +\xe6\x92\x0a\x1e8\xe7\x9a\x1d{#\xb9B9;$\x0e\ +\xd2\x08Y\xa0\xa2Z\x98P8\xe3\x0c}\x8f\xafE\x94\ +\xde\xd5\xda\xf7\xce\x22\x9a\xe5H\xdeX\x81\x0f\x92\x0d\x8a\ +\x82\x85W6o\x840C\xbb\x8eE!Z\x0d\xac\xa5\ +EI\x00z\x82\x97\xe8(\x06\xa6\x0c\xae99\x88\x1f\ +\xf9\xc2\xfe\xfa\xa0\x99#W~\xaa\x19\xecq\x9f\xa6\x8e\ +~(\x82\xe4H >\xa6UH J\xe3\x9f{\x06\ +\xc4\xc2Fh `\xe3\x9e\xda\x923\xc1#\x1br\x05\ +\x02\xa0\x83\x92\xa4D\xb8\xe3\xc55\x83\xd9\xccq\x02\xe3\ +\x90\x1c\x22/\xcb#2\x9a\x08\xf2\x00\x00b\xa4 8\ +\xf7\x02yfi\x8ckx\x82_h$\xfe\xa3s\x08\ +\xc0\xec\x82\x91*\x95\xce\x82\x01\xfb\xc7\x1f\xb0\xf4\xac\x97\ +\x14\x82\x11\xf1.\xd8\x9b\x16\xa8(\x94\xa9\x1b\xae8I\ +\xb5\x9f\xe1\x12\x0a\x02\xa5\x99\x86\xec\xa9y\xc0\x00\x9d\xdf\ +mJ)\xb3\x18*F+\x8e\x1e0i\x06\xb2\x82\x08\ +\x0a\x91\xb0\x82\x85>\xa2\x9bw\x00\x14\x82\x9eZ8\xe2\ +o\xba\x81<\x08#\xac\xa7\xfd\x10\xe7Y\xdf\xa6\xa6\xfa\ +\x0a\x10*F3\x8elL\x11 \x18D\x15\xab\x94\xf1\ +\xbc\xeeJ#\xad\x22\xea\x5c\x82\x04B\xa47\x8e; \ +9D\x08m&\xa2\xa4\xb5H H|\xc51#\x90\ +@\xeeT\x96\x8b\xb55c\xe8\xba\x92\x07\x98A\x12\xf0\ +\x00\x01EHB\x10P\xfb\x06\xca[s \x83u\xad\ +\x15 \x86q\xc5\xf4% O\x84\x82=\xf2\x9d\x09\x08\ + ! \xaa\x91l=R~\xe1\x87\xf8\xa9 \xa1X\ +\xa9\x10\x04`\x06\x06u\x00A\xa0\xf0\x88L*\x17\x0c\ +\x86\xc3\xa1\xf1\x08\x88\x01\xff\x14D\xc1\xce\xd1(\xccj\ +7\x09O@\xc0&8\xa3\xfe9$\x92\xc2$Ri\ +Lr?\x13\x8a\x08\xa0\xed\x0886U4\x8d8\xe0\ +\xe2H\xfb\xeak<\x9e\xc2\xa4@h;r\x0e\x1d\x9f\ +Q\xa1N\xf88\xb6>\xe5\x94Q\xe8\xf4\xea|\xfaY\ +'\x8a\x17\xa0\xea\x1a\x95j\x0ci\x8f\xa6+v\x08\xcc\ +\x88\xd1\x07K\xd8i\xe5x\xfa\xaa\xab#\xb3\xca\xaa6\ +\xe9-R\x17\x22O\xc1\xcc\x17\x19\xa3\x8a\x0e*\x8f\xbd\ +o6\x19\x102\x0e\xd6\xa2`%)\xa8\xf9\x9e\x19p\ +\xc3\xd8\xa2\x98\xe9\x5c\x0e\x1b\x22\x04A\xd8\xd0q\x8eF\ +H\xa5\x8f\x973t\xf9\x12\x9a\x0eY\xd0F\xd9\x90q\ +\xe4}\xf3\x8c\xc8i\xa28\xdd|2\xe7\x0e\x91\x07 \ +\xec\x988ke\x125\xc7\xd2\xdb\xc8\xe4\x88\xdb\x07I\ +pb\x0eH8\xe2\x99\x10\xd8\xf1\xe0\xfc\xeex\x03i\ +\xb0\x8a\x0c \xec8>\x0f\xa5'\x83\x9d#\xe8\xee\xe4\ +&E\x05\x83E\xa0\xc0\x1f\x14\x1d\xe7\xa9\x8f\xb4\xa3]\ +\x1e\x7f\xc7\x8f\xd4\xf8E\x090u\x94\x1c\x09\xea\x85Y\ +\x90a\xdd\x1f{\x18\xe4\x88\x0eA\xc8\xb4\x1cf\x7fP\ +\x93\xf1\x07\x13\x11\xf2\xe5%|\xdc\x18M\xbc}RD\ +\x89\x9fA\x8a\x04\x1c\x03\x82\xd0\x83\xa1\x07\x1e\x10r\x99\ +\x1f>\xd3\xe5\x01\x07\x16\xd0r\x1d\x07\x05\xe1\xf4\x1c\xfd\ +]\xd1\xf2\x914\x85[(\xdd\xaf\x85\xd2\x94\x88XA\ +\xca7\xee0B\x8f\x04\x1c\xb0A\xcb\x84\x1c\xe1A\xdc\ +\x94)\xb7A\x81\xf4\x1cHA\xc5\x04\x1c\x10\x90\x90\x98\ +\xc9\x06\x17\x11\xf2\xa2(k\xa0\xb8\xe5\xa6\x8e\xd3T\x88\ +T\x89\x10p\x16W\x9a\x97\x985\x06\x16Q\xf2\xb1R\ +\x98Z\x09\xcd\x9b\x98\xe5\xe3\xfeTA\x8at\x1d\x96\x9a\ +\xe7\xf4\xf4\xf8i\x11\xf9\x19`\x9dY\x1a\x1d\x8e\x9d\xda\ +\x14P3A\xca\xe4\x1c\x1e\xa0)4i{A\x854\ +}\xa8\x5ch\x96\x1e\x9c`(\xb5m\x22\x05\x10yu\ +\x06\x10\xe9J\xa1\x08/\xd0u\xa5\x03:\xe8\x89}\xfd\ +\xa7\x97\x9a\x81gH\xa1\xe4\x18\x88w\xaa\x99\xa9\xe1A\ +\x87d~Y\x9d+\x17\xaa\xb3\x5ckZ\xc0\xff~\x10\ +bE\x07\x09k\xc6\x99CA\x86\xf4|\xb6x\xace\ +\xba\xd8Y\xec\x86\x9a)A\x87$\x1c{v\xad\x05\x1d\ +\x7fA\x88d\x1c\x8dj\xe1\xfbi\x81\xb1\x1e+q\xd2\ +H\x81\xb4\x1c\x8aA\xc5\xab\x91&\xa9@\x01\xd5\x1f\x93\ +'\xfb\xb6\x86\xbb\xdd\xcb\xc60H\x83$\x1cnA\xe3\ +\xe4\x18\x07\xaaZ\xc4\x19k\xb3\x11\xf36\xf9KV\xd9\ +\x83\x03t\xb0ZM\x22\x05j\xc9M\x07\x0f\xe4\x16\x82\ +m\x00\x0c)\x15\x07*Q\xf3\xab\x16kq\x8a\xcb\x1a\ +s\xf1\xcc\xb9\x06H\xa5d\x188fs\xb4\x19EA\ +\xb3\x80\x00\x11B\xe4D\x19IA\x93t\x191A\x8c\ +\xf4\x1c\xc8G\xf4l\xd5\xf6\xcc,\x5c\xcbQ\xd5\xb5}\ +a\xbc\xc0u\x9ds]\xd7\xb5-\x7fa\xd8\xb64\xf7\ +[\xd96}\xa3.\xd9\xb6\x9d\xb3m\xa06\xbd\xbbq\ +\xdc\xb5MOs\xdd\xb7{Cp\xde7\xbd\xf2\xd9\xd5\ +w\xde\x03\x81\xd6\xb7\xfe\x0b\x85\xe1\x97\x9d\xeb\x87\xe2\xb8\ +\xb6\xd7\x84\xe38\xfeA&\xe2y\x1eS\x86\xe4\xf9^\ +c}\xe5\xf9\x9esv\xe6\xf9\xde\x83m\xe7\xfa\x1e\x93\ +d\xe8\xfa^\xa3^\xe9\xfa\x9e\xb3W\xea\xfa\xde\xc3\x16\ +\xeb\xfb\x1e\xd2\xa9\xec\xfb^\xe3\x00\xe3\xbb\x9e\xf3d@\ +@\x13\x00\xfe\x00\x04\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\ +\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x01\x01\x04\x00\x01\ +\x00\x00\x00`\x00\x00\x00\x02\x01\x03\x00\x04\x00\x00\x00L\ +\x08\x00\x00\x03\x01\x03\x00\x01\x00\x00\x00\x05\x00\x00\x00\x06\ +\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00\x11\x01\x04\x00\x01\ +\x00\x00\x00\x08\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\x00\x04\ +\x00\x00\x00\x16\x01\x04\x00\x01\x00\x00\x00`\x00\x00\x00\x17\ +\x01\x04\x00\x01\x00\x00\x00Z\x07\x00\x00\x1a\x01\x05\x00\x01\ +\x00\x00\x00T\x08\x00\x00\x1b\x01\x05\x00\x01\x00\x00\x00\x5c\ +\x08\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00(\ +\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\x00\x10\ +\x00\x00\x00d\x08\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\ +\x00\x00\x00R\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x00S\ +\x01\x03\x00\x04\x00\x00\x00t\x08\x00\x00s\x87\x07\x00H\ +\x0c\x00\x00|\x08\x00\x00\x00\x00\x00\x00\x08\x00\x08\x00\x08\ +\x00\x08\x00\x802\x02\x00\xe8\x03\x00\x00\x802\x02\x00\xe8\ +\x03\x00\x00paint.net 4.0\ +.9\x00\x01\x00\x01\x00\x01\x00\x01\x00\x00\x00\x0cHL\ +ino\x02\x10\x00\x00mntrRGB X\ +YZ \x07\xce\x00\x02\x00\x09\x00\x06\x001\x00\x00a\ +cspMSFT\x00\x00\x00\x00IEC s\ +RGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-HP \x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11c\ +prt\x00\x00\x01P\x00\x00\x003desc\x00\ +\x00\x01\x84\x00\x00\x00lwtpt\x00\x00\x01\xf0\x00\ +\x00\x00\x14bkpt\x00\x00\x02\x04\x00\x00\x00\x14r\ +XYZ\x00\x00\x02\x18\x00\x00\x00\x14gXYZ\x00\ +\x00\x02,\x00\x00\x00\x14bXYZ\x00\x00\x02@\x00\ +\x00\x00\x14dmnd\x00\x00\x02T\x00\x00\x00pd\ +mdd\x00\x00\x02\xc4\x00\x00\x00\x88vued\x00\ +\x00\x03L\x00\x00\x00\x86view\x00\x00\x03\xd4\x00\ +\x00\x00$lumi\x00\x00\x03\xf8\x00\x00\x00\x14m\ +eas\x00\x00\x04\x0c\x00\x00\x00$tech\x00\ +\x00\x040\x00\x00\x00\x0crTRC\x00\x00\x04<\x00\ +\x00\x08\x0cgTRC\x00\x00\x04<\x00\x00\x08\x0cb\ +TRC\x00\x00\x04<\x00\x00\x08\x0ctext\x00\ +\x00\x00\x00Copyright (c)\ + 1998 Hewlett-Pa\ +ckard Company\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00\x12sRGB \ +IEC61966-2.1\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x12sRGB IEC\ +61966-2.1\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00XYZ \x00\ +\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xccX\ +YZ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\xa2\x00\ +\x008\xf5\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\ +\x00b\x99\x00\x00\xb7\x85\x00\x00\x18\xdaXYZ \x00\ +\x00\x00\x00\x00\x00$\xa0\x00\x00\x0f\x84\x00\x00\xb6\xcfd\ +esc\x00\x00\x00\x00\x00\x00\x00\x16IEC h\ +ttp://www.iec.ch\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x16IEC \ +http://www.iec.c\ +h\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\ +esc\x00\x00\x00\x00\x00\x00\x00.IEC 6\ +1966-2.1 Default\ + RGB colour spac\ +e - sRGB\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00.IEC 61966-2.\ +1 Default RGB co\ +lour space - sRG\ +B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\ +\x00\x00,Reference Vie\ +wing Condition i\ +n IEC61966-2.1\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00,Refere\ +nce Viewing Cond\ +ition in IEC6196\ +6-2.1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00v\ +iew\x00\x00\x00\x00\x00\x13\xa4\xfe\x00\x14_.\x00\ +\x10\xcf\x14\x00\x03\xed\xcc\x00\x04\x13\x0b\x00\x03\x5c\x9e\x00\ +\x00\x00\x01XYZ \x00\x00\x00\x00\x00L\x09V\x00\ +P\x00\x00\x00W\x1f\xe7meas\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x8f\x00\x00\x00\x02sig \x00\ +\x00\x00\x00CRT curv\x00\x00\x00\x00\x00\ +\x00\x04\x00\x00\x00\x00\x05\x00\x0a\x00\x0f\x00\x14\x00\x19\x00\ +\x1e\x00#\x00(\x00-\x002\x007\x00;\x00@\x00\ +E\x00J\x00O\x00T\x00Y\x00^\x00c\x00h\x00\ +m\x00r\x00w\x00|\x00\x81\x00\x86\x00\x8b\x00\x90\x00\ +\x95\x00\x9a\x00\x9f\x00\xa4\x00\xa9\x00\xae\x00\xb2\x00\xb7\x00\ +\xbc\x00\xc1\x00\xc6\x00\xcb\x00\xd0\x00\xd5\x00\xdb\x00\xe0\x00\ +\xe5\x00\xeb\x00\xf0\x00\xf6\x00\xfb\x01\x01\x01\x07\x01\x0d\x01\ +\x13\x01\x19\x01\x1f\x01%\x01+\x012\x018\x01>\x01\ +E\x01L\x01R\x01Y\x01`\x01g\x01n\x01u\x01\ +|\x01\x83\x01\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\ +\xb9\x01\xc1\x01\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\ +\xfa\x02\x03\x02\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02\ +A\x02K\x02T\x02]\x02g\x02q\x02z\x02\x84\x02\ +\x8e\x02\x98\x02\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\ +\xe0\x02\xeb\x02\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x03\ +8\x03C\x03O\x03Z\x03f\x03r\x03~\x03\x8a\x03\ +\x96\x03\xa2\x03\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\ +\xf9\x04\x06\x04\x13\x04 \x04-\x04;\x04H\x04U\x04\ +c\x04q\x04~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\ +\xd3\x04\xe1\x04\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05\ +I\x05X\x05g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\ +\xc5\x05\xd5\x05\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06\ +H\x06Y\x06j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\ +\xd1\x06\xe3\x06\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07\ +a\x07t\x07\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\ +\xf8\x08\x0b\x08\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\ +\x96\x08\xaa\x08\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09\ +:\x09O\x09d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\ +\xe5\x09\xfb\x0a\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\ +\x98\x0a\xae\x0a\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0b\ +Q\x0bi\x0b\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\ +\x12\x0c*\x0cC\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\ +\xd9\x0c\xf3\x0d\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\ +\xa9\x0d\xc3\x0d\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\ +\x7f\x0e\x9b\x0e\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f\ +^\x0fz\x0f\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10\ +C\x10a\x10~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x11\ +1\x11O\x11m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12\ +&\x12E\x12d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13\ +#\x13C\x13c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14\ +'\x14I\x14j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x15\ +4\x15V\x15x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16\ +I\x16l\x16\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17\ +e\x17\x89\x17\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\ +\x8a\x18\xaf\x18\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\ +\xb7\x19\xdd\x1a\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\ +\xec\x1b\x14\x1b;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c\ +*\x1cR\x1c{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1d\ +p\x1d\x99\x1d\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\ +\xbe\x1e\xe9\x1f\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \ +\x15 A l \x98 \xc4 \xf0!\x1c!H!\ +u!\xa1!\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\ +\xdd#\x0a#8#f#\x94#\xc2#\xf0$\x1f$\ +M$|$\xab$\xda%\x09%8%h%\x97%\ +\xc7%\xf7&'&W&\x87&\xb7&\xe8'\x18'\ +I'z'\xab'\xdc(\x0d(?(q(\xa2(\ +\xd4)\x06)8)k)\x9d)\xd0*\x02*5*\ +h*\x9b*\xcf+\x02+6+i+\x9d+\xd1,\ +\x05,9,n,\xa2,\xd7-\x0c-A-v-\ +\xab-\xe1.\x16.L.\x82.\xb7.\xee/$/\ +Z/\x91/\xc7/\xfe050l0\xa40\xdb1\ +\x121J1\x821\xba1\xf22*2c2\x9b2\ +\xd43\x0d3F3\x7f3\xb83\xf14+4e4\ +\x9e4\xd85\x135M5\x875\xc25\xfd676\ +r6\xae6\xe97$7`7\x9c7\xd78\x148\ +P8\x8c8\xc89\x059B9\x7f9\xbc9\xf9:\ +6:t:\xb2:\xef;-;k;\xaa;\xe8<\ +'\ + >`>\xa0>\xe0?!?a?\xa2?\xe2@\ +#@d@\xa6@\xe7A)AjA\xacA\xeeB\ +0BrB\xb5B\xf7C:C}C\xc0D\x03D\ +GD\x8aD\xceE\x12EUE\x9aE\xdeF\x22F\ +gF\xabF\xf0G5G{G\xc0H\x05HKH\ +\x91H\xd7I\x1dIcI\xa9I\xf0J7J}J\ +\xc4K\x0cKSK\x9aK\xe2L*LrL\xbaM\ +\x02MJM\x93M\xdcN%NnN\xb7O\x00O\ +IO\x93O\xddP'PqP\xbbQ\x06QPQ\ +\x9bQ\xe6R1R|R\xc7S\x13S_S\xaaS\ +\xf6TBT\x8fT\xdbU(UuU\xc2V\x0fV\ +\x5cV\xa9V\xf7WDW\x92W\xe0X/X}X\ +\xcbY\x1aYiY\xb8Z\x07ZVZ\xa6Z\xf5[\ +E[\x95[\xe5\x5c5\x5c\x86\x5c\xd6]']x]\ +\xc9^\x1a^l^\xbd_\x0f_a_\xb3`\x05`\ +W`\xaa`\xfcaOa\xa2a\xf5bIb\x9cb\ +\xf0cCc\x97c\xebd@d\x94d\xe9e=e\ +\x92e\xe7f=f\x92f\xe8g=g\x93g\xe9h\ +?h\x96h\xeciCi\x9ai\xf1jHj\x9fj\ +\xf7kOk\xa7k\xfflWl\xafm\x08m`m\ +\xb9n\x12nkn\xc4o\x1eoxo\xd1p+p\ +\x86p\xe0q:q\x95q\xf0rKr\xa6s\x01s\ +]s\xb8t\x14tpt\xccu(u\x85u\xe1v\ +>v\x9bv\xf8wVw\xb3x\x11xnx\xccy\ +*y\x89y\xe7zFz\xa5{\x04{c{\xc2|\ +!|\x81|\xe1}A}\xa1~\x01~b~\xc2\x7f\ +#\x7f\x84\x7f\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x82\ +0\x82\x92\x82\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85\ +G\x85\xab\x86\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88\ +i\x88\xce\x893\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\ +\x96\x8b\xfc\x8cc\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\ +\xce\x8f6\x8f\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\ +\x11\x92z\x92\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95\ +_\x95\xc9\x964\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\ +\xb8\x99$\x99\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\ +\x1c\x9c\x89\x9c\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\ +\x8b\x9f\xfa\xa0i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\ +\x06\xa3v\xa3\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\ +\x8b\xa6\xfd\xa7n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\ +\x1c\xaa\x8f\xab\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\ +\xb8\xae-\xae\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1\ +`\xb1\xd6\xb2K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\ +\x13\xb5\x8a\xb6\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\ +\xd1\xb9J\xb9\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\ +\x9b\xbd\x15\xbd\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0\ +p\xc0\xec\xc1g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4\ +Q\xc4\xce\xc5K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8\ +=\xc8\xbc\xc9:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc\ +5\xcc\xb5\xcd5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd0\ +9\xd0\xba\xd1<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4\ +I\xd4\xcb\xd5N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8\ +d\xd8\xe8\xd9l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\ +\x8a\xdd\x10\xdd\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\ +\xbd\xe1D\xe1\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\ +\xfc\xe5\x84\xe6\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9\ +F\xe9\xd0\xea[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\ +\x9c\xee(\xee\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\ +\xff\xf2\x8c\xf3\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6\ +m\xf6\xfb\xf7\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\ +\xe7\xfbw\xfc\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xff\ +m\xff\xff\ +\x00\x00\x081\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / outl\ +iner / slice / n\ +ot active - save\ +d copy\x0a \ + Created\ + with Sketch.\x0a <\ +/defs>\x0a \x0a \x0a \ + <\ +/path>\x0a \ + \x0a <\ +path d=\x22M14.9826\ +165,6.50282053 C\ +14.7276121,2.868\ +84654 11.6988335\ +,0 8,0 C6.821531\ +33,0 5.71107957,\ +0.29121506 4.736\ +68211,0.80560781\ + C5.52211072,1.5\ +7704166 8.929157\ +37,4.97484587 10\ +.4514738,6.50452\ +22 C10.82345,6.5\ +0282053 14.72604\ +01,6.5045222 14.\ +9826165,6.502820\ +53 Z\x22 id=\x22Combin\ +ed-Shape\x22>\x0a \x0a \ + \x0a \x0a\ + \x0a\x0a\ +\ +\x00\x00\x09\x94\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Artboard\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a\ + \x0a \ + \ +\x0a \ + <\ +/rect>\x0a \ + \x0a \ + <\ +/path>\x0a \ + \x0a \x0a \x0a\x0a\ +\x00\x00\x02\xad\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a Icons / Sys\ +tem / Carat / Wh\ +ite / Default\x0a \ +Created with Ske\ +tch.\x0a \ +\ +\x0a \x0a \ +\x0a\x0a\ +\x00\x00\x8e\x0c\ +I\ +I*\x00\x08\x00\x00\x00\x19\x00\xfe\x00\x04\x00\x01\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x01\x01\x03\x00\x01\x00\x00\x00`\x00\x00\x00\x02\x01\x03\ +\x00\x04\x00\x00\x00:\x01\x00\x00\x03\x01\x03\x00\x01\x00\x00\ +\x00\x05\x00\x00\x00\x06\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00\x11\x01\x04\x00\x01\x00\x00\x00`V\x00\x00\x12\x01\x03\ +\x00\x01\x00\x00\x00\x01\x00\x00\x00\x15\x01\x03\x00\x01\x00\x00\ +\x00\x04\x00\x00\x00\x16\x01\x03\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x17\x01\x04\x00\x01\x00\x00\x00\xd9\x15\x00\x00\x1a\x01\x05\ +\x00\x01\x00\x00\x00B\x01\x00\x00\x1b\x01\x05\x00\x01\x00\x00\ +\x00J\x01\x00\x00\x1c\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\ +\x00(\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\x001\x01\x02\ +\x00\x22\x00\x00\x00R\x01\x00\x002\x01\x02\x00\x14\x00\x00\ +\x00t\x01\x00\x00=\x01\x03\x00\x01\x00\x00\x00\x02\x00\x00\ +\x00R\x01\x03\x00\x01\x00\x00\x00\x01\x00\x00\x00\xbc\x02\x01\ +\x00\x1a;\x00\x00\x88\x01\x00\x00\xbb\x83\x07\x00\x0f\x00\x00\ +\x00\xa2<\x00\x00I\x86\x01\x00f\x0d\x00\x00\xb2<\x00\ +\x00i\x87\x04\x00\x01\x00\x00\x00\x0a\x0a \x0a\ + \x0a \ + Adobe Photosho\ +p CC 2015.5 (Win\ +dows)\x0a \ + 2017-03-07T11:3\ +2:29-08:00\x0a \ + 2017-04-04T\ +11:28-07:00\x0a \ + 2017-04-\ +04T11:28-07:00\x0a image/tiff\ +\x0a \ + 3\x0a sRGB IEC61966-\ +2.1\x0a \ + \x0a \x0a \ + a\ +dobe:docid:photo\ +shop:94a27cdb-04\ +33-11e7-b02d-9f8\ +4d9f5a326\x0a \ + adobe:\ +docid:photoshop:\ +acaee4ff-1960-11\ +e7-bae7-e6e7a5cd\ +2814\x0a \ + \x0a \x0a \ + xmp.iid:\ +fa5f33a4-5729-d3\ +41-9ab8-5edce3a2\ +68a4\x0a \ + adobe:docid:p\ +hotoshop:696e80e\ +4-1964-11e7-8c4b\ +-d6fec7ab83c2\ +\x0a xmp.did:ca77\ +1a70-f965-e14f-9\ +103-360465543dbf\ +\x0a \ + \x0a \ + \x0a \ + \x0a \ + crea\ +ted\x0a \ + xmp.iid:c\ +a771a70-f965-e14\ +f-9103-360465543\ +dbf\x0a \ + 2017-03-07T\ +11:32:29-08:00\x0a \ + Adobe Photosh\ +op CC 2015.5 (Wi\ +ndows)\x0a \ + \x0a \ + \x0a \ + saved\x0a \ + \ +xmp.iid:16fdf09c\ +-857d-944e-9783-\ +e127cb1b9cf4\x0a\ + \ + 20\ +17-03-08T11:37:4\ +5-08:00\x0a \ + Adob\ +e Photoshop CC 2\ +015.5 (Windows)<\ +/stEvt:softwareA\ +gent>\x0a \ + /\x0a \ + \x0a \ + \x0a \ + saved\x0a \ + xmp.\ +iid:fa5f33a4-572\ +9-d341-9ab8-5edc\ +e3a268a4\x0a \ + 2017-0\ +4-04T11:28-07:00\ +\x0a \ + \ +Adobe Photo\ +shop CC 2017 (Wi\ +ndows)\x0a \ + <\ +stEvt:changed>/<\ +/stEvt:changed>\x0a\ + <\ +/rdf:li>\x0a \ + \x0a\ + \x0a \ +\x0a \ +\x0a\x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a\ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \x0a \ + \ + \ + \ + \ + \ + \ +\x0a \ + \x0a\x1c\x01Z\x00\x03\x1b%G\x1c\x02\x00\x00\x02\x00\x00\ +\x008BIM\x04%\x00\x00\x00\x00\x00\x10\xcd\xcf\xfa\ +}\xa8\xc7\xbe\x09\x05pv\xae\xaf\x05\xc3N8BI\ +M\x04:\x00\x00\x00\x00\x00\xe5\x00\x00\x00\x10\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x0bprintOutp\ +ut\x00\x00\x00\x05\x00\x00\x00\x00PstSbo\ +ol\x01\x00\x00\x00\x00Inteenum\x00\ +\x00\x00\x00Inte\x00\x00\x00\x00Clrm\x00\ +\x00\x00\x0fprintSixteenB\ +itbool\x00\x00\x00\x00\x0bprint\ +erNameTEXT\x00\x00\x00\x01\x00\x00\ +\x00\x00\x00\x0fprintProofSe\ +tupObjc\x00\x00\x00\x0c\x00P\x00r\x00\ +o\x00o\x00f\x00 \x00S\x00e\x00t\x00u\x00\ +p\x00\x00\x00\x00\x00\x0aproofSetu\ +p\x00\x00\x00\x01\x00\x00\x00\x00Bltnenu\ +m\x00\x00\x00\x0cbuiltinProo\ +f\x00\x00\x00\x09proofCMYK\x008\ +BIM\x04;\x00\x00\x00\x00\x02-\x00\x00\x00\x10\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x12printOu\ +tputOptions\x00\x00\x00\x17\x00\ +\x00\x00\x00Cptnbool\x00\x00\x00\x00\x00\ +Clbrbool\x00\x00\x00\x00\x00Rgs\ +Mbool\x00\x00\x00\x00\x00CrnCbo\ +ol\x00\x00\x00\x00\x00CntCbool\x00\ +\x00\x00\x00\x00Lblsbool\x00\x00\x00\x00\ +\x00Ngtvbool\x00\x00\x00\x00\x00Em\ +lDbool\x00\x00\x00\x00\x00Intrb\ +ool\x00\x00\x00\x00\x00BckgObjc\ +\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00RGBC\x00\x00\ +\x00\x03\x00\x00\x00\x00Rd doub@o\ +\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Grn do\ +ub@o\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00Bl\ + doub@o\xe0\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00BrdTUntF#Rlt\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Bld Un\ +tF#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00RsltUntF#Pxl@b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0avector\ +Databool\x01\x00\x00\x00\x00PgP\ +senum\x00\x00\x00\x00PgPs\x00\x00\x00\ +\x00PgPC\x00\x00\x00\x00LeftUnt\ +F#Rlt\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00Top UntF#Rlt\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00Scl Unt\ +F#Prc@Y\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x10cropWhenPrintin\ +gbool\x00\x00\x00\x00\x0ecropRe\ +ctBottomlong\x00\x00\x00\x00\ +\x00\x00\x00\x0ccropRectLeft\ +long\x00\x00\x00\x00\x00\x00\x00\x0dcrop\ +RectRightlong\x00\x00\x00\ +\x00\x00\x00\x00\x0bcropRectTop\ +long\x00\x00\x00\x00\x008BIM\x03\xed\x00\ +\x00\x00\x00\x00\x10\x00\x90\x00\x00\x00\x01\x00\x01\x00\x90\x00\ +\x00\x00\x01\x00\x018BIM\x04&\x00\x00\x00\x00\x00\ +\x0e\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00?\x80\x00\x008\ +BIM\x03\xee\x00\x00\x00\x00\x00\x0d\x0cTran\ +sparency\x008BIM\x04\x15\x00\ +\x00\x00\x00\x00\x1e\x00\x00\x00\x0d\x00T\x00r\x00a\x00\ +n\x00s\x00p\x00a\x00r\x00e\x00n\x00c\x00\ +y\x00\x008BIM\x045\x00\x00\x00\x00\x00\x11\x00\ +\x00\x00\x01\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\x00d\x01\ +\x008BIM\x04\x1d\x00\x00\x00\x00\x00\x04\x00\x00\x00\ +\x008BIM\x03\xf2\x00\x00\x00\x00\x00\x0a\x00\x00\xff\ +\xff\xff\xff\xff\xff\x00\x008BIM\x04\x0d\x00\x00\x00\ +\x00\x00\x04\x00\x00\x00\x1e8BIM\x04\x19\x00\x00\x00\ +\x00\x00\x04\x00\x00\x00\x1e8BIM\x03\xf3\x00\x00\x00\ +\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00\x01\x008BI\ +M'\x10\x00\x00\x00\x00\x00\x0a\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x018BIM\x03\xf5\x00\x00\x00\x00\x00H\x00\ +/ff\x00\x01\x00lff\x00\x06\x00\x00\x00\x00\x00\ +\x01\x00/ff\x00\x01\x00\xa1\x99\x9a\x00\x06\x00\x00\x00\ +\x00\x00\x01\x002\x00\x00\x00\x01\x00Z\x00\x00\x00\x06\x00\ +\x00\x00\x00\x00\x01\x005\x00\x00\x00\x01\x00-\x00\x00\x00\ +\x06\x00\x00\x00\x00\x00\x018BIM\x03\xf8\x00\x00\x00\ +\x00\x00p\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\ +\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\x03\xe8\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\ +\xe8\x00\x008BIM\x04\x00\x00\x00\x00\x00\x00\x02\x00\ +\x008BIM\x04\x02\x00\x00\x00\x00\x00\x02\x00\x008\ +BIM\x040\x00\x00\x00\x00\x00\x01\x01\x008BI\ +M\x04-\x00\x00\x00\x00\x00\x06\x00\x01\x00\x00\x00\x038\ +BIM\x04\x08\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00\ +\x00\x02@\x00\x00\x02@\x00\x00\x00\x008BIM\x04\ +\x1e\x00\x00\x00\x00\x00\x04\x00\x00\x00\x008BIM\x04\ +\x1a\x00\x00\x00\x00\x035\x00\x00\x00\x06\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ +\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00null\x00\x00\x00\x02\x00\x00\ +\x00\x06boundsObjc\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00Rct1\x00\x00\x00\x04\x00\x00\ +\x00\x00Top long\x00\x00\x00\x00\x00\x00\ +\x00\x00Leftlong\x00\x00\x00\x00\x00\x00\ +\x00\x00Btomlong\x00\x00\x00`\x00\x00\ +\x00\x00Rghtlong\x00\x00\x00`\x00\x00\ +\x00\x06slicesVlLs\x00\x00\x00\x01\ +Objc\x00\x00\x00\x01\x00\x00\x00\x00\x00\x05sl\ +ice\x00\x00\x00\x12\x00\x00\x00\x07slice\ +IDlong\x00\x00\x00\x00\x00\x00\x00\x07gr\ +oupIDlong\x00\x00\x00\x00\x00\x00\x00\ +\x06originenum\x00\x00\x00\x0cE\ +SliceOrigin\x00\x00\x00\x0da\ +utoGenerated\x00\x00\x00\x00\ +Typeenum\x00\x00\x00\x0aESli\ +ceType\x00\x00\x00\x00Img \x00\x00\ +\x00\x06boundsObjc\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00Rct1\x00\x00\x00\x04\x00\x00\ +\x00\x00Top long\x00\x00\x00\x00\x00\x00\ +\x00\x00Leftlong\x00\x00\x00\x00\x00\x00\ +\x00\x00Btomlong\x00\x00\x00`\x00\x00\ +\x00\x00Rghtlong\x00\x00\x00`\x00\x00\ +\x00\x03urlTEXT\x00\x00\x00\x01\x00\x00\x00\ +\x00\x00\x00nullTEXT\x00\x00\x00\x01\x00\ +\x00\x00\x00\x00\x00MsgeTEXT\x00\x00\x00\ +\x01\x00\x00\x00\x00\x00\x06altTagTEX\ +T\x00\x00\x00\x01\x00\x00\x00\x00\x00\x0ecellT\ +extIsHTMLbool\x01\x00\x00\ +\x00\x08cellTextTEXT\x00\x00\ +\x00\x01\x00\x00\x00\x00\x00\x09horzAlig\ +nenum\x00\x00\x00\x0fESliceH\ +orzAlign\x00\x00\x00\x07defa\ +ult\x00\x00\x00\x09vertAlign\ +enum\x00\x00\x00\x0fESliceVe\ +rtAlign\x00\x00\x00\x07defau\ +lt\x00\x00\x00\x0bbgColorTyp\ +eenum\x00\x00\x00\x11ESliceB\ +GColorType\x00\x00\x00\x00No\ +ne\x00\x00\x00\x09topOutsetl\ +ong\x00\x00\x00\x00\x00\x00\x00\x0aleftO\ +utsetlong\x00\x00\x00\x00\x00\x00\x00\ +\x0cbottomOutsetlon\ +g\x00\x00\x00\x00\x00\x00\x00\x0brightOu\ +tsetlong\x00\x00\x00\x00\x008BI\ +M\x04(\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x02?\xf0\x00\ +\x00\x00\x00\x00\x008BIM\x04\x14\x00\x00\x00\x00\x00\ +\x04\x00\x00\x00\x0d8BIM\x04\x0c\x00\x00\x00\x00\x03\ +\xfb\x00\x00\x00\x01\x00\x00\x000\x00\x00\x000\x00\x00\x00\ +\x90\x00\x00\x1b\x00\x00\x00\x03\xdf\x00\x18\x00\x01\xff\xd8\xff\ +\xed\x00\x0cAdobe_CM\x00\x01\xff\xee\x00\ +\x0eAdobe\x00d\x80\x00\x00\x00\x01\xff\xdb\x00\ +\x84\x00\x0c\x08\x08\x08\x09\x08\x0c\x09\x09\x0c\x11\x0b\x0a\x0b\ +\x11\x15\x0f\x0c\x0c\x0f\x15\x18\x13\x13\x15\x13\x13\x18\x11\x0c\ +\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x01\x0d\x0b\x0b\x0d\x0e\x0d\x10\x0e\x0e\x10\x14\x0e\x0e\ +\x0e\x14\x14\x0e\x0e\x0e\x0e\x14\x11\x0c\x0c\x0c\x0c\x0c\x11\x11\ +\x0c\x0c\x0c\x0c\x0c\x0c\x11\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ +\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x000\x000\x03\x01\x22\x00\ +\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\x00\x03\xff\xc4\x01?\ +\x00\x00\x01\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\ +\x00\x03\x00\x01\x02\x04\x05\x06\x07\x08\x09\x0a\x0b\x01\x00\x01\ +\x05\x01\x01\x01\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\ +\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x10\x00\x01\x04\x01\x03\ +\x02\x04\x02\x05\x07\x06\x08\x05\x03\x0c3\x01\x00\x02\x11\x03\ +\x04!\x121\x05AQa\x13\x22q\x812\x06\x14\x91\ +\xa1\xb1B#$\x15R\xc1b34r\x82\xd1C\x07\ +%\x92S\xf0\xe1\xf1cs5\x16\xa2\xb2\x83&D\x93\ +TdE\xc2\xa3t6\x17\xd2U\xe2e\xf2\xb3\x84\xc3\ +\xd3u\xe3\xf3F'\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\xf4\xa5\ +\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6\ +7GWgw\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x11\x00\x02\ +\x02\x01\x02\x04\x04\x03\x04\x05\x06\x07\x07\x06\x055\x01\x00\ +\x02\x11\x03!1\x12\x04AQaq\x22\x13\x052\x81\ +\x91\x14\xa1\xb1B#\xc1R\xd1\xf03$b\xe1r\x82\ +\x92CS\x15cs4\xf1%\x06\x16\xa2\xb2\x83\x07&\ +5\xc2\xd2D\x93T\xa3\x17dEU6te\xe2\xf2\ +\xb3\x84\xc3\xd3u\xe3\xf3F\x94\xa4\x85\xb4\x95\xc4\xd4\xe4\ +\xf4\xa5\xb5\xc5\xd5\xe5\xf5Vfv\x86\x96\xa6\xb6\xc6\xd6\ +\xe6\xf6'7GWgw\x87\x97\xa7\xb7\xc7\xff\xda\x00\ +\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\x00\xf4<\xdc\xcc\x96\ +d\x9a\xa9;@\x80\x00\x00\x92O\xc6P\xfd~\xab\xe0\ +\xff\x00\xfbl\x7f\xe4R\xc9\xff\x00\x95\x1b\xfdz\xff\x00\ +\xef\xabN\xd79\x95\xb9\xcdi{\x9a\x09\x0d\x1c\x92\x92\ +\x9c\xa7e\xf5\x16}79\xb3\xc6\xe6\xb4~V\xa7n\ +OSp\x96\x978\x1e\xe1\x80\x8f\xc1\xaa\xc6.\x0bl\ +g\xaf\x96\xd2\xfb\xac\xd4\xee\x9d\x07a\xb53\xea\x18Y\ +5>\x92EW81\xec\x99\x12x))\x0f\xaf\xd5\ +|\x1f\xfe`\xff\x00\xc8\xa2`fdY\x91\xe9Zw\ +\x02\x0f \x02\x08\xfe\xaa\xd2Y\x18?\xf2\x81\xff\x00\xae\ +~T\x94\xff\x00\xff\xd0\xef\xf2\x7f\xe5F\xff\x00^\xbf\ +\xfb\xea\xd0\xc9\xca\xaf\x19\xa0\xbeIq\x86\xb5\xa2IY\ +\xf9?\xf2\xa3\x7f\xaf_\xfd\xf5Y\xea\x9e\xd6Soz\ +\xec\x07\xe5\xfe\xa1%-\xf6\xfb\xdd\xfc\xde+\xcf\x81v\ +\x9f\xc1\x0a\xe6\xf5\x0b\x9c\xcb\x9f[X)\x975\xa4\xce\ +\xbc\xce\x9f\x05k<\xde1\x9c\xeaL\x11\xab\x88\xe7h\ +\xfa[R\xc1u\x96b5\xd6\x9d\xc5\xd3\x07\xbcN\x9b\ +\x92S\x01E\x01L\x01\ +R\x01Y\x01`\x01g\x01n\x01u\x01|\x01\x83\x01\ +\x8b\x01\x92\x01\x9a\x01\xa1\x01\xa9\x01\xb1\x01\xb9\x01\xc1\x01\ +\xc9\x01\xd1\x01\xd9\x01\xe1\x01\xe9\x01\xf2\x01\xfa\x02\x03\x02\ +\x0c\x02\x14\x02\x1d\x02&\x02/\x028\x02A\x02K\x02\ +T\x02]\x02g\x02q\x02z\x02\x84\x02\x8e\x02\x98\x02\ +\xa2\x02\xac\x02\xb6\x02\xc1\x02\xcb\x02\xd5\x02\xe0\x02\xeb\x02\ +\xf5\x03\x00\x03\x0b\x03\x16\x03!\x03-\x038\x03C\x03\ +O\x03Z\x03f\x03r\x03~\x03\x8a\x03\x96\x03\xa2\x03\ +\xae\x03\xba\x03\xc7\x03\xd3\x03\xe0\x03\xec\x03\xf9\x04\x06\x04\ +\x13\x04 \x04-\x04;\x04H\x04U\x04c\x04q\x04\ +~\x04\x8c\x04\x9a\x04\xa8\x04\xb6\x04\xc4\x04\xd3\x04\xe1\x04\ +\xf0\x04\xfe\x05\x0d\x05\x1c\x05+\x05:\x05I\x05X\x05\ +g\x05w\x05\x86\x05\x96\x05\xa6\x05\xb5\x05\xc5\x05\xd5\x05\ +\xe5\x05\xf6\x06\x06\x06\x16\x06'\x067\x06H\x06Y\x06\ +j\x06{\x06\x8c\x06\x9d\x06\xaf\x06\xc0\x06\xd1\x06\xe3\x06\ +\xf5\x07\x07\x07\x19\x07+\x07=\x07O\x07a\x07t\x07\ +\x86\x07\x99\x07\xac\x07\xbf\x07\xd2\x07\xe5\x07\xf8\x08\x0b\x08\ +\x1f\x082\x08F\x08Z\x08n\x08\x82\x08\x96\x08\xaa\x08\ +\xbe\x08\xd2\x08\xe7\x08\xfb\x09\x10\x09%\x09:\x09O\x09\ +d\x09y\x09\x8f\x09\xa4\x09\xba\x09\xcf\x09\xe5\x09\xfb\x0a\ +\x11\x0a'\x0a=\x0aT\x0aj\x0a\x81\x0a\x98\x0a\xae\x0a\ +\xc5\x0a\xdc\x0a\xf3\x0b\x0b\x0b\x22\x0b9\x0bQ\x0bi\x0b\ +\x80\x0b\x98\x0b\xb0\x0b\xc8\x0b\xe1\x0b\xf9\x0c\x12\x0c*\x0c\ +C\x0c\x5c\x0cu\x0c\x8e\x0c\xa7\x0c\xc0\x0c\xd9\x0c\xf3\x0d\ +\x0d\x0d&\x0d@\x0dZ\x0dt\x0d\x8e\x0d\xa9\x0d\xc3\x0d\ +\xde\x0d\xf8\x0e\x13\x0e.\x0eI\x0ed\x0e\x7f\x0e\x9b\x0e\ +\xb6\x0e\xd2\x0e\xee\x0f\x09\x0f%\x0fA\x0f^\x0fz\x0f\ +\x96\x0f\xb3\x0f\xcf\x0f\xec\x10\x09\x10&\x10C\x10a\x10\ +~\x10\x9b\x10\xb9\x10\xd7\x10\xf5\x11\x13\x111\x11O\x11\ +m\x11\x8c\x11\xaa\x11\xc9\x11\xe8\x12\x07\x12&\x12E\x12\ +d\x12\x84\x12\xa3\x12\xc3\x12\xe3\x13\x03\x13#\x13C\x13\ +c\x13\x83\x13\xa4\x13\xc5\x13\xe5\x14\x06\x14'\x14I\x14\ +j\x14\x8b\x14\xad\x14\xce\x14\xf0\x15\x12\x154\x15V\x15\ +x\x15\x9b\x15\xbd\x15\xe0\x16\x03\x16&\x16I\x16l\x16\ +\x8f\x16\xb2\x16\xd6\x16\xfa\x17\x1d\x17A\x17e\x17\x89\x17\ +\xae\x17\xd2\x17\xf7\x18\x1b\x18@\x18e\x18\x8a\x18\xaf\x18\ +\xd5\x18\xfa\x19 \x19E\x19k\x19\x91\x19\xb7\x19\xdd\x1a\ +\x04\x1a*\x1aQ\x1aw\x1a\x9e\x1a\xc5\x1a\xec\x1b\x14\x1b\ +;\x1bc\x1b\x8a\x1b\xb2\x1b\xda\x1c\x02\x1c*\x1cR\x1c\ +{\x1c\xa3\x1c\xcc\x1c\xf5\x1d\x1e\x1dG\x1dp\x1d\x99\x1d\ +\xc3\x1d\xec\x1e\x16\x1e@\x1ej\x1e\x94\x1e\xbe\x1e\xe9\x1f\ +\x13\x1f>\x1fi\x1f\x94\x1f\xbf\x1f\xea \x15 A \ +l \x98 \xc4 \xf0!\x1c!H!u!\xa1!\ +\xce!\xfb\x22'\x22U\x22\x82\x22\xaf\x22\xdd#\x0a#\ +8#f#\x94#\xc2#\xf0$\x1f$M$|$\ +\xab$\xda%\x09%8%h%\x97%\xc7%\xf7&\ +'&W&\x87&\xb7&\xe8'\x18'I'z'\ +\xab'\xdc(\x0d(?(q(\xa2(\xd4)\x06)\ +8)k)\x9d)\xd0*\x02*5*h*\x9b*\ +\xcf+\x02+6+i+\x9d+\xd1,\x05,9,\ +n,\xa2,\xd7-\x0c-A-v-\xab-\xe1.\ +\x16.L.\x82.\xb7.\xee/$/Z/\x91/\ +\xc7/\xfe050l0\xa40\xdb1\x121J1\ +\x821\xba1\xf22*2c2\x9b2\xd43\x0d3\ +F3\x7f3\xb83\xf14+4e4\x9e4\xd85\ +\x135M5\x875\xc25\xfd676r6\xae6\ +\xe97$7`7\x9c7\xd78\x148P8\x8c8\ +\xc89\x059B9\x7f9\xbc9\xf9:6:t:\ +\xb2:\xef;-;k;\xaa;\xe8<' >`>\ +\xa0>\xe0?!?a?\xa2?\xe2@#@d@\ +\xa6@\xe7A)AjA\xacA\xeeB0BrB\ +\xb5B\xf7C:C}C\xc0D\x03DGD\x8aD\ +\xceE\x12EUE\x9aE\xdeF\x22FgF\xabF\ +\xf0G5G{G\xc0H\x05HKH\x91H\xd7I\ +\x1dIcI\xa9I\xf0J7J}J\xc4K\x0cK\ +SK\x9aK\xe2L*LrL\xbaM\x02MJM\ +\x93M\xdcN%NnN\xb7O\x00OIO\x93O\ +\xddP'PqP\xbbQ\x06QPQ\x9bQ\xe6R\ +1R|R\xc7S\x13S_S\xaaS\xf6TBT\ +\x8fT\xdbU(UuU\xc2V\x0fV\x5cV\xa9V\ +\xf7WDW\x92W\xe0X/X}X\xcbY\x1aY\ +iY\xb8Z\x07ZVZ\xa6Z\xf5[E[\x95[\ +\xe5\x5c5\x5c\x86\x5c\xd6]']x]\xc9^\x1a^\ +l^\xbd_\x0f_a_\xb3`\x05`W`\xaa`\ +\xfcaOa\xa2a\xf5bIb\x9cb\xf0cCc\ +\x97c\xebd@d\x94d\xe9e=e\x92e\xe7f\ +=f\x92f\xe8g=g\x93g\xe9h?h\x96h\ +\xeciCi\x9ai\xf1jHj\x9fj\xf7kOk\ +\xa7k\xfflWl\xafm\x08m`m\xb9n\x12n\ +kn\xc4o\x1eoxo\xd1p+p\x86p\xe0q\ +:q\x95q\xf0rKr\xa6s\x01s]s\xb8t\ +\x14tpt\xccu(u\x85u\xe1v>v\x9bv\ +\xf8wVw\xb3x\x11xnx\xccy*y\x89y\ +\xe7zFz\xa5{\x04{c{\xc2|!|\x81|\ +\xe1}A}\xa1~\x01~b~\xc2\x7f#\x7f\x84\x7f\ +\xe5\x80G\x80\xa8\x81\x0a\x81k\x81\xcd\x820\x82\x92\x82\ +\xf4\x83W\x83\xba\x84\x1d\x84\x80\x84\xe3\x85G\x85\xab\x86\ +\x0e\x86r\x86\xd7\x87;\x87\x9f\x88\x04\x88i\x88\xce\x89\ +3\x89\x99\x89\xfe\x8ad\x8a\xca\x8b0\x8b\x96\x8b\xfc\x8c\ +c\x8c\xca\x8d1\x8d\x98\x8d\xff\x8ef\x8e\xce\x8f6\x8f\ +\x9e\x90\x06\x90n\x90\xd6\x91?\x91\xa8\x92\x11\x92z\x92\ +\xe3\x93M\x93\xb6\x94 \x94\x8a\x94\xf4\x95_\x95\xc9\x96\ +4\x96\x9f\x97\x0a\x97u\x97\xe0\x98L\x98\xb8\x99$\x99\ +\x90\x99\xfc\x9ah\x9a\xd5\x9bB\x9b\xaf\x9c\x1c\x9c\x89\x9c\ +\xf7\x9dd\x9d\xd2\x9e@\x9e\xae\x9f\x1d\x9f\x8b\x9f\xfa\xa0\ +i\xa0\xd8\xa1G\xa1\xb6\xa2&\xa2\x96\xa3\x06\xa3v\xa3\ +\xe6\xa4V\xa4\xc7\xa58\xa5\xa9\xa6\x1a\xa6\x8b\xa6\xfd\xa7\ +n\xa7\xe0\xa8R\xa8\xc4\xa97\xa9\xa9\xaa\x1c\xaa\x8f\xab\ +\x02\xabu\xab\xe9\xac\x5c\xac\xd0\xadD\xad\xb8\xae-\xae\ +\xa1\xaf\x16\xaf\x8b\xb0\x00\xb0u\xb0\xea\xb1`\xb1\xd6\xb2\ +K\xb2\xc2\xb38\xb3\xae\xb4%\xb4\x9c\xb5\x13\xb5\x8a\xb6\ +\x01\xb6y\xb6\xf0\xb7h\xb7\xe0\xb8Y\xb8\xd1\xb9J\xb9\ +\xc2\xba;\xba\xb5\xbb.\xbb\xa7\xbc!\xbc\x9b\xbd\x15\xbd\ +\x8f\xbe\x0a\xbe\x84\xbe\xff\xbfz\xbf\xf5\xc0p\xc0\xec\xc1\ +g\xc1\xe3\xc2_\xc2\xdb\xc3X\xc3\xd4\xc4Q\xc4\xce\xc5\ +K\xc5\xc8\xc6F\xc6\xc3\xc7A\xc7\xbf\xc8=\xc8\xbc\xc9\ +:\xc9\xb9\xca8\xca\xb7\xcb6\xcb\xb6\xcc5\xcc\xb5\xcd\ +5\xcd\xb5\xce6\xce\xb6\xcf7\xcf\xb8\xd09\xd0\xba\xd1\ +<\xd1\xbe\xd2?\xd2\xc1\xd3D\xd3\xc6\xd4I\xd4\xcb\xd5\ +N\xd5\xd1\xd6U\xd6\xd8\xd7\x5c\xd7\xe0\xd8d\xd8\xe8\xd9\ +l\xd9\xf1\xdav\xda\xfb\xdb\x80\xdc\x05\xdc\x8a\xdd\x10\xdd\ +\x96\xde\x1c\xde\xa2\xdf)\xdf\xaf\xe06\xe0\xbd\xe1D\xe1\ +\xcc\xe2S\xe2\xdb\xe3c\xe3\xeb\xe4s\xe4\xfc\xe5\x84\xe6\ +\x0d\xe6\x96\xe7\x1f\xe7\xa9\xe82\xe8\xbc\xe9F\xe9\xd0\xea\ +[\xea\xe5\xebp\xeb\xfb\xec\x86\xed\x11\xed\x9c\xee(\xee\ +\xb4\xef@\xef\xcc\xf0X\xf0\xe5\xf1r\xf1\xff\xf2\x8c\xf3\ +\x19\xf3\xa7\xf44\xf4\xc2\xf5P\xf5\xde\xf6m\xf6\xfb\xf7\ +\x8a\xf8\x19\xf8\xa8\xf98\xf9\xc7\xfaW\xfa\xe7\xfbw\xfc\ +\x07\xfc\x98\xfd)\xfd\xba\xfeK\xfe\xdc\xffm\xff\xff\x80\ +\x00 P8$\x16\x0d\x07\x84BaP\xb8d6\x1d\ +\x0f\x88DbQ8\xa4V-\x17\x8cFcQ\xb8\xe4\ +v=\x1f\x90HdR9$\x96M'\x94JeR\ +\xb9d\xb6]/\x98A\x00\x930(*l\x0c\x9c\x03\ +\x02\x13`P0\x07?\x02?\xe8O\xe8X\x06 \x01\ +\xa4\x00hO\xfa$\x1a\x93H\x82R\xdf\xf0J}J\ +\x06\xff\xa4\x80\xa9t\xd0\x05\x1a\x07U\xa5\xd5\xeb\xf4\xfa\ +\x8d\x86\x05S\x81S\xe9VhK\xfc\x05o\x01\xd5\xaa\ +\xf6\xca\x8d~\x0fh\xb4\xd2\x00P\x8a\x95\x92\xefK\xb0\ +P\xacW\x9aM\xca\x9dI\xbe]05\xca\xf0\x02\x98\ +\xfe\xc8>\xf2O\xa7\xa6U\xe2\xf3\xcc<2O\xb7\xce\ +\x1aSO\x07\xe8Bcm!\x10\x87\xa7)\x89\xb5C\ +\x00v\xb4#?\x01\x81*\x98\x88]\xf7i\x87\xa4g\ +\xb18+\x1e\xe7\x01\xb7\x8e\xed\xaa\x17:\x15\xfa\x0d\xba\ +\xde\xda\xf7\x98Ln;\x7f\xbe\xe2\xf0!\x99\xec\x0d\xe2\ +\xbbj\xe8T\xab\x18^\x7f6\x9f\x90\xc8uz\xbb>\ +\xcf\x81\xfc\xf8\xf4=\x9c\xbe\xb6\xf3#\xdc\xbaa|V\ +N\x0f\xa3c6\xfa\x94\x04\xbfAb\xcf\xf4\xe0)\xc0\ +\x03:r\x08-\xebzc\x03\xc1\x10L\x15\x05>\xe6\ +\x94\x1cc\x13p\x89\x04h\xc2\x86+\xee\x90\x00\xd0\xc8\ +\x10(C\x83 \xdb\x0f\x91\x00LD\x05\xc1q,M\ +\x13\xc5\x09B\xa4fE\x85\xf9\x17\x17\x8d\xa6\xfcdk\ +\xb9\x08\xb0;\x1b\x84\x84LtV5A0_\x14\xc8\ +\x12\x0c\x85!\xa2\xe7\xd4\x8c|\x93RI\x00SI\x84\ +|\x8c}\x1f(\xc4\x0a\x01\x07\xb2\xa8\x9aCK\x058\ +\x0f-\x812$\xbd/\xcc\x13\x0a\x04gL\x86\x08\xed\ +3\x8a\x87\x84\xd4v#\x09\x98\x08\x02\x8a\xf3\x88\xda7\ +\xce\x84\x5c\xa71O\x13\xcc\xf5\x03\x9d\x13\xe9\xc44P\ +\x02\x11\xc9A\x9b\xa8\xc42\x03\x01\x03-\x14?\x0c\x14\ +h\xf0\xe3Ot\x8d%I\xa3\xe7\x95,w\x0c\x94\xc8\ +|oS\x86\xad\x0d\x0d\x0d\x95\x09\x0e\xfe\x8b#}!\ +JU\x15MT\x873\x07\x99\xe1E\x0c\xa1\xf1\xb9Y\ +\x9ah\xc4\xb6\x03\x810\xf8\xdaDN\x22\xb8\xdbS\xc4\ +\xae\x13\x9bU\xc8q\xab\xae\xe1\xa1V\x15UV\x9e\x14\ +\xc8\xc8\x1e\x9b\xb6\x89\xa9O\xd1\x03u\xacD\xd7\xb5\xfb\ +\xa4\x89\xaaF\xdd\xbch\x9e\xb7\x09\xe6\xea\xcav\x13\xa8\ +\xe0\x1f\xb7I\xfb;\xb8\x8e\xdb\xb2\xf29Wr\xd4\x82\ +<\xc8E!C\x81\x17\xc8\x10\x05P\xe0<\xdc\x02\xa0\ +\x97Q\xf8|\xe0\x87\xc6\x08|\x9e\xefA\xf0{C\ +<\x01\x08\x0eli\xb9\xd4\xf2k@p\x12xa\xfd\ +\xfd\x06\xe5&+\xe0\x80\x9b\x12\xf0L>\x8e\xe8,:\ +]\xbb\xe7\x02\x0f\xa5\x17\xbe\xc7\xdc\xfc\x08z\xcc\x80!\ +\x9c 6\x11\xb44V\xa0\x08yn\x89\xcb\x198F\ +\x10\x10p\xd2\x18\xe9\x85\x90\x00\xb0\x1c%!\xc0\xb9p\ +\xa0\xb5\xc3\xb9\xe1\x93\x0f\xc5\xda\xba\x09\x0b\xd5T\xc1\xa0\ +(\x22\xa2@\xadw\xc0\xc8\x1f8\x86J\xf0\xc1\xfc&\ +\x85\x0eA\xfc*(\x1b\x08\x08s\xd0QOI\xea&\ +\x10\xef\x17\xc4\xa8U\x8cA\xa8\x8c\x0c\xb9\x5c\ +/b!\x16_\xf1,\x1f8\xa0\xc6\x1f#\xb83\x08\ +\x04`O\xcb\xd1\x0e%f\x00zRq\x19\xf5\x0a\xe0\ +c1\xc1\xe9\x1c\x5c#\xd4yK`y%\x1f\xbb.\ +\x8a\xcc\xceM\x10\xb6n?\x07\xdb\xd1\x93\xc9\x00\x12M\ +\xd0Z('\x00\xc8_@(\x88\x0bi\xcc)\x04,\ +\xe9\x0c\xcc\x1c{\x92\x84\xa6\x16\xa7\x80qZ\xc1\xb8D\ +\xb6\xe2\x1e\xa5\x87\x90\xef\x0a\x93\xec\x14Aa\xdc:\x93\ +\xd3\xb9wb\xb2Z<\x133$\xdf\xb4T\x013\xcd\ +l'(Z>\xc7\xd3\xd1zcQ\xea\xa2\x91%E\ +\xc5\xb0:\xa3A$\x88\x0b\xaa<*C\xfd!\x0b\xc8\ +]\x04\x1a@l\x10\xc4\x1d)\x14\x80N\x96\x01\x82 \ +-)\x80\xa1\x10\x14\xcc0P\x17\x01!El\xc7\x06\ +3&H\x99\x96N\xe3\x5c|\x96yH\x82L\xbf\xd7\ +\x9ed\xe2\x84\xdbD\xa0Z\xa6\x01\xb9\x04+F\xcb\xdc\ +!\x83\xaa\xaa\x0eEH\x0c\x07\x8dY\x1d\xa9\x00\x17U\ +\xd0t\x92D\xd0\xc0_\xf2l\xc9\xab\xd0X8\xab@\ +\xdbL3\x12\x0e\xd3\xaaxF\x9f\x94P\x8aSE\xc9\ +B\xc275\xc7\xdb'\xa2tU\x05\xa8\x00\xd0 \x96\ +p}\x22\x09`C\x06\x81]a\xc4\xcaa\x0eV,\ +G\xcf\x00\xb4\x1c\x08\x84\xe0\x14\x02\x22\x1c\x09@\xf2\x98\ +]\xcd8\xad\xd4\x19WP\x86U4^\x5c\x0d#\x8f\ +\xfe(W\xb4\x13\x22\xaax\xd8w$2\x7f\x0e\xa48\ +\x14\x01 \xf6\xb6C\xcd0\xaf\x81Om\xc6\x80\x1f\xb7\ +@\x9c\x86\x0ek|8\x02\xb5\xc1\x05l({$H\ +\x8df\xa6D\xd5!P\x8a\x01W2.\xbe-\x0c\xd4\ +\xa8\xc4BN-+\x1bLK\xc9\ +\xc8\x0f\x15x\x0ck\x01\x5c\x0c\x06\x8e\x99Kd\xe8P\ +h\x8cU&~\x80\x90\x17\x15\x98Lk\xc0\x80\x22C\ +\x22\xf8w\x0a\xa2\xf7\x0e\x0a\xcb\x8c\xfa$`\x8c\x15\xef\ +\xb4\x18\x03\xc8\x9c'\xc8\x90\xe8\x12;\ +\xa0\xa4ne\xcc\xd7\x17}\xea\x12\xb8\xa1\x97\x04+\x06\ +\xcb\x94B_\xfc/\xba\xe4\xb4\xa7\xe0`*\x06\xb28\ +*\x06\xb688H\xf2\x09<\xc2P\xc6\xceB\xdd\xdb\ +\x88\xdc\xec,\x1a\x90?\x09\xe41\xf5\x06\xe1S\x9f\xc4\ +\x9d\xf0\xa6\xf7\xcadbw\xa3\x19\xab\xa2\xa2\xae\xc4j\ +\xea\xb9\xa78\x91)0C\xa4\xc1\x12\xb0\x08\x07\xfe\xed\ +\xe8\xb8\x92\xa34o>\x22\xfc\xfd\xa04\x13\xa8\xb9\x14\ +\xefCE\xbd\x11B\x9f\xcd\xd2\xc5\xc4P\xfb\xc2\xf8c\ +\x0c\xdf*\x91e\xb6\xdcS\x8d\x16\xb0\x07\x81)\x0c\x10\ +Z\xec1\x8b-|'\xb5\x08\x15\x98\xa0\xbfb\x03\xbc\ +\xbeB$\x94[\xcb\x04U|P\xcbDF\xef\xec\x5c\ +\xa2\x9a\xc5H\xc3\xb0p'\xb6\xc0\xc6\x90\x01\xd7n\x05\ +&\xce/\xc5~\x1f\x83s\x17\x12>\xfb\xf6C\xab\x8b\ +\x99\xb9\xd9e\x5c\xe2\xc5}\xb1\xc8>\x8d\xcc{Q1\ +8 \xf8&\xedxd\xbd&@~\xbdp\xbc\x0d\x86\ +\xc7\x01\x19\xdb\x8a#\xc4\x9c\xa7\x5c\x0c\xb6\x87[\xcf\x22\ +\xfcn\xe5\xb5\xaa\xc8\x9e\xf2\xd1\xfb\xd101\xd0D\x0a\ +\x85'\x19\x19\xcb\xf4\x86)\xc1\xbc5\xa5\x08[\x064\ +\x91!\x5c~\x0c\xef\xa2m\xf4\xe1:\x9b\x85\xe2\xb5w\ +Qx\x81\x12\xd5\xb0\x0bW\xf1D\xc1b\xc3\x90\x8e\xb1\ +\xc1\xc4\x88V\x01\x03\xa5k[\xe8\x98\xb7\xcc\x8deV\ +O\xa9\xf7f[\xb89{s\x90\xdeg\x099\xaf6\ +H+\xf7\x09\x8a\xc1\xb0\x06\xba\xc0 !\x91\xb8u\x8e\ +`\xbb\xd7\xc1\xa0\xec\xecC\x9e\xcc8\x0a\x07\xc1\xc8\xce\ +\xe9x\x9b\xaff!\xa0\xe1\xdb\xc4\x5cb\x0a\xa1\xafx\ +\x10n%\x01z\x92A\x06\xbd\xec!J\xb1,/$\ +\x02\xcc\x1c>\x0cl\xa54\xfa:\x07\x18\xc1\xf1B\xc4\ +Z\xf8\xd1D\x89\xb2\x88\x89\x15\x95\xbb\xba\x90W\x84\xe6\ +zA\x15\x92\xfc;\xca\x90N\xef'\xfb\xc9!'\x80\ +1\xd3\x81h\xe8\x06\xc1\x08\x1c\xf5@\x90\x0cz\xd0;\ +K\x00\x98\x18\xa7@\xfb[\xeb\x92F{\x86@\xba\xc4\ +!\xbc\xfa\x0e\x01\xb0L90\x8a\x89\x5c\xa2\xce*\xfd\ +\x95BH\xb2\xf8rY\xb2\x87\x8f\xad\x5c\x83\xb5\x87\xa1\ +!$\xf0\x06\xd4\xcfM\xd6\x00\xd0 \xd6\xe0\x98\x10\xfd\ +\xd0R\x8d\xc0\xe8$\xf5@p\x11\xfaZ\xa4\x8ac0\ +a\xfd@\xe6\xe2\x12\xc7r\x22?\x80\xaa\x91\xfet\x81\ +\xcf\x81\xdf\x0b\xfc\xc9\x14e\xbd+.\xffB\x04\x7f\xea\ +\xfc\x08.\xa2K\xe4\xa6kbr\x01\x80\x1e\x02\xf0\x14\ +\x03\xac \x02\xd0\x1a\xf6\x001\x01@.\x03\xabt\x03\ +\xe0O\x02@:i\xe0(\x03.8\xda\x8d\xb8\x0e\xad\ +\xbcm\x02X\xad\x87\xd6\xe8\x822\xf2\xe7\x88\xff\x22&\ +\xf3ev\xd9\xed\x18\xa9\x09:\xe2b\x5c_\xec\xd2\x06\ +\x8f\xc6\x04\x88\xf4\x04`W\x02\xa0N\xf4\xe0D4 \ +\x1e\x02E\xf4\x86\xc3\x5c\xfaB4\x16p\x90\x14\x01\x03\ +\x09`\xc3\x04g\xd0\xa7\x0e\xd0#\x0b\xea~\x8d\x96\xff\ +G\x22\x9ag\xf6\xff\xc0\x00\xf3\xe2P\xc7@\x1a\x02\x0e\ +\xe4\x0d`\x89\x0c`\xaaG\xa4\x7f\x08\xc2(\xaf\x0b\x88\ +ua\xd8\xc2\xc9\x14!\x84\xc8\x19\xc1\x84\x8a\x10\x9c\x83\ +p\xa0\xf8\x8azU\xca~ZM\x12f\x08\xae\xe9\xaa\ +\xc8\xa2\x0a$\xc6BD\xfc\x00H\xce\xc1\x1a\x16\x0e,\ +\x05p\xd0`KZ\xf0\xe1\xc4\xf7\xa1\xb0\xad\x01\xc4\x1b\ +O\x06\x1c!\xb2\xeb\x81\xcc~O\xecY\x80\xf1\x13\xe1\ +*\x09\xd1D\x0cB\x18\x1d1L\x1cez\x05\xa7\xe4\ +%\x0b\xe2\xf8PL#\x0e\x8c~\x90T\x22PX\x11\ +\x10\x5c#0\xb8#\xe5\xfe\x13\x91x\x18`Y\x17\xe0\ +nRf\xbe\x1d\xf1\x88\x1dc\xd6\x1c\xa1\xbc\x1cq\x94\ +\x1b\x8e<\x1a\xd1$\x1c\xf1\xa0\x1c1 \xb6A\xec\xb6\ +\x826\x9ea\x14\xdf\xc0\xea!\x87\xfe\x7f@]\x12\x81\ +\xb4%\x08\x8c\xc4,F}\xc9\x94\x5c!\xe4\xe8\xeeZ\ +\xa1O\xf8\xe9\x8eb\xa8\xea \xf9\xe8d$\x00\x9b\x1e\ +\xa0\xc0\xa4 \xfe\x13\xe2`<\xca\xb2\x1e!\xdb\x14\xc1\ +\xd2\x1cq\xc1\x12\x81\xb6mA\xda\x1d\x11\xfa\x1d\xc7V\ +\xeb\xab~\x9f\xc1\xd3\x1a\x81\xe8A,\xb8\x0dk\xc2\x12\ +\x82 N\x80\xde\x09a\x8b#al%\x10\x80\x02q\ +\xc9\x15\xe2.~N\x14x\xee\x5cy\x8d\xdf\x10\x02\x16\ +\xda+\xfe#\xd1\xc8j\xa0\x80\x0a\x020`Q\x88\x1d\ +\xf2\x18\x1c\xc1\xc0Pa\xc8q\xa7\x1d\x19A\xc6\x1br\ +t\x1b\xb1 \xfe\xc7n\xd2n\xfc\x17b \x11\xd2\x94\ +\x0e$\x98\x14\xcb\xd0$\xf1Z\x15\xad\xcb\x0bRH\xe5\ +\x92L\xe1\xae^\xc5\xa5\x86\xe20`\xba\xd0d#\xaa\ +\xc0\x180\xa2 \xf2j\x1daK,\xe1\x1c\x8c\xd1\xa0\ +\x1c\xe1\xc2\xaa\x81\xd4\x1c\x91W\x0d\x02\x16\xfc`F\x15\ +R\xec\x1a\xb0:!J\x9e\x13\x01\x0f/\xa0\xd3\x1cP\ +\x9e\xe4\xe8\x98\xf8\xa8\xa1\x16b#\x16\xaea+g\xfc\ +H\xec\xc5+\xe29\x09a\x02\x14 \x972`\xbc\xeb\ +h\xdc\x1c\xd3&\x09`<<\x01\xfb.K\x9eCN\ +\xaa\x1a\xef\xb0\xebB\x16E\x81\x98\x17\xea\xfc\x08QX\ +\xec\xcc\xa5\x0f\x024\xd9%c\x0a\xb0V\xa8r\xb3%\ +1\xde\xba\x83'\x10m\xa6#\xef\xd4\x0c \xf2\x0ds\ +\x80\x10\xcd\xf6\x1f\xc1\xfa\xe4 e0\xd3<\x22J\xc0\ +\x18\x0c\xdc!q\x8e\x1b\xd1R\xfd\xa2G\x04\x88<\xc4\ +\xb0\xb5\x16%\x9f9\x02\x1f1\x12\xb4#\x11r#\xc0\ +}< \x9b)A\x1c\x16B \xc3,6\xc3\xa4\x12\ +\x91\xe0\x8b=\xa0\xac\xf4\xe0C\x0d\x81\xa1>a\x88\x16\ +\xf3\xec\x14\xa1\xef?!\xea%\x91>\x0f\x01,\x9f`\ +\xa9/\xe2\x16k\xe7\xf4\x05\xf1\xc0$\x92\xa3*rT\ +\xb9c30\xb1\xd6\xdd\x8dS\x0b4\x16!3\xbe#\ +\xa0KB\xe0],\xe1J\x19\xe6\x1e!!'C\xe0\ +\xf0\x144D\x11\x22X_\x0b\xcc\x0ea\x1e\x0a4T\ +\x0c\xd4:!\x08b\x18\xc0\xfdF \xbd(\x22P\xe4\ +)F\x94\xa2 \x0dTt\x08\x81\x95G\xa1z$\x8f\ +\x82\xf8s\x07\x0f!\xe1A\xd2\xae\xe9%\xae\xcb\x91\xdd\ +1Q\xe0\xa2(\xb7%\xa2;\x0b\xc0 \xb5, \x02\ +\xe2\x18\x9c\xc1l\x14tb\x0f\xd3*$\xe2\x9e\x98\xb2\ +a&B/\x12\x14N\x0a\x01\xb3L\xe1\x9e$\x8a4\ +\x07@\x90\xd3,\xe8!\xef\xe0\x11\x00\xd4\xea\xa1/A\ +\x0d\x07\x15\xcd\x0a\xe5FK$\xae\x18\xdd\x8b\xa2\x7fo\ +\x9a\xa93\x1c#\xec\x88\x14L\x8c\xc9\x02\x18\x93\xd3z\ +\x07\x22P\x91\xf3\x96$\x0c\xe4\x18\xc1p\x9ej8$\ +px\xcf\xe1R\x1aj\xc6!k$\xb2\x88p\xb2\xe2\ +F\xf2*\x095\xd0OA\xaf1A\xef56\x91l\ +fo\x9b7J\xf8$+\x08\x14\xe0\x8dV`\xb0\xaa\ +j\xab@\x00U\x1a\x91\xac$Jf\x10\x01@\x09\x95\ +\x80\x0b\xe2@\xecA\xd8\x1c\xf4T\x0a K?!\xef\ +?b>\xf4n\xaa\x1b\x0f\xac\x03b\x18\xd7\xc1d\x13\ +\xcdv\x10@\xc7H\x13\x02\x11UF\x06I!5\xea\ +\x0e\xf8\xeb?+\x12P\xe1\xf4\x997\x0a!PN\xf0\ +$il\x0f\x80\xd3]\xe1\x06!\x8b\x88\xee@U-\ +a\xc2$\x95\x0bP\xe0T\xc9\x22>k\xee\xe4\x05s\ +\x9e$\x91x\x13\x81\x86\xdc\xa2\x18\x18v\x10\x16\x89H\ +\x0e \x9a$\x92>}T\x85[\xee\xd2\xe5ec;\ +B\x1d;\x93m\x5c\xeb\xf974\x9f\x10\x82CV`\ +\x8c\x0a\xeb\x08\x15\x13\x878\xa9C8\xf5P$\x13\x97\ +9\xa2=\x22\x0c\xb8\x05q $\x95{W\xf5\x82!\ +\x88\xd0\x1a\xc1\x98\x0b\xf6t\x06\xc6$\x22\xf4\x83,b\ +-;\x00{b\xc2\x1b\x16\xb1n#\x0a\xf0\x9bU\x06\ +#\xc7@\xe3!H\x19\xb4Z \xf3S4\xc1~$\ +\x8a\xfc\xb0\x052\xb0B?(4\x00\x05*\xf0$\x8e\ +\xbe\x0b\xa0\xe9#\x01\x16\xb5\x88.\xcb\x80Y\x0d\x82A\ +TV\x80\x22\xb3`VO\x91U%p\xbf63;\ +\xd68\xbf\xd6<$\x08\x8c\xb0\xe1\x5c\x1bL,!\x91\ +\xf0\x0b\xef\x1a\x16\xaf\x1e$q\x0d.\xc1T\x1a\xa0\x0b\ +q`\x0c#\x8dh\x121\x10\xb2\x02O< |\x09\ +\xd3\xc8\x16\x22\x18`S\x8d6B5#\xf2CO.\ +\x10d\xab\xedn0\xadno9Bb\x10\xe9\xe8`\ +\xfa\x02HJu\xf2\x05\x17`\x06B\x19P\xa1\x16\xd3\ + \xec%\x12'\x22\xa2(*T\xb0\x14r\xfa\x10\xe0\ +\xd3:BL\xcd kP\xa7l!\xf3\xd0\xc3\x81z\ +\xc3\xc2?A(?u\x02\x0fhV\x88!\x8f\xf6Z\ +\xe5\xb3P0c]bL\x12\x17\xb8\x16\x87H\x07\x80\ +\x96!\x8d\xbe\x15\xf0>\x0aBYL'$\xc6\x80P\ +!\x8a\xf0@\x00\xa6\x05\x16\x02%w\xd4\x15\x17\xe8\x1a\ +U6!K*\x0f5;mt\xee\xa77Abw\ +E\x0a\x97I6wM6\xb5\xcc#\x07\xfez)Q\ +x\xe2M2\x13%2\x82\x18\x8c\xcb\xd6\x0b\x80f\x91\ +\x02V4\xe0\x86\x0a\x87v\x15b!R\x95\x22\x17\x02\ +Y\x02\x0bR\xc0\x22\x19\x09\x01g\x09P\x99oU\xb7\ +\x7f\xcaw*\x83-tu\xc7O\xd7O6\xf67]\ +7\xb2\xf4\x02H\xed\xe0\xe0\x11\x98&\x0eb\x18\xfe\xd5\ +\xe9 \xc1\xd0%\x8a\xdcB!6\x18B!{\x81 \ +\x0e\x96\x9c\x94\xc2Wq`\x0a\x00\xd50\x1a\x8fj!\ +\x8d^\x0cX\xb0\x07XT\xdcj\xdb\x7f\xf0\xa5b\x80\ +}zb\x17z\xa9\xe9IP\xb5\x81(\xb7\x81tj\ +\x94V\x17\x89\xc6\xf2(Vt\x0b\xe0mf\xe1\x98%\ +\x8fk~\x81P\x1aE\xf0!\x96\xf8\x13+\x08\x0d\x02\ +`\x98\x01*\x17@o\x90\xa0\x8bV\xd2\xdfm\x12\xe2\ +#V\x7fT\x98\xbe\x89\xed\xd4\xc5U\xc9h\xe2/B\ +\xa2H\x07\x190\x08\xcb*\x17\x22 \x0f\xb9<\x0b\x93\ +\xec\x16\xe1KD\xa45q\x01\xa9.\x82\x19q\xf7\x22\ +&\x0ep\xb1\xa9\xe1rB\x14`K\x1c\x06*\x80#\ +\x95D\xf2\x97\xa0 \xd2\xabb\xb6S\x80\x8d\xdb\x80\xd8\ +\xcf1\x88\x04\xdeu,\xb7u1SBh!\x8e|\ +\xe8\x02_l6\xc6N\xa2\x10\xfe\xc8\xa1s\x82R\xee\ +@\xd4\xc3!*\x22\x18t\x09\x81\x89\x9b\xa1k\x96\xd7\ +\xfb$V\x83\x1d\x09\x9d\x9a\x82!h\xd5X\xae\xe6q\ +iW\xb4$\xa7\xb9400!\x97\x94\x15\x93\xd0A\ +-'\x83\x00\xa6\x99a\xe7\x84\xc1>FA\xbe\x1a\xe4\ +\x12\x97 \x80\x13:\x09j\xa2\x1fv\xd7h#\x97<\ +\x91\x81_\x9cB+\x97x\xc3\x97\xa2$\xba\x04@\xd1\ +qq+\xad\x1d\x9d\xa2P\x13\xba8\x18\x8d\x88\x05\xe0\ +v!\x8e\x02\x1b\x01\x9dl ig\xb3\x92!sG\ +48\xf6!h \x15\xe16\x9d!\x0a\x0c\xc29:\ +\x94\x15\x86\x8d\xd1\x8c\x18\xc4!Y\xd1P\x0d\xa1\xa3\x19\ +\x88$\xd9<\x0f\xa18\x09\xfa\x8d[\x22\x17\x0d\x95\xe9\ +,\xbaR#\x0bS\x07\x82\x19G\xa1\x94\x17\x94t\x0d\ +Y\x0e#z\x16\xc4Z\x1c\x22\x9a!\xa7b\x12\xd9\xb7\ +\xad;\xb9+n\xed\xa5U\xe2Q\x99\xd6\xc8\xc1\x22\x85\ +\x82`gL\xe1\xb3M:\x9a!E\xfa\x83@+>\ +\x00\xf3\xae\xe1/\x11b\x19\xad\xc1\x9f8\xd9\xc0u\x18\ +6\xf6p\xb5m\xf9\xcd;uU18\x10H\xf0\x03\ +\x00bSr\x97-)W0!\xeb\xc2\x0a\x8b\xbc\x15\ +\xa5TJd\x07JP\xdc5\xa0%\x10\xcf\xb7}S\ +F\xcc\xc04\x86\xa6D\x22x\x17\x8e1\x82#s\xa9\ +\xabb'\xb0\x98\x07\x16\x90\xaef\x1a-n\xca d\ +\xf8\xd4%o\xba\x04 S\x8f\x01\xa46\x03d!n\ +\xfc\x0fm\xb0\x13\xd3\x84D\xa6\x88\xf6\x10%\x02r\xe9\ +\x11r\xe9}P4\x03(\xe4e\xa2`\x14{\xa8\x11\ +\x81#\xba\xf1\xb7\xb5U\xb7[\xb6%\x16\x11\xd1\x8b\x00\ +\xc4\x07yj\xd5\x0d\x14r\x95[c\xb3v%L\x03\ +o\x81\xb3J\xa2\x19S\x01&\xcf\xa28h\x89\xc7J\ +@3\xbe\xe0>\xfbp*\xfb\x8f\xba\x05SG\x03\x14\ +\xa4OE\x998\xcb|\x1c\xc1\xbf\xa6\xb8Wm\xa2(\ +\xb9\x88H\xed\x97J\x9aP\xfc\xd5V4\x8b:\x81i\ +bJ)\xfb\x86\x18\xcd\xac!\x81q\xc3\xa1L\xde\xc0\ +\xb6 \x94\xab\xb9\xfb\xf7}Q\x0d\x07\xdbH\xc2\xc4\x06\ +\xf4n\xf3!\xd4\xcb\xa8\x223m\x99\x1d$x_\x80\ +XcnY\x7f\x5c\xb0\xb5\x92\xc2V\x10\x9c|\x14\xa0\ +\x91\xc8 \xb4!\x95\xec\x80\x81\x8e\xfb{\xee\x03 ?\ +\x0b\xc0#j:\xe2 \x8c\xaa\x8da\x9a\x18\x011\xca\ +\xa0\xfe\xbd\xd5\xb5\x8b\x90K\x8b\xc2/\x05\x07\x8b\xa2S\ +\x0f\xb0\xfa\xc4\x22\xdcx%E\x1a\x0c\x00\xf0r\x5c\x9e\ +!\xb1\x1c\x82\xc1\xd5\x12\x12\x06\xad1\xfa\x1d\xb2\xcb\x0d\ +\x92\x83 \x01\xc7\x0e\xae\x0a\xf8\x5c\x14\x22p\xa6Y\xfb\ +\x0bb\xf5U\x92\x9c\xc9\xac\x94\xa1\x88\x89\x91\x88\xd8\x90\ +\xeaF\xbf\xce\xc5\x07\x191\x94\x1bq%\x19\xb5\xed\x1a\ +kfOY\x1bHu\xc0U\xd4\x8dO\xbcqB'\ +\xf9\xa7\x0e\x9c\x85\xceiu\x82^e\xa1\x1f\xd5!d\ +\xd2dL*P\xd9\xcf\x12\xdc\x1c\xbc\xe7,\xae\xb8\x1c\ +\xb1.\x1b2|\x1b\x92\x0d!\xfd/\x08\xd9n\xb99\ +r \xbc\xfe~\xbcn\x22\x9a\xc0\x9e\x9d\x08\xc5\xf9\xd6\ +\x8b|`%\x9bIZ\xe1D\xcf,\xf6#f\x05\x0d\ +\x91\x8e\x1b\xf3\x9e\xe3\xc1\xab\x12]\xae\xf0\xe1\xc3(\x9c\ +\xd6\x22\xfce\xd3X\x00\x1e4\xf8\x9a1\xdb\xc7}\x0d\ +o$\x10JxzJ\xa0z\x09\xb0\x80\x02I\xae\x1f\ +\x86H\x1e\x11.\x1b]s\x9f\xc1\xad9\xfdc\x91}\ +\xc3\xcfP\xef\xdc\x99\x1e~}\x01\xb5\xfc\xc2\x8a\xbc#\ +B]E\x104\x9do\x1b\xd3\xe0>%0\x087\x1c\ +\x96\x0c\xca\x99\xc8\xca\xfe\x11\x9c\xfc\xc5n\xa2.\xaf\x14\ +\xe2\x0dY\xfc\x1a\xec\x18\xc1\xde'\xe4\xe2D\x07~T\ +\x09S\x80\x0da\x0at\x0cO\x86\x09+\xc7\x14\xfe\x81\ +\xc2>\xaf\x1aP9\xc6\x92b&\xee1C\xb9\xe7b\ +\x18nF\x84cG\x9co\x02\x0b\xe8\xde\x86^E\xce\ +;&\x99\xe7\xddE\xe8\xc6\xf7\xe9\xa2\x85C\xa5\x8d\xe9\ +`\x02_\xf0\xb4 \x9a\xbb\xcc\x1e9\x80\xbcu\xd8>\ +Q\xec.\xa5\xebt\x8e\xed\xa5\xab\xac>=\xec^\xd5\ +\xdc9\xa4s=\x03h\xa4\xb9\xaa\xa1\x09F\xde\xd7\xee\ +\xbe$\xb5\xb3S\xdbE\xa8\x00\xf8&\x0e\x95\xde\x0d!\ +\x07\xeb>\xed\xf0e#\x19\xb20\x09U\xec#\x1b|\ +\x08?\x18\x0a8\x1d\xba_\x09\xf2.l<\xdc:\x17\ +\x01L\x90\xa0\xd9\xe0\x06&)/\xb7\xda\x00W\xf3\xe0\ +m\xf2_D\xda\x98\x85\xe4/\x14\x18!e3\x828\ +e\xb80\x0a\x98t\x11\x90\x1b\xf4\x7fdRG\xe5)\ +\xa1!\xbe\x1c\xe6$\x89\x14\xcf \x9dIPr\x05x\ +\xa0\x00\xff6c\x02\x1cnE\xe1\xe9%\xed\xe7\xe3\xac\ +<_\x95\xe8?\x94n_\x98\xc5\xde\xac\x22\x1f\xa6c\ +>\x94oE\xdb\xf8~y\xe8\x9f\x9f\xf9\xa6\x82)f\ +\xbf\xd6\xe7\xc4\x13\xc1y\xfc\xa1W!\xc2P)\xe6[\ +\x10\xd7`\x05\x00d\xfbt\xa4)\xf6\xbf\xfb\x22\x0en\ +?\xbc,\xff\xb0 F\x8c;\x06\x9a \x0f\xf7\xf8\x06\ +\x09\x05\x82@\xa0@\x08P\x00\x05\x0d\x01?\xa2\x0f\xe8\ +\x5c2\x1a\x03\x88\xbf`\xd18\xd4l\x01\x08\x81\xc1c\ +\xd18\xf48\x05!\x8eH\xe1\xd184E\xfd(\x86\ +\xc4\xe5\x92H\xf4z\x0d\x19\x85\xcb&\xd1\xc8\x5c\x92Y\ +&\x85NcRG\xed\x0d\xfb\x13\x92>i\x0f\x87\x9d\ +-\xde\xe3\xa77\x1b\xd5\x16\xb3\xa2\xa8\xe1{\xd5\xde\xb3\ +\xe9\xd5n\xb9]\x8eA\x80v\x10%\x8c\x08\x05\x99L\ +\xe15\xe9<\x22\x81j\xb7[\xeb\x95\xabm\xc2\xe9u\ +\x9dM \xb7k\xd4v\xd9y\xbd\xdf\xf0\x11\xa9e\x11\ +\xf9\x17\xad`q\x18\x9cV/\x19\x8d\xc7c\xf2\x19\x1c\ +\x96O)\x95\xcbe\xf3\x19\x9c\xd6o9\x9d\xcfg\xf4\ +\x1a\x1d\x16\x8fI{\x80\x80\x00\x00\x00\x03\x00\x01\xa0\x03\ +\x00\x01\x00\x00\x00\x01\x00\x00\x00\x02\xa0\x04\x00\x01\x00\x00\ +\x00`\x00\x00\x00\x03\xa0\x04\x00\x01\x00\x00\x00`\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00Adobe Pho\ +toshop Document \ +Data Block\x00MIB8n\ +rTM\x00\x00\x00\x00MIB8ryaL$\ +!\x00\x00\x01\x00\x03\x00\x00\x00\x03\x00\x00\x00]\x00\x00\ +\x00\x5c\x00\x00\x00\x04\x00\xff\xff\x88\x0d\x00\x00\x00\x00\x0c\ +\x06\x00\x00\x01\x00\x0c\x06\x00\x00\x02\x00\x0c\x06\x00\x00M\ +IB8mron\xff\x00\x08\x00<\x01\x00\x00\x00\ +\x00\x00\x00(\x00\x00\x00\x00\x00\xff\xff\x00\x00\xff\xff\x00\ +\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\ +\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x00\x00\xff\xff\x07\ +Layer 0MIB8inul\x14\ +\x00\x00\x00\x07\x00\x00\x00L\x00a\x00y\x00e\x00r\ +\x00 \x000\x00\x00\x00MIB8rsnl\x04\ +\x00\x00\x00ryalMIB8diyl\x04\ +\x00\x00\x00\x03\x00\x00\x00MIB8lblc\x04\ +\x00\x00\x00\x01\x00\x00\x00MIB8xfni\x04\ +\x00\x00\x00\x00\x00\x00\x00MIB8oknk\x04\ +\x00\x00\x00\x00\x00\x00\x00MIB8fpsl\x04\ +\x00\x00\x00\x04\x00\x00\x00MIB8rlcl\x08\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00MIB8d\ +mhsH\x00\x00\x00\x01\x00\x00\x00MIB8t\ +suc\x00\x00\x00\x004\x00\x00\x00\x10\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x08\x00\x00\x00metadat\ +a\x01\x00\x00\x00\x09\x00\x00\x00layerTi\ +mebuod\xc5\xa4\xf3l\xf98\xd6A\x00M\ +IB8prxf\x10\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00S\x00O\ +\x00\x0f\x00\x0c\x00\x0a\x00\x09\x00\x09\x00\x09\x00\x09\x00\x15\ +\x00K\x00K\x00\x1e\x00\x1e\x00\x1e\x00\x1c\x00)\x00'\ +\x00(\x00$\x00'\x00\x22\x00'\x00$\x00&\x00%\ +\x00%\x00 \x00\x1d\x00\x1c\x00\x1c\x00\x1d\x00\x1b\x00\x1d\ +\x00!\x00\x22\x00#\x00%\x00!\x00$\x00+\x00+\ +\x00,\x00+\x00(\x00%\x00&\x00.\x00/\x00.\ +\x00+\x00-\x00-\x00.\x00-\x00.\x00/\x00-\ +\x00.\x00-\x00.\x00-\x00-\x00*\x00%\x00#\ +\x00(\x00,\x00+\x00,\x00,\x00%\x00#\x00!\ +\x00&\x00\x22\x00!\x00\x13\x00\x14\x00L\x00\x09\x00\x09\ +\x00\x08\x00\x09\x00\x0a\x00\x0a\x00\x0c\x00L\x00W\x00 \ +\x00\xfd\x00\x04\x05\x11!-1\xfe/\xfc0\x181/\ +/0110010/1/0010/\ +0110/01\xfe0\x0a/21100\ +/00//\xfe1\x000\xfe1\x05010/\ +01\xfe0\xfe1\xff0\x081/0/-'\x18\ +\x08\x01\xfe\x00\xff\x00\x07\x01\x14X\xab\xdb\xec\xf0\xf0\xfd\ +\xf1\x00\xf0\xfe\xf1\x00\xf2\xfd\xf1\xff\xf0\x01\xf1\xf0\xf8\xf1\ +\x03\xf0\xf1\xf1\xf0\xfe\xf1\xfe\xf0\x07\xf1\xf0\xf0\xf1\xf1\xf0\ +\xf1\xf0\xfc\xf1\xff\xf0\x1b\xf1\xf0\xf0\xf1\xf2\xf1\xf0\xf1\xf0\ +\xf1\xf1\xf2\xf0\xf1\xf0\xf1\xf0\xf0\xf1\xf0\xee\xe4\xc2|.\ +\x06\x00\x00\xff\x00\x03\x16\x86\xed\xfd\xb3\xff\x04\xf9\xbfA\ +\x06\x00\x03\x00\x08l\xf4\xb0\xff\x03\xfe\xbd*\x01\x02\x00\ +$\xd0\xae\xff\x02\xf8x\x07\x02\x02O\xf6\xad\xff\x01\xc0\ +\x14\x02\x05r\xfd\xad\xff\x01\xe1#\x02\x08\x86\xfe\xad\xff\ +\x01\xed+\x02\x08\x8f\xfe\xad\xff\x01\xef-\x02\x09\x91\xfe\ +\xf1\xff\x00\xfe\xdb\xff\xfe\xfe\xfd\xff\x00\xfe\xec\xff\x01\xef\ +,\x02\x08\x91\xfe\xfa\xff\x17\xfe\xcf\xc2\xc3\xc2\xc4\xc3\xc4\ +\xc3\xc3\xc4\xc4\xc1\xc3\xc3\xc2\xc3\xc2\xc2\xc3\xc2\xc3\xc4\xc4\ +\xfe\xc2\xff\xc3\x0c\xcb\xd5\xdc\xe1\xe1\xdd\xd5\xcc\xc2\xc3\xc2\ +\xc2\xc1\xfe\xc3\xff\xc4\xf9\xc3\x06\xc4\xc3\xc3\xc4\xc2\xc3\xc4\ +\xfe\xc3\xff\xc2\x01\xc7\xf1\xf9\xff\x01\xf0-\x02\x09\x90\xfe\ +\xfa\xff\x03\xfaK\x18\x17\xfc\x18\x14\x17\x18\x16\x19\x17\x18\ +\x19\x19\x18\x19\x18\x17\x18\x19\x19\x18\x17/~\xce\xf4\xfb\ +\xff\x13\xf7\xc8\x810\x18\x16\x19\x19\x17\x18\x18\x19\x18\x18\ +\x19\x17\x19\x18\x19\x18\xfd\x19\x08\x18\x19\x19\x18\x19\x19\x17\ +,\xc7\xf9\xff\x01\xf0,\x01\x09\x90\xf9\xff\x01\xf98\xeb\ +\x00\x020\x9f\xea\xf5\xff\x02\xeb\x996\xe8\x00\x01\x15\xc0\ +\xf9\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\x01\xf97\xec\x00\ +\x01u\xf4\xf1\xff\x01\xf7c\xe9\x00\x02\x14\xc2\xfe\xfa\xff\ +\x01\xf0-\x02\x09\x90\xfe\xfa\xff\x01\xf88\xee\x00\x01\x12\ +\x91\xed\xff\x01\x9a\x17\xeb\x00\x02\x14\xc2\xfe\xfa\xff\x01\xef\ +/\x01\x08\x90\xf9\xff\x01\xf99\xef\x00\x01\x0e\xc7\xeb\xff\ +\x01\xba\x02\xec\x00\x01\x14\xc1\xf9\xff\x01\xf0/\x02\x09\x90\ +\xfe\xfa\xff\x01\xf97\xef\x00\x00\x95\xfa\xff\x09\xd1\x9c]\ +B;Hj\xaa\xd6\xfe\xfa\xff\x01\x97\x04\xed\x00\x01\x12\ +\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf98\xf0\ +\x00\x00r\xfb\xff\x02\xc9E\x02\xfa\x00\x02\x05C\xbf\xfa\ +\xff\x00\x86\xed\x00\x01\x14\xc2\xf9\xff\x01\xf1-\x02\x09\x90\ +\xfe\xfa\xff\x01\xfa8\xf1\x00\x01-\xf5\xfc\xff\x01\xa3\x09\ +\xf6\x00\x02\x02s\xfc\xfc\xff\x01\xee\x16\xee\x00\x01\x15\xc1\ +\xf9\xff\x01\xef-\x01\x09\x92\xf9\xff\x01\xf97\xf1\x00\x00\ +\xb6\xfc\xff\x01\xa8\x06\xf3\x00\x01C\xe7\xfc\xff\x00\xa0\xee\ +\x00\x01\x15\xc2\xf9\xff\x01\xef,\x02\x09\x91\xfe\xfa\xff\x01\ +\xf98\xf2\x00\x01\x1b\xf4\xfd\xff\x01\xe3\x13\xf1\x00\x01:\ +\xfa\xfd\xff\x01\xf9%\xef\x00\x01\x14\xc2\xf9\xff\x01\xf0/\ +\x01\x09\x90\xf9\xff\x01\xfa7\xf2\x00\x00\x82\xfc\xff\x00g\ +\xef\x00\x00\x8f\xfc\xff\x00\x87\xef\x00\x01\x15\xc2\xf9\xff\x01\ +\xef-\x01\x09\x91\xf9\xff\x01\xf87\xf3\x00\x01\x12\xea\xfd\ +\xff\x01\xe9\x0d\xef\x00\x01\x08\xd8\xfd\xff\x01\xdf\x0a\xf0\x00\ +\x02\x14\xc1\xfe\xfa\xff\x01\xef/\x02\x08\x90\xfe\xfa\xff\x01\ +\xf98\xf3\x00\x00n\xfc\xff\x00\xad\xed\x00\x00o\xfd\xff\ +\x01\xfd0\xf0\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\x91\ +\xfe\xfa\xff\x01\xf97\xf4\x00\x01\x0f\xe5\xfd\xff\x01\xfe;\ +\xed\x00\x01\x17\xee\xfd\xff\x00T\xf0\x00\x01\x14\xc3\xf9\xff\ +\x01\xf0/\x02\x09\x91\xfe\xfa\xff\x01\xfa7\xf4\x00\x01(\ +\xef\xfd\xff\x01\xc2\x02\xec\x00\x00\xcb\xfd\xff\x00c\xf0\x00\ +\x01\x15\xc1\xf9\xff\x01\xf1-\x02\x09\x92\xfe\xfa\xff\x01\xf8\ +8\xf4\x00\x06\x01\x1bP\xc0\xff\xffI\xeb\x00\x00\xb0\xfd\ +\xff\x00m\xf0\x00\x01\x15\xc2\xf9\xff\x01\xf0.\x01\x09\x90\ +\xf9\xff\x01\xf98\xf0\x00\x02C\x87\x07\xeb\x00\x00\xb6\xfd\ +\xff\x00m\xf0\x00\x01\x15\xc2\xf9\xff\x01\xf0.\x02\x09\x90\ +\xfe\xfa\xff\x01\xf99\xd8\x00\x01\x09\xda\xfd\xff\x00b\xf0\ +\x00\x02\x15\xc3\xfe\xfa\xff\x01\xef-\x01\x08\x91\xf9\xff\x01\ +\xf97\xd8\x00\x018\xfe\xfd\xff\x00Q\xf0\x00\x02\x14\xc2\ +\xfe\xfa\xff\x01\xf0/\x02\x09\x91\xfe\xfa\xff\x01\xf98\xd8\ +\x00\x00\x9b\xfd\xff\x01\xfc2\xf0\x00\x01\x14\xc1\xf9\xff\x01\ +\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf98\xd9\x00\x01*\xf8\ +\xfd\xff\x01\xd5\x06\xf0\x00\x01\x14\xc1\xf9\xff\x01\xf0.\x02\ +\x09\x91\xfe\xfa\xff\x01\xf99\xd9\x00\x00\x8e\xfc\xff\x00\x80\ +\xef\x00\x01\x14\xc2\xf9\xff\x01\xf1.\x02\x09\x92\xfe\xfa\xff\ +\x01\xf99\xda\x00\x01\x07\xdf\xfd\xff\x01\xe5\x19\xef\x00\x01\ +\x15\xc1\xf9\xff\x01\xf0/\x02\x08\x93\xfe\xfa\xff\x01\xf98\ +\xda\x00\x01B\xfe\xfd\xff\x04\xef\xc8\xca\xad^\xf2\x00\x02\ +\x15\xc1\xfe\xfa\xff\x01\xef.\x02\x09\x91\xfe\xfa\xff\x01\xf9\ +8\xe0\x00\x06\x0c\x22Cg\x84\x9c\xda\xf7\xff\x01\xb9(\ +\xf4\x00\x01\x14\xc1\xf9\xff\x01\xef-\x01\x08\x8f\xf9\xff\x01\ +\xf99\xe6\x00\x07\x0d(Hn\x97\xbb\xde\xf4\xf1\xff\x01\ +\xd1\x0a\xf5\x00\x02\x15\xbf\xfe\xfa\xff\x01\xee.\x02\x09\x92\ +\xfe\xfa\xff\x01\xf89\xef\x00\x0a\x02\x0e\x1d:Pf~\ +\x9b\xc2\xdf\xf8\xea\xff\x00Q\xf5\x00\x01\x14\xc2\xf9\xff\x01\ +\xef.\x01\x09\x91\xf9\xff\x01\xf98\xf4\x00\x07\x059]\ +\x88\xaf\xd1\xe3\xee\xe2\xff\x00\x9f\xf5\x00\x01\x14\xc1\xf9\xff\ +\x01\xf0-\x02\x09\x90\xfe\xfa\xff\x01\xf98\xf6\x00\x02\x10\ +{\xd0\xe3\xff\x03\xfa\xf0\xdc\xed\xfd\xff\x00\xc1\xf5\x00\x01\ +\x14\xc1\xf9\xff\x01\xef,\x02\x09\x90\xfe\xfa\xff\x01\xf97\ +\xf7\x00\x01$\xd4\xe8\xff\x0a\xfb\xe5\xc7\x9fyR8)\ +\x18\x08\x9d\xfd\xff\x01\xe2\x0f\xf6\x00\x01\x15\xc2\xf9\xff\x01\ +\xf1.\x01\x09\x91\xf9\xff\x01\xf98\xf8\x00\x01\x05\xc8\xed\ +\xff\x07\xf7\xe2\xc0\x9crJ+\x0d\xf9\x00\x00\x8a\xfd\xff\ +\x01\xf8&\xf6\x00\x01\x14\xc3\xf9\xff\x01\xf1.\x02\x09\x92\ +\xfe\xfa\xff\x01\xf99\xf8\x00\x00`\xf4\xff\x09\xfd\xea\xcd\ +\xa7\x82jXC#\x0c\xf3\x00\x00k\xfc\xff\x00J\xf6\ +\x00\x01\x13\xc2\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\ +\xf97\xf8\x00\x00\xaf\xfa\xff\x07\xfb\xe6\xc6\xa3wR/\ +\x11\xeb\x00\x00D\xfc\xff\x00p\xf6\x00\x02\x15\xc2\xfe\xfa\ +\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf98\xf8\x00\x00\ +\xc1\xfd\xff\x04\xeaxJ+\x0f\xe5\x00\x01#\xf8\xfd\xff\ +\x00\x97\xf6\x00\x01\x14\xc1\xf9\xff\x01\xef.\x02\x09\x91\xfe\ +\xfa\xff\x01\xf88\xf8\x00\x00\xa1\xfd\xff\x01\xe5\x03\xe2\x00\ +\x01\x08\xdf\xfd\xff\x00\xbe\xf6\x00\x01\x15\xc1\xf9\xff\x01\xef\ +-\x02\x09\x91\xfe\xfa\xff\x01\xf97\xf8\x00\x00y\xfd\xff\ +\x01\xfc.\xe1\x00\x00\xc0\xfd\xff\x01\xdd\x0a\xf7\x00\x02\x14\ +\xc2\xfe\xfa\xff\x01\xf1.\x02\x09\x91\xfe\xfa\xff\x01\xf98\ +\xf8\x00\x00M\xfc\xff\x00T\xf3\x00\x05?\x95\xb6\xa2f\ +\x0b\xf5\x00\x00\x96\xfd\xff\x01\xf7&\xf7\x00\x02\x15\xc2\xfe\ +\xfa\xff\x01\xef.\x02\x09\x90\xfe\xfa\xff\x01\xf98\xf8\x00\ +\x01.\xfd\xfd\xff\x00w\xf5\x00\x02\x08\x97\xfd\xfd\xff\x01\ +\xc5#\xf6\x00\x00r\xfc\xff\x00C\xf7\x00\x01\x14\xc1\xf9\ +\xff\x01\xef.\x02\x09\x92\xfe\xfa\xff\x01\xf97\xf8\x00\x01\ +\x10\xe8\xfd\xff\x00\xa2\xf6\x00\x01\x01\xaf\xfa\xff\x01\xe11\ +\xf7\x00\x00H\xfc\xff\x00i\xf7\x00\x01\x15\xc2\xf9\xff\x01\ +\xf0.\x01\x09\x91\xf9\xff\x01\xf98\xf7\x00\x00\xcb\xfd\xff\ +\x00\xc7\xf6\x00\x00?\xf8\xff\x00\xb7\xf7\x00\x01'\xfa\xfd\ +\xff\x00\x87\xf7\x00\x01\x15\xc1\xf9\xff\x01\xef.\x01\x09\x91\ +\xf9\xff\x01\xf97\xf7\x00\x00\xa7\xfd\xff\x01\xe3\x0d\xf7\x00\ +\x00\xa0\xf8\xff\x01\xe6\x0b\xf8\x00\x01\x0c\xe4\xfd\xff\x00\x9d\ +\xf7\x00\x01\x14\xc0\xf9\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\ +\x01\xf98\xf7\x00\x00|\xfd\xff\x01\xf5\x1f\xf7\x00\x00\xcb\ +\xf8\xff\x01\xf7\x22\xf7\x00\x00\xc3\xfd\xff\x00\xb3\xf7\x00\x01\ +\x13\xc0\xf9\xff\x01\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf97\ +\xf7\x00\x00W\xfd\xff\x01\xfc.\xf7\x00\x00\xc0\xf8\xff\x01\ +\xf3\x1e\xf7\x00\x00\xa0\xfd\xff\x01\xcb\x01\xf8\x00\x01\x14\xc1\ +\xf9\xff\x01\xf1.\x01\x09\x91\xf9\xff\x01\xfa8\xf7\x00\x01\ +0\xfd\xfd\xff\x00A\xf7\x00\x00\x82\xf8\xff\x01\xdc\x05\xf7\ +\x00\x00t\xfd\xff\x01\xe8\x14\xf8\x00\x01\x15\xc1\xf9\xff\x01\ +\xef-\x02\x09\x91\xfe\xfa\xff\x01\xf97\xf7\x00\x01\x14\xee\ +\xfd\xff\x00^\xf7\x00\x01$\xf9\xf9\xff\x00\x90\xf6\x00\x00\ +N\xfd\xff\x01\xfb-\xf8\x00\x01\x13\xc2\xf9\xff\x01\xf0-\ +\x02\x09\x91\xfe\xfa\xff\x01\xf99\xf7\x00\x01\x02\xcd\xfd\xff\ +\x00\x8a\xf6\x00\x00k\xfb\xff\x02\xfe\xa1\x0a\xf6\x00\x005\ +\xfc\xff\x00T\xf8\x00\x02\x15\xc2\xfe\xfa\xff\x01\xf1.\x01\ +\x09\x92\xf9\xff\x01\xf98\xf6\x00\x00\xb4\xfd\xff\x00\xae\xf5\ +\x00\x01P\xd7\xfd\xff\x01\xfa\x22\xf5\x00\x01(\xfa\xfd\xff\ +\x00x\xf8\x00\x01\x15\xc2\xf9\xff\x01\xf0-\x02\x09\x91\xfe\ +\xfa\xff\x01\xf86\xf6\x00\x00\xa1\xfd\xff\x01\xd1\x04\xf5\x00\ +\x00T\xfc\xff\x00H\xf5\x00\x01\x18\xf0\xfd\xff\x00\x9f\xf8\ +\x00\x02\x14\xc1\xfe\xfa\xff\x01\xf0-\x02\x09\x91\xfe\xfa\xff\ +\x01\xf98\xf6\x00\x00\x8c\xfd\xff\x01\xee\x18\xf5\x00\x00=\ +\xfc\xff\x00s\xf5\x00\x01\x06\xda\xfd\xff\x00\xc6\xf8\x00\x01\ +\x14\xc2\xf9\xff\x01\xf0.\x02\x09\x92\xfe\xfa\xff\x01\xf86\ +\xf6\x00\x00r\xfd\xff\x01\xfe4\xf5\x00\x01%\xf7\xfd\xff\ +\x00\x98\xf4\x00\x00\xba\xfd\xff\x01\xe3\x0f\xf9\x00\x01\x14\xc1\ +\xf9\xff\x01\xf0/\x01\x09\x91\xf9\xff\x01\xf98\xf6\x00\x00\ +F\xfc\xff\x00[\xf5\x00\x01\x08\xdc\xfd\xff\x00\x90\xf4\x00\ +\x00\x8f\xfd\xff\x01\xfb,\xf9\x00\x02\x15\xc1\xfe\xfa\xff\x01\ +\xf0.\x02\x09\x91\xfe\xfa\xff\x01\xf88\xf6\x00\x01'\xfa\ +\xfd\xff\x00\x80\xf4\x00\x00t\xfe\xff\x01\xee-\xf4\x00\x00\ +j\xfc\xff\x00K\xf9\x00\x01\x15\xc2\xf9\xff\x01\xf1-\x01\ +\x09\x91\xf9\xff\x01\xfa8\xf6\x00\x01\x0b\xe2\xfd\xff\x00\xab\ +\xf3\x00\x03D\x97\x8a)\xf3\x00\x00@\xfc\xff\x00u\xf9\ +\x00\x01\x13\xc2\xf9\xff\x01\xf0.\x01\x08\x90\xf9\xff\x01\xf9\ +8\xf5\x00\x00\xc4\xfd\xff\x01\xcd\x01\xe2\x00\x01 \xf7\xfd\ +\xff\x00\x9a\xf9\x00\x02\x14\xc2\xfe\xfa\xff\x01\xf0.\x01\x09\ +\x91\xf9\xff\x01\xf98\xf5\x00\x00\x9c\xfd\xff\x01\xeb\x15\xe1\ +\x00\x00\xd8\xfd\xff\x00\xbb\xf9\x00\x01\x13\xc2\xf9\xff\x01\xf0\ +.\x02\x08\x91\xfe\xfa\xff\x01\xf97\xf5\x00\x00t\xfd\xff\ +\x01\xfe1\xe4\x00\x03\x07\x1c=\xd4\xfd\xff\x00\xce\xf9\x00\ +\x02\x15\xc0\xfe\xfa\xff\x01\xef-\x02\x09\x91\xfe\xfa\xff\x01\ +\xf89\xf5\x00\x00N\xfc\xff\x00S\xec\x00\x09\x02\x12\x22\ +3Ei\x8f\xb7\xd7\xf1\xfb\xff\x00\xc9\xf9\x00\x01\x14\xc2\ +\xf9\xff\x01\xef-\x01\x09\x90\xf9\xff\x01\xf96\xf5\x00\x01\ +)\xfb\xfd\xff\x00z\xf2\x00\x08\x03\x1a7Z\x85\xa8\xd0\ +\xe9\xf6\xf4\xff\x00\x8b\xf9\x00\x01\x14\xc0\xf9\xff\x01\xf1,\ +\x01\x09\x90\xf9\xff\x01\xf97\xf5\x00\x01\x0f\xe8\xfd\xff\x00\ +\x92\xf9\x00\x08\x03\x0d\x1d\x0a\x0a \x0a icon / Prefer\ +ences / Global\x0a Created with Sk\ +etch.\x0a \ + \x0a \x0a \ +\x0a\x0a\ +\x00\x00\x09\xaf\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / Prefer\ +ences / Camera\x0a Created with Sk\ +etch.\x0a \ + \x0a \x0a \ + \ +\x0a \x0a \ + \x0a\x0a\ +\x00\x00\x05\xc2\ +<\ +svg width=\x2224\x22 h\ +eight=\x2224\x22 viewB\ +ox=\x220 0 24 24\x22 f\ +ill=\x22none\x22 xmlns\ +=\x22http://www.w3.\ +org/2000/svg\x22>\x0a<\ +path d=\x22M21.4629\ + 11.2764C20.6447\ + 10.508 19.5748 \ +10.0719 18.4419 \ +10.0719C17.8965 \ +10.0719 17.351 1\ +0.1758 16.8475 1\ +0.3834C16.5748 9\ +.26204 15.9664 8\ +.2237 15.1063 7.\ +37226C13.8685 6.\ +16779 12.6717 5.\ +47607 10.4147 5.\ +47607C7.92095 5.\ +47607 6.586 6.16\ +779 5.32725 7.37\ +226C4.08949 8.57\ +673 3.30673 10.1\ +907 3.30673 11.8\ +935C3.30673 12.1\ +635 3.32771 12.4\ +335 3.34869 12.7\ +035C2.84519 12.8\ +281 2.49509 13.0\ +831 2.13844 13.4\ +362C1.57201 13.9\ +761 1.25732 14.7\ +029 1.25732 15.4\ +713C1.25732 17.1\ +534 2.66292 18.5\ +032 4.3832 18.50\ +32L18.2741 18.52\ +4C20.7286 18.524\ + 22.7426 16.5927\ + 22.7426 14.2045\ +C22.7217 13.1039\ + 22.2811 12.0656\ + 21.4629 11.2764\ +ZM17.2975 16.665\ +9L4.65419 16.686\ +7C3.62622 16.686\ +7 3.45969 16.038\ +7 3.37771 15.643\ +7C3.30673 15.301\ +7 3.37861 14.788\ +2 3.53455 14.579\ +9C3.74825 14.294\ +4 4.10093 14.164\ +9 4.5273 14.1216\ +C4.76182 14.0979\ + 5.1687 14.0552 \ +5.32721 13.8355C\ +5.43211 13.6901 \ +5.47406 13.5032 \ +5.45308 13.3163C\ +5.36917 12.901 5\ +.32721 12.5272 5\ +.32721 12.1119C5\ +.32721 10.7413 5\ +.6315 9.73925 6.\ +63849 8.76321C7.\ +64549 7.78717 8.\ +98815 7.24724 10\ +.4147 7.24724C11\ +.8413 7.24724 12\ +.9769 7.56395 13\ +.9839 8.53999C14\ +.865 9.39143 15.\ +3895 10.4921 15.\ +5154 11.655C15.5\ +363 11.8627 15.6\ +622 12.0703 15.8\ +72 12.1534C16.06\ +08 12.2365 16.31\ +26 12.2365 16.48\ +04 12.1119C17.63\ +42 11.3643 18.84\ +8 11.1981 19.876\ + 12.1742C20.4424\ + 12.7141 20.7426\ + 13.4362 20.7426\ + 14.2045C20.7426\ + 15.9074 19.0808\ + 16.6659 17.2975\ + 16.6659Z\x22 fill=\ +\x22white\x22/>\x0a\ +\x0a\ +\x00\x00\x00\xab\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x0d\x08\x06\x00\x00\x00\xa0\xbb\xee$\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +UIDAT8Oc\xfc\xff\xff?\x03%\x80\x09\ +J\x93\x0d\xf0\x1a\xd0\xd8\xd8H\xd0y\x04]@\xc8\x10\ +\x940\xc0\xa7\xb8\xbe\xbe\x9e\x11\xcaD\x01D\x87\x01.\ +\xc3I\x0aDl\x86\x90d\x006o\x10m\x00\xae0\ +\xc0\x9b\x90`N\xc6\xa5\x19\x04\x08\xba\x00\x9ff\x10\x18\ +\xe8\xa4\xcc\xc0\x00\x00\x9d\xda\x22\x8d\x12\xa2\xae,\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x05p\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / Prefer\ +ences / viewport\ +\x0a Created with \ +Sketch.\x0a \ + \x0a \ + \ +\x0a \x0a \x0a \ + \x0a\x0a\ +\x00\x00\x00\xca\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x0d\x08\x06\x00\x00\x00\xa0\xbb\xee$\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x00_IDAT8O\xc5\x91\xc1\x0e\ +\xc0 \x08C\xc1\x1f\x07\xbe\x9c\x05'\x86\xc4\xb9\x89\x1e\ +\xf6.r\xa1\xd2\x16U\x15\x0c\x11\xb9\x87\x07\x88\x08\xdb\ +8\x80\xcc<]\x5c\xa1\xb4w\x9b\xff\x05z\x88\x19b\ +\xe0\xe9\x10\xbd\x11\x17I[\xf0E\x17*o\x1d\xcf\x88\ +\x16\x8eB\xb4\xcf\xab\xc0\xc9\x15\xfd\x82\x1d\x11c\xa81\ +\xfa\xfb\x06\xe0\x02\xfbk*\x0b\x22\xb70[\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x05\xfe\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a Icons / Editor\ + / EMFX / Motion\ +\x0a \x0a \x0a \ + \x0a \ + \x0a\x0a\ +\x00\x00\x00\xa0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x0d\x08\x06\x00\x00\x00\xa0\xbb\xee$\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\ +\xa8d\x00\x00\x005IDAT8Oclhh\ +\xf8\xcf\x80\x06\xea\xeb\xeb\x19\xa1L\x82\x80\x09J\x93\x0d\ +\xb0\xba\x80\x18\x00s%\xd9.hll\x04[L\xb1\ +\x17F\x0d\x185\x80\x81\x81\x81\x01\x00\xc0\x1c\x0a\x95\xd5\ +0\x97g\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x11\xbc\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / Prefer\ +ences / Debug\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a \ + \x0a \ + \x0a <\ +/g>\x0a\x0a\ +\x00\x00\x125\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / Prefer\ +ences / Experime\ +ntal\x0a \ + Created w\ +ith Sketch.\x0a \ +\x0a \x0a \x0a\x0a\ +\x00\x00\x04\x0e\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / Prefer\ +ences / Files\x0a \ +Created with Ske\ +tch.\x0a \ +\x0a \x0a \ + \x0a\x0a\ +\x00\x00\x03`\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a \x0a icon / Prefer\ +ences / Gizmos\x0a Created with Sk\ +etch.\x0a \ + \x0a \x0a \ + \x0a\x0a\ +\x00\x00\x00[\ +\x00\ +\x00\x01Fx\x9c\x8d\x8c1\x0a\x800\x10\x04\xe7\xacD\ +P;\xeb\x94\x96>\xc1\xa7\xf9d\xad\x05\xcf\x8d\x88B\ +\xc0\x98Y\x86\x83cY\xa80B\x80V\x99\x0c\x06`\ +\x94z1KS\x22\x0b/\xd5m\xc4\xdd)\xa2\x93\xcd\ +\xb7\xfd~Pk5\xde\x5c\xef\xdaI\xf0\x12\xb6\xbc+\ +\xf6\xf8\xd7M9\x01\x0cb\x81\xee\ +\x00\x00\x00[\ +\x00\ +\x00\x01Fx\x9c\xc5\xc81\x0e@@\x18D\xe1\xf9W\ +!**\xad-\x95n\xc0\xcd\xec\xd1\x1c\xc5\x11\x94\x0a\ +\xf1\xec\xc6\x8a\x0bH|\x93\xd7\x8c\xe4d\xf2^jT\ +i0\xa9\x95\xd4\xc7\xe2\xa5)fqI\xd0\xcb\xe5\x12\ +@\x7f\xe3q\xcep\x8c\xb0w\xb0\xd5\xb0\x96\xb0\x14\x10\ +\xec\xfe\xbe.\xbb\x00\x9d\x16jC\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x0c\x00\x04\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x07\xf8\x00\x00\x07\xf8\x00\x00\x0f\xfc\x00\x00\x0f\xfc\ +\x00\x00\x1f\xfc\x00\x00\x1f\xfe\x00\x00?\xfe\x00\x00/\xfe\ +\x00\x00o\xfe\x00\x00\xef\xfe\x00\x00\xcf\xf6\x00\x00\x0d\xb6\ +\x00\x00\x0d\xb4\x00\x00\x0d\xb0\x00\x00\x0d\x80\x00\x00\x0c\x00\ +\x00\x00\x0c\x00\x00\x00\x0c\x00\x00\x00\x0c\x00\x00\x00\x0c\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x03\ +\xff\xff\xf0\x03\xff\xff\xf0\x03\xff\xff\xe0\x01\xff\xff\xe0\x01\ +\xff\xff\xc0\x01\xff\xff\xc0\x00\xff\xff\x80\x00\xff\xff\x80\x00\ +\xff\xff\x00\x00\xff\xfe\x00\x00\xff\xfe\x00\x00\xff\xfe \x00\ +\xff\xff\xe0\x01\xff\xff\xe0\x03\xff\xff\xe0\x0f\xff\xff\xe0\x7f\ +\xff\xff\xe1\xff\xff\xff\xe1\xff\xff\xff\xe1\xff\xff\xff\xe1\xff\ +\xff\xff\xf3\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x00\xa7\ +\x00\ +\x00\x0c\xbex\x9c\xed\x921\x0a\xc20\x18\x85_t\xe8\ +Rp\x13\xc7\x8e=\x867\xf0J\x1e\xc1cx\x0c\xc1\ +\x8btsut(<_\x8bC1\x12K\x93\xdfA\ +\xfe\x0f\x1e\x09\x09\xf9^\x02\x01V\x08h\x1a\x8c\xe3\xb9\ +\x06\xb6\x00ZEK\xd8+\x01;\x8c\xd4p\x1c\xc7q\ +\x9c?\x85\x11\xa6\xf2\x82\xfe\x8f\xf2R\x15\x09\xf9\x0f\xfc\ +\x99\x15_\xe59\xfe\xa9\xc1\xce?\xe7!\x8b+\xe2\xb7\ +\xbci\x8b\xf8c\xdbt\x92}\xf7\x94\xbf\xa0\xdc\x08k\ +\xbf\x11\xe9\x0f9\x8f~C>*\xf2\xaetk\xf22\ +$\x90G\x05C\xd4rR\xba\xf0\xda?\x90W\x9d\xbb\ +)O\x85i\xaa%\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x06\x00\x06\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x000\x00\x00\x000\x00\x00\x000\x00\ +\x00\x01\xfe\x00\x00\x01\xfe\x00\x00\x000\x00\x00\x000\x00\ +\x00\x001\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\x00\x03\x00\ +\x00\x00\x06\x00\x00\x00F\x00\x00\x00l\x00\x00\x00|\x00\ +\x00\x00\x7f\x80\x00\x00\x7f\x00\x00\x00~\x00\x00\x00|\x00\ +\x00\x00x\x00\x00\x00p\x00\x00?\xe0\x00\x00 \x00\ +\x00 \x00\x00 \x00\x00 \x00\x00 \x00\ +\x00 \x00\x00 \x00\x00?\xe0\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xcf\xff\xff\xff\xcf\xff\xff\xff\xcf\xff\ +\xff\xfe\x01\xff\xff\xfe\x01\xff\xff\xff\xcf\xff\xff\xff\xce\x7f\ +\xff\xff\xcc?\xff\xff\xfc?\xff\xff\xf8\x7f\xff\xffx\x7f\ +\xff\xff0\xff\xff\xff\x10\xff\xff\xff\x01\xff\xff\xff\x00\x1f\ +\xff\xff\x00?\xff\xff\x00\x7f\xff\xff\x00\xff\xff\xff\x01\xff\ +\xff\xff\x03\xff\xff\x80\x07\xff\xff\x80\x0f\xff\xff\x9f\xcf\xff\ +\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\ +\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x80\x0f\xff\xff\x80\x0f\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x00`\ +\x00\ +\x00\x01Fx\x9cc``b`dPP``\xe0\ +f\xe0e0`d`\x10c``\xd0\x00b\xa0\x10\ +\x83\x03\x103\x02!\x0840 \x00\x13\x14\x83\xc0\xff\ +\xff\xff\x19H\x025@\x1c\x82\x03\x0b\xe0\x91\xab\xc1m\ +\xe4\x7fR@3&\xfe\xdd\xbc\xff\xff\xe7\xe6\xf9\xff\x1f\ +0\xf0\x83i\x10\x1f\x9b:\x5c\x00\x00\x81\xb3~\xf0\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x03\x80\x00\x00\x02\x80\x00\x00\x02\x80\ +\x00\x00\x02\x80\x00\x00\x02\x80\x00\x00\x04@\x00\x00\x0c`\ +\x00\x03\xf0\x1f\x80\x02\x01\x00\x80\x03\xf0\x1f\x80\x00\x0c`\ +\x00\x00\x04@\x00\x00\x02\x80\x00\x00\x02\x80\x00\x00\x02\x80\ +\x00\x00\x02\x80\x00\x00\x03\x80\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\ +\xff\xff\xfe\xff\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xfc\x7f\ +\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xf9?\xff\xff\xf1\x1f\ +\xff\xfc\x03\x80\x7f\xf0\x1e\xf0\x1f\xfc\x03\x80\x7f\xff\xf1\x1f\ +\xff\xff\xf9?\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xfc\x7f\ +\xff\xff\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xfe\xff\xff\xff\xfe\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x10\x00\x0d\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\ + \x01\x00\x00@\x00\xc0\x01\x80\x008\x0e\x00\x00\x07\xf0\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf9\xff\xff\xcf\xf8\xff\xff\ +\x8f\xfc?\xfe\x1f\xfe\x07\xe0?\xff\x00\x00\x7f\xff\xc0\x01\ +\xff\xff\xf8\x0f\xff\xff\xff\xff\xff\xff\xff\x7f\xff\xff\xfe?\ +\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xfe?\ +\xff\xff\xff\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x00X\ +\x00\ +\x00\x01Fx\x9c\xc5\xcd1\x0a\x800\x0cF\xe1\x97.\ +\xe2\xa4\x93k;:z\x83z\xb3\xf6\xc8\xbdA\xfc\x0b\ +\x05A\x9c\x5c|\xe1#\x90\xa1\x85\x80\x91\x12\xac\xcc\x1c\ +\x06\x1b\xb0\x8bN\x9cb\x9a^\xe5.\x0c=w\xe7\xef\ +\xfc\xa5V>+\x92\x1bDYd\x1a;\xea\xd9,\xe5\ +\xf9\xd7\x05'\x93i\xe6\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x0c\x00\x00\x00\x1e\x00\x00\x00\x1e\x00\ +\x00\x00\x1e\x00\x00\x00\x1e\x00\x00\x18\x1e\x00\x00\x14\x0c\x00\ +\x00\x12\x00\x00\x00\x11\xe0\x00\x00\x10\x10\x00\x00\x10 \x00\ +\x00\x10@\x00\x00\x10\x80\x00\x00\x11\x00\x00\x00\x12\x00\x00\ +\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xf3\xff\xff\xff\xe1\xff\xff\xff\xc0\xff\xff\xff\xc0\xff\ +\xff\xff\xc0\xff\xff\xff\xc0\xff\xff\xe7\xc0\xff\xff\xe3\xe1\xbf\ +\xff\xe1\xf3\xbf\xff\xe0\x1e\x0f\xff\xe0\x0f\xbf\xff\xe0\x1f\xbf\ +\xff\xe0?\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ +\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x00\x00\x18\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xf0\x00\x00\x00\x88\x00\x00\x00\x84\x00\x00\x00\x82\x00\x00\ +\x00A\x00\x00\x00 \x80\x00\x00\x10@\x00\x00\x0b\xa0\x00\ +\x00\x05\xd6\x00\x00\x02\xe9\x00\x00\x01a\x00\x00\x00\x81\x00\ +\x00\x00@\x80\x00\x00\x80@\x00\x00\x80 \x00\x00p \ +\x00\x00\x08 \x00\x00\x04@\x00\x00\x03\x80\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\x0f\xff\xff\xff\x07\xff\xff\xff\x03\xff\xff\xff\x01\xff\xff\ +\xff\x80\xfc\xff\x0f\xc0~|c\xe0?1\xf9\xf0\x1f\x87\ +\xff\xf8\x09\xfd\xff\xfc\x00\xf8\xff\xfe\x00\xf0\x7f\xff\x00\xfd\ +\xdb\xff\x80}\xdb\xff\x00=\xdb\xff\x00\x1d\xc3\xff\x80\x1d\ +\xdb\xff\xf0\x1d\xdb\xff\xf8=\xdb\xff\xfcp\x7f\xff\xff\xf8\ +\xff\xff\xff\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x01\x00\x01\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x18\x00\x00\x00\x18\x00\x00\x00\x18\x00\x00\x00\xff\x00\x00\ +\x00\xff\x00\x00\x00\x18\x00\x00\x00\x18\x00\x00\x00\x18\xc0\x00\ +\x00\x00\xc0\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\ +\x00#\x00\x00\x006\x00\x00\x00>\x00\x00\x00?\xc0\x00\ +\x00?\x80\x00\x00?\x00\x00\x00>\x00\x00\x00<\x00\x00\ +\x008\x00\x00\x000\x00\x00\x00 \x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\xe7\xff\xff\xff\x00\xff\xff\ +\xff\x00\xff\xff\xff\xe7\xff\xff\xff\xe7?\xff\xff\xe6\x1f\xff\ +\xff\xfe\x1f\xff\xff\xfc?\xff\xff\xbc?\xff\xff\x98\x7f\xff\ +\xff\x88\x7f\xff\xff\x80\xff\xff\xff\x80\x0f\xff\xff\x80\x1f\xff\ +\xff\x80?\xff\xff\x80\x7f\xff\xff\x80\xff\xff\xff\x81\xff\xff\ +\xff\x83\xff\xff\xff\x87\xff\xff\xff\x8f\xff\xff\xff\x9f\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xe0\ +\x00\x00\x18\x18\x00\x00 \x04\x00\x00@\x02\x00\x00\x80\x01\ +\x00\x01\x00\x00\x80\x01\x00\x00\x80\x02\x00\x00@\x02\x00\x00\ +@\x02\x02\x00@\x02\x02\x00\x00\x02\x03\x00\x00\x02\x00\x00\ +\x00\x01\x00\x7f\x80\x01\x00 \x80\x00\x80\x10\x80\x00@\x08\ +\x80\x00 \x04\x80\x00\x18\x1a\x80\x00\x07\xe1\x80\x00\x00\x00\ +\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x1f\ +\xff\xff\xe0\x07\xff\xff\xc7\xe3\xff\xff\x9f\xf9\xff\xff?\xfc\ +\xff\xfe\x7f\xfe\x7f\xfe\x7f\xfe\x7f\xfc\xff\xff?\xfc\xff\xff\ +?\xfc\xfc\x7f?\xfc\xfc\x7f\xff\xfc\xfc\x7f\xff\xfc\xff\xff\ +\xff\xfe\x7f\x80\x7f\xfe\x7f\xc0\x7f\xff?\xe0\x7f\xff\x9f\xf0\ +\x7f\xff\xc7\xe0\x7f\xff\xe0\x04\x7f\xff\xf8\x1e\x7f\xff\xff\xff\ +\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x80\x00\x00\x04@\ +\x00\x00\x08 \x00\x00\x02\x80\x00\x00\x22\x88\x00\x00B\x84\ +\x00\x00\x9e\xf2\x00\x01\x00\x01\x00\x00\x9e\xf2\x00\x00B\x84\ +\x00\x00\x22\x88\x00\x00\x02\x80\x00\x00\x08 \x00\x00\x04@\ +\x00\x00\x02\x80\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff\xfc\x7f\xff\xff\xf8?\ +\xff\xff\xf0\x1f\xff\xff\xfc\x7f\xff\xff\xdcw\xff\xff\x9cs\ +\xff\xff\x00\x01\xff\xfe\x00\x00\xff\xff\x00\x01\xff\xff\x9cs\ +\xff\xff\xdcw\xff\xff\xfc\x7f\xff\xff\xf0\x1f\xff\xff\xf8?\ +\xff\xff\xfc\x7f\xff\xff\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x04\x00\x06\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x03\xe0\x00\x00\x03\xe8\x00\x00\x03\xe0\x00\x00\x03\xe8\ +\x00\x00\x00\x08\x00\x00\x01\xf0\x00\x00\x0c\x00\x00\x00\x0c\x00\ +\x00\x00\x00\x00\x00\x00`\x00\x00\x00`\x00\x00\x00\x00\x00\ +\x00\x1f\x00\x00\x00\x13@\x00\x00\x13@\x00\x00\x1f@\x00\ +\x00\x00@\x00\x00\x0f\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x0f\ +\xff\xff\xf8\x07\xff\xff\xf8\x03\xff\xff\xf8\x03\xff\xff\xf8\x03\ +\xff\xff\xf8\x03\xff\xff\xf0\x03\xff\xff\xe0\x03\xff\xff\xe1\xff\ +\xff\xff\x93\xff\xff\xff\x0f\xff\xff\xff\x0f\xff\xff\xc0\x1f\xff\ +\xff\xc0?\xff\xff\xc0\x1f\xff\xff\xc0\x1f\xff\xff\xc0\x1f\xff\ +\xff\xc0\x1f\xff\xff\xe0\x1f\xff\xff\xf0\x1f\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x01\x00\x01\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0e\x00\x00\ +\x00\x0e\x00\x00\x00\x0e\x00\x00\x00\x00\x80\x00\x00\x01@\x00\ +\x00\x00\xa0\x00\x00\x00P\x00\x00\x00(\x00\x00\x00\x14\x00\ +\x00\x00\x0a\x00\x00\x00\x05\x00\x00\x00\x02\x80\x00\x00\xc1\x00\ +\x00\x00\xc0\xe0\x00\x01\x80\xe0\x00\x01\x80\xe0\x00\x03\x00\x00\ +\x00#\x00\x00\x006\x00\x00\x00>\x00\x00\x00?\xc0\x00\ +\x00?\x80\x00\x00?\x00\x00\x00>\x00\x00\x00<\x00\x00\ +\x008\x00\x00\x000\x00\x00\x00 \x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xf1\xff\xff\xff\xe0\xff\xff\ +\xff\xe0\xff\xff\xff\xe0\xff\xff\xff\xf0\x7f\xff\xff\xfe?\xff\ +\xff\xff\x1f\xff\xff\xff\x8f\xff\xff\xff\xc7\xff\xff\xff\xe3\xff\ +\xff\xff\xf1\xff\xff\xff\xf8\xff\xff\xff<\x7f\xff\xfe\x1e\x1f\ +\xff\xfe\x1e\x0f\xff\xfc>\x0f\xff\xbc>\x0f\xff\x98\x7f\x1f\ +\xff\x88\x7f\xff\xff\x80\xff\xff\xff\x80\x0f\xff\xff\x80\x1f\xff\ +\xff\x80?\xff\xff\x80\x7f\xff\xff\x80\xff\xff\xff\x81\xff\xff\ +\xff\x83\xff\xff\xff\x87\xff\xff\xff\x8f\xff\xff\xff\x9f\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x01\x00\x01\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\x00\x00\ +\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\ +\x00\x00\xc0\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\ +\x00#\x00\x00\x006\x00\x00\x00>\x00\x00\x00?\xc0\x00\ +\x00?\x80\x00\x00?\x00\x00\x00>\x00\x00\x00<\x00\x00\ +\x008\x00\x00\x000\x00\x00\x00 \x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\ +\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff?\xff\xff\xfe\x1f\xff\ +\xff\xfe\x1f\xff\xff\xfc?\xff\xff\xbc?\xff\xff\x98\x7f\xff\ +\xff\x88\x7f\xff\xff\x80\xff\xff\xff\x80\x0f\xff\xff\x80\x1f\xff\ +\xff\x80?\xff\xff\x80\x7f\xff\xff\x80\xff\xff\xff\x81\xff\xff\ +\xff\x83\xff\xff\xff\x87\xff\xff\xff\x8f\xff\xff\xff\x9f\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x00\xc9\ +\x00\ +\x00\x0c\xbex\x9cc``b`dPP`\x00\x83\ +\x15<\x0c\x0cb@Z\x03\x88AB\x0e@\xcc\xc8 \ +\x01\x91\xe4a\x18@`<\x93\x04D\xba\xe13\xff\xff\ +g\x98I4\x22\xd5\x0a\x88\xf9g\x88C\xa3\xe6\x8f\x9a\ +?\x10\xe6\x13\x8f\xc8\xcbb4\xcc\xbf\xc3\x0e\xfc\x07\x83\ +!j\xfe\xa8\xe31\xcd\xa4\xb5\xf9\x103i\x142\xff\ +Q\x01\xad\xcd\xa7\xbaE45\x1c\xab\xf9T4\x1c\xd3\ +|\xea\x1a\x8ef>\xd5\x0dG6\x9f\x16\x863\xd0\xa5\ +\xc0\xa1\x9d\xe1C\x1a\x80\xc2\xfd\x01\x83\xfd\xff\x03\x0c\xf2\ +\x041H\x1d\x18\x00\xa9\x7f\xf2\x10\xfc\x07\xc8\xde\x03\xc4\ +3\xea\xff\xff\xef\x00\xe2\x06\xa0t\x03?\x10\x03\xe5\x1a\ +\x80\xe2\x0dP\xb1F n\x06\xe2v \xee\x07\xe2\xf9\ +\xd0\x04\x05\x00\x85\x1b/\xe1\ +\x00\x00\x00\x5c\ +\x00\ +\x00\x01Fx\x9cc``b`dPP``\x10\ +`\xe0d0`d`\x10c``\xd0\x00b\xa0\x10\ +\x83\x03\x103\x02!\x0840 \x00\x13\x14\x83\xc0\xff\ +\xff\xff\x19\x06\x1a\xfc\x87\x81\x1f\xf2\xd4\xc7\x0d\x8c\xff\xff\ +\x1f`\xfe\xff\xff\x01\xfb\xff\xff\x1f\xf8!b\x7f\xec\xff\ +\xff\xffW\x0f\xb7\x16\x00\xb3\x96jC\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x07\x00\x18\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x01\xe0\x00\x00\x01\x10\x00\x00\x01\x08\x00\x00\x01\x04\x00\ +\x00\x00\x82\x00\x00\x00A\x00\x00\x00 \x80\x00\x00\x17@\ +\x00\x00\x0b\xac\x00\x00\x05\xd2\x00\x00\x02\xc2\x00\x00\x01\x02\ +\x00\x00\x00\x81\x00\x00\x01\x00\x80\x00\x01\x00@\x00\x00\xe0\ +@\x00\x00\x10@\x00\x00\x08\x80\x00\x00\x07\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xfe\x1f\xff\xff\xfe\x0f\xff\xff\xfe\x07\xff\xff\xfe\x03\xff\ +\xff\xff\x01\xff\xff\xff\x80\xff\xff\xff\xc0\x7f\xff\xff\xe0?\ +\xff\xff\xf0\x13\xff\xff\xf8\x01\xff\xff\xfc\x01\xff\xff\xfe\x01\ +\xff\xff\xff\x00\xff\xff\xfe\x00\x7f\xff\xfe\x00?\xff\xff\x00\ +?\xff\xff\xe0?\xff\xff\xf0\x7f\xff\xff\xf8\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x11\x00\x0d\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff?\xff\xff\xff\x1f\xff\ +\xff\xff\x8f\xff\xff\xff\xc4\x0f\xff\xff\xe1\xe7\xff\xff\xf3\xf3\ +\xff\xff\xe3\xf9\xff\xff\xef\xfd\xff\xff\xef\xfd\xff\xff\xef\xfd\ +\xff\xff\xef\xfd\xff\xff\xe7\xf9\xff\xff\xf3\xf3\xff\xff\xf9\xe7\ +\xff\xff\xfc\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x07\x00\x0e\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\xf8\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xf7\xff\xff\xff\xe7\xff\xff\xff\xe7\ +\xff\xff\xff\x0f\xff\xff\xfe\x7f\xff\xff\xfe\x7f\xff\xfe\xfe\xff\ +\xff\xff~\xff\xff\xfe \x01\xff\xff\x00\x01\xff\xfe0\x03\ +\xff\xff~\xff\xff\xfe\xfc\x7f\xff\xff\xfc\x7f\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x18\x00\x00\x00\x14\x00\x00\x00\x12\x00\x00\ +\x00\x11\xf8\x00\x00\x10\x08\x00\x00\x10\x10\x00\x00\x10 \x00\ +\x00\x10@\x00\x00\x10\x80\x00\x00\x11\x00\x00\x00\x12\x00\x00\ +\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xe7\xff\xff\xff\xe3\xff\xff\xff\xe1\xff\xff\ +\xff\xe0\x07\xff\xff\xe0\x07\xff\xff\xe0\x0f\xff\xff\xe0\x1f\xff\ +\xff\xe0?\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ +\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x10\x00\x08\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03\xf0\x00\x00\x07\xf0\ +\x00\x00\x0f\xf8\x00\x00\x1f\xf8\x00\x00\x1f\xfc\x00\x00?\xfc\ +\x00\x00w\xfc\x00\x00g\xfe\x00\x00\x07\xf6\x00\x00\x0d\xb6\ +\x00\x00\x0d\xb2\x00\x00\x19\xb0\x00\x00\x19\xb0\x00\x00\x01\x80\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xfc\x0f\xff\xff\xf8\x07\xff\xff\xf0\x07\ +\xff\xff\xe0\x03\xff\xff\xc0\x03\xff\xff\xc0\x01\xff\xff\x80\x01\ +\xff\xff\x00\x01\xff\xff\x00\x00\xff\xff\x90\x00\xff\xff\xe0\x00\ +\xff\xff\xe0\x00\xff\xff\xc0\x05\xff\xff\xc0\x07\xff\xff\xe4\x0f\ +\xff\xff\xfe\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0a\x00\ +\x00\x00\x11\x00\x00\x00*\x80\x00\x18[@\x00\x14\x80 \ +\x00\x12[@\x00\x11\xea\x80\x00\x10\x11\x00\x00\x10*\x00\ +\x00\x10D\x00\x00\x10\x80\x00\x00\x11\x00\x00\x00\x12\x00\x00\ +\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff\xf1\xff\ +\xff\xff\xe0\xff\xff\xff\xd1\x7f\xff\xe7\x80?\xff\xe3\x00\x1f\ +\xff\xe1\x80?\xff\xe0\x11\x7f\xff\xe0\x00\xff\xff\xe0\x11\xff\ +\xff\xe0;\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ +\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x0f\x00\x0f\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00?\xff\x80\x00!\x00\x80\x00!*\x80\x00!T\ +\x80\x00!*\x80\x00!T\x80\x00!*\x80\x00!T\ +\x80\x00!\x00\x80\x00!\xfe\x80\x00 \x00\x80\x00 \x00\ +\x80\x00 \x00\x80\x00 \x00\x80\x00?\xff\x80\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xc0\x00\x7f\xff\xc0\x00\x7f\xff\xce\x00\x7f\xff\xce\x00\ +\x7f\xff\xce\x00\x7f\xff\xce\x00\x7f\xff\xce\x00\x7f\xff\xce\x00\ +\x7f\xff\xce\x00\x7f\xff\xce\x00\x7f\xff\xcf\xfe\x7f\xff\xcf\xfe\ +\x7f\xff\xcf\xfe\x7f\xff\xc0\x00\x7f\xff\xc0\x00\x7f\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x03\x00\x03\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x14\x00\x00\ +\x00\x12\x00\x00\x00\x15\xf0\x00\x00\x16\x10\x00\x00\x17\xa0\x00\ +\x00\x17@\x00\x00\x16\x80\x00\x00\x15\x00\x00\x00\x12\x00\x00\ +\x00\x14\x00\x00\x00\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe7\xff\xff\xff\xe3\xff\xff\ +\xff\xe1\xff\xff\xff\xe0\x0f\xff\xff\xe0\x0f\xff\xff\xe0\x1f\xff\ +\xff\xe0?\xff\xff\xe0\x7f\xff\xff\xe0\xff\xff\xff\xe1\xff\xff\ +\xff\xe3\xff\xff\xff\xe7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x06\x00\x06\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x01\xfe\x00\x00\x01\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01\x80\x00\x00\x01\x80\x00\x00\x03\x00\x00\x00\x03\x00\ +\x00\x00\x06\x00\x00\x00F\x00\x00\x00l\x00\x00\x00|\x00\ +\x00\x00\x7f\x80\x00\x00\x7f\x00\x00\x00~\x00\x00\x00|\x00\ +\x00\x00x\x00\x00\x00p\x00\x00?\xe0\x00\x00 \x00\ +\x00 \x00\x00 \x00\x00 \x00\x00 \x00\ +\x00 \x00\x00 \x00\x00?\xe0\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xfe\x01\xff\xff\xfe\x01\xff\xff\xff\xff\xff\xff\xff\xfe\x7f\ +\xff\xff\xfc?\xff\xff\xfc?\xff\xff\xf8\x7f\xff\xffx\x7f\ +\xff\xff0\xff\xff\xff\x10\xff\xff\xff\x01\xff\xff\xff\x00\x1f\ +\xff\xff\x00?\xff\xff\x00\x7f\xff\xff\x00\xff\xff\xff\x01\xff\ +\xff\xff\x03\xff\xff\x80\x07\xff\xff\x80\x0f\xff\xff\x9f\xcf\xff\ +\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x9f\xcf\xff\ +\xff\x9f\xcf\xff\xff\x9f\xcf\xff\xff\x80\x0f\xff\xff\x80\x0f\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x0b\x00\x09\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\x00\x00\x00\x18\ +\x00\x00\x000\x00\x00\x000\x00\x00\x00`\x00\x00\x04`\ +\x00\x00\x06\xc0\x00\x00\x07\xc0\x00\x00\x07\xf8\x00\x00\x07\xf0\ +\x00\x00\x07\xe0\x00\x00\x07\xc0\x00\x00\x07\x80\x00\x01\xff\x00\ +\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\ +\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\x01\x00\x00\x01\xff\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xe7\xff\xff\xff\xc3\xff\xff\xff\xc3\ +\xff\xff\xff\x87\xff\xff\xf7\x87\xff\xff\xf3\x0f\xff\xff\xf1\x0f\ +\xff\xff\xf0\x1f\xff\xff\xf0\x01\xff\xff\xf0\x03\xff\xff\xf0\x07\ +\xff\xff\xf0\x0f\xff\xff\xf0\x1f\xff\xfc\x00?\xff\xfc\x00\x7f\ +\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\ +\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\xfe\x7f\xff\xfc\x00\x7f\ +\xff\xfc\x00\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x00V\ +\x00\ +\x00\x01Fx\x9c\xc5\xc8\xb1\x0d\x800\x0cD\xd1\xef4\ +\x88\x0a*\xda\xa4\xa4d\x03\xd8\xcc\x8c\x9c\x0d\xccE\x8a\ +D\x01\x15\x0d\xdfz\xb2t\x900J\x81\x99\x91\xcd`\ +\x01V\xd1\xc4!\xa6k\x9d\xdc\xa5\xae\x15\x11\xfc]<\ +s\xd9+d\x99d\xe8?W\xd7\xee\xe1\x12_\xbcu\ +\x01\xec\xfbi\xe6\ +\x00\x00\x01F\ +\x00\ +\x00\x02\x00\x01\x00 \x00\x00\x10\x00\x11\x000\x01\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\ +\x00\x01\x00\x01\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\ +\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xfc\x1f\xc0\x00\x04\x10\ +\x00\x00\x04\x10\x00\x00\x04\x10\x00\x00\x04\x10\x00\x00\x04\x10\ +\x00\x00\x07\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\xfc\x01\xc0\x1f\xfc\x01\xc0\x1f\xfc\x01\xc0\ +\x1f\xff\xf1\xc7\xff\xff\xf1\xc7\xff\xff\xf1\xc7\xff\xff\xf0\x07\ +\xff\xff\xf0\x07\xff\xff\xf0\x07\xff\xff\xff\x7f\xff\xff\xfe?\ +\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xff\x7f\xff\xff\xfe?\ +\xff\xff\xff\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\ +\xff\xff\xff\xff\xff\ +\x00\x00\x00\xef\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc3\x00\x00\x0e\xc3\ +\x01\xc7o\xa8d\x00\x00\x00\x18tEXtSof\ +tware\x00paint.net \ +4.0.6\xfc\x8cc\xdf\x00\x00\x00mIDA\ +T8O\xb5\x8c\xd1\x0a\xc0 \x0c\x03\xfdt\xff\xbc\xb3\ +\x83d]\xa8\xd82\xf6p\xa2\xc7\x99af\x9fHe\ +\x87\xe7\xb2\xae\x15\xd0\xf3\xdf}Htb\xce\xb9\xbe\xc9\ +\x80\xcb\x0a\xdb\x01\x88\x13\xff\x0d\xec@\x08\xdc\xa5\x03.\ +\x15\x8dc\xcb7$DD\xe3\xccQBD4\xce\x1c\ +%DD\xe3\xccQBD4\xce\x1ce\x07|\xe6\x80\ +\xe3\xab\x15\xd0\x83\xd7\xa3\x8f\x8d\x0b\xd1.k\xedV\x14\ +\x8b0\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc2\x00\x00\x0e\xc2\ +\x01\x15(J\x80\x00\x00\x00\x18tEXtSof\ +tware\x00paint.net \ +4.0.6\xfc\x8cc\xdf\x00\x00\x00NIDA\ +T8O\xdd\x8c\xc1\x09\x00 \x0c\x03\xbb\xffT\xdd\xac\ +\x1a\xb0\x82\xb6*U\x10\xf4q\x8f\x5cBHD\x8ep\ +e\x04+\xb2\x02+\xa7XQ\xc6\xcc\x9c\xe3\xd8\xd5\xce\ +\x88\x7f\x0e<\xee\x1e`\xacl\x1f\xcc\x5c\xed\x8cx\xff\ +\x00`\xd8\x8f=\x07\x9a\x10G(\x01oN\x98?\xf6\ +\xff\xda\xc5\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xd4\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00\x09pHYs\x00\x00\x0e\xc2\x00\x00\x0e\xc2\ +\x01\x15(J\x80\x00\x00\x00\x18tEXtSof\ +tware\x00paint.net \ +4.0.6\xfc\x8cc\xdf\x00\x00\x00RIDA\ +T8O\xed\x8fA\x0a\xc00\x08\x04}\xba?\xb7\xce\ +a/a\xa1m\xbc\xe4\x90\xc0\x043\xd1\x05\xa3\xaaF\ +X\xf9\x07+\xa1\x0fW\x97\xfe_X\x09\x0a\xc8\xcc~\ +\xfa\x1e\xb0R0<\x0a\xf8\x82\x95\xa0\x15V\xbfb%\ +(`{\x85\x1bpB\x000<\x0ax\xa7\xe2\x01V\ +T\xcf_\x16\xfbf\x81\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x03\xea\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x93\x00\x00\x00\x15\x08\x06\x00\x00\x00B\x0c\xdc\xd0\ +\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\ +\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\ +\x09pHYs\x00\x00\x0b\x11\x00\x00\x0b\x11\x01\x7fd\ +_\x91\x00\x00\x03\x7fIDAThC\xed\x9a\xbbN\ +*Q\x14\x86\x07Cb,\xec}#\x1e\x81\xc6\xca\xbb\ +!\xbe\x81\x8d\x8d\x8d%\x0d=Zig\xb4\xd0\xc4H\ +c(H,\x88\x85Zx\x04\x04\x01\xaf\xf1\x0e\xe2\x92\ +o\x9d\xb3\xf7\x19\x07\xf4\xe4h5\xb0\xff\xe4\x97q\xad\ +=4|\xf9\xf7\x9a\x0d^,\x16\x93n\x9e\x9e\x9e\x96\ +\xa9\xa9)\x99\x9c\x9ctvV\xc3\x03\x5ct\xe3\x05w\ +\xc0\xb4\xbe\xbe.\xa7\xa7\xbf\xda>\x95\xf3\xf3s\xb9\xb8\ +\xb8\x90\xeb\xebk\xb9\xb9\xb9q\xeeS\xf3\xf9\xc3\x01<\ +\xc0\x05|\x04\xb9\xc1\x16& :;;\x93B\xa1 \ +\xb5ZMnoo\xe5\xe1\xe1A\x9e\x9f\x9f\xa5\xd1h\ +8\xf7\xb9\xe1\x00\x1e\xe0\x02>\xe0\x04f:`\xa2X\ +n\x83T*\x95\x94\xc2\xc7\xc7G}\x83V\xab%o\ +ooj\xa7\xfe\x95a\x00\x1e\xe0\x02>\xe0\x04^\x08\ + \x0b\x13 U\xabU-\x12i\x10\xf8\xfa\xfa\xea\x00\ +\xeaS\xb1\x9d\xe5\xf3y\xc9d2\xb2\xb9\xb9\xa9\xde\xdd\ +\xdd\xd5\x1a=\xbf\xe0\x05nLB)L\x14 \x0d\x90\ +\xa0\x0f\x98\x9a\xcd\xa6\xec\xec\xec\xc8\xd2\xd2\x92\x0e^\x98\ +kj\xf4\x9czO\xc7\xc7\xc7\xb2\xbd\xbd\xadpt3\ +=\xd6\x98\xa0\x81\x17\xb81@y\xa4\x12{ \xd1e\ +\x12\x09XVVV$\x1e\x8fw5=\xd6\xb8\xf4\xea\ +\x1d\x01\xc9\xc6\xc6F\x07@A\xb3\x86\xb5\xb0\x82\xe1\x06\ +~\xe8y\x95JE\x87*\xf6B\xe0\xc0\x10\x0843\ +33\xb2\xba\xba*\xc5bQ\xcd55z\xac\xe1\xcd\ +\x9c\xc2/\xb6/\x7f\x22\xed\xed\xed\xd9\xebn5\xd6r\ +\x0f\xac\xc0\x0d\xfcP\xd7dbJg{C,X\x5c\ +\x5cT`\x80'(j\xf4XC\xcc\xb9t\x0a\xbf\x98\ +\x87\xfc\xd0\xa0\xc3\xc3C[\xe3\x1a\xf9\x81\xe2\x1e\x047\ +\xf0C\xcd\x830?\x144'&&\x14\x18\xd2((\ +j\xf4Xs\x7f\x7f\xef`\xea\x011`\x1bH\xb0\x81\ +\x87W\xff\xb5\x7f\x0d\xf7 >\x7f\xf8\xa1\xe6]^^\ +\xca\xcb\xcb\xcb\x07\x98\xc6\xc7\xc7\xff\x09\x13k\x887\xa7\ +\xf0\x8b'6?(\xd8@\x84\x82 a\xeeAp\x03\ +?\xd4<\xa6q3/!`ZXXP`\xbe\xda\ +\xe6X\x03Lf{t\x0a\xaf~\x0a\x13\xfcP\xf3\xae\ +\xae\xae:\x92\xc9\x00\xf3\xd5\x00\x9eN\xa7\xe5\xee\xee\xce\ +\xde\xe7\x14^}g\x9b\xe3\x1c\x0a}H&\xb69\xff\ +\xcc\xc4+\xe7\x06\xc9dR\xa1\xf9\xcc\x89DBO@\ +]2\x85_?\x19\xc0\xe1\xc5\xceL\x0c\xe0L\xe3\x9e\ +\xe7\xd9&\x89srr\x22\xcb\xcb\xcb2??/c\ +ccj\xaeS\xa9\x94M\xa7\xb9\xb99==7 \ +:\x85S\xdf=\x1a@\x84\x89}\x9ac\x9b\xe3X\x1c\ +\x98\x0cP\x9c\x1f\x01T\xb9\x5c\xd6\x03\xaa\x83\x83\x03\xf5\ +\xd1\xd1\x91\xfe\x9f\xcdfevv\xd6\x02\xc5\xa1\x95S\ +\xb8\xf5\xdf\x87\x96\xad\xdfg\x92\xccK\xf0CO\xe9!\ +\xa6\x86\x86\x86d``@\xd6\xd6\xd6\xf4\xcd\x01\x8a:\ +\x8f\xff\x0c\xda\x18\xc00i\x94\xcb\xe5\x14\xa8\xd1\xd1Q\ +\x85\xcb)\xfc\x02\x12\x7fB\x05M\xcf\x80\x84`\xc4\xa4\ +\x92\xfd\xd5\x00\xc0\x0c\x0e\x0e\xdat\x1a\x19\x19\xd1\xc5\x9f\ +\x09\x22\xeb\xf5\xba\xec\xef\xef\xcb\xd6\xd6\x96\x90nN\xbd\ +!\xb6/\xe6!\x86r\x9e\xd8\xb0\xf9\xa2\xb7\xde\xee5\ +\x9a\x7fgd3+\xd9_\x0d\xf0\x07\x0d\x0f\x0fK$\ +\x12\x91h4\xaa\xaff\xcb\xfbLL\xf0\xc4\x1b =\ +==\xfd\xa9:\xf5\xba\x08\x12\x12\x89\xcf\xdc\x0f\x92\x85\ +\x09\xd3\xe0\xcc\xa9V\xab* \xec\x85\x0cW\xdc\xec\x06\ +\xec\xfe\x96a\x00\x1e\xe0\x82Q'\x08\x12\xb609;\ +\xff\xcc1y\x07P\x7f\x17\xd6Q\x02K\x02\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01\xbb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc9V%\x04\ +\x00\x00\x01\x82IDAT(\x91\x8d\xd2O\x88\x8eQ\ +\x14\x06\xf0\xdf7\xf3\xa6Qc#\xb1\x9b\xbe\xc6\xd0,\ +,&\x1dM\x8aI\xa9Ql\xecg\xa1H2J\xb3\ +\xb2\xb4\xc5\xdeJ\x91\xb5\xa6\xc8\xbf\xa5P\x16rD\xb1\ +\xa0\x11\x92\x92\x05if\xc1\xa4)\x8b\xf7}\xa7\xfb}\ +>\xe5Y\x9d{\xcf}\xce9\xf7yN\xc7\x7f 3\ +Gq\x0a\xdb#b\xbe\xbd\xaf\x9a\xe4\x16\x8c\x16\xefW\ +\x22\xe2[fV8\x8e1\x5c\xc1\x91\xa2\xe0H\xa7\x09\ +\xf6a\x02\xd3x\x8aw\x98\xc5\x14~c\xa5(<\x8c\ +M\xd8\xda)*m\xc0\x09\x1c\xc5$\xae\xe3E\xdf\x0f\ +f\xf0\x18\x9b\xf1\xbd\xca\xcc\xcb\xf8\x899\xbc\xc7%\xdc\ +\xc78\xe6\xf1*\x22\xae5\x0d\xba\x11q+3\xbb\x98\ +\x1a\xc2g,#\xb0\x18\x11w\x22b\x0d\x8bX\xc0\xd5\ +\xcc<4H\xc8*\x22.\x16\xa3\x97\xb9\xc9\x22\xde\x9f\ +\x99\x0f0\x91\x99\xc3\xed\xe5\xd0\xa0\x8a\x0d\xde\x16\xf1K\ +\xdcS\x0b\xfa\x05\xc7z\xc8\x99\xb9\x13\x072s.3\ +\xf7\xe2\x1c\x96p\x13\x9fp7\x22\xf6\xe0\xb4\xda\xb2\x91\ +\xaa\xa8\xbe\x80\x8f8\x8b\xdd\xf8\x85\x0b\xb8\x81\xd5\xa6\xc1\ +\x13\xb5\xa5\xb7\xf1\xbc\x1c\xfb\x07\xb6E\xc446\xe2\x0d\ +\x0e\xab}\xff\x80nC\x9a\x8d\x88\x93\x11\xb1T\xfa\xbc\ +\xabI\xee\x88\x88\xb5\xcc\x9c\xc1\xa36\xdd\x8c\xdc\x83\xf5\ +\xce\x11\xf1\x1a\xcb\x8dM\x1aqZ\x8c\xf7\x13\xfb\x05\x1b\ +S/I\x8b\xce?\xe2\xbf\xc9\xf8\x8a3\xc5\xf9Y\x11\ +\xf7,@\x8bu\xb5#bU\xeda\x8b\x87\xea-;\ +\x88\xf3\x83\xc8\x7f\x00k\xb9|\xe7dF#\x7f\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\x01\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x12\x08\x06\x00\x00\x00\x84\x9e\x84\x0f\ +\x00\x00\x00\xc8IDAT8\x8d\xa5\xd3=N\x031\ +\x10\x86\xe1gQ\x02]\xe8R\xf3\x97\x0e\xaa\xbd\x12E\ +.\x10J\x84\xc4=\xd2%\x12\x15\x11\xe7\xd8\x8d\x10\xa2\ +\xe5 H\x88M\x11G\xdaX\xded1_7\xdf\xe8\ +\x9d\xf1\x8c\xed\xa2i\x1am\xd5u-\xd2\x19\xbec\xb3\ +,K'\xb1\x99\xd0\x03\xceS\x89>\xf0\x04W\xb9\xf0\ +\xf5\x7f\xe0\x9b\x5cx\x841.s\xe0]\xc7,x\x12\ +\x15\xd9\xd3\xa0\x03\xba\xc3\x10\xb7!\xbe@i;\xffJ\ +\xb8\xf7.x\x88\x0aE\x88OC\xfc\x8a\x97c\xc7^\ +\xe3-\xf2~\xf1\xd86\x0e\xcd\xfc\x84\xf6\xdb]\xe2\xb3\ +/\xfcn;\x1f\xfc\x84b{:\xb6\xed]\xf79\xbe\ +\xfe\x0a\x7f`\x81\xe7T\xb2k\xdbm\xddK|I(\ +\xaa\xaa\xea\xc1\xa75\xc0\x14\xb3\x1cx\x03\xb2\x99!K\ +\xef\xfb\x80\xb9\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x02\x1e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x18\x00\x00\x00\x11\x08\x06\x00\x00\x00\xc7xl0\ +\x00\x00\x01\xe5IDAT8\x8d\x95\xd4]h\x8ea\ +\x18\x07\xf0\xdflIQC\xf2q\x22\x8a\x92\xe2\xd8G\ +!\x0e\x97\x16j\x07D\x88\x94R\xcb\xe7\xa2\x9c\x8d\x92\ +\x906\x16K\xf9\x96!\xc7\xac\xa4\x90\x83\xb7)\x07r\ +\x22\x12\xcd\xc1\x88%\x8b\xf9:\xb8\xafw\xef\xd3\xb3g\ +\xeb\xdd\xbf\x9e\xee\xfb\xbe\xee\xeb\xb9\xfe\xd7\xe7]S*\ +\x95\xea\xf1\xd5pl\xc2\x0d\x5c\xc7\xc6\xdc\xddy\xec.\ +\xf8g\x18\xc6\xe1\x07\x9a\xb0\x03\xbf\xf0\x1d\x9b\xf1$t\ +\xce\xe2p\xec\xbbC\xb7\xb3\x1a\xe3P\x87At\xc5y\ +:\x8ea1\xae\x85\xac\x84\xd3\xf8\x8c-\xe8\xad\xd6x\ +9\x82,N\xe0\x19\xf6bY\xc8Z\xb0\x14\xbb\xc6j\ +\xbc\x88\xe0Ox9\x80\xcbX\x81\xa3\xb8\x82\xbb\x19\xbd\ +\x16\xfc\xcb}\x0dq\xf72+\xcf\x13\xc0\x1b\xec\xc3<\ +<\x0c\xaf\xf7\xe4t\xeeK\xb5x\x1f\xe7\xfd\xe8\xc9\xec\ +\xbbc\xdf^D\x00\x17\xc3\x93\xf1hC\x7f\xee\xfe\xb5\ +T\xb7\x8e8ORI\xdf\x03\xcc\xc0_\xb4\x8eD\xb0\ +\x06\x8bB\xe9\x10f\x8e\xe2\xc8\x00\xb6\xaa\xa4{v\xfc\ +\xfb\x14\xbdE\x04\xf5\xb8\x84W\xd2,L\x93\xda\xb2\xa6\ +@\xb7\x0f71\x07\xabC\xb66\xd6;\x0c/2\x9c\ +\xc1\xac\xf0\xea\x96T\xe0\x06\xec\x1c!\x8a\xb6X\xb7\xc5\ +\xbaN\x8a\xbc\xab\x88\xa01\x0c\x1f\x97\xfa\x1f\x9a\xf1\x01\ +\xa7\xa4\xc2\xe7\xf1\x02\x8f\xb1\x1e\xf3\xb1J\xa4\xa7LP\ +\x8b)\x11f\x87T\xc0\xf6\x90\xc3O\x1c\xc4D\x5c\xc5\ +TL\xce\x91\x9c\xc3\x04)-\xb5\xb1*\x13,\xc4\x17\ +\xbc\x95\x8a\xb9\x00\x9fB\x0e'\xa57\x09\x96H\x13\xfd\ +.Gp\x0f\xad\x98+\xa5ghf\xea\xa4^n*\ +\x08\xbd\xdc\xe3\x9dx\x94\xbb\x1b\xcc\x9d\x7f\xe36\x8eH\ +3\xf01K\xf0M\xe5-*B\x8f\xca\x10\xe5\xb1]\ +\xea\xb6\xe78\x10\xb2\x0bY\x85\xbaQ\x0cW\x83f)\ +\xbd}\xd8 \xbd\xc0\xd9'\xa5\xb0M\xc7\x82~\xac\xc4\ +r)\x95\x8dR\x0d\x86\xf0\x1f\x84\xf8v\x1d=\x86M\ +P\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01p\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x12\x00\x00\x00\x12\x08\x06\x00\x00\x00V\xce\x8eW\ +\x00\x00\x017IDAT8\x8d\x9d\x93\xc1J\xc3@\ +\x14EO\xa2\xa0\xa0\xa2\x05\x11\xba\xf3#\xde\xd2\x8d\xf4\ +\x1b\xc4\x1fp'\x88\xa0\x82Pp\xa3\xa2;\xc5\x95\xee\ +\x14\x7f\xe7\x82\x1f\xe1\xc6\x8d\xa4P\xb5\x9a\xb4\xd5E_\ +a\x88IF\xbc0d\xde\xcd\xc9\x9d7a\x06\x22\x92\ +\xb4#i/\xc6\xcd\xc6\x00\xe0\x02\x98\x01n\x9a\xa04\ +\xd6\x0d\xb0\x0a\xb4|\xfe\xbf \xef\xa6j\xfe\xf7 I\ +\x9d\xa0\xfc\x06\x0aI\x9b\x91\x85\xeb%i \xe9#\xc6\ +\xfd\xeaH\xd2v\xc9\xfa\xf4\x112\x07\x92\xe6+\x83$\ +\xedK\xca\x80\xdbR\xd0\x08(J\xde!\xd0\x93t)\ +)\x05H$\xed\x02g\xc0J\x00\x0e\x81\xdcC\x16\x99\ +\xfc\xa3w&\xc7`\xce\x9fS\xbd\x01\xdd\x14x\x02^\ +K+\x0e\x80\x9e\x8f\xb1\x07\xf5\xdd\xcf\xbd\x9e\xea\x0b\xc8\ +\x92`k\x1d\xe0\x0eh\x9b\xd9B\xe0g@afk\ +\x81\xf7\x0c,\x03'fvM\x95$m\x94\xea\xbe\x87\ +\x85\xdeV\xe5\xc7M\x92\x94K\x1a\xc4\xb8\xa4\xee\x85_\ +\x89.\xb0\xee\xd6\x0bplf\x0fU|\xd3\x15\xb9\x07\ +\xdaA\xbd\x04<\xd6\xc1\xb5Af6\x04\xae\x02\xeb\xd4\ +\xcc\xc6u|\xed\xd6\x00\xfc\xb0\xf5\x81\xdc\xccZMl\ +\xe3\xed\xf7\x0e\xce\x81\xa3&\x0e\xe0\x07\x81\x1e\x7f\x14\x8c\ +;\xe7\x95\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01{\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x12\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1b\x06/\x5c\ +\x00\x00\x01BIDAT8\x8d\x95\xd3?K\xdbQ\ +\x14\xc6\xf1OB\xaa\x9bb\xfd\xb3IQ\xc8(\x08\x97\ +:\x1b\xa8\x9d\x5c\xb5\xd0\xcdEqt\x93\x80\xef\xa0o\ +\xa0N.\x0e\xba\xd61\x10p\x90\x0a\xbf\x0cm\x17\xb3\ +\xb8\xb8H\x15u\x8a\xa0`\x1c\xe2\ +\x06\x15\x9c`$\xa5t\x05\xc5\x1c\x90\x11\xccD^\xc6\ +%\xfe\xbf\x1e\x96r\x80\x86P\xc5'\x1c\xe3\x0b4\x1a\ +\x8d:\x96\xf3\x80\xae\x03\x92\xd0\x88\x05\x8b8(\x0c\xd8\ +\xa3\x02\xbec\x12-L\x04T\x00k\xfd*\xaa\xa0\x1e\ +y\x1b\xfb]\xe0RJmz7{\x12\x9b\x91\x0f\xf5\ +\xf0\xb4c\xe9\x07\x1aG\x0d\x19\xf6\xfa\xc0\xde\xa2\xdb\xd5\ +fq\x869/\x8d-\xe1a\x10\xd02\x8eB\x7f\xc0\ +\x1a\xa6p\x8b\x0d\x0c\xe3g\x9c\xef\xe8\x98\x9d\xce(\xe2\ +\x17\x96B?\x06d=*\xdb\xc5\xbf\xd0\xeb\x98\xeeU\ +Q!\xcb\xb2\xc3\xc8\x7fx\x9f\x93Y\x5c\xe07F\xf1\ +5<\xb5\xa8\xf4/\x9a\xb17\x81\xfb\x12Vc#\x0b\ +\xc8\x06\xb6\xb1\x82C\xfc\xc1|\x17O\x13\x0b8E9\ +\xcf_\xeb\x16\xafC\xa9\xe8}\x1e\xb60\x86\xcf\xa1\xbf\ +\x85\xae\x0e\xe09\xef|\xfe\x16\xee\xf0\x14\xfa)t\xab\ +\x9f'\xa5t\x07\xcf)mR\xad\xb7y\x8e\x81\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02,\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf01\x94_\ +\x00\x00\x01\xf3IDAT8\x8de\xd3K\x88\x8fa\ +\x14\x06\xf0\xdf\x7f\xfc\x95\xb0@\x22\x9a\x92{\xe4\x9aS\ +\x9a\x85\xb2\x125R\xee\xa5L)\x16\xa6\x90\x8d\xb2D\ +\x12Rl$\xc9(I.Qr\xbf\xaf\xa4\x8e\x14\xd1\ +\xe4R\xc8\x06\xc9%\xb7$,\xbeW}\x8dSo_\ +o\xe7;\xcf\xfb<\xe79\xa7\xa1Gd\xe6h\xac\xc1\ +\x1c\x8c\xc1\x1f\xf4\xc2C\x9c\xc6\xc1\x88\xf8X\xafi\xa9\ +\x15\xf7\xce\xcc\x9d\xb8\x83N\xbc\xc5R\xdcB_\x1c\xc5\ +(<\xcd\xcc5u\x90F\x01\xe8\x8bs\xf8\x8c\x09\x18\ +_\xf2kq\x11\x0b1\xb5\xb0\x9a\x82\xa18\x1b\x11\x9d\ +u&\xc70\x02W\xf1\x18\xaf\xb0>\x22\xf6G\xc4\x0b\ +\xfc\xc4Jt`:V\xa0-3;\xa1\x91\x99m\xb8\ +\x81O\x18\x19\x11\xdf3s\x11N\xe15\x9e\xe1:\x96\ +a\x12\xeeEDd\xe6\xf4\x22\xbd\xb5\x05\xdb\xd1\x07;\ +\x22\xe2{a\xb6\xa4|[1\x1bG#br\x91z\ +937`0\xbebs#3_c\x0b\xc6\xe1\x01\ +\xba\x0b\xb3~\x05\xa8;\x22&\xd4\x0c8\x8b\x05\xe5z\ +\x18\x93\x9a\x18\x80\x13\xf8P\x12\xcf0\x11\xf3\xcay\x92\ +\x99\xcd\x88\xf8\xe5\xff8\x8e\xad\xcdri\xd6\x12\x8f\x22\ +\xe2\x15\x0e\xe0@fvcca\xfc\x02\x17\xf0\xa3<\ +\xf4\x05?Z\xf0\x06]\xd8\x8d\x9b\xb8_\xa3>Ye\ +w/\x95{\xad\xd8\x13\x11\xcb\xb1\x17\x97\xf0\xb1Y\xa4\ +tFD{)\xec\xca\xcc{8\x89\x81=\xe8o\xab\ +\xc9Z\xa22\xe4H#3\x87\xe0)fFDwf\ +v\xa9\xe6\x01\x16\xe16\xc6b\xbe\xaa\xd9\x0f\xf0\x5c5\ +\x9c\xdf0\xbc%\x22\xdeb\x03\xceg\xe6*\xf4\xae\xbd\ +\x9c\x11\xf1^5|\xab\xb1\x1e\x87\xd0^\xfa\xd2\x1e\x11\ +\xbf\x1b5\xfd\xeb\xb0\x09g\xb0\x0b\x8b1\xab\xa4\xaf\x14\ +\x80q\xb8[\xfa\xd3\x11\x11W\xa8-`D\xec+\xf4\ +g\xa8\xf6%0\x0c\xfd\x8b\x0b\xd7\xf0\xae\xb0j\xfb\x07\ +@Y\xc0\x9e\x91\x99\xd30W\xb5\xb5\x83J\xf1C\x9c\ +\x8f\x88\x97=\xff\xff\x0b\x84C\xb2\xa8\xaa\xc4\xf2\x0e\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x00\xee\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0a\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x907\xff\x05\ +\x00\x00\x00\xb5IDAT(\x91}\xd0\xa1\x8aBQ\ +\x14\x85\xe1O\xb9\xcdd\x9b\xeek\x08\xbe\xc7X\x0c:\ +\x08\xfa V\x1f@\xb1h1\xcc4\xc1l\xbc0\xc1\ +7\x10\x83ED\xc3\x14\x83\x96s`s\xb9\xcc\x82\x13\ +\xf6f\xb1\xfe\xb5O\xa3,\xcbO\xac\xfd\xafY\x11\x86\ +\x01\xfe\xc2\xdc\xc0\x1c\x1f8F\xe3\x0f\xeea\x9e&\xd3\ +\x0e\x9b&N\xd8\xe2\x19L\x1d\xccp\xc3\x17\x148\xa4\ +\x17\x91\x0b\xb4R\xea\x19\x9a5\xc5'\xe8%\xe4*/\ +\xab\xc6\x8c\xbcgdV<&\x22\x87\x19Y\x97\x98\x91\ +{,\xab}rbF>0\xc2+x\xc6\xb8\x145\ +\xc8S%\xac/}\xf88!\x0f\xf8F\xbb\x8eZ\xa0\ +\x9b\x16]\x5c\xab\xdd\x92~\xdf\xc4\xcd&:\xc3\xef\xf7\ +E\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x015\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0f\x08\x06\x00\x00\x00;\xd6\x95J\ +\x00\x00\x00\xfcIDAT(\x91\x95\xd0\xcf*D\x01\ +\x14\xc7\xf1\xcf\xcc\xcaB<\x06YX\x9d\xe6\x09\x94\x12\ +SJ\x9a\x97\xb0'\x8bY\xc8+XY\x121\xfe\x16\ +\x1b;ew\x1e@\xd9YX\xb0A\xd9\x10c\xe1\xca\ +\xedv\xa7\xc6os:\xe7\xf4\xfd\xfdN\xa7\x91\x99\xab\ +\xf8\xc0aD\xdc\xfb\x87\x1a\x99\xd9\xc1\x1e\xfa\xb8\xc1\x01\ +\x8e\x22\xe2a\x18x\x14O\x18)\xcd\xfb\xb8\xc6>\x8e\ +#\xe2\xb1\x16\x86\xcc\x06Z\xa5\xb1W#\xc4HW\x92\xccZ\xcf5\x97\ +i|8\xb0\x14h\x0e\xcc\x06^\x06\xb6\x03#\xf0~\ +\xfdU\xf5@aq\xa2\x8d\xf7\xfe\x00p\x13\xf0\xb8\xb3\ +\xe6\x9bx(\x80M\xc0 `\x82\xb3f\xd1U\xf1\x80\ +\xf7\xfe-\xa0-0/e\x1c\xc0Y\x03\x88\x22\xe0_\ +`Faq\x22+}M:@\xfc\xca\xf1\xc0?\xc0\ +{\x99\xeb\xce&\x0f\x03K\x80N\xde\xfb\xe7\xb3\xd1\xd9\ +`\x08\xa4\xd2\x03\x08q\xed\x07\xb4\x8f\x06\x0f\x03'\x80\ +\xe1\xc02g\xcd\xd8K\xec\xed\x05T\x02\xbb\x81\xbd@\ +\x0f\xa0\x03p\x168\x00\xac\x13B\xcc+\x8b\x89*\x00\ +\x0a\x8b'u\xf6\xbe\xee\x1d\xe0]g\xcda\xa9t\x0d\ +!\xc1\xceE\xa37\x12J-E\xe7\x81\xcd\xc0\xa7 \ +\x968\x9bD*\xdd\x1f(\x06F\xc6C\xa7>\xae6\ +\xeah\x09\xb4\x89\xbc\xfd\xc0@g\xcd\xef1\x04~p\ +\xfc\xe2\x1f\xa5\xd2}\x9d5-\x80\x02\xef}\x0bg\xcd\ +\xad\xce\x9a\x9b\xbd\xf7\xad\x81\x83@\x0d\xb0\x03x\x04X\ +\x0c\xbeZ*\xbd\x03\xd8\x0a\xbc\x12\xc3\xba?\x1a\x1a\xeb\ +\xaci\xee\xac\xe9\xec\xaci\x8b\x10]\x81R\xe0.`\ +Qz\x0e\x5c\x1b\xc7N\xc0\xf7R\xe9!\xce\x9a/W\ +\x94.\xb8\x18+!N\x01]\x81]\xce\x9a<`*\ +\xe0\x09\xd5\x90\x1b\xc5*\x81{\x81\xe9q\xde\xa5^\x8e\ +\x94$\x8f8k\x14\xf0\x0bP \x95n0\x09o\x00\ +\xd6I\xa5'\xd4K\x16!\xee\x8f\x07>-\x95\xdeD\ +\xa8\x7f\x80\x95\xc0\x9b\xc01\xa07\xb0\x0f\x18\x10\xd7z\ +]\x22\xf7\x0e\x03\xcd\x80\x8e\x97\xaa\x82k\x80\x85R\xe9\ +\x0fR\x0c\xef\xfd\x9d\xf1\xef@B\xad\x7f\x0d\xf4u\xd6\ +\x8cv\xd6\xcc\x11B\xdc\x02L\x8b\x8au\x94\xed\x9e\xa9\ +8\x96g?\xa0\xcaYs\xbc\xb12|C*\xbd\x22\ +\x96_N\xe4\xfd\x09\x14:k\x06;k*S\x82e\ +%I\x9c5\xb3@\xf4\x04R\xdd\xb0\x8fT\xba^\xb5\ +x\xef_\x8fa[\x09\x17\xaa \xf1\x82\xf7\xfe\x93\xff\ +9\xc8fg\xcd\x00\xa9\xf4d`\xb7\xb3\xe6B\xbb-\ +,Nt\x00r\xcaJ\x92\xbb\xd37H\xa5\xf7\x00w\ +\xc7\xe9\x82\xe8\x95n\xc0\xcf\xd1K=\x9c5\x87\xb2m\ +D\x0fK\xa5\xf79k\xe6\x0a!\xd6\xa7\x19\x19\xe3\xbd\ +?\xea\xbd\xdf%\x95\xde\x94\xd1\xfd\xaa\xe2\xf8\x1b0\x11\ +\xf8\x22\xfeZ\x01S\x9c5\x87R\xb1\xce\x96\xbaK\xa5\ +\x97\x96\xd5G\xba\xf7\xe3\xd7\x00\x0c\xf2\x9eQikg\ +S|\xe0;`\x18\xa1Z\xca\x9c5\x1f\xa6\x84\x9a\x8a\ +\x05\xe73\xe6u\x8d\xcc!4\xb4\x96\x97\x92i\xca\x01\ +v9k\xc6e\xf0^\x03\xce\xc4\xff\x1b\x84`u\xda\ +Z\xca\xe8\xb7\xc0\x83\xc0\x1a\x02d\x17I\xa5_m\xea\ +\x016:kr\xa5\xd2oK\xa5\x87\xa5\x98\xce\x9a5\ +@\x8e\x10\xe26g\xcd\x90\x8c\xf0\xb4\x8fcW`\xbe\ +\xb3f\x04\xf0,P\x0d\xcc\x91Jw\x86\xd8\x01{\xe5\ +\xe5\xf7!\x80LCT\x0a\x8c\xcc\xcd\xcb\xd7\x84\x98\x0f\ +\xcd\xcd\xcb?\xb1\xb3\xa2|;\xc0\xce\x8a\xf2\x9a\x9d?\ +m=\x99\x12\x96Jw\xcb\xcd\xcb\xff\x8cP\xebg\x80\ +\x22g\xcd\xbc([\x9d\x9b\x97\x7f\x1ax\x06h\xb6\xb3\ +\xa2|Cc\x1e\x98\xe9\xacQ\x01\xeb9\x1ay\xad\x81\ +\xc5R\xe9-R\xe9\x87.\x1aN \x95\x9eE@\xc1\ +\xc7\x22\xbb\xc2Y\xb32]\xa1\x10b\x01p\x12\x18\x0d\ +\x1738\x93j\x81\xf1\xce\x9a\xd2\xb4\x8d\xfb\xbd\xf7\x00\ +\x1b\x09\x19^\x00l\x91J\xaf\x03~\x00?\x09hG\ +hT\x06\x98L\xe8\xf9\xf5\xa8\xac$\x89Tz\x1b0\ +X*\xdd\xa6!\x0fT\x03O\xa6\x1b\x07\xf0\xdeW\x10\ +2\xb8\xa3\xb3f(0\x85\x00FO\x033\xa2\xf1J\ +\xe0>B\xb2A@\xcd\x86\xe8v\x02\xaa\xfe\x9d\xf2@\ +m\x1c\x8f\x00O8kvK\xa5G\x01\xab\xa2\xfb!\ + \xe5!\xe0\x1e\xa9\xf4^\xa0g\xe4W\x11\xe0\xb7?\ +\x01\x8c~%\xe0?@\x95T\x9a\x94\x0e\xa9tw`\ +&\xa1#\xaer\xd6\xc4V\xfc\xe2\xa4\x1c_W7\x15\ +\x98\xed\xac9&\x95>\x97\x16\x9ej\xe0zB=\xa7\ +\xa8\x06\xf8\x0aX*\x84X^V\x92D\x16'r\xf1\ +\xbe\x18\x18E\xc8\xfc\xf4\xdb\xd6\xe9\xb8\xff\xba8\xdf\x85\ +\x10\x8f\xba\x92\xe4\x89\x86\xafd\xc5\x89\x07\xf0\xfe%B\ +&\xb7#\x5c4\x0f\x02\x7f\x01c\x80\xe5\xce\x9a\xa2\x06\ +\xf7*\xdd\x9b\xd0\xef+\xe3\xd83\xea\xa8\x8d\xdeY+\ +\x84XT\xefJ\x96-\x8d\x1e7\x11!\xc4\x1f\x044\ +\xeb\xe2\xac\xa9\xca\x94\x91J/\x04&\x10\x10\xd35\xa6\ +\xb3I\xad8\xde\x90\x16\x12\xba\xdc\xf4\xccu\xa9\xf4\x1d\ +\x80\x02\x8e\x08!\x1a5\xde\xe4\x03\x00\x08!\xe6\x02\xc7\ +\x81\x84T\xfa\xa94\xe3\x00\xcb\x09q\x9eV\x96\xe5\xf3\ +\xec\xb2\xde\x86R\xe9\x02`-\xa1,?\x22@\xeex\ +\xc2}\xf0sg\xcd\xf0lu]\xd6\xdb0^H\x9e\ +\x03N\x01\x09`~4\xbeL\x08\x91\xb5\xf1\xcb\xf6@\ +\x9a' `H\xeay\xbe\xa7\xa9:\xfe\x03\x5c\xaa\xea\ +&\xfd\x17M\xd2\x00\x00\x00%tEXtdat\ +e:create\x002016-01\ +-08T15:18:18+00:\ +00\x01E\x99\xf0\x00\x00\x00%tEXtda\ +te:modify\x002016-0\ +1-08T15:18:18+00\ +:00p\x18!L\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x00\xce\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0c\x00\x00\x00\x0c\x08\x06\x00\x00\x00Vu\x5c\xe7\ +\x00\x00\x00\x95IDAT(\x91\x9d\xd0\xb1\x09\x02Q\ +\x10E\xd1\xb3\x22\x08\xb6a,\x98\xd9\x80\x81\xa0e\x88\ +\x91%\x18Z\x82\x89b\x19\x0a\x826 \xfc`\xc1\xd8\ +\xd0\x16\x04#\x0d\xfe.\xac\xe8\xdf\x05_x\x87\xcb\xcc\ +\x9b,\x84\xf0\xc2\x01S1{L$\xd2\xc6\x19y\x85\ +\xe5\xe8\xa4\x84,\x84\x90\x9a%7lp\xc5\xba`\x0b\ +\xf4\xeb\x84\xb9\xd8\xa1\x14\xc6\x1a:\xf4\xf0\xa8\xb0\x19\xba\ +)\xa1\xd5|\xf5\xf7\x86\x9b\xcf\xb7\xee\x9aN\xda\x8a\xa5\ +\xcb\x1cqO\x09\x7f\xbd\xf5\x84\x0b\x96\x05[aX'\ +\x8c\xf0\xac\xb0A\xc1~\xe6\x0d\xc9\xd6\x1dQ\xcd\xba\xaa\ +\xa1\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01}\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x01DIDAT8\x8d\x95\xd2\xb1KVQ\ +\x14\x00\xf0\xdf\xf7Qa\xe2\x12N\x91\x93\x85MN\x9d\ +\xa1E\x10\x84\x86j\xd4M\x87\x96\xc0\xdd]\xb7hh\ +\x8d \xa1!A\x1cZ\x85\xa6j*\xf2P\xe0\x90\xe2\ +\x1f\x10\x88A\x86aa|\xe2\xf0\xae\xa1\xaf\x0b\xe6\x99\ +\xde;\xf7\x9c\xdf=\x5cNG\x89\xcc\xbc\x829Lb\ +\x18\x7f\x90X\xc4RD\x1c\xaaD\xa74\x8f\xe25\xae\ +\x96\xfc/\xf40P\xfeW1\x15\x11\xfbm\xa0[n\ +^=\xd1\x0c\x971\x8bql\xe2.\x9e\xd5&\xe8\x96\ +\xb1\x87*g\xdf#\xe2\x1d\xc6\xf0\x153\x99y\xab\x06\ +L\xd5d\xecBD|\xc3\xa3\x92\xfb\xa7\xf6\x82\xe6\xc1\ +~\xa3\xaf\x0dd\xe6\x00\x06\xb1Qr\xd7k@\x0f{\ +xP\x90\x9f\xd8\xc6+\xdcl\xd5\xf7j\xc0:\x02[\ +\x11\xf1\xe9\xf8 3\xdb\x13\xc1\xe7v\xa2\x8b\x17\xe5\xfb\ +if\xf6W\x9ahv\xe2\x00/k\x13,b\x06\xb7\ +\xb1\x96\x99\xf3x\x8f\x8b\xa5\xe6\x00\x97\xf0\x04;m\xe0\ +x\x91\x06\xb1\x82\x89\xca\xed=,c\x1a\x1fq'\x22\ +~\x9c\x02\x0a\xd2\xc1=\xcd*\x8fh\xb61\xf1\x5c\xf3\ +\xa8_4\xfbr\x0a\xf9\x0b\x9c\x15\x99y\x03oq\x0d\ +\x1f0\x11\x11\xfb\xff\x0dT\x907\xb8\x7f.\xa0\x82<\ +>7p\x02Y\xc0\xc3#S\xefd\xae\x0f\x1eB$\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01x\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x12\x08\x06\x00\x00\x00R;^j\ +\x00\x00\x01?IDAT8\x8d\x9d\xd3=K\x5cA\ +\x14\xc6\xf1\xdf\xae\x06\x04\x8bt\xdb\xa8\x88q#\xa2\xd8\ +X\xa4\xb2\x15\x041\xd8\x05\xa2\x95\xe5\xd6!\xd8,n\ +!~\x06+IJ\xf3\x09\x94\x10P\x904n\x11H\ +0$\xf8\x02.\x0b\x0a\x16Vb\xe1\x8a\x8538\x19\ +]\xc2\xfa\xc0\xe5\x9e\xf3\x1c\xce\x7f\xce\x9d\x99[\xa8\xd7\ +\xeb\x12\xad\xa1\x8a\x96\x7fu\x89\x97\x99w\x8a\xc1bf\ +\x8e\xa3O\x07\xca\x01\xaf\xc2\xf3,@\x01\xe5N\x01\xdd\ +I\xdc\x8f\x9e6\x80\x1d\xf4\x86E&\xf0\x13\xe7\xf9\x04\ +\xb1q\xe8\x09\xc0<\xa6\xf1\x19%|\xc2B\x0ex\x9d\ +\x81r\xbd\xc0J\x88\xabq\xfa\x22\xc6BS\x0a\x18\xc5\ +\x1c\xba\x12\xc0\x12\x86C<\x82\xf7\x110\x80#|\x0c\ +\xc5\x12~\xe3\x9d\x87\xfb\xd0\x13VMUEw\x11\xdb\ +\xf8\x9e\x15oPK\xf2\x8a\xc7\xf7\xa3\x8c\xc5\xb8\x07\xb5\ +\xac\xb8\x81\xc3$ob\x06?B\xbe\x857hD\xc0\ +W\xec\x85\xf8\x1a\xab\x19p3Lz\x10\xf2_\xd8\xc7\ +\xb7\xf4\x14\xe2\x0e\xaf\xa3\xe1i\x1d\x87\xf7Q4\xe2E\ +Z\xc6$\xce\xdc\x9f\xc2\x97\xe0Wp\x91\x00N\xda\x01\ +\xa60\x1b\xe2\xb7I\xc3\x876\x13\xfc\x8dF\xfe3\xfd\ +O\xc7\xb8\x92|b\xa7\x80&\xfe\xe0\xf6\xb9\x80\x16v\ +S\xe3\x0e3\xc49\xa5\x12)N:\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01\x1b\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x99\xdc_\x7f\ +\x00\x00\x00\xe2IDAT(\x91\x9d\xd1/K\x83Q\ +\x14\x06\xf0\xdf\xe6\x8aE\x98_`&\x83U\x10\xbf\x82\ +\x98\x9d0\x16\x945\xbb \xd6\x05\xcd.\x88}j\xb1\ +\x0cV4\x1b_\x164\xac\xb8b\x96\x81\xc5 2\x16\ +v\x06\x97\xd7wC|\xe0p\xcfs\xce\xf3\xdcs\xff\ +\x94\xb2,\xbb\xc0\x99\xdf8\xc1u\xe4}\xec\xa7\xcd2\ +\xeePG7j\xc3\xe0O\x89\xee\x12\xc7\xf8\xc2\x18\xcd\ +\x0a^#z\xd8\xc4\x0e\xaa\x18%\xc6g\x1ca\x15\x0d\ +\xf4\xcaI\xf3\x1b\x07\xf8\xc0\x15\xb6\x93^\x1d-tb\ +\x80\xd4\x08\xefh\xa2\x82\x07\xacc\x037\x18\xe04\xbd\ +c\x1e\x8fh\x87\xa1\x8b\xdb\xd0\x1d\xc6\xa9\x88\x9d\x8b\xd0\ +\xc6.\xf6\x827\xf0\x96\x0a\x8a&\xc2\x04\xe7\x91\x0fq\ +\x9f\x17,2\xc2On\xfd\xb3q)\xfem,z\x9c\ +\x15\xacE\xccy\xd5\xec\xde\x9f\xcb\x8c[x\xc9\xf1\xb1\ +\xd9\x1f\xd7\xe6\xc5)P\xcb+^\xfd\x05+R\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xcf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x01\x96IDAT8\x8dm\xd3M\x88\x8eQ\ +\x14\x07\xf0\xdf\xf3\xf4R\x83\x8d\x05\xc5\xbc\x14)\xcd\x8a\ +\x95(R\x13\xa5\xac\xcc\xc6GMJY\x8cX(K\ +\x99\x8c\x05\x9a\xb1b\xc3b\xc6\x82R2\xd9\xc8(_\ +eA\x16b\xa1\xde\x84\x89Y\xccBB\xa4\x19\x1f\xc3\ +\xe2\x9e\x9b\xdb\x93S\xb7\xdb9\xf7\x9c\x7f\xff\xf3?\xe7\ +V\x9dN\xc7\x7fl\x1b\xfa\xb1\x05m\xfc\xc6\x1bL`\ +\x0c/sb\xd5\x00X\x82\xab\xd8^\xc4>\xa3\x85E\ +\xe1\xcf\xe1\x22\x8eb\xb6.\x12\xdbxZ\x14\x7f\xc3q\ +,\xc7\x0a\x9c\xc3\x0f\xd4\x18\xc0=,\xc8\x0cj<\xc6\ +\x06\xcc\xe0\x12\xce`\xba\xd1\xda\x1a\x0ca\x0f*\x8ce\ +\x80\xfd\xb8\x8c)\xf4\xe2uQ\xd4\x1d\xa0\x1f\x8b\xd8F\ +\x5c\xc1\xea\xdc\xc2\xc1\xb8\x87\x1b\xc5\x83x\x8bI\x9c\xc4\ +\xc2\x88?\xc1mT5\xba\xb0)\x1e\xde5(\x0fc\ +/n\xe20\x9ec}\xa1\x91VP\xccLv\xe2\x96\ +46\xf8\x8e\xf18-i\xac\xfb\xd0\x87u\x19\xa0\x9c\ +\xc44\x0ea-\x1e\xe2\x0e\xbe\xc6\xdb/<\x88C\xd2\ +L\x8d\xf7\x98\x8d\xe0+\x9c\xc7(\xce\xe2\x83\xb4<\x03\ +X\xdah\xefE\x06\x98\xc1\xfd\x08\xce\x8b\xfb\x19zp\ +,\xee\xc1L\xb9\xb0\x1e\xfem\xe2\x0eI\xd5I\x1c\x08\ +\xfa\xa5U\xf8S\xf8}\xb8\x86\xb9\xdc\xff\x84$\xd4\xaa\ +\xe8q\x5cZ\x9al\xb9xs\x80\xdf\x08\xb6\xa7K\x01\ +\xfb\xa5m\x84]\xd2\x87\x19\xc1b\xac\x8c\xa2G\xd8\x1a\ +9\xa3\x18j~\xa6.\x9c\xc2\x11\xcc\x8f\xd8\xcfh\xa1\ +\x15\xfe'\x9c\xc0\x85R\x83\xa6\xb5\xb1[\x9a\xfb2i\ +\x84S\xb8\x8b\xeb\xf8\x92\x13\xff\x02w\x5ckPMg\ +\xdc\xa5\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\x86\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0e\x08\x06\x00\x00\x00\xf0\x8aF\xef\ +\x00\x00\x01MIDAT(\x91\x85\xd21K\xd6Q\ +\x14\x06\xf0\x9fW\x0a)jhh\xc8h\x91\x1c5\xe9\ +PRIC\x82\x0e\xd9 !\x82\xd1j\x1f \xa8o\ +\xd0\x16\xb4\xb4\xd4\xe6`\xb4DB\xadA\xe0\x10\x1dT\ +hlh\x11A\x8c\x8ah\x10\xa9lx\xef?^\xfe\ +\xf0\xf2\x9e\xe9\x9e\xe79\xcf}\xce9\x9c\x01\xad\xc8\xcc\ +\x9bX\xc6\x15\x9c\xc2O|\xc4s\xbc\x8c\x88\xbfM\xed\ +@\x97\xe8\x18V0\x8f/X\xc3W\x9c\xc6\x0cF\xf1\ +\x1e\xb7#b\xaf-^\xc3\x1c\x1e\xe0qD\xfc\xee\xe2\ +\x0a\xee\xe2)>a*\x22\x0e\x1ar!3\x0f3\xf3\ +~{\x8c\xd6H\xb3\xb5\xee\xe1\x7f\xe7\xcc\x5c\xc7qL\ +D\xc4a\x9f\x0f^\xe0\x1a\xce\x95\xcc<\x89I\xac\xf6\ +\x13\xd6X\xc50F\x0b.\xa3`;3\x8f\xf4q=\ +\x8a]\xfc\xc1\xa5\x82G\x95\x1b\xc7\xab>\xaeou\x96\ +:\x88{\x05\x17*1\x86\xc1\xcc\x1c\xe9\xe1:\x82)\ +|\xab\xd0\xc5\x82\x1f5\xb9\x8e7X\xea\xe1z\x07\xef\ +p\xb5\x01\x0a>\xd7\xf7\x10~a\xb1\x87xI\xe7p\ +\xa6k\xbeY\xf0\xba\xab\xe0\x06\xf62s\xac\xd5\xf2$\ +\xcec\x1f'*\xbcR\xf0\x04\x9b\x15\x98\xc7\x87\xae\xb9\ +\x9a\xd8\xc7\x16n\xd5|\x03\xcf\x9a#9\xab\xb3\xe93\ +X\x88\x88\xf5v\xcf\x999\xa1\xb3\xed\xef\x98\x8e\x88\x9d\ +\x7fI\x1dq\x82#,l\xf1\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01\xc6\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf01\x94_\ +\x00\x00\x01\x8dIDAT8\x8d\x9d\xd3M\x88\xcda\ +\x14\x06\xf0\xdf\x9d\x99\xcd\xd8h\xc6,$ERS\xcc\ +4\xa5\x135\xd9\xcclg(\x12\x1b\x0b)\x16>v\ +\x16\xa2,(\xcdF\xcab\xa6\x1b[\x85\x22+K\xf9\ +X\xb9\x0ee!#D\x16\xa8!\x09\xc9\xc2\xc7\xe2\xff\ +\xcet\xfb\xd7\xcc\x8dS\xef\xe6=\xe7<\xcfs\xbe\x1a\ +\xfe\xd32\xb3\x89\xfd8\xde\xe8\x108\x82\xb5X\x85\xd5\ +\xe8F\x17\xd6c\x1bz\xd0\xea\xe9@x\x06O1\x83\ +\xe5\xd8\x83e\xb8\x82\xbeBp\xa2{\x09\x15\x1bp\x16\ +\xc3\xe8G/\x9ax\x84\x83\xd8\x87\x81\x88hv-\x02\ +\xb0\x157\xf0\x10o\xd1\x8a\x88i\x0c\xe04\x0eG\xc4\ +\x17\xfcVj\x9aO\x5c\x89\xbdE\xe2\x1b\xac@\x94w\ +)3[8R\x00~df?>B#3\x03\xc7\ +\xd0\xc0\xbb\xc26\x8a\x8b\x111U\x08\xee\xa8\x9ay\x0b\ +\xcf\xf1\x12?\xf1=\x22\xee\xf7\x14\xc6\xed\xc51\x8b\xc7\ +\xb8\x80'm\x15\xee\xc4H\x01\x1a\xc4I|\xc2\x98\xc2\ +.3\xc7q\x0d\xbb#\xe2\xf6b\xcd.\xb1S\x98\xc0\ +xD\xccQ\xcd\x5cI\xdc\x81\xcb\x999\xf9/\x00\x0b\ +J\xda\x82\xb6\xe0\xaejt\xdfj\xbeI\x9c\xc7h;\ +\xc0\x82\x926{\x8d\xafu\x80b\xef\x8bo\xae\xee\xa8\ +o\xec\x90jCef/\x8e\xe2\x05n\xe2\x19\x063\ +\xb3;\x22~-\xa5d\x08\xb3\x99y\x08\xaf\xb0\x19\xa7\ +\xf0@5\xf6\x0fXWWR\x07\x19\xc6\x01\xd5qM\ +D\xc4.l\xc29Lc\x0d6v*\xe73\xc6\x22\ +\xe2\xde\xfcGD\xfc\xc1\xd5\xcc\xbc\xae\xba\x97\xbe:\xc8\ +_\xc6l\x83y\x0c\xda\xbaW\x00\x00\x00\x00IEN\ +D\xaeB`\x82\ +\x00\x00\x01\x89\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x15\x00\x00\x00\x14\x08\x06\x00\x00\x00bKv3\ +\x00\x00\x01PIDAT8\x8d\xad\xd4\xb1K[Q\ +\x14\xc7\xf1O$\xb4\xee\x12j\xabq\xaaYJ\x05\xc9\ +_P\x07\x17\x07\x17\xc1BE:T\x90\xae\x9d\x0a\xed\ +\xa0t\x13\x97v\xc8\xd8\xc5\xc1E7\xdduN\x16\xa5\ +\x94\xd6M#m\x05'\x95XQ\xe2\x90\x9b\x12\x02\xef\ +\xbd\x9b\x92\x1f\x5c.<\xce\xf9\xf2;\xf7\xc7y\xb9f\ +\xb3)I\xb5Z\x0d\x9e\xe3\x00oQ)\x97\xcb\x89\xf5\ +m\x0ddV\xfc\x87b\xa1?P\x8d\x85\xe6\x92\xc6\x0f\ +\xa3\xc3C\xdc\xe16\x16\x1a\xe3\xf4o\x00\xe6\xf1\x1a\xab\ +\xfd\x80\xe6\xb1\x88\xef\xf8\x8a\xc7\x18\xc7`RC\xd6\xf8\ +S\xa8\xa0\x94\xd0\x7f\x86S\xd4q\x1c\xee\xbd|\x86\xcb\ +}\xac\xe1#\xc6\xc2\xb7?\xf8\xd6\x01\xfb\x85\x93p\xd7\ +\xf1;W\xadF\x85\xfa\x00\xcbx\x8f\x1d\xbcI+\x8e\ +y\xd3\x12n\xf0\x19O\xb1\x9d\xd5\x10\x03\xdd\xc2\x86V\ +8W\xd8\xcdj\xe8|\xd3A\x8c\xe0\x09F;\xee!\ +\xbc\xc2\xbcV\xfa\x9f\xb4B\x91\xb4\xb2y\xbc\xc44&\ +\x03\xb4\x90b`\x093x\x81\x9fiN7\xc3\xe9t\ +\x5c\x0c.\x8bx\x87\x09\x9cc\x1d_p\x99\x04lC\ +\xbbu\x8d\xa3p`\x01\x1f\xb4\x82\xbaH\x83\xa5A\xbb\ +5\x8bF\x0c\xac\xad\x98\xf4\x1bx\x86\xb9Xh\xe2\x9a\ +\xf2oU\x0b8\xc4\x8a>\xfe\xa4\x87\xf1(\xcab\x0f\ +\xd0\x9eu\x0f\xb5UQ\xc4\x18\x14\xeam\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01J\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0d\x00\x00\x00\x0d\x08\x06\x00\x00\x00r\xeb\xe4|\ +\x00\x00\x01\x11IDAT(\x91\x85\xd2\xbf+\xc4q\ +\x1c\xc7\xf1\xc7\x9d\x93\xe4\xa2\xcb \x8b\xb2(\x7f\x00\x03\ +e2\xa0\x94\xd1 \xeab\xb1 \x0b2#\x93,\x16\ +\x89\x0c&E\xba\xc2\xa0\x84\x81\xbe\xc9$\xeb1\xa9\xeb\ +&\x8b\x1f\xc9p\x9f\xab\xef\xe9\xe2=\xbe?\xaf\xe7\xe7\ +\xf5\xfa|z%\xa2(\xca\xa3M\xe5\xaca\x11\x0bX\ +\xfduv\x9d\xc24\xd2\xd8@\x0b\xe6p\x11\x04Gx\ +\xc5\x16^\xb0\x84B\x0a\xb9 x\xc3\x09\x06\xb0\x19v\ +O\x98G\x0ac\xb8\x85d\xcc6\x87\xed\x00M\x85\xdd\ +0&\xb1R\x06 \x11EQ\xcc\xe2\x1c\xcb\xe8\xc0z\x5c\x14\xff\ +\xbdN\xdc\xe3,\xc4\x83\x1a\x5c\xa2\x07C8-;e\ +\xd0\x8c=\xbc+\xd5\xa7.@)\xa5\x86|`G\xa9\ +n\x99$\x8a(\xa0\x0bMxD6@Y\xdc\x85K\ +Z\x91G\xf1\x07i\x04=o\x03\x18\x5c\xb7\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x02\x15\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x14\x08\x06\x00\x00\x00oU\x06t\ +\x00\x00\x01\xdcIDAT8\x8d\x9d\xd4]h\xcfQ\ +\x1c\xc7\xf1\xd7\x7ff)\xe5\xa15\xca\x05\x174\xb5\xd4\ +\x94\x8b\xb1%\xb1\xac<\xa4(S\xd4.\xdcz\xb8q\ +\xe7F\x89\xc2\x8dZ+)\x96I\xc9\xe4!\x91\x9a\x84\ +\x95q\xf1\xbf\xf0\xfc\x90;#\xa1\x11.H\xcd\x5c|\ +\xcf?\xbf\xfe\xfe\xff\xfd\xd6N\x9d\xce\xefw\x1e\xde\xe7\ +\x9c\xcf\xf7\xf3=\x85b\xb1h\x02\xa5\x06\xbbS]\x88\ +W8\x8a\xb3\xd9I\xb5\x13\x00MA/\xba\xd2\xff\x07\ +4\xa1\x0f\xd3q\x22\xbbc\x1e\xe8L\x02\xbdG+\xe6\ +a#\xc6p \xcb\xc8\x83m\xc5z\xbcD\x1b\x1e\xa4\ +\xfe\x1b\xf8\x84\xb9\x98Q\x9a<\xde5g\xe2\xb9\xd0\xe8\ +\x07F3c+1\x07\x1f\xf1}\xbc\x93M\xc3)\x8c\ +\xe0Ij{Q\x97\xc6\x97\xe2\x0a\x0a8\x84?\xd5N\ +6\x0bW\xb1\x0a_q_\xe8\xd4\x85~!\xfe\x00\xea\ +q\x1c=\xd9\xc5YX\x03n\xa1\x19/\xb0\x0d\xef\xd2\ +\xce\xab\xf1\x13w\x84F=\xd8W~\xa5\x12lv\xda\ +\xb1\x19\x0f\xb1\x01\x97\xb1\x1c\x17D\xe4v\xa4\xf9G\xb0\ +?\xf5\xfd\x07\xab\xc3\xcd\xa4\xc5\x10\xd6\x09Q\xcfc\x85\ +\x7f\xfe\xfa\x85\xbd2\xbe\xaa\x04\xdb\x8e\x16<\x126(\ +E\xe7\xa4\xd0\xaf\x15SqOD\xafj\xa9\xc1\xb2\xf4\ +\xdd\x8do\x99\xb1\xcd\xb8\x8bMx\x9c\x07*\xc1\x86\xd3\ +w{\xa6\x7f\x0f.b\xb10\xec\xeb\xfd7\x08\xdf\xb5\xd4\xa6\xe3w\x88\x1c\x5c\x92&\ +<\xc3.\x0cV8@\xbf\xc8\xcfF!\xc55\xe1\x82\ +\xa6B\xd9\x134?\xb5\xc3*\x84>\x95v\x5c\x12\xe9\ +\xf6[\xb8a\x04[\xca\xd3\xe9m\xaa\xd5@p[\x04\ +e,\x81F\xb1\x16\x83y\xafF\xa5\xd2\x88\xd3\x227\ +\x89g\xea\x1c\x16L\x06v\x1d\x8b\xc4\xd5:\xf1Y<\ +\x96\x03\x93\x81\x1d\xc6\x1b\xac\x11\xf6\xe9\x10\xd69\xf8\x17\ +-\x83l\x7f\xf5\xb9\xae\x1b\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x02\xff\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ +bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x09pHYs\x00\x00\x0b\x12\x00\x00\x0b\x12\x01\xd2\ +\xdd~\xfc\x00\x00\x00\x07tIME\x07\xe0\x01\x08\x0f\ +\x12,c4\xebp\x00\x00\x01\xeeIDATX\xc3\ +\xed\x95\xbdk\x14A\x18\xc6\x7fo\x12D\x09\x09\x82 \ +h#H\x02\x16I\x99\xbf }\xdap\xdb\xc8\x92\xca\ +\xe2\x16\xff\x00\xc12U\x88\xec\x15!\xd5\x14\xe2\x1e)\ +\x02Q\xc4t6\x92\xc2\x90\xc6B,\xceBN\x11<\ +\x0c\xf9 \x09\x5c>nR\xdc\x9c\xbeYw7\x93\x8f\ +\xce}\x96\x81w\xe6}v\xe6\xd9g\xde\x99\x85\x12%\ +J\xfc\xef\x90\xbcD%\xac\xde\x03\x06]\xd7*\xfeA\ +\xdd\xd4~\xa6\xb8\x0f\x81\xfb\xc0\x100\x00\x1c\x01m`\ +\x17\xd8\xac\x9b\xda\xb7\xbcu\xfa\xf2\x95\xc9\xa2 \x0d\xa0\ +!\xc8W\xd7\x1a@3\x08\xa3\xf5 \x8c\x1e)\xeec\ +A>\x08\xf2\x0ex#\xc8\xaa \xef\x05\xd9\x00\xee\x04\ +a\xc4\x85\x05\x00\x87\xea\xeb;\xca\x85~`\x02\xf8\xa8\ +&>*\x98g\xb7h\x0b\x06\xce\xdd\xa4\xae\xedS\x89\ +\x89\xdf\x06at\x17X\x03F\x80a\xe0)\xf0\x22\xc5\ +\x9f\x06\xda\x89\x89_{\xcc\x9d\xef\x80uO/\x06H\ +L\xdc\x02\x9e\xdb?Y;\xa9\xb9\x8a\xe7\xb5x\xa1\x03\ +\xe2\xea\xd3b\x11D\x17\xeb'\xf9[\xbb\x0f4W\x8b\ +\xbd\xb2\x80\x02\xec\x03\xc7\xee\xdd\xe1,B\x10FO\x80\ +&\xb0e\xb1;\x82|NL|m\x02\x8e\x81\x13\xf7\ +\xee\xcd\x8c\xfcR\xaa?v)\x07\xb4\x95)[\xc5b\ +{\x9e\xf7g\xe4\xcf\xed{\x09H\xd5\x80N\xdd\x12\xe4\ +\x86\x8b\xdb\x9a\xeb\xf8\xd3\x82\x9c$&^\xf6\xb1\xb3\xcf\ +\x87\x94\xc2m\x15og\x11|\x17\xbf\x88\x80\x8e\x8a'\ +U\xfc\xe5\x12\x1fp\x06\xbe50^\x09\xab[\xc0(\ +\xf0\xccb-\xdd\x0b\xeaU\x9a\x0bP\x09\xabU\xa0\x05\ +\x1c\xb8\xb6\x0d\xfc\xaa\x9b\xda\x0fo\x01\xbd\xb3\xefj`\ +V\x0bs{\xbe\x9a\x98xEs]~)}/\xb8\ +\xfe\x18\xe0/\xc0\xa9n\xd1=r\x1a-\xe0eb\xe2\ +95\xb6\x07\xfc\xe6\xdf\x7fB\x07\xf8\x0e,\x90\xf3\xbf\ +(\x120\x935X7\xb5\xac\xe1y\xd7\xb2\x9c\x04 \ +\xef\x22*Q\xa2D\x89S\xad\x83\xa9\xe2\x81\x96I:\ +\x00\x00\x00%tEXtdate:cre\ +ate\x002016-01-08T1\ +5:18:44+00:00\x8e\x05\xfd\ +\xe0\x00\x00\x00%tEXtdate:mo\ +dify\x002016-01-08T\ +15:18:44+00:00\xffX\ +E\x5c\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xeb\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf01\x94_\ +\x00\x00\x01\xb2IDAT8\x8d\x95\xd3Oh\xcfq\ +\x18\x07\xf0\xd7\xf7\xb7%s\x908(.\x8aYM\x19\ +y\x14\x8a\x1c89\xb98\x92\x9b\x96\x7f3\xb2&\x9b\ +?5\x89\xb3\xc2\x8a\x5c8)M\x9a\x03Jqz\x0e\ +\x86\x83\x03\x07\xb2\xd5\xe4_\x88R3\x87\xdfw\xf5m\ +~#O}\xeaS\xef\xe7\xfd\xee\xfd|\x9e\xcf\xbb0\ +Cef+\xce\xa1\x1d\x0f\xd1\x13\x11\xef\x1b\xf5\x16\x0d\ +\xc8\x813X\x8d\x05\x15h\x14\x8fq$\x22^7\x14\ +\xc9\xcc-\xe8\xc7J\xcc\x9d\xc9!\xde!q4\x22\x9e\ +C\x91\x99;p\x18+0\xe7/\xe4\xe9\xf5\x09#\xe8\ +\xada\x02\xcd\xe5\xf9\xdf\x9a\xc0\xaf\x022\xb3\xc0nt\ +\xa3\x0dM\xffp\xf0\x04]\x111\x02\xb5\x12X\x8e]\ +X\x88>\xbc\xc0\xe44\xf2\x07\xdc\xc1N\xacCWf\ +\xce\x83Zf>\xc2S\xbcA[D\x0c\xa0\x03\xa7\xf0\ +\x0a\xe3\x18\xc2\x86\x88\xd8\x16\x11\xb7\xd57\xb7\x0c\xe3\x99\ +y\xbdY}m\xab\xb0V}3\x0f\x22\xe2'Nd\ +\xe6Y\xcc\x8f\x88\xd1);\x99Y\xc3&\xb4\xe23\xee\ +O\xbd\xc9,\x9c\xc4\x01\xbc\xc5\xfe\x88\x18\xae\xceR\x92\ +;\xcb\xbeB}\xa3W\x22b\xb2\xc8\xcc\x96\xd2zg\ +i\x7f\x08{\xf1\x11\xfb0\x8cC\xe8\xc1w\x9c/\xef\ +\x05\x8ec\xb0\xc8\xcc\xaf\x98\x8d\xed\xe5\xbc2\xb3\xb9$\ +\xf6\xa2\x05c\xe8\x8e\x88\x9b%^\xe04\x8e\xe1e\x91\ +\x99m\xb8\x88\xf5\xb8\x85\xce\xa9\x8cdf\x13\xda#\xe2\ +Ye\xac\x0e\x5c.\xdf\xef\x06\x0eV\xbf\xfd\x12\x0cb\ +#\xeebOD\x8cU\xf05\xb8\xa4\x1e\xc8k\xea\x19\ +\xfaB\xe3\x00..\x9dm\xc5=\x5c\xc0\x00\x96\xe2\xaa\ +zf\xbeU9\x7f\x88T\xc4\x16\x95\x02\x9bK\xfb}\ +\x11\xf1\xa3Q\xefos\xf3\x98\x0b\x981\xe3\xce\x00\x00\ +\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\x91\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x14\x00\x00\x00\x11\x08\x06\x00\x00\x00\xddD\x8c\xbe\ +\x00\x00\x02XIDAT8\x8d}\x93QhVe\ +\x18\xc7\x7f\xcf\xc7>(u\xcb\xae\xc4\xd01\x91\x85|\ +Q\x9a\x9eH\xac\xad\x18\x12\x14\xee\xb2\xb0\xebH(\x1a\ +\x0c\x04a\xdd\x85\x17\x0e\x12/\x82\x04\xe92\xbf`\x22\ +\x08\x0e\xbb\x182%\xb5\xa0\xde\xb352\xa9\x1b\xa9\x8b\ +\xe9\x96\xae\xf8J\xc4\xc2\xfau\xd1\xfb\xe9\xd9\xe7\xf2\xb9\ +9\xe79\xe7\xf9\xff\xfe\xff\x07\xde\x17:J]\xa3\x8e\ +\xa8g\xd5y\xf5\xb6\xba\xa4\xce\xa9\x1f\xa9;;5Y\ +\x87\xfa\xc0\xc7\xb7\xd4\x9b\xea\xd5\x0c|^\xedS\x9fR\ +\x87\xd5O\xd4[\xea\xa4\xfa\xc4C\x81\xd9\xfd\x8e\xfa\xae\ +\xfa\xb1\xba\xf1\x7f\x92lR\xcf\xa9\xd7\xd4-+\x02\xd5\ +\xd1\xbc\xda.\xb5\xa6\x9eZ\x09V\x11\xd7\xd5\x93y\x93\ +\xb5\xcb\x80joN6\xa6nW_S\x0f?\x0c\x98\ +\x01\xab\xd4\x9f\xd5\x0f\xab\xc0.\xe0m\xe0Z\x9e\xdb\x09\ +\xec\x02\xba\xd5O\x81_\x81q\xe0zD,\x03F\xc4\ +mu\x0a\x18P\x1f\x01\xee\x00\x84:\x0bLD\xc4x\ +vz\x07\xb8\x1c\x11\x17\xd4\xae\x99\x99\x99iu.\x22\ +N\xf7\xf4\xf4|\xd1\xdf\xdf\xffg\x9e[\x0d<\x0b<\ +\x07\x5c\x8c\x88o\x00j\xc0\x93\xc0\xb7\x15\xf3.\xe0\xaf\ +\x9c\xe2\xaez\x1exO\x9dj\xb5Z\x8beYN\xa4\ +\x94^_XXx\x1c\xf8\x0ah\x02\x7f\xb4\xc55\xe0\ +Q\xa0U\x01.\x01\xab*}\xb3\xf2\xfe\x98\xfa\x06p\ +b~~\xbeY\x96\xe5\x9a\x88\xf8\x05X\xac\x02\x17\x81\ +\xde\x8a\xe8\x07\xe0\x99vS\x14\xc5\x8f@by}\x07\ +\x0c\x15E\xd1\x0e\xf2{\x15\xf8%\xf0Jex\x0ex\ +\xa9\x03\xd0\xec\xe8\x9f\x06\x0e\xb6\x9b\x88\xf8\xbb\x0a\xfc\x0c\ +xS\xddP\xf9\xf9\x93\xda\x00Pw4\x1a\x8du\x80\ +\xc0\x11\xe0b\xd6\x8e\xa5\x94\xf6u\x18\x11j\x0d\xf8\x1e\ +\xa8\x03G\xf3\xb3\x17\xd8\x03\x5c\x00\xae\x00\xcd\xb2,_\ +\x05\x8e\xe5\x10\x1f\x00\xefg\x93\xe1\xa2(>\xbf\x07\xcc\ +)\x1aY\x5c\x02\x07\xf8\xef\x5c\x0e\x02/\x03#\x11\xd1\ +q\xeb!\xa5\xb4\x1b8\x0et\x03\x83EQ\x94\xed\x95\ +\x89\x88+\xc0\x00\xb0\x19\x98\x00\x86\x80I`\x1a8\xa1\ +n\xcd\xc6\xf56\xb0(\x8a\xb3\xc06\xe0\x12p&\xa5\ +\xd4w/a\xbb\xf2a\xdd\x0f\x8c\xe6\xd5\xbf\x06~\x03\ +\xb6\x00S\xc0\xa1\x88\xb8\xd1\x91\xb4\x96\xd7\xdf\x0b\x0c.\ +\xbfO\xf7\xc1u\xe0\x05`+\xb0\x1e\xb8\x09\x9c\x03f\ +#\xe2\x9f\x954)\xa5\x17\x81}\xff\x02\xe28ya\ +\x96\xfd\xc4\x97\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x04x\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ +bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x09oFFs\x00\x00\x01@\x00\x00\x00\x00\x00s\ +\x05\xb7\x16\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\ +\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\ +\x07\xdf\x0c\x12\x0e\x1b\x0b$&IW\x00\x00\x00\x09v\ +pAg\x00\x00\x03@\x00\x00\x00 \x00\xbe\xe6\x89Z\ +\x00\x00\x03=IDATX\xc3\xe5\x97MhUG\ +\x14\xc7\x7f'\xba\xf3\xa3`\xa3Q\xb1\xa9-(*\xb5\ +(6\x96 \xadP\xdc\xc4\x16\x04\xad\xe0}\xbb\xa1\xb8\ +\xb0p\x1fZ\xa8\x8b\x82\xe8\xa6\x14\xba\x11\xee\x05\x15\x17\ +N\xa1p/h\xa4.\x0b\x8d\xa4\xa4i\xd4E\x055\ +~ H\xd1*\xa95DP*\x88\xf6\x9d.\xdey\ +\x8f\xf1a\xde\xbb\xe6C\x17\x9e\xcd\x999\x1f\x9c\xff\x9c\ +\xff\xdc\x99\xb9\xf0\x8aE\x8a\x04\x95\x5c\x19`\x8f\xa2?\ +\xe4>\xbd\xff*\x00\xfc\x02lR\xf4\x0fA>\xc8|\ +\x12\xfa\xf6\x03\xf3\x81S\x99O\xfa\xcc\xd6\x03lVT\ +\x049\x92\xf9d\x18 r\xf1^A:\x81\x93\x99O\ +\xfa\x01f\x16(~\x14\xd8d\xd3u\xc0I`[\x10\ +\xf21\xf0\x090\x0f\xe83\xdb\x97\xc0g6\x1e\x05\x86\ +K\xae\x8c\xa2_\x03\xed\xc0O\xb5\xe4\xb6f\xc5#\x17\ +\xefUt\xa7\xa2\xaah\x05PE\xb7F.\xfe\xbe\x16\ +\xa3\xe8iEQ\xf4\xbd\xc0\xd6\xadh}l\xfam\xa0\ +\xddbO\xb7\x04`\xbc\x7f+\xc8cA\x9e\x0a\xd2\x06\ +\xfcg\xf3\xafJ\xae\xdc^\xe5P\x06\x05A\x90w\x22\ +\x17Sr\xe5E\x82\xbc)\xc8C\xe0\xb1 \xdd\x16\xb7\ +\xca\xf4\x95\xdc\xa7\xb4\x04`\xb2\ +y/0\x02\xcc1\xb0k\xcc~.\xac\xd3\x94\x82\xdc\ +\xa7c\x99O\xfe\x01\xc6\xcc\xf4 \xf3\xc9hP\xbc\x06\ +\xf4b\xb0G6\xda\xf8\x14p\xd9\xc6\x1b\x80\xb5\x0d\x80\ +[\x03\x088\x95\x1a\xa7\xe3\xf8\xcf\x99\xbfK\xd1.\xe3\ +y\x10\x18\xb2q\xb7\xa2\xab-\xf6\xec\x0b\x030\x8e\x9b\ +\xf9\x07\xcd\xdf#\xc8rAn\xe5>\x1d\x03\x86,w\ +\x8b \x8b\x80G\xb9O\xaf\x85\xb9-?\xc3\x82\xf2\xbb\ +\xe9\x95\xa6\x7f6}\xde\xf4\x0a\xd3\xfd\x8d\x89\x85:\xd0\ +J2\x9f\xdc\x00\x1eA\x9d\xa7~\x80\xdc\xa7\x0f\x80+\ +A\xe8\xaf\x13\x02`<\xb6\x8a9\x03\x88\xc5\x0e\x04\xf6\ +\x0bA\xfePc^!\x0aj\xfc7\x03!\xc8nE\ +\x97\x0b\xa2\x99O\xae\x06\xf6\x03T?\xc9\x8a\xa2}\x8d\ +yS\xb5\x07\xb0\xf3~\xf89\xf6\xeb\xc0\xf5\xf1\xf2\xa6\ +d\x0fLF\x0au\xa0\x15\xff\xd3\x0e\xa0\xc8\x1eh&\ +v=\xc7\x8an\x0e\xef\x01xy\x14,\x03z\x80[\ +%W^\xfa\xc2\x1d\x00*\xa6\xe7\x96\x5c\xb9\xa3\x96\xa7\ +\xe83'\xe48\xf3\xa7\xc0\x1bfz\x0b\xb8Tr\xe5\ +O3\x9f\x0cT\xbb[@\x22\x17\x1f\x07\xb6O\xb2\x0b\ +\x15\xab'\xc0\x13`q\xee\xd3\xd1\x22/\xa2\x13\xc0\xe7\ +\xc0\xdf\xf6$\xab\xd3V\xb0\x03\x15\xe0]`\xa5\xa2j\ +\xfe\xdf\xa8\xbe\x94\x9aS\x10\xb9\xb8\x97\xea\xf3\xeb&\xd0\ +\x95\xfb\xf4\xdeD\x96^r\xe5]\xc0![\xfd\xb1\xcc\ +'_\xd4|mA\xd0\xda\x86\xa4<(\xde\x9d\xf9d\ +B\xc5Mf\x98\xfe&,^\x07\x10\xb9x\x81\xa2\xe7\ +#\x17\x1f\xb6y\xa6\xe8\x0e\xe0\x8e\xa2\x1ff>\x19\x99\ +Dq\x14\xedUtc\xee\xd3\xef\x1a}b\xab]\x0a\ +\xfci\x9c\xfdEu\xb7\xdeV\xf4\xfd\xa9\xfe\x0fh\x94\ +\x1a\x05\xed\xa6+V\xfc_`\xfdt\x17\x0f\x01t4\ +\xd8g\x01\xfb\xa6\xbbx\x1d\x80\xa2\xf3\xec\x98m\xd3\xfa\ +\xed\xaf\xbb\x22\x17G\xd3\x0d`&\x80 ?\x02\x9d\x8a\ +>\x11d\x04\xb8\x0b\xdcU\xf4\xc2\xcb\xe8\xc2\xeb-\xff\ +\x03Q\x9bYF6Y\xf5\xec\x00\x00\x00%tEX\ +tdate:create\x00201\ +5-12-18T14:27:11\ ++00:00YM\xe3\xc6\x00\x00\x00%tE\ +Xtdate:modify\x0020\ +15-12-18T14:27:1\ +1+00:00(\x10[z\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01U\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ +\x00\x00\x01\x1cIDAT8\x8d\xa5\x92?K\xc3P\ +\x14\xc5\x7f\xa9\x11%\x8b\x1d\x5c\x5c\x05\x05'\xa1\xdcM\ +\xfc\x02*n\xd9\x5c]\xc5/P\x1c;\xf9=\x1cU\ +\xea\x87\x10\x0eq\x12\xc4\xa5\x11\x8b\xe0\xa6(4R\x9a\ +8\xe4EB\xdaj\x82\x07\x1e\x8f\xfb\xe7\x9c\xfb\xce\xe3\ +z\x922 c6\x92J\xbc\x08\xf8\xc0\x17\xb0\x04\x8c\ +}G\xf6f\x90\x07f\xb6^NH:\x05B3\xdb\ +\x91t\x09\x1cx\xee\x05\xef\x15r\xcbM\xb8\x02\xd2R\ +~\x1b\xd8\x04\xae\x81=`\xc1\x07\x86\xc0\xee\x1c\x0b\xbf\ +\xe1\x0c\xe8\xfb\xc0\xc4\xcc\xe2\xa6lIm \xf5\x8bD\ +\x14E!\xb0_\x93\xff\x9c\xa6\xe99\xe4?Z\xe0(\ +\x08\x82\xc3:\xec$I\x1e\x0a\x81V\xcd\x89s\xf1o\ +\x81\xb2\x85\xa7\xd1ht\x0b,\x03\x9f\x95\xda\x9a;\x8f\ +\xc0[\x96e\xe3)\x81N\xa7s2o\x8a\xa4\x10\xb8\ +\x00\xb6\x80.\xd0\x03V\x9aX\x18\xba\xde\x04\xd8 _\ +\x22\x9a\x08\x0c\x80;\xe0\x1ex1\xb3\x9b)\x0b\x7f\xe0\ +\x158&_\xef\xbe\xa4\xdeOER\x5cS\xa4\xe8_\ +uw[R\xecI\xfa\x00&MD\x1c< \xfe\x06\ +\x8cB^q\x9bC\x89i\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\xf9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x13\x08\x06\x00\x00\x00rP6\xcc\ +\x00\x00\x01\xc0IDAT8\x8d\x9d\xd4M\x88\x8eQ\ +\x14\x07\xf0\xdf\xc3\xe4c\xf0\x8e\xa4\xa4X!a3\xf9\ +*55)!\x0b\x1f\xb1bMYH\x0a)+\x91\ +\x22\x89a%I\x16^5Y\xf8JV>J\x91G\ +Y(\xb11,$\xe3{2\xc64bq\xcfSO\ +\x0f\xaf\xf7\xcd\xa9[\xb7s\xcf\xfd\x9f\xff\xf9\x9fso\ +\x96\xe7\xb9\x16\xac\x1b\x07\xb0\x10\xef\xd0\x83S\xf8U\x0e\ +jk\x01h#.E\xec\x10f\xe1$j8T\x0e\ +\x1c\xd5\x04h-.\x22\xc3\x0eL\xc4\xb2\x00\xdd\x8b\xb1\ +\xad\x82M\x93J\xc9\xb0\x05\xa7\xf1\x13\x0fbM\xc2\x8c\ +\xf2\x85fe\xce\xc58|\xae$\xe9\xc40\xde6c\ +\xb6\x14O#p\x00\xe70=\xce:p\x0d\x93q\x16\ +\xdf\xfe\x05\xb6\x1a\xb7\xb1\x00/\xf1\x15\x1b$}j\xb8\ +\x89%\xb8\x87=U\x16e\xb05\xb8\x82v\x1c\xc4l\ +I\x93\xed\xb8\x80\x1b\x92\xf8O\xa4\xc6\x0c6\x02\xebB\ +/\xc6`\x1f\x1e\x06\xab\x13\x18\xc1\xf9\x88y\x8c\x15\xf8\ +R\x05\x225`\x1e\xae\x07\xa3\xfd8\x82\xc5\xd2@n\ +\x8b\x05w\xb0\xbe\x11P\x01v\x5c\x12\xf6(\x0e\x87?\ +\xc7|l\xc2L<\x0a\xe6#q^\xc3\x1c\xbcF\x7f\ +\xb9\xcc\xe5\xf8\x18\xac\x0a\x1b\x8d]\x18\x8f\xab\xa8\x97\x80\ +`w$\xe1\ +M\xd9\xf9\x1b\x87\xd0i\x8b\x22\xfc\x9f\xfe\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02\xbf\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x16\x00\x00\x00\x13\x08\x06\x00\x00\x00\x94y\xfd\x88\ +\x00\x00\x02\x86IDAT8\x8d\x8d\xd4]\x88\x97U\ +\x10\x06\xf0\xdf\x7fQ\xd0B\xdb2)\x08D]\xc9B\ +\xec\xa6!\x03\xa3\xb2 \xd1J(\x0d#\x13\x14\x0b\x8b\ +\xc0\x82\xad\x9b0\x0a\xa4@\x906BJ\x141\xb0 \ +$\xfb\xf0\x22r\xefV\xcc\x14fS\xe8\x036HJ\ +J\x0d!\xdd\xf2\x03#\xda.\xceYx\xf7M\xc9\x81\ +\xc3\xcb{f\xe693\xcf|t\xb4$3\xc7\xe1s\ +\x04\x0e\xe3B=k#\xe2\xf7js5^\xc63\xf8\ +\x0bK#\xe2@\x13\xa7\xab\x0d\x8c\xf9\x98\x80)8\x8e\ +\x07\xb1\x0c\xab*\xe8t|\x85n\xf4\xe0\x05\xack\x83\ +\x5c\x0a\xf8Z\x1c\x8d\x88\x11|\x8a\x91z\x7fCfN\ +\xc3\x00\xfa\x22\xe2\xb9\x888\x83\x1f0\xf5J\x80\x7f\xc5\ +4\x88\x88\xdd\x98\x8e\xdb\xf0\x08\x0e\xe1\xd5\x88\xd8\xd1\xb0\ +\x9f\x81_\xae\x04\xf8{\xcc\xcd\xcc\xf1\x15\xfc\x18\xbe\xc5\ +QL\xc2`\xcb\xfeN\x1c\xf9_\xe0\x888W\x9d\xef\ +o\x5c\xf7*\x94<\x81\x0fk\xf1Fe)\xf6\xb4q\ +:\xcd\x9f\xcc\x9c\x80\xdb\xf1\x12f)\xb4\xdc\x84[p\ +\xb1\x9en\x9c\xc0\xcf8\x85\x05X\x83\xfd\x11qb\x0c\ +pf\xce\xc3\x8b\xd5h\x10\x07\xf1<\x1e\xc5f\xbc\x16\ +\x11\xbb\xaa\xedU\xf8\x0e\xaf`%~\xabXw\xe1\x1c\ +\xb6bk'3{\xf1,6`wD\x9c\xad\x00\x9b\ +p7\xceD\xc4\x03\xad\xcc\x96\xe0\x0d\xa5\x83f7|\ +\xee\xa8\x01\xcd\x91\x99g3\xb3\xbb\xcdQf\xf6d\xe6\ +Hf\xceo\xeb\xaa\xfe\xeb\xcc|\xeb2\xba\xf7\xc6\xd5\ +\xb47d\xe6\xfa\x88\x18n\xe8\x17\xd4\xd4\x1e\xc2\x97-\ +\xc7\x99J\x1bv5\xee\x16b\x0b~\xc4\xad\x9d\xcc\x9c\ +Tix\x12\xfd\xf5\x1c\xc4'\x95\xa2\x0fp_D\x0c\ +5@\xf6`/\x1eG\x1f\xfe\xac\xdf9\xd5\xe4\xe9N\ +\xc3\xf8\x1a,Rx]X#\x1a\xc2u\x18V\xc6\x98\ +\xc2\xeb\x12\xa5\xc8=\x98\x88/p\x12O\xe1\x18\xe6\x8d\ +i\xb7\xc6#\xdbq\x00\x9f\xe1Fl\xc2\xdf\x15`#\ +\x1eS\x86\xe64~\xc2\x8c\x88\xf8\xa3\xf6\xf7\x85\x88\xf8\ +\xe7?\xc0\x99\xb9\x02\xef\xe0\xe1\x88\xd8W\xef\xaeG\xd6\ +\x94\xdf\x8e\x88m\x0d\xfb]\xf8h\xb4\x1dGe\xcc\xe4\ +e\xe6l\xbc\x8f\xc9x\xb3\xa1:]#\xbc\x19\xfbZ\ +\xb1\x0c\xe0\x9ev\x80\xed\x91\x1eVv/\x85+\x99\xd9\ +\xa5\x0c\xc9De\xff\xf6g\xe6\xac\x86\xcf\x90\xc2\xf5\xe5\ +\x81#\xe2$V+\x85Z\x91\x99\x93\x95\xd59S\xa1\ +f\x07\xd6c 3\xefm\xb8\x8eh\xc9\xa5\xb6[\xbf\ +\xb26\xfb\xf0M=\x8b#\xe2|}|'\x96\xe3\xdd\ +\xcc\xfc\x18\xaf+E\x1d#\xff\x02\xad\xb1\xf2$\x9a\xc7\ +|\xa6\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02=\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x12\x08\x06\x00\x00\x00\xb9\x0c\xe5i\ +\x00\x00\x02\x04IDAT8\x8d\xad\xd4\xcfKTa\ +\x14\xc6\xf1\xaf6\x5cc&\x09\x84\x89\x91\x81\x82D.\ +.t\xa3\xa9\xa0\xb6\x17\x83\xcc\x7f\xa0\xeex\xab\x8d\x08\ +\xd5JJC\x0b\xda\x14ZV\x1b\xdf\xdew\xfa!\xb4\ +S\xaaM\xe0\xca\x19#52\xf1N\xbd\x17\xa1\xc8\x8d\ +\xad\xd2`\xae\xc9\x85\x99\xdb\xa2\x94\x8c\x08g\xecY\x9d\ +\xc5\xe1\xc3\xe1p8%Z\xeb\x1bV\xc2\xee\xa3\xc8\xbc\ +\x9aIm\xd7%Z\xeb\x00\xb8\x0b\xf4Z\x09;\xd8\x0b\ +V\x0a\xb0\xbc\xbc\xdc\x03H%\xc5\xbeb'\xdc\xc6n\ +\xde\x1a\xe6\x83\xd6g\x80Y%\x85\xb1'\xcc\xf7}\xd6\ +\xd6\xd6p2\x99z`RI\x11.\x1a\x03\x10B2\ +<|\x9b\x85\x85\x85v\xe0\x8d\x92\xa2\xbch,\x08~\ +\xee\xfe\xfb\xe6&\xa9t\xba\x06\x98RRT\x14\x85E\ +\xa3QB\xa1\x10cc\x0fP\xea!ss\xf3\x8d\xc0\ +[%E\xac`\xac\xaa\xea(\x03\xfd\x97\xa9\xac\x8ca\ +\x18\x06\xd9l\x96\x89\x89\xc9#\xc0\xb4\x92\xe2pA\x18\ +@<\x1e\xffxu\xa0\x7f\xa3\xa1\xbe\x9e\xc7O\xc6y\ +\xf6\xfc\x05s\xf3\xf3\xd5A\x10\xcc*)\xaa\x0b\xc2\x80\ +\xd7eeeM\xb6\x9d\xd0\xdd\xdd\x16\x87\xa2QV>\ +\xaf\x90L>\x8a\xe5\xf3\xf9i%Em!\x18V\xc2\ +v\x80\x86\xd6\x96\x96doo\x0f\xef\x16\x17I\xa5\xd3\ +8\x99L,\x97\xcb\xa5\x94\x14\x8d\xbb\xc6~\x81\x9e\x95\ +\xb0\xadxm\x9a\xe6\ +\xd3\xad\xa6\xd0V\xb1\xb4\xe408t\xad\x02\xf8\xe7\xa1\ +\x1e\x88Dp2\xefY_\xfff\x9c\xea<9\xee\xba\ +\xee~\xd34\x93;0\xcf\xf3\xf0<\xef_\xce\x8ed\ +\xb3Y\x06\x87\xae\x97^\xbaxA\xba\xae\x1b6M\xf3\ +\xfe\xd6?\xfb\x1f\xe9\xfb\x01\xfd\x9c\xd6\xcao\xa8\xd4\xb1\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\x5c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0c\x00\x00\x00\x0c\x08\x06\x00\x00\x00Vu\x5c\xe7\ +\x00\x00\x01#IDAT(\x91m\x90?(\x84\x01\ +\x18\xc6\x7f\xef\xe7\x9b.\x03\xc9\xec\x06\x8aA\xc8`P\ +$\xebe0\xd8t\x03\x83\xc5`30;\x93U\xf9\ +su\x06\x8b\xc5\x22euJ1*\x97l\xca \x94\ +\xae\xfcI\xfd,\xdf\xe9K\x9e\xf1\xe9\xfd=\xcf\xd3\x0b\ +\x99\xd4.\xb5\xa2\xde\xa97\xea\xadZW\xcbjB^\ +\xea\x88\xdaP\xb7\xd5\xc9\x9c_T\xab\xea\x89Z\xc8'\ +7\xd4!u\x8d\x7f\xa4\xae\xaa5\x80P7\x80\x01\xe0\ +\x1c\x98\x02\x8e\x80\xb3\x88x\xf8\x03\xdd\x03s)0\x03\ +\x8cEDS\x058\x05Jj\x118\x88\x88[\xb5\x1b\ +\xa8\x03\xb3)@D4[I\x11\xf1\x08\xec\xa8)\xb0\ +\xac\xf6\x03\x83@\x15XJ\x80\xb6\x5cs\x9a\x03\xbf#\ +b\x0b(\x01_\xc0\x07\xf0\x91\x00\xcfY=@\xaaF\ +\xb6\xb9S]\x07\x8e\x81v`\x02\xb8\x0e\xb5\x0c\xcc\x02\ ++\x999\x0c\xbc\x00\xef\xc0nD\xbcf\xe0<0\x8e\ +\x9a\xa8\x97jM\x9dV7\xd5\xbe\xdcw:\xd4\x0bu\ +\x11\xa0U_\x00\xb6\x81\x1e`\x0f\x18\x02\xde\xb2\xdd\x0b\ +@%\x22\xf6\x7f\x81\x5c\xdah6\xaf\x17\xf8\x04\xae\x80\ +\xc3\x88xj\xdd\xfc\x00\xa7\xf6\xbd\x96\x10\xb6\xbf\xd9\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xd0\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x14\x00\x00\x00\x10\x08\x06\x00\x00\x00\x16\x18_\x1b\ +\x00\x00\x01\x97IDAT8\x8d\xad\xd4\xcf\x8bOQ\ +\x18\xc7\xf1\xd7w\x9aIJ\x8a\xac\xfc\xc8ld$\x0b\ +\xd33ca!ij\xa2\x99\xd9XY\xda\xd9Q\x9a\ +\x85\xc2\x1f )Jb\xa9l\xa7(EJ\x84,\x1e\ +\xc2\x86\x155\x89\x05\x9b\xafh\xfcfq\xcf\x9d\xb9\xa6\ +kL\x8dO\xdd\xee\xe9~\xde\xcf\xe7\xdc{\xcfsN\ +GQf\xae\xc55L\xe39n\xe0nD\xfc\xd2P\ +fn\xc38\x02\x1bq'\x22\x8e\xd4~O\x81\x86q\ +\x00\x83\x05\x1a\xc4\x15\xbc\xc8\xcc\xbd\x85\xd9\x93\x99\x0f\xf0\ +\x0c\x93X\x81\x01\xec\xca\xcc-\x7f\x04\x96\xb0\xa3e|\ +6\x22F#b\x1d\x0e\xe2tf>\xc4-|\xc1>\ +\xac\x89\x88\x11\xbc\xc4v\x9c\x9c\x0d\xcc\xcc{\x18\xc6X\ +y\xf6\xa96#\xe2>Na\x07ND\xc4\xee\x88\xb8\ +\x1e\x11\xdf\x0a\xf2\x1dO1\x9a\x99\x1b\xea7\xdc\x89\x9b\ +xW\xa0\x1a\xae\xf5\xa3\xdc/k\xd7\x13\x5c\xc2tf\ +\x1e\xee\xf9\x0b\xd4Tw\x11\xccq\xcc\xa0\x7f1\x81\xff\ +TD|\xc6W\xe6\x16\xe5\xbf\xa9-pI\x93\xb4\x15\ +\xaf\x5cJ}o\x0b\xb4?3\xfb0\x15\x11\xef\xd1i\ +\x9a\x99\xb9\x1a#\xd8\x8a~<^(\xb0\x8b!U\xf3\ +\x9e\xc9\xccc\xf8P\xbcU\x999\xa9j\xf6e\xf8\xa8\ +Z\xd9\x99f@'3\x7f\xe2*\xa6\xcc\xb5H\x9fj\ +\x07\x8c\x95\xe2Mx\x8d\xb7\xb8\xad\xea\xbd:hya\ +\xce\xe3b/.\xe0\x10&Z>\xbf\xa9\xf5\xe5\x1aZ\ +\x80y\xd3\x81\xcc\xdc\x5cfjj@\xb5;\xe6\xff\x96\ +\x09\xd5\x894_\xdd\x88x\xd5i1f\x95\x99\xe3\xaa\ +\xa3\xaa\x0e}\x14\x11\xe7\x16\xaa\xf9\x0d\xa0\xcdx<3\ +\xa5\x8a\xf0\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01X\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc9V%\x04\ +\x00\x00\x01\x1fIDAT(\x91\x95\xd0\xbf\xab\xcfQ\ +\x1c\xc7\xf1\xc7\xe7v\xb8r\x19X\x94\x1feq\x07\x85\ +\xd4{`0\xf9\x03\x84R\x18\xac\x06\x832Q\xca\xbf\ +`Q\x06\xfe\x03\x0c\xba\x7f\xc3]^\x0b\x912(%\ +E\x08I_\xe12\xdcs\xeb\x9b\xe9x\xd6\xbbsz\ +\x9d\xf7\xb3\xf7\xe9=%\xd9\x84\x078l\x8c\xaf\xb8W\ +U\xb7\xa7$\x87\xf0tP\x9cg\xd7\x02\xde\xe3\xe7\x7f\ +\x8a\xcf\xf1i\x82$\xcb88(~\xc1jU\xcdZ\ +\x0f\x1a>\x0f\xcak\xd8\x86\xd9\x94\xe4\x12n\xe0\xc5\xa0\ +<\xe1(\xce5\x9c\xc0\xf5\xaaz8(Kr\x19\xa7\ +\x1b^\xe2T\x92\xb5Aw\x09WpkJ\xb2\xb5\x7f\ +{\xef\xa0\xfc\x1d+U\xb5\xd2\xf0\xabO\xff0(\xff\ +\xb1\xbeq\x0b\xb8\x8a\x0b\xd6\x171\xc2\x22\xee$9\xd3\ +\xb0\x8c\xbbU\xf5hP\x96\xe4\x1b\x8e5\xac\xe2Z\x92\ +#\x83\xeev\x9c\xc7\xd9\x86\xfb\xf8\x88\xfd\xff4\xed\xc0\ +\x01<\xc1\x8f\xb9\xfc\x0d\x8eW\xd5\xeb)\xc9nl\xee\ +\x0f\xfbp\xb3\xdf\xb7`'\xde\xe17\x1e\xf7\xda`\xd6\ +p\x11{z\xb0\x88\xb7s\x0d\xaf\xfa\xb9\x84\x93\xbd6\ +x\xf6\x17\xf1zO\xd5\x8bA\xa4\xa9\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01\x0a\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x94\xc2/8\ +\x00\x00\x00\xd1IDAT\x18\x95]\xd1\xbf/\xc3a\ +\x10\xc7\xf1\x97'\xd5\xc9h\x11F\x83\xe8\x82\xa4\xb1\x96\ +\x8d\x8dAl\x9a\x0e\xfe\x83\xae\x1d\x18\xc4`\xa71\x1b\ +\x0c\x12\x8b\xc9`\xd3\xe1;t3h\x18-\x12\x93(\ +\xea\xc7\xe0\x9e4\xf5I\x9e\xdc=w\xef{\xee\xc9\xdd\ +XQ\x14B\xab8B\x05\x1d\xec\xe01Er\x06\x97\ +X\xc01^q\x81R)\x80\x06&\xd0\xc7\x1efq\ +\x8b\xad\x0c\xac\x87=\xc7s\x9c;l&T\xb1\x14@\ +\x17\xe5\xf0oPM\xd8\xc5x\x04\x9b\x86\xeaa*\xa1\ +\x15\xbd\xa1\x8d\x8f\xf0\xdf\xf0\x95\xf0\x84\x83H\x9c\x18\xd5\ +K\xfe\xe4!~\x02\xce\x9aF/\xcf\xe1\x1d\xfb\xff\xaa\ +\x17\xd1\xcd\xc0<\xceP\x8f\xfb$Vp\x9d[\xdcc\ +\x19\xdb\xf8F\x0d\x0f\xb8\xca/|b\xcd\xdf\x0eN1\ +\x87\x0d\x0c~\x01]'-R\x7f\xd2\xe3\xe9\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01~\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc9V%\x04\ +\x00\x00\x01EIDAT(\x91\x85\xd2\xbbjVQ\ +\x14\x04\xe0/\x1a\xa3h\xe5\x05A\xd0\x17\x10\x04\x85\x05\ +\xa6P\x10D\xb0\xb5\xb0\xb2Jc\xa1\x9d\x85\x8d\x01\xb1\ +\x15\x1b\x0b\x11\x0b\xf1\x15\x22v\xa9,l\x84)R\x05\ +\x84\x08\x0a\x81\x88\x22\xa8` x\x89\xc5\xd9\x07~\x0f\ +\xffe`\xc3\xda\xb3Xkf\x0f[\x92\x0fIN\x1b\ +A\x92\x85$\x17\xcd\xc0\x5c\x92]\x5c\xc5\xbb\xc6\xed\xc3\ +S\x5c\xc6\xc3V\x8f\xc3v?\xbc\x85\x13\xb3\x94\x06x\ +\xb9\xa7\x15\xd7q\xb8\x9d#x\x81\xbf\xb89\xc2\x0f\xcf\ +\x0dIv\x93\x9c\x1d]\x99d.\xc9\xc9Y\xd2\xbd\xed\ +Gx\x82E|\xc27\x5c\xc2\xca\x14\xee\xf5X\xe5!\ +\x92\x1cL\xf2|\xe8\xa6W\xbe\xa5\x0bm\x1c\x16\xb0\x8c\ +3\xcd\xc12\xbeb\xab\x1f^k!L\xc21\x1c\xc2\ +\x0e>\xeb\xc2\x5c\x9do\xcd\xa5\xaaZ\x9bb{/\xee\ +\xe1qU}\x1f\xda\xbe\x80\xb7\xd8\x8f?m\xf3\x01l\ +O\xe2\xaa\xeag\xaf|\x05\x1fq\x0e_\xf0C\x97\xe8\ +\xea\x14\xeeU?\xbcRU\x9bIvp\x17\xf7\xabj\ +\xbd\xf56G^\xf0\x1f\xd7\xdb~\x80_\xb8\xad\xfb\xa6\ +\x1bx\x86\xdf\x93r\xc0\xfb^y\x11Gq\xbc\xddO\ +\xe1Z[8\x09o\xe6\xdb[\xefT\xd5z\x92\xf3\xba\ +\xdf\xb6TU\x1bS\x06\xc1?\xb7?\x88\x1a\xfe<\x0d\ +\xb2\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x02\xce\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x17\x00\x00\x00\x13\x08\x06\x00\x00\x00{\xbb\x96\xb6\ +\x00\x00\x02\x95IDAT8\x8du\xd5]\x88\x96U\ +\x10\x07\xf0\xdf\xbe\xec\xa6\xb5R\x86\x19\x15Kx\x11F\ +B\x118\xb1\x98e\x94PT\x0a\xf6\xa9\x90\x10^I\ +Y$\xacE7\x19!D]\xa4E\x1f.\xa1\x88\x22\ +\xde\x88X\x04]\xecEEA\x9f'D\x12\x17\xb2\x94\ +\xa4\x15\xc2\xb0\xb7R\xa3\x0f\xb2\x8b3k\x8f\xcf\xbe\x0e\ +\x1c\x9e\xe7\x9c\x99\xf9\xcf\xccyf\xfeO\x9f\x96\x94R\ +\xfa\xf1>\x02\xfb\xf0G\xae\xd58\x91f}8\x93\xcf\ +\x95X\x86\x19\xf8\x02\x9b\xf0\x0bt\xda\xe0X\x88\xe9\x98\ +\x85c\xb8\x17\x0f\xe2\xd1\xd4Ok\xd8n\xc5\x0e\xdc\x8f\ +\x1b\xf0\x0c>\xc7\xec\xf3\x81_\x8a\xc3\x11q\x06\xefd\ +\x860\x13\x17\xe3\x82<{\x00\xabR\xf7\x0fn\xc6s\ +\x98\x8b7\xce\x07>\x81\xab!\x22\xf6`Nf5\x8c\ +\x058\x95vO4|\xf6\xe2\x086\xa3\x8b\x870\xb7\ +\x17\xf8A\x5c_J\x19\xc8\x00Gq\x00_\xe3'\xfc\ +\x9b\xd5-j\xf8\xbc\x95\xcf\x93\xd8\xae~\x8b\x15S\xc0\ +#\xe2T\x02-n\x1c\xaf\xc1\x8f\xf86\xf7\x8b\x1aU\ +\xef\xc3G\xad*\xe0\xb6\xbe&p)e:\xe6\xe3i\ +\x5c\x93\x80Wa\x00\xa3\xd8\x95\xc0kqK\xba\x8d\xab\ +w<\x99\xfdL\xb5[\x8eu\x12t\xb8\x94\xb2;\xc1\ +\xd6c?\x86\xf02\xfe\xc6\xe3\x11\xf1\x1a\x8e'\xd8p\ +#\xa7\xebpQc\xdf\xc5o\xb8\xac\xbf\x942\x82\xc7\ +\xb0\x01\xab\x22\xe2d\x06\x1c\xc4\x8b\xf8!\x22>l8\ +\x1f\xc4\x96\xf4\xa1\xde\xf3\x16\xe7J\x17C\xfdx\x01C\ +\x11\xd1m\x19l\xc6\x93\xb8\xd5Ty\x1e\x0f\xab\xb3\xb0\ +-\xc1\xdar\xa2\xa36\xfd\x86R\xca%-\xe5\xedj\ +\xdb\xdd\xd9\xc3\xf18F\xd4\xfe~\xb5\x87~\x16&\xfa\ +q\x9fz%\xdf\x97R\xc60\x96\x01GR7ZJ\ +\xd9\x16\x11\x13-\x80\x1d\xea@\x1dn\x9d_\x8eA\x8c\ +\x9f\xed\x96\xcc\xfcn\xb5\x1b\xeeR\x87g\x5c\xe5\x8c/\ +\xf1\xba\xda\xa2\xa7{d\xda\x94%x\x0f#}\xbd\xb4\ +\xa5\x94\xad\xf8\x14\xef\xe2\x0a<\x8bO\xd4\x1e\xee\xe2/\ +\xdc\x84\x1b\xf1\x9d\xda\xe7\x9341\xaa\x92\xdc\xbc)C\ +TJyD%\xaaC\x11\xf1sD\x1c\xc0SX\x9a\ +k0M/\xc4\xdb\xf8\x00\x1b\xf3lHe\xc9\xcf0\ +\xdei\x01_\x8b\x9d*Aml\xa8\xba\xf8\x1dwd\ +\xd6\xf01v\xe7\xfbZ\xbc\xa4\x12\xdd@&3\x85\xb8\ +~U\xb9\x1b\x8ef\xc0\x8e:\x81\x83x\x13W6\xec\ +W\xe2\x95\x0c\xbeN\xe5\x94%\xf8Jn\xda\xd7\xb2<\ +#/\xce,v\xaa\x1c\xbe,\x03O\xc3\x9fm?\xff\ +\xff@\xceJ/V\x1cS)w\x13\xbe\xc9uOD\ +LV\xd4\x0bX\x1b\x18\xfe\x03:\x81\xbf\x95\xfd\x1fR\ +q\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01]\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x0e\x08\x06\x00\x00\x00\x1fH-\xd1\ +\x00\x00\x01$IDAT(\x91\x9d\xd2!K\xa4a\ +\x14\xc5\xf1\xdf\xbcc\x90\xc5\xb5\xd8\xd7\xb22i\xda\xfd\ +\x00b\xd02A6\xca&\xd3\xb2U\x90A\xfc\x00&\ +\x8b\xb8[D\x10\xd4\x22\x82\xc5f\xb5\xb8\xb7\x88\x96\x0d\ +\xe6M\xc2*\x83\x82\x08\x1a\xe6\x1dy}w4\xeci\ +\x0f\xf7\xfc9\xf7\x1e\x1e\x99\xf9\xcd\x7f\xa8\x91\x99W8\ +\x88\x88\xee{\xc6\xcc\x1c\xc5\x0c:X.pQ\x0e\xd6\ +\xde\x00\xda\x99y\x84k\x1cc*\x22z\x05\x94i\x8f\ +o\xc0\x97\xf8\x88\x0f\xe5{\x17\x8a\xc14\x22V\xf1w\ +\x08\xdc\xc14np\x8f\xc3W`\x09\xafU\xe1\xccl\ +c\x1f\xa7\xf8\x8c\xa5\x88\xe8\xd1/\xe7(\x22\xe6kw\ +u\xd1*\x93~\xe1kDC\xc7x\x17\xfa*\x00\xe6\ +KG\x079=z\xde\xaek\xf8{\x85\x5c\xa3S\x0b\ +(C\x22!\x1c\xc1ry\x9e\x91\x17_~.\xb0\x89\ +\xf5\x8b+#\xe7.\x94\xcd\xa69c\x9d\x1d@()\ +\x9b\x14vJ\xc0\xd9{\x06\xbf\xaf\x80m\xd3\xbe\xdab\ +\xad\x07\xa8z\xbd~ \x02\xcd\xf2\xbb\xa1f\x89}\x89\ +\x8e\x14\x19\x22\x96\x04\xfe\xa8\x94\xe7\x97\xb76\x1f\x1e\x88\ +@\xdc(\xd6\xcaw=\xdd6N\x00\xc3@\x09\x9d\x1b\ +\x14\xfajV\x80Z.\xbf\xf7\x15\xef\x94\x80\x0d\xb50\ +,\x81\xd7\x0c\x81[\xe8\xec\xe9\x00\x09\xe0%`(\x99\ +J\x93/\x14Y_\xf3:&`7\xednC\xc0\xc2\ +VAo>\xda\xdeZ\x07H\xa6\xd2\xa03h\x1e\xa2\ +?\xc7aX\xb9DD\xf9\xf8\xaf?]\xe7\xfa\xd7\x9f\ +\xdb\xbe\xf4\xad\x14\xf19~\xac\x94\xa2\xaf\xdfF\x98_\ +\x1f\xc6\xcc)k(e\x9dp!\xa0\xcb\x1e\xaf\x8a\x10\ +d\x0b\xbdv\xbd\xf2\xe7\x22\xe6\x81#\xb9B/\xe3\x13\ +\x93\xb6?\x1aPT\x03\xd2\xb1C\xf1\xe2\xf8\xc4\xa4\x07\ +\x9cg\xb7p\xb5[\x8c\x8dOL\xce\x1aR\x05\xb4\xf3\ +6@W\xc8\xfb\x11\xb0O\xed{\xe6\x0b#mH\x8c\ +\x00\x0fBs\xb1\xc0\xf9n\xb6\xbb\x9bp\xc9\xee\x13\xf0\ +\xeeWh4\xea\x1b\xae\x1b\xfb\x18\x1dN%\xb3a\xc2\ +\x9c\xee\x11\xf0-0\x80~v\x934\x97\xec\xdf\x1bU\ +5\xb4\xb3\xda\xfaP\xa2\xdf\x8c\xdb^u\x99`E\xbc\ +\xe7F\xce\x8c\x8eqj\xf8,\xdd\xdd)\x84\xb3\x9b\xba\ +\xa5R(\xd9\xe0\xde\xec\x0c\x99l\x9e\x9eb\x1f\x8e\xe3\ +\xea\xa7O)\xa4\x94T\xca\xf7\x00\xe8\x1f\x18\xc2q\x1c\ +\x84\x10\xbe\xd7I)Y\xf5\xaa\xccLO\xb10w\x97\ +g\xf8_\xe1\x1f\x16\x8f\x0dW\xeaa@l\x00\x00\x00\ +%tEXtdate:create\ +\x002015-12-18T14:2\ +7:00+00:003\x90\xe8\xec\x00\x00\ +\x00%tEXtdate:modif\ +y\x002015-12-18T14:\ +27:00+00:00B\xcdPP\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xa9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0f\x00\x00\x00\x0e\x08\x06\x00\x00\x00\xf0\x8aF\xef\ +\x00\x00\x01pIDAT(\x91}\xd2\xbbk\x94Q\ +\x14\x04\xf0\xdf.A\x22\xd8\x88O\xb0\xf0Q\xf9\x8a\xa8\ +\x1c\x9bhaa\x1b%\x01\x11\x8b\xfc\x01\x06A1+\ +\x096Z\x88HH\x0am\x04\x03*ha\xe3\xa3\xb3\ +\x08\x98*\x12\xe5@\x1a1\x08V\x0a\x8a\x06\x82b*\ +\x1bS\xec\xfd`\xf7#\xe4\xb4wf\xce\xcc\x9c\xdb\xb0\ +\xc6d\xe6~\xdc\xc1!\xbc\xc3XD\xfc\xaa\xe3\x1a5\ +R?n\xe2\x046w<\xfd\xc4\x5c\x11\xf9\xd2E\xce\ +\xcc\xb3h\xe1\x186\xad\xe5\xa6\xcc2>\xe0VD\xbc\ +od\xe63\x0ca\xe3:\xa4\xfa\xfc\xc5\xedj\xf30\ +\xae\xe10z\xd6!\xfd\xc1|\xd9<_\x01\xdf\xe2\x22\ +\xbea7\xfat\xf7\xb1\xac]\xdc\x06|\xc5Ghf\ +\xe6,\x16\xf1\x19\x17\xb4s\xdf\xc0',\xe15NF\ +\xc4\x00\x86\xb1\x05?2\xf3IO\xb1q\x14\xc7\xb1'\ +\x22\x16q73\xa7\xb0-\x22\xbew88\x82\x83X\ +\xc1\x5c\x95\xb9\x17\xafp\xaaX\x1a\x89\x88\x85\x8a\x91\x99\ +\xe70\x89\xed\x98\x8e\x88\x1642s\x1c\xa3%\xcb%\ +\x9c\xc6\xf5\x92\xff)\xae\xe0\xbf\xf6)\x9b\x98(\x9ac\ +M\x0c\xa2\x17/\xb1\x10\x11\x13\xd8\x81\xc7\xa5\xc4\x91\x88\ +\xd8\x1b\x11/0S\xca\xdd\x89\xf3\x95\xed\x03x\xa8}\ +\xaa\x07\xe5\x14\xff:lo\xc5=\x0c\xe0\x0d.G\xc4\ +R\xfd{\xee\xc34\x02\x8fp\x1fS8S\x9c]\x8d\ +\x88\xdf\x15\xbe\x8b\xdc!\xb2\xab\x88\xf4\xe39Z\x11\xb1\ +R\xc7\xad\x02\xcc\x87tf \xe3\x97\xea\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x01\x04\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x94\xc2/8\ +\x00\x00\x00\xcbIDAT\x18\x95]\xd0!K\x83a\ +\x14\xc5\xf1\xdf\x1e\xa7\xc5j\x19[\xb1\xc9\x92\x22\xab\x82\ +\xc1\xb0\xa8\xc1l\xda\x17\x10\xeb`\x03\x0d~\x82\x81\xb2\ +:0\x18\xd6V\xdc\xa2\xe1\x05WDP\xd1\xb8\xe2\x07\ +\x105\x18\xde\xfb\xe0\xf0\x94{9\xfc9\x97{*E\ +Q\xc0&\xae\xb0\x87G\x9c\xe2\x0e\x12\xaa\xb8\xc57\x06\ +\xd8\xc6\x18\x8d\x0c\x1c\x87\xd9C\x1f\x9fXG'\x03G\ +x\xc2=>p\xa3\xd4A\x06Z\x98\x86\xb9\x86y\xec\ +\xbbh%\xd4\xf0\xeaOg1W\xd1IX\x89\xbb\xf0\ +\x15\xdf\x08\xaf\x9b\xe2\xee\xb2\x06\x01^`\x91\xf0\x8c\xfa\ +\x12\xb0\xc09.E\x07\x0f\xd8\xf9\x97\xd2\xcfK\xc2\x04\ +\xfb\xd8\x08\xef\x04#4s\xc2\x04o\x119\xc3\x10\xef\ +x\xc9\x09?8\xc4\x16\xae\x95\x85\xb5\x95\xd5\xfb\x05\x08\ +|+}\x8e\x949\xf5\x00\x00\x00\x00IEND\xae\ +B`\x82\ +\x00\x00\x06\x1d\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ +bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x09oFFs\x00\x00\x01\x00\x00\x00\x00\x00\x00|\ +]\xbdz\x00\x00\x00\x09pHYs\x00\x00\x0b\x12\x00\ +\x00\x0b\x12\x01\xd2\xdd~\xfc\x00\x00\x00\x07tIME\ +\x07\xdf\x0c\x12\x0e\x1b\x00\xb3\xf4\x90\xdf\x00\x00\x00\x09v\ +pAg\x00\x00\x02`\x00\x00\x00 \x00\x1f=\x87\xd8\ +\x00\x00\x04\xe2IDATX\xc3\xed\x97YlTU\ +\x18\x80\xbf\xdb\xb9C;3]fa\xe8\x02\xb4@\x99\ +.\xd0R*\xb4\x104b\xc2\xea\x86\x18\x97 \xea\x83\ +F4\xfaf4F_\x5c\xde$\xf2\xa0\x0f&FE\ +\xe2\x83\x01#\xa6\x88@@)E\x81\xcaRZ\xbaP\ +\xbaP\xa4\xdbl\x1d\x0b\x85v\x98i;\xbd>\xdcs\ +\x87)\x9d\xa5`|\xd2?\xb99\xe7\xfc\xe7\xfc\xe7\xff\ +\xce\xb9\xff\xf9\xcf\xbd\xf0_\x17\xe9^\x0d\x93S\x0cX\ +\xac3\x99\x91\x9c\x82N\x96\x19\x1f\x1b%\x18\x08\xf0\xd7\ +\x80\x9bP(\xf4\xef\x00\xd8\xecY\xcc\xce\x9d\x8f}V\ +6\xf6\xac\xd91\xc7\x0dx\x9c\xf8\xbc.\xdc\xfd\xbdx\ +\x5c\xbd\xff\x1c \xddleaa\x09\x05\x8b\xca4\xd5\ +\xeb\xc0\x9b\x80#\xca\xf03\xc0\x0f\xc0\x1e\xa0\xbf\xf7j\ +\x17\xed\x17\xeb\xf1y\xdd\xf7\x06`\xb6\xd8\xd8\xb0i\x0b\ +RR\x12\xc0W\xc0f \x1d\x98\x00\xde\x07N\x01)\ +b\xae\x5c\xe0\x9b\x08\xf3s\xc0c\x80\xf7\xf7_\x7f\xc6\ +\xd9w\xf5\xee\x00\xcc\x16\x1b\x1b7o\x05\xb0\x00>\xe0\ +i\xa0J\xeb\xbf\xe5\x1f\xc1`4\x85\xc7\x8f\x8f\x8f!\ +\xcbz\xadY\x00\xb4\x8b\xfas\xc0\x9e\xdf~\xd9\x8f\xab\ +\xbf{\x92\x8f\xa4x\x00y\x0b\x0a\xb5j\x0fP\x01T\ +\xdd\xb8>\xa8\xe9\xca\x0dF\xd3v\xe08\xd0\x08\x9c\x96\ +e\xfd\x0e`\x0e@(\x14\xea\x10\x0b<\x09\xec\x06^\ +Z\xbd~\x136{\xd6\xf4v\xc0:3\x93\xf5\x8f?\ +\x0b\xf02\xf09`\x08\x06\x03$'\xa7d\x02M\xc0\ +\xac8\xec\xe7\x81\xe5\x11\xed\xb3b\x019\xed\x17/\xb8\ +\x1a\xce\x9eH\xbc\x03s\xf3\xf2\xb5\xea\x87@\x99p\x0e\ +\xe0N\xe0\x1c`\x19\xa0\x88\xd7\x00P)\xcao\x1dE\ +\xa5\x98\xd2\xd2\x13\x03dXl\x88\x09\xe6\x02\x1dMu\ +\xb5Z\xd7\xa7L_\x0e\x00f\xcd9\xb0.I\xa7\xc3\ +>+'1@\xce\xdcy\x00\xcf\x00-\xa0\x9emW\ +_7\xa8\xc7\xef\xebi\x028\x80\x8fD\xfd\x0bM\x99\ +\x9a\x9e\x11\x1f\xc0f\xcf\xd4\xaa\xaf\x01}\x8a\xa2pc\ +\xe8\x1a\xe7jk\xb89t\x0d`\x1b\xb0e\x9a\x10/\ +\x88r4\xacQ\x94D;\x10\x8e\xcdl\xa0\x5c\x92$\ +\xd22,\xf8GnRsd\x1fW:[\x01\xbe\x17\ +\x03\xb7'\x00\xb0\x8a2\x9c:\x83\xc1@|\x00\xb1\xfd\ +\x002\xf0\xaa\xd7\xdd\xaf\xad\x1c\xff\xc80gOVS\ +sd\x1f\x97\xdbZ\x00\xde\x05\xd6\xc4\x01xO\x94o\ +\x01]\xa0\xbe\xce\x98\x00\x16\x9b\x9d\xc5e\x15\xa0\x1e=\ +\x80\xfd\x91\x06\x9ax\x9c\xbd\xd4\xfdQC\xed\xf1\xc3\x00\ +\xc7\x80w\xa28\xf7\x00\x1f\xa3&\xb2\xd5\xc0\x06\x9f\xd7\ +\xc5\xf5A_l\x809\xb9\xe1\xe3\xf7\x06\xf0\x0a\x80\xbb\ +\xbf'\xe6\xf2z\xfe\xec\xe4Rs=\xc0'\xc0:\xc0\ +\x1f\xd1]!\xcaZ\xd4\x14\xdd\xd5T\x7fz\x92\xbd|\ +\xe7\x84\xb2^\x1f\xd9\xdc\xa9(\x0a\xa3\xa3A\xe2Ic\ +\xdd)<\xce\x1e*\x1fX{\xd4hJ5E\x19R\ +\x04\x14{\x5c}x]}\x93:\xa6\xec\xc0\xc4\xe4\xbb\ +\xfc\xb2$I\xdc\xff\xd0F\x8c\xa6\xb4\xb8\x10ng/\ +\x87\x7f\xda\xcd\x89\xea\x03(\xb7\xa3\xfcm \x84\x88\xea\ +\x96\x863S\xec\xa6\x00\xb8o\xdf\xdf\x0f\x02\xf9\x80\x92\ +n\xb6\xe2(.%\x91\x8c\x06\x03\xd8\xecYH\x92d\ +A\xcd\x84\x1f\x00:\x80\xeaC?\x12-\x96\xa6\x00x\ +\x9c\xbd4\xab\xa4'\x22\xf5#\xc37\x13\x02\x00\xcc_\ +X\x0c\xf0\x99h\xa6\xf9G\x869zpoT\xe7\x10\ +%\x06\x00|\x93\x07\x8f\x03\xa4\x18\x8c\x94\x96\xaf\x00\xa0\ +\xb3\xad\x99\xc0-\xff\x14\xbb\x0c\x8bM\xbb\x9e\x9f\xd7\xec\ +N\x1e;\xc8\xa0\xcf\x1b\x138*\xc0\x80\xd7\xa5UO\ +\x03+\x01J\x96V\x86\xfb\x0d\xc6TZ.\x9c\xc1?\ +2|\xdb\xb9\xd9J\xee\xbc\x85\x8c\x8f\x8d!\xeb\xf5\xdf\ +\x09\x08R\xd3\xccq\x01\xa2&\xa2\x89P\x88+\x1d\xad\ +\x00O\x09\x95\x22\x9e\x10\xf0\xf0\x82\x82E8\x8a\x96\x00\ +`\xb1\xdaYr\xdfJ6n\xde\xca\xe2\xa5\x95\xc8z\ +\xfd*\xa0\x5c\xcc]\x90=;7\xee+\x8by\x19\xb5\ +_l@Q\x14'j\x04k\xcf#\xc0!`g^\ +~!\xa5\xe5+\xd8\xf0\xc4\x16\x16\x95UX$I\xda\ +. O\x01%b\x9a]\xf3\x1d\xc5\xe8d9&@\ +\xdcO\xb2\x0c\xb3\x15{f\x0e\x06\xa3\x89\xa4$\x1d\xc5\ +K\x96i\xbbQ\xad(\xcaZI\x92@M\xb1;\x80\ +\x00\xf0\x22\xb0W\x98\x97\x00\xcd\x80Ts\xb8\x0a\xcf\x1d\ +\xe7?n\x0ch2t}\x90!\xf1\x09\x96\xb7\xa0 \ +\xb2k\x8d$I_\xa2\xde\x8a\x00\xfb\x80'\x01.5\ +\x9d'\x10\xf0\x93_X\xd2\x92\x9ea\x91n\x0c]c\ +\xc0\xe3\x8a\xe9#.@\xa4\x0cx\x5c\x8c\x8f\x8d\x22\xeb\ +g\xecB\x8d\x8dm\xa8A\xfa(0\xd8\xd1\xda\xc8\xd5\ +\xae\xb6p\xc0u_\xe9\xc0QTJg[3\x13\x13\ +\xb1\x7fT\xee\xea\xc7\xa4l\xf9*\x1cE\xa5\xc8\xfa\x19\ +a]wW;]\x9d\xadSR\xect\xe5\xae\x7f\xcd\ +dY\x8f=3\x1b\x9dNf\xc0\xeb\x22\x18\xb8uO\ +\x8e\xff\x17M\xfe\x06<\xc9\x9b\xa3b\xcb\x06=\x00\x00\ +\x00%tEXtdate:creat\ +e\x002015-12-18T14:\ +27:00+00:003\x90\xe8\xec\x00\ +\x00\x00%tEXtdate:modi\ +fy\x002015-12-18T14\ +:27:00+00:00B\xcdPP\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01Z\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x11\x08\x06\x00\x00\x00\xed\xc8\x9d\x9f\ +\x00\x00\x01!IDAT(\x91\xc5\xd3\xbf+\xc5Q\ +\x18\xc7\xf1\xd7\xe5\x86\xe4\x12\x8b\xd1j5\xca\x8f.!\ +\xe4\x0fP\xc4\xceD\x06e\x91\x12\x7f\x81\xcd \x19d\ +\xb0\xc8d\x91\xc1f\xfe\xda\xc8b\x10I\xa9\x9b\x9f\xc3\ +9\xd7\x8f\xd3\xa5L>u\x86\xf3<\xe7\xfd\x9c\xf3\x9c\ +>O.\xcb\xb2\x02\x96\xd1\xe0S\x8d\xa8\xf6]\xb5\xa8\ +/o\xf2x\xc0\x0e\x0ep\x85M\xdc\xe35\x01\x1fQ\ +\xc2\x14\x86\xf21x\x86N\x1c\xa2\x1d\x0b\x15@\x98A\ +\x11\xc5\xaa/\xc1Kt\xa3\x03\xbb\xa8K\xa0E\xcc\xa3\ +\x17YU\x92\xbc\xc30\x9ep\x84\x96\x18_\xc5$z\ +pQ\xee1U\x09\x13X\xc3)N\xe2+\x8a\xb8)\ +\x1f\xaa\x04\xc2[|\xda\x05\xc6\xd1/|\xd8\x87rY\ +\x96\xfd\xc0\xfe\xae\xb4\xc7\xff\x07g1\xf8Wp\x09s\ +\xd8\xc6t\x9a\xac\xf4\xab9\xaccD0D\x93\xe0\xa8\ +6\xac\xfctc\x0e\x1b\xa2\xadp\x8dstaL\xf0\ +q>\x05\xab\xb1%xu\x00\xb7_r\xd7\xe8C\xab\ +0\x0c\x852X\x83=\xc1b\xa3\xb1`s\xb2\x0a\xb1\ +\xe7\x17\x1c\xe7\x85\x19\xdb\xc7P,\xf2(\x8c\xdas\xd2\ +F)\xe6\xc0;/f:\x9b\xed\xa3J\x96\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x02\x0c\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0e\x00\x00\x00\x0f\x08\x06\x00\x00\x00\xd4\x14\xfet\ +\x00\x00\x01\xd3IDAT(\x91\x8d\x90\xbfk\x13a\ +\x18\xc7?wy#I\x04\xc1HMq(m\x22\xa5\ +\x15/\x15DA\xed\xdda\x8d.\x82q\xabm\x97\x03\ +AJ]\x5cJ\x97\xc6?\xc2\x1f\xc5\xd1\xc9\xae\xea\x5c\ +\xa5w7\xd4\xa1\x08=\x0bbQ\xc8-\xd23%C\ +\x04\xf1\x02i\x1c\xbc\xf7\xed\x05\x1c|\xb6\xef\xe7\x9e\xe7\ +\x9e\xf7\xf9hc\xe5\xca7\x8ej\xd6\xb6\xccm\xd7\xf3\ +\x17\x81\xe5\x84m\xdb\x969\xebz\xfe4\xe0\xcbF\xf1\ +\xec\xe9\x93\xb2\x0c\xcf\xd7\xd6\x86\x01n\xd6j\xe3\xf5\xfa\ +\x9d2\xc0\x97\xbd\xbd_\xc1\xce\x0e\x86a\x14\x1f7V\ +\xd5\x06Q*\x95\x8e\x82\xc8\xea\x00\xb9|>#y\x14\ +E:\xff(\xd1\xe9t>\xcb\xa0\xebz\x07\xa0\x7fx\ +\xf8]\xf28\x8e\xbf\x02d2\x99V\x14E\xea\xa9\x9a\ +\xe38\xb7S?\xda\x02\xda@\x05\x98HX;\xe1'\ +\x80)\xb5\xd1\xf5\xfcG\xa9\xc1\xd0\xb6\xcc\xb6\xeb\xf9\x97\ +\x80\xfb\x09\xdb\xb5-s\xcb\xf5\xfcq\xe0\xa5\x1al4\ +Vk2\xac\xbfZ\x1f\x01v\xa7\xaf]\xbdx}f\ +\xa6\x06\x106\xc3\xa10l2991\xfcpiI\ +\x89\x14U\xc3P\xeb^\x17\xde\x08\x80\x93\xc5S\xc7\x14\ +\xef\xf7\xb3a\xd8D\x88\xac> \xb2\xdb\xed\x1e\xa8\x83\ +5-\xfe\xdb\xdb\xff)y\xaf\xd7kKqi\x91\x9a\ +\xe38\xf7R7\xbe\x03Z\xc09\xa0\x9a\xb0\x03`\x03\ +(\x02W\xd2r.\xa4\x06?\xd8\x96\xd9r=\xff4\ + y\xd3\xb6\xcc\x0d\xd7\xf3\xcf\x00J\xa4XX\x98_\ +\x91as\xd3}\x0f4\x0d\xe3\xfc\xadj\xb5\xba\x02\xd0\ +\xfa\xd1\xfa\x18\xc7\xbf_\x9c\xadTF\xe6\xe6\xe7\x94H\ +q\xb7^W\xeb\x82\xe0S\x0e`tt\xec\xb8\xe4A\ +\x10\xe4<\xcf#_(\x0c\x88\x14\xfcgi\x9a\x16\x0f\ +\x88t\x1c\xe7A\xea\xfb[`?\xb9\xefr\xc2\xf6\x13\ +>\x04\xdc\x90\x8d\x7f\x00\xbf\x16\xa5`bD\x0f\x81\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01}\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x14\x00\x00\x00\x10\x08\x06\x00\x00\x00\x16\x18_\x1b\ +\x00\x00\x01DIDAT8\x8d\xad\x93A+DQ\ +\x18\x86\x1f#\x8d\xc8l\x94\x14QC\x16\xa2,N\x83\ +\x8d\x8dbJI\x8d,X($\x14\x0b!)%;\ +eq\xcb\xf0c\xf8\x09\xde\x95\xad\x85\xb2\xb1\xb1`c\ +cc\xe1\xbb:\x9d\xb9\xf72x7_\xefw\xcf\xf7\ +\x9c\xf7\x9e\xd3\x81\x14I:\x95\x94K\xfb\x9e\xa6\xc4\x01\ +I\x1d\xc0!0\xf7/@`\x15h\x02v\xeb\x056\ +\x84\x0d\xfb\xcd\x07\xa0\xc7Z%\xe7\xdc\xed_\x12\xcex\ +0\x80\xbdz\x12&\x017\x03_\x91\xd4\xfb+\xa0\xa4\ +\x22P6\xfbl\xb5\x11\xd8\x0e\xd6\x95$u\xfd$\xe1\ +\x06\x9f\xe7\xfa\x0eL\x02\xaf\xd6_\x97T0\xd8(p\ +\x03D\x99@Iy`\xc5\xec\x95s\xee\xce\x1bj\x03\ +\xd6\x0cv\x0d\x14\x80yI\xd3Y\x09\x17\x80v\xe0\x0d\ +8\xb3^\xe4\xa5\xdc\xf7`\xb1\xaa\x92\x9a\xd3\x80\xf1e\ +\x5c8\xe7\x9e\x00\x9cs/^\xca\xce\x00\x06\xd0\x0f\x1c\ +\xd4\x00%\x8d\x00\xe3\x96\xe6<\x18\xf2S&\xe9HR\ +_\x98p\xcb\xea=p,i\xca6\x9a\x05.\x81\xc7\ +\x0c`\x1e\xa8~\x01\xed\xf6\x96\xcc;`\x07\x980?\ +\x06,\x02\xc3\x19@\x80\xb2\xa4J\x9cp\x19h\x09\x16\ +\x14\xad\x0e|\x03\xf2\x15Ij\xcdQ\xfb2\x00\x06\xad\ +\x0e\xd5\x01\xec\x06N>\x00o\x01\x5c\xe2;\xefo\xbb\ +\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01u\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0b\x00\x00\x00\x10\x08\x06\x00\x00\x00\xc0\xbd\x85~\ +\x00\x00\x01\xcfy\xce=g\xa2!\xc9n\x5c\xc3!\xfc\ +\xc2F\xfc\xc0\xcd\xaaz\xaf\x13\x1eO\xf22\xc9i\x1d\ +\x92\xcc%YJr\x0e&I\xb6c\x11g\xaaj\xc5\ +\x14\x92l\xc6s\x5c\x18p\x19\xb7\xd6\x13BU\xfd\xc6\ +%\xdc\x18p\x0cO\xd6\x13v\x05\xaf\xb1m\x06?\xab\ +j\xb5\xb5\xdc\x87\xa3X\xc6a\xec\xac\xaag\xad\xe6\xdb\ +\x80\x17IN\xb5\x87\x19\xdci\xe7>\xb64\x93\x03X\ +\x19\xf0\x10\x0bIf\xab\xea\x03\x96\xb0\x80/U\xf58\ +\xc9&\xdc\xc5\xed\xa1\xaa\xfe\xe2js\xd3\xfe\x7f\x11\xef\ +Z~\x1d\x0f\xaa\xea\xfb\xd0\x06x\x85!\xc9\x0e|\xc5\ +,\xc6\xed\x9c\xc0S\x18\xba\xa1\x971\xdfo!\xc9A\ +\xbc\xa9\xaa\xb5q\xa0\x11\x8fp\x0f[\xb1\x17Gp\x12\ +WF\xc1d\xcai\xb1\x85k\xed\xdeSUs#\xdf\ +;\xc3.\xec\xef\xf2?=9-\xfe\x88U\xfck]\ +7\xf4\xe40%>\x8f\xb7\xf8\x8cO8\xdb\x93\xff\x01\ +?\x07g7v\xdb#C\x00\x00\x00\x00IEND\ +\xaeB`\x82\ +\x00\x00\x01\x03\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x11\x08\x06\x00\x00\x00?\x98\x97\xc7\ +\x00\x00\x00\xcaIDAT8\x8d\xed\xd2=J\x03Q\ +\x14@\xe1od2\xa6\x11W\x90F\xec\xd2Y\x84\x08\ +.!\xe0\x02DHe\xe1n\xa6\xb2Nm'$\xa5\ +\x16YA\xba\xb1\xb0\xb1\xc8\x16\x04GL\x8a\x99\xe0\xf8\ +\x08f^\xb4\xf4\xc0\xe5\x15\x17\xce\xbb\x7fIQ\x14\x0f\ +\xb8\xd0\x9e\x15\xae1\x0b\x13)Fx\xc6\x02\x07;D\ +=\x0cq\xba-\x99\x22\xc1\x13n[Tu\x82\x17\x5c\ +\xa1\xdfp\x1ca\x99\xb6\x104\xf9\xa8\xdfA\x1d\xdf\xd8\ +\xd5V\xc8\xab\xaa\x930\xee\xf0\x16+\xfb\x89\xf7\xb0\xcd\ +.&\xf5o1\x9cQ\x0d\xaf\xc9\xa1j\xbb\xe3H\xd9\ +\x14\xf9\xb6\x05\x94\xb8\x8f\x94\x1d#\xff\xcb\x99Eo\xf3\ +_\xf6%\xfb\xfc\xa5\xa7D\xb69\x8dKt\x90\xed)\ +K6\xb29\xceq\xd3H\xae\xf6\xa8\xecq\x0d\xfe\xb1\ +\x1c=z\xc7\xebp\x00\x00\x00\x00IEND\xaeB\ +`\x82\ +\x00\x00\x01)\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x12\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1b\x06/\x5c\ +\x00\x00\x00\xf0IDAT8\x8d\xd5\xd2/K\x83Q\ +\x18\x05\xf0\xdf\xe6\x9a`0h1\xbb&\x13\xee'\x10\ +\xf4KX\xd4l\x10\xecV\x99E\xa3q3\x1b\xd4b\ +5\x18\x9f0\x0d6\x83`S\x04\xa3 \xce\xe0\x8b\xbc\ +\x5c\xdc\xdd\x16=\xed\xdc?\xe7\x1c\xce\xf34\x22bh\ +4\xeeRJ\x9d\xc2\xfd/\x9a\x93<\xfa\x9fB-l\ +\xd7\xf8:^0\xa8\xf8\xdb\xa4B\x8d:\x89\x88\x1e\x06\ +)\xa5\x93\xec|\x07\x07\x05\x9d\xe7V\xc9%\x22\xf6\xd1\ +\xc7\x1c\xeeG\x88\xb5\xd1\xcd\x13]c\x15\xef\x18b\x09\ +\x9f\xb8\xc40\xa5\xb4\xf5\x87Y\x07\x17y\xa2W\x9c\xe3\ +\x0a\x0b\xd8\xc5)\xe6\xb1RJ_\xec(\x22\x9a)\xa5\ +\xaf\x88\xd8\xc3qA\xe7)\x8f\xd9\xab>M\x8db\xd9\ +5\x83\xb1\x89\xc6M\xed\x01\x87\x15\xedOS\xf626\ +#\xe2\xc8\xcf\xd6\xcf\xe0\x0c\xb7x,\x99\xe6B\x1b\x98\ +\xc5G\xc5o\xd0\xc5\x22\xd6*\xf7\x1cm\xb2\xa9\x8d\xc2\ +$\x9b\xfd\x0d1\x8aV\x95q\x1f\x8eP\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x02\x01\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x14\x08\x06\x00\x00\x00k\xa0\xd6I\ +\x00\x00\x01\xc8IDAT8\x8d}\xd3\xcf\x8b\xcdQ\ +\x18\xc7\xf1\xd7\xdc\xaeD\xc9(4\xca\x1d\x1b\x16\xc4\xea\ +\xa2\x98\x85\xc5\x10eAhJj\x84\xf8\x0b\xb0\xc4\xca\ +\x86\xa4&c\xd6\xb2\xa04%\xc9\x8f\xe4\xc7$\xc4\xbd\ ++3S\x16\x16D\x94_%\xc5\x8c\xb8\x16\xe7\xf96\ +\xdf\xf9\xba\xdf9\x9b\xcfs\xcey\xce\xfb<\xcfy\x9e\ +\xd3\xd1j\xb5\xb4\x1b\xcdf\x13\x06q\x1c?by\x1f\ +&p-\xef\xdb\xd1h4\xdaBb\xf4c>\x06b\ +~\x13\xfb\xf19\xefT)9\xbc+\xf4\x0a6\x87=\ +\x0b\xbf\x8a\x802\xc8\x06\x5c\xc5JLb\x07:\xb1\x08\ +\xbbs~\x8bq\x06\xab\xdbAN\xa2\x8a\x13\xb9\xb5\x87\ +x\x1f\xba0\xa2\xbb\x8e\xa7\x18+B6bk\xd8}\ +\x11\x0d\x5c\x08\xdd\x84\xb3x\x80\x1e\x0c\xa3U\x84d\xb7\ +\x7f\x88T\xb3\xf9eSo\xb1\x0d\x7f\xf07;\x94\x87\ +\xac\x8b(\xbec\x8b\xf4\x1e}X\x8e\x9f\x18\x0a\xbf/\ +\x91Rov>\x0f9\x1a:\x841\x5c\x8a\xfdc\xb1\ +>\x18\xe0\xf31\xdf\x89&\xb6g}\xd2\x8d\xd7\xb1\xd9\ +\x1d\xe9\xac\xc2\xa8T\xd6\xa5\xf8\x8a\xf5x\x9e\xbbx6\ +\xe6f\x91\x1c\x92*2\x1c\x00\x18\xc7]\xcc\x91\x9a\x0e\ +\xe6\xe1H\x0e2\x81o\x95\x08\xf9@.\xe4\xfc\xb8\x18\ +z0\xf4I\xf8N+HEj\xae\x1a\xde`\xa4\x00\ +\xb9\x15i\xac\xc1\x0a\xe9\x81\xefDZ\xd3 \xbda\xdf\ +@\xf17N\xc6!R\xc5\xe0\x14\x9e\xe5\x9d\xaa\xe8\x0a\ +\xfb\x95\xf6c<\xb4\x06\xf5z\xfd?\x87\x8a\xa9&\xaa\ +\x95@\x96\x85~,\xd9W\xc1\xbd\xb0\xfb\xb1\xa0\xb0\xbf\ +\x04{\xc2\xbe?\x13d\x04\x8f\xa5\xb4nc\xad\xf4\xed\ +{\xa4\x12wJ\x9f\xede\x19\xa4\x1a\xba\x17\x8f\xa4W\ +\x7fQ\xf0\x19\xc5\xe12@\x16\x09\xbc\x8b\x08\xce\xe1-\ +~K\x1d|Zj\x81O3A\xfe\x015\x8de<\ +wk\x85?\x00\x00\x00\x00IEND\xaeB`\x82\ +\ +\x00\x00\x01\xba\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x15\x00\x00\x00\x10\x08\x06\x00\x00\x00\xf9\xda4%\ +\x00\x00\x01\x81IDAT8\x8d\xa5\xd1M\x88\x8ea\ +\x14\xc6\xf1\xdf\xfb6>\x92\x92|Dij4\xa1\xec\ +8\x1b+5\xb1\x18f\xa1f\xc5J1\xc3DVR\ +H!+;\x14\xc9J\xd2lf\xe3\xabdg)\x97\ +\x94\xb2\xb1 e\xc9\xdeJ\x16\x9eW\x8f\xe9\x19\x93q\ +V\xe7>\xd7\xb9\xfe\xf7\xb9\xef\xd3\xb3\x84H\xd2\xc3.\ +L\xe0 f\xaa\xea\xcd@\xef/`\xda\x94d\xef_\ +\xb8}\x5c\xc0e\xacn\x03ah\x01\xd3q\xec\xc1\xcb\ +\x05\xf4Q\x8c\xe1\x1df\xbbn\x9c?e\x1fS\x18O\ +\xb2\xbdC_\x87\xc7\xb8\x86\xdd\xb87\xbf\xa7k\xd2q\ +\x0c7\xf9\x19\x9cj\x01\x97\xe3\x01\xceV\xd5\x93\xa6\xfc\ +m\xd1Iq\xb2\x95\x1fM\xb2\xb6\x01\xf6p\x15\x17\x07\ +\xc0$\x9b;\xfc\x7fB\x93\x0c\xe3@\xab\xb4\x0a\xd3M\ +^\xb8SUo[\xfaX\x92\x1d\x8bM:\xd5Q;\ +\x9dd\xa8\xaa^W\xd5\xe7$\xd3IF\x1am\x16\x97\ +\x92l\xe8\x84&\x19\xc2\xb1\x8e\xd7l\xc1d\xd33\x83\ +\xbb\xb8\x01U\xf5\x03\xd71\x97d\xe5\xc0\xd0kA'\ +1\xd7\x01\x85W\xb8\x8f\xdb\xad\xdaDU=k\xbc7\ +\xb1\x11\x87\xd1kC_`\xff\x02\xd0\xae\xf8\x88\x9dU\ +\xf5=\xc9\x1a|@\xf0\xb4\xdf\x00G\xb1\xef\x1f\x80\xb0\ +\x15\xe7\x9a|\x19>\xf9\xb5\xe4m\x83?\x9d\xd6\xfa\x8a\ +\x7f\x88\xf3IF\xaa\xea+\xae\xe0=FzIV\xe0\ +\x0b\xd6/\x01\x0a\x8f\xaa\xea\x10\xbf\x97=\xd6Kr\x04\ +\x0f\x97\x08\x1c\xc4xU=\x1f\x1c\xfa8\xf1\x9f@\xb8\ +\xd5\xbc\x18\xfc\x049\xa0\x7f\x85\xe9\xdfLL\x00\x00\x00\ +\x00IEND\xaeB`\x82\ +\x00\x00\x01\xb8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x11\x00\x00\x00\x12\x08\x06\x00\x00\x00\xbd\xf95T\ +\x00\x00\x01\x7fIDAT8\x8d\x95\xd3;hTQ\ +\x10\xc6\xf1\xdf\xbd((jv;\x05+\xc1\xad\x04!\ +0\x8d\x8d\x16\x82\x88H*A\xd2\xd9\xf8\xa8\x04\x1b5\ +\x82\x9d\x06;\xed\xc4B\x10\x0b\xedl$\xb0`e\x93\ +\x22\x0e\xda\x1bS\x89/\x10\x82\x16\xc1g\xb4\xc8\x89\x5c\ +\xd7\xbb\xbbf\xe0p\x98\xef|\xe7\xcf\xcc\x1cN\x95\x99\ +\xbd\x88X\xb4\xc1\xc8\xccI\x5cA\xa7\xca\xcc{\x98\xc6\ +\x02nF\xc4\xa31\x97\x8f\xe1\x01:E\xba[ef\ +\x0f/\x1b\xbek\x11qu\x0ch\x19\xdd\x92\xee\xadK\ ++\xcbE\xf8\x85'c\x00w\x0a\xe03>F\xc4R\ +]\xce\xfa\x98\xc3\x0f\xf43\xb3;\x04p\x02\xa7\xf18\ +\x22:8\x05\xeb\x903\x11q\x1c\xfb\xf0\xd5\xda|\x06\ +\x01{p\x1f\xd7#b\x0a\x22b\x0e\xaa\x16\xf3v<\ +\xc3+\xac\xcf\xa6\xc6C\xcc\xb4\x0d\xfe\x1fH\x03\xf6\x0d\ +\x9b\x1b\xd2\xdb\x88\xd8\xdd\xe6\xad\xdb\xc4\x12+\x03\xf9\xf7\ +a\xc6Q\x90\xff\x8eQ\x90\xc1\xb3m\x1b\x82d\xe6I\ +\xac\xe2ic\xc9\xcc\x1bm\xfe\xb6\xd7\x99\xc5y\xf4\x22\ +\xe2]C\xdf\x82\xf7\xd6\x9e\xffhD\xac\xfeUIf\ +\x1e){\x1f\x971\xdd\x04@D|\xc1A\x1c\xc6R\ +f\xee\xcc\xcc\x99?\x95d\xe6\xa7R~\x17\xb7\x22\xe2\ +\xc2\xb0\xfe3\xf3\x1cn\x17\xffJD\xec\xa8\xca\x97~\ +^<\x1f\x22b\xd70@\x81L\xe05&\x8at\xa0\ +\xc6\xc5\x86gkf\x1e\x1a\x05\xc1$\x16\xf1\xb3\xe4\x97\ +\xaa\xcc\x9c\xc7\x1b\xccF\xc4\x8b1\x80fE\x9bp\x16\ +\xfb\x7f\x03$D\x8d]u\xca0\xbc\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x04\xdc\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a Set object hei\ +ght 1\x0a \ + \x0a \ + \x0a \ + \x0a \x0a \ + \x0a <\ +/g>\x0a\x0a\ +\x00\x00\x01h\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x0c\x00\x00\x00\x10\x08\x06\x00\x00\x00\x22a\x9e\x07\ +\x00\x00\x01/IDAT(\x91m\xd2!H\x9dQ\ +\x14\x07\xf0\xdf\xf7=\xf0\xa5!\x82\x93\x85\x85\x81E\x96\ +\x0c\x074mma\xb0\xf0\x94\x19\xb5Y\xc4<\x1cC\ +\x04\xe3\xb3\x8a\x0b\xa6\x85\x85\x19\x1e\x0c\x8b\xc50\xb4\xdd\ +&cF\x8b\x08o,\x092\xa6\x8c\x85w\x95\x8f\xbb\ +\xef\xa4{\xcf\xff\x9c\xff\xff\xfc\xcf\xbd\x95\x96H)=\ +\xc5\x17\xbc\x89\x88_M\xacn)\xee`\x0f\x17\xd8(\ +\xf1\xaaQ8\x89>z\xe8\xe0;\xa6\xf1\x0d[\x11q\ +\xf6\xa0\x90R\x9a\xc1\x0f,c\x1cG\x111\x8f)\xec\ +\xe3 \xa5\xb4\x04UJ\xa9\x9b\xe5\x9f4\x94\xb7#b\ +\xb3\xa1>\x85\x13\xf4j\xac`\xa2\x18\xf5\xb2y\x89\x88\ +!\xde\xe1C\x8d\xb7\xe8\x16\x0d\xbfK\xb38\xc4\x5c\xdd\ +\xc2\xde\x1a\x11q{o\xfa\xbc\x05\xaf\xcaD\xf6qS\ +\x1b\xed\xfc\xba\xc0\x1f\xb7\x90\xac\xe1\xa0\x8e\x88S\x1c\xe3\ +O\x03|V\xb0/b\x01;UN\x8c\xe13^\xe1\ +\x11\xce\xf2\xf99V3\xc1bD\x5cV\x05\xd3\x1c\xd6\ +\xf1\x1a?q\x87M\x0c\x22\xe2o\xab\xb9\xdc\xd8\xc7\x0b\ +|\x8a\x88\xdd&\xf6\xdf\xe7\xcb\xf1\x1e_\xf1\xb1\x04\xee\ +=\xcc\xe2\xa5\xd1\x9bt\x8d\xfeP'/b\x98G\xbb\ +\xc2\xe0\x1f\x06\xdbU3\x9dA\x19\x09\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x01O\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x13\x00\x00\x00\x12\x08\x06\x00\x00\x00\xb9\x0c\xe5i\ +\x00\x00\x01\x16IDAT8\x8d\xe5\xd4=/DA\ +\x14\xc6\xf1\xdf\xae\xcd\x8d\xd7H\xd8\x88\xc6&tJ\x89\ +B\x22\xdb)t(\x84\x8f\xe0\xa5\xf09T:\x85\x1a\ +A\xa3Pjt\xbe\x00\xb2\x05\xd1\xa0\x14B\x16\xbb\x89\ +(\xee\xacl.\xb9w\xb3JOu\xe6\xccs\xfe9\ +3g2\xb9J\xa5r\x8e)\xed\xe9\x18\xcb\xa8A\x01\ +\xe3a\xe3\x05\xcf(\xe2!\x050\x84W\xf4a\x01\x07\ +\x0d`!\x18\xea(a\x04\xdb(\xa7\xc0\xf6\xb0\x8f+\ +\x9c\x06\xe0!\x96\xf2\xc1P\xc5S\xabg\x0b\xba\xc5l\ +\xa8\x9b\xc7Q>\xdd\x9f\xa9kl\x84x\xae\xf0\x8b\xa1\ +\x88\xc5\x14@)\xb1\xde\xc5\x16\x06\x92\xb0{\x9ca\x06\ +\x11z\x9a\xf6\xde\xf0\x8eK\xf1}5\xf4)\x1e\xc8\x0f\ +\xd8#VS\xbaJU\x12\xd6\x8b\x15td\xd4U\xb1\ +\x83\x8f\xe6dr\x00\xa3Xo\xa1\x895Lfu\x06\ +w\xd8\xcc\x80\x95\x91K&\xff\xfa4\xfe3\xac\x0b\x83\ +m2\x22\xf1\x0f\xf2=\xcdH\xfc\xedT\xd1\x89\x9b\x0c\ +\xc00&\xc4\xef\xb1?\xd4\xd4\x0a\xb8\xc0t\x00F\xc1\ +<\xd6BG\xddMq\x1d'_\xecY0\xc6f\xd8\ +\x84\x84\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01/\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x08\x00\x00\x00\x10\x08\x06\x00\x00\x00+\x8a>}\ +\x00\x00\x00\xf6IDAT(\x91m\xd0=+\x86\x01\ +\x18\xc5\xf1\xdf\xf3\x84\xb2\xb0\x89\xf4$\xe4\xa5\x8c\xae\x12\ +\x8b\x922\xd9\x18\x14\xa3\x85\xd5\x8a\xcf`\x90\xcd\xcb&\ +e\x91\xcc>\xc0UH^V\x93A\x8aE\x8a\xb0\xdc\ +wn\xe5l\xd7\xe9\x7f\xaeN\xa7\xa6Pf\x0e\xe1\x1c\ +w\x98\x8e\x88/\xa8\xfb\xd5\x22v\xd0\x8e\xd1\xd2\xac\x02\ +\x9fh\xa0\x05\x1f\xa5\xd9T\x01\x0ep\x8dK\x5c\xfd\xf7\ +\xe1\x15\x0f\xb8\x8d\x88\xef\xff\x80u\x0cb&3;\xff\ +\x00\x99\xb9\x899\x1c\xe1\x19W\x999\x09\xb5\x02\xb8,\ +\xfa\xacb\x1e\xb3h\xc5[Sfv\xa1\x1f\x138\xc4\ +MD\xf4\x14\xc1\xaezQn\x19Cx/v\x00\x11\ +\xf1X+\x8f\xcc\x5c\xc2\x02\xc60\x1c\x11O\xd5\x92\x0d\ +\xac\xe1\x0c7\xb8\xc8\xcc6\xa8gf3\xb6\xd1\x8bc\ +\xec\xa3\x03\x93\xe5\x92\x1b\xf8\xc2xD\x85\x9fX\x87\xdbU\x95uc\x11\x97\xca~\x0f\ +L\xe2\x03:\xaa\xc8&p\x00\x9f\xb1'~o\xc5\xd1\ + \xf8\x1e\x1d\xec\xca\x93\xd5\xd1\x17\xfey\xf4\x87?\x8d\ +\xe7-\x84u\xdc\xc0\xee\xc8\xe9\xc7\xeb\x88\x1dA_\x0d\ +\xab\xf1\x02\x9bsU\x5c\xc1}\xcc\xa0\x177q(\xda\ +k\xc5(\xae\xe3G\x863\xd8\x88\xf7\xf8\xaa\x1dk\xd1\ +\x89_xT\x10\xef\xc5\x02F2I\xa7\x078\x8b\xb7\ +\xb9\xc4\x83\xb8\x16\xf6\x02\x8e\xe3[.\xe72\xb6b2\ +\x93\xf6iTZ\xceV\xec\x97\xa6\xda\x90\xb4|\x22\xad\ +\xc2>i\x00+8-i9\x90I\xda\xac\xa0\x81\xc1\ +hk\x18\x87\xb1\x1c\xb1\xf1x\x9f\xf5g\xff\xaeb\x1e\ +\xe7h_\x8d\xa6\xa4\xcdX\xb4\x9e?\x9f\x8b\xd1\xd2\x89\ + \xf9K\xe3<\xd9;\xec\x95v\xa8\xec\xd4j\xd2d\ +{\xf2dE\xe7\xb4\x05C\xd2\x94\x8ap\x17\x17\x8a\x02\ +Ed$]f\xc3\xde\x86\x0d\xd2\xad~\x91$(-\ +\xb9\x0a\xc3\xb8\x855x\xa9\xfd\xbc\xfe\x8bl\x08\xa7\xa2\ +\xca)l\xafJ\xfe\x0dZUP\xe3\xae\x0f\xedJ\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xfc\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x17\x00\x00\x00\x12\x08\x06\x00\x00\x00\xb0\xe7E\x13\ +\x00\x00\x01\xc3IDAT8\x8d\xad\xd4\xcd\x8bNa\ +\x1c\xc6\xf1\xcf\x19/y\x9d\x85\x97\x14)\xa4\xcc\xc8\x82\ +\xe6\x96\x14EY(Rd\xa3\x89$\x8d\x05\xe5e\x1a\ +ec\x83\xb2\xb2\x90\x8d\x8d\x05v\x96vVVV\xd7\ +)\x7f\x02\xf2\x0f\xc8[\x8a\x1e\x8b\xe7\x9czL\xe7\x99\ +\x19q\xd5\xa9\xfb\xba\xbb\x7f\xdf\xdf\xd5\xef>\xe7T\xbd\ +^\xcfBT\xd7u\x85\xb3\x18\xc7G|\xc6\xb3\x89\x89\ +\x89\xa1\x80\xc5\x0b\x22\xf7u\x1d\xebJ)\xb7 \xc9X\ +\xb3\xf7`X\xc1HUU\xba\x9e\xba\xaeo\xd7u\xbd\ +\xac\xf5\xf8\x81WIv'9\x84\xefX?\xac\xbe\xaa\ +*#]\x1d\x93\x8cb\xa6\x19\xc3\x1f*\xa5\xbc\xc5[\ +\x9c\xd4\x1f\xcfPu\xc2q\x0e\xab0\x9d\xa4=\xf3\x0b\ +cI.b\x0b\xde\xe9\xcf}\xe1\xf0$\x15.7v\ +\x07\x8e5\xeb\xc7\xf8\x86\x8d8\x82Q<\x9b\x0b\xdeu\ +\xa1\x8716\xe0o\xe2e)\xa5\x87\xa7\x1daV\x96\ +R\xbe.(9\xae\xcc\xf2\x07\x92\xec\x9d#\xe0\xda$\ +\x17\xe6\x85'\xd9\x8c\x13\x1d\xe7ff\x9d\xdb\xde6,\ +\xa5|\xc0\xd2$\xa7\xe7K~\x09\x8b:\xe0\xa7\x92l\ +m\xc1x\x8d'I\xda\xb1>\xc6T\x92\x83\x9d\xf0$\ +K1\xd5\x01\xd64\xbc\x91dg\x03\xde\x84]\xb8\xd1\ +\xa4\xef\xe1\x1a^$\x19o\x8b\xaa\x01\xf8$\x9e\x0f\x81\ +\xc3W\xfd\x0fg\xdd\xc0\xde7\xec,\xa5\xbco\x18\xf7\ +0\x893\xf898\x96\xcb\xe6\xd6\xcaY`X\x81G\ +\x03\xfe.\x96\xe0\x0d\x0e\x8e4\x1d\xf7`\xff<\xf0a\ +:\x9e\xe4d\xb3\xde\xd7\xc0a[\x9b|\xf6\xeb\xf7\xb7\ +z\x98du)\xe55\xb6\xe1\x0e6TI\xd6\xe8\xff\ +#\x96\xffc\x83\x07\xa5\x94\xe9\xd6$Y5\x82\xf3\xff\ +\x01\x0cW\x93\xecnM)\xe5\xcbb\xfd\xdb\xfd\xf4\x1f\ +\xe0p\x1fG[\xf3\x1b\xdb,\x90K\x95\x7f\xdek\x00\ +\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x01\xb8\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x15\x00\x00\x00\x0e\x08\x06\x00\x00\x00\xc0\x06W\xce\ +\x00\x00\x01\x7fIDAT8\x8d\x8d\xd3\xbdk\x15Q\ +\x10\xc6\xe1g\xaf\x17EQ\xd1\x18E\x04\xb1\xd2F\xcb\ +\x01k\x0b\xed\x82\xa4NH\xa1EH\xa7]\x08\xa2H\ +\x04M\xa5\x85 \x8a \xe2_ X(\x08\x8aU\xc0\ +)\xc5\xc2&\x85\xe2g\xe7G\x22\x92\x0f\x8b\xdd\xab\xeb\ +\x82\xbbw\xba3\xf3\xce\xef\xcc9\xe7=\x85Fd\xe6\ +fLa\x0cG\xb1\x17[\xd1\xaf$k\xf8\x81\x0fx\ +\x81k\x11\xb1Tg\x145\xd8q\xdc\xc11\xf4\x9a\x9b\ +u\xc4\x1bLF\xc4\xcb?\xd0\xcc\xbc\x8b\xb3\x0d\xe1\x0a\ +>\xe3#~V\xb9-\xd5\xe4\xfb\xb0\xa3\xa1\xdf\xc0\xa5\ +\x88\x98/2\xf3\x02\xe6k\xa0\x07\xb8\x12\x11o\xdbF\ +\xcb\xcc]\x98\xab\x86\x19\xa9\x95\xc6\x8b\xcc\xfc\x86\xedx\ +\x84\xd3\x11\xb1>\xd4\x81\xff\xdd`\x12\xd71\x8awE\ +fn`-\x22\xfa\xed\xad\x9d\xe0Sx\x82\xf5\xc1\x83\ +l\xca\xcc\xd7\x999\xd2\xd27h\x9e\xce\xccC\xb5\xf5\ +\x91\xcc|\x8e\xc7U\xaa(2sYi\x19\xf8\x8a=\ +\x11\xb1\xda\x00\xf5q\x15\xd3\xca\x07\x9a\xc5+,(m\ +W\x8f\xef}\xdc\xc6\xb9*\xb1\x13\x13\xb8_\xc1F\x95\ +6\x1b\xf3\xd7\xa7p\x11\xdb\xfes\x98\x87\xbd\x888\x8f\ +\xa7\xb5\xe4\xfe\x0a8\xa3\xb4\xd4x\x03\xa8\x05\xf8\x1eg\ +z\x10\x11'1\x83/\xaa\xab\x88\x88[\xb8\xa7\xf4_\ +W\xac\xe2\x19\x0eG\xc4\xaf\xa2K\x9d\x99\x07\xb1\x88\x03\ +\x8d\xd22\x96\x94_\xf5rD|\x1a\x14:\xa15\xf8\ +\x14n`7f#ba\xd8\xdea\xe073\xf3D\ +\x9b\xe67\xefB~?\xd8\xe7\x90V\x00\x00\x00\x00I\ +END\xaeB`\x82\ +\x00\x00\x02\x0e\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00\x12\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1b\x06/\x5c\ +\x00\x00\x01\xd5IDAT8\x8dm\xd3M\x88\xceQ\ +\x14\x06\xf0\xdf;\xc6\x82)\xb10jl|5\x92\x8f\ +1u\x94\x90\x95\x95\x9a\x94\x12j2\x09[\x1a6,\ +H6\xa3|\x84\xcd\xa4h\xb2\xd1\x88\x99\x85\xaf\x86\xa4\ +\x88l\x8ef\x8a\x15K\xb3@hR\x94\x91X\xbc\xd7\ +\xf4\xce\xbf9u\xeb\x9e\xf3\x9c\x9es\xces\xef\xa9e\ +\xe6\x1cl\xc3hD\x8c\x9b\xc12\xb3\x0fK\xd0\x1d\x11\ +\x7ff\xca\xa9e\xe6\x03\xcc\xc5j\xb4G\xc4Df\x1e\ +\xc2A\xec\x88\x88\x8f\x999\x86\xa5h-g/\x1eF\ +\xc4\xdb\xffDMh\xc7\x1d\xfc\xc5\xfc\x12_\x8cuh\ +)\xfe0\xceD\xc4/\xdc,\xd8\x93\xc6\x8e\x9a\xb0\x1f\ +[\xf1\x1c\x9b!\x22N\xe3\x18\x96\x97\xbce\xf8Z\xee\ +\xdf\xb0\x16\x9f\xa7\x11E\xc4\x8b\x88\xd8\x8d\xe38\x95\x99\ +\x07\x0a6\x80\xdd\xe5\xde\x82\xef\x99\xb9\x08kp\xf6\x7f\ +\xd1)\x8d\x1a\x9d\xcc\x5c\x88\x07\x18\x88\x88\xfe\xcc<\x82\ +\x11\x5cB?\x8e\xe2bD\xdc\xcd\xcc\x1az\x8b\xb6\xe7\ +\xa6\x11\x15\xb2\x16\xdc\xc6c\x5c+z\xacG'\x86\x22\ +b\xa4\xe4m\xc1u\x0caC\xad\x04[\xd1\x19\x11\x8f\ +\x8a?\x1b]\x111\xdcP`\x05\xc6\x11\xd8\xa4\xfee\ +6b\x14\xef\x9bK\xde\x05tg\xe63L\x94Xo\ +\xa5\xd9\x85\xb8\x887x\x8dA\xcc\xc3J\xdco$\x1a\ +\xc3\x95\x88\xf8\xdd\xd0EG\xe9b\x01\xda\xcah7*\ +\x05\xdeR\x11\xbb\xa2\xd5N\xec\xc2>u\x91g\xe1G\ +\x19\xe9\x9e\xfa\x83L\x15m\x9a\x81\xa0\x96\x99'\xd1\x83\ +\x9e\x92<\x88=\x11q\x19?q\xb5\xe83e\xd5\xe7\ +\xefB\x1f>\xa8\xaf\xc7d\x03\xf6\xb2h\xf4N\xfdC\ +\xdej\xdc\xbbf\xd3m;V\xa9/\xe7d\x05\x9b\xc0\ +y\xf5\xbd\xec\xa8.ou\xb4\xc3h\x8b\x88\xb1\xea\xc8\ +\xea{\xd8\x87/XQ\x05\xa7uT\xf4\xf84\x03\x09\ +\x9c\xc0\x19<\xc5\xab*\xf8\x0f\xdd\xdb\x9d,w\xcc\x1f\ +\xb4\x00\x00\x00\x00IEND\xaeB`\x82\ +\x00\x00\x04\xe9\ +\x89\ +PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ +\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\ +\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\ +\x00\x00\x00 cHRM\x00\x00z&\x00\x00\x80\x84\ +\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ +\x00\x00:\x98\x00\x00\x17p\x9c\xbaQ<\x00\x00\x00\x06\ +bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\ +\x00\x09oFFs\x00\x00\x02\xc0\x00\x00\x00\x00\x00\x5c\ +]\xb9S\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\ +\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\ +\x07\xdf\x0c\x12\x0e\x1b\x0b$&IW\x00\x00\x00\x09v\ +pAg\x00\x00\x03@\x00\x00\x00 \x00\xbe\xe6\x89Z\ +\x00\x00\x03\xaeIDATX\xc3\xed\xd6]\x88UU\ +\x14\x07\xf0\xdf\x98\x8e\x96\xa8QIjA\x1f\x04BD\ +\xd0KQ\xf8\x12\x91\x11=\x04\xf5b'\x85\x8e\x88\x8d\ +i\xa7\x14\x02\xc3\xc2\xbe\xa0\xcc,8f\x1aa\xa7/\ +N\x11J\x05RP\xe1C\x1f\x86\x0f\xbe\x98(\x94\x1a\ +F\x94\x85Y\x98\xcd\x80:\xde\x1e\xf6\xbe\xce\x9e\xdb\xbd\ +3:MO\xb5\xe0p\xf7\xddg\x9d\xb5\xfe{}\xfc\ +\xf7\xe2\xbf.]\xcdE\x96\x17Oa\xc5(\xdb\x9f]\ +W\xe5'C)\x8cM\xd6+p\x02\x07p\xec\x1f:\ +\x9e\x82\x19\xb8\x1a\xa7\x0d\x00\x0e\xd4Uy\xc5h\x1c=\ +\xcb\x8b\x06N\x0e\xa7\xd7\x0a\xe0X\x07cS\xb0\x11\x1b\ +\xeb\xaa\xfch\x04``a\x8c\xcc\xea\xba*;\x02h\ +~\xb0\x16S\xf1\x07&`\x12n\xc7\xac,/\xde\xc5\ +\xf7Q\xb5\x0b\xefa:\xaeCo]\x95/%\xa6\x9a\ +5\xb6\x04k\x84\x14\x8f\xc9\xf2bU\x13D[\x00\x98\ +\x17\xd1\xf6cL\xb2\x7f!\xee\x8b\xc0\xc6\xe3\xec\x08\xe6\ +Z,C\x1fR\x00?dy\xb1\x00O\xa3;>\xcb\ +\xb0j\xc8\x08\xe0!\xcc\xc48\xfc\x88\x8bp\x17.\xc0\ +Y\xf1\x99\x8f\x8b\xb1\x07G\xe2i\x8f&6\x1e\x8b\xfa\ +\xeb\x92\xbdo1o\xd8\x14\xd4U\xf9J\x9b\xb4lC\ +\x95\xa4d\x0dz\xea\xaa\xdc\x89\x9dh\xad\x8d?\xf1L\ +\xf2\xffg\xcc\xaf\xabr{\xaa\xd4\xa9\x06\xee\xc0e\x06\ +\xaa\xb8\x0b\xbf\xe1~\xac\xc6\xb9B\x9b\xbd\x9d\xe5\xc5-\ +uU~\x99\xe5\xc5R\xf4\xd5U\xb9!\xcb\x8b\x1e<\ +\x19\xc16\x9d\xcf\xa9\xab\xf2\x8bV_\x9dR\xb0\x14\xb3\ +\xda\xec7\xe2\xd3\x1f\xd30\x11\x1fdy\xb1\x0c+\x85\ +\x22\xdb\x80\xf5-a\x9f\xdf\xce\xf9P\x006\xe2\xb3\xe8\ +,\x95cx\x1d7\x09\xc56\x1e\xe7\xc7P/\xc0\x8c\ +,/~O\xf4\x8f\x0a9\xdf\xde\xc1O\xc7\x1ax\xcd\ +\xd0\xf2j\x96\x17\xbdX+\x14\xdat\xbc)tLw\ +\xd4\xd9\x8f|(\xe7\x1d\x01dyq'.\xd5\x99\xc9\ +\xba\xf0\x0b\x1eF)\xb4\xe3\x84\xe4\xfd^<\x81\xc3\xc3\ +\x1c\xa4c\x0a\x1e\xd4\xbe\x06Ri\x08\xfd\xbcI\xe0\x8d\ +T\xd6\xc7\xc8\xcc\xc6\xae\x91\x00x\x03\xdb\x87\x89\xc0.\ +\xa1\x1d\x97\xb7y\xbfR`\xbfm#\x8a@;\x1eh\ +\x95,/\x16\x09\x0c\xd7\x94\xc3\x02qM\xc2d\xa10\ +\x17c\xdf\x19\x03\xc8\xf2b\xb9p\x95\xa6\x11\xe8\xc2q\ +!\xbf\x87\xf0\x82\xd0\x05\xf0\x13\xee\xc1%x\xd6\x00O\ +\xbc\x95\xe5\xc5\xaduU~~\xa6)\xb8M\xfb\x1a8\ +.\xe4\xbe;\xd9\xfbF\xa0\xdd\x0f\xe3\xbbE\x06\xc8j\ +\x22\xde\xcf\xf2ba]\x95\x9b\xcf\x04\xc0\xa3\xf1\x04M\ +\x1eh\xa0W`\xc7\xc7\x13\x00G1\x17\x07\xe3o\x1f\ +\xb6\xc6\xc8\xad\x13:\xe3<\xbc\x98\xe5Eo\xbb\xab<\ +\x1d\xc9\x1a\xd8SW\xe5\x95\x1d\xd2r\xaf\xc0rM\xd9\ +\x8f\xb9uU~\xd5F\x17z\x84V\x9c\x1a\xb7\x8f\x08\ +t<\x08D[\x00\x09\x0f4\x84Ke\x1c\x9e3\x90\ +\xf3}x$\x86\xf9S\xc9< \xcc\x077\xe0F\xec\ +\x10Z\xb2\xf9\xddA,I\xd31\x1c\x0f\xf4\x0b\xfc\xde\ +\x9d\x80=\x89\xcbQ\xc7\xbd9\x06\xe6\x81\x13\xd8\x1d\xed\ +.\xc6\xddx@ \xabnL\xc3\xcbY^l\x1en\ + i\xf2@\xbfPd\xd7\x08\x83\xc8^a.\x98\x8e\ +\x9b\xe3\xfb\xdd\x06\xcf\x03\xdf\x09\x83\x0bL\xab\xab\xf2\xf9\ +,/~\x8d\xe9\xeb\x12\xae\xf0S\x8eN\x8b\x07\xb2\xbc\ +\x98\x1c\xc3\xbb\xa5\xae\xca\x1dq{K\xa2\xf2\xb5d\x1e\ +\xc8\xf2\xe2\xfa\xb8lD{\x9b\xb2\xbc\x18\x8b\xee\xba*\ +7\xa5\xb6[\x01\x8cI\x8ahr\xb2\xdf\x10\xfa\xfbP\ +\x043\x94\x1c\xc19q}\xaa\xc6\xea\xaa|'\xda\x1d\ +$\xad\x00f\xc6b\x1c-\x19D\xe5i\xe8\xdb\x01\xc8\ +p\x95\xbf\xcf\x00#\x95\x06>\x1e\xc5\xc3\xfc/\xff\x8e\ +\xfc\x05\x99&,\xa0:Dw\xab\x00\x00\x00%tE\ +Xtdate:create\x0020\ +15-12-18T14:27:1\ +1+00:00YM\xe3\xc6\x00\x00\x00%t\ +EXtdate:modify\x002\ +015-12-18T14:27:\ +11+00:00(\x10[z\x00\x00\x00\x00\ +IEND\xaeB`\x82\ +\x00\x00\x04~\ +\x00\ +\x00\x01\x00\x01\x00\x10\x10\x00\x00\x00\x00 \x00h\x04\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ +\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ +\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +>\x00\x00\x00\xa1\x00\x00\x00\xd6\x00\x00\x00\xeb\x00\x00\x00\ +\xec\x00\x00\x00\xd8\x00\x00\x00\xa7\x00\x00\x00G\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x9e\x02\x022\ +\xff\x04\x10\x81\xff\x03#\xaa\xff\x02,\xbb\xff\x02-\xbc\ +\xff\x03$\xac\xff\x03\x12\x85\xff\x02\x028\xff\x00\x00\x00\ +\xac\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x0c\x00\x00\x00\xbb\x03\x08\x5c\xff\x02/\xcb\ +\xff\x00;\xca\xff\x00:\xca\xff\x009\xca\xff\x009\xca\ +\xff\x00:\xca\xff\x00;\xca\xff\x022\xcb\xff\x03\x09b\ +\xff\x00\x00\x00\xc9\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x98\x04\x08^\xff\x015\xca\xff\x00:\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x00:\xca\xff\x018\xca\ +\xff\x03\x09c\xff\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\ +0\x00\x00\x00\xfd\x02.\xc8\xff\x00:\xca\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x00:\xca\ +\xff\x022\xcb\xff\x02\x027\xff\x00\x00\x00E\x00\x00\x00\ +\x92\x04\x0eu\xff\x00:\xca\xff\x008\xca\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x00;\xca\xff\x03\x13\x87\xff\x00\x00\x00\xaa\x00\x00\x00\ +\xce\x02\x1f\xa4\xff\x00:\xc9\xff\x008\xc9\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x008\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x00:\xca\xff\x03%\xaf\xff\x00\x00\x00\xdc\x00\x00\x00\ +\xea\x02)\xb9\xff\x01:\xca\xff\x088\xd1\xff\x098\xd1\ +\xff\x078\xd0\xff\x058\xce\xff\x038\xcd\xff\x028\xcc\ +\xff\x018\xca\xff\x008\xca\xff\x008\xca\xff\x008\xca\ +\xff\x009\xca\xff\x02-\xbd\xff\x00\x00\x00\xed\x00\x00\x00\ +\xe8\x02)\xb8\xff\x0d:\xd6\xff\x139\xdb\xff\x118\xd9\ +\xff\x0f8\xd7\xff\x0d8\xd6\xff\x0b8\xd4\xff\x0a8\xd3\ +\xff\x088\xd1\xff\x068\xcf\xff\x048\xce\xff\x028\xcb\ +\xff\x009\xc9\xff\x02-\xbd\xff\x00\x00\x00\xed\x00\x00\x00\ +\xcb\x06\x1d\xa5\xff\x1b;\xe2\xff\x1a9\xe2\xff\x189\xe0\ +\xff\x179\xde\xff\x159\xdd\xff\x139\xdb\xff\x129\xda\ +\xff\x108\xd8\xff\x0e8\xd7\xff\x0c8\xd5\xff\x0a8\xd3\ +\xff\x01:\xcb\xff\x03$\xad\xff\x00\x00\x00\xd9\x00\x00\x00\ +\x8b\x07\x0dr\xff\x22;\xe8\xff\x22:\xe9\xff 9\xe7\ +\xff\x1e9\xe5\xff\x1c9\xe3\xff\x1b9\xe2\xff\x199\xe0\ +\xff\x179\xdf\xff\x169\xdd\xff\x149\xdc\xff\x139\xdb\ +\xff\x07;\xd0\xff\x03\x11\x82\xff\x00\x00\x00\xa3\x00\x00\x00\ +(\x00\x00\x00\xfa\x1c+\xd7\xff,;\xf2\xff(:\xee\ +\xff&:\xec\xff$:\xeb\xff#:\xe9\xff!:\xe7\ +\xff\x1f9\xe6\xff\x1d9\xe4\xff\x1c9\xe3\xff\x1b;\xe2\ +\xff\x090\xd1\xff\x02\x02/\xff\x00\x00\x00;\x00\x00\x00\ +\x00\x00\x00\x00\x88\x07\x08[\xff,5\xf1\xff3;\xf8\ +\xff.;\xf3\xff,:\xf1\xff*:\xf0\xff(:\xee\ +\xff':\xed\xff%:\xeb\xff&;\xec\xff\x1c6\xe3\ +\xff\x04\x08]\xff\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x05\x00\x00\x00\xaa\x08\x08[\xff)+\xe2\ +\xff8;\xfc\xff7;\xfc\xff4;\xf9\xff2;\xf8\ +\xff1;\xf6\xff/;\xf5\xff#/\xe5\xff\x06\x08`\ +\xff\x00\x00\x00\xbb\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x88\x00\x00\x00\ +\xf6\x0e\x0ex\xff\x1e\x1f\xb8\xff)+\xda\xff)+\xdb\ +\xff\x1d!\xba\xff\x0e\x0f~\xff\x00\x00\x00\xfb\x00\x00\x00\ +\x96\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ ++\x00\x00\x00\x8a\x00\x00\x00\xc8\x00\x00\x00\xe7\x00\x00\x00\ +\xe8\x00\x00\x00\xcb\x00\x00\x00\x91\x00\x00\x003\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ +\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ +\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ +\x00\x00\x03?\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a source control\ + connected\x0a \x0a \ +\x0a \ + \x0a\x0a\ +\x00\x00\x03C\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a source control\ + - not setup\x0a \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x04~\ +\x00\ +\x00\x01\x00\x01\x00\x10\x10\x00\x00\x00\x00 \x00h\x04\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ +\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ +\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x1c\x1a\x1c\ +>\x1c\x0f\x1b\xa1\x1c\x13\x1b\xd6\x1b\x1e\x1b\xeb\x19\x1d\x1a\ +\xec\x17\x0f\x17\xd8\x13\x05\x11\xa7\x0d\x09\x0cG\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00###\x0a#\x19\x22\x9e!$\x22\ +\xff\x18q!\xff\x0d\xb6\x1e\xff\x09\xd0\x1d\xff\x09\xd2\x1d\ +\xff\x0d\xba\x1f\xff\x16x \xff\x18!\x19\xff\x10\x05\x0f\ +\xac\x0f\x0f\x0f\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00%&%\x0c'\x1b&\xbb\x1fK$\xff\x09\xcd\x1d\ +\xff\x00\xfd\x19\xff\x00\xfb\x18\xff\x00\xf7\x18\xff\x00\xf6\x18\ +\xff\x00\xfa\x18\xff\x00\xff\x19\xff\x0a\xd7\x1f\xff\x18P\x1e\ +\xff\x12\x06\x11\xc9\x04\x05\x05\x13\x00\x00\x00\x00\x00\x00\x00\ +\x00-#,\x98\x22I&\xff\x03\xe6\x1a\xff\x00\xfb\x18\ +\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ +\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf9\x18\xff\x05\xf1\x1c\ +\xff\x18P\x1e\xff\x11\x06\x11\xaf\x00\x00\x00\x00.,.\ +0+.+\xfd\x08\xc8\x1c\xff\x00\xfb\x18\xff\x00\xf0\x19\ +\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ +\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xfa\x18\ +\xff\x09\xd7\x1e\xff\x19\x22\x1a\xff\x0c\x09\x0cE3&1\ +\x92\x1dk%\xff\x00\xfb\x18\xff\x00\xf0\x19\xff\x00\xf0\x18\ +\xff\x00\xf0\x18\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ +\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ +\xff\x00\xff\x19\xff\x16x \xff\x14\x07\x13\xaa3'2\ +\xce\x0f\xa5\x1f\xff\x00\xfc\x17\xff\x00\xf0\x17\xff\x01\xf0\x1a\ +\xff\x02\xf0\x1b\xff\x00\xf0\x19\xff\x00\xf0\x18\xff\x00\xf0\x18\ +\xff\x00\xf0\x18\xff\x00\xf0\x19\xff\x00\xf0\x19\xff\x00\xf0\x19\ +\xff\x00\xfa\x18\xff\x0c\xba\x1f\xff\x1a\x12\x19\xdc5/4\ +\xea\x07\xc2\x1a\xff\x03\xf9\x1b\xff!\xf27\xff%\xf2:\ +\xff\x1e\xf24\xff\x16\xf1-\xff\x0f\xf1&\xff\x08\xf0!\ +\xff\x04\xf0\x1c\xff\x01\xf0\x1a\xff\x00\xf0\x18\xff\x00\xf0\x18\ +\xff\x00\xf7\x18\xff\x08\xd1\x1d\xff\x1b\x1f\x1c\xed616\ +\xe8\x07\xc1\x1b\xff:\xfcO\xffT\xf5e\xffH\xf4Z\ +\xffA\xf4S\xff9\xf4M\xff1\xf3F\xff*\xf2?\ +\xff\x22\xf27\xff\x1a\xf10\xff\x12\xf1*\xff\x08\xf0 \ +\xff\x00\xf7\x17\xff\x08\xd0\x1d\xff\x1d \x1d\xed8.7\ +\xcb \xa1.\xffs\xff\x82\xffr\xf6\x80\xffi\xf6x\ +\xffb\xf6q\xffZ\xf6k\xffS\xf5d\xffL\xf5]\ +\xffD\xf4W\xff=\xf4P\xff6\xf3I\xff-\xf2A\ +\xff\x06\xfb\x1f\xff\x0b\xb5\x1d\xff \x17\x1f\xd9;2:\ +\x8b3i9\xff\x91\xff\x9d\xff\x95\xfa\x9f\xff\x8b\xf8\x96\ +\xff\x83\xf8\x8f\xff{\xf7\x88\xfft\xf7\x82\xffm\xf7{\ +\xffe\xf6t\xff^\xf6n\xffV\xf5g\xffS\xf5d\ +\xff\x1d\xfe5\xff\x13q\x1d\xff\x1f\x12\x1e\xa3><=\ +(262\xfa\x83\xc4\x8a\xff\xbf\xff\xc7\xff\xac\xfa\xb4\ +\xff\xa5\xfa\xae\xff\x9d\xf9\xa7\xff\x96\xf9\xa0\xff\x8e\xf9\x99\ +\xff\x87\xf8\x92\xff\x7f\xf7\x8c\xffx\xf7\x85\xfft\xff\x83\ +\xff(\xce9\xff\x1f' \xff!\x1e!;\x00\x00\x00\ +\x00>;>\x88DME\xff\xbd\xe3\xc2\xff\xdb\xff\xdf\ +\xff\xc7\xfd\xcc\xff\xbe\xfb\xc4\xff\xb6\xfb\xbe\xff\xaf\xfa\xb7\ +\xff\xa8\xfa\xb0\xff\xa1\xfa\xaa\xff\xa3\xff\xad\xffx\xeb\x84\ +\xff$M(\xff'\x1f&\x9f\x00\x00\x00\x00\x00\x00\x00\ +\x00<=<\x05979\xaaLPL\xff\xba\xc7\xbb\ +\xff\xf1\xff\xf4\xff\xee\xff\xf0\xff\xe2\xff\xe6\xff\xda\xff\xdf\ +\xff\xd5\xff\xda\xff\xcd\xff\xd3\xff\x9b\xd0\xa0\xff9M;\ +\xff#\x1d#\xbb\x0d\x0e\x0d\x0b\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00CCC\x04<;<\x889:9\ +\xf6lnl\xff\xa4\xa8\xa4\xff\xc3\xcb\xc4\xff\xc1\xcd\xc2\ +\xff\xa2\xb0\xa3\xffitj\xff333\xfb,'+\ +\x96$$$\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00BBB\ ++555\x8a111\xc8444\xe7333\ +\xe8-+-\xcb,*,\x911113\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ +\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ +\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ +\x00\x00\x03E\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a source control\ + - warning v2\x0a \x0a \ + \x0a \x0a\x0a\ +\x00\x00\x04~\ +\x00\ +\x00\x01\x00\x01\x00\x10\x10\x00\x00\x00\x00 \x00h\x04\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ +\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ +\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +>\x00\x00\x00\xa1\x00\x00\x00\xd6\x00\x00\x00\xeb\x00\x00\x00\ +\xec\x00\x00\x00\xd8\x00\x00\x00\xa7\x00\x00\x00G\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x9e\x0148\ +\xff\x02\x8c\x92\xff\x01\xbf\xc1\xff\x01\xd5\xd4\xff\x01\xd6\xd5\ +\xff\x01\xc2\xc3\xff\x01\x91\x97\xff\x01;@\xff\x00\x00\x00\ +\xac\x00\x00\x00\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x0c\x00\x00\x00\xbb\x01bh\xff\x01\xe7\xe6\ +\xff\x00\xec\xe6\xff\x00\xec\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xec\xe6\xff\x00\xec\xe6\xff\x01\xe8\xe6\xff\x01io\ +\xff\x00\x00\x00\xc9\x00\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x98\x02cj\xff\x00\xea\xe6\xff\x00\xec\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xec\xe6\xff\x01\xeb\xe6\ +\xff\x01jp\xff\x00\x00\x00\xaf\x00\x00\x00\x00\x00\x00\x00\ +0\x00\x00\x00\xfd\x01\xe4\xe4\xff\x00\xec\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xec\xe6\ +\xff\x01\xe8\xe6\xff\x019>\xff\x00\x00\x00E\x00\x00\x00\ +\x92\x02~\x84\xff\x00\xec\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xec\xe6\xff\x01\x93\x9a\xff\x00\x00\x00\xaa\x00\x00\x00\ +\xce\x02\xb7\xba\xff\x00\xec\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xec\xe6\xff\x01\xc6\xc6\xff\x00\x00\x00\xdc\x00\x00\x00\ +\xea\x01\xd3\xd3\xff\x00\xec\xe6\xff\x04\xeb\xe9\xff\x04\xeb\xe9\ +\xff\x03\xeb\xe9\xff\x02\xeb\xe8\xff\x02\xeb\xe7\xff\x01\xeb\xe7\ +\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\xff\x00\xeb\xe6\ +\xff\x00\xeb\xe6\xff\x01\xd7\xd6\xff\x00\x00\x00\xed\x00\x00\x00\ +\xe8\x01\xd0\xd1\xff\x06\xec\xec\xff\x09\xeb\xee\xff\x08\xeb\xed\ +\xff\x07\xeb\xec\xff\x06\xeb\xeb\xff\x05\xeb\xeb\xff\x05\xeb\xea\ +\xff\x04\xeb\xe9\xff\x03\xeb\xe8\xff\x02\xeb\xe8\xff\x01\xeb\xe7\ +\xff\x00\xeb\xe6\xff\x01\xd7\xd6\xff\x00\x00\x00\xed\x00\x00\x00\ +\xcb\x03\xb4\xb9\xff\x0d\xec\xf1\xff\x0d\xeb\xf1\xff\x0c\xeb\xf0\ +\xff\x0b\xeb\xef\xff\x0a\xeb\xef\xff\x09\xeb\xee\xff\x08\xeb\xed\ +\xff\x07\xeb\xed\xff\x07\xeb\xec\xff\x06\xeb\xeb\xff\x05\xeb\xea\ +\xff\x01\xec\xe6\xff\x01\xc2\xc4\xff\x00\x00\x00\xd9\x00\x00\x00\ +\x8b\x03x\x7f\xff\x10\xec\xf4\xff\x10\xec\xf4\xff\x0f\xec\xf3\ +\xff\x0e\xec\xf3\xff\x0e\xeb\xf2\xff\x0d\xeb\xf1\xff\x0c\xeb\xf1\ +\xff\x0b\xeb\xf0\xff\x0a\xeb\xef\xff\x09\xeb\xee\xff\x09\xeb\xee\ +\xff\x03\xec\xe9\xff\x01\x8d\x93\xff\x00\x00\x00\xa3\x00\x00\x00\ +(\x00\x00\x00\xfa\x0d\xd9\xe5\xff\x15\xec\xf9\xff\x13\xec\xf7\ +\xff\x12\xec\xf6\xff\x11\xec\xf5\xff\x10\xec\xf5\xff\x10\xec\xf4\ +\xff\x0f\xec\xf3\xff\x0e\xeb\xf2\xff\x0d\xeb\xf2\xff\x0d\xec\xf1\ +\xff\x04\xe7\xe9\xff\x0115\xff\x00\x00\x00;\x00\x00\x00\ +\x00\x00\x00\x00\x88\x03^e\xff\x15\xe9\xf8\xff\x18\xec\xfb\ +\xff\x16\xec\xf9\xff\x15\xec\xf9\xff\x14\xec\xf8\xff\x13\xec\xf7\ +\xff\x12\xec\xf6\xff\x12\xec\xf6\xff\x12\xec\xf6\xff\x0d\xea\xf1\ +\xff\x02ci\xff\x00\x00\x00\x9f\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x05\x00\x00\x00\xaa\x03]d\xff\x13\xd9\xea\ +\xff\x1a\xec\xfe\xff\x1a\xec\xfd\xff\x19\xec\xfc\xff\x18\xec\xfb\ +\xff\x17\xec\xfb\xff\x17\xec\xfa\xff\x11\xe3\xf1\xff\x03cj\ +\xff\x00\x00\x00\xbb\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x88\x00\x00\x00\ +\xf6\x06w\x81\xff\x0e\xb2\xc0\xff\x13\xd1\xe2\xff\x13\xd2\xe2\ +\xff\x0e\xb6\xc3\xff\x07~\x88\xff\x00\x00\x00\xfb\x00\x00\x00\ +\x96\x00\x00\x00\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ ++\x00\x00\x00\x8a\x00\x00\x00\xc8\x00\x00\x00\xe7\x00\x00\x00\ +\xe8\x00\x00\x00\xcb\x00\x00\x00\x91\x00\x00\x003\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ +\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ +\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ +\x00\x00\x04~\ +\x00\ +\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00 \x00h\x04\x00\ +\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\ +\x00\x01\x00 \x00\x00\x00\x00\x00@\x04\x00\x00\x13\x0b\x00\ +\x00\x13\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|||\ +>|||\xa1|||\xd6|||\xeb|||\ +\xec|||\xd8|||\xa7|||G\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00|||\x0a|||\x9e\x89\x89\x89\ +\xff\x9e\x9e\x9e\xff\xa8\xa8\xa8\xff\xac\xac\xac\xff\xad\xad\xad\ +\xff\xa9\xa9\xa9\xff\x9f\x9f\x9f\xff\x8b\x8b\x8b\xff|||\ +\xac|||\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00|||\x0c|||\xbb\x94\x94\x94\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\x96\x96\x96\ +\xff|||\xc9|||\x13\x00\x00\x00\x00\x00\x00\x00\ +\x00|||\x98\x95\x95\x95\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\x96\x96\x96\xff|||\xaf\x00\x00\x00\x00|||\ +0|||\xfd\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\x8a\x8a\x8a\xff|||E|||\ +\x92\x9b\x9b\x9b\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\x9f\x9f\x9f\xff|||\xaa|||\ +\xce\xa6\xa6\xa6\xff\xaf\xaf\xaf\xff\xaf\xaf\xaf\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xaa\xaa\xaa\xff|||\xdc|||\ +\xea\xac\xac\xac\xff\xb0\xb0\xb0\xff\xb3\xb3\xb3\xff\xb4\xb4\xb4\ +\xff\xb3\xb3\xb3\xff\xb2\xb2\xb2\xff\xb1\xb1\xb1\xff\xb1\xb1\xb1\ +\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\xff\xb0\xb0\xb0\ +\xff\xb0\xb0\xb0\xff\xad\xad\xad\xff|||\xed|||\ +\xe8\xac\xac\xac\xff\xb6\xb6\xb6\xff\xb9\xb9\xb9\xff\xb8\xb8\xb8\ +\xff\xb7\xb7\xb7\xff\xb6\xb6\xb6\xff\xb5\xb5\xb5\xff\xb4\xb4\xb4\ +\xff\xb3\xb3\xb3\xff\xb2\xb2\xb2\xff\xb2\xb2\xb2\xff\xb0\xb0\xb0\ +\xff\xaf\xaf\xaf\xff\xad\xad\xad\xff|||\xed|||\ +\xcb\xa8\xa8\xa8\xff\xbd\xbd\xbd\xff\xbc\xbc\xbc\xff\xbb\xbb\xbb\ +\xff\xbb\xbb\xbb\xff\xba\xba\xba\xff\xb9\xb9\xb9\xff\xb8\xb8\xb8\ +\xff\xb7\xb7\xb7\xff\xb6\xb6\xb6\xff\xb5\xb5\xb5\xff\xb4\xb4\xb4\ +\xff\xb0\xb0\xb0\xff\xa9\xa9\xa9\xff|||\xd9|||\ +\x8b\x9b\x9b\x9b\xff\xc0\xc0\xc0\xff\xc0\xc0\xc0\xff\xbf\xbf\xbf\ +\xff\xbe\xbe\xbe\xff\xbd\xbd\xbd\xff\xbd\xbd\xbd\xff\xbc\xbc\xbc\ +\xff\xbb\xbb\xbb\xff\xba\xba\xba\xff\xb9\xb9\xb9\xff\xb9\xb9\xb9\ +\xff\xb3\xb3\xb3\xff\x9e\x9e\x9e\xff|||\xa3|||\ +(|||\xfa\xba\xba\xba\xff\xc5\xc5\xc5\xff\xc3\xc3\xc3\ +\xff\xc2\xc2\xc2\xff\xc1\xc1\xc1\xff\xc1\xc1\xc1\xff\xc0\xc0\xc0\ +\xff\xbf\xbf\xbf\xff\xbe\xbe\xbe\xff\xbd\xbd\xbd\xff\xbd\xbd\xbd\ +\xff\xb4\xb4\xb4\xff\x88\x88\x88\xff|||;\x00\x00\x00\ +\x00|||\x88\x95\x95\x95\xff\xc5\xc5\xc5\xff\xc8\xc8\xc8\ +\xff\xc6\xc6\xc6\xff\xc5\xc5\xc5\xff\xc4\xc4\xc4\xff\xc3\xc3\xc3\ +\xff\xc3\xc3\xc3\xff\xc2\xc2\xc2\xff\xc2\xc2\xc2\xff\xbd\xbd\xbd\ +\xff\x95\x95\x95\xff|||\x9f\x00\x00\x00\x00\x00\x00\x00\ +\x00|||\x05|||\xaa\x95\x95\x95\xff\xc0\xc0\xc0\ +\xff\xcb\xcb\xcb\xff\xca\xca\xca\xff\xc9\xc9\xc9\xff\xc8\xc8\xc8\ +\xff\xc7\xc7\xc7\xff\xc7\xc7\xc7\xff\xc0\xc0\xc0\xff\x96\x96\x96\ +\xff|||\xbb|||\x0b\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00|||\x04|||\x88|||\ +\xf6\x9e\x9e\x9e\xff\xb3\xb3\xb3\xff\xbe\xbe\xbe\xff\xbf\xbf\xbf\ +\xff\xb3\xb3\xb3\xff\xa0\xa0\xa0\xff|||\xfb|||\ +\x96|||\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00|||\ ++|||\x8a|||\xc8|||\xe7|||\ +\xe8|||\xcb|||\x91|||3\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\x00\ +\x00\xc0\x03\x00\x00\x80\x01\x00\x00\x80\x01\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x01\x00\ +\x00\x80\x01\x00\x00\xc0\x03\x00\x00\xf0\x0f\x00\x00\ +\x00\x00\x03=\ +<\ +?xml version=\x221.\ +0\x22 encoding=\x22UTF\ +-8\x22?>\x0a\x0a source control\ + error v2\x0a \x0a \x0a \ +\x0a\x0a\ +" + +qt_resource_name = b"\ +\x00\x0f\ +\x04T\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x000\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04S\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x005\x00.\x00p\x00n\x00g\ +\x00\x09\ +\x0a\xc5\xacG\ +\x00w\ +\x00a\x00t\x00e\x00r\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x06Z\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x000\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04_\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x009\x00.\x00p\x00n\x00g\ +\x00\x16\ +\x0eE\x9e\x87\ +\x00e\ +\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00e\x00r\x00r\x00o\ +\x00r\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x08\xbcm\xc2\ +\x00s\ +\x00t\x00a\x00t\x00u\x00s\x00b\x00a\x00r\ +\x00\x0f\ +\x04P\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x004\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04\x5c\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x008\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00\xf0&'\ +\x00e\ +\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00w\x00a\x00r\x00n\ +\x00i\x00n\x00g\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x0c\x85t\xe7\ +\x00e\ +\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00c\x00o\x00m\x00m\ +\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x03\xd6;g\ +\x00M\ +\x00a\x00i\x00n\x00W\x00i\x00n\x00d\x00o\x00w\ +\x00\x0f\ +\x04U\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x003\x00.\x00p\x00n\x00g\ +\x00\x09\ +\x0c\xe6\xbd#\ +\x00v\ +\x00i\x00e\x00w\x00p\x00a\x00n\x00e\x00s\ +\x00\x0f\ +\x04a\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x007\x00.\x00p\x00n\x00g\ +\x00\x07\ +\x0a\xc9\xa6S\ +\x00c\ +\x00u\x00r\x00s\x00o\x00r\x00s\ +\x00\x15\ +\x06S\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x007\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04R\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x002\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04^\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x006\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x06P\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x006\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04W\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x001\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04S\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x005\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x06a\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x005\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04T\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x000\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04P\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x004\x00.\x00p\x00n\x00g\ +\x00\x03\ +\x00\x00x\xc3\ +\x00r\ +\x00e\x00s\ +\x00\x14\ +\x07\x22u\xc7\ +\x00a\ +\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x003\x00.\ +\x00p\x00n\x00g\ +\x00\x05\ +\x00O\xa6S\ +\x00I\ +\x00c\x00o\x00n\x00s\ +\x00\x15\ +\x06^\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x004\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04U\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x003\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x07!u\xc7\ +\x00a\ +\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x002\x00.\ +\x00p\x00n\x00g\ +\x00\x15\ +\x06_\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x003\ +\x00.\x00p\x00n\x00g\ +\x00\x0b\ +\x0f\x08B\x1e\ +\x00A\ +\x00p\x00p\x00l\x00i\x00c\x00a\x00t\x00i\x00o\x00n\ +\x00\x0f\ +\x04R\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x002\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x07(u\xc7\ +\x00a\ +\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x001\x00.\ +\x00p\x00n\x00g\ +\x00\x17\ +\x04\xc9\x5cG\ +\x00e\ +\x00r\x00r\x00o\x00r\x00_\x00r\x00e\x00p\x00o\x00r\x00t\x00_\x00h\x00e\x00l\x00p\ +\x00e\x00r\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x04a\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x007\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x06\x5c\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x002\ +\x00.\x00p\x00n\x00g\ +\x00\x0f\ +\x04W\x95'\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x005\x00_\x000\x001\x00.\x00p\x00n\x00g\ +\x00\x14\ +\x07'u\xc7\ +\x00a\ +\x00r\x00h\x00i\x00t\x00y\x00p\x00e\x00_\x00t\x00r\x00e\x00e\x00_\x000\x000\x00.\ +\x00p\x00n\x00g\ +\x00\x0f\ +\x04^\x95\xc7\ +\x00b\ +\x00m\x00p\x000\x000\x000\x000\x006\x00_\x000\x006\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x06]\x7fG\ +\x00p\ +\x00a\x00r\x00t\x00i\x00c\x00l\x00e\x00s\x00_\x00t\x00r\x00e\x00e\x00_\x000\x001\ +\x00.\x00p\x00n\x00g\ +\x00\x1c\ +\x0d\x96`\x07\ +\x00o\ +\x003\x00d\x00e\x00_\x00a\x00p\x00p\x00l\x00i\x00c\x00a\x00t\x00i\x00o\x00n\x00_\ +\x00r\x00e\x00v\x00e\x00r\x00s\x00e\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x0e\x0f\xf3\xff\ +\x00o\ +\x003\x00d\x00e\x00_\x00e\x00d\x00i\x00t\x00o\x00r\x00.\x00i\x00c\x00o\ +\x00\x14\ +\x0b\x1b&\xb6\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00D\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\ +\x00t\x00i\x00f\ +\x00\x17\ +\x0c\x9a\xdb\xc7\ +\x00l\ +\x00o\x00c\x00k\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00d\x00e\x00f\x00a\x00u\ +\x00l\x00t\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x07T\xb1'\ +\x00D\ +\x00e\x00f\x00a\x00u\x00l\x00t\x00_\x00o\x00p\x00e\x00n\x00.\x00s\x00v\x00g\ +\x00\x19\ +\x0e\xd2\x13\xe7\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0e\ +\x0b\xd8M\x87\ +\x00l\ +\x00a\x00y\x00e\x00r\x00_\x00i\x00c\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x01\xaf\x1c'\ +\x00E\ +\x00n\x00t\x00i\x00t\x00y\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\ +\x00.\x00s\x00v\x00g\ +\x00\x19\ +\x05\xf2\xd2\x07\ +\x00v\ +\x00i\x00s\x00_\x00o\x00n\x00_\x00N\x00o\x00t\x00T\x00r\x00a\x00n\x00s\x00p\x00a\ +\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00\x1c\ +\x05A\x11\x07\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00E\x00d\x00i\x00t\ +\x00o\x00r\x00_\x00O\x00n\x00l\x00y\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x0c>\x8f\xc7\ +\x00v\ +\x00i\x00s\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00d\x00e\x00f\x00a\x00u\x00l\ +\x00t\x00.\x00s\x00v\x00g\ +\x00%\ +\x0f-\x08'\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\x00y\ +\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x01\xb91\x87\ +\x00l\ +\x00o\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x05bA^\ +\x00E\ +\x00y\x00e\x00_\x00O\x00p\x00e\x00n\x00_\x00H\x00i\x00d\x00d\x00e\x00n\ +\x00\x1b\ +\x05K\x05V\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00E\ +\x00n\x00a\x00b\x00l\x00e\x00d\x00.\x00t\x00i\x00f\ +\x00\x0c\ +\x0f^26\ +\x00E\ +\x00y\x00e\x00_\x00O\x00p\x00e\x00n\x00.\x00t\x00i\x00f\ +\x00\x10\ +\x03\xcaZG\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00.\x00s\x00v\x00g\ +\x00\x16\ +\x06\x8e\x16\xc7\ +\x00E\ +\x00n\x00t\x00i\x00t\x00y\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\ +\x00y\x00.\x00s\x00v\x00g\ +\x00\x1b\ +\x04\xe2\x14'\ +\x00l\ +\x00o\x00c\x00k\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00t\x00r\x00a\x00n\x00s\ +\x00p\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00\x0d\ +\x01m\xcf\x96\ +\x00E\ +\x00y\x00e\x00_\x00S\x00l\x00a\x00s\x00h\x00.\x00t\x00i\x00f\ +\x00\x14\ +\x0e\x00\x9e6\ +\x00E\ +\x00y\x00e\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00O\x00p\x00e\x00n\x00.\ +\x00t\x00i\x00f\ +\x00\x07\ +\x0c\xf8ZG\ +\x00E\ +\x00y\x00e\x00.\x00s\x00v\x00g\ +\x00\x14\ +\x07T)\xf6\ +\x00E\ +\x00y\x00e\x00_\x00S\x00l\x00a\x00s\x00h\x00_\x00H\x00i\x00d\x00d\x00e\x00n\x00.\ +\x00t\x00i\x00f\ +\x00\x1a\ +\x00\xe3\x5c\xa7\ +\x00v\ +\x00i\x00s\x00_\x00c\x00i\x00r\x00c\x00l\x00e\x00_\x00t\x00r\x00a\x00n\x00s\x00p\ +\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00/\ +\x0a\xf8TG\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\x00y\ +\x00_\x00U\x00n\x00s\x00a\x00v\x00a\x00b\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00\x13\ +\x09+\x00\xf6\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00E\x00n\x00a\x00b\x00l\x00e\x00d\x00.\x00t\ +\x00i\x00f\ +\x00\x19\ +\x07,\xf6\x07\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00.\ +\x07\x84Qg\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\x00_\ +\x00U\x00n\x00s\x00a\x00v\x00a\x00b\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00%\ +\x08\xc2\x87g\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00E\x00d\x00i\x00t\x00o\x00r\x00_\x00O\x00n\x00l\x00y\ +\x00.\x00s\x00v\x00g\ +\x00\x19\ +\x0e\x89\x90\x16\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00E\x00n\x00a\x00b\x00l\x00e\x00d\x00_\x00H\ +\x00o\x00v\x00e\x00r\x00.\x00t\x00i\x00f\ +\x00\x1c\ +\x0bd6G\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00E\x00d\x00i\x00t\ +\x00o\x00r\x00_\x00O\x00n\x00l\x00y\x00.\x00s\x00v\x00g\ +\x00\x0b\ +\x052\xac\xa7\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x08Y\x11\xa7\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00$\ +\x05\xcb\xc5\xc7\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\x00.\ +\x00s\x00v\x00g\ +\x00\x1b\ +\x0e\xf5\xfe\xc7\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00N\x00o\x00t\x00_\ +\x00A\x00c\x00t\x00i\x00v\x00e\x00.\x00s\x00v\x00g\ +\x00\x0c\ +\x0e=1\x87\ +\x00u\ +\x00n\x00l\x00o\x00c\x00k\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x1a\ +\x00\x9cw\x07\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00U\x00n\x00s\x00a\ +\x00v\x00a\x00b\x00l\x00e\x00.\x00s\x00v\x00g\ +\x00\x1a\ +\x0a\xe9\xdc\x96\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00D\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00_\ +\x00H\x00o\x00v\x00e\x00r\x00.\x00t\x00i\x00f\ +\x00\x0a\ +\x00\xb5\xd1\xa7\ +\x00E\ +\x00n\x00t\x00i\x00t\x00y\x00.\x00s\x00v\x00g\ +\x00#\ +\x08\x0b\xd5\x87\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00E\x00n\x00t\x00i\x00t\x00y\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00U\x00n\x00s\x00a\x00v\x00a\x00b\x00l\x00e\x00.\x00s\ +\x00v\x00g\ +\x00\x13\ +\x0e\x1c\x0e\xf6\ +\x00E\ +\x00y\x00e\x00_\x00S\x00l\x00a\x00s\x00h\x00_\x00H\x00o\x00v\x00e\x00r\x00.\x00t\ +\x00i\x00f\ +\x00\x1b\ +\x03\x98\x0c'\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00N\x00o\x00t\x00_\ +\x00A\x00c\x00t\x00i\x00v\x00e\x00.\x00s\x00v\x00g\ +\x00\x17\ +\x03\xf8\xf5g\ +\x00l\ +\x00o\x00c\x00k\x00_\x00o\x00n\x00_\x00t\x00r\x00a\x00n\x00s\x00p\x00a\x00r\x00e\ +\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00\x1a\ +\x00\xb2\x86\xa7\ +\x00l\ +\x00o\x00c\x00k\x00_\x00o\x00n\x00_\x00N\x00o\x00t\x00T\x00r\x00a\x00n\x00s\x00p\ +\x00a\x00r\x00e\x00n\x00t\x00.\x00s\x00v\x00g\ +\x00\x08\ +\x00\x95Ug\ +\x00v\ +\x00i\x00s\x00b\x00.\x00s\x00v\x00g\ +\x00\x15\ +\x0c\x87\x8f\xd6\ +\x00E\ +\x00y\x00e\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00S\x00l\x00a\x00s\x00h\ +\x00.\x00t\x00i\x00f\ +\x00\x0f\ +\x09\xcbq\xa7\ +\x00v\ +\x00i\x00s\x00b\x00_\x00h\x00i\x00d\x00d\x00e\x00n\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x02{\xf5\x96\ +\x00E\ +\x00y\x00e\x00_\x00O\x00p\x00e\x00n\x00_\x00H\x00o\x00v\x00e\x00r\x00.\x00t\x00i\ +\x00f\ +\x00$\ +\x0a9L\xa7\ +\x00S\ +\x00l\x00i\x00c\x00e\x00_\x00H\x00a\x00n\x00d\x00l\x00e\x00_\x00M\x00o\x00d\x00i\ +\x00f\x00i\x00e\x00d\x00_\x00N\x00o\x00t\x00_\x00A\x00c\x00t\x00i\x00v\x00e\x00.\ +\x00s\x00v\x00g\ +\x00\x16\ +\x05\x5c\xa1g\ +\x00v\ +\x00i\x00s\x00_\x00o\x00n\x00_\x00t\x00r\x00a\x00n\x00s\x00p\x00a\x00r\x00e\x00n\ +\x00t\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x0cS?'\ +\x00D\ +\x00e\x00f\x00a\x00u\x00l\x00t\x00_\x00c\x00l\x00o\x00s\x00e\x00d\x00.\x00s\x00v\ +\x00g\ +\x00\x1c\ +\x0d\x1b}6\ +\x00P\ +\x00a\x00d\x00l\x00o\x00c\x00k\x00_\x00P\x00a\x00r\x00t\x00i\x00a\x00l\x00_\x00D\ +\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00t\x00i\x00f\ +\x00\x12\ +\x06\xdb\x9dg\ +\x00P\ +\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x001\x00.\x00p\x00n\ +\x00g\ +\x00\x0a\ +\x08v\x9cg\ +\x00G\ +\x00l\x00o\x00b\x00a\x00l\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x0c\x8dj\xa7\ +\x00C\ +\x00a\x00m\x00e\x00r\x00a\x00.\x00s\x00v\x00g\ +\x00\x18\ +\x03\x0f\xe0\xa7\ +\x00A\ +\x00W\x00S\x00_\x00p\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x00i\ +\x00c\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x06\xd8\x9dg\ +\x00P\ +\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x000\x00.\x00p\x00n\ +\x00g\ +\x00\x0c\ +\x0d\x08\xc6'\ +\x00V\ +\x00i\x00e\x00w\x00p\x00o\x00r\x00t\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x06\xe1\x9dg\ +\x00P\ +\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x003\x00.\x00p\x00n\ +\x00g\ +\x00\x0a\ +\x00k\xd7\xa7\ +\x00M\ +\x00o\x00t\x00i\x00o\x00n\x00.\x00s\x00v\x00g\ +\x00\x12\ +\x06\xde\x9dg\ +\x00P\ +\x00r\x00e\x00f\x00e\x00r\x00e\x00n\x00c\x00e\x00s\x00_\x000\x002\x00.\x00p\x00n\ +\x00g\ +\x00\x09\ +\x09\xba\xcf\xa7\ +\x00D\ +\x00e\x00b\x00u\x00g\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x03l\x17\xc7\ +\x00E\ +\x00x\x00p\x00e\x00r\x00i\x00m\x00e\x00n\x00t\x00a\x00l\x00.\x00s\x00v\x00g\ +\x00\x09\ +\x02\xc6\xc0\xc7\ +\x00F\ +\x00i\x00l\x00e\x00s\x00.\x00s\x00v\x00g\ +\x00\x0a\ +\x04o\x98\xe7\ +\x00G\ +\x00i\x00z\x00m\x00o\x00s\x00.\x00s\x00v\x00g\ +\x00\x07\ +\x0f\x07J\x02\ +\x00h\ +\x00i\x00t\x00.\x00c\x00u\x00r\ +\x00\x0e\ +\x06\x0c\xfb\x82\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00d\x00o\x00w\x00n\x00.\x00c\x00u\x00r\ +\x00\x0b\ +\x06\x89\xd9\x82\ +\x00c\ +\x00u\x00r\x00s\x00o\x00r\x001\x00.\x00c\x00u\x00r\ +\x00\x0b\ +\x06\x80\xd9\x82\ +\x00c\ +\x00u\x00r\x00s\x00o\x00r\x002\x00.\x00c\x00u\x00r\ +\x00\x17\ +\x06h\xad\xa2\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00s\x00o\x00_\x00s\x00e\x00l\x00_\x00p\x00l\ +\x00u\x00s\x00.\x00c\x00u\x00r\ +\x00\x0d\ +\x08\x8c:\xe2\ +\x00l\ +\x00e\x00f\x00t\x00r\x00i\x00g\x00h\x00t\x00.\x00c\x00u\x00r\ +\x00\x0e\ +\x03\x0c\x0f\xc2\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00H\x00i\x00t\x00.\x00c\x00u\x00r\ +\x00\x12\ +\x03\xfe\x1c\x82\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00s\x00m\x00o\x00o\x00t\x00h\x00.\x00c\x00u\ +\x00r\ +\x00\x11\ +\x06\x8d\xde\x82\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00u\x00p\x00r\x00i\x00g\x00h\x00t\x00.\x00c\x00u\x00r\ +\ +\x00\x0e\ +\x02\xc2\xa5\x82\ +\x00a\ +\x00r\x00r\x00_\x00a\x00d\x00d\x00k\x00e\x00y\x00.\x00c\x00u\x00r\ +\x00\x15\ +\x07\x0a7B\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00g\x00e\x00t\x00h\x00e\x00i\x00g\x00h\x00t\ +\x00.\x00c\x00u\x00r\ +\x00\x10\ +\x08\x83\x1e\x22\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00p\x00l\x00u\x00s\x00.\x00c\x00u\x00r\ +\x00\x11\ +\x0d\xbf%b\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00r\x00o\x00t\x00a\x00t\x00e\x00.\x00c\x00u\x00r\ +\ +\x00\x0f\ +\x07\xb5h\x82\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00m\x00o\x00v\x00e\x00.\x00c\x00u\x00r\ +\x00\x13\ +\x00.\xa8\x22\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00l\x00i\x00n\x00k\x00n\x00o\x00w\x00.\x00c\ +\x00u\x00r\ +\x00\x10\ +\x07\x0b\x1e\x82\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00l\x00i\x00n\x00k\x00.\x00c\x00u\x00r\ +\x00\x11\ +\x01\x93\x0c\x22\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00m\x00i\x00n\x00u\x00s\x00.\x00c\x00u\x00r\ +\ +\x00\x13\ +\x0aQ\xeab\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00D\x00r\x00a\x00g\x00I\x00t\x00e\x00m\x00.\x00c\ +\x00u\x00r\ +\x00\x0c\ +\x0b\xd0gb\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00u\x00p\x00.\x00c\x00u\x00r\ +\x00\x0f\ +\x0eO\xc8\x02\ +\x00p\ +\x00i\x00c\x00k\x00_\x00c\x00u\x00r\x00s\x00o\x00r\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x0el\xec\xa2\ +\x00c\ +\x00u\x00r\x000\x000\x000\x000\x001\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x0em\xec\xa2\ +\x00c\ +\x00u\x00r\x000\x000\x000\x000\x002\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x0en\xec\xa2\ +\x00c\ +\x00u\x00r\x000\x000\x000\x000\x003\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x05\xaa\xdb\xa2\ +\x00h\ +\x00a\x00n\x00d\x00D\x00r\x00a\x00g\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x0eo\xec\xa2\ +\x00c\ +\x00u\x00r\x000\x000\x000\x000\x004\x00.\x00c\x00u\x00r\ +\x00\x10\ +\x03y\xfd\xc2\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00s\x00c\x00a\x00l\x00e\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x0ep\xec\xa2\ +\x00c\ +\x00u\x00r\x000\x000\x000\x000\x005\x00.\x00c\x00u\x00r\ +\x00\x0c\ +\x02\xaeA\x82\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00.\x00c\x00u\x00r\ +\x00\x15\ +\x0eb\xe8\x22\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00s\x00o\x00_\x00s\x00e\x00l\x00e\x00c\x00t\ +\x00.\x00c\x00u\x00r\ +\x00\x13\ +\x096M\x02\ +\x00a\ +\x00r\x00r\x00o\x00w\x00_\x00d\x00o\x00w\x00n\x00r\x00i\x00g\x00h\x00t\x00.\x00c\ +\x00u\x00r\ +\x00\x13\ +\x0f\xbas\x02\ +\x00p\ +\x00o\x00i\x00n\x00t\x00e\x00r\x00_\x00f\x00l\x00a\x00t\x00t\x00e\x00n\x00.\x00c\ +\x00u\x00r\ +\x00\x0c\ +\x0fy\xb7\xc7\ +\x00m\ +\x00a\x00x\x00i\x00m\x00i\x00z\x00e\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x0a5o'\ +\x00h\ +\x00i\x00d\x00e\x00_\x00h\x00e\x00l\x00p\x00e\x00r\x00s\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x0a\x9d~\xc7\ +\x00d\ +\x00i\x00s\x00p\x00l\x00a\x00y\x00_\x00i\x00n\x00f\x00o\x00.\x00p\x00n\x00g\ +\x00\x17\ +\x04\xb0\xfe\xc7\ +\x00e\ +\x00d\x00i\x00t\x00w\x00i\x00t\x00h\x00b\x00u\x00t\x00t\x00o\x00n\x00_\x00d\x00a\ +\x00r\x00k\x00.\x00p\x00n\x00g\ +\x00\x08\ +\x06b\x87\xf3\ +\x00t\ +\x00o\x00o\x00l\x00b\x00a\x00r\x00s\ +\x00\x1d\ +\x08\xa8\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x005\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x98q\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x004\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x000\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x004\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00N\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x006\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xd5\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x002\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xa7\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x004\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x005\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x003\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00C\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x005\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xd4\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x001\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\xecq\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x001\x000\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00$\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x002\x000\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xa6\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x003\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x9aq\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x002\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x002\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x002\x00.\x00p\x00n\x00g\ +\x00\x1e\ +\x076,\x87\ +\x00p\ +\x00r\x00o\x00c\x00e\x00d\x00u\x00r\x00a\x00l\x00m\x00a\x00t\x00e\x00r\x00i\x00a\ +\x00l\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xd3\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x000\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xa5\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x002\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x9fq\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x001\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x007\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x001\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00E\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x003\x00.\x00p\x00n\x00g\ +\x00\x13\ +\x0c\xd0\x1e\x87\ +\x00m\ +\x00i\x00s\x00c\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x000\x00.\x00p\ +\x00n\x00g\ +\x00\x1d\ +\x08\xa4\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x001\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x9cq\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x000\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x004\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x000\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xdb\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x008\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00B\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x002\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x97q\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x009\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00?\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x009\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x0f\xf1A\xe7\ +\x00O\ +\x00b\x00j\x00S\x00e\x00l\x00e\x00c\x00t\x00i\x00o\x00n\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xa3\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x000\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xda\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x007\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00G\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x001\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xac\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x009\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x94q\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x008\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00<\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x008\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xd9\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x006\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00#\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x002\x005\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00D\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x000\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xab\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x008\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x99q\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x007\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00A\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x007\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00O\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x009\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xd8\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x005\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00 \xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x002\x004\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xaa\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x007\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x96q\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x006\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00>\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x006\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00L\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x008\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x9d|'\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x003\ +\x00.\x00s\x00v\x00g\ +\x00\x1d\ +\x08\xd7\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x004\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00%\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x002\x003\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xa9\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x000\x006\x00.\x00p\x00n\x00g\ +\x00\x15\ +\x0e\x9bq\xa7\ +\x00o\ +\x00b\x00j\x00e\x00c\x00t\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\x00-\x000\x005\ +\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x003\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x001\x005\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00Q\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x000\x007\x00.\x00p\x00n\x00g\ +\x00\x1d\ +\x08\xd6\xaf\xe7\ +\x00s\ +\x00t\x00a\x00n\x00d\x00a\x00r\x00d\x00_\x00v\x00i\x00e\x00w\x00s\x00_\x00t\x00o\ +\x00o\x00l\x00b\x00a\x00r\x00-\x001\x003\x00.\x00p\x00n\x00g\ +\x00\x18\ +\x00\x22\xce\x87\ +\x00e\ +\x00d\x00i\x00t\x00_\x00m\x00o\x00d\x00e\x00_\x00t\x00o\x00o\x00l\x00b\x00a\x00r\ +\x00-\x002\x002\x00.\x00p\x00n\x00g\ +\x00\x10\ +\x0c\x99\xf5\x1f\ +\x00b\ +\x00a\x00l\x00l\x00_\x00o\x00f\x00f\x00l\x00i\x00n\x00e\x00.\x00i\x00c\x00o\ +\x00\x1c\ +\x0d\xbb\x8bG\ +\x00s\ +\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00_\x00c\x00o\ +\x00n\x00n\x00e\x00c\x00t\x00e\x00d\x00.\x00s\x00v\x00g\ +\x00\x1c\ +\x03ZJ\xe7\ +\x00s\ +\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00-\x00n\x00o\ +\x00t\x00_\x00s\x00e\x00t\x00u\x00p\x00.\x00s\x00v\x00g\ +\x00\x0f\ +\x0a\x0d'\xdf\ +\x00b\ +\x00a\x00l\x00l\x00_\x00o\x00n\x00l\x00i\x00n\x00e\x00.\x00i\x00c\x00o\ +\x00\x1d\ +\x03\xe3zG\ +\x00s\ +\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00-\x00w\x00a\ +\x00r\x00n\x00i\x00n\x00g\x00_\x00v\x002\x00.\x00s\x00v\x00g\ +\x00\x10\ +\x0c\xa1\xe6\x1f\ +\x00b\ +\x00a\x00l\x00l\x00_\x00p\x00e\x00n\x00d\x00i\x00n\x00g\x00.\x00i\x00c\x00o\ +\x00\x11\ +\x08tl?\ +\x00b\ +\x00a\x00l\x00l\x00_\x00d\x00i\x00s\x00a\x00b\x00l\x00e\x00d\x00.\x00i\x00c\x00o\ +\ +\x00\x1b\ +\x00\x22\x12'\ +\x00s\ +\x00o\x00u\x00r\x00c\x00e\x00_\x00c\x00o\x00n\x00t\x00r\x00o\x00l\x00_\x00e\x00r\ +\x00r\x00o\x00r\x00_\x00v\x002\x00.\x00s\x00v\x00g\ +" + +qt_resource_struct = b"\ +\x00\x00\x00\x00\x00\x02\x00\x00\x00*\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x0d\x00\x00\x00\xc7\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x03\xe2\x00\x02\x00\x00\x002\x00\x00\x00\x95\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01F\x00\x00\x00\x00\x00\x01\x00\x00\xb10\ +\x00\x00\x01z\x88\x90A<\ +\x00\x00\x01\xb2\x00\x02\x00\x00\x00\x01\x00\x00\x00[\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x03\x84\x00\x00\x00\x00\x00\x01\x00\x00\xc6R\ +\x00\x00\x01z\x88\x90@,\ +\x00\x00\x00\xfe\x00\x00\x00\x00\x00\x01\x00\x00\xad\x09\ +\x00\x00\x01z\x88\x90@9\ +\x00\x00\x04\xc0\x00\x00\x00\x00\x00\x01\x00\x00\xce&\ +\x00\x00\x01z\x88\x90@)\ +\x00\x00\x02p\x00\x00\x00\x00\x00\x01\x00\x00\xbeB\ +\x00\x00\x01z\x88\x90@6\ +\x00\x00\x03\x0c\x00\x00\x00\x00\x00\x01\x00\x00\xc3\xce\ +\x00\x00\x01z\x88\x90@-\ +\x00\x00\x00$\x00\x00\x00\x00\x00\x01\x00\x00\x01\x88\ +\x00\x00\x01z\x88\x90@:\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ +\x00\x00\x01z\x88\x90@'\ +\x00\x00\x03`\x00\x00\x00\x00\x00\x01\x00\x00\xc5\xc3\ +\x00\x00\x01z\x88\x90@4\ +\x00\x00\x04\x22\x00\x00\x00\x00\x00\x01\x00\x00\xca_\ +\x00\x00\x01z\x88\x90@+\ +\x00\x00\x01\xcc\x00\x00\x00\x00\x00\x01\x00\x00\xbaZ\ +\x00\x00\x01z\x88\x90@7\ +\x00\x00\x05\x9a\x00\x00\x00\x00\x00\x01\x00\x00\xdbw\ +\x00\x00\x01z\x88\x90@(\ +\x00\x00\x02\xe8\x00\x00\x00\x00\x00\x01\x00\x00\xc3$\ +\x00\x00\x01z\x88\x90@5\ +\x00\x00\x01\x22\x00\x00\x00\x00\x00\x01\x00\x00\xae\x82\ +\x00\x00\x01z\x88\x90@1\ +\x00\x00\x02\x94\x00\x00\x00\x00\x00\x01\x00\x00\xbf1\ +\x00\x00\x01z\x88\x90@.\ +\x00\x00\x05\xec\x00\x00\x00\x00\x00\x01\x00\x00\xdec\ +\x00\x00\x01z\x88\x90@<\ +\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\xa6\x97\ +\x00\x00\x01z\x88\x90@2\ +\x00\x00\x02\x08\x00\x00\x00\x00\x00\x01\x00\x00\xbbp\ +\x00\x00\x01z\x88\x90@0\ +\x00\x00\x05F\x00\x00\x00\x00\x00\x01\x00\x00\xd5k\ +\x00\x00\x01z\x88\x90@=\ +\x00\x00\x05\x12\x00\x00\x00\x00\x00\x01\x00\x00\xd0\x86\ +\x00\x00\x01{[\xfa+\x98\ +\x00\x00\x02\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xc2@\ +\x00\x00\x01z\x88\x90@R\ +\x00\x00\x02@\x00\x00\x00\x00\x00\x01\x00\x00\xbdi\ +\x00\x00\x01z\x88\x90@S\ +\x00\x00\x00`\x00\x00\x00\x00\x00\x01\x00\x00\xa5\xc3\ +\x00\x00\x01z\x88\x90@J\ +\x00\x00\x05j\x00\x00\x00\x00\x00\x01\x00\x00\xdaw\ +\x00\x00\x01z\x88\x90@M\ +\x00\x00\x06\x10\x00\x00\x00\x00\x00\x01\x00\x00\xe2\xb4\ +\x00\x00\x01z\x88\x90@L\ +\x00\x00\x03\xf2\x00\x00\x00\x00\x00\x01\x00\x00\xc9,\ +\x00\x00\x01z\x88\x90@O\ +\x00\x00\x04t\x00\x00\x00\x00\x00\x01\x00\x00\xcd\x1d\ +\x00\x00\x01z\x88\x90@N\ +\x00\x00\x030\x00\x00\x00\x00\x00\x01\x00\x00\xc4\xc1\ +\x00\x00\x01z\x88\x90@Q\ +\x00\x00\x04F\x00\x00\x00\x00\x00\x01\x00\x00\xccI\ +\x00\x00\x01z\x88\x90@$\ +\x00\x00\x03\xb4\x00\x00\x00\x00\x00\x01\x00\x00\xc8X\ +\x00\x00\x01z\x88\x90@%\ +\x00\x00\x05\xbe\x00\x00\x00\x00\x00\x01\x00\x00\xdd\x8f\ +\x00\x00\x01z\x88\x90@!\ +\x00\x00\x04\xe4\x00\x00\x00\x00\x00\x01\x00\x00\xcf\xb2\ +\x00\x00\x01z\x88\x90@#\ +\x00\x00\x00\xe6\x00\x02\x00\x00\x00\x01\x00\x00\x00R\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00H\x00\x00\x00\x00\x00\x01\x00\x00\x03\xf4\ +\x00\x00\x01z\x88\x90BH\ +\x00\x00\x02,\x00\x02\x00\x00\x00\x01\x00\x00\x002\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x01|\x00\x00\x00\x00\x00\x01\x00\x00\xb3\xd9\ +\x00\x00\x01z\x88\x90A:\ +\x00\x00\x01\xf0\x00\x02\x00\x00\x00\x04\x00\x00\x00.\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00\xa9\x0c\ +\x00\x00\x01z\x88\x90A;\ +\x00\x00\x04\xa4\x00\x02\x00\x00\x00\x02\x00\x00\x00+\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x01\x00\x00\x00-\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x06@\x00\x00\x00\x00\x00\x01\x00\x00\xe3\x88\ +\x00\x00\x01{zp@\xc4\ +\x00\x00\x06~\x00\x01\x00\x00\x00\x01\x00\x00\xebr\ +\x00\x00\x01z\x88\x90A\xb7\ +\x00\x00\x17.\x00\x00\x00\x00\x00\x01\x00\x05\xae\xc9\ +\x00\x00\x01z\x88\x90<\xf1\ +\x00\x00\x16\xe2\x00\x00\x00\x00\x00\x01\x00\x05\xad\x1d\ +\x00\x00\x01z\x88\x90<\xf4\ +\x00\x00\x17\x08\x00\x00\x00\x00\x00\x01\x00\x05\xad\xf1\ +\x00\x00\x01z\x88\x90<\xd1\ +\x00\x00\x16\xc4\x00\x00\x00\x00\x00\x01\x00\x05\xac*\ +\x00\x00\x01z\x88\x90<\xf5\ +\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x1f\x00\x00\x003\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x14\x5c\x00\x00\x00\x00\x00\x01\x00\x05\x98\x97\ +\x00\x00\x01z\x88\x90A\xde\ +\x00\x00\x14\xae\x00\x00\x00\x00\x00\x01\x00\x05\x9b+\ +\x00\x00\x01z\x88\x90A\xdf\ +\x00\x00\x16\x1e\x00\x00\x00\x00\x00\x01\x00\x05\xa7\xf2\ +\x00\x00\x01z\x88\x90A\xda\ +\x00\x00\x13\x98\x00\x00\x00\x00\x00\x01\x00\x05\x92%\ +\x00\x00\x01z\x88\x90@\xa7\ +\x00\x00\x13$\x00\x00\x00\x00\x00\x01\x00\x05\x8f5\ +\x00\x00\x01z\x88\x90A\xd9\ +\x00\x00\x15\xda\x00\x00\x00\x00\x00\x01\x00\x05\xa5^\ +\x00\x00\x01z\x88\x90A\xba\ +\x00\x00\x13F\x00\x00\x00\x00\x00\x01\x00\x05\x90\x7f\ +\x00\x00\x01z\x88\x90A\xe1\ +\x00\x00\x15\x9e\x00\x00\x00\x00\x00\x01\x00\x05\xa2\xca\ +\x00\x00\x01z\x88\x90Af\ +\x00\x00\x12v\x00\x01\x00\x00\x00\x01\x00\x05\x8b3\ +\x00\x00\x01z\x88\x90@\xa9\ +\x00\x00\x12\xd0\x00\x00\x00\x00\x00\x01\x00\x05\x8d\x87\ +\x00\x00\x01z\x88\x90A\xe2\ +\x00\x00\x12\xb4\x00\x01\x00\x00\x00\x01\x00\x05\x8c\xdc\ +\x00\x00\x01z\x88\x90@\xf8\ +\x00\x00\x12\x98\x00\x00\x00\x00\x00\x01\x00\x05\x8b\x92\ +\x00\x00\x01z\x88\x90@\xf8\ +\x00\x00\x13p\x00\x01\x00\x00\x00\x01\x00\x05\x91\xc9\ +\x00\x00\x01z\x88\x90@\xae\ +\x00\x00\x13\xba\x00\x00\x00\x00\x00\x01\x00\x05\x93o\ +\x00\x00\x01z\x88\x90A\xdc\ +\x00\x00\x14\x88\x00\x00\x00\x00\x00\x01\x00\x05\x99\xe1\ +\x00\x00\x01z\x88\x90A\xdd\ +\x00\x00\x148\x00\x00\x00\x00\x00\x01\x00\x05\x97M\ +\x00\x00\x01z\x88\x90A\xb8\ +\x00\x00\x13\xea\x00\x00\x00\x00\x00\x01\x00\x05\x94\xb9\ +\x00\x00\x01z\x88\x90A\xdf\ +\x00\x00\x13\x04\x00\x01\x00\x00\x00\x01\x00\x05\x8e\xd1\ +\x00\x00\x01z\x88\x90A\x98\ +\x00\x00\x16l\x00\x01\x00\x00\x00\x01\x00\x05\xaa\x86\ +\x00\x00\x01z\x88\x90@\xab\ +\x00\x00\x14\xd6\x00\x01\x00\x00\x00\x01\x00\x05\x9cu\ +\x00\x00\x01z\x88\x90A\xd9\ +\x00\x00\x15\x02\x00\x01\x00\x00\x00\x01\x00\x05\x9dB\ +\x00\x00\x01z\x88\x90@\xac\ +\x00\x00\x14\x10\x00\x00\x00\x00\x00\x01\x00\x05\x96\x03\ +\x00\x00\x01z\x88\x90A\xb9\ +\x00\x00\x15 \x00\x00\x00\x00\x00\x01\x00\x05\x9d\xa2\ +\x00\x00\x01z\x88\x90A\xd6\ +\x00\x00\x16<\x00\x00\x00\x00\x00\x01\x00\x05\xa9<\ +\x00\x00\x01z\x88\x90A\xe3\ +\x00\x00\x15D\x00\x00\x00\x00\x00\x01\x00\x05\x9e\xec\ +\x00\x00\x01z\x88\x90@\xf3\ +\x00\x00\x15b\x00\x00\x00\x00\x00\x01\x00\x05\xa06\ +\x00\x00\x01z\x88\x90@\xf4\ +\x00\x00\x15\x80\x00\x00\x00\x00\x00\x01\x00\x05\xa1\x80\ +\x00\x00\x01z\x88\x90@\xf5\ +\x00\x00\x15\xbc\x00\x00\x00\x00\x00\x01\x00\x05\xa4\x14\ +\x00\x00\x01z\x88\x90@\xf6\ +\x00\x00\x16\x00\x00\x00\x00\x00\x00\x01\x00\x05\xa6\xa8\ +\x00\x00\x01z\x88\x90@\xf7\ +\x00\x00\x12b\x00\x01\x00\x00\x00\x01\x00\x05\x8a\xd4\ +\x00\x00\x01z\x88\x90Ag\ +\x00\x00\x16\x98\x00\x00\x00\x00\x00\x01\x00\x05\xaa\xe0\ +\x00\x00\x01z\x88\x90A\xdb\ +\x00\x00\x03\xa8\x00\x02\x00\x00\x00\x08\x00\x00\x00S\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00%@\x00\x00\x00\x00\x00\x01\x00\x06B\x8d\ +\x00\x00\x01z\x88\x90B\x0a\ +\x00\x00$P\x00\x00\x00\x00\x00\x01\x00\x06.w\ +\x00\x00\x01z\x88\x90B\x06\ +\x00\x00$\xb2\x00\x00\x00\x00\x00\x01\x00\x066@\ +\x00\x00\x01z\x88\x90B\x07\ +\x00\x00%\x18\x00\x00\x00\x00\x00\x01\x00\x06>\x0b\ +\x00\x00\x01z\x88\x90@\xb2\ +\x00\x00$\x8e\x00\x00\x00\x00\x00\x01\x00\x061\xbe\ +\x00\x00\x01z\x88\x90@\xb4\ +\x00\x00#\xec\x00\x00\x00\x00\x00\x01\x00\x06&\xb2\ +\x00\x00\x01z\x88\x90@\xb4\ +\x00\x00$\xf2\x00\x00\x00\x00\x00\x01\x00\x069\x89\ +\x00\x00\x01z\x88\x90@\xb6\ +\x00\x00$\x12\x00\x00\x00\x00\x00\x01\x00\x06+4\ +\x00\x00\x01z\x88\x90B\x09\ +\x00\x00\x17b\x00\x02\x00\x00\x009\x00\x00\x00\x5c\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00 \xe2\x00\x00\x00\x00\x00\x01\x00\x06\x09\x92\ +\x00\x00\x01z\x88\x90<\xef\ +\x00\x00#\xb6\x00\x00\x00\x00\x00\x01\x00\x06!\xc5\ +\x00\x00\x01z\x88\x90<\xec\ +\x00\x00\x1fZ\x00\x00\x00\x00\x00\x01\x00\x05\xfaT\ +\x00\x00\x01z\x88\x90<\xf0\ +\x00\x00\x19\xb0\x00\x00\x00\x00\x00\x01\x00\x05\xc6\xbb\ +\x00\x00\x01z\x88\x90<\xeb\ +\x00\x00\x22d\x00\x00\x00\x00\x00\x01\x00\x06\x17\x91\ +\x00\x00\x01z\x88\x90<\xed\ +\x00\x00\x17\xe8\x00\x00\x00\x00\x00\x01\x00\x05\xb5{\ +\x00\x00\x01z\x88\x90<\xe3\ +\x00\x00\x1aV\x00\x00\x00\x00\x00\x01\x00\x05\xca\x8a\ +\x00\x00\x01z\x88\x90<\xe0\ +\x00\x00#\x0a\x00\x00\x00\x00\x00\x01\x00\x06\x1b\xf7\ +\x00\x00\x01z\x88\x90<\xe4\ +\x00\x00\x1c\x86\x00\x00\x00\x00\x00\x01\x00\x05\xddK\ +\x00\x00\x01z\x88\x90<\xde\ +\x00\x00\x18\xd4\x00\x00\x00\x00\x00\x01\x00\x05\xbc\xc0\ +\x00\x00\x01z\x88\x90<\xe2\ +\x00\x00\x1b~\x00\x00\x00\x00\x00\x01\x00\x05\xd2]\ +\x00\x00\x01z\x88\x90<\xdf\ +\x00\x00\x1e\xe4\x00\x00\x00\x00\x00\x01\x00\x05\xf4\x13\ +\x00\x00\x01z\x88\x90<\xe8\ +\x00\x00!\x88\x00\x00\x00\x00\x00\x01\x00\x06\x0d\xcb\ +\x00\x00\x01z\x88\x90<\xe5\ +\x00\x00\x1db\x00\x00\x00\x00\x00\x01\x00\x05\xe7\xe0\ +\x00\x00\x01z\x88\x90<\xe9\ +\x00\x00 6\x00\x00\x00\x00\x00\x01\x00\x06\x04\x88\ +\x00\x00\x01z\x88\x90<\xe7\ +\x00\x00\x1c\xfc\x00\x00\x00\x00\x00\x01\x00\x05\xe3 \ +\x00\x00\x01z\x88\x90<\xd4\ +\x00\x00\x19\x0a\x00\x00\x00\x00\x00\x01\x00\x05\xbd\xb2\ +\x00\x00\x01z\x88\x90<\xd7\ +\x00\x00\x1f\x90\x00\x00\x00\x00\x00\x01\x00\x05\xfc\x01\ +\x00\x00\x01z\x88\x90<\xd2\ +\x00\x00\x1b\xb4\x00\x00\x00\x00\x00\x01\x00\x05\xd3\xab\ +\x00\x00\x01z\x88\x90<\xd6\ +\x00\x00\x1e>\x00\x00\x00\x00\x00\x01\x00\x05\xee\xb1\ +\x00\x00\x01z\x88\x90<\xd3\ +\x00\x00!\xbe\x00\x00\x00\x00\x00\x01\x00\x06\x0f\x89\ +\x00\x00\x01z\x88\x90<\xdb\ +\x00\x00\x18\x1e\x00\x00\x00\x00\x00\x01\x00\x05\xb7\x9d\ +\x00\x00\x01z\x88\x90<\xd8\ +\x00\x00 l\x00\x00\x00\x00\x00\x01\x00\x06\x06\x98\ +\x00\x00\x01z\x88\x90<\xdc\ +\x00\x00#@\x00\x00\x00\x00\x00\x01\x00\x06\x1d\xf7\ +\x00\x00\x01z\x88\x90<\xd9\ +\x00\x00\x1a\x8c\x00\x00\x00\x00\x00\x01\x00\x05\xcb\xa9\ +\x00\x00\x01z\x88\x90=\x06\ +\x00\x00\x1d\xbe\x00\x00\x00\x00\x00\x01\x00\x05\xeb\x81\ +\x00\x00\x01z\x88\x90=\x07\ +\x00\x00\x1c\x16\x00\x00\x00\x00\x00\x01\x00\x05\xd8\xc7\ +\x00\x00\x01z\x88\x90=\x08\ +\x00\x00\x1b\x0e\x00\x00\x00\x00\x00\x01\x00\x05\xcf\x06\ +\x00\x00\x01z\x88\x90=\x0a\ +\x00\x00\x19\xe6\x00\x00\x00\x00\x00\x01\x00\x05\xc7\x8d\ +\x00\x00\x01z\x88\x90=\x0b\ +\x00\x00\x18\x94\x00\x00\x00\x00\x00\x01\x00\x05\xba\x90\ +\x00\x00\x01z\x88\x90=\x0c\ +\x00\x00\x17x\x00\x00\x00\x00\x00\x01\x00\x05\xb2\xb7\ +\x00\x00\x01z\x88\x90=\x0e\ +\x00\x00\x22\x9a\x00\x00\x00\x00\x00\x01\x00\x06\x18\xe4\ +\x00\x00\x01z\x88\x90=\x0f\ +\x00\x00!\x18\x00\x00\x00\x00\x00\x01\x00\x06\x0a\x99\ +\x00\x00\x01z\x88\x90=\x10\ +\x00\x00\x1f\xc6\x00\x00\x00\x00\x00\x01\x00\x05\xfd\x09\ +\x00\x00\x01z\x88\x90=\x12\ +\x00\x00\x1et\x00\x00\x00\x00\x00\x01\x00\x05\xef\xbf\ +\x00\x00\x01z\x88\x90=\x13\ +\x00\x00\x1a\xce\x00\x00\x00\x00\x00\x01\x00\x05\xcd|\ +\x00\x00\x01z\x88\x90=\x15\ +\x00\x00\x19@\x00\x00\x00\x00\x00\x01\x00\x05\xbe\xeb\ +\x00\x00\x01z\x88\x90=\x16\ +\x00\x00\x18T\x00\x00\x00\x00\x00\x01\x00\x05\xb9\x11\ +\x00\x00\x01z\x88\x90=\x17\ +\x00\x00#v\x00\x00\x00\x00\x00\x01\x00\x06\x1f\xb3\ +\x00\x00\x01z\x88\x90=\x19\ +\x00\x00\x22$\x00\x00\x00\x00\x00\x01\x00\x06\x16%\ +\x00\x00\x01z\x88\x90=\x1a\ +\x00\x00 \xa2\x00\x00\x00\x00\x00\x01\x00\x06\x08\x19\ +\x00\x00\x01z\x88\x90=\x1b\ +\x00\x00\x1f\x1a\x00\x00\x00\x00\x00\x01\x00\x05\xf5t\ +\x00\x00\x01z\x88\x90=\x1d\ +\x00\x00\x1d\xfe\x00\x00\x00\x00\x00\x01\x00\x05\xedU\ +\x00\x00\x01z\x88\x90=\x1e\ +\x00\x00\x1c\xbc\x00\x00\x00\x00\x00\x01\x00\x05\xe1\xc7\ +\x00\x00\x01z\x88\x90=\x1f\ +\x00\x00\x1b\xea\x00\x00\x00\x00\x00\x01\x00\x05\xd5\xc4\ +\x00\x00\x01z\x88\x90<\xf6\ +\x00\x00\x1e\xb4\x00\x00\x00\x00\x00\x01\x00\x05\xf1A\ +\x00\x00\x01z\x88\x90=\x02\ +\x00\x00!X\x00\x00\x00\x00\x00\x01\x00\x06\x0b\xc6\ +\x00\x00\x01z\x88\x90<\xff\ +\x00\x00\x1d2\x00\x00\x00\x00\x00\x01\x00\x05\xe5\x1d\ +\x00\x00\x01z\x88\x90=\x03\ +\x00\x00\x17\xb8\x00\x00\x00\x00\x00\x01\x00\x05\xb4v\ +\x00\x00\x01z\x88\x90<\xfc\ +\x00\x00 \x06\x00\x00\x00\x00\x00\x01\x00\x06\x03*\ +\x00\x00\x01z\x88\x90=\x00\ +\x00\x00\x1a&\x00\x00\x00\x00\x00\x01\x00\x05\xc9\x0e\ +\x00\x00\x01z\x88\x90<\xfb\ +\x00\x00\x22\xda\x00\x00\x00\x00\x00\x01\x00\x06\x1a\x17\ +\x00\x00\x01z\x88\x90<\xfe\ +\x00\x00\x1cV\x00\x00\x00\x00\x00\x01\x00\x05\xda\xb6\ +\x00\x00\x01z\x88\x90<\xf8\ +\x00\x00!\xf4\x00\x00\x00\x00\x00\x01\x00\x06\x11E\ +\x00\x00\x01z\x88\x90<\xfb\ +\x00\x00\x1bN\x00\x00\x00\x00\x00\x01\x00\x05\xd0\xd0\ +\x00\x00\x01z\x88\x90<\xf9\ +\x00\x00\x19\x80\x00\x00\x00\x00\x00\x01\x00\x05\xc0C\ +\x00\x00\x01z\x88\x90=\x05\ +\x00\x00\x1d\x98\x00\x00\x00\x00\x00\x01\x00\x05\xea!\ +\x00\x00\x01z\x88\x90<\xcf\ +\x00\x00\x0f,\x00\x00\x00\x00\x00\x01\x00\x04:\x97\ +\x00\x00\x01z\x88\x90B;\ +\x00\x00\x0d|\x00\x00\x00\x00\x00\x01\x00\x03\xa4:\ +\x00\x00\x01z\x88\x90@\x8d\ +\x00\x00\x0e\xf2\x00\x00\x00\x00\x00\x01\x00\x045\x8a\ +\x00\x00\x01z\x88\x90A\x9c\ +\x00\x00\x0d\xf0\x00\x00\x00\x00\x00\x01\x00\x04\x07,\ +\x00\x00\x01z\x88\x90@a\ +\x00\x00\x0ah\x00\x00\x00\x00\x00\x01\x00\x03E?\ +\x00\x00\x01z\x88\x90B8\ +\x00\x00\x09\xd8\x00\x01\x00\x00\x00\x01\x00\x02|Z\ +\x00\x00\x01z\x88\x90@m\ +\x00\x00\x07\x84\x00\x00\x00\x00\x00\x01\x00\x01\x9b\x8b\ +\x00\x00\x01z\x88\x90@b\ +\x00\x00\x08\xac\x00\x00\x00\x00\x00\x01\x00\x01\xb6{\ +\x00\x00\x01z\x88\x90A\xa0\ +\x00\x00\x0f\x96\x00\x00\x00\x00\x00\x01\x00\x04|\x91\ +\x00\x00\x01z\x88\x90@i\ +\x00\x00\x0e\x82\x00\x00\x00\x00\x00\x01\x00\x04(>\ +\x00\x00\x01z\x88\x90@\x94\ +\x00\x00\x09D\x00\x00\x00\x00\x00\x01\x00\x02q\xb7\ +\x00\x00\x01z\x88\x90@\x87\ +\x00\x00\x0e\xbe\x00\x00\x00\x00\x00\x01\x00\x040i\ +\x00\x00\x01z\x88\x90A\x9d\ +\x00\x00\x09\x9c\x00\x00\x00\x00\x00\x01\x00\x02y\xc6\ +\x00\x00\x01z\x88\x90A\x9b\ +\x00\x00\x0c\x92\x00\x00\x00\x00\x00\x01\x00\x03\x88\x0e\ +\x00\x00\x01z\x88\x90@w\ +\x00\x00\x07\xec\x00\x00\x00\x00\x00\x01\x00\x01\xa9\xae\ +\x00\x00\x01z\x88\x90@\x90\ +\x00\x00\x08\xea\x00\x00\x00\x00\x00\x01\x00\x01\xd2!\ +\x00\x00\x01z\x88\x90@\x80\ +\x00\x00\x10\x0e\x00\x00\x00\x00\x00\x01\x00\x04\x99\x8e\ +\x00\x00\x01z\x88\x90B:\ +\x00\x00\x08\xc6\x00\x00\x00\x00\x00\x01\x00\x01\xbcy\ +\x00\x00\x01z\x88\x90@g\ +\x00\x00\x0c\xd4\x00\x00\x00\x00\x00\x01\x00\x03\x949\ +\x00\x00\x01z\x88\x90@\x8c\ +\x00\x00\x07\xb4\x00\x00\x00\x00\x00\x01\x00\x01\xa0%\ +\x00\x00\x01z\x88\x90B9\ +\x00\x00\x09j\x00\x00\x00\x00\x00\x01\x00\x02u[\ +\x00\x00\x01z\x88\x90@b\ +\x00\x00\x0b2\x00\x00\x00\x00\x00\x01\x00\x03a\xfa\ +\x00\x00\x01z\x88\x90@\x89\ +\x00\x00\x0a:\x00\x01\x00\x00\x00\x01\x00\x03%L\ +\x00\x00\x01z\x88\x90@o\ +\x00\x00\x07\x04\x00\x00\x00\x00\x00\x01\x00\x01\x90\xa8\ +\x00\x00\x01z\x88\x90@`\ +\x00\x00\x0bj\x00\x00\x00\x00\x00\x01\x00\x03e\xa2\ +\x00\x00\x01z\x88\x90@\x8c\ +\x00\x00\x0e\x0a\x00\x00\x00\x00\x00\x01\x00\x04\x0a\xc0\ +\x00\x00\x01z\x88\x90@\x8d\ +\x00\x00\x0c\xae\x00\x00\x00\x00\x00\x01\x00\x03\x8f%\ +\x00\x00\x01z\x88\x90@\x8f\ +\x00\x00\x0b\xcc\x00\x00\x00\x00\x00\x01\x00\x03j*\ +\x00\x00\x01z\x88\x90@\x8a\ +\x00\x00\x0b\x06\x00\x00\x00\x00\x00\x01\x00\x03L*\ +\x00\x00\x01z\x88\x90@{\ +\x00\x00\x0fr\x00\x00\x00\x00\x00\x01\x00\x04s,\ +\x00\x00\x01z\x88\x90B<\ +\x00\x00\x0f\xc0\x00\x00\x00\x00\x00\x01\x00\x04\x91Y\ +\x00\x00\x01z\x88\x90@\x93\ +\x00\x00\x0d\xb6\x00\x00\x00\x00\x00\x01\x00\x03\xa7\xbc\ +\x00\x00\x01z\x88\x90@z\ +\x00\x00\x0a\xa2\x00\x00\x00\x00\x00\x01\x00\x03G\xd3\ +\x00\x00\x01z\x88\x90@\x8b\ +\x00\x00\x06\xa2\x00\x00\x00\x00\x00\x01\x00\x01.\x89\ +\x00\x00\x01z\x88\x90@x\ +\x00\x00\x0cT\x00\x00\x00\x00\x00\x01\x00\x03\x83\xa5\ +\x00\x00\x01z\x88\x90@\x88\ +\x00\x00\x07b\x00\x00\x00\x00\x00\x01\x00\x01\x98_\ +\x00\x00\x01z\x88\x90A\x8b\ +\x00\x00\x08*\x00\x00\x00\x00\x00\x01\x00\x01\xae\xc7\ +\x00\x00\x01z\x88\x90B7\ +\x00\x00\x10@\x00\x00\x00\x00\x00\x01\x00\x04\xa3&\ +\x00\x00\x01z\x88\x90@_\ +\x00\x00\x0fB\x00\x01\x00\x00\x00\x01\x00\x04A\xf9\ +\x00\x00\x01z\x88\x90@l\ +\x00\x00\x06\xd0\x00\x00\x00\x00\x00\x01\x00\x01\x8e\x11\ +\x00\x00\x01z\x88\x90A\x9b\ +\x00\x00\x0a&\x00\x00\x00\x00\x00\x01\x00\x03\x1f\xd5\ +\x00\x00\x01z\x88\x90@e\ +\x00\x00\x10j\x00\x00\x00\x00\x00\x01\x00\x04\xa5\xd7\ +\x00\x00\x01z\x88\x90@~\ +\x00\x00\x09\xf8\x00\x00\x00\x00\x00\x01\x00\x02\x9f\xc9\ +\x00\x00\x01z\x88\x90@k\ +\x00\x00\x0eV\x00\x01\x00\x00\x00\x01\x00\x04\x0eB\ +\x00\x00\x01z\x88\x90@p\ +\x00\x00\x0d^\x00\x00\x00\x00\x00\x01\x00\x03\x9di\ +\x00\x00\x01z\x88\x90B.\ +\x00\x00\x0c\x1c\x00\x00\x00\x00\x00\x01\x00\x03n\x97\ +\x00\x00\x01z\x88\x90@|\ +\x00\x00\x07*\x00\x00\x00\x00\x00\x01\x00\x01\x93G\ +\x00\x00\x01z\x88\x90@\x91\ +\x00\x00\x0d\x22\x00\x00\x00\x00\x00\x01\x00\x03\x98\xd3\ +\x00\x00\x01z\x88\x90@\x8f\ +\x00\x00\x08\x5c\x00\x00\x00\x00\x00\x01\x00\x01\xb1^\ +\x00\x00\x01z\x88\x90@\x92\ +\x00\x00\x09&\x00\x00\x00\x00\x00\x01\x00\x02\x5c\x1d\ +\x00\x00\x01z\x88\x90@f\ +\x00\x00\x11\xae\x00\x00\x00\x00\x00\x01\x00\x05X\xbf\ +\x00\x00\x01z\x88\x90@u\ +\x00\x00\x120\x00\x00\x00\x00\x00\x01\x00\x05\x83^\ +\x00\x00\x01z\x88\x90@q\ +\x00\x00\x11\x06\x00\x00\x00\x00\x00\x01\x00\x05L\x08\ +\x00\x00\x01z\x88\x90@W\ +\x00\x00\x12\x0a\x00\x00\x00\x00\x00\x01\x00\x05q%\ +\x00\x00\x01z\x88\x90@d\ +\x00\x00\x12H\x00\x00\x00\x00\x00\x01\x00\x05\x87p\ +\x00\x00\x01z\x88\x90@r\ +\x00\x00\x11<\x00\x00\x00\x00\x00\x01\x00\x05Q\xce\ +\x00\x00\x01z\x88\x90@\x82\ +\x00\x00\x10\xa8\x00\x00\x00\x00\x00\x01\x00\x053\xe7\ +\x00\x00\x01z\x88\x90@\x83\ +\x00\x00\x11\xc8\x00\x00\x00\x00\x00\x01\x00\x05^\xc1\ +\x00\x00\x01z\x88\x90@\x85\ +\x00\x00\x11\x84\x00\x00\x00\x00\x00\x01\x00\x05W\xf1\ +\x00\x00\x01z\x88\x90@\x86\ +\x00\x00\x10\xd2\x00\x00\x00\x00\x00\x01\x00\x054t\ +\x00\x00\x01z\x88\x90@s\ +\x00\x00\x11\xf2\x00\x00\x00\x00\x00\x01\x00\x05_e\ +\x00\x00\x01z\x88\x90@^\ +\x00\x00\x10\xec\x00\x00\x00\x00\x00\x01\x00\x05BU\ +\x00\x00\x01z\x88\x90@X\ +\x00\x00\x11f\x00\x00\x00\x00\x00\x01\x00\x05R}\ +\x00\x00\x01z\x88\x90@\x98\ +" + +def qInitResources(): + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +def qCleanupResources(): + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) + +qInitResources() diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_error_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_error_controller.py new file mode 100644 index 0000000000..e6271a5a75 --- /dev/null +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_error_controller.py @@ -0,0 +1,29 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +from unittest import TestCase +from unittest.mock import (call, MagicMock, patch) + +from controller.error_controller import ErrorController + +class TestErrorController(TestCase): + """ + ErrorController unit test cases + """ + def setUp(self) -> None: + view_manager_patcher: patch = patch("controller.error_controller.ViewManager") + self.addCleanup(view_manager_patcher.stop) + self._mock_view_manager: MagicMock = view_manager_patcher.start() + + self._mocked_view_manager: MagicMock = self._mock_view_manager.get_instance.return_value + self._mocked_error_page: MagicMock = self._mocked_view_manager.get_error_page.return_value + + self._test_error_controller: ErrorController = ErrorController() + self._test_error_controller.setup() + + def test_setup_with_expected_behavior_connected(self) -> None: + self._mocked_error_page.ok_button.clicked.connect.assert_called_once_with(self._test_error_controller._ok) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py index f854d2cd68..c73bddcd9c 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/controller/test_view_edit_controller.py @@ -22,6 +22,8 @@ class TestViewEditController(TestCase): TODO: add test cases once error handling is ready """ _expected_account_id: str = "1234567890" + _expected_account_id_attribute_name = "AccountId" + _expected_account_id_template_vale: str = "EMPTY" _expected_region: str = "aws-global" _expected_config_directory: str = "dummy/directory/" _expected_config_file_name: str = "dummy.json" @@ -98,8 +100,6 @@ class TestViewEditController(TestCase): self._test_view_edit_controller._filter_based_on_search_text) self._mocked_view_edit_page.cancel_button.clicked.connect.assert_called_once_with( self._test_view_edit_controller._cancel) - self._mocked_view_edit_page.create_new_button.clicked.connect.assert_called_once_with( - self._test_view_edit_controller._create_new_config_file) self._mocked_view_edit_page.rescan_button.clicked.connect.assert_called_once_with( self._test_view_edit_controller._rescan_config_directory) @@ -301,6 +301,7 @@ class TestViewEditController(TestCase): expected_new_config_directory, constants.RESOURCE_MAPPING_CONFIG_FILE_NAME_SUFFIX) assert self._mocked_configuration_manager.configuration.config_files == [] self._mocked_view_edit_page.set_config_files.assert_called_with([]) + self._mocked_view_edit_page.set_config_location.assert_called_with(expected_new_config_directory) self._test_view_edit_controller.set_notification_page_frame_text_sender.emit.assert_called_once_with( notification_label_text.NOTIFICATION_LOADING_MESSAGE) @@ -418,13 +419,18 @@ class TestViewEditController(TestCase): self, mock_json_utils: MagicMock, mock_file_utils: MagicMock) -> None: self._mocked_view_edit_page.config_file_combobox.currentText.return_value = \ TestViewEditController._expected_config_file_name - expected_json_dict: Dict[str, any] = {"dummyKey": "dummyValue"} + expected_json_dict: Dict[str, any] = { + "dummyKey": "dummyValue", + self._expected_account_id_attribute_name: self._expected_account_id_template_vale} + mock_json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME = self._expected_account_id_attribute_name + mock_json_utils.RESOURCE_MAPPING_ACCOUNTID_TEMPLATE_VALUE = self._expected_account_id_template_vale mock_json_utils.validate_resources_according_to_json_schema.return_value = [] mock_json_utils.convert_resources_to_json_dict.return_value = expected_json_dict mock_file_utils.join_path.return_value = TestViewEditController._expected_config_file_full_path mocked_call_args: call = self._mocked_view_edit_page.save_changes_button.clicked.connect.call_args[0] mocked_call_args[0]() # triggering save_changes_button connected function + assert expected_json_dict["AccountId"] == self._mocked_configuration_manager.configuration.account_id mock_json_utils.convert_resources_to_json_dict.assert_called_once() mock_json_utils.write_into_json_file.assert_called_once_with( TestViewEditController._expected_config_file_full_path, expected_json_dict) @@ -468,37 +474,6 @@ class TestViewEditController(TestCase): mocked_call_args[0]() # triggering cancel_button connected function mock_application.instance.return_value.quit.assert_called_once() - @patch("controller.view_edit_controller.file_utils") - @patch("controller.view_edit_controller.json_utils") - def test_page_create_new_button_invoke_view_edit_page_set_config_files_with_expected_config_files( - self, mock_json_utils: MagicMock, mock_file_utils: MagicMock) -> None: - expected_config_files: List[str] = ["dummyfile"] - mock_file_utils.find_files_with_suffix_under_directory.return_value = expected_config_files - mocked_call_args: call = \ - self._mocked_view_edit_page.create_new_button.clicked.connect.call_args[0] - - mocked_call_args[0]() # triggering create_new_button connected function - mock_file_utils.join_path.assert_called_once() - mock_json_utils.create_empty_resource_mapping_file.assert_called_once() - mock_file_utils.find_files_with_suffix_under_directory.assert_called_once() - self._mocked_view_edit_page.set_config_files.assert_called_with(expected_config_files) - self._test_view_edit_controller.set_notification_frame_text_sender.emit.assert_called_once() - - @patch("controller.view_edit_controller.file_utils") - @patch("controller.view_edit_controller.json_utils") - def test_page_create_new_button_post_notification_when_create_file_throw_exception( - self, mock_json_utils: MagicMock, mock_file_utils: MagicMock) -> None: - expected_config_files: List[str] = ["dummyfile"] - mock_json_utils.create_empty_resource_mapping_file.side_effect = IOError("dummy IO error") - mocked_call_args: call = \ - self._mocked_view_edit_page.create_new_button.clicked.connect.call_args[0] - - mocked_call_args[0]() # triggering create_new_button connected function - mock_file_utils.join_path.assert_called_once() - mock_json_utils.create_empty_resource_mapping_file.assert_called_once() - mock_file_utils.find_files_with_suffix_under_directory.assert_not_called() - assert len(self._test_view_edit_controller.set_notification_frame_text_sender.emit.mock_calls) == 2 - @patch("controller.view_edit_controller.file_utils") def test_page_rescan_button_post_notification_when_find_files_throw_exception( self, mock_file_utils: MagicMock) -> None: diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_json_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_json_utils.py index cadcca6ee6..7eb92ff222 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_json_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/tests/unit/utils/test_json_utils.py @@ -43,7 +43,7 @@ class TestJsonUtils(TestCase): json_utils._RESOURCE_MAPPING_TYPE_JSON_KEY_NAME: _expected_bucket_type, json_utils._RESOURCE_MAPPING_NAMEID_JSON_KEY_NAME: _expected_bucket_name }}, - json_utils._RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: _expected_account_id, + json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: _expected_account_id, json_utils._RESOURCE_MAPPING_REGION_JSON_KEY_NAME: _expected_region, json_utils._RESOURCE_MAPPING_VERSION_JSON_KEY_NAME: json_utils._RESOURCE_MAPPING_JSON_FORMAT_VERSION } @@ -64,7 +64,7 @@ class TestJsonUtils(TestCase): def test_convert_resources_to_json_dict_return_expected_json_dict(self) -> None: old_json_dict: Dict[str, any] = { - json_utils._RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: TestJsonUtils._expected_account_id, + json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: TestJsonUtils._expected_account_id, json_utils._RESOURCE_MAPPING_REGION_JSON_KEY_NAME: TestJsonUtils._expected_region } actual_json_dict: Dict[str, any] = \ @@ -76,20 +76,6 @@ class TestJsonUtils(TestCase): json_utils.convert_json_dict_to_resources(TestJsonUtils._expected_json_dict) assert actual_resources == [TestJsonUtils._expected_bucket_resource_mapping] - def test_create_empty_resource_mapping_file_succeed(self) -> None: - mocked_open: MagicMock = MagicMock() - self._mock_open.return_value.__enter__.return_value = mocked_open - expected_json_dict: Dict[str, any] = \ - {json_utils._RESOURCE_MAPPING_JSON_KEY_NAME: {}, - json_utils._RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: TestJsonUtils._expected_account_id, - json_utils._RESOURCE_MAPPING_REGION_JSON_KEY_NAME: TestJsonUtils._expected_region, - json_utils._RESOURCE_MAPPING_VERSION_JSON_KEY_NAME: json_utils._RESOURCE_MAPPING_JSON_FORMAT_VERSION} - json_utils.create_empty_resource_mapping_file(TestJsonUtils._expected_file_name, - TestJsonUtils._expected_account_id, - TestJsonUtils._expected_region) - self._mock_open.assert_called_once_with(TestJsonUtils._expected_file_name, "w") - self._mock_json_dump.assert_called_once_with(expected_json_dict, mocked_open, indent=4, sort_keys=True) - def test_read_from_json_file_return_expected_json_dict(self) -> None: mocked_open: MagicMock = MagicMock() self._mock_open.return_value.__enter__.return_value = mocked_open @@ -114,12 +100,18 @@ class TestJsonUtils(TestCase): def test_validate_json_dict_according_to_json_schema_raise_error_when_json_dict_has_no_accountid(self) -> None: invalid_json_dict: Dict[str, any] = copy.deepcopy(TestJsonUtils._expected_json_dict) - invalid_json_dict.pop(json_utils._RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME) + invalid_json_dict.pop(json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME) self.assertRaises(KeyError, json_utils.validate_json_dict_according_to_json_schema, invalid_json_dict) + def test_validate_json_dict_according_to_json_schema_pass_when_json_dict_has_template_accountid(self) -> None: + valid_json_dict: Dict[str, any] = copy.deepcopy(TestJsonUtils._expected_json_dict) + valid_json_dict[json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] = \ + json_utils.RESOURCE_MAPPING_ACCOUNTID_TEMPLATE_VALUE + json_utils.validate_json_dict_according_to_json_schema(valid_json_dict) + def test_validate_json_dict_according_to_json_schema_raise_error_when_json_dict_has_invalid_accountid(self) -> None: invalid_json_dict: Dict[str, any] = copy.deepcopy(TestJsonUtils._expected_json_dict) - invalid_json_dict[json_utils._RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] = \ + invalid_json_dict[json_utils.RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] = \ TestJsonUtils._expected_invalid_account_id self.assertRaises(ValueError, json_utils.validate_json_dict_according_to_json_schema, invalid_json_dict) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/json_utils.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/json_utils.py index 10f7c8ed33..5b9377ada3 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/json_utils.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/utils/json_utils.py @@ -22,16 +22,16 @@ logger = logging.getLogger(__name__) _RESOURCE_MAPPING_JSON_KEY_NAME: str = "AWSResourceMappings" _RESOURCE_MAPPING_TYPE_JSON_KEY_NAME: str = "Type" _RESOURCE_MAPPING_NAMEID_JSON_KEY_NAME: str = "Name/ID" -_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: str = "AccountId" _RESOURCE_MAPPING_REGION_JSON_KEY_NAME: str = "Region" _RESOURCE_MAPPING_VERSION_JSON_KEY_NAME: str = "Version" _RESOURCE_MAPPING_JSON_FORMAT_VERSION: str = "1.0.0" -_RESOURCE_MAPPING_ACCOUNTID_PATTERN: str = "^[0-9]{12}$" +RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: str = "AccountId" +RESOURCE_MAPPING_ACCOUNTID_TEMPLATE_VALUE: str = "EMPTY" +_RESOURCE_MAPPING_ACCOUNTID_PATTERN: str = f"^[0-9]{{12}}|{RESOURCE_MAPPING_ACCOUNTID_TEMPLATE_VALUE}$" _RESOURCE_MAPPING_REGION_PATTERN: str = "^[a-z]{2}-[a-z]{4,9}-[0-9]{1}$" _RESOURCE_MAPPING_VERSION_PATTERN: str = "^[0-9]{1}.[0-9]{1}.[0-9]{1}$" - def _add_validation_error_message(errors: Dict[int, List[str]], row: int, error_message: str) -> None: if row in errors.keys(): errors[row].append(error_message) @@ -64,9 +64,9 @@ def _validate_required_key_in_json_dict(json_dict: Dict[str, any], json_dict_nam def convert_resources_to_json_dict(resources: List[ResourceMappingAttributes], old_json_dict: Dict[str, any]) -> Dict[str, any]: - default_account_id: str = old_json_dict[_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] + default_account_id: str = old_json_dict[RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] default_region: str = old_json_dict[_RESOURCE_MAPPING_REGION_JSON_KEY_NAME] - json_dict: Dict[str, any] = {_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: default_account_id, + json_dict: Dict[str, any] = {RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: default_account_id, _RESOURCE_MAPPING_REGION_JSON_KEY_NAME: default_region, _RESOURCE_MAPPING_VERSION_JSON_KEY_NAME: _RESOURCE_MAPPING_JSON_FORMAT_VERSION, _RESOURCE_MAPPING_JSON_KEY_NAME: {}} @@ -76,7 +76,7 @@ def convert_resources_to_json_dict(resources: List[ResourceMappingAttributes], json_resource_attributes = {_RESOURCE_MAPPING_TYPE_JSON_KEY_NAME: resource.type, _RESOURCE_MAPPING_NAMEID_JSON_KEY_NAME: resource.name_id} if not resource.account_id == default_account_id: - json_resource_attributes[_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] = resource.account_id + json_resource_attributes[RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] = resource.account_id if not resource.region == default_region: json_resource_attributes[_RESOURCE_MAPPING_REGION_JSON_KEY_NAME] = resource.region @@ -88,7 +88,7 @@ def convert_resources_to_json_dict(resources: List[ResourceMappingAttributes], def convert_json_dict_to_resources(json_dict: Dict[str, any]) -> List[ResourceMappingAttributes]: - default_account_id: str = json_dict[_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] + default_account_id: str = json_dict[RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME] default_region: str = json_dict[_RESOURCE_MAPPING_REGION_JSON_KEY_NAME] resources: List[ResourceMappingAttributes] = [] @@ -102,8 +102,8 @@ def convert_json_dict_to_resources(json_dict: Dict[str, any]) -> List[ResourceMa .build_type(resource_value[_RESOURCE_MAPPING_TYPE_JSON_KEY_NAME]) \ .build_name_id(resource_value[_RESOURCE_MAPPING_NAMEID_JSON_KEY_NAME]) - if _RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME in resource_value.keys(): - resource_builder.build_account_id(resource_value[_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME]) + if RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME in resource_value.keys(): + resource_builder.build_account_id(resource_value[RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME]) else: resource_builder.build_account_id(default_account_id) @@ -119,14 +119,6 @@ def convert_json_dict_to_resources(json_dict: Dict[str, any]) -> List[ResourceMa return resources -def create_empty_resource_mapping_file(file_name: str, account_id: str, region: str) -> None: - json_dict: Dict[str, any] = {_RESOURCE_MAPPING_JSON_KEY_NAME: {}, - _RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME: account_id, - _RESOURCE_MAPPING_REGION_JSON_KEY_NAME: region, - _RESOURCE_MAPPING_VERSION_JSON_KEY_NAME: _RESOURCE_MAPPING_JSON_FORMAT_VERSION} - write_into_json_file(file_name, json_dict) - - def read_from_json_file(file_name: str) -> Dict[str, any]: try: json_dict: Dict[str, any] = {} @@ -179,7 +171,7 @@ def validate_resources_according_to_json_schema(resources: List[ResourceMappingA invalid_resources, row_count, error_messages.INVALID_FORMAT_UNEXPECTED_VALUE_IN_TABLE_ERROR_MESSAGE.format( resource.account_id, - _RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME, + RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME, _RESOURCE_MAPPING_ACCOUNTID_PATTERN)) if not re.match(_RESOURCE_MAPPING_REGION_PATTERN, resource.region): @@ -198,11 +190,11 @@ def validate_json_dict_according_to_json_schema(json_dict: Dict[str, any]) -> No _validate_required_key_in_json_dict(json_dict, "root", _RESOURCE_MAPPING_VERSION_JSON_KEY_NAME) _validate_required_key_in_json_dict(json_dict, "root", _RESOURCE_MAPPING_JSON_KEY_NAME) - _validate_required_key_in_json_dict(json_dict, "root", _RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME) - if not re.match(_RESOURCE_MAPPING_ACCOUNTID_PATTERN, json_dict[_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME]): + _validate_required_key_in_json_dict(json_dict, "root", RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME) + if not re.match(_RESOURCE_MAPPING_ACCOUNTID_PATTERN, json_dict[RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME]): raise ValueError(error_messages.INVALID_FORMAT_UNEXPECTED_VALUE_IN_FILE_ERROR_MESSAGE.format( - json_dict[_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME], - f"root/{_RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME}", + json_dict[RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME], + f"root/{RESOURCE_MAPPING_ACCOUNTID_JSON_KEY_NAME}", _RESOURCE_MAPPING_ACCOUNTID_PATTERN)) _validate_required_key_in_json_dict(json_dict, "root", _RESOURCE_MAPPING_REGION_JSON_KEY_NAME) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py index 7797905dd7..8a9fc1625d 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/common_view_components.py @@ -8,7 +8,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT from PySide2.QtCore import Slot from PySide2.QtGui import (QIcon, QPixmap) from PySide2.QtWidgets import (QFrame, QHBoxLayout, QLabel, QLayout, QLineEdit, QPushButton, - QSizePolicy, QWidget) + QSizePolicy, QVBoxLayout, QWidget) class SearchFilterLineEdit(QLineEdit): @@ -25,39 +25,61 @@ class SearchFilterLineEdit(QLineEdit): class NotificationFrame(QFrame): """NotificationFrame is composed of information icon, notification title and close icon""" - def __init__(self, parent: QWidget, pixmap: QPixmap, title: str, closeable: bool) -> None: + def __init__(self, parent: QWidget, pixmap: QPixmap, content: str, closeable: bool, title: str = '') -> None: super().__init__(parent) self.setObjectName("NotificationFrame") - self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum)) + self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Maximum) self.setFrameStyle(QFrame.StyledPanel | QFrame.Plain) + self._header_layout: QHBoxLayout = QHBoxLayout(self) + self._header_layout.setSizeConstraint(QLayout.SetMinimumSize) + self._header_layout.setContentsMargins(0, 0, 0, 0) + self._header_layout.setSpacing(0) + icon_label: QLabel = QLabel(self) icon_label.setObjectName("NotificationIcon") icon_label.setPixmap(pixmap) + self._header_layout.addWidget(icon_label) + + text_widget = QWidget(self) + text_layout: QVBoxLayout = QVBoxLayout(text_widget) + text_layout.setContentsMargins(0, 0, 0, 0) + text_layout.setSpacing(5) self._title_label: QLabel = QLabel(title, self) - self._title_label.setOpenExternalLinks(True) self._title_label.setObjectName("NotificationTitle") - self._title_label.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)) - self._title_label.setWordWrap(True) + self._title_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) + text_layout.addWidget(self._title_label) + if not title: + self._title_label.hide() + + self._content_label: QLabel = QLabel(content, self) + self._content_label.setOpenExternalLinks(True) + self._content_label.setObjectName("NotificationContent") + self._content_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) + self._content_label.setWordWrap(True) + text_layout.addWidget(self._content_label) + + self._header_layout.addWidget(text_widget) - header_layout: QHBoxLayout = QHBoxLayout(self) - header_layout.setSizeConstraint(QLayout.SetMinimumSize) - header_layout.setContentsMargins(0, 0, 0, 0) - header_layout.addWidget(icon_label) - header_layout.addWidget(self._title_label) if closeable: cancel_button: QPushButton = QPushButton(self) cancel_button.setIcon(QIcon(":/stylesheet/img/close.svg")) cancel_button.setFlat(True) cancel_button.clicked.connect(self.hide) - header_layout.addWidget(cancel_button) - self.setLayout(header_layout) + self._header_layout.addWidget(cancel_button) + self.setLayout(self._header_layout) self.setVisible(False) @Slot(str) - def set_frame_text_receiver(self, text: str) -> None: - self._title_label.setText(text) + def set_frame_text_receiver(self, content: str, title: str = '') -> None: + if title: + self._title_label.setText(title) + self._title_label.show() + else: + self._title_label.hide() + + self._content_label.setText(content) self.setVisible(True) diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/error_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/error_page.py index df4ce946bb..4232dcba85 100644 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/error_page.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/error_page.py @@ -5,6 +5,7 @@ For complete copyright and license terms please see the LICENSE at the root of t SPDX-License-Identifier: Apache-2.0 OR MIT """ +from PySide2.QtCore import Qt from PySide2.QtGui import QPixmap from PySide2.QtWidgets import (QHBoxLayout, QLayout, QPushButton, QSizePolicy, QSpacerItem, QVBoxLayout, QWidget) @@ -24,7 +25,13 @@ class ErrorPage(QWidget): page_vertical_layout: QVBoxLayout = QVBoxLayout(self) page_vertical_layout.setSizeConstraint(QLayout.SetMinimumSize) - page_vertical_layout.setMargin(0) + page_vertical_layout.setContentsMargins( + view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_TOPBOTTOM, + view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT, + view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_TOPBOTTOM + ) + page_vertical_layout.setSpacing(view_size_constants.ERROR_PAGE_LAYOUT_SPACING) self._setup_notification_area() page_vertical_layout.addWidget(self._notification_area) @@ -39,15 +46,16 @@ class ErrorPage(QWidget): view_size_constants.ERROR_PAGE_NOTIFICATION_AREA_HEIGHT) notification_area_layout: QVBoxLayout = QVBoxLayout(self._notification_area) + notification_area_layout.setSpacing(0) notification_area_layout.setSizeConstraint(QLayout.SetMinimumSize) - notification_area_layout.setContentsMargins( - view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.MAIN_PAGE_LAYOUT_MARGIN_TOPBOTTOM, - view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT, 0) + notification_area_layout.setContentsMargins(0, 0, 0, 0) + notification_area_layout.setSpacing(0) + notification_area_layout.setAlignment(Qt.AlignTop | Qt.AlignLeft) notification_frame: NotificationFrame = \ - NotificationFrame(self, QPixmap(":/error_report_warning.svg"), - error_messages.ERROR_PAGE_TOOL_SETUP_ERROR_MESSAGE, False) + NotificationFrame(self, QPixmap(":/error_report_helper.svg"), + error_messages.ERROR_PAGE_TOOL_SETUP_ERROR_MESSAGE, + False, error_messages.ERROR_PAGE_TOOL_SETUP_ERROR_TITLE) notification_frame.setObjectName("ErrorPage") notification_frame.setMinimumSize(view_size_constants.ERROR_PAGE_MAIN_WINDOW_WIDTH, view_size_constants.ERROR_PAGE_NOTIFICATION_AREA_HEIGHT) @@ -62,11 +70,8 @@ class ErrorPage(QWidget): footer_area_layout: QHBoxLayout = QHBoxLayout(self._footer_area) footer_area_layout.setSizeConstraint(QLayout.SetMinimumSize) - footer_area_layout.setContentsMargins( - view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_TOPBOTTOM, - view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_LEFTRIGHT, - view_size_constants.ERROR_PAGE_LAYOUT_MARGIN_TOPBOTTOM) + footer_area_layout.setContentsMargins(0, 0, 0, 0) + footer_area_layout.setAlignment(Qt.AlignBottom | Qt.AlignRight) footer_area_spacer: QSpacerItem = QSpacerItem(view_size_constants.ERROR_PAGE_MAIN_WINDOW_WIDTH, view_size_constants.INTERACTION_COMPONENT_HEIGHT, diff --git a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py index aabe634c0e..b673e547a0 100755 --- a/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py +++ b/Gems/AWSCore/Code/Tools/ResourceMappingTool/view/view_edit_page.py @@ -18,6 +18,9 @@ from model.resource_proxy_model import ResourceProxyModel from model.resource_table_model import (ResourceTableConstants, ResourceTableModel) from view.common_view_components import (NotificationFrame, SearchFilterLineEdit) +HIGHLIGHT_FIELD_PROPERTY = 'HighlightField' +HIGHLIGHT_TEXT_PROPERTY = 'HighlightText' + class ViewEditPageConstants(object): NOTIFICATION_PAGE_INDEX = 0 @@ -180,6 +183,7 @@ class ViewEditPage(QWidget): view_size_constants.INTERACTION_COMPONENT_HEIGHT) self._config_file_combobox.setCurrentIndex(-1) header_area_layout.addWidget(self._config_file_combobox) + self._config_file_combobox.currentIndexChanged.connect(self._set_config_file_combobox_style) header_area_spacer: QSpacerItem = QSpacerItem(view_size_constants.TOOL_APPLICATION_MAIN_WINDOW_WIDTH, view_size_constants.INTERACTION_COMPONENT_HEIGHT, @@ -202,7 +206,6 @@ class ViewEditPage(QWidget): self._config_location_button: QPushButton = QPushButton(self._header_area) self._config_location_button.setIcon(QIcon(":/Gallery/Folder.svg")) - self._config_location_button.setFlat(True) self._config_location_button.setMinimumSize(view_size_constants.INTERACTION_COMPONENT_HEIGHT, view_size_constants.INTERACTION_COMPONENT_HEIGHT) header_area_layout.addWidget(self._config_location_button) @@ -341,13 +344,6 @@ class ViewEditPage(QWidget): view_size_constants.INTERACTION_COMPONENT_HEIGHT) footer_area_layout.addWidget(self._save_changes_button) - self._create_new_button: QPushButton = QPushButton(self._footer_area) - self._create_new_button.setObjectName("Primary") - self._create_new_button.setText(notification_label_text.VIEW_EDIT_PAGE_CREATE_NEW_TEXT) - self._create_new_button.setMinimumSize(view_size_constants.CREATE_NEW_BUTTON_WIDTH, - view_size_constants.INTERACTION_COMPONENT_HEIGHT) - footer_area_layout.addWidget(self._create_new_button) - self._rescan_button: QPushButton = QPushButton(self._footer_area) self._rescan_button.setObjectName("Secondary") self._rescan_button.setText(notification_label_text.VIEW_EDIT_PAGE_RESCAN_TEXT) @@ -398,10 +394,6 @@ class ViewEditPage(QWidget): def search_filter_input(self) -> QLineEdit: return self._search_filter_line_edit - @property - def create_new_button(self) -> QPushButton: - return self._create_new_button - @property def rescan_button(self) -> QPushButton: return self._rescan_button @@ -442,24 +434,53 @@ class ViewEditPage(QWidget): if config_files: self._notification_page_frame.set_frame_text_receiver( notification_label_text.VIEW_EDIT_PAGE_SELECT_CONFIG_FILE_MESSAGE) - self._create_new_button.setVisible(False) self._rescan_button.setVisible(False) else: self._notification_page_frame.set_frame_text_receiver( - notification_label_text.VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE) - self._create_new_button.setVisible(True) + notification_label_text.VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_MESSAGE, + notification_label_text.VIEW_EDIT_PAGE_NO_CONFIG_FILE_FOUND_TITLE) self._rescan_button.setVisible(True) - self._config_file_combobox.blockSignals(False) + self.set_config_location() - def set_config_location(self, config_location: str) -> None: + self._config_file_combobox.blockSignals(False) + self._set_config_file_combobox_style() + if len(config_files) == 1: + # If there's only one config file under the selected directory, load it automatically. + self._config_file_combobox.setCurrentIndex(0) + + def _set_config_file_combobox_style(self): + if self._config_file_combobox.count() > 0 and self._config_file_combobox.currentIndex() == -1: + self._config_file_combobox.setProperty(HIGHLIGHT_FIELD_PROPERTY, True) + else: + self._config_file_combobox.setProperty(HIGHLIGHT_FIELD_PROPERTY, False) + + # Update the style + self._config_file_combobox.setStyle(self._config_file_combobox.style()) + + def set_config_location(self, config_location: str = None) -> None: """Set config file location in text label""" self._config_location_text.clear() - metrics: QFontMetrics = QFontMetrics(self._config_location_text.font()) - elided_text: str = metrics.elidedText(config_location, Qt.ElideMiddle, self._config_location_text.width()) - self._config_location_text.setText(elided_text) - self._config_location_text.setToolTip(config_location) + if not config_location: + self._config_location_text.setText(notification_label_text.VIEW_EDIT_PAGE_INVALID_CONFIG_LOCATION_TEXT) + self._config_location_text.setProperty(HIGHLIGHT_TEXT_PROPERTY, True) + + self._config_location_button.setFlat(False) + self._config_location_button.setProperty(HIGHLIGHT_FIELD_PROPERTY, True) + else: + metrics: QFontMetrics = QFontMetrics(self._config_location_text.font()) + elided_text: str = metrics.elidedText(config_location, Qt.ElideMiddle, self._config_location_text.width()) + self._config_location_text.setText(elided_text) + self._config_location_text.setToolTip(config_location) + self._config_location_text.setProperty(HIGHLIGHT_TEXT_PROPERTY, False) + + self._config_location_button.setFlat(True) + self._config_location_button.setProperty(HIGHLIGHT_FIELD_PROPERTY, False) + + # Update the style + self._config_location_text.setStyle(self._config_location_text.style()) + self._config_location_button.setStyle(self._config_location_button.style()) def set_table_view_page_interactions_enabled(self, enabled: bool) -> None: self._table_view_page.setEnabled(enabled) diff --git a/Templates/DefaultProject/Template/Config/default_aws_resource_mappings.json b/Templates/DefaultProject/Template/Config/default_aws_resource_mappings.json new file mode 100644 index 0000000000..79dca07d01 --- /dev/null +++ b/Templates/DefaultProject/Template/Config/default_aws_resource_mappings.json @@ -0,0 +1,6 @@ +{ + "AWSResourceMappings": {}, + "AccountId": "EMPTY", + "Region": "us-east-1", + "Version": "1.0.0" +} diff --git a/Templates/DefaultProject/Template/Registry/awscoreconfiguration.setreg b/Templates/DefaultProject/Template/Registry/awscoreconfiguration.setreg new file mode 100644 index 0000000000..c84ae4c3af --- /dev/null +++ b/Templates/DefaultProject/Template/Registry/awscoreconfiguration.setreg @@ -0,0 +1,10 @@ +{ + "Amazon": + { + "AWSCore": + { + "ProfileName": "default", + "ResourceMappingConfigFileName": "default_aws_resource_mappings.json" + } + } +} diff --git a/Templates/DefaultProject/template.json b/Templates/DefaultProject/template.json index 37409a11b4..6cf861a2ef 100644 --- a/Templates/DefaultProject/template.json +++ b/Templates/DefaultProject/template.json @@ -174,6 +174,12 @@ "isTemplated": false, "isOptional": false }, + { + "file": "Config/default_aws_resource_mappings.json", + "origin": "Config/default_aws_resource_mappings.json", + "isTemplated": false, + "isOptional": false + }, { "file": "EngineFinder.cmake", "origin": "EngineFinder.cmake", @@ -246,6 +252,12 @@ "isTemplated": true, "isOptional": false }, + { + "file": "Registry/awscoreconfiguration.setreg", + "origin": "Registry/awscoreconfiguration.setreg", + "isTemplated": false, + "isOptional": false + }, { "file": "Resources/LegacyLogoLauncher.bmp", "origin": "Resources/LegacyLogoLauncher.bmp", From 7d23f39951382326382422f1c1eb5cf96ef75f2d Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 11:19:10 -0700 Subject: [PATCH 055/355] revert change to leave it without any behavior change Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Converters/FIR-Weights.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp index 46bac7c595..41b0fd8b41 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Converters/FIR-Weights.cpp @@ -296,8 +296,8 @@ namespace ImageProcessingAtom /* skip leading and trailing zeros */ if (trimZeros) { - /* set i0 and i1 to the nonzero support of the filter */ - i0 = i1 = lastnonzero + 1; + /* set i1 to the nonzero support of the filter */ + i1 = lastnonzero + 1; } if (sumiWeights != WEIGHTONE) From 37c7c6884b68bc15d64dd3d2bea30c0abec92669 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 11:46:45 -0700 Subject: [PATCH 056/355] Fixes typos from PERFORMANCE_BUILD removal Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Legacy/CryCommon/ProjectDefines.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Legacy/CryCommon/ProjectDefines.h b/Code/Legacy/CryCommon/ProjectDefines.h index b443fc9ce0..203bd304c9 100644 --- a/Code/Legacy/CryCommon/ProjectDefines.h +++ b/Code/Legacy/CryCommon/ProjectDefines.h @@ -71,7 +71,7 @@ #define REMOTE_ASSET_PROCESSOR #endif -#if (!defined(_RELEASE) +#if !defined(_RELEASE) #define USE_HTTP_WEBSOCKETS 0 #endif @@ -97,7 +97,7 @@ #endif #endif -#if (!defined(_RELEASE) +#if !defined(_RELEASE) #ifndef ENABLE_PROFILING_CODE #define ENABLE_PROFILING_CODE #endif From 9585096829ead603044d67de60fa600f1c829990 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 13:29:54 -0700 Subject: [PATCH 057/355] adds include paths for Atom Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt index 39c49ab07f..f4148b435e 100644 --- a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt @@ -37,6 +37,7 @@ if(NOT PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED) NAMESPACE Gem FILES_CMAKE ${pal_source_dir}/platform_builders_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake + ${pal_include_dir}/platform_builders_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake atom_rhi_vulkan_reflect_common_files.cmake atom_rhi_vulkan_glad_files.cmake atom_rhi_vulkan_builders_common_files.cmake @@ -90,6 +91,7 @@ ly_add_target( FILES_CMAKE atom_rhi_vulkan_private_common_files.cmake ${pal_source_dir}/platform_private_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake + ${pal_include_dir}/platform_private_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake PLATFORM_INCLUDE_FILES ${pal_source_dir}/platform_private_static_${PAL_PLATFORM_NAME_LOWERCASE}.cmake INCLUDE_DIRECTORIES From 2bf83ad9fb8d7382f1ab2460cc074a380992453e Mon Sep 17 00:00:00 2001 From: Mike Chang <62353586+amzn-changml@users.noreply.github.com> Date: Tue, 31 Aug 2021 13:47:57 -0700 Subject: [PATCH 058/355] Ubuntu 20.04 package update for clang-12 (#3727) * Updated CMake, added libxkbcommon-dev and clang-12 * Add Corretto JDK 11 to packages for Ubuntu 20 and 18 * Add mountpoint creation command Signed-off-by: Mike Chang --- .../Linux/install-ubuntu-build-tools.sh | 17 +++++++++++++++++ .../build_node/Platform/Linux/install-ubuntu.sh | 7 +++++++ .../Linux/package-list.ubuntu-bionic.txt | 1 + .../Linux/package-list.ubuntu-focal.txt | 8 ++++---- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh index 478f3a37dc..88b9f9b505 100755 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu-build-tools.sh @@ -112,6 +112,23 @@ else fi +# +# Add Amazon Corretto repository to install the necessary JDK for Jenkins and Android +# + +CORRETTO_REPO_COUNT=$(cat /etc/apt/sources.list | grep ^dev | grep https://apt.corretto.aws | wc -l) + +if [ $CORRETTO -eq 0 ] +then + echo Adding Corretto Repository for JDK + + wget -O- https://apt.corretto.aws/corretto.key | apt-key add - + add-apt-repository 'deb https://apt.corretto.aws stable main' + apt-get update +else + echo Corretto repo already set +fi + # Read from the package list and process each package PACKAGE_FILE_LIST=package-list.ubuntu-$UBUNTU_DISTRO.txt diff --git a/scripts/build/build_node/Platform/Linux/install-ubuntu.sh b/scripts/build/build_node/Platform/Linux/install-ubuntu.sh index 60f0114872..d83ece9d47 100755 --- a/scripts/build/build_node/Platform/Linux/install-ubuntu.sh +++ b/scripts/build/build_node/Platform/Linux/install-ubuntu.sh @@ -40,6 +40,13 @@ then exit 1 fi +# Add mountpoint for Jenkins +if [ ! -d /data ] +then + echo Data folder does not exist. Creating it. + mkdir /data + chown $USER /data +fi echo Packages and tools for O3DE setup complete exit 0 diff --git a/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt index 9cc9d934c1..625909e214 100644 --- a/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt +++ b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-bionic.txt @@ -4,6 +4,7 @@ cmake/3.20.1-0kitware1ubuntu18.04.1 # For cmake clang-6.0 # For Ninja Build System ninja-build # For the compiler and its dependencies +java-11-amazon-corretto-jdk # For Jenkins and Android # Build Libraries libglu1-mesa-dev # For Qt (GL dependency) diff --git a/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt index d5a50cfa97..21c4755a2e 100644 --- a/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt +++ b/scripts/build/build_node/Platform/Linux/package-list.ubuntu-focal.txt @@ -1,9 +1,10 @@ # Package list for Ubuntu 20.04 # Build Tools Packages -cmake/3.20.1-0kitware1ubuntu20.04.1 # For cmake -clang-6.0 # For Ninja Build System +cmake/3.21.1-0kitware1ubuntu20.04.1 # For cmake +clang-12 # For Ninja Build System ninja-build # For the compiler and its dependencies +java-11-amazon-corretto-jdk # For Jenkins and Android # Build Libraries libglu1-mesa-dev # For Qt (GL dependency) @@ -12,7 +13,6 @@ libxcb-xinput0 # For Qt plugins at runtime libfontconfig1-dev # For Qt plugins at runtime libcurl4-openssl-dev # For HttpRequestor libsdl2-dev # for WWise/Audio +libxkbcommon-dev zlib1g-dev mesa-common-dev - - From 3b119b6f327bc4874a561d6b098b541803436fa7 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Tue, 31 Aug 2021 14:07:19 -0700 Subject: [PATCH 059/355] hot fix for json event input serialization Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Code/Editor/Nodes/NodeCreateUtils.cpp | 2 +- .../Widgets/NodePalette/NodePaletteModel.cpp | 28 ++----------------- .../Code/Include/ScriptCanvas/Core/Core.cpp | 18 ++++++++++++ .../Code/Include/ScriptCanvas/Core/Core.h | 2 ++ .../Serialization/DatumSerializer.cpp | 23 +++++++++++++-- 5 files changed, 44 insertions(+), 29 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp index 3bcd940a01..c1b557c9c4 100644 --- a/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Nodes/NodeCreateUtils.cpp @@ -408,7 +408,7 @@ namespace ScriptCanvasEditor::Nodes AZ::BehaviorAzEventDescription behaviorAzEventDesc; AZ::AttributeReader azEventDescAttributeReader(nullptr, azEventDescAttribute); azEventDescAttributeReader.Read(behaviorAzEventDesc); - if(behaviorAzEventDesc.m_eventName.empty()) + if (behaviorAzEventDesc.m_eventName.empty()) { AZ_Error("NodeUtils", false, "Cannot create an AzEvent node with empty event name") return {}; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp index 38def487e6..390dbaf0fb 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp @@ -140,21 +140,10 @@ namespace // If the reflected method returns an AZ::Event, reflect it to the SerializeContext if (AZ::MethodReturnsAzEventByReferenceOrPointer(method)) { - AZ::SerializeContext* serializeContext{}; - AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); const AZ::BehaviorParameter* resultParameter = method.GetResult(); - AZ::SerializeContext::ClassData classData; - classData.m_name = resultParameter->m_name; - classData.m_typeId = resultParameter->m_typeId; - classData.m_azRtti = resultParameter->m_azRtti; - - auto EventPlaceholderAnyCreator = [](AZ::SerializeContext*) -> AZStd::any - { - return AZStd::make_any(); - }; - serializeContext->RegisterType(resultParameter->m_typeId, AZStd::move(classData), EventPlaceholderAnyCreator); - + ScriptCanvas::ReflectEventTypeOnDemand(resultParameter->m_typeId, resultParameter->m_name, resultParameter->m_azRtti); } + nodePaletteModel.RegisterClassNode(categoryPath, behaviorClass ? behaviorClass->m_name : "", name, &method, &behaviorContext, propertyStatus, isOverloaded); } @@ -177,19 +166,8 @@ namespace // If the reflected method returns an AZ::Event, reflect it to the SerializeContext if (AZ::MethodReturnsAzEventByReferenceOrPointer(behaviorMethod)) { - AZ::SerializeContext* serializeContext{}; - AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); const AZ::BehaviorParameter* resultParameter = behaviorMethod.GetResult(); - AZ::SerializeContext::ClassData classData; - classData.m_name = resultParameter->m_name; - classData.m_typeId = resultParameter->m_typeId; - classData.m_azRtti = resultParameter->m_azRtti; - - auto EventPlaceholderAnyCreator = [](AZ::SerializeContext*) -> AZStd::any - { - return AZStd::make_any(); - }; - serializeContext->RegisterType(resultParameter->m_typeId, AZStd::move(classData), EventPlaceholderAnyCreator); + ScriptCanvas::ReflectEventTypeOnDemand(resultParameter->m_typeId, resultParameter->m_name, resultParameter->m_azRtti); } nodePaletteModel.RegisterMethodNode(behaviorContext, behaviorMethod); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp index c45dc01c35..1986eb653e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.cpp @@ -153,4 +153,22 @@ namespace ScriptCanvas grammarVersion = GrammarVersion::Current; runtimeVersion = RuntimeVersion::Current; } + + void ReflectEventTypeOnDemand(const AZ::TypeId& typeId, AZStd::string_view name, AZ::IRttiHelper* rttiHelper) + { + AZ::SerializeContext* serializeContext{}; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); + AZ::SerializeContext::ClassData classData; + classData.m_name = name.data(); + classData.m_typeId = typeId; + classData.m_azRtti = rttiHelper; + + auto EventPlaceholderAnyCreator = [](AZ::SerializeContext*) -> AZStd::any + { + return AZStd::make_any(); + }; + + serializeContext->RegisterType(typeId, AZStd::move(classData), EventPlaceholderAnyCreator); + } + } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h index 76542d6097..170e4c5acb 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Core.h @@ -279,6 +279,8 @@ namespace ScriptCanvas bool m_wasAdded = false; AZ::Entity* m_buildEntity = nullptr; }; + + void ReflectEventTypeOnDemand(const AZ::TypeId& typeId, AZStd::string_view name, AZ::IRttiHelper* rttiHelper = nullptr); } namespace AZStd diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp index 5bfb69b11e..37d6e2c35f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp @@ -6,12 +6,27 @@ * */ +#include #include #include #include using namespace ScriptCanvas; +namespace DatumSerializerCpp +{ + bool IsEventInput(const AZ::Uuid& inputType) + { + AZ::BehaviorContext* behaviorContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext); + AZ_Assert(behaviorContext, "Can't serialize data properly without checking the type, for which we need behavior context!"); + auto bcClassIter = behaviorContext->m_typeToClassMap.find(inputType); + return bcClassIter != behaviorContext->m_typeToClassMap.end() + && bcClassIter->second->m_azRtti + && bcClassIter->second->m_azRtti->GetGenericTypeId() == azrtti_typeid(); + } +} + namespace AZ { AZ_CLASS_ALLOCATOR_IMPL(DatumSerializer, SystemAllocator, 0); @@ -57,7 +72,7 @@ namespace AZ return context.Report ( JSR::Tasks::ReadField , JSR::Outcomes::Missing - , "DatumSerializer::Load failed to load the 'isNullPointer'' member"); + , "DatumSerializer::Load failed to load the 'isNullPointer' member"); } if (isNullPointerMember->value.GetBool()) @@ -159,11 +174,13 @@ namespace AZ , azrtti_typeidGetType())>() , context)); + // datum storage begin auto inputObjectSource = inputScriptDataPtr->GetAsDanger(); - outputValue.AddMember("isNullPointer", rapidjson::Value(inputObjectSource == nullptr), context.GetJsonAllocator()); + const bool isNullPointer = inputObjectSource == nullptr || DatumSerializerCpp::IsEventInput(inputScriptDataPtr->GetType().GetAZType()); + outputValue.AddMember("isNullPointer", rapidjson::Value(isNullPointer), context.GetJsonAllocator()); - if (inputObjectSource) + if (!isNullPointer) { rapidjson::Value typeValue; result.Combine(StoreTypeId(typeValue, inputScriptDataPtr->GetType().GetAZType(), context)); From 39cf45e54438c0f9472b549d43e464858c9ffb6e Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 14:46:50 -0700 Subject: [PATCH 060/355] Setting /permissive- to make MSVC more "standard" (#3701) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../PythonCoverageEditorSystemComponent.cpp | 2 +- .../AzCore/std/function/function_base.h | 7 +- .../AzCore/std/function/function_template.h | 2 +- .../AzCore/std/parallel/binary_semaphore.h | 4 +- .../internal/condition_variable_WinAPI.h | 4 +- Code/Framework/AzCore/Tests/AZStd/Hashed.cpp | 4 +- Code/Framework/AzCore/Tests/AZStd/Ordered.cpp | 4 +- .../Containers/Views/PairIteratorTests.cpp | 12 +++ .../TestImpactClientSequenceReport.h | 24 +++--- .../TestImpactFramework/TestImpactRepoPath.h | 10 +-- .../TestImpactWin32_TestTargetExtension.cpp | 4 +- .../RHI/DX12/Code/Source/RHI/CommandList.h | 2 + Gems/Blast/Code/Source/Family/DamageManager.h | 1 + Gems/PhysX/Code/Tests/PhysXJointsTest.cpp | 8 +- Gems/PhysX/Code/Tests/PhysXSceneTests.cpp | 2 +- .../Code/Source/Core/WhiteBoxToolApi.cpp | 74 ++++++++++--------- .../Common/MSVC/Configurations_msvc.cmake | 1 + 17 files changed, 94 insertions(+), 71 deletions(-) diff --git a/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp b/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp index ad6cf216d7..1528e09169 100644 --- a/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp +++ b/AutomatedTesting/Gem/PythonCoverage/Code/Source/PythonCoverageEditorSystemComponent.cpp @@ -17,7 +17,7 @@ namespace PythonCoverage { - static constexpr char* const LogCallSite = "PythonCoverageEditorSystemComponent"; + static constexpr const char* const LogCallSite = "PythonCoverageEditorSystemComponent"; void PythonCoverageEditorSystemComponent::Reflect(AZ::ReflectContext* context) { diff --git a/Code/Framework/AzCore/AzCore/std/function/function_base.h b/Code/Framework/AzCore/AzCore/std/function/function_base.h index b39a5cf81b..8ceba11239 100644 --- a/Code/Framework/AzCore/AzCore/std/function/function_base.h +++ b/Code/Framework/AzCore/AzCore/std/function/function_base.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #define AZSTD_FUNCTION_TARGET_FIX(x) @@ -591,8 +592,8 @@ namespace AZStd Internal::function_util::function_buffer type_result; type_result.type.type = aztypeid(Functor); - type_result.type.const_qualified = is_const::value; - type_result.type.volatile_qualified = is_volatile::value; + type_result.type.const_qualified = AZStd::is_const::value; + type_result.type.volatile_qualified = AZStd::is_volatile::value; vtable->manager(functor, type_result, Internal::function_util::check_functor_type_tag); return static_cast(type_result.obj_ptr); } @@ -608,7 +609,7 @@ namespace AZStd Internal::function_util::function_buffer type_result; type_result.type.type = aztypeid(Functor); type_result.type.const_qualified = true; - type_result.type.volatile_qualified = is_volatile::value; + type_result.type.volatile_qualified = AZStd::is_volatile::value; vtable->manager(functor, type_result, Internal::function_util::check_functor_type_tag); // GCC 2.95.3 gets the CV qualifiers wrong here, so we // can't do the static_cast that we should do. diff --git a/Code/Framework/AzCore/AzCore/std/function/function_template.h b/Code/Framework/AzCore/AzCore/std/function/function_template.h index 7f388c4006..8e389cb53d 100644 --- a/Code/Framework/AzCore/AzCore/std/function/function_template.h +++ b/Code/Framework/AzCore/AzCore/std/function/function_template.h @@ -359,7 +359,7 @@ namespace AZStd { functor.obj_ref.obj_ptr = (void*)&f.get(); functor.obj_ref.is_const_qualified = is_const::value; - functor.obj_ref.is_volatile_qualified = is_volatile::value; + functor.obj_ref.is_volatile_qualified = AZStd::is_volatile::value; return true; } else diff --git a/Code/Framework/AzCore/AzCore/std/parallel/binary_semaphore.h b/Code/Framework/AzCore/AzCore/std/parallel/binary_semaphore.h index f9d0cdbe4d..9496d7c18b 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/binary_semaphore.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/binary_semaphore.h @@ -70,11 +70,11 @@ namespace AZStd bool try_acquire_until(const chrono::time_point& abs_time) { auto timeNow = chrono::system_clock::now(); - if (timeNow >= absTime) + if (timeNow >= abs_time) { return false; // we timed out already! } - auto deltaTime = absTime - timeNow; + auto deltaTime = abs_time - timeNow; auto timeToTry = chrono::duration_cast(deltaTime); return (WaitForSingleObject(m_event, aznumeric_cast(timeToTry.count())) == AZ_WAIT_OBJECT_0); } diff --git a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h index 536144b814..4ac95139db 100644 --- a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h +++ b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h @@ -198,7 +198,7 @@ namespace AZStd AZ_FORCE_INLINE cv_status condition_variable_any::wait_for(Lock& lock, const chrono::duration& rel_time) { chrono::milliseconds toWait = rel_time; - EnterCriticalSection(&m_mutex); + EnterCriticalSection(static_cast(&m_mutex)); lock.unlock(); // We need to make sure we use CriticalSection based mutex. @@ -217,7 +217,7 @@ namespace AZStd returnCode = cv_status::timeout; } } - LeaveCriticalSection(&m_mutex); + LeaveCriticalSection(static_cast(&m_mutex)); lock.lock(); return returnCode; } diff --git a/Code/Framework/AzCore/Tests/AZStd/Hashed.cpp b/Code/Framework/AzCore/Tests/AZStd/Hashed.cpp index 4e4dfc1f89..b92dee44b6 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Hashed.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Hashed.cpp @@ -2100,8 +2100,8 @@ namespace UnitTest typename TypeParam::ContainerType container; container.emplace(-2352); container.emplace(3534); - container.emplace(1535408957); - container.emplace(3310556522); + container.emplace(535408957); + container.emplace(1310556522); container.emplace(55546193); container.emplace(1582); diff --git a/Code/Framework/AzCore/Tests/AZStd/Ordered.cpp b/Code/Framework/AzCore/Tests/AZStd/Ordered.cpp index 79abd71a70..ca7d5cba42 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Ordered.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Ordered.cpp @@ -1805,8 +1805,8 @@ namespace UnitTest typename TypeParam::ContainerType container; container.emplace(-2352); container.emplace(3534); - container.emplace(1535408957); - container.emplace(3310556522); + container.emplace(535408957); + container.emplace(1310556522); container.emplace(55546193); container.emplace(1582); diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/Containers/Views/PairIteratorTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/Containers/Views/PairIteratorTests.cpp index d80f54dfb5..2437d8557e 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/Containers/Views/PairIteratorTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/Containers/Views/PairIteratorTests.cpp @@ -19,6 +19,18 @@ #include #include +// This test gives trouble with /permissive-, the following instantiation workarounds the missing resolution +namespace std +{ + template<> + void iter_swap( + AZ::SceneAPI::Containers::Views::PairIterator lhs, + AZ::SceneAPI::Containers::Views::PairIterator rhs) + { + AZStd::iter_swap(lhs, rhs); + } +} + namespace AZ { namespace SceneAPI diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h index 1ddd1042e6..b39c2c8bcb 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h @@ -368,7 +368,7 @@ namespace TestImpact const AZStd::vector& draftedTestRuns, TestRunReport&& selectedTestRunReport, TestRunReport&& draftedTestRunReport) - : SequenceReportBase( + : SequenceReportBase ( type, maxConcurrency, testTargetTimeout, @@ -397,57 +397,57 @@ namespace TestImpact // SequenceReport overrides ... AZStd::chrono::milliseconds GetDuration() const override { - return SequenceReportBase::GetDuration() + m_draftedTestRunReport.GetDuration(); + return GetDuration() + m_draftedTestRunReport.GetDuration(); } TestSequenceResult GetResult() const override { - return CalculateMultiTestSequenceResult({ SequenceReportBase::GetResult(), m_draftedTestRunReport.GetResult() }); + return CalculateMultiTestSequenceResult({ GetResult(), m_draftedTestRunReport.GetResult() }); } size_t GetTotalNumTestRuns() const override { - return SequenceReportBase::GetTotalNumTestRuns() + m_draftedTestRunReport.GetTotalNumTestRuns(); + return GetTotalNumTestRuns() + m_draftedTestRunReport.GetTotalNumTestRuns(); } size_t GetTotalNumPassingTests() const override { - return SequenceReportBase::GetTotalNumPassingTests() + m_draftedTestRunReport.GetTotalNumPassingTests(); + return GetTotalNumPassingTests() + m_draftedTestRunReport.GetTotalNumPassingTests(); } size_t GetTotalNumFailingTests() const override { - return SequenceReportBase::GetTotalNumFailingTests() + m_draftedTestRunReport.GetTotalNumFailingTests(); + return GetTotalNumFailingTests() + m_draftedTestRunReport.GetTotalNumFailingTests(); } size_t GetTotalNumDisabledTests() const override { - return SequenceReportBase::GetTotalNumDisabledTests() + m_draftedTestRunReport.GetTotalNumDisabledTests(); + return GetTotalNumDisabledTests() + m_draftedTestRunReport.GetTotalNumDisabledTests(); } size_t GetTotalNumPassingTestRuns() const override { - return SequenceReportBase::GetTotalNumPassingTestRuns() + m_draftedTestRunReport.GetNumPassingTestRuns(); + return GetTotalNumPassingTestRuns() + m_draftedTestRunReport.GetNumPassingTestRuns(); } size_t GetTotalNumFailingTestRuns() const override { - return SequenceReportBase::GetTotalNumFailingTestRuns() + m_draftedTestRunReport.GetNumFailingTestRuns(); + return GetTotalNumFailingTestRuns() + m_draftedTestRunReport.GetNumFailingTestRuns(); } size_t GetTotalNumExecutionFailureTestRuns() const override { - return SequenceReportBase::GetTotalNumExecutionFailureTestRuns() + m_draftedTestRunReport.GetNumExecutionFailureTestRuns(); + return GetTotalNumExecutionFailureTestRuns() + m_draftedTestRunReport.GetNumExecutionFailureTestRuns(); } size_t GetTotalNumTimedOutTestRuns() const override { - return SequenceReportBase::GetTotalNumTimedOutTestRuns() + m_draftedTestRunReport.GetNumTimedOutTestRuns(); + return GetTotalNumTimedOutTestRuns() + m_draftedTestRunReport.GetNumTimedOutTestRuns(); } size_t GetTotalNumUnexecutedTestRuns() const override { - return SequenceReportBase::GetTotalNumUnexecutedTestRuns() + m_draftedTestRunReport.GetNumUnexecutedTestRuns(); + return GetTotalNumUnexecutedTestRuns() + m_draftedTestRunReport.GetNumUnexecutedTestRuns(); } private: AZStd::vector m_draftedTestRuns; diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactRepoPath.h b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactRepoPath.h index 86f4a98b78..e784c43500 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactRepoPath.h +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactRepoPath.h @@ -26,11 +26,11 @@ namespace TestImpact constexpr RepoPath() = default; constexpr RepoPath(const RepoPath&) = default; constexpr RepoPath(RepoPath&&) noexcept = default; - constexpr RepoPath::RepoPath(const string_type& path) noexcept; - constexpr RepoPath::RepoPath(const string_view_type& path) noexcept; - constexpr RepoPath::RepoPath(const value_type* path) noexcept; - constexpr RepoPath::RepoPath(const AZ::IO::PathView& path); - constexpr RepoPath::RepoPath(const AZ::IO::Path& path); + constexpr RepoPath(const string_type& path) noexcept; + constexpr RepoPath(const string_view_type& path) noexcept; + constexpr RepoPath(const value_type* path) noexcept; + constexpr RepoPath(const AZ::IO::PathView& path); + constexpr RepoPath(const AZ::IO::Path& path); RepoPath& operator=(const RepoPath&) noexcept = default; RepoPath& operator=(const string_type&) noexcept; diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Source/Platform/Windows/TestEngine/JobRunner/TestImpactWin32_TestTargetExtension.cpp b/Code/Tools/TestImpactFramework/Runtime/Code/Source/Platform/Windows/TestEngine/JobRunner/TestImpactWin32_TestTargetExtension.cpp index 57647bb118..68beae5a0a 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Source/Platform/Windows/TestEngine/JobRunner/TestImpactWin32_TestTargetExtension.cpp +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Source/Platform/Windows/TestEngine/JobRunner/TestImpactWin32_TestTargetExtension.cpp @@ -14,8 +14,8 @@ namespace TestImpact { AZStd::string GetTestTargetExtension(const TestTarget* testTarget) { - static constexpr char* const standAloneExtension = ".exe"; - static constexpr char* const testRunnerExtension = ".dll"; + static constexpr const char* const standAloneExtension = ".exe"; + static constexpr const char* const testRunnerExtension = ".dll"; switch (const auto launchMethod = testTarget->GetLaunchMethod(); launchMethod) { diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.h index b0c8642d68..443ab3e73a 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.h @@ -11,6 +11,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/Gems/Blast/Code/Source/Family/DamageManager.h b/Gems/Blast/Code/Source/Family/DamageManager.h index af7bae096b..f56bd7bbdf 100644 --- a/Gems/Blast/Code/Source/Family/DamageManager.h +++ b/Gems/Blast/Code/Source/Family/DamageManager.h @@ -9,6 +9,7 @@ #include #include +#include namespace Blast { diff --git a/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp b/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp index ac5a99e29a..3a7eac0884 100644 --- a/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp +++ b/Gems/PhysX/Code/Tests/PhysXJointsTest.cpp @@ -329,23 +329,23 @@ namespace PhysX if (auto* sceneInterface = AZ::Interface::Get()) { - jointHandle = sceneInterface->AddJoint(m_testSceneHandle, &jointConfiguration, m_parentBodyHandle, m_childBodyHandle); + jointHandle = sceneInterface->AddJoint(this->m_testSceneHandle, &jointConfiguration, this->m_parentBodyHandle, this->m_childBodyHandle); } EXPECT_NE(jointHandle, AzPhysics::InvalidJointHandle); // run physics to trigger the the move of parent body - TestUtils::UpdateScene(m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); + TestUtils::UpdateScene(this->m_testSceneHandle, AzPhysics::SystemConfiguration::DefaultFixedTimestep, 1); AZ::Vector3 childCurrentPos; if (auto* sceneInterface = AZ::Interface::Get()) { - auto* childBody = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, m_childBodyHandle); + auto* childBody = sceneInterface->GetSimulatedBodyFromHandle(this->m_testSceneHandle, this->m_childBodyHandle); childCurrentPos = childBody->GetPosition(); } - EXPECT_GT(childCurrentPos.GetX(), m_childInitialPos.GetX()); + EXPECT_GT(childCurrentPos.GetX(), this->m_childInitialPos.GetX()); } #endif // ENABLE_JOINTS_TYPED_TEST_CASE } diff --git a/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp b/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp index 7baaa34ab5..a4db2e9f0e 100644 --- a/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp +++ b/Gems/PhysX/Code/Tests/PhysXSceneTests.cpp @@ -171,7 +171,7 @@ namespace PhysX //invalid simulated body handle returns null nullBody = sceneInterface->GetSimulatedBodyFromHandle(AzPhysics::InvalidSceneHandle, AzPhysics::InvalidSimulatedBodyHandle); EXPECT_TRUE(nullBody == nullptr); - nullBody = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, AzPhysics::SimulatedBodyHandle(2347892348, 9)); + nullBody = sceneInterface->GetSimulatedBodyFromHandle(m_testSceneHandle, AzPhysics::SimulatedBodyHandle(1347892348, 9)); EXPECT_TRUE(nullBody == nullptr); //get 1 simulated body, should not be null. diff --git a/Gems/WhiteBox/Code/Source/Core/WhiteBoxToolApi.cpp b/Gems/WhiteBox/Code/Source/Core/WhiteBoxToolApi.cpp index 7e96c83810..afba511603 100644 --- a/Gems/WhiteBox/Code/Source/Core/WhiteBoxToolApi.cpp +++ b/Gems/WhiteBox/Code/Source/Core/WhiteBoxToolApi.cpp @@ -29,6 +29,46 @@ #include #include +namespace OpenMesh +{ + // Overload methods need to be declared before including OpenMesh so their definitions are found + + inline AZ::Vector3 normalize(const AZ::Vector3& v) + { + AZ::Vector3 vret = v; + vret.Normalize(); + return vret; + } + + inline float dot(const AZ::Vector3& v1, const AZ::Vector3& v2) + { + return v1.Dot(v2); + } + + inline float norm(const AZ::Vector3& v) + { + return v.GetLength(); + } + + inline AZ::Vector3 cross(const AZ::Vector3& v1, const AZ::Vector3& v2) + { + return v1.Cross(v2); + } + + inline AZ::Vector3 vectorize(AZ::Vector3& v, float s) + { + v = AZ::Vector3(s); + return v; + } + + inline void newell_norm(AZ::Vector3& n, const AZ::Vector3& a, const AZ::Vector3& b) + { + n.SetX(n.GetX() + (a.GetY() * b.GetZ())); + n.SetY(n.GetY() + (a.GetZ() * b.GetX())); + n.SetZ(n.GetZ() + (a.GetX() * b.GetY())); + } +} + // OpenMesh includes AZ_PUSH_DISABLE_WARNING(4702, "-Wunknown-warning-option") // OpenMesh\Core\Utils\Property.hh has unreachable code #include @@ -82,40 +122,6 @@ namespace OpenMesh } }; - inline AZ::Vector3 normalize(AZ::Vector3& v) - { - v.Normalize(); - return v; - } - - inline float dot(const AZ::Vector3& v1, const AZ::Vector3& v2) - { - return v1.Dot(v2); - } - - inline float norm(const AZ::Vector3& v) - { - return v.GetLength(); - } - - inline AZ::Vector3 cross(const AZ::Vector3& v1, const AZ::Vector3& v2) - { - return v1.Cross(v2); - } - - inline AZ::Vector3 vectorize(AZ::Vector3& v, float s) - { - v = AZ::Vector3(s); - return v; - } - - inline void newell_norm(AZ::Vector3& n, const AZ::Vector3& a, const AZ::Vector3& b) - { - n.SetX(n.GetX() + (a.GetY() * b.GetZ())); - n.SetY(n.GetY() + (a.GetZ() * b.GetX())); - n.SetZ(n.GetZ() + (a.GetX() * b.GetY())); - } - template<> inline void vector_cast(const AZ::Vector3& src, OpenMesh::Vec3f& dst, GenProg::Int2Type<3> /*unused*/) { diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index 7c7120fe15..647ced54a2 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -33,6 +33,7 @@ ly_append_configurations_options( /nologo # Suppress Copyright and version number message /W4 # Warning level 4 /WX # Warnings as errors + /permissive- # Conformance with standard # Disabling some warnings /wd4201 # nonstandard extension used: nameless struct/union. This actually became part of the C++11 std, MS has an open issue: https://developercommunity.visualstudio.com/t/warning-level-4-generates-a-bogus-warning-c4201-no/103064 From 37e5ef29bba8a5e7fd310dd17a8938589d9f2396 Mon Sep 17 00:00:00 2001 From: Jonny Galloway Date: Tue, 31 Aug 2021 16:50:07 -0500 Subject: [PATCH 061/355] Atom/gallowj/color grading dev (#3751) * color grading workflow assets, python scripts, ~and test data for Nuke and PS. Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * minor changes Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * pep8 reformate code style, clean up, address CR Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * Pep8 refactor, some DRY refactoring. Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * simplification write_azasset() Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * corrected code and further simplified () Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * updated readme.txt, I was mistakenly converting the wrong lut to engine Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * refactoring, simplification and some re-org Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * fixed bad loop in old_lut_helper Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * improve the lut_helper and corrected lut shaping Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * skip non-digit metadata in 3DL files Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * file name fix Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * nit: renamed a tag in comment Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * style Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * cleanup, cmd readme Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * fixed WINGHOME Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * Updated the readme with basic instructions Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * fixed py bootstrapping errors Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * removed log file (shouldn't be there) Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * re-gen bad test lut (forgot) Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * simplify bootstrap, enhance initialize and oiio access, remove lrg .PSD files Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * bump py rev2 in bat files for colorgrading Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> * removed debug flag not used, caused failure Signed-off-by: Jonny Gallowy <~gallowj@amazon.com> Co-authored-by: Jonny Gallowy <~gallowj@amazon.com> --- .../Editor/Scripts/ColorGrading/__init__.py | 20 ++ .../ColorGrading/exr_to_3dl_azasset.py | 17 +- .../ColorGrading/from_3dl_to_azasset.py | 17 +- .../Editor/Scripts/ColorGrading/initialize.py | 83 ++++--- .../Scripts/ColorGrading/lut_compositor.py | 105 ++++---- .../Editor/Scripts/ColorGrading/lut_helper.py | 17 +- .../Common/Editor/Scripts/bootstrap.py | 31 +-- .../Nuke_Test_Extreme_Grade.nk~ | 232 ------------------ .../Shot_post_test-extreme-grade.exr | 3 - .../HDR/Test_Grade/Shot_post_test-grade.exr | 3 - .../Nuke/HDR/Test_Grade/Test-Grade.nk~ | 227 ----------------- .../Photoshop/Log2-48nits/CLT_grade.psd | 3 - .../LUT_layer_composite_hue-sat_grade.psd | 3 - .../cmdline/CMD_ColorGradingTools.bat | 2 +- .../Tools/ColorGrading/cmdline/Env_Python.bat | 14 +- .../ColorGrading/cmdline/Env_WingIDE.bat | 4 - .../cmdline/Launch_WingIDE-7-1.bat | 3 - .../cmdline/User_Env.bat.template | 9 +- 18 files changed, 148 insertions(+), 645 deletions(-) delete mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ delete mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr delete mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr delete mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ delete mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd delete mode 100644 Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py index af73f82b8d..d500d6e09c 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/__init__.py @@ -76,6 +76,7 @@ DCCSI_GDEBUG = env_bool('DCCSI_GDEBUG', False) DCCSI_DEV_MODE = env_bool('DCCSI_DEV_MODE', False) DCCSI_GDEBUGGER = env_bool('DCCSI_GDEBUGGER', False) DCCSI_LOGLEVEL = env_bool('DCCSI_LOGLEVEL', int(20)) +DCCSI_WING_VERSION_MAJOR = env_bool('DCCSI_WING_VERSION_MAJOR', '7') # ------------------------------------------------------------------------- @@ -162,6 +163,25 @@ _LOGGER.debug('Invoking __init__.py for {0}.'.format({_PACKAGENAME})) # ------------------------------------------------------------------------- +def get_datadir() -> pathlib.Path: + """ + persistent application data. + # linux: ~/.local/share + # macOS: ~/Library/Application Support + # windows: C:/Users//AppData/Roaming + """ + + home = pathlib.Path.home() + + if sys.platform == "win32": + return home / "AppData/Roaming" + elif sys.platform == "linux": + return home / ".local/share" + elif sys.platform == "darwin": + return home / "Library/Application Support" +# ------------------------------------------------------------------------- + + # ------------------------------------------------------------------------- def makedirs(folder, *args, **kwargs): """a makedirs for py2.7 support""" diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py index 9166ef5a44..6c2aa1d5bb 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py @@ -27,18 +27,17 @@ import numpy as np # ------------------------------------------------------------------------ _MODULENAME = 'ColorGrading.exr_to_3dl_azasset' -import ColorGrading.initialize -ColorGrading.initialize.start() - _LOGGER = _logging.getLogger(_MODULENAME) _LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) -try: - import OpenImageIO as oiio - pass -except ImportError as e: - _LOGGER.error(f"invalid import: {e}") - sys.exit(1) +import ColorGrading.initialize +if ColorGrading.initialize.start(): + try: + import OpenImageIO as oiio + pass + except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) # ------------------------------------------------------------------------ diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py index e61ca33710..ba37994e63 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py @@ -18,18 +18,17 @@ import logging as _logging # ------------------------------------------------------------------------ _MODULENAME = 'ColorGrading.from_3dl_to_azasset' -import ColorGrading.initialize -ColorGrading.initialize.start() - _LOGGER = _logging.getLogger(_MODULENAME) _LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) -try: - import OpenImageIO as oiio - pass -except ImportError as e: - _LOGGER.error(f"invalid import: {e}") - sys.exit(1) +import ColorGrading.initialize +if ColorGrading.initialize.start(): + try: + import OpenImageIO as oiio + pass + except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) # ------------------------------------------------------------------------ diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py index 536c10ed05..ac64ade322 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/initialize.py @@ -17,13 +17,10 @@ from pathlib import Path import logging as _logging # local imports -from ColorGrading import env_bool from ColorGrading import initialize_logger from ColorGrading import DCCSI_GDEBUG from ColorGrading import DCCSI_DEV_MODE -from ColorGrading import DCCSI_GDEBUGGER from ColorGrading import DCCSI_LOGLEVEL -from ColorGrading import FRMT_LOG_LONG __all__ = ['start'] @@ -44,15 +41,21 @@ _LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) # connect to the debugger if DCCSI_DEV_MODE: - APP_DATA_WING = Path('C:/Users/gallowj/AppData/Roaming/Wing Pro 7') - APP_DATA_WING.resolve() - site.addsitedir(pathlib.PureWindowsPath(APP_DATA_WING).as_posix()) - import wingdbstub as debugger - try: - debugger.Ensure() - _LOGGER.info("Wing debugger attached") - except Exception as e: - _LOGGER.debug('Can not attach Wing debugger (running in IDE already?)') + from ColorGrading import DCCSI_WING_VERSION_MAJOR + from ColorGrading import get_datadir + APPDATA = get_datadir() # os APPDATA + APPDATA_WING = Path(APPDATA, f"Wing Pro {DCCSI_WING_VERSION_MAJOR}").resolve() + if APPDATA_WING.exists(): + site.addsitedir(pathlib.PureWindowsPath(APPDATA_WING).as_posix()) + import wingdbstub as debugger + try: + debugger.Ensure() + _LOGGER.info("Wing debugger attached") + except Exception as e: + _LOGGER.debug('Can not attach Wing debugger (running in IDE already?)') + else: + _LOGGER.warning("Path envar doesn't exist: APPDATA_WING") + _LOGGER.info(f"Pattern: {APPDATA_WING}") # ------------------------------------------------------------------------ @@ -60,28 +63,16 @@ if DCCSI_DEV_MODE: def start(): """set up access to OpenImageIO, within o3de or without""" # ------------------------------------------------------------------------ + running_editor = None try: # running in o3de import azlmbr - - _O3DE_DEV = Path(os.getenv('O3DE_DEV', Path(azlmbr.paths.engroot))) - os.environ['O3DE_DEV'] = pathlib.PureWindowsPath(_O3DE_DEV).as_posix() - _LOGGER.debug(_O3DE_DEV) - - _O3DE_BIN_PATH = Path(str(_O3DE_DEV),Path(azlmbr.paths.executableFolder)) - - _O3DE_BIN = Path(os.getenv('O3DE_BIN', _O3DE_BIN_PATH.resolve())) - os.environ['O3DE_BIN'] = pathlib.PureWindowsPath(_O3DE_BIN).as_posix() - - _LOGGER.debug(_O3DE_BIN) - - site.addsitedir(_O3DE_BIN) + running_editor = True except Exception as e: # running external, start this module from: - # "C:\Depot\o3de-engine\Gems\Atom\Feature\Common\Tools\ColorGrading\cmdline\CMD_ColorGradinTools.bat" - pass - + # "C:\Depot\o3de-engine\Gems\Atom\Feature\Common\Tools\ColorGrading\cmdline\CMD_ColorGradingTools.bat" + try: _O3DE_DEV = Path(os.getenv('O3DE_DEV')) _O3DE_DEV = _O3DE_DEV.resolve() @@ -102,15 +93,32 @@ def start(): except EnvironmentError as e: _LOGGER.error('O3DE bin folder not set or found') raise e -# ------------------------------------------------------------------------ + + if running_editor: + _O3DE_DEV = Path(os.getenv('O3DE_DEV', Path(azlmbr.paths.engroot))) + os.environ['O3DE_DEV'] = pathlib.PureWindowsPath(_O3DE_DEV).as_posix() + _LOGGER.debug(_O3DE_DEV) + + _O3DE_BIN_PATH = Path(str(_O3DE_DEV),Path(azlmbr.paths.executableFolder)) + + _O3DE_BIN = Path(os.getenv('O3DE_BIN', _O3DE_BIN_PATH.resolve())) + os.environ['O3DE_BIN'] = pathlib.PureWindowsPath(_O3DE_BIN).as_posix() + + _LOGGER.debug(_O3DE_BIN) + + site.addsitedir(_O3DE_BIN) - -# ------------------------------------------------------------------------ -try: - import OpenImageIO as OpenImageIO -except ImportError as e: - _LOGGER.error(f"invalid import: {e}") - sys.exit(1) + # test access to oiio + if os.name == 'nt': + try: + import OpenImageIO as oiio + return True + except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + pass + else: + _LOGGER.info("Non-Windows platforms not yet supported...") + return False # ------------------------------------------------------------------------ @@ -120,4 +128,5 @@ except ImportError as e: if __name__ == '__main__': """Run this file as main""" - start() \ No newline at end of file + oiio_exists = start() + _LOGGER.debug(f"Import OpenImageIO performed: {oiio_exists}") \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py index 74ba44dc27..75c21a31c4 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_compositor.py @@ -11,42 +11,23 @@ import sys import os -import site import argparse -import math -import pathlib -from pathlib import Path import logging as _logging -from env_bool import env_bool # ------------------------------------------------------------------------ _MODULENAME = 'ColorGrading.lut_compositor' -# set these true if you want them set globally for debugging -_DCCSI_GDEBUG = env_bool('DCCSI_GDEBUG', False) -_DCCSI_DEV_MODE = env_bool('DCCSI_DEV_MODE', False) -_DCCSI_GDEBUGGER = env_bool('DCCSI_GDEBUGGER', False) -_DCCSI_LOGLEVEL = env_bool('DCCSI_LOGLEVEL', int(20)) - -if _DCCSI_GDEBUG: - _DCCSI_LOGLEVEL = int(10) - -FRMT_LOG_LONG = "[%(name)s][%(levelname)s] >> %(message)s (%(asctime)s; %(filename)s:%(lineno)d)" -_logging.basicConfig(level=_DCCSI_LOGLEVEL, - format=FRMT_LOG_LONG, - datefmt='%m-%d %H:%M') _LOGGER = _logging.getLogger(_MODULENAME) _LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) import ColorGrading.initialize -ColorGrading.initialize.start() - -try: - import OpenImageIO as oiio - pass -except ImportError as e: - _LOGGER.error(f"invalid import: {e}") - sys.exit(1) +if ColorGrading.initialize.start(): + try: + import OpenImageIO as oiio + pass + except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) # ------------------------------------------------------------------------ operations = {"composite": 0, "extract": 1} @@ -62,49 +43,49 @@ args = parser.parse_args() op = operations.get(args.op, invalidOp) if op == invalidOp: - print("invalid operation") + _LOGGER.warning("invalid operation") sys.exit(1) elif op == 0: if args.l is None: - print("no LUT file specified") + _LOGGER.warning("no LUT file specified") sys.exit() # read in the input image -inBuf = oiio.ImageBuf(args.i) -inSpec = inBuf.spec() -print("Input resolution is ", inBuf.spec().width, " x ", inBuf.spec().height) +image_buffer = oiio.ImageBuf(args.i) +image_spec = image_buffer.spec() +_LOGGER.info("Input resolution is ", image_buffer.spec().width, " x ", image_buffer.spec().height) if op == 0: - outFileName = args.o - print("writing %s..." % (outFileName)) - lutBuf = oiio.ImageBuf(args.l) - lutSpec = lutBuf.spec() - print("Resolution is ", lutBuf.spec().width, " x ", lutBuf.spec().height) - if lutSpec.width != lutSpec.height*lutSpec.height: - print("invalid input file dimensions. Expect lengthwise LUT with dimension W: s*s X H: s, where s is the size of the LUT") + out_file_name = args.o + _LOGGER.info("writing %s..." % (out_file_name)) + lut_buffer = oiio.ImageBuf(args.l) + lut_spec = lut_buffer.spec() + _LOGGER.info("Resolution is ", lut_buffer.spec().width, " x ", lut_buffer.spec().height) + if lut_spec.width != lut_spec.height*lut_spec.height: + _LOGGER.warning("invalid input file dimensions. Expect lengthwise LUT with dimension W: s*s X H: s, where s is the size of the LUT") sys.exit(1) - lutSize = lutSpec.height - outSpec = oiio.ImageSpec(inSpec.width, inSpec.height, 3, oiio.TypeFloat) - outBuf = oiio.ImageBuf(outSpec) - outBuf.write(outFileName) - for y in range(outBuf.ybegin, outBuf.yend): - for x in range(outBuf.xbegin, outBuf.xend): - srcPx = inBuf.getpixel(x, y) - dstPx = (srcPx[0], srcPx[1], srcPx[2]) - if y < lutSpec.height and x < lutSpec.width: - lutPx = lutBuf.getpixel(x, y) - dstPx = (lutPx[0], lutPx[1], lutPx[2]) - outBuf.setpixel(x, y, dstPx) - outBuf.write(outFileName) + lut_size = lut_spec.height + out_image_spec = oiio.ImageSpec(image_spec.width, image_spec.height, 3, oiio.TypeFloat) + out_image_buffer = oiio.ImageBuf(out_image_spec) + out_image_buffer.write(out_file_name) + for y in range(out_image_buffer.ybegin, out_image_buffer.yend): + for x in range(out_image_buffer.xbegin, out_image_buffer.xend): + src_pixel = image_buffer.getpixel(x, y) + dst_pixel = (src_pixel[0], src_pixel[1], src_pixel[2]) + if y < lut_spec.height and x < lut_spec.width: + lut_pixel = lut_buffer.getpixel(x, y) + dst_pixel = (lut_pixel[0], lut_pixel[1], lut_pixel[2]) + out_image_buffer.setpixel(x, y, dst_pixel) + out_image_buffer.write(out_file_name) elif op == 1: - outFileName = args.o - print("writing %s..." % (outFileName)) - lutSize = args.s - lutSpec = oiio.ImageSpec(lutSize*lutSize, lutSize, 3, oiio.TypeFloat) - lutBuf = oiio.ImageBuf(lutSpec) - for y in range(lutBuf.ybegin, lutBuf.yend): - for x in range(lutBuf.xbegin, lutBuf.xend): - srcPx = inBuf.getpixel(x, y) - dstPx = (srcPx[0], srcPx[1], srcPx[2]) - lutBuf.setpixel(x, y, dstPx) - lutBuf.write(outFileName) \ No newline at end of file + out_file_name = args.o + _LOGGER.info("writing %s..." % (out_file_name)) + lut_size = args.s + lut_spec = oiio.ImageSpec(lut_size*lut_size, lut_size, 3, oiio.TypeFloat) + lut_buffer = oiio.ImageBuf(lut_spec) + for y in range(lut_buffer.ybegin, lut_buffer.yend): + for x in range(lut_buffer.xbegin, lut_buffer.xend): + src_pixel = image_buffer.getpixel(x, y) + dst_pixel = (src_pixel[0], src_pixel[1], src_pixel[2]) + lut_buffer.setpixel(x, y, dst_pixel) + lut_buffer.write(out_file_name) \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py index 459fe241fa..da774ffd1a 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/lut_helper.py @@ -23,18 +23,17 @@ from pathlib import Path # ------------------------------------------------------------------------ _MODULENAME = 'ColorGrading.lut_helper' -import ColorGrading.initialize -ColorGrading.initialize.start() - _LOGGER = _logging.getLogger(_MODULENAME) _LOGGER.debug('Initializing: {0}.'.format({_MODULENAME})) -try: - import OpenImageIO as oiio - pass -except ImportError as e: - _LOGGER.error(f"invalid import: {e}") - sys.exit(1) +import ColorGrading.initialize +if ColorGrading.initialize.start(): + try: + import OpenImageIO as oiio + pass + except ImportError as e: + _LOGGER.error(f"invalid import: {e}") + sys.exit(1) # ------------------------------------------------------------------------ diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py b/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py index 0070611592..90dfe6de8f 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/bootstrap.py @@ -13,48 +13,19 @@ Example: color grading related scripts """ # ------------------------------------------------------------------------ # standard imports -import sys import os import inspect -import pathlib import site from pathlib import Path -import logging as _logging # ------------------------------------------------------------------------ _MODULENAME = 'Gems.Atom.Feature.Common.bootstrap' -# print (inspect.getfile(inspect.currentframe()) # script filename (usually with path) # script directory _MODULE_PATH = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) _MODULE_PATH = Path(_MODULE_PATH) site.addsitedir(_MODULE_PATH.resolve()) -from ColorGrading import env_bool from ColorGrading import initialize_logger -from ColorGrading import DCCSI_GDEBUG -from ColorGrading import DCCSI_DEV_MODE -from ColorGrading import DCCSI_LOGLEVEL - -if DCCSI_GDEBUG: - DCCSI_LOGLEVEL = int(10) - -_LOGGER = initialize_logger(_MODULENAME, log_to_file=False, default_log_level=DCCSI_LOGLEVEL) -_LOGGER.info('Initializing: {0}.'.format({_MODULENAME})) +_LOGGER = initialize_logger(_MODULENAME, log_to_file=False) _LOGGER.info(f'site.addsitedir({_MODULE_PATH.resolve()})') - -# early connect to the debugger -if DCCSI_DEV_MODE: - APP_DATA_WING = Path('C:/Users/gallowj/AppData/Roaming/Wing Pro 7') - APP_DATA_WING.resolve() - site.addsitedir(pathlib.PureWindowsPath(APP_DATA_WING).as_posix()) - import wingdbstub as debugger - try: - debugger.Ensure() - _LOGGER.info("Wing debugger attached") - except Exception as e: - _LOGGER.debug('Can not attach Wing debugger (running in IDE already?)') - - -from ColorGrading.initialize import start -start() # ------------------------------------------------------------------------ \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ deleted file mode 100644 index a7c1f478b2..0000000000 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk~ +++ /dev/null @@ -1,232 +0,0 @@ -#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx -version 13.0 v3 -define_window_layout_xml { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} -Root { - inputs 0 - name C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Nuke_Test_Extreme_Grade.nk - project_directory "\"C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/" - format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" - proxy_type scale - proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" - colorManagement OCIO - OCIO_config aces_1.0.3 - defaultViewerLUT "OCIO LUTs" - workingSpaceLUT scene_linear - monitorLut ACES/Rec.709 - monitorOutLUT "sRGB (ACES)" - int8Lut matte_paint - int16Lut texture_paint - logLut compositing_log - floatLut scene_linear -} -Read { - inputs 0 - file_type exr - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr - format "1024 32 0 0 1024 32 1 " - origset true - colorspace data - name Read_Linear_LUT_32 - xpos -846 - ypos 10 -} -set Ncf69800 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer1 - xpos -847 - ypos 135 -} -push $Ncf69800 -OCIOFileTransform { - file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d - working_space scene_linear - name Log2_48_nits_Shaper_to_linear - xpos -710 - ypos 46 -} -set Ncf69000 [stack 0] -Transform { - center {1024 778} - name Transform_Position_LUT - xpos -579 - ypos 3 -} -set Ncf68c00 [stack 0] -Read { - inputs 0 - file_type exr - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr - format "2802 1854 0 0 2802 1854 1 " - origset true - name Read_DisplayMapperPassthrough - xpos -577 - ypos -119 -} -ZMerge { - inputs 2 - name ZMerge_Combine - xpos -413 - ypos -83 -} -set Ncef7c00 [stack 0] -HueShift { - ingray 0.136 - outgray 0.31 - saturation 2 - color_saturation 0.3 - hue_rotation -150 - brightness 0.81 - name HueShift1 - xpos -256 - ypos -83 -} -set Ncef7800 [stack 0] -OCIOCDLTransform { - saturation 1.23 - working_space scene_linear - name INV_Log2_48_nits_Shaper_to_linear - xpos -86 - ypos -83 -} -set Ncef7400 [stack 0] -Crop { - box {0 0 1024 32} - reformat true - crop false - name Crop1 - xpos -86 - ypos 32 -} -set Ncef7000 [stack 0] -OCIOFileTransform { - file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d - direction inverse - working_space reference - name OCIOFileTransform2 - xpos 84 - ypos 32 -} -Write { - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/test-extreme-grade_inv-Log2-48nits_32_LUT.exr - colorspace data - raw true - file_type exr - write_ACES_compliant_EXR true - datatype "32 bit float" - first_part rgba - version 8 - name Write_RAW_LUT - xpos 242 - ypos 20 -} -Viewer { - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer7 - xpos 242 - ypos 135 -} -push $Ncef7400 -Write { - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-extreme-grade.exr - colorspace compositing_linear - file_type exr - write_ACES_compliant_EXR true - datatype "32 bit float" - first_part rgba - version 7 - name Write_Shot_Grade_Comp - xpos 353 - ypos -95 -} -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer8 - xpos 357 - ypos 135 -} -push $Ncf69000 -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer2 - xpos -710 - ypos 137 -} -push $Ncf68c00 -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer3 - xpos -579 - ypos 135 -} -push $Ncef7c00 -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer4 - xpos -413 - ypos 133 -} -push $Ncef7800 -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer5 - xpos -254 - ypos 133 -} -push $Ncef7000 -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer6 - xpos -86 - ypos 134 -} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr deleted file mode 100644 index f9235dac3a..0000000000 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Extreme_Grade/Shot_post_test-extreme-grade.exr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ea4288b55725bfa89d7add69ea45b0ac9315cfffd6acfba66082f4d21c1ac1a -size 31227624 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr deleted file mode 100644 index 49e0460826..0000000000 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Shot_post_test-grade.exr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ff499c054a259a3cd389b613382066f258287215f61da56115b3e958733dbe6 -size 31227639 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ deleted file mode 100644 index 084ba1495d..0000000000 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk~ +++ /dev/null @@ -1,227 +0,0 @@ -#! C:/Program Files/Nuke13.0v3/nuke-13.0.3.dll -nx -version 13.0 v3 -define_window_layout_xml { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -} -Root { - inputs 0 - name C:/Depot/o3de/Gems/Atom/Feature/Common/Assets/ColorGrading/TestData/Nuke/HDR/Test_Grade/Test-Grade.nk - project_directory "\"C:/Depot/o3de-engine/Gems/AtomLyIntegration/CommonFeatures/Tools/ColorGrading/TestData/Nuke/" - format "2048 1556 0 0 2048 1556 1 2K_Super_35(full-ap)" - proxy_type scale - proxy_format "1024 778 0 0 1024 778 1 1K_Super_35(full-ap)" - colorManagement OCIO - OCIO_config aces_1.0.3 - defaultViewerLUT "OCIO LUTs" - workingSpaceLUT scene_linear - monitorLut ACES/Rec.709 - monitorOutLUT "sRGB (ACES)" - int8Lut matte_paint - int16Lut texture_paint - logLut compositing_log - floatLut scene_linear -} -Read { - inputs 0 - file_type exr - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/LUTs/linear_32_LUT.exr - format "1024 32 0 0 1024 32 1 " - origset true - colorspace data - raw true - name Read_Linear_LUT_32 - xpos -846 - ypos 10 -} -set N3bfa9800 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer1 - xpos -846 - ypos 135 -} -push $N3bfa9800 -OCIOFileTransform { - file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d - working_space rendering - name Log2_48_nits_Shaper_to_linear - xpos -710 - ypos 46 -} -set N3bfa9000 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer2 - xpos -710 - ypos 137 -} -push $N3bfa9000 -Transform { - center {1024 778} - name Transform_Position_LUT - xpos -579 - ypos 3 -} -set N3bfa8c00 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer3 - xpos -579 - ypos 135 -} -push $N3bfa8c00 -Read { - inputs 0 - file_type exr - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/displaymapperpassthrough.exr - format "2802 1854 0 0 2802 1854 1 " - origset true - name Read_DisplayMapperPassthrough - xpos -580 - ypos -146 -} -ZMerge { - inputs 2 - name ZMerge_Combine - xpos -413 - ypos -83 -} -set N3bf5bc00 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer4 - xpos -413 - ypos 128 -} -push $N3bf5bc00 -HueShift { - ingray {0.18 0.18 0.18} - outgray {0.18 0.18 0.18} - saturation 1.26 - color {0.12 0.12 0.12} - color_saturation 0.78 - hue_rotation -150 - brightness 0.74 - name HueShift1 - xpos -256 - ypos -83 -} -set N3bf5b800 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer5 - xpos -256 - ypos 130 -} -push $N3bf5b800 -Crop { - box {0 0 1024 32} - reformat true - crop false - name Crop1 - xpos -86 - ypos 32 -} -set N3bf5ac00 [stack 0] -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer6 - xpos -86 - ypos 134 -} -push $N3bf5b800 -Write { - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/Nuke_Shot_post_grade.exr - colorspace compositing_linear - file_type exr - write_ACES_compliant_EXR true - datatype "32 bit float" - first_part rgba - version 10 - name Write_Shot_Grade_Comp - selected true - xpos 353 - ypos -95 -} -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer8 - xpos 353 - ypos 135 -} -push $N3bf5ac00 -OCIOFileTransform { - file C:/Depot/o3de-engine/Tools/ColorGrading/OpenColorIO-Configs/aces_1.0.3/luts/Log2_48_nits_Shaper_to_linear.spi1d - direction inverse - working_space data - name invLog2_48_nits_Shaper_to_linear - xpos 74 - ypos -14 -} -Write { - file C:/Depot/o3de/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.exr - colorspace data - file_type exr - datatype "32 bit float" - first_part rgba - version 10 - name Write_RAW_LUT - xpos 242 - ypos 20 -} -Viewer { - frame 1 - frame_range 1-100 - viewerProcess "sRGB (ACES)" - name Viewer7 - xpos 242 - ypos 135 -} diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd deleted file mode 100644 index 3718e0facf..0000000000 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/CLT_grade.psd +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0276e1d329cda3514f46a55fd1d3ce90fce617814198ab69d234f2c58c15882 -size 98742272 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd deleted file mode 100644 index 82eca8b3cc..0000000000 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Photoshop/Log2-48nits/LUT_layer_composite_hue-sat_grade.psd +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce91088eaa54afab608bfcea6ab4009cbb3027cb83c76710a46470144e7d799d -size 98638424 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat index 2c5809ec15..c655eb2e6c 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat @@ -24,7 +24,7 @@ PUSHD %~dp0 SETLOCAL ENABLEDELAYEDEXPANSION :: if the user has set up a custom env call it -IF EXIST "%~dp0User_env.bat" CALL %~dp0User_env.bat +IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat :: Initialize env CALL %~dp0\Env_Core.bat diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat index 83b7382dc6..fc4afc964e 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Python.bat @@ -20,8 +20,6 @@ PUSHD %~dp0 CALL %~dp0\Env_Core.bat -::SETLOCAL ENABLEDELAYEDEXPANSION - echo. echo _____________________________________________________________________ echo. @@ -67,11 +65,14 @@ echo DCCSI_PY_BASE = %DCCSI_PY_BASE% :: ide and debugger plug set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% -set DCCSI_PY_IDE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python +IF "%DCCSI_PY_REV%"=="" (set DCCSI_PY_REV=rev2) +IF "%DCCSI_PY_PLATFORM%"=="" (set DCCSI_PY_PLATFORM=windows) + +set DCCSI_PY_IDE=%DCCSI_PYTHON_INSTALL%\runtime\python-%DCCSI_PY_VERSION_MAJOR%.%DCCSI_PY_VERSION_MINOR%.%DCCSI_PY_VERSION_RELEASE%-%DCCSI_PY_REV%-%DCCSI_PY_PLATFORM%\python echo DCCSI_PY_IDE = %DCCSI_PY_IDE% :: Wing and other IDEs probably prefer access directly to the python.exe -set DCCSI_PY_EXE=%DCCSI_PYTHON_INSTALL%\runtime\python-3.7.10-rev1-windows\python\python.exe +set DCCSI_PY_EXE=%DCCSI_PY_IDE%\python.exe echo DCCSI_PY_EXE = %DCCSI_PY_EXE% set DCCSI_PY_IDE_PACKAGES=%DCCSI_PY_IDE%\Lib\site-packages @@ -90,7 +91,10 @@ SET PATH=%DCCSI_PYTHON_INSTALL%;%DCCSI_PY_IDE%;%DCCSI_PY_IDE_PACKAGES%;%DCCSI_PY set PYTHONPATH=%DCCSIG_PATH%;%DCCSI_PYTHON_LIB_PATH%;%O3DE_BIN_PATH%;%DCCSI_COLORGRADING_SCRIPTS%;%DCCSI_FEATURECOMMON_SCRIPTS%;%PYTHONPATH% echo PYTHONPATH = %PYTHONPATH% -::ENDLOCAL +:: used for debugging in WingIDE (but needs to be here) +IF "%TAG_USERNAME%"=="" (set TAG_USERNAME=NOT_SET) +echo TAG_USERNAME = %TAG_USERNAME% +IF "%TAG_USERNAME%"=="NOT_SET" (echo Add TAG_USERNAME to User_Env.bat) :: Set flag so we don't initialize dccsi environment twice SET O3DE_ENV_PY_INIT=1 diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat index 4c297f53a9..29982db4f1 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_WingIDE.bat @@ -38,8 +38,6 @@ set DCCSI_PY_DEFAULT=%DCCSI_PY_IDE%\python.exe set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %DCCSI_WING_VERSION_MAJOR%.%DCCSI_WING_VERSION_MINOR% IF "%WING_PROJ%"=="" (set WING_PROJ=%O3DE_PROJECT_PATH%\.solutions\.wing\o3de_color_grading_%DCCSI_WING_VERSION_MAJOR%x.wpr) -::SETLOCAL ENABLEDELAYEDEXPANSION - echo. echo _____________________________________________________________________ echo. @@ -55,8 +53,6 @@ echo WING_PROJ = %WING_PROJ% :: add to the PATH SET PATH=%WINGHOME%;%PATH% -::ENDLOCAL - :: Set flag so we don't initialize dccsi environment twice SET DCCSI_ENV_WINGIDE_INIT=1 GOTO END_OF_FILE diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat index 93f5fb7fa6..15d31b2074 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Launch_WingIDE-7-1.bat @@ -73,9 +73,6 @@ echo DCCSI_PY_BASE = %DCCSI_PY_BASE% set DCCSI_PY_DEFAULT=%DCCSI_PY_BASE% echo DCCSI_PY_DEFAULT = %DCCSI_PY_DEFAULT% -:: if the user has set up a custom env call it -IF EXIST "%~dp0User_Dev.bat" CALL %~dp0User_Dev.bat - echo. :: Change to root dir diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template index 558505f80f..81a53393cf 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template @@ -19,17 +19,16 @@ IF "%O3DE_USER_ENV_INIT%"=="1" GOTO :END_OF_FILE cd %~dp0 PUSHD %~dp0 -SETLOCAL ENABLEDELAYEDEXPANSION - SET O3DE_DEV=C:\Depot\o3de-engine ::SET OCIO_APPS=C:\Depot\o3de-engine\Tools\ColorGrading\ocio\build\src\apps SET TAG_LY_BUILD_PATH=build SET DCCSI_GDEBUG=True SET DCCSI_DEV_MODE=True -SET WING_PROJ=%O3DE_PROJECT_PATH%\.solutions\.wing\o3de_color_grading_%DCCSI_WING_VERSION_MAJOR%x.wpr - -::ENDLOCAL +:: set the your user name here for windows path +SET TAG_USERNAME=< not set > +SET DCCSI_PY_REV=rev1 +SET DCCSI_PY_PLATFORM=windows :: Set flag so we don't initialize dccsi environment twice SET O3DE_USER_ENV_INIT=1 From 4e699138b8033b63843d6814d819786c2fd05e86 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 16:46:02 -0700 Subject: [PATCH 062/355] better handling of CMAKE_MODULE_PATH when passed to another project Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../DefaultProject/Template/EngineFinder.cmake | 15 +++++++++++++++ .../MinimalProject/Template/EngineFinder.cmake | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Templates/DefaultProject/Template/EngineFinder.cmake b/Templates/DefaultProject/Template/EngineFinder.cmake index ccbfcbecfd..1bb4950e7d 100644 --- a/Templates/DefaultProject/Template/EngineFinder.cmake +++ b/Templates/DefaultProject/Template/EngineFinder.cmake @@ -21,6 +21,21 @@ if(json_error) message(FATAL_ERROR "Unable to read key 'engine' from 'project.json', error: ${json_error}") endif() +if(CMAKE_MODULE_PATH) + foreach(module_path ${CMAKE_MODULE_PATH}) + if(EXISTS ${module_path}/Findo3de.cmake) + file(READ ${module_path}/../engine.json engine_json) + string(JSON engine_name ERROR_VARIABLE json_error GET ${engine_json} engine_name) + if(json_error) + message(FATAL_ERROR "Unable to read key 'engine_name' from 'engine.json', error: ${json_error}") + endif() + if(LY_ENGINE_NAME_TO_USE STREQUAL engine_name) + return() # Engine being forced through CMAKE_MODULE_PATH + endif() + endif() + endforeach() +endif() + if(DEFINED ENV{USERPROFILE} AND EXISTS $ENV{USERPROFILE}) set(manifest_path $ENV{USERPROFILE}/.o3de/o3de_manifest.json) # Windows else() diff --git a/Templates/MinimalProject/Template/EngineFinder.cmake b/Templates/MinimalProject/Template/EngineFinder.cmake index ccbfcbecfd..1bb4950e7d 100644 --- a/Templates/MinimalProject/Template/EngineFinder.cmake +++ b/Templates/MinimalProject/Template/EngineFinder.cmake @@ -21,6 +21,21 @@ if(json_error) message(FATAL_ERROR "Unable to read key 'engine' from 'project.json', error: ${json_error}") endif() +if(CMAKE_MODULE_PATH) + foreach(module_path ${CMAKE_MODULE_PATH}) + if(EXISTS ${module_path}/Findo3de.cmake) + file(READ ${module_path}/../engine.json engine_json) + string(JSON engine_name ERROR_VARIABLE json_error GET ${engine_json} engine_name) + if(json_error) + message(FATAL_ERROR "Unable to read key 'engine_name' from 'engine.json', error: ${json_error}") + endif() + if(LY_ENGINE_NAME_TO_USE STREQUAL engine_name) + return() # Engine being forced through CMAKE_MODULE_PATH + endif() + endif() + endforeach() +endif() + if(DEFINED ENV{USERPROFILE} AND EXISTS $ENV{USERPROFILE}) set(manifest_path $ENV{USERPROFILE}/.o3de/o3de_manifest.json) # Windows else() From 185e7ffbfc9c7e1c4d9fa2f2e32c96aa440eef70 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 16:46:27 -0700 Subject: [PATCH 063/355] get the Platform files for 3rdparty also copied Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/Install_common.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index 0bd598f70e..92d261607c 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -404,15 +404,26 @@ function(ly_setup_cmake_install) # Collect all Find files that were added with ly_add_external_target_path unset(additional_find_files) + unset(additional_platform_files) get_property(additional_module_paths GLOBAL PROPERTY LY_ADDITIONAL_MODULE_PATH) foreach(additional_module_path ${additional_module_paths}) unset(find_files) file(GLOB find_files "${additional_module_path}/Find*.cmake") list(APPEND additional_find_files "${find_files}") + foreach(find_file ${find_files}) + # also copy the Platform/ to the destination + cmake_path(GET find_file PARENT_PATH find_file_parent) + unset(plat_files) + file(GLOB plat_files "${find_file_parent}/Platform/${PAL_PLATFORM_NAME}/*.cmake") + list(APPEND additional_platform_files "${plat_files}") + endforeach() endforeach() install(FILES ${additional_find_files} DESTINATION cmake/3rdParty ) + install(FILES ${additional_platform_files} + DESTINATION cmake/3rdParty/Platform/${PAL_PLATFORM_NAME} + ) # Findo3de.cmake file: we generate a different Findo3de.camke file than the one we have in cmake. This one is going to expose all # targets that are pre-built From d838a0fcbce03b5482ddb8c1dfad46fd0ed97a7d Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 16:51:57 -0700 Subject: [PATCH 064/355] Android release fixes (#3788) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzCore/AzCore/Debug/Trace.cpp | 2 ++ Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp | 2 +- .../Code/Source/Platform/Android/InAppPurchasesAndroid.cpp | 2 +- Gems/Microphone/Code/Include/Microphone/WAVUtil.h | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp index 26c702c13a..87f6def0d2 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp @@ -174,6 +174,8 @@ namespace AZ AZStd::this_thread::sleep_for(milliseconds(1)); } return AZ::Debug::Trace::IsDebuggerPresent(); +#else + return false; #endif } diff --git a/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp b/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp index 1e4f731b9a..9e0ea304ef 100644 --- a/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp +++ b/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp @@ -64,7 +64,7 @@ namespace AzTestRunner { static char cwd_buffer[AZ_MAX_PATH_LEN] = { '\0' }; - AZ::Utils::ExecutablePathResult result = AZ::Utils::GetExecutableDirectory(cwd_buffer, AZ_ARRAY_SIZE(cwd_buffer)); + [[maybe_unused]] AZ::Utils::ExecutablePathResult result = AZ::Utils::GetExecutableDirectory(cwd_buffer, AZ_ARRAY_SIZE(cwd_buffer)); AZ_Assert(result == AZ::Utils::ExecutablePathResult::Success, "Error retrieving executable path"); return static_cast(cwd_buffer); diff --git a/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.cpp b/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.cpp index 5c8195235b..bd13e91dc6 100644 --- a/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.cpp +++ b/Gems/InAppPurchases/Code/Source/Platform/Android/InAppPurchasesAndroid.cpp @@ -250,7 +250,7 @@ namespace InAppPurchases document.Parse(fileBuffer.data()); if (document.HasParseError()) { - const char* errorStr = rapidjson::GetParseError_En(document.GetParseError()); + [[maybe_unused]] const char* errorStr = rapidjson::GetParseError_En(document.GetParseError()); AZ_TracePrintf("LumberyardInAppBilling", "Failed to parse product_ids.json: %s\n", errorStr); return; } diff --git a/Gems/Microphone/Code/Include/Microphone/WAVUtil.h b/Gems/Microphone/Code/Include/Microphone/WAVUtil.h index 71c1ec13d1..9fdcc95a97 100644 --- a/Gems/Microphone/Code/Include/Microphone/WAVUtil.h +++ b/Gems/Microphone/Code/Include/Microphone/WAVUtil.h @@ -89,7 +89,7 @@ namespace Audio AZ::IO::FileIOStream fileStream(filePath.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary); if (fileStream.IsOpen()) { - auto bytesWritten = fileStream.Write(m_bufferSize, m_buffer); + [[maybe_unused]] auto bytesWritten = fileStream.Write(m_bufferSize, m_buffer); AZ_TracePrintf("WAVUtil", "Wrote WAV file: %s, %d bytes\n", filePath.c_str(), bytesWritten); return true; } From 0c7dfce5a0d01684c508abe56db42c7eb3b6c8c8 Mon Sep 17 00:00:00 2001 From: Ken Pruiksma Date: Tue, 31 Aug 2021 19:05:03 -0500 Subject: [PATCH 065/355] First pass terrain cleanup (#3753) * First pass cleanup of some terrain components. Signed-off-by: Ken Pruiksma * Adding basic culling to terrain sectors Signed-off-by: Ken Pruiksma * Adding default value for m_transform Signed-off-by: Ken Pruiksma --- .../Components/TerrainWorldComponent.cpp | 6 +- .../TerrainWorldDebuggerComponent.cpp | 7 - .../TerrainFeatureProcessor.cpp | 204 ++++++++---------- .../TerrainRenderer/TerrainFeatureProcessor.h | 33 +-- .../Source/TerrainSystem/TerrainSystem.cpp | 32 +-- .../Code/Source/TerrainSystem/TerrainSystem.h | 7 +- .../Source/TerrainSystem/TerrainSystemBus.h | 6 +- 7 files changed, 122 insertions(+), 173 deletions(-) diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp index e2af58e3eb..669a8f4b02 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp @@ -85,8 +85,10 @@ namespace Terrain void TerrainWorldComponent::Activate() { - TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::SetWorldMin, m_configuration.m_worldMin); - TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::SetWorldMax, m_configuration.m_worldMax); + TerrainSystemServiceRequestBus::Broadcast( + &TerrainSystemServiceRequestBus::Events::SetWorldBounds, + AZ::Aabb::CreateFromMinMax(m_configuration.m_worldMin, m_configuration.m_worldMax) + ); TerrainSystemServiceRequestBus::Broadcast( &TerrainSystemServiceRequestBus::Events::SetHeightQueryResolution, m_configuration.m_heightQueryResolution); diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp index 1fea51ded4..d7504295c2 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp @@ -92,20 +92,13 @@ namespace Terrain { m_wireframeBounds = AZ::Aabb::CreateNull(); - TerrainSystemServiceRequestBus::Broadcast( - &TerrainSystemServiceRequestBus::Events::SetDebugWireframe, m_configuration.m_drawWireframe); - AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(GetEntityId()); AzFramework::BoundsRequestBus::Handler::BusConnect(GetEntityId()); AzFramework::Terrain::TerrainDataNotificationBus::Handler::BusConnect(); - } void TerrainWorldDebuggerComponent::Deactivate() { - TerrainSystemServiceRequestBus::Broadcast( - &TerrainSystemServiceRequestBus::Events::SetDebugWireframe, false); - AzFramework::Terrain::TerrainDataNotificationBus::Handler::BusDisconnect(); AzFramework::BoundsRequestBus::Handler::BusDisconnect(); AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect(); diff --git a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp index 812ed3f0da..2178151e3d 100644 --- a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp +++ b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp @@ -10,12 +10,14 @@ #include #include +#include #include #include #include #include +#include #include #include #include @@ -34,6 +36,7 @@ namespace Terrain namespace { const uint32_t DEFAULT_UploadBufferSize = 512 * 1024; // 512k + const char* TerrainFPName = "TerrainFeatureProcessor"; } namespace ShaderInputs @@ -59,7 +62,7 @@ namespace Terrain void TerrainFeatureProcessor::Activate() { - m_areaData.clear(); + m_areaData = {}; InitializeAtomStuff(); EnableSceneNotification(); @@ -69,43 +72,18 @@ namespace Terrain { m_rhiSystem = AZ::RHI::RHISystemInterface::Get(); - m_rhiSystem->GetDrawListTagRegistry()->AcquireTag(AZ::Name("Terrain")); - { // Load the shader - - const char* terrainShaderFilePath = "Shaders/Terrain/Terrain.azshader"; - - AZ::Data::AssetId shaderAssetId; - AZ::Data::AssetCatalogRequestBus::BroadcastResult( - shaderAssetId, &AZ::Data::AssetCatalogRequestBus::Events::GetAssetIdByPath, - terrainShaderFilePath, azrtti_typeid(), false); - if (!shaderAssetId.IsValid()) - { - AZ_Error("Terrain", false, "Failed to get shader asset id with path %s", terrainShaderFilePath); - return; - } - - auto shaderAsset = AZ::Data::AssetManager::Instance().GetAsset(shaderAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - shaderAsset.BlockUntilLoadComplete(); - - if (!shaderAsset.IsReady()) - { - AZ_Error("Terrain", false, "Failed to get shader asset with path %s", terrainShaderFilePath); - return; - } - - m_shader = AZ::RPI::Shader::FindOrCreate(shaderAsset); + constexpr const char* TerrainShaderFilePath = "Shaders/Terrain/Terrain.azshader"; + m_shader = AZ::RPI::LoadShader(TerrainShaderFilePath); if (!m_shader) { - AZ_Error("Terrain", false, "Failed to find or create a shader instance from shader asset '%s'", terrainShaderFilePath); + AZ_Error(TerrainFPName, false, "Failed to find or create a shader instance from shader asset '%s'", TerrainShaderFilePath); return; } // Create the data layout - m_pipelineStateDescriptor = AZ::RHI::PipelineStateDescriptorForDraw{}; - { AZ::RHI::InputStreamLayoutBuilder layoutBuilder; @@ -124,41 +102,41 @@ namespace Terrain m_perObjectSrgAsset = m_shader->FindShaderResourceGroupLayout(AZ::Name{"ObjectSrg"}); if (!m_perObjectSrgAsset) { - AZ_Error("Terrain", false, "Failed to get shader resource group asset"); + AZ_Error(TerrainFPName, false, "Failed to get shader resource group asset"); return; } else if (!m_perObjectSrgAsset->IsFinalized()) { - AZ_Error("Terrain", false, "Shader resource group asset is not loaded"); + AZ_Error(TerrainFPName, false, "Shader resource group asset is not loaded"); return; } const AZ::RHI::ShaderResourceGroupLayout* shaderResourceGroupLayout = &(*m_perObjectSrgAsset); m_heightmapImageIndex = shaderResourceGroupLayout->FindShaderInputImageIndex(AZ::Name(ShaderInputs::HeightmapImage)); - AZ_Error("Terrain", m_heightmapImageIndex.IsValid(), "Failed to find shader input image %s.", ShaderInputs::HeightmapImage); + AZ_Error(TerrainFPName, m_heightmapImageIndex.IsValid(), "Failed to find shader input image %s.", ShaderInputs::HeightmapImage); m_modelToWorldIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::ModelToWorld)); - AZ_Error("Terrain", m_modelToWorldIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::ModelToWorld); + AZ_Error(TerrainFPName, m_modelToWorldIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::ModelToWorld); m_heightScaleIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::HeightScale)); - AZ_Error("Terrain", m_heightScaleIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::HeightScale); + AZ_Error(TerrainFPName, m_heightScaleIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::HeightScale); m_uvMinIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::UvMin)); - AZ_Error("Terrain", m_uvMinIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvMin); + AZ_Error(TerrainFPName, m_uvMinIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvMin); m_uvMaxIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::UvMax)); - AZ_Error("Terrain", m_uvMaxIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvMax); + AZ_Error(TerrainFPName, m_uvMaxIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvMax); m_uvStepIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::UvStep)); - AZ_Error("Terrain", m_uvStepIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvStep); + AZ_Error(TerrainFPName, m_uvStepIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvStep); // If this fails to run now, it's ok, we'll initialize it in OnRenderPipelineAdded later. bool success = GetParentScene()->ConfigurePipelineState(m_shader->GetDrawListTag(), m_pipelineStateDescriptor); if (success) { m_pipelineState = m_shader->AcquirePipelineState(m_pipelineStateDescriptor); - AZ_Assert(m_pipelineState, "Failed to acquire default pipeline state for shader '%s'", terrainShaderFilePath); + AZ_Assert(m_pipelineState, "Failed to acquire default pipeline state for shader '%s'", TerrainShaderFilePath); } } @@ -172,7 +150,7 @@ namespace Terrain if (resultCode != AZ::RHI::ResultCode::Success) { - AZ_Error("Terrain", false, "Failed to create host buffer pool from RPI"); + AZ_Error(TerrainFPName, false, "Failed to create host buffer pool from RPI"); return; } @@ -180,7 +158,7 @@ namespace Terrain if (!InitializeRenderBuffers()) { - AZ_Error("Terrain", false, "Failed to create Terrain render buffers!"); + AZ_Error(TerrainFPName, false, "Failed to create Terrain render buffers!"); return; } } @@ -210,7 +188,7 @@ namespace Terrain DisableSceneNotification(); DestroyRenderBuffers(); - m_areaData.clear(); + m_areaData = {}; if (m_hostPool) { @@ -226,7 +204,6 @@ namespace Terrain } void TerrainFeatureProcessor::UpdateTerrainData( - AZ::EntityId areaId, const AZ::Transform& transform, const AZ::Aabb& worldBounds, [[maybe_unused]] float sampleSpacing, @@ -234,37 +211,33 @@ namespace Terrain { if (!worldBounds.IsValid()) { - m_areaData.erase(areaId); return; } - TerrainAreaData areaData; - - areaData.m_transform = transform; - areaData.m_heightScale = worldBounds.GetZExtent(); - areaData.m_terrainBounds = worldBounds; - areaData.m_heightmapImageHeight = height; - areaData.m_heightmapImageWidth = width; + m_areaData.m_transform = transform; + m_areaData.m_heightScale = worldBounds.GetZExtent(); + m_areaData.m_terrainBounds = worldBounds; + m_areaData.m_heightmapImageHeight = height; + m_areaData.m_heightmapImageWidth = width; // Create heightmap image data { - areaData.m_propertiesDirty = true; + m_areaData.m_propertiesDirty = true; AZ::RHI::Size imageSize; imageSize.m_width = width; imageSize.m_height = height; AZ::Data::Instance streamingImagePool = AZ::RPI::ImageSystemInterface::Get()->GetSystemStreamingPool(); - areaData.m_heightmapImage = AZ::RPI::StreamingImage::CreateFromCpuData(*streamingImagePool, + m_areaData.m_heightmapImage = AZ::RPI::StreamingImage::CreateFromCpuData(*streamingImagePool, AZ::RHI::ImageDimension::Image2D, imageSize, AZ::RHI::Format::R32_FLOAT, (uint8_t*)heightData.data(), heightData.size() * sizeof(float)); - AZ_Error("Terrain", areaData.m_heightmapImage, "Failed to initialize the heightmap image!"); + AZ_Error(TerrainFPName, m_areaData.m_heightmapImage, "Failed to initialize the heightmap image!"); } - m_areaData.insert_or_assign(areaId, areaData); } void TerrainFeatureProcessor::ProcessSurfaces(const FeatureProcessor::RenderPacket& process) @@ -276,31 +249,30 @@ namespace Terrain return; } - if (m_areaData.empty()) + if (!m_areaData.m_terrainBounds.IsValid()) { return; } - - m_drawPackets.clear(); - m_processSrgs.clear(); - - AZ::RHI::DrawPacketBuilder drawPacketBuilder; - - uint32_t numIndices = static_cast(m_gridIndices.size()); - - AZ::RHI::DrawIndexed drawIndexed; - drawIndexed.m_indexCount = numIndices; - drawIndexed.m_indexOffset = 0; - drawIndexed.m_vertexOffset = 0; - - for (auto& [areaId, areaData] : m_areaData) + + if (m_areaData.m_propertiesDirty) { + m_sectorData.clear(); + + AZ::RHI::DrawPacketBuilder drawPacketBuilder; + + uint32_t numIndices = static_cast(m_gridIndices.size()); + + AZ::RHI::DrawIndexed drawIndexed; + drawIndexed.m_indexCount = numIndices; + drawIndexed.m_indexOffset = 0; + drawIndexed.m_vertexOffset = 0; + float xFirstPatchStart = - areaData.m_terrainBounds.GetMin().GetX() - fmod(areaData.m_terrainBounds.GetMin().GetX(), m_gridMeters); - float xLastPatchStart = areaData.m_terrainBounds.GetMax().GetX() - fmod(areaData.m_terrainBounds.GetMax().GetX(), m_gridMeters); + m_areaData.m_terrainBounds.GetMin().GetX() - fmod(m_areaData.m_terrainBounds.GetMin().GetX(), m_gridMeters); + float xLastPatchStart = m_areaData.m_terrainBounds.GetMax().GetX() - fmod(m_areaData.m_terrainBounds.GetMax().GetX(), m_gridMeters); float yFirstPatchStart = - areaData.m_terrainBounds.GetMin().GetY() - fmod(areaData.m_terrainBounds.GetMin().GetY(), m_gridMeters); - float yLastPatchStart = areaData.m_terrainBounds.GetMax().GetY() - fmod(areaData.m_terrainBounds.GetMax().GetY(), m_gridMeters); + m_areaData.m_terrainBounds.GetMin().GetY() - fmod(m_areaData.m_terrainBounds.GetMin().GetY(), m_gridMeters); + float yLastPatchStart = m_areaData.m_terrainBounds.GetMax().GetY() - fmod(m_areaData.m_terrainBounds.GetMax().GetY(), m_gridMeters); for (float yPatch = yFirstPatchStart; yPatch <= yLastPatchStart; yPatch += m_gridMeters) { @@ -310,62 +282,70 @@ namespace Terrain drawPacketBuilder.SetDrawArguments(drawIndexed); drawPacketBuilder.SetIndexBufferView(m_indexBufferView); - auto m_resourceGroup = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), m_shader->GetSupervariantIndex(), AZ::Name("ObjectSrg")); + auto resourceGroup = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), m_shader->GetSupervariantIndex(), AZ::Name("ObjectSrg")); //auto m_resourceGroup = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), AZ::Name("ObjectSrg")); - if (!m_resourceGroup) + if (!resourceGroup) { - AZ_Error("Terrain", false, "Failed to create shader resource group"); + AZ_Error(TerrainFPName, false, "Failed to create shader resource group"); return; } float uvMin[2] = { 0.0f, 0.0f }; float uvMax[2] = { 1.0f, 1.0f }; - uvMin[0] = (float)((xPatch - areaData.m_terrainBounds.GetMin().GetX()) / areaData.m_terrainBounds.GetXExtent()); - uvMin[1] = (float)((yPatch - areaData.m_terrainBounds.GetMin().GetY()) / areaData.m_terrainBounds.GetYExtent()); + uvMin[0] = (float)((xPatch - m_areaData.m_terrainBounds.GetMin().GetX()) / m_areaData.m_terrainBounds.GetXExtent()); + uvMin[1] = (float)((yPatch - m_areaData.m_terrainBounds.GetMin().GetY()) / m_areaData.m_terrainBounds.GetYExtent()); uvMax[0] = - (float)(((xPatch + m_gridMeters) - areaData.m_terrainBounds.GetMin().GetX()) / areaData.m_terrainBounds.GetXExtent()); + (float)(((xPatch + m_gridMeters) - m_areaData.m_terrainBounds.GetMin().GetX()) / m_areaData.m_terrainBounds.GetXExtent()); uvMax[1] = - (float)(((yPatch + m_gridMeters) - areaData.m_terrainBounds.GetMin().GetY()) / areaData.m_terrainBounds.GetYExtent()); + (float)(((yPatch + m_gridMeters) - m_areaData.m_terrainBounds.GetMin().GetY()) / m_areaData.m_terrainBounds.GetYExtent()); float uvStep[2] = { - 1.0f / areaData.m_heightmapImageWidth, 1.0f / areaData.m_heightmapImageHeight, + 1.0f / m_areaData.m_heightmapImageWidth, 1.0f / m_areaData.m_heightmapImageHeight, }; - AZ::Transform transform = areaData.m_transform; - transform.SetTranslation(xPatch, yPatch, areaData.m_transform.GetTranslation().GetZ()); + AZ::Transform transform = m_areaData.m_transform; + transform.SetTranslation(xPatch, yPatch, m_areaData.m_transform.GetTranslation().GetZ()); AZ::Matrix3x4 matrix3x4 = AZ::Matrix3x4::CreateFromTransform(transform); - m_resourceGroup->SetImage(m_heightmapImageIndex, areaData.m_heightmapImage); - m_resourceGroup->SetConstant(m_modelToWorldIndex, matrix3x4); - m_resourceGroup->SetConstant(m_heightScaleIndex, areaData.m_heightScale); - m_resourceGroup->SetConstant(m_uvMinIndex, uvMin); - m_resourceGroup->SetConstant(m_uvMaxIndex, uvMax); - m_resourceGroup->SetConstant(m_uvStepIndex, uvStep); - m_resourceGroup->Compile(); - m_processSrgs.push_back(m_resourceGroup); - - if (m_resourceGroup != nullptr) - { - drawPacketBuilder.AddShaderResourceGroup(m_resourceGroup->GetRHIShaderResourceGroup()); - } + resourceGroup->SetImage(m_heightmapImageIndex, m_areaData.m_heightmapImage); + resourceGroup->SetConstant(m_modelToWorldIndex, matrix3x4); + resourceGroup->SetConstant(m_heightScaleIndex, m_areaData.m_heightScale); + resourceGroup->SetConstant(m_uvMinIndex, uvMin); + resourceGroup->SetConstant(m_uvMaxIndex, uvMax); + resourceGroup->SetConstant(m_uvStepIndex, uvStep); + resourceGroup->Compile(); + drawPacketBuilder.AddShaderResourceGroup(resourceGroup->GetRHIShaderResourceGroup()); AZ::RHI::DrawPacketBuilder::DrawRequest drawRequest; drawRequest.m_listTag = m_drawListTag; drawRequest.m_pipelineState = m_pipelineState.get(); - drawRequest.m_streamBufferViews = m_vertexBufferViews; + drawRequest.m_streamBufferViews = AZStd::array_view(&m_vertexBufferView, 1); drawPacketBuilder.AddDrawItem(drawRequest); - - const AZ::RHI::DrawPacket* drawPacket = drawPacketBuilder.End(); - m_drawPackets.emplace_back(drawPacket); - - for (auto& view : process.m_views) - { - view->AddDrawPacket(drawPacket); - } + + m_sectorData.emplace_back( + drawPacketBuilder.End(), + AZ::Aabb::CreateFromMinMax( + AZ::Vector3(xPatch, yPatch, m_areaData.m_terrainBounds.GetMin().GetZ()), + AZ::Vector3(xPatch + m_gridMeters, yPatch + m_gridMeters, m_areaData.m_terrainBounds.GetMax().GetZ()) + ), + resourceGroup + ); + } + } + } + + for (auto& view : process.m_views) + { + AZ::Frustum viewFrustum = AZ::Frustum::CreateFromMatrixColumnMajor(view->GetWorldToClipMatrix()); + for (auto& sectorData : m_sectorData) + { + if (viewFrustum.IntersectAabb(sectorData.m_aabb) != AZ::IntersectResult::Exterior) + { + view->AddDrawPacket(sectorData.m_drawPacket.get()); } } } @@ -413,9 +393,6 @@ namespace Terrain m_indexBuffer->SetName(AZ::Name("TerrainIndexBuffer")); m_vertexBuffer->SetName(AZ::Name("TerrainVertexBuffer")); - // We only need one vertex buffer view. - m_vertexBufferViews.resize(1); - AZStd::vector> buffers = { m_indexBuffer , m_vertexBuffer }; // Fill our buffers with the vertex/index data @@ -433,7 +410,7 @@ namespace Terrain if (result != AZ::RHI::ResultCode::Success) { - AZ_Error("Terrain", false, "Failed to create GPU buffers for Terrain"); + AZ_Error(TerrainFPName, false, "Failed to create GPU buffers for Terrain"); return false; } @@ -462,10 +439,10 @@ namespace Terrain const uint64_t elementSize = m_gridVertices.size() * sizeof(Vertex); memcpy(mappedData, m_gridVertices.data(), elementSize); - m_vertexBufferViews[bufferIndex - 1] = AZ::RHI::StreamBufferView( + m_vertexBufferView = AZ::RHI::StreamBufferView( *buffer, 0, static_cast(elementSize), static_cast(sizeof(Vertex))); - AZ::RHI::ValidateStreamBufferViews(m_pipelineStateDescriptor.m_inputStreamLayout, m_vertexBufferViews); + AZ::RHI::ValidateStreamBufferViews(m_pipelineStateDescriptor.m_inputStreamLayout, { { m_vertexBufferView } }); } m_hostPool->UnmapBuffer(*buffer); @@ -479,9 +456,8 @@ namespace Terrain m_indexBuffer.reset(); m_vertexBuffer.reset(); - m_vertexBufferViews.clear(); - - m_processSrgs.clear(); + m_indexBufferView = {}; + m_vertexBufferView = {}; m_pipelineStateDescriptor = AZ::RHI::PipelineStateDescriptorForDraw{}; m_pipelineState = nullptr; diff --git a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h index 2a1d5b7514..7a7b63b634 100644 --- a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h +++ b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h @@ -47,16 +47,12 @@ namespace Terrain void Deactivate() override; void Render(const AZ::RPI::FeatureProcessor::RenderPacket& packet) override; - void UpdateTerrainData(AZ::EntityId areaId, const AZ::Transform& transform, const AZ::Aabb& worldBounds, float sampleSpacing, + void UpdateTerrainData(const AZ::Transform& transform, const AZ::Aabb& worldBounds, float sampleSpacing, uint32_t width, uint32_t height, const AZStd::vector& heightData); - void RemoveTerrainData(AZ::EntityId areaId) - { - m_areaData.erase(areaId); - } void RemoveTerrainData() { - m_areaData.clear(); + m_areaData = {}; } private: @@ -122,13 +118,13 @@ namespace Terrain AZ::RHI::Ptr m_indexBuffer; AZ::RHI::Ptr m_vertexBuffer; AZ::RHI::IndexBufferView m_indexBufferView; - AZStd::fixed_vector m_vertexBufferViews; + AZ::RHI::StreamBufferView m_vertexBufferView; // Per-area data struct TerrainAreaData { - AZ::Transform m_transform; - AZ::Aabb m_terrainBounds; + AZ::Transform m_transform{ AZ::Transform::CreateIdentity() }; + AZ::Aabb m_terrainBounds{ AZ::Aabb::CreateNull() }; float m_heightScale; AZ::Data::Instance m_heightmapImage; uint32_t m_heightmapImageWidth; @@ -136,10 +132,21 @@ namespace Terrain bool m_propertiesDirty{ true }; }; - AZStd::unordered_map m_areaData; + TerrainAreaData m_areaData; - // These could either be per-area or system-level - AZStd::vector> m_drawPackets; - AZStd::vector> m_processSrgs; + struct SectorData + { + AZ::Data::Instance m_srg; + AZ::Aabb m_aabb; + AZStd::unique_ptr m_drawPacket; + + SectorData(const AZ::RHI::DrawPacket* drawPacket, AZ::Aabb aabb, AZ::Data::Instance srg) + : m_srg(srg) + , m_aabb(aabb) + , m_drawPacket(drawPacket) + {} + }; + + AZStd::vector m_sectorData; }; } diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp index 872b37a02e..90b74f08ba 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp @@ -49,15 +49,9 @@ void TerrainSystem::Deactivate() m_terrainSettingsDirty = true; } -void TerrainSystem::SetWorldMin(AZ::Vector3 worldOrigin) -{ - m_requestedSettings.m_worldBounds.SetMin(worldOrigin); - m_terrainSettingsDirty = true; -} - -void TerrainSystem::SetWorldMax(AZ::Vector3 worldBounds) -{ - m_requestedSettings.m_worldBounds.SetMax(worldBounds); +void TerrainSystem::SetWorldBounds(const AZ::Aabb& worldBounds) +{ + m_requestedSettings.m_worldBounds = worldBounds; m_terrainSettingsDirty = true; } @@ -67,13 +61,6 @@ void TerrainSystem::SetHeightQueryResolution(AZ::Vector2 queryResolution) m_terrainSettingsDirty = true; } -void TerrainSystem::SetDebugWireframe(bool wireframeEnabled) -{ - m_requestedSettings.m_debugWireframeEnabled = wireframeEnabled; - m_terrainSettingsDirty = true; -} - - AZ::Aabb TerrainSystem::GetTerrainAabb() const { return m_currentSettings.m_worldBounds; @@ -378,13 +365,6 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) terrainSettingsChanged = true; } - if (m_requestedSettings.m_debugWireframeEnabled != m_currentSettings.m_debugWireframeEnabled) - { - m_dirtyRegion = AZ::Aabb::CreateNull(); - m_terrainHeightDirty = true; - terrainSettingsChanged = true; - } - if (m_requestedSettings.m_heightQueryResolution != m_currentSettings.m_heightQueryResolution) { m_dirtyRegion = AZ::Aabb::CreateNull(); @@ -409,7 +389,6 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) { AZStd::shared_lock lock(m_areaMutex); - AZ::EntityId entityId(0); AZ::Transform transform = AZ::Transform::CreateTranslation(m_currentSettings.m_worldBounds.GetCenter()); uint32_t width = aznumeric_cast( @@ -417,7 +396,7 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) uint32_t height = aznumeric_cast( (float)m_currentSettings.m_worldBounds.GetYExtent() / m_currentSettings.m_heightQueryResolution.GetY()); AZStd::vector pixels; - pixels.resize(width * height); + pixels.resize_no_construct(width * height); const uint32_t pixelDataSize = width * height * sizeof(float); memset(pixels.data(), 0, pixelDataSize); @@ -454,8 +433,7 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) if (terrainFeatureProcessor) { terrainFeatureProcessor->UpdateTerrainData( - entityId, transform, m_currentSettings.m_worldBounds, m_currentSettings.m_heightQueryResolution.GetX(), width, height, - pixels); + transform, m_currentSettings.m_worldBounds, m_currentSettings.m_heightQueryResolution.GetX(), width, height, pixels); } } diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h index 56ed182047..2d2286a0c3 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h @@ -36,11 +36,9 @@ namespace Terrain /////////////////////////////////////////// // TerrainSystemServiceRequestBus::Handler Impl - - void SetWorldMin(AZ::Vector3 worldOrigin) override; - void SetWorldMax(AZ::Vector3 worldBounds) override; + + void SetWorldBounds(const AZ::Aabb& worldBounds) override; void SetHeightQueryResolution(AZ::Vector2 queryResolution) override; - void SetDebugWireframe(bool wireframeEnabled) override; void Activate() override; void Deactivate() override; @@ -103,7 +101,6 @@ namespace Terrain { AZ::Aabb m_worldBounds; AZ::Vector2 m_heightQueryResolution{ 1.0f }; - bool m_debugWireframeEnabled{ false }; bool m_systemActive{ false }; }; diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h index 08521fd780..e999cbf8be 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h @@ -39,10 +39,8 @@ namespace Terrain virtual void Activate() = 0; virtual void Deactivate() = 0; - virtual void SetWorldMin(AZ::Vector3 worldOrigin) = 0; - virtual void SetWorldMax(AZ::Vector3 worldBounds) = 0; + virtual void SetWorldBounds(const AZ::Aabb& worldBounds) = 0; virtual void SetHeightQueryResolution(AZ::Vector2 queryResolution) = 0; - virtual void SetDebugWireframe(bool wireframeEnabled) = 0; // register an area to override terrain virtual void RegisterArea(AZ::EntityId areaId) = 0; @@ -111,8 +109,6 @@ namespace Terrain virtual void GetHeight(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, Sampler sampleFilter = Sampler::DEFAULT) = 0; virtual void GetNormal(const AZ::Vector3& inPosition, AZ::Vector3& outNormal, Sampler sampleFilter = Sampler::DEFAULT) = 0; - //virtual void GetSurfaceWeights(const AZ::Vector3& inPosition, SurfaceTagWeightMap& outSurfaceWeights, Sampler sampleFilter = DEFAULT) = 0; - //virtual void GetSurfacePoint(const AZ::Vector3& inPosition, SurfacePoint& outSurfacePoint, SurfacePointDataMask dataMask = DEFAULT, Sampler sampleFilter = DEFAULT) = 0; }; using TerrainAreaHeightRequestBus = AZ::EBus; From 205c09e2000de5ff47c57621f59f0f8e7c66a7ac Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Tue, 31 Aug 2021 17:24:02 -0700 Subject: [PATCH 066/355] Better upgrade tool messaging and continuity on failure; fix for serialization Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Tools/UpgradeTool/VersionExplorer.cpp | 183 ++++++++---------- .../Tools/UpgradeTool/VersionExplorer.h | 13 +- .../Serialization/DatumSerializer.cpp | 29 ++- 3 files changed, 113 insertions(+), 112 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index 6b396d88ba..0d7efa5e41 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -188,9 +188,9 @@ namespace ScriptCanvasEditor if (!IsUpgrading()) { - OperationResult result = BackupGraph(*m_inProgressAsset); + AZStd::string errorMessage = BackupGraph(*m_inProgressAsset); // Make the backup - if (result == OperationResult::BackupSuccess || result == OperationResult::SkipBackup) + if (errorMessage.empty()) { Log("SystemTick::ProcessState::Upgrade: Backup Success %s ", m_inProgressAsset->GetHint().c_str()); QList items = m_ui->tableWidget->findItems(m_inProgressAsset->GetHint().c_str(), Qt::MatchFlag::MatchExactly); @@ -210,7 +210,7 @@ namespace ScriptCanvasEditor else { Log("SystemTick::ProcessState::Upgrade: Backup Failed %s ", m_inProgressAsset->GetHint().c_str()); - GraphUpgradeComplete(*m_inProgressAsset, result); + GraphUpgradeComplete(*m_inProgressAsset, OperationResult::Failure, errorMessage); } } @@ -241,12 +241,12 @@ namespace ScriptCanvasEditor AZ::SystemTickBus::Handler::BusConnect(); } - VersionExplorer::OperationResult VersionExplorer::BackupGraph(const AZ::Data::Asset& asset) + AZStd::string VersionExplorer::BackupGraph(const AZ::Data::Asset& asset) { bool makeBackup = m_ui->makeBackupCheckbox->isChecked(); if (!makeBackup) { - return OperationResult::SkipBackup; + return ""; } QDateTime theTime = QDateTime::currentDateTime(); @@ -262,7 +262,7 @@ namespace ScriptCanvasEditor if (AZ::IO::FileIOBase::GetInstance()->CreatePath(backupPath.c_str()) != AZ::IO::ResultCode::Success) { AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Failed to create backup folder %s", backupPath.c_str()); - return OperationResult::BackupFail_CreateFolder; + return "Failed to create backup folder"; } } @@ -298,7 +298,7 @@ namespace ScriptCanvasEditor else { AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "VersionExplorer::BackupGraph: Failed to find file: %s", asset.GetHint().c_str()); - return OperationResult::BackupFail_FileNotFound; + return "Failed to find source file"; } devRoot = devRootCStr; @@ -317,12 +317,12 @@ namespace ScriptCanvasEditor if (AZ::IO::FileIOBase::GetInstance()->Copy(sourceFilePath.c_str(), targetFilePath.c_str()) != AZ::IO::ResultCode::Error) { Log("VersionExplorer::BackupGraph: Backed up: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); - return OperationResult::BackupSuccess; + return ""; } else { AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "VersionExplorer::BackupGraph: Error creating backup: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); - return OperationResult::BackupFail; + return "Failed to copy source file to backup location"; } } @@ -376,17 +376,18 @@ namespace ScriptCanvasEditor scriptCanvasEntity->Activate(); } + AZ_Assert(scriptCanvasEntity->GetState() == AZ::Entity::State::Active, "Graph entity is not active"); auto graphComponent = scriptCanvasEntity->FindComponent(); AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component"); if (graphComponent) { + m_scriptCanvasEntity = scriptCanvasEntity; + graphComponent->UpgradeGraph ( asset , m_ui->forceUpgrade->isChecked() ? Graph::UpgradeRequest::Forced : Graph::UpgradeRequest::IfOutOfDate , m_ui->verbose->isChecked()); - - m_scriptCanvasEntity = scriptCanvasEntity; } } @@ -417,85 +418,78 @@ namespace ScriptCanvasEditor { AZStd::string relativePath, fullPath; AZ::Data::AssetCatalogRequestBus::BroadcastResult(relativePath, &AZ::Data::AssetCatalogRequests::GetAssetPathById, asset.GetId()); - bool fullPathFound = false; AzToolsFramework::AssetSystemRequestBus::BroadcastResult(fullPathFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath, relativePath, fullPath); - AZStd::string tmpFileName; - bool tmpFilesaved = false; - - constexpr const size_t k_maxAttemps = 10; - // here we are saving the graph to a temp file instead of the original file and then copying the temp file to the original file. // This ensures that AP will not a get a file change notification on an incomplete graph file causing it to fail processing. Temp files are ignored by AP. - if (AZ::IO::CreateTempFileName(fullPath.c_str(), tmpFileName)) + if (!AZ::IO::CreateTempFileName(fullPath.c_str(), tmpFileName)) { - AZ::IO::FileIOStream fileStream(tmpFileName.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText); + GraphUpgradeComplete(asset, OperationResult::Failure, "Failure to create temporary file name"); + return; + } - if (fileStream.IsOpen()) + bool tempSavedSucceeded = false; + AZ::IO::FileIOStream fileStream(tmpFileName.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText); + if (fileStream.IsOpen()) + { + if (asset.GetType() == azrtti_typeid()) { - if (asset.GetType() == azrtti_typeid()) - { - ScriptCanvasEditor::ScriptCanvasAssetHandler handler; - tmpFilesaved = handler.SaveAssetData(asset, &fileStream); - } - - fileStream.Close(); + ScriptCanvasEditor::ScriptCanvasAssetHandler handler; + tempSavedSucceeded = handler.SaveAssetData(asset, &fileStream); } - using SCCommandBus = AzToolsFramework::SourceControlCommandBus; - SCCommandBus::Broadcast(&SCCommandBus::Events::RequestEdit, fullPath.c_str(), true, - [this, asset, fullPath, tmpFileName, tmpFilesaved](bool /*success*/, const AzToolsFramework::SourceControlFileInfo& info) - { - if (!info.IsReadOnly()) - { - if (tmpFilesaved) - { - PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); - } - } - else - { - if (m_overwriteAll) - { - AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true); - - if (tmpFilesaved) - { - PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); - } - } - else - { - int result = QMessageBox::No; - if (!m_overwriteAll) - { - QMessageBox mb(QMessageBox::Warning, - QObject::tr("Failed to Save Upgraded File"), - QObject::tr("The upgraded file could not be saved because the file is read only.\nDo you want to make it writeable and overwrite it?"), - QMessageBox::YesToAll | QMessageBox::Yes | QMessageBox::No, this); - - result = mb.exec(); - if (result == QMessageBox::YesToAll) - { - m_overwriteAll = true; - } - } - - if (result == QMessageBox::Yes || m_overwriteAll) - { - AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true); - - if (tmpFilesaved) - { - PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); - } - } - - } - } - }); + fileStream.Close(); } + + if (!tempSavedSucceeded) + { + GraphUpgradeComplete(asset, OperationResult::Failure, "Save asset data to temporary file failed"); + return; + } + + using SCCommandBus = AzToolsFramework::SourceControlCommandBus; + SCCommandBus::Broadcast(&SCCommandBus::Events::RequestEdit, fullPath.c_str(), true, + [this, asset, fullPath, tmpFileName]([[maybe_unused]] bool success, const AzToolsFramework::SourceControlFileInfo& info) + { + constexpr const size_t k_maxAttemps = 10; + + if (!info.IsReadOnly()) + { + PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); + } + else + { + if (m_overwriteAll) + { + AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true); + PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); + } + else + { + int result = QMessageBox::No; + if (!m_overwriteAll) + { + QMessageBox mb(QMessageBox::Warning, + QObject::tr("Failed to Save Upgraded File"), + QObject::tr("The upgraded file could not be saved because the file is read only.\nDo you want to make it writeable and overwrite it?"), + QMessageBox::YesToAll | QMessageBox::Yes | QMessageBox::No, this); + + result = mb.exec(); + if (result == QMessageBox::YesToAll) + { + m_overwriteAll = true; + } + } + + if (result == QMessageBox::Yes || m_overwriteAll) + { + AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true); + PerformMove(asset, tmpFileName, fullPath, k_maxAttemps); + } + } + } + }); } void VersionExplorer::PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target @@ -506,10 +500,11 @@ namespace ScriptCanvasEditor if (remainingAttempts == 0) { AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s. giving up", target.c_str()); - GraphUpgradeComplete(asset, OperationResult::CopyFinalFailed); + GraphUpgradeComplete(asset, OperationResult::Failure, "Failed to move updated file from backup to source destination"); } else if (remainingAttempts == 2) { + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s, trying again", target.c_str()); auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCaches(); streamer->SetRequestCompleteCallback(flushRequest @@ -530,11 +525,14 @@ namespace ScriptCanvasEditor AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); // Bump the slice asset up in the asset processor's queue. AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str()); - AZ::SystemTickBus::QueueFunction([this, asset]() { GraphUpgradeComplete(asset); }); + AZ::SystemTickBus::QueueFunction([this, asset]() + { + GraphUpgradeComplete(asset, OperationResult::Success, ""); + }); } else { - AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s. trying again", target.c_str()); + AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s, trying again", target.c_str()); auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target, remainingAttempts]([[maybe_unused]] AZ::IO::FileRequestHandle request) @@ -547,7 +545,8 @@ namespace ScriptCanvasEditor } } - void VersionExplorer::GraphUpgradeComplete(const AZ::Data::Asset asset, OperationResult result ) + void VersionExplorer::GraphUpgradeComplete + (const AZ::Data::Asset asset, OperationResult result, AZStd::string_view message) { m_inProgress = false; @@ -557,7 +556,7 @@ namespace ScriptCanvasEditor m_scriptCanvasEntity = nullptr; } - GraphUpgradeCompleteUIUpdate(asset, result); + GraphUpgradeCompleteUIUpdate(asset, result, message); if (!m_isUpgradingSingleGraph) { @@ -588,7 +587,8 @@ namespace ScriptCanvasEditor } } - void VersionExplorer::GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset asset, OperationResult result /*= OperationResult::Success*/) + void VersionExplorer::GraphUpgradeCompleteUIUpdate + ( const AZ::Data::Asset asset, OperationResult result, AZStd::string_view message) { QString text = asset.GetHint().c_str(); QList items = m_ui->tableWidget->findItems(text, Qt::MatchFlag::MatchExactly); @@ -615,18 +615,7 @@ namespace ScriptCanvasEditor else { doneButton->setIcon(QIcon(":/stylesheet/img/UI20/titlebar-close.svg")); - if (result == OperationResult::BackupFail_FileNotFound) - { - doneButton->setToolTip("The file no longer exists"); - } - else if (result == OperationResult::BackupFail_CreateFolder) - { - doneButton->setToolTip("Failed to create the backup folder"); - } - else if (result == OperationResult::CopyFinalFailed) - { - doneButton->setToolTip("Failed to copy final file to the source destination"); - } + doneButton->setToolTip(message.data()); } m_ui->tableWidget->setCellWidget(row, ColumnStatus, doneButton); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index 4dd67fef58..78f4f26e95 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -111,15 +111,10 @@ namespace ScriptCanvasEditor enum class OperationResult { Success, - SkipBackup, - BackupSuccess, - BackupFail, - BackupFail_CreateFolder, - BackupFail_FileNotFound, - CopyFinalFailed, + Failure, }; - void GraphUpgradeComplete(const AZ::Data::Asset, OperationResult result = OperationResult::Success); + void GraphUpgradeComplete(const AZ::Data::Asset, OperationResult result, AZStd::string_view message); bool IsUpgrading() const; @@ -157,10 +152,10 @@ namespace ScriptCanvasEditor void FinalizeScan(); void BackupComplete(); - OperationResult BackupGraph(const AZ::Data::Asset&); + AZStd::string BackupGraph(const AZ::Data::Asset&); void UpgradeGraph(const AZ::Data::Asset&); - void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset asset, OperationResult result = OperationResult::Success); + void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset asset, OperationResult result, AZStd::string_view message); void OnGraphUpgradeComplete(AZ::Data::Asset&, bool skipped = false) override; void OnSourceFileReleased(AZ::Data::Asset asset); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp index 5bfb69b11e..37fd3b14d6 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Serialization/DatumSerializer.cpp @@ -6,12 +6,27 @@ * */ +#include #include #include #include using namespace ScriptCanvas; +namespace DatumSerializerCpp +{ + bool IsEventInput(const AZ::Uuid& inputType) + { + AZ::BehaviorContext* behaviorContext = nullptr; + AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext); + AZ_Assert(behaviorContext, "Can't serialize data properly without checking the type, for which we need behavior context!"); + auto bcClassIter = behaviorContext->m_typeToClassMap.find(inputType); + return bcClassIter != behaviorContext->m_typeToClassMap.end() + && bcClassIter->second->m_azRtti + && bcClassIter->second->m_azRtti->GetGenericTypeId() == azrtti_typeid(); + } +} + namespace AZ { AZ_CLASS_ALLOCATOR_IMPL(DatumSerializer, SystemAllocator, 0); @@ -57,7 +72,7 @@ namespace AZ return context.Report ( JSR::Tasks::ReadField , JSR::Outcomes::Missing - , "DatumSerializer::Load failed to load the 'isNullPointer'' member"); + , "DatumSerializer::Load failed to load the 'isNullPointer' member"); } if (isNullPointerMember->value.GetBool()) @@ -110,7 +125,7 @@ namespace AZ { listeners->push_back(outputDatum); } - + return context.Report(result, result.GetProcessing() != JSR::Processing::Halted ? "DatumSerializer Load finished loading Datum" : "DatumSerializer Load failed to load Datum"); @@ -130,13 +145,13 @@ namespace AZ auto inputScriptDataPtr = reinterpret_cast(inputValue); auto defaultScriptDataPtr = reinterpret_cast(defaultValue); - + if (defaultScriptDataPtr) { if (*inputScriptDataPtr == *defaultScriptDataPtr) { return context.Report - ( JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "DatumSerializer Store used defaults for Datum"); + (JSR::Tasks::WriteValue, JSR::Outcomes::DefaultsUsed, "DatumSerializer Store used defaults for Datum"); } } @@ -159,11 +174,13 @@ namespace AZ , azrtti_typeidGetType())>() , context)); + // datum storage begin auto inputObjectSource = inputScriptDataPtr->GetAsDanger(); - outputValue.AddMember("isNullPointer", rapidjson::Value(inputObjectSource == nullptr), context.GetJsonAllocator()); + const bool isNullPointer = inputObjectSource == nullptr || DatumSerializerCpp::IsEventInput(inputScriptDataPtr->GetType().GetAZType()); + outputValue.AddMember("isNullPointer", rapidjson::Value(isNullPointer), context.GetJsonAllocator()); - if (inputObjectSource) + if (!isNullPointer) { rapidjson::Value typeValue; result.Combine(StoreTypeId(typeValue, inputScriptDataPtr->GetType().GetAZType(), context)); From c1c6fa36153d977181683eb5f7fa2901c5247303 Mon Sep 17 00:00:00 2001 From: Shirang Jia Date: Tue, 31 Aug 2021 17:37:25 -0700 Subject: [PATCH 067/355] Auto-cut Github issue on build failures from main/development (#3730) * Send SNS topic on build failure * send build failure root cause data to SNS topic that triggeres lambda function to automatically create Github issues * Change SNS topic subject to Build failure and add build url to the message * Change SNS topic name --- scripts/build/Jenkins/Jenkinsfile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile index 490e45b9a0..328e5f8df7 100644 --- a/scripts/build/Jenkins/Jenkinsfile +++ b/scripts/build/Jenkins/Jenkinsfile @@ -6,7 +6,7 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - +import groovy.json.JsonOutput PIPELINE_CONFIG_FILE = 'scripts/build/Jenkins/lumberyard.json' INCREMENTAL_BUILD_SCRIPT_PATH = 'scripts/build/bootstrap/incremental_build_util.py' @@ -770,6 +770,14 @@ finally { } else { buildFailure = tm('${BUILD_FAILURE_ANALYZER}') emailBody = "${BUILD_URL}\n${buildFailure}!" + if(env.SNS_TOPIC_BUILD_FAILURE) { + message_json = ["build_url":env.BUILD_URL, "repository_name":env.REPOSITORY_NAME, "branch_name":env.BRANCH_NAME, "build_failure":buildFailure] + snsPublish( + topicArn: env.SNS_TOPIC_BUILD_FAILURE, + subject:'Build Failure', + message:JsonOutput.toJson(message_json) + ) + } } emailext ( body: "${emailBody}", From 553cf52c86cd723bdcbcc47589bda1da46881f71 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 31 Aug 2021 18:03:06 -0700 Subject: [PATCH 068/355] some install fixes, now I dont see the INSTALL target on projects using the prebuilt-SDK Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- CMakeLists.txt | 2 +- Code/LauncherUnified/CMakeLists.txt | 1 + cmake/3rdParty.cmake | 16 +++------------- cmake/Install.cmake | 15 ++++++++++++++- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a668af6a1..43b0dd240e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -132,7 +132,7 @@ ly_delayed_generate_runtime_dependencies() ly_test_impact_post_step() # 7. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine -if(NOT INSTALLED_ENGINE) +if(LY_INSTALL_ENABLED) # 8. Generate the O3DE find file and setup install locations for scripts, tools, assets etc., required by the engine ly_setup_o3de_install() # 9. CPack information (to be included after install) diff --git a/Code/LauncherUnified/CMakeLists.txt b/Code/LauncherUnified/CMakeLists.txt index c3d152a777..845c2cd6c7 100644 --- a/Code/LauncherUnified/CMakeLists.txt +++ b/Code/LauncherUnified/CMakeLists.txt @@ -111,6 +111,7 @@ ly_install_directory( Platform/${PAL_PLATFORM_NAME} Platform/Common DESTINATION LauncherGenerator/Platform + VERBATIM ) ly_install_files( FILES FindLauncherGenerator.cmake diff --git a/cmake/3rdParty.cmake b/cmake/3rdParty.cmake index cd72faa78d..4599c282f0 100644 --- a/cmake/3rdParty.cmake +++ b/cmake/3rdParty.cmake @@ -306,20 +306,10 @@ endfunction() function(ly_install_external_target 3RDPARTY_ROOT_DIRECTORY) # Install the Find file to our /cmake directory - install(FILES ${CMAKE_CURRENT_LIST_FILE} - DESTINATION cmake + ly_install_files(FILES ${CMAKE_CURRENT_LIST_FILE} + DESTINATION cmake/3rdParty ) - - # We only want to install external targets that are part of our source tree - # Checking for relative path beginning with "../" also works when the path - # given is on another drive letter on windows(i.e., RELATIVE_PATH returns an absolute path) - file(RELATIVE_PATH rel_path ${CMAKE_SOURCE_DIR} ${3RDPARTY_ROOT_DIRECTORY}) - if (NOT ${rel_path} MATCHES "^../") - get_filename_component(rel_path ${rel_path} DIRECTORY) - install(DIRECTORY ${3RDPARTY_ROOT_DIRECTORY} - DESTINATION ${rel_path} - ) - endif() + ly_install_directory(DIRECTORIES ${3RDPARTY_ROOT_DIRECTORY}) endfunction() diff --git a/cmake/Install.cmake b/cmake/Install.cmake index 34f316e31e..b71b01eb7d 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -6,7 +6,12 @@ # # -if(NOT INSTALLED_ENGINE) +ly_set(LY_INSTALL_ENABLED TRUE) +if(INSTALLED_ENGINE) + ly_set(LY_INSTALL_ENABLED FALSE) +endif() + +if(LY_INSTALL_ENABLED) ly_get_absolute_pal_filename(pal_dir ${CMAKE_CURRENT_SOURCE_DIR}/cmake/Platform/${PAL_PLATFORM_NAME}) include(${pal_dir}/Install_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) endif() @@ -27,6 +32,10 @@ endif() # function(ly_install_directory) + if(NOT LY_INSTALL_ENABLED) + return() + endif() + set(options VERBATIM) set(oneValueArgs DESTINATION) set(multiValueArgs DIRECTORIES EXCLUDE_PATTERNS) @@ -91,6 +100,10 @@ endfunction() # function(ly_install_files) + if(NOT LY_INSTALL_ENABLED) + return() + endif() + set(options PROGRAMS) set(oneValueArgs DESTINATION) set(multiValueArgs FILES) From f277cf59dc87fb6c13ca16753dd588fb93179054 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Tue, 31 Aug 2021 18:38:39 -0700 Subject: [PATCH 069/355] multi threaded fix for upgrader Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Tools/UpgradeTool/VersionExplorer.cpp | 96 +++++++++++-------- .../Tools/UpgradeTool/VersionExplorer.h | 8 +- 2 files changed, 60 insertions(+), 44 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index 0d7efa5e41..f7ff59978c 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -185,6 +185,50 @@ namespace ScriptCanvasEditor break; case ProcessState::Upgrade: + { + AZStd::lock_guard lock(m_mutex); + if (m_upgradeComplete) + { + m_inProgress = false; + + if (m_scriptCanvasEntity) + { + m_scriptCanvasEntity->Deactivate(); + m_scriptCanvasEntity = nullptr; + } + + GraphUpgradeCompleteUIUpdate(m_upgradeAsset, m_upgradeResult, m_upgradeMessage); + + if (!m_isUpgradingSingleGraph) + { + if (m_inProgressAsset != m_assetsToUpgrade.end()) + { + m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset); + } + + if (m_inProgressAsset == m_assetsToUpgrade.end()) + { + FinalizeUpgrade(); + } + } + else + { + m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset); + m_inProgress = false; + m_state = ProcessState::Inactive; + AZ::SystemTickBus::Handler::BusDisconnect(); + AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); + } + + m_isUpgradingSingleGraph = false; + + if (m_assetsToUpgrade.empty()) + { + m_ui->upgradeAllButton->setEnabled(false); + } + + m_upgradeComplete = false; + } if (!IsUpgrading()) { @@ -215,7 +259,7 @@ namespace ScriptCanvasEditor } break; - + } default: break; } @@ -329,7 +373,7 @@ namespace ScriptCanvasEditor void VersionExplorer::UpgradeGraph(const AZ::Data::Asset& asset) { m_inProgress = true; - + m_upgradeComplete = false; Log("UpgradeGraph %s ", m_inProgressAsset->GetHint().c_str()); m_ui->spinner->SetText(QObject::tr("Upgrading: %1").arg(asset.GetHint().c_str())); m_scriptCanvasEntity = nullptr; @@ -492,7 +536,7 @@ namespace ScriptCanvasEditor }); } - void VersionExplorer::PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target + void VersionExplorer::PerformMove(AZ::Data::Asset asset, AZStd::string source, AZStd::string target , size_t remainingAttempts) { VersionExplorerCpp::FileEventHandler fileEventHandler; @@ -508,7 +552,7 @@ namespace ScriptCanvasEditor auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCaches(); streamer->SetRequestCompleteCallback(flushRequest - , [this, asset, remainingAttempts, &source, &target]([[maybe_unused]] AZ::IO::FileRequestHandle request) + , [this, asset, remainingAttempts, source, target]([[maybe_unused]] AZ::IO::FileRequestHandle request) { // Continue saving. AZ::SystemTickBus::QueueFunction( @@ -535,7 +579,7 @@ namespace ScriptCanvasEditor AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s, trying again", target.c_str()); auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); - streamer->SetRequestCompleteCallback(flushRequest, [this, asset, &source, &target, remainingAttempts]([[maybe_unused]] AZ::IO::FileRequestHandle request) + streamer->SetRequestCompleteCallback(flushRequest, [this, asset, source, target, remainingAttempts]([[maybe_unused]] AZ::IO::FileRequestHandle request) { // Continue saving. AZ::SystemTickBus::QueueFunction([this, asset, source, target, remainingAttempts]() { PerformMove(asset, source, target, remainingAttempts - 1); }); @@ -548,43 +592,11 @@ namespace ScriptCanvasEditor void VersionExplorer::GraphUpgradeComplete (const AZ::Data::Asset asset, OperationResult result, AZStd::string_view message) { - m_inProgress = false; - - if (m_scriptCanvasEntity) - { - m_scriptCanvasEntity->Deactivate(); - m_scriptCanvasEntity = nullptr; - } - - GraphUpgradeCompleteUIUpdate(asset, result, message); - - if (!m_isUpgradingSingleGraph) - { - if (m_inProgressAsset != m_assetsToUpgrade.end()) - { - m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset); - } - - if (m_inProgressAsset == m_assetsToUpgrade.end()) - { - FinalizeUpgrade(); - } - } - else - { - m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset); - m_inProgress = false; - m_state = ProcessState::Inactive; - AZ::SystemTickBus::Handler::BusDisconnect(); - AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); - } - - m_isUpgradingSingleGraph = false; - - if (m_assetsToUpgrade.empty()) - { - m_ui->upgradeAllButton->setEnabled(false); - } + AZStd::lock_guard lock(m_mutex); + m_upgradeComplete = true; + m_upgradeResult = result; + m_upgradeMessage = message; + m_upgradeAsset = asset; } void VersionExplorer::GraphUpgradeCompleteUIUpdate diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index 78f4f26e95..02476c4126 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -84,7 +84,7 @@ namespace ScriptCanvasEditor Inactive, Backup, Scan, - Upgrade + Upgrade, }; ProcessState m_state = ProcessState::Inactive; @@ -135,6 +135,10 @@ namespace ScriptCanvasEditor AZStd::unique_ptr m_ui; AZStd::recursive_mutex m_mutex; + bool m_upgradeComplete = false; + AZ::Data::Asset m_upgradeAsset; + OperationResult m_upgradeResult; + AZStd::string m_upgradeMessage; AZStd::unique_ptr m_keepEditorAlive; @@ -163,7 +167,7 @@ namespace ScriptCanvasEditor void closeEvent(QCloseEvent* event) override; bool m_overwriteAll = false; - void PerformMove(AZ::Data::Asset asset, const AZStd::string& source, const AZStd::string& target, size_t remainingAttempts); + void PerformMove(AZ::Data::Asset asset, AZStd::string source, AZStd::string target, size_t remainingAttempts); void Log(const char* format, ...); }; From 2d45a6b4cb3808cbe3e9d98b0ed62e8b920879f0 Mon Sep 17 00:00:00 2001 From: AMZN-Igarri <82394219+AMZN-Igarri@users.noreply.github.com> Date: Wed, 1 Sep 2021 10:39:44 +0200 Subject: [PATCH 070/355] [Experimental] Asset Picker Flatten View (#3589) * Adding Asset Browser Table View to AssetPicker Signed-off-by: igarri * Adding connections Signed-off-by: igarri * Adding CVar to hide/show path column Signed-off-by: igarri * Added Feedback from codereview Signed-off-by: igarri * Changed m_showColumn name to m_ShownColumns Signed-off-by: igarri --- .../AzAssetBrowser/AzAssetBrowserWindow.cpp | 1 + .../AssetBrowser/AssetBrowserFilterModel.cpp | 6 +- .../AssetBrowser/AssetBrowserFilterModel.h | 10 +-- .../AssetBrowser/AssetBrowserTableModel.cpp | 5 +- .../AssetBrowser/AssetBrowserTableModel.h | 3 +- .../AssetPicker/AssetPickerDialog.cpp | 67 ++++++++++++++++++- .../AssetPicker/AssetPickerDialog.h | 2 + .../AssetPicker/AssetPickerDialog.ui | 8 +++ .../Views/AssetBrowserTableView.h | 1 - .../Model/UnitTestBrowserFilterModel.cpp | 2 +- 10 files changed, 89 insertions(+), 16 deletions(-) diff --git a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp index c54fe60c4d..18946c7874 100644 --- a/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp +++ b/Code/Editor/AzAssetBrowser/AzAssetBrowserWindow.cpp @@ -90,6 +90,7 @@ AzAssetBrowserWindow::AzAssetBrowserWindow(QWidget* parent) m_tableModel->setFilterRole(Qt::DisplayRole); m_tableModel->setSourceModel(m_filterModel.data()); + m_tableModel->setDynamicSortFilter(true); m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.data()); connect( diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.cpp index 0601a34cf5..acf935e6dc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.cpp @@ -31,10 +31,10 @@ namespace AzToolsFramework AssetBrowserFilterModel::AssetBrowserFilterModel(QObject* parent) : QSortFilterProxyModel(parent) { - m_showColumn.insert(aznumeric_cast(AssetBrowserEntry::Column::DisplayName)); + m_shownColumns.insert(aznumeric_cast(AssetBrowserEntry::Column::DisplayName)); if (ed_useNewAssetBrowserTableView) { - m_showColumn.insert(aznumeric_cast(AssetBrowserEntry::Column::Path)); + m_shownColumns.insert(aznumeric_cast(AssetBrowserEntry::Column::Path)); } m_collator.setNumericMode(true); AssetBrowserComponentNotificationBus::Handler::BusConnect(); @@ -96,7 +96,7 @@ namespace AzToolsFramework bool AssetBrowserFilterModel::filterAcceptsColumn(int source_column, const QModelIndex&) const { //if the column is in the set we want to show it - return m_showColumn.find(source_column) != m_showColumn.end(); + return m_shownColumns.find(source_column) != m_shownColumns.end(); } bool AssetBrowserFilterModel::lessThan(const QModelIndex& source_left, const QModelIndex& source_right) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h index 2b91158f0e..5d3ad0e1b0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h @@ -27,6 +27,8 @@ namespace AzToolsFramework { namespace AssetBrowser { + using ShownColumnsSet = AZStd::fixed_unordered_set(AssetBrowserEntry::Column::Count)>; + class AssetBrowserFilterModel : public QSortFilterProxyModel , public AssetBrowserComponentNotificationBus::Handler @@ -61,11 +63,11 @@ namespace AzToolsFramework void filterUpdatedSlot(); protected: - //set for filtering columns - //if the column is in the set the column is not filtered and is shown - AZStd::fixed_unordered_set(AssetBrowserEntry::Column::Count)> m_showColumn; + // Set for filtering columns + // If the column is in the set the column is not filtered and is shown + ShownColumnsSet m_shownColumns; bool m_alreadyRecomputingFilters = false; - //asset source name match filter + //Asset source name match filter FilterConstType m_filter; AZ_PUSH_DISABLE_WARNING(4251, "-Wunknown-warning-option") // 4251: class '...' needs to have dll-interface to be used by clients of class '...' QWeakPointer m_stringFilter; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp index d0999c5c56..fdbd4287ce 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.cpp @@ -16,7 +16,6 @@ namespace AzToolsFramework AssetBrowserTableModel::AssetBrowserTableModel(QObject* parent /* = nullptr */) : QSortFilterProxyModel(parent) { - setDynamicSortFilter(false); } void AssetBrowserTableModel::setSourceModel(QAbstractItemModel* sourceModel) @@ -47,7 +46,7 @@ namespace AzToolsFramework QModelIndex AssetBrowserTableModel::mapToSource(const QModelIndex& proxyIndex) const { - Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() == this); + Q_ASSERT(!proxyIndex.isValid() || proxyIndex.model() != this); if (!proxyIndex.isValid() || !m_indexMap.contains(proxyIndex.row())) { return QModelIndex(); @@ -132,7 +131,7 @@ namespace AzToolsFramework { QModelIndex index = model->index(currentRow, 0, parent); AssetBrowserEntry* entry = GetAssetEntry(m_filterModel->mapToSource(index)); - // We only want to see the source assets. + // We only want to see source and product assets. if (entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Source || entry->GetEntryType() == AssetBrowserEntry::AssetEntryType::Product) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h index 04559fbfbc..55dcbb1532 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserTableModel.h @@ -21,8 +21,7 @@ namespace AzToolsFramework class AssetBrowserFilterModel; class AssetBrowserEntry; - class AssetBrowserTableModel - : public QSortFilterProxyModel + class AssetBrowserTableModel : public QSortFilterProxyModel { Q_OBJECT diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp index 11e1ba018f..76b634b51e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.cpp @@ -9,9 +9,11 @@ #include #include +#include #include #include +#include #include #include #include @@ -26,6 +28,11 @@ AZ_PUSH_DISABLE_WARNING(4251 4244, "-Wunknown-warning-option") // disable warnin #include AZ_POP_DISABLE_WARNING +AZ_CVAR( + bool, ed_hideAssetPickerPathColumn, false, nullptr, AZ::ConsoleFunctorFlags::Null, + "Hide AssetPicker path column for a clearer view."); +AZ_CVAR_EXTERNED(bool, ed_useNewAssetBrowserTableView); + namespace AzToolsFramework { namespace AssetBrowser @@ -34,6 +41,7 @@ namespace AzToolsFramework : QDialog(parent) , m_ui(new Ui::AssetPickerDialogClass()) , m_filterModel(new AssetBrowserFilterModel(parent)) + , m_tableModel(new AssetBrowserTableModel(parent)) , m_selection(selection) , m_hasFilter(false) { @@ -97,6 +105,56 @@ namespace AzToolsFramework m_persistentState = AZ::UserSettings::CreateFind(AZ::Crc32(("AssetBrowserTreeView_Dialog_" + name).toUtf8().data()), AZ::UserSettings::CT_GLOBAL); + m_ui->m_assetBrowserTableViewWidget->setVisible(false); + if (ed_useNewAssetBrowserTableView) + { + m_ui->m_assetBrowserTreeViewWidget->setVisible(false); + m_ui->m_assetBrowserTableViewWidget->setVisible(true); + m_tableModel->setSourceModel(m_filterModel.get()); + m_ui->m_assetBrowserTableViewWidget->setModel(m_tableModel.get()); + + m_ui->m_assetBrowserTableViewWidget->SetName("AssetBrowserTableView_" + name); + m_ui->m_assetBrowserTableViewWidget->setDragEnabled(false); + m_ui->m_assetBrowserTableViewWidget->setSelectionMode( + selection.GetMultiselect() ? QAbstractItemView::SelectionMode::ExtendedSelection + : QAbstractItemView::SelectionMode::SingleSelection); + + if (ed_hideAssetPickerPathColumn) + { + m_ui->m_assetBrowserTableViewWidget->hideColumn(1); + } + + // if the current selection is invalid, disable the Ok button + m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(EvaluateSelection()); + + connect( + m_filterModel.data(), &AssetBrowserFilterModel::filterChanged, this, + [this]() + { + m_tableModel->UpdateTableModelMaps(); + }); + + connect( + m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::selectionChangedSignal, this, + [this](const QItemSelection&, const QItemSelection&) + { + AssetPickerDialog::SelectionChangedSlot(); + }); + + connect(m_ui->m_assetBrowserTableViewWidget, &QAbstractItemView::doubleClicked, this, &AssetPickerDialog::DoubleClickedSlot); + + connect( + m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::ClearStringFilter, m_ui->m_searchWidget, + &SearchWidget::ClearStringFilter); + + connect( + m_ui->m_assetBrowserTableViewWidget, &AssetBrowserTableView::ClearTypeFilter, m_ui->m_searchWidget, + &SearchWidget::ClearTypeFilter); + + m_ui->m_assetBrowserTableViewWidget->SetName("AssetBrowserTableView_main"); + m_tableModel->UpdateTableModelMaps(); + } + QTimer::singleShot(0, this, &AssetPickerDialog::RestoreState); SelectionChangedSlot(); } @@ -134,6 +192,7 @@ namespace AzToolsFramework { m_ui->m_assetBrowserTreeViewWidget->expandAll(); }); + m_tableModel->UpdateTableModelMaps(); } if (m_hasFilter && !hasFilter) @@ -166,7 +225,8 @@ namespace AzToolsFramework bool AssetPickerDialog::EvaluateSelection() const { - auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets(); + auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->isVisible() ? m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets() + : m_ui->m_assetBrowserTableViewWidget->GetSelectedAssets(); // exactly one item must be selected, even if multi-select option is disabled, still good practice to check if (selectedAssets.empty()) { @@ -197,7 +257,10 @@ namespace AzToolsFramework void AssetPickerDialog::UpdatePreview() const { - auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets(); + auto selectedAssets = m_ui->m_assetBrowserTreeViewWidget->isVisible() + ? m_ui->m_assetBrowserTreeViewWidget->GetSelectedAssets() + : m_ui->m_assetBrowserTableViewWidget->GetSelectedAssets(); + ; if (selectedAssets.size() != 1) { m_ui->m_previewerFrame->Clear(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h index 89eca2f4e3..bab265c134 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.h @@ -33,6 +33,7 @@ namespace AzToolsFramework { class ProductAssetBrowserEntry; class AssetBrowserFilterModel; + class AssetBrowserTableModel; class AssetBrowserModel; class AssetSelectionModel; @@ -69,6 +70,7 @@ namespace AzToolsFramework QScopedPointer m_ui; AssetBrowserModel* m_assetBrowserModel = nullptr; QScopedPointer m_filterModel; + QScopedPointer m_tableModel; AssetSelectionModel& m_selection; bool m_hasFilter; AZStd::unique_ptr m_filterStateSaver; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui index 3dd0c0d861..b11ffb3990 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetPicker/AssetPickerDialog.ui @@ -142,6 +142,9 @@ + + + @@ -197,6 +200,11 @@
AzToolsFramework/AssetBrowser/Previewer/PreviewerFrame.h
1 + + AzToolsFramework::AssetBrowser::AssetBrowserTableView + QTableView +
AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h
+
diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h index e5426037bf..5fbdab2ec5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTableView.h @@ -53,7 +53,6 @@ namespace AzToolsFramework // AssetBrowserComponentNotificationBus void OnAssetBrowserComponentReady() override; ////////////////////////////////////////////////////////////////////////// - Q_SIGNALS: void selectionChangedSignal(const QItemSelection& selected, const QItemSelection& deselected); void ClearStringFilter(); diff --git a/Gems/ScriptCanvas/Code/Editor/Model/UnitTestBrowserFilterModel.cpp b/Gems/ScriptCanvas/Code/Editor/Model/UnitTestBrowserFilterModel.cpp index ab35ec5049..e3fe865e94 100644 --- a/Gems/ScriptCanvas/Code/Editor/Model/UnitTestBrowserFilterModel.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Model/UnitTestBrowserFilterModel.cpp @@ -28,7 +28,7 @@ namespace ScriptCanvasEditor { setDynamicSortFilter(true); - m_showColumn.insert(aznumeric_cast(AssetBrowserEntry::Column::DisplayName)); + m_shownColumns.insert(aznumeric_cast(AssetBrowserEntry::Column::DisplayName)); UnitTestWidgetNotificationBus::Handler::BusConnect(); From 564925c2855e4ec3cfef420b52e0a7b06ecdee6b Mon Sep 17 00:00:00 2001 From: moraaar Date: Wed, 1 Sep 2021 09:43:47 +0100 Subject: [PATCH 071/355] Fix assert: Avoid doing operations over invalid Aabb (#3757) Signed-off-by: moraaar --- .../Code/Source/Mesh/MeshComponentController.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp index ade4beaa33..9e0c285001 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.cpp @@ -578,15 +578,14 @@ namespace AZ { if (m_meshHandle.IsValid() && m_meshFeatureProcessor) { - Aabb aabb = m_meshFeatureProcessor->GetLocalAabb(m_meshHandle); + if (Aabb aabb = m_meshFeatureProcessor->GetLocalAabb(m_meshHandle); aabb.IsValid()) + { + aabb.MultiplyByScale(m_cachedNonUniformScale); + return aabb; + } + } - aabb.MultiplyByScale(m_cachedNonUniformScale); - return aabb; - } - else - { - return Aabb::CreateNull(); - } + return Aabb::CreateNull(); } AzFramework::RenderGeometry::RayResult MeshComponentController::RenderGeometryIntersect( From 26241e95ac86d2401e502aaa2b4206439ddf554f Mon Sep 17 00:00:00 2001 From: Allen Jackson <23512001+jackalbe@users.noreply.github.com> Date: Wed, 1 Sep 2021 08:18:38 -0500 Subject: [PATCH 072/355] {LYN2076} Add Material data types Behavior for the scene graph (#3605) * {LYN2076} Add Material data types Behavior for the scene graph Adding behavior to expose GraphData MaterialData to Python scripts so that scripters can read in the material properties from a scene graph Signed-off-by: jackalbe <23512001+jackalbe@users.noreply.github.com> * new warning fixed in code Signed-off-by: Jackson <23512001+jackalbe@users.noreply.github.com> --- .../SceneData/GraphData/MaterialData.cpp | 83 +++++++++++++++++++ .../GraphData/GraphDataBehaviorTests.cpp | 79 +++++++++++++++++- 2 files changed, 161 insertions(+), 1 deletion(-) diff --git a/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp b/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp index d58a89a110..117a1196f8 100644 --- a/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp +++ b/Code/Tools/SceneAPI/SceneData/GraphData/MaterialData.cpp @@ -230,6 +230,19 @@ namespace AZ return m_uniqueId; } + namespace Helper + { + template + T ReturnOptionalValue(AZStd::optional value) + { + if (!value) + { + return {}; + } + return value.value(); + } + } + void MaterialData::Reflect(ReflectContext* context) { SerializeContext* serializeContext = azrtti_cast(context); @@ -285,6 +298,76 @@ namespace AZ ->DataElement(AZ::Edit::UIHandlers::Default, &MaterialData::m_useAOMap, "Use Ambient Occlusion Map", "True to use an ambient occlusion map, false to ignore it."); } } + + BehaviorContext* behaviorContext = azrtti_cast(context); + if (behaviorContext) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene"); + + using namespace Helper; + using DataTypes::IMaterialData; + + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "scene") + ->Constant("AmbientOcclusion", BehaviorConstant(TextureMapType::AmbientOcclusion)) + ->Constant("BaseColor", BehaviorConstant(TextureMapType::BaseColor)) + ->Constant("Bump", BehaviorConstant(TextureMapType::Bump)) + ->Constant("Diffuse", BehaviorConstant(TextureMapType::Diffuse)) + ->Constant("Emissive", BehaviorConstant(TextureMapType::Emissive)) + ->Constant("Metallic", BehaviorConstant(TextureMapType::Metallic)) + ->Constant("Normal", BehaviorConstant(TextureMapType::Normal)) + ->Constant("Roughness", BehaviorConstant(TextureMapType::Roughness)) + ->Constant("Specular", BehaviorConstant(TextureMapType::Specular)) + ->Method("GetTexture", &MaterialData::GetTexture) + ->Method("GetMaterialName", &MaterialData::GetMaterialName) + ->Method("IsNoDraw", &MaterialData::IsNoDraw) + ->Method("GetDiffuseColor", &MaterialData::GetDiffuseColor) + ->Method("GetSpecularColor", &MaterialData::GetSpecularColor) + ->Method("GetEmissiveColor", &MaterialData::GetEmissiveColor) + ->Method("GetOpacity", &MaterialData::GetOpacity) + ->Method("GetUniqueId", &MaterialData::GetUniqueId) + ->Method("GetShininess", &MaterialData::GetShininess) + ->Method("GetUseColorMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseColorMap()); + }) + ->Method("GetBaseColor", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetBaseColor()); + }) + ->Method("GetUseMetallicMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseMetallicMap()); + }) + ->Method("GetMetallicFactor", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetMetallicFactor()); + }) + ->Method("GetUseRoughnessMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseRoughnessMap()); + }) + ->Method("GetRoughnessFactor", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetRoughnessFactor()); + }) + ->Method("GetUseEmissiveMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseEmissiveMap()); + }) + ->Method("GetEmissiveIntensity", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetEmissiveIntensity()); + }) + ->Method("GetUseAOMap", [](const MaterialData& self) + { + return ReturnOptionalValue(self.GetUseAOMap()); + }); + } } } // namespace GraphData } // namespace SceneData diff --git a/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp b/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp index ab0fa79e62..4a2d206cc7 100644 --- a/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp +++ b/Code/Tools/SceneAPI/SceneData/Tests/GraphData/GraphDataBehaviorTests.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -27,6 +28,7 @@ #include #include #include +#include namespace AZ { @@ -145,6 +147,38 @@ namespace AZ blendShapeData->SetVertexIndexToControlPointIndexMap(2, 0); return true; } + else if (data.get_type_info().m_id == azrtti_typeid()) + { + auto* materialDataData = AZStd::any_cast(&data); + materialDataData->SetBaseColor(AZStd::make_optional(AZ::Vector3(0.1, 0.2, 0.3))); + materialDataData->SetDiffuseColor({ 0.3, 0.4, 0.5 }); + materialDataData->SetEmissiveColor({ 0.4, 0.5, 0.6 }); + materialDataData->SetEmissiveIntensity(AZStd::make_optional(0.789f)); + materialDataData->SetMaterialName("TestMaterialName"); + materialDataData->SetMetallicFactor(AZStd::make_optional(0.123f)); + materialDataData->SetNoDraw(true); + materialDataData->SetOpacity(0.7); + materialDataData->SetRoughnessFactor(AZStd::make_optional(0.456f)); + materialDataData->SetShininess(1.23); + materialDataData->SetSpecularColor({ 0.8, 0.9, 1.0 }); + materialDataData->SetUseAOMap(AZStd::make_optional(true)); + materialDataData->SetUseColorMap(AZStd::make_optional(true)); + materialDataData->SetUseMetallicMap(AZStd::make_optional(true)); + materialDataData->SetUseRoughnessMap(AZStd::make_optional(true)); + materialDataData->SetUseEmissiveMap(AZStd::make_optional(true)); + materialDataData->SetUniqueId(102938); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::AmbientOcclusion, "ambientocclusion"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::BaseColor, "basecolor"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Bump, "bump"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Diffuse, "diffuse"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Emissive, "emissive"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Metallic, "metallic"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Normal, "normal"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Roughness, "roughness"); + materialDataData->SetTexture(AZ::SceneAPI::DataTypes::IMaterialData::TextureMapType::Specular, "specular"); + return true; + } + return false; } @@ -337,7 +371,7 @@ namespace AZ ExpectExecute("TestExpectFloatEquals(tangentData.z, 0.19)"); ExpectExecute("TestExpectFloatEquals(tangentData.w, 0.29)"); ExpectExecute("TestExpectIntegerEquals(meshVertexTangentData:GetTangentSetIndex(), 2)"); - ExpectExecute("TestExpectTrue(meshVertexTangentData:GetGenerationMethod(), MeshVertexTangentData.EMotionFX)"); + ExpectExecute("TestExpectTrue(meshVertexTangentData:GetGenerationMethod(), MeshVertexTangentData.MikkT)"); } TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_AnimationData_AccessWorks) @@ -449,6 +483,49 @@ namespace AZ ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).y, 0.3)"); ExpectExecute("TestExpectFloatEquals(blendShapeData:GetBitangent(2).z, 0.4)"); } + + TEST_F(GrapDatahBehaviorScriptTest, SceneGraph_MaterialData_AccessWorks) + { + ExpectExecute("materialData = MaterialData()"); + ExpectExecute("TestExpectTrue(materialData ~= nil)"); + ExpectExecute("TestExpectTrue(materialData:IsNoDraw() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseColorMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseMetallicMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseRoughnessMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseEmissiveMap() == false)"); + ExpectExecute("TestExpectTrue(materialData:GetUseAOMap() == false)"); + ExpectExecute("MockGraphData.FillData(materialData)"); + ExpectExecute("TestExpectTrue(materialData:IsNoDraw())"); + ExpectExecute("TestExpectTrue(materialData:GetUseColorMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseMetallicMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseRoughnessMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseEmissiveMap())"); + ExpectExecute("TestExpectTrue(materialData:GetUseAOMap())"); + ExpectExecute("TestExpectFloatEquals(materialData:GetMetallicFactor(), 0.123)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetRoughnessFactor(), 0.456)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveIntensity(), 0.789)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetOpacity(), 0.7)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetShininess(), 1.23)"); + ExpectExecute("TestExpectTrue(materialData:GetMaterialName() == 'TestMaterialName')"); + ExpectExecute("TestExpectFloatEquals(materialData:GetBaseColor().x, 0.1)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetBaseColor().y, 0.2)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetBaseColor().z, 0.3)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetDiffuseColor().x, 0.3)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetDiffuseColor().y, 0.4)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetDiffuseColor().z, 0.5)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveColor().x, 0.4)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveColor().y, 0.5)"); + ExpectExecute("TestExpectFloatEquals(materialData:GetEmissiveColor().z, 0.6)"); + ExpectExecute("TestExpectIntegerEquals(materialData:GetUniqueId(), 102938)"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.AmbientOcclusion) == 'ambientocclusion')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Bump) == 'bump')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Diffuse) == 'diffuse')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Emissive) == 'emissive')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Metallic) == 'metallic')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Normal) == 'normal')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Roughness) == 'roughness')"); + ExpectExecute("TestExpectTrue(materialData:GetTexture(MaterialData.Specular) == 'specular')"); + } } } } From af9fbc9ae9cf3802f2f5a4c0cb2a2072f22ce4c8 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 1 Sep 2021 07:46:39 -0700 Subject: [PATCH 073/355] this fixes it, but we need to be able to set it properly with a cache variable instead Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/OutputDirectory.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/OutputDirectory.cmake b/cmake/OutputDirectory.cmake index 116ddfbecc..3b8e1b90eb 100644 --- a/cmake/OutputDirectory.cmake +++ b/cmake/OutputDirectory.cmake @@ -14,4 +14,4 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build dir # We install outside of the binary dir because our install support muliple platforms to # be installed together. We also have an exclusion rule in the AP that filters out the # "build" folder which is a common binary dir -set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "Installation prefix") +ly_set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install) From 2d2a7f4623655d52df98d4a0fc50c915f47f07d9 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 1 Sep 2021 08:19:08 -0700 Subject: [PATCH 074/355] XCode doesnt support files per configuration, using the old method (#3789) - some warn fixes - fixed release linking issue Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/IEditorImpl.cpp | 8 --- .../AzFramework/API/ApplicationAPI.h | 3 - Code/Legacy/CryCommon/AppleSpecific.h | 4 -- Code/Legacy/CryCommon/IConsole.h | 4 -- .../AssetProcessingStateDataUnitTests.cpp | 7 +-- .../native/utilities/assetUtils.cpp | 3 - .../Animation/UiAnimViewCurveEditor.cpp | 2 +- .../Editor/Animation/UiAnimViewDialog.cpp | 2 +- .../Animation/UiAnimViewDopeSheetBase.cpp | 2 +- .../Code/Editor/Animation/UiAnimViewNodes.cpp | 2 +- .../Editor/Animation/UiAnimViewSplineCtrl.cpp | 2 +- cmake/LYWrappers.cmake | 58 ++++++++++++------- 12 files changed, 43 insertions(+), 54 deletions(-) diff --git a/Code/Editor/IEditorImpl.cpp b/Code/Editor/IEditorImpl.cpp index 8f4abae9dd..880773966b 100644 --- a/Code/Editor/IEditorImpl.cpp +++ b/Code/Editor/IEditorImpl.cpp @@ -84,12 +84,6 @@ AZ_POP_DISABLE_WARNING #include "IEditorPanelUtils.h" #include "EditorPanelUtils.h" - -// even in Release mode, the editor will return its heap, because there's no Profile build configuration for the editor -#ifdef _RELEASE -#undef _RELEASE -#endif - #include "Core/QtEditorApplication.h" // for Editor::EditorQtApplication static CCryEditDoc * theDocument; @@ -104,8 +98,6 @@ static CCryEditDoc * theDocument; #define VERIFY(EXPRESSION) { auto e = EXPRESSION; assert(e); } #endif -#undef GetCommandLine - const char* CEditorImpl::m_crashLogFileName = "SessionStatus/editor_statuses.json"; CEditorImpl::CEditorImpl() diff --git a/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h b/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h index 11778b9239..dbbf443656 100644 --- a/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h +++ b/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h @@ -72,11 +72,8 @@ namespace AzFramework /// Retrieves the app root path for the application. virtual const char* GetAppRoot() const { return nullptr; } -#pragma push_macro("GetCommandLine") -#undef GetCommandLine /// Get the Command Line arguments passed in. virtual const CommandLine* GetCommandLine() { return nullptr; } -#pragma pop_macro("GetCommandLine") /// Get the Command Line arguments passed in. (Avoids collisions with platform specific macros.) virtual const CommandLine* GetApplicationCommandLine() { return nullptr; } diff --git a/Code/Legacy/CryCommon/AppleSpecific.h b/Code/Legacy/CryCommon/AppleSpecific.h index 60ab80ade6..e4c4fadb89 100644 --- a/Code/Legacy/CryCommon/AppleSpecific.h +++ b/Code/Legacy/CryCommon/AppleSpecific.h @@ -13,10 +13,6 @@ #define CRYINCLUDE_CRYCOMMON_APPLESPECIFIC_H #pragma once -#if defined(__clang__) -#pragma diagnostic ignore "-W#pragma-messages" -#endif - ////////////////////////////////////////////////////////////////////////// // Standard includes. ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/IConsole.h b/Code/Legacy/CryCommon/IConsole.h index dcbb0399aa..f68a82f9dc 100644 --- a/Code/Legacy/CryCommon/IConsole.h +++ b/Code/Legacy/CryCommon/IConsole.h @@ -118,10 +118,6 @@ struct IConsoleVarSink // }; -#if defined(GetCommandLine) -#undef GetCommandLine -#endif - // Interface to the arguments of the console command. struct IConsoleCmdArgs { diff --git a/Code/Tools/AssetProcessor/native/unittests/AssetProcessingStateDataUnitTests.cpp b/Code/Tools/AssetProcessor/native/unittests/AssetProcessingStateDataUnitTests.cpp index 1c9e29c4e8..e19b95a76b 100644 --- a/Code/Tools/AssetProcessor/native/unittests/AssetProcessingStateDataUnitTests.cpp +++ b/Code/Tools/AssetProcessor/native/unittests/AssetProcessingStateDataUnitTests.cpp @@ -715,12 +715,7 @@ void AssetProcessingStateDataUnitTest::DataTest(AssetProcessor::AssetDatabaseCon //try retrieving this source by id UNIT_TEST_EXPECT_TRUE(stateData->GetJobByJobID(job.m_jobID, job)); - if (job.m_jobID == AzToolsFramework::AssetDatabase::InvalidEntryId || - job.m_jobID != job.m_jobID || - job.m_sourcePK != job.m_sourcePK || - job.m_jobKey != job.m_jobKey || - job.m_fingerprint != job.m_fingerprint || - job.m_platform != job.m_platform) + if (job.m_jobID == AzToolsFramework::AssetDatabase::InvalidEntryId) { Q_EMIT UnitTestFailed("AssetProcessingStateDataTest Failed - GetJobByJobID failed"); return; diff --git a/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp b/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp index 7292990a72..85801bdf8a 100644 --- a/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp @@ -57,9 +57,6 @@ #include -// windows headers bring in a macro which conflicts GetCommandLine -#undef GetCommandLine - namespace AssetUtilsInternal { static const unsigned int g_RetryWaitInterval = 250; // The amount of time that we are waiting for retry. diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.cpp index 51209c7f02..d677acea02 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.cpp @@ -8,7 +8,7 @@ #include "EditorDefs.h" -#include "Resource.h" +#include "Editor/Resource.h" #include "UiEditorAnimationBus.h" #include "UiAnimViewCurveEditor.h" diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.cpp index a9f76cd443..e6c2dda74c 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.cpp @@ -15,7 +15,7 @@ // ----- End UI_ANIMATION_REVISIT #include "EditorDefs.h" -#include "Resource.h" +#include "Editor/Resource.h" #include "UiAnimViewDialog.h" diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.cpp index 8672f539bf..9f67503b73 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.cpp @@ -8,7 +8,7 @@ #include "EditorDefs.h" -#include "Resource.h" +#include "Editor/Resource.h" #include "UiEditorAnimationBus.h" #include "UiAnimViewDopeSheetBase.h" diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewNodes.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewNodes.cpp index 472100b334..a3aa330dca 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewNodes.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewNodes.cpp @@ -8,7 +8,7 @@ #include "EditorDefs.h" -#include "Resource.h" +#include "Editor/Resource.h" #include "UiEditorAnimationBus.h" #include "UiAnimViewNodes.h" #include "UiAnimViewDopeSheetBase.h" diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.cpp b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.cpp index e071a3e631..61610e3c8e 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.cpp +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.cpp @@ -9,7 +9,7 @@ #include "UiEditorAnimationBus.h" #include "EditorDefs.h" -#include "Resource.h" +#include "Editor/Resource.h" #include "UiAnimViewSequenceManager.h" #include "UiAnimViewSplineCtrl.h" #include "UiAnimViewSequence.h" diff --git a/cmake/LYWrappers.cmake b/cmake/LYWrappers.cmake index 3dfef0bbbf..53895c300f 100644 --- a/cmake/LYWrappers.cmake +++ b/cmake/LYWrappers.cmake @@ -330,28 +330,44 @@ function(ly_add_target) set(runtime_dependencies_list SHARED MODULE EXECUTABLE APPLICATION) if(NOT ly_add_target_IMPORTED AND linking_options IN_LIST runtime_dependencies_list) - # the stamp file will be the one that triggers the execution of the custom rule. At the end - # of running the copy of runtime dependencies, the stamp file is touched so the timestamp is updated. - # Adding a config as part of the name since the stamp file is added to the VS project. - # Note the STAMP_OUTPUT_FILE need to match with the one used in runtime dependencies (e.g. RuntimeDependencies_common.cmake) - set(STAMP_OUTPUT_FILE ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}_$.stamp) - add_custom_command( - OUTPUT ${STAMP_OUTPUT_FILE} - DEPENDS "$>" - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}.cmake - COMMENT "Copying ${ly_add_target_NAME} runtime dependencies to output..." - VERBATIM - ) + # XCode generator doesnt support different source files per configuration, so we cannot have + # the runtime dependencies using file-tracking, instead, we will have them as a post build step + if(CMAKE_GENERATOR MATCHES Xcode) + + add_custom_command(TARGET ${ly_add_target_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}.cmake + COMMENT "Copying ${ly_add_target_NAME} runtime dependencies to output..." + DEPENDS ${CMAKE_BINARY_DIR}/runtime_dependencies/${ly_add_target_NAME}.cmake + COMMENT "Copying runtime dependencies..." + VERBATIM + ) - # Unfortunately the VS generator cannot deal with generation expressions as part of the file name, wrapping the - # stamp file on each configuration so it gets properly excluded by the generator - unset(stamp_files_per_config) - foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) - set(stamp_file_conf ${CMAKE_BINARY_DIR}/runtime_dependencies/${conf}/${ly_add_target_NAME}_${conf}.stamp) - set_source_files_properties(${stamp_file_conf} PROPERTIES GENERATED TRUE SKIP_AUTOGEN TRUE) - list(APPEND stamp_files_per_config $<$:${stamp_file_conf}>) - endforeach() - target_sources(${ly_add_target_NAME} PRIVATE ${stamp_files_per_config}) + else() + + # the stamp file will be the one that triggers the execution of the custom rule. At the end + # of running the copy of runtime dependencies, the stamp file is touched so the timestamp is updated. + # Adding a config as part of the name since the stamp file is added to the VS project. + # Note the STAMP_OUTPUT_FILE need to match with the one used in runtime dependencies (e.g. RuntimeDependencies_common.cmake) + set(STAMP_OUTPUT_FILE ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}_$.stamp) + add_custom_command( + OUTPUT ${STAMP_OUTPUT_FILE} + DEPENDS "$>" + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}.cmake + COMMENT "Copying ${ly_add_target_NAME} runtime dependencies to output..." + VERBATIM + ) + + # Unfortunately the VS generator cannot deal with generation expressions as part of the file name, wrapping the + # stamp file on each configuration so it gets properly excluded by the generator + unset(stamp_files_per_config) + foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) + set(stamp_file_conf ${CMAKE_BINARY_DIR}/runtime_dependencies/${conf}/${ly_add_target_NAME}_${conf}.stamp) + set_source_files_properties(${stamp_file_conf} PROPERTIES GENERATED TRUE SKIP_AUTOGEN TRUE) + list(APPEND stamp_files_per_config $<$:${stamp_file_conf}>) + endforeach() + target_sources(${ly_add_target_NAME} PRIVATE ${stamp_files_per_config}) + + endif() endif() From f0fc906510078c8c1dac450d1f888384a64d8e0f Mon Sep 17 00:00:00 2001 From: amzn-phist <52085794+amzn-phist@users.noreply.github.com> Date: Wed, 1 Sep 2021 10:23:47 -0500 Subject: [PATCH 075/355] Misc fixes for Linux SDK (#3764) * Fix rpath for lrelease binary This fixes the rpath for lrelease which is used to compile the qt translation file. Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com> * Fix a LocalFileIO path casing issue LocalFileIO was lowercasing the entire path after substituting aliases. This caused files to not be found and many failures in AP. Fixed to only lowercase the trailing relative path after the substitution. Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com> * Removed a message line Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com> --- Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp | 6 +++++- cmake/Platform/Linux/Install_linux.cmake | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp index aca7a41950..55e4f06db0 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp @@ -707,6 +707,7 @@ namespace AZ resolvedPathLen += postAliasView.size(); // Null-Terminated the resolved path resolvedPath[resolvedPathLen] = '\0'; + // If the path started with one of the "asset cache" path aliases, lowercase the path const char* assetAliasPath = GetAlias("@assets@"); const char* rootAliasPath = GetAlias("@root@"); @@ -714,10 +715,13 @@ namespace AZ const bool lowercasePath = (assetAliasPath != nullptr && AZ::StringFunc::StartsWith(resolvedPath, assetAliasPath)) || (rootAliasPath != nullptr && AZ::StringFunc::StartsWith(resolvedPath, rootAliasPath)) || (projectPlatformCacheAliasPath != nullptr && AZ::StringFunc::StartsWith(resolvedPath, projectPlatformCacheAliasPath)); + if (lowercasePath) { - AZStd::to_lower(resolvedPath, resolvedPath + resolvedPathLen); + // Lowercase only the relative part after the replaced alias. + AZStd::to_lower(resolvedPath + aliasValue.size(), resolvedPath + resolvedPathLen); } + // Replace any backslashes with posix slashes AZStd::replace(resolvedPath, resolvedPath + resolvedPathLen, AZ::IO::WindowsPathSeparator, AZ::IO::PosixPathSeparator); return true; diff --git a/cmake/Platform/Linux/Install_linux.cmake b/cmake/Platform/Linux/Install_linux.cmake index b3e2093b65..87713fa5d6 100644 --- a/cmake/Platform/Linux/Install_linux.cmake +++ b/cmake/Platform/Linux/Install_linux.cmake @@ -14,6 +14,9 @@ function(ly_copy source_file target_directory) if("${source_file}" MATCHES "qt/plugins" AND "${target_filename_ext}" STREQUAL ".so") get_filename_component(target_filename "${source_file}" NAME) file(RPATH_CHANGE FILE "${target_directory}/${target_filename}" OLD_RPATH "\$ORIGIN/../../lib" NEW_RPATH "\$ORIGIN/..") + elseif("${source_file}" MATCHES "lrelease") + get_filename_component(target_filename "${source_file}" NAME) + file(RPATH_CHANGE FILE "${target_directory}/${target_filename}" OLD_RPATH "\$ORIGIN/../lib" NEW_RPATH "\$ORIGIN") endif() endfunction()]]) From 404d6864fde0f6e8b45e9a3009bec55a87599497 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 1 Sep 2021 08:44:46 -0700 Subject: [PATCH 076/355] proper set of CMAKE_INSTALL_PREFIX Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/OutputDirectory.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/OutputDirectory.cmake b/cmake/OutputDirectory.cmake index 3b8e1b90eb..c1409bd825 100644 --- a/cmake/OutputDirectory.cmake +++ b/cmake/OutputDirectory.cmake @@ -13,5 +13,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build dir # We install outside of the binary dir because our install support muliple platforms to # be installed together. We also have an exclusion rule in the AP that filters out the -# "build" folder which is a common binary dir -ly_set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install) +# "install" folder to avoid the AP picking it up +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + ly_set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install) +endif() From b7291cf7404f9456c0c28ec1a2af1602a5988e6a Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 1 Sep 2021 08:45:22 -0700 Subject: [PATCH 077/355] adding ignore rule in AP for install folder and making exclusion rule in gitignore to match the one of build Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .gitignore | 2 +- Registry/AssetProcessorPlatformConfig.setreg | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index c28f6ab123..3a9b8f6f8e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ AssetProcessorTemp/** [Oo]ut/** CMakeUserPresets.json [Cc]ache/ -/install/ +/[Ii]nstall/ Editor/EditorEventLog.xml Editor/EditorLayout.xml **/*egg-info/** diff --git a/Registry/AssetProcessorPlatformConfig.setreg b/Registry/AssetProcessorPlatformConfig.setreg index 1c09ef4e83..3e90b063b5 100644 --- a/Registry/AssetProcessorPlatformConfig.setreg +++ b/Registry/AssetProcessorPlatformConfig.setreg @@ -172,6 +172,9 @@ "Exclude Build": { "pattern": ".*/[Bb]uild/.*" }, + "Exclude Install": { + "pattern": ".*/[Ii]nstall/.*" + }, "Exclude UserSettings": { "pattern": ".*/UserSettings.xml" }, From 0ad2fe2294e9468e59af2457058807d0d0e8dca1 Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Wed, 1 Sep 2021 11:01:50 -0500 Subject: [PATCH 078/355] Set enable gem variants feature (#3631) * Implemented the RFC to allow projects to need to specify the Gems Projects no longer need to specify CMake Targets to associate a Gem variant with. In order to associate a CMake Target with a gem variant a new `ly_set_gem_variant_to_load` function has been added that maps CMake Targets -> Gem Variants. This allows CMake Targets to self describe which gem variants they desire to build and load This implementation is backwards compatible: The `ly_enable_gems` function still accepts the TARGETS and VARIANTS arguments which it will forward to the new `ly_set_gem_variant_to_load` function to allow the input Targets to be associated with input Gem Variants This changes fixes the issue with gems that are required by an Application regardless of the Project in use, not replicating it's "requiredness" to the SDK layout Fixes #3430 Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Added an LY_PROJECT_NAME property to the Launcher targets The `ly_enable_gems_delayed` now command queries the LY_PROJECT_NAME property associated with each target to determine if the gems being enabled are match the project the target is associated with. In this case the target only adds dependencies if the gems is being enabled without a specific project or if the gems is being enabled for the matching project. If the LY_PROJECT_NAME property is not set for target, it indicates the gems for each project can be added as dependencies to the target. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * The INSTALL step now forwards the LY_PROJECT_NAME property for a target The Install_common.cmake has been updated to support configuring TARGET_PROPERTIES into the generated CMakeLists.txt for install targets. Furthermore the indentation of the generated CMakeLists.txt has been normalized to help with readability Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updating the Atom_Bootstrap CMakeLists.txt to enable the Atom_Bootstrap Gem Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Added a deprecation message to ly_enable_gems when supplying TARGETS and VARIANTS Added a define_property call for the LY_PROJECT_NAME target property Removed the .Builders alias for the PrefabBuilder and renamed the GEM_MODULE target o PrefabBuilder.Builders. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Removed superflous space from AutomatedTesting Gem CMakeLists.txt Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- AutomatedTesting/Gem/Code/CMakeLists.txt | 32 +- Code/Editor/CMakeLists.txt | 2 + Code/LauncherUnified/launcher_generator.cmake | 10 +- .../launcher_project_files.cmake | 1 + .../AssetBuilder/CMakeLists.txt | 1 + Code/Tools/AssetProcessor/CMakeLists.txt | 2 + Gems/Atom/Asset/Shader/Code/CMakeLists.txt | 3 +- Gems/Atom/Bootstrap/Code/CMakeLists.txt | 12 +- .../Tools/MaterialEditor/Code/CMakeLists.txt | 3 + .../CommonFeatures/Code/CMakeLists.txt | 27 +- Gems/Camera/Code/CMakeLists.txt | 19 +- Gems/Maestro/Code/CMakeLists.txt | 17 +- Gems/Prefab/PrefabBuilder/CMakeLists.txt | 10 +- Gems/SceneProcessing/Code/CMakeLists.txt | 8 +- Gems/ScriptCanvas/Code/CMakeLists.txt | 3 +- .../Template/Code/CMakeLists.txt | 38 +-- .../Template/Code/CMakeLists.txt | 37 +- cmake/Dependencies.cmake | 4 +- cmake/Gems.cmake | 320 +++++++++++------- cmake/Platform/Common/Install_common.cmake | 125 ++++--- cmake/Projects.cmake | 35 +- cmake/SettingsRegistry.cmake | 17 +- cmake/install/InstalledTarget.in | 2 + 23 files changed, 334 insertions(+), 394 deletions(-) diff --git a/AutomatedTesting/Gem/Code/CMakeLists.txt b/AutomatedTesting/Gem/Code/CMakeLists.txt index 58ffd957d6..6f55cc2764 100644 --- a/AutomatedTesting/Gem/Code/CMakeLists.txt +++ b/AutomatedTesting/Gem/Code/CMakeLists.txt @@ -35,37 +35,11 @@ ly_create_alias(NAME AutomatedTesting.Servers NAMESPACE Gem TARGETS Gem::Automa # Gem dependencies ################################################################################ -# The GameLauncher uses "Clients" gem variants: -ly_enable_gems(PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake - TARGETS AutomatedTesting.GameLauncher - VARIANTS Clients) +# Enable the enabled_gems for the Project: +ly_enable_gems(PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake) -# If we build a server, then apply the gems to the server +# Add project to the list server projects to create the AutomatedTesting.ServerLauncher if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) - # if we're making a server, then add the "Server" gem variants to it: - ly_enable_gems(PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake - TARGETS AutomatedTesting.ServerLauncher - VARIANTS Servers) - set_property(GLOBAL APPEND PROPERTY LY_LAUNCHER_SERVER_PROJECTS AutomatedTesting) endif() -if (PAL_TRAIT_BUILD_HOST_TOOLS) - # The Editor uses "Tools" gem variants: - ly_enable_gems( - PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake - TARGETS Editor - VARIANTS Tools) - - # The Material Editor needs the Lyshine "Tools" gem variant for the custom LyShine pass - ly_enable_gems( - PROJECT_NAME AutomatedTesting GEMS LyShine - TARGETS MaterialEditor - VARIANTS Tools) - - # The pipeline tools use "Builders" gem variants: - ly_enable_gems( - PROJECT_NAME AutomatedTesting GEM_FILE enabled_gems.cmake - TARGETS AssetBuilder AssetProcessor AssetProcessorBatch - VARIANTS Builders) -endif() diff --git a/Code/Editor/CMakeLists.txt b/Code/Editor/CMakeLists.txt index 9256fd041f..5158ebc6d5 100644 --- a/Code/Editor/CMakeLists.txt +++ b/Code/Editor/CMakeLists.txt @@ -174,6 +174,8 @@ ly_add_target( Legacy::EditorLib ProjectManager ) + +ly_set_gem_variant_to_load(TARGETS Editor VARIANTS Tools) set_property(SOURCE CryEdit.cpp APPEND PROPERTY diff --git a/Code/LauncherUnified/launcher_generator.cmake b/Code/LauncherUnified/launcher_generator.cmake index 9c8a6b8f16..b30f752c85 100644 --- a/Code/LauncherUnified/launcher_generator.cmake +++ b/Code/LauncherUnified/launcher_generator.cmake @@ -6,8 +6,8 @@ # # - set_property(GLOBAL PROPERTY LAUNCHER_UNIFIED_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) + # Launcher targets for a project need to be generated when configuring a project. # When building the engine source, this file will be included by LauncherUnified's CMakeLists.txt # When using an installed engine, this file will be included by the FindLauncherGenerator.cmake script @@ -121,6 +121,7 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC set_target_properties(${project_name}.GameLauncher PROPERTIES FOLDER ${project_name} + LY_PROJECT_NAME ${project_name} ) # After ensuring that we correctly support DPI scaling, this should be switched to "PerMonitor" @@ -129,6 +130,9 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC set_property(TARGET ${project_name}.GameLauncher APPEND PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "--project-path=\"${LY_DEFAULT_PROJECT_PATH}\"") endif() + # Associate the Clients Gem Variant with each projects GameLauncher + ly_set_gem_variant_to_load(TARGETS ${project_name}.GameLauncher VARIANTS Clients) + ################################################################################ # Server ################################################################################ @@ -168,11 +172,15 @@ foreach(project_name project_path IN ZIP_LISTS LY_PROJECTS_TARGET_NAME LY_PROJEC set_target_properties(${project_name}.ServerLauncher PROPERTIES FOLDER ${project_name} + LY_PROJECT_NAME ${project_name} ) if(LY_DEFAULT_PROJECT_PATH) set_property(TARGET ${project_name}.ServerLauncher APPEND PROPERTY VS_DEBUGGER_COMMAND_ARGUMENTS "--project-path=\"${LY_DEFAULT_PROJECT_PATH}\"") endif() + + # Associate the Servers Gem Variant with each projects ServerLauncher + ly_set_gem_variant_to_load(TARGETS ${project_name}.ServerLauncher VARIANTS Servers) endif() endif() diff --git a/Code/LauncherUnified/launcher_project_files.cmake b/Code/LauncherUnified/launcher_project_files.cmake index 9f5bacbce5..2276631fbe 100644 --- a/Code/LauncherUnified/launcher_project_files.cmake +++ b/Code/LauncherUnified/launcher_project_files.cmake @@ -9,4 +9,5 @@ set(FILES LauncherProject.cpp StaticModules.in + launcher_generator.cmake ) diff --git a/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt b/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt index 64655c5164..6baa99d43b 100644 --- a/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt +++ b/Code/Tools/AssetProcessor/AssetBuilder/CMakeLists.txt @@ -39,6 +39,7 @@ ly_add_source_properties( ) if(TARGET AssetBuilder) + ly_set_gem_variant_to_load(TARGETS AssetBuilder VARIANTS Builders) # Adds the AssetBuilder target as a C preprocessor define so that it can be used as a Settings Registry # specialization in order to look up the generated .setreg which contains the dependencies # specified for the AssetBuilder in the /Gem/Code/CMakeLists via ly_add_project_dependencies diff --git a/Code/Tools/AssetProcessor/CMakeLists.txt b/Code/Tools/AssetProcessor/CMakeLists.txt index f10e4a9e05..431a167163 100644 --- a/Code/Tools/AssetProcessor/CMakeLists.txt +++ b/Code/Tools/AssetProcessor/CMakeLists.txt @@ -81,6 +81,7 @@ ly_add_target( # specialization in order to look up the generated .setreg which contains the dependencies # specified for the target. if(TARGET AssetProcessor) + ly_set_gem_variant_to_load(TARGETS AssetProcessor VARIANTS Builders) set_source_files_properties( native/AssetProcessorBuildTarget.cpp PROPERTIES @@ -130,6 +131,7 @@ endif() # specialization in order to look up the generated .setreg which contains the dependencies # specified for the target. if(TARGET AssetProcessorBatch) + ly_set_gem_variant_to_load(TARGETS AssetProcessorBatch VARIANTS Builders) set_source_files_properties( native/AssetProcessorBatchBuildTarget.cpp PROPERTIES diff --git a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt index 298f00825f..c0bdfd4a8b 100644 --- a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt +++ b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt @@ -101,8 +101,7 @@ ly_add_target( # The Atom_Asset_Shader is a required gem for Builders in order to process the assets that come WITHOUT # the Atom_Feature_Common required gem -ly_enable_gems(GEMS Atom_Asset_Shader VARIANTS Builders - TARGETS AssetBuilder AssetProcessor AssetProcessorBatch) +ly_enable_gems(GEMS Atom_Asset_Shader) ################################################################################ # Tests diff --git a/Gems/Atom/Bootstrap/Code/CMakeLists.txt b/Gems/Atom/Bootstrap/Code/CMakeLists.txt index 1787af04ed..fd9df96124 100644 --- a/Gems/Atom/Bootstrap/Code/CMakeLists.txt +++ b/Gems/Atom/Bootstrap/Code/CMakeLists.txt @@ -45,14 +45,4 @@ ly_create_alias(NAME Atom_Bootstrap.Clients NAMESPACE Gem TARGETS Gem::Atom_Boot ly_create_alias(NAME Atom_Bootstrap.Servers NAMESPACE Gem TARGETS Gem::Atom_Bootstrap) # The Atom_Bootstrap gem is responsible for making the NativeWindow handle in the launcher applications -# Loop over each Project name to allow the ${ProjectName}.GameLauncher and ${ProjectName}.ServerLauncher -# target to add the gem the Clients and Servers variant -get_property(LY_PROJECTS_TARGET_NAME GLOBAL PROPERTY LY_PROJECTS_TARGET_NAME) -foreach(project_name IN LISTS LY_PROJECTS_TARGET_NAME) - # Add gem as a dependency of the Clients Launcher - ly_enable_gems(PROJECT_NAME ${project_name} GEMS Atom_Bootstrap VARIANTS Clients TARGETS ${project_name}.GameLauncher) - # Add gem as a dependency of the Servers Launcher - if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) - ly_enable_gems(PROJECT_NAME ${project_name} GEMS Atom_Bootstrap VARIANTS Servers TARGETS ${project_name}.ServerLauncher) - endif() -endforeach() +ly_enable_gems(GEMS Atom_Bootstrap) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt b/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt index c83ca2bb19..6230217ac2 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt +++ b/Gems/Atom/Tools/MaterialEditor/Code/CMakeLists.txt @@ -133,6 +133,9 @@ ly_add_target_dependencies( DEPENDENCIES_FILES tool_dependencies.cmake Source/Platform/${PAL_PLATFORM_NAME}/tool_dependencies_${PAL_PLATFORM_NAME_LOWERCASE}.cmake + # The Material Editor needs the LyShine "Tools" gem variant for the custom LyShine pass + DEPENDENT_TARGETS + Gem::LyShine.Tools ) # Inject the project path into the MaterialEditor VS debugger command arguments if the build system being invoked diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt b/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt index 804a53ebed..df5ab134fa 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt @@ -123,27 +123,10 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS) Gem::AtomLyIntegration_CommonFeatures.Editor Gem::GradientSignal.Tools ) - - # AtomLyIntergration_CommonFeatures gem targets are required as part of the Editor and AssetProcessor - # due to the AZ::Render::EditorDirectionalLightComponent, AZ::Render::EditorMeshComponent, - # AZ::Render::EditorGridComponent, AZ::Render::EditorHDRiSkyboxComponent, - # AZ::Render::EditorImageBasedLightComponent being saved as part of the DefaultLevel.prefab - ly_enable_gems(GEMS AtomLyIntegration_CommonFeatures VARIANTS Tools - TARGETS Editor) - ly_enable_gems(GEMS AtomLyIntegration_CommonFeatures VARIANTS Builders - TARGETS AssetBuilder AssetProcessor AssetProcessorBatch) endif() - -# Added dependencies to the Client and Server Launchers -get_property(LY_PROJECTS_TARGET_NAME GLOBAL PROPERTY LY_PROJECTS_TARGET_NAME) -foreach(project_name IN LISTS LY_PROJECTS_TARGET_NAME) - # Add gem as a dependency of the Clients Launcher - ly_enable_gems(PROJECT_NAME ${project_name} GEMS AtomLyIntegration_CommonFeatures VARIANTS Clients - TARGETS ${project_name}.GameLauncher) - # Add gem as a dependency of the Servers Launcher - if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) - ly_enable_gems(PROJECT_NAME ${project_name} GEMS AtomLyIntegration_CommonFeatures VARIANTS Servers - TARGETS ${project_name}.ServerLauncher) - endif() -endforeach() +# AtomLyIntegration_CommonFeatures gem targets are required as part of the Editor and AssetProcessor +# due to the AZ::Render::EditorDirectionalLightComponent, AZ::Render::EditorMeshComponent, +# AZ::Render::EditorGridComponent, AZ::Render::EditorHDRiSkyboxComponent, +# AZ::Render::EditorImageBasedLightComponent being saved as part of the DefaultLevel.prefab +ly_enable_gems(GEMS AtomLyIntegration_CommonFeatures) diff --git a/Gems/Camera/Code/CMakeLists.txt b/Gems/Camera/Code/CMakeLists.txt index deb123824f..3fbeec0908 100644 --- a/Gems/Camera/Code/CMakeLists.txt +++ b/Gems/Camera/Code/CMakeLists.txt @@ -66,22 +66,7 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) # tools and builders use the above module. ly_create_alias(NAME Camera.Tools NAMESPACE Gem TARGETS Gem::Camera.Editor) ly_create_alias(NAME Camera.Builders NAMESPACE Gem TARGETS Gem::Camera.Editor) - - # The DefaultPrefab contains an EditorCameraComponent which makes this gem required - ly_enable_gems(GEMS Camera VARIANTS Tools TARGETS Editor) - ly_enable_gems(GEMS Camera VARIANTS Builders TARGETS AssetBuilder AssetProcessor AssetProcessorBatch) endif() - -# Added dependencies to the Client and Server Launchers -get_property(LY_PROJECTS_TARGET_NAME GLOBAL PROPERTY LY_PROJECTS_TARGET_NAME) -foreach(project_name IN LISTS LY_PROJECTS_TARGET_NAME) - # Add gem as a dependency of the Clients Launcher - ly_enable_gems(PROJECT_NAME ${project_name} GEMS Camera VARIANTS Clients - TARGETS ${project_name}.GameLauncher) - # Add gem as a dependency of the Servers Launcher - if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) - ly_enable_gems(PROJECT_NAME ${project_name} GEMS Camera VARIANTS Servers - TARGETS ${project_name}.ServerLauncher) - endif() -endforeach() +# The DefaultPrefab contains an EditorCameraComponent which makes this gem required +ly_enable_gems(GEMS Camera) diff --git a/Gems/Maestro/Code/CMakeLists.txt b/Gems/Maestro/Code/CMakeLists.txt index 56d1f2f3c4..2ae737acc7 100644 --- a/Gems/Maestro/Code/CMakeLists.txt +++ b/Gems/Maestro/Code/CMakeLists.txt @@ -75,23 +75,10 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) ly_create_alias(NAME Maestro.Tools NAMESPACE Gem TARGETS Gem::Maestro.Editor) ly_create_alias(NAME Maestro.Builders NAMESPACE Gem TARGETS Gem::Maestro.Editor) - # Maestro is still used by the CrySystem Level System and SystemInit and TrackView - # It is required by the GameLauncher, ServerLauncher and Editor applications - ly_enable_gems(GEMS Maestro VARIANTS Tools TARGETS Editor) - endif() -# Loop over each Project name to allow the ${ProjectName}.GameLauncher and ${ProjectName}.ServerLauncher -# target to add the gem the Clients and Servers variant -get_property(LY_PROJECTS_TARGET_NAME GLOBAL PROPERTY LY_PROJECTS_TARGET_NAME) -foreach(project_name IN LISTS LY_PROJECTS_TARGET_NAME) - # Add gem as a dependency of the Clients Launcher - ly_enable_gems(PROJECT_NAME ${project_name} GEMS Maestro VARIANTS Clients TARGETS ${project_name}.GameLauncher) - # Add gem as a dependency of the Servers Launcher - if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) - ly_enable_gems(PROJECT_NAME ${project_name} GEMS Maestro VARIANTS Servers TARGETS ${project_name}.ServerLauncher) - endif() -endforeach() +# Maestro is still used by the CrySystem Level System, CSystem::SystemInit and TrackView +ly_enable_gems(GEMS Maestro) ################################################################################ diff --git a/Gems/Prefab/PrefabBuilder/CMakeLists.txt b/Gems/Prefab/PrefabBuilder/CMakeLists.txt index c4c57155ab..450b8d0408 100644 --- a/Gems/Prefab/PrefabBuilder/CMakeLists.txt +++ b/Gems/Prefab/PrefabBuilder/CMakeLists.txt @@ -23,7 +23,7 @@ ly_add_target( ) ly_add_target( - NAME PrefabBuilder GEM_MODULE + NAME PrefabBuilder.Builders GEM_MODULE NAMESPACE Gem INCLUDE_DIRECTORIES PRIVATE @@ -36,15 +36,9 @@ ly_add_target( ) # the prefab builder only needs to be active in builders -# use the PrefabBuilder module in Clients and Servers: -ly_create_alias(NAME PrefabBuilder.Builders NAMESPACE Gem TARGETS Gem::PrefabBuilder) # we automatically add this gem, if it is present, to all our known set of builder applications: -ly_enable_gems(GEMS PrefabBuilder VARIANTS Builders TARGETS AssetProcessor AssetProcessorBatch AssetBuilder) - -# if you have a custom builder application in your project, then use ly_enable_gems() to -# add it to that application for your project, like this to make YOUR_TARGET_NAME load it automatically -# ly_enable_gems(PROJECT_NAME (YOUR_PROJECT_NAME) GEMS PrefabBuilder VARIANTS Builders TARGETS (YOUR_TARGET_NAME) ) +ly_enable_gems(GEMS PrefabBuilder) if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) ly_add_target( diff --git a/Gems/SceneProcessing/Code/CMakeLists.txt b/Gems/SceneProcessing/Code/CMakeLists.txt index 6602c1d7d6..667103b4a7 100644 --- a/Gems/SceneProcessing/Code/CMakeLists.txt +++ b/Gems/SceneProcessing/Code/CMakeLists.txt @@ -68,14 +68,10 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) ly_create_alias(NAME SceneProcessing.Builders NAMESPACE Gem TARGETS Gem::SceneProcessing.Editor) ly_create_alias(NAME SceneProcessing.Tools NAMESPACE Gem TARGETS Gem::SceneProcessing.Editor) -# SceneProcessing Gem is only used in Tools and builders and is a requirement for the Editor -ly_enable_gems(GEMS SceneProcessing VARIANTS Tools - TARGETS Editor) -ly_enable_gems(GEMS SceneProcessing VARIANTS Builders - TARGETS AssetBuilder AssetProcessor AssetProcessorBatch) + # SceneProcessing Gem is only used in Tools and builders and is a requirement for the Editor and AssetProcessor + ly_enable_gems(GEMS SceneProcessing) endif() - ################################################################################ # Tests ################################################################################ diff --git a/Gems/ScriptCanvas/Code/CMakeLists.txt b/Gems/ScriptCanvas/Code/CMakeLists.txt index 57d7a4a476..c126d343ed 100644 --- a/Gems/ScriptCanvas/Code/CMakeLists.txt +++ b/Gems/ScriptCanvas/Code/CMakeLists.txt @@ -47,8 +47,7 @@ ly_add_target( ) # the script canvas debugger is an optional gem module -# To Enable it: ly_enable_gems( ... TARGETS xxxyyzzz GEMS ScriptCanvasDebugger ...) -# in any particular target. +# To Enable it, associate it with a project ly_create_alias(NAME ScriptCanvasDebugger.Builders NAMESPACE Gem TARGETS Gem::ScriptCanvasDebugger) ly_create_alias(NAME ScriptCanvasDebugger.Tools NAMESPACE Gem TARGETS Gem::ScriptCanvasDebugger) ly_create_alias(NAME ScriptCanvasDebugger.Clients NAMESPACE Gem TARGETS Gem::ScriptCanvasDebugger) diff --git a/Templates/DefaultProject/Template/Code/CMakeLists.txt b/Templates/DefaultProject/Template/Code/CMakeLists.txt index 0c6f6553fb..7bbb9a0852 100644 --- a/Templates/DefaultProject/Template/Code/CMakeLists.txt +++ b/Templates/DefaultProject/Template/Code/CMakeLists.txt @@ -68,46 +68,12 @@ ly_create_alias(NAME ${Name}.Servers NAMESPACE Gem TARGETS Gem::${Name}) # Gem dependencies ################################################################################ -# The GameLauncher uses "Clients" gem variants: -ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - ${Name}.GameLauncher - VARIANTS - Clients) - -if(PAL_TRAIT_BUILD_HOST_TOOLS) - - # the builder type applications use the "Builders" variants of the enabled gems. - ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - AssetBuilder - AssetProcessor - AssetProcessorBatch - VARIANTS - Builders) - - # the Editor applications use the "Tools" variants of the enabled gems. - ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - Editor - VARIANTS - Tools) -endif() +# Enable the specified list of gems from GEM_FILE or GEMS list for this specific project: +ly_enable_gems(PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake) if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) # this property causes it to actually make a ServerLauncher. # if you don't want a Server application, you can remove this and the # following ly_enable_gems lines. set_property(GLOBAL APPEND PROPERTY LY_LAUNCHER_SERVER_PROJECTS ${Name}) - - # The ServerLauncher uses the "Servers" variants of enabled gems: - ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - ${Name}.ServerLauncher - VARIANTS - Servers) endif() diff --git a/Templates/MinimalProject/Template/Code/CMakeLists.txt b/Templates/MinimalProject/Template/Code/CMakeLists.txt index 0c6f6553fb..5e646c0704 100644 --- a/Templates/MinimalProject/Template/Code/CMakeLists.txt +++ b/Templates/MinimalProject/Template/Code/CMakeLists.txt @@ -68,46 +68,13 @@ ly_create_alias(NAME ${Name}.Servers NAMESPACE Gem TARGETS Gem::${Name}) # Gem dependencies ################################################################################ -# The GameLauncher uses "Clients" gem variants: -ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - ${Name}.GameLauncher - VARIANTS - Clients) +# Enable the specified list of gems from GEM_FILE or GEMS list for this specific project: +ly_enable_gems(PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake) -if(PAL_TRAIT_BUILD_HOST_TOOLS) - - # the builder type applications use the "Builders" variants of the enabled gems. - ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - AssetBuilder - AssetProcessor - AssetProcessorBatch - VARIANTS - Builders) - - # the Editor applications use the "Tools" variants of the enabled gems. - ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - Editor - VARIANTS - Tools) -endif() if(PAL_TRAIT_BUILD_SERVER_SUPPORTED) # this property causes it to actually make a ServerLauncher. # if you don't want a Server application, you can remove this and the # following ly_enable_gems lines. set_property(GLOBAL APPEND PROPERTY LY_LAUNCHER_SERVER_PROJECTS ${Name}) - - # The ServerLauncher uses the "Servers" variants of enabled gems: - ly_enable_gems( - PROJECT_NAME ${Name} GEM_FILE enabled_gems.cmake - TARGETS - ${Name}.ServerLauncher - VARIANTS - Servers) endif() diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 3863cdc313..f40c72b540 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -35,7 +35,9 @@ function(ly_add_dependencies TARGET) if(TARGET ${TARGET}) # Target already created, add it ly_parse_third_party_dependencies("${extra_function_args}") - add_dependencies(${TARGET} ${extra_function_args}) + # Dependencies can only be added on non-alias target + ly_de_alias_target(${TARGET} de_aliased_target) + add_dependencies(${de_aliased_target} ${extra_function_args}) else() set_property(GLOBAL APPEND PROPERTY LY_DELAYED_DEPENDENCIES_${TARGET} ${extra_function_args}) endif() diff --git a/cmake/Gems.cmake b/cmake/Gems.cmake index bcb619fd8d..e01740c265 100644 --- a/cmake/Gems.cmake +++ b/cmake/Gems.cmake @@ -6,7 +6,13 @@ # # -# This file contains utility wrappers for dealing with the Gems system. +# This file contains utility wrappers for dealing with the Gems system. + +define_property(TARGET PROPERTY LY_PROJECT_NAME + BRIEF_DOCS "Name of the project, this target can use enabled gems from" + FULL_DOCS "If set, the when iterating over the enabled gems in ly_enabled_gems_delayed + only a project with that name can have it's enabled gem list added as a dependency to this target. + If the __NOPROJECT__ placeholder is associated with a list enabled gems, then it applies to this target regardless of this property value") # ly_create_alias # given an alias to create, and a list of one or more targets, @@ -34,7 +40,8 @@ function(ly_create_alias) # easy version - if its just one target and it exist at the time of this call, # we can directly get the target, and make both aliases, - # the namespaced and non namespaced one, point at it. + # the namespace and non namespace one, point at it. + set(create_interface_target TRUE) list(LENGTH ly_create_alias_TARGETS number_of_targets) if (number_of_targets EQUAL 1) if(TARGET ${ly_create_alias_TARGETS}) @@ -43,11 +50,7 @@ function(ly_create_alias) if (NOT TARGET ${ly_create_alias_NAME}) add_library(${ly_create_alias_NAME} ALIAS ${de_aliased_target_name}) endif() - # Store off the arguments needed used ly_create_alias into a DIRECTORY property - # This will be used to re-create the calls in the generated CMakeLists.txt in the INSTALL step - string(REPLACE ";" " " create_alias_args "${ly_create_alias_NAME},${ly_create_alias_NAMESPACE},${ly_create_alias_TARGETS}") - set_property(DIRECTORY APPEND PROPERTY LY_CREATE_ALIAS_ARGUMENTS "${ly_create_alias_NAME},${ly_create_alias_NAMESPACE},${ly_create_alias_TARGETS}") - return() + set(create_interface_target FALSE) endif() endif() @@ -55,41 +58,48 @@ function(ly_create_alias) # To actually achieve this we have to create an interface library with those dependencies, # then we have to create an alias to that target. # By convention we create one without a namespace then alias the namespaced one. - - if(TARGET ${ly_create_alias_NAME}) - message(FATAL_ERROR "Internal alias target already exists, cannot create an alias for it: ${ly_create_alias_NAME}\n" - "This could be a copy-paste error, where some part of the ly_create_alias call was changed but the other") - endif() - - add_library(${ly_create_alias_NAME} INTERFACE IMPORTED GLOBAL) - set_target_properties(${ly_create_alias_NAME} PROPERTIES GEM_MODULE TRUE) - - foreach(target_name ${ly_create_alias_TARGETS}) - if(TARGET ${target_name}) - ly_de_alias_target(${target_name} de_aliased_target_name) - if(NOT de_aliased_target_name) - message(FATAL_ERROR "Target not found in ly_create_alias call: ${target_name} - check your spelling of the target name") - endif() - else() - set(de_aliased_target_name ${target_name}) + if(create_interface_target) + if(TARGET ${ly_create_alias_NAME}) + message(FATAL_ERROR "Internal alias target already exists, cannot create an alias for it: ${ly_create_alias_NAME}\n" + "This could be a copy-paste error, where some part of the ly_create_alias call was changed but the other") endif() - list(APPEND final_targets ${de_aliased_target_name}) - endforeach() - - # add_dependencies must be called with at least one dependent target - if(final_targets) - ly_parse_third_party_dependencies("${final_targets}") - ly_add_dependencies(${ly_create_alias_NAME} ${final_targets}) - endif() - # now add the final alias: - add_library(${ly_create_alias_NAMESPACE}::${ly_create_alias_NAME} ALIAS ${ly_create_alias_NAME}) + add_library(${ly_create_alias_NAME} INTERFACE IMPORTED GLOBAL) + set_target_properties(${ly_create_alias_NAME} PROPERTIES GEM_MODULE TRUE) + + foreach(target_name ${ly_create_alias_TARGETS}) + if(TARGET ${target_name}) + ly_de_alias_target(${target_name} de_aliased_target_name) + if(NOT de_aliased_target_name) + message(FATAL_ERROR "Target not found in ly_create_alias call: ${target_name} - check your spelling of the target name") + endif() + else() + set(de_aliased_target_name ${target_name}) + endif() + list(APPEND final_targets ${de_aliased_target_name}) + endforeach() + + # add_dependencies must be called with at least one dependent target + if(final_targets) + ly_parse_third_party_dependencies("${final_targets}") + ly_add_dependencies(${ly_create_alias_NAME} ${final_targets}) + endif() + + # now add the final alias: + add_library(${ly_create_alias_NAMESPACE}::${ly_create_alias_NAME} ALIAS ${ly_create_alias_NAME}) + endif() # Store off the arguments used by ly_create_alias into a DIRECTORY property # This will be used to re-create the calls in the generated CMakeLists.txt in the INSTALL step - - # Replace the CMake list separator with a space to replicate the space separated TARGETS arguments - string(REPLACE ";" " " create_alias_args "${ly_create_alias_NAME},${ly_create_alias_NAMESPACE},${ly_create_alias_TARGETS}") + # Replace the CMake list separator with a space to replicate the space separated arguments + # A single create_alias_args variable encodes two values. The alias NAME used to check if the target exists + # and the ly_create_alias arguments to replace this function call + unset(create_alias_args) + list(APPEND create_alias_args "${ly_create_alias_NAME}," + NAME ${ly_create_alias_NAME} + NAMESPACE ${ly_create_alias_NAMESPACE} + TARGETS ${ly_create_alias_TARGETS}) + list(JOIN create_alias_args " " create_alias_args) set_property(DIRECTORY APPEND PROPERTY LY_CREATE_ALIAS_ARGUMENTS "${create_alias_args}") # Store the directory path in the GLOBAL property so that it can be accessed @@ -100,13 +110,54 @@ function(ly_create_alias) endif() endfunction() +# ly_set_gem_variant_to_load +# Associates a key, value entry of CMake target -> Gem variant +# \arg:TARGETS - list of Targets to associate with the Gem variant +# \arg:VARIANTS - Gem variant +function(ly_set_gem_variant_to_load) + set(options) + set(oneValueArgs) + set(multiValueArgs TARGETS VARIANTS) + + cmake_parse_arguments(ly_set_gem_variant_to_load "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + + if (NOT ly_set_gem_variant_to_load_TARGETS) + message(FATAL_ERROR "You must provide at least 1 target to ${CMAKE_CURRENT_FUNCTION} using the TARGETS keyword") + endif() + + # Store a list of targets + foreach(target_name ${ly_set_gem_variant_to_load_TARGETS}) + # Append the target to the list of targets with variants if it has not been added + get_property(ly_targets_with_variants GLOBAL PROPERTY LY_TARGETS_WITH_GEM_VARIANTS) + if(NOT target_name IN_LIST ly_targets_with_variants) + set_property(GLOBAL APPEND PROPERTY LY_TARGETS_WITH_GEM_VARIANTS "${target_name}") + endif() + foreach(variant_name ${ly_set_gem_variant_to_load_VARIANTS}) + get_property(target_gem_variants GLOBAL PROPERTY LY_GEM_VARIANTS_"${target_name}") + if(NOT variant_name IN_LIST target_gem_variants) + set_property(GLOBAL APPEND PROPERTY LY_GEM_VARIANTS_"${target_name}" "${variant_name}") + endif() + endforeach() + endforeach() + + # Store of the arguments used to invoke this function in order to replicate the call in the generated CMakeLists.txt + # in the install layout + unset(set_gem_variant_args) + list(APPEND set_gem_variant_args + TARGETS ${ly_set_gem_variant_to_load_TARGETS} + VARIANTS ${ly_set_gem_variant_to_load_VARIANTS}) + # Replace the list separator with space to have it be stored as a single property element + list(JOIN set_gem_variant_args " " set_gem_variant_args) + set_property(DIRECTORY APPEND PROPERTY LY_SET_GEM_VARIANT_TO_LOAD_ARGUMENTS "${set_gem_variant_args}") +endfunction() + # ly_enable_gems # this function makes sure that the given gems, or gems listed in the variable ENABLED_GEMS # in the GEM_FILE name, are set as runtime dependencies (and thus loaded) for the given targets # in the context of the given project. # note that it can't do this immediately, so it saves the data for later processing. # Note: If you don't supply a project name, it will apply it across the board to all projects. -# this is useful in the case of "ly_add_gems being called for so called 'mandatory gems' inside the engine. +# this is useful in the case of "ly_enable_gems" being called for so called 'mandatory gems' inside the engine. # if you specify a gem name with a namespace, it will be used, otherwise it will assume Gem:: function(ly_enable_gems) set(options) @@ -115,23 +166,21 @@ function(ly_enable_gems) cmake_parse_arguments(ly_enable_gems "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - if (NOT ly_enable_gems_TARGETS) - message(FATAL_ERROR "You must provide the targets to add gems to using the TARGETS keyword") - endif() - - if (NOT ly_enable_gems_PROJECT_NAME) message(VERBOSE "Note: ly_enable_gems called with no PROJECT_NAME name, applying to all projects: \n" - " - VARIANTS ${ly_enable_gems_VARIANTS} \n" - " - GEMS ${ly_enable_gems_GEMS} \n" - " - TARGETS ${ly_enable_gems_TARGETS} \n" + " - GEMS ${ly_enable_gems_GEMS} \n" " - GEM_FILE ${ly_enable_gems_GEM_FILE}") set(ly_enable_gems_PROJECT_NAME "__NOPROJECT__") # so that the token is not blank endif() - if (NOT ly_enable_gems_VARIANTS) - message(FATAL_ERROR "You must provide at least 1 variant of the gem modules (Editor, Server, Client, Builder) to " - "add to your targets, using the VARIANTS keyword") + # Backwards-Compatibility - Delegate any TARGETS and VARIANTS arguments to the ly_set_gem_variant_to_load + # command. That command is used to associate TARGETS with the list of Gem Variants they desire to use + if (ly_enable_gems_TARGETS AND ly_enable_gems_VARIANTS) + message(DEPRECATION "The TARGETS and VARIANTS arguments to \"${CMAKE_CURRENT_FUNCTION}\" is deprecated.\n" + "Please use the \"ly_set_gem_variant_to_load\" function directly to associate a Target with a Gem Variant.\n" + "This function will forward the TARGETS and VARIANTS arguments to \"ly_set_gem_variant_to_load\" for now," + " but this functionality will be removed.") + ly_set_gem_variant_to_load(TARGETS ${ly_enable_gems_TARGETS} VARIANTS ${ly_enable_gems_VARIANTS}) endif() if ((NOT ly_enable_gems_GEMS AND NOT ly_enable_gems_GEM_FILE) OR (ly_enable_gems_GEMS AND ly_enable_gems_GEM_FILE)) @@ -153,103 +202,126 @@ function(ly_enable_gems) endif() # all the actual work has to be done later. - foreach(target_name ${ly_enable_gems_TARGETS}) - foreach(variant_name ${ly_enable_gems_VARIANTS}) - set_property(GLOBAL APPEND PROPERTY LY_DELAYED_ENABLE_GEMS "${ly_enable_gems_PROJECT_NAME},${target_name},${variant_name}") - define_property(GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS_"${ly_enable_gems_PROJECT_NAME},${target_name},${variant_name}" - BRIEF_DOCS "List of gem names to evaluate variants against" FULL_DOCS "Names of gems that will be paired with the variant name - to determine if it is valid target that should be added as an application dynamic load dependency") - set_property(GLOBAL APPEND PROPERTY LY_DELAYED_ENABLE_GEMS_"${ly_enable_gems_PROJECT_NAME},${target_name},${variant_name}" ${ly_enable_gems_GEMS}) - endforeach() - endforeach() + set_property(GLOBAL APPEND PROPERTY LY_DELAYED_ENABLE_GEMS "${ly_enable_gems_PROJECT_NAME}") + define_property(GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS_"${ly_enable_gems_PROJECT_NAME}" + BRIEF_DOCS "List of gem names to evaluate variants against" FULL_DOCS "Names of gems that will be paired with the variant name + to determine if it is valid target that should be added as an application dynamic load dependency") + set_property(GLOBAL APPEND PROPERTY LY_DELAYED_ENABLE_GEMS_"${ly_enable_gems_PROJECT_NAME}" ${ly_enable_gems_GEMS}) # Store off the arguments used by ly_enable_gems into a DIRECTORY property # This will be used to re-create the ly_enable_gems call in the generated CMakeLists.txt at the INSTALL step # Replace the CMake list separator with a space to replicate the space separated TARGETS arguments if(NOT ly_enable_gems_PROJECT_NAME STREQUAL "__NOPROJECT__") - set(replicated_project_name ${ly_enable_gems_PROJECT_NAME}) + set(replicated_project_name PROJECT_NAME ${ly_enable_gems_PROJECT_NAME}) endif() # The GEM_FILE file is used to populate the GEMS argument via the ENABLED_GEMS variable in the file. # Furthermore the GEM_FILE itself is not copied over to the install layout, so make its argument entry blank and use the list of GEMS # stored in ly_enable_gems_GEMS - string(REPLACE ";" " " enable_gems_args "${replicated_project_name},${ly_enable_gems_GEMS},,${ly_enable_gems_VARIANTS},${ly_enable_gems_TARGETS}") + unset(enable_gems_args) + list(APPEND enable_gems_args + ${replicated_project_name} + GEMS ${ly_enable_gems_GEMS}) + list(JOIN enable_gems_args " " enable_gems_args) set_property(DIRECTORY APPEND PROPERTY LY_ENABLE_GEMS_ARGUMENTS "${enable_gems_args}") endfunction() + +function(ly_add_gem_dependencies_to_project_variants) + set(options) + set(oneValueArgs PROJECT_NAME TARGET VARIANT) + set(multiValueArgs GEM_DEPENDENCIES) + + cmake_parse_arguments(ly_add_gem_dependencies "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + if (NOT ly_add_gem_dependencies_PROJECT_NAME) + message(FATAL_ERROR "Missing required PROJECT_NAME argument which is used to determine gem load prefix") + endif() + if (NOT ly_add_gem_dependencies_TARGET) + message(FATAL_ERROR "Missing required TARGET argument ") + endif() + if (NOT ly_add_gem_dependencies_VARIANT) + message(FATAL_ERROR "Missing required gem VARIANT argument needed to determine which gem variants to load for the target") + endif() + + if(${ly_add_gem_dependencies_PROJECT_NAME} STREQUAL "__NOPROJECT__") + # special case, apply to all + unset(PREFIX_CLAUSE) + else() + set(PREFIX_CLAUSE "PREFIX;${ly_add_gem_dependencies_PROJECT_NAME}") + endif() + + # apply the list of gem targets. Adding a gem really just means adding the appropriate dependency. + foreach(gem_name ${ly_add_gem_dependencies_GEM_DEPENDENCIES}) + set(gem_target ${gem_name}.${ly_add_gem_dependencies_VARIANT}) + + # if the target exists, add it. + if (TARGET ${gem_target}) + # Dealias actual target + ly_de_alias_target(${gem_target} dealiased_gem_target) + ly_add_target_dependencies( + ${PREFIX_CLAUSE} + TARGETS ${ly_add_gem_dependencies_TARGET} + DEPENDENT_TARGETS ${dealiased_gem_target}) + endif() + endforeach() +endfunction() + # call this before runtime dependencies are used to add any relevant targets # saved by the above function function(ly_enable_gems_delayed) - get_property(ly_delayed_enable_gems GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS) - foreach(project_target_variant ${ly_delayed_enable_gems}) - # we expect a colon separated list of - # PROJECT_NAME,target_name,variant_name - string(REPLACE "," ";" project_target_variant_list "${project_target_variant}") - list(LENGTH project_target_variant_list project_target_variant_length) - if(project_target_variant_length EQUAL 0) - continue() - endif() - - if(NOT project_target_variant_length EQUAL 3) - message(FATAL_ERROR "Invalid specification of gems, expected 'project','target','variant' and got ${project_target_variant}") - endif() - - list(POP_BACK project_target_variant_list variant) - list(POP_BACK project_target_variant_list target) - list(POP_BACK project_target_variant_list project) - - get_property(gem_dependencies GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS_"${project_target_variant}") - if (NOT gem_dependencies) - get_property(gem_dependencies_defined GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS_"${project_target_variant}" DEFINED) - if (gem_dependencies_defined) - # special case, if the LY_DELAYED_ENABLE_GEMS_"${project_target_variant}" property is DEFINED - # but empty, add an entry to the LY_DELAYED_LOAD_DEPENDENCIES to have the - # cmake_dependencies.*.setreg file for the (project, target) tuple to be regenerated - # This is needed if the ENABLED_GEMS list for a project goes from >0 to 0. In this case - # the cmake_dependencies would have a stale list of gems to load unless it is regenerated - get_property(delayed_load_target_set GLOBAL PROPERTY LY_DELAYED_LOAD_"${project},${target}" SET) - if(NOT delayed_load_target_set) - set_property(GLOBAL APPEND PROPERTY LY_DELAYED_LOAD_DEPENDENCIES "${project},${target}") - set_property(GLOBAL APPEND PROPERTY LY_DELAYED_LOAD_"${project},${target}" "") - endif() - endif() - # Continue to the next iteration loop regardless as there are no gem dependencies - continue() - endif() - - if(${project} STREQUAL "__NOPROJECT__") - # special case, apply to all - unset(PREFIX_CLAUSE) - else() - set(PREFIX_CLAUSE "PREFIX;${project}") - endif() + # Query the list of targets that are associated with a gem variant + get_property(targets_with_variants GLOBAL PROPERTY LY_TARGETS_WITH_GEM_VARIANTS) + # Query the projects that have made calls to ly_enable_gems + get_property(enable_gem_projects GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS) + foreach(target ${targets_with_variants}) if (NOT TARGET ${target}) - message(FATAL_ERROR "ly_enable_gems specified TARGET '${target}' but no such target was found.") + message(FATAL_ERROR "ly_set_gem_variant_to_load specified TARGET '${target}' but no such target was found.") endif() - # apply the list of gem targets. Adding a gem really just means adding the appropriate dependency. - foreach(gem_name ${gem_dependencies}) - # the gem name may already have a namespace. If it does, we use that one - ly_strip_target_namespace(TARGET ${gem_name} OUTPUT_VARIABLE unaliased_gem_name) - if (${unaliased_gem_name} STREQUAL ${gem_name}) - # if stripping a namespace had no effect, it had no namespace - # and we supply the default Gem:: namespace. - set(gem_name_with_namespace Gem::${gem_name}) - else() - # if stripping the namespace had an effect then we use the original - # with the namespace, instead of assuming Gem:: - set(gem_name_with_namespace ${gem_name}) + # Lookup if the target is scoped to a project + # In that case the target can only use gem targets that is + # - not project specific: i.e "__NOPROJECT__" + # - or specific to the project + get_property(target_project_association TARGET ${target} PROPERTY LY_PROJECT_NAME) + + foreach(project ${enable_gem_projects}) + if (target_project_association AND + (NOT (project STREQUAL "__NOPROJECT__") AND NOT (project STREQUAL target_project_association))) + # Skip adding the gem dependencies to this target if it is associated with a project + # and the current project doesn't match + continue() endif() - - # if the target exists, add it. - if (TARGET ${gem_name_with_namespace}.${variant}) - ly_add_target_dependencies( - ${PREFIX_CLAUSE} - TARGETS ${target} - DEPENDENT_TARGETS ${gem_name_with_namespace}.${variant} - ) + + get_property(gem_dependencies GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS_"${project}") + if (NOT gem_dependencies) + get_property(gem_dependencies_defined GLOBAL PROPERTY LY_DELAYED_ENABLE_GEMS_"${project}" DEFINED) + if (gem_dependencies_defined) + # special case, if the LY_DELAYED_ENABLE_GEMS_"${project_target_variant}" property is DEFINED + # but empty, add an entry to the LY_DELAYED_LOAD_DEPENDENCIES to have the + # cmake_dependencies.*.setreg file for the (project, target) tuple to be regenerated + # This is needed if the ENABLED_GEMS list for a project goes from >0 to 0. In this case + # the cmake_dependencies would have a stale list of gems to load unless it is regenerated + get_property(delayed_load_target_set GLOBAL PROPERTY LY_DELAYED_LOAD_"${project},${target}" SET) + if(NOT delayed_load_target_set) + set_property(GLOBAL APPEND PROPERTY LY_DELAYED_LOAD_DEPENDENCIES "${project},${target}") + set_property(GLOBAL APPEND PROPERTY LY_DELAYED_LOAD_"${project},${target}" "") + endif() + endif() + # Continue to the next iteration loop regardless as there are no gem dependencies + continue() endif() + + # Gather the Gem variants associated with this target and iterate over them to combine them with the enabled + # gems for the each project + get_property(target_gem_variants GLOBAL PROPERTY LY_GEM_VARIANTS_"${target}") + foreach(variant ${target_gem_variants}) + ly_add_gem_dependencies_to_project_variants( + PROJECT_NAME ${project} + TARGET ${target} + VARIANT ${variant} + GEM_DEPENDENCIES ${gem_dependencies}) + endforeach() endforeach() endforeach() endfunction() diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index 0bd598f70e..5010760fad 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -138,16 +138,20 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar string(REPLACE "_LIBRARY" "" TARGET_TYPE_PLACEHOLDER ${target_type}) # For HEADER_ONLY libs we end up generating "INTERFACE" libraries, need to specify HEADERONLY instead string(REPLACE "INTERFACE" "HEADERONLY" TARGET_TYPE_PLACEHOLDER ${TARGET_TYPE_PLACEHOLDER}) - if(TARGET_TYPE_PLACEHOLDER STREQUAL "MODULE") + # In non-monolithic mode, gem targets are MODULE libraries, In monolithic mode gem targets are STATIC libraries + set(GEM_LIBRARY_TYPES "MODULE" "STATIC") + if(TARGET_TYPE_PLACEHOLDER IN_LIST GEM_LIBRARY_TYPES) get_target_property(gem_module ${TARGET_NAME} GEM_MODULE) if(gem_module) set(TARGET_TYPE_PLACEHOLDER "GEM_MODULE") endif() endif() + string(REPEAT " " 12 PLACEHOLDER_INDENT) get_target_property(COMPILE_DEFINITIONS_PLACEHOLDER ${TARGET_NAME} INTERFACE_COMPILE_DEFINITIONS) if(COMPILE_DEFINITIONS_PLACEHOLDER) - string(REPLACE ";" "\n" COMPILE_DEFINITIONS_PLACEHOLDER "${COMPILE_DEFINITIONS_PLACEHOLDER}") + set(COMPILE_DEFINITIONS_PLACEHOLDER "${PLACEHOLDER_INDENT}${COMPILE_DEFINITIONS_PLACEHOLDER}") + list(JOIN COMPILE_DEFINITIONS_PLACEHOLDER "\n${PLACEHOLDER_INDENT}" COMPILE_DEFINITIONS_PLACEHOLDER) else() unset(COMPILE_DEFINITIONS_PLACEHOLDER) endif() @@ -159,25 +163,28 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar if(include_genex_expr STREQUAL include) # only for cases where there are no generation expressions # Make the include path relative to the source dir where the target will be declared cmake_path(RELATIVE_PATH include BASE_DIRECTORY ${absolute_target_source_dir} OUTPUT_VARIABLE target_include) - string(APPEND INCLUDE_DIRECTORIES_PLACEHOLDER "${target_include}\n") + string(APPEND INCLUDE_DIRECTORIES_PLACEHOLDER "${PLACEHOLDER_INDENT}${target_include}\n") endif() endforeach() endif() + string(REPEAT " " 8 PLACEHOLDER_INDENT) get_target_property(RUNTIME_DEPENDENCIES_PLACEHOLDER ${TARGET_NAME} MANUALLY_ADDED_DEPENDENCIES) if(RUNTIME_DEPENDENCIES_PLACEHOLDER) # not found properties return the name of the variable with a "-NOTFOUND" at the end, here we set it to empty if not found - string(REPLACE ";" "\n" RUNTIME_DEPENDENCIES_PLACEHOLDER "${RUNTIME_DEPENDENCIES_PLACEHOLDER}") + set(RUNTIME_DEPENDENCIES_PLACEHOLDER "${PLACEHOLDER_INDENT}${RUNTIME_DEPENDENCIES_PLACEHOLDER}") + list(JOIN RUNTIME_DEPENDENCIES_PLACEHOLDER "\n${PLACEHOLDER_INDENT}" RUNTIME_DEPENDENCIES_PLACEHOLDER) else() unset(RUNTIME_DEPENDENCIES_PLACEHOLDER) endif() + string(REPEAT " " 12 PLACEHOLDER_INDENT) get_target_property(inteface_build_dependencies_props ${TARGET_NAME} INTERFACE_LINK_LIBRARIES) unset(INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER) if(inteface_build_dependencies_props) foreach(build_dependency ${inteface_build_dependencies_props}) # Skip wrapping produced when targets are not created in the same directory if(NOT ${build_dependency} MATCHES "^::@") - list(APPEND INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER "${build_dependency}") + list(APPEND INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER "${PLACEHOLDER_INDENT}${build_dependency}") endif() endforeach() endif() @@ -187,12 +194,19 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar foreach(build_dependency ${private_build_dependencies_props}) # Skip wrapping produced when targets are not created in the same directory if(NOT ${build_dependency} MATCHES "^::@") - list(APPEND INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER "${build_dependency}") + list(APPEND INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER "${PLACEHOLDER_INDENT}${build_dependency}") endif() endforeach() endif() list(REMOVE_DUPLICATES INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER) - string(REPLACE ";" "\n" INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER "${INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER}") + list(JOIN INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER "\n" INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER) + + string(REPEAT " " 8 PLACEHOLDER_INDENT) + # If a target has an LY_PROJECT_NAME property, forward that property to new target + get_target_property(target_project_association ${TARGET_NAME} LY_PROJECT_NAME) + if(target_project_association) + list(APPEND TARGET_PROPERTIES_PLACEHOLDER "${PLACEHOLDER_INDENT}LY_PROJECT_NAME ${target_project_association}") + endif() # If the target is an executable/application, add a custom target so we can debug the target in project-centric workflow if(should_create_helper) @@ -288,44 +302,9 @@ function(ly_setup_subdirectory absolute_target_source_dir) string(APPEND all_configured_targets "${configured_target}") endforeach() - # Replicate the ly_create_alias() calls based on the SOURCE_DIR for each target that generates an installed CMakeLists.txt - string(JOIN "\n" create_alias_template - "if(NOT TARGET @ALIAS_NAME@)" - " ly_create_alias(NAME @ALIAS_NAME@ NAMESPACE @ALIAS_NAMESPACE@ TARGETS @ALIAS_TARGETS@)" - "endif()" - "" - ) - get_property(create_alias_commands_arg_list DIRECTORY ${absolute_target_source_dir} PROPERTY LY_CREATE_ALIAS_ARGUMENTS) - foreach(create_alias_single_command_arg_list ${create_alias_commands_arg_list}) - # Split the ly_create_alias arguments back out based on commas - string(REPLACE "," ";" create_alias_single_command_arg_list "${create_alias_single_command_arg_list}") - list(POP_FRONT create_alias_single_command_arg_list ALIAS_NAME) - list(POP_FRONT create_alias_single_command_arg_list ALIAS_NAMESPACE) - # The rest of the list are the target dependencies - set(ALIAS_TARGETS ${create_alias_single_command_arg_list}) - string(CONFIGURE "${create_alias_template}" create_alias_command @ONLY) - string(APPEND CREATE_ALIASES_PLACEHOLDER ${create_alias_command}) - endforeach() - - - # Reproduce the ly_enable_gems() calls made in the the SOURCE_DIR for this target into the CMakeLists.txt that - # is about to be generated - set(enable_gems_template "ly_enable_gems(@enable_gem_PROJECT_NAME@ @enable_gem_GEMS@ @enable_gem_GEM_FILE@ @enable_gem_VARIANTS@ @enable_gem_TARGETS@)\n") - get_property(enable_gems_commands_arg_list DIRECTORY ${absolute_target_source_dir} PROPERTY LY_ENABLE_GEMS_ARGUMENTS) - foreach(enable_gems_single_command_arg_list ${enable_gems_commands_arg_list}) - # Split the ly_enable_gems arguments back out based on commas - string(REPLACE "," ";" enable_gems_single_command_arg_list "${enable_gems_single_command_arg_list}") - foreach(enable_gem_arg_kw IN ITEMS PROJECT_NAME GEMS GEM_FILE VARIANTS TARGETS) - list(POP_FRONT enable_gems_single_command_arg_list enable_gem_${enable_gem_arg_kw}) - if(enable_gem_${enable_gem_arg_kw}) - # if the argument exist append to argument keyword to the front - string(PREPEND enable_gem_${enable_gem_arg_kw} "${enable_gem_arg_kw} ") - endif() - endforeach() - - string(CONFIGURE "${enable_gems_template}" enable_gems_command @ONLY) - string(APPEND ENABLE_GEMS_PLACEHOLDER ${enable_gems_command}) - endforeach() + ly_setup_subdirectory_create_alias("${absolute_target_source_dir}" CREATE_ALIASES_PLACEHOLDER) + ly_setup_subdirectory_set_gem_variant_to_load("${absolute_target_source_dir}" GEM_VARIANT_TO_LOAD_PLACEHOLDER) + ly_setup_subdirectory_enable_gems("${absolute_target_source_dir}" ENABLE_GEMS_PLACEHOLDER) ly_file_read(${LY_ROOT_FOLDER}/cmake/install/Copyright.in cmake_copyright_comment) @@ -337,6 +316,7 @@ function(ly_setup_subdirectory absolute_target_source_dir) "${all_configured_targets}" "\n" "${CREATE_ALIASES_PLACEHOLDER}" + "${GEM_VARIANT_TO_LOAD_PLACEHOLDER}" "${ENABLE_GEMS_PLACEHOLDER}" ) @@ -591,3 +571,58 @@ function(ly_setup_assets) endforeach() endfunction() + + +#! ly_setup_subdirectory_create_alias: Replicates the call to the `ly_create_alias` function +#! within the generated CMakeLists.txt in the same relative install layout directory +function(ly_setup_subdirectory_create_alias absolute_target_source_dir output_script) + # Replicate the create_alias() calls made in the SOURCE_DIR into the generated CMakeLists.txt + string(JOIN "\n" create_alias_template + "if(NOT TARGET @alias_name@)" + " ly_create_alias(@create_alias_args@)" + "endif()" + "") + + unset(${output_script} PARENT_SCOPE) + get_property(create_alias_args_list DIRECTORY ${absolute_target_source_dir} PROPERTY LY_CREATE_ALIAS_ARGUMENTS) + foreach(create_alias_args IN LISTS create_alias_args_list) + # Create a list out of the comma separated arguments and store it into the same variable + string(REPLACE "," ";" create_alias_args ${create_alias_args}) + # The first argument of the create alias argument list is the ALIAS NAME so pop it from the list + # It is used to protect against registering the same alias twice + list(POP_FRONT create_alias_args alias_name) + string(CONFIGURE "${create_alias_template}" create_alias_command @ONLY) + string(APPEND create_alias_calls ${create_alias_command}) + endforeach() + set(${output_script} ${create_alias_calls} PARENT_SCOPE) +endfunction() + +#! ly_setup_subdirectory_set_gem_variant_to_load: Replicates the call to the `ly_set_gem_variant_to_load` function +#! within the generated CMakeLists.txt in the same relative install layout directory +function(ly_setup_subdirectory_set_gem_variant_to_load absolute_target_source_dir output_script) + # Replicate the ly_set_gem_variant_to_load() calls made in the SOURCE_DIR for into the generated CMakeLists.txt + set(set_gem_variant_args_template "ly_set_gem_variant_to_load(@set_gem_variant_args@)\n") + + unset(${output_script} PARENT_SCOPE) + get_property(set_gem_variant_args_lists DIRECTORY ${absolute_target_source_dir} PROPERTY LY_SET_GEM_VARIANT_TO_LOAD_ARGUMENTS) + foreach(set_gem_variant_args IN LISTS set_gem_variant_args_lists) + string(CONFIGURE "${set_gem_variant_args_template}" set_gem_variant_to_load_command @ONLY) + string(APPEND set_gem_variant_calls ${set_gem_variant_to_load_command}) + endforeach() + set(${output_script} ${set_gem_variant_calls} PARENT_SCOPE) +endfunction() + +#! ly_setup_subdirectory_enable_gems: Replicates the call to the `ly_enable_gems` function +#! within the generated CMakeLists.txt in the same relative install layout directory +function(ly_setup_subdirectory_enable_gems absolute_target_source_dir output_script) + # Replicate the ly_set_gem_variant_to_load() calls made in the SOURCE_DIR into the generated CMakeLists.txt + set(enable_gems_template "ly_enable_gems(@enable_gems_args@)\n") + + unset(${output_script} PARENT_SCOPE) + get_property(enable_gems_args_list DIRECTORY ${absolute_target_source_dir} PROPERTY LY_ENABLE_GEMS_ARGUMENTS) + foreach(enable_gems_args IN LISTS enable_gems_args_list) + string(CONFIGURE "${enable_gems_template}" enable_gems_command @ONLY) + string(APPEND enable_gems_calls ${enable_gems_command}) + endforeach() + set(${output_script} ${enable_gems_calls} PARENT_SCOPE) +endfunction() \ No newline at end of file diff --git a/cmake/Projects.cmake b/cmake/Projects.cmake index 3f8c4ffc41..6e5b5c5f78 100644 --- a/cmake/Projects.cmake +++ b/cmake/Projects.cmake @@ -53,7 +53,7 @@ function(ly_add_target_dependencies) # Append the DEPENDENT_TARGETS to the list of ALL_GEM_DEPENDENCIES list(APPEND ALL_GEM_DEPENDENCIES ${ly_add_gem_dependencies_DEPENDENT_TARGETS}) - # for each target, add the dependencies and generate gems json + # for each target, add the dependencies and generate setreg json with the list of gems to load foreach(target ${ly_add_gem_dependencies_TARGETS}) ly_add_dependencies(${target} ${ALL_GEM_DEPENDENCIES}) @@ -69,39 +69,6 @@ function(ly_add_target_dependencies) endforeach() endfunction() -#! ly_add_project_dependencies: adds the dependencies to runtime and tools for this project. -# -# Each project may have dependencies to gems. To properly define these dependencies, we are making the project to define -# through a "files list" cmake file the dependencies to the different targets. -# So for example, the game's runtime dependencies are associated to the project's launcher; the game's tools dependencies -# are associated to the asset processor; etc -# -# \arg:PROJECT_NAME name of the game project -# \arg:TARGETS names of the targets to associate the dependencies to -# \arg:DEPENDENCIES_FILES file(s) that contains the runtime dependencies the TARGETS will be associated to -# \arg:DEPENDENT_TARGETS additional list of targets should be added as load-time dependencies for the TARGETS list -# -function(ly_add_project_dependencies) - - set(options) - set(oneValueArgs PROJECT_NAME) - set(multiValueArgs TARGETS DEPENDENCIES_FILES DEPENDENT_TARGETS) - - cmake_parse_arguments(ly_add_project_dependencies "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - - # Validate input arguments - if(NOT ly_add_project_dependencies_PROJECT_NAME) - message(FATAL_ERROR "PROJECT_NAME parameter missing. If not project name is needed, then call ly_add_target_dependencies directly") - endif() - - ly_add_target_dependencies( - PREFIX ${ly_add_project_dependencies_PROJECT_NAME} - TARGETS ${ly_add_project_dependencies_TARGETS} - DEPENDENCIES_FILES ${ly_add_project_dependencies_DEPENDENCIES_FILES} - DEPENDENT_TARGETS ${ly_add_project_dependencies_DEPENDENT_TARGETS} - ) -endfunction() - #template for generating the project build_path setreg set(project_build_path_template [[ diff --git a/cmake/SettingsRegistry.cmake b/cmake/SettingsRegistry.cmake index ebf2254dc6..58beba089c 100644 --- a/cmake/SettingsRegistry.cmake +++ b/cmake/SettingsRegistry.cmake @@ -28,7 +28,7 @@ set(gems_json_template [[ string(APPEND gem_module_template [=[ "@stripped_gem_target@":]=] "\n" [=[ {]=] "\n" -[=[$<$,INTERFACE_LIBRARY>>: "Modules":["$"]]=] "$\n>" +[=[$<$,MODULE_LIBRARY$SHARED_LIBRARY>: "Modules":["$"]]=] "$\n>" [=[ "SourcePaths":["@gem_module_root_relative_to_engine_root@"]]=] "\n" [=[ }]=] ) @@ -87,7 +87,7 @@ endfunction() # # \arg:gem_target(TARGET) - Target to look upwards from using its SOURCE_DIR property function(ly_get_gem_module_root output_gem_module_root gem_target) - unset(gem_module_roots) + unset(${output_gem_module_root} PARENT_SCOPE) get_property(gem_source_dir TARGET ${gem_target} PROPERTY SOURCE_DIR) if(gem_source_dir) @@ -96,8 +96,8 @@ function(ly_get_gem_module_root output_gem_module_root gem_target) while(NOT EXISTS ${candidate_gem_dir}/gem.json) get_filename_component(parent_dir ${candidate_gem_dir} DIRECTORY) if (${parent_dir} STREQUAL ${candidate_gem_dir}) - message(WARNING "Did not find a gem.json while processing GEM_MODULE target ${gem_target}!") - break() + # "Did not find a gem.json while processing GEM_MODULE target ${gem_target}!" + return() endif() set(candidate_gem_dir ${parent_dir}) endwhile() @@ -160,11 +160,15 @@ function(ly_delayed_generate_settings_registry) endif() ly_get_gem_module_root(gem_module_root ${gem_target}) + if (NOT gem_module_root) + # If the target doesn't have a gem.json, skip it + continue() + endif() file(RELATIVE_PATH gem_module_root_relative_to_engine_root ${LY_ROOT_FOLDER} ${gem_module_root}) # De-alias namespace from gem targets before configuring them into the json template ly_de_alias_target(${gem_target} stripped_gem_target) - string(CONFIGURE ${gem_module_template} gem_module_json @ONLY) + string(CONFIGURE "${gem_module_template}" gem_module_json @ONLY) list(APPEND target_gem_dependencies_names ${gem_module_json}) endforeach() @@ -177,7 +181,8 @@ function(ly_delayed_generate_settings_registry) string(CONFIGURE ${gems_json_template} gem_json @ONLY) get_target_property(is_imported ${target} IMPORTED) get_target_property(target_type ${target} TYPE) - if(is_imported OR target_type STREQUAL UTILITY) + set(non_loadable_types "UTILITY" "INTERFACE_LIBRARY" "STATIC_LIBRARY") + if(is_imported OR (target_type IN_LIST non_loadable_types)) unset(target_dir) foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) string(TOUPPER ${conf} UCONF) diff --git a/cmake/install/InstalledTarget.in b/cmake/install/InstalledTarget.in index a4f4fa4763..2095211bb2 100644 --- a/cmake/install/InstalledTarget.in +++ b/cmake/install/InstalledTarget.in @@ -15,6 +15,8 @@ ly_add_target( @INTERFACE_BUILD_DEPENDENCIES_PLACEHOLDER@ RUNTIME_DEPENDENCIES @RUNTIME_DEPENDENCIES_PLACEHOLDER@ + TARGET_PROPERTIES +@TARGET_PROPERTIES_PLACEHOLDER@ ) @TARGET_RUN_HELPER@ From eae08c4b5449a7a4933648a8e9d49b582cba23e6 Mon Sep 17 00:00:00 2001 From: SJ Date: Wed, 1 Sep 2021 09:03:21 -0700 Subject: [PATCH 079/355] [Mac] Fix crash in Editor and AssetProcessor. (#3786) Signed-off-by: amzn-sj --- Code/Editor/Platform/Mac/main_dummy.cpp | 2 +- Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Editor/Platform/Mac/main_dummy.cpp b/Code/Editor/Platform/Mac/main_dummy.cpp index 814cbfde66..348a32ab47 100644 --- a/Code/Editor/Platform/Mac/main_dummy.cpp +++ b/Code/Editor/Platform/Mac/main_dummy.cpp @@ -66,7 +66,7 @@ int main(int argc, char* argv[]) processLaunchInfo.m_environmentVariables = &envVars; processLaunchInfo.m_showWindow = true; - AZStd::unique_ptr processWatcher(AzFramework::ProcessWatcher::LaunchProcess(processLaunchInfo, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_NONE)); + AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo); application.Destroy(); diff --git a/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp b/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp index e624b40787..3eed37e555 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp +++ b/Code/Tools/AssetProcessor/Platform/Mac/main_dummy.cpp @@ -66,7 +66,7 @@ int main(int argc, char* argv[]) processLaunchInfo.m_environmentVariables = &envVars; processLaunchInfo.m_showWindow = true; - AZStd::unique_ptr processWatcher(AzFramework::ProcessWatcher::LaunchProcess(processLaunchInfo, AzFramework::ProcessCommunicationType::COMMUNICATOR_TYPE_NONE)); + AzFramework::ProcessLauncher::LaunchUnwatchedProcess(processLaunchInfo); application.Destroy(); From 043a2c65ffee32a8e6151fffdc6ab52e7d67555c Mon Sep 17 00:00:00 2001 From: Nicholas Lawson <70027408+lawsonamzn@users.noreply.github.com> Date: Wed, 1 Sep 2021 09:04:20 -0700 Subject: [PATCH 080/355] Updates zlib to rev2 of the package, static only (#3725) The previous version of the package was dynamic on some platforms, and static on others. This makes it static across the board and also makes it compatible with other 3p libraries wanting to use zlib. Signed-off-by: lawsonamzn <70027408+lawsonamzn@users.noreply.github.com> --- cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake | 2 +- cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 2 +- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 2 +- cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index a65e8b45e4..cbdca10af9 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -27,4 +27,4 @@ ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-android TARGETS goo ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-android TARGETS GoogleBenchmark PACKAGE_HASH 20b46e572211a69d7d94ddad1c89ec37bb958711d6ad4025368ac89ea83078fb) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-android TARGETS libsamplerate PACKAGE_HASH bf13662afe65d02bcfa16258a4caa9b875534978227d6f9f36c9cfa92b3fb12b) ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-android TARGETS OpenSSL PACKAGE_HASH 4036d4019d722f0e1b7a1621bf60b5a17ca6a65c9c78fd8701cee1131eec8480) -ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev1-android TARGETS zlib PACKAGE_HASH 832b163cae0cccbe4fddc5988f5725fac56ef7dba5bfe95bf8c71281fba2e12c) +ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-android TARGETS zlib PACKAGE_HASH 85b730b97176772538cfcacd6b6aaf4655fc2d368d134d6dd55e02f28f183826) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index ba63ef5d64..0cbb799304 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -43,7 +43,7 @@ ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev2-linux ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-linux TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 88c4a359325d749bc34090b9ac466424847f3b71ba0de15045cf355c17c07099) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-linux TARGETS SPIRVCross PACKAGE_HASH 7889ee5460a688e9b910c0168b31445c0079d363affa07b25d4c8aeb608a0b80) ly_associate_package(PACKAGE_NAME azslc-1.7.23-rev2-linux TARGETS azslc PACKAGE_HASH 1ba84d8321a566d35a1e9aa7400211ba8e6d1c11c08e4be3c93e6e74b8f7aef1) -ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev1-linux TARGETS zlib PACKAGE_HASH 6418e93b9f4e6188f3b62cbd3a7822e1c4398a716e786d1522b809a727d08ba9) +ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-linux TARGETS zlib PACKAGE_HASH 16f3b9e11cda525efb62144f354c1cfc30a5def9eff020dbe49cb00ee7d8234f) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-linux TARGETS squish-ccr PACKAGE_HASH 85fecafbddc6a41a27c5f59ed4a5dfb123a94cb4666782cf26e63c0a4724c530) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-linux TARGETS ISPCTexComp PACKAGE_HASH 065fd12abe4247dde247330313763cf816c3375c221da030bdec35024947f259) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index be89612c1b..e18bb07772 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -41,7 +41,7 @@ ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-mac ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-mac TARGETS OpenSSL PACKAGE_HASH 28adc1c0616ac0482b2a9d7b4a3a3635a1020e87b163f8aba687c501cf35f96c) ly_associate_package(PACKAGE_NAME qt-5.15.2-rev5-mac TARGETS Qt PACKAGE_HASH 9d25918351898b308ded3e9e571fff6f26311b2071aeafd00dd5b249fdf53f7e) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-mac TARGETS libsamplerate PACKAGE_HASH b912af40c0ac197af9c43d85004395ba92a6a859a24b7eacd920fed5854a97fe) -ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev1-mac TARGETS zlib PACKAGE_HASH 7fd8a77b3598423d9d6be5f8c60d52aecf346ab4224f563a5282db283aa0da02) +ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-mac TARGETS zlib PACKAGE_HASH 21714e8a6de4f2523ee92a7f52d51fbee29c5f37ced334e00dc3c029115b472e) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-mac TARGETS squish-ccr PACKAGE_HASH 155bfbfa17c19a9cd2ef025de14c5db598f4290045d5b0d83ab58cb345089a77) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-mac TARGETS ISPCTexComp PACKAGE_HASH 8a4e93277b8face6ea2fd57c6d017bdb55643ed3d6387110bc5f6b3b884dd169) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 10b56f90d9..305d1291e7 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -48,6 +48,6 @@ ly_associate_package(PACKAGE_NAME OpenMesh-8.1-rev1-windows ly_associate_package(PACKAGE_NAME civetweb-1.8-rev1-windows TARGETS civetweb PACKAGE_HASH 36d0e58a59bcdb4dd70493fb1b177aa0354c945b06c30416348fd326cf323dd4) ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev2-windows TARGETS OpenSSL PACKAGE_HASH 9af1c50343f89146b4053101a7aeb20513319a3fe2f007e356d7ce25f9241040) ly_associate_package(PACKAGE_NAME Crashpad-0.8.0-rev1-windows TARGETS Crashpad PACKAGE_HASH d162aa3070147bc0130a44caab02c5fe58606910252caf7f90472bd48d4e31e2) -ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev1-windows TARGETS zlib PACKAGE_HASH 6fb46a0ef8c8614cde3517b50fca47f2a6d1fd059b21f3b8ff13e635ca7f2fa6) +ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-windows TARGETS zlib PACKAGE_HASH 9afab1d67641ed8bef2fb38fc53942da47f2ab339d9e77d3d20704a48af2da0b) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-windows TARGETS squish-ccr PACKAGE_HASH 5c3d9fa491e488ccaf802304ad23b932268a2b2846e383f088779962af2bfa84) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-windows TARGETS ISPCTexComp PACKAGE_HASH b6fa6ea28a2808a9a5524c72c37789c525925e435770f2d94eb2d387360fa2d0) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index c288460dd0..0574f38654 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -28,4 +28,4 @@ ly_associate_package(PACKAGE_NAME googletest-1.8.1-rev4-ios TARGETS googlet ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-ios TARGETS GoogleBenchmark PACKAGE_HASH c2ffaed2b658892b1bcf81dee4b44cd1cb09fc78d55584ef5cb8ab87f2d8d1ae) ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-ios TARGETS libsamplerate PACKAGE_HASH 7656b961697f490d4f9c35d2e61559f6fc38c32102e542a33c212cd618fc2119) ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-ios TARGETS OpenSSL PACKAGE_HASH cd0dfce3086a7172777c63dadbaf0ac3695b676119ecb6d0614b5fb1da03462f) -ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev1-ios TARGETS zlib PACKAGE_HASH 20bfccf3b98bd9a7d3506cf344ac48135035eb517752bf9bede1e821f163608d) +ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-ios TARGETS zlib PACKAGE_HASH a59fc0f83a02c616b679799310e9d86fde84514c6d2acefa12c6def0ae4a880c) From b9c0b2a5f7226868cd15f8294999c0be022a23db Mon Sep 17 00:00:00 2001 From: Qing Tao <55564570+VickyAtAZ@users.noreply.github.com> Date: Wed, 1 Sep 2021 09:06:06 -0700 Subject: [PATCH 081/355] Fixed a crash issue with RHI::Fence when trying to capture screenshot which null renderer is used. (#3802) ATOM-16292, ATOM-16243, ATOM-15493 Signed-off-by: qingtao --- .../Atom/Feature/Utils/FrameCaptureBus.h | 5 +++ .../Source/FrameCaptureSystemComponent.cpp | 27 +++++++++++++ .../Code/Source/FrameCaptureSystemComponent.h | 1 + Gems/Atom/RHI/Null/Code/Source/RHI/Fence.cpp | 20 ++++++++++ Gems/Atom/RHI/Null/Code/Source/RHI/Fence.h | 40 +++++++++++++++++++ .../Null/Code/Source/RHI/SystemComponent.cpp | 3 +- .../atom_rhi_null_private_common_files.cmake | 2 + .../RPI.Public/Pass/AttachmentReadback.cpp | 6 +++ 8 files changed, 103 insertions(+), 1 deletion(-) create mode 100644 Gems/Atom/RHI/Null/Code/Source/RHI/Fence.cpp create mode 100644 Gems/Atom/RHI/Null/Code/Source/RHI/Fence.h diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h index 919d1b7468..93600ec08f 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Utils/FrameCaptureBus.h @@ -31,6 +31,11 @@ namespace AZ { public: virtual ~FrameCaptureRequests() = default; + + //! Return true if frame capture is available. + //! It may return false if null renderer is used. + //! If the frame capture is not available, all capture functions in this interface would return false + virtual bool CanCapture() const = 0; //! Capture final screen output for the specified window and save it to given file path. //! The image format is determinate by file extension diff --git a/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp b/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp index 7374fdaf71..9f6d2a343d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.cpp @@ -8,6 +8,8 @@ #include "FrameCaptureSystemComponent.h" +#include + #include #include #include @@ -254,8 +256,18 @@ namespace AZ return AZStd::string(resolvedPath); } + bool FrameCaptureSystemComponent::CanCapture() const + { + return !AZ::RHI::IsNullRenderer(); + } + bool FrameCaptureSystemComponent::CaptureScreenshotForWindow(const AZStd::string& filePath, AzFramework::NativeWindowHandle windowHandle) { + if (!CanCapture()) + { + return false; + } + InitReadback(); if (m_state != State::Idle) @@ -301,6 +313,11 @@ namespace AZ bool FrameCaptureSystemComponent::CaptureScreenshotWithPreview(const AZStd::string& outputFilePath) { + if (!CanCapture()) + { + return false; + } + InitReadback(); if (m_state != State::Idle) @@ -350,6 +367,11 @@ namespace AZ bool FrameCaptureSystemComponent::CapturePassAttachment(const AZStd::vector& passHierarchy, const AZStd::string& slot, const AZStd::string& outputFilePath, RPI::PassAttachmentReadbackOption option) { + if (!CanCapture()) + { + return false; + } + InitReadback(); if (m_state != State::Idle) @@ -396,6 +418,11 @@ namespace AZ bool FrameCaptureSystemComponent::CapturePassAttachmentWithCallback(const AZStd::vector& passHierarchy, const AZStd::string& slotName , RPI::AttachmentReadback::CallbackFunction callback, RPI::PassAttachmentReadbackOption option) { + if (!CanCapture()) + { + return false; + } + bool result = CapturePassAttachment(passHierarchy, slotName, "", option); // Append state change to user provided call back diff --git a/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.h b/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.h index 5dbaa5dee6..20e233ce62 100644 --- a/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.h +++ b/Gems/Atom/Feature/Common/Code/Source/FrameCaptureSystemComponent.h @@ -34,6 +34,7 @@ namespace AZ void Deactivate() override; // FrameCaptureRequestBus overrides ... + bool CanCapture() const override; bool CaptureScreenshot(const AZStd::string& filePath) override; bool CaptureScreenshotForWindow(const AZStd::string& filePath, AzFramework::NativeWindowHandle windowHandle) override; bool CaptureScreenshotWithPreview(const AZStd::string& outputFilePath) override; diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Fence.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/Fence.cpp new file mode 100644 index 0000000000..dc3743c101 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Fence.cpp @@ -0,0 +1,20 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#include + + +namespace AZ +{ + namespace Null + { + RHI::Ptr Fence::Create() + { + return aznew Fence(); + } + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/Fence.h b/Gems/Atom/RHI/Null/Code/Source/RHI/Fence.h new file mode 100644 index 0000000000..fb64727362 --- /dev/null +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/Fence.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include + +namespace AZ +{ + namespace Null + { + class Fence + : public RHI::Fence + { + using Base = RHI::Fence; + public: + AZ_RTTI(Fence, "{34908F40-A7DE-4EE8-A871-71ACE0C24972}", Base); + AZ_CLASS_ALLOCATOR(Fence, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + private: + Fence() = default; + + ////////////////////////////////////////////////////////////////////////// + // RHI::Fence + RHI::ResultCode InitInternal([[maybe_unused]] RHI::Device& device, [[maybe_unused]] RHI::FenceState initialState) override { return RHI::ResultCode::Success;} + void ShutdownInternal() override {} + void SignalOnCpuInternal() override {} + void WaitOnCpuInternal() const override {} + void ResetInternal() override {} + RHI::FenceState GetFenceStateInternal() const override { return RHI::FenceState::Signaled;}; + ////////////////////////////////////////////////////////////////////////// + }; + } +} diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp b/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp index d72de7996e..091084b097 100644 --- a/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp +++ b/Gems/Atom/RHI/Null/Code/Source/RHI/SystemComponent.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -99,7 +100,7 @@ namespace AZ RHI::Ptr SystemComponent::CreateFence() { - return nullptr; + return Fence::Create(); } RHI::Ptr SystemComponent::CreateBuffer() diff --git a/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake b/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake index 13e16be77b..ad57002dd3 100644 --- a/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake +++ b/Gems/Atom/RHI/Null/Code/atom_rhi_null_private_common_files.cmake @@ -21,6 +21,8 @@ set(FILES Source/RHI/CommandQueue.h Source/RHI/Device.cpp Source/RHI/Device.h + Source/RHI/Fence.cpp + Source/RHI/Fence.h Source/RHI/FrameGraphCompiler.cpp Source/RHI/FrameGraphCompiler.h Source/RHI/FrameGraphExecuter.cpp diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp index 319cf85fe5..146c37fe1b 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -175,6 +176,11 @@ namespace AZ bool AttachmentReadback::ReadPassAttachment(const PassAttachment* attachment, const AZ::Name& readbackName) { + if (AZ::RHI::IsNullRenderer()) + { + return false; + } + if (!IsReady()) { AZ_Assert(false, "AttachmentReadback is not ready to readback an attachment"); From 82659f24e9e840d20f52402d20b597c8fffcf6ae Mon Sep 17 00:00:00 2001 From: bosnichd Date: Wed, 1 Sep 2021 10:24:29 -0600 Subject: [PATCH 082/355] Add support for a custom path root separator using a trait. (#3678) * - Add support for a custom path root separator using a trait. - Ensure to set both FilePathKey_ProjectUserPath and FilePathKey_ProjectLogPath to a writeable storage location on non-host platforms. Signed-off-by: bosnichd * Remove az_trait_validator.py, as our PAL guidance no longer dictates that all traits must be defined for all platforms. Signed-off-by: bosnichd * Updated based on review feedback. Signed-off-by: bosnichd --- Code/Framework/AzCore/AzCore/IO/Path/Path.inl | 31 +++++-- .../Settings/SettingsRegistryMergeUtils.cpp | 11 ++- .../validators/test_az_trait_validator.py | 92 ------------------- .../validators/az_trait_validator.py | 57 ------------ 4 files changed, 32 insertions(+), 159 deletions(-) delete mode 100755 scripts/commit_validation/commit_validation/tests/validators/test_az_trait_validator.py delete mode 100755 scripts/commit_validation/commit_validation/validators/az_trait_validator.py diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl index 309a4fa050..6354324136 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl @@ -11,6 +11,7 @@ #include #include #include +#include // extern instantiations of Path templates to prevent implicit instantiations namespace AZ::IO @@ -92,11 +93,23 @@ namespace AZ::IO::Internal constexpr auto ConsumeRootName(InputIt entryBeginIter, InputIt entryEndIter, const char preferredSeparator) -> AZStd::enable_if_t, InputIt> { - if (preferredSeparator == '/') + if (preferredSeparator == PosixPathSeparator) { // If the preferred separator is forward slash the parser is in posix path - // parsing mode, which doesn't have a root name + // parsing mode, which doesn't have a root name, + // unless we're on a posix platform that uses a custom path root separator + #if defined(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) + const AZStd::string_view path{ entryBeginIter, entryEndIter }; + const auto positionOfPathSeparator = path.find(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR); + if (positionOfPathSeparator == AZStd::string_view::npos) + { + return entryBeginIter; + } + const AZStd::string_view rootName{ path.substr(0, positionOfPathSeparator + 1) }; + return AZStd::next(entryBeginIter, rootName.size()); + #else return entryBeginIter; + #endif } else { @@ -185,13 +198,18 @@ namespace AZ::IO::Internal template >> static constexpr bool IsAbsolute(InputIt first, EndIt last, const char preferredSeparator) { - size_t pathSize = AZStd::distance(first, last); - // If the preferred separator is a forward slash - // than an absolute path is simply one that starts with a forward slash - if (preferredSeparator == '/') + // than an absolute path is simply one that starts with a forward slash, + // unless we're on a posix platform that uses a custom path root separator + if (preferredSeparator == PosixPathSeparator) { + #if defined(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) + const AZStd::string_view path{ first, last }; + return path.find(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) != AZStd::string_view::npos; + #else + const size_t pathSize = AZStd::distance(first, last); return pathSize > 0 && IsSeparator(*first); + #endif } else { @@ -199,6 +217,7 @@ namespace AZ::IO::Internal { // If a windows path ends starts with C:foo it is a root relative path // A path is absolute root absolute on windows if it starts with + const size_t pathSize = AZStd::distance(first, last); return pathSize > 2 && Internal::IsSeparator(*AZStd::next(first, 2)); } diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp index 6b89b8c044..0ca354ac95 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp @@ -550,7 +550,7 @@ namespace AZ::SettingsRegistryMergeUtils } registry.Set(FilePathKey_ProjectUserPath, projectUserPath.Native()); - // Set the user directory with the provided path or using project/user as default + // Set the log directory with the provided path or using project/user/log as default auto projectLogPathKey = FixedValueString::format("%s/project_log_path", BootstrapSettingsRootKey); AZ::IO::FixedMaxPath projectLogPath; if (!registry.Get(projectLogPath.Native(), projectLogPathKey)) @@ -640,7 +640,7 @@ namespace AZ::SettingsRegistryMergeUtils } #if !AZ_TRAIT_OS_IS_HOST_OS_PLATFORM - // Setup the cache and user paths when to platform specific locations when running on non-host platforms + // Setup the cache, user, and log paths to platform specific locations when running on non-host platforms path = engineRoot; if (AZStd::optional nonHostCacheRoot = Utils::GetDefaultAppRootPath(); nonHostCacheRoot) @@ -656,13 +656,16 @@ namespace AZ::SettingsRegistryMergeUtils if (AZStd::optional devWriteStorage = Utils::GetDevWriteStoragePath(); devWriteStorage) { - registry.Set(FilePathKey_DevWriteStorage, *devWriteStorage); - registry.Set(FilePathKey_ProjectUserPath, *devWriteStorage); + const AZ::IO::FixedMaxPath devWriteStoragePath(*devWriteStorage); + registry.Set(FilePathKey_DevWriteStorage, devWriteStoragePath.LexicallyNormal().Native()); + registry.Set(FilePathKey_ProjectUserPath, (devWriteStoragePath / "user").LexicallyNormal().Native()); + registry.Set(FilePathKey_ProjectLogPath, (devWriteStoragePath / "user/log").LexicallyNormal().Native()); } else { registry.Set(FilePathKey_DevWriteStorage, path.LexicallyNormal().Native()); registry.Set(FilePathKey_ProjectUserPath, (path / "user").LexicallyNormal().Native()); + registry.Set(FilePathKey_ProjectLogPath, (path / "user/log").LexicallyNormal().Native()); } #endif // AZ_TRAIT_OS_IS_HOST_OS_PLATFORM } diff --git a/scripts/commit_validation/commit_validation/tests/validators/test_az_trait_validator.py b/scripts/commit_validation/commit_validation/tests/validators/test_az_trait_validator.py deleted file mode 100755 index 9474fd00b6..0000000000 --- a/scripts/commit_validation/commit_validation/tests/validators/test_az_trait_validator.py +++ /dev/null @@ -1,92 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# - -import unittest -from unittest.mock import patch, mock_open - -from commit_validation import pal_allowedlist -from commit_validation.tests.mocks.mock_commit import MockCommit -from commit_validation.validators.az_trait_validator import AzTraitValidator - -import pytest - - -class Test_AzTraitValidatorTests(): - def test_fileDoesntCheckAzTraitIsDefined_passes(self): - commit = MockCommit( - files=['someCppFile.cpp'], - file_diffs={ 'someCppFile.cpp' : ''} - ) - error_list = [] - assert AzTraitValidator().run(commit, error_list) - assert len(error_list) == 0, f"Unexpected errors: {error_list}" - - @pytest.mark.parametrize( - 'file_diffs,expect_success', [ - pytest.param('+This file does contain\n' - '+a trait existence check\n' - '+#ifdef AZ_TRAIT_USED_INCORRECTLY\n', - False, - id="AZ_TRAIT_inside_ifdef_fails" ), # gives the test a friendly name! - - pytest.param('+This file does contain\n' - '+a trait existence check\n' - '+#if defined(AZ_TRAIT_USED_INCORRECTLY)\n', - False, - id="AZ_TRAIT_inside_if_defined_fails" ), - - pytest.param('+This file does contain\n' - '+a trait existence check\n' - '+#ifndef AZ_TRAIT_USED_INCORRECTLY\n', - False, - id="AZ_TRAIT_inside_ifndef_fails" ), - - pytest.param('+This file contains a diff which REMOVES an incorrect usage\n' - '-#ifndef AZ_TRAIT_USED_INCORRECTLY\n', - True, - id="AZ_TRAIT_removed_in_diff_passes" ), - - pytest.param('+This file contains a diff which has an old already okayed usage\n' - '+which is not actually part of the diff.\n' - '#ifndef AZ_TRAIT_USED_INCORRECTLY\n', - True, - id="AZ_TRAIT_in_unmodified_section_passes"), - - pytest.param('+This file contains the correct usage\n' - '+#if AZ_TRAIT_USED_CORRECTLY\n', - True, - id="AZ_TRAIT_correct_usage_passes"), - ]) - def test_fileChecksAzTraitIsDefined(self, file_diffs, expect_success): - commit = MockCommit( - files=['someCppFile.cpp'], - file_diffs={ 'someCppFile.cpp' : file_diffs }) - - error_list = [] - if expect_success: - assert AzTraitValidator().run(commit, error_list) - assert len(error_list) == 0, f"Unexpected errors: {error_list}" - else: - assert not AzTraitValidator().run(commit, error_list) - assert len(error_list) != 0, f"Errors were expected but none were returned." - - def test_fileExtensionIgnored_passes(self): - commit = MockCommit(files=['someCppFile.waf_files']) - error_list = [] - assert AzTraitValidator().run(commit, error_list) - assert len(error_list) == 0, f"Unexpected errors: {error_list}" - - @patch('commit_validation.pal_allowedlist.load', return_value=pal_allowedlist.PALAllowedlist(['*/some/path/*'])) - def test_fileAllowedlisted_passes(self, mocked_load): - commit = MockCommit(files=['/path/to/some/path/someCppFile.cpp']) - error_list = [] - assert AzTraitValidator().run(commit, error_list) - assert len(error_list) == 0, f"Unexpected errors: {error_list}" - -if __name__ == '__main__': - unittest.main() diff --git a/scripts/commit_validation/commit_validation/validators/az_trait_validator.py b/scripts/commit_validation/commit_validation/validators/az_trait_validator.py deleted file mode 100755 index 595cea8720..0000000000 --- a/scripts/commit_validation/commit_validation/validators/az_trait_validator.py +++ /dev/null @@ -1,57 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# - -import os -import re -from typing import Type, List - -import commit_validation.pal_allowedlist as pal_allowedlist -from commit_validation.commit_validation import Commit, CommitValidator, SOURCE_FILE_EXTENSIONS, VERBOSE - -ifdef_regex = re.compile(r'^\+\s*#\s*ifn?def\s+AZ_TRAIT_') -defined_regex = re.compile(r'\sdefined\s*\(\s*AZ_TRAIT_') - - -class AzTraitValidator(CommitValidator): - """A file-level validator that makes sure a file does not contain existence checks for AZ_TRAIT macros""" - - def __init__(self) -> None: - self.pal_allowedlist = pal_allowedlist.load() - - def run(self, commit: Commit, errors: List[str]) -> bool: - for file_name in commit.get_files(): - if os.path.splitext(file_name)[1].lower() not in SOURCE_FILE_EXTENSIONS: - if VERBOSE: print(f'{file_name}::{self.__class__.__name__} SKIPPED - File excluded based on extension.') - continue - if self.pal_allowedlist.is_match(file_name): - if VERBOSE: print(f'{file_name}::{self.__class__.__name__} SKIPPED - File excluded based on PAL allowedlist.') - continue - - file_diff = commit.get_file_diff(file_name) - previous_line_context = "" - - for line in file_diff.splitlines(): - # we only care about added lines. - if line.startswith('+'): - if ifdef_regex.search(line) or defined_regex.search(line): - error_message = str( - f'{file_name}::{self.__class__.__name__} FAILED - Source file contains an existence ' - f'check for an AZ_TRAIT macro in this code: \n' - f' {previous_line_context}\n' - f' ----> {line}\n' - f'Traits should be tested for true/false, since they are guaranteed to exist on all platforms.') - if VERBOSE: print(error_message) - errors.append(error_message) - previous_line_context = line - - return (not errors) - - -def get_validator() -> Type[AzTraitValidator]: - """Returns the validator class for this module""" - return AzTraitValidator From 451f267d583b1f0194da1275a8975566da186309 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 1 Sep 2021 09:47:53 -0700 Subject: [PATCH 083/355] Changes the cast for WinAPI mutex (#3843) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/std/parallel/internal/condition_variable_WinAPI.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h index 4ac95139db..b0ed025a36 100644 --- a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h +++ b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/condition_variable_WinAPI.h @@ -198,7 +198,7 @@ namespace AZStd AZ_FORCE_INLINE cv_status condition_variable_any::wait_for(Lock& lock, const chrono::duration& rel_time) { chrono::milliseconds toWait = rel_time; - EnterCriticalSection(static_cast(&m_mutex)); + EnterCriticalSection(AZ_STD_MUTEX_CAST(m_mutex)); lock.unlock(); // We need to make sure we use CriticalSection based mutex. @@ -217,7 +217,7 @@ namespace AZStd returnCode = cv_status::timeout; } } - LeaveCriticalSection(static_cast(&m_mutex)); + LeaveCriticalSection(AZ_STD_MUTEX_CAST(m_mutex)); lock.lock(); return returnCode; } From 2d623590e8f0fe74f7aafbcdf0856b4a30a85205 Mon Sep 17 00:00:00 2001 From: amzn-phist <52085794+amzn-phist@users.noreply.github.com> Date: Wed, 1 Sep 2021 14:33:23 -0500 Subject: [PATCH 084/355] Fix the DefaultGem template's Editor target (#3853) Removes the OUTPUT_NAME from the .Editor target in the Gem template. Removes the same from Gems that have it currently. Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com> --- Gems/LyShine/Code/CMakeLists.txt | 5 ++--- Gems/Terrain/Code/CMakeLists.txt | 5 ++--- Templates/DefaultGem/Template/Code/CMakeLists.txt | 1 - 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Gems/LyShine/Code/CMakeLists.txt b/Gems/LyShine/Code/CMakeLists.txt index 93bf84c66e..f8c2ebfd07 100644 --- a/Gems/LyShine/Code/CMakeLists.txt +++ b/Gems/LyShine/Code/CMakeLists.txt @@ -29,7 +29,7 @@ ly_add_target( Gem::Atom_Utils.Static Gem::Atom_Bootstrap.Headers Gem::AtomFont - Gem::TextureAtlas + Gem::TextureAtlas ) ly_add_target( @@ -151,12 +151,11 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) Gem::Atom_RPI.Public Gem::Atom_Utils.Static Gem::Atom_Bootstrap.Headers - ) + ) ly_add_target( NAME LyShine.Builders GEM_MODULE NAMESPACE Gem - OUTPUT_NAME Gem.LyShine.Builders FILES_CMAKE lyshine_common_module_files.cmake COMPILE_DEFINITIONS diff --git a/Gems/Terrain/Code/CMakeLists.txt b/Gems/Terrain/Code/CMakeLists.txt index f40dd17ede..b4a35edbbf 100644 --- a/Gems/Terrain/Code/CMakeLists.txt +++ b/Gems/Terrain/Code/CMakeLists.txt @@ -1,6 +1,6 @@ # # Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. -# +# # SPDX-License-Identifier: Apache-2.0 OR MIT # # @@ -44,7 +44,7 @@ ly_add_target( Gem::LmbrCentral ) -# the above module is for use in all client/server types +# the above module is for use in all client/server types ly_create_alias(NAME Terrain.Servers NAMESPACE Gem TARGETS Gem::Terrain) ly_create_alias(NAME Terrain.Clients NAMESPACE Gem TARGETS Gem::Terrain) @@ -55,7 +55,6 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS) NAME Terrain.Editor MODULE NAMESPACE Gem AUTOMOC - OUTPUT_NAME Gem.Terrain.Editor FILES_CMAKE terrain_editor_shared_files.cmake COMPILE_DEFINITIONS diff --git a/Templates/DefaultGem/Template/Code/CMakeLists.txt b/Templates/DefaultGem/Template/Code/CMakeLists.txt index 181491d504..f462e7f2d4 100644 --- a/Templates/DefaultGem/Template/Code/CMakeLists.txt +++ b/Templates/DefaultGem/Template/Code/CMakeLists.txt @@ -85,7 +85,6 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS) NAME ${Name}.Editor GEM_MODULE NAMESPACE Gem AUTOMOC - OUTPUT_NAME Gem.${Name}.Editor FILES_CMAKE ${NameLower}_editor_shared_files.cmake INCLUDE_DIRECTORIES From a54fceccc6c1f369ad18a15e2ae16e452b3e1c7f Mon Sep 17 00:00:00 2001 From: Qing Tao <55564570+VickyAtAZ@users.noreply.github.com> Date: Wed, 1 Sep 2021 14:22:25 -0700 Subject: [PATCH 085/355] Add atom_rpi_tools to install package. (#3852) Signed-off-by: qingtao --- Gems/Atom/RPI/Tools/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gems/Atom/RPI/Tools/CMakeLists.txt b/Gems/Atom/RPI/Tools/CMakeLists.txt index 62ba4cfb09..5dacb73b0f 100644 --- a/Gems/Atom/RPI/Tools/CMakeLists.txt +++ b/Gems/Atom/RPI/Tools/CMakeLists.txt @@ -18,3 +18,6 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) endif() endif() +ly_install_directory(DIRECTORIES . + EXCLUDE_PATTERNS tests +) From f58b51b8ad6fabf8f35aa4d7522497c4cb992097 Mon Sep 17 00:00:00 2001 From: michabr <82236305+michabr@users.noreply.github.com> Date: Wed, 1 Sep 2021 15:41:44 -0700 Subject: [PATCH 086/355] Fix blend mode options for LyShine's image component (#2377) * Fix blend mode options for LyShine's image component * Fix Lighten blend mode * Fix errors from last merge Signed-off-by: abrmich --- Gems/LyShine/Code/Source/RenderGraph.cpp | 114 +++++++++-------------- Gems/LyShine/Code/Source/RenderGraph.h | 10 +- Gems/LyShine/Code/Source/UiRenderer.h | 13 +-- 3 files changed, 55 insertions(+), 82 deletions(-) diff --git a/Gems/LyShine/Code/Source/RenderGraph.cpp b/Gems/LyShine/Code/Source/RenderGraph.cpp index 7ecda5eee3..567c29eecd 100644 --- a/Gems/LyShine/Code/Source/RenderGraph.cpp +++ b/Gems/LyShine/Code/Source/RenderGraph.cpp @@ -38,7 +38,7 @@ namespace LyShine //////////////////////////////////////////////////////////////////////////////////////////////////// PrimitiveListRenderNode::PrimitiveListRenderNode(const AZ::Data::Instance& texture, - bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, int blendModeState) + bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, const AZ::RHI::TargetBlendState& blendModeState) : RenderNode(RenderNodeType::PrimitiveList) , m_numTextures(1) , m_isTextureSRGB(isTextureSRGB) @@ -55,7 +55,7 @@ namespace LyShine //////////////////////////////////////////////////////////////////////////////////////////////////// PrimitiveListRenderNode::PrimitiveListRenderNode(const AZ::Data::Instance& texture, const AZ::Data::Instance& maskTexture, bool isClampTextureMode, bool isTextureSRGB, - bool preMultiplyAlpha, AlphaMaskType alphaMaskType, int blendModeState) + bool preMultiplyAlpha, AlphaMaskType alphaMaskType, const AZ::RHI::TargetBlendState& blendModeState) : RenderNode(RenderNodeType::PrimitiveList) , m_numTextures(2) , m_isTextureSRGB(isTextureSRGB) @@ -102,9 +102,16 @@ namespace LyShine const UiRenderer::UiShaderData& uiShaderData = uiRenderer->GetUiShaderData(); - // Set render state dynamicDraw->SetStencilState(uiRenderer->GetBaseState().m_stencilState); - dynamicDraw->SetTarget0BlendState(uiRenderer->GetBaseState().m_blendState); + + // The blend factor and op is stored in m_blendModeState when the primitive is added to the graph. + // That is also when the graph determines whether a new primitive list node is needed. + // The rest of the blend properties are assigned during the render calls, so they get merged here + // and all are passed to the dynamic draw context + AZ::RHI::TargetBlendState targetBlendState = m_blendModeState; + targetBlendState.m_enable = uiRenderer->GetBaseState().m_blendStateEnabled; + targetBlendState.m_writeMask = uiRenderer->GetBaseState().m_blendStateWriteMask; + dynamicDraw->SetTarget0BlendState(targetBlendState); dynamicDraw->SetShaderVariant(uiRenderer->GetCurrentShaderVariant()); @@ -354,13 +361,13 @@ namespace LyShine // if either of the draw flags are checked then we may want to draw the renderable component(s) // on this element, otherwise use the color mask to stop them rendering - curBaseState.m_blendState.m_enable = false; - curBaseState.m_blendState.m_writeMask = 0x0; + curBaseState.m_blendStateEnabled = false; + curBaseState.m_blendStateWriteMask = 0x0; if ((m_drawBehind && firstPass) || (m_drawInFront && !firstPass)) { - curBaseState.m_blendState.m_enable = true; - curBaseState.m_blendState.m_writeMask = 0xF; + curBaseState.m_blendStateEnabled = true; + curBaseState.m_blendStateWriteMask = 0xF; } if (m_isMaskingEnabled) @@ -507,19 +514,10 @@ namespace LyShine if (m_dynamicDraw) { - UiRenderer::BaseState priorBaseState = uiRenderer->GetBaseState(); - - UiRenderer::BaseState curBaseState = priorBaseState; - curBaseState.m_blendState.m_blendAlphaSource = AZ::RHI::BlendFactor::One; - curBaseState.m_blendState.m_blendAlphaDest = AZ::RHI::BlendFactor::AlphaSource1Inverse; - uiRenderer->SetBaseState(curBaseState); - for (RenderNode* renderNode : m_childRenderNodes) { renderNode->Render(uiRenderer, m_modelViewProjMat, m_dynamicDraw); } - - uiRenderer->SetBaseState(priorBaseState); } else { @@ -722,7 +720,7 @@ namespace LyShine // The shader can be outputing premultiplied alpha EITHER if the input texture is premultiplied alpha OR if the // shader is doing the premultiply of the output color bool isShaderOutputPremultAlpha = isPreMultiplyAlpha || isTexturePremultipliedAlpha; - int blendModeState = GetBlendModeState(blendMode, isShaderOutputPremultAlpha); + AZ::RHI::TargetBlendState blendModeState = GetBlendModeState(blendMode, isShaderOutputPremultAlpha); PrimitiveListRenderNode* renderNodeToAddTo = nullptr; if (!renderNodeList->empty()) @@ -801,7 +799,7 @@ namespace LyShine // The shader can be outputing premultiplied alpha EITHER if the input texture is premultiplied alpha OR if the // shader is doing the premultiply of the output color bool isShaderOutputPremultAlpha = isPreMultiplyAlpha || isTexturePremultipliedAlpha; - int blendModeState = GetBlendModeState(blendMode, isShaderOutputPremultAlpha); + AZ::RHI::TargetBlendState blendModeState = GetBlendModeState(blendMode, isShaderOutputPremultAlpha); AlphaMaskType alphaMaskType = isShaderOutputPremultAlpha ? AlphaMaskType::ModulateAlphaAndColor : AlphaMaskType::ModulateAlpha; PrimitiveListRenderNode* renderNodeToAddTo = nullptr; @@ -947,9 +945,12 @@ namespace LyShine { AZ::RHI::Ptr dynamicDraw = uiRenderer->GetDynamicDrawContext(); - // Disable stencil and enable blend/color write + // Reset stencil and blend mode to defaults (disable stencil and enable blend/color write) dynamicDraw->SetStencilState(uiRenderer->GetBaseState().m_stencilState); - dynamicDraw->SetTarget0BlendState(uiRenderer->GetBaseState().m_blendState); + AZ::RHI::TargetBlendState defaultBlendModeState = GetBlendModeState(LyShine::BlendMode::Normal, false); + defaultBlendModeState.m_enable = uiRenderer->GetBaseState().m_blendStateEnabled; + defaultBlendModeState.m_writeMask = uiRenderer->GetBaseState().m_blendStateWriteMask; + dynamicDraw->SetTarget0BlendState(defaultBlendModeState); // First render the render targets, they are sorted so that more deeply nested ones are rendered first. // They only need to be rendered the first time that a render graph is rendered after it has been built. @@ -1169,7 +1170,7 @@ namespace LyShine if (prevPrimListNode) { - if (prevPrimListNode->GetBlendModeState() != primListRenderNode->GetBlendModeState()) + if (!(prevPrimListNode->GetBlendModeState() == primListRenderNode->GetBlendModeState())) { ++info.m_numNodesDueToBlendMode; } @@ -1346,8 +1347,9 @@ namespace LyShine } // Write heading to logfile for this render node - logLine = AZStd::string::format("%sPrimitive render node (Blend mode=%d, SRGB=%d). NumPrims=%d, NumTris=%d. Using textures:\r\n", - indent.c_str(), primListRenderNode->GetBlendModeState(), + AZ::RHI::TargetBlendState blendMode = primListRenderNode->GetBlendModeState(); + logLine = AZStd::string::format("%sPrimitive render node (Blend mode=%s, SRGB=%d). NumPrims=%d, NumTris=%d. Using textures:\r\n", + indent.c_str(), blendMode.m_enable ? "enabled" : "disabled", static_cast(primListRenderNode->GetIsTextureSRGB()), numPrimitives, numTriangles); AZ::IO::LocalFileIO::GetInstance()->Write(fileHandle, logLine.c_str(), logLine.size()); @@ -1415,8 +1417,9 @@ namespace LyShine #endif //////////////////////////////////////////////////////////////////////////////////////////////////// - int RenderGraph::GetBlendModeState(LyShine::BlendMode blendMode, bool isShaderOutputPremultAlpha) const - { + AZ::RHI::TargetBlendState RenderGraph::GetBlendModeState(LyShine::BlendMode blendMode, [[maybe_unused]] bool isShaderOutputPremultAlpha) const + { + // LYSHINE_ATOM_TODO - remove "premultiplyAlpha" parameter and clean up related comments as I think it's no longer needed // Our blend modes are complicated by the fact we want to be able to render to a render target and then // render from that render target texture to the back buffer and get the same result as if we rendered // directly to the back buffer. This should be true even if the render target texture does not end up @@ -1443,72 +1446,47 @@ namespace LyShine // properly might require shader changes also. For the moment using the blend modes Screen, Darken, Lighten // is not encouraged, especially when rendering to a render target. - int flags = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; // the default + AZ::RHI::TargetBlendState blendState; + blendState.m_blendAlphaSource = AZ::RHI::BlendFactor::One; + blendState.m_blendAlphaDest = AZ::RHI::BlendFactor::AlphaSourceInverse; + switch (blendMode) { case LyShine::BlendMode::Normal: // This is the default mode that does an alpha blend by interpolating based on src alpha - if (isShaderOutputPremultAlpha) - { - flags = GS_BLSRC_ONE | GS_BLDST_ONEMINUSSRCALPHA; - } - else - { - flags = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; - } + blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + blendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; break; case LyShine::BlendMode::Add: // This works well, the amount of the src color added is controlled by src alpha - if (isShaderOutputPremultAlpha) - { - flags = GS_BLSRC_ONE | GS_BLDST_ONE; - } - else - { - flags = GS_BLSRC_SRCALPHA | GS_BLDST_ONE; - } + blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + blendState.m_blendDest = AZ::RHI::BlendFactor::One; break; case LyShine::BlendMode::Screen: // This is a poor approximation of the PhotoShop Screen mode but trying to take some account of src alpha // In Photoshop this would be 1 - ( (1-SrcColor) * (1-DstColor) ) // So we should use a blend op of multiply but the IRenderer interface doesn't support that. We get some multiply // from GS_BLDST_ONEMINUSSRCCOL which multiplies the DstColor by (1-SrcColor) - if (isShaderOutputPremultAlpha) - { - flags = GS_BLSRC_ONE | GS_BLDST_ONEMINUSSRCCOL; - } - else - { - flags = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCCOL; - } + blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + blendState.m_blendDest = AZ::RHI::BlendFactor::ColorSourceInverse; break; case LyShine::BlendMode::Darken: // This is a poor approximation of the PhotoShop Darken mode but trying to take some account of src alpha // In Photoshop Darken means min(SrcColor, DstColor) - if (isShaderOutputPremultAlpha) - { - flags = GS_BLOP_MIN | GS_BLSRC_ONE | GS_BLDST_ONE | GS_BLALPHA_MAX; - } - else - { - flags = GS_BLOP_MIN | GS_BLSRC_ONEMINUSSRCALPHA | GS_BLDST_ONE; - } + blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSourceInverse; + blendState.m_blendDest = AZ::RHI::BlendFactor::One; + blendState.m_blendOp = AZ::RHI::BlendOp::Minimum; break; case LyShine::BlendMode::Lighten: // This is a pretty good an approximation of the PhotoShop Lighten mode but trying to take some account of src alpha // In PhotoShop Lighten means max(SrcColor, DstColor) - if (isShaderOutputPremultAlpha) - { - flags = GS_BLOP_MAX | GS_BLSRC_ONE| GS_BLDST_ONE; - } - else - { - flags = GS_BLOP_MAX | GS_BLSRC_SRCALPHA | GS_BLDST_ONE; - } + blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + blendState.m_blendDest = AZ::RHI::BlendFactor::One; + blendState.m_blendOp = AZ::RHI::BlendOp::Maximum; break; } - return flags; + return blendState; } void RenderGraph::SetRttPassesEnabled(UiRenderer* uiRenderer, bool enabled) diff --git a/Gems/LyShine/Code/Source/RenderGraph.h b/Gems/LyShine/Code/Source/RenderGraph.h index a7ef0919c6..9edc1f50e8 100644 --- a/Gems/LyShine/Code/Source/RenderGraph.h +++ b/Gems/LyShine/Code/Source/RenderGraph.h @@ -71,9 +71,9 @@ namespace LyShine // We use a pool allocator to keep these allocations fast. AZ_CLASS_ALLOCATOR(PrimitiveListRenderNode, AZ::PoolAllocator, 0); - PrimitiveListRenderNode(const AZ::Data::Instance& texture, bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, int blendModeState); + PrimitiveListRenderNode(const AZ::Data::Instance& texture, bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, const AZ::RHI::TargetBlendState& blendModeState); PrimitiveListRenderNode(const AZ::Data::Instance& texture, const AZ::Data::Instance& maskTexture, - bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, AlphaMaskType alphaMaskType, int blendModeState); + bool isClampTextureMode, bool isTextureSRGB, bool preMultiplyAlpha, AlphaMaskType alphaMaskType, const AZ::RHI::TargetBlendState& blendModeState); ~PrimitiveListRenderNode() override; void Render(UiRenderer* uiRenderer , const AZ::Matrix4x4& modelViewProjMat @@ -88,7 +88,7 @@ namespace LyShine bool GetTextureIsClampMode(int texIndex) const { return m_textures[texIndex].m_isClampTextureMode; } bool GetIsTextureSRGB() const { return m_isTextureSRGB; } - int GetBlendModeState() const { return m_blendModeState; } + AZ::RHI::TargetBlendState GetBlendModeState() const { return m_blendModeState; } bool GetIsPremultiplyAlpha() const { return m_preMultiplyAlpha; } AlphaMaskType GetAlphaMaskType() const { return m_alphaMaskType; } @@ -118,7 +118,7 @@ namespace LyShine bool m_isTextureSRGB; bool m_preMultiplyAlpha; AlphaMaskType m_alphaMaskType; - int m_blendModeState; + AZ::RHI::TargetBlendState m_blendModeState; int m_totalNumVertices; int m_totalNumIndices; @@ -340,7 +340,7 @@ namespace LyShine protected: // member functions //! Given a blend mode and whether the shader will be outputing premultiplied alpha, return state flags - int GetBlendModeState(LyShine::BlendMode blendMode, bool isShaderOutputPremultAlpha) const; + AZ::RHI::TargetBlendState GetBlendModeState(LyShine::BlendMode blendMode, bool isShaderOutputPremultAlpha) const; void SetRttPassesEnabled(UiRenderer* uiRenderer, bool enabled); diff --git a/Gems/LyShine/Code/Source/UiRenderer.h b/Gems/LyShine/Code/Source/UiRenderer.h index 14fc67fc6b..3be3c832d3 100644 --- a/Gems/LyShine/Code/Source/UiRenderer.h +++ b/Gems/LyShine/Code/Source/UiRenderer.h @@ -53,14 +53,8 @@ public: // types void ResetToDefault() { // Enable blend/color write - m_blendState.m_enable = true; - m_blendState.m_writeMask = 0xF; - m_blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; - m_blendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; - m_blendState.m_blendOp = AZ::RHI::BlendOp::Add; - m_blendState.m_blendAlphaSource = AZ::RHI::BlendFactor::One; - m_blendState.m_blendAlphaDest = AZ::RHI::BlendFactor::Zero; - m_blendState.m_blendAlphaOp = AZ::RHI::BlendOp::Add; + m_blendStateEnabled = true; + m_blendStateWriteMask = 0xF; // Disable stencil m_stencilState = AZ::RHI::StencilState(); @@ -70,7 +64,8 @@ public: // types m_modulateAlpha = false; } - AZ::RHI::TargetBlendState m_blendState; + uint32_t m_blendStateEnabled = true; + uint32_t m_blendStateWriteMask = 0xF; AZ::RHI::StencilState m_stencilState; bool m_useAlphaTest = false; bool m_modulateAlpha = false; From 413e82428c7a802f49eaa747c700230e0da6119b Mon Sep 17 00:00:00 2001 From: michabr <82236305+michabr@users.noreply.github.com> Date: Wed, 1 Sep 2021 15:42:16 -0700 Subject: [PATCH 087/355] Reenable blend mode and depth state options in Draw2d (#2254) * Reenable blend mode and depth state options in Draw2d * Add back compile warning fix from last merge Signed-off-by: abrmich --- Code/Legacy/CryCommon/LyShine/IDraw2d.h | 52 -------- Gems/LyShine/Code/Editor/EditorCommon.h | 1 - Gems/LyShine/Code/Editor/GuideHelpers.cpp | 9 +- .../Code/Editor/ViewportCanvasBackground.cpp | 4 +- Gems/LyShine/Code/Editor/ViewportIcon.cpp | 11 +- Gems/LyShine/Code/Editor/ViewportIcon.h | 2 +- Gems/LyShine/Code/Include/LyShine/Draw2d.h | 116 +++++++++++++----- Gems/LyShine/Code/Source/Draw2d.cpp | 62 ++++------ Gems/LyShine/Code/Source/LyShineDebug.cpp | 71 +++++------ Gems/LyShine/Code/Source/UiCanvasManager.cpp | 4 +- Gems/LyShine/Code/Source/UiRenderer.cpp | 2 +- 11 files changed, 160 insertions(+), 174 deletions(-) diff --git a/Code/Legacy/CryCommon/LyShine/IDraw2d.h b/Code/Legacy/CryCommon/LyShine/IDraw2d.h index a8c7af7411..3bfa3a1c14 100644 --- a/Code/Legacy/CryCommon/LyShine/IDraw2d.h +++ b/Code/Legacy/CryCommon/LyShine/IDraw2d.h @@ -12,9 +12,6 @@ #include #include -// Forward declarations -struct IFFont; - //////////////////////////////////////////////////////////////////////////////////////////////////// //! Class for 2D drawing in screen space // @@ -58,55 +55,6 @@ public: // types MAX_TEXT_STRING_LENGTH = 1024, }; - enum : int - { - //! Constant that indicates the built-in default value should be used - UseDefault = -1 - }; - - //! Struct used to pass additional image options. - // - //! If this is not passed then the defaults below are used - struct ImageOptions - { - int blendMode; //!< default is GS_BLSRC_SRCALPHA|GS_BLDST_ONEMINUSSRCALPHA - AZ::Vector3 color; //!< default is (1,1,1) - Rounding pixelRounding; //!< default is Rounding::Nearest - int baseState; //!< Additional flags for SetState. Default is GS_NODEPTHTEST - }; - - //! Struct used to pass additional text options - mostly ones that do not change from call to call. - // - //! If this is not passed then the defaults below are used - struct TextOptions - { - AZStd::string fontName; //!< default is "default" - unsigned int effectIndex; //!< default is 0 - AZ::Vector3 color; //!< default is (1,1,1) - HAlign horizontalAlignment; //!< default is HAlign::Left - VAlign verticalAlignment; //!< default is VAlign::Top - AZ::Vector2 dropShadowOffset; //!< default is (0,0), zero offset means no drop shadow is drawn - AZ::Color dropShadowColor; //!< default is (0,0,0,0), zero alpha means no drop shadow is drawn - float rotation; //!< default is 0 - int baseState; //!< Additional flags for SetState. Default is GS_NODEPTHTEST - }; - - //! Used to pass in arrays of vertices (e.g. to DrawQuad) - struct VertexPosColUV - { - VertexPosColUV(){} - VertexPosColUV(const AZ::Vector2& inPos, const AZ::Color& inColor, const AZ::Vector2& inUV) - { - position = inPos; - color = inColor; - uv = inUV; - } - - AZ::Vector2 position; //!< 2D position of vertex - AZ::Color color; //!< Float color - AZ::Vector2 uv; //!< Texture coordinate - }; - public: // member functions //! Implement virtual destructor just for safety. diff --git a/Gems/LyShine/Code/Editor/EditorCommon.h b/Gems/LyShine/Code/Editor/EditorCommon.h index a13332b0fd..5a435e7dba 100644 --- a/Gems/LyShine/Code/Editor/EditorCommon.h +++ b/Gems/LyShine/Code/Editor/EditorCommon.h @@ -9,7 +9,6 @@ #include #include -#include #include #include #include diff --git a/Gems/LyShine/Code/Editor/GuideHelpers.cpp b/Gems/LyShine/Code/Editor/GuideHelpers.cpp index 7efbaf236f..eb5966568e 100644 --- a/Gems/LyShine/Code/Editor/GuideHelpers.cpp +++ b/Gems/LyShine/Code/Editor/GuideHelpers.cpp @@ -172,20 +172,23 @@ namespace GuideHelpers // the line is drawn as the inverse of the background color AZ::Color guideColor(1.0f, 1.0f, 1.0f, 1.0f); - int blendMode = GS_BLSRC_ONEMINUSDSTCOL|GS_BLDST_ZERO; + + CDraw2d::RenderState renderState; + renderState.m_blendState.m_blendSource = AZ::RHI::BlendFactor::ColorDestInverse; + renderState.m_blendState.m_blendDest = AZ::RHI::BlendFactor::Zero; // Draw the guide line if (guideIsVertical) { AZ::Vector2 start(viewportPoint.GetX(), 0); AZ::Vector2 end(viewportPoint.GetX(), viewportSize.GetY()); - draw2d.DrawLine(start, end, guideColor, blendMode); + draw2d.DrawLine(start, end, guideColor, IDraw2d::Rounding::Nearest, renderState); } else { AZ::Vector2 start(0, viewportPoint.GetY()); AZ::Vector2 end(viewportSize.GetX(), viewportPoint.GetY()); - draw2d.DrawLine(start, end, guideColor, blendMode); + draw2d.DrawLine(start, end, guideColor, IDraw2d::Rounding::Nearest, renderState); } } diff --git a/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp b/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp index 4cf2c0e6b4..668c4e8024 100644 --- a/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp +++ b/Gems/LyShine/Code/Editor/ViewportCanvasBackground.cpp @@ -50,7 +50,7 @@ void ViewportCanvasBackground::Draw(Draw2dHelper& draw2d, const AZ::Vector2& can // now draw the same as Stretched but with UV's adjusted const AZ::Vector2 uvs[4] = { AZ::Vector2(0, 0), AZ::Vector2(uvScale.GetX(), 0), AZ::Vector2(uvScale.GetX(), uvScale.GetY()), AZ::Vector2(0, uvScale.GetY()) }; AZ::Color colorWhite(1.0f, 1.0f, 1.0f, 1.0f); - IDraw2d::VertexPosColUV verts[4]; + CDraw2d::VertexPosColUV verts[4]; for (int i = 0; i < 4; ++i) { verts[i].position = positions[i]; @@ -58,5 +58,5 @@ void ViewportCanvasBackground::Draw(Draw2dHelper& draw2d, const AZ::Vector2& can verts[i].uv = uvs[i]; } - m_canvasBackground->DrawImageTiled(draw2d, verts, 1.0f); + m_canvasBackground->DrawImageTiled(draw2d, verts); } diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.cpp b/Gems/LyShine/Code/Editor/ViewportIcon.cpp index e3ad68922e..3f0fdfaba0 100644 --- a/Gems/LyShine/Code/Editor/ViewportIcon.cpp +++ b/Gems/LyShine/Code/Editor/ViewportIcon.cpp @@ -48,12 +48,11 @@ void ViewportIcon::DrawImageAligned(Draw2dHelper& draw2d, AZ::Vector2& pivot, fl opacity); } -void ViewportIcon::DrawImageTiled(Draw2dHelper& draw2d, IDraw2d::VertexPosColUV* verts, [[maybe_unused]] float opacity) +void ViewportIcon::DrawImageTiled(Draw2dHelper& draw2d, CDraw2d::VertexPosColUV* verts) { // Use default blending and rounding modes - int blendMode = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; IDraw2d::Rounding rounding = IDraw2d::Rounding::Nearest; - draw2d.DrawQuad(m_image, verts, blendMode, rounding); + draw2d.DrawQuad(m_image, verts, rounding); } void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 bound0, AZ::Vector2 bound1) @@ -64,7 +63,7 @@ void ViewportIcon::DrawAxisAlignedBoundingBox(Draw2dHelper& draw2d, AZ::Vector2 float endTexCoordU = fabsf((bound1.GetX() - bound0.GetX()) * pixelLengthForDottedLineTexture); float endTexCoordV = fabsf((bound1.GetY() - bound0.GetY()) * pixelLengthForDottedLineTexture); - IDraw2d::VertexPosColUV verts[2]; + CDraw2d::VertexPosColUV verts[2]; { verts[0].color = dottedColor; verts[1].color = dottedColor; @@ -159,7 +158,7 @@ void ViewportIcon::Draw(Draw2dHelper& draw2d, AZ::Vector2 anchorPos, const AZ::M AZ::Matrix4x4 moveFromPivotSpaceMat = AZ::Matrix4x4::CreateTranslation(pivot3); AZ::Matrix4x4 newTransform = transform * moveFromPivotSpaceMat * rotMat * moveToPivotSpaceMat; - IDraw2d::VertexPosColUV verts[4]; + CDraw2d::VertexPosColUV verts[4]; // points are a clockwise quad static const AZ::Vector2 uvs[4] = { AZ::Vector2(0.0f, 0.0f), AZ::Vector2(1.0f, 0.0f), AZ::Vector2(1.0f, 1.0f), AZ::Vector2(0.0f, 1.0f) @@ -252,7 +251,7 @@ void ViewportIcon::DrawDistanceLine(Draw2dHelper& draw2d, AZ::Vector2 start, AZ: const float pixelLengthForDottedLineTexture = 8.0f; float endTexCoordU = length / pixelLengthForDottedLineTexture; - IDraw2d::VertexPosColUV verts[2]; + CDraw2d::VertexPosColUV verts[2]; verts[0].position = start; verts[0].color = dottedColor; diff --git a/Gems/LyShine/Code/Editor/ViewportIcon.h b/Gems/LyShine/Code/Editor/ViewportIcon.h index c7391d9f46..f815b244e9 100644 --- a/Gems/LyShine/Code/Editor/ViewportIcon.h +++ b/Gems/LyShine/Code/Editor/ViewportIcon.h @@ -20,7 +20,7 @@ public: void DrawImageAligned(Draw2dHelper& draw2d, AZ::Vector2& pivot, float opacity); - void DrawImageTiled(Draw2dHelper& draw2d, IDraw2d::VertexPosColUV* verts, float opacity); + void DrawImageTiled(Draw2dHelper& draw2d, CDraw2d::VertexPosColUV* verts); void Draw(Draw2dHelper& draw2d, AZ::Vector2 anchorPos, const AZ::Matrix4x4& transform, float iconRot = 0.0f, AZ::Color color = AZ::Color(1.0f, 1.0f, 1.0f, 1.0f)) const; diff --git a/Gems/LyShine/Code/Include/LyShine/Draw2d.h b/Gems/LyShine/Code/Include/LyShine/Draw2d.h index d6e255f6f7..6c848a7f96 100644 --- a/Gems/LyShine/Code/Include/LyShine/Draw2d.h +++ b/Gems/LyShine/Code/Include/LyShine/Draw2d.h @@ -26,6 +26,65 @@ class CDraw2d : public IDraw2d // LYSHINE_ATOM_TODO - keep around until gEnv->pLyShine is replaced by bus interface , public AZ::Render::Bootstrap::NotificationBus::Handler { +public: // types + + struct RenderState + { + RenderState() + { + m_blendState.m_enable = true; + m_blendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; + m_blendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; + + m_depthState.m_enable = false; + } + + AZ::RHI::TargetBlendState m_blendState; + AZ::RHI::DepthState m_depthState; + }; + + //! Struct used to pass additional image options. + // + //! If this is not passed then the defaults are used + struct ImageOptions + { + AZ::Vector3 color = AZ::Vector3(1.0f, 1.0f, 1.0f); + Rounding pixelRounding = Rounding::Nearest; + RenderState m_renderState; + }; + + //! Struct used to pass additional text options - mostly ones that do not change from call to call. + // + //! If this is not passed then the defaults below are used + struct TextOptions + { + AZStd::string fontName; //!< default is "default" + unsigned int effectIndex; //!< default is 0 + AZ::Vector3 color; //!< default is (1,1,1) + HAlign horizontalAlignment; //!< default is HAlign::Left + VAlign verticalAlignment; //!< default is VAlign::Top + AZ::Vector2 dropShadowOffset; //!< default is (0,0), zero offset means no drop shadow is drawn + AZ::Color dropShadowColor; //!< default is (0,0,0,0), zero alpha means no drop shadow is drawn + float rotation; //!< default is 0 + bool depthTestEnabled; //!< default is false + }; + + //! Used to pass in arrays of vertices (e.g. to DrawQuad) + struct VertexPosColUV + { + VertexPosColUV() {} + VertexPosColUV(const AZ::Vector2& inPos, const AZ::Color& inColor, const AZ::Vector2& inUV) + { + position = inPos; + color = inColor; + uv = inUV; + } + + AZ::Vector2 position; //!< 2D position of vertex + AZ::Color color; //!< Float color + AZ::Vector2 uv; //!< Texture coordinate + }; + public: // member functions //! Constructor, constructed by the LyShine class @@ -81,40 +140,34 @@ public: // member functions // //! \param texId The texture ID returned by ITexture::GetTextureID() //! \param verts An array of 4 vertices, in clockwise order (e.g. top left, top right, bottom right, bottom left) - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState + //! \param renderState Blend mode and depth state virtual void DrawQuad(AZ::Data::Instance image, VertexPosColUV* verts, - int blendMode = UseDefault, Rounding pixelRounding = Rounding::Nearest, - int baseState = UseDefault); + const RenderState& renderState = RenderState{}); //! Draw a line // //! \param start The start position //! \param end The end position //! \param color The color of the line - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState + //! \param renderState Blend mode and depth state virtual void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, - int blendMode = UseDefault, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = UseDefault); + const RenderState& renderState = RenderState{}); //! Draw a line with a texture so it can be dotted or dashed // //! \param texId The texture ID returned by ITexture::GetTextureID() //! \param verts An array of 2 vertices for the start and end points of the line - //! \param blendMode UseDefault means default blend mode (currently GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA) //! \param pixelRounding Whether and how to round pixel coordinates - //! \param baseState Additional render state to pass to or into value passed to renderer SetState + //! \param renderState Blend mode and depth state virtual void DrawLineTextured(AZ::Data::Instance image, VertexPosColUV* verts, - int blendMode = UseDefault, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = UseDefault); + const RenderState& renderState = RenderState{}); //! Draw a text string. Only supports ASCII text. // //! The font and effect used to render the text are specified in the textOptions structure @@ -225,7 +278,7 @@ protected: // types and constants AZ::Vector2 m_texCoords[4]; uint32 m_packedColors[4]; AZ::Data::Instance m_image; - int m_state; + RenderState m_renderState; }; class DeferredLine @@ -241,7 +294,7 @@ protected: // types and constants AZ::Vector2 m_points[2]; AZ::Vector2 m_texCoords[2]; uint32 m_packedColors[2]; - int m_state; + RenderState m_renderState; }; class DeferredText @@ -286,7 +339,7 @@ protected: // member functions //! Helper function to render a text string void DrawTextInternal(const char* textString, AzFramework::FontId fontId, unsigned int effectIndex, AZ::Vector2 position, float pointSize, AZ::Color color, float rotation, - HAlign horizontalAlignment, VAlign verticalAlignment, int baseState); + HAlign horizontalAlignment, VAlign verticalAlignment, bool depthTestEnabled); //! Draw or defer a quad void DrawOrDeferQuad(const DeferredQuad* quad); @@ -397,39 +450,39 @@ public: // member functions //! Draw a textured quad where the position, color and uv of each point is specified explicitly // //! See IDraw2d:DrawQuad for parameter descriptions - void DrawQuad(AZ::Data::Instance image, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, + void DrawQuad(AZ::Data::Instance image, CDraw2d::VertexPosColUV* verts, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) + const CDraw2d::RenderState& renderState = CDraw2d::RenderState{}) { if (m_draw2d) { - m_draw2d->DrawQuad(image, verts, blendMode, pixelRounding, baseState); + m_draw2d->DrawQuad(image, verts, pixelRounding, renderState); } } //! Draw a line // //! See IDraw2d:DrawLine for parameter descriptions - void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode = IDraw2d::UseDefault, + void DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) + const CDraw2d::RenderState& renderState = CDraw2d::RenderState{}) { if (m_draw2d) { - m_draw2d->DrawLine(start, end, color, blendMode, pixelRounding, baseState); + m_draw2d->DrawLine(start, end, color, pixelRounding, renderState); } } //! Draw a line with a texture so it can be dotted or dashed // //! See IDraw2d:DrawLineTextured for parameter descriptions - void DrawLineTextured(AZ::Data::Instance image, IDraw2d::VertexPosColUV* verts, int blendMode = IDraw2d::UseDefault, + void DrawLineTextured(AZ::Data::Instance image, CDraw2d::VertexPosColUV* verts, IDraw2d::Rounding pixelRounding = IDraw2d::Rounding::Nearest, - int baseState = IDraw2d::UseDefault) + const CDraw2d::RenderState& renderState = CDraw2d::RenderState{}) { if (m_draw2d) { - m_draw2d->DrawLineTextured(image, verts, blendMode, pixelRounding, baseState); + m_draw2d->DrawLineTextured(image, verts, pixelRounding, renderState); } } @@ -478,7 +531,7 @@ public: // member functions // State management //! Set the blend mode used for images, default is GS_BLSRC_SRCALPHA|GS_BLDST_ONEMINUSSRCALPHA. - void SetImageBlendMode(int mode) { m_imageOptions.blendMode = mode; } + void SetImageBlendMode(const AZ::RHI::TargetBlendState& blendState) { m_imageOptions.m_renderState.m_blendState = blendState; } //! Set the color used for DrawImage and other image drawing. void SetImageColor(AZ::Vector3 color) { m_imageOptions.color = color; } @@ -487,7 +540,7 @@ public: // member functions void SetImagePixelRounding(IDraw2d::Rounding round) { m_imageOptions.pixelRounding = round; } //! Set the base state (that blend mode etc is combined with) used for images, default is GS_NODEPTHTEST. - void SetImageBaseState(int state) { m_imageOptions.baseState = state; } + void SetImageDepthState(const AZ::RHI::DepthState& depthState) { m_imageOptions.m_renderState.m_depthState = depthState; } //! Set the text font. void SetTextFont(AZStd::string_view fontName) { m_textOptions.fontName = fontName; } @@ -518,8 +571,11 @@ public: // member functions m_textOptions.rotation = rotation; } - //! Set the base state (that blend mode etc is combined with) used for text, default is GS_NODEPTHTEST. - void SetTextBaseState(int state) { m_textOptions.baseState = state; } + //! Set wheter to enable depth test for the text + void SetTextDepthTestEnabled(bool enabled) + { + m_textOptions.depthTestEnabled = enabled; + } public: // static member functions @@ -565,8 +621,8 @@ public: // static member functions protected: // attributes - IDraw2d::ImageOptions m_imageOptions; //!< image options are stored locally and updated by member functions - IDraw2d::TextOptions m_textOptions; //!< text options are stored locally and updated by member functions + CDraw2d::ImageOptions m_imageOptions; //!< image options are stored locally and updated by member functions + CDraw2d::TextOptions m_textOptions; //!< text options are stored locally and updated by member functions CDraw2d* m_draw2d; bool m_previousDeferCalls; }; diff --git a/Gems/LyShine/Code/Source/Draw2d.cpp b/Gems/LyShine/Code/Source/Draw2d.cpp index b4c8d58fae..b0539900e2 100644 --- a/Gems/LyShine/Code/Source/Draw2d.cpp +++ b/Gems/LyShine/Code/Source/Draw2d.cpp @@ -5,7 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#include "IFont.h" #include // for SVF_P3F_C4B_T2F which will be removed in a coming PR #include @@ -23,9 +22,6 @@ #include #include -static const int g_defaultBlendState = GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA; -static const int g_defaultBaseState = GS_NODEPTHTEST; - //////////////////////////////////////////////////////////////////////////////////////////////////// // LOCAL STATIC FUNCTIONS //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -48,10 +44,6 @@ CDraw2d::CDraw2d(AZ::RPI::ViewportContextPtr viewportContext) { // These default options are set here and never change. They are stored so that if a null options // structure is passed into the draw functions then this default one can be used instead - m_defaultImageOptions.blendMode = g_defaultBlendState; - m_defaultImageOptions.color.Set(1.0f, 1.0f, 1.0f); - m_defaultImageOptions.pixelRounding = Rounding::Nearest; - m_defaultImageOptions.baseState = g_defaultBaseState; m_defaultTextOptions.fontName = "default"; m_defaultTextOptions.effectIndex = 0; @@ -61,7 +53,7 @@ CDraw2d::CDraw2d(AZ::RPI::ViewportContextPtr viewportContext) m_defaultTextOptions.dropShadowOffset.Set(0.0f, 0.0f); m_defaultTextOptions.dropShadowColor.Set(0.0f, 0.0f, 0.0f, 0.0f); m_defaultTextOptions.rotation = 0.0f; - m_defaultTextOptions.baseState = g_defaultBaseState; + m_defaultTextOptions.depthTestEnabled = false; AZ::Render::Bootstrap::NotificationBus::Handler::BusConnect(); } @@ -112,7 +104,8 @@ void CDraw2d::OnBootstrapSceneReady([[maybe_unused]] AZ::RPI::Scene* bootstrapSc {"COLOR", AZ::RHI::Format::B8G8R8A8_UNORM}, {"TEXCOORD0", AZ::RHI::Format::R32G32_FLOAT} }); m_dynamicDraw->AddDrawStateOptions(AZ::RPI::DynamicDrawContext::DrawStateOptions::PrimitiveType - | AZ::RPI::DynamicDrawContext::DrawStateOptions::BlendMode); + | AZ::RPI::DynamicDrawContext::DrawStateOptions::BlendMode + | AZ::RPI::DynamicDrawContext::DrawStateOptions::DepthState); if (uiCanvasPass) { m_dynamicDraw->SetOutputScope(uiCanvasPass); @@ -124,12 +117,6 @@ void CDraw2d::OnBootstrapSceneReady([[maybe_unused]] AZ::RPI::Scene* bootstrapSc } m_dynamicDraw->EndInit(); - AZ::RHI::TargetBlendState targetBlendState; - targetBlendState.m_enable = true; - targetBlendState.m_blendSource = AZ::RHI::BlendFactor::AlphaSource; - targetBlendState.m_blendDest = AZ::RHI::BlendFactor::AlphaSourceInverse; - m_dynamicDraw->SetTarget0BlendState(targetBlendState); - // Cache draw srg input indices for later use static const char textureIndexName[] = "m_texture"; static const char worldToProjIndexName[] = "m_worldToProj"; @@ -154,8 +141,6 @@ void CDraw2d::DrawImage(AZ::Data::Instance image, AZ::Vector2 po AZ::Color color = AZ::Color::CreateFromVector3AndFloat(actualImageOptions->color, opacity); AZ::u32 packedColor = PackARGB8888(color); - int blendMode = actualImageOptions->blendMode; - // Depending on the requested pixel rounding setting we may round position to an exact pixel AZ::Vector2 pos = Draw2dHelper::RoundXY(position, actualImageOptions->pixelRounding); @@ -189,7 +174,7 @@ void CDraw2d::DrawImage(AZ::Data::Instance image, AZ::Vector2 po quad.m_image = image; // add the blendMode flags to the base state - quad.m_state = blendMode | actualImageOptions->baseState; + quad.m_renderState = actualImageOptions->m_renderState; // apply rotation if requested if (rotation != 0.0f) @@ -212,11 +197,9 @@ void CDraw2d::DrawImageAligned(AZ::Data::Instance image, AZ::Vec } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawQuad(AZ::Data::Instance image, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawQuad(AZ::Data::Instance image, VertexPosColUV* verts, Rounding pixelRounding, + const CDraw2d::RenderState& renderState) { - int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; - int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - // define quad DeferredQuad quad; for (int i = 0; i < 4; ++i) @@ -228,20 +211,17 @@ void CDraw2d::DrawQuad(AZ::Data::Instance image, VertexPosColUV* quad.m_image = image; // add the blendMode flags to the base state - quad.m_state = actualBlendMode | actualBaseState; + quad.m_renderState = renderState; DrawOrDeferQuad(&quad); } //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, Rounding pixelRounding, + const CDraw2d::RenderState& renderState) { - int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - auto image = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); - int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; - // define line uint32 packedColor = PackARGB8888(color); @@ -258,19 +238,16 @@ void CDraw2d::DrawLine(AZ::Vector2 start, AZ::Vector2 end, AZ::Color color, int line.m_packedColors[1] = packedColor; // add the blendMode flags to the base state - line.m_state = actualBlendMode | actualBaseState; + line.m_renderState = renderState; DrawOrDeferLine(&line); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -void CDraw2d::DrawLineTextured(AZ::Data::Instance image, VertexPosColUV* verts, int blendMode, Rounding pixelRounding, int baseState) +void CDraw2d::DrawLineTextured(AZ::Data::Instance image, VertexPosColUV* verts, Rounding pixelRounding, + const CDraw2d::RenderState& renderState) { - int actualBaseState = (baseState == -1) ? g_defaultBaseState : baseState; - - int actualBlendMode = (blendMode == -1) ? g_defaultBlendState : blendMode; - // define line DeferredLine line; line.m_image = image; @@ -283,7 +260,7 @@ void CDraw2d::DrawLineTextured(AZ::Data::Instance image, VertexP } // add the blendMode flags to the base state - line.m_state = actualBlendMode | actualBaseState; + line.m_renderState = renderState; DrawOrDeferLine(&line); } @@ -313,7 +290,7 @@ void CDraw2d::DrawText(const char* textString, AZ::Vector2 position, float point dropShadowPosition, pointSize, actualTextOptions->dropShadowColor, actualTextOptions->rotation, actualTextOptions->horizontalAlignment, actualTextOptions->verticalAlignment, - actualTextOptions->baseState); + actualTextOptions->depthTestEnabled); } // draw the text string @@ -322,7 +299,7 @@ void CDraw2d::DrawText(const char* textString, AZ::Vector2 position, float point position, pointSize, textColor, actualTextOptions->rotation, actualTextOptions->horizontalAlignment, actualTextOptions->verticalAlignment, - actualTextOptions->baseState); + actualTextOptions->depthTestEnabled); } void CDraw2d::DrawRectOutlineTextured(AZ::Data::Instance image, @@ -594,7 +571,7 @@ void CDraw2d::RotatePointsAboutPivot(AZ::Vector2* points, [[maybe_unused]] int n //////////////////////////////////////////////////////////////////////////////////////////////////// void CDraw2d::DrawTextInternal(const char* textString, AzFramework::FontId fontId, unsigned int effectIndex, AZ::Vector2 position, float pointSize, AZ::Color color, float rotation, - HAlign horizontalAlignment, VAlign verticalAlignment, [[maybe_unused]] int baseState) + HAlign horizontalAlignment, VAlign verticalAlignment, bool depthTestEnabled) { // FFont.cpp uses the alpha value of the color to decide whether to use the color, if the alpha value is zero // (in a ColorB format) then the color set via SetColor is ignored and it usually ends up drawing with an alpha of 1. @@ -651,7 +628,7 @@ void CDraw2d::DrawTextInternal(const char* textString, AzFramework::FontId fontI drawParams.m_hAlign = hAlignment; drawParams.m_vAlign = vAlignment; drawParams.m_monospace = false; - drawParams.m_depthTest = false; + drawParams.m_depthTest = depthTestEnabled; drawParams.m_virtual800x600ScreenSize = false; drawParams.m_scaleWithWindow = false; drawParams.m_multiline = true; @@ -809,6 +786,8 @@ void CDraw2d::DeferredQuad::Draw(AZ::RHI::Ptr dynam // Add the primitive to the dynamic draw context for drawing dynamicDraw->SetPrimitiveType(AZ::RHI::PrimitiveTopology::TriangleList); + dynamicDraw->SetDepthState(m_renderState.m_depthState); + dynamicDraw->SetTarget0BlendState(m_renderState.m_blendState); dynamicDraw->DrawLinear(vertices, NUM_VERTS, drawSrg); } @@ -868,6 +847,8 @@ void CDraw2d::DeferredLine::Draw(AZ::RHI::Ptr dynam // Add the primitive to the dynamic draw context for drawing dynamicDraw->SetPrimitiveType(AZ::RHI::PrimitiveTopology::LineList); + dynamicDraw->SetDepthState(m_renderState.m_depthState); + dynamicDraw->SetTarget0BlendState(m_renderState.m_blendState); dynamicDraw->DrawLinear(vertices, NUM_VERTS, drawSrg); } @@ -966,4 +947,3 @@ void CDraw2d::DeferredText::Draw([[maybe_unused]] AZ::RHI::Ptr #include @@ -51,7 +50,7 @@ static const int g_numColors = 8; "black" }; -static AZ::Vector3 g_colorVec3[g_numColors] = +[[maybe_unused]] static AZ::Vector3 g_colorVec3[g_numColors] = { AZ::Vector3(1.0f, 1.0f, 1.0f), AZ::Vector3(1.0f, 0.0f, 0.0f), @@ -64,34 +63,34 @@ static AZ::Vector3 g_colorVec3[g_numColors] = }; static const int g_numSrcBlendModes = 11; -[[maybe_unused]] static int g_srcBlendModes[g_numSrcBlendModes] = +[[maybe_unused]] static AZ::RHI::BlendFactor g_srcBlendModes[g_numSrcBlendModes] = { - GS_BLSRC_ZERO, - GS_BLSRC_ONE, - GS_BLSRC_DSTCOL, - GS_BLSRC_ONEMINUSDSTCOL, - GS_BLSRC_SRCALPHA, - GS_BLSRC_ONEMINUSSRCALPHA, - GS_BLSRC_DSTALPHA, - GS_BLSRC_ONEMINUSDSTALPHA, - GS_BLSRC_ALPHASATURATE, - GS_BLSRC_SRCALPHA_A_ZERO, // separate alpha blend state - GS_BLSRC_SRC1ALPHA, // dual source blending + AZ::RHI::BlendFactor::Zero, + AZ::RHI::BlendFactor::One, + AZ::RHI::BlendFactor::ColorDest, + AZ::RHI::BlendFactor::ColorDestInverse, + AZ::RHI::BlendFactor::AlphaSource, + AZ::RHI::BlendFactor::AlphaSourceInverse, + AZ::RHI::BlendFactor::AlphaDest, + AZ::RHI::BlendFactor::AlphaDestInverse, + AZ::RHI::BlendFactor::AlphaSourceSaturate, + AZ::RHI::BlendFactor::Factor, + AZ::RHI::BlendFactor::AlphaSource1 }; static const int g_numDstBlendModes = 10; -[[maybe_unused]] static int g_dstBlendModes[g_numDstBlendModes] = +[[maybe_unused]] static AZ::RHI::BlendFactor g_dstBlendModes[g_numDstBlendModes] = { - GS_BLDST_ZERO, - GS_BLDST_ONE, - GS_BLDST_SRCCOL, - GS_BLDST_ONEMINUSSRCCOL, - GS_BLDST_SRCALPHA, - GS_BLDST_ONEMINUSSRCALPHA, - GS_BLDST_DSTALPHA, - GS_BLDST_ONEMINUSDSTALPHA, - GS_BLDST_ONE_A_ZERO, // separate alpha blend state - GS_BLDST_ONEMINUSSRC1ALPHA, // dual source blending + AZ::RHI::BlendFactor::Zero, + AZ::RHI::BlendFactor::One, + AZ::RHI::BlendFactor::ColorSource, + AZ::RHI::BlendFactor::ColorSourceInverse, + AZ::RHI::BlendFactor::AlphaSource, + AZ::RHI::BlendFactor::AlphaSourceInverse, + AZ::RHI::BlendFactor::AlphaDest, + AZ::RHI::BlendFactor::AlphaDestInverse, + AZ::RHI::BlendFactor::FactorInverse, + AZ::RHI::BlendFactor::AlphaSource1Inverse }; [[maybe_unused]] static bool g_deferDrawsToEndOfFrame = false; @@ -378,7 +377,7 @@ static void DebugDrawColoredBox(AZ::Vector2 pos, AZ::Vector2 size, AZ::Color col { CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); imageOptions.color = color.GetAsVector3(); auto whiteTexture = AZ::RPI::ImageSystemInterface::Get()->GetSystemImage(AZ::RPI::SystemImage::White); draw2d->DrawImageAligned(whiteTexture, pos, size, horizontalAlignment, verticalAlignment, @@ -393,7 +392,7 @@ static void DebugDrawStringWithSizeBox(AZStd::string_view font, unsigned int eff { CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); if (!font.empty()) { textOptions.fontName = font; @@ -619,7 +618,7 @@ static AZ::Vector2 DebugDrawFontColorTestBox(AZ::Vector2 pos, const char* string float pointSize = 32.0f; const float spacing = 6.0f; - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.effectIndex = 1; // no drop shadow baked in textOptions.color = color; @@ -743,7 +742,7 @@ static void DebugDraw2dImageColor() AZ::Data::Instance texture = GetMonoAlphaTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText( "Testing image colors, image is black and white, top row is opacity=1, bottom row is opacity = 0.5", @@ -781,7 +780,7 @@ static void DebugDraw2dImageBlendMode() AZ::Data::Instance texture = GetColorAlphaTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText("Testing blend modes, src blend changes across x-axis, dst blend changes across y axis", AZ::Vector2(20, 20), 16); @@ -802,7 +801,7 @@ static void DebugDraw2dImageBlendMode() AZ::Vector2 pos(xStart + xSpacing * srcIndex, yStart + ySpacing * dstIndex); // first draw a background with varying color and alpha - IDraw2d::VertexPosColUV verts[4] = + CDraw2d::VertexPosColUV verts[4] = { { // top left AZ::Vector2(pos.GetX(), pos.GetY()), @@ -829,7 +828,9 @@ static void DebugDraw2dImageBlendMode() // Draw the image with this color - imageOptions.blendMode = g_srcBlendModes[srcIndex] | g_dstBlendModes[dstIndex]; + CDraw2d::RenderState renderState; + renderState.m_blendState.m_blendSource = g_srcBlendModes[srcIndex]; + renderState.m_blendState.m_blendDest = g_dstBlendModes[dstIndex]; draw2d->DrawImage(texture, pos, size, 1.0f, 0.0f, 0, 0, &imageOptions); } } @@ -844,7 +845,7 @@ static void DebugDraw2dImageUVs() AZ::Data::Instance texture = GetColorTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText( "Testing DrawImage with minMaxTexCoords. Full image, top left quadrant, middle section, full flipped", @@ -893,7 +894,7 @@ static void DebugDraw2dImagePixelRounding() AZ::Data::Instance texture = GetColorTestTexture(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText("Testing DrawImage pixel rounding options", AZ::Vector2(20, 20), 16); @@ -932,7 +933,7 @@ static void DebugDraw2dLineBasic() { CDraw2d* draw2d = Draw2dHelper::GetDefaultDraw2d(); - IDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); + CDraw2d::ImageOptions imageOptions = draw2d->GetDefaultImageOptions(); draw2d->DrawText("Testing DrawLine", AZ::Vector2(20, 20), 16); diff --git a/Gems/LyShine/Code/Source/UiCanvasManager.cpp b/Gems/LyShine/Code/Source/UiCanvasManager.cpp index 04cb5c4a1f..a71c46d45e 100644 --- a/Gems/LyShine/Code/Source/UiCanvasManager.cpp +++ b/Gems/LyShine/Code/Source/UiCanvasManager.cpp @@ -1031,7 +1031,7 @@ void UiCanvasManager::DebugDisplayCanvasData(int setting) const // local function to write a line of text (with a background rect) and increment Y offset AZStd::function WriteLine = [&](const char* buffer, const AZ::Vector3& color) { - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.color = color; AZ::Vector2 textSize = draw2d->GetTextSize(buffer, fontSize, &textOptions); AZ::Vector2 rectTopLeft = AZ::Vector2(xOffset - 2, yOffset); @@ -1182,7 +1182,7 @@ void UiCanvasManager::DebugDisplayDrawCallData() const // local function to write a line of text (with a background rect) and increment Y offset AZStd::function WriteLine = [&](const char* buffer, const AZ::Vector3& color) { - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.color = color; AZ::Vector2 textSize = draw2d->GetTextSize(buffer, 16, &textOptions); AZ::Vector2 rectTopLeft = AZ::Vector2(xOffset - 2, yOffset); diff --git a/Gems/LyShine/Code/Source/UiRenderer.cpp b/Gems/LyShine/Code/Source/UiRenderer.cpp index 07a9f77007..3111f31615 100644 --- a/Gems/LyShine/Code/Source/UiRenderer.cpp +++ b/Gems/LyShine/Code/Source/UiRenderer.cpp @@ -489,7 +489,7 @@ void UiRenderer::DebugDisplayTextureData(int recordingOption) // local function to write a line of text (with a background rect) and increment Y offset AZStd::function WriteLine = [&](const char* buffer, const AZ::Vector3& color) { - IDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); + CDraw2d::TextOptions textOptions = draw2d->GetDefaultTextOptions(); textOptions.color = color; AZ::Vector2 textSize = draw2d->GetTextSize(buffer, 16, &textOptions); AZ::Vector2 rectTopLeft = AZ::Vector2(xOffset - 2, yOffset); From 4249ceeae75bb5b82dbc37542a8ed61ecc298769 Mon Sep 17 00:00:00 2001 From: hershey5045 <43485729+hershey5045@users.noreply.github.com> Date: Wed, 1 Sep 2021 16:01:33 -0700 Subject: [PATCH 088/355] Add material property names to material assets, disable FBX dependency on materialtype files. (#3408) * Add material property names to material assets, disable FBX dependency on materialtype files. Signed-off-by: Robin * Add reflection for MaterialAssets. Update member variable comment. Signed-off-by: Robin * Switch cvar to using bus value. Refine comments. Signed-off-by: Robin * Refactor functions and refine comments. Signed-off-by: Robin * Realign property values when material property names are populated. Signed-off-by: Robin * Switch PostLoadInit check to on asset status ready. Add realign property values code to PostLoadInit as well. Signed-off-by: Robin * Stash@{1} code. Signed-off-by: Robin * Refactor realignment code into the right places. Signed-off-by: Robin * Remove pragma optmize off. Signed-off-by: Robin * More refactoring. Signed-off-by: Robin * Refactor comments and remove code no longer needed. Signed-off-by: Robin * Refactor comments and remove unused include. Signed-off-by: Robin * Comment refactor, corrected some code. Signed-off-by: Robin Co-authored-by: Robin --- .../MaterialConverterSystemComponent.cpp | 10 ++++- .../MaterialConverterSystemComponent.h | 6 +++ .../RPI.Edit/Material/MaterialConverterBus.h | 4 ++ .../RPI.Edit/Material/MaterialSourceData.h | 6 +-- .../Atom/RPI.Reflect/Material/MaterialAsset.h | 14 +++++++ .../Material/MaterialAssetCreator.h | 6 ++- .../Model/MaterialAssetBuilderComponent.cpp | 12 +++++- .../RPI.Edit/Material/MaterialSourceData.cpp | 7 ++-- .../RPI.Reflect/Material/MaterialAsset.cpp | 40 ++++++++++++++++++- .../Material/MaterialAssetCreator.cpp | 26 ++++++++++-- 10 files changed, 115 insertions(+), 16 deletions(-) diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.cpp b/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.cpp index e26a0fb274..fd1c836b96 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.cpp @@ -26,9 +26,10 @@ namespace AZ if (auto serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(1) + ->Version(2) ->Field("Enable", &MaterialConverterSettings::m_enable) - ->Field("DefaultMaterial", &MaterialConverterSettings::m_defaultMaterial); + ->Field("DefaultMaterial", &MaterialConverterSettings::m_defaultMaterial) + ->Field("IncludeMaterialPropertyNames", &MaterialConverterSettings::m_includeMaterialPropertyNames); } } @@ -69,6 +70,11 @@ namespace AZ return m_settings.m_enable; } + bool MaterialConverterSystemComponent::ShouldIncludeMaterialPropertyNames() const + { + return m_settings.m_includeMaterialPropertyNames; + } + bool MaterialConverterSystemComponent::ConvertMaterial( const AZ::SceneAPI::DataTypes::IMaterialData& materialData, RPI::MaterialSourceData& sourceData) { diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.h b/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.h index 7d95024759..150529b474 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/MaterialConverterSystemComponent.h @@ -26,6 +26,11 @@ namespace AZ bool m_enable = true; AZStd::string m_defaultMaterial; + //! Sets whether to include material property names when generating material assets. If this + //! setting is true, material property name resolution and validation is deferred into load + //! time rather than at build time, allowing to break some dependencies (e.g. fbx files will no + //! longer need to be dependent on materialtype files). + bool m_includeMaterialPropertyNames = true; }; //! Atom's implementation of converting SceneAPI data into Atom's default material: StandardPBR @@ -45,6 +50,7 @@ namespace AZ // MaterialConverterBus overrides ... bool IsEnabled() const override; + bool ShouldIncludeMaterialPropertyNames() const override; bool ConvertMaterial(const AZ::SceneAPI::DataTypes::IMaterialData& materialData, RPI::MaterialSourceData& out) override; AZStd::string GetMaterialTypePath() const override; AZStd::string GetDefaultMaterialPath() const override; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialConverterBus.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialConverterBus.h index 8052fc4feb..1807fca15e 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialConverterBus.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialConverterBus.h @@ -32,6 +32,10 @@ namespace AZ virtual bool IsEnabled() const = 0; + //! Returns true if material property names should be included in azmaterials. This allows unlinking of dependencies for some + //! file types to materialtype files (e.g. fbx). + virtual bool ShouldIncludeMaterialPropertyNames() const = 0; + //! Converts data from a IMaterialData object to an Atom MaterialSourceData. //! Only works when IsEnabled() is true. //! @return true if the MaterialSourceData output was populated with converted material data. diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialSourceData.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialSourceData.h index 1daec3bacd..02607a7954 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialSourceData.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Material/MaterialSourceData.h @@ -68,12 +68,12 @@ namespace AZ //! @param assetId ID for the MaterialAsset //! @param materialSourceFilePath Indicates the path of the .material file that the MaterialSourceData represents. Used for resolving file-relative paths. //! @param elevateWarnings Indicates whether to treat warnings as errors - //! @param materialTypeSourceData The function sometimes needs metadata from the .materialtype file. - //! It will either load the .materialtype file from disk, or use this MaterialTypeSourceData if it's provided. + //! @param includeMaterialPropertyNames Indicates whether to save material property names into the material asset file Outcome> CreateMaterialAsset( Data::AssetId assetId, AZStd::string_view materialSourceFilePath = "", - bool elevateWarnings = true + bool elevateWarnings = true, + bool includeMaterialPropertyNames = true ) const; }; } // namespace RPI diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAsset.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAsset.h index 49ef839331..52af56ba0e 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAsset.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAsset.h @@ -108,6 +108,11 @@ namespace AZ private: bool PostLoadInit() override; + //! Realigns property value and name indices with MaterialProperiesLayout by using m_propertyNames. Property names not found in the + //! MaterialPropertiesLayout are discarded, while property names not included in m_propertyNames will use the default value + //! from m_materialTypeAsset. + void RealignPropertyValuesAndNames(); + //! Called by asset creators to assign the asset to a ready state. void SetReady(); @@ -121,11 +126,20 @@ namespace AZ // MaterialReloadNotificationBus overrides... void OnMaterialTypeAssetReinitialized(const Data::Asset& materialTypeAsset) override; + static const char* s_debugTraceName; + Data::Asset m_materialTypeAsset; //! Holds values for each material property, used to initialize Material instances. //! This is indexed by MaterialPropertyIndex and aligns with entries in m_materialPropertiesLayout. AZStd::vector m_propertyValues; + //! This is used to realign m_propertyValues as well as itself with MaterialPropertiesLayout when not empty. + //! If empty, this implies that m_propertyValues is aligned with the entries in m_materialPropertiesLayout. + AZStd::vector m_propertyNames; + + //! A flag to determine if m_propertyValues needs to be aligned with MaterialPropertiesLayout. Set to true whenever + //! m_materialTypeAsset is reinitializing. + bool m_isDirty = true; }; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAssetCreator.h index 44520cb549..862d98ce0c 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialAssetCreator.h @@ -26,11 +26,13 @@ namespace AZ public: friend class MaterialSourceData; - void Begin(const Data::AssetId& assetId, MaterialAsset& parentMaterial); - void Begin(const Data::AssetId& assetId, MaterialTypeAsset& materialType); + void Begin(const Data::AssetId& assetId, MaterialAsset& parentMaterial, bool includeMaterialPropertyNames = true); + void Begin(const Data::AssetId& assetId, MaterialTypeAsset& materialType, bool includeMaterialPropertyNames = true); bool End(Data::Asset& result); private: + void PopulatePropertyNameList(); + const MaterialPropertiesLayout* m_materialPropertiesLayout = nullptr; }; } // namespace RPI diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp index ccbdc47f7e..4c2876dc0c 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp @@ -78,7 +78,9 @@ namespace AZ AZStd::string materialTypePath; RPI::MaterialConverterBus::BroadcastResult(materialTypePath, &RPI::MaterialConverterBus::Events::GetMaterialTypePath); - if (conversionEnabled && !materialTypePath.empty()) + bool includeMaterialPropertyNames = true; + RPI::MaterialConverterBus::BroadcastResult(includeMaterialPropertyNames, &RPI::MaterialConverterBus::Events::ShouldIncludeMaterialPropertyNames); + if (conversionEnabled && !materialTypePath.empty() && !includeMaterialPropertyNames) { AssetBuilderSDK::SourceFileDependency materialTypeSource; materialTypeSource.m_sourceFileDependencyPath = materialTypePath; @@ -101,6 +103,10 @@ namespace AZ RPI::MaterialConverterBus::BroadcastResult(conversionEnabled, &RPI::MaterialConverterBus::Events::IsEnabled); fingerprintInfo.insert(AZStd::string::format("[MaterialConverter enabled=%d]", conversionEnabled)); + bool includeMaterialPropertyNames = true; + RPI::MaterialConverterBus::BroadcastResult(includeMaterialPropertyNames, &RPI::MaterialConverterBus::Events::ShouldIncludeMaterialPropertyNames); + fingerprintInfo.insert(AZStd::string::format("[MaterialConverter includeMaterialPropertyNames=%d]", includeMaterialPropertyNames)); + if (!conversionEnabled) { AZStd::string defaultMaterialPath; @@ -219,6 +225,8 @@ namespace AZ } } + bool includeMaterialPropertyNames = true; + RPI::MaterialConverterBus::BroadcastResult(includeMaterialPropertyNames, &RPI::MaterialConverterBus::Events::ShouldIncludeMaterialPropertyNames); // Build material assets. for (auto& itr : materialSourceDataByUid) { @@ -226,7 +234,7 @@ namespace AZ Data::AssetId assetId(sourceSceneUuid, GetMaterialAssetSubId(materialUid)); auto materialSourceData = itr.second; - Outcome> result = materialSourceData.m_data.CreateMaterialAsset(assetId, "", false); + Outcome> result = materialSourceData.m_data.CreateMaterialAsset(assetId, "", false, includeMaterialPropertyNames); if (result.IsSuccess()) { context.m_outputMaterialsByUid[materialUid] = { result.GetValue(), materialSourceData.m_name }; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceData.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceData.cpp index 9f980287cf..f697f33a3f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceData.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceData.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -72,7 +73,7 @@ namespace AZ } } - Outcome > MaterialSourceData::CreateMaterialAsset(Data::AssetId assetId, AZStd::string_view materialSourceFilePath, bool elevateWarnings) const + Outcome > MaterialSourceData::CreateMaterialAsset(Data::AssetId assetId, AZStd::string_view materialSourceFilePath, bool elevateWarnings, bool includeMaterialPropertyNames) const { MaterialAssetCreator materialAssetCreator; materialAssetCreator.SetElevateWarnings(elevateWarnings); @@ -85,7 +86,7 @@ namespace AZ return Failure(); } - materialAssetCreator.Begin(assetId, *materialTypeAsset.GetValue().Get()); + materialAssetCreator.Begin(assetId, *materialTypeAsset.GetValue().Get(), includeMaterialPropertyNames); } else { @@ -115,7 +116,7 @@ namespace AZ } } - materialAssetCreator.Begin(assetId, *parentMaterialAsset.GetValue().Get()); + materialAssetCreator.Begin(assetId, *parentMaterialAsset.GetValue().Get(), includeMaterialPropertyNames); } for (auto& group : m_properties) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAsset.cpp index 1acb1c69a1..c3e0221192 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAsset.cpp @@ -20,6 +20,8 @@ namespace AZ { namespace RPI { + const char* MaterialAsset::s_debugTraceName = "MaterialAsset"; + const char* MaterialAsset::DisplayName = "MaterialAsset"; const char* MaterialAsset::Group = "Material"; const char* MaterialAsset::Extension = "azmaterial"; @@ -29,9 +31,10 @@ namespace AZ if (auto* serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(9) + ->Version(10) ->Field("materialTypeAsset", &MaterialAsset::m_materialTypeAsset) ->Field("propertyValues", &MaterialAsset::m_propertyValues) + ->Field("propertyNames", &MaterialAsset::m_propertyNames) ; } } @@ -99,6 +102,11 @@ namespace AZ AZStd::array_view MaterialAsset::GetPropertyValues() const { + if (!m_propertyNames.empty() && m_isDirty) + { + const_cast(this)->RealignPropertyValuesAndNames(); + } + return m_propertyValues; } @@ -146,6 +154,34 @@ namespace AZ } } + void MaterialAsset::RealignPropertyValuesAndNames() + { + const MaterialPropertiesLayout* propertyLayout = GetMaterialPropertiesLayout(); + AZStd::vector alignedPropertyValues(m_materialTypeAsset->GetDefaultPropertyValues().begin(), m_materialTypeAsset->GetDefaultPropertyValues().end()); + for (size_t i = 0; i < m_propertyNames.size(); ++i) + { + const MaterialPropertyIndex propertyIndex = propertyLayout->FindPropertyIndex(m_propertyNames[i]); + if (propertyIndex.IsValid()) + { + alignedPropertyValues[propertyIndex.GetIndex()] = m_propertyValues[i]; + } + else + { + AZ_Warning(s_debugTraceName, false, "Material property name \"%s\" is not found in the material properties layout and will not be used.", m_propertyNames[i].GetCStr()); + } + } + m_propertyValues.swap(alignedPropertyValues); + + const size_t propertyCount = propertyLayout->GetPropertyCount(); + m_propertyNames.resize(propertyCount); + for (size_t i = 0; i < propertyCount; ++i) + { + m_propertyNames[i] = propertyLayout->GetPropertyDescriptor(MaterialPropertyIndex{ i })->GetName(); + } + + m_isDirty = false; + } + void MaterialAsset::ReinitializeMaterialTypeAsset(Data::Asset asset) { Data::Asset newMaterialTypeAsset = { asset.GetAs(), AZ::Data::AssetLoadBehavior::PreLoad }; @@ -157,6 +193,8 @@ namespace AZ // This also covers the case where just the MaterialTypeAsset is reloaded and not the MaterialAsset. m_materialTypeAsset = newMaterialTypeAsset; + m_isDirty = true; + // Notify interested parties that this MaterialAsset is changed and may require other data to reinitialize as well MaterialReloadNotificationBus::Event(GetId(), &MaterialReloadNotifications::OnMaterialAssetReinitialized, Data::Asset{this, AZ::Data::AssetLoadBehavior::PreLoad}); } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAssetCreator.cpp index 8e401d2ee8..79d19c15a2 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialAssetCreator.cpp @@ -16,7 +16,7 @@ namespace AZ { namespace RPI { - void MaterialAssetCreator::Begin(const Data::AssetId& assetId, MaterialAsset& parentMaterial) + void MaterialAssetCreator::Begin(const Data::AssetId& assetId, MaterialAsset& parentMaterial, bool includeMaterialPropertyNames) { BeginCommon(assetId); @@ -36,6 +36,10 @@ namespace AZ ReportError("MaterialPropertiesLayout is null"); return; } + if (includeMaterialPropertyNames) + { + PopulatePropertyNameList(); + } // Note we don't have to check the validity of these property values because the parent material's AssetCreator already did that. m_asset->m_propertyValues.assign(parentMaterial.GetPropertyValues().begin(), parentMaterial.GetPropertyValues().end()); @@ -52,14 +56,14 @@ namespace AZ } } - void MaterialAssetCreator::Begin(const Data::AssetId& assetId, MaterialTypeAsset& materialType) + void MaterialAssetCreator::Begin(const Data::AssetId& assetId, MaterialTypeAsset& materialType, bool includeMaterialPropertyNames) { BeginCommon(assetId); if (ValidateIsReady()) { m_asset->m_materialTypeAsset = { &materialType, AZ::Data::AssetLoadBehavior::PreLoad }; - + if (!m_asset->m_materialTypeAsset) { ReportError("MaterialTypeAsset is null"); @@ -67,6 +71,11 @@ namespace AZ } m_materialPropertiesLayout = m_asset->GetMaterialPropertiesLayout(); + if (includeMaterialPropertyNames) + { + PopulatePropertyNameList(); + } + if (!m_materialPropertiesLayout) { ReportError("MaterialPropertiesLayout is null"); @@ -101,5 +110,16 @@ namespace AZ m_asset->SetReady(); return EndCommon(result); } + + void MaterialAssetCreator::PopulatePropertyNameList() + { + for (int i = 0; i < m_materialPropertiesLayout->GetPropertyCount(); ++i) + { + MaterialPropertyIndex propertyIndex{ i }; + auto& propertyName = m_materialPropertiesLayout->GetPropertyDescriptor(propertyIndex)->GetName(); + m_asset->m_propertyNames.emplace_back(propertyName); + } + } + } // namespace RPI } // namespace AZ From 7e61197450a81a1f45715217e6dfcb4cb0482133 Mon Sep 17 00:00:00 2001 From: Gene Walters <32776221+AMZN-Gene@users.noreply.github.com> Date: Wed, 1 Sep 2021 20:46:48 -0700 Subject: [PATCH 089/355] Fix Blast Gem Compiler Error (#3855) * Fix blast compiler error Signed-off-by: Gene Walters * Fixed typo in DamageManager Interface.h include Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Co-authored-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- Gems/Blast/Code/Source/Family/DamageManager.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Gems/Blast/Code/Source/Family/DamageManager.h b/Gems/Blast/Code/Source/Family/DamageManager.h index f56bd7bbdf..4bffd8c5e0 100644 --- a/Gems/Blast/Code/Source/Family/DamageManager.h +++ b/Gems/Blast/Code/Source/Family/DamageManager.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace Blast { From 9a0ea2c4c5cdec19bedec4e527275c7196ea5d94 Mon Sep 17 00:00:00 2001 From: moraaar Date: Thu, 2 Sep 2021 09:35:12 +0100 Subject: [PATCH 090/355] Fixed NvCloth assets, NvCloth automated test scripts, ModelAsset cloning and UI reverse overrides menu crash (#3851) - Fixed cloth asset, which stopped working due to Updated skeleton logic: #2957 which changes how fbx graph nodes are collected (affecting its names, which is used by cloth modifier). - Fixed cloth test suite active call to base's run_test function. It stopped working when its signature was changed here: 182d410#diff-3f5d93b0a76c838893693f19f2eacfe3e67040d445d6463c5c425ef5075cb409 - Renamed nvcloth TestSuite_Active.py to TestSuite_Main.py to be consistent with the other test folders. - Fixed ModelAsset creator clone function. It was missing to copy the material slots, ultimately causing Material Component to show 0 material slots. - Fixed crash where the revert overrides menu was not created when checking changes for selected component and selected entities. Signed-off-by: moraaar moraaar@amazon.com --- ...977329_NvCloth_AddClothSimulationToMesh.py | 6 - ...77330_NvCloth_AddClothSimulationToActor.py | 6 - .../Gem/PythonTests/NvCloth/CMakeLists.txt | 2 +- .../PythonTests/NvCloth/ImportPathHelper.py | 11 -- ...{TestSuite_Active.py => TestSuite_Main.py} | 5 +- ...977329_NvCloth_AddClothSimulationToMesh.ly | 4 +- .../filelist.xml | 2 +- .../level.pak | 4 +- ...77330_NvCloth_AddClothSimulationToActor.ly | 4 +- .../filelist.xml | 2 +- .../level.pak | 4 +- .../PropertyEditor/EntityPropertyEditor.cpp | 18 ++- .../RPI.Reflect/Model/ModelAssetCreator.cpp | 6 + .../cloth/Chicken/Actor/chicken.fbx.assetinfo | 82 ++++------- .../Environment/cloth_blinds.fbx.assetinfo | 16 ++- .../cloth_blinds_broken.fbx.assetinfo | 16 ++- .../cloth_locked_corners_four.fbx.assetinfo | 16 ++- .../cloth_locked_corners_two.fbx.assetinfo | 14 +- .../cloth_locked_edge.fbx.assetinfo | 14 +- .../Assets/prefabs/Cloth/Chicken_Actor.prefab | 126 +++++++++------- .../Assets/prefabs/Cloth/cloth_blinds.prefab | 128 +++++++++-------- .../prefabs/Cloth/cloth_blinds_broken.prefab | 128 +++++++++-------- .../Cloth/cloth_locked_corners_four.prefab | 128 +++++++++-------- .../Cloth/cloth_locked_corners_two.prefab | 128 +++++++++-------- .../prefabs/Cloth/cloth_locked_edge.prefab | 128 +++++++++-------- .../Assets/slices/Cloth/Chicken_Actor.slice | 135 +++++++----------- .../Assets/slices/Cloth/cloth_blinds.slice | 72 +++++----- .../slices/Cloth/cloth_blinds_broken.slice | 72 +++++----- .../Cloth/cloth_locked_corners_four.slice | 72 +++++----- .../Cloth/cloth_locked_corners_two.slice | 72 +++++----- .../slices/Cloth/cloth_locked_edge.slice | 72 +++++----- 31 files changed, 737 insertions(+), 756 deletions(-) delete mode 100755 AutomatedTesting/Gem/PythonTests/NvCloth/ImportPathHelper.py rename AutomatedTesting/Gem/PythonTests/NvCloth/{TestSuite_Active.py => TestSuite_Main.py} (90%) mode change 100755 => 100644 diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py index 6009c2aca7..0ed9da1405 100755 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py @@ -45,10 +45,6 @@ def C18977329_NvCloth_AddClothSimulationToMesh(): from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import Report - # Helper file Imports - import ImportPathHelper as imports - - imports.init() from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -84,7 +80,5 @@ def C18977329_NvCloth_AddClothSimulationToMesh(): helper.close_editor() if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report Report.start_test(C18977329_NvCloth_AddClothSimulationToMesh) diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py index 2eaed04f41..4d84a33dd2 100755 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py @@ -44,11 +44,7 @@ def C18977330_NvCloth_AddClothSimulationToActor(): from editor_python_test_tools.editor_entity_utils import EditorEntity from editor_python_test_tools.utils import Report - - # Helper file Imports - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import TestHelper as helper from editor_python_test_tools.utils import Tracer @@ -84,7 +80,5 @@ def C18977330_NvCloth_AddClothSimulationToActor(): helper.close_editor() if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() from editor_python_test_tools.utils import Report Report.start_test(C18977330_NvCloth_AddClothSimulationToActor) diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt index 3913041f88..4343be3194 100644 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/CMakeLists.txt @@ -12,7 +12,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) TEST_SUITE main TEST_REQUIRES gpu TEST_SERIAL - PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Active.py + PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py RUNTIME_DEPENDENCIES Legacy::Editor AZ::AssetProcessor diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/NvCloth/ImportPathHelper.py deleted file mode 100755 index 0e395664ad..0000000000 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/ImportPathHelper.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - -def init(): - import os - import sys - sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py old mode 100755 new mode 100644 similarity index 90% rename from AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py rename to AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py index 9302054d33..2ddcc58f12 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Active.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py @@ -22,12 +22,11 @@ from base import TestAutomationBase class TestAutomation(TestAutomationBase): use_null_renderer = False # Use default renderer (needs gpu) - extra_cmdline_args = [] def test_C18977329_NvCloth_AddClothSimulationToMesh(self, request, workspace, editor, launcher_platform): from . import C18977329_NvCloth_AddClothSimulationToMesh as test_module - self._run_test(request, workspace, editor, test_module, self.extra_cmdline_args, self.use_null_renderer) + self._run_test(request, workspace, editor, test_module, use_null_renderer = self.use_null_renderer) def test_C18977330_NvCloth_AddClothSimulationToActor(self, request, workspace, editor, launcher_platform): from . import C18977330_NvCloth_AddClothSimulationToActor as test_module - self._run_test(request, workspace, editor, test_module, self.extra_cmdline_args, self.use_null_renderer) + self._run_test(request, workspace, editor, test_module, use_null_renderer = self.use_null_renderer) diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly index 9a1b1fe59a..861626993e 100644 --- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly +++ b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6517300fb1ce70c4696286e14715c547cfd175eabbb2042f7f2a456b15054224 -size 5253 +oid sha256:bedd2adc60f244a8595e64619069046d5036dd762f61b5393f9b759d69281362 +size 5276 diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml index 2cf4d55bf0..d3492ca7b6 100644 --- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml +++ b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml @@ -1,6 +1,6 @@ - + diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak index 954bb1912f..7fa23ea67f 100644 --- a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak +++ b/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ce32a7cdf3ed37751385b3bb18f05206702978363f325d06727b5eb20d40b7eb -size 38563 +oid sha256:81fc98854424d55e594a3983da53d2f5a4d7a7cf60e52e12366e4800d1d3f080 +size 38559 diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly index 9ef8bc0525..23397bf18d 100644 --- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly +++ b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89dbcec013cb819e52ec0f8fed0a9e417fd32eac8aeb67d3958266bb6089ec21 -size 5505 +oid sha256:b59cbe84cb77090d723d120597f9d11817aa67a267a7f495f8b012fdd8a9dd86 +size 5536 diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml index a7de99a91c..20952a47ce 100644 --- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml +++ b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml @@ -1,6 +1,6 @@ - + diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak index ad10c72b31..4259131c4f 100644 --- a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak +++ b/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:622c2624b04e07b704520f32c458b50d5a50de1ef116b7bc9c3c0ccb6f4a4ecc -size 3606 +oid sha256:46051f4116003e1a2d13855bea92a1b15501166b1379a11d02c4d2239ccd2530 +size 3648 diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp index 001cd12349..87527502dd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.cpp @@ -2352,6 +2352,13 @@ namespace AzToolsFramework { QMenu* revertMenu = nullptr; + auto addRevertMenu = [&menu]() + { + QMenu* revertOverridesMenu = menu.addMenu(tr("Revert overrides")); + revertOverridesMenu->setToolTipsVisible(true); + return revertOverridesMenu; + }; + //check for changes on selected property if (componentClassData) { @@ -2372,8 +2379,7 @@ namespace AzToolsFramework } // Only add the "Revert overrides" menu option if it belongs to a slice - revertMenu = menu.addMenu(tr("Revert overrides")); - revertMenu->setToolTipsVisible(true); + revertMenu = addRevertMenu(); revertMenu->setEnabled(false); if (fieldNode) @@ -2447,6 +2453,10 @@ namespace AzToolsFramework if (isPartOfSlice && hasSliceChanges) { + if (!revertMenu) + { + revertMenu = addRevertMenu(); + } revertMenu->setEnabled(true); QAction* revertComponentAction = revertMenu->addAction(tr("Component")); @@ -2487,6 +2497,10 @@ namespace AzToolsFramework relevantEntities.push_back(id); } + if (!revertMenu) + { + revertMenu = addRevertMenu(); + } revertMenu->setEnabled(true); QAction* revertAction = revertMenu->addAction(QObject::tr("Entity")); revertAction->setToolTip(QObject::tr("This will revert all component properties on this entity to the last saved.")); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp index b35c9e44fe..524ef9e910 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAssetCreator.cpp @@ -118,6 +118,12 @@ namespace AZ } } + const ModelMaterialSlotMap &sourceMaterialSlotMap = sourceAsset->GetMaterialSlots(); + for (const auto& sourceMaterialSlot : sourceMaterialSlotMap) + { + creator.AddMaterialSlot(sourceMaterialSlot.second); + } + return creator.End(clonedResult); } } // namespace RPI diff --git a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo index 37480c52c1..4c73efae13 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Chicken/Actor/chicken.fbx.assetinfo @@ -25,13 +25,18 @@ "Position": [ -0.03709467500448227, -3.725290298461914e-9, - 0.013427333906292916 + 0.013427333906292915 ], + "MaterialSelection": { + "MaterialIds": [ + {} + ] + }, "propertyVisibilityFlags": 248 }, { "$type": "SphereShapeConfiguration", - "Radius": 0.12945009768009187 + "Radius": 0.12945009768009186 } ] ] @@ -50,15 +55,20 @@ "Rotation": [ 0.0, 0.662880003452301, - 0.7487256526947022, + 0.7487256526947021, 0.0 ], + "MaterialSelection": { + "MaterialIds": [ + {} + ] + }, "propertyVisibilityFlags": 248 }, { "$type": "CapsuleShapeConfiguration", "Height": 0.8597599267959595, - "Radius": 0.27968019247055056 + "Radius": 0.27968019247055054 } ] ] @@ -79,95 +89,51 @@ "RootNode", "RootNode.chicken_skeleton", "RootNode.chicken_feet_skin", + "RootNode.chicken_feet_skin.chicken_feet_skin_1", + "RootNode.chicken_feet_skin.chicken_feet_skin_2", "RootNode.chicken_eyes_skin", + "RootNode.chicken_eyes_skin.chicken_eyes_skin_1", + "RootNode.chicken_eyes_skin.chicken_eyes_skin_2", "RootNode.chicken_body_skin", + "RootNode.chicken_body_skin.chicken_body_skin_1", + "RootNode.chicken_body_skin.chicken_body_skin_2", "RootNode.chicken_mohawk", - "RootNode.chicken_skeleton.transform", + "RootNode.chicken_mohawk.chicken_mohawk_1", + "RootNode.chicken_mohawk.chicken_mohawk_2", "RootNode.chicken_skeleton.def_c_chickenRoot_joint", - "RootNode.chicken_feet_skin.SkinWeight_0", - "RootNode.chicken_feet_skin.transform", - "RootNode.chicken_feet_skin.map1", - "RootNode.chicken_feet_skin.chicken_body_mat", - "RootNode.chicken_eyes_skin.SkinWeight_0", - "RootNode.chicken_eyes_skin.transform", - "RootNode.chicken_eyes_skin.uvSet1", - "RootNode.chicken_eyes_skin.chicken_eye_mat", - "RootNode.chicken_body_skin.SkinWeight_0", - "RootNode.chicken_body_skin.transform", - "RootNode.chicken_body_skin.map1", - "RootNode.chicken_body_skin.chicken_body_mat", - "RootNode.chicken_mohawk.Col0", - "RootNode.chicken_mohawk.SkinWeight_0", - "RootNode.chicken_mohawk.transform", - "RootNode.chicken_mohawk.map1", - "RootNode.chicken_mohawk.mohawkMat", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.def_l_foot_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.def_r_foot_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_tail1_joint", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.def_l_wing2_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.def_r_wing2_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.def_l_foot_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.def_l_foot_joint.def_l_ball_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.def_r_foot_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.def_r_foot_joint.def_r_ball_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_tail1_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_tail1_joint.def_c_tail2_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.def_l_wing2_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.def_l_wing2_joint.def_l_wing_end", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.def_r_wing2_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.def_r_wing2_joint.def_r_wing_end", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_l_uprLeg_joint.def_l_lwrLeg_joint.def_l_foot_joint.def_l_ball_joint.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_r_uprLeg_joint.def_r_lwrLeg_joint.def_r_foot_joint.def_r_ball_joint.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_tail1_joint.def_c_tail2_joint.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_mouth_joint", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_l_wing1_joint.def_l_wing2_joint.def_l_wing_end.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_r_wing1_joint.def_r_wing2_joint.def_r_wing_end.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_mouth_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_mouth_joint.def_c_mouth_end", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_mouth_joint.def_c_mouth_end.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.def_c_waddle3_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.def_c_waddle3_joint.transform", "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.def_c_waddle3_joint.def_c_waddle_end", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint.def_c_feather_end", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_waddle1_joint.def_c_waddle2_joint.def_c_waddle3_joint.def_c_waddle_end.transform", - "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint.def_c_feather_end.transform" + "RootNode.chicken_skeleton.def_c_chickenRoot_joint.def_c_spine1_joint.def_c_spine2_joint.def_c_spine3_joint.def_c_spine_end.def_c_neck_joint.def_c_head_joint.def_c_feather1_joint.def_c_feather2_joint.def_c_feather3_joint.def_c_feather4_joint.def_c_feather_end" ] }, "rules": { @@ -184,7 +150,7 @@ }, { "$type": "ClothRule", - "meshNodeName": "RootNode.chicken_mohawk", + "meshNodeName": "RootNode.chicken_mohawk.chicken_mohawk_1", "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo index cbde27b201..b7dae925c9 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds.fbx.assetinfo @@ -7,10 +7,14 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.Col0", - "RootNode.pPlane1.transform", - "RootNode.pPlane1.map1", - "RootNode.pPlane1.lambert1" + "RootNode.pPlane1.pPlane1_1", + "RootNode.pPlane1.pPlane1_2", + "RootNode.pPlane1.pPlane1_1.Col0", + "RootNode.pPlane1.pPlane1_1.map1", + "RootNode.pPlane1.pPlane1_1.lambert1", + "RootNode.pPlane1.pPlane1_2.Col0", + "RootNode.pPlane1.pPlane1_2.map1", + "RootNode.pPlane1.pPlane1_2.lambert1" ] }, "rules": { @@ -24,7 +28,7 @@ }, { "$type": "ClothRule", - "meshNodeName": "RootNode.pPlane1", + "meshNodeName": "RootNode.pPlane1.pPlane1_1", "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" @@ -34,4 +38,4 @@ "id": "{9D0F5F7F-FB90-5C00-97A7-C55F9180CE4E}" } ] -} +} \ No newline at end of file diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo index 1636e063a7..db558275cf 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_blinds_broken.fbx.assetinfo @@ -7,10 +7,14 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.Col0", - "RootNode.pPlane1.transform", - "RootNode.pPlane1.map1", - "RootNode.pPlane1.lambert1" + "RootNode.pPlane1.pPlane1_1", + "RootNode.pPlane1.pPlane1_2", + "RootNode.pPlane1.pPlane1_1.Col0", + "RootNode.pPlane1.pPlane1_1.map1", + "RootNode.pPlane1.pPlane1_1.lambert1", + "RootNode.pPlane1.pPlane1_2.Col0", + "RootNode.pPlane1.pPlane1_2.map1", + "RootNode.pPlane1.pPlane1_2.lambert1" ] }, "rules": { @@ -24,7 +28,7 @@ }, { "$type": "ClothRule", - "meshNodeName": "RootNode.pPlane1", + "meshNodeName": "RootNode.pPlane1.pPlane1_1", "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" @@ -34,4 +38,4 @@ "id": "{3A467F2C-C2AB-581F-94E3-946575011973}" } ] -} +} \ No newline at end of file diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo index aea3110a42..5dacf085cf 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_four.fbx.assetinfo @@ -7,10 +7,14 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.Col0", - "RootNode.pPlane1.transform", - "RootNode.pPlane1.map1", - "RootNode.pPlane1.lambert1" + "RootNode.pPlane1.pPlane1_1", + "RootNode.pPlane1.pPlane1_2", + "RootNode.pPlane1.pPlane1_1.Col0", + "RootNode.pPlane1.pPlane1_1.map1", + "RootNode.pPlane1.pPlane1_1.lambert1", + "RootNode.pPlane1.pPlane1_2.Col0", + "RootNode.pPlane1.pPlane1_2.map1", + "RootNode.pPlane1.pPlane1_2.lambert1" ] }, "rules": { @@ -24,7 +28,7 @@ }, { "$type": "ClothRule", - "meshNodeName": "RootNode.pPlane1", + "meshNodeName": "RootNode.pPlane1.pPlane1_1", "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" @@ -34,4 +38,4 @@ "id": "{105338D3-5947-5F72-A077-36C193C8AE7C}" } ] -} +} \ No newline at end of file diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo index d23b92be9f..8da57dbed3 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_corners_two.fbx.assetinfo @@ -7,10 +7,14 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.Col0", - "RootNode.pPlane1.transform", - "RootNode.pPlane1.map1", - "RootNode.pPlane1.lambert1" + "RootNode.pPlane1.pPlane1_1", + "RootNode.pPlane1.pPlane1_2", + "RootNode.pPlane1.pPlane1_1.Col0", + "RootNode.pPlane1.pPlane1_1.map1", + "RootNode.pPlane1.pPlane1_1.lambert1", + "RootNode.pPlane1.pPlane1_2.Col0", + "RootNode.pPlane1.pPlane1_2.map1", + "RootNode.pPlane1.pPlane1_2.lambert1" ] }, "rules": { @@ -24,7 +28,7 @@ }, { "$type": "ClothRule", - "meshNodeName": "RootNode.pPlane1", + "meshNodeName": "RootNode.pPlane1.pPlane1_1", "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" diff --git a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo index 6a56ea23cf..bfc39618b4 100644 --- a/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo +++ b/Gems/NvCloth/Assets/Objects/cloth/Environment/cloth_locked_edge.fbx.assetinfo @@ -7,10 +7,14 @@ "selectedNodes": [ "RootNode", "RootNode.pPlane1", - "RootNode.pPlane1.Col0", - "RootNode.pPlane1.transform", - "RootNode.pPlane1.map1", - "RootNode.pPlane1.lambert1" + "RootNode.pPlane1.pPlane1_1", + "RootNode.pPlane1.pPlane1_2", + "RootNode.pPlane1.pPlane1_1.Col0", + "RootNode.pPlane1.pPlane1_1.map1", + "RootNode.pPlane1.pPlane1_1.lambert1", + "RootNode.pPlane1.pPlane1_2.Col0", + "RootNode.pPlane1.pPlane1_2.map1", + "RootNode.pPlane1.pPlane1_2.lambert1" ] }, "rules": { @@ -24,7 +28,7 @@ }, { "$type": "ClothRule", - "meshNodeName": "RootNode.pPlane1", + "meshNodeName": "RootNode.pPlane1.pPlane1_1", "inverseMassesStreamName": "Col0", "motionConstraintsStreamName": "Default: 1.0", "backstopStreamName": "None" diff --git a/Gems/NvCloth/Assets/prefabs/Cloth/Chicken_Actor.prefab b/Gems/NvCloth/Assets/prefabs/Cloth/Chicken_Actor.prefab index 57953f927b..16d30a36c2 100644 --- a/Gems/NvCloth/Assets/prefabs/Cloth/Chicken_Actor.prefab +++ b/Gems/NvCloth/Assets/prefabs/Cloth/Chicken_Actor.prefab @@ -22,8 +22,7 @@ "Component_[4272963378099646759]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4272963378099646759, - "Parent Entity": "", - "Cached World Transform Parent": "" + "Parent Entity": "" }, "Component_[4848458548047175816]": { "$type": "EditorVisibilityComponent", @@ -80,8 +79,7 @@ "Component_[12470135924384913029]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 12470135924384913029, - "Parent Entity": "ContainerEntity", - "Cached World Transform Parent": "ContainerEntity" + "Parent Entity": "ContainerEntity" }, "Component_[14919455666821657531]": { "$type": "EditorEntitySortComponent", @@ -108,8 +106,7 @@ "$type": "SelectionComponent", "Id": 786957291078135994 } - }, - "IsDependencyReady": true + } }, "Entity_[303451468511700]": { "Id": "Entity_[303451468511700]", @@ -163,7 +160,7 @@ "assetHint": "objects/cloth/chicken/motions/chickenidle.motion" }, "Loop": true, - "PlaySpeed": 1.2000000476837159 + "PlaySpeed": 1.2000000476837158 } }, "Component_[3482722103355682975]": { @@ -182,7 +179,7 @@ "$type": "EditorClothComponent", "Id": 7236637452394054627, "Configuration": { - "Mesh Node": "chicken_mohawk", + "Mesh Node": "chicken_mohawk_1", "Mass": 4.0, "Remove Static Triangles": false } @@ -191,18 +188,27 @@ "$type": "EditorEntitySortComponent", "Id": 868427789695884987 }, - "Component_[8777596718122199558]": { + "Component_[9845606399230319505]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 9845606399230319505, + "Parent Entity": "Entity_[303447173544404]", + "Transform Data": { + "Rotate": [ + 0.0, + 0.0, + -0.00006830000347690657 + ] + } + }, + "Component_[9927411050130082647]": { "$type": "EditorMaterialComponent", - "Id": 8777596718122199558, + "Id": 9927411050130082647, "Controller": { "Configuration": { "materials": [ { "Key": { - "materialAssetId": { - "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", - "subId": 668669130 - } + "materialSlotStableId": 668669130 }, "Value": { "MaterialAsset": { @@ -215,10 +221,7 @@ }, { "Key": { - "materialAssetId": { - "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", - "subId": 1541321207 - } + "materialSlotStableId": 1541321207 }, "Value": { "MaterialAsset": { @@ -231,10 +234,7 @@ }, { "Key": { - "materialAssetId": { - "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", - "subId": 2608524672 - } + "materialSlotStableId": 2608524672 }, "Value": { "MaterialAsset": { @@ -251,44 +251,59 @@ "materialSlots": [ { "id": { - "materialAssetId": { - "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", - "subId": 668669130 - } + "materialSlotStableId": 668669130 }, "materialAsset": { "assetId": { "guid": "{FB34D8F7-E8CA-542D-92A3-F0E04F3A3EC3}" }, "assetHint": "objects/cloth/chicken/actor/chicken_chicken_body_mat.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", + "subId": 668669130 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/chicken/actor/chicken_chicken_body_mat_4404500000782619850.azmaterial" } }, { "id": { - "materialAssetId": { - "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", - "subId": 1541321207 - } + "materialSlotStableId": 1541321207 }, "materialAsset": { "assetId": { "guid": "{6114C408-26EE-51DC-8733-A07800BF4991}" }, "assetHint": "objects/cloth/chicken/actor/chicken_chicken_eye_mat.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", + "subId": 1541321207 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/chicken/actor/chicken_chicken_eye_mat_10184937185004663287.azmaterial" } }, { "id": { - "materialAssetId": { - "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", - "subId": 2608524672 - } + "materialSlotStableId": 2608524672 }, "materialAsset": { "assetId": { "guid": "{80F92051-203E-52CE-B4D6-E3AED21795C9}" }, "assetHint": "objects/cloth/chicken/actor/chicken_mohawkmat.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", + "subId": 2608524672 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/chicken/actor/chicken_mohawkmat_13891540077583723904.azmaterial" } } ], @@ -297,46 +312,48 @@ { "id": { "lodIndex": 0, - "materialAssetId": { + "materialSlotStableId": 668669130 + }, + "defaultMaterialAsset": { + "assetId": { "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", "subId": 668669130 - } + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/chicken/actor/chicken_chicken_body_mat_4404500000782619850.azmaterial" } }, { "id": { "lodIndex": 0, - "materialAssetId": { + "materialSlotStableId": 1541321207 + }, + "defaultMaterialAsset": { + "assetId": { "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", "subId": 1541321207 - } + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/chicken/actor/chicken_chicken_eye_mat_10184937185004663287.azmaterial" } }, { "id": { "lodIndex": 0, - "materialAssetId": { + "materialSlotStableId": 2608524672 + }, + "defaultMaterialAsset": { + "assetId": { "guid": "{3E4C6A29-92A4-523E-8739-F3E64957569E}", "subId": 2608524672 - } + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/chicken/actor/chicken_mohawkmat_13891540077583723904.azmaterial" } } ] ] }, - "Component_[9845606399230319505]": { - "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", - "Id": 9845606399230319505, - "Parent Entity": "Entity_[303447173544404]", - "Transform Data": { - "Rotate": [ - 0.0, - 0.0, - -0.00006830000347690657 - ] - }, - "Cached World Transform Parent": "" - }, "Component_[9979479216337101498]": { "$type": "EditorInspectorComponent", "Id": 9979479216337101498, @@ -362,8 +379,7 @@ } ] } - }, - "IsDependencyReady": true + } } } } \ No newline at end of file diff --git a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds.prefab b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds.prefab index 270f52b29b..108b4ba13c 100644 --- a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds.prefab +++ b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds.prefab @@ -22,8 +22,7 @@ "Component_[4272963378099646759]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4272963378099646759, - "Parent Entity": "", - "Cached World Transform Parent": "" + "Parent Entity": "" }, "Component_[4848458548047175816]": { "$type": "EditorVisibilityComponent", @@ -64,7 +63,7 @@ "$type": "EditorClothComponent", "Id": 11309989511197311871, "Configuration": { - "Mesh Node": "pPlane1", + "Mesh Node": "pPlane1_1", "Damping": [ 0.0, 0.0, @@ -94,6 +93,68 @@ "$type": "EditorLockComponent", "Id": 12850019035302463297 }, + "Component_[15070431754554069043]": { + "$type": "EditorMaterialComponent", + "Id": 15070431754554069043, + "Controller": { + "Configuration": { + "materials": [ + { + "Key": { + "materialSlotStableId": 902256226 + }, + "Value": { + "MaterialAsset": { + "assetId": { + "guid": "{6BFA7C7C-AF9F-5B12-8B30-6B6ECE9BAB9E}" + }, + "assetHint": "objects/cloth/environment/cloth_blinds.azmaterial" + } + } + } + ] + } + }, + "materialSlots": [ + { + "id": { + "materialSlotStableId": 902256226 + }, + "materialAsset": { + "assetId": { + "guid": "{6BFA7C7C-AF9F-5B12-8B30-6B6ECE9BAB9E}" + }, + "assetHint": "objects/cloth/environment/cloth_blinds.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{C3078003-51DA-5D8E-B311-38C426480DD2}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_blinds_lambert1_3614897150141879906.azmaterial" + } + } + ], + "materialSlotsByLod": [ + [ + { + "id": { + "lodIndex": 0, + "materialSlotStableId": 902256226 + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{C3078003-51DA-5D8E-B311-38C426480DD2}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_blinds_lambert1_3614897150141879906.azmaterial" + } + } + ] + ] + }, "Component_[15214644042360665965]": { "$type": "AZ::Render::EditorMeshComponent", "Id": 15214644042360665965, @@ -145,8 +206,7 @@ "Component_[4795695323030511838]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4795695323030511838, - "Parent Entity": "ContainerEntity", - "Cached World Transform Parent": "ContainerEntity" + "Parent Entity": "ContainerEntity" }, "Component_[5800800590637221800]": { "$type": "EditorDisabledCompositionComponent", @@ -159,64 +219,8 @@ "Component_[7074022732104182988]": { "$type": "EditorEntitySortComponent", "Id": 7074022732104182988 - }, - "Component_[9206497685981025331]": { - "$type": "EditorMaterialComponent", - "Id": 9206497685981025331, - "Controller": { - "Configuration": { - "materials": [ - { - "Key": { - "materialAssetId": { - "guid": "{C3078003-51DA-5D8E-B311-38C426480DD2}", - "subId": 902256226 - } - }, - "Value": { - "MaterialAsset": { - "assetId": { - "guid": "{6BFA7C7C-AF9F-5B12-8B30-6B6ECE9BAB9E}" - }, - "assetHint": "objects/cloth/environment/cloth_blinds.azmaterial" - } - } - } - ] - } - }, - "materialSlots": [ - { - "id": { - "materialAssetId": { - "guid": "{C3078003-51DA-5D8E-B311-38C426480DD2}", - "subId": 902256226 - } - }, - "materialAsset": { - "assetId": { - "guid": "{6BFA7C7C-AF9F-5B12-8B30-6B6ECE9BAB9E}" - }, - "assetHint": "objects/cloth/environment/cloth_blinds.azmaterial" - } - } - ], - "materialSlotsByLod": [ - [ - { - "id": { - "lodIndex": 0, - "materialAssetId": { - "guid": "{C3078003-51DA-5D8E-B311-38C426480DD2}", - "subId": 902256226 - } - } - } - ] - ] } - }, - "IsDependencyReady": true + } } } } \ No newline at end of file diff --git a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds_broken.prefab b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds_broken.prefab index 7feb61db90..52b0c9fa17 100644 --- a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds_broken.prefab +++ b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_blinds_broken.prefab @@ -22,8 +22,7 @@ "Component_[4272963378099646759]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4272963378099646759, - "Parent Entity": "", - "Cached World Transform Parent": "" + "Parent Entity": "" }, "Component_[4848458548047175816]": { "$type": "EditorVisibilityComponent", @@ -60,7 +59,7 @@ "$type": "EditorClothComponent", "Id": 10786078036233199116, "Configuration": { - "Mesh Node": "pPlane1", + "Mesh Node": "pPlane1_1", "Damping": [ 0.0, 0.0, @@ -127,66 +126,10 @@ "$type": "EditorEntityIconComponent", "Id": 4939437553142322315 }, - "Component_[538074694053236341]": { - "$type": "EditorMaterialComponent", - "Id": 538074694053236341, - "Controller": { - "Configuration": { - "materials": [ - { - "Key": { - "materialAssetId": { - "guid": "{A64AD477-5E35-5834-A9A3-580B9D708E0C}", - "subId": 902256226 - } - }, - "Value": { - "MaterialAsset": { - "assetId": { - "guid": "{EB6CB909-E4BB-54CB-8CAE-6A4B4F203B1B}" - }, - "assetHint": "objects/cloth/environment/cloth_blinds_broken.azmaterial" - } - } - } - ] - } - }, - "materialSlots": [ - { - "id": { - "materialAssetId": { - "guid": "{A64AD477-5E35-5834-A9A3-580B9D708E0C}", - "subId": 902256226 - } - }, - "materialAsset": { - "assetId": { - "guid": "{EB6CB909-E4BB-54CB-8CAE-6A4B4F203B1B}" - }, - "assetHint": "objects/cloth/environment/cloth_blinds_broken.azmaterial" - } - } - ], - "materialSlotsByLod": [ - [ - { - "id": { - "lodIndex": 0, - "materialAssetId": { - "guid": "{A64AD477-5E35-5834-A9A3-580B9D708E0C}", - "subId": 902256226 - } - } - } - ] - ] - }, "Component_[5681411293917950785]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 5681411293917950785, - "Parent Entity": "ContainerEntity", - "Cached World Transform Parent": "ContainerEntity" + "Parent Entity": "ContainerEntity" }, "Component_[7046686956433693767]": { "$type": "EditorInspectorComponent", @@ -209,12 +152,73 @@ } ] }, + "Component_[7873865615483617838]": { + "$type": "EditorMaterialComponent", + "Id": 7873865615483617838, + "Controller": { + "Configuration": { + "materials": [ + { + "Key": { + "materialSlotStableId": 902256226 + }, + "Value": { + "MaterialAsset": { + "assetId": { + "guid": "{EB6CB909-E4BB-54CB-8CAE-6A4B4F203B1B}" + }, + "assetHint": "objects/cloth/environment/cloth_blinds_broken.azmaterial" + } + } + } + ] + } + }, + "materialSlots": [ + { + "id": { + "materialSlotStableId": 902256226 + }, + "materialAsset": { + "assetId": { + "guid": "{EB6CB909-E4BB-54CB-8CAE-6A4B4F203B1B}" + }, + "assetHint": "objects/cloth/environment/cloth_blinds_broken.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{A64AD477-5E35-5834-A9A3-580B9D708E0C}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_blinds_broken_lambert1_3614897150141879906.azmaterial" + } + } + ], + "materialSlotsByLod": [ + [ + { + "id": { + "lodIndex": 0, + "materialSlotStableId": 902256226 + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{A64AD477-5E35-5834-A9A3-580B9D708E0C}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_blinds_broken_lambert1_3614897150141879906.azmaterial" + } + } + ] + ] + }, "Component_[9565338131843702938]": { "$type": "EditorOnlyEntityComponent", "Id": 9565338131843702938 } - }, - "IsDependencyReady": true + } } } } \ No newline at end of file diff --git a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_four.prefab b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_four.prefab index cdbe92dab6..1017317bd3 100644 --- a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_four.prefab +++ b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_four.prefab @@ -22,8 +22,7 @@ "Component_[4272963378099646759]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4272963378099646759, - "Parent Entity": "", - "Cached World Transform Parent": "" + "Parent Entity": "" }, "Component_[4848458548047175816]": { "$type": "EditorVisibilityComponent", @@ -74,63 +73,7 @@ "Component_[12766570162661899127]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 12766570162661899127, - "Parent Entity": "ContainerEntity", - "Cached World Transform Parent": "ContainerEntity" - }, - "Component_[12950486357466178058]": { - "$type": "EditorMaterialComponent", - "Id": 12950486357466178058, - "Controller": { - "Configuration": { - "materials": [ - { - "Key": { - "materialAssetId": { - "guid": "{89C91D92-7B4E-5EB5-945D-0053111859EE}", - "subId": 902256226 - } - }, - "Value": { - "MaterialAsset": { - "assetId": { - "guid": "{838EA487-0F74-5448-AABE-947B138CD6C2}" - }, - "assetHint": "objects/cloth/environment/cloth_locked_corners_four.azmaterial" - } - } - } - ] - } - }, - "materialSlots": [ - { - "id": { - "materialAssetId": { - "guid": "{89C91D92-7B4E-5EB5-945D-0053111859EE}", - "subId": 902256226 - } - }, - "materialAsset": { - "assetId": { - "guid": "{838EA487-0F74-5448-AABE-947B138CD6C2}" - }, - "assetHint": "objects/cloth/environment/cloth_locked_corners_four.azmaterial" - } - } - ], - "materialSlotsByLod": [ - [ - { - "id": { - "lodIndex": 0, - "materialAssetId": { - "guid": "{89C91D92-7B4E-5EB5-945D-0053111859EE}", - "subId": 902256226 - } - } - } - ] - ] + "Parent Entity": "ContainerEntity" }, "Component_[13484816898680823471]": { "$type": "EditorEntitySortComponent", @@ -165,7 +108,7 @@ "$type": "EditorClothComponent", "Id": 15114198178471353754, "Configuration": { - "Mesh Node": "pPlane1", + "Mesh Node": "pPlane1_1", "Stiffness Frequency": 1.0, "Damping": [ 0.0, @@ -210,6 +153,68 @@ "$type": "EditorDisabledCompositionComponent", "Id": 7652255413353256955 }, + "Component_[8261070538889619357]": { + "$type": "EditorMaterialComponent", + "Id": 8261070538889619357, + "Controller": { + "Configuration": { + "materials": [ + { + "Key": { + "materialSlotStableId": 902256226 + }, + "Value": { + "MaterialAsset": { + "assetId": { + "guid": "{838EA487-0F74-5448-AABE-947B138CD6C2}" + }, + "assetHint": "objects/cloth/environment/cloth_locked_corners_four.azmaterial" + } + } + } + ] + } + }, + "materialSlots": [ + { + "id": { + "materialSlotStableId": 902256226 + }, + "materialAsset": { + "assetId": { + "guid": "{838EA487-0F74-5448-AABE-947B138CD6C2}" + }, + "assetHint": "objects/cloth/environment/cloth_locked_corners_four.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{89C91D92-7B4E-5EB5-945D-0053111859EE}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_locked_corners_four_lambert1_3614897150141879906.azmaterial" + } + } + ], + "materialSlotsByLod": [ + [ + { + "id": { + "lodIndex": 0, + "materialSlotStableId": 902256226 + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{89C91D92-7B4E-5EB5-945D-0053111859EE}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_locked_corners_four_lambert1_3614897150141879906.azmaterial" + } + } + ] + ] + }, "Component_[8417657922837077982]": { "$type": "EditorVisibilityComponent", "Id": 8417657922837077982 @@ -218,8 +223,7 @@ "$type": "SelectionComponent", "Id": 944311658362107535 } - }, - "IsDependencyReady": true + } } } } \ No newline at end of file diff --git a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_two.prefab b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_two.prefab index 068c4a6a7e..368cb2d846 100644 --- a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_two.prefab +++ b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_corners_two.prefab @@ -22,8 +22,7 @@ "Component_[4272963378099646759]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4272963378099646759, - "Parent Entity": "", - "Cached World Transform Parent": "" + "Parent Entity": "" }, "Component_[4848458548047175816]": { "$type": "EditorVisibilityComponent", @@ -84,7 +83,7 @@ "$type": "EditorClothComponent", "Id": 16927361351552746000, "Configuration": { - "Mesh Node": "pPlane1", + "Mesh Node": "pPlane1_1", "Mass": 10.0, "Stiffness Frequency": 1.0, "Damping": [ @@ -109,6 +108,68 @@ "Update Normals of Static Particles": true } }, + "Component_[17380859760246609280]": { + "$type": "EditorMaterialComponent", + "Id": 17380859760246609280, + "Controller": { + "Configuration": { + "materials": [ + { + "Key": { + "materialSlotStableId": 902256226 + }, + "Value": { + "MaterialAsset": { + "assetId": { + "guid": "{A56F28DD-6082-50B6-9B44-9EF3E03E95BB}" + }, + "assetHint": "objects/cloth/environment/cloth_locked_corners_two.azmaterial" + } + } + } + ] + } + }, + "materialSlots": [ + { + "id": { + "materialSlotStableId": 902256226 + }, + "materialAsset": { + "assetId": { + "guid": "{A56F28DD-6082-50B6-9B44-9EF3E03E95BB}" + }, + "assetHint": "objects/cloth/environment/cloth_locked_corners_two.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{23C6817F-0B79-5CAD-B861-9E6F5E55927D}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_locked_corners_two_lambert1_3614897150141879906.azmaterial" + } + } + ], + "materialSlotsByLod": [ + [ + { + "id": { + "lodIndex": 0, + "materialSlotStableId": 902256226 + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{23C6817F-0B79-5CAD-B861-9E6F5E55927D}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_locked_corners_two_lambert1_3614897150141879906.azmaterial" + } + } + ] + ] + }, "Component_[2410073307760782444]": { "$type": "EditorPendingCompositionComponent", "Id": 2410073307760782444 @@ -137,8 +198,7 @@ "Component_[5636741882934012477]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 5636741882934012477, - "Parent Entity": "ContainerEntity", - "Cached World Transform Parent": "ContainerEntity" + "Parent Entity": "ContainerEntity" }, "Component_[691437686890444081]": { "$type": "SelectionComponent", @@ -158,64 +218,8 @@ } } } - }, - "Component_[9419069324766365964]": { - "$type": "EditorMaterialComponent", - "Id": 9419069324766365964, - "Controller": { - "Configuration": { - "materials": [ - { - "Key": { - "materialAssetId": { - "guid": "{23C6817F-0B79-5CAD-B861-9E6F5E55927D}", - "subId": 902256226 - } - }, - "Value": { - "MaterialAsset": { - "assetId": { - "guid": "{A56F28DD-6082-50B6-9B44-9EF3E03E95BB}" - }, - "assetHint": "objects/cloth/environment/cloth_locked_corners_two.azmaterial" - } - } - } - ] - } - }, - "materialSlots": [ - { - "id": { - "materialAssetId": { - "guid": "{23C6817F-0B79-5CAD-B861-9E6F5E55927D}", - "subId": 902256226 - } - }, - "materialAsset": { - "assetId": { - "guid": "{A56F28DD-6082-50B6-9B44-9EF3E03E95BB}" - }, - "assetHint": "objects/cloth/environment/cloth_locked_corners_two.azmaterial" - } - } - ], - "materialSlotsByLod": [ - [ - { - "id": { - "lodIndex": 0, - "materialAssetId": { - "guid": "{23C6817F-0B79-5CAD-B861-9E6F5E55927D}", - "subId": 902256226 - } - } - } - ] - ] } - }, - "IsDependencyReady": true + } } } } \ No newline at end of file diff --git a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_edge.prefab b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_edge.prefab index 7bba36adf8..ec837d1bd4 100644 --- a/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_edge.prefab +++ b/Gems/NvCloth/Assets/prefabs/Cloth/cloth_locked_edge.prefab @@ -22,8 +22,7 @@ "Component_[4272963378099646759]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4272963378099646759, - "Parent Entity": "", - "Cached World Transform Parent": "" + "Parent Entity": "" }, "Component_[4848458548047175816]": { "$type": "EditorVisibilityComponent", @@ -96,6 +95,68 @@ } ] }, + "Component_[14970093767651057273]": { + "$type": "EditorMaterialComponent", + "Id": 14970093767651057273, + "Controller": { + "Configuration": { + "materials": [ + { + "Key": { + "materialSlotStableId": 902256226 + }, + "Value": { + "MaterialAsset": { + "assetId": { + "guid": "{FF25E0FE-B695-5084-AE1E-65F095AA5C3F}" + }, + "assetHint": "objects/cloth/environment/cloth_locked_edge.azmaterial" + } + } + } + ] + } + }, + "materialSlots": [ + { + "id": { + "materialSlotStableId": 902256226 + }, + "materialAsset": { + "assetId": { + "guid": "{FF25E0FE-B695-5084-AE1E-65F095AA5C3F}" + }, + "assetHint": "objects/cloth/environment/cloth_locked_edge.azmaterial" + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_locked_edge_lambert1_3614897150141879906.azmaterial" + } + } + ], + "materialSlotsByLod": [ + [ + { + "id": { + "lodIndex": 0, + "materialSlotStableId": 902256226 + }, + "defaultMaterialAsset": { + "assetId": { + "guid": "{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}", + "subId": 902256226 + }, + "loadBehavior": "PreLoad", + "assetHint": "objects/cloth/environment/cloth_locked_edge_lambert1_3614897150141879906.azmaterial" + } + } + ] + ] + }, "Component_[14983280478781449966]": { "$type": "SelectionComponent", "Id": 14983280478781449966 @@ -104,7 +165,7 @@ "$type": "EditorClothComponent", "Id": 16595775512479337011, "Configuration": { - "Mesh Node": "pPlane1", + "Mesh Node": "pPlane1_1", "Damping": [ 0.0, 0.0, @@ -137,63 +198,7 @@ "Component_[4215669181198357248]": { "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", "Id": 4215669181198357248, - "Parent Entity": "ContainerEntity", - "Cached World Transform Parent": "ContainerEntity" - }, - "Component_[4580390205455331350]": { - "$type": "EditorMaterialComponent", - "Id": 4580390205455331350, - "Controller": { - "Configuration": { - "materials": [ - { - "Key": { - "materialAssetId": { - "guid": "{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}", - "subId": 902256226 - } - }, - "Value": { - "MaterialAsset": { - "assetId": { - "guid": "{FF25E0FE-B695-5084-AE1E-65F095AA5C3F}" - }, - "assetHint": "objects/cloth/environment/cloth_locked_edge.azmaterial" - } - } - } - ] - } - }, - "materialSlots": [ - { - "id": { - "materialAssetId": { - "guid": "{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}", - "subId": 902256226 - } - }, - "materialAsset": { - "assetId": { - "guid": "{FF25E0FE-B695-5084-AE1E-65F095AA5C3F}" - }, - "assetHint": "objects/cloth/environment/cloth_locked_edge.azmaterial" - } - } - ], - "materialSlotsByLod": [ - [ - { - "id": { - "lodIndex": 0, - "materialAssetId": { - "guid": "{9DCAD62C-7A35-5D7D-8276-870D646CD5E2}", - "subId": 902256226 - } - } - } - ] - ] + "Parent Entity": "ContainerEntity" }, "Component_[5652509070289279796]": { "$type": "EditorOnlyEntityComponent", @@ -215,8 +220,7 @@ "$type": "EditorEntitySortComponent", "Id": 9694796263300215788 } - }, - "IsDependencyReady": true + } } } } \ No newline at end of file diff --git a/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice b/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice index e7de286c1b..c2c97dec7a 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/Chicken_Actor.slice @@ -24,7 +24,7 @@ - + @@ -33,19 +33,20 @@ - + + - + + - @@ -143,7 +144,7 @@ - + @@ -152,19 +153,20 @@ - + + - + + - @@ -246,7 +248,14 @@ - + + + + + + + + @@ -316,12 +325,9 @@ - + - - - - + @@ -329,12 +335,9 @@ - + - - - - + @@ -342,12 +345,9 @@ - + - - - - + @@ -360,94 +360,66 @@ - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + @@ -459,7 +431,7 @@ - + @@ -510,6 +482,7 @@ + diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice index 8d7605318e..40fb2894d3 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds.slice @@ -24,7 +24,7 @@ - + @@ -33,14 +33,15 @@ - + + - + @@ -69,7 +70,7 @@ - + @@ -137,7 +138,7 @@ - + @@ -200,24 +201,36 @@ - + - + + + + + + + + + + + + + - + @@ -225,12 +238,9 @@ - + - - - - + @@ -243,46 +253,34 @@ - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice index ff955f260e..909b3e582c 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_blinds_broken.slice @@ -24,7 +24,7 @@ - + @@ -33,14 +33,15 @@ - + + - + @@ -69,7 +70,7 @@ - + @@ -137,7 +138,7 @@ - + @@ -200,24 +201,36 @@ - + - + + + + + + + + + + + + + - + @@ -225,12 +238,9 @@ - + - - - - + @@ -243,46 +253,34 @@ - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice index d0bcd1296a..25e742550c 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_four.slice @@ -24,7 +24,7 @@ - + @@ -33,14 +33,15 @@ - + + - + @@ -69,7 +70,7 @@ - + @@ -137,7 +138,7 @@ - + @@ -200,24 +201,36 @@ - + - + + + + + + + + + + + + + - + @@ -225,12 +238,9 @@ - + - - - - + @@ -243,46 +253,34 @@ - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice index 8e07a65147..26c6290859 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_corners_two.slice @@ -24,7 +24,7 @@ - + @@ -33,14 +33,15 @@ - + + - + @@ -69,7 +70,7 @@ - + @@ -137,7 +138,7 @@ - + @@ -200,24 +201,36 @@ - + - + + + + + + + + + + + + + - + @@ -225,12 +238,9 @@ - + - - - - + @@ -243,46 +253,34 @@ - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + diff --git a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice index a80058d820..cee4fabe49 100644 --- a/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice +++ b/Gems/NvCloth/Assets/slices/Cloth/cloth_locked_edge.slice @@ -24,7 +24,7 @@ - + @@ -33,14 +33,15 @@ - + + - + @@ -69,7 +70,7 @@ - + @@ -137,7 +138,7 @@ - + @@ -200,24 +201,36 @@ - + - + + + + + + + + + + + + + - + @@ -225,12 +238,9 @@ - + - - - - + @@ -243,46 +253,34 @@ - - + + - - - - + - - + - - + + - - - - + - - + - - + + - - - - + - - + From 95f3477831d607ef920b2a3c55d036062692500c Mon Sep 17 00:00:00 2001 From: evanchia-ly-sdets <80914607+evanchia-ly-sdets@users.noreply.github.com> Date: Thu, 2 Sep 2021 03:08:37 -0700 Subject: [PATCH 091/355] Moving physics test from sandbox to main (#3858) Signed-off-by: evanchia --- .../Gem/PythonTests/physics/TestSuite_Main.py | 5 +++++ .../Gem/PythonTests/physics/TestSuite_Sandbox.py | 8 -------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py index de4828e36a..c3f41b158f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py @@ -84,3 +84,8 @@ class TestAutomation(TestAutomationBase): def test_C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(self, request, workspace, editor, launcher_platform): from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module self._run_test(request, workspace, editor, test_module) + + @revert_physics_config + def test_C15425929_Undo_Redo(self, request, workspace, editor, launcher_platform): + from .general import C15425929_Undo_Redo as test_module + self._run_test(request, workspace, editor, test_module) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py index 0346df2ebd..1d26e2e40c 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py @@ -43,11 +43,3 @@ class TestAutomation(TestAutomationBase): # Fixme: unexpected_lines.append(f"GroupName: {group}") # Fixme: expected_lines=["GroupName: "] self._run_test(request, workspace, editor, test_module) - - ## Seems to be flaky, need to investigate - @pytest.mark.xfail( - reason="Editor crashes and errors about files accessed by multiple processes appear in the log.") - @revert_physics_config - def test_C15425929_Undo_Redo(self, request, workspace, editor, launcher_platform): - from .general import C15425929_Undo_Redo as test_module - self._run_test(request, workspace, editor, test_module) From 34dc8e3cbc273130a8544f56b016b811054519cc Mon Sep 17 00:00:00 2001 From: moraaar Date: Thu, 2 Sep 2021 13:15:14 +0100 Subject: [PATCH 092/355] Fixed unused variable warnings (#3880) - Fixed error in iOS profile non-unity build error: unused variable 'INVALID_OFFSET'. The global variable is static const only visible to the cpp, removed since it's not used. - Fixed error in windows release 'timeoutSeconds': unreferenced formal parameter Signed-off-by: moraaar --- Code/Framework/AzCore/AzCore/Debug/Trace.cpp | 2 +- Gems/Atom/RHI/Metal/Code/Source/RHI/Conversions.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp index 87f6def0d2..429986b724 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp @@ -154,7 +154,7 @@ namespace AZ } bool - Trace::WaitForDebugger(float timeoutSeconds/*=-1.f*/) + Trace::WaitForDebugger([[maybe_unused]] float timeoutSeconds/*=-1.f*/) { #if defined(AZ_ENABLE_DEBUG_TOOLS) using AZStd::chrono::system_clock; diff --git a/Gems/Atom/RHI/Metal/Code/Source/RHI/Conversions.cpp b/Gems/Atom/RHI/Metal/Code/Source/RHI/Conversions.cpp index fce4db364f..96e61be2cd 100644 --- a/Gems/Atom/RHI/Metal/Code/Source/RHI/Conversions.cpp +++ b/Gems/Atom/RHI/Metal/Code/Source/RHI/Conversions.cpp @@ -17,8 +17,6 @@ namespace AZ { namespace Metal { - static const int INVALID_OFFSET = 0xFFFFFFFF; - namespace Platform { MTLPixelFormat ConvertPixelFormat(RHI::Format format); From d57770293588ff21be39a1406a0db6d8cc8021d4 Mon Sep 17 00:00:00 2001 From: cgalvan Date: Thu, 2 Sep 2021 09:39:15 -0500 Subject: [PATCH 093/355] Updated legacy Editor and Asset Processor icons on Mac to O3DE icons. Signed-off-by: cgalvan --- .../Mac/Images.xcassets/AppIcon.appiconset/Contents.json | 6 +++--- .../Mac/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png | 3 --- .../Mac/Images.xcassets/AppIcon.appiconset/icon_128.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png | 3 +++ .../Mac/Images.xcassets/AppIcon.appiconset/icon_16.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png | 3 --- .../Mac/Images.xcassets/AppIcon.appiconset/icon_256.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png | 3 +++ .../Mac/Images.xcassets/AppIcon.appiconset/icon_32.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_512.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png | 4 ++-- .../Images.xcassets/EditorAppIcon.appiconset/Contents.json | 6 +++--- .../EditorAppIcon.appiconset/icon_128 _2x.png | 3 --- .../Images.xcassets/EditorAppIcon.appiconset/icon_128.png | 4 ++-- .../EditorAppIcon.appiconset/icon_128_2x.png | 3 +++ .../Images.xcassets/EditorAppIcon.appiconset/icon_16.png | 4 ++-- .../Images.xcassets/EditorAppIcon.appiconset/icon_16_2x.png | 4 ++-- .../EditorAppIcon.appiconset/icon_256 _2x.png | 3 --- .../Images.xcassets/EditorAppIcon.appiconset/icon_256.png | 4 ++-- .../EditorAppIcon.appiconset/icon_256_2x.png | 3 +++ .../Images.xcassets/EditorAppIcon.appiconset/icon_32.png | 4 ++-- .../Images.xcassets/EditorAppIcon.appiconset/icon_32_2x.png | 4 ++-- .../Images.xcassets/EditorAppIcon.appiconset/icon_512.png | 4 ++-- .../EditorAppIcon.appiconset/icon_512_2x.png | 4 ++-- .../Mac/Images.xcassets/AppIcon.appiconset/Contents.json | 2 +- .../Mac/Images.xcassets/AppIcon.appiconset/icon_256x256.png | 3 +++ .../Mac/Images.xcassets/AppIcon.appiconset/icon_512x512.png | 3 --- .../AssetProcessorAppIcon.appiconset/Contents.json | 2 +- .../AssetProcessorAppIcon.appiconset/icon_256x256.png | 3 +++ .../AssetProcessorAppIcon.appiconset/icon_512x512.png | 3 --- 32 files changed, 58 insertions(+), 58 deletions(-) delete mode 100644 Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png create mode 100644 Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png delete mode 100644 Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png create mode 100644 Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png delete mode 100644 Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128 _2x.png create mode 100644 Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128_2x.png delete mode 100644 Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256 _2x.png create mode 100644 Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256_2x.png create mode 100644 Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256x256.png delete mode 100644 Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512x512.png create mode 100644 Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_256x256.png delete mode 100644 Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_512x512.png diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json index 603aec57a5..2b63c0ee15 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json @@ -33,7 +33,7 @@ { "size" : "128x128", "idiom" : "mac", - "filename" : "icon_128 _2x.png", + "filename" : "icon_128_2x.png", "scale" : "2x" }, { @@ -45,7 +45,7 @@ { "size" : "256x256", "idiom" : "mac", - "filename" : "icon_256 _2x.png", + "filename" : "icon_256_2x.png", "scale" : "2x" }, { @@ -65,4 +65,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png deleted file mode 100644 index 5970ea34ba..0000000000 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128 _2x.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2 -size 32037 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png index 9e30e09547..192a862967 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f41a37d2347a617e93bd97adaf6d4c161c471ca3ef7e04b98c65ddda52396dc -size 27833 +oid sha256:94cb43469dfb05d348845883914ac6d5936e851c93ae6e76d16efea90cdc27da +size 5980 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png new file mode 100644 index 0000000000..192a862967 --- /dev/null +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_128_2x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94cb43469dfb05d348845883914ac6d5936e851c93ae6e76d16efea90cdc27da +size 5980 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png index aeb29abd0a..9780d8a7af 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b07984494059bf827bc485cbea06d12e0283811face1a18799495f9ba7ae8af1 -size 20779 +oid sha256:cc6a4cf056f9814a23a4f74ea0aa9cd3628a03c2349bef73c64edfed75788cb7 +size 644 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png index 445a389d61..9780d8a7af 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_16_2x.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926 -size 21857 +oid sha256:cc6a4cf056f9814a23a4f74ea0aa9cd3628a03c2349bef73c64edfed75788cb7 +size 644 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png deleted file mode 100644 index 0904cf7ce8..0000000000 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256 _2x.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07631f41b8dea80713d2463f81a713a9a93798975b6fb50afbeeb13d26c57fa2 -size 48899 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png index 5970ea34ba..0b53991930 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2 -size 32037 +oid sha256:f0e52fba265079da19fb72aefe1cb0a4b9f8075e10341084fffb38a1b0850cd6 +size 12600 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png new file mode 100644 index 0000000000..0b53991930 --- /dev/null +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256_2x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0e52fba265079da19fb72aefe1cb0a4b9f8075e10341084fffb38a1b0850cd6 +size 12600 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png index 445a389d61..1d8cdef173 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926 -size 21857 +oid sha256:53abfa6e6b4d3eff79851a2a95c762223bc610a6646e3370fd1113c57cc8e0e6 +size 1295 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png index 1fad9bda96..1d8cdef173 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_32_2x.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad83faf98b49f4e37112baedeae726f4f8d71bcdd1961d9cdad31f043f8ca666 -size 24003 +oid sha256:53abfa6e6b4d3eff79851a2a95c762223bc610a6646e3370fd1113c57cc8e0e6 +size 1295 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png index e1517dddb6..464f10910b 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:68529a6c11d5ffa7ecd9d5bbb11ceea28e6852bd45946b525af09602c9a1e1bf -size 48899 +oid sha256:f778e4aa9577faca2609343d435da745dc6f342ea7a726573441cecc870bf542 +size 19204 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png index b425cb685f..464f10910b 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512_2x.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a70003840b418848b2ce6c18ed7cbbfcd6fcf76598a6601dca8b98d9b6c1a2f -size 114706 +oid sha256:f778e4aa9577faca2609343d435da745dc6f342ea7a726573441cecc870bf542 +size 19204 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json index 603aec57a5..2b63c0ee15 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/Contents.json @@ -33,7 +33,7 @@ { "size" : "128x128", "idiom" : "mac", - "filename" : "icon_128 _2x.png", + "filename" : "icon_128_2x.png", "scale" : "2x" }, { @@ -45,7 +45,7 @@ { "size" : "256x256", "idiom" : "mac", - "filename" : "icon_256 _2x.png", + "filename" : "icon_256_2x.png", "scale" : "2x" }, { @@ -65,4 +65,4 @@ "version" : 1, "author" : "xcode" } -} +} \ No newline at end of file diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128 _2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128 _2x.png deleted file mode 100644 index 5970ea34ba..0000000000 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128 _2x.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2 -size 32037 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128.png index 9e30e09547..192a862967 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9f41a37d2347a617e93bd97adaf6d4c161c471ca3ef7e04b98c65ddda52396dc -size 27833 +oid sha256:94cb43469dfb05d348845883914ac6d5936e851c93ae6e76d16efea90cdc27da +size 5980 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128_2x.png new file mode 100644 index 0000000000..192a862967 --- /dev/null +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_128_2x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94cb43469dfb05d348845883914ac6d5936e851c93ae6e76d16efea90cdc27da +size 5980 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16.png index aeb29abd0a..9780d8a7af 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b07984494059bf827bc485cbea06d12e0283811face1a18799495f9ba7ae8af1 -size 20779 +oid sha256:cc6a4cf056f9814a23a4f74ea0aa9cd3628a03c2349bef73c64edfed75788cb7 +size 644 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16_2x.png index 445a389d61..9780d8a7af 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16_2x.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_16_2x.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926 -size 21857 +oid sha256:cc6a4cf056f9814a23a4f74ea0aa9cd3628a03c2349bef73c64edfed75788cb7 +size 644 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256 _2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256 _2x.png deleted file mode 100644 index 0904cf7ce8..0000000000 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256 _2x.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07631f41b8dea80713d2463f81a713a9a93798975b6fb50afbeeb13d26c57fa2 -size 48899 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256.png index 5970ea34ba..0b53991930 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e38257b6917cdf5d73e90e6009f10c8736d62b20c4e785085305075c7e6320e2 -size 32037 +oid sha256:f0e52fba265079da19fb72aefe1cb0a4b9f8075e10341084fffb38a1b0850cd6 +size 12600 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256_2x.png new file mode 100644 index 0000000000..0b53991930 --- /dev/null +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_256_2x.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0e52fba265079da19fb72aefe1cb0a4b9f8075e10341084fffb38a1b0850cd6 +size 12600 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32.png index 445a389d61..1d8cdef173 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e645142d284de40aafb7a4a858f3df92b6a5ba9b03fa5f1a2d3cb25211597926 -size 21857 +oid sha256:53abfa6e6b4d3eff79851a2a95c762223bc610a6646e3370fd1113c57cc8e0e6 +size 1295 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32_2x.png index 1fad9bda96..1d8cdef173 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32_2x.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_32_2x.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad83faf98b49f4e37112baedeae726f4f8d71bcdd1961d9cdad31f043f8ca666 -size 24003 +oid sha256:53abfa6e6b4d3eff79851a2a95c762223bc610a6646e3370fd1113c57cc8e0e6 +size 1295 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512.png index e1517dddb6..464f10910b 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:68529a6c11d5ffa7ecd9d5bbb11ceea28e6852bd45946b525af09602c9a1e1bf -size 48899 +oid sha256:f778e4aa9577faca2609343d435da745dc6f342ea7a726573441cecc870bf542 +size 19204 diff --git a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512_2x.png b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512_2x.png index b425cb685f..464f10910b 100644 --- a/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512_2x.png +++ b/Code/Editor/Platform/Mac/Images.xcassets/EditorAppIcon.appiconset/icon_512_2x.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8a70003840b418848b2ce6c18ed7cbbfcd6fcf76598a6601dca8b98d9b6c1a2f -size 114706 +oid sha256:f778e4aa9577faca2609343d435da745dc6f342ea7a726573441cecc870bf542 +size 19204 diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json index 2c6bbd2282..52b242ba4a 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/Contents.json @@ -33,6 +33,7 @@ { "idiom" : "mac", "size" : "256x256", + "filename" : "icon_256x256.png", "scale" : "1x" }, { @@ -43,7 +44,6 @@ { "size" : "512x512", "idiom" : "mac", - "filename" : "icon_512x512.png", "scale" : "1x" }, { diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256x256.png b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256x256.png new file mode 100644 index 0000000000..50610c7ff4 --- /dev/null +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_256x256.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f16c891aaa1686a3735fe84c7a69c3cef24e68af7baa86bf2f54ab4d51b71e8 +size 8489 diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512x512.png b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512x512.png deleted file mode 100644 index 99123c81ee..0000000000 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AppIcon.appiconset/icon_512x512.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a396a13d3bc7ca074cdc6fdd072ba18c2e359bd24408783809b6c90adf23e22a -size 21937 diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json index 2c6bbd2282..52b242ba4a 100644 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/Contents.json @@ -33,6 +33,7 @@ { "idiom" : "mac", "size" : "256x256", + "filename" : "icon_256x256.png", "scale" : "1x" }, { @@ -43,7 +44,6 @@ { "size" : "512x512", "idiom" : "mac", - "filename" : "icon_512x512.png", "scale" : "1x" }, { diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_256x256.png b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_256x256.png new file mode 100644 index 0000000000..50610c7ff4 --- /dev/null +++ b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_256x256.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f16c891aaa1686a3735fe84c7a69c3cef24e68af7baa86bf2f54ab4d51b71e8 +size 8489 diff --git a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_512x512.png b/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_512x512.png deleted file mode 100644 index 99123c81ee..0000000000 --- a/Code/Tools/AssetProcessor/Platform/Mac/Images.xcassets/AssetProcessorAppIcon.appiconset/icon_512x512.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a396a13d3bc7ca074cdc6fdd072ba18c2e359bd24408783809b6c90adf23e22a -size 21937 From 188f54fee0b84c9eb55eee657c76d85e2facdafd Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Thu, 2 Sep 2021 08:56:29 -0700 Subject: [PATCH 094/355] Fixes Ninja non-multi config generator and potentially other non-multi config generators (#3867) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/LYWrappers.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake/LYWrappers.cmake b/cmake/LYWrappers.cmake index 53895c300f..8e5633b5e6 100644 --- a/cmake/LYWrappers.cmake +++ b/cmake/LYWrappers.cmake @@ -330,9 +330,12 @@ function(ly_add_target) set(runtime_dependencies_list SHARED MODULE EXECUTABLE APPLICATION) if(NOT ly_add_target_IMPORTED AND linking_options IN_LIST runtime_dependencies_list) + get_property(is_multi_config_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) # XCode generator doesnt support different source files per configuration, so we cannot have # the runtime dependencies using file-tracking, instead, we will have them as a post build step - if(CMAKE_GENERATOR MATCHES Xcode) + # Non-multi config generators like Ninja (not "Ninja Multi-Config"), Makefiles, etc have trouble to + # produce file-level dependencies per configuration, so we also default to use a post build step + if(NOT is_multi_config_generator OR CMAKE_GENERATOR MATCHES Xcode) add_custom_command(TARGET ${ly_add_target_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${ly_add_target_NAME}.cmake From 567c0ae24da62a8605bac9ddbe8eafa88db1da16 Mon Sep 17 00:00:00 2001 From: Artur K <96597+nemerle@users.noreply.github.com> Date: Thu, 2 Sep 2021 21:55:09 +0200 Subject: [PATCH 095/355] Modernization + AZStd::function compare fix. (#3680) * Modernization + small fix. Modernize ( `bool`/`override`/other) code in AzCore, AzFramework, AzQtComponents, AzToolsFramework, etc. Replaced a `bind` or two, use `using` in a few places as well. Fix nullptr comparison of AZStd::function. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Apply review-based changes Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> --- .../AzCore/AzCore/Asset/AssetCommon.cpp | 2 +- .../AzCore/AzCore/Asset/AssetManager.cpp | 6 +- .../AzCore/Component/ComponentApplication.cpp | 9 +- .../AzCore/AzCore/Compression/compression.cpp | 26 +- .../AzCore/Debug/LocalFileEventLogger.cpp | 8 +- Code/Framework/AzCore/AzCore/Debug/Trace.cpp | 2 +- Code/Framework/AzCore/AzCore/Debug/Trace.h | 10 +- .../AzCore/AzCore/Driller/Driller.cpp | 10 +- .../AzCore/AzCore/Driller/Stream.cpp | 14 +- .../AzCore/AzCore/IO/CompressorZLib.cpp | 30 +-- .../Framework/AzCore/AzCore/IO/SystemFile.cpp | 2 +- .../AzCore/AzCore/IPC/SharedMemory.cpp | 10 +- .../Jobs/Internal/JobManagerWorkStealing.cpp | 16 +- Code/Framework/AzCore/AzCore/Jobs/Job.cpp | 4 +- Code/Framework/AzCore/AzCore/Math/Uuid.cpp | 4 +- .../AzCore/Memory/AllocationRecords.cpp | 2 +- .../AzCore/AzCore/Memory/AllocatorManager.cpp | 22 +- .../Memory/BestFitExternalMapAllocator.cpp | 12 +- .../Memory/BestFitExternalMapSchema.cpp | 16 +- .../AzCore/AzCore/Memory/HeapSchema.cpp | 16 +- .../AzCore/AzCore/Memory/HphaSchema.cpp | 64 ++--- .../AzCore/AzCore/Memory/MemoryDriller.cpp | 10 +- .../AzCore/AzCore/Memory/OSAllocator.cpp | 2 +- .../Memory/OverrunDetectionAllocator.cpp | 10 +- .../AzCore/AzCore/Memory/PoolSchema.cpp | 56 ++--- .../AzCore/AzCore/Memory/SystemAllocator.cpp | 8 +- .../AzCore/AzCore/Module/Environment.cpp | 2 +- .../NativeUI/NativeUISystemComponent.cpp | 6 + .../AzCore/AzCore/RTTI/BehaviorContext.cpp | 20 +- .../AzCore/AzCore/RTTI/BehaviorContext.h | 114 ++++----- .../AzCore/AzCore/Script/ScriptContext.cpp | 8 +- .../AzCore/Script/ScriptContextDebug.cpp | 32 +-- .../Serialization/SerializationUtils.cpp | 2 +- .../AzCore/Serialization/SerializeContext.cpp | 64 ++--- .../AzCore/Serialization/SerializeContext.h | 20 +- .../Settings/SettingsRegistryMergeUtils.cpp | 8 +- Code/Framework/AzCore/AzCore/State/HSM.cpp | 2 +- Code/Framework/AzCore/AzCore/State/HSM.h | 9 +- .../UserSettings/UserSettingsProvider.cpp | 10 +- .../AzCore/std/function/function_base.h | 2 +- .../AzCore/std/function/function_template.h | 8 +- .../AzCore/AzCore/std/string/regex.cpp | 4 +- .../Module/DynamicModuleHandle_UnixLike.cpp | 2 +- .../AzCore/Tests/AZStd/Allocators.cpp | 26 +- Code/Framework/AzCore/Tests/AZStd/Atomics.cpp | 12 +- Code/Framework/AzCore/Tests/AZStd/Bitset.cpp | 4 +- .../AzCore/Tests/AZStd/FunctorsBind.cpp | 28 +-- .../Framework/AzCore/Tests/AZStd/Parallel.cpp | 30 +-- .../Framework/AzCore/Tests/AZStd/SmartPtr.cpp | 238 +++++++++--------- Code/Framework/AzCore/Tests/AZStd/String.cpp | 8 +- .../AzCore/Tests/AZStd/VectorAndArray.cpp | 2 +- .../Tests/Asset/AssetManagerLoadingTests.cpp | 6 +- .../Asset/AssetManagerStreamingTests.cpp | 2 +- Code/Framework/AzCore/Tests/EventTests.cpp | 4 +- .../AzCore/Tests/IO/Path/PathTests.cpp | 4 +- Code/Framework/AzCore/Tests/Jobs.cpp | 14 +- .../Tests/Math/Matrix3x4PerformanceTests.cpp | 2 +- Code/Framework/AzCore/Tests/Memory.cpp | 12 +- .../AzCore/Tests/Memory/HphaSchema.cpp | 4 +- .../Tests/Name/NameJsonSerializerTests.cpp | 4 +- .../AzCore/Tests/OrderedEventBenchmarks.cpp | 4 +- Code/Framework/AzCore/Tests/Script.cpp | 8 +- Code/Framework/AzCore/Tests/Serialization.cpp | 8 +- .../Json/ArraySerializerTests.cpp | 4 +- .../Serialization/Json/MapSerializerTests.cpp | 2 +- .../Json/StringSerializerTests.cpp | 4 +- .../SettingsRegistryConsoleUtilsTests.cpp | 4 +- Code/Framework/AzCore/Tests/Statistics.cpp | 2 +- .../AzCore/Tests/Streamer/BlockCacheTests.cpp | 32 +-- Code/Framework/AzCore/Tests/StringFunc.cpp | 2 +- .../AzFramework/Archive/Archive.cpp | 6 +- .../AzFramework/IO/FileOperations.cpp | 12 +- .../AzFramework/Input/Devices/InputDevice.cpp | 2 +- .../AzFramework/Logging/LoggingComponent.cpp | 2 +- .../AzFramework/Physics/Material.cpp | 10 +- .../Script/ScriptRemoteDebugging.cpp | 22 +- .../TargetManagementComponent.cpp | 8 +- .../Application/Application_Linux.cpp | 2 +- .../Process/ProcessCommunicator_Linux.cpp | 2 +- .../Process/ProcessWatcher_Linux.cpp | 6 +- .../AzFramework/Tests/ArchiveTests.cpp | 2 +- .../AzFramework/Tests/BehaviorEntityTests.cpp | 4 +- .../AzFramework/Tests/BinToTextEncode.cpp | 2 +- .../AzFramework/Tests/EntityContext.cpp | 2 +- Code/Framework/AzFramework/Tests/FileIO.cpp | 4 +- .../AzFramework/Tests/NativeWindow.cpp | 6 +- .../DirectManipulatorViewportInteraction.cpp | 2 +- .../Utilities/EncryptionCommon.cpp | 2 +- .../Tests/TcpTransport/TcpTransportTests.cpp | 8 +- .../Tests/UdpTransport/UdpTransportTests.cpp | 8 +- .../AzQtComponents/Components/DockTabBar.cpp | 4 +- .../AzQtComponents/Components/FlowLayout.cpp | 4 +- .../Components/StyledSpinBox.cpp | 4 +- .../Components/Widgets/LineEdit.cpp | 2 +- .../Components/Widgets/ScrollBar.cpp | 2 +- .../Components/Widgets/TabWidget.cpp | 2 +- .../PropertyEditorStandalone/main.cpp | 2 +- .../Tests/AzQtComponentTests.cpp | 2 +- Code/Framework/AzTest/AzTest/Utils.cpp | 4 +- .../Application/ToolsApplication.cpp | 4 +- .../AzToolsFramework/Asset/AssetUtils.cpp | 2 +- .../AssetEditor/AssetEditorWidget.cpp | 2 +- .../Commands/PreemptiveUndoCache.cpp | 2 +- .../Commands/SelectionCommand.cpp | 2 +- .../Prefab/PrefabSystemComponent.cpp | 2 +- .../SourceControl/PerforceComponent.cpp | 2 +- .../ToolsComponents/ScriptEditorComponent.cpp | 28 +-- .../Core/EditorFrameworkAPI.cpp | 8 +- .../Core/EditorFrameworkApplication.cpp | 6 +- .../UI/LegacyFramework/UIFramework.cpp | 22 +- .../UIFrameworkPreferences.cpp | 6 +- .../UI/Logging/LogPanel_Panel.cpp | 10 +- .../UI/Logging/StyledLogPanel.cpp | 2 +- .../PropertyEditor/InstanceDataHierarchy.cpp | 10 +- .../UI/PropertyEditor/PropertyAssetCtrl.cpp | 4 +- .../UI/PropertyEditor/PropertyCRCCtrl.cpp | 2 +- .../PropertyManagerComponent.cpp | 2 +- .../ReflectedPropertyEditor.cpp | 12 +- .../UI/SearchWidget/SearchCriteriaWidget.cpp | 8 +- .../UI/UICore/QTreeViewStateSaver.cpp | 4 +- .../Tests/AssetSeedManager.cpp | 2 +- .../Tests/ComponentAddRemove.cpp | 2 +- .../EditorEntitySearchComponentTests.cpp | 4 +- .../Tests/EntityIdQLabelTests.cpp | 2 +- .../Tests/EntityInspectorTests.cpp | 6 +- .../AzToolsFramework/Tests/FileFunc.cpp | 2 +- .../Tests/InstanceDataHierarchy.cpp | 42 ++-- .../Tests/PropertyTreeEditorTests.cpp | 4 +- .../Tests/SQLiteConnectionTests.cpp | 2 +- .../Tests/Script/ScriptEntityTests.cpp | 2 +- .../AzToolsFramework/Tests/Slice.cpp | 2 +- .../AzToolsFramework/Tests/UndoStack.cpp | 2 +- .../Tests/Viewport/ViewportUiDisplayTests.cpp | 4 +- .../Tests/Viewport/ViewportUiManagerTests.cpp | 6 +- .../GridMate/GridMate/Carrier/Carrier.cpp | 88 +++---- .../Carrier/DefaultTrafficControl.cpp | 6 +- .../GridMate/Carrier/SocketDriver.cpp | 8 +- .../Carrier/StreamSecureSocketDriver.cpp | 2 +- Code/Framework/GridMate/GridMate/GridMate.cpp | 2 +- .../GridMate/GridMate/Replica/Replica.cpp | 2 +- .../GridMate/GridMate/Replica/ReplicaMgr.cpp | 4 +- .../GridMate/GridMate/Session/LANSession.cpp | 22 +- .../GridMate/GridMate/Session/Session.cpp | 18 +- Code/Framework/GridMate/Tests/Carrier.cpp | 2 +- .../Tests/CarrierStreamSocketDriverTests.cpp | 2 +- .../GridMate/Tests/ReplicaBehavior.cpp | 16 +- .../GridMate/Tests/ReplicaMedium.cpp | 6 +- .../Framework/GridMate/Tests/ReplicaSmall.cpp | 4 +- Code/Framework/GridMate/Tests/Session.cpp | 12 +- Code/Framework/GridMate/Tests/test_Main.cpp | 4 +- 150 files changed, 865 insertions(+), 847 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp index 0c197e5354..af3aba49a3 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp @@ -456,7 +456,7 @@ namespace AZ { if (loadBehavior & (1 << thisFlag)) { - returnFlags[thisFlag] = 1; + returnFlags[thisFlag] = true; } } return returnFlags; diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp index 3df751fb02..6ba69cffd5 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp @@ -71,8 +71,8 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// // EBusTraits overrides static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; - typedef AssetId BusIdType; - typedef AZStd::recursive_mutex MutexType; + using BusIdType = AssetId; + using MutexType = AZStd::recursive_mutex; template struct AssetJobConnectionPolicy @@ -107,7 +107,7 @@ namespace AZ virtual void OnLoadCanceled(AssetId assetId) = 0; }; - typedef EBus BlockingAssetLoadBus; + using BlockingAssetLoadBus = EBus; /* * This class processes async AssetDatabase load jobs diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp index eda08401a2..c76156c006 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp @@ -644,7 +644,7 @@ namespace AZ NameDictionary::Create(); // Call this and child class's reflects - ReflectionEnvironment::GetReflectionManager()->Reflect(azrtti_typeid(this), AZStd::bind(&ComponentApplication::Reflect, this, AZStd::placeholders::_1)); + ReflectionEnvironment::GetReflectionManager()->Reflect(azrtti_typeid(this), [this](ReflectContext* context) {Reflect(context); }); RegisterCoreComponents(); TickBus::AllowFunctionQueuing(true); @@ -970,7 +970,12 @@ namespace AZ { if (ReflectionEnvironment::GetReflectionManager()) { - ReflectionEnvironment::GetReflectionManager()->Reflect(descriptor->GetUuid(), AZStd::bind(&ComponentDescriptor::Reflect, descriptor, AZStd::placeholders::_1)); + ReflectionEnvironment::GetReflectionManager()->Reflect( + descriptor->GetUuid(), + [descriptor](ReflectContext* context) + { + descriptor->Reflect(context); + }); } } diff --git a/Code/Framework/AzCore/AzCore/Compression/compression.cpp b/Code/Framework/AzCore/AzCore/Compression/compression.cpp index 60351b0f7c..8b6f270b00 100644 --- a/Code/Framework/AzCore/AzCore/Compression/compression.cpp +++ b/Code/Framework/AzCore/AzCore/Compression/compression.cpp @@ -23,8 +23,8 @@ using namespace AZ; // [3/21/2011] //========================================================================= ZLib::ZLib(IAllocator* workMemAllocator) - : m_strDeflate(NULL) - , m_strInflate(NULL) + : m_strDeflate(nullptr) + , m_strInflate(nullptr) { m_workMemoryAllocator = workMemAllocator ? workMemAllocator->GetAllocationSource() : nullptr; if (!m_workMemoryAllocator) @@ -75,7 +75,7 @@ void ZLib::FreeMem(void* userData, void* address) //========================================================================= void ZLib::StartCompressor(unsigned int compressionLevel) { - AZ_Assert(m_strDeflate == NULL, "Compressor already started!"); + AZ_Assert(m_strDeflate == nullptr, "Compressor already started!"); m_strDeflate = reinterpret_cast< z_stream* >(AllocateMem(m_workMemoryAllocator, 1, sizeof(z_stream))); m_strDeflate->zalloc = &ZLib::AllocateMem; m_strDeflate->zfree = &ZLib::FreeMem; @@ -91,10 +91,10 @@ void ZLib::StartCompressor(unsigned int compressionLevel) //========================================================================= void ZLib::StopCompressor() { - AZ_Assert(m_strDeflate != NULL, "Compressor not started!"); + AZ_Assert(m_strDeflate != nullptr, "Compressor not started!"); deflateEnd(m_strDeflate); FreeMem(m_workMemoryAllocator, m_strDeflate); - m_strDeflate = NULL; + m_strDeflate = nullptr; } //========================================================================= @@ -103,7 +103,7 @@ void ZLib::StopCompressor() //========================================================================= void ZLib::ResetCompressor() { - AZ_Assert(m_strDeflate != NULL, "Compressor not started!"); + AZ_Assert(m_strDeflate != nullptr, "Compressor not started!"); int r = deflateReset(m_strDeflate); (void)r; AZ_Assert(r == Z_OK, "ZLib inconsistent state - deflateReset() failed !!!\n"); @@ -115,7 +115,7 @@ void ZLib::ResetCompressor() //========================================================================= unsigned int ZLib::Compress(const void* data, unsigned int& dataSize, void* compressedData, unsigned int compressedDataSize, FlushType flushType) { - AZ_Assert(m_strDeflate != NULL, "Compressor not started!"); + AZ_Assert(m_strDeflate != nullptr, "Compressor not started!"); m_strDeflate->avail_in = dataSize; m_strDeflate->next_in = (unsigned char*)data; m_strDeflate->avail_out = compressedDataSize; @@ -158,7 +158,7 @@ unsigned int ZLib::Compress(const void* data, unsigned int& dataSize, void* comp //========================================================================= unsigned int ZLib::GetMinCompressedBufferSize(unsigned int sourceDataSize) { - AZ_Assert(m_strDeflate != NULL, "Compressor not started!"); + AZ_Assert(m_strDeflate != nullptr, "Compressor not started!"); return static_cast(deflateBound(m_strDeflate, sourceDataSize)); } @@ -168,7 +168,7 @@ unsigned int ZLib::GetMinCompressedBufferSize(unsigned int sourceDataSize) //========================================================================= void ZLib::StartDecompressor(Header* header) { - AZ_Assert(m_strInflate == NULL, "Decompressor already started!"); + AZ_Assert(m_strInflate == nullptr, "Decompressor already started!"); m_strInflate = reinterpret_cast< z_stream* >(AllocateMem(m_workMemoryAllocator, 1, sizeof(z_stream))); m_strInflate->zalloc = &ZLib::AllocateMem; m_strInflate->zfree = &ZLib::FreeMem; @@ -188,10 +188,10 @@ void ZLib::StartDecompressor(Header* header) //========================================================================= void ZLib::StopDecompressor() { - AZ_Assert(m_strInflate != NULL, "Decompressor not started!"); + AZ_Assert(m_strInflate != nullptr, "Decompressor not started!"); inflateEnd(m_strInflate); FreeMem(m_workMemoryAllocator, m_strInflate); - m_strInflate = NULL; + m_strInflate = nullptr; } //========================================================================= @@ -200,7 +200,7 @@ void ZLib::StopDecompressor() //========================================================================= void ZLib::ResetDecompressor(Header* header) { - AZ_Assert(m_strInflate != NULL, "Decompressor not started!"); + AZ_Assert(m_strInflate != nullptr, "Decompressor not started!"); int r = inflateReset(m_strInflate); (void)r; AZ_Assert(r == Z_OK, "ZLib inconsistent state - inflateReset() failed !!!\n"); @@ -229,7 +229,7 @@ void ZLib::SetupDecompressHeader(Header header) //========================================================================= unsigned int ZLib::Decompress(const void* compressedData, unsigned int compressedDataSize, void* data, unsigned int& dataSize, FlushType flushType) { - AZ_Assert(m_strInflate != NULL, "Decompressor not started!"); + AZ_Assert(m_strInflate != nullptr, "Decompressor not started!"); m_strInflate->avail_in = compressedDataSize; m_strInflate->next_in = (unsigned char*)compressedData; m_strInflate->avail_out = dataSize; diff --git a/Code/Framework/AzCore/AzCore/Debug/LocalFileEventLogger.cpp b/Code/Framework/AzCore/AzCore/Debug/LocalFileEventLogger.cpp index 049ac2e8a1..0009ec83b3 100644 --- a/Code/Framework/AzCore/AzCore/Debug/LocalFileEventLogger.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/LocalFileEventLogger.cpp @@ -242,7 +242,9 @@ namespace AZ::Debug ThreadData* threadData = threadStorage.m_data; // Set to nullptr so other threads doing a flush can't pick this up. - while (!threadStorage.m_data.compare_exchange_strong(threadData, nullptr)); + while (!threadStorage.m_data.compare_exchange_strong(threadData, nullptr)) + { + } uint32_t writeSize = AZ_SIZE_ALIGN_UP(sizeof(EventHeader) + size, EventBoundary); if (threadData->m_usedBytes + writeSize >= ThreadData::BufferSize) @@ -270,7 +272,9 @@ namespace AZ::Debug // swap the pending data to commit the event ThreadStorage& threadStorage = GetThreadStorage(); ThreadData* expectedData = nullptr; - while (!threadStorage.m_data.compare_exchange_strong(expectedData, threadStorage.m_pendingData)); + while (!threadStorage.m_data.compare_exchange_strong(expectedData, threadStorage.m_pendingData)) + { + } threadStorage.m_pendingData = nullptr; } diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp index 429986b724..14504cc282 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.cpp +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.cpp @@ -218,7 +218,7 @@ namespace AZ void Debug::Trace::Crash() { - int* p = 0; + int* p = nullptr; *p = 1; } diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.h b/Code/Framework/AzCore/AzCore/Debug/Trace.h index b00a1cd921..26c331e1e4 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.h +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.h @@ -19,7 +19,7 @@ namespace AZ { void OutputToDebugger(const char* window, const char* message); } - + /// Global instance to the tracer. extern class Trace g_tracer; @@ -41,7 +41,7 @@ namespace AZ static void Destroy(); static int GetAssertVerbosityLevel(); static void SetAssertVerbosityLevel(int level); - + /** * Returns the default string used for a system window. * It can be useful for Trace message handlers to easily validate if the window they received is the fallback window used by this class, @@ -109,7 +109,7 @@ namespace AZ * Correct usage: * AZ_Assert(false, "Fail always"); */ - + namespace AZ { namespace TraceInternal @@ -121,7 +121,7 @@ namespace AZ static constexpr ExpressionValidResult value = ExpressionValidResult::Valid; }; template<> - struct ExpressionIsValid + struct ExpressionIsValid { static constexpr ExpressionValidResult value = ExpressionValidResult::Valid; }; @@ -228,7 +228,7 @@ namespace AZ { \ AZ::Debug::Trace::Instance().Printf(window, __VA_ARGS__); \ } - + //! The AZ_TrancePrintfOnce macro output the result of the format string only once for each use of the macro //! It does not take into account the result of the format string to determine whether to output the string or not diff --git a/Code/Framework/AzCore/AzCore/Driller/Driller.cpp b/Code/Framework/AzCore/AzCore/Driller/Driller.cpp index 84f0fe3158..41abd7793e 100644 --- a/Code/Framework/AzCore/AzCore/Driller/Driller.cpp +++ b/Code/Framework/AzCore/AzCore/Driller/Driller.cpp @@ -208,7 +208,7 @@ namespace AZ { if (drillerList.empty()) { - return NULL; + return nullptr; } m_sessions.push_back(); @@ -246,21 +246,21 @@ namespace AZ AZStd::lock_guard lock(DrillerEBusMutex::GetMutex()); ///< Make sure no driller is writing to the stream for (DrillerListType::const_iterator iDriller = drillerList.begin(); iDriller != drillerList.end(); ++iDriller) { - Driller* driller = NULL; + Driller* driller = nullptr; const DrillerInfo& di = *iDriller; for (size_t iDesc = 0; iDesc < m_drillers.size(); ++iDesc) { if (m_drillers[iDesc]->GetId() == di.id) { driller = m_drillers[iDesc]; - AZ_Assert(driller->m_output == NULL, "Driller with id %08x is already have an output stream %p (currently we support only 1 at a time)", di.id, driller->m_output); + AZ_Assert(driller->m_output == nullptr, "Driller with id %08x is already have an output stream %p (currently we support only 1 at a time)", di.id, driller->m_output); driller->m_output = &output; driller->Start(di.params.data(), static_cast(di.params.size())); s.drillers.push_back(driller); break; } } - AZ_Warning("Driller", driller != NULL, "We can't start a driller with id %d!", di.id); + AZ_Warning("Driller", driller != nullptr, "We can't start a driller with id %d!", di.id); } } return &s; @@ -293,7 +293,7 @@ namespace AZ for (size_t i = 0; i < s.drillers.size(); ++i) { s.drillers[i]->Stop(); - s.drillers[i]->m_output = NULL; + s.drillers[i]->m_output = nullptr; } } s.output->EndTag(AZ_CRC("Frame", 0xb5f83ccd)); diff --git a/Code/Framework/AzCore/AzCore/Driller/Stream.cpp b/Code/Framework/AzCore/AzCore/Driller/Stream.cpp index f43e337bb8..761f964561 100644 --- a/Code/Framework/AzCore/AzCore/Driller/Stream.cpp +++ b/Code/Framework/AzCore/AzCore/Driller/Stream.cpp @@ -677,7 +677,7 @@ namespace AZ AZStd::endian_swap(crc32); } stringPtr = m_stringPool->Find(crc32); - AZ_Assert(stringPtr != NULL, "Failed to find string with id 0x%08x in the string pool, proper stream read is impossible!", crc32); + AZ_Assert(stringPtr != nullptr, "Failed to find string with id 0x%08x in the string pool, proper stream read is impossible!", crc32); stringLength = static_cast(strlen(stringPtr)); } else if (m_isPooledString) @@ -710,7 +710,7 @@ namespace AZ //========================================================================= const DrillerDOMParser::Node* DrillerDOMParser::Node::GetTag(u32 tagName) const { - const Node* tagNode = NULL; + const Node* tagNode = nullptr; for (Node::NodeListType::const_iterator i = m_tags.begin(); i != m_tags.end(); ++i) { if ((*i).m_name == tagName) @@ -728,7 +728,7 @@ namespace AZ //========================================================================= const DrillerDOMParser::Data* DrillerDOMParser::Node::GetData(u32 dataName) const { - const Data* dataNode = NULL; + const Data* dataNode = nullptr; for (Node::DataListType::const_iterator i = m_data.begin(); i != m_data.end(); ++i) { if (i->m_name == dataName) @@ -749,7 +749,7 @@ namespace AZ , m_isPersistentInputData(isPersistentInputData) { m_root.m_name = 0; - m_root.m_parent = NULL; + m_root.m_parent = nullptr; m_topNode = &m_root; } static int g_numFree = 0; @@ -850,14 +850,14 @@ namespace AZ return; } - DrillerHandlerParser* childHandler = NULL; + DrillerHandlerParser* childHandler = nullptr; DrillerHandlerParser* currentHandler = m_stack.back(); if (isOpen) { - if (currentHandler != NULL) + if (currentHandler != nullptr) { childHandler = currentHandler->OnEnterTag(name); - AZ_Warning("Driller", !currentHandler->IsWarnOnUnsupportedTags() || childHandler != NULL, "Could not find handler for tag 0x%08x", name); + AZ_Warning("Driller", !currentHandler->IsWarnOnUnsupportedTags() || childHandler != nullptr, "Could not find handler for tag 0x%08x", name); } m_stack.push_back(childHandler); } diff --git a/Code/Framework/AzCore/AzCore/IO/CompressorZLib.cpp b/Code/Framework/AzCore/AzCore/IO/CompressorZLib.cpp index a61cdb1133..f973c0e95a 100644 --- a/Code/Framework/AzCore/AzCore/IO/CompressorZLib.cpp +++ b/Code/Framework/AzCore/AzCore/IO/CompressorZLib.cpp @@ -22,10 +22,10 @@ namespace AZ // [12/13/2012] //========================================================================= CompressorZLib::CompressorZLib(unsigned int decompressionCachePerStream, unsigned int dataBufferSize) - : m_lastReadStream(NULL) + : m_lastReadStream(nullptr) , m_lastReadStreamOffset(0) , m_lastReadStreamSize(0) - , m_compressedDataBuffer(NULL) + , m_compressedDataBuffer(nullptr) , m_compressedDataBufferSize(dataBufferSize) , m_compressedDataBufferUseCount(0) , m_decompressionCachePerStream(decompressionCachePerStream) @@ -63,7 +63,7 @@ namespace AZ //========================================================================= bool CompressorZLib::ReadHeaderAndData(CompressorStream* stream, AZ::u8* data, unsigned int dataSize) { - if (stream->GetCompressorData() != NULL) // we already have compressor data + if (stream->GetCompressorData() != nullptr) // we already have compressor data { return false; } @@ -347,7 +347,7 @@ namespace AZ AZ_Assert(stream && stream->GetCompressorData(), "This stream doesn't have compression enabled! Call Stream::WriteCompressed after you create the file!"); AZ_Assert(offset == SizeType(-1) || offset == stream->GetCurPos(), "We can write compressed data only at the end of the stream!"); - m_lastReadStream = NULL; // invalidate last read position, otherwise m_dataBuffer will be corrupted (as we are about to write in it). + m_lastReadStream = nullptr; // invalidate last read position, otherwise m_dataBuffer will be corrupted (as we are about to write in it). CompressorZLibData* zlibData = static_cast(stream->GetCompressorData()); AZ_Assert(!zlibData->m_zlib.IsDecompressorStarted(), "You can't write while reading/decompressing a compressed stream!"); @@ -398,13 +398,13 @@ namespace AZ AZ_Assert(stream && stream->GetCompressorData(), "This stream doesn't have compression enabled! Call Stream::WriteCompressed after you create the file!"); CompressorZLibData* zlibData = static_cast(stream->GetCompressorData()); - m_lastReadStream = NULL; // invalidate last read position, otherwise m_dataBuffer will be corrupted (as we are about to write in it). + m_lastReadStream = nullptr; // invalidate last read position, otherwise m_dataBuffer will be corrupted (as we are about to write in it). unsigned int compressedSize; unsigned int dataToCompress = 0; do { - compressedSize = zlibData->m_zlib.Compress(NULL, dataToCompress, m_compressedDataBuffer, m_compressedDataBufferSize, ZLib::FT_FULL_FLUSH); + compressedSize = zlibData->m_zlib.Compress(nullptr, dataToCompress, m_compressedDataBuffer, m_compressedDataBufferSize, ZLib::FT_FULL_FLUSH); if (compressedSize) { GenericStream* baseStream = stream->GetWrappedStream(); @@ -429,7 +429,7 @@ namespace AZ //========================================================================= bool CompressorZLib::StartCompressor(CompressorStream* stream, int compressionLevel, SizeType autoSeekDataSize) { - AZ_Assert(stream && stream->GetCompressorData() == NULL, "Stream has compressor already enabled!"); + AZ_Assert(stream && stream->GetCompressorData() == nullptr, "Stream has compressor already enabled!"); AcquireDataBuffer(); @@ -470,14 +470,14 @@ namespace AZ bool result = true; if (zlibData->m_zlib.IsCompressorStarted()) { - m_lastReadStream = NULL; // invalidate last read position, otherwise m_dataBuffer will be corrupted (as we are about to write in it). + m_lastReadStream = nullptr; // invalidate last read position, otherwise m_dataBuffer will be corrupted (as we are about to write in it). // flush all compressed data unsigned int compressedSize; unsigned int dataToCompress = 0; do { - compressedSize = zlibData->m_zlib.Compress(NULL, dataToCompress, m_compressedDataBuffer, m_compressedDataBufferSize, ZLib::FT_FINISH); + compressedSize = zlibData->m_zlib.Compress(nullptr, dataToCompress, m_compressedDataBuffer, m_compressedDataBufferSize, ZLib::FT_FINISH); if (compressedSize) { baseStream->Write(compressedSize, m_compressedDataBuffer); @@ -502,7 +502,7 @@ namespace AZ { if (m_lastReadStream == stream) { - m_lastReadStream = NULL; // invalidate the data in m_dataBuffer if it was from the current stream. + m_lastReadStream = nullptr; // invalidate the data in m_dataBuffer if it was from the current stream. } } @@ -525,11 +525,11 @@ namespace AZ //========================================================================= void CompressorZLib::AcquireDataBuffer() { - if (m_compressedDataBuffer == NULL) + if (m_compressedDataBuffer == nullptr) { AZ_Assert(m_compressedDataBufferUseCount == 0, "Buffer usecount should be 0 if the buffer is NULL"); m_compressedDataBuffer = reinterpret_cast(azmalloc(m_compressedDataBufferSize, m_CompressedDataBufferAlignment, AZ::SystemAllocator, "CompressorZLib")); - m_lastReadStream = NULL; // reset the cache info in the m_dataBuffer + m_lastReadStream = nullptr; // reset the cache info in the m_dataBuffer } ++m_compressedDataBufferUseCount; } @@ -543,10 +543,10 @@ namespace AZ --m_compressedDataBufferUseCount; if (m_compressedDataBufferUseCount == 0) { - AZ_Assert(m_compressedDataBuffer != NULL, "Invalid data buffer! We should have a non null pointer!"); + AZ_Assert(m_compressedDataBuffer != nullptr, "Invalid data buffer! We should have a non null pointer!"); azfree(m_compressedDataBuffer, AZ::SystemAllocator, m_compressedDataBufferSize, m_CompressedDataBufferAlignment); - m_compressedDataBuffer = NULL; - m_lastReadStream = NULL; // reset the cache info in the m_dataBuffer + m_compressedDataBuffer = nullptr; + m_lastReadStream = nullptr; // reset the cache info in the m_dataBuffer } } } // namespace IO diff --git a/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp b/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp index 8de8b6b70f..5bff79b422 100644 --- a/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp +++ b/Code/Framework/AzCore/AzCore/IO/SystemFile.cpp @@ -127,7 +127,7 @@ bool SystemFile::Open(const char* fileName, int mode, int platformFlags) bool SystemFile::ReOpen(int mode, int platformFlags) { AZ_Assert(!m_fileName.empty(), "Missing filename. You must call open first!"); - return Open(0, mode, platformFlags); + return Open(nullptr, mode, platformFlags); } void SystemFile::Close() diff --git a/Code/Framework/AzCore/AzCore/IPC/SharedMemory.cpp b/Code/Framework/AzCore/AzCore/IPC/SharedMemory.cpp index 37c88e34fc..af73ab4936 100644 --- a/Code/Framework/AzCore/AzCore/IPC/SharedMemory.cpp +++ b/Code/Framework/AzCore/AzCore/IPC/SharedMemory.cpp @@ -125,7 +125,7 @@ SharedMemory::Close() bool SharedMemory::Map(AccessMode mode, unsigned int size) { - AZ_Assert(m_mappedBase == NULL, "We already have data mapped"); + AZ_Assert(m_mappedBase == nullptr, "We already have data mapped"); AZ_Assert(Platform::IsMapHandleValid(), "You must call Map() first!"); bool result = Platform::Map(mode, size); @@ -232,7 +232,7 @@ bool SharedMemory::CheckMappedBaseValid() // [4/29/2011] //========================================================================= SharedMemoryRingBuffer::SharedMemoryRingBuffer() - : m_info(NULL) + : m_info(nullptr) {} //========================================================================= @@ -279,7 +279,7 @@ SharedMemoryRingBuffer::Map(AccessMode mode, unsigned int size) bool SharedMemoryRingBuffer::UnMap() { - m_info = NULL; + m_info = nullptr; return SharedMemory::UnMap(); } @@ -291,7 +291,7 @@ bool SharedMemoryRingBuffer::Write(const void* data, unsigned int dataSize) { AZ_Warning("AZSystem", !Platform::IsWaitFailed(), "You are writing the ring buffer %s while the Global lock is NOT locked! This can lead to data corruption!", m_name); - AZ_Assert(m_info != NULL, "You need to Create and Map the buffer first!"); + AZ_Assert(m_info != nullptr, "You need to Create and Map the buffer first!"); if (m_info->m_writeOffset >= m_info->m_readOffset) { unsigned int freeSpace = m_dataSize - (m_info->m_writeOffset - m_info->m_readOffset); @@ -346,7 +346,7 @@ SharedMemoryRingBuffer::Read(void* data, unsigned int maxDataSize) return 0; } - AZ_Assert(m_info != NULL, "You need to Create and Map the buffer first!"); + AZ_Assert(m_info != nullptr, "You need to Create and Map the buffer first!"); unsigned int dataRead; if (m_info->m_writeOffset > m_info->m_readOffset) { diff --git a/Code/Framework/AzCore/AzCore/Jobs/Internal/JobManagerWorkStealing.cpp b/Code/Framework/AzCore/AzCore/Jobs/Internal/JobManagerWorkStealing.cpp index 73fb4ecfe8..f76946a667 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/Internal/JobManagerWorkStealing.cpp +++ b/Code/Framework/AzCore/AzCore/Jobs/Internal/JobManagerWorkStealing.cpp @@ -192,15 +192,15 @@ void JobManagerWorkStealing::SuspendJobUntilReady(Job* job) ThreadInfo* info = GetCurrentOrCreateThreadInfo(); AZ_Assert(info->m_currentJob == job, ("Can't suspend a job which isn't currently running")); - info->m_currentJob = NULL; //clear current job + info->m_currentJob = nullptr; //clear current job if (IsAsynchronous()) { - ProcessJobsAssist(info, job, NULL); + ProcessJobsAssist(info, job, nullptr); } else { - ProcessJobsSynchronous(info, job, NULL); + ProcessJobsSynchronous(info, job, nullptr); } info->m_currentJob = job; //restore current job @@ -223,11 +223,11 @@ void JobManagerWorkStealing::StartJobAndAssistUntilComplete(Job* job) //the processing functions will return when the empty job dependent count has reached 1 if (IsAsynchronous()) { - ProcessJobsAssist(info, NULL, ¬ifyFlag); + ProcessJobsAssist(info, nullptr, ¬ifyFlag); } else { - ProcessJobsSynchronous(info, NULL, ¬ifyFlag); + ProcessJobsSynchronous(info, nullptr, ¬ifyFlag); } AZ_Assert(!m_currentThreadInfo, ""); @@ -306,9 +306,9 @@ void JobManagerWorkStealing::ProcessJobsWorker(ThreadInfo* info) //setup thread-local storage m_currentThreadInfo = info; - ProcessJobsInternal(info, NULL, NULL); + ProcessJobsInternal(info, nullptr, nullptr); - m_currentThreadInfo = NULL; + m_currentThreadInfo = nullptr; } void JobManagerWorkStealing::ProcessJobsAssist(ThreadInfo* info, Job* suspendedJob, AZStd::atomic* notifyFlag) @@ -529,7 +529,7 @@ void JobManagerWorkStealing::ProcessJobsSynchronous(ThreadInfo* info, Job* suspe info->m_currentJob = job; Process(job); - info->m_currentJob = NULL; + info->m_currentJob = nullptr; //...after calling Process we cannot use the job pointer again, the job has completed and may not exist anymore #ifdef JOBMANAGER_ENABLE_STATS diff --git a/Code/Framework/AzCore/AzCore/Jobs/Job.cpp b/Code/Framework/AzCore/AzCore/Jobs/Job.cpp index d3a2a77d92..8462cf47e8 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/Job.cpp +++ b/Code/Framework/AzCore/AzCore/Jobs/Job.cpp @@ -36,7 +36,7 @@ namespace AZ } countAndFlags |= (unsigned int)((priority << FLAG_PRIORITY_START_BIT) & FLAG_PRIORITY_MASK); SetDependentCountAndFlags(countAndFlags); - StoreDependent(NULL); + StoreDependent(nullptr); #ifdef AZ_DEBUG_JOB_STATE SetState(STATE_SETUP); @@ -66,7 +66,7 @@ namespace AZ SetDependentCountAndFlags(countAndFlags); if (isClearDependent) { - StoreDependent(NULL); + StoreDependent(nullptr); } else { diff --git a/Code/Framework/AzCore/AzCore/Math/Uuid.cpp b/Code/Framework/AzCore/AzCore/Math/Uuid.cpp index 6e71ffc3bd..d875e28a1e 100644 --- a/Code/Framework/AzCore/AzCore/Math/Uuid.cpp +++ b/Code/Framework/AzCore/AzCore/Math/Uuid.cpp @@ -56,7 +56,7 @@ namespace AZ Uuid Uuid::CreateStringSkipWarnings(const char* string, size_t stringLength, [[maybe_unused]] bool skipWarnings) { - if (string == NULL) + if (string == nullptr) { return Uuid::CreateNull(); } @@ -71,7 +71,7 @@ namespace AZ if (len < 32 || len > 38) { - AZ_Warning("Math", skipWarnings, "Invalid UUID format %s (must be) {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (or without dashes and braces)", string != NULL ? string : "null"); + AZ_Warning("Math", skipWarnings, "Invalid UUID format %s (must be) {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (or without dashes and braces)", string != nullptr ? string : "null"); return Uuid::CreateNull(); } diff --git a/Code/Framework/AzCore/AzCore/Memory/AllocationRecords.cpp b/Code/Framework/AzCore/AzCore/Memory/AllocationRecords.cpp index 7d644c6917..b55b2db768 100644 --- a/Code/Framework/AzCore/AzCore/Memory/AllocationRecords.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/AllocationRecords.cpp @@ -169,7 +169,7 @@ AllocationRecords::RegisterAllocation(void* address, size_t byteSize, size_t ali ai.m_timeStamp = AZStd::GetTimeNowMicroSecond(); // if we don't have a fileName,lineNum record the stack or if the user requested it. - if ((fileName == 0 && m_mode == RECORD_STACK_IF_NO_FILE_LINE) || m_mode == RECORD_FULL) + if ((fileName == nullptr && m_mode == RECORD_STACK_IF_NO_FILE_LINE) || m_mode == RECORD_FULL) { ai.m_stackFrames = m_numStackLevels ? reinterpret_cast(m_records.get_allocator().allocate(sizeof(AZ::Debug::StackFrame)*m_numStackLevels, 1)) : nullptr; if (ai.m_stackFrames) diff --git a/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.cpp b/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.cpp index b34a88669c..3c09b4cae6 100644 --- a/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/AllocatorManager.cpp @@ -39,9 +39,9 @@ namespace AZ return AZStd::hash{}(key); } }; - typedef AZStd::basic_string, AZStdIAllocator> AMString; - typedef AZStd::unordered_map, AZStdIAllocator> AllocatorNameMap; - typedef AZStd::unordered_map, AZStdIAllocator> AllocatorRemappings; + using AMString = AZStd::basic_string, AZStdIAllocator>; + using AllocatorNameMap = AZStd::unordered_map, AZStdIAllocator>; + using AllocatorRemappings = AZStd::unordered_map, AZStdIAllocator>; // For allocators that are created before we have an environment, we keep some module-local data for them so that we can register them // properly once the environment is attached. @@ -403,7 +403,7 @@ AllocatorManager::AddOutOfMemoryListener(const OutOfMemoryCBType& cb) void AllocatorManager::RemoveOutOfMemoryListener() { - m_outOfMemoryListener = 0; + m_outOfMemoryListener = nullptr; } //========================================================================= @@ -660,13 +660,13 @@ void AllocatorManager::GetAllocatorStats(size_t& allocatedBytes, size_t& capacit //========================================================================= AllocatorManager::MemoryBreak::MemoryBreak() { - addressStart = NULL; - addressEnd = NULL; + addressStart = nullptr; + addressEnd = nullptr; byteSize = 0; alignment = static_cast(0xffffffff); - name = NULL; + name = nullptr; - fileName = NULL; + fileName = nullptr; lineNum = -1; } @@ -729,14 +729,14 @@ AllocatorManager::DebugBreak(void* address, const Debug::AllocationInfo& info) AZ_Assert(!(m_memoryBreak[i].alignment == info.m_alignment), "User triggered breakpoint - alignment (%d)", info.m_alignment); AZ_Assert(!(m_memoryBreak[i].byteSize == info.m_byteSize), "User triggered breakpoint - allocation size (%d)", info.m_byteSize); - AZ_Assert(!(info.m_name != NULL && m_memoryBreak[i].name != NULL && strcmp(m_memoryBreak[i].name, info.m_name) == 0), "User triggered breakpoint - name \"%s\"", info.m_name); + AZ_Assert(!(info.m_name != nullptr && m_memoryBreak[i].name != nullptr && strcmp(m_memoryBreak[i].name, info.m_name) == 0), "User triggered breakpoint - name \"%s\"", info.m_name); if (m_memoryBreak[i].lineNum != 0) { - AZ_Assert(!(info.m_fileName != NULL && m_memoryBreak[i].fileName != NULL && strcmp(m_memoryBreak[i].fileName, info.m_fileName) == 0 && m_memoryBreak[i].lineNum == info.m_lineNum), "User triggered breakpoint - file/line number : %s(%d)", info.m_fileName, info.m_lineNum); + AZ_Assert(!(info.m_fileName != nullptr && m_memoryBreak[i].fileName != nullptr && strcmp(m_memoryBreak[i].fileName, info.m_fileName) == 0 && m_memoryBreak[i].lineNum == info.m_lineNum), "User triggered breakpoint - file/line number : %s(%d)", info.m_fileName, info.m_lineNum); } else { - AZ_Assert(!(info.m_fileName != NULL && m_memoryBreak[i].fileName != NULL && strcmp(m_memoryBreak[i].fileName, info.m_fileName) == 0), "User triggered breakpoint - file name \"%s\"", info.m_fileName); + AZ_Assert(!(info.m_fileName != nullptr && m_memoryBreak[i].fileName != nullptr && strcmp(m_memoryBreak[i].fileName, info.m_fileName) == 0), "User triggered breakpoint - file name \"%s\"", info.m_fileName); } } } diff --git a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp index a9b0ec92c3..cf26c8f723 100644 --- a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp @@ -22,7 +22,7 @@ using namespace AZ; //========================================================================= BestFitExternalMapAllocator::BestFitExternalMapAllocator() : AllocatorBase(this, "BestFitExternalMapAllocator", "Best fit allocator with external tracking storage!") - , m_schema(NULL) + , m_schema(nullptr) {} //========================================================================= @@ -47,7 +47,7 @@ BestFitExternalMapAllocator::Create(const Descriptor& desc) schemaDesc.m_memoryBlockByteSize = desc.m_memoryBlockByteSize; m_schema = azcreate(BestFitExternalMapSchema, (schemaDesc), SystemAllocator); - if (m_schema == NULL) + if (m_schema == nullptr) { isReady = false; } @@ -63,7 +63,7 @@ void BestFitExternalMapAllocator::Destroy() { azdestroy(m_schema, SystemAllocator); - m_schema = NULL; + m_schema = nullptr; } AllocatorDebugConfig BestFitExternalMapAllocator::GetDebugConfig() @@ -89,7 +89,7 @@ BestFitExternalMapAllocator::Allocate(size_type byteSize, size_type alignment, i byteSize = MemorySizeAdjustedUp(byteSize); BestFitExternalMapAllocator::pointer_type address = m_schema->Allocate(byteSize, alignment, flags); - if (address == 0) + if (address == nullptr) { if (!OnOutOfMemory(byteSize, alignment, flags, name, fileName, lineNum)) { @@ -100,7 +100,7 @@ BestFitExternalMapAllocator::Allocate(size_type byteSize, size_type alignment, i } } - AZ_Assert(address != 0, "BestFitExternalMapAllocator: Failed to allocate %d bytes aligned on %d (flags: 0x%08x) %s : %s (%d)!", byteSize, alignment, flags, name ? name : "(no name)", fileName ? fileName : "(no file name)", lineNum); + AZ_Assert(address != nullptr, "BestFitExternalMapAllocator: Failed to allocate %d bytes aligned on %d (flags: 0x%08x) %s : %s (%d)!", byteSize, alignment, flags, name ? name : "(no name)", fileName ? fileName : "(no file name)", lineNum); AZ_MEMORY_PROFILE(ProfileAllocation(address, byteSize, alignment, name, fileName, lineNum, suppressStackRecord + 1)); return address; @@ -145,7 +145,7 @@ BestFitExternalMapAllocator::ReAllocate(pointer_type ptr, size_type newSize, siz (void)newSize; (void)newAlignment; AZ_Assert(false, "Not supported!"); - return NULL; + return nullptr; } //========================================================================= diff --git a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp index 1cd7f156d1..d94d1dfe35 100644 --- a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp @@ -18,15 +18,15 @@ using namespace AZ; BestFitExternalMapSchema::BestFitExternalMapSchema(const Descriptor& desc) : m_desc(desc) , m_used(0) - , m_freeChunksMap(FreeMapType::key_compare(), AZStdIAllocator(desc.m_mapAllocator != NULL ? desc.m_mapAllocator : &AllocatorInstance::Get())) - , m_allocChunksMap(AllocMapType::hasher(), AllocMapType::key_eq(), AZStdIAllocator(desc.m_mapAllocator != NULL ? desc.m_mapAllocator : &AllocatorInstance::Get())) + , m_freeChunksMap(FreeMapType::key_compare(), AZStdIAllocator(desc.m_mapAllocator != nullptr ? desc.m_mapAllocator : &AllocatorInstance::Get())) + , m_allocChunksMap(AllocMapType::hasher(), AllocMapType::key_eq(), AZStdIAllocator(desc.m_mapAllocator != nullptr ? desc.m_mapAllocator : &AllocatorInstance::Get())) { - if (m_desc.m_mapAllocator == NULL) + if (m_desc.m_mapAllocator == nullptr) { m_desc.m_mapAllocator = &AllocatorInstance::Get(); // used as our sub allocator } AZ_Assert(m_desc.m_memoryBlockByteSize > 0, "You must provide memory block size!"); - AZ_Assert(m_desc.m_memoryBlock != NULL, "You must provide memory block allocated as you with!"); + AZ_Assert(m_desc.m_memoryBlock != nullptr, "You must provide memory block allocated as you with!"); //if( m_desc.m_memoryBlock == NULL) there is no point to automate this cause we need to flag this memory special, otherwise there is no point to use this allocator at all // m_desc.m_memoryBlock = azmalloc(SystemAllocator,m_desc.m_memoryBlockByteSize,16); m_freeChunksMap.insert(AZStd::make_pair(m_desc.m_memoryBlockByteSize, reinterpret_cast(m_desc.m_memoryBlock))); @@ -40,13 +40,13 @@ BestFitExternalMapSchema::pointer_type BestFitExternalMapSchema::Allocate(size_type byteSize, size_type alignment, int flags) { (void)flags; - char* address = NULL; + char* address = nullptr; AZ_Assert(alignment > 0 && (alignment & (alignment - 1)) == 0, "Alignment must be >0 and power of 2!"); for (int i = 0; i < 2; ++i) // max 2 attempts to allocate { FreeMapType::iterator iter = m_freeChunksMap.find(byteSize); size_t blockSize = 0; - char* blockAddress = NULL; + char* blockAddress = nullptr; size_t preAllocBlockSize = 0; while (iter != m_freeChunksMap.end()) { @@ -64,7 +64,7 @@ BestFitExternalMapSchema::Allocate(size_type byteSize, size_type alignment, int } ++iter; } - if (address != NULL) + if (address != nullptr) { // split blocks if (preAllocBlockSize) // if we have a block before the alignment @@ -94,7 +94,7 @@ BestFitExternalMapSchema::Allocate(size_type byteSize, size_type alignment, int void BestFitExternalMapSchema::DeAllocate(pointer_type ptr) { - if (ptr == 0) + if (ptr == nullptr) { return; } diff --git a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp index 1c67a95d51..50e6a47630 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp @@ -107,17 +107,17 @@ namespace AZ m_used = 0; m_desc = desc; - m_subAllocator = 0; + m_subAllocator = nullptr; for (int i = 0; i < Descriptor::m_maxNumBlocks; ++i) { - m_memSpaces[i] = 0; + m_memSpaces[i] = nullptr; m_ownMemoryBlock[i] = false; } for (int i = 0; i < m_desc.m_numMemoryBlocks; ++i) { - if (m_desc.m_memoryBlocks[i] == 0) // Allocate memory block if requested! + if (m_desc.m_memoryBlocks[i] == nullptr) // Allocate memory block if requested! { AZ_Assert(AllocatorInstance::IsReady(), "You requested to allocate memory using the system allocator, but it's not created yet!"); m_subAllocator = &AllocatorInstance::Get(); @@ -152,7 +152,7 @@ namespace AZ if (m_memSpaces[i]) { AZDLMalloc::destroy_mspace(m_memSpaces[i]); - m_memSpaces[i] = 0; + m_memSpaces[i] = nullptr; if (m_ownMemoryBlock[i]) { @@ -172,7 +172,7 @@ namespace AZ AZ_UNUSED(lineNum); AZ_UNUSED(suppressStackRecord); int blockId = flags; - AZ_Assert(m_memSpaces[blockId]!=0, "Invalid block id!"); + AZ_Assert(m_memSpaces[blockId]!=nullptr, "Invalid block id!"); HeapSchema::pointer_type address = AZDLMalloc::mspace_memalign(m_memSpaces[blockId], alignment, byteSize); if (address) { @@ -186,7 +186,7 @@ namespace AZ { AZ_UNUSED(byteSize); AZ_UNUSED(alignment); - if (ptr==0) + if (ptr==nullptr) { return; } @@ -194,7 +194,7 @@ namespace AZ // if we use m_spaces just count the chunk sizes. m_used -= ChunckSize(ptr); #ifdef FOOTERS - AZDLMalloc::mspace_free(0, ptr); ///< We use footers so we know which memspace the pointer belongs to. + AZDLMalloc::mspace_free(nullptr, ptr); ///< We use footers so we know which memspace the pointer belongs to. #else int i = 0; for (; i < m_desc.m_numMemoryBlocks; ++i) @@ -248,7 +248,7 @@ namespace AZ HeapSchema::ChunckSize(pointer_type ptr) { // based on azmalloc_usable_size + the overhead - if (ptr != 0) + if (ptr != nullptr) { mchunkptr p = mem2chunk(ptr); //if (is_inuse(p)) // we can even skip this check since we track for double free and so on anyway diff --git a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp index 5b7ca194cf..f5df0dfe96 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp @@ -784,17 +784,17 @@ namespace AZ { // size == 0 acts as free void* realloc(void* ptr, size_t size) { - if (ptr == NULL) + if (ptr == nullptr) { return alloc(size); } if (size == 0) { free(ptr); - return NULL; + return nullptr; } debug_check(ptr); - void* newPtr = NULL; + void* newPtr = nullptr; if (ptr_in_bucket(ptr)) { if (is_small_allocation(size)) // no point to check m_isPoolAllocations as if it's false pointer can't be in a bucket. @@ -853,21 +853,21 @@ namespace AZ { { return realloc(ptr, size); } - if (ptr == NULL) + if (ptr == nullptr) { return alloc(size, alignment); } if (size == 0) { free(ptr); - return NULL; + return nullptr; } if ((size_t)ptr & (alignment - 1)) { void* newPtr = alloc(size, alignment); if (!newPtr) { - return NULL; + return nullptr; } size_t count = this->size(ptr); if (count > size) @@ -879,7 +879,7 @@ namespace AZ { return newPtr; } debug_check(ptr); - void* newPtr = NULL; + void* newPtr = nullptr; if (ptr_in_bucket(ptr)) { if (is_small_allocation(size) && alignment <= MAX_SMALL_ALLOCATION) // no point to check m_isPoolAllocations as if it was false, pointer can't be in a bucket @@ -931,7 +931,7 @@ namespace AZ { // returns the size of the resulting memory block inline size_t resize(void* ptr, size_t size) { - if (ptr == NULL) + if (ptr == nullptr) { return 0; } @@ -957,7 +957,7 @@ namespace AZ { // query the size of the memory block inline size_t size(void* ptr) const { - if (ptr == NULL) + if (ptr == nullptr) { return 0; } @@ -993,7 +993,7 @@ namespace AZ { // free the memory block inline void free(void* ptr) { - if (ptr == NULL) + if (ptr == nullptr) { return; } @@ -1009,7 +1009,7 @@ namespace AZ { // free the memory block supplying the original size with DEFAULT_ALIGNMENT inline void free(void* ptr, size_t origSize) { - if (ptr == NULL) + if (ptr == nullptr) { return; } @@ -1027,7 +1027,7 @@ namespace AZ { // free the memory block supplying the original size and alignment inline void free(void* ptr, size_t origSize, size_t oldAlignment) { - if (ptr == NULL) + if (ptr == nullptr) { return; } @@ -1134,10 +1134,10 @@ namespace AZ { // If m_systemChunkSize is specified, use that size for allocating tree blocks from the OS // m_treePageAlignment should be OS_VIRTUAL_PAGE_SIZE in all cases with this trait as we work // with virtual memory addresses when the tree grows and we cannot specify an alignment in all cases - : m_treePageSize(desc.m_fixedMemoryBlock != NULL ? desc.m_pageSize : + : m_treePageSize(desc.m_fixedMemoryBlock != nullptr ? desc.m_pageSize : desc.m_systemChunkSize != 0 ? desc.m_systemChunkSize : OS_VIRTUAL_PAGE_SIZE) , m_treePageAlignment(desc.m_pageSize) - , m_poolPageSize(desc.m_fixedMemoryBlock != NULL ? desc.m_poolPageSize : OS_VIRTUAL_PAGE_SIZE) + , m_poolPageSize(desc.m_fixedMemoryBlock != nullptr ? desc.m_poolPageSize : OS_VIRTUAL_PAGE_SIZE) , m_subAllocator(desc.m_subAllocator) { #ifdef DEBUG_ALLOCATOR @@ -1246,7 +1246,7 @@ namespace AZ { return p; } } - return NULL; + return nullptr; } const HpAllocator::page* HpAllocator::bucket::get_free_page() const @@ -1259,7 +1259,7 @@ namespace AZ { return p; } } - return NULL; + return nullptr; } void* HpAllocator::bucket::alloc(page* p) @@ -1359,7 +1359,7 @@ namespace AZ { p = bucket_grow(bsize, mBuckets[bi].marker()); if (!p) { - return NULL; + return nullptr; } mBuckets[bi].add_free_page(p); } @@ -1385,7 +1385,7 @@ namespace AZ { p = bucket_grow(bsize, mBuckets[bi].marker()); if (!p) { - return NULL; + return nullptr; } mBuckets[bi].add_free_page(p); } @@ -1406,7 +1406,7 @@ namespace AZ { void* newPtr = bucket_alloc(size); if (!newPtr) { - return NULL; + return nullptr; } memcpy(newPtr, ptr, AZStd::GetMin(elemSize - MEMORY_GUARD_SIZE, size - MEMORY_GUARD_SIZE)); bucket_free(ptr); @@ -1426,7 +1426,7 @@ namespace AZ { void* newPtr = bucket_alloc_direct(bucket_spacing_function(AZ::SizeAlignUp(size, alignment))); if (!newPtr) { - return NULL; + return nullptr; } memcpy(newPtr, ptr, AZStd::GetMin(elemSize - MEMORY_GUARD_SIZE, size - MEMORY_GUARD_SIZE)); bucket_free(ptr); @@ -1638,7 +1638,7 @@ namespace AZ { // create a dummy block to avoid prev() NULL checks and allow easy block shifts // potentially this dummy block might grow (due to shift_block) but not more than sizeof(free_node) block_header* front = (block_header*)mem; - front->prev(0); + front->prev(nullptr); front->size(0); front->set_used(); block_header* back = (block_header*)front->mem(); @@ -1777,7 +1777,7 @@ namespace AZ { newBl = tree_grow(size); if (!newBl) { - return NULL; + return nullptr; } } HPPA_ASSERT(!newBl->used()); @@ -1956,7 +1956,7 @@ namespace AZ { tree_free(ptr); return newPtr; } - return NULL; + return nullptr; } void* HpAllocator::tree_realloc_aligned(void* ptr, size_t size, size_t alignment) @@ -2044,7 +2044,7 @@ namespace AZ { tree_free(ptr); return newPtr; } - return NULL; + return nullptr; } size_t HpAllocator::tree_resize(void* ptr, size_t size) @@ -2121,7 +2121,7 @@ namespace AZ { HPPA_ASSERT(!bl->used()); HPPA_ASSERT(bl->prev() && bl->prev()->used()); HPPA_ASSERT(bl->next() && bl->next()->used()); - if (bl->prev()->prev() == NULL && bl->next()->size() == 0) + if (bl->prev()->prev() == nullptr && bl->next()->size() == 0) { tree_detach(bl); char* memStart = (char*)bl->prev(); @@ -2539,11 +2539,11 @@ namespace AZ { if (m_desc.m_fixedMemoryBlockByteSize > 0) { AZ_Assert((m_desc.m_fixedMemoryBlockByteSize & (m_desc.m_pageSize - 1)) == 0, "Memory block size %d MUST be multiples of the of the page size %d!", m_desc.m_fixedMemoryBlockByteSize, m_desc.m_pageSize); - if (m_desc.m_fixedMemoryBlock == NULL) + if (m_desc.m_fixedMemoryBlock == nullptr) { - AZ_Assert(m_desc.m_subAllocator != NULL, "Sub allocator must point to a valid allocator if m_fixedMemoryBlock is NOT allocated (NULL)!"); + AZ_Assert(m_desc.m_subAllocator != nullptr, "Sub allocator must point to a valid allocator if m_fixedMemoryBlock is NOT allocated (NULL)!"); m_desc.m_fixedMemoryBlock = m_desc.m_subAllocator->Allocate(m_desc.m_fixedMemoryBlockByteSize, m_desc.m_fixedMemoryBlockAlignment, 0, "HphaSchema", __FILE__, __LINE__, 1); - AZ_Assert(m_desc.m_fixedMemoryBlock != NULL, "Failed to allocate %d bytes!", m_desc.m_fixedMemoryBlockByteSize); + AZ_Assert(m_desc.m_fixedMemoryBlock != nullptr, "Failed to allocate %d bytes!", m_desc.m_fixedMemoryBlockByteSize); m_ownMemoryBlock = true; } AZ_Assert((reinterpret_cast(m_desc.m_fixedMemoryBlock) & static_cast(desc.m_fixedMemoryBlockAlignment - 1)) == 0, "Memory block must be page size (%d bytes) aligned!", desc.m_fixedMemoryBlockAlignment); @@ -2570,7 +2570,7 @@ namespace AZ { if (m_ownMemoryBlock) { m_desc.m_subAllocator->DeAllocate(m_desc.m_fixedMemoryBlock, m_desc.m_fixedMemoryBlockByteSize, m_desc.m_fixedMemoryBlockAlignment); - m_desc.m_fixedMemoryBlock = NULL; + m_desc.m_fixedMemoryBlock = nullptr; } } @@ -2587,7 +2587,7 @@ namespace AZ { (void)lineNum; (void)suppressStackRecord; pointer_type address = m_allocator->alloc(byteSize, alignment); - if (address == NULL) + if (address == nullptr) { GarbageCollect(); address = m_allocator->alloc(byteSize, alignment); @@ -2603,7 +2603,7 @@ namespace AZ { HphaSchema::ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) { pointer_type address = m_allocator->realloc(ptr, newSize, newAlignment); - if (address == NULL && newSize > 0) + if (address == nullptr && newSize > 0) { GarbageCollect(); address = m_allocator->realloc(ptr, newSize, newAlignment); @@ -2618,7 +2618,7 @@ namespace AZ { void HphaSchema::DeAllocate(pointer_type ptr, size_type size, size_type alignment) { - if (ptr == 0) + if (ptr == nullptr) { return; } diff --git a/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.cpp b/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.cpp index 934efeef1b..2ea25c3397 100644 --- a/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.cpp @@ -106,7 +106,7 @@ namespace AZ m_allAllocatorRecords.push_back(allocator->GetRecords()); - if (m_output == NULL) + if (m_output == nullptr) { return; // we have no active output } @@ -154,7 +154,7 @@ namespace AZ delete allocatorRecords; allocator->SetRecords(nullptr); - if (m_output == NULL) + if (m_output == nullptr) { return; // we have no active output } @@ -173,7 +173,7 @@ namespace AZ if (records) { const AllocationInfo* info = records->RegisterAllocation(address, byteSize, alignment, name, fileName, lineNum, stackSuppressCount + 1); - if (m_output == NULL) + if (m_output == nullptr) { return; // we have no active output } @@ -226,7 +226,7 @@ namespace AZ { records->UnregisterAllocation(address, byteSize, alignment, info); - if (m_output == NULL) + if (m_output == nullptr) { return; // we have no active output } @@ -261,7 +261,7 @@ namespace AZ { records->ResizeAllocation(address, newSize); - if (m_output == NULL) + if (m_output == nullptr) { return; // we have no active output } diff --git a/Code/Framework/AzCore/AzCore/Memory/OSAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/OSAllocator.cpp index 5637fcc646..317df214d6 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OSAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/OSAllocator.cpp @@ -75,7 +75,7 @@ namespace AZ address = AZ_OS_MALLOC(byteSize, alignment); } - if (address == 0 && byteSize > 0) + if (address == nullptr && byteSize > 0) { AZ_Printf("Memory", "======================================================\n"); AZ_Printf("Memory", "OSAllocator run out of system memory!\nWe can't track the debug allocator, since it's used for tracking and pipes trought the OS... here are the other allocator status:\n"); diff --git a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp index e59e304c54..35ad19dd9e 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp @@ -216,9 +216,9 @@ namespace AZ class OverrunDetectionSchemaImpl { public: - typedef void* pointer_type; - typedef size_t size_type; - typedef ptrdiff_t difference_type; + using pointer_type = void *; + using size_type = size_t; + using difference_type = ptrdiff_t; OverrunDetectionSchemaImpl(const OverrunDetectionSchema::Descriptor& desc); ~OverrunDetectionSchemaImpl(); @@ -241,8 +241,8 @@ namespace AZ Internal::AllocationRecord* CreateAllocationRecord(void* p, size_t size) const; private: - typedef AZStd::mutex mutex_type; - typedef AZStd::lock_guard lock_type; + using mutex_type = AZStd::mutex; + using lock_type = AZStd::lock_guard; AZStd::unique_ptr m_platformAllocator; mutex_type m_mutex; diff --git a/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp index b251774d77..3e71f530a0 100644 --- a/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp @@ -278,7 +278,7 @@ namespace AZ Page* page = reinterpret_cast(memBlock); if (!page->m_magic.Validate()) { - return NULL; + return nullptr; } return page; } @@ -403,7 +403,7 @@ PoolAllocation::Allocate(size_t byteSize, size_t alignment) u32 bucketIndex = static_cast((byteSize >> m_minAllocationShift)-1); BucketType& bucket = m_buckets[bucketIndex]; - PageType* page = 0; + PageType* page = nullptr; if (!bucket.m_pages.empty()) { page = &bucket.m_pages.front(); @@ -411,7 +411,7 @@ PoolAllocation::Allocate(size_t byteSize, size_t alignment) // check if we have free slot in the page if (page->m_freeList.empty()) { - page = 0; + page = nullptr; } else if (page->m_freeList.size()==1) { @@ -464,7 +464,7 @@ AZ_INLINE void PoolAllocation::DeAllocate(void* ptr) { PageType* page = m_allocator->PageFromAddress(ptr); - if (page==NULL) + if (page==nullptr) { AZ_Error("Memory", false, "Address 0x%08x is not in the ThreadPool!", ptr); return; @@ -503,7 +503,7 @@ PoolAllocation::DeAllocate(void* ptr) m_allocator->PushFreePage(page); } } - else if (frontPage->m_next != 0) + else if (frontPage->m_next != nullptr) { // if the next page has free slots free the current page if (frontPage->m_next->m_freeList.size() < maxElementsPerBucket) @@ -584,7 +584,7 @@ PoolAllocation::GarbageCollect(bool isForceFreeAllPages) // [9/15/2009] //========================================================================= PoolSchema::PoolSchema(const Descriptor& desc) - : m_impl(NULL) + : m_impl(nullptr) { (void)desc; // ignored here, applied in Create() } @@ -595,7 +595,7 @@ PoolSchema::PoolSchema(const Descriptor& desc) //========================================================================= PoolSchema::~PoolSchema() { - AZ_Assert(m_impl==NULL, "You did not destroy the pool schema!"); + AZ_Assert(m_impl==nullptr, "You did not destroy the pool schema!"); delete m_impl; } @@ -605,12 +605,12 @@ PoolSchema::~PoolSchema() //========================================================================= bool PoolSchema::Create(const Descriptor& desc) { - AZ_Assert(m_impl==NULL, "PoolSchema already created!"); - if (m_impl == NULL) + AZ_Assert(m_impl==nullptr, "PoolSchema already created!"); + if (m_impl == nullptr) { m_impl = aznew PoolSchemaImpl(desc); } - return (m_impl!=NULL); + return (m_impl!=nullptr); } //========================================================================= @@ -620,7 +620,7 @@ bool PoolSchema::Create(const Descriptor& desc) bool PoolSchema::Destroy() { delete m_impl; - m_impl = NULL; + m_impl = nullptr; return true; } @@ -751,7 +751,7 @@ PoolSchema::GetSubAllocator() PoolSchemaImpl::PoolSchemaImpl(const PoolSchema::Descriptor& desc) : m_pageAllocator(desc.m_pageAllocator ? desc.m_pageAllocator : &AllocatorInstance::Get()) , m_allocator(this, desc.m_pageSize, desc.m_minAllocationSize, desc.m_maxAllocationSize) - , m_staticDataBlock(0) + , m_staticDataBlock(nullptr) , m_numStaticPages(desc.m_numStaticPages) , m_isDynamic(desc.m_isDynamic) , m_pageSize(desc.m_pageSize) @@ -851,7 +851,7 @@ PoolSchemaImpl::AllocationSize(PoolSchema::pointer_type ptr) AZ_FORCE_INLINE PoolSchemaImpl::Page* PoolSchemaImpl::PopFreePage() { - Page* page = 0; + Page* page = nullptr; if (!m_freePages.empty()) { page = &m_freePages.front(); @@ -938,7 +938,7 @@ PoolSchemaImpl::Page::SetupFreeList(size_t elementSize, size_t pageDataBlockSize // [9/15/2009] //========================================================================= ThreadPoolSchema::ThreadPoolSchema(GetThreadPoolData getThreadPoolData, SetThreadPoolData setThreadPoolData) - : m_impl(NULL) + : m_impl(nullptr) , m_threadPoolGetter(getThreadPoolData) , m_threadPoolSetter(setThreadPoolData) { @@ -950,7 +950,7 @@ ThreadPoolSchema::ThreadPoolSchema(GetThreadPoolData getThreadPoolData, SetThrea //========================================================================= ThreadPoolSchema::~ThreadPoolSchema() { - AZ_Assert(m_impl==NULL, "You did not destroy the thread pool schema!"); + AZ_Assert(m_impl==nullptr, "You did not destroy the thread pool schema!"); delete m_impl; } @@ -960,12 +960,12 @@ ThreadPoolSchema::~ThreadPoolSchema() //========================================================================= bool ThreadPoolSchema::Create(const Descriptor& desc) { - AZ_Assert(m_impl==NULL, "PoolSchema already created!"); - if (m_impl == NULL) + AZ_Assert(m_impl==nullptr, "PoolSchema already created!"); + if (m_impl == nullptr) { m_impl = aznew ThreadPoolSchemaImpl(desc, m_threadPoolGetter, m_threadPoolSetter); } - return (m_impl!=NULL); + return (m_impl!=nullptr); } //========================================================================= @@ -975,7 +975,7 @@ bool ThreadPoolSchema::Create(const Descriptor& desc) bool ThreadPoolSchema::Destroy() { delete m_impl; - m_impl = NULL; + m_impl = nullptr; return true; } //========================================================================= @@ -1099,7 +1099,7 @@ ThreadPoolSchemaImpl::ThreadPoolSchemaImpl(const ThreadPoolSchema::Descriptor& d : m_threadPoolGetter(threadPoolGetter) , m_threadPoolSetter(threadPoolSetter) , m_pageAllocator(desc.m_pageAllocator) - , m_staticDataBlock(0) + , m_staticDataBlock(nullptr) , m_numStaticPages(desc.m_numStaticPages) , m_pageSize(desc.m_pageSize) , m_minAllocationSize(desc.m_minAllocationSize) @@ -1112,7 +1112,7 @@ ThreadPoolSchemaImpl::ThreadPoolSchemaImpl(const ThreadPoolSchema::Descriptor& d SetCriticalSectionSpinCount(m_mutex.native_handle(), 4000); # endif - if (m_pageAllocator == 0) + if (m_pageAllocator == nullptr) { m_pageAllocator = &AllocatorInstance::Get(); // use the SystemAllocator if no page allocator is provided } @@ -1211,7 +1211,7 @@ ThreadPoolSchemaImpl::Allocate(ThreadPoolSchema::size_type byteSize, ThreadPoolS { // deallocate elements if they were freed from other threads Page::FakeNodeLF* fakeLFNode; - while ((fakeLFNode = threadData->m_freedElements.pop())!=0) + while ((fakeLFNode = threadData->m_freedElements.pop())!=nullptr) { threadData->m_allocator.DeAllocate(fakeLFNode); } @@ -1228,12 +1228,12 @@ void ThreadPoolSchemaImpl::DeAllocate(ThreadPoolSchema::pointer_type ptr) { Page* page = PageFromAddress(ptr); - if (page==NULL) + if (page==nullptr) { AZ_Error("Memory", false, "Address 0x%08x is not in the ThreadPool!", ptr); return; } - AZ_Assert(page->m_threadData!=0, ("We must have valid page thread data for the page!")); + AZ_Assert(page->m_threadData!=nullptr, ("We must have valid page thread data for the page!")); ThreadPoolData* threadData = m_threadPoolGetter(); if (threadData == page->m_threadData) { @@ -1262,11 +1262,11 @@ ThreadPoolSchema::size_type ThreadPoolSchemaImpl::AllocationSize(ThreadPoolSchema::pointer_type ptr) { Page* page = PageFromAddress(ptr); - if (page==NULL) + if (page==nullptr) { return 0; } - AZ_Assert(page->m_threadData!=0, ("We must have valid page thread data for the page!")); + AZ_Assert(page->m_threadData!=nullptr, ("We must have valid page thread data for the page!")); return page->m_threadData->m_allocator.AllocationSize(ptr); } @@ -1282,7 +1282,7 @@ ThreadPoolSchemaImpl::PopFreePage() AZStd::lock_guard lock(m_mutex); if (m_freePages.empty()) { - page = NULL; + page = nullptr; } else { @@ -1387,7 +1387,7 @@ ThreadPoolData::~ThreadPoolData() { // deallocate elements if they were freed from other threads ThreadPoolSchemaImpl::Page::FakeNodeLF* fakeLFNode; - while ((fakeLFNode = m_freedElements.pop())!=0) + while ((fakeLFNode = m_freedElements.pop())!=nullptr) { m_allocator.DeAllocate(fakeLFNode); } diff --git a/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.cpp index 0fb64915dc..8c84338fd0 100644 --- a/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.cpp @@ -153,7 +153,7 @@ SystemAllocator::Create(const Descriptor& desc) #elif AZCORE_SYSTEM_ALLOCATOR == AZCORE_SYSTEM_ALLOCATOR_HEAP m_allocator = azcreate(HeapSchema, (heapDesc), SystemAllocator); #endif - if (m_allocator == NULL) + if (m_allocator == nullptr) { isReady = false; } @@ -237,7 +237,7 @@ SystemAllocator::Allocate(size_type byteSize, size_type alignment, int flags, co byteSize = MemorySizeAdjustedUp(byteSize); SystemAllocator::pointer_type address = m_allocator->Allocate(byteSize, alignment, flags, name, fileName, lineNum, suppressStackRecord + 1); - if (address == 0) + if (address == nullptr) { // Free all memory we can and try again! AllocatorManager::Instance().GarbageCollect(); @@ -245,7 +245,7 @@ SystemAllocator::Allocate(size_type byteSize, size_type alignment, int flags, co address = m_allocator->Allocate(byteSize, alignment, flags, name, fileName, lineNum, suppressStackRecord + 1); } - if (address == 0) + if (address == nullptr) { byteSize = MemorySizeAdjustedDown(byteSize); // restore original size @@ -258,7 +258,7 @@ SystemAllocator::Allocate(size_type byteSize, size_type alignment, int flags, co } } - AZ_Assert(address != 0, "SystemAllocator: Failed to allocate %d bytes aligned on %d (flags: 0x%08x) %s : %s (%d)!", byteSize, alignment, flags, name ? name : "(no name)", fileName ? fileName : "(no file name)", lineNum); + AZ_Assert(address != nullptr, "SystemAllocator: Failed to allocate %d bytes aligned on %d (flags: 0x%08x) %s : %s (%d)!", byteSize, alignment, flags, name ? name : "(no name)", fileName ? fileName : "(no file name)", lineNum); AZ_PROFILE_MEMORY_ALLOC_EX(MemoryReserved, fileName, lineNum, address, byteSize, name); AZ_MEMORY_PROFILE(ProfileAllocation(address, byteSize, alignment, name, fileName, lineNum, suppressStackRecord + 1)); diff --git a/Code/Framework/AzCore/AzCore/Module/Environment.cpp b/Code/Framework/AzCore/AzCore/Module/Environment.cpp index bec530e2d1..c07b7444d4 100644 --- a/Code/Framework/AzCore/AzCore/Module/Environment.cpp +++ b/Code/Framework/AzCore/AzCore/Module/Environment.cpp @@ -148,7 +148,7 @@ namespace AZ AZ_Assert(m_numAttached == 0, "We should not delete an environment while there are %d modules attached! Unload all DLLs first!", m_numAttached); #endif - for (auto variableIt : m_variableMap) + for (const auto &variableIt : m_variableMap) { EnvironmentVariableHolderBase* holder = reinterpret_cast(variableIt.second); if (holder) diff --git a/Code/Framework/AzCore/AzCore/NativeUI/NativeUISystemComponent.cpp b/Code/Framework/AzCore/AzCore/NativeUI/NativeUISystemComponent.cpp index 7e1adb93b9..a75e1803eb 100644 --- a/Code/Framework/AzCore/AzCore/NativeUI/NativeUISystemComponent.cpp +++ b/Code/Framework/AzCore/AzCore/NativeUI/NativeUISystemComponent.cpp @@ -41,11 +41,17 @@ namespace AZ::NativeUI AZStd::string result = DisplayBlockingDialog("Assert Failed!", message, options); if (result.compare(buttonNames[0]) == 0) + { return AssertAction::IGNORE_ASSERT; + } else if (result.compare(buttonNames[1]) == 0) + { return AssertAction::IGNORE_ALL_ASSERTS; + } else if (result.compare(buttonNames[2]) == 0) + { return AssertAction::BREAK; + } return AssertAction::NONE; } diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp index e621ab412e..a44aa61aca 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp +++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.cpp @@ -121,12 +121,12 @@ namespace AZ { delete attrIt.second; } - + if (m_overload) { delete m_overload; } - + m_attributes.clear(); } @@ -180,7 +180,7 @@ namespace AZ if (GetNumArguments() == overload->GetNumArguments()) { bool anyDifference = false; - + for (size_t i(0), sentinel(GetNumArguments()); !anyDifference && i < sentinel; ++i) { const BehaviorParameter* thisArg = GetArgument(i); @@ -273,7 +273,7 @@ namespace AZ auto attributes = AZStd::move(m_attributes); // Actually delete everything - for (auto propertyIt : events) + for (const auto &propertyIt : events) { delete propertyIt.second.m_broadcast; delete propertyIt.second.m_event; @@ -519,20 +519,20 @@ namespace AZ AZStd::vector BehaviorClass::GetOverloads(const AZStd::string& name) const { AZStd::vector overloads; - + auto methodIter = m_methods.find(name); if (methodIter != m_methods.end()) { overloads = GetOverloadsIncludeMethod(methodIter->second); - } - + } + return overloads; } AZStd::vector BehaviorClass::GetOverloadsIncludeMethod(BehaviorMethod* method) const { AZStd::vector overloads; - + auto iter = method; while (iter) { @@ -546,7 +546,7 @@ namespace AZ AZStd::vector BehaviorClass::GetOverloadsExcludeMethod(BehaviorMethod* method) const { AZStd::vector overloads; - + auto iter = method->m_overload; while (iter) { @@ -972,5 +972,5 @@ namespace AZ return enumRttiHelper.GetTypeId(); } } - + } // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h index f02c37492b..ba8808d4d2 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h +++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h @@ -36,7 +36,7 @@ namespace AZ constexpr const char* k_PropertyNameGetterSuffix = "::Getter"; constexpr const char* k_PropertyNameSetterSuffix = "::Setter"; - + /// Typedef for class unwrapping callback (i.e. used for things like smart_ptr to unwrap for T) using BehaviorClassUnwrapperFunction = void(*)(void* /*classPtr*/, void*& /*unwrappedClass*/, AZ::Uuid& /*unwrappedClassTypeId*/, void* /*userData*/); @@ -53,7 +53,7 @@ namespace AZ IfPresent, }; - struct BehaviorObject // same as DynamicSerializableField, make sure we merge them... so we can store the object easily + struct BehaviorObject // same as DynamicSerializableField, make sure we merge them... so we can store the object easily { AZ_TYPE_INFO(BehaviorObject, "{2813cdfb-0a4a-411c-9216-72a7b644d1dd}"); @@ -165,7 +165,7 @@ namespace AZ /// Convert to BehaviorObject implicitly for passing generic parameters (usually not known at compile time) operator BehaviorObject() const; - /// Converts internally the value to a specific type known at compile time. \returns true if conversion was successful. + /// Converts internally the value to a specific type known at compile time. \returns true if conversion was successful. template bool ConvertTo(); @@ -452,7 +452,7 @@ namespace AZ namespace Internal { const AZ::TypeId& GetUnderlyingTypeId(const IRttiHelper& enumRttiHelper); - + // Converts sourceAddress to targetType inline bool ConvertValueTo(void* sourceAddress, const IRttiHelper* sourceRtti, const AZ::Uuid& targetType, void*& targetAddress, BehaviorParameter::TempValueParameterAllocator& tempAllocator) { @@ -520,7 +520,7 @@ namespace AZ static const int s_startNamedArgumentIndex = s_startArgumentIndex; // +1 for result type BehaviorMethodImpl(FunctionPointer functionPointer, BehaviorContext* context, const AZStd::string& name = AZStd::string()); - + bool Call(BehaviorValueParameter* arguments, unsigned int numArguments, BehaviorValueParameter* result) const override; bool HasResult() const override; @@ -548,7 +548,7 @@ namespace AZ BehaviorParameter m_parameters[sizeof...(Args)+s_startNamedArgumentIndex]; AZStd::array m_metadataParameters; ///< Stores the per parameter metadata which is used to add names, tooltips, trait, default values, etc... to the parameters }; - + #if __cpp_noexcept_function_type // C++17 makes exception specifications as part of the type in paper P0012R1 // Therefore noexcept overloads must be distinguished from non-noexcept overloads @@ -732,7 +732,7 @@ namespace AZ BehaviorEBusEvent(FunctionPointer functionPointer, BehaviorContext* context); BehaviorEBusEvent(FunctionPointerConst functionPointer, BehaviorContext* context); - + template inline AZStd::enable_if_t SetBusIdType(); @@ -813,7 +813,7 @@ namespace AZ : SetFunctionParameters {}; #endif - + template struct BehaviorOnDemandReflectHelper; template @@ -997,14 +997,14 @@ namespace AZ } // namespace Internal /** - * Behavior representation of reflected class. + * Behavior representation of reflected class. */ class BehaviorClass { public: AZ_CLASS_ALLOCATOR(BehaviorClass, SystemAllocator, 0); - BehaviorClass(); + BehaviorClass(); ~BehaviorClass(); /// Hooks to override default memory allocation for the class (AZ_CLASS_ALLOCATOR is used by default) @@ -1065,7 +1065,7 @@ namespace AZ void* m_userData; AZStd::string m_name; - AZStd::vector m_baseClasses; + AZStd::vector m_baseClasses; AZStd::unordered_map m_methods; AZStd::unordered_map m_properties; AttributeArray m_attributes; @@ -1081,7 +1081,7 @@ namespace AZ AZ::Uuid m_wrappedTypeId; // Store all owned instances for unload verification? }; - + // Helper macros to generate getter and setter function from a pointer to value or member value // Syntax BehaviorValueGetter(&globalValue) BehaviorValueGetter(&Class::MemberValue) # define BehaviorValueGetter(valueAddress) &AZ::Internal::BehaviorValuePropertyHelper::Get @@ -1095,7 +1095,7 @@ namespace AZ * Property representation, a property has getter and setter. A read only property will have a "nullptr" for a setter. * You can use lambdas, global of member function. If you want to just expose a variable (not write the function and handle changes) * you can use \ref BehaviorValueProperty macros (or BehaviorValueGetter/Setter to control read/write functionality) - * Member constants are a property too, use \ref BehaviorConstant for it. Everything is either a property or a method, the main reason + * Member constants are a property too, use \ref BehaviorConstant for it. Everything is either a property or a method, the main reason * why we "push" people to use functions is that in most cases when we manipulate an object, you will need to do more than just set a value * to a new value. */ @@ -1163,7 +1163,7 @@ namespace AZ }; /** - * RAII class which keeps track of functions reflected to the BehaviorContext + * RAII class which keeps track of functions reflected to the BehaviorContext * when it is supplied as an OnDemandReflectionOwner */ class ScopedBehaviorOnDemandReflector @@ -1182,7 +1182,7 @@ namespace AZ AZ_CLASS_ALLOCATOR(BehaviorEBus, SystemAllocator, 0); typedef void(*QueueFunctionType)(void* /*userData1*/, void* /*userData2*/); - + struct VirtualProperty { VirtualProperty(BehaviorEBusEventSender* getter, BehaviorEBusEventSender* setter) @@ -1294,7 +1294,7 @@ namespace AZ AZStd::string m_scriptPath; #endif - AZStd::string GetScriptPath() const + AZStd::string GetScriptPath() const { #if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) // m_scriptPath is only available in non-Release mode return m_scriptPath; @@ -1303,8 +1303,8 @@ namespace AZ #endif } - void SetScriptPath(const char* scriptPath) - { + void SetScriptPath(const char* scriptPath) + { #if defined(PERFORMANCE_BUILD) || !defined(_RELEASE) // m_scriptPath is only available in non-Release mode m_scriptPath = scriptPath; #else @@ -1346,7 +1346,7 @@ namespace AZ virtual void OnAddGlobalProperty(const char* propertyName, BehaviorProperty* prop) { (void)propertyName; (void)prop; } virtual void OnRemoveGlobalProperty(const char* propertyName, BehaviorProperty* prop) { (void)propertyName; (void)prop; } - /// Called when a class is added or removed + /// Called when a class is added or removed virtual void OnAddClass(const char* className, BehaviorClass* behaviorClass) { (void)className; (void)behaviorClass; } virtual void OnRemoveClass(const char* className, BehaviorClass* behaviorClass) { (void)className; (void)behaviorClass; } @@ -1358,10 +1358,10 @@ namespace AZ using BehaviorContextBus = AZ::EBus; /** - * BehaviorContext is used to reflect classes, methods and EBuses for runtime interaction. A typical consumer of this context and different + * BehaviorContext is used to reflect classes, methods and EBuses for runtime interaction. A typical consumer of this context and different * scripting systems (i.e. Lua, Visual Script, etc.). Even though (as designed) there are overlaps between some context they have very different * purpose and set of rules. For example SerializeContext, doesn't reflect any methods, it just reflects data fields that will be stored for initial object - * setup, it handles version conversion and so thing, this related to storing the object to a persistent storage. Behavior context, doesn't need to deal with versions as + * setup, it handles version conversion and so thing, this related to storing the object to a persistent storage. Behavior context, doesn't need to deal with versions as * no data is stored, just methods for manipulating the object state. */ class BehaviorContext : public ReflectContext @@ -1379,7 +1379,7 @@ namespace AZ } template - static void QueueFunction(BehaviorEBus::QueueFunctionType f, void* userData1, void* userData2) + static void QueueFunction(BehaviorEBus::QueueFunctionType f, void* userData1, void* userData2) { Bus::QueueFunction(f, userData1, userData2); } @@ -1484,8 +1484,8 @@ namespace AZ } template - static void SetClassDefaultAllocator(BehaviorClass* behaviorClass, const AZStd::false_type& /*HasAZClassAllocator*/) - { + static void SetClassDefaultAllocator(BehaviorClass* behaviorClass, const AZStd::false_type& /*HasAZClassAllocator*/) + { behaviorClass->m_allocate = &DefaultSystemAllocator::Allocate; behaviorClass->m_deallocate = &DefaultSystemAllocator::DeAllocate; } @@ -1522,20 +1522,20 @@ namespace AZ } template - static void SetClassDefaultConstructor(BehaviorClass* behaviorClass, const AZStd::true_type& /*AZStd::is_constructible*/) + static void SetClassDefaultConstructor(BehaviorClass* behaviorClass, const AZStd::true_type& /*AZStd::is_constructible*/) { behaviorClass->m_defaultConstructor = &DefaultConstruct; } template - static void SetClassDefaultDestructor(BehaviorClass* behaviorClass, const AZStd::true_type& /*AZStd::is_destructible*/) + static void SetClassDefaultDestructor(BehaviorClass* behaviorClass, const AZStd::true_type& /*AZStd::is_destructible*/) { behaviorClass->m_destructor = &DefaultDestruct; } template - static void SetClassDefaultCopyConstructor(BehaviorClass* behaviorClass, const AZStd::true_type& /*AZStd::is_copy_constructible*/) - { + static void SetClassDefaultCopyConstructor(BehaviorClass* behaviorClass, const AZStd::true_type& /*AZStd::is_copy_constructible*/) + { behaviorClass->m_cloner = &DefaultCopyConstruct; } @@ -1585,7 +1585,7 @@ namespace AZ const char* m_name; BehaviorMethod* m_method; }; - + struct GlobalPropertyBuilder : public AZ::Internal::GenericAttributes { typedef AZ::Internal::GenericAttributes Base; @@ -1608,7 +1608,7 @@ namespace AZ ClassBuilder(BehaviorContext* context, BehaviorClass* behaviorClass); ~ClassBuilder(); ClassBuilder* operator->(); - + /** * Sets custom allocator for a class, this function will error if this not inside a class. * This is only for very specific cases when you want to override AZ_CLASS_ALLOCATOR or you are dealing with 3rd party classes, otherwise @@ -1659,9 +1659,9 @@ namespace AZ ClassBuilder* Constant(const char* name, Getter getter); /** - * You can describe buses that this class uses to communicate. Those buses will be used by tools when + * You can describe buses that this class uses to communicate. Those buses will be used by tools when * you need to give developers hints as to what buses this class interacts with. - * You don't need to reflect all buses that your class uses, just the ones related to + * You don't need to reflect all buses that your class uses, just the ones related to * class behavior. Please refer to component documentation for more information on * the pattern of Request and Notification buses. * {@ @@ -1717,10 +1717,10 @@ namespace AZ /** * With request buses (please refer to component communication patterns documentation) we ofter have EBus events - * that represent a getter and a setter for a value. To allow our tools to take advantage of it, you can reflect + * that represent a getter and a setter for a value. To allow our tools to take advantage of it, you can reflect * VirtualProperty to indicate which event is the getter and which is the setter. * This function validates that getter event has no argument and a result and setter function has no results and only - * one argument which is the same type as the result of the getter. + * one argument which is the same type as the result of the getter. * \note Make sure you call this function after you have reflected the getter and setter events as it will report an error * if we can't find the function */ @@ -1731,7 +1731,7 @@ namespace AZ BehaviorContext(); ~BehaviorContext(); - + ///< \deprecated Use "Method(const char*, Function, const AZStd::array::num_args>&, const char*)" instead ///< This method does not support passing in argument names and tooltips nor does it support overriding specific parameter Behavior traits template @@ -1741,7 +1741,7 @@ namespace AZ ///< This method does not support passing in argument names and tooltips nor does it support overriding specific parameter Behavior traits template GlobalMethodBuilder Method(const char* name, Function f, const char* deprecatedName, BehaviorValues* defaultValues = nullptr, const char* dbgDesc = nullptr); - + template GlobalMethodBuilder Method(const char* name, Function f, const AZStd::array::num_args>& args, const char* dbgDesc = nullptr); @@ -1836,13 +1836,13 @@ namespace AZ /** * Helper MACRO to help you write the EBus handler that you want to reflect to behavior. This is not required, but generally we recommend reflecting all useful - * buses as this enable people to "script" complex behaviors. + * buses as this enable people to "script" complex behaviors. * You don't have to use this macro to write a Handler, but some people find it useful * Here is an example how to use it: * class MyEBusBehaviorHandler : public MyEBus::Handler, public AZ::BehaviorEBusHandler * { * public: - * AZ_EBUS_BEHAVIOR_BINDER(MyEBusBehaviorHandler, "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXX}",Allocator, OnEvent1, OnEvent2 and so on); + * AZ_EBUS_BEHAVIOR_BINDER(MyEBusBehaviorHandler, "{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXX}",Allocator, OnEvent1, OnEvent2 and so on); * // now you need implementations for those event * * @@ -1854,7 +1854,7 @@ namespace AZ * // The AZ_EBUS_BEHAVIOR_BINDER defines FN_EventName for each index. You can also cache it yourself (but it's slower), static int cacheIndex = GetFunctionIndex("OnEvent1"); and use that . * CallResult(result, FN_OnEvent1, data); // forward to the binding (there can be none, this is why we need to always have properly set result, when there is one) * return result; // return the result like you will in any normal EBus even with result - * } * + * } * * // handle the other events here * }; * @@ -1922,7 +1922,7 @@ namespace AZ /** * Provides the same functionality of the AZ_EBUS_BEHAVIOR_BINDER macro above with the additional ability to specify the names and a tooltips of handler methods * after listing the handler method in the macro. - * An example Usage is + * An example Usage is * class MyEBusBehaviorHandler : public MyEBus::Handler, public AZ::BehaviorEBusHandler * { * public: @@ -1930,7 +1930,7 @@ namespace AZ * OnEvent2, ({#OnEvent2 first parameter name(float), #OnEvent2 first parameter tooltip(float)}, {#OnEvent2 second parameter name(bool), {#OnEvent2 second parameter tooltip(bool)}), * OnEvent3, ()); * // The reason for needing parenthesis around the parameter name and tooltip object(AZ::BehaviorParameterOverrides) is to prevent the macro from parsing the comma in the intializer as seperate parameters - * // When using this macro, the BehaviorParameterOverrides objects must be placed after every listing a function as a handler. Furthermore the number of BehaviorParameterOverrides objects for each function must match the number of parameters + * // When using this macro, the BehaviorParameterOverrides objects must be placed after every listing a function as a handler. Furthermore the number of BehaviorParameterOverrides objects for each function must match the number of parameters * // to that function * // Ex. for a function called HugeEvent with a signature of void HugeEvent(int, float, double, char, short), two arguments must be supplied to the macro. * // 1. HugeEvent @@ -2181,7 +2181,7 @@ namespace AZ // Template implementations ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// - + ////////////////////////////////////////////////////////////////////////// inline BehaviorObject::BehaviorObject() : m_address(nullptr) @@ -2569,7 +2569,7 @@ namespace AZ m_getter = nullptr; return false; } - + // assure that TR_THIS_PTR is set on the first parameter m_getter->OverrideParameterTraits(0, AZ::BehaviorParameter::TR_THIS_PTR, 0); } @@ -2847,7 +2847,7 @@ namespace AZ } ////////////////////////////////////////////////////////////////////////// - + template void BehaviorEBusHandler::CallResult(R& result, int index, Args&&... args) const { @@ -2904,7 +2904,7 @@ namespace AZ { return ClassBuilder(this, static_cast(nullptr)); } - + auto classTypeIt = m_typeToClassMap.find(typeUuid); if (IsRemovingReflection()) { @@ -2933,7 +2933,7 @@ namespace AZ // class already reflected, display name and uuid char uuidName[AZ::Uuid::MaxStringBuffer]; classTypeIt->first.ToString(uuidName, AZ::Uuid::MaxStringBuffer); - + AZ_Error("Reflection", false, "Class '%s' is already registered using Uuid: %s!", name, uuidName); return ClassBuilder(this, static_cast(nullptr)); } @@ -3002,7 +3002,7 @@ namespace AZ if (m_class && (!Base::m_context->IsRemovingReflection())) { - for (auto method : m_class->m_methods) + for (const auto &method : m_class->m_methods) { m_class->PostProcessMethod(Base::m_context, *method.second); if (MethodReturnsAzEventByReferenceOrPointer(*method.second)) @@ -3485,7 +3485,7 @@ namespace AZ return this; } - + ////////////////////////////////////////////////////////////////////////// template BehaviorContext::EBusBuilder BehaviorContext::EBus(const char* name, const char* deprecatedName /*=nullptr*/, const char* toolTip /*=nullptr*/) @@ -3748,9 +3748,9 @@ namespace AZ return this; } } - + m_ebus->m_virtualProperties.insert(AZStd::make_pair(name, BehaviorEBus::VirtualProperty(getter, setter))); - } + } return this; } @@ -3868,7 +3868,7 @@ namespace AZ SetParameters(m_parameters, this); SetParameters(&m_parameters[s_startNamedArgumentIndex], this); } - + ////////////////////////////////////////////////////////////////////////// template bool BehaviorMethodImpl::Call(BehaviorValueParameter* arguments, unsigned int numArguments, BehaviorValueParameter* result) const @@ -3876,7 +3876,7 @@ namespace AZ size_t totalArguments = GetNumArguments(); if (numArguments < totalArguments) { - // We are cloning all arguments on the stack, since Call is called only from Invoke we can reserve bigger "arguments" array + // We are cloning all arguments on the stack, since Call is called only from Invoke we can reserve bigger "arguments" array // that can always handle all parameters. So far the don't use default values that ofter, so we will optimize for the common case first. BehaviorValueParameter* newArguments = reinterpret_cast(alloca(sizeof(BehaviorValueParameter)* totalArguments)); // clone the input parameters (we don't need to clone temp buffers, etc. as they will be still on the stack) @@ -4072,7 +4072,7 @@ namespace AZ { m_isConst = true; } - + ////////////////////////////////////////////////////////////////////////// template bool BehaviorMethodImpl::Call(BehaviorValueParameter* arguments, unsigned int numArguments, BehaviorValueParameter* result) const @@ -4080,7 +4080,7 @@ namespace AZ size_t totalArguments = GetNumArguments(); if (numArguments < totalArguments) { - // We are cloning all arguments on the stack, since Call is called only from Invoke we can reserve bigger "arguments" array + // We are cloning all arguments on the stack, since Call is called only from Invoke we can reserve bigger "arguments" array // that can always handle all parameters. So far the don't use default values that ofter, so we will optimize for the common case first. BehaviorValueParameter* newArguments = reinterpret_cast(alloca(sizeof(BehaviorValueParameter)* totalArguments)); // clone the input parameters (we don't need to clone temp buffers, etc. as they will be still on the stack) @@ -4284,7 +4284,7 @@ namespace AZ { m_isConst = true; } - + ////////////////////////////////////////////////////////////////////////// template template @@ -4307,7 +4307,7 @@ namespace AZ size_t totalArguments = GetNumArguments(); if (numArguments < totalArguments) { - // We are cloning all arguments on the stack, since Call is called only from Invoke we can reserve bigger "arguments" array + // We are cloning all arguments on the stack, since Call is called only from Invoke we can reserve bigger "arguments" array // that can always handle all parameters. So far the don't use default values that ofter, so we will optimize for the common case first. BehaviorValueParameter* newArguments = reinterpret_cast(alloca(sizeof(BehaviorValueParameter)* totalArguments)); // clone the input parameters (we don't need to clone temp buffers, etc. as they will be still on the stack) @@ -4497,7 +4497,7 @@ namespace AZ template void SetFunctionParameters::Set(AZStd::vector& params) { - // result, userdata, arguments + // result, userdata, arguments params.resize(sizeof...(Args) + eBehaviorBusForwarderEventIndices::ParameterFirst); SetParameters(¶ms[eBehaviorBusForwarderEventIndices::Result], nullptr); SetParameters(¶ms[eBehaviorBusForwarderEventIndices::UserData], nullptr); diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp index 531c91bcf4..fb0d12f552 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp @@ -1463,9 +1463,9 @@ static void* LuaMemoryHook(void* userData, void* ptr, size_t osize, size_t nsize { allocator->DeAllocate(ptr); } - return NULL; + return nullptr; } - else if (ptr == NULL) + else if (ptr == nullptr) { return allocator->Allocate(nsize, LUA_DEFAULT_ALIGNMENT, 0, "Script", __FILE__, __LINE__, 1); } @@ -1708,7 +1708,7 @@ LUA_API const Node* lua_getDummyNode() "Invalid stack!"); lua_pop(m_nativeContext, (currentTop - m_startVariableIndex) + 1); - m_nativeContext = NULL; + m_nativeContext = nullptr; m_startVariableIndex = 0; m_numArguments = 0; m_numResults = 0; @@ -2038,7 +2038,7 @@ LUA_API const Node* lua_getDummyNode() LSV_BEGIN_VARIABLE(m_nativeContext); valueIndex = 0; - name = NULL; + name = nullptr; index = -1; if (m_mode == MD_INSPECT) { diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp index 63f44a2469..e28a289c9e 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptContextDebug.cpp @@ -43,7 +43,7 @@ public: , m_numErrors(0) { using namespace AZStd::placeholders; - m_context->SetErrorHook(AZStd::bind(&ScriptErrorCatcher::ErrorCB, this, _1, _2, _3)); + m_context->SetErrorHook([this](ScriptContext* a, ScriptContext::ErrorType b, const char* c) { ErrorCB(a,b,c); }); } ~ScriptErrorCatcher() { @@ -66,7 +66,7 @@ public: // [6/29/2012] //========================================================================= ScriptContextDebug::ScriptContextDebug(ScriptContext& scriptContext, bool isEnableStackRecord) - : m_luaDebug(NULL) + : m_luaDebug(nullptr) , m_currentStackLevel(-1) , m_stepStackLevel(-1) , m_isRecordCallstack(isEnableStackRecord) @@ -104,7 +104,7 @@ void ScriptContextDebug::ConnectHook() //========================================================================= void ScriptContextDebug::DisconnectHook() { - lua_sethook(m_context.NativeContext(), 0, 0, 0); + lua_sethook(m_context.NativeContext(), nullptr, 0, 0); } //========================================================================= @@ -149,7 +149,7 @@ ScriptContextDebug::EnumRegisteredClasses(EnumClass enumClass, EnumMethod enumMe lua_rawgeti(l, -2, AZ_LUA_CLASS_METATABLE_NAME_INDEX); // load class name AZ_Assert(lua_isstring(l, -1), "Internal scipt error: class without a classname at index %d", AZ_LUA_CLASS_METATABLE_NAME_INDEX); - + if (!enumClass(lua_tostring(l, -1), behaviorClass->m_typeId, userData)) { lua_pop(l, 5); @@ -199,7 +199,7 @@ ScriptContextDebug::EnumRegisteredClasses(EnumClass enumClass, EnumMethod enumMe // for any non-built in methods if (strncmp(name, "__", 2) != 0) { - const char* dbgParamInfo = NULL; + const char* dbgParamInfo = nullptr; // attempt to get the name bool popDebugName = lua_getupvalue(l, -1, 2) != nullptr; @@ -278,7 +278,7 @@ ScriptContextDebug::EnumRegisteredGlobals(EnumMethod enumMethod, EnumProperty en { if (strncmp(name, "__", 2) != 0) { - const char* dbgParamInfo = NULL; + const char* dbgParamInfo = nullptr; lua_getupvalue(l, -1, 2); if (lua_isstring(l, -1)) { @@ -606,7 +606,7 @@ void AZ::LuaHook(lua_State* l, lua_Debug* ar) lua_pop(l, 1); // bool doBreak = false; - ScriptContextDebug::Breakpoint* bp = NULL; + ScriptContextDebug::Breakpoint* bp = nullptr; ScriptContextDebug::Breakpoint localBreakPoint; lua_getinfo(l, "Sunl", ar); @@ -735,7 +735,7 @@ void AZ::LuaHook(lua_State* l, lua_Debug* ar) { context->m_luaDebug = ar; context->m_breakCallback(context, bp); - context->m_luaDebug = NULL; + context->m_luaDebug = nullptr; } } @@ -752,7 +752,7 @@ ScriptContextDebug::EnumLocals(EnumLocalCallback& cb) int local = 1; const char* name; ScriptDataContext dc; - while ((name = lua_getlocal(l, m_luaDebug, local)) != NULL) + while ((name = lua_getlocal(l, m_luaDebug, local)) != nullptr) { if (name[0] != '(') // skip temporary variables { @@ -846,7 +846,7 @@ ScriptContextDebug::EnableBreakpoints(BreakpointCallback& cb) void ScriptContextDebug::DisableBreakpoints() { - m_breakCallback = NULL; + m_breakCallback = nullptr; } //========================================================================= @@ -1079,7 +1079,7 @@ ScriptContextDebug::WriteValue(const DebugValue& value, const char* valueName, i int valueTableIndex = -1; if (valueName[0] == '[') { - valueTableIndex = static_cast(strtol(valueName + 1, NULL, 10)); + valueTableIndex = static_cast(strtol(valueName + 1, nullptr, 10)); } if (strcmp(valueName, "__metatable__") == 0) // metatable are read only { @@ -1114,7 +1114,7 @@ ScriptContextDebug::WriteValue(const DebugValue& value, const char* valueName, i } break; case LUA_TNUMBER: { - lua_pushnumber(l, static_cast(strtod(value.m_value.c_str(), NULL))); + lua_pushnumber(l, static_cast(strtod(value.m_value.c_str(), nullptr))); if (localIndex != -1) { lua_setlocal(l, m_luaDebug, localIndex); @@ -1256,7 +1256,7 @@ ScriptContextDebug::WriteValue(const DebugValue& value, const char* valueName, i else { lua_pushvalue(l, -5); // copy the user data (this pointer) - lua_pushnumber(l, static_cast(strtod(subElement.m_value.c_str(), NULL))); + lua_pushnumber(l, static_cast(strtod(subElement.m_value.c_str(), nullptr))); lua_call(l, 2, 0); // call the setter } break; @@ -1375,7 +1375,7 @@ ScriptContextDebug::GetValue(DebugValue& value) { int iLocal = 1; const char* localName; - while ((localName = lua_getlocal(l, m_luaDebug, iLocal)) != NULL) + while ((localName = lua_getlocal(l, m_luaDebug, iLocal)) != nullptr) { if (localName[0] != '(' && strcmp(name, localName) == 0) { @@ -1460,7 +1460,7 @@ ScriptContextDebug::SetValue(const DebugValue& sourceValue) // create hierarchy from tokens const DebugValue* value = &sourceValue; DebugValue untokenizedValue; - + if (tokens.size() > 1) { untokenizedValue.m_name = tokens[0]; @@ -1519,7 +1519,7 @@ ScriptContextDebug::SetValue(const DebugValue& sourceValue) { int iLocal = 1; const char* localName; - while ((localName = lua_getlocal(l, m_luaDebug, iLocal)) != NULL) + while ((localName = lua_getlocal(l, m_luaDebug, iLocal)) != nullptr) { lua_pop(l, 1); if (localName[0] != '(' && strcmp(name, localName) == 0) diff --git a/Code/Framework/AzCore/AzCore/Serialization/SerializationUtils.cpp b/Code/Framework/AzCore/AzCore/Serialization/SerializationUtils.cpp index c8e6c28679..37eacd940e 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/SerializationUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/SerializationUtils.cpp @@ -42,7 +42,7 @@ namespace AZ AZ_Assert(targetPointer, "You must provide a target pointer"); bool foundSuccess = false; - typedef AZStd::function CreationCallback; + using CreationCallback = AZStd::function; auto handler = [&targetPointer, objectClassData, &foundSuccess](void** instance, const SerializeContext::ClassData** classData, const Uuid& classId, SerializeContext* context) { void* convertibleInstance{}; diff --git a/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp b/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp index cea4b795d7..f326b021e7 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp @@ -91,7 +91,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown char, short, int version!"); (void)textVersion; - long value = strtol(text, NULL, 10); + long value = strtol(text, nullptr, 10); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); return static_cast(stream.Write(sizeof(T), reinterpret_cast(&value))); } @@ -124,7 +124,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown unsigned char, short, int version!"); (void)textVersion; - unsigned long value = strtoul(text, NULL, 10); + unsigned long value = strtoul(text, nullptr, 10); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); return static_cast(stream.Write(sizeof(T), reinterpret_cast(&value))); } @@ -158,7 +158,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown unsigned char, short, int version!"); (void)textVersion; - long value = strtol(text, NULL, 10); + long value = strtol(text, nullptr, 10); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); return static_cast(stream.Write(sizeof(T), reinterpret_cast(&value))); } @@ -192,7 +192,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown unsigned char, short, int version!"); (void)textVersion; - unsigned long value = strtoul(text, NULL, 10); + unsigned long value = strtoul(text, nullptr, 10); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); return static_cast(stream.Write(sizeof(T), reinterpret_cast(&value))); } @@ -225,7 +225,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown unsigned char, short, int version!"); (void)textVersion; - AZ::s64 value = strtoll(text, NULL, 10); + AZ::s64 value = strtoll(text, nullptr, 10); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); return static_cast(stream.Write(sizeof(AZ::s64), reinterpret_cast(&value))); } @@ -258,7 +258,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown unsigned char, short, int version!"); (void)textVersion; - unsigned long long value = strtoull(text, NULL, 10); + unsigned long long value = strtoull(text, nullptr, 10); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); return static_cast(stream.Write(sizeof(AZ::u64), reinterpret_cast(&value))); } @@ -292,7 +292,7 @@ namespace AZ { AZ_Assert(textVersion == 0, "Unknown float/double version!"); (void)textVersion; - double value = strtod(text, NULL); + double value = strtod(text, nullptr); AZ_SERIALIZE_SWAP_ENDIAN(value, isDataBigEndian); T data = static_cast(value); @@ -815,7 +815,7 @@ namespace AZ const ClassData* fromClass = FindClassData(fromClassId); if (!fromClass) { - return NULL; + return nullptr; } for (size_t i = 0; i < fromClass->m_elements.size(); ++i) @@ -831,7 +831,7 @@ namespace AZ if (!fromClass->m_azRtti) { - return NULL; // Reflection info failed to cast and we can't find rtti info + return nullptr; // Reflection info failed to cast and we can't find rtti info } fromClassHelper = fromClass->m_azRtti; } @@ -841,7 +841,7 @@ namespace AZ const ClassData* toClass = FindClassData(toClassId); if (!toClass || !toClass->m_azRtti) { - return NULL; // We can't cast without class data or rtti helper + return nullptr; // We can't cast without class data or rtti helper } toClassHelper = toClass->m_azRtti; } @@ -855,7 +855,7 @@ namespace AZ // [5/22/2012] //========================================================================= SerializeContext::DataElement::DataElement() - : m_name(0) + : m_name(nullptr) , m_nameCrc(0) , m_dataSize(0) , m_byteStream(&m_buffer) @@ -1045,7 +1045,7 @@ namespace AZ //========================================================================= bool SerializeContext::DataElementNode::Convert(SerializeContext& sc, const char* name, const Uuid& id) { - AZ_Assert(name != NULL && strlen(name) > 0, "Empty name is an INVALID element name!"); + AZ_Assert(name != nullptr && strlen(name) > 0, "Empty name is an INVALID element name!"); u32 nameCrc = Crc32(name); #if defined(AZ_ENABLE_TRACING) @@ -1165,7 +1165,7 @@ namespace AZ int SerializeContext::DataElementNode::AddElement(SerializeContext& sc, const char* name, const ClassData& classData) { (void)sc; - AZ_Assert(name != NULL && strlen(name) > 0, "Empty name is an INVALID element name!"); + AZ_Assert(name != nullptr && strlen(name) > 0, "Empty name is an INVALID element name!"); u32 nameCrc = Crc32(name); #if defined(AZ_ENABLE_TRACING) @@ -1703,7 +1703,7 @@ namespace AZ m_classData->second.m_serializer = AZStd::move(serializer); return this; - + } //========================================================================= @@ -1801,7 +1801,7 @@ namespace AZ void* objectPtr = ptr; const AZ::Uuid* classIdPtr = &classId; const SerializeContext::ClassData* dataClassInfo = classData; - + if (classElement) { // if we are a pointer, then we may be pointing to a derived type. @@ -1854,14 +1854,14 @@ namespace AZ DbgStackEntry de; de.m_dataPtr = objectPtr; de.m_uuidPtr = classIdPtr; - de.m_elementName = classElement ? classElement->m_name : NULL; + de.m_elementName = classElement ? classElement->m_name : nullptr; de.m_classData = dataClassInfo; de.m_classElement = classElement; callContext->m_errorHandler->Push(de); } #endif // AZ_ENABLE_SERIALIZER_DEBUG - if (dataClassInfo == NULL) + if (dataClassInfo == nullptr) { #if defined (AZ_ENABLE_SERIALIZER_DEBUG) AZStd::string error; @@ -2182,9 +2182,9 @@ namespace AZ AZ::SerializeContext::DataPatchUpgradeHandler::~DataPatchUpgradeHandler() { - for (auto fieldUpgrades : m_upgrades) + for (const auto& fieldUpgrades : m_upgrades) { - for (auto versionUpgrades : fieldUpgrades.second) + for (const auto& versionUpgrades : fieldUpgrades.second) { for (auto* upgrade : versionUpgrades.second) { @@ -2192,8 +2192,8 @@ namespace AZ } } } - } - + } + void AZ::SerializeContext::DataPatchUpgradeHandler::AddFieldUpgrade(DataPatchUpgrade* upgrade) { // Find the field @@ -2448,7 +2448,7 @@ namespace AZ classData->m_eventHandler->OnWriteEnd(dataPtr); classData->m_eventHandler->OnObjectCloned(dataPtr); } - + if (classData->m_serializer) { classData->m_serializer->PostClone(dataPtr); @@ -2489,7 +2489,7 @@ namespace AZ { if (cd.m_azRtti->IsTypeOf(typeId)) { - if (!callback(&cd, 0)) + if (!callback(&cd, nullptr)) { return; } @@ -2507,7 +2507,7 @@ namespace AZ // if both classes have azRtti they will be enumerated already by the code above (azrtti) if (cd.m_azRtti == nullptr || cd.m_elements[i].m_azRtti == nullptr) { - if (!callback(&cd, 0)) + if (!callback(&cd, nullptr)) { return; } @@ -2539,7 +2539,7 @@ namespace AZ if (baseClassData) { callbackData.m_reportedTypes.push_back(baseClassData->m_typeId); - if (!callback(baseClassData, 0)) + if (!callback(baseClassData, nullptr)) { return; } @@ -2586,8 +2586,8 @@ namespace AZ void SerializeContext::RegisterDataContainer(AZStd::unique_ptr dataContainer) { m_dataContainers.push_back(AZStd::move(dataContainer)); - } - + } + //========================================================================= // EnumerateBaseRTTIEnumCallback // [11/13/2012] @@ -2731,10 +2731,10 @@ namespace AZ //========================================================================= void SerializeContext::IDataContainer::DeletePointerData(SerializeContext* context, const ClassElement* classElement, const void* element) { - AZ_Assert(context != NULL && classElement != NULL && element != NULL, "Invalid input"); + AZ_Assert(context != nullptr && classElement != nullptr && element != nullptr, "Invalid input"); const AZ::Uuid* elemUuid = &classElement->m_typeId; // find the class data for the specific element - const SerializeContext::ClassData* classData = classElement->m_genericClassInfo ? classElement->m_genericClassInfo->GetClassData() : context->FindClassData(*elemUuid, NULL, 0); + const SerializeContext::ClassData* classData = classElement->m_genericClassInfo ? classElement->m_genericClassInfo->GetClassData() : context->FindClassData(*elemUuid, nullptr, 0); if (classElement->m_flags & SerializeContext::ClassElement::FLG_POINTER) { const void* dataPtr = *reinterpret_cast(element); @@ -2745,7 +2745,7 @@ namespace AZ if (*actualClassId != *elemUuid) { // we are pointing to derived type, adjust class data, uuid and pointer. - classData = context->FindClassData(*actualClassId, NULL, 0); + classData = context->FindClassData(*actualClassId, nullptr, 0); elemUuid = actualClassId; if (classData) { @@ -2754,7 +2754,7 @@ namespace AZ } } } - if (classData == NULL) + if (classData == nullptr) { if ((classElement->m_flags & ClassElement::FLG_POINTER) != 0) { @@ -3250,7 +3250,7 @@ namespace AZ return m_moduleOSAllocator; } - // Take advantage of static variables being unique per dll module to clean up module specific registered classes when the module unloads + // Take advantage of static variables being unique per dll module to clean up module specific registered classes when the module unloads SerializeContext::PerModuleGenericClassInfo& GetCurrentSerializeContextModule() { static SerializeContext::PerModuleGenericClassInfo s_ModuleCleanupInstance; diff --git a/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.h b/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.h index d48e9df665..3d7f3c00f8 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.h +++ b/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.h @@ -602,7 +602,7 @@ namespace AZ ///< @param resultPtr output parameter that is populated with the memory address that can be used to store an element of the convertible type ///< @param convertibleTypeId type to check to determine if it can converted to an element of class represent by this Class Data ///< @param classPtr memory address of the class represented by the ClassData - ///< @return true if a non-null memory address has been returned that can store the convertible type + ///< @return true if a non-null memory address has been returned that can store the convertible type bool ConvertFromType(void*& convertibleTypePtr, const TypeId& convertibleTypeId, void* classPtr, AZ::SerializeContext& serializeContext) const; /// Find the persistence id (check base classes) \todo this is a TEMP fix, analyze and cache that information in the class @@ -797,8 +797,8 @@ namespace AZ virtual void* ReserveElement(void* instance, const ClassElement* classElement) = 0; /// Free an element that was reserved using ReserveElement, but was not stored by calling StoreElement. virtual void FreeReservedElement(void* instance, void* element, SerializeContext* deletePointerDataContext) - { - RemoveElement(instance, element, deletePointerDataContext); + { + RemoveElement(instance, element, deletePointerDataContext); } /// Get an element's address by its index (called before the element is loaded). virtual void* GetElementByIndex(void* instance, const ClassElement* classElement, size_t index) = 0; @@ -858,7 +858,7 @@ namespace AZ /** * Data Converter interface which can be used to provide a conversion operation from to unrelated C++ types - * derived class to base class casting is taken care of through the RTTI system so those relations should not be + * derived class to base class casting is taken care of through the RTTI system so those relations should not be * check within this class */ class IDataConverter @@ -879,7 +879,7 @@ namespace AZ ///< @param convertibleTypeId type to check to determine if it can converted to an element of class represent by this Class Data ///< @param classPtr memory address of the class represented by the @classData type ///< @param classData reference to the metadata representing the type stored in classPtr - ///< @return true if a non-null memory address has been returned that can store the convertible type + ///< @return true if a non-null memory address has been returned that can store the convertible type virtual bool ConvertFromType(void*& convertibleTypePtr, const TypeId& convertibleTypeId, void* classPtr, const SerializeContext::ClassData& classData, SerializeContext& /*serializeContext*/) { if (classData.m_typeId == convertibleTypeId) @@ -1054,7 +1054,7 @@ namespace AZ AZStd::vector FindClassId(const AZ::Crc32& classNameCrc) const; /// Find GenericClassData data based on the supplied class ID - GenericClassInfo* FindGenericClassInfo(const Uuid& classId) const; + GenericClassInfo* FindGenericClassInfo(const Uuid& classId) const; /// Creates an AZStd::any based on the provided class Uuid, or returns an empty AZStd::any if no class data is found or the class is virtual AZStd::any CreateAny(const Uuid& classId); @@ -1161,7 +1161,7 @@ namespace AZ /* Declare a name change of a serialized field * These are used by the serializer to repair old data patches - * + * */ ClassBuilder* NameChange(unsigned int fromVersion, unsigned int toVersion, AZStd::string_view oldFieldName, AZStd::string_view newFieldName); @@ -1403,7 +1403,7 @@ namespace AZ template struct SerializeGenericTypeInfo { - // Provides a specific type alias that can be used to create GenericClassInfo of the + // Provides a specific type alias that can be used to create GenericClassInfo of the // specified type. By default this is GenericClassInfo class which is abstract using ClassInfoType = GenericClassInfo; @@ -1938,7 +1938,7 @@ namespace AZ if (m_context->IsRemovingReflection()) { // Delete any attributes allocated for this call. - for (auto attributePair : attributes) + for (auto& attributePair : attributes) { delete attributePair.second; } @@ -1955,7 +1955,7 @@ namespace AZ m_classData->second.m_name, AzTypeInfo::Name()); - // SerializeGenericTypeInfo::GetClassTypeId() is needed solely because + // SerializeGenericTypeInfo::GetClassTypeId() is needed solely because // the SerializeGenericTypeInfo specialization for AZ::Data::Asset returns the GetAssetClassId() value // and not the AzTypeInfo>::Uuid() // Therefore in order to remain backwards compatible the SerializeGenericTypeInfo::GetClassTypeId specialization diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp index 0ca354ac95..cb666a7c02 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp @@ -1004,7 +1004,7 @@ namespace AZ::SettingsRegistryMergeUtils } AZ::SettingsRegistryInterface::VisitResponse Traverse( AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::VisitAction action, - AZ::SettingsRegistryInterface::Type type) + AZ::SettingsRegistryInterface::Type type) override { // Pass the pointer path to the inclusion filter if available if (m_dumperSettings.m_includeFilter && !m_dumperSettings.m_includeFilter(path)) @@ -1058,7 +1058,7 @@ namespace AZ::SettingsRegistryMergeUtils AZ::SettingsRegistryInterface::VisitResponse::Done; } - void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, bool value) + void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, bool value) override { m_result = m_result && WriteName(valueName) && m_writer.Bool(value); } @@ -1073,12 +1073,12 @@ namespace AZ::SettingsRegistryMergeUtils m_result = m_result && WriteName(valueName) && m_writer.Uint64(value); } - void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, double value) + void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, double value) override { m_result = m_result && WriteName(valueName) && m_writer.Double(value); } - void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) + void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { m_result = m_result && WriteName(valueName) && m_writer.String(value.data(), aznumeric_caster(value.size())); } diff --git a/Code/Framework/AzCore/AzCore/State/HSM.cpp b/Code/Framework/AzCore/AzCore/State/HSM.cpp index e9e069cf9a..56a7e9a27a 100644 --- a/Code/Framework/AzCore/AzCore/State/HSM.cpp +++ b/Code/Framework/AzCore/AzCore/State/HSM.cpp @@ -187,7 +187,7 @@ void HSM::ClearStateHandler(StateId id) { m_states[id].handler.clear(); - m_states[id].name = NULL; + m_states[id].name = nullptr; m_states[id].superId = InvalidStateId; } diff --git a/Code/Framework/AzCore/AzCore/State/HSM.h b/Code/Framework/AzCore/AzCore/State/HSM.h index 042843cb7d..4004ca4341 100644 --- a/Code/Framework/AzCore/AzCore/State/HSM.h +++ b/Code/Framework/AzCore/AzCore/State/HSM.h @@ -103,13 +103,10 @@ namespace AZ struct State { - State() - : superId(InvalidStateId) - , name(NULL) {} StateHandler handler; - StateId superId; ///< State id of the super state, InvalidStateId if this is a top state InvalidStateId. - StateId subId; ///< If != InvalidStateId it will enter the sub ID after the state Enter event is called. - const char* name; + StateId superId = InvalidStateId; ///< State id of the super state, InvalidStateId if this is a top state InvalidStateId. + StateId subId = InvalidStateId; ///< If != InvalidStateId it will enter the sub ID after the state Enter event is called. + const char* name = nullptr; }; AZStd::array m_states; }; diff --git a/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.cpp b/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.cpp index 6c92803ac4..d56fc9a5d6 100644 --- a/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.cpp +++ b/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.cpp @@ -81,8 +81,12 @@ namespace AZ if (settingsFile.IsOpen()) { IO::SystemFileStream settingsFileStream(&settingsFile, false); - ObjectStream::ClassReadyCB readyCB(AZStd::bind(&UserSettingsProvider::OnSettingLoaded, this, AZStd::placeholders::_1, AZStd::placeholders::_2, AZStd::placeholders::_3)); - + ObjectStream::ClassReadyCB readyCB( + [this](void* classPtr, const Uuid& classId, const SerializeContext* sc) + { + OnSettingLoaded(classPtr, classId, sc); + }); + // do not try to load assets during User Settings Provider bootup - we are still initializing the application! // in addition, the file may contain settings we don't understand, from other applications - don't error on those. settingsLoaded = ObjectStream::LoadBlocking(&settingsFileStream, *sc, readyCB, ObjectStream::FilterDescriptor(&AZ::Data::AssetFilterNoAssetLoading, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES)); @@ -104,7 +108,7 @@ namespace AZ { AZStd::vector saveBuffer; AZ::IO::ByteContainerStream> byteStream(&saveBuffer); - + ObjectStream* objStream = ObjectStream::Create(&byteStream, *sc, ObjectStream::ST_XML); bool writtenOk = objStream->WriteClass(&m_settings); bool streamOk = objStream->Finalize(); diff --git a/Code/Framework/AzCore/AzCore/std/function/function_base.h b/Code/Framework/AzCore/AzCore/std/function/function_base.h index 8ceba11239..6aa8a8ebc5 100644 --- a/Code/Framework/AzCore/AzCore/std/function/function_base.h +++ b/Code/Framework/AzCore/AzCore/std/function/function_base.h @@ -23,7 +23,7 @@ #include #define AZSTD_FUNCTION_TARGET_FIX(x) -#define AZSTD_FUNCTION_ENABLE_IF_NOT_INTEGRAL(Functor, Type) AZStd::enable_if_t, Type> +#define AZSTD_FUNCTION_ENABLE_IF_NOT_INTEGRAL(Functor, Type) AZStd::enable_if_t && !std::is_null_pointer_v, Type> diff --git a/Code/Framework/AzCore/AzCore/std/function/function_template.h b/Code/Framework/AzCore/AzCore/std/function/function_template.h index 8e389cb53d..a9c24ca75f 100644 --- a/Code/Framework/AzCore/AzCore/std/function/function_template.h +++ b/Code/Framework/AzCore/AzCore/std/function/function_template.h @@ -531,7 +531,7 @@ namespace AZStd //! A static vtable is used to avoid the need to dynamically allocate a vtable //! whose purpose is to contain a function ptr that can the manage the function buffer //! i.e performs the copy, move and destruction operations for the function buffer - //! as well as to validate if a the stored function can be type_cast to the type supplied in + //! as well as to validate if a the stored function can be type_cast to the type supplied in //! std::function::target //! The vtable other purpose is to store a function ptr that is used to wrap the invocation of the underlying function static vtable_type stored_vtable = get_invoker::template create_vtable>(); @@ -556,7 +556,7 @@ namespace AZStd //! A static vtable is used to avoid the need to dynamically allocate a vtable //! whose purpose is to contain a function ptr that can the manage the function buffer //! i.e performs the copy, move and destruction operations for the function buffer - //! as well as to validate if a the stored function can be type_cast to the type supplied in + //! as well as to validate if a the stored function can be type_cast to the type supplied in //! std::function::target //! The vtable other purpose is to store a function ptr that is used to wrap the invocation of the underlying function static vtable_type stored_vtable = get_invoker::template create_vtable>(); @@ -633,7 +633,7 @@ namespace AZStd {} function(nullptr_t) - : base_type() {} + : base_type(nullptr) {} function(const self_type& f) : base_type(static_cast(f)){} function(const base_type& f) @@ -678,7 +678,7 @@ namespace AZStd return *this; } - R operator()(Args... args) const + R operator()(Args... args) const { return base_type::operator()(AZStd::forward(args)...); } diff --git a/Code/Framework/AzCore/AzCore/std/string/regex.cpp b/Code/Framework/AzCore/AzCore/std/string/regex.cpp index 65f6bc732e..a8604130fe 100644 --- a/Code/Framework/AzCore/AzCore/std/string/regex.cpp +++ b/Code/Framework/AzCore/AzCore/std/string/regex.cpp @@ -31,7 +31,7 @@ namespace AZStd AZ_REGEX_CHAR_CLASS_NAME("upper", RegexTraits::Ch_upper), AZ_REGEX_CHAR_CLASS_NAME("w", RegexTraits::Ch_invalid), AZ_REGEX_CHAR_CLASS_NAME("xdigit", RegexTraits::Ch_xdigit), - {0, 0, 0}, + {nullptr, 0, 0}, }; template<> @@ -52,7 +52,7 @@ namespace AZStd AZ_REGEX_CHAR_CLASS_NAME(L"upper", RegexTraits::Ch_upper), AZ_REGEX_CHAR_CLASS_NAME(L"w", RegexTraits::Ch_invalid), AZ_REGEX_CHAR_CLASS_NAME(L"xdigit", RegexTraits::Ch_xdigit), - {0, 0, 0}, + {nullptr, 0, 0}, }; #undef AZ_REGEX_CHAR_CLASS_NAME } // namespace AZStd diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp index bfc69a05a3..5cf854d49f 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/Module/DynamicModuleHandle_UnixLike.cpp @@ -139,7 +139,7 @@ namespace AZ if (m_handle) { result = dlclose(m_handle) == 0 ? true : false; - m_handle = 0; + m_handle = nullptr; } return result; } diff --git a/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp b/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp index 8f34c7f31f..6b82c642d5 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp @@ -41,12 +41,12 @@ namespace UnitTest AZ_TEST_ASSERT(strcmp(myalloc.get_name(), newName) == 0); AZStd::allocator::pointer_type data = myalloc.allocate(100, 1); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); myalloc.deallocate(data, 100, 1); data = myalloc.allocate(50, 128); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); myalloc.deallocate(data, 50, 128); @@ -153,7 +153,7 @@ namespace UnitTest AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); buffer_alloc_type::pointer_type data = myalloc.allocate(100, 1); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize - 100); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 100); @@ -172,7 +172,7 @@ namespace UnitTest AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); data = myalloc.allocate(50, 64); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(((AZStd::size_t)data & 63) == 0); AZ_TEST_ASSERT(myalloc.get_max_size() <= bufferSize - 50); AZ_TEST_ASSERT(myalloc.get_allocated_size() >= 50); @@ -198,7 +198,7 @@ namespace UnitTest AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); int* data = reinterpret_cast(myalloc.allocate(sizeof(int), 1)); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(myalloc.get_max_size() == (numNodes - 1) * sizeof(int)); AZ_TEST_ASSERT(myalloc.get_allocated_size() == sizeof(int)); @@ -209,7 +209,7 @@ namespace UnitTest for (int i = 0; i < numNodes; ++i) { data = reinterpret_cast(myalloc.allocate(sizeof(int), 1)); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(myalloc.get_max_size() == (numNodes - (i + 1)) * sizeof(int)); AZ_TEST_ASSERT(myalloc.get_allocated_size() == (i + 1) * sizeof(int)); } @@ -231,7 +231,7 @@ namespace UnitTest aligned_int_node_pool_type myaligned_pool; aligned_int_type* aligned_data = reinterpret_cast(myaligned_pool.allocate(sizeof(aligned_int_type), dataAlignment)); - AZ_TEST_ASSERT(aligned_data != 0); + AZ_TEST_ASSERT(aligned_data != nullptr); AZ_TEST_ASSERT(((AZStd::size_t)aligned_data & (dataAlignment - 1)) == 0); AZ_TEST_ASSERT(myaligned_pool.get_max_size() == (numNodes - 1) * sizeof(aligned_int_type)); AZ_TEST_ASSERT(myaligned_pool.get_allocated_size() == sizeof(aligned_int_type)); @@ -267,14 +267,14 @@ namespace UnitTest AZ_TEST_ASSERT(ref_allocator2.get_allocator() == ref_allocator1.get_allocator()); ref_allocator_type::pointer_type data1 = ref_allocator1.allocate(10, 1); - AZ_TEST_ASSERT(data1 != 0); + AZ_TEST_ASSERT(data1 != nullptr); AZ_TEST_ASSERT(ref_allocator1.get_max_size() == bufferSize - 10); AZ_TEST_ASSERT(ref_allocator1.get_allocated_size() == 10); AZ_TEST_ASSERT(shared_allocator.get_max_size() == bufferSize - 10); AZ_TEST_ASSERT(shared_allocator.get_allocated_size() == 10); ref_allocator_type::pointer_type data2 = ref_allocator2.allocate(10, 1); - AZ_TEST_ASSERT(data2 != 0); + AZ_TEST_ASSERT(data2 != nullptr); AZ_TEST_ASSERT(ref_allocator2.get_max_size() <= bufferSize - 20); AZ_TEST_ASSERT(ref_allocator2.get_allocated_size() >= 20); AZ_TEST_ASSERT(shared_allocator.get_max_size() <= bufferSize - 20); @@ -283,14 +283,14 @@ namespace UnitTest shared_allocator.reset(); data1 = ref_allocator1.allocate(10, 32); - AZ_TEST_ASSERT(data1 != 0); + AZ_TEST_ASSERT(data1 != nullptr); AZ_TEST_ASSERT(ref_allocator1.get_max_size() <= bufferSize - 10); AZ_TEST_ASSERT(ref_allocator1.get_allocated_size() >= 10); AZ_TEST_ASSERT(shared_allocator.get_max_size() <= bufferSize - 10); AZ_TEST_ASSERT(shared_allocator.get_allocated_size() >= 10); data2 = ref_allocator2.allocate(10, 32); - AZ_TEST_ASSERT(data2 != 0); + AZ_TEST_ASSERT(data2 != nullptr); AZ_TEST_ASSERT(ref_allocator1.get_max_size() <= bufferSize - 20); AZ_TEST_ASSERT(ref_allocator1.get_allocated_size() >= 20); AZ_TEST_ASSERT(shared_allocator.get_max_size() <= bufferSize - 20); @@ -316,7 +316,7 @@ namespace UnitTest AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); stack_allocator::pointer_type data = myalloc.allocate(100, 1); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize - 100); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 100); @@ -329,7 +329,7 @@ namespace UnitTest AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); data = myalloc.allocate(50, 64); - AZ_TEST_ASSERT(data != 0); + AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(((AZStd::size_t)data & 63) == 0); AZ_TEST_ASSERT(myalloc.get_max_size() <= bufferSize - 50); AZ_TEST_ASSERT(myalloc.get_allocated_size() >= 50); diff --git a/Code/Framework/AzCore/Tests/AZStd/Atomics.cpp b/Code/Framework/AzCore/Tests/AZStd/Atomics.cpp index 57975ad09b..a5da293057 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Atomics.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Atomics.cpp @@ -975,13 +975,13 @@ namespace UnitTest A obj(T(0)); bool b0 = obj.is_lock_free(); ((void)b0); // mark as unused - EXPECT_TRUE(obj == T(0)); + EXPECT_TRUE(obj == T(nullptr)); AZStd::atomic_init(&obj, T(1)); EXPECT_TRUE(obj == T(1)); AZStd::atomic_init(&obj, T(2)); EXPECT_TRUE(obj == T(2)); obj.store(T(0)); - EXPECT_TRUE(obj == T(0)); + EXPECT_TRUE(obj == T(nullptr)); obj.store(T(1), AZStd::memory_order_release); EXPECT_TRUE(obj == T(1)); EXPECT_TRUE(obj.load() == T(1)); @@ -1001,11 +1001,11 @@ namespace UnitTest EXPECT_TRUE(obj.compare_exchange_strong(x, T(1)) == true); EXPECT_TRUE(obj == T(1)); EXPECT_TRUE(x == T(2)); - EXPECT_TRUE(obj.compare_exchange_strong(x, T(0)) == false); + EXPECT_TRUE(obj.compare_exchange_strong(x, T(nullptr)) == false); EXPECT_TRUE(obj == T(1)); EXPECT_TRUE(x == T(1)); - EXPECT_TRUE((obj = T(0)) == T(0)); - EXPECT_TRUE(obj == T(0)); + EXPECT_TRUE((obj = T(nullptr)) == T(nullptr)); + EXPECT_TRUE(obj == T(nullptr)); obj = T(2 * sizeof(X)); EXPECT_TRUE((obj += AZStd::ptrdiff_t(3)) == T(5 * sizeof(X))); EXPECT_TRUE(obj == T(5 * sizeof(X))); @@ -1015,7 +1015,7 @@ namespace UnitTest { alignas(A) char storage[sizeof(A)] = { 23 }; A& zero = *new (storage) A(); - EXPECT_TRUE(zero == T(0)); + EXPECT_TRUE(zero == T(nullptr)); zero.~A(); } } diff --git a/Code/Framework/AzCore/Tests/AZStd/Bitset.cpp b/Code/Framework/AzCore/Tests/AZStd/Bitset.cpp index ed1d59906b..7279e4015a 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Bitset.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Bitset.cpp @@ -127,7 +127,7 @@ namespace UnitTest AZStd::bitset<32> m_bitset1; AZStd::bitset<32> m_bitset2; }; - + TEST_P(BitsetUnsignedLongPairTests, BitwiseANDOperator_MatchesUnsignedLongAND) { EXPECT_EQ((m_bitset1 & m_bitset2).to_ulong(), m_unsignedLong1 & m_unsignedLong2); @@ -316,7 +316,7 @@ namespace UnitTest { for (unsigned long value2 : testCases) { - testCasePairs.push_back(AZStd::pair(value1, value2)); + testCasePairs.emplace_back(value1, value2); } } return testCasePairs; diff --git a/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp b/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp index 6bfda10ddc..2a4c598218 100644 --- a/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/FunctorsBind.cpp @@ -219,7 +219,7 @@ class OtherClass double rubbish; // to ensure this class has non-zero size. public: virtual ~OtherClass() {} - virtual void UnusedVirtualFunction(void) { (void)rubbish; } + virtual void UnusedVirtualFunction() { (void)rubbish; } virtual void TrickyVirtualFunction(int num, char* str) = 0; }; @@ -268,7 +268,7 @@ namespace UnitTest // Assignment to an empty function v1 = five; - AZ_TEST_ASSERT(v1 != 0); + AZ_TEST_ASSERT(v1 != nullptr); // Invocation of a function global_int = 0; @@ -277,7 +277,7 @@ namespace UnitTest // clear() method v1.clear(); - AZ_TEST_ASSERT(v1 == 0); + AZ_TEST_ASSERT(v1 == nullptr); // Assignment to an empty function v1 = three; @@ -303,12 +303,12 @@ namespace UnitTest AZ_TEST_ASSERT(global_int == 5); // clear - v1 = 0; - AZ_TEST_ASSERT(0 == v1); + v1 = nullptr; + AZ_TEST_ASSERT(nullptr == v1); // Assignment to an empty function from a free function v1 = AZSTD_FUNCTION_TARGET_FIX(&) write_five; - AZ_TEST_ASSERT(0 != v1); + AZ_TEST_ASSERT(nullptr != v1); // Invocation global_int = 0; @@ -697,9 +697,9 @@ namespace UnitTest AZ_TEST_ASSERT(global_int == 2); // Test construction from 0 and comparison to 0 - func_void_type v9(0); - AZ_TEST_ASSERT(v9 == 0); - AZ_TEST_ASSERT(0 == v9); + func_void_type v9(nullptr); + AZ_TEST_ASSERT(v9 == nullptr); + AZ_TEST_ASSERT(nullptr == v9); // Test return values typedef function func_int_type; @@ -941,7 +941,7 @@ namespace UnitTest TEST_F(Function, FunctionWithNonAZStdAllocatorDestructsSuccessfully) { - // 64 Byte buffer is used to prevent AZStd::function for storing the + // 64 Byte buffer is used to prevent AZStd::function for storing the // lambda internal storage using the small buffer optimization // Therefore causing the supplied allocator to be used [[maybe_unused]] AZStd::aligned_storage_t<64, 1> bufferToAvoidSmallBufferOptimization; @@ -994,7 +994,7 @@ namespace UnitTest return static_cast(lhs) + rhs; } - // Make sure the functor have a specific size so + // Make sure the functor have a specific size so // that it can be used to test both the AZStd::function small_object_optimization path // and the heap allocated function object path AZStd::aligned_storage_t m_functorPadding; @@ -1044,7 +1044,7 @@ namespace UnitTest TestFunctor testFunctor; AZStd::function testFunction2(AZStd::move(testFunctor)); EXPECT_GT(s_functorMoveConstructorCount, 0); - + double testFunc2Result = testFunction2(16, 4.0); EXPECT_DOUBLE_EQ(20, testFunc2Result); @@ -1068,7 +1068,7 @@ namespace UnitTest AZStd::function testFunction2; testFunction2 = AZStd::move(testFunctor); EXPECT_GT(s_functorMoveConstructorCount + s_functorMoveAssignmentCount, 0); - + double testFunc2Result = testFunction2(16, 4.0); EXPECT_DOUBLE_EQ(20, testFunc2Result); @@ -1643,7 +1643,7 @@ namespace UnitTest AZStd::reference_wrapper refTimeStamp(timeStamp); double result = nestedFunc(32, refTimeStamp, 64.0); EXPECT_EQ(512, timeStamp); - + constexpr double expectedResult = static_cast(32 + 16 + 128.0 + 512); EXPECT_DOUBLE_EQ(expectedResult, result); } diff --git a/Code/Framework/AzCore/Tests/AZStd/Parallel.cpp b/Code/Framework/AzCore/Tests/AZStd/Parallel.cpp index 2743d5e323..f3d4f58250 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Parallel.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Parallel.cpp @@ -195,7 +195,7 @@ namespace UnitTest void test_thread_id_for_running_thread_is_not_default_constructed_id() { - const thread_desc* desc = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc = m_numThreadDesc ? &m_desc[0] : nullptr; AZStd::thread t(AZStd::bind(&Parallel_Thread::do_nothing, this), desc); AZ_TEST_ASSERT(t.get_id() != AZStd::thread::id()); t.join(); @@ -203,8 +203,8 @@ namespace UnitTest void test_different_threads_have_different_ids() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; - const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; + const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : nullptr; AZStd::thread t(AZStd::bind(&Parallel_Thread::do_nothing, this), desc1); AZStd::thread t2(AZStd::bind(&Parallel_Thread::do_nothing, this), desc2); AZ_TEST_ASSERT(t.get_id() != t2.get_id()); @@ -214,9 +214,9 @@ namespace UnitTest void test_thread_ids_have_a_total_order() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; - const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : 0; - const thread_desc* desc3 = m_numThreadDesc ? &m_desc[2] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; + const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : nullptr; + const thread_desc* desc3 = m_numThreadDesc ? &m_desc[2] : nullptr; AZStd::thread t(AZStd::bind(&Parallel_Thread::do_nothing, this), desc1); AZStd::thread t2(AZStd::bind(&Parallel_Thread::do_nothing, this), desc2); @@ -313,7 +313,7 @@ namespace UnitTest void test_thread_id_of_running_thread_returned_by_this_thread_get_id() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; AZStd::thread::id id; AZStd::thread t(AZStd::bind(&Parallel_Thread::get_thread_id, this, &id), desc1); @@ -366,7 +366,7 @@ namespace UnitTest void test_move_on_construction() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; AZStd::thread::id the_id; AZStd::thread x; x = AZStd::thread(AZStd::bind(&Parallel_Thread::do_nothing_id, this, &the_id), desc1); @@ -377,7 +377,7 @@ namespace UnitTest AZStd::thread make_thread(AZStd::thread::id* the_id) { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; return AZStd::thread(AZStd::bind(&Parallel_Thread::do_nothing_id, this, the_id), desc1); } @@ -430,7 +430,7 @@ namespace UnitTest void do_test_creation() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; m_data = 0; AZStd::thread t(AZStd::bind(&Parallel_Thread::simple_thread, this), desc1); t.join(); @@ -445,7 +445,7 @@ namespace UnitTest void do_test_id_comparison() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; AZStd::thread::id self = this_thread::get_id(); AZStd::thread thrd(AZStd::bind(&Parallel_Thread::comparison_thread, this, self), desc1); thrd.join(); @@ -476,7 +476,7 @@ namespace UnitTest void do_test_creation_through_reference_wrapper() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; non_copyable_functor f; AZStd::thread thrd(AZStd::ref(f), desc1); @@ -491,8 +491,8 @@ namespace UnitTest void test_swap() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; - const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; + const thread_desc* desc2 = m_numThreadDesc ? &m_desc[1] : nullptr; AZStd::thread t(AZStd::bind(&Parallel_Thread::simple_thread, this), desc1); AZStd::thread t2(AZStd::bind(&Parallel_Thread::simple_thread, this), desc2); AZStd::thread::id id1 = t.get_id(); @@ -512,7 +512,7 @@ namespace UnitTest void run() { - const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : 0; + const thread_desc* desc1 = m_numThreadDesc ? &m_desc[0] : nullptr; // We need to have at least one processor AZ_TEST_ASSERT(AZStd::thread::hardware_concurrency() >= 1); diff --git a/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp b/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp index f50da28b1f..b6a5a62c05 100644 --- a/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/SmartPtr.cpp @@ -137,7 +137,7 @@ namespace UnitTest static void deleter(int* p) { - EXPECT_TRUE(p == 0); + EXPECT_TRUE(p == nullptr); } struct deleter2 @@ -158,7 +158,7 @@ namespace UnitTest { void operator()(incomplete* p) { - EXPECT_TRUE(p == 0); + EXPECT_TRUE(p == nullptr); } }; @@ -331,7 +331,7 @@ namespace UnitTest AZStd::shared_ptr pv; EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_EQ(0, pv.get()); + EXPECT_EQ(nullptr, pv.get()); EXPECT_EQ(0, pv.use_count()); } @@ -355,35 +355,35 @@ namespace UnitTest TEST_F(SmartPtr, SharedPtrCtorIntPtr) { - m_sharedPtr->TestType(static_cast(0)); - m_sharedPtr->TestType(static_cast(0)); - m_sharedPtr->TestType(static_cast(0)); - m_sharedPtr->TestType(static_cast(0)); + m_sharedPtr->TestType(static_cast(nullptr)); + m_sharedPtr->TestType(static_cast(nullptr)); + m_sharedPtr->TestType(static_cast(nullptr)); + m_sharedPtr->TestType(static_cast(nullptr)); } TEST_F(SmartPtr, SharedPtrCtorConstIntPtr) { - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); } TEST_F(SmartPtr, SharedPtrCtorX) { - m_sharedPtr->TestType(static_cast(0)); - m_sharedPtr->TestType(static_cast(0)); - m_sharedPtr->TestType(static_cast(0)); - m_sharedPtr->TestType(static_cast(0)); + m_sharedPtr->TestType(static_cast(nullptr)); + m_sharedPtr->TestType(static_cast(nullptr)); + m_sharedPtr->TestType(static_cast(nullptr)); + m_sharedPtr->TestType(static_cast(nullptr)); } TEST_F(SmartPtr, SharedPtrCtorXConvert) { - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); - m_sharedPtr->TestNull(static_cast(0)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); + m_sharedPtr->TestNull(static_cast(nullptr)); } TEST_F(SmartPtr, SharedPtrCtorIntValue) @@ -518,15 +518,15 @@ namespace UnitTest TEST_F(SmartPtr, SharedPtrCtorNullDeleter) { { - AZStd::shared_ptr pi(static_cast(0), &SharedPtr::test::deleter); + AZStd::shared_ptr pi(static_cast(nullptr), &SharedPtr::test::deleter); m_sharedPtr->TestPtr(pi, nullptr); } { - AZStd::shared_ptr pv(static_cast(0), &SharedPtr::test::deleter); + AZStd::shared_ptr pv(static_cast(nullptr), &SharedPtr::test::deleter); m_sharedPtr->TestPtr(pv, nullptr); } { - AZStd::shared_ptr pv(static_cast(0), &SharedPtr::test::deleter); + AZStd::shared_ptr pv(static_cast(nullptr), &SharedPtr::test::deleter); m_sharedPtr->TestPtr(pv, nullptr); } } @@ -589,21 +589,21 @@ namespace UnitTest EXPECT_EQ(pi2, pi); EXPECT_FALSE(pi2); EXPECT_TRUE(!pi2); - EXPECT_EQ(0, pi2.get()); + EXPECT_EQ(nullptr, pi2.get()); EXPECT_EQ(pi2.use_count(), pi.use_count()); AZStd::shared_ptr pi3(pi); EXPECT_EQ(pi3, pi); EXPECT_FALSE(pi3); EXPECT_TRUE(!pi3); - EXPECT_EQ(0, pi3.get()); + EXPECT_EQ(nullptr, pi3.get()); EXPECT_EQ(pi3.use_count(), pi.use_count()); AZStd::shared_ptr pi4(pi3); EXPECT_EQ(pi4, pi3); EXPECT_FALSE(pi4); EXPECT_TRUE(!pi4); - EXPECT_EQ(0, pi4.get()); + EXPECT_EQ(nullptr, pi4.get()); EXPECT_EQ(pi4.use_count(), pi3.use_count()); } @@ -615,7 +615,7 @@ namespace UnitTest EXPECT_EQ(pv2, pv); EXPECT_FALSE(pv2); EXPECT_TRUE(!pv2); - EXPECT_EQ(0, pv2.get()); + EXPECT_EQ(nullptr, pv2.get()); EXPECT_EQ(pv2.use_count(), pv.use_count()); } @@ -628,26 +628,26 @@ namespace UnitTest EXPECT_EQ(px, px2); EXPECT_FALSE(px2); EXPECT_TRUE(!px2); - EXPECT_EQ(0, px2.get()); + EXPECT_EQ(nullptr, px2.get()); EXPECT_EQ(px.use_count(), px2.use_count()); AZStd::shared_ptr px3(px); EXPECT_EQ(px, px3); EXPECT_FALSE(px3); EXPECT_TRUE(!px3); - EXPECT_EQ(0, px3.get()); + EXPECT_EQ(nullptr, px3.get()); EXPECT_EQ(px.use_count(), px3.use_count()); } TEST_F(SmartPtr, SharedPtrCopyCtorIntVoidSharedOwnershipTest) { - AZStd::shared_ptr pi(static_cast(0)); + AZStd::shared_ptr pi(static_cast(nullptr)); AZStd::shared_ptr pi2(pi); EXPECT_EQ(pi, pi2); EXPECT_FALSE(pi2); EXPECT_TRUE(!pi2); - EXPECT_EQ(0, pi2.get()); + EXPECT_EQ(nullptr, pi2.get()); EXPECT_EQ(2, pi2.use_count()); EXPECT_FALSE(pi2.unique()); EXPECT_EQ(pi.use_count(), pi2.use_count()); @@ -657,7 +657,7 @@ namespace UnitTest EXPECT_EQ(pi, pi3); EXPECT_FALSE(pi3); EXPECT_TRUE(!pi3); - EXPECT_EQ(0, pi3.get()); + EXPECT_EQ(nullptr, pi3.get()); EXPECT_EQ(3, pi3.use_count()); EXPECT_FALSE(pi3.unique()); EXPECT_EQ(pi.use_count(), pi3.use_count()); @@ -667,7 +667,7 @@ namespace UnitTest EXPECT_EQ(pi2, pi4); EXPECT_FALSE(pi4); EXPECT_TRUE(!pi4); - EXPECT_EQ(0, pi4.get()); + EXPECT_EQ(nullptr, pi4.get()); EXPECT_EQ(4, pi4.use_count()); EXPECT_FALSE(pi4.unique()); EXPECT_EQ(pi2.use_count(), pi4.use_count()); @@ -680,13 +680,13 @@ namespace UnitTest TEST_F(SmartPtr, SharedPtrCopyCtorClassSharedOwnershipTest) { using X = SharedPtr::test::X; - AZStd::shared_ptr px(static_cast(0)); + AZStd::shared_ptr px(static_cast(nullptr)); AZStd::shared_ptr px2(px); EXPECT_EQ(px, px2); EXPECT_FALSE(px2); EXPECT_TRUE(!px2); - EXPECT_EQ(0, px2.get()); + EXPECT_EQ(nullptr, px2.get()); EXPECT_EQ(2, px2.use_count()); EXPECT_FALSE(px2.unique()); EXPECT_EQ(px.use_count(), px2.use_count()); @@ -696,7 +696,7 @@ namespace UnitTest EXPECT_EQ(px, px3); EXPECT_FALSE(px3); EXPECT_TRUE(!px3); - EXPECT_EQ(0, px3.get()); + EXPECT_EQ(nullptr, px3.get()); EXPECT_EQ(3, px3.use_count()); EXPECT_FALSE(px3.unique()); EXPECT_EQ(px.use_count(), px3.use_count()); @@ -706,7 +706,7 @@ namespace UnitTest EXPECT_EQ(px2, px4); EXPECT_FALSE(px4); EXPECT_TRUE(!px4); - EXPECT_EQ(0, px4.get()); + EXPECT_EQ(nullptr, px4.get()); EXPECT_EQ(4, px4.use_count()); EXPECT_FALSE(px4.unique()); EXPECT_EQ(px2.use_count(), px4.use_count()); @@ -871,11 +871,11 @@ namespace UnitTest { AZStd::shared_ptr p2(wp); EXPECT_EQ(wp.use_count(), p2.use_count()); - EXPECT_EQ(0, p2.get()); + EXPECT_EQ(nullptr, p2.get()); AZStd::shared_ptr p3(wp); EXPECT_EQ(wp.use_count(), p3.use_count()); - EXPECT_EQ(0, p3.get()); + EXPECT_EQ(nullptr, p3.get()); } } @@ -927,7 +927,7 @@ namespace UnitTest EXPECT_EQ(p1, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p2; @@ -936,7 +936,7 @@ namespace UnitTest EXPECT_EQ(p2, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p3(p1); @@ -945,7 +945,7 @@ namespace UnitTest EXPECT_EQ(p3, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); } TEST_F(SmartPtr, SharedPtrCopyAssignVoid) @@ -959,7 +959,7 @@ namespace UnitTest EXPECT_EQ(p1, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p2; @@ -968,7 +968,7 @@ namespace UnitTest EXPECT_EQ(p2, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p3(p1); @@ -977,7 +977,7 @@ namespace UnitTest EXPECT_EQ(p3, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p4(new int); EXPECT_EQ(1, p4.use_count()); @@ -1007,7 +1007,7 @@ namespace UnitTest EXPECT_EQ(p1, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p2; @@ -1016,7 +1016,7 @@ namespace UnitTest EXPECT_EQ(p2, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p3(p1); @@ -1025,7 +1025,7 @@ namespace UnitTest EXPECT_EQ(p3, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1065,7 +1065,7 @@ namespace UnitTest EXPECT_EQ(p2, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); AZStd::shared_ptr p4(new int); EXPECT_EQ(1, p4.use_count()); @@ -1098,7 +1098,7 @@ namespace UnitTest EXPECT_EQ(p2, p1); EXPECT_FALSE(p1); EXPECT_TRUE(!p1); - EXPECT_EQ(0, p1.get()); + EXPECT_EQ(nullptr, p1.get()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); EXPECT_EQ(0, m_sharedPtr->m_test.m_yInstances); @@ -1144,17 +1144,17 @@ namespace UnitTest pi.reset(); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 0); } TEST_F(SmartPtr, SharedPtrResetNullInt) { - AZStd::shared_ptr pi(static_cast(0)); + AZStd::shared_ptr pi(static_cast(nullptr)); pi.reset(); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 0); } @@ -1164,7 +1164,7 @@ namespace UnitTest pi.reset(); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 0); } @@ -1175,7 +1175,7 @@ namespace UnitTest px.reset(); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 0); } @@ -1187,7 +1187,7 @@ namespace UnitTest px.reset(); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 0); } @@ -1198,7 +1198,7 @@ namespace UnitTest px.reset(); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 0); } @@ -1211,7 +1211,7 @@ namespace UnitTest px.reset(); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 0); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); } @@ -1222,7 +1222,7 @@ namespace UnitTest pv.reset(); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 0); } @@ -1235,7 +1235,7 @@ namespace UnitTest pv.reset(); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 0); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); } @@ -1244,10 +1244,10 @@ namespace UnitTest { AZStd::shared_ptr pi; - pi.reset(static_cast(0)); + pi.reset(static_cast(nullptr)); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 1); EXPECT_TRUE(pi.unique()); @@ -1259,10 +1259,10 @@ namespace UnitTest EXPECT_TRUE(pi.use_count() == 1); EXPECT_TRUE(pi.unique()); - pi.reset(static_cast(0)); + pi.reset(static_cast(nullptr)); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 1); EXPECT_TRUE(pi.unique()); } @@ -1273,10 +1273,10 @@ namespace UnitTest using Y = SharedPtr::test::Y; AZStd::shared_ptr px; - px.reset(static_cast(0)); + px.reset(static_cast(nullptr)); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1290,10 +1290,10 @@ namespace UnitTest EXPECT_TRUE(px.unique()); EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances); - px.reset(static_cast(0)); + px.reset(static_cast(nullptr)); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1309,10 +1309,10 @@ namespace UnitTest EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances); EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances); - px.reset(static_cast(0)); + px.reset(static_cast(nullptr)); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1325,10 +1325,10 @@ namespace UnitTest using Y = SharedPtr::test::Y; AZStd::shared_ptr pv; - pv.reset(static_cast(0)); + pv.reset(static_cast(nullptr)); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1342,10 +1342,10 @@ namespace UnitTest EXPECT_TRUE(pv.unique()); EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances); - pv.reset(static_cast(0)); + pv.reset(static_cast(nullptr)); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1361,10 +1361,10 @@ namespace UnitTest EXPECT_EQ(1, m_sharedPtr->m_test.m_xInstances); EXPECT_EQ(1, m_sharedPtr->m_test.m_yInstances); - pv.reset(static_cast(0)); + pv.reset(static_cast(nullptr)); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); EXPECT_EQ(0, m_sharedPtr->m_test.m_xInstances); @@ -1375,10 +1375,10 @@ namespace UnitTest { AZStd::shared_ptr pi; - pi.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + pi.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 1); EXPECT_TRUE(pi.unique()); @@ -1386,23 +1386,23 @@ namespace UnitTest int m = 0; pi.reset(&m, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); EXPECT_TRUE(pi ? true : false); EXPECT_TRUE(!!pi); EXPECT_TRUE(pi.get() == &m); EXPECT_TRUE(pi.use_count() == 1); EXPECT_TRUE(pi.unique()); - pi.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + pi.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_TRUE(m_sharedPtr->m_test.deleted == &m); EXPECT_FALSE(pi); EXPECT_TRUE(!pi); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); EXPECT_TRUE(pi.use_count() == 1); EXPECT_TRUE(pi.unique()); pi.reset(); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); } TEST_F(SmartPtr, SharedPtrResetClassWithDeleter) @@ -1411,10 +1411,10 @@ namespace UnitTest using Y = SharedPtr::test::Y; AZStd::shared_ptr px; - px.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + px.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); @@ -1422,40 +1422,40 @@ namespace UnitTest X x(m_sharedPtr->m_test); px.reset(&x, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); EXPECT_TRUE(px ? true : false); EXPECT_TRUE(!!px); EXPECT_TRUE(px.get() == &x); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); - px.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + px.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_TRUE(m_sharedPtr->m_test.deleted == &x); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); Y y(m_sharedPtr->m_test); px.reset(&y, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); EXPECT_TRUE(px ? true : false); EXPECT_TRUE(!!px); EXPECT_TRUE(px.get() == &y); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); - px.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + px.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_TRUE(m_sharedPtr->m_test.deleted == &y); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); px.reset(); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); } TEST_F(SmartPtr, SharedPtrResetVoidClassWithDeleter) @@ -1464,10 +1464,10 @@ namespace UnitTest using Y = SharedPtr::test::Y; AZStd::shared_ptr pv; - pv.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + pv.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); @@ -1475,40 +1475,40 @@ namespace UnitTest X x(m_sharedPtr->m_test); pv.reset(&x, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); EXPECT_TRUE(pv ? true : false); EXPECT_TRUE(!!pv); EXPECT_TRUE(pv.get() == &x); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); - pv.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + pv.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_TRUE(m_sharedPtr->m_test.deleted == &x); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); Y y(m_sharedPtr->m_test); pv.reset(&y, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); EXPECT_TRUE(pv ? true : false); EXPECT_TRUE(!!pv); EXPECT_TRUE(pv.get() == &y); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); - pv.reset(static_cast(0), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); + pv.reset(static_cast(nullptr), SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_TRUE(m_sharedPtr->m_test.deleted == &y); EXPECT_FALSE(pv); EXPECT_TRUE(!pv); - EXPECT_TRUE(pv.get() == 0); + EXPECT_TRUE(pv.get() == nullptr); EXPECT_TRUE(pv.use_count() == 1); EXPECT_TRUE(pv.unique()); pv.reset(); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); } TEST_F(SmartPtr, SharedPtrResetIncompleteNullWithDeleter) @@ -1521,20 +1521,20 @@ namespace UnitTest px.reset(p0, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); EXPECT_FALSE(px); EXPECT_TRUE(!px); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); m_sharedPtr->m_test.deleted = &px; px.reset(p0, SharedPtr::test::deleter_void(m_sharedPtr->m_test.deleted)); - EXPECT_TRUE(m_sharedPtr->m_test.deleted == 0); + EXPECT_TRUE(m_sharedPtr->m_test.deleted == nullptr); } TEST_F(SmartPtr, SharedPtrGetPointerEmpty) { struct X {}; AZStd::shared_ptr px; - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_FALSE(px); EXPECT_TRUE(!px); @@ -1544,8 +1544,8 @@ namespace UnitTest TEST_F(SmartPtr, SharedPtrGetPointerNull) { struct X {}; - AZStd::shared_ptr px(static_cast(0)); - EXPECT_TRUE(px.get() == 0); + AZStd::shared_ptr px(static_cast(nullptr)); + EXPECT_TRUE(px.get() == nullptr); EXPECT_FALSE(px); EXPECT_TRUE(!px); @@ -1555,8 +1555,8 @@ namespace UnitTest TEST_F(SmartPtr, SharedPtrGetPointerCheckedDeleterNull) { struct X {}; - AZStd::shared_ptr px(static_cast(0), AZStd::checked_deleter()); - EXPECT_TRUE(px.get() == 0); + AZStd::shared_ptr px(static_cast(nullptr), AZStd::checked_deleter()); + EXPECT_TRUE(px.get() == nullptr); EXPECT_FALSE(px); EXPECT_TRUE(!px); @@ -1594,7 +1594,7 @@ namespace UnitTest TEST_F(SmartPtr, SharedPtrUseCountNullClass) { struct X {}; - AZStd::shared_ptr px(static_cast(0)); + AZStd::shared_ptr px(static_cast(nullptr)); EXPECT_TRUE(px.use_count() == 1); EXPECT_TRUE(px.unique()); @@ -1641,14 +1641,14 @@ namespace UnitTest px.swap(px2); - EXPECT_TRUE(px.get() == 0); - EXPECT_TRUE(px2.get() == 0); + EXPECT_TRUE(px.get() == nullptr); + EXPECT_TRUE(px2.get() == nullptr); using std::swap; swap(px, px2); - EXPECT_TRUE(px.get() == 0); - EXPECT_TRUE(px2.get() == 0); + EXPECT_TRUE(px.get() == nullptr); + EXPECT_TRUE(px2.get() == nullptr); } TEST_F(SmartPtr, SharedPtrSwapNewClass) @@ -1663,14 +1663,14 @@ namespace UnitTest EXPECT_TRUE(px.get() == p); EXPECT_TRUE(px.use_count() == 2); - EXPECT_TRUE(px2.get() == 0); + EXPECT_TRUE(px2.get() == nullptr); EXPECT_TRUE(px3.get() == p); EXPECT_TRUE(px3.use_count() == 2); using std::swap; swap(px, px2); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); EXPECT_TRUE(px2.get() == p); EXPECT_TRUE(px2.use_count() == 2); EXPECT_TRUE(px3.get() == p); @@ -1876,10 +1876,10 @@ namespace UnitTest AZStd::shared_ptr pv; AZStd::shared_ptr pi = AZStd::static_pointer_cast(pv); - EXPECT_TRUE(pi.get() == 0); + EXPECT_TRUE(pi.get() == nullptr); AZStd::shared_ptr px = AZStd::static_pointer_cast(pv); - EXPECT_TRUE(px.get() == 0); + EXPECT_TRUE(px.get() == nullptr); } TEST_F(SmartPtr, SharedPtrStaticPointerCastNewIntToVoid) @@ -1946,7 +1946,7 @@ namespace UnitTest AZStd::shared_ptr px; AZStd::shared_ptr px2 = AZStd::const_pointer_cast(px); - EXPECT_TRUE(px2.get() == 0); + EXPECT_TRUE(px2.get() == nullptr); } TEST_F(SmartPtr, SharedPtrIntConstPointerCastInt) @@ -1954,7 +1954,7 @@ namespace UnitTest AZStd::shared_ptr px; AZStd::shared_ptr px2 = AZStd::const_pointer_cast(px); - EXPECT_TRUE(px2.get() == 0); + EXPECT_TRUE(px2.get() == nullptr); } TEST_F(SmartPtr, SharedPtrClassConstPointerCastClass) @@ -1963,7 +1963,7 @@ namespace UnitTest AZStd::shared_ptr px; AZStd::shared_ptr px2 = AZStd::const_pointer_cast(px); - EXPECT_TRUE(px2.get() == 0); + EXPECT_TRUE(px2.get() == nullptr); } TEST_F(SmartPtr, SharedPtrVoidVolatileConstPointerCastVoid) diff --git a/Code/Framework/AzCore/Tests/AZStd/String.cpp b/Code/Framework/AzCore/Tests/AZStd/String.cpp index 4c6687b00d..91d2237ca2 100644 --- a/Code/Framework/AzCore/Tests/AZStd/String.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/String.cpp @@ -444,7 +444,7 @@ namespace UnitTest str2.back() = 'p'; AZ_TEST_ASSERT(str2.back() == 'p'); - AZ_TEST_ASSERT(str2.c_str() != 0); + AZ_TEST_ASSERT(str2.c_str() != nullptr); AZ_TEST_ASSERT(::strlen(str2.c_str()) == str2.length()); str2.resize(30, 'm'); @@ -793,7 +793,7 @@ namespace UnitTest AZ_TEST_ASSERT(alphanum_comp(strdup("Alpha 2 B"), strA) > 0); // show usage of the comparison functor with a set - typedef set > StringSetType; + using StringSetType = set>; StringSetType s; s.insert("Xiph Xlater 58"); s.insert("Xiph Xlater 5000"); @@ -879,7 +879,7 @@ namespace UnitTest AZ_TEST_ASSERT(*setIt++ == "Xiph Xlater 10000"); // show usage of comparison functor with a map - typedef map > StringIntMapType; + using StringIntMapType = map>; StringIntMapType m; m["z1.doc"] = 1; m["z10.doc"] = 2; @@ -1441,7 +1441,7 @@ namespace UnitTest TEST_F(String, String_FormatOnlyAllowsValidArgs) { - constexpr bool v1 = 0; + constexpr bool v1 = false; constexpr char v2 = 0; constexpr unsigned char v3 = 0; constexpr signed char v4 = 0; diff --git a/Code/Framework/AzCore/Tests/AZStd/VectorAndArray.cpp b/Code/Framework/AzCore/Tests/AZStd/VectorAndArray.cpp index 933db73c3f..47c3630091 100644 --- a/Code/Framework/AzCore/Tests/AZStd/VectorAndArray.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/VectorAndArray.cpp @@ -824,7 +824,7 @@ namespace UnitTest {1, 2, 3, 4} }; AZ_TEST_ASSERT(myArr.empty() == false); - AZ_TEST_ASSERT(myArr.data() != 0); + AZ_TEST_ASSERT(myArr.data() != nullptr); AZ_TEST_ASSERT(myArr.size() == 10); AZ_TEST_ASSERT(myArr.front() == 1); AZ_TEST_ASSERT(myArr.back() == 0); diff --git a/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp b/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp index e25c3dbcf7..8ce3747620 100644 --- a/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp +++ b/Code/Framework/AzCore/Tests/Asset/AssetManagerLoadingTests.cpp @@ -52,7 +52,7 @@ namespace UnitTest AssetLoadBus::Handler::BusConnect(m_assetId); } } - ~OnAssetReadyListener() + ~OnAssetReadyListener() override { m_assetId.SetInvalid(); m_latest = {}; @@ -109,7 +109,7 @@ namespace UnitTest { BusConnect(assetId); } - ~ContainerReadyListener() + ~ContainerReadyListener() override { BusDisconnect(); } @@ -2658,7 +2658,7 @@ namespace UnitTest m_canceled = true; } - ~CancelListener() + ~CancelListener() override { BusDisconnect(); } diff --git a/Code/Framework/AzCore/Tests/Asset/AssetManagerStreamingTests.cpp b/Code/Framework/AzCore/Tests/Asset/AssetManagerStreamingTests.cpp index 46ff4ff3e7..a683f9630e 100644 --- a/Code/Framework/AzCore/Tests/Asset/AssetManagerStreamingTests.cpp +++ b/Code/Framework/AzCore/Tests/Asset/AssetManagerStreamingTests.cpp @@ -420,7 +420,7 @@ namespace UnitTest AZ::Data::AssetHandler::LoadResult LoadAssetData( [[maybe_unused]] const AZ::Data::Asset& asset, [[maybe_unused]] AZStd::shared_ptr stream, - [[maybe_unused]] const AZ::Data::AssetFilterCB& assetLoadFilterCB) + [[maybe_unused]] const AZ::Data::AssetFilterCB& assetLoadFilterCB) override { return AZ::Data::AssetHandler::LoadResult::LoadComplete; } diff --git a/Code/Framework/AzCore/Tests/EventTests.cpp b/Code/Framework/AzCore/Tests/EventTests.cpp index aaa70344e7..cb86ef0c17 100644 --- a/Code/Framework/AzCore/Tests/EventTests.cpp +++ b/Code/Framework/AzCore/Tests/EventTests.cpp @@ -398,7 +398,7 @@ namespace Benchmark { public: EBusPerfBaselineImplEmpty() { EBusPerfBaselineBus::Handler::BusConnect(); } - ~EBusPerfBaselineImplEmpty() { EBusPerfBaselineBus::Handler::BusDisconnect(); } + ~EBusPerfBaselineImplEmpty() override { EBusPerfBaselineBus::Handler::BusDisconnect(); } void OnSignal(int32_t) override {} }; @@ -418,7 +418,7 @@ namespace Benchmark { public: EBusPerfBaselineImplIncrement() { EBusPerfBaselineBus::Handler::BusConnect(); } - ~EBusPerfBaselineImplIncrement() { EBusPerfBaselineBus::Handler::BusDisconnect(); } + ~EBusPerfBaselineImplIncrement() override { EBusPerfBaselineBus::Handler::BusDisconnect(); } void SetIncrementCounter(int32_t* incrementCounter) { m_incrementCounter = incrementCounter; } void OnSignal(int32_t) override { ++(*m_incrementCounter); } int32_t* m_incrementCounter; diff --git a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp index 41e0ac3f09..2fca03bc59 100644 --- a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp +++ b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp @@ -870,11 +870,11 @@ namespace Benchmark , public ::UnitTest::AllocatorsBase { public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) + void SetUp([[maybe_unused]] const ::benchmark::State& state) override { ::UnitTest::AllocatorsBase::SetupAllocator(); } - void TearDown([[maybe_unused]] const ::benchmark::State& state) + void TearDown([[maybe_unused]] const ::benchmark::State& state) override { ::UnitTest::AllocatorsBase::TeardownAllocator(); } diff --git a/Code/Framework/AzCore/Tests/Jobs.cpp b/Code/Framework/AzCore/Tests/Jobs.cpp index b88e1f5b32..b63e139dd0 100644 --- a/Code/Framework/AzCore/Tests/Jobs.cpp +++ b/Code/Framework/AzCore/Tests/Jobs.cpp @@ -184,7 +184,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(Vector3SumJob, ThreadPoolAllocator, 0) - Vector3SumJob(const Vector3* array, unsigned int size, Vector3* result, JobContext* context = NULL) + Vector3SumJob(const Vector3* array, unsigned int size, Vector3* result, JobContext* context = nullptr) : Job(true, context) , m_array(array) , m_size(size) @@ -284,7 +284,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(FibonacciJobJoin, ThreadPoolAllocator, 0) - FibonacciJobJoin(int* result, JobContext* context = NULL) + FibonacciJobJoin(int* result, JobContext* context = nullptr) : Job(true, context) , m_result(result) { @@ -304,7 +304,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(FibonacciJobFork, ThreadPoolAllocator, 0) - FibonacciJobFork(int n, int* result, JobContext* context = NULL) + FibonacciJobFork(int n, int* result, JobContext* context = nullptr) : Job(true, context) , m_n(n) , m_result(result) @@ -374,7 +374,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(FibonacciJob2, ThreadPoolAllocator, 0) - FibonacciJob2(int n, int* result, JobContext* context = NULL) + FibonacciJob2(int n, int* result, JobContext* context = nullptr) : Job(true, context) , m_n(n) , m_result(result) @@ -441,7 +441,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(MergeSortJobJoin, ThreadPoolAllocator, 0) - MergeSortJobJoin(int* array, int* tempArray, int size1, int size2, JobContext* context = NULL) + MergeSortJobJoin(int* array, int* tempArray, int size1, int size2, JobContext* context = nullptr) : Job(true, context) , m_array(array) , m_tempArray(tempArray) @@ -496,7 +496,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(MergeSortJobFork, ThreadPoolAllocator, 0) - MergeSortJobFork(int* array, int* tempArray, int size, JobContext* context = NULL) + MergeSortJobFork(int* array, int* tempArray, int size, JobContext* context = nullptr) : Job(true, context) , m_array(array) , m_tempArray(tempArray) @@ -585,7 +585,7 @@ namespace UnitTest public: AZ_CLASS_ALLOCATOR(QuickSortJob, ThreadPoolAllocator, 0) - QuickSortJob(int* array, int left, int right, JobContext* context = NULL) + QuickSortJob(int* array, int left, int right, JobContext* context = nullptr) : Job(true, context) , m_array(array) , m_left(left) diff --git a/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp index e4314f9cfb..9aed29005d 100644 --- a/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp @@ -22,7 +22,7 @@ namespace Benchmark : public benchmark::Fixture { public: - void SetUp([[maybe_unused]] const::benchmark::State& state) + void SetUp([[maybe_unused]] const::benchmark::State& state) override { m_testDataArray.resize(1000); diff --git a/Code/Framework/AzCore/Tests/Memory.cpp b/Code/Framework/AzCore/Tests/Memory.cpp index ea6495755e..611af827d2 100644 --- a/Code/Framework/AzCore/Tests/Memory.cpp +++ b/Code/Framework/AzCore/Tests/Memory.cpp @@ -90,7 +90,7 @@ namespace UnitTest #else static const int numAllocations = 10000; #endif - void* addresses[numAllocations] = {0}; + void* addresses[numAllocations] = {nullptr}; IAllocatorAllocate& sysAlloc = AllocatorInstance::Get(); @@ -242,7 +242,7 @@ namespace UnitTest ////////////////////////////////////////////////////////////////////////// // realloc test - address[0] = NULL; + address[0] = nullptr; static const unsigned int checkValue = 0x0badbabe; // create tree (non pool) allocation (we usually pool < 256 bytes) address[0] = sysAlloc.Allocate(2048, 16); @@ -372,7 +372,7 @@ namespace UnitTest poolAllocator.GetRecords()->unlock(); } - for (i = 0; address[i] != 0; ++i) + for (i = 0; address[i] != nullptr; ++i) { poolAlloc.DeAllocate(address[i]); } @@ -544,7 +544,7 @@ namespace UnitTest #else static const int numAllocations = 10000; #endif - void* addresses[numAllocations] = {0}; + void* addresses[numAllocations] = {nullptr}; IAllocatorAllocate& poolAlloc = AllocatorInstance::Get(); @@ -665,7 +665,7 @@ namespace UnitTest poolAllocator.GetRecords()->unlock(); } - for (int i = 0; address[i] != 0; ++i) + for (int i = 0; address[i] != nullptr; ++i) { poolAlloc.DeAllocate(address[i]); } @@ -820,7 +820,7 @@ namespace UnitTest AllocatorInstance::Create(sysDesc); BestFitExternalMapAllocator::Descriptor desc; - desc.m_mapAllocator = NULL; // use the system allocator + desc.m_mapAllocator = nullptr; // use the system allocator desc.m_memoryBlockByteSize = 4 * 1024 * 1024; desc.m_memoryBlock = azmalloc(desc.m_memoryBlockByteSize, desc.m_memoryBlockAlignment); diff --git a/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp b/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp index cb2b32e212..aaf4ce1811 100644 --- a/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp +++ b/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp @@ -121,13 +121,13 @@ namespace Benchmark : public ::benchmark::Fixture { public: - void SetUp(const ::benchmark::State& state) + void SetUp(const ::benchmark::State& state) override { AZ_UNUSED(state); AZ::AllocatorInstance::Create(); } - void TearDown(const ::benchmark::State& state) + void TearDown(const ::benchmark::State& state) override { AZ_UNUSED(state); AZ::AllocatorInstance::Destroy(); diff --git a/Code/Framework/AzCore/Tests/Name/NameJsonSerializerTests.cpp b/Code/Framework/AzCore/Tests/Name/NameJsonSerializerTests.cpp index 2bca8b5970..7801059535 100644 --- a/Code/Framework/AzCore/Tests/Name/NameJsonSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Name/NameJsonSerializerTests.cpp @@ -28,12 +28,12 @@ namespace JsonSerializationTests AZ::NameDictionary::Destroy(); } - void Reflect(AZStd::unique_ptr& context) + void Reflect(AZStd::unique_ptr& context) override { AZ::Name::Reflect(context.get()); } - void Reflect(AZStd::unique_ptr& context) + void Reflect(AZStd::unique_ptr& context) override { AZ::Name::Reflect(context.get()); } diff --git a/Code/Framework/AzCore/Tests/OrderedEventBenchmarks.cpp b/Code/Framework/AzCore/Tests/OrderedEventBenchmarks.cpp index 7cada35d19..25b2007bea 100644 --- a/Code/Framework/AzCore/Tests/OrderedEventBenchmarks.cpp +++ b/Code/Framework/AzCore/Tests/OrderedEventBenchmarks.cpp @@ -74,7 +74,7 @@ namespace Benchmark { public: EBusPerfBaselineImplEmpty() { EBusPerfBaselineBus::Handler::BusConnect(); } - ~EBusPerfBaselineImplEmpty() { EBusPerfBaselineBus::Handler::BusDisconnect(); } + ~EBusPerfBaselineImplEmpty() override { EBusPerfBaselineBus::Handler::BusDisconnect(); } void OnSignal(int32_t) override {} }; @@ -94,7 +94,7 @@ namespace Benchmark { public: EBusPerfBaselineImplIncrement() { EBusPerfBaselineBus::Handler::BusConnect(); } - ~EBusPerfBaselineImplIncrement() { EBusPerfBaselineBus::Handler::BusDisconnect(); } + ~EBusPerfBaselineImplIncrement() override { EBusPerfBaselineBus::Handler::BusDisconnect(); } void SetIncrementCounter(int32_t* incrementCounter) { m_incrementCounter = incrementCounter; } void OnSignal(int32_t) override { ++(*m_incrementCounter); } int32_t* m_incrementCounter; diff --git a/Code/Framework/AzCore/Tests/Script.cpp b/Code/Framework/AzCore/Tests/Script.cpp index e0301f8974..336e4e5dd0 100644 --- a/Code/Framework/AzCore/Tests/Script.cpp +++ b/Code/Framework/AzCore/Tests/Script.cpp @@ -1382,7 +1382,7 @@ namespace UnitTest static int s_errorCount = 0; IncompleteType* s_globalIncompletePtr = static_cast(AZ_INVALID_POINTER); - IncompleteType* s_globalIncompletePtr1 = 0; + IncompleteType* s_globalIncompletePtr1 = nullptr; void GlobalVarSet(int v) { @@ -2234,7 +2234,7 @@ namespace UnitTest // incomplete types passed by a light-user data (pointer reference) AZ_TEST_ASSERT(s_globalIncompletePtr == reinterpret_cast(AZ_INVALID_POINTER)); - AZ_TEST_ASSERT(s_globalIncompletePtr1 == 0); + AZ_TEST_ASSERT(s_globalIncompletePtr1 == nullptr); script.Execute("globalIncomplete1 = globalIncomplete"); AZ_TEST_ASSERT(s_globalIncompletePtr1 == s_globalIncompletePtr); @@ -3157,7 +3157,7 @@ namespace UnitTest char stackOutput[2048]; debugContext->StackTrace(stackOutput, AZ_ARRAY_SIZE(stackOutput)); AZ_Printf("Script", "%s", stackOutput); - AZ_TEST_ASSERT(strstr(stackOutput, "GlobalFunction") != 0); + AZ_TEST_ASSERT(strstr(stackOutput, "GlobalFunction") != nullptr); AZ_TEST_ASSERT(breakpoint->m_lineNumber == 20); } else if (m_numBreakpointHits == 2) @@ -3193,7 +3193,7 @@ namespace UnitTest char stackOutput[2048]; debugContext->StackTrace(stackOutput, AZ_ARRAY_SIZE(stackOutput)); AZ_Printf("Script", "%s", stackOutput); - AZ_TEST_ASSERT(strstr(stackOutput, "GlobalMult") != 0); + AZ_TEST_ASSERT(strstr(stackOutput, "GlobalMult") != nullptr); AZ_TEST_ASSERT(breakpoint->m_lineNumber == 23); } diff --git a/Code/Framework/AzCore/Tests/Serialization.cpp b/Code/Framework/AzCore/Tests/Serialization.cpp index 9ff2925472..e554945b55 100644 --- a/Code/Framework/AzCore/Tests/Serialization.cpp +++ b/Code/Framework/AzCore/Tests/Serialization.cpp @@ -2231,7 +2231,7 @@ TEST_F(SerializeBasicTest, BasicTypeTest_Succeed) (void)classId; DeprecationTestClass* obj = reinterpret_cast(classPtr); EXPECT_EQ( 0, obj->m_deprecated.m_data ); - EXPECT_EQ( NULL, obj->m_deprecatedPtr ); + EXPECT_EQ( nullptr, obj->m_deprecatedPtr ); EXPECT_EQ( 0, obj->m_oldClassData ); EXPECT_EQ( 0.f, obj->m_newClassData ); EXPECT_EQ( 0, obj->m_missingMember ); @@ -4057,7 +4057,7 @@ namespace UnitTest if (strcmp(classData->m_name, "MyEditStruct") == 0) { - EXPECT_TRUE(classData->m_editData != NULL); + EXPECT_TRUE(classData->m_editData != nullptr); EXPECT_EQ( 0, strcmp(classData->m_editData->m_name, "MyEditStruct") ); EXPECT_EQ( 0, strcmp(classData->m_editData->m_description, "My edit struct class used for ...") ); EXPECT_EQ( 2, classData->m_editData->m_elements.size() ); @@ -4071,12 +4071,12 @@ namespace UnitTest // Number of options attribute EXPECT_EQ(classElement->m_editData->m_attributes[0].first, AZ_CRC("NumOptions", 0x90274abc)); Edit::AttributeData* intData = azrtti_cast*>(classElement->m_editData->m_attributes[0].second); - EXPECT_TRUE(intData != NULL); + EXPECT_TRUE(intData != nullptr); EXPECT_EQ( 3, intData->Get(instance) ); // Get options attribute EXPECT_EQ( classElement->m_editData->m_attributes[1].first, AZ_CRC("Options", 0xd035fa87)); Edit::AttributeFunction* funcData = azrtti_cast*>(classElement->m_editData->m_attributes[1].second); - EXPECT_TRUE(funcData != NULL); + EXPECT_TRUE(funcData != nullptr); EXPECT_EQ( 20, funcData->Invoke(instance, 10) ); } return true; diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp index 4dc74779f2..e410ba9ca4 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp @@ -58,7 +58,7 @@ namespace JsonSerializationTests return array; } - AZStd::shared_ptr CreatePartialDefaultInstance() + AZStd::shared_ptr CreatePartialDefaultInstance() override { auto array = AZStd::make_shared(); (*array)[0] = 10; @@ -128,7 +128,7 @@ namespace JsonSerializationTests return array; } - AZStd::shared_ptr CreatePartialDefaultInstance() + AZStd::shared_ptr CreatePartialDefaultInstance() override { auto partialInstance = aznew MultipleInheritence(); partialInstance->m_var1 = 142; diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp index 41b17f9ade..4979df04be 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp @@ -169,7 +169,7 @@ namespace JsonSerializationTests return AZStd::shared_ptr(new Map{}, &Delete); } - AZStd::shared_ptr CreatePartialDefaultInstance() + AZStd::shared_ptr CreatePartialDefaultInstance() override { auto instance = AZStd::shared_ptr(new Map{}, &Delete); instance->emplace(AZStd::make_pair(aznew SimpleClass(), aznew SimpleClass(188, 188.0))); diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/StringSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/StringSerializerTests.cpp index a2a3d42ebb..af6dedb51b 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/StringSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/StringSerializerTests.cpp @@ -33,7 +33,7 @@ namespace JsonSerializationTests return AZStd::make_shared("Hello"); } - AZStd::string_view GetJsonForFullySetInstance() + AZStd::string_view GetJsonForFullySetInstance() override { return R"("Hello")"; } @@ -48,7 +48,7 @@ namespace JsonSerializationTests features.m_supportsInjection = false; } - bool AreEqual(const String& lhs, const String& rhs) + bool AreEqual(const String& lhs, const String& rhs) override { return lhs.compare(rhs) == 0; } diff --git a/Code/Framework/AzCore/Tests/Settings/SettingsRegistryConsoleUtilsTests.cpp b/Code/Framework/AzCore/Tests/Settings/SettingsRegistryConsoleUtilsTests.cpp index 5b18faa3d1..6bcd57f849 100644 --- a/Code/Framework/AzCore/Tests/Settings/SettingsRegistryConsoleUtilsTests.cpp +++ b/Code/Framework/AzCore/Tests/Settings/SettingsRegistryConsoleUtilsTests.cpp @@ -147,7 +147,7 @@ namespace SettingsRegistryConsoleUtilsTests struct SettingsRegistryDumpCommandHandler : public AZ::Debug::TraceMessageBus::Handler { - bool OnOutput(const char* window, const char* message) + bool OnOutput(const char* window, const char* message) override { if (window == AZStd::string_view("SettingsRegistry")) { @@ -218,7 +218,7 @@ namespace SettingsRegistryConsoleUtilsTests , m_expectedValue2{ expectedValue2 } { } - bool OnOutput(const char* window, const char* message) + bool OnOutput(const char* window, const char* message) override { if (window == AZStd::string_view("SettingsRegistry")) { diff --git a/Code/Framework/AzCore/Tests/Statistics.cpp b/Code/Framework/AzCore/Tests/Statistics.cpp index 941c2eff0b..4577618d5a 100644 --- a/Code/Framework/AzCore/Tests/Statistics.cpp +++ b/Code/Framework/AzCore/Tests/Statistics.cpp @@ -40,7 +40,7 @@ namespace UnitTest } } - ~StatisticsTest() + ~StatisticsTest() override { } diff --git a/Code/Framework/AzCore/Tests/Streamer/BlockCacheTests.cpp b/Code/Framework/AzCore/Tests/Streamer/BlockCacheTests.cpp index f770af57be..3a107da61d 100644 --- a/Code/Framework/AzCore/Tests/Streamer/BlockCacheTests.cpp +++ b/Code/Framework/AzCore/Tests/Streamer/BlockCacheTests.cpp @@ -184,7 +184,7 @@ namespace AZ::IO size = size >> 2; for (u64 i = 0; i < size; ++i) { - // Using assert here because in case of a problem EXPECT would + // Using assert here because in case of a problem EXPECT would // cause a large amount of log noise. ASSERT_EQ(buffer[i], offset + (i << 2)); } @@ -203,7 +203,9 @@ namespace AZ::IO { do { - while (m_context->FinalizeCompletedRequests()); + while (m_context->FinalizeCompletedRequests()) + { + } } while (m_cache->ExecuteRequests()); } @@ -269,7 +271,7 @@ namespace AZ::IO RedirectReadCalls(); EXPECT_CALL(*this, ReadFile(_, _, 0, m_fakeFileLength)); - + ProcessRead(m_buffer, m_path, 0, m_fakeFileLength, IStreamerTypes::RequestStatus::Completed); VerifyReadBuffer(0, m_fakeFileLength); } @@ -519,8 +521,8 @@ namespace AZ::IO using ::testing::_; using ::testing::Return; - CreateTestEnvironment(); - + CreateTestEnvironment(); + EXPECT_CALL(*m_mock, ExecuteRequests()) .WillOnce(Return(true)) .WillRepeatedly(Return(false)); @@ -553,7 +555,7 @@ namespace AZ::IO RunProcessLoop(); EXPECT_TRUE(allRequestsCompleted); - + VerifyReadBuffer(256, m_fakeFileLength - 512); VerifyReadBuffer(buffer1, m_fakeFileLength - 768, secondReadSize); } @@ -622,7 +624,7 @@ namespace AZ::IO m_fakeFileFound = false; m_fakeFileLength = 0; - + ProcessRead(m_buffer, m_path, 0, m_blockSize, IStreamerTypes::RequestStatus::Failed); } @@ -650,18 +652,18 @@ namespace AZ::IO status.m_isIdle = false; })); EXPECT_CALL(*this, ReadFile(_, _, _, _)).Times(count); - + constexpr size_t scratchBufferSize = 128_kib; using ScratchBuffer = char[scratchBufferSize]; ScratchBuffer buffers[count]; - + bool allRequestsCompleted = true; auto completed = [&allRequestsCompleted](const FileRequest& request) { // Capture result before request is recycled. allRequestsCompleted = allRequestsCompleted && request.GetStatus() == IStreamerTypes::RequestStatus::Completed; }; - + for (size_t i = 0; i < count; ++i) { StreamStackEntry::Status status; @@ -738,7 +740,7 @@ namespace AZ::IO RedirectReadCalls(); EXPECT_CALL(*this, ReadFile(_, _, 256, m_fakeFileLength - 256)); - + ProcessRead(m_buffer, m_path, 256, m_fakeFileLength - 256, IStreamerTypes::RequestStatus::Completed); VerifyReadBuffer(256, m_fakeFileLength - 256); } @@ -1062,7 +1064,7 @@ namespace AZ::IO .WillRepeatedly(Return(false)); EXPECT_CALL(*m_mock, QueueRequest(_)) .WillRepeatedly(Invoke(this, &BlockCacheTest::QueueReadRequest)); - + size_t firstReadSize = m_fakeFileLength - (2 * m_blockSize) - 512; FileRequest* request0 = m_context->GetNewInternalRequest(); request0->CreateRead(nullptr, m_buffer, m_bufferSize, m_path, 256, firstReadSize); @@ -1097,7 +1099,7 @@ namespace AZ::IO VerifyReadBuffer(buffer1.get(), secondReadOffset, secondReadSize); } - + @@ -1146,7 +1148,7 @@ namespace AZ::IO FileRequest* request = m_context->GetNewInternalRequest(); request->CreateFlush(m_path); RunAndCompleteRequest(request, IStreamerTypes::RequestStatus::Completed); - + // The partial read would normally be serviced from the cache, but now triggers another read. EXPECT_CALL(*this, ReadFile(_, _, _, _)).Times(1); ProcessRead(m_buffer, m_path, 512, m_blockSize - 1024, IStreamerTypes::RequestStatus::Completed); @@ -1170,7 +1172,7 @@ namespace AZ::IO FileRequest* request = m_context->GetNewInternalRequest(); request->CreateFlushAll(); RunAndCompleteRequest(request, IStreamerTypes::RequestStatus::Completed); - + // The partial read would normally be serviced from the cache, but now triggers another read. EXPECT_CALL(*this, ReadFile(_, _, _, _)).Times(1); ProcessRead(m_buffer, m_path, 512, m_blockSize - 1024, IStreamerTypes::RequestStatus::Completed); diff --git a/Code/Framework/AzCore/Tests/StringFunc.cpp b/Code/Framework/AzCore/Tests/StringFunc.cpp index 2b6f19736a..68821ba3f9 100644 --- a/Code/Framework/AzCore/Tests/StringFunc.cpp +++ b/Code/Framework/AzCore/Tests/StringFunc.cpp @@ -966,7 +966,7 @@ namespace AZ { public: StringPathFuncTest() = default; - virtual ~StringPathFuncTest() = default; + ~StringPathFuncTest() override = default; }; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp index 8688f6b878..ce0cc23a4e 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp @@ -374,8 +374,8 @@ namespace AZ::IO { public: AZ_CLASS_ALLOCATOR(CResourceList, AZ::SystemAllocator, 0); - CResourceList() { m_iter = m_set.end(); }; - ~CResourceList() {}; + CResourceList() { m_iter = m_set.end(); } + ~CResourceList() override {} void Add(AZStd::string_view sResourceFile) override { @@ -2571,7 +2571,7 @@ namespace AZ::IO return aznumeric_cast(pFileEntry->nFileDataOffset); } - EStreamSourceMediaType Archive::GetFileMediaType(AZStd::string_view szName) const + EStreamSourceMediaType Archive::GetFileMediaType(AZStd::string_view szName) const { auto szFullPath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(szName); if (!szFullPath) diff --git a/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp b/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp index db36a91448..9703e4a993 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/FileOperations.cpp @@ -114,7 +114,7 @@ namespace AZ AZ_Warning("AZ::IO::SmartMove", false, "Unable to move/copy the source file (%s)", sourceFilePath); if (destFileMoved) { - // if we were unable to move/copy the source file to the dest file, + // if we were unable to move/copy the source file to the dest file, // we will try to revert back the destination file from the temp file. if (!fileIO->Rename(tmpDestFile.c_str(), destinationFilePath)) { @@ -124,7 +124,7 @@ namespace AZ return ResultCode::Error; } - // removing the source file if copy succeeds + // removing the source file if copy succeeds if (!fileIO->Remove(sourceFilePath)) { AZ_Warning("AZ::IO::SmartMove", false, "Unable to delete the source file (%s)", sourceFilePath); @@ -140,7 +140,7 @@ namespace AZ return ResultCode::Error; } } - + return ResultCode::Success; } @@ -158,7 +158,7 @@ namespace AZ const int s_MaxCreateTempFileTries = 16; AZStd::string fullPath, fileName; tempFile.clear(); - + if (!AzFramework::StringFunc::Path::GetFullPath(file, fullPath)) { AZ_Warning("AZ::IO::CreateTempFileName", false, " Filepath needs to be an absolute path: '%s'", file); @@ -170,7 +170,7 @@ namespace AZ AZ_Warning("AZ::IO::CreateTempFileName", false, " Filepath needs to be an absolute path: '%s'", file); return false; } - + for (int idx = 0; idx < s_MaxCreateTempFileTries; idx++) { AzFramework::StringFunc::Path::ConstructFull(fullPath.c_str(), AZStd::string::format("$tmp%d_%s", rand(), fileName.c_str()).c_str(), tempFile, true); @@ -235,7 +235,7 @@ namespace AZ fileIO->Read(fileHandle, buffer, bufferSize - 1, false, &bytesRead); if (!bytesRead) { - return 0; + return nullptr; } char* currentPosition = buffer; diff --git a/Code/Framework/AzFramework/AzFramework/Input/Devices/InputDevice.cpp b/Code/Framework/AzFramework/AzFramework/Input/Devices/InputDevice.cpp index f1b4e02b2d..2f44f80eba 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Devices/InputDevice.cpp +++ b/Code/Framework/AzFramework/AzFramework/Input/Devices/InputDevice.cpp @@ -39,7 +39,7 @@ namespace AzFramework } //////////////////////////////////////////////////////////////////////////////////////////// - void OnInputDeviceDisconnectedEvent(const InputDevice& inputDevice) + void OnInputDeviceDisconnectedEvent(const InputDevice& inputDevice) override { Call(FN_OnInputDeviceDisconnectedEvent, &inputDevice); } diff --git a/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp b/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp index aa1344fa4f..d5ba65425c 100644 --- a/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.cpp @@ -101,7 +101,7 @@ namespace AzFramework if (m_logFile) { delete m_logFile; - m_logFile = NULL; + m_logFile = nullptr; } } diff --git a/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp b/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp index 994d93d99e..4ac97cf041 100644 --- a/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp +++ b/Code/Framework/AzFramework/AzFramework/Physics/Material.cpp @@ -28,7 +28,7 @@ namespace Physics class MaterialLibraryAssetEventHandler : public AZ::SerializeContext::IEventHandler { - void OnReadBegin(void* classPtr) + void OnReadBegin(void* classPtr) override { auto matAsset = static_cast(classPtr); matAsset->GenerateMissingIds(); @@ -38,7 +38,7 @@ namespace Physics class MaterialSelectionEventHandler : public AZ::SerializeContext::IEventHandler { - void OnReadEnd(void* classPtr) + void OnReadEnd(void* classPtr) override { auto materialSelection = static_cast(classPtr); if (materialSelection->GetMaterialIdsAssignedToSlots().empty()) @@ -362,8 +362,8 @@ namespace Physics MaterialId MaterialId::Create() { - MaterialId id; - id.m_id = AZ::Uuid::Create(); + MaterialId id; + id.m_id = AZ::Uuid::Create(); return id; } @@ -425,7 +425,7 @@ namespace Physics } else { - // If there is more than one material slot + // If there is more than one material slot // the caller must use SetMaterialSlots function return ""; } diff --git a/Code/Framework/AzFramework/AzFramework/Script/ScriptRemoteDebugging.cpp b/Code/Framework/AzFramework/AzFramework/Script/ScriptRemoteDebugging.cpp index 06fd8acd79..011d967631 100644 --- a/Code/Framework/AzFramework/AzFramework/Script/ScriptRemoteDebugging.cpp +++ b/Code/Framework/AzFramework/AzFramework/Script/ScriptRemoteDebugging.cpp @@ -174,25 +174,25 @@ namespace AzFramework ScriptDebugAgent() = default; ////////////////////////////////////////////////////////////////////////// // Component base - virtual void Init(); - virtual void Activate(); - virtual void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // AZ::SystemTickBus - virtual void OnSystemTick(); + void OnSystemTick() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // ScriptDebugAgentBus - virtual void RegisterContext(AZ::ScriptContext* sc, const char* name); - virtual void UnregisterContext(AZ::ScriptContext* sc); + void RegisterContext(AZ::ScriptContext* sc, const char* name) override; + void UnregisterContext(AZ::ScriptContext* sc) override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // TmMsgBus - virtual void OnReceivedMsg(TmMsgPtr msg); + void OnReceivedMsg(TmMsgPtr msg) override; ////////////////////////////////////////////////////////////////////////// protected: @@ -241,10 +241,10 @@ namespace AzFramework void ScriptDebugAgent::Activate() { m_executionState = SDA_STATE_DETACHED; - m_curContext = NULL; + m_curContext = nullptr; // register default app script context if there is one - AZ::ScriptContext* defaultScriptContext = NULL; + AZ::ScriptContext* defaultScriptContext = nullptr; EBUS_EVENT_RESULT(defaultScriptContext, AZ::ScriptSystemRequestBus, GetContext, AZ::ScriptContextIds::DefaultScriptContextId); if (defaultScriptContext) { @@ -379,7 +379,7 @@ namespace AzFramework AZ_TracePrintf("LUA", "Remote debugger %s has detached from context 0x%p.\n", m_debugger.GetDisplayName(), m_curContext); m_debugger = TargetInfo(); - m_curContext = NULL; + m_curContext = nullptr; m_executionState = SDA_STATE_DETACHED; } //------------------------------------------------------------------------- @@ -435,7 +435,7 @@ namespace AzFramework void ScriptDebugAgent::Process() { // Process messages - AZ::ScriptContextDebug* dbgContext = m_curContext ? m_curContext->GetDebugContext() : NULL; + AZ::ScriptContextDebug* dbgContext = m_curContext ? m_curContext->GetDebugContext() : nullptr; while (!m_msgQueue.empty()) { m_msgMutex.lock(); diff --git a/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementComponent.cpp b/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementComponent.cpp index c1ce31613c..1c26cbc744 100644 --- a/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementComponent.cpp +++ b/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementComponent.cpp @@ -562,7 +562,7 @@ namespace AzFramework void TargetManagementComponent::SetMyPersistentName(const char* name) { - AZ_Assert(m_networkImpl->m_session == NULL, "We cannot change our neighborhood while connected!"); + AZ_Assert(m_networkImpl->m_session == nullptr, "We cannot change our neighborhood while connected!"); m_settings->m_persistentName = name; } @@ -585,7 +585,7 @@ namespace AzFramework void TargetManagementComponent::SetNeighborhood(const char* name) { - AZ_Assert(m_networkImpl->m_session == NULL, "We cannot change our neighborhood while connected!"); + AZ_Assert(m_networkImpl->m_session == nullptr, "We cannot change our neighborhood while connected!"); m_settings->m_neighborhoodName = name; } @@ -714,7 +714,7 @@ namespace AzFramework { GridMate::GridMember* member = m_networkImpl->m_session->GetMemberByIndex(i); GridMate::MemberIDCompact memberId = member->GetId().Compact(); - const TargetInfo* target = NULL; + const TargetInfo* target = nullptr; AZ::u32 targetId = 0; for (TargetContainer::const_iterator targetIt = m_availableTargets.begin(); targetIt != m_availableTargets.end(); ++targetIt) { @@ -742,7 +742,7 @@ namespace AzFramework AZ::IO::MemoryStream msgBuffer(m_tmpInboundBuffer.data(), result.m_numBytes, result.m_numBytes); TmMsg* msg = nullptr; AZ::ObjectStream::ClassReadyCB readyCB(AZStd::bind(&TargetManagementComponent::OnMsgParsed, this, &msg, AZStd::placeholders::_1, AZStd::placeholders::_2, AZStd::placeholders::_3)); - AZ::ObjectStream::LoadBlocking(&msgBuffer, *m_serializeContext, readyCB, AZ::ObjectStream::FilterDescriptor(0, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES)); + AZ::ObjectStream::LoadBlocking(&msgBuffer, *m_serializeContext, readyCB, AZ::ObjectStream::FilterDescriptor(nullptr, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES)); if (msg) { if (msg->GetCustomBlobSize() > 0) diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp index eb4165453e..407e256052 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp @@ -24,7 +24,7 @@ namespace AzFramework LinuxXcbConnectionManagerBus::Handler::BusConnect(); } - ~LinuxXcbConnectionManagerImpl() + ~LinuxXcbConnectionManagerImpl() override { LinuxXcbConnectionManagerBus::Handler::BusDisconnect(); xcb_disconnect(m_xcbConnection); diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp index 0249a42976..f8cc26b19b 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessCommunicator_Linux.cpp @@ -78,7 +78,7 @@ namespace AzFramework FD_ZERO(&set); FD_SET(handle->GetHandle(), &set); - [[maybe_unused]] int numReady = select(handle->GetHandle() + 1, &set, NULL, NULL, NULL); + [[maybe_unused]] int numReady = select(handle->GetHandle() + 1, &set, nullptr, nullptr, nullptr); // if numReady == -1 and errno == EINTR then the child process died unexpectedly and // the handle was closed. Not something to assert about in regards to trying to read diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp index eb60b8e6ae..2d29fac73d 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp @@ -277,7 +277,7 @@ namespace AzFramework environmentVariables[i][0] = '\0'; azstrcat(environmentVariables[i], envVarString.size(), envVarString.c_str()); } - environmentVariables[numEnvironmentVars] = NULL; + environmentVariables[numEnvironmentVars] = nullptr; } pid_t child_pid = fork(); @@ -373,7 +373,7 @@ namespace AzFramework } bool isProcessDone = false; - time_t startTime = time(0); + time_t startTime = time(nullptr); time_t currentTime = startTime; AZ_Assert(currentTime != -1, "time(0) returned an invalid time"); while (((currentTime - startTime) < waitTimeInSeconds) && !isProcessDone) @@ -385,7 +385,7 @@ namespace AzFramework m_pWatcherData->m_childProcessIsDone = true; break; } - currentTime = time(0); + currentTime = time(nullptr); } //returns false if process is still running after time return isProcessDone; diff --git a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp index 2caaf6ee71..6a359e714c 100644 --- a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp +++ b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp @@ -570,7 +570,7 @@ namespace UnitTest EXPECT_TRUE(found_mylevel_folder); numFound = 0; - found_mylevel_folder = 0; + found_mylevel_folder = false; // now make sure no red herrings appear // for example, if a file is mounted at "@assets@\\uniquename\\mylevel2\\mylevel3\\mylevel4" diff --git a/Code/Framework/AzFramework/Tests/BehaviorEntityTests.cpp b/Code/Framework/AzFramework/Tests/BehaviorEntityTests.cpp index f42a0faeee..3c860a88dd 100644 --- a/Code/Framework/AzFramework/Tests/BehaviorEntityTests.cpp +++ b/Code/Framework/AzFramework/Tests/BehaviorEntityTests.cpp @@ -29,7 +29,7 @@ public: void Activate() override {} void Deactivate() override {} - bool ReadInConfig(const AZ::ComponentConfig* baseConfig) + bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override { if (auto config = azrtti_cast(baseConfig)) { @@ -39,7 +39,7 @@ public: return false; } - bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const + bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override { if (auto outConfig = azrtti_cast(outBaseConfig)) { diff --git a/Code/Framework/AzFramework/Tests/BinToTextEncode.cpp b/Code/Framework/AzFramework/Tests/BinToTextEncode.cpp index b4d4ff63b0..a1ebdfd945 100644 --- a/Code/Framework/AzFramework/Tests/BinToTextEncode.cpp +++ b/Code/Framework/AzFramework/Tests/BinToTextEncode.cpp @@ -46,7 +46,7 @@ namespace UnitTest AllocatorsFixture::TearDown(); } - virtual ~Base64Test() + ~Base64Test() override { } diff --git a/Code/Framework/AzFramework/Tests/EntityContext.cpp b/Code/Framework/AzFramework/Tests/EntityContext.cpp index cb957fa46c..74a4948e04 100644 --- a/Code/Framework/AzFramework/Tests/EntityContext.cpp +++ b/Code/Framework/AzFramework/Tests/EntityContext.cpp @@ -41,7 +41,7 @@ namespace UnitTest Data::AssetManager::Create(desc); } - virtual ~EntityContextBasicTest() + ~EntityContextBasicTest() override { } diff --git a/Code/Framework/AzFramework/Tests/FileIO.cpp b/Code/Framework/AzFramework/Tests/FileIO.cpp index 7a01ba991b..fb95512968 100644 --- a/Code/Framework/AzFramework/Tests/FileIO.cpp +++ b/Code/Framework/AzFramework/Tests/FileIO.cpp @@ -118,7 +118,7 @@ namespace UnitTest AZ::IO::FileIOBase::SetInstance(&m_fileIO); } - ~FileIOStreamTest() + ~FileIOStreamTest() override { } @@ -341,7 +341,7 @@ namespace UnitTest AZ_TEST_ASSERT(!local.Eof(fileHandle)); AZ_TEST_ASSERT(!local.Flush(fileHandle)); AZ_TEST_ASSERT(!local.ModificationTime(fileHandle)); - AZ_TEST_ASSERT(!local.Read(fileHandle, 0, 0, false)); + AZ_TEST_ASSERT(!local.Read(fileHandle, nullptr, 0, false)); AZ_TEST_ASSERT(!local.Tell(fileHandle, fs)); AZ_TEST_ASSERT(!local.Exists((file01Name + "notexist").c_str())); diff --git a/Code/Framework/AzFramework/Tests/NativeWindow.cpp b/Code/Framework/AzFramework/Tests/NativeWindow.cpp index 9554b6ab10..f160d88003 100644 --- a/Code/Framework/AzFramework/Tests/NativeWindow.cpp +++ b/Code/Framework/AzFramework/Tests/NativeWindow.cpp @@ -27,19 +27,19 @@ namespace UnitTest AzFramework::WindowNotificationBus::Handler::BusConnect(m_windowHandle); } - ~NativeWindowListener() + ~NativeWindowListener() override { AzFramework::WindowNotificationBus::Handler::BusDisconnect(m_windowHandle); } // WindowNotificationBus::Handler overrides... - void OnWindowResized(uint32_t width, uint32_t height) + void OnWindowResized(uint32_t width, uint32_t height) override { AZ_UNUSED(width); AZ_UNUSED(height); m_wasOnWindowResizedReceived = true; } - void OnWindowClosed() + void OnWindowClosed() override { m_wasOnWindowClosedReceived = true; } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/DirectManipulatorViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/DirectManipulatorViewportInteraction.cpp index a667af4e20..c9234fe488 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/DirectManipulatorViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/DirectManipulatorViewportInteraction.cpp @@ -34,7 +34,7 @@ namespace AzManipulatorTestFramework ViewportInteractionInterface* viewportInteraction, AZStd::shared_ptr manipulatorManager); // ManipulatorManagerInterface ... - void ConsumeMouseInteractionEvent(const MouseInteractionEvent& event); + void ConsumeMouseInteractionEvent(const MouseInteractionEvent& event) override; AzToolsFramework::ManipulatorManagerId GetId() const override; bool ManipulatorBeingInteracted() const override; diff --git a/Code/Framework/AzNetworking/AzNetworking/Utilities/EncryptionCommon.cpp b/Code/Framework/AzNetworking/AzNetworking/Utilities/EncryptionCommon.cpp index 57badcee4e..3fdfa042a5 100644 --- a/Code/Framework/AzNetworking/AzNetworking/Utilities/EncryptionCommon.cpp +++ b/Code/Framework/AzNetworking/AzNetworking/Utilities/EncryptionCommon.cpp @@ -473,7 +473,7 @@ namespace AzNetworking { const AZ::CVarFixedString contextPassword = (trustZone == TrustZone::ExternalClientToServer) ? net_SslExternalContextPassword : net_SslInternalContextPassword; - SSL_CTX_set_default_passwd_cb(context, NULL); + SSL_CTX_set_default_passwd_cb(context, nullptr); SSL_CTX_set_default_passwd_cb_userdata(context, (void*)contextPassword.c_str()); if (SSL_CTX_use_PrivateKey_file(context, privateKeyPath.c_str(), SSL_FILETYPE_PEM) != OpenSslResultSuccess) diff --git a/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp b/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp index d06aac1a14..9dc7ae0ccf 100644 --- a/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp +++ b/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp @@ -23,12 +23,12 @@ namespace UnitTest : public IConnectionListener { public: - ConnectResult ValidateConnect([[maybe_unused]] const IpAddress& remoteAddress, [[maybe_unused]] const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) + ConnectResult ValidateConnect([[maybe_unused]] const IpAddress& remoteAddress, [[maybe_unused]] const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) override { return ConnectResult::Accepted; } - void OnConnect([[maybe_unused]] IConnection* connection) + void OnConnect([[maybe_unused]] IConnection* connection) override { ; } @@ -40,12 +40,12 @@ namespace UnitTest return PacketDispatchResult::Failure; } - void OnPacketLost([[maybe_unused]] IConnection* connection, [[maybe_unused]] PacketId packetId) + void OnPacketLost([[maybe_unused]] IConnection* connection, [[maybe_unused]] PacketId packetId) override { } - void OnDisconnect([[maybe_unused]] IConnection* connection, [[maybe_unused]] DisconnectReason reason, [[maybe_unused]] TerminationEndpoint endpoint) + void OnDisconnect([[maybe_unused]] IConnection* connection, [[maybe_unused]] DisconnectReason reason, [[maybe_unused]] TerminationEndpoint endpoint) override { } diff --git a/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp b/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp index 9cc3fd4b09..02c7085023 100644 --- a/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp +++ b/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp @@ -26,12 +26,12 @@ namespace UnitTest : public IConnectionListener { public: - ConnectResult ValidateConnect([[maybe_unused]] const IpAddress& remoteAddress, [[maybe_unused]] const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) + ConnectResult ValidateConnect([[maybe_unused]] const IpAddress& remoteAddress, [[maybe_unused]] const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) override { return ConnectResult::Accepted; } - void OnConnect([[maybe_unused]] IConnection* connection) + void OnConnect([[maybe_unused]] IConnection* connection) override { ; } @@ -43,12 +43,12 @@ namespace UnitTest return PacketDispatchResult::Failure; } - void OnPacketLost([[maybe_unused]] IConnection* connection, [[maybe_unused]] PacketId packetId) + void OnPacketLost([[maybe_unused]] IConnection* connection, [[maybe_unused]] PacketId packetId) override { } - void OnDisconnect([[maybe_unused]] IConnection* connection, [[maybe_unused]] DisconnectReason reason, [[maybe_unused]] TerminationEndpoint endpoint) + void OnDisconnect([[maybe_unused]] IConnection* connection, [[maybe_unused]] DisconnectReason reason, [[maybe_unused]] TerminationEndpoint endpoint) override { } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabBar.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabBar.cpp index 127163f056..cd6af7391c 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabBar.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/DockTabBar.cpp @@ -147,7 +147,7 @@ namespace AzQtComponents TabBar::tabLayoutChange(); // Only the active tab's close button should be shown - const ButtonPosition closeSide = (ButtonPosition)style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, 0, this); + const ButtonPosition closeSide = (ButtonPosition)style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, nullptr, this); const int numTabs = count(); const int activeTabIndex = currentIndex(); for (int i = 0; i < numTabs; ++i) @@ -190,7 +190,7 @@ namespace AzQtComponents } }); - const ButtonPosition closeSide = (ButtonPosition) style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, 0, this); + const ButtonPosition closeSide = (ButtonPosition) style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, nullptr, this); setTabButton(index, closeSide, closeButton); } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.cpp index c78314b8d7..0478779561 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FlowLayout.cpp @@ -112,7 +112,7 @@ QLayoutItem* FlowLayout::takeAt(int index) } else { - return 0; + return nullptr; } } @@ -207,7 +207,7 @@ int FlowLayout::smartSpacing(QStyle::PixelMetric pm) const else if (parent->isWidgetType()) { QWidget* pw = static_cast(parent); - return pw->style()->pixelMetric(pm, 0, pw); + return pw->style()->pixelMetric(pm, nullptr, pw); } else { diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/StyledSpinBox.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/StyledSpinBox.cpp index 9bf77f0f9b..690d275646 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/StyledSpinBox.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/StyledSpinBox.cpp @@ -75,11 +75,11 @@ namespace AzQtComponents connect(slider, &QSlider::sliderReleased, this, [this] { m_dragging = false; }); } } - ~ClickEventFilterPrivate() {} + ~ClickEventFilterPrivate() override {} signals: void clickOnApplication(const QPoint& pos); protected: - bool eventFilter(QObject* obj, QEvent* event) + bool eventFilter(QObject* obj, QEvent* event) override { if (event->type() == QEvent::MouseButtonRelease && !m_dragging) { diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.cpp index 2c3dacda7a..c3fb6e88cd 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/LineEdit.cpp @@ -773,7 +773,7 @@ namespace AzQtComponents if (numButtons > 0) { // and finally add the right margins QLineEdit removes to make the buttons fit (it thinks) - const int iconSize = style->pixelMetric(QStyle::PM_SmallIconSize, 0, widget); + const int iconSize = style->pixelMetric(QStyle::PM_SmallIconSize, nullptr, widget); const int delta = iconSize / 4 + iconSize + 6; r.setRight(r.right() + delta * numButtons); } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBar.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBar.cpp index ac281a0e1c..b8cd37a6f7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBar.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/ScrollBar.cpp @@ -191,7 +191,7 @@ namespace AzQtComponents }; QMap m_widgets; - void perScrollBar(QObject* scrollArea, void (QScrollBar::*callback)(void)) + void perScrollBar(QObject* scrollArea, void (QScrollBar::*callback)()) { auto iterator = m_widgets.find(scrollArea); if (iterator != m_widgets.end()) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidget.cpp index 008560b59c..d52ae3685d 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/TabWidget.cpp @@ -632,7 +632,7 @@ namespace AzQtComponents return; } - ButtonPosition closeSide = (ButtonPosition)style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, 0, this); + ButtonPosition closeSide = (ButtonPosition)style()->styleHint(QStyle::SH_TabBar_CloseButtonPosition, nullptr, this); for (int i = 0; i < count(); i++) { QWidget* tabBtn = tabButton(i, closeSide); diff --git a/Code/Framework/AzQtComponents/AzQtComponents/PropertyEditorStandalone/main.cpp b/Code/Framework/AzQtComponents/AzQtComponents/PropertyEditorStandalone/main.cpp index ffca99f1d6..27d12438eb 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/PropertyEditorStandalone/main.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/PropertyEditorStandalone/main.cpp @@ -135,7 +135,7 @@ public: if (auto editContext = serializeContext->GetEditContext()) { editContext->Class("SimpleKeyContainer", "") - ->DataElement(0, &SimpleKeyedContainer::m_map, "map", "") + ->DataElement(nullptr, &SimpleKeyedContainer::m_map, "map", "") ->ElementAttribute(AZ::Edit::Attributes::ShowAsKeyValuePairs, true); } } diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Tests/AzQtComponentTests.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Tests/AzQtComponentTests.cpp index a717ad337e..3c911c8acc 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Tests/AzQtComponentTests.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Tests/AzQtComponentTests.cpp @@ -20,7 +20,7 @@ public: AzQtComponents::registerMetaTypes(); } - virtual ~AzQtComponentsTestEnvironment() {} + ~AzQtComponentsTestEnvironment() override {} protected: diff --git a/Code/Framework/AzTest/AzTest/Utils.cpp b/Code/Framework/AzTest/AzTest/Utils.cpp index 7c2c964504..d06024c72f 100644 --- a/Code/Framework/AzTest/AzTest/Utils.cpp +++ b/Code/Framework/AzTest/AzTest/Utils.cpp @@ -123,10 +123,10 @@ namespace AZ std::vector tokens; [[maybe_unused]] char* next_token = nullptr; char* tok = azstrtok(cmdLine, 0, " ", &next_token); - while (tok != NULL) + while (tok != nullptr) { tokens.push_back(tok); - tok = azstrtok(NULL, 0, " ", &next_token); + tok = azstrtok(nullptr, 0, " ", &next_token); } size = (int)tokens.size(); char** token_array = new char*[size]; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp index a3a79402ad..6de529e456 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp @@ -139,7 +139,7 @@ namespace AzToolsFramework AZ_PROFILE_SCOPE(AzToolsFramework, "Internal::DeleteEntities:UndoCaptureAndPurgeEntities"); for (const auto& entityId : entityIds) { - AZ::Entity* entity = NULL; + AZ::Entity* entity = nullptr; EBUS_EVENT_RESULT(entity, AZ::ComponentApplicationBus, FindEntity, entityId); if (entity) @@ -1237,7 +1237,7 @@ namespace AzToolsFramework void ToolsApplication::RequestEditForFile(const char* assetPath, RequestEditResultCallback resultCallback) { - AZ_Error("RequestEdit", resultCallback != 0, "User result callback is required."); + AZ_Error("RequestEdit", resultCallback != nullptr, "User result callback is required."); AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); if (fileIO && !fileIO->IsReadOnly(assetPath)) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp index 92c8d37540..6e55d9f97c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp @@ -97,7 +97,7 @@ namespace AzToolsFramework::AssetUtils struct EnabledPlatformsVisitor : AZ::SettingsRegistryInterface::Visitor { - void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value); + void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override; AZStd::vector m_enabledPlatforms; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp index e155189a99..77b9185e82 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp @@ -721,7 +721,7 @@ namespace AzToolsFramework AZ::Data::AssetInfo assetInfo; AZ::Data::AssetCatalogRequestBus::BroadcastResult(assetInfo, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, assetId); if (assetInfo.m_assetType == m_inMemoryAsset.GetType() - && strstr(m_expectedAddedAssetPath.c_str(), assetInfo.m_relativePath.c_str()) != 0) + && strstr(m_expectedAddedAssetPath.c_str(), assetInfo.m_relativePath.c_str()) != nullptr) { m_expectedAddedAssetPath.clear(); m_recentlyAddedAssetPath = assetInfo.m_relativePath; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp index d4c4fa1e65..d05a2dcc4b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.cpp @@ -103,7 +103,7 @@ namespace AzToolsFramework newData.clear(); AZ::IO::ByteContainerStream ms(&newData); - AZ::SerializeContext* sc = NULL; + AZ::SerializeContext* sc = nullptr; EBUS_EVENT_RESULT(sc, AZ::ComponentApplicationBus, GetSerializeContext); AZ_Assert(sc, "Serialization context not found!"); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/SelectionCommand.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/SelectionCommand.cpp index 33b2a14b89..6854663db7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/SelectionCommand.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/SelectionCommand.cpp @@ -34,7 +34,7 @@ namespace AzToolsFramework void SelectionCommand::Post() { - UndoSystem::UndoStack* undoStack = NULL; + UndoSystem::UndoStack* undoStack = nullptr; EBUS_EVENT_RESULT(undoStack, AzToolsFramework::ToolsApplicationRequests::Bus, GetUndoStack); if (undoStack) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index f3250e0bfd..2d3d1722ca 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -462,7 +462,7 @@ namespace AzToolsFramework linkId, templateId, templateToDelete.GetFilePath().c_str()); } - result = m_templateToLinkIdsMap.erase(templateToLinkIterator) != 0; + result = m_templateToLinkIdsMap.erase(templateToLinkIterator) != nullptr; AZ_Assert(result, "Prefab - PrefabSystemComponent::RemoveTemplate - " "Failed to remove Template with Id '%llu' on file path '%s' " diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/SourceControl/PerforceComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/SourceControl/PerforceComponent.cpp index 4ad409507e..3bd12b1ad3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/SourceControl/PerforceComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/SourceControl/PerforceComponent.cpp @@ -1315,7 +1315,7 @@ namespace AzToolsFramework void PerforceComponent::ThreadWorker() { m_ProcessThreadID = AZStd::this_thread::get_id(); - while (1) + while (true) { // block until signaled: m_WorkerSemaphore.acquire(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.cpp index da12a4bd7a..cc350c8107 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/ScriptEditorComponent.cpp @@ -38,7 +38,7 @@ namespace AZ AttributeDynamicScriptValue(const DynamicSerializableField& value) : m_value(value) {} - virtual ~AttributeDynamicScriptValue() + ~AttributeDynamicScriptValue() override { m_value.DestroyData(); } @@ -1031,15 +1031,15 @@ namespace AzToolsFramework ->Attribute("EditButton", "") ->Attribute("EditDescription", "Open in Lua Editor") ->Attribute("EditCallback", &ScriptEditorComponent::LaunchLuaEditor) - ->DataElement(0, &ScriptEditorComponent::m_scriptComponent, "Script properties", "The script template") + ->DataElement(nullptr, &ScriptEditorComponent::m_scriptComponent, "Script properties", "The script template") ->SetDynamicEditDataProvider(&ScriptEditorComponent::GetScriptPropertyEditData) ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ; ec->Class("Script Component", "Adding scripting functionality to the entity!") - ->DataElement(0, &AzFramework::ScriptComponent::m_properties, "Properties", "Lua script properties") + ->DataElement(nullptr, &AzFramework::ScriptComponent::m_properties, "Properties", "Lua script properties") ->Attribute(AZ::Edit::Attributes::AutoExpand, true) - ->DataElement(0, &AzFramework::ScriptComponent::m_script, "Asset", "") + ->DataElement(nullptr, &AzFramework::ScriptComponent::m_script, "Asset", "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::Hide) ->Attribute(AZ::Edit::Attributes::SliceFlags, AZ::Edit::SliceFlags::NotPushable) // Only the editor-component's script asset needs to be slice-pushable. ; @@ -1048,9 +1048,9 @@ namespace AzToolsFramework ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyGroup's class attributes.")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AzFramework::ScriptPropertyGroup::m_name)-> Attribute(AZ::Edit::Attributes::AutoExpand, true)-> - DataElement(0, &AzFramework::ScriptPropertyGroup::m_properties, "m_properties", "Properties in this property group")-> + DataElement(nullptr, &AzFramework::ScriptPropertyGroup::m_properties, "m_properties", "Properties in this property group")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AzFramework::ScriptPropertyGroup::m_groups, "m_groups", "Subgroups in this property group")-> + DataElement(nullptr, &AzFramework::ScriptPropertyGroup::m_groups, "m_groups", "Subgroups in this property group")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly); ec->Class("Script Property", "Base class for script properties")-> @@ -1060,50 +1060,50 @@ namespace AzToolsFramework ec->Class("Script Property (bool)", "A script boolean property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyGroup's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyBoolean::m_value, "m_value", "A boolean")-> + DataElement(nullptr, &AZ::ScriptPropertyBoolean::m_value, "m_value", "A boolean")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); ec->Class("Script Property (number)", "A script number property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyGroup's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyNumber::m_value, "m_value", "A number")-> + DataElement(nullptr, &AZ::ScriptPropertyNumber::m_value, "m_value", "A number")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); ec->Class("Script Property (string)", "A script string property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyGroup's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyString::m_value, "m_value", "A string")-> + DataElement(nullptr, &AZ::ScriptPropertyString::m_value, "m_value", "A string")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); ec->Class("Script Property (object)", "A script object property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyGroup's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyGenericClass::m_value, "m_value", "An object")-> + DataElement(nullptr, &AZ::ScriptPropertyGenericClass::m_value, "m_value", "An object")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly); ec->Class("Script Property Array(bool)", "A script bool array property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyBooleanArray's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyBooleanArray::m_values, "m_value", "An object")-> + DataElement(nullptr, &AZ::ScriptPropertyBooleanArray::m_values, "m_value", "An object")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); ec->Class("Script Property Array(number)", "A script number array property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyNumberArray's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyNumberArray::m_values, "m_value", "An object")-> + DataElement(nullptr, &AZ::ScriptPropertyNumberArray::m_values, "m_value", "An object")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); ec->Class("Script Property Array(string)", "A script string array property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyStringArray's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> - DataElement(0, &AZ::ScriptPropertyStringArray::m_values, "m_value", "An object")-> + DataElement(nullptr, &AZ::ScriptPropertyStringArray::m_values, "m_value", "An object")-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); ec->Class("Script Property Array(object)", "A script object array property")-> ClassElement(AZ::Edit::ClassElements::EditorData, "ScriptPropertyGenericClassArray's class attributes.")-> Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> Attribute(AZ::Edit::Attributes::DynamicElementType, &AZ::ScriptPropertyGenericClassArray::GetElementTypeUuid)-> - DataElement(0, &AZ::ScriptPropertyGenericClassArray::m_values, "m_value", "An object")-> + DataElement(nullptr, &AZ::ScriptPropertyGenericClassArray::m_values, "m_value", "An object")-> ElementAttribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)-> Attribute(AZ::Edit::Attributes::NameLabelOverride, &AZ::ScriptProperty::m_name); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkAPI.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkAPI.cpp index 2ed70d81b8..4dd352646c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkAPI.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkAPI.cpp @@ -17,21 +17,21 @@ namespace LegacyFramework { const char* appName() { - const char* result = NULL; + const char* result = nullptr; EBUS_EVENT_RESULT(result, FrameworkApplicationMessages::Bus, GetApplicationName); return result; } const char* appModule() { - const char* result = NULL; + const char* result = nullptr; EBUS_EVENT_RESULT(result, FrameworkApplicationMessages::Bus, GetApplicationModule); return result; } const char* appDir() { - const char* result = NULL; + const char* result = nullptr; EBUS_EVENT_RESULT(result, FrameworkApplicationMessages::Bus, GetApplicationDirectory); return result; } @@ -74,7 +74,7 @@ namespace LegacyFramework // helper function which retrieves the serialize context and asserts if its not found. AZ::SerializeContext* GetSerializeContext() { - AZ::SerializeContext* serializeContext = NULL; + AZ::SerializeContext* serializeContext = nullptr; EBUS_EVENT_RESULT(serializeContext, AZ::ComponentApplicationBus, GetSerializeContext); AZ_Assert(serializeContext, "No serialize context"); return serializeContext; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp index 33562421e9..95ea5397e7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.cpp @@ -237,7 +237,7 @@ namespace LegacyFramework { m_applicationEntity->Deactivate(); delete m_applicationEntity; - m_applicationEntity = NULL; + m_applicationEntity = nullptr; } AZ::SystemTickBus::ExecuteQueuedEvents(); @@ -249,7 +249,7 @@ namespace LegacyFramework #endif delete m_ptrCommandLineParser; - m_ptrCommandLineParser = NULL; + m_ptrCommandLineParser = nullptr; CoreMessageBus::Handler::BusDisconnect(); FrameworkApplicationMessages::Handler::BusDisconnect(); @@ -269,7 +269,7 @@ namespace LegacyFramework { m_applicationEntity->Deactivate(); delete m_applicationEntity; - m_applicationEntity = NULL; + m_applicationEntity = nullptr; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFramework.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFramework.cpp index bc16b29830..98e06b77f3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFramework.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFramework.cpp @@ -144,9 +144,9 @@ namespace AzToolsFramework qInstallMessageHandler(myMessageOutput); } - virtual ~AZQtApplication() + ~AZQtApplication() override { - qInstallMessageHandler(NULL); + qInstallMessageHandler(nullptr); } }; @@ -201,9 +201,9 @@ namespace AzToolsFramework // enable the built-in stylesheet by default: bool enableStyleSheet = true; - const AzFramework::CommandLine* comp = NULL; + const AzFramework::CommandLine* comp = nullptr; EBUS_EVENT_RESULT(comp, LegacyFramework::FrameworkApplicationMessages::Bus, GetCommandLineParser); - if (comp != NULL) + if (comp != nullptr) { if (comp->HasSwitch("nostyle")) { @@ -275,18 +275,18 @@ namespace AzToolsFramework // see still need to clean up: m_ptrTicker->cancel(); QApplication::processEvents(); - AZ::ComponentApplication* pApp = NULL; + AZ::ComponentApplication* pApp = nullptr; EBUS_EVENT_RESULT(pApp, AZ::ComponentApplicationBus, GetApplication); if (pApp) { pApp->Tick(); } azdestroy(m_ptrTicker); - m_ptrTicker = NULL; + m_ptrTicker = nullptr; } } - Framework::~Framework(void) + Framework::~Framework() { AZ::SystemTickBus::Handler::BusDisconnect(); @@ -299,7 +299,7 @@ namespace AzToolsFramework delete m_ActionChangeProject; m_ActionChangeProject = nullptr; - pApplication = NULL; + pApplication = nullptr; } // once we set the project, we can then tell all our other windows to restore our state. @@ -360,7 +360,7 @@ namespace AzToolsFramework } m_bTicking = true; // Tick the component app. - AZ::ComponentApplication* pApp = NULL; + AZ::ComponentApplication* pApp = nullptr; EBUS_EVENT_RESULT(pApp, AZ::ComponentApplicationBus, GetApplication); if (pApp) { @@ -491,7 +491,7 @@ namespace AzToolsFramework // we successfully got permission to quit! // pump the tickbus one last time! // QApplication::processEvents(); - AZ::ComponentApplication* pApp = NULL; + AZ::ComponentApplication* pApp = nullptr; EBUS_EVENT_RESULT(pApp, AZ::ComponentApplicationBus, GetApplication); if (pApp) { @@ -501,7 +501,7 @@ namespace AzToolsFramework m_ptrTicker->cancel(); azdestroy(m_ptrTicker); - m_ptrTicker = NULL; + m_ptrTicker = nullptr; QApplication::quit(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkPreferences.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkPreferences.cpp index 6318bc3e6e..72bef700d7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkPreferences.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/UIFrameworkPreferences.cpp @@ -38,7 +38,7 @@ namespace AzToolsFramework else { delete m_View; - m_View = NULL; + m_View = nullptr; } } void Framework::PreferencesAccepted() @@ -59,11 +59,11 @@ namespace AzToolsFramework if (m_View) { delete m_View; - m_View = NULL; + m_View = nullptr; } if (m_Model) { - m_Model = NULL; + m_Model = nullptr; } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp index 4fabdfad12..ef8bf42713 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.cpp @@ -61,7 +61,7 @@ namespace AzToolsFramework , m_impl(new BaseLogPanel::Impl) { m_impl->storageID = 0; - this->setLayout(aznew LogPanelLayout(NULL)); + this->setLayout(aznew LogPanelLayout(nullptr)); m_impl->pTabWidget = new AzQtComponents::TabWidget(this); m_impl->pTabWidget->setObjectName(QString::fromUtf8("tabWidget")); @@ -601,7 +601,7 @@ namespace AzToolsFramework { if (index >= (int)m_children.size()) { - return NULL; + return nullptr; } return m_children[index]; @@ -609,11 +609,11 @@ namespace AzToolsFramework QLayoutItem* LogPanelLayout::takeAt(int index) { - QLayoutItem* pItem = NULL; + QLayoutItem* pItem = nullptr; if (index >= (int)m_children.size()) { - return NULL; + return nullptr; } pItem = m_children[index]; @@ -860,7 +860,7 @@ namespace AzToolsFramework return richLabel; } - return NULL; + return nullptr; } bool LogPanelItemDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/StyledLogPanel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/StyledLogPanel.cpp index 1542a5f5ab..f550dbdc87 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/StyledLogPanel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/StyledLogPanel.cpp @@ -322,7 +322,7 @@ namespace AzToolsFramework actionList.removeAll(m_actionSelectAll); } - QMenu::exec(actionList, QCursor::pos(), 0, this); + QMenu::exec(actionList, QCursor::pos(), nullptr, this); } void StyledLogTab::CopySelected() diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/InstanceDataHierarchy.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/InstanceDataHierarchy.cpp index fccabbf205..7fefb04872 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/InstanceDataHierarchy.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/InstanceDataHierarchy.cpp @@ -236,7 +236,7 @@ namespace AzToolsFramework AZ_Assert(container, "This node is NOT a container node!"); const AZ::SerializeContext::ClassElement* containerClassElement = container->GetElement(container->GetDefaultElementNameCrc()); - AZ_Assert(containerClassElement != NULL, "We should have a valid default element in the container, otherwise we don't know what elements to make!"); + AZ_Assert(containerClassElement != nullptr, "We should have a valid default element in the container, otherwise we don't know what elements to make!"); if (!containerClassElement) { return false; @@ -261,7 +261,7 @@ namespace AzToolsFramework AZ_Assert(newDataAddress, "Faliled to create new element for the continer!"); // cast to base type (if needed) void* basePtr = m_context->DownCast(newDataAddress, classData->m_typeId, containerClassElement->m_typeId, classData->m_azRtti, containerClassElement->m_azRtti); - AZ_Assert(basePtr != NULL, "Can't cast container element %s to %s, make sure classes are registered in the system and not generics!", classData->m_name, containerClassElement->m_name); + AZ_Assert(basePtr != nullptr, "Can't cast container element %s to %s, make sure classes are registered in the system and not generics!", classData->m_name, containerClassElement->m_name); *reinterpret_cast(dataAddress) = basePtr; // store the pointer in the class /// Store the element in the container container->StoreElement(GetInstance(i), dataAddress); @@ -608,7 +608,7 @@ namespace AzToolsFramework AZ_Assert(sc, "sc can't be NULL!"); AZ_Assert(m_rootInstances.size() > 0, "No root instances have been added to this hierarchy!"); - m_curParentNode = NULL; + m_curParentNode = nullptr; m_isMerging = false; m_instances.clear(); m_children.clear(); @@ -636,7 +636,7 @@ namespace AzToolsFramework for (size_t i = 1; i < m_rootInstances.size(); ++i) { - m_curParentNode = NULL; + m_curParentNode = nullptr; m_isMerging = true; m_matched = false; sc->EnumerateInstanceConst( @@ -956,7 +956,7 @@ namespace AzToolsFramework } } - InstanceDataNode* node = NULL; + InstanceDataNode* node = nullptr; // Extra steps need to be taken when we are merging if (m_isMerging) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index ee43eb7e2c..c07191fda2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -349,7 +349,7 @@ namespace AzToolsFramework if (pAssetType) { - (*pAssetType) = 0; + (*pAssetType) = nullptr; } if (!pData) @@ -529,7 +529,7 @@ namespace AzToolsFramework if (m_errorButton) { // If the button is already active, disconnect its pressed handler so we don't get multiple popups - disconnect(m_errorButton, &QPushButton::pressed, this, 0); + disconnect(m_errorButton, &QPushButton::pressed, this, nullptr); } else { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyCRCCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyCRCCtrl.cpp index 6a1f1404a1..38a7f426db 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyCRCCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyCRCCtrl.cpp @@ -137,7 +137,7 @@ namespace AzToolsFramework Q_UNUSED(debugName) } - AZ::u32 U32CRCHandler::GetHandlerName(void) const + AZ::u32 U32CRCHandler::GetHandlerName() const { return AZ::Edit::UIHandlers::Crc; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.cpp index 678693ea32..2eabe64333 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.cpp @@ -225,7 +225,7 @@ namespace AzToolsFramework if (!pHandlerFound) { // does a base class have a handler? - AZ::SerializeContext* sc = NULL; + AZ::SerializeContext* sc = nullptr; EBUS_EVENT_RESULT(sc, AZ::ComponentApplicationBus, GetSerializeContext); AZStd::vector classes; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ReflectedPropertyEditor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ReflectedPropertyEditor.cpp index c87f0e03ba..0ad874d1f6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ReflectedPropertyEditor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ReflectedPropertyEditor.cpp @@ -254,9 +254,9 @@ namespace AzToolsFramework void QueueInvalidationIfSharedData(InternalReflectedPropertyEditorEvents* sender, PropertyModificationRefreshLevel level, const AZStd::set& sourceInstanceSet) override; // PropertyEditorGUIMessages::Bus::Handler - virtual void RequestWrite(QWidget* editorGUI) override; - virtual void AddElementsToParentContainer(QWidget* editorGUI, size_t numElements, const InstanceDataNode::FillDataClassCallback& fillDataCallback) override; - virtual void RequestRefresh(PropertyModificationRefreshLevel) override; + void RequestWrite(QWidget* editorGUI) override; + void AddElementsToParentContainer(QWidget* editorGUI, size_t numElements, const InstanceDataNode::FillDataClassCallback& fillDataCallback) override; + void RequestRefresh(PropertyModificationRefreshLevel) override; void RequestPropertyNotify(QWidget* editorGUI) override; void OnEditingFinished(QWidget* editorGUI) override; }; @@ -890,7 +890,7 @@ namespace AzToolsFramework { instance.Build(m_impl->m_context, AZ::SerializeContext::ENUM_ACCESS_FOR_READ, m_impl->m_dynamicEditDataProvider, m_impl->m_editorParent); m_impl->FilterNode(instance.GetRootNode(), filter); - m_impl->AddProperty(instance.GetRootNode(), NULL, 0); + m_impl->AddProperty(instance.GetRootNode(), nullptr, 0); } m_impl->UpdateExpansionState(); @@ -1077,7 +1077,7 @@ namespace AzToolsFramework PropertyRowWidget* ReflectedPropertyEditor::Impl::CreateOrPullFromPool() { - PropertyRowWidget* newWidget = NULL; + PropertyRowWidget* newWidget = nullptr; if (m_widgetPool.empty()) { newWidget = aznew PropertyRowWidget(m_containerWidget); @@ -1184,7 +1184,7 @@ namespace AzToolsFramework { // re-create the tab order, based on vertical position in the list. - QWidget* pLastWidget = NULL; + QWidget* pLastWidget = nullptr; for (AZStd::size_t pos = 0; pos < m_impl->m_widgetsInDisplayOrder.size(); ++pos) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp index 849b8d1705..e5fd3351ae 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/SearchWidget/SearchCriteriaWidget.cpp @@ -195,17 +195,17 @@ namespace AzToolsFramework , m_criteriaOperator(FilterOperatorType::Or) , m_suppressCriteriaChanged(false) { - m_mainLayout = new QVBoxLayout(NULL); + m_mainLayout = new QVBoxLayout(nullptr); m_mainLayout->setSizeConstraint(QLayout::SetMinimumSize); m_mainLayout->setContentsMargins(0, 0, 0, 0); - QHBoxLayout* secondaryLayout = new QHBoxLayout(NULL); + QHBoxLayout* secondaryLayout = new QHBoxLayout(nullptr); secondaryLayout->setSizeConstraint(QLayout::SetMinimumSize); secondaryLayout->setContentsMargins(0, 0, 0, 0); - m_filterLayout = new QHBoxLayout(NULL); + m_filterLayout = new QHBoxLayout(nullptr); m_tagLayout = new FlowLayout(nullptr); m_tagLayout->setAlignment(Qt::AlignLeft); - QHBoxLayout* filterTextLayout = new QHBoxLayout(NULL); + QHBoxLayout* filterTextLayout = new QHBoxLayout(nullptr); filterTextLayout->setSizeConstraint(QLayout::SetMinimumSize); filterTextLayout->setContentsMargins(0, 0, 0, 0); filterTextLayout->setSpacing(0); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.cpp index 75c8c607c6..e71910f4fc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/UICore/QTreeViewStateSaver.cpp @@ -41,7 +41,7 @@ namespace AzToolsFramework { } - virtual ~QTreeViewStateSaverData() + ~QTreeViewStateSaverData() override { } @@ -213,7 +213,7 @@ namespace AzToolsFramework } } - void ApplySnapshot(QTreeView* treeView) + void ApplySnapshot(QTreeView* treeView) override { Q_ASSERT(treeView && treeView->model()); diff --git a/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp b/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp index 4083608370..24488f3ed3 100644 --- a/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp +++ b/Code/Framework/AzToolsFramework/Tests/AssetSeedManager.cpp @@ -219,7 +219,7 @@ namespace UnitTest delete m_application; } - AZ::Data::AssetInfo GetAssetInfoById(const AZ::Data::AssetId& id) + AZ::Data::AssetInfo GetAssetInfoById(const AZ::Data::AssetId& id) override { auto foundIter = m_assetRegistry->m_assetIdToInfo.find(id); if (foundIter != m_assetRegistry->m_assetIdToInfo.end()) diff --git a/Code/Framework/AzToolsFramework/Tests/ComponentAddRemove.cpp b/Code/Framework/AzToolsFramework/Tests/ComponentAddRemove.cpp index e15f4f3cfd..e416efc5c6 100644 --- a/Code/Framework/AzToolsFramework/Tests/ComponentAddRemove.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ComponentAddRemove.cpp @@ -1202,7 +1202,7 @@ namespace UnitTest AZ_COMPONENT(HiddenComponent, "{E4D2AD8B-3930-46FC-837A-8DDFCA0FB1AF}", AzToolsFramework::Components::EditorComponentBase); static Component* s_wasDeleted; - virtual ~HiddenComponent() + ~HiddenComponent() override { s_wasDeleted = this; } diff --git a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp index db92085e98..2c757f8e9e 100644 --- a/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Entity/EditorEntitySearchComponentTests.cpp @@ -66,7 +66,7 @@ namespace AzToolsFramework { } - virtual ~EntitySearch_TestComponent1() override + ~EntitySearch_TestComponent1() override {} private: @@ -123,7 +123,7 @@ namespace AzToolsFramework { } - virtual ~EntitySearch_TestComponent2() override + ~EntitySearch_TestComponent2() override {} private: diff --git a/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp b/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp index b6b428cc11..486224c011 100644 --- a/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EntityIdQLabelTests.cpp @@ -55,7 +55,7 @@ namespace UnitTest AzToolsFramework::EditorRequests::Bus::Handler::BusConnect(); } - ~EditorRequestHandlerTest() + ~EditorRequestHandlerTest() override { AzToolsFramework::EditorRequests::Bus::Handler::BusDisconnect(); } diff --git a/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp b/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp index 9af74c7996..0fbc7eba98 100644 --- a/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EntityInspectorTests.cpp @@ -67,7 +67,7 @@ namespace UnitTest services.push_back(AZ_CRC("InspectorTestService1")); } - virtual ~Inspector_TestComponent1() override + ~Inspector_TestComponent1() override { } @@ -136,7 +136,7 @@ namespace UnitTest services.push_back(AZ_CRC("InspectorTestService2")); } - virtual ~Inspector_TestComponent2() override + ~Inspector_TestComponent2() override { } @@ -205,7 +205,7 @@ namespace UnitTest services.push_back(AZ_CRC("InspectorTestService3")); } - virtual ~Inspector_TestComponent3() override + ~Inspector_TestComponent3() override { } diff --git a/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp b/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp index c4299a6ff9..94b32f9e41 100644 --- a/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp +++ b/Code/Framework/AzToolsFramework/Tests/FileFunc.cpp @@ -31,7 +31,7 @@ namespace UnitTest class FileFuncTest : public ScopedAllocatorSetupFixture { public: - void SetUp() + void SetUp() override { m_prevFileIO = AZ::IO::FileIOBase::GetInstance(); AZ::IO::FileIOBase::SetInstance(nullptr); diff --git a/Code/Framework/AzToolsFramework/Tests/InstanceDataHierarchy.cpp b/Code/Framework/AzToolsFramework/Tests/InstanceDataHierarchy.cpp index 806a3bbab2..4d144d0d1b 100644 --- a/Code/Framework/AzToolsFramework/Tests/InstanceDataHierarchy.cpp +++ b/Code/Framework/AzToolsFramework/Tests/InstanceDataHierarchy.cpp @@ -104,15 +104,15 @@ namespace UnitTest if (AZ::EditContext* edit = serializeContext->GetEditContext()) { edit->Class("Test Component", "A test component") - ->DataElement(0, &TestComponent::m_float, "Float Field", "A float field") - ->DataElement(0, &TestComponent::m_string, "String Field", "A string field") - ->DataElement(0, &TestComponent::m_normalContainer, "Normal Container", "A container") - ->DataElement(0, &TestComponent::m_pointerContainer, "Pointer Container", "A container") - ->DataElement(0, &TestComponent::m_subData, "Struct Field", "A sub data type") + ->DataElement(nullptr, &TestComponent::m_float, "Float Field", "A float field") + ->DataElement(nullptr, &TestComponent::m_string, "String Field", "A string field") + ->DataElement(nullptr, &TestComponent::m_normalContainer, "Normal Container", "A container") + ->DataElement(nullptr, &TestComponent::m_pointerContainer, "Pointer Container", "A container") + ->DataElement(nullptr, &TestComponent::m_subData, "Struct Field", "A sub data type") ; edit->Class("Test Component", "A test component") - ->DataElement(0, &SubData::m_int, "Int Field", "An int") + ->DataElement(nullptr, &SubData::m_int, "Int Field", "An int") ; } } @@ -156,7 +156,7 @@ namespace UnitTest { } - ~InstanceDataHierarchyBasicTest() + ~InstanceDataHierarchyBasicTest() override { } @@ -481,7 +481,7 @@ namespace UnitTest { } - ~InstanceDataHierarchyCopyContainerChangesTest() + ~InstanceDataHierarchyCopyContainerChangesTest() override { } @@ -680,8 +680,8 @@ namespace UnitTest ; edit->Class("Enum Container", "Test container that has an external enum") - ->DataElement(0, &EnumContainer::m_enum, "Enum Field", "An enum value") - ->DataElement(0, &EnumContainer::m_enumVector, "Enum Vector Field", "A vector of enum values") + ->DataElement(nullptr, &EnumContainer::m_enum, "Enum Field", "An enum value") + ->DataElement(nullptr, &EnumContainer::m_enumVector, "Enum Vector Field", "A vector of enum values") ; } } @@ -776,21 +776,21 @@ namespace UnitTest { edit->Class("Group Test Component", "Testing normal groups and toggle groups") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") - ->DataElement(0, &GroupTestComponent::m_float, "Float Field", "A float field") + ->DataElement(nullptr, &GroupTestComponent::m_float, "Float Field", "A float field") ->ClassElement(AZ::Edit::ClassElements::Group, "Normal Group") - ->DataElement(0, &GroupTestComponent::m_groupFloat, "Float Field", "A float field") - ->DataElement(0, &GroupTestComponent::m_subGroupForNormal, "Struct Field", "A sub data type") + ->DataElement(nullptr, &GroupTestComponent::m_groupFloat, "Float Field", "A float field") + ->DataElement(nullptr, &GroupTestComponent::m_subGroupForNormal, "Struct Field", "A sub data type") ->GroupElementToggle("Group Toggle", &GroupTestComponent::m_groupToggle) - ->DataElement(0, &GroupTestComponent::m_toggleGroupInt, "Normal Integer", "An Integer") - ->DataElement(0, &GroupTestComponent::m_subGroupForToggle, "Struct Field", "A sub data type") + ->DataElement(nullptr, &GroupTestComponent::m_toggleGroupInt, "Normal Integer", "An Integer") + ->DataElement(nullptr, &GroupTestComponent::m_subGroupForToggle, "Struct Field", "A sub data type") ; edit->Class("SubGroup Test Component", "Testing nested normal groups and toggle groups") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->ClassElement(AZ::Edit::ClassElements::Group, "Normal SubGroup") - ->DataElement(0, &SubData::m_int, "SubGroup Int Field", "An int") + ->DataElement(nullptr, &SubData::m_int, "SubGroup Int Field", "An int") ->GroupElementToggle("SubGroup Toggle", &SubData::m_bool) - ->DataElement(0, &SubData::m_float, "SubGroup Float Field", "An int") + ->DataElement(nullptr, &SubData::m_float, "SubGroup Float Field", "An int") ; } } @@ -974,7 +974,7 @@ namespace UnitTest { } - void InsertAndVerifyKeys(AZ::SerializeContext::IDataContainer* container, void* key, void* instance, const AZ::SerializeContext::ClassElement* classElement) const + void InsertAndVerifyKeys(AZ::SerializeContext::IDataContainer* container, void* key, void* instance, const AZ::SerializeContext::ClassElement* classElement) const override { T* keyContainer = reinterpret_cast(key); for (const T& keyToInsert : keysToInsert) @@ -1258,7 +1258,7 @@ namespace UnitTest { editContext->Class("Test", "") ->UIElement("TestHandler", "UIElement") - ->DataElement(0, &UIElementContainer::m_data) + ->DataElement(nullptr, &UIElementContainer::m_data) ->UIElement(AZ_CRC("TestHandler2"), "UIElement2") ; } @@ -1322,8 +1322,8 @@ namespace UnitTest { // By default, DataElements accept multi-edit and UIElements do not editContext->Class("Test", "") - ->DataElement(0, &AggregatedContainer::m_aggregated) - ->DataElement(0, &AggregatedContainer::m_notAggregated) + ->DataElement(nullptr, &AggregatedContainer::m_aggregated) + ->DataElement(nullptr, &AggregatedContainer::m_notAggregated) ->Attribute(AZ::Edit::Attributes::AcceptsMultiEdit, false) ->UIElement("TestHandler", "aggregatedUIElement") ->Attribute(AZ::Edit::Attributes::AcceptsMultiEdit, true) diff --git a/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp b/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp index 1c1e063592..91e53f1650 100644 --- a/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/PropertyTreeEditorTests.cpp @@ -73,7 +73,7 @@ namespace UnitTest if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class("TestSimpleAsset", "Test data block for a simple asset mock data block") - ->DataElement(0, &TestSimpleAsset::m_data, "My Data", "A test bool value.") + ->DataElement(nullptr, &TestSimpleAsset::m_data, "My Data", "A test bool value.") ; } } @@ -171,7 +171,7 @@ namespace UnitTest ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::HideChildren) ->DataElement(AZ::Edit::UIHandlers::Default, &PropertyTreeEditorTester::m_myReadOnlyShort, "My Read Only", "A test read only node.") ->Attribute(AZ::Edit::Attributes::ReadOnly, true) - ->DataElement(0, &PropertyTreeEditorTester::m_mySubBlock, "My Sub Block", "sub block test") + ->DataElement(nullptr, &PropertyTreeEditorTester::m_mySubBlock, "My Sub Block", "sub block test") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->ClassElement(AZ::Edit::ClassElements::Group, "Grouped") diff --git a/Code/Framework/AzToolsFramework/Tests/SQLiteConnectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/SQLiteConnectionTests.cpp index b2fa44c271..8e273992ac 100644 --- a/Code/Framework/AzToolsFramework/Tests/SQLiteConnectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/SQLiteConnectionTests.cpp @@ -31,7 +31,7 @@ namespace UnitTest { } - ~SQLiteTest() = default; + ~SQLiteTest() override = default; void SetUp() override { diff --git a/Code/Framework/AzToolsFramework/Tests/Script/ScriptEntityTests.cpp b/Code/Framework/AzToolsFramework/Tests/Script/ScriptEntityTests.cpp index 2aa180cfc0..cdb8fea513 100644 --- a/Code/Framework/AzToolsFramework/Tests/Script/ScriptEntityTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Script/ScriptEntityTests.cpp @@ -28,7 +28,7 @@ namespace UnitTest ScriptContext* m_scriptContext; - ~EntityScriptTest() + ~EntityScriptTest() override { } diff --git a/Code/Framework/AzToolsFramework/Tests/Slice.cpp b/Code/Framework/AzToolsFramework/Tests/Slice.cpp index 1723fbed8b..58865df345 100644 --- a/Code/Framework/AzToolsFramework/Tests/Slice.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Slice.cpp @@ -457,7 +457,7 @@ namespace UnitTest { AZ::Debug::TraceMessageBus::Handler::BusConnect(); } - ~SliceTestWarningInterceptor() + ~SliceTestWarningInterceptor() override { AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); } diff --git a/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp b/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp index f9b84c6130..ca32097341 100644 --- a/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp +++ b/Code/Framework/AzToolsFramework/Tests/UndoStack.cpp @@ -413,7 +413,7 @@ namespace UnitTest *m_completedFlag = false; } - ~UndoDestructorTest() + ~UndoDestructorTest() override { *m_completedFlag = true; } diff --git a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp index e1896af4db..ddfcde34b2 100644 --- a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiDisplayTests.cpp @@ -28,7 +28,7 @@ namespace UnitTest public: ViewportUiDisplayTestFixture() = default; - void SetUp() + void SetUp() override { m_buttonGroup = AZStd::make_shared(); m_buttonGroup->AddButton(""); @@ -36,7 +36,7 @@ namespace UnitTest m_mockRenderOverlay = new QWidget(); } - void TearDown() + void TearDown() override { m_buttonGroup.reset(); delete m_parentWidget; diff --git a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp index 91100b18c5..676b9c5e35 100644 --- a/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Viewport/ViewportUiManagerTests.cpp @@ -26,7 +26,7 @@ namespace UnitTest { public: ViewportUiManagerTestable() = default; - ~ViewportUiManagerTestable() = default; + ~ViewportUiManagerTestable() override = default; const AZStd::unordered_map>& GetClusterMap() { @@ -84,12 +84,12 @@ namespace UnitTest ViewportManagerWrapper m_viewportManagerWrapper; - void SetUp() + void SetUp() override { m_viewportManagerWrapper.Create(); } - void TearDown() + void TearDown() override { m_viewportManagerWrapper.Destroy(); } diff --git a/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp b/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp index 8b484143de..095f392501 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp +++ b/Code/Framework/GridMate/GridMate/Carrier/Carrier.cpp @@ -591,13 +591,13 @@ namespace GridMate ThreadMessage(MainThreadMsg mtm) : m_code(mtm) - , m_connection(NULL) - , m_threadConnection(NULL) + , m_connection(nullptr) + , m_threadConnection(nullptr) {} ThreadMessage(CarrierThreadMsg ctm) : m_code(ctm) - , m_connection(NULL) - , m_threadConnection(NULL) + , m_connection(nullptr) + , m_threadConnection(nullptr) {} int m_code; @@ -787,7 +787,7 @@ namespace GridMate AZ_FORCE_INLINE ThreadMessage* PopCarrierThreadMessage() { AZStd::lock_guard l(m_carrierMsgQueueLock); - ThreadMessage* res = NULL; + ThreadMessage* res = nullptr; if (!m_carrierMsgQueue.empty()) { res = m_carrierMsgQueue.front(); @@ -799,7 +799,7 @@ namespace GridMate AZ_FORCE_INLINE ThreadMessage* PopMainThreadMessage() { AZStd::lock_guard l(m_mainMsgQueueLock); - ThreadMessage* res = NULL; + ThreadMessage* res = nullptr; if (!m_mainMsgQueue.empty()) { res = m_mainMsgQueue.front(); @@ -1120,7 +1120,7 @@ using namespace GridMate; ////////////////////////////////////////////////////////////////////////// Connection::Connection(CarrierThread* threadOwner, const AZStd::string& address) : m_threadOwner(threadOwner) - , m_threadConn(NULL) + , m_threadConn(nullptr) , m_fullAddress(address) , m_state(Carrier::CST_CONNECTING) { @@ -1139,7 +1139,7 @@ Connection::Connection(CarrierThread* threadOwner, const AZStd::string& address) Connection::~Connection() { - AZ_Error("GridMate", m_threadConn.load(AZStd::memory_order_acquire) == NULL, "We must detach the thread connection first!"); + AZ_Error("GridMate", m_threadConn.load(AZStd::memory_order_acquire) == nullptr, "We must detach the thread connection first!"); // Make sure render thread doesn't reference is at this point... it's too late for (unsigned int i = 0; i < AZ_ARRAY_SIZE(m_toSend); ++i) { @@ -1172,7 +1172,7 @@ Connection::~Connection() ThreadConnection::ThreadConnection(CarrierThread* threadOwner) : m_threadOwner(threadOwner) - , m_mainConnection(NULL) + , m_mainConnection(nullptr) , m_dataGramSeqNum(1) // IMPORTANT to start with 1 if we have not received any datagrams we will confirm a datagram with value of 0. , m_lastAckedDatagram(0) , m_lastReceivedDatagramTime(AZStd::chrono::system_clock::now()) @@ -1196,7 +1196,7 @@ ThreadConnection::ThreadConnection(CarrierThread* threadOwner) ThreadConnection::~ThreadConnection() { - AZ_Error("GridMate", m_mainConnection == NULL || m_mainConnection->m_threadConn.load() == NULL, "We should have unbound the thread connection by now!"); + AZ_Error("GridMate", m_mainConnection == nullptr || m_mainConnection->m_threadConn.load() == nullptr, "We should have unbound the thread connection by now!"); for (unsigned char iChannel = 0; iChannel < k_maxNumberOfChannels; ++iChannel) { @@ -1215,8 +1215,8 @@ ThreadConnection::~ThreadConnection() m_threadOwner->FreeDatagram(dgram); } - m_target->m_threadConnection = NULL; - m_target = NULL; + m_target->m_threadConnection = nullptr; + m_target = nullptr; m_threadOwner->RemoveConnectionToSend(this); AZ_Error("GridMate", !IsLinked(), "Connection still linked!"); @@ -1245,7 +1245,7 @@ CarrierThread::CarrierThread(const CarrierDesc& desc, AZStd::shared_ptrGetMaxSendSize(), @@ -1667,7 +1667,7 @@ CarrierThread::UpdateReceive() ReadBuffer readBuffer(kCarrierEndian, data, recvDataGramSize); ThreadConnection* conn = nullptr; - if (fromAddress->m_threadConnection != NULL) + if (fromAddress->m_threadConnection != nullptr) { conn = fromAddress->m_threadConnection; receivedConnections.insert(conn); @@ -2214,7 +2214,7 @@ CarrierThread::UpdateStats() for (ThreadConnectionList::iterator iConn = m_threadConnections.begin(); iConn != m_threadConnections.end(); ++iConn) { ThreadConnection* conn = *iConn; - if (conn->m_mainConnection == NULL) + if (conn->m_mainConnection == nullptr) { continue; } @@ -2267,40 +2267,40 @@ CarrierThread::ThreadPump() // Process messages for us { ThreadMessage* msg; - while ((msg = PopCarrierThreadMessage()) != NULL) + while ((msg = PopCarrierThreadMessage()) != nullptr) { switch (msg->m_code) { case CTM_CONNECT: { - AZ_Assert(msg->m_connection != NULL, "You must provide a valid connection pointer!"); + AZ_Assert(msg->m_connection != nullptr, "You must provide a valid connection pointer!"); // if this connect was initiated from a remote machine msg->threadConnection will be != NULL ThreadConnection* conn = msg->m_threadConnection; if (!conn) { // The main thread is initiating this connection AZStd::intrusive_ptr driverAddress = m_driver->CreateDriverAddress(msg->m_connection->m_fullAddress); - if (driverAddress->m_threadConnection != NULL) + if (driverAddress->m_threadConnection != nullptr) { AZ_TracePrintf("GridMate", "Thread connection to %s already exists!\n", driverAddress->ToString().c_str()); // we already have such thread connection conn = driverAddress->m_threadConnection; // make sure the existing connection is not bound - AZ_Assert(conn->m_mainConnection == NULL, "This thread connection should be unbound!"); + AZ_Assert(conn->m_mainConnection == nullptr, "This thread connection should be unbound!"); } else { conn = MakeNewConnection(driverAddress); } } - AZ_Assert(conn->m_mainConnection == NULL || conn->m_mainConnection == msg->m_connection, "This thread connection should be unbound or bound to the imcomming main connection!"); + AZ_Assert(conn->m_mainConnection == nullptr || conn->m_mainConnection == msg->m_connection, "This thread connection should be unbound or bound to the imcomming main connection!"); conn->m_mainConnection = msg->m_connection; - AZ_Assert(conn->m_mainConnection->m_threadConn.load() == NULL || conn->m_mainConnection->m_threadConn.load() == conn, "This main connection should be unbound or bound to us!"); + AZ_Assert(conn->m_mainConnection->m_threadConn.load() == nullptr || conn->m_mainConnection->m_threadConn.load() == conn, "This main connection should be unbound or bound to us!"); conn->m_mainConnection->m_threadConn = conn; } break; case CTM_DISCONNECT: { - AZ_Assert(msg->m_connection != NULL, "You must provide a valid connection pointer!"); + AZ_Assert(msg->m_connection != nullptr, "You must provide a valid connection pointer!"); ThreadConnection* tc = msg->m_connection->m_threadConn; if (tc && !tc->m_isDisconnecting) { @@ -2312,7 +2312,7 @@ CarrierThread::ThreadPump() } break; case CTM_DELETE_CONNECTION: { - ThreadConnection* tc = NULL; + ThreadConnection* tc = nullptr; tc = msg->m_threadConnection; if (tc) { @@ -2339,7 +2339,7 @@ CarrierThread::ThreadPump() ThreadMessage* mtm = aznew ThreadMessage(MTM_DELETE_CONNECTION); mtm->m_connection = msg->m_connection; RemoveConnectionToSend(mtm->m_threadConnection); - mtm->m_threadConnection = NULL; + mtm->m_threadConnection = nullptr; mtm->m_disconnectReason = msg->m_disconnectReason; PushMainThreadMessage(mtm); } @@ -2413,10 +2413,10 @@ CarrierThread::ThreadPump() if (tc->m_mainConnection) { RemoveConnectionToSend(tc); - tc->m_mainConnection->m_threadConn = NULL; + tc->m_mainConnection->m_threadConn = nullptr; ThreadMessage* mtm = aznew ThreadMessage(MTM_DELETE_CONNECTION); mtm->m_connection = tc->m_mainConnection; - mtm->m_threadConnection = NULL; + mtm->m_threadConnection = nullptr; mtm->m_disconnectReason = CarrierDisconnectReason::DISCONNECT_SHUTTING_DOWN; PushMainThreadMessage(mtm); } @@ -2582,7 +2582,7 @@ void CarrierThread::WriteAckData(ThreadConnection* connection, WriteBuffer& writ // Generate ACK bits SequenceNumber lastToAck; // last received datagram SequenceNumber firstToAck; // first received datagram (still in the list) - unsigned char* ackHistoryBits = NULL; + unsigned char* ackHistoryBits = nullptr; unsigned char ackNumHistoryBytes = 0; unsigned char ackHistoryBitsStorage[DataGramHistoryList::m_datagramHistoryMaxNumberOfBytes]; @@ -2736,7 +2736,7 @@ CarrierThread::ReadAckData(ThreadConnection* connection, ReadBuffer& readBuffer) return; } - if (connection != NULL && isAckData) + if (connection != nullptr && isAckData) { if (firstToAck != lastToAck) { @@ -3707,12 +3707,12 @@ CarrierImpl::~CarrierImpl() } delete m_thread; - m_thread = NULL; + m_thread = nullptr; if (m_ownHandshake) { delete m_handshake; - m_handshake = NULL; + m_handshake = nullptr; } } @@ -4235,13 +4235,13 @@ CarrierImpl::ProcessMainThreadMessages() // Process messages from the carrier thread { ThreadMessage* msg; - while ((msg = m_thread->PopMainThreadMessage()) != NULL) + while ((msg = m_thread->PopMainThreadMessage()) != nullptr) { switch (msg->m_code) { case MTM_NEW_CONNECTION: { - Connection* conn = NULL; + Connection* conn = nullptr; // check if we don't have it in the list. for(auto& c : m_connections) { @@ -4255,8 +4255,8 @@ CarrierImpl::ProcessMainThreadMessages() { // we already have such connection ThreadConnection* threadConn = conn->m_threadConn.load(AZStd::memory_order_acquire); - AZ_Assert(threadConn == NULL || threadConn == msg->m_threadConnection, "This main connection 0x%08x (%s) already have bound thread connection 0x%08x->0x%08x!", conn, conn->m_fullAddress.c_str(), threadConn, threadConn->m_mainConnection); - if (threadConn == NULL) + AZ_Assert(threadConn == nullptr || threadConn == msg->m_threadConnection, "This main connection 0x%08x (%s) already have bound thread connection 0x%08x->0x%08x!", conn, conn->m_fullAddress.c_str(), threadConn, threadConn->m_mainConnection); + if (threadConn == nullptr) { // request a bind we have not already ThreadMessage* ctm = aznew ThreadMessage(CTM_CONNECT); @@ -4283,23 +4283,23 @@ CarrierImpl::ProcessMainThreadMessages() // we will not even make a connection ThreadMessage* ctm = aznew ThreadMessage(CTM_DELETE_CONNECTION); ctm->m_threadConnection = msg->m_threadConnection; - ctm->m_connection = NULL; + ctm->m_connection = nullptr; ctm->m_disconnectReason = CarrierDisconnectReason::DISCONNECT_HANDSHAKE_REJECTED; m_thread->PushCarrierThreadMessage(ctm); } } break; case MTM_DISCONNECT: { - AZ_Assert(msg->m_connection != NULL, "You must provide a valid connection pointer!"); + AZ_Assert(msg->m_connection != nullptr, "You must provide a valid connection pointer!"); DisconnectRequest(msg->m_connection, msg->m_disconnectReason); } break; case MTM_DISCONNECT_TIMEOUT: { - AZ_Assert(msg->m_connection != NULL, "You must provide a valid connection pointer!"); + AZ_Assert(msg->m_connection != nullptr, "You must provide a valid connection pointer!"); if (msg->m_connection->m_state == Carrier::CST_DISCONNECTING) { // unbind from the thread connection and inform carrier thread to delete it. - ThreadConnection* threadConn = msg->m_connection->m_threadConn.exchange(NULL); + ThreadConnection* threadConn = msg->m_connection->m_threadConn.exchange(nullptr); msg->m_connection->m_state = Carrier::CST_DISCONNECTED; ThreadMessage* ctm = aznew ThreadMessage(CTM_DELETE_CONNECTION); ctm->m_connection = msg->m_connection; @@ -4311,7 +4311,7 @@ CarrierImpl::ProcessMainThreadMessages() } break; case MTM_DELETE_CONNECTION: { - AZ_Assert(msg->m_connection != NULL, "You must provide a valid connection pointer!"); + AZ_Assert(msg->m_connection != nullptr, "You must provide a valid connection pointer!"); DeleteConnection(msg->m_connection, msg->m_disconnectReason); } break; case MTM_ON_ERROR: @@ -4534,7 +4534,7 @@ CarrierImpl::ProcessSystemMessages() // Delete connection conn->m_state = Carrier::CST_DISCONNECTED; // unbind from the thread connection and inform carrier thread to delete it. - ThreadConnection* threadConn = conn->m_threadConn.exchange(NULL); + ThreadConnection* threadConn = conn->m_threadConn.exchange(nullptr); ThreadMessage* ctm = aznew ThreadMessage(CTM_DELETE_CONNECTION); ctm->m_connection = conn; ctm->m_threadConnection = threadConn; @@ -4829,7 +4829,7 @@ CarrierImpl::GetTime() void CarrierImpl::DebugDeleteConnection(ConnectionID id) { - if (id == InvalidConnectionID && m_thread != NULL) + if (id == InvalidConnectionID && m_thread != nullptr) { return; } @@ -4844,7 +4844,7 @@ CarrierImpl::DebugDeleteConnection(ConnectionID id) // Delete connection conn->m_state = Carrier::CST_DISCONNECTED; // unbind from the thread connection and inform carrier thread to delete it. - ThreadConnection* threadConn = conn->m_threadConn.exchange(NULL); + ThreadConnection* threadConn = conn->m_threadConn.exchange(nullptr); ThreadMessage* ctm = aznew ThreadMessage(CTM_DELETE_CONNECTION); ctm->m_connection = conn; ctm->m_threadConnection = threadConn; @@ -4914,7 +4914,7 @@ DefaultCarrier::Create(const CarrierDesc& desc, IGridMate* gridMate) AZStd::string CarrierEventsBase::ReasonToString(CarrierDisconnectReason reason) { - const char* reasonStr = 0; + const char* reasonStr = nullptr; switch (reason) { case CarrierDisconnectReason::DISCONNECT_USER_REQUESTED: diff --git a/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.cpp b/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.cpp index f9280d9918..8743e50e83 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.cpp +++ b/Code/Framework/GridMate/GridMate/Carrier/DefaultTrafficControl.cpp @@ -58,8 +58,8 @@ DefaultTrafficControl::~DefaultTrafficControl() void DefaultTrafficControl::OnConnect(TrafficControlConnectionId id, const AZStd::intrusive_ptr& address) { - AZ_Assert(id->m_trafficData == NULL, "We have already assigned traffic data to this connection!"); - if (id->m_trafficData != NULL) + AZ_Assert(id->m_trafficData == nullptr, "We have already assigned traffic data to this connection!"); + if (id->m_trafficData != nullptr) { return; } @@ -100,7 +100,7 @@ void DefaultTrafficControl::OnDisconnect(TrafficControlConnectionId id) { ConnectionData* cd = reinterpret_cast(id->m_trafficData); - id->m_trafficData = NULL; + id->m_trafficData = nullptr; bool isFound = false; for (ConnectionListType::iterator i = m_connections.begin(); i != m_connections.end(); ++i) { diff --git a/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.cpp b/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.cpp index 08c5408848..91fc1ca69b 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.cpp +++ b/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.cpp @@ -1081,7 +1081,7 @@ namespace GridMate }; sockaddr* sockAddr = reinterpret_cast(&sockAddrIn6); socklen_t sockAddrLen = sizeof(sockAddrIn6); - from = NULL; + from = nullptr; unsigned int recvd = m_platformDriver->Receive(data, maxDataSize, sockAddr, sockAddrLen, resultCode); @@ -1207,7 +1207,7 @@ namespace GridMate unsigned int port; if (!AddressToIPPort(address, ip, port)) { - return NULL; + return nullptr; } SocketDriverAddress drvAddr(this, ip, port); @@ -1313,7 +1313,7 @@ namespace GridMate fd_set fdwrite; FD_ZERO(&fdwrite); FD_SET(m_socket, &fdwrite); - select(FD_SETSIZE, 0, &fdwrite, 0, 0); + select(FD_SETSIZE, nullptr, &fdwrite, nullptr, nullptr); continue; } @@ -1376,7 +1376,7 @@ namespace GridMate FD_SET(m_socket, &fdread); timeval t = Platform::GetTimeValue(timeOut); - int result = select(FD_SETSIZE, &fdread, 0, 0, &t); + int result = select(FD_SETSIZE, &fdread, nullptr, nullptr, &t); if (result > 0) { m_parent.m_isStoppedWaitForData = true; diff --git a/Code/Framework/GridMate/GridMate/Carrier/StreamSecureSocketDriver.cpp b/Code/Framework/GridMate/GridMate/Carrier/StreamSecureSocketDriver.cpp index 759a2b5e47..647b34e1b9 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/StreamSecureSocketDriver.cpp +++ b/Code/Framework/GridMate/GridMate/Carrier/StreamSecureSocketDriver.cpp @@ -343,7 +343,7 @@ namespace GridMate break; } } - while (0); + while (false); // did everything successfully create and/or allocate? if (m_ssl && m_bioIn && m_bioOut && m_scratch) diff --git a/Code/Framework/GridMate/GridMate/GridMate.cpp b/Code/Framework/GridMate/GridMate/GridMate.cpp index 356f7ad16b..22b4fd7af6 100644 --- a/Code/Framework/GridMate/GridMate/GridMate.cpp +++ b/Code/Framework/GridMate/GridMate/GridMate.cpp @@ -36,7 +36,7 @@ namespace GridMate AZ_CLASS_ALLOCATOR(GridMateImpl, GridMateAllocator, 0); GridMateImpl(const GridMateDesc& desc); - virtual ~GridMateImpl(); + ~GridMateImpl() override; void Update() override; diff --git a/Code/Framework/GridMate/GridMate/Replica/Replica.cpp b/Code/Framework/GridMate/GridMate/Replica/Replica.cpp index c1de3b71f2..a05b92a7a0 100644 --- a/Code/Framework/GridMate/GridMate/Replica/Replica.cpp +++ b/Code/Framework/GridMate/GridMate/Replica/Replica.cpp @@ -777,7 +777,7 @@ namespace GridMate CtorContextBase::s_pCur->m_members.push_back(this); } //----------------------------------------------------------------------------- - CtorContextBase* CtorContextBase::s_pCur = NULL; + CtorContextBase* CtorContextBase::s_pCur = nullptr; //----------------------------------------------------------------------------- CtorContextBase::CtorContextBase() { diff --git a/Code/Framework/GridMate/GridMate/Replica/ReplicaMgr.cpp b/Code/Framework/GridMate/GridMate/Replica/ReplicaMgr.cpp index 2582710aa7..7a56393bd5 100644 --- a/Code/Framework/GridMate/GridMate/Replica/ReplicaMgr.cpp +++ b/Code/Framework/GridMate/GridMate/Replica/ReplicaMgr.cpp @@ -460,7 +460,7 @@ namespace GridMate { return iter->second; } - return NULL; + return nullptr; } //----------------------------------------------------------------------------- RepIdSeed ReplicaManager::ReserveIdBlock(PeerId requestor) @@ -995,7 +995,7 @@ namespace GridMate AZ_Assert(iObj->second, "Detected NULL replica pointer in replica map! (id=0x%x)", replicaId); return iObj->second; } - return ReplicaPtr(NULL); + return ReplicaPtr(nullptr); } //----------------------------------------------------------------------------- void ReplicaManager::_Unmarshal(ReadBuffer& rb, ReplicaPeer* pFrom) diff --git a/Code/Framework/GridMate/GridMate/Session/LANSession.cpp b/Code/Framework/GridMate/GridMate/Session/LANSession.cpp index e4e1c9e9b6..223085cf13 100644 --- a/Code/Framework/GridMate/GridMate/Session/LANSession.cpp +++ b/Code/Framework/GridMate/GridMate/Session/LANSession.cpp @@ -52,13 +52,13 @@ namespace GridMate MemberIDCompact GetID() const { return m_id; } - virtual AZStd::string ToString() const + AZStd::string ToString() const override { return AZStd::string::format("%x", m_id); } - virtual AZStd::string ToAddress() const { return m_address; } - virtual MemberIDCompact Compact() const { return m_id; } - virtual bool IsValid() const { return m_id != 0; } + AZStd::string ToAddress() const override { return m_address; } + MemberIDCompact Compact() const override { return m_id; } + bool IsValid() const override { return m_id != 0; } private: MemberIDCompact m_id; @@ -285,9 +285,9 @@ namespace GridMate static const char* GetChunkName() { return "GridMateLANMember"; } /// return an abstracted member id. (member ID is world unique but unrelated to player ID it's related to the session). - virtual const MemberID& GetId() const { return m_memberId; } + const MemberID& GetId() const override { return m_memberId; } /// returns a base player id, it's implementation is platform dependent. (NOT supported) - virtual const PlayerId* GetPlayerId() const { return nullptr; } + const PlayerId* GetPlayerId() const override { return nullptr; } /// Remote member ctor. LANMember(ConnectionID connId, const LANMemberID& id, LANSession* session); @@ -321,16 +321,16 @@ namespace GridMate friend class LANSessionService; public: GM_CLASS_ALLOCATOR(LANSearch); - virtual ~LANSearch(); + ~LANSearch() override; /// Return true if the search has finished, otherwise false. - virtual unsigned int GetNumResults() const { return static_cast(m_results.size()); } - virtual const SearchInfo* GetResult(unsigned int index) const { return &m_results[index]; } - virtual void AbortSearch(); + unsigned int GetNumResults() const override { return static_cast(m_results.size()); } + const SearchInfo* GetResult(unsigned int index) const override { return &m_results[index]; } + void AbortSearch() override; private: LANSearch(const LANSearchParams& searchParams, SessionService* service); - virtual void Update(); + void Update() override; void SearchDone(); Driver* m_driver; diff --git a/Code/Framework/GridMate/GridMate/Session/Session.cpp b/Code/Framework/GridMate/GridMate/Session/Session.cpp index 471e21127c..b731d82b71 100644 --- a/Code/Framework/GridMate/GridMate/Session/Session.cpp +++ b/Code/Framework/GridMate/GridMate/Session/Session.cpp @@ -63,40 +63,40 @@ namespace GridMate typedef unordered_set AddressSetType; GridSessionHandshake(unsigned int handshakeTimeoutMS, const VersionType& version); - virtual ~GridSessionHandshake() {} + ~GridSessionHandshake() override {} ////////////////////////////////////////////////////////////////////////// // Handshake /// Called from the system to write initial handshake data. - virtual void OnInitiate(ConnectionID id, WriteBuffer& wb); + void OnInitiate(ConnectionID id, WriteBuffer& wb) override; /** * Called when a system receives a handshake initiation from another system. * You can write a reply in the WriteBuffer. * return true if you accept this connection and false if you reject it. */ - virtual HandshakeErrorCode OnReceiveRequest(ConnectionID id, ReadBuffer& rb, WriteBuffer& wb); + HandshakeErrorCode OnReceiveRequest(ConnectionID id, ReadBuffer& rb, WriteBuffer& wb) override; /** * If we already have a valid connection and we receive another connection request, the system will * call this function to verify the state of the connection. */ - virtual bool OnConfirmRequest(ConnectionID id, ReadBuffer& rb); + bool OnConfirmRequest(ConnectionID id, ReadBuffer& rb) override; /** * Called when we receive Ack from the other system on our initial data \ref OnInitiate. * return true to accept the ack or false to reject the handshake. */ - virtual bool OnReceiveAck(ConnectionID id, ReadBuffer& rb) { (void)id; (void)rb; return true; } // we don't do any further filtering + bool OnReceiveAck(ConnectionID id, ReadBuffer& rb) override { (void)id; (void)rb; return true; } // we don't do any further filtering /** * Called when we receive Ack from the other system while we were connected. This callback is called * so we can just confirm that our connection is valid! */ - virtual bool OnConfirmAck(ConnectionID id, ReadBuffer& rb) { (void)id; (void)rb; return true; } // we don't do any further filtering + bool OnConfirmAck(ConnectionID id, ReadBuffer& rb) override { (void)id; (void)rb; return true; } // we don't do any further filtering /// Return true if you want to reject early reject a connection. - virtual bool OnNewConnection(const AZStd::string& address); + bool OnNewConnection(const AZStd::string& address) override; /// Called when we close a connection. - virtual void OnDisconnect(ConnectionID id); + void OnDisconnect(ConnectionID id) override; /// Return timeout in milliseconds of the handshake procedure. - virtual unsigned int GetHandshakeTimeOutMS() const { return m_handshakeTimeOutMS; } + unsigned int GetHandshakeTimeOutMS() const override { return m_handshakeTimeOutMS; } ////////////////////////////////////////////////////////////////////////// void BanAddress(AZStd::string address); diff --git a/Code/Framework/GridMate/Tests/Carrier.cpp b/Code/Framework/GridMate/Tests/Carrier.cpp index 9a18eb9a2c..5b18a80221 100644 --- a/Code/Framework/GridMate/Tests/Carrier.cpp +++ b/Code/Framework/GridMate/Tests/Carrier.cpp @@ -90,7 +90,7 @@ public: { } - ~CarrierCallbacksHandler() + ~CarrierCallbacksHandler() override { CarrierEventBus::Handler::BusDisconnect(); } diff --git a/Code/Framework/GridMate/Tests/CarrierStreamSocketDriverTests.cpp b/Code/Framework/GridMate/Tests/CarrierStreamSocketDriverTests.cpp index 6af6a6ab87..8ec3ad540f 100644 --- a/Code/Framework/GridMate/Tests/CarrierStreamSocketDriverTests.cpp +++ b/Code/Framework/GridMate/Tests/CarrierStreamSocketDriverTests.cpp @@ -65,7 +65,7 @@ public: { } - ~CarrierStreamCallbacksHandler() + ~CarrierStreamCallbacksHandler() override { if (m_active) { diff --git a/Code/Framework/GridMate/Tests/ReplicaBehavior.cpp b/Code/Framework/GridMate/Tests/ReplicaBehavior.cpp index 22771cc035..f6f88d2dff 100644 --- a/Code/Framework/GridMate/Tests/ReplicaBehavior.cpp +++ b/Code/Framework/GridMate/Tests/ReplicaBehavior.cpp @@ -282,7 +282,7 @@ namespace ReplicaBehavior { GM_CLASS_ALLOCATOR(EntityLikeScriptReplicaChunk); EntityLikeScriptReplicaChunk(); - ~EntityLikeScriptReplicaChunk() = default; + ~EntityLikeScriptReplicaChunk() override = default; ////////////////////////////////////////////////////////////////////// //! GridMate::ReplicaChunk overrides. @@ -296,7 +296,7 @@ namespace ReplicaBehavior { int GetMaxServerProperties() const { return k_maxScriptableDataSets; } - AZ::u32 CalculateDirtyDataSetMask(MarshalContext& marshalContext); + AZ::u32 CalculateDirtyDataSetMask(MarshalContext& marshalContext) override; EntityLikeScriptDataSet m_scriptDataSets[k_maxScriptableDataSets]; AZ::u32 m_enabledDataSetMask; @@ -815,7 +815,7 @@ namespace ReplicaBehavior { m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~Integ_ReplicaDefaultDataSetDriller() + ~Integ_ReplicaDefaultDataSetDriller() override { m_driller.BusDisconnect(); } @@ -928,7 +928,7 @@ namespace ReplicaBehavior { m_replicaU8Id = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica2); } - ~Integ_Replica_ComparePackingBoolsVsU8() + ~Integ_Replica_ComparePackingBoolsVsU8() override { m_driller.BusDisconnect(); } @@ -1057,7 +1057,7 @@ namespace ReplicaBehavior { m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~Integ_CheckDataSetStreamIsntWrittenMoreThanNecessary() + ~Integ_CheckDataSetStreamIsntWrittenMoreThanNecessary() override { m_driller.BusDisconnect(); } @@ -1154,7 +1154,7 @@ namespace ReplicaBehavior { m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~Integ_CheckDataSetStreamIsntWrittenMoreThanNecessaryOnceDirty() + ~Integ_CheckDataSetStreamIsntWrittenMoreThanNecessaryOnceDirty() override { m_driller.BusDisconnect(); } @@ -1248,7 +1248,7 @@ namespace ReplicaBehavior { m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~Integ_CheckReplicaIsntSentWithNoChanges() + ~Integ_CheckReplicaIsntSentWithNoChanges() override { m_driller.BusDisconnect(); } @@ -1359,7 +1359,7 @@ namespace ReplicaBehavior { m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~Integ_CheckEntityScriptReplicaIsntSentWithNoChanges() + ~Integ_CheckEntityScriptReplicaIsntSentWithNoChanges() override { m_driller.BusDisconnect(); } diff --git a/Code/Framework/GridMate/Tests/ReplicaMedium.cpp b/Code/Framework/GridMate/Tests/ReplicaMedium.cpp index c1148c4fdb..61fe9d65b2 100644 --- a/Code/Framework/GridMate/Tests/ReplicaMedium.cpp +++ b/Code/Framework/GridMate/Tests/ReplicaMedium.cpp @@ -601,7 +601,7 @@ class MPSession { public: - ~MPSession() + ~MPSession() override { CarrierEventBus::Handler::BusDisconnect(); } @@ -2007,7 +2007,7 @@ public: m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~Integ_ReplicaDriller() + ~Integ_ReplicaDriller() override { m_driller.BusDisconnect(); } @@ -2893,7 +2893,7 @@ public: m_replicaId = m_sessions[sHost].GetReplicaMgr().AddPrimary(replica); } - ~ReplicaACKfeedbackTestFixture() + ~ReplicaACKfeedbackTestFixture() override { m_driller.BusDisconnect(); } diff --git a/Code/Framework/GridMate/Tests/ReplicaSmall.cpp b/Code/Framework/GridMate/Tests/ReplicaSmall.cpp index 3b3942e8f3..d71789ae90 100644 --- a/Code/Framework/GridMate/Tests/ReplicaSmall.cpp +++ b/Code/Framework/GridMate/Tests/ReplicaSmall.cpp @@ -254,7 +254,7 @@ public: s_nInstances++; } - ~OfflineChunk() + ~OfflineChunk() override { s_nInstances--; } @@ -273,7 +273,7 @@ public: return true; } - bool IsReplicaMigratable() { return true; } + bool IsReplicaMigratable() override { return true; } DataSet m_data1; DataSet::BindInterface m_data2; diff --git a/Code/Framework/GridMate/Tests/Session.cpp b/Code/Framework/GridMate/Tests/Session.cpp index 0c5baef483..d4f56871c5 100644 --- a/Code/Framework/GridMate/Tests/Session.cpp +++ b/Code/Framework/GridMate/Tests/Session.cpp @@ -71,7 +71,7 @@ namespace UnitTest AZ_TEST_ASSERT(GridMate::LANSessionServiceBus::FindFirstHandler(m_clientGridMate) != nullptr); ////////////////////////////////////////////////////////////////////////// } - virtual ~Integ_LANSessionMatchmakingParamsTest() + ~Integ_LANSessionMatchmakingParamsTest() override { SessionEventBus::MultiHandler::BusDisconnect(m_gridMate); SessionEventBus::MultiHandler::BusDisconnect(m_clientGridMate); @@ -290,7 +290,7 @@ namespace UnitTest AZ_TEST_ASSERT(LANSessionServiceBus::FindFirstHandler(m_peers[i].m_gridMate) != nullptr); } } - virtual ~Integ_LANSessionTest() + ~Integ_LANSessionTest() override { StopGridMateService(m_peers[0].m_gridMate); @@ -645,7 +645,7 @@ namespace UnitTest } } - virtual ~Integ_LANMultipleSessionTest() + ~Integ_LANMultipleSessionTest() override { GridMate::StopGridMateService(m_gridMates[0]); @@ -884,7 +884,7 @@ namespace UnitTest } } - virtual ~Integ_LANLatencySessionTest() + ~Integ_LANLatencySessionTest() override { StopGridMateService(m_gridMates[0]); @@ -1283,7 +1283,7 @@ namespace UnitTest //StartDrilling("lanmigration"); } - virtual ~Integ_LANSessionMigarationTestTest() + ~Integ_LANSessionMigarationTestTest() override { StopGridMateService(m_gridMates[0]); @@ -1597,7 +1597,7 @@ namespace UnitTest //StartDrilling("lanmigration2"); } - virtual ~Integ_LANSessionMigarationTestTest2() + ~Integ_LANSessionMigarationTestTest2() override { StopGridMateService(m_gridMates[0]); diff --git a/Code/Framework/GridMate/Tests/test_Main.cpp b/Code/Framework/GridMate/Tests/test_Main.cpp index 7fc71ef125..cbe4a09ef4 100644 --- a/Code/Framework/GridMate/Tests/test_Main.cpp +++ b/Code/Framework/GridMate/Tests/test_Main.cpp @@ -14,12 +14,12 @@ struct GridMateTestEnvironment : public AZ::Test::ITestEnvironment , public AZ::Debug::TraceMessageBus::Handler { - void SetupEnvironment() override final + void SetupEnvironment() final { AZ::AllocatorInstance::Create(); BusConnect(); } - void TeardownEnvironment() override final + void TeardownEnvironment() final { BusDisconnect(); AZ::AllocatorInstance::Destroy(); From b5a32e1c4cdb759d6211a003d4488e414bc09ce9 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 13:33:11 -0700 Subject: [PATCH 096/355] remove temporay files in all cases Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Tools/UpgradeTool/VersionExplorer.cpp | 28 +++++++++++++++++-- .../Tools/UpgradeTool/VersionExplorer.h | 3 ++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index f7ff59978c..eb7c609bee 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -464,6 +464,7 @@ namespace ScriptCanvasEditor AZ::Data::AssetCatalogRequestBus::BroadcastResult(relativePath, &AZ::Data::AssetCatalogRequests::GetAssetPathById, asset.GetId()); bool fullPathFound = false; AzToolsFramework::AssetSystemRequestBus::BroadcastResult(fullPathFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath, relativePath, fullPath); + m_tmpFileName.clear(); AZStd::string tmpFileName; // here we are saving the graph to a temp file instead of the original file and then copying the temp file to the original file. // This ensures that AP will not a get a file change notification on an incomplete graph file causing it to fail processing. Temp files are ignored by AP. @@ -486,6 +487,8 @@ namespace ScriptCanvasEditor fileStream.Close(); } + // attempt to remove temporary file no matter what + m_tmpFileName = tmpFileName; if (!tempSavedSucceeded) { GraphUpgradeComplete(asset, OperationResult::Failure, "Save asset data to temporary file failed"); @@ -543,11 +546,13 @@ namespace ScriptCanvasEditor if (remainingAttempts == 0) { + // all attempts failed, give up AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s. giving up", target.c_str()); GraphUpgradeComplete(asset, OperationResult::Failure, "Failed to move updated file from backup to source destination"); } else if (remainingAttempts == 2) { + // before the final attempt, flush all caches AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to source destination failed: %s, trying again", target.c_str()); auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCaches(); @@ -562,9 +567,11 @@ namespace ScriptCanvasEditor } else { + // the actual move attempt auto moveResult = AZ::IO::SmartMove(source.c_str(), target.c_str()); if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success) { + m_tmpFileName.clear(); auto streamer = AZ::Interface::Get(); AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str()); // Bump the slice asset up in the asset processor's queue. @@ -590,13 +597,26 @@ namespace ScriptCanvasEditor } void VersionExplorer::GraphUpgradeComplete - (const AZ::Data::Asset asset, OperationResult result, AZStd::string_view message) + ( const AZ::Data::Asset asset, OperationResult result, AZStd::string_view message) { AZStd::lock_guard lock(m_mutex); m_upgradeComplete = true; m_upgradeResult = result; m_upgradeMessage = message; m_upgradeAsset = asset; + + if (!m_tmpFileName.empty()) + { + AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); + AZ_Assert(fileIO, "GraphUpgradeComplete: No FileIO instance"); + + if (fileIO->Exists(m_tmpFileName.c_str()) && !fileIO->Remove(m_tmpFileName.c_str())) + { + AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "Failed to remove temporary file: %s", m_tmpFileName.c_str()); + } + } + + m_tmpFileName.clear(); } void VersionExplorer::GraphUpgradeCompleteUIUpdate @@ -641,7 +661,6 @@ namespace ScriptCanvasEditor Log("FinalizeUpgrade!"); m_inProgress = false; m_assetsToUpgrade.clear(); - m_ui->upgradeAllButton->setEnabled(false); m_ui->onlyShowOutdated->setEnabled(true); @@ -651,6 +670,10 @@ namespace ScriptCanvasEditor { m_ui->spinner->SetText("
Some graphs will require manual corrections, you will be prompted to review them upon closing this dialog"); } + else + { + m_ui->spinner->SetText("Upgrade complete."); + } AZ::SystemTickBus::Handler::BusDisconnect(); AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); @@ -691,6 +714,7 @@ namespace ScriptCanvasEditor m_inspectedAssets = 0; m_currentAssetRowIndex = 0; m_ui->progressFrame->setVisible(true); + m_ui->progressBar->setVisible(true); m_ui->progressBar->setRange(0, aznumeric_cast(m_assetsToInspect.size())); m_ui->progressBar->setValue(0); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index 02476c4126..dc7516abc4 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -119,6 +119,7 @@ namespace ScriptCanvasEditor bool IsUpgrading() const; bool m_inProgress = false; + // scan fields size_t m_currentAssetRowIndex = 0; size_t m_inspectedAssets = 0; size_t m_failedAssets = 0; @@ -134,11 +135,13 @@ namespace ScriptCanvasEditor AZStd::unique_ptr m_ui; + // upgrade fields AZStd::recursive_mutex m_mutex; bool m_upgradeComplete = false; AZ::Data::Asset m_upgradeAsset; OperationResult m_upgradeResult; AZStd::string m_upgradeMessage; + AZStd::string m_tmpFileName; AZStd::unique_ptr m_keepEditorAlive; From e7135832f6f69063db2bd2b371951d04ce95c189 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 13:56:31 -0700 Subject: [PATCH 097/355] remove unit tests with old style assets Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- ...st_SimultaneousDataInputError.scriptcanvas | 1396 ----------------- ...aneousDataInputErrorSource.scriptcanvas_fn | 1331 ---------------- 2 files changed, 2727 deletions(-) delete mode 100644 Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputError.scriptcanvas delete mode 100644 Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputErrorSource.scriptcanvas_fn diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputError.scriptcanvas b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputError.scriptcanvas deleted file mode 100644 index b4f2ad14fa..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputError.scriptcanvas +++ /dev/null @@ -1,1396 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputErrorSource.scriptcanvas_fn b/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputErrorSource.scriptcanvas_fn deleted file mode 100644 index 145019ed18..0000000000 --- a/Gems/ScriptCanvasTesting/Assets/ScriptCanvas/UnitTests/LY_SC_UnitTest_SimultaneousDataInputErrorSource.scriptcanvas_fn +++ /dev/null @@ -1,1331 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From daf901e809a30e93aa531e5984a2e136cb1990a1 Mon Sep 17 00:00:00 2001 From: SJ Date: Thu, 2 Sep 2021 14:16:13 -0700 Subject: [PATCH 098/355] Set target_file variable since it's still being used in Mac runtime dependencies cmake file (#3905) Signed-off-by: amzn-sj --- cmake/Platform/Common/RuntimeDependencies_common.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/Platform/Common/RuntimeDependencies_common.cmake b/cmake/Platform/Common/RuntimeDependencies_common.cmake index dbc8513c97..95d91da7f7 100644 --- a/cmake/Platform/Common/RuntimeDependencies_common.cmake +++ b/cmake/Platform/Common/RuntimeDependencies_common.cmake @@ -263,6 +263,7 @@ function(ly_delayed_generate_runtime_dependencies) # Generate the output file, note the STAMP_OUTPUT_FILE need to match with the one defined in LYWrappers.cmake set(STAMP_OUTPUT_FILE ${CMAKE_BINARY_DIR}/runtime_dependencies/$/${target}_$.stamp) set(target_file_dir "$") + set(target_file "$") ly_file_read(${LY_RUNTIME_DEPENDENCIES_TEMPLATE} template_file) string(CONFIGURE "${LY_COPY_COMMANDS}" LY_COPY_COMMANDS @ONLY) string(CONFIGURE "${template_file}" configured_template_file @ONLY) From f6acf4321d7c680f8cedb6c556bd99a579c425f3 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Thu, 2 Sep 2021 15:37:29 -0700 Subject: [PATCH 099/355] Did a major refactor of ui to be less dependent on levels Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 48 ++-- Code/Editor/CryEditDoc.cpp | 245 ++--------------- Code/Editor/CryEditDoc.h | 15 +- Code/Editor/EditorPreferencesPageGeneral.cpp | 24 +- Code/Editor/EditorPreferencesPageGeneral.h | 8 +- Code/Editor/Settings.cpp | 11 +- Code/Editor/Settings.h | 8 +- Code/Editor/Style/Editor.qss | 29 +- .../PrefabEditorEntityOwnershipInterface.h | 3 + .../PrefabEditorEntityOwnershipService.cpp | 15 ++ .../PrefabEditorEntityOwnershipService.h | 2 + .../AzToolsFramework/Prefab/PrefabLoader.cpp | 20 +- .../AzToolsFramework/Prefab/PrefabLoader.h | 4 +- .../Prefab/PrefabLoaderInterface.h | 10 +- .../Prefab/PrefabSystemComponent.cpp | 52 +++- .../Prefab/PrefabSystemComponent.h | 6 +- .../Prefab/PrefabSystemComponentInterface.h | 8 +- .../UI/Prefab/PrefabIntegrationInterface.h | 4 + .../UI/Prefab/PrefabIntegrationManager.cpp | 252 ++++++++++++++++++ .../UI/Prefab/PrefabIntegrationManager.h | 13 + 20 files changed, 458 insertions(+), 319 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 83a98ca67b..ecbdde7f13 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -728,19 +728,26 @@ void CCryEditApp::OnFileSave() const QScopedValueRollback rollback(m_savingLevel, true); - GetIEditor()->GetDocument()->DoFileSave(); + bool usePrefabSystemForLevels = false; AzFramework::ApplicationRequests::Bus::BroadcastResult( usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); - if (usePrefabSystemForLevels) + + + if (!usePrefabSystemForLevels) { - auto prefabSystemComponentInterface = AZ::Interface::Get(); - if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) - { - GetIEditor()->GetDocument()->ExecuteSavePrefabsDialog(); - } + GetIEditor()->GetDocument()->DoFileSave(); + } + else + { + //auto prefabSystemComponentInterface = AZ::Interface::Get(); + auto prefabEditorEntityOwnershipService = AZ::Interface::Get(); + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipService->GetRootPrefabTemplateId(); + auto prefabIntegrationInterface = AZ::Interface::Get(); + prefabIntegrationInterface->ExecuteSavePrefabsDialog(rootPrefabTemplateId, true); + // prefabSystemComponentInterface->AreDirtyTemplatesPresent(rootPrefabTemplateId) } } @@ -3186,18 +3193,12 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) } else { - using namespace AzToolsFramework::Prefab; + auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + auto prefabIntegrationInterface = AZ::Interface::Get(); + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); - auto prefabSystemComponentInterface = AZ::Interface::Get(); - auto prefabSaveSelectionDialog = GetIEditor()->GetDocument()->ConstructSaveLevelDialog(); - - int prefabSaveSelection = prefabSaveSelectionDialog->exec(); - QCheckBox* saveAllPrefabsPreferenceCheckBox = - prefabSaveSelectionDialog->findChild("SaveAllPrefabsPreferenceCheckBox"); - QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); - SavePrefabsPreference savePrefabsPreference = saveAllPrefabsCheckBox->isChecked() - ? SavePrefabsPreference::SaveAll - : SavePrefabsPreference::SaveNone; + int prefabSaveSelection = + prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. switch (1 - prefabSaveSelection) @@ -3210,16 +3211,7 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) wasCreateLevelOperationCancelled = true; return false; } - if (saveAllPrefabsPreferenceCheckBox->checkState() == Qt::CheckState::Checked) - { - gSettings.SetSavePrefabsPreference(savePrefabsPreference); - gSettings.Save(); - } - if (savePrefabsPreference == SavePrefabsPreference::SaveAll) - { - prefabSystemComponentInterface->SaveAllDirtyTemplates(); - } - bIsDocModified = prefabSystemComponentInterface->AreDirtyTemplatesPresent(); + bIsDocModified = false; break; case QDialogButtonBox::RejectRole: wasCreateLevelOperationCancelled = true; diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 3e619aba24..3fb39d4268 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -15,8 +15,14 @@ #include #include #include +#include +#include +#include +#include +#include #include #include +#include // AzCore #include @@ -34,9 +40,6 @@ #include #include #include -#include -#include -#include // Editor #include "Settings.h" @@ -138,6 +141,14 @@ CCryEditDoc::CCryEditDoc() RegisterConsoleVariables(); MainWindow::instance()->GetActionManager()->RegisterActionHandler(ID_FILE_SAVE_AS, this, &CCryEditDoc::OnFileSaveAs); + m_prefabSystemComponentInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabSystemComponentInterface, "PrefabSystemComponentInterface is not found."); + m_prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabEditorEntityOwnershipInterface, "PrefabEditorEntityOwnershipInterface is not found."); + m_prefabLoaderInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabLoaderInterface, "PrefabLoaderInterface is not found."); + m_prefabIntegrationInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabIntegrationInterface, "PrefabIntegrationInterface is not found."); } CCryEditDoc::~CCryEditDoc() @@ -699,29 +710,18 @@ bool CCryEditDoc::SaveModified() { using namespace AzToolsFramework::Prefab; - auto prefabSystemComponentInterface = AZ::Interface::Get(); - auto prefabSaveSelectionDialog = ConstructSaveLevelDialog(); - - int prefabSaveSelection = prefabSaveSelectionDialog->exec(); - QCheckBox* saveAllPrefabsPreferenceCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsPreferenceCheckBox"); - QCheckBox* saveAllPrefabsCheckBox = prefabSaveSelectionDialog->findChild("SaveAllPrefabsCheckbox"); - SavePrefabsPreference savePrefabsPreference = - saveAllPrefabsCheckBox->isChecked() ? SavePrefabsPreference::SaveAll : SavePrefabsPreference::SaveNone; + TemplateId rootPrefabTemplateId = m_prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); + if (!m_prefabSystemComponentInterface->AreDirtyTemplatesPresent(rootPrefabTemplateId)) + { + return true; + } + + int prefabSaveSelection = m_prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: - DoFileSave(); - if (saveAllPrefabsPreferenceCheckBox->checkState() == Qt::CheckState::Checked) - { - gSettings.SetSavePrefabsPreference(savePrefabsPreference); - gSettings.Save(); - } - if (savePrefabsPreference == SavePrefabsPreference::SaveAll) - { - prefabSystemComponentInterface->SaveAllDirtyTemplates(); - } return true; case QDialogButtonBox::RejectRole: return false; @@ -749,11 +749,9 @@ void CCryEditDoc::OnFileSaveAs() usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); if (usePrefabSystemForLevels) { - auto prefabSystemComponentInterface = AZ::Interface::Get(); - if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) - { - ExecuteSavePrefabsDialog(); - } + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = + m_prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); + SetModifiedFlag(m_prefabSystemComponentInterface->AreDirtyTemplatesPresent(rootPrefabTemplateId)); } } } @@ -1311,8 +1309,7 @@ bool CCryEditDoc::SaveLevel(const QString& filename) } else { - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - if (prefabEditorEntityOwnershipInterface) + if (m_prefabEditorEntityOwnershipInterface) { AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); AZ_Assert(fileIO, "No File IO implementation available"); @@ -1323,7 +1320,7 @@ bool CCryEditDoc::SaveLevel(const QString& filename) if (openResult) { AZ::IO::FileIOStream stream(tempSaveFileHandle, AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeBinary, false); - contentsAllSaved = prefabEditorEntityOwnershipInterface->SaveToStream(stream, AZStd::string_view(filenameStrData.data(), filenameStrData.size())); + contentsAllSaved = m_prefabEditorEntityOwnershipInterface->SaveToStream(stream, AZStd::string_view(filenameStrData.data(), filenameStrData.size())); stream.Close(); } } @@ -2264,196 +2261,6 @@ void CCryEditDoc::OnSliceInstantiationFailed(const AZ::Data::AssetId& sliceAsset } ////////////////////////////////////////////////////////////////////////// -AZStd::shared_ptr CCryEditDoc::ConstructSaveLevelDialog() -{ - using namespace AzToolsFramework::Prefab; - auto prefabLoaderInterface = AZ::Interface::Get(); - SavePrefabsPreference savePrefabsPreference = prefabLoaderInterface->GetSavePrefabsPreference(); - - AZStd::shared_ptr saveModifiedMessageBox = AZStd::make_shared(AzToolsFramework::GetActiveWindow()); - AZStd::weak_ptr saveModifiedMessageBoxWeakPtr(saveModifiedMessageBox); - // saveModifiedMessageBox.overrideWindowFlags((saveModifiedMessageBox.windowFlags()) & ~Qt::WindowCloseButtonHint); - saveModifiedMessageBox->setObjectName("SaveDirtyLevelDialog"); - - // Main Content section begins. - QVBoxLayout* contentLayout = new QVBoxLayout(saveModifiedMessageBox.get()); - QFrame* levelEntitiesSaveQuestionFrame = new QFrame(saveModifiedMessageBox.get()); - QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(saveModifiedMessageBox.get()); - levelEntitiesSaveQuestionFrame->setObjectName("LevelEntitiesSaveQuestionFrame"); - - // Add a warning icon next to save entities question. - levelEntitiesSaveQuestionFrame->setLayout(levelEntitiesSaveQuestionLayout); - QPixmap warningIcon(QString(":/Notifications/warning.svg")); - QLabel* warningIconContainer = new QLabel(); - warningIconContainer->setPixmap(warningIcon); - warningIconContainer->setFixedWidth(warningIcon.width()); - levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); - - // Ask user if they want to save entities in level. - QLabel* levelEntitiesSaveQuestionLabel = new QLabel("Do you want to save unsaved entities in the level?"); - levelEntitiesSaveQuestionLayout->addWidget(levelEntitiesSaveQuestionLabel); - contentLayout->addWidget(levelEntitiesSaveQuestionFrame); - - // Ask user if they want to save unsaved prefabs in the level too. - QCheckBox* saveAllPrefabsCheckbox = new QCheckBox("Save all unsaved prefabs in the level too."); - AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsCheckbox); - saveAllPrefabsCheckbox->setObjectName("SaveAllPrefabsCheckbox"); - if (savePrefabsPreference == SavePrefabsPreference::SaveAll) - { - saveAllPrefabsCheckbox->setCheckState(Qt::CheckState::Checked); - } - QObject::connect( - saveAllPrefabsCheckbox, &QCheckBox::stateChanged, - [&savePrefabsPreference](int state) - { - savePrefabsPreference = static_cast(state) == Qt::CheckState::Checked ? SavePrefabsPreference::SaveAll - : SavePrefabsPreference::SaveNone; - }); - contentLayout->addWidget(saveAllPrefabsCheckbox); - - // Footer section begins. - QFrame* footerSeparatorLine = new QFrame(); - footerSeparatorLine->setObjectName("FooterSeparatorLine"); - footerSeparatorLine->setFrameShape(QFrame::HLine); - contentLayout->addWidget(footerSeparatorLine); - QHBoxLayout* footerLayout = new QHBoxLayout(saveModifiedMessageBox.get()); - - // Provide option for user to remember their prefab save preference. - QCheckBox* saveAllPrefabsPreferenceCheckBox = new QCheckBox("Remember my preference."); - saveAllPrefabsPreferenceCheckBox->setObjectName("SaveAllPrefabsPreferenceCheckBox"); - AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreferenceCheckBox); - if (savePrefabsPreference != SavePrefabsPreference::Unspecified) - { - saveAllPrefabsPreferenceCheckBox->setCheckState(Qt::CheckState::Checked); - } - QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(saveModifiedMessageBox.get()); - footerPreferenceLayout->addWidget(saveAllPrefabsPreferenceCheckBox); - QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); - prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); - footerPreferenceLayout->addWidget(prefabSavePreferenceHint); - footerLayout->addLayout(footerPreferenceLayout); - QDialogButtonBox* prefabSaveConfirmationButtons = - new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Discard | QDialogButtonBox::Cancel); - footerLayout->addWidget(prefabSaveConfirmationButtons); - contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, saveModifiedMessageBox.get(), &QDialog::accept); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, saveModifiedMessageBox.get(), &QDialog::reject); - connect( - prefabSaveConfirmationButtons, &QDialogButtonBox::clicked, saveModifiedMessageBox.get(), - [saveModifiedMessageBoxWeakPtr, prefabSaveConfirmationButtons](QAbstractButton* button) - { - int prefabSaveSelection = prefabSaveConfirmationButtons->buttonRole(button); - saveModifiedMessageBoxWeakPtr.lock()->done(prefabSaveSelection); - }); - AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.get(), QStringLiteral("style:Editor.qss")); - return saveModifiedMessageBox; -} - -void CCryEditDoc::ExecuteSavePrefabsDialog() -{ - using namespace AzToolsFramework::Prefab; - - auto prefabSystemComponentInterface = AZ::Interface::Get(); - auto prefabLoaderInterface = AZ::Interface::Get(); - SavePrefabsPreference savePrefabsPreference = prefabLoaderInterface->GetSavePrefabsPreference(); - - if (savePrefabsPreference == SavePrefabsPreference::SaveAll) - { - prefabSystemComponentInterface->SaveAllDirtyTemplates(); - SetModifiedFlag(false); - } - else if (savePrefabsPreference == SavePrefabsPreference::SaveNone) - { - if (prefabSystemComponentInterface->AreDirtyTemplatesPresent()) - { - SetModifiedFlag(true); - } - } - else // SavePrefabsPreference::Unspecified - { - QDialog saveModifiedMessageBox(AzToolsFramework::GetActiveWindow()); - - // Main Content section begins. - saveModifiedMessageBox.setObjectName("SaveAllPrefabsDialog"); - QBoxLayout* contentLayout = new QVBoxLayout(&saveModifiedMessageBox); - QFrame* levelSavedMessageFrame = new QFrame(&saveModifiedMessageBox); - QHBoxLayout* levelSavedMessageLayout = new QHBoxLayout(&saveModifiedMessageBox); - levelSavedMessageFrame->setObjectName("LevelSavedMessageFrame"); - - // Add a checkMark icon next to the level entities saved message. - QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); - QLabel* levelSavedSuccessfullyIconContainer = new QLabel(); - levelSavedSuccessfullyIconContainer->setPixmap(checkMarkIcon); - levelSavedSuccessfullyIconContainer->setFixedWidth(checkMarkIcon.width()); - - // Add a message that level entities are saved successfully. - QLabel* levelSavedSuccessfullyLabel = new QLabel("All entities inside level have been saved successfully."); - levelSavedSuccessfullyLabel->setObjectName("LevelSavedSuccessfullyLabel"); - levelSavedMessageLayout->addWidget(levelSavedSuccessfullyIconContainer); - levelSavedMessageLayout->addWidget(levelSavedSuccessfullyLabel); - levelSavedMessageFrame->setLayout(levelSavedMessageLayout); - - QFrame* prefabSaveQuestionFrame = new QFrame(&saveModifiedMessageBox); - QHBoxLayout* prefabSaveQuestionLayout = new QHBoxLayout(&saveModifiedMessageBox); - - // Add a warning icon next to prefabs save question. - QLabel* warningIconContainer = new QLabel(); - QPixmap warningIcon(QString(":/Notifications/warning.svg")); - warningIconContainer->setPixmap(warningIcon); - warningIconContainer->setFixedWidth(warningIcon.width()); - prefabSaveQuestionLayout->addWidget(warningIconContainer); - - // Ask if user wants all prefabs saved. - QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save all unsaved prefabs?"); - prefabSaveQuestionFrame->setObjectName("PrefabSaveQuestionFrame"); - prefabSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); - prefabSaveQuestionFrame->setLayout(prefabSaveQuestionLayout); - contentLayout->addWidget(levelSavedMessageFrame); - contentLayout->addWidget(prefabSaveQuestionFrame); - - // Footer section begins. - QFrame* footerSeparatorLine = new QFrame(); - footerSeparatorLine->setObjectName("FooterSeparatorLine"); - footerSeparatorLine->setFrameShape(QFrame::HLine); - contentLayout->addWidget(footerSeparatorLine); - QHBoxLayout* footerLayout = new QHBoxLayout(&saveModifiedMessageBox); - - // Provide option for user to remember their prefab save preference. - QCheckBox* saveAllPrefabsPreference = new QCheckBox("Remember my preference."); - AzQtComponents::CheckBox::applyToggleSwitchStyle(saveAllPrefabsPreference); - QVBoxLayout* footerPreferenceLayout = new QVBoxLayout(&saveModifiedMessageBox); - footerPreferenceLayout->addWidget(saveAllPrefabsPreference); - QLabel* prefabSavePreferenceHint = new QLabel("You can change this anytime in Edit -> Editor Settings -> GlobalPreferences."); - prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); - footerPreferenceLayout->addWidget(prefabSavePreferenceHint); - footerLayout->addLayout(footerPreferenceLayout); - QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); - footerLayout->addWidget(prefabSaveConfirmationButtons); - contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, &saveModifiedMessageBox, &QDialog::accept); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, &saveModifiedMessageBox, &QDialog::reject); - AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.parentWidget(), QStringLiteral("style:Editor.qss")); - - int prefabSaveSelection = saveModifiedMessageBox.exec(); - - if (saveAllPrefabsPreference->checkState() == Qt::CheckState::Checked) - { - gSettings.SetSavePrefabsPreference(savePrefabsPreference); - gSettings.Save(); - } - switch (prefabSaveSelection) - { - case QDialog::Accepted: - prefabSystemComponentInterface->SaveAllDirtyTemplates(); - SetModifiedFlag(false); - break; - case QDialog::Rejected: - SetModifiedFlag(true); - break; - } - } -} - namespace AzToolsFramework { void CryEditDocFuncsHandler::Reflect(AZ::ReflectContext* context) diff --git a/Code/Editor/CryEditDoc.h b/Code/Editor/CryEditDoc.h index 3a12b461fb..b47f4f0645 100644 --- a/Code/Editor/CryEditDoc.h +++ b/Code/Editor/CryEditDoc.h @@ -13,8 +13,13 @@ #if !defined(Q_MOC_RUN) #include "DocMultiArchive.h" +#include #include +#include +#include +#include #include +#include #include #include #endif @@ -104,12 +109,6 @@ public: // Create from serialization only bool CanCloseFrame(); - //! Returns a Modal containing options to save the current level. - AZStd::shared_ptr ConstructSaveLevelDialog(); - - //! Executes a Modal asking users about their prefabs save preference. - void ExecuteSavePrefabsDialog(); - enum class FetchPolicy { DELETE_FOLDER, @@ -215,6 +214,10 @@ protected: const char* m_envProbeSliceRelativePath = "EngineAssets/Slices/DefaultLevelSetup.slice"; const float m_envProbeHeight = 200.0f; bool m_hasErrors = false; ///< This is used to warn the user that they may lose work when they go to save. + AzToolsFramework::Prefab::PrefabSystemComponentInterface* m_prefabSystemComponentInterface = nullptr; + AzToolsFramework::PrefabEditorEntityOwnershipInterface* m_prefabEditorEntityOwnershipInterface = nullptr; + AzToolsFramework::Prefab::PrefabLoaderInterface* m_prefabLoaderInterface = nullptr; + AzToolsFramework::Prefab::PrefabIntegrationInterface* m_prefabIntegrationInterface = nullptr; }; class CAutoDocNotReady diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 9e0d2962a9..4721944b18 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -42,9 +42,9 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Field("EnableSceneInspector", &GeneralSettings::m_enableSceneInspector) ->Field("RestoreViewportCamera", &GeneralSettings::m_restoreViewportCamera); - serialize.Class() + serialize.Class() ->Version(1) - ->Field("SavePrefabsPreference", &PrefabSettings::m_savePrefabsPreference); + ->Field("SaveAllPrefabsPreference", &GlobalSaveSettings::m_saveAllPrefabsPreference); serialize.Class() ->Version(2) @@ -68,7 +68,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) serialize.Class() ->Version(1) ->Field("General Settings", &CEditorPreferencesPage_General::m_generalSettings) - ->Field("Prefab Settings", &CEditorPreferencesPage_General::m_prefabSettings) + ->Field("Global Save Settings", &CEditorPreferencesPage_General::m_globalSaveSettings) ->Field("Messaging", &CEditorPreferencesPage_General::m_messaging) ->Field("Undo", &CEditorPreferencesPage_General::m_undo) ->Field("Deep Selection", &CEditorPreferencesPage_General::m_deepSelection) @@ -97,13 +97,13 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_restoreViewportCamera, EditorPreferencesGeneralRestoreViewportCameraSettingName, "Keep the original editor viewport transform when exiting game mode.") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_enableSceneInspector, "Enable Scene Inspector (EXPERIMENTAL)", "Enable the option to inspect the internal data loaded from scene files like .fbx. This is an experimental feature. Restart the Scene Settings if the option is not visible under the Help menu."); - editContext->Class("Prefabs", "") + editContext->Class("Global Save Settings (File > Save & Ctrl+S)", "") ->DataElement( - AZ::Edit::UIHandlers::ComboBox, &PrefabSettings::m_savePrefabsPreference, "Save Prefabs Preference", - "When saving levels, this option controls whether and how prefabs should be saved along with the level.") - ->EnumAttribute(AzToolsFramework::Prefab::SavePrefabsPreference::Unspecified, "Unspecified") - ->EnumAttribute(AzToolsFramework::Prefab::SavePrefabsPreference::SaveAll, "Save All") - ->EnumAttribute(AzToolsFramework::Prefab::SavePrefabsPreference::SaveNone, "Save None"); + AZ::Edit::UIHandlers::ComboBox, &GlobalSaveSettings::m_saveAllPrefabsPreference, "Save Prefabs Preference", + "This option controls whether prefabs should be saved along with the level") + ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime, "Ask every time") + ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::SaveAll, "Save all") + ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::SaveNone, "Save none"); editContext->Class("Messaging", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Messaging::m_showDashboard, "Show Welcome to Open 3D Engine at startup", "Show Welcome to Open 3D Engine at startup") @@ -128,7 +128,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_generalSettings, "General Settings", "General Editor Preferences") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_prefabSettings, "Prefabs", "Prefab Settings") + ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_globalSaveSettings, "Global Save Settings", "Global Save Settings") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_messaging, "Messaging", "Messaging") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_undo, "Undo", "Undo Preferences") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_deepSelection, "Selection", "Selection") @@ -176,7 +176,7 @@ void CEditorPreferencesPage_General::OnApply() } //prefabs - gSettings.prefabSettings.savePrefabsPreference = m_prefabSettings.m_savePrefabsPreference; + gSettings.globalSaveSettings.saveAllPrefabsPreference = m_globalSaveSettings.m_saveAllPrefabsPreference; //undo gSettings.undoLevels = m_undo.m_undoLevels; @@ -208,7 +208,7 @@ void CEditorPreferencesPage_General::InitializeSettings() m_generalSettings.m_toolbarIconSize = static_cast(gSettings.gui.nToolbarIconSize); //prefabs - m_prefabSettings.m_savePrefabsPreference = gSettings.prefabSettings.savePrefabsPreference; + m_globalSaveSettings.m_saveAllPrefabsPreference = gSettings.globalSaveSettings.saveAllPrefabsPreference; //Messaging m_messaging.m_showDashboard = gSettings.bShowDashboardAtStartup; diff --git a/Code/Editor/EditorPreferencesPageGeneral.h b/Code/Editor/EditorPreferencesPageGeneral.h index b2d652ccba..e5888b2705 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.h +++ b/Code/Editor/EditorPreferencesPageGeneral.h @@ -58,10 +58,10 @@ private: bool m_enableSceneInspector; }; - struct PrefabSettings + struct GlobalSaveSettings { - AZ_TYPE_INFO(PrefabSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); - AzToolsFramework::Prefab::SavePrefabsPreference m_savePrefabsPreference; + AZ_TYPE_INFO(GlobalSaveSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); + AzToolsFramework::Prefab::SaveAllPrefabsPreference m_saveAllPrefabsPreference; }; struct Messaging @@ -96,7 +96,7 @@ private: }; GeneralSettings m_generalSettings; - PrefabSettings m_prefabSettings; + GlobalSaveSettings m_globalSaveSettings; Messaging m_messaging; Undo m_undo; DeepSelection m_deepSelection; diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index d20f132848..4af0989b13 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -255,7 +255,7 @@ SEditorSettings::SEditorSettings() g_TemporaryLevelName = nullptr; sliceSettings.dynamicByDefault = false; - prefabSettings.savePrefabsPreference = AzToolsFramework::Prefab::SavePrefabsPreference::Unspecified; + globalSaveSettings.saveAllPrefabsPreference = AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime; } void SEditorSettings::Connect() @@ -672,7 +672,7 @@ void SEditorSettings::Save() AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = AZ::Interface::Get(); - prefabLoaderInterface->SetSavePrefabsPreference(prefabSettings.savePrefabsPreference); + prefabLoaderInterface->SetSaveAllPrefabsPreference(globalSaveSettings.saveAllPrefabsPreference); SaveSettingsRegistryFile(); } @@ -682,7 +682,7 @@ void SEditorSettings::Load() { AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = AZ::Interface::Get(); - prefabSettings.savePrefabsPreference = prefabLoaderInterface->GetSavePrefabsPreference(); + globalSaveSettings.saveAllPrefabsPreference = prefabLoaderInterface->GetSaveAllPrefabsPreference(); // Load from Settings Registry AzFramework::ApplicationRequests::Bus::BroadcastResult( @@ -1082,11 +1082,6 @@ void SEditorSettings::ConvertPath(const AZStd::string_view sourcePath, AZStd::st AZStd::replace(category.begin(), category.end(), '|', '\\'); } -void SEditorSettings::SetSavePrefabsPreference(AzToolsFramework::Prefab::SavePrefabsPreference savePrefabsPreference) -{ - prefabSettings.savePrefabsPreference = savePrefabsPreference; -} - AzToolsFramework::EditorSettingsAPIRequests::SettingOutcome SEditorSettings::GetValue(const AZStd::string_view path) { if (path.find("|") == AZStd::string_view::npos) diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index dcc96dd2da..fca3480241 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -231,9 +231,9 @@ struct SSliceSettings bool dynamicByDefault; }; -struct SPrefabSettings +struct SGlobalSaveSettings { - AzToolsFramework::Prefab::SavePrefabsPreference savePrefabsPreference; + AzToolsFramework::Prefab::SaveAllPrefabsPreference saveAllPrefabsPreference; }; ////////////////////////////////////////////////////////////////////////// @@ -472,12 +472,10 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING SSliceSettings sliceSettings; - SPrefabSettings prefabSettings; + SGlobalSaveSettings globalSaveSettings; bool prefabSystem = true; ///< Toggle to enable/disable the Prefab system for level entities. - void SetSavePrefabsPreference(AzToolsFramework::Prefab::SavePrefabsPreference savePrefabsPreference); - private: void SaveValue(const char* sSection, const char* sKey, int value); void SaveValue(const char* sSection, const char* sKey, const QColor& value); diff --git a/Code/Editor/Style/Editor.qss b/Code/Editor/Style/Editor.qss index 2999eb388f..72ddeaee5a 100644 --- a/Code/Editor/Style/Editor.qss +++ b/Code/Editor/Style/Editor.qss @@ -245,29 +245,44 @@ QTableWidget#recentLevelTable::item { qproperty-iconSize: 16px 16px; } -#LevelSavedMessageFrame{ +QListWidget::item +{ + border : none; +} + +#SavePrefabDialog, #SaveAllFilesDialog +{ + min-width : 640px; +} + +#SaveDependentPrefabsCard +{ + margin: 0px 15px 10px 15px; +} + +#PrefabSavedMessageFrame{ border: 1px solid green; + margin: 10px 15px 10px 15px; border-radius: 2px; - margin: 5px 20px 5px 20px; padding: 5px 2px 5px 2px; } -#SaveAllPrefabsDialog #PrefabSaveQuestionFrame, #SaveDirtyLevelDialog #LevelEntitiesSaveQuestionFrame, #SaveAllPrefabsCheckbox +#SavePrefabDialog #PrefabSaveWarningFrame { border: 1px solid orange; + margin: 10px 15px 10px 15px; border-radius: 2px; - margin: 5px 20px 5px 20px; padding: 5px 2px 5px 2px; color : white; } -#SaveAllPrefabsDialog #FooterSeparatorLine, #SaveDirtyLevelDialog #FooterSeparatorLine +#SaveAllFilesDialog #FooterSeparatorLine, #SavePrefabDialog #FooterSeparatorLine { color: gray; } -#SaveAllPrefabsDialog #PrefabSavePreferenceHint, #SaveDirtyLevelDialog #PrefabSavePreferenceHint +#SaveAllFilesDialog #PrefabSavePreferenceHint, #SavePrefabDialog #PrefabSavePreferenceHint { font: italic; color: #999999; -} +} \ No newline at end of file diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index 1cd36e8055..68b9c1dabb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -43,6 +43,8 @@ namespace AzToolsFramework virtual Prefab::InstanceOptionalReference GetRootPrefabInstance() = 0; + virtual Prefab::TemplateId GetRootPrefabTemplateId() = 0; + //! Get all Assets generated by Prefab processing when entering Play-In Editor mode (Ctrl+G) //! /return The vector of Assets generated by Prefab processing virtual const AZStd::vector>& GetPlayInEditorAssetData() = 0; @@ -54,5 +56,6 @@ namespace AzToolsFramework virtual void StopPlayInEditor() = 0; virtual void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) = 0; + virtual bool IsRootTemplateDirty() = 0; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index 7df1e1b5c1..8994adc9af 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -359,6 +359,16 @@ namespace AzToolsFramework return AZStd::nullopt; } + Prefab::TemplateId PrefabEditorEntityOwnershipService::GetRootPrefabTemplateId() + { + AZ_Assert(m_rootInstance, "A valid root prefab instance couldn't be found in PrefabEditorEntityOwnershipService."); + if (m_rootInstance) + { + return m_rootInstance->GetTemplateId(); + } + return Prefab::InvalidTemplateId; + } + const AZStd::vector>& PrefabEditorEntityOwnershipService::GetPlayInEditorAssetData() { return m_playInEditorData.m_assets; @@ -607,6 +617,11 @@ namespace AzToolsFramework m_playInEditorData.m_isEnabled = false; } + bool PrefabEditorEntityOwnershipService::IsRootTemplateDirty() + { + return (m_prefabSystemComponent->IsTemplateDirty(m_rootInstance->GetTemplateId())); + } + ////////////////////////////////////////////////////////////////////////// // Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab // development to pinpoint and replace specific calls to Slice system diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h index bf1199d6dd..962b197b5d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h @@ -193,8 +193,10 @@ namespace AzToolsFramework AZ::IO::PathView filePath, Prefab::InstanceOptionalReference instanceToParentUnder) override; Prefab::InstanceOptionalReference GetRootPrefabInstance() override; + Prefab::TemplateId GetRootPrefabTemplateId() override; const AZStd::vector>& GetPlayInEditorAssetData() override; + bool IsRootTemplateDirty() override; ////////////////////////////////////////////////////////////////////////// void OnEntityRemoved(AZ::EntityId entityId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 2f0a0601b9..7b462e3a2f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -31,10 +31,10 @@ namespace AzToolsFramework { if (auto* serializeContext = azrtti_cast(context)) { - serializeContext->Enum() - ->Value("Unspecified", SavePrefabsPreference::Unspecified) - ->Value("SaveAll", SavePrefabsPreference::SaveAll) - ->Value("SaveNone", SavePrefabsPreference::SaveNone); + serializeContext->Enum() + ->Value("Ask every time", SaveAllPrefabsPreference::AskEveryTime) + ->Value("Save all", SaveAllPrefabsPreference::SaveAll) + ->Value("Save none", SaveAllPrefabsPreference::SaveNone); } } @@ -669,21 +669,21 @@ namespace AzToolsFramework return finalPath; } - SavePrefabsPreference PrefabLoader::GetSavePrefabsPreference() + SaveAllPrefabsPreference PrefabLoader::GetSaveAllPrefabsPreference() { - SavePrefabsPreference savePrefabsPreference = SavePrefabsPreference::Unspecified; + SaveAllPrefabsPreference saveAllPrefabsPreference = SaveAllPrefabsPreference::AskEveryTime; if (auto* registry = AZ::SettingsRegistry::Get()) { - registry->GetObject(savePrefabsPreference, s_savePrefabsKey); + registry->GetObject(saveAllPrefabsPreference, s_savePrefabsKey); } - return savePrefabsPreference; + return saveAllPrefabsPreference; } - void PrefabLoader::SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) + void PrefabLoader::SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) { if (auto* registry = AZ::SettingsRegistry::Get()) { - registry->SetObject(s_savePrefabsKey, savePrefabsPreference); + registry->SetObject(s_savePrefabsKey, saveAllPrefabsPreference); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h index e97eb694c2..5940d887da 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h @@ -110,8 +110,8 @@ namespace AzToolsFramework //! Returns if the path is a valid path for a prefab static bool IsValidPrefabPath(AZ::IO::PathView path); - SavePrefabsPreference GetSavePrefabsPreference() override; - void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) override; + SaveAllPrefabsPreference GetSaveAllPrefabsPreference() override; + void SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) override; private: /** diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h index 57ef6d6a3a..b34f868304 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h @@ -17,9 +17,9 @@ namespace AzToolsFramework { namespace Prefab { - enum class SavePrefabsPreference + enum class SaveAllPrefabsPreference { - Unspecified, + AskEveryTime, SaveAll, SaveNone }; @@ -91,8 +91,8 @@ namespace AzToolsFramework //! The path will always use the '/' separator. virtual AZ::IO::Path GenerateRelativePath(AZ::IO::PathView path) = 0; - virtual SavePrefabsPreference GetSavePrefabsPreference() = 0; - virtual void SetSavePrefabsPreference(SavePrefabsPreference savePrefabsPreference) = 0; + virtual SaveAllPrefabsPreference GetSaveAllPrefabsPreference() = 0; + virtual void SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) = 0; protected: @@ -105,6 +105,6 @@ namespace AzToolsFramework namespace AZ { - AZ_TYPE_INFO_SPECIALIZE(AzToolsFramework::Prefab::SavePrefabsPreference, "{7E61EA82-4DE4-4A3F-945F-C8FEDC1114B5}"); + AZ_TYPE_INFO_SPECIALIZE(AzToolsFramework::Prefab::SaveAllPrefabsPreference, "{7E61EA82-4DE4-4A3F-945F-C8FEDC1114B5}"); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 928158dae0..e465e111aa 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -754,25 +754,61 @@ namespace AzToolsFramework } } - bool PrefabSystemComponent::AreDirtyTemplatesPresent() + bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId templateId) { - for (const auto& [id, templateObject] : m_templateIdMap) + auto parentTemplate = FindTemplate(templateId); + if (IsTemplateDirty(templateId)) { - if (IsTemplateDirty(id)) + return true; + } + + auto linkIds = parentTemplate->get().GetLinks(); + + for (auto linkId : linkIds) + { + auto linkIterator = m_linkIdMap.find(linkId); + if (linkIterator != m_linkIdMap.end()) { - return true; + return AreDirtyTemplatesPresent(linkIterator->second.GetSourceTemplateId()); } } return false; } - void PrefabSystemComponent::SaveAllDirtyTemplates() + void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId templateId) { - for (auto& [id, templateObject] : m_templateIdMap) + auto parentTemplate = FindTemplate(templateId); + if (IsTemplateDirty(templateId)) { - if (IsTemplateDirty(id)) + m_prefabLoader.SaveTemplate(templateId); + } + auto linkIds = parentTemplate->get().GetLinks(); + + for (auto linkId : linkIds) + { + auto linkIterator = m_linkIdMap.find(linkId); + if (linkIterator != m_linkIdMap.end()) { - m_prefabLoader.SaveTemplate(id); + SaveAllDirtyTemplates(linkIterator->second.GetSourceTemplateId()); + } + } + } + + void PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) + { + auto parentTemplate = FindTemplate(parentTemplateId); + if (IsTemplateDirty(parentTemplateId)) + { + dirtyTemplatePaths.emplace(parentTemplate->get().GetFilePath()); + } + auto linkIds = parentTemplate->get().GetLinks(); + + for (auto linkId : linkIds) + { + auto linkIterator = m_linkIdMap.find(linkId); + if (linkIterator != m_linkIdMap.end()) + { + GetDirtyTemplatePaths(linkIterator->second.GetSourceTemplateId(), dirtyTemplatePaths); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index cb95f9b367..153a0e2b47 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -183,9 +183,11 @@ namespace AzToolsFramework */ void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override; - bool AreDirtyTemplatesPresent() override; + bool AreDirtyTemplatesPresent(TemplateId templateId) override; - void SaveAllDirtyTemplates() override; + void SaveAllDirtyTemplates(TemplateId templateId) override; + + void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) override; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index 252c8bdb6a..a5abf138f7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -9,11 +9,12 @@ #pragma once #include +#include +#include #include #include #include #include -#include namespace AzToolsFramework { @@ -49,8 +50,9 @@ namespace AzToolsFramework virtual bool IsTemplateDirty(const TemplateId& templateId) = 0; virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; - virtual bool AreDirtyTemplatesPresent() = 0; - virtual void SaveAllDirtyTemplates() = 0; + virtual bool AreDirtyTemplatesPresent(TemplateId templateId) = 0; + virtual void SaveAllDirtyTemplates(TemplateId templateId) = 0; + virtual void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h index 0befe55822..afd764232d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h @@ -11,6 +11,7 @@ #include #include #include +#include namespace AzToolsFramework { @@ -28,6 +29,9 @@ namespace AzToolsFramework * @return The id of the newly created entity. */ virtual AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) = 0; + + virtual int ExecuteClosePrefabDialog(TemplateId templateId) = 0; + virtual void ExecuteSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference = false) = 0; }; } // namespace Prefab diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index c17b96411e..825dea6072 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include @@ -27,12 +28,28 @@ #include #include +#include +#include +#include +#include + + #include +#include +#include +#include #include #include +#include +#include +#include #include #include #include +#include +#include +#include + namespace AzToolsFramework { @@ -43,6 +60,7 @@ namespace AzToolsFramework PrefabPublicInterface* PrefabIntegrationManager::s_prefabPublicInterface = nullptr; PrefabEditInterface* PrefabIntegrationManager::s_prefabEditInterface = nullptr; PrefabLoaderInterface* PrefabIntegrationManager::s_prefabLoaderInterface = nullptr; + PrefabSystemComponentInterface* PrefabIntegrationManager::s_prefabSystemComponentInterface = nullptr; const AZStd::string PrefabIntegrationManager::s_prefabFileExtension = ".prefab"; @@ -88,6 +106,13 @@ namespace AzToolsFramework return; } + s_prefabSystemComponentInterface = AZ::Interface::Get(); + if (s_prefabSystemComponentInterface == nullptr) + { + AZ_Assert(false, "Prefab - could not get PrefabSystemComponentInterface on PrefabIntegrationManager construction."); + return; + } + EditorContextMenuBus::Handler::BusConnect(); PrefabInstanceContainerNotificationBus::Handler::BusConnect(); AZ::Interface::Register(this); @@ -1050,5 +1075,232 @@ namespace AzToolsFramework return AZ::EntityId(); } } + + int PrefabIntegrationManager::ExecuteClosePrefabDialog(TemplateId templateId) + { + auto prefabSaveSelectionDialog = ConstructClosePrefabDialog(templateId); + + int prefabSaveSelection = prefabSaveSelectionDialog->exec(); + + if (prefabSaveSelection == QDialog::Accepted) + { + SavePrefabsInDialog(prefabSaveSelectionDialog.get()); + } + return prefabSaveSelection; + } + + void PrefabIntegrationManager::ExecuteSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) + { + using namespace AzToolsFramework::Prefab; + + auto prefabTemplate = s_prefabSystemComponentInterface->FindTemplate(templateId); + AZ::IO::Path prefabTemplatePath = prefabTemplate->get().GetFilePath(); + + if (s_prefabSystemComponentInterface->IsTemplateDirty(templateId)) + { + if (s_prefabLoaderInterface->SaveTemplate(templateId) == false) + { + AZ_Error("Prefabs", false, "Template '%s' could not be saved successfully.", prefabTemplatePath.c_str()); + return; + } + } + + if (useSaveAllPrefabsPreference) + { + SaveAllPrefabsPreference saveAllPrefabsPreference = s_prefabLoaderInterface->GetSaveAllPrefabsPreference(); + + if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveAll) + { + s_prefabSystemComponentInterface->SaveAllDirtyTemplates(templateId); + return; + } + else if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveNone) + { + return; + } + } + + AZStd::unique_ptr savePrefabsDialog = ConstructSavePrefabsDialog(templateId, useSaveAllPrefabsPreference); + if (savePrefabsDialog) + { + int prefabSaveSelection = savePrefabsDialog->exec(); + + if (prefabSaveSelection == QDialog::Accepted) + { + SavePrefabsInDialog(savePrefabsDialog.get()); + } + } + } + + void PrefabIntegrationManager::SavePrefabsInDialog(QDialog* unsavedPrefabsDialog) + { + QList unsavedPrefabFileLabels = unsavedPrefabsDialog->findChildren("UnsavedPrefabFileName"); + if (unsavedPrefabFileLabels.size() > 0) + { + for (const QLabel* unsavedPrefabFileLabel : unsavedPrefabFileLabels) + { + AZStd::string unsavedPrefabFileName = unsavedPrefabFileLabel->property("FilePath").toString().toUtf8().data(); + AzToolsFramework::Prefab::TemplateId unsavedPrefabTemplateId = + s_prefabSystemComponentInterface->GetTemplateIdFromFilePath(unsavedPrefabFileName.data()); + bool isTemplateSavedSuccessfully = s_prefabLoaderInterface->SaveTemplate(unsavedPrefabTemplateId); + AZ_Assert(isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str()); + } + } + } + + AZStd::unique_ptr PrefabIntegrationManager::ConstructSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) + { + AZStd::unique_ptr saveModifiedMessageBox = AZStd::make_unique(AzToolsFramework::GetActiveWindow()); + + saveModifiedMessageBox->setWindowTitle("Unsaved files detected"); + + // Main Content section begins. + saveModifiedMessageBox->setObjectName("SaveAllFilesDialog"); + QBoxLayout* contentLayout = new QVBoxLayout(saveModifiedMessageBox.get()); + + QFrame* prefabSavedMessageFrame = new QFrame(saveModifiedMessageBox.get()); + QHBoxLayout* prefabSavedMessageLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + prefabSavedMessageFrame->setObjectName("PrefabSavedMessageFrame"); + prefabSavedMessageFrame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + + // Add a checkMark icon next to the level entities saved message. + QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); + QLabel* prefabSavedSuccessfullyIconContainer = new QLabel(); + prefabSavedSuccessfullyIconContainer->setPixmap(checkMarkIcon); + prefabSavedSuccessfullyIconContainer->setFixedWidth(checkMarkIcon.width()); + + // Add a message that level entities are saved successfully. + + auto prefabTemplate = s_prefabSystemComponentInterface->FindTemplate(templateId); + AZ::IO::Path prefabTemplatePath = prefabTemplate->get().GetFilePath(); + QLabel* prefabSavedSuccessfullyLabel = new QLabel( + QString("Prefab %1 has been saved. Do you want to save the below dependent prefabs too?").arg(prefabTemplatePath.c_str())); + prefabSavedSuccessfullyLabel->setObjectName("PrefabSavedSuccessfullyLabel"); + prefabSavedMessageLayout->addWidget(prefabSavedSuccessfullyIconContainer); + prefabSavedMessageLayout->addWidget(prefabSavedSuccessfullyLabel); + prefabSavedMessageFrame->setLayout(prefabSavedMessageLayout); + contentLayout->addWidget(prefabSavedMessageFrame); + + AzQtComponents::Card* unsavedPrefabsContainer = ConstructUnsavedPrefabsCard(templateId); + contentLayout->addWidget(unsavedPrefabsContainer); + + contentLayout->addStretch(); + + // Footer section begins. + QHBoxLayout* footerLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + + if (useSaveAllPrefabsPreference) + { + QFrame* footerSeparatorLine = new QFrame(); + footerSeparatorLine->setObjectName("FooterSeparatorLine"); + footerSeparatorLine->setFrameShape(QFrame::HLine); + contentLayout->addWidget(footerSeparatorLine); + + QLabel* prefabSavePreferenceHint = + new QLabel("You can prevent this window from showing in the future by updating your global save preferences."); + prefabSavePreferenceHint->setToolTip( + "Go to 'Edit > Editor Settings > Global Preferences... > Global save preferences' to update your preference"); + prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); + footerLayout->addWidget(prefabSavePreferenceHint); + } + + QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); + footerLayout->addWidget(prefabSaveConfirmationButtons); + contentLayout->addLayout(footerLayout); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, saveModifiedMessageBox.get(), &QDialog::accept); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, saveModifiedMessageBox.get(), &QDialog::reject); + AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox->parentWidget(), QStringLiteral("style:Editor.qss")); + + return AZStd::move(saveModifiedMessageBox); + } + + AZStd::shared_ptr PrefabIntegrationManager::ConstructClosePrefabDialog(TemplateId templateId) + { + AZStd::shared_ptr saveModifiedMessageBox = AZStd::make_shared(AzToolsFramework::GetActiveWindow()); + saveModifiedMessageBox->setWindowTitle("Unsaved files detected"); + AZStd::weak_ptr saveModifiedMessageBoxWeakPtr(saveModifiedMessageBox); + saveModifiedMessageBox->setObjectName("SavePrefabDialog"); + + // Main Content section begins. + QVBoxLayout* contentLayout = new QVBoxLayout(saveModifiedMessageBox.get()); + QFrame* prefabSaveWarningFrame = new QFrame(saveModifiedMessageBox.get()); + QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + prefabSaveWarningFrame->setObjectName("PrefabSaveWarningFrame"); + + // Add a warning icon next to save prefab warning. + prefabSaveWarningFrame->setLayout(levelEntitiesSaveQuestionLayout); + QPixmap warningIcon(QString(":/Notifications/warning.svg")); + QLabel* warningIconContainer = new QLabel(); + warningIconContainer->setPixmap(warningIcon); + warningIconContainer->setFixedWidth(warningIcon.width()); + levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); + + // Ask user if they want to save entities in level. + QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save the below unsaved prefabs?", saveModifiedMessageBox.get()); + levelEntitiesSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); + contentLayout->addWidget(prefabSaveWarningFrame); + + AZStd::set dirtyTemplatePaths; + s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + auto templateToSave = s_prefabSystemComponentInterface->FindTemplate(templateId); + AZ::IO::Path templateToSaveFilePath = templateToSave->get().GetFilePath(); + AzQtComponents::Card* unsavedPrefabsCard = ConstructUnsavedPrefabsCard(templateId); + contentLayout->addWidget(unsavedPrefabsCard); + + contentLayout->addStretch(); + + QHBoxLayout* footerLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + + QDialogButtonBox* prefabSaveConfirmationButtons = + new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Discard | QDialogButtonBox::Cancel); + footerLayout->addWidget(prefabSaveConfirmationButtons); + contentLayout->addLayout(footerLayout); + QObject::connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, saveModifiedMessageBox.get(), &QDialog::accept); + QObject::connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, saveModifiedMessageBox.get(), &QDialog::reject); + QObject::connect( + prefabSaveConfirmationButtons, &QDialogButtonBox::clicked, saveModifiedMessageBox.get(), + [saveModifiedMessageBoxWeakPtr, prefabSaveConfirmationButtons](QAbstractButton* button) + { + int prefabSaveSelection = prefabSaveConfirmationButtons->buttonRole(button); + saveModifiedMessageBoxWeakPtr.lock()->done(prefabSaveSelection); + }); + AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.get(), QStringLiteral("style:Editor.qss")); + return saveModifiedMessageBox; + } + + AzQtComponents::Card* PrefabIntegrationManager::ConstructUnsavedPrefabsCard(TemplateId templateId) + { + FlowLayout* unsavedPrefabsLayout = new FlowLayout; + + AZStd::set dirtyTemplatePaths; + s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + + for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) + { + QLabel* prefabNameLabel = new QLabel(QString("%1").arg(dirtyTemplatePath.Filename().Native().data())); + prefabNameLabel->setObjectName("UnsavedPrefabFileName"); + prefabNameLabel->setWordWrap(true); + prefabNameLabel->setToolTip(dirtyTemplatePath.Native().data()); + prefabNameLabel->setProperty("FilePath", dirtyTemplatePath.Native().data()); + unsavedPrefabsLayout->addWidget(prefabNameLabel); + } + + AzQtComponents::Card* unsavedPrefabsContainer = new AzQtComponents::Card; + unsavedPrefabsContainer->setObjectName("SaveDependentPrefabsCard"); + unsavedPrefabsContainer->setTitle("Unsaved Prefabs"); + unsavedPrefabsContainer->header()->setHasContextMenu(false); + unsavedPrefabsContainer->header()->setIcon(QIcon(QStringLiteral(":/Entity/prefab_edit.svg"))); + + QFrame* unsavedPrefabsFrame = new QFrame(unsavedPrefabsContainer); + unsavedPrefabsFrame->setLayout(unsavedPrefabsLayout); + QScrollArea* unsavedPrefabsScrollArea = new QScrollArea(); + unsavedPrefabsScrollArea->setWidget(unsavedPrefabsFrame); + //unsavedPrefabsScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + unsavedPrefabsScrollArea->setWidgetResizable(true); + unsavedPrefabsScrollArea->setObjectName("SavePrefabsCardContent"); + unsavedPrefabsContainer->setContentWidget(unsavedPrefabsScrollArea); + + return AZStd::move(unsavedPrefabsContainer); + } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h index b40f0169c9..8a210c2de0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h @@ -15,12 +15,15 @@ #include #include #include +#include #include #include #include #include #include +#include + namespace AzToolsFramework { namespace Prefab @@ -49,6 +52,7 @@ namespace AzToolsFramework , public AssetBrowser::AssetBrowserSourceDropBus::Handler , public PrefabInstanceContainerNotificationBus::Handler , public PrefabIntegrationInterface + , public QObject { public: AZ_CLASS_ALLOCATOR(PrefabIntegrationManager, AZ::SystemAllocator, 0); @@ -72,6 +76,8 @@ namespace AzToolsFramework // PrefabIntegrationInterface... AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) override; + int ExecuteClosePrefabDialog(TemplateId templateId) override; + void ExecuteSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) override; private: // Manages the Edit Mode UI for prefabs @@ -124,12 +130,19 @@ namespace AzToolsFramework static AZ::u32 GetSliceFlags(const AZ::Edit::ElementData* editData, const AZ::Edit::ClassData* classData); + AZStd::shared_ptr ConstructClosePrefabDialog(TemplateId templateId); + AzQtComponents::Card* ConstructUnsavedPrefabsCard(TemplateId templateId); + AZStd::unique_ptr ConstructSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference); + void SavePrefabsInDialog(QDialog* unsavedPrefabsDialog); + + static const AZStd::string s_prefabFileExtension; static EditorEntityUiInterface* s_editorEntityUiInterface; static PrefabPublicInterface* s_prefabPublicInterface; static PrefabEditInterface* s_prefabEditInterface; static PrefabLoaderInterface* s_prefabLoaderInterface; + static PrefabSystemComponentInterface* s_prefabSystemComponentInterface; }; } } From 9de22d5e54de62082c88e9fd9f34cf5b3460d6cc Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 16:39:04 -0700 Subject: [PATCH 100/355] Fix dependency errors after conversion to JSON Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Builder/ScriptCanvasBuilderWorker.cpp | 99 ++++++++++--------- .../Assets/ScriptCanvasAssetHandler.cpp | 10 +- .../Libraries/Core/ReceiveScriptEvent.cpp | 2 +- 3 files changed, 57 insertions(+), 54 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index 7dddf93818..beeb376380 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -6,7 +6,6 @@ * */ - #include #include #include @@ -16,20 +15,19 @@ #include #include #include - -#include +#include #include +#include #include #include #include #include +#include #include #include #include #include -#include - namespace ScriptCanvasBuilder { void Worker::Activate(const AssetHandlers& handlers) @@ -82,55 +80,18 @@ namespace ScriptCanvasBuilder m_processEditorAssetDependencies.clear(); - AZStd::unordered_multimap jobDependenciesByKey; - - auto assetFilter = [this, &jobDependenciesByKey](const AZ::Data::AssetFilterInfo& filterInfo) - { - // force load these before processing - if (filterInfo.m_assetType == azrtti_typeid() - || filterInfo.m_assetType == azrtti_typeid()) - { - this->m_processEditorAssetDependencies.push_back(filterInfo); - } - - // these trigger re-processing - if (filterInfo.m_assetType == azrtti_typeid()) - { - AZ_Error("ScriptCanvas", false, "ScriptAsset Reference in a graph detected"); - } - - if (filterInfo.m_assetType == azrtti_typeid()) - { - AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = filterInfo.m_assetId.m_guid; - jobDependenciesByKey.insert({ ScriptEvents::k_builderJobKey, dependency }); - } - - if (filterInfo.m_assetType == azrtti_typeid()) - { - AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = filterInfo.m_assetId.m_guid; - jobDependenciesByKey.insert({ s_scriptCanvasProcessJobKey, dependency }); - } - - // Asset filter always returns false to prevent parsing dependencies, but makes note of the script canvas dependencies - return false; - }; - AZ::Data::Asset asset; asset.Create(AZ::Data::AssetId(AZ::Uuid::CreateRandom())); - if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, assetFilter) != AZ::Data::AssetHandler::LoadResult::LoadComplete) + if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, {}) != AZ::Data::AssetHandler::LoadResult::LoadComplete) { AZ_Warning(s_scriptCanvasBuilder, false, "CreateJobs for \"%s\" failed because the asset data could not be loaded from the file", fullPath.data()); return; } - // Flush asset database events to ensure no asset references are held by closures queued on Ebuses. - AZ::Data::AssetManager::Instance().DispatchEvents(); - auto* scriptCanvasEntity = asset.Get()->GetScriptCanvasEntity(); auto* sourceGraph = AZ::EntityUtils::FindFirstDerivedComponent(scriptCanvasEntity); AZ_Assert(sourceGraph, "Graph component is missing from entity."); + AZ_Assert(sourceGraph->GetGraphData(), "GraphData is missing from entity"); struct EntityIdComparer { @@ -152,7 +113,50 @@ namespace ScriptCanvasBuilder } } - m_processEditorAssetDependencies.clear(); + AZ::SerializeContext* serializeContext{}; + AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + AZ_Assert(serializeContext, "SerializeContext is required to enumerate dependent assets in the ScriptCanvas file"); + + AZStd::unordered_multimap jobDependenciesByKey; + auto assetFilter = [this, &jobDependenciesByKey] + ( void* instancePointer + , const AZ::SerializeContext::ClassData* classData + , [[maybe_unused]] const AZ::SerializeContext::ClassElement* classElement) + { + auto azTypeId = classData->m_azRtti->GetTypeId(); + + if (azTypeId == azrtti_typeid>()) + { + const auto* subgraphAsset = reinterpret_cast*>(instancePointer); + AssetBuilderSDK::SourceFileDependency dependency; + dependency.m_sourceFileDependencyUUID = subgraphAsset->GetId().m_guid; + jobDependenciesByKey.insert({s_scriptCanvasProcessJobKey, dependency}); + this->m_processEditorAssetDependencies.push_back({subgraphAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad}); + } + else if (azTypeId == azrtti_typeid>()) + { + const auto* eventAsset = reinterpret_cast*>(instancePointer); + AssetBuilderSDK::SourceFileDependency dependency; + dependency.m_sourceFileDependencyUUID = eventAsset->GetId().m_guid; + jobDependenciesByKey.insert({ScriptEvents::k_builderJobKey, dependency}); + this->m_processEditorAssetDependencies.push_back({ eventAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad}); + } + + // always continue, make note of the script canvas dependencies + return true; + }; + + AZ_Verify(serializeContext->EnumerateInstanceConst + ( sourceGraph->GetGraphData() + , azrtti_typeid() + , assetFilter + , {} + , AZ::SerializeContext::ENUM_ACCESS_FOR_READ + , nullptr + , nullptr), "Failed to gather dependencies from graph data"); + + // Flush asset database events to ensure no asset references are held by closures queued on Ebuses. + AZ::Data::AssetManager::Instance().DispatchEvents(); for (const AssetBuilderSDK::PlatformInfo& info : request.m_enabledPlatforms) { @@ -272,9 +276,6 @@ namespace ScriptCanvasBuilder assetDataStream->Open(AZStd::move(fileBuffer)); } - AZ::SerializeContext* context{}; - AZ::ComponentApplicationBus::BroadcastResult(context, &AZ::ComponentApplicationBus::Events::GetSerializeContext); - AZ::Data::Asset asset; asset.Create(request.m_sourceFileUUID); if (m_editorAssetHandler->LoadAssetDataFromStream(asset, assetDataStream, nullptr) != AZ::Data::AssetHandler::LoadResult::LoadComplete) @@ -375,6 +376,8 @@ namespace ScriptCanvasBuilder AZ_Error(s_scriptCanvasBuilder, false, translationOutcome.GetError().c_str()); } } + + m_processEditorAssetDependencies.clear(); } AZ_TracePrintf(s_scriptCanvasBuilder, "Finish Processing Job"); diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp index 6f86b93dda..848db44236 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp @@ -124,10 +124,10 @@ namespace ScriptCanvasEditor settings.m_metadata.Create(); // attempt JSON deserialization... if (JSRU::LoadObjectFromStreamByType - ( &scriptCanvasDataTarget - , azrtti_typeid() - , byteStreamSource - , &settings).IsSuccess()) + ( &scriptCanvasDataTarget + , azrtti_typeid() + , byteStreamSource + , &settings).IsSuccess()) { if (auto graphData = scriptCanvasAssetTarget->GetScriptCanvasGraph() ? scriptCanvasAssetTarget->GetScriptCanvasGraph()->GetGraphData() @@ -156,7 +156,7 @@ namespace ScriptCanvasEditor byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); // tolerate unknown classes in the editor. Let the asset processor warn about bad nodes... if (AZ::Utils::LoadObjectFromStreamInPlace - (byteStreamSource + ( byteStreamSource , scriptCanvasDataTarget , m_serializeContext , AZ::ObjectStream::FilterDescriptor(assetLoadFilterCB, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES))) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp index b874077834..734c2a1242 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp @@ -353,7 +353,7 @@ namespace ScriptCanvas AZStd::optional ReceiveScriptEvent::GetEventIndex(AZStd::string eventName) const { - return m_handler->GetFunctionIndex(eventName.c_str());; + return m_handler ? AZStd::optional(m_handler->GetFunctionIndex(eventName.c_str())) : AZStd::nullopt; } AZStd::vector ReceiveScriptEvent::GetEventSlotIds() const From a353005296186929efc39d1b9f1789ea069f5176 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 16:43:07 -0700 Subject: [PATCH 101/355] only track dependent assets with valid ids, as sanity check Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Builder/ScriptCanvasBuilderWorker.cpp | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index beeb376380..775b280602 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -128,18 +128,26 @@ namespace ScriptCanvasBuilder if (azTypeId == azrtti_typeid>()) { const auto* subgraphAsset = reinterpret_cast*>(instancePointer); - AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = subgraphAsset->GetId().m_guid; - jobDependenciesByKey.insert({s_scriptCanvasProcessJobKey, dependency}); - this->m_processEditorAssetDependencies.push_back({subgraphAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad}); + if (subgraphAsset->GetId().IsValid()) + { + AssetBuilderSDK::SourceFileDependency dependency; + dependency.m_sourceFileDependencyUUID = subgraphAsset->GetId().m_guid; + jobDependenciesByKey.insert({ s_scriptCanvasProcessJobKey, dependency }); + this->m_processEditorAssetDependencies.push_back + ( { subgraphAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad }); + } } else if (azTypeId == azrtti_typeid>()) { const auto* eventAsset = reinterpret_cast*>(instancePointer); - AssetBuilderSDK::SourceFileDependency dependency; - dependency.m_sourceFileDependencyUUID = eventAsset->GetId().m_guid; - jobDependenciesByKey.insert({ScriptEvents::k_builderJobKey, dependency}); - this->m_processEditorAssetDependencies.push_back({ eventAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad}); + if (eventAsset->GetId().IsValid()) + { + AssetBuilderSDK::SourceFileDependency dependency; + dependency.m_sourceFileDependencyUUID = eventAsset->GetId().m_guid; + jobDependenciesByKey.insert({ ScriptEvents::k_builderJobKey, dependency }); + this->m_processEditorAssetDependencies.push_back + ( { eventAsset->GetId(), azTypeId, AZ::Data::AssetLoadBehavior::PreLoad }); + } } // always continue, make note of the script canvas dependencies From 6cc627a643154a9f53e1572ca3610dfaa3a5bfb3 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 16:44:13 -0700 Subject: [PATCH 102/355] remove reference to old test Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp index c2fa59b037..00705bfbaa 100644 --- a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp +++ b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_RuntimeInterpreted.cpp @@ -367,11 +367,6 @@ TEST_F(ScriptCanvasTestFixture, InterpretedMultipleOutDataFlowParseError) ExpectParseError("LY_SC_UnitTest_MultipleOutDataFlowParseError"); } -TEST_F(ScriptCanvasTestFixture, InterpretedSimultaneousDataInputError) -{ - ExpectParseError("LY_SC_UnitTest_SimultaneousDataInputError"); -} - TEST_F(ScriptCanvasTestFixture, InterpretedAnyAsTailNoOp) { RunUnitTestGraph("LY_SC_UnitTest_AnyAsTailNoOp"); From 7e75559200ed3d9c9fd8783d34a76a346dbde87a Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Thu, 2 Sep 2021 17:26:32 -0700 Subject: [PATCH 103/355] Removed unused Qt classes and do some more code clean up Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 15 +-------------- Code/Editor/CryEditDoc.cpp | 9 --------- Code/Editor/EditorPreferencesPageGeneral.cpp | 2 +- Code/Editor/Style/Editor.qss | 5 ----- .../Entity/PrefabEditorEntityOwnershipInterface.h | 1 - .../Entity/PrefabEditorEntityOwnershipService.cpp | 5 ----- .../Entity/PrefabEditorEntityOwnershipService.h | 1 - .../AzToolsFramework/Prefab/PrefabLoader.cpp | 6 +++--- .../UI/Prefab/PrefabIntegrationInterface.h | 2 +- .../UI/Prefab/PrefabIntegrationManager.cpp | 12 ++++++------ .../UI/Prefab/PrefabIntegrationManager.h | 4 ++-- 11 files changed, 14 insertions(+), 48 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index ecbdde7f13..4725101599 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -33,9 +33,7 @@ AZ_POP_DISABLE_WARNING #include #include #include -#include #include -#include // Aws Native SDK #include @@ -71,12 +69,10 @@ AZ_POP_DISABLE_WARNING #include #include #include -#include #include // AzQtComponents #include -#include #include #include #include @@ -742,12 +738,10 @@ void CCryEditApp::OnFileSave() } else { - //auto prefabSystemComponentInterface = AZ::Interface::Get(); auto prefabEditorEntityOwnershipService = AZ::Interface::Get(); AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipService->GetRootPrefabTemplateId(); auto prefabIntegrationInterface = AZ::Interface::Get(); - prefabIntegrationInterface->ExecuteSavePrefabsDialog(rootPrefabTemplateId, true); - // prefabSystemComponentInterface->AreDirtyTemplatesPresent(rootPrefabTemplateId) + prefabIntegrationInterface->ExecuteSavePrefabDialog(rootPrefabTemplateId, true); } } @@ -3204,13 +3198,6 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: - if (!GetIEditor()->GetDocument()->DoFileSave()) - { - // if the file save operation failed, assume that the user was informed of why - // already and treat it as a cancel - wasCreateLevelOperationCancelled = true; - return false; - } bIsDocModified = false; break; case QDialogButtonBox::RejectRole: diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 3fb39d4268..2985f9fec2 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -13,16 +13,7 @@ // Qt #include -#include #include -#include -#include -#include -#include -#include -#include -#include -#include // AzCore #include diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 4721944b18..2cba7e7801 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -97,7 +97,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_restoreViewportCamera, EditorPreferencesGeneralRestoreViewportCameraSettingName, "Keep the original editor viewport transform when exiting game mode.") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_enableSceneInspector, "Enable Scene Inspector (EXPERIMENTAL)", "Enable the option to inspect the internal data loaded from scene files like .fbx. This is an experimental feature. Restart the Scene Settings if the option is not visible under the Help menu."); - editContext->Class("Global Save Settings (File > Save & Ctrl+S)", "") + editContext->Class("Global Save Settings (File>Save & Ctrl+S)", "") ->DataElement( AZ::Edit::UIHandlers::ComboBox, &GlobalSaveSettings::m_saveAllPrefabsPreference, "Save Prefabs Preference", "This option controls whether prefabs should be saved along with the level") diff --git a/Code/Editor/Style/Editor.qss b/Code/Editor/Style/Editor.qss index 72ddeaee5a..3bf92b4495 100644 --- a/Code/Editor/Style/Editor.qss +++ b/Code/Editor/Style/Editor.qss @@ -245,11 +245,6 @@ QTableWidget#recentLevelTable::item { qproperty-iconSize: 16px 16px; } -QListWidget::item -{ - border : none; -} - #SavePrefabDialog, #SaveAllFilesDialog { min-width : 640px; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h index 68b9c1dabb..feb2fc12bf 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipInterface.h @@ -56,6 +56,5 @@ namespace AzToolsFramework virtual void StopPlayInEditor() = 0; virtual void CreateNewLevelPrefab(AZStd::string_view filename, const AZStd::string& templateFilename) = 0; - virtual bool IsRootTemplateDirty() = 0; }; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index 8994adc9af..c9365683b5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -617,11 +617,6 @@ namespace AzToolsFramework m_playInEditorData.m_isEnabled = false; } - bool PrefabEditorEntityOwnershipService::IsRootTemplateDirty() - { - return (m_prefabSystemComponent->IsTemplateDirty(m_rootInstance->GetTemplateId())); - } - ////////////////////////////////////////////////////////////////////////// // Slice Buses implementation with Assert(false), this will exist only during Slice->Prefab // development to pinpoint and replace specific calls to Slice system diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h index 962b197b5d..a98fce8059 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.h @@ -196,7 +196,6 @@ namespace AzToolsFramework Prefab::TemplateId GetRootPrefabTemplateId() override; const AZStd::vector>& GetPlayInEditorAssetData() override; - bool IsRootTemplateDirty() override; ////////////////////////////////////////////////////////////////////////// void OnEntityRemoved(AZ::EntityId entityId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 7b462e3a2f..8be3b402fa 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -25,7 +25,7 @@ namespace AzToolsFramework { namespace Prefab { - static constexpr const char s_savePrefabsKey[] = "/O3DE/Preferences/SavePrefabs"; + static constexpr const char s_saveAllPrefabsKey[] = "/O3DE/Preferences/SaveAllPrefabs"; void PrefabLoader::Reflect(AZ::ReflectContext* context) { @@ -674,7 +674,7 @@ namespace AzToolsFramework SaveAllPrefabsPreference saveAllPrefabsPreference = SaveAllPrefabsPreference::AskEveryTime; if (auto* registry = AZ::SettingsRegistry::Get()) { - registry->GetObject(saveAllPrefabsPreference, s_savePrefabsKey); + registry->GetObject(saveAllPrefabsPreference, s_saveAllPrefabsKey); } return saveAllPrefabsPreference; } @@ -683,7 +683,7 @@ namespace AzToolsFramework { if (auto* registry = AZ::SettingsRegistry::Get()) { - registry->SetObject(s_savePrefabsKey, saveAllPrefabsPreference); + registry->SetObject(s_saveAllPrefabsKey, saveAllPrefabsPreference); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h index afd764232d..f5f393f3b8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h @@ -31,7 +31,7 @@ namespace AzToolsFramework virtual AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) = 0; virtual int ExecuteClosePrefabDialog(TemplateId templateId) = 0; - virtual void ExecuteSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference = false) = 0; + virtual void ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference = false) = 0; }; } // namespace Prefab diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 825dea6072..42d8ec80bf 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1089,7 +1089,7 @@ namespace AzToolsFramework return prefabSaveSelection; } - void PrefabIntegrationManager::ExecuteSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) + void PrefabIntegrationManager::ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) { using namespace AzToolsFramework::Prefab; @@ -1120,14 +1120,14 @@ namespace AzToolsFramework } } - AZStd::unique_ptr savePrefabsDialog = ConstructSavePrefabsDialog(templateId, useSaveAllPrefabsPreference); - if (savePrefabsDialog) + AZStd::unique_ptr savePrefabDialog = ConstructSavePrefabDialog(templateId, useSaveAllPrefabsPreference); + if (savePrefabDialog) { - int prefabSaveSelection = savePrefabsDialog->exec(); + int prefabSaveSelection = savePrefabDialog->exec(); if (prefabSaveSelection == QDialog::Accepted) { - SavePrefabsInDialog(savePrefabsDialog.get()); + SavePrefabsInDialog(savePrefabDialog.get()); } } } @@ -1148,7 +1148,7 @@ namespace AzToolsFramework } } - AZStd::unique_ptr PrefabIntegrationManager::ConstructSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) + AZStd::unique_ptr PrefabIntegrationManager::ConstructSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) { AZStd::unique_ptr saveModifiedMessageBox = AZStd::make_unique(AzToolsFramework::GetActiveWindow()); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h index 8a210c2de0..64d3b652fc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h @@ -77,7 +77,7 @@ namespace AzToolsFramework // PrefabIntegrationInterface... AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) override; int ExecuteClosePrefabDialog(TemplateId templateId) override; - void ExecuteSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) override; + void ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) override; private: // Manages the Edit Mode UI for prefabs @@ -132,7 +132,7 @@ namespace AzToolsFramework AZStd::shared_ptr ConstructClosePrefabDialog(TemplateId templateId); AzQtComponents::Card* ConstructUnsavedPrefabsCard(TemplateId templateId); - AZStd::unique_ptr ConstructSavePrefabsDialog(TemplateId templateId, bool useSaveAllPrefabsPreference); + AZStd::unique_ptr ConstructSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference); void SavePrefabsInDialog(QDialog* unsavedPrefabsDialog); From 3822f92882156160d128b4a08804219c92af784d Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 17:32:53 -0700 Subject: [PATCH 104/355] fix manual inpsection window Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Code/Builder/ScriptCanvasBuilderWorker.cpp | 10 +++++----- .../Code/Editor/Components/GraphUpgrade.cpp | 6 +++--- .../View/Windows/Tools/UpgradeTool/VersionExplorer.cpp | 7 ++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index 775b280602..ecb28b60c6 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -315,11 +315,11 @@ namespace ScriptCanvasBuilder else { // force load all dependencies into memory - for (auto& dependency : m_processEditorAssetDependencies) - { - auto depAsset = AZ::Data::AssetManager::Instance().GetAsset(dependency.m_assetId, dependency.m_assetType, AZ::Data::AssetLoadBehavior::PreLoad); - depAsset.BlockUntilLoadComplete(); - } +// for (auto& dependency : m_processEditorAssetDependencies) +// { +// auto depAsset = AZ::Data::AssetManager::Instance().GetAsset(dependency.m_assetId, dependency.m_assetType, AZ::Data::AssetLoadBehavior::PreLoad); +// depAsset.BlockUntilLoadComplete(); +// } AZ::Entity* buildEntity = asset.Get()->GetScriptCanvasEntity(); diff --git a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp index f1c9a1455b..53b37ef4e9 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp @@ -515,13 +515,13 @@ namespace ScriptCanvasEditor ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = saveRawTranslationOuputToFile; - if (validationResults.HasResults()) + if (validationResults.HasErrors()) { + AZ::Interface::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId()); + for (auto& err : validationResults.GetEvents()) { // Register this graph as needing manual updates - AZ::Interface::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId()); - Log("%s: %s\n", err->GetIdentifier().c_str(), err->GetDescription().data()); } } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index eb7c609bee..bdf7f2926c 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -230,7 +230,7 @@ namespace ScriptCanvasEditor m_upgradeComplete = false; } - if (!IsUpgrading()) + if (!IsUpgrading() && m_state == ProcessState::Upgrade) { AZStd::string errorMessage = BackupGraph(*m_inProgressAsset); // Make the backup @@ -616,6 +616,11 @@ namespace ScriptCanvasEditor } } + if (m_upgradeResult == OperationResult::Failure) + { + AZ::Interface::Get()->GraphNeedsManualUpgrade(asset.GetId()); + } + m_tmpFileName.clear(); } From e69a5bc092d8aa5b34c3f21ba1996ad096c6ff73 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 17:44:52 -0700 Subject: [PATCH 105/355] fix progress bar for upgrades Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../View/Windows/Tools/UpgradeTool/VersionExplorer.cpp | 9 ++++++++- .../View/Windows/Tools/UpgradeTool/VersionExplorer.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index bdf7f2926c..f1919b64f0 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -189,7 +189,10 @@ namespace ScriptCanvasEditor AZStd::lock_guard lock(m_mutex); if (m_upgradeComplete) { + ++m_upgradeAssetIndex; m_inProgress = false; + m_ui->progressBar->setVisible(true); + m_ui->progressBar->setValue(m_upgradeAssetIndex); if (m_scriptCanvasEntity) { @@ -275,7 +278,7 @@ namespace ScriptCanvasEditor void VersionExplorer::OnUpgradeAll() { m_state = ProcessState::Upgrade; - // cache these + // cache these...with a widget thing ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; ScriptCanvas::Grammar::g_printAbstractCodeModel = false; ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; @@ -283,6 +286,9 @@ namespace ScriptCanvasEditor m_inProgressAsset = m_assetsToUpgrade.begin(); AZ::Debug::TraceMessageBus::Handler::BusConnect(); AZ::SystemTickBus::Handler::BusConnect(); + m_ui->progressBar->setVisible(true); + m_ui->progressBar->setRange(0, aznumeric_cast(m_assetsToUpgrade.size())); + m_ui->progressBar->setValue(m_upgradeAssetIndex); } AZStd::string VersionExplorer::BackupGraph(const AZ::Data::Asset& asset) @@ -669,6 +675,7 @@ namespace ScriptCanvasEditor m_ui->upgradeAllButton->setEnabled(false); m_ui->onlyShowOutdated->setEnabled(true); + m_ui->progressBar->setVisible(false); // Manual correction size_t assetsThatNeedManualInspection = AZ::Interface::Get()->GetGraphsThatNeedManualUpgrade().size(); if (assetsThatNeedManualInspection > 0) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index dc7516abc4..bcde6fbbd0 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -139,6 +139,7 @@ namespace ScriptCanvasEditor AZStd::recursive_mutex m_mutex; bool m_upgradeComplete = false; AZ::Data::Asset m_upgradeAsset; + int m_upgradeAssetIndex = 0; OperationResult m_upgradeResult; AZStd::string m_upgradeMessage; AZStd::string m_tmpFileName; From f4dbeb6538781760fc2cf535ba043d4bad0419db Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 2 Sep 2021 18:14:00 -0700 Subject: [PATCH 106/355] Fix list of manual inspection graphs Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp | 2 ++ .../Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h | 4 ++-- Gems/ScriptCanvas/Code/Editor/SystemComponent.h | 8 +++++++- .../View/Windows/Tools/UpgradeTool/VersionExplorer.cpp | 1 + 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp index 53b37ef4e9..e87c82e186 100644 --- a/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Components/GraphUpgrade.cpp @@ -511,6 +511,8 @@ namespace ScriptCanvasEditor bool saveRawTranslationOuputToFile = ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile; ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; + + // save parsing status before after, just because it didn't parse after doesn't mean it didn't before graph->Parse(validationResults); ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = saveRawTranslationOuputToFile; diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h index 1f036e22bb..4497968ffc 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Bus/EditorScriptCanvasBus.h @@ -223,9 +223,9 @@ namespace ScriptCanvasEditor using AssetList = AZStd::list; virtual AssetList& GetAssetsToUpgrade() = 0; + virtual void ClearGraphsThatNeedUpgrade() = 0; virtual void GraphNeedsManualUpgrade(const AZ::Data::AssetId&) = 0; - virtual AZStd::vector& GetGraphsThatNeedManualUpgrade() = 0; - + virtual const AZStd::vector& GetGraphsThatNeedManualUpgrade() const = 0; virtual bool IsUpgrading() = 0; virtual void SetIsUpgrading(bool isUpgrading) = 0; }; diff --git a/Gems/ScriptCanvas/Code/Editor/SystemComponent.h b/Gems/ScriptCanvas/Code/Editor/SystemComponent.h index 37515944c7..ba850401d6 100644 --- a/Gems/ScriptCanvas/Code/Editor/SystemComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/SystemComponent.h @@ -1,3 +1,4 @@ + /* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. @@ -109,6 +110,11 @@ namespace ScriptCanvasEditor //////////////////////////////////////////////////////////////////////// // IUpgradeRequests... + void ClearGraphsThatNeedUpgrade() + { + m_assetsThatNeedManualUpgrade.clear(); + } + IUpgradeRequests::AssetList& GetAssetsToUpgrade() override { return m_assetsToConvert; @@ -122,7 +128,7 @@ namespace ScriptCanvasEditor } } - AZStd::vector& GetGraphsThatNeedManualUpgrade() override + const AZStd::vector& GetGraphsThatNeedManualUpgrade() const override { return m_assetsThatNeedManualUpgrade; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index f1919b64f0..824e9ce147 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -283,6 +283,7 @@ namespace ScriptCanvasEditor ScriptCanvas::Grammar::g_printAbstractCodeModel = false; ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; AZ::Interface::Get()->SetIsUpgrading(true); + AZ::Interface::Get()->ClearGraphsThatNeedUpgrade(); m_inProgressAsset = m_assetsToUpgrade.begin(); AZ::Debug::TraceMessageBus::Handler::BusConnect(); AZ::SystemTickBus::Handler::BusConnect(); From 9a6a1ba97a28512e44cb241c55b455d151ae5b0a Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Thu, 2 Sep 2021 18:24:25 -0700 Subject: [PATCH 107/355] fixes monolithic release Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Frontend/Console/Code/CMakeLists.txt | 4 +++ Gems/Atom/Feature/Common/Code/CMakeLists.txt | 4 +-- .../Platform/Windows/platform_windows.cmake | 4 +++ Gems/CrashReporting/Code/CMakeLists.txt | 29 ++++++++++--------- Registry/CMakeLists.txt | 4 +++ cmake/OutputDirectory.cmake | 2 +- cmake/SettingsRegistry.cmake | 5 ++++ 7 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt b/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt index 1aed0aadc6..9c1ccb2255 100644 --- a/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt +++ b/Code/Tools/TestImpactFramework/Frontend/Console/Code/CMakeLists.txt @@ -6,6 +6,10 @@ # # +if(LY_MONOLITHIC_GAME) + return() +endif() + ly_add_target( NAME TestImpact.Frontend.Console.Static STATIC NAMESPACE AZ diff --git a/Gems/Atom/Feature/Common/Code/CMakeLists.txt b/Gems/Atom/Feature/Common/Code/CMakeLists.txt index 8ed02f2c2f..b8c414dcc6 100644 --- a/Gems/Atom/Feature/Common/Code/CMakeLists.txt +++ b/Gems/Atom/Feature/Common/Code/CMakeLists.txt @@ -39,7 +39,7 @@ ly_add_target( Gem::Atom_Utils.Static Gem::Atom_Feature_Common.Public Gem::ImGui.imguilib - 3rdParty::lux_core + #3rdParty::lux_core # AZ_TRAIT_LUXCORE_SUPPORTED is disabled in every platform, Issue #3915 will remove ) ly_add_target( @@ -87,7 +87,7 @@ ly_add_target( AZ::AzFramework Gem::Atom_Feature_Common.Static Gem::Atom_Feature_Common.Public - 3rdParty::lux_core + #3rdParty::lux_core # AZ_TRAIT_LUXCORE_SUPPORTED is disabled in every platform, Issue #3915 will remove ) if(PAL_TRAIT_BUILD_HOST_TOOLS) diff --git a/Gems/Atom/Feature/Common/Code/Source/Platform/Windows/platform_windows.cmake b/Gems/Atom/Feature/Common/Code/Source/Platform/Windows/platform_windows.cmake index b74260a5de..ecdc7d59ab 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Platform/Windows/platform_windows.cmake +++ b/Gems/Atom/Feature/Common/Code/Source/Platform/Windows/platform_windows.cmake @@ -6,6 +6,10 @@ # # +if(LY_MONOLITHIC_GAME) # Do not use OpenImageIO in monolithic game + return() +endif() + set(LY_BUILD_DEPENDENCIES PRIVATE 3rdParty::OpenImageIO diff --git a/Gems/CrashReporting/Code/CMakeLists.txt b/Gems/CrashReporting/Code/CMakeLists.txt index b12b5d8944..8bcb143d1c 100644 --- a/Gems/CrashReporting/Code/CMakeLists.txt +++ b/Gems/CrashReporting/Code/CMakeLists.txt @@ -35,17 +35,20 @@ ly_add_target( ly_create_alias(NAME CrashReporting.Clients NAMESPACE Gem TARGETS Gem::CrashReporting) ly_create_alias(NAME CrashReporting.Servers NAMESPACE Gem TARGETS Gem::CrashReporting) +if(NOT LY_MONOLITHIC_GAME) -ly_add_target( - NAME CrashReporting.Uploader APPLICATION - NAMESPACE AZ - FILES_CMAKE - game_crash_uploader_files.cmake - Platform/${PAL_PLATFORM_NAME}/game_crash_uploader_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake - INCLUDE_DIRECTORIES - PRIVATE - Include - BUILD_DEPENDENCIES - PRIVATE - AZ::CrashUploaderSupport -) + ly_add_target( + NAME CrashReporting.Uploader APPLICATION + NAMESPACE AZ + FILES_CMAKE + game_crash_uploader_files.cmake + Platform/${PAL_PLATFORM_NAME}/game_crash_uploader_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Include + BUILD_DEPENDENCIES + PRIVATE + AZ::CrashUploaderSupport + ) + +endif() diff --git a/Registry/CMakeLists.txt b/Registry/CMakeLists.txt index f78df700e7..100867010d 100644 --- a/Registry/CMakeLists.txt +++ b/Registry/CMakeLists.txt @@ -6,6 +6,10 @@ # # +if(LY_MONOLITHIC_GAME) + return() +endif() + ly_install_directory(DIRECTORIES .) cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory) diff --git a/cmake/OutputDirectory.cmake b/cmake/OutputDirectory.cmake index c1409bd825..a75b47e818 100644 --- a/cmake/OutputDirectory.cmake +++ b/cmake/OutputDirectory.cmake @@ -15,5 +15,5 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build dir # be installed together. We also have an exclusion rule in the AP that filters out the # "install" folder to avoid the AP picking it up if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - ly_set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install) + set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "Install directory" FORCE) endif() diff --git a/cmake/SettingsRegistry.cmake b/cmake/SettingsRegistry.cmake index 58beba089c..f84ecca334 100644 --- a/cmake/SettingsRegistry.cmake +++ b/cmake/SettingsRegistry.cmake @@ -118,6 +118,11 @@ endfunction() # The generated file contains the file to the each dependent targets # This can be used for example to determine which list of gems to load with an application function(ly_delayed_generate_settings_registry) + + if(LY_MONOLITHIC_GAME) # No need to generate setregs for monolithic builds + return() + endif() + get_property(ly_delayed_load_targets GLOBAL PROPERTY LY_DELAYED_LOAD_DEPENDENCIES) foreach(prefix_target ${ly_delayed_load_targets}) string(REPLACE "," ";" prefix_target_list "${prefix_target}") From 1aa7059d0102e5f215077132b51816571caf6a15 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Thu, 2 Sep 2021 18:24:49 -0700 Subject: [PATCH 108/355] generates paks for release Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Install.cmake | 19 ++++++++++++++++++- cmake/Projects.cmake | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/cmake/Install.cmake b/cmake/Install.cmake index b71b01eb7d..6f50c78fd7 100644 --- a/cmake/Install.cmake +++ b/cmake/Install.cmake @@ -134,4 +134,21 @@ function(ly_install_files) COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} # use the default for the time being ) -endfunction() \ No newline at end of file +endfunction() + +#! ly_install_run_code: specifies code to be added to the install process (will run at install time) +# +# \notes: +# - refer to cmake's install(CODE documentation for more information +# +function(ly_install_run_code CODE) + + if(NOT LY_INSTALL_ENABLED) + return() + endif() + + install(CODE ${CODE} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} # use the default for the time being + ) + +endfunction() diff --git a/cmake/Projects.cmake b/cmake/Projects.cmake index 6e5b5c5f78..627b31bc43 100644 --- a/cmake/Projects.cmake +++ b/cmake/Projects.cmake @@ -142,6 +142,21 @@ foreach(project ${LY_PROJECTS}) add_subdirectory(${project} "${project_folder_name}-${full_directory_hash}") ly_generate_project_build_path_setreg(${full_directory_path}) add_project_json_external_subdirectories(${full_directory_path}) + + # Generate pak for project in release installs + cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory) + ly_install_run_code(" +if(\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$\") + set(install_output_folder \"\${CMAKE_INSTALL_PREFIX}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/\${CMAKE_INSTALL_CONFIG_NAME}\") + message(STATUS \"Generating \${install_output_folder}/Engine.pak from ${full_directory_path}/Cache\") + file(ARCHIVE_CREATE OUTPUT \${install_output_folder}/Engine.pak + PATHS ${full_directory_path}/Cache + FORMAT zip + ) + message(STATUS \"\${install_output_folder}/Engine.pak generated\") +endif() +") + endforeach() # If just one project is defined we pass it as a parameter to the applications From 5a8998add11b6657d6b365802943240086fae584 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Thu, 2 Sep 2021 23:35:28 -0700 Subject: [PATCH 109/355] Added function comments and nullptr checks Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 28 ++-- Code/Editor/Style/Editor.qss | 9 +- .../Prefab/PrefabSystemComponent.cpp | 49 ++++--- .../Prefab/PrefabSystemComponentInterface.h | 10 ++ .../UI/Prefab/PrefabIntegrationInterface.h | 6 + .../UI/Prefab/PrefabIntegrationManager.cpp | 123 ++++++++++-------- .../UI/Prefab/PrefabIntegrationManager.h | 2 +- 7 files changed, 137 insertions(+), 90 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 4725101599..2e738a18c5 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -723,24 +723,22 @@ void CCryEditApp::OnFileSave() } const QScopedValueRollback rollback(m_savingLevel, true); - - bool usePrefabSystemForLevels = false; AzFramework::ApplicationRequests::Bus::BroadcastResult( usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled); - - if (!usePrefabSystemForLevels) { GetIEditor()->GetDocument()->DoFileSave(); } else { - auto prefabEditorEntityOwnershipService = AZ::Interface::Get(); - AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipService->GetRootPrefabTemplateId(); - auto prefabIntegrationInterface = AZ::Interface::Get(); + auto* prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + auto* prefabIntegrationInterface = AZ::Interface::Get(); + AZ_Assert(prefabEditorEntityOwnershipInterface != nullptr, "PrefabEditorEntityOwnershipInterface is not found."); + AZ_Assert(prefabIntegrationInterface != nullptr, "PrefabIntegrationInterface is not found."); + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); prefabIntegrationInterface->ExecuteSavePrefabDialog(rootPrefabTemplateId, true); } } @@ -3187,12 +3185,18 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) } else { - auto prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - auto prefabIntegrationInterface = AZ::Interface::Get(); - AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); + auto* prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + auto* prefabIntegrationInterface = AZ::Interface::Get(); + AZ_Assert(prefabEditorEntityOwnershipInterface != nullptr, "PrefabEditorEntityOwnershipInterface is not found."); + AZ_Assert(prefabIntegrationInterface != nullptr, "PrefabIntegrationInterface is not found."); - int prefabSaveSelection = - prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); + if (prefabEditorEntityOwnershipInterface == nullptr || prefabIntegrationInterface == nullptr) + { + return false; + } + + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); + int prefabSaveSelection = prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. switch (1 - prefabSaveSelection) diff --git a/Code/Editor/Style/Editor.qss b/Code/Editor/Style/Editor.qss index 3bf92b4495..302b7703a5 100644 --- a/Code/Editor/Style/Editor.qss +++ b/Code/Editor/Style/Editor.qss @@ -245,7 +245,8 @@ QTableWidget#recentLevelTable::item { qproperty-iconSize: 16px 16px; } -#SavePrefabDialog, #SaveAllFilesDialog + +#ClosePrefabDialog, #SavePrefabDialog { min-width : 640px; } @@ -262,7 +263,7 @@ QTableWidget#recentLevelTable::item { padding: 5px 2px 5px 2px; } -#SavePrefabDialog #PrefabSaveWarningFrame +#ClosePrefabDialog #PrefabSaveWarningFrame { border: 1px solid orange; margin: 10px 15px 10px 15px; @@ -271,12 +272,12 @@ QTableWidget#recentLevelTable::item { color : white; } -#SaveAllFilesDialog #FooterSeparatorLine, #SavePrefabDialog #FooterSeparatorLine +#SavePrefabDialog #FooterSeparatorLine { color: gray; } -#SaveAllFilesDialog #PrefabSavePreferenceHint, #SavePrefabDialog #PrefabSavePreferenceHint +#SavePrefabDialog #PrefabSavePreferenceHint { font: italic; color: #999999; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index e465e111aa..a2ef30d1f7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -756,13 +756,20 @@ namespace AzToolsFramework bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId templateId) { - auto parentTemplate = FindTemplate(templateId); + auto prefabTemplate = FindTemplate(templateId); + + if (!prefabTemplate.has_value()) + { + AZ_Assert(false, "Template with id %llu is not found", templateId); + return false; + } + if (IsTemplateDirty(templateId)) { return true; } - auto linkIds = parentTemplate->get().GetLinks(); + auto linkIds = prefabTemplate->get().GetLinks(); for (auto linkId : linkIds) { @@ -777,31 +784,39 @@ namespace AzToolsFramework void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId templateId) { - auto parentTemplate = FindTemplate(templateId); - if (IsTemplateDirty(templateId)) - { - m_prefabLoader.SaveTemplate(templateId); - } - auto linkIds = parentTemplate->get().GetLinks(); + AZStd::set dirtyTemplatePaths; + GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); - for (auto linkId : linkIds) + for (auto dirtyTemplatePath : dirtyTemplatePaths) { - auto linkIterator = m_linkIdMap.find(linkId); - if (linkIterator != m_linkIdMap.end()) + auto dirtyTemplateIterator = m_templateFilePathToIdMap.find(dirtyTemplatePath); + if (dirtyTemplateIterator == m_templateFilePathToIdMap.end()) { - SaveAllDirtyTemplates(linkIterator->second.GetSourceTemplateId()); + AZ_Assert(false, "Template id for template with path '%s' is not found.", dirtyTemplatePath); + } + else + { + m_prefabLoader.SaveTemplate(dirtyTemplateIterator->second); } } } - void PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) + void PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId, AZStd::set& dirtyTemplatePaths) { - auto parentTemplate = FindTemplate(parentTemplateId); - if (IsTemplateDirty(parentTemplateId)) + auto prefabTemplate = FindTemplate(templateId); + + if (!prefabTemplate.has_value()) { - dirtyTemplatePaths.emplace(parentTemplate->get().GetFilePath()); + AZ_Assert(false, "Template with id %llu is not found", templateId); + return; } - auto linkIds = parentTemplate->get().GetLinks(); + + if (IsTemplateDirty(templateId)) + { + dirtyTemplatePaths.emplace(prefabTemplate->get().GetFilePath()); + } + + auto linkIds = prefabTemplate->get().GetLinks(); for (auto linkId : linkIds) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index a5abf138f7..98e7719907 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -50,8 +50,18 @@ namespace AzToolsFramework virtual bool IsTemplateDirty(const TemplateId& templateId) = 0; virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; + + //! Recursive function to check if the template is dirty or if any dirty templates are presents in the links of the template. + //! @param templateId The id of the template provided as the beginning template to check the outgoing links. virtual bool AreDirtyTemplatesPresent(TemplateId templateId) = 0; + + //! Recursive function to save if the template is dirty and save all the dirty templates in the links of the template. + //! @param templateId The id of the template provided as the beginning template to check the outgoing links. virtual void SaveAllDirtyTemplates(TemplateId templateId) = 0; + + //! Recursive function that fetches the set of dirty templates given a starting template to check for outgoing links. + //! @param templateId The id of the template provided as the beginning template to check the outgoing links. + //! @param[out] dirtyTemplatePaths The set of dirty template paths populated. virtual void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h index f5f393f3b8..e92f08f9ff 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationInterface.h @@ -30,7 +30,13 @@ namespace AzToolsFramework */ virtual AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& position, AZ::EntityId parentId) = 0; + //! Constructs and executes the close dialog on a prefab template corresponding to templateId. + //! @param templateId The id of the template the user chose to close. virtual int ExecuteClosePrefabDialog(TemplateId templateId) = 0; + + //! Constructs and executes the save dialog on a prefab template corresponding to templateId. + //! @param templateId The id of the template the user chose to save. + //! @param useSaveAllPrefabsPreference A flag indicating whether SaveAllPrefabsPreference should be used for saving templates. virtual void ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference = false) = 0; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 42d8ec80bf..ad3ac9e69f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -63,6 +63,16 @@ namespace AzToolsFramework PrefabSystemComponentInterface* PrefabIntegrationManager::s_prefabSystemComponentInterface = nullptr; const AZStd::string PrefabIntegrationManager::s_prefabFileExtension = ".prefab"; + + static constexpr char* const ClosePrefabDialog = "ClosePrefabDialog"; + static constexpr char* const FooterSeparatorLine = "FooterSeparatorLine"; + static constexpr char* const PrefabSavedMessageFrame = "PrefabSavedMessageFrame"; + static constexpr char* const PrefabSavePreferenceHint = "PrefabSavePreferenceHint"; + static constexpr char* const PrefabSaveWarningFrame = "PrefabSaveWarningFrame"; + static constexpr char* const SaveDependentPrefabsCard = "SaveDependentPrefabsCard"; + static constexpr char* const SavePrefabDialog = "SavePrefabDialog"; + static constexpr char* const UnsavedPrefabFileName = "UnsavedPrefabFileName"; + void PrefabUserSettings::Reflect(AZ::ReflectContext* context) { @@ -1100,7 +1110,7 @@ namespace AzToolsFramework { if (s_prefabLoaderInterface->SaveTemplate(templateId) == false) { - AZ_Error("Prefabs", false, "Template '%s' could not be saved successfully.", prefabTemplatePath.c_str()); + AZ_Error("Prefab", false, "Template '%s' could not be saved successfully.", prefabTemplatePath.c_str()); return; } } @@ -1134,7 +1144,7 @@ namespace AzToolsFramework void PrefabIntegrationManager::SavePrefabsInDialog(QDialog* unsavedPrefabsDialog) { - QList unsavedPrefabFileLabels = unsavedPrefabsDialog->findChildren("UnsavedPrefabFileName"); + QList unsavedPrefabFileLabels = unsavedPrefabsDialog->findChildren(UnsavedPrefabFileName); if (unsavedPrefabFileLabels.size() > 0) { for (const QLabel* unsavedPrefabFileLabel : unsavedPrefabFileLabels) @@ -1150,22 +1160,22 @@ namespace AzToolsFramework AZStd::unique_ptr PrefabIntegrationManager::ConstructSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) { - AZStd::unique_ptr saveModifiedMessageBox = AZStd::make_unique(AzToolsFramework::GetActiveWindow()); + AZStd::unique_ptr savePrefabDialog = AZStd::make_unique(AzToolsFramework::GetActiveWindow()); - saveModifiedMessageBox->setWindowTitle("Unsaved files detected"); + savePrefabDialog->setWindowTitle("Unsaved files detected"); // Main Content section begins. - saveModifiedMessageBox->setObjectName("SaveAllFilesDialog"); - QBoxLayout* contentLayout = new QVBoxLayout(saveModifiedMessageBox.get()); + savePrefabDialog->setObjectName(SavePrefabDialog); + QBoxLayout* contentLayout = new QVBoxLayout(savePrefabDialog.get()); - QFrame* prefabSavedMessageFrame = new QFrame(saveModifiedMessageBox.get()); - QHBoxLayout* prefabSavedMessageLayout = new QHBoxLayout(saveModifiedMessageBox.get()); - prefabSavedMessageFrame->setObjectName("PrefabSavedMessageFrame"); + QFrame* prefabSavedMessageFrame = new QFrame(savePrefabDialog.get()); + QHBoxLayout* prefabSavedMessageLayout = new QHBoxLayout(savePrefabDialog.get()); + prefabSavedMessageFrame->setObjectName(PrefabSavedMessageFrame); prefabSavedMessageFrame->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); // Add a checkMark icon next to the level entities saved message. QPixmap checkMarkIcon(QString(":/Notifications/checkmark.svg")); - QLabel* prefabSavedSuccessfullyIconContainer = new QLabel(); + QLabel* prefabSavedSuccessfullyIconContainer = new QLabel(savePrefabDialog.get()); prefabSavedSuccessfullyIconContainer->setPixmap(checkMarkIcon); prefabSavedSuccessfullyIconContainer->setFixedWidth(checkMarkIcon.width()); @@ -1174,69 +1184,71 @@ namespace AzToolsFramework auto prefabTemplate = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path prefabTemplatePath = prefabTemplate->get().GetFilePath(); QLabel* prefabSavedSuccessfullyLabel = new QLabel( - QString("Prefab %1 has been saved. Do you want to save the below dependent prefabs too?").arg(prefabTemplatePath.c_str())); - prefabSavedSuccessfullyLabel->setObjectName("PrefabSavedSuccessfullyLabel"); + QString("Prefab %1 has been saved. Do you want to save the below dependent prefabs too?").arg(prefabTemplatePath.c_str()), + savePrefabDialog.get()); prefabSavedMessageLayout->addWidget(prefabSavedSuccessfullyIconContainer); prefabSavedMessageLayout->addWidget(prefabSavedSuccessfullyLabel); prefabSavedMessageFrame->setLayout(prefabSavedMessageLayout); contentLayout->addWidget(prefabSavedMessageFrame); - AzQtComponents::Card* unsavedPrefabsContainer = ConstructUnsavedPrefabsCard(templateId); - contentLayout->addWidget(unsavedPrefabsContainer); + AZStd::unique_ptr unsavedPrefabsContainer = ConstructUnsavedPrefabsCard(templateId); + contentLayout->addWidget(unsavedPrefabsContainer.release()); contentLayout->addStretch(); // Footer section begins. - QHBoxLayout* footerLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + QHBoxLayout* footerLayout = new QHBoxLayout(savePrefabDialog.get()); if (useSaveAllPrefabsPreference) { - QFrame* footerSeparatorLine = new QFrame(); - footerSeparatorLine->setObjectName("FooterSeparatorLine"); + QFrame* footerSeparatorLine = new QFrame(savePrefabDialog.get()); + footerSeparatorLine->setObjectName(FooterSeparatorLine); footerSeparatorLine->setFrameShape(QFrame::HLine); contentLayout->addWidget(footerSeparatorLine); - QLabel* prefabSavePreferenceHint = - new QLabel("You can prevent this window from showing in the future by updating your global save preferences."); + QLabel* prefabSavePreferenceHint = new QLabel( + "You can prevent this window from showing in the future by updating your global save preferences.", + savePrefabDialog.get()); prefabSavePreferenceHint->setToolTip( "Go to 'Edit > Editor Settings > Global Preferences... > Global save preferences' to update your preference"); - prefabSavePreferenceHint->setObjectName("PrefabSavePreferenceHint"); + prefabSavePreferenceHint->setObjectName(PrefabSavePreferenceHint); footerLayout->addWidget(prefabSavePreferenceHint); } - QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No); + QDialogButtonBox* prefabSaveConfirmationButtons = + new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::No, savePrefabDialog.get()); footerLayout->addWidget(prefabSaveConfirmationButtons); contentLayout->addLayout(footerLayout); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, saveModifiedMessageBox.get(), &QDialog::accept); - connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, saveModifiedMessageBox.get(), &QDialog::reject); - AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox->parentWidget(), QStringLiteral("style:Editor.qss")); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, savePrefabDialog.get(), &QDialog::accept); + connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, savePrefabDialog.get(), &QDialog::reject); + AzQtComponents::StyleManager::setStyleSheet(savePrefabDialog->parentWidget(), QStringLiteral("style:Editor.qss")); - return AZStd::move(saveModifiedMessageBox); + return AZStd::move(savePrefabDialog); } AZStd::shared_ptr PrefabIntegrationManager::ConstructClosePrefabDialog(TemplateId templateId) { - AZStd::shared_ptr saveModifiedMessageBox = AZStd::make_shared(AzToolsFramework::GetActiveWindow()); - saveModifiedMessageBox->setWindowTitle("Unsaved files detected"); - AZStd::weak_ptr saveModifiedMessageBoxWeakPtr(saveModifiedMessageBox); - saveModifiedMessageBox->setObjectName("SavePrefabDialog"); + AZStd::shared_ptr closePrefabDialog = AZStd::make_shared(AzToolsFramework::GetActiveWindow()); + closePrefabDialog->setWindowTitle("Unsaved files detected"); + AZStd::weak_ptr closePrefabDialogWeakPtr(closePrefabDialog); + closePrefabDialog->setObjectName(ClosePrefabDialog); // Main Content section begins. - QVBoxLayout* contentLayout = new QVBoxLayout(saveModifiedMessageBox.get()); - QFrame* prefabSaveWarningFrame = new QFrame(saveModifiedMessageBox.get()); - QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(saveModifiedMessageBox.get()); - prefabSaveWarningFrame->setObjectName("PrefabSaveWarningFrame"); + QVBoxLayout* contentLayout = new QVBoxLayout(closePrefabDialog.get()); + QFrame* prefabSaveWarningFrame = new QFrame(closePrefabDialog.get()); + QHBoxLayout* levelEntitiesSaveQuestionLayout = new QHBoxLayout(closePrefabDialog.get()); + prefabSaveWarningFrame->setObjectName(PrefabSaveWarningFrame); // Add a warning icon next to save prefab warning. prefabSaveWarningFrame->setLayout(levelEntitiesSaveQuestionLayout); QPixmap warningIcon(QString(":/Notifications/warning.svg")); - QLabel* warningIconContainer = new QLabel(); + QLabel* warningIconContainer = new QLabel(closePrefabDialog.get()); warningIconContainer->setPixmap(warningIcon); warningIconContainer->setFixedWidth(warningIcon.width()); levelEntitiesSaveQuestionLayout->addWidget(warningIconContainer); // Ask user if they want to save entities in level. - QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save the below unsaved prefabs?", saveModifiedMessageBox.get()); + QLabel* prefabSaveQuestionLabel = new QLabel("Do you want to save the below unsaved prefabs?", closePrefabDialog.get()); levelEntitiesSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); contentLayout->addWidget(prefabSaveWarningFrame); @@ -1244,60 +1256,59 @@ namespace AzToolsFramework s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); auto templateToSave = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path templateToSaveFilePath = templateToSave->get().GetFilePath(); - AzQtComponents::Card* unsavedPrefabsCard = ConstructUnsavedPrefabsCard(templateId); - contentLayout->addWidget(unsavedPrefabsCard); + AZStd::unique_ptr unsavedPrefabsCard = ConstructUnsavedPrefabsCard(templateId); + contentLayout->addWidget(unsavedPrefabsCard.release()); contentLayout->addStretch(); - QHBoxLayout* footerLayout = new QHBoxLayout(saveModifiedMessageBox.get()); + QHBoxLayout* footerLayout = new QHBoxLayout(closePrefabDialog.get()); - QDialogButtonBox* prefabSaveConfirmationButtons = - new QDialogButtonBox(QDialogButtonBox::Save | QDialogButtonBox::Discard | QDialogButtonBox::Cancel); + QDialogButtonBox* prefabSaveConfirmationButtons = new QDialogButtonBox( + QDialogButtonBox::Save | QDialogButtonBox::Discard | QDialogButtonBox::Cancel, closePrefabDialog.get()); footerLayout->addWidget(prefabSaveConfirmationButtons); contentLayout->addLayout(footerLayout); - QObject::connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, saveModifiedMessageBox.get(), &QDialog::accept); - QObject::connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, saveModifiedMessageBox.get(), &QDialog::reject); + QObject::connect(prefabSaveConfirmationButtons, &QDialogButtonBox::accepted, closePrefabDialog.get(), &QDialog::accept); + QObject::connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, closePrefabDialog.get(), &QDialog::reject); QObject::connect( - prefabSaveConfirmationButtons, &QDialogButtonBox::clicked, saveModifiedMessageBox.get(), - [saveModifiedMessageBoxWeakPtr, prefabSaveConfirmationButtons](QAbstractButton* button) + prefabSaveConfirmationButtons, &QDialogButtonBox::clicked, closePrefabDialog.get(), + [closePrefabDialogWeakPtr, prefabSaveConfirmationButtons](QAbstractButton* button) { int prefabSaveSelection = prefabSaveConfirmationButtons->buttonRole(button); - saveModifiedMessageBoxWeakPtr.lock()->done(prefabSaveSelection); + closePrefabDialogWeakPtr.lock()->done(prefabSaveSelection); }); - AzQtComponents::StyleManager::setStyleSheet(saveModifiedMessageBox.get(), QStringLiteral("style:Editor.qss")); - return saveModifiedMessageBox; + AzQtComponents::StyleManager::setStyleSheet(closePrefabDialog.get(), QStringLiteral("style:Editor.qss")); + return closePrefabDialog; } - AzQtComponents::Card* PrefabIntegrationManager::ConstructUnsavedPrefabsCard(TemplateId templateId) + AZStd::unique_ptr PrefabIntegrationManager::ConstructUnsavedPrefabsCard(TemplateId templateId) { - FlowLayout* unsavedPrefabsLayout = new FlowLayout; + FlowLayout* unsavedPrefabsLayout = new FlowLayout(AzToolsFramework::GetActiveWindow()); AZStd::set dirtyTemplatePaths; s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) { - QLabel* prefabNameLabel = new QLabel(QString("%1").arg(dirtyTemplatePath.Filename().Native().data())); - prefabNameLabel->setObjectName("UnsavedPrefabFileName"); + QLabel* prefabNameLabel = + new QLabel(QString("%1").arg(dirtyTemplatePath.Filename().Native().data()), AzToolsFramework::GetActiveWindow()); + prefabNameLabel->setObjectName(UnsavedPrefabFileName); prefabNameLabel->setWordWrap(true); prefabNameLabel->setToolTip(dirtyTemplatePath.Native().data()); prefabNameLabel->setProperty("FilePath", dirtyTemplatePath.Native().data()); unsavedPrefabsLayout->addWidget(prefabNameLabel); } - AzQtComponents::Card* unsavedPrefabsContainer = new AzQtComponents::Card; + AZStd::unique_ptr unsavedPrefabsContainer = AZStd::make_unique(AzToolsFramework::GetActiveWindow()); unsavedPrefabsContainer->setObjectName("SaveDependentPrefabsCard"); unsavedPrefabsContainer->setTitle("Unsaved Prefabs"); unsavedPrefabsContainer->header()->setHasContextMenu(false); unsavedPrefabsContainer->header()->setIcon(QIcon(QStringLiteral(":/Entity/prefab_edit.svg"))); - QFrame* unsavedPrefabsFrame = new QFrame(unsavedPrefabsContainer); + QFrame* unsavedPrefabsFrame = new QFrame(unsavedPrefabsContainer.get()); unsavedPrefabsFrame->setLayout(unsavedPrefabsLayout); - QScrollArea* unsavedPrefabsScrollArea = new QScrollArea(); + QScrollArea* unsavedPrefabsScrollArea = new QScrollArea(unsavedPrefabsContainer.get()); unsavedPrefabsScrollArea->setWidget(unsavedPrefabsFrame); - //unsavedPrefabsScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); unsavedPrefabsScrollArea->setWidgetResizable(true); - unsavedPrefabsScrollArea->setObjectName("SavePrefabsCardContent"); unsavedPrefabsContainer->setContentWidget(unsavedPrefabsScrollArea); return AZStd::move(unsavedPrefabsContainer); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h index 64d3b652fc..3e66350932 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.h @@ -131,7 +131,7 @@ namespace AzToolsFramework static AZ::u32 GetSliceFlags(const AZ::Edit::ElementData* editData, const AZ::Edit::ClassData* classData); AZStd::shared_ptr ConstructClosePrefabDialog(TemplateId templateId); - AzQtComponents::Card* ConstructUnsavedPrefabsCard(TemplateId templateId); + AZStd::unique_ptr ConstructUnsavedPrefabsCard(TemplateId templateId); AZStd::unique_ptr ConstructSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference); void SavePrefabsInDialog(QDialog* unsavedPrefabsDialog); From 8331b8dd8ad26b84928817b3cc3490508b04c458 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Fri, 3 Sep 2021 01:34:32 -0700 Subject: [PATCH 110/355] Fix a compile error by changing to const instead of constexpr Signed-off-by: srikappa-amzn --- .../UI/Prefab/PrefabIntegrationManager.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index ca09bbe88d..3df7e68008 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -64,14 +64,14 @@ namespace AzToolsFramework const AZStd::string PrefabIntegrationManager::s_prefabFileExtension = ".prefab"; - static constexpr char* const ClosePrefabDialog = "ClosePrefabDialog"; - static constexpr char* const FooterSeparatorLine = "FooterSeparatorLine"; - static constexpr char* const PrefabSavedMessageFrame = "PrefabSavedMessageFrame"; - static constexpr char* const PrefabSavePreferenceHint = "PrefabSavePreferenceHint"; - static constexpr char* const PrefabSaveWarningFrame = "PrefabSaveWarningFrame"; - static constexpr char* const SaveDependentPrefabsCard = "SaveDependentPrefabsCard"; - static constexpr char* const SavePrefabDialog = "SavePrefabDialog"; - static constexpr char* const UnsavedPrefabFileName = "UnsavedPrefabFileName"; + static const char* const ClosePrefabDialog = "ClosePrefabDialog"; + static const char* const FooterSeparatorLine = "FooterSeparatorLine"; + static const char* const PrefabSavedMessageFrame = "PrefabSavedMessageFrame"; + static const char* const PrefabSavePreferenceHint = "PrefabSavePreferenceHint"; + static const char* const PrefabSaveWarningFrame = "PrefabSaveWarningFrame"; + static const char* const SaveDependentPrefabsCard = "SaveDependentPrefabsCard"; + static const char* const SavePrefabDialog = "SavePrefabDialog"; + static const char* const UnsavedPrefabFileName = "UnsavedPrefabFileName"; void PrefabUserSettings::Reflect(AZ::ReflectContext* context) From 5851031d2ebfdcb95471b348ff81c3e803b0483e Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Fri, 3 Sep 2021 10:14:03 +0100 Subject: [PATCH 111/355] Expose the ability to control manipulator line bounds (#3890) Signed-off-by: hultonha --- Code/Editor/EditorPreferencesDialog.cpp | 2 +- .../EditorPreferencesPageViewportGizmo.cpp | 85 +++++-------------- .../EditorPreferencesPageViewportGizmo.h | 62 +++++++------- Code/Editor/EditorViewportSettings.cpp | 11 +++ Code/Editor/EditorViewportSettings.h | 3 + Code/Editor/EditorViewportWidget.cpp | 6 ++ Code/Editor/IEditorImpl.cpp | 4 +- Code/Editor/Objects/ObjectManager.cpp | 2 +- Code/Editor/PreferencesStdPages.cpp | 2 +- Code/Editor/Settings.cpp | 37 -------- Code/Editor/Settings.h | 18 ---- .../ViewportInteraction.h | 12 +-- .../Source/ViewportInteraction.cpp | 5 ++ .../Manipulators/EditorVertexSelection.cpp | 2 + .../Manipulators/ManipulatorView.cpp | 46 ++++++++-- .../Manipulators/ScaleManipulators.cpp | 13 ++- .../Manipulators/ScaleManipulators.h | 4 + .../Manipulators/TranslationManipulators.cpp | 20 +++-- .../Manipulators/TranslationManipulators.h | 4 + .../Viewport/ViewportMessages.h | 47 +++++++--- .../EditorTransformComponentSelection.cpp | 2 + .../Viewport/RenderViewportWidget.h | 1 + .../Source/Viewport/RenderViewportWidget.cpp | 5 ++ .../EditorPolygonPrismShapeComponentMode.cpp | 3 +- .../EditorSubComponentModeAngleCone.cpp | 5 +- 25 files changed, 210 insertions(+), 191 deletions(-) diff --git a/Code/Editor/EditorPreferencesDialog.cpp b/Code/Editor/EditorPreferencesDialog.cpp index c3fc4139f6..6cbbccb7ac 100644 --- a/Code/Editor/EditorPreferencesDialog.cpp +++ b/Code/Editor/EditorPreferencesDialog.cpp @@ -65,7 +65,7 @@ EditorPreferencesDialog::EditorPreferencesDialog(QWidget* pParent) CEditorPreferencesPage_General::Reflect(*serializeContext); CEditorPreferencesPage_Files::Reflect(*serializeContext); CEditorPreferencesPage_ViewportGeneral::Reflect(*serializeContext); - CEditorPreferencesPage_ViewportGizmo::Reflect(*serializeContext); + CEditorPreferencesPage_ViewportManipulator::Reflect(*serializeContext); CEditorPreferencesPage_ViewportMovement::Reflect(*serializeContext); CEditorPreferencesPage_ViewportDebug::Reflect(*serializeContext); CEditorPreferencesPage_ExperimentalLighting::Reflect(*serializeContext); diff --git a/Code/Editor/EditorPreferencesPageViewportGizmo.cpp b/Code/Editor/EditorPreferencesPageViewportGizmo.cpp index 90129bb6a5..5d1ae53e85 100644 --- a/Code/Editor/EditorPreferencesPageViewportGizmo.cpp +++ b/Code/Editor/EditorPreferencesPageViewportGizmo.cpp @@ -5,96 +5,57 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #include "EditorDefs.h" #include "EditorPreferencesPageViewportGizmo.h" // Editor +#include "EditorViewportSettings.h" #include "Settings.h" - -void CEditorPreferencesPage_ViewportGizmo::Reflect(AZ::SerializeContext& serialize) +void CEditorPreferencesPage_ViewportManipulator::Reflect(AZ::SerializeContext& serialize) { - serialize.Class() - ->Version(1) - ->Field("Size", &AxisGizmo::m_size) - ->Field("Text", &AxisGizmo::m_text) - ->Field("MaxCount", &AxisGizmo::m_maxCount); + serialize.Class()->Version(1)->Field("LineBoundWidth", &Manipulators::m_manipulatorLineBoundWidth); - serialize.Class() - ->Version(1) - ->Field("LabelsOn", &Helpers::m_helpersGlobalScale) - ->Field("LabelsOn", &Helpers::m_tagpointScaleMulti) - ->Field("LabelsOn", &Helpers::m_rulerSphereScale) - ->Field("LabelsDistance", &Helpers::m_rulerSphereTrans); + serialize.Class()->Version(2)->Field( + "Manipulators", &CEditorPreferencesPage_ViewportManipulator::m_manipulators); - serialize.Class() - ->Version(1) - ->Field("Axis Gizmo", &CEditorPreferencesPage_ViewportGizmo::m_axisGizmo) - ->Field("Helpers", &CEditorPreferencesPage_ViewportGizmo::m_helpers); - - AZ::EditContext* editContext = serialize.GetEditContext(); - if (editContext) + if (AZ::EditContext* editContext = serialize.GetEditContext()) { - editContext->Class("Axis Gizmo", "") - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &AxisGizmo::m_size, "Size", "Axis Gizmo Size") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &AxisGizmo::m_text, "Text Labels", "Text Labels on Axis Gizmo") - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &AxisGizmo::m_maxCount, "Max Count", "Max Count of Axis Gizmos"); + editContext->Class("Manipulators", "") + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &Manipulators::m_manipulatorLineBoundWidth, "Line Bound Width", + "Manipulator Line Bound Width") + ->Attribute(AZ::Edit::Attributes::Min, 0.001f) + ->Attribute(AZ::Edit::Attributes::Max, 2.0f); - editContext->Class("Helpers", "") - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &Helpers::m_helpersGlobalScale, "Helpers Scale", "Helpers Scale") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) - ->Attribute(AZ::Edit::Attributes::Max, 100.0f) - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &Helpers::m_tagpointScaleMulti, "Tagpoint Scale Multiplier", "Tagpoint Scale Multiplier") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) - ->Attribute(AZ::Edit::Attributes::Max, 100.0f) - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &Helpers::m_rulerSphereScale, "Ruler Sphere Scale", "Ruler Sphere Scale") - ->Attribute(AZ::Edit::Attributes::Min, 0.1f) - ->Attribute(AZ::Edit::Attributes::Max, 100.0f) - ->Attribute(AZ::Edit::Attributes::Step, 0.1f) - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &Helpers::m_rulerSphereTrans, "Ruler Sphere Transparency", "Ruler Sphere Transparency") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) - ->Attribute(AZ::Edit::Attributes::Max, 100.0f); - - editContext->Class("Gizmo Viewport Preferences", "Gizmo Viewport Preferences") + editContext + ->Class("Manipulator Viewport Preferences", "Manipulator Viewport Preferences") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGizmo::m_axisGizmo, "Axis Gizmo", "Axis Gizmo") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGizmo::m_helpers, "Helpers", "Helpers"); + ->DataElement( + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportManipulator::m_manipulators, "Manipulators", "Manipulators"); } } -CEditorPreferencesPage_ViewportGizmo::CEditorPreferencesPage_ViewportGizmo() +CEditorPreferencesPage_ViewportManipulator::CEditorPreferencesPage_ViewportManipulator() { InitializeSettings(); m_icon = QIcon(":/res/Gizmos.svg"); } -QIcon& CEditorPreferencesPage_ViewportGizmo::GetIcon() +QIcon& CEditorPreferencesPage_ViewportManipulator::GetIcon() { return m_icon; } -void CEditorPreferencesPage_ViewportGizmo::OnApply() +void CEditorPreferencesPage_ViewportManipulator::OnApply() { - gSettings.gizmo.axisGizmoSize = m_axisGizmo.m_size; - gSettings.gizmo.axisGizmoText = m_axisGizmo.m_text; - gSettings.gizmo.axisGizmoMaxCount = m_axisGizmo.m_maxCount; - - gSettings.gizmo.helpersScale = m_helpers.m_helpersGlobalScale; - gSettings.gizmo.tagpointScaleMulti = m_helpers.m_tagpointScaleMulti; - gSettings.gizmo.rulerSphereScale = m_helpers.m_rulerSphereScale; - gSettings.gizmo.rulerSphereTrans = m_helpers.m_rulerSphereTrans; + SandboxEditor::SetManipulatorLineBoundWidth(m_manipulators.m_manipulatorLineBoundWidth); } -void CEditorPreferencesPage_ViewportGizmo::InitializeSettings() +void CEditorPreferencesPage_ViewportManipulator::InitializeSettings() { - m_axisGizmo.m_size = gSettings.gizmo.axisGizmoSize; - m_axisGizmo.m_text = gSettings.gizmo.axisGizmoText; - m_axisGizmo.m_maxCount = gSettings.gizmo.axisGizmoMaxCount; - - m_helpers.m_helpersGlobalScale = gSettings.gizmo.helpersScale; - m_helpers.m_tagpointScaleMulti = gSettings.gizmo.tagpointScaleMulti; - m_helpers.m_rulerSphereScale = gSettings.gizmo.rulerSphereScale; - m_helpers.m_rulerSphereTrans = gSettings.gizmo.rulerSphereTrans; + m_manipulators.m_manipulatorLineBoundWidth = SandboxEditor::ManipulatorLineBoundWidth(); } diff --git a/Code/Editor/EditorPreferencesPageViewportGizmo.h b/Code/Editor/EditorPreferencesPageViewportGizmo.h index 1534e5f51e..d013216736 100644 --- a/Code/Editor/EditorPreferencesPageViewportGizmo.h +++ b/Code/Editor/EditorPreferencesPageViewportGizmo.h @@ -5,59 +5,57 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once #include "Include/IPreferencesPage.h" -#include -#include -#include #include +#include +#include +#include #include - -class CEditorPreferencesPage_ViewportGizmo - : public IPreferencesPage +class CEditorPreferencesPage_ViewportManipulator : public IPreferencesPage { public: - AZ_RTTI(CEditorPreferencesPage_ViewportGizmo, "{14433511-8175-4348-954E-82D903475B06}", IPreferencesPage) + AZ_RTTI(CEditorPreferencesPage_ViewportManipulator, "{14433511-8175-4348-954E-82D903475B06}", IPreferencesPage) static void Reflect(AZ::SerializeContext& serialize); - CEditorPreferencesPage_ViewportGizmo(); - virtual ~CEditorPreferencesPage_ViewportGizmo() = default; + CEditorPreferencesPage_ViewportManipulator(); + virtual ~CEditorPreferencesPage_ViewportManipulator() = default; + + virtual const char* GetCategory() override + { + return "Viewports"; + } + + virtual const char* GetTitle() override + { + return "Manipulators"; + } - virtual const char* GetCategory() override { return "Viewports"; } - virtual const char* GetTitle() override { return "Gizmos"; } virtual QIcon& GetIcon() override; virtual void OnApply() override; - virtual void OnCancel() override {} - virtual bool OnQueryCancel() override { return true; } + virtual void OnCancel() override + { + } + + virtual bool OnQueryCancel() override + { + return true; + } private: void InitializeSettings(); - struct AxisGizmo + struct Manipulators { - AZ_TYPE_INFO(AxisGizmo, "{7D90D60E-996B-4F54-8748-B26EFA781EE2}") + AZ_TYPE_INFO(Manipulators, "{2974439C-4839-41F6-B526-F317999B9DB9}") - float m_size; - bool m_text; - int m_maxCount; + float m_manipulatorLineBoundWidth; }; - struct Helpers - { - AZ_TYPE_INFO(Helpers, "{EC99922E-F61C-4AA0-9A51-630E09AB55AA}") - - float m_helpersGlobalScale; - float m_tagpointScaleMulti; - float m_rulerSphereScale; - float m_rulerSphereTrans; - }; - - AxisGizmo m_axisGizmo; - Helpers m_helpers; + Manipulators m_manipulators; QIcon m_icon; }; - - diff --git a/Code/Editor/EditorViewportSettings.cpp b/Code/Editor/EditorViewportSettings.cpp index 872454412d..52581d9222 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -20,6 +20,7 @@ namespace SandboxEditor constexpr AZStd::string_view AngleSnappingSetting = "/Amazon/Preferences/Editor/AngleSnapping"; constexpr AZStd::string_view AngleSizeSetting = "/Amazon/Preferences/Editor/AngleSize"; constexpr AZStd::string_view ShowGridSetting = "/Amazon/Preferences/Editor/ShowGrid"; + constexpr AZStd::string_view ManipulatorLineBoundWidthSetting = "/Amazon/Preferences/Editor/Manipulator/LineBoundWidth"; constexpr AZStd::string_view CameraTranslateSpeedSetting = "/Amazon/Preferences/Editor/Camera/TranslateSpeed"; constexpr AZStd::string_view CameraBoostMultiplierSetting = "/Amazon/Preferences/Editor/Camera/BoostMultiplier"; constexpr AZStd::string_view CameraRotateSpeedSetting = "/Amazon/Preferences/Editor/Camera/RotateSpeed"; @@ -156,6 +157,16 @@ namespace SandboxEditor SetRegistry(ShowGridSetting, showing); } + float ManipulatorLineBoundWidth() + { + return aznumeric_cast(GetRegistry(ManipulatorLineBoundWidthSetting, 0.1)); + } + + void SetManipulatorLineBoundWidth(const float lineBoundWidth) + { + SetRegistry(ManipulatorLineBoundWidthSetting, lineBoundWidth); + } + float CameraTranslateSpeed() { return aznumeric_cast(GetRegistry(CameraTranslateSpeedSetting, 10.0)); diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index 3da8c465fb..a5b119e03d 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -47,6 +47,9 @@ namespace SandboxEditor SANDBOX_API bool ShowingGrid(); SANDBOX_API void SetShowingGrid(bool showing); + SANDBOX_API float ManipulatorLineBoundWidth(); + SANDBOX_API void SetManipulatorLineBoundWidth(float lineBoundWidth); + SANDBOX_API float CameraTranslateSpeed(); SANDBOX_API void SetCameraTranslateSpeed(float speed); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 5294ebbc7e..139bb03f12 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -121,6 +121,7 @@ struct EditorViewportSettings : public AzToolsFramework::ViewportInteraction::Vi bool ShowGrid() const override; bool AngleSnappingEnabled() const override; float AngleStep() const override; + float ManipulatorLineBoundWidth() const override; }; static const EditorViewportSettings g_EditorViewportSettings; @@ -2559,6 +2560,11 @@ float EditorViewportSettings::AngleStep() const return SandboxEditor::AngleSnappingSize(); } +float EditorViewportSettings::ManipulatorLineBoundWidth() const +{ + return SandboxEditor::ManipulatorLineBoundWidth(); +} + AZ_CVAR_EXTERNED(bool, ed_previewGameInFullscreen_once); bool EditorViewportWidget::ShouldPreviewFullscreen() const diff --git a/Code/Editor/IEditorImpl.cpp b/Code/Editor/IEditorImpl.cpp index 880773966b..c7e6cd8ad6 100644 --- a/Code/Editor/IEditorImpl.cpp +++ b/Code/Editor/IEditorImpl.cpp @@ -680,8 +680,8 @@ const SGizmoParameters& CEditorImpl::GetGlobalGizmoParameters() m_pGizmoParameters->axisConstraint = m_selectedAxis; m_pGizmoParameters->referenceCoordSys = m_refCoordsSys; - m_pGizmoParameters->axisGizmoScale = gSettings.gizmo.axisGizmoSize; - m_pGizmoParameters->axisGizmoText = gSettings.gizmo.axisGizmoText; + m_pGizmoParameters->axisGizmoScale = 1.0f; + m_pGizmoParameters->axisGizmoText = false; return *m_pGizmoParameters; } diff --git a/Code/Editor/Objects/ObjectManager.cpp b/Code/Editor/Objects/ObjectManager.cpp index 9c452ac1ad..30ee1fc57b 100644 --- a/Code/Editor/Objects/ObjectManager.cpp +++ b/Code/Editor/Objects/ObjectManager.cpp @@ -2378,7 +2378,7 @@ void CObjectManager::SetObjectSelected(CBaseObject* pObject, bool bSelect) if (bSelect && !GetIEditor()->GetTransformManipulator()) { - if (CAxisGizmo::GetGlobalAxisGizmoCount() < gSettings.gizmo.axisGizmoMaxCount) + if (CAxisGizmo::GetGlobalAxisGizmoCount() < 1 /*legacy axisGizmoMaxCount*/) { // Create axis gizmo for this object. m_gizmoManager->AddGizmo(new CAxisGizmo(pObject)); diff --git a/Code/Editor/PreferencesStdPages.cpp b/Code/Editor/PreferencesStdPages.cpp index b593541a07..012a29368e 100644 --- a/Code/Editor/PreferencesStdPages.cpp +++ b/Code/Editor/PreferencesStdPages.cpp @@ -36,7 +36,7 @@ CStdPreferencesClassDesc::CStdPreferencesClassDesc() [](){ return new CEditorPreferencesPage_Files(); }, [](){ return new CEditorPreferencesPage_ViewportGeneral(); }, [](){ return new CEditorPreferencesPage_ViewportMovement(); }, - [](){ return new CEditorPreferencesPage_ViewportGizmo(); }, + [](){ return new CEditorPreferencesPage_ViewportManipulator(); }, [](){ return new CEditorPreferencesPage_ViewportDebug(); } }; diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 94b5668efc..9feb73a811 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -82,7 +82,6 @@ private: namespace { - class QtApplicationListener : public AzToolsFramework::EditorEvents::Bus::Handler { @@ -99,20 +98,8 @@ namespace delete this; } }; - } -////////////////////////////////////////////////////////////////////////// -SGizmoSettings::SGizmoSettings() -{ - axisGizmoSize = 0.2f; - axisGizmoText = true; - axisGizmoMaxCount = 50; - helpersScale = 1.f; - tagpointScaleMulti = 0.5f; - rulerSphereScale = 0.5f; - rulerSphereTrans = 0.5f; -} ////////////////////////////////////////////////////////////////////////// SEditorSettings::SEditorSettings() { @@ -564,18 +551,6 @@ void SEditorSettings::Save() SaveValue("Settings", "ShowScaleWarnings", viewports.bShowScaleWarnings); SaveValue("Settings", "ShowRotationWarnings", viewports.bShowRotationWarnings); - ////////////////////////////////////////////////////////////////////////// - // Gizmos. - ////////////////////////////////////////////////////////////////////////// - SaveValue("Settings", "AxisGizmoSize", gizmo.axisGizmoSize); - SaveValue("Settings", "AxisGizmoText", gizmo.axisGizmoText); - SaveValue("Settings", "AxisGizmoMaxCount", gizmo.axisGizmoMaxCount); - SaveValue("Settings", "HelpersScale", gizmo.helpersScale); - SaveValue("Settings", "TagPointScaleMulti", gizmo.tagpointScaleMulti); - SaveValue("Settings", "RulerSphereScale", gizmo.rulerSphereScale); - SaveValue("Settings", "RulerSphereTrans", gizmo.rulerSphereTrans); - ////////////////////////////////////////////////////////////////////////// - SaveValue("Settings", "TextEditorScript", textEditorForScript); SaveValue("Settings", "TextEditorShaders", textEditorForShaders); SaveValue("Settings", "TextEditorBSpaces", textEditorForBspaces); @@ -769,18 +744,6 @@ void SEditorSettings::Load() LoadValue("Settings", "ShowScaleWarnings", viewports.bShowScaleWarnings); LoadValue("Settings", "ShowRotationWarnings", viewports.bShowRotationWarnings); - ////////////////////////////////////////////////////////////////////////// - // Gizmos. - ////////////////////////////////////////////////////////////////////////// - LoadValue("Settings", "AxisGizmoSize", gizmo.axisGizmoSize); - LoadValue("Settings", "AxisGizmoText", gizmo.axisGizmoText); - LoadValue("Settings", "AxisGizmoMaxCount", gizmo.axisGizmoMaxCount); - LoadValue("Settings", "HelpersScale", gizmo.helpersScale); - LoadValue("Settings", "TagPointScaleMulti", gizmo.tagpointScaleMulti); - LoadValue("Settings", "RulerSphereScale", gizmo.rulerSphereScale); - LoadValue("Settings", "RulerSphereTrans", gizmo.rulerSphereTrans); - ////////////////////////////////////////////////////////////////////////// - LoadValue("Settings", "TextEditorScript", textEditorForScript); LoadValue("Settings", "TextEditorShaders", textEditorForShaders); LoadValue("Settings", "TextEditorBSpaces", textEditorForBspaces); diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index 51931ab955..82f4f11f72 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -22,22 +22,6 @@ #include -struct SGizmoSettings -{ - float axisGizmoSize; - bool axisGizmoText; - int axisGizmoMaxCount; - - float helpersScale; - float tagpointScaleMulti; - - // Scale size and transparency for debug spheres when using Ruler tool - float rulerSphereScale; - float rulerSphereTrans; - - SGizmoSettings(); -}; - ////////////////////////////////////////////////////////////////////////// // Settings for snapping in the viewports. ////////////////////////////////////////////////////////////////////////// @@ -381,8 +365,6 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING //! Keeps the editor active even if no focus is set int keepEditorActive; - SGizmoSettings gizmo; - // Settings of the snapping. SSnapSettings snap; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index 391186114d..5e8de066e3 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -40,11 +40,13 @@ namespace AzManipulatorTestFramework float DeviceScalingFactor() override; private: // ViewportInteractionRequestBus ... - bool GridSnappingEnabled(); - float GridSize(); - bool ShowGrid(); - bool AngleSnappingEnabled(); - float AngleStep(); + bool GridSnappingEnabled() override; + float GridSize() override; + bool ShowGrid() override; + bool AngleSnappingEnabled() override; + float AngleStep() override; + float ManipulatorLineBoundWidth() override; + AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition); private: AZStd::unique_ptr m_nullDebugDisplayRequests; diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 52d2c10286..77c4bb72f7 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -62,6 +62,11 @@ namespace AzManipulatorTestFramework return m_angularStep; } + float ViewportInteraction::ManipulatorLineBoundWidth() + { + return 0.1f; + } + AzFramework::ScreenPoint ViewportInteraction::ViewportWorldToScreen(const AZ::Vector3& worldPosition) { return AzFramework::WorldToScreen(worldPosition, m_cameraState); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp index 81f573672b..b74d81e9fc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp @@ -226,6 +226,8 @@ namespace AzToolsFramework m_translationManipulator = AZStd::make_shared>( Dimensions(), vertexIndex, vertex, WorldFromLocalWithUniformScale(entityComponentIdPair.GetEntityId()), GetNonUniformScale(entityComponentIdPair.GetEntityId())); + m_translationManipulator->m_manipulator.SetLineBoundWidth( + AzToolsFramework::ManipulatorLineBoundWidth(AzFramework::InvalidViewportId)); // setup how the manipulator should look m_manipulatorConfiguratorFn(&m_translationManipulator->m_manipulator); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp index 147b672006..07d4bf7517 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp @@ -8,6 +8,7 @@ #include "ManipulatorView.h" +#include #include #include #include @@ -22,6 +23,14 @@ #include #include +AZ_CVAR( + bool, + ed_manipulatorDisplayBoundDebug, + false, + nullptr, + AZ::ConsoleFunctorFlags::Null, + "Display additional debug drawing for manipulator bounds"); + namespace AzToolsFramework { const float g_defaultManipulatorSphereRadius = 0.1f; @@ -118,6 +127,14 @@ namespace AzToolsFramework return quadBound; } + // calculate line in world space (axis and length). + static AZStd::pair CalculateLine( + const AZ::Vector3& localPosition, const AZ::Transform& worldFromLocal, const AZ::Vector3& axis, const float length) + { + return { worldFromLocal.TransformPoint(localPosition), + TransformPositionNoScaling(worldFromLocal, localPosition + (axis * length)) }; + } + // calculate line bound in world space (axis and length). static Picking::BoundShapeLineSegment CalculateLineBound( const AZ::Vector3& localPosition, @@ -127,8 +144,9 @@ namespace AzToolsFramework const float width) { Picking::BoundShapeLineSegment lineBound; - lineBound.m_start = worldFromLocal.TransformPoint(localPosition); - lineBound.m_end = TransformPositionNoScaling(worldFromLocal, localPosition + (axis * length)); + const auto line = CalculateLine(localPosition, worldFromLocal, axis, length); + lineBound.m_start = line.first; + lineBound.m_end = line.second; lineBound.m_width = width; return lineBound; } @@ -395,13 +413,29 @@ namespace AzToolsFramework m_axis, m_cameraCorrectedAxis, managerState, mouseInteraction, manipulatorState.m_worldFromLocal, manipulatorState.m_localPosition, cameraState); - const Picking::BoundShapeLineSegment lineBound = CalculateLineBound( - manipulatorState.m_localPosition, manipulatorState.m_worldFromLocal, m_cameraCorrectedAxis, m_length * viewScale, - m_width * viewScale); + const auto worldLine = CalculateLine( + manipulatorState.m_localPosition, manipulatorState.m_worldFromLocal, m_cameraCorrectedAxis, m_length * viewScale); debugDisplay.SetColor(ViewColor(manipulatorState.m_mouseOver, m_color, m_mouseOverColor).GetAsVector4()); debugDisplay.SetLineWidth(defaultLineWidth(manipulatorState.m_mouseOver)); - debugDisplay.DrawLine(lineBound.m_start, lineBound.m_end); + debugDisplay.DrawLine(worldLine.first, worldLine.second); + + // ensure length of bound takes into account logical width of line (m_length - m_width) + const Picking::BoundShapeLineSegment lineBound = CalculateLineBound( + manipulatorState.m_localPosition, manipulatorState.m_worldFromLocal, m_cameraCorrectedAxis, (m_length - m_width) * viewScale, + m_width * viewScale); + + if (ed_manipulatorDisplayBoundDebug) + { + debugDisplay.DrawBall(lineBound.m_start, lineBound.m_width, false); + debugDisplay.DrawBall(lineBound.m_end, lineBound.m_width, false); + + const auto line = lineBound.m_end - lineBound.m_start; + const auto height = line.GetLength(); + const auto axis = line / height; + const auto center = lineBound.m_start + axis * height * 0.5f; + debugDisplay.DrawSolidCylinder(center, axis, lineBound.m_width, height, false); + } RefreshBoundInternal(managerId, manipulatorId, lineBound); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp index 08735a34a3..1867f346ec 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.cpp @@ -120,18 +120,18 @@ namespace AzToolsFramework const float axisLength, const AZ::Color& axis1Color, const AZ::Color& axis2Color, const AZ::Color& axis3Color) { const float boxSize = 0.1f; - const float lineWidth = 0.05f; - const AZ::Color colors[] = { axis1Color, axis2Color, axis3Color }; for (size_t manipulatorIndex = 0; manipulatorIndex < m_axisScaleManipulators.size(); ++manipulatorIndex) { + const auto lineLength = axisLength - boxSize; + ManipulatorViews views; views.emplace_back( - CreateManipulatorViewLine(*m_axisScaleManipulators[manipulatorIndex], colors[manipulatorIndex], axisLength, lineWidth)); + CreateManipulatorViewLine(*m_axisScaleManipulators[manipulatorIndex], colors[manipulatorIndex], axisLength, m_lineBoundWidth)); views.emplace_back(CreateManipulatorViewBox( AZ::Transform::CreateIdentity(), colors[manipulatorIndex], - m_axisScaleManipulators[manipulatorIndex]->GetAxis() * (axisLength - boxSize), AZ::Vector3(boxSize))); + m_axisScaleManipulators[manipulatorIndex]->GetAxis() * lineLength, AZ::Vector3(boxSize))); m_axisScaleManipulators[manipulatorIndex]->SetViews(AZStd::move(views)); } @@ -150,4 +150,9 @@ namespace AzToolsFramework manipulatorFn(m_uniformScaleManipulator.get()); } + + void ScaleManipulators::SetLineBoundWidth(const float lineBoundWidth) + { + m_lineBoundWidth = lineBoundWidth; + } } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.h index cca17a85e6..5a0a7676d5 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ScaleManipulators.h @@ -41,6 +41,9 @@ namespace AzToolsFramework void ConfigureView(float axisLength, const AZ::Color& axis1Color, const AZ::Color& axis2Color, const AZ::Color& axis3Color); + //! Sets the bound width to use for the line/axis of a linear manipulator. + void SetLineBoundWidth(float lineBoundWidth); + private: AZ_DISABLE_COPY_MOVE(ScaleManipulators) @@ -49,5 +52,6 @@ namespace AzToolsFramework AZStd::array, 3> m_axisScaleManipulators; AZStd::shared_ptr m_uniformScaleManipulator; + float m_lineBoundWidth = 0.01f; //!< The default line bound width for the linear manipulator axis. }; } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp index c5702bb249..049cab4a13 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.cpp @@ -235,24 +235,25 @@ namespace AzToolsFramework } void TranslationManipulators::ConfigureLinearView( - float axisLength, + const float axisLength, const AZ::Color& axis1Color, const AZ::Color& axis2Color, const AZ::Color& axis3Color /*= AZ::Color(0.0f, 0.0f, 1.0f, 0.5f)*/) { const float coneLength = 0.28f; const float coneRadius = 0.07f; - const float lineWidth = 0.05f; const AZ::Color axesColor[] = { axis1Color, axis2Color, axis3Color }; - const auto configureLinearView = - [lineWidth, coneLength, axisLength, coneRadius](LinearManipulator* linearManipulator, const AZ::Color& color) + const auto configureLinearView = [lineBoundWidth = m_lineBoundWidth, coneLength, axisLength, + coneRadius](LinearManipulator* linearManipulator, const AZ::Color& color) { + const auto lineLength = axisLength - coneLength; + ManipulatorViews views; - views.emplace_back(CreateManipulatorViewLine(*linearManipulator, color, axisLength, lineWidth)); - views.emplace_back(CreateManipulatorViewCone( - *linearManipulator, color, linearManipulator->GetAxis() * (axisLength - coneLength), coneLength, coneRadius)); + views.emplace_back(CreateManipulatorViewLine(*linearManipulator, color, lineLength, lineBoundWidth)); + views.emplace_back( + CreateManipulatorViewCone(*linearManipulator, color, linearManipulator->GetAxis() * lineLength, coneLength, coneRadius)); linearManipulator->SetViews(AZStd::move(views)); }; @@ -316,6 +317,11 @@ namespace AzToolsFramework } } + void TranslationManipulators::SetLineBoundWidth(const float lineBoundWidth) + { + m_lineBoundWidth = lineBoundWidth; + } + void ConfigureTranslationManipulatorAppearance3d(TranslationManipulators* translationManipulators) { translationManipulators->SetAxes(AZ::Vector3::CreateAxisX(), AZ::Vector3::CreateAxisY(), AZ::Vector3::CreateAxisZ()); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.h index 04d8e24ae6..65e53f0680 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/TranslationManipulators.h @@ -65,6 +65,9 @@ namespace AzToolsFramework void ConfigureSurfaceView(float radius, const AZ::Color& color); + //! Sets the bound width to use for the line/axis of a linear manipulator. + void SetLineBoundWidth(float lineBoundWidth); + private: AZ_DISABLE_COPY_MOVE(TranslationManipulators) @@ -76,6 +79,7 @@ namespace AzToolsFramework AZStd::vector> m_linearManipulators; AZStd::vector> m_planarManipulators; AZStd::shared_ptr m_surfaceManipulator = nullptr; + float m_lineBoundWidth = 0.01f; //!< The default line bound width for the linear manipulator axis. }; //! IndexedTranslationManipulator wraps a standard TranslationManipulators and allows it to be linked diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index f6ba87a0ec..5c2160b341 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -156,22 +156,24 @@ namespace AzToolsFramework class ViewportInteractionRequests { public: - //! Return the current camera state for this viewport. + //! Returns the current camera state for this viewport. virtual AzFramework::CameraState GetCameraState() = 0; - //! Return if grid snapping is enabled. + //! Returns if grid snapping is enabled. virtual bool GridSnappingEnabled() = 0; - //! Return the grid snapping size. + //! Returns the grid snapping size. virtual float GridSize() = 0; //! Does the grid currently want to be displayed. virtual bool ShowGrid() = 0; - //! Return if angle snapping is enabled. + //! Returns if angle snapping is enabled. virtual bool AngleSnappingEnabled() = 0; - //! Return the angle snapping/step size. + //! Returns the angle snapping/step size. virtual float AngleStep() = 0; - //! Transform a point in world space to screen space coordinates in Qt Widget space. + //! Returns the current line bound width for manipulators. + virtual float ManipulatorLineBoundWidth() = 0; + //! Transforms a point in world space to screen space coordinates in Qt Widget space. //! Multiply by DeviceScalingFactor to get the position in viewport pixel space. virtual AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition) = 0; - //! Transform a point from Qt widget screen space to world space based on the given clip space depth. + //! Transforms a point from Qt widget screen space to world space based on the given clip space depth. //! Depth specifies a relative camera depth to project in the range of [0.f, 1.f]. //! Returns the world space position if successful. virtual AZStd::optional ViewportScreenToWorld(const AzFramework::ScreenPoint& screenPosition, float depth) = 0; @@ -201,6 +203,8 @@ namespace AzToolsFramework virtual bool AngleSnappingEnabled() const = 0; //! Return the angle snapping/step size. virtual float AngleStep() const = 0; + //! Returns the current line bound width for manipulators. + virtual float ManipulatorLineBoundWidth() const = 0; }; //! Type to inherit to implement ViewportInteractionRequests. @@ -210,11 +214,15 @@ namespace AzToolsFramework class ViewportSettingNotifications { public: - virtual void OnGridSnappingChanged([[maybe_unused]] bool enabled) {} - virtual void OnDrawHelpersChanged([[maybe_unused]] bool enabled) {} + virtual void OnGridSnappingChanged([[maybe_unused]] bool enabled) + { + } + virtual void OnDrawHelpersChanged([[maybe_unused]] bool enabled) + { + } protected: - ViewportSettingNotifications() = default; + ~ViewportSettingNotifications() = default; }; using ViewportSettingsNotificationBus = AZ::EBus; @@ -336,4 +344,23 @@ namespace AzToolsFramework } return AzFramework::ClickDetector::ClickEvent::Nil; } + + //! Wrap EBus call to retrieve manipulator line bound width. + //! @note It is possible to pass AzFramework::InvalidViewportId to perform a Broadcast as opposed to a targeted Event. + inline float ManipulatorLineBoundWidth(AzFramework::ViewportId viewportId) + { + float lineBoundWidth = 0.0f; + if (viewportId != AzFramework::InvalidViewportId) + { + ViewportInteraction::ViewportInteractionRequestBus::EventResult( + lineBoundWidth, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::ManipulatorLineBoundWidth); + } + else + { + ViewportInteraction::ViewportInteractionRequestBus::BroadcastResult( + lineBoundWidth, &ViewportInteraction::ViewportInteractionRequestBus::Events::ManipulatorLineBoundWidth); + } + + return lineBoundWidth; + } } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index d315243697..fa263334fe 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -1249,6 +1249,7 @@ namespace AzToolsFramework AZStd::unique_ptr translationManipulators = AZStd::make_unique( TranslationManipulators::Dimensions::Three, AZ::Transform::CreateIdentity(), AZ::Vector3::CreateOne()); + translationManipulators->SetLineBoundWidth(ManipulatorLineBoundWidth(ViewportUi::DefaultViewportId)); InitializeManipulators(*translationManipulators); @@ -1545,6 +1546,7 @@ namespace AzToolsFramework AZ_PROFILE_FUNCTION(AzToolsFramework); AZStd::unique_ptr scaleManipulators = AZStd::make_unique(AZ::Transform::CreateIdentity()); + scaleManipulators->SetLineBoundWidth(ManipulatorLineBoundWidth(ViewportUi::DefaultViewportId)); InitializeManipulators(*scaleManipulators); diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 62e2f834c8..4e2afbf056 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -97,6 +97,7 @@ namespace AtomToolsFramework bool ShowGrid() override; bool AngleSnappingEnabled() override; float AngleStep() override; + float ManipulatorLineBoundWidth() override; AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition) override; AZStd::optional ViewportScreenToWorld(const AzFramework::ScreenPoint& screenPosition, float depth) override; AZStd::optional ViewportScreenToWorldRay( diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp index cbb30ba6da..bf3b00f8ba 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp @@ -340,6 +340,11 @@ namespace AtomToolsFramework return m_viewportSettings ? m_viewportSettings->AngleStep() : 0.0f; } + float RenderViewportWidget::ManipulatorLineBoundWidth() + { + return m_viewportSettings ? m_viewportSettings->ManipulatorLineBoundWidth() : 0.1f; + } + void RenderViewportWidget::SetViewportSettings(const AzToolsFramework::ViewportInteraction::ViewportSettings* viewportSettings) { m_viewportSettings = viewportSettings; diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp index c26c0562eb..efde4df9d1 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp @@ -121,13 +121,12 @@ namespace LmbrCentral m_heightManipulator->SetAxis(AZ::Vector3::CreateAxisZ()); const float lineLength = 0.5f; - const float lineWidth = 0.05f; const float coneLength = 0.28f; const float coneRadius = 0.07f; ManipulatorViews views; views.emplace_back(CreateManipulatorViewLine( *m_heightManipulator, AZ::Color(0.0f, 0.0f, 1.0f, 1.0f), - lineLength, lineWidth)); + lineLength, AzToolsFramework::ManipulatorLineBoundWidth(AzFramework::InvalidViewportId))); views.emplace_back(CreateManipulatorViewCone(*m_heightManipulator, AZ::Color(0.0f, 0.0f, 1.0f, 1.0f), m_heightManipulator->GetAxis() * (lineLength - coneLength), coneLength, coneRadius)); diff --git a/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp b/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp index 778fce1546..389deb078e 100644 --- a/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp +++ b/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp @@ -339,14 +339,13 @@ namespace PhysX { const float coneLength = 0.28f; const float coneRadius = 0.07f; - const float lineWidth = 0.05f; - const auto configureLinearView = [lineWidth, coneLength, axisLength, coneRadius]( + const auto configureLinearView = [coneLength, axisLength, coneRadius]( AzToolsFramework::LinearManipulator* linearManipulator, const AZ::Color& color) { AzToolsFramework::ManipulatorViews views; views.emplace_back(CreateManipulatorViewLine( - *linearManipulator, color, axisLength, lineWidth)); + *linearManipulator, color, axisLength, AzToolsFramework::ManipulatorLineBoundWidth(AzFramework::InvalidViewportId))); views.emplace_back(CreateManipulatorViewCone( *linearManipulator, color, linearManipulator->GetAxis() * (axisLength - coneLength), coneLength, coneRadius)); From bfdcf74ea05f8ec7566fff52a7c326212ba17810 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 09:10:47 -0700 Subject: [PATCH 112/355] PR comments/suggestions Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/3rdParty.cmake | 2 +- cmake/Platform/Common/Install_common.cmake | 40 ++++++++++++++-------- cmake/Platform/Linux/Install_linux.cmake | 4 ++- cmake/Platform/Mac/Install_mac.cmake | 16 ++++----- cmake/Projects.cmake | 18 +++++----- cmake/SettingsRegistry.cmake | 3 +- 6 files changed, 49 insertions(+), 34 deletions(-) diff --git a/cmake/3rdParty.cmake b/cmake/3rdParty.cmake index 4599c282f0..0142a6a4b6 100644 --- a/cmake/3rdParty.cmake +++ b/cmake/3rdParty.cmake @@ -305,7 +305,7 @@ endfunction() # \arg:3RDPARTY_ROOT_DIRECTORY custom 3rd party directory which needs to be installed function(ly_install_external_target 3RDPARTY_ROOT_DIRECTORY) - # Install the Find file to our /cmake directory + # Install the Find file to our /cmake/3rdParty directory ly_install_files(FILES ${CMAKE_CURRENT_LIST_FILE} DESTINATION cmake/3rdParty ) diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index fb46a475e2..9a0fbbd872 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -38,9 +38,6 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar # Get the target source directory relative to the LY root folder ly_get_engine_relative_source_dir(${absolute_target_source_dir} relative_target_source_dir) - # get the component ID. if the property isn't set for the target, it will auto fallback to use CMAKE_INSTALL_DEFAULT_COMPONENT_NAME - get_property(install_component TARGET ${TARGET_NAME} PROPERTY INSTALL_COMPONENT) - # All include directories marked PUBLIC or INTERFACE will be installed. We dont use PUBLIC_HEADER because in order to do that # we need to set the PUBLIC_HEADER property of the target for all the headers we are exporting. After doing that, installing the # headers end up in one folder instead of duplicating the folder structure of the public/interface include directory. @@ -69,7 +66,7 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar install(DIRECTORY ${include_directory} DESTINATION ${destination_dir} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} FILES_MATCHING PATTERN *.h PATTERN *.hpp @@ -108,13 +105,13 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar TARGETS ${TARGET_NAME} ARCHIVE DESTINATION ${archive_output_directory}/${PAL_PLATFORM_NAME}/$ - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} LIBRARY DESTINATION ${library_output_directory}/${PAL_PLATFORM_NAME}/$/${target_library_output_subdirectory} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} RUNTIME DESTINATION ${runtime_output_directory}/${PAL_PLATFORM_NAME}/$/${target_runtime_output_subdirectory} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) endif() @@ -271,7 +268,7 @@ set_property(TARGET ${NAME_PLACEHOLDER} file(GENERATE OUTPUT "${target_install_source_dir}/${NAME_PLACEHOLDER}_$.cmake" CONTENT "${target_file_contents}") install(FILES "${target_install_source_dir}/${NAME_PLACEHOLDER}_$.cmake" DESTINATION ${relative_target_source_dir} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) # Since a CMakeLists.txt could contain multiple targets, we generate it in a folder per target @@ -320,12 +317,9 @@ function(ly_setup_subdirectory absolute_target_source_dir) "${ENABLE_GEMS_PLACEHOLDER}" ) - # get the component ID. if the property isn't set for the directory, it will auto fallback to use CMAKE_INSTALL_DEFAULT_COMPONENT_NAME - get_property(install_component DIRECTORY ${absolute_target_source_dir} PROPERTY INSTALL_COMPONENT) - install(FILES "${target_install_source_dir}/CMakeLists.txt" DESTINATION ${relative_target_source_dir} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) endfunction() @@ -344,6 +338,7 @@ function(ly_setup_o3de_install) ${LY_ROOT_FOLDER}/LICENSE.txt ${LY_ROOT_FOLDER}/README.md DESTINATION . + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) endfunction() @@ -353,6 +348,7 @@ function(ly_setup_cmake_install) install(DIRECTORY "${LY_ROOT_FOLDER}/cmake" DESTINATION . + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} PATTERN "__pycache__" EXCLUDE REGEX "Findo3de.cmake" EXCLUDE REGEX "Platform\/.*\/BuiltInPackages_.*\.cmake" EXCLUDE @@ -380,6 +376,7 @@ function(ly_setup_cmake_install) "${LY_ROOT_FOLDER}/CMakeLists.txt" "${CMAKE_CURRENT_BINARY_DIR}/cmake/engine.json" DESTINATION . + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) # Collect all Find files that were added with ly_add_external_target_path @@ -400,9 +397,11 @@ function(ly_setup_cmake_install) endforeach() install(FILES ${additional_find_files} DESTINATION cmake/3rdParty + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) install(FILES ${additional_platform_files} DESTINATION cmake/3rdParty/Platform/${PAL_PLATFORM_NAME} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) # Findo3de.cmake file: we generate a different Findo3de.camke file than the one we have in cmake. This one is going to expose all @@ -419,6 +418,7 @@ function(ly_setup_cmake_install) configure_file(${LY_ROOT_FOLDER}/cmake/install/Findo3de.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake/Findo3de.cmake @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/Findo3de.cmake" DESTINATION cmake + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) # BuiltInPackage_.cmake: since associations could happen in any cmake file across the engine. We collect @@ -438,6 +438,7 @@ function(ly_setup_cmake_install) ) install(FILES "${pal_builtin_file}" DESTINATION cmake/3rdParty/Platform/${PAL_PLATFORM_NAME} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) endfunction() @@ -453,6 +454,7 @@ function(ly_setup_runtime_dependencies) "function(ly_copy source_file target_directory) file(COPY \"\${source_file}\" DESTINATION \"\${target_directory}\" FILE_PERMISSIONS ${LY_COPY_PERMISSIONS}) endfunction()" + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) endif() @@ -487,7 +489,9 @@ endfunction()" list(REMOVE_DUPLICATES runtime_commands) list(JOIN runtime_commands " " runtime_commands_str) # the spaces are just to see the right identation in the cmake_install.cmake file - install(CODE "${runtime_commands_str}") + install(CODE "${runtime_commands_str}" + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) endfunction() @@ -573,9 +577,15 @@ function(ly_setup_assets) cmake_path(SET gem_install_dest_dir .) endif() if(IS_DIRECTORY ${gem_absolute_path}) - install(DIRECTORY "${gem_absolute_path}" DESTINATION ${gem_install_dest_dir}) + install(DIRECTORY "${gem_absolute_path}" + DESTINATION ${gem_install_dest_dir} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) elseif (EXISTS ${gem_absolute_path}) - install(FILES ${gem_absolute_path} DESTINATION ${gem_install_dest_dir}) + install(FILES ${gem_absolute_path} + DESTINATION ${gem_install_dest_dir} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) endif() endforeach() diff --git a/cmake/Platform/Linux/Install_linux.cmake b/cmake/Platform/Linux/Install_linux.cmake index 87713fa5d6..dea26e5872 100644 --- a/cmake/Platform/Linux/Install_linux.cmake +++ b/cmake/Platform/Linux/Install_linux.cmake @@ -22,7 +22,9 @@ endfunction()]]) function(ly_install_code_function_override) string(CONFIGURE "${ly_copy_template}" ly_copy_function_linux @ONLY) - install(CODE "${ly_copy_function_linux}") + install(CODE "${ly_copy_function_linux}" + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) endfunction() include(cmake/Platform/Common/Install_common.cmake) diff --git a/cmake/Platform/Mac/Install_mac.cmake b/cmake/Platform/Mac/Install_mac.cmake index c7f22e9149..f3c2b31b31 100644 --- a/cmake/Platform/Mac/Install_mac.cmake +++ b/cmake/Platform/Mac/Install_mac.cmake @@ -42,8 +42,6 @@ function(ly_install_target_override) set(multiValueArgs) cmake_parse_arguments(ly_platform_install_target "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - get_property(install_component TARGET ${ly_platform_install_target_TARGET} PROPERTY INSTALL_COMPONENT) - # For bundles on Mac, we set the icons by passing in a path to the Images.xcassets directory. # However, the CMake install command expects paths to files for the the RESOURCE property. # More details can be found in the CMake issue: https://gitlab.kitware.com/cmake/cmake/-/issues/22409 @@ -57,19 +55,19 @@ function(ly_install_target_override) TARGETS ${ly_platform_install_target_TARGET} ARCHIVE DESTINATION ${ly_platform_install_target_ARCHIVE_DIR}/${PAL_PLATFORM_NAME}/$ - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} LIBRARY DESTINATION ${ly_platform_install_target_LIBRARY_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_LIBRARY_SUBDIR} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} RUNTIME DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_RUNTIME_SUBDIR} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} BUNDLE DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_RUNTIME_SUBDIR} - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} RESOURCE DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_RUNTIME_SUBDIR}/ - COMPONENT ${install_component} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) if (${is_bundle}) @@ -95,7 +93,9 @@ function(ly_install_code_function_override) endif() file(COPY \"\${source_file}\" DESTINATION \"\${target_directory}\" FILE_PERMISSIONS ${LY_COPY_PERMISSIONS}) -endfunction()") +endfunction()" + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) endfunction() diff --git a/cmake/Projects.cmake b/cmake/Projects.cmake index 627b31bc43..e70c8a4b14 100644 --- a/cmake/Projects.cmake +++ b/cmake/Projects.cmake @@ -145,17 +145,19 @@ foreach(project ${LY_PROJECTS}) # Generate pak for project in release installs cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory) - ly_install_run_code(" -if(\"\${CMAKE_INSTALL_CONFIG_NAME}\" MATCHES \"^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$\") - set(install_output_folder \"\${CMAKE_INSTALL_PREFIX}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/\${CMAKE_INSTALL_CONFIG_NAME}\") - message(STATUS \"Generating \${install_output_folder}/Engine.pak from ${full_directory_path}/Cache\") - file(ARCHIVE_CREATE OUTPUT \${install_output_folder}/Engine.pak - PATHS ${full_directory_path}/Cache + set(install_engine_pak_template [=[ +if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") + set(install_output_folder "${CMAKE_INSTALL_PREFIX}/@runtime_output_directory@/@PAL_PLATFORM_NAME@/${CMAKE_INSTALL_CONFIG_NAME}") + message(STATUS "Generating ${install_output_folder}/Engine.pak from @full_directory_path@/Cache") + file(ARCHIVE_CREATE OUTPUT ${install_output_folder}/Engine.pak + PATHS @full_directory_path@/Cache FORMAT zip ) - message(STATUS \"\${install_output_folder}/Engine.pak generated\") + message(STATUS "${install_output_folder}/Engine.pak generated") endif() -") +]=]) + string(CONFIGURE "${install_engine_pak_template}" install_engine_pak_code @ONLY) + ly_install_run_code("${install_engine_pak_code}") endforeach() diff --git a/cmake/SettingsRegistry.cmake b/cmake/SettingsRegistry.cmake index f84ecca334..c677aba7cf 100644 --- a/cmake/SettingsRegistry.cmake +++ b/cmake/SettingsRegistry.cmake @@ -120,6 +120,7 @@ endfunction() function(ly_delayed_generate_settings_registry) if(LY_MONOLITHIC_GAME) # No need to generate setregs for monolithic builds + set_property(GLOBAL PROPERTY LY_DELAYED_LOAD_DEPENDENCIES) # Clear out the load targets from the global load dependencies list return() endif() @@ -206,7 +207,7 @@ function(ly_delayed_generate_settings_registry) set_property(GLOBAL PROPERTY LY_DELAYED_LOAD_"${prefix_target}") endforeach() - # Clear out the load targets from the glboal load dependencies list + # Clear out the load targets from the global load dependencies list set_property(GLOBAL PROPERTY LY_DELAYED_LOAD_DEPENDENCIES) endfunction() From 2ca03367bb17c3438da679551350f21f66f23b45 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com> Date: Fri, 3 Sep 2021 18:32:15 +0200 Subject: [PATCH 113/355] Re-added removed xfails by accident (#3901) Co-authored-by: Garcia Ruiz --- .../Gem/PythonTests/editor/TestSuite_Sandbox_Optimized.py | 1 - .../gradient_signal/TestSuite_Periodic_Optimized.py | 1 + .../largeworlds/landscape_canvas/TestSuite_Main_Optimized.py | 3 ++- .../Gem/PythonTests/physics/TestSuite_Main_Optimized.py | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/editor/TestSuite_Sandbox_Optimized.py b/AutomatedTesting/Gem/PythonTests/editor/TestSuite_Sandbox_Optimized.py index d49e9e1c9b..4a472095ae 100644 --- a/AutomatedTesting/Gem/PythonTests/editor/TestSuite_Sandbox_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/editor/TestSuite_Sandbox_Optimized.py @@ -11,7 +11,6 @@ import pytest from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite -@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_sandbox @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py index 514504d324..f996a1f8c3 100644 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/gradient_signal/TestSuite_Periodic_Optimized.py @@ -10,6 +10,7 @@ import pytest from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite +@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_periodic @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py index 8c662a9b45..9cc572ad69 100644 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/landscape_canvas/TestSuite_Main_Optimized.py @@ -12,6 +12,7 @@ import ly_test_tools.environment.file_system as file_system from ly_test_tools.o3de.editor_test import EditorSingleTest, EditorSharedTest, EditorParallelTest, EditorTestSuite +@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_periodic @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) @@ -58,11 +59,11 @@ class TestAutomation(EditorTestSuite): from .EditorScripts import GraphClosed_TabbedGraph as test_module class test_LandscapeCanvas_Slice_CreateInstantiate(EditorSingleTest): + from .EditorScripts import Slice_CreateInstantiate as test_module # Custom teardown to remove slice asset created during test def teardown(self, request, workspace, editor, editor_test_results, launcher_platform): file_system.delete([os.path.join(workspace.paths.engine_root(), "AutomatedTesting", "slices", "TestSlice.slice")], True, True) - from .EditorScripts import Slice_CreateInstantiate as test_module class test_LandscapeCanvas_GradientModifierNodes_EntityCreatedOnNodeAdd(EditorSharedTest): from .EditorScripts import GradientModifierNodes_EntityCreatedOnNodeAdd as test_module diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py index ce68bb10b5..917952d880 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py @@ -54,6 +54,7 @@ class EditorSingleTest_WithFileOverrides(EditorSingleTest): fm._restore_file(f, file_list[f]) +@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) From 64a561a9485e8db773a81f89ea9aea2e65806215 Mon Sep 17 00:00:00 2001 From: "rgba16f [Amazon]" <82187279+rgba16f@users.noreply.github.com> Date: Fri, 3 Sep 2021 12:19:45 -0500 Subject: [PATCH 114/355] update revision of lz4 package used by o3de (#3911) * Update windows & android builtin lz4 package version Signed-off-by: rgba16f <82187279+rgba16f@users.noreply.github.com> * Update linux builtin packages to use the new lz4 vcpkg Signed-off-by: rgba16f <82187279+rgba16f@users.noreply.github.com> * Update Mac & iOS builtins to use the new lz4 vcpkg Signed-off-by: rgba16f <82187279+rgba16f@users.noreply.github.com> * Update MultiplayerCompression Gem LZ4Compressor to use the replacement for deprecated LZ4compressHC function Signed-off-by: rgba16f <82187279+rgba16f@users.noreply.github.com> --- .../MultiplayerCompression/Code/Source/LZ4Compressor.cpp | 9 +++++++-- .../Platform/Android/BuiltInPackages_android.cmake | 2 +- .../3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 2 +- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- .../Platform/Windows/BuiltInPackages_windows.cmake | 2 +- cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake | 2 +- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.cpp b/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.cpp index 351935d0bb..6bc5d0e3d0 100644 --- a/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.cpp +++ b/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.cpp @@ -56,11 +56,16 @@ namespace MultiplayerCompression AZ_Warning("Multiplayer Compressor", compDataSize >= compWorstCaseSize, "Outbuffer size (%lu B) passed to Compress() is less than estimated worst case (%lu B)", compDataSize, compWorstCaseSize); // Note that this returns a non-negative int so we are narrowing into a size_t here - compSize = LZ4_compressHC(reinterpret_cast(uncompData), reinterpret_cast(compData), static_cast(uncompSize)); + compSize = LZ4_compress_HC( + reinterpret_cast(uncompData), + reinterpret_cast(compData), + static_cast(uncompSize), + static_cast(compDataSize), + 0); if (compSize == 0) { - // LZ4_compressHC returns a zero value for corrupt data and insufficient buffer + // LZ4_compress_HC returns a zero value for corrupt data and insufficient buffer AZ_Warning("Multiplayer Compressor", false, "Compression failed for uncompSize:(%lu B) compDataSize:(%lu B) compSize:(%lu B)", uncompSize, compDataSize, compSize); return AzNetworking::CompressorError::CorruptData; } diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index cbdca10af9..fe03f2e7c9 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -11,7 +11,7 @@ ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-android TARGETS lz4 PACKAGE_HASH da8ec7736640a3e9834f6db1c69e8a0ea61c054fe8b6324509f36928cfc21dc9) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 0cbb799304..1e0de4f2ed 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -15,7 +15,7 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-linux TARGETS lz4 PACKAGE_HASH 2e2653ce04a036c38fe28f3971bc3bfb8a4e771335aa8d1b95b0feb3423f1b0a) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index e18bb07772..58c6849657 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -15,7 +15,7 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-mac TARGETS lz4 PACKAGE_HASH 3ce6866b43d024452c0412f385ae46aba0e1ae99eb64f7099d3fc539c8460881) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 305d1291e7..17792675d3 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -15,7 +15,7 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-windows TARGETS lz4 PACKAGE_HASH 02e6ba2ca1407483bac082fd97803c5e19f48bc576171bfc8cec62412efe639c) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index 0574f38654..f98f2009f2 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -11,7 +11,7 @@ ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-r128-multiplatform TARGETS lz4 PACKAGE_HASH d7b1d5651191db2c339827ad24f669d9d37754143e9173abc986184532f57c9d) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-ios TARGETS lz4 PACKAGE_HASH 7a9391daf53e47e529cf811dca3554c83769f62a2ee52488610ec73214961ae1) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) From e8495cf8290c813aab7165bc84c32d9dbeabcfe9 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 11:11:04 -0700 Subject: [PATCH 115/355] adds equivalent warnign for windows Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/MSVC/Configurations_msvc.cmake | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index 647ced54a2..237db5a2ce 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -41,12 +41,14 @@ ly_append_configurations_options( # Enabling warnings that are disabled by default from /W4 # https://docs.microsoft.com/en-us/cpp/preprocessor/compiler-warnings-that-are-off-by-default?view=vs-2019 /we4296 # 'operator': expression is always false - /we5233 # explicit lambda capture 'identifier' is not used /we4426 # optimization flags changed after including header, may be due to #pragma optimize() #/we4619 # #pragma warning: there is no warning number 'number'. Unfortunately some versions of MSVC 16.X dont filter this warning coming from external headers and Qt has a bad warning in QtCore/qvector.h(340,12) + /we4774 # 'string' : format string expected in argument number is not a string literal /we4777 # 'function' : format string 'string' requires an argument of type 'type1', but variadic argument number has type 'type2 /we5031 # #pragma warning(pop): likely mismatch, popping warning state pushed in different file /we5032 # detected #pragma warning(push) with no corresponding #pragma warning(pop) + /we5233 # explicit lambda capture 'identifier' is not used + /Zc:forScope # Force Conformance in for Loop Scope /diagnostics:caret # Compiler diagnostic options: includes the column where the issue was found and places a caret (^) under the location in the line of code where the issue was detected. From 6773af91bcbd7a871ebcc882d126c64e2c5e044c Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 11:11:28 -0700 Subject: [PATCH 116/355] fixes windows warnings Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../TrackView/SequenceBatchRenderDialog.cpp | 3 +- Code/Editor/Util/ImageASC.cpp | 2 +- Code/Editor/Util/ImageUtil.cpp | 2 +- .../AzFramework/Logging/LogFile.cpp | 20 ++++- Code/LauncherUnified/Launcher.cpp | 18 +++- Code/Legacy/CrySystem/SystemInit.cpp | 89 ------------------- .../AssetMemoryAnalyzerSystemComponent.cpp | 7 +- .../ImGui/v1.82/imgui/imgui_widgets.cpp | 1 + 8 files changed, 37 insertions(+), 105 deletions(-) diff --git a/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp b/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp index 33f1b0d441..b510315995 100644 --- a/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp +++ b/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp @@ -719,8 +719,7 @@ bool CSequenceBatchRenderDialog::GetResolutionFromCustomResText(const char* cust int scannedWidth = retCustomWidth; // initialize with default fall-back values - they'll be overwritten in the case of a succesful sscanf below. int scannedHeight = retCustomHeight; - QString strFormat = QString::fromLatin1(customResFormat).replace(QRegularExpression(QStringLiteral("%\\d")), QStringLiteral("%d")); - scanSuccess = (azsscanf(customResText, strFormat.toStdString().c_str(), &scannedWidth, &scannedHeight) == 2); + scanSuccess = (azsscanf(customResText, "Custom(%d x %d)...", &scannedWidth, &scannedHeight) == 2); if (scanSuccess) { retCustomWidth = scannedWidth; diff --git a/Code/Editor/Util/ImageASC.cpp b/Code/Editor/Util/ImageASC.cpp index a72ea8b9fd..1c4a8acf73 100644 --- a/Code/Editor/Util/ImageASC.cpp +++ b/Code/Editor/Util/ImageASC.cpp @@ -52,7 +52,7 @@ bool CImageASC::Save(const QString& fileName, const CFloatImage& image) } // First print the file header - fprintf(file, fileHeader.c_str()); + fprintf(file, "%s", fileHeader.c_str()); // Then print all the pixels. for (uint32 y = 0; y < height; y++) diff --git a/Code/Editor/Util/ImageUtil.cpp b/Code/Editor/Util/ImageUtil.cpp index c8432a3d1a..45d39f1f02 100644 --- a/Code/Editor/Util/ImageUtil.cpp +++ b/Code/Editor/Util/ImageUtil.cpp @@ -103,7 +103,7 @@ bool CImageUtil::SavePGM(const QString& fileName, const CImageEx& image) } // First print the file header - fprintf(file, fileHeader.c_str()); + fprintf(file, "%s", fileHeader.c_str()); // Then print all the pixels. for (uint32 y = 0; y < height; y++) diff --git a/Code/Framework/AzFramework/AzFramework/Logging/LogFile.cpp b/Code/Framework/AzFramework/AzFramework/Logging/LogFile.cpp index 506d4a8861..bd9b52fa86 100644 --- a/Code/Framework/AzFramework/AzFramework/Logging/LogFile.cpp +++ b/Code/Framework/AzFramework/AzFramework/Logging/LogFile.cpp @@ -311,7 +311,6 @@ namespace AzFramework // On some platforms, threadid is just a number but on other platforms it is a pointer of some kind // uintptr_t will ensure that the data will always fit uintptr_t threadID = threadId ? threadId : (uintptr_t)(AZStd::this_thread::get_id().m_id); - const char* printFormatter = m_machineReadable ? "~~%p~~%s~~" : "{%p}[%14s]"; // while it may be tempting to check the fileio Pointer here, any emit of any warning or error would be fatal // since we're already logging, and we don't want to log while you log. @@ -331,7 +330,14 @@ namespace AzFramework azsnprintf(buffer, 80, "~~%llu~~%i", rawTime, severity); m_fileIO->Write(m_fileHandle, buffer, strlen(buffer)); - azsnprintf(buffer, 80, printFormatter, threadID, categoryActual); + if (m_machineReadable) // Branching instead of using a ternary on the format string to avoid warning 4774 (format literal expected) + { + azsnprintf(buffer, 80, "~~%p~~%s~~", reinterpret_cast(threadID), categoryActual); + } + else + { + azsnprintf(buffer, 80, "{%p}[%14s]", reinterpret_cast(threadID), categoryActual); + } m_fileIO->Write(m_fileHandle, buffer, strlen(buffer)); m_fileIO->Write(m_fileHandle, dataSource, dataLength); @@ -349,8 +355,14 @@ namespace AzFramework { return; } - - azsnprintf(categorybuffer, 64, printFormatter, threadID, categoryActual); + if (m_machineReadable) // Branching instead of using a ternary on the format string to avoid warning 4774 (format literal expected) + { + azsnprintf(categorybuffer, 64, "~~%p~~%s~~", reinterpret_cast(threadID), categoryActual); + } + else + { + azsnprintf(categorybuffer, 64, "{%p}[%14s]", reinterpret_cast(threadID), categoryActual); + } if ((category) && (categoryLen)) { diff --git a/Code/LauncherUnified/Launcher.cpp b/Code/LauncherUnified/Launcher.cpp index 07da69cbe9..f5da40ccad 100644 --- a/Code/LauncherUnified/Launcher.cpp +++ b/Code/LauncherUnified/Launcher.cpp @@ -305,10 +305,20 @@ namespace O3DELauncher m_commandLine[m_commandLineLen++] = ' '; } - azsnprintf(m_commandLine + m_commandLineLen, - AZ_COMMAND_LINE_LEN - m_commandLineLen, - needsQuote ? "\"%s\"" : "%s", - arg); + if (needsQuote) // Branching instead of using a ternary on the format string to avoid warning 4774 (format literal expected) + { + azsnprintf(m_commandLine + m_commandLineLen, + AZ_COMMAND_LINE_LEN - m_commandLineLen, + "\"%s\"", + arg); + } + else + { + azsnprintf(m_commandLine + m_commandLineLen, + AZ_COMMAND_LINE_LEN - m_commandLineLen, + "%s", + arg); + } // Inject the argument in the argument buffer to preserve/replicate argC and argV azstrncpy(&m_commandLineArgBuffer[m_nextCommandLineArgInsertPoint], diff --git a/Code/Legacy/CrySystem/SystemInit.cpp b/Code/Legacy/CrySystem/SystemInit.cpp index d5efff2748..81d4ee5730 100644 --- a/Code/Legacy/CrySystem/SystemInit.cpp +++ b/Code/Legacy/CrySystem/SystemInit.cpp @@ -516,95 +516,6 @@ void CSystem::ShutdownModuleLibraries() #endif // !defined(AZ_MONOLITHIC_BUILD) } -///////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////// - -#if defined(WIN32) || defined(WIN64) -AZStd::wstring GetErrorStringUnsupportedGPU(const char* gpuName, unsigned int gpuVendorId, unsigned int gpuDeviceId) -{ - const size_t fullLangID = (size_t) GetKeyboardLayout(0); - const size_t primLangID = fullLangID & 0x3FF; - - const wchar_t* pFmt = L"Unsupported video card detected! Continuing to run might lead to unexpected results or crashes. " - L"Please check the manual for further information on hardware requirements.\n\n\"%S\" [vendor id = 0x%.4x, device id = 0x%.4x]"; - - switch (primLangID) - { - case 0x04: // Chinese - { - static const wchar_t fmt[] = {0x5075, 0x6E2C, 0x5230, 0x4E0D, 0x652F, 0x63F4, 0x7684, 0x986F, 0x793A, 0x5361, 0xFF01, 0x7E7C, 0x7E8C, 0x57F7, 0x884C, 0x53EF, 0x80FD, 0x5C0E, 0x81F4, 0x7121, 0x6CD5, 0x9810, 0x671F, 0x7684, 0x7D50, 0x679C, 0x6216, 0x7576, 0x6A5F, 0x3002, 0x8ACB, 0x6AA2, 0x67E5, 0x8AAA, 0x660E, 0x66F8, 0x4E0A, 0x7684, 0x786C, 0x9AD4, 0x9700, 0x6C42, 0x4EE5, 0x53D6, 0x5F97, 0x66F4, 0x591A, 0x76F8, 0x95DC, 0x8CC7, 0x8A0A, 0x3002, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x5EE0, 0x5546, 0x7DE8, 0x865F, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x88DD, 0x7F6E, 0x7DE8, 0x865F, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x05: // Czech - { - static const wchar_t fmt[] = {0x0042, 0x0079, 0x006C, 0x0061, 0x0020, 0x0064, 0x0065, 0x0074, 0x0065, 0x006B, 0x006F, 0x0076, 0x00E1, 0x006E, 0x0061, 0x0020, 0x0067, 0x0072, 0x0061, 0x0066, 0x0069, 0x0063, 0x006B, 0x00E1, 0x0020, 0x006B, 0x0061, 0x0072, 0x0074, 0x0061, 0x002C, 0x0020, 0x006B, 0x0074, 0x0065, 0x0072, 0x00E1, 0x0020, 0x006E, 0x0065, 0x006E, 0x00ED, 0x0020, 0x0070, 0x006F, 0x0064, 0x0070, 0x006F, 0x0072, 0x006F, 0x0076, 0x00E1, 0x006E, 0x0061, 0x002E, 0x0020, 0x0050, 0x006F, 0x006B, 0x0072, 0x0061, 0x010D, 0x006F, 0x0076, 0x00E1, 0x006E, 0x00ED, 0x0020, 0x006D, 0x016F, 0x017E, 0x0065, 0x0020, 0x0076, 0x00E9, 0x0073, 0x0074, 0x0020, 0x006B, 0x0065, 0x0020, 0x006B, 0x0072, 0x0069, 0x0074, 0x0069, 0x0063, 0x006B, 0x00FD, 0x006D, 0x0020, 0x0063, 0x0068, 0x0079, 0x0062, 0x00E1, 0x006D, 0x0020, 0x006E, 0x0065, 0x0062, 0x006F, 0x0020, 0x006E, 0x0065, 0x0073, 0x0074, 0x0061, 0x0062, 0x0069, 0x006C, 0x0069, 0x0074, 0x011B, 0x0020, 0x0073, 0x0079, 0x0073, 0x0074, 0x00E9, 0x006D, 0x0075, 0x002E, 0x0020, 0x0050, 0x0159, 0x0065, 0x010D, 0x0074, 0x011B, 0x0074, 0x0065, 0x0020, 0x0073, 0x0069, 0x0020, 0x0070, 0x0072, 0x006F, 0x0073, 0x00ED, 0x006D, 0x0020, 0x0075, 0x017E, 0x0069, 0x0076, 0x0061, 0x0074, 0x0065, 0x006C, 0x0073, 0x006B, 0x006F, 0x0075, 0x0020, 0x0070, 0x0159, 0x00ED, 0x0072, 0x0075, 0x010D, 0x006B, 0x0075, 0x0020, 0x0070, 0x0072, 0x006F, 0x0020, 0x0070, 0x006F, 0x0064, 0x0072, 0x006F, 0x0062, 0x006E, 0x00E9, 0x0020, 0x0069, 0x006E, 0x0066, 0x006F, 0x0072, 0x006D, 0x0061, 0x0063, 0x0065, 0x0020, 0x006F, 0x0020, 0x0073, 0x0079, 0x0073, 0x0074, 0x00E9, 0x006D, 0x006F, 0x0076, 0x00FD, 0x0063, 0x0068, 0x0020, 0x0070, 0x006F, 0x017E, 0x0061, 0x0064, 0x0061, 0x0076, 0x0063, 0x00ED, 0x0063, 0x0068, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x07: // German - { - static const wchar_t fmt[] = {0x004E, 0x0069, 0x0063, 0x0068, 0x0074, 0x002D, 0x0075, 0x006E, 0x0074, 0x0065, 0x0072, 0x0073, 0x0074, 0x00FC, 0x0074, 0x007A, 0x0074, 0x0065, 0x0020, 0x0056, 0x0069, 0x0064, 0x0065, 0x006F, 0x006B, 0x0061, 0x0072, 0x0074, 0x0065, 0x0020, 0x0067, 0x0065, 0x0066, 0x0075, 0x006E, 0x0064, 0x0065, 0x006E, 0x0021, 0x0020, 0x0046, 0x006F, 0x0072, 0x0074, 0x0066, 0x0061, 0x0068, 0x0072, 0x0065, 0x006E, 0x0020, 0x006B, 0x0061, 0x006E, 0x006E, 0x0020, 0x007A, 0x0075, 0x0020, 0x0075, 0x006E, 0x0065, 0x0072, 0x0077, 0x0061, 0x0072, 0x0074, 0x0065, 0x0074, 0x0065, 0x006E, 0x0020, 0x0045, 0x0072, 0x0067, 0x0065, 0x0062, 0x006E, 0x0069, 0x0073, 0x0073, 0x0065, 0x006E, 0x0020, 0x006F, 0x0064, 0x0065, 0x0072, 0x0020, 0x0041, 0x0062, 0x0073, 0x0074, 0x00FC, 0x0072, 0x007A, 0x0065, 0x006E, 0x0020, 0x0066, 0x00FC, 0x0068, 0x0072, 0x0065, 0x006E, 0x002E, 0x0020, 0x0042, 0x0069, 0x0074, 0x0074, 0x0065, 0x0020, 0x006C, 0x0069, 0x0065, 0x0073, 0x0020, 0x0064, 0x0061, 0x0073, 0x0020, 0x004D, 0x0061, 0x006E, 0x0075, 0x0061, 0x006C, 0x0020, 0x0066, 0x00FC, 0x0072, 0x0020, 0x0077, 0x0065, 0x0069, 0x0074, 0x0065, 0x0072, 0x0065, 0x0020, 0x0049, 0x006E, 0x0066, 0x006F, 0x0072, 0x006D, 0x0061, 0x0074, 0x0069, 0x006F, 0x006E, 0x0065, 0x006E, 0x0020, 0x007A, 0x0075, 0x0020, 0x0048, 0x0061, 0x0072, 0x0064, 0x0077, 0x0061, 0x0072, 0x0065, 0x002D, 0x0041, 0x006E, 0x0066, 0x006F, 0x0072, 0x0064, 0x0065, 0x0072, 0x0075, 0x006E, 0x0067, 0x0065, 0x006E, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x0a: // Spanish - { - static const wchar_t fmt[] = {0x0053, 0x0065, 0x0020, 0x0068, 0x0061, 0x0020, 0x0064, 0x0065, 0x0074, 0x0065, 0x0063, 0x0074, 0x0061, 0x0064, 0x006F, 0x0020, 0x0075, 0x006E, 0x0061, 0x0020, 0x0074, 0x0061, 0x0072, 0x006A, 0x0065, 0x0074, 0x0061, 0x0020, 0x0067, 0x0072, 0x00E1, 0x0066, 0x0069, 0x0063, 0x0061, 0x0020, 0x006E, 0x006F, 0x0020, 0x0063, 0x006F, 0x006D, 0x0070, 0x0061, 0x0074, 0x0069, 0x0062, 0x006C, 0x0065, 0x002E, 0x0020, 0x0053, 0x0069, 0x0020, 0x0073, 0x0069, 0x0067, 0x0075, 0x0065, 0x0073, 0x0020, 0x0065, 0x006A, 0x0065, 0x0063, 0x0075, 0x0074, 0x0061, 0x006E, 0x0064, 0x006F, 0x0020, 0x0065, 0x006C, 0x0020, 0x006A, 0x0075, 0x0065, 0x0067, 0x006F, 0x002C, 0x0020, 0x0065, 0x0073, 0x0020, 0x0070, 0x006F, 0x0073, 0x0069, 0x0062, 0x006C, 0x0065, 0x0020, 0x0071, 0x0075, 0x0065, 0x0020, 0x0073, 0x0065, 0x0020, 0x0070, 0x0072, 0x006F, 0x0064, 0x0075, 0x007A, 0x0063, 0x0061, 0x006E, 0x0020, 0x0065, 0x0066, 0x0065, 0x0063, 0x0074, 0x006F, 0x0073, 0x0020, 0x0069, 0x006E, 0x0065, 0x0073, 0x0070, 0x0065, 0x0072, 0x0061, 0x0064, 0x006F, 0x0073, 0x0020, 0x006F, 0x0020, 0x0071, 0x0075, 0x0065, 0x0020, 0x0065, 0x006C, 0x0020, 0x0070, 0x0072, 0x006F, 0x0067, 0x0072, 0x0061, 0x006D, 0x0061, 0x0020, 0x0064, 0x0065, 0x006A, 0x0065, 0x0020, 0x0064, 0x0065, 0x0020, 0x0066, 0x0075, 0x006E, 0x0063, 0x0069, 0x006F, 0x006E, 0x0061, 0x0072, 0x002E, 0x0020, 0x0050, 0x006F, 0x0072, 0x0020, 0x0066, 0x0061, 0x0076, 0x006F, 0x0072, 0x002C, 0x0020, 0x0063, 0x006F, 0x006D, 0x0070, 0x0072, 0x0075, 0x0065, 0x0062, 0x0061, 0x0020, 0x0065, 0x006C, 0x0020, 0x006D, 0x0061, 0x006E, 0x0075, 0x0061, 0x006C, 0x0020, 0x0070, 0x0061, 0x0072, 0x0061, 0x0020, 0x006F, 0x0062, 0x0074, 0x0065, 0x006E, 0x0065, 0x0072, 0x0020, 0x006D, 0x00E1, 0x0073, 0x0020, 0x0069, 0x006E, 0x0066, 0x006F, 0x0072, 0x006D, 0x0061, 0x0063, 0x0069, 0x00F3, 0x006E, 0x0020, 0x0061, 0x0063, 0x0065, 0x0072, 0x0063, 0x0061, 0x0020, 0x0064, 0x0065, 0x0020, 0x006C, 0x006F, 0x0073, 0x0020, 0x0072, 0x0065, 0x0071, 0x0075, 0x0069, 0x0073, 0x0069, 0x0074, 0x006F, 0x0073, 0x0020, 0x0064, 0x0065, 0x006C, 0x0020, 0x0073, 0x0069, 0x0073, 0x0074, 0x0065, 0x006D, 0x0061, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x0c: // French - { - static const wchar_t fmt[] = {0x0041, 0x0074, 0x0074, 0x0065, 0x006E, 0x0074, 0x0069, 0x006F, 0x006E, 0x002C, 0x0020, 0x006C, 0x0061, 0x0020, 0x0063, 0x0061, 0x0072, 0x0074, 0x0065, 0x0020, 0x0076, 0x0069, 0x0064, 0x00E9, 0x006F, 0x0020, 0x0064, 0x00E9, 0x0074, 0x0065, 0x0063, 0x0074, 0x00E9, 0x0065, 0x0020, 0x006E, 0x2019, 0x0065, 0x0073, 0x0074, 0x0020, 0x0070, 0x0061, 0x0073, 0x0020, 0x0073, 0x0075, 0x0070, 0x0070, 0x006F, 0x0072, 0x0074, 0x00E9, 0x0065, 0x0020, 0x0021, 0x0020, 0x0050, 0x006F, 0x0075, 0x0072, 0x0073, 0x0075, 0x0069, 0x0076, 0x0072, 0x0065, 0x0020, 0x006C, 0x2019, 0x0061, 0x0070, 0x0070, 0x006C, 0x0069, 0x0063, 0x0061, 0x0074, 0x0069, 0x006F, 0x006E, 0x0020, 0x0070, 0x006F, 0x0075, 0x0072, 0x0072, 0x0061, 0x0069, 0x0074, 0x0020, 0x0065, 0x006E, 0x0067, 0x0065, 0x006E, 0x0064, 0x0072, 0x0065, 0x0072, 0x0020, 0x0064, 0x0065, 0x0073, 0x0020, 0x0069, 0x006E, 0x0073, 0x0074, 0x0061, 0x0062, 0x0069, 0x006C, 0x0069, 0x0074, 0x00E9, 0x0073, 0x0020, 0x006F, 0x0075, 0x0020, 0x0064, 0x0065, 0x0073, 0x0020, 0x0063, 0x0072, 0x0061, 0x0073, 0x0068, 0x0073, 0x002E, 0x0020, 0x0056, 0x0065, 0x0075, 0x0069, 0x006C, 0x006C, 0x0065, 0x007A, 0x0020, 0x0076, 0x006F, 0x0075, 0x0073, 0x0020, 0x0072, 0x0065, 0x0070, 0x006F, 0x0072, 0x0074, 0x0065, 0x0072, 0x0020, 0x0061, 0x0075, 0x0020, 0x006D, 0x0061, 0x006E, 0x0075, 0x0065, 0x006C, 0x0020, 0x0070, 0x006F, 0x0075, 0x0072, 0x0020, 0x0070, 0x006C, 0x0075, 0x0073, 0x0020, 0x0064, 0x2019, 0x0069, 0x006E, 0x0066, 0x006F, 0x0072, 0x006D, 0x0061, 0x0074, 0x0069, 0x006F, 0x006E, 0x0073, 0x0020, 0x0073, 0x0075, 0x0072, 0x0020, 0x006C, 0x0065, 0x0073, 0x0020, 0x0070, 0x0072, 0x00E9, 0x002D, 0x0072, 0x0065, 0x0071, 0x0075, 0x0069, 0x0073, 0x0020, 0x006D, 0x0061, 0x0074, 0x00E9, 0x0072, 0x0069, 0x0065, 0x006C, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x10: // Italian - { - static const wchar_t fmt[] = {0x00C8, 0x0020, 0x0073, 0x0074, 0x0061, 0x0074, 0x0061, 0x0020, 0x0072, 0x0069, 0x006C, 0x0065, 0x0076, 0x0061, 0x0074, 0x0061, 0x0020, 0x0075, 0x006E, 0x0061, 0x0020, 0x0073, 0x0063, 0x0068, 0x0065, 0x0064, 0x0061, 0x0020, 0x0067, 0x0072, 0x0061, 0x0066, 0x0069, 0x0063, 0x0061, 0x0020, 0x006E, 0x006F, 0x006E, 0x0020, 0x0073, 0x0075, 0x0070, 0x0070, 0x006F, 0x0072, 0x0074, 0x0061, 0x0074, 0x0061, 0x0021, 0x0020, 0x0053, 0x0065, 0x0020, 0x0073, 0x0069, 0x0020, 0x0063, 0x006F, 0x006E, 0x0074, 0x0069, 0x006E, 0x0075, 0x0061, 0x002C, 0x0020, 0x0073, 0x0069, 0x0020, 0x0070, 0x006F, 0x0074, 0x0072, 0x0065, 0x0062, 0x0062, 0x0065, 0x0072, 0x006F, 0x0020, 0x0076, 0x0065, 0x0072, 0x0069, 0x0066, 0x0069, 0x0063, 0x0061, 0x0072, 0x0065, 0x0020, 0x0072, 0x0069, 0x0073, 0x0075, 0x006C, 0x0074, 0x0061, 0x0074, 0x0069, 0x0020, 0x0069, 0x006E, 0x0061, 0x0074, 0x0074, 0x0065, 0x0073, 0x0069, 0x0020, 0x006F, 0x0020, 0x0063, 0x0072, 0x0061, 0x0073, 0x0068, 0x002E, 0x0020, 0x0043, 0x006F, 0x006E, 0x0073, 0x0075, 0x006C, 0x0074, 0x0061, 0x0020, 0x0069, 0x006C, 0x0020, 0x006D, 0x0061, 0x006E, 0x0075, 0x0061, 0x006C, 0x0065, 0x0020, 0x0070, 0x0065, 0x0072, 0x0020, 0x0075, 0x006C, 0x0074, 0x0065, 0x0072, 0x0069, 0x006F, 0x0072, 0x0069, 0x0020, 0x0069, 0x006E, 0x0066, 0x006F, 0x0072, 0x006D, 0x0061, 0x007A, 0x0069, 0x006F, 0x006E, 0x0069, 0x0020, 0x0073, 0x0075, 0x0069, 0x0020, 0x0072, 0x0065, 0x0071, 0x0075, 0x0069, 0x0073, 0x0069, 0x0074, 0x0069, 0x0020, 0x0064, 0x0069, 0x0020, 0x0073, 0x0069, 0x0073, 0x0074, 0x0065, 0x006D, 0x0061, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x11: // Japanese - { - static const wchar_t fmt[] = {0x30B5, 0x30DD, 0x30FC, 0x30C8, 0x3055, 0x308C, 0x3066, 0x3044, 0x306A, 0x3044, 0x30D3, 0x30C7, 0x30AA, 0x30AB, 0x30FC, 0x30C9, 0x304C, 0x691C, 0x51FA, 0x3055, 0x308C, 0x307E, 0x3057, 0x305F, 0xFF01, 0x0020, 0x3053, 0x306E, 0x307E, 0x307E, 0x7D9A, 0x3051, 0x308B, 0x3068, 0x4E88, 0x671F, 0x3057, 0x306A, 0x3044, 0x7D50, 0x679C, 0x3084, 0x30AF, 0x30E9, 0x30C3, 0x30B7, 0x30E5, 0x306E, 0x6050, 0x308C, 0x304C, 0x3042, 0x308A, 0x307E, 0x3059, 0x3002, 0x0020, 0x30DE, 0x30CB, 0x30E5, 0x30A2, 0x30EB, 0x306E, 0x5FC5, 0x8981, 0x52D5, 0x4F5C, 0x74B0, 0x5883, 0x3092, 0x3054, 0x78BA, 0x8A8D, 0x304F, 0x3060, 0x3055, 0x3044, 0x3002, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x30D9, 0x30F3, 0x30C0, 0x30FC, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x30C7, 0x30D0, 0x30A4, 0x30B9, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x15: // Polish - { - static const wchar_t fmt[] = {0x0057, 0x0079, 0x006B, 0x0072, 0x0079, 0x0074, 0x006F, 0x0020, 0x006E, 0x0069, 0x0065, 0x006F, 0x0062, 0x0073, 0x0142, 0x0075, 0x0067, 0x0069, 0x0077, 0x0061, 0x006E, 0x0105, 0x0020, 0x006B, 0x0061, 0x0072, 0x0074, 0x0119, 0x0020, 0x0067, 0x0072, 0x0061, 0x0066, 0x0069, 0x0063, 0x007A, 0x006E, 0x0105, 0x0021, 0x0020, 0x0044, 0x0061, 0x006C, 0x0073, 0x007A, 0x0065, 0x0020, 0x006B, 0x006F, 0x0072, 0x007A, 0x0079, 0x0073, 0x0074, 0x0061, 0x006E, 0x0069, 0x0065, 0x0020, 0x007A, 0x0020, 0x0070, 0x0072, 0x006F, 0x0064, 0x0075, 0x006B, 0x0074, 0x0075, 0x0020, 0x006D, 0x006F, 0x017C, 0x0065, 0x0020, 0x0073, 0x0070, 0x006F, 0x0077, 0x006F, 0x0064, 0x006F, 0x0077, 0x0061, 0x0107, 0x0020, 0x006E, 0x0069, 0x0065, 0x0070, 0x006F, 0x017C, 0x0105, 0x0064, 0x0061, 0x006E, 0x0065, 0x0020, 0x007A, 0x0061, 0x0063, 0x0068, 0x006F, 0x0077, 0x0061, 0x006E, 0x0069, 0x0065, 0x0020, 0x006C, 0x0075, 0x0062, 0x0020, 0x0077, 0x0073, 0x0074, 0x0072, 0x007A, 0x0079, 0x006D, 0x0061, 0x006E, 0x0069, 0x0065, 0x0020, 0x0070, 0x0072, 0x006F, 0x0067, 0x0072, 0x0061, 0x006D, 0x0075, 0x002E, 0x0020, 0x0041, 0x0062, 0x0079, 0x0020, 0x0075, 0x007A, 0x0079, 0x0073, 0x006B, 0x0061, 0x0107, 0x0020, 0x0077, 0x0069, 0x0119, 0x0063, 0x0065, 0x006A, 0x0020, 0x0069, 0x006E, 0x0066, 0x006F, 0x0072, 0x006D, 0x0061, 0x0063, 0x006A, 0x0069, 0x002C, 0x0020, 0x0073, 0x006B, 0x006F, 0x006E, 0x0073, 0x0075, 0x006C, 0x0074, 0x0075, 0x006A, 0x0020, 0x0073, 0x0069, 0x0119, 0x0020, 0x007A, 0x0020, 0x0069, 0x006E, 0x0073, 0x0074, 0x0072, 0x0075, 0x006B, 0x0063, 0x006A, 0x0105, 0x0020, 0x006F, 0x0062, 0x0073, 0x0142, 0x0075, 0x0067, 0x0069, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x19: // Russian - { - static const wchar_t fmt[] = {0x0412, 0x0430, 0x0448, 0x0430, 0x0020, 0x0432, 0x0438, 0x0434, 0x0435, 0x043E, 0x0020, 0x043A, 0x0430, 0x0440, 0x0442, 0x0430, 0x0020, 0x043D, 0x0435, 0x0020, 0x043F, 0x043E, 0x0434, 0x0434, 0x0435, 0x0440, 0x0436, 0x0438, 0x0432, 0x0430, 0x0435, 0x0442, 0x0441, 0x044F, 0x0021, 0x0020, 0x042D, 0x0442, 0x043E, 0x0020, 0x043C, 0x043E, 0x0436, 0x0435, 0x0442, 0x0020, 0x043F, 0x0440, 0x0438, 0x0432, 0x0435, 0x0441, 0x0442, 0x0438, 0x0020, 0x043A, 0x0020, 0x043D, 0x0435, 0x043F, 0x0440, 0x0435, 0x0434, 0x0441, 0x043A, 0x0430, 0x0437, 0x0443, 0x0435, 0x043C, 0x043E, 0x043C, 0x0443, 0x0020, 0x043F, 0x043E, 0x0432, 0x0435, 0x0434, 0x0435, 0x043D, 0x0438, 0x044E, 0x0020, 0x0438, 0x0020, 0x0437, 0x0430, 0x0432, 0x0438, 0x0441, 0x0430, 0x043D, 0x0438, 0x044E, 0x0020, 0x0438, 0x0433, 0x0440, 0x044B, 0x002E, 0x0020, 0x0414, 0x043B, 0x044F, 0x0020, 0x043F, 0x043E, 0x043B, 0x0443, 0x0447, 0x0435, 0x043D, 0x0438, 0x044F, 0x0020, 0x0438, 0x043D, 0x0444, 0x043E, 0x0440, 0x043C, 0x0430, 0x0446, 0x0438, 0x0438, 0x0020, 0x043E, 0x0020, 0x0441, 0x0438, 0x0441, 0x0442, 0x0435, 0x043C, 0x043D, 0x044B, 0x0445, 0x0020, 0x0442, 0x0440, 0x0435, 0x0431, 0x043E, 0x0432, 0x0430, 0x043D, 0x0438, 0x044F, 0x0445, 0x0020, 0x043E, 0x0431, 0x0440, 0x0430, 0x0442, 0x0438, 0x0442, 0x0435, 0x0441, 0x044C, 0x0020, 0x043A, 0x0020, 0x0440, 0x0443, 0x043A, 0x043E, 0x0432, 0x043E, 0x0434, 0x0441, 0x0442, 0x0432, 0x0443, 0x0020, 0x043F, 0x043E, 0x043B, 0x044C, 0x0437, 0x043E, 0x0432, 0x0430, 0x0442, 0x0435, 0x043B, 0x044F, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - case 0x1f: // Turkish - { - static const wchar_t fmt[] = {0x0044, 0x0065, 0x0073, 0x0074, 0x0065, 0x006B, 0x006C, 0x0065, 0x006E, 0x006D, 0x0065, 0x0079, 0x0065, 0x006E, 0x0020, 0x0062, 0x0069, 0x0072, 0x0020, 0x0065, 0x006B, 0x0072, 0x0061, 0x006E, 0x0020, 0x006B, 0x0061, 0x0072, 0x0074, 0x0131, 0x0020, 0x0061, 0x006C, 0x0067, 0x0131, 0x006C, 0x0061, 0x006E, 0x0064, 0x0131, 0x0021, 0x0020, 0x0044, 0x0065, 0x0076, 0x0061, 0x006D, 0x0020, 0x0065, 0x0074, 0x006D, 0x0065, 0x006B, 0x0020, 0x0062, 0x0065, 0x006B, 0x006C, 0x0065, 0x006E, 0x006D, 0x0065, 0x0064, 0x0069, 0x006B, 0x0020, 0x0073, 0x006F, 0x006E, 0x0075, 0x00E7, 0x006C, 0x0061, 0x0072, 0x0061, 0x0020, 0x0076, 0x0065, 0x0020, 0x00E7, 0x00F6, 0x006B, 0x006D, 0x0065, 0x006C, 0x0065, 0x0072, 0x0065, 0x0020, 0x0079, 0x006F, 0x006C, 0x0020, 0x0061, 0x00E7, 0x0061, 0x0062, 0x0069, 0x006C, 0x0069, 0x0072, 0x002E, 0x0020, 0x0044, 0x006F, 0x006E, 0x0061, 0x006E, 0x0131, 0x006D, 0x0020, 0x0067, 0x0065, 0x0072, 0x0065, 0x006B, 0x006C, 0x0069, 0x006C, 0x0069, 0x006B, 0x006C, 0x0065, 0x0072, 0x0069, 0x0020, 0x0069, 0x00E7, 0x0069, 0x006E, 0x0020, 0x006C, 0x00FC, 0x0074, 0x0066, 0x0065, 0x006E, 0x0020, 0x0072, 0x0065, 0x0068, 0x0062, 0x0065, 0x0072, 0x0069, 0x006E, 0x0069, 0x007A, 0x0065, 0x0020, 0x0062, 0x0061, 0x015F, 0x0076, 0x0075, 0x0072, 0x0075, 0x006E, 0x002E, 0x000A, 0x000A, 0x0022, 0x0025, 0x0053, 0x0022, 0x0020, 0x005B, 0x0076, 0x0065, 0x006E, 0x0064, 0x006F, 0x0072, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x002C, 0x0020, 0x0064, 0x0065, 0x0076, 0x0069, 0x0063, 0x0065, 0x0020, 0x0069, 0x0064, 0x0020, 0x003D, 0x0020, 0x0030, 0x0078, 0x0025, 0x002E, 0x0034, 0x0078, 0x005D, 0}; - pFmt = fmt; - break; - } - - case 0x09: // English - default: - break; - } - - wchar_t msg[1024]; - msg[0] = L'\0'; - msg[sizeof(msg) / sizeof(msg[0]) - 1] = L'\0'; - azsnwprintf(msg, sizeof(msg) / sizeof(msg[0]) - 1, pFmt, gpuName, gpuVendorId, gpuDeviceId); - - return msg; -} -#endif - ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// bool CSystem::InitConsole() diff --git a/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzerSystemComponent.cpp b/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzerSystemComponent.cpp index bc9763496c..bf03342149 100644 --- a/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzerSystemComponent.cpp +++ b/Gems/AssetMemoryAnalyzer/Code/Source/AssetMemoryAnalyzerSystemComponent.cpp @@ -30,17 +30,16 @@ namespace AssetMemoryAnalyzer if (customFilename) { - azsnprintf(sharedBuffer, sizeof(sharedBuffer), "@log@/%s", customFilename); + azsnprintf(sharedBuffer, AZ_ARRAY_SIZE(sharedBuffer), "@log@/%s", customFilename); } else { - char timestampBuffer[64]; time_t ltime; time(<ime); struct tm timeInfo; AZ_TRAIT_CTIME_LOCALTIME(&timeInfo, <ime); - strftime(timestampBuffer, sizeof(timestampBuffer), "@log@/assetmem-%Y-%m-%d-%H-%M-%S.%%s", &timeInfo); - azsnprintf(sharedBuffer, sizeof(sharedBuffer), timestampBuffer, extension); + strftime(sharedBuffer, AZ_ARRAY_SIZE(sharedBuffer), "@log@/assetmem-%Y-%m-%d-%H-%M-%S.", &timeInfo); + azstrcat(sharedBuffer, AZ_ARRAY_SIZE(sharedBuffer), extension); } return sharedBuffer; diff --git a/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp index 86381358fa..d3b6f5826c 100644 --- a/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp +++ b/Gems/ImGui/External/ImGui/v1.82/imgui/imgui_widgets.cpp @@ -58,6 +58,7 @@ Index of this file: #pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen #if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later #pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#pragma warning (disable: 4774) // format string expected in argument 2 is not a string literal #endif #endif From f7d4d80e5b182d8fed5030f34907fb565a37728d Mon Sep 17 00:00:00 2001 From: chiyenteng <82238204+chiyenteng@users.noreply.github.com> Date: Fri, 3 Sep 2021 12:06:22 -0700 Subject: [PATCH 117/355] Add prefab reparenting python auto tests (#3653) * Add prefab reparenting python auto tests Signed-off-by: chiyteng * modify prefab python auto test framework Signed-off-by: chiyteng * remove extra spaces Signed-off-by: chiyteng * delete unused files Signed-off-by: chiyteng * delete unused files Signed-off-by: chiyteng * fix nits Signed-off-by: chiyteng * Refactor prefab python tests Signed-off-by: chiyteng * Fix nits Signed-off-by: chiyteng * Modify comments Signed-off-by: chiyteng * Fix nits and add comments for Prefab.py Signed-off-by: chiyteng --- .../editor_entity_utils.py | 6 + .../Gem/PythonTests/prefab/Prefab.py | 221 ++++++++++++++++++ .../prefab/PrefabLevel_BasicWorkflow.py | 108 --------- ...fab_BasicWorkflow_CreateAndDeletePrefab.py | 34 +++ ...b_BasicWorkflow_CreateAndReparentPrefab.py | 51 ++++ .../Prefab_BasicWorkflow_CreatePrefab.py | 30 +++ .../Prefab_BasicWorkflow_InstantiatePrefab.py | 34 +++ .../PythonTests/prefab/Prefab_Test_Utils.py | 94 ++++++++ .../Gem/PythonTests/prefab/Test.prefab | 107 +++++++++ .../Gem/PythonTests/prefab/TestSuite_Main.py | 26 ++- .../Prefab/PrefabPublicHandler.cpp | 14 +- .../Prefab/PrefabPublicHandler.h | 7 +- .../Prefab/PrefabPublicInterface.h | 13 +- .../Prefab/PrefabPublicRequestBus.h | 15 +- .../Prefab/PrefabPublicRequestHandler.cpp | 2 +- .../Prefab/PrefabPublicRequestHandler.h | 2 +- 16 files changed, 627 insertions(+), 137 deletions(-) create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Prefab.py delete mode 100644 AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_BasicWorkflow.py create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndDeletePrefab.py create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndReparentPrefab.py create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreatePrefab.py create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_InstantiatePrefab.py create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Prefab_Test_Utils.py create mode 100644 AutomatedTesting/Gem/PythonTests/prefab/Test.prefab diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py index 0b4cf47961..fec9d9880b 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py @@ -214,6 +214,12 @@ class EditorEntity: """ return editor.EditorEntityInfoRequestBus(bus.Event, "GetParent", self.id) + def get_children_ids(self) -> List[azlmbr.entity.EntityId]: + """ + :return: Entity ids of children. Type: [entity.EntityId()] + """ + return editor.EditorEntityInfoRequestBus(bus.Event, "GetChildren", self.id) + def add_component(self, component_name: str) -> EditorComponent: """ Used to add new component to Entity. diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Prefab.py b/AutomatedTesting/Gem/PythonTests/prefab/Prefab.py new file mode 100644 index 0000000000..14a1ab62f0 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Prefab.py @@ -0,0 +1,221 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +from __future__ import annotations +from collections import Counter +from collections import deque +from os import path + +from PySide2 import QtWidgets + +from azlmbr.entity import EntityId +from azlmbr.math import Vector3 +from editor_python_test_tools.editor_entity_utils import EditorEntity +from editor_python_test_tools.utils import Report + +import azlmbr.bus as bus +import azlmbr.prefab as prefab +import editor_python_test_tools.pyside_utils as pyside_utils +import prefab.Prefab_Test_Utils as prefab_test_utils + +# This is a helper class which contains some of the useful information about a prefab instance. +class PrefabInstance: + + def __init__(self, name: str=None, prefab_file_name: str=None, container_entity: EditorEntity=EntityId()): + self.name = name + self.prefab_file_name: str = prefab_file_name + self.container_entity: EditorEntity = container_entity + + """ + See if this instance is valid to be used with other prefab operations. + :return: Whether the target instance is valid or not. + """ + def is_valid() -> bool: + return self.container_entity.id.IsValid() and self.name is not None and self.prefab_file_name in Prefab.existing_prefabs + + + """ + Reparent this instance to target parent entity. + The function will also check pop up dialog ui in editor to see if there's prefab cyclical dependency error while reparenting prefabs. + :param parent_entity_id: The id of the entity this instance should be a child of in the transform hierarchy next. + """ + async def ui_reparent_prefab_instance(self, parent_entity_id: EntityId): + container_entity_name = self.container_entity.get_name() + current_children_entity_ids_having_prefab_name = prefab_test_utils.get_children_ids_by_name(parent_entity_id, container_entity_name) + Report.info(f'current_children_entity_ids_having_prefab_name: {current_children_entity_ids_having_prefab_name}') + + pyside_utils.run_soon(lambda: self.container_entity.set_parent_entity(parent_entity_id)) + pyside_utils.run_soon(lambda: prefab_test_utils.wait_for_propagation()) + + try: + active_modal_widget = await pyside_utils.wait_for_modal_widget() + error_message_box = active_modal_widget.findChild(QtWidgets.QMessageBox) + ok_button = error_message_box.button(QtWidgets.QMessageBox.Ok) + ok_button.click() + assert False, "Cyclical dependency detected while reparenting prefab" + except pyside_utils.EventLoopTimeoutException: + pass + + updated_children_entity_ids_having_prefab_name = prefab_test_utils.get_children_ids_by_name(parent_entity_id, container_entity_name) + Report.info(f'updated_children_entity_ids_having_prefab_name: {updated_children_entity_ids_having_prefab_name}') + new_child_with_reparented_prefab_name_added = len(updated_children_entity_ids_having_prefab_name) == len(current_children_entity_ids_having_prefab_name) + 1 + assert new_child_with_reparented_prefab_name_added, "No entity with reparented prefab name become a child of target parent entity" + + updated_container_entity_id = set(updated_children_entity_ids_having_prefab_name).difference(current_children_entity_ids_having_prefab_name).pop() + updated_container_entity = EditorEntity(updated_container_entity_id) + updated_container_entity_parent_id = updated_container_entity.get_parent_id() + has_correct_parent = updated_container_entity_parent_id.ToString() == parent_entity_id.ToString() + assert has_correct_parent, "Prefab reparented is *not* under the expected parent entity" + + self.container_entity = EditorEntity(updated_container_entity_id) + +# This is a helper class which contains some of the useful information about a prefab template. +class Prefab: + + existing_prefabs = {} + + def __init__(self, file_name: str): + self.file_name:str = file_name + self.file_path: str = prefab_test_utils.get_prefab_file_path(file_name) + self.instances: dict = {} + + """ + Check if a prefab is ready to be used to generate its instances. + :param file_name: A unique file name of the target prefab. + :return: Whether the target prefab is loaded or not. + """ + @classmethod + def is_prefab_loaded(cls, file_name: str) -> bool: + return file_name in Prefab.existing_prefabs + + """ + Check if a prefab exists in the directory for files of prefab tests. + :param file_name: A unique file name of the target prefab. + :return: Whether the target prefab exists or not. + """ + @classmethod + def prefab_exists(cls, file_name: str) -> bool: + file_path = prefab_test_utils.get_prefab_file_path(file_name) + return path.exists(file_path) + + """ + Return a prefab which can be used immediately. + :param file_name: A unique file name of the target prefab. + :return: The prefab with given file name. + """ + @classmethod + def get_prefab(cls, file_name: str) -> Prefab: + if Prefab.is_prefab_loaded(file_name): + return Prefab.existing_prefabs[file_name] + else: + assert Prefab.prefab_exists(file_name), f"Attempted to get a prefab {file_name} that doesn't exist" + new_prefab = Prefab(file_name) + Prefab.existing_prefabs[file_name] = Prefab(file_name) + return new_prefab + + """ + Create a prefab in memory and return it. The very first instance of this prefab will also be created. + :param entities: The entities that should form the new prefab (along with their descendants). + :param file_name: A unique file name of new prefab. + :param prefab_instance_name: A name for the very first instance generated while prefab creation. The default instance name is the same as file_name. + :return: An outcome object with an entityId of the new prefab's container entity; on failure, it comes with an error message detailing the cause of the error. + """ + @classmethod + def create_prefab(cls, entities: list[EditorEntity], file_name: str, prefab_instance_name: str=None) -> Prefab: + assert not Prefab.is_prefab_loaded(file_name), f"Can't create Prefab '{file_name}' since the prefab already exists" + + new_prefab = Prefab(file_name) + entity_ids = [entity.id for entity in entities] + create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', entity_ids, new_prefab.file_path) + assert create_prefab_result.IsSuccess(), f"Prefab operation 'CreatePrefab' failed. Error: {create_prefab_result.GetError()}" + + container_entity = EditorEntity(create_prefab_result.GetValue()) + + if prefab_instance_name: + container_entity.set_name(prefab_instance_name) + else: + prefab_instance_name = file_name + + prefab_test_utils.wait_for_propagation() + container_entity_id = prefab_test_utils.find_entity_by_unique_name(prefab_instance_name) + new_prefab.instances[prefab_instance_name] = PrefabInstance(prefab_instance_name, file_name, EditorEntity(container_entity_id)) + Prefab.existing_prefabs[file_name] = new_prefab + return new_prefab + + """ + Remove target prefab instances. + :param prefab_instances: Instances to be removed. + """ + @classmethod + def remove_prefabs(cls, prefab_instances: list[PrefabInstance]): + instances_to_remove_name_counts = Counter() + instances_removed_expected_name_counts = Counter() + + entities_to_remove = [prefab_instance.container_entity for prefab_instance in prefab_instances] + while entities_to_remove: + entity = entities_to_remove.pop(-1) + entity_name = entity.get_name() + instances_to_remove_name_counts[entity_name] += 1 + + children_entity_ids = entity.get_children_ids() + for child_entity_id in children_entity_ids: + entities_to_remove.append(EditorEntity(child_entity_id)) + + for entity_name, entity_count in instances_to_remove_name_counts.items(): + entities = prefab_test_utils.find_entities_by_name(entity_name) + instances_removed_expected_name_counts[entity_name] = len(entities) - entity_count + + container_entity_ids = [prefab_instance.container_entity.id for prefab_instance in prefab_instances] + delete_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'DeleteEntitiesAndAllDescendantsInInstance', container_entity_ids) + assert delete_prefab_result.IsSuccess(), f"Prefab operation 'DeleteEntitiesAndAllDescendantsInInstance' failed. Error: {delete_prefab_result.GetError()}" + + prefab_test_utils.wait_for_propagation() + + prefab_entities_deleted = True + for entity_name, expected_entity_count in instances_removed_expected_name_counts.items(): + actual_entity_count = len(prefab_test_utils.find_entities_by_name(entity_name)) + if actual_entity_count is not expected_entity_count: + prefab_entities_deleted = False + break + + assert prefab_entities_deleted, "Not all entities and descendants in target prefabs are deleted." + + for instance in prefab_instances: + instance_deleted_prefab = Prefab.get_prefab(instance.prefab_file_name) + instance_deleted_prefab.instances.pop(instance.name) + instance = PrefabInstance() + + """ + Instantiate an instance of this prefab. + :param name: A name for newly instantiated prefab instance. The default instance name is the same as this prefab's file name. + :param parent_entity: The entity the prefab should be a child of in the transform hierarchy. + :param prefab_position: The position in world space the prefab should be instantiated in. + :return: An outcome object with an entityId of the new prefab's container entity; on failure, it comes with an error message detailing the cause of the error. + """ + def instantiate(self, name: str=None, parent_entity: EditorEntity=None, prefab_position: Vector3=Vector3()) -> PrefabInstance: + parent_entity_id = parent_entity.id if parent_entity is not None else EntityId() + + instantiate_prefab_result = prefab.PrefabPublicRequestBus( + bus.Broadcast, 'InstantiatePrefab', self.file_path, parent_entity_id, prefab_position) + + assert instantiate_prefab_result.IsSuccess(), f"Prefab operation 'InstantiatePrefab' failed. Error: {instantiate_prefab_result.GetError()}" + + container_entity_id = instantiate_prefab_result.GetValue() + container_entity = EditorEntity(container_entity_id) + + if name: + container_entity.set_name(name) + else: + name = self.file_name + + prefab_test_utils.wait_for_propagation() + container_entity_id = prefab_test_utils.find_entity_by_unique_name(name) + self.instances[name] = PrefabInstance(name, self.file_name, EditorEntity(container_entity_id)) + + prefab_test_utils.check_entity_at_position(container_entity_id, prefab_position) + + return container_entity_id diff --git a/AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_BasicWorkflow.py b/AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_BasicWorkflow.py deleted file mode 100644 index 7a600f7976..0000000000 --- a/AutomatedTesting/Gem/PythonTests/prefab/PrefabLevel_BasicWorkflow.py +++ /dev/null @@ -1,108 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - -# fmt:off -class Tests(): - create_new_entity = ("'CreateNewEntity' passed", "'CreateNewEntity' failed") - create_prefab = ("'CreatePrefab' passed", "'CreatePrefab' failed") - instantiate_prefab = ("'InstantiatePrefab' passed", "'InstantiatePrefab' failed") - has_one_child = ("instantiated prefab contains only one child as expected", "instantiated prefab does *not* contain only one child as expected") - instantiated_prefab_position = ("instantiated prefab's position is at the expected position", "instantiated prefab's position is *not* at the expected position") - delete_prefab = ("'DeleteEntitiesAndAllDescendantsInInstance' passed", "'DeleteEntitiesAndAllDescendantsInInstance' failed") - instantiated_prefab_removed = ("instantiated prefab's container entity has been removed", "instantiated prefab's container entity has *not* been removed") - instantiated_child_removed = ("instantiated prefab's child entity has been removed", "instantiated prefab's child entity has *not* been removed") -# fmt:on - -def PrefabLevel_BasicWorkflow(): - """ - This test will help verify if the following functions related to Prefab work as expected: - - CreatePrefab - - InstantiatePrefab - - DeleteEntitiesAndAllDescendantsInInstance - """ - - import os - import sys - - from editor_python_test_tools.utils import Report - from editor_python_test_tools.utils import TestHelper as helper - import editor_python_test_tools.hydra_editor_utils as hydra - - import azlmbr.bus as bus - import azlmbr.entity as entity - from azlmbr.entity import EntityId - import azlmbr.editor as editor - import azlmbr.prefab as prefab - from azlmbr.math import Vector3 - import azlmbr.legacy.general as general - - NEW_PREFAB_NAME = "new_prefab" - NEW_PREFAB_FILE_NAME = NEW_PREFAB_NAME + ".prefab" - NEW_PREFAB_FILE_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), NEW_PREFAB_FILE_NAME) - INSTANTIATED_PREFAB_POSITION = Vector3(10.00, 20.0, 30.0) - INSTANTIATED_PREFAB_NAME = "instantiated_prefab" - INSTANTIATED_CHILD_ENTITY_NAME = "child_1" - TEST_LEVEL_FOLDER = "Prefab" - TEST_LEVEL_NAME = "Base" - - def find_entity_by_name(entity_name): - searchFilter = entity.SearchFilter() - searchFilter.names = [entity_name] - entityIds = entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter) - if entityIds and entityIds[0].IsValid(): - return entityIds[0] - return None - - def print_error_if_failed(prefab_operation_result): - if not prefab_operation_result.IsSuccess(): - Report.info(f'Error message: {prefab_operation_result.GetError()}') - - -# Open the test level - helper.init_idle() - helper.open_level(TEST_LEVEL_FOLDER, TEST_LEVEL_NAME) - -# Create a new Entity at the root level - new_entity_id = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', EntityId()) - Report.result(Tests.create_new_entity, new_entity_id.IsValid()) - -# Checks for prefab creation passed or not - create_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'CreatePrefabInMemory', [new_entity_id], NEW_PREFAB_FILE_PATH) - Report.result(Tests.create_prefab, create_prefab_result.IsSuccess()) - print_error_if_failed(create_prefab_result) - -# Checks for prefab instantiation passed or not - instantiate_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'InstantiatePrefab', NEW_PREFAB_FILE_PATH, EntityId(), INSTANTIATED_PREFAB_POSITION) - Report.result(Tests.instantiate_prefab, instantiate_prefab_result.IsSuccess() and instantiate_prefab_result.GetValue().IsValid()) - print_error_if_failed(instantiate_prefab_result) - - container_entity_id = instantiate_prefab_result.GetValue() - editor.EditorEntityAPIBus(bus.Event, 'SetName', container_entity_id, INSTANTIATED_PREFAB_NAME) - - children_entity_ids = editor.EditorEntityInfoRequestBus(bus.Event, 'GetChildren', container_entity_id) - Report.result(Tests.has_one_child, len(children_entity_ids) is 1) - - child_entity_id = children_entity_ids[0] - editor.EditorEntityAPIBus(bus.Event, 'SetName', child_entity_id, INSTANTIATED_CHILD_ENTITY_NAME) - -# Checks if the new prefab is at the correct position and if it fails, it will provide the expected postion and the actual postion of the entity in the Editor log - actual_prefab_position = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldTranslation", container_entity_id) - is_at_position = actual_prefab_position.IsClose(INSTANTIATED_PREFAB_POSITION) - Report.result(Tests.instantiated_prefab_position, is_at_position) - if not is_at_position: - Report.info(f'Expected position: {INSTANTIATED_PREFAB_POSITION.ToString()}, actual position: {actual_prefab_position.ToString()}') - -# Checks for prefab deletion passed or not - delete_prefab_result = prefab.PrefabPublicRequestBus(bus.Broadcast, 'DeleteEntitiesAndAllDescendantsInInstance', [container_entity_id]) - Report.result(Tests.delete_prefab, delete_prefab_result.IsSuccess()) - print_error_if_failed(delete_prefab_result) - Report.result(Tests.instantiated_prefab_removed, find_entity_by_name(INSTANTIATED_PREFAB_NAME) is None) - Report.result(Tests.instantiated_child_removed, find_entity_by_name(INSTANTIATED_CHILD_ENTITY_NAME) is None) - -if __name__ == "__main__": - from editor_python_test_tools.utils import Report - Report.start_test(PrefabLevel_BasicWorkflow) diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndDeletePrefab.py b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndDeletePrefab.py new file mode 100644 index 0000000000..c6e0daa4dd --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndDeletePrefab.py @@ -0,0 +1,34 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +def Prefab_BasicWorkflow_CreateAndDeletePrefab(): + + CAR_PREFAB_FILE_NAME = 'car_prefab' + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from prefab.Prefab import Prefab + + import prefab.Prefab_Test_Utils as prefab_test_utils + + prefab_test_utils.open_base_tests_level() + + # Creates a new Entity at the root level + # Asserts if creation didn't succeed + car_entity = EditorEntity.create_editor_entity() + car_prefab_entities = [car_entity] + + # Checks for prefab creation passed or not + car_prefab = Prefab.create_prefab( + car_prefab_entities, CAR_PREFAB_FILE_NAME) + + # Checks for prefab deletion passed or not + car = car_prefab.instances[CAR_PREFAB_FILE_NAME] + Prefab.remove_prefabs([car]) + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(Prefab_BasicWorkflow_CreateAndDeletePrefab) diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndReparentPrefab.py b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndReparentPrefab.py new file mode 100644 index 0000000000..04f7b97628 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreateAndReparentPrefab.py @@ -0,0 +1,51 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +def Prefab_BasicWorkflow_CreateAndReparentPrefab(): + + CAR_PREFAB_FILE_NAME = 'car_prefab' + WHEEL_PREFAB_FILE_NAME = 'wheel_prefab' + + import editor_python_test_tools.pyside_utils as pyside_utils + + @pyside_utils.wrap_async + async def run_test(): + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from prefab.Prefab import Prefab + + import prefab.Prefab_Test_Utils as prefab_test_utils + + prefab_test_utils.open_base_tests_level() + + # Creates a new Entity at the root level + # Asserts if creation didn't succeed + car_entity = EditorEntity.create_editor_entity() + car_prefab_entities = [car_entity] + + # Checks for prefab creation passed or not + car_prefab = Prefab.create_prefab( + car_prefab_entities, CAR_PREFAB_FILE_NAME) + + # Creates another new Entity at the root level + wheel_entity = EditorEntity.create_editor_entity() + wheel_prefab_entities = [wheel_entity] + + # Checks for wheel prefab creation passed or not + wheel_prefab = Prefab.create_prefab( + wheel_prefab_entities, WHEEL_PREFAB_FILE_NAME) + + # Checks for prefab reparenting passed or not + car = car_prefab.instances[CAR_PREFAB_FILE_NAME] + wheel = wheel_prefab.instances[WHEEL_PREFAB_FILE_NAME] + await wheel.ui_reparent_prefab_instance(car.container_entity.id) + + run_test() + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(Prefab_BasicWorkflow_CreateAndReparentPrefab) diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreatePrefab.py b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreatePrefab.py new file mode 100644 index 0000000000..d86b03d5ad --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_CreatePrefab.py @@ -0,0 +1,30 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +def Prefab_BasicWorkflow_CreatePrefab(): + + CAR_PREFAB_FILE_NAME = 'car_prefab' + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report + from prefab.Prefab import Prefab + + import prefab.Prefab_Test_Utils as prefab_test_utils + + prefab_test_utils.open_base_tests_level() + + # Creates a new Entity at the root level + # Asserts if creation didn't succeed + car_entity = EditorEntity.create_editor_entity() + car_prefab_entities = [car_entity] + + # Checks for prefab creation passed or not + Prefab.create_prefab(car_prefab_entities, CAR_PREFAB_FILE_NAME) + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(Prefab_BasicWorkflow_CreatePrefab) diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_InstantiatePrefab.py b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_InstantiatePrefab.py new file mode 100644 index 0000000000..b9015ab556 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_BasicWorkflow_InstantiatePrefab.py @@ -0,0 +1,34 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +def Prefab_BasicWorkflow_InstantiatePrefab(): + + from azlmbr.math import Vector3 + + EXISTING_TEST_PREFAB_FILE_NAME = "Test" + INSTANTIATED_TEST_PREFAB_POSITION = Vector3(10.00, 20.0, 30.0) + EXPECTED_TEST_PREFAB_CHILDREN_COUNT = 1 + + from prefab.Prefab import Prefab + + import prefab.Prefab_Test_Utils as prefab_test_utils + + prefab_test_utils.open_base_tests_level() + + # Checks for prefab instantiation passed or not + test_prefab = Prefab.get_prefab(EXISTING_TEST_PREFAB_FILE_NAME) + + instantiated_test_container_entity_id = test_prefab.instantiate( + prefab_position=INSTANTIATED_TEST_PREFAB_POSITION) + + prefab_test_utils.check_entity_children_count( + instantiated_test_container_entity_id, + EXPECTED_TEST_PREFAB_CHILDREN_COUNT) + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(Prefab_BasicWorkflow_InstantiatePrefab) diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Prefab_Test_Utils.py b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_Test_Utils.py new file mode 100644 index 0000000000..8cd59ed077 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Prefab_Test_Utils.py @@ -0,0 +1,94 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +import os + +from azlmbr.entity import EntityId +from azlmbr.math import Vector3 +from editor_python_test_tools.editor_entity_utils import EditorEntity +from editor_python_test_tools.utils import Report +from editor_python_test_tools.utils import TestHelper as helper + +import azlmbr.bus as bus +import azlmbr.components as components +import azlmbr.entity as entity +import azlmbr.legacy.general as general + +def get_prefab_file_name(prefab_name): + return prefab_name + ".prefab" + +def get_prefab_file_path(prefab_name): + return os.path.join(os.path.dirname(os.path.abspath(__file__)), get_prefab_file_name(prefab_name)) + +def find_entities_by_name(entity_name): + searchFilter = entity.SearchFilter() + searchFilter.names = [entity_name] + return entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter) + +def find_entity_by_unique_name(entity_name): + unique_name_entity_found_result = ( + "Entity with a unique name found", + "Entity with a unique name *not* found") + + entities = find_entities_by_name(entity_name) + unique_name_entity_found = len(entities) == 1 + Report.result(unique_name_entity_found_result, unique_name_entity_found) + + if unique_name_entity_found: + return entities[0] + else: + Report.info(f"{len(entities)} entities with name '{entity_name}' found") + return EntityId() + +def check_entity_at_position(entity_id, expected_entity_position): + entity_at_expected_position_result = ( + "entity is at expected position", + "entity is *not* at expected position") + + actual_entity_position = components.TransformBus(bus.Event, "GetWorldTranslation", entity_id) + is_at_position = actual_entity_position.IsClose(expected_entity_position) + Report.result(entity_at_expected_position_result, is_at_position) + + if not is_at_position: + Report.info(f"Entity '{entity_id.ToString()}'\'s expected position: {expected_entity_position.ToString()}, actual position: {actual_entity_position.ToString()}") + + return is_at_position + +def check_entity_children_count(entity_id, expected_children_count): + entity_children_count_matched_result = ( + "Entity with a unique name found", + "Entity with a unique name *not* found") + + entity = EditorEntity(entity_id) + children_entity_ids = entity.get_children_ids() + entity_children_count_matched = len(children_entity_ids) == expected_children_count + Report.result(entity_children_count_matched_result, entity_children_count_matched) + + if not entity_children_count_matched: + Report.info(f"Entity '{entity_id.ToString()}' actual children count: {len(children_entity_ids)}. Expected children count: {expected_children_count}") + + return entity_children_count_matched + +def get_children_ids_by_name(entity_id, entity_name): + entity = EditorEntity(entity_id) + children_entity_ids = entity.get_children_ids() + + result = [] + for child_entity_id in children_entity_ids: + child_entity = EditorEntity(child_entity_id) + child_entity_name = child_entity.get_name() + if child_entity_name == entity_name: + result.append(child_entity_id) + + return result + +def wait_for_propagation(): + general.idle_wait_frames(1) + +def open_base_tests_level(): + helper.init_idle() + helper.open_level("Prefab", "Base") diff --git a/AutomatedTesting/Gem/PythonTests/prefab/Test.prefab b/AutomatedTesting/Gem/PythonTests/prefab/Test.prefab new file mode 100644 index 0000000000..c8d37d7762 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/prefab/Test.prefab @@ -0,0 +1,107 @@ +{ + "ContainerEntity": { + "Id": "ContainerEntity", + "Name": "Test", + "Components": { + "Component_[12826143848076424135]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 12826143848076424135 + }, + "Component_[15101974329990766813]": { + "$type": "EditorVisibilityComponent", + "Id": 15101974329990766813 + }, + "Component_[16680274563691182095]": { + "$type": "EditorOnlyEntityComponent", + "Id": 16680274563691182095 + }, + "Component_[17501195180351523199]": { + "$type": "SelectionComponent", + "Id": 17501195180351523199 + }, + "Component_[17646858836910065148]": { + "$type": "EditorPrefabComponent", + "Id": 17646858836910065148 + }, + "Component_[18334569630592611766]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 18334569630592611766, + "Parent Entity": "" + }, + "Component_[1851406541343621754]": { + "$type": "EditorInspectorComponent", + "Id": 1851406541343621754 + }, + "Component_[25876196591746739]": { + "$type": "EditorEntitySortComponent", + "Id": 25876196591746739 + }, + "Component_[2800966138796329695]": { + "$type": "EditorPendingCompositionComponent", + "Id": 2800966138796329695 + }, + "Component_[8557036193836405255]": { + "$type": "EditorLockComponent", + "Id": 8557036193836405255 + }, + "Component_[9320658693245331333]": { + "$type": "EditorEntityIconComponent", + "Id": 9320658693245331333 + } + } + }, + "Entities": { + "Entity_[965482067476]": { + "Id": "Entity_[965482067476]", + "Name": "Test_Entity", + "Components": { + "Component_[10201286510014079044]": { + "$type": "EditorLockComponent", + "Id": 10201286510014079044 + }, + "Component_[10449365794489552009]": { + "$type": "EditorInspectorComponent", + "Id": 10449365794489552009, + "ComponentOrderEntryArray": [ + { + "ComponentId": 8658441042113324226 + } + ] + }, + "Component_[14918448446211728610]": { + "$type": "EditorOnlyEntityComponent", + "Id": 14918448446211728610 + }, + "Component_[16421196842573146832]": { + "$type": "EditorPendingCompositionComponent", + "Id": 16421196842573146832 + }, + "Component_[18246651644622464292]": { + "$type": "EditorVisibilityComponent", + "Id": 18246651644622464292 + }, + "Component_[2027518491025985743]": { + "$type": "EditorDisabledCompositionComponent", + "Id": 2027518491025985743 + }, + "Component_[4284802475196956760]": { + "$type": "EditorEntityIconComponent", + "Id": 4284802475196956760 + }, + "Component_[5856000098143259126]": { + "$type": "EditorEntitySortComponent", + "Id": 5856000098143259126 + }, + "Component_[7830595068045232876]": { + "$type": "SelectionComponent", + "Id": 7830595068045232876 + }, + "Component_[8658441042113324226]": { + "$type": "{27F1E1A1-8D9D-4C3B-BD3A-AFB9762449C0} TransformComponent", + "Id": 8658441042113324226, + "Parent Entity": "ContainerEntity" + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py index 4e3d6ba77f..09df962b0b 100644 --- a/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/prefab/TestSuite_Main.py @@ -13,10 +13,8 @@ import os import sys from ly_test_tools import LAUNCHERS +sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') -sys.path.append (os.path.dirname (os.path.abspath (__file__)) + '/../automatedtesting_shared') - -import ly_test_tools.environment.file_system as file_system from base import TestAutomationBase @pytest.mark.SUITE_main @@ -24,14 +22,28 @@ from base import TestAutomationBase @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): - def _run_prefab_test(self, request, workspace, editor, test_module): - self._run_test(request, workspace, editor, test_module, ["--regset=/Amazon/Preferences/EnablePrefabSystem=true"]) + def _run_prefab_test(self, request, workspace, editor, test_module, batch_mode=True, autotest_mode=True): + self._run_test(request, workspace, editor, test_module, + extra_cmdline_args=["--regset=/Amazon/Preferences/EnablePrefabSystem=true"], + batch_mode=batch_mode, + autotest_mode=autotest_mode) def test_PrefabLevel_OpensLevelWithEntities(self, request, workspace, editor, launcher_platform): from . import PrefabLevel_OpensLevelWithEntities as test_module self._run_prefab_test(request, workspace, editor, test_module) - def test_PrefabLevel_BasicWorkflow(self, request, workspace, editor, launcher_platform): - from . import PrefabLevel_BasicWorkflow as test_module + def test_Prefab_BasicWorkflow_CreatePrefab(self, request, workspace, editor, launcher_platform): + from . import Prefab_BasicWorkflow_CreatePrefab as test_module + self._run_prefab_test(request, workspace, editor, test_module) + + def test_Prefab_BasicWorkflow_InstantiatePrefab(self, request, workspace, editor, launcher_platform): + from . import Prefab_BasicWorkflow_InstantiatePrefab as test_module self._run_prefab_test(request, workspace, editor, test_module) + def test_Prefab_BasicWorkflow_CreateAndDeletePrefab(self, request, workspace, editor, launcher_platform): + from . import Prefab_BasicWorkflow_CreateAndDeletePrefab as test_module + self._run_prefab_test(request, workspace, editor, test_module) + + def test_Prefab_BasicWorkflow_CreateAndReparentPrefab(self, request, workspace, editor, launcher_platform): + from . import Prefab_BasicWorkflow_CreateAndReparentPrefab as test_module + self._run_prefab_test(request, workspace, editor, test_module, autotest_mode=False) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp index c412033362..63f042be85 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.cpp @@ -61,7 +61,7 @@ namespace AzToolsFramework m_prefabUndoCache.Destroy(); } - PrefabOperationResult PrefabPublicHandler::CreatePrefabInMemory(const EntityIdList& entityIds, AZ::IO::PathView filePath) + CreatePrefabResult PrefabPublicHandler::CreatePrefabInMemory(const EntityIdList& entityIds, AZ::IO::PathView filePath) { EntityList inputEntityList, topLevelEntities; AZ::EntityId commonRootEntityId; @@ -70,9 +70,11 @@ namespace AzToolsFramework entityIds, inputEntityList, topLevelEntities, commonRootEntityId, commonRootEntityOwningInstance); if (!findCommonRootOutcome.IsSuccess()) { - return findCommonRootOutcome; + return AZ::Failure(findCommonRootOutcome.TakeError()); } + AZ::EntityId containerEntityId; + InstanceOptionalReference instanceToCreate; { // Initialize Undo Batch object @@ -92,7 +94,7 @@ namespace AzToolsFramework inputEntityList, commonRootEntityOwningInstance->get(), entities, instances); if (!retrieveEntitiesAndInstancesOutcome.IsSuccess()) { - return retrieveEntitiesAndInstancesOutcome; + return AZ::Failure(retrieveEntitiesAndInstancesOutcome.TakeError()); } AZStd::unordered_map oldEntityAliases; @@ -153,7 +155,7 @@ namespace AzToolsFramework "(A null instance is returned).")); } - AZ::EntityId containerEntityId = instanceToCreate->get().GetContainerEntityId(); + containerEntityId = instanceToCreate->get().GetContainerEntityId(); // Apply the correct transform to the container for the new instance, and store the patch for use when creating the link. PrefabDom patch = ApplyContainerTransformAndGeneratePatch(containerEntityId, commonRootEntityId, topLevelEntities); @@ -261,10 +263,10 @@ namespace AzToolsFramework } } - return AZ::Success(); + return AZ::Success(containerEntityId); } - PrefabOperationResult PrefabPublicHandler::CreatePrefabInDisk(const EntityIdList& entityIds, AZ::IO::PathView filePath) + CreatePrefabResult PrefabPublicHandler::CreatePrefabInDisk(const EntityIdList& entityIds, AZ::IO::PathView filePath) { auto result = CreatePrefabInMemory(entityIds, filePath); if (result.IsSuccess()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h index 6faaa6932f..42b6bc1666 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicHandler.h @@ -42,11 +42,12 @@ namespace AzToolsFramework void UnregisterPrefabPublicHandlerInterface(); // PrefabPublicInterface... - PrefabOperationResult CreatePrefabInDisk( + CreatePrefabResult CreatePrefabInDisk( const EntityIdList& entityIds, AZ::IO::PathView filePath) override; - PrefabOperationResult CreatePrefabInMemory( + CreatePrefabResult CreatePrefabInMemory( const EntityIdList& entityIds, AZ::IO::PathView filePath) override; - InstantiatePrefabResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override; + InstantiatePrefabResult InstantiatePrefab( + AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override; PrefabOperationResult SavePrefab(AZ::IO::Path filePath) override; PrefabEntityResult CreateEntity(AZ::EntityId parentId, const AZ::Vector3& position) override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h index 83763ef55f..528d4f6d1b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicInterface.h @@ -24,8 +24,9 @@ namespace AzToolsFramework namespace Prefab { - typedef AZ::Outcome PrefabOperationResult; + typedef AZ::Outcome CreatePrefabResult; typedef AZ::Outcome InstantiatePrefabResult; + typedef AZ::Outcome PrefabOperationResult; typedef AZ::Outcome PrefabRequestResult; typedef AZ::Outcome PrefabEntityResult; @@ -44,9 +45,10 @@ namespace AzToolsFramework * Automatically detects descendants of entities, and discerns between entities and child instances. * @param entityIds The entities that should form the new prefab (along with their descendants). * @param filePath The absolute path for the new prefab file. - * @return An outcome object; on failure, it comes with an error message detailing the cause of the error. + * @return An outcome object with an entityId of the new prefab's container entity; + * on failure, it comes with an error message detailing the cause of the error. */ - virtual PrefabOperationResult CreatePrefabInDisk( + virtual CreatePrefabResult CreatePrefabInDisk( const EntityIdList& entityIds, AZ::IO::PathView filePath) = 0; /** @@ -54,9 +56,10 @@ namespace AzToolsFramework * Automatically detects descendants of entities, and discerns between entities and child instances. * @param entityIds The entities that should form the new prefab (along with their descendants). * @param filePath The absolute path for the new prefab file. - * @return An outcome object; on failure, it comes with an error message detailing the cause of the error. + * @return An outcome object with an entityId of the new prefab's container entity; + * on failure, it comes with an error message detailing the cause of the error. */ - virtual PrefabOperationResult CreatePrefabInMemory( + virtual CreatePrefabResult CreatePrefabInMemory( const EntityIdList& entityIds, AZ::IO::PathView filePath) = 0; /** diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestBus.h index 1605ad97be..7b23fffb7f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestBus.h @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -22,8 +23,9 @@ namespace AzToolsFramework namespace Prefab { - using PrefabOperationResult = AZ::Outcome; + using CreatePrefabResult = AZ::Outcome; using InstantiatePrefabResult = AZ::Outcome; + using PrefabOperationResult = AZ::Outcome; /** * The primary purpose of this bus is to facilitate writing automated tests for prefabs. @@ -47,14 +49,16 @@ namespace AzToolsFramework /** * Create a prefab out of the entities provided, at the path provided, and keep it in memory. * Automatically detects descendants of entities, and discerns between entities and child instances. - * Return whether the creation succeeded or not. + * Return an outcome object with an container entity id of the prefab created if creation succeeded; + * on failure, it comes with an error message detailing the cause of the error. */ - virtual PrefabOperationResult CreatePrefabInMemory( + virtual CreatePrefabResult CreatePrefabInMemory( const EntityIdList& entityIds, AZStd::string_view filePath) = 0; /** * Instantiate a prefab from a prefab file. - * Return the container entity id of the prefab instantiated if instantiation succeeded. + * Return an outcome object with an container entity id of the prefab instantiated if instantiation succeeded; + * on failure, it comes with an error message detailing the cause of the error. */ virtual InstantiatePrefabResult InstantiatePrefab( AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) = 0; @@ -62,10 +66,9 @@ namespace AzToolsFramework /** * Deletes all entities and their descendants from the owning instance. Bails if the entities don't * all belong to the same instance. - * Return whether the deletion succeeded or not. + * Return an outcome object; on failure, it comes with an error message detailing the cause of the error. */ virtual PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) = 0; - }; using PrefabPublicRequestBus = AZ::EBus; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.cpp index d964be25af..ad171dc6f4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.cpp @@ -45,7 +45,7 @@ namespace AzToolsFramework m_prefabPublicInterface = nullptr; } - PrefabOperationResult PrefabPublicRequestHandler::CreatePrefabInMemory(const EntityIdList& entityIds, AZStd::string_view filePath) + CreatePrefabResult PrefabPublicRequestHandler::CreatePrefabInMemory(const EntityIdList& entityIds, AZStd::string_view filePath) { return m_prefabPublicInterface->CreatePrefabInMemory(entityIds, filePath); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.h index 87608e1263..ae0ed2a5d1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabPublicRequestHandler.h @@ -31,7 +31,7 @@ namespace AzToolsFramework void Connect(); void Disconnect(); - PrefabOperationResult CreatePrefabInMemory(const EntityIdList& entityIds, AZStd::string_view filePath) override; + CreatePrefabResult CreatePrefabInMemory(const EntityIdList& entityIds, AZStd::string_view filePath) override; InstantiatePrefabResult InstantiatePrefab(AZStd::string_view filePath, AZ::EntityId parent, const AZ::Vector3& position) override; PrefabOperationResult DeleteEntitiesAndAllDescendantsInInstance(const EntityIdList& entityIds) override; From f6ce3678fa4d71f0ea620773afc1f09ca5f7c7c4 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Fri, 3 Sep 2021 12:34:32 -0700 Subject: [PATCH 118/355] Used actual types instead of auto and some more minor changes Signed-off-by: srikappa-amzn --- Code/Editor/CryEdit.cpp | 2 ++ Code/Editor/CryEditDoc.cpp | 6 ++-- Code/Editor/EditorPreferencesPageGeneral.cpp | 4 +-- .../PrefabEditorEntityOwnershipService.cpp | 6 +--- .../AzToolsFramework/Prefab/PrefabLoader.cpp | 2 +- .../AzToolsFramework/Prefab/PrefabLoader.h | 2 +- .../Prefab/PrefabLoaderInterface.h | 2 +- .../Prefab/PrefabSystemComponent.cpp | 32 ++++++++++++------- .../Prefab/PrefabSystemComponent.h | 5 ++- .../Prefab/PrefabSystemComponentInterface.h | 4 +-- .../UI/Prefab/PrefabIntegrationManager.cpp | 10 +++--- 11 files changed, 41 insertions(+), 34 deletions(-) diff --git a/Code/Editor/CryEdit.cpp b/Code/Editor/CryEdit.cpp index 5c0938216a..b5eb4229df 100644 --- a/Code/Editor/CryEdit.cpp +++ b/Code/Editor/CryEdit.cpp @@ -3193,6 +3193,8 @@ bool CCryEditApp::CreateLevel(bool& wasCreateLevelOperationCancelled) int prefabSaveSelection = prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. + // For example, QDialog::Rejected(0) is emitted when dialog is closed. But the int value corresponds to + // QDialogButtonBox::AcceptRole(0). switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 5df046bf54..b1186202f9 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -699,9 +699,7 @@ bool CCryEditDoc::SaveModified() } else { - using namespace AzToolsFramework::Prefab; - - TemplateId rootPrefabTemplateId = m_prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); + AzToolsFramework::Prefab::TemplateId rootPrefabTemplateId = m_prefabEditorEntityOwnershipInterface->GetRootPrefabTemplateId(); if (!m_prefabSystemComponentInterface->AreDirtyTemplatesPresent(rootPrefabTemplateId)) { return true; @@ -710,6 +708,8 @@ bool CCryEditDoc::SaveModified() int prefabSaveSelection = m_prefabIntegrationInterface->ExecuteClosePrefabDialog(rootPrefabTemplateId); // In order to get the accept and reject codes of QDialog and QDialogButtonBox aligned, we do (1-prefabSaveSelection) here. + // For example, QDialog::Rejected(0) is emitted when dialog is closed. But the int value corresponds to + // QDialogButtonBox::AcceptRole(0). switch (1 - prefabSaveSelection) { case QDialogButtonBox::AcceptRole: diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 2cba7e7801..2b044e800a 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -97,7 +97,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_restoreViewportCamera, EditorPreferencesGeneralRestoreViewportCameraSettingName, "Keep the original editor viewport transform when exiting game mode.") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_enableSceneInspector, "Enable Scene Inspector (EXPERIMENTAL)", "Enable the option to inspect the internal data loaded from scene files like .fbx. This is an experimental feature. Restart the Scene Settings if the option is not visible under the Help menu."); - editContext->Class("Global Save Settings (File>Save & Ctrl+S)", "") + editContext->Class("Global Save Settings", "") ->DataElement( AZ::Edit::UIHandlers::ComboBox, &GlobalSaveSettings::m_saveAllPrefabsPreference, "Save Prefabs Preference", "This option controls whether prefabs should be saved along with the level") @@ -128,7 +128,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_generalSettings, "General Settings", "General Editor Preferences") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_globalSaveSettings, "Global Save Settings", "Global Save Settings") + ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_globalSaveSettings, "Global Save Settings", "Global Save Settings (File>Save & Ctrl+S)") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_messaging, "Messaging", "Messaging") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_undo, "Undo", "Undo Preferences") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_deepSelection, "Selection", "Selection") diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index c9365683b5..114f45d501 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -362,11 +362,7 @@ namespace AzToolsFramework Prefab::TemplateId PrefabEditorEntityOwnershipService::GetRootPrefabTemplateId() { AZ_Assert(m_rootInstance, "A valid root prefab instance couldn't be found in PrefabEditorEntityOwnershipService."); - if (m_rootInstance) - { - return m_rootInstance->GetTemplateId(); - } - return Prefab::InvalidTemplateId; + return m_rootInstance ? m_rootInstance->GetTemplateId() : Prefab::InvalidTemplateId; } const AZStd::vector>& PrefabEditorEntityOwnershipService::GetPlayInEditorAssetData() diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 666386d4aa..3db78b1d39 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -670,7 +670,7 @@ namespace AzToolsFramework return finalPath; } - SaveAllPrefabsPreference PrefabLoader::GetSaveAllPrefabsPreference() + SaveAllPrefabsPreference PrefabLoader::GetSaveAllPrefabsPreference() const { SaveAllPrefabsPreference saveAllPrefabsPreference = SaveAllPrefabsPreference::AskEveryTime; if (auto* registry = AZ::SettingsRegistry::Get()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h index 5940d887da..15f201e027 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.h @@ -110,7 +110,7 @@ namespace AzToolsFramework //! Returns if the path is a valid path for a prefab static bool IsValidPrefabPath(AZ::IO::PathView path); - SaveAllPrefabsPreference GetSaveAllPrefabsPreference() override; + SaveAllPrefabsPreference GetSaveAllPrefabsPreference() const override; void SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) override; private: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h index b34f868304..a428f8a7b9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoaderInterface.h @@ -91,7 +91,7 @@ namespace AzToolsFramework //! The path will always use the '/' separator. virtual AZ::IO::Path GenerateRelativePath(AZ::IO::PathView path) = 0; - virtual SaveAllPrefabsPreference GetSaveAllPrefabsPreference() = 0; + virtual SaveAllPrefabsPreference GetSaveAllPrefabsPreference() const = 0; virtual void SetSaveAllPrefabsPreference(SaveAllPrefabsPreference saveAllPrefabsPreference) = 0; protected: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index a4fbd1e251..9059bf5368 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -756,7 +756,7 @@ namespace AzToolsFramework bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId templateId) { - auto prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(templateId); if (!prefabTemplate.has_value()) { @@ -769,9 +769,9 @@ namespace AzToolsFramework return true; } - auto linkIds = prefabTemplate->get().GetLinks(); + const Template::Links& linkIds = prefabTemplate->get().GetLinks(); - for (auto linkId : linkIds) + for (LinkId linkId : linkIds) { auto linkIterator = m_linkIdMap.find(linkId); if (linkIterator != m_linkIdMap.end()) @@ -784,10 +784,9 @@ namespace AzToolsFramework void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId templateId) { - AZStd::set dirtyTemplatePaths; - GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + AZStd::set dirtyTemplatePaths = GetDirtyTemplatePaths(templateId); - for (auto dirtyTemplatePath : dirtyTemplatePaths) + for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) { auto dirtyTemplateIterator = m_templateFilePathToIdMap.find(dirtyTemplatePath); if (dirtyTemplateIterator == m_templateFilePathToIdMap.end()) @@ -801,9 +800,18 @@ namespace AzToolsFramework } } - void PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId, AZStd::set& dirtyTemplatePaths) + AZStd::set PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId) { - auto prefabTemplate = FindTemplate(templateId); + AZStd::vector dirtyTemplatePathVector; + GetDirtyTemplatePathsHelper(templateId, dirtyTemplatePathVector); + AZStd::set dirtyTemplatePaths; + dirtyTemplatePaths.insert(dirtyTemplatePathVector.begin(), dirtyTemplatePathVector.end()); + return AZStd::move(dirtyTemplatePaths); + } + + void PrefabSystemComponent::GetDirtyTemplatePathsHelper(TemplateId templateId, AZStd::vector& dirtyTemplatePaths) + { + TemplateReference prefabTemplate = FindTemplate(templateId); if (!prefabTemplate.has_value()) { @@ -813,17 +821,17 @@ namespace AzToolsFramework if (IsTemplateDirty(templateId)) { - dirtyTemplatePaths.emplace(prefabTemplate->get().GetFilePath()); + dirtyTemplatePaths.emplace_back(prefabTemplate->get().GetFilePath()); } - auto linkIds = prefabTemplate->get().GetLinks(); + const Template::Links& linkIds = prefabTemplate->get().GetLinks(); - for (auto linkId : linkIds) + for (LinkId linkId : linkIds) { auto linkIterator = m_linkIdMap.find(linkId); if (linkIterator != m_linkIdMap.end()) { - GetDirtyTemplatePaths(linkIterator->second.GetSourceTemplateId(), dirtyTemplatePaths); + GetDirtyTemplatePathsHelper(linkIterator->second.GetSourceTemplateId(), dirtyTemplatePaths); } } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 153a0e2b47..a09edfe03a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -187,7 +187,7 @@ namespace AzToolsFramework void SaveAllDirtyTemplates(TemplateId templateId) override; - void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) override; + AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) override; ////////////////////////////////////////////////////////////////////////// @@ -341,6 +341,9 @@ namespace AzToolsFramework */ bool RemoveLinkFromTargetTemplate(const LinkId& linkId, const Link& link); + // Helper function for GetDirtyTemplatePaths(). It uses vector to speed up iteration times. + void GetDirtyTemplatePathsHelper(TemplateId parentTemplateId, AZStd::vector& dirtyTemplatePaths); + // A container for mapping Templates to the Links they may propagate changes to. AZStd::unordered_map> m_templateToLinkIdsMap; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index 98e7719907..72b8fad162 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -61,8 +61,8 @@ namespace AzToolsFramework //! Recursive function that fetches the set of dirty templates given a starting template to check for outgoing links. //! @param templateId The id of the template provided as the beginning template to check the outgoing links. - //! @param[out] dirtyTemplatePaths The set of dirty template paths populated. - virtual void GetDirtyTemplatePaths(TemplateId parentTemplateId, AZStd::set& dirtyTemplatePaths) = 0; + //! @return The set of dirty template paths populated. + virtual AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 3df7e68008..e82e8fa0ca 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1096,13 +1096,12 @@ namespace AzToolsFramework { SavePrefabsInDialog(prefabSaveSelectionDialog.get()); } + return prefabSaveSelection; } void PrefabIntegrationManager::ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) { - using namespace AzToolsFramework::Prefab; - auto prefabTemplate = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path prefabTemplatePath = prefabTemplate->get().GetFilePath(); @@ -1252,8 +1251,8 @@ namespace AzToolsFramework levelEntitiesSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); contentLayout->addWidget(prefabSaveWarningFrame); - AZStd::set dirtyTemplatePaths; - s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + AZStd::set dirtyTemplatePaths = s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId); + auto templateToSave = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path templateToSaveFilePath = templateToSave->get().GetFilePath(); AZStd::unique_ptr unsavedPrefabsCard = ConstructUnsavedPrefabsCard(templateId); @@ -1284,8 +1283,7 @@ namespace AzToolsFramework { FlowLayout* unsavedPrefabsLayout = new FlowLayout(AzToolsFramework::GetActiveWindow()); - AZStd::set dirtyTemplatePaths; - s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId, dirtyTemplatePaths); + AZStd::set dirtyTemplatePaths = s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId); for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) { From ec8e6bcadf19d684cab8a01140c5175e81bf1934 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 13:27:31 -0700 Subject: [PATCH 119/355] Fixes clang cases Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/Commands/CommandManager.cpp | 15 ++---- Code/Editor/ConsoleDialog.cpp | 2 +- Code/Editor/LogFile.cpp | 6 +-- Code/Editor/Objects/ObjectManager.cpp | 2 +- Code/Editor/Plugins/FFMPEGPlugin/main.cpp | 6 +-- Code/Editor/PythonEditorFuncs.cpp | 2 +- .../ActionDispatcher.h | 3 +- .../Include/Atom/Utils/ImGuiCpuProfiler.inl | 8 +-- .../Include/Atom/Utils/ImGuiGpuProfiler.inl | 38 +++++++------- .../Code/Include/Atom/Utils/ImGuiPassTree.inl | 4 +- .../Include/Atom/Utils/ImGuiShaderMetrics.inl | 2 +- Gems/Atom/Utils/Code/atom_utils_files.cmake | 2 + .../AtomFont/Code/Source/AtomFont.cpp | 16 ++---- .../AtomFont/Code/Source/FontRenderer.cpp | 3 +- Gems/AudioSystem/Code/Source/Engine/ATL.cpp | 42 ++++++--------- .../Code/Source/Engine/FileCacheManager.cpp | 4 +- .../LYCommonMenu/ImGuiLYEntityOutliner.cpp | 52 +++++++++---------- .../Code/Source/Animation/AzEntityNode.cpp | 20 +++---- .../Code/Source/UiInteractableState.cpp | 5 +- 19 files changed, 96 insertions(+), 136 deletions(-) diff --git a/Code/Editor/Commands/CommandManager.cpp b/Code/Editor/Commands/CommandManager.cpp index 5f194971f5..4943621493 100644 --- a/Code/Editor/Commands/CommandManager.cpp +++ b/Code/Editor/Commands/CommandManager.cpp @@ -236,10 +236,7 @@ QString CEditorCommandManager::Execute(const AZStd::string& module, const AZStd: } else { - QString errMsg; - - errMsg = QStringLiteral("Error: Trying to execute a unknown command, '%1'!").arg(fullName.c_str()); - CryLogAlways(errMsg.toUtf8().data()); + CryLogAlways("Error: Trying to execute a unknown command, '%s'!", fullName.c_str()); } return ""; @@ -272,10 +269,7 @@ QString CEditorCommandManager::Execute(const AZStd::string& cmdLine) } else { - QString errMsg; - - errMsg = QStringLiteral("Error: Trying to execute a unknown command, '%1'!").arg(cmdLine.c_str()); - CryLogAlways(errMsg.toUtf8().data()); + CryLogAlways("Error: Trying to execute a unknown command, '%s'!", cmdLine.c_str()); } return ""; @@ -294,10 +288,7 @@ void CEditorCommandManager::Execute(int commandId) } else { - QString errMsg; - - errMsg = QStringLiteral("Error: Trying to execute a unknown command of ID '%1'!").arg(commandId); - CryLogAlways(errMsg.toUtf8().data()); + CryLogAlways("Error: Trying to execute a unknown command of ID '%d'!", commandId); } } diff --git a/Code/Editor/ConsoleDialog.cpp b/Code/Editor/ConsoleDialog.cpp index 2f1c3e6f58..7edb12c18c 100644 --- a/Code/Editor/ConsoleDialog.cpp +++ b/Code/Editor/ConsoleDialog.cpp @@ -36,7 +36,7 @@ void CConsoleDialog::SetInfoText(const char* text) { if (gEnv && gEnv->pLog) // before log system was initialized { - CryLogAlways(text); + CryLogAlways("%s", text); } } diff --git a/Code/Editor/LogFile.cpp b/Code/Editor/LogFile.cpp index 92186901d7..0812740efe 100644 --- a/Code/Editor/LogFile.cpp +++ b/Code/Editor/LogFile.cpp @@ -67,7 +67,7 @@ SANDBOX_API void ErrorV(const char* format, va_list argList) str += szBuffer; //CLogFile::WriteLine( str ); - CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_ERROR, str.toUtf8().data()); + CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_ERROR, "%s", str.toUtf8().data()); if (!CCryEditApp::instance()->IsInTestMode() && !CCryEditApp::instance()->IsInExportMode() && !CCryEditApp::instance()->IsInLevelLoadTestMode()) { @@ -95,7 +95,7 @@ SANDBOX_API void WarningV(const char* format, va_list argList) char szBuffer[MAX_LOGBUFFER_SIZE]; azvsnprintf(szBuffer, MAX_LOGBUFFER_SIZE, format, argList); - CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, szBuffer); + CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, "%s", szBuffer); bool bNoUI = false; ICVar* pCVar = gEnv->pConsole->GetCVar("sys_no_crash_dialog"); @@ -478,7 +478,7 @@ void CLogFile::WriteString(const char* pszString) { if (gEnv && gEnv->pLog) { - gEnv->pLog->LogPlus(pszString); + gEnv->pLog->LogPlus("%s", pszString); } } diff --git a/Code/Editor/Objects/ObjectManager.cpp b/Code/Editor/Objects/ObjectManager.cpp index 30ee1fc57b..55b6fea57c 100644 --- a/Code/Editor/Objects/ObjectManager.cpp +++ b/Code/Editor/Objects/ObjectManager.cpp @@ -709,7 +709,7 @@ void CObjectManager::ShowDuplicationMsgWarning(CBaseObject* obj, const QString& ); // If id is taken. - CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, sRenameWarning.toUtf8().data()); + CryWarning(VALIDATOR_MODULE_EDITOR, VALIDATOR_WARNING, "%s", sRenameWarning.toUtf8().data()); if (bShowMsgBox) { diff --git a/Code/Editor/Plugins/FFMPEGPlugin/main.cpp b/Code/Editor/Plugins/FFMPEGPlugin/main.cpp index ce0e91942b..847d426922 100644 --- a/Code/Editor/Plugins/FFMPEGPlugin/main.cpp +++ b/Code/Editor/Plugins/FFMPEGPlugin/main.cpp @@ -24,11 +24,9 @@ PLUGIN_API IPlugin* CreatePluginInstance(PLUGIN_INIT_PARAM* pInitParam) // Make sure the ffmpeg command can be executed before registering the command if (!CFFMPEGPlugin::RuntimeTest()) { - AZStd::string msg = - "FFMPEG plugin: Failed to execute FFmepg. Please run Setup Assistant, " + GetIEditor()->GetSystem()->GetILog()->Log("FFMPEG plugin: Failed to execute FFmepg. Please run Setup Assistant, " "go to the 'Optional software' section of the 'Install software' tab, " - "and make sure the FFmpeg executable is correctly configured."; - GetIEditor()->GetSystem()->GetILog()->Log(msg.c_str()); + "and make sure the FFmpeg executable is correctly configured."); } else { diff --git a/Code/Editor/PythonEditorFuncs.cpp b/Code/Editor/PythonEditorFuncs.cpp index 342cc607d7..200fd28f87 100644 --- a/Code/Editor/PythonEditorFuncs.cpp +++ b/Code/Editor/PythonEditorFuncs.cpp @@ -313,7 +313,7 @@ namespace { if (strcmp(pMessage, "") != 0) { - CryLogAlways(pMessage); + CryLogAlways("%s", pMessage); } } diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h index 523e6a30a7..6ae09340e3 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h @@ -92,8 +92,7 @@ namespace AzManipulatorTestFramework { if (m_logging) { - AZStd::string message = AZStd::string::format(format, args...); - AZ_Printf("[ActionDispatcher] %s", message.c_str()); + AZ_Printf("ActionDispatcher", format, args...); } } diff --git a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiCpuProfiler.inl b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiCpuProfiler.inl index cd9e4fc2b5..61f68197b6 100644 --- a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiCpuProfiler.inl +++ b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiCpuProfiler.inl @@ -288,11 +288,11 @@ namespace AZ continue; } - ImGui::Text(statistics->m_groupName.c_str()); + ImGui::Text("%s", statistics->m_groupName.c_str()); const ImVec2 topLeftBound = ImGui::GetItemRectMin(); ImGui::TableNextColumn(); - ImGui::Text(statistics->m_regionName.c_str()); + ImGui::Text("%s", statistics->m_regionName.c_str()); ImGui::TableNextColumn(); ImGui::Text("%.2f", CpuProfilerImGuiHelper::TicksToMs(statistics->m_runningAverageTicks)); @@ -313,7 +313,7 @@ namespace AZ if (ImGui::IsWindowHovered() && ImGui::IsMouseHoveringRect(topLeftBound, botRightBound, false)) { ImGui::BeginTooltip(); - ImGui::Text(statistics->GetExecutingThreadsLabel().c_str()); + ImGui::Text("%s", statistics->GetExecutingThreadsLabel().c_str()); ImGui::EndTooltip(); } } @@ -363,7 +363,7 @@ namespace AZ const auto ShowRow = [&ShowTimeInMs](const char* regionLabel, AZStd::sys_time_t duration) { - ImGui::Text(regionLabel); + ImGui::Text("%s", regionLabel); ImGui::NextColumn(); ShowTimeInMs(duration); diff --git a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl index 9b2f2b0dd9..80dcace2df 100644 --- a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl +++ b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiGpuProfiler.inl @@ -279,13 +279,13 @@ namespace AZ const AZStd::string totalPassCountLabel = AZStd::string::format("%s: %u", "Total Pass Count", static_cast(passEntryDatabase.size())); - ImGui::Text(totalPassCountLabel.c_str()); + ImGui::Text("%s", totalPassCountLabel.c_str()); // Display listed pass count. const AZStd::string listedPassCountLabel = AZStd::string::format("%s: %u", "Listed Pass Count", static_cast(m_passEntryReferences.size())); - ImGui::Text(listedPassCountLabel.c_str()); + ImGui::Text("%s", listedPassCountLabel.c_str()); } } @@ -404,7 +404,7 @@ namespace AZ passName = AZStd::string::format("%s (%s)", passName.c_str(), passTreeState); } - ImGui::Text(passName.c_str()); + ImGui::Text("%s", passName.c_str()); // Show a HoverMarker if the text is bigger than the column. const ImVec2 textSize = ImGui::CalcTextSize(passName.c_str()); @@ -480,7 +480,7 @@ namespace AZ } else { - ImGui::Text(label.c_str()); + ImGui::Text("%s", label.c_str()); } if (textColorChanged) @@ -683,7 +683,7 @@ namespace AZ // Draw the frame time (GPU). const AZStd::string formattedTimestamp = FormatTimestampLabel(gpuTimestamp.GetDurationInNanoseconds()); const AZStd::string headerFrameTime = AZStd::string::format("Total frame duration (GPU): %s", formattedTimestamp.c_str()); - ImGui::Text(headerFrameTime.c_str()); + ImGui::Text("%s", headerFrameTime.c_str()); // Draw the viewing option. ImGui::RadioButton("Hierarchical", reinterpret_cast(&m_viewType), static_cast(ProfilerViewType::Hierarchical)); @@ -810,7 +810,7 @@ namespace AZ { const int32_t timestampMetricUnitNumeric = static_cast(m_timestampMetricUnit); const AZStd::string metricUnitText = AZStd::string::format("Time in %s", MetricUnitText[timestampMetricUnitNumeric]); - ImGui::Text(metricUnitText.c_str()); + ImGui::Text("%s", metricUnitText.c_str()); ImGui::NextColumn(); } @@ -818,7 +818,7 @@ namespace AZ { const int32_t frameWorkloadViewNumeric = static_cast(m_frameWorkloadView); const AZStd::string frameWorkloadViewText = AZStd::string::format("Frame workload in %s FPS", FrameWorkloadUnit[frameWorkloadViewNumeric]); - ImGui::Text(frameWorkloadViewText.c_str()); + ImGui::Text("%s", frameWorkloadViewText.c_str()); ImGui::NextColumn(); } @@ -853,7 +853,7 @@ namespace AZ const int32_t frameWorkloadViewNumeric = static_cast(m_frameWorkloadView); const AZStd::string frameWorkloadViewText = AZStd::string::format("Frame workload in %s FPS", FrameWorkloadUnit[frameWorkloadViewNumeric]); - ImGui::Text(frameWorkloadViewText.c_str()); + ImGui::Text("%s", frameWorkloadViewText.c_str()); ImGui::NextColumn(); } @@ -907,7 +907,7 @@ namespace AZ } else { - ImGui::Text(entryTime.c_str()); + ImGui::Text("%s", entryTime.c_str()); ImGui::NextColumn(); DrawFrameWorkloadBar(NormalizeFrameWorkload(entry->m_interpolatedTimestampInNanoseconds)); ImGui::NextColumn(); @@ -927,7 +927,7 @@ namespace AZ if (entry->m_children.empty()) { // Draw the workload bar when it doesn't have children. - ImGui::Text(entry->m_name.GetCStr()); + ImGui::Text("%s", entry->m_name.GetCStr()); // Show a HoverMarker if the text is bigger than the column. createHoverMarker(entry->m_name.GetCStr()); @@ -991,9 +991,9 @@ namespace AZ } const AZStd::string entryTime = FormatTimestampLabel(entry->m_interpolatedTimestampInNanoseconds); - ImGui::Text(entry->m_name.GetCStr()); + ImGui::Text("%s", entry->m_name.GetCStr()); ImGui::NextColumn(); - ImGui::Text(entryTime.c_str()); + ImGui::Text("%s", entryTime.c_str()); ImGui::NextColumn(); DrawFrameWorkloadBar(NormalizeFrameWorkload(entry->m_interpolatedTimestampInNanoseconds)); ImGui::NextColumn(); @@ -1131,13 +1131,13 @@ namespace AZ continue; } - ImGui::Text(tableRow.m_parentPoolName.GetCStr()); + ImGui::Text("%s", tableRow.m_parentPoolName.GetCStr()); ImGui::TableNextColumn(); - ImGui::Text(tableRow.m_bufImgName.GetCStr()); + ImGui::Text("%s", tableRow.m_bufImgName.GetCStr()); ImGui::TableNextColumn(); ImGui::Text("%.4f", 1.0f * tableRow.m_sizeInBytes / GpuProfilerImGuiHelper::MB); ImGui::TableNextColumn(); - ImGui::Text(tableRow.m_bindFlags.c_str()); + ImGui::Text("%s", tableRow.m_bindFlags.c_str()); ImGui::TableNextColumn(); } } @@ -1244,20 +1244,20 @@ namespace AZ { if (ImGui::BeginChild(savedHeap.m_name.GetCStr(), { ImGui::GetWindowWidth() / m_savedHeaps.size(), 250 }), ImGuiWindowFlags_NoScrollbar) { - ImGui::Text(savedHeap.m_name.GetCStr()); + ImGui::Text("%s", savedHeap.m_name.GetCStr()); ImGui::Columns(2, "HeapData", true); - ImGui::Text("Resident (MB): "); + ImGui::Text("%s", "Resident (MB): "); ImGui::NextColumn(); ImGui::Text("%.2f", 1.0 * savedHeap.m_memoryUsage.m_residentInBytes.load() / GpuProfilerImGuiHelper::MB); ImGui::NextColumn(); - ImGui::Text("Reserved (MB): "); + ImGui::Text("%s", "Reserved (MB): "); ImGui::NextColumn(); ImGui::Text("%.2f", 1.0 * savedHeap.m_memoryUsage.m_reservedInBytes.load() / GpuProfilerImGuiHelper::MB); ImGui::NextColumn(); - ImGui::Text("Budget (MB): "); + ImGui::Text("%s", "Budget (MB): "); ImGui::NextColumn(); ImGui::Text("%.2f", 1.0 * savedHeap.m_memoryUsage.m_budgetInBytes / GpuProfilerImGuiHelper::MB); diff --git a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiPassTree.inl b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiPassTree.inl index a9eff68c7a..fa649ed47b 100644 --- a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiPassTree.inl +++ b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiPassTree.inl @@ -100,7 +100,7 @@ namespace AZ::Render } } - ImGui::TextWrapped(m_attachmentReadbackInfo.c_str()); + ImGui::TextWrapped("%s", m_attachmentReadbackInfo.c_str()); } if (m_previewAttachment && m_selectedChanged) @@ -211,7 +211,7 @@ namespace AZ::Render else { // Only draw text (not selectable) if there is no attachment binded to the slot. - ImGui::Text(label.c_str()); + ImGui::Text("%s", label.c_str()); } } diff --git a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiShaderMetrics.inl b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiShaderMetrics.inl index 772be4d4a8..73517c66ca 100644 --- a/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiShaderMetrics.inl +++ b/Gems/Atom/Utils/Code/Include/Atom/Utils/ImGuiShaderMetrics.inl @@ -61,7 +61,7 @@ namespace AZ ImGui::Text("%d", request.m_requestCount); ImGui::NextColumn(); - ImGui::Text(request.m_shaderName.GetCStr()); + ImGui::Text("%s", request.m_shaderName.GetCStr()); ImGui::NextColumn(); ImGui::Text("%d", request.m_shaderVariantStableId.GetIndex()); diff --git a/Gems/Atom/Utils/Code/atom_utils_files.cmake b/Gems/Atom/Utils/Code/atom_utils_files.cmake index 06b78a49c4..b1f8170317 100644 --- a/Gems/Atom/Utils/Code/atom_utils_files.cmake +++ b/Gems/Atom/Utils/Code/atom_utils_files.cmake @@ -19,6 +19,8 @@ set(FILES Include/Atom/Utils/ImGuiPassTree.inl Include/Atom/Utils/ImGuiFrameVisualizer.h Include/Atom/Utils/ImGuiFrameVisualizer.inl + Include/Atom/Utils/ImGuiShaderMetrics.h + Include/Atom/Utils/ImGuiShaderMetrics.inl Include/Atom/Utils/ImGuiTransientAttachmentProfiler.h Include/Atom/Utils/ImGuiTransientAttachmentProfiler.inl Include/Atom/Utils/PpmFile.h diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFont.cpp b/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFont.cpp index 8c88a49b12..5711e3ff6e 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFont.cpp +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFont.cpp @@ -731,20 +731,14 @@ IFFont* AZ::AtomFont::LoadFont(const char* fontName) font = NewFont(fontNameLower.c_str()); if (!font) { - AZStd::string errorMsg = "Error creating a new font named "; - errorMsg += fontNameLower; - errorMsg += "."; - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, errorMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, "Error creating a new font named %s.", fontNameLower.c_str()); } else { // creating font adds one to its refcount so no need for AddRef here if (!font->Load(fontNameLower.c_str())) { - AZStd::string errorMsg = "Error loading a font from "; - errorMsg += fontNameLower; - errorMsg += "."; - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, errorMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, "Error loading a font from %s.", fontNameLower.c_str()); font->Release(); font = nullptr; } @@ -792,8 +786,7 @@ bool AZ::AtomFont::AddFontFamilyToMaps(const char* fontFamilyFilename, const cha AZStd::to_lower(loweredFilename.begin(), loweredFilename.end()); if (m_fontFamilies.find(loweredFilename) != m_fontFamilies.end()) { - AZStd::string warnMsg = AZStd::string::format("Couldn't load Font Family '%s': already loaded", fontFamilyFilename); - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, warnMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "Couldn't load Font Family '%s': already loaded", fontFamilyFilename); return false; } @@ -803,8 +796,7 @@ bool AZ::AtomFont::AddFontFamilyToMaps(const char* fontFamilyFilename, const cha AZStd::to_lower(loweredFontFamilyName.begin(), loweredFontFamilyName.end()); if (m_fontFamilies.find(loweredFontFamilyName) != m_fontFamilies.end()) { - AZStd::string warnMsg = AZStd::string::format("Couldn't load Font Family '%s': already loaded", fontFamilyName); - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, warnMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "Couldn't load Font Family '%s': already loaded", fontFamilyName); return false; } diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp b/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp index f1fc8be965..ed5e0e50bc 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/FontRenderer.cpp @@ -311,8 +311,7 @@ Vec2 AZ::FontRenderer::GetKerning(uint32_t leftGlyph, uint32_t rightGlyph) #if !defined(_RELEASE) if (0 != ftError) { - AZStd::string warnMsg = AZStd::string::format("FT_Get_Kerning returned %d", ftError); - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, warnMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "FT_Get_Kerning returned %d", ftError); } #endif } diff --git a/Gems/AudioSystem/Code/Source/Engine/ATL.cpp b/Gems/AudioSystem/Code/Source/Engine/ATL.cpp index 8fbb8fffc0..e43f7beba7 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATL.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/ATL.cpp @@ -2170,25 +2170,15 @@ namespace Audio const AZ::Color yellowColor(colorMax, colorMax, colorMin, 0.9f); const AZ::Color redColor(colorMax, colorMin, colorMin, 0.9f); - constexpr const char* tableHeaderNames[] = { - "ID", - "Name", - "Curr Used", - "Peak Used", - "%% of Used", - "Allocs", - "Frees", - }; - constexpr size_t numColumns = AZStd::size(tableHeaderNames); - constexpr float xTablePositions[numColumns] = { 0.f, 40.f, 300.f, 400.f, 500.f, 600.f, 700.f }; - float posY = fPosY; - - // Draw the header info: - for (int column = 0; column < numColumns; ++column) - { - auxGeom.Draw2dLabel(fPosX + xTablePositions[column], posY, textSize, color, false, tableHeaderNames[column]); - } + constexpr float xTablePositions[7] = { 0.f, 40.f, 300.f, 400.f, 500.f, 600.f, 700.f }; + auxGeom.Draw2dLabel(fPosX + xTablePositions[0], posY, textSize, color, false, "ID"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY, textSize, color, false, "Name"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[2], posY, textSize, color, false, "Curr Used"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[3], posY, textSize, color, false, "Peak Used"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[4], posY, textSize, color, false, "%% of Used"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[5], posY, textSize, color, false, "Allocs"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[6], posY, textSize, color, false, "Frees"); // Get the memory pool information... AZStd::vector poolInfos; @@ -2232,15 +2222,15 @@ namespace Audio auxGeom.Draw2dLabel(fPosX + xTablePositions[0], posY, textSize, color, false, "%d", poolInfo.m_poolId); // Name - auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY, textSize, color, false, poolInfo.m_poolName); + auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY, textSize, color, false, "%s", poolInfo.m_poolName); // Current Used (bytes) BytesToString(poolInfo.m_memoryUsed, buffer, bufferSize); - auxGeom.Draw2dLabel(fPosX + xTablePositions[2], posY, textSize, color, false, buffer); + auxGeom.Draw2dLabel(fPosX + xTablePositions[2], posY, textSize, color, false, "%s", buffer); // Peak Used (bytes) BytesToString(poolInfo.m_peakUsed, buffer, bufferSize); - auxGeom.Draw2dLabel(fPosX + xTablePositions[3], posY, textSize, color, false, buffer); + auxGeom.Draw2dLabel(fPosX + xTablePositions[3], posY, textSize, color, false, "%s", buffer); // % of Used (percent) auxGeom.Draw2dLabel(fPosX + xTablePositions[4], posY, textSize, color, false, "%.1f %%", percentUsed); @@ -2255,20 +2245,20 @@ namespace Audio whiteColor.StoreToFloat4(color); posY += (2.f * lineHeight); - auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY, textSize, color, false, tableHeaderNames[1]); - auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY + lineHeight, textSize, color, false, globalInfo.m_poolName); + auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY, textSize, color, false, "Name"); + auxGeom.Draw2dLabel(fPosX + xTablePositions[1], posY + lineHeight, textSize, color, false, "%s", globalInfo.m_poolName); auxGeom.Draw2dLabel(fPosX + xTablePositions[2], posY, textSize, color, false, "Total Used"); BytesToString(globalInfo.m_memoryUsed, buffer, bufferSize); - auxGeom.Draw2dLabel(fPosX + xTablePositions[2], posY + lineHeight, textSize, color, false, buffer); + auxGeom.Draw2dLabel(fPosX + xTablePositions[2], posY + lineHeight, textSize, color, false, "%s", buffer); auxGeom.Draw2dLabel(fPosX + xTablePositions[3], posY, textSize, color, false, "Total Peak"); BytesToString(totalPeak, buffer, bufferSize); - auxGeom.Draw2dLabel(fPosX + xTablePositions[3], posY + lineHeight, textSize, color, false, buffer); + auxGeom.Draw2dLabel(fPosX + xTablePositions[3], posY + lineHeight, textSize, color, false, "%s", buffer); auxGeom.Draw2dLabel(fPosX + xTablePositions[4], posY, textSize, color, false, "Total Size"); BytesToString(globalInfo.m_memoryReserved, buffer, bufferSize); - auxGeom.Draw2dLabel(fPosX + xTablePositions[4], posY + lineHeight, textSize, color, false, buffer); + auxGeom.Draw2dLabel(fPosX + xTablePositions[4], posY + lineHeight, textSize, color, false, "%s", buffer); auxGeom.Draw2dLabel(fPosX + xTablePositions[5], posY, textSize, color, false, "Total Allocs"); auxGeom.Draw2dLabel(fPosX + xTablePositions[5], posY + lineHeight, textSize, color, false, "%" PRIu64, totalAllocs); diff --git a/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp b/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp index b106c4f9d2..b7ed9229d8 100644 --- a/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/FileCacheManager.cpp @@ -446,13 +446,13 @@ namespace Audio } // Format: "relative/path/filename.ext (230 KiB) [2]" - AZStd::string displayString = AZStd::string::format("%s (%zu %s) [%zu]", + auxGeom.Draw2dLabel(positionX, positionY, entryDrawSize, color, false, + "%s (%zu %s) [%zu]", audioFileEntry->m_filePath.c_str(), fileSize, kiloBytes ? "KiB" : "Bytes", audioFileEntry->m_useCount); - auxGeom.Draw2dLabel(positionX, positionY, entryDrawSize, color, false, displayString.c_str()); color[3] = originalAlpha; positionY += entryStepSize; } diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp index 7f4877347f..2df6c9984b 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYEntityOutliner.cpp @@ -84,99 +84,99 @@ namespace ImGui ImGui::Columns(3); ImGui::TextColored(m_displayName.m_color, "Display Name"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayNameCB", &m_displayName.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayNameCol", reinterpret_cast(&m_displayName.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayChildCount.m_color, "Display Child Count"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayChildCountCB", &m_displayChildCount.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayChildCountCol", reinterpret_cast(&m_displayChildCount.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayDescentdantCount.m_color, "Display Descendant Count"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayDescendantCountCB", &m_displayDescentdantCount.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayDescendantCountCol", reinterpret_cast(&m_displayDescentdantCount.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayEntityState.m_color, "Display Entity Status"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayEntityStateCB", &m_displayEntityState.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayEntityStateCol", reinterpret_cast(&m_displayEntityState.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayParentInfo.m_color, "Display Parent Info"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayParentInfoCB", &m_displayParentInfo.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayParentInfoCol", reinterpret_cast(&m_displayParentInfo.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayLocalPos.m_color, "Display Local Position"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayLocalPosCB", &m_displayLocalPos.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayLocalPosCol", reinterpret_cast(&m_displayLocalPos.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayLocalRotation.m_color, "Display Local Rotation"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayLocalRotationCB", &m_displayLocalRotation.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayLocalRotationCol", reinterpret_cast(&m_displayLocalRotation.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayWorldPos.m_color, "Display World Position"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayWorldPosCB", &m_displayWorldPos.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayWorldPosCol", reinterpret_cast(&m_displayWorldPos.m_color)); ImGui::NextColumn(); ImGui::TextColored(m_displayWorldRotation.m_color, "Display World Rotation"); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_OnText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_OnText); ImGui::SameLine(); ImGui::Checkbox("##DisplayWorldRotationCB", &m_displayWorldRotation.m_enabled); ImGui::NextColumn(); - ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, s_ColorText); + ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "%s", s_ColorText); ImGui::SameLine(); ImGui::ColorEdit4("##DisplayWorldRotationCol", reinterpret_cast(&m_displayWorldRotation.m_color)); @@ -508,7 +508,7 @@ namespace ImGui } else if (sameLine) { - if (ImGui::TreeNode(childTreeNodeStr.c_str(), childTreeNodeStr.c_str())) + if (ImGui::TreeNode(childTreeNodeStr.c_str(), "%s", childTreeNodeStr.c_str())) { ImGuiUpdate_RecursivelyDisplayEntityInfoAndDecendants_DrawDisplayOptions(node, drawInspectButton, drawTargetButton, drawDebugButton, sameLine, drawComponents); @@ -528,7 +528,7 @@ namespace ImGui { ImGuiUpdate_RecursivelyDisplayEntityInfoAndDecendants_DrawDisplayOptions(node, drawInspectButton, drawTargetButton, drawDebugButton, sameLine, drawComponents); childTreeNodeStr = AZStd::string::format("Children ##%s", childTreeNodeStr.c_str()); - if (ImGui::TreeNode(childTreeNodeStr.c_str(), childTreeNodeStr.c_str())) + if (ImGui::TreeNode(childTreeNodeStr.c_str(), "%s", childTreeNodeStr.c_str())) { for (int i = 0; i < node->m_children.size(); i++) { @@ -542,7 +542,7 @@ namespace ImGui else if (!justDrawChildren) { ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "->"); ImGui::SameLine(); - ImGui::Text(childTreeNodeStr.c_str()); + ImGui::Text("%s", childTreeNodeStr.c_str()); ImGuiUpdate_RecursivelyDisplayEntityInfoAndDecendants_DrawDisplayOptions(node, drawInspectButton, drawTargetButton, drawDebugButton, sameLine, drawComponents); } } @@ -561,7 +561,7 @@ namespace ImGui { ImGui::SameLine(); } - ImGui::TextColored(m_displayName.m_color, entityName.c_str()); + ImGui::TextColored(m_displayName.m_color, "%s", entityName.c_str()); } // Draw EntityViewer Button @@ -762,7 +762,7 @@ namespace ImGui { // Draw collapsible menu for the components set AZStd::string uiLabel = AZStd::string::format("Components##%s", node->m_entityId.ToString().c_str()); - if (ImGui::TreeNode(uiLabel.c_str(), uiLabel.c_str())) + if (ImGui::TreeNode(uiLabel.c_str(), "%s", uiLabel.c_str())) { AZ::Entity::ComponentArrayType components = entity->GetComponents(); // we should sort our array of components based on their names. @@ -781,7 +781,7 @@ namespace ImGui bool hasDebug = ComponentHasDebug(component->RTTI_GetType()); // Draw a collapsible menu for each component uiLabel = AZStd::string::format("%s##%s", component->RTTI_GetTypeName(), node->m_entityId.ToString().c_str()); - if (ImGui::TreeNode(uiLabel.c_str(), uiLabel.c_str())) + if (ImGui::TreeNode(uiLabel.c_str(), "%s", uiLabel.c_str())) { if (hasDebug) { @@ -795,7 +795,7 @@ namespace ImGui // Draw a collapsible menu for all Reflected Properties uiLabel = AZStd::string::format("Reflected Properties##%s", node->m_entityId.ToString().c_str()); - if (ImGui::TreeNode(uiLabel.c_str(), uiLabel.c_str())) + if (ImGui::TreeNode(uiLabel.c_str(), "%s", uiLabel.c_str())) { AZ::SerializeContext *serializeContext = nullptr; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext); @@ -820,7 +820,7 @@ namespace ImGui if (hasDebug) { uiLabel = AZStd::string::format("Debug##%s", node->m_entityId.ToString().c_str()); - if (ImGui::TreeNode(uiLabel.c_str(), uiLabel.c_str())) + if (ImGui::TreeNode(uiLabel.c_str(), "%s", uiLabel.c_str())) { // Attempt to draw any debug information for this component ImGuiUpdateDebugComponentListenerBus::Event(ImGuiEntComponentId(node->m_entityId, component->RTTI_GetType()) diff --git a/Gems/LyShine/Code/Source/Animation/AzEntityNode.cpp b/Gems/LyShine/Code/Source/Animation/AzEntityNode.cpp index cc4e70e010..2b31726d3e 100644 --- a/Gems/LyShine/Code/Source/Animation/AzEntityNode.cpp +++ b/Gems/LyShine/Code/Source/Animation/AzEntityNode.cpp @@ -256,20 +256,12 @@ const AZ::SerializeContext::ClassElement* CUiAnimAzEntityNode::ComputeOffsetFrom if (mismatch) { - AZStd::string warnMsg = "Data mismatch reading animation data for type "; - warnMsg += classData->m_typeId.ToString(); - warnMsg += ". The field \""; - warnMsg += paramData.GetName(); - if (!element) - { - warnMsg += "\" cannot be found."; - } - else - { - warnMsg += "\" has a different type to that in the animation data."; - } - warnMsg += " This part of the animation data will be ignored."; - CryWarning(VALIDATOR_MODULE_SHINE, VALIDATOR_WARNING, warnMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SHINE, VALIDATOR_WARNING, + "Data mismatch reading animation data for type %s. The field \"%s\" %s. This part of the animation data will be ignored.", + classData->m_typeId.ToString().c_str(), + paramData.GetName(), + (!element ? "cannot be found" : "has a different type to that in the animation data") + ); return nullptr; } } diff --git a/Gems/LyShine/Code/Source/UiInteractableState.cpp b/Gems/LyShine/Code/Source/UiInteractableState.cpp index e81c48a43a..6027ecf3d7 100644 --- a/Gems/LyShine/Code/Source/UiInteractableState.cpp +++ b/Gems/LyShine/Code/Source/UiInteractableState.cpp @@ -575,10 +575,7 @@ void UiInteractableStateFont::SetFontPathname(const AZStd::string& pathname) fontFamily = gEnv->pCryFont->LoadFontFamily(fileName.c_str()); if (!fontFamily) { - AZStd::string errorMsg = "Error loading a font from "; - errorMsg += fileName.c_str(); - errorMsg += "."; - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, errorMsg.c_str()); + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, "Error loading a font from %s.", fileName.c_str()); } } From 15e889a2f6ca010ab2b72ed69313f0e38fe3842d Mon Sep 17 00:00:00 2001 From: hershey5045 <43485729+hershey5045@users.noreply.github.com> Date: Fri, 3 Sep 2021 13:51:15 -0700 Subject: [PATCH 120/355] Reintroduce materialtype dependency on fbx files. (#3934) Signed-off-by: Robin Co-authored-by: Robin --- .../RPI.Builders/Model/MaterialAssetBuilderComponent.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp index 4c2876dc0c..0ac5b61662 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp @@ -80,7 +80,8 @@ namespace AZ bool includeMaterialPropertyNames = true; RPI::MaterialConverterBus::BroadcastResult(includeMaterialPropertyNames, &RPI::MaterialConverterBus::Events::ShouldIncludeMaterialPropertyNames); - if (conversionEnabled && !materialTypePath.empty() && !includeMaterialPropertyNames) + // TODO: Use includeMaterialPropertyNames to break materialtype dependency on fbx files. Materialasset's dependency on materialtypeasset will need to be decoupled first + if (conversionEnabled && !materialTypePath.empty() /*&& !includeMaterialPropertyNames*/) { AssetBuilderSDK::SourceFileDependency materialTypeSource; materialTypeSource.m_sourceFileDependencyPath = materialTypePath; From e1e1779ec6fac1bca330a7e251a4f7b39b2fd8cc Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Fri, 3 Sep 2021 14:04:06 -0700 Subject: [PATCH 121/355] Fix for file size limit in JSON Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../AzCore/Serialization/Json/JsonUtils.cpp | 49 ++++++++++ .../AzCore/Serialization/Json/JsonUtils.h | 3 + .../Assets/ScriptCanvasAssetHandler.cpp | 96 +++++++++++++------ .../Assets/ScriptCanvasAssetHandler.h | 5 + .../Assets/ScriptCanvasBaseAssetData.cpp | 25 +++++ .../Assets/ScriptCanvasBaseAssetData.h | 4 + .../Code/scriptcanvasgem_editor_files.cmake | 2 + 7 files changed, 157 insertions(+), 27 deletions(-) create mode 100644 Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp index af35842afc..b887e8c66c 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp @@ -308,6 +308,55 @@ namespace AZ return AZ::Success(); } + AZ::Outcome LoadObjectFromStringByType(void* objectToLoad, const Uuid& classId, AZStd::string_view stream, + const JsonDeserializerSettings* settings) + { + JsonDeserializerSettings loadSettings; + AZStd::string deserializeErrors; + auto prepare = PrepareDeserializerSettings(settings, loadSettings, deserializeErrors); + if (!prepare.IsSuccess()) + { + return AZ::Failure(prepare.GetError()); + } + + auto parseResult = ReadJsonString(stream); + if (!parseResult.IsSuccess()) + { + return AZ::Failure(parseResult.GetError()); + } + + const rapidjson::Document& jsonDocument = parseResult.GetValue(); + + auto validateResult = ValidateJsonClassHeader(jsonDocument); + if (!validateResult.IsSuccess()) + { + return AZ::Failure(validateResult.GetError()); + } + + const char* className = jsonDocument.FindMember(ClassNameTag)->value.GetString(); + + // validate class name + auto classData = loadSettings.m_serializeContext->FindClassData(classId); + if (!classData) + { + return AZ::Failure(AZStd::string::format("Try to load class from Id %s", classId.ToString().c_str())); + } + + if (azstricmp(classData->m_name, className) != 0) + { + return AZ::Failure(AZStd::string::format("Try to load class %s from class %s data", classData->m_name, className)); + } + + JsonSerializationResult::ResultCode result = JsonSerialization::Load(objectToLoad, classId, jsonDocument.FindMember(ClassDataTag)->value, loadSettings); + + if (!WasLoadSuccess(result.GetOutcome()) || !deserializeErrors.empty()) + { + return AZ::Failure(deserializeErrors); + } + + return AZ::Success(); + } + AZ::Outcome LoadObjectFromStreamByType(void* objectToLoad, const Uuid& classId, IO::GenericStream& stream, const JsonDeserializerSettings* settings) { diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h index c7777feec0..5a9b6f6764 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h @@ -77,6 +77,9 @@ namespace AZ AZ::Outcome ReadJsonStream(IO::GenericStream& stream); //! Load object with known class type + AZ::Outcome LoadObjectFromStringByType(void* objectToLoad, const Uuid& objectType, AZStd::string_view source, + const JsonDeserializerSettings* settings = nullptr); + AZ::Outcome LoadObjectFromStreamByType(void* objectToLoad, const Uuid& objectType, IO::GenericStream& stream, const JsonDeserializerSettings* settings = nullptr); diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp index 848db44236..dea63ab852 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetHandler.cpp @@ -93,6 +93,49 @@ namespace ScriptCanvasEditor } } + AZ::Outcome LoadScriptCanvasDataFromJson + ( ScriptCanvas::ScriptCanvasData& dataTarget + , AZStd::string_view source + , AZ::SerializeContext& serializeContext) + { + namespace JSRU = AZ::JsonSerializationUtils; + using namespace ScriptCanvas; + + AZ::JsonDeserializerSettings settings; + settings.m_serializeContext = &serializeContext; + settings.m_metadata.Create(); + + auto loadResult = JSRU::LoadObjectFromStringByType + ( &dataTarget + , azrtti_typeid() + , source + , &settings); + + if (!loadResult.IsSuccess()) + { + return loadResult; + } + + if (auto graphData = dataTarget.ModGraph()) + { + auto listeners = settings.m_metadata.Find(); + AZ_Assert(listeners, "Failed to find SerializationListeners"); + + ScriptCanvasAssetHandlerCpp::CollectNodes(graphData->GetGraphData()->m_nodes, *listeners); + + for (auto listener : *listeners) + { + listener->OnDeserialize(); + } + } + else + { + return AZ::Failure(AZStd::string("Failed to find graph data after loading source")); + } + + return AZ::Success(); + } + AZ::Data::AssetHandler::LoadResult ScriptCanvasAssetHandler::LoadAssetData ( const AZ::Data::Asset& assetTarget , AZStd::shared_ptr streamSource @@ -110,8 +153,9 @@ namespace ScriptCanvasEditor { streamSource->Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); auto& scriptCanvasDataTarget = scriptCanvasAssetTarget->GetScriptCanvasData(); - AZStd::vector byteBuffer; + AZStd::vector byteBuffer; byteBuffer.resize_no_construct(streamSource->GetLength()); + // this duplicate stream is to allow for trying again if the JSON read fails AZ::IO::ByteContainerStream byteStreamSource(&byteBuffer); const size_t bytesRead = streamSource->Read(byteBuffer.size(), byteBuffer.data()); scriptCanvasDataTarget.m_scriptCanvasEntity.reset(nullptr); @@ -123,36 +167,19 @@ namespace ScriptCanvasEditor settings.m_serializeContext = m_serializeContext; settings.m_metadata.Create(); // attempt JSON deserialization... - if (JSRU::LoadObjectFromStreamByType - ( &scriptCanvasDataTarget - , azrtti_typeid() - , byteStreamSource - , &settings).IsSuccess()) + auto jsonResult = LoadScriptCanvasDataFromJson + ( scriptCanvasDataTarget + , AZStd::string_view{ byteBuffer.begin(), byteBuffer.size() } + , *m_serializeContext); + + if (jsonResult.IsSuccess()) { - if (auto graphData = scriptCanvasAssetTarget->GetScriptCanvasGraph() - ? scriptCanvasAssetTarget->GetScriptCanvasGraph()->GetGraphData() - : nullptr) - { - auto listeners = settings.m_metadata.Find(); - AZ_Assert(listeners, "Failed to create SerializationListeners"); - - ScriptCanvasAssetHandlerCpp::CollectNodes(graphData->m_nodes, *listeners); - - for (auto listener : *listeners) - { - listener->OnDeserialize(); - } - - return AZ::Data::AssetHandler::LoadResult::LoadComplete; - } - else - { - AZ_Warning("ScriptCanvas", false, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JOSON"); - } + return AZ::Data::AssetHandler::LoadResult::LoadComplete; } #if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)//// else - {// ...if there is a failure, check if it is saved in the old format + { + // ...if there is a failure, check if it is saved in the old format byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN); // tolerate unknown classes in the editor. Let the asset processor warn about bad nodes... if (AZ::Utils::LoadObjectFromStreamInPlace @@ -161,9 +188,24 @@ namespace ScriptCanvasEditor , m_serializeContext , AZ::ObjectStream::FilterDescriptor(assetLoadFilterCB, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES))) { + AZ_Warning + ( "ScriptCanvas" + , false + , "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JSON, %s, consider converting to JSON" + " by opening it and saving it, or running the graph update tool from the editor0" + , jsonResult.GetError().c_str()); return AZ::Data::AssetHandler::LoadResult::LoadComplete; } } +#else + else + { + AZ_Warning + ( "ScriptCanvas" + , false + , "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JSON %s" + , jsonResult.GetError().c_str()"); + } #endif//defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED) } } diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h index a0e00b40fd..f29d5aa9cb 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetHandler.h @@ -20,6 +20,11 @@ namespace AZ namespace ScriptCanvasEditor { + AZ::Outcome LoadScriptCanvasDataFromJson + ( ScriptCanvas::ScriptCanvasData& dataTarget + , AZStd::string_view source + , AZ::SerializeContext& serializeContext); + /** * Manages editor Script Canvas graph assets. */ diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp new file mode 100644 index 0000000000..fde48dbf3a --- /dev/null +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include + +namespace ScriptCanvas +{ + Graph* ScriptCanvasData::ModGraph() + { + return AZ::EntityUtils::FindFirstDerivedComponent(m_scriptCanvasEntity.get()); + } + + const Graph* ScriptCanvasData::GetGraph() const + { + return AZ::EntityUtils::FindFirstDerivedComponent(m_scriptCanvasEntity.get()); + } +} diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h index d36b773e83..f4b02b56b6 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h @@ -28,6 +28,10 @@ namespace ScriptCanvas AZ::Entity* GetScriptCanvasEntity() const { return m_scriptCanvasEntity.get(); } + Graph* ModGraph(); + + const Graph* GetGraph() const; + AZStd::unique_ptr m_scriptCanvasEntity; private: ScriptCanvasData(const ScriptCanvasData&) = delete; diff --git a/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake b/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake index 1b9f07594a..52b1cc4772 100644 --- a/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake +++ b/Gems/ScriptCanvas/Code/scriptcanvasgem_editor_files.cmake @@ -21,6 +21,8 @@ set(FILES Editor/Assets/ScriptCanvasAssetHelpers.h Editor/Assets/ScriptCanvasAssetHelpers.cpp Editor/Assets/ScriptCanvasAssetTrackerDefinitions.h + Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h + Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp Editor/Include/ScriptCanvas/Assets/ScriptCanvasAsset.h Editor/Assets/ScriptCanvasAsset.cpp Editor/Include/ScriptCanvas/Assets/ScriptCanvasAssetBus.h From 4ed7feae5d7af44e518caf2276fede86f475d7d6 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Fri, 3 Sep 2021 14:44:19 -0700 Subject: [PATCH 122/355] Keep editor alive when not in focus Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../View/Windows/Tools/UpgradeTool/VersionExplorer.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index 824e9ce147..e7d1445e74 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -111,7 +111,6 @@ namespace ScriptCanvasEditor m_ui->progressBar->setVisible(false); m_keepEditorAlive = AZStd::make_unique(); - m_inspectingAsset = m_assetsToInspect.end(); } @@ -290,6 +289,7 @@ namespace ScriptCanvasEditor m_ui->progressBar->setVisible(true); m_ui->progressBar->setRange(0, aznumeric_cast(m_assetsToUpgrade.size())); m_ui->progressBar->setValue(m_upgradeAssetIndex); + m_keepEditorAlive = AZStd::make_unique(); } AZStd::string VersionExplorer::BackupGraph(const AZ::Data::Asset& asset) @@ -675,8 +675,9 @@ namespace ScriptCanvasEditor m_assetsToUpgrade.clear(); m_ui->upgradeAllButton->setEnabled(false); m_ui->onlyShowOutdated->setEnabled(true); - + m_keepEditorAlive.reset(); m_ui->progressBar->setVisible(false); + // Manual correction size_t assetsThatNeedManualInspection = AZ::Interface::Get()->GetGraphsThatNeedManualUpgrade().size(); if (assetsThatNeedManualInspection > 0) @@ -739,6 +740,7 @@ namespace ScriptCanvasEditor m_ui->onlyShowOutdated->setEnabled(false); m_inspectingAsset = m_assetsToInspect.begin(); + m_keepEditorAlive = AZStd::make_unique(); } } From e9dfa3f8dd160ce97c129e740a242c3f83208d93 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 14:49:32 -0700 Subject: [PATCH 123/355] Enabling warnings in MSVC Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/MSVC/Configurations_msvc.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index 647ced54a2..f10ef844a4 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -40,9 +40,14 @@ ly_append_configurations_options( # Enabling warnings that are disabled by default from /W4 # https://docs.microsoft.com/en-us/cpp/preprocessor/compiler-warnings-that-are-off-by-default?view=vs-2019 + /we4263 # 'function': member function does not override any base class virtual member function + /we4264 # 'virtual_function': no override available for virtual member function from base 'class'; function is hidden + /we4265 # 'class': class has virtual functions, but destructor is not virtual + /we4266 # 'function': no override available for virtual member function from base 'type'; function is hidden /we4296 # 'operator': expression is always false /we5233 # explicit lambda capture 'identifier' is not used /we4426 # optimization flags changed after including header, may be due to #pragma optimize() + /we4437 # dynamic_cast from virtual base 'class1' to 'class2' could fail in some contexts #/we4619 # #pragma warning: there is no warning number 'number'. Unfortunately some versions of MSVC 16.X dont filter this warning coming from external headers and Qt has a bad warning in QtCore/qvector.h(340,12) /we4777 # 'function' : format string 'string' requires an argument of type 'type1', but variadic argument number has type 'type2 /we5031 # #pragma warning(pop): likely mismatch, popping warning state pushed in different file From 2e79451280ccc6a8518563095402a5f5dad3cec5 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 14:50:26 -0700 Subject: [PATCH 124/355] Fixes AzCore for MSVC Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/Component/ComponentApplication.cpp | 2 ++ .../AzCore/AzCore/Debug/AssetTrackingTypes.h | 3 ++ .../AzCore/Debug/AssetTrackingTypesImpl.h | 5 +++ .../AzCore/AzCore/Debug/BudgetTracker.h | 2 +- .../AzCore/Serialization/Json/MapSerializer.h | 4 ++- .../Settings/SettingsRegistryMergeUtils.cpp | 4 +++ .../AzCore/AzCore/UnitTest/TestTypes.h | 14 +++++--- .../AzCore/AzCore/std/string/regex.h | 2 +- .../StreamerConfiguration_Windows.cpp | 1 + .../AzCore/Tests/AssetJsonSerializerTests.cpp | 1 + .../AzCore/Tests/IO/Path/PathTests.cpp | 12 +------ Code/Framework/AzCore/Tests/Jobs.cpp | 20 +++++++++-- .../Tests/Math/FrustumPerformanceTests.cpp | 12 +++++-- .../Tests/Math/Matrix3x3PerformanceTests.cpp | 12 +++++-- .../Tests/Math/Matrix3x4PerformanceTests.cpp | 12 +++++-- .../Tests/Math/Matrix4x4PerformanceTests.cpp | 12 +++++-- .../AzCore/Tests/Math/ObbPerformanceTests.cpp | 13 +++++-- .../Tests/Math/PlanePerformanceTests.cpp | 26 +++++++++----- .../Tests/Math/QuaternionPerformanceTests.cpp | 12 +++++-- .../ShapeIntersectionPerformanceTests.cpp | 12 +++++-- .../Tests/Math/TransformPerformanceTests.cpp | 12 +++++-- .../Tests/Math/Vector2PerformanceTests.cpp | 12 +++++-- .../Tests/Math/Vector3PerformanceTests.cpp | 12 +++++-- .../Tests/Math/Vector4PerformanceTests.cpp | 12 +++++-- .../AzCore/Tests/Memory/HphaSchema.cpp | 25 +++++++++++--- .../IO/Streamer/StorageDriveTests_Windows.cpp | 34 ++++++++++++------- .../Json/ArraySerializerTests.cpp | 3 ++ .../Json/BasicContainerSerializerTests.cpp | 6 ++++ .../Json/BoolSerializerTests.cpp | 1 + .../Json/DoubleSerializerTests.cpp | 1 + .../Serialization/Json/MapSerializerTests.cpp | 2 ++ .../Json/SmartPointerSerializerTests.cpp | 7 +++- .../Json/TupleSerializerTests.cpp | 5 +++ .../Json/UnorderedSetSerializerTests.cpp | 3 ++ .../AzCore/Tests/SettingsRegistryTests.cpp | 7 ++++ Code/Framework/AzCore/Tests/TaskTests.cpp | 24 +++++++++++-- 36 files changed, 274 insertions(+), 73 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp index c76156c006..168807cd97 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp @@ -1249,6 +1249,8 @@ namespace AZ return AZ::SettingsRegistryInterface::VisitResponse::Continue; } + + using SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, bool value) override { // By default the auto load option is true diff --git a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h index c46edbb80e..f538c516c3 100644 --- a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h +++ b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypes.h @@ -86,6 +86,7 @@ namespace AZ class AssetTreeNodeBase { public: + virtual ~AssetTreeNodeBase() = default; virtual const AssetPrimaryInfo* GetAssetPrimaryInfo() const = 0; virtual AssetTreeNodeBase* FindOrAddChild(const AssetTrackingId& id, const AssetPrimaryInfo* info) = 0; }; @@ -94,6 +95,7 @@ namespace AZ class AssetTreeBase { public: + virtual ~AssetTreeBase() = default; virtual AssetTreeNodeBase& GetRoot() = 0; }; @@ -101,6 +103,7 @@ namespace AZ class AssetAllocationTableBase { public: + virtual ~AssetAllocationTableBase() = default; virtual AssetTreeNodeBase* FindAllocation(void* ptr) const = 0; }; } diff --git a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h index 7916a442b5..eac809c406 100644 --- a/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h +++ b/Code/Framework/AzCore/AzCore/Debug/AssetTrackingTypesImpl.h @@ -31,6 +31,8 @@ namespace AZ { } + ~AssetTreeNode() override = default; + const AssetPrimaryInfo* GetAssetPrimaryInfo() const override { return m_primaryinfo; @@ -67,6 +69,8 @@ namespace AZ class AssetTree : public AssetTreeBase { public: + ~AssetTree() override = default; + AssetTreeNodeBase& GetRoot() override { return m_rootAssets; @@ -99,6 +103,7 @@ namespace AZ AllocationTable(mutex_type& mutex) : m_mutex(mutex) { } + ~AllocationTable() override = default; AssetTreeNodeBase* FindAllocation(void* ptr) const override { diff --git a/Code/Framework/AzCore/AzCore/Debug/BudgetTracker.h b/Code/Framework/AzCore/AzCore/Debug/BudgetTracker.h index 1357bb5870..34d8510349 100644 --- a/Code/Framework/AzCore/AzCore/Debug/BudgetTracker.h +++ b/Code/Framework/AzCore/AzCore/Debug/BudgetTracker.h @@ -19,7 +19,7 @@ namespace AZ::Debug class BudgetTracker { public: - AZ_RTTI(BudgetTracker, "{E14A746D-BFFE-4C02-90FB-4699B79864A5}"); + AZ_TYPE_INFO(BudgetTracker, "{E14A746D-BFFE-4C02-90FB-4699B79864A5}"); static Budget* GetBudgetFromEnvironment(const char* budgetName, uint32_t crc); ~BudgetTracker(); diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.h b/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.h index e0d2635fc3..937c8389ff 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.h +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.h @@ -46,7 +46,8 @@ namespace AZ public: AZ_RTTI(JsonUnorderedMapSerializer, "{EF4478D3-1820-4FDB-A7B7-C9711EB41602}", JsonMapSerializer); AZ_CLASS_ALLOCATOR_DECL; - + + using JsonMapSerializer::Store; JsonSerializationResult::Result Store(rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, const Uuid& valueTypeId, JsonSerializerContext& context) override; }; @@ -63,6 +64,7 @@ namespace AZ const SerializeContext::ClassElement* keyElement, const SerializeContext::ClassElement* valueElement, const rapidjson::Value& key, const rapidjson::Value& value, JsonDeserializerContext& context) override; + using JsonMapSerializer::Store; JsonSerializationResult::Result Store(rapidjson::Value& outputValue, const void* inputValue, const void* defaultValue, const Uuid& valueTypeId, JsonSerializerContext& context) override; }; diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp index cb666a7c02..28e5a68e0b 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp @@ -78,6 +78,7 @@ namespace AZ::Internal struct EnginePathsVisitor : public AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit( [[maybe_unused]] AZStd::string_view path, AZStd::string_view valueName, [[maybe_unused]] AZ::SettingsRegistryInterface::Type type, AZStd::string_view value) override @@ -355,6 +356,7 @@ namespace AZ::SettingsRegistryMergeUtils : m_settingsSpecialization{ specializations } {} + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit([[maybe_unused]] AZStd::string_view path, AZStd::string_view valueName, [[maybe_unused]] AZ::SettingsRegistryInterface::Type type, bool value) override { @@ -761,6 +763,7 @@ namespace AZ::SettingsRegistryMergeUtils return SettingsRegistryInterface::VisitResponse::Continue; } + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view, [[maybe_unused]] AZStd::string_view valueName, SettingsRegistryInterface::Type, AZStd::string_view value) override { if (processingSourcePathKey) @@ -896,6 +899,7 @@ namespace AZ::SettingsRegistryMergeUtils struct CommandLineVisitor : AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type , AZStd::string_view value) override { diff --git a/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h b/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h index c3e3f5210a..71a4e5082b 100644 --- a/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h +++ b/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h @@ -130,17 +130,23 @@ namespace UnitTest , public AllocatorsBase { public: - // Bring in both const and non-const SetUp and TearDown function into scope to resolve warning 4266 - // no override available for virtual member function from base 'benchmark::Fixture'; function is hidden - using ::benchmark::Fixture::SetUp, ::benchmark::Fixture::TearDown; - //Benchmark interface + void SetUp(const ::benchmark::State& st) override + { + AZ_UNUSED(st); + SetupAllocator(); + } void SetUp(::benchmark::State& st) override { AZ_UNUSED(st); SetupAllocator(); } + void TearDown(const ::benchmark::State& st) override + { + AZ_UNUSED(st); + TeardownAllocator(); + } void TearDown(::benchmark::State& st) override { AZ_UNUSED(st); diff --git a/Code/Framework/AzCore/AzCore/std/string/regex.h b/Code/Framework/AzCore/AzCore/std/string/regex.h index 2ca223937b..e20f67905c 100644 --- a/Code/Framework/AzCore/AzCore/std/string/regex.h +++ b/Code/Framework/AzCore/AzCore/std/string/regex.h @@ -1758,7 +1758,7 @@ namespace AZStd return (*this); } - ~basic_regex() + virtual ~basic_regex() { // destroy the object Clear(); } diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp index fe6d83b7a4..0a73da5a92 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/IO/Streamer/StreamerConfiguration_Windows.cpp @@ -267,6 +267,7 @@ namespace AZ::IO SettingsRegistryInterface::VisitResponse::Continue : SettingsRegistryInterface::VisitResponse::Skip; } + using SettingsRegistryInterface::Visitor::Visit; void Visit([[maybe_unused]] AZStd::string_view path, [[maybe_unused]] AZStd::string_view valueName, [[maybe_unused]] AZ::SettingsRegistryInterface::Type type, AZStd::string_view value) override { diff --git a/Code/Framework/AzCore/Tests/AssetJsonSerializerTests.cpp b/Code/Framework/AzCore/Tests/AssetJsonSerializerTests.cpp index 2ca564681c..e968ee28fc 100644 --- a/Code/Framework/AzCore/Tests/AssetJsonSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/AssetJsonSerializerTests.cpp @@ -100,6 +100,7 @@ namespace JsonSerializationTests AZ::AllocatorInstance::Destroy(); } + using JsonSerializerConformityTestDescriptor>::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); diff --git a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp index 2fca03bc59..ea6f272e18 100644 --- a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp +++ b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp @@ -866,18 +866,8 @@ namespace UnitTest namespace Benchmark { class PathBenchmarkFixture - : public ::benchmark::Fixture - , public ::UnitTest::AllocatorsBase + : public ::UnitTest::AllocatorsBenchmarkFixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override - { - ::UnitTest::AllocatorsBase::SetupAllocator(); - } - void TearDown([[maybe_unused]] const ::benchmark::State& state) override - { - ::UnitTest::AllocatorsBase::TeardownAllocator(); - } protected: AZStd::fixed_vector m_appendPaths{ "foo", "bar", "baz", "bazzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", "boo/bar/base", "C:\\path\\to\\O3DE", "C", "\\\\", "/", R"(test\\path/with\mixed\separators)" }; diff --git a/Code/Framework/AzCore/Tests/Jobs.cpp b/Code/Framework/AzCore/Tests/Jobs.cpp index b63e139dd0..041f4970d1 100644 --- a/Code/Framework/AzCore/Tests/Jobs.cpp +++ b/Code/Framework/AzCore/Tests/Jobs.cpp @@ -1704,7 +1704,7 @@ namespace Benchmark static const AZ::u32 MEDIUM_NUMBER_OF_JOBS = 1024; static const AZ::u32 LARGE_NUMBER_OF_JOBS = 16384; - void SetUp([[maybe_unused]] ::benchmark::State& state) override + void internalSetUp() { AllocatorInstance::Create(); AllocatorInstance::Create(); @@ -1749,8 +1749,16 @@ namespace Benchmark return randomDepthDistribution(randomDepthGenerator); }); } + void SetUp(::benchmark::State&) override + { + internalSetUp(); + } + void SetUp(const ::benchmark::State&) override + { + internalSetUp(); + } - void TearDown([[maybe_unused]] ::benchmark::State& state) override + void internalTearDown() { JobContext::SetGlobalContext(nullptr); @@ -1763,6 +1771,14 @@ namespace Benchmark AllocatorInstance::Destroy(); AllocatorInstance::Destroy(); } + void TearDown(::benchmark::State&) override + { + internalTearDown(); + } + void TearDown(const ::benchmark::State&) override + { + internalTearDown(); + } protected: inline void RunCalculatePiJob(AZ::s32 depth, AZ::s8 priority) diff --git a/Code/Framework/AzCore/Tests/Math/FrustumPerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/FrustumPerformanceTests.cpp index b132c9f726..e26d896e5a 100644 --- a/Code/Framework/AzCore/Tests/Math/FrustumPerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/FrustumPerformanceTests.cpp @@ -19,8 +19,7 @@ namespace Benchmark class BM_MathFrustum : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_testFrustum = AZ::Frustum(AZ::ViewFrustumAttributes(AZ::Transform::CreateIdentity(), 1.0f, 2.0f * atanf(0.5f), 10.0f, 90.0f)); @@ -40,6 +39,15 @@ namespace Benchmark return data; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct Data { diff --git a/Code/Framework/AzCore/Tests/Math/Matrix3x3PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Matrix3x3PerformanceTests.cpp index f345f26d06..918673d475 100644 --- a/Code/Framework/AzCore/Tests/Math/Matrix3x3PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Matrix3x3PerformanceTests.cpp @@ -23,8 +23,7 @@ namespace Benchmark class BM_MathMatrix3x3 : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_testDataArray.resize(1000); @@ -44,6 +43,15 @@ namespace Benchmark return testData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct TestData { diff --git a/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp index 9aed29005d..63ddefdd2c 100644 --- a/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Matrix3x4PerformanceTests.cpp @@ -21,8 +21,7 @@ namespace Benchmark class BM_MathMatrix3x4 : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const::benchmark::State& state) override + void internalSetUp() { m_testDataArray.resize(1000); @@ -58,6 +57,15 @@ namespace Benchmark return testData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct TestData { diff --git a/Code/Framework/AzCore/Tests/Math/Matrix4x4PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Matrix4x4PerformanceTests.cpp index 90865064c8..21f440c3a1 100644 --- a/Code/Framework/AzCore/Tests/Math/Matrix4x4PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Matrix4x4PerformanceTests.cpp @@ -20,8 +20,7 @@ namespace Benchmark class BM_MathMatrix4x4 : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_testDataArray.resize(1000); @@ -41,6 +40,15 @@ namespace Benchmark return testData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct TestData { diff --git a/Code/Framework/AzCore/Tests/Math/ObbPerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/ObbPerformanceTests.cpp index 8463758fa5..d1e8ac2225 100644 --- a/Code/Framework/AzCore/Tests/Math/ObbPerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/ObbPerformanceTests.cpp @@ -19,8 +19,7 @@ namespace Benchmark class BM_MathObb : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_position.Set(1.0f, 2.0f, 3.0f); m_rotation = AZ::Quaternion::CreateRotationZ(AZ::Constants::QuarterPi); @@ -28,6 +27,16 @@ namespace Benchmark m_obb = AZ::Obb::CreateFromPositionRotationAndHalfLengths(m_position, m_rotation, m_halfLengths); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + AZ::Obb m_obb; AZ::Vector3 m_position; AZ::Quaternion m_rotation; diff --git a/Code/Framework/AzCore/Tests/Math/PlanePerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/PlanePerformanceTests.cpp index c23ded582c..e066207635 100644 --- a/Code/Framework/AzCore/Tests/Math/PlanePerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/PlanePerformanceTests.cpp @@ -18,14 +18,7 @@ namespace Benchmark class BM_MathPlane : public benchmark::Fixture { - public: - BM_MathPlane() - { - const unsigned int seed = 1; - rng = std::mt19937_64(seed); - } - - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { for (int i = 0; i < m_numIters; ++i) { @@ -39,7 +32,7 @@ namespace Benchmark m_distance = unif(rng); m_dists.push_back(m_distance); - //set these differently so they don't overlap with same values as other vectors + // set these differently so they don't overlap with same values as other vectors m_normal = AZ::Vector3(unif(rng), unif(rng), unif(rng)); m_normal.Normalize(); m_distance = unif(rng); @@ -47,6 +40,21 @@ namespace Benchmark m_planes.push_back(m_plane); } } + public: + BM_MathPlane() + { + const unsigned int seed = 1; + rng = std::mt19937_64(seed); + } + + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } AZ::Plane m_plane; AZ::Vector3 m_normal; diff --git a/Code/Framework/AzCore/Tests/Math/QuaternionPerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/QuaternionPerformanceTests.cpp index 6f5a23d027..486a33ba67 100644 --- a/Code/Framework/AzCore/Tests/Math/QuaternionPerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/QuaternionPerformanceTests.cpp @@ -17,8 +17,7 @@ namespace Benchmark class BM_MathQuaternion : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_quatDataArray.resize(1000); @@ -42,6 +41,15 @@ namespace Benchmark return quatData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct QuatData { diff --git a/Code/Framework/AzCore/Tests/Math/ShapeIntersectionPerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/ShapeIntersectionPerformanceTests.cpp index b088330302..ecab1717b2 100644 --- a/Code/Framework/AzCore/Tests/Math/ShapeIntersectionPerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/ShapeIntersectionPerformanceTests.cpp @@ -35,8 +35,7 @@ namespace Benchmark class BM_MathShapeIntersection : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_testDataArray.resize(1000); @@ -58,6 +57,15 @@ namespace Benchmark return testData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct TestData { diff --git a/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp index 193535c020..dde0192ef9 100644 --- a/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/TransformPerformanceTests.cpp @@ -22,8 +22,7 @@ namespace Benchmark class BM_MathTransform : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_testDataArray.resize(1000); @@ -51,6 +50,15 @@ namespace Benchmark return testData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct TestData { diff --git a/Code/Framework/AzCore/Tests/Math/Vector2PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Vector2PerformanceTests.cpp index e8506890aa..3ab306ff66 100644 --- a/Code/Framework/AzCore/Tests/Math/Vector2PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Vector2PerformanceTests.cpp @@ -19,8 +19,7 @@ namespace Benchmark class BM_MathVector2 : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_vecDataArray.resize(1000); @@ -37,6 +36,15 @@ namespace Benchmark return vecData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct VecData { diff --git a/Code/Framework/AzCore/Tests/Math/Vector3PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Vector3PerformanceTests.cpp index 27fa01ae95..5f33730bca 100644 --- a/Code/Framework/AzCore/Tests/Math/Vector3PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Vector3PerformanceTests.cpp @@ -19,8 +19,7 @@ namespace Benchmark class BM_MathVector3 : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_vecDataArray.resize(1000); @@ -37,6 +36,15 @@ namespace Benchmark return vecData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct VecData { diff --git a/Code/Framework/AzCore/Tests/Math/Vector4PerformanceTests.cpp b/Code/Framework/AzCore/Tests/Math/Vector4PerformanceTests.cpp index 4a0bcb49d2..f12851b1ed 100644 --- a/Code/Framework/AzCore/Tests/Math/Vector4PerformanceTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/Vector4PerformanceTests.cpp @@ -19,8 +19,7 @@ namespace Benchmark class BM_MathVector4 : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { m_vecDataArray.resize(1000); @@ -38,6 +37,15 @@ namespace Benchmark return vecData; }); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } struct VecData { diff --git a/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp b/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp index aaf4ce1811..85dd79931d 100644 --- a/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp +++ b/Code/Framework/AzCore/Tests/Memory/HphaSchema.cpp @@ -120,19 +120,34 @@ namespace Benchmark class HphaSchemaBenchmarkFixture : public ::benchmark::Fixture { - public: - void SetUp(const ::benchmark::State& state) override + void internalSetUp() { - AZ_UNUSED(state); AZ::AllocatorInstance::Create(); } - void TearDown(const ::benchmark::State& state) override + void internalTearDown() { - AZ_UNUSED(state); AZ::AllocatorInstance::Destroy(); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + static void BM_Allocations(benchmark::State& state, const AllocationSizeArray& allocationArray) { AZStd::vector allocations; diff --git a/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp b/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp index 6d572a02a3..51fa68cc2b 100644 --- a/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp +++ b/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp @@ -1155,6 +1155,21 @@ namespace Benchmark { class StorageDriveWindowsFixture : public benchmark::Fixture { + void internalTearDown() + { + using namespace AZ::IO; + + AZStd::string temp; + m_absolutePath.swap(temp); + + delete m_streamer; + + SystemFile::Delete(TestFileName); + + AZ::IO::FileIOBase::SetInstance(nullptr); + AZ::IO::FileIOBase::SetInstance(m_previousFileIO); + delete m_fileIO; + } public: constexpr static const char* TestFileName = "StreamerBenchmark.bin"; constexpr static size_t FileSize = 64_mib; @@ -1197,20 +1212,13 @@ namespace Benchmark } } - void TearDown([[maybe_unused]] const ::benchmark::State& state) override + void TearDown(const benchmark::State&) override { - using namespace AZ::IO; - - AZStd::string temp; - m_absolutePath.swap(temp); - - delete m_streamer; - - SystemFile::Delete(TestFileName); - - AZ::IO::FileIOBase::SetInstance(nullptr); - AZ::IO::FileIOBase::SetInstance(m_previousFileIO); - delete m_fileIO; + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); } void RepeatedlyReadFile(benchmark::State& state) diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp index e410ba9ca4..8582453683 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/ArraySerializerTests.cpp @@ -35,6 +35,7 @@ namespace JsonSerializationTests features.m_fixedSizeArray = true; } + using JsonSerializerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -243,6 +244,7 @@ namespace JsonSerializationTests ])"; } + using ArraySerializerTestDescriptionBase>::Reflect; void Reflect(AZStd::unique_ptr& context) override { Base::Reflect(context); @@ -299,6 +301,7 @@ namespace JsonSerializationTests AZ::JsonArraySerializer m_serializer; public: + using BaseJsonSerializerFixture::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& context) override { context->RegisterGenericType(); diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/BasicContainerSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/BasicContainerSerializerTests.cpp index 3bc574c2ce..4a6a8e9e8a 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/BasicContainerSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/BasicContainerSerializerTests.cpp @@ -60,6 +60,7 @@ namespace JsonSerializationTests return "[188, 288, 388]"; } + using BasicContainerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -133,6 +134,7 @@ namespace JsonSerializationTests return "[188, 288, 388]"; } + using BasicContainerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -225,6 +227,7 @@ namespace JsonSerializationTests features.m_supportsPartialInitialization = true; } + using BasicContainerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { SimpleClass::Reflect(context, true); @@ -291,6 +294,7 @@ namespace JsonSerializationTests using Container = AZStd::vector; using BaseClassContainer = AZStd::vector>; + using JsonBasicContainerSerializerTests::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { SimpleClass::Reflect(serializeContext, true); @@ -352,6 +356,7 @@ namespace JsonSerializationTests static constexpr size_t ContainerSize = 4; using Container = AZStd::fixed_vector; + using JsonBasicContainerSerializerTests::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { serializeContext->RegisterGenericType(); @@ -387,6 +392,7 @@ namespace JsonSerializationTests public: using Set = AZStd::set; + using JsonBasicContainerSerializerTests::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { serializeContext->RegisterGenericType(); diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/BoolSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/BoolSerializerTests.cpp index a670a2a6e1..e9bb404ba8 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/BoolSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/BoolSerializerTests.cpp @@ -83,6 +83,7 @@ namespace JsonSerializationTests BaseJsonSerializerFixture::TearDown(); } + using BaseJsonSerializerFixture::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { serializeContext->Class() diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/DoubleSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/DoubleSerializerTests.cpp index 76aaae393d..53eb855a63 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/DoubleSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/DoubleSerializerTests.cpp @@ -95,6 +95,7 @@ namespace JsonSerializationTests BaseJsonSerializerFixture::TearDown(); } + using BaseJsonSerializerFixture::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { serializeContext->Class() diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp index 4979df04be..7ffe3ffee0 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/MapSerializerTests.cpp @@ -44,6 +44,7 @@ namespace JsonSerializationTests features.m_supportsPartialInitialization = false; } + using JsonSerializerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -247,6 +248,7 @@ namespace JsonSerializationTests features.m_supportsPartialInitialization = true; } + using MapBaseTestDescription, Serializer>::Reflect; void Reflect(AZStd::unique_ptr& context) override { SimpleClass::Reflect(context, true); diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/SmartPointerSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/SmartPointerSerializerTests.cpp index 43dc1a85d9..d89d9bfb33 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/SmartPointerSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/SmartPointerSerializerTests.cpp @@ -33,6 +33,7 @@ namespace JsonSerializationTests return AZStd::make_shared(); } + using JsonSerializerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -102,6 +103,7 @@ namespace JsonSerializationTests return *lhs == *rhs; } + using Base::Reflect; void Reflect(AZStd::unique_ptr& context) override { SimpleClass::Reflect(context, true); @@ -176,6 +178,7 @@ namespace JsonSerializationTests features.m_supportsPartialInitialization = true; } + using SmartPointerBaseTestDescription>::Reflect; void Reflect(AZStd::unique_ptr& context) override { SimpleInheritence::Reflect(context, true); @@ -340,6 +343,7 @@ namespace JsonSerializationTests features.m_supportsPartialInitialization = true; } + using SmartPointerBaseTestDescription>::Reflect; void Reflect(AZStd::unique_ptr& context) override { MultipleInheritence::Reflect(context, true); @@ -513,7 +517,8 @@ namespace JsonSerializationTests public: using SmartPointer = typename SmartPointerSimpleDerivedClassTestDescription::SmartPointer; using InstanceSmartPointer = AZStd::shared_ptr; - + + using BaseJsonSerializerFixture::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& context) override { m_description.Reflect(context); diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/TupleSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/TupleSerializerTests.cpp index ff0fbcc5a6..cfd844f3f5 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/TupleSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/TupleSerializerTests.cpp @@ -72,6 +72,7 @@ namespace JsonSerializationTests TupleSerializerTestsInternal::ConfigureFeatures(features); } + using JsonSerializerConformityTestDescriptor>::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->Class()->Field("pair", &PairPlaceholder::m_pair); @@ -126,6 +127,7 @@ namespace JsonSerializationTests TupleSerializerTestsInternal::ConfigureFeatures(features); } + using JsonSerializerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -344,6 +346,7 @@ namespace JsonSerializationTests features.m_enableNewInstanceTests = false; } + using JsonSerializerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->Class() @@ -477,6 +480,7 @@ namespace JsonSerializationTests features.m_typeToInject = rapidjson::kNullType; } + using JsonSerializerConformityTestDescriptor::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -535,6 +539,7 @@ namespace JsonSerializationTests BaseJsonSerializerFixture::TearDown(); } + using BaseJsonSerializerFixture::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { SimpleClass::Reflect(serializeContext, true); diff --git a/Code/Framework/AzCore/Tests/Serialization/Json/UnorderedSetSerializerTests.cpp b/Code/Framework/AzCore/Tests/Serialization/Json/UnorderedSetSerializerTests.cpp index 17902b6900..f4a1f48dc5 100644 --- a/Code/Framework/AzCore/Tests/Serialization/Json/UnorderedSetSerializerTests.cpp +++ b/Code/Framework/AzCore/Tests/Serialization/Json/UnorderedSetSerializerTests.cpp @@ -54,6 +54,7 @@ namespace JsonSerializationTests features.m_supportsPartialInitialization = false; } + using JsonSerializerConformityTestDescriptor>::Reflect; void Reflect(AZStd::unique_ptr& context) override { context->RegisterGenericType(); @@ -108,6 +109,7 @@ namespace JsonSerializationTests context->RegisterGenericType(); } + using JsonSerializerConformityTestDescriptor::Reflect; bool AreEqual(const MultiSet& lhs, const MultiSet& rhs) override { return @@ -139,6 +141,7 @@ namespace JsonSerializationTests BaseJsonSerializerFixture::TearDown(); } + using BaseJsonSerializerFixture::RegisterAdditional; void RegisterAdditional(AZStd::unique_ptr& serializeContext) override { serializeContext->RegisterGenericType(); diff --git a/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp b/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp index 61f93fb860..8485747991 100644 --- a/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp +++ b/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp @@ -423,6 +423,8 @@ namespace SettingsRegistryTests struct : public AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; + using ValueType [[maybe_unused]] = typename SettingsType::ValueType; void Visit([[maybe_unused]] AZStd::string_view path, [[maybe_unused]] AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type type, ValueType value) override { @@ -452,6 +454,8 @@ namespace SettingsRegistryTests struct : public AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; + using ValueType [[maybe_unused]] = typename SettingsType::ValueType; void Visit([[maybe_unused]] AZStd::string_view path, [[maybe_unused]] AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type type, ValueType value) override { @@ -482,6 +486,7 @@ namespace SettingsRegistryTests struct : public AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit([[maybe_unused]] AZStd::string_view path, [[maybe_unused]] AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type type, AZ::s64 value) override { EXPECT_EQ(AZ::SettingsRegistryInterface::Type::Integer, type); @@ -517,6 +522,8 @@ namespace SettingsRegistryTests EXPECT_TRUE(path.ends_with(valueName)); return AZ::SettingsRegistryInterface::VisitResponse::Continue; } + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type , AZStd::string_view)override { EXPECT_TRUE(path.ends_with(valueName)); diff --git a/Code/Framework/AzCore/Tests/TaskTests.cpp b/Code/Framework/AzCore/Tests/TaskTests.cpp index f65dffcd99..e743ab6643 100644 --- a/Code/Framework/AzCore/Tests/TaskTests.cpp +++ b/Code/Framework/AzCore/Tests/TaskTests.cpp @@ -551,19 +551,37 @@ namespace Benchmark { class TaskGraphBenchmarkFixture : public ::benchmark::Fixture { - public: - void SetUp(benchmark::State&) override + void internalSetUp() { executor = new TaskExecutor; graph = new TaskGraph; } - void TearDown(benchmark::State&) override + void internalTearDown() { delete graph; delete executor; } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + TaskDescriptor descriptors[4] = { { "critical", "benchmark", TaskPriority::CRITICAL }, { "high", "benchmark", TaskPriority::HIGH }, { "medium", "benchmark", TaskPriority::MEDIUM }, From b52fab0c0c6424832af294dc6f703296ac393598 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 14:57:08 -0700 Subject: [PATCH 125/355] fixes AzFramework Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Entity/EntityDebugDisplayBus.h | 2 +- .../AzFramework/AzFramework/Gem/GemInfo.cpp | 1 + .../UnitTest/TestDebugDisplayRequests.h | 4 ++++ .../Tests/OctreePerformanceTests.cpp | 24 ++++++++++++++++--- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h b/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h index fddaddf303..0a4e1e01ae 100644 --- a/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h +++ b/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h @@ -102,7 +102,7 @@ namespace AzFramework virtual void PopMatrix() {} protected: - ~DebugDisplayRequests() = default; + virtual ~DebugDisplayRequests() = default; }; /// Inherit from DebugDisplayRequestBus::Handler to implement the DebugDisplayRequests interface. diff --git a/Code/Framework/AzFramework/AzFramework/Gem/GemInfo.cpp b/Code/Framework/AzFramework/AzFramework/Gem/GemInfo.cpp index 62a6334b5d..a7c6b18061 100644 --- a/Code/Framework/AzFramework/AzFramework/Gem/GemInfo.cpp +++ b/Code/Framework/AzFramework/AzFramework/Gem/GemInfo.cpp @@ -34,6 +34,7 @@ namespace AzFramework { } + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { diff --git a/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h b/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h index d4c6992057..72b15c1a69 100644 --- a/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h +++ b/Code/Framework/AzFramework/AzFramework/UnitTest/TestDebugDisplayRequests.h @@ -19,6 +19,8 @@ namespace UnitTest { public: TestDebugDisplayRequests(); + ~TestDebugDisplayRequests() override = default; + const AZStd::vector& GetPoints() const; void ClearPoints(); //! Returns the AABB of the points generated from received draw calls. @@ -27,7 +29,9 @@ namespace UnitTest // DebugDisplayRequests ... void DrawWireBox(const AZ::Vector3& min, const AZ::Vector3& max) override; void DrawSolidBox(const AZ::Vector3& min, const AZ::Vector3& max) override; + using AzFramework::DebugDisplayRequests::DrawWireQuad; void DrawWireQuad(float width, float height) override; + using AzFramework::DebugDisplayRequests::DrawQuad; void DrawQuad(float width, float height) override; void DrawTriangles(const AZStd::vector& vertices, const AZ::Color& color) override; void DrawTrianglesIndexed(const AZStd::vector& vertices, const AZStd::vector& indices, const AZ::Color& color) override; diff --git a/Code/Framework/AzFramework/Tests/OctreePerformanceTests.cpp b/Code/Framework/AzFramework/Tests/OctreePerformanceTests.cpp index 79332d638b..64fba61e2c 100644 --- a/Code/Framework/AzFramework/Tests/OctreePerformanceTests.cpp +++ b/Code/Framework/AzFramework/Tests/OctreePerformanceTests.cpp @@ -20,8 +20,7 @@ namespace Benchmark class BM_Octree : public benchmark::Fixture { - public: - void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { // Create the SystemAllocator if not available if (!AZ::AllocatorInstance::IsReady()) @@ -72,7 +71,7 @@ namespace Benchmark }); } - void TearDown([[maybe_unused]] const ::benchmark::State& state) override + void internalTearDown() { m_octreeSystemComponent->DestroyVisibilityScene(m_visScene); delete m_octreeSystemComponent; @@ -91,6 +90,25 @@ namespace Benchmark } } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + void InsertEntries(uint32_t entryCount) { for (uint32_t i = 0; i < entryCount; ++i) From bf801da84c5bcc8b6a9e662dcce0771bf951dc5c Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 15:08:08 -0700 Subject: [PATCH 126/355] fixes AzNetworking Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h b/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h index 15d4cfa10c..0243395d1e 100644 --- a/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h +++ b/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h @@ -30,6 +30,7 @@ namespace AzNetworking { public: + virtual ~UdpFragmentQueue() = default; //! Updates the UdpFragmentQueue timeout queue. void Update(); From 28795c8f5c21aec7576726980a6ea2c92f5b9a5b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 15:08:23 -0700 Subject: [PATCH 127/355] Fixes AzQtComponents Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzQtComponents/AzQtComponents/Components/Style.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Style.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/Style.h index 702544eea6..2896fc51eb 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Style.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Style.h @@ -137,8 +137,10 @@ namespace AzQtComponents int pixelMetric(QStyle::PixelMetric metric, const QStyleOption* option, const QWidget* widget) const override; + using QProxyStyle::polish; void polish(QApplication* application) override; void polish(QWidget* widget) override; + using QProxyStyle::unpolish; void unpolish(QWidget* widget) override; QPalette standardPalette() const override; From 2f71b28b9765239ba7ff4e6892356d42565839a3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 15:08:43 -0700 Subject: [PATCH 128/355] Fixes AzToolsFramework Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Application/EditorEntityManager.h | 2 +- .../AzToolsFramework/Asset/AssetUtils.cpp | 1 + .../Commands/PreemptiveUndoCache.h | 2 +- .../AzToolsFramework/Prefab/PrefabUndoCache.h | 2 ++ .../Benchmark/PrefabBenchmarkFixture.cpp | 4 +-- .../Prefab/Benchmark/PrefabBenchmarkFixture.h | 25 +++++++++++++++---- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h index f74b971512..5786cc3fbc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/EditorEntityManager.h @@ -17,7 +17,7 @@ namespace AzToolsFramework : public EditorEntityAPI { public: - ~EditorEntityManager(); + virtual ~EditorEntityManager(); void Start(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp index 6e55d9f97c..139bbb563c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetUtils.cpp @@ -97,6 +97,7 @@ namespace AzToolsFramework::AssetUtils struct EnabledPlatformsVisitor : AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override; AZStd::vector m_enabledPlatforms; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h index ed36a4458e..85947f56f6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Commands/PreemptiveUndoCache.h @@ -34,7 +34,7 @@ namespace AzToolsFramework static PreemptiveUndoCache* Get(); PreemptiveUndoCache(); - ~PreemptiveUndoCache(); + virtual ~PreemptiveUndoCache(); void RegisterToUndoCacheInterface(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h index b5a8cf9e3a..43cb7f0d2d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabUndoCache.h @@ -32,6 +32,8 @@ namespace AzToolsFramework public: AZ_CLASS_ALLOCATOR(PrefabUndoCache, AZ::SystemAllocator, 0); + virtual ~PrefabUndoCache() = default; + void Initialize(); void Destroy(); diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.cpp b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.cpp index 9925d5bff3..e5ce22e13a 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.cpp +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.cpp @@ -50,7 +50,7 @@ namespace Benchmark SetupPrefabSystem(); } - void BM_Prefab::SetUp(::benchmark::State & state) + void BM_Prefab::internalSetUp(const benchmark::State& state) { AZ::Debug::TraceMessageBus::Handler::BusConnect(); @@ -59,7 +59,7 @@ namespace Benchmark SetupPrefabSystem(); } - void BM_Prefab::TearDown(::benchmark::State & state) + void BM_Prefab::internalTearDown(const benchmark::State& state) { m_paths = {}; diff --git a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h index a55d5c7789..bd4b20cd77 100644 --- a/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h +++ b/Code/Framework/AzToolsFramework/Tests/Prefab/Benchmark/PrefabBenchmarkFixture.h @@ -24,12 +24,27 @@ namespace Benchmark : public UnitTest::AllocatorsBenchmarkFixture , public UnitTest::TraceBusRedirector { - protected: - using ::benchmark::Fixture::SetUp; - using ::benchmark::Fixture::TearDown; + void internalSetUp(const benchmark::State& state); + void internalTearDown(const benchmark::State& state); - void SetUp(::benchmark::State& state) override; - void TearDown(::benchmark::State& state) override; + protected: + void SetUp(const benchmark::State& state) override + { + internalSetUp(state); + } + void SetUp(benchmark::State& state) override + { + internalSetUp(state); + } + + void TearDown(const benchmark::State& state) override + { + internalTearDown(state); + } + void TearDown(benchmark::State& state) override + { + internalTearDown(state); + } AZ::Entity* CreateEntity( const char* entityName, From 51fe681dbd81030756b0b60763b2a05d4969eb5e Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 15:21:32 -0700 Subject: [PATCH 129/355] address PR comments Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/Plugins/FFMPEGPlugin/main.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Code/Editor/Plugins/FFMPEGPlugin/main.cpp b/Code/Editor/Plugins/FFMPEGPlugin/main.cpp index 847d426922..fed0ec8678 100644 --- a/Code/Editor/Plugins/FFMPEGPlugin/main.cpp +++ b/Code/Editor/Plugins/FFMPEGPlugin/main.cpp @@ -24,9 +24,7 @@ PLUGIN_API IPlugin* CreatePluginInstance(PLUGIN_INIT_PARAM* pInitParam) // Make sure the ffmpeg command can be executed before registering the command if (!CFFMPEGPlugin::RuntimeTest()) { - GetIEditor()->GetSystem()->GetILog()->Log("FFMPEG plugin: Failed to execute FFmepg. Please run Setup Assistant, " - "go to the 'Optional software' section of the 'Install software' tab, " - "and make sure the FFmpeg executable is correctly configured."); + GetIEditor()->GetSystem()->GetILog()->Log("FFMPEG plugin: Failed to execute FFmepg. Please install FFmepg."); } else { From b28349be7368ad310e5a7ff7a44769e8a579e376 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 15:36:48 -0700 Subject: [PATCH 130/355] Fixes for Android Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/Platform/Android/AzCore/Debug/Trace_Android.cpp | 2 +- Code/LauncherUnified/Platform/Android/Launcher_Android.cpp | 2 +- Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Framework/AzCore/Platform/Android/AzCore/Debug/Trace_Android.cpp b/Code/Framework/AzCore/Platform/Android/AzCore/Debug/Trace_Android.cpp index 07a132d2b9..5bd68b3ed6 100644 --- a/Code/Framework/AzCore/Platform/Android/AzCore/Debug/Trace_Android.cpp +++ b/Code/Framework/AzCore/Platform/Android/AzCore/Debug/Trace_Android.cpp @@ -18,7 +18,7 @@ namespace AZ { void OutputToDebugger([[maybe_unused]] const char* window, [[maybe_unused]] const char* message) { - __android_log_print(ANDROID_LOG_INFO, window, message); + __android_log_print(ANDROID_LOG_INFO, window, "%s", message); } } } diff --git a/Code/LauncherUnified/Platform/Android/Launcher_Android.cpp b/Code/LauncherUnified/Platform/Android/Launcher_Android.cpp index f158426184..de548a49d7 100644 --- a/Code/LauncherUnified/Platform/Android/Launcher_Android.cpp +++ b/Code/LauncherUnified/Platform/Android/Launcher_Android.cpp @@ -426,7 +426,7 @@ void android_main(android_app* appState) if (status != ReturnCode::Success) { - MAIN_EXIT_FAILURE(appState, GetReturnCodeString(status)); + MAIN_EXIT_FAILURE(appState, "%s", GetReturnCodeString(status)); } } diff --git a/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp b/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp index 9e0ea304ef..a1bcc1ec5f 100644 --- a/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp +++ b/Code/Tools/AzTestRunner/Platform/Android/platform_android.cpp @@ -278,7 +278,7 @@ static void *thread_logger_func(void*) --readSize; } logBuffer[readSize] = '\0'; - ((void) __android_log_print(ANDROID_LOG_INFO, s_logTag, logBuffer)); + ((void) __android_log_print(ANDROID_LOG_INFO, s_logTag, "%s", logBuffer)); } } return 0; From 9929782e8698b550bfed95bd6ae0d2f920afac84 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 17:32:37 -0700 Subject: [PATCH 131/355] Changes how renderdoc is added, since this is not a real 3rdParty we want to depend on but some functionality we want to enable/disable Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/Atom/RHI/Code/CMakeLists.txt | 29 +++++++++---------- .../renderdoc_support_android.cmake} | 3 +- .../Code/Platform/Linux/renderdoc_linux.cmake | 27 +++++------------ .../Linux/renderdoc_support_linux.cmake | 14 +++++++++ .../Platform/Mac/renderdoc_support_mac.cmake | 9 ++++++ .../Windows/renderdoc_support_windows.cmake | 14 +++++++++ .../Platform/Windows/renderdoc_windows.cmake | 29 +++++-------------- .../Platform/iOS/renderdoc_support_ios.cmake | 9 ++++++ 8 files changed, 76 insertions(+), 58 deletions(-) rename Gems/Atom/RHI/Code/Platform/{AppleTV/AtomRHITests_traits_appletv.cmake => Android/renderdoc_support_android.cmake} (69%) create mode 100644 Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake create mode 100644 Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake create mode 100644 Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake create mode 100644 Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake diff --git a/Gems/Atom/RHI/Code/CMakeLists.txt b/Gems/Atom/RHI/Code/CMakeLists.txt index 343736ff7c..a70786a9e0 100644 --- a/Gems/Atom/RHI/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Code/CMakeLists.txt @@ -11,19 +11,16 @@ ly_get_list_relative_pal_filename(pal_source_dir ${CMAKE_CURRENT_LIST_DIR}/Sourc include(${pal_dir}/AtomRHITests_traits_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) -set(LY_RENDERDOC_ENABLED OFF CACHE BOOL "Enable RenderDoc integration.") -set(RENDERDOC_CMAKE ${CMAKE_CURRENT_SOURCE_DIR}/${pal_dir}/renderdoc_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) -if(EXISTS ${RENDERDOC_CMAKE}) - include(${RENDERDOC_CMAKE}) -endif() - -if(LY_RENDERDOC_ENABLED AND TARGET "3rdParty::renderdoc") - message(STATUS "Renderdoc found, adding as runtime dependency") - set(USE_RENDERDOC_DEFINE "USE_RENDERDOC") - set(RENDERDOC_BUILD_DEPENDENCY "3rdParty::renderdoc") -else() - set(USE_RENDERDOC_DEFINE "") - set(RENDERDOC_BUILD_DEPENDENCY "") +include(${CMAKE_CURRENT_SOURCE_DIR}/${pal_dir}/renderdoc_support_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) +if(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED) + set(LY_RENDERDOC_ENABLED OFF CACHE BOOL "Enable RenderDoc integration. Use LY_RENDERDOC_PATH to specific the path to RenderDoc.") + if(LY_RENDERDOC_ENABLED) + include(${CMAKE_CURRENT_SOURCE_DIR}/${pal_dir}/renderdoc_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) + if(PAL_TRAIT_BUILD_RENDERDOC_ENABLED) + message(STATUS "Renderdoc found, adding as runtime dependency") + set(RENDERDOC_DEFINE USE_RENDERDOC) + endif() + endif() endif() ly_add_target( @@ -61,11 +58,11 @@ ly_add_target( AZ::AzCore AZ::AzFramework Gem::Atom_RHI.Reflect - PUBLIC - ${RENDERDOC_BUILD_DEPENDENCY} COMPILE_DEFINITIONS PUBLIC - ${USE_RENDERDOC_DEFINE} + ${RENDERDOC_DEFINE} + RUNTIME_DEPENDENCIES + ${RENDERDOC_RUNTIME_DEPENDENCIES} ) ly_add_target( diff --git a/Gems/Atom/RHI/Code/Platform/AppleTV/AtomRHITests_traits_appletv.cmake b/Gems/Atom/RHI/Code/Platform/Android/renderdoc_support_android.cmake similarity index 69% rename from Gems/Atom/RHI/Code/Platform/AppleTV/AtomRHITests_traits_appletv.cmake rename to Gems/Atom/RHI/Code/Platform/Android/renderdoc_support_android.cmake index 1aeb95c7b1..97090b9144 100644 --- a/Gems/Atom/RHI/Code/Platform/AppleTV/AtomRHITests_traits_appletv.cmake +++ b/Gems/Atom/RHI/Code/Platform/Android/renderdoc_support_android.cmake @@ -6,5 +6,4 @@ # # -set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_TEST FALSE) -set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_EDIT FALSE) +set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) diff --git a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake b/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake index 222a3d5768..aae720eb0f 100644 --- a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake +++ b/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake @@ -6,24 +6,13 @@ # # -# Prevent bundling the renderdoc dll with a packaged title -if(NOT LY_MONOLITHIC_GAME) - if(DEFINED ENV{"ATOM_RENDERDOC_PATH"}) - set(RENDERDOC_PATH ENV{"ATOM_RENDERDOC_PATH"}) - endif() +set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED FALSE) +set(LY_RENDERDOC_PATH "/usr/local" CACHE PATH "Path to RenderDoc.") - if(RENDERDOC_PATH) - # Normalize file path - file(TO_CMAKE_PATH "${RENDERDOC_PATH}" RENDERDOC_PATH) +# Normalize file path +file(TO_CMAKE_PATH "${LY_RENDERDOC_PATH}" LY_RENDERDOC_PATH) - if(EXISTS "${RENDERDOC_PATH}/librenderdoc.so") - ly_add_external_target( - NAME renderdoc - VERSION - 3RDPARTY_ROOT_DIRECTORY ${RENDERDOC_PATH} - INCLUDE_DIRECTORIES "." - RUNTIME_DEPENDENCIES "${RENDERDOC_PATH}/librenderdoc.so" - ) - endif() - endif() -endif() \ No newline at end of file +if(EXISTS "${LY_RENDERDOC_PATH}/librenderdoc.so") + set(RENDERDOC_RUNTIME_DEPENDENCIES "${RENDERDOC_PATH}/librenderdoc.so") + set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED TRUE) +endif() diff --git a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake b/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake new file mode 100644 index 0000000000..449593c791 --- /dev/null +++ b/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake @@ -0,0 +1,14 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +# Prevent bundling the renderdoc dll with a packaged title +if(LY_MONOLITHIC_GAME) + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +else() + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED TRUE) +endif() diff --git a/Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake b/Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake new file mode 100644 index 0000000000..97090b9144 --- /dev/null +++ b/Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake @@ -0,0 +1,9 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) diff --git a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake b/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake new file mode 100644 index 0000000000..449593c791 --- /dev/null +++ b/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake @@ -0,0 +1,14 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +# Prevent bundling the renderdoc dll with a packaged title +if(LY_MONOLITHIC_GAME) + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +else() + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED TRUE) +endif() diff --git a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake b/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake index 90c44bcb7c..2d3c2c039f 100644 --- a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake +++ b/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake @@ -6,26 +6,13 @@ # # -# Prevent bundling the renderdoc dll with a packaged title -if(NOT LY_MONOLITHIC_GAME) - # Common installation path for renderdoc path - set(RENDERDOC_PATH "$ENV{PROGRAMFILES}/RenderDoc") - if(DEFINED ENV{"ATOM_RENDERDOC_PATH"}) - set(RENDERDOC_PATH ENV{"ATOM_RENDERDOC_PATH"}) - endif() +set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED FALSE) +set(LY_RENDERDOC_PATH "$ENV{PROGRAMFILES}/RenderDoc" CACHE PATH "Path to RenderDoc.") - if(RENDERDOC_PATH) - # Normalize file path - file(TO_CMAKE_PATH "${RENDERDOC_PATH}" RENDERDOC_PATH) +# Normalize file path +file(TO_CMAKE_PATH "${LY_RENDERDOC_PATH}" LY_RENDERDOC_PATH) - if(EXISTS "${RENDERDOC_PATH}/renderdoc.dll") - ly_add_external_target( - NAME renderdoc - VERSION - 3RDPARTY_ROOT_DIRECTORY ${RENDERDOC_PATH} - INCLUDE_DIRECTORIES "." - RUNTIME_DEPENDENCIES "${RENDERDOC_PATH}/renderdoc.dll" - ) - endif() - endif() -endif() \ No newline at end of file +if(EXISTS "${LY_RENDERDOC_PATH}/renderdoc.dll") + set(RENDERDOC_RUNTIME_DEPENDENCIES "${RENDERDOC_PATH}/renderdoc.dll") + set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED TRUE) +endif() diff --git a/Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake b/Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake new file mode 100644 index 0000000000..97090b9144 --- /dev/null +++ b/Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake @@ -0,0 +1,9 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) From e215dd4423cfe32314a682f8565d7eda4fe3d775 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 18:23:11 -0700 Subject: [PATCH 132/355] prevents 3rdParty that are not in the source tree from being installed Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/3rdParty.cmake | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/3rdParty.cmake b/cmake/3rdParty.cmake index 0142a6a4b6..310e341305 100644 --- a/cmake/3rdParty.cmake +++ b/cmake/3rdParty.cmake @@ -122,7 +122,13 @@ function(ly_add_external_target) set(BASE_PATH "${LY_3RDPARTY_PATH}/${ly_add_external_target_3RDPARTY_DIRECTORY}") else() - ly_install_external_target(${ly_add_external_target_3RDPARTY_ROOT_DIRECTORY}) + # only install external 3rdParty that are within the source tree + cmake_path(RELATIVE_PATH ly_add_external_target_3RDPARTY_ROOT_DIRECTORY + BASE_DIRECTORY ${LY_ROOT_FOLDER} + OUTPUT_VARIABLE relative_path) + if(relative_path AND NOT relative_path MATCHES "^../") + ly_install_external_target(${ly_add_external_target_3RDPARTY_ROOT_DIRECTORY}) + endif() set(BASE_PATH "${ly_add_external_target_3RDPARTY_ROOT_DIRECTORY}") endif() @@ -309,7 +315,7 @@ function(ly_install_external_target 3RDPARTY_ROOT_DIRECTORY) ly_install_files(FILES ${CMAKE_CURRENT_LIST_FILE} DESTINATION cmake/3rdParty ) - ly_install_directory(DIRECTORIES ${3RDPARTY_ROOT_DIRECTORY}) + ly_install_directory(DIRECTORIES "${3RDPARTY_ROOT_DIRECTORY}") endfunction() From a63954d6cf7c678da27fd6fef4142cf6110e3081 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 18:26:59 -0700 Subject: [PATCH 133/355] simplifying how PIX is passed Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzCore/CMakeLists.txt | 13 ++++++------- cmake/3rdParty/FindPIX.cmake | 19 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Code/Framework/AzCore/CMakeLists.txt b/Code/Framework/AzCore/CMakeLists.txt index eec5b37e03..60c5f50594 100644 --- a/Code/Framework/AzCore/CMakeLists.txt +++ b/Code/Framework/AzCore/CMakeLists.txt @@ -12,10 +12,12 @@ ly_get_list_relative_pal_filename(pal_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/${PAL_PLATFORM_NAME}) ly_get_list_relative_pal_filename(common_dir ${CMAKE_CURRENT_LIST_DIR}/Platform/Common) -if(PAL_TRAIT_PROF_PIX_SUPPORTED AND LY_PIX_ENABLED) - set(LY_PIX_PATH "${LY_3RDPARTY_PATH}/winpixeventruntime" CACHE PATH "Path to the Windows Pix Event Runtime.") - set(AZ_CORE_PIX_BUILD_DEPENDENCIES 3rdParty::pix) - set(AZ_CORE_PIX_BUILD_DEFINES "USE_PIX") +if(PAL_TRAIT_PROF_PIX_SUPPORTED) + set(LY_PIX_ENABLED OFF CACHE BOOL "Enables PIX profiler integration.") + if(LY_PIX_ENABLED) + message(STATUS "PIX found, enabling as profiler") + set(AZ_CORE_PIX_BUILD_DEPENDENCIES 3rdParty::pix) + endif() endif() ly_add_target( @@ -41,9 +43,6 @@ ly_add_target( 3rdParty::zstd 3rdParty::cityhash ${AZ_CORE_PIX_BUILD_DEPENDENCIES} - COMPILE_DEFINITIONS - PUBLIC - ${AZ_CORE_PIX_BUILD_DEFINES} ) ly_add_source_properties( SOURCES diff --git a/cmake/3rdParty/FindPIX.cmake b/cmake/3rdParty/FindPIX.cmake index e4652467ac..f69896f78f 100644 --- a/cmake/3rdParty/FindPIX.cmake +++ b/cmake/3rdParty/FindPIX.cmake @@ -6,14 +6,13 @@ # # -if(LY_PIX_ENABLED) - file(TO_CMAKE_PATH "${LY_PIX_PATH}" PIX_PATH) - message(STATUS "PIX found: ${PIX_PATH}") +set(LY_PIX_PATH "${LY_3RDPARTY_PATH}/winpixeventruntime" CACHE PATH "Path to the Windows Pix Event Runtime.") + +ly_add_external_target( + NAME pix + 3RDPARTY_ROOT_DIRECTORY ${LY_PIX_PATH} + VERSION + INCLUDE_DIRECTORIES Include + COMPILE_DEFINITIONS USE_PIX +) - ly_add_external_target( - NAME pix - 3RDPARTY_ROOT_DIRECTORY "${PIX_PATH}" - VERSION - INCLUDE_DIRECTORIES include - ) -endif() From 761f90b5b9becc95acbe422367ec0cef3d8f312e Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 18:27:45 -0700 Subject: [PATCH 134/355] Find file for renderdoc and better wiring Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Findrenderdoc.cmake} | 8 +++++++- .../Platform/Linux/renderdoc_linux.cmake} | 2 +- .../Platform/Windows/renderdoc_windows.cmake} | 2 +- Gems/Atom/RHI/CMakeLists.txt | 2 ++ Gems/Atom/RHI/Code/CMakeLists.txt | 11 +++-------- .../Android/AtomRHITests_traits_android.cmake | 1 + .../Linux/AtomRHITests_traits_linux.cmake | 6 ++++++ .../Code/Platform/Linux/renderdoc_linux.cmake | 18 ------------------ .../Linux/renderdoc_support_linux.cmake | 14 -------------- .../Platform/Mac/AtomRHITests_traits_mac.cmake | 1 + .../Windows/AtomRHITests_traits_windows.cmake | 6 ++++++ .../Windows/renderdoc_support_windows.cmake | 14 -------------- .../Platform/Windows/renderdoc_windows.cmake | 18 ------------------ .../Platform/iOS/AtomRHITests_traits_ios.cmake | 1 + 14 files changed, 29 insertions(+), 75 deletions(-) rename Gems/Atom/RHI/{Code/Platform/Mac/renderdoc_support_mac.cmake => 3rdParty/Findrenderdoc.cmake} (55%) rename Gems/Atom/RHI/{Code/Platform/iOS/renderdoc_support_ios.cmake => 3rdParty/Platform/Linux/renderdoc_linux.cmake} (76%) rename Gems/Atom/RHI/{Code/Platform/Android/renderdoc_support_android.cmake => 3rdParty/Platform/Windows/renderdoc_windows.cmake} (76%) delete mode 100644 Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake delete mode 100644 Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake delete mode 100644 Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake delete mode 100644 Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake diff --git a/Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake b/Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake similarity index 55% rename from Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake rename to Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake index 97090b9144..7b7c312169 100644 --- a/Gems/Atom/RHI/Code/Platform/Mac/renderdoc_support_mac.cmake +++ b/Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake @@ -6,4 +6,10 @@ # # -set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +ly_add_external_target( + NAME renderdoc + 3RDPARTY_ROOT_DIRECTORY "${LY_RENDERDOC_PATH}" + VERSION + INCLUDE_DIRECTORIES . + COMPILE_DEFINITIONS USE_RENDER_DOC +) diff --git a/Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake b/Gems/Atom/RHI/3rdParty/Platform/Linux/renderdoc_linux.cmake similarity index 76% rename from Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake rename to Gems/Atom/RHI/3rdParty/Platform/Linux/renderdoc_linux.cmake index 97090b9144..a74d250901 100644 --- a/Gems/Atom/RHI/Code/Platform/iOS/renderdoc_support_ios.cmake +++ b/Gems/Atom/RHI/3rdParty/Platform/Linux/renderdoc_linux.cmake @@ -6,4 +6,4 @@ # # -set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +set(RENDERDOC_RUNTIME_DEPENDENCIES "${BASE_PATH}/librenderdoc.so") diff --git a/Gems/Atom/RHI/Code/Platform/Android/renderdoc_support_android.cmake b/Gems/Atom/RHI/3rdParty/Platform/Windows/renderdoc_windows.cmake similarity index 76% rename from Gems/Atom/RHI/Code/Platform/Android/renderdoc_support_android.cmake rename to Gems/Atom/RHI/3rdParty/Platform/Windows/renderdoc_windows.cmake index 97090b9144..559863ca07 100644 --- a/Gems/Atom/RHI/Code/Platform/Android/renderdoc_support_android.cmake +++ b/Gems/Atom/RHI/3rdParty/Platform/Windows/renderdoc_windows.cmake @@ -6,4 +6,4 @@ # # -set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +set(RENDERDOC_RUNTIME_DEPENDENCIES "${BASE_PATH}/renderdoc.dll") diff --git a/Gems/Atom/RHI/CMakeLists.txt b/Gems/Atom/RHI/CMakeLists.txt index 28a3e1ad7d..074f6acfd7 100644 --- a/Gems/Atom/RHI/CMakeLists.txt +++ b/Gems/Atom/RHI/CMakeLists.txt @@ -6,6 +6,8 @@ # # +ly_add_external_target_path(${CMAKE_CURRENT_LIST_DIR}/3rdParty) + add_subdirectory(Code) add_subdirectory(DX12) add_subdirectory(Metal) diff --git a/Gems/Atom/RHI/Code/CMakeLists.txt b/Gems/Atom/RHI/Code/CMakeLists.txt index a70786a9e0..879fc7d2ce 100644 --- a/Gems/Atom/RHI/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Code/CMakeLists.txt @@ -11,15 +11,10 @@ ly_get_list_relative_pal_filename(pal_source_dir ${CMAKE_CURRENT_LIST_DIR}/Sourc include(${pal_dir}/AtomRHITests_traits_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) -include(${CMAKE_CURRENT_SOURCE_DIR}/${pal_dir}/renderdoc_support_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) if(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED) set(LY_RENDERDOC_ENABLED OFF CACHE BOOL "Enable RenderDoc integration. Use LY_RENDERDOC_PATH to specific the path to RenderDoc.") if(LY_RENDERDOC_ENABLED) - include(${CMAKE_CURRENT_SOURCE_DIR}/${pal_dir}/renderdoc_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) - if(PAL_TRAIT_BUILD_RENDERDOC_ENABLED) - message(STATUS "Renderdoc found, adding as runtime dependency") - set(RENDERDOC_DEFINE USE_RENDERDOC) - endif() + set(RENDERDOC_DEPENDENCY 3rdParty::renderdoc) endif() endif() @@ -58,11 +53,11 @@ ly_add_target( AZ::AzCore AZ::AzFramework Gem::Atom_RHI.Reflect + PUBLIC + ${RENDERDOC_DEPENDENCY} COMPILE_DEFINITIONS PUBLIC ${RENDERDOC_DEFINE} - RUNTIME_DEPENDENCIES - ${RENDERDOC_RUNTIME_DEPENDENCIES} ) ly_add_target( diff --git a/Gems/Atom/RHI/Code/Platform/Android/AtomRHITests_traits_android.cmake b/Gems/Atom/RHI/Code/Platform/Android/AtomRHITests_traits_android.cmake index 1aeb95c7b1..5b77ec1593 100644 --- a/Gems/Atom/RHI/Code/Platform/Android/AtomRHITests_traits_android.cmake +++ b/Gems/Atom/RHI/Code/Platform/Android/AtomRHITests_traits_android.cmake @@ -8,3 +8,4 @@ set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_TEST FALSE) set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_EDIT FALSE) +set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) diff --git a/Gems/Atom/RHI/Code/Platform/Linux/AtomRHITests_traits_linux.cmake b/Gems/Atom/RHI/Code/Platform/Linux/AtomRHITests_traits_linux.cmake index 64d44f1648..5379a47e49 100644 --- a/Gems/Atom/RHI/Code/Platform/Linux/AtomRHITests_traits_linux.cmake +++ b/Gems/Atom/RHI/Code/Platform/Linux/AtomRHITests_traits_linux.cmake @@ -8,3 +8,9 @@ set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_TEST FALSE) set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_EDIT TRUE) +if(LY_MONOLITHIC_GAME) + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +else() + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED TRUE) +endif() +set(LY_RENDERDOC_PATH "/usr/local" CACHE PATH "Path to RenderDoc.") diff --git a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake b/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake deleted file mode 100644 index aae720eb0f..0000000000 --- a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_linux.cmake +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# - -set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED FALSE) -set(LY_RENDERDOC_PATH "/usr/local" CACHE PATH "Path to RenderDoc.") - -# Normalize file path -file(TO_CMAKE_PATH "${LY_RENDERDOC_PATH}" LY_RENDERDOC_PATH) - -if(EXISTS "${LY_RENDERDOC_PATH}/librenderdoc.so") - set(RENDERDOC_RUNTIME_DEPENDENCIES "${RENDERDOC_PATH}/librenderdoc.so") - set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED TRUE) -endif() diff --git a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake b/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake deleted file mode 100644 index 449593c791..0000000000 --- a/Gems/Atom/RHI/Code/Platform/Linux/renderdoc_support_linux.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# - -# Prevent bundling the renderdoc dll with a packaged title -if(LY_MONOLITHIC_GAME) - set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) -else() - set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED TRUE) -endif() diff --git a/Gems/Atom/RHI/Code/Platform/Mac/AtomRHITests_traits_mac.cmake b/Gems/Atom/RHI/Code/Platform/Mac/AtomRHITests_traits_mac.cmake index a5f701c3cf..419331db3b 100644 --- a/Gems/Atom/RHI/Code/Platform/Mac/AtomRHITests_traits_mac.cmake +++ b/Gems/Atom/RHI/Code/Platform/Mac/AtomRHITests_traits_mac.cmake @@ -8,3 +8,4 @@ set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_TEST TRUE) set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_EDIT TRUE) +set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) diff --git a/Gems/Atom/RHI/Code/Platform/Windows/AtomRHITests_traits_windows.cmake b/Gems/Atom/RHI/Code/Platform/Windows/AtomRHITests_traits_windows.cmake index a5f701c3cf..78a4c4c069 100644 --- a/Gems/Atom/RHI/Code/Platform/Windows/AtomRHITests_traits_windows.cmake +++ b/Gems/Atom/RHI/Code/Platform/Windows/AtomRHITests_traits_windows.cmake @@ -8,3 +8,9 @@ set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_TEST TRUE) set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_EDIT TRUE) +if(LY_MONOLITHIC_GAME) + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) +else() + set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED TRUE) +endif() +set(LY_RENDERDOC_PATH "$ENV{PROGRAMFILES}/RenderDoc" CACHE PATH "Path to RenderDoc.") diff --git a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake b/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake deleted file mode 100644 index 449593c791..0000000000 --- a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_support_windows.cmake +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# - -# Prevent bundling the renderdoc dll with a packaged title -if(LY_MONOLITHIC_GAME) - set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) -else() - set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED TRUE) -endif() diff --git a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake b/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake deleted file mode 100644 index 2d3c2c039f..0000000000 --- a/Gems/Atom/RHI/Code/Platform/Windows/renderdoc_windows.cmake +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# - -set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED FALSE) -set(LY_RENDERDOC_PATH "$ENV{PROGRAMFILES}/RenderDoc" CACHE PATH "Path to RenderDoc.") - -# Normalize file path -file(TO_CMAKE_PATH "${LY_RENDERDOC_PATH}" LY_RENDERDOC_PATH) - -if(EXISTS "${LY_RENDERDOC_PATH}/renderdoc.dll") - set(RENDERDOC_RUNTIME_DEPENDENCIES "${RENDERDOC_PATH}/renderdoc.dll") - set(PAL_TRAIT_BUILD_RENDERDOC_ENABLED TRUE) -endif() diff --git a/Gems/Atom/RHI/Code/Platform/iOS/AtomRHITests_traits_ios.cmake b/Gems/Atom/RHI/Code/Platform/iOS/AtomRHITests_traits_ios.cmake index 1aeb95c7b1..5b77ec1593 100644 --- a/Gems/Atom/RHI/Code/Platform/iOS/AtomRHITests_traits_ios.cmake +++ b/Gems/Atom/RHI/Code/Platform/iOS/AtomRHITests_traits_ios.cmake @@ -8,3 +8,4 @@ set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_TEST FALSE) set(ATOM_RHI_TRAIT_BUILD_SUPPORTS_EDIT FALSE) +set(PAL_TRAIT_BUILD_RENDERDOC_SUPPORTED FALSE) From 40d2fe61a14c9882b6d4bd550159762f2f48e570 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:35:39 -0700 Subject: [PATCH 135/355] Gems/Atom Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Common/Code/Source/Material/DrawListFunctor.h | 1 + .../Code/Source/Material/DrawListFunctorSourceData.h | 1 + .../Material/SubsurfaceTransmissionParameterFunctor.h | 1 + .../SubsurfaceTransmissionParameterFunctorSourceData.h | 1 + .../Common/Code/Source/Material/Transform2DFunctor.h | 1 + .../Code/Source/Material/Transform2DFunctorSourceData.h | 1 + .../RHI/Code/Include/Atom/RHI/PipelineStateDescriptor.h | 9 ++++----- .../RPI/Code/Include/Atom/RPI.Public/Pass/PassFilter.h | 2 ++ Gems/Atom/RPI/Code/Tests/Common/SerializeTester.h | 3 ++- Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp | 6 +++--- .../RPI/Code/Tests/Material/MaterialFunctorTests.cpp | 3 +++ .../Material/MaterialPropertyValueSourceDataTests.cpp | 1 + .../RPI/Code/Tests/Material/MaterialTypeAssetTests.cpp | 2 ++ .../Code/Tests/Material/MaterialTypeSourceDataTests.cpp | 6 ++++++ 14 files changed, 29 insertions(+), 9 deletions(-) diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctor.h b/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctor.h index eb4bb0ab00..a21fb963e9 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctor.h @@ -26,6 +26,7 @@ namespace AZ static void Reflect(ReflectContext* context); + using RPI::MaterialFunctor::Process; void Process(RuntimeContext& context) override; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctorSourceData.h b/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctorSourceData.h index 58df14a812..ba5e174101 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctorSourceData.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/DrawListFunctorSourceData.h @@ -27,6 +27,7 @@ namespace AZ static void Reflect(ReflectContext* context); + using RPI::MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h index 10be4a0c47..e412687947 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctor.h @@ -26,6 +26,7 @@ namespace AZ static void Reflect(ReflectContext* context); + using RPI::MaterialFunctor::Process; void Process(RuntimeContext& context) override; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h index c4f07c549d..9d074551c3 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/SubsurfaceTransmissionParameterFunctorSourceData.h @@ -25,6 +25,7 @@ namespace AZ static void Reflect(AZ::ReflectContext* context); + using AZ::RPI::MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctor.h b/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctor.h index bee24d90b7..2ef5af6913 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctor.h @@ -34,6 +34,7 @@ namespace AZ static void Reflect(ReflectContext* context); + using RPI::MaterialFunctor::Process; void Process(RuntimeContext& context) override; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctorSourceData.h b/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctorSourceData.h index ecac071f94..db7e65fedc 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctorSourceData.h +++ b/Gems/Atom/Feature/Common/Code/Source/Material/Transform2DFunctorSourceData.h @@ -25,6 +25,7 @@ namespace AZ static void Reflect(AZ::ReflectContext* context); + using AZ::RPI::MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override; private: diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineStateDescriptor.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineStateDescriptor.h index 63f0cb3822..83ab3cb584 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineStateDescriptor.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineStateDescriptor.h @@ -44,7 +44,7 @@ namespace AZ /// Returns the hash of the pipeline state descriptor contents. virtual HashValue64 GetHash() const = 0; - virtual bool operator == (const PipelineStateDescriptor& rhs) const; + bool operator == (const PipelineStateDescriptor& rhs) const; /// The pipeline layout describing the shader resource bindings. ConstPtr m_pipelineLayoutDescriptor = nullptr; @@ -77,8 +77,7 @@ namespace AZ /// Computes the hash value for this descriptor. HashValue64 GetHash() const override; - - virtual bool operator == (const PipelineStateDescriptorForDispatch& rhs) const; + bool operator == (const PipelineStateDescriptorForDispatch& rhs) const; /// The compute function containing byte code to compile. ConstPtr m_computeFunction; @@ -102,7 +101,7 @@ namespace AZ /// Computes the hash value for this descriptor. HashValue64 GetHash() const override; - virtual bool operator == (const PipelineStateDescriptorForDraw& rhs) const; + bool operator == (const PipelineStateDescriptorForDraw& rhs) const; /// [Required] The vertex function to compile. ConstPtr m_vertexFunction; @@ -135,7 +134,7 @@ namespace AZ //! Computes the hash value for this descriptor. HashValue64 GetHash() const override; - virtual bool operator == (const PipelineStateDescriptorForRayTracing& rhs) const; + bool operator == (const PipelineStateDescriptorForRayTracing& rhs) const; // The ray tracing shader byte code ConstPtr m_rayTracingFunction; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassFilter.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassFilter.h index 5429dc13c0..c31f353adb 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassFilter.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/PassFilter.h @@ -53,6 +53,8 @@ namespace AZ //! Construct filter with only pass name. PassHierarchyFilter(const Name& passName); + virtual ~PassHierarchyFilter() = default; + //! Construct filter with pass name and its parents' names in the order of the hierarchy //! This means k-th element is always an ancestor of the (k-1)-th element. //! And the last element is the pass name. diff --git a/Gems/Atom/RPI/Code/Tests/Common/SerializeTester.h b/Gems/Atom/RPI/Code/Tests/Common/SerializeTester.h index 8422756837..df21d13fc0 100644 --- a/Gems/Atom/RPI/Code/Tests/Common/SerializeTester.h +++ b/Gems/Atom/RPI/Code/Tests/Common/SerializeTester.h @@ -23,6 +23,7 @@ namespace UnitTest : m_serializeContext{serializeContext} , m_outStream{&m_buffer} {} + virtual ~SerializeTester() = default; // Serializes an object out to a the internal stream. Resets the stream with each call. virtual void SerializeOut(T* object, AZ::DataStream::StreamType streamType = AZ::DataStream::ST_XML); @@ -76,7 +77,7 @@ namespace UnitTest m_assetHandler = AZ::Data::AssetManager::Instance().GetHandler(AssetDataT::RTTI_Type()); } - ~AssetTester() = default; + virtual ~AssetTester() = default; void SerializeOut(AZ::Data::Asset assetToSave) { diff --git a/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp b/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp index 345637bfe5..86f97b96e9 100644 --- a/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp @@ -40,10 +40,9 @@ namespace AZ : public UnitTest::AssetTester { public: - StreamingImageAssetTester() - { + StreamingImageAssetTester() = default; + ~StreamingImageAssetTester() override = default; - } void SetAssetReady(Data::Asset& asset) override { asset->SetReady(); @@ -55,6 +54,7 @@ namespace AZ { public: ImageMipChainAssetTester() {} + ~ImageMipChainAssetTester() override = default; void SetAssetReady(Data::Asset& asset) override { diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp index 0c84484508..e1e8c91944 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp @@ -41,6 +41,7 @@ namespace UnitTest { } + using MaterialFunctor::Process; void Process(MaterialFunctor::RuntimeContext& context) override { m_processResult = context.SetShaderOptionValue(0, m_shaderOptionIndex, m_shaderOptionValue); @@ -65,6 +66,7 @@ namespace UnitTest public: MOCK_METHOD0(ProcessCalled, void()); + using MaterialFunctor::Process; void Process(RuntimeContext& context) override { ProcessCalled(); @@ -87,6 +89,7 @@ namespace UnitTest : public MaterialFunctorSourceData { public: + using MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override { Ptr functor = aznew PropertyDependencyTestFunctor; diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertyValueSourceDataTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertyValueSourceDataTests.cpp index 231558bb99..5dde21ece1 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertyValueSourceDataTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertyValueSourceDataTests.cpp @@ -142,6 +142,7 @@ namespace UnitTest AZStd::string m_propertyName; MaterialPropertyValueSourceData m_propertyValue; + using MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override { Ptr functor = aznew ValueFunctor; diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeAssetTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeAssetTests.cpp index e11a049af2..b9774c84d9 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeAssetTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeAssetTests.cpp @@ -47,6 +47,7 @@ namespace UnitTest ; } + using AZ::RPI::MaterialFunctor::Process; void Process(AZ::RPI::MaterialFunctor::RuntimeContext& context) override { // This code isn't actually called in the unit test, but we include it here just to demonstrate what a real functor might look like. @@ -74,6 +75,7 @@ namespace UnitTest ; } + using AZ::RPI::MaterialFunctor::Process; void Process(AZ::RPI::MaterialFunctor::RuntimeContext& context) override { // This code isn't actually called in the unit test, but we include it here just to demonstrate what a real functor might look like. diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeSourceDataTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeSourceDataTests.cpp index 5edf09b67d..179dc7c966 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeSourceDataTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialTypeSourceDataTests.cpp @@ -70,6 +70,7 @@ namespace UnitTest } } + using AZ::RPI::MaterialFunctor::Process; void Process(AZ::RPI::MaterialFunctor::RuntimeContext& context) override { // This code isn't actually called in the unit test, but we include it here just to demonstrate what a real functor might look like. @@ -110,6 +111,7 @@ namespace UnitTest AZStd::string m_floatPropertyInputId; AZStd::string m_float3ShaderSettingOutputId; + using MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override { Ptr functor = aznew Splat3Functor; @@ -138,6 +140,7 @@ namespace UnitTest } } + using AZ::RPI::MaterialFunctor::Process; void Process(AZ::RPI::MaterialFunctor::RuntimeContext& context) override { // This code isn't actually called in the unit test, but we include it here just to demonstrate what a real functor might look like. @@ -174,6 +177,7 @@ namespace UnitTest m_shaderIndex{shaderIndex} {} + using MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor(const RuntimeContext& context) const override { Ptr functor = aznew EnableShaderFunctor; @@ -200,6 +204,7 @@ namespace UnitTest } } + using AZ::RPI::MaterialFunctor::Process; void Process(AZ::RPI::MaterialFunctor::RuntimeContext& context) override { // This code isn't actually called in the unit test, but we include it here just to demonstrate what a real functor might look like. @@ -232,6 +237,7 @@ namespace UnitTest return options; } + using MaterialFunctorSourceData::CreateFunctor; FunctorResult CreateFunctor([[maybe_unused]] const RuntimeContext& context) const override { Ptr functor = aznew SetShaderOptionFunctor; From 30a976baa3499a39d3cead0288275c3f43c67c6e Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:36:00 -0700 Subject: [PATCH 136/355] Gems/AWS Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/AWSCore/Code/Source/Framework/JsonObjectHandler.cpp | 1 + .../Tests/Editor/Attribution/AWSAttributionServiceApiTest.cpp | 2 ++ Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp | 2 ++ 3 files changed, 5 insertions(+) diff --git a/Gems/AWSCore/Code/Source/Framework/JsonObjectHandler.cpp b/Gems/AWSCore/Code/Source/Framework/JsonObjectHandler.cpp index d041a97428..07df7806a9 100644 --- a/Gems/AWSCore/Code/Source/Framework/JsonObjectHandler.cpp +++ b/Gems/AWSCore/Code/Source/Framework/JsonObjectHandler.cpp @@ -19,6 +19,7 @@ namespace AWSCore { public: + virtual ~JsonReaderHandler() = default; using Ch = char; using SizeType = rapidjson::SizeType; diff --git a/Gems/AWSCore/Code/Tests/Editor/Attribution/AWSAttributionServiceApiTest.cpp b/Gems/AWSCore/Code/Tests/Editor/Attribution/AWSAttributionServiceApiTest.cpp index 9b90d5ca8d..4290713e5c 100644 --- a/Gems/AWSCore/Code/Tests/Editor/Attribution/AWSAttributionServiceApiTest.cpp +++ b/Gems/AWSCore/Code/Tests/Editor/Attribution/AWSAttributionServiceApiTest.cpp @@ -21,6 +21,8 @@ namespace AWSCoreUnitTest : public AWSCore::JsonReader { public: + virtual ~JsonReaderMock() = default; + MOCK_METHOD0(Ignore, bool()); MOCK_METHOD1(Accept, bool(bool& target)); MOCK_METHOD1(Accept, bool(AZStd::string& target)); diff --git a/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp b/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp index bbfc206ab0..8844e727b6 100644 --- a/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp +++ b/Gems/AWSMetrics/Code/Tests/AWSMetricsServiceApiTest.cpp @@ -19,6 +19,8 @@ namespace AWSMetrics : public AWSCore::JsonReader { public: + virtual ~JsonReaderMock() = default; + MOCK_METHOD0(Ignore, bool()); MOCK_METHOD1(Accept, bool(bool& target)); MOCK_METHOD1(Accept, bool(AZStd::string& target)); From 53c026b43e3463d99472ad1501ff58573ca3e11e Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:36:17 -0700 Subject: [PATCH 137/355] Gems/EditorPythonBindings Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp index 8df196e7cb..cfb5d1db40 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp @@ -425,6 +425,8 @@ namespace EditorPythonBindings GetGemSourcePathsVisitor(AZ::SettingsRegistryInterface& settingsRegistry) : m_settingsRegistry(settingsRegistry) {} + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { From 2acd05e595e655f54142a95ed8761ad56f852272 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:36:33 -0700 Subject: [PATCH 138/355] Gems/EMotionFX Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../EMStudioSDK/Source/RenderPlugin/ManipulatorCallbacks.h | 3 +++ .../AnimGraph/ParameterEditor/RotationParameterEditor.cpp | 1 + .../AnimGraph/ParameterEditor/Vector3GizmoParameterEditor.cpp | 1 + Gems/EMotionFX/Code/Tests/Mocks/AnimGraphInstance.h | 2 ++ Gems/EMotionFX/Code/Tests/Mocks/AnimGraphNode.h | 2 ++ Gems/EMotionFX/Code/Tests/Mocks/CommandManager.h | 2 +- Gems/EMotionFX/Code/Tests/Mocks/CommandSystemCommandManager.h | 2 ++ 7 files changed, 12 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/ManipulatorCallbacks.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/ManipulatorCallbacks.h index 902354931a..2f9201ffa9 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/ManipulatorCallbacks.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/ManipulatorCallbacks.h @@ -42,6 +42,7 @@ namespace EMStudio /** * update the actor instance. */ + using MCommon::ManipulatorCallback::Update; void Update(const AZ::Vector3& value) override; /** @@ -85,6 +86,7 @@ namespace EMStudio /** * update the actor instance. */ + using MCommon::ManipulatorCallback::Update; void Update(const AZ::Quaternion& value) override; /** @@ -125,6 +127,7 @@ namespace EMStudio /** * update the actor instance. */ + using MCommon::ManipulatorCallback::Update; void Update(const AZ::Vector3& value) override; /** diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/RotationParameterEditor.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/RotationParameterEditor.cpp index 805ef16b7d..18727f67d2 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/RotationParameterEditor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/RotationParameterEditor.cpp @@ -142,6 +142,7 @@ namespace EMStudio , m_manipulatorCallback(manipulatorCallback) {} + using MCommon::ManipulatorCallback::Update; void Update(const AZ::Quaternion& value) override { // call the base class update function diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/Vector3GizmoParameterEditor.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/Vector3GizmoParameterEditor.cpp index cc97f9d979..7a24ece95a 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/Vector3GizmoParameterEditor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterEditor/Vector3GizmoParameterEditor.cpp @@ -152,6 +152,7 @@ namespace EMStudio , m_manipulatorCallback(manipulatorCallback) {} + using MCommon::ManipulatorCallback::Update; void Update(const AZ::Vector3& value) override { // call the base class update function diff --git a/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphInstance.h b/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphInstance.h index e04f19fa95..b2375180e6 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphInstance.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphInstance.h @@ -11,6 +11,8 @@ namespace EMotionFX class AnimGraphInstance { public: + virtual ~AnimGraphInstance() = default; + //void Output(Pose* outputPose); //void Start(); //void Stop(); diff --git a/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphNode.h b/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphNode.h index 9c73694d2a..065be187c8 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphNode.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/AnimGraphNode.h @@ -14,6 +14,8 @@ namespace EMotionFX public: AZ_RTTI(AnimGraphNode, "{7F1C0E1D-4D32-4A6D-963C-20193EA28F95}", AnimGraphObject) + virtual ~AnimGraphNode() = default; + MOCK_CONST_METHOD1(CollectOutgoingConnections, void(AZStd::vector>& outConnections)); MOCK_CONST_METHOD2(CollectOutgoingConnections, void(AZStd::vector>& outConnections, const size_t portIndex)); diff --git a/Gems/EMotionFX/Code/Tests/Mocks/CommandManager.h b/Gems/EMotionFX/Code/Tests/Mocks/CommandManager.h index 0146086f06..50a465f5da 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/CommandManager.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/CommandManager.h @@ -11,7 +11,7 @@ namespace MCore class CommandManager { public: - //virtual ~CommandManager(); + virtual ~CommandManager() = default; //bool ExecuteCommand(const char* command, AZStd::string& outCommandResult, bool addToHistory = true, Command** outExecutedCommand = nullptr, CommandLine* outExecutedParamters = nullptr, bool callFromCommandGroup = false, bool clearErrors = true, bool handleErrors = true); //bool ExecuteCommand(const AZStd::string& command, AZStd::string& outCommandResult, bool addToHistory = true, Command** outExecutedCommand = nullptr, CommandLine* outExecutedParamters = nullptr, bool callFromCommandGroup = false, bool clearErrors = true, bool handleErrors = true); diff --git a/Gems/EMotionFX/Code/Tests/Mocks/CommandSystemCommandManager.h b/Gems/EMotionFX/Code/Tests/Mocks/CommandSystemCommandManager.h index adef6392bb..b50e9bf8d5 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/CommandSystemCommandManager.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/CommandSystemCommandManager.h @@ -12,6 +12,8 @@ namespace CommandSystem : public MCore::CommandManager { public: + virtual ~CommandManager() = default; + MOCK_METHOD0(GetCurrentSelection, SelectionList&()); MOCK_METHOD1(SetCurrentSelection, void(SelectionList& selection)); MOCK_CONST_METHOD0(GetLockSelection, bool()); From dfec238917936197e13fa7a84668966759c13a0c Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:36:48 -0700 Subject: [PATCH 139/355] Gems/GraphCanvas Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AlignmentContextMenuAction.h | 3 ++- .../AlignmentContextMenuActions.h | 3 ++- .../CommentContextMenuAction.h | 1 + .../CommentContextMenuActions.h | 2 ++ .../BookmarkConstructMenuActions.h | 1 + .../CommentConstructMenuActions.h | 1 + .../ConstructPresetMenuActions.h | 3 +++ .../DisableMenuActions/DisableMenuActions.h | 1 + .../EditMenuActions/EditContextMenuAction.h | 1 + .../EditMenuActions/EditContextMenuActions.h | 6 ++++++ .../NodeGroupContextMenuAction.h | 1 + .../NodeGroupContextMenuActions.h | 10 ++++++++++ .../NodeMenuActions/NodeContextMenuActions.h | 6 ++++-- .../SceneMenuActions/SceneContextMenuActions.h | 2 ++ .../SlotMenuActions/SlotContextMenuActions.h | 18 ++++++++++++++++++ .../GraphCanvasAssetEditorMainWindow.h | 2 ++ 16 files changed, 57 insertions(+), 4 deletions(-) diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h index 1334dff94a..fb51e76868 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuAction.h @@ -22,10 +22,11 @@ namespace GraphCanvas { } + using ContextMenuAction::RefreshAction; void RefreshAction() override { const AZ::EntityId& graphId = GetGraphId(); - const AZ::EntityId& targetId = GetTargetId(); + const AZ::EntityId& targetId = GetTargetId(); bool canAlignSelection = false; SceneRequestBus::EventResult(canAlignSelection, graphId, &SceneRequests::HasMultipleSelection); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h index bc5d8da1d5..fe261a5ce8 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/AlignmentMenuActions/AlignmentContextMenuActions.h @@ -30,7 +30,8 @@ namespace GraphCanvas bool IsInSubMenu() const override; AZStd::string GetSubMenuPath() const override; - + + using AlignmentContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; private: diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h index 2d2173204c..1ad2f41728 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuAction.h @@ -22,6 +22,7 @@ namespace GraphCanvas { } + using ContextMenuAction::RefreshAction; void RefreshAction(const GraphId& graphId, const AZ::EntityId& targetId) override { AZ_UNUSED(targetId); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuActions.h index cb4012ec55..8d19e0f9ab 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/CommentMenuActions/CommentContextMenuActions.h @@ -25,6 +25,8 @@ namespace GraphCanvas using ContextMenuAction::RefreshAction; void RefreshAction() override; + + using CommentContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h index e0f6320088..d1ac3b083f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/BookmarkConstructMenuActions.h @@ -20,6 +20,7 @@ namespace GraphCanvas AddBookmarkMenuAction(QObject* parent); virtual ~AddBookmarkMenuAction() = default; + using ConstructContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h index 1a22f40ea0..3c9c767619 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/CommentConstructMenuActions.h @@ -20,6 +20,7 @@ namespace GraphCanvas AddCommentMenuAction(QObject* parent); virtual ~AddCommentMenuAction() = default; + using ConstructContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructPresetMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructPresetMenuActions.h index 9b081c9925..b6c393872f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructPresetMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/ConstructMenuActions/ConstructPresetMenuActions.h @@ -28,6 +28,7 @@ namespace GraphCanvas bool IsInSubMenu() const override; AZStd::string GetSubMenuPath() const override; + using ConstructContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; private: @@ -52,6 +53,7 @@ namespace GraphCanvas bool IsInSubMenu() const override; AZStd::string GetSubMenuPath() const override; + using ConstructContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; private: @@ -69,6 +71,7 @@ namespace GraphCanvas CreatePresetFromSelection(QObject* parent = nullptr); virtual ~CreatePresetFromSelection(); + using ContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; static ActionGroupId GetCreateConstructContextMenuActionGroupId() diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h index 2252f081bb..b66a33bef8 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/DisableMenuActions/DisableMenuActions.h @@ -22,6 +22,7 @@ namespace GraphCanvas void SetEnableState(bool enableState); + using DisableContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; private: diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h index f87374323f..03a16d015b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuAction.h @@ -22,6 +22,7 @@ namespace GraphCanvas { } + using ContextMenuAction::RefreshAction; void RefreshAction(const GraphId& graphId, const AZ::EntityId& targetId) override { AZ_UNUSED(targetId); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h index 817cd887a6..35195c0c57 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/EditMenuActions/EditContextMenuActions.h @@ -22,6 +22,7 @@ namespace GraphCanvas CutGraphSelectionMenuAction(QObject* parent); virtual ~CutGraphSelectionMenuAction() = default; + using EditContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -34,6 +35,7 @@ namespace GraphCanvas CopyGraphSelectionMenuAction(QObject* parent); virtual ~CopyGraphSelectionMenuAction() = default; + using EditContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -49,6 +51,8 @@ namespace GraphCanvas virtual ~PasteGraphSelectionMenuAction() = default; void RefreshAction() override; + + using EditContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -61,6 +65,7 @@ namespace GraphCanvas DeleteGraphSelectionMenuAction(QObject* parent); virtual ~DeleteGraphSelectionMenuAction() = default; + using EditContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -73,6 +78,7 @@ namespace GraphCanvas DuplicateGraphSelectionMenuAction(QObject* parent); virtual ~DuplicateGraphSelectionMenuAction() = default; + using EditContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h index 28b36074b7..ade04ab8dc 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuAction.h @@ -22,6 +22,7 @@ namespace GraphCanvas { } + using ContextMenuAction::RefreshAction; void RefreshAction(const GraphId& graphId, const AZ::EntityId& targetId) override { AZ_UNUSED(targetId); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h index 2a45e43aee..d0f4101235 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeGroupMenuActions/NodeGroupContextMenuActions.h @@ -25,6 +25,8 @@ namespace GraphCanvas using ContextMenuAction::RefreshAction; void RefreshAction() override; + + using NodeGroupContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; private: @@ -43,6 +45,8 @@ namespace GraphCanvas using ContextMenuAction::RefreshAction; void RefreshAction() override; + + using NodeGroupContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -58,6 +62,8 @@ namespace GraphCanvas using ContextMenuAction::RefreshAction; void RefreshAction() override; + + using NodeGroupContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -73,6 +79,8 @@ namespace GraphCanvas using ContextMenuAction::RefreshAction; void RefreshAction() override; + + using NodeGroupContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -88,6 +96,8 @@ namespace GraphCanvas using ContextMenuAction::RefreshAction; void RefreshAction() override; + + using NodeGroupContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h index 0e812d12e9..0253d31c79 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/NodeMenuActions/NodeContextMenuActions.h @@ -21,12 +21,14 @@ namespace GraphCanvas ManageUnusedSlotsMenuAction(QObject* parent, bool hideSlots); virtual ~ManageUnusedSlotsMenuAction() = default; - + + using NodeContextMenuAction::RefreshAction; void RefreshAction(const GraphId& grpahId, const AZ::EntityId& targetId) override; + + using NodeContextMenuAction::TriggerAction; SceneReaction TriggerAction(const GraphId& graphId, const AZ::Vector2&) override; private: - bool m_hideSlots = true; AZ::EntityId m_targetId; }; diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h index 54b2efa046..59bfd847fe 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SceneMenuActions/SceneContextMenuActions.h @@ -25,6 +25,7 @@ namespace GraphCanvas bool IsInSubMenu() const override; AZStd::string GetSubMenuPath() const override; + using SceneContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -40,6 +41,7 @@ namespace GraphCanvas bool IsInSubMenu() const override; AZStd::string GetSubMenuPath() const override; + using SceneContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h index 29875882a5..f1875bc41d 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/EditorContextMenu/ContextMenuActions/SlotMenuActions/SlotContextMenuActions.h @@ -22,7 +22,10 @@ namespace GraphCanvas AddSlotMenuAction(QObject* parent); virtual ~AddSlotMenuAction() = default; + using SlotContextMenuAction::RefreshAction; void RefreshAction() override; + + using SlotContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -35,7 +38,10 @@ namespace GraphCanvas RemoveSlotMenuAction(QObject* parent); virtual ~RemoveSlotMenuAction() = default; + using SlotContextMenuAction::RefreshAction; void RefreshAction() override; + + using SlotContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -49,7 +55,10 @@ namespace GraphCanvas ClearConnectionsMenuAction(QObject* parent); virtual ~ClearConnectionsMenuAction() = default; + using SlotContextMenuAction::RefreshAction; void RefreshAction() override; + + using SlotContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -66,7 +75,10 @@ namespace GraphCanvas ResetToDefaultValueMenuAction(QObject* parent); virtual ~ResetToDefaultValueMenuAction() = default; + using SlotContextMenuAction::RefreshAction; void RefreshAction() override; + + using SlotContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -79,7 +91,10 @@ namespace GraphCanvas ToggleReferenceStateAction(QObject* parent); virtual ~ToggleReferenceStateAction() = default; + using SlotContextMenuAction::RefreshAction; void RefreshAction() override; + + using SlotContextMenuAction::TriggerAction; SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; @@ -92,7 +107,10 @@ namespace GraphCanvas PromoteToVariableAction(QObject* parent); virtual ~PromoteToVariableAction() = default; + using SlotContextMenuAction::RefreshAction; void RefreshAction() override; + + using SlotContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const AZ::Vector2& scenePos) override; }; diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasAssetEditorMainWindow.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasAssetEditorMainWindow.h index 5aed5d77e7..139c540767 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasAssetEditorMainWindow.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasEditor/GraphCanvasAssetEditorMainWindow.h @@ -55,6 +55,8 @@ namespace GraphCanvas struct AssetEditorWindowConfig { + virtual ~AssetEditorWindowConfig() = default; + /// General AssetEditor config parameters EditorId m_editorId; AZStd::string_view m_baseStyleSheet; From f3992935fe2fb76686fbe721fd9884dd6025e9f6 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:37:03 -0700 Subject: [PATCH 140/355] Gems/GraphModel Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Include/GraphModel/Model/Module/InputOutputNodes.h | 2 ++ .../Code/Include/GraphModel/Model/Module/ModuleNode.h | 1 + 2 files changed, 3 insertions(+) diff --git a/Gems/GraphModel/Code/Include/GraphModel/Model/Module/InputOutputNodes.h b/Gems/GraphModel/Code/Include/GraphModel/Model/Module/InputOutputNodes.h index 51e65705b9..2c3da656fb 100644 --- a/Gems/GraphModel/Code/Include/GraphModel/Model/Module/InputOutputNodes.h +++ b/Gems/GraphModel/Code/Include/GraphModel/Model/Module/InputOutputNodes.h @@ -67,6 +67,7 @@ namespace GraphModel //! \param dataType The type of data represented by this node GraphInputNode(GraphModel::GraphPtr graph, DataTypePtr dataType); + using BaseInputOutputNode::PostLoadSetup; void PostLoadSetup(GraphPtr graph, NodeId id) override; //! Returns the value of the DefaultValue slot, which indicates the default value for this input. This @@ -95,6 +96,7 @@ namespace GraphModel //! \param dataType The type of data represented by this node GraphOutputNode(GraphModel::GraphPtr graph, DataTypePtr dataType); + using BaseInputOutputNode::PostLoadSetup; void PostLoadSetup(GraphPtr graph, NodeId id) override; protected: diff --git a/Gems/GraphModel/Code/Include/GraphModel/Model/Module/ModuleNode.h b/Gems/GraphModel/Code/Include/GraphModel/Model/Module/ModuleNode.h index cce45e5159..f63fd6531f 100644 --- a/Gems/GraphModel/Code/Include/GraphModel/Model/Module/ModuleNode.h +++ b/Gems/GraphModel/Code/Include/GraphModel/Model/Module/ModuleNode.h @@ -36,6 +36,7 @@ namespace GraphModel const char* GetTitle() const override; + using Node::PostLoadSetup; void PostLoadSetup(GraphPtr ownerGraph, NodeId id) override; protected: From bc27e5a6c713d93e40ccb8c297a1d083649ca3d9 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:37:17 -0700 Subject: [PATCH 141/355] Gems/ImGui Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/ImGui/Code/Include/ImGuiBus.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gems/ImGui/Code/Include/ImGuiBus.h b/Gems/ImGui/Code/Include/ImGuiBus.h index 959577e97f..d481ec7843 100644 --- a/Gems/ImGui/Code/Include/ImGuiBus.h +++ b/Gems/ImGui/Code/Include/ImGuiBus.h @@ -70,6 +70,8 @@ namespace ImGui public: AZ_RTTI(IImGuiManager, "{F5A0F08B-F2DA-43B7-8CD2-C6FC71E1A712}"); + virtual ~IImGuiManager() = default; + static const char* GetUniqueName() { return "IImGuiManager"; } virtual DisplayState GetEditorWindowState() const = 0; From 4a972d96f924b3acd3f336a6d70b1d466b63d93b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:37:33 -0700 Subject: [PATCH 142/355] Gems others Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Editor/Menus/SceneContextMenuActions.h | 4 ++++ Gems/LyShine/Code/Editor/Animation/UiAnimViewNode.h | 1 + Gems/Maestro/Code/Source/Components/SequenceAgent.h | 2 ++ .../EntityReplication/EntityReplicationManager.h | 1 + 4 files changed, 8 insertions(+) diff --git a/Gems/LandscapeCanvas/Code/Source/Editor/Menus/SceneContextMenuActions.h b/Gems/LandscapeCanvas/Code/Source/Editor/Menus/SceneContextMenuActions.h index f51dab9bd9..27faad7099 100644 --- a/Gems/LandscapeCanvas/Code/Source/Editor/Menus/SceneContextMenuActions.h +++ b/Gems/LandscapeCanvas/Code/Source/Editor/Menus/SceneContextMenuActions.h @@ -22,7 +22,11 @@ namespace LandscapeCanvasEditor virtual ~FindSelectedNodesAction() = default; GraphCanvas::ActionGroupId GetActionGroupId() const override; + + using GraphCanvas::ContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::ContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; private: diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewNode.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewNode.h index 80946eb317..c133ec439a 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewNode.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewNode.h @@ -115,6 +115,7 @@ class CUiAnimViewKeyBundle public: CUiAnimViewKeyBundle() : m_bAllOfSameType(true) {} + virtual ~CUiAnimViewKeyBundle() = default; virtual bool AreAllKeysOfSameType() const override { return m_bAllOfSameType; } diff --git a/Gems/Maestro/Code/Source/Components/SequenceAgent.h b/Gems/Maestro/Code/Source/Components/SequenceAgent.h index 892e4ee7d1..333679f372 100644 --- a/Gems/Maestro/Code/Source/Components/SequenceAgent.h +++ b/Gems/Maestro/Code/Source/Components/SequenceAgent.h @@ -20,6 +20,8 @@ namespace Maestro friend class AZ::SerializeContext; protected: + virtual ~SequenceAgent() = default; + // This pure virtual is required for the Editor and RunTime to find the componentTypeId - in the Editor // it accounts for the GenericComponentWrapper component virtual const AZ::Uuid& GetComponentTypeUuid(const AZ::Component& component) const = 0; diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.h b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.h index 731a1a7556..ef05e22e3e 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.h +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/EntityReplication/EntityReplicationManager.h @@ -153,6 +153,7 @@ namespace Multiplayer { public: OrphanedEntityRpcs(EntityReplicationManager& replicationManager); + virtual ~OrphanedEntityRpcs() = default; void Update(); bool DispatchOrphanedRpcs(EntityReplicator& entityReplicator); void AddOrphanedRpc(NetEntityId entityId, NetworkEntityRpcMessage& entityRpcMessage); From 27cdf174cf9a3524f9057ca3d20c8dced6f7d5e5 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:37:48 -0700 Subject: [PATCH 143/355] Gems/PhysX Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Benchmarks/PhysXCharactersBenchmarks.cpp | 24 +++++++-- .../PhysXCharactersRagdollBenchmarks.cpp | 24 +++++++-- .../Tests/Benchmarks/PhysXJointBenchmarks.cpp | 23 +++++++- .../Benchmarks/PhysXRigidBodyBenchmarks.cpp | 52 ++++++++++++++++--- .../Benchmarks/PhysXSceneQueryBenchmarks.cpp | 25 +++++++-- 5 files changed, 128 insertions(+), 20 deletions(-) diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp index 200cbeafde..cd9e3c0395 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersBenchmarks.cpp @@ -85,8 +85,7 @@ namespace PhysX::Benchmarks class PhysXCharactersBenchmarkFixture : public PhysX::Benchmarks::PhysXBaseBenchmarkFixture { - public: - virtual void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { PhysX::Benchmarks::PhysXBaseBenchmarkFixture::SetUpInternal(); //need to get the Physics::System to be able to spawn the rigid bodies @@ -95,12 +94,31 @@ namespace PhysX::Benchmarks m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(m_testSceneHandle, CharacterConstants::TerrainSize, CharacterConstants::TerrainSize); } - virtual void TearDown([[maybe_unused]] const ::benchmark::State& state) override + void internalTearDown() { m_terrainEntity = nullptr; PhysX::Benchmarks::PhysXBaseBenchmarkFixture::TearDownInternal(); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + protected: // PhysXBaseBenchmarkFixture Overrides ... AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp index 8febfcddfc..c82d222e80 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXCharactersRagdollBenchmarks.cpp @@ -70,8 +70,7 @@ namespace PhysX::Benchmarks class PhysXCharactersRagdollBenchmarkFixture : public PhysX::Benchmarks::PhysXBaseBenchmarkFixture { - public: - virtual void SetUp([[maybe_unused]] const ::benchmark::State& state) override + void internalSetUp() { PhysX::Benchmarks::PhysXBaseBenchmarkFixture::SetUpInternal(); //need to get the Physics::System to be able to spawn the rigid bodies @@ -80,12 +79,31 @@ namespace PhysX::Benchmarks m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(m_testSceneHandle, RagdollConstants::TerrainSize, RagdollConstants::TerrainSize); } - virtual void TearDown([[maybe_unused]] const ::benchmark::State& state) override + void internalTearDown() { m_terrainEntity = nullptr; PhysX::Benchmarks::PhysXBaseBenchmarkFixture::TearDownInternal(); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + protected: // PhysXBaseBenchmarkFixture Overrides ... AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp index 17468b5cc6..df714d7143 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp @@ -184,17 +184,36 @@ namespace PhysX::Benchmarks : public PhysXBaseBenchmarkFixture { public: - virtual void SetUp([[maybe_unused]] const ::benchmark::State &state) override + void internalSetUp() { PhysXBaseBenchmarkFixture::SetUpInternal(); } - virtual void TearDown([[maybe_unused]] const ::benchmark::State &state) override + void internalTearDown() { PhysXBaseBenchmarkFixture::TearDownInternal(); } protected: + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + // PhysXBaseBenchmarkFixture Interface --------- AzPhysics::SceneConfiguration GetDefaultSceneConfiguration() override { diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp index 0117e9737b..58cbd0da23 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXRigidBodyBenchmarks.cpp @@ -136,8 +136,8 @@ namespace PhysX::Benchmarks class PhysXRigidbodyBenchmarkFixture : public PhysXBaseBenchmarkFixture { - public: - virtual void SetUp([[maybe_unused]] const ::benchmark::State &state) override + protected: + virtual void internalSetUp() { PhysXBaseBenchmarkFixture::SetUpInternal(); //need to get the Physics::System to be able to spawn the rigid bodies @@ -146,11 +146,29 @@ namespace PhysX::Benchmarks m_terrainEntity = PhysX::TestUtils::CreateFlatTestTerrain(m_testSceneHandle, RigidBodyConstants::TerrainSize, RigidBodyConstants::TerrainSize); } - virtual void TearDown([[maybe_unused]] const ::benchmark::State &state) override + virtual void internalTearDown() { m_terrainEntity = nullptr; PhysXBaseBenchmarkFixture::TearDownInternal(); } + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } protected: // PhysXBaseBenchmarkFixture Interface --------- @@ -312,10 +330,9 @@ namespace PhysX::Benchmarks class PhysXRigidbodyCollisionsBenchmarkFixture : public PhysXRigidbodyBenchmarkFixture { - public: - void SetUp(const ::benchmark::State& state) override + void internalSetUp() override { - PhysXRigidbodyBenchmarkFixture::SetUp(state); + PhysXRigidbodyBenchmarkFixture::internalSetUp(); m_collisionBeginCount = 0; m_collisionPersistCount = 0; @@ -346,11 +363,30 @@ namespace PhysX::Benchmarks m_defaultScene->RegisterSceneCollisionEventHandler(m_onSceneCollisionHandler); } - void TearDown(const ::benchmark::State& state) override + void internalTearDown() override { m_onSceneCollisionHandler.Disconnect(); - PhysXRigidbodyBenchmarkFixture::TearDown(state); + PhysXRigidbodyBenchmarkFixture::internalTearDown(); + } + + public: + void SetUp(const benchmark::State&) override + { + internalSetUp(); + } + void SetUp(benchmark::State&) override + { + internalSetUp(); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); } protected: diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp index 4a6cbae99b..9a8a28a85e 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXSceneQueryBenchmarks.cpp @@ -47,14 +47,12 @@ namespace PhysX::Benchmarks , public PhysX::GenericPhysicsFixture { - public: - //! Spawns box entities in unique locations in 1/8 of sphere with all non-negative dimensions between radii[2, max radius]. //! Accepts 2 parameters from \state. //! //! \state.range(0) - number of box entities to spawn //! \state.range(1) - max radius - void SetUp(const ::benchmark::State& state) override + void internalSetUp(const ::benchmark::State& state) { PhysX::GenericPhysicsFixture::SetUpInternal(); @@ -100,13 +98,32 @@ namespace PhysX::Benchmarks } } - void TearDown([[maybe_unused]] const ::benchmark::State& state) override + void internalTearDown() { m_boxes.clear(); m_entities.clear(); PhysX::GenericPhysicsFixture::TearDownInternal(); } + public: + void SetUp(const benchmark::State& state) override + { + internalSetUp(state); + } + void SetUp(benchmark::State& state) override + { + internalSetUp(state); + } + + void TearDown(const benchmark::State&) override + { + internalTearDown(); + } + void TearDown(benchmark::State&) override + { + internalTearDown(); + } + protected: std::vector m_entities; std::vector m_boxes; From 52607ce2c02cfd520e252885b9f4c98726a5bac1 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:38:07 -0700 Subject: [PATCH 144/355] Gems/ScriptCanvas Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../View/Windows/ScriptCanvasContextMenus.h | 21 +++++++++++++++++++ .../Code/Include/ScriptCanvas/Core/Node.h | 7 ++++--- .../DynamicSlotFullCreation.cpp | 9 ++++---- .../VariableListFullCreation.cpp | 4 +--- .../Code/Tests/ScriptCanvasPhysicsTest.cpp | 6 ++++-- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h index f95ca6c80b..e8e2a8ee4f 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/ScriptCanvasContextMenus.h @@ -61,7 +61,10 @@ namespace ScriptCanvasEditor bool IsInSubMenu() const override; AZStd::string GetSubMenuPath() const override; + using GraphCanvas::SceneContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::SceneContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; }; @@ -77,7 +80,10 @@ namespace ScriptCanvasEditor GraphCanvas::ActionGroupId GetActionGroupId() const override; + using GraphCanvas::ContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::ContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; private: @@ -110,7 +116,10 @@ namespace ScriptCanvasEditor GraphCanvas::ActionGroupId GetActionGroupId() const override; + using SlotManipulationMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using SlotManipulationMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; private: @@ -127,7 +136,10 @@ namespace ScriptCanvasEditor ExposeSlotMenuAction(QObject* parent); virtual ~ExposeSlotMenuAction() = default; + using GraphCanvas::SlotContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::SlotContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; protected: @@ -145,7 +157,10 @@ namespace ScriptCanvasEditor virtual ~SetDataSlotTypeMenuAction() = default; static bool IsSupportedSlotType(const AZ::EntityId& slotId); + using GraphCanvas::SlotContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::SlotContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; private: @@ -164,7 +179,10 @@ namespace ScriptCanvasEditor CreateAzEventHandlerSlotMenuAction(QObject* parent); + using GraphCanvas::SlotContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::SlotContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; static const AZ::BehaviorMethod* FindBehaviorMethodWithAzEventReturn(const GraphCanvas::GraphId& graphId, AZ::EntityId targetId); @@ -239,7 +257,10 @@ namespace ScriptCanvasEditor RenameFunctionDefinitionNodeAction(NodeDescriptorComponent* descriptor, QObject* parent); virtual ~RenameFunctionDefinitionNodeAction() = default; + using GraphCanvas::NodeContextMenuAction::RefreshAction; void RefreshAction(const GraphCanvas::GraphId& graphId, const AZ::EntityId& targetId) override; + + using GraphCanvas::NodeContextMenuAction::TriggerAction; GraphCanvas::ContextMenuAction::SceneReaction TriggerAction(const GraphCanvas::GraphId& graphId, const AZ::Vector2& scenePos) override; NodeDescriptorComponent* m_descriptor; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h index 27f0b3862d..0ef109d383 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h @@ -178,8 +178,8 @@ namespace ScriptCanvas NodePropertyInterface() = default; public: - AZ_RTTI(NodePropertyInterface, "{265A2163-D3AE-4C4E-BDCC-37BA0084BF88}"); + virtual ~NodePropertyInterface() = default; virtual Data::Type GetDataType() = 0; @@ -217,7 +217,7 @@ namespace ScriptCanvas AZ_RTTI((TypedNodePropertyInterface, "{24248937-86FB-406C-8DD5-023B10BD0B60}", DataType), NodePropertyInterface); TypedNodePropertyInterface() = default; - ~TypedNodePropertyInterface() = default; + virtual ~TypedNodePropertyInterface() = default; void SetPropertyReference(DataType* dataReference) { @@ -283,7 +283,7 @@ namespace ScriptCanvas AZ_RTTI((TypedComboBoxNodePropertyInterface, "{24248937-86FB-406C-8DD5-023B10BD0B60}", DataType), TypedNodePropertyInterface, ComboBoxPropertyInterface); TypedComboBoxNodePropertyInterface() = default; - ~TypedComboBoxNodePropertyInterface() = default; + virtual ~TypedComboBoxNodePropertyInterface() = default; // TypedNodePropertyInterface void ResetToDefault() override @@ -354,6 +354,7 @@ namespace ScriptCanvas { public: AZ_RTTI(EnumComboBoxNodePropertyInterface, "{7D46B998-9E05-401A-AC92-37A90BAF8F60}", TypedComboBoxNodePropertyInterface); + virtual ~EnumComboBoxNodePropertyInterface() = default; // No way of identifying Enum types properly yet. Going to fake a BCO object type for now. static const AZ::Uuid k_EnumUUID; diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/DynamicSlotFullCreation.cpp b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/DynamicSlotFullCreation.cpp index 83ece831eb..090622646a 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/DynamicSlotFullCreation.cpp +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/DynamicSlotFullCreation.cpp @@ -39,13 +39,14 @@ namespace ScriptCanvasDeveloperEditor { public: - DynamicSlotFullCreationInterface(DeveloperUtils::ConnectionStyle connectionStyle) + DynamicSlotFullCreationInterface(DeveloperUtils::ConnectionStyle connectionStyle) { m_chainConfig.m_connectionStyle = connectionStyle; m_chainConfig.m_skipHandlers = true; } + virtual ~DynamicSlotFullCreationInterface() = default; - void SetupInterface(const AZ::EntityId& activeGraphCanvasGraphId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId) + void SetupInterface(const AZ::EntityId& activeGraphCanvasGraphId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId) override { m_graphCanvasGraphId = activeGraphCanvasGraphId; m_scriptCanvasId = scriptCanvasId; @@ -142,12 +143,12 @@ namespace ScriptCanvasDeveloperEditor } } - bool ShouldProcessItem([[maybe_unused]] const GraphCanvas::NodePaletteTreeItem* nodePaletteTreeItem) const + bool ShouldProcessItem([[maybe_unused]] const GraphCanvas::NodePaletteTreeItem* nodePaletteTreeItem) const override { return !m_availableVariableIds.empty(); } - void ProcessItem(const GraphCanvas::NodePaletteTreeItem* nodePaletteTreeItem) + void ProcessItem(const GraphCanvas::NodePaletteTreeItem* nodePaletteTreeItem) override { AZStd::unordered_set createdPairs; GraphCanvas::GraphCanvasMimeEvent* mimeEvent = nodePaletteTreeItem->CreateMimeEvent(); diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/VariableListFullCreation.cpp b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/VariableListFullCreation.cpp index c443c57010..4b457e99e2 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/VariableListFullCreation.cpp +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/AutomationActions/VariableListFullCreation.cpp @@ -37,9 +37,7 @@ namespace ScriptCanvasDeveloperEditor m_variableNameFormat += " %i"; } - ~VariablePaletteFullCreationInterface() - { - } + virtual ~VariablePaletteFullCreationInterface() = default; void SetupInterface([[maybe_unused]] const AZ::EntityId& graphCanvasId, const ScriptCanvas::ScriptCanvasId& scriptCanvasId) { diff --git a/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp b/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp index ac6109ce30..70d8857b1c 100644 --- a/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp +++ b/Gems/ScriptCanvasPhysics/Code/Tests/ScriptCanvasPhysicsTest.cpp @@ -175,7 +175,7 @@ namespace ScriptCanvasPhysicsTests MOCK_CONST_METHOD0(GetNativePointer, void*()); }; - class MockShape + class MockShape : public Physics::Shape { public: @@ -203,10 +203,12 @@ namespace ScriptCanvasPhysicsTests MOCK_METHOD1(SetContactOffset, void(float)); }; - class MockPhysicsMaterial + class MockPhysicsMaterial : public Physics::Material { public: + virtual ~MockPhysicsMaterial() = default; + MOCK_CONST_METHOD0(GetSurfaceType, AZ::Crc32()); MOCK_CONST_METHOD0(GetSurfaceTypeName, const AZStd::string&()); MOCK_METHOD1(SetSurfaceTypeName, void(const AZStd::string&)); From c6593bbdd3a60cdad1886ce96eba9b43d98c92f9 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:38:33 -0700 Subject: [PATCH 145/355] double assignation of the same thing Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzCore/AzCore/std/algorithm.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Code/Framework/AzCore/AzCore/std/algorithm.h b/Code/Framework/AzCore/AzCore/std/algorithm.h index 3508eff2b4..e28d127062 100644 --- a/Code/Framework/AzCore/AzCore/std/algorithm.h +++ b/Code/Framework/AzCore/AzCore/std/algorithm.h @@ -831,7 +831,6 @@ namespace AZStd // find first element that value is before, using operator< typename iterator_traits::difference_type count = AZStd::distance(first, last); typename iterator_traits::difference_type step{}; - count = AZStd::distance(first, last); for (; 0 < count; ) { // divide and conquer, find half that contains answer step = count / 2; From 49d35e078860d941a1a8a6c0e26e15a642cd7db9 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:57:18 -0700 Subject: [PATCH 146/355] Final fixes for MSVC Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/CryEdit.h | 1 + Code/Editor/Dialogs/PythonScriptsDialog.cpp | 2 + Code/Editor/Export/ExportManager.h | 2 + Code/Editor/Lib/Tests/IEditorMock.h | 2 + Code/Editor/Objects/BaseObject.h | 3 - Code/Editor/Objects/EntityObject.h | 3 +- Code/Editor/Objects/ObjectManager.cpp | 1 + Code/Editor/TrackView/TrackViewNode.h | 1 + Code/Editor/Util/Variable.h | 158 +++++++++--------- Code/Editor/Viewport.h | 1 + .../tests/resourcecompiler/RCBuilderTest.h | 2 + .../unittests/MockApplicationManager.cpp | 2 + .../utilities/PlatformConfiguration.cpp | 3 + .../native/utilities/PlatformConfiguration.h | 7 + .../Tools/SerializeContextTools/Converter.cpp | 2 + 15 files changed, 108 insertions(+), 82 deletions(-) diff --git a/Code/Editor/CryEdit.h b/Code/Editor/CryEdit.h index 4ab37ac1e5..730af7c034 100644 --- a/Code/Editor/CryEdit.h +++ b/Code/Editor/CryEdit.h @@ -462,6 +462,7 @@ class CCryDocManager CCrySingleDocTemplate* m_pDefTemplate = nullptr; public: CCryDocManager(); + virtual ~CCryDocManager() = default; CCrySingleDocTemplate* SetDefaultTemplate(CCrySingleDocTemplate* pNew); // Copied from MFC to get rid of the silly ugly unoverridable doc-type pick dialog virtual void OnFileNew(); diff --git a/Code/Editor/Dialogs/PythonScriptsDialog.cpp b/Code/Editor/Dialogs/PythonScriptsDialog.cpp index 7c6b445387..e95fb90c0a 100644 --- a/Code/Editor/Dialogs/PythonScriptsDialog.cpp +++ b/Code/Editor/Dialogs/PythonScriptsDialog.cpp @@ -79,6 +79,8 @@ CPythonScriptsDialog::CPythonScriptsDialog(QWidget* parent) GetGemSourcePathsVisitor(AZ::SettingsRegistryInterface& settingsRegistry) : m_settingsRegistry(settingsRegistry) {} + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { diff --git a/Code/Editor/Export/ExportManager.h b/Code/Editor/Export/ExportManager.h index be81591e56..4417a0ae89 100644 --- a/Code/Editor/Export/ExportManager.h +++ b/Code/Editor/Export/ExportManager.h @@ -92,6 +92,8 @@ namespace Export : public IData { public: + virtual ~CData() = default; + virtual int GetObjectCount() const { return static_cast(m_objects.size()); } virtual Object* GetObject(int index) const { return m_objects[index]; } virtual Object* AddObject(const char* objectName); diff --git a/Code/Editor/Lib/Tests/IEditorMock.h b/Code/Editor/Lib/Tests/IEditorMock.h index 30f1d23576..67a714703b 100644 --- a/Code/Editor/Lib/Tests/IEditorMock.h +++ b/Code/Editor/Lib/Tests/IEditorMock.h @@ -25,6 +25,8 @@ public: } public: + virtual ~CEditorMock() = default; + MOCK_METHOD0(DeleteThis, void()); MOCK_METHOD0(GetSystem, ISystem*()); MOCK_METHOD0(GetClassFactory, IEditorClassFactory* ()); diff --git a/Code/Editor/Objects/BaseObject.h b/Code/Editor/Objects/BaseObject.h index 89e47ae881..c973b2f293 100644 --- a/Code/Editor/Objects/BaseObject.h +++ b/Code/Editor/Objects/BaseObject.h @@ -743,9 +743,6 @@ private: //! Only called once after creation by ObjectManager. void SetClassDesc(CObjectClassDesc* classDesc); - // From CObject, (not implemented) - virtual void Serialize([[maybe_unused]] CArchive& ar) {}; - EScaleWarningLevel GetScaleWarningLevel() const; ERotationWarningLevel GetRotationWarningLevel() const; diff --git a/Code/Editor/Objects/EntityObject.h b/Code/Editor/Objects/EntityObject.h index d5600d15b7..6150685c45 100644 --- a/Code/Editor/Objects/EntityObject.h +++ b/Code/Editor/Objects/EntityObject.h @@ -116,7 +116,8 @@ public: void UpdateVisibility(bool bVisible); bool ConvertFromObject(CBaseObject* object); - virtual void Serialize(CObjectArchive& ar); + using CBaseObject::Serialize; + void Serialize(CObjectArchive& ar) override; virtual void PostLoad(CObjectArchive& ar); XmlNodeRef Export(const QString& levelPath, XmlNodeRef& xmlNode); diff --git a/Code/Editor/Objects/ObjectManager.cpp b/Code/Editor/Objects/ObjectManager.cpp index 30ee1fc57b..13ba2d47de 100644 --- a/Code/Editor/Objects/ObjectManager.cpp +++ b/Code/Editor/Objects/ObjectManager.cpp @@ -52,6 +52,7 @@ public: GUID guid; public: + virtual ~CXMLObjectClassDesc() = default; REFGUID ClassID() override { return guid; diff --git a/Code/Editor/TrackView/TrackViewNode.h b/Code/Editor/TrackView/TrackViewNode.h index 59df06750b..a3918d61a4 100644 --- a/Code/Editor/TrackView/TrackViewNode.h +++ b/Code/Editor/TrackView/TrackViewNode.h @@ -117,6 +117,7 @@ class CTrackViewKeyBundle public: CTrackViewKeyBundle() : m_bAllOfSameType(true) {} + virtual ~CTrackViewKeyBundle() = default; virtual bool AreAllKeysOfSameType() const override { return m_bAllOfSameType; } diff --git a/Code/Editor/Util/Variable.h b/Code/Editor/Util/Variable.h index 9c3f96a3f6..0965756488 100644 --- a/Code/Editor/Util/Variable.h +++ b/Code/Editor/Util/Variable.h @@ -379,11 +379,11 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING public: virtual ~CVariableBase() {} - void SetName(const QString& name) { m_name = name; }; + void SetName(const QString& name) override { m_name = name; }; //! Get name of parameter. - QString GetName() const { return m_name; }; + QString GetName() const override { return m_name; }; - QString GetHumanName() const + QString GetHumanName() const override { if (!m_humanName.isEmpty()) { @@ -391,23 +391,23 @@ public: } return m_name; } - void SetHumanName(const QString& name) { m_humanName = name; } + void SetHumanName(const QString& name) override { m_humanName = name; } - void SetDescription(const char* desc) { m_description = desc; }; - void SetDescription(const QString& desc) { m_description = desc; }; + void SetDescription(const char* desc) override { m_description = desc; }; + void SetDescription(const QString& desc) override { m_description = desc; }; //! Get name of parameter. - QString GetDescription() const { return m_description; }; + QString GetDescription() const override { return m_description; }; EType GetType() const { return IVariable::UNKNOWN; }; - int GetSize() const { return sizeof(*this); }; + int GetSize() const override { return sizeof(*this); }; - unsigned char GetDataType() const { return m_dataType; }; - void SetDataType(unsigned char dataType) { m_dataType = dataType; } + unsigned char GetDataType() const override { return m_dataType; }; + void SetDataType(unsigned char dataType) override { m_dataType = dataType; } - void SetFlags(int flags) { m_flags = static_cast(flags); } - int GetFlags() const { return m_flags; } - void SetFlagRecursive(EFlags flag) { m_flags |= flag; } + void SetFlags(int flags) override { m_flags = static_cast(flags); } + int GetFlags() const override { return m_flags; } + void SetFlagRecursive(EFlags flag) override { m_flags |= flag; } void SetUserData(const QVariant &data){ m_userData = data; }; QVariant GetUserData() const { return m_userData; } @@ -415,58 +415,58 @@ public: ////////////////////////////////////////////////////////////////////////// // Set methods. ////////////////////////////////////////////////////////////////////////// - void Set([[maybe_unused]] int value) { assert(0); } - void Set([[maybe_unused]] bool value) { assert(0); } - void Set([[maybe_unused]] float value) { assert(0); } - void Set([[maybe_unused]] double value) { assert(0); } - void Set([[maybe_unused]] const Vec2& value) { assert(0); } - void Set([[maybe_unused]] const Vec3& value) { assert(0); } - void Set([[maybe_unused]] const Vec4& value) { assert(0); } - void Set([[maybe_unused]] const Ang3& value) { assert(0); } - void Set([[maybe_unused]] const Quat& value) { assert(0); } - void Set([[maybe_unused]] const QString& value) { assert(0); } - void Set([[maybe_unused]] const char* value) { assert(0); } - void SetDisplayValue(const QString& value) { Set(value); } + void Set([[maybe_unused]] int value) override { assert(0); } + void Set([[maybe_unused]] bool value) override { assert(0); } + void Set([[maybe_unused]] float value) override { assert(0); } + void Set([[maybe_unused]] double value) override { assert(0); } + void Set([[maybe_unused]] const Vec2& value) override { assert(0); } + void Set([[maybe_unused]] const Vec3& value) override { assert(0); } + void Set([[maybe_unused]] const Vec4& value) override { assert(0); } + void Set([[maybe_unused]] const Ang3& value) override { assert(0); } + void Set([[maybe_unused]] const Quat& value) override { assert(0); } + void Set([[maybe_unused]] const QString& value) override { assert(0); } + void Set([[maybe_unused]] const char* value) override { assert(0); } + void SetDisplayValue(const QString& value) override { Set(value); } ////////////////////////////////////////////////////////////////////////// // Get methods. ////////////////////////////////////////////////////////////////////////// - void Get([[maybe_unused]] int& value) const { assert(0); } - void Get([[maybe_unused]] bool& value) const { assert(0); } - void Get([[maybe_unused]] float& value) const { assert(0); } - void Get([[maybe_unused]] double& value) const { assert(0); } - void Get([[maybe_unused]] Vec2& value) const { assert(0); } - void Get([[maybe_unused]] Vec3& value) const { assert(0); } - void Get([[maybe_unused]] Vec4& value) const { assert(0); } - void Get([[maybe_unused]] Ang3& value) const { assert(0); } - void Get([[maybe_unused]] Quat& value) const { assert(0); } - void Get([[maybe_unused]] QString& value) const { assert(0); } - QString GetDisplayValue() const { QString val; Get(val); return val; } + void Get([[maybe_unused]] int& value) const override { assert(0); } + void Get([[maybe_unused]] bool& value) const override { assert(0); } + void Get([[maybe_unused]] float& value) const override { assert(0); } + void Get([[maybe_unused]] double& value) const override { assert(0); } + void Get([[maybe_unused]] Vec2& value) const override { assert(0); } + void Get([[maybe_unused]] Vec3& value) const override { assert(0); } + void Get([[maybe_unused]] Vec4& value) const override { assert(0); } + void Get([[maybe_unused]] Ang3& value) const override { assert(0); } + void Get([[maybe_unused]] Quat& value) const override { assert(0); } + void Get([[maybe_unused]] QString& value) const override { assert(0); } + QString GetDisplayValue() const override { QString val; Get(val); return val; } ////////////////////////////////////////////////////////////////////////// // IVariableContainer functions ////////////////////////////////////////////////////////////////////////// - virtual void AddVariable([[maybe_unused]] IVariable* var) { assert(0); } + void AddVariable([[maybe_unused]] IVariable* var) override { assert(0); } - virtual bool DeleteVariable([[maybe_unused]] IVariable* var, [[maybe_unused]] bool recursive = false) { return false; } - virtual void DeleteAllVariables() {} + bool DeleteVariable([[maybe_unused]] IVariable* var, [[maybe_unused]] bool recursive = false) override { return false; } + void DeleteAllVariables() override {} - virtual int GetNumVariables() const { return 0; } - virtual IVariable* GetVariable([[maybe_unused]] int index) const { return nullptr; } + int GetNumVariables() const override { return 0; } + IVariable* GetVariable([[maybe_unused]] int index) const override { return nullptr; } - virtual bool IsContainsVariable([[maybe_unused]] IVariable* pVar, [[maybe_unused]] bool bRecursive = false) const { return false; } + bool IsContainsVariable([[maybe_unused]] IVariable* pVar, [[maybe_unused]] bool bRecursive = false) const override { return false; } - virtual IVariable* FindVariable([[maybe_unused]] const char* name, [[maybe_unused]] bool bRecursive = false, [[maybe_unused]] bool bHumanName = false) const { return nullptr; } + IVariable* FindVariable([[maybe_unused]] const char* name, [[maybe_unused]] bool bRecursive = false, [[maybe_unused]] bool bHumanName = false) const override { return nullptr; } - virtual bool IsEmpty() const { return true; } + bool IsEmpty() const override { return true; } ////////////////////////////////////////////////////////////////////////// - void Wire(IVariable* var) + void Wire(IVariable* var) override { m_wiredVars.push_back(var); } ////////////////////////////////////////////////////////////////////////// - void Unwire(IVariable* var) + void Unwire(IVariable* var) override { if (!var) { @@ -480,7 +480,7 @@ public: } ////////////////////////////////////////////////////////////////////////// - void AddOnSetCallback(OnSetCallback* func) + void AddOnSetCallback(OnSetCallback* func) override { if (!stl::find(m_onSetFuncs, func)) { @@ -489,13 +489,13 @@ public: } ////////////////////////////////////////////////////////////////////////// - void RemoveOnSetCallback(OnSetCallback* func) + void RemoveOnSetCallback(OnSetCallback* func) override { stl::find_and_erase(m_onSetFuncs, func); } ////////////////////////////////////////////////////////////////////////// - void ClearOnSetCallbacks() + void ClearOnSetCallbacks() override { m_onSetFuncs.clear(); } @@ -509,7 +509,7 @@ public: } ////////////////////////////////////////////////////////////////////////// - void RemoveOnSetEnumCallback(OnSetCallback* func) + void RemoveOnSetEnumCallback(OnSetCallback* func) override { stl::find_and_erase(m_onSetEnumFuncs, func); } @@ -520,7 +520,7 @@ public: } - virtual void OnSetValue([[maybe_unused]] bool bRecursive) + void OnSetValue([[maybe_unused]] bool bRecursive) override { // If have wired variables or OnSet callback, process them. // Send value to wired variable. @@ -549,7 +549,8 @@ public: } ////////////////////////////////////////////////////////////////////////// - void Serialize(XmlNodeRef node, bool load) + using IVariable::Serialize; + void Serialize(XmlNodeRef node, bool load) override { if (load) { @@ -567,8 +568,8 @@ public: } } - virtual void EnableUpdateCallbacks(bool boEnable){m_boUpdateCallbacksEnabled = boEnable; }; - virtual void SetForceModified(bool bForceModified) { m_bForceModified = bForceModified; } + void EnableUpdateCallbacks(bool boEnable) override{m_boUpdateCallbacksEnabled = boEnable; }; + void SetForceModified(bool bForceModified) override { m_bForceModified = bForceModified; } protected: // Constructor. CVariableBase() @@ -641,13 +642,13 @@ public: CVariableArray(){} //! Get name of parameter. - virtual EType GetType() const { return IVariable::ARRAY; }; - virtual int GetSize() const { return sizeof(CVariableArray); }; + EType GetType() const override { return IVariable::ARRAY; }; + int GetSize() const override { return sizeof(CVariableArray); }; ////////////////////////////////////////////////////////////////////////// // Set methods. ////////////////////////////////////////////////////////////////////////// - virtual void Set(const QString& value) + void Set(const QString& value) override { if (m_strValue != value) { @@ -655,7 +656,7 @@ public: OnSetValue(false); } } - void OnSetValue(bool bRecursive) + void OnSetValue(bool bRecursive) override { CVariableBase::OnSetValue(bRecursive); if (bRecursive) @@ -666,7 +667,7 @@ public: } } } - void SetFlagRecursive(EFlags flag) + void SetFlagRecursive(EFlags flag) override { CVariableBase::SetFlagRecursive(flag); for (Variables::iterator it = m_vars.begin(); it != m_vars.end(); ++it) @@ -677,9 +678,9 @@ public: ////////////////////////////////////////////////////////////////////////// // Get methods. ////////////////////////////////////////////////////////////////////////// - virtual void Get(QString& value) const { value = m_strValue; } + void Get(QString& value) const override { value = m_strValue; } - virtual bool HasDefaultValue() const + bool HasDefaultValue() const override { for (Variables::const_iterator it = m_vars.begin(); it != m_vars.end(); ++it) { @@ -691,7 +692,7 @@ public: return true; } - virtual void ResetToDefault() + void ResetToDefault() override { for (Variables::const_iterator it = m_vars.begin(); it != m_vars.end(); ++it) { @@ -700,7 +701,7 @@ public: } ////////////////////////////////////////////////////////////////////////// - IVariable* Clone(bool bRecursive) const + IVariable* Clone(bool bRecursive) const override { CVariableArray* var = new CVariableArray(*this); @@ -713,7 +714,7 @@ public: } ////////////////////////////////////////////////////////////////////////// - void CopyValue(IVariable* fromVar) + void CopyValue(IVariable* fromVar) override { assert(fromVar); if (fromVar->GetType() != IVariable::ARRAY) @@ -733,20 +734,20 @@ public: } ////////////////////////////////////////////////////////////////////////// - virtual int GetNumVariables() const { return static_cast(m_vars.size()); } + int GetNumVariables() const override { return static_cast(m_vars.size()); } - virtual IVariable* GetVariable(int index) const + IVariable* GetVariable(int index) const override { assert(index >= 0 && index < (int)m_vars.size()); return m_vars[index]; } - virtual void AddVariable(IVariable* var) + void AddVariable(IVariable* var) override { m_vars.push_back(var); } - virtual bool DeleteVariable(IVariable* var, bool recursive /*=false*/) + bool DeleteVariable(IVariable* var, bool recursive /*=false*/) override { bool found = stl::find_and_erase(m_vars, var); if (!found && recursive) @@ -762,12 +763,12 @@ public: return found; } - virtual void DeleteAllVariables() + void DeleteAllVariables() override { m_vars.clear(); } - virtual bool IsContainsVariable(IVariable* pVar, bool bRecursive) const + bool IsContainsVariable(IVariable* pVar, bool bRecursive) const override { for (Variables::const_iterator it = m_vars.begin(); it != m_vars.end(); ++it) { @@ -793,14 +794,15 @@ public: return false; } - virtual IVariable* FindVariable(const char* name, bool bRecursive, bool bHumanName) const; + IVariable* FindVariable(const char* name, bool bRecursive, bool bHumanName) const override; - virtual bool IsEmpty() const + bool IsEmpty() const override { return m_vars.empty(); } - void Serialize(XmlNodeRef node, bool load) + using IVariable::Serialize; + void Serialize(XmlNodeRef node, bool load) override { if (load) { @@ -1074,11 +1076,11 @@ class CVariableVoid { public: CVariableVoid(){}; - virtual EType GetType() const { return IVariable::UNKNOWN; }; - virtual IVariable* Clone([[maybe_unused]] bool bRecursive) const { return new CVariableVoid(*this); } - virtual void CopyValue([[maybe_unused]] IVariable* fromVar) {}; - virtual bool HasDefaultValue() const { return true; } - virtual void ResetToDefault() {}; + EType GetType() const override { return IVariable::UNKNOWN; }; + IVariable* Clone([[maybe_unused]] bool bRecursive) const override { return new CVariableVoid(*this); } + void CopyValue([[maybe_unused]] IVariable* fromVar) override {}; + bool HasDefaultValue() const override { return true; } + void ResetToDefault() override {}; protected: CVariableVoid(const CVariableVoid& v) : CVariableBase(v) {}; diff --git a/Code/Editor/Viewport.h b/Code/Editor/Viewport.h index 6b5bfb5c34..e54eca6083 100644 --- a/Code/Editor/Viewport.h +++ b/Code/Editor/Viewport.h @@ -397,6 +397,7 @@ public: //! This method return a vector (p2-p1) in world space alligned to construction plane and restriction axises. //! p1 and p2 must be given in world space and lie on construction plane. + using CViewport::GetCPVector; virtual Vec3 GetCPVector(const Vec3& p1, const Vec3& p2, int axis); //! Snap any given 3D world position to grid lines if snap is enabled. diff --git a/Code/Tools/AssetProcessor/native/tests/resourcecompiler/RCBuilderTest.h b/Code/Tools/AssetProcessor/native/tests/resourcecompiler/RCBuilderTest.h index 32230be23a..5a6efb2622 100644 --- a/Code/Tools/AssetProcessor/native/tests/resourcecompiler/RCBuilderTest.h +++ b/Code/Tools/AssetProcessor/native/tests/resourcecompiler/RCBuilderTest.h @@ -81,6 +81,8 @@ public: struct MockRecognizerConfiguration : public RecognizerConfiguration { + virtual ~MockRecognizerConfiguration() = default; + const RecognizerContainer& GetAssetRecognizerContainer() const override { return m_recognizerContainer; diff --git a/Code/Tools/AssetProcessor/native/unittests/MockApplicationManager.cpp b/Code/Tools/AssetProcessor/native/unittests/MockApplicationManager.cpp index bd03e3b225..696ecc710a 100644 --- a/Code/Tools/AssetProcessor/native/unittests/MockApplicationManager.cpp +++ b/Code/Tools/AssetProcessor/native/unittests/MockApplicationManager.cpp @@ -22,6 +22,8 @@ namespace AssetProcessor struct MockRecognizerConfiguration : public RecognizerConfiguration { + virtual ~MockRecognizerConfiguration() = default; + const RecognizerContainer& GetAssetRecognizerContainer() const override { return m_container; diff --git a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp index a1bc508899..52df8e901d 100644 --- a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.cpp @@ -84,6 +84,8 @@ namespace AssetProcessor return !m_platformIdentifierStack.empty() ? AZ::SettingsRegistryInterface::VisitResponse::Continue : AZ::SettingsRegistryInterface::VisitResponse::Skip; } + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit([[maybe_unused]] AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { if (m_platformIdentifierStack.empty()) @@ -114,6 +116,7 @@ namespace AssetProcessor struct MetaDataTypesVisitor : AZ::SettingsRegistryInterface::Visitor { + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit([[maybe_unused]] AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { m_metaDataTypes.push_back({ AZ::IO::PathView(valueName, AZ::IO::PosixPathSeparator).LexicallyNormal().String(), value }); diff --git a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.h b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.h index 2c3615c4fc..2c04ca1fad 100644 --- a/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.h +++ b/Code/Tools/AssetProcessor/native/utilities/PlatformConfiguration.h @@ -49,6 +49,7 @@ namespace AssetProcessor { } + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override; AZ::SettingsRegistryInterface* m_settingsRegistry; @@ -129,6 +130,8 @@ namespace AssetProcessor { AZ::SettingsRegistryInterface::VisitResponse Traverse(AZStd::string_view jsonPath, AZStd::string_view valueName, AZ::SettingsRegistryInterface::VisitAction action, AZ::SettingsRegistryInterface::Type) override; + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZ::s64 value) override; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override; @@ -152,6 +155,8 @@ namespace AssetProcessor { AZ::SettingsRegistryInterface::VisitResponse Traverse(AZStd::string_view jsonPath, AZStd::string_view valueName, AZ::SettingsRegistryInterface::VisitAction action, AZ::SettingsRegistryInterface::Type) override; + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override; AZStd::vector m_excludeAssetRecognizers; @@ -169,6 +174,8 @@ namespace AssetProcessor } AZ::SettingsRegistryInterface::VisitResponse Traverse(AZStd::string_view jsonPath, AZStd::string_view valueName, AZ::SettingsRegistryInterface::VisitAction action, AZ::SettingsRegistryInterface::Type) override; + + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, bool value) override; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZ::s64 value) override; void Visit(AZStd::string_view path, AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override; diff --git a/Code/Tools/SerializeContextTools/Converter.cpp b/Code/Tools/SerializeContextTools/Converter.cpp index eff5f140d5..6a8bebdbfc 100644 --- a/Code/Tools/SerializeContextTools/Converter.cpp +++ b/Code/Tools/SerializeContextTools/Converter.cpp @@ -494,6 +494,7 @@ namespace AZ return AZ::SettingsRegistryInterface::VisitResponse::Continue; } + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view, [[maybe_unused]] AZStd::string_view valueName, AZ::SettingsRegistryInterface::Type, AZStd::string_view value) override { if (m_processingSourcePathKey) @@ -656,6 +657,7 @@ namespace AZ return AZ::SettingsRegistryInterface::VisitResponse::Continue; } + using AZ::SettingsRegistryInterface::Visitor::Visit; void Visit(AZStd::string_view path, AZStd::string_view valueName, [[maybe_unused]] AZ::SettingsRegistryInterface::Type type, AZStd::string_view value) override { From c78ea3cf208af983bebb58850f9f996843421255 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 3 Sep 2021 20:57:31 -0700 Subject: [PATCH 147/355] Final fixes for MSVC Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Legacy/CrySystem/XML/XMLBinaryNode.h | 1 + Code/Legacy/CrySystem/XML/xml.h | 1 + 2 files changed, 2 insertions(+) diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryNode.h b/Code/Legacy/CrySystem/XML/XMLBinaryNode.h index 34e0ca22ce..0ffcd3f19e 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryNode.h +++ b/Code/Legacy/CrySystem/XML/XMLBinaryNode.h @@ -155,6 +155,7 @@ public: bool saveToFile([[maybe_unused]] const char* fileName, [[maybe_unused]] size_t chunkSizeBytes, [[maybe_unused]] AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle) { assert(0); return false; }; // save in small memory chunks //! Set new XML Node attribute (or override attribute with same key). + using IXmlNode::setAttr; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const char* value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] int value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] unsigned int value) { assert(0); }; diff --git a/Code/Legacy/CrySystem/XML/xml.h b/Code/Legacy/CrySystem/XML/xml.h index 912767eae7..de02538c74 100644 --- a/Code/Legacy/CrySystem/XML/xml.h +++ b/Code/Legacy/CrySystem/XML/xml.h @@ -211,6 +211,7 @@ public: bool saveToFile(const char* fileName, size_t chunkSizeBytes, AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle); // save in small memory chunks //! Set new XML Node attribute (or override attribute with same key). + using IXmlNode::setAttr; void setAttr(const char* key, const char* value); void setAttr(const char* key, int value); void setAttr(const char* key, unsigned int value); From c33dd26ff9941460b29797beff60a40a873f80fb Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 01:20:21 +0200 Subject: [PATCH 148/355] Renamed Levels Signed-off-by: ANT\aljanru --- AutomatedTesting/Levels/Base/Base.ly | 3 + AutomatedTesting/Levels/Base/filelist.xml | 6 + AutomatedTesting/Levels/Base/level.pak | 3 + .../tags.txt | 0 .../terraintexture.pak | 0 .../LevelData/Environment.xml | 0 .../LevelData/TerrainTexture.xml | 0 .../LevelData/TimeOfDay.xml | 0 .../LevelData/VegetationMap.dat | 0 .../NvCloth_AddClothSimulationToActor.ly} | 0 .../TerrainTexture.pak | 0 .../filelist.xml | 0 .../level.pak | 0 .../tags.txt | 0 .../LevelData/Environment.xml | 0 .../LevelData/TerrainTexture.xml | 0 .../LevelData/TimeOfDay.xml | 0 .../LevelData/VegetationMap.dat | 0 .../NvCloth_AddClothSimulationToMesh.ly} | 0 .../TerrainTexture.pak | 0 .../filelist.xml | 0 .../level.pak | 0 .../tags.txt | 0 .../C12712452_ScriptCanvas_CollisionEvents.ly | 3 - .../collision_events_script.scriptcanvas | 7714 ----------------- .../C14195074_ScriptCanvas_PostUpdateEvent.ly | 3 - ...1_CharacterController_SwitchLevelsEmpty.ly | 3 - .../filelist.xml | 6 - .../level.pak | 3 - ...14902098_ScriptCanvas_PostPhysicsUpdate.ly | 3 - .../onpostphysicsupdate.scriptcanvas | 3518 -------- ...ultlibraryupdatedacrosslevels.physmaterial | 36 - ...ultlibraryupdatedacrosslevels.physmaterial | 36 - ...datedAcrossLevels_after.physxconfiguration | 143 - ...atedAcrossLevels_before.physxconfiguration | 143 - ...08217_NoCrash_LevelSwitchWithOutTerrain.ly | 3 - .../filelist.xml | 6 - .../level.pak | 3 - ...15308217_NoCrash_LevelSwitchWithTerrain.ly | 3 - .../filelist.xml | 6 - .../level.pak | 3 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../filelist.xml | 6 - .../C4976209_RigidBody_ComputesCOM.ly | 3 - .../C5689517_Verify_Terrain_Component.ly | 3 - .../filelist.xml | 6 - .../level.pak | 3 - ...Terrain_NoCollisionAfterTerrainDeletion.ly | 3 - .../filelist.xml | 6 - .../level.pak | 3 - ...9761_ForceRegion_ExertsPointForce_Sedan.ly | 3 - .../C5959765_ForceRegion_AssetGetsImpulsed.ly | 3 - .../terrain/terrain.pxheightfield | 3 - ...90546_ForceRegion_SliceFileInstantiates.ly | 3 - .../leveldata/TimeOfDay.xml | 356 - .../leveldata/TimeOfDay.xml | 356 - ...550_ForceRegion_WorldSpaceForceNegative.ly | 3 - ...551_ForceRegion_LocalSpaceForceNegative.ly | 3 - .../leveldata/TerrainTexture.xml | 7 - ...C6090554_ForceRegion_PointForceNegative.ly | 3 - .../leveldata/Environment.xml | 14 - ...6131473_StaticSlice_OnDynamicSliceSpawn.ly | 3 - .../leveldata/Environment.xml | 14 - .../leveldata/GameTokens.xml | 5 - .../leveldata/TerrainTexture.xml | 7 - .../leveldata/TimeOfDay.xml | 356 - .../tags.txt | 12 - .../leveldata/Environment.xml | 14 - .../leveldata/GameTokens.xml | 5 - .../leveldata/TerrainTexture.xml | 7 - .../leveldata/VegetationMap.dat | 3 - .../tags.txt | 12 - .../terrain/terrain.pxheightfield | 3 - .../leveldata/Environment.xml | 14 - .../leveldata/GameTokens.xml | 5 - .../leveldata/TerrainTexture.xml | 7 - .../leveldata/TimeOfDay.xml | 356 - .../leveldata/VegetationMap.dat | 3 - .../tags.txt | 12 - .../terraintexture.pak | 3 - .../leveldata/Environment.xml | 14 - .../leveldata/GameTokens.xml | 5 - .../leveldata/TerrainTexture.xml | 7 - .../leveldata/TimeOfDay.xml | 356 - .../leveldata/VegetationMap.dat | 3 - .../tags.txt | 12 - .../terrain/terrain.pxheightfield | 3 - .../terraintexture.pak | 3 - .../CharacterController_SwitchLevels.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Collider_AddingNewGroupWorks.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Collider_ColliderPositionOffset.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Collider_ColliderRotationOffset.ly} | 0 .../collider_rotation_full.PNG | 0 .../collider_rotation_single.PNG | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Collider_CollisionGroupsWorkflow.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...sionGroupDiffCollidingLayersNotCollide.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ..._NoneCollisionGroupSameLayerNotCollide.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Collider_PxMeshErrorIfNoMesh.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...er_SameCollisionGroupDiffLayersCollide.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...meCollisionGroupSameCustomLayerCollide.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...der_SameCollisionGroupSameLayerCollide.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Collider_TriggerPassThrough.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_CapsuleShapedForce.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...egion_DirectionHasNoAffectOnTotalForce.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...HighValuesDirectionAxesWorkWithNoError.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...ForceRegion_ImpulsesBoxShapedRigidBody.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...eRegion_ImpulsesCapsuleShapedRigidBody.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...rceRegion_ImpulsesPxMeshShapedRigidBody.ly | 3 + .../PhysXSedan/_dev_Sedan_r0-b.fbx | 0 .../PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo | 0 .../PhysXSedan/_dev_sedan_r0-b.mtl | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...Region_LinearDampingForceOnRigidBodies.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...rceRegion_LocalSpaceForceOnRigidBodies.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...egion_MovingForceRegionChangesNetForce.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...Region_MultipleComponentsCombineForces.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...ipleForcesInSameComponentCombineForces.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...egion_NoQuiverOnHighLinearDampingForce.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...eRegion_ParentChildForcesCombineForces.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_PointForceOnRigidBodies.ly} | 0 ...ysX_ForceRegion_PointForceOnRigidBodies.ly | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_PositionOffset.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_ExertsPointForce_Sedan.ly | 0 .../ForceRegion_PxMeshShapedForce.ly | 3 + .../PhysXSedan/_dev_Sedan_r0-b.fbx | 0 .../PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo | 0 .../PhysXSedan/_dev_sedan_r0-b.mtl | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_RotationalOffset.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...rceRegion_SimpleDragForceOnRigidBodies.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegionEntity.slice | 0 .../ForceRegion_SliceFileInstantiates.ly | 3 + .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...n_SmallMagnitudeDeviationOnLargeForces.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_SphereShapedForce.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata}/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ForceRegion_SplineForceOnRigidBodies.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata}/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 ...gion_SplineRegionWithModifiedTransform.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...rceRegion_WorldSpaceForceOnRigidBodies.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata}/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...rceRegion_ZeroLinearDampingDoesNothing.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...ceRegion_ZeroLocalSpaceForceDoesNothing.ly | 3 + .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../ForceRegion_ZeroPointForceDoesNothing.ly | 3 + .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...eRegion_ZeroSimpleDragForceDoesNothing.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata}/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...ForceRegion_ZeroSplineForceDoesNothing.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 ...ceRegion_ZeroWorldSpaceForceDoesNothing.ly | 3 + .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Joints_Ball2BodiesConstrained.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_BallBreakable.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_BallLeadFollowerCollide.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_BallNoLimitsConstrained.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_BallSoftLimitsConstrained.ly} | 0 .../filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_Fixed2BodiesConstrained.ly} | 0 .../LevelData}/Environment.xml | 0 .../LevelData}/TerrainTexture.xml | 0 .../LevelData}/TimeOfDay.xml | 0 .../LevelData}/VegetationMap.dat | 0 .../filelist.xml | 6 + .../level.pak | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_FixedBreakable.ly} | 0 .../Joints_FixedBreakable/filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_FixedLeadFollowerCollide.ly} | 0 .../filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata}/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_GlobalFrameConstrained.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_Hinge2BodiesConstrained.ly} | 0 .../filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata}/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_HingeBreakable.ly} | 0 .../Joints_HingeBreakable/filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_HingeLeadFollowerCollide.ly} | 0 .../filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_HingeNoLimitsConstrained.ly} | 0 .../filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Joints_HingeSoftLimitsConstrained.ly} | 0 .../filelist.xml | 6 + .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Material_CanBeAssignedToTerrain.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata}/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../materials/material.physmaterial | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Material_CharacterController.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../library.physmaterial | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Material_ComponentsInSyncWithLibrary.ly} | 0 ...l_componentsinsyncwithlibrary.physmaterial | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../ragdoll_modified/AnimGraphPhysX.animgraph | 0 .../ragdoll_modified}/Red.tif | 0 .../ragdoll_modified/RinLocomotion.motionset | 0 .../ragdoll_modified/modified.mtl | 0 .../ragdoll_modified}/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll_modified}/rin_skeleton_newgeo.mtl | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Blue.tif | 0 ..._DefaultLibraryConsistentOnAllFeatures.ly} | 0 .../Red.tif | 0 ...als_defaultlibraryconsistency.physmaterial | 0 .../concrete.mtl | 0 .../cowboy.emfxworkspace | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../concrete/concrete_animgraph.animgraph | 0 .../concrete/concrete_motionset.motionset | 0 .../ragdoll/concrete/rin_concrete.mtl | 0 .../ragdoll/concrete/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll/concrete/rin_skeleton_newgeo.mtl | 0 .../ragdoll/rin_skeleton_newgeo.fbx | 0 .../ragdoll/rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll/rin_skeleton_newgeo.mtl | 0 .../ragdoll/rubber/rin_rubber.mtl | 0 .../ragdoll/rubber/rin_skeleton_newgeo.fbx | 0 .../rubber/rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll/rubber/rin_skeleton_newgeo.mtl | 0 .../ragdoll/rubber/rubber_animgraph.animgraph | 0 .../ragdoll/rubber/rubber_motionset.motionset | 0 .../rubber.mtl | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../0/0.ly | 3 + .../0/filelist.xml | 2 +- .../0/level.pak | 3 + .../0}/leveldata/Environment.xml | 0 .../0}/leveldata/GameTokens.xml | 0 .../0/leveldata/Heightmap.dat | 3 + .../0}/leveldata/TerrainTexture.xml | 0 .../0}/leveldata/TimeOfDay.xml | 4 +- .../0}/leveldata/VegetationMap.dat | 0 .../0}/tags.txt | 0 .../0/terrain/cover.ctc | 3 + .../0}/terrain/terrain.pxheightfield | 0 .../0}/terraintexture.pak | 0 .../1/1.ly | 3 + .../1/filelist.xml | 2 +- .../1/level.pak | 3 + .../1}/leveldata/Environment.xml | 0 .../1}/leveldata/GameTokens.xml | 0 .../1/leveldata/Heightmap.dat | 3 + .../1}/leveldata/TerrainTexture.xml | 0 .../1}/leveldata/TimeOfDay.xml | 4 +- .../1}/leveldata/VegetationMap.dat | 0 .../1}/tags.txt | 0 .../1/terrain/cover.ctc | 3 + .../1}/terrain/terrain.pxheightfield | 0 .../1}/terraintexture.pak | 0 .../_last_run_before_change_data.txt | 4 + .../after.physmaterial} | 0 .../before.physmaterial} | 0 .../Layers/phase1.layer | 0 .../Layers/phase2.layer | 0 .../Layers/phase3.layer | 0 .../Layers/phase4.layer | 0 ...rial_DefaultMaterialLibraryChangesWork.ly} | 0 .../all_ones_1.physmaterial | 0 .../custom_motionset.motionset | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../materials/custom_material_1.mtl | 0 .../materials/custom_material_2.mtl | 0 .../materials/custom_terrain_mat_blue.mtl | 0 .../materials/custom_terrain_mat_red.mtl | 0 .../materials/material_terrain_default.mtl | 0 .../rin_physics.animgraph | 0 .../rin_skeleton_newgeo - Copy.fbx | 0 .../rin_skeleton_newgeo - copy.fbx.assetinfo | 0 .../rin_skeleton_newgeo - copy.mtl | 0 .../rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../rin_skeleton_newgeo.mtl | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../ws.emfxworkspace | 0 .../Material_DynamicFriction.ly} | 0 .../dynamic_friction.physmaterial | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Material_EmptyLibraryUsesDefault.ly} | 0 ...erial_emptylibraryusesdefault.physmaterial | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Material_FrictionCombine.ly} | 0 .../filelist.xml | 0 .../friction_combine.physmaterial | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Material_FrictionCombinePriorityOrder.ly} | 0 .../filelist.xml | 0 .../friction_combine.physmaterial | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...braryChangesInstantly_restore.physmaterial | 0 ...aterial_LibraryChangesReflectInstantly.ly} | 0 ...erial_librarychangesinstantly.physmaterial | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...OperationsReflectOnCharacterController.ly} | 0 ...fydeleteoncharactercontroller.physmaterial | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../testmaterials.physmaterial | 0 ...LibraryCrudOperationsReflectOnCollider.ly} | 0 ...ial_addmodifydeleteoncollider.physmaterial | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...aryCrudOperationsReflectOnRagdollBones.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../ragdoll_default/AnimGraphPhysX.animgraph | 0 .../ragdoll_default/Blue.tif | 0 .../ragdoll_default/RinLocomotion.motionset | 0 .../ragdoll_default/default.mtl | 0 .../ragdoll_default/rin_physics.animgraph | 0 .../ragdoll_default}/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll_default}/rin_skeleton_newgeo.mtl | 0 .../AnimGraphPhysX.animgraph | 0 .../ragdoll_modified}/Red.tif | 0 .../ragdoll_modified}/RinLocomotion.motionset | 0 .../ragdoll_modified/modified.mtl | 0 .../ragdoll_modified}/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll_modified}/rin_skeleton_newgeo.mtl | 0 .../ragdollbones.physmaterial | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ..._LibraryCrudOperationsReflectOnTerrain.ly} | 0 ...rial_addmodifydeleteonterrain.physmaterial | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../modified.mtl | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...5_Material_LibraryUpdatedAcrossLevels_0.ly | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata}/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...5_Material_LibraryUpdatedAcrossLevels_1.ly | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...l_LibraryUpdatedAcrossLevels.physmaterial} | 0 .../Material_NoEffectIfNoColliderShape.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...ial_PerFaceMaterialGetsCorrectMaterial.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../test.fbx | 0 .../test.fbx.assetinfo | 0 .../test.mtl | 0 .../test_library.physmaterial | 0 .../Material_RagdollBones.ly} | 0 ...material_ragdollbonesmaterial.physmaterial | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../AnimGraphPhysX.animgraph | 0 .../ragdoll_concrete/Blue.tif | 0 .../ragdoll_concrete}/RinLocomotion.motionset | 0 .../ragdoll_concrete/concrete.mtl | 0 .../ragdoll_concrete/rin_physics.animgraph | 0 .../ragdoll_concrete/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll_concrete/rin_skeleton_newgeo.mtl | 0 .../ragdoll_rubber}/AnimGraphPhysX.animgraph | 0 .../ragdoll_rubber}/Red.tif | 0 .../ragdoll_rubber}/RinLocomotion.motionset | 0 .../ragdoll_rubber/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll_rubber/rin_skeleton_newgeo.mtl | 0 .../ragdoll_rubber/rubber.mtl | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Material_Restitution.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../restitution.physmaterial | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Material_RestitutionCombine.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../restitution_combine.physmaterial | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...terial_RestitutionCombinePriorityOrder.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../restitution_combine.physmaterial | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Material_StaticFriction.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../staticfriction.physmaterial | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...ynamicSliceWithPhysNotSpawnsStaticSlice.ly | 3 + .../RigidBody.slice | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...ndoRedoWorksOnEntityWithPhysComponents.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...derRigidBodyMeshAndTerrainWorkTogether.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../PhysXSedan/_dev_Sedan_r0-b.fbx | 0 .../PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo | 0 .../PhysXSedan/_dev_sedan_r0-b.mtl | 0 ...cs_WorldBodyBusWorksOnEditorComponents.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../NoRagdoll/NoRagdoll.ly} | 0 .../NoRagdoll}/filelist.xml | 2 +- .../NoRagdoll}/level.pak | 0 .../NoRagdoll}/leveldata/Environment.xml | 0 .../NoRagdoll}/leveldata/GameTokens.xml | 0 .../NoRagdoll}/leveldata/TerrainTexture.xml | 0 .../NoRagdoll}/leveldata/TimeOfDay.xml | 0 .../NoRagdoll}/leveldata/VegetationMap.dat | 0 .../NoRagdoll}/tags.txt | 0 .../NoRagdoll}/terraintexture.pak | 0 .../WithRagdoll/WithRagdoll.ly} | 0 .../WithRagdoll}/filelist.xml | 0 .../WithRagdoll}/level.pak | 0 .../WithRagdoll}/leveldata/Environment.xml | 0 .../WithRagdoll}/leveldata/GameTokens.xml | 0 .../WithRagdoll}/leveldata/TerrainTexture.xml | 0 .../WithRagdoll}/leveldata/TimeOfDay.xml | 0 .../WithRagdoll}/leveldata/VegetationMap.dat | 0 .../WithRagdoll}/myMotionSet.motionset | 0 .../WithRagdoll}/ragdoll.animgraph | 0 .../AnimGraphForSecondRagdoll(1).animgraph | 0 .../WithRagdoll}/rin/PhysicsRin(1).zip | 0 .../PhysicsRin(1)}/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../PhysicsRin(1)}/rin_skeleton_newgeo.mtl | 0 .../WithRagdoll}/rin/rin_physics(1).animgraph | 0 .../WithRagdoll}/tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../WithRagdoll}/terraintexture.pak | 0 ...agdoll_OldRagdollSerializationNoErrors.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../LevelData}/Environment.xml | 0 .../LevelData}/TerrainTexture.xml | 0 .../LevelData}/TimeOfDay.xml | 0 .../LevelData}/VegetationMap.dat | 0 .../Ragdoll_WorldBodyBusWorks.ly} | 0 .../TerrainTexture.pak | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../ragdoll_default}/AnimGraphPhysX.animgraph | 0 .../ragdoll_default/Blue.tif | 0 .../ragdoll_default}/RinLocomotion.motionset | 0 .../ragdoll_default/default.mtl | 0 .../ragdoll_default/rin_physics.animgraph | 0 .../ragdoll_default}/rin_skeleton_newgeo.fbx | 0 .../rin_skeleton_newgeo.fbx.assetinfo | 0 .../ragdoll_default}/rin_skeleton_newgeo.mtl | 0 .../tags.txt | 0 .../RigidBody_AddRigidBodyComponent.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...igidBody_AngularDampingAffectsRotation.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../PhysXSedan/_dev_Sedan_r0-b.fbx | 0 .../PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo | 0 .../PhysXSedan/_dev_sedan_r0-b.mtl | 0 .../RigidBody_COM_ComputingWorks.ly | 3 + .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../RigidBody_COM_ManualSettingWorks.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...RigidBody_COM_NotIncludesTriggerShapes.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../RigidBody_ComputeInertiaWorks.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../RigidBody_InitialAngularVelocity.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../RigidBody_InitialLinearVelocity.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../RigidBody_KinematicModeWorks.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../RigidBody_LinearDampingAffectsMotion.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../RigidBody_MassDifferentValuesWorks.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Layers/damping_bars_and_triggers.layer | 0 .../Layers/no_damping_bars.layer | 0 .../RigidBody_MaxAngularVelocityWorks.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...RigidBody_MomentOfInertiaManualSetting.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../RigidBody_SetGravityWorks.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...gidBody_SleepWhenBelowKineticThreshold.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../RigidBody_StartAsleepWorks.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../RigidBody_StartGravityEnabledWorks.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../collision_events_script.scriptcanvas | 4718 ++++++++++ .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../ScriptCanvas_GetCollisionName.ly} | 0 .../Raycast.scriptcanvas | 0 .../Raycast_2.scriptcanvas | 0 .../ScriptCanvas.png | 0 .../ScriptCanvas_MultipleRaycastNode.ly} | 0 .../RayCast_level_no_tunnel.PNG | 0 .../RayCast_level_tunnel.PNG | 0 .../RayCast_level_tunnel_mouth.PNG | 0 .../VisualDocumentation/ScriptCanvas.PNG | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ScriptCanvas_OverlapNode.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ScriptCanvas_PostPhysicsUpdate.ly | 3 + .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../onpostphysicsupdate.scriptcanvas | 115 + .../ontick.scriptcanvas | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ScriptCanvas_PostUpdateEvent.ly | 3 + .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ScriptCanvas_PreUpdateEvent.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 ...riptCanvas_SetKinematicTargetTransform.ly} | 0 .../Signal.scriptcanvas | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ScriptCanvas_ShapeCast.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../Ball_0.slice | 0 ...ptCanvas_SpawnEntityWithPhysComponents.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../ScriptCanvas_TriggerEvents.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../ShapeCollider_CylinderShapeCollides.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Terrain_AddPhysTerrainComponent.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...errain_CanAddMultipleTerrainComponents.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../PhysXEntity_collides_with_PhysXTerrain.ly | 0 .../Terrain_CollisionAgainstRigidBody.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ..._MultipleResolutionsValid_1024x1024_32m.ly | 0 .../1024x1024_32m}/filelist.xml | 0 .../1024x1024_32m}/level.pak | 0 .../1024x1024_32m}/leveldata/Environment.xml | 0 .../1024x1024_32m}/leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../1024x1024_32m}/leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../1024x1024_32m}/tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../1024x1024_32m}/terraintexture.pak | 0 ...ain_MultipleResolutionsValid_128x128_1m.ly | 0 .../128x128_1m}/filelist.xml | 0 .../128x128_1m}/level.pak | 0 .../128x128_1m}/leveldata/Environment.xml | 0 .../128x128_1m}/leveldata/GameTokens.xml | 0 .../128x128_1m}/leveldata/TerrainTexture.xml | 0 .../128x128_1m}/leveldata/TimeOfDay.xml | 0 .../128x128_1m}/leveldata/VegetationMap.dat | 0 .../128x128_1m}/tags.txt | 0 .../128x128_1m}/terrain/terrain.pxheightfield | 0 .../128x128_1m}/terraintexture.pak | 0 ..._MultipleResolutionsValid_4096x4096_16m.ly | 0 .../4096x4096_16m}/filelist.xml | 0 .../4096x4096_16m}/level.pak | 0 .../4096x4096_16m}/leveldata/Environment.xml | 0 .../4096x4096_16m}/leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../4096x4096_16m}/leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../4096x4096_16m}/tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../4096x4096_16m}/terraintexture.pak | 0 ...ain_MultipleResolutionsValid_512x512_2m.ly | 0 .../512x512_2m}/filelist.xml | 0 .../512x512_2m}/level.pak | 0 .../512x512_2m}/leveldata/Environment.xml | 0 .../512x512_2m}/leveldata/GameTokens.xml | 0 .../512x512_2m}/leveldata/TerrainTexture.xml | 0 .../512x512_2m}/leveldata/TimeOfDay.xml | 0 .../512x512_2m}/leveldata/VegetationMap.dat | 0 .../512x512_2m}/tags.txt | 0 .../512x512_2m}/terrain/terrain.pxheightfield | 0 .../512x512_2m}/terraintexture.pak | 0 ...rrain_MultipleTerrainComponentsWarning.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 ...rain_NoPhysTerrainComponentNoCollision.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terraintexture.pak | 0 .../TerrainSlice.slice | 0 ...ain_SpawnSecondTerrainComponentWarning.ly} | 0 .../filelist.xml | 2 +- .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/GameTokens.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 .../Terrain_TerrainTexturePainterWorks.ly} | 0 .../filelist.xml | 0 .../level.pak | 0 .../leveldata/Environment.xml | 0 .../leveldata/TerrainTexture.xml | 0 .../leveldata/TimeOfDay.xml | 0 .../leveldata/VegetationMap.dat | 0 .../material/levelmaterial.physmaterial | 0 .../tags.txt | 0 .../terrain/terrain.pxheightfield | 0 .../terraintexture.pak | 0 1541 files changed, 5018 insertions(+), 13775 deletions(-) create mode 100644 AutomatedTesting/Levels/Base/Base.ly create mode 100644 AutomatedTesting/Levels/Base/filelist.xml create mode 100644 AutomatedTesting/Levels/Base/level.pak rename AutomatedTesting/Levels/{NvCloth/C18977329_NvCloth_AddClothSimulationToMesh => Base}/tags.txt (100%) rename AutomatedTesting/Levels/{Physics/C12712452_ScriptCanvas_CollisionEvents => Base}/terraintexture.pak (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToActor}/LevelData/Environment.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToActor}/LevelData/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToActor}/LevelData/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToActor}/LevelData/VegetationMap.dat (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly => NvCloth_AddClothSimulationToActor/NvCloth_AddClothSimulationToActor.ly} (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToActor}/TerrainTexture.pak (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToActor}/filelist.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToActor}/level.pak (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToActor}/tags.txt (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToMesh}/LevelData/Environment.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToMesh}/LevelData/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToMesh}/LevelData/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToMesh}/LevelData/VegetationMap.dat (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly => NvCloth_AddClothSimulationToMesh/NvCloth_AddClothSimulationToMesh.ly} (100%) rename AutomatedTesting/Levels/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor => NvCloth_AddClothSimulationToMesh}/TerrainTexture.pak (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToMesh}/filelist.xml (100%) rename AutomatedTesting/Levels/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh => NvCloth_AddClothSimulationToMesh}/level.pak (100%) rename AutomatedTesting/Levels/{Physics/C12712452_ScriptCanvas_CollisionEvents => NvCloth/NvCloth_AddClothSimulationToMesh}/tags.txt (100%) delete mode 100644 AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly delete mode 100644 AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas delete mode 100644 AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/C14195074_ScriptCanvas_PostUpdateEvent.ly delete mode 100644 AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/C14654881_CharacterController_SwitchLevelsEmpty.ly delete mode 100644 AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/level.pak delete mode 100644 AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/C14902098_ScriptCanvas_PostPhysicsUpdate.ly delete mode 100644 AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas delete mode 100644 AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial delete mode 100644 AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial delete mode 100644 AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_after.physxconfiguration delete mode 100644 AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_before.physxconfiguration delete mode 100644 AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/C15308217_NoCrash_LevelSwitchWithOutTerrain.ly delete mode 100644 AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/level.pak delete mode 100644 AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/C15308217_NoCrash_LevelSwitchWithTerrain.ly delete mode 100644 AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/level.pak delete mode 100644 AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/C4976209_RigidBody_ComputesCOM.ly delete mode 100644 AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/C5689517_Verify_Terrain_Component.ly delete mode 100644 AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/level.pak delete mode 100644 AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/C5689521_Terrain_NoCollisionAfterTerrainDeletion.ly delete mode 100644 AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/filelist.xml delete mode 100644 AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/level.pak delete mode 100644 AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/C5959761_ForceRegion_ExertsPointForce_Sedan.ly delete mode 100644 AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/C5959765_ForceRegion_AssetGetsImpulsed.ly delete mode 100644 AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/terrain.pxheightfield delete mode 100644 AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/C6090546_ForceRegion_SliceFileInstantiates.ly delete mode 100644 AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/TimeOfDay.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/TimeOfDay.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/C6090550_ForceRegion_WorldSpaceForceNegative.ly delete mode 100644 AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/C6090551_ForceRegion_LocalSpaceForceNegative.ly delete mode 100644 AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TerrainTexture.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/C6090554_ForceRegion_PointForceNegative.ly delete mode 100644 AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Environment.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/C6131473_StaticSlice_OnDynamicSliceSpawn.ly delete mode 100644 AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Environment.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/GameTokens.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TerrainTexture.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TimeOfDay.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/tags.txt delete mode 100644 AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Environment.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/GameTokens.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/TerrainTexture.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/VegetationMap.dat delete mode 100644 AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/tags.txt delete mode 100644 AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/terrain.pxheightfield delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Environment.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/GameTokens.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TerrainTexture.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TimeOfDay.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/VegetationMap.dat delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/tags.txt delete mode 100644 AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terraintexture.pak delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Environment.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/GameTokens.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TerrainTexture.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TimeOfDay.xml delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/VegetationMap.dat delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/tags.txt delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/terrain.pxheightfield delete mode 100644 AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terraintexture.pak rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels/C14654881_CharacterController_SwitchLevels.ly => CharacterController_SwitchLevels/CharacterController_SwitchLevels.ly} (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => CharacterController_SwitchLevels}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => CharacterController_SwitchLevels}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => CharacterController_SwitchLevels}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => CharacterController_SwitchLevels}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => CharacterController_SwitchLevels}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => CharacterController_SwitchLevels}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => CharacterController_SwitchLevels}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => CharacterController_SwitchLevels}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => CharacterController_SwitchLevels}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup/C4976227_Collider_NewGroup.ly => Collider_AddingNewGroupWorks/Collider_AddingNewGroupWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Collider_AddingNewGroupWorks}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Collider_AddingNewGroupWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => Collider_AddingNewGroupWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_AddingNewGroupWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => Collider_AddingNewGroupWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => Collider_AddingNewGroupWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => Collider_AddingNewGroupWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => Collider_AddingNewGroupWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset/C4982797_Collider_ColliderOffset.ly => Collider_ColliderPositionOffset/Collider_ColliderPositionOffset.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Collider_ColliderPositionOffset}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Collider_ColliderPositionOffset}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => Collider_ColliderPositionOffset}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => Collider_ColliderPositionOffset}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => Collider_ColliderPositionOffset}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => Collider_ColliderPositionOffset}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => Collider_ColliderPositionOffset}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_ColliderPositionOffset}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => Collider_ColliderPositionOffset}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_ColliderPositionOffset}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset/C4982798_Collider_ColliderRotationOffset.ly => Collider_ColliderRotationOffset/Collider_ColliderRotationOffset.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Collider_ColliderRotationOffset}/VisualDocumentation/collider_rotation_full.PNG (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Collider_ColliderRotationOffset}/VisualDocumentation/collider_rotation_single.PNG (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Collider_ColliderRotationOffset}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Collider_ColliderRotationOffset}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_ColliderRotationOffset}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => Collider_ColliderRotationOffset}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => Collider_ColliderRotationOffset}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_ColliderRotationOffset}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_ColliderRotationOffset}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_ColliderRotationOffset}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Collider_ColliderRotationOffset}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_ColliderRotationOffset}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups/C3510644_Collider_CollisionGroups.ly => Collider_CollisionGroupsWorkflow/Collider_CollisionGroupsWorkflow.ly} (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Collider_CollisionGroupsWorkflow}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Collider_CollisionGroupsWorkflow}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_CollisionGroupsWorkflow}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_CollisionGroupsWorkflow}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => Collider_CollisionGroupsWorkflow}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_CollisionGroupsWorkflow}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_CollisionGroupsWorkflow}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Collider_CollisionGroupsWorkflow}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_CollisionGroupsWorkflow}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest/C4982593_PhysxCollider_CollisionLayerTest.ly => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_DiffCollisionGroupDiffCollidingLayersNotCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest/C4976245_PhysxCollider_CollisionLayerTest.ly => Collider_NoneCollisionGroupSameLayerNotCollide/Collider_NoneCollisionGroupSameLayerNotCollide.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Collider_NoneCollisionGroupSameLayerNotCollide}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Collider_NoneCollisionGroupSameLayerNotCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_NoneCollisionGroupSameLayerNotCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Collider_NoneCollisionGroupSameLayerNotCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_NoneCollisionGroupSameLayerNotCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_NoneCollisionGroupSameLayerNotCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_NoneCollisionGroupSameLayerNotCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_NoneCollisionGroupSameLayerNotCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh/C14861498_ConfirmError_NoPxMesh.ly => Collider_PxMeshErrorIfNoMesh/Collider_PxMeshErrorIfNoMesh.ly} (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => Collider_PxMeshErrorIfNoMesh}/filelist.xml (74%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => Collider_PxMeshErrorIfNoMesh}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_PxMeshErrorIfNoMesh}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => Collider_PxMeshErrorIfNoMesh}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Collider_PxMeshErrorIfNoMesh}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_PxMeshErrorIfNoMesh}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_PxMeshErrorIfNoMesh}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => Collider_PxMeshErrorIfNoMesh}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => Collider_PxMeshErrorIfNoMesh}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.ly => Collider_SameCollisionGroupDiffLayersCollide/Collider_SameCollisionGroupDiffLayersCollide.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Collider_SameCollisionGroupDiffLayersCollide}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Collider_SameCollisionGroupDiffLayersCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => Collider_SameCollisionGroupDiffLayersCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_SameCollisionGroupDiffLayersCollide}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => Collider_SameCollisionGroupDiffLayersCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_SameCollisionGroupDiffLayersCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => Collider_SameCollisionGroupDiffLayersCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Collider_SameCollisionGroupDiffLayersCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => Collider_SameCollisionGroupDiffLayersCollide}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Collider_SameCollisionGroupDiffLayersCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision/C4976244_Collider_SameGroupSameLayerCollision.ly => Collider_SameCollisionGroupSameCustomLayerCollide/Collider_SameCollisionGroupSameCustomLayerCollide.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => Collider_SameCollisionGroupSameCustomLayerCollide}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => Collider_SameCollisionGroupSameCustomLayerCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Collider_SameCollisionGroupSameCustomLayerCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => Collider_SameCollisionGroupSameCustomLayerCollide}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_SameCollisionGroupSameCustomLayerCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Collider_SameCollisionGroupSameCustomLayerCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Collider_SameCollisionGroupSameCustomLayerCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Collider_SameCollisionGroupSameCustomLayerCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Collider_SameCollisionGroupSameCustomLayerCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup/C4976242_Collision_SameCollisionlayerSameCollisiongroup.ly => Collider_SameCollisionGroupSameLayerCollide/Collider_SameCollisionGroupSameLayerCollide.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Collider_SameCollisionGroupSameLayerCollide}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Collider_SameCollisionGroupSameLayerCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Collider_SameCollisionGroupSameLayerCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => Collider_SameCollisionGroupSameLayerCollide}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_SameCollisionGroupSameLayerCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_SameCollisionGroupSameLayerCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Collider_SameCollisionGroupSameLayerCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Collider_SameCollisionGroupSameLayerCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0 => Collider_SameCollisionGroupSameLayerCollide}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => Collider_SameCollisionGroupSameLayerCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision/C4982595_Collider_TriggerDisablesCollision.ly => Collider_TriggerPassThrough/Collider_TriggerPassThrough.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Collider_TriggerPassThrough}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Collider_TriggerPassThrough}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Collider_TriggerPassThrough}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => Collider_TriggerPassThrough}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => Collider_TriggerPassThrough}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => Collider_TriggerPassThrough}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Collider_TriggerPassThrough}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => Collider_TriggerPassThrough}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => Collider_TriggerPassThrough}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion/C5959760_PhysxForceRegion_PointForceExertion.ly => ForceRegion_CapsuleShapedForce/ForceRegion_CapsuleShapedForce.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => ForceRegion_CapsuleShapedForce}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => ForceRegion_CapsuleShapedForce}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ForceRegion_CapsuleShapedForce}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => ForceRegion_CapsuleShapedForce}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => ForceRegion_CapsuleShapedForce}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ForceRegion_CapsuleShapedForce}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => ForceRegion_CapsuleShapedForce}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_CapsuleShapedForce}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.ly => ForceRegion_DirectionHasNoAffectOnTotalForce/ForceRegion_DirectionHasNoAffectOnTotalForce.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => ForceRegion_DirectionHasNoAffectOnTotalForce}/filelist.xml (67%) rename AutomatedTesting/Levels/Physics/{C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude => ForceRegion_DirectionHasNoAffectOnTotalForce}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => ForceRegion_DirectionHasNoAffectOnTotalForce}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => ForceRegion_DirectionHasNoAffectOnTotalForce}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ForceRegion_DirectionHasNoAffectOnTotalForce}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => ForceRegion_DirectionHasNoAffectOnTotalForce}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => ForceRegion_DirectionHasNoAffectOnTotalForce}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_DirectionHasNoAffectOnTotalForce}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_DirectionHasNoAffectOnTotalForce}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6321601_Force_HighValuesDirectionAxes/C6321601_Force_HighValuesDirectionAxes.ly => ForceRegion_HighValuesDirectionAxesWorkWithNoError/ForceRegion_HighValuesDirectionAxesWorkWithNoError.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6321601_Force_HighValuesDirectionAxes => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/filelist.xml (68%) rename AutomatedTesting/Levels/Physics/{C6321601_Force_HighValuesDirectionAxes => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1 => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => ForceRegion_HighValuesDirectionAxesWorkWithNoError}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube/C5959763_ForceRegion_ForceRegionImpulsesCube.ly => ForceRegion_ImpulsesBoxShapedRigidBody/ForceRegion_ImpulsesBoxShapedRigidBody.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ForceRegion_ImpulsesBoxShapedRigidBody}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ForceRegion_ImpulsesBoxShapedRigidBody}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_ImpulsesBoxShapedRigidBody}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ForceRegion_ImpulsesBoxShapedRigidBody}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ForceRegion_ImpulsesBoxShapedRigidBody}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_ImpulsesBoxShapedRigidBody}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => ForceRegion_ImpulsesBoxShapedRigidBody}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_ImpulsesBoxShapedRigidBody}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule/C5959764_ForceRegion_ForceRegionImpulsesCapsule.ly => ForceRegion_ImpulsesCapsuleShapedRigidBody/ForceRegion_ImpulsesCapsuleShapedRigidBody.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ForceRegion_ImpulsesCapsuleShapedRigidBody}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ForceRegion_ImpulsesCapsuleShapedRigidBody}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => ForceRegion_ImpulsesCapsuleShapedRigidBody}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ForceRegion_ImpulsesCapsuleShapedRigidBody}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => ForceRegion_ImpulsesCapsuleShapedRigidBody}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => ForceRegion_ImpulsesCapsuleShapedRigidBody}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_ImpulsesCapsuleShapedRigidBody}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_ImpulsesCapsuleShapedRigidBody}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/ForceRegion_ImpulsesPxMeshShapedRigidBody.ly rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => ForceRegion_ImpulsesPxMeshShapedRigidBody}/PhysXSedan/_dev_Sedan_r0-b.fbx (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => ForceRegion_ImpulsesPxMeshShapedRigidBody}/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => ForceRegion_ImpulsesPxMeshShapedRigidBody}/PhysXSedan/_dev_sedan_r0-b.mtl (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ForceRegion_ImpulsesPxMeshShapedRigidBody}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ForceRegion_ImpulsesPxMeshShapedRigidBody}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_ImpulsesPxMeshShapedRigidBody}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => ForceRegion_ImpulsesPxMeshShapedRigidBody}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_ImpulsesPxMeshShapedRigidBody}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_ImpulsesPxMeshShapedRigidBody}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_ImpulsesPxMeshShapedRigidBody}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => ForceRegion_ImpulsesPxMeshShapedRigidBody}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping/C5932042_PhysxForceRegion_LinearDamping.ly => ForceRegion_LinearDampingForceOnRigidBodies/ForceRegion_LinearDampingForceOnRigidBodies.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => ForceRegion_LinearDampingForceOnRigidBodies}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => ForceRegion_LinearDampingForceOnRigidBodies}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_LinearDampingForceOnRigidBodies}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => ForceRegion_LinearDampingForceOnRigidBodies}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_LinearDampingForceOnRigidBodies}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_LinearDampingForceOnRigidBodies}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => ForceRegion_LinearDampingForceOnRigidBodies}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_LinearDampingForceOnRigidBodies}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.ly => ForceRegion_LocalSpaceForceOnRigidBodies/ForceRegion_LocalSpaceForceOnRigidBodies.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => ForceRegion_LocalSpaceForceOnRigidBodies}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => ForceRegion_LocalSpaceForceOnRigidBodies}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => ForceRegion_LocalSpaceForceOnRigidBodies}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_LocalSpaceForceOnRigidBodies}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => ForceRegion_LocalSpaceForceOnRigidBodies}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => ForceRegion_LocalSpaceForceOnRigidBodies}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_LocalSpaceForceOnRigidBodies}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => ForceRegion_LocalSpaceForceOnRigidBodies}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange/C5968760_ForceRegion_CheckNetForceChange.ly => ForceRegion_MovingForceRegionChangesNetForce/ForceRegion_MovingForceRegionChangesNetForce.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => ForceRegion_MovingForceRegionChangesNetForce}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => ForceRegion_MovingForceRegionChangesNetForce}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_MovingForceRegionChangesNetForce}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => ForceRegion_MovingForceRegionChangesNetForce}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_MovingForceRegionChangesNetForce}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_MovingForceRegionChangesNetForce}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_MovingForceRegionChangesNetForce}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0 => ForceRegion_MovingForceRegionChangesNetForce}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => ForceRegion_MovingForceRegionChangesNetForce}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.ly => ForceRegion_MultipleComponentsCombineForces/ForceRegion_MultipleComponentsCombineForces.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ForceRegion_MultipleComponentsCombineForces}/filelist.xml (68%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ForceRegion_MultipleComponentsCombineForces}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0 => ForceRegion_MultipleComponentsCombineForces}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => ForceRegion_MultipleComponentsCombineForces}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_MultipleComponentsCombineForces}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => ForceRegion_MultipleComponentsCombineForces}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1 => ForceRegion_MultipleComponentsCombineForces}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => ForceRegion_MultipleComponentsCombineForces}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces/C5959810_ForceRegion_ForceRegionCombinesForces.ly => ForceRegion_MultipleForcesInSameComponentCombineForces/ForceRegion_MultipleForcesInSameComponentCombineForces.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ForceRegion_MultipleForcesInSameComponentCombineForces}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ForceRegion_MultipleForcesInSameComponentCombineForces}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1 => ForceRegion_MultipleForcesInSameComponentCombineForces}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ForceRegion_MultipleForcesInSameComponentCombineForces}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_MultipleForcesInSameComponentCombineForces}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_MultipleForcesInSameComponentCombineForces}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => ForceRegion_MultipleForcesInSameComponentCombineForces}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => ForceRegion_MultipleForcesInSameComponentCombineForces}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => ForceRegion_MultipleForcesInSameComponentCombineForces}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce/C15845879_ForceRegion_HighLinearDampingForce.ly => ForceRegion_NoQuiverOnHighLinearDampingForce/ForceRegion_NoQuiverOnHighLinearDampingForce.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_NoQuiverOnHighLinearDampingForce}/filelist.xml (74%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_NoQuiverOnHighLinearDampingForce}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => ForceRegion_NoQuiverOnHighLinearDampingForce}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevels => ForceRegion_NoQuiverOnHighLinearDampingForce}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_NoQuiverOnHighLinearDampingForce}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0 => ForceRegion_NoQuiverOnHighLinearDampingForce}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => ForceRegion_NoQuiverOnHighLinearDampingForce}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => ForceRegion_NoQuiverOnHighLinearDampingForce}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => ForceRegion_NoQuiverOnHighLinearDampingForce}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions/C6090547_ForceRegion_ParentChildForceRegions.ly => ForceRegion_ParentChildForcesCombineForces/ForceRegion_ParentChildForcesCombineForces.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => ForceRegion_ParentChildForcesCombineForces}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => ForceRegion_ParentChildForcesCombineForces}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => ForceRegion_ParentChildForcesCombineForces}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654881_CharacterController_SwitchLevelsEmpty => ForceRegion_ParentChildForcesCombineForces}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => ForceRegion_ParentChildForcesCombineForces}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1 => ForceRegion_ParentChildForcesCombineForces}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => ForceRegion_ParentChildForcesCombineForces}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => ForceRegion_ParentChildForcesCombineForces}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => ForceRegion_ParentChildForcesCombineForces}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies.ly => ForceRegion_PointForceOnRigidBodies/ForceRegion_PointForceOnRigidBodies.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => ForceRegion_PointForceOnRigidBodies}/PhysX_ForceRegion_PointForceOnRigidBodies.ly (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => ForceRegion_PointForceOnRigidBodies}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => ForceRegion_PointForceOnRigidBodies}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => ForceRegion_PointForceOnRigidBodies}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => ForceRegion_PointForceOnRigidBodies}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => ForceRegion_PointForceOnRigidBodies}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => ForceRegion_PointForceOnRigidBodies}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => ForceRegion_PointForceOnRigidBodies}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_PointForceOnRigidBodies}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset/C5959808_ForceRegion_PositionOffset.ly => ForceRegion_PositionOffset/ForceRegion_PositionOffset.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ForceRegion_PositionOffset}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ForceRegion_PositionOffset}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => ForceRegion_PositionOffset}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => ForceRegion_PositionOffset}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => ForceRegion_PositionOffset}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => ForceRegion_PositionOffset}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => ForceRegion_PositionOffset}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => ForceRegion_PositionOffset}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained => ForceRegion_PositionOffset}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ForceRegion_PxMeshShapedForce}/ForceRegion_ExertsPointForce_Sedan.ly (100%) create mode 100644 AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/ForceRegion_PxMeshShapedForce.ly rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => ForceRegion_PxMeshShapedForce}/PhysXSedan/_dev_Sedan_r0-b.fbx (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => ForceRegion_PxMeshShapedForce}/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => ForceRegion_PxMeshShapedForce}/PhysXSedan/_dev_sedan_r0-b.mtl (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ForceRegion_PxMeshShapedForce}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ForceRegion_PxMeshShapedForce}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => ForceRegion_PxMeshShapedForce}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => ForceRegion_PxMeshShapedForce}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => ForceRegion_PxMeshShapedForce}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => ForceRegion_PxMeshShapedForce}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => ForceRegion_PxMeshShapedForce}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => ForceRegion_PxMeshShapedForce}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset/C5959809_ForceRegion_RotationalOffset.ly => ForceRegion_RotationalOffset/ForceRegion_RotationalOffset.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ForceRegion_RotationalOffset}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ForceRegion_RotationalOffset}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => ForceRegion_RotationalOffset}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14861498_ConfirmError_NoPxMesh => ForceRegion_RotationalOffset}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => ForceRegion_RotationalOffset}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => ForceRegion_RotationalOffset}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => ForceRegion_RotationalOffset}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => ForceRegion_RotationalOffset}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => ForceRegion_RotationalOffset}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody/C5932043_ForceRegion_SimpleDragOnRigidBody.ly => ForceRegion_SimpleDragForceOnRigidBodies/ForceRegion_SimpleDragForceOnRigidBodies.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => ForceRegion_SimpleDragForceOnRigidBodies}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => ForceRegion_SimpleDragForceOnRigidBodies}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => ForceRegion_SimpleDragForceOnRigidBodies}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ForceRegion_SimpleDragForceOnRigidBodies}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => ForceRegion_SimpleDragForceOnRigidBodies}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => ForceRegion_SimpleDragForceOnRigidBodies}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => ForceRegion_SimpleDragForceOnRigidBodies}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => ForceRegion_SimpleDragForceOnRigidBodies}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => ForceRegion_SliceFileInstantiates}/ForceRegionEntity.slice (100%) create mode 100644 AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/ForceRegion_SliceFileInstantiates.ly rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => ForceRegion_SliceFileInstantiates}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => ForceRegion_SliceFileInstantiates}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => ForceRegion_SliceFileInstantiates}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ForceRegion_SliceFileInstantiates}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_SliceFileInstantiates}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => ForceRegion_SliceFileInstantiates}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => ForceRegion_SliceFileInstantiates}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => ForceRegion_SliceFileInstantiates}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => ForceRegion_SliceFileInstantiates}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation/C12905527_ForceRegion_MagnitudeDeviation.ly => ForceRegion_SmallMagnitudeDeviationOnLargeForces/ForceRegion_SmallMagnitudeDeviationOnLargeForces.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C12905527_ForceRegion_MagnitudeDeviation => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => ForceRegion_SmallMagnitudeDeviationOnLargeForces}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce/C5959759_RigidBody_ForceRegionSpherePointForce.ly => ForceRegion_SphereShapedForce/ForceRegion_SphereShapedForce.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => ForceRegion_SphereShapedForce}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => ForceRegion_SphereShapedForce}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => ForceRegion_SphereShapedForce}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0 => ForceRegion_SphereShapedForce}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => ForceRegion_SphereShapedForce}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained/LevelData => ForceRegion_SphereShapedForce/leveldata}/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_SphereShapedForce}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => ForceRegion_SphereShapedForce}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline/C5932045_ForceRegion_Spline.ly => ForceRegion_SplineForceOnRigidBodies/ForceRegion_SplineForceOnRigidBodies.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => ForceRegion_SplineForceOnRigidBodies}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => ForceRegion_SplineForceOnRigidBodies}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/LevelData => ForceRegion_SplineForceOnRigidBodies/leveldata}/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => ForceRegion_SplineForceOnRigidBodies}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => ForceRegion_SplineForceOnRigidBodies}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => ForceRegion_SplineForceOnRigidBodies}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => ForceRegion_SplineForceOnRigidBodies}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained => ForceRegion_SplineForceOnRigidBodies}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform/C12868580_ForceRegion_SplineModifiedTransform.ly => ForceRegion_SplineRegionWithModifiedTransform/ForceRegion_SplineRegionWithModifiedTransform.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => ForceRegion_SplineRegionWithModifiedTransform}/filelist.xml (74%) rename AutomatedTesting/Levels/Physics/{C12868580_ForceRegion_SplineModifiedTransform => ForceRegion_SplineRegionWithModifiedTransform}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_SplineRegionWithModifiedTransform}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ForceRegion_SplineRegionWithModifiedTransform}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => ForceRegion_SplineRegionWithModifiedTransform}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => ForceRegion_SplineRegionWithModifiedTransform}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => ForceRegion_SplineRegionWithModifiedTransform}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => ForceRegion_SplineRegionWithModifiedTransform}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => ForceRegion_SplineRegionWithModifiedTransform}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce/C5932040_ForceRegion_CubeExertsWorldForce.ly => ForceRegion_WorldSpaceForceOnRigidBodies/ForceRegion_WorldSpaceForceOnRigidBodies.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => ForceRegion_WorldSpaceForceOnRigidBodies}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => ForceRegion_WorldSpaceForceOnRigidBodies}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained/LevelData => ForceRegion_WorldSpaceForceOnRigidBodies/leveldata}/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => ForceRegion_WorldSpaceForceOnRigidBodies}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => ForceRegion_WorldSpaceForceOnRigidBodies}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => ForceRegion_WorldSpaceForceOnRigidBodies}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => ForceRegion_WorldSpaceForceOnRigidBodies}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained => ForceRegion_WorldSpaceForceOnRigidBodies}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative/C6090552_ForceRegion_LinearDampingNegative.ly => ForceRegion_ZeroLinearDampingDoesNothing/ForceRegion_ZeroLinearDampingDoesNothing.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => ForceRegion_ZeroLinearDampingDoesNothing}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => ForceRegion_ZeroLinearDampingDoesNothing}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => ForceRegion_ZeroLinearDampingDoesNothing}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0 => ForceRegion_ZeroLinearDampingDoesNothing}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => ForceRegion_ZeroLinearDampingDoesNothing}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => ForceRegion_ZeroLinearDampingDoesNothing}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => ForceRegion_ZeroLinearDampingDoesNothing}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => ForceRegion_ZeroLinearDampingDoesNothing}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => ForceRegion_ZeroLinearDampingDoesNothing}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => ForceRegion_ZeroLinearDampingDoesNothing}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/ForceRegion_ZeroLocalSpaceForceDoesNothing.ly rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => ForceRegion_ZeroLocalSpaceForceDoesNothing}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => ForceRegion_ZeroLocalSpaceForceDoesNothing}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => ForceRegion_ZeroLocalSpaceForceDoesNothing}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1 => ForceRegion_ZeroLocalSpaceForceDoesNothing}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => ForceRegion_ZeroLocalSpaceForceDoesNothing}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => ForceRegion_ZeroLocalSpaceForceDoesNothing}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => ForceRegion_ZeroLocalSpaceForceDoesNothing}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => ForceRegion_ZeroLocalSpaceForceDoesNothing}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => ForceRegion_ZeroLocalSpaceForceDoesNothing}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => ForceRegion_ZeroLocalSpaceForceDoesNothing}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/ForceRegion_ZeroPointForceDoesNothing.ly rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => ForceRegion_ZeroPointForceDoesNothing}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => ForceRegion_ZeroPointForceDoesNothing}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => ForceRegion_ZeroPointForceDoesNothing}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => ForceRegion_ZeroPointForceDoesNothing}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => ForceRegion_ZeroPointForceDoesNothing}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => ForceRegion_ZeroPointForceDoesNothing}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => ForceRegion_ZeroPointForceDoesNothing}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => ForceRegion_ZeroPointForceDoesNothing}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => ForceRegion_ZeroPointForceDoesNothing}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide => ForceRegion_ZeroPointForceDoesNothing}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.ly => ForceRegion_ZeroSimpleDragForceDoesNothing/ForceRegion_ZeroSimpleDragForceDoesNothing.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => ForceRegion_ZeroSimpleDragForceDoesNothing}/filelist.xml (68%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => ForceRegion_ZeroSimpleDragForceDoesNothing}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => ForceRegion_ZeroSimpleDragForceDoesNothing}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => ForceRegion_ZeroSimpleDragForceDoesNothing}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1 => ForceRegion_ZeroSimpleDragForceDoesNothing}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained/LevelData => ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata}/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => ForceRegion_ZeroSimpleDragForceDoesNothing}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => ForceRegion_ZeroSimpleDragForceDoesNothing}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => ForceRegion_ZeroSimpleDragForceDoesNothing}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies/C6090555_ForceRegion_SplineFollowOnRigidBodies.ly => ForceRegion_ZeroSplineForceDoesNothing/ForceRegion_ZeroSplineForceDoesNothing.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => ForceRegion_ZeroSplineForceDoesNothing}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => ForceRegion_ZeroSplineForceDoesNothing}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => ForceRegion_ZeroSplineForceDoesNothing}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => ForceRegion_ZeroSplineForceDoesNothing}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => ForceRegion_ZeroSplineForceDoesNothing}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => ForceRegion_ZeroSplineForceDoesNothing}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained => ForceRegion_ZeroSplineForceDoesNothing}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => ForceRegion_ZeroSplineForceDoesNothing}/tags.txt (100%) create mode 100644 AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/ForceRegion_ZeroWorldSpaceForceDoesNothing.ly rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => ForceRegion_ZeroWorldSpaceForceDoesNothing}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => ForceRegion_ZeroWorldSpaceForceDoesNothing}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => ForceRegion_ZeroWorldSpaceForceDoesNothing}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => ForceRegion_ZeroWorldSpaceForceDoesNothing}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => ForceRegion_ZeroWorldSpaceForceDoesNothing}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => ForceRegion_ZeroWorldSpaceForceDoesNothing}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => ForceRegion_ZeroWorldSpaceForceDoesNothing}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained => ForceRegion_ZeroWorldSpaceForceDoesNothing}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => ForceRegion_ZeroWorldSpaceForceDoesNothing}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => ForceRegion_ZeroWorldSpaceForceDoesNothing}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained/C18243588_Joints_Ball2BodiesConstrained.ly => Joints_Ball2BodiesConstrained/Joints_Ball2BodiesConstrained.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained => Joints_Ball2BodiesConstrained}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained => Joints_Ball2BodiesConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => Joints_Ball2BodiesConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Joints_Ball2BodiesConstrained}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => Joints_Ball2BodiesConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => Joints_Ball2BodiesConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => Joints_Ball2BodiesConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Joints_Ball2BodiesConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable/C18243592_Joints_BallBreakable.ly => Joints_BallBreakable/Joints_BallBreakable.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => Joints_BallBreakable}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => Joints_BallBreakable}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => Joints_BallBreakable}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithOutTerrain => Joints_BallBreakable}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => Joints_BallBreakable}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide => Joints_BallBreakable}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => Joints_BallBreakable}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Joints_BallBreakable}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide/C18243591_Joints_BallLeadFollowerCollide.ly => Joints_BallLeadFollowerCollide/Joints_BallLeadFollowerCollide.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => Joints_BallLeadFollowerCollide}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => Joints_BallLeadFollowerCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained => Joints_BallLeadFollowerCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => Joints_BallLeadFollowerCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => Joints_BallLeadFollowerCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => Joints_BallLeadFollowerCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide => Joints_BallLeadFollowerCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => Joints_BallLeadFollowerCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained/C18243590_Joints_BallNoLimitsConstrained.ly => Joints_BallNoLimitsConstrained/Joints_BallNoLimitsConstrained.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => Joints_BallNoLimitsConstrained}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => Joints_BallNoLimitsConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => Joints_BallNoLimitsConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Joints_BallNoLimitsConstrained}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => Joints_BallNoLimitsConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Joints_BallNoLimitsConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => Joints_BallNoLimitsConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Joints_BallNoLimitsConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained/C18243589_Joints_BallSoftLimitsConstrained.ly => Joints_BallSoftLimitsConstrained/Joints_BallSoftLimitsConstrained.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => Joints_BallSoftLimitsConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => Joints_BallSoftLimitsConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => Joints_BallSoftLimitsConstrained}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => Joints_BallSoftLimitsConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Joints_BallSoftLimitsConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Joints_BallSoftLimitsConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Joints_BallSoftLimitsConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained/C18243580_Joints_Fixed2BodiesConstrained.ly => Joints_Fixed2BodiesConstrained/Joints_Fixed2BodiesConstrained.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide/leveldata => Joints_Fixed2BodiesConstrained/LevelData}/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata => Joints_Fixed2BodiesConstrained/LevelData}/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained/leveldata => Joints_Fixed2BodiesConstrained/LevelData}/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority/leveldata => Joints_Fixed2BodiesConstrained/LevelData}/VegetationMap.dat (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => Joints_Fixed2BodiesConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Joints_Fixed2BodiesConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Joints_Fixed2BodiesConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable/C18243581_Joints_FixedBreakable.ly => Joints_FixedBreakable/Joints_FixedBreakable.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_FixedBreakable/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => Joints_FixedBreakable}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => Joints_FixedBreakable}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => Joints_FixedBreakable}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => Joints_FixedBreakable}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => Joints_FixedBreakable}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Joints_FixedBreakable}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Joints_FixedBreakable}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide/C18243582_Joints_FixedLeadFollowerCollide.ly => Joints_FixedLeadFollowerCollide/Joints_FixedLeadFollowerCollide.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => Joints_FixedLeadFollowerCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Joints_FixedLeadFollowerCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => Joints_FixedLeadFollowerCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => Joints_FixedLeadFollowerCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/LevelData => Joints_FixedLeadFollowerCollide/leveldata}/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => Joints_FixedLeadFollowerCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Joints_FixedLeadFollowerCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained/C18243593_Joints_GlobalFrameConstrained.ly => Joints_GlobalFrameConstrained/Joints_GlobalFrameConstrained.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Joints_GlobalFrameConstrained}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Joints_GlobalFrameConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Joints_GlobalFrameConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => Joints_GlobalFrameConstrained}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => Joints_GlobalFrameConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Joints_GlobalFrameConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Joints_GlobalFrameConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Joints_GlobalFrameConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained/C18243583_Joints_Hinge2BodiesConstrained.ly => Joints_Hinge2BodiesConstrained/Joints_Hinge2BodiesConstrained.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained => Joints_Hinge2BodiesConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Joints_Hinge2BodiesConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243580_Joints_Fixed2BodiesConstrained/LevelData => Joints_Hinge2BodiesConstrained/leveldata}/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide => Joints_Hinge2BodiesConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Joints_Hinge2BodiesConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Joints_Hinge2BodiesConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Joints_Hinge2BodiesConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable/C18243587_Joints_HingeBreakable.ly => Joints_HingeBreakable/Joints_HingeBreakable.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_HingeBreakable/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => Joints_HingeBreakable}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => Joints_HingeBreakable}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243581_Joints_FixedBreakable => Joints_HingeBreakable}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => Joints_HingeBreakable}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Joints_HingeBreakable}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Joints_HingeBreakable}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Joints_HingeBreakable}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide/C18243586_Joints_HingeLeadFollowerCollide.ly => Joints_HingeLeadFollowerCollide/Joints_HingeLeadFollowerCollide.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => Joints_HingeLeadFollowerCollide}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Joints_HingeLeadFollowerCollide}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243582_Joints_FixedLeadFollowerCollide => Joints_HingeLeadFollowerCollide}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Joints_HingeLeadFollowerCollide}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Joints_HingeLeadFollowerCollide}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Joints_HingeLeadFollowerCollide}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Joints_HingeLeadFollowerCollide}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained/C18243585_Joints_HingeNoLimitsConstrained.ly => Joints_HingeNoLimitsConstrained/Joints_HingeNoLimitsConstrained.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide => Joints_HingeNoLimitsConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => Joints_HingeNoLimitsConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243583_Joints_Hinge2BodiesConstrained => Joints_HingeNoLimitsConstrained}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Joints_HingeNoLimitsConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Joints_HingeNoLimitsConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Joints_HingeNoLimitsConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Joints_HingeNoLimitsConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained/C18243584_Joints_HingeSoftLimitsConstrained.ly => Joints_HingeSoftLimitsConstrained/Joints_HingeSoftLimitsConstrained.ly} (100%) create mode 100644 AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/filelist.xml rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => Joints_HingeSoftLimitsConstrained}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Joints_HingeSoftLimitsConstrained}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243584_Joints_HingeSoftLimitsConstrained => Joints_HingeSoftLimitsConstrained}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Joints_HingeSoftLimitsConstrained}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Joints_HingeSoftLimitsConstrained}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Joints_HingeSoftLimitsConstrained}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Joints_HingeSoftLimitsConstrained}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain/C4925577_PhysXMaterials_MaterialAssignedToTerrain.ly => Material_CanBeAssignedToTerrain/Material_CanBeAssignedToTerrain.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_CanBeAssignedToTerrain}/filelist.xml (68%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_CanBeAssignedToTerrain}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_CanBeAssignedToTerrain}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_CanBeAssignedToTerrain}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => Material_CanBeAssignedToTerrain}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/LevelData => Material_CanBeAssignedToTerrain/leveldata}/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_CanBeAssignedToTerrain}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_CanBeAssignedToTerrain}/materials/material.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_CanBeAssignedToTerrain}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_CanBeAssignedToTerrain}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_CanBeAssignedToTerrain}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.ly => Material_CharacterController/Material_CharacterController.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => Material_CharacterController}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => Material_CharacterController}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_CharacterController}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => Material_CharacterController}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243585_Joints_HingeNoLimitsConstrained => Material_CharacterController}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Material_CharacterController}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_CharacterController}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => Material_CharacterController}/library.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_CharacterController}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => Material_CharacterController}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary/C15308221_Material_ComponentsInSyncWithLibrary.ly => Material_ComponentsInSyncWithLibrary/Material_ComponentsInSyncWithLibrary.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/c15308221_material_componentsinsyncwithlibrary.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_ComponentsInSyncWithLibrary}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => Material_ComponentsInSyncWithLibrary}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243586_Joints_HingeLeadFollowerCollide => Material_ComponentsInSyncWithLibrary}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Material_ComponentsInSyncWithLibrary}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_ComponentsInSyncWithLibrary}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/ragdoll_modified/AnimGraphPhysX.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_ComponentsInSyncWithLibrary/ragdoll_modified}/Red.tif (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/ragdoll_modified/RinLocomotion.motionset (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/ragdoll_modified/modified.mtl (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1) => Material_ComponentsInSyncWithLibrary/ragdoll_modified}/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1) => Material_ComponentsInSyncWithLibrary/ragdoll_modified}/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_ComponentsInSyncWithLibrary}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary => Material_ComponentsInSyncWithLibrary}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/Blue.tif (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency/C15096735_Materials_DefaultLibraryConsistency.ly => Material_DefaultLibraryConsistentOnAllFeatures/Material_DefaultLibraryConsistentOnAllFeatures.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified => Material_DefaultLibraryConsistentOnAllFeatures}/Red.tif (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/c15096735_materials_defaultlibraryconsistency.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/concrete.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/cowboy.emfxworkspace (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_DefaultLibraryConsistentOnAllFeatures}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => Material_DefaultLibraryConsistentOnAllFeatures}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => Material_DefaultLibraryConsistentOnAllFeatures}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_DefaultLibraryConsistentOnAllFeatures}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_DefaultLibraryConsistentOnAllFeatures}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/concrete/concrete_animgraph.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/concrete/concrete_motionset.motionset (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/concrete/rin_concrete.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/concrete/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/concrete/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rubber/rin_rubber.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rubber/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rubber/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rubber/rubber_animgraph.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/ragdoll/rubber/rubber_motionset.motionset (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/rubber.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_DefaultLibraryConsistentOnAllFeatures}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C15096735_Materials_DefaultLibraryConsistency => Material_DefaultLibraryConsistentOnAllFeatures}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/0.ly rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels => Material_DefaultLibraryUpdatedAcrossLevels}/0/filelist.xml (67%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/level.pak rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_DefaultLibraryUpdatedAcrossLevels/0}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15556261_PhysXMaterials_CharacterControllerMaterialAssignment => Material_DefaultLibraryUpdatedAcrossLevels/0}/leveldata/GameTokens.xml (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Heightmap.dat rename AutomatedTesting/Levels/Physics/{C18243587_Joints_HingeBreakable => Material_DefaultLibraryUpdatedAcrossLevels/0}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => Material_DefaultLibraryUpdatedAcrossLevels/0}/leveldata/TimeOfDay.xml (99%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_DefaultLibraryUpdatedAcrossLevels/0}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_DefaultLibraryUpdatedAcrossLevels/0}/tags.txt (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc rename AutomatedTesting/Levels/Physics/{C15308217_NoCrash_LevelSwitchWithTerrain => Material_DefaultLibraryUpdatedAcrossLevels/0}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_DefaultLibraryUpdatedAcrossLevels/0}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/1.ly rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels => Material_DefaultLibraryUpdatedAcrossLevels}/1/filelist.xml (67%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/level.pak rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_DefaultLibraryUpdatedAcrossLevels/1}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => Material_DefaultLibraryUpdatedAcrossLevels/1}/leveldata/GameTokens.xml (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Heightmap.dat rename AutomatedTesting/Levels/Physics/{C18243588_Joints_Ball2BodiesConstrained => Material_DefaultLibraryUpdatedAcrossLevels/1}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => Material_DefaultLibraryUpdatedAcrossLevels/1}/leveldata/TimeOfDay.xml (99%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_DefaultLibraryUpdatedAcrossLevels/1}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_DefaultLibraryUpdatedAcrossLevels/1}/tags.txt (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0 => Material_DefaultLibraryUpdatedAcrossLevels/1}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_DefaultLibraryUpdatedAcrossLevels/1}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/_last_run_before_change_data.txt rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/c15096732_material_defaultlibraryupdatedacrosslevels_b.physmaterial => Material_DefaultLibraryUpdatedAcrossLevels/after.physmaterial} (100%) rename AutomatedTesting/Levels/Physics/{C15096732_Material_DefaultLibraryUpdatedAcrossLevels/c15096732_material_defaultlibraryupdatedacrosslevels_a.physmaterial => Material_DefaultLibraryUpdatedAcrossLevels/before.physmaterial} (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/Layers/phase1.layer (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/Layers/phase2.layer (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/Layers/phase3.layer (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/Layers/phase4.layer (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges/C15096737_Materials_DefaultMaterialLibraryChanges.ly => Material_DefaultMaterialLibraryChangesWork/Material_DefaultMaterialLibraryChangesWork.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/all_ones_1.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/custom_motionset.motionset (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_DefaultMaterialLibraryChangesWork}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C15845879_ForceRegion_HighLinearDampingForce => Material_DefaultMaterialLibraryChangesWork}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243589_Joints_BallSoftLimitsConstrained => Material_DefaultMaterialLibraryChangesWork}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_DefaultMaterialLibraryChangesWork}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_DefaultMaterialLibraryChangesWork}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/materials/custom_material_1.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/materials/custom_material_2.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/materials/custom_terrain_mat_blue.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/materials/custom_terrain_mat_red.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/materials/material_terrain_default.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_physics.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_skeleton_newgeo - Copy.fbx (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_skeleton_newgeo - copy.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_skeleton_newgeo - copy.mtl (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_DefaultMaterialLibraryChangesWork}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15096737_Materials_DefaultMaterialLibraryChanges => Material_DefaultMaterialLibraryChangesWork}/ws.emfxworkspace (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction/C4044459_Material_DynamicFriction.ly => Material_DynamicFriction/Material_DynamicFriction.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_DynamicFriction}/dynamic_friction.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Material_DynamicFriction}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Material_DynamicFriction}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_DynamicFriction}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Material_DynamicFriction}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243590_Joints_BallNoLimitsConstrained => Material_DynamicFriction}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_DynamicFriction}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_DynamicFriction}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_DynamicFriction}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_DynamicFriction}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault/C4044694_Material_EmptyLibraryUsesDefault.ly => Material_EmptyLibraryUsesDefault/Material_EmptyLibraryUsesDefault.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_EmptyLibraryUsesDefault}/c4044694_material_emptylibraryusesdefault.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_EmptyLibraryUsesDefault}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_EmptyLibraryUsesDefault}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_EmptyLibraryUsesDefault}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Material_EmptyLibraryUsesDefault}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Material_EmptyLibraryUsesDefault}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Material_EmptyLibraryUsesDefault}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_EmptyLibraryUsesDefault}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_EmptyLibraryUsesDefault}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Material_EmptyLibraryUsesDefault}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Material_EmptyLibraryUsesDefault}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine/C4044456_Material_FrictionCombine.ly => Material_FrictionCombine/Material_FrictionCombine.ly} (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Material_FrictionCombine}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_FrictionCombine}/friction_combine.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Material_FrictionCombine}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_FrictionCombine}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => Material_FrictionCombine}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243591_Joints_BallLeadFollowerCollide => Material_FrictionCombine}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_FrictionCombine}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_FrictionCombine}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_FrictionCombine}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => Material_FrictionCombine}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority/C18977601_Material_FrictionCombinePriority.ly => Material_FrictionCombinePriorityOrder/Material_FrictionCombinePriorityOrder.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_FrictionCombinePriorityOrder}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Material_FrictionCombinePriorityOrder}/friction_combine.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_FrictionCombinePriorityOrder}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_FrictionCombinePriorityOrder}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Material_FrictionCombinePriorityOrder}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243592_Joints_BallBreakable => Material_FrictionCombinePriorityOrder}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_FrictionCombinePriorityOrder}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Material_FrictionCombinePriorityOrder}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_FrictionCombinePriorityOrder}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => Material_FrictionCombinePriorityOrder}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_LibraryChangesReflectInstantly}/C4044455_Material_LibraryChangesInstantly_restore.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly/C4044455_Material_LibraryChangesInstantly.ly => Material_LibraryChangesReflectInstantly/Material_LibraryChangesReflectInstantly.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_LibraryChangesReflectInstantly}/c4044455_material_librarychangesinstantly.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_LibraryChangesReflectInstantly}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_LibraryChangesReflectInstantly}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryChangesReflectInstantly}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_LibraryChangesReflectInstantly}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18243593_Joints_GlobalFrameConstrained => Material_LibraryChangesReflectInstantly}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_LibraryChangesReflectInstantly}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => Material_LibraryChangesReflectInstantly}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Material_LibraryChangesReflectInstantly}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1 => Material_LibraryChangesReflectInstantly}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => Material_LibraryChangesReflectInstantly}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController/C15563573_Material_AddModifyDeleteOnCharacterController.ly => Material_LibraryCrudOperationsReflectOnCharacterController/Material_LibraryCrudOperationsReflectOnCharacterController.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => Material_LibraryCrudOperationsReflectOnCharacterController}/c15563573_material_addmodifydeleteoncharactercontroller.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => Material_LibraryCrudOperationsReflectOnCharacterController}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => Material_LibraryCrudOperationsReflectOnCharacterController}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Material_LibraryCrudOperationsReflectOnCharacterController}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_LibraryCrudOperationsReflectOnCharacterController}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18977601_Material_FrictionCombinePriority => Material_LibraryCrudOperationsReflectOnCharacterController}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_LibraryCrudOperationsReflectOnCharacterController}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => Material_LibraryCrudOperationsReflectOnCharacterController}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => Material_LibraryCrudOperationsReflectOnCharacterController}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => Material_LibraryCrudOperationsReflectOnCharacterController}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15563573_Material_AddModifyDeleteOnCharacterController => Material_LibraryCrudOperationsReflectOnCharacterController}/testmaterials.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider/C4888315_Material_AddModifyDeleteOnCollider.ly => Material_LibraryCrudOperationsReflectOnCollider/Material_LibraryCrudOperationsReflectOnCollider.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_LibraryCrudOperationsReflectOnCollider}/c4888315_material_addmodifydeleteoncollider.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_LibraryCrudOperationsReflectOnCollider}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_LibraryCrudOperationsReflectOnCollider}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => Material_LibraryCrudOperationsReflectOnCollider}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_LibraryCrudOperationsReflectOnCollider}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Material_LibraryCrudOperationsReflectOnCollider}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_LibraryCrudOperationsReflectOnCollider}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => Material_LibraryCrudOperationsReflectOnCollider}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => Material_LibraryCrudOperationsReflectOnCollider}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_LibraryCrudOperationsReflectOnCollider}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => Material_LibraryCrudOperationsReflectOnCollider}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/C4925582_Material_AddModifyDeleteOnRagdollBones.ly => Material_LibraryCrudOperationsReflectOnRagdollBones/Material_LibraryCrudOperationsReflectOnRagdollBones.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryCrudOperationsReflectOnRagdollBones}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_LibraryCrudOperationsReflectOnRagdollBones}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => Material_LibraryCrudOperationsReflectOnRagdollBones}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_LibraryCrudOperationsReflectOnRagdollBones}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Material_LibraryCrudOperationsReflectOnRagdollBones}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_LibraryCrudOperationsReflectOnRagdollBones}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => Material_LibraryCrudOperationsReflectOnRagdollBones}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_default/AnimGraphPhysX.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_default/Blue.tif (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_default/RinLocomotion.motionset (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_default/default.mtl (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_default/rin_physics.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default}/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default}/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial/ragdoll_concrete => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified}/AnimGraphPhysX.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial/ragdoll_rubber => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified}/Red.tif (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial/ragdoll_concrete => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified}/RinLocomotion.motionset (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_modified/modified.mtl (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified}/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default => Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified}/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryCrudOperationsReflectOnRagdollBones}/ragdollbones.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => Material_LibraryCrudOperationsReflectOnRagdollBones}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Material_LibraryCrudOperationsReflectOnRagdollBones}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Material_LibraryCrudOperationsReflectOnRagdollBones}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain/C4925579_Material_AddModifyDeleteOnTerrain.ly => Material_LibraryCrudOperationsReflectOnTerrain/Material_LibraryCrudOperationsReflectOnTerrain.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/c4925579_material_addmodifydeleteonterrain.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => Material_LibraryCrudOperationsReflectOnTerrain}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_LibraryCrudOperationsReflectOnTerrain}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Material_LibraryCrudOperationsReflectOnTerrain}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => Material_LibraryCrudOperationsReflectOnTerrain}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/modified.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => Material_LibraryCrudOperationsReflectOnTerrain}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_LibraryCrudOperationsReflectOnTerrain}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels => Material_LibraryUpdatedAcrossLevels}/C15425935_Material_LibraryUpdatedAcrossLevels_0/C15425935_Material_LibraryUpdatedAcrossLevels_0.ly (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels => Material_LibraryUpdatedAcrossLevels}/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels => Material_LibraryUpdatedAcrossLevels}/C15425935_Material_LibraryUpdatedAcrossLevels_0/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/LevelData => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata}/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels => Material_LibraryUpdatedAcrossLevels}/C15425935_Material_LibraryUpdatedAcrossLevels_1/C15425935_Material_LibraryUpdatedAcrossLevels_1.ly (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels => Material_LibraryUpdatedAcrossLevels}/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels => Material_LibraryUpdatedAcrossLevels}/C15425935_Material_LibraryUpdatedAcrossLevels_1/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044694_Material_EmptyLibraryUsesDefault => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels.physmaterial => Material_LibraryUpdatedAcrossLevels/Material_LibraryUpdatedAcrossLevels.physmaterial} (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape/C5296614_PhysXMaterial_ColliderShape.ly => Material_NoEffectIfNoColliderShape/Material_NoEffectIfNoColliderShape.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => Material_NoEffectIfNoColliderShape}/filelist.xml (72%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => Material_NoEffectIfNoColliderShape}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => Material_NoEffectIfNoColliderShape}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_NoEffectIfNoColliderShape}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044455_Material_LibraryChangesInstantly => Material_NoEffectIfNoColliderShape}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Material_NoEffectIfNoColliderShape}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => Material_NoEffectIfNoColliderShape}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => Material_NoEffectIfNoColliderShape}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => Material_NoEffectIfNoColliderShape}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly => Material_PerFaceMaterialGetsCorrectMaterial/Material_PerFaceMaterialGetsCorrectMaterial.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_PerFaceMaterialGetsCorrectMaterial}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_PerFaceMaterialGetsCorrectMaterial}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => Material_PerFaceMaterialGetsCorrectMaterial}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Material_PerFaceMaterialGetsCorrectMaterial}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044456_Material_FrictionCombine => Material_PerFaceMaterialGetsCorrectMaterial}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => Material_PerFaceMaterialGetsCorrectMaterial}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => Material_PerFaceMaterialGetsCorrectMaterial}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => Material_PerFaceMaterialGetsCorrectMaterial}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Material_PerFaceMaterialGetsCorrectMaterial}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => Material_PerFaceMaterialGetsCorrectMaterial}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_PerFaceMaterialGetsCorrectMaterial}/test.fbx (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_PerFaceMaterialGetsCorrectMaterial}/test.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_PerFaceMaterialGetsCorrectMaterial}/test.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Material_PerFaceMaterialGetsCorrectMaterial}/test_library.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial/C4925580_Material_RagdollBonesMaterial.ly => Material_RagdollBones/Material_RagdollBones.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/c4925580_material_ragdollbonesmaterial.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_RagdollBones}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => Material_RagdollBones}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925577_PhysXMaterials_MaterialAssignedToTerrain => Material_RagdollBones}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Material_RagdollBones}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => Material_RagdollBones}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => Material_RagdollBones}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial/ragdoll_rubber => Material_RagdollBones/ragdoll_concrete}/AnimGraphPhysX.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_concrete/Blue.tif (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial/ragdoll_rubber => Material_RagdollBones/ragdoll_concrete}/RinLocomotion.motionset (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_concrete/concrete.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_concrete/rin_physics.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_concrete/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_concrete/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default => Material_RagdollBones/ragdoll_rubber}/AnimGraphPhysX.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified => Material_RagdollBones/ragdoll_rubber}/Red.tif (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default => Material_RagdollBones/ragdoll_rubber}/RinLocomotion.motionset (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_rubber/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_rubber/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RagdollBones}/ragdoll_rubber/rubber.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => Material_RagdollBones}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Material_RagdollBones}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => Material_RagdollBones}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution/C4044461_Material_Restitution.ly => Material_Restitution/Material_Restitution.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_Restitution}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_Restitution}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => Material_Restitution}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925579_Material_AddModifyDeleteOnTerrain => Material_Restitution}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_Restitution}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => Material_Restitution}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => Material_Restitution}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_Restitution}/restitution.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => Material_Restitution}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => Material_Restitution}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine/C4044457_Material_RestitutionCombine.ly => Material_RestitutionCombine/Material_RestitutionCombine.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_RestitutionCombine}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_RestitutionCombine}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => Material_RestitutionCombine}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925580_Material_RagdollBonesMaterial => Material_RestitutionCombine}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044459_Material_DynamicFriction => Material_RestitutionCombine}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => Material_RestitutionCombine}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => Material_RestitutionCombine}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044457_Material_RestitutionCombine => Material_RestitutionCombine}/restitution_combine.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => Material_RestitutionCombine}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Material_RestitutionCombine}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority/C18981526_Material_RestitutionCombinePriority.ly => Material_RestitutionCombinePriorityOrder/Material_RestitutionCombinePriorityOrder.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_RestitutionCombinePriorityOrder}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_RestitutionCombinePriorityOrder}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => Material_RestitutionCombinePriorityOrder}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Material_RestitutionCombinePriorityOrder}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_RestitutionCombinePriorityOrder}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => Material_RestitutionCombinePriorityOrder}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Material_RestitutionCombinePriorityOrder}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C18981526_Material_RestitutionCombinePriority => Material_RestitutionCombinePriorityOrder}/restitution_combine.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => Material_RestitutionCombinePriorityOrder}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Material_RestitutionCombinePriorityOrder}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction/C4044460_Material_StaticFriction.ly => Material_StaticFriction/Material_StaticFriction.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_StaticFriction}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_StaticFriction}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Material_StaticFriction}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => Material_StaticFriction}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044461_Material_Restitution => Material_StaticFriction}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Material_StaticFriction}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Material_StaticFriction}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4044460_Material_StaticFriction => Material_StaticFriction}/staticfriction.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => Material_StaticFriction}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Material_StaticFriction}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.ly rename AutomatedTesting/Levels/Physics/{C6131473_StaticSlice_OnDynamicSliceSpawn => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/RigidBody.slice (100%) rename AutomatedTesting/Levels/Physics/{C6131473_StaticSlice_OnDynamicSliceSpawn => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/filelist.xml (68%) rename AutomatedTesting/Levels/Physics/{C6131473_StaticSlice_OnDynamicSliceSpawn => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4044697_Material_PerfaceMaterialValidation => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => Physics_DynamicSliceWithPhysNotSpawnsStaticSlice}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo/C15425929_Undo_Redo.ly => Physics_UndoRedoWorksOnEntityWithPhysComponents/Physics_UndoRedoWorksOnEntityWithPhysComponents.ly} (100%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => Physics_UndoRedoWorksOnEntityWithPhysComponents}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C15425929_Undo_Redo => Physics_UndoRedoWorksOnEntityWithPhysComponents}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Physics_UndoRedoWorksOnEntityWithPhysComponents}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => Physics_UndoRedoWorksOnEntityWithPhysComponents}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Physics_UndoRedoWorksOnEntityWithPhysComponents}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => Physics_UndoRedoWorksOnEntityWithPhysComponents}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => Physics_UndoRedoWorksOnEntityWithPhysComponents}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Physics_UndoRedoWorksOnEntityWithPhysComponents}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Physics_UndoRedoWorksOnEntityWithPhysComponents}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.ly => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/filelist.xml (66%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4888315_Material_AddModifyDeleteOnCollider => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => Physics_WorldBodyBusWorksOnEditorComponents}/PhysXSedan/_dev_Sedan_r0-b.fbx (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => Physics_WorldBodyBusWorksOnEditorComponents}/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => Physics_WorldBodyBusWorksOnEditorComponents}/PhysXSedan/_dev_sedan_r0-b.mtl (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks/C29032500_EditorComponents_WorldBodyBusWorks.ly => Physics_WorldBodyBusWorksOnEditorComponents/Physics_WorldBodyBusWorksOnEditorComponents.ly} (100%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Physics_WorldBodyBusWorksOnEditorComponents}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C29032500_EditorComponents_WorldBodyBusWorks => Physics_WorldBodyBusWorksOnEditorComponents}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => Physics_WorldBodyBusWorksOnEditorComponents}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => Physics_WorldBodyBusWorksOnEditorComponents}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => Physics_WorldBodyBusWorksOnEditorComponents}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Physics_WorldBodyBusWorksOnEditorComponents}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Physics_WorldBodyBusWorksOnEditorComponents}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Physics_WorldBodyBusWorksOnEditorComponents}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll/C13895144_Ragdoll_NoRagdoll.ly => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/NoRagdoll.ly} (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_NoRagdoll => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll/C13895144_Ragdoll_WithRagdoll.ly => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/WithRagdoll.ly} (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982593_PhysxCollider_CollisionLayerTest => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/myMotionSet.motionset (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/ragdoll.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/rin/AnimGraphForSecondRagdoll(1).animgraph (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/rin/PhysicsRin(1).zip (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)}/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)}/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C13895144_Ragdoll_WithRagdoll => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/rin/rin_physics(1).animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest/C14654882_Ragdoll_ragdollAPTest.ly => Ragdoll_OldRagdollSerializationNoErrors/Ragdoll_OldRagdollSerializationNoErrors.ly} (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => Ragdoll_OldRagdollSerializationNoErrors}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C14654882_Ragdoll_ragdollAPTest => Ragdoll_OldRagdollSerializationNoErrors}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => Ragdoll_OldRagdollSerializationNoErrors}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => Ragdoll_OldRagdollSerializationNoErrors}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => Ragdoll_OldRagdollSerializationNoErrors}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => Ragdoll_OldRagdollSerializationNoErrors}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Ragdoll_OldRagdollSerializationNoErrors}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => Ragdoll_OldRagdollSerializationNoErrors}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => Ragdoll_OldRagdollSerializationNoErrors}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata => Ragdoll_WorldBodyBusWorks/LevelData}/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity/leveldata => Ragdoll_WorldBodyBusWorks/LevelData}/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision/leveldata => Ragdoll_WorldBodyBusWorks/LevelData}/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape/leveldata => Ragdoll_WorldBodyBusWorks/LevelData}/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests/C28978033_Ragdoll_WorldBodyBusTests.ly => Ragdoll_WorldBodyBusWorks/Ragdoll_WorldBodyBusWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Ragdoll_WorldBodyBusWorks}/TerrainTexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Ragdoll_WorldBodyBusWorks}/filelist.xml (72%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Ragdoll_WorldBodyBusWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified => Ragdoll_WorldBodyBusWorks/ragdoll_default}/AnimGraphPhysX.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Ragdoll_WorldBodyBusWorks}/ragdoll_default/Blue.tif (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified => Ragdoll_WorldBodyBusWorks/ragdoll_default}/RinLocomotion.motionset (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Ragdoll_WorldBodyBusWorks}/ragdoll_default/default.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones => Ragdoll_WorldBodyBusWorks}/ragdoll_default/rin_physics.animgraph (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified => Ragdoll_WorldBodyBusWorks/ragdoll_default}/rin_skeleton_newgeo.fbx (100%) rename AutomatedTesting/Levels/Physics/{C28978033_Ragdoll_WorldBodyBusTests => Ragdoll_WorldBodyBusWorks}/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified => Ragdoll_WorldBodyBusWorks/ragdoll_default}/rin_skeleton_newgeo.mtl (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => Ragdoll_WorldBodyBusWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid/C4976194_RigidBody_PhysXComponentIsValid.ly => RigidBody_AddRigidBodyComponent/RigidBody_AddRigidBodyComponent.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => RigidBody_AddRigidBodyComponent}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976194_RigidBody_PhysXComponentIsValid => RigidBody_AddRigidBodyComponent}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => RigidBody_AddRigidBodyComponent}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => RigidBody_AddRigidBodyComponent}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => RigidBody_AddRigidBodyComponent}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => RigidBody_AddRigidBodyComponent}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => RigidBody_AddRigidBodyComponent}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => RigidBody_AddRigidBodyComponent}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => RigidBody_AddRigidBodyComponent}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation/C4976200_RigidBody_AngularDampingObjectRotation.ly => RigidBody_AngularDampingAffectsRotation/RigidBody_AngularDampingAffectsRotation.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => RigidBody_AngularDampingAffectsRotation}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion => RigidBody_AngularDampingAffectsRotation}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => RigidBody_AngularDampingAffectsRotation}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => RigidBody_AngularDampingAffectsRotation}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => RigidBody_AngularDampingAffectsRotation}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => RigidBody_AngularDampingAffectsRotation}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_AngularDampingAffectsRotation}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => RigidBody_AngularDampingAffectsRotation}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => RigidBody_AngularDampingAffectsRotation}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_AngularDampingAffectsRotation}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => RigidBody_COM_ComputingWorks}/PhysXSedan/_dev_Sedan_r0-b.fbx (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => RigidBody_COM_ComputingWorks}/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => RigidBody_COM_ComputingWorks}/PhysXSedan/_dev_sedan_r0-b.mtl (100%) create mode 100644 AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/RigidBody_COM_ComputingWorks.ly rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => RigidBody_COM_ComputingWorks}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => RigidBody_COM_ComputingWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => RigidBody_COM_ComputingWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => RigidBody_COM_ComputingWorks}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => RigidBody_COM_ComputingWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => RigidBody_COM_ComputingWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => RigidBody_COM_ComputingWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_COM_ComputingWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => RigidBody_COM_ComputingWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting/C4976210_COM_ManualSetting.ly => RigidBody_COM_ManualSettingWorks/RigidBody_COM_ManualSettingWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => RigidBody_COM_ManualSettingWorks}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976210_COM_ManualSetting => RigidBody_COM_ManualSettingWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => RigidBody_COM_ManualSettingWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => RigidBody_COM_ManualSettingWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_COM_ManualSettingWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => RigidBody_COM_ManualSettingWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => RigidBody_COM_ManualSettingWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => RigidBody_COM_ManualSettingWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes/C13351703_COM_NotIncludeTriggerShapes.ly => RigidBody_COM_NotIncludesTriggerShapes/RigidBody_COM_NotIncludesTriggerShapes.ly} (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => RigidBody_COM_NotIncludesTriggerShapes}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C13351703_COM_NotIncludeTriggerShapes => RigidBody_COM_NotIncludesTriggerShapes}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_COM_NotIncludesTriggerShapes}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => RigidBody_COM_NotIncludesTriggerShapes}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => RigidBody_COM_NotIncludesTriggerShapes}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => RigidBody_COM_NotIncludesTriggerShapes}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => RigidBody_COM_NotIncludesTriggerShapes}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => RigidBody_COM_NotIncludesTriggerShapes}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => RigidBody_COM_NotIncludesTriggerShapes}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed/C4976218_RigidBodies_InertiaObjectNotComputed.ly => RigidBody_ComputeInertiaWorks/RigidBody_ComputeInertiaWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => RigidBody_ComputeInertiaWorks}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => RigidBody_ComputeInertiaWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => RigidBody_ComputeInertiaWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982595_Collider_TriggerDisablesCollision => RigidBody_ComputeInertiaWorks}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976209_RigidBody_ComputesCOM => RigidBody_ComputeInertiaWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => RigidBody_ComputeInertiaWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => RigidBody_ComputeInertiaWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => RigidBody_ComputeInertiaWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => RigidBody_ComputeInertiaWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity/C4976197_RigidBodies_InitialAngularVelocity.ly => RigidBody_InitialAngularVelocity/RigidBody_InitialAngularVelocity.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => RigidBody_InitialAngularVelocity}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C4976197_RigidBodies_InitialAngularVelocity => RigidBody_InitialAngularVelocity}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => RigidBody_InitialAngularVelocity}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982797_Collider_ColliderOffset => RigidBody_InitialAngularVelocity}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976218_RigidBodies_InertiaObjectNotComputed => RigidBody_InitialAngularVelocity}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => RigidBody_InitialAngularVelocity}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => RigidBody_InitialAngularVelocity}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => RigidBody_InitialAngularVelocity}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => RigidBody_InitialAngularVelocity}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity/C4976195_RigidBodies_InitialLinearVelocity.ly => RigidBody_InitialLinearVelocity/RigidBody_InitialLinearVelocity.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => RigidBody_InitialLinearVelocity}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => RigidBody_InitialLinearVelocity}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976195_RigidBodies_InitialLinearVelocity => RigidBody_InitialLinearVelocity}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976227_Collider_NewGroup => RigidBody_InitialLinearVelocity}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => RigidBody_InitialLinearVelocity}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => RigidBody_InitialLinearVelocity}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => RigidBody_InitialLinearVelocity}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => RigidBody_InitialLinearVelocity}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior/C4976207_PhysXRigidBodies_KinematicBehavior.ly => RigidBody_KinematicModeWorks/RigidBody_KinematicModeWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => RigidBody_KinematicModeWorks}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976207_PhysXRigidBodies_KinematicBehavior => RigidBody_KinematicModeWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => RigidBody_KinematicModeWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => RigidBody_KinematicModeWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => RigidBody_KinematicModeWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => RigidBody_KinematicModeWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => RigidBody_KinematicModeWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => RigidBody_KinematicModeWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976199_RigidBodies_LinearDampingObjectMotion/C4976199_RigidBodies_LinearDampingObjectMotion.ly => RigidBody_LinearDampingAffectsMotion/RigidBody_LinearDampingAffectsMotion.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => RigidBody_LinearDampingAffectsMotion}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C4976200_RigidBody_AngularDampingObjectRotation => RigidBody_LinearDampingAffectsMotion}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => RigidBody_LinearDampingAffectsMotion}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => RigidBody_LinearDampingAffectsMotion}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => RigidBody_LinearDampingAffectsMotion}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => RigidBody_LinearDampingAffectsMotion}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => RigidBody_LinearDampingAffectsMotion}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => RigidBody_LinearDampingAffectsMotion}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => RigidBody_LinearDampingAffectsMotion}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned/C4976201_RigidBody_MassIsAssigned.ly => RigidBody_MassDifferentValuesWorks/RigidBody_MassDifferentValuesWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => RigidBody_MassDifferentValuesWorks}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976201_RigidBody_MassIsAssigned => RigidBody_MassDifferentValuesWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => RigidBody_MassDifferentValuesWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C4982798_Collider_ColliderRotationOffset => RigidBody_MassDifferentValuesWorks}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => RigidBody_MassDifferentValuesWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => RigidBody_MassDifferentValuesWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => RigidBody_MassDifferentValuesWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => RigidBody_MassDifferentValuesWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => RigidBody_MassDifferentValuesWorks}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => RigidBody_MassDifferentValuesWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => RigidBody_MaxAngularVelocityWorks}/Layers/damping_bars_and_triggers.layer (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => RigidBody_MaxAngularVelocityWorks}/Layers/no_damping_bars.layer (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity/C13352089_RigidBodies_MaxAngularVelocity.ly => RigidBody_MaxAngularVelocityWorks/RigidBody_MaxAngularVelocityWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => RigidBody_MaxAngularVelocityWorks}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C13352089_RigidBodies_MaxAngularVelocity => RigidBody_MaxAngularVelocityWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => RigidBody_MaxAngularVelocityWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => RigidBody_MaxAngularVelocityWorks}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => RigidBody_MaxAngularVelocityWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => RigidBody_MaxAngularVelocityWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => RigidBody_MaxAngularVelocityWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => RigidBody_MaxAngularVelocityWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => RigidBody_MaxAngularVelocityWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia/C5340400_RigidBody_ManualMomentOfInertia.ly => RigidBody_MomentOfInertiaManualSetting/RigidBody_MomentOfInertiaManualSetting.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => RigidBody_MomentOfInertiaManualSetting}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => RigidBody_MomentOfInertiaManualSetting}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => RigidBody_MomentOfInertiaManualSetting}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => RigidBody_MomentOfInertiaManualSetting}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510644_Collider_CollisionGroups => RigidBody_MomentOfInertiaManualSetting}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => RigidBody_MomentOfInertiaManualSetting}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => RigidBody_MomentOfInertiaManualSetting}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => RigidBody_MomentOfInertiaManualSetting}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => RigidBody_MomentOfInertiaManualSetting}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks/C14976307_Gravity_SetGravityWorks.ly => RigidBody_SetGravityWorks/RigidBody_SetGravityWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => RigidBody_SetGravityWorks}/filelist.xml (73%) rename AutomatedTesting/Levels/Physics/{C14976307_Gravity_SetGravityWorks => RigidBody_SetGravityWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932040_ForceRegion_CubeExertsWorldForce => RigidBody_SetGravityWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_SetGravityWorks}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976244_Collider_SameGroupSameLayerCollision => RigidBody_SetGravityWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => RigidBody_SetGravityWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => RigidBody_SetGravityWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => RigidBody_SetGravityWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976242_Collision_SameCollisionlayerSameCollisiongroup => RigidBody_SetGravityWorks}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => RigidBody_SetGravityWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold/C4976202_RigidBody_StopsWhenBelowKineticThreshold.ly => RigidBody_SleepWhenBelowKineticThreshold/RigidBody_SleepWhenBelowKineticThreshold.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => RigidBody_SleepWhenBelowKineticThreshold}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976202_RigidBody_StopsWhenBelowKineticThreshold => RigidBody_SleepWhenBelowKineticThreshold}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => RigidBody_SleepWhenBelowKineticThreshold}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => RigidBody_SleepWhenBelowKineticThreshold}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => RigidBody_SleepWhenBelowKineticThreshold}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies => RigidBody_SleepWhenBelowKineticThreshold}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => RigidBody_SleepWhenBelowKineticThreshold}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => RigidBody_SleepWhenBelowKineticThreshold}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => RigidBody_SleepWhenBelowKineticThreshold}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => RigidBody_SleepWhenBelowKineticThreshold}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition/C4976204_Verify_Start_Asleep_Condition.ly => RigidBody_StartAsleepWorks/RigidBody_StartAsleepWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => RigidBody_StartAsleepWorks}/filelist.xml (72%) rename AutomatedTesting/Levels/Physics/{C4976204_Verify_Start_Asleep_Condition => RigidBody_StartAsleepWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => RigidBody_StartAsleepWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => RigidBody_StartAsleepWorks}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5296614_PhysXMaterial_ColliderShape => RigidBody_StartAsleepWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932042_PhysxForceRegion_LinearDamping => RigidBody_StartAsleepWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => RigidBody_StartAsleepWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => RigidBody_StartAsleepWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C4976243_Collision_SameCollisionGroupDiffCollisionLayers => RigidBody_StartAsleepWorks}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => RigidBody_StartAsleepWorks}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity/C4976206_RigidBodies_VerifyGravity.ly => RigidBody_StartGravityEnabledWorks/RigidBody_StartGravityEnabledWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => RigidBody_StartGravityEnabledWorks}/filelist.xml (73%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => RigidBody_StartGravityEnabledWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => RigidBody_StartGravityEnabledWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_StartGravityEnabledWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976206_RigidBodies_VerifyGravity => RigidBody_StartGravityEnabledWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => RigidBody_StartGravityEnabledWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => RigidBody_StartGravityEnabledWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689517_Verify_Terrain_Component => RigidBody_StartGravityEnabledWorks}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => RigidBody_StartGravityEnabledWorks}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => ScriptCanvas_CollisionEvents}/filelist.xml (71%) rename AutomatedTesting/Levels/Physics/{C12712452_ScriptCanvas_CollisionEvents => ScriptCanvas_CollisionEvents}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => ScriptCanvas_CollisionEvents}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => ScriptCanvas_CollisionEvents}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ScriptCanvas_CollisionEvents}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C4976245_PhysxCollider_CollisionLayerTest => ScriptCanvas_CollisionEvents}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ScriptCanvas_CollisionEvents}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => ScriptCanvas_CollisionEvents}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => ScriptCanvas_CollisionEvents}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ScriptCanvas_CollisionEvents}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C19536274_NameNode_Prints/C19536274_NameNode_Prints.ly => ScriptCanvas_GetCollisionName/ScriptCanvas_GetCollisionName.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/Raycast.scriptcanvas (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/Raycast_2.scriptcanvas (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/ScriptCanvas.png (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode/C12712453_ScriptCanvas_MultipleRaycastNode.ly => ScriptCanvas_MultipleRaycastNode/ScriptCanvas_MultipleRaycastNode.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/VisualDocumentation/RayCast_level_no_tunnel.PNG (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/VisualDocumentation/RayCast_level_tunnel.PNG (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/VisualDocumentation/RayCast_level_tunnel_mouth.PNG (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/VisualDocumentation/ScriptCanvas.PNG (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C12712453_ScriptCanvas_MultipleRaycastNode => ScriptCanvas_MultipleRaycastNode}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => ScriptCanvas_MultipleRaycastNode}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => ScriptCanvas_MultipleRaycastNode}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => ScriptCanvas_MultipleRaycastNode}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932043_ForceRegion_SimpleDragOnRigidBody => ScriptCanvas_MultipleRaycastNode}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ScriptCanvas_MultipleRaycastNode}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ScriptCanvas_MultipleRaycastNode}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ScriptCanvas_MultipleRaycastNode}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification/C12712454_ScriptCanvas_OverlapNodeVerification.ly => ScriptCanvas_OverlapNode/ScriptCanvas_OverlapNode.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => ScriptCanvas_OverlapNode}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C12712454_ScriptCanvas_OverlapNodeVerification => ScriptCanvas_OverlapNode}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => ScriptCanvas_OverlapNode}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => ScriptCanvas_OverlapNode}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => ScriptCanvas_OverlapNode}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932044_PhysX_ForceRegion_PointForceOnRigidBodies => ScriptCanvas_OverlapNode}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ScriptCanvas_OverlapNode}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ScriptCanvas_OverlapNode}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ScriptCanvas_OverlapNode}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/ScriptCanvas_PostPhysicsUpdate.ly rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ScriptCanvas_PostPhysicsUpdate}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ScriptCanvas_PostPhysicsUpdate}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ScriptCanvas_PostPhysicsUpdate}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => ScriptCanvas_PostPhysicsUpdate}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => ScriptCanvas_PostPhysicsUpdate}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5932045_ForceRegion_Spline => ScriptCanvas_PostPhysicsUpdate}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ScriptCanvas_PostPhysicsUpdate}/leveldata/VegetationMap.dat (100%) create mode 100644 AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas rename AutomatedTesting/Levels/Physics/{C14902098_ScriptCanvas_PostPhysicsUpdate => ScriptCanvas_PostPhysicsUpdate}/ontick.scriptcanvas (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ScriptCanvas_PostPhysicsUpdate}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ScriptCanvas_PostPhysicsUpdate}/terraintexture.pak (100%) create mode 100644 AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/ScriptCanvas_PostUpdateEvent.ly rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ScriptCanvas_PostUpdateEvent}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C14195074_ScriptCanvas_PostUpdateEvent => ScriptCanvas_PostUpdateEvent}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ScriptCanvas_PostUpdateEvent}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ScriptCanvas_PostUpdateEvent}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => ScriptCanvas_PostUpdateEvent}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => ScriptCanvas_PostUpdateEvent}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ScriptCanvas_PostUpdateEvent}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ScriptCanvas_PostUpdateEvent}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ScriptCanvas_PostUpdateEvent}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent/C14902097_ScriptCanvas_PreUpdateEvent.ly => ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly} (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ScriptCanvas_PreUpdateEvent}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C14902097_ScriptCanvas_PreUpdateEvent => ScriptCanvas_PreUpdateEvent}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => ScriptCanvas_PreUpdateEvent}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ScriptCanvas_PreUpdateEvent}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => ScriptCanvas_PreUpdateEvent}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => ScriptCanvas_PreUpdateEvent}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ScriptCanvas_PreUpdateEvent}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ScriptCanvas_PreUpdateEvent}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ScriptCanvas_PreUpdateEvent}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform/C14976308_ScriptCanvas_SetKinematicTargetTransform.ly => ScriptCanvas_SetKinematicTargetTransform/ScriptCanvas_SetKinematicTargetTransform.ly} (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ScriptCanvas_SetKinematicTargetTransform}/Signal.scriptcanvas (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ScriptCanvas_SetKinematicTargetTransform}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C14976308_ScriptCanvas_SetKinematicTargetTransform => ScriptCanvas_SetKinematicTargetTransform}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => ScriptCanvas_SetKinematicTargetTransform}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ScriptCanvas_SetKinematicTargetTransform}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => ScriptCanvas_SetKinematicTargetTransform}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959761_ForceRegion_ExertsPointForce_Sedan => ScriptCanvas_SetKinematicTargetTransform}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ScriptCanvas_SetKinematicTargetTransform}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ScriptCanvas_SetKinematicTargetTransform}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ScriptCanvas_SetKinematicTargetTransform}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly => ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly} (100%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => ScriptCanvas_ShapeCast}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C12712455_ScriptCanvas_ShapeCastVerification => ScriptCanvas_ShapeCast}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => ScriptCanvas_ShapeCast}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => ScriptCanvas_ShapeCast}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => ScriptCanvas_ShapeCast}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5340400_RigidBody_ManualMomentOfInertia => ScriptCanvas_ShapeCast}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ScriptCanvas_ShapeCast}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ScriptCanvas_ShapeCast}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => ScriptCanvas_ShapeCast}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6224408_ScriptCanvas_EntitySpawn => ScriptCanvas_SpawnEntityWithPhysComponents}/Ball_0.slice (100%) rename AutomatedTesting/Levels/Physics/{C6224408_ScriptCanvas_EntitySpawn/C6224408_ScriptCanvas_EntitySpawn.ly => ScriptCanvas_SpawnEntityWithPhysComponents/ScriptCanvas_SpawnEntityWithPhysComponents.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6224408_ScriptCanvas_EntitySpawn => ScriptCanvas_SpawnEntityWithPhysComponents}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C6224408_ScriptCanvas_EntitySpawn => ScriptCanvas_SpawnEntityWithPhysComponents}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => ScriptCanvas_SpawnEntityWithPhysComponents}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => ScriptCanvas_SpawnEntityWithPhysComponents}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => ScriptCanvas_SpawnEntityWithPhysComponents}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6224408_ScriptCanvas_EntitySpawn => ScriptCanvas_SpawnEntityWithPhysComponents}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => ScriptCanvas_SpawnEntityWithPhysComponents}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ScriptCanvas_SpawnEntityWithPhysComponents}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => ScriptCanvas_SpawnEntityWithPhysComponents}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => ScriptCanvas_SpawnEntityWithPhysComponents}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6274125_ScriptCanvas_TriggerEvents/C6274125_ScriptCanvas_TriggerEvents.ly => ScriptCanvas_TriggerEvents/ScriptCanvas_TriggerEvents.ly} (100%) rename AutomatedTesting/Levels/Physics/{C6274125_ScriptCanvas_TriggerEvents => ScriptCanvas_TriggerEvents}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6274125_ScriptCanvas_TriggerEvents => ScriptCanvas_TriggerEvents}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => ScriptCanvas_TriggerEvents}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => ScriptCanvas_TriggerEvents}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => ScriptCanvas_TriggerEvents}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959763_ForceRegion_ForceRegionImpulsesCube => ScriptCanvas_TriggerEvents}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => ScriptCanvas_TriggerEvents}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => ScriptCanvas_TriggerEvents}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => ScriptCanvas_TriggerEvents}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.ly => ShapeCollider_CylinderShapeCollides/ShapeCollider_CylinderShapeCollides.ly} (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => ShapeCollider_CylinderShapeCollides}/filelist.xml (67%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => ShapeCollider_CylinderShapeCollides}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => ShapeCollider_CylinderShapeCollides}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => ShapeCollider_CylinderShapeCollides}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => ShapeCollider_CylinderShapeCollides}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => ShapeCollider_CylinderShapeCollides}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => ShapeCollider_CylinderShapeCollides}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => ShapeCollider_CylinderShapeCollides}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain => ShapeCollider_CylinderShapeCollides}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => ShapeCollider_CylinderShapeCollides}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.ly => Terrain_AddPhysTerrainComponent/Terrain_AddPhysTerrainComponent.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => Terrain_AddPhysTerrainComponent}/filelist.xml (68%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => Terrain_AddPhysTerrainComponent}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => Terrain_AddPhysTerrainComponent}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_AddPhysTerrainComponent}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959759_RigidBody_ForceRegionSpherePointForce => Terrain_AddPhysTerrainComponent}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959764_ForceRegion_ForceRegionImpulsesCapsule => Terrain_AddPhysTerrainComponent}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_AddPhysTerrainComponent}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => Terrain_AddPhysTerrainComponent}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689521_Terrain_NoCollisionAfterTerrainDeletion => Terrain_AddPhysTerrainComponent}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_AddPhysTerrainComponent}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole/C5689524_MultipleTerrains_CheckWarningInConsole.ly => Terrain_CanAddMultipleTerrainComponents/Terrain_CanAddMultipleTerrainComponents.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => Terrain_CanAddMultipleTerrainComponents}/filelist.xml (69%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => Terrain_CanAddMultipleTerrainComponents}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => Terrain_CanAddMultipleTerrainComponents}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => Terrain_CanAddMultipleTerrainComponents}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959760_PhysxForceRegion_PointForceExertion => Terrain_CanAddMultipleTerrainComponents}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959765_ForceRegion_AssetGetsImpulsed => Terrain_CanAddMultipleTerrainComponents}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_CanAddMultipleTerrainComponents}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_CanAddMultipleTerrainComponents}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689522_Physxterrain_AddPhysxterrainNoEditorCrash => Terrain_CanAddMultipleTerrainComponents}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => Terrain_CanAddMultipleTerrainComponents}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => Terrain_CollisionAgainstRigidBody}/PhysXEntity_collides_with_PhysXTerrain.ly (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain/C5689518_PhysXEntity_collides_with_PhysXTerrain.ly => Terrain_CollisionAgainstRigidBody/Terrain_CollisionAgainstRigidBody.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => Terrain_CollisionAgainstRigidBody}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C5689518_PhysXEntity_collides_with_PhysXTerrain => Terrain_CollisionAgainstRigidBody}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => Terrain_CollisionAgainstRigidBody}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => Terrain_CollisionAgainstRigidBody}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959808_ForceRegion_PositionOffset => Terrain_CollisionAgainstRigidBody}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => Terrain_CollisionAgainstRigidBody}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_CollisionAgainstRigidBody}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689524_MultipleTerrains_CheckWarningInConsole => Terrain_CollisionAgainstRigidBody}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => Terrain_CollisionAgainstRigidBody}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => Terrain_MultipleResolutionsValid/1024x1024_32m}/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m.ly (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => Terrain_MultipleResolutionsValid/1024x1024_32m}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => Terrain_MultipleResolutionsValid/1024x1024_32m}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_MultipleResolutionsValid/1024x1024_32m}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => Terrain_MultipleResolutionsValid/1024x1024_32m}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => Terrain_MultipleResolutionsValid/1024x1024_32m}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959809_ForceRegion_RotationalOffset => Terrain_MultipleResolutionsValid/1024x1024_32m}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => Terrain_MultipleResolutionsValid/1024x1024_32m}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => Terrain_MultipleResolutionsValid/1024x1024_32m}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => Terrain_MultipleResolutionsValid/1024x1024_32m}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => Terrain_MultipleResolutionsValid/1024x1024_32m}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => Terrain_MultipleResolutionsValid/128x128_1m}/C6032082_Terrain_MultipleResolutionsValid_128x128_1m.ly (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => Terrain_MultipleResolutionsValid/128x128_1m}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => Terrain_MultipleResolutionsValid/128x128_1m}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_MultipleResolutionsValid/128x128_1m}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => Terrain_MultipleResolutionsValid/128x128_1m}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => Terrain_MultipleResolutionsValid/128x128_1m}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5959810_ForceRegion_ForceRegionCombinesForces => Terrain_MultipleResolutionsValid/128x128_1m}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => Terrain_MultipleResolutionsValid/128x128_1m}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => Terrain_MultipleResolutionsValid/128x128_1m}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => Terrain_MultipleResolutionsValid/128x128_1m}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => Terrain_MultipleResolutionsValid/128x128_1m}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_MultipleResolutionsValid/4096x4096_16m}/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m.ly (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_MultipleResolutionsValid/4096x4096_16m}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_MultipleResolutionsValid/4096x4096_16m}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => Terrain_MultipleResolutionsValid/4096x4096_16m}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => Terrain_MultipleResolutionsValid/4096x4096_16m}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_MultipleResolutionsValid/4096x4096_16m}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody => Terrain_MultipleResolutionsValid/4096x4096_16m}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => Terrain_MultipleResolutionsValid/4096x4096_16m}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => Terrain_MultipleResolutionsValid/4096x4096_16m}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_MultipleResolutionsValid/4096x4096_16m}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Terrain_MultipleResolutionsValid/4096x4096_16m}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_MultipleResolutionsValid/512x512_2m}/C6032082_Terrain_MultipleResolutionsValid_512x512_2m.ly (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_MultipleResolutionsValid/512x512_2m}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_MultipleResolutionsValid/512x512_2m}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090547_ForceRegion_ParentChildForceRegions => Terrain_MultipleResolutionsValid/512x512_2m}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Terrain_MultipleResolutionsValid/512x512_2m}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => Terrain_MultipleResolutionsValid/512x512_2m}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C5968760_ForceRegion_CheckNetForceChange => Terrain_MultipleResolutionsValid/512x512_2m}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Terrain_MultipleResolutionsValid/512x512_2m}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => Terrain_MultipleResolutionsValid/512x512_2m}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_MultipleResolutionsValid/512x512_2m}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => Terrain_MultipleResolutionsValid/512x512_2m}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents/C5689528_Terrain_MultipleTerrainComponents.ly => Terrain_MultipleTerrainComponentsWarning/Terrain_MultipleTerrainComponentsWarning.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => Terrain_MultipleTerrainComponentsWarning}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C5689528_Terrain_MultipleTerrainComponents => Terrain_MultipleTerrainComponentsWarning}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090550_ForceRegion_WorldSpaceForceNegative => Terrain_MultipleTerrainComponentsWarning}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => Terrain_MultipleTerrainComponentsWarning}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_MultipleTerrainComponentsWarning}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m => Terrain_MultipleTerrainComponentsWarning}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => Terrain_MultipleTerrainComponentsWarning}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Terrain_MultipleTerrainComponentsWarning}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689529_Verify_Terrain_RigidBody_Collider_Mesh => Terrain_MultipleTerrainComponentsWarning}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => Terrain_MultipleTerrainComponentsWarning}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain/C3510642_Terrain_NotCollideWithTerrain.ly => Terrain_NoPhysTerrainComponentNoCollision/Terrain_NoPhysTerrainComponentNoCollision.ly} (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Terrain_NoPhysTerrainComponentNoCollision}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C3510642_Terrain_NotCollideWithTerrain => Terrain_NoPhysTerrainComponentNoCollision}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090551_ForceRegion_LocalSpaceForceNegative => Terrain_NoPhysTerrainComponentNoCollision}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => Terrain_NoPhysTerrainComponentNoCollision}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Terrain_NoPhysTerrainComponentNoCollision}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_128x128_1m => Terrain_NoPhysTerrainComponentNoCollision}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => Terrain_NoPhysTerrainComponentNoCollision}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => Terrain_NoPhysTerrainComponentNoCollision}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C6131473_StaticSlice_OnDynamicSliceSpawn => Terrain_NoPhysTerrainComponentNoCollision}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => Terrain_SpawnSecondTerrainComponentWarning}/TerrainSlice.slice (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent/C5689531_Warning_TerrainSliceTerrainComponent.ly => Terrain_SpawnSecondTerrainComponentWarning/Terrain_SpawnSecondTerrainComponentWarning.ly} (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => Terrain_SpawnSecondTerrainComponentWarning}/filelist.xml (70%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => Terrain_SpawnSecondTerrainComponentWarning}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090552_ForceRegion_LinearDampingNegative => Terrain_SpawnSecondTerrainComponentWarning}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => Terrain_SpawnSecondTerrainComponentWarning}/leveldata/GameTokens.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090546_ForceRegion_SliceFileInstantiates => Terrain_SpawnSecondTerrainComponentWarning}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m => Terrain_SpawnSecondTerrainComponentWarning}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => Terrain_SpawnSecondTerrainComponentWarning}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => Terrain_SpawnSecondTerrainComponentWarning}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C5689531_Warning_TerrainSliceTerrainComponent => Terrain_SpawnSecondTerrainComponentWarning}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C6224408_ScriptCanvas_EntitySpawn => Terrain_SpawnSecondTerrainComponentWarning}/terraintexture.pak (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks/C13508019_Terrain_TerrainTexturePainterWorks.ly => Terrain_TerrainTexturePainterWorks/Terrain_TerrainTexturePainterWorks.ly} (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Terrain_TerrainTexturePainterWorks}/filelist.xml (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Terrain_TerrainTexturePainterWorks}/level.pak (100%) rename AutomatedTesting/Levels/Physics/{C6090553_ForceRegion_SimpleDragForceOnRigidBodies => Terrain_TerrainTexturePainterWorks}/leveldata/Environment.xml (100%) rename AutomatedTesting/Levels/Physics/{C6090554_ForceRegion_PointForceNegative => Terrain_TerrainTexturePainterWorks}/leveldata/TerrainTexture.xml (100%) rename AutomatedTesting/Levels/Physics/{C6032082_Terrain_MultipleResolutionsValid_512x512_2m => Terrain_TerrainTexturePainterWorks}/leveldata/TimeOfDay.xml (100%) rename AutomatedTesting/Levels/Physics/{C6131473_StaticSlice_OnDynamicSliceSpawn => Terrain_TerrainTexturePainterWorks}/leveldata/VegetationMap.dat (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Terrain_TerrainTexturePainterWorks}/material/levelmaterial.physmaterial (100%) rename AutomatedTesting/Levels/Physics/{C6090555_ForceRegion_SplineFollowOnRigidBodies => Terrain_TerrainTexturePainterWorks}/tags.txt (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Terrain_TerrainTexturePainterWorks}/terrain/terrain.pxheightfield (100%) rename AutomatedTesting/Levels/Physics/{C13508019_Terrain_TerrainTexturePainterWorks => Terrain_TerrainTexturePainterWorks}/terraintexture.pak (100%) diff --git a/AutomatedTesting/Levels/Base/Base.ly b/AutomatedTesting/Levels/Base/Base.ly new file mode 100644 index 0000000000..8ce19923c0 --- /dev/null +++ b/AutomatedTesting/Levels/Base/Base.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4937547ca4c486ef59656314401933217e0e0401fec103e1fb91c25ec60a177 +size 2806 diff --git a/AutomatedTesting/Levels/Base/filelist.xml b/AutomatedTesting/Levels/Base/filelist.xml new file mode 100644 index 0000000000..77579ae1a8 --- /dev/null +++ b/AutomatedTesting/Levels/Base/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Base/level.pak b/AutomatedTesting/Levels/Base/level.pak new file mode 100644 index 0000000000..bf7c8b2472 --- /dev/null +++ b/AutomatedTesting/Levels/Base/level.pak @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68c34c55693d92085e81388cac48729aa569948254843d1d74f0d6a66d3b4dff +size 39328 diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/tags.txt b/AutomatedTesting/Levels/Base/tags.txt similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/tags.txt rename to AutomatedTesting/Levels/Base/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terraintexture.pak b/AutomatedTesting/Levels/Base/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terraintexture.pak rename to AutomatedTesting/Levels/Base/terraintexture.pak diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/Environment.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/Environment.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/Environment.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/TerrainTexture.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/TerrainTexture.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/TimeOfDay.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/TimeOfDay.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/VegetationMap.dat b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/LevelData/VegetationMap.dat rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/LevelData/VegetationMap.dat diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/NvCloth_AddClothSimulationToActor.ly similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/C18977330_NvCloth_AddClothSimulationToActor.ly rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/NvCloth_AddClothSimulationToActor.ly diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/TerrainTexture.pak b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/TerrainTexture.pak similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/TerrainTexture.pak rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/TerrainTexture.pak diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/filelist.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/filelist.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/level.pak similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/level.pak rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/level.pak diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/tags.txt b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/tags.txt similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/tags.txt rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToActor/tags.txt diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/Environment.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/Environment.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/Environment.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/TerrainTexture.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/TerrainTexture.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/TimeOfDay.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/TimeOfDay.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/VegetationMap.dat b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/LevelData/VegetationMap.dat rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/LevelData/VegetationMap.dat diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/NvCloth_AddClothSimulationToMesh.ly similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/C18977329_NvCloth_AddClothSimulationToMesh.ly rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/NvCloth_AddClothSimulationToMesh.ly diff --git a/AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/TerrainTexture.pak b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/TerrainTexture.pak similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977330_NvCloth_AddClothSimulationToActor/TerrainTexture.pak rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/TerrainTexture.pak diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/filelist.xml rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/filelist.xml diff --git a/AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/level.pak similarity index 100% rename from AutomatedTesting/Levels/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh/level.pak rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/tags.txt b/AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/tags.txt rename to AutomatedTesting/Levels/NvCloth/NvCloth_AddClothSimulationToMesh/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly deleted file mode 100644 index fc576ec459..0000000000 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/C12712452_ScriptCanvas_CollisionEvents.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e04b536d187793187b64a55914d92c1a1c18393a0369715269a295c7b7a7d370 -size 8883 diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas deleted file mode 100644 index 34e80f3ccd..0000000000 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas +++ /dev/null @@ -1,7714 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/C14195074_ScriptCanvas_PostUpdateEvent.ly b/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/C14195074_ScriptCanvas_PostUpdateEvent.ly deleted file mode 100644 index 6cd2635f29..0000000000 --- a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/C14195074_ScriptCanvas_PostUpdateEvent.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ecfac85ec0f2cc12d154474be63771ef6704915a8aeb740f5639dbf04fde6df -size 6722 diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/C14654881_CharacterController_SwitchLevelsEmpty.ly b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/C14654881_CharacterController_SwitchLevelsEmpty.ly deleted file mode 100644 index 0b3fc3ccd1..0000000000 --- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/C14654881_CharacterController_SwitchLevelsEmpty.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d4de9e57b01476be84077f126a13fa0bfce18283453d1c69a857c10926c13ae -size 4728 diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/filelist.xml b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/filelist.xml deleted file mode 100644 index 1ba3f96e8d..0000000000 --- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/level.pak b/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/level.pak deleted file mode 100644 index eec9bb3395..0000000000 --- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/level.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f04bc665df6d8d2a29635a7e7054977a4f53e931c7c8bc678c4c378b49bb5ca1 -size 39214 diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/C14902098_ScriptCanvas_PostPhysicsUpdate.ly b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/C14902098_ScriptCanvas_PostPhysicsUpdate.ly deleted file mode 100644 index 549f7a9cfc..0000000000 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/C14902098_ScriptCanvas_PostPhysicsUpdate.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd9a957fd13de9b9029d6ccb81bb2519dfa6381107f9f3015c4999b8c0bd3c36 -size 7801 diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas b/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas deleted file mode 100644 index 10c40fbb9f..0000000000 --- a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas +++ /dev/null @@ -1,3518 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial b/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial deleted file mode 100644 index 95b6587d2a..0000000000 --- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial b/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial deleted file mode 100644 index 95b6587d2a..0000000000 --- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/c15096732_material_defaultlibraryupdatedacrosslevels.physmaterial +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_after.physxconfiguration b/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_after.physxconfiguration deleted file mode 100644 index 9ae2276c44..0000000000 --- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_after.physxconfiguration +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_before.physxconfiguration b/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_before.physxconfiguration deleted file mode 100644 index f8cfe32b2d..0000000000 --- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/Material_DefaultLibraryUpdatedAcrossLevels_before.physxconfiguration +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/C15308217_NoCrash_LevelSwitchWithOutTerrain.ly b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/C15308217_NoCrash_LevelSwitchWithOutTerrain.ly deleted file mode 100644 index 0edc9a8b33..0000000000 --- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/C15308217_NoCrash_LevelSwitchWithOutTerrain.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee0b19bcef5abd9af9d8ef1acba2fa33bb1a69e402f9a6e5e5732fb8cf3cb4f5 -size 2563 diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/filelist.xml deleted file mode 100644 index b4697568be..0000000000 --- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/level.pak b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/level.pak deleted file mode 100644 index 2baa6ab97d..0000000000 --- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/level.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f54e18cd15777994163323a57b3328cb8b8ebb50a2b50476c23d93b66315de54 -size 39205 diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/C15308217_NoCrash_LevelSwitchWithTerrain.ly b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/C15308217_NoCrash_LevelSwitchWithTerrain.ly deleted file mode 100644 index d6c9296864..0000000000 --- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/C15308217_NoCrash_LevelSwitchWithTerrain.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:792969360ad9f659677a0a1823b4422873d5b108468e2e005ba1c90c2b1b09f6 -size 4154 diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/filelist.xml deleted file mode 100644 index 94288572dd..0000000000 --- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/level.pak b/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/level.pak deleted file mode 100644 index df1811f3b3..0000000000 --- a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/level.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1304d7445c9155856a172df7d1eb73010929d3d5ebe9c2aed62d01fd64d8e37a -size 39202 diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/filelist.xml b/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/filelist.xml b/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/filelist.xml b/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/filelist.xml b/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/filelist.xml deleted file mode 100644 index fa5a7aa319..0000000000 --- a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/C4976209_RigidBody_ComputesCOM.ly b/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/C4976209_RigidBody_ComputesCOM.ly deleted file mode 100644 index 139a9f140c..0000000000 --- a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/C4976209_RigidBody_ComputesCOM.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b26b3e991559a946341e4eedb2266605631c8d72e69e745a352f02df998149f -size 9186 diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/C5689517_Verify_Terrain_Component.ly b/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/C5689517_Verify_Terrain_Component.ly deleted file mode 100644 index 9135161123..0000000000 --- a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/C5689517_Verify_Terrain_Component.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8f6e912b2bbc729aded88e1a68b41abef31031452cb7d016f8ca3a44503e1fb -size 6577 diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/filelist.xml b/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/filelist.xml deleted file mode 100644 index 760b180f23..0000000000 --- a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/level.pak b/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/level.pak deleted file mode 100644 index f682a8b0c8..0000000000 --- a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/level.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30e921bc7223f69cf0d8f06eb693753e3ddf32d9b24987571e441a906c482d84 -size 39329 diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/C5689521_Terrain_NoCollisionAfterTerrainDeletion.ly b/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/C5689521_Terrain_NoCollisionAfterTerrainDeletion.ly deleted file mode 100644 index 9f2a939ce5..0000000000 --- a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/C5689521_Terrain_NoCollisionAfterTerrainDeletion.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e0cbe3d70fe2071c2c63d37e62669d840ecc746ac82380bef7d5ef19d8390ce -size 8046 diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/filelist.xml b/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/filelist.xml deleted file mode 100644 index cdfa1c985f..0000000000 --- a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/filelist.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/level.pak b/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/level.pak deleted file mode 100644 index 4a9becf656..0000000000 --- a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/level.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14632009332c08eb5b047d00bf217a6638d2b823a0c2bd649e09408e8efac259 -size 39339 diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/C5959761_ForceRegion_ExertsPointForce_Sedan.ly b/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/C5959761_ForceRegion_ExertsPointForce_Sedan.ly deleted file mode 100644 index 4746c3cdcf..0000000000 --- a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/C5959761_ForceRegion_ExertsPointForce_Sedan.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9099733f59504200cf87fd81011ee8be8bcfd87cc8dbe243e998fb27410b76b -size 6837 diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/C5959765_ForceRegion_AssetGetsImpulsed.ly b/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/C5959765_ForceRegion_AssetGetsImpulsed.ly deleted file mode 100644 index 092eba62fd..0000000000 --- a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/C5959765_ForceRegion_AssetGetsImpulsed.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a637035bdc27e72e2bc23877bfd1b25cbf465a71b8550001151a6b50ebc938c5 -size 8301 diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/terrain.pxheightfield deleted file mode 100644 index 011356e521..0000000000 --- a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terrain/terrain.pxheightfield +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19096597087688692a225c1955f73d22c46354995fca1df8dff107a90c2f17a2 -size 4202594 diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/C6090546_ForceRegion_SliceFileInstantiates.ly b/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/C6090546_ForceRegion_SliceFileInstantiates.ly deleted file mode 100644 index 11018eb2b6..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/C6090546_ForceRegion_SliceFileInstantiates.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d6312f502e196f7ceb1ff05b367899c5486b2737b1a5ccfe3f3d52158e285a7 -size 7422 diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/TimeOfDay.xml deleted file mode 100644 index 456d609b8a..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/TimeOfDay.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/TimeOfDay.xml deleted file mode 100644 index 456d609b8a..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/TimeOfDay.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/C6090550_ForceRegion_WorldSpaceForceNegative.ly b/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/C6090550_ForceRegion_WorldSpaceForceNegative.ly deleted file mode 100644 index 9eaca61d70..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/C6090550_ForceRegion_WorldSpaceForceNegative.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa225a10dfeea4fa4bb26e3d6eb4a91eed238b1a30acbef8185de8c49dd844a6 -size 9106 diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/C6090551_ForceRegion_LocalSpaceForceNegative.ly b/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/C6090551_ForceRegion_LocalSpaceForceNegative.ly deleted file mode 100644 index f090a65567..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/C6090551_ForceRegion_LocalSpaceForceNegative.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fba6401bc99e46f91da893a663347f1f7f7da5dd5af2daabfac8b82316c87dd9 -size 9069 diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TerrainTexture.xml deleted file mode 100644 index f43df05b22..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TerrainTexture.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/C6090554_ForceRegion_PointForceNegative.ly b/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/C6090554_ForceRegion_PointForceNegative.ly deleted file mode 100644 index b5cccb335c..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/C6090554_ForceRegion_PointForceNegative.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f01447f5be2a4f9c56cfbb2841e2bf51e37cf8e8a3c507e46b74f5a80bc45955 -size 9146 diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Environment.xml deleted file mode 100644 index 4ba36f66ae..0000000000 --- a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/Environment.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/C6131473_StaticSlice_OnDynamicSliceSpawn.ly b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/C6131473_StaticSlice_OnDynamicSliceSpawn.ly deleted file mode 100644 index d2402bdb7f..0000000000 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/C6131473_StaticSlice_OnDynamicSliceSpawn.ly +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f72e154357625639ab2eceebea4a5cc43cbbae6c609909c7f2c10c3892ff9ee -size 3843 diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Environment.xml deleted file mode 100644 index 4ba36f66ae..0000000000 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/Environment.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/GameTokens.xml deleted file mode 100644 index 668a4583bd..0000000000 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/GameTokens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TerrainTexture.xml deleted file mode 100644 index f43df05b22..0000000000 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TerrainTexture.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TimeOfDay.xml deleted file mode 100644 index 456d609b8a..0000000000 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/TimeOfDay.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/tags.txt b/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/tags.txt deleted file mode 100644 index 0d6c1880e7..0000000000 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/tags.txt +++ /dev/null @@ -1,12 +0,0 @@ -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Environment.xml deleted file mode 100644 index 4ba36f66ae..0000000000 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/Environment.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/GameTokens.xml deleted file mode 100644 index 668a4583bd..0000000000 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/GameTokens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/TerrainTexture.xml deleted file mode 100644 index f43df05b22..0000000000 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/TerrainTexture.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/VegetationMap.dat deleted file mode 100644 index dce5631cd0..0000000000 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/VegetationMap.dat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e6a5435c928079b27796f6b202bbc2623e7e454244ddc099a3cadf33b7cb9e9 -size 63 diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/tags.txt b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/tags.txt deleted file mode 100644 index 0d6c1880e7..0000000000 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/tags.txt +++ /dev/null @@ -1,12 +0,0 @@ -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/terrain.pxheightfield deleted file mode 100644 index 011356e521..0000000000 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terrain/terrain.pxheightfield +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19096597087688692a225c1955f73d22c46354995fca1df8dff107a90c2f17a2 -size 4202594 diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Environment.xml deleted file mode 100644 index 4ba36f66ae..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/Environment.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/GameTokens.xml deleted file mode 100644 index 668a4583bd..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/GameTokens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TerrainTexture.xml deleted file mode 100644 index f43df05b22..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TerrainTexture.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TimeOfDay.xml deleted file mode 100644 index 456d609b8a..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/TimeOfDay.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/VegetationMap.dat deleted file mode 100644 index dce5631cd0..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/leveldata/VegetationMap.dat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e6a5435c928079b27796f6b202bbc2623e7e454244ddc099a3cadf33b7cb9e9 -size 63 diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/tags.txt b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/tags.txt deleted file mode 100644 index 0d6c1880e7..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/tags.txt +++ /dev/null @@ -1,12 +0,0 @@ -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terraintexture.pak b/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terraintexture.pak deleted file mode 100644 index fe3604a050..0000000000 --- a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/terraintexture.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85 -size 22 diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Environment.xml deleted file mode 100644 index 4ba36f66ae..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/Environment.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/GameTokens.xml deleted file mode 100644 index 668a4583bd..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/GameTokens.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TerrainTexture.xml deleted file mode 100644 index f43df05b22..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TerrainTexture.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TimeOfDay.xml deleted file mode 100644 index 456d609b8a..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/TimeOfDay.xml +++ /dev/null @@ -1,356 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/VegetationMap.dat deleted file mode 100644 index dce5631cd0..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/leveldata/VegetationMap.dat +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e6a5435c928079b27796f6b202bbc2623e7e454244ddc099a3cadf33b7cb9e9 -size 63 diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/tags.txt b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/tags.txt deleted file mode 100644 index 0d6c1880e7..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/tags.txt +++ /dev/null @@ -1,12 +0,0 @@ -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 -0,0,0,0,0,0 diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/terrain.pxheightfield deleted file mode 100644 index 011356e521..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terrain/terrain.pxheightfield +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19096597087688692a225c1955f73d22c46354995fca1df8dff107a90c2f17a2 -size 4202594 diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terraintexture.pak b/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terraintexture.pak deleted file mode 100644 index fe3604a050..0000000000 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/terraintexture.pak +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85 -size 22 diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/C14654881_CharacterController_SwitchLevels.ly b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/CharacterController_SwitchLevels.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/C14654881_CharacterController_SwitchLevels.ly rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/CharacterController_SwitchLevels.ly diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/filelist.xml b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/filelist.xml rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/filelist.xml index 0b20fa2fcf..f4638e7834 100644 --- a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/filelist.xml +++ b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/level.pak b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/level.pak rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/tags.txt b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/tags.txt rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/terraintexture.pak b/AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/terraintexture.pak rename to AutomatedTesting/Levels/Physics/CharacterController_SwitchLevels/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/C4976227_Collider_NewGroup.ly b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/Collider_AddingNewGroupWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/C4976227_Collider_NewGroup.ly rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/Collider_AddingNewGroupWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/level.pak b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/level.pak rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/tags.txt b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_AddingNewGroupWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/C4982797_Collider_ColliderOffset.ly b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/Collider_ColliderPositionOffset.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/C4982797_Collider_ColliderOffset.ly rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/Collider_ColliderPositionOffset.ly diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/level.pak b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/level.pak rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/tags.txt b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_ColliderPositionOffset/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/C4982798_Collider_ColliderRotationOffset.ly b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/Collider_ColliderRotationOffset.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/C4982798_Collider_ColliderRotationOffset.ly rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/Collider_ColliderRotationOffset.ly diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_full.PNG b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_full.PNG similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_full.PNG rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_full.PNG diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_single.PNG b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_single.PNG similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_single.PNG rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/VisualDocumentation/collider_rotation_single.PNG diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/level.pak b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/level.pak rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/tags.txt b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_ColliderRotationOffset/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/C3510644_Collider_CollisionGroups.ly b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/Collider_CollisionGroupsWorkflow.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/C3510644_Collider_CollisionGroups.ly rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/Collider_CollisionGroupsWorkflow.ly diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/level.pak b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/level.pak rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/tags.txt b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_CollisionGroupsWorkflow/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/C4982593_PhysxCollider_CollisionLayerTest.ly b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/C4982593_PhysxCollider_CollisionLayerTest.ly rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.ly diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/level.pak b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/level.pak rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/tags.txt b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/C4976245_PhysxCollider_CollisionLayerTest.ly b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/Collider_NoneCollisionGroupSameLayerNotCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/C4976245_PhysxCollider_CollisionLayerTest.ly rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/Collider_NoneCollisionGroupSameLayerNotCollide.ly diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/level.pak b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/level.pak rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/tags.txt b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_NoneCollisionGroupSameLayerNotCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/C14861498_ConfirmError_NoPxMesh.ly b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/Collider_PxMeshErrorIfNoMesh.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/C14861498_ConfirmError_NoPxMesh.ly rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/Collider_PxMeshErrorIfNoMesh.ly diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/filelist.xml similarity index 74% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/filelist.xml index 51be290295..5799ca91f9 100644 --- a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/level.pak b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/level.pak rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/level.pak diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/tags.txt b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_PxMeshErrorIfNoMesh/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.ly b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/Collider_SameCollisionGroupDiffLayersCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.ly rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/Collider_SameCollisionGroupDiffLayersCollide.ly diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/level.pak b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/level.pak rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/tags.txt b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupDiffLayersCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/C4976244_Collider_SameGroupSameLayerCollision.ly b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/Collider_SameCollisionGroupSameCustomLayerCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/C4976244_Collider_SameGroupSameLayerCollision.ly rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/Collider_SameCollisionGroupSameCustomLayerCollide.ly diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/level.pak b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/level.pak rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/tags.txt b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameCustomLayerCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/C4976242_Collision_SameCollisionlayerSameCollisiongroup.ly b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/Collider_SameCollisionGroupSameLayerCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/C4976242_Collision_SameCollisionlayerSameCollisiongroup.ly rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/Collider_SameCollisionGroupSameLayerCollide.ly diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/level.pak b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/level.pak rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/tags.txt b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_SameCollisionGroupSameLayerCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/C4982595_Collider_TriggerDisablesCollision.ly b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/Collider_TriggerPassThrough.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/C4982595_Collider_TriggerDisablesCollision.ly rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/Collider_TriggerPassThrough.ly diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/filelist.xml b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/filelist.xml rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/filelist.xml index 19fe8b0f44..34e3bb4651 100644 --- a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/level.pak b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/level.pak rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/level.pak diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/tags.txt b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/tags.txt rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/terraintexture.pak b/AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Collider_TriggerPassThrough/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/C5959760_PhysxForceRegion_PointForceExertion.ly b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/ForceRegion_CapsuleShapedForce.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/C5959760_PhysxForceRegion_PointForceExertion.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/ForceRegion_CapsuleShapedForce.ly diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_CapsuleShapedForce/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.ly b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/ForceRegion_DirectionHasNoAffectOnTotalForce.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/ForceRegion_DirectionHasNoAffectOnTotalForce.ly diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/filelist.xml similarity index 67% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/filelist.xml index d914822ad3..956b208b53 100644 --- a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_DirectionHasNoAffectOnTotalForce/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/C6321601_Force_HighValuesDirectionAxes.ly b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/ForceRegion_HighValuesDirectionAxesWorkWithNoError.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/C6321601_Force_HighValuesDirectionAxes.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/ForceRegion_HighValuesDirectionAxesWorkWithNoError.ly diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/filelist.xml similarity index 68% rename from AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/filelist.xml index b1bd56c7c8..69b0c13395 100644 --- a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6321601_Force_HighValuesDirectionAxes/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_HighValuesDirectionAxesWorkWithNoError/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/C5959763_ForceRegion_ForceRegionImpulsesCube.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/ForceRegion_ImpulsesBoxShapedRigidBody.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/C5959763_ForceRegion_ForceRegionImpulsesCube.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/ForceRegion_ImpulsesBoxShapedRigidBody.ly diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesBoxShapedRigidBody/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/C5959764_ForceRegion_ForceRegionImpulsesCapsule.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/ForceRegion_ImpulsesCapsuleShapedRigidBody.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/C5959764_ForceRegion_ForceRegionImpulsesCapsule.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/ForceRegion_ImpulsesCapsuleShapedRigidBody.ly diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesCapsuleShapedRigidBody/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/ForceRegion_ImpulsesPxMeshShapedRigidBody.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/ForceRegion_ImpulsesPxMeshShapedRigidBody.ly new file mode 100644 index 0000000000..54d65f5de9 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/ForceRegion_ImpulsesPxMeshShapedRigidBody.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0193686ea802c755241711f139ab82b50c4d3bf71d3f5d2f743579417af6a05e +size 6192 diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/PhysXSedan/_dev_Sedan_r0-b.fbx b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/PhysXSedan/_dev_Sedan_r0-b.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/PhysXSedan/_dev_Sedan_r0-b.fbx rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/PhysXSedan/_dev_Sedan_r0-b.fbx diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/PhysXSedan/_dev_sedan_r0-b.mtl b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/PhysXSedan/_dev_sedan_r0-b.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/PhysXSedan/_dev_sedan_r0-b.mtl rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/PhysXSedan/_dev_sedan_r0-b.mtl diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/filelist.xml index 28dafb7cda..f3ee83bec8 100644 --- a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ImpulsesPxMeshShapedRigidBody/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/C5932042_PhysxForceRegion_LinearDamping.ly b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/ForceRegion_LinearDampingForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/C5932042_PhysxForceRegion_LinearDamping.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/ForceRegion_LinearDampingForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_LinearDampingForceOnRigidBodies/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.ly b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/ForceRegion_LocalSpaceForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/ForceRegion_LocalSpaceForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_LocalSpaceForceOnRigidBodies/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/C5968760_ForceRegion_CheckNetForceChange.ly b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/ForceRegion_MovingForceRegionChangesNetForce.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/C5968760_ForceRegion_CheckNetForceChange.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/ForceRegion_MovingForceRegionChangesNetForce.ly diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/level.pak diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_MovingForceRegionChangesNetForce/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.ly b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/ForceRegion_MultipleComponentsCombineForces.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/ForceRegion_MultipleComponentsCombineForces.ly diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/filelist.xml similarity index 68% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/filelist.xml index 8929e58de5..fd69fd64ff 100644 --- a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleComponentsCombineForces/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/C5959810_ForceRegion_ForceRegionCombinesForces.ly b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/ForceRegion_MultipleForcesInSameComponentCombineForces.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/C5959810_ForceRegion_ForceRegionCombinesForces.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/ForceRegion_MultipleForcesInSameComponentCombineForces.ly diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_MultipleForcesInSameComponentCombineForces/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/C15845879_ForceRegion_HighLinearDampingForce.ly b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/ForceRegion_NoQuiverOnHighLinearDampingForce.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/C15845879_ForceRegion_HighLinearDampingForce.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/ForceRegion_NoQuiverOnHighLinearDampingForce.ly diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/filelist.xml similarity index 74% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/filelist.xml index 039f578577..fc04d0fb26 100644 --- a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevels/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_NoQuiverOnHighLinearDampingForce/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/C6090547_ForceRegion_ParentChildForceRegions.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/ForceRegion_ParentChildForcesCombineForces.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/C6090547_ForceRegion_ParentChildForceRegions.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/ForceRegion_ParentChildForcesCombineForces.ly diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654881_CharacterController_SwitchLevelsEmpty/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ParentChildForcesCombineForces/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies.ly b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/ForceRegion_PointForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/ForceRegion_PointForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/PhysX_ForceRegion_PointForceOnRigidBodies.ly b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/PhysX_ForceRegion_PointForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/PhysX_ForceRegion_PointForceOnRigidBodies.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/PhysX_ForceRegion_PointForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_PointForceOnRigidBodies/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/C5959808_ForceRegion_PositionOffset.ly b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/ForceRegion_PositionOffset.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/C5959808_ForceRegion_PositionOffset.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/ForceRegion_PositionOffset.ly diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_PositionOffset/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/ForceRegion_ExertsPointForce_Sedan.ly b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/ForceRegion_ExertsPointForce_Sedan.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/ForceRegion_ExertsPointForce_Sedan.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/ForceRegion_ExertsPointForce_Sedan.ly diff --git a/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/ForceRegion_PxMeshShapedForce.ly b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/ForceRegion_PxMeshShapedForce.ly new file mode 100644 index 0000000000..8748ebf49c --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/ForceRegion_PxMeshShapedForce.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcf3f138ec259aca048d631dc030ed34c4543eb1806cbe4cd9d8feb4cfb1765c +size 6129 diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/PhysXSedan/_dev_Sedan_r0-b.fbx b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/PhysXSedan/_dev_Sedan_r0-b.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/PhysXSedan/_dev_Sedan_r0-b.fbx rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/PhysXSedan/_dev_Sedan_r0-b.fbx diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/PhysXSedan/_dev_sedan_r0-b.mtl b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/PhysXSedan/_dev_sedan_r0-b.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/PhysXSedan/_dev_sedan_r0-b.mtl rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/PhysXSedan/_dev_sedan_r0-b.mtl diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_PxMeshShapedForce/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/C5959809_ForceRegion_RotationalOffset.ly b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/ForceRegion_RotationalOffset.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/C5959809_ForceRegion_RotationalOffset.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/ForceRegion_RotationalOffset.ly diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14861498_ConfirmError_NoPxMesh/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_RotationalOffset/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/C5932043_ForceRegion_SimpleDragOnRigidBody.ly b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/ForceRegion_SimpleDragForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/C5932043_ForceRegion_SimpleDragOnRigidBody.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/ForceRegion_SimpleDragForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/filelist.xml index 808b695610..5c46ca6e4a 100644 --- a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SimpleDragForceOnRigidBodies/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/ForceRegionEntity.slice b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/ForceRegionEntity.slice similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/ForceRegionEntity.slice rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/ForceRegionEntity.slice diff --git a/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/ForceRegion_SliceFileInstantiates.ly b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/ForceRegion_SliceFileInstantiates.ly new file mode 100644 index 0000000000..0bbaa92ae0 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/ForceRegion_SliceFileInstantiates.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4e90b86d7f6790dc14ae86e62063dacd0fab23343653b1bd270924bfdce9730 +size 5943 diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SliceFileInstantiates/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/C12905527_ForceRegion_MagnitudeDeviation.ly b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/ForceRegion_SmallMagnitudeDeviationOnLargeForces.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/C12905527_ForceRegion_MagnitudeDeviation.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/ForceRegion_SmallMagnitudeDeviationOnLargeForces.ly diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12905527_ForceRegion_MagnitudeDeviation/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SmallMagnitudeDeviationOnLargeForces/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/C5959759_RigidBody_ForceRegionSpherePointForce.ly b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/ForceRegion_SphereShapedForce.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/C5959759_RigidBody_ForceRegionSpherePointForce.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/ForceRegion_SphereShapedForce.ly diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/filelist.xml index 6088bc2406..10ed54f776 100644 --- a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SphereShapedForce/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/C5932045_ForceRegion_Spline.ly b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/ForceRegion_SplineForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/C5932045_ForceRegion_Spline.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/ForceRegion_SplineForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/level.pak diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineForceOnRigidBodies/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/C12868580_ForceRegion_SplineModifiedTransform.ly b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/ForceRegion_SplineRegionWithModifiedTransform.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/C12868580_ForceRegion_SplineModifiedTransform.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/ForceRegion_SplineRegionWithModifiedTransform.ly diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/filelist.xml similarity index 74% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/filelist.xml index 4fe64b8489..8de5b336e6 100644 --- a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12868580_ForceRegion_SplineModifiedTransform/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/level.pak diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_SplineRegionWithModifiedTransform/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/C5932040_ForceRegion_CubeExertsWorldForce.ly b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/ForceRegion_WorldSpaceForceOnRigidBodies.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/C5932040_ForceRegion_CubeExertsWorldForce.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/ForceRegion_WorldSpaceForceOnRigidBodies.ly diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_WorldSpaceForceOnRigidBodies/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/C6090552_ForceRegion_LinearDampingNegative.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/ForceRegion_ZeroLinearDampingDoesNothing.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/C6090552_ForceRegion_LinearDampingNegative.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/ForceRegion_ZeroLinearDampingDoesNothing.ly diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/filelist.xml index a34f1e9cdf..dcf851c09f 100644 --- a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLinearDampingDoesNothing/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/ForceRegion_ZeroLocalSpaceForceDoesNothing.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/ForceRegion_ZeroLocalSpaceForceDoesNothing.ly new file mode 100644 index 0000000000..1cb6ea2363 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/ForceRegion_ZeroLocalSpaceForceDoesNothing.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3167926eac3e980971f5bb8eb5747e363b2c24b94a2e25dac9b505004c78863c +size 7216 diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/filelist.xml index c0fa1227da..3e19435518 100644 --- a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroLocalSpaceForceDoesNothing/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/ForceRegion_ZeroPointForceDoesNothing.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/ForceRegion_ZeroPointForceDoesNothing.ly new file mode 100644 index 0000000000..56ad1ce7a4 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/ForceRegion_ZeroPointForceDoesNothing.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9166e3bf96fd95997389f51ec3ce5a9765c563a04134143062b555a7d4260cdd +size 7398 diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/filelist.xml index c0fa1227da..3e19435518 100644 --- a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroPointForceDoesNothing/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/ForceRegion_ZeroSimpleDragForceDoesNothing.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/ForceRegion_ZeroSimpleDragForceDoesNothing.ly diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/filelist.xml similarity index 68% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/filelist.xml index 1ec39b89c2..87165c13e4 100644 --- a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSimpleDragForceDoesNothing/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/C6090555_ForceRegion_SplineFollowOnRigidBodies.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/ForceRegion_ZeroSplineForceDoesNothing.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/C6090555_ForceRegion_SplineFollowOnRigidBodies.ly rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/ForceRegion_ZeroSplineForceDoesNothing.ly diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/level.pak diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroSplineForceDoesNothing/tags.txt diff --git a/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/ForceRegion_ZeroWorldSpaceForceDoesNothing.ly b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/ForceRegion_ZeroWorldSpaceForceDoesNothing.ly new file mode 100644 index 0000000000..f03a3ff606 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/ForceRegion_ZeroWorldSpaceForceDoesNothing.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1796f237a8a9500bf58cd89820a39dac5b94108302abd8eda54067abba46508e +size 7203 diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/filelist.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/filelist.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/filelist.xml index c0fa1227da..3e19435518 100644 --- a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/level.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/level.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/tags.txt b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/terraintexture.pak b/AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ForceRegion_ZeroWorldSpaceForceDoesNothing/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/C18243588_Joints_Ball2BodiesConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/Joints_Ball2BodiesConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/C18243588_Joints_Ball2BodiesConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/Joints_Ball2BodiesConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/filelist.xml rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/filelist.xml index fa5a7aa319..d0960f8154 100644 --- a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/tags.txt b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_Ball2BodiesConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/C18243592_Joints_BallBreakable.ly b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/Joints_BallBreakable.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/C18243592_Joints_BallBreakable.ly rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/Joints_BallBreakable.ly diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/filelist.xml rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/filelist.xml index fa5a7aa319..d0960f8154 100644 --- a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/level.pak b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/level.pak rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithOutTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/tags.txt b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_BallBreakable/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_BallBreakable/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/C18243591_Joints_BallLeadFollowerCollide.ly b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/Joints_BallLeadFollowerCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/C18243591_Joints_BallLeadFollowerCollide.ly rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/Joints_BallLeadFollowerCollide.ly diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/filelist.xml rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/filelist.xml index fa5a7aa319..d0960f8154 100644 --- a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/level.pak b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/level.pak rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/tags.txt b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_BallLeadFollowerCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/C18243590_Joints_BallNoLimitsConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/Joints_BallNoLimitsConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/C18243590_Joints_BallNoLimitsConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/Joints_BallNoLimitsConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/filelist.xml rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/filelist.xml index fa5a7aa319..d0960f8154 100644 --- a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/tags.txt b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_BallNoLimitsConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/C18243589_Joints_BallSoftLimitsConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/Joints_BallSoftLimitsConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/C18243589_Joints_BallSoftLimitsConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/Joints_BallSoftLimitsConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/tags.txt b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_BallSoftLimitsConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/C18243580_Joints_Fixed2BodiesConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/Joints_Fixed2BodiesConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/C18243580_Joints_Fixed2BodiesConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/Joints_Fixed2BodiesConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/LevelData/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/tags.txt b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_Fixed2BodiesConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/C18243581_Joints_FixedBreakable.ly b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/Joints_FixedBreakable.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/C18243581_Joints_FixedBreakable.ly rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/Joints_FixedBreakable.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/level.pak b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/level.pak rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/tags.txt b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_FixedBreakable/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_FixedBreakable/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/C18243582_Joints_FixedLeadFollowerCollide.ly b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/Joints_FixedLeadFollowerCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/C18243582_Joints_FixedLeadFollowerCollide.ly rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/Joints_FixedLeadFollowerCollide.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/level.pak b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/level.pak rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/tags.txt b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_FixedLeadFollowerCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/C18243593_Joints_GlobalFrameConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/Joints_GlobalFrameConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/C18243593_Joints_GlobalFrameConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/Joints_GlobalFrameConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/filelist.xml rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/filelist.xml index 1d13b9c30a..28d8cdb695 100644 --- a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/tags.txt b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_GlobalFrameConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/C18243583_Joints_Hinge2BodiesConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/Joints_Hinge2BodiesConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/C18243583_Joints_Hinge2BodiesConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/Joints_Hinge2BodiesConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243580_Joints_Fixed2BodiesConstrained/LevelData/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/tags.txt b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_Hinge2BodiesConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/C18243587_Joints_HingeBreakable.ly b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/Joints_HingeBreakable.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/C18243587_Joints_HingeBreakable.ly rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/Joints_HingeBreakable.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/level.pak diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243581_Joints_FixedBreakable/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/tags.txt b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_HingeBreakable/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeBreakable/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/C18243586_Joints_HingeLeadFollowerCollide.ly b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/Joints_HingeLeadFollowerCollide.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/C18243586_Joints_HingeLeadFollowerCollide.ly rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/Joints_HingeLeadFollowerCollide.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/level.pak b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/level.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/level.pak diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243582_Joints_FixedLeadFollowerCollide/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/tags.txt b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeLeadFollowerCollide/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/C18243585_Joints_HingeNoLimitsConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/Joints_HingeNoLimitsConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/C18243585_Joints_HingeNoLimitsConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/Joints_HingeNoLimitsConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/level.pak b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/level.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243583_Joints_Hinge2BodiesConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/tags.txt b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeNoLimitsConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/C18243584_Joints_HingeSoftLimitsConstrained.ly b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/Joints_HingeSoftLimitsConstrained.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/C18243584_Joints_HingeSoftLimitsConstrained.ly rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/Joints_HingeSoftLimitsConstrained.ly diff --git a/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/filelist.xml b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/filelist.xml new file mode 100644 index 0000000000..d0960f8154 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/filelist.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/level.pak b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/level.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243584_Joints_HingeSoftLimitsConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/tags.txt b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/tags.txt rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terraintexture.pak b/AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Joints_HingeSoftLimitsConstrained/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/C4925577_PhysXMaterials_MaterialAssignedToTerrain.ly b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/Material_CanBeAssignedToTerrain.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/C4925577_PhysXMaterials_MaterialAssignedToTerrain.ly rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/Material_CanBeAssignedToTerrain.ly diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/filelist.xml similarity index 68% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/filelist.xml index 156e75bb88..2694b3bc25 100644 --- a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/level.pak b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/level.pak rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/materials/material.physmaterial b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/materials/material.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/materials/material.physmaterial rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/materials/material.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/tags.txt b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/tags.txt rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_CanBeAssignedToTerrain/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.ly b/AutomatedTesting/Levels/Physics/Material_CharacterController/Material_CharacterController.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.ly rename to AutomatedTesting/Levels/Physics/Material_CharacterController/Material_CharacterController.ly diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/filelist.xml b/AutomatedTesting/Levels/Physics/Material_CharacterController/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_CharacterController/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/level.pak b/AutomatedTesting/Levels/Physics/Material_CharacterController/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/level.pak rename to AutomatedTesting/Levels/Physics/Material_CharacterController/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243585_Joints_HingeNoLimitsConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_CharacterController/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/library.physmaterial b/AutomatedTesting/Levels/Physics/Material_CharacterController/library.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/library.physmaterial rename to AutomatedTesting/Levels/Physics/Material_CharacterController/library.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/tags.txt b/AutomatedTesting/Levels/Physics/Material_CharacterController/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/tags.txt rename to AutomatedTesting/Levels/Physics/Material_CharacterController/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_CharacterController/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_CharacterController/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/C15308221_Material_ComponentsInSyncWithLibrary.ly b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/Material_ComponentsInSyncWithLibrary.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/C15308221_Material_ComponentsInSyncWithLibrary.ly rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/Material_ComponentsInSyncWithLibrary.ly diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/c15308221_material_componentsinsyncwithlibrary.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/filelist.xml b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/filelist.xml index 227703d8a3..ed06afdb26 100644 --- a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/level.pak b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/level.pak rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243586_Joints_HingeLeadFollowerCollide/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/AnimGraphPhysX.animgraph b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/AnimGraphPhysX.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/AnimGraphPhysX.animgraph rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/AnimGraphPhysX.animgraph diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/Red.tif b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/Red.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/Red.tif rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/Red.tif diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/RinLocomotion.motionset b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/RinLocomotion.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/RinLocomotion.motionset rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/RinLocomotion.motionset diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/modified.mtl b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/modified.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/modified.mtl rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/modified.mtl diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/tags.txt b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/tags.txt rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_ComponentsInSyncWithLibrary/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/Blue.tif b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/Blue.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/Blue.tif rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/Blue.tif diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/C15096735_Materials_DefaultLibraryConsistency.ly b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/Material_DefaultLibraryConsistentOnAllFeatures.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/C15096735_Materials_DefaultLibraryConsistency.ly rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/Material_DefaultLibraryConsistentOnAllFeatures.ly diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/Red.tif b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/Red.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/Red.tif rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/Red.tif diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/c15096735_materials_defaultlibraryconsistency.physmaterial b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/c15096735_materials_defaultlibraryconsistency.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/c15096735_materials_defaultlibraryconsistency.physmaterial rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/c15096735_materials_defaultlibraryconsistency.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/concrete.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/concrete.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/concrete.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/concrete.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/cowboy.emfxworkspace b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/cowboy.emfxworkspace similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/cowboy.emfxworkspace rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/cowboy.emfxworkspace diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/filelist.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/level.pak b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/level.pak rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/concrete_animgraph.animgraph b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/concrete_animgraph.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/concrete_animgraph.animgraph rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/concrete_animgraph.animgraph diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/concrete_motionset.motionset b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/concrete_motionset.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/concrete_motionset.motionset rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/concrete_motionset.motionset diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_concrete.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_concrete.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_concrete.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_concrete.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/concrete/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/concrete/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_rubber.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_rubber.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_rubber.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_rubber.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rubber_animgraph.animgraph b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rubber_animgraph.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rubber_animgraph.animgraph rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rubber_animgraph.animgraph diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rubber_motionset.motionset b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rubber_motionset.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/ragdoll/rubber/rubber_motionset.motionset rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/ragdoll/rubber/rubber_motionset.motionset diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/rubber.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/rubber.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/rubber.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/rubber.mtl diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/tags.txt b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/tags.txt rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096735_Materials_DefaultLibraryConsistency/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryConsistentOnAllFeatures/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/0.ly b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/0.ly new file mode 100644 index 0000000000..04e8722b8b --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/0.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f81cca02ee6ba84bee2bdf5c37541cea3386de8eeb31ffcd05d2cc01eaf3d8e +size 6365 diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/filelist.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/filelist.xml similarity index 67% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/filelist.xml index a550412634..7a2989c360 100644 --- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/0/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/level.pak b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/level.pak new file mode 100644 index 0000000000..b03cb20cb2 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/level.pak @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec01136df2b36809f16d647b0625057c956e6073b21626d8a773d1dcc8a5bd3 +size 39345 diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Heightmap.dat new file mode 100644 index 0000000000..2a07219a0b --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/Heightmap.dat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af2e9ed3a37f92768829bce5e53cfca8fc38814eb96f37fa0430925987178cef +size 17407562 diff --git a/AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243587_Joints_HingeBreakable/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TimeOfDay.xml similarity index 99% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TimeOfDay.xml index 456d609b8a..c5b404318e 100644 --- a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/TimeOfDay.xml +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/TimeOfDay.xml @@ -236,8 +236,8 @@ - - + + diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/tags.txt b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/tags.txt rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/tags.txt diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc new file mode 100644 index 0000000000..5c869c6533 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/cover.ctc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c +size 1310792 diff --git a/AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308217_NoCrash_LevelSwitchWithTerrain/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/0/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/1.ly b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/1.ly new file mode 100644 index 0000000000..c193edc22e --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/1.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7fe6f5392d56fdc7f94d405d820ea9d6da084800d3abb32fe2d30ceaa3cdfb9 +size 6396 diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/filelist.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/filelist.xml similarity index 67% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/filelist.xml index a8e9e19b81..7a2989c360 100644 --- a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/1/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/level.pak b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/level.pak new file mode 100644 index 0000000000..b03cb20cb2 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/level.pak @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fec01136df2b36809f16d647b0625057c956e6073b21626d8a773d1dcc8a5bd3 +size 39345 diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Heightmap.dat b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Heightmap.dat new file mode 100644 index 0000000000..2a07219a0b --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/Heightmap.dat @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af2e9ed3a37f92768829bce5e53cfca8fc38814eb96f37fa0430925987178cef +size 17407562 diff --git a/AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243588_Joints_Ball2BodiesConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TimeOfDay.xml similarity index 99% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TimeOfDay.xml index 456d609b8a..c5b404318e 100644 --- a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/TimeOfDay.xml +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/TimeOfDay.xml @@ -236,8 +236,8 @@ - - + + diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/tags.txt b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/tags.txt rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/tags.txt diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc new file mode 100644 index 0000000000..5c869c6533 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/cover.ctc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdab340ad6c6dc6c1167e31afa061684be083360fc4108fa9f1fa4b15fe95d8c +size 1310792 diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/1/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/_last_run_before_change_data.txt b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/_last_run_before_change_data.txt new file mode 100644 index 0000000000..0533215fc1 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/_last_run_before_change_data.txt @@ -0,0 +1,4 @@ +[0.0, 0.0, 2.3999319076538086] +[0.0, 0.0, 2.3999319076538086] +True +True diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/c15096732_material_defaultlibraryupdatedacrosslevels_b.physmaterial b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/after.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/c15096732_material_defaultlibraryupdatedacrosslevels_b.physmaterial rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/after.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/c15096732_material_defaultlibraryupdatedacrosslevels_a.physmaterial b/AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/before.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096732_Material_DefaultLibraryUpdatedAcrossLevels/c15096732_material_defaultlibraryupdatedacrosslevels_a.physmaterial rename to AutomatedTesting/Levels/Physics/Material_DefaultLibraryUpdatedAcrossLevels/before.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase1.layer b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase1.layer similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase1.layer rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase1.layer diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase2.layer b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase2.layer similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase2.layer rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase2.layer diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase3.layer b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase3.layer similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase3.layer rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase3.layer diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase4.layer b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase4.layer similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/Layers/phase4.layer rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Layers/phase4.layer diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/C15096737_Materials_DefaultMaterialLibraryChanges.ly b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Material_DefaultMaterialLibraryChangesWork.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/C15096737_Materials_DefaultMaterialLibraryChanges.ly rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/Material_DefaultMaterialLibraryChangesWork.ly diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/all_ones_1.physmaterial b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/all_ones_1.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/all_ones_1.physmaterial rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/all_ones_1.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/custom_motionset.motionset b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/custom_motionset.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/custom_motionset.motionset rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/custom_motionset.motionset diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/filelist.xml b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/level.pak b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/level.pak rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15845879_ForceRegion_HighLinearDampingForce/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243589_Joints_BallSoftLimitsConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_material_1.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_material_1.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_material_1.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_material_1.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_material_2.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_material_2.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_material_2.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_material_2.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_terrain_mat_blue.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_terrain_mat_blue.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_terrain_mat_blue.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_terrain_mat_blue.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_terrain_mat_red.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_terrain_mat_red.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/custom_terrain_mat_red.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/custom_terrain_mat_red.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/material_terrain_default.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/material_terrain_default.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/materials/material_terrain_default.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/materials/material_terrain_default.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_physics.animgraph b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_physics.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_physics.animgraph rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_physics.animgraph diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - Copy.fbx b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo - Copy.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - Copy.fbx rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo - Copy.fbx diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo - copy.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo - copy.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo - copy.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo - copy.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo - copy.mtl diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/tags.txt b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/tags.txt rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/ws.emfxworkspace b/AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/ws.emfxworkspace similarity index 100% rename from AutomatedTesting/Levels/Physics/C15096737_Materials_DefaultMaterialLibraryChanges/ws.emfxworkspace rename to AutomatedTesting/Levels/Physics/Material_DefaultMaterialLibraryChangesWork/ws.emfxworkspace diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/C4044459_Material_DynamicFriction.ly b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/Material_DynamicFriction.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/C4044459_Material_DynamicFriction.ly rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/Material_DynamicFriction.ly diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/dynamic_friction.physmaterial b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/dynamic_friction.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/dynamic_friction.physmaterial rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/dynamic_friction.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/filelist.xml b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/level.pak b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/level.pak rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243590_Joints_BallNoLimitsConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/tags.txt b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_DynamicFriction/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_DynamicFriction/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/C4044694_Material_EmptyLibraryUsesDefault.ly b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/Material_EmptyLibraryUsesDefault.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/C4044694_Material_EmptyLibraryUsesDefault.ly rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/Material_EmptyLibraryUsesDefault.ly diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/c4044694_material_emptylibraryusesdefault.physmaterial b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/c4044694_material_emptylibraryusesdefault.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/c4044694_material_emptylibraryusesdefault.physmaterial rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/c4044694_material_emptylibraryusesdefault.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/filelist.xml b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/filelist.xml index ff21651bd9..6452f4bbe1 100644 --- a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/level.pak b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/level.pak rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/tags.txt b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_EmptyLibraryUsesDefault/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/C4044456_Material_FrictionCombine.ly b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/Material_FrictionCombine.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/C4044456_Material_FrictionCombine.ly rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/Material_FrictionCombine.ly diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/filelist.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/friction_combine.physmaterial b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/friction_combine.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/friction_combine.physmaterial rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/friction_combine.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/level.pak b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/level.pak rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243591_Joints_BallLeadFollowerCollide/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/tags.txt b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/tags.txt rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_FrictionCombine/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_FrictionCombine/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/C18977601_Material_FrictionCombinePriority.ly b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/Material_FrictionCombinePriorityOrder.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/C18977601_Material_FrictionCombinePriority.ly rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/Material_FrictionCombinePriorityOrder.ly diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/filelist.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/friction_combine.physmaterial b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/friction_combine.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/friction_combine.physmaterial rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/friction_combine.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/level.pak b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/level.pak rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243592_Joints_BallBreakable/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/tags.txt b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/tags.txt rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_FrictionCombinePriorityOrder/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/C4044455_Material_LibraryChangesInstantly_restore.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/C4044455_Material_LibraryChangesInstantly_restore.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/C4044455_Material_LibraryChangesInstantly_restore.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/C4044455_Material_LibraryChangesInstantly_restore.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/C4044455_Material_LibraryChangesInstantly.ly b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/Material_LibraryChangesReflectInstantly.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/C4044455_Material_LibraryChangesInstantly.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/Material_LibraryChangesReflectInstantly.ly diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/c4044455_material_librarychangesinstantly.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/c4044455_material_librarychangesinstantly.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/c4044455_material_librarychangesinstantly.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/c4044455_material_librarychangesinstantly.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18243593_Joints_GlobalFrameConstrained/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryChangesReflectInstantly/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/C15563573_Material_AddModifyDeleteOnCharacterController.ly b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/Material_LibraryCrudOperationsReflectOnCharacterController.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/C15563573_Material_AddModifyDeleteOnCharacterController.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/Material_LibraryCrudOperationsReflectOnCharacterController.ly diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/c15563573_material_addmodifydeleteoncharactercontroller.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/c15563573_material_addmodifydeleteoncharactercontroller.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/c15563573_material_addmodifydeleteoncharactercontroller.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/c15563573_material_addmodifydeleteoncharactercontroller.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18977601_Material_FrictionCombinePriority/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/testmaterials.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/testmaterials.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15563573_Material_AddModifyDeleteOnCharacterController/testmaterials.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCharacterController/testmaterials.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/C4888315_Material_AddModifyDeleteOnCollider.ly b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/Material_LibraryCrudOperationsReflectOnCollider.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/C4888315_Material_AddModifyDeleteOnCollider.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/Material_LibraryCrudOperationsReflectOnCollider.ly diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/c4888315_material_addmodifydeleteoncollider.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/c4888315_material_addmodifydeleteoncollider.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/c4888315_material_addmodifydeleteoncollider.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/c4888315_material_addmodifydeleteoncollider.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/filelist.xml index 298c048506..a6bfb1e285 100644 --- a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnCollider/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/C4925582_Material_AddModifyDeleteOnRagdollBones.ly b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/Material_LibraryCrudOperationsReflectOnRagdollBones.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/C4925582_Material_AddModifyDeleteOnRagdollBones.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/Material_LibraryCrudOperationsReflectOnRagdollBones.ly diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/filelist.xml index 7fb4108fe3..cd5aabef1b 100644 --- a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/AnimGraphPhysX.animgraph b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/AnimGraphPhysX.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/AnimGraphPhysX.animgraph rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/AnimGraphPhysX.animgraph diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/Blue.tif b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/Blue.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/Blue.tif rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/Blue.tif diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/RinLocomotion.motionset b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/RinLocomotion.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/RinLocomotion.motionset rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/RinLocomotion.motionset diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/default.mtl b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/default.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/default.mtl rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/default.mtl diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_physics.animgraph b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_physics.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_physics.animgraph rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_physics.animgraph diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C15308221_Material_ComponentsInSyncWithLibrary/ragdoll_modified/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/AnimGraphPhysX.animgraph b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/AnimGraphPhysX.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/AnimGraphPhysX.animgraph rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/AnimGraphPhysX.animgraph diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/Red.tif b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/Red.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/Red.tif rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/Red.tif diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/RinLocomotion.motionset b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/RinLocomotion.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/RinLocomotion.motionset rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/RinLocomotion.motionset diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/modified.mtl b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/modified.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/modified.mtl rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/modified.mtl diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdollbones.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdollbones.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdollbones.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/ragdollbones.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnRagdollBones/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/C4925579_Material_AddModifyDeleteOnTerrain.ly b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/Material_LibraryCrudOperationsReflectOnTerrain.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/C4925579_Material_AddModifyDeleteOnTerrain.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/Material_LibraryCrudOperationsReflectOnTerrain.ly diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/c4925579_material_addmodifydeleteonterrain.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/c4925579_material_addmodifydeleteonterrain.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/c4925579_material_addmodifydeleteonterrain.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/c4925579_material_addmodifydeleteonterrain.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/filelist.xml index daa57f3091..993036bdef 100644 --- a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/modified.mtl b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/modified.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/modified.mtl rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/modified.mtl diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryCrudOperationsReflectOnTerrain/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/C15425935_Material_LibraryUpdatedAcrossLevels_0.ly b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/C15425935_Material_LibraryUpdatedAcrossLevels_0.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/C15425935_Material_LibraryUpdatedAcrossLevels_0.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/C15425935_Material_LibraryUpdatedAcrossLevels_0.ly diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml index 7fa20195df..9a78b1bfd5 100644 --- a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/LevelData/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_0/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/C15425935_Material_LibraryUpdatedAcrossLevels_1.ly b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/C15425935_Material_LibraryUpdatedAcrossLevels_1.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/C15425935_Material_LibraryUpdatedAcrossLevels_1.ly rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/C15425935_Material_LibraryUpdatedAcrossLevels_1.ly diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml index 7fa20195df..9a78b1bfd5 100644 --- a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/level.pak b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/level.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044694_Material_EmptyLibraryUsesDefault/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/tags.txt b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/tags.txt rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels_1/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels.physmaterial b/AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/Material_LibraryUpdatedAcrossLevels.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425935_Material_LibraryUpdatedAcrossLevels/C15425935_Material_LibraryUpdatedAcrossLevels.physmaterial rename to AutomatedTesting/Levels/Physics/Material_LibraryUpdatedAcrossLevels/Material_LibraryUpdatedAcrossLevels.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/C5296614_PhysXMaterial_ColliderShape.ly b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/Material_NoEffectIfNoColliderShape.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/C5296614_PhysXMaterial_ColliderShape.ly rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/Material_NoEffectIfNoColliderShape.ly diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/filelist.xml b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/filelist.xml similarity index 72% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/filelist.xml index 318f99aa25..d4e0202e8a 100644 --- a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/level.pak b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/level.pak rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044455_Material_LibraryChangesInstantly/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/tags.txt b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/tags.txt rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_NoEffectIfNoColliderShape/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/Material_PerFaceMaterialGetsCorrectMaterial.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/C4044697_Material_PerfaceMaterialValidation.ly rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/Material_PerFaceMaterialGetsCorrectMaterial.ly diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/filelist.xml b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/level.pak b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/level.pak rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044456_Material_FrictionCombine/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/tags.txt b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/tags.txt rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test.fbx b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test.fbx rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test.fbx diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test.mtl b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test.mtl rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test.mtl diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test_library.physmaterial b/AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test_library.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/test_library.physmaterial rename to AutomatedTesting/Levels/Physics/Material_PerFaceMaterialGetsCorrectMaterial/test_library.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/C4925580_Material_RagdollBonesMaterial.ly b/AutomatedTesting/Levels/Physics/Material_RagdollBones/Material_RagdollBones.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/C4925580_Material_RagdollBonesMaterial.ly rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/Material_RagdollBones.ly diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/c4925580_material_ragdollbonesmaterial.physmaterial b/AutomatedTesting/Levels/Physics/Material_RagdollBones/c4925580_material_ragdollbonesmaterial.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/c4925580_material_ragdollbonesmaterial.physmaterial rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/c4925580_material_ragdollbonesmaterial.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/filelist.xml b/AutomatedTesting/Levels/Physics/Material_RagdollBones/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/filelist.xml index 7fb4108fe3..cd5aabef1b 100644 --- a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Material_RagdollBones/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/level.pak b/AutomatedTesting/Levels/Physics/Material_RagdollBones/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/level.pak rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925577_PhysXMaterials_MaterialAssignedToTerrain/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/AnimGraphPhysX.animgraph b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/AnimGraphPhysX.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/AnimGraphPhysX.animgraph rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/AnimGraphPhysX.animgraph diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/Blue.tif b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/Blue.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/Blue.tif rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/Blue.tif diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/RinLocomotion.motionset b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/RinLocomotion.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/RinLocomotion.motionset rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/RinLocomotion.motionset diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/concrete.mtl b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/concrete.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/concrete.mtl rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/concrete.mtl diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_physics.animgraph b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_physics.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_physics.animgraph rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_physics.animgraph diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_concrete/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_concrete/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/AnimGraphPhysX.animgraph b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/AnimGraphPhysX.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/AnimGraphPhysX.animgraph rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/AnimGraphPhysX.animgraph diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/Red.tif b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/Red.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/Red.tif rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/Red.tif diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/RinLocomotion.motionset b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/RinLocomotion.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/RinLocomotion.motionset rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/RinLocomotion.motionset diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rubber.mtl b/AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rubber.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/ragdoll_rubber/rubber.mtl rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/ragdoll_rubber/rubber.mtl diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/tags.txt b/AutomatedTesting/Levels/Physics/Material_RagdollBones/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/tags.txt rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Material_RagdollBones/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_RagdollBones/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_RagdollBones/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/C4044461_Material_Restitution.ly b/AutomatedTesting/Levels/Physics/Material_Restitution/Material_Restitution.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/C4044461_Material_Restitution.ly rename to AutomatedTesting/Levels/Physics/Material_Restitution/Material_Restitution.ly diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/filelist.xml b/AutomatedTesting/Levels/Physics/Material_Restitution/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_Restitution/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/level.pak b/AutomatedTesting/Levels/Physics/Material_Restitution/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/level.pak rename to AutomatedTesting/Levels/Physics/Material_Restitution/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925579_Material_AddModifyDeleteOnTerrain/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_Restitution/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/restitution.physmaterial b/AutomatedTesting/Levels/Physics/Material_Restitution/restitution.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/restitution.physmaterial rename to AutomatedTesting/Levels/Physics/Material_Restitution/restitution.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/tags.txt b/AutomatedTesting/Levels/Physics/Material_Restitution/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/tags.txt rename to AutomatedTesting/Levels/Physics/Material_Restitution/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_Restitution/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_Restitution/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/C4044457_Material_RestitutionCombine.ly b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/Material_RestitutionCombine.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/C4044457_Material_RestitutionCombine.ly rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/Material_RestitutionCombine.ly diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/filelist.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/level.pak b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/level.pak rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925580_Material_RagdollBonesMaterial/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044459_Material_DynamicFriction/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/restitution_combine.physmaterial b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/restitution_combine.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044457_Material_RestitutionCombine/restitution_combine.physmaterial rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/restitution_combine.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/tags.txt b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/tags.txt rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_RestitutionCombine/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombine/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/C18981526_Material_RestitutionCombinePriority.ly b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/Material_RestitutionCombinePriorityOrder.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/C18981526_Material_RestitutionCombinePriority.ly rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/Material_RestitutionCombinePriorityOrder.ly diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/filelist.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/level.pak b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/level.pak rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/restitution_combine.physmaterial b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/restitution_combine.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C18981526_Material_RestitutionCombinePriority/restitution_combine.physmaterial rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/restitution_combine.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/tags.txt b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/tags.txt rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_RestitutionCombinePriorityOrder/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/C4044460_Material_StaticFriction.ly b/AutomatedTesting/Levels/Physics/Material_StaticFriction/Material_StaticFriction.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/C4044460_Material_StaticFriction.ly rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/Material_StaticFriction.ly diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/filelist.xml b/AutomatedTesting/Levels/Physics/Material_StaticFriction/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/filelist.xml rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/level.pak b/AutomatedTesting/Levels/Physics/Material_StaticFriction/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/level.pak rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044461_Material_Restitution/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/staticfriction.physmaterial b/AutomatedTesting/Levels/Physics/Material_StaticFriction/staticfriction.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044460_Material_StaticFriction/staticfriction.physmaterial rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/staticfriction.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/tags.txt b/AutomatedTesting/Levels/Physics/Material_StaticFriction/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/tags.txt rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terraintexture.pak b/AutomatedTesting/Levels/Physics/Material_StaticFriction/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Material_StaticFriction/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.ly b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.ly new file mode 100644 index 0000000000..25c46d7f2f --- /dev/null +++ b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e479e88c4f5ac7ebfb7e75ebd1555e05bfe9b731062bcf4463fb8221047aed36 +size 3091 diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/RigidBody.slice b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/RigidBody.slice similarity index 100% rename from AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/RigidBody.slice rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/RigidBody.slice diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/filelist.xml b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/filelist.xml similarity index 68% rename from AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/filelist.xml rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/filelist.xml index f3d1b3fa90..d0f6ec9ff4 100644 --- a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/level.pak b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/level.pak rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4044697_Material_PerfaceMaterialValidation/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/tags.txt b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/tags.txt rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/terraintexture.pak b/AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/C15425929_Undo_Redo.ly b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/Physics_UndoRedoWorksOnEntityWithPhysComponents.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/C15425929_Undo_Redo.ly rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/Physics_UndoRedoWorksOnEntityWithPhysComponents.ly diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/filelist.xml b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/filelist.xml rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/filelist.xml index 663cddccf7..d797080487 100644 --- a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/level.pak b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C15425929_Undo_Redo/level.pak rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/tags.txt b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/tags.txt rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/terraintexture.pak b/AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Physics_UndoRedoWorksOnEntityWithPhysComponents/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.ly b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.ly rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.ly diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/filelist.xml b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/filelist.xml similarity index 66% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/filelist.xml rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/filelist.xml index 4d9ef56440..bd095b90f5 100644 --- a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/level.pak b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/level.pak rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4888315_Material_AddModifyDeleteOnCollider/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/tags.txt b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/tags.txt rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/terraintexture.pak b/AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/PhysXSedan/_dev_Sedan_r0-b.fbx b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/PhysXSedan/_dev_Sedan_r0-b.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/PhysXSedan/_dev_Sedan_r0-b.fbx rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/PhysXSedan/_dev_Sedan_r0-b.fbx diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/PhysXSedan/_dev_sedan_r0-b.mtl b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/PhysXSedan/_dev_sedan_r0-b.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/PhysXSedan/_dev_sedan_r0-b.mtl rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/PhysXSedan/_dev_sedan_r0-b.mtl diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/C29032500_EditorComponents_WorldBodyBusWorks.ly b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/Physics_WorldBodyBusWorksOnEditorComponents.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/C29032500_EditorComponents_WorldBodyBusWorks.ly rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/Physics_WorldBodyBusWorksOnEditorComponents.ly diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/filelist.xml b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/filelist.xml rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/filelist.xml index 2ba204c714..72c3058f90 100644 --- a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/level.pak b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C29032500_EditorComponents_WorldBodyBusWorks/level.pak rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/tags.txt b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/tags.txt rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/terraintexture.pak b/AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Physics_WorldBodyBusWorksOnEditorComponents/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/C13895144_Ragdoll_NoRagdoll.ly b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/NoRagdoll.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/C13895144_Ragdoll_NoRagdoll.ly rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/NoRagdoll.ly diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/filelist.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/filelist.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/filelist.xml index 076e359dd5..fc5c54a6c0 100644 --- a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/level.pak b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_NoRagdoll/level.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/tags.txt b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/tags.txt rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terraintexture.pak b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/C13895144_Ragdoll_WithRagdoll.ly b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/WithRagdoll.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/C13895144_Ragdoll_WithRagdoll.ly rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/WithRagdoll.ly diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/filelist.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/filelist.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/level.pak b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/level.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982593_PhysxCollider_CollisionLayerTest/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/myMotionSet.motionset b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/myMotionSet.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/myMotionSet.motionset rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/myMotionSet.motionset diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/ragdoll.animgraph b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/ragdoll.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/ragdoll.animgraph rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/ragdoll.animgraph diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/AnimGraphForSecondRagdoll(1).animgraph b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/AnimGraphForSecondRagdoll(1).animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/AnimGraphForSecondRagdoll(1).animgraph rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/AnimGraphForSecondRagdoll(1).animgraph diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1).zip b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1).zip similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1).zip rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1).zip diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/PhysicsRin(1)/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/rin_physics(1).animgraph b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/rin_physics(1).animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C13895144_Ragdoll_WithRagdoll/rin/rin_physics(1).animgraph rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/rin/rin_physics(1).animgraph diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/tags.txt b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/tags.txt rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terraintexture.pak b/AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/C14654882_Ragdoll_ragdollAPTest.ly b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/Ragdoll_OldRagdollSerializationNoErrors.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/C14654882_Ragdoll_ragdollAPTest.ly rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/Ragdoll_OldRagdollSerializationNoErrors.ly diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/filelist.xml b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/filelist.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/level.pak b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14654882_Ragdoll_ragdollAPTest/level.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/tags.txt b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/tags.txt rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/terraintexture.pak b/AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_OldRagdollSerializationNoErrors/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/LevelData/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/C28978033_Ragdoll_WorldBodyBusTests.ly b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/Ragdoll_WorldBodyBusWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/C28978033_Ragdoll_WorldBodyBusTests.ly rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/Ragdoll_WorldBodyBusWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/TerrainTexture.pak b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/TerrainTexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/TerrainTexture.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/TerrainTexture.pak diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/filelist.xml b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/filelist.xml similarity index 72% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/filelist.xml rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/filelist.xml index 202292bf0a..92e5a16f35 100644 --- a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/level.pak b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/level.pak rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/AnimGraphPhysX.animgraph b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/AnimGraphPhysX.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/AnimGraphPhysX.animgraph rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/AnimGraphPhysX.animgraph diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/Blue.tif b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/Blue.tif similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/Blue.tif rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/Blue.tif diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/RinLocomotion.motionset b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/RinLocomotion.motionset similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/RinLocomotion.motionset rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/RinLocomotion.motionset diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/default.mtl b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/default.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/default.mtl rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/default.mtl diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_physics.animgraph b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_physics.animgraph similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_default/rin_physics.animgraph rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_physics.animgraph diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_skeleton_newgeo.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.fbx rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_skeleton_newgeo.fbx diff --git a/AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C28978033_Ragdoll_WorldBodyBusTests/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_skeleton_newgeo.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.mtl b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_skeleton_newgeo.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C4925582_Material_AddModifyDeleteOnRagdollBones/ragdoll_modified/rin_skeleton_newgeo.mtl rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/ragdoll_default/rin_skeleton_newgeo.mtl diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/tags.txt b/AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/tags.txt rename to AutomatedTesting/Levels/Physics/Ragdoll_WorldBodyBusWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/C4976194_RigidBody_PhysXComponentIsValid.ly b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/RigidBody_AddRigidBodyComponent.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/C4976194_RigidBody_PhysXComponentIsValid.ly rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/RigidBody_AddRigidBodyComponent.ly diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976194_RigidBody_PhysXComponentIsValid/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_AddRigidBodyComponent/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/C4976200_RigidBody_AngularDampingObjectRotation.ly b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/RigidBody_AngularDampingAffectsRotation.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/C4976200_RigidBody_AngularDampingObjectRotation.ly rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/RigidBody_AngularDampingAffectsRotation.ly diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/filelist.xml index c7a00e3be6..ad76ab3fe7 100644 --- a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_AngularDampingAffectsRotation/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/PhysXSedan/_dev_Sedan_r0-b.fbx b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/PhysXSedan/_dev_Sedan_r0-b.fbx similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/PhysXSedan/_dev_Sedan_r0-b.fbx rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/PhysXSedan/_dev_Sedan_r0-b.fbx diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/PhysXSedan/_dev_sedan_r0-b.fbx.assetinfo diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/PhysXSedan/_dev_sedan_r0-b.mtl b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/PhysXSedan/_dev_sedan_r0-b.mtl similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/PhysXSedan/_dev_sedan_r0-b.mtl rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/PhysXSedan/_dev_sedan_r0-b.mtl diff --git a/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/RigidBody_COM_ComputingWorks.ly b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/RigidBody_COM_ComputingWorks.ly new file mode 100644 index 0000000000..9e8e10cbae --- /dev/null +++ b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/RigidBody_COM_ComputingWorks.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:294ddb6a1da824ecddabbd671fa2f64cd02905c99475aa8c98af5fb41e9c8cdd +size 8698 diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ComputingWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/C4976210_COM_ManualSetting.ly b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/RigidBody_COM_ManualSettingWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/C4976210_COM_ManualSetting.ly rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/RigidBody_COM_ManualSettingWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976210_COM_ManualSetting/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_COM_ManualSettingWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/C13351703_COM_NotIncludeTriggerShapes.ly b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/RigidBody_COM_NotIncludesTriggerShapes.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/C13351703_COM_NotIncludeTriggerShapes.ly rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/RigidBody_COM_NotIncludesTriggerShapes.ly diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13351703_COM_NotIncludeTriggerShapes/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_COM_NotIncludesTriggerShapes/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/C4976218_RigidBodies_InertiaObjectNotComputed.ly b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/RigidBody_ComputeInertiaWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/C4976218_RigidBodies_InertiaObjectNotComputed.ly rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/RigidBody_ComputeInertiaWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/filelist.xml index 45a899e226..860defe32b 100644 --- a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982595_Collider_TriggerDisablesCollision/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976209_RigidBody_ComputesCOM/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_ComputeInertiaWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/C4976197_RigidBodies_InitialAngularVelocity.ly b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/RigidBody_InitialAngularVelocity.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/C4976197_RigidBodies_InitialAngularVelocity.ly rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/RigidBody_InitialAngularVelocity.ly diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/filelist.xml index 54e3a33d39..e457b443f7 100644 --- a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976197_RigidBodies_InitialAngularVelocity/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982797_Collider_ColliderOffset/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976218_RigidBodies_InertiaObjectNotComputed/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_InitialAngularVelocity/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/C4976195_RigidBodies_InitialLinearVelocity.ly b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/RigidBody_InitialLinearVelocity.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/C4976195_RigidBodies_InitialLinearVelocity.ly rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/RigidBody_InitialLinearVelocity.ly diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/filelist.xml index 0196dff132..df8bffb3ed 100644 --- a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/level.pak diff --git a/AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976195_RigidBodies_InitialLinearVelocity/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976227_Collider_NewGroup/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_InitialLinearVelocity/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/C4976207_PhysXRigidBodies_KinematicBehavior.ly b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/RigidBody_KinematicModeWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/C4976207_PhysXRigidBodies_KinematicBehavior.ly rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/RigidBody_KinematicModeWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976207_PhysXRigidBodies_KinematicBehavior/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_KinematicModeWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/C4976199_RigidBodies_LinearDampingObjectMotion.ly b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/RigidBody_LinearDampingAffectsMotion.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976199_RigidBodies_LinearDampingObjectMotion/C4976199_RigidBodies_LinearDampingObjectMotion.ly rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/RigidBody_LinearDampingAffectsMotion.ly diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/filelist.xml index c7a00e3be6..ad76ab3fe7 100644 --- a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976200_RigidBody_AngularDampingObjectRotation/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_LinearDampingAffectsMotion/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/C4976201_RigidBody_MassIsAssigned.ly b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/RigidBody_MassDifferentValuesWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/C4976201_RigidBody_MassIsAssigned.ly rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/RigidBody_MassDifferentValuesWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976201_RigidBody_MassIsAssigned/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4982798_Collider_ColliderRotationOffset/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_MassDifferentValuesWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/Layers/damping_bars_and_triggers.layer b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/Layers/damping_bars_and_triggers.layer similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/Layers/damping_bars_and_triggers.layer rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/Layers/damping_bars_and_triggers.layer diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/Layers/no_damping_bars.layer b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/Layers/no_damping_bars.layer similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/Layers/no_damping_bars.layer rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/Layers/no_damping_bars.layer diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/C13352089_RigidBodies_MaxAngularVelocity.ly b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/RigidBody_MaxAngularVelocityWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/C13352089_RigidBodies_MaxAngularVelocity.ly rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/RigidBody_MaxAngularVelocityWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/filelist.xml index fca6c56a65..ca6b51f34a 100644 --- a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13352089_RigidBodies_MaxAngularVelocity/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_MaxAngularVelocityWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/C5340400_RigidBody_ManualMomentOfInertia.ly b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/RigidBody_MomentOfInertiaManualSetting.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/C5340400_RigidBody_ManualMomentOfInertia.ly rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/RigidBody_MomentOfInertiaManualSetting.ly diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510644_Collider_CollisionGroups/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_MomentOfInertiaManualSetting/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/C14976307_Gravity_SetGravityWorks.ly b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/RigidBody_SetGravityWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/C14976307_Gravity_SetGravityWorks.ly rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/RigidBody_SetGravityWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/filelist.xml similarity index 73% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/filelist.xml index ce788cb735..a5b46d32ea 100644 --- a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976307_Gravity_SetGravityWorks/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932040_ForceRegion_CubeExertsWorldForce/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976244_Collider_SameGroupSameLayerCollision/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976242_Collision_SameCollisionlayerSameCollisiongroup/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_SetGravityWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/C4976202_RigidBody_StopsWhenBelowKineticThreshold.ly b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/RigidBody_SleepWhenBelowKineticThreshold.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/C4976202_RigidBody_StopsWhenBelowKineticThreshold.ly rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/RigidBody_SleepWhenBelowKineticThreshold.ly diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976202_RigidBody_StopsWhenBelowKineticThreshold/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_SleepWhenBelowKineticThreshold/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/C4976204_Verify_Start_Asleep_Condition.ly b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/RigidBody_StartAsleepWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/C4976204_Verify_Start_Asleep_Condition.ly rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/RigidBody_StartAsleepWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/filelist.xml similarity index 72% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/filelist.xml index 8b4484f96c..d2ce82359b 100644 --- a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976204_Verify_Start_Asleep_Condition/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5296614_PhysXMaterial_ColliderShape/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932042_PhysxForceRegion_LinearDamping/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976243_Collision_SameCollisionGroupDiffCollisionLayers/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_StartAsleepWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/C4976206_RigidBodies_VerifyGravity.ly b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/RigidBody_StartGravityEnabledWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/C4976206_RigidBodies_VerifyGravity.ly rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/RigidBody_StartGravityEnabledWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/filelist.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/filelist.xml similarity index 73% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/filelist.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/filelist.xml index 95411dfb91..8c02bcf6a6 100644 --- a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/filelist.xml +++ b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/level.pak b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/level.pak rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976206_RigidBodies_VerifyGravity/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/tags.txt b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/tags.txt rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689517_Verify_Terrain_Component/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/terraintexture.pak b/AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/terraintexture.pak rename to AutomatedTesting/Levels/Physics/RigidBody_StartGravityEnabledWorks/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas new file mode 100644 index 0000000000..ee9c1b92e0 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas @@ -0,0 +1,4718 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "ScriptCanvasData", + "ClassData": { + "m_scriptCanvas": { + "Id": { + "id": 18658814308844 + }, + "Name": "collision_events_script", + "Components": { + "Component_[13153882817173497697]": { + "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", + "Id": 13153882817173497697, + "m_graphData": { + "m_nodes": [ + { + "Id": { + "id": 18736123720172 + }, + "Name": "SC-Node(Print)", + "Components": { + "Component_[1173692688122057083]": { + "$type": "Print", + "Id": 1173692688122057083, + "Slots": [ + { + "id": { + "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "Input signal", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{5C006406-F28E-4060-8CB9-E80C0B10BBFD}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "m_format": "deac", + "m_unresolvedString": [ + "deac" + ] + } + } + }, + { + "Id": { + "id": 18684584112620 + }, + "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", + "Components": { + "Component_[12935774704733363494]": { + "$type": "(NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >", + "Id": 12935774704733363494, + "Slots": [ + { + "id": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: Entity Id", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Boolean", + "DisplayDataType": { + "m_type": 0 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: Entity Id" + } + ], + "Initialized": true + } + } + }, + { + "Id": { + "id": 18697469014508 + }, + "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", + "Components": { + "Component_[12935774704733363494]": { + "$type": "(NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >", + "Id": 12935774704733363494, + "Slots": [ + { + "id": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: Entity Id", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Boolean", + "DisplayDataType": { + "m_type": 0 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: Entity Id" + } + ], + "Initialized": true + } + } + }, + { + "Id": { + "id": 18706058949100 + }, + "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", + "Components": { + "Component_[12935774704733363494]": { + "$type": "(NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >", + "Id": 12935774704733363494, + "Slots": [ + { + "id": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: Entity Id", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Boolean", + "DisplayDataType": { + "m_type": 0 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: Entity Id" + } + ], + "Initialized": true + } + } + }, + { + "Id": { + "id": 18675994178028 + }, + "Name": "SC Node(GetVariable)", + "Components": { + "Component_[13696321695736204082]": { + "$type": "GetVariableNode", + "Id": 13696321695736204082, + "Slots": [ + { + "id": { + "m_id": "{7A817841-79D4-41FC-97DA-72E599A770CC}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "When signaled sends the property referenced by this node to a Data Output slot", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{6B862981-524C-4643-A2C2-9454CB1FD552}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "m_variableId": { + "m_id": "{C802DF6D-82C4-4648-81AD-99DB01A03B3B}" + }, + "m_variableDataOutSlotId": { + "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" + } + } + } + }, + { + "Id": { + "id": 18671699210732 + }, + "Name": "SC-EventNode(On Collision Begin event)", + "Components": { + "Component_[14000580813563007620]": { + "$type": "AzEventHandler", + "Id": 14000580813563007620, + "Slots": [ + { + "id": { + "m_id": "{74B54CB0-A72C-4A6A-ABB3-9EA6529DDF78}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18663109276140 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8DDBE14E-02C2-49A2-ABB1-47EC97B5D970}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{0EE06A10-EB10-4C5D-AB8F-D7B8B7A921E0}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8B0C1988-7783-42F5-A3C5-42184B5DC7FE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{E32049C5-FF99-4E74-91EC-D007B0D6EF7B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Simulated Body Handle", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Collision Event", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{F7A6B1A7-EB72-45DE-8A87-7C6E36FCA2A3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18663109276140 + } + } + ], + "slotName": "On Collision Begin event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "isNullPointer": false, + "$type": "{4C19E257-F929-524E-80E3-C910C5F3E2D9} Event const CollisionEvent& >*", + "label": "On Collision Begin event" + } + ], + "m_azEventEntry": { + "m_eventName": "On Collision Begin event", + "m_parameterSlotIds": [ + { + "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" + }, + { + "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" + } + ], + "m_parameterNames": [ + { + "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" + }, + { + "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" + } + ], + "m_eventSlotId": { + "m_id": "{F7A6B1A7-EB72-45DE-8A87-7C6E36FCA2A3}" + } + } + } + } + }, + { + "Id": { + "id": 18723238818284 + }, + "Name": "SC Node(GetVariable)", + "Components": { + "Component_[142618354415180427]": { + "$type": "GetVariableNode", + "Id": 142618354415180427, + "Slots": [ + { + "id": { + "m_id": "{245126A2-D7FE-4C59-BF8D-46F791EEE730}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "When signaled sends the property referenced by this node to a Data Output slot", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{DF9C6AFF-531F-4E74-80CC-1F6889A1CE9E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "m_variableId": { + "m_id": "{79C630E7-2ED7-40E9-929D-6D88FC32ADD9}" + }, + "m_variableDataOutSlotId": { + "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" + } + } + } + }, + { + "Id": { + "id": 18663109276140 + }, + "Name": "SC-Node(GetOnCollisionBeginEvent)", + "Components": { + "Component_[14536104846481825629]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 14536104846481825629, + "Slots": [ + { + "id": { + "m_id": "{C1CC691F-49A7-4348-89AD-F11BFBE3AFAE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{88B3237D-3297-4837-A80A-19ECAB4B4D61}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{5AD134C7-A8BC-4BE7-B815-68901BBEBE0D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{FCF4B185-2AD4-42BD-A304-B36B437CEA61}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event const CollisionEvent& >", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 2, + "methodName": "GetOnCollisionBeginEvent", + "className": "SimulatedBody", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "SimulatedBody" + } + } + }, + { + "Id": { + "id": 18727533785580 + }, + "Name": "EBusEventHandler", + "Components": { + "Component_[16532525056787595195]": { + "$type": "EBusEventHandler", + "Id": 16532525056787595195, + "Slots": [ + { + "id": { + "m_id": "{528D022F-3510-4351-8978-2B5B9B91CC7E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Connect", + "toolTip": "Connect this event handler to the specified entity.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{99136E6F-622A-46D0-A7B7-A304B587DFDB}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect this event handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8CC6ECD6-A855-4466-AEB9-BB822F6D1F62}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnConnected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{EBFCFEBE-286E-4BAB-9E96-B85C6ED3E15A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnDisconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{C3C7D5F3-362A-48F7-A743-6838ABAEFBB2}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnFailure", + "toolTip": "Signaled when it is not possible to connect this handler.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{910C1C48-E747-4C9E-80BF-2A2862BC9118}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Source", + "toolTip": "ID used to connect on a specific Event address (Type: EntityId)", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityActivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{69BA1262-6657-4F5A-B81D-8BAD804E8BD9}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{3439A9D1-B3B2-427A-82B6-86F5B75AD12D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityDeactivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Source" + } + ], + "m_eventMap": [ + { + "Key": { + "Value": 245425936 + }, + "Value": { + "m_eventName": "OnEntityActivated", + "m_eventId": { + "Value": 245425936 + }, + "m_eventSlotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" + } + ], + "m_numExpectedArguments": 1 + } + }, + { + "Key": { + "Value": 4273369222 + }, + "Value": { + "m_eventName": "OnEntityDeactivated", + "m_eventId": { + "Value": 4273369222 + }, + "m_eventSlotId": { + "m_id": "{3439A9D1-B3B2-427A-82B6-86F5B75AD12D}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{69BA1262-6657-4F5A-B81D-8BAD804E8BD9}" + } + ], + "m_numExpectedArguments": 1 + } + } + ], + "m_ebusName": "EntityBus", + "m_busId": { + "Value": 3358774020 + } + } + } + }, + { + "Id": { + "id": 18749008622060 + }, + "Name": "SC-Node(GetOnCollisionPersistEvent)", + "Components": { + "Component_[2456924078822417742]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 2456924078822417742, + "Slots": [ + { + "id": { + "m_id": "{76C563E8-85C7-4E2F-A09A-9D982064F966}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{7AE56C6B-CF55-4FC7-AA96-E5845B406017}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8A08ADFB-F581-40F8-B900-A5A968A11F6D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{79F0D577-9326-4334-A996-74E400870874}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event const CollisionEvent& >", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 2, + "methodName": "GetOnCollisionPersistEvent", + "className": "SimulatedBody", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "SimulatedBody" + } + } + }, + { + "Id": { + "id": 18667404243436 + }, + "Name": "SC-Node(ActivateGameEntity)", + "Components": { + "Component_[277081290396690505]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 277081290396690505, + "Slots": [ + { + "id": { + "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "ActivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18680289145324 + }, + "Name": "SC-Node(ActivateGameEntity)", + "Components": { + "Component_[277081290396690505]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 277081290396690505, + "Slots": [ + { + "id": { + "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "ActivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18744713654764 + }, + "Name": "SC-Node(ActivateGameEntity)", + "Components": { + "Component_[277081290396690505]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 277081290396690505, + "Slots": [ + { + "id": { + "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "ActivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18757598556652 + }, + "Name": "SC-Node(GetOnCollisionEndEvent)", + "Components": { + "Component_[6024679188177357420]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 6024679188177357420, + "Slots": [ + { + "id": { + "m_id": "{4C021C78-C51F-40AD-8D0C-E912A7216BEC}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{F0E14922-5337-4F26-91ED-E23E557B8723}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{84128820-5F2E-497F-9B13-A262484DE323}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B825CA1B-36A9-4634-8D66-0C510EC4D4E8}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event const CollisionEvent& >", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 2, + "methodName": "GetOnCollisionEndEvent", + "className": "SimulatedBody", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "SimulatedBody" + } + } + }, + { + "Id": { + "id": 18701763981804 + }, + "Name": "SC-EventNode(On Collision Persist event)", + "Components": { + "Component_[6434307319231468785]": { + "$type": "AzEventHandler", + "Id": 6434307319231468785, + "Slots": [ + { + "id": { + "m_id": "{EB9CE3A4-B8A4-4436-9E3C-026580D17AC3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18749008622060 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{E5E8BE86-5B33-452C-BC59-FE4A6482048E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{FBAFC668-BD77-4ABB-8B93-E030D02DF348}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{D37C1BFC-8EC1-4C8E-B6C3-FC036891A7ED}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1A994B40-F1C6-4F60-9F44-4CE42732554C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Simulated Body Handle", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Collision Event", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{210423A5-D203-4C26-9B62-2B7DBA3320BD}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18749008622060 + } + } + ], + "slotName": "On Collision Persist event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "isNullPointer": false, + "$type": "{4C19E257-F929-524E-80E3-C910C5F3E2D9} Event const CollisionEvent& >*", + "label": "On Collision Persist event" + } + ], + "m_azEventEntry": { + "m_eventName": "On Collision Persist event", + "m_parameterSlotIds": [ + { + "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + }, + { + "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + } + ], + "m_parameterNames": [ + { + "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + }, + { + "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + } + ], + "m_eventSlotId": { + "m_id": "{210423A5-D203-4C26-9B62-2B7DBA3320BD}" + } + } + } + } + }, + { + "Id": { + "id": 18731828752876 + }, + "Name": "SC-Node(DeactivateGameEntity)", + "Components": { + "Component_[846968981672785962]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 846968981672785962, + "Slots": [ + { + "id": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "DeactivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18753303589356 + }, + "Name": "SC-Node(DeactivateGameEntity)", + "Components": { + "Component_[846968981672785962]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 846968981672785962, + "Slots": [ + { + "id": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "DeactivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18761893523948 + }, + "Name": "SC-Node(DeactivateGameEntity)", + "Components": { + "Component_[846968981672785962]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 846968981672785962, + "Slots": [ + { + "id": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "DeactivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18718943850988 + }, + "Name": "SC-EventNode(On Collision End event)", + "Components": { + "Component_[8849170053396419306]": { + "$type": "AzEventHandler", + "Id": 8849170053396419306, + "Slots": [ + { + "id": { + "m_id": "{5F5A4D6A-50EF-4561-B5D3-F8CF1C4530F6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18757598556652 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{76FBE35A-BD29-4A8D-8B6E-AC6A2AD2306B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{2E933E93-BD7E-4B9D-A9F5-E1A15995E00B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1773DFC3-FCF8-43C6-8CBC-B2457A05EFD6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{FFBDBAC4-AF71-443C-BD6C-6C9E6BFAD858}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Simulated Body Handle", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Collision Event", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{BBC0A5CC-0C89-47E1-BDEE-2F21BF6053DC}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18757598556652 + } + } + ], + "slotName": "On Collision End event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "isNullPointer": false, + "$type": "{4C19E257-F929-524E-80E3-C910C5F3E2D9} Event const CollisionEvent& >*", + "label": "On Collision End event" + } + ], + "m_azEventEntry": { + "m_eventName": "On Collision End event", + "m_parameterSlotIds": [ + { + "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + }, + { + "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + } + ], + "m_parameterNames": [ + { + "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + }, + { + "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + } + ], + "m_eventSlotId": { + "m_id": "{BBC0A5CC-0C89-47E1-BDEE-2F21BF6053DC}" + } + } + } + } + }, + { + "Id": { + "id": 18693174047212 + }, + "Name": "SC-Node(Gate)", + "Components": { + "Component_[9013043030213821202]": { + "$type": "Gate", + "Id": 9013043030213821202, + "Slots": [ + { + "id": { + "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "Input signal", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "True", + "toolTip": "Signaled if the condition provided evaluates to true.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "False", + "toolTip": "Signaled if the condition provided evaluates to false.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Condition", + "toolTip": "If true the node will signal the Output and proceed execution", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 0 + }, + "isNullPointer": false, + "$type": "bool", + "value": false, + "label": "Condition" + } + ] + } + } + }, + { + "Id": { + "id": 18710353916396 + }, + "Name": "SC-Node(Gate)", + "Components": { + "Component_[9013043030213821202]": { + "$type": "Gate", + "Id": 9013043030213821202, + "Slots": [ + { + "id": { + "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "Input signal", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "True", + "toolTip": "Signaled if the condition provided evaluates to true.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "False", + "toolTip": "Signaled if the condition provided evaluates to false.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Condition", + "toolTip": "If true the node will signal the Output and proceed execution", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 0 + }, + "isNullPointer": false, + "$type": "bool", + "value": false, + "label": "Condition" + } + ] + } + } + }, + { + "Id": { + "id": 18714648883692 + }, + "Name": "SC-Node(Gate)", + "Components": { + "Component_[9013043030213821202]": { + "$type": "Gate", + "Id": 9013043030213821202, + "Slots": [ + { + "id": { + "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "Input signal", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "True", + "toolTip": "Signaled if the condition provided evaluates to true.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "False", + "toolTip": "Signaled if the condition provided evaluates to false.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Condition", + "toolTip": "If true the node will signal the Output and proceed execution", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 0 + }, + "isNullPointer": false, + "$type": "bool", + "value": false, + "label": "Condition" + } + ] + } + } + }, + { + "Id": { + "id": 18688879079916 + }, + "Name": "SC-Node(Print)", + "Components": { + "Component_[9237937767964082768]": { + "$type": "Print", + "Id": 9237937767964082768, + "Slots": [ + { + "id": { + "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "Input signal", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{97822986-7F0A-4831-BD73-C9AC4CF133DE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "m_format": "act", + "m_unresolvedString": [ + "act" + ] + } + } + }, + { + "Id": { + "id": 18740418687468 + }, + "Name": "SC Node(GetVariable)", + "Components": { + "Component_[9811908416249655657]": { + "$type": "GetVariableNode", + "Id": 9811908416249655657, + "Slots": [ + { + "id": { + "m_id": "{5A04BA4A-061E-4775-A6CE-713E298D4E9A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "When signaled sends the property referenced by this node to a Data Output slot", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B36D2C46-0A2B-4C90-B57C-5D9B7D3C1A63}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "toolTip": "Signaled after the referenced property has been pushed to the Data Output slot", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "m_variableId": { + "m_id": "{F1E1AFD6-DCE6-4A1F-AF22-59F2B7B943CC}" + }, + "m_variableDataOutSlotId": { + "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" + } + } + } + } + ], + "m_connections": [ + { + "Id": { + "id": 18766188491244 + }, + "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", + "Components": { + "Component_[8790567172666668723]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8790567172666668723, + "sourceEndpoint": { + "nodeId": { + "id": 18697469014508 + }, + "slotId": { + "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18693174047212 + }, + "slotId": { + "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" + } + } + } + } + }, + { + "Id": { + "id": 18770483458540 + }, + "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", + "Components": { + "Component_[2434331826651875004]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2434331826651875004, + "sourceEndpoint": { + "nodeId": { + "id": 18697469014508 + }, + "slotId": { + "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18693174047212 + }, + "slotId": { + "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" + } + } + } + } + }, + { + "Id": { + "id": 18774778425836 + }, + "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", + "Components": { + "Component_[11237921104715455686]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11237921104715455686, + "sourceEndpoint": { + "nodeId": { + "id": 18693174047212 + }, + "slotId": { + "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18761893523948 + }, + "slotId": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + } + } + } + } + }, + { + "Id": { + "id": 18779073393132 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", + "Components": { + "Component_[14362014279952360310]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 14362014279952360310, + "sourceEndpoint": { + "nodeId": { + "id": 18740418687468 + }, + "slotId": { + "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18697469014508 + }, + "slotId": { + "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" + } + } + } + } + }, + { + "Id": { + "id": 18783368360428 + }, + "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", + "Components": { + "Component_[16755694922186694113]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 16755694922186694113, + "sourceEndpoint": { + "nodeId": { + "id": 18693174047212 + }, + "slotId": { + "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18667404243436 + }, + "slotId": { + "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" + } + } + } + } + }, + { + "Id": { + "id": 18787663327724 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", + "Components": { + "Component_[1634747738940978819]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 1634747738940978819, + "sourceEndpoint": { + "nodeId": { + "id": 18740418687468 + }, + "slotId": { + "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18667404243436 + }, + "slotId": { + "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" + } + } + } + } + }, + { + "Id": { + "id": 18791958295020 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", + "Components": { + "Component_[8821531688847258487]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8821531688847258487, + "sourceEndpoint": { + "nodeId": { + "id": 18740418687468 + }, + "slotId": { + "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18761893523948 + }, + "slotId": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + } + } + } + } + }, + { + "Id": { + "id": 18796253262316 + }, + "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", + "Components": { + "Component_[8561478604291958262]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8561478604291958262, + "sourceEndpoint": { + "nodeId": { + "id": 18684584112620 + }, + "slotId": { + "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18714648883692 + }, + "slotId": { + "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" + } + } + } + } + }, + { + "Id": { + "id": 18800548229612 + }, + "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", + "Components": { + "Component_[9146734319289132197]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 9146734319289132197, + "sourceEndpoint": { + "nodeId": { + "id": 18684584112620 + }, + "slotId": { + "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18714648883692 + }, + "slotId": { + "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" + } + } + } + } + }, + { + "Id": { + "id": 18804843196908 + }, + "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", + "Components": { + "Component_[11833205937891498095]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11833205937891498095, + "sourceEndpoint": { + "nodeId": { + "id": 18706058949100 + }, + "slotId": { + "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18710353916396 + }, + "slotId": { + "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" + } + } + } + } + }, + { + "Id": { + "id": 18809138164204 + }, + "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", + "Components": { + "Component_[10467104857840052907]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 10467104857840052907, + "sourceEndpoint": { + "nodeId": { + "id": 18706058949100 + }, + "slotId": { + "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18710353916396 + }, + "slotId": { + "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" + } + } + } + } + }, + { + "Id": { + "id": 18813433131500 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", + "Components": { + "Component_[1012188603409101617]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 1012188603409101617, + "sourceEndpoint": { + "nodeId": { + "id": 18723238818284 + }, + "slotId": { + "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18684584112620 + }, + "slotId": { + "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" + } + } + } + } + }, + { + "Id": { + "id": 18817728098796 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", + "Components": { + "Component_[5402619035508314979]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 5402619035508314979, + "sourceEndpoint": { + "nodeId": { + "id": 18675994178028 + }, + "slotId": { + "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18706058949100 + }, + "slotId": { + "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" + } + } + } + } + }, + { + "Id": { + "id": 18822023066092 + }, + "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", + "Components": { + "Component_[18435267100506239768]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 18435267100506239768, + "sourceEndpoint": { + "nodeId": { + "id": 18714648883692 + }, + "slotId": { + "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18731828752876 + }, + "slotId": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + } + } + } + } + }, + { + "Id": { + "id": 18826318033388 + }, + "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", + "Components": { + "Component_[15164751479546717561]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 15164751479546717561, + "sourceEndpoint": { + "nodeId": { + "id": 18714648883692 + }, + "slotId": { + "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18744713654764 + }, + "slotId": { + "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" + } + } + } + } + }, + { + "Id": { + "id": 18830613000684 + }, + "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", + "Components": { + "Component_[5061560116223750730]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 5061560116223750730, + "sourceEndpoint": { + "nodeId": { + "id": 18710353916396 + }, + "slotId": { + "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18753303589356 + }, + "slotId": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + } + } + } + } + }, + { + "Id": { + "id": 18834907967980 + }, + "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", + "Components": { + "Component_[10711100284272855896]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 10711100284272855896, + "sourceEndpoint": { + "nodeId": { + "id": 18710353916396 + }, + "slotId": { + "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18680289145324 + }, + "slotId": { + "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" + } + } + } + } + }, + { + "Id": { + "id": 18839202935276 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", + "Components": { + "Component_[4394555422677501602]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 4394555422677501602, + "sourceEndpoint": { + "nodeId": { + "id": 18723238818284 + }, + "slotId": { + "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18731828752876 + }, + "slotId": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + } + } + } + } + }, + { + "Id": { + "id": 18843497902572 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", + "Components": { + "Component_[4685709028181371637]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 4685709028181371637, + "sourceEndpoint": { + "nodeId": { + "id": 18675994178028 + }, + "slotId": { + "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18753303589356 + }, + "slotId": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + } + } + } + } + }, + { + "Id": { + "id": 18847792869868 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", + "Components": { + "Component_[3306462520084951475]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 3306462520084951475, + "sourceEndpoint": { + "nodeId": { + "id": 18675994178028 + }, + "slotId": { + "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18680289145324 + }, + "slotId": { + "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" + } + } + } + } + }, + { + "Id": { + "id": 18852087837164 + }, + "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", + "Components": { + "Component_[17145465513158447772]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 17145465513158447772, + "sourceEndpoint": { + "nodeId": { + "id": 18761893523948 + }, + "slotId": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18736123720172 + }, + "slotId": { + "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" + } + } + } + } + }, + { + "Id": { + "id": 18856382804460 + }, + "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", + "Components": { + "Component_[14069026837818796272]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 14069026837818796272, + "sourceEndpoint": { + "nodeId": { + "id": 18667404243436 + }, + "slotId": { + "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18688879079916 + }, + "slotId": { + "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" + } + } + } + } + }, + { + "Id": { + "id": 18860677771756 + }, + "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", + "Components": { + "Component_[7728736156493449863]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 7728736156493449863, + "sourceEndpoint": { + "nodeId": { + "id": 18731828752876 + }, + "slotId": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18736123720172 + }, + "slotId": { + "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" + } + } + } + } + }, + { + "Id": { + "id": 18864972739052 + }, + "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", + "Components": { + "Component_[10386336352272981702]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 10386336352272981702, + "sourceEndpoint": { + "nodeId": { + "id": 18744713654764 + }, + "slotId": { + "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18688879079916 + }, + "slotId": { + "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" + } + } + } + } + }, + { + "Id": { + "id": 18869267706348 + }, + "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", + "Components": { + "Component_[16807949046056318365]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 16807949046056318365, + "sourceEndpoint": { + "nodeId": { + "id": 18753303589356 + }, + "slotId": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18736123720172 + }, + "slotId": { + "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" + } + } + } + } + }, + { + "Id": { + "id": 18873562673644 + }, + "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", + "Components": { + "Component_[13893900813580744359]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 13893900813580744359, + "sourceEndpoint": { + "nodeId": { + "id": 18680289145324 + }, + "slotId": { + "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18688879079916 + }, + "slotId": { + "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" + } + } + } + } + }, + { + "Id": { + "id": 18877857640940 + }, + "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Begin event: On Collision Begin event)", + "Components": { + "Component_[5183376729979850500]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 5183376729979850500, + "sourceEndpoint": { + "nodeId": { + "id": 18663109276140 + }, + "slotId": { + "m_id": "{FCF4B185-2AD4-42BD-A304-B36B437CEA61}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18671699210732 + }, + "slotId": { + "m_id": "{F7A6B1A7-EB72-45DE-8A87-7C6E36FCA2A3}" + } + } + } + } + }, + { + "Id": { + "id": 18882152608236 + }, + "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Out), destEndpoint=(On Collision Begin event: Connect)", + "Components": { + "Component_[2675455138680809572]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2675455138680809572, + "sourceEndpoint": { + "nodeId": { + "id": 18663109276140 + }, + "slotId": { + "m_id": "{5AD134C7-A8BC-4BE7-B815-68901BBEBE0D}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18671699210732 + }, + "slotId": { + "m_id": "{74B54CB0-A72C-4A6A-ABB3-9EA6529DDF78}" + } + } + } + } + }, + { + "Id": { + "id": 18886447575532 + }, + "Name": "srcEndpoint=(GetOnCollisionEndEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision End event: On Collision End event)", + "Components": { + "Component_[17579167564514469704]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 17579167564514469704, + "sourceEndpoint": { + "nodeId": { + "id": 18757598556652 + }, + "slotId": { + "m_id": "{B825CA1B-36A9-4634-8D66-0C510EC4D4E8}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18718943850988 + }, + "slotId": { + "m_id": "{BBC0A5CC-0C89-47E1-BDEE-2F21BF6053DC}" + } + } + } + } + }, + { + "Id": { + "id": 18890742542828 + }, + "Name": "srcEndpoint=(GetOnCollisionEndEvent: Out), destEndpoint=(On Collision End event: Connect)", + "Components": { + "Component_[8533738456407318471]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8533738456407318471, + "sourceEndpoint": { + "nodeId": { + "id": 18757598556652 + }, + "slotId": { + "m_id": "{84128820-5F2E-497F-9B13-A262484DE323}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18718943850988 + }, + "slotId": { + "m_id": "{5F5A4D6A-50EF-4561-B5D3-F8CF1C4530F6}" + } + } + } + } + }, + { + "Id": { + "id": 18895037510124 + }, + "Name": "srcEndpoint=(GetOnCollisionPersistEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Persist event: On Collision Persist event)", + "Components": { + "Component_[16307615877899068767]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 16307615877899068767, + "sourceEndpoint": { + "nodeId": { + "id": 18749008622060 + }, + "slotId": { + "m_id": "{79F0D577-9326-4334-A996-74E400870874}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18701763981804 + }, + "slotId": { + "m_id": "{210423A5-D203-4C26-9B62-2B7DBA3320BD}" + } + } + } + } + }, + { + "Id": { + "id": 18899332477420 + }, + "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", + "Components": { + "Component_[3566132196647215905]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 3566132196647215905, + "sourceEndpoint": { + "nodeId": { + "id": 18723238818284 + }, + "slotId": { + "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18744713654764 + }, + "slotId": { + "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" + } + } + } + } + }, + { + "Id": { + "id": 18903627444716 + }, + "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", + "Components": { + "Component_[15737173947743935362]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 15737173947743935362, + "sourceEndpoint": { + "nodeId": { + "id": 18740418687468 + }, + "slotId": { + "m_id": "{B36D2C46-0A2B-4C90-B57C-5D9B7D3C1A63}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18697469014508 + }, + "slotId": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + } + } + } + } + }, + { + "Id": { + "id": 18907922412012 + }, + "Name": "srcEndpoint=(On Collision Begin event: OnEvent), destEndpoint=(Get Variable: In)", + "Components": { + "Component_[6115424509860805504]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 6115424509860805504, + "sourceEndpoint": { + "nodeId": { + "id": 18671699210732 + }, + "slotId": { + "m_id": "{E32049C5-FF99-4E74-91EC-D007B0D6EF7B}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18740418687468 + }, + "slotId": { + "m_id": "{5A04BA4A-061E-4775-A6CE-713E298D4E9A}" + } + } + } + } + }, + { + "Id": { + "id": 18912217379308 + }, + "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", + "Components": { + "Component_[10250827968868397862]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 10250827968868397862, + "sourceEndpoint": { + "nodeId": { + "id": 18723238818284 + }, + "slotId": { + "m_id": "{DF9C6AFF-531F-4E74-80CC-1F6889A1CE9E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18684584112620 + }, + "slotId": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + } + } + } + } + }, + { + "Id": { + "id": 18916512346604 + }, + "Name": "srcEndpoint=(On Collision Persist event: OnEvent), destEndpoint=(Get Variable: In)", + "Components": { + "Component_[13286675358080560883]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 13286675358080560883, + "sourceEndpoint": { + "nodeId": { + "id": 18701763981804 + }, + "slotId": { + "m_id": "{1A994B40-F1C6-4F60-9F44-4CE42732554C}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18723238818284 + }, + "slotId": { + "m_id": "{245126A2-D7FE-4C59-BF8D-46F791EEE730}" + } + } + } + } + }, + { + "Id": { + "id": 18920807313900 + }, + "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", + "Components": { + "Component_[2090477647964111499]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2090477647964111499, + "sourceEndpoint": { + "nodeId": { + "id": 18675994178028 + }, + "slotId": { + "m_id": "{6B862981-524C-4643-A2C2-9454CB1FD552}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18706058949100 + }, + "slotId": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + } + } + } + } + }, + { + "Id": { + "id": 18925102281196 + }, + "Name": "srcEndpoint=(On Collision End event: OnEvent), destEndpoint=(Get Variable: In)", + "Components": { + "Component_[9355447111337093492]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 9355447111337093492, + "sourceEndpoint": { + "nodeId": { + "id": 18718943850988 + }, + "slotId": { + "m_id": "{FFBDBAC4-AF71-443C-BD6C-6C9E6BFAD858}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18675994178028 + }, + "slotId": { + "m_id": "{7A817841-79D4-41FC-97DA-72E599A770CC}" + } + } + } + } + }, + { + "Id": { + "id": 18929397248492 + }, + "Name": "srcEndpoint=(GetOnCollisionPersistEvent: Out), destEndpoint=(On Collision Persist event: Connect)", + "Components": { + "Component_[5892824244662462184]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 5892824244662462184, + "sourceEndpoint": { + "nodeId": { + "id": 18749008622060 + }, + "slotId": { + "m_id": "{8A08ADFB-F581-40F8-B900-A5A968A11F6D}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18701763981804 + }, + "slotId": { + "m_id": "{EB9CE3A4-B8A4-4436-9E3C-026580D17AC3}" + } + } + } + } + }, + { + "Id": { + "id": 18933692215788 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionPersistEvent: In)", + "Components": { + "Component_[8407246073220654261]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8407246073220654261, + "sourceEndpoint": { + "nodeId": { + "id": 18727533785580 + }, + "slotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18749008622060 + }, + "slotId": { + "m_id": "{7AE56C6B-CF55-4FC7-AA96-E5845B406017}" + } + } + } + } + }, + { + "Id": { + "id": 18937987183084 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionBeginEvent: In)", + "Components": { + "Component_[11979105462576985337]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11979105462576985337, + "sourceEndpoint": { + "nodeId": { + "id": 18727533785580 + }, + "slotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18663109276140 + }, + "slotId": { + "m_id": "{88B3237D-3297-4837-A80A-19ECAB4B4D61}" + } + } + } + } + }, + { + "Id": { + "id": 18942282150380 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionEndEvent: In)", + "Components": { + "Component_[2893952470811105255]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2893952470811105255, + "sourceEndpoint": { + "nodeId": { + "id": 18727533785580 + }, + "slotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18757598556652 + }, + "slotId": { + "m_id": "{F0E14922-5337-4F26-91ED-E23E557B8723}" + } + } + } + } + }, + { + "Id": { + "id": 18946577117676 + }, + "Name": "srcEndpoint=(EntityBus Handler: EntityID), destEndpoint=(GetOnCollisionPersistEvent: EntityID: 0)", + "Components": { + "Component_[13300330809619890896]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 13300330809619890896, + "sourceEndpoint": { + "nodeId": { + "id": 18727533785580 + }, + "slotId": { + "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18749008622060 + }, + "slotId": { + "m_id": "{76C563E8-85C7-4E2F-A09A-9D982064F966}" + } + } + } + } + }, + { + "Id": { + "id": 18950872084972 + }, + "Name": "srcEndpoint=(EntityBus Handler: EntityID), destEndpoint=(GetOnCollisionBeginEvent: EntityID: 0)", + "Components": { + "Component_[11318928191785921711]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11318928191785921711, + "sourceEndpoint": { + "nodeId": { + "id": 18727533785580 + }, + "slotId": { + "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18663109276140 + }, + "slotId": { + "m_id": "{C1CC691F-49A7-4348-89AD-F11BFBE3AFAE}" + } + } + } + } + }, + { + "Id": { + "id": 18955167052268 + }, + "Name": "srcEndpoint=(EntityBus Handler: EntityID), destEndpoint=(GetOnCollisionEndEvent: EntityID: 0)", + "Components": { + "Component_[13092135600400455568]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 13092135600400455568, + "sourceEndpoint": { + "nodeId": { + "id": 18727533785580 + }, + "slotId": { + "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18757598556652 + }, + "slotId": { + "m_id": "{4C021C78-C51F-40AD-8D0C-E912A7216BEC}" + } + } + } + } + } + ] + }, + "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", + "versionData": { + "_grammarVersion": 1, + "_runtimeVersion": 1 + }, + "m_variableCounter": 10, + "GraphCanvasData": [ + { + "Key": { + "id": 18658814308844 + }, + "Value": { + "ComponentData": { + "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { + "$type": "SceneComponentSaveData", + "ViewParams": { + "Scale": 0.6260976, + "AnchorX": 570.1986694335938, + "AnchorY": -218.8157196044922 + } + } + } + } + }, + { + "Key": { + "id": 18663109276140 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -900.0, + -300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{B9CA5B12-F636-47FE-804B-E11C972D4D8F}" + } + } + } + }, + { + "Key": { + "id": 18667404243436 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + -140.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{8B43E9D6-660F-4AD8-ABAF-D2CA12714C8C}" + } + } + } + }, + { + "Key": { + "id": 18671699210732 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -280.0, + -280.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{7DBDAF02-24F5-4FEF-97F6-5C71F5596B09}" + } + } + } + }, + { + "Key": { + "id": 18675994178028 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 220.0, + 460.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D2E4DE42-76F7-4B2E-838A-49EA403EA569}" + } + } + } + }, + { + "Key": { + "id": 18680289145324 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 560.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{DA5DCC2B-9E77-46F7-8CA9-A2FADE367B25}" + } + } + } + }, + { + "Key": { + "id": 18684584112620 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 600.0, + 100.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{FA508AFD-513D-4334-9760-909A9D4C765A}" + } + } + } + }, + { + "Key": { + "id": 18688879079916 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 2000.0, + 260.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{6EDB526D-EFA0-44C2-8A0C-9083BE1143D8}" + } + } + } + }, + { + "Key": { + "id": 18693174047212 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + -220.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D9B0DBAE-33BB-4DD0-853F-3609B859651E}" + } + } + } + }, + { + "Key": { + "id": 18697469014508 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 600.0, + -240.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{72129D0C-F4AF-4367-962F-BE9EEFC6A1C8}" + } + } + } + }, + { + "Key": { + "id": 18701763981804 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -280.0, + 60.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{752364F1-EDC4-42D0-82CB-84FFE27AE3BC}" + } + } + } + }, + { + "Key": { + "id": 18706058949100 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 600.0, + 460.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{2B76EE69-5338-4B1A-A4BE-98960F9F71D4}" + } + } + } + }, + { + "Key": { + "id": 18710353916396 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + 480.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D09C8DAB-49A0-41CB-89D1-302EA305B161}" + } + } + } + }, + { + "Key": { + "id": 18714648883692 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + 120.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{455C1E31-F37D-4EE7-B954-B0532C66EE2C}" + } + } + } + }, + { + "Key": { + "id": 18718943850988 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -280.0, + 420.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{DFC56761-5B10-4D07-A98F-32E24DFA4649}" + } + } + } + }, + { + "Key": { + "id": 18723238818284 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 200.0, + 100.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{4970AE58-0BC4-45EE-B2E9-E14AF347E91F}" + } + } + } + }, + { + "Key": { + "id": 18727533785580 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -1340.0, + -20.0 + ] + }, + "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { + "$type": "EBusHandlerNodeDescriptorSaveData", + "EventIds": [ + { + "Value": 245425936 + } + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{5D4F47C6-521E-46DB-9899-4E8E558A6329}" + } + } + } + }, + { + "Key": { + "id": 18731828752876 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 20.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{0722BECC-EBCA-43E3-8EEC-618BD189E739}" + } + } + } + }, + { + "Key": { + "id": 18736123720172 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 2000.0, + -160.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{389C6D5B-CE48-4C06-9A9C-BF8A63B50375}" + } + } + } + }, + { + "Key": { + "id": 18740418687468 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 200.0, + -240.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{6F168FFF-9795-4C98-803C-FC4903E0C0A9}" + } + } + } + }, + { + "Key": { + "id": 18744713654764 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 200.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{26BE8EF6-5AEC-42D8-AC7F-D380B460242D}" + } + } + } + }, + { + "Key": { + "id": 18749008622060 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -900.0, + 40.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{4B279432-B947-45C5-8BF0-473703906A28}" + } + } + } + }, + { + "Key": { + "id": 18753303589356 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 380.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{5DB80931-443B-48A6-9B96-79152E545DE9}" + } + } + } + }, + { + "Key": { + "id": 18757598556652 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -880.0, + 400.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{64E2639D-6884-4692-9008-CFDACD35023F}" + } + } + } + }, + { + "Key": { + "id": 18761893523948 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + -300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{453BE3A7-5198-45D2-A8C8-A343CAA048C1}" + } + } + } + } + ], + "StatisticsHelper": { + "InstanceCounter": [ + { + "Key": 191865528901450421, + "Value": 1 + }, + { + "Key": 2835305591036471195, + "Value": 1 + }, + { + "Key": 3743441789994958326, + "Value": 1 + }, + { + "Key": 4847610523576971761, + "Value": 3 + }, + { + "Key": 5842116761103598202, + "Value": 1 + }, + { + "Key": 8452971738487658154, + "Value": 3 + }, + { + "Key": 10098352573174582531, + "Value": 1 + }, + { + "Key": 10684225535275896474, + "Value": 2 + }, + { + "Key": 12203576718429312410, + "Value": 3 + }, + { + "Key": 13415940695654984187, + "Value": 1 + }, + { + "Key": 13774516199848960378, + "Value": 3 + }, + { + "Key": 13774516200723425656, + "Value": 3 + }, + { + "Key": 15357534523005742132, + "Value": 1 + } + ] + } + }, + "Component_[14322806170033042168]": { + "$type": "EditorGraphVariableManagerComponent", + "Id": 14322806170033042168, + "m_variableData": { + "m_nameVariableMap": [ + { + "Key": { + "m_id": "{79C630E7-2ED7-40E9-929D-6D88FC32ADD9}" + }, + "Value": { + "Datum": { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 4294967295 + }, + "label": "Persist Signal ID" + }, + "VariableId": { + "m_id": "{79C630E7-2ED7-40E9-929D-6D88FC32ADD9}" + }, + "VariableName": "Persist Signal ID", + "InitialValueSource": 1 + } + }, + { + "Key": { + "m_id": "{C802DF6D-82C4-4648-81AD-99DB01A03B3B}" + }, + "Value": { + "Datum": { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 4294967295 + }, + "label": "End Signal ID" + }, + "VariableId": { + "m_id": "{C802DF6D-82C4-4648-81AD-99DB01A03B3B}" + }, + "VariableName": "End Signal ID", + "InitialValueSource": 1 + } + }, + { + "Key": { + "m_id": "{F1E1AFD6-DCE6-4A1F-AF22-59F2B7B943CC}" + }, + "Value": { + "Datum": { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 4294967295 + }, + "label": "Begin Signal ID" + }, + "VariableId": { + "m_id": "{F1E1AFD6-DCE6-4A1F-AF22-59F2B7B943CC}" + }, + "VariableName": "Begin Signal ID", + "InitialValueSource": 1 + } + } + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/filelist.xml similarity index 71% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/filelist.xml index bf7e7eb587..65809b61c4 100644 --- a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712452_ScriptCanvas_CollisionEvents/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C4976245_PhysxCollider_CollisionLayerTest/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C19536274_NameNode_Prints/C19536274_NameNode_Prints.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_GetCollisionName/ScriptCanvas_GetCollisionName.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C19536274_NameNode_Prints/C19536274_NameNode_Prints.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_GetCollisionName/ScriptCanvas_GetCollisionName.ly diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/Raycast.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/Raycast.scriptcanvas similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/Raycast.scriptcanvas rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/Raycast.scriptcanvas diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/Raycast_2.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/Raycast_2.scriptcanvas similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/Raycast_2.scriptcanvas rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/Raycast_2.scriptcanvas diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/ScriptCanvas.png b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/ScriptCanvas.png similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/ScriptCanvas.png rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/ScriptCanvas.png diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/C12712453_ScriptCanvas_MultipleRaycastNode.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/ScriptCanvas_MultipleRaycastNode.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/C12712453_ScriptCanvas_MultipleRaycastNode.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/ScriptCanvas_MultipleRaycastNode.ly diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_no_tunnel.PNG b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_no_tunnel.PNG similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_no_tunnel.PNG rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_no_tunnel.PNG diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel.PNG b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel.PNG similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel.PNG rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel.PNG diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel_mouth.PNG b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel_mouth.PNG similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel_mouth.PNG rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/RayCast_level_tunnel_mouth.PNG diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/ScriptCanvas.PNG b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/ScriptCanvas.PNG similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/VisualDocumentation/ScriptCanvas.PNG rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/VisualDocumentation/ScriptCanvas.PNG diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712453_ScriptCanvas_MultipleRaycastNode/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932043_ForceRegion_SimpleDragOnRigidBody/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_MultipleRaycastNode/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/C12712454_ScriptCanvas_OverlapNodeVerification.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/ScriptCanvas_OverlapNode.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/C12712454_ScriptCanvas_OverlapNodeVerification.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/ScriptCanvas_OverlapNode.ly diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/filelist.xml index c25a3147d2..4324608b22 100644 --- a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712454_ScriptCanvas_OverlapNodeVerification/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932044_PhysX_ForceRegion_PointForceOnRigidBodies/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_OverlapNode/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/ScriptCanvas_PostPhysicsUpdate.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/ScriptCanvas_PostPhysicsUpdate.ly new file mode 100644 index 0000000000..a2ceb4e75c --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/ScriptCanvas_PostPhysicsUpdate.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:550c2842186ac5485024b1b08936415c67692937a6547859d6bd2a8611d17b7e +size 6592 diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5932045_ForceRegion_Spline/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas new file mode 100644 index 0000000000..f236bb5570 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/onpostphysicsupdate.scriptcanvas @@ -0,0 +1,115 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "ScriptCanvasData", + "ClassData": { + "m_scriptCanvas": { + "Id": { + "id": 12069610946668 + }, + "Name": "onpostphysicsupdate", + "Components": { + "Component_[15127005627920921763]": { + "$type": "EditorGraphVariableManagerComponent", + "Id": 15127005627920921763, + "m_variableData": { + "m_nameVariableMap": [ + { + "Key": { + "m_id": "{7B7643B6-2A99-4D2D-82F7-49F7E608CA28}" + }, + "Value": { + "Datum": { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "prev_position" + }, + "VariableId": { + "m_id": "{7B7643B6-2A99-4D2D-82F7-49F7E608CA28}" + }, + "VariableName": "prev_position" + } + } + ] + }, + "CopiedVariableRemapping": [ + { + "Key": { + "m_id": "{B66F614B-9534-4532-B257-C9F5469913C4}" + }, + "Value": { + "m_id": "{7B7643B6-2A99-4D2D-82F7-49F7E608CA28}" + } + } + ] + }, + "Component_[2111134076415671866]": { + "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", + "Id": 2111134076415671866, + "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", + "versionData": { + "_grammarVersion": 1, + "_runtimeVersion": 1 + }, + "GraphCanvasData": [ + { + "Key": { + "id": 12069610946668 + }, + "Value": { + "ComponentData": { + "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { + "$type": "SceneComponentSaveData", + "ViewParams": { + "Scale": 0.3323290271719053, + "AnchorX": -2025.1014404296875, + "AnchorY": -707.1305541992188 + } + } + } + } + } + ], + "CRCCacheMap": [ + { + "Key": { + "Value": 418594340 + }, + "Value": { + "String": "AZPhysicalWorld", + "Count": 3 + } + }, + { + "Key": { + "Value": 2068527459 + }, + "Value": { + "String": "Self", + "Count": 1 + } + }, + { + "Key": { + "Value": 3249382599 + }, + "Value": { + "String": "DefaultScene", + "Count": 1 + } + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902098_ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/ontick.scriptcanvas diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostPhysicsUpdate/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/ScriptCanvas_PostUpdateEvent.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/ScriptCanvas_PostUpdateEvent.ly new file mode 100644 index 0000000000..35c3674159 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/ScriptCanvas_PostUpdateEvent.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a2c9ad554554eba1021abe0baf0b3455da1aaab2bb8331eb240f79c89031636 +size 5202 diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14195074_ScriptCanvas_PostUpdateEvent/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PostUpdateEvent/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/C14902097_ScriptCanvas_PreUpdateEvent.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/C14902097_ScriptCanvas_PreUpdateEvent.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14902097_ScriptCanvas_PreUpdateEvent/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/C14976308_ScriptCanvas_SetKinematicTargetTransform.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/ScriptCanvas_SetKinematicTargetTransform.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/C14976308_ScriptCanvas_SetKinematicTargetTransform.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/ScriptCanvas_SetKinematicTargetTransform.ly diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/Signal.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/Signal.scriptcanvas similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/Signal.scriptcanvas rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/Signal.scriptcanvas diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C14976308_ScriptCanvas_SetKinematicTargetTransform/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959761_ForceRegion_ExertsPointForce_Sedan/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SetKinematicTargetTransform/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/C12712455_ScriptCanvas_ShapeCastVerification.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/filelist.xml index 36bb23e8d4..e07ddfafba 100644 --- a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C12712455_ScriptCanvas_ShapeCastVerification/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5340400_RigidBody_ManualMomentOfInertia/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/Ball_0.slice b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/Ball_0.slice similarity index 100% rename from AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/Ball_0.slice rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/Ball_0.slice diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/C6224408_ScriptCanvas_EntitySpawn.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/ScriptCanvas_SpawnEntityWithPhysComponents.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/C6224408_ScriptCanvas_EntitySpawn.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/ScriptCanvas_SpawnEntityWithPhysComponents.ly diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/filelist.xml index 9765b5376b..d04d7d2c18 100644 --- a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_SpawnEntityWithPhysComponents/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/C6274125_ScriptCanvas_TriggerEvents.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/ScriptCanvas_TriggerEvents.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/C6274125_ScriptCanvas_TriggerEvents.ly rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/ScriptCanvas_TriggerEvents.ly diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/filelist.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/filelist.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/level.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6274125_ScriptCanvas_TriggerEvents/level.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959763_ForceRegion_ForceRegionImpulsesCube/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/tags.txt b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/tags.txt rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terraintexture.pak b/AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ScriptCanvas_TriggerEvents/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.ly b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/ShapeCollider_CylinderShapeCollides.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.ly rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/ShapeCollider_CylinderShapeCollides.ly diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/filelist.xml similarity index 67% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/filelist.xml rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/filelist.xml index 344896222d..984d6023c5 100644 --- a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/filelist.xml +++ b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/level.pak b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/level.pak rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/tags.txt b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/tags.txt rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terraintexture.pak b/AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terraintexture.pak rename to AutomatedTesting/Levels/Physics/ShapeCollider_CylinderShapeCollides/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.ly b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/Terrain_AddPhysTerrainComponent.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.ly rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/Terrain_AddPhysTerrainComponent.ly diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/filelist.xml similarity index 68% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/filelist.xml index 870334d74d..88ab352775 100644 --- a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/level.pak b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/level.pak diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959759_RigidBody_ForceRegionSpherePointForce/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959764_ForceRegion_ForceRegionImpulsesCapsule/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689521_Terrain_NoCollisionAfterTerrainDeletion/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_AddPhysTerrainComponent/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/C5689524_MultipleTerrains_CheckWarningInConsole.ly b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/Terrain_CanAddMultipleTerrainComponents.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/C5689524_MultipleTerrains_CheckWarningInConsole.ly rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/Terrain_CanAddMultipleTerrainComponents.ly diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/filelist.xml similarity index 69% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/filelist.xml index cdc374d412..9fd843be84 100644 --- a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/level.pak b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959760_PhysxForceRegion_PointForceExertion/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959765_ForceRegion_AssetGetsImpulsed/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_CanAddMultipleTerrainComponents/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/PhysXEntity_collides_with_PhysXTerrain.ly b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/PhysXEntity_collides_with_PhysXTerrain.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/PhysXEntity_collides_with_PhysXTerrain.ly rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/PhysXEntity_collides_with_PhysXTerrain.ly diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/C5689518_PhysXEntity_collides_with_PhysXTerrain.ly b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/Terrain_CollisionAgainstRigidBody.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/C5689518_PhysXEntity_collides_with_PhysXTerrain.ly rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/Terrain_CollisionAgainstRigidBody.ly diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/level.pak b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689518_PhysXEntity_collides_with_PhysXTerrain/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959808_ForceRegion_PositionOffset/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689524_MultipleTerrains_CheckWarningInConsole/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_CollisionAgainstRigidBody/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m.ly b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m.ly rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m.ly diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/level.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959809_ForceRegion_RotationalOffset/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/1024x1024_32m/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/C6032082_Terrain_MultipleResolutionsValid_128x128_1m.ly b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/C6032082_Terrain_MultipleResolutionsValid_128x128_1m.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/C6032082_Terrain_MultipleResolutionsValid_128x128_1m.ly rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/C6032082_Terrain_MultipleResolutionsValid_128x128_1m.ly diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/level.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5959810_ForceRegion_ForceRegionCombinesForces/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/128x128_1m/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m.ly b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m.ly rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m.ly diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/level.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/4096x4096_16m/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/C6032082_Terrain_MultipleResolutionsValid_512x512_2m.ly b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/C6032082_Terrain_MultipleResolutionsValid_512x512_2m.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/C6032082_Terrain_MultipleResolutionsValid_512x512_2m.ly rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/C6032082_Terrain_MultipleResolutionsValid_512x512_2m.ly diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/level.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090547_ForceRegion_ParentChildForceRegions/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C5968760_ForceRegion_CheckNetForceChange/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleResolutionsValid/512x512_2m/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/C5689528_Terrain_MultipleTerrainComponents.ly b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/Terrain_MultipleTerrainComponentsWarning.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/C5689528_Terrain_MultipleTerrainComponents.ly rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/Terrain_MultipleTerrainComponentsWarning.ly diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/filelist.xml index 58e152177f..1e451d5e6b 100644 --- a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/level.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689528_Terrain_MultipleTerrainComponents/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090550_ForceRegion_WorldSpaceForceNegative/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689529_Verify_Terrain_RigidBody_Collider_Mesh/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_MultipleTerrainComponentsWarning/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/C3510642_Terrain_NotCollideWithTerrain.ly b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/Terrain_NoPhysTerrainComponentNoCollision.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/C3510642_Terrain_NotCollideWithTerrain.ly rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/Terrain_NoPhysTerrainComponentNoCollision.ly diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/level.pak b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C3510642_Terrain_NotCollideWithTerrain/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090551_ForceRegion_LocalSpaceForceNegative/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_128x128_1m/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_NoPhysTerrainComponentNoCollision/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/TerrainSlice.slice b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/TerrainSlice.slice similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/TerrainSlice.slice rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/TerrainSlice.slice diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/C5689531_Warning_TerrainSliceTerrainComponent.ly b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/Terrain_SpawnSecondTerrainComponentWarning.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/C5689531_Warning_TerrainSliceTerrainComponent.ly rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/Terrain_SpawnSecondTerrainComponentWarning.ly diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/filelist.xml similarity index 70% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/filelist.xml index 9c026b5b82..66907bcdd0 100644 --- a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/filelist.xml +++ b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/filelist.xml @@ -1,4 +1,4 @@ - + diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/level.pak b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090552_ForceRegion_LinearDampingNegative/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/GameTokens.xml b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/GameTokens.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/GameTokens.xml rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/GameTokens.xml diff --git a/AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090546_ForceRegion_SliceFileInstantiates/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C5689531_Warning_TerrainSliceTerrainComponent/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C6224408_ScriptCanvas_EntitySpawn/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_SpawnSecondTerrainComponentWarning/terraintexture.pak diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/C13508019_Terrain_TerrainTexturePainterWorks.ly b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/Terrain_TerrainTexturePainterWorks.ly similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/C13508019_Terrain_TerrainTexturePainterWorks.ly rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/Terrain_TerrainTexturePainterWorks.ly diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/filelist.xml b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/filelist.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/filelist.xml rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/filelist.xml diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/level.pak b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/level.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/level.pak rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/level.pak diff --git a/AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Environment.xml b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/Environment.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090553_ForceRegion_SimpleDragForceOnRigidBodies/leveldata/Environment.xml rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/Environment.xml diff --git a/AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/TerrainTexture.xml b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/TerrainTexture.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090554_ForceRegion_PointForceNegative/leveldata/TerrainTexture.xml rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/TerrainTexture.xml diff --git a/AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/TimeOfDay.xml b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/TimeOfDay.xml similarity index 100% rename from AutomatedTesting/Levels/Physics/C6032082_Terrain_MultipleResolutionsValid_512x512_2m/leveldata/TimeOfDay.xml rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/TimeOfDay.xml diff --git a/AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/VegetationMap.dat b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/VegetationMap.dat similarity index 100% rename from AutomatedTesting/Levels/Physics/C6131473_StaticSlice_OnDynamicSliceSpawn/leveldata/VegetationMap.dat rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/leveldata/VegetationMap.dat diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/material/levelmaterial.physmaterial b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/material/levelmaterial.physmaterial similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/material/levelmaterial.physmaterial rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/material/levelmaterial.physmaterial diff --git a/AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/tags.txt b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/tags.txt similarity index 100% rename from AutomatedTesting/Levels/Physics/C6090555_ForceRegion_SplineFollowOnRigidBodies/tags.txt rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/tags.txt diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terrain/terrain.pxheightfield b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/terrain/terrain.pxheightfield similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terrain/terrain.pxheightfield rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/terrain/terrain.pxheightfield diff --git a/AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terraintexture.pak b/AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/terraintexture.pak similarity index 100% rename from AutomatedTesting/Levels/Physics/C13508019_Terrain_TerrainTexturePainterWorks/terraintexture.pak rename to AutomatedTesting/Levels/Physics/Terrain_TerrainTexturePainterWorks/terraintexture.pak From 4220c52330b36509c438583b4b7b1bf545862ec7 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 19:52:11 +0200 Subject: [PATCH 149/355] Standarization: Python files Signed-off-by: ANT\aljanru --- .../Collider_MultipleSurfaceSlots}/test.fbx | 0 .../test.fbx.assetinfo | 0 .../Collider_MultipleSurfaceSlots}/test.mtl | 0 .../test.physmaterial | 0 .../SphereBot/R0-B_Body.fbx | 0 .../SphereBot/r0-b_body.fbx.assetinfo | 0 .../SphereBot/r0-b_body.mtl | 0 .../SphereBot/R0-B_Body.fbx | 0 .../SphereBot/r0-b_body.fbx.assetinfo | 0 .../SphereBot/r0-b_body.mtl | 0 .../test_asset.fbx | 0 .../test_asset.fbx.assetinfo | 0 .../test_asset.mtl | 0 .../Gem/PythonTests/NvCloth/TestSuite_Main.py | 8 +- .../NvCloth_AddClothSimulationToActor.py} | 6 +- .../NvCloth_AddClothSimulationToMesh.py} | 6 +- .../Gem/PythonTests/WhiteBox/CMakeLists.txt | 2 +- .../PythonTests/WhiteBox/FileManagement.py | 350 -------------- .../PythonTests/WhiteBox/ImportPathHelper.py | 11 - ...{TestSuite_Active.py => TestSuite_Main.py} | 13 +- .../WhiteBox_AddComponentToEntity.py} | 5 - .../WhiteBox_SetDefaultShape.py} | 5 - .../WhiteBox_SetInvisible.py} | 5 - .../physics/TestSuite_InDevelopment.py | 428 +++++------------ .../Gem/PythonTests/physics/TestSuite_Main.py | 55 ++- .../physics/TestSuite_Main_Optimized.py | 187 ++++---- .../PythonTests/physics/TestSuite_Periodic.py | 454 ++++++++++-------- .../PythonTests/physics/TestSuite_Sandbox.py | 8 +- .../terrain/C15308217_NoCrash_LevelSwitch.py | 105 ---- ...namicSliceWithPhysNotSpawnsStaticSlice.py} | 6 +- ...ndoRedoWorksOnEntityWithPhysComponents.py} | 6 +- ...derRigidBodyMeshAndTerrainWorkTogether.py} | 6 +- ...cs_WorldBodyBusWorksOnEditorComponents.py} | 6 +- .../CharacterController_SwitchLevels.py} | 8 +- .../Collider_AddColliderComponent.py} | 4 +- .../collider/Collider_AddingNewGroupWorks.py} | 6 +- .../collider/Collider_BoxShapeEditting.py} | 4 +- .../Collider_CapsuleShapeEditting.py} | 4 +- ...lider_CheckDefaultShapeSettingIsPxMesh.py} | 4 +- .../Collider_ColliderPositionOffset.py} | 6 +- .../Collider_ColliderRotationOffset.py} | 6 +- .../Collider_CollisionGroupsWorkflow.py} | 6 +- ...sionGroupDiffCollidingLayersNotCollide.py} | 6 +- .../Collider_MultipleSurfaceSlots.py} | 12 +- ..._NoneCollisionGroupSameLayerNotCollide.py} | 6 +- ...oAssignedWhenAddingRenderMeshComponent.py} | 12 +- ...signedWhenModifyingRenderMeshComponent.py} | 4 +- .../Collider_PxMeshConvexMeshCollides.py} | 8 +- .../collider/Collider_PxMeshErrorIfNoMesh.py} | 6 +- ..._PxMeshNotAutoAssignedWhenNoPhysicsFbx.py} | 8 +- ...er_SameCollisionGroupDiffLayersCollide.py} | 6 +- ...meCollisionGroupSameCustomLayerCollide.py} | 6 +- ...der_SameCollisionGroupSameLayerCollide.py} | 6 +- .../collider/Collider_SphereShapeEditting.py} | 4 +- .../collider/Collider_TriggerPassThrough.py} | 6 +- .../ForceRegion_CapsuleShapedForce.py} | 6 +- ...egion_DirectionHasNoAffectOnTotalForce.py} | 6 +- ...HighValuesDirectionAxesWorkWithNoError.py} | 6 +- ...ForceRegion_ImpulsesBoxShapedRigidBody.py} | 8 +- ...eRegion_ImpulsesCapsuleShapedRigidBody.py} | 6 +- ...ceRegion_ImpulsesPxMeshShapedRigidBody.py} | 6 +- ...Region_LinearDampingForceOnRigidBodies.py} | 6 +- ...rceRegion_LocalSpaceForceOnRigidBodies.py} | 6 +- ...egion_MovingForceRegionChangesNetForce.py} | 6 +- ...Region_MultipleComponentsCombineForces.py} | 6 +- ...ipleForcesInSameComponentCombineForces.py} | 6 +- ...egion_NoQuiverOnHighLinearDampingForce.py} | 6 +- ...eRegion_ParentChildForcesCombineForces.py} | 6 +- .../ForceRegion_PointForceOnRigidBodies.py} | 6 +- .../ForceRegion_PositionOffset.py} | 6 +- .../ForceRegion_PxMeshShapedForce.py} | 6 +- .../ForceRegion_RotationalOffset.py} | 6 +- ...rceRegion_SimpleDragForceOnRigidBodies.py} | 6 +- .../ForceRegion_SliceFileInstantiates.py} | 6 +- ...n_SmallMagnitudeDeviationOnLargeForces.py} | 6 +- .../ForceRegion_SphereShapedForce.py} | 6 +- .../ForceRegion_SplineForceOnRigidBodies.py} | 6 +- ...gion_SplineRegionWithModifiedTransform.py} | 6 +- ...ceRegion_WithNonTriggerColliderWarning.py} | 4 +- ...rceRegion_WorldSpaceForceOnRigidBodies.py} | 6 +- ...rceRegion_ZeroLinearDampingDoesNothing.py} | 6 +- ...eRegion_ZeroLocalSpaceForceDoesNothing.py} | 6 +- .../ForceRegion_ZeroPointForceDoesNothing.py} | 6 +- ...eRegion_ZeroSimpleDragForceDoesNothing.py} | 6 +- ...ForceRegion_ZeroSplineForceDoesNothing.py} | 6 +- ...eRegion_ZeroWorldSpaceForceDoesNothing.py} | 6 +- .../{ => tests}/joints/JointsHelper.py | 0 .../joints/Joints_Ball2BodiesConstrained.py} | 6 +- .../joints/Joints_BallBreakable.py} | 6 +- .../joints/Joints_BallLeadFollowerCollide.py} | 6 +- .../joints/Joints_BallNoLimitsConstrained.py} | 6 +- .../Joints_BallSoftLimitsConstrained.py} | 6 +- .../joints/Joints_Fixed2BodiesConstrained.py} | 6 +- .../joints/Joints_FixedBreakable.py} | 6 +- .../Joints_FixedLeadFollowerCollide.py} | 6 +- .../joints/Joints_GlobalFrameConstrained.py} | 6 +- .../joints/Joints_Hinge2BodiesConstrained.py} | 6 +- .../joints/Joints_HingeBreakable.py} | 6 +- .../Joints_HingeLeadFollowerCollide.py} | 6 +- .../Joints_HingeNoLimitsConstrained.py} | 6 +- .../Joints_HingeSoftLimitsConstrained.py} | 6 +- .../material/AddModifyDelete_Utils.py | 0 .../Material_CanBeAssignedToTerrain.py} | 6 +- .../material/Material_CharacterController.py} | 6 +- .../Material_ComponentsInSyncWithLibrary.py} | 6 +- ..._DefaultLibraryConsistentOnAllFeatures.py} | 6 +- ...efaultLibraryUpdatedAcrossLevels_after.py} | 10 +- ...faultLibraryUpdatedAcrossLevels_before.py} | 12 +- ...rial_DefaultMaterialLibraryChangesWork.py} | 6 +- .../material/Material_DynamicFriction.py} | 6 +- .../Material_EmptyLibraryUsesDefault.py} | 6 +- .../material/Material_FrictionCombine.py} | 6 +- .../Material_FrictionCombinePriorityOrder.py} | 6 +- ...aterial_LibraryChangesReflectInstantly.py} | 4 +- ...Material_LibraryClearingAssignsDefault.py} | 4 +- ...OperationsReflectOnCharacterController.py} | 6 +- ...LibraryCrudOperationsReflectOnCollider.py} | 6 +- ...aryCrudOperationsReflectOnRagdollBones.py} | 6 +- ..._LibraryCrudOperationsReflectOnTerrain.py} | 6 +- .../Material_LibraryUpdatedAcrossLevels.py} | 8 +- .../Material_NoEffectIfNoColliderShape.py} | 8 +- ...ial_PerFaceMaterialGetsCorrectMaterial.py} | 6 +- .../material/Material_RagdollBones.py} | 6 +- .../material/Material_Restitution.py} | 6 +- .../material/Material_RestitutionCombine.py} | 6 +- ...terial_RestitutionCombinePriorityOrder.py} | 6 +- .../material/Material_StaticFriction.py} | 6 +- .../material/Physmaterial_Editor.py | 0 .../Ragdoll_AddPhysxRagdollComponentWorks.py} | 4 +- .../Ragdoll_LevelSwitchDoesNotCrash.py} | 14 +- ...agdoll_OldRagdollSerializationNoErrors.py} | 6 +- .../ragdoll/Ragdoll_WorldBodyBusWorks.py} | 6 +- .../RigidBody_AddRigidBodyComponent.py} | 6 +- ...igidBody_AngularDampingAffectsRotation.py} | 6 +- .../RigidBody_COM_ComputingWorks.py} | 7 +- .../RigidBody_COM_ManualSettingWorks.py} | 6 +- ...RigidBody_COM_NotIncludesTriggerShapes.py} | 6 +- .../RigidBody_ComputeInertiaWorks.py} | 6 +- .../RigidBody_EnablingGravityWorksPoC.py} | 8 +- ...blingGravityWorksUsingNotificationsPoC.py} | 4 +- .../RigidBody_InitialAngularVelocity.py} | 6 +- .../RigidBody_InitialLinearVelocity.py} | 6 +- .../RigidBody_KinematicModeWorks.py} | 6 +- .../RigidBody_LinearDampingAffectsMotion.py} | 6 +- .../RigidBody_MassDifferentValuesWorks.py} | 6 +- .../RigidBody_MaxAngularVelocityWorks.py} | 6 +- ...RigidBody_MomentOfInertiaManualSetting.py} | 6 +- .../rigid_body/RigidBody_SetGravityWorks.py} | 6 +- ...gidBody_SleepWhenBelowKineticThreshold.py} | 6 +- .../rigid_body/RigidBody_StartAsleepWorks.py} | 6 +- .../RigidBody_StartGravityEnabledWorks.py} | 8 +- .../ScriptCanvas_CollisionEvents.py} | 6 +- ...riptCanvas_GetCollisionNameReturnsName.py} | 4 +- ...nNameReturnsNothingWhenHasToggledLayer.py} | 4 +- .../ScriptCanvas_MultipleRaycastNode.py} | 6 +- .../ScriptCanvas_OverlapNode.py} | 6 +- .../ScriptCanvas_PostPhysicsUpdate.py} | 6 +- .../ScriptCanvas_PostUpdateEvent.py} | 6 +- .../ScriptCanvas_PreUpdateEvent.py} | 6 +- ...riptCanvas_SetKinematicTargetTransform.py} | 6 +- .../script_canvas/ScriptCanvas_ShapeCast.py} | 6 +- ...ptCanvas_SpawnEntityWithPhysComponents.py} | 6 +- .../ScriptCanvas_TriggerEvents.py} | 6 +- .../ShapeCollider_CanBeAddedWitNoWarnings.py} | 4 +- .../ShapeCollider_CylinderShapeCollides.py} | 6 +- ...eCollider_InactiveWhenNoShapeComponent.py} | 4 +- ...eNumberOfShapeCollidersWontCrashEditor.py} | 4 +- .../Terrain_AddPhysTerrainComponent.py} | 6 +- ...errain_CanAddMultipleTerrainComponents.py} | 6 +- .../Terrain_CollisionAgainstRigidBody.py} | 6 +- .../Terrain_MultipleResolutionsValid.py} | 12 +- ...rrain_MultipleTerrainComponentsWarning.py} | 6 +- ...rain_NoPhysTerrainComponentNoCollision.py} | 6 +- ...ain_SpawnSecondTerrainComponentWarning.py} | 6 +- .../Terrain_TerrainTexturePainterWorks.py} | 6 +- .../physics/utils/FileManagement.py | 4 +- .../ScriptCanvas_CollisionEvents.ly | 3 + .../ScriptCanvas_ShapeCast.ly | 4 +- 178 files changed, 959 insertions(+), 1579 deletions(-) rename AutomatedTesting/Assets/{C4044695_PhysXCollider_AddMultipleSurfaceFbx => Physics/Collider_MultipleSurfaceSlots}/test.fbx (100%) rename AutomatedTesting/Assets/{C4044695_PhysXCollider_AddMultipleSurfaceFbx => Physics/Collider_MultipleSurfaceSlots}/test.fbx.assetinfo (100%) rename AutomatedTesting/Assets/{C4044695_PhysXCollider_AddMultipleSurfaceFbx => Physics/Collider_MultipleSurfaceSlots}/test.mtl (100%) rename AutomatedTesting/Assets/{C4044695_PhysXCollider_AddMultipleSurfaceFbx => Physics/Collider_MultipleSurfaceSlots}/test.physmaterial (100%) rename AutomatedTesting/Assets/{C14861501_PhysXCollider_RenderMeshAutoAssigned => Physics/Collider_PxMeshAutoAssigned}/SphereBot/R0-B_Body.fbx (100%) rename AutomatedTesting/Assets/{C14861501_PhysXCollider_RenderMeshAutoAssigned => Physics/Collider_PxMeshAutoAssigned}/SphereBot/r0-b_body.fbx.assetinfo (100%) rename AutomatedTesting/Assets/{C14861501_PhysXCollider_RenderMeshAutoAssigned => Physics/Collider_PxMeshAutoAssigned}/SphereBot/r0-b_body.mtl (100%) rename AutomatedTesting/Assets/{C4982803_Enable_PxMesh_Option => Physics/Collider_PxMeshConvexMeshCollides}/SphereBot/R0-B_Body.fbx (100%) rename AutomatedTesting/Assets/{C4982803_Enable_PxMesh_Option => Physics/Collider_PxMeshConvexMeshCollides}/SphereBot/r0-b_body.fbx.assetinfo (100%) rename AutomatedTesting/Assets/{C4982803_Enable_PxMesh_Option => Physics/Collider_PxMeshConvexMeshCollides}/SphereBot/r0-b_body.mtl (100%) rename AutomatedTesting/Assets/{C14861504_RenderMeshAsset_WithNoPxAsset => Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx}/test_asset.fbx (100%) rename AutomatedTesting/Assets/{C14861504_RenderMeshAsset_WithNoPxAsset => Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx}/test_asset.fbx.assetinfo (100%) rename AutomatedTesting/Assets/{C14861504_RenderMeshAsset_WithNoPxAsset => Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx}/test_asset.mtl (100%) rename AutomatedTesting/Gem/PythonTests/NvCloth/{C18977330_NvCloth_AddClothSimulationToActor.py => tests/NvCloth_AddClothSimulationToActor.py} (93%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/NvCloth/{C18977329_NvCloth_AddClothSimulationToMesh.py => tests/NvCloth_AddClothSimulationToMesh.py} (93%) mode change 100755 => 100644 delete mode 100755 AutomatedTesting/Gem/PythonTests/WhiteBox/FileManagement.py delete mode 100755 AutomatedTesting/Gem/PythonTests/WhiteBox/ImportPathHelper.py rename AutomatedTesting/Gem/PythonTests/WhiteBox/{TestSuite_Active.py => TestSuite_Main.py} (61%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/WhiteBox/{C28798177_WhiteBox_AddComponentToEntity.py => tests/WhiteBox_AddComponentToEntity.py} (93%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/WhiteBox/{C29279329_WhiteBox_SetDefaultShape.py => tests/WhiteBox_SetDefaultShape.py} (97%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/WhiteBox/{C28798205_WhiteBox_SetInvisible.py => tests/WhiteBox_SetInvisible.py} (95%) mode change 100755 => 100644 mode change 100755 => 100644 AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py delete mode 100644 AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py rename AutomatedTesting/Gem/PythonTests/physics/{general/C6131473_StaticSlice_OnDynamicSliceSpawn.py => tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{general/C15425929_Undo_Redo.py => tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py} (93%) rename AutomatedTesting/Gem/PythonTests/physics/{general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py => tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py} (93%) rename AutomatedTesting/Gem/PythonTests/physics/{general/C29032500_EditorComponents_WorldBodyBusWorks.py => tests/Physics_WorldBodyBusWorksOnEditorComponents.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{character_controller/C14654881_CharacterController_SwitchLevels.py => tests/character_controller/CharacterController_SwitchLevels.py} (90%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4976236_AddPhysxColliderComponent.py => tests/collider/Collider_AddColliderComponent.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4976227_Collider_NewGroup.py => tests/collider/Collider_AddingNewGroupWorks.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982801_PhysXColliderShape_CanBeSelected.py => tests/collider/Collider_BoxShapeEditting.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982802_PhysXColliderShape_CanBeSelected.py => tests/collider/Collider_CapsuleShapeEditting.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C14861500_DefaultSetting_ColliderShape.py => tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982797_Collider_ColliderOffset.py => tests/collider/Collider_ColliderPositionOffset.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982798_Collider_ColliderRotationOffset.py => tests/collider/Collider_ColliderRotationOffset.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C3510644_Collider_CollisionGroups.py => tests/collider/Collider_CollisionGroupsWorkflow.py} (99%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982593_PhysXCollider_CollisionLayerTest.py => tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py => tests/collider/Collider_MultipleSurfaceSlots.py} (92%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4976245_PhysXCollider_CollisionLayerTest.py => tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py => tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py} (88%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C14861502_PhysXCollider_AssetAutoAssigned.py => tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982803_Enable_PxMesh_Option.py => tests/collider/Collider_PxMeshConvexMeshCollides.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C14861498_ConfirmError_NoPxMesh.py => tests/collider/Collider_PxMeshErrorIfNoMesh.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C14861504_RenderMeshAsset_WithNoPxAsset.py => tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py} (93%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py => tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4976244_Collider_SameGroupSameLayerCollision.py => tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py => tests/collider/Collider_SameCollisionGroupSameLayerCollide.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982800_PhysXColliderShape_CanBeSelected.py => tests/collider/Collider_SphereShapeEditting.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C4982595_Collider_TriggerDisablesCollision.py => tests/collider/Collider_TriggerPassThrough.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959760_PhysXForceRegion_PointForceExertion.py => tests/force_region/ForceRegion_CapsuleShapedForce.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py => tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6321601_Force_HighValuesDirectionAxes.py => tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py => tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py => tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959765_ForceRegion_AssetGetsImpulsed.py => tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5932042_PhysXForceRegion_LinearDamping.py => tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py => tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5968760_ForceRegion_CheckNetForceChange.py => tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py => tests/force_region/ForceRegion_MultipleComponentsCombineForces.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py => tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C15845879_ForceRegion_HighLinearDampingForce.py => tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090547_ForceRegion_ParentChildForceRegions.py => tests/force_region/ForceRegion_ParentChildForcesCombineForces.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5932044_ForceRegion_PointForceOnRigidBody.py => tests/force_region/ForceRegion_PointForceOnRigidBodies.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959808_ForceRegion_PositionOffset.py => tests/force_region/ForceRegion_PositionOffset.py} (99%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py => tests/force_region/ForceRegion_PxMeshShapedForce.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959809_ForceRegion_RotationalOffset.py => tests/force_region/ForceRegion_RotationalOffset.py} (99%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py => tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090546_ForceRegion_SliceFileInstantiates.py => tests/force_region/ForceRegion_SliceFileInstantiates.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C12905527_ForceRegion_MagnitudeDeviation.py => tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py => tests/force_region/ForceRegion_SphereShapedForce.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5932045_ForceRegion_Spline.py => tests/force_region/ForceRegion_SplineForceOnRigidBodies.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C12868580_ForceRegion_SplineModifiedTransform.py => tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C12905528_ForceRegion_WithNonTriggerCollider.py => tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C5932040_ForceRegion_CubeExertsWorldForce.py => tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090552_ForceRegion_LinearDampingNegative.py => tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py => tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090554_ForceRegion_PointForceNegative.py => tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py => tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py => tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py => tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{ => tests}/joints/JointsHelper.py (100%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243588_Joints_Ball2BodiesConstrained.py => tests/joints/Joints_Ball2BodiesConstrained.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243592_Joints_BallBreakable.py => tests/joints/Joints_BallBreakable.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243591_Joints_BallLeadFollowerCollide.py => tests/joints/Joints_BallLeadFollowerCollide.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243590_Joints_BallNoLimitsConstrained.py => tests/joints/Joints_BallNoLimitsConstrained.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243589_Joints_BallSoftLimitsConstrained.py => tests/joints/Joints_BallSoftLimitsConstrained.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243580_Joints_Fixed2BodiesConstrained.py => tests/joints/Joints_Fixed2BodiesConstrained.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243581_Joints_FixedBreakable.py => tests/joints/Joints_FixedBreakable.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243582_Joints_FixedLeadFollowerCollide.py => tests/joints/Joints_FixedLeadFollowerCollide.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243593_Joints_GlobalFrameConstrained.py => tests/joints/Joints_GlobalFrameConstrained.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243583_Joints_Hinge2BodiesConstrained.py => tests/joints/Joints_Hinge2BodiesConstrained.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243587_Joints_HingeBreakable.py => tests/joints/Joints_HingeBreakable.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243586_Joints_HingeLeadFollowerCollide.py => tests/joints/Joints_HingeLeadFollowerCollide.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243585_Joints_HingeNoLimitsConstrained.py => tests/joints/Joints_HingeNoLimitsConstrained.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{joints/C18243584_Joints_HingeSoftLimitsConstrained.py => tests/joints/Joints_HingeSoftLimitsConstrained.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{ => tests}/material/AddModifyDelete_Utils.py (100%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4925577_Materials_MaterialAssignedToTerrain.py => tests/material/Material_CanBeAssignedToTerrain.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py => tests/material/Material_CharacterController.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15308221_Material_ComponentsInSyncWithLibrary.py => tests/material/Material_ComponentsInSyncWithLibrary.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15096735_Materials_DefaultLibraryConsistency.py => tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py} (99%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py => tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py => tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15096737_Materials_DefaultMaterialLibraryChanges.py => tests/material/Material_DefaultMaterialLibraryChangesWork.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044459_Material_DynamicFriction.py => tests/material/Material_DynamicFriction.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044694_Material_EmptyLibraryUsesDefault.py => tests/material/Material_EmptyLibraryUsesDefault.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044456_Material_FrictionCombine.py => tests/material/Material_FrictionCombine.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C18977601_Material_FrictionCombinePriority.py => tests/material/Material_FrictionCombinePriorityOrder.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044455_Material_libraryChangesInstantly.py => tests/material/Material_LibraryChangesReflectInstantly.py} (99%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15096740_Material_LibraryUpdatedCorrectly.py => tests/material/Material_LibraryClearingAssignsDefault.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15563573_Material_AddModifyDeleteOnCharacterController.py => tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4888315_Material_AddModifyDeleteOnCollider.py => tests/material/Material_LibraryCrudOperationsReflectOnCollider.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4925582_Material_AddModifyDeleteOnRagdollBones.py => tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4925579_Material_AddModifyDeleteOnTerrain.py => tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C15425935_Material_LibraryUpdatedAcrossLevels.py => tests/material/Material_LibraryUpdatedAcrossLevels.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C5296614_PhysXMaterial_ColliderShape.py => tests/material/Material_NoEffectIfNoColliderShape.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044697_Material_PerfaceMaterialValidation.py => tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4925580_Material_RagdollBonesMaterial.py => tests/material/Material_RagdollBones.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044461_Material_Restitution.py => tests/material/Material_Restitution.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044457_Material_RestitutionCombine.py => tests/material/Material_RestitutionCombine.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C18981526_Material_RestitutionCombinePriority.py => tests/material/Material_RestitutionCombinePriorityOrder.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{material/C4044460_Material_StaticFriction.py => tests/material/Material_StaticFriction.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{ => tests}/material/Physmaterial_Editor.py (100%) rename AutomatedTesting/Gem/PythonTests/physics/{ragdoll/C17411467_AddPhysxRagdollComponent.py => tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{ragdoll/C13895144_Ragdoll_ChangeLevel.py => tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py} (86%) rename AutomatedTesting/Gem/PythonTests/physics/{ragdoll/C14654882_Ragdoll_ragdollAPTest.py => tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py => tests/ragdoll/Ragdoll_WorldBodyBusWorks.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py => tests/rigid_body/RigidBody_AddRigidBodyComponent.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py => tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976209_RigidBody_ComputesCOM.py => tests/rigid_body/RigidBody_COM_ComputingWorks.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976210_COM_ManualSetting.py => tests/rigid_body/RigidBody_COM_ManualSettingWorks.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C13351703_COM_NotIncludeTriggerShapes.py => tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py => tests/rigid_body/RigidBody_ComputeInertiaWorks.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C100000_RigidBody_EnablingGravityWorksPoC.py => tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py} (92%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py => tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py => tests/rigid_body/RigidBody_InitialAngularVelocity.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py => tests/rigid_body/RigidBody_InitialLinearVelocity.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py => tests/rigid_body/RigidBody_KinematicModeWorks.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py => tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976201_RigidBody_MassIsAssigned.py => tests/rigid_body/RigidBody_MassDifferentValuesWorks.py} (99%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py => tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py => tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{general/C14976307_Gravity_SetGravityWorks.py => tests/rigid_body/RigidBody_SetGravityWorks.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py => tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976204_Verify_Start_Asleep_Condition.py => tests/rigid_body/RigidBody_StartAsleepWorks.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{rigid_body/C4976206_RigidBodies_GravityEnabledActive.py => tests/rigid_body/RigidBody_StartGravityEnabledWorks.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C12712452_ScriptCanvas_CollisionEvents.py => tests/script_canvas/ScriptCanvas_CollisionEvents.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{general/C19536274_GetCollisionName_PrintsName.py => tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{general/C19536277_GetCollisionName_PrintsNothing.py => tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py} (93%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py => tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py => tests/script_canvas/ScriptCanvas_OverlapNode.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py => tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py => tests/script_canvas/ScriptCanvas_PostUpdateEvent.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py => tests/script_canvas/ScriptCanvas_PreUpdateEvent.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py => tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py} (98%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py => tests/script_canvas/ScriptCanvas_ShapeCast.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C6224408_ScriptCanvas_EntitySpawn.py => tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{script_canvas/C6274125_ScriptCanvas_TriggerEvents.py => tests/script_canvas/ScriptCanvas_TriggerEvents.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C19578021_ShapeCollider_CanBeAdded.py => tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py => tests/shape_collider/ShapeCollider_CylinderShapeCollides.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C19578018_ShapeColliderWithNoShapeComponent.py => tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{collider/C19723164_ShapeColliders_WontCrashEditor.py => tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py => tests/terrain/Terrain_AddPhysTerrainComponent.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py => tests/terrain/Terrain_CanAddMultipleTerrainComponents.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py => tests/terrain/Terrain_CollisionAgainstRigidBody.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C6032082_Terrain_MultipleResolutionsValid.py => tests/terrain/Terrain_MultipleResolutionsValid.py} (96%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C5689528_Terrain_MultipleTerrainComponents.py => tests/terrain/Terrain_MultipleTerrainComponentsWarning.py} (94%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C3510642_Terrain_NotCollideWithTerrain.py => tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py} (97%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C5689531_Warning_TerrainSliceTerrainComponent.py => tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py} (95%) rename AutomatedTesting/Gem/PythonTests/physics/{terrain/C13508019_Terrain_TerrainTexturePainterWorks.py => tests/terrain/Terrain_TerrainTexturePainterWorks.py} (96%) create mode 100644 AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly diff --git a/AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.fbx b/AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.fbx similarity index 100% rename from AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.fbx rename to AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.fbx diff --git a/AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.fbx.assetinfo b/AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.fbx.assetinfo rename to AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.fbx.assetinfo diff --git a/AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.mtl b/AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.mtl similarity index 100% rename from AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.mtl rename to AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.mtl diff --git a/AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.physmaterial b/AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.physmaterial similarity index 100% rename from AutomatedTesting/Assets/C4044695_PhysXCollider_AddMultipleSurfaceFbx/test.physmaterial rename to AutomatedTesting/Assets/Physics/Collider_MultipleSurfaceSlots/test.physmaterial diff --git a/AutomatedTesting/Assets/C14861501_PhysXCollider_RenderMeshAutoAssigned/SphereBot/R0-B_Body.fbx b/AutomatedTesting/Assets/Physics/Collider_PxMeshAutoAssigned/SphereBot/R0-B_Body.fbx similarity index 100% rename from AutomatedTesting/Assets/C14861501_PhysXCollider_RenderMeshAutoAssigned/SphereBot/R0-B_Body.fbx rename to AutomatedTesting/Assets/Physics/Collider_PxMeshAutoAssigned/SphereBot/R0-B_Body.fbx diff --git a/AutomatedTesting/Assets/C14861501_PhysXCollider_RenderMeshAutoAssigned/SphereBot/r0-b_body.fbx.assetinfo b/AutomatedTesting/Assets/Physics/Collider_PxMeshAutoAssigned/SphereBot/r0-b_body.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Assets/C14861501_PhysXCollider_RenderMeshAutoAssigned/SphereBot/r0-b_body.fbx.assetinfo rename to AutomatedTesting/Assets/Physics/Collider_PxMeshAutoAssigned/SphereBot/r0-b_body.fbx.assetinfo diff --git a/AutomatedTesting/Assets/C14861501_PhysXCollider_RenderMeshAutoAssigned/SphereBot/r0-b_body.mtl b/AutomatedTesting/Assets/Physics/Collider_PxMeshAutoAssigned/SphereBot/r0-b_body.mtl similarity index 100% rename from AutomatedTesting/Assets/C14861501_PhysXCollider_RenderMeshAutoAssigned/SphereBot/r0-b_body.mtl rename to AutomatedTesting/Assets/Physics/Collider_PxMeshAutoAssigned/SphereBot/r0-b_body.mtl diff --git a/AutomatedTesting/Assets/C4982803_Enable_PxMesh_Option/SphereBot/R0-B_Body.fbx b/AutomatedTesting/Assets/Physics/Collider_PxMeshConvexMeshCollides/SphereBot/R0-B_Body.fbx similarity index 100% rename from AutomatedTesting/Assets/C4982803_Enable_PxMesh_Option/SphereBot/R0-B_Body.fbx rename to AutomatedTesting/Assets/Physics/Collider_PxMeshConvexMeshCollides/SphereBot/R0-B_Body.fbx diff --git a/AutomatedTesting/Assets/C4982803_Enable_PxMesh_Option/SphereBot/r0-b_body.fbx.assetinfo b/AutomatedTesting/Assets/Physics/Collider_PxMeshConvexMeshCollides/SphereBot/r0-b_body.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Assets/C4982803_Enable_PxMesh_Option/SphereBot/r0-b_body.fbx.assetinfo rename to AutomatedTesting/Assets/Physics/Collider_PxMeshConvexMeshCollides/SphereBot/r0-b_body.fbx.assetinfo diff --git a/AutomatedTesting/Assets/C4982803_Enable_PxMesh_Option/SphereBot/r0-b_body.mtl b/AutomatedTesting/Assets/Physics/Collider_PxMeshConvexMeshCollides/SphereBot/r0-b_body.mtl similarity index 100% rename from AutomatedTesting/Assets/C4982803_Enable_PxMesh_Option/SphereBot/r0-b_body.mtl rename to AutomatedTesting/Assets/Physics/Collider_PxMeshConvexMeshCollides/SphereBot/r0-b_body.mtl diff --git a/AutomatedTesting/Assets/C14861504_RenderMeshAsset_WithNoPxAsset/test_asset.fbx b/AutomatedTesting/Assets/Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx/test_asset.fbx similarity index 100% rename from AutomatedTesting/Assets/C14861504_RenderMeshAsset_WithNoPxAsset/test_asset.fbx rename to AutomatedTesting/Assets/Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx/test_asset.fbx diff --git a/AutomatedTesting/Assets/C14861504_RenderMeshAsset_WithNoPxAsset/test_asset.fbx.assetinfo b/AutomatedTesting/Assets/Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx/test_asset.fbx.assetinfo similarity index 100% rename from AutomatedTesting/Assets/C14861504_RenderMeshAsset_WithNoPxAsset/test_asset.fbx.assetinfo rename to AutomatedTesting/Assets/Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx/test_asset.fbx.assetinfo diff --git a/AutomatedTesting/Assets/C14861504_RenderMeshAsset_WithNoPxAsset/test_asset.mtl b/AutomatedTesting/Assets/Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx/test_asset.mtl similarity index 100% rename from AutomatedTesting/Assets/C14861504_RenderMeshAsset_WithNoPxAsset/test_asset.mtl rename to AutomatedTesting/Assets/Physics/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx/test_asset.mtl diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py index 2ddcc58f12..0f8a1597ff 100644 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py @@ -23,10 +23,10 @@ class TestAutomation(TestAutomationBase): use_null_renderer = False # Use default renderer (needs gpu) - def test_C18977329_NvCloth_AddClothSimulationToMesh(self, request, workspace, editor, launcher_platform): - from . import C18977329_NvCloth_AddClothSimulationToMesh as test_module + def test_NvCloth_AddClothSimulationToMesh(self, request, workspace, editor, launcher_platform): + from . import NvCloth_AddClothSimulationToMesh as test_module self._run_test(request, workspace, editor, test_module, use_null_renderer = self.use_null_renderer) - def test_C18977330_NvCloth_AddClothSimulationToActor(self, request, workspace, editor, launcher_platform): - from . import C18977330_NvCloth_AddClothSimulationToActor as test_module + def test_NvCloth_AddClothSimulationToActor(self, request, workspace, editor, launcher_platform): + from . import NvCloth_AddClothSimulationToActor as test_module self._run_test(request, workspace, editor, test_module, use_null_renderer = self.use_null_renderer) diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py b/AutomatedTesting/Gem/PythonTests/NvCloth/tests/NvCloth_AddClothSimulationToActor.py old mode 100755 new mode 100644 similarity index 93% rename from AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py rename to AutomatedTesting/Gem/PythonTests/NvCloth/tests/NvCloth_AddClothSimulationToActor.py index 4d84a33dd2..357067b176 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977330_NvCloth_AddClothSimulationToActor.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/tests/NvCloth_AddClothSimulationToActor.py @@ -15,7 +15,7 @@ class Tests: exit_game_mode = ("Exited game mode", "Failed to exit game mode") # fmt: on -def C18977330_NvCloth_AddClothSimulationToActor(): +def NvCloth_AddClothSimulationToActor(): """ Summary: Load level with Entity having Actor and Cloth components already setup. Verify that editor remains stable in Game mode. @@ -53,7 +53,7 @@ def C18977330_NvCloth_AddClothSimulationToActor(): helper.init_idle() # 1) Load the level - helper.open_level("NvCloth", "C18977330_NvCloth_AddClothSimulationToActor") + helper.open_level("NvCloth", "NvCloth_AddClothSimulationToActor") # 2) Start the Tracer to catch any errors and warnings with Tracer() as section_tracer: @@ -81,4 +81,4 @@ def C18977330_NvCloth_AddClothSimulationToActor(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18977330_NvCloth_AddClothSimulationToActor) + Report.start_test(NvCloth_AddClothSimulationToActor) diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py b/AutomatedTesting/Gem/PythonTests/NvCloth/tests/NvCloth_AddClothSimulationToMesh.py old mode 100755 new mode 100644 similarity index 93% rename from AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py rename to AutomatedTesting/Gem/PythonTests/NvCloth/tests/NvCloth_AddClothSimulationToMesh.py index 0ed9da1405..0f9d8448f7 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/C18977329_NvCloth_AddClothSimulationToMesh.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/tests/NvCloth_AddClothSimulationToMesh.py @@ -15,7 +15,7 @@ class Tests: exit_game_mode = ("Exited game mode", "Failed to exit game mode") # fmt: on -def C18977329_NvCloth_AddClothSimulationToMesh(): +def NvCloth_AddClothSimulationToMesh(): """ Summary: Load level with Entity having Mesh and Cloth components already setup. Verify that editor remains stable in Game mode. @@ -53,7 +53,7 @@ def C18977329_NvCloth_AddClothSimulationToMesh(): helper.init_idle() # 1) Load the level - helper.open_level("NvCloth", "C18977329_NvCloth_AddClothSimulationToMesh") + helper.open_level("NvCloth", "NvCloth_AddClothSimulationToMesh") # 2) Start the Tracer to catch any errors and warnings with Tracer() as section_tracer: @@ -81,4 +81,4 @@ def C18977329_NvCloth_AddClothSimulationToMesh(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18977329_NvCloth_AddClothSimulationToMesh) + Report.start_test(NvCloth_AddClothSimulationToMesh) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt index 1c7a02862d..10cf949c25 100644 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/CMakeLists.txt @@ -11,7 +11,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) NAME AutomatedTesting::WhiteBoxTests TEST_SUITE main TEST_SERIAL - PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Active.py + PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py RUNTIME_DEPENDENCIES Legacy::Editor AZ::AssetProcessor diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/FileManagement.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/FileManagement.py deleted file mode 100755 index 89b7559dd1..0000000000 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/FileManagement.py +++ /dev/null @@ -1,350 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT - -""" - -# Imports -import os -import shutil -import json -import logging -import ly_test_tools.environment.file_system as fs - - -class FileManagement: - """ - File Management static class: Handles file backup and restoration. - Organizes backing up files into a single directory and - mapping the back up files to their original files. - - Features accessible via the exposed decorator functions. - """ - - # Static variables - MAX_BACKUPS = 10000 # Arbitrary number to cap same-file-name name generating - backup_folder_name = ".backup" - backup_folder_path = os.path.join(os.path.split(__file__)[0], backup_folder_name) # CWD plus backup folder name - file_map_name = "_filebackup_map.json" # JSON file to store original to back up file mappings - - @staticmethod - def _load_file_map(): - # type: () -> {str: str} - """ - Loads the FileManagement's json file map. - The returned dictionary has key: value sets such that: - keys: full path to an original file currently being backed up - values: name of the original file's backup file. Uses a numbering system for - storing multiple file names that are identical but located in different directories. - If there is no current json file or the file cannot be parsed, an empty dictionary is returned. - :return: Dictionary to map original file's to their back up file names. - """ - json_file_path = os.path.join(FileManagement.backup_folder_path, FileManagement.file_map_name) - if os.path.exists(json_file_path): - try: - with open(json_file_path, "r") as f: - return json.load(f) - except ValueError: - logging.info("Decoding JSON file {} failed. Empty dictionary used".format(json_file_path)) - return {} - - @staticmethod - def _save_file_map(file_map): - # type: ({str: str}) -> None - """ - Saves the [file_map] dictionary as a json file. - If [file_map] is empty, deletes the json file. - :param file_map: A dictionary mapping original file paths to their back up file names. - :return: None - """ - file_path = os.path.join(FileManagement.backup_folder_path, FileManagement.file_map_name) - if os.path.exists(file_path): - fs.unlock_file(file_path) - if len(file_map) > 0: - with open(file_path, "w") as f: - json.dump(file_map, f) - fs.lock_file(file_path) - else: - fs.delete([file_path], True, False) - - @staticmethod - def _next_available_name(file_name, file_map): - # type: (str, {str: str}) -> str or None - """ - Generates the next available backup file name using a FILE_NAME_x.ext naming convention - where x is a number. Returns None if we've maxed out the numbering system. - :param file_name: The base file to generate a back up file name for. - :param file_map: The file_map for the FileManagement system - :return: str - """ - suffix, extension = file_name.split(".", 1) - for i in range(FileManagement.MAX_BACKUPS): - potential_name = suffix + "_" + str(i) + "." + extension - if potential_name not in file_map.values(): - return potential_name - return None - - @staticmethod - def _backup_file(file_name, file_path): - # type: (str, str) -> None - """ - Backs up the [file_name] located at [file_path] into the FileManagement's backup folder. - Leaves the backup file locked from writing privileges. - :param file_name: The file's name that will be backed up - :param file_path: The path to the file to back up - :return: None - """ - file_map = FileManagement._load_file_map() - backup_path = FileManagement.backup_folder_path - backup_file_name = "{}.bak".format(file_name) - backup_file = os.path.join(backup_path, backup_file_name) - # If backup directory DNE, make one - if not os.path.exists(backup_path): - os.mkdir(backup_path) - # If "traditional" backup file exists, delete it (myFile.txt.bak) - if os.path.exists(backup_file): - fs.delete([backup_file], True, False) - # Find my next storage name (myFile_1.txt.bak) - backup_storage_file_name = FileManagement._next_available_name(backup_file_name, file_map) - if backup_storage_file_name is None: - # If _next_available_name returns None, we have backed up MAX_BACKUPS of files name [file_name] - raise Exception( - "FileManagement class ran out of backups per name. Max: {}".format(FileManagement.MAX_BACKUPS) - ) - backup_storage_file = os.path.join(backup_path, backup_storage_file_name) - if os.path.exists(backup_storage_file): - # This file should not exists, but if it does it's about to get clobbered! - fs.unlock_file(backup_storage_file) - # Create "traditional" backup file (myFile.txt.bak) - fs.create_backup(os.path.join(file_path, file_name), backup_path) - # Copy "traditional" backup file into storage backup (myFile_1.txt.bak) - FileManagement._copy_file(backup_file_name, backup_path, backup_storage_file_name, backup_path) - fs.lock_file(backup_storage_file) - # Delete "traditional" back up file - fs.unlock_file(backup_file) - fs.delete([backup_file], True, False) - # Update file map with new file - file_map[os.path.join(file_path, file_name)] = backup_storage_file_name - FileManagement._save_file_map(file_map) - # Unlock original file to get it ready to be edited by the test - fs.unlock_file(os.path.join(file_path, file_name)) - - @staticmethod - def _restore_file(file_name, file_path): - # type: (str, str) -> None - """ - Restores the [file_name] located at [file_path] which is backed up in FileManagement's backup folder. - Locks [file_name] from writing privileges when done restoring. - :param file_name: The Original file that was backed up, and now restored - :param file_path: The location of the original file that was backed up - :return: None - """ - file_map = FileManagement._load_file_map() - backup_path = FileManagement.backup_folder_path - src_file = os.path.join(file_path, file_name) - if src_file in file_map: - backup_file = os.path.join(backup_path, file_map[src_file]) - if os.path.exists(backup_file): - fs.unlock_file(backup_file) - fs.unlock_file(src_file) - # Make temporary copy of backed up file to restore from - temp_file = "{}.bak".format(file_name) - FileManagement._copy_file(file_map[src_file], backup_path, temp_file, backup_path) - fs.restore_backup(src_file, backup_path) - fs.lock_file(src_file) - # Delete backup file - fs.delete([os.path.join(backup_path, temp_file)], True, False) - fs.delete([backup_file], True, False) - # Remove from file map - del file_map[src_file] - FileManagement._save_file_map(file_map) - if not os.listdir(backup_path): - # Delete backup folder if it's empty now - os.rmdir(backup_path) - - @staticmethod - def _find_files(file_names, root_dir, search_subdirs=False): - # type: ([str], str, bool) -> {str:str} - """ - Searches the [root_dir] directory tree for each of the file names in [file_names]. Returns a dictionary - where keys = the entries in file_names, and their values are the paths they were found at. - Raises a runtime warning if not exactly one copy of each file is found. - :param file_names: A list of file_names to look for - :param root_dir: The root directory to begin the search - collect all file paths matching that file_name - :param search_subdirs: Optional boolean flag for searching sub-directories of [parent_path] - :return: A dictionary where keys are file names, and values are the file's path. - """ - file_list = {} - found_count = 0 - for file_name in file_names: - file_list[file_name] = None - if search_subdirs: - # Search parent path for all file name arguments - for dir_path, _, dir_files in os.walk(root_dir): - for dir_file in dir_files: - if dir_file in file_list.keys(): - if file_list[dir_file] is None: - file_list[dir_file] = dir_path - found_count += 1 - else: - # Found multiple files with same name. Raise warning. - raise RuntimeWarning("Found multiple files with the name {}.".format(dir_file)) - else: - for dir_file in os.listdir(root_dir): - if os.path.isfile(os.path.join(root_dir, dir_file)) and dir_file in file_names: - file_list[dir_file] = root_dir - not_found = [file_name for file_name in file_names if file_list[file_name] is None] - if not_found: - raise RuntimeWarning("Could not find the following files: {}".format(not_found)) - - return file_list - - @staticmethod - def _copy_file(src_file, src_path, target_file, target_path): - # type: (str, str, str, str) -> None - """ - Copies the [src_file] at located in [src_path] to the [target_file] located at [target_path]. - Leaves the [target_file] unlocked for reading and writing privileges - :param src_file: The source file to copy (file name) - :param src_path: The source file's path - :param target_file: The target file to copy into (file name) - :param target_path: The target file's path - :return: None - """ - target_file_path = os.path.join(target_path, target_file) - src_file_path = os.path.join(src_path, src_file) - if os.path.exists(target_file_path): - fs.unlock_file(target_file_path) - shutil.copyfile(src_file_path, target_file_path) - - @staticmethod - def file_revert(file_name, parent_path=None, search_subdirs=False): - # type: (str, str, bool) -> function - """ - Function decorator: - Convenience version of file_revert_list for passing a single file - Calls file_revert_list on a list one [file_name] - :param file_name: The name of a file to backup (not path) - :param parent_path: The root directory to search for the [file_names] (relative to the dev folder). - Defaults to the project folder described by the inner function's workspace fixture - :param search_subdirs: A boolean option for searching sub-directories for the files in [file_names] - :return: function as per the function decorator pattern - """ - return FileManagement.file_revert_list([file_name], parent_path, search_subdirs) - - @staticmethod - def file_revert_list(file_names, parent_path=None, search_subdirs=False): - # type: ([str], str, bool) -> function - """ - Function decorator: - Collects file names specified in [file_names] in the [parent_path] directory. - Backs up these files before executing the parameter to the "wrap" function. - If the search_subdirs flag is True, searches all subdirectories of [parent_path] for files. - :param file_names: A list of file names (not paths) - :param parent_path: The root directory to search for the [file_names] (relative to the dev folder). - Defaults to the project folder described by the inner function's workspace fixture - :param search_subdirs: A boolean option for searching sub-directories for the files in [file_names] - :return: function as per the function decorator pattern - """ - - def wrap(func): - # type: (function) -> function - def inner(self, request, workspace, editor, launcher_platform): - # type: (...) -> None - """ - Inner function to wrap around decorated function. Function being decorated must match this - functions parameter order. - """ - root_path = parent_path - if root_path is not None: - root_path = os.path.join(workspace.paths.engine_root(), root_path) - else: - # Default to project folder (AutomatedTesting) - root_path = workspace.paths.project() - - # Try to locate files - try: - file_list = FileManagement._find_files(file_names, root_path, search_subdirs) - except RuntimeWarning as w: - assert False, ( - w.message - + " Please check use of search_subdirs; make sure you are using the correct parent directory." - ) - - # Restore from backups - for file_name, file_path in file_list.items(): - FileManagement._restore_file(file_name, file_path) - - # Create backups for each discovered path for each specified filename - for file_name, file_path in file_list.items(): - FileManagement._backup_file(file_name, file_path) - - try: - # Run the test - func(self, request, workspace, editor, launcher_platform) - finally: - # Restore backups for each discovered path for each specified filename if they exist - for file_name, file_path in file_list.items(): - FileManagement._restore_file(file_name, file_path) - - return inner - - return wrap - - @staticmethod - def file_override(target_file, src_file, parent_path=None, search_subdirs=False): - # type: (str, str, str, bool) -> function - """ - Function decorator: - Searches for [target_file] and [src_file] in [parent_path](relative to the project dev folder) - and performs backup and file swapping. [target_file] is backed up and replaced with [src_file] before the - decorated function executes. - After the decorated function is executed [target_file] is restored to the state before being swapped. - If [parent_path] is not specified, the project folder described by the current workspace will be used. - If the search_subdirs flag is True, searches all subdirectories of [parent_path] for files. - :param target_file: The name of the file being backed up and swapped into - :param src_file: The name of the file to swap into [target_file] - :param parent_path: The root directory to search for the [file_names] (relative to the dev folder). - Defaults to the project folder described by the inner function's workspace fixture - :param search_subdirs: A boolean option for searching sub-directories for the files in [file_names] - :return: The decorated function - """ - - def wrap(func): - def inner(self, request, workspace, editor, launcher_platform): - """ - Inner function to wrap around decorated function. Function being decorated must match this - functions parameter order. - """ - root_path = parent_path - if root_path is not None: - root_path = os.path.join(workspace.paths.engine_root(), root_path) - else: - # Default to project folder (AutomatedTesting) - root_path = workspace.paths.project() - - # Try to locate both target and source files - try: - file_list = FileManagement._find_files([target_file, src_file], root_path, search_subdirs) - except RuntimeWarning as w: - assert False, ( - w.message - + " Please check use of search_subdirs; make sure you are using the correct parent directory." - ) - - FileManagement._restore_file(target_file, file_list[target_file]) - FileManagement._backup_file(target_file, file_list[target_file]) - FileManagement._copy_file(src_file, file_list[src_file], target_file, file_list[target_file]) - - try: - # Run Test - func(self, request, workspace, editor, launcher_platform) - finally: - FileManagement._restore_file(target_file, file_list[target_file]) - - return inner - - return wrap diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/ImportPathHelper.py deleted file mode 100755 index 0e395664ad..0000000000 --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/ImportPathHelper.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - -def init(): - import os - import sys - sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py old mode 100755 new mode 100644 similarity index 61% rename from AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Active.py rename to AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py index c4a08f5667..fa6c81c98a --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Active.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/TestSuite_Main.py @@ -12,7 +12,6 @@ import pytest import sys import os -from .FileManagement import FileManagement as fm from ly_test_tools import LAUNCHERS sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') @@ -23,14 +22,14 @@ from base import TestAutomationBase @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): - def test_C28798177_WhiteBox_AddComponentToEntity(self, request, workspace, editor, launcher_platform): - from . import C28798177_WhiteBox_AddComponentToEntity as test_module + def test_WhiteBox_AddComponentToEntity(self, request, workspace, editor, launcher_platform): + from .tests import WhiteBox_AddComponentToEntity as test_module self._run_test(request, workspace, editor, test_module) - def test_C29279329_WhiteBox_SetDefaultShape(self, request, workspace, editor, launcher_platform): - from . import C29279329_WhiteBox_SetDefaultShape as test_module + def test_WhiteBox_SetDefaultShape(self, request, workspace, editor, launcher_platform): + from .tests import WhiteBox_SetDefaultShape as test_module self._run_test(request, workspace, editor, test_module) - def test_C28798205_WhiteBox_SetInvisible(self, request, workspace, editor, launcher_platform): - from . import C28798205_WhiteBox_SetInvisible as test_module + def test_WhiteBox_SetInvisible(self, request, workspace, editor, launcher_platform): + from .tests import WhiteBox_SetInvisible as test_module self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py old mode 100755 new mode 100644 similarity index 93% rename from AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py rename to AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py index bd65555951..7e250e304f --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798177_WhiteBox_AddComponentToEntity.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_AddComponentToEntity.py @@ -21,8 +21,6 @@ def C28798177_WhiteBox_AddComponentToEntity(): import os import sys from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init - import ImportPathHelper as imports - imports.init() import azlmbr.bus as bus import azlmbr.editor as editor @@ -53,8 +51,5 @@ def C28798177_WhiteBox_AddComponentToEntity(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C28798177_WhiteBox_AddComponentToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py old mode 100755 new mode 100644 similarity index 97% rename from AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py rename to AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py index 060a648389..417561a3bd --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C29279329_WhiteBox_SetDefaultShape.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetDefaultShape.py @@ -25,8 +25,6 @@ def C29279329_WhiteBox_SetDefaultShape(): import os import sys from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init - import ImportPathHelper as imports - imports.init() import azlmbr.whitebox.api as api import azlmbr.bus as bus @@ -102,8 +100,5 @@ def C29279329_WhiteBox_SetDefaultShape(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C29279329_WhiteBox_SetDefaultShape) diff --git a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py rename to AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py index 3cbfd4ea08..9642835e8f --- a/AutomatedTesting/Gem/PythonTests/WhiteBox/C28798205_WhiteBox_SetInvisible.py +++ b/AutomatedTesting/Gem/PythonTests/WhiteBox/tests/WhiteBox_SetInvisible.py @@ -24,9 +24,7 @@ def C28798205_WhiteBox_SetInvisible(): import os import sys from Gems.WhiteBox.Editor.Scripts import WhiteBoxInit as init - import ImportPathHelper as imports import editor_python_test_tools.hydra_editor_utils as hydra - imports.init() import azlmbr.whitebox.api as api import azlmbr.whitebox @@ -63,8 +61,5 @@ def C28798205_WhiteBox_SetInvisible(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report Report.start_test(C28798205_WhiteBox_SetInvisible) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py index dad37297cc..9e3a9cb4ff 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py @@ -20,368 +20,164 @@ sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesti from base import TestAutomationBase @pytest.mark.parametrize("project", ["AutomatedTesting"]) +@pytest.mark.parametrize("launcher_platform", ['windows_editor']) class TestAutomation(TestAutomationBase): @fm.file_revert("ragdollbones.physmaterial", - r"AutomatedTesting\Levels\Physics\C4925582_Material_AddModifyDeleteOnRagdollBones") - def test_C4925582_Material_AddModifyDeleteOnRagdollBones(self, request, workspace, editor): - from .material import C4925582_Material_AddModifyDeleteOnRagdollBones as test_module + r"AutomatedTesting\Levels\Physics\Material_LibraryCrudOperationsReflectOnRagdollBones") + def test_Material_LibraryCrudOperationsReflectOnRagdollBones(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryCrudOperationsReflectOnRagdollBones as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C4925580_Material_RagdollBonesMaterial(self, request, workspace, editor): - from .material import C4925580_Material_RagdollBonesMaterial as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Material_RagdollBones(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_RagdollBones as test_module + self._run_test(request, workspace, editor, test_module) @fm.file_revert("c15308221_material_componentsinsyncwithlibrary.physmaterial", - r"AutomatedTesting\Levels\Physics\C15308221_Material_ComponentsInSyncWithLibrary") - def test_C15308221_Material_ComponentsInSyncWithLibrary(self, request, workspace, editor): - from .material import C15308221_Material_ComponentsInSyncWithLibrary as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + r"AutomatedTesting\Levels\Physics\Material_ComponentsInSyncWithLibrary") + def test_Material_ComponentsInSyncWithLibrary(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_ComponentsInSyncWithLibrary as test_module + self._run_test(request, workspace, editor, test_module) # BUG: LY-107723") - def test_C14976308_ScriptCanvas_SetKinematicTargetTransform(self, request, workspace, editor): - from .script_canvas import C14976308_ScriptCanvas_SetKinematicTargetTransform as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_ScriptCanvas_SetKinematicTargetTransform(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_SetKinematicTargetTransform as test_module + self._run_test(request, workspace, editor, test_module) # Failing, PhysXTerrain @fm.file_revert("c4925579_material_addmodifydeleteonterrain.physmaterial", - r"AutomatedTesting\Levels\Physics\C4925579_Material_AddModifyDeleteOnTerrain") - def test_C4925579_Material_AddModifyDeleteOnTerrain(self, request, workspace, editor): - from .material import C4925579_Material_AddModifyDeleteOnTerrain as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + r"AutomatedTesting\Levels\Physics\Material_LibraryCrudOperationsReflectOnTerrain") + def test_Material_LibraryCrudOperationsReflectOnTerrain(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryCrudOperationsReflectOnTerrain as test_module + self._run_test(request, workspace, editor, test_module) # Failing, PhysXTerrain - def test_C13508019_Terrain_TerrainTexturePainterWorks(self, request, workspace, editor): - from .terrain import C13508019_Terrain_TerrainTexturePainterWorks as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Terrain_TerrainTexturePainterWorks(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_TerrainTexturePainterWorks as test_module + self._run_test(request, workspace, editor, test_module) # Failing, PhysXTerrain - def test_C4925577_Materials_MaterialAssignedToTerrain(self, request, workspace, editor): - from .material import C4925577_Materials_MaterialAssignedToTerrain as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Material_CanBeAssignedToTerrain(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_CanBeAssignedToTerrain as test_module + self._run_test(request, workspace, editor, test_module) # Failing, PhysXTerrain - def test_C15096735_Materials_DefaultLibraryConsistency(self, request, workspace, editor): - from .material import C15096735_Materials_DefaultLibraryConsistency as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Material_DefaultLibraryConsistentOnAllFeatures(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_DefaultLibraryConsistentOnAllFeatures as test_module + self._run_test(request, workspace, editor, test_module) # Failing, PhysXTerrain - @fm.file_revert("all_ones_1.physmaterial", r"AutomatedTesting\Levels\Physics\C15096737_Materials_DefaultMaterialLibraryChanges") - @fm.file_override("default.physxconfiguration", "C15096737_Materials_DefaultMaterialLibraryChanges.physxconfiguration", "AutomatedTesting") - def test_C15096737_Materials_DefaultMaterialLibraryChanges(self, request, workspace, editor): - from .material import C15096737_Materials_DefaultMaterialLibraryChanges as test_module - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + @fm.file_revert("all_ones_1.physmaterial", r"AutomatedTesting\Levels\Physics\Material_DefaultMaterialLibraryChangesWork") + @fm.file_override("default.physxconfiguration", "Material_DefaultMaterialLibraryChangesWork.physxconfiguration", "AutomatedTesting") + def test_Material_DefaultMaterialLibraryChangesWork(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_DefaultMaterialLibraryChangesWork as test_module + self._run_test(request, workspace, editor, test_module) - def test_C4976242_Collision_SameCollisionlayerSameCollisiongroup(self, request, workspace, editor): - from .collider import C4976242_Collision_SameCollisionlayerSameCollisiongroup as test_module + def test_Collider_SameCollisionGroupSameLayerCollide(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_SameCollisionGroupSameLayerCollide as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Ragdoll_OldRagdollSerializationNoErrors(self, request, workspace, editor, launcher_platform): + from .tests.ragdoll import Ragdoll_OldRagdollSerializationNoErrors as test_module + self._run_test(request, workspace, editor, test_module) - def test_C15096732_Material_DefaultLibraryUpdatedAcrossLevels(self, request, workspace, editor): - @fm.file_override("default.physxconfiguration", - "Material_DefaultLibraryUpdatedAcrossLevels_before.physxconfiguration", "AutomatedTesting", - search_subdirs=True) - def test_levels_before(self, request, workspace, editor): - from .material import C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before as test_module_0 - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module_0, expected_lines, unexpected_lines) + @fm.file_override("default.physxconfiguration", "ScriptCanvas_OverlapNode.physxconfiguration") + def test_ScriptCanvas_OverlapNode(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_OverlapNode as test_module + self._run_test(request, workspace, editor, test_module) - # File override replaces the previous physxconfiguration file with another where the only difference is the default material library - @fm.file_override("default.physxconfiguration", - "Material_DefaultLibraryUpdatedAcrossLevels_after.physxconfiguration", "AutomatedTesting", - search_subdirs=True) - def test_levels_after(self, request, workspace, editor): - from .material import C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after as test_module_1 - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module_1, expected_lines, unexpected_lines) - - test_levels_before(self, request, workspace, editor) - test_levels_after(self, request, workspace, editor) - - def test_C14654882_Ragdoll_ragdollAPTest(self, request, workspace, editor): - from .ragdoll import C14654882_Ragdoll_ragdollAPTest as test_module - - expected_lines = [] - unexpected_lines = test_module.UnexpectedLines.lines - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - @fm.file_override("default.physxconfiguration", "C12712454_ScriptCanvas_OverlapNodeVerification.physxconfiguration") - def test_C12712454_ScriptCanvas_OverlapNodeVerification(self, request, workspace, editor): - from .script_canvas import C12712454_ScriptCanvas_OverlapNodeVerification as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C4044460_Material_StaticFriction(self, request, workspace, editor): - from .material import C4044460_Material_StaticFriction as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - + def test_Material_StaticFriction(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_StaticFriction as test_module + self._run_test(request, workspace, editor, test_module) @fm.file_revert("c4888315_material_addmodifydeleteoncollider.physmaterial", - r"AutomatedTesting\Levels\Physics\C4888315_Material_AddModifyDeleteOnCollider") - def test_C4888315_Material_AddModifyDeleteOnCollider(self, request, workspace, editor): - from .material import C4888315_Material_AddModifyDeleteOnCollider as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + r"AutomatedTesting\Levels\Physics\Material_LibraryCrudOperationsReflectOnCollider") + def test_Material_LibraryCrudOperationsReflectOnCollider(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryCrudOperationsReflectOnCollider as test_module + self._run_test(request, workspace, editor, test_module) @fm.file_revert("c15563573_material_addmodifydeleteoncharactercontroller.physmaterial", - r"AutomatedTesting\Levels\Physics\C15563573_Material_AddModifyDeleteOnCharacterController") - def test_C15563573_Material_AddModifyDeleteOnCharacterController(self, request, workspace, editor): - from .material import C15563573_Material_AddModifyDeleteOnCharacterController as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + r"AutomatedTesting\Levels\Physics\Material_LibraryCrudOperationsReflectOnCharacterController") + def test_Material_LibraryCrudOperationsReflectOnCharacterController(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryCrudOperationsReflectOnCharacterController as test_module + self._run_test(request, workspace, editor, test_module) @fm.file_revert("c4888315_material_addmodifydeleteoncollider.physmaterial", - r"AutomatedTesting\Levels\Physics\C4888315_Material_AddModifyDeleteOnCollider") - def test_C4888315_Material_AddModifyDeleteOnCollider(self, request, workspace, editor): - from .material import C4888315_Material_AddModifyDeleteOnCollider as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - + r"AutomatedTesting\Levels\Physics\Material_LibraryCrudOperationsReflectOnCollider") + def test_Material_LibraryCrudOperationsReflectOnCollider(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryCrudOperationsReflectOnCollider as test_module + self._run_test(request, workspace, editor, test_module) @fm.file_revert("c15563573_material_addmodifydeleteoncharactercontroller.physmaterial", - r"AutomatedTesting\Levels\Physics\C15563573_Material_AddModifyDeleteOnCharacterController") - def test_C15563573_Material_AddModifyDeleteOnCharacterController(self, request, workspace, editor): - from .material import C15563573_Material_AddModifyDeleteOnCharacterController as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + r"AutomatedTesting\Levels\Physics\Material_LibraryCrudOperationsReflectOnCharacterController") + def test_Material_LibraryCrudOperationsReflectOnCharacterController(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryCrudOperationsReflectOnCharacterController as test_module + self._run_test(request, workspace, editor, test_module) @fm.file_revert("c4044455_material_librarychangesinstantly.physmaterial", r"AutomatedTesting\Levels\Physics\C4044455_Material_LibraryChangesInstantly") - def test_C4044455_Material_libraryChangesInstantly(self, request, workspace, editor): - from .material import C4044455_Material_libraryChangesInstantly as test_module + def test_Material_LibraryChangesReflectInstantly(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryChangesReflectInstantly as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - - @fm.file_revert("C15425935_Material_LibraryUpdatedAcrossLevels.physmaterial", - r"AutomatedTesting\Levels\Physics\C15425935_Material_LibraryUpdatedAcrossLevels") - def test_C15425935_Material_LibraryUpdatedAcrossLevels(self, request, workspace, editor): - from .material import C15425935_Material_LibraryUpdatedAcrossLevels as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + @fm.file_revert("Material_LibraryUpdatedAcrossLevels.physmaterial", + r"AutomatedTesting\Levels\Physics\Material_LibraryUpdatedAcrossLevels") + def test_Material_LibraryUpdatedAcrossLevels(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryUpdatedAcrossLevels as test_module + self._run_test(request, workspace, editor, test_module) - def test_C4976199_RigidBodies_LinearDampingObjectMotion(self, request, workspace, editor): - from .rigid_body import C4976199_RigidBodies_LinearDampingObjectMotion as test_module + def test_RigidBody_LinearDampingAffectsMotion(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_LinearDampingAffectsMotion as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Terrain_CollisionAgainstRigidBody(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_CollisionAgainstRigidBody as test_module + self._run_test(request, workspace, editor, test_module) - def test_C5689518_PhysXTerrain_CollidesWithPhysXTerrain(self, request, workspace, editor): - from .terrain import C5689518_PhysXTerrain_CollidesWithPhysXTerrain as test_module + def test_ShapeCollider_CylinderShapeCollides(self, request, workspace, editor, launcher_platform): + from .tests.collider import ShapeCollider_CylinderShapeCollides as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Physics_WorldBodyBusWorksOnEditorComponents(self, request, workspace, editor, launcher_platform): + from .tests import Physics_WorldBodyBusWorksOnEditorComponents as test_module + self._run_test(request, workspace, editor, test_module) - def test_C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(self, request, workspace, editor): - from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module + def test_Collider_PxMeshErrorIfNoMesh(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_PxMeshErrorIfNoMesh as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_ForceRegion_ImpulsesBoxShapedRigidBody(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ImpulsesBoxShapedRigidBody as test_module + self._run_test(request, workspace, editor, test_module) - def test_C29032500_EditorComponents_WorldBodyBusWorks(self, request, workspace, editor): - from .general import C29032500_EditorComponents_WorldBodyBusWorks as test_module + def test_Terrain_SpawnSecondTerrainComponentWarning(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_SpawnSecondTerrainComponentWarning as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Terrain_AddPhysTerrainComponent(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_AddPhysTerrainComponent as test_module + self._run_test(request, workspace, editor, test_module) - def test_C14861498_ConfirmError_NoPxMesh(self, request, workspace, editor, launcher_platform): - from .collider import C14861498_ConfirmError_NoPxMesh as test_module + def test_Terrain_CanAddMultipleTerrainComponents(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_CanAddMultipleTerrainComponents as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Terrain_MultipleTerrainComponentsWarning(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_MultipleTerrainComponentsWarning as test_module + self._run_test(request, workspace, editor, test_module) - def test_C5959763_ForceRegion_ForceRegionImpulsesCube(self, request, workspace, editor, launcher_platform): - from .force_region import C5959763_ForceRegion_ForceRegionImpulsesCube as test_module + def test_Terrain_MultipleTerrainComponentsWarning(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_MultipleTerrainComponentsWarning as test_module + self._run_test(request, workspace, editor, test_module) - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_ForceRegion_HighValuesDirectionAxesWorkWithNoError(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_HighValuesDirectionAxesWorkWithNoError as test_module + self._run_test(request, workspace, editor, test_module) - def test_C5689531_Warning_TerrainSliceTerrainComponent(self, request, workspace, editor, launcher_platform): - from .terrain import C5689531_Warning_TerrainSliceTerrainComponent as test_module - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_Terrain_MultipleResolutionsValid(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_MultipleResolutionsValid as test_module + self._run_test(request, workspace, editor, test_module) - def test_C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(self, request, workspace, editor, launcher_platform): - from .terrain import C5689522_Physxterrain_AddPhysxterrainNoEditorCrash as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C5689524_MultipleTerrains_CheckWarningInConsole(self, request, workspace, editor, launcher_platform): - from .terrain import C5689524_MultipleTerrains_CheckWarningInConsole as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C5689528_Terrain_MultipleTerrainComponents(self, request, workspace, editor, launcher_platform): - from .terrain import C5689528_Terrain_MultipleTerrainComponents as test_module - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C5689528_Terrain_MultipleTerrainComponents(self, request, workspace, editor, launcher_platform): - from .terrain import C5689528_Terrain_MultipleTerrainComponents as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C6321601_Force_HighValuesDirectionAxes(self, request, workspace, editor, launcher_platform): - from .force_region import C6321601_Force_HighValuesDirectionAxes as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C6032082_Terrain_MultipleResolutionsValid(self, request, workspace, editor, launcher_platform): - from .terrain import C6032082_Terrain_MultipleResolutionsValid as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - def test_C12905527_ForceRegion_MagnitudeDeviation(self, request, workspace, editor, launcher_platform): - from .force_region import C12905527_ForceRegion_MagnitudeDeviation as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243580_Joints_Fixed2BodiesConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243580_Joints_Fixed2BodiesConstrained as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243583_Joints_Hinge2BodiesConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243583_Joints_Hinge2BodiesConstrained as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243588_Joints_Ball2BodiesConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243588_Joints_Ball2BodiesConstrained as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243581_Joints_FixedBreakable(self, request, workspace, editor, launcher_platform): - from .joints import C18243581_Joints_FixedBreakable as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243587_Joints_HingeBreakable(self, request, workspace, editor, launcher_platform): - from .joints import C18243587_Joints_HingeBreakable as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243592_Joints_BallBreakable(self, request, workspace, editor, launcher_platform): - from .joints import C18243592_Joints_BallBreakable as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243585_Joints_HingeNoLimitsConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243585_Joints_HingeNoLimitsConstrained as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243590_Joints_BallNoLimitsConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243590_Joints_BallNoLimitsConstrained as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243582_Joints_FixedLeadFollowerCollide(self, request, workspace, editor, launcher_platform): - from .joints import C18243582_Joints_FixedLeadFollowerCollide as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) - - # Removed from active suite to meet 60 minutes limit in AR job - def test_C18243593_Joints_GlobalFrameConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243593_Joints_GlobalFrameConstrained as test_module - - expected_lines = [] - unexpected_lines = ["Assert"] - self._run_test(request, workspace, editor, test_module, expected_lines, unexpected_lines) + def test_ForceRegion_SmallMagnitudeDeviationOnLargeForces(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_SmallMagnitudeDeviationOnLargeForces as test_module + self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py index c3f41b158f..4ed73a725f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py @@ -28,61 +28,64 @@ revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', ' @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): - def test_C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform): - from .collider import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module + def test_RigidBody_EnablingGravityWorksUsingNotificationsPoC(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(self, request, workspace, editor, launcher_platform): - from .force_region import C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies as test_module + def test_ForceRegion_LocalSpaceForceOnRigidBodies(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_LocalSpaceForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4044459_Material_DynamicFriction.setreg_override', 'AutomatedTesting/Registry') - def test_C4044459_Material_DynamicFriction(self, request, workspace, editor, launcher_platform): - from .material import C4044459_Material_DynamicFriction as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_DynamicFriction.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_DynamicFriction(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_DynamicFriction as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976243_Collision_SameCollisionGroupDiffCollisionLayers(self, request, workspace, editor, - launcher_platform): - from .collider import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module + def test_Collider_SameCollisionGroupDiffLayersCollide(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_SameCollisionGroupDiffLayersCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C14654881_CharacterController_SwitchLevels(self, request, workspace, editor, launcher_platform): - from .character_controller import C14654881_CharacterController_SwitchLevels as test_module + def test_CharacterController_SwitchLevels(self, request, workspace, editor, launcher_platform): + from .tests.character_controller import CharacterController_SwitchLevels as test_module self._run_test(request, workspace, editor, test_module) - def test_C17411467_AddPhysxRagdollComponent(self, request, workspace, editor, launcher_platform): - from .ragdoll import C17411467_AddPhysxRagdollComponent as test_module + def test_Ragdoll_AddPhysxRagdollComponentWorks(self, request, workspace, editor, launcher_platform): + from .tests.ragdoll import Ragdoll_AddPhysxRagdollComponentWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C12712453_ScriptCanvas_MultipleRaycastNode(self, request, workspace, editor, launcher_platform): - from .script_canvas import C12712453_ScriptCanvas_MultipleRaycastNode as test_module - # Fixme: unexpected_lines = ["Assert"] + test_module.Lines.unexpected + def test_ScriptCanvas_MultipleRaycastNode(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_MultipleRaycastNode as test_module + # Fixme: This test previously relied on unexpected lines log reading with is now not supported. + # Now the log reading must be done inside the test, preferably with the Tracer() utility + # unexpected_lines = ["Assert"] + test_module.Lines.unexpected self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4982593_PhysXCollider_CollisionLayer.setreg_override', 'AutomatedTesting/Registry') - def test_C4982593_PhysXCollider_CollisionLayerTest(self, request, workspace, editor, launcher_platform): - from .collider import C4982593_PhysXCollider_CollisionLayerTest as test_module + @fm.file_override('physxsystemconfiguration.setreg','Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Collider_DiffCollisionGroupDiffCollidingLayersNotCollide(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_DiffCollisionGroupDiffCollidingLayersNotCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C18243586_Joints_HingeLeadFollowerCollide(self, request, workspace, editor, launcher_platform): - from .joints import C18243586_Joints_HingeLeadFollowerCollide as test_module + def test_Joints_HingeLeadFollowerCollide(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_HingeLeadFollowerCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982803_Enable_PxMesh_Option(self, request, workspace, editor, launcher_platform): - from .collider import C4982803_Enable_PxMesh_Option as test_module + def test_Collider_PxMeshConvexMeshCollides(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_PxMeshConvexMeshCollides as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(self, request, workspace, editor, launcher_platform): - from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module + def test_ShapeCollider_CylinderShapeCollides(self, request, workspace, editor, launcher_platform): + from .tests.shape_collider import ShapeCollider_CylinderShapeCollides as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py index 917952d880..6970650c77 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py @@ -21,7 +21,7 @@ class EditorSingleTest_WithFileOverrides(EditorSingleTest): # Base directory of the files (Default path is {ProjectName}) base_dir = None # True will will search sub-directories for the files in base - search_subdirs = False + search_subdirs = True @classmethod def wrap_run(cls, instance, request, workspace, editor, editor_test_results, launcher_platform): @@ -47,14 +47,14 @@ class EditorSingleTest_WithFileOverrides(EditorSingleTest): fm._backup_file(f, file_list[f]) for original, override in cls.files_to_override: - fm._copy_file(override, file_list[override], original, file_list[override]) + fm._copy_file(override, file_list[override], original, file_list[original]) yield # Run Test for f in original_file_list: fm._restore_file(f, file_list[f]) -@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") +#@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) @@ -67,283 +67,280 @@ class TestAutomation(EditorTestSuite): ######################################### # Non-atomic tests: These need to be run in a single editor because they have custom setup and teardown class C4044459_Material_DynamicFriction(EditorSingleTest_WithFileOverrides): - from .material import C4044459_Material_DynamicFriction as test_module + from .tests.material import Material_DynamicFriction as test_module files_to_override = [ - ('physxsystemconfiguration.setreg', 'C4044459_Material_DynamicFriction.setreg_override') + ('physxsystemconfiguration.setreg', 'Material_DynamicFriction.setreg_override') ] base_dir = "AutomatedTesting/Registry" class C4982593_PhysXCollider_CollisionLayerTest(EditorSingleTest_WithFileOverrides): - from .collider import C4982593_PhysXCollider_CollisionLayerTest as test_module + from .tests.collider import Collider_DiffCollisionGroupDiffCollidingLayersNotCollide as test_module files_to_override = [ - ('physxsystemconfiguration.setreg', 'C4982593_PhysXCollider_CollisionLayer.setreg_override') + ('physxsystemconfiguration.setreg', 'Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.setreg_override') ] base_dir = "AutomatedTesting/Registry" ######################################### class C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(EditorSharedTest): - from .collider import C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module + from .tests.rigid_body import RigidBody_EnablingGravityWorksUsingNotificationsPoC as test_module class C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(EditorSharedTest): - from .force_region import C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies as test_module + from .tests.force_region import ForceRegion_LocalSpaceForceOnRigidBodies as test_module class C15425929_Undo_Redo(EditorSharedTest): - from .general import C15425929_Undo_Redo as test_module + from .tests import Physics_UndoRedoWorksOnEntityWithPhysComponents as test_module class C4976243_Collision_SameCollisionGroupDiffCollisionLayers(EditorSharedTest): - from .collider import C4976243_Collision_SameCollisionGroupDiffCollisionLayers as test_module + from .tests.collider import Collider_SameCollisionGroupDiffLayersCollide as test_module class C14654881_CharacterController_SwitchLevels(EditorSharedTest): - from .character_controller import C14654881_CharacterController_SwitchLevels as test_module + from .tests.character_controller import CharacterController_SwitchLevels as test_module class C17411467_AddPhysxRagdollComponent(EditorSharedTest): - from .ragdoll import C17411467_AddPhysxRagdollComponent as test_module + from .tests.ragdoll import Ragdoll_AddPhysxRagdollComponentWorks as test_module class C12712453_ScriptCanvas_MultipleRaycastNode(EditorSharedTest): - from .script_canvas import C12712453_ScriptCanvas_MultipleRaycastNode as test_module + from .tests.script_canvas import ScriptCanvas_MultipleRaycastNode as test_module class C18243586_Joints_HingeLeadFollowerCollide(EditorSharedTest): - from .joints import C18243586_Joints_HingeLeadFollowerCollide as test_module + from .tests.joints import Joints_HingeLeadFollowerCollide as test_module class C4982803_Enable_PxMesh_Option(EditorSharedTest): - from .collider import C4982803_Enable_PxMesh_Option as test_module + from .tests.collider import Collider_PxMeshConvexMeshCollides as test_module class C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(EditorSharedTest): - from .collider import C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain as test_module + from .tests.shape_collider import ShapeCollider_CylinderShapeCollides as test_module class C3510642_Terrain_NotCollideWithTerrain(EditorSharedTest): - from .terrain import C3510642_Terrain_NotCollideWithTerrain as test_module + from .tests.terrain import Terrain_NoPhysTerrainComponentNoCollision as test_module class C4976195_RigidBodies_InitialLinearVelocity(EditorSharedTest): - from .rigid_body import C4976195_RigidBodies_InitialLinearVelocity as test_module + from .tests.rigid_body import RigidBody_InitialLinearVelocity as test_module class C4976206_RigidBodies_GravityEnabledActive(EditorSharedTest): - from .rigid_body import C4976206_RigidBodies_GravityEnabledActive as test_module + from .tests.rigid_body import RigidBody_StartGravityEnabledWorks as test_module class C4976207_PhysXRigidBodies_KinematicBehavior(EditorSharedTest): - from .rigid_body import C4976207_PhysXRigidBodies_KinematicBehavior as test_module + from .tests.rigid_body import RigidBody_KinematicModeWorks as test_module class C5932042_PhysXForceRegion_LinearDamping(EditorSharedTest): - from .force_region import C5932042_PhysXForceRegion_LinearDamping as test_module + from .tests.force_region import ForceRegion_LinearDampingForceOnRigidBodies as test_module class C5932043_ForceRegion_SimpleDragOnRigidBodies(EditorSharedTest): - from .force_region import C5932043_ForceRegion_SimpleDragOnRigidBodies as test_module + from .tests.force_region import ForceRegion_SimpleDragForceOnRigidBodies as test_module class C5959760_PhysXForceRegion_PointForceExertion(EditorSharedTest): - from .force_region import C5959760_PhysXForceRegion_PointForceExertion as test_module + from .tests.force_region import ForceRegion_CapsuleShapedForce as test_module class C5959764_ForceRegion_ForceRegionImpulsesCapsule(EditorSharedTest): - from .force_region import C5959764_ForceRegion_ForceRegionImpulsesCapsule as test_module + from .tests.force_region import ForceRegion_ImpulsesCapsuleShapedRigidBody as test_module class C5340400_RigidBody_ManualMomentOfInertia(EditorSharedTest): - from .rigid_body import C5340400_RigidBody_ManualMomentOfInertia as test_module + from .tests.rigid_body import RigidBody_MomentOfInertiaManualSetting as test_module class C4976210_COM_ManualSetting(EditorSharedTest): - from .rigid_body import C4976210_COM_ManualSetting as test_module + from .tests.rigid_body import RigidBody_COM_ManualSettingWorks as test_module class C4976194_RigidBody_PhysXComponentIsValid(EditorSharedTest): - from .rigid_body import C4976194_RigidBody_PhysXComponentIsValid as test_module + from .tests.rigid_body import RigidBody_AddRigidBodyComponent as test_module class C5932045_ForceRegion_Spline(EditorSharedTest): - from .force_region import C5932045_ForceRegion_Spline as test_module + from .tests.force_region import ForceRegion_SplineForceOnRigidBodies as test_module class C4982797_Collider_ColliderOffset(EditorSharedTest): - from .collider import C4982797_Collider_ColliderOffset as test_module + from .tests.collider import Collider_ColliderPositionOffset as test_module class C4976200_RigidBody_AngularDampingObjectRotation(EditorSharedTest): - from .rigid_body import C4976200_RigidBody_AngularDampingObjectRotation as test_module + from .tests.rigid_body import RigidBody_AngularDampingAffectsRotation as test_module class C5689529_Verify_Terrain_RigidBody_Collider_Mesh(EditorSharedTest): - from .general import C5689529_Verify_Terrain_RigidBody_Collider_Mesh as test_module + from .tests import Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether as test_module class C5959810_ForceRegion_ForceRegionCombinesForces(EditorSharedTest): - from .force_region import C5959810_ForceRegion_ForceRegionCombinesForces as test_module + from .tests.force_region import ForceRegion_MultipleForcesInSameComponentCombineForces as test_module class C5959765_ForceRegion_AssetGetsImpulsed(EditorSharedTest): - from .force_region import C5959765_ForceRegion_AssetGetsImpulsed as test_module + from .tests.force_region import ForceRegion_ImpulsesPxMeshShapedRigidBody as test_module class C6274125_ScriptCanvas_TriggerEvents(EditorSharedTest): - from .script_canvas import C6274125_ScriptCanvas_TriggerEvents as test_module + from .tests.script_canvas import ScriptCanvas_TriggerEvents as test_module # needs to be updated to log for unexpected lines # expected_lines = test_module.LogLines.expected_lines class C6090554_ForceRegion_PointForceNegative(EditorSharedTest): - from .force_region import C6090554_ForceRegion_PointForceNegative as test_module + from .tests.force_region import ForceRegion_ZeroPointForceDoesNothing as test_module class C6090550_ForceRegion_WorldSpaceForceNegative(EditorSharedTest): - from .force_region import C6090550_ForceRegion_WorldSpaceForceNegative as test_module + from .tests.force_region import ForceRegion_ZeroWorldSpaceForceDoesNothing as test_module class C6090552_ForceRegion_LinearDampingNegative(EditorSharedTest): - from .force_region import C6090552_ForceRegion_LinearDampingNegative as test_module + from .tests.force_region import ForceRegion_ZeroLinearDampingDoesNothing as test_module class C5968760_ForceRegion_CheckNetForceChange(EditorSharedTest): - from .force_region import C5968760_ForceRegion_CheckNetForceChange as test_module + from .tests.force_region import ForceRegion_MovingForceRegionChangesNetForce as test_module + @pytest.mark.xfail(reason="Ongoing issue in Script Canvas, AZ::Event fail to compile on Script Canvas") class C12712452_ScriptCanvas_CollisionEvents(EditorSharedTest): - from .script_canvas import C12712452_ScriptCanvas_CollisionEvents as test_module + from .tests.script_canvas import ScriptCanvas_CollisionEvents as test_module class C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(EditorSharedTest): - from .force_region import C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude as test_module + from .tests.force_region import ForceRegion_DirectionHasNoAffectOnTotalForce as test_module class C4976204_Verify_Start_Asleep_Condition(EditorSharedTest): - from .rigid_body import C4976204_Verify_Start_Asleep_Condition as test_module + from .tests.rigid_body import RigidBody_StartAsleepWorks as test_module class C6090546_ForceRegion_SliceFileInstantiates(EditorSharedTest): - from .force_region import C6090546_ForceRegion_SliceFileInstantiates as test_module + from .tests.force_region import ForceRegion_SliceFileInstantiates as test_module class C6090551_ForceRegion_LocalSpaceForceNegative(EditorSharedTest): - from .force_region import C6090551_ForceRegion_LocalSpaceForceNegative as test_module + from .tests.force_region import ForceRegion_ZeroLocalSpaceForceDoesNothing as test_module class C6090553_ForceRegion_SimpleDragForceOnRigidBodies(EditorSharedTest): - from .force_region import C6090553_ForceRegion_SimpleDragForceOnRigidBodies as test_module + from .tests.force_region import ForceRegion_ZeroSimpleDragForceDoesNothing as test_module class C4976209_RigidBody_ComputesCOM(EditorSharedTest): - from .rigid_body import C4976209_RigidBody_ComputesCOM as test_module + from .tests.rigid_body import RigidBody_COM_ComputingWorks as test_module class C4976201_RigidBody_MassIsAssigned(EditorSharedTest): - from .rigid_body import C4976201_RigidBody_MassIsAssigned as test_module + from .tests.rigid_body import RigidBody_MassDifferentValuesWorks as test_module class C12868580_ForceRegion_SplineModifiedTransform(EditorSharedTest): - from .force_region import C12868580_ForceRegion_SplineModifiedTransform as test_module + from .tests.force_region import ForceRegion_SplineRegionWithModifiedTransform as test_module class C12712455_ScriptCanvas_ShapeCastVerification(EditorSharedTest): - from .script_canvas import C12712455_ScriptCanvas_ShapeCastVerification as test_module + from .tests.script_canvas import ScriptCanvas_ShapeCast as test_module class C4976197_RigidBodies_InitialAngularVelocity(EditorSharedTest): - from .rigid_body import C4976197_RigidBodies_InitialAngularVelocity as test_module + from .tests.rigid_body import RigidBody_InitialAngularVelocity as test_module class C6090555_ForceRegion_SplineFollowOnRigidBodies(EditorSharedTest): - from .force_region import C6090555_ForceRegion_SplineFollowOnRigidBodies as test_module + from .tests.force_region import ForceRegion_ZeroSplineForceDoesNothing as test_module class C6131473_StaticSlice_OnDynamicSliceSpawn(EditorSharedTest): - from .general import C6131473_StaticSlice_OnDynamicSliceSpawn as test_module + from .tests import Physics_DynamicSliceWithPhysNotSpawnsStaticSlice as test_module class C5959808_ForceRegion_PositionOffset(EditorSharedTest): - from .force_region import C5959808_ForceRegion_PositionOffset as test_module + from .tests.force_region import ForceRegion_PositionOffset as test_module @pytest.mark.xfail(reason="Something with the CryRenderer disabling is causing this test to fail now.") class C13895144_Ragdoll_ChangeLevel(EditorSharedTest): - from .ragdoll import C13895144_Ragdoll_ChangeLevel as test_module + from .tests.ragdoll import Ragdoll_LevelSwitchDoesNotCrash as test_module class C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(EditorSharedTest): - from .force_region import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module + from .tests.force_region import ForceRegion_MultipleComponentsCombineForces as test_module @pytest.mark.xfail(reason="This test will sometimes fail as the ball will continue to roll before the timeout is reached.") class C4976202_RigidBody_StopsWhenBelowKineticThreshold(EditorSharedTest): - from .rigid_body import C4976202_RigidBody_StopsWhenBelowKineticThreshold as test_module + from .tests.rigid_body import RigidBody_SleepWhenBelowKineticThreshold as test_module class C13351703_COM_NotIncludeTriggerShapes(EditorSharedTest): - from .rigid_body import C13351703_COM_NotIncludeTriggerShapes as test_module + from .tests.rigid_body import RigidBody_COM_NotIncludesTriggerShapes as test_module class C5296614_PhysXMaterial_ColliderShape(EditorSharedTest): - from .material import C5296614_PhysXMaterial_ColliderShape as test_module + from .tests.material import Material_NoEffectIfNoColliderShape as test_module class C4982595_Collider_TriggerDisablesCollision(EditorSharedTest): - from .collider import C4982595_Collider_TriggerDisablesCollision as test_module + from .tests.collider import Collider_TriggerPassThrough as test_module class C14976307_Gravity_SetGravityWorks(EditorSharedTest): - from .general import C14976307_Gravity_SetGravityWorks as test_module + from .tests.rigid_body import RigidBody_SetGravityWorks as test_module class C4044694_Material_EmptyLibraryUsesDefault(EditorSharedTest): - from .material import C4044694_Material_EmptyLibraryUsesDefault as test_module + from .tests.material import Material_EmptyLibraryUsesDefault as test_module class C15845879_ForceRegion_HighLinearDampingForce(EditorSharedTest): - from .force_region import C15845879_ForceRegion_HighLinearDampingForce as test_module + from .tests.force_region import ForceRegion_NoQuiverOnHighLinearDampingForce as test_module class C4976218_RigidBodies_InertiaObjectsNotComputed(EditorSharedTest): - from .rigid_body import C4976218_RigidBodies_InertiaObjectsNotComputed as test_module + from .tests.rigid_body import RigidBody_ComputeInertiaWorks as test_module class C14902098_ScriptCanvas_PostPhysicsUpdate(EditorSharedTest): - from .script_canvas import C14902098_ScriptCanvas_PostPhysicsUpdate as test_module + from .tests.script_canvas import ScriptCanvas_PostPhysicsUpdate as test_module # Note: Test needs to be updated to log for unexpected lines # unexpected_lines = ["Assert"] + test_module.Lines.unexpected class C5959761_ForceRegion_PhysAssetExertsPointForce(EditorSharedTest): - from .force_region import C5959761_ForceRegion_PhysAssetExertsPointForce as test_module + from .tests.force_region import ForceRegion_PxMeshShapedForce as test_module # Marking the Test as expected to fail using the xfail decorator due to sporadic failure on Automated Review: SPEC-3146 # The test still runs, but a failure of the test doesn't result in the test run failing @pytest.mark.xfail(reason="Test Sporadically fails with message [ NOT FOUND ] Success: Bar1 : Expected angular velocity") class C13352089_RigidBodies_MaxAngularVelocity(EditorSharedTest): - from .rigid_body import C13352089_RigidBodies_MaxAngularVelocity as test_module + from .tests.rigid_body import RigidBody_MaxAngularVelocityWorks as test_module class C18243584_Joints_HingeSoftLimitsConstrained(EditorSharedTest): - from .joints import C18243584_Joints_HingeSoftLimitsConstrained as test_module + from .tests.joints import Joints_HingeSoftLimitsConstrained as test_module class C18243589_Joints_BallSoftLimitsConstrained(EditorSharedTest): - from .joints import C18243589_Joints_BallSoftLimitsConstrained as test_module + from .tests.joints import Joints_BallSoftLimitsConstrained as test_module class C18243591_Joints_BallLeadFollowerCollide(EditorSharedTest): - from .joints import C18243591_Joints_BallLeadFollowerCollide as test_module + from .tests.joints import Joints_BallLeadFollowerCollide as test_module class C19578018_ShapeColliderWithNoShapeComponent(EditorSharedTest): - from .collider import C19578018_ShapeColliderWithNoShapeComponent as test_module + from .tests.shape_collider import ShapeCollider_InactiveWhenNoShapeComponent as test_module class C14861500_DefaultSetting_ColliderShape(EditorSharedTest): - from .collider import C14861500_DefaultSetting_ColliderShape as test_module + from .tests.collider import Collider_CheckDefaultShapeSettingIsPxMesh as test_module class C19723164_ShapeCollider_WontCrashEditor(EditorSharedTest): - from .collider import C19723164_ShapeColliders_WontCrashEditor as test_module + from .tests.shape_collider import ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor as test_module class C4982800_PhysXColliderShape_CanBeSelected(EditorSharedTest): - from .collider import C4982800_PhysXColliderShape_CanBeSelected as test_module + from .tests.collider import Collider_SphereShapeEditting as test_module class C4982801_PhysXColliderShape_CanBeSelected(EditorSharedTest): - from .collider import C4982801_PhysXColliderShape_CanBeSelected as test_module + from .tests.collider import Collider_BoxShapeEditting as test_module class C4982802_PhysXColliderShape_CanBeSelected(EditorSharedTest): - from .collider import C4982802_PhysXColliderShape_CanBeSelected as test_module + from .tests.collider import Collider_CapsuleShapeEditting as test_module class C12905528_ForceRegion_WithNonTriggerCollider(EditorSharedTest): - from .force_region import C12905528_ForceRegion_WithNonTriggerCollider as test_module + from .tests.force_region import ForceRegion_WithNonTriggerColliderWarning as test_module # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] class C5932040_ForceRegion_CubeExertsWorldForce(EditorSharedTest): - from .force_region import C5932040_ForceRegion_CubeExertsWorldForce as test_module + from .tests.force_region import ForceRegion_WorldSpaceForceOnRigidBodies as test_module class C5932044_ForceRegion_PointForceOnRigidBody(EditorSharedTest): - from .force_region import C5932044_ForceRegion_PointForceOnRigidBody as test_module + from .tests.force_region import ForceRegion_PointForceOnRigidBodies as test_module class C5959759_RigidBody_ForceRegionSpherePointForce(EditorSharedTest): - from .force_region import C5959759_RigidBody_ForceRegionSpherePointForce as test_module + from .tests.force_region import ForceRegion_SphereShapedForce as test_module class C5959809_ForceRegion_RotationalOffset(EditorSharedTest): - from .force_region import C5959809_ForceRegion_RotationalOffset as test_module + from .tests.force_region import ForceRegion_RotationalOffset as test_module class C15096740_Material_LibraryUpdatedCorrectly(EditorSharedTest): - from .material import C15096740_Material_LibraryUpdatedCorrectly as test_module + from .tests.material import Material_LibraryClearingAssignsDefault as test_module class C4976236_AddPhysxColliderComponent(EditorSharedTest): - from .collider import C4976236_AddPhysxColliderComponent as test_module - + from .tests.collider import Collider_AddColliderComponent as test_module @pytest.mark.xfail(reason="This will fail due to this issue ATOM-15487.") class C14861502_PhysXCollider_AssetAutoAssigned(EditorSharedTest): - from .collider import C14861502_PhysXCollider_AssetAutoAssigned as test_module + from .tests.collider import Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent as test_module class C14861501_PhysXCollider_RenderMeshAutoAssigned(EditorSharedTest): - from .collider import C14861501_PhysXCollider_RenderMeshAutoAssigned as test_module + from .tests.collider import Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent as test_module class C4044695_PhysXCollider_AddMultipleSurfaceFbx(EditorSharedTest): - from .collider import C4044695_PhysXCollider_AddMultipleSurfaceFbx as test_module + from .tests.collider import Collider_MultipleSurfaceSlots as test_module class C14861504_RenderMeshAsset_WithNoPxAsset(EditorSharedTest): - from .collider import C14861504_RenderMeshAsset_WithNoPxAsset as test_module + from .tests.collider import Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx as test_module class C100000_RigidBody_EnablingGravityWorksPoC(EditorSharedTest): - from .collider import C100000_RigidBody_EnablingGravityWorksPoC as test_module + from .tests.rigid_body import RigidBody_EnablingGravityWorksPoC as test_module class C4982798_Collider_ColliderRotationOffset(EditorSharedTest): - from .collider import C4982798_Collider_ColliderRotationOffset as test_module - - class C15308217_NoCrash_LevelSwitch(EditorSharedTest): - from .terrain import C15308217_NoCrash_LevelSwitch as test_module + from .tests.collider import Collider_ColliderRotationOffset as test_module class C6090547_ForceRegion_ParentChildForceRegions(EditorSharedTest): - from .force_region import C6090547_ForceRegion_ParentChildForceRegions as test_module + from .tests.force_region import ForceRegion_ParentChildForcesCombineForces as test_module class C19578021_ShapeCollider_CanBeAdded(EditorSharedTest): - from .collider import C19578021_ShapeCollider_CanBeAdded as test_module + from .tests.shape_collider import ShapeCollider_CanBeAddedWitNoWarnings as test_module class C15425929_Undo_Redo(EditorSharedTest): - from .general import C15425929_Undo_Redo as test_module + from .tests import Physics_UndoRedoWorksOnEntityWithPhysComponents as test_module diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py index fca7e0e3af..da89316993 100755 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py @@ -29,220 +29,224 @@ revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', ' class TestAutomation(TestAutomationBase): @revert_physics_config - def test_C3510642_Terrain_NotCollideWithTerrain(self, request, workspace, editor, launcher_platform): - from .terrain import C3510642_Terrain_NotCollideWithTerrain as test_module + def test_Terrain_NoPhysTerrainComponentNoCollision(self, request, workspace, editor, launcher_platform): + from .tests.terrain import Terrain_NoPhysTerrainComponentNoCollision as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976195_RigidBodies_InitialLinearVelocity(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976195_RigidBodies_InitialLinearVelocity as test_module + def test_RigidBody_InitialLinearVelocity(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_InitialLinearVelocity as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976206_RigidBodies_GravityEnabledActive(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976206_RigidBodies_GravityEnabledActive as test_module + def test_RigidBody_StartGravityEnabledWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_StartGravityEnabledWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976207_PhysXRigidBodies_KinematicBehavior(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976207_PhysXRigidBodies_KinematicBehavior as test_module + def test_RigidBody_KinematicModeWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_KinematicModeWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5932042_PhysXForceRegion_LinearDamping(self, request, workspace, editor, launcher_platform): - from .force_region import C5932042_PhysXForceRegion_LinearDamping as test_module + def test_ForceRegion_LinearDampingForceOnRigidBodies(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_LinearDampingForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5932043_ForceRegion_SimpleDragOnRigidBodies(self, request, workspace, editor, launcher_platform): - from .force_region import C5932043_ForceRegion_SimpleDragOnRigidBodies as test_module + def test_ForceRegion_SimpleDragForceOnRigidBodies(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_SimpleDragForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5959760_PhysXForceRegion_PointForceExertion(self, request, workspace, editor, launcher_platform): - from .force_region import C5959760_PhysXForceRegion_PointForceExertion as test_module + def test_ForceRegion_CapsuleShapedForce(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_CapsuleShapedForce as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5959764_ForceRegion_ForceRegionImpulsesCapsule(self, request, workspace, editor, launcher_platform): - from .force_region import C5959764_ForceRegion_ForceRegionImpulsesCapsule as test_module + def test_ForceRegion_ImpulsesCapsuleShapedRigidBody(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ImpulsesCapsuleShapedRigidBody as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5340400_RigidBody_ManualMomentOfInertia(self, request, workspace, editor, launcher_platform): - from .rigid_body import C5340400_RigidBody_ManualMomentOfInertia as test_module + def test_RigidBody_MomentOfInertiaManualSetting(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_MomentOfInertiaManualSetting as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976210_COM_ManualSetting(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976210_COM_ManualSetting as test_module + def test_RigidBody_COM_ManualSettingWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_COM_ManualSettingWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976194_RigidBody_PhysXComponentIsValid(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976194_RigidBody_PhysXComponentIsValid as test_module + def test_RigidBody_AddRigidBodyComponent(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_AddRigidBodyComponent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5932045_ForceRegion_Spline(self, request, workspace, editor, launcher_platform): - from .force_region import C5932045_ForceRegion_Spline as test_module + def test_ForceRegion_SplineForceOnRigidBodies(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_SplineForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4044457_Material_RestitutionCombine.setreg_override', 'AutomatedTesting/Registry') - def test_C4044457_Material_RestitutionCombine(self, request, workspace, editor, launcher_platform): - from .material import C4044457_Material_RestitutionCombine as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_RestitutionCombine.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_RestitutionCombine(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_RestitutionCombine as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4044456_Material_FrictionCombine.setreg_override', 'AutomatedTesting/Registry') - def test_C4044456_Material_FrictionCombine(self, request, workspace, editor, launcher_platform): - from .material import C4044456_Material_FrictionCombine as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_FrictionCombine.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_FrictionCombine(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_FrictionCombine as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982797_Collider_ColliderOffset(self, request, workspace, editor, launcher_platform): - from .collider import C4982797_Collider_ColliderOffset as test_module + def test_Collider_ColliderPositionOffset(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_ColliderPositionOffset as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976200_RigidBody_AngularDampingObjectRotation(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976200_RigidBody_AngularDampingObjectRotation as test_module + def test_RigidBody_AngularDampingAffectsRotation(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_AngularDampingAffectsRotation as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5689529_Verify_Terrain_RigidBody_Collider_Mesh(self, request, workspace, editor, launcher_platform): - from .general import C5689529_Verify_Terrain_RigidBody_Collider_Mesh as test_module + def test_Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether(self, request, workspace, editor, launcher_platform): + from .tests import Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5959810_ForceRegion_ForceRegionCombinesForces(self, request, workspace, editor, launcher_platform): - from .force_region import C5959810_ForceRegion_ForceRegionCombinesForces as test_module + def test_ForceRegion_MultipleForcesInSameComponentCombineForces(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_MultipleForcesInSameComponentCombineForces as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5959765_ForceRegion_AssetGetsImpulsed(self, request, workspace, editor, launcher_platform): - from .force_region import C5959765_ForceRegion_AssetGetsImpulsed as test_module + def test_ForceRegion_ImpulsesPxMeshShapedRigidBody(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ImpulsesPxMeshShapedRigidBody as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6274125_ScriptCanvas_TriggerEvents(self, request, workspace, editor, launcher_platform): - from .script_canvas import C6274125_ScriptCanvas_TriggerEvents as test_module + def test_ScriptCanvas_TriggerEvents(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_TriggerEvents as test_module # FIXME: expected_lines = test_module.LogLines.expected_lines self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090554_ForceRegion_PointForceNegative(self, request, workspace, editor, launcher_platform): - from .force_region import C6090554_ForceRegion_PointForceNegative as test_module + def test_ForceRegion_ZeroPointForceDoesNothing(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ZeroPointForceDoesNothing as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090550_ForceRegion_WorldSpaceForceNegative(self, request, workspace, editor, launcher_platform): - from .force_region import C6090550_ForceRegion_WorldSpaceForceNegative as test_module + def test_ForceRegion_ZeroWorldSpaceForceDoesNothing(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ZeroWorldSpaceForceDoesNothing as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090552_ForceRegion_LinearDampingNegative(self, request, workspace, editor, launcher_platform): - from .force_region import C6090552_ForceRegion_LinearDampingNegative as test_module + def test_ForceRegion_ZeroLinearDampingDoesNothing(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ZeroLinearDampingDoesNothing as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5968760_ForceRegion_CheckNetForceChange(self, request, workspace, editor, launcher_platform): - from .force_region import C5968760_ForceRegion_CheckNetForceChange as test_module + def test_ForceRegion_MovingForceRegionChangesNetForce(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_MovingForceRegionChangesNetForce as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C12712452_ScriptCanvas_CollisionEvents(self, request, workspace, editor, launcher_platform): - from .script_canvas import C12712452_ScriptCanvas_CollisionEvents as test_module + def test_ScriptCanvas_CollisionEvents(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_CollisionEvents as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(self, request, workspace, editor, launcher_platform): - from .force_region import C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude as test_module + def test_ForceRegion_DirectionHasNoAffectOnTotalForce(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_DirectionHasNoAffectOnTotalForce as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976204_Verify_Start_Asleep_Condition(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976204_Verify_Start_Asleep_Condition as test_module + def test_RigidBody_StartAsleepWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_StartAsleepWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090546_ForceRegion_SliceFileInstantiates(self, request, workspace, editor, launcher_platform): - from .force_region import C6090546_ForceRegion_SliceFileInstantiates as test_module + def test_ForceRegion_SliceFileInstantiates(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_SliceFileInstantiates as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090551_ForceRegion_LocalSpaceForceNegative(self, request, workspace, editor, launcher_platform): - from .force_region import C6090551_ForceRegion_LocalSpaceForceNegative as test_module + def test_ForceRegion_ZeroLocalSpaceForceDoesNothing(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ZeroLocalSpaceForceDoesNothing as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090553_ForceRegion_SimpleDragForceOnRigidBodies(self, request, workspace, editor, launcher_platform): - from .force_region import C6090553_ForceRegion_SimpleDragForceOnRigidBodies as test_module + def test_ForceRegion_ZeroSimpleDragForceDoesNothing(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ZeroSimpleDragForceDoesNothing as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976209_RigidBody_ComputesCOM(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976209_RigidBody_ComputesCOM as test_module + def test_RigidBody_COM_ComputingWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_COM_ComputingWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976201_RigidBody_MassIsAssigned(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976201_RigidBody_MassIsAssigned as test_module + def test_RigidBody_MassDifferentValuesWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_MassDifferentValuesWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C18981526_Material_RestitutionCombinePriority.setreg_override', 'AutomatedTesting/Registry') - def test_C18981526_Material_RestitutionCombinePriority(self, request, workspace, editor, launcher_platform): - from .material import C18981526_Material_RestitutionCombinePriority as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_RestitutionCombinePriorityOrder.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_RestitutionCombinePriorityOrder(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_RestitutionCombinePriorityOrder as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C12868580_ForceRegion_SplineModifiedTransform(self, request, workspace, editor, launcher_platform): - from .force_region import C12868580_ForceRegion_SplineModifiedTransform as test_module + def test_ForceRegion_SplineRegionWithModifiedTransform(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_SplineRegionWithModifiedTransform as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C12712455_ScriptCanvas_ShapeCastVerification(self, request, workspace, editor, launcher_platform): - from .script_canvas import C12712455_ScriptCanvas_ShapeCastVerification as test_module + def test_ScriptCanvas_ShapeCast(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_ShapeCast as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976197_RigidBodies_InitialAngularVelocity(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976197_RigidBodies_InitialAngularVelocity as test_module + def test_RigidBody_InitialAngularVelocity(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_InitialAngularVelocity as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6090555_ForceRegion_SplineFollowOnRigidBodies(self, request, workspace, editor, launcher_platform): - from .force_region import C6090555_ForceRegion_SplineFollowOnRigidBodies as test_module + def test_ForceRegion_ZeroSplineForceDoesNothing(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ZeroSplineForceDoesNothing as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C6131473_StaticSlice_OnDynamicSliceSpawn(self, request, workspace, editor, launcher_platform): - from .general import C6131473_StaticSlice_OnDynamicSliceSpawn as test_module + def test_Physics_DynamicSliceWithPhysNotSpawnsStaticSlice(self, request, workspace, editor, launcher_platform): + from .tests import Physics_DynamicSliceWithPhysNotSpawnsStaticSlice as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5959808_ForceRegion_PositionOffset(self, request, workspace, editor, launcher_platform): - from .force_region import C5959808_ForceRegion_PositionOffset as test_module + def test_ForceRegion_PositionOffset(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_PositionOffset as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C18977601_Material_FrictionCombinePriority.setreg_override', 'AutomatedTesting/Registry') - def test_C18977601_Material_FrictionCombinePriority(self, request, workspace, editor, launcher_platform): - from .material import C18977601_Material_FrictionCombinePriority as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_FrictionCombinePriorityOrder.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_FrictionCombinePriorityOrder(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_FrictionCombinePriorityOrder as test_module self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( reason="Something with the CryRenderer disabling is causing this test to fail now.") @revert_physics_config - def test_C13895144_Ragdoll_ChangeLevel(self, request, workspace, editor, launcher_platform): - from .ragdoll import C13895144_Ragdoll_ChangeLevel as test_module + def test_Ragdoll_LevelSwitchDoesNotCrash(self, request, workspace, editor, launcher_platform): + from .tests.ragdoll import Ragdoll_LevelSwitchDoesNotCrash as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(self, request, workspace, editor, launcher_platform): - from .force_region import C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody as test_module + def test_ForceRegion_MultipleComponentsCombineForces(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_MultipleComponentsCombineForces as test_module self._run_test(request, workspace, editor, test_module) # Marking the test as an expected failure due to sporadic failure on Automated Review: LYN-2580 @@ -250,237 +254,303 @@ class TestAutomation(TestAutomationBase): @pytest.mark.xfail( reason="This test needs new physics asset with multiple materials to be more stable.") @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4044697_Material_PerfaceMaterialValidation.setreg_override', 'AutomatedTesting/Registry') - def test_C4044697_Material_PerfaceMaterialValidation(self, request, workspace, editor, launcher_platform): - from .material import C4044697_Material_PerfaceMaterialValidation as test_module + @fm.file_override('physxsystemconfiguration.setreg', 'Material_PerFaceMaterialGetsCorrectMaterial.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_PerFaceMaterialGetsCorrectMaterial(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_PerFaceMaterialGetsCorrectMaterial as test_module self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( reason="This test will sometimes fail as the ball will continue to roll before the timeout is reached.") @revert_physics_config - def test_C4976202_RigidBody_StopsWhenBelowKineticThreshold(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976202_RigidBody_StopsWhenBelowKineticThreshold as test_module + def test_RigidBody_SleepWhenBelowKineticThreshold(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_SleepWhenBelowKineticThreshold as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C13351703_COM_NotIncludeTriggerShapes(self, request, workspace, editor, launcher_platform): - from .rigid_body import C13351703_COM_NotIncludeTriggerShapes as test_module + def test_RigidBody_COM_NotIncludesTriggerShapes(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_COM_NotIncludesTriggerShapes as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5296614_PhysXMaterial_ColliderShape(self, request, workspace, editor, launcher_platform): - from .material import C5296614_PhysXMaterial_ColliderShape as test_module + def test_Material_NoEffectIfNoColliderShape(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_NoEffectIfNoColliderShape as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982595_Collider_TriggerDisablesCollision(self, request, workspace, editor, launcher_platform): - from .collider import C4982595_Collider_TriggerDisablesCollision as test_module + def test_Collider_TriggerPassThrough(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_TriggerPassThrough as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C14976307_Gravity_SetGravityWorks(self, request, workspace, editor, launcher_platform): - from .general import C14976307_Gravity_SetGravityWorks as test_module + def test_RigidBody_SetGravityWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_SetGravityWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.setreg_override', 'AutomatedTesting/Registry') - def test_C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(self, request, workspace, editor, launcher_platform): - from .material import C15556261_PhysXMaterials_CharacterControllerMaterialAssignment as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_CharacterController.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_CharacterController(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_CharacterController as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4044694_Material_EmptyLibraryUsesDefault(self, request, workspace, editor, launcher_platform): - from .material import C4044694_Material_EmptyLibraryUsesDefault as test_module + def test_Material_EmptyLibraryUsesDefault(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_EmptyLibraryUsesDefault as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C15845879_ForceRegion_HighLinearDampingForce(self, request, workspace, editor, launcher_platform): - from .force_region import C15845879_ForceRegion_HighLinearDampingForce as test_module + def test_ForceRegion_NoQuiverOnHighLinearDampingForce(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_NoQuiverOnHighLinearDampingForce as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4976218_RigidBodies_InertiaObjectsNotComputed(self, request, workspace, editor, launcher_platform): - from .rigid_body import C4976218_RigidBodies_InertiaObjectsNotComputed as test_module + def test_RigidBody_ComputeInertiaWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_ComputeInertiaWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C14902098_ScriptCanvas_PostPhysicsUpdate(self, request, workspace, editor, launcher_platform): - from .script_canvas import C14902098_ScriptCanvas_PostPhysicsUpdate as test_module + def test_ScriptCanvas_PostPhysicsUpdate(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_PostPhysicsUpdate as test_module # Fixme: unexpected_lines = ["Assert"] + test_module.Lines.unexpected self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4976245_PhysXCollider_CollisionLayerTest.setreg_override', 'AutomatedTesting/Registry') - def test_C4976245_PhysXCollider_CollisionLayerTest(self, request, workspace, editor, launcher_platform): - from .collider import C4976245_PhysXCollider_CollisionLayerTest as test_module + @fm.file_override('physxsystemconfiguration.setreg','Collider_NoneCollisionGroupSameLayerNotCollide.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Collider_NoneCollisionGroupSameLayerNotCollide(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_NoneCollisionGroupSameLayerNotCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4976244_Collider_SameGroupSameLayerCollision.setreg_override', 'AutomatedTesting/Registry') - def test_C4976244_Collider_SameGroupSameLayerCollision(self, request, workspace, editor, launcher_platform): - from .collider import C4976244_Collider_SameGroupSameLayerCollision as test_module + @fm.file_override('physxsystemconfiguration.setreg','Collider_SameCollisionGroupSameCustomLayerCollide.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Collider_SameCollisionGroupSameCustomLayerCollide(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_SameCollisionGroupSameCustomLayerCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxdefaultsceneconfiguration.setreg','C14195074_ScriptCanvas_PostUpdateEvent.setreg_override', 'AutomatedTesting/Registry') - def test_C14195074_ScriptCanvas_PostUpdateEvent(self, request, workspace, editor, launcher_platform): - from .script_canvas import C14195074_ScriptCanvas_PostUpdateEvent as test_module + @fm.file_override('physxdefaultsceneconfiguration.setreg','ScriptCanvas_PostUpdateEvent.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_ScriptCanvas_PostUpdateEvent(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_PostUpdateEvent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4044461_Material_Restitution.setreg_override', 'AutomatedTesting/Registry') - def test_C4044461_Material_Restitution(self, request, workspace, editor, launcher_platform): - from .material import C4044461_Material_Restitution as test_module + @fm.file_override('physxsystemconfiguration.setreg','Material_Restitution.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Material_Restitution(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_Restitution as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxdefaultsceneconfiguration.setreg','C14902097_ScriptCanvas_PreUpdateEvent.setreg_override', 'AutomatedTesting/Registry') - def test_C14902097_ScriptCanvas_PreUpdateEvent(self, request, workspace, editor, launcher_platform): - from .script_canvas import C14902097_ScriptCanvas_PreUpdateEvent as test_module + @fm.file_override('physxdefaultsceneconfiguration.setreg', 'ScriptCanvas_PreUpdateEvent.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_ScriptCanvas_PreUpdateEvent(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_PreUpdateEvent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C5959761_ForceRegion_PhysAssetExertsPointForce(self, request, workspace, editor, launcher_platform): - from .force_region import C5959761_ForceRegion_PhysAssetExertsPointForce as test_module + def test_ForceRegion_PxMeshShapedForce(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_PxMeshShapedForce as test_module self._run_test(request, workspace, editor, test_module) # Marking the Test as expected to fail using the xfail decorator due to sporadic failure on Automated Review: SPEC-3146 # The test still runs, but a failure of the test doesn't result in the test run failing @pytest.mark.xfail(reason="Test Sporadically fails with message [ NOT FOUND ] Success: Bar1 : Expected angular velocity") @revert_physics_config - def test_C13352089_RigidBodies_MaxAngularVelocity(self, request, workspace, editor, launcher_platform): - from .rigid_body import C13352089_RigidBodies_MaxAngularVelocity as test_module + def test_RigidBody_MaxAngularVelocityWorks(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_MaxAngularVelocityWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C18243584_Joints_HingeSoftLimitsConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243584_Joints_HingeSoftLimitsConstrained as test_module + def test_Joints_HingeSoftLimitsConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_HingeSoftLimitsConstrained as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C18243589_Joints_BallSoftLimitsConstrained(self, request, workspace, editor, launcher_platform): - from .joints import C18243589_Joints_BallSoftLimitsConstrained as test_module + def test_Joints_BallSoftLimitsConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_BallSoftLimitsConstrained as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C18243591_Joints_BallLeadFollowerCollide(self, request, workspace, editor, launcher_platform): - from .joints import C18243591_Joints_BallLeadFollowerCollide as test_module + def test_Joints_BallLeadFollowerCollide(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_BallLeadFollowerCollide as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C4976227_Collider_NewGroup.setreg_override', 'AutomatedTesting/Registry') - def test_C4976227_Collider_NewGroup(self, request, workspace, editor, launcher_platform): - from .collider import C4976227_Collider_NewGroup as test_module + @fm.file_override('physxsystemconfiguration.setreg','Collider_AddingNewGroupWorks.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Collider_AddingNewGroupWorks(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_AddingNewGroupWorks as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C19578018_ShapeColliderWithNoShapeComponent(self, request, workspace, editor, launcher_platform): - from .collider import C19578018_ShapeColliderWithNoShapeComponent as test_module + def test_ShapeCollider_InactiveWhenNoShapeComponent(self, request, workspace, editor, launcher_platform): + from .tests.shape_collider import ShapeCollider_InactiveWhenNoShapeComponent as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C14861500_DefaultSetting_ColliderShape(self, request, workspace, editor, launcher_platform): - from .collider import C14861500_DefaultSetting_ColliderShape as test_module + def test_Collider_CheckDefaultShapeSettingIsPxMesh(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_CheckDefaultShapeSettingIsPxMesh as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C19723164_ShapeCollider_WontCrashEditor(self, request, workspace, editor, launcher_platform): - from .collider import C19723164_ShapeColliders_WontCrashEditor as test_module + def test_ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor(self, request, workspace, editor, launcher_platform): + from .tests.shape_collider import ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982800_PhysXColliderShape_CanBeSelected(self, request, workspace, editor, launcher_platform): - from .collider import C4982800_PhysXColliderShape_CanBeSelected as test_module + def test_Collider_SphereShapeEditting(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_SphereShapeEditting as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982801_PhysXColliderShape_CanBeSelected(self, request, workspace, editor, launcher_platform): - from .collider import C4982801_PhysXColliderShape_CanBeSelected as test_module + def test_Collider_BoxShapeEditting(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_BoxShapeEditting as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982802_PhysXColliderShape_CanBeSelected(self, request, workspace, editor, launcher_platform): - from .collider import C4982802_PhysXColliderShape_CanBeSelected as test_module + def test_Collider_CapsuleShapeEditting(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_CapsuleShapeEditting as test_module self._run_test(request, workspace, editor, test_module) - def test_C12905528_ForceRegion_WithNonTriggerCollider(self, request, workspace, editor, launcher_platform): - from .force_region import C12905528_ForceRegion_WithNonTriggerCollider as test_module + def test_ForceRegion_WithNonTriggerColliderWarning(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_WithNonTriggerColliderWarning as test_module # Fixme: expected_lines = ["[Warning] (PhysX Force Region) - Please ensure collider component marked as trigger exists in entity"] self._run_test(request, workspace, editor, test_module) - def test_C5932040_ForceRegion_CubeExertsWorldForce(self, request, workspace, editor, launcher_platform): - from .force_region import C5932040_ForceRegion_CubeExertsWorldForce as test_module + def test_ForceRegion_WorldSpaceForceOnRigidBodies(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_WorldSpaceForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) - def test_C5932044_ForceRegion_PointForceOnRigidBody(self, request, workspace, editor, launcher_platform): - from .force_region import C5932044_ForceRegion_PointForceOnRigidBody as test_module + def test_ForceRegion_PointForceOnRigidBodies(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_PointForceOnRigidBodies as test_module self._run_test(request, workspace, editor, test_module) - def test_C5959759_RigidBody_ForceRegionSpherePointForce(self, request, workspace, editor, launcher_platform): - from .force_region import C5959759_RigidBody_ForceRegionSpherePointForce as test_module + def test_ForceRegion_SphereShapedForce(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_SphereShapedForce as test_module self._run_test(request, workspace, editor, test_module) - def test_C5959809_ForceRegion_RotationalOffset(self, request, workspace, editor, launcher_platform): - from .force_region import C5959809_ForceRegion_RotationalOffset as test_module + def test_ForceRegion_RotationalOffset(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_RotationalOffset as test_module self._run_test(request, workspace, editor, test_module) - def test_C15096740_Material_LibraryUpdatedCorrectly(self, request, workspace, editor, launcher_platform): - from .material import C15096740_Material_LibraryUpdatedCorrectly as test_module + def test_Material_LibraryClearingAssignsDefault(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_LibraryClearingAssignsDefault as test_module self._run_test(request, workspace, editor, test_module) - def test_C4976236_AddPhysxColliderComponent(self, request, workspace, editor, launcher_platform): - from .collider import C4976236_AddPhysxColliderComponent as test_module + def test_Collider_AddColliderComponent(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_AddColliderComponent as test_module self._run_test(request, workspace, editor, test_module) @pytest.mark.xfail( reason="This will fail due to this issue ATOM-15487.") - def test_C14861502_PhysXCollider_AssetAutoAssigned(self, request, workspace, editor, launcher_platform): - from .collider import C14861502_PhysXCollider_AssetAutoAssigned as test_module + def test_Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent as test_module self._run_test(request, workspace, editor, test_module) - def test_C14861501_PhysXCollider_RenderMeshAutoAssigned(self, request, workspace, editor, launcher_platform): - from .collider import C14861501_PhysXCollider_RenderMeshAutoAssigned as test_module + def test_Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent as test_module self._run_test(request, workspace, editor, test_module) - def test_C4044695_PhysXCollider_AddMultipleSurfaceFbx(self, request, workspace, editor, launcher_platform): - from .collider import C4044695_PhysXCollider_AddMultipleSurfaceFbx as test_module + def test_Collider_MultipleSurfaceSlots(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_MultipleSurfaceSlots as test_module self._run_test(request, workspace, editor, test_module) - def test_C14861504_RenderMeshAsset_WithNoPxAsset(self, request, workspace, editor, launcher_platform): - from .collider import C14861504_RenderMeshAsset_WithNoPxAsset as test_module + def test_Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx as test_module self._run_test(request, workspace, editor, test_module) - def test_C100000_RigidBody_EnablingGravityWorksPoC(self, request, workspace, editor, launcher_platform): - from .collider import C100000_RigidBody_EnablingGravityWorksPoC as test_module + def test_RigidBody_EnablingGravityWorksPoC(self, request, workspace, editor, launcher_platform): + from .tests.rigid_body import RigidBody_EnablingGravityWorksPoC as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - @fm.file_override('physxsystemconfiguration.setreg','C3510644_Collider_CollisionGroups.setreg_override', 'AutomatedTesting/Registry') - def test_C3510644_Collider_CollisionGroups(self, request, workspace, editor, launcher_platform): - from .collider import C3510644_Collider_CollisionGroups as test_module + @fm.file_override('physxsystemconfiguration.setreg','Collider_CollisionGroupsWorkflow.setreg_override', + 'AutomatedTesting/Registry', search_subdirs=True) + def test_Collider_CollisionGroupsWorkflow(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_CollisionGroupsWorkflow as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C4982798_Collider_ColliderRotationOffset(self, request, workspace, editor, launcher_platform): - from .collider import C4982798_Collider_ColliderRotationOffset as test_module + def test_Collider_ColliderRotationOffset(self, request, workspace, editor, launcher_platform): + from .tests.collider import Collider_ColliderRotationOffset as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C15308217_NoCrash_LevelSwitch(self, request, workspace, editor, launcher_platform): - from .terrain import C15308217_NoCrash_LevelSwitch as test_module - self._run_test(request, workspace, editor, test_module) - - @revert_physics_config - def test_C6090547_ForceRegion_ParentChildForceRegions(self, request, workspace, editor, launcher_platform): - from .force_region import C6090547_ForceRegion_ParentChildForceRegions as test_module + def test_ForceRegion_ParentChildForcesCombineForces(self, request, workspace, editor, launcher_platform): + from .tests.force_region import ForceRegion_ParentChildForcesCombineForces as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C19578021_ShapeCollider_CanBeAdded(self, request, workspace, editor, launcher_platform): - from .collider import C19578021_ShapeCollider_CanBeAdded as test_module + def test_ShapeCollider_CanBeAddedWitNoWarnings(self, request, workspace, editor, launcher_platform): + from .tests.shape_collider import ShapeCollider_CanBeAddedWitNoWarnings as test_module self._run_test(request, workspace, editor, test_module) @revert_physics_config - def test_C15425929_Undo_Redo(self, request, workspace, editor, launcher_platform): - from .general import C15425929_Undo_Redo as test_module + def test_Physics_UndoRedoWorksOnEntityWithPhysComponents(self, request, workspace, editor, launcher_platform): + from .tests import Physics_UndoRedoWorksOnEntityWithPhysComponents as test_module self._run_test(request, workspace, editor, test_module) + + def test_Joints_Fixed2BodiesConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_Fixed2BodiesConstrained as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_Hinge2BodiesConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_Hinge2BodiesConstrained as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_Ball2BodiesConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_Ball2BodiesConstrained as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_FixedBreakable(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_FixedBreakable as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_HingeBreakable(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_HingeBreakable as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_BallBreakable(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_BallBreakable as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_HingeNoLimitsConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_HingeNoLimitsConstrained as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_BallNoLimitsConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_BallNoLimitsConstrained as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_FixedLeadFollowerCollide(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_FixedLeadFollowerCollide as test_module + self._run_test(request, workspace, editor, test_module) + + def test_Joints_GlobalFrameConstrained(self, request, workspace, editor, launcher_platform): + from .tests.joints import Joints_GlobalFrameConstrained as test_module + self._run_test(request, workspace, editor, test_module) + + @revert_physics_config + def test_Material_DefaultLibraryUpdatedAcrossLevels(self, request, workspace, editor, launcher_platform): + @fm.file_override("physxsystemconfiguration.setreg", + "Material_DefaultLibraryUpdatedAcrossLevels_before.setreg", + "AutomatedTesting", + search_subdirs=True) + def levels_before(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_DefaultLibraryUpdatedAcrossLevels_before as test_module_0 + self._run_test(request, workspace, editor, test_module_0) + + # File override replaces the previous physxconfiguration file with another where the only difference is the default material library + @fm.file_override("physxsystemconfiguration.setreg", + "Material_DefaultLibraryUpdatedAcrossLevels_after.setreg", + "AutomatedTesting", + search_subdirs=True) + def levels_after(self, request, workspace, editor, launcher_platform): + from .tests.material import Material_DefaultLibraryUpdatedAcrossLevels_after as test_module_1 + self._run_test(request, workspace, editor, test_module_1) + + levels_before(self, request, workspace, editor, launcher_platform) + levels_after(self, request, workspace, editor, launcher_platform) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py old mode 100755 new mode 100644 index 1d26e2e40c..81fdc747d5 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py @@ -29,14 +29,14 @@ revert_physics_config = fm.file_revert_list(['physxdebugconfiguration.setreg', ' class TestAutomation(TestAutomationBase): ## Seems to be flaky, need to investigate - def test_C19536274_GetCollisionName_PrintsName(self, request, workspace, editor, launcher_platform): - from .general import C19536274_GetCollisionName_PrintsName as test_module + def test_ScriptCanvas_GetCollisionNameReturnsName(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_GetCollisionNameReturnsName as test_module # Fixme: expected_lines=["Layer Name: Right"] self._run_test(request, workspace, editor, test_module) ## Seems to be flaky, need to investigate - def test_C19536277_GetCollisionName_PrintsNothing(self, request, workspace, editor, launcher_platform): - from .general import C19536277_GetCollisionName_PrintsNothing as test_module + def test_ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer(self, request, workspace, editor, launcher_platform): + from .tests.script_canvas import ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer as test_module # All groups present in the PhysX Collider that could show up in test # Fixme: collision_groups = ["All", "None", "All_NoTouchBend", "All_3", "None_1", "All_NoTouchBend_1", "All_2", "None_1_1", "All_NoTouchBend_1_1", "All_1", "None_1_1_1", "All_NoTouchBend_1_1_1", "All_4", "None_1_1_1_1", "All_NoTouchBend_1_1_1_1", "GroupLeft", "GroupRight"] # Fixme: for group in collision_groups: diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py b/AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py deleted file mode 100644 index f3641b12bc..0000000000 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C15308217_NoCrash_LevelSwitch.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - - -# Test case ID : C15308217 -# Test Case Title : Verify that the Terrain texture layer doesn't crash when changing -# from on a level with a terrain component to another level without a terrain component - - - -# fmt: off -class Tests(): - enter_game_mode_1 = ("Entered game mode for level1", "Failed to enter game mode for level1") - enter_game_mode_2 = ("Entered game mode for level2", "Failed to enter game mode for level2") - find_terrain = ("Terrain found", "Terrain not found") - exit_game_mode_1 = ("Exited game mode for level1", "Couldn't exit game mode for level1") - exit_game_mode_2 = ("Exited game mode for level2", "Couldn't exit game mode for level2") -# fmt: on - - -def C15308217_NoCrash_LevelSwitch(): - - """ - Summary: - Verify that the Terrain texture layer doesn't crash when changing from on a level with a - terrain component to another level without a terrain component - - Level Description: - Level C15308217_NoCrash_LevelSwitchWithOutTerrain: - No entities - Level C15308217_NoCrash_LevelSwitchWithTerrain: - Terrain (entity) - PhysX Terrain entity is created in the level - - Expected Behavior: - Editior should not crash. - We are switching the levels and validating the entities and checking any crash is happening while - switching between levels - - Test Steps: - 1) Open level with PhysX Terrain component - 2) Enter game mode - 3) Retrieve and validate entities - 4) Exit game mode - 5) Open level which doesn't have a PhysX Terrain component - 6) Enter game mode - 7) Wait for WAIT_TIME to check if any crash happens - 8) Exit game mode - 9) Close the editor - - - Note: - - This test file must be called from the Open 3D Engine Editor command terminal - - Any passed and failed tests are written to the Editor.log file. - Parsing the file or running a log_monitor are required to observe the test results. - - :return: None - """ - - import os - import sys - from editor_python_test_tools.utils import Report - from editor_python_test_tools.utils import TestHelper as helper - - import azlmbr.legacy.general as general - import azlmbr.bus - - # Constants - WAIT_TIME = 1.0 - - helper.init_idle() - - # 1) Open level with PhysX Terrain component - helper.open_level("Physics", "C15308217_NoCrash_LevelSwitchWithTerrain") - - # 2) Enter game mode - helper.enter_game_mode(Tests.enter_game_mode_1) - - # 3) Retrieve and validate entities - terrain_id = general.find_game_entity("Terrain") - Report.critical_result(Tests.find_terrain, terrain_id.IsValid()) - - # 4) Exit game mode - helper.exit_game_mode(Tests.exit_game_mode_1) - - # 5) Open level which doesn't have a PhysX Terrain component - helper.open_level("Physics", "C15308217_NoCrash_LevelSwitchWithOutTerrain") - - # 6) Enter game mode - helper.enter_game_mode(Tests.enter_game_mode_2) - - # 7) Wait for WAIT_TIME to check if any crash happens - general.idle_wait(WAIT_TIME) - - # 8) Exit game mode - helper.exit_game_mode(Tests.exit_game_mode_2) - - - -if __name__ == "__main__": - from editor_python_test_tools.utils import Report - Report.start_test(C15308217_NoCrash_LevelSwitch) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C6131473_StaticSlice_OnDynamicSliceSpawn.py b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/general/C6131473_StaticSlice_OnDynamicSliceSpawn.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py index e28893dee3..03674fbb17 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C6131473_StaticSlice_OnDynamicSliceSpawn.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py @@ -21,7 +21,7 @@ class Tests(): # fmt: on -def C6131473_StaticSlice_OnDynamicSliceSpawn(): +def Physics_DynamicSliceWithPhysNotSpawnsStaticSlice(): """ Summary: @@ -71,7 +71,7 @@ def C6131473_StaticSlice_OnDynamicSliceSpawn(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C6131473_StaticSlice_OnDynamicSliceSpawn") + helper.open_level("Physics", "Physics_DynamicSliceWithPhysNotSpawnsStaticSlice") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -99,4 +99,4 @@ def C6131473_StaticSlice_OnDynamicSliceSpawn(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6131473_StaticSlice_OnDynamicSliceSpawn) + Report.start_test(Physics_DynamicSliceWithPhysNotSpawnsStaticSlice) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C15425929_Undo_Redo.py b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py similarity index 93% rename from AutomatedTesting/Gem/PythonTests/physics/general/C15425929_Undo_Redo.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py index f74c1d10cb..f114eeaa1f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C15425929_Undo_Redo.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py @@ -20,7 +20,7 @@ class Tests: # fmt: off -def C15425929_Undo_Redo(): +def Physics_UndoRedoWorksOnEntityWithPhysComponents(): """ Summary: Tests that no error messages arise when using the undo and redo functions in the editor. @@ -53,7 +53,7 @@ def C15425929_Undo_Redo(): helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C15425929_Undo_Redo") + helper.open_level("Physics", "Physics_UndoRedoWorksOnEntityWithPhysComponents") with Tracer() as error_tracer: # Entity to delete and undo and re-delete @@ -87,4 +87,4 @@ def C15425929_Undo_Redo(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15425929_Undo_Redo) + Report.start_test(Physics_UndoRedoWorksOnEntityWithPhysComponents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py similarity index 93% rename from AutomatedTesting/Gem/PythonTests/physics/general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py index f011e65972..f82eed5895 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C5689529_Verify_Terrain_RigidBody_Collider_Mesh.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py @@ -23,7 +23,7 @@ class Tests(): # fmt: on -def C5689529_Verify_Terrain_RigidBody_Collider_Mesh(): +def Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether(): """ Summary: @@ -71,7 +71,7 @@ def C5689529_Verify_Terrain_RigidBody_Collider_Mesh(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5689529_Verify_Terrain_RigidBody_Collider_Mesh") + helper.open_level("Physics", "Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -102,4 +102,4 @@ def C5689529_Verify_Terrain_RigidBody_Collider_Mesh(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5689529_Verify_Terrain_RigidBody_Collider_Mesh) + Report.start_test(Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C29032500_EditorComponents_WorldBodyBusWorks.py b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/general/C29032500_EditorComponents_WorldBodyBusWorks.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py index 0f7f91dafb..ba3f2088cb 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C29032500_EditorComponents_WorldBodyBusWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py @@ -48,7 +48,7 @@ class Tests(): # fmt: on -def C29032500_EditorComponents_WorldBodyBusWorks(): +def Physics_WorldBodyBusWorksOnEditorComponents(): r""" Summary: Runs a test to make sure that a WorldBodyBus works property for components @@ -92,7 +92,7 @@ def C29032500_EditorComponents_WorldBodyBusWorks(): AABB_THRESHOLD = 0.01 # Entities won't move in the simulation helper.init_idle() - helper.open_level("Physics", "C29032500_EditorComponents_WorldBodyBusWorks") + helper.open_level("Physics", "Physics_WorldBodyBusWorksOnEditorComponents") def create_aabb(aabb_min_tuple, aabb_max_tuple): return azlmbr.math.Aabb_CreateFromMinMax(azlmbr.math.Vector3(aabb_min_tuple[0], aabb_min_tuple[1], aabb_min_tuple[2]), @@ -150,4 +150,4 @@ def C29032500_EditorComponents_WorldBodyBusWorks(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C29032500_EditorComponents_WorldBodyBusWorks) + Report.start_test(Physics_WorldBodyBusWorksOnEditorComponents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/character_controller/C14654881_CharacterController_SwitchLevels.py b/AutomatedTesting/Gem/PythonTests/physics/tests/character_controller/CharacterController_SwitchLevels.py similarity index 90% rename from AutomatedTesting/Gem/PythonTests/physics/character_controller/C14654881_CharacterController_SwitchLevels.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/character_controller/CharacterController_SwitchLevels.py index 3976bcf25c..564a2a1020 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/character_controller/C14654881_CharacterController_SwitchLevels.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/character_controller/CharacterController_SwitchLevels.py @@ -23,7 +23,7 @@ class Tests: # fmt: on -def C14654881_CharacterController_SwitchLevels(): +def CharacterController_SwitchLevels(): """ Summary: Runs an automated test to verify that switching levels from a level containing a character controller component @@ -64,7 +64,7 @@ def C14654881_CharacterController_SwitchLevels(): helper.init_idle() # 1.1) Load level 1 (with character controller) - helper.open_level("Physics", "C14654881_CharacterController_SwitchLevels") + helper.open_level("Physics", "CharacterController_SwitchLevels") # 1.2) Enter game mode helper.enter_game_mode(Tests.level1_enter_game_mode) @@ -77,7 +77,7 @@ def C14654881_CharacterController_SwitchLevels(): helper.exit_game_mode(Tests.level1_exit_game_mode) # 2.1) Load level 2 (empty level) - helper.open_level("Physics", "C14654881_CharacterController_SwitchLevelsEmpty") + helper.open_level("Physics", "Base") # 2.2) Enter game mode helper.enter_game_mode(Tests.level2_enter_game_mode) @@ -89,4 +89,4 @@ def C14654881_CharacterController_SwitchLevels(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14654881_CharacterController_SwitchLevels) + Report.start_test(CharacterController_SwitchLevels) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976236_AddPhysxColliderComponent.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddColliderComponent.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4976236_AddPhysxColliderComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddColliderComponent.py index e4341bb148..4172e66962 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976236_AddPhysxColliderComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddColliderComponent.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def C4976236_AddPhysxColliderComponent(): +def Collider_AddColliderComponent(): """ Summary: Opens an empty level and creates an Entity with PhysX Collider. Verify that editor remains stable in Game mode. @@ -83,4 +83,4 @@ def C4976236_AddPhysxColliderComponent(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976236_AddPhysxColliderComponent) + Report.start_test(Collider_AddColliderComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976227_Collider_NewGroup.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddingNewGroupWorks.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4976227_Collider_NewGroup.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddingNewGroupWorks.py index e9704d6be5..acb5ae6bee 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976227_Collider_NewGroup.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddingNewGroupWorks.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C4976227_Collider_NewGroup(): +def Collider_AddingNewGroupWorks(): """ Summary: Runs an automated test to ensure that a collision group can be added. @@ -59,7 +59,7 @@ def C4976227_Collider_NewGroup(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C4976227_Collider_NewGroup") + helper.open_level("Physics", "Collider_AddingNewGroupWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -80,4 +80,4 @@ def C4976227_Collider_NewGroup(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976227_Collider_NewGroup) + Report.start_test(Collider_AddingNewGroupWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982801_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_BoxShapeEditting.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982801_PhysXColliderShape_CanBeSelected.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_BoxShapeEditting.py index 33b7dc0b48..68ff0b4edc 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982801_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_BoxShapeEditting.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def C4982801_PhysXColliderShape_CanBeSelected(): +def Collider_BoxShapeEditting(): """ Summary: Adding PhysX Collider and Shape components to test entity, then attempting to modify the shape's dimensions @@ -102,4 +102,4 @@ def C4982801_PhysXColliderShape_CanBeSelected(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982801_PhysXColliderShape_CanBeSelected) + Report.start_test(Collider_BoxShapeEditting) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982802_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CapsuleShapeEditting.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982802_PhysXColliderShape_CanBeSelected.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CapsuleShapeEditting.py index 4881c5b9a0..7df12c68f0 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982802_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CapsuleShapeEditting.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def C4982802_PhysXColliderShape_CanBeSelected(): +def Collider_CapsuleShapeEditting(): """ Summary: Adding PhysX Collider and Shape components to test entity, then attempting to modify the shape's dimensions @@ -102,4 +102,4 @@ def C4982802_PhysXColliderShape_CanBeSelected(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982802_PhysXColliderShape_CanBeSelected) + Report.start_test(Collider_CapsuleShapeEditting) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861500_DefaultSetting_ColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C14861500_DefaultSetting_ColliderShape.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py index aed856f530..cf8bd740c9 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861500_DefaultSetting_ColliderShape.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py @@ -18,7 +18,7 @@ class Tests(): # fmt: on -def C14861500_DefaultSetting_ColliderShape(): +def Collider_CheckDefaultShapeSettingIsPxMesh(): """ Summary: Check the default for Shape on the PhysX Collider component @@ -69,4 +69,4 @@ def C14861500_DefaultSetting_ColliderShape(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14861500_DefaultSetting_ColliderShape) + Report.start_test(Collider_CheckDefaultShapeSettingIsPxMesh) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982797_Collider_ColliderOffset.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderPositionOffset.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982797_Collider_ColliderOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderPositionOffset.py index d4d8ab15fd..a784d10684 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982797_Collider_ColliderOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderPositionOffset.py @@ -25,7 +25,7 @@ class Tests: # fmt: on -def C4982797_Collider_ColliderOffset(): +def Collider_ColliderPositionOffset(): # type: () -> None """ Summary: @@ -287,7 +287,7 @@ def C4982797_Collider_ColliderOffset(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4982797_Collider_ColliderOffset") + helper.open_level("Physics", "Collider_ColliderPositionOffset") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -331,4 +331,4 @@ def C4982797_Collider_ColliderOffset(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982797_Collider_ColliderOffset) + Report.start_test(Collider_ColliderPositionOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982798_Collider_ColliderRotationOffset.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderRotationOffset.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982798_Collider_ColliderRotationOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderRotationOffset.py index 8368b9a66f..8b3ccfe5c7 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982798_Collider_ColliderRotationOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderRotationOffset.py @@ -29,7 +29,7 @@ class Tests: # fmt: on -def C4982798_Collider_ColliderRotationOffset(): +def Collider_ColliderRotationOffset(): # type: () -> None """ Summary: @@ -255,7 +255,7 @@ def C4982798_Collider_ColliderRotationOffset(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4982798_Collider_ColliderRotationOffset") + helper.open_level("Physics", "Collider_ColliderRotationOffset") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -299,4 +299,4 @@ def C4982798_Collider_ColliderRotationOffset(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982798_Collider_ColliderRotationOffset) + Report.start_test(Collider_ColliderRotationOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C3510644_Collider_CollisionGroups.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CollisionGroupsWorkflow.py similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C3510644_Collider_CollisionGroups.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CollisionGroupsWorkflow.py index 28638cc2a6..0440645df8 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C3510644_Collider_CollisionGroups.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CollisionGroupsWorkflow.py @@ -38,7 +38,7 @@ class Tests: # fmt: on -def C3510644_Collider_CollisionGroups(): +def Collider_CollisionGroupsWorkflow(): # type: () -> None """ Summary: @@ -261,7 +261,7 @@ def C3510644_Collider_CollisionGroups(): # 1) Open level helper.init_idle() - helper.open_level("Physics", "C3510644_Collider_CollisionGroups") + helper.open_level("Physics", "Collider_CollisionGroupsWorkflow") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -358,4 +358,4 @@ def C3510644_Collider_CollisionGroups(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C3510644_Collider_CollisionGroups) + Report.start_test(Collider_CollisionGroupsWorkflow) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982593_PhysXCollider_CollisionLayerTest.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982593_PhysXCollider_CollisionLayerTest.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py index 3fdb9d3403..efcbf5c83a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982593_PhysXCollider_CollisionLayerTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py @@ -30,7 +30,7 @@ class Tests: # fmt: on -def C4982593_PhysXCollider_CollisionLayerTest(): +def Collider_DiffCollisionGroupDiffCollidingLayersNotCollide(): # type: () -> None """ Summary: @@ -96,7 +96,7 @@ def C4982593_PhysXCollider_CollisionLayerTest(): # 1) Open level / Enter game mode helper.init_idle() - helper.open_level("Physics", "C4982593_PhysxCollider_CollisionLayerTest") + helper.open_level("Physics", "Collider_DiffCollisionGroupDiffCollidingLayersNotCollide") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve/validate entities @@ -227,4 +227,4 @@ def C4982593_PhysXCollider_CollisionLayerTest(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982593_PhysXCollider_CollisionLayerTest) + Report.start_test(Collider_DiffCollisionGroupDiffCollidingLayersNotCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_MultipleSurfaceSlots.py similarity index 92% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_MultipleSurfaceSlots.py index cfe6f3962c..2eabc6ab09 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4044695_PhysXCollider_AddMultipleSurfaceFbx.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_MultipleSurfaceSlots.py @@ -23,7 +23,7 @@ class Tests(): # fmt: on -def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): +def Collider_MultipleSurfaceSlots(): """ Summary: Create entity with Mesh and PhysX Collider components and assign a fbx file in both the components. @@ -59,8 +59,8 @@ def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): SURFACE_TAG_COUNT = 4 # Number of surface tags included in used asset # Asset paths - STATIC_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.azmodel") - PHYSX_MESH = os.path.join("assets", "c4044695_physxcollider_addmultiplesurfacefbx", "test.pxmesh") + STATIC_MESH = os.path.join("assets", "Physics", "Collider_MultipleSurfaceSlots", "test.azmodel") + PHYSX_MESH = os.path.join("assets", "Physics","Collider_MultipleSurfaceSlots", "test.pxmesh") helper.init_idle() # 1) Load the empty level @@ -86,12 +86,12 @@ def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): px_asset = Asset.find_asset_by_path(PHYSX_MESH) collider_component.set_component_property_value("Shape Configuration|Asset|PhysX Mesh", px_asset.id) px_asset.id = collider_component.get_component_property_value("Shape Configuration|Asset|PhysX Mesh") - Report.result(Tests.assign_px_mesh_asset, px_asset.get_path() == PHYSX_MESH.replace(os.sep, "/")) + Report.result(Tests.assign_px_mesh_asset, px_asset.get_path().lower() == PHYSX_MESH.replace(os.sep, "/").lower()) mesh_asset = Asset.find_asset_by_path(STATIC_MESH) mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id) mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset") - Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/")) + Report.result(Tests.assign_mesh_asset, mesh_asset.get_path().lower() == STATIC_MESH.replace(os.sep, "/").lower()) # 6) Check if multiple material slots show up under Materials section in the PhysX Collider component pte = collider_component.get_property_tree() @@ -106,4 +106,4 @@ def C4044695_PhysXCollider_AddMultipleSurfaceFbx(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044695_PhysXCollider_AddMultipleSurfaceFbx) + Report.start_test(Collider_MultipleSurfaceSlots) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976245_PhysXCollider_CollisionLayerTest.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4976245_PhysXCollider_CollisionLayerTest.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py index a7c9152744..f52a5683a6 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976245_PhysXCollider_CollisionLayerTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py @@ -30,7 +30,7 @@ class Tests: # fmt: on -def C4976245_PhysXCollider_CollisionLayerTest(): +def Collider_NoneCollisionGroupSameLayerNotCollide(): # type: () -> None """ Summary: @@ -105,7 +105,7 @@ def C4976245_PhysXCollider_CollisionLayerTest(): # 1) Open level / Enter game mode helper.init_idle() - helper.open_level("Physics", "C4976245_PhysxCollider_CollisionLayerTest") + helper.open_level("Physics", "Collider_NoneCollisionGroupSameLayerNotCollide") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve/validate entities @@ -219,4 +219,4 @@ def C4976245_PhysXCollider_CollisionLayerTest(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976245_PhysXCollider_CollisionLayerTest) + Report.start_test(Collider_NoneCollisionGroupSameLayerNotCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py similarity index 88% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py index 73c94a2dfb..f229842d2f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861501_PhysXCollider_RenderMeshAutoAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def C14861501_PhysXCollider_RenderMeshAutoAssigned(): +def Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent(): """ Summary: Create entity with Mesh component and assign a render mesh to the Mesh component. Add Physics Collider component @@ -55,9 +55,9 @@ def C14861501_PhysXCollider_RenderMeshAutoAssigned(): from editor_python_test_tools.asset_utils import Asset # Asset paths - STATIC_MESH = os.path.join("assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.azmodel") + STATIC_MESH = os.path.join("assets", "Physics", "Collider_PxMeshAutoAssigned", "spherebot", "r0-b_body.azmodel") PHYSX_MESH = os.path.join( - "assets", "c14861501_physxcollider_rendermeshautoassigned", "spherebot", "r0-b_body.pxmesh" + "assets", "Physics", "Collider_PxMeshAutoAssigned", "spherebot", "r0-b_body.pxmesh" ) helper.init_idle() @@ -76,7 +76,7 @@ def C14861501_PhysXCollider_RenderMeshAutoAssigned(): mesh_asset = Asset.find_asset_by_path(STATIC_MESH) mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id) mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset") - Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/")) + Report.result(Tests.assign_mesh_asset, mesh_asset.get_path().lower() == STATIC_MESH.replace(os.sep, "/").lower()) # 5) Add PhysX Collider component test_component = test_entity.add_component("PhysX Collider") @@ -85,9 +85,9 @@ def C14861501_PhysXCollider_RenderMeshAutoAssigned(): # 6) The physics asset in PhysX Collider component is auto-assigned. asset_id = test_component.get_component_property_value("Shape Configuration|Asset|PhysX Mesh") test_asset = Asset(asset_id) - Report.result(Tests.automatic_shape_change, test_asset.get_path() == PHYSX_MESH.replace(os.sep, "/")) + Report.result(Tests.automatic_shape_change, test_asset.get_path().lower() == PHYSX_MESH.replace(os.sep, "/").lower()) if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14861501_PhysXCollider_RenderMeshAutoAssigned) + Report.start_test(Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861502_PhysXCollider_AssetAutoAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C14861502_PhysXCollider_AssetAutoAssigned.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py index b8c0e4a529..8b08aae49d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861502_PhysXCollider_AssetAutoAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def C14861502_PhysXCollider_AssetAutoAssigned(): +def Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent(): """ Summary: Create entity with Mesh and PhysX Collider components, then assign a render mesh to the Mesh component @@ -92,4 +92,4 @@ def C14861502_PhysXCollider_AssetAutoAssigned(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14861502_PhysXCollider_AssetAutoAssigned) + Report.start_test(Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982803_Enable_PxMesh_Option.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshConvexMeshCollides.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982803_Enable_PxMesh_Option.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshConvexMeshCollides.py index 7497ae8253..7d8f421d6b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982803_Enable_PxMesh_Option.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshConvexMeshCollides.py @@ -27,7 +27,7 @@ class Tests(): # fmt: on -def C4982803_Enable_PxMesh_Option(): +def Collider_PxMeshConvexMeshCollides(): """ Summary: Load level with Entity above ground having PhysX Collider, PhysX Rigid Body and Mesh components. @@ -70,7 +70,7 @@ def C4982803_Enable_PxMesh_Option(): # Constants PHYSICS_ASSET_INDEX = 7 # Hardcoded enum index value for Shape property - MESH_ASSET_PATH = os.path.join("assets", "c4982803_enable_pxmesh_option", "spherebot", "r0-b_body.pxmesh") + MESH_ASSET_PATH = os.path.join("assets", "Physics", "Collider_PxMeshConvexMeshCollides", "spherebot", "r0-b_body.pxmesh") TIMEOUT = 2.0 helper.init_idle() @@ -99,7 +99,7 @@ def C4982803_Enable_PxMesh_Option(): mesh_asset = Asset.find_asset_by_path(MESH_ASSET_PATH) collider_component.set_component_property_value("Shape Configuration|Asset|PhysX Mesh", mesh_asset.id) mesh_asset.id = collider_component.get_component_property_value("Shape Configuration|Asset|PhysX Mesh") - Report.result(Tests.assign_fbx_mesh, mesh_asset.get_path() == MESH_ASSET_PATH.replace(os.sep, "/")) + Report.result(Tests.assign_fbx_mesh, mesh_asset.get_path().lower() == MESH_ASSET_PATH.replace(os.sep, "/").lower()) # 5) Create terrain entity with physx terrain terrain = EditorEntity.create_editor_entity_at([512.0, 512.0, 31.0], "Terrain") @@ -140,4 +140,4 @@ def C4982803_Enable_PxMesh_Option(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982803_Enable_PxMesh_Option) + Report.start_test(Collider_PxMeshConvexMeshCollides) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861498_ConfirmError_NoPxMesh.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C14861498_ConfirmError_NoPxMesh.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py index 731f114b8c..fcf1810801 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861498_ConfirmError_NoPxMesh.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py @@ -21,7 +21,7 @@ class Tests(): # fmt:on -def C14861498_ConfirmError_NoPxMesh(): +def Collider_PxMeshErrorIfNoMesh(): """ Summary: This test looks for the presence of an error when an entity with a PhysXCollider has no physics mesh, but has its @@ -63,7 +63,7 @@ def C14861498_ConfirmError_NoPxMesh(): 'EditorColliderComponent' in warningInfo.message for warningInfo in warning_tracer.warnings) # 1) Load level / enter game mode - helper.open_level("Physics", "C14861498_ConfirmError_NoPxMesh") + helper.open_level("Physics", "Collider_PxMeshErrorIfNoMesh") helper.enter_game_mode(Tests.enter_game_mode) # 2) Find game entity @@ -81,4 +81,4 @@ def C14861498_ConfirmError_NoPxMesh(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14861498_ConfirmError_NoPxMesh) + Report.start_test(Collider_PxMeshErrorIfNoMesh) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861504_RenderMeshAsset_WithNoPxAsset.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py similarity index 93% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C14861504_RenderMeshAsset_WithNoPxAsset.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py index 1a63f478fd..780c5439dd 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C14861504_RenderMeshAsset_WithNoPxAsset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C14861504_RenderMeshAsset_WithNoPxAsset(): +def Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx(): """ Summary: Create entity with Mesh component and assign a render mesh that has no physics asset to the Mesh component. @@ -63,7 +63,7 @@ def C14861504_RenderMeshAsset_WithNoPxAsset(): import azlmbr.asset as azasset # Asset paths - STATIC_MESH = os.path.join("assets", "c14861504_rendermeshasset_withnopxasset", "test_asset.azmodel") + STATIC_MESH = os.path.join("assets", "Physics", "Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx", "test_asset.azmodel") helper.init_idle() # 1) Load the empty level @@ -81,7 +81,7 @@ def C14861504_RenderMeshAsset_WithNoPxAsset(): mesh_asset = Asset.find_asset_by_path(STATIC_MESH) mesh_component.set_component_property_value("Controller|Configuration|Mesh Asset", mesh_asset.id) mesh_asset.id = mesh_component.get_component_property_value("Controller|Configuration|Mesh Asset") - Report.result(Tests.assign_mesh_asset, mesh_asset.get_path() == STATIC_MESH.replace(os.sep, "/")) + Report.result(Tests.assign_mesh_asset, mesh_asset.get_path().lower() == STATIC_MESH.replace(os.sep, "/").lower()) # 5) Add PhysX Collider component test_component = test_entity.add_component("PhysX Collider") @@ -101,4 +101,4 @@ def C14861504_RenderMeshAsset_WithNoPxAsset(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14861504_RenderMeshAsset_WithNoPxAsset) + Report.start_test(Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py index 893d0d06f6..03636ac279 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976243_Collision_SameCollisionGroupDiffCollisionLayers.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py @@ -25,7 +25,7 @@ class Tests(): # fmt: on -def C4976243_Collision_SameCollisionGroupDiffCollisionLayers(): +def Collider_SameCollisionGroupDiffLayersCollide(): """ Summary: @@ -78,7 +78,7 @@ def C4976243_Collision_SameCollisionGroupDiffCollisionLayers(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976243_Collision_SameCollisionGroupDiffCollisionLayers") + helper.open_level("Physics", "Collider_SameCollisionGroupDiffLayersCollide") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -123,4 +123,4 @@ def C4976243_Collision_SameCollisionGroupDiffCollisionLayers(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976243_Collision_SameCollisionGroupDiffCollisionLayers) + Report.start_test(Collider_SameCollisionGroupDiffLayersCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976244_Collider_SameGroupSameLayerCollision.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4976244_Collider_SameGroupSameLayerCollision.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py index 44ea29de76..2e40c0b557 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976244_Collider_SameGroupSameLayerCollision.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py @@ -26,7 +26,7 @@ class Tests: # fmt: on -def C4976244_Collider_SameGroupSameLayerCollision(): +def Collider_SameCollisionGroupSameCustomLayerCollide(): # type: () -> None """ Summary: @@ -127,7 +127,7 @@ def C4976244_Collider_SameGroupSameLayerCollision(): # Main Script # 1) Load the level helper.init_idle() - helper.open_level("physics", "C4976244_Collider_SameGroupSameLayerCollision") + helper.open_level("physics", "Collider_SameCollisionGroupSameCustomLayerCollide") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -181,4 +181,4 @@ def C4976244_Collider_SameGroupSameLayerCollision(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976244_Collider_SameGroupSameLayerCollision) + Report.start_test(Collider_SameCollisionGroupSameCustomLayerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py index 86ef5b6ed4..34a7309fb5 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4976242_Collision_SameCollisionlayerSameCollisiongroup.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py @@ -26,7 +26,7 @@ class Tests(): # fmt: on -def C4976242_Collision_SameCollisionlayerSameCollisiongroup(): +def Collider_SameCollisionGroupSameLayerCollide(): """ Summary: @@ -77,7 +77,7 @@ def C4976242_Collision_SameCollisionlayerSameCollisiongroup(): helper.init_idle() # 1) Open level and Enter game mode - helper.open_level("Physics", "C4976242_Collision_SameCollisionlayerSameCollisiongroup") + helper.open_level("Physics", "Collider_SameCollisionGroupSameLayerCollide") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve and validate Entities @@ -184,4 +184,4 @@ def C4976242_Collision_SameCollisionlayerSameCollisiongroup(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976242_Collision_SameCollisionlayerSameCollisiongroup) + Report.start_test(Collider_SameCollisionGroupSameLayerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982800_PhysXColliderShape_CanBeSelected.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SphereShapeEditting.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982800_PhysXColliderShape_CanBeSelected.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SphereShapeEditting.py index 0f1b9c6070..bffd041d92 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982800_PhysXColliderShape_CanBeSelected.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SphereShapeEditting.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def C4982800_PhysXColliderShape_CanBeSelected(): +def Collider_SphereShapeEditting(): """ Summary: Adding PhysX Collider and Shape components to test entity, then attempting to modify the shape's dimensions @@ -90,4 +90,4 @@ def C4982800_PhysXColliderShape_CanBeSelected(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982800_PhysXColliderShape_CanBeSelected) + Report.start_test(Collider_SphereShapeEditting) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982595_Collider_TriggerDisablesCollision.py b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_TriggerPassThrough.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C4982595_Collider_TriggerDisablesCollision.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_TriggerPassThrough.py index d3b0faa6d4..3953db6d34 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C4982595_Collider_TriggerDisablesCollision.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_TriggerPassThrough.py @@ -30,7 +30,7 @@ class Tests: # fmt: on -def C4982595_Collider_TriggerDisablesCollision(): +def Collider_TriggerPassThrough(): """ Summary: This script runs an automated test to verify that when an entity's PhysX collider is set as a trigger, the entity no @@ -184,7 +184,7 @@ def C4982595_Collider_TriggerDisablesCollision(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4982595_Collider_TriggerDisablesCollision") + helper.open_level("Physics", "Collider_TriggerPassThrough") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve and validate entities @@ -230,4 +230,4 @@ def C4982595_Collider_TriggerDisablesCollision(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4982595_Collider_TriggerDisablesCollision) + Report.start_test(Collider_TriggerPassThrough) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959760_PhysXForceRegion_PointForceExertion.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_CapsuleShapedForce.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959760_PhysXForceRegion_PointForceExertion.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_CapsuleShapedForce.py index 6648b41d31..a69a019a1c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959760_PhysXForceRegion_PointForceExertion.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_CapsuleShapedForce.py @@ -30,7 +30,7 @@ class Tests: # fmt: on -def C5959760_PhysXForceRegion_PointForceExertion(): +def ForceRegion_CapsuleShapedForce(): # type: () -> None """ Summary: @@ -121,7 +121,7 @@ def C5959760_PhysXForceRegion_PointForceExertion(): # 1) Open level / Enter game mode helper.init_idle() - helper.open_level("Physics", "C5959760_PhysXForceRegion_PointForceExertion") + helper.open_level("Physics", "ForceRegion_CapsuleShapedForce") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve entities @@ -219,4 +219,4 @@ def C5959760_PhysXForceRegion_PointForceExertion(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959760_PhysXForceRegion_PointForceExertion) + Report.start_test(ForceRegion_CapsuleShapedForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py index 11488b14c2..e1a694ca8c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py @@ -50,7 +50,7 @@ class Tests: # fmt: on -def C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(): +def ForceRegion_DirectionHasNoAffectOnTotalForce(): """ Summary: Check that world and local space force direction should not affect magnitude of force exerted on entity. @@ -219,7 +219,7 @@ def C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude") + helper.open_level("Physics", "ForceRegion_DirectionHasNoAffectOnTotalForce") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -279,4 +279,4 @@ def C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12868578_ForceRegion_DirectionHasNoAffectOnMagnitude) + Report.start_test(ForceRegion_DirectionHasNoAffectOnTotalForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6321601_Force_HighValuesDirectionAxes.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6321601_Force_HighValuesDirectionAxes.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py index 47cc085479..11e091cba0 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6321601_Force_HighValuesDirectionAxes.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py @@ -37,7 +37,7 @@ class Tests(): # fmt: on -def C6321601_Force_HighValuesDirectionAxes(): +def ForceRegion_HighValuesDirectionAxesWorkWithNoError(): """ Summary: @@ -204,7 +204,7 @@ def C6321601_Force_HighValuesDirectionAxes(): return entity_error_tracer.has_errors # 1) Open level - helper.open_level("Physics", "C6321601_Force_HighValuesDirectionAxes") + helper.open_level("Physics", "ForceRegion_HighValuesDirectionAxesWorkWithNoError") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -243,4 +243,4 @@ def C6321601_Force_HighValuesDirectionAxes(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6321601_Force_HighValuesDirectionAxes) + Report.start_test(ForceRegion_HighValuesDirectionAxesWorkWithNoError) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py index 8bea169a82..24cb2bbc1c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959763_ForceRegion_ForceRegionImpulsesCube.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py @@ -24,7 +24,7 @@ class Tests: # fmt: on -def C5959763_ForceRegion_ForceRegionImpulsesCube(): +def ForceRegion_ImpulsesBoxShapedRigidBody(): """ This run() function will open a a level and validate that a Cube gets impulsed by a force region. It does this by: @@ -42,8 +42,6 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): # Setup path import os, sys - - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper import azlmbr.legacy.general as general @@ -80,7 +78,7 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): UPWARD_Z_VECTOR = 1.0 # Open level - helper.open_level("Physics", "C5959763_ForceRegion_ForceRegionImpulsesCube") + helper.open_level("Physics", "ForceRegion_ImpulsesBoxShapedRigidBody") # Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -164,4 +162,4 @@ def C5959763_ForceRegion_ForceRegionImpulsesCube(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959763_ForceRegion_ForceRegionImpulsesCube) + Report.start_test(ForceRegion_ImpulsesBoxShapedRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py index 4ce345a5eb..d9f586c647 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959764_ForceRegion_ForceRegionImpulsesCapsule.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py @@ -24,7 +24,7 @@ class Tests: # fmt: on -def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): +def ForceRegion_ImpulsesCapsuleShapedRigidBody(): """ This run() function will open a a level and validate that a Capsule gets impulsed by a force region. It does this by: @@ -80,7 +80,7 @@ def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): UPWARD_Z_VECTOR = 1.0 # Open level - helper.open_level("Physics", "C5959764_ForceRegion_ForceRegionImpulsesCapsule") + helper.open_level("Physics", "ForceRegion_ImpulsesCapsuleShapedRigidBody") # Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -166,4 +166,4 @@ def C5959764_ForceRegion_ForceRegionImpulsesCapsule(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959764_ForceRegion_ForceRegionImpulsesCapsule) + Report.start_test(ForceRegion_ImpulsesCapsuleShapedRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959765_ForceRegion_AssetGetsImpulsed.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959765_ForceRegion_AssetGetsImpulsed.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py index 36ecddb3ca..4bd953cdf3 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959765_ForceRegion_AssetGetsImpulsed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py @@ -23,7 +23,7 @@ class Tests: tests_completed = ("Tests completed", "Tests did not complete") # fmt: on -def C5959765_ForceRegion_AssetGetsImpulsed(): +def ForceRegion_ImpulsesPxMeshShapedRigidBody(): """ # This run() function will open a a level and validate that a asset gets impulsed by a force region. # It does this by: @@ -83,7 +83,7 @@ def C5959765_ForceRegion_AssetGetsImpulsed(): UPWARD_Z_VECTOR = 1.0 # 1) Open level - helper.open_level("Physics", "C5959765_ForceRegion_AssetGetsImpulsed") + helper.open_level("Physics", "ForceRegion_ImpulsesPxMeshShapedRigidBody") # 2) Enters Game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -168,4 +168,4 @@ def C5959765_ForceRegion_AssetGetsImpulsed(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959765_ForceRegion_AssetGetsImpulsed) + Report.start_test(ForceRegion_ImpulsesPxMeshShapedRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932042_PhysXForceRegion_LinearDamping.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5932042_PhysXForceRegion_LinearDamping.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py index 5112729cc2..4e3cc4e43d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932042_PhysXForceRegion_LinearDamping.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py @@ -34,7 +34,7 @@ class Tests: # fmt: on -def C5932042_PhysXForceRegion_LinearDamping(): +def ForceRegion_LinearDampingForceOnRigidBodies(): # type: () -> None """ Summary: @@ -131,7 +131,7 @@ def C5932042_PhysXForceRegion_LinearDamping(): # 1) Open level / Enter game mode helper.init_idle() - helper.open_level("Physics", "C5932042_PhysXForceRegion_LinearDamping") + helper.open_level("Physics", "ForceRegion_LinearDampingForceOnRigidBodies") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve and validate entities @@ -265,4 +265,4 @@ def C5932042_PhysXForceRegion_LinearDamping(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5932042_PhysXForceRegion_LinearDamping) + Report.start_test(ForceRegion_LinearDampingForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py index 15c77ba17e..66605a033d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py @@ -30,7 +30,7 @@ class Tests: # fmt: on -def C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(): +def ForceRegion_LocalSpaceForceOnRigidBodies(): """ Summary: Runs an automated test to ensure that when a rigid body enters a force region a local space force is exerted. @@ -80,7 +80,7 @@ def C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies") + helper.open_level("Physics", "ForceRegion_LocalSpaceForceOnRigidBodies") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -157,4 +157,4 @@ def C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5932041_PhysXForceRegion_LocalSpaceForceOnRigidBodies) + Report.start_test(ForceRegion_LocalSpaceForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968760_ForceRegion_CheckNetForceChange.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5968760_ForceRegion_CheckNetForceChange.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py index d64a0564f4..9eefa61d90 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968760_ForceRegion_CheckNetForceChange.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C5968760_ForceRegion_CheckNetForceChange(): +def ForceRegion_MovingForceRegionChangesNetForce(): """ Summary: @@ -96,7 +96,7 @@ def C5968760_ForceRegion_CheckNetForceChange(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5968760_ForceRegion_CheckNetForceChange") + helper.open_level("Physics", "ForceRegion_MovingForceRegionChangesNetForce") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -159,4 +159,4 @@ def C5968760_ForceRegion_CheckNetForceChange(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5968760_ForceRegion_CheckNetForceChange) + Report.start_test(ForceRegion_MovingForceRegionChangesNetForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py index b1f8d27900..4f1af460d4 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py @@ -32,7 +32,7 @@ class Tests: import os, sys -def C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(): +def ForceRegion_MultipleComponentsCombineForces(): """ Run() will open a a level and validate that the spheres are affected by the force regions as expected. @@ -92,7 +92,7 @@ def C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(): # 1) Opens level with spheres above a force region helper.init_idle() - helper.open_level("Physics", "C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody") + helper.open_level("Physics", "ForceRegion_MultipleComponentsCombineForces") helper.enter_game_mode(Tests.enter_game_mode) # 2) Finds the entities in the scene @@ -174,4 +174,4 @@ def C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5968759_ForceRegion_ExertsSeveralForcesOnRigidBody) + Report.start_test(ForceRegion_MultipleComponentsCombineForces) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py index b7660926d5..7307f3a2fb 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959810_ForceRegion_ForceRegionCombinesForces.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py @@ -31,7 +31,7 @@ class Tests: # fmt: on -def C5959810_ForceRegion_ForceRegionCombinesForces(): +def ForceRegion_MultipleForcesInSameComponentCombineForces(): # type: () -> None """ Summary: Runs an automated test to ensure that separate forces in a force region add correctly @@ -162,7 +162,7 @@ def C5959810_ForceRegion_ForceRegionCombinesForces(): helper.init_idle() # 1) Load Level - helper.open_level("physics", "C5959810_ForceRegion_ForceRegionCombinesForces") + helper.open_level("physics", "ForceRegion_MultipleForcesInSameComponentCombineForces") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -230,4 +230,4 @@ def C5959810_ForceRegion_ForceRegionCombinesForces(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959810_ForceRegion_ForceRegionCombinesForces) + Report.start_test(ForceRegion_MultipleForcesInSameComponentCombineForces) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C15845879_ForceRegion_HighLinearDampingForce.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C15845879_ForceRegion_HighLinearDampingForce.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py index d4807476c2..4cf7f0f8e7 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C15845879_ForceRegion_HighLinearDampingForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py @@ -24,7 +24,7 @@ class Tests: # fmt: on -def C15845879_ForceRegion_HighLinearDampingForce(): +def ForceRegion_NoQuiverOnHighLinearDampingForce(): """ Summary: Check that linear damping with high values do not make the object to quiver @@ -126,7 +126,7 @@ def C15845879_ForceRegion_HighLinearDampingForce(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C15845879_ForceRegion_HighLinearDampingForce") + helper.open_level("Physics", "ForceRegion_NoQuiverOnHighLinearDampingForce") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -165,4 +165,4 @@ def C15845879_ForceRegion_HighLinearDampingForce(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15845879_ForceRegion_HighLinearDampingForce) + Report.start_test(ForceRegion_NoQuiverOnHighLinearDampingForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090547_ForceRegion_ParentChildForceRegions.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090547_ForceRegion_ParentChildForceRegions.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py index f466680e0c..41b07fe471 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090547_ForceRegion_ParentChildForceRegions.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py @@ -29,7 +29,7 @@ class Tests(): # fmt: on -def C6090547_ForceRegion_ParentChildForceRegions(): +def ForceRegion_ParentChildForcesCombineForces(): """ Summary: Runs an automated test to ensure that force regions in parent and child entities work together. @@ -89,7 +89,7 @@ def C6090547_ForceRegion_ParentChildForceRegions(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C6090547_ForceRegion_ParentChildForceRegions") + helper.open_level("Physics", "ForceRegion_ParentChildForcesCombineForces") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -195,4 +195,4 @@ def C6090547_ForceRegion_ParentChildForceRegions(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090547_ForceRegion_ParentChildForceRegions) + Report.start_test(ForceRegion_ParentChildForcesCombineForces) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932044_ForceRegion_PointForceOnRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5932044_ForceRegion_PointForceOnRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py index 23760909db..d8fbcdb563 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932044_ForceRegion_PointForceOnRigidBody.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py @@ -27,7 +27,7 @@ class Tests(): # fmt: on -def C5932044_ForceRegion_PointForceOnRigidBody(): +def ForceRegion_PointForceOnRigidBodies(): """ Summary: Runs an automated test to ensure that that a force region exerts point force on rigid bodies @@ -83,7 +83,7 @@ def C5932044_ForceRegion_PointForceOnRigidBody(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5932044_PhysX_ForceRegion_PointForceOnRigidBodies") + helper.open_level("Physics", "ForceRegion_PointForceOnRigidBodies") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -185,4 +185,4 @@ def C5932044_ForceRegion_PointForceOnRigidBody(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5932044_ForceRegion_PointForceOnRigidBody) + Report.start_test(ForceRegion_PointForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959808_ForceRegion_PositionOffset.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PositionOffset.py similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959808_ForceRegion_PositionOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PositionOffset.py index 480869457c..bc785ecc0a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959808_ForceRegion_PositionOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PositionOffset.py @@ -88,7 +88,7 @@ class Tests: else: return None -def C5959808_ForceRegion_PositionOffset(): +def ForceRegion_PositionOffset(): """ Summary: Force Region positional offset is tested for each of the 3 axises (X, Y, and Z). Each axis's test has one @@ -363,7 +363,7 @@ def C5959808_ForceRegion_PositionOffset(): # 1) Open level helper.init_idle() - helper.open_level("Physics", "C5959808_ForceRegion_PositionOffset") + helper.open_level("Physics", "ForceRegion_PositionOffset") helper.enter_game_mode(Tests.enter_game_mode) # 2) Variable set up @@ -401,4 +401,4 @@ def C5959808_ForceRegion_PositionOffset(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959808_ForceRegion_PositionOffset) + Report.start_test(ForceRegion_PositionOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PxMeshShapedForce.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PxMeshShapedForce.py index c77fc39a77..12ef218027 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959761_ForceRegion_PhysAssetExertsPointForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PxMeshShapedForce.py @@ -25,7 +25,7 @@ class Tests(): # fmt: on -def C5959761_ForceRegion_PhysAssetExertsPointForce(): +def ForceRegion_PxMeshShapedForce(): """ Summary: Runs an automated test to ensure that PhysX force regions with physics assets exert point force on rigid bodies @@ -85,7 +85,7 @@ def C5959761_ForceRegion_PhysAssetExertsPointForce(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5959761_ForceRegion_ExertsPointForce_Sedan") + helper.open_level("Physics", "ForceRegion_PxMeshShapedForce") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -135,4 +135,4 @@ def C5959761_ForceRegion_PhysAssetExertsPointForce(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959761_ForceRegion_PhysAssetExertsPointForce) + Report.start_test(ForceRegion_PxMeshShapedForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959809_ForceRegion_RotationalOffset.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_RotationalOffset.py similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959809_ForceRegion_RotationalOffset.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_RotationalOffset.py index d26aebab8d..8c1bbcc8e4 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959809_ForceRegion_RotationalOffset.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_RotationalOffset.py @@ -89,7 +89,7 @@ class Tests: return None -def C5959809_ForceRegion_RotationalOffset(): +def ForceRegion_RotationalOffset(): """ Summary: Force Region rotational offset is tested for each of the 3 axises (X, Y, and Z). Each axis's test has one @@ -367,7 +367,7 @@ def C5959809_ForceRegion_RotationalOffset(): # 1) Open level helper.init_idle() - helper.open_level("Physics", "C5959809_ForceRegion_RotationalOffset") + helper.open_level("Physics", "ForceRegion_RotationalOffset") helper.enter_game_mode(Tests.enter_game_mode) # 2) Variable set up @@ -401,4 +401,4 @@ def C5959809_ForceRegion_RotationalOffset(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959809_ForceRegion_RotationalOffset) + Report.start_test(ForceRegion_RotationalOffset) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py index cd81315e73..d7ceaa0c6e 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932043_ForceRegion_SimpleDragOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py @@ -26,7 +26,7 @@ class Tests: # fmt: on -def C5932043_ForceRegion_SimpleDragOnRigidBodies(): +def ForceRegion_SimpleDragForceOnRigidBodies(): # This run() function will open a a level and validate that the force region slows down a spheres fall. # It does this by: # 1) Opens level with sphere above a force region @@ -64,7 +64,7 @@ def C5932043_ForceRegion_SimpleDragOnRigidBodies(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5932043_ForceRegion_SimpleDragOnRigidBody") + helper.open_level("Physics", "ForceRegion_SimpleDragForceOnRigidBodies") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -138,4 +138,4 @@ def C5932043_ForceRegion_SimpleDragOnRigidBodies(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5932043_ForceRegion_SimpleDragOnRigidBodies) + Report.start_test(ForceRegion_SimpleDragForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090546_ForceRegion_SliceFileInstantiates.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SliceFileInstantiates.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090546_ForceRegion_SliceFileInstantiates.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SliceFileInstantiates.py index 0c360edee5..8642464988 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090546_ForceRegion_SliceFileInstantiates.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SliceFileInstantiates.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C6090546_ForceRegion_SliceFileInstantiates(): +def ForceRegion_SliceFileInstantiates(): """ Summary: @@ -95,7 +95,7 @@ def C6090546_ForceRegion_SliceFileInstantiates(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C6090546_ForceRegion_SliceFileInstantiates") + helper.open_level("Physics", "ForceRegion_SliceFileInstantiates") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -134,4 +134,4 @@ def C6090546_ForceRegion_SliceFileInstantiates(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090546_ForceRegion_SliceFileInstantiates) + Report.start_test(ForceRegion_SliceFileInstantiates) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905527_ForceRegion_MagnitudeDeviation.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C12905527_ForceRegion_MagnitudeDeviation.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py index c9d411b873..bb33a2306e 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905527_ForceRegion_MagnitudeDeviation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py @@ -21,7 +21,7 @@ class Tests(): # fmt: on -def C12905527_ForceRegion_MagnitudeDeviation(): +def ForceRegion_SmallMagnitudeDeviationOnLargeForces(): """ Summary: Runs an automated test to ensure that the calculated net force magnitude is close to the configured value @@ -93,7 +93,7 @@ def C12905527_ForceRegion_MagnitudeDeviation(): helper.init_idle() # 1) Open level Report.info(general.get_current_level_name()) - helper.open_level("Physics", "C12905527_ForceRegion_MagnitudeDeviation") + helper.open_level("Physics", "ForceRegion_SmallMagnitudeDeviationOnLargeForces") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -139,4 +139,4 @@ def C12905527_ForceRegion_MagnitudeDeviation(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12905527_ForceRegion_MagnitudeDeviation) + Report.start_test(ForceRegion_SmallMagnitudeDeviationOnLargeForces) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SphereShapedForce.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SphereShapedForce.py index 99baeb1fff..f4fbbbfc9b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5959759_RigidBody_ForceRegionSpherePointForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SphereShapedForce.py @@ -27,7 +27,7 @@ class Tests: # fmt: on -def C5959759_RigidBody_ForceRegionSpherePointForce(): +def ForceRegion_SphereShapedForce(): """ Level Setup The level consists of a sherical force region with a point force of 1000. @@ -50,7 +50,7 @@ def C5959759_RigidBody_ForceRegionSpherePointForce(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C5959759_RigidBody_ForceRegionSpherePointForce") + helper.open_level("Physics", "ForceRegion_SphereShapedForce") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve entities @@ -146,4 +146,4 @@ def C5959759_RigidBody_ForceRegionSpherePointForce(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5959759_RigidBody_ForceRegionSpherePointForce) + Report.start_test(ForceRegion_SphereShapedForce) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932045_ForceRegion_Spline.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5932045_ForceRegion_Spline.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py index e74f5cc6e0..158ba8473c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932045_ForceRegion_Spline.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py @@ -30,7 +30,7 @@ class Tests(): # fmt: on -def C5932045_ForceRegion_Spline(): +def ForceRegion_SplineForceOnRigidBodies(): """ Summary: Runs an automated test to ensure that a PhysX force region exerts spline follow force on rigid bodies @@ -117,7 +117,7 @@ def C5932045_ForceRegion_Spline(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5932045_ForceRegion_Spline") + helper.open_level("Physics", "ForceRegion_SplineForceOnRigidBodies") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -158,4 +158,4 @@ def C5932045_ForceRegion_Spline(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5932045_ForceRegion_Spline) + Report.start_test(ForceRegion_SplineForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868580_ForceRegion_SplineModifiedTransform.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C12868580_ForceRegion_SplineModifiedTransform.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py index 4e052a1b00..abc58779a2 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12868580_ForceRegion_SplineModifiedTransform.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py @@ -29,7 +29,7 @@ class Tests(): # fmt: on -def C12868580_ForceRegion_SplineModifiedTransform(): +def ForceRegion_SplineRegionWithModifiedTransform(): """ Summary: Runs an automated test to ensure that a PhysX force region correctly exerts spline follow force on rigid bodies when @@ -125,7 +125,7 @@ def C12868580_ForceRegion_SplineModifiedTransform(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C12868580_ForceRegion_SplineModifiedTransform") + helper.open_level("Physics", "ForceRegion_SplineRegionWithModifiedTransform") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -163,4 +163,4 @@ def C12868580_ForceRegion_SplineModifiedTransform(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12868580_ForceRegion_SplineModifiedTransform) + Report.start_test(ForceRegion_SplineRegionWithModifiedTransform) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905528_ForceRegion_WithNonTriggerCollider.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C12905528_ForceRegion_WithNonTriggerCollider.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py index 93453b29c0..2814fe01f8 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C12905528_ForceRegion_WithNonTriggerCollider.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def C12905528_ForceRegion_WithNonTriggerCollider(): +def ForceRegion_WithNonTriggerColliderWarning(): """ Summary: Create entity with PhysX Force Region component. Check that user is warned if new PhysX Collider component is @@ -79,4 +79,4 @@ def C12905528_ForceRegion_WithNonTriggerCollider(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12905528_ForceRegion_WithNonTriggerCollider) + Report.start_test(ForceRegion_WithNonTriggerColliderWarning) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932040_ForceRegion_CubeExertsWorldForce.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C5932040_ForceRegion_CubeExertsWorldForce.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py index 969a203502..4cb31fbc79 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C5932040_ForceRegion_CubeExertsWorldForce.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py @@ -28,7 +28,7 @@ def is_close_float(a, b, factor): return abs(b - a) < factor -def C5932040_ForceRegion_CubeExertsWorldForce(): +def ForceRegion_WorldSpaceForceOnRigidBodies(): """ Summary: A ball is suspended over a box shaped force region. @@ -82,7 +82,7 @@ def C5932040_ForceRegion_CubeExertsWorldForce(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5932040_ForceRegion_CubeExertsWorldForce") + helper.open_level("Physics", "ForceRegion_WorldSpaceForceOnRigidBodies") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -179,4 +179,4 @@ def C5932040_ForceRegion_CubeExertsWorldForce(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5932040_ForceRegion_CubeExertsWorldForce) + Report.start_test(ForceRegion_WorldSpaceForceOnRigidBodies) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090552_ForceRegion_LinearDampingNegative.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090552_ForceRegion_LinearDampingNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py index 100a07d346..559cef3571 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090552_ForceRegion_LinearDampingNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py @@ -28,7 +28,7 @@ class Tests: # fmt: on -def C6090552_ForceRegion_LinearDampingNegative(): +def ForceRegion_ZeroLinearDampingDoesNothing(): """ Summary: A ball is suspended over a force region with a linear damping value of zero and a PhysX Terrain. @@ -211,7 +211,7 @@ def C6090552_ForceRegion_LinearDampingNegative(): self.collision_handler.add_callback("OnCollisionBegin", self.on_collision_begin) # 1) Open level - helper.open_level("Physics", "C6090552_ForceRegion_LinearDampingNegative") + helper.open_level("Physics", "ForceRegion_ZeroLinearDampingDoesNothing") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -238,4 +238,4 @@ def C6090552_ForceRegion_LinearDampingNegative(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090552_ForceRegion_LinearDampingNegative) + Report.start_test(ForceRegion_ZeroLinearDampingDoesNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py index 48d08666fd..415377745f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090551_ForceRegion_LocalSpaceForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py @@ -28,7 +28,7 @@ class Tests: # fmt: on -def C6090551_ForceRegion_LocalSpaceForceNegative(): +def ForceRegion_ZeroLocalSpaceForceDoesNothing(): """ Summary: A ball is suspended over a box shaped force region and a PhysX Terrain. The force is a local space force @@ -212,7 +212,7 @@ def C6090551_ForceRegion_LocalSpaceForceNegative(): self.collision_handler.add_callback("OnCollisionBegin", self.on_collision_begin) # 1) Open level - helper.open_level("Physics", "C6090551_ForceRegion_LocalSpaceForceNegative") + helper.open_level("Physics", "ForceRegion_ZeroLocalSpaceForceDoesNothing") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -239,4 +239,4 @@ def C6090551_ForceRegion_LocalSpaceForceNegative(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090551_ForceRegion_LocalSpaceForceNegative) + Report.start_test(ForceRegion_ZeroLocalSpaceForceDoesNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090554_ForceRegion_PointForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090554_ForceRegion_PointForceNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py index 0b6b9a8b58..91190f83e5 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090554_ForceRegion_PointForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py @@ -28,7 +28,7 @@ class Tests: # fmt: on -def C6090554_ForceRegion_PointForceNegative(): +def ForceRegion_ZeroPointForceDoesNothing(): """ Summary: A ball is suspended over a box shaped force region and a PhysX Terrain. The force is a point force @@ -212,7 +212,7 @@ def C6090554_ForceRegion_PointForceNegative(): self.collision_handler.add_callback("OnCollisionBegin", self.on_collision_begin) # 1) Open level - helper.open_level("Physics", "C6090554_ForceRegion_PointForceNegative") + helper.open_level("Physics", "ForceRegion_ZeroPointForceDoesNothing") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -239,4 +239,4 @@ def C6090554_ForceRegion_PointForceNegative(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090554_ForceRegion_PointForceNegative) + Report.start_test(ForceRegion_ZeroPointForceDoesNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py index 7b5904a3d7..f3c377b5be 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090553_ForceRegion_SimpleDragForceOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py @@ -25,7 +25,7 @@ class Tests(): # fmt: on -def C6090553_ForceRegion_SimpleDragForceOnRigidBodies(): +def ForceRegion_ZeroSimpleDragForceDoesNothing(): """ Summary: Runs an automated test to ensure that force region exerts simple drag force on rigid bodies(negative test). @@ -99,7 +99,7 @@ def C6090553_ForceRegion_SimpleDragForceOnRigidBodies(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C6090553_ForceRegion_SimpleDragForceOnRigidBodies") + helper.open_level("Physics", "ForceRegion_ZeroSimpleDragForceDoesNothing") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -170,4 +170,4 @@ def C6090553_ForceRegion_SimpleDragForceOnRigidBodies(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090553_ForceRegion_SimpleDragForceOnRigidBodies) + Report.start_test(ForceRegion_ZeroSimpleDragForceDoesNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py index 7a642c6c59..44e4b7e63d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090555_ForceRegion_SplineFollowOnRigidBodies.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py @@ -24,7 +24,7 @@ class Tests(): # fmt: on -def C6090555_ForceRegion_SplineFollowOnRigidBodies(): +def ForceRegion_ZeroSplineForceDoesNothing(): """ Summary: Runs an automated test to ensure that a PhysX force region exerts spline follow force on rigid bodies(negative test) @@ -96,7 +96,7 @@ def C6090555_ForceRegion_SplineFollowOnRigidBodies(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C6090555_ForceRegion_SplineFollowOnRigidBodies") + helper.open_level("Physics", "ForceRegion_ZeroSplineForceDoesNothing") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -172,4 +172,4 @@ def C6090555_ForceRegion_SplineFollowOnRigidBodies(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090555_ForceRegion_SplineFollowOnRigidBodies) + Report.start_test(ForceRegion_ZeroSplineForceDoesNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py index 7d6a8966b2..1a20356e11 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/force_region/C6090550_ForceRegion_WorldSpaceForceNegative.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py @@ -28,7 +28,7 @@ class Tests: # fmt: on -def C6090550_ForceRegion_WorldSpaceForceNegative(): +def ForceRegion_ZeroWorldSpaceForceDoesNothing(): """ Summary: A ball is suspended above a cube shaped force region and a PhysX Terrain. The force is a world space force @@ -212,7 +212,7 @@ def C6090550_ForceRegion_WorldSpaceForceNegative(): self.collision_handler.add_callback("OnCollisionBegin", self.on_collision_begin) # 1) Open level - helper.open_level("Physics", "C6090550_ForceRegion_WorldSpaceForceNegative") + helper.open_level("Physics", "ForceRegion_ZeroWorldSpaceForceDoesNothing") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -239,4 +239,4 @@ def C6090550_ForceRegion_WorldSpaceForceNegative(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6090550_ForceRegion_WorldSpaceForceNegative) + Report.start_test(ForceRegion_ZeroWorldSpaceForceDoesNothing) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/JointsHelper.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/JointsHelper.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/joints/JointsHelper.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/JointsHelper.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243588_Joints_Ball2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Ball2BodiesConstrained.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243588_Joints_Ball2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Ball2BodiesConstrained.py index fd8556660a..136c1f5ee7 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243588_Joints_Ball2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Ball2BodiesConstrained.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243588_Joints_Ball2BodiesConstrained(): +def Joints_Ball2BodiesConstrained(): """ Summary: Check that ball joint constrains 2 bodies within cone limits @@ -72,7 +72,7 @@ def C18243588_Joints_Ball2BodiesConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243588_Joints_Ball2BodiesConstrained") + helper.open_level("Physics", "Joints_Ball2BodiesConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -110,4 +110,4 @@ def C18243588_Joints_Ball2BodiesConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243588_Joints_Ball2BodiesConstrained) + Report.start_test(Joints_Ball2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243592_Joints_BallBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallBreakable.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243592_Joints_BallBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallBreakable.py index 6182c312dc..cc721266e5 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243592_Joints_BallBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallBreakable.py @@ -19,7 +19,7 @@ class Tests: # fmt: on -def C18243592_Joints_BallBreakable(): +def Joints_BallBreakable(): """ Summary: Check that ball joint is breakable @@ -70,7 +70,7 @@ def C18243592_Joints_BallBreakable(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243592_Joints_BallBreakable") + helper.open_level("Physics", "Joints_BallBreakable") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -104,4 +104,4 @@ def C18243592_Joints_BallBreakable(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243592_Joints_BallBreakable) + Report.start_test(Joints_BallBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243591_Joints_BallLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallLeadFollowerCollide.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243591_Joints_BallLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallLeadFollowerCollide.py index 47422d1508..0e8d7ea255 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243591_Joints_BallLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallLeadFollowerCollide.py @@ -19,7 +19,7 @@ class Tests: # fmt: on -def C18243591_Joints_BallLeadFollowerCollide(): +def Joints_BallLeadFollowerCollide(): """ Summary: Check that ball joint allows lead-follower collision @@ -66,7 +66,7 @@ def C18243591_Joints_BallLeadFollowerCollide(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243591_Joints_BallLeadFollowerCollide") + helper.open_level("Physics", "Joints_BallLeadFollowerCollide") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -88,4 +88,4 @@ def C18243591_Joints_BallLeadFollowerCollide(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243591_Joints_BallLeadFollowerCollide) + Report.start_test(Joints_BallLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243590_Joints_BallNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallNoLimitsConstrained.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243590_Joints_BallNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallNoLimitsConstrained.py index 990f4f826b..ee5efdcef6 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243590_Joints_BallNoLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallNoLimitsConstrained.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243590_Joints_BallNoLimitsConstrained(): +def Joints_BallNoLimitsConstrained(): """ Summary: Check that ball joint allows no limit constraints @@ -75,7 +75,7 @@ def C18243590_Joints_BallNoLimitsConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243590_Joints_BallNoLimitsConstrained") + helper.open_level("Physics", "Joints_BallNoLimitsConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -109,4 +109,4 @@ def C18243590_Joints_BallNoLimitsConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243590_Joints_BallNoLimitsConstrained) + Report.start_test(Joints_BallNoLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243589_Joints_BallSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallSoftLimitsConstrained.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243589_Joints_BallSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallSoftLimitsConstrained.py index 30747bc2eb..3fa23b7bed 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243589_Joints_BallSoftLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallSoftLimitsConstrained.py @@ -21,7 +21,7 @@ class Tests: # fmt: on -def C18243589_Joints_BallSoftLimitsConstrained(): +def Joints_BallSoftLimitsConstrained(): """ Summary: Check that ball joint allows soft limit constraints @@ -78,7 +78,7 @@ def C18243589_Joints_BallSoftLimitsConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243589_Joints_BallSoftLimitsConstrained") + helper.open_level("Physics", "Joints_BallSoftLimitsConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -134,4 +134,4 @@ def C18243589_Joints_BallSoftLimitsConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243589_Joints_BallSoftLimitsConstrained) + Report.start_test(Joints_BallSoftLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243580_Joints_Fixed2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Fixed2BodiesConstrained.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243580_Joints_Fixed2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Fixed2BodiesConstrained.py index ceabb91a28..f71cfa2946 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243580_Joints_Fixed2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Fixed2BodiesConstrained.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243580_Joints_Fixed2BodiesConstrained(): +def Joints_Fixed2BodiesConstrained(): """ Summary: Check that fixed joint constrains 2 bodies @@ -66,7 +66,7 @@ def C18243580_Joints_Fixed2BodiesConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243580_Joints_Fixed2BodiesConstrained") + helper.open_level("Physics", "Joints_Fixed2BodiesConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -95,4 +95,4 @@ def C18243580_Joints_Fixed2BodiesConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243580_Joints_Fixed2BodiesConstrained) + Report.start_test(Joints_Fixed2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243581_Joints_FixedBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedBreakable.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243581_Joints_FixedBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedBreakable.py index 716df85c67..c4adcf14ef 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243581_Joints_FixedBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedBreakable.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243581_Joints_FixedBreakable(): +def Joints_FixedBreakable(): """ Summary: Check that fixed joint is breakable @@ -65,7 +65,7 @@ def C18243581_Joints_FixedBreakable(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243581_Joints_FixedBreakable") + helper.open_level("Physics", "Joints_FixedBreakable") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -94,4 +94,4 @@ def C18243581_Joints_FixedBreakable(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243581_Joints_FixedBreakable) + Report.start_test(Joints_FixedBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243582_Joints_FixedLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedLeadFollowerCollide.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243582_Joints_FixedLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedLeadFollowerCollide.py index 0f130a300b..e142941c5a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243582_Joints_FixedLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedLeadFollowerCollide.py @@ -19,7 +19,7 @@ class Tests: # fmt: on -def C18243582_Joints_FixedLeadFollowerCollide(): +def Joints_FixedLeadFollowerCollide(): """ Summary: Check that fixed joint allows lead-follower collision @@ -67,7 +67,7 @@ def C18243582_Joints_FixedLeadFollowerCollide(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243582_Joints_FixedLeadFollowerCollide") + helper.open_level("Physics", "Joints_FixedLeadFollowerCollide") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -89,4 +89,4 @@ def C18243582_Joints_FixedLeadFollowerCollide(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243582_Joints_FixedLeadFollowerCollide) + Report.start_test(Joints_FixedLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243593_Joints_GlobalFrameConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_GlobalFrameConstrained.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243593_Joints_GlobalFrameConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_GlobalFrameConstrained.py index bd527f10f8..2d3c30f53d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243593_Joints_GlobalFrameConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_GlobalFrameConstrained.py @@ -22,7 +22,7 @@ class Tests: # fmt: on -def C18243593_Joints_GlobalFrameConstrained(): +def Joints_GlobalFrameConstrained(): """ Summary: Check that fixed/hinge/ball joints allow constraints to global frame @@ -74,7 +74,7 @@ def C18243593_Joints_GlobalFrameConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243593_Joints_GlobalFrameConstrained") + helper.open_level("Physics", "Joints_GlobalFrameConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -117,4 +117,4 @@ def C18243593_Joints_GlobalFrameConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243593_Joints_GlobalFrameConstrained) + Report.start_test(Joints_GlobalFrameConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243583_Joints_Hinge2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Hinge2BodiesConstrained.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243583_Joints_Hinge2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Hinge2BodiesConstrained.py index e9b11bc198..3d2fe097f5 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243583_Joints_Hinge2BodiesConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Hinge2BodiesConstrained.py @@ -21,7 +21,7 @@ class Tests: # fmt: on -def C18243583_Joints_Hinge2BodiesConstrained(): +def Joints_Hinge2BodiesConstrained(): """ Summary: Check that hinge joint constrains 2 bodies about X-axis @@ -73,7 +73,7 @@ def C18243583_Joints_Hinge2BodiesConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243583_Joints_Hinge2BodiesConstrained") + helper.open_level("Physics", "Joints_Hinge2BodiesConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -112,4 +112,4 @@ def C18243583_Joints_Hinge2BodiesConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243583_Joints_Hinge2BodiesConstrained) + Report.start_test(Joints_Hinge2BodiesConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243587_Joints_HingeBreakable.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeBreakable.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243587_Joints_HingeBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeBreakable.py index b1ea7e123a..cca422728a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243587_Joints_HingeBreakable.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeBreakable.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243587_Joints_HingeBreakable(): +def Joints_HingeBreakable(): """ Summary: Check that hinge joint is breakable @@ -71,7 +71,7 @@ def C18243587_Joints_HingeBreakable(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243587_Joints_HingeBreakable") + helper.open_level("Physics", "Joints_HingeBreakable") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -106,4 +106,4 @@ def C18243587_Joints_HingeBreakable(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243587_Joints_HingeBreakable) + Report.start_test(Joints_HingeBreakable) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243586_Joints_HingeLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeLeadFollowerCollide.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243586_Joints_HingeLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeLeadFollowerCollide.py index 2b5b95939f..15be3d960d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243586_Joints_HingeLeadFollowerCollide.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeLeadFollowerCollide.py @@ -19,7 +19,7 @@ class Tests: # fmt: on -def C18243586_Joints_HingeLeadFollowerCollide(): +def Joints_HingeLeadFollowerCollide(): """ Summary: Check that hinge joint allows lead-follower collision @@ -66,7 +66,7 @@ def C18243586_Joints_HingeLeadFollowerCollide(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243586_Joints_HingeLeadFollowerCollide") + helper.open_level("Physics", "Joints_HingeLeadFollowerCollide") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -88,4 +88,4 @@ def C18243586_Joints_HingeLeadFollowerCollide(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243586_Joints_HingeLeadFollowerCollide) + Report.start_test(Joints_HingeLeadFollowerCollide) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243585_Joints_HingeNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeNoLimitsConstrained.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243585_Joints_HingeNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeNoLimitsConstrained.py index 90ac80b1fa..0870a807fc 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243585_Joints_HingeNoLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeNoLimitsConstrained.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243585_Joints_HingeNoLimitsConstrained(): +def Joints_HingeNoLimitsConstrained(): """ Summary: Check that hinge joint allows no limit constraints on 2 bodies @@ -73,7 +73,7 @@ def C18243585_Joints_HingeNoLimitsConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243585_Joints_HingeNoLimitsConstrained") + helper.open_level("Physics", "Joints_HingeNoLimitsConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -108,4 +108,4 @@ def C18243585_Joints_HingeNoLimitsConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243585_Joints_HingeNoLimitsConstrained) + Report.start_test(Joints_HingeNoLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243584_Joints_HingeSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeSoftLimitsConstrained.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/joints/C18243584_Joints_HingeSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeSoftLimitsConstrained.py index e100b61494..6d11b3452d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/joints/C18243584_Joints_HingeSoftLimitsConstrained.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeSoftLimitsConstrained.py @@ -20,7 +20,7 @@ class Tests: # fmt: on -def C18243584_Joints_HingeSoftLimitsConstrained(): +def Joints_HingeSoftLimitsConstrained(): """ Summary: Check that hinge joint allows soft limit constraints on 2 bodies @@ -77,7 +77,7 @@ def C18243584_Joints_HingeSoftLimitsConstrained(): helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C18243584_Joints_HingeSoftLimitsConstrained") + helper.open_level("Physics", "Joints_HingeSoftLimitsConstrained") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -141,4 +141,4 @@ def C18243584_Joints_HingeSoftLimitsConstrained(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18243584_Joints_HingeSoftLimitsConstrained) + Report.start_test(Joints_HingeSoftLimitsConstrained) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/AddModifyDelete_Utils.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/AddModifyDelete_Utils.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/material/AddModifyDelete_Utils.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/AddModifyDelete_Utils.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4925577_Materials_MaterialAssignedToTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CanBeAssignedToTerrain.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4925577_Materials_MaterialAssignedToTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CanBeAssignedToTerrain.py index 219e12fdb2..4dbd62c95a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4925577_Materials_MaterialAssignedToTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CanBeAssignedToTerrain.py @@ -31,7 +31,7 @@ class Tests: # fmt: on -def C4925577_Materials_MaterialAssignedToTerrain(): +def Material_CanBeAssignedToTerrain(): """ Summary: Three spheres are suspended above the terrain. Beneath two of the balls, @@ -238,7 +238,7 @@ def C4925577_Materials_MaterialAssignedToTerrain(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4925577_PhysXMaterials_MaterialAssignedToTerrain") + helper.open_level("Physics", "Material_CanBeAssignedToTerrain") # 2) Enter game mode helper.enter_game_mode(Tests.game_mode_enter) @@ -301,4 +301,4 @@ def C4925577_Materials_MaterialAssignedToTerrain(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4925577_Materials_MaterialAssignedToTerrain) + Report.start_test(Material_CanBeAssignedToTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CharacterController.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CharacterController.py index 4d806cda11..5112c77f0a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CharacterController.py @@ -44,7 +44,7 @@ class Tests: # fmt: on -def C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(): +def Material_CharacterController(): """ Summary: Runs an automated test to verify that character controllers with different surface materials behave accordingly. @@ -161,7 +161,7 @@ def C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(): helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C15556261_PhysXMaterials_CharacterControllerMaterialAssignment") + helper.open_level("Physics", "Material_CharacterController") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -198,4 +198,4 @@ def C15556261_PhysXMaterials_CharacterControllerMaterialAssignment(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15556261_PhysXMaterials_CharacterControllerMaterialAssignment) + Report.start_test(Material_CharacterController) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15308221_Material_ComponentsInSyncWithLibrary.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_ComponentsInSyncWithLibrary.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15308221_Material_ComponentsInSyncWithLibrary.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_ComponentsInSyncWithLibrary.py index b29709e95b..71603052ea 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15308221_Material_ComponentsInSyncWithLibrary.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_ComponentsInSyncWithLibrary.py @@ -46,7 +46,7 @@ class Tests: # fmt: on -def C15308221_Material_ComponentsInSyncWithLibrary(): +def Material_ComponentsInSyncWithLibrary(): """ Summary: Runs an automated test to verify that the material library is always in sync between the different PhysX components @@ -200,7 +200,7 @@ def C15308221_Material_ComponentsInSyncWithLibrary(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C15308221_Material_ComponentsInSyncWithLibrary") + helper.open_level("Physics", "Material_ComponentsInSyncWithLibrary") # Setup persisting entities collider = Entity("collider", "terrain") @@ -240,4 +240,4 @@ def C15308221_Material_ComponentsInSyncWithLibrary(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15308221_Material_ComponentsInSyncWithLibrary) + Report.start_test(Material_ComponentsInSyncWithLibrary) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15096735_Materials_DefaultLibraryConsistency.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15096735_Materials_DefaultLibraryConsistency.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py index 75c9849756..a2e5722868 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15096735_Materials_DefaultLibraryConsistency.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py @@ -95,7 +95,7 @@ class Tests: # fmt:on -def C15096735_Materials_DefaultLibraryConsistency(): +def Material_DefaultLibraryConsistentOnAllFeatures(): """ Summary: This script tests the behavior of the default PhysXMaterial library. Two separate materials are applied to a variety @@ -386,7 +386,7 @@ def C15096735_Materials_DefaultLibraryConsistency(): # 1) Open level and start game mode helper.init_idle() - helper.open_level("Physics", "C15096735_Materials_DefaultLibraryConsistency") + helper.open_level("Physics", "Material_DefaultLibraryConsistentOnAllFeatures") helper.enter_game_mode(Tests.enter_game_mode) # Create and start Terrain Test @@ -413,4 +413,4 @@ def C15096735_Materials_DefaultLibraryConsistency(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15096735_Materials_DefaultLibraryConsistency) + Report.start_test(Material_DefaultLibraryConsistentOnAllFeatures) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py index de1945bc8d..1f8cfae498 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py @@ -37,7 +37,7 @@ class Tests: # fmt: on -def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): +def Material_DefaultLibraryUpdatedAcrossLevels_after(): """ Summary: Verify Default material library works across different levels, this is the second stage to the test. The reload was required for the editor to pick up changes in default material library in the @@ -205,7 +205,7 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): try: with open( os.path.join( - os.getcwd(), "AutomatedTesting", "Levels", "Physics", "C15096732_Material_DefaultLibraryUpdatedAcrossLevels", "_last_run_before_change_data.txt" + os.getcwd(), "AutomatedTesting", "Levels", "Physics", "Material_DefaultLibraryUpdatedAcrossLevels", "_last_run_before_change_data.txt" )) as data_file: lines = data_file.readlines() for i, line in enumerate(lines): @@ -230,9 +230,7 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): # 1) Open the correct level is open helper.open_level( "physics", - "C15096732_Material_DefaultLibraryUpdatedAcrossLevels.\\{}".format( - test.level - ), + f"Material_DefaultLibraryUpdatedAcrossLevels\\{test.level}" ) # 2) Enter Game Mode @@ -281,4 +279,4 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15096732_Material_DefaultLibraryUpdatedAcrossLevels_after) + Report.start_test(Material_DefaultLibraryUpdatedAcrossLevels_after) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py index 46262f3f77..15db5808e2 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py @@ -33,7 +33,7 @@ class Tests: # fmt: on -def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): +def Material_DefaultLibraryUpdatedAcrossLevels_before(): """ Summary: Verify Default material library works across different levels, this is the first stage to the test. After the tests are run this script will save data into a text file and the editor closed. @@ -169,7 +169,7 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): try: with open( os.path.join( - os.getcwd(), "AutomatedTesting", "Levels", "Physics", "C15096732_Material_DefaultLibraryUpdatedAcrossLevels", "_last_run_before_change_data.txt" + os.getcwd(), "AutomatedTesting", "Levels", "Physics", "Material_DefaultLibraryUpdatedAcrossLevels", "_last_run_before_change_data.txt" ),"w") as data_file: for data_point in data: data_file.write(str(data_point)) @@ -188,10 +188,8 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): for test in test_list: # 1) Open the correct level is open helper.open_level( - "physics", - "C15096732_Material_DefaultLibraryUpdatedAcrossLevels.\\{}".format( - test.level - ), + "Physics", + f"Material_DefaultLibraryUpdatedAcrossLevels\\{test.level}" ) # 2) Enter Game Mode @@ -233,4 +231,4 @@ def C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15096732_Material_DefaultLibraryUpdatedAcrossLevels_before) + Report.start_test(Material_DefaultLibraryUpdatedAcrossLevels_before) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15096737_Materials_DefaultMaterialLibraryChanges.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15096737_Materials_DefaultMaterialLibraryChanges.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py index a4c65fc24c..5aa03d665d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15096737_Materials_DefaultMaterialLibraryChanges.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py @@ -64,7 +64,7 @@ class Tests: concrete_material_changed = ("Concrete material changed correctly", "Concrete didn't react correctly") # fmt: on -def C15096737_Materials_DefaultMaterialLibraryChanges(): +def Material_DefaultMaterialLibraryChangesWork(): """ Summary: Runs an automated test to verify that material selected in the default material library is applied to PhysX colliders, character controller, terrain texture layers and ragdolls and that material can respond to change. @@ -252,7 +252,7 @@ def C15096737_Materials_DefaultMaterialLibraryChanges(): # Main Script helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C15096737_Materials_DefaultMaterialLibraryChanges") + helper.open_level("Physics", "Material_DefaultMaterialLibraryChangesWork") # 2) Setup targets and colliders terrain = Entity("terrain") @@ -292,4 +292,4 @@ def C15096737_Materials_DefaultMaterialLibraryChanges(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15096737_Materials_DefaultMaterialLibraryChanges) + Report.start_test(Material_DefaultMaterialLibraryChangesWork) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044459_Material_DynamicFriction.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DynamicFriction.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044459_Material_DynamicFriction.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DynamicFriction.py index cdf2816f17..7ebe5b8528 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044459_Material_DynamicFriction.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DynamicFriction.py @@ -35,7 +35,7 @@ class Tests(): # fmt: on -def C4044459_Material_DynamicFriction(): +def Material_DynamicFriction(): """ Summary: Runs an automated test to ensure that greater dynamic friction coefficient settings on a physX material results in @@ -119,7 +119,7 @@ def C4044459_Material_DynamicFriction(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4044459_Material_DynamicFriction") + helper.open_level("Physics", "Material_DynamicFriction") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -187,4 +187,4 @@ def C4044459_Material_DynamicFriction(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044459_Material_DynamicFriction) + Report.start_test(Material_DynamicFriction) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044694_Material_EmptyLibraryUsesDefault.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_EmptyLibraryUsesDefault.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044694_Material_EmptyLibraryUsesDefault.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_EmptyLibraryUsesDefault.py index 8cba90cba8..1d06092f61 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044694_Material_EmptyLibraryUsesDefault.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_EmptyLibraryUsesDefault.py @@ -28,7 +28,7 @@ class Tests: # fmt: on -def C4044694_Material_EmptyLibraryUsesDefault(): +def Material_EmptyLibraryUsesDefault(): """ Summary: Runs an automated test to verify that an object with an empty Material library in a Collider Component continues to @@ -137,7 +137,7 @@ def C4044694_Material_EmptyLibraryUsesDefault(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4044694_Material_EmptyLibraryUsesDefault") + helper.open_level("Physics", "Material_EmptyLibraryUsesDefault") helper.enter_game_mode(Tests.enter_game_mode) # 2) Find entities @@ -185,4 +185,4 @@ def C4044694_Material_EmptyLibraryUsesDefault(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044694_Material_EmptyLibraryUsesDefault) + Report.start_test(Material_EmptyLibraryUsesDefault) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044456_Material_FrictionCombine.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombine.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044456_Material_FrictionCombine.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombine.py index 8c3b389264..afd775fb7a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044456_Material_FrictionCombine.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombine.py @@ -36,7 +36,7 @@ class Tests(): # fmt: on -def C4044456_Material_FrictionCombine(): +def Material_FrictionCombine(): """ Summary: @@ -137,7 +137,7 @@ def C4044456_Material_FrictionCombine(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4044456_Material_FrictionCombine") + helper.open_level("Physics", "Material_FrictionCombine") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -209,4 +209,4 @@ def C4044456_Material_FrictionCombine(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044456_Material_FrictionCombine) + Report.start_test(Material_FrictionCombine) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C18977601_Material_FrictionCombinePriority.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombinePriorityOrder.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C18977601_Material_FrictionCombinePriority.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombinePriorityOrder.py index 4cef743854..d7fc89c8a6 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C18977601_Material_FrictionCombinePriority.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombinePriorityOrder.py @@ -50,7 +50,7 @@ class Tests(): # fmt: on -def C18977601_Material_FrictionCombinePriority(): +def Material_FrictionCombinePriorityOrder(): """ Summary: Runs an automated test to ensure that the friction combine mode is assigned according to the correct priority. @@ -269,7 +269,7 @@ def C18977601_Material_FrictionCombinePriority(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C18977601_Material_FrictionCombinePriority") + helper.open_level("Physics", "Material_FrictionCombinePriorityOrder") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -352,4 +352,4 @@ def C18977601_Material_FrictionCombinePriority(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18977601_Material_FrictionCombinePriority) + Report.start_test(Material_FrictionCombinePriorityOrder) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044455_Material_libraryChangesInstantly.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryChangesReflectInstantly.py similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044455_Material_libraryChangesInstantly.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryChangesReflectInstantly.py index 8eb2e7e9a4..008f660e5c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044455_Material_libraryChangesInstantly.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryChangesReflectInstantly.py @@ -114,7 +114,7 @@ class Tests: # fmt: on -def C4044455_Material_libraryChangesInstantly(): +def Material_LibraryChangesReflectInstantly(): """ Summary: Verify that any change in any of the values of the material, once saved, is immediately reflected in the component and functionality @@ -474,4 +474,4 @@ def C4044455_Material_libraryChangesInstantly(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044455_Material_libraryChangesInstantly) + Report.start_test(Material_LibraryChangesReflectInstantly) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15096740_Material_LibraryUpdatedCorrectly.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryClearingAssignsDefault.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15096740_Material_LibraryUpdatedCorrectly.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryClearingAssignsDefault.py index 88c51bae8a..66bca8bfda 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15096740_Material_LibraryUpdatedCorrectly.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryClearingAssignsDefault.py @@ -21,7 +21,7 @@ class Tests(): # fmt: on -def C15096740_Material_LibraryUpdatedCorrectly(): +def Material_LibraryClearingAssignsDefault(): """ Summary: @@ -100,4 +100,4 @@ def C15096740_Material_LibraryUpdatedCorrectly(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15096740_Material_LibraryUpdatedCorrectly) + Report.start_test(Material_LibraryClearingAssignsDefault) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15563573_Material_AddModifyDeleteOnCharacterController.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15563573_Material_AddModifyDeleteOnCharacterController.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py index cf38ddc11c..aeface4d48 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15563573_Material_AddModifyDeleteOnCharacterController.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py @@ -44,7 +44,7 @@ class Tests: # fmt: on -def C15563573_Material_AddModifyDeleteOnCharacterController(): +def Material_LibraryCrudOperationsReflectOnCharacterController(): """ Summary: Runs an automated test to verify that any change (Add/Delete/Modify) made to the material surface in the material @@ -161,7 +161,7 @@ def C15563573_Material_AddModifyDeleteOnCharacterController(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C15563573_Material_AddModifyDeleteOnCharacterController") + helper.open_level("Physics", "Material_LibraryCrudOperationsReflectOnCharacterController") # Setup persisting entities default_box = Box("on_default") @@ -193,4 +193,4 @@ def C15563573_Material_AddModifyDeleteOnCharacterController(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15563573_Material_AddModifyDeleteOnCharacterController) + Report.start_test(Material_LibraryCrudOperationsReflectOnCharacterController) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4888315_Material_AddModifyDeleteOnCollider.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4888315_Material_AddModifyDeleteOnCollider.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py index 61c378d287..8abdbf1ddd 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4888315_Material_AddModifyDeleteOnCollider.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py @@ -41,7 +41,7 @@ class Tests: # fmt: on -def C4888315_Material_AddModifyDeleteOnCollider(): +def Material_LibraryCrudOperationsReflectOnCollider(): """ Summary: Runs an automated test to verify that any change (Add/Delete/Modify) made to the material surface in the material @@ -141,7 +141,7 @@ def C4888315_Material_AddModifyDeleteOnCollider(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4888315_Material_AddModifyDeleteOnCollider") + helper.open_level("Physics", "Material_LibraryCrudOperationsReflectOnCollider") # Setup persisting entities default_box = Box("default") @@ -172,4 +172,4 @@ def C4888315_Material_AddModifyDeleteOnCollider(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4888315_Material_AddModifyDeleteOnCollider) + Report.start_test(Material_LibraryCrudOperationsReflectOnCollider) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4925582_Material_AddModifyDeleteOnRagdollBones.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4925582_Material_AddModifyDeleteOnRagdollBones.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py index 0abfae08f9..ab85a2157a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4925582_Material_AddModifyDeleteOnRagdollBones.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py @@ -41,7 +41,7 @@ class Tests: # fmt: on -def C4925582_Material_AddModifyDeleteOnRagdollBones(): +def Material_LibraryCrudOperationsReflectOnRagdollBones(): """ Summary: Runs an automated test to verify that any change (Add/Delete/Modify) made to the material surface in the material @@ -170,7 +170,7 @@ def C4925582_Material_AddModifyDeleteOnRagdollBones(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4925582_Material_AddModifyDeleteOnRagdollBones") + helper.open_level("Physics", "Material_LibraryCrudOperationsReflectOnRagdollBones") # Setup persisting entities default_ragdoll = Ragdoll("default") @@ -208,4 +208,4 @@ def C4925582_Material_AddModifyDeleteOnRagdollBones(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4925582_Material_AddModifyDeleteOnRagdollBones) + Report.start_test(Material_LibraryCrudOperationsReflectOnRagdollBones) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4925579_Material_AddModifyDeleteOnTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4925579_Material_AddModifyDeleteOnTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py index 8b3d72a932..484b3bbd8b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4925579_Material_AddModifyDeleteOnTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py @@ -41,7 +41,7 @@ class Tests: # fmt: on -def C4925579_Material_AddModifyDeleteOnTerrain(): +def Material_LibraryCrudOperationsReflectOnTerrain(): """ Summary: Runs an automated test to verify that any change (Add/Delete/Modify) made to the material surface in the material @@ -141,7 +141,7 @@ def C4925579_Material_AddModifyDeleteOnTerrain(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4925579_Material_AddModifyDeleteOnTerrain") + helper.open_level("Physics", "Material_LibraryCrudOperationsReflectOnTerrain") # Setup persisting entities default_box = Box("on_default") @@ -172,4 +172,4 @@ def C4925579_Material_AddModifyDeleteOnTerrain(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4925579_Material_AddModifyDeleteOnTerrain) + Report.start_test(Material_LibraryCrudOperationsReflectOnTerrain) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C15425935_Material_LibraryUpdatedAcrossLevels.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryUpdatedAcrossLevels.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C15425935_Material_LibraryUpdatedAcrossLevels.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryUpdatedAcrossLevels.py index 91452a1173..0b647361f6 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C15425935_Material_LibraryUpdatedAcrossLevels.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryUpdatedAcrossLevels.py @@ -61,7 +61,7 @@ class Tests: # fmt: on -def C15425935_Material_LibraryUpdatedAcrossLevels(): +def Material_LibraryUpdatedAcrossLevels(): """ Summary: Verify that the change in a physmaterial library gets updated across levels @@ -231,7 +231,7 @@ def C15425935_Material_LibraryUpdatedAcrossLevels(): return triggers and delete_sphere_velocities def modify_material_library(): - physmaterial_object = Physmaterial_Editor("C15425935_Material_LibraryUpdatedAcrossLevels.physmaterial") + physmaterial_object = Physmaterial_Editor("Material_LibraryUpdatedAcrossLevels.physmaterial") physmaterial_object.delete_material("to_delete") physmaterial_object.modify_material("to_modify", "Restitution", 1.0) physmaterial_object.save_changes() @@ -253,7 +253,7 @@ def C15425935_Material_LibraryUpdatedAcrossLevels(): # 1) Open the correct level for the test helper.open_level( "physics", - "C15425935_Material_LibraryUpdatedAcrossLevels\\C15425935_Material_LibraryUpdatedAcrossLevels_{}".format( + "Material_LibraryUpdatedAcrossLevels\\Material_LibraryUpdatedAcrossLevels_{}".format( test.level_index ), ) @@ -302,4 +302,4 @@ def C15425935_Material_LibraryUpdatedAcrossLevels(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C15425935_Material_LibraryUpdatedAcrossLevels) + Report.start_test(Material_LibraryUpdatedAcrossLevels) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C5296614_PhysXMaterial_ColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_NoEffectIfNoColliderShape.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/material/C5296614_PhysXMaterial_ColliderShape.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_NoEffectIfNoColliderShape.py index de7ed4db9b..7037598fb1 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C5296614_PhysXMaterial_ColliderShape.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_NoEffectIfNoColliderShape.py @@ -10,8 +10,6 @@ SPDX-License-Identifier: Apache-2.0 OR MIT # Test Case Title : Check that unless you assign a shape to a physX collider component, # the material assigned to it does not take affect - - # fmt: off class Tests: # level @@ -30,7 +28,7 @@ class Tests: # fmt: on -def C5296614_PhysXMaterial_ColliderShape(): +def Material_NoEffectIfNoColliderShape(): """ Summary: Runs an automated test to verify that unless you assign a shape to a PhysX collider component, @@ -122,7 +120,7 @@ def C5296614_PhysXMaterial_ColliderShape(): helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C5296614_PhysXMaterial_ColliderShape") + helper.open_level("Physics", "Material_NoEffectIfNoColliderShape") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -148,4 +146,4 @@ def C5296614_PhysXMaterial_ColliderShape(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5296614_PhysXMaterial_ColliderShape) + Report.start_test(Material_NoEffectIfNoColliderShape) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044697_Material_PerfaceMaterialValidation.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044697_Material_PerfaceMaterialValidation.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py index 9ee8d404d7..fc2a91838c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044697_Material_PerfaceMaterialValidation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py @@ -48,7 +48,7 @@ class Tests: # fmt: on -def C4044697_Material_PerfaceMaterialValidation(): +def Material_PerFaceMaterialGetsCorrectMaterial(): """ Summary: The perface has three different faces that can pick up different materials. To check that each face picks up the material assigned to it I send three spheres of the same material at each face to see the @@ -236,7 +236,7 @@ def C4044697_Material_PerfaceMaterialValidation(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C4044697_Material_PerfaceMaterialValidation") + helper.open_level("Physics", "Material_PerFaceMaterialGetsCorrectMaterial") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -298,4 +298,4 @@ def C4044697_Material_PerfaceMaterialValidation(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044697_Material_PerfaceMaterialValidation) + Report.start_test(Material_PerFaceMaterialGetsCorrectMaterial) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4925580_Material_RagdollBonesMaterial.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RagdollBones.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4925580_Material_RagdollBonesMaterial.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RagdollBones.py index 96316b1cdf..68565b41f0 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4925580_Material_RagdollBonesMaterial.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RagdollBones.py @@ -29,7 +29,7 @@ class Tests: # fmt: on -def C4925580_Material_RagdollBonesMaterial(): +def Material_RagdollBones(): """ Summary: This script runs an automated test to verify that assigning material to the skeleton of an actor entity with PhysX @@ -116,7 +116,7 @@ def C4925580_Material_RagdollBonesMaterial(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4925580_Material_RagdollBonesMaterial") + helper.open_level("Physics", "Material_RagdollBones") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve and validate entities @@ -190,4 +190,4 @@ def C4925580_Material_RagdollBonesMaterial(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4925580_Material_RagdollBonesMaterial) + Report.start_test(Material_RagdollBones) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044461_Material_Restitution.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_Restitution.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044461_Material_Restitution.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_Restitution.py index b077af1593..ee72fed7af 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044461_Material_Restitution.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_Restitution.py @@ -36,7 +36,7 @@ class Tests(): # fmt: on -def C4044461_Material_Restitution(): +def Material_Restitution(): """ Summary: Runs an automated test to ensure that greater restitution coefficient settings on a physX material results in @@ -147,7 +147,7 @@ def C4044461_Material_Restitution(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4044461_Material_Restitution") + helper.open_level("Physics", "Material_Restitution") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -226,4 +226,4 @@ def C4044461_Material_Restitution(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044461_Material_Restitution) + Report.start_test(Material_Restitution) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044457_Material_RestitutionCombine.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombine.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044457_Material_RestitutionCombine.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombine.py index a20c7e49f7..448e82f816 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044457_Material_RestitutionCombine.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombine.py @@ -36,7 +36,7 @@ class Tests(): # fmt: on -def C4044457_Material_RestitutionCombine(): +def Material_RestitutionCombine(): """ Summary: @@ -159,7 +159,7 @@ def C4044457_Material_RestitutionCombine(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4044457_Material_RestitutionCombine") + helper.open_level("Physics", "Material_RestitutionCombine") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -241,4 +241,4 @@ def C4044457_Material_RestitutionCombine(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044457_Material_RestitutionCombine) + Report.start_test(Material_RestitutionCombine) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C18981526_Material_RestitutionCombinePriority.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombinePriorityOrder.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C18981526_Material_RestitutionCombinePriority.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombinePriorityOrder.py index 9663453df2..09d630ebe2 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C18981526_Material_RestitutionCombinePriority.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombinePriorityOrder.py @@ -50,7 +50,7 @@ class Tests(): # fmt: on -def C18981526_Material_RestitutionCombinePriority(): +def Material_RestitutionCombinePriorityOrder(): """ Summary: Runs an automated test to ensure that the restitution combine mode is assigned according to the correct priority. @@ -334,7 +334,7 @@ def C18981526_Material_RestitutionCombinePriority(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C18981526_Material_RestitutionCombinePriority") + helper.open_level("Physics", "Material_RestitutionCombinePriorityOrder") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -413,4 +413,4 @@ def C18981526_Material_RestitutionCombinePriority(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C18981526_Material_RestitutionCombinePriority) + Report.start_test(Material_RestitutionCombinePriorityOrder) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/C4044460_Material_StaticFriction.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_StaticFriction.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/material/C4044460_Material_StaticFriction.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_StaticFriction.py index 5558f01222..6d5551cbbc 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/material/C4044460_Material_StaticFriction.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_StaticFriction.py @@ -31,7 +31,7 @@ class Tests(): # fmt: on -def C4044460_Material_StaticFriction(): +def Material_StaticFriction(): """ Summary: Runs an automated test to ensure that greater static friction coefficient settings on a physX material results in @@ -126,7 +126,7 @@ def C4044460_Material_StaticFriction(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4044460_Material_StaticFriction") + helper.open_level("Physics", "Material_StaticFriction") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -184,4 +184,4 @@ def C4044460_Material_StaticFriction(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4044460_Material_StaticFriction) + Report.start_test(Material_StaticFriction) diff --git a/AutomatedTesting/Gem/PythonTests/physics/material/Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics/tests/material/Physmaterial_Editor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/material/Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/material/Physmaterial_Editor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C17411467_AddPhysxRagdollComponent.py b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/ragdoll/C17411467_AddPhysxRagdollComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py index 9c02239d73..9791d385fc 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C17411467_AddPhysxRagdollComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def C17411467_AddPhysxRagdollComponent(): +def Ragdoll_AddPhysxRagdollComponentWorks(): """ Summary: Load level with Entity having Actor, AnimGraph and PhysX Ragdoll components. @@ -89,4 +89,4 @@ def C17411467_AddPhysxRagdollComponent(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C17411467_AddPhysxRagdollComponent) + Report.start_test(Ragdoll_AddPhysxRagdollComponentWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C13895144_Ragdoll_ChangeLevel.py b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py similarity index 86% rename from AutomatedTesting/Gem/PythonTests/physics/ragdoll/C13895144_Ragdoll_ChangeLevel.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py index c7ff00a7e3..eb54c39aa8 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C13895144_Ragdoll_ChangeLevel.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py @@ -21,21 +21,21 @@ class Tests(): # fmt: on -def C13895144_Ragdoll_ChangeLevel(): +def Ragdoll_LevelSwitchDoesNotCrash(): """ Summary: Runs an automated test to ensure that switching from a level with many ragdolls to a level with no ragdolls does not crash the editor. Level Description: - C13895144_Ragdoll_WithRagdoll: + Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll: 10 Ragdoll entities are placed in a row. Each Entity has an Actor, Anim Graph and PhysX Ragdoll component. - C13895144_Ragdoll_NoRagdoll: + Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll: The same default level configuration as previous, but with no ragdoll entities. Essentially an empty level. Expected Behavior: - C13895144_Ragdoll_WithRagdoll loads, all entities are found, then C13895144_Ragdoll_NoRagdoll loads correctly. + Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll loads, all entities are found, then Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll loads correctly. No crash should occur. Test Steps: @@ -67,7 +67,7 @@ def C13895144_Ragdoll_ChangeLevel(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C13895144_Ragdoll_WithRagdoll") + helper.open_level("Physics", "Ragdoll_LevelSwitchDoesNotCrash/WithRagdoll") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode_with_ragdolls) @@ -86,7 +86,7 @@ def C13895144_Ragdoll_ChangeLevel(): helper.exit_game_mode(Tests.exit_game_mode_with_ragdolls) # 5) Open level (without ragdolls) - helper.open_level("Physics", "C13895144_Ragdoll_NoRagdoll") + helper.open_level("Physics", "Ragdoll_LevelSwitchDoesNotCrash/NoRagdoll") # 6) Enter game mode helper.enter_game_mode(Tests.enter_game_mode_without_ragdolls) @@ -100,4 +100,4 @@ def C13895144_Ragdoll_ChangeLevel(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C13895144_Ragdoll_ChangeLevel) + Report.start_test(Ragdoll_LevelSwitchDoesNotCrash) diff --git a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C14654882_Ragdoll_ragdollAPTest.py b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/ragdoll/C14654882_Ragdoll_ragdollAPTest.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py index 56784b0c72..296473ee6d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C14654882_Ragdoll_ragdollAPTest.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py @@ -32,7 +32,7 @@ class UnexpectedLines: lines = ["Assert", "RagdollComponent' is not registered with the serializer"] -def C14654882_Ragdoll_ragdollAPTest(): +def Ragdoll_OldRagdollSerializationNoErrors(): """ Summary: Opens level containing old PhysX Ragdoll component. @@ -81,7 +81,7 @@ def C14654882_Ragdoll_ragdollAPTest(): log_modified_time = os.stat(AP_GUI_log_path).st_mtime # 1) Open the level - helper.open_level("Physics", "C14654882_Ragdoll_ragdollAPTest") + helper.open_level("Physics", "Ragdoll_OldRagdollSerializationNoErrors") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -125,4 +125,4 @@ def C14654882_Ragdoll_ragdollAPTest(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14654882_Ragdoll_ragdollAPTest) + Report.start_test(Ragdoll_OldRagdollSerializationNoErrors) diff --git a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py index d917449daf..ef6598102f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/ragdoll/C28978033_Ragdoll_WorldBodyBusTests.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C28978033_Ragdoll_WorldBodyBusTests(): +def Ragdoll_WorldBodyBusWorks(): r""" Summary: Runs a test to make sure that a WorldBodyBus works property for ragdolls @@ -61,7 +61,7 @@ def C28978033_Ragdoll_WorldBodyBusTests(): # 1) Open level / Enter game mode helper.init_idle() - helper.open_level("Physics", "C28978033_Ragdoll_WorldBodyBusTests") + helper.open_level("Physics", "Ragdoll_WorldBodyBusWorks") # Needs better solution general.idle_wait(6) # wait a little bit for ragdoll data to load @@ -112,4 +112,4 @@ def C28978033_Ragdoll_WorldBodyBusTests(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C28978033_Ragdoll_WorldBodyBusTests) + Report.start_test(Ragdoll_WorldBodyBusWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py index b0b69d6d91..46136c2115 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976194_RigidBody_PhysXComponentIsValid.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C4976194_RigidBody_PhysXComponentIsValid(): +def RigidBody_AddRigidBodyComponent(): """ Summary: @@ -74,7 +74,7 @@ def C4976194_RigidBody_PhysXComponentIsValid(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976194_RigidBody_PhysXComponentIsValid") + helper.open_level("Physics", "RigidBody_AddRigidBodyComponent") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -109,4 +109,4 @@ def C4976194_RigidBody_PhysXComponentIsValid(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976194_RigidBody_PhysXComponentIsValid) + Report.start_test(RigidBody_AddRigidBodyComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py index 77dfe4c483..6631ac66c8 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976200_RigidBody_AngularDampingObjectRotation.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py @@ -33,7 +33,7 @@ class Tests: # fmt: on -def C4976200_RigidBody_AngularDampingObjectRotation(): +def RigidBody_AngularDampingAffectsRotation(): """ The level consists of a PhysX Terrain component that is not interacted with (per the test case) 3 PhysX colliders with shape box, PhysX rigid bodies physics, and mesh with shape box. @@ -186,7 +186,7 @@ def C4976200_RigidBody_AngularDampingObjectRotation(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976200_RigidBody_AngularDampingObjectRotation") + helper.open_level("Physics", "RigidBody_AngularDampingAffectsRotation") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -284,4 +284,4 @@ def C4976200_RigidBody_AngularDampingObjectRotation(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976200_RigidBody_AngularDampingObjectRotation) + Report.start_test(RigidBody_AngularDampingAffectsRotation) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976209_RigidBody_ComputesCOM.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976209_RigidBody_ComputesCOM.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py index 27d4ea1356..a399aad877 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976209_RigidBody_ComputesCOM.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py @@ -39,7 +39,7 @@ class Tests(): # fmt: on -def C4976209_RigidBody_ComputesCOM(): +def RigidBody_COM_ComputingWorks(): # type: () -> None """ Summary: @@ -116,7 +116,7 @@ def C4976209_RigidBody_ComputesCOM(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976209_RigidBody_ComputesCOM") + helper.open_level("Physics", "RigidBody_COM_ComputingWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -158,6 +158,7 @@ def C4976209_RigidBody_ComputesCOM(): # 5) Check center of mass for each physics asset enabled_is_close = physics_asset_enabled.com_local.IsClose(PHYSICS_ASSET_EXPECTED_COM, CLOSE_THRESHOLD) + print(f"{physics_asset_enabled.com_local.x}, {physics_asset_enabled.com_local.y}, {physics_asset_enabled.com_local.z}") Report.result(physics_asset_enabled.com_valid_test, enabled_is_close) disabled_is_close = physics_asset_disabled.com_local.IsClose(CONTROL_COM, CLOSE_THRESHOLD) @@ -169,4 +170,4 @@ def C4976209_RigidBody_ComputesCOM(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976209_RigidBody_ComputesCOM) + Report.start_test(RigidBody_COM_ComputingWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976210_COM_ManualSetting.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976210_COM_ManualSetting.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py index cbbefb5a0e..4e5a88fe57 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976210_COM_ManualSetting.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py @@ -31,7 +31,7 @@ class Tests: # fmt: on -def C4976210_COM_ManualSetting(): +def RigidBody_COM_ManualSettingWorks(): # type: () -> None """ Summary: @@ -244,7 +244,7 @@ def C4976210_COM_ManualSetting(): # 1) Open level and start game mode helper.init_idle() - helper.open_level("Physics", "C4976210_COM_ManualSetting") + helper.open_level("Physics", "RigidBody_COM_ManualSettingWorks") helper.enter_game_mode(Tests.enter_game_mode) # 2) Find and validate test entities @@ -297,4 +297,4 @@ def C4976210_COM_ManualSetting(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976210_COM_ManualSetting) + Report.start_test(RigidBody_COM_ManualSettingWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13351703_COM_NotIncludeTriggerShapes.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13351703_COM_NotIncludeTriggerShapes.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py index 56f44503ae..c7724df311 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13351703_COM_NotIncludeTriggerShapes.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def C13351703_COM_NotIncludeTriggerShapes(): +def RigidBody_COM_NotIncludesTriggerShapes(): """ Summary: @@ -69,7 +69,7 @@ def C13351703_COM_NotIncludeTriggerShapes(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C13351703_COM_NotIncludeTriggerShapes") + helper.open_level("Physics", "RigidBody_COM_NotIncludesTriggerShapes") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -89,4 +89,4 @@ def C13351703_COM_NotIncludeTriggerShapes(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C13351703_COM_NotIncludeTriggerShapes) + Report.start_test(RigidBody_COM_NotIncludesTriggerShapes) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py index eb87fd0c68..6e7a460f05 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976218_RigidBodies_InertiaObjectsNotComputed.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py @@ -20,7 +20,7 @@ class Tests(): exit_game_mode = ("Exited game mode", "Failed to exit game mode") # fmt: on -def C4976218_RigidBodies_InertiaObjectsNotComputed(): +def RigidBody_ComputeInertiaWorks(): """ Summary: Level Description: @@ -82,7 +82,7 @@ def C4976218_RigidBodies_InertiaObjectsNotComputed(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976218_RigidBodies_InertiaObjectNotComputed") + helper.open_level("Physics", "RigidBody_ComputeInertiaWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -157,4 +157,4 @@ def C4976218_RigidBodies_InertiaObjectsNotComputed(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976218_RigidBodies_InertiaObjectsNotComputed) + Report.start_test(RigidBody_ComputeInertiaWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C100000_RigidBody_EnablingGravityWorksPoC.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py similarity index 92% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C100000_RigidBody_EnablingGravityWorksPoC.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py index f3d3e02d8e..b15c17f405 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C100000_RigidBody_EnablingGravityWorksPoC.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py @@ -22,7 +22,7 @@ class Tests(): # fmt:on -def C100000_RigidBody_EnablingGravityWorksPoC(): +def RigidBody_EnablingGravityWorksPoC(): import os import sys from editor_python_test_tools.utils import Report @@ -63,14 +63,14 @@ def C100000_RigidBody_EnablingGravityWorksPoC(): already handled in TestHelper.wait_for_condition """ z_end = azlmbr.components.TransformBus(azlmbr.bus.Event, "GetWorldZ", ball_id) - return Ball.z_start > z_end + return z_end < 35 # 7) Validate ball fell by ensuring z is decreasing - fell_down = helper.wait_for_condition(ball_fell, 1.0) + fell_down = helper.wait_for_condition(ball_fell, 10.0) Report.result(Tests.ball_fell, fell_down) helper.exit_game_mode(Tests.exit_game_mode) if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C100000_RigidBody_EnablingGravityWorksPoC) + Report.start_test(RigidBody_EnablingGravityWorksPoC) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py index 997ea8a5a6..b22497c9fd 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py @@ -20,7 +20,7 @@ class Tests: # fmt:on -def C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(): +def RigidBody_EnablingGravityWorksUsingNotificationsPoC(): # Setup path import os import sys @@ -80,4 +80,4 @@ def C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C111111_RigidBody_EnablingGravityWorksUsingNotificationsPoC) + Report.start_test(RigidBody_EnablingGravityWorksUsingNotificationsPoC) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py index 7f400051ec..0c2ad7c355 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976197_RigidBodies_InitialAngularVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py @@ -29,7 +29,7 @@ class Tests: # fmt: on -def C4976197_RigidBodies_InitialAngularVelocity(): +def RigidBody_InitialAngularVelocity(): # type: () -> None """ Summary: @@ -110,7 +110,7 @@ def C4976197_RigidBodies_InitialAngularVelocity(): helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C4976197_RigidBodies_InitialAngularVelocity") + helper.open_level("Physics", "RigidBody_InitialAngularVelocity") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -176,4 +176,4 @@ def C4976197_RigidBodies_InitialAngularVelocity(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976197_RigidBodies_InitialAngularVelocity) + Report.start_test(RigidBody_InitialAngularVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py index f13a7232fa..1fd2a68d3d 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976195_RigidBodies_InitialLinearVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py @@ -21,7 +21,7 @@ class Tests: sphere_velocity = ("The magnitude of velocity is close to 5", "The magnitude of velocity is not close to 5") exit_game_mode = ("Exited game mode", "Couldn't exit game mode") -def C4976195_RigidBodies_InitialLinearVelocity(): +def RigidBody_InitialLinearVelocity(): # type: () -> None """ Summary: @@ -67,7 +67,7 @@ def C4976195_RigidBodies_InitialLinearVelocity(): helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C4976195_RigidBodies_InitialLinearVelocity") + helper.open_level("Physics", "RigidBody_InitialLinearVelocity") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -128,4 +128,4 @@ def C4976195_RigidBodies_InitialLinearVelocity(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976195_RigidBodies_InitialLinearVelocity) + Report.start_test(RigidBody_InitialLinearVelocity) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_KinematicModeWorks.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_KinematicModeWorks.py index 65814bd438..1c53854bab 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976207_PhysXRigidBodies_KinematicBehavior.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_KinematicModeWorks.py @@ -26,7 +26,7 @@ class Tests(): # fmt: on -def C4976207_PhysXRigidBodies_KinematicBehavior(): +def RigidBody_KinematicModeWorks(): """ Summary: Runs an automated test to ensure kinematic property causes entity to remain in place when gravity acts upon it @@ -70,7 +70,7 @@ def C4976207_PhysXRigidBodies_KinematicBehavior(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C4976207_PhysXRigidBodies_KinematicBehavior") + helper.open_level("Physics", "RigidBody_KinematicModeWorks") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve entities @@ -128,4 +128,4 @@ def C4976207_PhysXRigidBodies_KinematicBehavior(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976207_PhysXRigidBodies_KinematicBehavior) + Report.start_test(RigidBody_KinematicModeWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py index 502478f13c..79eae01d09 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976199_RigidBodies_LinearDampingObjectMotion.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py @@ -32,7 +32,7 @@ class Tests: # fmt: on -def C4976199_RigidBodies_LinearDampingObjectMotion(): +def RigidBody_LinearDampingAffectsMotion(): """ The level consists of a PhysX Terrain component that is not interacted with (per the test case) and a PhysX collider with shape sphere, PhysX rigid bodies physics, and mesh with shape sphere. @@ -168,7 +168,7 @@ def C4976199_RigidBodies_LinearDampingObjectMotion(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976199_RigidBodies_LinearDampingObjectMotion") + helper.open_level("Physics", "RigidBody_LinearDampingAffectsMotion") def run_test_steps(sphere): @@ -266,4 +266,4 @@ def C4976199_RigidBodies_LinearDampingObjectMotion(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976199_RigidBodies_LinearDampingObjectMotion) + Report.start_test(RigidBody_LinearDampingAffectsMotion) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976201_RigidBody_MassIsAssigned.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py similarity index 99% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976201_RigidBody_MassIsAssigned.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py index 54f589da1e..1a97ce5723 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976201_RigidBody_MassIsAssigned.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py @@ -59,7 +59,7 @@ class Tests: # fmt: on -def C4976201_RigidBody_MassIsAssigned(): +def RigidBody_MassDifferentValuesWorks(): """ Summary: Checking that the mass set to the object is actually applied via colliding entities @@ -310,7 +310,7 @@ def C4976201_RigidBody_MassIsAssigned(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976201_RigidBody_MassIsAssigned") + helper.open_level("Physics", "RigidBody_MassDifferentValuesWorks") # 2) Repeat steps 3-9 for target_sphere in target_spheres: @@ -369,4 +369,4 @@ def C4976201_RigidBody_MassIsAssigned(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976201_RigidBody_MassIsAssigned) + Report.start_test(RigidBody_MassDifferentValuesWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py index 41635ecc47..7e2bb38836 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C13352089_RigidBodies_MaxAngularVelocity.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py @@ -66,7 +66,7 @@ class Tests: # fmt: on -def C13352089_RigidBodies_MaxAngularVelocity(): +def RigidBody_MaxAngularVelocityWorks(): """ Summary: Runs an automated test to ensure maximum angular velocity and angular damping interact correctly with @@ -241,7 +241,7 @@ def C13352089_RigidBodies_MaxAngularVelocity(): helper.init_idle() # 1) Load the level - helper.open_level("Physics", "C13352089_RigidBodies_MaxAngularVelocity") + helper.open_level("Physics", "RigidBody_MaxAngularVelocityWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -280,4 +280,4 @@ def C13352089_RigidBodies_MaxAngularVelocity(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C13352089_RigidBodies_MaxAngularVelocity) + Report.start_test(RigidBody_MaxAngularVelocityWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py index 92d3945391..e7737016f4 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C5340400_RigidBody_ManualMomentOfInertia.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py @@ -26,7 +26,7 @@ class Tests(): # fmt: on -def C5340400_RigidBody_ManualMomentOfInertia(): +def RigidBody_MomentOfInertiaManualSetting(): """ Summary: Runs an automated test to ensure that assigning a high moment of inertia component causes the entity to exhibit @@ -83,7 +83,7 @@ def C5340400_RigidBody_ManualMomentOfInertia(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C5340400_RigidBody_ManualMomentOfInertia") + helper.open_level("Physics", "RigidBody_MomentOfInertiaManualSetting") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -156,4 +156,4 @@ def C5340400_RigidBody_ManualMomentOfInertia(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5340400_RigidBody_ManualMomentOfInertia) + Report.start_test(RigidBody_MomentOfInertiaManualSetting) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C14976307_Gravity_SetGravityWorks.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SetGravityWorks.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/general/C14976307_Gravity_SetGravityWorks.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SetGravityWorks.py index 335ef75649..837819bf5a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C14976307_Gravity_SetGravityWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SetGravityWorks.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C14976307_Gravity_SetGravityWorks(): +def RigidBody_SetGravityWorks(): """ Summary: @@ -73,7 +73,7 @@ def C14976307_Gravity_SetGravityWorks(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C14976307_Gravity_SetGravityWorks") + helper.open_level("Physics", "RigidBody_SetGravityWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -118,4 +118,4 @@ def C14976307_Gravity_SetGravityWorks(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14976307_Gravity_SetGravityWorks) + Report.start_test(RigidBody_SetGravityWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py index 655c33304d..e01f946a9b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976202_RigidBody_StopsWhenBelowKineticThreshold.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py @@ -58,7 +58,7 @@ class Tests: # fmt: on -def C4976202_RigidBody_StopsWhenBelowKineticThreshold(): +def RigidBody_SleepWhenBelowKineticThreshold(): """ Summary: A Pushing Cube and a Sphere are suspended over the PhysX Terrain. @@ -264,7 +264,7 @@ def C4976202_RigidBody_StopsWhenBelowKineticThreshold(): ) # 1) Open the level - helper.open_level("Physics", "C4976202_RigidBody_StopsWhenBelowKineticThreshold") + helper.open_level("Physics", "RigidBody_SleepWhenBelowKineticThreshold") def test_steps(sleep_threshold_value, trigger_pattern): TestData.threshold_count += 1 @@ -322,4 +322,4 @@ def C4976202_RigidBody_StopsWhenBelowKineticThreshold(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976202_RigidBody_StopsWhenBelowKineticThreshold) + Report.start_test(RigidBody_SleepWhenBelowKineticThreshold) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976204_Verify_Start_Asleep_Condition.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartAsleepWorks.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976204_Verify_Start_Asleep_Condition.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartAsleepWorks.py index ff3111aa55..21703ebe5a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976204_Verify_Start_Asleep_Condition.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartAsleepWorks.py @@ -24,7 +24,7 @@ class Tests(): # fmt: on -def C4976204_Verify_Start_Asleep_Condition(): +def RigidBody_StartAsleepWorks(): """ Summary: @@ -74,7 +74,7 @@ def C4976204_Verify_Start_Asleep_Condition(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C4976204_Verify_Start_Asleep_Condition") + helper.open_level("Physics", "RigidBody_StartAsleepWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -108,4 +108,4 @@ def C4976204_Verify_Start_Asleep_Condition(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976204_Verify_Start_Asleep_Condition) + Report.start_test(RigidBody_StartAsleepWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976206_RigidBodies_GravityEnabledActive.py b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976206_RigidBodies_GravityEnabledActive.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py index e6b50eb2bf..95b7a4dc04 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/rigid_body/C4976206_RigidBodies_GravityEnabledActive.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py @@ -7,7 +7,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT # Test case ID : C4976206 -# Test Case Title : VErify that when Gravity enables is checked, the object falls down due to gravity [sic] +# Test Case Title : Verify that when Gravity enables is checked, the object falls down due to gravity [sic] # fmt: off @@ -29,7 +29,7 @@ class Frames: delta_frames = 1 -def C4976206_RigidBodies_GravityEnabledActive(): +def RigidBody_StartGravityEnabledWorks(): """ Summary: Runs automated test to verify that when the gravity enabled checkbox is ticked, @@ -75,7 +75,7 @@ def C4976206_RigidBodies_GravityEnabledActive(): helper.init_idle() # 1) Open level and enter game mode - helper.open_level("Physics", "C4976206_RigidBodies_VerifyGravity") + helper.open_level("Physics", "RigidBody_StartGravityEnabledWorks") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve entities @@ -141,4 +141,4 @@ def C4976206_RigidBodies_GravityEnabledActive(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C4976206_RigidBodies_GravityEnabledActive) + Report.start_test(RigidBody_StartGravityEnabledWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712452_ScriptCanvas_CollisionEvents.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712452_ScriptCanvas_CollisionEvents.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py index 6806d5acc8..99785c2650 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712452_ScriptCanvas_CollisionEvents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py @@ -28,7 +28,7 @@ class Tests: # fmt: on -def C12712452_ScriptCanvas_CollisionEvents(): +def ScriptCanvas_CollisionEvents(): """ Summary: This script runs an automated test to verify that the Script Canvas nodes "On Collision Begin", "On Collision @@ -160,7 +160,7 @@ def C12712452_ScriptCanvas_CollisionEvents(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C12712452_ScriptCanvas_CollisionEvents") + helper.open_level("Physics", "ScriptCanvas_CollisionEvents") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve and validate entities @@ -197,4 +197,4 @@ def C12712452_ScriptCanvas_CollisionEvents(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12712452_ScriptCanvas_CollisionEvents) + Report.start_test(ScriptCanvas_CollisionEvents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C19536274_GetCollisionName_PrintsName.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/general/C19536274_GetCollisionName_PrintsName.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py index abf2045ed4..39b6eddd41 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C19536274_GetCollisionName_PrintsName.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py @@ -17,7 +17,7 @@ class Tests(): # fmt: on -def C19536274_GetCollisionName_PrintsName(): +def ScriptCanvas_GetCollisionNameReturnsName(): """ Summary: Loads a level that contains an entity with script canvas and PhysX Collider components @@ -65,4 +65,4 @@ def C19536274_GetCollisionName_PrintsName(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C19536274_GetCollisionName_PrintsName) + Report.start_test(ScriptCanvas_GetCollisionNameReturnsName) diff --git a/AutomatedTesting/Gem/PythonTests/physics/general/C19536277_GetCollisionName_PrintsNothing.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py similarity index 93% rename from AutomatedTesting/Gem/PythonTests/physics/general/C19536277_GetCollisionName_PrintsNothing.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py index a0d242542f..885d85c710 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/general/C19536277_GetCollisionName_PrintsNothing.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py @@ -17,7 +17,7 @@ class Tests(): # fmt: on -def C19536277_GetCollisionName_PrintsNothing(): +def ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer(): """ Summary: Loads a level that contains an entity with script canvas and PhysX Collider components @@ -65,4 +65,4 @@ def C19536277_GetCollisionName_PrintsNothing(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C19536277_GetCollisionName_PrintsNothing) + Report.start_test(ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py index edbbde4c94..f173ac0fa3 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712453_ScriptCanvas_MultipleRaycastNode.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py @@ -37,7 +37,7 @@ class Lines: unexpected = ["FAILURE"] -def C12712453_ScriptCanvas_MultipleRaycastNode(): +def ScriptCanvas_MultipleRaycastNode(): """ Summary: Uses script canvas to cast two types of rays in game mode (multiple raycast and single raycast). Script canvas @@ -169,7 +169,7 @@ def C12712453_ScriptCanvas_MultipleRaycastNode(): # 1) Open level helper.init_idle() - helper.open_level("Physics", "C12712453_ScriptCanvas_MultipleRaycastNode") + helper.open_level("Physics", "ScriptCanvas_MultipleRaycastNode") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve entities @@ -195,4 +195,4 @@ def C12712453_ScriptCanvas_MultipleRaycastNode(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12712453_ScriptCanvas_MultipleRaycastNode) + Report.start_test(ScriptCanvas_MultipleRaycastNode) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_OverlapNode.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_OverlapNode.py index 5829e5850c..b7f2f6da0c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712454_ScriptCanvas_OverlapNodeVerification.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_OverlapNode.py @@ -36,7 +36,7 @@ class Tests: # fmt: on -def C12712454_ScriptCanvas_OverlapNodeVerification(): +def ScriptCanvas_OverlapNode(): """ Summary: Verifies that the three script canvas overlap nodes (box, sphere, capsule) work as expected. Test script starts and verifies each case one by one. @@ -250,7 +250,7 @@ def C12712454_ScriptCanvas_OverlapNodeVerification(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C12712454_ScriptCanvas_OverlapNodeVerification") + helper.open_level("Physics", "ScriptCanvas_OverlapNode") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -316,4 +316,4 @@ def C12712454_ScriptCanvas_OverlapNodeVerification(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12712454_ScriptCanvas_OverlapNodeVerification) + Report.start_test(ScriptCanvas_OverlapNode) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py index 5cb0b1431e..85b1ccebf8 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902098_ScriptCanvas_PostPhysicsUpdate.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py @@ -33,7 +33,7 @@ class LogLines: unexpected_lines = ["OnPostPhysicsSubtick Event: The Sphere position did not change from previous position"] -def C14902098_ScriptCanvas_PostPhysicsUpdate(): +def ScriptCanvas_PostPhysicsUpdate(): """ Summary: @@ -85,7 +85,7 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C14902098_ScriptCanvas_PostPhysicsUpdate") + helper.open_level("Physics", "ScriptCanvas_PostPhysicsUpdate") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -106,4 +106,4 @@ def C14902098_ScriptCanvas_PostPhysicsUpdate(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14902098_ScriptCanvas_PostPhysicsUpdate) + Report.start_test(ScriptCanvas_PostPhysicsUpdate) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py index 2c833ba5f3..fdcae5cea4 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14195074_ScriptCanvas_PostUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py @@ -23,7 +23,7 @@ class Tests: # fmt: on -def C14195074_ScriptCanvas_PostUpdateEvent(): +def ScriptCanvas_PostUpdateEvent(): """ Summary: Verifies that Postsimulate Event node in Script Canvas works as expected. @@ -134,7 +134,7 @@ def C14195074_ScriptCanvas_PostUpdateEvent(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C14195074_ScriptCanvas_PostUpdateEvent") + helper.open_level("Physics", "ScriptCanvas_PostUpdateEvent") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -178,4 +178,4 @@ def C14195074_ScriptCanvas_PostUpdateEvent(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14195074_ScriptCanvas_PostUpdateEvent) + Report.start_test(ScriptCanvas_PostUpdateEvent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py index 4d48ce34a6..c2662e661b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14902097_ScriptCanvas_PreUpdateEvent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py @@ -23,7 +23,7 @@ class Tests: # fmt: on -def C14902097_ScriptCanvas_PreUpdateEvent(): +def ScriptCanvas_PreUpdateEvent(): """ Summary: Verifies that Presimulate node in Script Canvas works as expected. @@ -140,7 +140,7 @@ def C14902097_ScriptCanvas_PreUpdateEvent(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C14902097_ScriptCanvas_PreUpdateEvent") + helper.open_level("Physics", "ScriptCanvas_PreUpdateEvent") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -188,4 +188,4 @@ def C14902097_ScriptCanvas_PreUpdateEvent(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14902097_ScriptCanvas_PreUpdateEvent) + Report.start_test(ScriptCanvas_PreUpdateEvent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py similarity index 98% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py index 9e8331f369..3e1abd2712 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C14976308_ScriptCanvas_SetKinematicTargetTransform.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py @@ -31,7 +31,7 @@ class Tests: # fmt: on -def C14976308_ScriptCanvas_SetKinematicTargetTransform(): +def ScriptCanvas_SetKinematicTargetTransform(): """ Summary: This script runs an automated test to verify the results of two Script Canvas nodes acting on a kinematic rigid @@ -168,7 +168,7 @@ def C14976308_ScriptCanvas_SetKinematicTargetTransform(): # 1) Open level and enter game mode helper.init_idle() - helper.open_level("Physics", "C14976308_ScriptCanvas_SetKinematicTargetTransform") + helper.open_level("Physics", "ScriptCanvas_SetKinematicTargetTransform") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve and validate entities @@ -216,4 +216,4 @@ def C14976308_ScriptCanvas_SetKinematicTargetTransform(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C14976308_ScriptCanvas_SetKinematicTargetTransform) + Report.start_test(ScriptCanvas_SetKinematicTargetTransform) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_ShapeCast.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_ShapeCast.py index 8ce59d2b29..97d11664b5 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C12712455_ScriptCanvas_ShapeCastVerification.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_ShapeCast.py @@ -29,7 +29,7 @@ class Tests: # fmt: on -def C12712455_ScriptCanvas_ShapeCastVerification(): +def ScriptCanvas_ShapeCast(): """ Summary: Verifies that shape cast nodes in script editor function properly. @@ -105,7 +105,7 @@ def C12712455_ScriptCanvas_ShapeCastVerification(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("Physics", "C12712455_ScriptCanvas_ShapeCastVerification") + helper.open_level("Physics", "ScriptCanvas_ShapeCast") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -133,4 +133,4 @@ def C12712455_ScriptCanvas_ShapeCastVerification(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C12712455_ScriptCanvas_ShapeCastVerification) + Report.start_test(ScriptCanvas_ShapeCast) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6224408_ScriptCanvas_EntitySpawn.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6224408_ScriptCanvas_EntitySpawn.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py index 12e4a25b4d..5862b7586b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6224408_ScriptCanvas_EntitySpawn.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py @@ -22,7 +22,7 @@ class Tests: # fmt: on -def C6224408_ScriptCanvas_EntitySpawn(): +def ScriptCanvas_SpawnEntityWithPhysComponents(): """ Summary: A spawner is set to spawn a sphere with downward velocity after a set amount of time. This action is controlled @@ -106,7 +106,7 @@ def C6224408_ScriptCanvas_EntitySpawn(): # Main Script helper.init_idle() # 1) Open Level - helper.open_level("physics", "C6224408_ScriptCanvas_EntitySpawn") + helper.open_level("physics", "ScriptCanvas_SpawnEntityWithPhysComponents") # 2) Enter Game Mode helper.enter_game_mode(Tests.enter_game_mode) @@ -140,4 +140,4 @@ def C6224408_ScriptCanvas_EntitySpawn(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6224408_ScriptCanvas_EntitySpawn) + Report.start_test(ScriptCanvas_SpawnEntityWithPhysComponents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6274125_ScriptCanvas_TriggerEvents.py b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6274125_ScriptCanvas_TriggerEvents.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py index 5fc4261607..232b9ac8de 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/script_canvas/C6274125_ScriptCanvas_TriggerEvents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py @@ -33,7 +33,7 @@ class LogLines: ] -def C6274125_ScriptCanvas_TriggerEvents(): +def ScriptCanvas_TriggerEvents(): """ Summary: Verify ScriptCanvas Trigger Events. @@ -78,7 +78,7 @@ def C6274125_ScriptCanvas_TriggerEvents(): TIMEOUT = 2.5 # 1) Open level - helper.open_level("Physics", "C6274125_ScriptCanvas_TriggerEvents") + helper.open_level("Physics", "ScriptCanvas_TriggerEvents") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -124,4 +124,4 @@ def C6274125_ScriptCanvas_TriggerEvents(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6274125_ScriptCanvas_TriggerEvents) + Report.start_test(ScriptCanvas_TriggerEvents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C19578021_ShapeCollider_CanBeAdded.py b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C19578021_ShapeCollider_CanBeAdded.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py index 0ec9908f2d..8c581e105c 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C19578021_ShapeCollider_CanBeAdded.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py @@ -20,7 +20,7 @@ class Tests(): # fmt: on -def C19578021_ShapeCollider_CanBeAdded(): +def ShapeCollider_CanBeAddedWitNoWarnings(): """ Summary: Adding a PhysX Collider component when a PhysX Shape Collider and Box Shape components are already present @@ -89,4 +89,4 @@ def C19578021_ShapeCollider_CanBeAdded(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C19578021_ShapeCollider_CanBeAdded) + Report.start_test(ShapeCollider_CanBeAddedWitNoWarnings) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py index 9094ba68c6..a501688f8f 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py @@ -27,7 +27,7 @@ class Tests(): # fmt: on -def C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(): +def ShapeCollider_CylinderShapeCollides(): """ Summary: Runs a test to make sure that a PhysX Rigid Body and Cylinder Shape Collider can successfully collide with a PhysX Terrain entity. @@ -64,7 +64,7 @@ def C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(): # 1) Open level helper.init_idle() - helper.open_level("Physics", "C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain") + helper.open_level("Physics", "ShapeCollider_CylinderShapeCollides") # Create terrain entity terrain = EditorEntity.create_editor_entity_at([30.0, 30.0, 33.96], "Terrain") @@ -133,4 +133,4 @@ def C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C24308873_CylinderShapeCollider_CollidesWithPhysXTerrain) + Report.start_test(ShapeCollider_CylinderShapeCollides) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C19578018_ShapeColliderWithNoShapeComponent.py b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C19578018_ShapeColliderWithNoShapeComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py index 3da42eb40f..d057e83398 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C19578018_ShapeColliderWithNoShapeComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py @@ -19,7 +19,7 @@ class Tests(): # fmt: on -def C19578018_ShapeColliderWithNoShapeComponent(): +def ShapeCollider_InactiveWhenNoShapeComponent(): """ Summary: Create an Entity with PhysX Shape Collider component and verify that PhysX Shape Collider Component @@ -91,4 +91,4 @@ def C19578018_ShapeColliderWithNoShapeComponent(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C19578018_ShapeColliderWithNoShapeComponent) + Report.start_test(ShapeCollider_InactiveWhenNoShapeComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/collider/C19723164_ShapeColliders_WontCrashEditor.py b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/collider/C19723164_ShapeColliders_WontCrashEditor.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py index 7d277a734d..ba8b598987 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/collider/C19723164_ShapeColliders_WontCrashEditor.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py @@ -18,7 +18,7 @@ class Tests(): # fmt: on -def C19723164_ShapeColliders_WontCrashEditor(): +def ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor(): """ Summary: Create 512 entities with shape colliders and verify stability @@ -95,4 +95,4 @@ def C19723164_ShapeColliders_WontCrashEditor(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C19723164_ShapeColliders_WontCrashEditor) + Report.start_test(ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_AddPhysTerrainComponent.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_AddPhysTerrainComponent.py index 8e42f9f77c..c81e60de5b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689522_Physxterrain_AddPhysxterrainNoEditorCrash.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_AddPhysTerrainComponent.py @@ -22,7 +22,7 @@ class Tests(): # fmt: on -def C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(): +def Terrain_AddPhysTerrainComponent(): """ Summary: Runs an automated test by creating an entity with physx terrain and add another physx terrain and verify that @@ -74,7 +74,7 @@ def C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(): 'EditorTerrainComponent' in warningInfo.window for warningInfo in warning_tracer.warnings) # 1) Open level - helper.open_level("Physics", "C5689522_Physxterrain_AddPhysxterrainNoEditorCrash") + helper.open_level("Physics", "Terrain_AddPhysTerrainComponent") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -101,4 +101,4 @@ def C5689522_Physxterrain_AddPhysxterrainNoEditorCrash(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5689522_Physxterrain_AddPhysxterrainNoEditorCrash) + Report.start_test(Terrain_AddPhysTerrainComponent) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py index ba74716544..706244df31 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689524_MultipleTerrains_CheckWarningInConsole.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py @@ -21,7 +21,7 @@ class Tests(): # fmt: on -def C5689524_MultipleTerrains_CheckWarningInConsole(): +def Terrain_CanAddMultipleTerrainComponents(): """ Summary: Runs an automated test by creating multiple entities each with one or more terrain components and verify that you are @@ -76,7 +76,7 @@ def C5689524_MultipleTerrains_CheckWarningInConsole(): 'EditorTerrainComponent' in warningInfo.window for warningInfo in warning_tracer.warnings) # 1) Open level - helper.open_level("Physics", "C5689524_MultipleTerrains_CheckWarningInConsole") + helper.open_level("Physics", "Terrain_CanAddMultipleTerrainComponents") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -102,4 +102,4 @@ def C5689524_MultipleTerrains_CheckWarningInConsole(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5689524_MultipleTerrains_CheckWarningInConsole) + Report.start_test(Terrain_CanAddMultipleTerrainComponents) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py index a10cc72ed2..dac222b599 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689518_PhysXTerrain_CollidesWithPhysXTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py @@ -24,7 +24,7 @@ class Tests(): # fmt: on -def C5689518_PhysXTerrain_CollidesWithPhysXTerrain(): +def Terrain_CollisionAgainstRigidBody(): """ Summary: Runs a test to make sure that a PhysX Rigid Body and Collider can successfully collide with a PhysX Terrain entity. @@ -57,7 +57,7 @@ def C5689518_PhysXTerrain_CollidesWithPhysXTerrain(): # 1) Open level / Enter game mode helper.init_idle() - helper.open_level("Physics", "C5689518_PhysXEntity_collides_with_PhysXTerrain") + helper.open_level("Physics", "Terrain_CollisionAgainstRigidBody") helper.enter_game_mode(Tests.enter_game_mode) # 2) Retrieve entities and positions @@ -109,4 +109,4 @@ def C5689518_PhysXTerrain_CollidesWithPhysXTerrain(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5689518_PhysXTerrain_CollidesWithPhysXTerrain) + Report.start_test(Terrain_CollisionAgainstRigidBody) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C6032082_Terrain_MultipleResolutionsValid.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleResolutionsValid.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C6032082_Terrain_MultipleResolutionsValid.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleResolutionsValid.py index 66615e1937..8a30d5443b 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C6032082_Terrain_MultipleResolutionsValid.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleResolutionsValid.py @@ -39,7 +39,7 @@ class Tests(): # fmt: on -def C6032082_Terrain_MultipleResolutionsValid(): +def Terrain_MultipleResolutionsValid(): """ Summary: @@ -109,7 +109,7 @@ def C6032082_Terrain_MultipleResolutionsValid(): self.test_exit_game_mode = exit_game_test level_128 = Level( - "C6032082_Terrain_MultipleResolutionsValid_128x128_1m", + "Terrain_MultipleResolutionsValid_128x128_1m", Tests.enter_game_mode_128x128_1m, Tests.find_entities_128x128_1m, Tests.ball_on_terrain_collision_128x128_1m, @@ -117,7 +117,7 @@ def C6032082_Terrain_MultipleResolutionsValid(): Tests.exit_game_mode_128x128_1m, ) level_512 = Level( - "C6032082_Terrain_MultipleResolutionsValid_512x512_2m", + "Terrain_MultipleResolutionsValid_512x512_2m", Tests.enter_game_mode_512x512_2m, Tests.find_entities_512x512_2m, Tests.ball_on_terrain_collision_512x512_2m, @@ -125,7 +125,7 @@ def C6032082_Terrain_MultipleResolutionsValid(): Tests.exit_game_mode_512x512_2m, ) level_1024 = Level( - "C6032082_Terrain_MultipleResolutionsValid_1024x1024_32m", + "Terrain_MultipleResolutionsValid_1024x1024_32m", Tests.enter_game_mode_1024x1024_32m, Tests.find_entities_1024x1024_32m, Tests.ball_on_terrain_collision_1024x1024_32m, @@ -133,7 +133,7 @@ def C6032082_Terrain_MultipleResolutionsValid(): Tests.exit_game_mode_1024x1024_32m, ) level_4096 = Level( - "C6032082_Terrain_MultipleResolutionsValid_4096x4096_16m", + "Terrain_MultipleResolutionsValid_4096x4096_16m", Tests.enter_game_mode_4096x4096_16m, Tests.find_entities_4096x4096_16m, Tests.ball_on_terrain_collision_4096x4096_16m, @@ -205,4 +205,4 @@ def C6032082_Terrain_MultipleResolutionsValid(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C6032082_Terrain_MultipleResolutionsValid) + Report.start_test(Terrain_MultipleResolutionsValid) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689528_Terrain_MultipleTerrainComponents.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py similarity index 94% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C5689528_Terrain_MultipleTerrainComponents.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py index fb1fd01724..c62a8e670a 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689528_Terrain_MultipleTerrainComponents.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py @@ -21,7 +21,7 @@ class Tests(): # fmt: on -def C5689528_Terrain_MultipleTerrainComponents(): +def Terrain_MultipleTerrainComponentsWarning(): """ Summary: @@ -74,7 +74,7 @@ def C5689528_Terrain_MultipleTerrainComponents(): 'EditorTerrainComponent' in warningInfo.window for warningInfo in warning_tracer.warnings) # 1) Open level - helper.open_level("Physics", "C5689528_Terrain_MultipleTerrainComponents") + helper.open_level("Physics", "Terrain_MultipleTerrainComponentsWarning") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -99,4 +99,4 @@ def C5689528_Terrain_MultipleTerrainComponents(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5689528_Terrain_MultipleTerrainComponents) + Report.start_test(Terrain_MultipleTerrainComponentsWarning) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C3510642_Terrain_NotCollideWithTerrain.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py similarity index 97% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C3510642_Terrain_NotCollideWithTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py index 09522da31a..f006cf6587 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C3510642_Terrain_NotCollideWithTerrain.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py @@ -26,7 +26,7 @@ class Tests(): # fmt: on -def C3510642_Terrain_NotCollideWithTerrain(): +def Terrain_NoPhysTerrainComponentNoCollision(): """ Summary: Runs an automated test to ensure that when no PhysX Terrain component is added, @@ -78,7 +78,7 @@ def C3510642_Terrain_NotCollideWithTerrain(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C3510642_Terrain_NotCollideWithTerrain") + helper.open_level("Physics", "Terrain_NoPhysTerrainComponentNoCollision") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -164,4 +164,4 @@ def C3510642_Terrain_NotCollideWithTerrain(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C3510642_Terrain_NotCollideWithTerrain) + Report.start_test(Terrain_NoPhysTerrainComponentNoCollision) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689531_Warning_TerrainSliceTerrainComponent.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py similarity index 95% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C5689531_Warning_TerrainSliceTerrainComponent.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py index 68ddaba5ed..cb37e8be76 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C5689531_Warning_TerrainSliceTerrainComponent.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py @@ -23,7 +23,7 @@ class Tests: # fmt: on -def C5689531_Warning_TerrainSliceTerrainComponent(): +def Terrain_SpawnSecondTerrainComponentWarning(): """ Summary: @@ -82,7 +82,7 @@ def C5689531_Warning_TerrainSliceTerrainComponent(): 'TerrainComponent' in warningInfo.window for warningInfo in warning_tracer.warnings) # 1) Open level - helper.open_level("Physics", "C5689531_Warning_TerrainSliceTerrainComponent") + helper.open_level("Physics", "Terrain_SpawnSecondTerrainComponentWarning") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -111,4 +111,4 @@ def C5689531_Warning_TerrainSliceTerrainComponent(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C5689531_Warning_TerrainSliceTerrainComponent) + Report.start_test(Terrain_SpawnSecondTerrainComponentWarning) diff --git a/AutomatedTesting/Gem/PythonTests/physics/terrain/C13508019_Terrain_TerrainTexturePainterWorks.py b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py similarity index 96% rename from AutomatedTesting/Gem/PythonTests/physics/terrain/C13508019_Terrain_TerrainTexturePainterWorks.py rename to AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py index 9822b933d1..150be66bcc 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/terrain/C13508019_Terrain_TerrainTexturePainterWorks.py +++ b/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py @@ -23,7 +23,7 @@ class Tests: # fmt: on -def C13508019_Terrain_TerrainTexturePainterWorks(): +def Terrain_TerrainTexturePainterWorks(): # run() will open a a level and validate terrain material are updated after using terrain texture painter # It does this by: # 1) Opens level with a terrain that has been painted by two different physical materials with a box above each @@ -59,7 +59,7 @@ def C13508019_Terrain_TerrainTexturePainterWorks(): helper.init_idle() # 1) Open level - helper.open_level("Physics", "C13508019_Terrain_TerrainTexturePainterWorks") + helper.open_level("Physics", "Terrain_TerrainTexturePainterWorks") # 2) Enter game mode helper.enter_game_mode(Tests.enter_game_mode) @@ -136,4 +136,4 @@ def C13508019_Terrain_TerrainTexturePainterWorks(): if __name__ == "__main__": from editor_python_test_tools.utils import Report - Report.start_test(C13508019_Terrain_TerrainTexturePainterWorks) + Report.start_test(Terrain_TerrainTexturePainterWorks) diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py b/AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py index 89b7559dd1..22a41de4ea 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py +++ b/AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py @@ -270,7 +270,7 @@ class FileManagement: file_list = FileManagement._find_files(file_names, root_path, search_subdirs) except RuntimeWarning as w: assert False, ( - w.message + w.args[0] + " Please check use of search_subdirs; make sure you are using the correct parent directory." ) @@ -331,7 +331,7 @@ class FileManagement: file_list = FileManagement._find_files([target_file, src_file], root_path, search_subdirs) except RuntimeWarning as w: assert False, ( - w.message + w.args[0] + " Please check use of search_subdirs; make sure you are using the correct parent directory." ) diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly new file mode 100644 index 0000000000..fc576ec459 --- /dev/null +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e04b536d187793187b64a55914d92c1a1c18393a0369715269a295c7b7a7d370 +size 8883 diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly index 5088b67628..2f7291cb27 100644 --- a/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_ShapeCast/ScriptCanvas_ShapeCast.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6df3d83f5b9dd43118aba5cef3a8fe9ee42ee253f7bd3886fc7c88f41c504fff -size 8802 +oid sha256:3361ba7aa2faa53421d8a92ed0bb2e1747e766d93c0315484a3c85b74a6494c3 +size 8820 From 0fb9bc160edf8f2e05b13f6889f95b404e7d07bd Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 22:04:31 +0200 Subject: [PATCH 150/355] Fixed console text color in batch mode --- Code/Editor/Controls/ConsoleSCB.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Code/Editor/Controls/ConsoleSCB.cpp b/Code/Editor/Controls/ConsoleSCB.cpp index 6b12348880..4997fa4bec 100644 --- a/Code/Editor/Controls/ConsoleSCB.cpp +++ b/Code/Editor/Controls/ConsoleSCB.cpp @@ -421,9 +421,6 @@ void CConsoleSCB::RefreshStyle() m_colorTable[6] = QColor(0xff, 0xaa, 0x22); // Warning (Yellow) } - m_colorTable[0] = textColor; - m_colorTable[1] = textColor; - const bool uiAndDark = !GetIEditor()->IsInConsolewMode() && CConsoleSCB::GetCreatedInstance() && m_backgroundTheme == AzToolsFramework::ConsoleColorTheme::Dark; QColor bgColor; @@ -435,8 +432,13 @@ void CConsoleSCB::RefreshStyle() else { bgColor = Qt::white; + textColor = Qt::black; AzQtComponents::ScrollBar::applyDarkStyle(ui->textEdit); } + + m_colorTable[0] = textColor; + m_colorTable[1] = textColor; + ui->textEdit->setBackgroundVisible(!uiAndDark); ui->textEdit->setStyleSheet(uiAndDark ? QString() : QString("QPlainTextEdit{ background: %1 }").arg(bgColor.name(QColor::HexRgb))); From 96c124b950c24af0848740485e77ad613ead5640 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 22:06:24 +0200 Subject: [PATCH 151/355] Reorg setreg files for physx tests --- ...ntrollerMaterialAssignment.setreg_override | 115 ------------------ ...RestitutionCombinePriority.setreg_override | 115 ------------------ ..._PerfaceMaterialValidation.setreg_override | 115 ------------------ .../Registry/editorpreferences.setreg | 2 +- ...lider_AddingNewGroupWorks.setreg_override} | 0 ...r_CollisionGroupsWorkflow.setreg_override} | 0 ...CollidingLayersNotCollide.setreg_override} | 0 ...nGroupSameLayerNotCollide.setreg_override} | 0 ...oupSameCustomLayerCollide.setreg_override} | 0 ...erial_CharacterController.setreg_override} | 4 +- ...ultLibraryUpdatedAcrossLevels_after.setreg | 115 ++++++++++++++++++ ...ltLibraryUpdatedAcrossLevels_before.setreg | 115 ++++++++++++++++++ .../Material_DynamicFriction.setreg_override} | 4 +- .../Material_FrictionCombine.setreg_override} | 4 +- ...ctionCombinePriorityOrder.setreg_override} | 4 +- ...aterialGetsCorrectMaterial.setreg_override | 115 ++++++++++++++++++ .../Material_Restitution.setreg_override | 115 ++++++++++++++++++ ...aterial_RestitutionCombine.setreg_override | 115 ++++++++++++++++++ ...utionCombinePriorityOrder.setreg_override} | 4 +- ...iptCanvas_PostUpdateEvent.setreg_override} | 0 ...riptCanvas_PreUpdateEvent.setreg_override} | 0 21 files changed, 586 insertions(+), 356 deletions(-) delete mode 100644 AutomatedTesting/Registry/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.setreg_override delete mode 100644 AutomatedTesting/Registry/C18981526_Material_RestitutionCombinePriority.setreg_override delete mode 100644 AutomatedTesting/Registry/C4044697_Material_PerfaceMaterialValidation.setreg_override rename AutomatedTesting/Registry/{C4976227_Collider_NewGroup.setreg_override => physx_overrides/Collider_AddingNewGroupWorks.setreg_override} (100%) rename AutomatedTesting/Registry/{C3510644_Collider_CollisionGroups.setreg_override => physx_overrides/Collider_CollisionGroupsWorkflow.setreg_override} (100%) rename AutomatedTesting/Registry/{C4976244_Collider_SameGroupSameLayerCollision.setreg_override => physx_overrides/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.setreg_override} (100%) rename AutomatedTesting/Registry/{C4976245_PhysXCollider_CollisionLayerTest.setreg_override => physx_overrides/Collider_NoneCollisionGroupSameLayerNotCollide.setreg_override} (100%) rename AutomatedTesting/Registry/{C4982593_PhysXCollider_CollisionLayer.setreg_override => physx_overrides/Collider_SameCollisionGroupSameCustomLayerCollide.setreg_override} (100%) rename AutomatedTesting/Registry/{C4044461_Material_Restitution.setreg_override => physx_overrides/Material_CharacterController.setreg_override} (95%) create mode 100644 AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_after.setreg create mode 100644 AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_before.setreg rename AutomatedTesting/Registry/{C4044459_Material_DynamicFriction.setreg_override => physx_overrides/Material_DynamicFriction.setreg_override} (95%) rename AutomatedTesting/Registry/{C4044456_Material_FrictionCombine.setreg_override => physx_overrides/Material_FrictionCombine.setreg_override} (95%) rename AutomatedTesting/Registry/{C4044457_Material_RestitutionCombine.setreg_override => physx_overrides/Material_FrictionCombinePriorityOrder.setreg_override} (95%) create mode 100644 AutomatedTesting/Registry/physx_overrides/Material_PerFaceMaterialGetsCorrectMaterial.setreg_override create mode 100644 AutomatedTesting/Registry/physx_overrides/Material_Restitution.setreg_override create mode 100644 AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombine.setreg_override rename AutomatedTesting/Registry/{C18977601_Material_FrictionCombinePriority.setreg_override => physx_overrides/Material_RestitutionCombinePriorityOrder.setreg_override} (95%) rename AutomatedTesting/Registry/{C14195074_ScriptCanvas_PostUpdateEvent.setreg_override => physx_overrides/ScriptCanvas_PostUpdateEvent.setreg_override} (100%) rename AutomatedTesting/Registry/{C14902097_ScriptCanvas_PreUpdateEvent.setreg_override => physx_overrides/ScriptCanvas_PreUpdateEvent.setreg_override} (100%) diff --git a/AutomatedTesting/Registry/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.setreg_override b/AutomatedTesting/Registry/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.setreg_override deleted file mode 100644 index aa82265c98..0000000000 --- a/AutomatedTesting/Registry/C15556261_PhysXMaterials_CharacterControllerMaterialAssignment.setreg_override +++ /dev/null @@ -1,115 +0,0 @@ -{ - "Amazon": { - "Gems": { - "PhysX": { - "PhysXSystemConfiguration": { - "CollisionConfig": { - "Layers": { - "LayerNames": [ - "Default", - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {} - ] - }, - "Groups": { - "GroupPresets": [ - { - "Name": "All", - "ReadOnly": true - }, - { - "Id": { - "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" - }, - "Name": "None", - "Group": { - "Mask": 0 - }, - "ReadOnly": true - }, - { - "Id": { - "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" - }, - "Name": "All_NoTouchBend", - "Group": { - "Mask": 9223372036854775807 - }, - "ReadOnly": true - } - ] - } - }, - "MaterialLibrary": { - "assetId": { - "guid": "{70D4A444-AFD4-57C4-9885-63F25AC3C281}" - }, - "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c15556261_physxmaterials_charactercontrollermaterialassignment/library.physmaterial" - } - } - } - } - } -} \ No newline at end of file diff --git a/AutomatedTesting/Registry/C18981526_Material_RestitutionCombinePriority.setreg_override b/AutomatedTesting/Registry/C18981526_Material_RestitutionCombinePriority.setreg_override deleted file mode 100644 index c78018bdbb..0000000000 --- a/AutomatedTesting/Registry/C18981526_Material_RestitutionCombinePriority.setreg_override +++ /dev/null @@ -1,115 +0,0 @@ -{ - "Amazon": { - "Gems": { - "PhysX": { - "PhysXSystemConfiguration": { - "CollisionConfig": { - "Layers": { - "LayerNames": [ - "Default", - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {} - ] - }, - "Groups": { - "GroupPresets": [ - { - "Name": "All", - "ReadOnly": true - }, - { - "Id": { - "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" - }, - "Name": "None", - "Group": { - "Mask": 0 - }, - "ReadOnly": true - }, - { - "Id": { - "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" - }, - "Name": "All_NoTouchBend", - "Group": { - "Mask": 9223372036854775807 - }, - "ReadOnly": true - } - ] - } - }, - "MaterialLibrary": { - "assetId": { - "guid": "{AED48B18-0F3F-5E59-A8FF-30DB134B307B}" - }, - "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c18981526_material_restitutioncombinepriority/restitution_combine.physmaterial" - } - } - } - } - } -} \ No newline at end of file diff --git a/AutomatedTesting/Registry/C4044697_Material_PerfaceMaterialValidation.setreg_override b/AutomatedTesting/Registry/C4044697_Material_PerfaceMaterialValidation.setreg_override deleted file mode 100644 index 5a93ae2314..0000000000 --- a/AutomatedTesting/Registry/C4044697_Material_PerfaceMaterialValidation.setreg_override +++ /dev/null @@ -1,115 +0,0 @@ -{ - "Amazon": { - "Gems": { - "PhysX": { - "PhysXSystemConfiguration": { - "CollisionConfig": { - "Layers": { - "LayerNames": [ - "Default", - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {}, - {} - ] - }, - "Groups": { - "GroupPresets": [ - { - "Name": "All", - "ReadOnly": true - }, - { - "Id": { - "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" - }, - "Name": "None", - "Group": { - "Mask": 0 - }, - "ReadOnly": true - }, - { - "Id": { - "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" - }, - "Name": "All_NoTouchBend", - "Group": { - "Mask": 9223372036854775807 - }, - "ReadOnly": true - } - ] - } - }, - "MaterialLibrary": { - "assetId": { - "guid": "{2E85B457-ED19-5FE3-90B4-6EFFB4D0E682}" - }, - "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c4044697_material_perfacematerialvalidation/test_library.physmaterial" - } - } - } - } - } -} \ No newline at end of file diff --git a/AutomatedTesting/Registry/editorpreferences.setreg b/AutomatedTesting/Registry/editorpreferences.setreg index b338d6acad..e76e04f9ba 100644 --- a/AutomatedTesting/Registry/editorpreferences.setreg +++ b/AutomatedTesting/Registry/editorpreferences.setreg @@ -1,7 +1,7 @@ { "Amazon": { "Preferences": { - "EnablePrefabSystem": false + "EnablePrefabSystem": true } } } \ No newline at end of file diff --git a/AutomatedTesting/Registry/C4976227_Collider_NewGroup.setreg_override b/AutomatedTesting/Registry/physx_overrides/Collider_AddingNewGroupWorks.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C4976227_Collider_NewGroup.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Collider_AddingNewGroupWorks.setreg_override diff --git a/AutomatedTesting/Registry/C3510644_Collider_CollisionGroups.setreg_override b/AutomatedTesting/Registry/physx_overrides/Collider_CollisionGroupsWorkflow.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C3510644_Collider_CollisionGroups.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Collider_CollisionGroupsWorkflow.setreg_override diff --git a/AutomatedTesting/Registry/C4976244_Collider_SameGroupSameLayerCollision.setreg_override b/AutomatedTesting/Registry/physx_overrides/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C4976244_Collider_SameGroupSameLayerCollision.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.setreg_override diff --git a/AutomatedTesting/Registry/C4976245_PhysXCollider_CollisionLayerTest.setreg_override b/AutomatedTesting/Registry/physx_overrides/Collider_NoneCollisionGroupSameLayerNotCollide.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C4976245_PhysXCollider_CollisionLayerTest.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Collider_NoneCollisionGroupSameLayerNotCollide.setreg_override diff --git a/AutomatedTesting/Registry/C4982593_PhysXCollider_CollisionLayer.setreg_override b/AutomatedTesting/Registry/physx_overrides/Collider_SameCollisionGroupSameCustomLayerCollide.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C4982593_PhysXCollider_CollisionLayer.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Collider_SameCollisionGroupSameCustomLayerCollide.setreg_override diff --git a/AutomatedTesting/Registry/C4044461_Material_Restitution.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_CharacterController.setreg_override similarity index 95% rename from AutomatedTesting/Registry/C4044461_Material_Restitution.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Material_CharacterController.setreg_override index b70e0f1326..e250c2a8ec 100644 --- a/AutomatedTesting/Registry/C4044461_Material_Restitution.setreg_override +++ b/AutomatedTesting/Registry/physx_overrides/Material_CharacterController.setreg_override @@ -103,10 +103,10 @@ }, "MaterialLibrary": { "assetId": { - "guid": "{E4117B5B-8D9A-5C1D-BA1E-C36542A6588D}" + "guid": "{96A9180B-06C8-5AC2-836D-FFF518B5976A}" }, "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c4044461_material_restitution/restitution.physmaterial" + "assetHint": "levels/physics/material_charactercontroller/library.physmaterial" } } } diff --git a/AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_after.setreg b/AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_after.setreg new file mode 100644 index 0000000000..8d694c80d2 --- /dev/null +++ b/AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_after.setreg @@ -0,0 +1,115 @@ +{ + "Amazon": { + "Gems": { + "PhysX": { + "PhysXSystemConfiguration": { + "CollisionConfig": { + "Layers": { + "LayerNames": [ + "Default", + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + "TouchBend" + ] + }, + "Groups": { + "GroupPresets": [ + { + "Name": "All", + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" + }, + "Name": "None", + "Group": { + "Mask": 0 + }, + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" + }, + "Name": "All_NoTouchBend", + "Group": { + "Mask": 9223372036854775807 + }, + "ReadOnly": true + } + ] + } + }, + "MaterialLibrary": { + "assetId": { + "guid": "{966C6F3D-A27F-5591-B84E-939D11DDEAC9}" + }, + "loadBehavior": "QueueLoad", + "assetHint": "levels/physics/material_defaultlibraryupdatedacrosslevels/after.physmaterial" + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_before.setreg b/AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_before.setreg new file mode 100644 index 0000000000..ca45f7128a --- /dev/null +++ b/AutomatedTesting/Registry/physx_overrides/Material_DefaultLibraryUpdatedAcrossLevels_before.setreg @@ -0,0 +1,115 @@ +{ + "Amazon": { + "Gems": { + "PhysX": { + "PhysXSystemConfiguration": { + "CollisionConfig": { + "Layers": { + "LayerNames": [ + "Default", + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + "TouchBend" + ] + }, + "Groups": { + "GroupPresets": [ + { + "Name": "All", + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" + }, + "Name": "None", + "Group": { + "Mask": 0 + }, + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" + }, + "Name": "All_NoTouchBend", + "Group": { + "Mask": 9223372036854775807 + }, + "ReadOnly": true + } + ] + } + }, + "MaterialLibrary": { + "assetId": { + "guid": "{3E410671-6D31-51C6-951F-321EE45B8D5C}" + }, + "loadBehavior": "QueueLoad", + "assetHint": "levels/physics/material_defaultlibraryupdatedacrosslevels/before.physmaterial" + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Registry/C4044459_Material_DynamicFriction.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_DynamicFriction.setreg_override similarity index 95% rename from AutomatedTesting/Registry/C4044459_Material_DynamicFriction.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Material_DynamicFriction.setreg_override index 5deb5635d1..9b5c8d635d 100644 --- a/AutomatedTesting/Registry/C4044459_Material_DynamicFriction.setreg_override +++ b/AutomatedTesting/Registry/physx_overrides/Material_DynamicFriction.setreg_override @@ -103,10 +103,10 @@ }, "MaterialLibrary": { "assetId": { - "guid": "{6AA79EE4-7EC3-5717-87AE-EDD7D886FD7F}" + "guid": "{7A6CD646-26CA-5A70-AECC-4D55CA4581FE}" }, "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c4044459_material_dynamicfriction/dynamic_friction.physmaterial" + "assetHint": "levels/physics/material_dynamicfriction/dynamic_friction.physmaterial" } } } diff --git a/AutomatedTesting/Registry/C4044456_Material_FrictionCombine.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_FrictionCombine.setreg_override similarity index 95% rename from AutomatedTesting/Registry/C4044456_Material_FrictionCombine.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Material_FrictionCombine.setreg_override index 806d71a158..37c67cb5ec 100644 --- a/AutomatedTesting/Registry/C4044456_Material_FrictionCombine.setreg_override +++ b/AutomatedTesting/Registry/physx_overrides/Material_FrictionCombine.setreg_override @@ -103,10 +103,10 @@ }, "MaterialLibrary": { "assetId": { - "guid": "{8D2C4A29-E0FC-564F-82C9-24BBA30C5A90}" + "guid": "{C61EAD16-634F-5665-B9A8-37F909E7E63B}" }, "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c4044456_material_frictioncombine/friction_combine.physmaterial" + "assetHint": "levels/physics/material_frictioncombine/friction_combine.physmaterial" } } } diff --git a/AutomatedTesting/Registry/C4044457_Material_RestitutionCombine.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_FrictionCombinePriorityOrder.setreg_override similarity index 95% rename from AutomatedTesting/Registry/C4044457_Material_RestitutionCombine.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Material_FrictionCombinePriorityOrder.setreg_override index fa77daac9f..646e87bbe0 100644 --- a/AutomatedTesting/Registry/C4044457_Material_RestitutionCombine.setreg_override +++ b/AutomatedTesting/Registry/physx_overrides/Material_FrictionCombinePriorityOrder.setreg_override @@ -103,10 +103,10 @@ }, "MaterialLibrary": { "assetId": { - "guid": "{D5D6A6DE-E636-5638-B30D-6CE2FDC321F8}" + "guid": "{FBC1EFDC-2A29-5542-92BB-0389FDE72DBD}" }, "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c4044457_material_restitutioncombine/restitution_combine.physmaterial" + "assetHint": "levels/physics/material_frictioncombinepriorityorder/friction_combine.physmaterial" } } } diff --git a/AutomatedTesting/Registry/physx_overrides/Material_PerFaceMaterialGetsCorrectMaterial.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_PerFaceMaterialGetsCorrectMaterial.setreg_override new file mode 100644 index 0000000000..4fcd3899f4 --- /dev/null +++ b/AutomatedTesting/Registry/physx_overrides/Material_PerFaceMaterialGetsCorrectMaterial.setreg_override @@ -0,0 +1,115 @@ +{ + "Amazon": { + "Gems": { + "PhysX": { + "PhysXSystemConfiguration": { + "CollisionConfig": { + "Layers": { + "LayerNames": [ + "Default", + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] + }, + "Groups": { + "GroupPresets": [ + { + "Name": "All", + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" + }, + "Name": "None", + "Group": { + "Mask": 0 + }, + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" + }, + "Name": "All_NoTouchBend", + "Group": { + "Mask": 9223372036854775807 + }, + "ReadOnly": true + } + ] + } + }, + "MaterialLibrary": { + "assetId": { + "guid": "{6FA8A773-22B5-50FB-BE16-F93936E06A9A}" + }, + "loadBehavior": "QueueLoad", + "assetHint": "levels/physics/material_perfacematerialgetscorrectmaterial/test_library.physmaterial" + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Registry/physx_overrides/Material_Restitution.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_Restitution.setreg_override new file mode 100644 index 0000000000..e868d98949 --- /dev/null +++ b/AutomatedTesting/Registry/physx_overrides/Material_Restitution.setreg_override @@ -0,0 +1,115 @@ +{ + "Amazon": { + "Gems": { + "PhysX": { + "PhysXSystemConfiguration": { + "CollisionConfig": { + "Layers": { + "LayerNames": [ + "Default", + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] + }, + "Groups": { + "GroupPresets": [ + { + "Name": "All", + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" + }, + "Name": "None", + "Group": { + "Mask": 0 + }, + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" + }, + "Name": "All_NoTouchBend", + "Group": { + "Mask": 9223372036854775807 + }, + "ReadOnly": true + } + ] + } + }, + "MaterialLibrary": { + "assetId": { + "guid": "{BFE18468-C28C-5FC1-B503-8D36F966A392}" + }, + "loadBehavior": "QueueLoad", + "assetHint": "levels/physics/material_restitution/restitution.physmaterial" + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombine.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombine.setreg_override new file mode 100644 index 0000000000..23e6e9446b --- /dev/null +++ b/AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombine.setreg_override @@ -0,0 +1,115 @@ +{ + "Amazon": { + "Gems": { + "PhysX": { + "PhysXSystemConfiguration": { + "CollisionConfig": { + "Layers": { + "LayerNames": [ + "Default", + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] + }, + "Groups": { + "GroupPresets": [ + { + "Name": "All", + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{CDB6B8D8-5CD0-40A8-874D-839B00A92EBB}" + }, + "Name": "None", + "Group": { + "Mask": 0 + }, + "ReadOnly": true + }, + { + "Id": { + "GroupId": "{22769429-5D46-429B-829A-0115239D9AAA}" + }, + "Name": "All_NoTouchBend", + "Group": { + "Mask": 9223372036854775807 + }, + "ReadOnly": true + } + ] + } + }, + "MaterialLibrary": { + "assetId": { + "guid": "{2A29B7DB-A736-537D-B9B2-56EF32CA4647}" + }, + "loadBehavior": "QueueLoad", + "assetHint": "levels/physics/material_restitutioncombine/restitution_combine.physmaterial" + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/Registry/C18977601_Material_FrictionCombinePriority.setreg_override b/AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombinePriorityOrder.setreg_override similarity index 95% rename from AutomatedTesting/Registry/C18977601_Material_FrictionCombinePriority.setreg_override rename to AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombinePriorityOrder.setreg_override index 7050a57206..3dc0ca972e 100644 --- a/AutomatedTesting/Registry/C18977601_Material_FrictionCombinePriority.setreg_override +++ b/AutomatedTesting/Registry/physx_overrides/Material_RestitutionCombinePriorityOrder.setreg_override @@ -103,10 +103,10 @@ }, "MaterialLibrary": { "assetId": { - "guid": "{B8749DAB-15DA-5A61-B565-C853673604CD}" + "guid": "{E973B6F4-DC8B-5CB2-B0F5-D856FE28D882}" }, "loadBehavior": "QueueLoad", - "assetHint": "levels/physics/c18977601_material_frictioncombinepriority/friction_combine.physmaterial" + "assetHint": "levels/physics/material_restitutioncombinepriorityorder/restitution_combine.physmaterial" } } } diff --git a/AutomatedTesting/Registry/C14195074_ScriptCanvas_PostUpdateEvent.setreg_override b/AutomatedTesting/Registry/physx_overrides/ScriptCanvas_PostUpdateEvent.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C14195074_ScriptCanvas_PostUpdateEvent.setreg_override rename to AutomatedTesting/Registry/physx_overrides/ScriptCanvas_PostUpdateEvent.setreg_override diff --git a/AutomatedTesting/Registry/C14902097_ScriptCanvas_PreUpdateEvent.setreg_override b/AutomatedTesting/Registry/physx_overrides/ScriptCanvas_PreUpdateEvent.setreg_override similarity index 100% rename from AutomatedTesting/Registry/C14902097_ScriptCanvas_PreUpdateEvent.setreg_override rename to AutomatedTesting/Registry/physx_overrides/ScriptCanvas_PreUpdateEvent.setreg_override From 302346264499235fe3c2691a2e55d5b339674304 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 22:06:52 +0200 Subject: [PATCH 152/355] Reorg script canvas files for px tests --- ...tCanvas_ShapeCastVerification.scriptcanvas | 2877 ----------------- .../ScriptCanvas_CollisionEvents.scriptcanvas | 913 ++++++ ...criptCanvas_GetCollisionName.scriptcanvas} | 2 +- ... => ScriptCanvas_OverlapNode.scriptcanvas} | 0 ...ScriptCanvas_PostUpdateEvent.scriptcanvas} | 2 +- ... ScriptCanvas_PreUpdateEvent.scriptcanvas} | 2 +- .../ScriptCanvas_ShapeCast.scriptcanvas | 1692 ++++++++++ ...pawnEntityWithPhysComponents.scriptcanvas} | 2 +- 8 files changed, 2609 insertions(+), 2881 deletions(-) delete mode 100644 AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas create mode 100644 AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas rename AutomatedTesting/ScriptCanvas/{C19536274_NameNode_Prints.scriptcanvas => ScriptCanvas_GetCollisionName.scriptcanvas} (99%) rename AutomatedTesting/ScriptCanvas/{C12712454_ScriptCanvas_OverlapNodeVerification.scriptcanvas => ScriptCanvas_OverlapNode.scriptcanvas} (100%) rename AutomatedTesting/ScriptCanvas/{C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas => ScriptCanvas_PostUpdateEvent.scriptcanvas} (99%) rename AutomatedTesting/ScriptCanvas/{C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas => ScriptCanvas_PreUpdateEvent.scriptcanvas} (99%) create mode 100644 AutomatedTesting/ScriptCanvas/ScriptCanvas_ShapeCast.scriptcanvas rename AutomatedTesting/ScriptCanvas/{C6224408_ScriptCanvas_EntitySpawn.scriptcanvas => ScriptCanvas_SpawnEntityWithPhysComponents.scriptcanvas} (99%) diff --git a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas b/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas deleted file mode 100644 index 9b1357eebe..0000000000 --- a/AutomatedTesting/ScriptCanvas/C12712455_ScriptCanvas_ShapeCastVerification.scriptcanvas +++ /dev/null @@ -1,2877 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas new file mode 100644 index 0000000000..4480c186da --- /dev/null +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas @@ -0,0 +1,913 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "ScriptCanvasData", + "ClassData": { + "m_scriptCanvas": { + "Id": { + "id": 4583254586169 + }, + "Name": "ScriptCanvas_CollisionEvents", + "Components": { + "Component_[12571265947277778453]": { + "$type": "EditorGraphVariableManagerComponent", + "Id": 12571265947277778453 + }, + "Component_[15493966824127390493]": { + "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", + "Id": 15493966824127390493, + "m_graphData": { + "m_nodes": [ + { + "Id": { + "id": 4587549553465 + }, + "Name": "SC-Node(GetOnCollisionBeginEvent)", + "Components": { + "Component_[12589909704657058408]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 12589909704657058408, + "Slots": [ + { + "id": { + "m_id": "{BAC1399F-275D-4A4E-8505-B93EEA9110F3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{7C152057-FC56-4A2F-B8F7-39EA3FC2C7CC}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{EE4FD45A-25B2-4FA9-B90C-0F40F34BDB65}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{15B97793-03A4-48E8-B33D-2FE937A68EB3}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event const CollisionEvent& >", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 2, + "methodName": "GetOnCollisionBeginEvent", + "className": "SimulatedBody", + "resultSlotIDs": [ + {} + ], + "inputSlots": [ + { + "m_id": "{BAC1399F-275D-4A4E-8505-B93EEA9110F3}" + } + ], + "prettyClassName": "SimulatedBody" + } + } + }, + { + "Id": { + "id": 4591844520761 + }, + "Name": "SC-EventNode(On Collision Begin event)", + "Components": { + "Component_[13415238770543431567]": { + "$type": "AzEventHandler", + "Id": 13415238770543431567, + "Slots": [ + { + "id": { + "m_id": "{B595F7A6-279A-4073-9FA3-BF7204B5CF56}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 4587549553465 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{3B95CA51-5B19-45CB-A66E-A066E0A179D0}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{0C147590-43C8-4A86-AF32-781B62FDAFEB}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{E99C6D6D-8BDC-4B45-9AE0-BE23B5CE0CAA}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{09F80679-193F-46EB-9D93-7FB36EA7AD1B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Simulated Body Handle", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Collision Event", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{413D67D3-A75D-471F-9144-02C0081D67B5}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 4587549553465 + } + } + ], + "slotName": "On Collision Begin event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + {} + ], + "m_azEventEntry": { + "m_eventName": "On Collision Begin event", + "m_parameterSlotIds": [ + { + "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" + }, + { + "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" + }, + { + "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" + }, + { + "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" + } + ], + "m_parameterNames": [ + { + "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" + }, + { + "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" + }, + { + "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" + }, + { + "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" + } + ], + "m_eventSlotId": { + "m_id": "{413D67D3-A75D-471F-9144-02C0081D67B5}" + } + } + } + } + }, + { + "Id": { + "id": 4596139488057 + }, + "Name": "SC-Node(Print)", + "Components": { + "Component_[3873604258870698857]": { + "$type": "Print", + "Id": 3873604258870698857, + "Slots": [ + { + "id": { + "m_id": "{DC449AA6-B928-40D2-8AB8-9ADA4518D48C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "toolTip": "Input signal", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{C4B28E26-1865-4E0F-98AA-606D51AEA836}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "m_format": "Hello", + "m_unresolvedString": [ + "Hello" + ] + } + } + }, + { + "Id": { + "id": 4600434455353 + }, + "Name": "EBusEventHandler", + "Components": { + "Component_[534992545663306303]": { + "$type": "EBusEventHandler", + "Id": 534992545663306303, + "Slots": [ + { + "id": { + "m_id": "{48B102AA-CBFD-47E9-BBFB-421BF6AC4DA6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Connect", + "toolTip": "Connect this event handler to the specified entity.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B862A4E4-983D-4168-8307-FD36CA2F3742}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect this event handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{C2D1495A-4096-4816-A9B3-2672C5368EAC}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnConnected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{60AECA81-933F-45C8-970B-DF304F4AEFE0}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnDisconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{81431B9B-9159-4FE8-AD1C-0703478FEB68}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnFailure", + "toolTip": "Signaled when it is not possible to connect this handler.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{31D58F4D-AEB7-4725-AFB6-529D820F50F1}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Source", + "toolTip": "ID used to connect on a specific Event address (Type: EntityId)", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{9D40D728-8B88-454C-89B9-3B3B049F0A09}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{4B3378FE-AA4E-4BE9-B961-95CE2216F586}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityActivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{45FC446A-4202-4027-A32B-B7E2C51CEDC2}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EAE4A41C-256E-4824-ACC8-E39D53F458CD}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityDeactivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Source" + } + ], + "m_eventMap": [ + { + "Key": { + "Value": 245425936 + }, + "Value": { + "m_eventName": "OnEntityActivated", + "m_eventId": { + "Value": 245425936 + }, + "m_eventSlotId": { + "m_id": "{4B3378FE-AA4E-4BE9-B961-95CE2216F586}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{9D40D728-8B88-454C-89B9-3B3B049F0A09}" + } + ], + "m_numExpectedArguments": 1 + } + }, + { + "Key": { + "Value": 4273369222 + }, + "Value": { + "m_eventName": "OnEntityDeactivated", + "m_eventId": { + "Value": 4273369222 + }, + "m_eventSlotId": { + "m_id": "{EAE4A41C-256E-4824-ACC8-E39D53F458CD}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{45FC446A-4202-4027-A32B-B7E2C51CEDC2}" + } + ], + "m_numExpectedArguments": 1 + } + } + ], + "m_ebusName": "EntityBus", + "m_busId": { + "Value": 3358774020 + } + } + } + } + ], + "m_connections": [ + { + "Id": { + "id": 4604729422649 + }, + "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Begin event: On Collision Begin event)", + "Components": { + "Component_[9532858041021641376]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 9532858041021641376, + "sourceEndpoint": { + "nodeId": { + "id": 4587549553465 + }, + "slotId": { + "m_id": "{15B97793-03A4-48E8-B33D-2FE937A68EB3}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 4591844520761 + }, + "slotId": { + "m_id": "{413D67D3-A75D-471F-9144-02C0081D67B5}" + } + } + } + } + }, + { + "Id": { + "id": 4609024389945 + }, + "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Out), destEndpoint=(On Collision Begin event: Connect)", + "Components": { + "Component_[6186741522410286164]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 6186741522410286164, + "sourceEndpoint": { + "nodeId": { + "id": 4587549553465 + }, + "slotId": { + "m_id": "{EE4FD45A-25B2-4FA9-B90C-0F40F34BDB65}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 4591844520761 + }, + "slotId": { + "m_id": "{B595F7A6-279A-4073-9FA3-BF7204B5CF56}" + } + } + } + } + }, + { + "Id": { + "id": 4613319357241 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionBeginEvent: In)", + "Components": { + "Component_[13280424214254579514]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 13280424214254579514, + "sourceEndpoint": { + "nodeId": { + "id": 4600434455353 + }, + "slotId": { + "m_id": "{4B3378FE-AA4E-4BE9-B961-95CE2216F586}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 4587549553465 + }, + "slotId": { + "m_id": "{7C152057-FC56-4A2F-B8F7-39EA3FC2C7CC}" + } + } + } + } + }, + { + "Id": { + "id": 4617614324537 + }, + "Name": "srcEndpoint=(On Collision Begin event: OnEvent), destEndpoint=(Print: In)", + "Components": { + "Component_[8114978170302224802]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8114978170302224802, + "sourceEndpoint": { + "nodeId": { + "id": 4591844520761 + }, + "slotId": { + "m_id": "{09F80679-193F-46EB-9D93-7FB36EA7AD1B}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 4596139488057 + }, + "slotId": { + "m_id": "{DC449AA6-B928-40D2-8AB8-9ADA4518D48C}" + } + } + } + } + } + ] + }, + "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", + "versionData": { + "_grammarVersion": 1, + "_runtimeVersion": 1 + }, + "GraphCanvasData": [ + { + "Key": { + "id": 4583254586169 + }, + "Value": { + "ComponentData": { + "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { + "$type": "SceneComponentSaveData", + "ViewParams": { + "Scale": 0.6925797995160841, + "AnchorX": -306.1018981933594, + "AnchorY": -326.3161926269531 + } + } + } + } + }, + { + "Key": { + "id": 4587549553465 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 80.0, + 0.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{F33AF9D4-77BF-4027-AF45-FC9282E9220E}" + } + } + } + }, + { + "Key": { + "id": 4591844520761 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 680.0, + -20.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{F0D734ED-0ED0-46BC-9E27-F384FC04D1CF}" + } + } + } + }, + { + "Key": { + "id": 4596139488057 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1180.0, + -20.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{F77C15FE-3EC9-4F53-A226-0C97F09C5DF6}" + } + } + } + }, + { + "Key": { + "id": 4600434455353 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -240.0, + -60.0 + ] + }, + "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { + "$type": "EBusHandlerNodeDescriptorSaveData", + "EventIds": [ + { + "Value": 245425936 + } + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{A0D0CB4B-7F74-458B-AEBD-518270413AB0}" + } + } + } + } + ], + "StatisticsHelper": { + "InstanceCounter": [ + { + "Key": 191865528901450421, + "Value": 1 + }, + { + "Key": 4847610523576971761, + "Value": 1 + }, + { + "Key": 5842116761103598202, + "Value": 1 + }, + { + "Key": 10684225535275896474, + "Value": 1 + } + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/ScriptCanvas/C19536274_NameNode_Prints.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_GetCollisionName.scriptcanvas similarity index 99% rename from AutomatedTesting/ScriptCanvas/C19536274_NameNode_Prints.scriptcanvas rename to AutomatedTesting/ScriptCanvas/ScriptCanvas_GetCollisionName.scriptcanvas index 9448af25d6..5fc5fb4d8a 100644 --- a/AutomatedTesting/ScriptCanvas/C19536274_NameNode_Prints.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_GetCollisionName.scriptcanvas @@ -5,7 +5,7 @@ - + diff --git a/AutomatedTesting/ScriptCanvas/C12712454_ScriptCanvas_OverlapNodeVerification.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_OverlapNode.scriptcanvas similarity index 100% rename from AutomatedTesting/ScriptCanvas/C12712454_ScriptCanvas_OverlapNodeVerification.scriptcanvas rename to AutomatedTesting/ScriptCanvas/ScriptCanvas_OverlapNode.scriptcanvas diff --git a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas similarity index 99% rename from AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas rename to AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas index ffdac5dd8c..2db2f9c88f 100644 --- a/AutomatedTesting/ScriptCanvas/C14195074_ScriptCanvas_PostUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas @@ -5,7 +5,7 @@ - + diff --git a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas similarity index 99% rename from AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas rename to AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas index 4954eb4684..f355b3e6e9 100644 --- a/AutomatedTesting/ScriptCanvas/C14902097_ScriptCanvas_PreUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas @@ -5,7 +5,7 @@ - + diff --git a/AutomatedTesting/ScriptCanvas/ScriptCanvas_ShapeCast.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_ShapeCast.scriptcanvas new file mode 100644 index 0000000000..83911ddd0a --- /dev/null +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_ShapeCast.scriptcanvas @@ -0,0 +1,1692 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "ScriptCanvasData", + "ClassData": { + "m_scriptCanvas": { + "Id": { + "id": 8672351796498 + }, + "Name": "ScriptCanvas_ShapeCast", + "Components": { + "Component_[1715830487162451505]": { + "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", + "Id": 1715830487162451505, + "m_graphData": { + "m_nodes": [ + { + "Id": { + "id": 8685236698386 + }, + "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{tuple(float const Sp)", + "Components": { + "Component_[17527424526662203988]": { + "$type": "(NodeFunctionGenericMultiReturn)<{tuple(float const Sp", + "Id": 17527424526662203988, + "Slots": [ + { + "id": { + "m_id": "{D7AC77DA-32BA-4741-86AB-CDA656A7760C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{D46CC4A2-380E-4E42-B0A1-176DBC19420B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{66F31F78-DDFA-4B8E-A01C-F4556C68D940}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Number: Distance", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{D8D3B073-1ACD-4170-A3C0-495E673F409A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Transform: Pose", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A26AB3BE-A6E6-4659-8869-6D1A6B30DDAB}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Vector3: Direction", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{520D51F7-0B1F-4412-810C-6ACA2A96AA23}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Number: Radius", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{DE1A013A-7527-47E5-918C-20D13692D37A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "String: Collision group", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{20241664-EF87-4A3B-BAC2-3A43E3D99386}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: Ignore", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{F887E775-DFD5-496A-A707-DB2D6A99607B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Object Hit: Boolean", + "DisplayDataType": { + "m_type": 0 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{3EBC2F40-052C-4AB9-85CF-BFDE6ADFE237}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Position: Vector3", + "DisplayDataType": { + "m_type": 8 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{006BEA83-A09E-40AE-B09F-2FD74588492A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Normal: Vector3", + "DisplayDataType": { + "m_type": 8 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{83DCCC29-BAD8-43ED-B52E-B04877A5A2A5}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Distance: Number", + "DisplayDataType": { + "m_type": 3 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EFEB3B68-5944-45C6-9B70-06EDA57C7459}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityId: EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{700A0934-07DB-4C52-A7DE-E93B074320E8}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Surface: CRC", + "DisplayDataType": { + "m_type": 13 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 100.0, + "label": "Number: Distance" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 7 + }, + "isNullPointer": false, + "$type": "Transform", + "value": { + "Translation": [ + 0.0, + 0.0, + 0.0 + ], + "Rotation": [ + 0.0, + 0.0, + 0.0, + 1.0 + ], + "Scale": 1.0 + }, + "label": "Transform: Pose" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 1.0, + 0.0 + ], + "label": "Vector3: Direction" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 0.5, + "label": "Number: Radius" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 5 + }, + "isNullPointer": false, + "$type": "{03AAAB3F-5C47-5A66-9EBC-D5FA4DB353C9} AZStd::string", + "value": "All", + "label": "String: Collision group" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: Ignore" + } + ], + "Initialized": true + } + } + }, + { + "Id": { + "id": 8676646763794 + }, + "Name": "SC-Node(Start)", + "Components": { + "Component_[17616618838173498229]": { + "$type": "Start", + "Id": 17616618838173498229, + "Slots": [ + { + "id": { + "m_id": "{F85C0F22-59F0-4829-A3B2-958CA6E475B7}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "toolTip": "Signaled when the entity that owns this graph is fully activated.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ] + } + } + }, + { + "Id": { + "id": 8706711534866 + }, + "Name": "SC-Node(TimeDelayNodeableNode)", + "Components": { + "Component_[18154336258371736718]": { + "$type": "TimeDelayNodeableNode", + "Id": 18154336258371736718, + "Slots": [ + { + "id": { + "m_id": "{C2787E3E-CFBF-4891-B913-996173AB5E2C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Start", + "DisplayGroup": { + "Value": 2675529103 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{9F163BAD-DEFF-4545-AF74-ECC908929A3B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Delay", + "toolTip": "The amount of time to delay before the Done is signalled.", + "DisplayGroup": { + "Value": 2675529103 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{412F5500-8A95-4817-B68D-D623F614DA9A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Start", + "DisplayGroup": { + "Value": 2675529103 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{BB866532-A9E2-4F6B-8BDE-573FF19978BD}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Done", + "toolTip": "Signaled after waiting for the specified amount of times.", + "DisplayGroup": { + "Value": 271442091 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 0.5, + "label": "Delay" + } + ], + "nodeable": { + "m_timeUnits": 2 + }, + "slotExecutionMap": { + "ins": [ + { + "_slotId": { + "m_id": "{C2787E3E-CFBF-4891-B913-996173AB5E2C}" + }, + "_inputs": [ + { + "_slotId": { + "m_id": "{9F163BAD-DEFF-4545-AF74-ECC908929A3B}" + } + } + ], + "_outs": [ + { + "_slotId": { + "m_id": "{412F5500-8A95-4817-B68D-D623F614DA9A}" + }, + "_name": "On Start", + "_interfaceSourceId": "{10B6E401-6101-0000-6088-EF3E51000000}" + } + ], + "_interfaceSourceId": "{8089EF3E-5100-0000-9086-EF3E51000000}" + } + ], + "latents": [ + { + "_slotId": { + "m_id": "{BB866532-A9E2-4F6B-8BDE-573FF19978BD}" + }, + "_name": "Done", + "_interfaceSourceId": "{8089EF3E-5100-0000-9086-EF3E51000000}" + } + ] + } + } + } + }, + { + "Id": { + "id": 8698121600274 + }, + "Name": "SC-Node(DrawSphereAtLocation)", + "Components": { + "Component_[4372033099563884915]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 4372033099563884915, + "Slots": [ + { + "id": { + "m_id": "{130E7595-7F23-4DB4-9F63-F65F59802520}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Vector3: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{60E43462-5901-4CAF-A401-85A4FCA7508C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Number: 1", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{1E920F17-3D6F-4CE0-B2D2-3D3C100F8419}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Color: 2", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{506CF2BF-0DF2-41C2-9D41-80191C59AC05}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Number: 3", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{2D4EE0B2-CB04-450A-BF88-0865D83DAD43}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{26873BC3-2AB5-428A-92EE-1AD26052194E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "Vector3: 0" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 0.5, + "label": "Number: 1" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 12 + }, + "isNullPointer": false, + "$type": "Color", + "value": [ + 1.0, + 0.0, + 0.0, + 0.3921568989753723 + ], + "label": "Color: 2" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 3 + }, + "isNullPointer": false, + "$type": "double", + "value": 10.0, + "label": "Number: 3" + } + ], + "methodType": 0, + "methodName": "DrawSphereAtLocation", + "className": "DebugDrawRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "DebugDrawRequestBus" + } + } + }, + { + "Id": { + "id": 8702416567570 + }, + "Name": "SC-Node(SetGravityEnabled)", + "Components": { + "Component_[4963491059979349551]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 4963491059979349551, + "Slots": [ + { + "id": { + "m_id": "{346B23A2-69F8-4055-916C-E5285627347B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{96A5579D-5DBF-43C2-BE9A-6E6E3DB5F274}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Boolean: 1", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EFE54C57-C69A-416B-B679-F324C5F8220A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B672C4F4-B452-4260-B16B-107BE14D4A29}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 6946861790754 + }, + "label": "Source" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 0 + }, + "isNullPointer": false, + "$type": "bool", + "value": true, + "label": "Enabled" + } + ], + "methodType": 0, + "methodName": "SetGravityEnabled", + "className": "RigidBodyRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "RigidBodyRequestBus" + } + } + }, + { + "Id": { + "id": 8680941731090 + }, + "Name": "SC-Node(SetGravityEnabled)", + "Components": { + "Component_[4963491059979349551]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 4963491059979349551, + "Slots": [ + { + "id": { + "m_id": "{346B23A2-69F8-4055-916C-E5285627347B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{96A5579D-5DBF-43C2-BE9A-6E6E3DB5F274}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Boolean: 1", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EFE54C57-C69A-416B-B679-F324C5F8220A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B672C4F4-B452-4260-B16B-107BE14D4A29}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 6951156758050 + }, + "label": "Source" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 0 + }, + "isNullPointer": false, + "$type": "bool", + "value": true, + "label": "Enabled" + } + ], + "methodType": 0, + "methodName": "SetGravityEnabled", + "className": "RigidBodyRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "RigidBodyRequestBus" + } + } + }, + { + "Id": { + "id": 8689531665682 + }, + "Name": "SC-Node(SetGravityEnabled)", + "Components": { + "Component_[4963491059979349551]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 4963491059979349551, + "Slots": [ + { + "id": { + "m_id": "{346B23A2-69F8-4055-916C-E5285627347B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{96A5579D-5DBF-43C2-BE9A-6E6E3DB5F274}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Boolean: 1", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EFE54C57-C69A-416B-B679-F324C5F8220A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B672C4F4-B452-4260-B16B-107BE14D4A29}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 20016447272482 + }, + "label": "Source" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 0 + }, + "isNullPointer": false, + "$type": "bool", + "value": true, + "label": "Enabled" + } + ], + "methodType": 0, + "methodName": "SetGravityEnabled", + "className": "RigidBodyRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "RigidBodyRequestBus" + } + } + }, + { + "Id": { + "id": 8693826632978 + }, + "Name": "SC-Node(GetWorldTM)", + "Components": { + "Component_[9713463285310435196]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 9713463285310435196, + "Slots": [ + { + "id": { + "m_id": "{63CFCFFA-AD2D-4BCF-B5F4-E632DE8546AD}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Transform", + "DisplayDataType": { + "m_type": 7 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{B22FC7CE-DFE3-4118-B98E-F99EA94A7160}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{94D6DD7F-0835-4AF2-8C0D-F5C04A627F09}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{AF7BF67F-4EFD-4B17-8D9E-28D360E229C4}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 285423519414 + }, + "label": "Source" + } + ], + "methodType": 0, + "methodName": "GetWorldTM", + "className": "TransformBus", + "resultSlotIDs": [ + { + "m_id": "{63CFCFFA-AD2D-4BCF-B5F4-E632DE8546AD}" + } + ], + "prettyClassName": "TransformBus" + } + } + } + ], + "m_connections": [ + { + "Id": { + "id": 8711006502162 + }, + "Name": "srcEndpoint=(TimeDelay: Done), destEndpoint=(GetWorldTM: In)", + "Components": { + "Component_[7737581004071114865]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 7737581004071114865, + "sourceEndpoint": { + "nodeId": { + "id": 8706711534866 + }, + "slotId": { + "m_id": "{BB866532-A9E2-4F6B-8BDE-573FF19978BD}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8693826632978 + }, + "slotId": { + "m_id": "{94D6DD7F-0835-4AF2-8C0D-F5C04A627F09}" + } + } + } + } + }, + { + "Id": { + "id": 8715301469458 + }, + "Name": "srcEndpoint=(SphereCastWithGroup: Out), destEndpoint=(DrawSphereAtLocation: In)", + "Components": { + "Component_[2579605655438959770]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2579605655438959770, + "sourceEndpoint": { + "nodeId": { + "id": 8685236698386 + }, + "slotId": { + "m_id": "{D46CC4A2-380E-4E42-B0A1-176DBC19420B}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8698121600274 + }, + "slotId": { + "m_id": "{2D4EE0B2-CB04-450A-BF88-0865D83DAD43}" + } + } + } + } + }, + { + "Id": { + "id": 8719596436754 + }, + "Name": "srcEndpoint=(SphereCastWithGroup: Out), destEndpoint=(SetGravityEnabled: In)", + "Components": { + "Component_[10204073618203833060]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 10204073618203833060, + "sourceEndpoint": { + "nodeId": { + "id": 8685236698386 + }, + "slotId": { + "m_id": "{D46CC4A2-380E-4E42-B0A1-176DBC19420B}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8680941731090 + }, + "slotId": { + "m_id": "{EFE54C57-C69A-416B-B679-F324C5F8220A}" + } + } + } + } + }, + { + "Id": { + "id": 8723891404050 + }, + "Name": "srcEndpoint=(SphereCastWithGroup: Position: Vector3), destEndpoint=(DrawSphereAtLocation: Vector3: 0)", + "Components": { + "Component_[8680294304213498063]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8680294304213498063, + "sourceEndpoint": { + "nodeId": { + "id": 8685236698386 + }, + "slotId": { + "m_id": "{3EBC2F40-052C-4AB9-85CF-BFDE6ADFE237}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8698121600274 + }, + "slotId": { + "m_id": "{130E7595-7F23-4DB4-9F63-F65F59802520}" + } + } + } + } + }, + { + "Id": { + "id": 8728186371346 + }, + "Name": "srcEndpoint=(GetWorldTM: Result: Transform), destEndpoint=(SphereCastWithGroup: Transform: Pose)", + "Components": { + "Component_[17208443392918658715]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 17208443392918658715, + "sourceEndpoint": { + "nodeId": { + "id": 8693826632978 + }, + "slotId": { + "m_id": "{63CFCFFA-AD2D-4BCF-B5F4-E632DE8546AD}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8685236698386 + }, + "slotId": { + "m_id": "{D8D3B073-1ACD-4170-A3C0-495E673F409A}" + } + } + } + } + }, + { + "Id": { + "id": 8732481338642 + }, + "Name": "srcEndpoint=(DrawSphereAtLocation: Out), destEndpoint=(SetGravityEnabled: In)", + "Components": { + "Component_[15585314878063913195]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 15585314878063913195, + "sourceEndpoint": { + "nodeId": { + "id": 8698121600274 + }, + "slotId": { + "m_id": "{26873BC3-2AB5-428A-92EE-1AD26052194E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8702416567570 + }, + "slotId": { + "m_id": "{EFE54C57-C69A-416B-B679-F324C5F8220A}" + } + } + } + } + }, + { + "Id": { + "id": 8736776305938 + }, + "Name": "srcEndpoint=(On Graph Start: Out), destEndpoint=(TimeDelay: Start)", + "Components": { + "Component_[6013147305095983432]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 6013147305095983432, + "sourceEndpoint": { + "nodeId": { + "id": 8676646763794 + }, + "slotId": { + "m_id": "{F85C0F22-59F0-4829-A3B2-958CA6E475B7}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8706711534866 + }, + "slotId": { + "m_id": "{C2787E3E-CFBF-4891-B913-996173AB5E2C}" + } + } + } + } + }, + { + "Id": { + "id": 8741071273234 + }, + "Name": "srcEndpoint=(GetWorldTM: Out), destEndpoint=(SetGravityEnabled: In)", + "Components": { + "Component_[12606540412460381315]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 12606540412460381315, + "sourceEndpoint": { + "nodeId": { + "id": 8693826632978 + }, + "slotId": { + "m_id": "{AF7BF67F-4EFD-4B17-8D9E-28D360E229C4}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8689531665682 + }, + "slotId": { + "m_id": "{EFE54C57-C69A-416B-B679-F324C5F8220A}" + } + } + } + } + }, + { + "Id": { + "id": 8745366240530 + }, + "Name": "srcEndpoint=(GetWorldTM: Out), destEndpoint=(SphereCastWithGroup: In)", + "Components": { + "Component_[2294691910181778131]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2294691910181778131, + "sourceEndpoint": { + "nodeId": { + "id": 8693826632978 + }, + "slotId": { + "m_id": "{AF7BF67F-4EFD-4B17-8D9E-28D360E229C4}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 8685236698386 + }, + "slotId": { + "m_id": "{D7AC77DA-32BA-4741-86AB-CDA656A7760C}" + } + } + } + } + } + ] + }, + "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", + "versionData": { + "_grammarVersion": 1, + "_runtimeVersion": 1 + }, + "GraphCanvasData": [ + { + "Key": { + "id": 8672351796498 + }, + "Value": { + "ComponentData": { + "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { + "$type": "SceneComponentSaveData", + "ViewParams": { + "Scale": 0.21511092130869494, + "AnchorX": -832.1288452148438, + "AnchorY": -418.3887939453125 + } + } + } + } + }, + { + "Key": { + "id": 8676646763794 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "TimeNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -680.0, + 320.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".time" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{329A591F-9482-44F3-93AA-1F135C714680}" + } + } + } + }, + { + "Key": { + "id": 8680941731090 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 960.0, + 40.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{1E66D38D-9F4F-4A41-8989-494911B8ECE1}" + } + } + } + }, + { + "Key": { + "id": 8685236698386 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 320.0, + 300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{146B2DD0-7DD3-4114-B288-9BFF68E8E573}" + } + } + } + }, + { + "Key": { + "id": 8689531665682 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 320.0, + 40.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{4A8567AB-9A67-4125-A703-18F42A301860}" + } + } + } + }, + { + "Key": { + "id": 8693826632978 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -200.0, + 300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{C8023DDA-EC97-47D0-B8DA-B4A5D4F2FAB6}" + } + } + } + }, + { + "Key": { + "id": 8698121600274 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 940.0, + 300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{71F03C63-D5DA-44ED-8295-98753174CF45}" + } + } + } + }, + { + "Key": { + "id": 8702416567570 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1440.0, + 320.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{C25726FB-502F-4D29-8F8F-704F4C7EA764}" + } + } + } + }, + { + "Key": { + "id": 8706711534866 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "TimeNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -520.0, + 300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{CA58C4FF-B941-42C6-94F2-5FB4E7E879E2}" + } + } + } + } + ], + "StatisticsHelper": { + "InstanceCounter": [ + { + "Key": 4199610336680704683, + "Value": 1 + }, + { + "Key": 6462358712820489356, + "Value": 1 + }, + { + "Key": 13774516226110902316, + "Value": 1 + }, + { + "Key": 13774516349808062548, + "Value": 3 + }, + { + "Key": 13774516555687402408, + "Value": 1 + }, + { + "Key": 16812277148590053560, + "Value": 1 + } + ] + } + }, + "Component_[7390341204452664972]": { + "$type": "EditorGraphVariableManagerComponent", + "Id": 7390341204452664972 + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/ScriptCanvas/C6224408_ScriptCanvas_EntitySpawn.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_SpawnEntityWithPhysComponents.scriptcanvas similarity index 99% rename from AutomatedTesting/ScriptCanvas/C6224408_ScriptCanvas_EntitySpawn.scriptcanvas rename to AutomatedTesting/ScriptCanvas/ScriptCanvas_SpawnEntityWithPhysComponents.scriptcanvas index 73dd8c887b..fda9e1f78f 100644 --- a/AutomatedTesting/ScriptCanvas/C6224408_ScriptCanvas_EntitySpawn.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_SpawnEntityWithPhysComponents.scriptcanvas @@ -5,7 +5,7 @@ - + From cdfaabc2caaa4844da2084f7be6d14a904e5c2c3 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 22:32:26 +0200 Subject: [PATCH 153/355] Merge fix, removed editor preferences change by accident --- AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py | 2 +- AutomatedTesting/Registry/editorpreferences.setreg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py index 4ed73a725f..b64fbb5656 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py @@ -90,5 +90,5 @@ class TestAutomation(TestAutomationBase): @revert_physics_config def test_C15425929_Undo_Redo(self, request, workspace, editor, launcher_platform): - from .general import C15425929_Undo_Redo as test_module + from .tests import Physics_UndoRedoWorksOnEntityWithPhysComponents as test_module self._run_test(request, workspace, editor, test_module) \ No newline at end of file diff --git a/AutomatedTesting/Registry/editorpreferences.setreg b/AutomatedTesting/Registry/editorpreferences.setreg index e76e04f9ba..b338d6acad 100644 --- a/AutomatedTesting/Registry/editorpreferences.setreg +++ b/AutomatedTesting/Registry/editorpreferences.setreg @@ -1,7 +1,7 @@ { "Amazon": { "Preferences": { - "EnablePrefabSystem": true + "EnablePrefabSystem": false } } } \ No newline at end of file From 44d2a9275fcee11d84996c4a2775b6cf6487eb95 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Sun, 5 Sep 2021 23:37:55 +0200 Subject: [PATCH 154/355] Blast tests --- .../Gem/PythonTests/Blast/CMakeLists.txt | 4 ++-- .../Gem/PythonTests/Blast/ImportPathHelper.py | 11 ----------- .../{TestSuite_Active.py => TestSuite_Main.py} | 14 +++++++------- .../BaseDamageTest.py} | 6 +----- .../PythonTests/Blast/{ => tests}/BlastUtils.py | 0 .../Blast_ActorSplitsAfterCapsuleDamage.py} | 11 +++-------- .../Blast_ActorSplitsAfterCollision.py} | 11 ++--------- .../Blast_ActorSplitsAfterImpactSpreadDamage.py} | 11 +++-------- .../Blast_ActorSplitsAfterRadialDamage.py} | 11 +++-------- .../Blast_ActorSplitsAfterShearDamage.py} | 11 +++-------- .../Blast_ActorSplitsAfterStressDamage.py} | 11 +++-------- .../Blast_ActorSplitsAfterTriangleDamage.py} | 11 +++-------- 12 files changed, 30 insertions(+), 82 deletions(-) delete mode 100755 AutomatedTesting/Gem/PythonTests/Blast/ImportPathHelper.py rename AutomatedTesting/Gem/PythonTests/Blast/{TestSuite_Active.py => TestSuite_Main.py} (76%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterDamage.py => tests/BaseDamageTest.py} (98%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ => tests}/BlastUtils.py (100%) rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterCapsuleDamage.py => tests/Blast_ActorSplitsAfterCapsuleDamage.py} (79%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterCollision.py => tests/Blast_ActorSplitsAfterCollision.py} (95%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterImpactSpreadDamage.py => tests/Blast_ActorSplitsAfterImpactSpreadDamage.py} (75%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterRadialDamage.py => tests/Blast_ActorSplitsAfterRadialDamage.py} (75%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterShearDamage.py => tests/Blast_ActorSplitsAfterShearDamage.py} (77%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterStressDamage.py => tests/Blast_ActorSplitsAfterStressDamage.py} (75%) mode change 100755 => 100644 rename AutomatedTesting/Gem/PythonTests/Blast/{ActorSplitsAfterTriangleDamage.py => tests/Blast_ActorSplitsAfterTriangleDamage.py} (81%) mode change 100755 => 100644 diff --git a/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt index 172eded09a..cb83fe5344 100644 --- a/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/Blast/CMakeLists.txt @@ -8,10 +8,10 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_pytest( - NAME AutomatedTesting::BlastTests + NAME AutomatedTesting::BlastTests_Main TEST_SUITE main TEST_SERIAL TRUE - PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Active.py + PATH ${CMAKE_CURRENT_LIST_DIR}/TestSuite_Main.py RUNTIME_DEPENDENCIES Legacy::Editor AZ::AssetProcessor diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ImportPathHelper.py b/AutomatedTesting/Gem/PythonTests/Blast/ImportPathHelper.py deleted file mode 100755 index 0e395664ad..0000000000 --- a/AutomatedTesting/Gem/PythonTests/Blast/ImportPathHelper.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -Copyright (c) Contributors to the Open 3D Engine Project. -For complete copyright and license terms please see the LICENSE at the root of this distribution. - -SPDX-License-Identifier: Apache-2.0 OR MIT -""" - -def init(): - import os - import sys - sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../automatedtesting_shared') diff --git a/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Active.py b/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py old mode 100755 new mode 100644 similarity index 76% rename from AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Active.py rename to AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py index 111f6d62e6..dbc4a1a456 --- a/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Active.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/TestSuite_Main.py @@ -22,29 +22,29 @@ from base import TestAutomationBase @pytest.mark.parametrize("project", ["AutomatedTesting"]) class TestAutomation(TestAutomationBase): def test_ActorSplitsAfterCollision(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterCollision as test_module + from .tests import Blast_ActorSplitsAfterCollision as test_module self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterRadialDamage(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterRadialDamage as test_module + from .tests import Blast_ActorSplitsAfterRadialDamage as test_module self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterCapsuleDamage(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterCapsuleDamage as test_module + from .tests import Blast_ActorSplitsAfterCapsuleDamage as test_module self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterImpactSpreadDamage(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterImpactSpreadDamage as test_module + from .tests import Blast_ActorSplitsAfterImpactSpreadDamage as test_module self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterShearDamage(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterShearDamage as test_module + from .tests import Blast_ActorSplitsAfterShearDamage as test_module self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterTriangleDamage(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterTriangleDamage as test_module + from .tests import Blast_ActorSplitsAfterTriangleDamage as test_module self._run_test(request, workspace, editor, test_module) def test_ActorSplitsAfterStressDamage(self, request, workspace, editor, launcher_platform): - from . import ActorSplitsAfterStressDamage as test_module + from .tests import Blast_ActorSplitsAfterStressDamage as test_module self._run_test(request, workspace, editor, test_module) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/BaseDamageTest.py old mode 100755 new mode 100644 similarity index 98% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/BaseDamageTest.py index 109dbf13f3..87340ebb26 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/BaseDamageTest.py @@ -41,11 +41,7 @@ def base_run(damage_func): :return: None """ - - import ImportPathHelper as imports - - imports.init() - + from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper diff --git a/AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/BlastUtils.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/Blast/BlastUtils.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/BlastUtils.py diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterCapsuleDamage.py old mode 100755 new mode 100644 similarity index 79% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterCapsuleDamage.py index 96087569b3..11b395d927 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCapsuleDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterCapsuleDamage.py @@ -9,10 +9,8 @@ import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from ActorSplitsAfterDamage import Tests - -def ActorSplitsAfterCapsuleDamage(): - from ActorSplitsAfterDamage import base_run as internal_run +def Blast_ActorSplitsAfterCapsuleDamage(): + from BaseDamageTest import base_run as internal_run from BlastUtils import Constants def CapsuleDamage(target_id, position0): @@ -26,8 +24,5 @@ def ActorSplitsAfterCapsuleDamage(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterCapsuleDamage) + Report.start_test(Blast_ActorSplitsAfterCapsuleDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterCollision.py old mode 100755 new mode 100644 similarity index 95% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterCollision.py index af6bc62f71..815db78ddc --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterCollision.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterCollision.py @@ -18,7 +18,7 @@ class Tests(): # fmt: on -def ActorSplitsAfterCollision(): +def Blast_ActorSplitsAfterCollision(): """ Summary: @@ -46,10 +46,6 @@ def ActorSplitsAfterCollision(): :return: None """ - import ImportPathHelper as imports - - imports.init() - from editor_python_test_tools.utils import Report from editor_python_test_tools.utils import TestHelper as helper @@ -103,8 +99,5 @@ def ActorSplitsAfterCollision(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterCollision) + Report.start_test(Blast_ActorSplitsAfterCollision) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterImpactSpreadDamage.py old mode 100755 new mode 100644 similarity index 75% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterImpactSpreadDamage.py index e98c7108ba..6cea44af17 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterImpactSpreadDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterImpactSpreadDamage.py @@ -9,10 +9,8 @@ import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from ActorSplitsAfterDamage import Tests - -def ActorSplitsAfterImpactSpreadDamage(): - from ActorSplitsAfterDamage import base_run as internal_run +def Blast_ActorSplitsAfterImpactSpreadDamage(): + from BaseDamageTest import base_run as internal_run from BlastUtils import Constants def ImpactSpreadDamage(target_id, position): @@ -24,8 +22,5 @@ def ActorSplitsAfterImpactSpreadDamage(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterImpactSpreadDamage) + Report.start_test(Blast_ActorSplitsAfterImpactSpreadDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterRadialDamage.py old mode 100755 new mode 100644 similarity index 75% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterRadialDamage.py index 9f5f37752c..b3ddc9143c --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterRadialDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterRadialDamage.py @@ -9,10 +9,8 @@ import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from ActorSplitsAfterDamage import Tests - -def ActorSplitsAfterRadialDamage(): - from ActorSplitsAfterDamage import base_run as internal_run +def Blast_ActorSplitsAfterRadialDamage(): + from BaseDamageTest import base_run as internal_run from BlastUtils import Constants def RadialDamage(target_id, position): @@ -24,8 +22,5 @@ def ActorSplitsAfterRadialDamage(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterRadialDamage) \ No newline at end of file + Report.start_test(Blast_ActorSplitsAfterRadialDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterShearDamage.py old mode 100755 new mode 100644 similarity index 77% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterShearDamage.py index 16abcbceea..8d14898fe6 --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterShearDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterShearDamage.py @@ -9,10 +9,8 @@ import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from ActorSplitsAfterDamage import Tests - -def ActorSplitsAfterShearDamage(): - from ActorSplitsAfterDamage import base_run as internal_run +def Blast_ActorSplitsAfterShearDamage(): + from BaseDamageTest import base_run as internal_run from BlastUtils import Constants def ShearDamage(target_id, position): @@ -25,8 +23,5 @@ def ActorSplitsAfterShearDamage(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterShearDamage) \ No newline at end of file + Report.start_test(Blast_ActorSplitsAfterShearDamage) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterStressDamage.py old mode 100755 new mode 100644 similarity index 75% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterStressDamage.py index a66efc5159..538d62929f --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterStressDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterStressDamage.py @@ -9,10 +9,8 @@ import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from ActorSplitsAfterDamage import Tests - -def ActorSplitsAfterStressDamage(): - from ActorSplitsAfterDamage import base_run as internal_run +def Blast_ActorSplitsAfterStressDamage(): + from BaseDamageTest import base_run as internal_run from BlastUtils import Constants def StressDamage(target_id, position): @@ -24,8 +22,5 @@ def ActorSplitsAfterStressDamage(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterStressDamage) + Report.start_test(Blast_ActorSplitsAfterStressDamage) diff --git a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterTriangleDamage.py old mode 100755 new mode 100644 similarity index 81% rename from AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py rename to AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterTriangleDamage.py index 0dcd6d5354..31a7dc083e --- a/AutomatedTesting/Gem/PythonTests/Blast/ActorSplitsAfterTriangleDamage.py +++ b/AutomatedTesting/Gem/PythonTests/Blast/tests/Blast_ActorSplitsAfterTriangleDamage.py @@ -9,10 +9,8 @@ import os import sys sys.path.append(os.path.dirname(os.path.abspath(__file__))) -from ActorSplitsAfterDamage import Tests - -def ActorSplitsAfterTriangleDamage(): - from ActorSplitsAfterDamage import base_run as internal_run +def Blast_ActorSplitsAfterTriangleDamage(): + from BaseDamageTest import base_run as internal_run from BlastUtils import Constants def TriangleDamage(target_id, position): @@ -28,8 +26,5 @@ def ActorSplitsAfterTriangleDamage(): if __name__ == "__main__": - import ImportPathHelper as imports - imports.init() - from editor_python_test_tools.utils import Report - Report.start_test(ActorSplitsAfterTriangleDamage) \ No newline at end of file + Report.start_test(Blast_ActorSplitsAfterTriangleDamage) \ No newline at end of file From 3ca4a8c54a61c66b35462c73231ac48232c781b7 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Mon, 6 Sep 2021 00:25:58 +0200 Subject: [PATCH 155/355] Removed SC connections that fail to compile for now --- .../ScriptCanvas_CollisionEvents.ly | 4 +- .../collision_events_script.scriptcanvas | 1856 +++++++---------- .../ScriptCanvas_CollisionEvents.scriptcanvas | 913 -------- 3 files changed, 776 insertions(+), 1997 deletions(-) delete mode 100644 AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly index fc576ec459..6c70bbf067 100644 --- a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e04b536d187793187b64a55914d92c1a1c18393a0369715269a295c7b7a7d370 -size 8883 +oid sha256:c1b6f5e409a8358ad95b310473046ce1a2f2aa5f7e05d0c3396044aa52aa7f6d +size 9103 diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas index ee9c1b92e0..a565c64b60 100644 --- a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas @@ -5,7 +5,7 @@ "ClassData": { "m_scriptCanvas": { "Id": { - "id": 18658814308844 + "id": 70086661081986 }, "Name": "collision_events_script", "Components": { @@ -16,7 +16,7 @@ "m_nodes": [ { "Id": { - "id": 18736123720172 + "id": 70125315787650 }, "Name": "SC-Node(Print)", "Components": { @@ -65,7 +65,7 @@ }, { "Id": { - "id": 18684584112620 + "id": 70095251016578 }, "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", "Components": { @@ -142,7 +142,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -160,7 +159,7 @@ }, { "Id": { - "id": 18697469014508 + "id": 70163970493314 }, "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", "Components": { @@ -237,7 +236,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -255,7 +253,7 @@ }, { "Id": { - "id": 18706058949100 + "id": 70172560427906 }, "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", "Components": { @@ -332,7 +330,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -350,7 +347,7 @@ }, { "Id": { - "id": 18675994178028 + "id": 70121020820354 }, "Name": "SC Node(GetVariable)", "Components": { @@ -421,7 +418,7 @@ }, { "Id": { - "id": 18671699210732 + "id": 70112430885762 }, "Name": "SC-EventNode(On Collision Begin event)", "Components": { @@ -444,7 +441,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 18663109276140 + "id": 70142495656834 } } ], @@ -576,7 +573,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 18663109276140 + "id": 70142495656834 } } ], @@ -589,20 +586,17 @@ } ], "Datums": [ - { - "isOverloadedStorage": false, - "scriptCanvasType": { - "m_type": 4, - "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" - }, - "isNullPointer": false, - "$type": "{4C19E257-F929-524E-80E3-C910C5F3E2D9} Event const CollisionEvent& >*", - "label": "On Collision Begin event" - } + {} ], "m_azEventEntry": { "m_eventName": "On Collision Begin event", "m_parameterSlotIds": [ + { + "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" + }, + { + "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" + }, { "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" }, @@ -611,6 +605,12 @@ } ], "m_parameterNames": [ + { + "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" + }, + { + "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" + }, { "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" }, @@ -627,7 +627,7 @@ }, { "Id": { - "id": 18723238818284 + "id": 70099545983874 }, "Name": "SC Node(GetVariable)", "Components": { @@ -698,7 +698,7 @@ }, { "Id": { - "id": 18663109276140 + "id": 70142495656834 }, "Name": "SC-Node(GetOnCollisionBeginEvent)", "Components": { @@ -776,7 +776,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -800,7 +799,7 @@ }, { "Id": { - "id": 18727533785580 + "id": 70159675526018 }, "Name": "EBusEventHandler", "Components": { @@ -979,7 +978,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1042,7 +1040,7 @@ }, { "Id": { - "id": 18749008622060 + "id": 70168265460610 }, "Name": "SC-Node(GetOnCollisionPersistEvent)", "Components": { @@ -1120,7 +1118,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1144,7 +1141,7 @@ }, { "Id": { - "id": 18667404243436 + "id": 70090956049282 }, "Name": "SC-Node(ActivateGameEntity)", "Components": { @@ -1202,7 +1199,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1226,7 +1222,7 @@ }, { "Id": { - "id": 18680289145324 + "id": 70129610754946 }, "Name": "SC-Node(ActivateGameEntity)", "Components": { @@ -1284,7 +1280,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1308,7 +1303,7 @@ }, { "Id": { - "id": 18744713654764 + "id": 70176855395202 }, "Name": "SC-Node(ActivateGameEntity)", "Components": { @@ -1366,7 +1361,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1390,7 +1384,7 @@ }, { "Id": { - "id": 18757598556652 + "id": 70133905722242 }, "Name": "SC-Node(GetOnCollisionEndEvent)", "Components": { @@ -1468,7 +1462,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1492,7 +1485,7 @@ }, { "Id": { - "id": 18701763981804 + "id": 70181150362498 }, "Name": "SC-EventNode(On Collision Persist event)", "Components": { @@ -1515,7 +1508,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 18749008622060 + "id": 70168265460610 } } ], @@ -1647,7 +1640,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 18749008622060 + "id": 70168265460610 } } ], @@ -1660,20 +1653,17 @@ } ], "Datums": [ - { - "isOverloadedStorage": false, - "scriptCanvasType": { - "m_type": 4, - "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" - }, - "isNullPointer": false, - "$type": "{4C19E257-F929-524E-80E3-C910C5F3E2D9} Event const CollisionEvent& >*", - "label": "On Collision Persist event" - } + {} ], "m_azEventEntry": { "m_eventName": "On Collision Persist event", "m_parameterSlotIds": [ + { + "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + }, + { + "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + }, { "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" }, @@ -1682,6 +1672,12 @@ } ], "m_parameterNames": [ + { + "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + }, + { + "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + }, { "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" }, @@ -1698,7 +1694,7 @@ }, { "Id": { - "id": 18731828752876 + "id": 70103840951170 }, "Name": "SC-Node(DeactivateGameEntity)", "Components": { @@ -1756,7 +1752,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1780,7 +1775,7 @@ }, { "Id": { - "id": 18753303589356 + "id": 70146790624130 }, "Name": "SC-Node(DeactivateGameEntity)", "Components": { @@ -1838,7 +1833,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1862,7 +1856,7 @@ }, { "Id": { - "id": 18761893523948 + "id": 70151085591426 }, "Name": "SC-Node(DeactivateGameEntity)", "Components": { @@ -1920,7 +1914,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -1944,7 +1937,7 @@ }, { "Id": { - "id": 18718943850988 + "id": 70185445329794 }, "Name": "SC-EventNode(On Collision End event)", "Components": { @@ -1967,7 +1960,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 18757598556652 + "id": 70133905722242 } } ], @@ -2099,7 +2092,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 18757598556652 + "id": 70133905722242 } } ], @@ -2112,20 +2105,17 @@ } ], "Datums": [ - { - "isOverloadedStorage": false, - "scriptCanvasType": { - "m_type": 4, - "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" - }, - "isNullPointer": false, - "$type": "{4C19E257-F929-524E-80E3-C910C5F3E2D9} Event const CollisionEvent& >*", - "label": "On Collision End event" - } + {} ], "m_azEventEntry": { "m_eventName": "On Collision End event", "m_parameterSlotIds": [ + { + "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + }, + { + "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + }, { "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" }, @@ -2134,6 +2124,12 @@ } ], "m_parameterNames": [ + { + "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + }, + { + "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + }, { "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" }, @@ -2150,7 +2146,7 @@ }, { "Id": { - "id": 18693174047212 + "id": 70108135918466 }, "Name": "SC-Node(Gate)", "Components": { @@ -2227,7 +2223,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 0 }, @@ -2242,7 +2237,7 @@ }, { "Id": { - "id": 18710353916396 + "id": 70116725853058 }, "Name": "SC-Node(Gate)", "Components": { @@ -2319,7 +2314,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 0 }, @@ -2334,7 +2328,7 @@ }, { "Id": { - "id": 18714648883692 + "id": 70189740297090 }, "Name": "SC-Node(Gate)", "Components": { @@ -2411,7 +2405,6 @@ ], "Datums": [ { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 0 }, @@ -2426,7 +2419,7 @@ }, { "Id": { - "id": 18688879079916 + "id": 70138200689538 }, "Name": "SC-Node(Print)", "Components": { @@ -2475,7 +2468,7 @@ }, { "Id": { - "id": 18740418687468 + "id": 70155380558722 }, "Name": "SC Node(GetVariable)", "Components": { @@ -2548,7 +2541,7 @@ "m_connections": [ { "Id": { - "id": 18766188491244 + "id": 70194035264386 }, "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", "Components": { @@ -2557,7 +2550,7 @@ "Id": 8790567172666668723, "sourceEndpoint": { "nodeId": { - "id": 18697469014508 + "id": 70163970493314 }, "slotId": { "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" @@ -2565,7 +2558,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18693174047212 + "id": 70116725853058 }, "slotId": { "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" @@ -2576,7 +2569,7 @@ }, { "Id": { - "id": 18770483458540 + "id": 70198330231682 }, "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", "Components": { @@ -2585,7 +2578,7 @@ "Id": 2434331826651875004, "sourceEndpoint": { "nodeId": { - "id": 18697469014508 + "id": 70163970493314 }, "slotId": { "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" @@ -2593,7 +2586,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18693174047212 + "id": 70116725853058 }, "slotId": { "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" @@ -2604,7 +2597,7 @@ }, { "Id": { - "id": 18774778425836 + "id": 70202625198978 }, "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", "Components": { @@ -2613,7 +2606,7 @@ "Id": 11237921104715455686, "sourceEndpoint": { "nodeId": { - "id": 18693174047212 + "id": 70116725853058 }, "slotId": { "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" @@ -2621,7 +2614,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18761893523948 + "id": 70146790624130 }, "slotId": { "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" @@ -2632,7 +2625,7 @@ }, { "Id": { - "id": 18779073393132 + "id": 70206920166274 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", "Components": { @@ -2641,7 +2634,7 @@ "Id": 14362014279952360310, "sourceEndpoint": { "nodeId": { - "id": 18740418687468 + "id": 70155380558722 }, "slotId": { "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" @@ -2649,7 +2642,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18697469014508 + "id": 70163970493314 }, "slotId": { "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" @@ -2660,7 +2653,7 @@ }, { "Id": { - "id": 18783368360428 + "id": 70211215133570 }, "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", "Components": { @@ -2669,7 +2662,7 @@ "Id": 16755694922186694113, "sourceEndpoint": { "nodeId": { - "id": 18693174047212 + "id": 70116725853058 }, "slotId": { "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" @@ -2677,7 +2670,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18667404243436 + "id": 70090956049282 }, "slotId": { "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" @@ -2688,7 +2681,7 @@ }, { "Id": { - "id": 18787663327724 + "id": 70215510100866 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", "Components": { @@ -2697,7 +2690,7 @@ "Id": 1634747738940978819, "sourceEndpoint": { "nodeId": { - "id": 18740418687468 + "id": 70155380558722 }, "slotId": { "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" @@ -2705,7 +2698,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18667404243436 + "id": 70090956049282 }, "slotId": { "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" @@ -2716,7 +2709,7 @@ }, { "Id": { - "id": 18791958295020 + "id": 70219805068162 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", "Components": { @@ -2725,7 +2718,7 @@ "Id": 8821531688847258487, "sourceEndpoint": { "nodeId": { - "id": 18740418687468 + "id": 70155380558722 }, "slotId": { "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" @@ -2733,7 +2726,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18761893523948 + "id": 70146790624130 }, "slotId": { "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" @@ -2744,7 +2737,7 @@ }, { "Id": { - "id": 18796253262316 + "id": 70224100035458 }, "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", "Components": { @@ -2753,7 +2746,7 @@ "Id": 8561478604291958262, "sourceEndpoint": { "nodeId": { - "id": 18684584112620 + "id": 70095251016578 }, "slotId": { "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" @@ -2761,7 +2754,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18714648883692 + "id": 70108135918466 }, "slotId": { "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" @@ -2772,7 +2765,7 @@ }, { "Id": { - "id": 18800548229612 + "id": 70228395002754 }, "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", "Components": { @@ -2781,7 +2774,7 @@ "Id": 9146734319289132197, "sourceEndpoint": { "nodeId": { - "id": 18684584112620 + "id": 70095251016578 }, "slotId": { "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" @@ -2789,7 +2782,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18714648883692 + "id": 70108135918466 }, "slotId": { "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" @@ -2800,7 +2793,7 @@ }, { "Id": { - "id": 18804843196908 + "id": 70232689970050 }, "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", "Components": { @@ -2809,7 +2802,7 @@ "Id": 11833205937891498095, "sourceEndpoint": { "nodeId": { - "id": 18706058949100 + "id": 70172560427906 }, "slotId": { "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" @@ -2817,7 +2810,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18710353916396 + "id": 70189740297090 }, "slotId": { "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" @@ -2828,7 +2821,7 @@ }, { "Id": { - "id": 18809138164204 + "id": 70236984937346 }, "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", "Components": { @@ -2837,7 +2830,7 @@ "Id": 10467104857840052907, "sourceEndpoint": { "nodeId": { - "id": 18706058949100 + "id": 70172560427906 }, "slotId": { "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" @@ -2845,7 +2838,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18710353916396 + "id": 70189740297090 }, "slotId": { "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" @@ -2856,7 +2849,7 @@ }, { "Id": { - "id": 18813433131500 + "id": 70241279904642 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", "Components": { @@ -2865,7 +2858,7 @@ "Id": 1012188603409101617, "sourceEndpoint": { "nodeId": { - "id": 18723238818284 + "id": 70099545983874 }, "slotId": { "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" @@ -2873,7 +2866,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18684584112620 + "id": 70095251016578 }, "slotId": { "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" @@ -2884,7 +2877,7 @@ }, { "Id": { - "id": 18817728098796 + "id": 70245574871938 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", "Components": { @@ -2893,7 +2886,7 @@ "Id": 5402619035508314979, "sourceEndpoint": { "nodeId": { - "id": 18675994178028 + "id": 70121020820354 }, "slotId": { "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" @@ -2901,7 +2894,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18706058949100 + "id": 70172560427906 }, "slotId": { "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" @@ -2912,7 +2905,7 @@ }, { "Id": { - "id": 18822023066092 + "id": 70249869839234 }, "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", "Components": { @@ -2921,7 +2914,7 @@ "Id": 18435267100506239768, "sourceEndpoint": { "nodeId": { - "id": 18714648883692 + "id": 70108135918466 }, "slotId": { "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" @@ -2929,7 +2922,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18731828752876 + "id": 70151085591426 }, "slotId": { "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" @@ -2940,7 +2933,7 @@ }, { "Id": { - "id": 18826318033388 + "id": 70254164806530 }, "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", "Components": { @@ -2949,7 +2942,7 @@ "Id": 15164751479546717561, "sourceEndpoint": { "nodeId": { - "id": 18714648883692 + "id": 70108135918466 }, "slotId": { "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" @@ -2957,7 +2950,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18744713654764 + "id": 70176855395202 }, "slotId": { "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" @@ -2968,7 +2961,7 @@ }, { "Id": { - "id": 18830613000684 + "id": 70258459773826 }, "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", "Components": { @@ -2977,7 +2970,7 @@ "Id": 5061560116223750730, "sourceEndpoint": { "nodeId": { - "id": 18710353916396 + "id": 70189740297090 }, "slotId": { "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" @@ -2985,7 +2978,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18753303589356 + "id": 70103840951170 }, "slotId": { "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" @@ -2996,7 +2989,7 @@ }, { "Id": { - "id": 18834907967980 + "id": 70262754741122 }, "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", "Components": { @@ -3005,7 +2998,7 @@ "Id": 10711100284272855896, "sourceEndpoint": { "nodeId": { - "id": 18710353916396 + "id": 70189740297090 }, "slotId": { "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" @@ -3013,7 +3006,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18680289145324 + "id": 70129610754946 }, "slotId": { "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" @@ -3024,7 +3017,7 @@ }, { "Id": { - "id": 18839202935276 + "id": 70267049708418 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", "Components": { @@ -3033,7 +3026,7 @@ "Id": 4394555422677501602, "sourceEndpoint": { "nodeId": { - "id": 18723238818284 + "id": 70099545983874 }, "slotId": { "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" @@ -3041,7 +3034,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18731828752876 + "id": 70151085591426 }, "slotId": { "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" @@ -3052,7 +3045,7 @@ }, { "Id": { - "id": 18843497902572 + "id": 70271344675714 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", "Components": { @@ -3061,7 +3054,7 @@ "Id": 4685709028181371637, "sourceEndpoint": { "nodeId": { - "id": 18675994178028 + "id": 70121020820354 }, "slotId": { "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" @@ -3069,7 +3062,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18753303589356 + "id": 70103840951170 }, "slotId": { "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" @@ -3080,7 +3073,7 @@ }, { "Id": { - "id": 18847792869868 + "id": 70275639643010 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", "Components": { @@ -3089,7 +3082,7 @@ "Id": 3306462520084951475, "sourceEndpoint": { "nodeId": { - "id": 18675994178028 + "id": 70121020820354 }, "slotId": { "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" @@ -3097,7 +3090,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18680289145324 + "id": 70129610754946 }, "slotId": { "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" @@ -3108,7 +3101,7 @@ }, { "Id": { - "id": 18852087837164 + "id": 70279934610306 }, "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3117,7 +3110,7 @@ "Id": 17145465513158447772, "sourceEndpoint": { "nodeId": { - "id": 18761893523948 + "id": 70146790624130 }, "slotId": { "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" @@ -3125,7 +3118,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18736123720172 + "id": 70125315787650 }, "slotId": { "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" @@ -3136,7 +3129,7 @@ }, { "Id": { - "id": 18856382804460 + "id": 70284229577602 }, "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3145,7 +3138,7 @@ "Id": 14069026837818796272, "sourceEndpoint": { "nodeId": { - "id": 18667404243436 + "id": 70090956049282 }, "slotId": { "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" @@ -3153,7 +3146,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18688879079916 + "id": 70138200689538 }, "slotId": { "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" @@ -3164,7 +3157,7 @@ }, { "Id": { - "id": 18860677771756 + "id": 70288524544898 }, "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3173,7 +3166,7 @@ "Id": 7728736156493449863, "sourceEndpoint": { "nodeId": { - "id": 18731828752876 + "id": 70151085591426 }, "slotId": { "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" @@ -3181,7 +3174,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18736123720172 + "id": 70125315787650 }, "slotId": { "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" @@ -3192,7 +3185,7 @@ }, { "Id": { - "id": 18864972739052 + "id": 70292819512194 }, "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3201,7 +3194,7 @@ "Id": 10386336352272981702, "sourceEndpoint": { "nodeId": { - "id": 18744713654764 + "id": 70176855395202 }, "slotId": { "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" @@ -3209,7 +3202,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18688879079916 + "id": 70138200689538 }, "slotId": { "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" @@ -3220,7 +3213,7 @@ }, { "Id": { - "id": 18869267706348 + "id": 70297114479490 }, "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3229,7 +3222,7 @@ "Id": 16807949046056318365, "sourceEndpoint": { "nodeId": { - "id": 18753303589356 + "id": 70103840951170 }, "slotId": { "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" @@ -3237,7 +3230,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18736123720172 + "id": 70125315787650 }, "slotId": { "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" @@ -3248,7 +3241,7 @@ }, { "Id": { - "id": 18873562673644 + "id": 70301409446786 }, "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3257,7 +3250,7 @@ "Id": 13893900813580744359, "sourceEndpoint": { "nodeId": { - "id": 18680289145324 + "id": 70129610754946 }, "slotId": { "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" @@ -3265,7 +3258,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18688879079916 + "id": 70138200689538 }, "slotId": { "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" @@ -3276,147 +3269,7 @@ }, { "Id": { - "id": 18877857640940 - }, - "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Begin event: On Collision Begin event)", - "Components": { - "Component_[5183376729979850500]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 5183376729979850500, - "sourceEndpoint": { - "nodeId": { - "id": 18663109276140 - }, - "slotId": { - "m_id": "{FCF4B185-2AD4-42BD-A304-B36B437CEA61}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18671699210732 - }, - "slotId": { - "m_id": "{F7A6B1A7-EB72-45DE-8A87-7C6E36FCA2A3}" - } - } - } - } - }, - { - "Id": { - "id": 18882152608236 - }, - "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Out), destEndpoint=(On Collision Begin event: Connect)", - "Components": { - "Component_[2675455138680809572]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 2675455138680809572, - "sourceEndpoint": { - "nodeId": { - "id": 18663109276140 - }, - "slotId": { - "m_id": "{5AD134C7-A8BC-4BE7-B815-68901BBEBE0D}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18671699210732 - }, - "slotId": { - "m_id": "{74B54CB0-A72C-4A6A-ABB3-9EA6529DDF78}" - } - } - } - } - }, - { - "Id": { - "id": 18886447575532 - }, - "Name": "srcEndpoint=(GetOnCollisionEndEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision End event: On Collision End event)", - "Components": { - "Component_[17579167564514469704]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 17579167564514469704, - "sourceEndpoint": { - "nodeId": { - "id": 18757598556652 - }, - "slotId": { - "m_id": "{B825CA1B-36A9-4634-8D66-0C510EC4D4E8}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18718943850988 - }, - "slotId": { - "m_id": "{BBC0A5CC-0C89-47E1-BDEE-2F21BF6053DC}" - } - } - } - } - }, - { - "Id": { - "id": 18890742542828 - }, - "Name": "srcEndpoint=(GetOnCollisionEndEvent: Out), destEndpoint=(On Collision End event: Connect)", - "Components": { - "Component_[8533738456407318471]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 8533738456407318471, - "sourceEndpoint": { - "nodeId": { - "id": 18757598556652 - }, - "slotId": { - "m_id": "{84128820-5F2E-497F-9B13-A262484DE323}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18718943850988 - }, - "slotId": { - "m_id": "{5F5A4D6A-50EF-4561-B5D3-F8CF1C4530F6}" - } - } - } - } - }, - { - "Id": { - "id": 18895037510124 - }, - "Name": "srcEndpoint=(GetOnCollisionPersistEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Persist event: On Collision Persist event)", - "Components": { - "Component_[16307615877899068767]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 16307615877899068767, - "sourceEndpoint": { - "nodeId": { - "id": 18749008622060 - }, - "slotId": { - "m_id": "{79F0D577-9326-4334-A996-74E400870874}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18701763981804 - }, - "slotId": { - "m_id": "{210423A5-D203-4C26-9B62-2B7DBA3320BD}" - } - } - } - } - }, - { - "Id": { - "id": 18899332477420 + "id": 70305704414082 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", "Components": { @@ -3425,7 +3278,7 @@ "Id": 3566132196647215905, "sourceEndpoint": { "nodeId": { - "id": 18723238818284 + "id": 70099545983874 }, "slotId": { "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" @@ -3433,7 +3286,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18744713654764 + "id": 70176855395202 }, "slotId": { "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" @@ -3444,7 +3297,7 @@ }, { "Id": { - "id": 18903627444716 + "id": 70309999381378 }, "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", "Components": { @@ -3453,7 +3306,7 @@ "Id": 15737173947743935362, "sourceEndpoint": { "nodeId": { - "id": 18740418687468 + "id": 70155380558722 }, "slotId": { "m_id": "{B36D2C46-0A2B-4C90-B57C-5D9B7D3C1A63}" @@ -3461,7 +3314,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18697469014508 + "id": 70163970493314 }, "slotId": { "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" @@ -3472,7 +3325,7 @@ }, { "Id": { - "id": 18907922412012 + "id": 70314294348674 }, "Name": "srcEndpoint=(On Collision Begin event: OnEvent), destEndpoint=(Get Variable: In)", "Components": { @@ -3481,7 +3334,7 @@ "Id": 6115424509860805504, "sourceEndpoint": { "nodeId": { - "id": 18671699210732 + "id": 70112430885762 }, "slotId": { "m_id": "{E32049C5-FF99-4E74-91EC-D007B0D6EF7B}" @@ -3489,7 +3342,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18740418687468 + "id": 70155380558722 }, "slotId": { "m_id": "{5A04BA4A-061E-4775-A6CE-713E298D4E9A}" @@ -3500,7 +3353,7 @@ }, { "Id": { - "id": 18912217379308 + "id": 70318589315970 }, "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", "Components": { @@ -3509,7 +3362,7 @@ "Id": 10250827968868397862, "sourceEndpoint": { "nodeId": { - "id": 18723238818284 + "id": 70099545983874 }, "slotId": { "m_id": "{DF9C6AFF-531F-4E74-80CC-1F6889A1CE9E}" @@ -3517,7 +3370,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18684584112620 + "id": 70095251016578 }, "slotId": { "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" @@ -3528,7 +3381,7 @@ }, { "Id": { - "id": 18916512346604 + "id": 70322884283266 }, "Name": "srcEndpoint=(On Collision Persist event: OnEvent), destEndpoint=(Get Variable: In)", "Components": { @@ -3537,7 +3390,7 @@ "Id": 13286675358080560883, "sourceEndpoint": { "nodeId": { - "id": 18701763981804 + "id": 70181150362498 }, "slotId": { "m_id": "{1A994B40-F1C6-4F60-9F44-4CE42732554C}" @@ -3545,7 +3398,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18723238818284 + "id": 70099545983874 }, "slotId": { "m_id": "{245126A2-D7FE-4C59-BF8D-46F791EEE730}" @@ -3556,7 +3409,7 @@ }, { "Id": { - "id": 18920807313900 + "id": 70327179250562 }, "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", "Components": { @@ -3565,7 +3418,7 @@ "Id": 2090477647964111499, "sourceEndpoint": { "nodeId": { - "id": 18675994178028 + "id": 70121020820354 }, "slotId": { "m_id": "{6B862981-524C-4643-A2C2-9454CB1FD552}" @@ -3573,7 +3426,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18706058949100 + "id": 70172560427906 }, "slotId": { "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" @@ -3584,7 +3437,7 @@ }, { "Id": { - "id": 18925102281196 + "id": 70331474217858 }, "Name": "srcEndpoint=(On Collision End event: OnEvent), destEndpoint=(Get Variable: In)", "Components": { @@ -3593,7 +3446,7 @@ "Id": 9355447111337093492, "sourceEndpoint": { "nodeId": { - "id": 18718943850988 + "id": 70185445329794 }, "slotId": { "m_id": "{FFBDBAC4-AF71-443C-BD6C-6C9E6BFAD858}" @@ -3601,7 +3454,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 18675994178028 + "id": 70121020820354 }, "slotId": { "m_id": "{7A817841-79D4-41FC-97DA-72E599A770CC}" @@ -3609,202 +3462,6 @@ } } } - }, - { - "Id": { - "id": 18929397248492 - }, - "Name": "srcEndpoint=(GetOnCollisionPersistEvent: Out), destEndpoint=(On Collision Persist event: Connect)", - "Components": { - "Component_[5892824244662462184]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 5892824244662462184, - "sourceEndpoint": { - "nodeId": { - "id": 18749008622060 - }, - "slotId": { - "m_id": "{8A08ADFB-F581-40F8-B900-A5A968A11F6D}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18701763981804 - }, - "slotId": { - "m_id": "{EB9CE3A4-B8A4-4436-9E3C-026580D17AC3}" - } - } - } - } - }, - { - "Id": { - "id": 18933692215788 - }, - "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionPersistEvent: In)", - "Components": { - "Component_[8407246073220654261]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 8407246073220654261, - "sourceEndpoint": { - "nodeId": { - "id": 18727533785580 - }, - "slotId": { - "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18749008622060 - }, - "slotId": { - "m_id": "{7AE56C6B-CF55-4FC7-AA96-E5845B406017}" - } - } - } - } - }, - { - "Id": { - "id": 18937987183084 - }, - "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionBeginEvent: In)", - "Components": { - "Component_[11979105462576985337]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 11979105462576985337, - "sourceEndpoint": { - "nodeId": { - "id": 18727533785580 - }, - "slotId": { - "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18663109276140 - }, - "slotId": { - "m_id": "{88B3237D-3297-4837-A80A-19ECAB4B4D61}" - } - } - } - } - }, - { - "Id": { - "id": 18942282150380 - }, - "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionEndEvent: In)", - "Components": { - "Component_[2893952470811105255]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 2893952470811105255, - "sourceEndpoint": { - "nodeId": { - "id": 18727533785580 - }, - "slotId": { - "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18757598556652 - }, - "slotId": { - "m_id": "{F0E14922-5337-4F26-91ED-E23E557B8723}" - } - } - } - } - }, - { - "Id": { - "id": 18946577117676 - }, - "Name": "srcEndpoint=(EntityBus Handler: EntityID), destEndpoint=(GetOnCollisionPersistEvent: EntityID: 0)", - "Components": { - "Component_[13300330809619890896]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 13300330809619890896, - "sourceEndpoint": { - "nodeId": { - "id": 18727533785580 - }, - "slotId": { - "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18749008622060 - }, - "slotId": { - "m_id": "{76C563E8-85C7-4E2F-A09A-9D982064F966}" - } - } - } - } - }, - { - "Id": { - "id": 18950872084972 - }, - "Name": "srcEndpoint=(EntityBus Handler: EntityID), destEndpoint=(GetOnCollisionBeginEvent: EntityID: 0)", - "Components": { - "Component_[11318928191785921711]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 11318928191785921711, - "sourceEndpoint": { - "nodeId": { - "id": 18727533785580 - }, - "slotId": { - "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18663109276140 - }, - "slotId": { - "m_id": "{C1CC691F-49A7-4348-89AD-F11BFBE3AFAE}" - } - } - } - } - }, - { - "Id": { - "id": 18955167052268 - }, - "Name": "srcEndpoint=(EntityBus Handler: EntityID), destEndpoint=(GetOnCollisionEndEvent: EntityID: 0)", - "Components": { - "Component_[13092135600400455568]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 13092135600400455568, - "sourceEndpoint": { - "nodeId": { - "id": 18727533785580 - }, - "slotId": { - "m_id": "{1EAAB3AC-9A45-4A1D-ACD5-7A079F2991FC}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 18757598556652 - }, - "slotId": { - "m_id": "{4C021C78-C51F-40AD-8D0C-E912A7216BEC}" - } - } - } - } } ] }, @@ -3817,16 +3474,54 @@ "GraphCanvasData": [ { "Key": { - "id": 18658814308844 + "id": 70086661081986 }, "Value": { "ComponentData": { "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { "$type": "SceneComponentSaveData", + "Constructs": [ + { + "Type": 1, + "DataContainer": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{524D8380-AC09-444E-870E-9CEF2535B4A2}": { + "$type": "CommentNodeTextSaveData", + "Comment": "These are disconnected because a bug in Script Canvas with AZ::Events.\n\nOnce the issue is fixed reconnecting the nodes should make the test to pass", + "BackgroundColor": [ + 0.9800000190734863, + 0.9700000286102295, + 0.6499999761581421 + ], + "FontSettings": { + "PixelSize": 32 + } + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -1280.0, + -500.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{014DAF90-9434-4257-9670-6378E4D62A11}" + } + } + } + } + ], "ViewParams": { - "Scale": 0.6260976, - "AnchorX": 570.1986694335938, - "AnchorY": -218.8157196044922 + "Scale": 0.6573655545525766, + "AnchorX": -1186.554443359375, + "AnchorY": -578.06494140625 } } } @@ -3834,38 +3529,7 @@ }, { "Key": { - "id": 18663109276140 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -900.0, - -300.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{B9CA5B12-F636-47FE-804B-E11C972D4D8F}" - } - } - } - }, - { - "Key": { - "id": 18667404243436 + "id": 70090956049282 }, "Value": { "ComponentData": { @@ -3896,100 +3560,7 @@ }, { "Key": { - "id": 18671699210732 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "HandlerNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -280.0, - -280.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".azeventhandler" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{7DBDAF02-24F5-4FEF-97F6-5C71F5596B09}" - } - } - } - }, - { - "Key": { - "id": 18675994178028 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "GetVariableNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 220.0, - 460.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".getVariable" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{D2E4DE42-76F7-4B2E-838A-49EA403EA569}" - } - } - } - }, - { - "Key": { - "id": 18680289145324 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, - 560.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{DA5DCC2B-9E77-46F7-8CA9-A2FADE367B25}" - } - } - } - }, - { - "Key": { - "id": 18684584112620 + "id": 70095251016578 }, "Value": { "ComponentData": { @@ -4019,252 +3590,7 @@ }, { "Key": { - "id": 18688879079916 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "StringNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 2000.0, - 260.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{6EDB526D-EFA0-44C2-8A0C-9083BE1143D8}" - } - } - } - }, - { - "Key": { - "id": 18693174047212 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "LogicNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1080.0, - -220.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".logic" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{D9B0DBAE-33BB-4DD0-853F-3609B859651E}" - } - } - } - }, - { - "Key": { - "id": 18697469014508 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "DefaultNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 600.0, - -240.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{72129D0C-F4AF-4367-962F-BE9EEFC6A1C8}" - } - } - } - }, - { - "Key": { - "id": 18701763981804 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "HandlerNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -280.0, - 60.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".azeventhandler" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{752364F1-EDC4-42D0-82CB-84FFE27AE3BC}" - } - } - } - }, - { - "Key": { - "id": 18706058949100 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "DefaultNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 600.0, - 460.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{2B76EE69-5338-4B1A-A4BE-98960F9F71D4}" - } - } - } - }, - { - "Key": { - "id": 18710353916396 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "LogicNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1080.0, - 480.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".logic" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{D09C8DAB-49A0-41CB-89D1-302EA305B161}" - } - } - } - }, - { - "Key": { - "id": 18714648883692 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "LogicNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1080.0, - 120.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".logic" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{455C1E31-F37D-4EE7-B954-B0532C66EE2C}" - } - } - } - }, - { - "Key": { - "id": 18718943850988 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "HandlerNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -280.0, - 420.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".azeventhandler" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{DFC56761-5B10-4D07-A98F-32E24DFA4649}" - } - } - } - }, - { - "Key": { - "id": 18723238818284 + "id": 70099545983874 }, "Value": { "ComponentData": { @@ -4295,195 +3621,7 @@ }, { "Key": { - "id": 18727533785580 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -1340.0, - -20.0 - ] - }, - "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { - "$type": "EBusHandlerNodeDescriptorSaveData", - "EventIds": [ - { - "Value": 245425936 - } - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{5D4F47C6-521E-46DB-9899-4E8E558A6329}" - } - } - } - }, - { - "Key": { - "id": 18731828752876 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, - 20.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{0722BECC-EBCA-43E3-8EEC-618BD189E739}" - } - } - } - }, - { - "Key": { - "id": 18736123720172 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "StringNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 2000.0, - -160.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{389C6D5B-CE48-4C06-9A9C-BF8A63B50375}" - } - } - } - }, - { - "Key": { - "id": 18740418687468 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "GetVariableNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 200.0, - -240.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".getVariable" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{6F168FFF-9795-4C98-803C-FC4903E0C0A9}" - } - } - } - }, - { - "Key": { - "id": 18744713654764 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, - 200.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{26BE8EF6-5AEC-42D8-AC7F-D380B460242D}" - } - } - } - }, - { - "Key": { - "id": 18749008622060 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -900.0, - 40.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{4B279432-B947-45C5-8BF0-473703906A28}" - } - } - } - }, - { - "Key": { - "id": 18753303589356 + "id": 70103840951170 }, "Value": { "ComponentData": { @@ -4514,7 +3652,192 @@ }, { "Key": { - "id": 18757598556652 + "id": 70108135918466 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + 120.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{455C1E31-F37D-4EE7-B954-B0532C66EE2C}" + } + } + } + }, + { + "Key": { + "id": 70112430885762 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -280.0, + -280.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{7DBDAF02-24F5-4FEF-97F6-5C71F5596B09}" + } + } + } + }, + { + "Key": { + "id": 70116725853058 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + -220.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D9B0DBAE-33BB-4DD0-853F-3609B859651E}" + } + } + } + }, + { + "Key": { + "id": 70121020820354 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 220.0, + 460.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D2E4DE42-76F7-4B2E-838A-49EA403EA569}" + } + } + } + }, + { + "Key": { + "id": 70125315787650 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 2000.0, + -160.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{389C6D5B-CE48-4C06-9A9C-BF8A63B50375}" + } + } + } + }, + { + "Key": { + "id": 70129610754946 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 560.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{DA5DCC2B-9E77-46F7-8CA9-A2FADE367B25}" + } + } + } + }, + { + "Key": { + "id": 70133905722242 }, "Value": { "ComponentData": { @@ -4545,7 +3868,68 @@ }, { "Key": { - "id": 18761893523948 + "id": 70138200689538 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 2000.0, + 260.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{6EDB526D-EFA0-44C2-8A0C-9083BE1143D8}" + } + } + } + }, + { + "Key": { + "id": 70142495656834 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -900.0, + -260.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{B9CA5B12-F636-47FE-804B-E11C972D4D8F}" + } + } + } + }, + { + "Key": { + "id": 70146790624130 }, "Value": { "ComponentData": { @@ -4573,6 +3957,317 @@ } } } + }, + { + "Key": { + "id": 70151085591426 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 20.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{0722BECC-EBCA-43E3-8EEC-618BD189E739}" + } + } + } + }, + { + "Key": { + "id": 70155380558722 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 200.0, + -240.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{6F168FFF-9795-4C98-803C-FC4903E0C0A9}" + } + } + } + }, + { + "Key": { + "id": 70159675526018 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -1300.0, + 0.0 + ] + }, + "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { + "$type": "EBusHandlerNodeDescriptorSaveData", + "EventIds": [ + { + "Value": 245425936 + } + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{5D4F47C6-521E-46DB-9899-4E8E558A6329}" + } + } + } + }, + { + "Key": { + "id": 70163970493314 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 600.0, + -240.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{72129D0C-F4AF-4367-962F-BE9EEFC6A1C8}" + } + } + } + }, + { + "Key": { + "id": 70168265460610 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -900.0, + 40.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{4B279432-B947-45C5-8BF0-473703906A28}" + } + } + } + }, + { + "Key": { + "id": 70172560427906 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 600.0, + 460.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{2B76EE69-5338-4B1A-A4BE-98960F9F71D4}" + } + } + } + }, + { + "Key": { + "id": 70176855395202 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 200.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{26BE8EF6-5AEC-42D8-AC7F-D380B460242D}" + } + } + } + }, + { + "Key": { + "id": 70181150362498 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -280.0, + 60.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{752364F1-EDC4-42D0-82CB-84FFE27AE3BC}" + } + } + } + }, + { + "Key": { + "id": 70185445329794 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -280.0, + 420.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{DFC56761-5B10-4D07-A98F-32E24DFA4649}" + } + } + } + }, + { + "Key": { + "id": 70189740297090 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + 480.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D09C8DAB-49A0-41CB-89D1-302EA305B161}" + } + } + } } ], "StatisticsHelper": { @@ -4643,7 +4338,6 @@ }, "Value": { "Datum": { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -4667,7 +4361,6 @@ }, "Value": { "Datum": { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, @@ -4691,7 +4384,6 @@ }, "Value": { "Datum": { - "isOverloadedStorage": false, "scriptCanvasType": { "m_type": 1 }, diff --git a/AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas deleted file mode 100644 index 4480c186da..0000000000 --- a/AutomatedTesting/ScriptCanvas/ScriptCanvas_CollisionEvents.scriptcanvas +++ /dev/null @@ -1,913 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "ScriptCanvasData", - "ClassData": { - "m_scriptCanvas": { - "Id": { - "id": 4583254586169 - }, - "Name": "ScriptCanvas_CollisionEvents", - "Components": { - "Component_[12571265947277778453]": { - "$type": "EditorGraphVariableManagerComponent", - "Id": 12571265947277778453 - }, - "Component_[15493966824127390493]": { - "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", - "Id": 15493966824127390493, - "m_graphData": { - "m_nodes": [ - { - "Id": { - "id": 4587549553465 - }, - "Name": "SC-Node(GetOnCollisionBeginEvent)", - "Components": { - "Component_[12589909704657058408]": { - "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 12589909704657058408, - "Slots": [ - { - "id": { - "m_id": "{BAC1399F-275D-4A4E-8505-B93EEA9110F3}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "EntityID: 0", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{7C152057-FC56-4A2F-B8F7-39EA3FC2C7CC}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{EE4FD45A-25B2-4FA9-B90C-0F40F34BDB65}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{15B97793-03A4-48E8-B33D-2FE937A68EB3}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Result: Event const CollisionEvent& >", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "EntityID: 0" - } - ], - "methodType": 2, - "methodName": "GetOnCollisionBeginEvent", - "className": "SimulatedBody", - "resultSlotIDs": [ - {} - ], - "inputSlots": [ - { - "m_id": "{BAC1399F-275D-4A4E-8505-B93EEA9110F3}" - } - ], - "prettyClassName": "SimulatedBody" - } - } - }, - { - "Id": { - "id": 4591844520761 - }, - "Name": "SC-EventNode(On Collision Begin event)", - "Components": { - "Component_[13415238770543431567]": { - "$type": "AzEventHandler", - "Id": 13415238770543431567, - "Slots": [ - { - "id": { - "m_id": "{B595F7A6-279A-4073-9FA3-BF7204B5CF56}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "ConnectionLimitContract", - "limit": 1 - }, - { - "$type": "RestrictedNodeContract", - "m_nodeId": { - "id": 4587549553465 - } - } - ], - "slotName": "Connect", - "toolTip": "Connect the AZ Event to this AZ Event Handler.", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{3B95CA51-5B19-45CB-A66E-A066E0A179D0}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Disconnect", - "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{0C147590-43C8-4A86-AF32-781B62FDAFEB}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "On Connected", - "toolTip": "Signaled when a connection has taken place.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{E99C6D6D-8BDC-4B45-9AE0-BE23B5CE0CAA}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "On Disconnected", - "toolTip": "Signaled when this event handler is disconnected.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{09F80679-193F-46EB-9D93-7FB36EA7AD1B}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "OnEvent", - "toolTip": "Triggered when the AZ Event invokes Signal() function.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - }, - "IsLatent": true - }, - { - "id": { - "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Simulated Body Handle", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Collision Event", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{413D67D3-A75D-471F-9144-02C0081D67B5}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "ConnectionLimitContract", - "limit": 1 - }, - { - "$type": "RestrictedNodeContract", - "m_nodeId": { - "id": 4587549553465 - } - } - ], - "slotName": "On Collision Begin event", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - } - ], - "Datums": [ - {} - ], - "m_azEventEntry": { - "m_eventName": "On Collision Begin event", - "m_parameterSlotIds": [ - { - "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" - }, - { - "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" - }, - { - "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" - }, - { - "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" - } - ], - "m_parameterNames": [ - { - "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" - }, - { - "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" - }, - { - "m_id": "{56C062DB-D1D6-4CE1-AD9C-D5AABC086649}" - }, - { - "m_id": "{479BC6EC-DA3E-4D77-BDBF-455AFB467892}" - } - ], - "m_eventSlotId": { - "m_id": "{413D67D3-A75D-471F-9144-02C0081D67B5}" - } - } - } - } - }, - { - "Id": { - "id": 4596139488057 - }, - "Name": "SC-Node(Print)", - "Components": { - "Component_[3873604258870698857]": { - "$type": "Print", - "Id": 3873604258870698857, - "Slots": [ - { - "id": { - "m_id": "{DC449AA6-B928-40D2-8AB8-9ADA4518D48C}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "toolTip": "Input signal", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{C4B28E26-1865-4E0F-98AA-606D51AEA836}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - } - ], - "m_format": "Hello", - "m_unresolvedString": [ - "Hello" - ] - } - } - }, - { - "Id": { - "id": 4600434455353 - }, - "Name": "EBusEventHandler", - "Components": { - "Component_[534992545663306303]": { - "$type": "EBusEventHandler", - "Id": 534992545663306303, - "Slots": [ - { - "id": { - "m_id": "{48B102AA-CBFD-47E9-BBFB-421BF6AC4DA6}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Connect", - "toolTip": "Connect this event handler to the specified entity.", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{B862A4E4-983D-4168-8307-FD36CA2F3742}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Disconnect", - "toolTip": "Disconnect this event handler.", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{C2D1495A-4096-4816-A9B3-2672C5368EAC}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "OnConnected", - "toolTip": "Signaled when a connection has taken place.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{60AECA81-933F-45C8-970B-DF304F4AEFE0}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "OnDisconnected", - "toolTip": "Signaled when this event handler is disconnected.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{81431B9B-9159-4FE8-AD1C-0703478FEB68}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "OnFailure", - "toolTip": "Signaled when it is not possible to connect this handler.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{31D58F4D-AEB7-4725-AFB6-529D820F50F1}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Source", - "toolTip": "ID used to connect on a specific Event address (Type: EntityId)", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{9D40D728-8B88-454C-89B9-3B3B049F0A09}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "EntityID", - "DisplayDataType": { - "m_type": 1 - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{4B3378FE-AA4E-4BE9-B961-95CE2216F586}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "ExecutionSlot:OnEntityActivated", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - }, - "IsLatent": true - }, - { - "id": { - "m_id": "{45FC446A-4202-4027-A32B-B7E2C51CEDC2}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "EntityID", - "DisplayDataType": { - "m_type": 1 - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{EAE4A41C-256E-4824-ACC8-E39D53F458CD}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "ExecutionSlot:OnEntityDeactivated", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - }, - "IsLatent": true - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "Source" - } - ], - "m_eventMap": [ - { - "Key": { - "Value": 245425936 - }, - "Value": { - "m_eventName": "OnEntityActivated", - "m_eventId": { - "Value": 245425936 - }, - "m_eventSlotId": { - "m_id": "{4B3378FE-AA4E-4BE9-B961-95CE2216F586}" - }, - "m_parameterSlotIds": [ - { - "m_id": "{9D40D728-8B88-454C-89B9-3B3B049F0A09}" - } - ], - "m_numExpectedArguments": 1 - } - }, - { - "Key": { - "Value": 4273369222 - }, - "Value": { - "m_eventName": "OnEntityDeactivated", - "m_eventId": { - "Value": 4273369222 - }, - "m_eventSlotId": { - "m_id": "{EAE4A41C-256E-4824-ACC8-E39D53F458CD}" - }, - "m_parameterSlotIds": [ - { - "m_id": "{45FC446A-4202-4027-A32B-B7E2C51CEDC2}" - } - ], - "m_numExpectedArguments": 1 - } - } - ], - "m_ebusName": "EntityBus", - "m_busId": { - "Value": 3358774020 - } - } - } - } - ], - "m_connections": [ - { - "Id": { - "id": 4604729422649 - }, - "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Begin event: On Collision Begin event)", - "Components": { - "Component_[9532858041021641376]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 9532858041021641376, - "sourceEndpoint": { - "nodeId": { - "id": 4587549553465 - }, - "slotId": { - "m_id": "{15B97793-03A4-48E8-B33D-2FE937A68EB3}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 4591844520761 - }, - "slotId": { - "m_id": "{413D67D3-A75D-471F-9144-02C0081D67B5}" - } - } - } - } - }, - { - "Id": { - "id": 4609024389945 - }, - "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Out), destEndpoint=(On Collision Begin event: Connect)", - "Components": { - "Component_[6186741522410286164]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 6186741522410286164, - "sourceEndpoint": { - "nodeId": { - "id": 4587549553465 - }, - "slotId": { - "m_id": "{EE4FD45A-25B2-4FA9-B90C-0F40F34BDB65}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 4591844520761 - }, - "slotId": { - "m_id": "{B595F7A6-279A-4073-9FA3-BF7204B5CF56}" - } - } - } - } - }, - { - "Id": { - "id": 4613319357241 - }, - "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionBeginEvent: In)", - "Components": { - "Component_[13280424214254579514]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 13280424214254579514, - "sourceEndpoint": { - "nodeId": { - "id": 4600434455353 - }, - "slotId": { - "m_id": "{4B3378FE-AA4E-4BE9-B961-95CE2216F586}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 4587549553465 - }, - "slotId": { - "m_id": "{7C152057-FC56-4A2F-B8F7-39EA3FC2C7CC}" - } - } - } - } - }, - { - "Id": { - "id": 4617614324537 - }, - "Name": "srcEndpoint=(On Collision Begin event: OnEvent), destEndpoint=(Print: In)", - "Components": { - "Component_[8114978170302224802]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 8114978170302224802, - "sourceEndpoint": { - "nodeId": { - "id": 4591844520761 - }, - "slotId": { - "m_id": "{09F80679-193F-46EB-9D93-7FB36EA7AD1B}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 4596139488057 - }, - "slotId": { - "m_id": "{DC449AA6-B928-40D2-8AB8-9ADA4518D48C}" - } - } - } - } - } - ] - }, - "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", - "versionData": { - "_grammarVersion": 1, - "_runtimeVersion": 1 - }, - "GraphCanvasData": [ - { - "Key": { - "id": 4583254586169 - }, - "Value": { - "ComponentData": { - "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { - "$type": "SceneComponentSaveData", - "ViewParams": { - "Scale": 0.6925797995160841, - "AnchorX": -306.1018981933594, - "AnchorY": -326.3161926269531 - } - } - } - } - }, - { - "Key": { - "id": 4587549553465 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 80.0, - 0.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{F33AF9D4-77BF-4027-AF45-FC9282E9220E}" - } - } - } - }, - { - "Key": { - "id": 4591844520761 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "HandlerNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 680.0, - -20.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".azeventhandler" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{F0D734ED-0ED0-46BC-9E27-F384FC04D1CF}" - } - } - } - }, - { - "Key": { - "id": 4596139488057 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "StringNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1180.0, - -20.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{F77C15FE-3EC9-4F53-A226-0C97F09C5DF6}" - } - } - } - }, - { - "Key": { - "id": 4600434455353 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -240.0, - -60.0 - ] - }, - "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { - "$type": "EBusHandlerNodeDescriptorSaveData", - "EventIds": [ - { - "Value": 245425936 - } - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{A0D0CB4B-7F74-458B-AEBD-518270413AB0}" - } - } - } - } - ], - "StatisticsHelper": { - "InstanceCounter": [ - { - "Key": 191865528901450421, - "Value": 1 - }, - { - "Key": 4847610523576971761, - "Value": 1 - }, - { - "Key": 5842116761103598202, - "Value": 1 - }, - { - "Key": 10684225535275896474, - "Value": 1 - } - ] - } - } - } - } - } -} \ No newline at end of file From 73b9f1bb40d02ed2dc8728d95a903396cf33fb2a Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Mon, 6 Sep 2021 11:42:39 +0200 Subject: [PATCH 156/355] Removed comment for line --- .../Gem/PythonTests/physics/TestSuite_Main_Optimized.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py index 6970650c77..63d3b58249 100644 --- a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py +++ b/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py @@ -54,7 +54,7 @@ class EditorSingleTest_WithFileOverrides(EditorSingleTest): fm._restore_file(f, file_list[f]) -#@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") +@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") @pytest.mark.SUITE_main @pytest.mark.parametrize("launcher_platform", ['windows_editor']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) From 6cc9a3384525b7641b0e7a79dba9b3ebcd6a0a1b Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Mon, 6 Sep 2021 11:36:17 +0100 Subject: [PATCH 157/355] Add a new implementation for cone/ray intersect to simplify code and fix issue with current implementation (#3902) * add a new implementation for cone/ray intersect to simplify and fix existing issue Signed-off-by: hultonha * move new ray/cone intersection function to AzToolsFramework - repond to PR comments Signed-off-by: hultonha * updates following PR feedback Signed-off-by: hultonha * add additional comment to give more context to the intersection function Signed-off-by: hultonha * update google test expect usage Signed-off-by: hultonha --- .../AzCore/AzCore/Math/IntersectSegment.cpp | 4 +- .../AzCore/AzCore/Math/IntersectSegment.h | 2 +- .../AzCore/Tests/Math/IntersectionTests.cpp | 15 ++++ .../Manipulators/ManipulatorBounds.cpp | 80 ++++++++++++++++++- .../Picking/Manipulators/ManipulatorBounds.h | 20 +++++ .../Tests/ManipulatorBoundsTests.cpp | 47 +++++++++++ 6 files changed, 161 insertions(+), 7 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp b/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp index fa52599c4a..a7a0d5197e 100644 --- a/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp +++ b/Code/Framework/AzCore/AzCore/Math/IntersectSegment.cpp @@ -628,7 +628,7 @@ int AZ::Intersect::IntersectRayCappedCylinder( int AZ::Intersect::IntersectRayCone( const Vector3& rayOrigin, const Vector3& rayDir, const Vector3& coneApex, const Vector3& coneDir, float coneHeight, - float coneBaseRaidus, float& t1, float& t2) + float coneBaseRadius, float& t1, float& t2) { // Q = rayOrgin, A = coneApex Vector3 AQ = rayOrigin - coneApex; @@ -646,7 +646,7 @@ int AZ::Intersect::IntersectRayCone( return 0; } - float r2 = coneBaseRaidus * coneBaseRaidus; + float r2 = coneBaseRadius * coneBaseRadius; float h2 = coneHeight * coneHeight; float m2 = m * m; diff --git a/Code/Framework/AzCore/AzCore/Math/IntersectSegment.h b/Code/Framework/AzCore/AzCore/Math/IntersectSegment.h index 3dffb90d7c..df3d5e10fb 100644 --- a/Code/Framework/AzCore/AzCore/Math/IntersectSegment.h +++ b/Code/Framework/AzCore/AzCore/Math/IntersectSegment.h @@ -240,7 +240,7 @@ namespace AZ //! @return The number of intersecting points. int IntersectRayCone( const Vector3& rayOrigin, const Vector3& rayDir, - const Vector3& coneApex, const Vector3& coneDir, float coneHeight, float coneBaseRaidus, + const Vector3& coneApex, const Vector3& coneDir, float coneHeight, float coneBaseRadius, float& t1, float& t2); //! Test intersection between a ray and a plane in 3D. diff --git a/Code/Framework/AzCore/Tests/Math/IntersectionTests.cpp b/Code/Framework/AzCore/Tests/Math/IntersectionTests.cpp index 5bebe5e4f2..e8a52f8fba 100644 --- a/Code/Framework/AzCore/Tests/Math/IntersectionTests.cpp +++ b/Code/Framework/AzCore/Tests/Math/IntersectionTests.cpp @@ -609,6 +609,21 @@ namespace UnitTest EXPECT_EQ(hits, 0); } + // replicates a scenario in the Editor using a cone and a pick ray which should have failed but passed + // note: To replicate this, select an entity so the default translation manipulator appears, move very close to the + // entity, hover the mouse over one of the manipulator linear manipulator arrows (cone part) and move the mouse away + // notice the manipulator will remain highlighted as a successful intersection is still reported + TEST(MATH_IntersectRayConeTestEditor, DISABLED_RayConeEditorScenarioTest) + { + auto rayOrigin = Vector3(0.0f, -0.808944702f, 0.0f); + auto rayDir = Vector3(0.301363617f, 0.939044654f, 0.165454566f); + float t1 = 0.0f; + float t2 = 0.0f; + int hits = Intersect::IntersectRayCone( + rayOrigin, rayDir, AZ::Vector3(0.0f, 0.0f, 0.161788940f), AZ::Vector3(0.0f, 0.0f, -1.0f), 0.0453009047, 0.0113252262, t1, t2); + EXPECT_EQ(hits, 0); + } + class MATH_IntersectRayQuadTest : public AllocatorsFixture { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.cpp index 9ede35b837..3a7fffb3be 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.cpp @@ -16,6 +16,79 @@ namespace AzToolsFramework { namespace Picking { + // this intersection algorithm is adapted from 'Capped Cone' by Inigo Quilez + // ref: https://www.iquilezles.org/www/articles/intersectors/intersectors.htm and https://www.shadertoy.com/view/llcfRf + // all algorithms/code snippets are kindly made available under the MIT License - https://www.iquilezles.org/www/index.htm + bool IntersectRayCone( + const AZ::Vector3& rayOrigin, + const AZ::Vector3& rayDirection, + const AZ::Vector3& coneApex, + const AZ::Vector3& coneAxis, + float coneHeight, + float coneBaseRadius, + float& t) + { + const AZ::Vector3& pa = coneApex; + const AZ::Vector3& pb = coneApex + coneHeight * coneAxis; + const AZ::Vector3& ro = rayOrigin; + const AZ::Vector3& rd = rayDirection; + float rb = coneBaseRadius; + + AZ::Vector3 ba = pb - pa; + AZ::Vector3 oa = ro - pa; + AZ::Vector3 ob = ro - pb; + + float m0 = ba.Dot(ba); + float m1 = oa.Dot(ba); + float m2 = ob.Dot(ba); + float m3 = rd.Dot(ba); + + auto dot2 = [](const AZ::Vector3& v) + { + return v.Dot(v); + }; + + // cap + if (m2 > 0.0f) + { + if (dot2(ob * m3 - rd * m2) < (rb * rb * m3 * m3)) + { + t = -m2 / m3; + return true; + } + } + + // body + float m4 = rd.Dot(oa); + float m5 = oa.Dot(oa); + float hy = m0 + rb * rb; + + float k2 = m0 * m0 - m3 * m3 * hy; + float k1 = m0 * m0 * m4 - m1 * m3 * hy; + float k0 = m0 * m0 * m5 - m1 * m1 * hy; + + // note: solving for simultaneously being on the sloping surface of the cone and being on the ray boils down + // to a quadratic equation - the discriminant of the quadratic determines if there are 1, 2 or no solutions + // + // if the discriminant is less than 0 the ray is not intersecting the cone, if it is equal to 0 then the ray + // is intersecting the cone once and if it is greater than 0 the ray is intersecting the cone twice + float discriminant = k1 * k1 - k2 * k0; + if (discriminant < 0.0f) + { + return false; + } + + float tt = (-k1 - AZ::Sqrt(discriminant)) / k2; + float y = m1 + tt * m3; + if (y >= 0.0f && y < m0) + { + t = tt; + return true; + } + + return false; + } + bool ManipulatorBoundSphere::IntersectRay( const AZ::Vector3& rayOrigin, const AZ::Vector3& rayDirection, float& rayIntersectionDistance) { @@ -86,11 +159,10 @@ namespace AzToolsFramework bool ManipulatorBoundCone::IntersectRay( const AZ::Vector3& rayOrigin, const AZ::Vector3& rayDirection, float& rayIntersectionDistance) { - float t1 = std::numeric_limits::max(); - float t2 = std::numeric_limits::max(); - if (AZ::Intersect::IntersectRayCone(rayOrigin, rayDirection, m_apexPosition, m_dir, m_height, m_radius, t1, t2) > 0) + float t = std::numeric_limits::max(); + if (IntersectRayCone(rayOrigin, rayDirection, m_apexPosition, m_dir, m_height, m_radius, t)) { - rayIntersectionDistance = AZStd::GetMin(t1, t2); + rayIntersectionDistance = t; return true; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.h index 55a276f87b..59f339c129 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Picking/Manipulators/ManipulatorBounds.h @@ -23,6 +23,26 @@ namespace AzToolsFramework { namespace Picking { + //! Custom ray/cone intersect function for manipulator bounds to workaround a bug in the current AZ::Intersect implementation. + //! @note Does not give reliable results if the ray origin is inside the cone. + //! @param rayOrigin The origin of the ray to test. + //! @param rayDirection The direction of the ray to test, it must be unit length. + //! @param coneApex The apex of the cone. + //! @param coneAxis The unit-length axis (direction) from the apex to the base. + //! @param coneHeight The height of the cone, from the apex to the base. + //! @param coneBaseRadius The radius of the cone base. + //! @param[out] t A possible coefficient in the ray's explicit equation from which an intersecting point is calculated + //! as "rayOrigin + t * rayDirection". 't' is the closest intersecting point to the ray origin. + //! @return true for intersecting, false for not intersecting. + bool IntersectRayCone( + const AZ::Vector3& rayOrigin, + const AZ::Vector3& rayDirection, + const AZ::Vector3& coneApex, + const AZ::Vector3& coneAxis, + float coneHeight, + float coneBaseRadius, + float& t); + class ManipulatorBoundSphere : public BoundShapeInterface { public: diff --git a/Code/Framework/AzToolsFramework/Tests/ManipulatorBoundsTests.cpp b/Code/Framework/AzToolsFramework/Tests/ManipulatorBoundsTests.cpp index 1c3303269d..bca1624290 100644 --- a/Code/Framework/AzToolsFramework/Tests/ManipulatorBoundsTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ManipulatorBoundsTests.cpp @@ -187,4 +187,51 @@ namespace UnitTest EXPECT_NEAR(intersectionDistance, 10.0f, g_epsilon); EXPECT_TRUE(intersection); } + + // replicates a scenario in the Editor using a cone and a pick ray which should have failed but passed with Intersect::IntersectRayCone + TEST(ManipulatorIntersectRayConeTest, RayConeEditorScenarioTest) + { + auto rayOrigin = AZ::Vector3(0.0f, -0.808944702f, 0.0f); + auto rayDir = AZ::Vector3(0.301363617f, 0.939044654f, 0.165454566f); + float t = 0.0f; + bool hit = AzToolsFramework::Picking::IntersectRayCone( + rayOrigin, rayDir, AZ::Vector3(0.0f, 0.0f, 0.161788940f), AZ::Vector3(0.0f, 0.0f, -1.0f), 0.0453009047, 0.0113252262, t); + EXPECT_FALSE(hit); + } + + // cone lying flat, ray going towards base of cone + TEST(ManipulatorIntersectRayConeTest, RayIntersectsConeBase) + { + auto rayOrigin = AZ::Vector3::CreateZero(); + auto rayDir = AZ::Vector3::CreateAxisY(); + float t = 0.0f; + bool hit = AzToolsFramework::Picking::IntersectRayCone( + rayOrigin, rayDir, AZ::Vector3::CreateAxisY(10.0f), AZ::Vector3::CreateAxisY(-1.0f), 5.0f, 1.0f, t); + EXPECT_TRUE(hit); + EXPECT_THAT(t, ::testing::FloatNear(5.0f, 0.0001f)); + } + + // cone standing up, ray going towards mid side of cone + TEST(ManipulatorIntersectRayConeTest, RayIntersectsConeSide) + { + auto rayOrigin = AZ::Vector3::CreateZero(); + auto rayDir = AZ::Vector3::CreateAxisY(); + float t = 0.0f; + bool hit = AzToolsFramework::Picking::IntersectRayCone( + rayOrigin, rayDir, AZ::Vector3(0.0f, 10.0f, 5.0f), AZ::Vector3::CreateAxisZ(-1.0f), 10.0f, 5.0f, t); + EXPECT_TRUE(hit); + EXPECT_THAT(t, ::testing::FloatNear(7.5f, 0.0001f)); + } + + // cone standing up, ray going towards mid side of cone + TEST(ManipulatorIntersectRayConeTest, RayIntersectsConeApex) + { + auto rayOrigin = AZ::Vector3::CreateZero(); + auto rayDir = AZ::Vector3::CreateAxisY(); + float t = 0.0f; + bool hit = AzToolsFramework::Picking::IntersectRayCone( + rayOrigin, rayDir, AZ::Vector3::CreateAxisY(2.5f), AZ::Vector3::CreateAxisY(1.0f), 5.0f, 1.0f, t); + EXPECT_TRUE(hit); + EXPECT_THAT(t, ::testing::FloatNear(2.5f, 0.0001f)); + } } // namespace UnitTest From a374ea29f214ef07b1f6741813362d3b9fe639e2 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Mon, 6 Sep 2021 14:22:57 +0100 Subject: [PATCH 158/355] Expose setting to adjust angular manipulator circle bound (#3932) * add debug drawing for angular manipulator bounds Signed-off-by: hultonha * remove editor viewport settings from RenderViewport Signed-off-by: hultonha * add setting for angular manipulator circle bound Signed-off-by: hultonha * update minimum value allowed for some camera settings Signed-off-by: hultonha * updates following review feedback, some small tidy-up Signed-off-by: hultonha * update comment Signed-off-by: hultonha --- .../EditorPreferencesPageViewportGizmo.cpp | 12 ++++- .../EditorPreferencesPageViewportGizmo.h | 3 +- .../EditorPreferencesPageViewportMovement.cpp | 17 ++++--- Code/Editor/EditorViewportSettings.cpp | 11 +++++ Code/Editor/EditorViewportSettings.h | 3 ++ Code/Editor/EditorViewportWidget.cpp | 31 ++++++------ Code/Editor/EditorViewportWidget.h | 21 +++++++- .../ViewportInteraction.h | 28 ++++++----- .../Source/ViewportInteraction.cpp | 19 ++++--- .../Tests/ViewportInteractionTest.cpp | 24 ++++----- .../Manipulators/EditorVertexSelection.cpp | 3 +- .../Manipulators/ManipulatorSnapping.cpp | 20 ++++---- .../Manipulators/ManipulatorView.cpp | 34 ++++++++++--- .../Manipulators/RotationManipulators.cpp | 11 ++++- .../Manipulators/RotationManipulators.h | 4 ++ .../Viewport/ViewportMessages.cpp | 46 +++++++++++++++++ .../Viewport/ViewportMessages.h | 49 ++++++------------- .../EditorTransformComponentSelection.cpp | 9 ++-- .../aztoolsframework_files.cmake | 1 + .../Viewport/RenderViewportWidget.h | 13 +---- .../Source/Viewport/RenderViewportWidget.cpp | 35 ------------- .../EditorPolygonPrismShapeComponentMode.cpp | 2 +- .../Code/Editor/ColliderRotationMode.cpp | 2 +- .../EditorSubComponentModeAngleCone.cpp | 2 +- .../Editor/EditorSubComponentModeRotation.cpp | 5 +- 25 files changed, 239 insertions(+), 166 deletions(-) create mode 100644 Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp diff --git a/Code/Editor/EditorPreferencesPageViewportGizmo.cpp b/Code/Editor/EditorPreferencesPageViewportGizmo.cpp index 5d1ae53e85..d1578f4f9c 100644 --- a/Code/Editor/EditorPreferencesPageViewportGizmo.cpp +++ b/Code/Editor/EditorPreferencesPageViewportGizmo.cpp @@ -16,7 +16,10 @@ void CEditorPreferencesPage_ViewportManipulator::Reflect(AZ::SerializeContext& serialize) { - serialize.Class()->Version(1)->Field("LineBoundWidth", &Manipulators::m_manipulatorLineBoundWidth); + serialize.Class() + ->Version(1) + ->Field("LineBoundWidth", &Manipulators::m_manipulatorLineBoundWidth) + ->Field("CircleBoundWidth", &Manipulators::m_manipulatorCircleBoundWidth); serialize.Class()->Version(2)->Field( "Manipulators", &CEditorPreferencesPage_ViewportManipulator::m_manipulators); @@ -28,6 +31,11 @@ void CEditorPreferencesPage_ViewportManipulator::Reflect(AZ::SerializeContext& s AZ::Edit::UIHandlers::SpinBox, &Manipulators::m_manipulatorLineBoundWidth, "Line Bound Width", "Manipulator Line Bound Width") ->Attribute(AZ::Edit::Attributes::Min, 0.001f) + ->Attribute(AZ::Edit::Attributes::Max, 2.0f) + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &Manipulators::m_manipulatorCircleBoundWidth, "Circle Bound Width", + "Manipulator Circle Bound Width") + ->Attribute(AZ::Edit::Attributes::Min, 0.001f) ->Attribute(AZ::Edit::Attributes::Max, 2.0f); editContext @@ -53,9 +61,11 @@ QIcon& CEditorPreferencesPage_ViewportManipulator::GetIcon() void CEditorPreferencesPage_ViewportManipulator::OnApply() { SandboxEditor::SetManipulatorLineBoundWidth(m_manipulators.m_manipulatorLineBoundWidth); + SandboxEditor::SetManipulatorCircleBoundWidth(m_manipulators.m_manipulatorCircleBoundWidth); } void CEditorPreferencesPage_ViewportManipulator::InitializeSettings() { m_manipulators.m_manipulatorLineBoundWidth = SandboxEditor::ManipulatorLineBoundWidth(); + m_manipulators.m_manipulatorCircleBoundWidth = SandboxEditor::ManipulatorCircleBoundWidth(); } diff --git a/Code/Editor/EditorPreferencesPageViewportGizmo.h b/Code/Editor/EditorPreferencesPageViewportGizmo.h index d013216736..52270c3b0d 100644 --- a/Code/Editor/EditorPreferencesPageViewportGizmo.h +++ b/Code/Editor/EditorPreferencesPageViewportGizmo.h @@ -53,7 +53,8 @@ private: { AZ_TYPE_INFO(Manipulators, "{2974439C-4839-41F6-B526-F317999B9DB9}") - float m_manipulatorLineBoundWidth; + float m_manipulatorLineBoundWidth = 0.0f; + float m_manipulatorCircleBoundWidth = 0.0f; }; Manipulators m_manipulators; diff --git a/Code/Editor/EditorPreferencesPageViewportMovement.cpp b/Code/Editor/EditorPreferencesPageViewportMovement.cpp index 74abb3f207..8b8506d694 100644 --- a/Code/Editor/EditorPreferencesPageViewportMovement.cpp +++ b/Code/Editor/EditorPreferencesPageViewportMovement.cpp @@ -100,29 +100,30 @@ void CEditorPreferencesPage_ViewportMovement::Reflect(AZ::SerializeContext& seri if (AZ::EditContext* editContext = serialize.GetEditContext()) { + const float minValue = 0.0001f; editContext->Class("Camera Movement Settings", "") ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_translateSpeed, "Camera Movement Speed", "Camera movement speed") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_rotateSpeed, "Camera Rotation Speed", "Camera rotation speed") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_boostMultiplier, "Camera Boost Multiplier", "Camera boost multiplier to apply to movement speed") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_scrollSpeed, "Camera Scroll Speed", "Camera movement speed while using scroll/wheel input") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_dollySpeed, "Camera Dolly Speed", "Camera movement speed while using mouse motion to move in and out") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_panSpeed, "Camera Pan Speed", "Camera movement speed while panning using the mouse") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->DataElement( AZ::Edit::UIHandlers::CheckBox, &CameraMovementSettings::m_rotateSmoothing, "Camera Rotate Smoothing", "Is camera rotation smoothing enabled or disabled") @@ -130,7 +131,7 @@ void CEditorPreferencesPage_ViewportMovement::Reflect(AZ::SerializeContext& seri ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_rotateSmoothness, "Camera Rotate Smoothness", "Amount of camera smoothing to apply while rotating the camera") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->Attribute(AZ::Edit::Attributes::Visibility, &CameraMovementSettings::RotateSmoothingVisibility) ->DataElement( AZ::Edit::UIHandlers::CheckBox, &CameraMovementSettings::m_translateSmoothing, "Camera Translate Smoothing", @@ -139,7 +140,7 @@ void CEditorPreferencesPage_ViewportMovement::Reflect(AZ::SerializeContext& seri ->DataElement( AZ::Edit::UIHandlers::SpinBox, &CameraMovementSettings::m_translateSmoothness, "Camera Translate Smoothness", "Amount of camera smoothing to apply while translating the camera") - ->Attribute(AZ::Edit::Attributes::Min, 0.01f) + ->Attribute(AZ::Edit::Attributes::Min, minValue) ->Attribute(AZ::Edit::Attributes::Visibility, &CameraMovementSettings::TranslateSmoothingVisibility) ->DataElement( AZ::Edit::UIHandlers::CheckBox, &CameraMovementSettings::m_orbitYawRotationInverted, "Camera Orbit Yaw Inverted", diff --git a/Code/Editor/EditorViewportSettings.cpp b/Code/Editor/EditorViewportSettings.cpp index 52581d9222..c1bd85a174 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -21,6 +21,7 @@ namespace SandboxEditor constexpr AZStd::string_view AngleSizeSetting = "/Amazon/Preferences/Editor/AngleSize"; constexpr AZStd::string_view ShowGridSetting = "/Amazon/Preferences/Editor/ShowGrid"; constexpr AZStd::string_view ManipulatorLineBoundWidthSetting = "/Amazon/Preferences/Editor/Manipulator/LineBoundWidth"; + constexpr AZStd::string_view ManipulatorCircleBoundWidthSetting = "/Amazon/Preferences/Editor/Manipulator/CircleBoundWidth"; constexpr AZStd::string_view CameraTranslateSpeedSetting = "/Amazon/Preferences/Editor/Camera/TranslateSpeed"; constexpr AZStd::string_view CameraBoostMultiplierSetting = "/Amazon/Preferences/Editor/Camera/BoostMultiplier"; constexpr AZStd::string_view CameraRotateSpeedSetting = "/Amazon/Preferences/Editor/Camera/RotateSpeed"; @@ -167,6 +168,16 @@ namespace SandboxEditor SetRegistry(ManipulatorLineBoundWidthSetting, lineBoundWidth); } + float ManipulatorCircleBoundWidth() + { + return aznumeric_cast(GetRegistry(ManipulatorCircleBoundWidthSetting, 0.1)); + } + + void SetManipulatorCircleBoundWidth(const float circleBoundWidth) + { + SetRegistry(ManipulatorCircleBoundWidthSetting, circleBoundWidth); + } + float CameraTranslateSpeed() { return aznumeric_cast(GetRegistry(CameraTranslateSpeedSetting, 10.0)); diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index a5b119e03d..8aeeee1384 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -50,6 +50,9 @@ namespace SandboxEditor SANDBOX_API float ManipulatorLineBoundWidth(); SANDBOX_API void SetManipulatorLineBoundWidth(float lineBoundWidth); + SANDBOX_API float ManipulatorCircleBoundWidth(); + SANDBOX_API void SetManipulatorCircleBoundWidth(float circleBoundWidth); + SANDBOX_API float CameraTranslateSpeed(); SANDBOX_API void SetCameraTranslateSpeed(float speed); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 139bb03f12..b33469affb 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -113,19 +113,6 @@ void StartFixedCursorMode(QObject *viewport); #define RENDER_MESH_TEST_DISTANCE (0.2f) #define CURSOR_FONT_HEIGHT 8.0f -//! Viewport settings for the EditorViewportWidget -struct EditorViewportSettings : public AzToolsFramework::ViewportInteraction::ViewportSettings -{ - bool GridSnappingEnabled() const override; - float GridSize() const override; - bool ShowGrid() const override; - bool AngleSnappingEnabled() const override; - float AngleStep() const override; - float ManipulatorLineBoundWidth() const override; -}; - -static const EditorViewportSettings g_EditorViewportSettings; - namespace AZ::ViewportHelpers { static const char TextCantCreateCameraNoLevel[] = "Cannot create camera when no level is loaded."; @@ -219,6 +206,7 @@ EditorViewportWidget::~EditorViewportWidget() m_pPrimaryViewport = nullptr; } + m_editorViewportSettings.Disconnect(); DisconnectViewportInteractionRequestBus(); m_editorEntityNotifications.reset(); Camera::EditorCameraRequestBus::Handler::BusDisconnect(); @@ -1074,7 +1062,7 @@ void EditorViewportWidget::SetViewportId(int id) m_editorModularViewportCameraComposer = AZStd::make_unique(AzFramework::ViewportId(id)); m_renderViewport->GetControllerList()->Add(m_editorModularViewportCameraComposer->CreateModularViewportCameraController()); - m_renderViewport->SetViewportSettings(&g_EditorViewportSettings); + m_editorViewportSettings.Connect(AzFramework::ViewportId(id)); UpdateScene(); @@ -2535,6 +2523,16 @@ void EditorViewportWidget::SetAsActiveViewport() } } +void EditorViewportSettings::Connect(const AzFramework::ViewportId viewportId) +{ + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusConnect(viewportId); +} + +void EditorViewportSettings::Disconnect() +{ + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusDisconnect(); +} + bool EditorViewportSettings::GridSnappingEnabled() const { return SandboxEditor::GridSnappingEnabled(); @@ -2565,6 +2563,11 @@ float EditorViewportSettings::ManipulatorLineBoundWidth() const return SandboxEditor::ManipulatorLineBoundWidth(); } +float EditorViewportSettings::ManipulatorCircleBoundWidth() const +{ + return SandboxEditor::ManipulatorCircleBoundWidth(); +} + AZ_CVAR_EXTERNED(bool, ed_previewGameInFullscreen_once); bool EditorViewportWidget::ShouldPreviewFullscreen() const diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index 9da5e3f9a1..5d332ae3f0 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -63,6 +63,22 @@ namespace AzToolsFramework class ManipulatorManager; } +//! Viewport settings for the EditorViewportWidget +struct EditorViewportSettings : public AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler +{ + void Connect(AzFramework::ViewportId viewportId); + void Disconnect(); + + // ViewportSettingsRequestBus overrides ... + bool GridSnappingEnabled() const override; + float GridSize() const override; + bool ShowGrid() const override; + bool AngleSnappingEnabled() const override; + float AngleStep() const override; + float ManipulatorLineBoundWidth() const override; + float ManipulatorCircleBoundWidth() const override; +}; + // EditorViewportWidget window AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING @@ -338,7 +354,7 @@ private: // Note that any attempts to draw anything with this object will crash. Exists here for legacy "reasons" DisplayContext m_displayContext; - // Re-entrency guard for on paint events + // Reentrancy guard for on paint events bool m_isOnPaint = false; // Shapes of various safe frame helpers which can be displayed in the editor @@ -381,6 +397,9 @@ private: // Atom debug display AzFramework::DebugDisplayRequests* m_debugDisplay = nullptr; + // Type to return current state of editor viewport settings + EditorViewportSettings m_editorViewportSettings; + // The default view created for the viewport context, which is used as the "Editor Camera" AZ::RPI::ViewPtr m_defaultView; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index 5e8de066e3..b6944e0355 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -17,14 +17,14 @@ namespace AzManipulatorTestFramework //! Implementation of the viewport interaction model to handle viewport interaction requests. class ViewportInteraction : public ViewportInteractionInterface - , private AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler + , public AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler + , public AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler { public: ViewportInteraction(); ~ViewportInteraction(); - // ViewportInteractionInterface ... - AzFramework::CameraState GetCameraState() override; + // ViewportInteractionInterface overrides ... void SetCameraState(const AzFramework::CameraState& cameraState) override; AzFramework::DebugDisplayRequests& GetDebugDisplay() override; void EnableGridSnaping() override; @@ -34,20 +34,24 @@ namespace AzManipulatorTestFramework void SetGridSize(float size) override; void SetAngularStep(float step) override; int GetViewportId() const override; + + // ViewportInteractionRequestBus overrides ... + AzFramework::CameraState GetCameraState() override; + AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition); AZStd::optional ViewportScreenToWorld(const AzFramework::ScreenPoint& screenPosition, float depth) override; AZStd::optional ViewportScreenToWorldRay( const AzFramework::ScreenPoint& screenPosition) override; float DeviceScalingFactor() override; - private: - // ViewportInteractionRequestBus ... - bool GridSnappingEnabled() override; - float GridSize() override; - bool ShowGrid() override; - bool AngleSnappingEnabled() override; - float AngleStep() override; - float ManipulatorLineBoundWidth() override; - AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition); + // ViewportSettingsRequestBus overrides ... + bool GridSnappingEnabled() const override; + float GridSize() const override; + bool ShowGrid() const override; + bool AngleSnappingEnabled() const override; + float AngleStep() const override; + float ManipulatorLineBoundWidth() const override; + float ManipulatorCircleBoundWidth() const override; + private: AZStd::unique_ptr m_nullDebugDisplayRequests; const int m_viewportId = 1234; // Arbitrary viewport id for manipulator tests diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 77c4bb72f7..0817df3849 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -25,10 +25,12 @@ namespace AzManipulatorTestFramework : m_nullDebugDisplayRequests(AZStd::make_unique()) { AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler::BusConnect(m_viewportId); + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusConnect(m_viewportId); } ViewportInteraction::~ViewportInteraction() { + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler::BusDisconnect(); } @@ -37,32 +39,37 @@ namespace AzManipulatorTestFramework return m_cameraState; } - bool ViewportInteraction::GridSnappingEnabled() + bool ViewportInteraction::GridSnappingEnabled() const { return m_gridSnapping; } - float ViewportInteraction::GridSize() + float ViewportInteraction::GridSize() const { return m_gridSize; } - bool ViewportInteraction::ShowGrid() + bool ViewportInteraction::ShowGrid() const { return false; } - bool ViewportInteraction::AngleSnappingEnabled() + bool ViewportInteraction::AngleSnappingEnabled() const { return m_angularSnapping; } - float ViewportInteraction::AngleStep() + float ViewportInteraction::AngleStep() const { return m_angularStep; } - float ViewportInteraction::ManipulatorLineBoundWidth() + float ViewportInteraction::ManipulatorLineBoundWidth() const + { + return 0.1f; + } + + float ViewportInteraction::ManipulatorCircleBoundWidth() const { return 0.1f; } diff --git a/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp b/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp index 05502afa29..f1fba39651 100644 --- a/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp @@ -49,9 +49,9 @@ namespace UnitTest bool snapping = false; m_viewportInteraction->EnableGridSnaping(); - AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult( + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::GridSnappingEnabled); + &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::GridSnappingEnabled); EXPECT_TRUE(snapping); } @@ -61,9 +61,9 @@ namespace UnitTest bool snapping = true; m_viewportInteraction->DisableGridSnaping(); - AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult( + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::GridSnappingEnabled); + &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::GridSnappingEnabled); EXPECT_FALSE(snapping); } @@ -76,9 +76,9 @@ namespace UnitTest m_viewportInteraction->SetGridSize(expectedGridSize); m_viewportInteraction->DisableGridSnaping(); - AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult( + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( gridSize, m_viewportInteraction->GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::GridSize); + &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::GridSize); EXPECT_EQ(gridSize, expectedGridSize); } @@ -88,9 +88,9 @@ namespace UnitTest bool snapping = false; m_viewportInteraction->EnableAngularSnaping(); - AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult( + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::AngleSnappingEnabled); + &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::AngleSnappingEnabled); EXPECT_TRUE(snapping); } @@ -100,9 +100,9 @@ namespace UnitTest bool snapping = true; m_viewportInteraction->DisableAngularSnaping(); - AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult( + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::AngleSnappingEnabled); + &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::AngleSnappingEnabled); EXPECT_FALSE(snapping); } @@ -114,9 +114,9 @@ namespace UnitTest m_viewportInteraction->SetAngularStep(expectedAngularStep); - AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::EventResult( + AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( angularStep, m_viewportInteraction->GetViewportId(), - &AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Events::AngleStep); + &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::AngleStep); EXPECT_EQ(angularStep, expectedAngularStep); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp index b74d81e9fc..af5a9004e3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp @@ -226,8 +226,7 @@ namespace AzToolsFramework m_translationManipulator = AZStd::make_shared>( Dimensions(), vertexIndex, vertex, WorldFromLocalWithUniformScale(entityComponentIdPair.GetEntityId()), GetNonUniformScale(entityComponentIdPair.GetEntityId())); - m_translationManipulator->m_manipulator.SetLineBoundWidth( - AzToolsFramework::ManipulatorLineBoundWidth(AzFramework::InvalidViewportId)); + m_translationManipulator->m_manipulator.SetLineBoundWidth(AzToolsFramework::ManipulatorLineBoundWidth()); // setup how the manipulator should look m_manipulatorConfiguratorFn(&m_translationManipulator->m_manipulator); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorSnapping.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorSnapping.cpp index fdc572ab05..e4f6b3b1ea 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorSnapping.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorSnapping.cpp @@ -137,8 +137,8 @@ namespace AzToolsFramework bool GridSnapping(const int viewportId) { bool snapping = false; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - snapping, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::GridSnappingEnabled); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + snapping, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::GridSnappingEnabled); return snapping; } @@ -146,8 +146,8 @@ namespace AzToolsFramework float GridSize(const int viewportId) { float gridSize = 0.0f; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - gridSize, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::GridSize); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + gridSize, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::GridSize); return gridSize; } @@ -168,8 +168,8 @@ namespace AzToolsFramework bool AngleSnapping(const int viewportId) { bool snapping = false; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - snapping, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::AngleSnappingEnabled); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + snapping, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::AngleSnappingEnabled); return snapping; } @@ -177,8 +177,8 @@ namespace AzToolsFramework float AngleStep(const int viewportId) { float angle = 0.0f; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - angle, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::AngleStep); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + angle, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::AngleStep); return angle; } @@ -186,8 +186,8 @@ namespace AzToolsFramework bool ShowingGrid(const int viewportId) { bool show = false; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - show, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::ShowGrid); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + show, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::ShowGrid); return show; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp index 07d4bf7517..d3c94dc8ab 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/ManipulatorView.cpp @@ -8,9 +8,9 @@ #include "ManipulatorView.h" -#include #include #include +#include #include #include #include @@ -413,8 +413,8 @@ namespace AzToolsFramework m_axis, m_cameraCorrectedAxis, managerState, mouseInteraction, manipulatorState.m_worldFromLocal, manipulatorState.m_localPosition, cameraState); - const auto worldLine = CalculateLine( - manipulatorState.m_localPosition, manipulatorState.m_worldFromLocal, m_cameraCorrectedAxis, m_length * viewScale); + const auto worldLine = + CalculateLine(manipulatorState.m_localPosition, manipulatorState.m_worldFromLocal, m_cameraCorrectedAxis, m_length * viewScale); debugDisplay.SetColor(ViewColor(manipulatorState.m_mouseOver, m_color, m_mouseOverColor).GetAsVector4()); debugDisplay.SetLineWidth(defaultLineWidth(manipulatorState.m_mouseOver)); @@ -612,13 +612,30 @@ namespace AzToolsFramework const Picking::BoundShapeTorus torusBound = CalculateTorusBound( manipulatorState.m_localPosition, manipulatorState.m_worldFromLocal, m_axis, m_radius * viewScale, m_width * viewScale); - // transform circle based on delta between default z up axis and other axes - const AZ::Transform worldFromLocalWithOrientation = - AZ::Transform::CreateTranslation(manipulatorState.m_worldFromLocal.GetTranslation()) * + const AZ::Transform orientation = AZ::Transform::CreateFromQuaternion((QuaternionFromTransformNoScaling(manipulatorState.m_worldFromLocal) * AZ::Quaternion::CreateShortestArc(AZ::Vector3::CreateAxisZ(), m_axis)) .GetNormalized()); + // transform circle based on delta between default z up axis and other axes + const AZ::Transform worldFromLocalWithOrientation = + AZ::Transform::CreateTranslation(manipulatorState.m_worldFromLocal.GetTranslation()) * orientation; + + if (ed_manipulatorDisplayBoundDebug) + { + debugDisplay.SetColor(AZ::Colors::BlanchedAlmond); + debugDisplay.PushMatrix(orientation); + debugDisplay.DrawCircle(torusBound.m_center + AZ::Vector3::CreateAxisZ() * torusBound.m_minorRadius, torusBound.m_majorRadius); + debugDisplay.DrawCircle( + torusBound.m_center + AZ::Vector3::CreateAxisZ() * torusBound.m_minorRadius, + torusBound.m_majorRadius + torusBound.m_minorRadius); + debugDisplay.DrawCircle(torusBound.m_center - AZ::Vector3::CreateAxisZ() * torusBound.m_minorRadius, torusBound.m_majorRadius); + debugDisplay.DrawCircle( + torusBound.m_center - AZ::Vector3::CreateAxisZ() * torusBound.m_minorRadius, + torusBound.m_majorRadius + torusBound.m_minorRadius); + debugDisplay.PopMatrix(); + } + debugDisplay.CullOn(); debugDisplay.PushMatrix(worldFromLocalWithOrientation); debugDisplay.SetColor(ViewColor(manipulatorState.m_mouseOver, m_color, m_mouseOverColor).GetAsVector4()); @@ -638,7 +655,10 @@ namespace AzToolsFramework } void DrawFullCircle( - AzFramework::DebugDisplayRequests& debugDisplay, const AZ::Vector3& position, const float radius, const AZ::Vector3& /*viewPos*/) + AzFramework::DebugDisplayRequests& debugDisplay, + const AZ::Vector3& position, + const float radius, + [[maybe_unused]] const AZ::Vector3& viewPos) { debugDisplay.DrawCircle(position, radius); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.cpp index 3ba9c3d8c7..4f3d369777 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.cpp @@ -130,11 +130,13 @@ namespace AzToolsFramework for (size_t manipulatorIndex = 0; manipulatorIndex < m_localAngularManipulators.size(); ++manipulatorIndex) { m_localAngularManipulators[manipulatorIndex]->SetView(CreateManipulatorViewCircle( - *m_localAngularManipulators[manipulatorIndex], colors[manipulatorIndex], radius, 0.05f, DrawHalfDottedCircle)); + *m_localAngularManipulators[manipulatorIndex], colors[manipulatorIndex], radius, m_circleBoundWidth, DrawHalfDottedCircle)); } + const float viewAlignedScale = 1.12f; m_viewAngularManipulator->SetView(CreateManipulatorViewCircle( - *m_viewAngularManipulator, AZ::Color(1.0f, 1.0f, 1.0f, 1.0f), radius + (radius * 0.12f), 0.05f, DrawFullCircle)); + *m_viewAngularManipulator, AZ::Color(1.0f, 1.0f, 1.0f, 1.0f), radius * viewAlignedScale, m_circleBoundWidth, + DrawFullCircle)); } bool RotationManipulators::PerformingActionViewAxis() const @@ -151,4 +153,9 @@ namespace AzToolsFramework manipulatorFn(m_viewAngularManipulator.get()); } + + void RotationManipulators::SetCircleBoundWidth(const float circleBoundWidth) + { + m_circleBoundWidth = circleBoundWidth; + } } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.h index 172ec189f0..e7e3ae5eee 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/RotationManipulators.h @@ -42,6 +42,9 @@ namespace AzToolsFramework bool PerformingActionViewAxis() const; + //! Sets the bound width to use for the circle (torus) of an angular manipulator. + void SetCircleBoundWidth(float circleBoundWidth); + private: AZ_DISABLE_COPY_MOVE(RotationManipulators) @@ -49,5 +52,6 @@ namespace AzToolsFramework AZStd::array, 3> m_localAngularManipulators; AZStd::shared_ptr m_viewAngularManipulator; + float m_circleBoundWidth = 0.1f; //!< The default circle bound width for the angular manipulator torus. }; } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp new file mode 100644 index 0000000000..955ee61525 --- /dev/null +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include + +namespace AzToolsFramework +{ + float ManipulatorLineBoundWidth(const AzFramework::ViewportId viewportId /*= AzFramework::InvalidViewportId*/) + { + float lineBoundWidth = 0.0f; + if (viewportId != AzFramework::InvalidViewportId) + { + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + lineBoundWidth, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::ManipulatorLineBoundWidth); + } + else + { + ViewportInteraction::ViewportSettingsRequestBus::BroadcastResult( + lineBoundWidth, &ViewportInteraction::ViewportSettingsRequestBus::Events::ManipulatorLineBoundWidth); + } + + return lineBoundWidth; + } + + float ManipulatorCicleBoundWidth(const AzFramework::ViewportId viewportId /*= AzFramework::InvalidViewportId*/) + { + float circleBoundWidth = 0.0f; + if (viewportId != AzFramework::InvalidViewportId) + { + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + circleBoundWidth, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::ManipulatorCircleBoundWidth); + } + else + { + ViewportInteraction::ViewportSettingsRequestBus::BroadcastResult( + circleBoundWidth, &ViewportInteraction::ViewportSettingsRequestBus::Events::ManipulatorCircleBoundWidth); + } + + return circleBoundWidth; + } +} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index 5c2160b341..147c71c8e8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -158,18 +158,6 @@ namespace AzToolsFramework public: //! Returns the current camera state for this viewport. virtual AzFramework::CameraState GetCameraState() = 0; - //! Returns if grid snapping is enabled. - virtual bool GridSnappingEnabled() = 0; - //! Returns the grid snapping size. - virtual float GridSize() = 0; - //! Does the grid currently want to be displayed. - virtual bool ShowGrid() = 0; - //! Returns if angle snapping is enabled. - virtual bool AngleSnappingEnabled() = 0; - //! Returns the angle snapping/step size. - virtual float AngleStep() = 0; - //! Returns the current line bound width for manipulators. - virtual float ManipulatorLineBoundWidth() = 0; //! Transforms a point in world space to screen space coordinates in Qt Widget space. //! Multiply by DeviceScalingFactor to get the position in viewport pixel space. virtual AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition) = 0; @@ -187,12 +175,13 @@ namespace AzToolsFramework ~ViewportInteractionRequests() = default; }; + //! Type to inherit to implement ViewportInteractionRequests. + using ViewportInteractionRequestBus = AZ::EBus; + //! Interface to return only viewport specific settings (e.g. snapping). - class ViewportSettings + class ViewportSettingsRequests { public: - virtual ~ViewportSettings() = default; - //! Return if grid snapping is enabled. virtual bool GridSnappingEnabled() const = 0; //! Return the grid snapping size. @@ -205,10 +194,15 @@ namespace AzToolsFramework virtual float AngleStep() const = 0; //! Returns the current line bound width for manipulators. virtual float ManipulatorLineBoundWidth() const = 0; + //! Returns the current circle (torus) bound width for manipulators. + virtual float ManipulatorCircleBoundWidth() const = 0; + + protected: + ~ViewportSettingsRequests() = default; }; - //! Type to inherit to implement ViewportInteractionRequests. - using ViewportInteractionRequestBus = AZ::EBus; + //! Type to inherit to implement ViewportSettingsRequests. + using ViewportSettingsRequestBus = AZ::EBus; //! An interface to notify when changes to viewport settings have happened. class ViewportSettingNotifications @@ -346,21 +340,10 @@ namespace AzToolsFramework } //! Wrap EBus call to retrieve manipulator line bound width. - //! @note It is possible to pass AzFramework::InvalidViewportId to perform a Broadcast as opposed to a targeted Event. - inline float ManipulatorLineBoundWidth(AzFramework::ViewportId viewportId) - { - float lineBoundWidth = 0.0f; - if (viewportId != AzFramework::InvalidViewportId) - { - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - lineBoundWidth, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::ManipulatorLineBoundWidth); - } - else - { - ViewportInteraction::ViewportInteractionRequestBus::BroadcastResult( - lineBoundWidth, &ViewportInteraction::ViewportInteractionRequestBus::Events::ManipulatorLineBoundWidth); - } + //! @note It is possible to pass AzFramework::InvalidViewportId (the default) to perform a Broadcast as opposed to a targeted Event. + float ManipulatorLineBoundWidth(AzFramework::ViewportId viewportId = AzFramework::InvalidViewportId); - return lineBoundWidth; - } + //! Wrap EBus call to retrieve manipulator circle bound width. + //! @note It is possible to pass AzFramework::InvalidViewportId (the default) to perform a Broadcast as opposed to a targeted Event. + float ManipulatorCicleBoundWidth(AzFramework::ViewportId viewportId = AzFramework::InvalidViewportId); } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index fa263334fe..101d7094db 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -488,8 +488,8 @@ namespace AzToolsFramework void SnappingCluster::TrySetVisible(const bool visible) { bool snapping = false; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - snapping, ViewportUi::DefaultViewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::GridSnappingEnabled); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + snapping, ViewportUi::DefaultViewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::GridSnappingEnabled); // show snapping viewport ui only if there are entities selected and snapping is enabled SetViewportUiClusterVisible(m_clusterId, visible && snapping); @@ -1377,6 +1377,7 @@ namespace AzToolsFramework AZStd::unique_ptr rotationManipulators = AZStd::make_unique(AZ::Transform::CreateIdentity()); + rotationManipulators->SetCircleBoundWidth(ManipulatorCicleBoundWidth(ViewportUi::DefaultViewportId)); InitializeManipulators(*rotationManipulators); @@ -2546,8 +2547,8 @@ namespace AzToolsFramework if (buttonId == m_snappingCluster.m_snapToWorldButtonId) { float gridSize = 1.0f; - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - gridSize, ViewportUi::DefaultViewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::GridSize); + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + gridSize, ViewportUi::DefaultViewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::GridSize); SnapSelectedEntitiesToWorldGrid(gridSize); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake index 14c5f34f90..2d9e75a115 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake @@ -481,6 +481,7 @@ set(FILES Viewport/VertexContainerDisplay.h Viewport/VertexContainerDisplay.cpp Viewport/ViewportMessages.h + Viewport/ViewportMessages.cpp Viewport/ViewportTypes.h Viewport/ViewportTypes.cpp ViewportUi/Button.h diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 4e2afbf056..4210c82921 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -92,21 +92,12 @@ namespace AtomToolsFramework // AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler ... AzFramework::CameraState GetCameraState() override; - bool GridSnappingEnabled() override; - float GridSize() override; - bool ShowGrid() override; - bool AngleSnappingEnabled() override; - float AngleStep() override; - float ManipulatorLineBoundWidth() override; AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition) override; AZStd::optional ViewportScreenToWorld(const AzFramework::ScreenPoint& screenPosition, float depth) override; AZStd::optional ViewportScreenToWorldRay( const AzFramework::ScreenPoint& screenPosition) override; float DeviceScalingFactor() override; - //! Set interface for providing viewport specific settings (e.g. snapping properties). - void SetViewportSettings(const AzToolsFramework::ViewportInteraction::ViewportSettings* viewportSettings); - // AzToolsFramework::ViewportInteraction::ViewportMouseCursorRequestBus::Handler ... void BeginCursorCapture() override; void EndCursorCapture() override; @@ -148,7 +139,7 @@ namespace AtomToolsFramework AzFramework::ViewportControllerListPtr m_controllerList; // The default camera for our viewport i.e. the one used when a camera entity hasn't been activated. AZ::RPI::ViewPtr m_defaultCamera; - // Our viewport-local auxgeom pipeline for supplemental rendering. + // Our viewport-local aux geom pipeline for supplemental rendering. AZ::RPI::AuxGeomDrawPtr m_auxGeom; // Used to keep track of a pending resize event to avoid initialization before window activate. bool m_windowResizedEvent = false; @@ -160,8 +151,6 @@ namespace AtomToolsFramework QElapsedTimer m_renderTimer; // The time of the last recorded tick event from the system tick bus. AZ::ScriptTimePoint m_time; - // The viewport settings (e.g. grid snapping, grid size) for this viewport. - const AzToolsFramework::ViewportInteraction::ViewportSettings* m_viewportSettings = nullptr; // Maps our internal Qt events into AzFramework InputChannels for our ViewportControllerList. AzToolsFramework::QtEventToAzInputMapper* m_inputChannelMapper = nullptr; }; diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp index bf3b00f8ba..027ac80151 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp @@ -315,41 +315,6 @@ namespace AtomToolsFramework return cameraState; } - bool RenderViewportWidget::GridSnappingEnabled() - { - return m_viewportSettings ? m_viewportSettings->GridSnappingEnabled() : false; - } - - float RenderViewportWidget::GridSize() - { - return m_viewportSettings ? m_viewportSettings->GridSize() : 0.0f; - } - - bool RenderViewportWidget::ShowGrid() - { - return m_viewportSettings ? m_viewportSettings->ShowGrid() : false; - } - - bool RenderViewportWidget::AngleSnappingEnabled() - { - return m_viewportSettings ? m_viewportSettings->AngleSnappingEnabled() : false; - } - - float RenderViewportWidget::AngleStep() - { - return m_viewportSettings ? m_viewportSettings->AngleStep() : 0.0f; - } - - float RenderViewportWidget::ManipulatorLineBoundWidth() - { - return m_viewportSettings ? m_viewportSettings->ManipulatorLineBoundWidth() : 0.1f; - } - - void RenderViewportWidget::SetViewportSettings(const AzToolsFramework::ViewportInteraction::ViewportSettings* viewportSettings) - { - m_viewportSettings = viewportSettings; - } - AzFramework::ScreenPoint RenderViewportWidget::ViewportWorldToScreen(const AZ::Vector3& worldPosition) { if (AZ::RPI::ViewPtr currentView = m_viewportContext->GetDefaultView(); diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp index efde4df9d1..45411b3d88 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorPolygonPrismShapeComponentMode.cpp @@ -126,7 +126,7 @@ namespace LmbrCentral ManipulatorViews views; views.emplace_back(CreateManipulatorViewLine( *m_heightManipulator, AZ::Color(0.0f, 0.0f, 1.0f, 1.0f), - lineLength, AzToolsFramework::ManipulatorLineBoundWidth(AzFramework::InvalidViewportId))); + lineLength, AzToolsFramework::ManipulatorLineBoundWidth())); views.emplace_back(CreateManipulatorViewCone(*m_heightManipulator, AZ::Color(0.0f, 0.0f, 1.0f, 1.0f), m_heightManipulator->GetAxis() * (lineLength - coneLength), coneLength, coneRadius)); diff --git a/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp b/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp index a7e23bb200..5f3c98bcee 100644 --- a/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp +++ b/Gems/PhysX/Code/Editor/ColliderRotationMode.cpp @@ -21,7 +21,7 @@ namespace PhysX ColliderRotationMode::ColliderRotationMode() : m_rotationManipulators(AZ::Transform::Identity()) { - + m_rotationManipulators.SetCircleBoundWidth(AzToolsFramework::ManipulatorCicleBoundWidth()); } void ColliderRotationMode::Setup(const AZ::EntityComponentIdPair& idPair) diff --git a/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp b/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp index 389deb078e..43b9fd77f3 100644 --- a/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp +++ b/Gems/PhysX/Code/Editor/EditorSubComponentModeAngleCone.cpp @@ -345,7 +345,7 @@ namespace PhysX { AzToolsFramework::ManipulatorViews views; views.emplace_back(CreateManipulatorViewLine( - *linearManipulator, color, axisLength, AzToolsFramework::ManipulatorLineBoundWidth(AzFramework::InvalidViewportId))); + *linearManipulator, color, axisLength, AzToolsFramework::ManipulatorLineBoundWidth())); views.emplace_back(CreateManipulatorViewCone( *linearManipulator, color, linearManipulator->GetAxis() * (axisLength - coneLength), coneLength, coneRadius)); diff --git a/Gems/PhysX/Code/Editor/EditorSubComponentModeRotation.cpp b/Gems/PhysX/Code/Editor/EditorSubComponentModeRotation.cpp index 3119a40fa6..7586ecc955 100644 --- a/Gems/PhysX/Code/Editor/EditorSubComponentModeRotation.cpp +++ b/Gems/PhysX/Code/Editor/EditorSubComponentModeRotation.cpp @@ -84,10 +84,9 @@ namespace PhysX m_rotationManipulators[i]->SetAxis(axes[i]); m_rotationManipulators[i]->SetLocalTransform(localTransform); const float manipulatorRadius = 2.0f; - const float manipulatorWidth = 0.05f; m_rotationManipulators[i]->SetView(AzToolsFramework::CreateManipulatorViewCircle( - *m_rotationManipulators[i], colors[i], - manipulatorRadius, manipulatorWidth, AzToolsFramework::DrawHalfDottedCircle)); + *m_rotationManipulators[i], colors[i], manipulatorRadius, + AzToolsFramework::ManipulatorCicleBoundWidth(), AzToolsFramework::DrawHalfDottedCircle)); } Refresh(); From 784542d82ef95221713aca89ea3a77b22be39e8b Mon Sep 17 00:00:00 2001 From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com> Date: Mon, 6 Sep 2021 16:00:16 +0200 Subject: [PATCH 159/355] EMotionFX: Resetting motion sets is not registered in the Motions pane which may lead to a crash (#3762) Remove motion set callback was missing and the window wasn't updated in case it was hidden. Signed-off-by: Benjamin Jillich --- .../MotionSetsWindowPlugin.cpp | 84 +++++-------------- .../MotionSetsWindow/MotionSetsWindowPlugin.h | 12 +-- 2 files changed, 21 insertions(+), 75 deletions(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.cpp index bb84dee35d..cf23c2e79e 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.cpp @@ -120,79 +120,51 @@ namespace EMStudio MotionSetsWindowPlugin* m_plugin; }; - - // constructor MotionSetsWindowPlugin::MotionSetsWindowPlugin() : EMStudio::DockWidgetPlugin() { m_dialogStack = nullptr; m_selectedSet = nullptr; - m_createMotionSetCallback = nullptr; - m_reinitCallback = nullptr; - m_adjustMotionSetCallback = nullptr; - m_motionSetAddMotionCallback = nullptr; - m_motionSetRemoveMotionCallback = nullptr; - m_motionSetAdjustMotionCallback = nullptr; - m_loadMotionSetCallback = nullptr; m_motionSetManagementWindow = nullptr; m_motionSetWindow = nullptr; m_dirtyFilesCallback = nullptr; } - - // destructor MotionSetsWindowPlugin::~MotionSetsWindowPlugin() { - GetCommandManager()->RemoveCommandCallback(m_createMotionSetCallback, false); - GetCommandManager()->RemoveCommandCallback(m_reinitCallback, false); - GetCommandManager()->RemoveCommandCallback(m_adjustMotionSetCallback, false); - GetCommandManager()->RemoveCommandCallback(m_motionSetAddMotionCallback, false); - GetCommandManager()->RemoveCommandCallback(m_motionSetRemoveMotionCallback, false); - GetCommandManager()->RemoveCommandCallback(m_motionSetAdjustMotionCallback, false); - GetCommandManager()->RemoveCommandCallback(m_loadMotionSetCallback, false); - - delete m_createMotionSetCallback; - delete m_reinitCallback; - delete m_adjustMotionSetCallback; - delete m_motionSetAddMotionCallback; - delete m_motionSetRemoveMotionCallback; - delete m_motionSetAdjustMotionCallback; - delete m_loadMotionSetCallback; + for (MCore::Command::Callback* callback : m_callbacks) + { + GetCommandManager()->RemoveCommandCallback(callback, false); + delete callback; + } GetMainWindow()->GetDirtyFileManager()->RemoveCallback(m_dirtyFilesCallback, false); delete m_dirtyFilesCallback; } - - // clone the log window EMStudioPlugin* MotionSetsWindowPlugin::Clone() { MotionSetsWindowPlugin* newPlugin = new MotionSetsWindowPlugin(); return newPlugin; } - // init after the parent dock window has been created bool MotionSetsWindowPlugin::Init() { - m_createMotionSetCallback = new CommandCreateMotionSetCallback(false); - m_reinitCallback = new CommandReinitCallback(false); - m_adjustMotionSetCallback = new CommandAdjustMotionSetCallback(false); - m_motionSetAddMotionCallback = new CommandMotionSetAddMotionCallback(false); - m_motionSetRemoveMotionCallback = new CommandMotionSetRemoveMotionCallback(false); - m_motionSetAdjustMotionCallback = new CommandMotionSetAdjustMotionCallback(false); - m_loadMotionSetCallback = new CommandLoadMotionSetCallback(false); + auto AddCallback = [=](const char* commandName, MCore::Command::Callback* callback) + { + m_callbacks.emplace_back(callback); + GetCommandManager()->RegisterCommandCallback(commandName, m_callbacks.back()); + }; - GetCommandManager()->RegisterCommandCallback("CreateMotionSet", m_createMotionSetCallback); - GetCommandManager()->RegisterCommandCallback("RemoveMotionSet", m_reinitCallback); - GetCommandManager()->RegisterCommandCallback("AdjustMotionSet", m_adjustMotionSetCallback); - - GetCommandManager()->RegisterCommandCallback("MotionSetAddMotion", m_motionSetAddMotionCallback); - GetCommandManager()->RegisterCommandCallback("MotionSetRemoveMotion", m_motionSetRemoveMotionCallback); - GetCommandManager()->RegisterCommandCallback("MotionSetAdjustMotion", m_motionSetAdjustMotionCallback); - GetCommandManager()->RegisterCommandCallback("LoadMotionSet", m_loadMotionSetCallback); - - GetCommandManager()->RegisterCommandCallback("RemoveMotion", m_reinitCallback); + AddCallback("CreateMotionSet", new CommandReinitCallback(false)); + AddCallback("RemoveMotionSet", new CommandReinitCallback(false)); + AddCallback("RemoveMotion", new CommandReinitCallback(false)); + AddCallback("AdjustMotionSet", new CommandAdjustMotionSetCallback(false)); + AddCallback("MotionSetAddMotion", new CommandMotionSetAddMotionCallback(false)); + AddCallback("MotionSetRemoveMotion", new CommandMotionSetRemoveMotionCallback(false)); + AddCallback("MotionSetAdjustMotion", new CommandMotionSetAdjustMotionCallback(false)); + AddCallback("LoadMotionSet", new CommandLoadMotionSetCallback(false)); // create the dialog stack assert(m_dialogStack == nullptr); @@ -393,12 +365,7 @@ namespace EMStudio } MotionSetsWindowPlugin* motionSetsPlugin = (MotionSetsWindowPlugin*)plugin; - - // is the plugin visible? only update it if it is visible - if (motionSetsPlugin->GetDockWidget()->visibleRegion().isEmpty() == false) - { - motionSetsPlugin->ReInit(); - } + motionSetsPlugin->ReInit(); return true; } @@ -504,26 +471,14 @@ namespace EMStudio } - bool MotionSetsWindowPlugin::CommandCreateMotionSetCallback::Execute([[maybe_unused]] MCore::Command* command, const MCore::CommandLine& commandLine) - { - MCORE_UNUSED(commandLine); - return ReInitMotionSetsPlugin(); - } - - - bool MotionSetsWindowPlugin::CommandCreateMotionSetCallback::Undo(MCore::Command* command, const MCore::CommandLine& commandLine) { MCORE_UNUSED(command); MCORE_UNUSED(commandLine); return ReInitMotionSetsPlugin(); } - - bool MotionSetsWindowPlugin::CommandReinitCallback::Execute([[maybe_unused]] MCore::Command* command, const MCore::CommandLine& commandLine) { MCORE_UNUSED(commandLine); return ReInitMotionSetsPlugin(); } - bool MotionSetsWindowPlugin::CommandReinitCallback::Undo(MCore::Command* command, const MCore::CommandLine& commandLine) { MCORE_UNUSED(command); MCORE_UNUSED(commandLine); return ReInitMotionSetsPlugin(); } - bool MotionSetsWindowPlugin::CommandAdjustMotionSetCallback::Execute(MCore::Command* command, const MCore::CommandLine& commandLine) { MCORE_UNUSED(command); @@ -544,7 +499,6 @@ namespace EMStudio return true; } - bool MotionSetsWindowPlugin::CommandAdjustMotionSetCallback::Undo(MCore::Command* command, const MCore::CommandLine& commandLine) { MCORE_UNUSED(command); diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.h index 459118c831..377ae3d849 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/MotionSetsWindow/MotionSetsWindowPlugin.h @@ -85,22 +85,14 @@ namespace EMStudio void WindowReInit(bool visible); private: - // declare the callbacks - MCORE_DEFINECOMMANDCALLBACK(CommandCreateMotionSetCallback); MCORE_DEFINECOMMANDCALLBACK(CommandReinitCallback); + MCORE_DEFINECOMMANDCALLBACK(CommandRemoveMotionSetCallback); MCORE_DEFINECOMMANDCALLBACK(CommandAdjustMotionSetCallback); MCORE_DEFINECOMMANDCALLBACK(CommandMotionSetAddMotionCallback); MCORE_DEFINECOMMANDCALLBACK(CommandMotionSetRemoveMotionCallback); MCORE_DEFINECOMMANDCALLBACK(CommandMotionSetAdjustMotionCallback); MCORE_DEFINECOMMANDCALLBACK(CommandLoadMotionSetCallback); - - CommandCreateMotionSetCallback* m_createMotionSetCallback; - CommandReinitCallback* m_reinitCallback; - CommandAdjustMotionSetCallback* m_adjustMotionSetCallback; - CommandMotionSetAddMotionCallback* m_motionSetAddMotionCallback; - CommandMotionSetRemoveMotionCallback* m_motionSetRemoveMotionCallback; - CommandMotionSetAdjustMotionCallback* m_motionSetAdjustMotionCallback; - CommandLoadMotionSetCallback* m_loadMotionSetCallback; + AZStd::vector m_callbacks; MotionSetManagementWindow* m_motionSetManagementWindow; MotionSetWindow* m_motionSetWindow; From 6c1185bcbbab762ad3ae011ef75721d4b45c6867 Mon Sep 17 00:00:00 2001 From: Hulton-Harrop Date: Mon, 6 Sep 2021 14:55:49 +0100 Subject: [PATCH 160/355] rename CEditorPreferencesPage_ViewportMovmement to CEditorPreferencesPage_ViewportCamera Signed-off-by: Hulton-Harrop Signed-off-by: hultonha --- Code/Editor/EditorPreferencesDialog.cpp | 2 +- .../EditorPreferencesPageViewportMovement.cpp | 24 +++++++++---------- .../EditorPreferencesPageViewportMovement.h | 8 +++---- Code/Editor/PreferencesStdPages.cpp | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Code/Editor/EditorPreferencesDialog.cpp b/Code/Editor/EditorPreferencesDialog.cpp index 6cbbccb7ac..22c108ebf9 100644 --- a/Code/Editor/EditorPreferencesDialog.cpp +++ b/Code/Editor/EditorPreferencesDialog.cpp @@ -66,7 +66,7 @@ EditorPreferencesDialog::EditorPreferencesDialog(QWidget* pParent) CEditorPreferencesPage_Files::Reflect(*serializeContext); CEditorPreferencesPage_ViewportGeneral::Reflect(*serializeContext); CEditorPreferencesPage_ViewportManipulator::Reflect(*serializeContext); - CEditorPreferencesPage_ViewportMovement::Reflect(*serializeContext); + CEditorPreferencesPage_ViewportCamera::Reflect(*serializeContext); CEditorPreferencesPage_ViewportDebug::Reflect(*serializeContext); CEditorPreferencesPage_ExperimentalLighting::Reflect(*serializeContext); CEditorPreferencesPage_AWS::Reflect(*serializeContext); diff --git a/Code/Editor/EditorPreferencesPageViewportMovement.cpp b/Code/Editor/EditorPreferencesPageViewportMovement.cpp index 8b8506d694..a272b3759f 100644 --- a/Code/Editor/EditorPreferencesPageViewportMovement.cpp +++ b/Code/Editor/EditorPreferencesPageViewportMovement.cpp @@ -58,7 +58,7 @@ static AZStd::vector GetEditorInputNames() return inputNames; } -void CEditorPreferencesPage_ViewportMovement::Reflect(AZ::SerializeContext& serialize) +void CEditorPreferencesPage_ViewportCamera::Reflect(AZ::SerializeContext& serialize) { serialize.Class() ->Version(2) @@ -93,10 +93,10 @@ void CEditorPreferencesPage_ViewportMovement::Reflect(AZ::SerializeContext& seri ->Field("OrbitDolly", &CameraInputSettings::m_orbitDollyChannelId) ->Field("OrbitPan", &CameraInputSettings::m_orbitPanChannelId); - serialize.Class() + serialize.Class() ->Version(1) - ->Field("CameraMovementSettings", &CEditorPreferencesPage_ViewportMovement::m_cameraMovementSettings) - ->Field("CameraInputSettings", &CEditorPreferencesPage_ViewportMovement::m_cameraInputSettings); + ->Field("CameraMovementSettings", &CEditorPreferencesPage_ViewportCamera::m_cameraMovementSettings) + ->Field("CameraInputSettings", &CEditorPreferencesPage_ViewportCamera::m_cameraInputSettings); if (AZ::EditContext* editContext = serialize.GetEditContext()) { @@ -208,35 +208,35 @@ void CEditorPreferencesPage_ViewportMovement::Reflect(AZ::SerializeContext& seri "Key/button to begin camera orbit pan") ->Attribute(AZ::Edit::Attributes::StringList, &GetEditorInputNames); - editContext->Class("Viewport Preferences", "Viewport Preferences") + editContext->Class("Viewport Preferences", "Viewport Preferences") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) ->DataElement( - AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportMovement::m_cameraMovementSettings, + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportCamera::m_cameraMovementSettings, "Camera Movement Settings", "Camera Movement Settings") ->DataElement( - AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportMovement::m_cameraInputSettings, "Camera Input Settings", + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportCamera::m_cameraInputSettings, "Camera Input Settings", "Camera Input Settings"); } } -CEditorPreferencesPage_ViewportMovement::CEditorPreferencesPage_ViewportMovement() +CEditorPreferencesPage_ViewportCamera::CEditorPreferencesPage_ViewportCamera() { InitializeSettings(); m_icon = QIcon(":/res/Camera.svg"); } -const char* CEditorPreferencesPage_ViewportMovement::GetTitle() +const char* CEditorPreferencesPage_ViewportCamera::GetTitle() { return "Camera"; } -QIcon& CEditorPreferencesPage_ViewportMovement::GetIcon() +QIcon& CEditorPreferencesPage_ViewportCamera::GetIcon() { return m_icon; } -void CEditorPreferencesPage_ViewportMovement::OnApply() +void CEditorPreferencesPage_ViewportCamera::OnApply() { SandboxEditor::SetCameraTranslateSpeed(m_cameraMovementSettings.m_translateSpeed); SandboxEditor::SetCameraRotateSpeed(m_cameraMovementSettings.m_rotateSpeed); @@ -271,7 +271,7 @@ void CEditorPreferencesPage_ViewportMovement::OnApply() &SandboxEditor::EditorModularViewportCameraComposerNotificationBus::Events::OnEditorModularViewportCameraComposerSettingsChanged); } -void CEditorPreferencesPage_ViewportMovement::InitializeSettings() +void CEditorPreferencesPage_ViewportCamera::InitializeSettings() { m_cameraMovementSettings.m_translateSpeed = SandboxEditor::CameraTranslateSpeed(); m_cameraMovementSettings.m_rotateSpeed = SandboxEditor::CameraRotateSpeed(); diff --git a/Code/Editor/EditorPreferencesPageViewportMovement.h b/Code/Editor/EditorPreferencesPageViewportMovement.h index b7482fb048..64a3702432 100644 --- a/Code/Editor/EditorPreferencesPageViewportMovement.h +++ b/Code/Editor/EditorPreferencesPageViewportMovement.h @@ -19,15 +19,15 @@ inline AZ::Crc32 EditorPropertyVisibility(const bool enabled) return enabled ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide; } -class CEditorPreferencesPage_ViewportMovement : public IPreferencesPage +class CEditorPreferencesPage_ViewportCamera : public IPreferencesPage { public: - AZ_RTTI(CEditorPreferencesPage_ViewportMovement, "{BC593332-7EAF-4171-8A35-1C5DE5B40909}", IPreferencesPage) + AZ_RTTI(CEditorPreferencesPage_ViewportCamera, "{BC593332-7EAF-4171-8A35-1C5DE5B40909}", IPreferencesPage) static void Reflect(AZ::SerializeContext& serialize); - CEditorPreferencesPage_ViewportMovement(); - virtual ~CEditorPreferencesPage_ViewportMovement() = default; + CEditorPreferencesPage_ViewportCamera(); + virtual ~CEditorPreferencesPage_ViewportCamera() = default; virtual const char* GetCategory() override { diff --git a/Code/Editor/PreferencesStdPages.cpp b/Code/Editor/PreferencesStdPages.cpp index 012a29368e..5cee5bd8da 100644 --- a/Code/Editor/PreferencesStdPages.cpp +++ b/Code/Editor/PreferencesStdPages.cpp @@ -35,7 +35,7 @@ CStdPreferencesClassDesc::CStdPreferencesClassDesc() [](){ return new CEditorPreferencesPage_General(); }, [](){ return new CEditorPreferencesPage_Files(); }, [](){ return new CEditorPreferencesPage_ViewportGeneral(); }, - [](){ return new CEditorPreferencesPage_ViewportMovement(); }, + [](){ return new CEditorPreferencesPage_ViewportCamera(); }, [](){ return new CEditorPreferencesPage_ViewportManipulator(); }, [](){ return new CEditorPreferencesPage_ViewportDebug(); } }; From 3e9a415b278a2db54e7db0fdda80caeb3c9c16af Mon Sep 17 00:00:00 2001 From: Hulton-Harrop Date: Mon, 6 Sep 2021 15:00:26 +0100 Subject: [PATCH 161/355] EditorPreferences modernize file rename Signed-off-by: Hulton-Harrop Signed-off-by: hultonha --- ...ewportMovement.cpp => EditorPreferencesPageViewportCamera.cpp} | 0 ...geViewportMovement.h => EditorPreferencesPageViewportCamera.h} | 0 ...portGizmo.cpp => EditorPreferencesPageViewportManipulator.cpp} | 0 ...ViewportGizmo.h => EditorPreferencesPageViewportManipulator.h} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename Code/Editor/{EditorPreferencesPageViewportMovement.cpp => EditorPreferencesPageViewportCamera.cpp} (100%) rename Code/Editor/{EditorPreferencesPageViewportMovement.h => EditorPreferencesPageViewportCamera.h} (100%) rename Code/Editor/{EditorPreferencesPageViewportGizmo.cpp => EditorPreferencesPageViewportManipulator.cpp} (100%) rename Code/Editor/{EditorPreferencesPageViewportGizmo.h => EditorPreferencesPageViewportManipulator.h} (100%) diff --git a/Code/Editor/EditorPreferencesPageViewportMovement.cpp b/Code/Editor/EditorPreferencesPageViewportCamera.cpp similarity index 100% rename from Code/Editor/EditorPreferencesPageViewportMovement.cpp rename to Code/Editor/EditorPreferencesPageViewportCamera.cpp diff --git a/Code/Editor/EditorPreferencesPageViewportMovement.h b/Code/Editor/EditorPreferencesPageViewportCamera.h similarity index 100% rename from Code/Editor/EditorPreferencesPageViewportMovement.h rename to Code/Editor/EditorPreferencesPageViewportCamera.h diff --git a/Code/Editor/EditorPreferencesPageViewportGizmo.cpp b/Code/Editor/EditorPreferencesPageViewportManipulator.cpp similarity index 100% rename from Code/Editor/EditorPreferencesPageViewportGizmo.cpp rename to Code/Editor/EditorPreferencesPageViewportManipulator.cpp diff --git a/Code/Editor/EditorPreferencesPageViewportGizmo.h b/Code/Editor/EditorPreferencesPageViewportManipulator.h similarity index 100% rename from Code/Editor/EditorPreferencesPageViewportGizmo.h rename to Code/Editor/EditorPreferencesPageViewportManipulator.h From 9159eccb254d1a162dceefa5bf0ebe9e3be88990 Mon Sep 17 00:00:00 2001 From: "ANT\\aljanru" Date: Mon, 6 Sep 2021 17:03:10 +0200 Subject: [PATCH 162/355] Fixes for periodic and gpu tests affected by the move --- AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py | 4 ++-- .../PhysXColliderSurfaceTagEmitter_E2E_Editor.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py index 0f8a1597ff..49a776a48c 100644 --- a/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py +++ b/AutomatedTesting/Gem/PythonTests/NvCloth/TestSuite_Main.py @@ -24,9 +24,9 @@ class TestAutomation(TestAutomationBase): use_null_renderer = False # Use default renderer (needs gpu) def test_NvCloth_AddClothSimulationToMesh(self, request, workspace, editor, launcher_platform): - from . import NvCloth_AddClothSimulationToMesh as test_module + from .tests import NvCloth_AddClothSimulationToMesh as test_module self._run_test(request, workspace, editor, test_module, use_null_renderer = self.use_null_renderer) def test_NvCloth_AddClothSimulationToActor(self, request, workspace, editor, launcher_platform): - from . import NvCloth_AddClothSimulationToActor as test_module + from .tests import NvCloth_AddClothSimulationToActor as test_module self._run_test(request, workspace, editor, test_module, use_null_renderer = self.use_null_renderer) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py index 2052c59a94..361dbdaea9 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/EditorScripts/PhysXColliderSurfaceTagEmitter_E2E_Editor.py @@ -156,7 +156,7 @@ class TestPhysXColliderSurfaceTagEmitter(EditorTestHelper): # Setup collider entity with a PhysX Mesh test_physx_mesh_asset_id = asset.AssetCatalogRequestBus( bus.Broadcast, "GetAssetIdByPath", os.path.join("levels", "physics", - "c4044697_material_perfacematerialvalidation", + "Material_PerFaceMaterialGetsCorrectMaterial", "test.pxmesh"), math.Uuid(), False) # Remove/re-add component due to LYN-5496 From b8f65cc78bffdfc50e32bb1cd8fd2124bfe7c91f Mon Sep 17 00:00:00 2001 From: hultonha Date: Mon, 6 Sep 2021 15:27:57 +0100 Subject: [PATCH 163/355] updates after file renames Signed-off-by: hultonha --- Code/Editor/EditorPreferencesDialog.cpp | 4 +-- .../EditorPreferencesPageViewportCamera.cpp | 17 +++++++++++- .../EditorPreferencesPageViewportCamera.h | 22 +++++----------- ...itorPreferencesPageViewportManipulator.cpp | 22 +++++++++++++++- ...EditorPreferencesPageViewportManipulator.h | 26 +++++-------------- Code/Editor/PreferencesStdPages.cpp | 4 +-- Code/Editor/editor_lib_files.cmake | 8 +++--- 7 files changed, 57 insertions(+), 46 deletions(-) diff --git a/Code/Editor/EditorPreferencesDialog.cpp b/Code/Editor/EditorPreferencesDialog.cpp index 22c108ebf9..c56df15908 100644 --- a/Code/Editor/EditorPreferencesDialog.cpp +++ b/Code/Editor/EditorPreferencesDialog.cpp @@ -27,8 +27,8 @@ #include "EditorPreferencesPageGeneral.h" #include "EditorPreferencesPageFiles.h" #include "EditorPreferencesPageViewportGeneral.h" -#include "EditorPreferencesPageViewportGizmo.h" -#include "EditorPreferencesPageViewportMovement.h" +#include "EditorPreferencesPageViewportManipulator.h" +#include "EditorPreferencesPageViewportCamera.h" #include "EditorPreferencesPageViewportDebug.h" #include "EditorPreferencesPageExperimentalLighting.h" #include "EditorPreferencesPageAWS.h" diff --git a/Code/Editor/EditorPreferencesPageViewportCamera.cpp b/Code/Editor/EditorPreferencesPageViewportCamera.cpp index a272b3759f..368d2769f8 100644 --- a/Code/Editor/EditorPreferencesPageViewportCamera.cpp +++ b/Code/Editor/EditorPreferencesPageViewportCamera.cpp @@ -8,7 +8,7 @@ #include "EditorDefs.h" -#include "EditorPreferencesPageViewportMovement.h" +#include "EditorPreferencesPageViewportCamera.h" #include #include @@ -226,6 +226,11 @@ CEditorPreferencesPage_ViewportCamera::CEditorPreferencesPage_ViewportCamera() m_icon = QIcon(":/res/Camera.svg"); } +const char* CEditorPreferencesPage_ViewportCamera::GetCategory() +{ + return "Viewports"; +} + const char* CEditorPreferencesPage_ViewportCamera::GetTitle() { return "Camera"; @@ -236,6 +241,16 @@ QIcon& CEditorPreferencesPage_ViewportCamera::GetIcon() return m_icon; } +void CEditorPreferencesPage_ViewportCamera::OnCancel() +{ + // noop +} + +bool CEditorPreferencesPage_ViewportCamera::OnQueryCancel() +{ + return true; +} + void CEditorPreferencesPage_ViewportCamera::OnApply() { SandboxEditor::SetCameraTranslateSpeed(m_cameraMovementSettings.m_translateSpeed); diff --git a/Code/Editor/EditorPreferencesPageViewportCamera.h b/Code/Editor/EditorPreferencesPageViewportCamera.h index 64a3702432..31a728599f 100644 --- a/Code/Editor/EditorPreferencesPageViewportCamera.h +++ b/Code/Editor/EditorPreferencesPageViewportCamera.h @@ -29,22 +29,12 @@ public: CEditorPreferencesPage_ViewportCamera(); virtual ~CEditorPreferencesPage_ViewportCamera() = default; - virtual const char* GetCategory() override - { - return "Viewports"; - } - - virtual const char* GetTitle(); - virtual QIcon& GetIcon() override; - virtual void OnApply() override; - virtual void OnCancel() override - { - } - - virtual bool OnQueryCancel() override - { - return true; - } + const char* GetCategory() override; + const char* GetTitle() override; + QIcon& GetIcon() override; + void OnApply() override; + void OnCancel() override; + bool OnQueryCancel() override; private: void InitializeSettings(); diff --git a/Code/Editor/EditorPreferencesPageViewportManipulator.cpp b/Code/Editor/EditorPreferencesPageViewportManipulator.cpp index d1578f4f9c..ea00d6a7f0 100644 --- a/Code/Editor/EditorPreferencesPageViewportManipulator.cpp +++ b/Code/Editor/EditorPreferencesPageViewportManipulator.cpp @@ -8,7 +8,7 @@ #include "EditorDefs.h" -#include "EditorPreferencesPageViewportGizmo.h" +#include "EditorPreferencesPageViewportManipulator.h" // Editor #include "EditorViewportSettings.h" @@ -53,11 +53,31 @@ CEditorPreferencesPage_ViewportManipulator::CEditorPreferencesPage_ViewportManip m_icon = QIcon(":/res/Gizmos.svg"); } +const char* CEditorPreferencesPage_ViewportManipulator::GetCategory() +{ + return "Viewports"; +} + +const char* CEditorPreferencesPage_ViewportManipulator::GetTitle() +{ + return "Manipulators"; +} + QIcon& CEditorPreferencesPage_ViewportManipulator::GetIcon() { return m_icon; } +void CEditorPreferencesPage_ViewportManipulator::OnCancel() +{ + // noop +} + +bool CEditorPreferencesPage_ViewportManipulator::OnQueryCancel() +{ + return true; +} + void CEditorPreferencesPage_ViewportManipulator::OnApply() { SandboxEditor::SetManipulatorLineBoundWidth(m_manipulators.m_manipulatorLineBoundWidth); diff --git a/Code/Editor/EditorPreferencesPageViewportManipulator.h b/Code/Editor/EditorPreferencesPageViewportManipulator.h index 52270c3b0d..93db6a7035 100644 --- a/Code/Editor/EditorPreferencesPageViewportManipulator.h +++ b/Code/Editor/EditorPreferencesPageViewportManipulator.h @@ -25,26 +25,12 @@ public: CEditorPreferencesPage_ViewportManipulator(); virtual ~CEditorPreferencesPage_ViewportManipulator() = default; - virtual const char* GetCategory() override - { - return "Viewports"; - } - - virtual const char* GetTitle() override - { - return "Manipulators"; - } - - virtual QIcon& GetIcon() override; - virtual void OnApply() override; - virtual void OnCancel() override - { - } - - virtual bool OnQueryCancel() override - { - return true; - } + const char* GetCategory() override; + const char* GetTitle() override; + QIcon& GetIcon() override; + void OnApply() override; + void OnCancel() override; + bool OnQueryCancel() override; private: void InitializeSettings(); diff --git a/Code/Editor/PreferencesStdPages.cpp b/Code/Editor/PreferencesStdPages.cpp index 5cee5bd8da..1dd40702a7 100644 --- a/Code/Editor/PreferencesStdPages.cpp +++ b/Code/Editor/PreferencesStdPages.cpp @@ -17,8 +17,8 @@ #include "EditorPreferencesPageGeneral.h" #include "EditorPreferencesPageFiles.h" #include "EditorPreferencesPageViewportGeneral.h" -#include "EditorPreferencesPageViewportGizmo.h" -#include "EditorPreferencesPageViewportMovement.h" +#include "EditorPreferencesPageViewportManipulator.h" +#include "EditorPreferencesPageViewportCamera.h" #include "EditorPreferencesPageViewportDebug.h" #include "EditorPreferencesPageExperimentalLighting.h" #include "EditorPreferencesPageAWS.h" diff --git a/Code/Editor/editor_lib_files.cmake b/Code/Editor/editor_lib_files.cmake index 24634b245d..031ad26d76 100644 --- a/Code/Editor/editor_lib_files.cmake +++ b/Code/Editor/editor_lib_files.cmake @@ -554,10 +554,10 @@ set(FILES EditorPreferencesPageFiles.cpp EditorPreferencesPageViewportGeneral.h EditorPreferencesPageViewportGeneral.cpp - EditorPreferencesPageViewportGizmo.h - EditorPreferencesPageViewportGizmo.cpp - EditorPreferencesPageViewportMovement.h - EditorPreferencesPageViewportMovement.cpp + EditorPreferencesPageViewportManipulator.h + EditorPreferencesPageViewportManipulator.cpp + EditorPreferencesPageViewportCamera.h + EditorPreferencesPageViewportCamera.cpp EditorPreferencesPageViewportDebug.h EditorPreferencesPageViewportDebug.cpp EditorPreferencesPageExperimentalLighting.h From f551e69b2bd47cf7ba22cd4652d3826e923d7d41 Mon Sep 17 00:00:00 2001 From: moraaar Date: Tue, 7 Sep 2021 15:35:04 +0100 Subject: [PATCH 164/355] PythonProxyNotificationHandler::OnEventGenericHook acquires the Python GIL before executing (#3904) - Protected python execution of OnEventGenericHook by trying to lock the GIL and show a descriptive error when it was not possible to lock. - Improved mechanism to lock python mutex and GIL in PhytonSystemComponent. Acquiring/releasing GIL once per thread. - Added unit test to verify errors are fired when trying to execute OnEventGenericHook from another thread (as it should not able to acquire the GIL). - Improved python threading tests to actually using python buses. Signed-off-by: moraaar moraaar@amazon.com --- .../API/EditorPythonConsoleBus.h | 6 +- .../Code/Source/PythonProxyBus.cpp | 39 +++++-- .../Code/Source/PythonSystemComponent.cpp | 106 ++++++++++++++++-- .../Code/Source/PythonSystemComponent.h | 3 + .../Code/Tests/EditorPythonBindingsTest.cpp | 4 +- .../Code/Tests/PythonAssetTypesTests.cpp | 2 +- .../Code/Tests/PythonAssociativeTests.cpp | 2 +- .../Code/Tests/PythonContainerAnyTests.cpp | 2 +- .../Code/Tests/PythonDictionaryTests.cpp | 2 +- .../Code/Tests/PythonGlobalsTests.cpp | 2 +- .../Code/Tests/PythonPairTests.cpp | 2 +- .../Code/Tests/PythonProxyBusTests.cpp | 92 ++++++++++++++- .../Code/Tests/PythonProxyObjectTests.cpp | 2 +- .../Tests/PythonReflectionComponentTests.cpp | 2 +- .../Code/Tests/PythonThreadingTests.cpp | 49 +++----- .../Code/Tests/PythonTraceMessageSink.h | 11 ++ 16 files changed, 259 insertions(+), 67 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorPythonConsoleBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorPythonConsoleBus.h index e6369dc74a..34770c6dfc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorPythonConsoleBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/EditorPythonConsoleBus.h @@ -70,8 +70,12 @@ namespace AzToolsFramework //! Determines if the caller needs to wait for the Python VM to initialize (non-main thread only) virtual void WaitForInitialization() {} - //! Acquires the Python global interpreter lock (GIL) and executed the callback + //! Acquires the Python global interpreter lock (GIL) and execute the callback virtual void ExecuteWithLock(AZStd::function executionCallback) = 0; + + //! Tries to acquire the Python global interpreter lock (GIL) and execute the callback. + //! @return Whether it was able to lock the mutex or not. + virtual bool TryExecuteWithLock(AZStd::function executionCallback) = 0; }; //! A bus to handle post notifications to the console views of Python output diff --git a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp index e640778bbe..561daa269e 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp @@ -20,6 +20,7 @@ #include #include #include +#include namespace EditorPythonBindings { @@ -261,19 +262,39 @@ namespace EditorPythonBindings static void OnEventGenericHook(void* userData, const char* eventName, int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) { - reinterpret_cast(userData)->OnEventGenericHook(eventName, eventIndex, result, numParameters, parameters); - } - - void OnEventGenericHook(const char* eventName, [[maybe_unused]] int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) - { - // find the callback for the event - const auto& callbackEntry = m_callbackMap.find(eventName); - if (callbackEntry == m_callbackMap.end()) + auto editorPythonEventsInterface = AZ::Interface::Get(); + if (!editorPythonEventsInterface) { return; } - pybind11::function callback = callbackEntry->second; + // find the callback for the event + auto* handler = reinterpret_cast(userData); + const auto& callbackEntry = handler->m_callbackMap.find(eventName); + if (callbackEntry == handler->m_callbackMap.end()) + { + return; + } + + // This function can reach from multiple threads, which means OnEventGenericHook + // will require to acquire the Python GIL, make sure it tries to lock it using TryExecuteWithLock. + [[maybe_unused]] const bool executed = editorPythonEventsInterface->TryExecuteWithLock( + [handler, eventName, callback = callbackEntry->second, eventIndex, result, numParameters, parameters]() + { + handler->OnEventGenericHook(eventName, callback, eventIndex, result, numParameters, parameters); + }); + + AZ_Error("python", executed, + "Ebus(%s) event(%s) could not be executed because it could not acquire the Python GIL. " + "This occurs when there is already another thread executing python, which has the GIL locked, " + "making it not possible for this thread to callback python at the same time. " + "This is a limitation of python interpreter. Python scripts executions and event callbacks " + "from EBuses need be designed to avoid this scenario.", + handler->m_ebus->m_name.c_str(), eventName); + } + + void OnEventGenericHook(const char* eventName, pybind11::function callback, [[maybe_unused]] int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) + { // build the parameters to send to callback Convert::StackVariableAllocator stackVariableAllocator; pybind11::tuple pythonParamters(numParameters); diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp index 8df196e7cb..139337ef00 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.cpp @@ -258,6 +258,85 @@ namespace EditorPythonBindings void Finalize() override {} }; + // Manages the acquisition and release of the Python GIL (Global Interpreter Lock). + // Used by PythonSystemComponent to lock the GIL when executing python. + class PythonSystemComponent::PythonGILScopedLock final + { + public: + PythonGILScopedLock(AZStd::recursive_mutex& lock, int& lockRecursiveCounter, bool tryLock = false); + ~PythonGILScopedLock(); + + bool IsLocked() const; + + protected: + void Lock(bool tryLock); + void Unlock(); + + AZStd::recursive_mutex& m_lock; + int& m_lockRecursiveCounter; + bool m_locked = false; + AZStd::unique_ptr m_releaseGIL; + AZStd::unique_ptr m_acquireGIL; + }; + + PythonSystemComponent::PythonGILScopedLock::PythonGILScopedLock(AZStd::recursive_mutex& lock, int& lockRecursiveCounter, bool tryLock) + : m_lock(lock) + , m_lockRecursiveCounter(lockRecursiveCounter) + { + Lock(tryLock); + } + + PythonSystemComponent::PythonGILScopedLock::~PythonGILScopedLock() + { + Unlock(); + } + + bool PythonSystemComponent::PythonGILScopedLock::IsLocked() const + { + return m_locked; + } + + void PythonSystemComponent::PythonGILScopedLock::Lock(bool tryLock) + { + if (tryLock) + { + if (!m_lock.try_lock()) + { + return; + } + } + else + { + m_lock.lock(); + } + + m_locked = true; + m_lockRecursiveCounter++; + + // Only Acquire the GIL when there is no recursion. If there is + // recursion that means it's the same thread (because the mutex was able + // to be locked) and therefore it's already got the GIL acquired. + if (m_lockRecursiveCounter == 1) + { + m_releaseGIL = AZStd::make_unique(); + m_acquireGIL = AZStd::make_unique(); + } + } + + void PythonSystemComponent::PythonGILScopedLock::Unlock() + { + if (!m_locked) + { + return; + } + + m_acquireGIL.reset(); + m_releaseGIL.reset(); + m_lockRecursiveCounter--; + m_locked = false; + m_lock.unlock(); + } + void PythonSystemComponent::Reflect(AZ::ReflectContext* context) { if (AZ::SerializeContext* serialize = azrtti_cast(context)) @@ -296,9 +375,9 @@ namespace EditorPythonBindings void PythonSystemComponent::Deactivate() { + StopPython(true); AzToolsFramework::EditorPythonRunnerRequestBus::Handler::BusDisconnect(); AZ::Interface::Unregister(this); - StopPython(true); } bool PythonSystemComponent::StartPython([[maybe_unused]] bool silenceWarnings) @@ -354,7 +433,6 @@ namespace EditorPythonBindings bool result = false; EditorPythonBindingsNotificationBus::Broadcast(&EditorPythonBindingsNotificationBus::Events::OnPreFinalize); - AzToolsFramework::EditorPythonRunnerRequestBus::Handler::BusDisconnect(); result = StopPythonInterpreter(); EditorPythonBindingsNotificationBus::Broadcast(&EditorPythonBindingsNotificationBus::Events::OnPostFinalize); @@ -374,12 +452,21 @@ namespace EditorPythonBindings void PythonSystemComponent::ExecuteWithLock(AZStd::function executionCallback) { - AZStd::lock_guard lock(m_lock); - pybind11::gil_scoped_release release; - pybind11::gil_scoped_acquire acquire; + PythonGILScopedLock lock(m_lock, m_lockRecursiveCounter); executionCallback(); } + bool PythonSystemComponent::TryExecuteWithLock(AZStd::function executionCallback) + { + PythonGILScopedLock lock(m_lock, m_lockRecursiveCounter, true /*tryLock*/); + if (lock.IsLocked()) + { + executionCallback(); + return true; + } + return false; + } + void PythonSystemComponent::DiscoverPythonPaths(PythonPathStack& pythonPathStack) { // the order of the Python paths is the order the Python bootstrap scripts will execute @@ -548,8 +635,7 @@ namespace EditorPythonBindings RedirectOutput::Intialize(PyImport_ImportModule("azlmbr_redirect")); // Acquire GIL before calling Python code - AZStd::lock_guard lock(m_lock); - pybind11::gil_scoped_acquire acquire; + PythonGILScopedLock lock(m_lock, m_lockRecursiveCounter); if (EditorPythonBindings::PythonSymbolEventBus::GetTotalNumOfEventHandlers() == 0) { @@ -622,8 +708,7 @@ namespace EditorPythonBindings &AzToolsFramework::EditorPythonScriptNotificationsBus::Events::OnStartExecuteByString, script); // Acquire GIL before calling Python code - AZStd::lock_guard lock(m_lock); - pybind11::gil_scoped_acquire acquire; + PythonGILScopedLock lock(m_lock, m_lockRecursiveCounter); // Acquire scope for __main__ for executing our script pybind11::object scope = pybind11::module::import("__main__").attr("__dict__"); @@ -741,8 +826,7 @@ namespace EditorPythonBindings try { // Acquire GIL before calling Python code - AZStd::lock_guard lock(m_lock); - pybind11::gil_scoped_acquire acquire; + PythonGILScopedLock lock(m_lock, m_lockRecursiveCounter); // Create standard "argc" / "argv" command-line parameters to pass in to the Python script via sys.argv. // argc = number of parameters. This will always be at least 1, since the first parameter is the script name. diff --git a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h index 48ac27a036..0b7a804207 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h +++ b/Gems/EditorPythonBindings/Code/Source/PythonSystemComponent.h @@ -48,6 +48,7 @@ namespace EditorPythonBindings bool IsPythonActive() override; void WaitForInitialization() override; void ExecuteWithLock(AZStd::function executionCallback) override; + bool TryExecuteWithLock(AZStd::function executionCallback) override; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -60,11 +61,13 @@ namespace EditorPythonBindings private: class SymbolLogHelper; + class PythonGILScopedLock; // handle multiple Python initializers and threads AZStd::atomic_int m_initalizeWaiterCount {0}; AZStd::semaphore m_initalizeWaiter; AZStd::recursive_mutex m_lock; + int m_lockRecursiveCounter = 0; AZStd::shared_ptr m_symbolLogHelper; enum class Result diff --git a/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp b/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp index b1e504fb47..d630605cbc 100644 --- a/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/EditorPythonBindingsTest.cpp @@ -65,7 +65,7 @@ namespace UnitTest { // clearing up memory m_notificationSink = EditorPythonBindingsNotificationBusSink(); - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); // shutdown time! PythonTestingFixture::TearDown(); @@ -333,7 +333,7 @@ sys.version { // clearing up memory m_notificationSink = EditorPythonBindingsNotificationBusSink(); - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); // shutdown time! PythonTestingFixture::TearDown(); diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp index 4d902c10ab..78ac2a0a45 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp @@ -366,7 +366,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonAssociativeTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonAssociativeTests.cpp index 54748374d0..f4573ca012 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonAssociativeTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonAssociativeTests.cpp @@ -95,7 +95,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonContainerAnyTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonContainerAnyTests.cpp index 66bf562809..4fd571120b 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonContainerAnyTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonContainerAnyTests.cpp @@ -227,7 +227,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonDictionaryTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonDictionaryTests.cpp index 24689bbfe3..a106d56d40 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonDictionaryTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonDictionaryTests.cpp @@ -107,7 +107,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonGlobalsTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonGlobalsTests.cpp index b9af65ef48..89637c89a5 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonGlobalsTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonGlobalsTests.cpp @@ -175,7 +175,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonPairTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonPairTests.cpp index b54606b3b6..df6c3aceac 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonPairTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonPairTests.cpp @@ -121,7 +121,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonProxyBusTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonProxyBusTests.cpp index 3e93b6052b..68135cff8d 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonProxyBusTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonProxyBusTests.cpp @@ -207,11 +207,13 @@ namespace UnitTest : AZ::EBusTraits { static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + using MutexType = AZStd::mutex; virtual ~PythonTestSingleAddressNotifications() = default; virtual void OnPing(AZ::u64 count) = 0; virtual void OnPong(AZ::u64 count) = 0; virtual void MultipleInputs(AZ::u64 one, AZ::s8 two, AZStd::string_view three) = 0; virtual AZStd::string OnAddFish(AZStd::string_view value) = 0; + virtual void OnFire() = 0; }; using PythonTestSingleAddressNotificationBus = AZ::EBus; @@ -220,7 +222,7 @@ namespace UnitTest , public AZ::BehaviorEBusHandler { AZ_EBUS_BEHAVIOR_BINDER(PythonTestNotificationHandler, "{97052D15-A4E8-461B-B065-91D16E31C4F7}", AZ::SystemAllocator, - OnPing, OnPong, MultipleInputs, OnAddFish); + OnPing, OnPong, MultipleInputs, OnAddFish, OnFire); virtual ~PythonTestNotificationHandler() = default; @@ -246,6 +248,11 @@ namespace UnitTest return result; } + void OnFire() override + { + Call(FN_OnFire); + } + static AZ::u64 s_pongCount; static AZ::u64 s_pingCount; @@ -270,6 +277,25 @@ namespace UnitTest return result; } + static void DoFire() + { + PythonTestSingleAddressNotificationBus::Broadcast(&PythonTestSingleAddressNotificationBus::Events::OnFire); + } + + static void DoFiresInParallel(int value) + { + AZStd::vector threads; + threads.reserve(value); + for (size_t i = 0; i < value; ++i) + { + threads.emplace_back(&DoFire); + } + for (AZStd::thread& thread : threads) + { + thread.join(); + } + } + static void Reset() { s_pingCount = 0; @@ -288,6 +314,7 @@ namespace UnitTest ->Event("on_pong", &PythonTestSingleAddressNotificationBus::Events::OnPong) ->Event("MultipleInputs", &PythonTestSingleAddressNotificationBus::Events::MultipleInputs) ->Event("OnAddFish", &PythonTestSingleAddressNotificationBus::Events::OnAddFish) + ->Event("OnFire", &PythonTestSingleAddressNotificationBus::Events::OnFire) ; // for testing from Python to send out the events @@ -297,6 +324,8 @@ namespace UnitTest ->Method("do_ping", &PythonTestNotificationHandler::DoPing) ->Method("do_pong", &PythonTestNotificationHandler::DoPong) ->Method("do_add_fish", &PythonTestNotificationHandler::DoAddFish) + ->Method("do_fire", &PythonTestNotificationHandler::DoFire) + ->Method("do_fires_in_parallel", &PythonTestNotificationHandler::DoFiresInParallel) ; } } @@ -358,7 +387,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; @@ -809,6 +838,65 @@ namespace UnitTest EXPECT_EQ(2, m_testSink.m_evaluationMap[static_cast(LogTypes::AtAddress_Match)]); } + TEST_F(PythonBusProxyTests, SingleAddressNotifications_InParallel_Errors) + { + PythonTestNotificationHandler pythonTestNotificationHandler; + pythonTestNotificationHandler.Reflect(m_app.GetBehaviorContext()); + + AZ::Entity e; + Activate(e); + + SimulateEditorBecomingInitialized(); + + enum class LogTypes + { + Skip = 0, + Notifications_OnFire, + }; + + m_testSink.m_evaluateMessage = [](const char* window, const char* message) -> int + { + if (AzFramework::StringFunc::Equal(window, "python")) + { + if (AzFramework::StringFunc::Equal(message, "Notifications_OnFire")) + { + return static_cast(LogTypes::Notifications_OnFire); + } + } + return static_cast(LogTypes::Skip); + }; + + UnitTest::PythonTestNotificationHandler::Reset(); + + const int numFiresInParallel = 220; + + const AZStd::string script = AZStd::string::format( + "import azlmbr.bus\n" + "import azlmbr.test\n" + "\n" + "def OnFire(parameters) :\n" + " print('Notifications_OnFire')\n" + "\n" + "handler = azlmbr.bus.NotificationHandler('PythonTestSingleAddressNotificationBus')\n" + "handler.connect(None)\n" + "handler.add_callback('OnFire', OnFire)\n" + "\n" + "azlmbr.test.PythonTestNotificationHandler_do_fire()\n" + "\n" + "azlmbr.test.PythonTestNotificationHandler_do_fires_in_parallel(%d)\n" + "\n" + "handler.disconnect()\n", + numFiresInParallel); + + AZ_TEST_START_TRACE_SUPPRESSION; + AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByString, script, false); + AZ_TEST_STOP_TRACE_SUPPRESSION(numFiresInParallel); // Expect numFiresInParallel errors + + e.Deactivate(); + + EXPECT_EQ(1, m_testSink.m_evaluationMap[static_cast(LogTypes::Notifications_OnFire)]); + } + TEST_F(PythonBusProxyTests, NotificationsWithNoAddress) { PythonTestNotificationHandler pythonTestNotificationHandler; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonProxyObjectTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonProxyObjectTests.cpp index 66f2ef6eb0..9f825c8d1c 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonProxyObjectTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonProxyObjectTests.cpp @@ -419,7 +419,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonReflectionComponentTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonReflectionComponentTests.cpp index 147ff89435..8d472945cc 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonReflectionComponentTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonReflectionComponentTests.cpp @@ -532,7 +532,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonThreadingTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonThreadingTests.cpp index b2e18265cb..6d34405483 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonThreadingTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonThreadingTests.cpp @@ -75,7 +75,7 @@ namespace UnitTest void TearDown() override { // clearing up memory - m_testSink = PythonTraceMessageSink(); + m_testSink.CleanUp(); PythonTestingFixture::TearDown(); } }; @@ -114,38 +114,29 @@ namespace UnitTest try { // prepare handler on this thread - pybind11::exec(R"( - import azlmbr.test + const AZStd::string_view script = + "import azlmbr.test\n" + "\n" + "def on_notification(args) :\n" + " value = args[0] + 2\n" + " print('RanInThread')\n" + " return value\n" + "\n" + "handler = azlmbr.test.PythonThreadNotificationBusHandler()\n" + "handler.connect()\n" + "handler.add_callback('OnNotification', on_notification)\n"; - def on_notification(args): - value = args[0] + 2 - print ('RanInThread') - return value - - handler = azlmbr.test.PythonThreadNotificationBusHandler() - handler.connect() - handler.add_callback('OnNotification', on_notification) - )"); + AzToolsFramework::EditorPythonRunnerRequestBus::Broadcast(&AzToolsFramework::EditorPythonRunnerRequestBus::Events::ExecuteByString, script, false /*printResult*/); // start thread; in thread issue notification auto threadCallback = []() { AZ::s64 result = 0; - auto notificationCallback = [&result]() - { - PythonThreadNotificationBus::BroadcastResult(result, &PythonThreadNotificationBus::Events::OnNotification, 40); - }; - - auto editorPythonEventsInterface = AZ::Interface::Get(); - if (editorPythonEventsInterface) - { - editorPythonEventsInterface->ExecuteWithLock(notificationCallback); - } + PythonThreadNotificationBus::BroadcastResult(result, &PythonThreadNotificationBus::Events::OnNotification, 40); EXPECT_EQ(42, result); }; AZStd::thread theThread(threadCallback); - AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(100)); theThread.join(); } catch ([[maybe_unused]] const std::exception& e) @@ -187,21 +178,11 @@ namespace UnitTest auto threadCallback = []() { AZ::s64 result = 0; - auto notificationCallback = [&result]() - { - PythonThreadNotificationBus::BroadcastResult(result, &PythonThreadNotificationBus::Events::OnNotification, 40); - }; - - auto editorPythonEventsInterface = AZ::Interface::Get(); - if (editorPythonEventsInterface) - { - editorPythonEventsInterface->ExecuteWithLock(notificationCallback); - } + PythonThreadNotificationBus::BroadcastResult(result, &PythonThreadNotificationBus::Events::OnNotification, 40); EXPECT_EQ(0, result); }; AZStd::thread theThread(threadCallback); - AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(100)); theThread.join(); // the Python script above raises an exception which causes two AZ_Error() message lines: diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonTraceMessageSink.h b/Gems/EditorPythonBindings/Code/Tests/PythonTraceMessageSink.h index 7294de4910..28971aec9e 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonTraceMessageSink.h +++ b/Gems/EditorPythonBindings/Code/Tests/PythonTraceMessageSink.h @@ -37,6 +37,15 @@ namespace UnitTest using EvaluationMap = AZStd::unordered_map; // tag to count EvaluationMap m_evaluationMap; + AZStd::mutex m_lock; + + void CleanUp() + { + AZStd::lock_guard lock(m_lock); + m_evaluateMessage = {}; + m_evaluationMap.clear(); + } + ////////////////////////////////////////////////////////////////////////// // TraceMessageDrillerBus void OnPrintf(const char* window, const char* message) override @@ -46,6 +55,8 @@ namespace UnitTest void OnOutput(const char* window, const char* message) override { + AZStd::lock_guard lock(m_lock); + if (m_evaluateMessage) { int key = m_evaluateMessage(window, message); From 8c51fc24f7fb675816986767bf9ba59a1efa7882 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 07:54:35 -0700 Subject: [PATCH 165/355] Adding clang warning Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/Clang/Configurations_clang.cmake | 1 - 1 file changed, 1 deletion(-) diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 02a94f4e72..d214ad68a2 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -20,7 +20,6 @@ ly_append_configurations_options( -Wrange-loop-analysis -Wno-unknown-warning-option # used as a way to mark warnings that are MSVC only -Wno-format-security - -Wno-inconsistent-missing-override -Wno-parentheses -Wno-reorder -Wno-switch From d1df0fbe477d298a9085d9fa1107d9347cf2d7d3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 08:17:06 -0700 Subject: [PATCH 166/355] reverting one that was changed by mistake Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Source/RetainedModeActionDispatcher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp b/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp index 8f82bb09b1..34ae4aaf4a 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp @@ -117,7 +117,7 @@ namespace AzManipulatorTestFramework RetainedModeActionDispatcher* RetainedModeActionDispatcher::Execute() { - Log("%s", "Executing %u actions", m_actions.size()); + Log("Executing %u actions", m_actions.size()); for (auto& action : m_actions) { action(); From 4d5b047c1b31eb57c37078feffa5ab77beec3365 Mon Sep 17 00:00:00 2001 From: moudgils <47460854+moudgils@users.noreply.github.com> Date: Tue, 7 Sep 2021 11:03:11 -0700 Subject: [PATCH 167/355] Fix PipelineLibraries (DX12 backend). (#3768) * Fix loading of PipelineLibraries from disk for DX12 backend. Signed-off-by: moudgils * Disabled Saving out PipelineLibraries (for DX12) if pix or Renderdoc is enabled. Addressed some feedback Signed-off-by: moudgils * Fixed an issue withe loading PipelineLibraries and added a cleaner abstraction to not save empty libraries for dx12 Signed-off-by: moudgils --- .../Code/Include/Atom/RHI/PipelineLibrary.h | 78 +++++++++---------- .../RHI/Code/Source/RHI/PipelineLibrary.cpp | 5 ++ .../Code/Source/RHI/PipelineStateCache.cpp | 34 ++++---- .../Platform/Windows/RHI/DX12_Windows.h | 4 +- .../DX12/Code/Source/RHI/PipelineLibrary.cpp | 28 +++++-- .../DX12/Code/Source/RHI/PipelineLibrary.h | 1 + .../Code/Source/RHI/AsyncUploadQueue.cpp | 2 +- .../Include/Atom/RPI.Public/Shader/Shader.h | 8 +- .../Code/Source/RPI.Public/Shader/Shader.cpp | 76 +++++++++--------- 9 files changed, 130 insertions(+), 106 deletions(-) diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h index 0c5cfd1182..3a49b121cd 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/PipelineLibrary.h @@ -19,25 +19,24 @@ namespace AZ /// A handle typed to the pipeline library. Used by the PipelineStateCache to abstract access. using PipelineLibraryHandle = Handle; - /** - * PipelineState initialization is an expensive operation on certain platforms. If multiple pipeline states - * are created with little variation between them, the contents are still duplicated. This class is an allocation - * context for pipeline states, provided at PipelineState::Init, which will perform de-duplication of - * internal pipeline state components and cache the results. - * - * Practically speaking, if many pipeline states are created with shared data between them (e.g. permutations - * of the same shader), then providing a PipelineLibrary instance will reduce the memory footprint and cost - * of compilation. - * - * Additionally, the PipelineLibrary is able to serialize the internal driver-contents to and from an opaque - * data blob. This enables building up a pipeline state cache on disk, which can dramatically reduce pipeline - * state compilation cost when run from a pre-warmed cache. - * - * PipelineLibrary is thread-safe, in the sense that it will take a lock during compilation. It is possible - * to initialize pipeline states across threads using the same PipelineLibrary instance, but this will - * result in the two calls serializing on the mutex. Instead, see PipelineStateCache which stores - * a PipelineLibrary instance per thread to avoid this contention. - */ + + //! PipelineState initialization is an expensive operation on certain platforms. If multiple pipeline states + //! are created with little variation between them, the contents are still duplicated. This class is an allocation + //! context for pipeline states, provided at PipelineState::Init, which will perform de-duplication of + //! internal pipeline state components and cache the results. + //! + //! Practically speaking, if many pipeline states are created with shared data between them (e.g. permutations + //! of the same shader), then providing a PipelineLibrary instance will reduce the memory footprint and cost + //! of compilation. + //! + //! Additionally, the PipelineLibrary is able to serialize the internal driver-contents to and from an opaque + //! data blob. This enables building up a pipeline state cache on disk, which can dramatically reduce pipeline + //! state compilation cost when run from a pre-warmed cache. + //! + //! PipelineLibrary is thread-safe, in the sense that it will take a lock during compilation. It is possible + //! to initialize pipeline states across threads using the same PipelineLibrary instance, but this will + //! result in the two calls serializing on the mutex. Instead, see PipelineStateCache which stores + //! a PipelineLibrary instance per thread to avoid this contention. class PipelineLibrary : public DeviceObject { @@ -45,34 +44,31 @@ namespace AZ AZ_RTTI(PipelineLibrary, "{843579BE-57E4-4527-AB00-C0217885AEA9}"); virtual ~PipelineLibrary() = default; - /** - * Initializes the pipeline library from a platform-specific data payload. This data is generated - * by calling GetSerializedData in a previous run of the application. When run for the first - * time, the serialized data should be empty. When the application completes, the library can be - * serialized and the contents saved to disk. Subsequent loads will experience much faster pipeline - * state creation times (on supported platforms). On success, the library is transitioned to the - * initialized state. On failure, the library remains uninitialized. - * @param serializedData The initial serialized data used to initialize the library. It can be null. - */ + //! Initializes the pipeline library from a platform-specific data payload. This data is generated + //! by calling GetSerializedData in a previous run of the application. When run for the first + //! time, the serialized data should be empty. When the application completes, the library can be + //! serialized and the contents saved to disk. Subsequent loads will experience much faster pipeline + //! state creation times (on supported platforms). On success, the library is transitioned to the + //! initialized state. On failure, the library remains uninitialized. + //! @param serializedData The initial serialized data used to initialize the library. It can be null. ResultCode Init(Device& device, const PipelineLibraryData* serializedData); - /** - * Merges the contents of other libraries into this library. This method must be called - * on an initialized library. A common use case for this method is to construct thread-local - * libraries and merge them into a single unified library. The serialized data can then be - * extracted from the unified library. An error code is returned on failure and the behavior - * is as if the method was never called. - */ + //! Merges the contents of other libraries into this library. This method must be called + //! on an initialized library. A common use case for this method is to construct thread-local + //! libraries and merge them into a single unified library. The serialized data can then be + //! extracted from the unified library. An error code is returned on failure and the behavior + //! is as if the method was never called. ResultCode MergeInto(AZStd::array_view librariesToMerge); - /** - * Serializes the platform-specific data and returns it as a new PipelineLibraryData instance. - * The data is opaque to the user and can only be used to re-initialize the library. Use - * this method to extract serialized data prior to application shutdown, save it to disk, and - * use it when initializing on subsequent runs. - */ + //! Serializes the platform-specific data and returns it as a new PipelineLibraryData instance. + //! The data is opaque to the user and can only be used to re-initialize the library. Use + //! this method to extract serialized data prior to application shutdown, save it to disk, and + //! use it when initializing on subsequent runs. ConstPtr GetSerializedData() const; + //! Returns whether the current library need to be merged + virtual bool IsMergeRequired() const; + private: bool ValidateIsInitialized() const; diff --git a/Gems/Atom/RHI/Code/Source/RHI/PipelineLibrary.cpp b/Gems/Atom/RHI/Code/Source/RHI/PipelineLibrary.cpp index 2212ae1591..be0428bc91 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/PipelineLibrary.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/PipelineLibrary.cpp @@ -72,5 +72,10 @@ namespace AZ return GetSerializedDataInternal(); } + + bool PipelineLibrary::IsMergeRequired() const + { + return true; + } } } diff --git a/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp b/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp index 52093f7b4c..a2a2736106 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp @@ -166,16 +166,12 @@ namespace AZ } AZStd::unique_lock lock(m_mutex); - const GlobalLibraryEntry& entry = m_globalLibrarySet[handle.GetIndex()]; - /** - * Each thread has its own PipelineLibrary instance. To produce the final serialized data, we - * coalesce data from each individual library by merging the thread-local ones into a single - * global (temporary) library. The data is then extracted from this global library and returned. - * This operation is designed to happen once at application shutdown; certainly not every frame. - */ - + //! Each thread has its own PipelineLibrary instance. To produce the final serialized data, we + //! coalesce data from each individual library by merging the thread-local ones into a single + //! global (temporary) library. The data is then extracted from this global library and returned. + //! This operation is designed to happen once at application shutdown; certainly not every frame. AZStd::vector threadLibraries; m_threadLibrarySet.ForEach([handle, &threadLibraries](const ThreadLibrarySet& threadLibrarySet) { @@ -188,16 +184,26 @@ namespace AZ } }); - Ptr pipelineLibrary = Factory::Get().CreatePipelineLibrary(); - ResultCode resultCode = pipelineLibrary->Init(*m_device, entry.m_serializedData.get()); - - if (resultCode == ResultCode::Success) + bool doesPSODataExist = entry.m_serializedData.get(); + for (const RHI::PipelineLibrary* libraryBase : threadLibraries) { - resultCode = pipelineLibrary->MergeInto(threadLibraries); + const PipelineLibrary* library = static_cast(libraryBase); + doesPSODataExist |= library->IsMergeRequired(); + } + + if (doesPSODataExist) + { + Ptr pipelineLibrary = Factory::Get().CreatePipelineLibrary(); + ResultCode resultCode = pipelineLibrary->Init(*m_device, entry.m_serializedData.get()); if (resultCode == ResultCode::Success) { - return pipelineLibrary->GetSerializedData(); + resultCode = pipelineLibrary->MergeInto(threadLibraries); + + if (resultCode == ResultCode::Success) + { + return pipelineLibrary->GetSerializedData(); + } } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h index b07b9e9e58..3f9079422c 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h @@ -20,8 +20,8 @@ #include -// This define is enabled if winpixeventruntime SDK is downloaded and it's path is hooked up to Environment var ATOM_PIX_PATH. -// Enabling this define will allow the runtime code to add PIX markers which will hel pwith pix and renderdoc gpu captures +// This define is enabled if LY_PIX_ENABLED is enabled during configure. You can use LY_PIX_PATH to point where pix is downloaded. +// Enabling this define will allow the runtime code to add PIX markers which will help with pix and renderdoc gpu captures #ifdef USE_PIX #include #else diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp index 06a0511162..d0a9ef0c07 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp @@ -66,15 +66,20 @@ namespace AZ switch (hr) { case D3D12_ERROR_DRIVER_VERSION_MISMATCH: - case DXGI_ERROR_UNSUPPORTED: AZ_Warning("PipelineLibrary", false, "Failed to use pipeline library blob due to driver version mismatch. Contents will be rebuilt."); break; + case DXGI_ERROR_UNSUPPORTED: + AZ_Warning("PipelineLibrary", false, "Failed to use pipeline library blob due to the specified device interface or feature level not supported on this system. Contents will be rebuilt."); + break; case D3D12_ERROR_ADAPTER_NOT_FOUND: AZ_Warning("PipelineLibrary", false, "Failed to use pipeline library blob due to mismatched hardware. Contents will be rebuilt."); break; case E_INVALIDARG: AZ_Assert(false, "Failed to use pipeline library blob due to invalid arguments. Contents will be rebuilt."); break; + case DXGI_ERROR_DEVICE_REMOVED: + AZ_Assert(false, "Failed to use pipeline library blob due to DXGI_ERROR_DEVICE_REMOVED."); + break; default: AZ_Warning("PipelineLibrary", false, "Failed to use pipeline library blob for unknown reason. Contents will be rebuilt."); } @@ -200,23 +205,29 @@ namespace AZ RHI::ResultCode PipelineLibrary::MergeIntoInternal([[maybe_unused]] AZStd::array_view pipelineLibraries) { +#if defined(USE_PIX) || defined(USE_RENDERDOC) + // StorePipeline api does not function properly if Pix or RenderDoc is enabled + return RHI::ResultCode::Fail; +#else + #if defined (AZ_DX12_USE_PIPELINE_LIBRARY) AZStd::lock_guard lock(m_mutex); - for (const RHI::PipelineLibrary* libraryBase : pipelineLibraries) { const PipelineLibrary* library = static_cast(libraryBase); - for (const auto& pipelineStateEntry : library->m_pipelineStates) { - m_library->StorePipeline(pipelineStateEntry.first.c_str(), pipelineStateEntry.second.get()); + if (m_pipelineStates.find(pipelineStateEntry.first) == m_pipelineStates.end()) + { + m_library->StorePipeline(pipelineStateEntry.first.c_str(), pipelineStateEntry.second.get()); - m_pipelineStates.emplace(pipelineStateEntry.first, pipelineStateEntry.second); + m_pipelineStates.emplace(pipelineStateEntry.first, pipelineStateEntry.second); + } } } #endif - return RHI::ResultCode::Success; +#endif } RHI::ConstPtr PipelineLibrary::GetSerializedDataInternal() const @@ -238,5 +249,10 @@ namespace AZ return nullptr; #endif } + + bool PipelineLibrary::IsMergeRequired() const + { + return !m_pipelineStates.empty(); + } } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h index d43abe4cb1..b970882246 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.h @@ -35,6 +35,7 @@ namespace AZ void ShutdownInternal() override; RHI::ResultCode MergeIntoInternal(AZStd::array_view libraries) override; RHI::ConstPtr GetSerializedDataInternal() const override; + bool IsMergeRequired() const; ////////////////////////////////////////////////////////////////////////// ID3D12DeviceX* m_dx12Device = nullptr; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/AsyncUploadQueue.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/AsyncUploadQueue.cpp index 47cde358ba..7a8499ab9d 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/AsyncUploadQueue.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/AsyncUploadQueue.cpp @@ -210,7 +210,7 @@ namespace AZ // ImageHeight must be bigger than or equal to the Image's row count. Images with a RowCount that is less than the ImageHeight indicates a block compression. // Images with a RowCount which is higher than the ImageHeight indicates a planar image, which is not supported for streaming images. - AZ_Error("StreamingImage", subresourceLayout.m_size.m_height < subresourceLayout.m_rowCount, "AsyncUploadQueue::QueueUpload expects ImageHeight '%d' to be bigger than or equal to the image's RowCount '%d'.", subresourceLayout.m_size.m_height, subresourceLayout.m_rowCount); + AZ_Error("StreamingImage", subresourceLayout.m_size.m_height >= subresourceLayout.m_rowCount, "AsyncUploadQueue::QueueUpload expects ImageHeight '%d' to be bigger than or equal to the image's RowCount '%d'.", subresourceLayout.m_size.m_height, subresourceLayout.m_rowCount); // The final staging size for each CopyTextureRegion command uint32_t stagingSize = stagingSlicePitch; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/Shader.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/Shader.h index 6684eec0f7..e2568f3b61 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/Shader.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Shader/Shader.h @@ -18,7 +18,7 @@ #include #include - +#include #include namespace AZ @@ -175,9 +175,6 @@ namespace AZ // And of course we don't need to handle OnShaderReinitialized because this *is* this Shader. /////////////////////////////////////////////////////////////////// - //! Returns the path to the pipeline library cache file. - AZStd::string GetPipelineLibraryPath() const; - //! A strong reference to the shader asset. Data::Asset m_asset; @@ -206,6 +203,9 @@ namespace AZ //! DrawListTag associated with this shader. RHI::DrawListTag m_drawListTag; + + //! PipelineLibrary file name + char m_pipelineLibraryPath[AZ_MAX_PATH_LEN] = { 0 }; }; } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp index 4440b96f79..e602e3e91b 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp @@ -7,18 +7,14 @@ */ #include -#include - -#include - -#include #include - +#include +#include #include - -#include -#include #include +#include +#include + namespace AZ { @@ -75,6 +71,29 @@ namespace AZ Shutdown(); } + static bool GetPipelineLibraryPath(char* pipelineLibraryPath, size_t pipelineLibraryPathLength, const ShaderAsset& shaderAsset) + { + if (auto* fileIOBase = IO::FileIOBase::GetInstance()) + { + const Data::AssetId& assetId = shaderAsset.GetId(); + + Name platformName = RHI::Factory::Get().GetName(); + Name shaderName = shaderAsset.GetName(); + + AZStd::string uuidString; + assetId.m_guid.ToString(uuidString, false, false); + + char pipelineLibraryPathTemp[AZ_MAX_PATH_LEN]; + azsnprintf( + pipelineLibraryPathTemp, AZ_MAX_PATH_LEN, "@user@/Atom/PipelineStateCache/%s/%s_%s_%d.bin", platformName.GetCStr(), + shaderName.GetCStr(), uuidString.data(), assetId.m_subId); + + fileIOBase->ResolvePath(pipelineLibraryPathTemp, pipelineLibraryPath, pipelineLibraryPathLength); + return true; + } + return false; + } + RHI::ResultCode Shader::Init(ShaderAsset& shaderAsset) { Data::AssetBus::Handler::BusDisconnect(); @@ -87,6 +106,8 @@ namespace AZ m_asset = { &shaderAsset, AZ::Data::AssetLoadBehavior::PreLoad }; m_pipelineStateType = shaderAsset.GetPipelineStateType(); + GetPipelineLibraryPath(m_pipelineLibraryPath, AZ_MAX_PATH_LEN, *m_asset); + { AZStd::unique_lock lock(m_variantCacheMutex); m_shaderVariants.clear(); @@ -123,7 +144,7 @@ namespace AZ AZ_Error("Shader", false, "Failed to acquire a DrawListTag. Entries are full."); } } - + ShaderVariantFinderNotificationBus::Handler::BusConnect(m_asset.GetId()); Data::AssetBus::Handler::BusConnect(m_asset.GetId()); ShaderReloadNotificationBus::Handler::BusConnect(m_asset.GetId()); @@ -249,49 +270,28 @@ namespace AZ } } /////////////////////////////////////////////////////////////////// - - + ConstPtr Shader::LoadPipelineLibrary() const - { - if (IO::FileIOBase::GetInstance()) + { + if (m_pipelineLibraryPath[0] != 0) { - return Utils::LoadObjectFromFile(GetPipelineLibraryPath()); + return Utils::LoadObjectFromFile(m_pipelineLibraryPath); } return nullptr; } void Shader::SavePipelineLibrary() const { - if (auto* fileIOBase = IO::FileIOBase::GetInstance()) + if (m_pipelineLibraryPath[0] != 0) { RHI::ConstPtr serializedData = m_pipelineStateCache->GetLibrarySerializedData(m_pipelineLibraryHandle); if (serializedData) { - const AZStd::string pipelineLibraryPath = GetPipelineLibraryPath(); - - char pipelineLibraryPathResolved[AZ_MAX_PATH_LEN] = { 0 }; - fileIOBase->ResolvePath(pipelineLibraryPath.c_str(), pipelineLibraryPathResolved, AZ_MAX_PATH_LEN); - Utils::SaveObjectToFile(pipelineLibraryPathResolved, DataStream::ST_BINARY, serializedData.get()); + Utils::SaveObjectToFile(m_pipelineLibraryPath, DataStream::ST_BINARY, serializedData.get()); } } - else - { - AZ_Error("Shader", false, "FileIOBase is not initialized"); - } } - - AZStd::string Shader::GetPipelineLibraryPath() const - { - const Data::InstanceId& instanceId = GetId(); - Name platformName = RHI::Factory::Get().GetName(); - Name shaderName = m_asset->GetName(); - - AZStd::string uuidString; - instanceId.m_guid.ToString(uuidString, false, false); - - return AZStd::string::format("@user@/Atom/PipelineStateCache/%s/%s_%s_%d.bin", platformName.GetCStr(), shaderName.GetCStr(), uuidString.data(), instanceId.m_subId); - } - + ShaderOptionGroup Shader::CreateShaderOptionGroup() const { return ShaderOptionGroup(m_asset->GetShaderOptionGroupLayout()); From 1d98ab3a1c2c5e3009162132ee92937ad9312681 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 11:09:31 -0700 Subject: [PATCH 168/355] Fixes renderdoc define Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake b/Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake index 7b7c312169..f8f17392b3 100644 --- a/Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake +++ b/Gems/Atom/RHI/3rdParty/Findrenderdoc.cmake @@ -11,5 +11,5 @@ ly_add_external_target( 3RDPARTY_ROOT_DIRECTORY "${LY_RENDERDOC_PATH}" VERSION INCLUDE_DIRECTORIES . - COMPILE_DEFINITIONS USE_RENDER_DOC + COMPILE_DEFINITIONS USE_RENDERDOC ) From 2a2847b15d205b0a7b2e599a70b2a24b3d59b1c2 Mon Sep 17 00:00:00 2001 From: Artur K <96597+nemerle@users.noreply.github.com> Date: Tue, 7 Sep 2021 20:14:16 +0200 Subject: [PATCH 169/355] Legacy code cleanup - part 3 (#3903) * Legacy cleanup - part 3 Not much is left that can be easily removed, so I think this will be last cleanup before the legacy functionality is replaced. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * fix windows build, remove a few more things, re-add one file Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Remove legacy RenderBus + more cleanups Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Remove MaterialOwnerBus.h Clean-up in Cry_Matrix34/33 Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> --- Code/Editor/Controls/ConsoleSCB.cpp | 10 +- Code/Editor/CryEditDoc.cpp | 10 - Code/Editor/CryEditDoc.h | 2 - Code/Editor/ErrorReport.cpp | 54 - Code/Editor/ErrorReport.h | 5 - Code/Editor/GameEngine.cpp | 5 - Code/Editor/GameExporter.h | 8 +- Code/Editor/IEditor.h | 1 - Code/Editor/IEditorImpl.cpp | 12 - Code/Editor/IEditorImpl.h | 1 - Code/Editor/IconManager.cpp | 5 +- Code/Editor/Include/Command.h | 13 +- Code/Editor/Include/IEditorMaterial.h | 2 +- Code/Editor/Include/IEditorMaterialManager.h | 2 +- Code/Editor/Include/IErrorReport.h | 15 +- Code/Editor/Include/IObjectManager.h | 1 - Code/Editor/Lib/Tests/IEditorMock.h | 1 - Code/Editor/Objects/BaseObject.cpp | 4 +- Code/Editor/Objects/ObjectManager.cpp | 11 - Code/Editor/Objects/ObjectManager.h | 1 - .../Objects/ComponentEntityObject.cpp | 1 - Code/Editor/Undo/Undo.cpp | 36 - Code/Editor/Undo/Undo.h | 19 +- Code/Editor/Util/EditorUtils.h | 3 - Code/Editor/Util/KDTree.h | 2 +- Code/Legacy/CryCommon/BaseTypes.h | 5 - Code/Legacy/CryCommon/BitFiddling.h | 543 ------ Code/Legacy/CryCommon/Common_TypeInfo.cpp | 21 - Code/Legacy/CryCommon/CryCrc32.h | 210 -- Code/Legacy/CryCommon/CryEndian.h | 75 - Code/Legacy/CryCommon/CryFile.h | 163 -- Code/Legacy/CryCommon/CryHalf.inl | 7 - Code/Legacy/CryCommon/CryListenerSet.h | 10 +- Code/Legacy/CryCommon/CryPodArray.h | 212 --- Code/Legacy/CryCommon/CrySizer.h | 563 ------ Code/Legacy/CryCommon/Cry_Camera.h | 1689 +---------------- Code/Legacy/CryCommon/Cry_Color.h | 779 -------- Code/Legacy/CryCommon/Cry_Geo.h | 797 +------- Code/Legacy/CryCommon/Cry_HWMatrix.h | 85 - Code/Legacy/CryCommon/Cry_HWVector3.h | 278 --- Code/Legacy/CryCommon/Cry_Math.h | 188 +- Code/Legacy/CryCommon/Cry_Matrix33.h | 277 +-- Code/Legacy/CryCommon/Cry_Matrix34.h | 511 +---- Code/Legacy/CryCommon/Cry_Matrix44.h | 16 +- Code/Legacy/CryCommon/Cry_Quat.h | 1136 ----------- Code/Legacy/CryCommon/Cry_Vector2.h | 8 - Code/Legacy/CryCommon/Cry_Vector3.h | 47 +- Code/Legacy/CryCommon/Cry_Vector4.h | 150 +- Code/Legacy/CryCommon/FunctorBaseFunction.h | 93 - Code/Legacy/CryCommon/FunctorBaseMember.h | 97 - Code/Legacy/CryCommon/IConsole.h | 30 +- Code/Legacy/CryCommon/IEntityRenderState.h | 25 +- Code/Legacy/CryCommon/IFont.h | 8 - Code/Legacy/CryCommon/IIndexedMesh.h | 50 - Code/Legacy/CryCommon/ILevelSystem.h | 9 - Code/Legacy/CryCommon/ILocalizationManager.h | 4 - Code/Legacy/CryCommon/ILog.h | 7 - Code/Legacy/CryCommon/IMaterial.h | 6 - Code/Legacy/CryCommon/IMovieSystem.h | 47 - Code/Legacy/CryCommon/IPathfinder.h | 1 + Code/Legacy/CryCommon/IReadWriteXMLSink.h | 105 - Code/Legacy/CryCommon/IRenderAuxGeom.h | 252 +-- Code/Legacy/CryCommon/IRenderer.h | 29 - Code/Legacy/CryCommon/ISerialize.h | 805 +------- Code/Legacy/CryCommon/IShader.h | 5 - Code/Legacy/CryCommon/ISplines.h | 4 +- Code/Legacy/CryCommon/IStatObj.h | 500 +---- Code/Legacy/CryCommon/ISurfaceType.h | 244 --- Code/Legacy/CryCommon/ISystem.h | 42 +- Code/Legacy/CryCommon/ITexture.h | 71 - Code/Legacy/CryCommon/IValidator.h | 54 +- Code/Legacy/CryCommon/IXml.h | 79 +- Code/Legacy/CryCommon/Linux_Win32Wrapper.h | 1 - .../Legacy/CryCommon/LocalizationManagerBus.h | 1 - .../CryCommon/LyShine/Bus/UiTransform2dBus.h | 8 +- Code/Legacy/CryCommon/MTPseudoRandom.cpp | 75 - Code/Legacy/CryCommon/MTPseudoRandom.h | 166 -- Code/Legacy/CryCommon/MathConversion.h | 29 - Code/Legacy/CryCommon/MetaUtils.h | 135 -- Code/Legacy/CryCommon/Mocks/ICVarMock.h | 5 +- Code/Legacy/CryCommon/Mocks/IConsoleMock.h | 3 - Code/Legacy/CryCommon/Mocks/ILogMock.h | 2 - .../Legacy/CryCommon/MultiThread_Containers.h | 30 - Code/Legacy/CryCommon/Random.h | 35 - Code/Legacy/CryCommon/RenderBus.h | 111 -- Code/Legacy/CryCommon/SFunctor.h | 112 -- Code/Legacy/CryCommon/SerializationTypes.h | 3 - Code/Legacy/CryCommon/SerializeFwd.h | 8 - Code/Legacy/CryCommon/SimpleSerialize.h | 148 +- Code/Legacy/CryCommon/StatObjBus.h | 39 +- Code/Legacy/CryCommon/Synchronization.h | 45 - Code/Legacy/CryCommon/TimeValue.h | 4 - Code/Legacy/CryCommon/VertexFormats.h | 420 +--- Code/Legacy/CryCommon/WinBase.cpp | 15 - Code/Legacy/CryCommon/crycommon_files.cmake | 15 - Code/Legacy/CryCommon/platform_impl.cpp | 67 - Code/Legacy/CrySystem/CrySystem_precompiled.h | 1 - Code/Legacy/CrySystem/Huffman.h | 18 - .../CrySystem/LevelSystem/LevelSystem.cpp | 14 - .../CrySystem/LevelSystem/LevelSystem.h | 4 - .../CrySystem/LocalizedStringManager.cpp | 20 - .../Legacy/CrySystem/LocalizedStringManager.h | 44 - Code/Legacy/CrySystem/Log.h | 19 +- Code/Legacy/CrySystem/System.cpp | 4 - Code/Legacy/CrySystem/System.h | 80 +- Code/Legacy/CrySystem/SystemCFG.cpp | 121 +- Code/Legacy/CrySystem/SystemCFG.h | 44 - Code/Legacy/CrySystem/SystemInit.cpp | 3 - Code/Legacy/CrySystem/ViewSystem/View.cpp | 14 - Code/Legacy/CrySystem/ViewSystem/View.h | 4 - .../CrySystem/ViewSystem/ViewSystem.cpp | 18 - Code/Legacy/CrySystem/ViewSystem/ViewSystem.h | 2 - Code/Legacy/CrySystem/XConsole.cpp | 94 +- Code/Legacy/CrySystem/XConsole.h | 142 +- Code/Legacy/CrySystem/XConsoleVariable.cpp | 844 ++++---- Code/Legacy/CrySystem/XConsoleVariable.h | 652 +------ Code/Legacy/CrySystem/XML/ReadWriteXMLSink.h | 43 - Code/Legacy/CrySystem/XML/ReadXMLSink.cpp | 683 ------- .../CrySystem/XML/SerializeXMLReader.cpp | 46 - .../Legacy/CrySystem/XML/SerializeXMLReader.h | 29 +- .../CrySystem/XML/SerializeXMLWriter.cpp | 17 - .../Legacy/CrySystem/XML/SerializeXMLWriter.h | 16 +- Code/Legacy/CrySystem/XML/WriteXMLSource.cpp | 432 ----- Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp | 47 +- Code/Legacy/CrySystem/XML/XMLBinaryNode.h | 9 - Code/Legacy/CrySystem/XML/XMLBinaryWriter.cpp | 54 +- Code/Legacy/CrySystem/XML/XMLBinaryWriter.h | 2 +- Code/Legacy/CrySystem/XML/XMLPatcher.cpp | 423 ----- Code/Legacy/CrySystem/XML/XMLPatcher.h | 81 - Code/Legacy/CrySystem/XML/XmlUtils.cpp | 226 +-- Code/Legacy/CrySystem/XML/XmlUtils.h | 43 +- Code/Legacy/CrySystem/XML/xml.cpp | 142 +- Code/Legacy/CrySystem/XML/xml.h | 12 - Code/Legacy/CrySystem/XML/xml_string.h | 17 - Code/Legacy/CrySystem/crysystem_files.cmake | 7 - .../AtomLyIntegration/AtomFont/AtomFont.h | 1 - .../AtomLyIntegration/AtomFont/AtomNullFont.h | 3 - .../AtomLyIntegration/AtomFont/FBitmap.h | 2 - .../AtomLyIntegration/AtomFont/FFont.h | 24 +- .../AtomLyIntegration/AtomFont/FontRenderer.h | 2 - .../AtomLyIntegration/AtomFont/FontTexture.h | 4 - .../AtomLyIntegration/AtomFont/GlyphBitmap.h | 4 - .../AtomLyIntegration/AtomFont/GlyphCache.h | 4 - Gems/Blast/Code/Source/Family/DamageManager.h | 2 + .../LYCommonMenu/ImGuiLYAssetExplorer.cpp | 1 - .../LmbrCentral/Rendering/MaterialHandle.h | 28 +- .../LmbrCentral/Rendering/MaterialOwnerBus.h | 134 -- .../include/LmbrCentral/Rendering/MeshAsset.h | 2 +- Gems/LmbrCentral/Code/lmbrcentral_files.cmake | 1 - .../Tests/internal/test_UiTextComponent.cpp | 44 +- Gems/LyShine/Code/Source/UiTextComponent.cpp | 88 +- .../LyShineExamples/UiCustomImageBus.h | 8 +- .../Cinematics/CharacterTrackAnimator.h | 7 +- .../Code/Source/Cinematics/MaterialNode.cpp | 30 +- .../Code/Source/Cinematics/MaterialNode.h | 2 +- Gems/Maestro/Code/Source/Cinematics/Movie.cpp | 10 +- Gems/Maestro/Code/Source/Cinematics/Movie.h | 3 - .../Code/Source/Cinematics/SoundTrack.h | 23 +- .../Components/EditorSystemComponent.cpp | 1 - .../ScriptEventsLegacyDefinitions.h | 26 +- Gems/Vegetation/Code/Tests/VegetationMocks.h | 7 - 161 files changed, 894 insertions(+), 16076 deletions(-) delete mode 100644 Code/Legacy/CryCommon/BitFiddling.h delete mode 100644 Code/Legacy/CryCommon/Common_TypeInfo.cpp delete mode 100644 Code/Legacy/CryCommon/CryCrc32.h delete mode 100644 Code/Legacy/CryCommon/CryPodArray.h delete mode 100644 Code/Legacy/CryCommon/CrySizer.h delete mode 100644 Code/Legacy/CryCommon/Cry_HWMatrix.h delete mode 100644 Code/Legacy/CryCommon/Cry_HWVector3.h delete mode 100644 Code/Legacy/CryCommon/FunctorBaseFunction.h delete mode 100644 Code/Legacy/CryCommon/FunctorBaseMember.h delete mode 100644 Code/Legacy/CryCommon/IReadWriteXMLSink.h delete mode 100644 Code/Legacy/CryCommon/ISurfaceType.h delete mode 100644 Code/Legacy/CryCommon/MTPseudoRandom.cpp delete mode 100644 Code/Legacy/CryCommon/MTPseudoRandom.h delete mode 100644 Code/Legacy/CryCommon/MetaUtils.h delete mode 100644 Code/Legacy/CryCommon/RenderBus.h delete mode 100644 Code/Legacy/CryCommon/SFunctor.h delete mode 100644 Code/Legacy/CrySystem/SystemCFG.h delete mode 100644 Code/Legacy/CrySystem/XML/ReadWriteXMLSink.h delete mode 100644 Code/Legacy/CrySystem/XML/ReadXMLSink.cpp delete mode 100644 Code/Legacy/CrySystem/XML/WriteXMLSource.cpp delete mode 100644 Code/Legacy/CrySystem/XML/XMLPatcher.cpp delete mode 100644 Code/Legacy/CrySystem/XML/XMLPatcher.h delete mode 100644 Code/Legacy/CrySystem/XML/xml_string.h delete mode 100644 Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialOwnerBus.h diff --git a/Code/Editor/Controls/ConsoleSCB.cpp b/Code/Editor/Controls/ConsoleSCB.cpp index 4997fa4bec..51d6f8e2e1 100644 --- a/Code/Editor/Controls/ConsoleSCB.cpp +++ b/Code/Editor/Controls/ConsoleSCB.cpp @@ -26,9 +26,6 @@ #include #include -// CryCommon -#include - // Editor #include "QtViewPaneManager.h" #include "Core/QtEditorApplication.h" @@ -392,7 +389,7 @@ void CConsoleSCB::RegisterViewClass() opts.showInMenu = true; opts.builtInActionId = ID_VIEW_CONSOLEWINDOW; opts.shortcut = QKeySequence(Qt::Key_QuoteLeft); - + AzToolsFramework::RegisterViewPane(LyViewPane::Console, LyViewPane::CategoryTools, opts); } @@ -606,8 +603,7 @@ static CVarBlock* VarBlockFromConsoleVars() // Add our on change handler so we can update the CVariable created for // the matching ICVar that has been modified - SFunctor onChange; - onChange.Set(OnVariableUpdated, i, pCVar); + AZStd::function onChange = [row=i,pCVar=pCVar]() { OnVariableUpdated(row,pCVar); }; pCVar->AddOnChangeFunctor(onChange); pVariable->SetDescription(pCVar->GetHelp()); @@ -929,7 +925,7 @@ QWidget* ConsoleVariableItemDelegate::createEditor(QWidget* parent, const QStyle return editor; } } - + // If we get here, value being edited is a string, so use our styled line // edit widget AzQtComponents::StyledLineEdit* lineEdit = new AzQtComponents::StyledLineEdit(parent); diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 9a7e7cc846..ec9a00d1ac 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -1887,16 +1887,6 @@ void CCryEditDoc::SetDocumentReady(bool bReady) m_bDocumentReady = bReady; } -void CCryEditDoc::GetMemoryUsage(ICrySizer* pSizer) const -{ - { - SIZER_COMPONENT_NAME(pSizer, "UndoManager(estimate)"); - GetIEditor()->GetUndoManager()->GetMemoryUsage(pSizer); - } - - pSizer->Add(*this); -} - void CCryEditDoc::RegisterConsoleVariables() { doc_validate_surface_types = gEnv->pConsole->GetCVar("doc_validate_surface_types"); diff --git a/Code/Editor/CryEditDoc.h b/Code/Editor/CryEditDoc.h index a96e9428b6..9c4c4b3fd9 100644 --- a/Code/Editor/CryEditDoc.h +++ b/Code/Editor/CryEditDoc.h @@ -129,8 +129,6 @@ public: // Create from serialization only void RegisterListener(IDocListener* listener); void UnregisterListener(IDocListener* listener); - void GetMemoryUsage(ICrySizer* pSizer) const; - static bool IsBackupOrTempLevelSubdirectory(const QString& folderName); protected: diff --git a/Code/Editor/ErrorReport.cpp b/Code/Editor/ErrorReport.cpp index 7914511fbe..4fd7d41a96 100644 --- a/Code/Editor/ErrorReport.cpp +++ b/Code/Editor/ErrorReport.cpp @@ -249,60 +249,6 @@ void CErrorReport::SetImmediateMode(bool bEnable) } } -////////////////////////////////////////////////////////////////////////// -void CErrorReport::Report(SValidatorRecord& record) -{ - if ((record.flags & VALIDATOR_FLAG_IGNORE_IN_EDITOR)) - { - return; - } - - CErrorRecord err; - if (record.text) - { - err.error = record.text; - } - if (record.description) - { - err.description = record.description; - } - if (record.file) - { - err.file = record.file; - } - else - { - err.file = m_currentFilename; - } - err.severity = (CErrorRecord::ESeverity)record.severity; - - err.assetScope = record.assetScope; - - err.flags = 0; - if (record.flags & VALIDATOR_FLAG_FILE) - { - err.flags |= CErrorRecord::FLAG_NOFILE; - } - if (record.flags & VALIDATOR_FLAG_TEXTURE) - { - err.flags |= CErrorRecord::FLAG_TEXTURE; - } - if (record.flags & VALIDATOR_FLAG_SCRIPT) - { - err.flags |= CErrorRecord::FLAG_SCRIPT; - } - if (record.flags & VALIDATOR_FLAG_AI) - { - err.flags |= CErrorRecord::FLAG_AI; - } - - err.module = record.module; - err.pObject = m_pObject; - err.pItem = m_pItem; - - ReportError(err); -} - ////////////////////////////////////////////////////////////////////////// void CErrorReport::SetCurrentValidatorObject(CBaseObject* pObject) { diff --git a/Code/Editor/ErrorReport.h b/Code/Editor/ErrorReport.h index 2bef4105f8..3b9a860301 100644 --- a/Code/Editor/ErrorReport.h +++ b/Code/Editor/ErrorReport.h @@ -121,11 +121,6 @@ public: //! Assign current filename. void SetCurrentFile(const QString& file); - ////////////////////////////////////////////////////////////////////////// - // Implement IValidator interface. - ////////////////////////////////////////////////////////////////////////// - virtual void Report(SValidatorRecord& record); - private: //! Array of all error records added to report. std::vector m_errors; diff --git a/Code/Editor/GameEngine.cpp b/Code/Editor/GameEngine.cpp index 4b463efe0a..5f3545e593 100644 --- a/Code/Editor/GameEngine.cpp +++ b/Code/Editor/GameEngine.cpp @@ -176,11 +176,6 @@ struct SSystemUserCallback return CryMessageBox(text, caption, uType); } - void GetMemoryUsage(ICrySizer* pSizer) override - { - GetIEditor()->GetMemoryUsage(pSizer); - } - void OnSplashScreenDone() { m_pLogo = nullptr; diff --git a/Code/Editor/GameExporter.h b/Code/Editor/GameExporter.h index 19ec601ff7..ee4e8df3d9 100644 --- a/Code/Editor/GameExporter.h +++ b/Code/Editor/GameExporter.h @@ -5,10 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - - -#ifndef CRYINCLUDE_EDITOR_GAMEEXPORTER_H -#define CRYINCLUDE_EDITOR_GAMEEXPORTER_H #pragma once #include "Util/PakFile.h" @@ -62,7 +58,7 @@ public: // In auto exporting mode, highest possible settings will be chosen and no UI dialogs will be shown. void SetAutoExportMode(bool bAuto) { m_bAutoExportMode = bAuto; } - bool Export(unsigned int flags = 0, EEndian eExportEndian = GetPlatformEndian(), const char* subdirectory = 0); + bool Export(unsigned int flags = 0, EEndian eExportEndian = eEndianness_Little, const char* subdirectory = 0); static CGameExporter* GetCurrentExporter() { return m_pCurrentExporter; } @@ -116,5 +112,3 @@ void SetupTerrainInfo(const size_t octreeCompiledDataSize, Func&& setupTerrainFn setupTerrainFn(octreeCompiledDataSize); } } - -#endif // CRYINCLUDE_EDITOR_GAMEEXPORTER_H diff --git a/Code/Editor/IEditor.h b/Code/Editor/IEditor.h index de7b0ec3f9..7c49819d83 100644 --- a/Code/Editor/IEditor.h +++ b/Code/Editor/IEditor.h @@ -701,7 +701,6 @@ struct IEditor virtual CUIEnumsDatabase* GetUIEnumsDatabase() = 0; virtual void AddUIEnums() = 0; - virtual void GetMemoryUsage(ICrySizer* pSizer) = 0; virtual void ReduceMemory() = 0; //! Export manager for exporting objects and a terrain from the game to DCC tools diff --git a/Code/Editor/IEditorImpl.cpp b/Code/Editor/IEditorImpl.cpp index c7e6cd8ad6..51ef0dedc3 100644 --- a/Code/Editor/IEditorImpl.cpp +++ b/Code/Editor/IEditorImpl.cpp @@ -1506,18 +1506,6 @@ void CEditorImpl::ShowStatusText(bool bEnable) m_bShowStatusText = bEnable; } -void CEditorImpl::GetMemoryUsage(ICrySizer* pSizer) -{ - SIZER_COMPONENT_NAME(pSizer, "Editor"); - - if (GetDocument()) - { - SIZER_COMPONENT_NAME(pSizer, "Document"); - - GetDocument()->GetMemoryUsage(pSizer); - } -} - void CEditorImpl::ReduceMemory() { GetIEditor()->GetUndoManager()->ClearRedoStack(); diff --git a/Code/Editor/IEditorImpl.h b/Code/Editor/IEditorImpl.h index 2cf6c7805b..762dd1db11 100644 --- a/Code/Editor/IEditorImpl.h +++ b/Code/Editor/IEditorImpl.h @@ -280,7 +280,6 @@ public: void SetMatEditMode(bool bIsMatEditMode); CUIEnumsDatabase* GetUIEnumsDatabase() { return m_pUIEnumsDatabase; }; void AddUIEnums(); - void GetMemoryUsage(ICrySizer* pSizer); void ReduceMemory(); // Get Export manager IExportManager* GetExportManager(); diff --git a/Code/Editor/IconManager.cpp b/Code/Editor/IconManager.cpp index 7732ae8155..820213bbd9 100644 --- a/Code/Editor/IconManager.cpp +++ b/Code/Editor/IconManager.cpp @@ -64,10 +64,7 @@ void CIconManager::Reset() int i; for (i = 0; i < sizeof(m_objects) / sizeof(m_objects[0]); i++) { - if (m_objects[i]) - { - m_objects[i]->Release(); - } + delete m_objects[i]; m_objects[i] = nullptr; } for (i = 0; i < eIcon_COUNT; i++) diff --git a/Code/Editor/Include/Command.h b/Code/Editor/Include/Command.h index dfdcec78ef..b3b0641c9d 100644 --- a/Code/Editor/Include/Command.h +++ b/Code/Editor/Include/Command.h @@ -24,16 +24,15 @@ inline AZStd::string ToString(const QString& s) class CCommand { - static inline bool FromString(int32 &val, const char* s) { - if(!s) + static inline bool FromString(int32& val, const char* s) + { + if (!s) { return false; } - val = (int)strtol(s, nullptr, 10); - if(val==0 && errno!=0) { - return false; - } - return true; + val = static_cast(strtol(s, nullptr, 10)); + const bool parsing_error = val == 0 && errno != 0; + return !parsing_error; } public: CCommand( diff --git a/Code/Editor/Include/IEditorMaterial.h b/Code/Editor/Include/IEditorMaterial.h index 487246eb60..329b0ae53f 100644 --- a/Code/Editor/Include/IEditorMaterial.h +++ b/Code/Editor/Include/IEditorMaterial.h @@ -15,6 +15,6 @@ struct IEditorMaterial : public CBaseLibraryItem { virtual int GetFlags() const = 0; - virtual _smart_ptr GetMatInfo(bool bUseExistingEngineMaterial = false) = 0; + virtual IMaterial* GetMatInfo(bool bUseExistingEngineMaterial = false) = 0; virtual void DisableHighlightForFrame() = 0; }; diff --git a/Code/Editor/Include/IEditorMaterialManager.h b/Code/Editor/Include/IEditorMaterialManager.h index 92e68085c1..d76ec32829 100644 --- a/Code/Editor/Include/IEditorMaterialManager.h +++ b/Code/Editor/Include/IEditorMaterialManager.h @@ -19,7 +19,7 @@ struct IEditorMaterialManager { - virtual void GotoMaterial(_smart_ptr pMaterial) = 0; + virtual void GotoMaterial(IMaterial* pMaterial) = 0; }; #endif // CRYINCLUDE_EDITOR_MATERIAL_MATERIALMANAGER_H diff --git a/Code/Editor/Include/IErrorReport.h b/Code/Editor/Include/IErrorReport.h index a516633f25..7bf00d6973 100644 --- a/Code/Editor/Include/IErrorReport.h +++ b/Code/Editor/Include/IErrorReport.h @@ -9,23 +9,18 @@ // Description : Class that collects error reports to present them later. - -#ifndef CRYINCLUDE_EDITOR_INTERFACE_ERRORREPORT_H -#define CRYINCLUDE_EDITOR_INTERFACE_ERRORREPORT_H #pragma once -#include - // forward declarations. class CParticleItem; class CBaseObject; class CBaseLibraryItem; class CErrorRecord; +class QString; /*! Error report manages collection of errors occurred during map analyzes or level load. */ struct IErrorReport - : public IValidator { virtual ~IErrorReport(){} @@ -62,12 +57,4 @@ struct IErrorReport //! Assign current filename. virtual void SetCurrentFile(const QString& file) = 0; - - ////////////////////////////////////////////////////////////////////////// - // Implement IValidator interface. - ////////////////////////////////////////////////////////////////////////// - virtual void Report(SValidatorRecord& record) = 0; }; - - -#endif // CRYINCLUDE_EDITOR_ERRORREPORT_H diff --git a/Code/Editor/Include/IObjectManager.h b/Code/Editor/Include/IObjectManager.h index fb99a50bb0..0a7bc8dcca 100644 --- a/Code/Editor/Include/IObjectManager.h +++ b/Code/Editor/Include/IObjectManager.h @@ -89,7 +89,6 @@ public: //! Get array of objects, managed by manager (not contain sub objects of groups). //! @param layer if 0 get objects for all layers, or layer to get objects from. virtual void GetObjects(CBaseObjectsArray& objects) const = 0; - //virtual void GetObjects(DynArray& objects) const = 0; //! Get array of objects that pass the filter. //! @param filter The filter functor, return true if you want to get the certain obj, return false if want to skip it. diff --git a/Code/Editor/Lib/Tests/IEditorMock.h b/Code/Editor/Lib/Tests/IEditorMock.h index 30f1d23576..cb01757b9c 100644 --- a/Code/Editor/Lib/Tests/IEditorMock.h +++ b/Code/Editor/Lib/Tests/IEditorMock.h @@ -170,7 +170,6 @@ public: MOCK_METHOD0(IsSourceControlConnected, bool()); MOCK_METHOD0(GetUIEnumsDatabase, CUIEnumsDatabase* ()); MOCK_METHOD0(AddUIEnums, void()); - MOCK_METHOD1(GetMemoryUsage, void(ICrySizer* )); MOCK_METHOD0(ReduceMemory, void()); MOCK_METHOD0(GetExportManager, IExportManager* ()); MOCK_METHOD2(SetEditorConfigSpec, void(ESystemConfigSpec , ESystemConfigPlatform )); diff --git a/Code/Editor/Objects/BaseObject.cpp b/Code/Editor/Objects/BaseObject.cpp index 0d5f982bd4..14291a3e4d 100644 --- a/Code/Editor/Objects/BaseObject.cpp +++ b/Code/Editor/Objects/BaseObject.cpp @@ -2735,7 +2735,7 @@ bool CBaseObject::IntersectRayMesh(const Vec3& raySrc, const Vec3& rayDir, SRayH return false; } - Matrix34A worldTM; + Matrix34 worldTM; IStatObj* pStatObj = pRenderNode->GetEntityStatObj(0, 0, &worldTM); if (!pStatObj) { @@ -2743,7 +2743,7 @@ bool CBaseObject::IntersectRayMesh(const Vec3& raySrc, const Vec3& rayDir, SRayH } // transform decal into object space - Matrix34A worldTM_Inverted = worldTM.GetInverted(); + Matrix34 worldTM_Inverted = worldTM.GetInverted(); Matrix33 worldRot(worldTM_Inverted); worldRot.Transpose(); // put hit direction into the object space diff --git a/Code/Editor/Objects/ObjectManager.cpp b/Code/Editor/Objects/ObjectManager.cpp index 30ee1fc57b..8330c4aad7 100644 --- a/Code/Editor/Objects/ObjectManager.cpp +++ b/Code/Editor/Objects/ObjectManager.cpp @@ -759,17 +759,6 @@ void CObjectManager::GetObjects(CBaseObjectsArray& objects) const } } -//void CObjectManager::GetObjects(DynArray& objects) const -//{ -// CBaseObjectsArray objectArray; -// GetObjects(objectArray); -// objects.clear(); -// for (size_t i = 0, iCount(objectArray.size()); i < iCount; ++i) -// { -// objects.push_back(objectArray[i]); -// } -//} - void CObjectManager::GetObjects(CBaseObjectsArray& objects, BaseObjectFilterFunctor const& filter) const { objects.clear(); diff --git a/Code/Editor/Objects/ObjectManager.h b/Code/Editor/Objects/ObjectManager.h index a2e0822a2b..de0a4ce849 100644 --- a/Code/Editor/Objects/ObjectManager.h +++ b/Code/Editor/Objects/ObjectManager.h @@ -122,7 +122,6 @@ public: //! Get array of objects, managed by manager (not contain sub objects of groups). //! @param layer if 0 get objects for all layers, or layer to get objects from. void GetObjects(CBaseObjectsArray& objects) const; - //void GetObjects(DynArray& objects) const; //! Get array of objects that pass the filter. //! @param filter The filter functor, return true if you want to get the certain obj, return false if want to skip it. diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp b/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp index 29ced334ef..8957b6ced6 100644 --- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp +++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.cpp @@ -37,7 +37,6 @@ #include #include #include -#include #include #include diff --git a/Code/Editor/Undo/Undo.cpp b/Code/Editor/Undo/Undo.cpp index 910a670bee..603f651ee0 100644 --- a/Code/Editor/Undo/Undo.cpp +++ b/Code/Editor/Undo/Undo.cpp @@ -62,17 +62,6 @@ public: } } - // to get memory statistics - void GetMemoryUsage(ICrySizer* pSizer) - { - for (int i = 0; i < m_undoSteps.size(); i++) - { - m_undoSteps[i]->GetMemoryUsage(pSizer); - } - - pSizer->Add(*this); - } - private: //! Undo steps included in this step. std::vector m_undoSteps; @@ -746,31 +735,6 @@ int CUndoManager::GetMaxUndoStep() const return GetIEditor()->GetEditorSettings()->undoLevels; } -void CUndoManager::GetMemoryUsage(ICrySizer* pSizer) -{ - if (m_currentUndo) - { - m_currentUndo->GetMemoryUsage(pSizer); - } - - if (m_superUndo) - { - m_superUndo->GetMemoryUsage(pSizer); - } - - for (std::list::const_iterator it = m_undoStack.begin(); it != m_undoStack.end(); it++) - { - (*it)->GetMemoryUsage(pSizer); - } - - for (std::list::const_iterator it = m_redoStack.begin(); it != m_redoStack.end(); it++) - { - (*it)->GetMemoryUsage(pSizer); - } - - pSizer->Add(*this); -} - void CUndoManager::AddListener(IUndoManagerListener* pListener) { stl::push_back_unique(m_listeners, pListener); diff --git a/Code/Editor/Undo/Undo.h b/Code/Editor/Undo/Undo.h index b9d8132a40..f4ee045919 100644 --- a/Code/Editor/Undo/Undo.h +++ b/Code/Editor/Undo/Undo.h @@ -12,9 +12,9 @@ #pragma once #include "IUndoManagerListener.h" -#include "CrySizer.h" // ICrySizer #include "IUndoObject.h" #include +#include struct IUndoObject; class CSuperUndoStep; @@ -79,20 +79,6 @@ public: } } - // to get memory statistics - void GetMemoryUsage(ICrySizer* pSizer) - { - size_t nThisSize = sizeof(*this); - - for (int i = 0; i < m_undoObjects.size(); i++) - { - nThisSize += m_undoObjects[i]->GetSize(); - } - - pSizer->Add(m_name); - pSizer->Add(this, nThisSize); - } - // get undo object at index i IUndoObject* GetUndoObject(int i = 0) { @@ -241,9 +227,6 @@ public: void ClearUndoStack(int num); void ClearRedoStack(int num); - // to get memory statistics - void GetMemoryUsage(ICrySizer* pSizer); - void AddListener(IUndoManagerListener* pListener); void RemoveListener(IUndoManagerListener* pListener); diff --git a/Code/Editor/Util/EditorUtils.h b/Code/Editor/Util/EditorUtils.h index 5008cbcc5c..e950d75012 100644 --- a/Code/Editor/Util/EditorUtils.h +++ b/Code/Editor/Util/EditorUtils.h @@ -20,9 +20,6 @@ #include #include -//! Typedef for quaternion. -//typedef CryQuat Quat; - #include #include #include diff --git a/Code/Editor/Util/KDTree.h b/Code/Editor/Util/KDTree.h index c2ea086175..df25a9ded7 100644 --- a/Code/Editor/Util/KDTree.h +++ b/Code/Editor/Util/KDTree.h @@ -37,7 +37,7 @@ public: struct SStatObj { Matrix34 tm; - _smart_ptr pStatObj; + IStatObj* pStatObj; }; private: diff --git a/Code/Legacy/CryCommon/BaseTypes.h b/Code/Legacy/CryCommon/BaseTypes.h index 0c588184a5..6aac00e4e6 100644 --- a/Code/Legacy/CryCommon/BaseTypes.h +++ b/Code/Legacy/CryCommon/BaseTypes.h @@ -6,9 +6,6 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_BASETYPES_H -#define CRYINCLUDE_CRYCOMMON_BASETYPES_H #pragma once static_assert(sizeof(char) == 1); @@ -78,5 +75,3 @@ typedef float f32; typedef double f64; static_assert(sizeof(f32) == 4); static_assert(sizeof(f64) == 8); - -#endif // CRYINCLUDE_CRYCOMMON_BASETYPES_H diff --git a/Code/Legacy/CryCommon/BitFiddling.h b/Code/Legacy/CryCommon/BitFiddling.h deleted file mode 100644 index 36173c5e53..0000000000 --- a/Code/Legacy/CryCommon/BitFiddling.h +++ /dev/null @@ -1,543 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : various integer bit fiddling hacks - - -#pragma once - -#include - -// Section dictionary -#if defined(AZ_RESTRICTED_PLATFORM) -#define BITFIDDLING_H_SECTION_TRAITS 1 -#define BITFIDDLING_H_SECTION_INTEGERLOG2 2 -#endif - -// Traits -#if defined(AZ_RESTRICTED_PLATFORM) - #define AZ_RESTRICTED_SECTION BITFIDDLING_H_SECTION_TRAITS - #include AZ_RESTRICTED_FILE(BitFiddling_h) -#elif defined(LINUX) || defined(APPLE) -#define BITFIDDLING_H_TRAIT_HAS_COUNT_LEADING_ZEROS 1 -#endif - -#if BITFIDDLING_H_TRAIT_HAS_COUNT_LEADING_ZEROS -#define countLeadingZeros32(x) __builtin_clz(x) -#else // Windows implementation -ILINE uint32 countLeadingZeros32(uint32 x) -{ - DWORD result = 32 ^ 31; // assumes result is unmodified if _BitScanReverse returns 0 - _BitScanReverse(&result, x); - result ^= 31; // needed because the index is from LSB (whereas all other implementations are from MSB) - return result; -} -#endif - -inline uint32 circularShift(uint32 nbits, uint32 i) -{ - return (i << nbits) | (i >> (32 - nbits)); -} - -template -inline size_t countTrailingZeroes(T v) -{ - size_t n = 0; - - v = ~v & (v - 1); - while (v) - { - ++n; - v >>= 1; - } - - return n; -} - -// this function returns the integer logarithm of various numbers without branching -#define IL2VAL(mask, shift) \ - c |= ((x & mask) != 0) * shift; \ - x >>= ((x & mask) != 0) * shift - -template -inline bool IsPowerOfTwo(TInteger x) -{ - return (x & (x - 1)) == 0; -} - -inline uint32 NextPower2(uint32 n) -{ - n--; - n |= n >> 1; - n |= n >> 2; - n |= n >> 4; - n |= n >> 8; - n |= n >> 16; - n++; - return n; -} - -inline uint8 IntegerLog2(uint8 x) -{ - uint8 c = 0; - IL2VAL(0xf0, 4); - IL2VAL(0xc, 2); - IL2VAL(0x2, 1); - return c; -} -inline uint16 IntegerLog2(uint16 x) -{ - uint16 c = 0; - IL2VAL(0xff00, 8); - IL2VAL(0xf0, 4); - IL2VAL(0xc, 2); - IL2VAL(0x2, 1); - return c; -} - -inline uint32 IntegerLog2(uint32 x) -{ - return 31 - countLeadingZeros32(x); -} - -inline uint64 IntegerLog2(uint64 x) -{ - uint64 c = 0; - IL2VAL(0xffffffff00000000ull, 32); - IL2VAL(0xffff0000u, 16); - IL2VAL(0xff00, 8); - IL2VAL(0xf0, 4); - IL2VAL(0xc, 2); - IL2VAL(0x2, 1); - return c; -} - -#if defined(APPLE) || defined(LINUX) -inline unsigned long int IntegerLog2(unsigned long int x) -{ - #if defined(PLATFORM_64BIT) - return IntegerLog2((uint64)x); - #else - return IntegerLog2((uint32)x); - #endif -} -#endif -#undef IL2VAL - -#if defined(AZ_RESTRICTED_PLATFORM) - #define AZ_RESTRICTED_SECTION BITFIDDLING_H_SECTION_INTEGERLOG2 - #include AZ_RESTRICTED_FILE(BitFiddling_h) -#endif - -template -inline TInteger IntegerLog2_RoundUp(TInteger x) -{ - return 1 + IntegerLog2(x - 1); -} - -static ILINE uint8 BitIndex(uint8 v) -{ - uint32 vv = v; - return aznumeric_caster(31 - countLeadingZeros32(vv)); -} - -static ILINE uint8 BitIndex(uint16 v) -{ - uint32 vv = v; - return aznumeric_caster(31 - countLeadingZeros32(vv)); -} - -static ILINE uint8 BitIndex(uint32 v) -{ - return aznumeric_caster(31 - countLeadingZeros32(v)); -} - -static ILINE uint8 CountBits(uint8 v) -{ - uint8 c = v; - c = ((c >> 1) & 0x55) + (c & 0x55); - c = ((c >> 2) & 0x33) + (c & 0x33); - c = ((c >> 4) & 0x0f) + (c & 0x0f); - return c; -} - -static ILINE uint8 CountBits(uint16 v) -{ - return CountBits((uint8)(v & 0xff)) + - CountBits((uint8)((v >> 8) & 0xff)); -} - -static ILINE uint8 CountBits(uint32 v) -{ - return CountBits((uint8)(v & 0xff)) + - CountBits((uint8)((v >> 8) & 0xff)) + - CountBits((uint8)((v >> 16) & 0xff)) + - CountBits((uint8)((v >> 24) & 0xff)); -} - -// Branchless version of return v < 0 ? alt : v; -ILINE int32 Isel32(int32 v, int32 alt) -{ - return ((static_cast(v) >> 31) & alt) | ((static_cast(~v) >> 31) & v); -} - -// Character-to-bitfield mapping - -inline uint32 AlphaBit(char c) -{ - return c >= 'a' && c <= 'z' ? 1 << (c - 'z' + 31) : 0; -} - -inline uint64 AlphaBit64(char c) -{ - return (c >= 'a' && c <= 'z' ? 1U << (c - 'z' + 31) : 0) | - (c >= 'A' && c <= 'Z' ? 1LL << (c - 'Z' + 63) : 0); -} - -inline uint32 AlphaBits(uint32 wc) -{ - // Handle wide multi-char constants, can be evaluated at compile-time. - return AlphaBit((char)wc) - | AlphaBit((char)(wc >> 8)) - | AlphaBit((char)(wc >> 16)) - | AlphaBit((char)(wc >> 24)); -} - -inline uint32 AlphaBits(const char* s) -{ - // Handle string of any length. - uint32 n = 0; - while (*s) - { - n |= AlphaBit(*s++); - } - return n; -} - -inline uint64 AlphaBits64(const char* s) -{ - // Handle string of any length. - uint64 n = 0; - while (*s) - { - n |= AlphaBit64(*s++); - } - return n; -} - -// s should point to a buffer at least 65 chars long -inline void BitsAlpha64(uint64 n, char* s) -{ - for (int i = 0; n != 0; n >>= 1, i++) - { - if (n & 1) - { - *s++ = i < 32 ? static_cast(i + 'z' - 31) : static_cast(i + 'Z' - 63); - } - } - *s++ = '\0'; -} - - -// if hardware doesn't support 3Dc we can convert to DXT5 (different channels are used) -// with almost the same quality but the same memory requirements -inline void ConvertBlock3DcToDXT5(uint8 pDstBlock[16], const uint8 pSrcBlock[16]) -{ - assert(pDstBlock != pSrcBlock); // does not work in place - - // 4x4 block requires 8 bytes in DXT5 or 3DC - - // DXT5: 8 bit alpha0, 8 bit alpha1, 16*3 bit alpha lerp - // 16bit col0, 16 bit col1 (R5G6B5 low byte then high byte), 16*2 bit color lerp - - // 3DC: 8 bit x0, 8 bit x1, 16*3 bit x lerp - // 8 bit y0, 8 bit y1, 16*3 bit y lerp - - for (uint32 dwK = 0; dwK < 8; ++dwK) - { - pDstBlock[dwK] = pSrcBlock[dwK]; - } - for (uint32 dwK = 8; dwK < 16; ++dwK) - { - pDstBlock[dwK] = 0; - } - - // 6 bit green channel (highest bits) - // by using all 3 channels with a slight offset we can get more precision but then a dot product would be needed in PS - // because of bilinear filter we cannot just distribute bits to get perfect result - uint16 colDst0 = (((uint16)pSrcBlock[8] + 2) >> 2) << 5; - uint16 colDst1 = (((uint16)pSrcBlock[9] + 2) >> 2) << 5; - - bool bFlip = colDst0 <= colDst1; - - if (bFlip) - { - uint16 help = colDst0; - colDst0 = colDst1; - colDst1 = help; - } - - bool bEqual = colDst0 == colDst1; - - // distribute bytes by hand to not have problems with endianess - pDstBlock[8 + 0] = (uint8)colDst0; - pDstBlock[8 + 1] = (uint8)(colDst0 >> 8); - pDstBlock[8 + 2] = (uint8)colDst1; - pDstBlock[8 + 3] = (uint8)(colDst1 >> 8); - - uint16* pSrcBlock16 = (uint16*)(pSrcBlock + 10); - uint16* pDstBlock16 = (uint16*)(pDstBlock + 12); - - // distribute 16 3 bit values to 16 2 bit values (loosing LSB) - for (uint32 dwK = 0; dwK < 16; ++dwK) - { - uint32 dwBit0 = dwK * 3 + 0; - uint32 dwBit1 = dwK * 3 + 1; - uint32 dwBit2 = dwK * 3 + 2; - - uint8 hexDataIn = (((pSrcBlock16[(dwBit2 >> 4)] >> (dwBit2 & 0xf)) & 1) << 2) // get HSB - | (((pSrcBlock16[(dwBit1 >> 4)] >> (dwBit1 & 0xf)) & 1) << 1) - | ((pSrcBlock16[(dwBit0 >> 4)] >> (dwBit0 & 0xf)) & 1); // get LSB - - uint8 hexDataOut = 0; - - switch (hexDataIn) - { - case 0: - hexDataOut = 0; - break; // color 0 - case 1: - hexDataOut = 1; - break; // color 1 - - case 2: - hexDataOut = 0; - break; // mostly color 0 - case 3: - hexDataOut = 2; - break; - case 4: - hexDataOut = 2; - break; - case 5: - hexDataOut = 3; - break; - case 6: - hexDataOut = 3; - break; - case 7: - hexDataOut = 1; - break; // mostly color 1 - - default: - assert(0); - } - - if (bFlip) - { - if (hexDataOut < 2) - { - hexDataOut = 1 - hexDataOut; // 0<->1 - } - else - { - hexDataOut = 5 - hexDataOut; // 2<->3 - } - } - - if (bEqual) - { - if (hexDataOut == 3) - { - hexDataOut = 1; - } - } - - pDstBlock16[(dwK >> 3)] |= (hexDataOut << ((dwK & 0x7) << 1)); - } -} - - - - -// is a bit on in a new bit field, but off in an old bit field -static ILINE bool TurnedOnBit(unsigned bit, unsigned oldBits, unsigned newBits) -{ - return (newBits & bit) != 0 && (oldBits & bit) == 0; -} - - - - - - - -inline uint32 cellUtilCountLeadingZero(uint32 x) -{ - uint32 y; - uint32 n = 32; - - y = x >> 16; - if (y != 0) - { - n = n - 16; - x = y; - } - y = x >> 8; - if (y != 0) - { - n = n - 8; - x = y; - } - y = x >> 4; - if (y != 0) - { - n = n - 4; - x = y; - } - y = x >> 2; - if (y != 0) - { - n = n - 2; - x = y; - } - y = x >> 1; - if (y != 0) - { - return n - 2; - } - return n - x; -} - -inline uint32 cellUtilLog2(uint32 x) -{ - return 31 - cellUtilCountLeadingZero(x); -} - - - - -inline void convertSwizzle(uint8*& dst, const uint8*& src, - const uint32 SrcPitch, const uint32 depth, - const uint32 xpos, const uint32 ypos, - const uint32 SciX1, const uint32 SciY1, - const uint32 SciX2, const uint32 SciY2, - const uint32 level) -{ - if (level == 1) - { - switch (depth) - { - case 16: - if (xpos >= SciX1 && xpos < SciX2 && ypos >= SciY1 && ypos < SciY2) - { - // *((uint32*&)dst)++ = ((uint32*)src)[ypos * width + xpos]; - // *((uint32*&)dst)++ = ((uint32*)src)[ypos * width + xpos+1]; - // *((uint32*&)dst)++ = ((uint32*)src)[ypos * width + xpos+2]; - // *((uint32*&)dst)++ = ((uint32*)src)[ypos * width + xpos+3]; - *((uint32*&)dst)++ = *((uint32*)(src + (ypos * SrcPitch + xpos * 16))); - *((uint32*&)dst)++ = *((uint32*)(src + (ypos * SrcPitch + xpos * 16 + 4))); - *((uint32*&)dst)++ = *((uint32*)(src + (ypos * SrcPitch + xpos * 16 + 8))); - *((uint32*&)dst)++ = *((uint32*)(src + (ypos * SrcPitch + xpos * 16 + 12))); - } - else - { - ((uint32*&)dst) += 4; - } - break; - case 8: - if (xpos >= SciX1 && xpos < SciX2 && ypos >= SciY1 && ypos < SciY2) - { - *((uint32*&)dst)++ = *((uint32*)(src + (ypos * SrcPitch + xpos * 8))); - *((uint32*&)dst)++ = *((uint32*)(src + (ypos * SrcPitch + xpos * 8 + 4))); - } - else - { - ((uint32*&)dst) += 2; - } - break; - case 4: - if (xpos >= SciX1 && xpos < SciX2 && ypos >= SciY1 && ypos < SciY2) - { - *((uint32*&)dst) = *((uint32*)(src + (ypos * SrcPitch + xpos * 4))); - } - dst += 4; - break; - case 3: - if (xpos >= SciX1 && xpos < SciX2 && ypos >= SciY1 && ypos < SciY2) - { - *dst++ = src[ypos * SrcPitch + xpos * depth]; - *dst++ = src[ypos * SrcPitch + xpos * depth + 1]; - *dst++ = src[ypos * SrcPitch + xpos * depth + 2]; - } - else - { - dst += 3; - } - break; - case 1: - if (xpos >= SciX1 && xpos < SciX2 && ypos >= SciY1 && ypos < SciY2) - { - *dst++ = src[ypos * SrcPitch + xpos * depth]; - } - else - { - dst++; - } - break; - default: - assert(0); - } - return; - } - else - { - convertSwizzle(dst, src, SrcPitch, depth, xpos, ypos, SciX1, SciY1, SciX2, SciY2, level - 1); - convertSwizzle(dst, src, SrcPitch, depth, xpos + (1U << (level - 2)), ypos, SciX1, SciY1, SciX2, SciY2, level - 1); - convertSwizzle(dst, src, SrcPitch, depth, xpos, ypos + (1U << (level - 2)), SciX1, SciY1, SciX2, SciY2, level - 1); - convertSwizzle(dst, src, SrcPitch, depth, xpos + (1U << (level - 2)), ypos + (1U << (level - 2)), SciX1, SciY1, SciX2, SciY2, level - 1); - } -} - - - - -inline void Linear2Swizzle(uint8* dst, - const uint8* src, - const uint32 SrcPitch, - const uint32 width, - const uint32 height, - const uint32 depth, - const uint32 SciX1, const uint32 SciY1, - const uint32 SciX2, const uint32 SciY2) -{ - src -= SciY1 * SrcPitch + SciX1 * depth; - if (width == height) - { - convertSwizzle(dst, src, SrcPitch, depth, 0, 0, SciX1, SciY1, SciX2, SciY2, cellUtilLog2(width) + 1); - } - else - if (width > height) - { - uint32 baseLevel = cellUtilLog2(width) - (cellUtilLog2(width) - cellUtilLog2(height)); - for (uint32 i = 0; i < (1UL << (cellUtilLog2(width) - cellUtilLog2(height))); i++) - { - convertSwizzle(dst, src, SrcPitch, depth, (1U << baseLevel) * i, 0, SciX1, SciY1, SciX2, SciY2, baseLevel + 1); - } - } - else - // if (width < height)//wtf - { - uint32 baseLevel = cellUtilLog2(height) - (cellUtilLog2(height) - cellUtilLog2(width)); - for (uint32 i = 0; i < (1UL << (cellUtilLog2(height) - cellUtilLog2(width))); i++) - { - convertSwizzle(dst, src, SrcPitch, depth, 0, (1U << baseLevel) * i, SciX1, SciY1, SciX2, SciY2, baseLevel + 1); - } - } -} diff --git a/Code/Legacy/CryCommon/Common_TypeInfo.cpp b/Code/Legacy/CryCommon/Common_TypeInfo.cpp deleted file mode 100644 index ccb28cbc3d..0000000000 --- a/Code/Legacy/CryCommon/Common_TypeInfo.cpp +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "Cry_Geo.h" -#include "Cry_Color.h" -#include "Cry_Vector3.h" - -// Manually instantiate templates as needed here. -template struct Vec3_tpl; -template struct Vec4_tpl; -template struct Vec2_tpl; -template struct Ang3_tpl; -template struct Plane_tpl; -template struct Matrix33_tpl; -template struct Color_tpl; diff --git a/Code/Legacy/CryCommon/CryCrc32.h b/Code/Legacy/CryCommon/CryCrc32.h deleted file mode 100644 index 9584f84185..0000000000 --- a/Code/Legacy/CryCommon/CryCrc32.h +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#pragma once - -#include "BaseTypes.h" - -// CRC-32 -// -// Polynomial: -// 0x04C11DB7 -// x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1 -// -// Validation: -// CCrc32::Compute("123456789") == 0xCBF43926 -// -// Examples of using: -// -// printf("crc32: %08x\n", (unsigned)CCrc32::Compute(ptr, size)); -// -// CCrc32 crc; -// crc.Add(ptr0, size0); -// crc.Add(ptr1, size1); -// printf("crc32: %08x\n", (unsigned)crc.Get()); - -class CCrc32 -{ -public: - static uint32 Compute(const void* const pData, const size_t sizeInBytes) - { - CCrc32 c; - c.Add(pData, sizeInBytes); - return c.Get(); - } - - static uint32 Compute(const char* const szData) - { - CCrc32 c; - c.Add(szData); - return c.Get(); - } - - static uint32 ComputeLowercase(const char* const pData, const size_t sizeInBytes) - { - CCrc32 c; - c.AddLowercase(pData, sizeInBytes); - return c.Get(); - } - - static uint32 ComputeLowercase(const char* const szData) - { - CCrc32 c; - c.AddLowercase(szData); - return c.Get(); - } - - - CCrc32() - : m_crc(0xFFFFffff) - , m_pTable(GetTable()) - { - } - - CCrc32(unsigned int initializer) - : m_crc(initializer) - , m_pTable(GetTable()) - { - } - - void Reset() - { - m_crc = 0xFFFFffff; - } - - uint32 Get() const - { - return ~m_crc; - } - - unsigned int Add(const void* const pData, size_t sizeInBytes) - { - const uint8* p = (const uint8*)pData; - while (sizeInBytes--) - { - m_crc = (m_crc >> 8) ^ m_pTable[(m_crc & 0xFF) ^ (*p++)]; - } - return Get(); - } - - unsigned int Add(const char* szData) - { - while (*szData) - { - m_crc = (m_crc >> 8) ^ m_pTable[(m_crc & 0xFF) ^ uint8(*szData++)]; - } - return Get(); - } - -#if defined(CRY_TMP_ASCII_TO_LOWER) -# error CRY_TMP_ASCII_TO_LOWER already defined -#endif -#define CRY_TMP_ASCII_TO_LOWER(c) uint8(((c) <= 'Z' && (c) >= 'A') ? (c) + ('a' - 'A') : (c)) - - unsigned int AddLowercase(const char* pData, size_t sizeInBytes) - { - while (sizeInBytes--) - { - const uint8 c = *pData++; - m_crc = (m_crc >> 8) ^ m_pTable[(m_crc & 0xFF) ^ CRY_TMP_ASCII_TO_LOWER(c)]; - } - return Get(); - } - - unsigned int AddLowercase(const char* szData) - { - while (*szData) - { - const uint8 c = *szData++; - m_crc = (m_crc >> 8) ^ m_pTable[(m_crc & 0xFF) ^ CRY_TMP_ASCII_TO_LOWER(c)]; - } - return Get(); - } - -#undef CRY_TMP_ASCII_TO_LOWER - -private: - static const uint32* GetTable() - { - static const uint32 table[256] = - { - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D - }; - return &table[0]; - } - -private: - uint32 m_crc; - const uint32* const m_pTable; -}; - -// eof diff --git a/Code/Legacy/CryCommon/CryEndian.h b/Code/Legacy/CryCommon/CryEndian.h index 94fa8f7ea2..2f424c5ee2 100644 --- a/Code/Legacy/CryCommon/CryEndian.h +++ b/Code/Legacy/CryCommon/CryEndian.h @@ -6,9 +6,6 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_CRYENDIAN_H -#define CRYINCLUDE_CRYCOMMON_CRYENDIAN_H #pragma once #include @@ -68,18 +65,6 @@ enum EEndianness #endif }; - -// Legacy macros -#define GetPlatformEndian() false - -///////////////////////////////////////////////////////////////////////////////////// - -inline bool IsSystemLittleEndian() -{ - const int a = 1; - return 1 == *(const char*)&a; -} - ///////////////////////////////////////////////////////////////////////////////////// // SwapEndian function, using TypeInfo. @@ -233,63 +218,3 @@ inline void SwapEndian(T& t, bool bSwapEndian = eLittleEndian) SwapEndianBase(&t, 1); } } - -template -inline T SwapEndianValue(T t, bool bSwapEndian = eLittleEndian) -{ - if (bSwapEndian) - { - SwapEndianBase(&t, 1); - } - return t; -} - -//--------------------------------------------------------------------------- -// Object-oriented data extraction for endian-swapping reading. -template -inline T* StepData(D*& pData, size_t nCount, bool bSwapEndian) -{ - T* Elems = (T*)pData; - SwapEndian(Elems, nCount, bSwapEndian); - pData = (D*)((T*)pData + nCount); - return Elems; -} - -template -inline T* StepData(D*& pData, bool bSwapEndian) -{ - return StepData(pData, 1, bSwapEndian); -} - -template -inline void StepData(T*& Result, D*& pData, size_t nCount, bool bSwapEndian) -{ - Result = StepData(pData, nCount, bSwapEndian); -} - -template -inline void StepDataCopy(T* Dest, D*& pData, size_t nCount, bool bSwapEndian) -{ - memcpy(Dest, pData, nCount * sizeof(T)); - SwapEndian(Dest, nCount, bSwapEndian); - pData = (D*)((T*)pData + nCount); -} - -template -inline void StepDataWrite(D*& pDest, const T* aSrc, size_t nCount, bool bSwapEndian) -{ - memcpy(pDest, aSrc, nCount * sizeof(T)); - if (bSwapEndian) - { - SwapEndianBase((T*)pDest, nCount, true); - } - (T*&)pDest += nCount; -} - -template -inline void StepDataWrite(D*& pDest, const T& Src, bool bSwapEndian) -{ - StepDataWrite(pDest, &Src, 1, bSwapEndian); -} - -#endif // CRYINCLUDE_CRYCOMMON_CRYENDIAN_H diff --git a/Code/Legacy/CryCommon/CryFile.h b/Code/Legacy/CryCommon/CryFile.h index 0d2dac7c16..56d7097344 100644 --- a/Code/Legacy/CryCommon/CryFile.h +++ b/Code/Legacy/CryCommon/CryFile.h @@ -6,12 +6,7 @@ * */ - // Description : File wrapper. - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYFILE_H -#define CRYINCLUDE_CRYCOMMON_CRYFILE_H #pragma once #include @@ -20,86 +15,16 @@ #include #include -////////////////////////////////////////////////////////////////////////// -// Defines for CryEngine filetypes extensions. -////////////////////////////////////////////////////////////////////////// -#define CRY_GEOMETRY_FILE_EXT "cgf" -#define CRY_SKEL_FILE_EXT "chr" //will be a SKEL soon -#define CRY_SKIN_FILE_EXT "skin" -#define CRY_CHARACTER_ANIMATION_FILE_EXT "caf" -#define CRY_CHARACTER_DEFINITION_FILE_EXT "cdf" -#define CRY_CHARACTER_LIST_FILE_EXT "cid" -#define CRY_ANIM_GEOMETRY_FILE_EXT "cga" -#define CRY_ANIM_GEOMETRY_ANIMATION_FILE_EXT "anm" -#define CRY_COMPILED_FILE_EXT "(c)" -#define CRY_BINARY_XML_FILE_EXT "binxml" -#define CRY_XML_FILE_EXT "xml" -#define CRY_CHARACTER_PARAM_FILE_EXT "chrparams" -#define CRY_GEOM_CACHE_FILE_EXT "cax" ////////////////////////////////////////////////////////////////////////// #define CRYFILE_MAX_PATH 260 ////////////////////////////////////////////////////////////////////////// -inline const char* CryGetExt(const char* filepath) -{ - const char* str = filepath; - size_t len = strlen(filepath); - for (const char* p = str + len - 1; p >= str; --p) - { - switch (*p) - { - case ':': - case '/': - case '\\': - // we've reached a path separator - it means there's no extension in this name - return ""; - case '.': - // there's an extension in this file name - return p + 1; - } - } - return ""; -} - -// Summary: -// Checks if specified file name is a character file. -// Summary: -// Checks if specified file name is a character file. -inline bool IsCharacterFile(const char* filename) -{ - const char* ext = CryGetExt(filename); - if (_stricmp(ext, CRY_SKEL_FILE_EXT) == 0 || _stricmp(ext, CRY_SKIN_FILE_EXT) == 0 || _stricmp(ext, CRY_CHARACTER_DEFINITION_FILE_EXT) == 0 || _stricmp(ext, CRY_ANIM_GEOMETRY_FILE_EXT) == 0) - { - return true; - } - else - { - return false; - } -} - -// Description: -// Checks if specified file name is a static geometry file. -inline bool IsStatObjFile(const char* filename) -{ - const char* ext = CryGetExt(filename); - if (_stricmp(ext, CRY_GEOMETRY_FILE_EXT) == 0) - { - return true; - } - else - { - return false; - } -} - // Summary: // Wrapper on file system. class CCryFile { public: CCryFile(); - CCryFile(AZ::IO::IArchive* pIArchive); // allow an alternative IArchiveinterface CCryFile(const char* filename, const char* mode); ~CCryFile(); @@ -112,13 +37,6 @@ public: // Summary: // Reads data from a file at the current file position. size_t ReadRaw(void* lpBuf, size_t nSize); - // Summary: - // Template version, for automatic size support. - template - inline size_t ReadTypeRaw(T* pDest, size_t nCount = 1) - { - return ReadRaw(pDest, sizeof(T) * nCount); - } // Summary: // Automatic endian-swapping version. @@ -137,27 +55,6 @@ public: // Summary: // Moves the current file pointer to the specified position. size_t Seek(size_t seek, int mode); - // Summary: - // Moves the current file pointer at the beginning of the file. - void SeekToBegin(); - // Summary: - // Moves the current file pointer at the end of the file. - size_t SeekToEnd(); - // Summary: - // Retrieves the current file pointer. - size_t GetPosition(); - - // Summary: - // Tests for end-of-file on a selected file. - bool IsEof(); - - // Summary: - // Flushes any data yet to be written. - void Flush(); - - // Summary: - // Gets a handle to a pack object. - AZ::IO::HandleType GetHandle() const { return m_fileHandle; }; // Description: // Retrieves the filename of the selected file. @@ -193,12 +90,6 @@ inline CCryFile::CCryFile() m_pIArchive = gEnv ? gEnv->pCryPak : NULL; } -inline CCryFile::CCryFile(AZ::IO::IArchive* pIArchive) -{ - m_fileHandle = AZ::IO::InvalidHandle; - m_pIArchive = pIArchive; -} - ////////////////////////////////////////////////////////////////////////// inline CCryFile::CCryFile(const char* filename, const char* mode) { @@ -336,58 +227,6 @@ inline size_t CCryFile::Seek(size_t seek, int mode) return 1; } -////////////////////////////////////////////////////////////////////////// -inline void CCryFile::SeekToBegin() -{ - Seek(0, SEEK_SET); -} - -////////////////////////////////////////////////////////////////////////// -inline size_t CCryFile::SeekToEnd() -{ - return Seek(0, SEEK_END); -} - -////////////////////////////////////////////////////////////////////////// -inline size_t CCryFile::GetPosition() -{ - assert(m_fileHandle != AZ::IO::InvalidHandle); - if (m_pIArchive) - { - return m_pIArchive->FTell(m_fileHandle); - } - - AZ::u64 tellOffset = 0; - AZ::IO::FileIOBase::GetInstance()->Tell(m_fileHandle, tellOffset); - - return static_cast(tellOffset); -} - -////////////////////////////////////////////////////////////////////////// -inline bool CCryFile::IsEof() -{ - assert(m_fileHandle != AZ::IO::InvalidHandle); - if (m_pIArchive) - { - return m_pIArchive->FEof(m_fileHandle) != 0; - } - - return AZ::IO::FileIOBase::GetInstance()->Eof(m_fileHandle); -} - -////////////////////////////////////////////////////////////////////////// -inline void CCryFile::Flush() -{ - assert(m_fileHandle != AZ::IO::InvalidHandle); - - if (m_pIArchive) - { - m_pIArchive->FFlush(m_fileHandle); - } - - AZ::IO::FileIOBase::GetInstance()->Flush(m_fileHandle); -} - ////////////////////////////////////////////////////////////////////////// inline bool CCryFile::IsInPak() const { @@ -433,5 +272,3 @@ inline const char* CCryFile::GetAdjustedFilename() const } return szAdjustedFile; } - -#endif // CRYINCLUDE_CRYCOMMON_CRYFILE_H diff --git a/Code/Legacy/CryCommon/CryHalf.inl b/Code/Legacy/CryCommon/CryHalf.inl index a9683540e1..678dc36581 100644 --- a/Code/Legacy/CryCommon/CryHalf.inl +++ b/Code/Legacy/CryCommon/CryHalf.inl @@ -15,7 +15,6 @@ typedef uint16 CryHalf; -class ICrySizer; typedef union floatint_union { @@ -138,9 +137,6 @@ struct CryHalf2 { return x != rhs.x || y != rhs.y; } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const {} - }; struct CryHalf4 @@ -193,9 +189,6 @@ struct CryHalf4 { return x != rhs.x || y != rhs.y || z != rhs.z || w != rhs.w; } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const {} - }; #endif // #ifndef CRY_HALF_INL diff --git a/Code/Legacy/CryCommon/CryListenerSet.h b/Code/Legacy/CryCommon/CryListenerSet.h index e5be89aa9f..1c67275d41 100644 --- a/Code/Legacy/CryCommon/CryListenerSet.h +++ b/Code/Legacy/CryCommon/CryListenerSet.h @@ -21,7 +21,8 @@ #pragma once -#include +#include "Cry_Math.h" +#include /************************************************************************ Core elements: @@ -151,13 +152,6 @@ public: // Allow TListeners::Notifier style usage typedef class CListenerNotifier Notifier; - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddContainer(m_listeners); -#if defined(CRY_LISTENERSET_DEBUG) - pSizer->AddContainer(m_allocatedNames); -#endif - } private: // DO NOT REMOVE - following methods only to be accessed only via CNotifier struct ListenerRecord diff --git a/Code/Legacy/CryCommon/CryPodArray.h b/Code/Legacy/CryCommon/CryPodArray.h deleted file mode 100644 index 20693b29ac..0000000000 --- a/Code/Legacy/CryCommon/CryPodArray.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Simple POD types container - -#ifndef CRYINCLUDE_CRYCOMMON_CRYPODARRAY_H -#define CRYINCLUDE_CRYCOMMON_CRYPODARRAY_H -#pragma once - -#include - -////////////////////////////////////////////////////////////////////////// -// POD Array -// vector like class (random access O(1)) without construction/destructor/copy constructor/assignment handling -// over-allocation allows safe prefetching where required without worrying about memory page boundaries -////////////////////////////////////////////////////////////////////////// -template -class PodArray -{ - AZStd::vector m_elements; - -public: - typedef T value_type; - typedef T* iterator; - typedef const T* const_iterator; - - ////////////////////////////////////////////////////////////////////////// - // STL compatible interface - ////////////////////////////////////////////////////////////////////////// - void resize(size_t numElements) - { - m_elements.resize(numElements); - } - ////////////////////////////////////////////////////////////////////////// - ILINE void reserve(unsigned numElements) { m_elements.reserve(numElements); } - ILINE void push_back(const T& rElement) { m_elements.push_back(rElement); } - ILINE size_t size() const { return m_elements.size(); } - ILINE size_t capacity() const { return m_elements.capacity(); } - - ILINE void clear() { m_elements.clear(); } - ILINE T* begin() { return m_elements.begin(); } - ILINE T* end() { return m_elements.end(); } - ILINE const T* begin() const { return m_elements.begin(); } - ILINE const T* end() const { return m_elements.end(); } - ILINE bool empty() const { return m_elements.empty(); } - - ILINE const T& front() const { return m_elements.front(); } - ILINE T& front() { return m_elements.front(); } - - ILINE const T& back() const { return m_elements.back(); } - ILINE T& back() { return m_elements.back(); } - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - PodArray() - : m_elements() - { - } - PodArray(int elem_count, int nNewCount = 0) - { - m_elements.reserve(elem_count); - m_elements.resize(nNewCount); - } - PodArray(const PodArray& from) - : m_elements(from.m_elements) - { - } - ~PodArray() - { - } - - void Reset() { m_elements.clear(); } - void Free() - { - m_elements.clear(); - m_elements.shrink_to_fit(); - } - - ILINE void Clear() - { - m_elements.clear(); - } - - int Find(const T& p) - { - const auto it = AZStd::find(m_elements.begin(), m_elements.end(), p); - if (it != m_elements.end()) - { - return static_cast(AZStd::distance(m_elements.begin(), it)); - } - return -1; - } - - inline void AddList(const PodArray& lstAnother) - { - AZStd::copy(lstAnother.m_elements.begin(), lstAnother.m_elements.end(), AZStd::back_inserter(m_elements)); - } - - inline void AddList(T* pAnotherArray, int nAnotherCount) - { - AZStd::copy(pAnotherArray, pAnotherArray + nAnotherCount, AZStd::back_inserter(m_elements)); - } - - ILINE void Add(const T& p) - { - m_elements.push_back(p); - } - - ILINE T& AddNew() - { - m_elements.emplace_back(); - return m_elements.back(); - } - - void InsertBefore(const T& p, const unsigned int nBefore) - { - m_elements.insert(m_elements.begin() + nBefore, p); - } - - void CheckAllocated(int elem_count) - { - if (m_elements.size() < elem_count) - { - m_elements.resize(elem_count); - } - } - - void PreAllocate(int elem_count, int nNewCount = -1) - { - m_elements.reserve(elem_count); - if (nNewCount >= 0) - { - m_elements.resize(nNewCount); - } - } - - inline void Delete(const int nElemId, const int nElemCount = 1) - { - AZ_Assert(nElemId >= 0 && nElemId + nElemCount <= size(), "Index out of bounds"); - m_elements.erase(m_elements.begin() + nElemId, m_elements.begin() + nElemId + nElemCount); - } - - inline void DeleteFastUnsorted(const int nElemId, const int nElemCount = 1) - { - AZ_Assert(nElemId >= 0 && nElemId + nElemCount <= size(), "Index out of bounds"); - m_elements.erase(m_elements.begin() + nElemId, m_elements.begin() + nElemId + nElemCount); - } - - inline bool Delete(const T& del) - { - const size_t numElements = m_elements.size(); - m_elements.erase(std::remove(m_elements.begin(), m_elements.end(), del), m_elements.end()); - return numElements != m_elements.size(); - } - - ILINE size_t Count() const { return m_elements.size(); } - ILINE size_t Size() const { return m_elements.size(); } - - ILINE int IsEmpty() const { return m_elements.empty(); } - - ILINE const T& operator [] (int i) const { return m_elements[i]; } - ILINE T& operator [] (int i) { return m_elements[i]; } - ILINE const T& GetAt(int i) const { return m_elements[i]; } - ILINE T& GetAt(int i) { return m_elements[i]; } - ILINE const T* Get(int i) const { return &m_elements[i]; } - ILINE T* Get(int i) { return &m_elements[i]; } - ILINE const T* GetElements() const { return m_elements.data(); } - ILINE T* GetElements() { return m_elements.data(); } - - ILINE unsigned int GetDataSize() const { return m_elements.size() * sizeof(T); } - - const T& Last() const { return m_elements.back(); } - T& Last() { return m_elements.back(); } - - ILINE void DeleteLast() - { - assert(!m_elements.empty()); - m_elements.pop_back(); - } - - PodArray& operator=(const PodArray& source_list) - { - m_elements = source_list.m_elements; - return *this; - } - - ////////////////////////////////////////////////////////////////////////// - // Return true if arrays have the same data. - bool Compare(const PodArray& l) const - { - return m_elements == l.m_elements; - } - - // for statistics - ILINE size_t ComputeSizeInMemory() const - { - return (sizeof(*this) + sizeof(T) * m_elements.capacity()) + overAllocBytes; - } - - ILINE void RemoveIf(AZStd::function testFunc) - { - m_elements.erase(AZStd::remove_if(m_elements.begin(), m_elements.end(), testFunc), m_elements.end()); - } -}; - -#endif // CRYINCLUDE_CRYCOMMON_CRYPODARRAY_H diff --git a/Code/Legacy/CryCommon/CrySizer.h b/Code/Legacy/CryCommon/CrySizer.h deleted file mode 100644 index 27323368ab..0000000000 --- a/Code/Legacy/CryCommon/CrySizer.h +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Declaration and definition of the CrySizer class, which is used to -// calculate the memory usage by the subsystems and components, to help -// the artists keep the memory budged low. - - -#ifndef CRYINCLUDE_CRYCOMMON_CRYSIZER_H -#define CRYINCLUDE_CRYCOMMON_CRYSIZER_H -#pragma once - - -////////////////////////////////////////////////////////////////////////// - -// common containers for overloads -#include - -#include "Cry_Math.h" -#include -#include -#include -#include -#include -#include -#include - -// forward declarations for overloads -struct AABB; -struct SVF_P3F; -struct SVF_P3F_C4B_T2F; -struct SVF_P3S_C4B_T2S; -struct SPipTangents; - -#ifdef WIN64 -#include // workaround for Amd64 compiler -#endif - -namespace AZ -{ - class Vector3; -} - -// flags applicable to the ICrySizer (retrieved via getFlags() method) -// -enum ICrySizerFlagsEnum -{ - // if this flag is set, during getSize(), the subsystem must count all the objects - // it uses in the other subsystems also - CSF_RecurseSubsystems = 1 << 0, - - CSF_Reserved1 = 1 << 1, - CSF_Reserved2 = 1 << 2 -}; - -////////////////////////////////////////////////////////////////////////// -// Helper functions to calculate size of the std containers. -////////////////////////////////////////////////////////////////////////// -namespace stl -{ - template - inline size_t size_of_map(const Map& m) - { - if (!m.empty()) - { - return m.size() * sizeof(typename Map::value_type) + m.size() * sizeof(MapLikeStruct); - } - return 0; - } - template - inline size_t size_of_set(const Map& m) - { - if (!m.empty()) - { - return m.size() * sizeof(typename Map::value_type) + m.size() * sizeof(MapLikeStruct); - } - return 0; - } - template - inline size_t size_of_list(const List& c) - { - if (!c.empty()) - { - return c.size() * sizeof(typename List::value_type) + c.size() * sizeof(void*) * 2; // sizeof stored type + 2 pointers prev,next - } - return 0; - } - template - inline size_t size_of_deque(const Deque& c) - { - if (!c.empty()) - { - return c.size() * sizeof(typename Deque::value_type); - } - return 0; - } -}; - -////////////////////////////////////////////////////////////////////////// -// interface ICrySizer -// USAGE -// An instance of this class is passed down to each and every component in the system. -// Every component it's passed to optionally pushes its name on top of the -// component name stack (thus ensuring that all the components calculated down -// the tree will be assigned the correct subsystem/component name) -// Every component must Add its size with one of the Add* functions, and Add the -// size of all its subcomponents recursively -// In order to push the component/system name on the name stack, the clients must -// use the SIZER_COMPONENT_NAME macro or CrySizerComponentNameHelper class: -// -// void X::getSize (ICrySizer* pSizer) -// { -// SIZER_COMPONENT_NAME(pSizer, X); -// if (!pSizer->Add (this)) -// return; -// pSizer->Add (m_arrMySimpleArray); -// pSizer->Add (m_setMySimpleSet); -// m_pSubobject->getSize (pSizer); -// } -// -// The Add* functions return bool. If they return true, then the object has been added -// to the set for the first time, and you should go on recursively adding all its children. -// If it returns false, then you can spare time and rather not go on into recursion; -// however it doesn't reflect on the results: an object that's added more than once is -// counted only once. -// -// WARNING: -// If you have an array (pointer), you should Add its size with addArray -class ICrySizer -{ -public: - virtual ~ICrySizer(){} - // this class is used to push/pop the name to/from the stack automatically - // (to exclude stack overruns or underruns at runtime) - friend class CrySizerComponentNameHelper; - - virtual void Release() = 0; - - // Return total calculated size. - virtual size_t GetTotalSize() = 0; - - // Return total objects added. - virtual size_t GetObjectCount() = 0; - - // Resets the counting. - virtual void Reset() = 0; - - virtual void End() = 0; - - // adds an object identified by the unique pointer (it needs not be - // the actual object position in the memory, though it would be nice, - // but it must be unique throughout the system and unchanging for this object) - // nCount parameter is only used for counting number of objects, it doesnt affect the size of the object. - // RETURNS: true if the object has actually been added (for the first time) - // and calculated - virtual bool AddObject (const void* pIdentifier, size_t nSizeBytes, int nCount = 1) = 0; - - template - bool AddObjectSize(const Type* pObj) - { - return AddObject(pObj, sizeof *pObj); - } - - //////////////////////////////////////////////////////////////////////////////////////// - // temp dummy function while checking in the CrySizer changes, will be removed soon - - template - void AddObject(const Type& rObj) - { - (void)rObj; - } - - template - void AddObject(Type* pObj) - { - if (pObj) - { - //forward to reference object to allow function overload - this->AddObject(*pObj); - } - } - - // overloads for smart_ptr and other common objects - template - void AddObject(const _smart_ptr& rObj) { this->AddObject(rObj.get()); } - template - void AddObject(const AZStd::shared_ptr& rObj) { this->AddObject(rObj.get()); } - template - void AddObject(const std::shared_ptr& rObj) { this->AddObject(rObj.get()); } - template - void AddObject(const std::unique_ptr& rObj) { this->AddObject(rObj.get()); } - template - void AddObject(const std::pair& rPair) - { - this->AddObject(rPair.first); - this->AddObject(rPair.second); - } - template - void AddObject(const AZStd::pair& rPair) - { - this->AddObject(rPair.first); - this->AddObject(rPair.second); - } - void AddObject(const AZStd::string& rString) {this->AddObject(rString.c_str(), rString.capacity()); } - void AddObject(const wchar_t&) {} - void AddObject(const char&) {} - void AddObject(const unsigned char&) {} - void AddObject(const signed char&) {} - void AddObject(const short&) {} - void AddObject(const unsigned short&) {} - void AddObject(const int&) {} - void AddObject(const unsigned int&) {} - void AddObject(const long&) {} - void AddObject(const unsigned long&) {} - void AddObject(const float&) {} - void AddObject(const bool&) {} - void AddObject(const unsigned long long&) {} - void AddObject(const long long&) {} - void AddObject(const double&) {} - void AddObject(const Vec2&) {} - void AddObject(const Vec3&) {} - void AddObject(const Vec4&) {} - void AddObject(const Ang3&) {} - void AddObject(const Matrix34&) {} - void AddObject(const Quat&) {} - void AddObject(const QuatT&) {} - void AddObject(const QuatTS&) {} - void AddObject(const ColorF&) {} - void AddObject(const AABB&) {} - void AddObject(const SVF_P3F&) {} - void AddObject(const SVF_P3F_C4B_T2F&) {} - void AddObject(const SVF_P3S_C4B_T2S&) {} - void AddObject(const SPipTangents&) {} - void AddObject([[maybe_unused]] const AZ::Vector3& rObj) {} - void AddObject(void*) {} - - // overloads for container, will automaticly traverse the content - template - void AddObject(const std::list& rList) - { - // dummy struct to get correct element size - struct Dummy - { - void* a; - void* b; - T t; - }; - - for (typename std::list::const_iterator it = rList.begin(); it != rList.end(); ++it) - { - if (this->AddObject(&(*it), sizeof(Dummy))) - { - this->AddObject(*it); - } - } - } - template - void AddObject([[maybe_unused]] const AZStd::unordered_map& rVector) - { - - } - - template - void AddObject(const std::vector& rVector) - { - if (rVector.empty()) - { - this->AddObject(&rVector, rVector.capacity() * sizeof(T)); - return; - } - - if (!this->AddObject(&rVector[0], rVector.capacity() * sizeof(T))) - { - return; - } - - for (typename std::vector::const_iterator it = rVector.begin(); it != rVector.end(); ++it) - { - this->AddObject(*it); - } - } - - template - void AddObject(const std::deque& rVector) - { - for (typename std::deque::const_iterator it = rVector.begin(); it != rVector.end(); ++it) - { - if (this->AddObject(&(*it), sizeof(T))) - { - this->AddObject(*it); - } - } - } - - template - void AddObject(const PodArray& rVector) - { - if (!this->AddObject(rVector.begin(), rVector.capacity() * sizeof(T))) - { - return; - } - - for (typename PodArray::const_iterator it = rVector.begin(); it != rVector.end(); ++it) - { - this->AddObject(*it); - } - } - - template - void AddObject(const std::map& rVector) - { - // dummy struct to get correct element size - struct Dummy - { - void* a; - void* b; - void* c; - void* d; - K k; - T t; - }; - - for (typename std::map::const_iterator it = rVector.begin(); it != rVector.end(); ++it) - { - if (this->AddObject(&(*it), sizeof(Dummy))) - { - this->AddObject(it->first); - this->AddObject(it->second); - } - } - } - - template - void AddObject(const std::set& rVector) - { - // dummy struct to get correct element size - struct Dummy - { - void* a; - void* b; - void* c; - void* d; - T t; - }; - - for (typename std::set::const_iterator it = rVector.begin(); it != rVector.end(); ++it) - { - if (this->AddObject(&(*it), sizeof(Dummy))) - { - this->AddObject(*it); - } - } - } - - template - void AddObject (const std::multimap& rContainer) - { - AddContainer(rContainer); - } - //////////////////////////////////////////////////////////////////////////////////////// - template - bool Add (const T* pId, size_t num) - { - return AddObject(pId, num * sizeof(T)); - } - - template - bool Add (const T& rObject) - { - return AddObject (&rObject, sizeof(T)); - } - - bool Add (const char* szText) - { - return AddObject(szText, strlen(szText) + 1); - } - - template - bool AddString (const StringCls& strText) - { - if (!strText.empty()) - { - return AddObject (strText.c_str(), strText.size()); - } - else - { - return false; - } - } -#ifdef _XSTRING_ - template - bool Add (const std::basic_string& strText) - { - AddString (strText); - return true; - } -#endif - - #ifndef NOT_USE_CRY_STRING - bool Add (const AZStd::string& strText) - { - AddString(strText); - return true; - } - #endif - - - // Template helper function to add generic stl container - template - bool AddContainer (const Container& rContainer) - { - if (rContainer.capacity()) - { - return AddObject (&rContainer, rContainer.capacity() * sizeof(typename Container::value_type)); - } - return false; - } - template - bool AddHashMap(const Container& rContainer) - { - if (!rContainer.empty()) - { - return AddObject (&(*rContainer.begin()), rContainer.size() * sizeof(typename Container::value_type)); - } - return false; - } - - // Specialization of the AddContainer for the std::list - template - bool AddContainer (const std::list& rContainer) - { - if (!rContainer.empty()) - { - return AddObject(&(*rContainer.begin()), stl::size_of_list(rContainer)); - } - return false; - } - // Specialization of the AddContainer for the std::deque - template - bool AddContainer (const std::deque& rContainer) - { - if (!rContainer.empty()) - { - return AddObject(&(*rContainer.begin()), stl::size_of_deque(rContainer)); - } - return false; - } - // Specialization of the AddContainer for the std::map - template - bool AddContainer (const std::map& rContainer) - { - if (!rContainer.empty()) - { - return AddObject(&(*rContainer.begin()), stl::size_of_map(rContainer)); - } - return false; - } - // Specialization of the AddContainer for the std::multimap - template - bool AddContainer (const std::multimap& rContainer) - { - if (!rContainer.empty()) - { - return AddObject(&(*rContainer.begin()), stl::size_of_map(rContainer)); - } - return false; - } - // Specialization of the AddContainer for the std::set - template - bool AddContainer (const std::set& rContainer) - { - if (!rContainer.empty()) - { - return AddObject(&(*rContainer.begin()), stl::size_of_set(rContainer)); - } - return false; - } - - // Specialization of the AddContainer for the AZStd::unordered_map - template - bool AddContainer(const AZStd::unordered_map& rContainer) - { - if (!rContainer.empty()) - { - return AddObject(&(*rContainer.begin()), rContainer.size() * sizeof(typename AZStd::unordered_map::value_type)); - } - else - { - return false; - } - } - - void Test() - { - std::map mymap; - AddContainer(mymap); - } - - // returns the flags - unsigned GetFlags() const {return m_nFlags; } - -protected: - // these functions must operate on the component name stack - // they are to be only accessible from within class CrySizerComponentNameHelper - // which should be used through macro SIZER_COMPONENT_NAME - virtual void Push (const char* szComponentName) = 0; - // pushes the name that is the name of the previous component . (dot) this name - virtual void PushSubcomponent (const char* szSubcomponentName) = 0; - virtual void Pop () = 0; - - unsigned m_nFlags; -}; - -////////////////////////////////////////////////////////////////////////// -// This is on-stack class that is only used to push/pop component names -// to/from the sizer name stack. -// -// USAGE: -// -// Create an instance of this class at the start of a function, before -// calling Add* methods of the sizer interface. Everything added in the -// function and below will be considered this component, unless -// explicitly set otherwise. -// -class CrySizerComponentNameHelper -{ -public: - // pushes the component name on top of the name stack of the given sizer - CrySizerComponentNameHelper (ICrySizer* pSizer, const char* szComponentName, bool bSubcomponent) - : m_pSizer(pSizer) - { - if (bSubcomponent) - { - pSizer->PushSubcomponent (szComponentName); - } - else - { - pSizer->Push (szComponentName); - } - } - - // pops the component name off top of the name stack of the sizer - ~CrySizerComponentNameHelper() - { - m_pSizer->Pop(); - } - -protected: - ICrySizer* m_pSizer; -}; - -// use this to push (and automatically pop) the sizer component name at the beginning of the -// getSize() function -#define SIZER_COMPONENT_NAME(pSizerPointer, szComponentName) CrySizerComponentNameHelper AZ_JOIN(sizerHelper, __LINE__)(pSizerPointer, szComponentName, false) -#define SIZER_SUBCOMPONENT_NAME(pSizerPointer, szComponentName) CrySizerComponentNameHelper AZ_JOIN(sizerHelper, __LINE__)(pSizerPointer, szComponentName, true) - -#endif // CRYINCLUDE_CRYCOMMON_CRYSIZER_H diff --git a/Code/Legacy/CryCommon/Cry_Camera.h b/Code/Legacy/CryCommon/Cry_Camera.h index 852467d787..668d15cbc1 100644 --- a/Code/Legacy/CryCommon/Cry_Camera.h +++ b/Code/Legacy/CryCommon/Cry_Camera.h @@ -8,9 +8,6 @@ // Description : Common Camera class implementation - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_CAMERA_H -#define CRYINCLUDE_CRYCOMMON_CRY_CAMERA_H #pragma once @@ -48,450 +45,6 @@ enum cull CULL_INCLUSION // The whole object is inside frustum. }; -class CameraViewParameters -{ -public: - CameraViewParameters(); - - void LookAt(const Vec3& Eye, const Vec3& ViewRefPt, const Vec3& ViewUp); - void Perspective(float Yfov, float Aspect, float Ndist, float Fdist); - void Frustum(float l, float r, float b, float t, float Ndist, float Fdist); - const Vec3& wCOP() const; - Vec3 ViewDir() const; - Vec3 ViewDirOffAxis() const; - - float* GetXform_Screen2Obj(float* M, int WW, int WH) const; - float* GetXform_Obj2Screen(float* M, int WW, int WH) const; - - float* GetModelviewMatrix(float* M) const; - float* GetProjectionMatrix(float* M) const; - float* GetViewportMatrix(float* M, int WW, int WH) const; - - void SetModelviewMatrix(const float* M); - - void GetLookAtParams(Vec3* Eye, Vec3* ViewRefPt, Vec3* ViewUp) const; - void GetPerspectiveParams(float* Yfov, float* Xfov, float* Aspect, float* Ndist, float* Fdist) const; - void GetFrustumParams(float* l, float* r, float* b, float* t, float* Ndist, float* Fdist) const; - - float* GetInvModelviewMatrix(float* M) const; - float* GetInvProjectionMatrix(float* M) const; - float* GetInvViewportMatrix(float* M, int WW, int WH) const; - - Vec3 WorldToCam(const Vec3& wP) const; - float WorldToCamZ(const Vec3& wP) const; - Vec3 CamToWorld(const Vec3& cP) const; - - void LoadIdentityXform(); - void Xform(const float M[16]); - - void Translate(const Vec3& trans); - void Rotate(const float M[9]); - - void GetPixelRay(float sx, float sy, int ww, int wh, Vec3* Start, Vec3* Dir) const; - - void CalcVerts(Vec3* V) const; - void CalcTileVerts(Vec3* V, f32 nPosX, f32 nPosY, f32 nGridSizeX, f32 nGridSizeY) const; - void CalcRegionVerts(Vec3* V, const Vec2& vMin, const Vec2& vMax) const; - void CalcTiledRegionVerts(Vec3* V, Vec2& vMin, Vec2& vMax, f32 nPosX, f32 nPosY, f32 nGridSizeX, f32 nGridSizeY) const; - - Vec3 vX, vY, vZ; - Vec3 vOrigin; - float fWL, fWR, fWB, fWT; - float fNear, fFar; -}; - -inline float* Frustum16fv(float* M, float l, float r, float b, float t, float n, float f) -{ - M[0] = (2 * n) / (r - l); - M[4] = 0; - M[8] = (r + l) / (r - l); - M[12] = 0; - M[1] = 0; - M[5] = (2 * n) / (t - b); - M[9] = (t + b) / (t - b); - M[13] = 0; - M[2] = 0; - M[6] = 0; - M[10] = -(f + n) / (f - n); - M[14] = (-2 * f * n) / (f - n); - M[3] = 0; - M[7] = 0; - M[11] = -1; - M[15] = 0; - - return M; -} - -inline float* Viewing16fv(float* M, const Vec3 X, const Vec3 Y, const Vec3 Z, const Vec3 O) -{ - M[0] = X.x; - M[4] = X.y; - M[8] = X.z; - M[12] = -X | O; - M[1] = Y.x; - M[5] = Y.y; - M[9] = Y.z; - M[13] = -Y | O; - M[2] = Z.x; - M[6] = Z.y; - M[10] = Z.z; - M[14] = -Z | O; - M[3] = 0; - M[7] = 0; - M[11] = 0; - M[15] = 1; - return M; -} - - -inline CameraViewParameters::CameraViewParameters() -{ - vX.Set(1, 0, 0); - vY.Set(0, 1, 0); - vZ.Set(0, 0, 1); - vOrigin.Set(0, 0, 0); - fNear = 1.4142f; - fFar = 10; - fWL = -1; - fWR = 1; - fWT = 1; - fWB = -1; -} - -inline void CameraViewParameters::LookAt(const Vec3& Eye, const Vec3& ViewRefPt, const Vec3& ViewUp) -{ - vZ = Eye - ViewRefPt; - vZ.NormalizeSafe(); - vX = ViewUp % vZ; - vX.NormalizeSafe(); - vY = vZ % vX; - vY.NormalizeSafe(); - vOrigin = Eye; -} - -inline void CameraViewParameters::Perspective(float Yfov, float Aspect, float Ndist, float Fdist) -{ - fNear = Ndist; - fFar = Fdist; - fWT = tanf(Yfov * 0.5f) * fNear; - fWB = -fWT; - fWR = fWT * Aspect; - fWL = -fWR; -} - -inline void CameraViewParameters::Frustum(float l, float r, float b, float t, float Ndist, float Fdist) -{ - fNear = Ndist; - fFar = Fdist; - fWR = r; - fWL = l; - fWB = b; - fWT = t; -} - - -inline void CameraViewParameters::GetLookAtParams(Vec3* Eye, Vec3* ViewRefPt, Vec3* ViewUp) const -{ - *Eye = vOrigin; - *ViewRefPt = vOrigin - vZ; - *ViewUp = vY; -} - -inline void CameraViewParameters::GetPerspectiveParams(float* Yfov, float* Xfov, float* Aspect, float* Ndist, float* Fdist) const -{ - *Yfov = atanf(fWT / fNear) * 57.29578f * 2.0f; - *Xfov = atanf(fWR / fNear) * 57.29578f * 2.0f; - *Aspect = fWT / fWR; - *Ndist = fNear; - *Fdist = fFar; -} - -inline void CameraViewParameters::GetFrustumParams(float* l, float* r, float* b, float* t, float* Ndist, float* Fdist) const -{ - *l = fWL; - *r = fWR; - *b = fWB; - *t = fWT; - *Ndist = fNear; - *Fdist = fFar; -} - -inline const Vec3& CameraViewParameters::wCOP() const -{ - return(vOrigin); -} - -inline Vec3 CameraViewParameters::ViewDir() const -{ - return(-vZ); -} - -inline Vec3 CameraViewParameters::ViewDirOffAxis() const -{ - float fX = (fWL + fWR) * 0.5f, fY = (fWT + fWB) * 0.5f; // MIDPOINT ON VIEWPLANE WINDOW - Vec3 ViewDir = vX * fX + vY * fY - vZ * fNear; - ViewDir.Normalize(); - return ViewDir; -} - -inline Vec3 CameraViewParameters::WorldToCam(const Vec3& wP) const -{ - Vec3 sP(wP - vOrigin); - Vec3 cP(vX | sP, vY | sP, vZ | sP); - return cP; -} - -inline float CameraViewParameters::WorldToCamZ(const Vec3& wP) const -{ - Vec3 sP(wP - vOrigin); - float zdist = vZ | sP; - return zdist; -} - -inline Vec3 CameraViewParameters::CamToWorld(const Vec3& cP) const -{ - Vec3 wP(vX * cP.x + vY * cP.y + vZ * cP.z + vOrigin); - return wP; -} - -inline void CameraViewParameters::LoadIdentityXform() -{ - vX.Set(1, 0, 0); - vY.Set(0, 1, 0); - vZ.Set(0, 0, 1); - vOrigin.Set(0, 0, 0); -} - -inline void CameraViewParameters::Xform(const float M[16]) -{ - vX.Set(vX.x * M[0] + vX.y * M[4] + vX.z * M[8], - vX.x * M[1] + vX.y * M[5] + vX.z * M[9], - vX.x * M[2] + vX.y * M[6] + vX.z * M[10]); - vY.Set(vY.x * M[0] + vY.y * M[4] + vY.z * M[8], - vY.x * M[1] + vY.y * M[5] + vY.z * M[9], - vY.x * M[2] + vY.y * M[6] + vY.z * M[10]); - vZ.Set(vZ.x * M[0] + vZ.y * M[4] + vZ.z * M[8], - vZ.x * M[1] + vZ.y * M[5] + vZ.z * M[9], - vZ.x * M[2] + vZ.y * M[6] + vZ.z * M[10]); - vOrigin.Set(vOrigin.x * M[0] + vOrigin.y * M[4] + vOrigin.z * M[8] + M[12], - vOrigin.x * M[1] + vOrigin.y * M[5] + vOrigin.z * M[9] + M[13], - vOrigin.x * M[2] + vOrigin.y * M[6] + vOrigin.z * M[10] + M[14]); - - float Scale = vX.GetLength(); - vX /= Scale; - vY /= Scale; - vZ /= Scale; - - fWL *= Scale; - fWR *= Scale; - fWB *= Scale; - fWT *= Scale; - fNear *= Scale; - fFar *= Scale; -}; - -inline void CameraViewParameters::Translate(const Vec3& trans) -{ - vOrigin += trans; -} - -inline void CameraViewParameters::Rotate(const float M[9]) -{ - vX.Set(vX.x * M[0] + vX.y * M[3] + vX.z * M[6], - vX.x * M[1] + vX.y * M[4] + vX.z * M[7], - vX.x * M[2] + vX.y * M[5] + vX.z * M[8]); - vY.Set(vY.x * M[0] + vY.y * M[3] + vY.z * M[6], - vY.x * M[1] + vY.y * M[4] + vY.z * M[7], - vY.x * M[2] + vY.y * M[5] + vY.z * M[8]); - vZ.Set(vZ.x * M[0] + vZ.y * M[3] + vZ.z * M[6], - vZ.x * M[1] + vZ.y * M[4] + vZ.z * M[7], - vZ.x * M[2] + vZ.y * M[5] + vZ.z * M[8]); -} - -inline float* CameraViewParameters::GetModelviewMatrix(float* M) const -{ - Viewing16fv(M, vX, vY, vZ, vOrigin); - return M; -} - -inline float* CameraViewParameters::GetProjectionMatrix(float* M) const -{ - Frustum16fv(M, fWL, fWR, fWB, fWT, fNear, fFar); - return(M); -} - -inline void CameraViewParameters::GetPixelRay(float sx, float sy, int ww, int wh, Vec3* Start, Vec3* Dir) const -{ - Vec3 wTL = vOrigin + (vX * fWL) + (vY * fWT) - (vZ * fNear); // FIND LOWER-LEFT - Vec3 dX = (vX * (fWR - fWL)) / (float)ww; // WORLD WIDTH OF PIXEL - Vec3 dY = (vY * (fWT - fWB)) / (float)wh; // WORLD HEIGHT OF PIXEL - wTL += (dX * sx - dY * sy); // INCR TO WORLD PIXEL - wTL += (dX * 0.5f - dY * 0.5f); // INCR TO PIXEL CNTR - *Start = vOrigin; - *Dir = wTL - vOrigin; -} - -inline void CameraViewParameters::CalcVerts(Vec3* V) const -{ - float NearZ = -fNear; - V[0].Set(fWR, fWT, NearZ); - V[1].Set(fWL, fWT, NearZ); - V[2].Set(fWL, fWB, NearZ); - V[3].Set(fWR, fWB, NearZ); - - float FarZ = -fFar, FN = fFar / fNear; - float fwL = fWL * FN, fwR = fWR * FN, fwB = fWB * FN, fwT = fWT * FN; - V[4].Set(fwR, fwT, FarZ); - V[5].Set(fwL, fwT, FarZ); - V[6].Set(fwL, fwB, FarZ); - V[7].Set(fwR, fwB, FarZ); - - for (int i = 0; i < 8; i++) - { - V[i] = CamToWorld(V[i]); - } -} - -inline void CameraViewParameters::CalcTileVerts(Vec3* V, f32 nPosX, f32 nPosY, f32 nGridSizeX, f32 nGridSizeY) const -{ - float NearZ = -fNear; - - float TileWidth = abs(fWR - fWL) / nGridSizeX; - float TileHeight = abs(fWT - fWB) / nGridSizeY; - float TileL = fWL + TileWidth * nPosX; - float TileR = fWL + TileWidth * (nPosX + 1); - float TileB = fWB + TileHeight * nPosY; - float TileT = fWB + TileHeight * (nPosY + 1); - - V[0].Set(TileR, TileT, NearZ); - V[1].Set(TileL, TileT, NearZ); - V[2].Set(TileL, TileB, NearZ); - V[3].Set(TileR, TileB, NearZ); - - float FarZ = -fFar, FN = fFar / fNear; - float fwL = fWL * FN, fwR = fWR * FN, fwB = fWB * FN, fwT = fWT * FN; - - float TileFarWidth = abs(fwR - fwL) / nGridSizeX; - float TileFarHeight = abs(fwT - fwB) / nGridSizeY; - float TileFarL = fwL + TileFarWidth * nPosX; - float TileFarR = fwL + TileFarWidth * (nPosX + 1); - float TileFarB = fwB + TileFarHeight * nPosY; - float TileFarT = fwB + TileFarHeight * (nPosY + 1); - - V[4].Set(TileFarR, TileFarT, FarZ); - V[5].Set(TileFarL, TileFarT, FarZ); - V[6].Set(TileFarL, TileFarB, FarZ); - V[7].Set(TileFarR, TileFarB, FarZ); - - for (int i = 0; i < 8; i++) - { - V[i] = CamToWorld(V[i]); - } -} - -inline void CameraViewParameters::CalcTiledRegionVerts(Vec3* V, Vec2& vMin, Vec2& vMax, f32 nPosX, f32 nPosY, f32 nGridSizeX, f32 nGridSizeY) const -{ - float NearZ = -fNear; - - Vec2 vTileMin, vTileMax; - - vMin.x = max(vMin.x, nPosX / nGridSizeX); - vMax.x = min(vMax.x, (nPosX + 1) / nGridSizeX); - - vMin.y = max(vMin.y, nPosY / nGridSizeY); - vMax.y = min(vMax.y, (nPosY + 1) / nGridSizeY); - - vTileMin.x = abs(fWR - fWL) * vMin.x; - vTileMin.y = abs(fWT - fWB) * vMin.y; - vTileMax.x = abs(fWR - fWL) * vMax.x; - vTileMax.y = abs(fWT - fWB) * vMax.y; - - - float TileL = fWL + vTileMin.x; - float TileR = fWL + vTileMax.x; - float TileB = fWB + vTileMin.y; - float TileT = fWB + vTileMax.y; - - V[0].Set(TileR, TileT, NearZ); - V[1].Set(TileL, TileT, NearZ); - V[2].Set(TileL, TileB, NearZ); - V[3].Set(TileR, TileB, NearZ); - - float FarZ = -fFar, FN = fFar / fNear; - float fwL = fWL * FN, fwR = fWR * FN, fwB = fWB * FN, fwT = fWT * FN; - - Vec2 vTileFarMin, vTileFarMax; - - vTileFarMin.x = abs(fwR - fwL) * vMin.x; - vTileFarMin.y = abs(fwT - fwB) * vMin.y; - vTileFarMax.x = abs(fwR - fwL) * vMax.x; - vTileFarMax.y = abs(fwT - fwB) * vMax.y; - - - float TileFarL = fwL + vTileFarMin.x; - float TileFarR = fwL + vTileFarMax.x; - float TileFarB = fwB + vTileFarMin.y; - float TileFarT = fwB + vTileFarMax.y; - - V[4].Set(TileFarR, TileFarT, FarZ); - V[5].Set(TileFarL, TileFarT, FarZ); - V[6].Set(TileFarL, TileFarB, FarZ); - V[7].Set(TileFarR, TileFarB, FarZ); - - for (int i = 0; i < 8; i++) - { - V[i] = CamToWorld(V[i]); - } -} - - -inline void CameraViewParameters::CalcRegionVerts(Vec3* V, const Vec2& vMin, const Vec2& vMax) const -{ - float NearZ = -fNear; - - Vec2 vTileMin, vTileMax; - - vTileMin.x = abs(fWR - fWL) * vMin.x; - vTileMin.y = abs(fWT - fWB) * vMin.y; - vTileMax.x = abs(fWR - fWL) * vMax.x; - vTileMax.y = abs(fWT - fWB) * vMax.y; - - float TileL = fWL + vTileMin.x; - float TileR = fWL + vTileMax.x; - float TileB = fWB + vTileMin.y; - float TileT = fWB + vTileMax.y; - - V[0].Set(TileR, TileT, NearZ); - V[1].Set(TileL, TileT, NearZ); - V[2].Set(TileL, TileB, NearZ); - V[3].Set(TileR, TileB, NearZ); - - float FarZ = -fFar, FN = fFar / fNear; - float fwL = fWL * FN, fwR = fWR * FN, fwB = fWB * FN, fwT = fWT * FN; - - Vec2 vTileFarMin, vTileFarMax; - - vTileFarMin.x = abs(fwR - fwL) * vMin.x; - vTileFarMin.y = abs(fwT - fwB) * vMin.y; - vTileFarMax.x = abs(fwR - fwL) * vMax.x; - vTileFarMax.y = abs(fwT - fwB) * vMax.y; - - float TileFarL = fwL + vTileFarMin.x; - float TileFarR = fwL + vTileFarMax.x; - float TileFarB = fwB + vTileFarMin.y; - float TileFarT = fwB + vTileFarMax.y; - - V[4].Set(TileFarR, TileFarT, FarZ); - V[5].Set(TileFarL, TileFarT, FarZ); - V[6].Set(TileFarL, TileFarB, FarZ); - V[7].Set(TileFarR, TileFarB, FarZ); - - for (int i = 0; i < 8; i++) - { - V[i] = CamToWorld(V[i]); - } -} - /////////////////////////////////////////////////////////////////////////////// // Implements essential operations like calculation of a view-matrix and // frustum-culling with simple geometric primitives (Point, Sphere, AABB, OBB). @@ -538,98 +91,31 @@ public: ILINE static Matrix33 CreateOrientationYPR(const Ang3& ypr); ILINE static Ang3 CreateAnglesYPR(const Matrix33& m); ILINE static Ang3 CreateAnglesYPR(const Vec3& vdir, f32 r = 0); - ILINE static Vec3 CreateViewdir(const Ang3& ypr); - ILINE static Vec3 CreateViewdir(const Matrix33& m) { return m.GetColumn1(); }; ILINE void SetMatrix(const Matrix34& mat) { assert(mat.IsOrthonormal()); m_Matrix = mat; UpdateFrustum(); }; - ILINE void SetMatrixNoUpdate(const Matrix34& mat) { assert(mat.IsOrthonormal()); m_Matrix = mat; }; ILINE const Matrix34& GetMatrix() const { return m_Matrix; }; ILINE Vec3 GetViewdir() const { return m_Matrix.GetColumn1(); }; - ILINE void SetEntityRotation(const Quat& entityRot) { m_entityRot = entityRot; } - ILINE Quat GetEntityRotation() { return m_entityRot; } - ILINE void SetEntityPos(const Vec3& entityPos) { m_entityPos = entityPos; } - ILINE Vec3 GetEntityPos() const { return m_entityPos; }; - - ILINE Matrix34 GetViewMatrix() const { return m_Matrix.GetInverted(); }; ILINE Vec3 GetPosition() const { return m_Matrix.GetTranslation(); } ILINE void SetPosition(const Vec3& p) { m_Matrix.SetTranslation(p); UpdateFrustum(); } - ILINE void SetPositionNoUpdate(const Vec3& p) { m_Matrix.SetTranslation(p); } - ILINE Vec3 GetUp() const { return m_Matrix.GetColumn2(); } //------------------------------------------------------------ void SetFrustum(int nWidth, int nHeight, f32 FOV = DEFAULT_FOV, f32 nearplane = DEFAULT_NEAR, f32 farplane = DEFAULT_FAR, f32 fPixelAspectRatio = 1.0f); - ILINE void SetAsymmetry(float l, float r, float b, float t) { m_asymLeft = l; m_asymRight = r; m_asymBottom = b; m_asymTop = t; UpdateFrustum(); } - ILINE int GetViewSurfaceX() const { return m_Width; } ILINE int GetViewSurfaceZ() const { return m_Height; } ILINE f32 GetFov() const { return m_fov; } - ILINE float GetHorizontalFov() const; - ILINE f32 GetNearPlane() const { return m_edge_nlt.y; } - ILINE f32 GetFarPlane() const { return m_edge_flt.y; } - ILINE f32 GetProjRatio() const { return(m_ProjectionRatio); } - ILINE f32 GetAngularResolution() const { return m_Height / m_fov; } ILINE f32 GetPixelAspectRatio() const { return m_PixelAspectRatio; } - ILINE Vec3 GetEdgeP() const { return m_edge_plt; } - ILINE Vec3 GetEdgeN() const { return m_edge_nlt; } - ILINE Vec3 GetEdgeF() const { return m_edge_flt; } - - ILINE f32 GetAsymL() const { return m_asymLeft; } - ILINE f32 GetAsymR() const { return m_asymRight; } - ILINE f32 GetAsymB() const { return m_asymBottom; } - ILINE f32 GetAsymT() const { return m_asymTop; } - - ILINE const Vec3& GetNPVertex(int nId) const; //get near-plane vertices - ILINE const Vec3& GetFPVertex(int nId) const; //get far-plane vertices - ILINE const Vec3& GetPPVertex(int nId) const; //get projection-plane vertices - - ILINE const Plane_tpl* GetFrustumPlane(int numplane) const { return &m_fp[numplane]; } - - ////////////////////////////////////////////////////////////////////////// - // Z-Buffer ranges. - // This values are defining near/far clipping plane, it only used to specify z-buffer range. - // Use it only when you want to override default z-buffer range. - // Valid values for are: 0 <= zrange <= 1 - ////////////////////////////////////////////////////////////////////////// - ILINE void SetZRange(float zmin, float zmax) - { - // Clamp to 0-1 range. - m_zrangeMin = min(1.0f, max(0.0f, zmin)); - m_zrangeMax = min(1.0f, max(0.0f, zmax)); - }; - ILINE float GetZRangeMin() const { return m_zrangeMin; } - ILINE float GetZRangeMax() const { return m_zrangeMax; } ////////////////////////////////////////////////////////////////////////// //----------------------------------------------------------------------------------- //-------- Frustum-Culling ---------------------------- //----------------------------------------------------------------------------------- - //Check if a point lies within camera's frustum - bool IsPointVisible(const Vec3& p) const; - - //sphere-frustum test - bool IsSphereVisible_F(const ::Sphere& s) const; - uint8 IsSphereVisible_FH(const ::Sphere& s) const; //this is going to be the exact version of sphere-culling - // AABB-frustum test // Fast bool IsAABBVisible_F(const ::AABB& aabb) const; - uint8 IsAABBVisible_FH(const ::AABB& aabb, bool* pAllInside) const; - uint8 IsAABBVisible_FH(const ::AABB& aabb) const; - - // Exact - bool IsAABBVisible_E(const ::AABB& aabb) const; - uint8 IsAABBVisible_EH(const ::AABB& aabb, bool* pAllInside) const; - uint8 IsAABBVisible_EH(const ::AABB& aabb) const; - - //OBB-frustum test - bool IsOBBVisible_F(const Vec3& wpos, const OBB& obb) const; - uint8 IsOBBVisible_FH(const Vec3& wpos, const OBB& obb) const; - bool IsOBBVisible_E(const Vec3& wpos, const OBB& obb, f32 uscale) const; - uint8 IsOBBVisible_EH(const Vec3& wpos, const OBB& obb, f32 uscale) const; //## constructor/destructor CCamera() @@ -640,56 +126,23 @@ public: m_asymBottom = 0; m_asymTop = 0; SetFrustum(640, 480); - m_zrangeMin = 0.0f; - m_zrangeMax = 1.0f; - m_pPortal = NULL; - m_JustActivated = 0; m_nPosX = m_nPosY = m_nSizeX = m_nSizeY = 0; m_entityPos = Vec3(0, 0, 0); - m_entityRot = Quat(0, 0, 0, 1); } ~CCamera() {} - void GetFrustumVertices(Vec3* pVerts) const; - void GetFrustumVerticesCam(Vec3* pVerts) const; - - void SetJustActivated(const bool justActivated) {m_JustActivated = (int)justActivated; } - bool IsJustActivated() const {return m_JustActivated != 0; } - - void SetViewPort(int nPosX, int nPosY, int nSizeX, int nSizeY) - { - m_nPosX = nPosX; - m_nPosY = nPosY; - m_nSizeX = nSizeX; - m_nSizeY = nSizeY; - } - - void GetViewPort(int& nPosX, int& nPosY, int& nSizeX, int& nSizeY) const - { - nPosX = m_nPosX; - nPosY = m_nPosY; - nSizeX = m_nSizeX; - nSizeY = m_nSizeY; - } + void SetJustActivated([[maybe_unused]] const bool justActivated) {} void UpdateFrustum(); - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const { /*nothing*/} - - CameraViewParameters m_viewParameters; private: - bool AdditionalCheck(const AABB& aabb) const; - bool AdditionalCheck(const Vec3& wpos, const OBB& obb, f32 uscale) const; - Matrix34 m_Matrix; // world space-matrix f32 m_fov; // vertical fov in radiants [0..1*PI[ int m_Width; // surface width-resolution int m_Height; // surface height-resolution - f32 m_ProjectionRatio; // ratio between width and height of view-surface f32 m_PixelAspectRatio; // accounts for aspect ratio and non-square pixels - Quat m_entityRot; //The rotation of this camera's entity (does not include HMD orientation) Vec3 m_entityPos; //The position of this camera's entity (does not include HMD position or stereo offsets) Vec3 m_edge_nlt; // this is the left/upper vertex of the near-plane @@ -709,81 +162,9 @@ private: uint32 m_idx1[FRUSTUM_PLANES], m_idy1[FRUSTUM_PLANES], m_idz1[FRUSTUM_PLANES]; // uint32 m_idx2[FRUSTUM_PLANES], m_idy2[FRUSTUM_PLANES], m_idz2[FRUSTUM_PLANES]; // - // Near Far range of the z-buffer to use for this camera. - float m_zrangeMin; - float m_zrangeMax; - int m_nPosX, m_nPosY, m_nSizeX, m_nSizeY; - - //------------------------------------------------------------------------ - //--- OLD STUFF - //------------------------------------------------------------------------ -public: - - void SetFrustumVertices(Vec3* arrvVerts) - { - m_clbp = arrvVerts[0]; - m_cltp = arrvVerts[1]; - m_crtp = arrvVerts[2]; - m_crbp = arrvVerts[3]; - } - inline void SetFrustumPlane(int i, const Plane_tpl& plane) - { - m_fp[i] = plane; - //do not break strict aliasing rules, use union instead of reinterpret_casts - union f32_u - { - float floatVal; - uint32 uintVal; - }; - - { - f32_u ux; - ux.floatVal = m_fp[i].n.x; - f32_u uy; - uy.floatVal = m_fp[i].n.y; - f32_u uz; - uz.floatVal = m_fp[i].n.z; - uint32 bitX = ux.uintVal >> 31; - uint32 bitY = uy.uintVal >> 31; - uint32 bitZ = uz.uintVal >> 31; - m_idx1[i] = bitX * 3 + 0; - m_idx2[i] = (1 - bitX) * 3 + 0; - m_idy1[i] = bitY * 3 + 1; - m_idy2[i] = (1 - bitY) * 3 + 1; - m_idz1[i] = bitZ * 3 + 2; - m_idz2[i] = (1 - bitZ) * 3 + 2; - } - } - - inline Ang3 GetAngles() const { return CreateAnglesYPR(Matrix33(m_Matrix)); } - void SetAngles(const Ang3& angles) { SetMatrix(Matrix34::CreateRotationXYZ(angles)); } - - - struct IVisArea* m_pPortal; // pointer to portal used to create this camera - struct ScissorInfo - { - ScissorInfo() { x1 = y1 = x2 = y2 = 0; } - uint16 x1, y1, x2, y2; - }; - ScissorInfo m_ScissorInfo; - - Vec3 m_OccPosition; //Position for calculate occlusions (needed for portals rendering) - inline const Vec3& GetOccPos() const { return(m_OccPosition); } - - int m_JustActivated; //Camera activated in this frame, used for disabling motion blur effect at camera changes in movies }; -inline float CCamera::GetHorizontalFov() const -{ - float fFractionVert = tanf(m_fov * 0.5f); - float fFractionHoriz = fFractionVert * GetProjRatio(); - float fHorizFov = atanf(fFractionHoriz) * 2; - - return fHorizFov; -} - - // Description // This function builds a 3x3 orientation matrix using YPR-angles // Rotation order for the orientation-matrix is Z-X-Y. (Zaxis=YAW / Xaxis=PITCH / Yaxis=ROLL) @@ -866,23 +247,6 @@ ILINE Ang3 CCamera::CreateAnglesYPR(const Vec3& vdir, f32 r) } } -// Description -//
-//x=yaw
-//y=pitch
-//z=roll (we ignore this element, since its not possible to convert the roll-component into a vector)
-// 
-ILINE Vec3 CCamera::CreateViewdir(const Ang3& ypr) -{ - assert(ypr.IsInRangePI()); //all angles need to be in range between -pi and +pi - f32 sz, cz; - sincos_tpl(ypr.x, &sz, &cz); //YAW - f32 sx, cx; - sincos_tpl(ypr.y, &sx, &cx); //PITCH - return Vec3(-sz * cx, cz * cx, sx); //calculate the view-direction -} - - //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -901,7 +265,6 @@ inline void CCamera::SetFrustum(int nWidth, int nHeight, f32 FOV, f32 nearplane, f32 fWidth = (((f32)nWidth) / fPixelAspectRatio); f32 fHeight = (f32) nHeight; - m_ProjectionRatio = fWidth / fHeight; // projection ratio (1.0 for square pixels) m_PixelAspectRatio = fPixelAspectRatio; @@ -1022,272 +385,8 @@ inline void CCamera::UpdateFrustum() m_idz1[i] = bitZ * 3 + 2; m_idz2[i] = (1 - bitZ) * 3 + 2; } - m_OccPosition = GetPosition(); } -// Summary -// Return frustum vertices in world space -// Description -// Takes pointer to array of 8 elements -inline void CCamera::GetFrustumVertices(Vec3* pVerts) const -{ - Matrix33 m33 = Matrix33(m_Matrix); - - /* - The frustum array contains points in the following order - - frustum[0] = far left top - frustum[1] = far left bottom - frustum[2] = far right bottom - frustum[3] = far right top - - frustum[4] = near left top - frustum[5] = near left bottom - frustum[6] = near right bottom - frustum[7] = near right top - */ - - int i = 0; - - pVerts[i++] = m33 * Vec3(+m_edge_flt.x, +m_edge_flt.y, +m_edge_flt.z) + GetPosition(); - pVerts[i++] = m33 * Vec3(+m_edge_flt.x, +m_edge_flt.y, -m_edge_flt.z) + GetPosition(); - pVerts[i++] = m33 * Vec3(-m_edge_flt.x, +m_edge_flt.y, -m_edge_flt.z) + GetPosition(); - pVerts[i++] = m33 * Vec3(-m_edge_flt.x, +m_edge_flt.y, +m_edge_flt.z) + GetPosition(); - - pVerts[i++] = m33 * Vec3(+m_edge_nlt.x, +m_edge_nlt.y, +m_edge_nlt.z) + GetPosition(); - pVerts[i++] = m33 * Vec3(+m_edge_nlt.x, +m_edge_nlt.y, -m_edge_nlt.z) + GetPosition(); - pVerts[i++] = m33 * Vec3(-m_edge_nlt.x, +m_edge_nlt.y, -m_edge_nlt.z) + GetPosition(); - pVerts[i++] = m33 * Vec3(-m_edge_nlt.x, +m_edge_nlt.y, +m_edge_nlt.z) + GetPosition(); -} - -inline void CCamera::GetFrustumVerticesCam(Vec3* pVerts) const -{ - int i = 0; - - //near plane - pVerts[i++] = Vec3(+m_edge_nlt.x, +m_edge_nlt.y, +m_edge_nlt.z); - pVerts[i++] = Vec3(+m_edge_nlt.x, +m_edge_nlt.y, -m_edge_nlt.z); - pVerts[i++] = Vec3(-m_edge_nlt.x, +m_edge_nlt.y, -m_edge_nlt.z); - pVerts[i++] = Vec3(-m_edge_nlt.x, +m_edge_nlt.y, +m_edge_nlt.z); - - //far plane - pVerts[i++] = Vec3(+m_edge_flt.x, +m_edge_flt.y, +m_edge_flt.z); - pVerts[i++] = Vec3(+m_edge_flt.x, +m_edge_flt.y, -m_edge_flt.z); - pVerts[i++] = Vec3(-m_edge_flt.x, +m_edge_flt.y, -m_edge_flt.z); - pVerts[i++] = Vec3(-m_edge_flt.x, +m_edge_flt.y, +m_edge_flt.z); -} - -//get near-plane vertices -ILINE const Vec3& CCamera::GetNPVertex(int nId) const -{ - switch (nId) - { - case 0: - return m_clbn; - case 1: - return m_cltn; - case 2: - return m_crtn; - case 3: - return m_crbn; - } - assert(0); - return m_clbn; -} -//get far-plane vertices -ILINE const Vec3& CCamera::GetFPVertex(int nId) const -{ - switch (nId) - { - case 0: - return m_clbf; - case 1: - return m_cltf; - case 2: - return m_crtf; - case 3: - return m_crbf; - } - assert(0); - return m_clbf; -} -ILINE const Vec3& CCamera::GetPPVertex(int nId) const -{ - switch (nId) - { - case 0: - return m_clbp; - case 1: - return m_cltp; - case 2: - return m_crtp; - case 3: - return m_crbp; - } - assert(0); - return m_clbp; -} - - - - -// Description -// Check if a point lies within camera's frustum -// -// Example -// u8 InOut=camera.IsPointVisible(point); -// -// return values -// CULL_EXCLUSION = point outside of frustum -// CULL_INTERSECT = point inside of frustum -inline bool CCamera::IsPointVisible(const Vec3& p) const -{ - if ((m_fp[FR_PLANE_NEAR ] | p) > 0) - { - return CULL_EXCLUSION; - } - if ((m_fp[FR_PLANE_RIGHT ] | p) > 0) - { - return CULL_EXCLUSION; - } - if ((m_fp[FR_PLANE_LEFT ] | p) > 0) - { - return CULL_EXCLUSION; - } - if ((m_fp[FR_PLANE_TOP ] | p) > 0) - { - return CULL_EXCLUSION; - } - if ((m_fp[FR_PLANE_BOTTOM] | p) > 0) - { - return CULL_EXCLUSION; - } - if ((m_fp[FR_PLANE_FAR ] | p) > 0) - { - return CULL_EXCLUSION; - } - return CULL_OVERLAP; -} - - - - - - - - -// Description -// Conventional method to check if a sphere and the camera-frustum overlap -// The center of the sphere is assumed to be in world-space. -// -// Example -// u8 InOut=camera.IsSphereVisible_F(sphere); -// -// return values -// CULL_EXCLUSION = sphere outside of frustum (very fast rejection-test) -// CULL_INTERSECT = sphere and frustum intersects or sphere in completely inside frustum -inline bool CCamera::IsSphereVisible_F(const ::Sphere& s) const -{ - if ((m_fp[0] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((m_fp[1] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((m_fp[2] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((m_fp[3] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((m_fp[4] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((m_fp[5] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - return CULL_OVERLAP; -} - -// Description -// Conventional method to check if a sphere and the camera-frustum overlap, or -// if the sphere is completely inside the camera-frustum. The center of the -// sphere is assumed to be in world-space. -// -// Example -// u8 InOut=camera.IsSphereVisible_FH(sphere); -// -// return values -// CULL_EXCLUSION = sphere outside of frustum (very fast rejection-test) -// CULL_INTERSECT = sphere intersects the borders of the frustum, further checks necessary -// CULL_INCLUSION = sphere is complete inside the frustum, no further checks necessary -inline uint8 CCamera::IsSphereVisible_FH(const ::Sphere& s) const -{ - f32 nc, rc, lc, tc, bc, cc; - if ((nc = m_fp[0] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((rc = m_fp[1] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((lc = m_fp[2] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((tc = m_fp[3] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((bc = m_fp[4] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - if ((cc = m_fp[5] | s.center) > s.radius) - { - return CULL_EXCLUSION; - } - - //now we have to check if it is completely in frustum - f32 r = -s.radius; - if (nc > r) - { - return CULL_OVERLAP; - } - if (lc > r) - { - return CULL_OVERLAP; - } - if (rc > r) - { - return CULL_OVERLAP; - } - if (tc > r) - { - return CULL_OVERLAP; - } - if (bc > r) - { - return CULL_OVERLAP; - } - if (cc > r) - { - return CULL_OVERLAP; - } - return CULL_INCLUSION; -} - - - - - // Description // Simple approach to check if an AABB and the camera-frustum overlap. The AABB // is assumed to be in world-space. This is a very fast method, just one single @@ -1349,789 +448,3 @@ inline bool CCamera::IsAABBVisible_F(const AABB& aabb) const } return CULL_OVERLAP; } - - -// Description -// Hierarchical approach to check if an AABB and the camera-frustum overlap, or if the AABB -// is totally inside the camera-frustum. The AABB is assumed to be in world-space. -// -// Example -// int InOut=camera.IsAABBVisible_FH(aabb); -// -// return values -// CULL_EXCLUSION = AABB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = AABB intersects the borders of the frustum, further checks necessary -// CULL_INCLUSION = AABB is complete inside the frustum, no further checks necessary - -inline uint8 CCamera::IsAABBVisible_FH(const AABB& aabb, bool* pAllInside) const -{ - assert(pAllInside && *pAllInside == false); - if (IsAABBVisible_F(aabb) == CULL_EXCLUSION) - { - return CULL_EXCLUSION; - } - const f32* p = &aabb.min.x; - uint32 x, y, z; - x = m_idx2[0]; - y = m_idy2[0]; - z = m_idz2[0]; - if ((m_fp[0] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[1]; - y = m_idy2[1]; - z = m_idz2[1]; - if ((m_fp[1] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[2]; - y = m_idy2[2]; - z = m_idz2[2]; - if ((m_fp[2] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[3]; - y = m_idy2[3]; - z = m_idz2[3]; - if ((m_fp[3] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[4]; - y = m_idy2[4]; - z = m_idz2[4]; - if ((m_fp[4] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[5]; - y = m_idy2[5]; - z = m_idz2[5]; - if ((m_fp[5] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - *pAllInside = true; - return CULL_INCLUSION; -} - -// Description -// Hierarchical approach to check if an AABB and the camera-frustum overlap, or if the AABB -// is totally inside the camera-frustum. The AABB is assumed to be in world-space. -// -// Example -// int InOut=camera.IsAABBVisible_FH(aabb); -// -// return values -// CULL_EXCLUSION = AABB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = AABB intersects the borders of the frustum, further checks necessary -// CULL_INCLUSION = AABB is complete inside the frustum, no further checks necessary -inline uint8 CCamera::IsAABBVisible_FH(const AABB& aabb) const -{ - if (IsAABBVisible_F(aabb) == CULL_EXCLUSION) - { - return CULL_EXCLUSION; - } - const f32* p = &aabb.min.x; - uint32 x, y, z; - x = m_idx2[0]; - y = m_idy2[0]; - z = m_idz2[0]; - if ((m_fp[0] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[1]; - y = m_idy2[1]; - z = m_idz2[1]; - if ((m_fp[1] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[2]; - y = m_idy2[2]; - z = m_idz2[2]; - if ((m_fp[2] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[3]; - y = m_idy2[3]; - z = m_idz2[3]; - if ((m_fp[3] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[4]; - y = m_idy2[4]; - z = m_idz2[4]; - if ((m_fp[4] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - x = m_idx2[5]; - y = m_idy2[5]; - z = m_idz2[5]; - if ((m_fp[5] | Vec3(p[x], p[y], p[z])) > 0) - { - return CULL_OVERLAP; - } - return CULL_INCLUSION; -} - - -// Description -// This function checks if an AABB and the camera-frustum overlap. The AABB is assumed to be in world-space. -// This test can reject even such AABBs that overlap a frustum-plane far outside the view-frustum. -// IMPORTANT: -// This function is only useful if you really need exact-culling. -// It's about 30% slower then "IsAABBVisible_F(aabb)" -// -// Example: -// int InOut=camera.IsAABBVisible_E(aabb); -// -// return values: -// CULL_EXCLUSION = AABB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = AABB either intersects the borders of the frustum or is totally inside -inline bool CCamera::IsAABBVisible_E(const AABB& aabb) const -{ - uint8 o = IsAABBVisible_FH(aabb); - if (o == CULL_EXCLUSION) - { - return CULL_EXCLUSION; - } - if (o == CULL_INCLUSION) - { - return CULL_OVERLAP; - } - return AdditionalCheck(aabb); //result is either "exclusion" or "overlap" -} - -// Description: -// Improved approach to check if an AABB and the camera-frustum overlap, or if the AABB -// is totally inside the camera-frustum. The AABB is assumed to be in world-space. This -// test can reject even such AABBs that overlap a frustum-plane far outside the view-frustum. -// IMPORTANT: -// This function is only useful if you really need exact-culling. -// It's about 30% slower then "IsAABBVisible_FH(aabb)" -// -// Example: -// int InOut=camera.IsAABBVisible_EH(aabb); -// -// return values: -// CULL_EXCLUSION = AABB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = AABB intersects the borders of the frustum, further checks necessary -// CULL_INCLUSION = AABB is complete inside the frustum, no further checks necessary -inline uint8 CCamera::IsAABBVisible_EH(const AABB& aabb, bool* pAllInside) const -{ - uint8 o = IsAABBVisible_FH(aabb, pAllInside); - if (o == CULL_EXCLUSION) - { - return CULL_EXCLUSION; - } - if (o == CULL_INCLUSION) - { - return CULL_INCLUSION; - } - return AdditionalCheck(aabb); //result is either "exclusion" or "overlap" -} - -// Description: -// Improved approach to check if an AABB and the camera-frustum overlap, or if the AABB -// is totally inside the camera-frustum. The AABB is assumed to be in world-space. This -// test can reject even such AABBs that overlap a frustum-plane far outside the view-frustum. -// IMPORTANT: -// This function is only useful if you really need exact-culling. -// It's about 30% slower then "IsAABBVisible_FH(aabb)" -// -// Example: -// int InOut=camera.IsAABBVisible_EH(aabb); -// -// return values: -// CULL_EXCLUSION = AABB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = AABB intersects the borders of the frustum, further checks necessary -// CULL_INCLUSION = AABB is complete inside the frustum, no further checks necessary -inline uint8 CCamera::IsAABBVisible_EH(const AABB& aabb) const -{ - uint8 o = IsAABBVisible_FH(aabb); - if (o == CULL_EXCLUSION) - { - return CULL_EXCLUSION; - } - if (o == CULL_INCLUSION) - { - return CULL_INCLUSION; - } - return AdditionalCheck(aabb); //result is either "exclusion" or "overlap" -} - - - -// Description -// Fast check if an OBB and the camera-frustum overlap, using the separating-axis-theorem (SAT) -// The center of the OOBB is assumed to be in world-space. -// NOTE: even if the OBB is totally inside the frustum, this function returns CULL_OVERLAP -// For hierarchical frustum-culling this function is not perfect. -// -// Example: -// bool InOut=camera.IsOBBVisibleFast(obb); -// -// return values: -// CULL_EXCLUSION = OBB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = OBB and frustum intersects or OBB in totally inside frustum -inline bool CCamera::IsOBBVisible_F(const Vec3& wpos, const OBB& obb) const -{ - CRY_ASSERT(obb.m33.IsOrthonormalRH(0.001f)); - - //transform the obb-center into world-space - Vec3 p = obb.m33 * obb.c + wpos; - - //extract the orientation-vectors from the columns of the 3x3 matrix - //and scale them by the half-lengths - Vec3 ax = obb.m33.GetColumn0() * obb.h.x; - Vec3 ay = obb.m33.GetColumn1() * obb.h.y; - Vec3 az = obb.m33.GetColumn2() * obb.h.z; - - //we project the axes of the OBB onto the normal of each of the 6 planes. - //If the absolute value of the distance from the center of the OBB to the plane - //is larger then the "radius" of the OBB, then the OBB is outside the frustum. - f32 t; - if ((t = m_fp[0] | p) > 0.0f) - { - if (t > (fabsf(m_fp[0].n | ax) + fabsf(m_fp[0].n | ay) + fabsf(m_fp[0].n | az))) - { - return CULL_EXCLUSION; - } - } - if ((t = m_fp[1] | p) > 0.0f) - { - if (t > (fabsf(m_fp[1].n | ax) + fabsf(m_fp[1].n | ay) + fabsf(m_fp[1].n | az))) - { - return CULL_EXCLUSION; - } - } - if ((t = m_fp[2] | p) > 0.0f) - { - if (t > (fabsf(m_fp[2].n | ax) + fabsf(m_fp[2].n | ay) + fabsf(m_fp[2].n | az))) - { - return CULL_EXCLUSION; - } - } - if ((t = m_fp[3] | p) > 0.0f) - { - if (t > (fabsf(m_fp[3].n | ax) + fabsf(m_fp[3].n | ay) + fabsf(m_fp[3].n | az))) - { - return CULL_EXCLUSION; - } - } - if ((t = m_fp[4] | p) > 0.0f) - { - if (t > (fabsf(m_fp[4].n | ax) + fabsf(m_fp[4].n | ay) + fabsf(m_fp[4].n | az))) - { - return CULL_EXCLUSION; - } - } - if ((t = m_fp[5] | p) > 0.0f) - { - if (t > (fabsf(m_fp[5].n | ax) + fabsf(m_fp[5].n | ay) + fabsf(m_fp[5].n | az))) - { - return CULL_EXCLUSION; - } - } - - //probably the OBB is visible! - //With this test we can't be sure if the OBB partially visible or totally included or - //totally outside the frustum but still intersecting one of the 6 planes (=worst case) - return CULL_OVERLAP; -} - -ILINE uint8 CCamera::IsOBBVisible_FH([[maybe_unused]] const Vec3& wpos, [[maybe_unused]] const OBB& obb) const -{ - //not implemented yet - return CULL_EXCLUSION; -} - -// Description: -// This function checks if an OBB and the camera-frustum overlap. -// This test can reject even such OBBs that overlap a frustum-plane -// far outside the view-frustum. -// IMPORTANT: It is about 10% slower then "IsOBBVisibleFast(obb)" -// -// Example: -// int InOut=camera.IsOBBVisible_E(OBB); -// -// return values: -// CULL_EXCLUSION = OBB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = OBB intersects the borders of the frustum or is totally inside -inline bool CCamera::IsOBBVisible_E(const Vec3& wpos, const OBB& obb, f32 uscale = 1.0f) const -{ - assert(obb.m33.IsOrthonormalRH(0.001f)); - - //transform the obb-center into world-space - Vec3 p = obb.m33 * obb.c * uscale + wpos; - - //extract the orientation-vectors from the columns of the 3x3 matrix - //and scale them by the half-lengths - Vec3 ax = obb.m33.GetColumn0() * obb.h.x * uscale; - Vec3 ay = obb.m33.GetColumn1() * obb.h.y * uscale; - Vec3 az = obb.m33.GetColumn2() * obb.h.z * uscale; - - //we project the axes of the OBB onto the normal of each of the 6 planes. - //If the absolute value of the distance from the center of the OBB to the plane - //is larger then the "radius" of the OBB, then the OBB is outside the frustum. - f32 t0, t1, t2, t3, t4, t5; - bool mt0, mt1, mt2, mt3, mt4, mt5; - mt0 = (t0 = m_fp[0] | p) > 0.0f; - if (mt0) - { - if (t0 > (fabsf(m_fp[0].n | ax) + fabsf(m_fp[0].n | ay) + fabsf(m_fp[0].n | az))) - { - return CULL_EXCLUSION; - } - } - mt1 = (t1 = m_fp[1] | p) > 0.0f; - if (mt1) - { - if (t1 > (fabsf(m_fp[1].n | ax) + fabsf(m_fp[1].n | ay) + fabsf(m_fp[1].n | az))) - { - return CULL_EXCLUSION; - } - } - mt2 = (t2 = m_fp[2] | p) > 0.0f; - if (mt2) - { - if (t2 > (fabsf(m_fp[2].n | ax) + fabsf(m_fp[2].n | ay) + fabsf(m_fp[2].n | az))) - { - return CULL_EXCLUSION; - } - } - mt3 = (t3 = m_fp[3] | p) > 0.0f; - if (mt3) - { - if (t3 > (fabsf(m_fp[3].n | ax) + fabsf(m_fp[3].n | ay) + fabsf(m_fp[3].n | az))) - { - return CULL_EXCLUSION; - } - } - mt4 = (t4 = m_fp[4] | p) > 0.0f; - if (mt4) - { - if (t4 > (fabsf(m_fp[4].n | ax) + fabsf(m_fp[4].n | ay) + fabsf(m_fp[4].n | az))) - { - return CULL_EXCLUSION; - } - } - mt5 = (t5 = m_fp[5] | p) > 0.0f; - if (mt5) - { - if (t5 > (fabsf(m_fp[5].n | ax) + fabsf(m_fp[5].n | ay) + fabsf(m_fp[5].n | az))) - { - return CULL_EXCLUSION; - } - } - - //if obb-center is in view-frustum, then stop further calculation - if (!(mt0 | mt1 | mt2 | mt3 | mt4 | mt5)) - { - return CULL_OVERLAP; - } - - return AdditionalCheck(wpos, obb, uscale); -} - - -// Description: -// Improved approach to check if an OBB and the camera-frustum intersect, or if the OBB -// is totally inside the camera-frustum. The bounding-box of the OBB is assumed to be -// in world-space. This test can reject even such OBBs that intersect a frustum-plane far -// outside the view-frustum -// -// Example: -// int InOut=camera.IsOBBVisible_EH(obb); -// -// return values: -// CULL_EXCLUSION = OBB outside of frustum (very fast rejection-test) -// CULL_OVERLAP = OBB intersects the borders of the frustum, further checks necessary -// CULL_INCLUSION = OBB is complete inside the frustum, no further checks necessary -inline uint8 CCamera::IsOBBVisible_EH(const Vec3& wpos, const OBB& obb, f32 uscale = 1.0f) const -{ - assert(obb.m33.IsOrthonormalRH(0.001f)); - //transform the obb-center into world-space - Vec3 p = obb.m33 * obb.c * uscale + wpos; - - //extract the orientation-vectors from the columns of the 3x3 matrix - //and scale them by the half-lengths - Vec3 ax = obb.m33.GetColumn0() * obb.h.x * uscale; - Vec3 ay = obb.m33.GetColumn1() * obb.h.y * uscale; - Vec3 az = obb.m33.GetColumn2() * obb.h.z * uscale; - - //we project the axes of the OBB onto the normal of each of the 6 planes. - //If the absolute value of the distance from the center of the OBB to the plane - //is larger then the "radius" of the OBB, then the OBB is outside the frustum. - f32 t0, t1, t2, t3, t4, t5; - bool mt0, mt1, mt2, mt3, mt4, mt5; - if (mt0 = (t0 = m_fp[0] | p) > 0.0f) - { - if (t0 > (fabsf(m_fp[0].n | ax) + fabsf(m_fp[0].n | ay) + fabsf(m_fp[0].n | az))) - { - return CULL_EXCLUSION; - } - } - if (mt1 = (t1 = m_fp[1] | p) > 0.0f) - { - if (t1 > (fabsf(m_fp[1].n | ax) + fabsf(m_fp[1].n | ay) + fabsf(m_fp[1].n | az))) - { - return CULL_EXCLUSION; - } - } - if (mt2 = (t2 = m_fp[2] | p) > 0.0f) - { - if (t2 > (fabsf(m_fp[2].n | ax) + fabsf(m_fp[2].n | ay) + fabsf(m_fp[2].n | az))) - { - return CULL_EXCLUSION; - } - } - if (mt3 = (t3 = m_fp[3] | p) > 0.0f) - { - if (t3 > (fabsf(m_fp[3].n | ax) + fabsf(m_fp[3].n | ay) + fabsf(m_fp[3].n | az))) - { - return CULL_EXCLUSION; - } - } - if (mt4 = (t4 = m_fp[4] | p) > 0.0f) - { - if (t4 > (fabsf(m_fp[4].n | ax) + fabsf(m_fp[4].n | ay) + fabsf(m_fp[4].n | az))) - { - return CULL_EXCLUSION; - } - } - if (mt5 = (t5 = m_fp[5] | p) > 0.0f) - { - if (t5 > (fabsf(m_fp[5].n | ax) + fabsf(m_fp[5].n | ay) + fabsf(m_fp[5].n | az))) - { - return CULL_EXCLUSION; - } - } - - //check if obb-center is in view-frustum - if (!(mt0 | mt1 | mt2 | mt3 | mt4 | mt5)) - { - //yes, it is! - //and now check if OBB is totally included - if (-t0 < (fabsf(m_fp[0].n | ax) + fabsf(m_fp[0].n | ay) + fabsf(m_fp[0].n | az))) - { - return CULL_OVERLAP; - } - if (-t1 < (fabsf(m_fp[1].n | ax) + fabsf(m_fp[1].n | ay) + fabsf(m_fp[1].n | az))) - { - return CULL_OVERLAP; - } - if (-t2 < (fabsf(m_fp[2].n | ax) + fabsf(m_fp[2].n | ay) + fabsf(m_fp[2].n | az))) - { - return CULL_OVERLAP; - } - if (-t3 < (fabsf(m_fp[3].n | ax) + fabsf(m_fp[3].n | ay) + fabsf(m_fp[3].n | az))) - { - return CULL_OVERLAP; - } - if (-t4 < (fabsf(m_fp[4].n | ax) + fabsf(m_fp[4].n | ay) + fabsf(m_fp[4].n | az))) - { - return CULL_OVERLAP; - } - if (-t5 < (fabsf(m_fp[5].n | ax) + fabsf(m_fp[5].n | ay) + fabsf(m_fp[5].n | az))) - { - return CULL_OVERLAP; - } - return CULL_INCLUSION; - } - return AdditionalCheck(wpos, obb, uscale); -} - -//------------------------------------------------------------------------------ -//--- ADDITIONAL-TEST --- -//------------------------------------------------------------------------------ - -alignas(64) extern uint32 BoxSides[]; - -// Description: -// A box can easily straddle one of the view-frustum planes far -// outside the view-frustum and in this case the previous test would -// return CULL_OVERLAP. -// -// Note: With this check, we make sure the AABB is really not visble -NO_INLINE_WEAK bool CCamera::AdditionalCheck(const AABB& aabb) const -{ - Vec3d m = (aabb.min + aabb.max) * 0.5; - uint32 o = 1; //will be reset to 0 if center is outside - o &= isneg(m_fp[0] | m); - o &= isneg(m_fp[2] | m); - o &= isneg(m_fp[3] | m); - o &= isneg(m_fp[4] | m); - o &= isneg(m_fp[5] | m); - o &= isneg(m_fp[1] | m); - if (o) - { - return CULL_OVERLAP; //if obb-center is in view-frustum, then stop further calculation - } - Vec3d vmin(aabb.min - GetPosition()); //AABB in camera-space - Vec3d vmax(aabb.max - GetPosition()); //AABB in camera-space - - uint32 frontx8 = 0; // make the flags using the fact that the upper bit in f32 is its sign - - union f64_u - { - f64 floatVal; - int64 intVal; - }; - f64_u uminx, uminy, uminz, umaxx, umaxy, umaxz; - uminx.floatVal = vmin.x; - uminy.floatVal = vmin.y; - uminz.floatVal = vmin.z; - umaxx.floatVal = vmax.x; - umaxy.floatVal = vmax.y; - umaxz.floatVal = vmax.z; - - frontx8 |= (-uminx.intVal >> 0x3f) & 0x008; //if (AABB.min.x>0.0f) frontx8|=0x008; - frontx8 |= (umaxx.intVal >> 0x3f) & 0x010; //if (AABB.max.x<0.0f) frontx8|=0x010; - frontx8 |= (-uminy.intVal >> 0x3f) & 0x020; //if (AABB.min.y>0.0f) frontx8|=0x020; - frontx8 |= (umaxy.intVal >> 0x3f) & 0x040; //if (AABB.max.y<0.0f) frontx8|=0x040; - frontx8 |= (-uminz.intVal >> 0x3f) & 0x080; //if (AABB.min.z>0.0f) frontx8|=0x080; - frontx8 |= (umaxz.intVal >> 0x3f) & 0x100; //if (AABB.max.z<0.0f) frontx8|=0x100; - - //check if camera is inside the aabb - if (frontx8 == 0) - { - return CULL_OVERLAP; //AABB is patially visible - } - Vec3d v[8] = { - Vec3d(vmin.x, vmin.y, vmin.z), - Vec3d(vmax.x, vmin.y, vmin.z), - Vec3d(vmin.x, vmax.y, vmin.z), - Vec3d(vmax.x, vmax.y, vmin.z), - Vec3d(vmin.x, vmin.y, vmax.z), - Vec3d(vmax.x, vmin.y, vmax.z), - Vec3d(vmin.x, vmax.y, vmax.z), - Vec3d(vmax.x, vmax.y, vmax.z) - }; - - //--------------------------------------------------------------------- - //--- find the silhouette-vertices of the AABB --- - //--------------------------------------------------------------------- - uint32 p0 = BoxSides[frontx8 + 0]; - uint32 p1 = BoxSides[frontx8 + 1]; - uint32 p2 = BoxSides[frontx8 + 2]; - uint32 p3 = BoxSides[frontx8 + 3]; - uint32 p4 = BoxSides[frontx8 + 4]; - uint32 p5 = BoxSides[frontx8 + 5]; - uint32 sideamount = BoxSides[frontx8 + 7]; - - if (sideamount == 4) - { - //-------------------------------------------------------------------------- - //--- we take the 4 vertices of projection-plane in cam-space, --- - //----- and clip them against the 4 side-frustum-planes of the AABB - - //-------------------------------------------------------------------------- - Vec3d s0 = v[p0] % v[p1]; - if ((s0 | m_cltp) > 0 && (s0 | m_crtp) > 0 && (s0 | m_crbp) > 0 && (s0 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s1 = v[p1] % v[p2]; - if ((s1 | m_cltp) > 0 && (s1 | m_crtp) > 0 && (s1 | m_crbp) > 0 && (s1 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s2 = v[p2] % v[p3]; - if ((s2 | m_cltp) > 0 && (s2 | m_crtp) > 0 && (s2 | m_crbp) > 0 && (s2 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s3 = v[p3] % v[p0]; - if ((s3 | m_cltp) > 0 && (s3 | m_crtp) > 0 && (s3 | m_crbp) > 0 && (s3 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - } - - if (sideamount == 6) - { - //-------------------------------------------------------------------------- - //--- we take the 4 vertices of projection-plane in cam-space, --- - //--- and clip them against the 6 side-frustum-planes of the AABB --- - //-------------------------------------------------------------------------- - Vec3d s0 = v[p0] % v[p1]; - if ((s0 | m_cltp) > 0 && (s0 | m_crtp) > 0 && (s0 | m_crbp) > 0 && (s0 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s1 = v[p1] % v[p2]; - if ((s1 | m_cltp) > 0 && (s1 | m_crtp) > 0 && (s1 | m_crbp) > 0 && (s1 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s2 = v[p2] % v[p3]; - if ((s2 | m_cltp) > 0 && (s2 | m_crtp) > 0 && (s2 | m_crbp) > 0 && (s2 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s3 = v[p3] % v[p4]; - if ((s3 | m_cltp) > 0 && (s3 | m_crtp) > 0 && (s3 | m_crbp) > 0 && (s3 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s4 = v[p4] % v[p5]; - if ((s4 | m_cltp) > 0 && (s4 | m_crtp) > 0 && (s4 | m_crbp) > 0 && (s4 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - Vec3d s5 = v[p5] % v[p0]; - if ((s5 | m_cltp) > 0 && (s5 | m_crtp) > 0 && (s5 | m_crbp) > 0 && (s5 | m_clbp) > 0) - { - return CULL_EXCLUSION; - } - } - return CULL_OVERLAP; //AABB is patially visible -} - -//------------------------------------------------------------------------------ -//--- ADDITIONAL-TEST --- -//------------------------------------------------------------------------------ - -// Description: -// A box can easily straddle one of the view-frustum planes far -// outside the view-frustum and in this case the previous test would -// return CULL_OVERLAP. -// Note: -// With this check, we make sure the OBB is really not visible -NO_INLINE_WEAK bool CCamera::AdditionalCheck(const Vec3& wpos, const OBB& obb, f32 uscale) const -{ - Vec3 CamInOBBSpace = wpos - GetPosition(); - Vec3 iCamPos = -CamInOBBSpace * obb.m33; - uint32 front8 = 0; - AABB aabb = AABB((obb.c - obb.h) * uscale, (obb.c + obb.h) * uscale); - if (iCamPos.x < aabb.min.x) - { - front8 |= 0x008; - } - if (iCamPos.x > aabb.max.x) - { - front8 |= 0x010; - } - if (iCamPos.y < aabb.min.y) - { - front8 |= 0x020; - } - if (iCamPos.y > aabb.max.y) - { - front8 |= 0x040; - } - if (iCamPos.z < aabb.min.z) - { - front8 |= 0x080; - } - if (iCamPos.z > aabb.max.z) - { - front8 |= 0x100; - } - - if (front8 == 0) - { - return CULL_OVERLAP; - } - - //the transformed OBB-vertices in cam-space - Vec3 v[8] = { - obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.min.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.min.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.min.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.min.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.min.x, aabb.min.y, aabb.max.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.max.x, aabb.min.y, aabb.max.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.min.x, aabb.max.y, aabb.max.z) + CamInOBBSpace, - obb.m33 * Vec3(aabb.max.x, aabb.max.y, aabb.max.z) + CamInOBBSpace - }; - - //--------------------------------------------------------------------- - //--- find the silhouette-vertices of the OBB --- - //--------------------------------------------------------------------- - uint32 p0 = BoxSides[front8 + 0]; - uint32 p1 = BoxSides[front8 + 1]; - uint32 p2 = BoxSides[front8 + 2]; - uint32 p3 = BoxSides[front8 + 3]; - uint32 p4 = BoxSides[front8 + 4]; - uint32 p5 = BoxSides[front8 + 5]; - uint32 sideamount = BoxSides[front8 + 7]; - - if (sideamount == 4) - { - //-------------------------------------------------------------------------- - //--- we take the 4 vertices of projection-plane in cam-space, --- - //----- and clip them against the 4 side-frustum-planes of the OBB - - //-------------------------------------------------------------------------- - Vec3 s0 = v[p0] % v[p1]; - if (((s0 | m_cltp) >= 0) && ((s0 | m_crtp) >= 0) && ((s0 | m_crbp) >= 0) && ((s0 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s1 = v[p1] % v[p2]; - if (((s1 | m_cltp) >= 0) && ((s1 | m_crtp) >= 0) && ((s1 | m_crbp) >= 0) && ((s1 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s2 = v[p2] % v[p3]; - if (((s2 | m_cltp) >= 0) && ((s2 | m_crtp) >= 0) && ((s2 | m_crbp) >= 0) && ((s2 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s3 = v[p3] % v[p0]; - if (((s3 | m_cltp) >= 0) && ((s3 | m_crtp) >= 0) && ((s3 | m_crbp) >= 0) && ((s3 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - } - - if (sideamount == 6) - { - //-------------------------------------------------------------------------- - //--- we take the 4 vertices of projection-plane in cam-space, --- - //--- and clip them against the 6 side-frustum-planes of the OBB --- - //-------------------------------------------------------------------------- - Vec3 s0 = v[p0] % v[p1]; - if (((s0 | m_cltp) >= 0) && ((s0 | m_crtp) >= 0) && ((s0 | m_crbp) >= 0) && ((s0 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s1 = v[p1] % v[p2]; - if (((s1 | m_cltp) >= 0) && ((s1 | m_crtp) >= 0) && ((s1 | m_crbp) >= 0) && ((s1 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s2 = v[p2] % v[p3]; - if (((s2 | m_cltp) >= 0) && ((s2 | m_crtp) >= 0) && ((s2 | m_crbp) >= 0) && ((s2 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s3 = v[p3] % v[p4]; - if (((s3 | m_cltp) >= 0) && ((s3 | m_crtp) >= 0) && ((s3 | m_crbp) >= 0) && ((s3 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s4 = v[p4] % v[p5]; - if (((s4 | m_cltp) >= 0) && ((s4 | m_crtp) >= 0) && ((s4 | m_crbp) >= 0) && ((s4 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - Vec3 s5 = v[p5] % v[p0]; - if (((s5 | m_cltp) >= 0) && ((s5 | m_crtp) >= 0) && ((s5 | m_crbp) >= 0) && ((s5 | m_clbp) >= 0)) - { - return CULL_EXCLUSION; - } - } - //now we are 100% sure that the OBB is visible on the screen - return CULL_OVERLAP; -} - -#endif // CRYINCLUDE_CRYCOMMON_CRY_CAMERA_H diff --git a/Code/Legacy/CryCommon/Cry_Color.h b/Code/Legacy/CryCommon/Cry_Color.h index 4f00f0c373..7fae67c284 100644 --- a/Code/Legacy/CryCommon/Cry_Color.h +++ b/Code/Legacy/CryCommon/Cry_Color.h @@ -8,21 +8,12 @@ // Description : 4D Color template. - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_COLOR_H -#define CRYINCLUDE_CRYCOMMON_CRY_COLOR_H #pragma once #include #include #include "Cry_Math.h" -ILINE float FClamp(float X, float Min, float Max) -{ - return X < Min ? Min : X < Max ? X : Max; -} - template struct Color_tpl; @@ -54,44 +45,6 @@ struct Color_tpl ILINE Color_tpl(const Vec3& c, float fAlpha); ILINE Color_tpl(const Vec4& c); - void Clamp(float Min = 0, float Max = 1.0f) - { - r = ::FClamp(r, Min, Max); - g = ::FClamp(g, Min, Max); - b = ::FClamp(b, Min, Max); - a = ::FClamp(a, Min, Max); - } - void ScaleCol (float f) - { - r = static_cast(r * f); - g = static_cast(g * f); - b = static_cast(b * f); - } - - float Luminance() const - { - return r * 0.30f + g * 0.59f + b * 0.11f; - } - - ILINE float Max() const - { - return max(r, max(b, g)); - } - - float NormalizeCol (ColorF& out) const - { - float max = Max(); - - if (max == 0) - { - return 0; - } - - out = *this / max; - - return max; - } - ILINE Color_tpl(const Vec3& vVec) { r = (T)vVec.x; @@ -114,20 +67,6 @@ struct Color_tpl a = static_cast(fA); } - ILINE void set(T _x, T _y = 0, T _z = 0, T _w = 0) - { - r = _x; - g = _y; - b = _z; - a = _w; - } - ILINE void set(T _x, T _y = 0, T _z = 0) - { - r = _x; - g = _y; - b = _z; - a = 1; - } ILINE Color_tpl operator + () const { return *this; @@ -227,117 +166,12 @@ struct Color_tpl return (r != v.r) || (g != v.g) || (b != v.b) || (a != v.a); } - ILINE unsigned char pack_rgb332() const; - ILINE unsigned short pack_argb4444() const; - ILINE unsigned short pack_rgb555() const; - ILINE unsigned short pack_rgb565() const; - ILINE unsigned int pack_bgr888() const; - ILINE unsigned int pack_rgb888() const; ILINE unsigned int pack_abgr8888() const; ILINE unsigned int pack_argb8888() const; - inline Vec4 toVec4() const { return Vec4(r, g, b, a); } inline Vec3 toVec3() const { return Vec3(r, g, b); } - inline void toFloat4(f32* out) const; - - inline void toHSV(f32& h, f32& s, f32& v) const; - inline void fromHSV(f32 h, f32 s, f32 v); inline void clamp(T bottom = 0.0f, T top = 1.0f); - inline void maximum(const Color_tpl& ca, const Color_tpl& cb); - inline void minimum(const Color_tpl& ca, const Color_tpl& cb); - inline void abs(); - - inline void adjust_contrast(T c); - inline void adjust_saturation(T s); - inline void adjust_luminance(float newLum); - - inline void lerpFloat(const Color_tpl& ca, const Color_tpl& cb, float s); - inline void negative(const Color_tpl& c); - inline void grey(const Color_tpl& c); - - // helper function - maybe we can improve the integration - static inline uint32 ComputeAvgCol_Fast(const uint32 dwCol0, const uint32 dwCol1) - { - uint32 dwHalfCol0 = (dwCol0 / 2) & 0x7f7f7f7f; // each component /2 - uint32 dwHalfCol1 = (dwCol1 / 2) & 0x7f7f7f7f; // each component /2 - - return dwHalfCol0 + dwHalfCol1; - } - - // mCIE: adjusted to compensate problems of DXT compression (extra bit in green channel causes green/purple artifacts) - // explained in CryEngine wiki: ColorSpaces - Color_tpl RGB2mCIE() const - { - Color_tpl in = *this; - - // to get grey chrominance for dark colors - in.r += 0.000001f; - in.g += 0.000001f; - in.b += 0.000001f; - - float RGBSum = in.r + in.g + in.b; - - float fInv = 1.0f / RGBSum; - - float RNorm = 3 * 10.0f / 31.0f * in.r * fInv; - float GNorm = 3 * 21.0f / 63.0f * in.g * fInv; - float Scale = RGBSum / 3.0f; - - // test grey - // out.r = 10.0f/31.0f; // 1/3 = 10/30 Red range 0..30, 31 unused - // out.g = 21.0f/63.0f; // 1/3 = 21/63 Green range 0..63 - - RNorm = max(0.0f, min(1.0f, RNorm)); - GNorm = max(0.0f, min(1.0f, GNorm)); - - return Color_tpl(RNorm, GNorm, Scale); - } - - // mCIE: adjusted to compensate problems of DXT compression (extra bit in green channel causes green/purple artefacts) - // explained in CryEngine wiki: ColorSpaces - Color_tpl mCIE2RGB() const - { - Color_tpl out = *this; - - float fScale = out.b; // Blue range 0..31 - - // test grey - // out.r = 10.0f/31.0f; // 1/3 = 10/30 Red range 0..30, 31 unused - // out.g = 21.0f/63.0f; // 1/3 = 21/63 Green range 0..63 - - out.r *= 31.0f / 30.0f; // - out.g *= 63.0f / 63.0f; // - out.b = 0.999f - out.r - out.g; - - float s = 3.0f * fScale; - - out.r *= s; - out.g *= s; - out.b *= s; - - out.Clamp(); - - return out; - } - - void rgb2srgb() - { - for (int i = 0; i < 3; i++) - { - T& c = (*this)[i]; - - if (c < 0.0031308f) - { - c = 12.92f * c; - } - else - { - c = 1.055f * pow(c, 1.0f / 2.4f) - 0.055f; - } - } - } - void srgb2rgb() { for (int i = 0; i < 3; i++) @@ -355,8 +189,6 @@ struct Color_tpl } } - void GetMemoryUsage([[maybe_unused]] class ICrySizer* pSizer) const { /*nothing*/} - AZStd::array GetAsArray() const { AZStd::array primitiveArray = { { r, g, b, a } }; @@ -512,35 +344,10 @@ ILINE Color_tpl::Color_tpl(const Vec4& c) a = (uint8)(c.w * 255); } -template<> -inline void Color_tpl::toFloat4(f32* out) const -{ - out[0] = r / 255.0f; - out[1] = g / 255.0f; - out[2] = b / 255.0f; - out[3] = a / 255.0f; -} - -template<> -inline void Color_tpl::toFloat4(f32* out) const -{ - out[0] = r; - out[1] = g; - out[2] = b; - out[3] = a; -} - ////////////////////////////////////////////////////////////////////////////////////////////// // functions implementation /////////////////////////////////////////////// -/////////////////////////////////////////////// -/*template -inline Color_tpl::Color_tpl(const T *p_elts) -{ -r = p_elts[0]; g = p_elts[1]; b = p_elts[2]; a = p_elts[3]; -}*/ - /////////////////////////////////////////////// /////////////////////////////////////////////// template @@ -549,178 +356,6 @@ ILINE Color_tpl operator * (T s, const Color_tpl& v) return Color_tpl(v.r * s, v.g * s, v.b * s, v.a * s); } -/////////////////////////////////////////////// -template -ILINE unsigned char Color_tpl::pack_rgb332() const -{ - unsigned char cr; - unsigned char cg; - unsigned char cb; - if constexpr (sizeof(r) == 1) // char and unsigned char - { - cr = (unsigned char)r; - cg = (unsigned char)g; - cb = (unsigned char)b; - } - else if constexpr (sizeof(r) == 2) // short and unsigned short - { - cr = (unsigned short)(r) >> 8; - cg = (unsigned short)(g) >> 8; - cb = (unsigned short)(b) >> 8; - } - else // float or double - { - cr = (unsigned char)(r * 255.0f); - cg = (unsigned char)(g * 255.0f); - cb = (unsigned char)(b * 255.0f); - } - return ((cr >> 5) << 5) | ((cg >> 5) << 2) | (cb >> 5); -} - -/////////////////////////////////////////////// -template -ILINE unsigned short Color_tpl::pack_argb4444() const -{ - unsigned char cr; - unsigned char cg; - unsigned char cb; - unsigned char ca; - if constexpr (sizeof(r) == 1) // char and unsigned char - { - cr = (unsigned char)r; - cg = (unsigned char)g; - cb = (unsigned char)b; - ca = (unsigned char)a; - } - else if constexpr (sizeof(r) == 2) // short and unsigned short - { - cr = (unsigned short)(r) >> 8; - cg = (unsigned short)(g) >> 8; - cb = (unsigned short)(b) >> 8; - ca = (unsigned short)(a) >> 8; - } - else // float or double - { - cr = (unsigned char)(r * 255.0f); - cg = (unsigned char)(g * 255.0f); - cb = (unsigned char)(b * 255.0f); - ca = (unsigned char)(a * 255.0f); - } - return ((ca >> 4) << 12) | ((cr >> 4) << 8) | ((cg >> 4) << 4) | (cb >> 4); -} - -/////////////////////////////////////////////// -template -ILINE unsigned short Color_tpl::pack_rgb555() const -{ - unsigned char cr; - unsigned char cg; - unsigned char cb; - if constexpr (sizeof(r) == 1) // char and unsigned char - { - cr = (unsigned char)r; - cg = (unsigned char)g; - cb = (unsigned char)b; - } - else if constexpr (sizeof(r) == 2) // short and unsigned short - { - cr = (unsigned short)(r) >> 8; - cg = (unsigned short)(g) >> 8; - cb = (unsigned short)(b) >> 8; - } - else // float or double - { - cr = (unsigned char)(r * 255.0f); - cg = (unsigned char)(g * 255.0f); - cb = (unsigned char)(b * 255.0f); - } - return ((cr >> 3) << 10) | ((cg >> 3) << 5) | (cb >> 3); -} - -/////////////////////////////////////////////// -template -ILINE unsigned short Color_tpl::pack_rgb565() const -{ - unsigned short cr; - unsigned short cg; - unsigned short cb; - if constexpr (sizeof(r) == 1) // char and unsigned char - { - cr = (unsigned short)r; - cg = (unsigned short)g; - cb = (unsigned short)b; - } - else if constexpr (sizeof(r) == 2) // short and unsigned short - { - cr = (unsigned short)(r) >> 8; - cg = (unsigned short)(g) >> 8; - cb = (unsigned short)(b) >> 8; - } - else // float or double - { - cr = (unsigned short)(r * 255.0f); - cg = (unsigned short)(g * 255.0f); - cb = (unsigned short)(b * 255.0f); - } - return ((cr >> 3) << 11) | ((cg >> 2) << 5) | (cb >> 3); -} - -/////////////////////////////////////////////// -template -ILINE unsigned int Color_tpl::pack_bgr888() const -{ - unsigned char cr; - unsigned char cg; - unsigned char cb; - if constexpr (sizeof(r) == 1) // char and unsigned char - { - cr = (unsigned char)r; - cg = (unsigned char)g; - cb = (unsigned char)b; - } - else if constexpr (sizeof(r) == 2) // short and unsigned short - { - cr = (unsigned short)(r) >> 8; - cg = (unsigned short)(g) >> 8; - cb = (unsigned short)(b) >> 8; - } - else // float or double - { - cr = (unsigned char)(r * 255.0f); - cg = (unsigned char)(g * 255.0f); - cb = (unsigned char)(b * 255.0f); - } - return (cb << 16) | (cg << 8) | cr; -} - -/////////////////////////////////////////////// -template -ILINE unsigned int Color_tpl::pack_rgb888() const -{ - unsigned char cr; - unsigned char cg; - unsigned char cb; - if constexpr (sizeof(r) == 1) // char and unsigned char - { - cr = (unsigned char)r; - cg = (unsigned char)g; - cb = (unsigned char)b; - } - else if constexpr (sizeof(r) == 2) // short and unsigned short - { - cr = (unsigned short)(r) >> 8; - cg = (unsigned short)(g) >> 8; - cb = (unsigned short)(b) >> 8; - } - else // float or double - { - cr = (unsigned char)(r * 255.0f); - cg = (unsigned char)(g * 255.0f); - cb = (unsigned char)(b * 255.0f); - } - return (cr << 16) | (cg << 8) | cb; -} - /////////////////////////////////////////////// template ILINE unsigned int Color_tpl::pack_abgr8888() const @@ -786,211 +421,6 @@ ILINE unsigned int Color_tpl::pack_argb8888() const return (ca << 24) | (cr << 16) | (cg << 8) | cb; } -/////////////////////////////////////////////// -template -inline void Color_tpl::toHSV(f32& h, f32& s, f32& v) const -{ - f32 red, green, blue; - if constexpr (sizeof(this->r) == 1) // 8bit integer - { - red = this->r * (1.0f / f32(0xff)); - green = this->g * (1.0f / f32(0xff)); - blue = this->b * (1.0f / f32(0xff)); - } - else if constexpr (sizeof(this->r) == 2) // 16bit integer - { - red = this->r * (1.0f / f32(0xffff)); - green = this->g * (1.0f / f32(0xffff)); - blue = this->b * (1.0f / f32(0xffff)); - } - else // floating point - { - red = this->r; - green = this->g; - blue = this->b; - } - - if ((blue > green) && (blue > red)) - { - if (!::iszero(v = blue)) - { - const f32 min = red < green ? red : green; - const f32 delta = v - min; - if (!::iszero(delta)) - { - s = delta / v; - h = (240.0f / 360.0f) + (red - green) / delta * (60.0f / 360.0f); - } - else - { - s = 0.0f; - h = (240.0f / 360.0f) + (red - green) * (60.0f / 360.0f); - } - if (h < 0.0f) - { - h += 1.0f; - } - } - else - { - s = 0.0f; - h = 0.0f; - } - } - else if (green > red) - { - if (!::iszero(v = green)) - { - const f32 min = red < blue ? red : blue; - const f32 delta = v - min; - if (!::iszero(delta)) - { - s = delta / v; - h = (120.0f / 360.0f) + (blue - red) / delta * (60.0f / 360.0f); - } - else - { - s = 0.0f; - h = (120.0f / 360.0f) + (blue - red) * (60.0f / 360.0f); - } - if (h < 0.0f) - { - h += 1.0f; - } - } - else - { - s = 0.0f; - h = 0.0f; - } - } - else - { - if (!::iszero(v = red)) - { - const f32 min = green < blue ? green : blue; - const f32 delta = v - min; - if (!::iszero(delta)) - { - s = delta / v; - h = (green - blue) / delta * (60.0f / 360.0f); - } - else - { - s = 0.0f; - h = (green - blue) * (60.0f / 360.0f); - } - if (h < 0.0f) - { - h += 1.0f; - } - } - else - { - s = 0.0f; - h = 0.0f; - } - } -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::fromHSV(f32 h, f32 s, f32 v) -{ - f32 red, green, blue; - if (::iszero(v)) - { - red = 0.0f; - green = 0.0f; - blue = 0.0f; - } - else if (::iszero(s)) - { - red = v; - green = v; - blue = v; - } - else - { - const f32 hi = h * 6.0f; - const int32 i = (int32)::floor(hi); - const f32 f = hi - i; - - const f32 v0 = v * (1.0f - s); - const f32 v1 = v * (1.0f - s * f); - const f32 v2 = v * (1.0f - s * (1.0f - f)); - - switch (i) - { - case 0: - red = v; - green = v2; - blue = v0; - break; - case 1: - red = v1; - green = v; - blue = v0; - break; - case 2: - red = v0; - green = v; - blue = v2; - break; - case 3: - red = v0; - green = v1; - blue = v; - break; - case 4: - red = v2; - green = v0; - blue = v; - break; - case 5: - red = v; - green = v0; - blue = v1; - break; - - case 6: - red = v; - green = v2; - blue = v0; - break; - case -1: - red = v; - green = v0; - blue = v1; - break; - default: - red = 0.0f; - green = 0.0f; - blue = 0.0f; - break; - } - } - - if constexpr (sizeof(this->r) == 1) // 8bit integer - { - this->r = red * f32(0xff); - this->g = green * f32(0xff); - this->b = blue * f32(0xff); - } - else if constexpr (sizeof(this->r) == 2) // 16bit integer - { - this->r = red * f32(0xffff); - this->g = green * f32(0xffff); - this->b = blue * f32(0xffff); - } - else // floating point - { - this->r = red; - this->g = green; - this->b = blue; - } -} - /////////////////////////////////////////////// template inline void Color_tpl::clamp(T bottom, T top) @@ -1001,214 +431,5 @@ inline void Color_tpl::clamp(T bottom, T top) a = min(top, max(bottom, a)); } -/////////////////////////////////////////////// -template -inline void Color_tpl::maximum(const Color_tpl& ca, const Color_tpl& cb) -{ - r = max(ca.r, cb.r); - g = max(ca.g, cb.g); - b = max(ca.b, cb.b); - a = max(ca.a, cb.a); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::minimum(const Color_tpl& ca, const Color_tpl& cb) -{ - r = min(ca.r, cb.r); - g = min(ca.g, cb.g); - b = min(ca.b, cb.b); - a = min(ca.a, cb.a); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::abs() -{ - r = fabs_tpl(r); - g = fabs_tpl(g); - b = fabs_tpl(b); - a = fabs_tpl(a); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::adjust_contrast(T c) -{ - r = 0.5f + c * (r - 0.5f); - g = 0.5f + c * (g - 0.5f); - b = 0.5f + c * (b - 0.5f); - a = 0.5f + c * (a - 0.5f); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::adjust_saturation(T s) -{ - // Approximate values for each component's contribution to luminance. - // Based upon the NTSC standard described in ITU-R Recommendation BT.709. - T grey = r * 0.2125f + g * 0.7154f + b * 0.0721f; - r = grey + s * (r - grey); - g = grey + s * (g - grey); - b = grey + s * (b - grey); - a = grey + s * (a - grey); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::adjust_luminance(float newLum) -{ - // Optimized yet equivalent version of replacing luminance in XYZ space. - // Color and luminance are expected to be linear. - - Color_tpl colF(r, g, b, a); - - float lum = colF.r * 0.212671f + colF.g * 0.715160f + colF.b * 0.072169f; - if (iszero(lum)) - { - return; - } - - *this = Color_tpl(colF * newLum / lum); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::lerpFloat(const Color_tpl& ca, const Color_tpl& cb, float s) -{ - r = (T)(ca.r + s * (cb.r - ca.r)); - g = (T)(ca.g + s * (cb.g - ca.g)); - b = (T)(ca.b + s * (cb.b - ca.b)); - a = (T)(ca.a + s * (cb.a - ca.a)); -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::negative([[maybe_unused]] const Color_tpl& c) -{ - r = T(1.0f) - r; - g = T(1.0f) - g; - b = T(1.0f) - b; - a = T(1.0f) - a; -} - -/////////////////////////////////////////////// -template -inline void Color_tpl::grey([[maybe_unused]] const Color_tpl& c) -{ - T m = (r + g + b) / T(3); - - r = m; - g = m; - b = m; -} - -////////////////////////////////////////////////////////////////////////////////////////////// -//#define RGBA8(r,g,b,a) (ColorB((uint8)(r),(uint8)(g),(uint8)(b),(uint8)(a))) -#if defined(NEED_ENDIAN_SWAP) - #define RGBA8(a, b, g, r) ((uint32)(((uint8)(r) | ((uint16)((uint8)(g)) << 8)) | (((uint32)(uint8)(b)) << 16)) | (((uint32)(uint8)(a)) << 24)) -#else - #define RGBA8(r, g, b, a) ((uint32)(((uint8)(r) | ((uint16)((uint8)(g)) << 8)) | (((uint32)(uint8)(b)) << 16)) | (((uint32)(uint8)(a)) << 24)) -#endif -#define Col_Black ColorF (0.000f, 0.000f, 0.000f) // 0xFF000000 RGB: 0, 0, 0 -#define Col_White ColorF (1.000f, 1.000f, 1.000f) // 0xFFFFFFFF RGB: 255, 255, 255 -#define Col_Aquamarine ColorF (0.498f, 1.000f, 0.831f) // 0xFF7FFFD4 RGB: 127, 255, 212 -#define Col_Azure ColorF (0.000f, 0.498f, 1.000f) // 0xFF007FFF RGB: 0, 127, 255 -#define Col_Blue ColorF (0.000f, 0.000f, 1.000f) // 0xFF0000FF RGB: 0, 0, 255 -#define Col_BlueViolet ColorF (0.541f, 0.169f, 0.886f) // 0xFF8A2BE2 RGB: 138, 43, 226 -#define Col_Brown ColorF (0.647f, 0.165f, 0.165f) // 0xFFA52A2A RGB: 165, 42, 42 -#define Col_CadetBlue ColorF (0.373f, 0.620f, 0.627f) // 0xFF5F9EA0 RGB: 95, 158, 160 -#define Col_Coral ColorF (1.000f, 0.498f, 0.314f) // 0xFFFF7F50 RGB: 255, 127, 80 -#define Col_CornflowerBlue ColorF (0.392f, 0.584f, 0.929f) // 0xFF6495ED RGB: 100, 149, 237 -#define Col_Cyan ColorF (0.000f, 1.000f, 1.000f) // 0xFF00FFFF RGB: 0, 255, 255 -#define Col_DarkGray ColorF (0.663f, 0.663f, 0.663f) // 0xFFA9A9A9 RGB: 169, 169, 169 -#define Col_DarkGrey ColorF (0.663f, 0.663f, 0.663f) // 0xFFA9A9A9 RGB: 169, 169, 169 -#define Col_DarkGreen ColorF (0.000f, 0.392f, 0.000f) // 0xFF006400 RGB: 0, 100, 0 -#define Col_DarkOliveGreen ColorF (0.333f, 0.420f, 0.184f) // 0xFF556B2F RGB: 85, 107, 47 -#define Col_DarkOrchid ColorF (0.600f, 0.196f, 0.800f) // 0xFF9932CC RGB: 153, 50, 204 -#define Col_DarkSlateBlue ColorF (0.282f, 0.239f, 0.545f) // 0xFF483D8B RGB: 72, 61, 139 -#define Col_DarkSlateGray ColorF (0.184f, 0.310f, 0.310f) // 0xFF2F4F4F RGB: 47, 79, 79 -#define Col_DarkSlateGrey ColorF (0.184f, 0.310f, 0.310f) // 0xFF2F4F4F RGB: 47, 79, 79 -#define Col_DarkTurquoise ColorF (0.000f, 0.808f, 0.820f) // 0xFF00CED1 RGB: 0, 206, 209 -#define Col_DarkWood ColorF (0.050f, 0.010f, 0.005f) // 0xFF0D0301 RGB: 13, 3, 1 -#define Col_DeepPink ColorF (1.000f, 0.078f, 0.576f) // 0xFFFF1493 RGB: 255, 20, 147 -#define Col_DimGray ColorF (0.412f, 0.412f, 0.412f) // 0xFF696969 RGB: 105, 105, 105 -#define Col_DimGrey ColorF (0.412f, 0.412f, 0.412f) // 0xFF696969 RGB: 105, 105, 105 -#define Col_FireBrick ColorF (0.698f, 0.133f, 0.133f) // 0xFFB22222 RGB: 178, 34, 34 -#define Col_ForestGreen ColorF (0.133f, 0.545f, 0.133f) // 0xFF228B22 RGB: 34, 139, 34 -#define Col_Gold ColorF (1.000f, 0.843f, 0.000f) // 0xFFFFD700 RGB: 255, 215, 0 -#define Col_Goldenrod ColorF (0.855f, 0.647f, 0.125f) // 0xFFDAA520 RGB: 218, 165, 32 -#define Col_Gray ColorF (0.502f, 0.502f, 0.502f) // 0xFF808080 RGB: 128, 128, 128 -#define Col_Grey ColorF (0.502f, 0.502f, 0.502f) // 0xFF808080 RGB: 128, 128, 128 -#define Col_Green ColorF (0.000f, 0.502f, 0.000f) // 0xFF008000 RGB: 0, 128, 0 -#define Col_GreenYellow ColorF (0.678f, 1.000f, 0.184f) // 0xFFADFF2F RGB: 173, 255, 47 -#define Col_IndianRed ColorF (0.804f, 0.361f, 0.361f) // 0xFFCD5C5C RGB: 205, 92, 92 -#define Col_Khaki ColorF (0.941f, 0.902f, 0.549f) // 0xFFF0E68C RGB: 240, 230, 140 -#define Col_LightBlue ColorF (0.678f, 0.847f, 0.902f) // 0xFFADD8E6 RGB: 173, 216, 230 -#define Col_LightGray ColorF (0.827f, 0.827f, 0.827f) // 0xFFD3D3D3 RGB: 211, 211, 211 -#define Col_LightGrey ColorF (0.827f, 0.827f, 0.827f) // 0xFFD3D3D3 RGB: 211, 211, 211 -#define Col_LightSteelBlue ColorF (0.690f, 0.769f, 0.871f) // 0xFFB0C4DE RGB: 176, 196, 222 -#define Col_LightWood ColorF (0.600f, 0.240f, 0.100f) // 0xFF993D1A RGB: 153, 61, 26 -#define Col_Lime ColorF (0.000f, 1.000f, 0.000f) // 0xFF00FF00 RGB: 0, 255, 0 -#define Col_LimeGreen ColorF (0.196f, 0.804f, 0.196f) // 0xFF32CD32 RGB: 50, 205, 50 -#define Col_Magenta ColorF (1.000f, 0.000f, 1.000f) // 0xFFFF00FF RGB: 255, 0, 255 -#define Col_Maroon ColorF (0.502f, 0.000f, 0.000f) // 0xFF800000 RGB: 128, 0, 0 -#define Col_MedianWood ColorF (0.300f, 0.120f, 0.030f) // 0xFF4D1F09 RGB: 77, 31, 9 -#define Col_MediumAquamarine ColorF (0.400f, 0.804f, 0.667f) // 0xFF66CDAA RGB: 102, 205, 170 -#define Col_MediumBlue ColorF (0.000f, 0.000f, 0.804f) // 0xFF0000CD RGB: 0, 0, 205 -#define Col_MediumForestGreen ColorF (0.420f, 0.557f, 0.137f) // 0xFF6B8E23 RGB: 107, 142, 35 -#define Col_MediumGoldenrod ColorF (0.918f, 0.918f, 0.678f) // 0xFFEAEAAD RGB: 234, 234, 173 -#define Col_MediumOrchid ColorF (0.729f, 0.333f, 0.827f) // 0xFFBA55D3 RGB: 186, 85, 211 -#define Col_MediumSeaGreen ColorF (0.235f, 0.702f, 0.443f) // 0xFF3CB371 RGB: 60, 179, 113 -#define Col_MediumSlateBlue ColorF (0.482f, 0.408f, 0.933f) // 0xFF7B68EE RGB: 123, 104, 238 -#define Col_MediumSpringGreen ColorF (0.000f, 0.980f, 0.604f) // 0xFF00FA9A RGB: 0, 250, 154 -#define Col_MediumTurquoise ColorF (0.282f, 0.820f, 0.800f) // 0xFF48D1CC RGB: 72, 209, 204 -#define Col_MediumVioletRed ColorF (0.780f, 0.082f, 0.522f) // 0xFFC71585 RGB: 199, 21, 133 -#define Col_MidnightBlue ColorF (0.098f, 0.098f, 0.439f) // 0xFF191970 RGB: 25, 25, 112 -#define Col_Navy ColorF (0.000f, 0.000f, 0.502f) // 0xFF000080 RGB: 0, 0, 128 -#define Col_NavyBlue ColorF (0.137f, 0.137f, 0.557f) // 0xFF23238E RGB: 35, 35, 142 -#define Col_Orange ColorF (1.000f, 0.647f, 0.000f) // 0xFFFFA500 RGB: 255, 165, 0 -#define Col_OrangeRed ColorF (1.000f, 0.271f, 0.000f) // 0xFFFF4500 RGB: 255, 69, 0 -#define Col_Orchid ColorF (0.855f, 0.439f, 0.839f) // 0xFFDA70D6 RGB: 218, 112, 214 -#define Col_PaleGreen ColorF (0.596f, 0.984f, 0.596f) // 0xFF98FB98 RGB: 152, 251, 152 -#define Col_Pink ColorF (1.000f, 0.753f, 0.796f) // 0xFFFFC0CB RGB: 255, 192, 203 -#define Col_Plum ColorF (0.867f, 0.627f, 0.867f) // 0xFFDDA0DD RGB: 221, 160, 221 -#define Col_Red ColorF (1.000f, 0.000f, 0.000f) // 0xFFFF0000 RGB: 255, 0, 0 -#define Col_Salmon ColorF (0.980f, 0.502f, 0.447f) // 0xFFFA8072 RGB: 250, 128, 114 -#define Col_SeaGreen ColorF (0.180f, 0.545f, 0.341f) // 0xFF2E8B57 RGB: 46, 139, 87 -#define Col_Sienna ColorF (0.627f, 0.322f, 0.176f) // 0xFFA0522D RGB: 160, 82, 45 -#define Col_SkyBlue ColorF (0.529f, 0.808f, 0.922f) // 0xFF87CEEB RGB: 135, 206, 235 -#define Col_SlateBlue ColorF (0.416f, 0.353f, 0.804f) // 0xFF6A5ACD RGB: 106, 90, 205 -#define Col_SpringGreen ColorF (0.000f, 1.000f, 0.498f) // 0xFF00FF7F RGB: 0, 255, 127 -#define Col_SteelBlue ColorF (0.275f, 0.510f, 0.706f) // 0xFF4682B4 RGB: 70, 130, 180 -#define Col_Tan ColorF (0.824f, 0.706f, 0.549f) // 0xFFD2B48C RGB: 210, 180, 140 -#define Col_Thistle ColorF (0.847f, 0.749f, 0.847f) // 0xFFD8BFD8 RGB: 216, 191, 216 -#define Col_Transparent ColorF (0.0f, 0.0f, 0.0f, 0.0f) // 0x00000000 RGB: 0, 0, 0 -#define Col_Turquoise ColorF (0.251f, 0.878f, 0.816f) // 0xFF40E0D0 RGB: 64, 224, 208 -#define Col_Violet ColorF (0.933f, 0.510f, 0.933f) // 0xFFEE82EE RGB: 238, 130, 238 -#define Col_VioletRed ColorF (0.800f, 0.196f, 0.600f) // 0xFFCC3299 RGB: 204, 50, 153 -#define Col_Wheat ColorF (0.961f, 0.871f, 0.702f) // 0xFFF5DEB3 RGB: 245, 222, 179 -#define Col_Yellow ColorF (1.000f, 1.000f, 0.000f) // 0xFFFFFF00 RGB: 255, 255, 0 -#define Col_YellowGreen ColorF (0.604f, 0.804f, 0.196f) // 0xFF9ACD32 RGB: 154, 205, 50 #define Col_TrackviewDefault ColorF (0.187820792f, 0.187820792f, 1.0f) - #define Clr_Empty ColorF(0.0f, 0.0f, 0.0f, 1.0f) -#define Clr_Dark ColorF(0.15f, 0.15f, 0.15f, 1.0f) -#define Clr_White ColorF(1.0f, 1.0f, 1.0f, 1.0f) -#define Clr_WhiteTrans ColorF(1.0f, 1.0f, 1.0f, 0.0f) -#define Clr_Full ColorF(1.0f, 1.0f, 1.0f, 1.0f) -#define Clr_Neutral ColorF(1.0f, 1.0f, 1.0f, 1.0f) -#define Clr_Transparent ColorF(0.0f, 0.0f, 0.0f, 0.0f) -#define Clr_FrontVector ColorF(0.0f, 0.0f, 0.5f, 1.0f) -#define Clr_Static ColorF(127.0f / 255.0f, 127.0f / 255.0f, 0.0f, 0.0f) -#define Clr_Median ColorF(0.5f, 0.5f, 0.5f, 0.0f) -#define Clr_MedianHalf ColorF(0.5f, 0.5f, 0.5f, 0.5f) -#define Clr_FarPlane ColorF(1.0f, 0.0f, 0.0f, 0.0f) -#define Clr_FarPlane_R ColorF(bReverseDepth ? 0.0f : 1.0f, 0.0f, 0.0f, 0.0f) -#define Clr_Unknown ColorF(0.0f, 0.0f, 0.0f, 0.0f) -#define Clr_Unused ColorF(0.0f, 0.0f, 0.0f, 0.0f) -#define Clr_Debug ColorF(1.0f, 0.0f, 0.0f, 1.0f) - -#endif // CRYINCLUDE_CRYCOMMON_CRY_COLOR_H - - diff --git a/Code/Legacy/CryCommon/Cry_Geo.h b/Code/Legacy/CryCommon/Cry_Geo.h index 95213c62dc..7c85b2bdf4 100644 --- a/Code/Legacy/CryCommon/Cry_Geo.h +++ b/Code/Legacy/CryCommon/Cry_Geo.h @@ -8,10 +8,6 @@ // Description : Common structures for geometry computations - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_GEO_H -#define CRYINCLUDE_CRYCOMMON_CRY_GEO_H #pragma once #include "Cry_Math.h" @@ -29,11 +25,6 @@ struct AABB; template struct OBB_tpl; -struct Sphere; -struct AAEllipsoid; -struct Ellipsoid; -struct Cone; - //----------------------------------------------------- @@ -41,127 +32,12 @@ struct Cone; // Definitions // /////////////////////////////////////////////////////////////////////////////// -// -// Random geometry generation functions. -// - -enum EGeomForm -{ - GeomForm_Vertices, - GeomForm_Edges, - GeomForm_Surface, - GeomForm_Volume, - - MaxGeomForm -}; - -enum EGeomType -{ - GeomType_None, - GeomType_BoundingBox, - GeomType_Physics, - GeomType_Render, -}; - struct PosNorm { Vec3 vPos; Vec3 vNorm; - - void zero() - { - vPos.zero(); - vNorm.zero(); - } - - // transform by matrix, etc - void operator <<= (Matrix34 const& mx) - { - vPos = mx * vPos; - vNorm = Matrix33(mx) * vNorm; - } - void operator <<= (QuatTS const& qts) - { - vPos = qts * vPos; - vNorm = qts.q * vNorm; - } - void operator <<= (DualQuat const& dq) - { - vPos = dq * vPos; - vNorm = dq.nq * vNorm; - } }; -struct RectF -{ - float x, y, w, h; - RectF() - : x(0) - , y(0) - , w(1) - , h(1) - { - } -}; - -struct RectI -{ - int x, y, w, h; - RectI() - : x(0) - , y(0) - , w(1) - , h(1) - { - } - RectI(int inX, int inY, int inW, int inH) - : x(inX) - , y(inY) - , w(inW) - , h(inH) - { - } - _inline void Add(RectI rcAdd) - { - int x2 = x + w; - int y2 = y + h; - int x22 = rcAdd.x + rcAdd.w; - int y22 = rcAdd.y + rcAdd.h; - x = min(x, rcAdd.x); - y = min(y, rcAdd.y); - x2 = max(x2, x22); - y2 = max(y2, y22); - w = x2 - x; - h = y2 - y; - } - _inline void Add(int inX, int inY, int inW, int inH) - { - Add(RectI(inX, inY, inW, inH)); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// struct Line -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -struct Line -{ - Vec3 pointonline; - Vec3 direction; //caution: the direction is important for any intersection test - - //default Line constructor (without initialisation) - inline Line(void) {} - inline Line(const Vec3& o, const Vec3& d) { pointonline = o; direction = d; } - inline void operator () (const Vec3& o, const Vec3& d) { pointonline = o; direction = d; } - - ~Line(void) {}; -}; - - - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -190,26 +66,18 @@ struct Ray /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -template -struct Lineseg_tpl +struct Lineseg { - Vec3_tpl start; - Vec3_tpl end; + Vec3_tpl start; + Vec3_tpl end; //default Lineseg constructor (without initialisation) - inline Lineseg_tpl(void) {} - inline Lineseg_tpl(const Vec3_tpl& s, const Vec3_tpl& e) { start = s; end = e; } - inline void operator () (const Vec3_tpl& s, const Vec3_tpl& e) { start = s; end = e; } + inline Lineseg(void) {} + inline Lineseg(const Vec3_tpl& s, const Vec3_tpl& e) { start = s; end = e; } - Vec3 GetPoint(F t) const {return t * end + (F(1.0) - t) * start; } - - ~Lineseg_tpl(void) {}; + ~Lineseg(void) {}; }; -typedef Lineseg_tpl Lineseg; -typedef Lineseg_tpl Linesegr; - - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -240,33 +108,6 @@ struct Triangle_tpl } }; - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// struct Cone -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -struct Cone -{ - Vec3 mTip; - Vec3 mDir; - Vec3 mBase; - - float mHeight; - float mBaseRadius; - - Cone() {} - Cone(const Vec3& tip, const Vec3& dir, float height, float baseRadius) - : mTip(tip) - , mDir(dir) - , mBase(tip + dir * height) - , mHeight(height) - , mBaseRadius(baseRadius) {} -}; - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -343,12 +184,6 @@ struct AABB ILINE float GetRadius() const { return IsResetSel(0.0f, (max - min).GetLengthFloat() * 0.5f); } - ILINE float GetRadiusSqr() const - { return IsResetSel(0.0f, ((max - min) * 0.5f).GetLengthSquaredFloat()); } - - ILINE float GetVolume() const - { return IsResetSel(0.0f, (max.x - min.x) * (max.y - min.y) * (max.z - min.z)); } - ILINE void Add(const Vec3& v) { min.CheckMin(v); @@ -368,133 +203,6 @@ struct AABB max.CheckMax(bb.max); } - inline void Move(const Vec3& v) - { - const float moveMult = IsResetSel(0.0f, 1.0f); - const Vec3 vMove = v * moveMult; - min += vMove; - max += vMove; - } - - inline void Expand(Vec3 const& v) - { - if (!IsReset()) - { - min -= v; - max += v; - } - } - - // Augment the box on all sides by a box. - inline void Augment(AABB const& bb) - { - if (!IsReset() && !bb.IsReset()) - { - Add(min + bb.min); - Add(max + bb.max); - } - } - - void ClipToBox(AABB const& bb) - { - min.CheckMax(bb.min); - max.CheckMin(bb.max); - } - - void ClipMoveToBox(AABB const& bb) - { - for (int a = 0; a < 3; a++) - { - if (max[a] - min[a] > bb.max[a] - bb.min[a]) - { - min[a] = bb.min[a]; - max[a] = bb.max[a]; - } - else if (min[a] < bb.min[a]) - { - max[a] += bb.min[a] - min[a]; - min[a] = bb.min[a]; - } - else if (max[a] > bb.max[a]) - { - min[a] += bb.max[a] - max[a]; - max[a] = bb.max[a]; - } - } - } - - //! Check if this bounding box overlap with bounding box of sphere. - bool IsOverlapSphereBounds(const Vec3& pos, float radius) const - { - assert(min.IsValid()); - assert(max.IsValid()); - assert(pos.IsValid()); - - if (pos.x > min.x && pos.x < max.x && pos.y > min.y && pos.y < max.y && pos.z > min.z && pos.z < max.z) - { - return true; - } - - if (pos.x + radius < min.x) - { - return false; - } - if (pos.y + radius < min.y) - { - return false; - } - if (pos.z + radius < min.z) - { - return false; - } - if (pos.x - radius > max.x) - { - return false; - } - if (pos.y - radius > max.y) - { - return false; - } - if (pos.z - radius > max.z) - { - return false; - } - return true; - } - - //! Check if this bounding box contain sphere within itself. - bool IsContainSphere(const Vec3& pos, float radius) const - { - assert(min.IsValid()); - assert(max.IsValid()); - assert(pos.IsValid()); - if (pos.x - radius < min.x) - { - return false; - } - if (pos.y - radius < min.y) - { - return false; - } - if (pos.z - radius < min.z) - { - return false; - } - if (pos.x + radius > max.x) - { - return false; - } - if (pos.y + radius > max.y) - { - return false; - } - if (pos.z + radius > max.z) - { - return false; - } - return true; - } - //! Check if this bounding box contains a point within itself. bool IsContainPoint(const Vec3& pos) const { @@ -541,27 +249,6 @@ struct AABB return sqrt(GetDistanceSqr(v)); } - bool ContainsBox(AABB const& b) const - { - assert(min.IsValid()); - assert(max.IsValid()); - assert(b.min.IsValid()); - assert(b.max.IsValid()); - return min.x <= b.min.x && min.y <= b.min.y && min.z <= b.min.z - && max.x >= b.max.x && max.y >= b.max.y && max.z >= b.max.z; - } - - bool ContainsBox2D(AABB const& b) const - { - assert(min.IsValid()); - assert(max.IsValid()); - assert(b.min.IsValid()); - assert(b.max.IsValid()); - return min.x <= b.min.x && min.y <= b.min.y - && max.x >= b.max.x && max.y >= b.max.y; - } - - // Check two bounding boxes for intersection. inline bool IsIntersectBox(const AABB& b) const { @@ -622,86 +309,6 @@ struct AABB max = pos + sz; } } - ILINE static AABB CreateTransformedAABB(const Matrix34& m34, const AABB& aabb) - { AABB taabb; taabb.SetTransformedAABB(m34, aabb); return taabb; } - - - - ILINE void SetTransformedAABB(const QuatT& qt, const AABB& aabb) - { - if (aabb.IsReset()) - { - Reset(); - } - else - { - Matrix33 m33 = Matrix33(qt.q); - m33.m00 = fabs_tpl(m33.m00); - m33.m01 = fabs_tpl(m33.m01); - m33.m02 = fabs_tpl(m33.m02); - m33.m10 = fabs_tpl(m33.m10); - m33.m11 = fabs_tpl(m33.m11); - m33.m12 = fabs_tpl(m33.m12); - m33.m20 = fabs_tpl(m33.m20); - m33.m21 = fabs_tpl(m33.m21); - m33.m22 = fabs_tpl(m33.m22); - Vec3 sz = m33 * ((aabb.max - aabb.min) * 0.5f); - Vec3 pos = qt * ((aabb.max + aabb.min) * 0.5f); - min = pos - sz; - max = pos + sz; - } - } - ILINE static AABB CreateTransformedAABB(const QuatT& qt, const AABB& aabb) - { AABB taabb; taabb.SetTransformedAABB(qt, aabb); return taabb; } - - - //create an AABB using just the extensions of the OBB and ignore the orientation. - template - ILINE void SetAABBfromOBB(const OBB_tpl& obb) - { min = obb.c - obb.h; max = obb.c + obb.h; } - template - ILINE static AABB CreateAABBfromOBB(const OBB_tpl& obb) - { return AABB(obb.c - obb.h, obb.c + obb.h); } - - /*! - * converts an OBB into an tight fitting AABB - * - * Example: - * AABB aabb = AABB::CreateAABBfromOBB(wposition,obb,1.0f); - * - * return values: - * expanded AABB in world-space - */ - template - ILINE void SetAABBfromOBB(const Vec3& wpos, const OBB_tpl& obb, f32 scaling = 1.0f) - { - Vec3 pos = obb.m33 * obb.c * scaling + wpos; - Vec3 sz = obb.m33.GetFabs() * obb.h * scaling; - min = pos - sz; - max = pos + sz; - } - template - ILINE static AABB CreateAABBfromOBB(const Vec3& wpos, const OBB_tpl& obb, f32 scaling = 1.0f) - { AABB taabb; taabb.SetAABBfromOBB(wpos, obb, scaling); return taabb; } - - /* Converts a Cone into a tight fitting AABB */ - ILINE static AABB CreateAABBfromCone(const Cone& c) - { - // Construct AABB for cone base - Vec3 baseX = Vec3(1.f - c.mDir.x * c.mDir.x, c.mDir.x * c.mDir.y, c.mDir.x * c.mDir.z).GetNormalized() * c.mBaseRadius; - Vec3 baseY = Vec3(c.mDir.y * c.mDir.x, 1.f - c.mDir.y * c.mDir.y, c.mDir.y * c.mDir.z).GetNormalized() * c.mBaseRadius; - Vec3 baseZ = Vec3(c.mDir.z * c.mDir.x, c.mDir.z * c.mDir.y, 1.f - c.mDir.z * c.mDir.z).GetNormalized() * c.mBaseRadius; - - Vec3 aabbMax = Vec3(baseX.x, baseY.y, baseZ.z).abs(); - Vec3 aabbMin = -aabbMax; - - AABB result(aabbMin, aabbMax); - result.Move(c.mBase); - - // add tip - result.Add(c.mTip); - return result; - } }; ILINE bool IsEquivalent(const AABB& a, const AABB& b, float epsilon = VEC_EPSILON) @@ -710,9 +317,6 @@ ILINE bool IsEquivalent(const AABB& a, const AABB& b, float epsilon = VEC_EPSILO } - - - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -752,6 +356,7 @@ struct OBB_tpl ~OBB_tpl(void) {}; }; +typedef OBB_tpl OBB; @@ -774,392 +379,4 @@ struct Sphere void operator()(const Vec3& c, float r) { center = c; radius = r; } }; -struct HWVSphere -{ - hwvec3 center; - simdf radius; - - ILINE HWVSphere(const hwvec3& c, const simdf& r) - { - center = c; - radius = r; - } - - ILINE HWVSphere(const ::Sphere& sp) - { - center = HWVLoadVecUnaligned(&sp.center); - radius = SIMDFLoadFloat(sp.radius); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// struct AAEllipsoid -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -struct AAEllipsoid -{ - Vec3 center; - Vec3 radius_vec; - - //default AAEllipsoid constructor (without initialisation) - inline AAEllipsoid(void) {} - inline AAEllipsoid(const Vec3& c, const Vec3& rv) { radius_vec = rv; center = c; } - inline void operator () (const Vec3& c, const Vec3& rv) { radius_vec = rv; center = c; } - - ~AAEllipsoid(void) {}; -}; - - - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// struct Ellipsoid -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -struct Ellipsoid -{ - Matrix34 ExtensionPos; - - //default Ellipsoid constructor (without initialisation) - inline Ellipsoid(void) {} - inline Ellipsoid(const Matrix34& ep) { ExtensionPos = ep; } - inline void operator () (const Matrix34& ep) { ExtensionPos = ep; } - - ~Ellipsoid(void) {}; -}; - -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// struct TRect -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// - -template -struct TRect_tpl -{ - typedef Vec2_tpl Vec; - - Vec Min, Max; - - inline TRect_tpl() {} - inline TRect_tpl(Num x1, Num y1, Num x2, Num y2) - : Min(x1, y1) - , Max(x2, y2) {} - inline TRect_tpl(const TRect_tpl& rc) - : Min(rc.Min) - , Max(rc.Max) {} - inline TRect_tpl(const Vec& min, const Vec& max) - : Min(min) - , Max(max) {} - - inline TRect_tpl operator * (Num k) const - { - return TRect_tpl(Min.x * k, Min.y * k, Max.x * k, Max.y * k); - } - inline TRect_tpl operator / (Num k) const - { - return TRect_tpl(Min.x / k, Min.y / k, Max.x / k, Max.y / k); - } - - inline bool IsEmpty() const { return Max.x < Min.x && Max.y < Min.y; } - inline TRect_tpl& SetEmpty() { Max = Vec(-1, -1); Min = Vec(0, 0); return *this; } - - inline Vec GetDim() const { return Max - Min; } - inline Num GetWidth() const { return Max.x - Min.x; } - inline Num GetHeight() const { return Max.y - Min.y; } - - inline bool IsEqual(const TRect_tpl& rc) const { return Min.x == rc.Min.x && Min.y == rc.Min.y && Max.x == rc.Max.x && Max.y == rc.Max.y; } - - inline bool InRect(const TRect_tpl& rc) const { return rc.Min.x >= Min.x && rc.Max.x <= Max.x && rc.Min.y >= Min.y && rc.Max.y <= Max.y; } - inline bool InRect(Vec pt) const { return pt.x >= Min.x && pt.x <= Max.x && pt.y >= Min.y && pt.y <= Max.y; } - inline Vec& IntoRect(Vec& pt) const - { - if (pt.x < Min.x) - { - pt.x = Min.x; - } - else if (pt.x > Max.x) - { - pt.x = Max.x; - } - if (pt.y < Min.y) - { - pt.y = Min.y; - } - else if (pt.y > Max.y) - { - pt.y = Max.y; - } - return pt; - } - - inline bool Intersects(const TRect_tpl& rc) const - { - return !IsEmpty() && !rc.IsEmpty() && - !(Min.x > rc.Max.x || Max.x < rc.Min.x || - Min.y > rc.Max.y || Max.y < rc.Min.y); - } - - inline TRect_tpl& DoUnite(const TRect_tpl& rc) - { - if (IsEmpty()) - { - Min = rc.Min; - Max = rc.Max; - return *this; - } - if (rc.IsEmpty()) - { - return *this; - } - if (Min.x > rc.Min.x) - { - Min.x = rc.Min.x; - } - if (Min.y > rc.Min.y) - { - Min.y = rc.Min.y; - } - if (Max.x < rc.Max.x) - { - Max.x = rc.Max.x; - } - if (Max.y < rc.Max.y) - { - Max.y = rc.Max.y; - } - return *this; - } - - inline TRect_tpl& DoIntersect(const TRect_tpl& rc) - { - if (IsEmpty()) - { - return *this; - } - if (rc.IsEmpty()) - { - return SetEmpty(); - } - if (Min.x < rc.Min.x) - { - Min.x = rc.Min.x; - } - if (Min.y < rc.Min.y) - { - Min.y = rc.Min.y; - } - if (Max.x > rc.Max.x) - { - Max.x = rc.Max.x; - } - if (Max.y > rc.Max.y) - { - Max.y = rc.Max.y; - } - - if (Min.x == Max.x || Min.y == Max.y) - { - return SetEmpty(); - } - - return *this; - } - - inline TRect_tpl GetSubRect(const TRect_tpl& rc) const - { - if (IsEmpty()) - { - return *this; - } - if (rc.IsEmpty()) - { - return rc; - } - return TRect_tpl(Min.x + rc.Min.x * GetWidth(), - Min.y + rc.Min.y * GetHeight(), - Min.x + rc.Max.x * GetWidth(), - Min.y + rc.Max.y * GetHeight()); - } - - inline TRect_tpl GetSubRectInv(const TRect_tpl& rcSub) const - { - if (IsEmpty()) - { - return *this; - } - if (rcSub.IsEmpty()) - { - return rcSub; - } - return TRect_tpl((rcSub.Min.x - Min.x) / GetWidth(), - (rcSub.Min.y - Min.y) / GetHeight(), - (rcSub.Max.x - Min.x) / GetWidth(), - (rcSub.Max.y - Min.y) / GetHeight()); - } -}; - -typedef TRect_tpl Rectf; -typedef TRect_tpl Recti; - typedef Triangle_tpl Triangle; -typedef Triangle_tpl Triangle_f64; -typedef OBB_tpl OBB; - -////////////////////////////////////////////////////////////////////////// -// Manage linear and rotational 3D velocity in a class -class Velocity3 -{ -public: - Vec3 vLin, vRot; - - Velocity3() - {} - Velocity3(type_zero) - : vLin(ZERO) - , vRot(ZERO) {} - Velocity3(Vec3 const& lin) - : vLin(lin) - , vRot(ZERO) {} - Velocity3(Vec3 const& lin, Vec3 const& rot) - : vLin(lin) - , vRot(rot) {} - - void FromDelta(QuatT const& loc0, QuatT const& loc1, float fTime) - { - float fInvT = 1.f / fTime; - vLin = (loc1.t - loc0.t) * fInvT; - vRot = Quat::log(loc1.q * loc0.q.GetInverted()) * fInvT; - } - - Vec3 VelocityAt(Vec3 const& vPosRel) const - { return vLin + (vRot % vPosRel); } - - void operator += (Velocity3 const& vv) - { - vLin += vv.vLin; - vRot += vv.vRot; - } - void operator *= (float f) - { - vLin *= f; - vRot *= f; - } - void Interp(Velocity3 const& vv, float f) - { - vLin += (vv.vLin - vLin) * f; - vRot += (vv.vRot - vRot) * f; - } -}; - -///////////////////////////////////////////////////////////////////////// -//this is some special engine stuff, should be moved to a better location -///////////////////////////////////////////////////////////////////////// - -// for bbox's checks and calculations -#define MAX_BB +99999.0f -#define MIN_BB -99999.0f - -//! checks if this has been set to minBB -inline bool IsMinBB(const Vec3& v) -{ - if (v.x <= MIN_BB) - { - return (true); - } - if (v.y <= MIN_BB) - { - return (true); - } - if (v.z <= MIN_BB) - { - return (true); - } - return (false); -} - -//! checks if this has been set to maxBB -inline bool IsMaxBB(const Vec3& v) -{ - if (v.x >= MAX_BB) - { - return (true); - } - if (v.y >= MAX_BB) - { - return (true); - } - if (v.z >= MAX_BB) - { - return (true); - } - return (false); -} - -inline Vec3 SetMaxBB(void) { return Vec3(MAX_BB, MAX_BB, MAX_BB); } -inline Vec3 SetMinBB(void) { return Vec3(MIN_BB, MIN_BB, MIN_BB); } - -inline void AddToBounds (const Vec3& v, Vec3& mins, Vec3& maxs) -{ - if (v.x < mins.x) - { - mins.x = v.x; - } - if (v.x > maxs.x) - { - maxs.x = v.x; - } - if (v.y < mins.y) - { - mins.y = v.y; - } - if (v.y > maxs.y) - { - maxs.y = v.y; - } - if (v.z < mins.z) - { - mins.z = v.z; - } - if (v.z > maxs.z) - { - maxs.z = v.z; - } -} - - -//////////////////////////////////////////////////////////////// -//! calc the area of a polygon giving a list of vertices and normal -inline float CalcArea(const Vec3* vertices, int numvertices, const Vec3& normal) -{ - Vec3 csum(0, 0, 0); - - int n = numvertices; - for (int i = 0, j = 1; i <= n - 2; i++, j++) - { - csum.x += vertices[i].y * vertices[j].z - vertices[i].z * vertices[j].y; - csum.y += vertices[i].z * vertices[j].x - vertices[i].x * vertices[j].z; - csum.z += vertices[i].x * vertices[j].y - vertices[i].y * vertices[j].x; - } - - csum.x += vertices[n - 1].y * vertices[0].z - vertices[n - 1].z * vertices[0].y; - csum.y += vertices[n - 1].z * vertices[0].x - vertices[n - 1].x * vertices[0].z; - csum.z += vertices[n - 1].x * vertices[0].y - vertices[n - 1].y * vertices[0].x; - - float area = 0.5f * (float)fabs(normal | csum); - return (area); -} - - - -#endif // CRYINCLUDE_CRYCOMMON_CRY_GEO_H diff --git a/Code/Legacy/CryCommon/Cry_HWMatrix.h b/Code/Legacy/CryCommon/Cry_HWMatrix.h deleted file mode 100644 index 853dbcc2c2..0000000000 --- a/Code/Legacy/CryCommon/Cry_HWMatrix.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Scalar implementation of hardware vector based matrix - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_HWMATRIX_H -#define CRYINCLUDE_CRYCOMMON_CRY_HWMATRIX_H -#pragma once - -struct hwmtx33 -{ - hwvec3 m0, m1, m2; -}; - -ILINE void HWMtx33LoadAligned(hwmtx33& out, const Matrix34A& inMtx) -{ - out.m0 = HWVLoadVecAligned(reinterpret_cast(&inMtx.m00)); - out.m1 = HWVLoadVecAligned(reinterpret_cast(&inMtx.m10)); - out.m2 = HWVLoadVecAligned(reinterpret_cast(&inMtx.m20)); -} - -ILINE hwvec3 HWMtx33RotateVec(const hwmtx33& m, const hwvec3& v) -{ - return Vec3((m.m0[0] * v.x) + (m.m0[1] * v.y) + (m.m0[2] * v.z), - (m.m1[0] * v.x) + (m.m1[1] * v.y) + (m.m1[2] * v.z), - (m.m2[0] * v.x) + (m.m2[1] * v.y) + (m.m2[2] * v.z)); -} - -ILINE hwvec3 HWMtx33RotateVecOpt(const hwmtx33& m, const hwvec3& v) -{ - return HWMtx33RotateVec(m, v); -} - -ILINE hwmtx33 HWMtx33CreateRotationV0V1(const hwvec3& v0, const hwvec3& v1) -{ - assert((fabs_tpl(1 - (v0 | v0))) < 0.01); //check if unit-vector - assert((fabs_tpl(1 - (v1 | v1))) < 0.01); //check if unit-vector - hwmtx33 m; - float dot = v0 | v1; - if (dot < -0.9999f) - { - Vec3 axis = v0.GetOrthogonal().GetNormalized(); - m.m0[0] = (2.0f * axis.x * axis.x - 1); - m.m0[1] = (2.0f * axis.x * axis.y); - m.m0[2] = (2.0f * axis.x * axis.z); - m.m1[0] = (2.0f * axis.y * axis.x); - m.m1[1] = (2.0f * axis.y * axis.y - 1); - m.m1[2] = (2.0f * axis.y * axis.z); - m.m2[0] = (2.0f * axis.z * axis.x); - m.m2[1] = (2.0f * axis.z * axis.y); - m.m2[2] = (2.0f * axis.z * axis.z - 1); - } - else - { - Vec3 v = v0 % v1; - f32 h = 1.0f / (1.0f + dot); - m.m0[0] = (dot + h * v.x * v.x); - m.m0[1] = (h * v.x * v.y - v.z); - m.m0[2] = (h * v.x * v.z + v.y); - m.m1[0] = (h * v.x * v.y + v.z); - m.m1[1] = (dot + h * v.y * v.y); - m.m1[2] = (h * v.y * v.z - v.x); - m.m2[0] = (h * v.x * v.z - v.y); - m.m2[1] = (h * v.y * v.z + v.x); - m.m2[2] = (dot + h * v.z * v.z); - } - - return m; -} - -//Returns a matrix optimized for this platform's matrix ops, in this case, not doing a thing; -ILINE hwmtx33 HWMtx33GetOptimized(const hwmtx33& m) -{ - return (hwmtx33)m; -} - -#endif // CRYINCLUDE_CRYCOMMON_CRY_HWMATRIX_H - diff --git a/Code/Legacy/CryCommon/Cry_HWVector3.h b/Code/Legacy/CryCommon/Cry_HWVector3.h deleted file mode 100644 index cf2beb9a01..0000000000 --- a/Code/Legacy/CryCommon/Cry_HWVector3.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description: Hardware vector class - scalar implementation - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_HWVECTOR3_H -#define CRYINCLUDE_CRYCOMMON_CRY_HWVECTOR3_H -#pragma once - - -#define HWV_PERMUTE_0X 0 -#define HWV_PERMUTE_0Y 1 -#define HWV_PERMUTE_0Z 2 -#define HWV_PERMUTE_0W 3 -#define HWV_PERMUTE_1X 4 -#define HWV_PERMUTE_1Y 5 -#define HWV_PERMUTE_1Z 6 -#define HWV_PERMUTE_1W 7 - -typedef Vec3 hwvec3; -typedef Vec4 hwvec4; -typedef float simdf; -typedef Vec4 hwvec4fconst; -typedef int hwvec4i[4]; - -#define HWV3Constant(name, f0, f1, f2) const Vec3 name(f0, f1, f2) -#define SIMDFConstant(name, f0) const simdf name = f0 -#define HWV4PermuteControl(name, i0, i1, i2, i3) static const hwvec4i name = {i0, i1, i2, i3}; -#define SIMDFAsVec3(a) (hwvec3)a -#define HWV3AsSIMDF(a) (simdf)a.x - -ILINE hwvec3 HWVLoadVecUnaligned(const Vec3* pLoadFrom) -{ - return *pLoadFrom; -} - -ILINE hwvec3 HWVLoadVecAligned(const Vec4A* pLoadFrom) -{ - return Vec3(pLoadFrom->x, pLoadFrom->y, pLoadFrom->z); -} - -ILINE void HWVSaveVecUnaligned(Vec3* pSaveTo, const hwvec3& pLoadFrom) -{ - *pSaveTo = pLoadFrom; -} - -ILINE void HWVSaveVecAligned(Vec4* pSaveTo, const hwvec4& pLoadFrom) -{ - *pSaveTo = pLoadFrom; -} - -ILINE hwvec3 HWVAdd(const hwvec3& a, const hwvec3& b) -{ - return hwvec3(a.x + b.x, a.y + b.y, a.z + b.z); -} - -ILINE hwvec3 HWVMultiply(const hwvec3& a, const hwvec3& b) -{ - return hwvec3(a.x * b.x, a.y * b.y, a.z * b.z); -} - -ILINE hwvec3 HWVMultiplySIMDF(const hwvec3& a, const simdf& b) -{ - return hwvec3(a.x * b, a.y * b, a.z * b); -} - -ILINE hwvec3 HWVMultiplyAdd(const hwvec3& a, const hwvec3& b, const hwvec3& c) -{ - return hwvec3((a.x * b.x) + c.x, (a.y * b.y) + c.y, (a.z * b.z) + c.z); -} - -ILINE hwvec3 HWVMultiplySIMDFAdd(const hwvec3& a, const simdf& b, const hwvec3& c) -{ - return hwvec3((a.x * b) + c.x, (a.y * b) + c.y, (a.z * b) + c.z); -} - -ILINE hwvec3 HWVSub(const hwvec3& a, const hwvec3& b) -{ - return (a - b); -} - -ILINE hwvec3 HWVCross(const hwvec3& a, const hwvec3& b) -{ - return hwvec3((a.y * b.z) - (a.z * b.y) - , (a.z * b.x) - (a.x * b.z) - , (a.x * b.y) - (a.y * b.x)); -} - -ILINE simdf HWV3Dot(const hwvec3& a, const hwvec3& b) -{ - return (a.x * b.x) + (a.y * b.y) + (a.z * b.z); -} - -ILINE hwvec3 HWVMax(const hwvec3& a, const hwvec3& b) -{ - return Vec3(a.x > b.x ? a.x : b.x, - a.y > b.y ? a.y : b.y, - a.z > b.z ? a.z : b.z); -} - -ILINE hwvec3 HWVMin(const hwvec3& a, const hwvec3& b) -{ - return Vec3(a.x < b.x ? a.x : b.x, - a.y < b.y ? a.y : b.y, - a.z < b.z ? a.z : b.z); -} - -ILINE hwvec3 HWVClamp(const hwvec3& a, const hwvec3& min, const hwvec3& max) -{ - return HWVMax(min, HWVMin(a, max)); -} - -ILINE hwvec3 HWV3Normalize(const hwvec3& a) -{ - float fInvLen = isqrt_safe_tpl((a.x * a.x) + (a.y * a.y) + (a.z * a.z)); - return Vec3(a.x * fInvLen, a.y * fInvLen, a.z * fInvLen); -} - -ILINE hwvec3 HWVGetOrthogonal(const hwvec3& a) -{ - hwvec3 result = a; - - //int i = isneg(square(0.9f)*a.GetLengthSquared()-(a.x*a.x)); - int i = isneg(square(0.9f) * a.GetLengthSquared() - a.x * a.x); - result[i] = 0; - result[incm3(i)] = a[decm3(i)]; - result[decm3(i)] = -a[incm3(i)]; - return result; -} - -ILINE simdf HWV3SplatXToSIMDF(const hwvec3& a) -{ - return a.x; -} - -ILINE simdf HWV3SplatYToSIMDF(const hwvec3& a) -{ - return a.y; -} - -ILINE hwvec3 HWV3PermuteWord(const hwvec3& a, const hwvec3& b, const hwvec4i& p) -{ - hwvec3 selection[2] = {a, b}; - float* fSelection = (float*)selection; - return Vec3(fSelection[p[0]], fSelection[p[1]], fSelection[p[2]]); -} - -ILINE hwvec3 HWV3Zero() -{ - return Vec3(0.0f, 0.0f, 0.0f); -} - -ILINE hwvec4 HWV4Zero() -{ - return Vec4(0.0f, 0.0f, 0.0f, 0.0f); -} - - -ILINE hwvec3 HWV3Negate(const hwvec3& a) -{ - return Vec3(-a.x, -a.y, -a.z); -} - -ILINE hwvec3 HWVSelect(const hwvec3& a, const hwvec3& b, const hwvec3& control) -{ - return Vec3(control[0] > 0.0f ? b[0] : a[0], - control[1] > 0.0f ? b[1] : a[1], - control[2] > 0.0f ? b[2] : a[2]); -} - -ILINE hwvec3 HWVSelectSIMDF(const hwvec3& a, const hwvec3& b, const bool& control) -{ - return control ? b : a; -} - -ILINE simdf HWV3LengthSq(const hwvec3& a) -{ - return a.len2(); -} - - -////////////////////////////////////////////////// -//SIMDF functions for float stored in HWVEC4 data -////////////////////////////////////////////////// - -ILINE simdf SIMDFLoadFloat(const float& f) -{ - return f; -} - -ILINE void SIMDFSaveFloat(float* f, const simdf& a) -{ - *f = a; -} - -ILINE bool SIMDFGreaterThan(const simdf& a, const simdf& b) -{ - return (a > b); -} - -ILINE bool SIMDFLessThanEqualB(const simdf& a, const simdf& b) -{ - return (a <= b); -} - -ILINE bool SIMDFLessThanEqual(const simdf& a, const simdf& b) -{ - return (a <= b); -} - -ILINE bool SIMDFLessThanB(const simdf& a, const simdf& b) -{ - return (a < b); -} - -ILINE bool SIMDFLessThan(const simdf& a, const simdf& b) -{ - return (a < b); -} - -ILINE simdf SIMDFAdd(const simdf& a, const simdf& b) -{ - return a + b; -} - -ILINE simdf SIMDFMult(const simdf& a, const simdf& b) -{ - return a * b; -} - -ILINE simdf SIMDFReciprocal(const simdf& a) -{ - return 1.0f / a; -} - -ILINE simdf SIMDFSqrt(const simdf& a) -{ - return sqrt_tpl(a); -} - -ILINE simdf SIMDFSqrtEst(const simdf& a) -{ - return sqrt_tpl(a); -} - -ILINE simdf SIMDFSqrtEstFast(const simdf& a) -{ - return sqrt_tpl(a); -} - -ILINE simdf SIMDFMax(const simdf& a, const simdf& b) -{ - return max(a, b); -} - -ILINE simdf SIMDFMin(const simdf& a, const simdf& b) -{ - return min(a, b); -} - -ILINE simdf SIMDFClamp(const simdf& a, const simdf& min, const simdf& max) -{ - return clamp_tpl(a, min, max); -} - -ILINE simdf SIMDFAbs(const simdf& a) -{ - return fabsf(a); -} - -#endif // CRYINCLUDE_CRYCOMMON_CRY_HWVECTOR3_H diff --git a/Code/Legacy/CryCommon/Cry_Math.h b/Code/Legacy/CryCommon/Cry_Math.h index 74a18e8910..a96b83a1bf 100644 --- a/Code/Legacy/CryCommon/Cry_Math.h +++ b/Code/Legacy/CryCommon/Cry_Math.h @@ -8,8 +8,6 @@ // Description : Common math class - - #pragma once //======================================================================================== @@ -18,7 +16,6 @@ #include "Cry_ValidNumber.h" #include // eLittleEndian #include -//#include #include /////////////////////////////////////////////////////////////////////////////// // Forward declarations // @@ -27,8 +24,7 @@ template struct Vec2_tpl; template struct Vec3_tpl; -template -struct Vec4_tpl; +struct Vec4; template struct Ang3_tpl; @@ -38,14 +34,6 @@ template struct AngleAxis_tpl; template struct Quat_tpl; -template -struct QuatT_tpl; -template -struct DualQuat_tpl; -template -struct QuatTS_tpl; -template -struct QuatTNS_tpl; template struct Diag33_tpl; @@ -94,14 +82,8 @@ const f32 gf_halfPI = f32(1.57079632679489661923132169163975144209858469968755); #define TANGENT30_2 0.57735026918962576450914878050196f * 2 // 2*tan(30) #define LN2 0.69314718055994530941723212145818f // ln(2) - - - - ILINE f32 fsel(const f32 _a, const f32 _b, const f32 _c) { return (_a < 0.0f) ? _c : _b; } ILINE f64 fsel(const f64 _a, const f64 _b, const f64 _c) { return (_a < 0.0f) ? _c : _b; } -ILINE f32 fself(const f32 _a, const f32 _b, const f32 _c) { return (_a < 0.0f) ? _c : _b; } -ILINE f32 fsels(const f32 _a, const f32 _b, const f32 _c) { return (_a < 0.0f) ? _c : _b; } ILINE f32 fres(const f32 _a) { return 1.f / _a; } template ILINE T isel(int c, T a, T b) { return (c < 0) ? b : a; } @@ -319,13 +301,6 @@ ILINE int64 pos_round(f64 f) { return int64(f + 0.5); } ILINE int32 int_ceil(f32 f) { int32 i = int32(f); return (f > f32(i)) ? i + 1 : i; } ILINE int64 int_ceil(f64 f) { int64 i = int64(f); return (f > f64(i)) ? i + 1 : i; } -ILINE float ufrac8_to_float(float u) { return u * (1.f / 255.f); } -ILINE float ifrac8_to_float(float i) { return i * (1.f / 127.f); } -ILINE uint8 float_to_ufrac8(float f) { int i = pos_round(f * 255.f); assert(i >= 0 && i < 256); return uint8(i); } -ILINE int8 float_to_ifrac8(float f) { int i = int_round(f * 127.f); assert(abs(i) <= 127); return int8(i); } - - - template ILINE F sqr(const F& op) { return op * op; } template @@ -490,11 +465,8 @@ ILINE int64 iszero(long int x) { return -(x >> 63 ^ (x - 1) >> 63); } #endif ILINE float if_neg_else(float test, float val_neg, float val_nonneg) { return (float)fsel(test, val_nonneg, val_neg); } -ILINE float if_pos_else(float test, float val_pos, float val_nonpos) { return (float)fsel(-test, val_nonpos, val_pos); } template ILINE int32 inrange(F x, F end1, F end2) { return isneg(fabs_tpl(end1 + end2 - x * (F)2) - fabs_tpl(end1 - end2)); } -template -ILINE F cond_select(int32 bFirst, F op1, F op2) { F arg[2] = { op1, op2 }; return arg[bFirst ^ 1]; } template ILINE int32 idxmax3(const F* pdata) @@ -510,56 +482,6 @@ ILINE int32 idxmax3(const Vec3_tpl& vec) imax |= isneg(vec[imax] - vec.z) << 1; return imax & (2 | (imax >> 1 ^ 1)); } -template -ILINE int32 idxmin3(const F* pdata) -{ - int32 imin = isneg(pdata[1] - pdata[0]); - imin |= isneg(pdata[2] - pdata[imin]) << 1; - return imin & (2 | (imin >> 1 ^ 1)); -} -template -ILINE int32 idxmin3(const Vec3_tpl& vec) -{ - int32 imin = isneg(vec.y - vec.x); - imin |= isneg(vec.z - vec[imin]) << 1; - return imin & (2 | (imin >> 1 ^ 1)); -} -// Approximation of exp(-x) -ILINE float approxExp(float x) { return fres(1.f + x); } -// Approximation of 1.f - exp(-x) -ILINE float approxOneExp(float x) { return x * fres(1.f + x); } - - -ILINE int ilog2(uint64 x) // if x==1<> 23) - 127; -#endif -} - static int32 inc_mod3[] = {1, 2, 0}, dec_mod3[] = {2, 0, 1}; #ifdef PHYSICS_EXPORTS @@ -596,114 +518,6 @@ enum type_identity #include "Cry_Matrix34.h" #include "Cry_Matrix44.h" #include "Cry_Quat.h" -#include "Cry_HWVector3.h" -#include "Cry_HWMatrix.h" - -////////////////////////////////////////////////////////////////////////// - -/// This function relaxes a value (val) towards a desired value (to) whilst maintaining continuity -/// of val and its rate of change (valRate). timeDelta is the time between this call and the previous one. -/// The caller would normally keep val and valRate as working variables, and smoothTime is normally -/// a fixed parameter. The to/timeDelta values can change. -/// -/// Implementation details: -/// -/// This is a critically damped spring system. A linear spring is attached between "val" and "to" that -/// drags "val" to "to". At the same time a damper between the two removes oscillations; it's tweaked -/// so it doesn't dampen more than necessary. In combination this gives smooth ease-in and ease-out behavior. -/// -/// smoothTime can be interpreted in a couple of ways: -/// - it's the "expected time to reach the target when at maximum velocity" (the target will, however, not be reached -/// in that time because the speed will decrease the closer it gets to the target) -/// - it's the 'lag time', how many seconds "val" lags behind "to". If your -/// target has a certain speed, the lag distance is simply the smoothTime times that speed. -/// - it's 2/omega, where omega is the spring's natural frequency (or less formally a measure of the spring stiffness) -/// -/// The implementation is stable for varying timeDelta, but for performance reasons it uses a polynomial approximation -/// to the exponential function. The approximation works well (within 0.1% of accuracy) when smoothTime > 2*deltaTime, -/// which is usually the case. (but it might be troublesome when you want a stiff spring or have frame hikes!) -/// The implementation handles cases where smoothTime==0 separately and reliably. In that case the target will be -/// reached immediately, and valRate is updated appropriately. -/// -/// Based on "Critically Damped Ease-In/Ease-Out Smoothing", Thomas Lowe, Game Programming Gems IV -/// - - -template -ILINE void SmoothCD( - T& val, ///< in/out: value to be smoothed - T& valRate, ///< in/out: rate of change of the value - const float timeDelta, ///< in: time interval - const T& to, ///< in: the target value - const float smoothTime) ///< in: timescale for smoothing -{ - if (smoothTime > 0.0f) - { - const float omega = 2.0f / smoothTime; - const float x = omega * timeDelta; - const float exp = 1.0f / (1.0f + x + 0.48f * x * x + 0.235f * x * x * x); - const T change = (val - to); - const T temp = (T)((valRate + change * omega) * timeDelta); - valRate = (T)((valRate - temp * omega) * exp); - val = (T)(to + (change + temp) * exp); - } - else if (timeDelta > 0.0f) - { - valRate = (T)((to - val) / timeDelta); - val = to; - } - else - { - val = to; - T zeroizeAmount = valRate; - valRate -= zeroizeAmount; // zero it... - } -} - - -template -ILINE void SmoothCDWithMaxRate( - T& val, ///< in/out: value to be smoothed - T& valRate, ///< in/out: rate of change of the value - const float timeDelta, ///< in: time interval - const T& to, ///< in: the target value - const float smoothTime, ///< in: timescale for smoothing - const T& maxValRate) ///< in: maximum allowed rate of change -{ - if (smoothTime > 0.0f) - { - const float omega = 2.0f / smoothTime; - const float x = omega * timeDelta; - const float exp = 1.0f / (1.0f + x + 0.48f * x * x + 0.235f * x * x * x); - const T unclampedChange = val - to; - const T maxChange = maxValRate * smoothTime; - const T clampedChange = clamp_tpl(unclampedChange, -maxChange, maxChange); - const T clampedTo = val - clampedChange; - const T temp = (T)((valRate + clampedChange * omega) * timeDelta); - valRate = (T)((valRate - temp * omega) * exp); - val = (T)(clampedTo + (clampedChange + temp) * exp); - } - else if (timeDelta > 0.0f) - { - const T unclampedRate = (T)((to - val) / timeDelta); - valRate = clamp_tpl(unclampedRate, -maxValRate, maxValRate); - val += valRate * timeDelta; - } - else - { - val = to; - T zeroizeAmount = valRate; - valRate -= zeroizeAmount; // zero it... - } -} - -// Smoothes linear blending into cubic (b-spline) with 0-derivatives -// near 0 and 1 -inline f32 SmoothBlendValue (const f32 fBlend) -{ - const f32 fBlendAdj = fBlend - 0.5f; - return (f32)fsel(-fBlend, 0.f, fsel(fBlend - 1.f, 1.f, 0.5f - 2.f * (fBlendAdj * fBlendAdj * fBlendAdj) + 1.5f * fBlendAdj)); -} // function for safe comparsion of floating point values ILINE bool fcmp(f32 fA, f32 fB, f32 fEpsilon = FLT_EPSILON) diff --git a/Code/Legacy/CryCommon/Cry_Matrix33.h b/Code/Legacy/CryCommon/Cry_Matrix33.h index 9e0b12fafa..74004c15e0 100644 --- a/Code/Legacy/CryCommon/Cry_Matrix33.h +++ b/Code/Legacy/CryCommon/Cry_Matrix33.h @@ -8,10 +8,6 @@ // Description : Common matrix class - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_MATRIX33_H -#define CRYINCLUDE_CRYCOMMON_CRY_MATRIX33_H #pragma once @@ -64,7 +60,6 @@ struct Matrix33_tpl #else ILINE Matrix33_tpl(){}; #endif - //set matrix to Identity ILINE Matrix33_tpl(type_identity) { @@ -78,21 +73,6 @@ struct Matrix33_tpl m21 = 0; m22 = 1; } - //set matrix to Zero - ILINE Matrix33_tpl(type_zero) - { - m00 = 0; - m01 = 0; - m02 = 0; - m10 = 0; - m11 = 0; - m12 = 0; - m20 = 0; - m21 = 0; - m22 = 0; - } - - //ASSIGNMENT OPERATOR of identical Matrix33 types. //The assignment operator has precedence over assignment constructor //Matrix33 m; m=m33; @@ -118,7 +98,7 @@ struct Matrix33_tpl //CONSTRUCTOR for identical float-types. It initializes a Matrix33 with 9 floats. //Matrix33(0,1,2, 3,4,5, 6,7,8); - explicit ILINE Matrix33_tpl(F x00, F x01, F x02, F x10, F x11, F x12, F x20, F x21, F x22) + explicit ILINE Matrix33_tpl(F x00, F x01, F x02, F x10, F x11, F x12, F x20, F x21, F x22) { m00 = x00; m01 = x01; @@ -130,26 +110,11 @@ struct Matrix33_tpl m21 = x21; m22 = x22; } - //CONSTRUCTOR for different float-types. It initializes a Matrix33 with 9 floats. - //Matrix33(0.0,1.0,2.0, 3.0,4.0,5.0, 6.0,7.0,8.0); - template - explicit ILINE Matrix33_tpl(F1 x00, F1 x01, F1 x02, F1 x10, F1 x11, F1 x12, F1 x20, F1 x21, F1 x22) - { - m00 = F(x00); - m01 = F(x01); - m02 = F(x02); - m10 = F(x10); - m11 = F(x11); - m12 = F(x12); - m20 = F(x20); - m21 = F(x21); - m22 = F(x22); - } //CONSTRUCTOR for identical float-types. It initializes a Matrix33 with 3 vectors stored in the columns. //Matrix33(v0,v1,v2); - explicit ILINE Matrix33_tpl(const Vec3_tpl&vx, const Vec3_tpl&vy, const Vec3_tpl&vz) + explicit ILINE Matrix33_tpl(const Vec3_tpl&vx, const Vec3_tpl&vy, const Vec3_tpl&vz) { m00 = vx.x; m01 = vy.x; @@ -164,7 +129,7 @@ struct Matrix33_tpl //CONSTRUCTOR for different float-types. It initializes a Matrix33 with 3 vectors stored in the columns and converts between floats/doubles. //Matrix33r(v0,v1,v2); template - explicit ILINE Matrix33_tpl(const Vec3_tpl&vx, const Vec3_tpl&vy, const Vec3_tpl&vz) + explicit ILINE Matrix33_tpl(const Vec3_tpl&vx, const Vec3_tpl&vy, const Vec3_tpl&vz) { m00 = F(vx.x); m01 = F(vy.x); @@ -209,8 +174,6 @@ struct Matrix33_tpl m22 = F(m.m22); } - - //CONSTRUCTOR for identical float-types. It converts a Matrix34 into a Matrix33. //Needs to be 'explicit' because we loose the translation vector in the conversion process //Matrix33(m34); @@ -245,9 +208,6 @@ struct Matrix33_tpl m22 = F(m.m22); } - - - //CONSTRUCTOR for identical float-types. It converts a Matrix44 into a Matrix33. //Needs to be 'explicit' because we loose the translation vector and the 3rd row in the conversion process //Matrix33(m44); @@ -356,26 +316,6 @@ struct Matrix33_tpl SetRotationXYZ(Ang3_tpl(F(ang.x), F(ang.y), F(ang.z))); } - - - - //Bracket OPERATOR: initializes a Matrix33 with 9 floats. - //Matrix33 m; m(0,1,2, 3,4,5, 6,7,8); - ILINE void operator () (F x00, F x01, F x02, F x10, F x11, F x12, F x20, F x21, F x22) - { - m00 = x00; - m01 = x01; - m02 = x02; - m10 = x10; - m11 = x11; - m12 = x12; - m20 = x20; - m21 = x21; - m22 = x22; - assert(IsValid()); - } - - //--------------------------------------------------------------------------------------- ILINE void SetIdentity(void) @@ -391,27 +331,6 @@ struct Matrix33_tpl m22 = 1; } - ILINE static Matrix33_tpl CreateIdentity() - { - Matrix33_tpl m33; - m33.SetIdentity(); - return m33; - } - - ILINE void SetZero() - { - m00 = 0; - m01 = 0; - m02 = 0; - m10 = 0; - m11 = 0; - m12 = 0; - m20 = 0; - m21 = 0; - m22 = 0; - } - - /*! * Create a rotation matrix around an arbitrary axis (Eulers Theorem). * The axis is specified as a normalized Vec3. The angle is assumed to be in radians. @@ -597,7 +516,7 @@ struct Matrix33_tpl F dot = v0 | v1; if (dot < F(-0.9999f)) { - Vec3d axis = v0.GetOrthogonal().GetNormalized(); + Vec3_tpl axis = v0.GetOrthogonal().GetNormalized(); m00 = F(2 * axis.x * axis.x - 1); m01 = F(2 * axis.x * axis.y); m02 = F(2 * axis.x * axis.z); @@ -723,28 +642,6 @@ struct Matrix33_tpl return m33; } - - //! calculate 2 vector that form a orthogonal base with a given input vector (by M.M.) - //! /param invDirection input direction (has to be normalized) - //! /param outvA first output vector that is perpendicular to the input direction - //! /param outvB second output vector that is perpendicular the input vector and the first output vector - ILINE static Matrix33_tpl CreateOrthogonalBase(const Vec3& invDirection) - { - Vec3 outvA; - if (invDirection.z < -0.5f || invDirection.z > 0.5f) - { - outvA = Vec3(invDirection.z, invDirection.y, -invDirection.x); - } - else - { - outvA = Vec3(invDirection.y, -invDirection.x, invDirection.z); - } - Vec3 outvB = (invDirection % outvA).GetNormalized(); - outvA = (invDirection % outvB).GetNormalized(); - return CreateFromVectors(invDirection, outvA, outvB); - } - - ////////////////////////////////////////////////////////////////////////// ILINE static Matrix33_tpl CreateOrientation(const Vec3_tpl& dir, const Vec3_tpl& up, float rollAngle) { @@ -779,77 +676,6 @@ struct Matrix33_tpl return tm; } - - /*! - * Direct-Matrix-Slerp: for the sake of completeness, I have included the following expression - * for Spherical-Linear-Interpolation without using quaternions. This is much faster then converting - * both matrices into quaternions in order to do a quaternion slerp and then converting the slerped - * quaternion back into a matrix. - * This is a high-precision calculation. Given two orthonormal 3x3 matrices this function calculates - * the shortest possible interpolation-path between the two rotations. The interpolation curve forms - * a great arc on the rotation sphere (geodesic). Not only does Slerp follow a great arc it follows - * the shortest great arc. Furthermore Slerp has constant angular velocity. All in all Slerp is the - * optimal interpolation curve between two rotations. - * - * STABILITY PROBLEM: There are two singularities at angle=0 and angle=PI. At 0 the interpolation-axis - * is arbitrary, which means any axis will produce the same result because we have no rotation. Thats - * why I'm using (1,0,0). At PI the rotations point away from each other and the interpolation-axis - * is unpredictable. In this case I'm also using the axis (1,0,0). If the angle is ~0 or ~PI, then we - * have to normalize a very small vector and this can cause numerical instability. The quaternion-slerp - * has exactly the same problems. - * Ivo - * Example: - * Matrix33 slerp=Matrix33::CreateSlerp( m,n,0.333f ); - */ - ILINE void SetSlerp(const Matrix33_tpl& m, const Matrix33_tpl& n, F t) - { - assert(m.IsValid()); - assert(n.IsValid()); - //calculate delta-rotation between m and n (=39 flops) - Matrix33_tpl d, i; - d.m00 = m.m00 * n.m00 + m.m10 * n.m10 + m.m20 * n.m20; - d.m01 = m.m00 * n.m01 + m.m10 * n.m11 + m.m20 * n.m21; - d.m02 = m.m00 * n.m02 + m.m10 * n.m12 + m.m20 * n.m22; - d.m10 = m.m01 * n.m00 + m.m11 * n.m10 + m.m21 * n.m20; - d.m11 = m.m01 * n.m01 + m.m11 * n.m11 + m.m21 * n.m21; - d.m12 = m.m01 * n.m02 + m.m11 * n.m12 + m.m21 * n.m22; - d.m20 = d.m01 * d.m12 - d.m02 * d.m11; - d.m21 = d.m02 * d.m10 - d.m00 * d.m12; - d.m22 = d.m00 * d.m11 - d.m01 * d.m10; - assert(d.IsOrthonormalRH(0.0001f)); - - Vec3_tpl axis(d.m21 - d.m12, d.m02 - d.m20, d.m10 - d.m01); - F l = sqrt(axis | axis); - if (l > F(0.00001)) - { - axis /= l; - } - else - { - axis(1, 0, 0); - } - i.SetRotationAA(acos(clamp_tpl((d.m00 + d.m11 + d.m22 - 1) * 0.5f, F(-1), F(+1))) * t, axis); //angle interpolation and calculation of new delta-matrix (=26 flops) - - //final concatenation (=39 flops) - m00 = F(m.m00 * i.m00 + m.m01 * i.m10 + m.m02 * i.m20); - m01 = F(m.m00 * i.m01 + m.m01 * i.m11 + m.m02 * i.m21); - m02 = F(m.m00 * i.m02 + m.m01 * i.m12 + m.m02 * i.m22); - m10 = F(m.m10 * i.m00 + m.m11 * i.m10 + m.m12 * i.m20); - m11 = F(m.m10 * i.m01 + m.m11 * i.m11 + m.m12 * i.m21); - m12 = F(m.m10 * i.m02 + m.m11 * i.m12 + m.m12 * i.m22); - m20 = m01 * m12 - m02 * m11; - m21 = m02 * m10 - m00 * m12; - m22 = m00 * m11 - m01 * m10; - assert(this->IsOrthonormalRH(0.0001f)); - } - ILINE static Matrix33_tpl CreateSlerp(const Matrix33_tpl m, const Matrix33_tpl n, F t) - { - Matrix33_tpl m33; - m33.SetSlerp(m, n, t); - return m33; - } - - ILINE void SetScale(const Vec3_tpl& s) { m00 = s.x; @@ -880,9 +706,6 @@ struct Matrix33_tpl } ILINE static Matrix33_tpl CreateFromVectors(const Vec3_tpl& vx, const Vec3_tpl& vy, const Vec3_tpl& vz) { Matrix33_tpl dst; dst.SetFromVectors(vx, vy, vz); return dst; } - - - ILINE void Transpose() // in-place transposition { F t; @@ -896,56 +719,6 @@ struct Matrix33_tpl m12 = m21; m21 = t; } - ILINE Matrix33_tpl GetTransposed() const - { - Matrix33_tpl dst; - dst.m00 = m00; - dst.m01 = m10; - dst.m02 = m20; - dst.m10 = m01; - dst.m11 = m11; - dst.m12 = m21; - dst.m20 = m02; - dst.m21 = m12; - dst.m22 = m22; - return dst; - } - ILINE Matrix33_tpl T() const { return GetTransposed(); } - - ILINE Matrix33_tpl& Fabs() - { - m00 = fabs_tpl(m00); - m01 = fabs_tpl(m01); - m02 = fabs_tpl(m02); - m10 = fabs_tpl(m10); - m11 = fabs_tpl(m11); - m12 = fabs_tpl(m12); - m20 = fabs_tpl(m20); - m21 = fabs_tpl(m21); - m22 = fabs_tpl(m22); - return *this; - } - ILINE Matrix33_tpl GetFabs() const { Matrix33_tpl m = *this; m.Fabs(); return m; } - - - ILINE void Adjoint(void) - { - //rescue members - Matrix33_tpl m = *this; - //calculate the adjoint-matrix - m00 = m.m11 * m.m22 - m.m12 * m.m21; - m01 = m.m12 * m.m20 - m.m10 * m.m22; - m02 = m.m10 * m.m21 - m.m11 * m.m20; - m10 = m.m21 * m.m02 - m.m22 * m.m01; - m11 = m.m22 * m.m00 - m.m20 * m.m02; - m12 = m.m20 * m.m01 - m.m21 * m.m00; - m20 = m.m01 * m.m12 - m.m02 * m.m11; - m21 = m.m02 * m.m10 - m.m00 * m.m12; - m22 = m.m00 * m.m11 - m.m01 * m.m10; - } - ILINE Matrix33_tpl GetAdjoint() const { Matrix33_tpl dst = *this; dst.Adjoint(); return dst; } - - /*! * @@ -1201,8 +974,6 @@ struct Matrix33_tpl /////////////////////////////////////////////////////////////////////////////// typedef Matrix33_tpl Matrix33; //always 32 bit -typedef Matrix33_tpl Matrix33d; //always 64 bit -typedef Matrix33_tpl Matrix33r; //variable float precision. depending on the target system it can be between 32, 64 or 80 bit //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- @@ -1360,9 +1131,6 @@ ILINE Matrix33_tpl& operator+=(Matrix33_tpl& l, const Matrix33_tpl& return l; } - - - template ILINE Matrix33_tpl operator - (const Matrix33_tpl& l, const Matrix33_tpl& r) { @@ -1397,9 +1165,6 @@ ILINE Matrix33_tpl& operator-=(Matrix33_tpl& l, const Matrix33_tpl& return l; } - - - template ILINE Matrix33_tpl operator*(const Matrix33_tpl& m, F op) { @@ -1462,37 +1227,3 @@ ILINE Vec2_tpl operator*(const Vec2_tpl& v, const Matrix33_tpl& m) assert(v.IsValid()); return Vec2_tpl(v.x * m.m00 + v.y * m.m10, v.x * m.m01 + v.y * m.m11); } - -template -ILINE Matrix33_tpl& crossproduct_matrix(const Vec3_tpl& v, Matrix33_tpl& m) -{ - m.m00 = 0; - m.m01 = -v.z; - m.m02 = v.y; - m.m10 = v.z; - m.m11 = 0; - m.m12 = -v.x; - m.m20 = -v.y; - m.m21 = v.x; - m.m22 = 0; - return m; -} - -template -ILINE Matrix33_tpl& dotproduct_matrix(const Vec3_tpl& v, const Vec3_tpl& op, Matrix33_tpl& m) -{ - m.m00 = v.x * op.x; - m.m10 = v.y * op.x; - m.m20 = v.z * op.x; - m.m01 = v.x * op.y; - m.m11 = v.y * op.y; - m.m21 = v.z * op.y; - m.m02 = v.x * op.z; - m.m12 = v.y * op.z; - m.m22 = v.z * op.z; - return m; -} - - -#endif // CRYINCLUDE_CRYCOMMON_CRY_MATRIX33_H - diff --git a/Code/Legacy/CryCommon/Cry_Matrix34.h b/Code/Legacy/CryCommon/Cry_Matrix34.h index 0659d3bc47..8dcb48cf6a 100644 --- a/Code/Legacy/CryCommon/Cry_Matrix34.h +++ b/Code/Legacy/CryCommon/Cry_Matrix34.h @@ -8,16 +8,8 @@ // Description : Common matrix class - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_MATRIX34_H -#define CRYINCLUDE_CRYCOMMON_CRY_MATRIX34_H #pragma once - - - - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -347,220 +339,6 @@ struct Matrix34_tpl *this = Matrix33_tpl(q); } - - - //CONSTRUCTOR for identical float-types. It converts a QuatT into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - explicit ILINE Matrix34_tpl(const QuatT_tpl &q) - { - *this = Matrix34_tpl(Matrix33_tpl(q.q), q.t); - } - //CONSTRUCTOR for different float-types. It converts a QuatT into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - template - ILINE explicit Matrix34_tpl(const QuatT_tpl q) - { - *this = Matrix34_tpl(Matrix33_tpl(q.q), q.t); - } - - - - - //CONSTRUCTOR for identical float-types. It converts a QuatTS into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - explicit ILINE Matrix34_tpl(const QuatTS_tpl &q) - { - assert(q.q.IsValid()); - Vec3_tpl v2 = q.q.v + q.q.v; - F xx = 1 - v2.x * q.q.v.x; - F yy = v2.y * q.q.v.y; - F xw = v2.x * q.q.w; - F xy = v2.y * q.q.v.x; - F yz = v2.z * q.q.v.y; - F yw = v2.y * q.q.w; - F xz = v2.z * q.q.v.x; - F zz = v2.z * q.q.v.z; - F zw = v2.z * q.q.w; - m00 = (1 - yy - zz) * q.s; - m01 = (xy - zw) * q.s; - m02 = (xz + yw) * q.s; - m03 = q.t.x; - m10 = (xy + zw) * q.s; - m11 = (xx - zz) * q.s; - m12 = (yz - xw) * q.s; - m13 = q.t.y; - m20 = (xz - yw) * q.s; - m21 = (yz + xw) * q.s; - m22 = (xx - yy) * q.s; - m23 = q.t.z; - } - //CONSTRUCTOR for different float-types. It converts a QuatTS into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - template - ILINE explicit Matrix34_tpl(const QuatTS_tpl &q) - { - assert(q.q.IsValid()); - Vec3_tpl v2 = q.q.v + q.q.v; - F1 xx = 1 - v2.x * q.q.v.x; - F1 yy = v2.y * q.q.v.y; - F1 xw = v2.x * q.q.w; - F1 xy = v2.y * q.q.v.x; - F1 yz = v2.z * q.q.v.y; - F1 yw = v2.y * q.q.w; - F1 xz = v2.z * q.q.v.x; - F1 zz = v2.z * q.q.v.z; - F1 zw = v2.z * q.q.w; - m00 = F((1 - yy - zz) * q.s); - m01 = F((xy - zw) * q.s); - m02 = F((xz + yw) * q.s); - m03 = F(q.t.x); - m10 = F((xy + zw) * q.s); - m11 = F((xx - zz) * q.s); - m12 = F((yz - xw) * q.s); - m13 = F(q.t.y); - m20 = F((xz - yw) * q.s); - m21 = F((yz + xw) * q.s); - m22 = F((xx - yy) * q.s); - m23 = F(q.t.z); - } - - - - - //CONSTRUCTOR for identical float-types. It converts a QuatTNS into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - explicit ILINE Matrix34_tpl(const QuatTNS_tpl &q) - { - assert(q.q.IsValid()); - Vec3_tpl v2 = q.q.v + q.q.v; - F xx = 1 - v2.x * q.q.v.x; - F yy = v2.y * q.q.v.y; - F xw = v2.x * q.q.w; - F xy = v2.y * q.q.v.x; - F yz = v2.z * q.q.v.y; - F yw = v2.y * q.q.w; - F xz = v2.z * q.q.v.x; - F zz = v2.z * q.q.v.z; - F zw = v2.z * q.q.w; - m00 = (1 - yy - zz) * q.s.x; - m01 = (xy - zw) * q.s.y; - m02 = (xz + yw) * q.s.z; - m03 = q.t.x; - m10 = (xy + zw) * q.s.x; - m11 = (xx - zz) * q.s.y; - m12 = (yz - xw) * q.s.z; - m13 = q.t.y; - m20 = (xz - yw) * q.s.x; - m21 = (yz + xw) * q.s.y; - m22 = (xx - yy) * q.s.z; - m23 = q.t.z; - } - //CONSTRUCTOR for different float-types. It converts a QuatTNS into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - template - ILINE explicit Matrix34_tpl(const QuatTNS_tpl &q) - { - assert(q.q.IsValid()); - Vec3_tpl v2 = q.q.v + q.q.v; - F1 xx = 1 - v2.x * q.q.v.x; - F1 yy = v2.y * q.q.v.y; - F1 xw = v2.x * q.q.w; - F1 xy = v2.y * q.q.v.x; - F1 yz = v2.z * q.q.v.y; - F1 yw = v2.y * q.q.w; - F1 xz = v2.z * q.q.v.x; - F1 zz = v2.z * q.q.v.z; - F1 zw = v2.z * q.q.w; - m00 = F((1 - yy - zz) * q.s.x); - m01 = F((xy - zw) * q.s.y); - m02 = F((xz + yw) * q.s.z); - m03 = F(q.t.x); - m10 = F((xy + zw) * q.s.x); - m11 = F((xx - zz) * q.s.y); - m12 = F((yz - xw) * q.s.z); - m13 = F(q.t.y); - m20 = F((xz - yw) * q.s.x); - m21 = F((yz + xw) * q.s.y); - m22 = F((xx - yy) * q.s.z); - m23 = F(q.t.z); - } - - - - - //CONSTRUCTOR for identical float-types. It converts a DualQuat into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - ILINE explicit Matrix34_tpl(const DualQuat_tpl &q) - { - assert((fabs_tpl(1 - (q.nq | q.nq))) < 0.01); //check if unit-quaternion - Vec3_tpl t = (q.nq.w * q.dq.v - q.dq.w * q.nq.v + q.nq.v % q.dq.v); //perfect for HLSL - Vec3_tpl v2 = q.nq.v + q.nq.v; - F xx = 1 - v2.x * q.nq.v.x; - F yy = v2.y * q.nq.v.y; - F xw = v2.x * q.nq.w; - F xy = v2.y * q.nq.v.x; - F yz = v2.z * q.nq.v.y; - F yw = v2.y * q.nq.w; - F xz = v2.z * q.nq.v.x; - F zz = v2.z * q.nq.v.z; - F zw = v2.z * q.nq.w; - m00 = 1 - yy - zz; - m01 = xy - zw; - m02 = xz + yw; - m03 = t.x + t.x; - m10 = xy + zw; - m11 = xx - zz; - m12 = yz - xw; - m13 = t.y + t.y; - m20 = xz - yw; - m21 = yz + xw; - m22 = xx - yy; - m23 = t.z + t.z; - } - //CONSTRUCTOR for different float-types. It converts a DualQuat into a Matrix34. - //Needs to be 'explicit' because we loose float-precision in the conversion process - //Matrix34(QuatT); - template - ILINE explicit Matrix34_tpl(const DualQuat_tpl &q) - { - assert((fabs_tpl(1 - (q.nq | q.nq))) < 0.01); //check if unit-quaternion - Vec3_tpl t = (q.nq.w * q.dq.v - q.dq.w * q.nq.v + q.nq.v % q.dq.v); //perfect for HLSL - Vec3_tpl v2 = q.nq.v + q.nq.v; - F1 xx = 1 - v2.x * q.nq.v.x; - F1 yy = v2.y * q.nq.v.y; - F1 xw = v2.x * q.nq.w; - F1 xy = v2.y * q.nq.v.x; - F1 yz = v2.z * q.nq.v.y; - F1 yw = v2.y * q.nq.w; - F1 xz = v2.z * q.nq.v.x; - F1 zz = v2.z * q.nq.v.z; - F1 zw = v2.z * q.nq.w; - m00 = F(1 - yy - zz); - m01 = F(xy - zw); - m02 = F(xz + yw); - m03 = F(t.x + t.x); - m10 = F(xy + zw); - m11 = F(xx - zz); - m12 = F(yz - xw); - m13 = F(t.y + t.y); - m20 = F(xz - yw); - m21 = F(yz + xw); - m22 = F(xx - yy); - m23 = F(t.z + t.z); - } - - - - - - //apply scaling to the columns of the matrix. ILINE void ScaleColumn(const Vec3_tpl& s) { @@ -580,7 +358,7 @@ struct Matrix34_tpl * Initializes the Matrix34 with the identity. * */ - void SetIdentity(void) + void SetIdentity() { m00 = 1.0f; m01 = 0.0f; @@ -596,58 +374,12 @@ struct Matrix34_tpl m23 = 0.0f; } - ILINE static Matrix34_tpl CreateIdentity(void) + ILINE static Matrix34_tpl CreateIdentity() { Matrix34_tpl m; m.SetIdentity(); return m; } - - ILINE bool IsIdentity() const - { - return 0 == (fabs_tpl((F)1 - m00) + fabs_tpl(m01) + fabs_tpl(m02) + fabs_tpl(m03) + fabs_tpl(m10) + fabs_tpl((F)1 - m11) + fabs_tpl(m12) + fabs_tpl(m13) + fabs_tpl(m20) + fabs_tpl(m21) + fabs_tpl((F)1 - m22)) + fabs_tpl(m23); - } - - ILINE int IsZero() const - { - return 0 == (fabs_tpl(m00) + fabs_tpl(m01) + fabs_tpl(m02) + fabs_tpl(m03) + fabs_tpl(m10) + fabs_tpl(m11) + fabs_tpl(m12) + fabs_tpl(m13) + fabs_tpl(m20) + fabs_tpl(m21) + fabs_tpl(m22)) + fabs_tpl(m23); - } - - /*! - * Create a rotation matrix around an arbitrary axis (Eulers Theorem). - * The axis is specified as an normalized Vec3. The angle is assumed to be in radians. - * This function also assumes a translation-vector and stores it in the right column. - * - * Example: - * Matrix34 m34; - * Vec3 axis=GetNormalized( Vec3(-1.0f,-0.3f,0.0f) ); - * m34.SetRotationAA( 3.14314f, axis, Vec3(5,5,5) ); - */ - ILINE void SetRotationAA(const F rad, const Vec3_tpl& axis, const Vec3_tpl& t = Vec3(ZERO)) - { - *this = Matrix33_tpl::CreateRotationAA(rad, axis); - this->SetTranslation(t); - } - ILINE static Matrix34_tpl CreateRotationAA(const F rad, const Vec3_tpl& axis, const Vec3_tpl& t = Vec3(ZERO)) - { - Matrix34_tpl m34; - m34.SetRotationAA(rad, axis, t); - return m34; - } - - ILINE void SetRotationAA(const Vec3_tpl& rot, const Vec3_tpl& t = Vec3(ZERO)) - { - *this = Matrix33_tpl::CreateRotationAA(rot); - this->SetTranslation(t); - } - ILINE static Matrix34_tpl CreateRotationAA(const Vec3_tpl& rot, const Vec3_tpl& t = Vec3(ZERO)) - { - Matrix34_tpl m34; - m34.SetRotationAA(rot, t); - return m34; - } - - /*! * Create rotation-matrix about X axis using an angle. * The angle is assumed to be in radians. @@ -690,28 +422,6 @@ struct Matrix34_tpl return m34; } - /*! - * Create rotation-matrix about Z axis using an angle. - * The angle is assumed to be in radians. - * The translation-vector is set to zero. - * - * Example: - * Matrix34 m34; - * m34.SetRotationZ(0.5f); - */ - ILINE void SetRotationZ(const f32 rad, const Vec3_tpl& t = Vec3(ZERO)) - { - *this = Matrix33_tpl::CreateRotationZ(rad); - this->SetTranslation(t); - } - ILINE static Matrix34_tpl CreateRotationZ(const f32 rad, const Vec3_tpl& t = Vec3(ZERO)) - { - Matrix34_tpl m34; - m34.SetRotationZ(rad, t); - return m34; - } - - /*! * * Convert three Euler angle to mat33 (rotation order:XYZ) @@ -742,22 +452,6 @@ struct Matrix34_tpl } - ILINE void SetRotationAA(F c, F s, Vec3_tpl axis, const Vec3_tpl& t = Vec3(ZERO)) - { - assert(axis.IsValid()); - assert(t.IsValid()); - *this = Matrix33_tpl::CreateRotationAA(c, s, axis); - m03 = t.x; - m13 = t.y; - m23 = t.z; - } - ILINE static Matrix34_tpl CreateRotationAA(F c, F s, Vec3_tpl axis, const Vec3_tpl& t = Vec3(ZERO)) - { - Matrix34_tpl m34; - m34.SetRotationAA(c, s, axis, t); - return m34; - } - ILINE void SetTranslationMat(const Vec3_tpl& v) { m00 = 1.0f; @@ -804,25 +498,6 @@ struct Matrix34_tpl return m; } - void InvertFast() - { // in-place transposition - assert(IsOrthonormal()); - F t; - Vec3 v(m03, m13, m23); - t = m01; - m01 = m10; - m10 = t; - m03 = -v.x * m00 - v.y * m01 - v.z * m20; - t = m02; - m02 = m20; - m20 = t; - m13 = -v.x * m10 - v.y * m11 - v.z * m21; - t = m12; - m12 = m21; - m21 = t; - m23 = -v.x * m20 - v.y * m21 - v.z * m22; - } - Matrix34_tpl GetInvertedFast() const { assert(IsOrthonormal()); @@ -875,14 +550,6 @@ struct Matrix34_tpl m22 = z.z; } - - //determinant is ambiguous: only the upper-left-submatrix's determinant is calculated - ILINE f32 Determinant() const - { - return (m00 * m11 * m22) + (m01 * m12 * m20) + (m02 * m10 * m21) - (m02 * m11 * m20) - (m00 * m12 * m21) - (m01 * m10 * m22); - } - - //-------------------------------------------------------------------------------- //---- helper functions to access matrix-members ------------ //-------------------------------------------------------------------------------- @@ -896,10 +563,8 @@ struct Matrix34_tpl ILINE void SetRow(int i, const Vec3_tpl& v) { assert(i < 3); F* p = (F*)(&m00); p[0 + 4 * i] = v.x; p[1 + 4 * i] = v.y; p[2 + 4 * i] = v.z; } ILINE const Vec3_tpl& GetRow(int i) const { assert(i < 3); return *(const Vec3_tpl*)(&m00 + 4 * i); } - ILINE const Vec4_tpl& GetRow4(int i) const { assert(i < 3); return *(const Vec4_tpl*)(&m00 + 4 * i); } + ILINE const Vec4& GetRow4(int i) const { assert(i < 3); return *(const Vec4*)(&m00 + 4 * i); } - ILINE void SetColumn(int i, const Vec3_tpl& v) { assert(i < 4); F* p = (F*)(&m00); p[i + 4 * 0] = v.x; p[i + 4 * 1] = v.y; p[i + 4 * 2] = v.z; } - ILINE Vec3_tpl GetColumn(int i) const { assert(i < 4); F* p = (F*)(&m00); return Vec3(p[i + 4 * 0], p[i + 4 * 1], p[i + 4 * 2]); } ILINE Vec3_tpl GetColumn0() const { return Vec3_tpl(m00, m10, m20); } ILINE Vec3_tpl GetColumn1() const { return Vec3_tpl(m01, m11, m21); } ILINE Vec3_tpl GetColumn2() const { return Vec3_tpl(m02, m12, m22); } @@ -908,8 +573,6 @@ struct Matrix34_tpl ILINE void SetTranslation(const Vec3_tpl& t) { m03 = t.x; m13 = t.y; m23 = t.z; } ILINE Vec3_tpl GetTranslation() const { return Vec3_tpl(m03, m13, m23); } - ILINE void ScaleTranslation (F s) { m03 *= s; m13 *= s; m23 *= s; } - ILINE Matrix34_tpl AddTranslation(const Vec3_tpl& t) { m03 += t.x; m13 += t.y; m23 += t.z; return *this; } ILINE void SetRotation33(const Matrix33_tpl& m33) { @@ -924,43 +587,6 @@ struct Matrix34_tpl m22 = m33.m22; } - ILINE void GetRotation33(Matrix33_tpl& m33) const - { - m33.m00 = m00; - m33.m01 = m01; - m33.m02 = m02; - m33.m10 = m10; - m33.m11 = m11; - m33.m12 = m12; - m33.m20 = m20; - m33.m21 = m21; - m33.m22 = m22; - } - - //check if we have an orthonormal-base (general case, works even with reflection matrices) - int IsOrthonormal(F threshold = 0.001) const - { - f32 d0 = fabs_tpl(GetColumn0() | GetColumn1()); - if (d0 > threshold) - { - return 0; - } - f32 d1 = fabs_tpl(GetColumn0() | GetColumn2()); - if (d1 > threshold) - { - return 0; - } - f32 d2 = fabs_tpl(GetColumn1() | GetColumn2()); - if (d2 > threshold) - { - return 0; - } - int a = (fabs_tpl(1 - (GetColumn0() | GetColumn0()))) < threshold; - int b = (fabs_tpl(1 - (GetColumn1() | GetColumn1()))) < threshold; - int c = (fabs_tpl(1 - (GetColumn2() | GetColumn2()))) < threshold; - return a & b & c; - } - //check if we have an orthonormal-base (assuming we are using a right-handed coordinate system) int IsOrthonormalRH(F threshold = 0.001) const { @@ -978,68 +604,6 @@ struct Matrix34_tpl ); } - bool IsValid() const - { - if (!NumberValid(m00)) - { - return false; - } - if (!NumberValid(m01)) - { - return false; - } - if (!NumberValid(m02)) - { - return false; - } - if (!NumberValid(m03)) - { - return false; - } - if (!NumberValid(m10)) - { - return false; - } - if (!NumberValid(m11)) - { - return false; - } - if (!NumberValid(m12)) - { - return false; - } - if (!NumberValid(m13)) - { - return false; - } - if (!NumberValid(m20)) - { - return false; - } - if (!NumberValid(m21)) - { - return false; - } - if (!NumberValid(m22)) - { - return false; - } - if (!NumberValid(m23)) - { - return false; - } - return true; - } - - - bool IsDegenerate(float epsilon = FLT_EPSILON) const - { - //check the basis vectors for 0 vector - return GetColumn0().len2() < epsilon - || GetColumn1().len2() < epsilon - || GetColumn2().len2() < epsilon; - } - /*! * Create a matrix with SCALING, ROTATION and TRANSLATION (in this order). * @@ -1093,43 +657,12 @@ struct Matrix34_tpl * Example 1: * Matrix m34; * m34.SetScale( Vec3(0.5f, 1.0f, 2.0f) ); - * Example 2: - * Matrix34 m34 = Matrix34::CreateScale( Vec3(0.5f, 1.0f, 2.0f) ); */ ILINE void SetScale(const Vec3_tpl& s, const Vec3_tpl& t = Vec3(ZERO)) { *this = Matrix33::CreateScale(s); this->SetTranslation(t); } - ILINE static Matrix34_tpl CreateScale(const Vec3_tpl& s, const Vec3_tpl& t = Vec3(ZERO)) - { - Matrix34_tpl m34; - m34.SetScale(s, t); - return m34; - } - - - ILINE Matrix44_tpl GetTransposed() const - { - Matrix44_tpl tmp; - tmp.m00 = m00; - tmp.m01 = m10; - tmp.m02 = m20; - tmp.m03 = 0; - tmp.m10 = m01; - tmp.m11 = m11; - tmp.m12 = m21; - tmp.m13 = 0; - tmp.m20 = m02; - tmp.m21 = m12; - tmp.m22 = m22; - tmp.m23 = 0; - tmp.m30 = m03; - tmp.m31 = m13; - tmp.m32 = m23; - tmp.m33 = 1; - return tmp; - } /*! * calculate a real inversion of a Matrix34 @@ -1141,7 +674,7 @@ struct Matrix34_tpl * Example 2: * Matrix34 im34 = m34.GetInverted(); */ - void Invert(void) + void Invert() { //rescue members Matrix34_tpl m = *this; @@ -1182,37 +715,6 @@ struct Matrix34_tpl dst.Invert(); return dst; } - - /*! - * Name: ReflectMat34 - * Description: reflect a rotation matrix with respect to a plane. - * - * Example: - * Vec3 normal( 0.0f,-1.0f, 0.0f); - * Vec3 pos(0,1000,0); - * Matrix34 m34=CreateReflectionMat( pos, normal ); - */ - ILINE static Matrix34_tpl CreateReflectionMat (const Vec3_tpl& p, const Vec3_tpl& n) - { - Matrix34_tpl m; - F vxy = -2.0f * n.x * n.y; - F vxz = -2.0f * n.x * n.z; - F vyz = -2.0f * n.y * n.z; - F pdotn = 2.0f * (p | n); - m.m00 = 1.0f - 2.0f * n.x * n.x; - m.m01 = vxy; - m.m02 = vxz; - m.m03 = pdotn * n.x; - m.m10 = vxy; - m.m11 = 1.0f - 2.0f * n.y * n.y; - m.m12 = vyz; - m.m13 = pdotn * n.y; - m.m20 = vxz; - m.m21 = vyz; - m.m22 = 1.0f - 2.0f * n.z * n.z; - m.m23 = pdotn * n.z; - return m; - } }; /////////////////////////////////////////////////////////////////////////////// @@ -1220,8 +722,6 @@ struct Matrix34_tpl /////////////////////////////////////////////////////////////////////////////// typedef Matrix34_tpl Matrix34; //always 32 bit -typedef Matrix34_tpl Matrix34d;//always 64 bit -typedef Matrix34_tpl Matrix34r;//variable float precision. depending on the target system it can be between 32, 64 or bit #if AZ_COMPILER_MSVC typedef __declspec(align(16)) Matrix34_tpl Matrix34A; #elif AZ_COMPILER_CLANG @@ -1423,6 +923,3 @@ ILINE Matrix44_tpl operator * (const Matrix34_tpl& l, const Matrix44_tpl& v) { assert(i < 4); F* p = (F*)(&m00); p[0 + 4 * i] = v.x; p[1 + 4 * i] = v.y; p[2 + 4 * i] = v.z; } - ILINE void SetRow4(int i, const Vec4_tpl& v) { assert(i < 4); F* p = (F*)(&m00); p[0 + 4 * i] = v.x; p[1 + 4 * i] = v.y; p[2 + 4 * i] = v.z; p[3 + 4 * i] = v.w; } + ILINE void SetRow4(int i, const Vec4& v) { assert(i < 4); F* p = (F*)(&m00); p[0 + 4 * i] = v.x; p[1 + 4 * i] = v.y; p[2 + 4 * i] = v.z; p[3 + 4 * i] = v.w; } ILINE const Vec3_tpl& GetRow(int i) const { assert(i < 4); return *(const Vec3_tpl*)(&m00 + 4 * i); } ILINE void SetColumn(int i, const Vec3_tpl& v) { assert(i < 4); F* p = (F*)(&m00); p[i + 4 * 0] = v.x; p[i + 4 * 1] = v.y; p[i + 4 * 2] = v.z; } ILINE Vec3_tpl GetColumn(int i) const { assert(i < 4); F* p = (F*)(&m00); return Vec3(p[i + 4 * 0], p[i + 4 * 1], p[i + 4 * 2]); } - ILINE Vec4_tpl GetColumn4(int i) const { assert(i < 4); F* p = (F*)(&m00); return Vec4(p[i + 4 * 0], p[i + 4 * 1], p[i + 4 * 2], p[i + 4 * 3]); } + ILINE Vec4 GetColumn4(int i) const { assert(i < 4); F* p = (F*)(&m00); return Vec4(p[i + 4 * 0], p[i + 4 * 1], p[i + 4 * 2], p[i + 4 * 3]); } ILINE Vec3 GetTranslation() const { return Vec3(m03, m13, m23); } ILINE void SetTranslation(const Vec3& t) { m03 = t.x; m13 = t.y; m23 = t.z; } @@ -792,24 +792,24 @@ ILINE Matrix44_tpl operator * (const Matrix44_tpl& l, const Matrix44_tpl } //post-multiply -template -ILINE Vec4_tpl operator*(const Matrix44_tpl& m, const Vec4_tpl& v) +template +ILINE Vec4 operator*(const Matrix44_tpl& m, const Vec4& v) { assert(m.IsValid()); assert(v.IsValid()); - return Vec4_tpl(v.x * m.m00 + v.y * m.m01 + v.z * m.m02 + v.w * m.m03, + return Vec4(v.x * m.m00 + v.y * m.m01 + v.z * m.m02 + v.w * m.m03, v.x * m.m10 + v.y * m.m11 + v.z * m.m12 + v.w * m.m13, v.x * m.m20 + v.y * m.m21 + v.z * m.m22 + v.w * m.m23, v.x * m.m30 + v.y * m.m31 + v.z * m.m32 + v.w * m.m33); } //pre-multiply -template -ILINE Vec4_tpl operator*(const Vec4_tpl& v, const Matrix44_tpl& m) +template +ILINE Vec4 operator*(const Vec4& v, const Matrix44_tpl& m) { assert(m.IsValid()); assert(v.IsValid()); - return Vec4_tpl(v.x * m.m00 + v.y * m.m10 + v.z * m.m20 + v.w * m.m30, + return Vec4(v.x * m.m00 + v.y * m.m10 + v.z * m.m20 + v.w * m.m30, v.x * m.m01 + v.y * m.m11 + v.z * m.m21 + v.w * m.m31, v.x * m.m02 + v.y * m.m12 + v.z * m.m22 + v.w * m.m32, v.x * m.m03 + v.y * m.m13 + v.z * m.m23 + v.w * m.m33); diff --git a/Code/Legacy/CryCommon/Cry_Quat.h b/Code/Legacy/CryCommon/Cry_Quat.h index a18d8a2ad9..115de36cdc 100644 --- a/Code/Legacy/CryCommon/Cry_Quat.h +++ b/Code/Legacy/CryCommon/Cry_Quat.h @@ -8,10 +8,6 @@ // Description : Common quaternion class - - -#ifndef CRYINCLUDE_CRYCOMMON_CRY_QUAT_H -#define CRYINCLUDE_CRYCOMMON_CRY_QUAT_H #pragma once #include @@ -751,41 +747,6 @@ struct Quat_tpl return d; } - - /*! - * linear-interpolation between quaternions (nlerp) - * in this case we convert the t-value into a 1d cubic spline to get closer to Slerp - * - * Example: - * Quat result,p,q; - * result.SetNlerpCubic( p, q, 0.5f ); - */ - ILINE void SetNlerpCubic(const Quat_tpl& p, const Quat_tpl& tq, F t) - { - Quat_tpl q = tq; - assert((fabs_tpl(1 - (p | p))) < 0.001); //check if unit-quaternion - assert((fabs_tpl(1 - (q | q))) < 0.001); //check if unit-quaternion - F cosine = (p | q); - if (cosine < 0) - { - q = -q; - } - F k = (1 - fabs_tpl(cosine)) * F(0.4669269); - F s = 2 * k * t * t * t - 3 * k * t * t + (1 + k) * t; - v.x = p.v.x * (1.0f - s) + q.v.x * s; - v.y = p.v.y * (1.0f - s) + q.v.y * s; - v.z = p.v.z * (1.0f - s) + q.v.z * s; - w = p.w * (1.0f - s) + q.w * s; - Normalize(); - } - ILINE static Quat_tpl CreateNlerpCubic(const Quat_tpl& p, const Quat_tpl& tq, F t) - { - Quat_tpl d; - d.SetNlerpCubic(p, tq, t); - return d; - } - - /*! * spherical-interpolation between quaternions (geometrical slerp) * @@ -836,39 +797,6 @@ struct Quat_tpl return d; } - /*! - * spherical-interpolation between quaternions (algebraic slerp_a) - * I have included this function just for the sake of completeness, because - * its the only useful application to check if exp & log really work. - * Both slerp-functions are returning the same result. - * - * Example: - * Quat result,p,q; - * result.SetExpSlerp( p,q,0.3345f ); - */ - ILINE void SetExpSlerp(const Quat_tpl& p, const Quat_tpl& tq, F t) - { - assert((fabs_tpl(1 - (p | p))) < 0.001); //check if unit-quaternion - assert((fabs_tpl(1 - (tq | tq))) < 0.001); //check if unit-quaternion - Quat_tpl q = tq; - if ((p | q) < 0) - { - q = -q; - } - *this = p * exp(log(!p * q) * t); //algebraic slerp (1) - //...and some more exp-slerp-functions producing all the same result - //*this = exp( log (p* !q) * (1-t)) * q; //algebraic slerp (2) - //*this = exp( log (q* !p) * t) * p; //algebraic slerp (3) - //*this = q * exp( log (!q*p) * (1-t)); //algebraic slerp (4) - } - ILINE static Quat_tpl CreateExpSlerp(const Quat_tpl& p, const Quat_tpl& q, F t) - { - Quat_tpl d; - d.SetExpSlerp(p, q, t); - return d; - } - - //! squad(p,a,b,q,t) = slerp( slerp(p,q,t),slerp(a,b,t), 2(1-t)t). ILINE void SetSquad(const Quat_tpl& p, const Quat_tpl& a, const Quat_tpl& b, const Quat_tpl& q, F t) { @@ -895,15 +823,7 @@ struct Quat_tpl // Typedefs // /////////////////////////////////////////////////////////////////////////////// -#ifndef MAX_API_NUM typedef Quat_tpl Quat; //always 32 bit -typedef Quat_tpl Quatd; //always 64 bit -typedef Quat_tpl Quatr; //variable float precision. depending on the target system it can be between 32, 64 or 80 bit -#endif - -typedef Quat_tpl CryQuat; -typedef Quat_tpl quaternionf; -typedef Quat_tpl quaternion; /*! * @@ -964,22 +884,6 @@ ILINE void operator *= (Quat_tpl& q, const Quat_tpl& p) q.v = p.v * s0 + q.v * p.w + (q.v % p.v); } -/*! -* Implements the multiplication operator: QuatT=Quat*Quatpos -* -* AxB = operation B followed by operation A. -* A multiplication takes 31 muls and 27 adds (=58 float operations). -* -* Example: -* Quat quat = Quat::CreateRotationX(1.94192f);; -* QuatT quatpos = QuatT::CreateRotationZ(3.14192f,Vec3(11,22,33)); -* QuatT qp = quat*quatpos; -*/ -template -ILINE QuatT_tpl operator * (const Quat_tpl& q, const QuatT_tpl& p) -{ - return QuatT_tpl(q * p.q, q * p.t); -} @@ -1154,1043 +1058,3 @@ ILINE void operator %= (Quat_tpl& q, const Quat_tpl& tp) } q = Quat_tpl(q.w + p.w, q.v + p.v); } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -//---------------------------------------------------------------------- -// Quaternion with translation vector -//---------------------------------------------------------------------- -template -struct QuatT_tpl -{ - Quat_tpl q; //this is the quaternion - Vec3_tpl t; //this is the translation vector and a scalar (for uniform scaling?) - - ILINE QuatT_tpl(){} - - //initialize with zeros - ILINE QuatT_tpl(type_zero) - { - q.w = 0, q.v.x = 0, q.v.y = 0, q.v.z = 0, t.x = 0, t.y = 0, t.z = 0; - } - ILINE QuatT_tpl(type_identity) - { - q.w = 1, q.v.x = 0, q.v.y = 0, q.v.z = 0, t.x = 0, t.y = 0, t.z = 0; - } - - ILINE QuatT_tpl(const Vec3_tpl& _t, const Quat_tpl& _q) { q = _q; t = _t; } - - //CONSTRUCTOR: implement the copy/casting/assignment constructor: - template - ILINE QuatT_tpl(const QuatT_tpl& qt) - : q(qt.q) - , t(qt.t) {} - - //convert unit DualQuat back to QuatT - ILINE QuatT_tpl(const DualQuat_tpl& qd) - { - //copy quaternion part - q = qd.nq; - //convert translation vector: - t = (qd.nq.w * qd.dq.v - qd.dq.w * qd.nq.v + qd.nq.v % qd.dq.v) * 2; //perfect for HLSL - } - - explicit ILINE QuatT_tpl(const QuatTS_tpl& qts) - : q(qts.q) - , t(qts.t) {} - - explicit ILINE QuatT_tpl(const Matrix34_tpl& m) - { - q = Quat_tpl(Matrix33(m)); - t = m.GetTranslation(); - } - - ILINE QuatT_tpl(const Quat_tpl& quat, const Vec3_tpl& trans) - { - q = quat; - t = trans; - } - - ILINE void SetIdentity() - { - q.w = 1; - q.v.x = 0; - q.v.y = 0; - q.v.z = 0; - t.x = 0; - t.y = 0; - t.z = 0; - } - - ILINE bool IsIdentity() const - { - return (q.IsIdentity() && t.IsZero()); - } - - /*! - * Convert three Euler angle to mat33 (rotation order:XYZ) - * The Euler angles are assumed to be in radians. - * The translation-vector is set to zero by default. - * - * Example 1: - * QuatT qp; - * qp.SetRotationXYZ( Ang3(0.5f,0.2f,0.9f), translation ); - * - * Example 2: - * QuatT qp=QuatT::CreateRotationXYZ( Ang3(0.5f,0.2f,0.9f), translation ); - */ - ILINE void SetRotationXYZ(const Ang3_tpl& rad, const Vec3_tpl& trans = Vec3(ZERO)) - { - assert(rad.IsValid()); - assert(trans.IsValid()); - q.SetRotationXYZ(rad); - t = trans; - } - ILINE static QuatT_tpl CreateRotationXYZ(const Ang3_tpl& rad, const Vec3_tpl& trans = Vec3(ZERO)) - { - assert(rad.IsValid()); - assert(trans.IsValid()); - QuatT_tpl qp; - qp.SetRotationXYZ(rad, trans); - return qp; - } - - - - ILINE void SetRotationAA(F cosha, F sinha, const Vec3_tpl axis, const Vec3_tpl& trans = Vec3(ZERO)) - { - q.SetRotationAA(cosha, sinha, axis); - t = trans; - } - ILINE static QuatT_tpl CreateRotationAA(F cosha, F sinha, const Vec3_tpl axis, const Vec3_tpl& trans = Vec3(ZERO)) - { - QuatT_tpl qt; - qt.SetRotationAA(cosha, sinha, axis, trans); - return qt; - } - - - ILINE void Invert() - { // in-place transposition - assert(q.IsValid()); - t = -t * q; - q = !q; - } - ILINE QuatT_tpl GetInverted() const - { - assert(q.IsValid()); - QuatT_tpl qpos; - qpos.q = !q; - qpos.t = -t * q; - return qpos; - } - - ILINE void SetTranslation(const Vec3_tpl& trans) { t = trans; } - - ILINE Vec3_tpl GetColumn0() const {return q.GetColumn0(); } - ILINE Vec3_tpl GetColumn1() const {return q.GetColumn1(); } - ILINE Vec3_tpl GetColumn2() const {return q.GetColumn2(); } - ILINE Vec3_tpl GetColumn3() const {return t; } - ILINE Vec3_tpl GetRow0() const { return q.GetRow0(); } - ILINE Vec3_tpl GetRow1() const { return q.GetRow1(); } - ILINE Vec3_tpl GetRow2() const { return q.GetRow2(); } - - ILINE static bool IsEquivalent(const QuatT_tpl& qt1, const QuatT_tpl& qt2, F qe = RAD_EPSILON, F ve = VEC_EPSILON) - { - real rad = acos(min(1.0f, fabs_tpl(qt1.q | qt2.q))); - bool qdif = rad <= qe; - bool vdif = fabs_tpl(qt1.t.x - qt2.t.x) <= ve && fabs_tpl(qt1.t.y - qt2.t.y) <= ve && fabs_tpl(qt1.t.z - qt2.t.z) <= ve; - return (qdif && vdif); - } - - ILINE bool IsValid() const - { - if (!t.IsValid()) - { - return false; - } - if (!q.IsValid()) - { - return false; - } - return true; - } - - /*! - * linear-interpolation between quaternions (lerp) - * - * Example: - * CQuaternion result,p,q; - * result=qlerp( p, q, 0.5f ); - */ - ILINE void SetNLerp(const QuatT_tpl& p, const QuatT_tpl& tq, F ti) - { - assert(p.q.IsValid()); - assert(tq.q.IsValid()); - Quat_tpl d = tq.q; - if ((p.q | d) < 0) - { - d = -d; - } - Vec3_tpl vDiff = d.v - p.q.v; - q.v = p.q.v + (vDiff * ti); - q.w = p.q.w + ((d.w - p.q.w) * ti); - q.Normalize(); - vDiff = tq.t - p.t; - t = p.t + (vDiff * ti); - } - ILINE static QuatT_tpl CreateNLerp(const QuatT_tpl& p, const QuatT_tpl& q, F t) - { - QuatT_tpl d; - d.SetNLerp(p, q, t); - return d; - } - - //NOTE: all vectors are stored in columns - ILINE void SetFromVectors(const Vec3& vx, const Vec3& vy, const Vec3& vz, const Vec3& pos) - { - Matrix34 m34; - m34.m00 = vx.x; - m34.m01 = vy.x; - m34.m02 = vz.x; - m34.m03 = pos.x; - m34.m10 = vx.y; - m34.m11 = vy.y; - m34.m12 = vz.y; - m34.m13 = pos.y; - m34.m20 = vx.z; - m34.m21 = vy.z; - m34.m22 = vz.z; - m34.m23 = pos.z; - *this = QuatT_tpl(m34); - } - ILINE static QuatT_tpl CreateFromVectors(const Vec3_tpl& vx, const Vec3_tpl& vy, const Vec3_tpl& vz, const Vec3_tpl& pos) - { - QuatT_tpl qt; - qt.SetFromVectors(vx, vy, vz, pos); - return qt; - } - - QuatT_tpl GetScaled(F scale) - { - return QuatT_tpl(t * scale, q.GetScaled(scale)); - } -}; - -typedef QuatT_tpl QuatT; //always 32 bit -typedef QuatT_tpl QuatTd;//always 64 bit -typedef QuatT_tpl QuatTr;//variable float precision. depending on the target system it can be between 32, 64 or bit - -/*! -* -* Implements the multiplication operator: QuatT=Quatpos*Quat -* -* AxB = operation B followed by operation A. -* A multiplication takes 16 muls and 12 adds (=28 float operations). -* -* Example: -* Quat quat = Quat::CreateRotationX(1.94192f);; -* QuatT quatpos = QuatT::CreateRotationZ(3.14192f,Vec3(11,22,33)); -* QuatT qp = quatpos*quat; -*/ -template -ILINE QuatT_tpl operator * (const QuatT_tpl& p, const Quat_tpl& q) -{ - assert(p.IsValid()); - assert(q.IsValid()); - return QuatT_tpl(p.q * q, p.t); -} - -/*! -* Implements the multiplication operator: QuatT=QuatposA*QuatposB -* -* AxB = operation B followed by operation A. -* A multiplication takes 31 muls and 30 adds (=61 float operations). -* -* Example: -* QuatT quatposA = QuatT::CreateRotationX(1.94192f,Vec3(77,55,44)); -* QuatT quatposB = QuatT::CreateRotationZ(3.14192f,Vec3(11,22,33)); -* QuatT qp = quatposA*quatposB; -*/ -template -ILINE QuatT_tpl operator * (const QuatT_tpl& q, const QuatT_tpl& p) -{ - assert(q.IsValid()); - assert(p.IsValid()); - return QuatT_tpl(q.q * p.q, q.q * p.t + q.t); -} - - - -/*! -* post-multiply of a QuatT and a Vec3 (3D rotations with quaternions) -* -* Example: -* Quat q(1,0,0,0); -* Vec3 v(33,44,55); -* Vec3 result = q*v; -*/ -template -Vec3_tpl operator * (const QuatT_tpl& q, const Vec3_tpl& v) -{ - assert(v.IsValid()); - assert(q.IsValid()); - //muls=15 / adds=15+3 - Vec3_tpl out, r2; - r2.x = (q.q.v.y * v.z - q.q.v.z * v.y) + q.q.w * v.x; - r2.y = (q.q.v.z * v.x - q.q.v.x * v.z) + q.q.w * v.y; - r2.z = (q.q.v.x * v.y - q.q.v.y * v.x) + q.q.w * v.z; - out.x = (r2.z * q.q.v.y - r2.y * q.q.v.z); - out.x += out.x + v.x + q.t.x; - out.y = (r2.x * q.q.v.z - r2.z * q.q.v.x); - out.y += out.y + v.y + q.t.y; - out.z = (r2.y * q.q.v.x - r2.x * q.q.v.y); - out.z += out.z + v.z + q.t.z; - return out; -} - - - - - - - - - - - - - - - - -//---------------------------------------------------------------------- -// Quaternion with translation vector and scale -// Similar to QuatT, but s is not ignored. -// Most functions then differ, so we don't inherit. -//---------------------------------------------------------------------- -template -struct QuatTS_tpl -{ - Quat_tpl q; - Vec3_tpl t; - F s; - - //constructors -#if defined(_DEBUG) - ILINE QuatTS_tpl() - { - if constexpr (sizeof(F) == 4) - { - uint32* p = alias_cast(&q.v.x); - p[0] = F32NAN; - p[1] = F32NAN; - p[2] = F32NAN; - p[3] = F32NAN; - p[4] = F32NAN; - p[5] = F32NAN; - p[6] = F32NAN; - p[7] = F32NAN; - } - if constexpr (sizeof(F) == 8) - { - uint64* p = alias_cast(&q.v.x); - p[0] = F64NAN; - p[1] = F64NAN; - p[2] = F64NAN; - p[3] = F64NAN; - p[4] = F64NAN; - p[5] = F64NAN; - p[6] = F64NAN; - p[7] = F64NAN; - } - } -#else - ILINE QuatTS_tpl(){} -#endif - - ILINE QuatTS_tpl(const Quat_tpl& quat, const Vec3_tpl& trans, F scale = 1) { q = quat; t = trans; s = scale; } - ILINE QuatTS_tpl(type_identity) { SetIdentity(); } - - //CONSTRUCTOR: implement the copy/casting/assignment constructor: - template - ILINE QuatTS_tpl(const QuatTS_tpl& qts) - : q(qts.q) - , t(qts.t) - , s(qts.s) {} - - ILINE QuatTS_tpl& operator = (const QuatT_tpl& qt) - { - q = qt.q; - t = qt.t; - s = 1.0f; - return *this; - } - ILINE QuatTS_tpl(const QuatT_tpl& qp) { q = qp.q; t = qp.t; s = 1.0f; } - - - ILINE void SetIdentity() - { - q.SetIdentity(); - t = Vec3(ZERO); - s = 1; - } - - explicit ILINE QuatTS_tpl(const Matrix34_tpl& m) - { - t = m.GetTranslation(); - - // The determinant of a matrix is the volume spanned by its base vectors. - // We need an approximate length scale, so we calculate the cube root of the determinant. - s = pow(m.Determinant(), F(1.0 / 3.0)); - - // Orthonormalize using X and Z as anchors. - const Vec3_tpl& r0 = m.GetRow(0); - const Vec3_tpl& r2 = m.GetRow(2); - - const Vec3_tpl v0 = r0.GetNormalized(); - const Vec3_tpl v1 = (r2 % r0).GetNormalized(); - const Vec3_tpl v2 = (v0 % v1); - - Matrix33_tpl m3; - m3.SetRow(0, v0); - m3.SetRow(1, v1); - m3.SetRow(2, v2); - - q = Quat_tpl(m3); - } - - void Invert() - { - s = 1 / s; - q = !q; - t = q * t * -s; - } - QuatTS_tpl GetInverted() const - { - QuatTS_tpl inv; - inv.s = 1 / s; - inv.q = !q; - inv.t = inv.q * t * -inv.s; - return inv; - } - - - /*! - * linear-interpolation between quaternions (nlerp) - * - * Example: - * CQuaternion result,p,q; - * result=qlerp( p, q, 0.5f ); - */ - ILINE void SetNLerp(const QuatTS_tpl& p, const QuatTS_tpl& tq, F ti) - { - assert(p.q.IsValid()); - assert(tq.q.IsValid()); - Quat_tpl d = tq.q; - if ((p.q | d) < 0) - { - d = -d; - } - Vec3_tpl vDiff = d.v - p.q.v; - q.v = p.q.v + (vDiff * ti); - q.w = p.q.w + ((d.w - p.q.w) * ti); - q.Normalize(); - - vDiff = tq.t - p.t; - t = p.t + (vDiff * ti); - - s = p.s + ((tq.s - p.s) * ti); - } - - ILINE static QuatTS_tpl CreateNLerp(const QuatTS_tpl& p, const QuatTS_tpl& q, F t) - { - QuatTS_tpl d; - d.SetNLerp(p, q, t); - return d; - } - - - - ILINE static bool IsEquivalent(const QuatTS_tpl& qts1, const QuatTS_tpl& qts2, F qe = RAD_EPSILON, F ve = VEC_EPSILON) - { - f64 rad = acos(min(1.0f, fabs_tpl(qts1.q | qts2.q))); - bool qdif = rad <= qe; - bool vdif = fabs_tpl(qts1.t.x - qts2.t.x) <= ve && fabs_tpl(qts1.t.y - qts2.t.y) <= ve && fabs_tpl(qts1.t.z - qts2.t.z) <= ve; - bool sdif = fabs_tpl(qts1.s - qts2.s) <= ve; - return (qdif && vdif && sdif); - } - - - bool IsValid(F e = VEC_EPSILON) const - { - if (!q.v.IsValid()) - { - return false; - } - if (!NumberValid(q.w)) - { - return false; - } - if (!q.IsUnit(e)) - { - return false; - } - if (!t.IsValid()) - { - return false; - } - if (!NumberValid(s)) - { - return false; - } - return true; - } - - ILINE Vec3_tpl GetColumn0() const {return q.GetColumn0(); } - ILINE Vec3_tpl GetColumn1() const {return q.GetColumn1(); } - ILINE Vec3_tpl GetColumn2() const {return q.GetColumn2(); } - ILINE Vec3_tpl GetColumn3() const {return t; } - ILINE Vec3_tpl GetRow0() const { return q.GetRow0(); } - ILINE Vec3_tpl GetRow1() const { return q.GetRow1(); } - ILINE Vec3_tpl GetRow2() const { return q.GetRow2(); } -}; - -typedef QuatTS_tpl QuatTS; //always 64 bit -typedef QuatTS_tpl QuatTSd;//always 64 bit -typedef QuatTS_tpl QuatTSr;//variable float precision. depending on the target system it can be between 32, 64 or 80 bit - -template -ILINE QuatTS_tpl operator * (const QuatTS_tpl& a, const Quat_tpl& b) -{ - return QuatTS_tpl(a.q * b, a.t, a.s); -} - - -template -ILINE QuatTS_tpl operator * (const QuatTS_tpl& a, const QuatT_tpl& b) -{ - return QuatTS_tpl(a.q * b.q, a.q * (b.t * a.s) + a.t, a.s); -} -template -ILINE QuatTS_tpl operator * (const QuatT_tpl& a, const QuatTS_tpl& b) -{ - return QuatTS_tpl(a.q * b.q, a.q * b.t + a.t, b.s); -} -template -ILINE QuatTS_tpl operator * (const Quat_tpl& a, const QuatTS_tpl& b) -{ - return QuatTS_tpl(a * b.q, a * b.t, b.s); -} - -/*! -* Implements the multiplication operator: QuatTS=QuatTS*QuatTS -*/ -template -ILINE QuatTS_tpl operator * (const QuatTS_tpl& a, const QuatTS_tpl& b) -{ - assert(a.IsValid()); - assert(b.IsValid()); - return QuatTS_tpl(a.q * b.q, a.q * (b.t * a.s) + a.t, a.s * b.s); -} - -/*! -* post-multiply of a QuatT and a Vec3 (3D rotations with quaternions) -*/ -template -ILINE Vec3_tpl operator * (const QuatTS_tpl& q, const Vec3_tpl& v) -{ - assert(q.IsValid()); - assert(v.IsValid()); - return q.q * v * q.s + q.t; -} - - -//---------------------------------------------------------------------- -// Quaternion with translation vector and non-uniform scale -//---------------------------------------------------------------------- -template -struct QuatTNS_tpl -{ - Quat_tpl q; - Vec3_tpl t; - Vec3_tpl s; - - //constructors -#if defined(_DEBUG) - ILINE QuatTNS_tpl() - { - if constexpr (sizeof(F) == 4) - { - uint32* p = alias_cast(&q.v.x); - p[0] = F32NAN; - p[1] = F32NAN; - p[2] = F32NAN; - p[3] = F32NAN; - p[4] = F32NAN; - p[5] = F32NAN; - p[6] = F32NAN; - p[7] = F32NAN; - p[8] = F32NAN; - p[9] = F32NAN; - } - if constexpr (sizeof(F) == 8) - { - uint64* p = alias_cast(&q.v.x); - p[0] = F64NAN; - p[1] = F64NAN; - p[2] = F64NAN; - p[3] = F64NAN; - p[4] = F64NAN; - p[5] = F64NAN; - p[6] = F64NAN; - p[7] = F64NAN; - p[8] = F64NAN; - p[9] = F64NAN; - } - } -#else - ILINE QuatTNS_tpl() {}; -#endif - - ILINE QuatTNS_tpl(const Quat_tpl& quat, const Vec3_tpl& trans, const Vec3_tpl& scale = Vec3_tpl(1)) { q = quat; t = trans; s = scale; } - ILINE QuatTNS_tpl(type_identity) { SetIdentity(); } - - //CONSTRUCTOR: implement the copy/casting/assignment constructor: - template - ILINE QuatTNS_tpl(const QuatTS_tpl& qts) - : q(qts.q) - , t(qts.t) - , s(qts.s) - { - } - - ILINE QuatTNS_tpl& operator = (const QuatT_tpl& qt) - { - q = qt.q; - t = qt.t; - s = Vec3_tpl(1); - return *this; - } - ILINE QuatTNS_tpl(const QuatT_tpl& qp) { q = qp.q; t = qp.t; s = Vec3_tpl(1); } - - - ILINE void SetIdentity() - { - q.SetIdentity(); - t = Vec3_tpl(ZERO); - s = Vec3_tpl(1); - } - - explicit ILINE QuatTNS_tpl(const Matrix34_tpl& m) - { - t = m.GetTranslation(); - - // Lengths of base vectors equates to scaling in matrix - s.x = m.GetColumn0().GetLength(); - s.y = m.GetColumn1().GetLength(); - s.z = m.GetColumn2().GetLength(); - - // Orthonormalize using X and Z as anchors. - const Vec3_tpl& r0 = m.GetRow(0); - const Vec3_tpl& r2 = m.GetRow(2); - - const Vec3_tpl v0 = r0.GetNormalized(); - const Vec3_tpl v1 = (r2 % r0).GetNormalized(); - const Vec3_tpl v2 = (v0 % v1); - - Matrix33_tpl m3; - m3.SetRow(0, v0); - m3.SetRow(1, v1); - m3.SetRow(2, v2); - - q = Quat_tpl(m3); - } - - void Invert() - { - s = Vec3_tpl(1) / s; - q = !q; - t = q * t * -s; - } - QuatTNS_tpl GetInverted() const - { - QuatTNS_tpl inv; - inv.s = Vec3_tpl(1) / s; - inv.q = !q; - inv.t = inv.q * t * -inv.s; - return inv; - } - - - /*! - * linear-interpolation between quaternions (nlerp) - * - * Example: - * CQuaternion result,p,q; - * result=qlerp( p, q, 0.5f ); - */ - ILINE void SetNLerp(const QuatTNS_tpl& p, const QuatTNS_tpl& tq, F ti) - { - assert(p.q.IsValid()); - assert(tq.q.IsValid()); - Quat_tpl d = tq.q; - if ((p.q | d) < 0) - { - d = -d; - } - Vec3_tpl vDiff = d.v - p.q.v; - q.v = p.q.v + (vDiff * ti); - q.w = p.q.w + ((d.w - p.q.w) * ti); - q.Normalize(); - - vDiff = tq.t - p.t; - t = p.t + (vDiff * ti); - - s = p.s + ((tq.s - p.s) * ti); - } - - ILINE static QuatTNS_tpl CreateNLerp(const QuatTNS_tpl& p, const QuatTNS_tpl& q, F t) - { - QuatTNS_tpl d; - d.SetNLerp(p, q, t); - return d; - } - - - - ILINE static bool IsEquivalent(const QuatTNS_tpl& qts1, const QuatTNS_tpl& qts2, F qe = RAD_EPSILON, F ve = VEC_EPSILON) - { - real rad = acos(min(1.0f, fabs_tpl(qts1.q | qts2.q))); - bool qdif = rad <= qe; - bool vdif = fabs_tpl(qts1.t.x - qts2.t.x) <= ve && fabs_tpl(qts1.t.y - qts2.t.y) <= ve && fabs_tpl(qts1.t.z - qts2.t.z) <= ve; - bool sdif = fabs_tpl(qts1.s.x - qts2.s.x) <= ve && fabs_tpl(qts1.s.y - qts2.s.y) <= ve && fabs_tpl(qts1.s.z - qts2.s.z) <= ve; - return (qdif && vdif && sdif); - } - - - bool IsValid(F e = VEC_EPSILON) const - { - if (!q.v.IsValid()) - { - return false; - } - if (!NumberValid(q.w)) - { - return false; - } - if (!q.IsUnit(e)) - { - return false; - } - if (!t.IsValid()) - { - return false; - } - if (!NumberValid(s.x)) - { - return false; - } - if (!NumberValid(s.y)) - { - return false; - } - if (!NumberValid(s.z)) - { - return false; - } - return true; - } - - ILINE Vec3_tpl GetColumn0() const {return q.GetColumn0(); } - ILINE Vec3_tpl GetColumn1() const {return q.GetColumn1(); } - ILINE Vec3_tpl GetColumn2() const {return q.GetColumn2(); } - ILINE Vec3_tpl GetColumn3() const {return t; } - ILINE Vec3_tpl GetRow0() const { return q.GetRow0(); } - ILINE Vec3_tpl GetRow1() const { return q.GetRow1(); } - ILINE Vec3_tpl GetRow2() const { return q.GetRow2(); } -}; - -typedef QuatTNS_tpl QuatTNS; -typedef QuatTNS_tpl QuatTNSr; -typedef QuatTNS_tpl QuatTNS_f64; - -template -ILINE QuatTNS_tpl operator * (const QuatTNS_tpl& a, const Quat_tpl& b) -{ - return QuatTNS_tpl(a.q * b, a.t, a.s); -} - -template -ILINE QuatTNS_tpl operator * (const Quat_tpl& a, const QuatTNS_tpl& b) -{ - return QuatTNS_tpl(a * b.q, a * b.t, b.s); -} - -template -ILINE QuatTNS_tpl operator * (const QuatTNS_tpl& a, const QuatT_tpl& b) -{ - return QuatTNS_tpl(a.q * b.q, a.q * Vec3_tpl(b.x * a.s.x, b.y * a.s.y, b.z * a.s.z) + a.t, a.s); -} - -template -ILINE QuatTNS_tpl operator * (const QuatT_tpl& a, const QuatTNS_tpl& b) -{ - return QuatTNS_tpl(a.q * b.q, a.q * b.t + a.t, b.s); -} - -/*! -* Implements the multiplication operator: QuatTNS=QuatTNS*QuatTNS -*/ -template -ILINE QuatTNS_tpl operator * (const QuatTNS_tpl& a, const QuatTNS_tpl& b) -{ - assert(a.IsValid()); - assert(b.IsValid()); - return QuatTNS_tpl( - a.q * b.q, - a.q * Vec3_tpl(b.t.x * a.s.x, b.t.y * a.s.y, b.t.z * a.s.z) + a.t, - Vec3_tpl(a.s.x * b.s.x, a.s.y * b.s.y, a.s.z * b.s.z) - ); -} - -/*! -* post-multiply of a QuatTNS and a Vec3 (3D rotations with quaternions) -*/ -template -ILINE Vec3_tpl operator * (const QuatTNS_tpl& q, const Vec3_tpl& v) -{ - assert(q.IsValid()); - assert(v.IsValid()); - return q.q * Vec3_tpl(v.x * q.s.x, v.y * q.s.y, v.z * q.s.z) + q.t; -} - -//---------------------------------------------------------------------- -// Dual Quaternion -//---------------------------------------------------------------------- -template -struct DualQuat_tpl -{ - Quat_tpl nq; - Quat_tpl dq; - - ILINE DualQuat_tpl() {} - - ILINE DualQuat_tpl(const Quat_tpl& q, const Vec3_tpl& t) - { - //copy the quaternion part - nq = q; - //convert the translation into a dual quaternion part - dq.w = -0.5f * (t.x * q.v.x + t.y * q.v.y + t.z * q.v.z); - dq.v.x = 0.5f * (t.x * q.w + t.y * q.v.z - t.z * q.v.y); - dq.v.y = 0.5f * (-t.x * q.v.z + t.y * q.w + t.z * q.v.x); - dq.v.z = 0.5f * (t.x * q.v.y - t.y * q.v.x + t.z * q.w); - } - - ILINE DualQuat_tpl(const QuatT_tpl& qt) - { - //copy the quaternion part - nq = qt.q; - //convert the translation into a dual quaternion part - dq.w = -0.5f * (qt.t.x * qt.q.v.x + qt.t.y * qt.q.v.y + qt.t.z * qt.q.v.z); - dq.v.x = 0.5f * (qt.t.x * qt.q.w - qt.t.z * qt.q.v.y + qt.t.y * qt.q.v.z); - dq.v.y = 0.5f * (qt.t.y * qt.q.w - qt.t.x * qt.q.v.z + qt.t.z * qt.q.v.x); - dq.v.z = 0.5f * (qt.t.x * qt.q.v.y - qt.t.y * qt.q.v.x + qt.t.z * qt.q.w); - } - - explicit ILINE DualQuat_tpl( const Matrix34_tpl& m34 ) - { - // non-dual part (just copy q0): - nq = Quat_tpl(m34); - f32 tx = m34.m03; - f32 ty = m34.m13; - f32 tz = m34.m23; - - // dual part: - dq.w = -0.5f * (tx * nq.v.x + ty * nq.v.y + tz * nq.v.z); - dq.v.x = 0.5f * (tx * nq.w + ty * nq.v.z - tz * nq.v.y); - dq.v.y = 0.5f * (-tx * nq.v.z + ty * nq.w + tz * nq.v.x); - dq.v.z = 0.5f * (tx * nq.v.y - ty * nq.v.x + tz * nq.w); - } - - - ILINE DualQuat_tpl(type_identity) - { - SetIdentity(); - } - - ILINE DualQuat_tpl(type_zero) - { - SetZero(); - } - - template - ILINE DualQuat_tpl(const DualQuat_tpl& QDual) - : nq(QDual.nq) - , dq(QDual.dq) {} - - ILINE void SetIdentity() - { - nq.SetIdentity(); - dq.w = 0.0f; - dq.v.x = 0.0f; - dq.v.y = 0.0f; - dq.v.z = 0.0f; - } - - ILINE void SetZero() - { - nq.w = 0.0f; - nq.v.x = 0.0f; - nq.v.y = 0.0f; - nq.v.z = 0.0f; - dq.w = 0.0f; - dq.v.x = 0.0f; - dq.v.y = 0.0f; - dq.v.z = 0.0f; - } - - ILINE void Normalize() - { - // Normalize both components so that nq is unit - F norm = isqrt_safe_tpl(nq.v.len2() + sqr(nq.w)); - nq *= norm; - dq *= norm; - } -}; - -#ifndef MAX_API_NUM -typedef DualQuat_tpl DualQuat; //always 32 bit -typedef DualQuat_tpl DualQuatd;//always 64 bit -typedef DualQuat_tpl DualQuatr;//variable float precision. depending on the target system it can be between 32, 64 or 80 bit -#else -typedef DualQuat_tpl CryDualQuat; -#endif - -template -ILINE DualQuat_tpl operator*(const DualQuat_tpl& l, const F2 r) -{ - DualQuat_tpl dual; - dual.nq.w = l.nq.w * r; - dual.nq.v.x = l.nq.v.x * r; - dual.nq.v.y = l.nq.v.y * r; - dual.nq.v.z = l.nq.v.z * r; - - dual.dq.w = l.dq.w * r; - dual.dq.v.x = l.dq.v.x * r; - dual.dq.v.y = l.dq.v.y * r; - dual.dq.v.z = l.dq.v.z * r; - return dual; -} - -template -ILINE DualQuat_tpl operator+(const DualQuat_tpl& l, const DualQuat_tpl& r) -{ - DualQuat_tpl dual; - dual.nq.w = l.nq.w + r.nq.w; - dual.nq.v.x = l.nq.v.x + r.nq.v.x; - dual.nq.v.y = l.nq.v.y + r.nq.v.y; - dual.nq.v.z = l.nq.v.z + r.nq.v.z; - - dual.dq.w = l.dq.w + r.dq.w; - dual.dq.v.x = l.dq.v.x + r.dq.v.x; - dual.dq.v.y = l.dq.v.y + r.dq.v.y; - dual.dq.v.z = l.dq.v.z + r.dq.v.z; - return dual; -} - -template -ILINE void operator += (DualQuat_tpl& l, const DualQuat_tpl& r) -{ - l.nq.w += r.nq.w; - l.nq.v.x += r.nq.v.x; - l.nq.v.y += r.nq.v.y; - l.nq.v.z += r.nq.v.z; - - l.dq.w += r.dq.w; - l.dq.v.x += r.dq.v.x; - l.dq.v.y += r.dq.v.y; - l.dq.v.z += r.dq.v.z; -} - -template -ILINE Vec3_tpl operator*(const DualQuat_tpl& dq, const Vec3_tpl& v) -{ - F2 t; - const F2 ax = dq.nq.v.y * v.z - dq.nq.v.z * v.y + dq.nq.w * v.x; - const F2 ay = dq.nq.v.z * v.x - dq.nq.v.x * v.z + dq.nq.w * v.y; - const F2 az = dq.nq.v.x * v.y - dq.nq.v.y * v.x + dq.nq.w * v.z; - F2 x = dq.dq.v.x * dq.nq.w - dq.nq.v.x * dq.dq.w + dq.nq.v.y * dq.dq.v.z - dq.nq.v.z * dq.dq.v.y; - x += x; - t = (az * dq.nq.v.y - ay * dq.nq.v.z); - x += t + t + v.x; - F2 y = dq.dq.v.y * dq.nq.w - dq.nq.v.y * dq.dq.w + dq.nq.v.z * dq.dq.v.x - dq.nq.v.x * dq.dq.v.z; - y += y; - t = (ax * dq.nq.v.z - az * dq.nq.v.x); - y += t + t + v.y; - F2 z = dq.dq.v.z * dq.nq.w - dq.nq.v.z * dq.dq.w + dq.nq.v.x * dq.dq.v.y - dq.nq.v.y * dq.dq.v.x; - z += z; - t = (ay * dq.nq.v.x - ax * dq.nq.v.y); - z += t + t + v.z; - return Vec3_tpl(x, y, z); -} - -template -ILINE DualQuat_tpl operator*(const DualQuat_tpl& a, const DualQuat_tpl& b) -{ - DualQuat_tpl dual; - - dual.nq.v.x = a.nq.v.y * b.nq.v.z - a.nq.v.z * b.nq.v.y + a.nq.w * b.nq.v.x + a.nq.v.x * b.nq.w; - dual.nq.v.y = a.nq.v.z * b.nq.v.x - a.nq.v.x * b.nq.v.z + a.nq.w * b.nq.v.y + a.nq.v.y * b.nq.w; - dual.nq.v.z = a.nq.v.x * b.nq.v.y - a.nq.v.y * b.nq.v.x + a.nq.w * b.nq.v.z + a.nq.v.z * b.nq.w; - dual.nq.w = a.nq.w * b.nq.w - (a.nq.v.x * b.nq.v.x + a.nq.v.y * b.nq.v.y + a.nq.v.z * b.nq.v.z); - - //dual.dq = a.nq*b.dq + a.dq*b.nq; - dual.dq.v.x = a.nq.v.y * b.dq.v.z - a.nq.v.z * b.dq.v.y + a.nq.w * b.dq.v.x + a.nq.v.x * b.dq.w; - dual.dq.v.y = a.nq.v.z * b.dq.v.x - a.nq.v.x * b.dq.v.z + a.nq.w * b.dq.v.y + a.nq.v.y * b.dq.w; - dual.dq.v.z = a.nq.v.x * b.dq.v.y - a.nq.v.y * b.dq.v.x + a.nq.w * b.dq.v.z + a.nq.v.z * b.dq.w; - dual.dq.w = a.nq.w * b.dq.w - (a.nq.v.x * b.dq.v.x + a.nq.v.y * b.dq.v.y + a.nq.v.z * b.dq.v.z); - - dual.dq.v.x += a.dq.v.y * b.nq.v.z - a.dq.v.z * b.nq.v.y + a.dq.w * b.nq.v.x + a.dq.v.x * b.nq.w; - dual.dq.v.y += a.dq.v.z * b.nq.v.x - a.dq.v.x * b.nq.v.z + a.dq.w * b.nq.v.y + a.dq.v.y * b.nq.w; - dual.dq.v.z += a.dq.v.x * b.nq.v.y - a.dq.v.y * b.nq.v.x + a.dq.w * b.nq.v.z + a.dq.v.z * b.nq.w; - dual.dq.w += a.dq.w * b.nq.w - (a.dq.v.x * b.nq.v.x + a.dq.v.y * b.nq.v.y + a.dq.v.z * b.nq.v.z); - - return dual; -} - - -#endif // CRYINCLUDE_CRYCOMMON_CRY_QUAT_H - - diff --git a/Code/Legacy/CryCommon/Cry_Vector2.h b/Code/Legacy/CryCommon/Cry_Vector2.h index a8722c1b02..81a8c10e49 100644 --- a/Code/Legacy/CryCommon/Cry_Vector2.h +++ b/Code/Legacy/CryCommon/Cry_Vector2.h @@ -302,21 +302,13 @@ struct Vec2_tpl /////////////////////////////////////////////////////////////////////////////// typedef Vec2_tpl Vec2; // always 32 bit -typedef Vec2_tpl Vec2d; // always 64 bit typedef Vec2_tpl Vec2i; -typedef Vec2_tpl Vec2ui; -typedef Vec2_tpl Vec2r; // variable float precision. depending on the target system it can be 32, 64 or 80 bit -typedef Vec2_tpl vector2f; #if defined(LINUX64) typedef Vec2_tpl vector2l; #else typedef Vec2_tpl vector2l; #endif -typedef Vec2_tpl vector2df; -typedef Vec2_tpl vector2d; -typedef Vec2_tpl vector2di; -typedef Vec2_tpl vector2dui; template Vec2_tpl operator*(F op1, const Vec2_tpl& op2) {return Vec2_tpl(op1 * op2.x, op1 * op2.y); } diff --git a/Code/Legacy/CryCommon/Cry_Vector3.h b/Code/Legacy/CryCommon/Cry_Vector3.h index bd1cc11430..f627c788f6 100644 --- a/Code/Legacy/CryCommon/Cry_Vector3.h +++ b/Code/Legacy/CryCommon/Cry_Vector3.h @@ -178,21 +178,6 @@ struct Vec3_tpl assert(IsValid()); } - explicit ILINE Vec3_tpl(const Vec4_tpl &v) { - x = F(v.x); - y = F(v.y); - z = F(v.z); - } - template - explicit ILINE Vec3_tpl(const Vec4_tpl &v) { - x = F(v.x); - y = F(v.y); - z = F(v.z); - } - - - - /*! * overloaded arithmetic operator * @@ -847,6 +832,8 @@ struct Vec3_tpl } }; +using Vec3i = Vec3_tpl; + // dot product (2 versions) template ILINE F1 operator * (const Vec3_tpl& v0, const Vec3_tpl& v1) @@ -943,15 +930,6 @@ ILINE bool IsEquivalent(const Vec3_tpl& v0, const Vec3_tpl& v1, f32 epsilo /////////////////////////////////////////////////////////////////////////////// typedef Vec3_tpl Vec3; // always 32 bit -typedef Vec3_tpl Vec3d; // always 64 bit -typedef Vec3_tpl Vec3i; -typedef Vec3_tpl Vec3ui; -typedef Vec3_tpl Vec3r; // variable float precision. depending on the target system it can be 32, 64 or 80 bit - -template<> -inline Vec3_tpl::Vec3_tpl(type_min) { x = y = z = -1.7E308; } -template<> -inline Vec3_tpl::Vec3_tpl(type_max) { x = y = z = 1.7E308; } template<> inline Vec3_tpl::Vec3_tpl(type_min) { x = y = z = -3.3E38f; } template<> @@ -1176,8 +1154,6 @@ struct Ang3_tpl }; typedef Ang3_tpl Ang3; -typedef Ang3_tpl Ang3r; -typedef Ang3_tpl Ang3_f64; //--------------------------------------- @@ -1251,7 +1227,6 @@ struct AngleAxis_tpl }; typedef AngleAxis_tpl AngleAxis; -typedef AngleAxis_tpl AngleAxis_f64; template ILINE const Vec3_tpl AngleAxis_tpl::operator * (const Vec3_tpl& v) const @@ -1260,22 +1235,6 @@ ILINE const Vec3_tpl AngleAxis_tpl::operator * (const Vec3_tpl& v) cons return origin + (v - origin) * cos_tpl(angle) + (axis % v) * sin_tpl(angle); } - - - - - - - - - - - - - - - - ////////////////////////////////////////////////////////////////////// template struct Plane_tpl @@ -1405,8 +1364,6 @@ struct Plane_tpl }; typedef Plane_tpl Plane; //always 32 bit -typedef Plane_tpl Planed;//always 64 bit -typedef Plane_tpl Planer;//variable float precision. depending on the target system it can be between 32, 64 or 80 bit // declare common constants. Must be done after the class for compiler conformance diff --git a/Code/Legacy/CryCommon/Cry_Vector4.h b/Code/Legacy/CryCommon/Cry_Vector4.h index bbb3395fb3..2b1af84c54 100644 --- a/Code/Legacy/CryCommon/Cry_Vector4.h +++ b/Code/Legacy/CryCommon/Cry_Vector4.h @@ -5,37 +5,31 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - - // Description : Common vector class - - #pragma once - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -// class Vec4_tpl +// class Vec4 /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// -template -struct Vec4_tpl +struct Vec4 { - typedef F value_type; + using value_type = f32; enum { component_count = 4 }; - F x, y, z, w; + f32 x, y, z, w; #if defined(_DEBUG) ILINE Vec4_tpl() { - if constexpr (sizeof(F) == 4) + if constexpr (sizeof(f32) == 4) { uint32* p = alias_cast(&x); p[0] = F32NAN; @@ -43,49 +37,25 @@ struct Vec4_tpl p[2] = F32NAN; p[3] = F32NAN; } - if constexpr (sizeof(F) == 8) - { - uint64* p = alias_cast(&x); - p[0] = F64NAN; - p[1] = F64NAN; - p[2] = F64NAN; - p[3] = F64NAN; - } } #else - ILINE Vec4_tpl() {} + ILINE Vec4() {} #endif - template - ILINE Vec4_tpl& operator = (const Vec4_tpl& v1) - { - x = F(v1.x); - y = F(v1.y); - z = F(v1.z); - w = F(v1.w); - return (*this); - } + ILINE Vec4(f32 vx, f32 vy, f32 vz, f32 vw) { x = vx; y = vy; z = vz; w = vw; } + ILINE Vec4(const Vec3_tpl& v, f32 vw) { x = v.x; y = v.y; z = v.z; w = vw; } + explicit ILINE Vec4(f32 m) { x = y = z = w = m; } + ILINE Vec4(type_zero) { x = y = z = w = f32(0); } - ILINE Vec4_tpl(F vx, F vy, F vz, F vw) { x = vx; y = vy; z = vz; w = vw; } - ILINE Vec4_tpl(const Vec3_tpl& v, F vw) { x = v.x; y = v.y; z = v.z; w = vw; } - explicit ILINE Vec4_tpl(F m) { x = y = z = w = m; } - ILINE Vec4_tpl(type_zero) { x = y = z = w = F(0); } + ILINE void operator () (f32 vx, f32 vy, f32 vz, f32 vw) { x = vx; y = vy; z = vz; w = vw; } + ILINE void operator () (const Vec3_tpl& v, f32 vw) { x = v.x; y = v.y; z = v.z; w = vw; } - ILINE void operator () (F vx, F vy, F vz, F vw) { x = vx; y = vy; z = vz; w = vw; } - ILINE void operator () (const Vec3_tpl& v, F vw) { x = v.x; y = v.y; z = v.z; w = vw; } + ILINE f32& operator [] (int index) { assert(index >= 0 && index <= 3); return ((f32*)this)[index]; } + ILINE f32 operator [] (int index) const { assert(index >= 0 && index <= 3); return ((f32*)this)[index]; } - ILINE F& operator [] (int index) { assert(index >= 0 && index <= 3); return ((F*)this)[index]; } - ILINE F operator [] (int index) const { assert(index >= 0 && index <= 3); return ((F*)this)[index]; } - template - ILINE Vec4_tpl(const Vec4_tpl& v) - : x((F)v.x) - , y((F)v.y) - , z((F)v.z) - , w((F)v.w) { assert(this->IsValid()); } + ILINE Vec4& zero() { x = y = z = w = 0; return *this; } - ILINE Vec4_tpl& zero() { x = y = z = w = 0; return *this; } - - ILINE bool IsEquivalent(const Vec4_tpl& v1, F epsilon = VEC_EPSILON) const + ILINE bool IsEquivalent(const Vec4& v1, f32 epsilon = VEC_EPSILON) const { assert(v1.IsValid()); assert(this->IsValid()); @@ -93,7 +63,7 @@ struct Vec4_tpl } - ILINE Vec4_tpl& operator=(const Vec4_tpl& src) + ILINE Vec4& operator=(const Vec4& src) { x = src.x; y = src.y; @@ -102,17 +72,17 @@ struct Vec4_tpl return *this; } - ILINE Vec4_tpl operator * (F k) const + ILINE Vec4 operator * (f32 k) const { - return Vec4_tpl(x * k, y * k, z * k, w * k); + return Vec4(x * k, y * k, z * k, w * k); } - ILINE Vec4_tpl operator / (F k) const + ILINE Vec4 operator / (f32 k) const { - k = (F)1.0 / k; - return Vec4_tpl(x * k, y * k, z * k, w * k); + k = (f32)1.0 / k; + return Vec4(x * k, y * k, z * k, w * k); } - ILINE Vec4_tpl& operator *= (F k) + ILINE Vec4& operator *= (f32 k) { x *= k; y *= k; @@ -120,9 +90,9 @@ struct Vec4_tpl w *= k; return *this; } - ILINE Vec4_tpl& operator /= (F k) + ILINE Vec4& operator /= (f32 k) { - k = (F)1.0 / k; + k = (f32)1.0 / k; x *= k; y *= k; z *= k; @@ -130,7 +100,7 @@ struct Vec4_tpl return *this; } - ILINE void operator += (const Vec4_tpl& v) + ILINE void operator += (const Vec4& v) { x += v.x; y += v.y; @@ -138,7 +108,7 @@ struct Vec4_tpl w += v.w; } - ILINE void operator -= (const Vec4_tpl& v) + ILINE void operator -= (const Vec4& v) { x -= v.x; y -= v.y; @@ -147,17 +117,17 @@ struct Vec4_tpl } - ILINE F Dot (const Vec4_tpl& vec2) const + ILINE f32 Dot (const Vec4& vec2) const { return x * vec2.x + y * vec2.y + z * vec2.z + w * vec2.w; } - ILINE F GetLength() const + ILINE f32 GetLength() const { return sqrt_tpl(Dot(*this)); } - ILINE F GetLengthSquared() const + ILINE f32 GetLengthSquared() const { return Dot(*this); } @@ -190,24 +160,24 @@ struct Vec4_tpl * Example: * if (v0==v1) dosomething; */ - ILINE bool operator==(const Vec4_tpl& vec) + ILINE bool operator==(const Vec4& vec) { return x == vec.x && y == vec.y && z == vec.z && w == vec.w; } - ILINE bool operator!=(const Vec4_tpl& vec) { return !(*this == vec); } + ILINE bool operator!=(const Vec4& vec) { return !(*this == vec); } - ILINE friend bool operator ==(const Vec4_tpl& v0, const Vec4_tpl& v1) + ILINE friend bool operator ==(const Vec4& v0, const Vec4& v1) { return ((v0.x == v1.x) && (v0.y == v1.y) && (v0.z == v1.z) && (v0.w == v1.w)); } - ILINE friend bool operator !=(const Vec4_tpl& v0, const Vec4_tpl& v1) { return !(v0 == v1); } + ILINE friend bool operator !=(const Vec4& v0, const Vec4& v1) { return !(v0 == v1); } //! normalize the vector // The default Normalize function is in fact "safe". 0 vectors remain unchanged. ILINE void Normalize() { assert(this->IsValid()); - F fInvLen = isqrt_safe_tpl(x * x + y * y + z * z + w * w); + f32 fInvLen = isqrt_safe_tpl(x * x + y * y + z * z + w * w); x *= fInvLen; y *= fInvLen; z *= fInvLen; @@ -218,61 +188,21 @@ struct Vec4_tpl ILINE void NormalizeFast() { assert(this->IsValid()); - F fInvLen = isqrt_fast_tpl(x * x + y * y + z * z + w * w); + f32 fInvLen = isqrt_fast_tpl(x * x + y * y + z * z + w * w); x *= fInvLen; y *= fInvLen; z *= fInvLen; w *= fInvLen; } - - ILINE void SetLerp(const Vec4_tpl& p, const Vec4_tpl& q, F t) { *this = p * (1.0f - t) + q * t; } - ILINE static Vec4_tpl CreateLerp(const Vec4_tpl& p, const Vec4_tpl& q, F t) { return p * (1.0f - t) + q * t; } }; - -typedef Vec4_tpl Vec4; // always 32 bit -typedef Vec4_tpl Vec4d; // always 64 bit -typedef Vec4_tpl Vec4i; -typedef Vec4_tpl Vec4ui; -typedef Vec4_tpl Vec4r; // variable float precision. depending on the target system it can be 32, 64 or 80 bit - -#if defined(WIN32) || defined(WIN64) || defined(LINUX) || defined(APPLE) -typedef Vec4_tpl Vec4A; -#elif defined(AZ_RESTRICTED_PLATFORM) - #include AZ_RESTRICTED_FILE(Cry_Vector4_h) -#endif - -//vector self-addition -template -ILINE Vec4_tpl& operator += (Vec4_tpl& v0, const Vec4_tpl& v1) -{ - v0 = v0 + v1; - return v0; -} - //vector addition -template -ILINE Vec4_tpl operator + (const Vec4_tpl& v0, const Vec4_tpl& v1) +ILINE Vec4 operator + (const Vec4& v0, const Vec4& v1) { - return Vec4_tpl(v0.x + v1.x, v0.y + v1.y, v0.z + v1.z, v0.w + v1.w); + return Vec4(v0.x + v1.x, v0.y + v1.y, v0.z + v1.z, v0.w + v1.w); } //vector subtraction -template -ILINE Vec4_tpl operator - (const Vec4_tpl& v0, const Vec4_tpl& v1) +ILINE Vec4 operator - (const Vec4& v0, const Vec4& v1) { - return Vec4_tpl(v0.x - v1.x, v0.y - v1.y, v0.z - v1.z, v0.w - v1.w); -} - -//vector multiplication -template -ILINE Vec4_tpl operator * (const Vec4_tpl v0, const Vec4_tpl& v1) -{ - return Vec4_tpl(v0.x * v1.x, v0.y * v1.y, v0.z * v1.z, v0.w * v1.w); -} - -//vector division -template -ILINE Vec4_tpl operator / (const Vec4_tpl& v0, const Vec4_tpl& v1) -{ - return Vec4_tpl(v0.x / v1.x, v0.y / v1.y, v0.z / v1.z, v0.w / v1.w); + return Vec4(v0.x - v1.x, v0.y - v1.y, v0.z - v1.z, v0.w - v1.w); } diff --git a/Code/Legacy/CryCommon/FunctorBaseFunction.h b/Code/Legacy/CryCommon/FunctorBaseFunction.h deleted file mode 100644 index 6fbb6dc5e2..0000000000 --- a/Code/Legacy/CryCommon/FunctorBaseFunction.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Implementation of the common function template specializations. - - -#ifndef CRYINCLUDE_CRYCOMMON_FUNCTORBASEFUNCTION_H -#define CRYINCLUDE_CRYCOMMON_FUNCTORBASEFUNCTION_H -#pragma once - - -#include "IFunctorBase.h" - -////////////////////////////////////////////////////////////////////////// -// Return type void -// No arguments. -template<> -class TFunctor - : public IFunctorBase -{ -public: - typedef void (* TFunctionType)(); - - TFunctor(TFunctionType pFunction) - : m_pfnFunction(pFunction){} - - virtual void Call() - { - m_pfnFunction(); - } -private: - TFunctionType m_pfnFunction; -}; -////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////// -// Return type void -// 1 argument. -template -class TFunctor - : public IFunctorBase -{ -public: - typedef void (* TFunctionType)(tArgument1); - - TFunctor(TFunctionType pFunction, tArgument1 Argument1) - : m_pfnFunction(pFunction) - , m_tArgument1(Argument1){} - - virtual void Call() - { - m_pfnFunction(m_tArgument1); - } -private: - TFunctionType m_pfnFunction; - tArgument1 m_tArgument1; -}; -////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////// -// Return type void -// 2 arguments. -template -class TFunctor - : public IFunctorBase -{ -public: - typedef void (* TFunctionType)(tArgument1, tArgument2); - - TFunctor(TFunctionType pFunction, const tArgument1& Argument1, const tArgument2& Argument2) - : m_pfnFunction(pFunction) - , m_tArgument1(Argument1) - , m_tArgument2(Argument2){} - - virtual void Call() - { - m_pfnFunction(m_tArgument1, m_tArgument2); - } -private: - TFunctionType m_pfnFunction; - tArgument1 m_tArgument1; - tArgument2 m_tArgument2; -}; -////////////////////////////////////////////////////////////////////////// - -#endif // CRYINCLUDE_CRYCOMMON_FUNCTORBASEFUNCTION_H diff --git a/Code/Legacy/CryCommon/FunctorBaseMember.h b/Code/Legacy/CryCommon/FunctorBaseMember.h deleted file mode 100644 index d2e75a8752..0000000000 --- a/Code/Legacy/CryCommon/FunctorBaseMember.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Implementation of the member function template specializations. - -#ifndef CRYINCLUDE_CRYCOMMON_FUNCTORBASEMEMBER_H -#define CRYINCLUDE_CRYCOMMON_FUNCTORBASEMEMBER_H -#pragma once - - -#include "IFunctorBase.h" - -////////////////////////////////////////////////////////////////////////// -// Return type void -// No Arguments -template -class TFunctor - : public IFunctorBase -{ -public: - typedef void (tCalleeType::* TMemberFunctionType)(); - - TFunctor(tCalleeType* pCallee, TMemberFunctionType pMemberFunction) - : m_pCalee(pCallee) - , m_pfnMemberFunction(pMemberFunction){} - - virtual void Call() - { - (m_pCalee->*m_pfnMemberFunction)(); - } -private: - tCalleeType* m_pCalee; - TMemberFunctionType m_pfnMemberFunction; -}; -////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////// -// Return type void -// 1 argument. -template -class TFunctor - : public IFunctorBase -{ -public: - typedef void (tCalleeType::* TMemberFunctionType)(tArgument1); - - TFunctor(tCalleeType* pCallee, TMemberFunctionType pMemberFunction, const tArgument1& Argument1) - : m_pCalee(pCallee) - , m_pfnMemberFunction(pMemberFunction) - , m_tArgument1(Argument1){} - - virtual void Call() - { - (m_pCalee->*m_pfnMemberFunction)(m_tArgument1); - } -private: - tCalleeType* m_pCalee; - TMemberFunctionType m_pfnMemberFunction; - tArgument1 m_tArgument1; -}; -////////////////////////////////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////// -// Return type void -// 2 arguments. -template -class TFunctor - : public IFunctorBase -{ -public: - typedef void (tCalleeType::* TMemberFunctionType)(tArgument1, tArgument2); - - TFunctor(tCalleeType* pCallee, TMemberFunctionType pMemberFunction, const tArgument1& Argument1, const tArgument2& Argument2) - : m_pCalee(pCallee) - , m_pfnMemberFunction(pMemberFunction) - , m_tArgument1(Argument1) - , m_tArgument2(Argument2){} - - virtual void Call() - { - (m_pCalee->*m_pfnMemberFunction)(m_tArgument1, m_tArgument2); - } -private: - tCalleeType* m_pCalee; - TMemberFunctionType m_pfnMemberFunction; - tArgument1 m_tArgument1; - tArgument2 m_tArgument2; -}; -////////////////////////////////////////////////////////////////////////// - -#endif // CRYINCLUDE_CRYCOMMON_FUNCTORBASEMEMBER_H diff --git a/Code/Legacy/CryCommon/IConsole.h b/Code/Legacy/CryCommon/IConsole.h index f68a82f9dc..f77237f1af 100644 --- a/Code/Legacy/CryCommon/IConsole.h +++ b/Code/Legacy/CryCommon/IConsole.h @@ -10,15 +10,13 @@ #include #include +#include #include -struct SFunctor; - struct ConsoleBind; struct ICVar; class ITexture; -class ICrySizer; struct ISystem; #define CVAR_INT 1 @@ -192,15 +190,6 @@ struct IConsole // Return: // pointer to the interface ICVar virtual ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) = 0; - // Create a new console variable that store the value in a int64 - // Arguments: - // sName - console variable name - // iValue - default value - // nFlags - user defined flag, this parameter is used by other subsystems and doesn't affect the console variable (basically of user data) - // help - help text that is shown when you use ? in the console - // Return: - // pointer to the interface ICVar - virtual ICVar* RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) = 0; // Create a new console variable that store the value in a float // Arguments: // sName - console variable name @@ -243,14 +232,6 @@ struct IConsole // pointer to the interface ICVar virtual ICVar* Register(const char* name, const char** src, const char* defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) = 0; - // Registers an existing console variable - // Should only be used with static duration objects, object is never freed - // Arguments: - // pVar - the existing console variable - // Return: - // pointer to the interface ICVar (that was passed in) - virtual ICVar* Register(ICVar* pVar) = 0; - // ! Remove a variable from the console // @param sVarName console variable name // @param bDelete if true the variable is deleted @@ -431,9 +412,6 @@ struct IConsole virtual void ResetAutoCompletion() = 0; ////////////////////////////////////////////////////////////////////////// - // Calculation of the memory used by the whole console system - virtual void GetMemoryUsage (ICrySizer* pSizer) const = 0; - // Function related to progress bar virtual void ResetProgressBar(int nProgressRange) = 0; // Function related to progress bar @@ -619,16 +597,12 @@ struct ICVar // Adds a new on change functor to the list. // It will add from index 1 on (0 is reserved). // Returns an ID to use when getting or removing the functor - virtual uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) = 0; + virtual uint64 AddOnChangeFunctor(const AZStd::function& pChangeFunctor) = 0; ////////////////////////////////////////////////////////////////////////// // Get the current callback function. virtual ConsoleVarFunc GetOnChangeCallback() const = 0; - //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - // - virtual void GetMemoryUsage(class ICrySizer* pSizer) const = 0; - ////////////////////////////////////////////////////////////////////////// // only useful for CVarGroups, other types return GetIVal() // CVarGroups set multiple other CVars and this function returns diff --git a/Code/Legacy/CryCommon/IEntityRenderState.h b/Code/Legacy/CryCommon/IEntityRenderState.h index b459a6acaa..42e485cd1e 100644 --- a/Code/Legacy/CryCommon/IEntityRenderState.h +++ b/Code/Legacy/CryCommon/IEntityRenderState.h @@ -7,33 +7,14 @@ */ #pragma once +#include -#include "IStatObj.h" - -#include -#include -#include -#include - - -namespace AZ -{ - class Vector2; -} - -struct IMaterial; -struct IRenderNode; -struct IVisArea; -struct SRenderingPassInfo; -struct SRendItemSorter; -struct SFrameLodInfo; -struct pe_params_area; -struct pe_articgeomparams; +struct IStatObj; struct IRenderNode { // Gives access to object components. - struct IStatObj* GetEntityStatObj(unsigned int = 0, unsigned int = 0, Matrix34A* = NULL, bool = false) { + IStatObj* GetEntityStatObj(unsigned int = 0, unsigned int = 0, Matrix34* = nullptr, bool = false) { return nullptr; } diff --git a/Code/Legacy/CryCommon/IFont.h b/Code/Legacy/CryCommon/IFont.h index 15cc6568bf..01ffb6d206 100644 --- a/Code/Legacy/CryCommon/IFont.h +++ b/Code/Legacy/CryCommon/IFont.h @@ -23,7 +23,6 @@ #include struct ISystem; -class ICrySizer; struct ICryFont; struct IFFont; @@ -94,9 +93,6 @@ struct ICryFont //! \param glyphSizeY Height (in pixels) of the characters to be rendered at in the font texture. virtual void AddCharsToFontTextures(FontFamilyPtr pFontFamily, const char* pChars, int glyphSizeX = defaultGlyphSizeX, int glyphSizeY = defaultGlyphSizeY) = 0; - // Summary: - // Puts the objects used in this module into the sizer interface - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; // Summary: // All font names separated by , // Example: @@ -266,10 +262,6 @@ struct IFFont // Wraps text based on specified maximum line width (UTF-8) virtual void WrapText(AZStd::string& result, float maxWidth, const char* pStr, const STextDrawContext& ctx) = 0; - // Description: - // Puts the memory used by this font into the given sizer. - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // Description: // useful for special feature rendering interleaved with fonts (e.g. box behind the text) virtual void GetGradientTextureCoord(float& minU, float& minV, float& maxU, float& maxV) const = 0; diff --git a/Code/Legacy/CryCommon/IIndexedMesh.h b/Code/Legacy/CryCommon/IIndexedMesh.h index a84cebacb3..8d3ee64c71 100644 --- a/Code/Legacy/CryCommon/IIndexedMesh.h +++ b/Code/Legacy/CryCommon/IIndexedMesh.h @@ -10,13 +10,8 @@ #pragma once #include "Cry_Color.h" -#include "StlUtils.h" -#include "CryEndian.h" - -#include // for AABB #include #include -#include // Description: // 2D Texture coordinates used by CMesh. @@ -28,32 +23,6 @@ private: float s, t; public: - explicit SMeshTexCoord(float x, float y) - { - s = x; - t = y; - } - - explicit SMeshTexCoord(const Vec2f16& other) - { - const Vec2 uv = other.ToVec2(); - - s = uv.x; - t = uv.y; - } - - explicit SMeshTexCoord(const Vec2& other) - { - s = other.x; - t = other.y; - } - - explicit SMeshTexCoord(const Vec4& other) - { - s = other.x; - t = other.y; - } - bool IsEquivalent(const SMeshTexCoord& other, float epsilon = 0.00005f) const { return @@ -113,16 +82,6 @@ public: }; - -struct SMeshBoneMapping_uint8 -{ - typedef uint8 BoneId; - typedef uint8 Weight; - - BoneId boneIds[4]; - Weight weights[4]; -}; - // Subset of mesh is a continuous range of vertices and indices that share same material. struct SMeshSubset { @@ -181,7 +140,6 @@ struct IIndexedMesh int m_nIndexCount; // number of elements in m_pIndices array }; - // virtual ~IIndexedMesh() {} // Release indexed mesh. @@ -190,15 +148,9 @@ struct IIndexedMesh //! Gives read-only access to mesh data virtual void GetMeshDescription(SMeshDescription& meshDesc) const = 0; - /*! Frees vertex and face streams. Calling this function invalidates SMeshDescription pointers */ - virtual void FreeStreams() = 0; - //! Return number of allocated faces virtual int GetFaceCount() const = 0; - /*! Reallocates faces. Calling this function invalidates SMeshDescription pointers */ - virtual void SetFaceCount(int nNewCount) = 0; - //! Return number of allocated vertices, normals and colors virtual int GetVertexCount() const = 0; @@ -216,6 +168,4 @@ struct IIndexedMesh ////////////////////////////////////////////////////////////////////////// virtual int GetSubSetCount() const = 0; virtual const SMeshSubset& GetSubSet(int nIndex) const = 0; - - // }; diff --git a/Code/Legacy/CryCommon/ILevelSystem.h b/Code/Legacy/CryCommon/ILevelSystem.h index 1a022ccc55..edcd8615aa 100644 --- a/Code/Legacy/CryCommon/ILevelSystem.h +++ b/Code/Legacy/CryCommon/ILevelSystem.h @@ -8,13 +8,8 @@ // Description : Gathers level information. Loads a level. - - -#ifndef CRYINCLUDE_CRYACTION_ILEVELSYSTEM_H -#define CRYINCLUDE_CRYACTION_ILEVELSYSTEM_H #pragma once -#include #include #include @@ -56,8 +51,6 @@ struct ILevelSystemListener virtual void OnLoadingProgress([[maybe_unused]] const char* levelName, [[maybe_unused]] int progressAmount) {} //! Called after a level is unloaded, before the data is freed. virtual void OnUnloadComplete([[maybe_unused]] const char* levelName) {} - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const { } }; struct ILevelSystem @@ -95,5 +88,3 @@ protected: static constexpr const char* LevelsDirectoryName = "levels"; }; - -#endif // CRYINCLUDE_CRYACTION_ILEVELSYSTEM_H diff --git a/Code/Legacy/CryCommon/ILocalizationManager.h b/Code/Legacy/CryCommon/ILocalizationManager.h index 0f0ba88250..0b5d76fc24 100644 --- a/Code/Legacy/CryCommon/ILocalizationManager.h +++ b/Code/Legacy/CryCommon/ILocalizationManager.h @@ -43,10 +43,6 @@ struct SLocalizedAdvancesSoundEntry { AZStd::string sName; float fValue; - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(sName); - } }; // Localization Sound Info structure, containing sound related parameters. diff --git a/Code/Legacy/CryCommon/ILog.h b/Code/Legacy/CryCommon/ILog.h index 23257ea59b..8a9c6cc5a2 100644 --- a/Code/Legacy/CryCommon/ILog.h +++ b/Code/Legacy/CryCommon/ILog.h @@ -16,9 +16,6 @@ // this code is disable by default due it's runtime cost //#define SUPPORT_LOG_IDENTER -// forward declarations -class ICrySizer; - // Summary: // Callback interface to the ILog. struct ILogCallback @@ -121,10 +118,6 @@ struct ILog virtual const char* GetModuleFilter() = 0; - // Notes: - // Collect memory statistics in CrySizer - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // Asset scope strings help to figure out asset dependencies in case of asset loading errors. // Should not be used directly, only by using define CRY_DEFINE_ASSET_SCOPE // @see CRY_DEFINE_ASSET_SCOPE diff --git a/Code/Legacy/CryCommon/IMaterial.h b/Code/Legacy/CryCommon/IMaterial.h index 1b3ef258ce..d4a36caf77 100644 --- a/Code/Legacy/CryCommon/IMaterial.h +++ b/Code/Legacy/CryCommon/IMaterial.h @@ -14,7 +14,6 @@ #include struct IShader; -struct ISurfaceType; struct SShaderItem; namespace AZ @@ -38,12 +37,7 @@ namespace AZ struct IMaterial { // TODO: Remove it! - virtual ~IMaterial() {} - virtual void AddRef() = 0; - virtual void Release() = 0; - virtual SShaderItem& GetShaderItem() = 0; virtual const SShaderItem& GetShaderItem() const = 0; - }; diff --git a/Code/Legacy/CryCommon/IMovieSystem.h b/Code/Legacy/CryCommon/IMovieSystem.h index b5302b58f5..6cc5a06c8f 100644 --- a/Code/Legacy/CryCommon/IMovieSystem.h +++ b/Code/Legacy/CryCommon/IMovieSystem.h @@ -6,9 +6,6 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_IMOVIESYSTEM_H -#define CRYINCLUDE_CRYCOMMON_IMOVIESYSTEM_H #pragma once #include @@ -255,8 +252,6 @@ struct SAnimContext // TODO: Mask should be stored with dynamic length uint32 trackMask; //!< To update certain types of tracks only float startTime; //!< The start time of this playing sequence - - void Serialize(XmlNodeRef& xmlNode, bool loading); }; /** Parameters for cut-scene cameras @@ -891,7 +886,6 @@ struct ITrackEventListener // event - Track event added // pUserData - Data to accompany reason virtual void OnTrackEvent(IAnimSequence* sequence, int reason, const char* event, void* pUserData) = 0; - virtual void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{}; // }; @@ -1152,8 +1146,6 @@ struct IMovieListener //! callback on movie events virtual void OnMovieEvent(EMovieEvent movieEvent, IAnimSequence* pAnimSequence) = 0; // - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{} }; /** Movie System interface. @@ -1326,7 +1318,6 @@ struct IMovieSystem virtual bool IsRecording() const = 0; virtual void EnableCameraShake(bool bEnabled) = 0; - virtual bool IsCameraShakeEnabled() const = 0; // Pause any playing sequences. virtual void Pause() = 0; @@ -1381,8 +1372,6 @@ struct IMovieSystem virtual void EnableBatchRenderMode(bool bOn) = 0; virtual bool IsInBatchRenderMode() const = 0; - virtual ILightAnimWrapper* CreateLightAnimWrapper(const char* name) const = 0; - virtual void LoadParamTypeFromXml(CAnimParamType& animParamType, const XmlNodeRef& xmlNode, const uint version) = 0; virtual void SaveParamTypeToXml(const CAnimParamType& animParamType, XmlNodeRef& xmlNode) = 0; @@ -1408,40 +1397,6 @@ struct IMovieSystem // }; -inline void SAnimContext::Serialize(XmlNodeRef& xmlNode, bool bLoading) -{ - if (bLoading) - { - XmlString name; - if (xmlNode->getAttr("sequence", name)) - { - sequence = gEnv->pMovieSystem->FindLegacySequenceByName(name.c_str()); - } - xmlNode->getAttr("dt", dt); - xmlNode->getAttr("fps", fps); - xmlNode->getAttr("time", time); - xmlNode->getAttr("bSingleFrame", singleFrame); - xmlNode->getAttr("bResetting", resetting); - xmlNode->getAttr("trackMask", trackMask); - xmlNode->getAttr("startTime", startTime); - } - else - { - if (sequence) - { - AZStd::string fullname = sequence->GetName(); - xmlNode->setAttr("sequence", fullname.c_str()); - } - xmlNode->setAttr("dt", dt); - xmlNode->setAttr("fps", fps); - xmlNode->setAttr("time", time); - xmlNode->setAttr("bSingleFrame", singleFrame); - xmlNode->setAttr("bResetting", resetting); - xmlNode->setAttr("trackMask", trackMask); - xmlNode->setAttr("startTime", startTime); - } -} - inline void CAnimParamType::SaveToXml(XmlNodeRef& xmlNode) const { gEnv->pMovieSystem->SaveParamTypeToXml(*this, xmlNode); @@ -1456,5 +1411,3 @@ inline void CAnimParamType::Serialize(XmlNodeRef& xmlNode, bool bLoading, const { gEnv->pMovieSystem->SerializeParamType(*this, xmlNode, bLoading, version); } - -#endif // CRYINCLUDE_CRYCOMMON_IMOVIESYSTEM_H diff --git a/Code/Legacy/CryCommon/IPathfinder.h b/Code/Legacy/CryCommon/IPathfinder.h index 7a05321c99..d81bc97d49 100644 --- a/Code/Legacy/CryCommon/IPathfinder.h +++ b/Code/Legacy/CryCommon/IPathfinder.h @@ -23,6 +23,7 @@ struct IAIPathAgent; #include #include #include +#include // Hacks to deal with windows header inclusion. #ifdef GetObject diff --git a/Code/Legacy/CryCommon/IReadWriteXMLSink.h b/Code/Legacy/CryCommon/IReadWriteXMLSink.h deleted file mode 100644 index 0f8356bab7..0000000000 --- a/Code/Legacy/CryCommon/IReadWriteXMLSink.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Moved Craig's ReadWriteXMLSink from CryAction to CrySystem - - -#ifndef CRYINCLUDE_CRYCOMMON_IREADWRITEXMLSINK_H -#define CRYINCLUDE_CRYCOMMON_IREADWRITEXMLSINK_H -#pragma once - -#include -#include - -struct IReadXMLSink; -struct IWriteXMLSource; - -struct IReadWriteXMLSink -{ - // - virtual ~IReadWriteXMLSink(){} - virtual bool ReadXML(const char* definitionFile, const char* dataFile, IReadXMLSink* pSink) = 0; - virtual bool ReadXML(const char* definitionFile, XmlNodeRef node, IReadXMLSink* pSink) = 0; - virtual bool ReadXML(XmlNodeRef definition, const char* dataFile, IReadXMLSink* pSink) = 0; - virtual bool ReadXML(XmlNodeRef definition, XmlNodeRef node, IReadXMLSink* pSink) = 0; - - virtual XmlNodeRef CreateXMLFromSource(const char* definitionFile, IWriteXMLSource* pSource) = 0; - virtual bool WriteXML(const char* definitionFile, const char* dataFile, IWriteXMLSource* pSource) = 0; - // -}; - - -struct SReadWriteXMLCommon -{ - typedef AZStd::variant TValue; -}; - - -TYPEDEF_AUTOPTR(IReadXMLSink); -typedef IReadXMLSink_AutoPtr IReadXMLSinkPtr; - -// this interface allows customization of the data read routines -struct IReadXMLSink - : public SReadWriteXMLCommon -{ - // - virtual ~IReadXMLSink(){} - // reference counting - virtual void AddRef() = 0; - virtual void Release() = 0; - - virtual IReadXMLSinkPtr BeginTable(const char* name, const XmlNodeRef& definition) = 0; - virtual IReadXMLSinkPtr BeginTableAt(int elem, const XmlNodeRef& definition) = 0; - virtual bool SetValue(const char* name, const TValue& value, const XmlNodeRef& definition) = 0; - virtual bool EndTableAt(int elem) = 0; - virtual bool EndTable(const char* name) = 0; - - virtual IReadXMLSinkPtr BeginArray(const char* name, const XmlNodeRef& definition) = 0; - virtual bool SetAt(int elem, const TValue& value, const XmlNodeRef& definition) = 0; - virtual bool EndArray(const char* name) = 0; - - virtual bool Complete() = 0; - - virtual bool IsCreationMode() = 0; - virtual XmlNodeRef GetCreationNode() = 0; - virtual void SetCreationNode(XmlNodeRef definition) = 0; - // -}; - - -TYPEDEF_AUTOPTR(IWriteXMLSource); -typedef IWriteXMLSource_AutoPtr IWriteXMLSourcePtr; - -// this interface allows customization of the data write routines -struct IWriteXMLSource - : public SReadWriteXMLCommon -{ - // - virtual ~IWriteXMLSource(){} - // reference counting - virtual void AddRef() = 0; - virtual void Release() = 0; - - virtual IWriteXMLSourcePtr BeginTable(const char* name) = 0; - virtual IWriteXMLSourcePtr BeginTableAt(int elem) = 0; - virtual bool HaveValue(const char* name) = 0; - virtual bool GetValue(const char* name, TValue& value, const XmlNodeRef& definition) = 0; - virtual bool EndTableAt(int elem) = 0; - virtual bool EndTable(const char* name) = 0; - - virtual IWriteXMLSourcePtr BeginArray(const char* name, size_t* numElems, const XmlNodeRef& definition) = 0; - virtual bool HaveElemAt(int elem) = 0; - virtual bool GetAt(int elem, TValue& value, const XmlNodeRef& definition) = 0; - virtual bool EndArray(const char* name) = 0; - - virtual bool Complete() = 0; - // -}; - -#endif // CRYINCLUDE_CRYCOMMON_IREADWRITEXMLSINK_H diff --git a/Code/Legacy/CryCommon/IRenderAuxGeom.h b/Code/Legacy/CryCommon/IRenderAuxGeom.h index d487cb483f..6627c41530 100644 --- a/Code/Legacy/CryCommon/IRenderAuxGeom.h +++ b/Code/Legacy/CryCommon/IRenderAuxGeom.h @@ -455,7 +455,7 @@ enum EAuxGeomPublicRenderflags_DepthWrite // EAuxGeomPublicRenderflagBitMasks enum EAuxGeomPublicRenderflags_DepthTest { - e_DepthTestOn = 0x0 << e_DepthTestShift, + e_DepthTestOn = 0x0 << e_DepthTestShift, e_DepthTestOff = 0x1 << e_DepthTestShift, }; @@ -465,10 +465,6 @@ enum EAuxGeomPublicRenderflags_Defaults // Default render flags for 3d primitives. e_Def3DPublicRenderflags = e_Mode3D | e_AlphaNone | e_DrawInFrontOff | e_FillModeSolid | e_CullModeBack | e_DepthWriteOn | e_DepthTestOn, - - // Default render flags for 2d primitives. - e_Def2DPublicRenderflags = e_Mode2D | e_AlphaNone | e_DrawInFrontOff | e_FillModeSolid | - e_CullModeBack | e_DepthWriteOn | e_DepthTestOn }; @@ -487,48 +483,15 @@ struct SAuxGeomRenderFlags bool operator !=(const SAuxGeomRenderFlags& rhs) const; bool operator !=(uint32 rhs) const; - // Summary: - // Gets the flags for 2D/3D rendering mode. - EAuxGeomPublicRenderflags_Mode2D3D GetMode2D3DFlag() const; - // Summary: - // Sets the flags for 2D/3D rendering mode. - void SetMode2D3DFlag(const EAuxGeomPublicRenderflags_Mode2D3D& state); - - // Summary: - // Gets the flags for alpha blend mode. - EAuxGeomPublicRenderflags_AlphaBlendMode GetAlphaBlendMode() const; - // Summary: - // Sets the flags for the alpha blend mode. - void SetAlphaBlendMode(const EAuxGeomPublicRenderflags_AlphaBlendMode& state); - - - EAuxGeomPublicRenderflags_DrawInFrontMode GetDrawInFrontMode() const; void SetDrawInFrontMode(const EAuxGeomPublicRenderflags_DrawInFrontMode& state); - // Summary: - // Gets the flags for the filling mode. - EAuxGeomPublicRenderflags_FillMode GetFillMode() const; // Summary: // Sets the flags for the filling mode. void SetFillMode(const EAuxGeomPublicRenderflags_FillMode& state); - // Summary: - // Gets the flags for the culling mode. - EAuxGeomPublicRenderflags_CullMode GetCullMode() const; // Summary: // Sets the flags for the culling mode. void SetCullMode(const EAuxGeomPublicRenderflags_CullMode& state); - - - EAuxGeomPublicRenderflags_DepthWrite GetDepthWriteFlag() const; - void SetDepthWriteFlag(const EAuxGeomPublicRenderflags_DepthWrite& state); - - // Summary: - // Gets the flags for the depth test. - EAuxGeomPublicRenderflags_DepthTest GetDepthTestFlag() const; - // Summary: - // Sets the flags for the depth test. - void SetDepthTestFlag(const EAuxGeomPublicRenderflags_DepthTest& state); }; @@ -596,86 +559,6 @@ SAuxGeomRenderFlags::operator !=(uint32 rhs) const } -inline EAuxGeomPublicRenderflags_Mode2D3D -SAuxGeomRenderFlags::GetMode2D3DFlag() const -{ - int mode2D3D((int)(m_renderFlags & (uint32)e_Mode2D3DMask)); - switch (mode2D3D) - { - case e_Mode2D: - { - return(e_Mode2D); - } - case e_Mode3D: - default: - { - assert(e_Mode3D == mode2D3D); - return(e_Mode3D); - } - } -} - - -inline void -SAuxGeomRenderFlags::SetMode2D3DFlag(const EAuxGeomPublicRenderflags_Mode2D3D& state) -{ - m_renderFlags &= ~e_Mode2D3DMask; - m_renderFlags |= state; -} - - -inline EAuxGeomPublicRenderflags_AlphaBlendMode -SAuxGeomRenderFlags::GetAlphaBlendMode() const -{ - uint32 alphaBlendMode(m_renderFlags & e_AlphaBlendingMask); - switch (alphaBlendMode) - { - case e_AlphaAdditive: - { - return(e_AlphaAdditive); - } - case e_AlphaBlended: - { - return(e_AlphaBlended); - } - case e_AlphaNone: - default: - { - assert(e_AlphaNone == alphaBlendMode); - return(e_AlphaNone); - } - } -} - - -inline void -SAuxGeomRenderFlags::SetAlphaBlendMode(const EAuxGeomPublicRenderflags_AlphaBlendMode& state) -{ - m_renderFlags &= ~e_AlphaBlendingMask; - m_renderFlags |= state; -} - - -inline EAuxGeomPublicRenderflags_DrawInFrontMode -SAuxGeomRenderFlags::GetDrawInFrontMode() const -{ - uint32 drawInFrontMode(m_renderFlags & e_DrawInFrontMask); - switch (drawInFrontMode) - { - case e_DrawInFrontOff: - { - return(e_DrawInFrontOff); - } - case e_DrawInFrontOn: - default: - { - assert(e_DrawInFrontOn == drawInFrontMode); - return(e_DrawInFrontOn); - } - } -} - - inline void SAuxGeomRenderFlags::SetDrawInFrontMode(const EAuxGeomPublicRenderflags_DrawInFrontMode& state) { @@ -683,31 +566,6 @@ SAuxGeomRenderFlags::SetDrawInFrontMode(const EAuxGeomPublicRenderflags_DrawInFr m_renderFlags |= state; } - -inline EAuxGeomPublicRenderflags_FillMode -SAuxGeomRenderFlags::GetFillMode() const -{ - uint32 fillMode(m_renderFlags & e_FillModeMask); - switch (fillMode) - { - case e_FillModePoint: - { - return(e_FillModePoint); - } - case e_FillModeWireframe: - { - return(e_FillModeWireframe); - } - case e_FillModeSolid: - default: - { - assert(e_FillModeSolid == fillMode); - return(e_FillModeSolid); - } - } -} - - inline void SAuxGeomRenderFlags::SetFillMode(const EAuxGeomPublicRenderflags_FillMode& state) { @@ -715,117 +573,9 @@ SAuxGeomRenderFlags::SetFillMode(const EAuxGeomPublicRenderflags_FillMode& state m_renderFlags |= state; } - -inline EAuxGeomPublicRenderflags_CullMode -SAuxGeomRenderFlags::GetCullMode() const -{ - uint32 cullMode(m_renderFlags & e_CullModeMask); - switch (cullMode) - { - case e_CullModeNone: - { - return(e_CullModeNone); - } - case e_CullModeFront: - { - return(e_CullModeFront); - } - case e_CullModeBack: - default: - { - assert(e_CullModeBack == cullMode); - return(e_CullModeBack); - } - } -} - - inline void SAuxGeomRenderFlags::SetCullMode(const EAuxGeomPublicRenderflags_CullMode& state) { m_renderFlags &= ~e_CullModeMask; m_renderFlags |= state; } - - -inline EAuxGeomPublicRenderflags_DepthWrite -SAuxGeomRenderFlags::GetDepthWriteFlag() const -{ - uint32 depthWriteFlag(m_renderFlags & e_DepthWriteMask); - switch (depthWriteFlag) - { - case e_DepthWriteOff: - { - return(e_DepthWriteOff); - } - case e_DepthWriteOn: - default: - { - assert(e_DepthWriteOn == depthWriteFlag); - return(e_DepthWriteOn); - } - } -} - - -inline void -SAuxGeomRenderFlags::SetDepthWriteFlag(const EAuxGeomPublicRenderflags_DepthWrite& state) -{ - m_renderFlags &= ~e_DepthWriteMask; - m_renderFlags |= state; -} - - -inline EAuxGeomPublicRenderflags_DepthTest -SAuxGeomRenderFlags::GetDepthTestFlag() const -{ - uint32 depthTestFlag(m_renderFlags & e_DepthTestMask); - switch (depthTestFlag) - { - case e_DepthTestOff: - { - return(e_DepthTestOff); - } - case e_DepthTestOn: - default: - { - assert(e_DepthTestOn == depthTestFlag); - return(e_DepthTestOn); - } - } -} - - -inline void -SAuxGeomRenderFlags::SetDepthTestFlag(const EAuxGeomPublicRenderflags_DepthTest& state) -{ - m_renderFlags &= ~e_DepthTestMask; - m_renderFlags |= state; -} - - -class CRenderAuxGeomRenderFlagsRestore -{ -public: - explicit CRenderAuxGeomRenderFlagsRestore(IRenderAuxGeom* pRender); - ~CRenderAuxGeomRenderFlagsRestore(); - -private: - IRenderAuxGeom* m_pRender; - SAuxGeomRenderFlags m_backuppedRenderFlags; - - // copy-construction not supported - CRenderAuxGeomRenderFlagsRestore(const CRenderAuxGeomRenderFlagsRestore&); - CRenderAuxGeomRenderFlagsRestore& operator=(const CRenderAuxGeomRenderFlagsRestore&); -}; - -inline CRenderAuxGeomRenderFlagsRestore::CRenderAuxGeomRenderFlagsRestore(IRenderAuxGeom* pRender) -{ - m_pRender = pRender; - m_backuppedRenderFlags = m_pRender->GetRenderFlags(); -} - -inline CRenderAuxGeomRenderFlagsRestore::~CRenderAuxGeomRenderFlagsRestore() -{ - m_pRender->SetRenderFlags(m_backuppedRenderFlags); -} diff --git a/Code/Legacy/CryCommon/IRenderer.h b/Code/Legacy/CryCommon/IRenderer.h index ab185b3bbc..495c885e44 100644 --- a/Code/Legacy/CryCommon/IRenderer.h +++ b/Code/Legacy/CryCommon/IRenderer.h @@ -193,32 +193,3 @@ struct DynUiPrimitive : public AZStd::intrusive_slist_node int m_numIndices = 0; }; using DynUiPrimitiveList = AZStd::intrusive_slist>; - -class CLodValue -{ -public: - CLodValue() = default; - - CLodValue(int nLodA) - { - m_nLodA = aznumeric_caster(nLodA); - } - - CLodValue(int nLodA, uint8 nDissolveRef, int nLodB) - { - m_nLodA = aznumeric_caster(nLodA); - m_nLodB = aznumeric_caster(nLodB); - m_nDissolveRef = nDissolveRef; - } - - int LodA() const { return m_nLodA; } - int LodB() const { return m_nLodB; } - - uint8 DissolveRefA() const { return m_nDissolveRef; } - uint8 DissolveRefB() const { return 255 - m_nDissolveRef; } - -private: - int16 m_nLodA = -1; - int16 m_nLodB = -1; - uint8 m_nDissolveRef = 0; -}; diff --git a/Code/Legacy/CryCommon/ISerialize.h b/Code/Legacy/CryCommon/ISerialize.h index 82ba9aef0d..c253796109 100644 --- a/Code/Legacy/CryCommon/ISerialize.h +++ b/Code/Legacy/CryCommon/ISerialize.h @@ -6,144 +6,24 @@ * */ - // Description : main header file - - -#ifndef CRYINCLUDE_CRYCOMMON_ISERIALIZE_H -#define CRYINCLUDE_CRYCOMMON_ISERIALIZE_H #pragma once +#include #include #include -#include "MiniQueue.h" -#include #include -#include -#include +// Forward declarations class CTimeValue; -// Forward template declaration -template -class InterpolatedValue_tpl; - -// Unfortunately this needs to be here - should be in CryNetwork somewhere. -struct SNetObjectID -{ - static const uint16 InvalidId = std::numeric_limits::max(); - - SNetObjectID() - : id(InvalidId) - , salt(0) {} - SNetObjectID(uint16 i, uint16 s) - : id(i) - , salt(s) {} - - uint16 id; - uint16 salt; - - ILINE bool operator!() const - { - return id == InvalidId; - } - typedef uint16 (SNetObjectID::* unknown_bool_type); - ILINE operator unknown_bool_type() const - { - return !!(*this) ? &SNetObjectID::id : NULL; - } - ILINE bool operator!=(const SNetObjectID& rhs) const - { - return !(*this == rhs); - } - ILINE bool operator==(const SNetObjectID& rhs) const - { - return id == rhs.id && salt == rhs.salt; - } - ILINE bool operator<(const SNetObjectID& rhs) const - { - return id < rhs.id || (id == rhs.id && salt < rhs.salt); - } - ILINE bool operator>(const SNetObjectID& rhs) const - { - return id > rhs.id || (id == rhs.id && salt > rhs.salt); - } - - bool IsLegal() const - { - return salt != 0; - } - - const char* GetText(char* tmpBuf = nullptr, size_t bufferSize = 0) const - { - static char singlebuf[64]; - if (!tmpBuf) - { - tmpBuf = singlebuf; - bufferSize = sizeof(singlebuf); - } - - if (id == InvalidId) - { - sprintf_s(tmpBuf, bufferSize, ""); - } - else if (!salt) - { - sprintf_s(tmpBuf, bufferSize, "illegal:%d:%d", id, salt); - } - else - { - sprintf_s(tmpBuf, bufferSize, "%d:%d", id, salt); - } - - return tmpBuf; - } - - uint32 GetAsUint32() const - { - return (uint32(salt) << 16) | id; - } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const { /*nothing*/} -}; // this enumeration details what "kind" of serialization we are // performing, so that classes that want to, for instance, tailor // the data they present depending on where data is being written // to can do so -enum ESerializationTarget +enum class ESerializationTarget { eST_SaveGame, - eST_Network, - eST_Script -}; - -// this inner class defines an interface so that OnUpdate -// functions can be passed abstractly through to concrete -// serialization classes -struct ISerializeUpdateFunction -{ - // - virtual ~ISerializeUpdateFunction(){} - virtual void Execute() = 0; - // -}; - -// concrete implementation of IUpdateFunction for a general functor class -template -class CSerializeUpdateFunction - : public ISerializeUpdateFunction -{ -public: - CSerializeUpdateFunction(F_Update& update) - : m_rUpdate(update) {} - - virtual void Execute() - { - m_rUpdate(); - } - -private: - F_Update m_rUpdate; }; ////////////////////////////////////////////////////////////////////////// @@ -151,34 +31,68 @@ private: ////////////////////////////////////////////////////////////////////////// struct SSerializeString { - SSerializeString() {}; - SSerializeString(const SSerializeString& src) { m_str.assign(src.c_str()); }; + SSerializeString(){}; + SSerializeString(const SSerializeString& src) + { + m_str.assign(src.c_str()); + }; explicit SSerializeString(const char* sbegin, const char* send) - : m_str(sbegin, send) {}; - ~SSerializeString() {} + : m_str(sbegin, send){}; + ~SSerializeString() + { + } // Casting to const char* SSerializeString(const char* s) - : m_str(s) { }; - //operator const char* () const { return m_str; } + : m_str(s){}; - SSerializeString& operator =(const SSerializeString& src) { m_str.assign(src.c_str()); return *this; } - SSerializeString& operator =(const char* src) { m_str.assign(src); return *this; } + SSerializeString& operator=(const SSerializeString& src) + { + m_str.assign(src.c_str()); + return *this; + } + SSerializeString& operator=(const char* src) + { + m_str.assign(src); + return *this; + } - bool operator != (const SSerializeString& src) { return m_str != src.m_str; } + bool operator!=(const SSerializeString& src) + { + return m_str != src.m_str; + } - size_t size() const { return m_str.size(); } - size_t length() const { return m_str.length(); } - const char* c_str() const { return m_str.c_str(); }; - bool empty() const { return m_str.empty(); } - void resize(int sz) { m_str.resize(sz); } - void reserve(int sz) { m_str.reserve(sz); } + size_t size() const + { + return m_str.size(); + } + size_t length() const + { + return m_str.length(); + } + const char* c_str() const + { + return m_str.c_str(); + }; + bool empty() const + { + return m_str.empty(); + } + void resize(int sz) + { + m_str.resize(sz); + } + void reserve(int sz) + { + m_str.reserve(sz); + } void set_string(const AZStd::string& s) { m_str.assign(s.begin(), s.size()); } - operator const AZStd::string() const { + operator const AZStd::string() const + { return m_str; } @@ -195,21 +109,17 @@ struct ISerialize { static const int ENUM_POLICY_TAG = 0xe0000000; - ILINE ISerialize() {} + ISerialize() + { + } - // - virtual ~ISerialize(){} + virtual ~ISerialize() + { + } // this is for string values -- they need special support - virtual void ReadStringValue(const char* name, SSerializeString& curValue, uint32 policy = 0) = 0; - virtual void WriteStringValue(const char* name, SSerializeString& buffer, uint32 policy = 0) = 0; - // this function should be implemented to call the passed in interface - // if we are reading, and to not call it if we are writing - virtual void Update(ISerializeUpdateFunction* pUpdate) = 0; - - // for network updates: notify the network engine that this value was only partially read and we - // should re-request an update from the server soon - virtual void FlagPartialRead() = 0; + virtual void ReadStringValue(const char* name, SSerializeString& curValue) = 0; + virtual void WriteStringValue(const char* name, SSerializeString& buffer) = 0; ////////////////////////////////////////////////////////////////////////// // these functions should be implemented to deal with groups @@ -224,43 +134,18 @@ struct ISerialize ////////////////////////////////////////////////////////////////////////// virtual bool IsReading() const = 0; - virtual bool ShouldCommitValues() const = 0; - virtual ESerializationTarget GetSerializationTarget() const = 0; - virtual bool Ok() const = 0; - // // declare all primitive Value() implementations #define SERIALIZATION_TYPE(T) \ - virtual void Value(const char* name, T & x, uint32 policy) = 0; + virtual void Value(const char* name, T& x) = 0; #include "SerializationTypes.h" #undef SERIALIZATION_TYPE - - // declare all primitive Value() implementations -#define SERIALIZATION_TYPE(T) \ - virtual void ValueWithDefault(const char* name, T & x, const T&defaultValue) = 0; -#include "SerializationTypes.h" - SERIALIZATION_TYPE(SSerializeString) -#undef SERIALIZATION_TYPE - void Value([[maybe_unused]] const char* name, [[maybe_unused]] AZ::Vector3& x) - { - } - template - void Value(const char* name, B& x) - { - Value(name, x, 0); - } - - template - void Value(const char* name, B& x, uint32 policy); - - template - void ValueWithDefault(const char* name, B& x, const B& defaultValue); }; // this class provides a wrapper so that ISerialize can be used much more // easily; it is a template so that if we need to wrap a more specific // ISerialize implementation we can do so easily -template +template class CSerializeWrapper { public: @@ -276,507 +161,42 @@ public: // have been made to follow the trend. // the value function allows us to declare that a value needs - // to be serialized/deserialized; we can pass a serialization policy - // in order to compress the value, and an update function to allow - // us to be informed of when this value is changed - template - ILINE void Value(const char* szName, T_Value& value, int policy) - { - m_pSerialize->Value(szName, value, policy); - } + // to be serialized/deserialized; - template + template ILINE void Value(const char* szName, T_Value& value) { m_pSerialize->Value(szName, value); } - void Value(const char* szName, AZStd::string& value, int policy) + void Value(const char* szName, AZStd::string& value) { if (IsWriting()) { SSerializeString& serializeString = SetSharedSerializeString(value); - m_pSerialize->WriteStringValue(szName, serializeString, policy); + m_pSerialize->WriteStringValue(szName, serializeString); } else { - if (GetSerializationTarget() != eST_Script) - { - value = ""; - } - + value = ""; SSerializeString& serializeString = SetSharedSerializeString(value); - m_pSerialize->ReadStringValue(szName, serializeString, policy); + m_pSerialize->ReadStringValue(szName, serializeString); value = serializeString.c_str(); } } - ILINE void Value(const char* szName, AZStd::string& value) - { - Value(szName, value, 0); - } - void Value(const char* szName, const AZStd::string& value, int policy) + void Value(const char* szName, const AZStd::string& value) { if (IsWriting()) { SSerializeString& serializeString = SetSharedSerializeString(value); - m_pSerialize->WriteStringValue(szName, serializeString, policy); + m_pSerialize->WriteStringValue(szName, serializeString); } else { assert(0 && "This function can only be used for Writing"); } } - ILINE void Value(const char* szName, const AZStd::string& value) - { - Value(szName, value, 0); - } - template - void Value(const char* szName, T_Class* pInst, T_Value (T_Class::* get)() const, void (T_Class::* set)(T_Value)) - { - if (IsWriting()) - { - T_Value temp = (pInst->*get)(); - Value(szName, temp); - } - else - { - T_Value temp; - Value(szName, temp); - (pInst->*set)(temp); - } - } - template - void Value(const char* name, InterpolatedValue_tpl& val) - { - if (IsWriting()) - { - T a = val.Get(); - Value(name, a); - } - - if (IsReading()) - { - T a; - Value(name, a); - val.SetGoal(a); - } - } - - template - void Value(const char* name, InterpolatedValue_tpl& val, int policy) - { - if (IsWriting()) - { - T a = val.Get(); - Value(name, a, policy); - } - - if (IsReading()) - { - T a; - Value(name, a, policy); - val.SetGoal(a); - } - } - - bool ValueChar(const char* name, char* buffer, int len) - { - AZStd::string temp; - if (IsReading()) - { - Value(name, temp); - if ((int)temp.length() > len - 1) - { - return false; // truncated read - } - memcpy(buffer, temp.data(), temp.length() + 1); - buffer[len - 1] = 0; - } - else - { - temp = AZStd::string(buffer, buffer + len); - Value(name, temp); - } - return true; - } - - template - void ValueWithDefault(const char* name, T& x, const T& defaultValue) - { - m_pSerialize->ValueWithDefault(name, x, defaultValue); - } - - void ValueWithDefault(const char* szName, AZStd::string& value, const AZStd::string& defaultValue) - { - static SSerializeString defaultSerializeString; - - { - defaultSerializeString.set_string(defaultValue); - } - - SSerializeString& serializeString = SetSharedSerializeString(value); - m_pSerialize->ValueWithDefault(szName, serializeString, defaultSerializeString); - if (IsReading()) - { - value = serializeString.c_str(); - } - } - - template - void Value(const char* szName, T_Class* pInst, T_Value (T_Class::* get)() const, void (T_Class::* set)(T_Value), - const T_SerializationPolicy& policy) - { - if (IsWriting()) - { - T_Value temp = (pInst->*get)(); - Value(szName, temp, policy); - } - else - { - T_Value temp = static_cast(0); - Value(szName, temp, policy); - (pInst->*set)(temp); - } - } - - // a value that is written by referring to a map of key/value pairs - we receive the key, and write the value - template - void MappedValue(const char* szName, T_Key& value, const T_Map& mapper) - { - typedef typename T_Map::ValueType T_Value; - - if (IsWriting()) - { - T_Value write = mapper.KeyToValue(value); - Value(szName, write); - } - else - { - T_Value read; - Value(szName, read); - value = mapper.ValueToKey(read); - } - } - -#define CONTAINER_VALUE(container_type, insert_function) \ - template \ - void Value(const char* name, container_type&cont) \ - { \ - if (!BeginOptionalGroup(name, true)) {return; } \ - if (IsWriting()) \ - { \ - uint32 count = cont.size(); \ - Value("Size", count); \ - for (typename container_type::iterator iter = cont.begin(); iter != cont.end(); ++iter) \ - { \ - BeginGroup("i"); \ - T_Value value = *iter; \ - Value("v", value); \ - EndGroup(); \ - } \ - } \ - else \ - { \ - cont.clear(); \ - uint32 count = 0; \ - Value("Size", count); \ - while (count--) \ - { \ - BeginGroup("i"); \ - T_Value temp; \ - Value("v", temp); \ - cont.insert_function(temp); \ - EndGroup(); \ - } \ - } \ - EndGroup(); \ - } \ - template \ - void MappedValue(const char* name, container_type&cont, const T_Map&mapper) \ - { \ - if (!BeginOptionalGroup(name, true)) {return; } \ - if (IsWriting()) \ - { \ - uint32 count = cont.size(); \ - Value("Size", count); \ - for (typename container_type::iterator iter = cont.begin(); iter != cont.end(); ++iter) \ - { \ - BeginGroup("i"); \ - MappedValue("v", *iter, mapper); \ - EndGroup(); \ - } \ - } \ - else \ - { \ - cont.clear(); \ - uint32 count = 0; \ - Value("Size", count); \ - while (count--) \ - { \ - BeginGroup("i"); \ - T_Value temp; \ - MappedValue("v", temp, mapper); \ - cont.insert_function(temp); \ - EndGroup(); \ - } \ - } \ - EndGroup(); \ - } - -#define PAIR_CONTAINER_VALUE(container_type, insert_function) \ - template \ - void Value(const char* name, container_type, Allocator>&cont) \ - { \ - if (!BeginOptionalGroup(name, true)) {return; } \ - if (IsWriting()) \ - { \ - uint32 count = cont.size(); \ - Value("Size", count); \ - for (typename container_type, Allocator>::iterator iter = cont.begin(); iter != cont.end(); ++iter) \ - { \ - BeginGroup("i"); \ - T_Value1 value1 = iter->first; \ - T_Value2 value2 = iter->second; \ - Value("v1", value1); \ - Value("v2", value2); \ - EndGroup(); \ - } \ - } \ - else \ - { \ - cont.clear(); \ - uint32 count = 0; \ - Value("Size", count); \ - while (count--) \ - { \ - BeginGroup("i"); \ - T_Value1 temp1; \ - T_Value2 temp2; \ - Value("v1", temp1); \ - Value("v2", temp2); \ - cont.insert_function(std::pair(temp1, temp2)); \ - EndGroup(); \ - } \ - } \ - EndGroup(); \ - } \ - - CONTAINER_VALUE(std::vector, push_back); - CONTAINER_VALUE(std::list, push_back); - CONTAINER_VALUE(std::set, insert); - CONTAINER_VALUE(std::deque, push_back); - - PAIR_CONTAINER_VALUE(std::list, push_back); - PAIR_CONTAINER_VALUE(std::vector, push_back); - - template - void DummyValues(uint32 numDummyValues) - { - T_Value dummyValue; - for (uint32 i = 0; i < numDummyValues; ++i) - { - Value("Value", dummyValue); - } - } - - template - void Value(const char* name, MiniQueue& cont) - { - if (!BeginOptionalGroup(name, true)) - { - return; - } - if (IsWriting()) - { - uint32 count = cont.Size(); - Value("Size", count); - for (typename MiniQueue::SIterator iter = cont.Begin(); iter != cont.End(); ++iter) - { - T_Value value = *iter; - Value("Value", value); - } - } - else - { - cont.Clear(); - uint32 count = 0; - Value("Size", count); - while (count--) - { - T_Value temp; - Value("Value", temp); - cont.Push(temp); - } - } - DummyValues(cont.Capacity() - cont.Size()); - EndGroup(); - } - template - void MappedValue(const char* name, MiniQueue& cont, const T_Map& mapper) - { - if (!BeginOptionalGroup(name, true)) - { - return; - } - if (IsWriting()) - { - uint8 count = cont.Size(); - Value("Size", count); - for (typename MiniQueue::SIterator iter = cont.Begin(); iter != cont.End(); ++iter) - { - BeginGroup("i"); - MappedValue("Value", *iter, mapper); - EndGroup(); - } - } - else - { - cont.Clear(); - uint8 count = 0; - Value("Size", count); - while (count--) - { - BeginGroup("i"); - T_Value temp; - MappedValue("Value", temp, mapper); - cont.Push(temp); - EndGroup(); - } - } - EndGroup(); - } - -#define MAP_CONTAINER_VALUE(container_type) \ - template \ - void Value(const char* name, container_type&cont) \ - { \ - if (!BeginOptionalGroup(name, true)) {return; } \ - if (IsWriting()) \ - { \ - uint32 count = (uint32)cont.size(); \ - Value("Size", count); \ - for (typename container_type::iterator iter = cont.begin(); iter != cont.end(); ++iter) \ - { \ - T_Key tempKey = iter->first; \ - BeginGroup("pair"); \ - Value("k", tempKey); \ - Value("v", iter->second); \ - EndGroup(); \ - } \ - } \ - else \ - { \ - cont.clear(); \ - uint32 count; \ - Value("Size", count); \ - while (count--) \ - { \ - std::pair temp; \ - BeginGroup("pair"); \ - Value("k", temp.first); \ - Value("v", temp.second); \ - EndGroup(); \ - cont.insert(temp); \ - } \ - } \ - EndGroup(); \ - } - -#define HASH_CONTAINER_VALUE(container_type) \ - template \ - void Value(const char* name, container_type&cont) \ - { \ - if (!BeginOptionalGroup(name, true)) {return; } \ - if (IsWriting()) \ - { \ - uint32 count = (uint32)cont.size(); \ - Value("Size", count); \ - for (typename container_type::iterator iter = cont.begin(); iter != cont.end(); ++iter) \ - { \ - T_Key tempKey = iter->first; \ - BeginGroup("pair"); \ - Value("k", tempKey); \ - Value("v", iter->second); \ - EndGroup(); \ - } \ - } \ - else \ - { \ - cont.clear(); \ - uint32 count; \ - Value("Size", count); \ - while (count--) \ - { \ - AZStd::pair temp; \ - BeginGroup("pair"); \ - Value("k", temp.first); \ - Value("v", temp.second); \ - EndGroup(); \ - cont.insert(temp); \ - } \ - } \ - EndGroup(); \ - } - MAP_CONTAINER_VALUE(std::map); - MAP_CONTAINER_VALUE(std::multimap); - MAP_CONTAINER_VALUE(VectorMap); - - HASH_CONTAINER_VALUE(AZStd::unordered_map); - - template - ILINE void EnumValue(const char* szName, T_Value& value, - T_Value first, T_Value last) - { - int32 nValue = int32(value) - first; - Value(szName, nValue, ISerialize::ENUM_POLICY_TAG | (last - first)); - value = T_Value(nValue + first); - } - template - ILINE void EnumValue(const char* szName, - T_Class* pClass, T_Value (T_Class::* GetValue)() const, void (T_Class::* SetValue)(T_Value), - T_Value first, T_Value last) - { - bool w = IsWriting(); - int nValue; - if (w) - { - nValue = int32((pClass->*GetValue)()) - first; - } - Value(szName, nValue, ISerialize::ENUM_POLICY_TAG | (last - first)); - if (!w) - { - (pClass->*SetValue)(T_Value(nValue + first)); - } - } - /* - // we can request that a functor be called whenever our values - // are being updated by calling this function - template - ILINE void OnUpdate( F_Update& update ) - { - CUpdateFunction func(update); - m_pSerialize->Update( &func ); - } - template - ILINE void OnUpdate( T * pCls, void (T::*func)() ) - { - class CFunc : public IUpdateFunction - { - public: - CFunc( T * pCls, void (T::*func)() ) : m_pCls(pCls), m_func(func) {} - virtual void Execute() - { - (m_pCls->*m_func)(); - } - private: - T * m_pCls; - void (T::*m_func)(); - }; - CFunc ifunc( pCls, func ); - m_pSerialize->Update( &ifunc ); - } - */ // groups help us find common data ILINE void BeginGroup(const char* szName) { @@ -791,12 +211,6 @@ public: m_pSerialize->EndGroup(); } - // fetch the serialization target - ILINE ESerializationTarget GetSerializationTarget() const - { - return m_pSerialize->GetSerializationTarget(); - } - ILINE bool IsWriting() const { return !m_pSerialize->IsReading(); @@ -805,27 +219,12 @@ public: { return m_pSerialize->IsReading(); } - ILINE bool ShouldCommitValues() const - { - assert(m_pSerialize->IsReading()); - return m_pSerialize->ShouldCommitValues(); - } - - ILINE bool Ok() const - { - return m_pSerialize->Ok(); - } friend ILINE TISerialize* GetImpl(CSerializeWrapper ser) { return ser.m_pSerialize; } - ILINE void FlagPartialRead() - { - m_pSerialize->FlagPartialRead(); - } - operator CSerializeWrapper() { return CSerializeWrapper(m_pSerialize); @@ -844,65 +243,3 @@ private: // default serialize class to use!! typedef CSerializeWrapper TSerialize; - -// simple struct to declare something serializable... useful for -// exposition -struct ISerializable -{ - virtual ~ISerializable(){} - virtual void SerializeWith(TSerialize) = 0; -}; - -template -void ISerialize::Value(const char* name, B& x, uint32 policy) -{ - if (!BeginOptionalGroup(name, true)) - { - return; - } - TSerialize ser(this); - x.Serialize(ser); - EndGroup(); -} -// -//template <> -//void ISerialize::Value(const char * name, AZ::Vector3& x, uint32 policy) -//{ -// -//} - -// Based off ValueWithDefault in SimpleSerialize.h -template -void ISerialize::ValueWithDefault(const char* name, B& x, const B& defaultValue) -{ - if (BeginOptionalGroup(name, x != defaultValue)) - { - TSerialize ser(this); - x.Serialize(ser); - EndGroup(); - } - else if (IsReading()) - { - x = defaultValue; - } -} - -////////////////////////////////////////////////////////////////////////// -// Used to automatically Begin/End group in serialization stream -////////////////////////////////////////////////////////////////////////// -struct SSerializeScopedBeginGroup -{ - SSerializeScopedBeginGroup(TSerialize& ser, const char* sGroupName) - { - m_pSer = &ser; - m_pSer->BeginGroup(sGroupName); - } - ~SSerializeScopedBeginGroup() - { - m_pSer->EndGroup(); - } -private: - TSerialize* m_pSer; -}; - -#endif // CRYINCLUDE_CRYCOMMON_ISERIALIZE_H diff --git a/Code/Legacy/CryCommon/IShader.h b/Code/Legacy/CryCommon/IShader.h index e9a00d3b76..208af79ece 100644 --- a/Code/Legacy/CryCommon/IShader.h +++ b/Code/Legacy/CryCommon/IShader.h @@ -41,7 +41,6 @@ enum EEfResTextures : int // This needs a fixed size so the enum can be forward enum EParamType { eType_UNKNOWN, - eType_BYTE, eType_BOOL, eType_SHORT, eType_INT, @@ -90,10 +89,6 @@ struct SShaderItem IRenderShaderResources* m_pShaderResources; int32 m_nTechnique; uint32 m_nPreprocessFlags; - - bool Update(); - bool RefreshResourceConstants(); - inline struct SShaderTechnique* GetTechnique() const; }; struct IAnimNode; diff --git a/Code/Legacy/CryCommon/ISplines.h b/Code/Legacy/CryCommon/ISplines.h index a1c5c674b0..5104e80bc0 100644 --- a/Code/Legacy/CryCommon/ISplines.h +++ b/Code/Legacy/CryCommon/ISplines.h @@ -347,8 +347,6 @@ namespace spline m_c[3] = T((2.0f * v0 - 2.0f * v1 + s0 + s1) * idt * idt * idt); } } - - void GetMemoryUsage(ICrySizer* pSizer) const {} }; inline float fast_fmod(float x, float y) @@ -410,7 +408,7 @@ namespace spline //! TCB spline key used in quaternion spline with angle axis as input. struct TCBAngAxisKey - : public TCBSplineKey + : public TCBSplineKey { float angle; Vec3 axis; diff --git a/Code/Legacy/CryCommon/IStatObj.h b/Code/Legacy/CryCommon/IStatObj.h index b2cde275c5..a809064bcc 100644 --- a/Code/Legacy/CryCommon/IStatObj.h +++ b/Code/Legacy/CryCommon/IStatObj.h @@ -5,43 +5,14 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - - #pragma once -#include "smartptr.h" // TYPEDEF_AUTOPTR -#include "IMaterial.h" - -// forward declarations -////////////////////////////////////////////////////////////////////// -struct ShadowMapFrustum; -struct SRenderingPassInfo; -struct SRendItemSorter; -struct ITetrLattice; -struct SPhysGeomArray; -struct CStatObj; - -class CRenderObject; -class CDLight; -class IReadStream; -class CLodValue; - - -TYPEDEF_AUTOPTR(IReadStream); - -//! Interface to non animated object -struct phys_geometry; -struct IChunkFile; - -// General forward declaration. -struct SMeshLodInfo; - -#include "Cry_Color.h" #include "Cry_Math.h" #include "Cry_Geo.h" -#include "CrySizer.h" +#include "IMaterial.h" -#define MAX_STATOBJ_LODS_NUM 6 +// General forward declaration. +struct SRenderingPassInfo; ////////////////////////////////////////////////////////////////////////// // Type of static sub object. @@ -50,184 +21,46 @@ enum EStaticSubObjectType { STATIC_SUB_OBJECT_MESH, // This simple geometry part of the multi-sub object geometry. STATIC_SUB_OBJECT_HELPER_MESH, // Special helper mesh, not rendered usually, used for broken pieces. - STATIC_SUB_OBJECT_POINT, - STATIC_SUB_OBJECT_DUMMY, - STATIC_SUB_OBJECT_XREF, - STATIC_SUB_OBJECT_CAMERA, - STATIC_SUB_OBJECT_LIGHT, }; -////////////////////////////////////////////////////////////////////////// -// Flags that can be set on static object. -////////////////////////////////////////////////////////////////////////// -enum EStaticObjectFlags -{ - STATIC_OBJECT_HIDDEN = BIT(0), // When set static object will not be displayed. - STATIC_OBJECT_CLONE = BIT(1), // specifies whether this object was cloned for modification - STATIC_OBJECT_GENERATED = BIT(2), // tells that the object was generated procedurally (breakable obj., f.i.) - STATIC_OBJECT_CANT_BREAK = BIT(3), // StatObj has geometry unsuitable for procedural breaking - STATIC_OBJECT_DEFORMABLE = BIT(4), // StatObj can be procedurally smeared (using SmearStatObj) - STATIC_OBJECT_COMPOUND = BIT(5), // StatObj has subobject meshes - STATIC_OBJECT_MULTIPLE_PARENTS = BIT(6), // Child StatObj referenced by several parents - - // Collisions - STATIC_OBJECT_NO_PLAYER_COLLIDE = BIT(10), - - // Special flags. - STATIC_OBJECT_SPAWN_ENTITY = BIT(20), // StatObj spawns entity when broken. - STATIC_OBJECT_NO_AUTO_HIDEPOINTS = BIT(22), // Do not generate AI auto hide points around object if it's dynamic - STATIC_OBJECT_DYNAMIC = BIT(23), // mesh data should be kept in system memory (and yes, the name *is* an oxymoron) -}; - -#define HIT_NO_HIT (-1) -#define HIT_UNKNOWN (-2) - -#define HIT_OBJ_TYPE_BRUSH 0 -#define HIT_OBJ_TYPE_TERRAIN 1 -#define HIT_OBJ_TYPE_VISAREA 2 - // used for on-CPU voxelization -struct SRayHitTriangle -{ - SRayHitTriangle() { ZeroStruct(*this); } - Vec3 v[3]; - Vec2 t[3]; - ColorB c[3]; - Vec3 n; - _smart_ptr pMat; - uint8 nTriArea; - uint8 nOpacity; - uint8 nHitObjType; -}; - struct SRayHitInfo { SRayHitInfo() { memset(this, 0, sizeof(*this)); - nHitTriID = HIT_UNKNOWN; } ////////////////////////////////////////////////////////////////////////// // Input parameters. Vec3 inReferencePoint; Ray inRay; - bool bInFirstHit; - bool inRetTriangle; - bool bUseCache; - bool bOnlyZWrite; - bool bGetVertColorAndTC; - float fMaxHitDistance; // When not 0, only hits with closer distance will be registered. - Vec3 vTri0; - Vec3 vTri1; - Vec3 vTri2; - float fMinHitOpacity; ////////////////////////////////////////////////////////////////////////// // Output parameters. - float fDistance; // Distance from reference point. Vec3 vHitPos; Vec3 vHitNormal; - int nHitMatID; // Material Id that was hit. - int nHitTriID; // Triangle Id that was hit. - int nHitSurfaceID; // Material Id that was hit. - struct IRenderMesh* pRenderMesh; - struct IStatObj* pStatObj; - Vec2 vHitTC; - Vec4 vHitColor; - Vec4 vHitTangent; - Vec4 vHitBitangent; - PodArray* pHitTris; -}; -enum EFileStreamingStatus -{ - ecss_NotLoaded, - ecss_InProgress, - ecss_Ready + // More inputs + bool bInFirstHit; + bool bUseCache; }; -struct SMeshBoneMapping_uint8; -struct SSpine; -struct SMeshColor; - // Summary: // Interface to hold static object data struct IStatObj { - //! Loading flags - enum ELoadingFlags - { - ELoadingFlagsPreviewMode = BIT(0), - ELoadingFlagsForceBreakable = BIT(1), - ELoadingFlagsIgnoreLoDs = BIT(2), - ELoadingFlagsTessellate = BIT(3), // if e_StatObjTessellation enabled - ELoadingFlagsJustGeometry = BIT(4), // for streaming, to avoid parsing all chunks - }; - ////////////////////////////////////////////////////////////////////////// // SubObject ////////////////////////////////////////////////////////////////////////// struct SSubObject { - SSubObject() { bShadowProxy = 0; } - EStaticSubObjectType nType; - AZStd::string name; - AZStd::string properties; - int nParent; // Index of the parent sub object, if there`s hierarchy between them. - Matrix34 tm; // Transformation matrix. Matrix34 localTM; // Local transformation matrix, relative to parent. IStatObj* pStatObj; // Static object for sub part of CGF. - Vec3 helperSize; // Size of the helper (if helper). - struct IRenderMesh* pWeights; // render mesh with a single deformation weights stream - unsigned int bIdentityMatrix : 1; // True if sub object matrix is identity. - unsigned int bHidden : 1; // True if sub object is hidden - unsigned int bShadowProxy : 1; // Child StatObj has 'shadowproxy' in name - unsigned int nBreakerJoints : 8; // number of joints that can switch this part to a broken state - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(name); - pSizer->AddObject(properties); - } }; ////////////////////////////////////////////////////////////////////////// - // - // Description: - // Increase the reference count of the object. - // Summary: - // Notifies that the object is being used - virtual int AddRef() = 0; - - // Description: - // Decrease the reference count of the object. If the reference count - // reaches zero, the object will be deleted from memory. - // Summary: - // Notifies that the object is no longer needed - virtual int Release() = 0; - - // Description: - // Set static object flags. - // Arguments: - // nFlags - flags to set, a combination of EStaticObjectFlags values. - virtual void SetFlags(int nFlags) = 0; - - // Description: - // Retrieve flags set on the static object. - virtual int GetFlags() const = 0; - - // Sets the default object indicator - virtual void SetDefaultObject(bool state) = 0; - - // Description: - // Retrieves the internal flag m_nVehicleOnlyPhysics. - virtual unsigned int GetVehicleOnlyPhysics() = 0; - - // Description: - // Retrieves the internal flag m_bBreakableByGame. - virtual unsigned int GetBreakableByGame() = 0; - + virtual ~IStatObj() {} // Description: // Provide access to the faces, vertices, texture coordinates, normals and // colors of the object used later for CRenderMesh construction. @@ -237,86 +70,6 @@ struct IStatObj // Get the object source geometry virtual struct IIndexedMesh* GetIndexedMesh(bool bCreateIfNone = false) = 0; - // Description: - // Create an empty indexed mesh ready to be filled with data - // If an indexed mesh already exists it is returned - // Return Value: - // An empty indexed mesh or the existing indexed mesh - virtual struct IIndexedMesh* CreateIndexedMesh() = 0; - - //! Access to rendering geometry for indoor engine ( optimized vert arrays, lists of shader pointers ) - virtual struct IRenderMesh* GetRenderMesh() = 0; - - // Description: - // Sets and replaces the physical representation of the object. - // Arguments: - // pPhysGeom - A pointer to a phys_geometry class. - // nType - Pass 0 to set the physic geometry or pass 1 to set the obstruct geometry - // Summary: - // Set the physic representation - virtual void SetPhysGeom(phys_geometry* pPhysGeom, int nType = 0) = 0; - - virtual float GetAIVegetationRadius() const = 0; - virtual void SetAIVegetationRadius(float radius) = 0; - - // Description: - // Set default material for the geometry. - // Arguments: - // pMaterial - A valid pointer to the material. - virtual void SetMaterial(_smart_ptr pMaterial) = 0; - - // Description: - // Returns default material of the geometry. - // Arguments: - // nType - Pass 0 to get the physic geometry or pass 1 to get the obstruct geometry - // Return Value: - // A pointer to a phys_geometry class. - virtual _smart_ptr GetMaterial() = 0; - virtual const _smart_ptr GetMaterial() const = 0; - - // Return Value: - // A Vec3 object containing the bounding box. - // Summary: - // Get the minimal bounding box component - virtual Vec3 GetBoxMin() = 0; - - // Return Value: - // A Vec3 object containing the bounding box. - // Summary: - // Get the minimal bounding box component - virtual Vec3 GetBoxMax() = 0; - - // Arguments: - // Minimum bounding box component - // Summary: - // Set the minimum bounding box component - virtual void SetBBoxMax(const Vec3& vBBoxMax) = 0; - - // Summary: - // Get the object radius - // Return Value: - // A float containing the radius - virtual float GetRadius() = 0; - - // Description: - // Reloads one or more component of the object. The possible flags - // are FRO_SHADERS, FRO_TEXTURES and FRO_GEOMETRY. - // Arguments: - // nFlags - One or more flag which indicate which element of the object - // to reload - // Summary: - // Reloads the object - virtual void Refresh(int nFlags) = 0; - - // Description: - // Registers the object elements into the renderer. - // Arguments: - // rParams - Render parameters - // nLogLevel - Level of the LOD - // Summary: - // Renders the object - virtual void Render(const struct SRendParams& rParams, const SRenderingPassInfo& passInfo) = 0; - // Summary: // Get the bounding box // Arguments: @@ -324,13 +77,6 @@ struct IStatObj // Maxs - Position of the top right far corner of the bounding box virtual AABB GetAABB() = 0; - // Summary: - // Generate a random point in object. - // Arguments: - // eForm - Object aspect to generate on (surface, volume, etc) - virtual float GetExtent(EGeomForm eForm) = 0; - virtual void GetRandomPos(PosNorm& ran, EGeomForm eForm) const = 0; - // Description: // Returns the LOD object, if present. // Arguments: @@ -341,64 +87,6 @@ struct IStatObj // Summary: // Get the LOD object virtual IStatObj* GetLodObject(int nLodLevel, bool bReturnNearest = false) = 0; - virtual IStatObj* GetLowestLod() = 0; - virtual int FindNearesLoadedLOD(int nLodIn, bool bSearchUp = false) = 0; - virtual int FindHighestLOD(int nBias) = 0; - - virtual AZStd::string& GetFileName() = 0; - virtual const AZStd::string& GetFileName() const = 0; - - // Summary: - // Returns the filename of the object - // Return Value: - // A null terminated string which contain the filename of the object. - virtual const char* GetFilePath() const = 0; - - // Summary: - // Set the filename of the object - // Arguments: - // szFileName - New filename of the object - // Return Value: - // None - virtual void SetFilePath(const char* szFileName) = 0; - - // Description: - // Will return the position of the helper named in the argument. The - // helper should have been specified during the exporting process of - // the cgf file. - // Arguments: - // szHelperName - A null terminated string holding the name of the helper - // Return Value: - // A Vec3 object which contains the position. - // Summary: - // Gets the position of a specified helper - virtual Vec3 GetHelperPos(const char* szHelperName) = 0; - - // Summary: - // Gets the transformation matrix of a specified helper, see GetHelperPos - virtual const Matrix34& GetHelperTM(const char* szHelperName) = 0; - - //! Tell us if the object is not found - virtual bool IsDefaultObject() = 0; - - // Summary: - // Free the geometry data - virtual void FreeIndexedMesh() = 0; - - // Pushes the underlying tree of objects into the given Sizer object for statistics gathering - virtual void GetMemoryUsage(class ICrySizer* pSizer) const = 0; - - //DOC-IGNORE-BEGIN - //! used for sprites - virtual float& GetRadiusVert() = 0; - - //! used for sprites - virtual float& GetRadiusHors() = 0; - //DOC-IGNORE-END - - // Summary: - // Determines if the object has physics capabilities - virtual bool IsPhysicsExist() = 0; // Summary: // Returns a pointer to the object @@ -406,12 +94,6 @@ struct IStatObj // A pointer to the current object, which is simply done like this "return this;" virtual struct IStatObj* GetIStatObj() { return this; } - // Summary: - // Invalidates geometry inside IStatObj, will mark hosted IIndexedMesh as invalid. - // Arguments: - // bPhysics - if true will also recreate physics for indexed mesh. - virtual void Invalidate(bool bPhysics = false, float tolerance = 0.05f) = 0; - ////////////////////////////////////////////////////////////////////////// // Interface to the Sub Objects. ////////////////////////////////////////////////////////////////////////// @@ -419,174 +101,10 @@ struct IStatObj // Retrieve number of sub-objects. virtual int GetSubObjectCount() const = 0; // Summary: - // Sets number of sub-objects. - virtual void SetSubObjectCount(int nCount) = 0; - // Summary: // Retrieve sub object by index, where 0 <= nIndex < GetSubObjectCount() - virtual IStatObj::SSubObject* GetSubObject(int nIndex) = 0; - // Summary: - // Check if this object is sub object of another IStatObj. - virtual bool IsSubObject() const = 0; - // Summary: - // Retrieve parent static object, only relevant when this IStatObj is Sub-object. - virtual IStatObj* GetParentObject() const = 0; - // Summary: - // Retrieve the static object, from which this one was cloned (if that is the case) - virtual IStatObj* GetCloneSourceObject() const = 0; - // Summary: - // Find sub-pbject by name. - virtual IStatObj::SSubObject* FindSubObject(const char* sNodeName) = 0; - // Find sub-object by name (including spaces, comma and semi-colon. - virtual IStatObj::SSubObject* FindSubObject_CGA(const char* sNodeName) = 0; - - // Summary: - // Find object by full name (use all the characters) - virtual IStatObj::SSubObject* FindSubObject_StrStr(const char* sNodeName) = 0; - // Remove Sub-Object. - virtual bool RemoveSubObject(int nIndex) = 0; - // Copy Sub-Object. - virtual bool CopySubObject(int nToIndex, IStatObj* pFromObj, int nFromIndex) = 0; - // adds a new sub object - virtual IStatObj::SSubObject& AddSubObject(IStatObj* pStatObj) = 0; - - virtual bool IsDeformable() = 0; - - ////////////////////////////////////////////////////////////////////////// - // Save contents of static object to the CGF file. - ////////////////////////////////////////////////////////////////////////// - // Save object to the CGF file. - // Arguments: - // sFilename - // Filename of the CGF file. - // Note that the function fails if pOutChunkFile is NULL and the path - // to the file does not exist on the drive. You can call - // CFileUtil::CreatePath() before SaveToCGF() call to create all - // folders that do not exist yet. - // pOutChunkFile - // Optional output parameter. If it is specified then the file will not be written to - // the drive but instead the function returns a pointer to the IChunkFile interface with - // filled CGF chunks. Caller of the function is responsible to call Release method - // of IChunkFile to release it later. - virtual bool SaveToCGF(const char* sFilename, IChunkFile** pOutChunkFile = NULL, bool bHavePhysicalProxy = false) = 0; - - ////////////////////////////////////////////////////////////////////////// - // Summary: - // Clones static geometry, Makes an exact copy of the Static object and the contained geometry. - //virtual IStatObj* Clone(bool bCloneChildren=true, bool nDynamic=false) = 0; - - ////////////////////////////////////////////////////////////////////////// - // Summary: - // Clones static geometry, Makes an exact copy of the Static object and the contained geometry. - virtual IStatObj* Clone(bool bCloneGeometry, bool bCloneChildren, bool bMeshesOnly) = 0; - - ////////////////////////////////////////////////////////////////////////// - // Summary: - // makes sure that both objects have one-to-one vertex correspondance - // sets MorphBuddy for this object's render mesh - // returns 0 if failed (due to objects having no vertex maps most likely) - virtual int SetDeformationMorphTarget(IStatObj* pDeformed) = 0; - - // chages the weights of the deformation morphing according to point, radius, and strength - // (radius==0 updates all weights of all vertices) - // if the object is a compound object, updates the weights of its subobjects that have deformation morphs; clones the object if necessary - // otherwise, updates the weights passed as a pWeights param - virtual IStatObj* DeformMorph(const Vec3& pt, float r, float strength, IRenderMesh* pWeights = 0) = 0; - - // hides all non-physicalized geometry, clones the object if necessary - virtual IStatObj* HideFoliage() = 0; - - // Get object properties as loaded from CGF. - virtual const char* GetProperties() = 0; - - // Get physical properties specified for object. - virtual bool GetPhysicalProperties(float& mass, float& density) = 0; - - // Returns the last B operand for this object as A, along with its relative scale - virtual IStatObj* GetLastBooleanOp(float& scale) = 0; + virtual SSubObject* GetSubObject(int nIndex) = 0; // Intersect ray with static object. // Ray must be in object local space. - virtual bool RayIntersection(SRayHitInfo& hitInfo, _smart_ptr pCustomMtl = 0) = 0; - - // Intersect lineseg with static object. Works on dedi server as well. - // Lineseg must be in object local space. Returns the hit position and the surface type id of the point hit. - virtual bool LineSegIntersection(const Lineseg& lineSeg, Vec3& hitPos, int& surfaceTypeId) = 0; - - // Debug Draw this static object. - virtual void DebugDraw(const struct SGeometryDebugDrawInfo& info, float fExtrdueScale = 0.01f) = 0; - - // Returns initial hide mask - virtual uint64 GetInitialHideMask() = 0; - - // Updates hide mask as new mask = (mask & maskAND) | maskOR - virtual uint64 UpdateInitialHideMask(uint64 maskAND = 0ul - 1ul, uint64 maskOR = 0) = 0; - - // Set the filename of the mesh of the next state (for example damaged version) - virtual void SetStreamingDependencyFilePath(const char* szFileName) = 0; - - virtual void ComputeGeometricMean(SMeshLodInfo& lodInfo) = 0; - - // Returns the distance for the first LOD switch. Used for brushes and vegetation. - virtual float GetLodDistance() const = 0; - - // Returns true if the mesh has been stripped - virtual bool IsMeshStrippedCGF() const = 0; - - virtual void LoadLowLODs(bool bUseStreaming, unsigned long nLoadingFlags) = 0; - - // Indicates if lods have been loaded - virtual bool AreLodsLoaded() const = 0; - - // Indicates if a garbage check should be done - virtual bool CheckGarbage() const = 0; - - // Sets state of check garbage flags - virtual void SetCheckGarbage(bool val) = 0; - - // Returns the number of child references - virtual int CountChildReferences() const = 0; - - // Returns the user count - virtual int GetUserCount() const = 0; - - // Shutdown - virtual void ShutDown() = 0; - - virtual int GetMaxUsableLod() const = 0; - virtual int GetMinUsableLod() const = 0; - - virtual SMeshBoneMapping_uint8* GetBoneMapping() const = 0; - - virtual int GetSpineCount() const = 0; - virtual SSpine* GetSpines() const = 0; - - virtual IStatObj* GetLodLevel0() = 0; - virtual void SetLodLevel0(IStatObj* lod) = 0; - virtual _smart_ptr* GetLods() = 0; - virtual int GetLoadedLodsNum() = 0; - - virtual bool UpdateStreamableComponents(float fImportance, const Matrix34A& objMatrix, bool bFullUpdate, int nNewLod) = 0; - - virtual SPhysGeomArray& GetArrPhysGeomInfo() = 0; - virtual bool IsLodsAreLoadedFromSeparateFile() = 0; - - virtual void StartStreaming(bool bFinishNow, IReadStream_AutoPtr* ppStream) = 0; - virtual void UpdateStreamingPrioriryInternal(const Matrix34A& objMatrix, float fDistance, bool bFullUpdate) = 0; - - virtual void SetMerged(bool state) = 0; - - virtual int GetRenderMeshMemoryUsage() const = 0; - virtual void SetLodObject(int nLod, IStatObj* pLod) = 0; - virtual int GetLoadedTrisCount() const = 0; - virtual int GetRenderTrisCount() const = 0; - virtual int GetRenderMatIds() const = 0; - - virtual bool IsUnmergable() const = 0; - virtual void SetUnmergable(bool state) = 0; - - virtual int GetSubObjectMeshCount() const = 0; - virtual void SetSubObjectMeshCount(int count) = 0; - virtual void CleanUnusedLods() = 0; - - virtual AZStd::vector& GetClothData() = 0; + virtual bool RayIntersection(SRayHitInfo& hitInfo, IMaterial* pCustomMtl = nullptr) = 0; }; diff --git a/Code/Legacy/CryCommon/ISurfaceType.h b/Code/Legacy/CryCommon/ISurfaceType.h deleted file mode 100644 index 10bddbbe6c..0000000000 --- a/Code/Legacy/CryCommon/ISurfaceType.h +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Defines interfaces to access Surface Types. - - -#ifndef CRYINCLUDE_CRYCOMMON_ISURFACETYPE_H -#define CRYINCLUDE_CRYCOMMON_ISURFACETYPE_H -#pragma once - -////////////////////////////////////////////////////////////////////////// -// Flags that ISurfaceType::GetFlags() can return. -////////////////////////////////////////////////////////////////////////// -enum ESurfaceTypeFlags -{ - SURFACE_TYPE_NO_PHYSICALIZE = BIT(1), // This surface should not be physicalized. - SURFACE_TYPE_NO_COLLIDE = BIT(2), // Should only be set for vegetation canopy mats - SURFACE_TYPE_VEHICLE_ONLY_COLLISION = BIT(3), - SURFACE_TYPE_CAN_SHATTER = BIT(4), // This surface type can shatter - SURFACE_TYPE_BULLET_PIERCEABLE = BIT(5), // This surface is pierceable by bullets (used by MFX system to spawn front/back FX) -}; - -// Parameter structure passed to ISurfaceType::Execute -struct SSurfaceTypeExecuteParams -{ - Vec3 hitPoint; - Vec3 hitNormal; - int hitType; -}; - -#define SURFACE_BREAKAGE_TYPE(x) x - -////////////////////////////////////////////////////////////////////////// -// Surface definition. -////////////////////////////////////////////////////////////////////////// -struct ISurfaceType -{ - ////////////////////////////////////////////////////////////////////////// - struct SSurfaceTypeAIParams - { - float fImpactRadius; - float fImpactSoundRadius; - float fFootStepRadius; - float proneMult; - float crouchMult; - float movingMult; - - SSurfaceTypeAIParams() - { - fImpactRadius = 2.5f; - fImpactSoundRadius = 20.0f; - fFootStepRadius = 20.0f; - proneMult = 0.2f; - crouchMult = 0.5f; - movingMult = 2.5f; - } - }; - struct SPhysicalParams - { - int breakable_id; - int break_energy; - float hole_size; - float hole_size_explosion; - float hit_radius; - float hit_points; - float hit_points_secondary; - float hit_maxdmg; - float hit_lifetime; - int pierceability; - float damage_reduction; - float ric_angle; - float ric_dam_reduction; - float ric_vel_reduction; - float friction; - float bouncyness; - int iBreakability; - int collType; - float sound_obstruction; - }; - struct SBreakable2DParams - { - AZStd::string particle_effect; - float blast_radius; - float blast_radius_first; - float vert_size_spread; - int rigid_body; - float life_time; - float cell_size; - int max_patch_tris; - float filter_angle; - float shard_density; - int use_edge_alpha; - float crack_decal_scale; - AZStd::string crack_decal_mtl; - float max_fracture; - AZStd::string full_fracture_fx; - AZStd::string fracture_fx; - int no_procedural_full_fracture; - AZStd::string broken_mtl; - float destroy_timeout; - float destroy_timeout_spread; - - SBreakable2DParams() - : blast_radius(0) - , rigid_body(0) - , life_time(0) - , cell_size(0) - , max_patch_tris(0) - , shard_density(0) - , crack_decal_scale(0) - , max_fracture(1.0f) - , vert_size_spread(0) - , filter_angle(0) - , use_edge_alpha(0) - , blast_radius_first(0) - , no_procedural_full_fracture(0) - , destroy_timeout(0) - , destroy_timeout_spread(0) {} - }; - struct SBreakageParticles - { - AZStd::string type; - AZStd::string particle_effect; - int count_per_unit; - float count_scale; - float scale; - SBreakageParticles() - : count_per_unit(1) - , count_scale(1) - , scale(1) {} - }; - - // - virtual ~ISurfaceType(){} - - // Releases surface type. - virtual void Release() = 0; - - // Return unique Id of this surface type. - // Maximum of 65535 simultanious surface types can exist. - virtual uint16 GetId() const = 0; - - // Unique name of the surface type. - virtual const char* GetName() const = 0; - - // Typename of this surface type. - virtual const char* GetType() const = 0; - - // Flags of the surface type. - // Return: - // A combination of ESurfaceTypeFlags flags. - virtual int GetFlags() const = 0; - - // Execute material. - virtual void Execute(SSurfaceTypeExecuteParams& params) = 0; - - // returns a some cached properties for faster access - virtual int GetBreakability() const = 0; - virtual float GetBreakEnergy() const = 0; - virtual int GetHitpoints() const = 0; - - ////////////////////////////////////////////////////////////////////////// - virtual const SPhysicalParams& GetPhyscalParams() = 0; - - // Optional AI Params. - virtual const SSurfaceTypeAIParams* GetAIParams() = 0; - - // Optional params for 2D breakable plane. - virtual SBreakable2DParams* GetBreakable2DParams() = 0; - virtual SBreakageParticles* GetBreakageParticles(const char* sType, bool bLookInDefault = true) = 0; - - ////////////////////////////////////////////////////////////////////////// - // Called by Surface manager. - ////////////////////////////////////////////////////////////////////////// - // Loads surface, (do not use directly). - virtual bool Load(int nId) = 0; - // -}; - -////////////////////////////////////////////////////////////////////////// -// Description: -// This interface is used to enumerate all items registered to the surface type manager. -////////////////////////////////////////////////////////////////////////// -struct ISurfaceTypeEnumerator -{ - // - virtual ~ISurfaceTypeEnumerator(){} - virtual void Release() = 0; - virtual ISurfaceType* GetFirst() = 0; - virtual ISurfaceType* GetNext() = 0; - // -}; - -// Description: -// Manages loading and mapping of physical surface materials to Ids and materials scripts. -// Behaviour: -// At start will enumerate all material names. -// When the surface is first time requested by name it will be loaded and cached -// and new unique id will be generated for it. -struct ISurfaceTypeManager -{ - // - virtual ~ISurfaceTypeManager(){} - - - // Description: - // Load Surface types - virtual void LoadSurfaceTypes() = 0; - - // Description: - // Return surface type by name. - // If surface is not yet loaded it will be loaded and and cached. - // Arguments: - // sName - Name of the surface type ("mat_metal","mat_wood", etc..) - // warn - print warning message if surface not found - virtual ISurfaceType* GetSurfaceTypeByName(const char* sName, const char* sWhy = NULL, bool warn = true) = 0; - - // Description: - // Return surface type by id. - // If surface is not yet loaded it will be loaded and and cached. - // Arguments: - // sName - Name of the surface type ("mat_metal","mat_wood", etc..) - virtual ISurfaceType* GetSurfaceType(int nSurfaceId, const char* sWhy = NULL) = 0; - - // Description: - // Retrieve an interface to the enumerator class that allow to iterate over all surface types. - virtual ISurfaceTypeEnumerator* GetEnumerator() = 0; - - // Register a new surface type. - virtual bool RegisterSurfaceType(ISurfaceType* pSurfaceType, bool bDefault = false) = 0; - virtual void UnregisterSurfaceType(ISurfaceType* pSurfaceType) = 0; - - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // -}; - -#endif // CRYINCLUDE_CRYCOMMON_ISURFACETYPE_H - diff --git a/Code/Legacy/CryCommon/ISystem.h b/Code/Legacy/CryCommon/ISystem.h index 722e73c774..948977d02a 100644 --- a/Code/Legacy/CryCommon/ISystem.h +++ b/Code/Legacy/CryCommon/ISystem.h @@ -6,8 +6,6 @@ * */ -#ifndef CRYINCLUDE_CRYCOMMON_ISYSTEM_H -#define CRYINCLUDE_CRYCOMMON_ISYSTEM_H #pragma once #ifdef CRYSYSTEM_EXPORTS @@ -15,10 +13,10 @@ #else #define CRYSYSTEM_API DLL_IMPORT #endif +#include #include "CryAssert.h" - -#include +#include #if defined(AZ_RESTRICTED_PLATFORM) #undef AZ_RESTRICTED_SECTION @@ -33,7 +31,6 @@ // Forward declarations //////////////////////////////////////////////////////////////////////////////////////////////// #include // <> required for Interfuscator -#include "IValidator.h" // <> required for Interfuscator #include // <> required for Interfuscator #include "CryVersion.h" #include "smartptr.h" @@ -61,9 +58,7 @@ struct SFileVersion; struct INameTable; struct ILevelSystem; struct IViewSystem; -class ICrySizer; class IXMLBinarySerializer; -struct IReadWriteXMLSink; struct IAVI_Reader; class CPNoise3; struct ILocalizationManager; @@ -84,9 +79,11 @@ class CCamera; struct CLoadingTimeProfiler; class ICmdLine; - class ILyShine; +enum EValidatorModule : int; +enum EValidatorSeverity : int; + enum ESystemUpdateFlags { // Summary: @@ -435,9 +432,6 @@ struct ISystemUserCallback // Show message by provider. virtual int ShowMessage(const char* text, const char* caption, unsigned int uType) { return CryMessageBox(text, caption, uType); } - // Description: - // Collects the memory information in the user program/application. - virtual void GetMemoryUsage(ICrySizer* pSizer) = 0; // // Post console load, for cvar setting @@ -1313,9 +1307,8 @@ namespace Detail const char* GetHelp() { return NULL; } bool IsConstCVar() const { return true; } void SetOnChangeCallback(ConsoleVarFunc pChangeFunc) { (void)pChangeFunc; } - uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) { (void)pChangeFunctor; return 0; } + uint64 AddOnChangeFunctor(const AZStd::function& pChangeFunctor) { (void)pChangeFunctor; return 0; } ConsoleVarFunc GetOnChangeCallback() const { InvalidAccess(); return NULL; } - void GetMemoryUsage([[maybe_unused]] class ICrySizer* pSizer) const {} int GetRealIVal() const { return GetIVal(); } void SetLimits([[maybe_unused]] float min, [[maybe_unused]] float max) { return; } void GetLimits([[maybe_unused]] float& min, [[maybe_unused]] float& max) { return; } @@ -1411,18 +1404,9 @@ static void AssertConsoleExists(void) // Preferred way to register an int CVar with a callback #define REGISTER_INT_CB(_name, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) // Summary: -// Preferred way to register an int64 CVar -#define REGISTER_INT64(_name, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt64(_name, (_def_val), (_flags), CVARHELP(_comment))) -// Summary: -// Preferred way to register an int64 CVar with a callback -#define REGISTER_INT64_CB(_name, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt64(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) -// Summary: // Preferred way to register a float CVar #define REGISTER_FLOAT(_name, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterFloat(_name, (_def_val), (_flags), CVARHELP(_comment))) // Summary: -// Preferred way to register a float CVar with a callback -#define REGISTER_FLOAT_CB(_name, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterFloat(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) -// Summary: // Offers more flexibility but more code is required #define REGISTER_CVAR2(_name, _var, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment))) // Summary: @@ -1432,9 +1416,6 @@ static void AssertConsoleExists(void) // Offers more flexibility but more code is required, explicit address taking of destination variable #define REGISTER_CVAR3(_name, _var, _def_val, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, &(_var), (_def_val), (_flags), CVARHELP(_comment))) // Summary: -// Offers more flexibility but more code is required, explicit address taking of destination variable -#define REGISTER_CVAR3_CB(_name, _var, _def_val, _flags, _comment, _onchangefunction) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, &(_var), (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) -// Summary: // Preferred way to register a console command #define REGISTER_COMMAND(_name, _func, _flags, _comment) (ASSERT_CONSOLE_EXISTS, gEnv->pConsole == 0 ? false : gEnv->pConsole->AddCommand(_name, _func, (_flags), CVARHELP(_comment))) // Summary: @@ -1465,12 +1446,10 @@ static void AssertConsoleExists(void) #define REGISTER_STRING_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_INT_DEV_ONLY(_name, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_INT_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ -#define REGISTER_INT64_DEV_ONLY(_name, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_FLOAT_DEV_ONLY(_name, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_CVAR2_DEV_ONLY(_name, _var, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); *(_var) = _def_val #define REGISTER_CVAR2_CB_DEV_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); *(_var) = _def_val #define REGISTER_CVAR3_DEV_ONLY(_name, _var, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); _var = _def_val -#define REGISTER_CVAR3_CB_DEV_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); _var = _def_val #define REGISTER_COMMAND_DEV_ONLY(_name, _func, _flags, _comment) /* consumed; command not available */ #else #define REGISTER_CVAR_DEV_ONLY(_var, _def_val, _flags, _comment) REGISTER_CVAR(_var, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) @@ -1479,12 +1458,10 @@ static void AssertConsoleExists(void) #define REGISTER_STRING_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_STRING_CB(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_DEV_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_INT_CB(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) -#define REGISTER_INT64_DEV_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT64(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_FLOAT_DEV_ONLY(_name, _def_val, _flags, _comment) REGISTER_FLOAT(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_DEV_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR2(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_CB_DEV_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR2_CB(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR3_DEV_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR3(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) -#define REGISTER_CVAR3_CB_DEV_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR3_CB(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_COMMAND_DEV_ONLY(_name, _func, _flags, _comment) REGISTER_COMMAND(_name, _func, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #endif // defined(_RELEASE) // @@ -1508,12 +1485,9 @@ static void AssertConsoleExists(void) #define REGISTER_STRING_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_STRING_CB(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_INT_CB(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) -#define REGISTER_INT64_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT64(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_FLOAT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_FLOAT(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_DEDI_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR2(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_CB_DEDI_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR2_CB(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) -#define REGISTER_CVAR3_DEDI_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR3(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) -#define REGISTER_CVAR3_CB_DEDI_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR3_CB(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_COMMAND_DEDI_ONLY(_name, _func, _flags, _comment) REGISTER_COMMAND(_name, _func, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #else #define REGISTER_CVAR_DEDI_ONLY(_var, _def_val, _flags, _comment) REGISTER_CVAR_DEV_ONLY(_var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) @@ -1522,12 +1496,9 @@ static void AssertConsoleExists(void) #define REGISTER_STRING_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_STRING_CB_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) #define REGISTER_INT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_INT_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_INT_CB_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) -#define REGISTER_INT64_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT64_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_FLOAT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_FLOAT_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_CVAR2_DEDI_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR2_DEV_ONLY(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_CVAR2_CB_DEDI_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR2_CB_DEV_ONLY(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) -#define REGISTER_CVAR3_DEDI_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR3_DEV_ONLY(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) -#define REGISTER_CVAR3_CB_DEDI_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR3_CB_DEV_ONLY(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) #define REGISTER_COMMAND_DEDI_ONLY(_name, _func, _flags, _comment) REGISTER_COMMAND_DEV_ONLY(_name, _func, ((_flags) | VF_DEDI_ONLY), _comment) #endif // defined(_RELEASE) // @@ -1592,4 +1563,3 @@ inline void CryLogAlways(const char* format, ...) } #endif // EXCLUDE_NORMAL_LOG -#endif // CRYINCLUDE_CRYCOMMON_ISYSTEM_H diff --git a/Code/Legacy/CryCommon/ITexture.h b/Code/Legacy/CryCommon/ITexture.h index b370005f83..2655810fb0 100644 --- a/Code/Legacy/CryCommon/ITexture.h +++ b/Code/Legacy/CryCommon/ITexture.h @@ -13,7 +13,6 @@ enum ETEX_Format : AZ::u8 { eTF_Unknown = 0, - eTF_R8G8B8A8S, eTF_R8G8B8A8 = 2, // may be saved into file eTF_A8 = 4, @@ -25,76 +24,6 @@ enum ETEX_Format : AZ::u8 eTF_R8G8, eTF_R8G8S, eTF_R16G16, - eTF_R16G16S, - eTF_R16G16F, - eTF_R11G11B10F, - eTF_R10G10B10A2, - eTF_R16G16B16A16, - eTF_R16G16B16A16S, - eTF_R16G16B16A16F, - eTF_R32G32B32A32F, - - eTF_CTX1, - eTF_BC1 = 22, // may be saved into file - eTF_BC2 = 23, // may be saved into file - eTF_BC3 = 24, // may be saved into file - eTF_BC4U, // 3Dc+ - eTF_BC4S, - eTF_BC5U, // 3Dc - eTF_BC5S, - eTF_BC6UH, - eTF_BC6SH, - eTF_BC7, - eTF_R9G9B9E5, - - // hardware depth buffers - eTF_D16, - eTF_D24S8, - eTF_D32F, - eTF_D32FS8, - - // only available as hardware format under DX11.1 with DXGI 1.2 - eTF_B5G6R5, - eTF_B5G5R5, - eTF_B4G4R4A4, - - // only available as hardware format under OpenGL - eTF_EAC_R11, - eTF_EAC_RG11, - eTF_ETC2, - eTF_ETC2A, - - // only available as hardware format under DX9 - eTF_A8L8, - eTF_L8, - eTF_L8V8U8, - eTF_B8G8R8, - eTF_L8V8U8X8, - eTF_B8G8R8X8, - eTF_B8G8R8A8, - - eTF_PVRTC2, - eTF_PVRTC4, - - eTF_ASTC_4x4, - eTF_ASTC_5x4, - eTF_ASTC_5x5, - eTF_ASTC_6x5, - eTF_ASTC_6x6, - eTF_ASTC_8x5, - eTF_ASTC_8x6, - eTF_ASTC_8x8, - eTF_ASTC_10x5, - eTF_ASTC_10x6, - eTF_ASTC_10x8, - eTF_ASTC_10x10, - eTF_ASTC_12x10, - eTF_ASTC_12x12, - - // add R16 unsigned int format for hardware that do not support float point rendering - eTF_R16U, - eTF_R16G16U, - eTF_R10G10B10A2UI, eTF_MaxFormat // unused, must be always the last in the list }; diff --git a/Code/Legacy/CryCommon/IValidator.h b/Code/Legacy/CryCommon/IValidator.h index 8e6b6eaa5c..724e564154 100644 --- a/Code/Legacy/CryCommon/IValidator.h +++ b/Code/Legacy/CryCommon/IValidator.h @@ -9,21 +9,15 @@ // Description : IValidator interface used to check objects for warnings and errors // Report missing resources or invalid files. - - -#ifndef CRYINCLUDE_CRYCOMMON_IVALIDATOR_H -#define CRYINCLUDE_CRYCOMMON_IVALIDATOR_H #pragma once # define MAX_WARNING_LENGTH 4096 -#if MAX_WARNING_LENGTH < 33 -#error "MAX_WARNING_LENGTH should be bigger than 32" -#endif +static_assert(MAX_WARNING_LENGTH>32,"MAX_WARNING_LENGTH should be bigger than 32"); #define ERROR_CANT_FIND_CENTRAL_DIRECTORY "Cannot find Central Directory Record in pak. This is either not a pak file, or a pak file without Central Directory. It does not mean that the data is permanently lost, but it may be severely damaged. Please repair the file with external tools, there may be enough information left to recover the file completely." -enum EValidatorSeverity +enum EValidatorSeverity : int { VALIDATOR_ERROR, VALIDATOR_ERROR_DBGBRK, // will __debugbreak() if sys_error_debugbreak is 1 @@ -31,7 +25,7 @@ enum EValidatorSeverity VALIDATOR_COMMENT }; -enum EValidatorModule +enum EValidatorModule : int { VALIDATOR_MODULE_UNKNOWN, VALIDATOR_MODULE_RENDERER, @@ -61,45 +55,3 @@ enum EValidatorFlags VALIDATOR_FLAG_IGNORE_IN_EDITOR = 0x0040, // Do not log this with the editor VALIDATOR_FLAG_SKIP_VALIDATOR = 0x0080, // Do not call validator's Report() }; - -struct SValidatorRecord -{ - //! Severity of this error. - EValidatorSeverity severity; - //! In which module error occured. - EValidatorModule module; - //! Error Text. - const char* text; - //! File which is missing or causing problem. - const char* file; - //! Additional description for this error. - const char* description; - //! Asset scope sring - const char* assetScope; - //! Flags that suggest kind of error. - int flags; - - ////////////////////////////////////////////////////////////////////////// - SValidatorRecord() - { - module = VALIDATOR_MODULE_UNKNOWN; - text = NULL; - file = NULL; - assetScope = NULL; - description = NULL; - severity = VALIDATOR_WARNING; - flags = 0; - } -}; - -/*! This interface will be given to Validate methods of engine, for resources and objects validation. - */ -struct IValidator -{ - // - virtual ~IValidator(){} - virtual void Report(SValidatorRecord& record) = 0; - // -}; - -#endif // CRYINCLUDE_CRYCOMMON_IVALIDATOR_H diff --git a/Code/Legacy/CryCommon/IXml.h b/Code/Legacy/CryCommon/IXml.h index 2434b44664..be2bdcd5ab 100644 --- a/Code/Legacy/CryCommon/IXml.h +++ b/Code/Legacy/CryCommon/IXml.h @@ -5,18 +5,12 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - - -#ifndef CRYINCLUDE_CRYCOMMON_IXML_H -#define CRYINCLUDE_CRYCOMMON_IXML_H #pragma once #include #include #include -class ICrySizer; - template struct Color_tpl; typedef Color_tpl ColorB; @@ -24,17 +18,12 @@ typedef Color_tpl ColorB; template struct Vec2_tpl; typedef Vec2_tpl Vec2; -typedef Vec2_tpl Vec2d; template struct Vec3_tpl; typedef Vec3_tpl Vec3; -typedef Vec3_tpl Vec3d; -template -struct Vec4_tpl; -typedef Vec4_tpl Vec4; -typedef Vec4_tpl Vec4d; +struct Vec4; template struct Quat_tpl; @@ -59,7 +48,6 @@ class QColor; class QString; class IXMLBinarySerializer; -struct IReadWriteXMLSink; struct ISerialize; /* @@ -329,11 +317,9 @@ public: virtual void setAttr(const char* key, float value) = 0; virtual void setAttr(const char* key, double value) = 0; virtual void setAttr(const char* key, const Vec2& value) = 0; - virtual void setAttr(const char* key, const Vec2d& value) = 0; virtual void setAttr(const char* key, const Ang3& value) = 0; virtual void setAttr(const char* key, const Vec3& value) = 0; virtual void setAttr(const char* key, const Vec4& value) = 0; - virtual void setAttr(const char* key, const Vec3d& value) = 0; virtual void setAttr(const char* key, const Quat& value) = 0; #if defined(LINUX64) || defined(APPLE) // Compatibility functions, on Linux and Mac long int is the default int64_t @@ -378,11 +364,9 @@ public: virtual bool getAttr(const char* key, float& value) const = 0; virtual bool getAttr(const char* key, double& value) const = 0; virtual bool getAttr(const char* key, Vec2& value) const = 0; - virtual bool getAttr(const char* key, Vec2d& value) const = 0; virtual bool getAttr(const char* key, Ang3& value) const = 0; virtual bool getAttr(const char* key, Vec3& value) const = 0; virtual bool getAttr(const char* key, Vec4& value) const = 0; - virtual bool getAttr(const char* key, Vec3d& value) const = 0; virtual bool getAttr(const char* key, Quat& value) const = 0; virtual bool getAttr(const char* key, bool& value) const = 0; virtual bool getAttr(const char* key, XmlString& value) const = 0; @@ -401,13 +385,6 @@ public: } #endif - // - - // - // Summary: - // Collect all allocated memory - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // Summary: // Copies children to this node from a given node. // Children are reference copied (shallow copy) and the children's parent is NOT set to this @@ -700,7 +677,7 @@ public: XmlNodeRefIterator& operator=(const XmlNodeRefIterator& other) = default; - XmlNodeRefIterator& operator++() + XmlNodeRefIterator& operator++() { ++m_index; Update(); @@ -714,7 +691,7 @@ public: return ret; } - IXmlNode* operator*() const + IXmlNode* operator*() const { return m_currentChildNode; } @@ -794,7 +771,6 @@ struct IXmlSerializer virtual ISerialize* GetWriter(XmlNodeRef& node) = 0; virtual ISerialize* GetReader(XmlNodeRef& node) = 0; // - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; }; ////////////////////////////////////////////////////////////////////////// @@ -802,7 +778,6 @@ struct IXmlSerializer // XML Parser interface. struct IXmlParser { - // virtual ~IXmlParser(){} virtual void AddRef() = 0; virtual void Release() = 0; @@ -814,9 +789,6 @@ struct IXmlParser // Summary: // Parses xml from memory buffer. virtual XmlNodeRef ParseBuffer(const char* buffer, int nBufLen, bool bCleanPools, bool bSuppressWarnings = false) = 0; - - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; - // }; ////////////////////////////////////////////////////////////////////////// @@ -863,7 +835,6 @@ struct IXmlTableReader // to know absolute cell index (i.e. column). // Returns false if no cells left in the row. virtual bool ReadCell(int& columnIndex, const char*& pContent, size_t& contentSize) = 0; - virtual float GetCurrentRowHeight() = 0; // }; @@ -877,28 +848,17 @@ struct IXmlUtils // Summary: // Loads xml file, returns 0 if load failed. - virtual XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false, bool bEnablePatching = true) = 0; + virtual XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false) = 0; // Summary: // Loads xml from memory buffer, returns 0 if load failed. virtual XmlNodeRef LoadXmlFromBuffer(const char* buffer, size_t size, bool bReuseStrings = false, bool bSuppressWarnings = false) = 0; - // Summary: - // Creates an MD5 hash of an XML file - virtual const char* HashXml(XmlNodeRef node) = 0; - - // Summary: - // Gets an object that can read a xml into a IReadXMLSink - // and writes a xml from a IWriteXMLSource - virtual IReadWriteXMLSink* GetIReadWriteXMLSink() = 0; - // Summary: // Creates XML Writer for ISerialize interface. // See also: // IXmlSerializer virtual IXmlSerializer* CreateXmlSerializer() = 0; - // - // // Summary: // Creates XML Parser. // Notes: @@ -908,40 +868,9 @@ struct IXmlUtils // After use it must be released with call to Release method. virtual IXmlParser* CreateXmlParser() = 0; - // Summary: - // Creates XML to file in the binary form. - virtual bool SaveBinaryXmlFile(const char* sFilename, XmlNodeRef root) = 0; - // Summary: - // Reads XML data from file in the binary form. - virtual XmlNodeRef LoadBinaryXmlFile(const char* sFilename, bool bEnablePatching = true) = 0; - - // Summary: - // Enables or disables checking for binary xml files. - // Return Value: - // The previous status. - virtual bool EnableBinaryXmlLoading(bool bEnable) = 0; - // Summary: // Creates XML Table reader. // Notes: // After use it must be released with call to Release method. virtual IXmlTableReader* CreateXmlTableReader() = 0; - - // Init xml stats nodes pool - virtual void InitStatsXmlNodePool(uint32 nPoolSize) = 0; - - // Creates new xml node for statistics. - virtual XmlNodeRef CreateStatsXmlNode(const char* sNodeName) = 0; - // Set owner thread - virtual void SetStatsOwnerThread(threadID threadId) = 0; - - // Free memory held on to by xml pool if empty - virtual void FlushStatsXmlNodePool() = 0; - - // Sets the patch which is used to transform loaded XML files. the patch itself is encoded into XML - // Set to NULL to clear an existing transform and disable further patching - virtual void SetXMLPatcher(XmlNodeRef* pPatcher) = 0; - // }; - -#endif // CRYINCLUDE_CRYCOMMON_IXML_H diff --git a/Code/Legacy/CryCommon/Linux_Win32Wrapper.h b/Code/Legacy/CryCommon/Linux_Win32Wrapper.h index ffdf3fe998..7157bc4a78 100644 --- a/Code/Legacy/CryCommon/Linux_Win32Wrapper.h +++ b/Code/Legacy/CryCommon/Linux_Win32Wrapper.h @@ -429,7 +429,6 @@ extern DWORD GetCurrentProcessId(void); //helper function extern void adaptFilenameToLinux(char* rAdjustedFilename); -extern const int comparePathNames(const char* cpFirst, const char* cpSecond, unsigned int len);//returns 0 if identical extern void replaceDoublePathFilename(char* szFileName);//removes "\.\" to "\" and "/./" to "/" ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Legacy/CryCommon/LocalizationManagerBus.h b/Code/Legacy/CryCommon/LocalizationManagerBus.h index 1d818de111..fadda76e3f 100644 --- a/Code/Legacy/CryCommon/LocalizationManagerBus.h +++ b/Code/Legacy/CryCommon/LocalizationManagerBus.h @@ -8,7 +8,6 @@ #pragma once -#include #include #include #include diff --git a/Code/Legacy/CryCommon/LyShine/Bus/UiTransform2dBus.h b/Code/Legacy/CryCommon/LyShine/Bus/UiTransform2dBus.h index fb30a78aac..4a242d9d25 100644 --- a/Code/Legacy/CryCommon/LyShine/Bus/UiTransform2dBus.h +++ b/Code/Legacy/CryCommon/LyShine/Bus/UiTransform2dBus.h @@ -42,10 +42,10 @@ public: // types void UnitClamp() { - m_left = FClamp(m_left, 0.0f, 1.0f); - m_top = FClamp(m_top, 0.0f, 1.0f); - m_right = FClamp(m_right, 0.0f, 1.0f); - m_bottom = FClamp(m_bottom, 0.0f, 1.0f); + m_left = AZStd::clamp(m_left, 0.0f, 1.0f); + m_top = AZStd::clamp(m_top, 0.0f, 1.0f); + m_right = AZStd::clamp(m_right, 0.0f, 1.0f); + m_bottom = AZStd::clamp(m_bottom, 0.0f, 1.0f); } bool operator==(const Anchors& rhs) const diff --git a/Code/Legacy/CryCommon/MTPseudoRandom.cpp b/Code/Legacy/CryCommon/MTPseudoRandom.cpp deleted file mode 100644 index f8a3950ff0..0000000000 --- a/Code/Legacy/CryCommon/MTPseudoRandom.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : Marsenne Twister PRNG. See MT.h for more info. - -#include "MTPseudoRandom.h" -// non-inline function definitions and static member definitions cannot -// reside in header file because of the risk of multiple declarations - -void CMTRand_int32::gen_state() // generate new m_nState vector -{ - for (int i = 0; i < (n - m); ++i) - { - m_nState[i] = m_nState[i + m] ^ twiddle(m_nState[i], m_nState[i + 1]); - } - for (int i = n - m; i < (n - 1); ++i) - { - m_nState[i] = m_nState[i + m - n] ^ twiddle(m_nState[i], m_nState[i + 1]); - } - m_nState[n - 1] = m_nState[m - 1] ^ twiddle(m_nState[n - 1], m_nState[0]); - p = 0; // reset position -} - -void CMTRand_int32::seed(uint32 s) // init by 32 bit seed -{ //if (s == 0) - //m_nRandom = 1; - for (int i = 0; i < n; ++i) - { - m_nState[i] = 0x0UL; - } - m_nState[0] = s; - for (int i = 1; i < n; ++i) - { - m_nState[i] = 1812433253UL * (m_nState[i - 1] ^ (m_nState[i - 1] >> 30)) + i; - // see Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier - // in the previous versions, MSBs of the seed affect only MSBs of the array m_nState - // 2002/01/09 modified by Makoto Matsumoto - } - p = n; // force gen_state() to be called for next random number -} - -void CMTRand_int32::seed(const uint32* array, int size) // init by array -{ - seed(19650218UL); - int i = 1, j = 0; - for (int k = ((n > size) ? n : size); k; --k) - { - m_nState[i] = (m_nState[i] ^ ((m_nState[i - 1] ^ (m_nState[i - 1] >> 30)) * 1664525UL)) - + array[j] + j; // non linear - ++j; - j %= size; - if ((++i) == n) - { - m_nState[0] = m_nState[n - 1]; - i = 1; - } - } - for (int k = n - 1; k; --k) - { - m_nState[i] = (m_nState[i] ^ ((m_nState[i - 1] ^ (m_nState[i - 1] >> 30)) * 1566083941UL)) - i; - if ((++i) == n) - { - m_nState[0] = m_nState[n - 1]; - i = 1; - } - } - m_nState[0] = 0x80000000UL; // MSB is 1; assuring non-zero initial array - p = n; // force gen_state() to be called for next random number -} diff --git a/Code/Legacy/CryCommon/MTPseudoRandom.h b/Code/Legacy/CryCommon/MTPseudoRandom.h deleted file mode 100644 index c1ed7694a5..0000000000 --- a/Code/Legacy/CryCommon/MTPseudoRandom.h +++ /dev/null @@ -1,166 +0,0 @@ -// mtrand.h -// C++ include file for MT19937, with initialization improved 2002/1/26. -// Coded by Takuji Nishimura and Makoto Matsumoto. -// Ported to C++ by Jasper Bedaux 2003/1/1 (see http://www.bedaux.net/mtrand/). -// The generators returning floating point numbers are based on -// a version by Isaku Wada, 2002/01/09 -// Static shared data converted to per-instance, 2008-11-13 by JSP. -// -// Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The names of its contributors may not be used to endorse or promote -// products derived from this software without specific prior written -// permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -// Any feedback is very welcome. -// http://www.math.keio.ac.jp/matumoto/emt.html -// email: matumoto@math.keio.ac.jp -// -// Feedback about the C++ port should be sent to Jasper Bedaux, -// see http://www.bedaux.net/mtrand/ for e-mail address and info. - -//------------------------------------------------------------------------- -// History: -// - 28:7:2005: File created and minor changes by Marco Corbetta -// -//*************************************************************************/ -// Modified from original - -#ifndef CRYINCLUDE_CRYCOMMON_MTPSEUDORANDOM_H -#define CRYINCLUDE_CRYCOMMON_MTPSEUDORANDOM_H -#pragma once - -#include - -////////////////////////////////////////////////////////////////////////// -class CMTRand_int32 -{ - // Mersenne Twister random number generator - -public: - // default constructor - CMTRand_int32() { seed(5489UL); } - // constructor with 32 bit int as seed - CMTRand_int32(uint32 seed_value) { seed(seed_value); } - // constructor with array of 32 bit integers as seed - CMTRand_int32(const uint32* array, int size) { seed(array, size); } - // seeds with 32 bit integer - void seed(uint32 seed_value); - // seeds with array - void seed(const uint32*, int size); - // overloaded operator() to make this a generator (functor) - //uint32 operator()() { return rand_int32(); } - - ~CMTRand_int32() {} - - // Functions with PascalCase names were added for - // interchangeability with CRndGen (see LCGRandom.h). - - void Seed(uint32 seed_value) - { - seed(seed_value); - } - - uint32 GenerateUint32() - { - return rand_int32(); - } - - uint64 GenerateUint64() - { - const uint32 a = GenerateUint32(); - const uint32 b = GenerateUint32(); - return ((uint64)b << 32) | (uint64)a; - } - - float GenerateFloat() - { - return (float)GenerateUint32() * (1.0f / 4294967295.0f); - } - - // Ranged function returns random value within the *inclusive* range - // between minValue and maxValue. - // Any orderings work correctly: minValue <= maxValue and - // minValue >= minValue. - template - T GetRandom(const T minValue, const T maxValue) - { - return CryRandom_Internal::BoundedRandom::Get(*this, minValue, maxValue); - } - - // Vector (Vec2, Vec3, Vec4) ranged function returns vector with - // every component within the *inclusive* ranges between minValue.component - // and maxValue.component. - // All orderings work correctly: minValue.component <= maxValue.component and - // minValue.component >= maxValue.component. - template - T GetRandomComponentwise(const T& minValue, const T& maxValue) - { - return CryRandom_Internal::BoundedRandomComponentwise::Get(*this, minValue, maxValue); - } - - // The function returns a random unit vector (Vec2, Vec3, Vec4). - template - T GetRandomUnitVector() - { - return CryRandom_Internal::GetRandomUnitVector(*this); - } - -protected: // used by derived classes, otherwise not accessible; use the ()-operator - // generates 32 bit random int - uint32 rand_int32() - { - if (p >= n) gen_state(); // new m_nState vector needed - // gen_state() is split off to be non-inline, because it is only called once - // in every 624 calls and otherwise irand() would become too big to get inlined - uint32 x = m_nState[p++]; - x ^= (x >> 11); - x ^= (x << 7) & 0x9D2C5680UL; - x ^= (x << 15) & 0xEFC60000UL; - return x ^ (x >> 18); - } - -private: - static const int n = 624, m = 397; // compile time constants - - // the variables below are static (no duplicates can exist) - uint32 m_nState[n+1]; // m_nState vector array - int p; // position in m_nState array - // private functions used to generate the pseudo random numbers - uint32 twiddle(uint32 u, uint32 v) - { - return (((u & 0x80000000UL) | (v & 0x7FFFFFFFUL)) >> 1) - ^ ((v & 1UL) ? 0x9908B0DFUL : 0x0UL); - } - void gen_state(); // generate new m_nState - // make copy constructor and assignment operator unavailable, they don't make sense - CMTRand_int32(const CMTRand_int32&); // copy constructor not defined - void operator=(const CMTRand_int32&); // assignment operator not defined -}; - - -#endif // CRYINCLUDE_CRYCOMMON_MTPSEUDORANDOM_H diff --git a/Code/Legacy/CryCommon/MathConversion.h b/Code/Legacy/CryCommon/MathConversion.h index 69d5244b63..9ac09173cb 100644 --- a/Code/Legacy/CryCommon/MathConversion.h +++ b/Code/Legacy/CryCommon/MathConversion.h @@ -153,35 +153,6 @@ inline AZ::Matrix3x4 LYTransformToAZMatrix3x4(const Matrix34& source) return AZ::Matrix3x4::CreateFromRowMajorFloat12(source.GetData()); } -inline AZ::Transform LYQuatTToAZTransform(const QuatT& source) -{ - return AZ::Transform::CreateFromQuaternionAndTranslation( - LYQuaternionToAZQuaternion(source.q), - LYVec3ToAZVec3(source.t)); -} - -inline QuatT AZTransformToLYQuatT(const AZ::Transform& source) -{ - return QuatT( - AZQuaternionToLYQuaternion(source.GetRotation()), - AZVec3ToLYVec3(source.GetTranslation())); -} - -inline QuatT AZMatrix3x4ToLYQuatT(const AZ::Matrix3x4& source) -{ - AZ::Matrix3x4 sourceNoScale(source); - sourceNoScale.ExtractScale(); - - return QuatT( - AZQuaternionToLYQuaternion(AZ::Quaternion::CreateFromMatrix3x4(sourceNoScale)), - AZVec3ToLYVec3(source.GetTranslation())); -} - -inline DualQuat AZMatrix3x4ToLYDualQuat(const AZ::Matrix3x4& matrix3x4) -{ - return DualQuat(AZMatrix3x4ToLYMatrix3x4(matrix3x4)); -} - inline AABB AZAabbToLyAABB(const AZ::Aabb& source) { return AABB(AZVec3ToLYVec3(source.GetMin()), AZVec3ToLYVec3(source.GetMax())); diff --git a/Code/Legacy/CryCommon/MetaUtils.h b/Code/Legacy/CryCommon/MetaUtils.h deleted file mode 100644 index 9d62f115d3..0000000000 --- a/Code/Legacy/CryCommon/MetaUtils.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYCOMMON_METAUTILS_H -#define CRYINCLUDE_CRYCOMMON_METAUTILS_H -#pragma once - - - -namespace metautils -{ - // select - - template - struct select; - - template - struct select - { - typedef Ty1 type; - }; - - template - struct select - { - typedef Ty2 type; - }; - - // is_same - // Identifies whether types Ty1 and Ty2 are the same including const & volatile. - - template - struct is_same; - - template - struct is_same - { - enum - { - value = true, - }; - }; - - template - struct is_same - { - enum - { - value = false, - }; - }; - - // remove_const - // Removes top level const qualifier. - - template - struct remove_const - { - typedef Ty type; - }; - - template - struct remove_const - { - typedef Ty type; - }; - - template - struct remove_const - { - typedef Ty type[]; - }; - - template - struct remove_const - { - typedef Ty type[N]; - }; - - // is_const - // Determines whether type Ty is const qualified. - - template - struct is_const - { - enum - { - value = false - }; - }; - - template - struct is_const - { - enum - { - value = true - }; - }; - - template - struct is_const - { - enum - { - value = false - }; - }; - - template - struct is_const - { - enum - { - value = true - }; - }; - - template - struct is_const - { - enum - { - value = false - }; - }; -}; - -#endif // CRYINCLUDE_CRYCOMMON_METAUTILS_H diff --git a/Code/Legacy/CryCommon/Mocks/ICVarMock.h b/Code/Legacy/CryCommon/Mocks/ICVarMock.h index 08f4471ad1..d8131c3552 100644 --- a/Code/Legacy/CryCommon/Mocks/ICVarMock.h +++ b/Code/Legacy/CryCommon/Mocks/ICVarMock.h @@ -11,7 +11,7 @@ #include #include -#include +#include class CVarMock : public ICVar @@ -35,9 +35,8 @@ public: MOCK_METHOD0(GetHelp, const char*()); MOCK_CONST_METHOD0(IsConstCVar, bool()); MOCK_METHOD1(SetOnChangeCallback, void(ConsoleVarFunc)); - MOCK_METHOD1(AddOnChangeFunctor, uint64(const SFunctor& pChangeFunctor)); + MOCK_METHOD1(AddOnChangeFunctor, uint64(const AZStd::function& pChangeFunctor)); MOCK_CONST_METHOD0(GetOnChangeCallback, ConsoleVarFunc()); - MOCK_CONST_METHOD1(GetMemoryUsage, void(class ICrySizer* pSizer)); MOCK_CONST_METHOD0(GetRealIVal, int()); MOCK_METHOD2(SetLimits, void(float, float)); MOCK_METHOD2(GetLimits, void(float&, float&)); diff --git a/Code/Legacy/CryCommon/Mocks/IConsoleMock.h b/Code/Legacy/CryCommon/Mocks/IConsoleMock.h index 9c947b9c0f..24ae70cba4 100644 --- a/Code/Legacy/CryCommon/Mocks/IConsoleMock.h +++ b/Code/Legacy/CryCommon/Mocks/IConsoleMock.h @@ -21,12 +21,10 @@ public: MOCK_METHOD1(Init, void(ISystem * pSystem)); MOCK_METHOD5(RegisterString, ICVar * (const char* sName, const char* sValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc)); MOCK_METHOD5(RegisterInt, ICVar * (const char* sName, int iValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc)); - MOCK_METHOD5(RegisterInt64, ICVar * (const char* sName, int64 iValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc)); MOCK_METHOD5(RegisterFloat, ICVar * (const char* sName, float fValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc)); MOCK_METHOD7(Register, ICVar * (const char* name, float* src, float defaultvalue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc, bool allowModify)); MOCK_METHOD7(Register, ICVar * (const char* name, int* src, int defaultvalue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc, bool allowModify)); MOCK_METHOD7(Register, ICVar * (const char* name, const char** src, const char* defaultvalue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc, bool allowModify)); - MOCK_METHOD1(Register, ICVar * (ICVar * pVar)); MOCK_METHOD2(UnregisterVariable, void(const char* sVarName, bool bDelete )); MOCK_METHOD1(SetScrollMax, void(int value)); MOCK_METHOD1(AddOutputPrintSink, void(IOutputPrintSink * inpSink)); @@ -63,7 +61,6 @@ public: MOCK_METHOD2(RegisterAutoComplete, void (const char* sVarOrCommand, IConsoleArgumentAutoComplete * pArgAutoComplete)); MOCK_METHOD1(UnRegisterAutoComplete, void (const char* sVarOrCommand)); MOCK_METHOD0(ResetAutoCompletion, void ()); - MOCK_CONST_METHOD1(GetMemoryUsage, void (ICrySizer * pSizer)); MOCK_METHOD1(ResetProgressBar, void (int nProgressRange)); MOCK_METHOD0(TickProgressBar, void ()); MOCK_METHOD1(SetInputLine, void (const char* szLine)); diff --git a/Code/Legacy/CryCommon/Mocks/ILogMock.h b/Code/Legacy/CryCommon/Mocks/ILogMock.h index c3a45b4d6f..ac2ba7f32c 100644 --- a/Code/Legacy/CryCommon/Mocks/ILogMock.h +++ b/Code/Legacy/CryCommon/Mocks/ILogMock.h @@ -48,8 +48,6 @@ public: void()); MOCK_METHOD0(GetModuleFilter, const char*()); - MOCK_CONST_METHOD1(GetMemoryUsage, - void(ICrySizer * pSizer)); MOCK_METHOD1(Indent, void(class CLogIndenter * indenter)); MOCK_METHOD1(Unindent, diff --git a/Code/Legacy/CryCommon/MultiThread_Containers.h b/Code/Legacy/CryCommon/MultiThread_Containers.h index 8a60adfa6b..168ebf28cf 100644 --- a/Code/Legacy/CryCommon/MultiThread_Containers.h +++ b/Code/Legacy/CryCommon/MultiThread_Containers.h @@ -6,13 +6,9 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_MULTITHREAD_CONTAINERS_H -#define CRYINCLUDE_CRYCOMMON_MULTITHREAD_CONTAINERS_H #pragma once #include "StlUtils.h" -#include "BitFiddling.h" #include #include @@ -43,8 +39,6 @@ namespace CryMT const T& back() const { AutoLock lock(m_cs); return v.back(); } void push(const T& x) { AutoLock lock(m_cs); return v.push_back(x); }; void reserve(const size_t n) { AutoLock lock(m_cs); v.reserve(n); }; - // classic pop function of queue should not be used for thread safety, use try_pop instead - //void pop() { AutoLock lock(m_cs); return v.erase(v.begin()); }; AZStd::recursive_mutex& get_lock() const { return m_cs; } @@ -69,27 +63,6 @@ namespace CryMT return false; }; - ////////////////////////////////////////////////////////////////////////// - bool try_remove(const T& value) - { - AutoLock lock(m_cs); - if (!v.empty()) - { - typename container_type::iterator it = std::find(v.begin(), v.end(), value); - if (it != v.end()) - { - v.erase(it); - return true; - } - } - return false; - }; - - template - void GetMemoryUsage(Sizer* pSizer) const - { - pSizer->AddObject(v); - } private: container_type v; mutable AZStd::recursive_mutex m_cs; @@ -104,6 +77,3 @@ namespace stl v.free_memory(); } } - - -#endif // CRYINCLUDE_CRYCOMMON_MULTITHREAD_CONTAINERS_H diff --git a/Code/Legacy/CryCommon/Random.h b/Code/Legacy/CryCommon/Random.h index c0d06f458c..6ffb38f736 100644 --- a/Code/Legacy/CryCommon/Random.h +++ b/Code/Legacy/CryCommon/Random.h @@ -6,9 +6,6 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_RANDOM_H -#define CRYINCLUDE_CRYCOMMON_RANDOM_H #pragma once #include "BaseTypes.h" @@ -21,22 +18,11 @@ namespace CryRandom_Internal } -// Seed the global random number generator. -inline void cry_random_seed(const uint32 nSeed) -{ - CryRandom_Internal::g_random_generator.Seed(nSeed); -} - inline uint32 cry_random_uint32() { return CryRandom_Internal::g_random_generator.GenerateUint32(); } -inline float cry_frand() -{ - return CryRandom_Internal::g_random_generator.GenerateFloat(); -} - // Ranged function returns random value within the *inclusive* range // between minValue and maxValue. // Any orderings work correctly: minValue <= maxValue and @@ -46,24 +32,3 @@ inline T cry_random(const T minValue, const T maxValue) { return CryRandom_Internal::g_random_generator.GetRandom(minValue, maxValue); } - -// Vector (Vec2, Vec3, Vec4) ranged function returns vector with -// every component within the *inclusive* ranges between minValue.component -// and maxValue.component. -// All orderings work correctly: minValue.component <= maxValue.component and -// minValue.component >= maxValue.component. -template -inline T cry_random_componentwise(const T& minValue, const T& maxValue) -{ - return CryRandom_Internal::g_random_generator.GetRandomComponentwise(minValue, maxValue); -} - -// The function returns a random unit vector (Vec2, Vec3, Vec4). -template -inline T cry_random_unit_vector() -{ - return CryRandom_Internal::g_random_generator.GetRandomUnitVector(); -} - -// eof -#endif // CRYINCLUDE_CRYCOMMON_RANDOM_H diff --git a/Code/Legacy/CryCommon/RenderBus.h b/Code/Legacy/CryCommon/RenderBus.h deleted file mode 100644 index 84259882a2..0000000000 --- a/Code/Legacy/CryCommon/RenderBus.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once - -#include - -namespace AZ -{ - /** - * This bus serves as a way for non-rendering systems to react to events - * that occur inside the renderer. For now these events will probably be implemented by - * things like CSystem and CryAction. In the future the idea is that these can be implemented - * by a user's GameComponent. - */ - class RenderNotifications - : public AZ::EBusTraits - { - public: - virtual ~RenderNotifications() = default; - - ////////////////////////////////////////////////////////////////////////// - // EBusTraits overrides - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; - ////////////////////////////////////////////////////////////////////////// - - /** - * This event gets posted at the beginning of CD3D9Renderer's FreeResources method, before the resources have been freed. - */ - virtual void OnRendererFreeResources([[maybe_unused]] int flags) {}; - }; - - using RenderNotificationsBus = AZ::EBus; - - /** - * This bus is used for renderer notifications that occur directly from the render thread - * while scene rendering is occurring. (In contrast, the RenderNotificationsBus above runs on the - * main thread while the renderer is preparing the scene.) - */ - class RenderThreadEvents - : public AZ::EBusTraits - { - public: - virtual ~RenderThreadEvents() = default; - - ////////////////////////////////////////////////////////////////////////// - // EBusTraits overrides - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; - ////////////////////////////////////////////////////////////////////////// - - /* - * This hook enables per-frame render work at the beginning of the frame. - * - * This event is triggered when RT_RenderScene is called at the beginning of a frame. - * The event will only be triggered on the render thread, if multithreaded rendering - * is enabled. And, it will only be triggered on a non-recursive scene render. - */ - virtual void OnRenderThreadRenderSceneBegin() {} - }; - - using RenderThreadEventsBus = AZ::EBus; - - /** - * This bus is used for firing screenshot request to any rendering system. - * The rendering system should implement its own screenshot function. - */ - class RenderScreenshotRequests - : public AZ::EBusTraits - { - public: - static const EBusHandlerPolicy HandlerPolicy = EBusHandlerPolicy::Single; ///< EBusTraits overrides - static const EBusAddressPolicy AddressPolicy = EBusAddressPolicy::Single; ///< EBusTraits overrides - - /** Take a screenshot and save it to a file. - @param filepath the path where a the screenshot is saved. - */ - virtual void WriteScreenshotToFile(const char* filepath) = 0; - - /** Take a screenshot and preserve it within a buffer - */ - virtual void WriteScreenshotToBuffer() = 0; - - /** Fill a provided buffer with the render buffer - @param imageBuffer The provided buffer to be filled - */ - virtual bool CopyScreenshotToBuffer(unsigned char* imageBuffer, unsigned int width, unsigned int height) = 0; - - }; - - using RenderScreenshotRequestBus = AZ::EBus; - - class RenderScreenshotNotifications - : public AZ::EBusTraits - { - public: - virtual ~RenderScreenshotNotifications() = default; - - static const EBusAddressPolicy AddressPolicy = EBusAddressPolicy::Single; ///< EBusTraits overrides - - /** Notify waiting components that the requested screenshot is ready - */ - virtual void OnScreenshotReady() = 0; - }; - - using RenderScreenshotNotificationBus = AZ::EBus; -} diff --git a/Code/Legacy/CryCommon/SFunctor.h b/Code/Legacy/CryCommon/SFunctor.h deleted file mode 100644 index d3075c9fae..0000000000 --- a/Code/Legacy/CryCommon/SFunctor.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -// Description : User header for multi DLL functors. - - -#ifndef CRYINCLUDE_CRYCOMMON_SFUNCTOR_H -#define CRYINCLUDE_CRYCOMMON_SFUNCTOR_H -#pragma once - - -#include "FunctorBaseFunction.h" -#include "FunctorBaseMember.h" - -// Needed for CryFont to compile. -// Maybe for others too. -#include "smartptr.h" - - -struct SFunctor -{ -public: - // Calls the functor method. - // returns true, if a functor is registered, false otherwise. - bool Call() - { - if (!m_pFunctor) - { - return false; - } - - m_pFunctor->Call(); - - return true; - } - - // Sets a new functor, common function, void return type, no arguments. - // Parameters: the function pointer. - template - void Set(tCallback pCallback) - { - typedef TFunctor TType; - m_pFunctor = new TType(pCallback); - } - - // Sets a new functor, common function, void return type, 1 argument. - // Parameters: the function pointer, the argument to be passed to the function. - template - void Set(tCallback pCallback, const tArgument1& Argument1) - { - typedef TFunctor TType; - m_pFunctor = new TType(pCallback, Argument1); - } - - // Sets a new functor, common function, void return type, 2 arguments. - // Parameters: the function pointer, the 2 arguments to be passed to the function. - template - void Set(tCallback pCallback, const tArgument1& Argument1, const tArgument2& Argument2) - { - typedef TFunctor TType; - m_pFunctor = new TType(pCallback, Argument1, Argument2); - } - - // Sets a new functor, common function, void return type, no arguments. - // Parameters: the function pointer, the 2 arguments to be passed to the function. - template - void Set(tCallee* pCallee, void (tCallee::* pCallback)()) - { - typedef TFunctor TType; - m_pFunctor = new TType(pCallee, pCallback); - } - - // Sets a new functor, common function, void return type, 1 argument. - // Parameters: the function pointer, the 2 arguments to be passed to the function, the argument. - template - void Set(tCallee* pCallee, void (tCallee::* pCallback)(tArgument1), const tArgument1& Argument1) - { - typedef TFunctor TType; - m_pFunctor = new TType(pCallee, pCallback, Argument1); - } - - // Sets a new functor, common function, void return type, 2 arguments. - // Parameters: the function pointer, the 2 arguments to be passed to the function, the 2 arguments. - template - void Set(tCallee* pCallee, void (tCallee::* pCallback)(tArgument1, tArgument2), const tArgument1& Argument1, const tArgument2& Argument2) - { - typedef TFunctor TType; - m_pFunctor = new TType(pCallee, pCallback, Argument1, Argument2); - } - - // Used to compare equality between 2 IFunctors. - bool operator==(const SFunctor& rOther) - { - return m_pFunctor == rOther.m_pFunctor; - } - - // Used order to IFunctors (needed for some containers, like map). - bool operator<(const SFunctor& rOther) - { - return m_pFunctor < rOther.m_pFunctor; - } -protected: - _smart_ptr m_pFunctor; -}; - -#endif // CRYINCLUDE_CRYCOMMON_SFUNCTOR_H diff --git a/Code/Legacy/CryCommon/SerializationTypes.h b/Code/Legacy/CryCommon/SerializationTypes.h index 6dbbe53f50..a041f0a836 100644 --- a/Code/Legacy/CryCommon/SerializationTypes.h +++ b/Code/Legacy/CryCommon/SerializationTypes.h @@ -10,7 +10,6 @@ SERIALIZATION_TYPE(bool) SERIALIZATION_TYPE(float) -SERIALIZATION_TYPE(double) SERIALIZATION_TYPE(Vec2) SERIALIZATION_TYPE(Vec3) SERIALIZATION_TYPE(Quat) @@ -24,5 +23,3 @@ SERIALIZATION_TYPE(uint16) SERIALIZATION_TYPE(uint32) SERIALIZATION_TYPE(uint64) SERIALIZATION_TYPE(CTimeValue) -SERIALIZATION_TYPE(SNetObjectID) -SERIALIZATION_TYPE(XmlNodeRef) // not for network - only for save games diff --git a/Code/Legacy/CryCommon/SerializeFwd.h b/Code/Legacy/CryCommon/SerializeFwd.h index e6cac372de..2b8a18b797 100644 --- a/Code/Legacy/CryCommon/SerializeFwd.h +++ b/Code/Legacy/CryCommon/SerializeFwd.h @@ -6,18 +6,10 @@ * */ - // Description : forward declaration of TSerialize - -#ifndef CRYINCLUDE_CRYCOMMON_SERIALIZEFWD_H -#define CRYINCLUDE_CRYCOMMON_SERIALIZEFWD_H #pragma once - - template class CSerializeWrapper; struct ISerialize; typedef CSerializeWrapper TSerialize; - -#endif // CRYINCLUDE_CRYCOMMON_SERIALIZEFWD_H diff --git a/Code/Legacy/CryCommon/SimpleSerialize.h b/Code/Legacy/CryCommon/SimpleSerialize.h index 7ce2c1c5dd..2fd57b7bc3 100644 --- a/Code/Legacy/CryCommon/SimpleSerialize.h +++ b/Code/Legacy/CryCommon/SimpleSerialize.h @@ -6,78 +6,29 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_SIMPLESERIALIZE_H -#define CRYINCLUDE_CRYCOMMON_SIMPLESERIALIZE_H #pragma once - -#include // <> required for Interfuscator #include "TimeValue.h" +#include // <> required for Interfuscator -template -class CSimpleSerializeImpl_Reading; - -template <> -class CSimpleSerializeImpl_Reading -{ -public: - CSimpleSerializeImpl_Reading() - : m_bCommit(true) {} - ILINE bool IsReading() const - { - return true; - } - ILINE bool ShouldCommitValues() const - { - return m_bCommit; - } - ILINE void Update(ISerializeUpdateFunction* pFunc) - { - if (m_bCommit) - { - pFunc->Execute(); - } - } -protected: - bool m_bCommit; -}; - -template <> -class CSimpleSerializeImpl_Reading -{ -public: - ILINE bool IsReading() const - { - return false; - } - ILINE bool ShouldCommitValues() const - { - return true; - } - ILINE void Update(ISerializeUpdateFunction*) - { - } -}; - -template +template class CSimpleSerializeImpl - : public CSimpleSerializeImpl_Reading { public: CSimpleSerializeImpl() - : m_failed(false) {} + : m_failed(false) + { + } + ILINE bool IsReading() const + { + return READING; + } ILINE void BeginGroup(const char* szName) { } ILINE void EndGroup() { } - ILINE ESerializationTarget GetSerializationTarget() const - { - return TARGET; - } - ILINE void FlagPartialRead() {} ILINE bool Ok() const { @@ -94,9 +45,8 @@ private: bool m_failed; }; -template -class CSimpleSerialize - : public ISerialize +template +class CSimpleSerialize : public ISerialize { public: ILINE CSimpleSerialize(Impl& impl) @@ -104,11 +54,6 @@ public: { } - void Update(ISerializeUpdateFunction* pFunc) - { - m_impl.Update(pFunc); - } - void BeginGroup(const char* szName) { m_impl.BeginGroup(szName); @@ -129,47 +74,25 @@ public: return m_impl.IsReading(); } - bool ShouldCommitValues() const + void WriteStringValue(const char* name, SSerializeString& value) { - return m_impl.ShouldCommitValues(); + m_impl.Value(name, value); + } + void ReadStringValue(const char* name, SSerializeString& curValue) + { + m_impl.Value(name, curValue); } - ESerializationTarget GetSerializationTarget() const - { - return m_impl.GetSerializationTarget(); +#define SERIALIZATION_TYPE(T) \ + void Value(const char* name, T& x) override \ + { \ + m_impl.Value(name, x); \ } - - void WriteStringValue(const char* name, SSerializeString& value, uint32 policy) - { - m_impl.Value(name, value, policy); - } - void ReadStringValue(const char* name, SSerializeString& curValue, uint32 policy) - { - m_impl.Value(name, curValue, policy); - } - - bool Ok() const - { - return m_impl.Ok(); - } - - void FlagPartialRead() - { - m_impl.FlagPartialRead(); - } - -#define SERIALIZATION_TYPE(T) \ - virtual void Value(const char* name, T & x, uint32 policy) { m_impl.Value(name, x, policy); } #include "SerializationTypes.h" #undef SERIALIZATION_TYPE -#define SERIALIZATION_TYPE(T) \ - virtual void ValueWithDefault([[maybe_unused]] const char* name, [[maybe_unused]] T & x, [[maybe_unused]] const T&defaultValue) { assert(0); } -#include "SerializationTypes.h" - SERIALIZATION_TYPE(SSerializeString) -#undef SERIALIZATION_TYPE - - Impl * GetInnerImpl() { + Impl* GetInnerImpl() + { return &m_impl; } @@ -181,26 +104,5 @@ protected: // Support serialization with default values, // Require Implementation serialization stub to have Value() method returning boolean. ////////////////////////////////////////////////////////////////////////// -template -class CSimpleSerializeWithDefaults - : public CSimpleSerialize -{ -public: - ILINE CSimpleSerializeWithDefaults(Impl& impl) - : CSimpleSerialize(impl) {} - -#define SERIALIZATION_TYPE(T) \ - virtual void ValueWithDefault(const char* name, T & x, const T&defaultValue) { \ - if (CSimpleSerialize::m_impl.IsReading()) { \ - if (!CSimpleSerialize::m_impl.Value(name, x, 0)) { \ - x = defaultValue; } \ - } \ - else if (x != defaultValue) { \ - CSimpleSerialize::m_impl.Value(name, x, 0); } \ - } -#include "SerializationTypes.h" - SERIALIZATION_TYPE(SSerializeString) -#undef SERIALIZATION_TYPE -}; - -#endif // CRYINCLUDE_CRYCOMMON_SIMPLESERIALIZE_H +template +using CSimpleSerializeWithDefaults = CSimpleSerialize; diff --git a/Code/Legacy/CryCommon/StatObjBus.h b/Code/Legacy/CryCommon/StatObjBus.h index b9a47f976d..5a05440cb0 100644 --- a/Code/Legacy/CryCommon/StatObjBus.h +++ b/Code/Legacy/CryCommon/StatObjBus.h @@ -5,47 +5,15 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - -#ifndef CRYINCLUDE_CRYCOMMON_STATOBJBUS_H -#define CRYINCLUDE_CRYCOMMON_STATOBJBUS_H +#pragma once #include #include -struct IStatObj; - -////////////////////////////////////////////////////////////////////////// -// -// Ebus support for handling unique IDs between IStatInstGroup instances. -// -////////////////////////////////////////////////////////////////////////// -using StatInstGroupId = int; - -class StatInstGroupEvents - : public AZ::EBusTraits -{ -public: - const static StatInstGroupId s_InvalidStatInstGroupId = -1; - - virtual ~StatInstGroupEvents() = default; - - // AZ::EBusTraits - static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; - static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; - using MutexType = AZStd::recursive_mutex; - - virtual StatInstGroupId GenerateStatInstGroupId() = 0; - virtual void ReleaseStatInstGroupId(StatInstGroupId statInstGroupId) = 0; - virtual void ReleaseStatInstGroupIdSet(const AZStd::unordered_set& statInstGroupIdSet) = 0; - virtual void ReserveStatInstGroupIdRange(StatInstGroupId from, StatInstGroupId to) = 0; -}; - -using StatInstGroupEventBus = AZ::EBus; - ////////////////////////////////////////////////////////////////////////// // // EBUS support for triggering necessary updates when IStatObj instances -// caches should be updated when 3D Engine events happen during level loads, +// caches should be updated when 3D Engine events happen during level loads, // shutting down the application, and so forth // ////////////////////////////////////////////////////////////////////////// @@ -66,6 +34,3 @@ public: }; using InstanceStatObjEventBus = AZ::EBus; - -#endif // CRYINCLUDE_CRYCOMMON_STATOBJBUS_H -#pragma once diff --git a/Code/Legacy/CryCommon/Synchronization.h b/Code/Legacy/CryCommon/Synchronization.h index d38160c967..ddd020ffde 100644 --- a/Code/Legacy/CryCommon/Synchronization.h +++ b/Code/Legacy/CryCommon/Synchronization.h @@ -6,9 +6,6 @@ * */ - -#ifndef CRYINCLUDE_CRYCOMMON_SYNCHRONIZATION_H -#define CRYINCLUDE_CRYCOMMON_SYNCHRONIZATION_H #pragma once @@ -25,46 +22,4 @@ namespace stl { - template - struct AutoLock - { - ILINE AutoLock(Sync& sync) - : _sync(sync) - { - sync.Lock(); - } - ILINE ~AutoLock() - { - _sync.Unlock(); - } - - private: - Sync& _sync; - }; - - - struct PSyncNone - { - void Lock() {} - void Unlock() {} - }; - - struct PSyncMultiThread - { - PSyncMultiThread() {} - - void Lock() - { - m_lock.lock(); - } - void Unlock() - { - m_lock.unlock(); - } - - private: - AZStd::spin_mutex m_lock; - }; }; - -#endif // CRYINCLUDE_CRYCOMMON_SYNCHRONIZATION_H diff --git a/Code/Legacy/CryCommon/TimeValue.h b/Code/Legacy/CryCommon/TimeValue.h index 14f402eb3d..a3da02ef62 100644 --- a/Code/Legacy/CryCommon/TimeValue.h +++ b/Code/Legacy/CryCommon/TimeValue.h @@ -21,8 +21,6 @@ public: static const int64 TIMEVALUE_PRECISION = 100000; // one second public: - void GetMemoryUsage(class ICrySizer*) const { /*nothing*/} - // Default constructor. ILINE CTimeValue() { @@ -164,8 +162,6 @@ public: ILINE bool operator==(const CTimeValue& inRhs) const { return m_lValue == inRhs.m_lValue; }; ILINE bool operator!=(const CTimeValue& inRhs) const { return m_lValue != inRhs.m_lValue; }; - void GetMemoryStatistics(class ICrySizer*) const { /*nothing*/} - private: // ---------------------------------------------------------- int64 m_lValue; // absolute or relative value in 1/TIMEVALUE_PRECISION, might be negative diff --git a/Code/Legacy/CryCommon/VertexFormats.h b/Code/Legacy/CryCommon/VertexFormats.h index 8f5d0f0923..97e0c20935 100644 --- a/Code/Legacy/CryCommon/VertexFormats.h +++ b/Code/Legacy/CryCommon/VertexFormats.h @@ -6,12 +6,9 @@ * */ - #pragma once #include -// Stream Configuration options -#define ENABLE_NORMALSTREAM_SUPPORT 1 enum EVertexFormat : uint8 { @@ -32,9 +29,6 @@ enum EVertexFormat : uint8 eVF_Max, }; - -typedef Vec4_tpl Vec4sf; // Used for tangents only. - struct UCol { union @@ -90,7 +84,7 @@ struct Vec3f16 w = CryConvertFloatToHalf(1.0f); return *this; } - _inline Vec3f16& operator = (const Vec4A& sl) + _inline Vec3f16& operator = (const Vec4& sl) { x = CryConvertFloatToHalf(sl.x); y = CryConvertFloatToHalf(sl.y); @@ -108,44 +102,6 @@ struct Vec3f16 } }; -struct Vec2f16 - : public CryHalf2 -{ - _inline Vec2f16() - { - } - _inline Vec2f16(f32 _x, f32 _y) - { - x = CryConvertFloatToHalf(_x); - y = CryConvertFloatToHalf(_y); - } - Vec2f16& operator = (const Vec2f16& sl) - { - x = sl.x; - y = sl.y; - return *this; - } - Vec2f16& operator = (const Vec2& sl) - { - x = CryConvertFloatToHalf(sl.x); - y = CryConvertFloatToHalf(sl.y); - return *this; - } - float operator[](int i) const - { - assert(i <= 1); - return CryConvertHalfToFloat(((CryHalf*)this)[i]); - } - _inline Vec2 ToVec2() const - { - Vec2 v; - v.x = CryConvertHalfToFloat(x); - v.y = CryConvertHalfToFloat(y); - return v; - } -}; - - struct SVF_P3F_C4B { Vec3 xyz; @@ -170,381 +126,7 @@ struct SVF_P2F_C4B_T2F_F4B uint8 pad; }; -struct SVF_P3S_C4B_T2S -{ - Vec3f16 xyz; - UCol color; - Vec2f16 st; -}; - -struct SVF_W4B_I4S -{ - UCol weights; - uint16 indices[4]; -}; - struct SVF_P3F { Vec3 xyz; }; - -//============================================================= -// Signed norm value packing [-1,+1] - -namespace PackingSNorm -{ - ILINE int16 tPackF2B(const float f) - { - return (int16)(f * 32767.0f); - } - - ILINE int16 tPackS2B(const int16 s) - { - return (int16)(s * 32767); - } - - ILINE float tPackB2F(const int16 i) - { - return (float)((float)i / 32767.0f); - } - - ILINE int16 tPackB2S(const int16 s) - { - // OPT: "(s >> 15) + !(s >> 15)" works as well - return (int16)(s / 32767); - } - - ILINE Vec4sf tPackF2Bv(const Vec4& v) - { - Vec4sf vs; - - vs.x = tPackF2B(v.x); - vs.y = tPackF2B(v.y); - vs.z = tPackF2B(v.z); - vs.w = tPackF2B(v.w); - - return vs; - } - - ILINE Vec4sf tPackF2Bv(const Vec3& v) - { - Vec4sf vs; - - vs.x = tPackF2B(v.x); - vs.y = tPackF2B(v.y); - vs.z = tPackF2B(v.z); - vs.w = tPackF2B(1.0f); - - return vs; - } - - ILINE Vec4 tPackB2F(const Vec4sf& v) - { - Vec4 vs; - - vs.x = tPackB2F(v.x); - vs.y = tPackB2F(v.y); - vs.z = tPackB2F(v.z); - vs.w = tPackB2F(v.w); - - return vs; - } - - ILINE void tPackB2F(const Vec4sf& v, Vec4& vDst) - { - vDst.x = tPackB2F(v.x); - vDst.y = tPackB2F(v.y); - vDst.z = tPackB2F(v.z); - vDst.w = 1.0f; - } - - ILINE void tPackB2FScale(const Vec4sf& v, Vec4& vDst, const Vec3& vScale) - { - vDst.x = (float)v.x * vScale.x; - vDst.y = (float)v.y * vScale.y; - vDst.z = (float)v.z * vScale.z; - vDst.w = 1.0f; - } - - ILINE void tPackB2FScale(const Vec4sf& v, Vec3& vDst, const Vec3& vScale) - { - vDst.x = (float)v.x * vScale.x; - vDst.y = (float)v.y * vScale.y; - vDst.z = (float)v.z * vScale.z; - } - - ILINE void tPackB2F(const Vec4sf& v, Vec3& vDst) - { - vDst.x = tPackB2F(v.x); - vDst.y = tPackB2F(v.y); - vDst.z = tPackB2F(v.z); - } -}; - -//============================================================= -// Pip => Graphics Pipeline structures, used for inputs for the GPU's Input Assembler -// These structures are optimized for fast decoding (ALU and bandwidth) and -// might be slow to encode on-the-fly - -struct SPipTangents -{ - SPipTangents() {} - -private: - Vec4sf Tangent; - Vec4sf Bitangent; - -public: - explicit SPipTangents(const Vec4sf& othert, const Vec4sf& otherb, const int16& othersign) - { - using namespace PackingSNorm; - Tangent = othert; - Tangent.w = PackingSNorm::tPackS2B(othersign); - Bitangent = otherb; - Bitangent.w = PackingSNorm::tPackS2B(othersign); - } - - explicit SPipTangents(const Vec4sf& othert, const Vec4sf& otherb, const SPipTangents& othersign) - { - Tangent = othert; - Tangent.w = othersign.Tangent.w; - Bitangent = otherb; - Bitangent.w = othersign.Bitangent.w; - } - - explicit SPipTangents(const Vec4sf& othert, const Vec4sf& otherb) - { - Tangent = othert; - Bitangent = otherb; - } - - explicit SPipTangents(const Vec3& othert, const Vec3& otherb, const int16& othersign) - { - Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), PackingSNorm::tPackS2B(othersign)); - Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), PackingSNorm::tPackS2B(othersign)); - } - - explicit SPipTangents(const Vec3& othert, const Vec3& otherb, const SPipTangents& othersign) - { - Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), othersign.Tangent.w); - Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), othersign.Bitangent.w); - } - - explicit SPipTangents(const Quat& other, const int16& othersign) - { - Vec3 othert = other.GetColumn0(); - Vec3 otherb = other.GetColumn1(); - - Tangent = Vec4sf(PackingSNorm::tPackF2B(othert.x), PackingSNorm::tPackF2B(othert.y), PackingSNorm::tPackF2B(othert.z), PackingSNorm::tPackS2B(othersign)); - Bitangent = Vec4sf(PackingSNorm::tPackF2B(otherb.x), PackingSNorm::tPackF2B(otherb.y), PackingSNorm::tPackF2B(otherb.z), PackingSNorm::tPackS2B(othersign)); - } - - void ExportTo(Vec4sf& othert, Vec4sf& otherb) const - { - othert = Tangent; - otherb = Bitangent; - } - - // get normal tangent and bitangent vectors - void GetTB(Vec4& othert, Vec4& otherb) const - { - othert = PackingSNorm::tPackB2F(Tangent); - otherb = PackingSNorm::tPackB2F(Bitangent); - } - - // get normal vector (perpendicular to tangent and bitangent plane) - ILINE Vec3 GetN() const - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z), - btg3(btg.x, btg.y, btg.z); - - // assumes w 1 or -1 - return tng3.Cross(btg3) * tng.w; - } - - // get normal vector (perpendicular to tangent and bitangent plane) - void GetN(Vec3& othern) const - { - othern = GetN(); - } - - // get the tangent-space basis as individual normal vectors (tangent, bitangent and normal) - void GetTBN(Vec3& othert, Vec3& otherb, Vec3& othern) const - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z), - btg3(btg.x, btg.y, btg.z); - - // assumes w 1 or -1 - othert = tng3; - otherb = btg3; - othern = tng3.Cross(btg3) * tng.w; - } - - // get normal vector sign (reflection) - ILINE int16 GetR() const - { - return PackingSNorm::tPackB2S(Tangent.w); - } - - // get normal vector sign (reflection) - void GetR(int16& sign) const - { - sign = GetR(); - } - - void TransformBy(const Matrix34& trn) - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z), - btg3(btg.x, btg.y, btg.z); - - tng3 = trn.TransformVector(tng3); - btg3 = trn.TransformVector(btg3); - - *this = SPipTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); - } - - void TransformSafelyBy(const Matrix34& trn) - { - Vec4 tng, btg; - GetTB(tng, btg); - - Vec3 tng3(tng.x, tng.y, tng.z), - btg3(btg.x, btg.y, btg.z); - - tng3 = trn.TransformVector(tng3); - btg3 = trn.TransformVector(btg3); - - // normalize in case "trn" wasn't length-preserving - tng3.Normalize(); - btg3.Normalize(); - - *this = SPipTangents(tng3, btg3, PackingSNorm::tPackB2S(Tangent.w)); - } -}; - -struct SPipQTangents -{ - SPipQTangents() {} - -private: - Vec4sf QTangent; - -public: - explicit SPipQTangents(const Vec4sf& other) - { - QTangent = other; - } - - bool operator ==(const SPipQTangents& other) const - { - return - QTangent[0] == other.QTangent[0] || - QTangent[1] == other.QTangent[1] || - QTangent[2] == other.QTangent[2] || - QTangent[3] == other.QTangent[3]; - } - - bool operator !=(const SPipQTangents& other) const - { - return !(*this == other); - } - - // get quaternion - ILINE Quat GetQ() const - { - Quat q; - - q.v.x = PackingSNorm::tPackB2F(QTangent.x); - q.v.y = PackingSNorm::tPackB2F(QTangent.y); - q.v.z = PackingSNorm::tPackB2F(QTangent.z); - q.w = PackingSNorm::tPackB2F(QTangent.w); - - return q; - } - - // get normal vector from quaternion - ILINE Vec3 GetN() const - { - const Quat q = GetQ(); - return q.GetColumn2() * (q.w < 0.0f ? -1.0f : +1.0f); - } -}; - -struct SPipNormal - : public Vec3 -{ - SPipNormal() {} - - explicit SPipNormal(const Vec3& othern) - { - x = othern.x; - y = othern.y; - z = othern.z; - } - - // get normal vector - ILINE Vec3 GetN() const - { - return *this; - } - - // get normal vector - void GetN(Vec3& othern) const - { - othern = GetN(); - } - - void TransformBy(const Matrix34& trn) - { - *this = SPipNormal(trn.TransformVector(*this)); - } - - void TransformSafelyBy(const Matrix34& trn) - { - // normalize in case "trn" wasn't length-preserving - *this = SPipNormal(trn.TransformVector(*this).normalize()); - } -}; - -//================================================================================================== - -typedef SVF_P3F_C4B_T2F SAuxVertex; - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// Vertex Sizes -//extern const int m_VertexSize[]; - -//============================================================================ -// Custom vertex streams definitions -// NOTE: If you add new stream ID also include vertex declarations creating in -// CD3D9Renderer::EF_InitD3DVertexDeclarations (D3DRendPipeline.cpp) - -// Stream IDs -enum EStreamIDs -{ - VSF_GENERAL, // General vertex buffer - VSF_TANGENTS, // Tangents buffer - VSF_QTANGENTS, // Tangents buffer - VSF_HWSKIN_INFO, // HW skinning buffer - VSF_VERTEX_VELOCITY, // Velocity buffer -# if ENABLE_NORMALSTREAM_SUPPORT - VSF_NORMALS, // Normals, used for skinning -#endif - // <- Insert new stream IDs here - VSF_NUM, // Number of vertex streams - - VSF_MORPHBUDDY = 8, // Morphing (from m_pMorphBuddy) - VSF_INSTANCED = 9, // Data is for instance stream - VSF_MORPHBUDDY_WEIGHTS = 15, // Morphing weights -}; - -//================================================================================================================== diff --git a/Code/Legacy/CryCommon/WinBase.cpp b/Code/Legacy/CryCommon/WinBase.cpp index 8473417d4a..71bec78f69 100644 --- a/Code/Legacy/CryCommon/WinBase.cpp +++ b/Code/Legacy/CryCommon/WinBase.cpp @@ -810,21 +810,6 @@ void replaceDoublePathFilename(char* szFileName) azstrcpy((char*)szFileName, AZ_MAX_PATH_LEN, s.c_str()); } -const int comparePathNames(const char* cpFirst, const char* cpSecond, unsigned int len) -{ - //create two strings and replace the \\ by / and /./ by / - AZStd::string first(cpFirst); - AZStd::string second(cpSecond); - adaptFilenameToLinux(first); - adaptFilenameToLinux(second); - if (strlen(cpFirst) < len || strlen(cpSecond) < len) - { - return -1; - } - unsigned int length = std::min(std::min(first.size(), second.size()), (size_t)len); //make sure not to access invalid memory - return memicmp(first.c_str(), second.c_str(), length); -} - #if FIX_FILENAME_CASE static bool FixOnePathElement(char* path) { diff --git a/Code/Legacy/CryCommon/crycommon_files.cmake b/Code/Legacy/CryCommon/crycommon_files.cmake index 2f5030ccc4..c1cdcf094a 100644 --- a/Code/Legacy/CryCommon/crycommon_files.cmake +++ b/Code/Legacy/CryCommon/crycommon_files.cmake @@ -25,7 +25,6 @@ set(FILES IMiniLog.h IMovieSystem.h IProcess.h - IReadWriteXMLSink.h IRenderAuxGeom.h IRenderer.h ISerialize.h @@ -33,7 +32,6 @@ set(FILES ISplines.h IStatObj.h StatObjBus.h - ISurfaceType.h ISystem.h ITexture.h ITimer.h @@ -46,9 +44,6 @@ set(FILES VRCommon.h INavigationSystem.h IMNM.h - SFunctor.h - FunctorBaseFunction.h - FunctorBaseMember.h SerializationTypes.h CryEndian.h CryRandomInternal.h @@ -56,21 +51,15 @@ set(FILES LCGRandom.h BaseTypes.h AnimKey.h - BitFiddling.h - Common_TypeInfo.cpp CryAssert.h - CryCrc32.h CryFile.h CryListenerSet.h CryLegacyAllocator.h CryPath.h - CryPodArray.h - CrySizer.h CrySystemBus.h CryVersion.h LegacyAllocator.cpp LegacyAllocator.h - MetaUtils.h MiniQueue.h MultiThread_Containers.h NullAudioSystem.h @@ -82,13 +71,11 @@ set(FILES SimpleSerialize.h smartptr.h StlUtils.h - Synchronization.h Timer.h TimeValue.h VectorMap.h VertexFormats.h XMLBinaryHeaders.h - RenderBus.h MainThreadRenderRequestBus.h Cry_Matrix33.h Cry_Matrix34.h @@ -106,8 +93,6 @@ set(FILES Cry_Vector3.h CryHalf.inl MathConversion.h - Cry_HWMatrix.h - Cry_HWVector3.h AndroidSpecific.h AppleSpecific.h CryAssert_Android.h diff --git a/Code/Legacy/CryCommon/platform_impl.cpp b/Code/Legacy/CryCommon/platform_impl.cpp index d61bfe6ee4..323d3daf65 100644 --- a/Code/Legacy/CryCommon/platform_impl.cpp +++ b/Code/Legacy/CryCommon/platform_impl.cpp @@ -340,73 +340,6 @@ inline void CryDebugStr([[maybe_unused]] const char* format, ...) */ } -alignas(64) uint32 BoxSides[0x40 * 8] = { - 0, 0, 0, 0, 0, 0, 0, 0, //00 - 0, 4, 6, 2, 0, 0, 0, 4, //01 - 7, 5, 1, 3, 0, 0, 0, 4, //02 - 0, 0, 0, 0, 0, 0, 0, 0, //03 - 0, 1, 5, 4, 0, 0, 0, 4, //04 - 0, 1, 5, 4, 6, 2, 0, 6, //05 - 7, 5, 4, 0, 1, 3, 0, 6, //06 - 0, 0, 0, 0, 0, 0, 0, 0, //07 - 7, 3, 2, 6, 0, 0, 0, 4, //08 - 0, 4, 6, 7, 3, 2, 0, 6, //09 - 7, 5, 1, 3, 2, 6, 0, 6, //0a - 0, 0, 0, 0, 0, 0, 0, 0, //0b - 0, 0, 0, 0, 0, 0, 0, 0, //0c - 0, 0, 0, 0, 0, 0, 0, 0, //0d - 0, 0, 0, 0, 0, 0, 0, 0, //0e - 0, 0, 0, 0, 0, 0, 0, 0, //0f - 0, 2, 3, 1, 0, 0, 0, 4, //10 - 0, 4, 6, 2, 3, 1, 0, 6, //11 - 7, 5, 1, 0, 2, 3, 0, 6, //12 - 0, 0, 0, 0, 0, 0, 0, 0, //13 - 0, 2, 3, 1, 5, 4, 0, 6, //14 - 1, 5, 4, 6, 2, 3, 0, 6, //15 - 7, 5, 4, 0, 2, 3, 0, 6, //16 - 0, 0, 0, 0, 0, 0, 0, 0, //17 - 0, 2, 6, 7, 3, 1, 0, 6, //18 - 0, 4, 6, 7, 3, 1, 0, 6, //19 - 7, 5, 1, 0, 2, 6, 0, 6, //1a - 0, 0, 0, 0, 0, 0, 0, 0, //1b - 0, 0, 0, 0, 0, 0, 0, 0, //1c - 0, 0, 0, 0, 0, 0, 0, 0, //1d - 0, 0, 0, 0, 0, 0, 0, 0, //1e - 0, 0, 0, 0, 0, 0, 0, 0, //1f - 7, 6, 4, 5, 0, 0, 0, 4, //20 - 0, 4, 5, 7, 6, 2, 0, 6, //21 - 7, 6, 4, 5, 1, 3, 0, 6, //22 - 0, 0, 0, 0, 0, 0, 0, 0, //23 - 7, 6, 4, 0, 1, 5, 0, 6, //24 - 0, 1, 5, 7, 6, 2, 0, 6, //25 - 7, 6, 4, 0, 1, 3, 0, 6, //26 - 0, 0, 0, 0, 0, 0, 0, 0, //27 - 7, 3, 2, 6, 4, 5, 0, 6, //28 - 0, 4, 5, 7, 3, 2, 0, 6, //29 - 6, 4, 5, 1, 3, 2, 0, 6, //2a - 0, 0, 0, 0, 0, 0, 0, 0, //2b - 0, 0, 0, 0, 0, 0, 0, 0, //2c - 0, 0, 0, 0, 0, 0, 0, 0, //2d - 0, 0, 0, 0, 0, 0, 0, 0, //2e - 0, 0, 0, 0, 0, 0, 0, 0, //2f - 0, 0, 0, 0, 0, 0, 0, 0, //30 - 0, 0, 0, 0, 0, 0, 0, 0, //31 - 0, 0, 0, 0, 0, 0, 0, 0, //32 - 0, 0, 0, 0, 0, 0, 0, 0, //33 - 0, 0, 0, 0, 0, 0, 0, 0, //34 - 0, 0, 0, 0, 0, 0, 0, 0, //35 - 0, 0, 0, 0, 0, 0, 0, 0, //36 - 0, 0, 0, 0, 0, 0, 0, 0, //37 - 0, 0, 0, 0, 0, 0, 0, 0, //38 - 0, 0, 0, 0, 0, 0, 0, 0, //39 - 0, 0, 0, 0, 0, 0, 0, 0, //3a - 0, 0, 0, 0, 0, 0, 0, 0, //3b - 0, 0, 0, 0, 0, 0, 0, 0, //3c - 0, 0, 0, 0, 0, 0, 0, 0, //3d - 0, 0, 0, 0, 0, 0, 0, 0, //3e - 0, 0, 0, 0, 0, 0, 0, 0, //3f -}; - //////////////////////////////////////////////////////////////////////////////////////////////////////////// #if defined(AZ_RESTRICTED_PLATFORM) #define AZ_RESTRICTED_SECTION PLATFORM_IMPL_H_SECTION_VIRTUAL_ALLOCATORS diff --git a/Code/Legacy/CrySystem/CrySystem_precompiled.h b/Code/Legacy/CrySystem/CrySystem_precompiled.h index 79fbbd92be..faa924931f 100644 --- a/Code/Legacy/CrySystem/CrySystem_precompiled.h +++ b/Code/Legacy/CrySystem/CrySystem_precompiled.h @@ -81,7 +81,6 @@ #include #include #include -#include #include diff --git a/Code/Legacy/CrySystem/Huffman.h b/Code/Legacy/CrySystem/Huffman.h index 942663095e..33f77a2829 100644 --- a/Code/Legacy/CrySystem/Huffman.h +++ b/Code/Legacy/CrySystem/Huffman.h @@ -122,24 +122,6 @@ public: void CompressInput(const uint8* const pInput, const size_t numBytes, uint8* const pOutput, size_t* const outputSize); size_t UncompressInput(const uint8* const pInput, const size_t numBytes, uint8* const pOutput, const size_t maxOutputSize); - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - - if (m_Counts != NULL) - { - pSizer->AddObject(m_Counts, sizeof(uint32), MAX_NUM_SYMBOLS); - } - if (m_TreeNodes != NULL) - { - pSizer->AddObject(m_TreeNodes, sizeof(HuffmanTreeNode), MAX_NUM_NODES); - } - if (m_Codes != NULL) - { - pSizer->AddObject(m_Codes, sizeof(HuffmanSymbolCode), MAX_NUM_CODES); - } - } - private: void ScaleCountsAndUpdateNodes(); int BuildTree(); diff --git a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp index fe87c3f784..a9e0c3d677 100644 --- a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp +++ b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp @@ -37,12 +37,6 @@ namespace LegacyLevelSystem { static constexpr const char* ArchiveExtension = ".pak"; -void CLevelInfo::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(m_levelName); - pSizer->AddObject(m_levelPath); -} - ////////////////////////////////////////////////////////////////////////// bool CLevelInfo::OpenLevelPak() { @@ -829,14 +823,6 @@ void CLevelSystem::LogLoadingTime() gEnv->pLog->Log(text.c_str()); } -void CLevelSystem::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_levelInfos); - pSizer->AddObject(m_levelsFolder); - pSizer->AddObject(m_listeners); -} - ////////////////////////////////////////////////////////////////////////// void CLevelSystem::UnloadLevel() { diff --git a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h index f77f818b84..836d2c2484 100644 --- a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h +++ b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h @@ -31,8 +31,6 @@ public: // ~ILevelInfo - void GetMemoryUsage(ICrySizer*) const; - private: bool ReadInfo(); @@ -114,8 +112,6 @@ public: // ~ILevelSystem - void GetMemoryUsage(ICrySizer* s) const; - private: float GetLastLevelLoadTime() { return m_fLastLevelLoadTime; } diff --git a/Code/Legacy/CrySystem/LocalizedStringManager.cpp b/Code/Legacy/CrySystem/LocalizedStringManager.cpp index 365c71252c..a87800899d 100644 --- a/Code/Legacy/CrySystem/LocalizedStringManager.cpp +++ b/Code/Legacy/CrySystem/LocalizedStringManager.cpp @@ -802,16 +802,6 @@ bool CLocalizedStringsManager::ReleaseLocalizationDataByTag( m_pLanguage->m_vLocalizedStrings.clear(); m_pLanguage->m_vLocalizedStrings = newVec; } - - /*LARGE_INTEGER liEnd, liFreq; - QueryPerformanceCounter(&liEnd); - QueryPerformanceFrequency(&liFreq); - - CTimeValue lockTime = CTimeValue((liEnd.QuadPart - liStart.QuadPart) * CTimeValue::TIMEVALUE_PRECISION / liFreq.QuadPart); - if (m_cvarLocalizationDebug >= 2) - { - CryLog(" ReleaseLocalizationDataByTag %s lock time %fMS", sTag, lockTime.GetMilliSeconds()); - }*/ } if (m_cvarLocalizationDebug >= 2) @@ -2418,16 +2408,6 @@ void CLocalizedStringsManager::FormatStringMessage(AZStd::string& outString, con } ////////////////////////////////////////////////////////////////////////// -int CLocalizedStringsManager::GetMemoryUsage(ICrySizer* pSizer) -{ - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_languages); - pSizer->AddObject(m_prototypeEvents); - pSizer->AddObject(m_characterNameSet); - pSizer->AddObject(m_pLanguage); - - return 0; -} #if defined (WIN32) || defined(WIN64) namespace diff --git a/Code/Legacy/CrySystem/LocalizedStringManager.h b/Code/Legacy/CrySystem/LocalizedStringManager.h index 1fba05f9ac..b1cb5b2067 100644 --- a/Code/Legacy/CrySystem/LocalizedStringManager.h +++ b/Code/Legacy/CrySystem/LocalizedStringManager.h @@ -89,8 +89,6 @@ public: void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam); // ~ISystemEventManager - int GetMemoryUsage(ICrySizer* pSizer); - void GetLoadedTags(TLocalizationTagVec& tagVec); void FreeLocalizationData(); @@ -113,17 +111,6 @@ private: AZStd::string sOriginalCharacterName; // english character name speaking via XML asset unsigned int nRow; // Number of row in XML file - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - - pSizer->AddObject(sKey); - pSizer->AddObject(sOriginalActorLine); - pSizer->AddObject(sUtf8TranslatedActorLine); - pSizer->AddObject(sOriginalText); - pSizer->AddObject(sOriginalCharacterName); - } }; struct SLanguage; @@ -194,28 +181,6 @@ private: }; AZStd::string GetTranslatedText(const SLanguage* pLanguage) const; - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - - pSizer->AddObject(sCharacterName); - - if ((flags & IS_COMPRESSED) == 0 && TranslatedText.psUtf8Uncompressed != NULL) //Number of bytes stored for compressed text is unknown, which throws this GetMemoryUsage off - { - pSizer->AddObject(*TranslatedText.psUtf8Uncompressed); - } - - pSizer->AddObject(sPrototypeSoundEvent); - - pSizer->AddObject(SoundMoods); - pSizer->AddObject(EventParameters); - - if (pEditorExtension != NULL) - { - pEditorExtension->GetMemoryUsage(pSizer); - } - } }; //Keys as CRC32. Strings previously, but these proved too large @@ -230,15 +195,6 @@ private: StringsKeyMap m_keysMap; TLocalizedStringEntries m_vLocalizedStrings; THuffmanCoders m_vEncoders; - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(sLanguage); - pSizer->AddObject(m_vLocalizedStrings); - pSizer->AddObject(m_keysMap); - pSizer->AddObject(m_vEncoders); - } }; struct SFileInfo diff --git a/Code/Legacy/CrySystem/Log.h b/Code/Legacy/CrySystem/Log.h index f3bee44283..fb683e66ef 100644 --- a/Code/Legacy/CrySystem/Log.h +++ b/Code/Legacy/CrySystem/Log.h @@ -11,6 +11,13 @@ #include #include +#include +#include +#include + +struct IConsole; +struct ICVar; +struct ISystem; ////////////////////////////////////////////////////////////////////// #if defined(ANDROID) || defined(AZ_PLATFORM_MAC) @@ -105,7 +112,6 @@ private: // ------------------------------------------------------------------- ELogType logType; bool bAdd; Destination destination; - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const {} }; void CheckAndPruneBackupLogs() const; @@ -193,17 +199,6 @@ private: // ------------------------------------------------------------------- #endif public: // ------------------------------------------------------------------- - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_pLogVerbosity); - pSizer->AddObject(m_pLogWriteToFile); - pSizer->AddObject(m_pLogWriteToFileVerbosity); - pSizer->AddObject(m_pLogVerbosityOverridesWriteToFile); - pSizer->AddObject(m_pLogSpamDelay); - pSizer->AddObject(m_threadSafeMsgQueue); - } // checks the verbosity of the message and returns NULL if the message must NOT be // logged, or the pointer to the part of the message that should be logged const char* CheckAgainstVerbosity(const char* pText, bool& logtofile, bool& logtoconsole, const uint8 DefaultVerbosity = 2); diff --git a/Code/Legacy/CrySystem/System.cpp b/Code/Legacy/CrySystem/System.cpp index 0f0a62f8c6..71775dbb6c 100644 --- a/Code/Legacy/CrySystem/System.cpp +++ b/Code/Legacy/CrySystem/System.cpp @@ -125,7 +125,6 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) #include "Log.h" #include "XML/xml.h" -#include "XML/ReadWriteXMLSink.h" #include "LocalizedStringManager.h" #include "XML/XmlUtils.h" @@ -340,9 +339,6 @@ CSystem::~CSystem() ////////////////////////////////////////////////////////////////////////// void CSystem::Release() { - //Disconnect the render bus - AZ::RenderNotificationsBus::Handler::BusDisconnect(); - delete this; } diff --git a/Code/Legacy/CrySystem/System.h b/Code/Legacy/CrySystem/System.h index 738ffd4bfb..9023171ea3 100644 --- a/Code/Legacy/CrySystem/System.h +++ b/Code/Legacy/CrySystem/System.h @@ -18,19 +18,22 @@ #include "CmdLine.h" #include -#include "RenderBus.h" - #include #include #include +#include +#include + namespace AzFramework { class MissingAssetLogger; } struct IConsoleCmdArgs; +struct ICVar; +struct IFFont; class CWatchdogThread; #if defined(AZ_RESTRICTED_PLATFORM) @@ -48,48 +51,11 @@ class CWatchdogThread; #if defined(WIN32) || defined(LINUX) || defined(APPLE) #define AZ_LEGACY_CRYSYSTEM_TRAIT_ALLOW_CREATE_BACKUP_LOG_FILE 1 #endif -#if defined(WIN32) || (defined(LINUX) && !defined(ANDROID)) || defined(MAC) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_DEFINE_DETECT_PROCESSOR 1 -#endif ////////////////////////////////////////////////////////////////////////// #if defined(WIN32) || defined(APPLE) || defined(LINUX) #define AZ_LEGACY_CRYSYSTEM_TRAIT_DO_PREASSERT 1 #endif -#if defined(MAC) || (defined(LINUX) && !defined(ANDROID)) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_ASM_VOLATILE_CPUID 1 -#endif -#if (defined(WIN32) && !defined(WIN64)) || (defined(LINUX) && !defined(ANDROID) && !defined(LINUX64)) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_HAS64BITEXT 1 -#endif -#if defined(WIN32) || (defined(LINUX) && !defined(ANDROID)) || defined(MAC) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_HTSUPPORTED 1 -#endif -#if defined(WIN32) || (defined(LINUX) && !defined(ANDROID)) || defined(MAC) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_HASCPUID 1 -#endif -#if defined(WIN32) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_HASAFFINITYMASK 1 -#endif - -#if defined(LINUX) || defined(APPLE) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_CRYPAK_POSIX 1 -#endif - -#if defined(WIN64) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_USE_BIT64 1 -#endif - -#if defined(WIN32) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_USE_PACKED_PEHEADER 1 -#endif -#if defined(WIN32) || defined(LINUX) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_USE_RENDERMEMORY_INFO 1 -#endif - -#if defined(WIN32) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_USE_HANDLER_SYNC_AFFINITY 1 -#endif #if defined(LINUX) || defined(APPLE) #define AZ_LEGACY_CRYSYSTEM_TRAIT_FORWARD_EXCEPTION_POINTERS 1 @@ -105,18 +71,6 @@ class CWatchdogThread; #define AZ_LEGACY_CRYSYSTEM_TRAIT_DEBUGCALLSTACK_APPEND_MODULENAME 1 #endif -#if !(defined(ANDROID) || defined(IOS) || defined(LINUX)) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_IMAGEHANDLER_TIFFIO 1 -#endif - -#if 1 -#define AZ_LEGACY_CRYSYSTEM_TRAIT_JOBMANAGER_SIXWORKERTHREADS 0 -#endif - -#if defined(WIN32) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_MEMADDRESSRANGE_WINDOWS_STYLE 1 -#endif - #if 1 #define AZ_LEGACY_CRYSYSTEM_TRAIT_USE_EXCLUDEUPDATE_ON_CONSOLE 0 #endif @@ -127,31 +81,8 @@ class CWatchdogThread; #define AZ_LEGACY_CRYSYSTEM_TRAIT_CAPTURESTACK 1 #endif -#if !defined(LINUX) && !defined(APPLE) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_SYSTEMCFG_MODULENAME 1 -#endif - -#if defined(WIN32) || defined(WIN64) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_THREADINFO_WINDOWS_STYLE 1 -#endif - -#if defined(WIN32) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_THREADTASK_EXCEPTIONS 1 -#endif ////////////////////////////////////////////////////////////////////////// -#if defined(APPLE) || defined(LINUX) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_FACTORY_REGISTRY_USE_PRINTF_FOR_FATAL 1 -#endif - -#if defined(LINUX) || defined(APPLE) -#define AZ_LEGACY_CRYSYSTEM_TRAIT_USE_FTELL_NOT_FTELLI64 1 -#endif - -#endif - -#if defined(USE_UNIXCONSOLE) || defined(USE_ANDROIDCONSOLE) || defined(USE_WINDOWSCONSOLE) || defined(USE_IOSCONSOLE) || defined(USE_NULLCONSOLE) -#define USE_DEDICATED_SERVER_CONSOLE #endif #if defined(LINUX) @@ -269,7 +200,6 @@ class CSystem , public ILoadConfigurationEntrySink , public ISystemEventListener , public IWindowMessageHandler - , public AZ::RenderNotificationsBus::Handler , public CrySystemRequestBus::Handler { public: diff --git a/Code/Legacy/CrySystem/SystemCFG.cpp b/Code/Legacy/CrySystem/SystemCFG.cpp index 0f67fdc2e1..7633a62f04 100644 --- a/Code/Legacy/CrySystem/SystemCFG.cpp +++ b/Code/Legacy/CrySystem/SystemCFG.cpp @@ -22,8 +22,6 @@ #include #include -#include "SystemCFG.h" - #if defined(AZ_RESTRICTED_PLATFORM) #undef AZ_RESTRICTED_SECTION #define SYSTEMCFG_CPP_SECTION_1 1 @@ -180,7 +178,7 @@ void CSystem::LogVersion() strftime(s, 128, "%d %b %y (%H %M %S)", today); #endif - [[maybe_unused]] const SFileVersion& ver = GetFileVersion(); + const SFileVersion& ver = GetFileVersion(); CryLogAlways("BackupNameAttachment=\" Build(%d) %s\" -- used by backup system\n", ver.v[0], s); // read by CreateBackupFile() @@ -251,122 +249,21 @@ void CSystem::LogVersion() ////////////////////////////////////////////////////////////////////////// void CSystem::LogBuildInfo() { - [[maybe_unused]] auto projectName = AZ::Utils::GetProjectName(); + auto projectName = AZ::Utils::GetProjectName(); CryLogAlways("GameName: %s", projectName.c_str()); CryLogAlways("BuildTime: " __DATE__ " " __TIME__); } - - -////////////////////////////////////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////// -class CCVarSaveDump - : public ICVarDumpSink -{ -public: - - CCVarSaveDump(FILE* pFile) - { - m_pFile = pFile; - } - - virtual void OnElementFound(ICVar* pCVar) - { - if (!pCVar) - { - return; - } - int nFlags = pCVar->GetFlags(); - if (((nFlags & VF_DUMPTODISK) && (nFlags & VF_MODIFIED)) || (nFlags & VF_WASINCONFIG)) - { - AZStd::string szValue = pCVar->GetString(); - int pos; - - pos = 1; - for (;; ) - { - pos = static_cast(szValue.find_first_of("\\", pos)); - - if (pos == AZStd::string::npos) - { - break; - } - - szValue.replace(pos, 1, "\\\\", 2); - pos += 2; - } - - // replace " with \" - pos = 1; - for (;; ) - { - pos = static_cast(szValue.find_first_of("\"", pos)); - - if (pos == AZStd::string::npos) - { - break; - } - - szValue.replace(pos, 1, "\\\"", 2); - pos += 2; - } - - AZStd::string szLine = pCVar->GetName(); - - if (pCVar->GetType() == CVAR_STRING) - { - szLine += " = \"" + szValue + "\"\r\n"; - } - else - { - szLine += " = " + szValue + "\r\n"; - } - - if (pCVar->GetFlags() & VF_WARNING_NOTUSED) - { - fputs("-- REMARK: the following was not assigned to a console variable\r\n", m_pFile); - } - - fputs(szLine.c_str(), m_pFile); - } - } - -private: // -------------------------------------------------------- - - FILE* m_pFile; // -}; - ////////////////////////////////////////////////////////////////////////// void CSystem::SaveConfiguration() { } ////////////////////////////////////////////////////////////////////////// -// system cfg -////////////////////////////////////////////////////////////////////////// -CSystemConfiguration::CSystemConfiguration(const AZStd::string& strSysConfigFilePath, CSystem* pSystem, ILoadConfigurationEntrySink* pSink, bool warnIfMissing) - : m_strSysConfigFilePath(strSysConfigFilePath) - , m_bError(false) - , m_pSink(pSink) - , m_warnIfMissing(warnIfMissing) +static bool ParseSystemConfig(const AZStd::string& strSysConfigFilePath, ILoadConfigurationEntrySink* pSink, bool warnIfMissing) { assert(pSink); - - m_pSystem = pSystem; - m_bError = !ParseSystemConfig(); -} - -////////////////////////////////////////////////////////////////////////// -CSystemConfiguration::~CSystemConfiguration() -{ -} - -////////////////////////////////////////////////////////////////////////// -bool CSystemConfiguration::ParseSystemConfig() -{ - AZStd::string filename = m_strSysConfigFilePath; + AZStd::string filename = strSysConfigFilePath; if (strlen(PathUtil::GetExt(filename.c_str())) == 0) { filename = PathUtil::ReplaceExtension(filename, "cfg"); @@ -384,7 +281,7 @@ bool CSystemConfiguration::ParseSystemConfig() // if the file is missing and its already prefixed with an alias, there is no need to look any further. if (!(file.Open(filename.c_str(), "rb", flags))) { - if (m_warnIfMissing) + if (warnIfMissing) { CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "Config file %s not found!", filename.c_str()); } @@ -403,7 +300,7 @@ bool CSystemConfiguration::ParseSystemConfig() !(file.Open((AZStd::string("@assets@/config/spec/") + filename).c_str(), "rb", flags)) ) { - if (m_warnIfMissing) + if (warnIfMissing) { CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "Config file %s not found!", filename.c_str()); } @@ -518,7 +415,7 @@ bool CSystemConfiguration::ParseSystemConfig() AZ::StringFunc::Replace(strValue, "\\\\", "\\"); AZ::StringFunc::Replace(strValue, "\\\"", "\""); - m_pSink->OnLoadConfigurationEntry(strKey.c_str(), strValue.c_str(), strGroup.c_str()); + pSink->OnLoadConfigurationEntry(strKey.c_str(), strValue.c_str(), strGroup.c_str()); } } } @@ -532,7 +429,7 @@ bool CSystemConfiguration::ParseSystemConfig() CryLog("Loading Config file %s (%s)", filename.c_str(), filenameLog.c_str()); - m_pSink->OnLoadConfigurationEntry_End(); + pSink->OnLoadConfigurationEntry_End(); return true; } @@ -574,7 +471,7 @@ void CSystem::LoadConfiguration(const char* sFilename, ILoadConfigurationEntrySi pSink = this; } - CSystemConfiguration tempConfig(sFilename, this, pSink, warnIfMissing); + ParseSystemConfig(sFilename, pSink, warnIfMissing); } } diff --git a/Code/Legacy/CrySystem/SystemCFG.h b/Code/Legacy/CrySystem/SystemCFG.h deleted file mode 100644 index 7ec6f1231b..0000000000 --- a/Code/Legacy/CrySystem/SystemCFG.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYSYSTEM_SYSTEMCFG_H -#define CRYINCLUDE_CRYSYSTEM_SYSTEMCFG_H - -#pragma once - -#include -#include - -typedef AZStd::string SysConfigKey; -typedef AZStd::string SysConfigValue; - -////////////////////////////////////////////////////////////////////////// -class CSystemConfiguration -{ -public: - CSystemConfiguration(const AZStd::string& strSysConfigFilePath, CSystem* pSystem, ILoadConfigurationEntrySink* pSink, bool warnIfMissing = true); - ~CSystemConfiguration(); - - bool IsError() const { return m_bError; } - -private: // ---------------------------------------- - - // Returns: - // success - bool ParseSystemConfig(); - - CSystem* m_pSystem; - AZStd::string m_strSysConfigFilePath; - bool m_bError; - ILoadConfigurationEntrySink* m_pSink; // never 0 - bool m_warnIfMissing; -}; - - -#endif // CRYINCLUDE_CRYSYSTEM_SYSTEMCFG_H diff --git a/Code/Legacy/CrySystem/SystemInit.cpp b/Code/Legacy/CrySystem/SystemInit.cpp index a335dae112..85983975ce 100644 --- a/Code/Legacy/CrySystem/SystemInit.cpp +++ b/Code/Legacy/CrySystem/SystemInit.cpp @@ -1598,9 +1598,6 @@ AZ_POP_DISABLE_WARNING LoadConfiguration("client.cfg", &CVarsClientConfigSink); } - //Connect to the render bus - AZ::RenderNotificationsBus::Handler::BusConnect(); - // Send out EBus event EBUS_EVENT(CrySystemEventBus, OnCrySystemInitialized, *this, startupParams); diff --git a/Code/Legacy/CrySystem/ViewSystem/View.cpp b/Code/Legacy/CrySystem/ViewSystem/View.cpp index 36cd891e3e..ca5ef3892b 100644 --- a/Code/Legacy/CrySystem/ViewSystem/View.cpp +++ b/Code/Legacy/CrySystem/ViewSystem/View.cpp @@ -534,20 +534,6 @@ void CView::SetFrameAdditiveCameraAngles(const Ang3& addFrameAngles) m_frameAdditiveAngles = addFrameAngles; } -void CView::GetMemoryUsage(ICrySizer* s) const -{ - s->AddObject(this, sizeof(*this)); - s->AddObject(m_shakes); -} - -//void CView::Serialize(TSerialize ser) -//{ -// if (ser.IsReading()) -// { -// ResetShaking(); -// } -//} - void CView::PostSerialize() { } diff --git a/Code/Legacy/CrySystem/ViewSystem/View.h b/Code/Legacy/CrySystem/ViewSystem/View.h index 689c254897..237a2d0fa6 100644 --- a/Code/Legacy/CrySystem/ViewSystem/View.h +++ b/Code/Legacy/CrySystem/ViewSystem/View.h @@ -81,8 +81,6 @@ public: ID = shakeID; } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const { /*nothing*/} }; @@ -111,8 +109,6 @@ public: CCamera& GetCamera() override { return m_camera; } const CCamera& GetCamera() const override { return m_camera; } - void GetMemoryUsage(ICrySizer* s) const; - protected: void ProcessShakeNormal(SShake* pShake, float frameTime); diff --git a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp index 1d141a5e13..e83676827f 100644 --- a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp +++ b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.cpp @@ -610,24 +610,6 @@ void CViewSystem::DebugDraw() } ////////////////////////////////////////////////////////////////////////// -void CViewSystem::GetMemoryUsage(ICrySizer* s) const -{ - SIZER_SUBCOMPONENT_NAME(s, "ViewSystem"); - s->Add(*this); - s->AddContainer(m_views); -} - -//void CViewSystem::Serialize(TSerialize ser) -//{ -// TViewMap::iterator iter = m_views.begin(); -// TViewMap::iterator iterEnd = m_views.end(); -// while (iter != iterEnd) -// { -// iter->second->Serialize(ser); -// ++iter; -// } -//} - void CViewSystem::PostSerialize() { TViewMap::iterator iter = m_views.begin(); diff --git a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h index dd49e09e04..e0e4a67e9e 100644 --- a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h +++ b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h @@ -105,8 +105,6 @@ public: return stl::find_and_erase(m_listeners, pListener); } - void GetMemoryUsage(ICrySizer* s) const; - void ClearAllViews(); private: diff --git a/Code/Legacy/CrySystem/XConsole.cpp b/Code/Legacy/CrySystem/XConsole.cpp index 1cc9696a06..68cec01cc4 100644 --- a/Code/Legacy/CrySystem/XConsole.cpp +++ b/Code/Legacy/CrySystem/XConsole.cpp @@ -32,6 +32,19 @@ #include //#define DEFENCE_CVAR_HASH_LOGGING +// s should point to a buffer at least 65 chars long +inline void BitsAlpha64(uint64 n, char* s) +{ + for (int i = 0; n != 0; n >>= 1, i++) + { + if (n & 1) + { + *s++ = i < 32 ? static_cast(i + 'z' - 31) : static_cast(i + 'Z' - 63); + } + } + *s++ = '\0'; +} + static inline void AssertName([[maybe_unused]] const char* szName) { #ifdef _DEBUG @@ -567,35 +580,6 @@ ICVar* CXConsole::Register(const char* sName, int* src, int iValue, int nFlags, } -////////////////////////////////////////////////////////////////////////// -ICVar* CXConsole::RegisterCVarGroup(const char* szName, const char* szFileName) -{ - AssertName(szName); - assert(szFileName); - - // suppress cvars not starting with sys_spec_ as - // cheaters might create cvars before we created ours - if (_strnicmp(szName, "sys_spec_", 9) != 0) - { - return 0; - } - - ICVar* pCVar = stl::find_in_map(m_mapVariables, szName, NULL); - if (pCVar) - { - AZ_Error("System", false, "CVar groups should only be registered once"); - return pCVar; - } - - CXConsoleVariableCVarGroup* pCVarGroup = new CXConsoleVariableCVarGroup(this, szName, szFileName, VF_COPYNAME); - - pCVar = pCVarGroup; - - RegisterVar(pCVar, CXConsoleVariableCVarGroup::OnCVarChangeFunc); - - return pCVar; -} - ////////////////////////////////////////////////////////////////////////// ICVar* CXConsole::Register(const char* sName, float* src, float fValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc, bool allowModify) { @@ -620,7 +604,6 @@ ICVar* CXConsole::Register(const char* sName, float* src, float fValue, int nFla return pCVar; } - ////////////////////////////////////////////////////////////////////////// ICVar* CXConsole::Register(const char* sName, const char** src, const char* defaultValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc, bool allowModify) { @@ -644,7 +627,6 @@ ICVar* CXConsole::Register(const char* sName, const char** src, const char* defa return pCVar; } - ////////////////////////////////////////////////////////////////////////// ICVar* CXConsole::RegisterString(const char* sName, const char* sValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc) { @@ -705,30 +687,6 @@ ICVar* CXConsole::RegisterInt(const char* sName, int iValue, int nFlags, const c return pCVar; } - - -////////////////////////////////////////////////////////////////////////// -ICVar* CXConsole::RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help, ConsoleVarFunc pChangeFunc) -{ - AssertName(sName); - - ICVar* pCVar = stl::find_in_map(m_mapVariables, sName, NULL); - if (pCVar) - { - gEnv->pLog->Log("[CVARS]: [DUPLICATE] CXConsole::RegisterInt64(): variable [%s] is already registered", pCVar->GetName()); -#if LOG_CVAR_INFRACTIONS_CALLSTACK - gEnv->pSystem->debug_LogCallStack(); -#endif // LOG_CVAR_INFRACTIONS_CALLSTACK - return pCVar; - } - - pCVar = new CXConsoleVariableInt64(this, sName, iValue, nFlags, help); - RegisterVar(pCVar, pChangeFunc); - return pCVar; -} - - - ////////////////////////////////////////////////////////////////////////// void CXConsole::UnregisterVariable(const char* sVarName, [[maybe_unused]] bool bDelete) { @@ -2891,20 +2849,6 @@ int CXConsole::GetNumVisibleVars() return numVars; } -void CXConsole::AddCVarsToHash(ConsoleVariablesVector::const_iterator begin, ConsoleVariablesVector::const_iterator end, CCrc32& runningNameCrc32, CCrc32& runningNameValueCrc32) -{ - for (ConsoleVariablesVector::const_iterator it = begin; it <= end; ++it) - { - // add name & variable to string. We add both since adding only the value could cause - // many collisions with variables all having value 0 or all 1. - AZStd::string hashStr = it->first; - - runningNameCrc32.Add(hashStr.c_str(), hashStr.length()); - hashStr += it->second->GetDataProbeString(); - runningNameValueCrc32.Add(hashStr.c_str(), hashStr.length()); - } -} - ////////////////////////////////////////////////////////////////////////// size_t CXConsole::GetSortedVars(AZStd::vector& pszArray, const char* szPrefix) { @@ -3089,18 +3033,6 @@ inline size_t sizeOf (const char* sz) return sz ? strlen(sz) + 1 : 0; } -////////////////////////////////////////////////////////////////////////// -void CXConsole::GetMemoryUsage (class ICrySizer* pSizer) const -{ - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_sInputBuffer); - pSizer->AddObject(m_sPrevTab); - pSizer->AddObject(m_dqConsoleBuffer); - pSizer->AddObject(m_dqHistory); - pSizer->AddObject(m_mapCommands); - pSizer->AddObject(m_mapBinds); -} - ////////////////////////////////////////////////////////////////////////// void CXConsole::ConsoleLogInputResponse(const char* format, ...) { diff --git a/Code/Legacy/CrySystem/XConsole.h b/Code/Legacy/CrySystem/XConsole.h index 3ff9824e6f..200ddd85b3 100644 --- a/Code/Legacy/CrySystem/XConsole.h +++ b/Code/Legacy/CrySystem/XConsole.h @@ -13,8 +13,8 @@ #pragma once #include -#include #include "Timer.h" +#include #include #include @@ -22,10 +22,12 @@ #include #include +#include +#include //forward declaration struct INetwork; class CSystem; - +struct IFFont; #define MAX_HISTORY_ENTRIES 50 #define LINE_BORDER 10 @@ -53,12 +55,6 @@ struct CConsoleCommand : m_func(0) , m_nFlags(0) {} size_t sizeofThis () const {return sizeof(*this) + m_sName.capacity() + 1 + m_sCommand.capacity() + 1; } - void GetMemoryUsage (class ICrySizer* pSizer) const - { - pSizer->AddObject(m_sName); - pSizer->AddObject(m_sCommand); - pSizer->AddObject(m_sHelp); - } }; ////////////////////////////////////////////////////////////////////////// @@ -136,71 +132,68 @@ public: void Paste(); // interface IConsole --------------------------------------------------------- - virtual void Release(); + void Release() override; - virtual void Init(ISystem* pSystem); - virtual ICVar* RegisterString(const char* sName, const char* sValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* RegisterFloat(const char* sName, float fValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* Register(const char* name, float* src, float defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true); - virtual ICVar* Register(const char* name, int* src, int defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true); - virtual ICVar* Register(const char* name, const char** src, const char* defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true); - virtual ICVar* Register(ICVar* pVar) { RegisterVar(pVar); return pVar; } + void Init(ISystem* pSystem) override; + ICVar* RegisterString(const char* sName, const char* sValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) override; + ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) override; + ICVar* RegisterFloat(const char* sName, float fValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) override; + ICVar* Register(const char* name, float* src, float defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) override; + ICVar* Register(const char* name, int* src, int defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) override; + ICVar* Register(const char* name, const char** src, const char* defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) override; - virtual void UnregisterVariable(const char* sVarName, bool bDelete = false); - virtual void SetScrollMax(int value); - virtual void AddOutputPrintSink(IOutputPrintSink* inpSink); - virtual void RemoveOutputPrintSink(IOutputPrintSink* inpSink); - virtual void ShowConsole(bool show, int iRequestScrollMax = -1); - virtual void DumpCVars(ICVarDumpSink* pCallback, unsigned int nFlagsFilter = 0); - virtual void DumpKeyBinds(IKeyBindDumpSink* pCallback); - virtual void CreateKeyBind(const char* sCmd, const char* sRes); - virtual const char* FindKeyBind(const char* sCmd) const; - virtual void SetImage(ITexture* pImage, bool bDeleteCurrent); - virtual inline ITexture* GetImage() { return m_pImage; } - virtual void StaticBackground(bool bStatic) { m_bStaticBackground = bStatic; } - virtual bool GetLineNo(int indwLineNo, char* outszBuffer, int indwBufferSize) const; - virtual int GetLineCount() const; - virtual ICVar* GetCVar(const char* name); - virtual char* GetVariable(const char* szVarName, const char* szFileName, const char* def_val); - virtual float GetVariable(const char* szVarName, const char* szFileName, float def_val); - virtual void PrintLine(const char* s); - virtual void PrintLinePlus(const char* s); - virtual bool GetStatus(); - virtual void Clear(); - virtual void Update(); - virtual void Draw(); - virtual bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = NULL); - virtual bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = NULL); - virtual void RemoveCommand(const char* sName); - virtual void ExecuteString(const char* command, bool bSilentMode, bool bDeferExecution = false); - virtual void ExecuteConsoleCommand(const char* command) override; - virtual void ResetCVarsToDefaults() override; - virtual void Exit(const char* command, ...) PRINTF_PARAMS(2, 3); - virtual bool IsOpened(); - virtual int GetNumVars(); - virtual int GetNumVisibleVars(); - virtual size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = 0); - virtual void FindVar(const char* substr); - virtual const char* AutoComplete(const char* substr); - virtual const char* AutoCompletePrev(const char* substr); - virtual const char* ProcessCompletion(const char* szInputBuffer); - virtual void RegisterAutoComplete(const char* sVarOrCommand, IConsoleArgumentAutoComplete* pArgAutoComplete); - virtual void UnRegisterAutoComplete(const char* sVarOrCommand); - virtual void ResetAutoCompletion(); - virtual void GetMemoryUsage (ICrySizer* pSizer) const; - virtual void ResetProgressBar(int nProgressRange); - virtual void TickProgressBar(); - virtual void SetLoadingImage(const char* szFilename); - virtual void AddConsoleVarSink(IConsoleVarSink* pSink); - virtual void RemoveConsoleVarSink(IConsoleVarSink* pSink); - virtual const char* GetHistoryElement(bool bUpOrDown); - virtual void AddCommandToHistory(const char* szCommand); - virtual void SetInputLine(const char* szLine); - virtual void LoadConfigVar(const char* sVariable, const char* sValue); - virtual void EnableActivationKey(bool bEnable); - virtual void SetClientDataProbeString(const char* pName, const char* pValue); + void UnregisterVariable(const char* sVarName, bool bDelete = false) override; + void SetScrollMax(int value) override; + void AddOutputPrintSink(IOutputPrintSink* inpSink) override; + void RemoveOutputPrintSink(IOutputPrintSink* inpSink) override; + void ShowConsole(bool show, int iRequestScrollMax = -1) override; + void DumpCVars(ICVarDumpSink* pCallback, unsigned int nFlagsFilter = 0) override; + void DumpKeyBinds(IKeyBindDumpSink* pCallback) override; + void CreateKeyBind(const char* sCmd, const char* sRes) override; + const char* FindKeyBind(const char* sCmd) const override; + void SetImage(ITexture* pImage, bool bDeleteCurrent) override; + inline ITexture* GetImage() override { return m_pImage; } + void StaticBackground(bool bStatic) override { m_bStaticBackground = bStatic; } + bool GetLineNo(int indwLineNo, char* outszBuffer, int indwBufferSize) const override; + int GetLineCount() const override; + ICVar* GetCVar(const char* name) override; + char* GetVariable(const char* szVarName, const char* szFileName, const char* def_val) override; + float GetVariable(const char* szVarName, const char* szFileName, float def_val) override; + void PrintLine(const char* s) override; + void PrintLinePlus(const char* s) override; + bool GetStatus() override; + void Clear() override; + void Update() override; + void Draw() override; + bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = NULL) override; + bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = NULL) override; + void RemoveCommand(const char* sName) override; + void ExecuteString(const char* command, bool bSilentMode, bool bDeferExecution = false) override; + void ExecuteConsoleCommand(const char* command) override; + void ResetCVarsToDefaults() override; + void Exit(const char* command, ...) override PRINTF_PARAMS(2, 3); + bool IsOpened() override; + int GetNumVars() override; + int GetNumVisibleVars() override; + size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = 0) override; + void FindVar(const char* substr); + const char* AutoComplete(const char* substr) override; + const char* AutoCompletePrev(const char* substr) override; + const char* ProcessCompletion(const char* szInputBuffer) override; + void RegisterAutoComplete(const char* sVarOrCommand, IConsoleArgumentAutoComplete* pArgAutoComplete) override; + void UnRegisterAutoComplete(const char* sVarOrCommand) override; + void ResetAutoCompletion() override; + void ResetProgressBar(int nProgressRange) override; + void TickProgressBar() override; + void SetLoadingImage(const char* szFilename) override; + void AddConsoleVarSink(IConsoleVarSink* pSink) override; + void RemoveConsoleVarSink(IConsoleVarSink* pSink) override; + const char* GetHistoryElement(bool bUpOrDown) override; + void AddCommandToHistory(const char* szCommand) override; + void SetInputLine(const char* szLine) override; + void LoadConfigVar(const char* sVariable, const char* sValue) override; + void EnableActivationKey(bool bEnable) override; + void SetClientDataProbeString(const char* pName, const char* pValue) override; // InputChannelEventListener / InputTextEventListener bool OnInputChannelEventFiltered(const AzFramework::InputChannel& inputChannel) override; @@ -208,7 +201,7 @@ public: // interface IRemoteConsoleListener ------------------------------------------------------------------ - virtual void OnConsoleCommand(const char* cmd); + void OnConsoleCommand(const char* cmd) override; // interface IConsoleVarSink ---------------------------------------------------------------------- @@ -222,10 +215,6 @@ public: ////////////////////////////////////////////////////////////////////////// - // Returns - // 0 if the operation failed - ICVar* RegisterCVarGroup(const char* sName, const char* szFileName); - void SetProcessingGroup(bool isGroup) { m_bIsProcessingGroup = isGroup; } bool GetIsProcessingGroup(void) const { return m_bIsProcessingGroup; } @@ -290,7 +279,6 @@ private: // ---------------------------------------------------------- void AddCheckedCVar(ConsoleVariablesVector& vector, const ConsoleVariablesVector::value_type& value); void RemoveCheckedCVar(ConsoleVariablesVector& vector, const ConsoleVariablesVector::value_type& value); - static void AddCVarsToHash(ConsoleVariablesVector::const_iterator begin, ConsoleVariablesVector::const_iterator end, CCrc32& runningNameCrc32, CCrc32& runningNameValueCrc32); static bool CVarNameLess(const std::pair& lhs, const std::pair& rhs); void PostLine(const char* lineOfText, size_t len); diff --git a/Code/Legacy/CrySystem/XConsoleVariable.cpp b/Code/Legacy/CrySystem/XConsoleVariable.cpp index efd5ecd495..31fea250f6 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.cpp +++ b/Code/Legacy/CrySystem/XConsoleVariable.cpp @@ -6,10 +6,8 @@ * */ - // Description : implementation of the CXConsoleVariable class. - #include "CrySystem_precompiled.h" #include "XConsole.h" #include "XConsoleVariable.h" @@ -19,6 +17,87 @@ #include +namespace +{ + using stack_string = AZStd::fixed_string<512>; + + uint64 AlphaBit64(char c) + { + return (c >= 'a' && c <= 'z' ? 1U << (c - 'z' + 31) : 0) | + (c >= 'A' && c <= 'Z' ? 1LL << (c - 'Z' + 63) : 0); + } + + int64 TextToInt64(const char* s, int64 nCurrent, bool bBitfield) + { + int64 nValue = 0; + if (s) + { + char* e; + if (bBitfield) + { + // Bit manipulation. + if (*s == '^') + // Bit number +#if defined(_MSC_VER) + { + nValue = 1LL << _strtoi64(++s, &e, 10); + } +#else + { + nValue = 1LL << strtoll(++s, &e, 10); + } +#endif + else + // Full number +#if defined(_MSC_VER) + { + nValue = _strtoi64(s, &e, 10); + } +#else + { + nValue = strtoll(s, &e, 10); + } +#endif + // Check letter codes. + for (; (*e >= 'a' && *e <= 'z') || (*e >= 'A' && *e <= 'Z'); e++) + { + nValue |= AlphaBit64(*e); + } + + if (*e == '+') + { + nValue = nCurrent | nValue; + } + else if (*e == '-') + { + nValue = nCurrent & ~nValue; + } + else if (*e == '^') + { + nValue = nCurrent ^ nValue; + } + } + else +#if defined(_MSC_VER) + { + nValue = _strtoi64(s, &e, 10); + } +#else + { + nValue = strtoll(s, &e, 10); + } +#endif + } + return nValue; + } + + int TextToInt(const char* s, int nCurrent, bool bBitfield) + { + return (int)TextToInt64(s, nCurrent, bBitfield); + } + +} // namespace + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// @@ -53,7 +132,6 @@ CXConsoleVariableBase::CXConsoleVariableBase(CXConsole* pConsole, const char* sN } } - ////////////////////////////////////////////////////////////////////////// CXConsoleVariableBase::~CXConsoleVariableBase() { @@ -78,10 +156,8 @@ void CXConsoleVariableBase::ForceSet(const char* s) m_nFlags |= oldFlags; } - - ////////////////////////////////////////////////////////////////////////// -void CXConsoleVariableBase::ClearFlags (int flags) +void CXConsoleVariableBase::ClearFlags(int flags) { m_nFlags &= ~flags; } @@ -121,7 +197,7 @@ void CXConsoleVariableBase::SetOnChangeCallback(ConsoleVarFunc pChangeFunc) m_pChangeFunc = pChangeFunc; } -uint64 CXConsoleVariableBase::AddOnChangeFunctor(const SFunctor& pChangeFunctor) +uint64 CXConsoleVariableBase::AddOnChangeFunctor(const AZStd::function& pChangeFunctor) { static int uniqueIdGenerator = 0; int newId = uniqueIdGenerator++; @@ -144,7 +220,7 @@ void CXConsoleVariableBase::CallOnChangeFunctions() const size_t nTotal(m_changeFunctors.size()); for (size_t nCount = 0; nCount < nTotal; ++nCount) { - m_changeFunctors[nCount].second.Call(); + m_changeFunctors[nCount].second(); } } @@ -168,535 +244,325 @@ bool CXConsoleVariableBase::HasCustomLimits() return m_hasCustomLimits; } -void CXConsoleVariableCVarGroup::OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup) +const char* CXConsoleVariableBase::GetDataProbeString() const { - assert(szGroup); - assert(szKey); - assert(szValue); - - bool bCheckIfInDefault = false; - - SCVarGroup* pGrp = 0; - - if (azstricmp(szGroup, "default") == 0) // needs to be before the other groups + if (gEnv->IsDedicated() && m_pDataProbeString) { - pGrp = &m_CVarGroupDefault; - - // if(azstricmp(GetName(),szKey)==0) - if (*szKey == 0) - { - m_sDefaultValue = szValue; - int iGrpValue = atoi(szValue); - - // if default state is not part of the mentioned states generate this state, so GetIRealVal() can return this state as well - if (m_CVarGroupStates.find(iGrpValue) == m_CVarGroupStates.end()) - { - m_CVarGroupStates[iGrpValue] = new SCVarGroup; - } - - return; - } - } - else - { - int iGrp; - - if (azsscanf(szGroup, "%d", &iGrp) == 1) - { - if (m_CVarGroupStates.find(iGrp) == m_CVarGroupStates.end()) - { - m_CVarGroupStates[iGrp] = new SCVarGroup; - } - - pGrp = m_CVarGroupStates[iGrp]; - } - else - { - gEnv->pLog->LogError("[CVARS]: [MISSING] [%s] is not a registered console variable group", szGroup); -#if LOG_CVAR_INFRACTIONS_CALLSTACK - gEnv->pSystem->debug_LogCallStack(); -#endif // LOG_CVAR_INFRACTIONS_CALLSTACK - return; - } - - if (*szKey == 0) - { - assert(0); // =%d only expected in default section - return; - } - } - - - if (pGrp) - { - if (pGrp->m_KeyValuePair.find(szKey) != pGrp->m_KeyValuePair.end()) - { - gEnv->pLog->LogError("[CVARS]: [DUPLICATE] [%s] specified multiple times in console variable group [%s] = [%s]", szKey, GetName(), szGroup); - bCheckIfInDefault = true; - } - - pGrp->m_KeyValuePair[szKey] = szValue; - - if (bCheckIfInDefault) - { - if (m_CVarGroupDefault.m_KeyValuePair.find(szKey) == m_CVarGroupDefault.m_KeyValuePair.end()) - { - gEnv->pLog->LogError("[CVARS]: [MISSING] [%s] specified in console variable group [%s] = [%s], but missing from default group", szKey, GetName(), szGroup); - } - } + return m_pDataProbeString; } + return GetOwnDataProbeString(); } - -void CXConsoleVariableCVarGroup::OnLoadConfigurationEntry_End() +void CXConsoleVariableString::Set(const char* s) { - if (!m_sDefaultValue.empty()) - { - gEnv->pConsole->LoadConfigVar(GetName(), m_sDefaultValue.c_str()); - m_sDefaultValue.clear(); - } -} - - -CXConsoleVariableCVarGroup::CXConsoleVariableCVarGroup(CXConsole* pConsole, const char* sName, const char* szFileName, int nFlags) - : CXConsoleVariableInt(pConsole, sName, 0, nFlags, 0) -{ - gEnv->pSystem->LoadConfiguration(szFileName, this); -} - - -AZStd::string CXConsoleVariableCVarGroup::GetDetailedInfo() const -{ - AZStd::string sRet = GetName(); - - sRet += " ["; - - { - TCVarGroupStateMap::const_iterator it, end = m_CVarGroupStates.end(); - - for (it = m_CVarGroupStates.begin(); it != end; ++it) - { - if (it != m_CVarGroupStates.begin()) - { - sRet += "/"; - } - - char szNum[10]; - - azsprintf(szNum, "%d", it->first); - - sRet += szNum; - } - } - - sRet += "/default] [current]:\n"; - - - std::map::const_iterator it, end = m_CVarGroupDefault.m_KeyValuePair.end(); - - for (it = m_CVarGroupDefault.m_KeyValuePair.begin(); it != end; ++it) - { - const AZStd::string& rKey = it->first; - - sRet += " ... "; - sRet += rKey; - sRet += " = "; - - TCVarGroupStateMap::const_iterator it2, end2 = m_CVarGroupStates.end(); - - for (it2 = m_CVarGroupStates.begin(); it2 != end2; ++it2) - { - sRet += GetValueSpec(rKey, &(it2->first)); - sRet += "/"; - } - sRet += GetValueSpec(rKey); - ICVar* pCVar = gEnv->pConsole->GetCVar(rKey.c_str()); - if (pCVar) - { - sRet += " ["; - sRet += pCVar->GetString(); - sRet += "]"; - } - - sRet += "\n"; - } - - return sRet; -} - - - -const char* CXConsoleVariableCVarGroup::GetHelp() -{ - if (m_psHelp) - { - delete m_psHelp; - m_psHelp = NULL; - } - - // create help on demand - AZStd::string sRet = "Console variable group to apply settings to multiple variables\n\n"; - - sRet += GetDetailedInfo(); - - m_psHelp = new char[sRet.size() + 1]; - azstrcpy(m_psHelp, sRet.size() + 1, &sRet[0]); - - return m_psHelp; -} - - - -void CXConsoleVariableCVarGroup::DebugLog(const int iExpectedValue, const ICVar::EConsoleLogMode mode) const -{ - TCVarGroupStateMap::const_iterator it, end = m_CVarGroupStates.end(); - - SCVarGroup* pCurrentGrp = 0; - { - TCVarGroupStateMap::const_iterator itCurrentGrp = m_CVarGroupStates.find(iExpectedValue); - - if (itCurrentGrp != end) - { - pCurrentGrp = itCurrentGrp->second; - } - } - - // try the current state - if (TestCVars(pCurrentGrp, mode)) + if (!s) { return; } + + if ((m_sValue == s) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + if (m_pConsole->OnBeforeVarChange(this, s)) + { + m_nFlags |= VF_MODIFIED; + { + m_sValue = s; + } + + CallOnChangeFunctions(); + + m_pConsole->OnAfterVarChange(this); + } } - -int CXConsoleVariableCVarGroup::GetRealIVal() const +void CXConsoleVariableString::Set(float f) { - TCVarGroupStateMap::const_iterator it, end = m_CVarGroupStates.end(); + stack_string s = stack_string::format("%g", f); - int iValue = GetIVal(); - - SCVarGroup* pCurrentGrp = 0; + if ((m_sValue == s.c_str()) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { - TCVarGroupStateMap::const_iterator itCurrentGrp = m_CVarGroupStates.find(iValue); - - if (itCurrentGrp != end) - { - pCurrentGrp = itCurrentGrp->second; - } + return; } - // first try the current state - if (TestCVars(pCurrentGrp)) - { - return iValue; - } - - // then all other - for (it = m_CVarGroupStates.begin(); it != end; ++it) - { - SCVarGroup* pLocalGrp = it->second; - - if (pLocalGrp == pCurrentGrp) - { - continue; - } - - int iLocalState = it->first; - - if (TestCVars(pLocalGrp)) - { - return iLocalState; - } - } - - return -1; // no state found that represent the current one + m_nFlags |= VF_MODIFIED; + Set(s.c_str()); } -void CXConsoleVariableCVarGroup::Set(const int i) +void CXConsoleVariableString::Set(int i) { - if (i == m_iValue) + stack_string s = stack_string::format("%d", i); + + if ((m_sValue == s.c_str()) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { - SCVarGroup* pCurrentGrp = 0; - TCVarGroupStateMap::const_iterator itCurrentGrp = m_CVarGroupStates.find(m_iValue); - - if (itCurrentGrp != m_CVarGroupStates.end()) - { - pCurrentGrp = itCurrentGrp->second; - } - - if (TestCVars(pCurrentGrp)) - { - // All cvars in this group match the current state - no further action is necessary - return; - } + return; } - char sTemp[128]; - azsprintf(sTemp, "%d", i); + m_nFlags |= VF_MODIFIED; + Set(s.c_str()); +} - bool wasProcessingGroup = m_pConsole->GetIsProcessingGroup(); - m_pConsole->SetProcessingGroup(true); - if (m_pConsole->OnBeforeVarChange(this, sTemp)) +const char* CXConsoleVariableInt::GetString() const +{ + static char szReturnString[256]; + + sprintf_s(szReturnString, "%d", GetIVal()); + return szReturnString; +} + +void CXConsoleVariableInt::Set(const char* s) +{ + int nValue = TextToInt(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); + + Set(nValue); +} + +void CXConsoleVariableInt::Set(float f) +{ + Set((int)f); +} + +void CXConsoleVariableInt::Set(int i) +{ + if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + stack_string s = stack_string::format("%d", i); + + if (m_pConsole->OnBeforeVarChange(this, s.c_str())) { m_nFlags |= VF_MODIFIED; m_iValue = i; CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); } - m_pConsole->SetProcessingGroup(wasProcessingGroup); - - // Useful for debugging cvar groups - //CryLogAlways("[CVARS]: CXConsoleVariableCVarGroup::Set() Group %s in state %d (wanted %d)", GetName(), m_iValue, i); } - -CXConsoleVariableCVarGroup::~CXConsoleVariableCVarGroup() +const char* CXConsoleVariableIntRef::GetString() const { - TCVarGroupStateMap::iterator it, end = m_CVarGroupStates.end(); + static char szReturnString[256]; - for (it = m_CVarGroupStates.begin(); it != end; ++it) - { - SCVarGroup* pGrp = it->second; - - delete pGrp; - } - - delete m_psHelp; + sprintf_s(szReturnString, "%d", m_iValue); + return szReturnString; } - -void CXConsoleVariableCVarGroup::OnCVarChangeFunc(ICVar* pVar) +void CXConsoleVariableIntRef::Set(const char* s) { - CXConsoleVariableCVarGroup* pThis = (CXConsoleVariableCVarGroup*)pVar; - - int iValue = pThis->GetIVal(); - - TCVarGroupStateMap::const_iterator itGrp = pThis->m_CVarGroupStates.find(iValue); - - SCVarGroup* pGrp = 0; - - if (itGrp != pThis->m_CVarGroupStates.end()) + int nValue = TextToInt(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); + if (nValue == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { - pGrp = itGrp->second; + return; } - if (pGrp) + if (m_pConsole->OnBeforeVarChange(this, s)) { - pThis->ApplyCVars(*pGrp); - } + m_nFlags |= VF_MODIFIED; + m_iValue = nValue; - pThis->ApplyCVars(pThis->m_CVarGroupDefault, pGrp); + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } } - -bool CXConsoleVariableCVarGroup::TestCVars(const SCVarGroup* pGroup, const ICVar::EConsoleLogMode mode) const +void CXConsoleVariableIntRef::Set(float f) { - if (pGroup) + if ((int)f == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) { - if (!TestCVars(*pGroup, mode)) + return; + } + + char sTemp[128]; + sprintf_s(sTemp, "%g", f); + + if (m_pConsole->OnBeforeVarChange(this, sTemp)) + { + m_nFlags |= VF_MODIFIED; + m_iValue = (int)f; + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } +} + +void CXConsoleVariableIntRef::Set(int i) +{ + if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + char sTemp[128]; + sprintf_s(sTemp, "%d", i); + + if (m_pConsole->OnBeforeVarChange(this, sTemp)) + { + m_nFlags |= VF_MODIFIED; + m_iValue = i; + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } +} + +const char* CXConsoleVariableFloat::GetString() const +{ + static char szReturnString[256]; + + sprintf_s(szReturnString, "%g", m_fValue); // %g -> "2.01", %f -> "2.01000" + return szReturnString; +} + +void CXConsoleVariableFloat::Set(const char* s) +{ + float fValue = 0; + if (s) + { + fValue = (float)atof(s); + } + + if (fValue == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + if (m_pConsole->OnBeforeVarChange(this, s)) + { + m_nFlags |= VF_MODIFIED; + m_fValue = fValue; + + CallOnChangeFunctions(); + + m_pConsole->OnAfterVarChange(this); + } +} + +void CXConsoleVariableFloat::Set(float f) +{ + if (f == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + stack_string s = stack_string::format("%g", f); + + if (m_pConsole->OnBeforeVarChange(this, s.c_str())) + { + m_nFlags |= VF_MODIFIED; + m_fValue = f; + + CallOnChangeFunctions(); + + m_pConsole->OnAfterVarChange(this); + } +} + +void CXConsoleVariableFloat::Set(int i) +{ + if ((float)i == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + char sTemp[128]; + sprintf_s(sTemp, "%d", i); + + if (m_pConsole->OnBeforeVarChange(this, sTemp)) + { + m_nFlags |= VF_MODIFIED; + m_fValue = (float)i; + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } +} + +const char* CXConsoleVariableFloatRef::GetString() const +{ + static char szReturnString[256]; + + sprintf_s(szReturnString, "%g", m_fValue); + return szReturnString; +} + +void CXConsoleVariableFloatRef::Set(const char *s) +{ + float fValue = 0; + if (s) + { + fValue = (float)atof(s); + } + if (fValue == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + if (m_pConsole->OnBeforeVarChange(this, s)) + { + m_nFlags |= VF_MODIFIED; + m_fValue = fValue; + + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } +} + +void CXConsoleVariableFloatRef::Set(float f) +{ + if (f == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + char sTemp[128]; + sprintf_s(sTemp, "%g", f); + + if (m_pConsole->OnBeforeVarChange(this, sTemp)) + { + m_nFlags |= VF_MODIFIED; + m_fValue = f; + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } +} + +void CXConsoleVariableFloatRef::Set(int i) +{ + if ((float)i == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + char sTemp[128]; + sprintf_s(sTemp, "%d", i); + + if (m_pConsole->OnBeforeVarChange(this, sTemp)) + { + m_nFlags |= VF_MODIFIED; + m_fValue = (float)i; + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); + } +} + +void CXConsoleVariableStringRef::Set(const char *s) +{ + if ((m_sValue == s) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) + { + return; + } + + if (m_pConsole->OnBeforeVarChange(this, s)) + { + m_nFlags |= VF_MODIFIED; { - return false; - } - } - - if (!TestCVars(m_CVarGroupDefault, mode, pGroup)) - { - return false; - } - - return true; -} - -bool CXConsoleVariableCVarGroup::TestCVars(const SCVarGroup& rGroup, const ICVar::EConsoleLogMode mode, const SCVarGroup* pExclude) const -{ - bool bRet = true; - std::map::const_iterator it, end = rGroup.m_KeyValuePair.end(); - - for (it = rGroup.m_KeyValuePair.begin(); it != end; ++it) - { - const AZStd::string& rKey = it->first; - const AZStd::string& rValue = it->second; - - if (pExclude) - { - if (pExclude->m_KeyValuePair.find(rKey) != pExclude->m_KeyValuePair.end()) - { - continue; - } + m_sValue = s; + m_userPtr = m_sValue.c_str(); } - ICVar* pVar = gEnv->pConsole->GetCVar(rKey.c_str()); - - if (pVar) - { - if (pVar->GetFlags() & VF_CVARGRP_IGNOREINREALVAL) // Ignore the cvars which change often and shouldn't be used to determine state - { - continue; - } - - bool bOk = true; - - // compare exact type, - // simple string comparison would fail on some comparisons e.g. 2.0 == 2 - // and GetString() for int and float return pointer to shared array so this - // can cause problems - switch (pVar->GetType()) - { - case CVAR_INT: - { - int iVal; - if (azsscanf(rValue.c_str(), "%d", &iVal) == 1) - { - if (pVar->GetIVal() != atoi(rValue.c_str())) - { - bOk = false; - break; - } - } - - if (pVar->GetIVal() != pVar->GetRealIVal()) - { - bOk = false; - break; - } - } - break; - case CVAR_FLOAT: - { - float fVal; - if (azsscanf(rValue.c_str(), "%f", &fVal) == 1) - { - if (pVar->GetFVal() != fVal) - { - bOk = false; - break; - } - } - } - break; - case CVAR_STRING: - if (rValue != pVar->GetString()) - { - bOk = false; - break; - } - break; - default: - assert(0); - } - - if (!bOk) - { - if (mode == ICVar::eCLM_Off) - { - return false; // exit as early as possible - } - bRet = false; // exit with same return code but log all differences - - if (strcmp(pVar->GetString(), rValue.c_str()) != 0) - { - switch (mode) - { - case ICVar::eCLM_ConsoleAndFile: - CryLog("[CVARS]: $3[FAIL] [%s] = $6[%s] $4(expected [%s] in group [%s] = [%s])", rKey.c_str(), pVar->GetString(), rValue.c_str(), GetName(), GetString()); - break; - - case ICVar::eCLM_FileOnly: - case ICVar::eCLM_FullInfo: - gEnv->pLog->LogToFile("[CVARS]: [FAIL] [%s] = [%s] (expected [%s] in group [%s] = [%s])", rKey.c_str(), pVar->GetString(), rValue.c_str(), GetName(), GetString()); - break; - - default: - assert(0); - } - } - else if (mode == ICVar::eCLM_FullInfo) - { - gEnv->pLog->LogToFile("[CVARS]: [FAIL] [%s] = [%s] (expected [%s] in group [%s] = [%s])", rKey.c_str(), pVar->GetString(), rValue.c_str(), GetName(), GetString()); - } - - pVar->DebugLog(pVar->GetIVal(), mode); // recursion - } - - if (pVar->GetFlags() & (VF_CHEAT | VF_CHEAT_ALWAYS_CHECK | VF_CHEAT_NOCHECK)) - { - // either VF_CHEAT should be removed or the var should be not part of the CVarGroup - gEnv->pLog->LogError("[CVARS]: [%s] is cheat protected; referenced in console variable group [%s] = [%s] ", rKey.c_str(), GetName(), GetString()); - } - } - else - { - // Do not warn about D3D registered cvars, which carry the prefix "q_", as they are not actually registered with the cvar system. - if (strcmp(rKey.c_str(), "q") == -1) - { - gEnv->pLog->LogError("[CVARS]: [MISSING] [%s] is not a registered console variable; referenced when testing console variable group [%s] = [%s]", rKey.c_str(), GetName(), GetString()); - } - } + CallOnChangeFunctions(); + m_pConsole->OnAfterVarChange(this); } - - return bRet; } - - - -AZStd::string CXConsoleVariableCVarGroup::GetValueSpec(const AZStd::string& sKey, const int* pSpec) const -{ - if (pSpec) - { - TCVarGroupStateMap::const_iterator itGrp = m_CVarGroupStates.find(*pSpec); - - if (itGrp != m_CVarGroupStates.end()) - { - const SCVarGroup* pGrp = itGrp->second; - - // check in spec - std::map::const_iterator it = pGrp->m_KeyValuePair.find(sKey); - - if (it != pGrp->m_KeyValuePair.end()) - { - return it->second; - } - } - } - - // check in default - std::map::const_iterator it = m_CVarGroupDefault.m_KeyValuePair.find(sKey); - - if (it != m_CVarGroupDefault.m_KeyValuePair.end()) - { - return it->second; - } - - assert(0); // internal error - return ""; -} - -void CXConsoleVariableCVarGroup::ApplyCVars(const SCVarGroup& rGroup, const SCVarGroup* pExclude) -{ - std::map::const_iterator it, end = rGroup.m_KeyValuePair.end(); - - bool wasProcessingGroup = m_pConsole->GetIsProcessingGroup(); - m_pConsole->SetProcessingGroup(true); - - for (it = rGroup.m_KeyValuePair.begin(); it != end; ++it) - { - const AZStd::string& rKey = it->first; - - if (pExclude) - { - if (pExclude->m_KeyValuePair.find(rKey) != pExclude->m_KeyValuePair.end()) - { - continue; - } - } - - // Useful for debugging cvar groups - //CryLogAlways("[CVARS]: [APPLY] ([%s]) [%s] = [%s]", GetName(), rKey.c_str(), it->second.c_str()); - - m_pConsole->LoadConfigVar(rKey.c_str(), it->second.c_str()); - } - - m_pConsole->SetProcessingGroup(wasProcessingGroup); -} - diff --git a/Code/Legacy/CrySystem/XConsoleVariable.h b/Code/Legacy/CrySystem/XConsoleVariable.h index f761287b41..cb8bdbb4ad 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.h +++ b/Code/Legacy/CrySystem/XConsoleVariable.h @@ -6,86 +6,13 @@ * */ - -#ifndef CRYINCLUDE_CRYSYSTEM_XCONSOLEVARIABLE_H -#define CRYINCLUDE_CRYSYSTEM_XCONSOLEVARIABLE_H #pragma once +#include #include -#include "BitFiddling.h" -#include "SFunctor.h" +#include class CXConsole; -typedef AZStd::fixed_string<512> stack_string; - -inline int64 TextToInt64(const char* s, int64 nCurrent, bool bBitfield) -{ - int64 nValue = 0; - if (s) - { - char* e; - if (bBitfield) - { - // Bit manipulation. - if (*s == '^') - // Bit number -#if defined(_MSC_VER) - { - nValue = 1LL << _strtoi64(++s, &e, 10); - } -#else - { - nValue = 1LL << strtoll(++s, &e, 10); - } -#endif - else - // Full number -#if defined(_MSC_VER) - { - nValue = _strtoi64(s, &e, 10); - } -#else - { - nValue = strtoll(s, &e, 10); - } -#endif - // Check letter codes. - for (; (*e >= 'a' && *e <= 'z') || (*e >= 'A' && *e <= 'Z'); e++) - { - nValue |= AlphaBit64(*e); - } - - if (*e == '+') - { - nValue = nCurrent | nValue; - } - else if (*e == '-') - { - nValue = nCurrent & ~nValue; - } - else if (*e == '^') - { - nValue = nCurrent ^ nValue; - } - } - else -#if defined(_MSC_VER) - { - nValue = _strtoi64(s, &e, 10); - } -#else - { - nValue = strtoll(s, &e, 10); - } -#endif - } - return nValue; -} - -inline int TextToInt(const char* s, int nCurrent, bool bBitfield) -{ - return (int)TextToInt64(s, nCurrent, bBitfield); -} class CXConsoleVariableBase : public ICVar @@ -107,7 +34,7 @@ public: virtual void Release(); virtual void ForceSet(const char* s); virtual void SetOnChangeCallback(ConsoleVarFunc pChangeFunc); - virtual uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) override; + virtual uint64 AddOnChangeFunctor(const AZStd::function& pChangeFunctor) override; virtual ConsoleVarFunc GetOnChangeCallback() const; virtual bool ShouldReset() const { return (m_nFlags & VF_RESETTABLE) != 0; } @@ -133,14 +60,7 @@ public: m_pDataProbeString = new char[ strlen(pDataProbeString) + 1 ]; azstrcpy(m_pDataProbeString, strlen(pDataProbeString) + 1, pDataProbeString); } - virtual const char* GetDataProbeString() const - { - if (gEnv->IsDedicated() && m_pDataProbeString) - { - return m_pDataProbeString; - } - return GetOwnDataProbeString(); - } + virtual const char* GetDataProbeString() const; protected: // ------------------------------------------------------------------------------------------ @@ -157,7 +77,7 @@ protected: // ------------------------------------------------------------------ char* m_pDataProbeString; // value client is required to have for data probes int m_nFlags; // e.g. VF_CHEAT, ... - typedef std::vector > ChangeFunctorContainer; + typedef std::vector> > ChangeFunctorContainer; ChangeFunctorContainer m_changeFunctors; ConsoleVarFunc m_pChangeFunc; // Callback function that is called when this variable changes. CXConsole* m_pConsole; // used for the callback OnBeforeVarChange() @@ -185,67 +105,19 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return atoi(m_sValue.c_str()); } - virtual int64 GetI64Val() const { return _atoi64(m_sValue.c_str()); } - virtual float GetFVal() const { return (float)atof(m_sValue.c_str()); } - virtual const char* GetString() const { return m_sValue.c_str(); } - virtual void ResetImpl() + int GetIVal() const override { return atoi(m_sValue.c_str()); } + int64 GetI64Val() const override { return _atoi64(m_sValue.c_str()); } + float GetFVal() const override { return (float)atof(m_sValue.c_str()); } + const char* GetString() const override { return m_sValue.c_str(); } + void ResetImpl() override { Set(m_sDefault.c_str()); } - virtual void Set(const char* s) - { - if (!s) - { - return; - } + void Set(const char* s) override; + void Set(float f) override; + void Set(int i) override; + int GetType() override { return CVAR_STRING; } - if ((m_sValue == s) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - if (m_pConsole->OnBeforeVarChange(this, s)) - { - m_nFlags |= VF_MODIFIED; - { - m_sValue = s; - } - - CallOnChangeFunctions(); - - m_pConsole->OnAfterVarChange(this); - } - } - - virtual void Set(float f) - { - stack_string s = stack_string::format("%g", f); - - if ((m_sValue == s.c_str()) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - m_nFlags |= VF_MODIFIED; - Set(s.c_str()); - } - - virtual void Set(int i) - { - stack_string s = stack_string::format("%d", i); - - if ((m_sValue == s.c_str()) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - m_nFlags |= VF_MODIFIED; - Set(s.c_str()); - } - virtual int GetType() { return CVAR_STRING; } - - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } private: // -------------------------------------------------------------------------------------------- AZStd::string m_sValue; AZStd::string m_sDefault; //!< @@ -267,122 +139,21 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return m_iValue; } - virtual int64 GetI64Val() const { return m_iValue; } - virtual float GetFVal() const { return (float)GetIVal(); } - virtual const char* GetString() const - { - static char szReturnString[256]; - - sprintf_s(szReturnString, "%d", GetIVal()); - return szReturnString; - } - virtual void ResetImpl() { Set(m_iDefault); } - virtual void Set(const char* s) - { - int nValue = TextToInt(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); - - Set(nValue); - } - virtual void Set(float f) - { - Set((int)f); - } - virtual void Set(int i) - { - if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - stack_string s = stack_string::format("%d", i); - - if (m_pConsole->OnBeforeVarChange(this, s.c_str())) - { - m_nFlags |= VF_MODIFIED; - m_iValue = i; - - CallOnChangeFunctions(); - - m_pConsole->OnAfterVarChange(this); - } - } - virtual int GetType() { return CVAR_INT; } - - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } + int GetIVal() const override { return m_iValue; } + int64 GetI64Val() const override { return m_iValue; } + float GetFVal() const override { return (float)GetIVal(); } + const char* GetString() const override; + void ResetImpl() override { Set(m_iDefault); } + void Set(const char* s) override; + void Set(float f) override; + void Set(int i) override; + int GetType() override { return CVAR_INT; } protected: // -------------------------------------------------------------------------------------------- int m_iValue; int m_iDefault; //!< }; - -class CXConsoleVariableInt64 - : public CXConsoleVariableBase -{ -public: - // constructor - CXConsoleVariableInt64(CXConsole* pConsole, const char* sName, const int64 iDefault, int nFlags, const char* help) - : CXConsoleVariableBase(pConsole, sName, nFlags, help) - , m_iValue(iDefault) - , m_iDefault(iDefault) - { - } - - // interface ICVar -------------------------------------------------------------------------------------- - - virtual int GetIVal() const { return (int)m_iValue; } - virtual int64 GetI64Val() const { return m_iValue; } - virtual float GetFVal() const { return (float)GetIVal(); } - virtual const char* GetString() const - { - static char szReturnString[256]; - sprintf_s(szReturnString, "%lld", GetI64Val()); - return szReturnString; - } - virtual void ResetImpl() { Set(m_iDefault); } - virtual void Set(const char* s) - { - int64 nValue = TextToInt64(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); - - Set(nValue); - } - virtual void Set(float f) - { - Set((int)f); - } - virtual void Set(int i) - { - Set((int64)i); - } - virtual void Set(int64 i) - { - if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - stack_string s = stack_string::format("%lld", i); - - if (m_pConsole->OnBeforeVarChange(this, s.c_str())) - { - m_nFlags |= VF_MODIFIED; - m_iValue = i; - - CallOnChangeFunctions(); - - m_pConsole->OnAfterVarChange(this); - } - } - virtual int GetType() { return CVAR_INT; } - - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } -protected: // -------------------------------------------------------------------------------------------- - - int64 m_iValue; - int64 m_iDefault; //!< -}; - ////////////////////////////////////////////////////////////////////////// class CXConsoleVariableFloat : public CXConsoleVariableBase @@ -401,78 +172,13 @@ public: virtual int GetIVal() const { return (int)m_fValue; } virtual int64 GetI64Val() const { return (int64)m_fValue; } virtual float GetFVal() const { return m_fValue; } - virtual const char* GetString() const - { - static char szReturnString[256]; - - sprintf_s(szReturnString, "%g", m_fValue); // %g -> "2.01", %f -> "2.01000" - return szReturnString; - } + virtual const char* GetString() const; virtual void ResetImpl() { Set(m_fDefault); } - virtual void Set(const char* s) - { - float fValue = 0; - if (s) - { - fValue = (float)atof(s); - } - - if (fValue == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - if (m_pConsole->OnBeforeVarChange(this, s)) - { - m_nFlags |= VF_MODIFIED; - m_fValue = fValue; - - CallOnChangeFunctions(); - - m_pConsole->OnAfterVarChange(this); - } - } - virtual void Set(float f) - { - if (f == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - stack_string s = stack_string::format("%g", f); - - if (m_pConsole->OnBeforeVarChange(this, s.c_str())) - { - m_nFlags |= VF_MODIFIED; - m_fValue = f; - - CallOnChangeFunctions(); - - m_pConsole->OnAfterVarChange(this); - } - } - virtual void Set(int i) - { - if ((float)i == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - char sTemp[128]; - sprintf_s(sTemp, "%d", i); - - if (m_pConsole->OnBeforeVarChange(this, sTemp)) - { - m_nFlags |= VF_MODIFIED; - m_fValue = (float)i; - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } + virtual void Set(const char* s); + virtual void Set(float f); + virtual void Set(int i); virtual int GetType() { return CVAR_FLOAT; } - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } - protected: virtual const char* GetOwnDataProbeString() const @@ -509,186 +215,19 @@ public: virtual int GetIVal() const { return m_iValue; } virtual int64 GetI64Val() const { return m_iValue; } virtual float GetFVal() const { return (float)m_iValue; } - virtual const char* GetString() const - { - static char szReturnString[256]; - - sprintf_s(szReturnString, "%d", m_iValue); - return szReturnString; - } + virtual const char* GetString() const; virtual void ResetImpl() { Set(m_iDefault); } - virtual void Set(const char* s) - { - int nValue = TextToInt(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); - if (nValue == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - if (m_pConsole->OnBeforeVarChange(this, s)) - { - m_nFlags |= VF_MODIFIED; - m_iValue = nValue; - - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } - virtual void Set(float f) - { - if ((int)f == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - char sTemp[128]; - sprintf_s(sTemp, "%g", f); - - if (m_pConsole->OnBeforeVarChange(this, sTemp)) - { - m_nFlags |= VF_MODIFIED; - m_iValue = (int)f; - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } - virtual void Set(int i) - { - if (i == m_iValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - char sTemp[128]; - sprintf_s(sTemp, "%d", i); - - if (m_pConsole->OnBeforeVarChange(this, sTemp)) - { - m_nFlags |= VF_MODIFIED; - m_iValue = i; - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } + virtual void Set(const char* s); + virtual void Set(float f); + virtual void Set(int i); virtual int GetType() { return CVAR_INT; } - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } private: // -------------------------------------------------------------------------------------------- int& m_iValue; int m_iDefault; //!< }; - - - - -class CXConsoleVariableFloatRef - : public CXConsoleVariableBase -{ -public: - //! constructor - //!\param pVar must not be 0 - CXConsoleVariableFloatRef(CXConsole* pConsole, const char* sName, float* pVar, int nFlags, const char* help) - : CXConsoleVariableBase(pConsole, sName, nFlags, help) - , m_fValue(*pVar) - , m_fDefault(*pVar) - { - assert(pVar); - } - - // interface ICVar -------------------------------------------------------------------------------------- - - virtual int GetIVal() const { return (int)m_fValue; } - virtual int64 GetI64Val() const { return (int64)m_fValue; } - virtual float GetFVal() const { return m_fValue; } - virtual const char* GetString() const - { - static char szReturnString[256]; - - sprintf_s(szReturnString, "%g", m_fValue); - return szReturnString; - } - virtual void ResetImpl() { Set(m_fDefault); } - virtual void Set(const char* s) - { - float fValue = 0; - if (s) - { - fValue = (float)atof(s); - } - if (fValue == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - if (m_pConsole->OnBeforeVarChange(this, s)) - { - m_nFlags |= VF_MODIFIED; - m_fValue = fValue; - - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } - virtual void Set(float f) - { - if (f == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - char sTemp[128]; - sprintf_s(sTemp, "%g", f); - - if (m_pConsole->OnBeforeVarChange(this, sTemp)) - { - m_nFlags |= VF_MODIFIED; - m_fValue = f; - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } - virtual void Set(int i) - { - if ((float)i == m_fValue && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - char sTemp[128]; - sprintf_s(sTemp, "%d", i); - - if (m_pConsole->OnBeforeVarChange(this, sTemp)) - { - m_nFlags |= VF_MODIFIED; - m_fValue = (float)i; - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } - virtual int GetType() { return CVAR_FLOAT; } - - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } - -protected: - - virtual const char* GetOwnDataProbeString() const - { - static char szReturnString[8]; - - sprintf_s(szReturnString, "%.1g", m_fValue); - return szReturnString; - } - -private: // -------------------------------------------------------------------------------------------- - - float& m_fValue; - float m_fDefault; //!< -}; - - - class CXConsoleVariableStringRef : public CXConsoleVariableBase { @@ -715,25 +254,7 @@ public: return m_sValue.c_str(); } virtual void ResetImpl() { Set(m_sDefault.c_str()); } - virtual void Set(const char* s) - { - if ((m_sValue == s) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) - { - return; - } - - if (m_pConsole->OnBeforeVarChange(this, s)) - { - m_nFlags |= VF_MODIFIED; - { - m_sValue = s; - m_userPtr = m_sValue.c_str(); - } - - CallOnChangeFunctions(); - m_pConsole->OnAfterVarChange(this); - } - } + virtual void Set(const char* s); virtual void Set(float f) { stack_string s = stack_string::format("%g", f); @@ -746,7 +267,6 @@ public: } virtual int GetType() { return CVAR_STRING; } - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } private: // -------------------------------------------------------------------------------------------- AZStd::string m_sValue; @@ -754,84 +274,44 @@ private: // -------------------------------------------------------------------- const char*& m_userPtr; //!< }; - - -// works like CXConsoleVariableInt but when changing it sets other console variables -// getting the value returns the last value it was set to - if that is still what was applied -// to the cvars can be tested with GetRealIVal() -class CXConsoleVariableCVarGroup - : public CXConsoleVariableInt - , public ILoadConfigurationEntrySink +class CXConsoleVariableFloatRef + : public CXConsoleVariableBase { public: - // constructor - CXConsoleVariableCVarGroup(CXConsole* pConsole, const char* sName, const char* szFileName, int nFlags); - - // destructor - ~CXConsoleVariableCVarGroup(); - - // Returns: - // part of the help string - useful to log out detailed description without additional help text - AZStd::string GetDetailedInfo() const; - - // interface ICVar ----------------------------------------------------------------------------------- - - virtual const char* GetHelp(); - - virtual int GetRealIVal() const; - - virtual void DebugLog(const int iExpectedValue, const ICVar::EConsoleLogMode mode) const; - - virtual void Set(int i); - - // ConsoleVarFunc ------------------------------------------------------------------------------------ - - static void OnCVarChangeFunc(ICVar* pVar); - - // interface ILoadConfigurationEntrySink ------------------------------------------------------------- - - virtual void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup); - virtual void OnLoadConfigurationEntry_End(); - - virtual void GetMemoryUsage(class ICrySizer* pSizer) const + //! constructor + //!\param pVar must not be 0 + CXConsoleVariableFloatRef(CXConsole* pConsole, const char* sName, float* pVar, int nFlags, const char* help) + : CXConsoleVariableBase(pConsole, sName, nFlags, help) + , m_fValue(*pVar) + , m_fDefault(*pVar) { - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_sDefaultValue); - pSizer->AddObject(m_CVarGroupStates); + assert(pVar); } + + // interface ICVar -------------------------------------------------------------------------------------- + + virtual int GetIVal() const { return (int)m_fValue; } + virtual int64 GetI64Val() const { return (int64)m_fValue; } + virtual float GetFVal() const { return m_fValue; } + virtual const char* GetString() const; + virtual void ResetImpl() { Set(m_fDefault); } + virtual void Set(const char* s); + virtual void Set(float f); + virtual void Set(int i); + virtual int GetType() { return CVAR_FLOAT; } + +protected: + + virtual const char *GetOwnDataProbeString() const + { + static char szReturnString[8]; + + sprintf_s(szReturnString, "%.1g", m_fValue); + return szReturnString; + } + private: // -------------------------------------------------------------------------------------------- - struct SCVarGroup - { - std::map m_KeyValuePair; // e.g. m_KeyValuePair["r_fullscreen"]="0" - void GetMemoryUsage(class ICrySizer* pSizer) const - { - pSizer->AddObject(m_KeyValuePair); - } - }; - - SCVarGroup m_CVarGroupDefault; - typedef std::map TCVarGroupStateMap; - TCVarGroupStateMap m_CVarGroupStates; - AZStd::string m_sDefaultValue; // used by OnLoadConfigurationEntry_End() - - void ApplyCVars(const SCVarGroup& rGroup, const SCVarGroup* pExclude = 0); - - // Arguments: - // sKey - must exist, at least in default - // pSpec - can be 0 - AZStd::string GetValueSpec(const AZStd::string& sKey, const int* pSpec = 0) const; - - // should only be used by TestCVars() - // Returns: - // true=all console variables match the state (excluding default state), false otherwise - bool TestCVars(const SCVarGroup& rGroup, const ICVar::EConsoleLogMode mode, const SCVarGroup* pExclude = 0) const; - - // Arguments: - // pGroup - can be 0 to test if the default state is set - // Returns: - // true=all console variables match the state (including default state), false otherwise - bool TestCVars(const SCVarGroup* pGroup, const ICVar::EConsoleLogMode mode = ICVar::eCLM_Off) const; + float& m_fValue; + float m_fDefault; //!< }; - -#endif // CRYINCLUDE_CRYSYSTEM_XCONSOLEVARIABLE_H diff --git a/Code/Legacy/CrySystem/XML/ReadWriteXMLSink.h b/Code/Legacy/CrySystem/XML/ReadWriteXMLSink.h deleted file mode 100644 index b4dd28e813..0000000000 --- a/Code/Legacy/CrySystem/XML/ReadWriteXMLSink.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYSYSTEM_XML_READWRITEXMLSINK_H -#define CRYINCLUDE_CRYSYSTEM_XML_READWRITEXMLSINK_H -#pragma once - - -#include -#include - -class CReadWriteXMLSink - : public IReadWriteXMLSink -{ -public: - bool ReadXML(const char* definitionFile, const char* dataFile, IReadXMLSink* pSink); - bool ReadXML(const char* definitionFile, XmlNodeRef node, IReadXMLSink* pSink); - bool ReadXML(XmlNodeRef definition, const char* dataFile, IReadXMLSink* pSink); - bool ReadXML(XmlNodeRef definition, XmlNodeRef node, IReadXMLSink* pSink); - - XmlNodeRef CreateXMLFromSource(const char* definitionFile, IWriteXMLSource* pSource); - bool WriteXML(const char* definitionFile, const char* dataFile, IWriteXMLSource* pSource); -}; - - -// helper to define the if/else chain that we need in a few locations... -// types must match IReadXMLSink::TValueTypes -#define XML_SET_PROPERTY_HELPER(ELSE_LOAD_PROPERTY) \ - if (false) {; } \ - ELSE_LOAD_PROPERTY(Vec3); \ - ELSE_LOAD_PROPERTY(int); \ - ELSE_LOAD_PROPERTY(float); \ - ELSE_LOAD_PROPERTY(AZStd::string); \ - ELSE_LOAD_PROPERTY(bool); - - -#endif // CRYINCLUDE_CRYSYSTEM_XML_READWRITEXMLSINK_H diff --git a/Code/Legacy/CrySystem/XML/ReadXMLSink.cpp b/Code/Legacy/CrySystem/XML/ReadXMLSink.cpp deleted file mode 100644 index e75fed22ed..0000000000 --- a/Code/Legacy/CrySystem/XML/ReadXMLSink.cpp +++ /dev/null @@ -1,683 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "CrySystem_precompiled.h" -#include "ReadWriteXMLSink.h" - -#include -#include - -typedef std::map IdTable; -struct SParseParams -{ - IdTable idTable; - XmlNodeRef useAlways; - bool strict; - - SParseParams() - { - strict = true; - } -}; - -static XmlNodeRef Clone(XmlNodeRef source); -static void CopyAttributes(const XmlNodeRef& source, XmlNodeRef& dest); -static bool IsOptionalReadXML(const SParseParams& parseParams, XmlNodeRef& definition); -static bool CheckEnum(const SParseParams& parseParams, const char* name, XmlNodeRef& definition, XmlNodeRef& data); - -static bool LoadTableInner(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); -static bool LoadArray(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); -static bool LoadProperty(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); -static bool LoadTable(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); -static bool LoadReferencedId(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); -static bool LoadSomething(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); -static bool LoadArraySetValueTable(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink, int elem); - -typedef bool (* LoadArraySetValue)(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink, int elem); -typedef bool (* LoadDefinitionFunction)(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink); - - -template -struct ReadPropertyTyped; - -template -struct ReadPropertyTyped -{ - static bool Load(const SParseParams& parseParams, const char* name, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) - { - T value; - memset(&value, 0, sizeof(T)); - - if (!pSink->IsCreationMode()) - { - if (!data->haveAttr(name)) - { - return false; - } - if (!data->getAttr(name, value)) - { - return false; - } - if (!CheckEnum(parseParams, name, definition, data)) - { - return false; - } - } - - IReadXMLSink::TValue vvalue(value); - pSink->SetValue(name, vvalue, definition); - return true; - } - static bool LoadArray([[maybe_unused]] const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink, int elem) - { - T value; - memset(&value, 0, sizeof(T)); - - if (!pSink->IsCreationMode()) - { - if (!data->haveAttr("value")) - { - return false; - } - if (!data->getAttr("value", value)) - { - return false; - } - } - - IReadXMLSink::TValue vvalue(value); - pSink->SetAt(elem, vvalue, definition); - return true; - } -}; - -template <> -struct ReadPropertyTyped -{ - static bool Load(const SParseParams& parseParams, const char* name, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) - { - const char* value = 0; - - if (!pSink->IsCreationMode()) - { - if (!data->haveAttr(name)) - { - return false; - } - if (!CheckEnum(parseParams, name, definition, data)) - { - return false; - } - - value = data->getAttr(name); - } - - IReadXMLSink::TValue vvalue(value); - pSink->SetValue(name, vvalue, definition); - return true; - } - static bool LoadArray([[maybe_unused]] const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink, int elem) - { - const char* value = 0; - - if (!pSink->IsCreationMode()) - { - if (!data->haveAttr("value")) - { - return false; - } - - value = data->getAttr("value"); - } - - IReadXMLSink::TValue vvalue(value); - pSink->SetAt(elem, vvalue, definition); - return true; - } -}; - -XmlNodeRef Clone(XmlNodeRef source) -{ - assert(source != (IXmlNode*)NULL); - - // Can't use clone() on XmlNodeRef objects since they can contain a CXMLBinaryNode, which doesn't support - // clone(). Instead we just create a regular xml node and manually copy content, tag, attributes and children - XmlNodeRef cloned = GetISystem()->CreateXmlNode(source->getTag()); - cloned->setContent(source->getContent()); - CopyAttributes(source, cloned); - const int iChildCount = source->getChildCount(); - for (int i = 0; i < iChildCount; ++i) - { - cloned->addChild(Clone(source->getChild(i))); - } - - return cloned; -} - -void CopyAttributes(const XmlNodeRef& source, XmlNodeRef& dest) -{ - // Not as fast as CXmlNode::copyAttributes(), but that method will have undefined behavior if the XmlNodeRef contains - // a CBinaryXmlNode object - int nNumAttributes = source->getNumAttributes(); - for (int i = 0; i < nNumAttributes; ++i) - { - const char* key = NULL; - const char* value = NULL; - if (source->getAttributeByIndex(i, &key, &value)) - { - dest->setAttr(key, value); - } - } -} - -bool IsOptionalReadXML(const SParseParams& parseParams, XmlNodeRef& definition) -{ - // If strict mode is off, then everything is optional - if (parseParams.strict == false) - { - return true; - } - - bool optional = false; - definition->getAttr("optional", optional); - return optional; -} - -bool CheckEnum([[maybe_unused]] const SParseParams& parseParams, [[maybe_unused]] const char* name, XmlNodeRef& definition, [[maybe_unused]] XmlNodeRef& data) -{ - if (XmlNodeRef enumNode = definition->findChild("Enum")) - { - // If strict mode is off, then no need to check the enum value - return true; - } - return true; -} - -bool LoadProperty(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) -{ - const char* name = definition->getAttr("name"); - if (0 == strlen(name)) - { - CryLog("Property has no name"); - return false; - } - - const char* type = definition->getAttr("type"); - if (0 == strlen(type)) - { - CryLog("Property '%s' has no type", type); - return false; - } - - XmlNodeRef dataToRead = data; - if (!pSink->IsCreationMode()) - { - // This check is done so the data xml can specify child elements instead of attributes if desired, - // since the rest of the code assume only attributes - if (XmlNodeRef childRef = data->findChild(name)) - { - if (data->haveAttr(name)) - { - CryLog("Duplicate definition (attribute and element) for %s", name); - return false; - } - if (childRef->getChildCount()) - { - CryLog("Property-style elements can not have children (property was %s)", name); - return false; - } - - dataToRead = GetISystem()->CreateXmlNode(data->getTag()); - - AZStd::string content = childRef->getContent(); - AZ::StringFunc::TrimWhiteSpace(content, true, true); - dataToRead->setAttr(name, content.c_str()); - } - - if (!dataToRead->haveAttr(name)) - { - if (!IsOptionalReadXML(parseParams, definition)) - { - CryLog("Failed to load property %s", name); - return false; - } - return true; - } - } - - bool ok = false; -#define LOAD_PROPERTY(whichType) else if (0 == strcmp(type, #whichType)) ok = ReadPropertyTyped::Load(parseParams, name, definition, dataToRead, pSink) - XML_SET_PROPERTY_HELPER(LOAD_PROPERTY); -#undef LOAD_PROPERTY - - if (!ok) - { - CryLog("Failed loading attribute %s of type %s", name, type); - } - - return ok; -} - -bool LoadArraySetValueTable(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink, int elem) -{ - IReadXMLSinkPtr pChildSink = pSink->BeginTableAt(elem, definition); - - if (pSink->IsCreationMode() && definition->haveAttr("type")) - { - if (!LoadSomething(parseParams, definition, data, &*pChildSink)) - { - return false; - } - } - else - { - if (!LoadTableInner(parseParams, definition, data, &*pChildSink)) - { - return false; - } - } - - if (!pChildSink->EndTableAt(elem)) - { - CryLog("Failed to finish table at element %d", elem); - return false; - } - - return true; -} - -bool LoadArray(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) -{ - const char* name = definition->getAttr("name"); - if (0 == strlen(name)) - { - CryLog("Array has no name"); - return false; - } - - const char* elementName = definition->getAttr("elementName"); - if (0 == strlen(elementName)) - { - elementName = "element"; - } - - bool validateArray = true; - if (definition->haveAttr(elementName)) - { - definition->getAttr("validate", validateArray); - } - - - XmlNodeRef childData; - - if (!pSink->IsCreationMode()) - { - childData = data->findChild(name); - if (!childData) - { - bool ok = IsOptionalReadXML(parseParams, definition); - if (!ok) - { - CryLog("Failed to load child table %s", name); - } - return ok; - } - } - - IReadXMLSinkPtr childSink = pSink->BeginArray(name, definition); - if (!childSink) - { - CryLog("Failed to begin array named %s", name); - return false; - } - - LoadArraySetValue setter = NULL; - if (definition->haveAttr("type")) - { - setter = NULL; - const char* type = definition->getAttr("type"); -#define SETTER_PROPERTY(whichType) else if (0 == strcmp(type, #whichType)) setter = ReadPropertyTyped::LoadArray - XML_SET_PROPERTY_HELPER(SETTER_PROPERTY); -#undef SETTER_PROPERTY - if (!setter) - { - CryLog("Unknown type %s in array %s", type, name); - return false; - } - } - else - { - setter = LoadArraySetValueTable; - } - - if (!pSink->IsCreationMode()) - { - int numElems = childData->getChildCount(); - int elem = 1; - for (int i = 0; i < numElems; i++) - { - XmlNodeRef elemData = childData->getChild(i); - if (0 == strcmp(elemData->getTag(), elementName)) - { - int increment = 1; - if (elemData->haveAttr("_index")) - { - if (!elemData->getAttr("_index", elem)) - { - CryLog("_index is not an integer in array %s (pos hint=%d)", name, elem); - return false; - } - } - if (!setter(parseParams, definition, elemData, &*childSink, elem)) - { - CryLog("Failed loading element %d of array %s", elem, name); - return false; - } - elem += increment; - } - else if (validateArray) - { - CryLog("Invalid node %s in array %s", elemData->getTag(), name); - return false; - } - } - } - else - { - // only process array content for the array being created - if (0 == strcmp(name, pSink->GetCreationNode()->getAttr("name"))) - { - if (!setter(parseParams, definition, data, &*childSink, 1)) - { - CryLog("[ReadXML CreationMode]: Failed loading element %d of array %s", 1, name); - return false; - } - } - } - - if (!pSink->EndArray(name)) - { - CryLog("Failed to finish array named %s", name); - return false; - } - - return true; -} - -bool LoadTable(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) -{ - const char* name = definition->getAttr("name"); - if (0 == strlen(name)) - { - CryLog("Child-table has no name"); - return false; - } - - XmlNodeRef childData; - - if (!pSink->IsCreationMode()) - { - childData = data->findChild(name); - if (!childData) - { - bool ok = IsOptionalReadXML(parseParams, definition); - if (!ok) - { - CryLog("Failed to load child table %s", name); - } - return ok; - } - } - - IReadXMLSinkPtr childSink = pSink->BeginTable(name, definition); - if (!childSink) - { - CryLog("Sink creation failed for table %s", name); - return false; - } - - - if (!LoadTableInner(parseParams, definition, childData, childSink)) - { - CryLog("Failed to load data for child table %s", name); - return false; - } - - if (!pSink->EndTable(name)) - { - CryLog("Table %s failed to complete in sink", name); - return false; - } - - return true; -} - -bool LoadSomething(const SParseParams& parseParams, XmlNodeRef& nodeDefinition, XmlNodeRef& data, IReadXMLSink* pSink) -{ - // Ignore if it's the useAlways array - if (parseParams.useAlways == nodeDefinition) - { - return true; - } - - static struct - { - const char* name; - LoadDefinitionFunction loader; - } loaderTypes[] = { - {"Property", &LoadProperty}, - {"Array", &LoadArray}, - {"Table", &LoadTable}, - {"Use", &LoadReferencedId}, - }; - static const int numLoaderTypes = sizeof(loaderTypes) / sizeof(*loaderTypes); - - const char* nodeDefinitionTag = nodeDefinition->getTag(); - bool ok = false; - int i; - - for (i = 0; i < numLoaderTypes; i++) - { - if (0 == strcmp(loaderTypes[i].name, nodeDefinitionTag)) - { - ok = loaderTypes[i].loader(parseParams, nodeDefinition, data, pSink); - break; - } - } - - if (0 == _stricmp("Settings", nodeDefinitionTag)) - { - return true; - } - - if (!ok) - { - if (i == numLoaderTypes) - { - CryLog("Invalid definition node type %s, line %d", nodeDefinitionTag, nodeDefinition->getLine()); - } - } - return ok; -} - -bool LoadReferencedId(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) -{ - IdTable::const_iterator iter = parseParams.idTable.find(definition->getAttr("id")); - if (iter == parseParams.idTable.end()) - { - CryLog("No definition with id '%s'", definition->getAttr("id")); - return false; - } - XmlNodeRef useDefinition = Clone(iter->second); - CopyAttributes(definition, useDefinition); - - return LoadSomething(parseParams, useDefinition, data, pSink); -} - -bool LoadTableInner(const SParseParams& parseParams, XmlNodeRef& definition, XmlNodeRef& data, IReadXMLSink* pSink) -{ - const int nChildrenDefinition = definition->getChildCount(); - - for (int nChildDefinition = 0; nChildDefinition < nChildrenDefinition; nChildDefinition++) - { - XmlNodeRef nodeDefinition = definition->getChild(nChildDefinition); - - if (!LoadSomething(parseParams, nodeDefinition, data, pSink)) - { - return false; - } - } - - if (parseParams.useAlways != (IXmlNode*)NULL) - { - assert(!definition->haveAttr("type")); - - const int nUseAlwaysDefCount = parseParams.useAlways->getChildCount(); - for (int i = 0; i < nUseAlwaysDefCount; ++i) - { - XmlNodeRef nodeDefinition = parseParams.useAlways->getChild(i); - - // Don't continue loading useAlways nodes in creation mode - if (!pSink->IsCreationMode()) - { - if (!LoadSomething(parseParams, nodeDefinition, data, pSink)) - { - return false; - } - } - } - } - - return true; -} - -bool CReadWriteXMLSink::ReadXML(XmlNodeRef rootDefinition, XmlNodeRef rootData, IReadXMLSink* pSink) -{ - if (!pSink->IsCreationMode()) - { - if (0 == rootData) - { - return false; - } - - if (0 != strcmp(rootDefinition->getTag(), "Definition")) - { - CryLog("Root tag of definition file was %s; expected Definition", rootDefinition->getTag()); - return false; - } - if (rootDefinition->haveAttr("root")) - { - if (0 != strcmp(rootDefinition->getAttr("root"), rootData->getTag())) - { - CryLog("Root data has wrong tag; was %s expected %s", rootData->getTag(), rootDefinition->getAttr("root")); - return false; - } - } - } - - SParseParams parseParams; - parseParams.useAlways = rootDefinition->findChild("AllowAlways"); - - if (XmlNodeRef settingsParams = rootDefinition->findChild("Settings")) - { - settingsParams->getAttr("strict", parseParams.strict); - } - - // scan for id's in the structure (for the Use member) - std::stack scanStack; - scanStack.push(rootDefinition); - while (!scanStack.empty()) - { - XmlNodeRef refNode = scanStack.top(); - scanStack.pop(); - - int numChildren = refNode->getChildCount(); - const char* tag = refNode->getTag(); - - for (int i = 0; i < numChildren; i++) - { - const XmlNodeRef& childNodeRef = refNode->getChild(i); - if (parseParams.useAlways != childNodeRef) - { - scanStack.push(childNodeRef); - } - } - - // If the element has an attribute id="" and is not a "" element add it to the idTable map - if (refNode->haveAttr("id") && 0 != strcmp("Use", tag)) - { - parseParams.idTable[refNode->getAttr("id")] = refNode; - } - } - - if (pSink->IsCreationMode() && rootDefinition->haveAttr("type")) - { - // if creating from a 0-child definition node, load itself - if (!LoadSomething(parseParams, rootDefinition, rootData, pSink)) - { - return false; - } - } - else - { - // load content - if (!LoadTableInner(parseParams, rootDefinition, rootData, pSink)) - { - return false; - } - } - - bool ok = pSink->Complete(); - if (!ok) - { - CryLog("Warning: sink failed to complete reading"); - } - - return ok; -} - -bool CReadWriteXMLSink::ReadXML(XmlNodeRef definition, const char* dataFile, IReadXMLSink* pSink) -{ - XmlNodeRef rootData = GetISystem()->LoadXmlFromFile(dataFile); - if (!rootData) - { - CryLog("Unable to load XML-Lua data file: %s", dataFile); - return false; - } - return ReadXML(definition, rootData, pSink); -} - -bool CReadWriteXMLSink::ReadXML(const char* definitionFile, XmlNodeRef rootData, IReadXMLSink* pSink) -{ - XmlNodeRef rootDefinition = GetISystem()->LoadXmlFromFile(definitionFile); - if (!rootDefinition) - { - CryLog("Unable to load XML-Lua definition file: %s", definitionFile); - return false; - } - return ReadXML(rootDefinition, rootData, pSink); -} - -bool CReadWriteXMLSink::ReadXML(const char* definitionFile, const char* dataFile, IReadXMLSink* pSink) -{ - XmlNodeRef rootData = GetISystem()->LoadXmlFromFile(dataFile); - if (!rootData) - { - CryLog("Unable to load XML-Lua data file: %s", dataFile); - return false; - } - if (!ReadXML(definitionFile, rootData, pSink)) - { - CryLog("Unable to load file %s", dataFile); - return false; - } - return true; -} - - diff --git a/Code/Legacy/CrySystem/XML/SerializeXMLReader.cpp b/Code/Legacy/CrySystem/XML/SerializeXMLReader.cpp index 841697ecdb..528e3dbcc5 100644 --- a/Code/Legacy/CrySystem/XML/SerializeXMLReader.cpp +++ b/Code/Legacy/CrySystem/XML/SerializeXMLReader.cpp @@ -104,23 +104,6 @@ bool CSerializeXMLReaderImpl::Value(const char* name, CTimeValue& value) return true; } -bool CSerializeXMLReaderImpl::Value(const char* name, XmlNodeRef& value) -{ - DefaultValue(value); // Set input value to default. - if (m_nErrors) - { - return false; - } - - if (BeginOptionalGroup(name, true)) - { - value = CurNode()->getChild(0); - EndGroup(); - } - - return true; -} - void CSerializeXMLReaderImpl::BeginGroup(const char* szName) { if (m_nErrors) @@ -173,32 +156,3 @@ void CSerializeXMLReaderImpl::EndGroup() } assert(!m_nodeStack.empty()); } - -////////////////////////////////////////////////////////////////////////// -AZStd::string CSerializeXMLReaderImpl::GetStackInfo() const -{ - AZStd::string str; - for (int i = 0; i < (int)m_nodeStack.size(); i++) - { - const char* name = m_nodeStack[i].m_node->getAttr(TAG_SCRIPT_NAME); - if (name && name[0]) - { - str += name; - } - else - { - str += m_nodeStack[i].m_node->getTag(); - } - if (i != m_nodeStack.size() - 1) - { - str += "/"; - } - } - return str; -} - -void CSerializeXMLReaderImpl::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->Add(*this); - pSizer->AddContainer(m_nodeStack); -} diff --git a/Code/Legacy/CrySystem/XML/SerializeXMLReader.h b/Code/Legacy/CrySystem/XML/SerializeXMLReader.h index f87350d3fe..58c150db24 100644 --- a/Code/Legacy/CrySystem/XML/SerializeXMLReader.h +++ b/Code/Legacy/CrySystem/XML/SerializeXMLReader.h @@ -6,22 +6,16 @@ * */ - -#ifndef CRYINCLUDE_CRYSYSTEM_XML_SERIALIZEXMLREADER_H -#define CRYINCLUDE_CRYSYSTEM_XML_SERIALIZEXMLREADER_H #pragma once - #include "SimpleSerialize.h" #include #include #include -#include -#include #include "xml.h" class CSerializeXMLReaderImpl - : public CSimpleSerializeImpl + : public CSimpleSerializeImpl { public: CSerializeXMLReaderImpl(const XmlNodeRef& nodeRef); @@ -41,7 +35,7 @@ public: g_pXmlStrCmp = &strcmp; // Do case-sensitive compare bool bReturn = node->haveAttr(name); if (bReturn) - { + { value = node->getAttr(name); } g_pXmlStrCmp = pPrevCmpFunc; @@ -51,10 +45,6 @@ public: { return false; } - ILINE bool GetAttr([[maybe_unused]] const XmlNodeRef& node, [[maybe_unused]] const char* name, [[maybe_unused]] SNetObjectID& value) - { - return false; - } template bool Value(const char* name, T_Value& value) @@ -77,23 +67,12 @@ public: bool Value(const char* name, int8& value); bool Value(const char* name, AZStd::string& value); bool Value(const char* name, CTimeValue& value); - bool Value(const char* name, XmlNodeRef& value); - - template - bool Value(const char* name, T_Value& value, [[maybe_unused]] const T_Policy& policy) - { - return Value(name, value); - } void BeginGroup(const char* szName); bool BeginOptionalGroup(const char* szName, bool condition); void EndGroup(); - AZStd::string GetStackInfo() const; - - void GetMemoryUsage(ICrySizer* pSizer) const; private: - //CTimeValue m_curTime; XmlNodeRef CurNode() { return m_nodeStack.back().m_node; } XmlNodeRef NextOf(const char* name) { @@ -171,13 +150,9 @@ private: void DefaultValue(Ang3& v) const { v.x = 0; v.y = 0; v.z = 0; } void DefaultValue(Quat& v) const { v.w = 1.0f; v.v.x = 0; v.v.y = 0; v.v.z = 0; } void DefaultValue(CTimeValue& v) const { v.SetValue(0); } - //void DefaultValue( char *str ) const { if (str) str[0] = 0; } void DefaultValue(AZStd::string& str) const { str = ""; } void DefaultValue([[maybe_unused]] const AZStd::string& str) const {} - void DefaultValue([[maybe_unused]] SNetObjectID& id) const {} void DefaultValue([[maybe_unused]] SSerializeString& str) const {} void DefaultValue(XmlNodeRef& ref) const { ref = NULL; } ////////////////////////////////////////////////////////////////////////// }; - -#endif // CRYINCLUDE_CRYSYSTEM_XML_SERIALIZEXMLREADER_H diff --git a/Code/Legacy/CrySystem/XML/SerializeXMLWriter.cpp b/Code/Legacy/CrySystem/XML/SerializeXMLWriter.cpp index ce3fbcc2b1..5a3e403218 100644 --- a/Code/Legacy/CrySystem/XML/SerializeXMLWriter.cpp +++ b/Code/Legacy/CrySystem/XML/SerializeXMLWriter.cpp @@ -49,16 +49,6 @@ bool CSerializeXMLWriterImpl::Value(const char* name, CTimeValue value) return true; } -bool CSerializeXMLWriterImpl::Value(const char* name, XmlNodeRef& value) -{ - if (BeginOptionalGroup(name, value != NULL)) - { - CurNode()->addChild(value); - EndGroup(); - } - return true; -} - void CSerializeXMLWriterImpl::BeginGroup(const char* szName) { if (strchr(szName, ' ') != 0) @@ -104,13 +94,6 @@ void CSerializeXMLWriterImpl::EndGroup() assert(!m_nodeStack.empty()); } -void CSerializeXMLWriterImpl::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->Add(*this); - pSizer->AddObject(m_nodeStack); - pSizer->AddContainer(m_luaSaveStack); -} - ////////////////////////////////////////////////////////////////////////// AZStd::string CSerializeXMLWriterImpl::GetStackInfo() const { diff --git a/Code/Legacy/CrySystem/XML/SerializeXMLWriter.h b/Code/Legacy/CrySystem/XML/SerializeXMLWriter.h index 5f3e9f2c53..26fbe4b29c 100644 --- a/Code/Legacy/CrySystem/XML/SerializeXMLWriter.h +++ b/Code/Legacy/CrySystem/XML/SerializeXMLWriter.h @@ -15,11 +15,10 @@ #include #include #include -#include "IValidator.h" #include "SimpleSerialize.h" class CSerializeXMLWriterImpl - : public CSimpleSerializeImpl + : public CSimpleSerializeImpl { public: CSerializeXMLWriterImpl(const XmlNodeRef& nodeRef); @@ -32,21 +31,12 @@ public: return true; } - template - bool Value(const char* name, T_Value& value, [[maybe_unused]] const T_Policy& policy) - { - return Value(name, value); - } - bool Value(const char* name, CTimeValue value); - bool Value(const char* name, XmlNodeRef& value); void BeginGroup(const char* szName); bool BeginOptionalGroup(const char* szName, bool condition); void EndGroup(); - void GetMemoryUsage(ICrySizer* pSizer) const; - private: ////////////////////////////////////////////////////////////////////////// // Vars. @@ -99,10 +89,6 @@ private: { AddValue(name, value.c_str()); } - void AddValue([[maybe_unused]] const char* name, [[maybe_unused]] const SNetObjectID& value) - { - assert(false); - } template void AddTypedValue(const char* name, const T& value, const char* type) { diff --git a/Code/Legacy/CrySystem/XML/WriteXMLSource.cpp b/Code/Legacy/CrySystem/XML/WriteXMLSource.cpp deleted file mode 100644 index c5fa3839e0..0000000000 --- a/Code/Legacy/CrySystem/XML/WriteXMLSource.cpp +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "CrySystem_precompiled.h" -#include "ReadWriteXMLSink.h" - -#include - -typedef std::map IdTable; - -static bool IsOptionalWriteXML(XmlNodeRef& definition); - -static bool SaveTableInner(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); -static bool SaveReferencedId(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); -static bool SaveSomething(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); -static bool SaveArray(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); -static bool SaveProperty(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); -static bool SaveTable(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); -static bool SaveArraySetValueTable(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource, int elem); - -typedef bool (* SaveArraySetValue)(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource, int elem); -typedef bool (* SaveDefinitionFunction)(const IdTable&, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource); - -template -struct WritePropertyTyped; - -template -struct WritePropertyTyped -{ - static bool Save(const char* name, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource) - { - IWriteXMLSource::TValue vvalue((T())); - if (!pSource->GetValue(name, vvalue, definition)) - { - return false; - } - T* pValue = AZStd::get_if(&vvalue); - if (!pValue) - { - return false; - } - data->setAttr(name, *pValue); - return true; - } - static bool SaveArray([[maybe_unused]] const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource, int elem) - { - IWriteXMLSource::TValue vvalue((T())); - if (!pSource->GetAt(elem, vvalue, definition)) - { - return false; - } - T* pValue = AZStd::get_if(&vvalue); - if (!pValue) - { - return false; - } - data->setAttr("value", *pValue); - return true; - } -}; - -template <> -struct WritePropertyTyped - : public WritePropertyTyped -{ -}; - -bool IsOptionalWriteXML(XmlNodeRef& definition) -{ - bool optional = false; - definition->getAttr("optional", optional); - return optional; -} - -bool SaveProperty([[maybe_unused]] const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource) -{ - const char* name = definition->getAttr("name"); - if (0 == strlen(name)) - { - CryLog("Property has no name"); - return false; - } - - const char* type = definition->getAttr("type"); - if (0 == strlen(type)) - { - CryLog("Property '%s' has no type", type); - return false; - } - - if (IsOptionalWriteXML(definition) && !pSource->HaveValue(name)) - { - return true; - } - - bool ok = false; -#define SAVE_PROPERTY(whichType) else if (0 == strcmp(type, #whichType)) ok = WritePropertyTyped::Save(name, definition, data, pSource) - XML_SET_PROPERTY_HELPER(SAVE_PROPERTY); -#undef SAVE_PROPERTY - - if (!ok) - { - CryLog("Failed loading attribute %s of type %s", name, type); - } - - return ok; -} - -bool SaveArraySetValueTable(const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource, int elem) -{ - IWriteXMLSourcePtr pChildSource = pSource->BeginTableAt(elem); - if (!pChildSource) - { - CryLog("Failed to find source table at %d", elem); - return false; - } - - if (!SaveTableInner(idTable, definition, data, &*pChildSource)) - { - return false; - } - - if (!pChildSource->EndTableAt(elem)) - { - CryLog("Failed to finish table at element %d", elem); - return false; - } - - return true; -} - -bool SaveArray(const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource) -{ - const char* name = definition->getAttr("name"); - if (0 == strlen(name)) - { - CryLog("Array has no name"); - return false; - } - - const char* elementName = definition->getAttr("elementName"); - if (0 == strlen(elementName)) - { - elementName = "element"; - } - - bool validateArray = true; - if (definition->haveAttr(elementName)) - { - definition->getAttr("validate", validateArray); - } - - size_t numElems = 0; - IWriteXMLSourcePtr childSource = pSource->BeginArray(name, &numElems, definition); - if (!childSource) - { - bool ok = IsOptionalWriteXML(definition); - if (!ok) - { - CryLog("Failed to begin array named %s", name); - } - return ok; - } - - XmlNodeRef childData = data->createNode(name); - - SaveArraySetValue setter = NULL; - if (definition->haveAttr("type")) - { - setter = NULL; - const char* type = definition->getAttr("type"); -#define SETTER_PROPERTY(whichType) else if (0 == strcmp(type, #whichType)) setter = WritePropertyTyped::SaveArray - XML_SET_PROPERTY_HELPER(SETTER_PROPERTY); -#undef SETTER_PROPERTY - if (!setter) - { - CryLog("Unknown type %s in array %s", type, name); - return false; - } - } - else - { - setter = SaveArraySetValueTable; - } - - bool needIndex = false; - for (size_t sizei = 1; sizei <= numElems; sizei++) - { - const int i = static_cast(sizei); - if (!childSource->HaveElemAt(i)) - { - needIndex = true; - } - else - { - XmlNodeRef elemData = childData->createNode(elementName); - if (needIndex) - { - elemData->setAttr("_index", i); - } - needIndex = false; - - if (!setter(idTable, definition, elemData, &*childSource, i)) - { - CryLog("Failed saving element %d of array %s", int(i), name); - return false; - } - - childData->addChild(elemData); - } - } - - if (!pSource->EndArray(name)) - { - CryLog("Failed to finish array named %s", name); - return false; - } - - data->addChild(childData); - - return true; -} - -bool SaveTable(const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource) -{ - const char* name = definition->getAttr("name"); - if (0 == strlen(name)) - { - CryLog("Child-table has no name"); - return false; - } - - IWriteXMLSourcePtr childSource = pSource->BeginTable(name); - if (!childSource) - { - bool ok = IsOptionalWriteXML(definition); - if (!ok) - { - CryLog("Source creation failed for table %s", name); - } - return ok; - } - - XmlNodeRef childData = data->createNode(name); - - if (!SaveTableInner(idTable, definition, childData, childSource)) - { - CryLog("Failed to load data for child table %s", name); - return false; - } - - if (!pSource->EndTable(name)) - { - CryLog("Table %s failed to complete in sink", name); - return false; - } - - data->addChild(childData); - - return true; -} - -bool SaveSomething(const IdTable& idTable, XmlNodeRef& nodeDefinition, XmlNodeRef& data, IWriteXMLSource* pSource) -{ - static struct - { - const char* name; - SaveDefinitionFunction saver; - } saverTypes[] = { - {"Property", &SaveProperty}, - {"Array", &SaveArray}, - {"Table", &SaveTable}, - {"Use", &SaveReferencedId}, - }; - static const int numSaverTypes = sizeof(saverTypes) / sizeof(*saverTypes); - - const char* nodeDefinitionTag = nodeDefinition->getTag(); - bool ok = false; - int i; - for (i = 0; i < numSaverTypes; i++) - { - if (0 == strcmp(saverTypes[i].name, nodeDefinitionTag)) - { - ok = saverTypes[i].saver(idTable, nodeDefinition, data, pSource); - break; - } - } - if (!ok) - { - if (i == numSaverTypes) - { - CryLog("Invalid definition node type %s", nodeDefinitionTag); - } - } - return ok; -} - -bool SaveReferencedId(const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource) -{ - IdTable::const_iterator iter = idTable.find(definition->getAttr("id")); - if (iter == idTable.end()) - { - CryLog("No definition with id '%s'", definition->getAttr("id")); - return false; - } - XmlNodeRef useDefinition = iter->second; - useDefinition = useDefinition->clone(); - int numAttrs = definition->getNumAttributes(); - for (int i = 0; i < numAttrs; i++) - { - const char* key, * value; - definition->getAttributeByIndex(i, &key, &value); - useDefinition->setAttr(key, value); - } - return SaveSomething(idTable, useDefinition, data, pSource); -} - -bool SaveTableInner(const IdTable& idTable, XmlNodeRef& definition, XmlNodeRef& data, IWriteXMLSource* pSource) -{ - const int nChildrenDefinition = definition->getChildCount(); - for (int nChildDefinition = 0; nChildDefinition < nChildrenDefinition; nChildDefinition++) - { - XmlNodeRef nodeDefinition = definition->getChild(nChildDefinition); - - if (!SaveSomething(idTable, nodeDefinition, data, pSource)) - { - return false; - } - } - return true; -} - -XmlNodeRef CReadWriteXMLSink::CreateXMLFromSource(const char* definitionFile, IWriteXMLSource* pSource) -{ - XmlNodeRef rootDefinition = GetISystem()->LoadXmlFromFile(definitionFile); - if (!rootDefinition) - { - CryLog("Unable to load XML-Lua definition file: %s", definitionFile); - return 0; - } - if (0 != strcmp(rootDefinition->getTag(), "Definition")) - { - CryLog("Root tag of definition file was %s; expected Definition", rootDefinition->getTag()); - return 0; - } - const char* rootNode = "Root"; - if (rootDefinition->haveAttr("root")) - { - rootNode = rootDefinition->getAttr("root"); - } - XmlNodeRef rootData = GetISystem()->CreateXmlNode(rootNode); - - XmlNodeRef allowAlways = rootDefinition->findChild("AllowAlways"); - if (allowAlways != 0) - { - rootDefinition->removeChild(allowAlways); - } - - XmlNodeRef settingsParams = rootDefinition->findChild("Settings"); - if (settingsParams != 0) - { - rootDefinition->removeChild(settingsParams); - } - - // scan for id's in the structure (for the Use member) - IdTable idTable; - std::stack scanStack; - scanStack.push(rootDefinition); - while (!scanStack.empty()) - { - XmlNodeRef refNode = scanStack.top(); - scanStack.pop(); - - int numChildren = refNode->getChildCount(); - const char* tag = refNode->getTag(); - - for (int i = 0; i < numChildren; i++) - { - scanStack.push(refNode->getChild(i)); - } - - if (refNode->haveAttr("id") && 0 != strcmp("Use", tag)) - { - idTable[refNode->getAttr("id")] = refNode; - } - - if (allowAlways != 0 && (!strcmp("Table", tag) || !strcmp("Array", tag))) - { - for (int i = 0; i < allowAlways->getChildCount(); ++i) - { - refNode->addChild(allowAlways->getChild(i)->clone()); - } - } - } - - if (!SaveTableInner(idTable, rootDefinition, rootData, pSource)) - { - CryLog("Error createing xml using definition %s", definitionFile); - return 0; - } - - bool ok = pSource->Complete(); - if (!ok) - { - CryLog("Warning: sink failed to complete writing"); - return 0; - } - - return rootData; -} - -bool CReadWriteXMLSink::WriteXML(const char* definitionFile, const char* dataFile, IWriteXMLSource* pSource) -{ - XmlNodeRef data = CreateXMLFromSource(definitionFile, pSource); - if (!data) - { - CryLog("Failed creating %s", dataFile); - return false; - } - if (!data->saveToFile(dataFile)) - { - CryLog("Failed saving %s", dataFile); - return false; - } - return true; -} diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp b/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp index d209478957..ec154b31e8 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp +++ b/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp @@ -8,8 +8,8 @@ #include +#include "Cry_Color.h" #include "XMLBinaryNode.h" -#include ////////////////////////////////////////////////////////////////////////// CBinaryXmlData::CBinaryXmlData() @@ -38,24 +38,10 @@ CBinaryXmlData::~CBinaryXmlData() pBinaryNodes = 0; } -void CBinaryXmlData::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(pFileContents, nFileSize); - const XMLBinary::BinaryFileHeader* pHeader = reinterpret_cast(pFileContents); - pSizer->AddObject(pBinaryNodes, sizeof(CBinaryXmlNode) * pHeader->nNodeCount); -} - ////////////////////////////////////////////////////////////////////////// // CBinaryXmlNode implementation. ////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////// -// collect allocated memory informations -void CBinaryXmlNode::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(m_pData); -} - ////////////////////////////////////////////////////////////////////////// XmlNodeRef CBinaryXmlNode::getParent() const { @@ -244,21 +230,6 @@ bool CBinaryXmlNode::getAttr(const char* key, Vec4& value) const return false; } -bool CBinaryXmlNode::getAttr(const char* key, Vec3d& value) const -{ - const char* svalue = GetValue(key); - if (svalue) - { - double x, y, z; - if (azsscanf(svalue, "%lf,%lf,%lf", &x, &y, &z) == 3) - { - value = Vec3d(x, y, z); - return true; - } - } - return false; -} - ////////////////////////////////////////////////////////////////////////// bool CBinaryXmlNode::getAttr(const char* key, Vec2& value) const { @@ -275,22 +246,6 @@ bool CBinaryXmlNode::getAttr(const char* key, Vec2& value) const return false; } -////////////////////////////////////////////////////////////////////////// -bool CBinaryXmlNode::getAttr(const char* key, Vec2d& value) const -{ - const char* svalue = GetValue(key); - if (svalue) - { - double x, y; - if (azsscanf(svalue, "%lf,%lf", &x, &y) == 2) - { - value = Vec2d(x, y); - return true; - } - } - return false; -} - ////////////////////////////////////////////////////////////////////////// bool CBinaryXmlNode::getAttr(const char* key, Quat& value) const { diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryNode.h b/Code/Legacy/CrySystem/XML/XMLBinaryNode.h index 34e0ca22ce..855ef8b348 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryNode.h +++ b/Code/Legacy/CrySystem/XML/XMLBinaryNode.h @@ -41,8 +41,6 @@ public: CBinaryXmlData(); ~CBinaryXmlData(); - - void GetMemoryUsage(ICrySizer* pSizer) const; }; // forward declaration @@ -59,9 +57,6 @@ class CBinaryXmlNode { public: - // collect allocated memory informations - void GetMemoryUsage(ICrySizer* pSizer) const; - ////////////////////////////////////////////////////////////////////////// // Custom new/delete with pool allocator. ////////////////////////////////////////////////////////////////////////// @@ -163,11 +158,9 @@ public: void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] float value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] f64 value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec2& value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec2d& value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Ang3& value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec3& value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec4& value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec3d& value) { assert(0); }; void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Quat& value) { assert(0); }; void delAttr([[maybe_unused]] const char* key) { assert(0); }; void removeAllAttributes() { assert(0); }; @@ -182,11 +175,9 @@ public: bool getAttr(const char* key, bool& value) const; bool getAttr(const char* key, XmlString& value) const {const char* v(NULL); bool boHasAttribute(getAttr(key, &v)); value = v; return boHasAttribute; } bool getAttr(const char* key, Vec2& value) const; - bool getAttr(const char* key, Vec2d& value) const; bool getAttr(const char* key, Ang3& value) const; bool getAttr(const char* key, Vec3& value) const; bool getAttr(const char* key, Vec4& value) const; - bool getAttr(const char* key, Vec3d& value) const; bool getAttr(const char* key, Quat& value) const; bool getAttr(const char* key, ColorB& value) const; diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryWriter.cpp b/Code/Legacy/CrySystem/XML/XMLBinaryWriter.cpp index 265953850f..63bf4adef2 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryWriter.cpp +++ b/Code/Legacy/CrySystem/XML/XMLBinaryWriter.cpp @@ -12,40 +12,6 @@ #include "CryEndian.h" #include // memcpy() -////////////////////////////////////////////////////////////////////////// -namespace XMLBinary -{ - void SwapEndianness_Node(Node& t) - { - SwapEndian(t.nTagStringOffset, true); - SwapEndian(t.nContentStringOffset, true); - SwapEndian(t.nAttributeCount, true); - SwapEndian(t.nChildCount, true); - SwapEndian(t.nParentIndex, true); - SwapEndian(t.nFirstAttributeIndex, true); - SwapEndian(t.nFirstChildIndex, true); - } - - void SwapEndianness_Attribute(Attribute& t) - { - SwapEndian(t.nKeyStringOffset, true); - SwapEndian(t.nValueStringOffset, true); - } - - void SwapEndianness_Header(BinaryFileHeader& t) - { - SwapEndian(t.nXMLSize, true); - SwapEndian(t.nNodeTablePosition, true); - SwapEndian(t.nNodeCount, true); - SwapEndian(t.nAttributeTablePosition, true); - SwapEndian(t.nAttributeCount, true); - SwapEndian(t.nChildTablePosition, true); - SwapEndian(t.nChildCount, true); - SwapEndian(t.nStringDataPosition, true); - SwapEndian(t.nStringDataSize, true); - } -} - ////////////////////////////////////////////////////////////////////////// XMLBinary::CXMLBinaryWriter::CXMLBinaryWriter() { @@ -84,7 +50,7 @@ static void write(XMLBinary::IDataWriter* const pFile, size_t& nPosition, const } ////////////////////////////////////////////////////////////////////////// -bool XMLBinary::CXMLBinaryWriter::WriteNode(IDataWriter* pFile, XmlNodeRef node, bool bNeedSwapEndian, XMLBinary::IFilter* pFilter, AZStd::string& error) +bool XMLBinary::CXMLBinaryWriter::WriteNode(IDataWriter* pFile, XmlNodeRef node, XMLBinary::IFilter* pFilter, AZStd::string& error) { error = ""; @@ -135,24 +101,6 @@ bool XMLBinary::CXMLBinaryWriter::WriteNode(IDataWriter* pFile, XmlNodeRef node, header.nXMLSize = static_cast(nTheoreticalPosition); - // Swap endianness of the data structures - if (bNeedSwapEndian) - { - SwapEndianness_Header(header); - for (size_t i = 0, iCount = m_nodes.size(); i < iCount; ++i) - { - SwapEndianness_Node(m_nodes[i]); - } - for (size_t i = 0, iCount = m_attributes.size(); i < iCount; ++i) - { - SwapEndianness_Attribute(m_attributes[i]); - } - for (size_t i = 0, iCount = m_childs.size(); i < iCount; ++i) - { - SwapEndian(m_childs[i], true); - } - } - // Write file { nTheoreticalPosition = 0; diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryWriter.h b/Code/Legacy/CrySystem/XML/XMLBinaryWriter.h index 810a2268c9..4b0d19fe26 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryWriter.h +++ b/Code/Legacy/CrySystem/XML/XMLBinaryWriter.h @@ -25,7 +25,7 @@ namespace XMLBinary { public: CXMLBinaryWriter(); - bool WriteNode(IDataWriter* pFile, XmlNodeRef node, bool bNeedSwapEndian, XMLBinary::IFilter* pFilter, AZStd::string & error); + bool WriteNode(IDataWriter* pFile, XmlNodeRef node, XMLBinary::IFilter* pFilter, AZStd::string & error); private: bool CompileTables(XmlNodeRef node, XMLBinary::IFilter* pFilter, AZStd::string& error); diff --git a/Code/Legacy/CrySystem/XML/XMLPatcher.cpp b/Code/Legacy/CrySystem/XML/XMLPatcher.cpp deleted file mode 100644 index 03c5af92d3..0000000000 --- a/Code/Legacy/CrySystem/XML/XMLPatcher.cpp +++ /dev/null @@ -1,423 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#include "CrySystem_precompiled.h" -#include "XMLPatcher.h" - -CXMLPatcher::CXMLPatcher(XmlNodeRef& patchXML) -{ - m_patchXML = patchXML; - -#if DATA_PATCH_DEBUG - m_pDumpFilesCVar = REGISTER_INT("g_datapatcher_dumpfiles", 0, NULL, "will dump a copy of every file data patched, before and after patching"); -#endif -} - -CXMLPatcher::~CXMLPatcher() -{ -#if DATA_PATCH_DEBUG - if (IConsole* pIC = gEnv->pConsole) - { - pIC->UnregisterVariable(m_pDumpFilesCVar->GetName()); - } -#endif -} - -XmlNodeRef CXMLPatcher::DuplicateForPatching( - const XmlNodeRef& inOrig, - bool inShareChildren) -{ - XmlNodeRef newNode(0); - - if (m_patchXML) - { - newNode = m_patchXML->createNode(inOrig->getTag()); - if (newNode) - { - // copy attributes in a safe way, copyAttributes() itself assumes the node being copied from is of the same type - int numAttr = inOrig->getNumAttributes(); - - for (int i = 0; i < numAttr; i++) - { - const char* pKey, * pValue; - if (inOrig->getAttributeByIndex(i, &pKey, &pValue)) - { - newNode->setAttr(pKey, pValue); - } - } - - if (inShareChildren) - { - newNode->shareChildren(inOrig); - } - } - } - - return newNode; -} - -void CXMLPatcher::PatchFail( - const char* pInReason) -{ - CryLogAlways("Failed to apply data patch for file '%s' - reason '%s'", m_pFileBeingPatched, pInReason); -} - -XmlNodeRef CXMLPatcher::FindPatchForFile( - const char* pInFileToPatch) -{ - XmlNodeRef result; - - if (m_patchXML) - { - for (int i = 0, m = m_patchXML->getChildCount(); i < m; i++) - { - XmlNodeRef child = m_patchXML->getChild(i); - - if (child->isTag("patch")) - { - const char* pForFile = child->getAttr("forfile"); - - if (pForFile && AZ::StringFunc::Find(pForFile, pInFileToPatch) != AZStd::string::npos) - { - result = child; - break; - } - } - } - } - - return result; -} - -XmlNodeRef CXMLPatcher::ApplyPatchToNode( - const XmlNodeRef& inNode, - const XmlNodeRef& inPatch) -{ - XmlNodeRef result = inNode; - - for (int i = 0, m = inPatch->getChildCount(); i < m; i++) - { - XmlNodeRef patchNode = inPatch->getChild(i); - if (!patchNode || _stricmp(patchNode->getTag(), "patchnode") != 0) - { - continue; - } - - int indexToPatch; - if (!patchNode->getAttr("index", indexToPatch)) - { - PatchFail("found patchnode missing index"); - continue; - } - - int maxChildren = result->getChildCount(); - - if ((indexToPatch < 0 || indexToPatch >= maxChildren) && indexToPatch != -1) - { - PatchFail("patchnode index out of valid range"); - continue; - } - - XmlNodeRef childToPatch = (indexToPatch != -1) ? result->getChild(indexToPatch) : XmlNodeRef(0); - XmlNodeRef matchTag = GetMatchTag(patchNode); - - if (childToPatch && matchTag && !CompareTags(matchTag, childToPatch)) - { - PatchFail("patch failed to apply, data did not match what was expected"); - continue; - } - - // we need to apply a patch to this child, make it patchable by duplicating the node - - if (inNode == result) - { - // make parent patchable if not already - result = DuplicateForPatching(inNode, true); - } - - if (XmlNodeRef insertTag = GetInsertTag(patchNode)) - { - // insert a new child after this node - XmlNodeRef newChild = DuplicateForPatching(insertTag, true); // have to duplicate it as we don't have an 'insert shared child' function - result->insertChild(indexToPatch + 1, newChild); - } - else - { - if (indexToPatch == -1) - { - PatchFail("child indices of -1 can only be used when inserting new nodes"); - continue; - } - } - - bool shouldReplaceChildren = false; - - if (XmlNodeRef replaceTag = GetReplaceTag(patchNode, &shouldReplaceChildren)) - { - XmlNodeRef newChild = DuplicateForPatching(replaceTag, false); - - if (!shouldReplaceChildren) - { - newChild->shareChildren(childToPatch); - } - else - { - // note: this is inserting children that belong to the data patcher into the data being patched - // this is fine to do, as long as the caller doesn't make any permanent changes to the xml tree - // returned. if they did they would alter the patcher's nodes and thus affect future patches - // applied using the same patch - // as most callers are working with binary xmls they don't try and modify them - as this is not - // a supported operation - // note, if a second patch was applied to this patched tree containing the patch nodes, it - // wouldn't mess up the patch, as patching a tree never modifies it, it always returns a new tree - // that may share parts of the original tree - newChild->shareChildren(replaceTag); - } - - result->replaceChild(indexToPatch, newChild); - - childToPatch = newChild; - } - - if (XmlNodeRef deleteTag = GetDeleteTag(patchNode)) - { - result->deleteChildAt(indexToPatch); - childToPatch = 0; // deleted - don't recurse into it - } - - if (childToPatch) - { - // Apply recursively - XmlNodeRef newChild = ApplyPatchToNode(childToPatch, patchNode); - - // child has been patched, insert new child into parent - if (newChild != childToPatch) - { - result->replaceChild(indexToPatch, newChild); - } - } - } - - return result; -} - -XmlNodeRef CXMLPatcher::ApplyXMLDataPatch( - const XmlNodeRef& inNode, - const char* pInXMLFileName) -{ - XmlNodeRef result = inNode; - - if (m_patchingEnabled) - { - if (m_patchXML) - { - XmlNodeRef patchForFile = FindPatchForFile(pInXMLFileName); - if (patchForFile) - { - m_pFileBeingPatched = pInXMLFileName; - CryLog("Applying game data patch to %s", pInXMLFileName); - XmlNodeRef containerNode = m_patchXML->createNode(""); - containerNode->addChild(inNode); - containerNode = ApplyPatchToNode(containerNode, patchForFile); - result = containerNode->getChild(0); - m_pFileBeingPatched = NULL; - -#if DATA_PATCH_DEBUG - if (inNode != result) - { - DumpFiles(pInXMLFileName, inNode, result); - } -#endif - } - } - } - - return result; -} - -XmlNodeRef CXMLPatcher::GetMatchTag( - const XmlNodeRef& inNode) -{ - XmlNodeRef result; - XmlNodeRef nr = inNode->findChild("match"); - if (nr && nr->getChildCount() == 1) - { - result = nr->getChild(0); - } - return result; -} - -XmlNodeRef CXMLPatcher::GetReplaceTag( - const XmlNodeRef& inNode, - bool* outShouldReplaceChildren) -{ - XmlNodeRef result; - XmlNodeRef nr = inNode->findChild("replacewith"); - if (nr && nr->getChildCount() == 1) - { - if (!nr->getAttr("replaceChildren", *outShouldReplaceChildren)) - { - *outShouldReplaceChildren = false; - } - result = nr->getChild(0); - } - return result; -} - - -XmlNodeRef CXMLPatcher::GetInsertTag( - const XmlNodeRef& inNode) -{ - XmlNodeRef result; - XmlNodeRef nr = inNode->findChild("insertAfter"); - if (nr && nr->getChildCount() == 1) - { - result = nr->getChild(0); - } - return result; -} - -XmlNodeRef CXMLPatcher::GetDeleteTag( - const XmlNodeRef& inNode) -{ - XmlNodeRef result = inNode->findChild("delete"); - return result; -} - -// compares the two tags for equality of tag and attributes -// used to ensure the source data being patched meets the patches expectations -// only compares tag and attribs, doesn't do deep compare of children -bool CXMLPatcher::CompareTags( - const XmlNodeRef& inA, - const XmlNodeRef& inB) -{ - bool result = true; - - if (inA != inB) - { - result = false; - - if (_stricmp(inA->getTag(), inB->getTag()) == 0) - { - if (inA->getNumAttributes() == inB->getNumAttributes()) - { - result = true; - - for (int i = 0, m = inA->getNumAttributes(); i < m; i++) - { - const char* pAKey, * pBKey; - const char* pAValue, * pBValue; - - inA->getAttributeByIndex(i, &pAKey, &pAValue); - inB->getAttributeByIndex(i, &pBKey, &pBValue); - - if (_stricmp(pAKey, pBKey) || _stricmp(pAValue, pBValue)) - { - result = false; - break; - } - } - } - } - } - - return result; -} - -#if DATA_PATCH_DEBUG - -static const char* k_lotsOfTabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t"; - -#define INDENT() \ - if (inIndent > 0) \ - { \ - pPak->FWrite(k_lotsOfTabs, inIndent, inFileHandle); \ - } - -void CXMLPatcher::DumpXMLNodes( - AZ::IO::HandleType inFileHandle, - int inIndent, - const XmlNodeRef& inNode, - AZStd::fixed_string<512>* ioTempString) -{ - auto pPak = gEnv->pCryPak; - - inIndent = min(inIndent, int(sizeof(k_lotsOfTabs) - 1)); - - INDENT(); - - *ioTempString = AZStd::fixed_string<512>::format("<%s ", inNode->getTag()); - - pPak->FWrite(ioTempString->c_str(), ioTempString->length(), inFileHandle); - - for (int i = 0, m = inNode->getNumAttributes(); i < m; i++) - { - const char* pKey, * pVal; - inNode->getAttributeByIndex(i, &pKey, &pVal); - *ioTempString = AZStd::fixed_string<512>::format("%s=\"%s\" ", pKey, pVal); - pPak->FWrite(ioTempString->c_str(), ioTempString->length(), inFileHandle); - } - pPak->FWrite(">\n", 2, inFileHandle); - - for (int i = 0, m = inNode->getChildCount(); i < m; i++) - { - DumpXMLNodes(inFileHandle, inIndent + 1, inNode->getChild(i), ioTempString); - } - - INDENT(); - *ioTempString = AZStd::fixed_string<512>::format("\n", inNode->getTag()); - pPak->FWrite(ioTempString->c_str(), ioTempString->length(), inFileHandle); -} - - -void CXMLPatcher::DumpFiles( - const char* pInXMLFileName, - const XmlNodeRef& inBefore, - const XmlNodeRef& inAfter) -{ - if (m_pDumpFilesCVar->GetIVal()) - { - CryLog("Dumping before and after data files for '%s'", pInXMLFileName); - - const char* pOrigFileName = strrchr(pInXMLFileName, '/'); - if (pOrigFileName) - { - pOrigFileName++; - - DumpXMLFile(AZStd::string::format("PATCH_%s", pOrigFileName).c_str(), inBefore); - - AZStd::string newFileName(pOrigFileName); - AZ::StringFunc::Replace(newFileName, ".xml", "_patched.xml"); - - DumpXMLFile(AZStd::string::format("PATCH_%s", newFileName.c_str()).c_str(), inAfter); - } - else - { - CryLog("Couldn't determine file name for path '%s' can't output diffs", pInXMLFileName); - } - } -} - -void CXMLPatcher::DumpXMLFile( - const char* pInFilePath, - const XmlNodeRef& inNode) -{ - auto pIPak = GetISystem()->GetIPak(); - AZ::IO::HandleType fileHandle = pIPak->FOpen(pInFilePath, "wb"); - - if (fileHandle != AZ::IO::InvalidHandle) - { - AZStd::fixed_string<512> tempStr; - - DumpXMLNodes(fileHandle, 0, inNode, &tempStr); - - pIPak->FClose(fileHandle); - } -} -#endif diff --git a/Code/Legacy/CrySystem/XML/XMLPatcher.h b/Code/Legacy/CrySystem/XML/XMLPatcher.h deleted file mode 100644 index ccc5f481eb..0000000000 --- a/Code/Legacy/CrySystem/XML/XMLPatcher.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYSYSTEM_XML_XMLPATCHER_H -#define CRYINCLUDE_CRYSYSTEM_XML_XMLPATCHER_H -#pragma once - - -#if defined(WIN32) && !defined(_RELEASE) -#define DATA_PATCH_DEBUG 1 -#else -#define DATA_PATCH_DEBUG 0 -#endif - -class CXMLPatcher -{ -protected: -#if DATA_PATCH_DEBUG - ICVar * m_pDumpFilesCVar; -#endif - - XmlNodeRef m_patchXML; - const char* m_pFileBeingPatched; - bool m_patchingEnabled; - - void PatchFail( - const char* pInReason); - XmlNodeRef ApplyPatchToNode( - const XmlNodeRef& inNode, - const XmlNodeRef& inPatch); - - XmlNodeRef DuplicateForPatching( - const XmlNodeRef& inOrig, - bool inShareChildren); - - bool CompareTags( - const XmlNodeRef& inA, - const XmlNodeRef& inB); - XmlNodeRef GetMatchTag( - const XmlNodeRef& inNode); - XmlNodeRef GetReplaceTag( - const XmlNodeRef& inNode, - bool* outShouldReplaceChildren); - XmlNodeRef GetInsertTag( - const XmlNodeRef& inNode); - XmlNodeRef GetDeleteTag( - const XmlNodeRef& inNode); - XmlNodeRef FindPatchForFile( - const char* pInFileToPatch); - -#if DATA_PATCH_DEBUG - void DumpXMLNodes( - AZ::IO::HandleType inFileHandle, - int inIndent, - const XmlNodeRef& inNode, - AZStd::fixed_string<512>* ioTempString); - void DumpFiles( - const char* pInXMLFileName, - const XmlNodeRef& inBefore, - const XmlNodeRef& inAfter); - void DumpXMLFile( - const char* pInFilePath, - const XmlNodeRef& inNode); -#endif - -public: - CXMLPatcher(XmlNodeRef& patchXML); - ~CXMLPatcher(); - - XmlNodeRef ApplyXMLDataPatch( - const XmlNodeRef& inNode, - const char* pInXMLFileName); -}; - -#endif // CRYINCLUDE_CRYSYSTEM_XML_XMLPATCHER_H diff --git a/Code/Legacy/CrySystem/XML/XmlUtils.cpp b/Code/Legacy/CrySystem/XML/XmlUtils.cpp index 56944eb344..0afa5e19db 100644 --- a/Code/Legacy/CrySystem/XML/XmlUtils.cpp +++ b/Code/Legacy/CrySystem/XML/XmlUtils.cpp @@ -11,7 +11,6 @@ #include #include "xml.h" #include "XmlUtils.h" -#include "ReadWriteXMLSink.h" #include "../SimpleStringPool.h" #include "SerializeXMLReader.h" @@ -20,7 +19,6 @@ #include "XMLBinaryWriter.h" #include "XMLBinaryReader.h" -#include "XMLPatcher.h" #include ////////////////////////////////////////////////////////////////////////// @@ -28,23 +26,14 @@ SXmlNodeStats* g_pCXmlNode_Stats = 0; #endif -extern bool g_bEnableBinaryXmlLoading; - ////////////////////////////////////////////////////////////////////////// CXmlUtils::CXmlUtils(ISystem* pSystem) { m_pSystem = pSystem; - // create IReadWriteXMLSink object - m_pReadWriteXMLSink = new CReadWriteXMLSink(); #ifdef CRY_COLLECT_XML_NODE_STATS g_pCXmlNode_Stats = new SXmlNodeStats(); #endif - m_pStatsXmlNodePool = 0; -#ifndef _RELEASE - m_statsThreadOwner = CryGetCurrentThreadId(); -#endif - m_pXMLPatcher = NULL; } ////////////////////////////////////////////////////////////////////////// @@ -53,8 +42,6 @@ CXmlUtils::~CXmlUtils() #ifdef CRY_COLLECT_XML_NODE_STATS delete g_pCXmlNode_Stats; #endif - SAFE_DELETE(m_pStatsXmlNodePool); - SAFE_DELETE(m_pXMLPatcher); } ////////////////////////////////////////////////////////////////////////// @@ -65,21 +52,13 @@ IXmlParser* CXmlUtils::CreateXmlParser() } ////////////////////////////////////////////////////////////////////////// -XmlNodeRef CXmlUtils::LoadXmlFromFile(const char* sFilename, bool bReuseStrings, bool bEnablePatching) +XmlNodeRef CXmlUtils::LoadXmlFromFile(const char* sFilename, bool bReuseStrings) { - XmlParser parser(bReuseStrings); - XmlNodeRef node = parser.ParseFile(sFilename, true); - // XmlParser is supposed to log warnings and errors (if any), // so we don't need to call parser.getErrorString(), // CryLog() etc here. - - if (node && bEnablePatching && m_pXMLPatcher) - { - node = m_pXMLPatcher->ApplyXMLDataPatch(node, sFilename); - } - - return node; + XmlParser parser(bReuseStrings); + return parser.ParseFile(sFilename, true); } ////////////////////////////////////////////////////////////////////////// @@ -99,29 +78,6 @@ void GetMD5(const char* pSrcBuffer, int nSrcSize, char signatureMD5[16]) MD5Final((unsigned char*)signatureMD5, &md5c); } -////////////////////////////////////////////////////////////////////////// -const char* CXmlUtils::HashXml(XmlNodeRef node) -{ - static char signature[16 * 2 + 1]; - static char temp[16]; - static const char* hex = "0123456789abcdef"; - XmlString str = node->getXML(); - GetMD5(str.data(), static_cast(str.length()), temp); - for (int i = 0; i < 16; i++) - { - signature[2 * i + 0] = hex[((uint8)temp[i]) >> 4]; - signature[2 * i + 1] = hex[((uint8)temp[i]) & 0xf]; - } - signature[16 * 2] = 0; - return signature; -} - -////////////////////////////////////////////////////////////////////////// -IReadWriteXMLSink* CXmlUtils::GetIReadWriteXMLSink() -{ - return m_pReadWriteXMLSink; -} - ////////////////////////////////////////////////////////////////////////// class CXmlSerializer : public IXmlSerializer @@ -172,12 +128,6 @@ public: return m_pReaderSer; } - virtual void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->Add(*this); - pSizer->AddObject(m_pReaderImpl); - pSizer->AddObject(m_pWriterImpl); - } ////////////////////////////////////////////////////////////////////////// private: int m_nRefCount; @@ -194,62 +144,6 @@ IXmlSerializer* CXmlUtils::CreateXmlSerializer() return new CXmlSerializer; } -////////////////////////////////////////////////////////////////////////// -void CXmlUtils::GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) -{ -#ifdef CRY_COLLECT_XML_NODE_STATS - // yes, slow - std::vector rootNodes; - { - TXmlNodeSet::const_iterator iter = g_pCXmlNode_Stats->nodeSet.begin(); - TXmlNodeSet::const_iterator iterEnd = g_pCXmlNode_Stats->nodeSet.end(); - while (iter != iterEnd) - { - const CXmlNode* pNode = *iter; - if (pNode->getParent() == 0) - { - rootNodes.push_back(pNode); - } - ++iter; - } - } - - // use the following to log to console -#if 0 - CryLogAlways("NumXMLRootNodes=%d NumXMLNodes=%d TotalAllocs=%d TotalFrees=%d", - rootNodes.size(), g_pCXmlNode_Stats->nodeSet.size(), - g_pCXmlNode_Stats->nAllocs, g_pCXmlNode_Stats->nFrees); -#endif - - - // use the following to debug the nodes in the system -#if 0 - { - std::vector::const_iterator iter = rootNodes.begin(); - std::vector::const_iterator iterEnd = rootNodes.end(); - while (iter != iterEnd) - { - const CXmlNode* pNode = *iter; - CryLogAlways("Node 0x%p Tag='%s'", pNode, pNode->getTag()); - ++iter; - } - } -#endif - - // only for debugging, add it as pseudo numbers to the CrySizer. - // shift it by 10, so we get the actual number - { - SIZER_COMPONENT_NAME(pSizer, "#NumTotalNodes"); - pSizer->Add("#NumTotalNodes", g_pCXmlNode_Stats->nodeSet.size() << 10); - } - - { - SIZER_COMPONENT_NAME(pSizer, "#NumRootNodes"); - pSizer->Add("#NumRootNodes", rootNodes.size() << 10); - } -#endif -} - ////////////////////////////////////////////////////////////////////////// class CXmlBinaryDataWriterFile : public XMLBinary::IDataWriter @@ -282,49 +176,13 @@ private: AZ::IO::HandleType m_fileHandle; }; -////////////////////////////////////////////////////////////////////////// -bool CXmlUtils::SaveBinaryXmlFile(const char* filename, XmlNodeRef root) -{ - CXmlBinaryDataWriterFile fileSink(filename); - if (!fileSink.IsOk()) - { - return false; - } - XMLBinary::CXMLBinaryWriter writer; - AZStd::string error; - return writer.WriteNode(&fileSink, root, false, 0, error); -} - -////////////////////////////////////////////////////////////////////////// -XmlNodeRef CXmlUtils::LoadBinaryXmlFile(const char* filename, bool bEnablePatching) -{ - XMLBinary::XMLBinaryReader reader; - XMLBinary::XMLBinaryReader::EResult result; - XmlNodeRef root = reader.LoadFromFile(filename, result); - - if (result == XMLBinary::XMLBinaryReader::eResult_Success && bEnablePatching == true && m_pXMLPatcher != NULL) - { - root = m_pXMLPatcher->ApplyXMLDataPatch(root, filename); - } - - return root; -} - -////////////////////////////////////////////////////////////////////////// -bool CXmlUtils::EnableBinaryXmlLoading(bool bEnable) -{ - bool bPrev = g_bEnableBinaryXmlLoading; - g_bEnableBinaryXmlLoading = bEnable; - return bPrev; -} - ////////////////////////////////////////////////////////////////////////// class CXmlTableReader : public IXmlTableReader { public: CXmlTableReader(); - virtual ~CXmlTableReader(); + ~CXmlTableReader() override; virtual void Release(); @@ -332,7 +190,6 @@ public: virtual int GetEstimatedRowCount(); virtual bool ReadRow(int& rowIndex); virtual bool ReadCell(int& columnIndex, const char*& pContent, size_t& contentSize); - float GetCurrentRowHeight() override; private: bool m_bExcel; @@ -341,7 +198,6 @@ private: XmlNodeRef m_rowNode; - float m_currentRowHeight; int m_rowNodeIndex; int m_row; @@ -411,7 +267,6 @@ int CXmlTableReader::GetEstimatedRowCount() ////////////////////////////////////////////////////////////////////////// bool CXmlTableReader::ReadRow(int& rowIndex) { - m_currentRowHeight = 0.0f; if (!m_tableNode) { return false; @@ -459,12 +314,6 @@ bool CXmlTableReader::ReadRow(int& rowIndex) } m_row = index; } - float height; - if (m_rowNode->getAttr("ss:Height", height)) - { - m_currentRowHeight = height; - } - rowIndex = m_row; return true; } @@ -617,75 +466,8 @@ bool CXmlTableReader::ReadCell(int& columnIndex, const char*& pContent, size_t& } } -float CXmlTableReader::GetCurrentRowHeight() -{ - return m_currentRowHeight; -} ////////////////////////////////////////////////////////////////////////// IXmlTableReader* CXmlUtils::CreateXmlTableReader() { return new CXmlTableReader; } - -////////////////////////////////////////////////////////////////////////// -// Init xml stats nodes pool -void CXmlUtils::InitStatsXmlNodePool(uint32 nPoolSize) -{ - CHECK_STATS_THREAD_OWNERSHIP(); - if (0 == m_pStatsXmlNodePool) - { - // create special xml node pools for game statistics - - const bool bReuseStrings = true; // TODO parameterise? - m_pStatsXmlNodePool = new CXmlNodePool(nPoolSize, bReuseStrings); - assert(m_pStatsXmlNodePool); - } - else - { - CryLog("[CXmlNodePool]: Xml stats nodes pool already initialized"); - } -} - -////////////////////////////////////////////////////////////////////////// -// Creates new xml node for statistics. -XmlNodeRef CXmlUtils::CreateStatsXmlNode(const char* sNodeName) -{ - CHECK_STATS_THREAD_OWNERSHIP(); - if (0 == m_pStatsXmlNodePool) - { - CryLog("[CXmlNodePool]: Xml stats nodes pool isn't initialized. Perform default initialization."); - InitStatsXmlNodePool(); - } - return m_pStatsXmlNodePool->GetXmlNode(sNodeName); -} - -void CXmlUtils::SetStatsOwnerThread([[maybe_unused]] threadID threadId) -{ -#ifndef _RELEASE - m_statsThreadOwner = threadId; -#endif -} - -void CXmlUtils::FlushStatsXmlNodePool() -{ - CHECK_STATS_THREAD_OWNERSHIP(); - if (m_pStatsXmlNodePool) - { - if (m_pStatsXmlNodePool->empty()) - { - SAFE_DELETE(m_pStatsXmlNodePool); - } - } -} - -void CXmlUtils::SetXMLPatcher(XmlNodeRef* pPatcher) -{ - SAFE_DELETE(m_pXMLPatcher); - - if (pPatcher != NULL) - { - m_pXMLPatcher = new CXMLPatcher(*pPatcher); - } -} - - diff --git a/Code/Legacy/CrySystem/XML/XmlUtils.h b/Code/Legacy/CrySystem/XML/XmlUtils.h index d81dc4b642..b9d1c87554 100644 --- a/Code/Legacy/CrySystem/XML/XmlUtils.h +++ b/Code/Legacy/CrySystem/XML/XmlUtils.h @@ -20,7 +20,6 @@ #endif class CXmlNodePool; -class CXMLPatcher; ////////////////////////////////////////////////////////////////////////// // Implements IXmlUtils interface. @@ -39,57 +38,17 @@ public: virtual IXmlParser* CreateXmlParser(); // Load xml from file, returns 0 if load failed. - virtual XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false, bool bEnablePatching = true); + virtual XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false); // Load xml from memory buffer, returns 0 if load failed. virtual XmlNodeRef LoadXmlFromBuffer(const char* buffer, size_t size, bool bReuseStrings = false, bool bSuppressWarnings = false); - // create an MD5 hash of an XML file - virtual const char* HashXml(XmlNodeRef node); - - // Get an object that can read a xml into a IReadXMLSink - // and write a xml from a IWriteXMLSource - virtual IReadWriteXMLSink* GetIReadWriteXMLSink(); - virtual IXmlSerializer* CreateXmlSerializer(); - virtual bool SaveBinaryXmlFile(const char* sFilename, XmlNodeRef root); - virtual XmlNodeRef LoadBinaryXmlFile(const char* sFilename, bool bEnablePatching = true); - - virtual bool EnableBinaryXmlLoading(bool bEnable); - // Create XML Table reader. virtual IXmlTableReader* CreateXmlTableReader(); ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - virtual void GetMemoryUsage(ICrySizer* pSizer); - - ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - // Init xml stats nodes pool - virtual void InitStatsXmlNodePool(uint32 nPoolSize = 1024*1024); - - // Create new xml node for statistics - virtual XmlNodeRef CreateStatsXmlNode(const char* sNodeName = ""); - - // Set owner thread - virtual void SetStatsOwnerThread(threadID threadId); - - // Free memory if stats xml node pool is empty - virtual void FlushStatsXmlNodePool(); - - // Set the XML Patcher. This is an XML object that modifies named XML files as they are loaded - // EXCEPT for xml files loaded from a buffer, for which names aren't passed in - virtual void SetXMLPatcher(XmlNodeRef* pPatcher); - private: ISystem* m_pSystem; - IReadWriteXMLSink* m_pReadWriteXMLSink; - CXmlNodePool* m_pStatsXmlNodePool; - CXMLPatcher* m_pXMLPatcher; //If set, applies data patches to any XML file that is loaded by this class -#ifndef _RELEASE - threadID m_statsThreadOwner; -#endif }; #endif // CRYINCLUDE_CRYSYSTEM_XML_XMLUTILS_H diff --git a/Code/Legacy/CrySystem/XML/xml.cpp b/Code/Legacy/CrySystem/XML/xml.cpp index cc3ea7f820..b1f18142f1 100644 --- a/Code/Legacy/CrySystem/XML/xml.cpp +++ b/Code/Legacy/CrySystem/XML/xml.cpp @@ -9,8 +9,6 @@ #include "CrySystem_precompiled.h" -//#define _CRT_SECURE_NO_DEPRECATE 1 -//#define _CRT_NONSTDC_NO_DEPRECATE #include #define XML_STATIC // Alternative to defining this here would be setting it project-wide @@ -19,6 +17,7 @@ #include #include #include +#include #include "XMLBinaryReader.h" #define FLOAT_FMT "%.8g" @@ -77,7 +76,6 @@ static int __cdecl ascii_stricmp(const char* dst, const char* src) ////////////////////////////////////////////////////////////////////////// XmlStrCmpFunc g_pXmlStrCmp = &ascii_stricmp; -bool g_bEnableBinaryXmlLoading = true; ////////////////////////////////////////////////////////////////////////// class CXmlStringData @@ -113,10 +111,6 @@ public: void Clear() { m_stringPool.Clear(); } void SetBlockSize(unsigned int nBlockSize) { m_stringPool.SetBlockSize(nBlockSize); } - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(m_stringPool); - } private: CSimpleStringPool m_stringPool; }; @@ -174,23 +168,6 @@ CXmlNode::CXmlNode(const char* tag, bool bReuseStrings, bool bIsProcessingInstru m_tag = m_pStringPool->AddString(tag); } -////////////////////////////////////////////////////////////////////////// -// collect allocated memory informations -void CXmlNode::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_pStringPool); - - if (m_pChilds) - { - pSizer->AddObject(*m_pChilds); - } - if (m_pAttributes) - { - pSizer->AddContainer(*m_pAttributes); - } -} - ////////////////////////////////////////////////////////////////////////// XmlNodeRef CXmlNode::createNode(const char* tag) { @@ -378,13 +355,6 @@ void CXmlNode::setAttr(const char* key, const Vec4& value) setAttr(key, str); } -void CXmlNode::setAttr(const char* key, const Vec3d& value) -{ - char str[128]; - SCOPED_LOCALE_RESETTER; - sprintf_s(str, DOUBLE_FMT "," DOUBLE_FMT "," DOUBLE_FMT, value.x, value.y, value.z); - setAttr(key, str); -} void CXmlNode::setAttr(const char* key, const Vec2& value) { char str[128]; @@ -392,13 +362,6 @@ void CXmlNode::setAttr(const char* key, const Vec2& value) sprintf_s(str, FLOAT_FMT "," FLOAT_FMT, value.x, value.y); setAttr(key, str); } -void CXmlNode::setAttr(const char* key, const Vec2d& value) -{ - char str[128]; - SCOPED_LOCALE_RESETTER; - sprintf_s(str, DOUBLE_FMT "," DOUBLE_FMT, value.x, value.y); - setAttr(key, str); -} void CXmlNode::setAttr(const char* key, const Quat& value) { @@ -557,22 +520,6 @@ bool CXmlNode::getAttr(const char* key, Vec4& value) const return false; } -bool CXmlNode::getAttr(const char* key, Vec3d& value) const -{ - const char* svalue = GetValue(key); - if (svalue) - { - SCOPED_LOCALE_RESETTER; - double x, y, z; - if (azsscanf(svalue, "%lf,%lf,%lf", &x, &y, &z) == 3) - { - value = Vec3d(x, y, z); - return true; - } - } - return false; -} - ////////////////////////////////////////////////////////////////////////// bool CXmlNode::getAttr(const char* key, Vec2& value) const { @@ -590,22 +537,6 @@ bool CXmlNode::getAttr(const char* key, Vec2& value) const return false; } -bool CXmlNode::getAttr(const char* key, Vec2d& value) const -{ - const char* svalue = GetValue(key); - if (svalue) - { - SCOPED_LOCALE_RESETTER; - double x, y; - if (azsscanf(svalue, "%lf,%lf", &x, &y) == 2) - { - value = Vec2d(x, y); - return true; - } - } - return false; -} - ////////////////////////////////////////////////////////////////////////// bool CXmlNode::getAttr(const char* key, Quat& value) const { @@ -1369,14 +1300,6 @@ public: // Add new string to pool. const char* AddString(const char* str) { return m_stringPool.Append(str, (int)strlen(str)); } - //char* AddString( const char *str ) { return (char*)str; } - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_stringPool); - pSizer->AddObject(m_nodeStack); - } protected: void onStartElement(const char* tagName, const char** atts); void onEndElement(const char* tagName); @@ -1410,12 +1333,6 @@ protected: { XmlNodeRef node; std::vector childs; //TODO: is it worth lazily initializing this, like CXmlNode::m_pChilds? - - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(node); - pSizer->AddObject(childs); - } }; // First node will become root node. @@ -1735,38 +1652,35 @@ XmlNodeRef XmlParserImp::ParseFile(const char* filename, XmlString& errorString, AZStd::replace(pakPath.begin(), pakPath.end(), '\\', '/'); } - if (g_bEnableBinaryXmlLoading) + XMLBinary::XMLBinaryReader reader; + XMLBinary::XMLBinaryReader::EResult result; + root = reader.LoadFromBuffer(XMLBinary::XMLBinaryReader::eBufferMemoryHandling_TakeOwnership, pFileContents, fileSize, result); + if (root) { - XMLBinary::XMLBinaryReader reader; - XMLBinary::XMLBinaryReader::EResult result; - root = reader.LoadFromBuffer(XMLBinary::XMLBinaryReader::eBufferMemoryHandling_TakeOwnership, pFileContents, fileSize, result); - if (root) + return root; + } + if (result != XMLBinary::XMLBinaryReader::eResult_NotBinXml) + { + delete [] pFileContents; + sprintf_s(str, "%s%s (%s)", errorPrefix, reader.GetErrorDescription(), filename); + errorString = str; + CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "%s", str); + return 0; + } + else + { + // not binary XML - refuse to load if in scripts dir and not in bin xml to help reduce hacking + // wish we could compile the text xml parser out, but too much work to get everything moved over + constexpr AZStd::fixed_string<32> strScripts{"Scripts/"}; + // exclude files and PAKs from Mods folder + constexpr AZStd::fixed_string<8> modsStr{"Mods/"}; + if (_strnicmp(filename, strScripts.c_str(), strScripts.length()) == 0 && + _strnicmp(adjustedFilename.c_str(), modsStr.c_str(), modsStr.length()) != 0 && + _strnicmp(pakPath.c_str(), modsStr.c_str(), modsStr.length()) != 0) { - return root; - } - if (result != XMLBinary::XMLBinaryReader::eResult_NotBinXml) - { - delete [] pFileContents; - sprintf_s(str, "%s%s (%s)", errorPrefix, reader.GetErrorDescription(), filename); - errorString = str; - CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "%s", str); - return 0; - } - else - { - // not binary XML - refuse to load if in scripts dir and not in bin xml to help reduce hacking - // wish we could compile the text xml parser out, but too much work to get everything moved over - constexpr AZStd::fixed_string<32> strScripts{"Scripts/"}; - // exclude files and PAKs from Mods folder - constexpr AZStd::fixed_string<8> modsStr{"Mods/"}; - if (_strnicmp(filename, strScripts.c_str(), strScripts.length()) == 0 && - _strnicmp(adjustedFilename.c_str(), modsStr.c_str(), modsStr.length()) != 0 && - _strnicmp(pakPath.c_str(), modsStr.c_str(), modsStr.length()) != 0) - { #ifdef _RELEASE CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "Non binary XML found in scripts dir (%s)", filename); #endif - } } } @@ -1806,12 +1720,6 @@ XmlParser::~XmlParser() m_pImpl->Release(); } -void XmlParser::GetMemoryUsage(ICrySizer* pSizer) const -{ - pSizer->AddObject(this, sizeof(*this)); - pSizer->AddObject(m_pImpl); -} - ////////////////////////////////////////////////////////////////////////// XmlNodeRef XmlParser::ParseBuffer(const char* buffer, int nBufLen, bool bCleanPools, bool bSuppressWarnings) { diff --git a/Code/Legacy/CrySystem/XML/xml.h b/Code/Legacy/CrySystem/XML/xml.h index 912767eae7..f4bf6b2969 100644 --- a/Code/Legacy/CrySystem/XML/xml.h +++ b/Code/Legacy/CrySystem/XML/xml.h @@ -34,7 +34,6 @@ public: } }; virtual const char* AddString(const char* str) = 0; - virtual void GetMemoryUsage(ICrySizer* pSizer) const = 0; private: int m_refCount; }; @@ -68,8 +67,6 @@ public: const char* getErrorString() const { return m_errorString; } - void GetMemoryUsage(ICrySizer* pSizer) const; - private: int m_nRefCount; XmlString m_errorString; @@ -88,8 +85,6 @@ struct XmlAttribute const char* key; const char* value; - void GetMemoryUsage([[maybe_unused]] ICrySizer* pSizer) const{} - bool operator<(const XmlAttribute& attr) const { return g_pXmlStrCmp(key, attr.key) < 0; } bool operator>(const XmlAttribute& attr) const { return g_pXmlStrCmp(key, attr.key) > 0; } bool operator==(const XmlAttribute& attr) const { return g_pXmlStrCmp(key, attr.key) == 0; } @@ -119,9 +114,6 @@ public: //! Destructor. ~CXmlNode(); - // collect allocated memory informations - void GetMemoryUsage(ICrySizer* pSizer) const; - ////////////////////////////////////////////////////////////////////////// // Custom new/delete with pool allocator. ////////////////////////////////////////////////////////////////////////// @@ -219,11 +211,9 @@ public: void setAttr(const char* key, float value); void setAttr(const char* key, double value); void setAttr(const char* key, const Vec2& value); - void setAttr(const char* key, const Vec2d& value); void setAttr(const char* key, const Ang3& value); void setAttr(const char* key, const Vec3& value); void setAttr(const char* key, const Vec4& value); - void setAttr(const char* key, const Vec3d& value); void setAttr(const char* key, const Quat& value); //! Delete attrbute. @@ -243,11 +233,9 @@ public: bool getAttr(const char* key, XmlString& value) const {const char* v(NULL); bool boHasAttribute(getAttr(key, &v)); value = v; return boHasAttribute; } bool getAttr(const char* key, Vec2& value) const; - bool getAttr(const char* key, Vec2d& value) const; bool getAttr(const char* key, Ang3& value) const; bool getAttr(const char* key, Vec3& value) const; bool getAttr(const char* key, Vec4& value) const; - bool getAttr(const char* key, Vec3d& value) const; bool getAttr(const char* key, Quat& value) const; bool getAttr(const char* key, ColorB& value) const; diff --git a/Code/Legacy/CrySystem/XML/xml_string.h b/Code/Legacy/CrySystem/XML/xml_string.h deleted file mode 100644 index 5973143509..0000000000 --- a/Code/Legacy/CrySystem/XML/xml_string.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - - -#ifndef CRYINCLUDE_CRYSYSTEM_XML_XML_STRING_H -#define CRYINCLUDE_CRYSYSTEM_XML_XML_STRING_H -#pragma once - - -typedef string xml_string; - -#endif // CRYINCLUDE_CRYSYSTEM_XML_XML_STRING_H diff --git a/Code/Legacy/CrySystem/crysystem_files.cmake b/Code/Legacy/CrySystem/crysystem_files.cmake index ac0fd7989c..fc923705f2 100644 --- a/Code/Legacy/CrySystem/crysystem_files.cmake +++ b/Code/Legacy/CrySystem/crysystem_files.cmake @@ -23,7 +23,6 @@ set(FILES Timer.cpp XConsole.cpp XConsoleVariable.cpp - XML/ReadWriteXMLSink.h AZCrySystemInitLogSink.h AZCoreLogSink.h CmdLine.h @@ -36,7 +35,6 @@ set(FILES SimpleStringPool.h CrySystem_precompiled.h System.h - SystemCFG.h SystemEventDispatcher.h Timer.h XConsole.h @@ -44,16 +42,11 @@ set(FILES XML/SerializeXMLReader.cpp XML/SerializeXMLWriter.cpp XML/xml.cpp - XML/XMLPatcher.cpp XML/XmlUtils.cpp XML/SerializeXMLReader.h XML/SerializeXMLWriter.h XML/xml.h - XML/XMLPatcher.h - XML/xml_string.h XML/XmlUtils.h - XML/ReadXMLSink.cpp - XML/WriteXMLSource.cpp LocalizedStringManager.cpp LocalizedStringManager.h Huffman.cpp diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h index 6d361c01ae..8862462093 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h @@ -82,7 +82,6 @@ namespace AZ FontFamilyPtr LoadFontFamily(const char* fontFamilyName) override; FontFamilyPtr GetFontFamily(const char* fontFamilyName) override; void AddCharsToFontTextures(FontFamilyPtr fontFamily, const char* chars, int glyphSizeX = ICryFont::defaultGlyphSizeX, int glyphSizeY = ICryFont::defaultGlyphSizeY) override; - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const override {} AZStd::string GetLoadedFontNames() const; void OnLanguageChanged() override; void ReloadAllFonts() override; diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomNullFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomNullFont.h index 4820d1c176..b394efe6e1 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomNullFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomNullFont.h @@ -44,8 +44,6 @@ namespace AZ void WrapText(AZStd::string& result, [[maybe_unused]] float maxWidth, const char* str, [[maybe_unused]] const TextDrawContext& ctx) override { result = str; } - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const override {} - void GetGradientTextureCoord([[maybe_unused]] float& minU, [[maybe_unused]] float& minV, [[maybe_unused]] float& maxU, [[maybe_unused]] float& maxV) const override {} unsigned int GetEffectId([[maybe_unused]] const char* effectName) const override { return 0; } @@ -75,7 +73,6 @@ namespace AZ virtual FontFamilyPtr LoadFontFamily([[maybe_unused]] const char* fontFamilyName) override { CRY_ASSERT(false); return nullptr; } virtual FontFamilyPtr GetFontFamily([[maybe_unused]] const char* fontFamilyName) override { CRY_ASSERT(false); return nullptr; } virtual void AddCharsToFontTextures([[maybe_unused]] FontFamilyPtr fontFamily, [[maybe_unused]] const char* chars, [[maybe_unused]] int glyphSizeX, [[maybe_unused]] int glyphSizeY) override {}; - virtual void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const override {} virtual AZStd::string GetLoadedFontNames() const override { return ""; } virtual void OnLanguageChanged() override { } virtual void ReloadAllFonts() override { } diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FBitmap.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FBitmap.h index 6443633245..2570fd2b17 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FBitmap.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FBitmap.h @@ -52,8 +52,6 @@ namespace AZ void SetRenderData(void* renderData) { m_renderData = renderData; }; void* GetRenderData() { return m_renderData; }; - void GetMemoryUsage ([[maybe_unused]] class ICrySizer* sizer) {}; - unsigned char* GetData() { return m_data; } public: diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h index 6f56d912a0..83f53ffec2 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h @@ -16,9 +16,6 @@ #if !defined(USE_NULLFONT_ALWAYS) #include -#include -#include -#include #include #include "AtomFont.h" @@ -104,20 +101,10 @@ namespace AZ struct FontRenderingPass { - ColorB m_color; - Vec2 m_posOffset; - int m_blendSrc; - int m_blendDest; - - FontRenderingPass() - : m_color(255, 255, 255, 255) - , m_posOffset(0, 0) - , m_blendSrc(GS_BLSRC_SRCALPHA) - , m_blendDest(GS_BLDST_ONEMINUSSRCALPHA) - { - } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} + ColorB m_color = {255, 255, 255, 255}; + Vec2 m_posOffset = {0,0}; + int m_blendSrc = GS_BLSRC_SRCALPHA; + int m_blendDest = GS_BLDST_ONEMINUSSRCALPHA; }; struct FontEffect @@ -141,8 +128,6 @@ namespace AZ { m_passes.resize(0); } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} }; typedef std::vector FontEffects; @@ -179,7 +164,6 @@ namespace AZ Vec2 GetTextSize(const char* str, const bool asciiMultiLine, const TextDrawContext& ctx) override; size_t GetTextLength(const char* str, const bool asciiMultiLine) const override; void WrapText(AZStd::string& result, float maxWidth, const char* str, const TextDrawContext& ctx) override; - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const override {}; void GetGradientTextureCoord(float& minU, float& minV, float& maxU, float& maxV) const override; unsigned int GetEffectId(const char* effectName) const override; unsigned int GetNumEffects() const override; diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontRenderer.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontRenderer.h index 3cfb900055..91e8c6ae9f 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontRenderer.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontRenderer.h @@ -79,8 +79,6 @@ namespace AZ int GetGlyph(GlyphBitmap* glyphBitmap, int* horizontalAdvance, uint8_t* glyphWidth, uint8_t* glyphHeight, int32_t& m_characterOffsetX, int32_t& m_characterOffsetY, int iX, int iY, int characterCode, const FFont::FontHintParams& glyphFlags = FFont::FontHintParams()); int GetGlyphScaled(GlyphBitmap* glyphBitmap, int* glyphWidth, int* glyphHeight, int iX, int iY, float scaleX, float scaleY, int characterCode); - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} - bool GetMonospaced() const { return FT_IS_FIXED_WIDTH(m_face) != 0; } Vec2 GetKerning(uint32_t leftGlyph, uint32_t rightGlyph); diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontTexture.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontTexture.h index f20b0463d9..42766f8910 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontTexture.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FontTexture.h @@ -51,8 +51,6 @@ namespace AZ { m_slotUsage = 0xffff; } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} }; //! Stores the glyphs of a font within a single cpu texture. @@ -131,8 +129,6 @@ namespace AZ int WriteToFile(const AZStd::string& fileName); - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} - bool GetMonospaced() const { return m_glyphCache.GetMonospaced(); } Vec2 GetKerning(uint32_t leftGlyph, uint32_t rightGlyph); diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphBitmap.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphBitmap.h index 1f3aa6955f..c82ba111e2 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphBitmap.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphBitmap.h @@ -14,8 +14,6 @@ #include #include -class ICrySizer; - namespace AZ { class GlyphBitmap @@ -40,8 +38,6 @@ namespace AZ int GetWidth() { return m_width; } int GetHeight() { return m_height; } - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} - private: AZStd::unique_ptr m_buffer; diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphCache.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphCache.h index 271b6810d3..2e57a70132 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphCache.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/GlyphCache.h @@ -55,8 +55,6 @@ namespace AZ m_glyphBitmap.Clear(); } - - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} }; //! The glyph cache maps UTF32 codepoints to their corresponding FreeType data. @@ -110,8 +108,6 @@ namespace AZ //! \sa FontRenderer::GetGlyph, FontTexture::UpdateSlot int GetGlyph(GlyphBitmap** glyph, int* horizontalAdvance, int* width, int* height, int32_t& m_characterOffsetX, int32_t& m_characterOffsetY, uint32_t character, const AtomFont::GlyphSize& glyphSize = AtomFont::defaultGlyphSize, const FFont::FontHintParams& glyphFlags = FFont::FontHintParams()); - void GetMemoryUsage([[maybe_unused]] ICrySizer* sizer) const {} - bool GetMonospaced() const { return m_fontRenderer.GetMonospaced(); } Vec2 GetKerning(uint32_t leftGlyph, uint32_t rightGlyph); diff --git a/Gems/Blast/Code/Source/Family/DamageManager.h b/Gems/Blast/Code/Source/Family/DamageManager.h index 4bffd8c5e0..ed8d03da18 100644 --- a/Gems/Blast/Code/Source/Family/DamageManager.h +++ b/Gems/Blast/Code/Source/Family/DamageManager.h @@ -7,6 +7,8 @@ */ #pragma once +#include "AzCore/Interface/Interface.h" + #include #include #include diff --git a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp index af37e0139a..055537a8bb 100644 --- a/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp +++ b/Gems/ImGui/Code/Source/LYCommonMenu/ImGuiLYAssetExplorer.cpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include #include diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialHandle.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialHandle.h index 1d6ef4040d..b8b9e316ff 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialHandle.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialHandle.h @@ -8,20 +8,19 @@ #pragma once -#include -#include +#include #include +struct IMaterial; + namespace AZ { class BehaviorContext; } - namespace LmbrCentral { //! Wraps a IMaterial pointer in a way that BehaviorContext can use it class MaterialHandle - : public AZ::RenderNotificationsBus::Handler { public: AZ_CLASS_ALLOCATOR(MaterialHandle, AZ::SystemAllocator, 0); @@ -29,13 +28,15 @@ namespace LmbrCentral MaterialHandle() { - AZ::RenderNotificationsBus::Handler::BusConnect(); } MaterialHandle(const MaterialHandle& handle) : m_material(handle.m_material) { - AZ::RenderNotificationsBus::Handler::BusConnect(); + } + + ~MaterialHandle() + { } MaterialHandle& operator=(const MaterialHandle& rhs) @@ -44,20 +45,7 @@ namespace LmbrCentral return *this; } - ~MaterialHandle() override - { - AZ::RenderNotificationsBus::Handler::BusDisconnect(); - } - - //! Handle the renderer's free resources event by nullifying m_material. - //! This is used to prevent material handles that may have been queued for release in the next frame - //! from having dangling pointers after the renderer has already shut down. - void OnRendererFreeResources([[maybe_unused]] int flags) override - { - m_material = nullptr; - } - - _smart_ptr m_material; + IMaterial* m_material; static void Reflect(AZ::BehaviorContext* behaviorContext); static void Reflect(AZ::SerializeContext* serializeContext); diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialOwnerBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialOwnerBus.h deleted file mode 100644 index 2162a9f7ed..0000000000 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MaterialOwnerBus.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -#pragma once - -#include -#include -#include -#include - -namespace LmbrCentral -{ - /*! - * Messages serviced by components that support materials (e.g. Mesh, Decal). - * We specifically chose the name "MaterialOwnerRequestBus" rather than just "MaterialRequestBus" to communicate - * the fact that the requests are not for a Material directly, but for an Entity/Component that uses a Material. - */ - class MaterialOwnerRequests - : public AZ::ComponentBus - { - public: - - //! Sets the component's current material. - virtual void SetMaterial(_smart_ptr) = 0; - //! Gets the component's current material. - virtual _smart_ptr GetMaterial() = 0; - - //! Indicates whether the Material Owner is fully initialized, and MaterialOwnerRequestBus can be used on the Material. - virtual bool IsMaterialOwnerReady() { return true; } - - //! Sets the component's current material. This MaterialHandle version provides support for BehaviorContext reflection. - //! \param materialHandle New material handle - virtual void SetMaterialHandle(const MaterialHandle& /*materialHandle*/) {}; - //! Gets the component's current material. This MaterialHandle version provides support for BehaviorContext reflection. - virtual MaterialHandle GetMaterialHandle() { return MaterialHandle(); } - - //! Sets a Material property for the bus Entity. The Material will be cloned once before any changes are applied, so other instances are not affected. - //! \param name Name of the material param to set. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param value New value for the param - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - virtual void SetMaterialParamVector4(const AZStd::string& /*name*/, const AZ::Vector4& /*value*/, int /*materialId = 1*/) {}; - - //! Sets a Material property for the bus Entity. The Material will be cloned once before any changes are applied, so other instances are not affected. - //! \param name Name of the material param to set. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param value New value for the param - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - virtual void SetMaterialParamVector3(const AZStd::string& /*name*/, const AZ::Vector3& /*value*/, int /*materialId = 1*/) {}; - - //! Sets a Material property for the bus Entity. The Material will be cloned once before any changes are applied, so other instances are not affected. - //! \param name Name of the material param to set. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param value New value for the param - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - virtual void SetMaterialParamColor(const AZStd::string& /*name*/, const AZ::Color& /*value*/, int /*materialId = 1*/) {}; - - //! Sets a Material property for the bus Entity. The Material will be cloned once before any changes are applied, so other instances are not affected. - //! \param name Name of the material param to set. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param value New value for the param - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - virtual void SetMaterialParamFloat(const AZStd::string& /*name*/, float /*value*/, int /*materialId = 1*/) {}; - - //! Returns a Material property value for the bus Entity. - //! \param name Name of the material param to get. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - //! \return The value of the param, or 0's if the param could not be found. - virtual AZ::Vector4 GetMaterialParamVector4(const AZStd::string& /*name*/, int /*materialId = 1*/) { return AZ::Vector4::CreateZero(); }; - - //! Returns a Material property value for the bus Entity. - //! \param name Name of the material param to get. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - //! \return The value of the param, or 0's if the param could not be found. - virtual AZ::Vector3 GetMaterialParamVector3(const AZStd::string& /*name*/, int /*materialId = 1*/) { return AZ::Vector3::CreateZero(); }; - - //! Returns a Material property value for the bus Entity. - //! \param name Name of the material param to get. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - //! \return The value of the param, or 0's if the param could not be found. - virtual AZ::Color GetMaterialParamColor(const AZStd::string& /*name*/, int /*materialId = 1*/) { return AZ::Color::CreateZero(); }; - - //! Returns a Material property value for the bus Entity. - //! \param name Name of the material param to get. May be a custom defined param in the shader, or one of the standard lighting params (diffuse, specular, emissive_color, emissive_intensity, shininess, opacity, alpha). - //! \param materialId ID of the desired material slot. The first slot is Material ID 1. - //! \return The value of the param, or 0 if the param could not be found. - virtual float GetMaterialParamFloat(const AZStd::string& /*name*/, int /*materialId = 1*/) { return 0.0f; }; - }; - - using MaterialOwnerRequestBus = AZ::EBus; - - /*! - * Messages sent by components that support materials (e.g. Mesh, Decal). - * We specifically chose the name "MaterialOwnerNotificationBus" rather than just "MaterialNotificationBus" to communicate - * the fact that the requests are not for a Material directly, but for an Entity/Component that uses a Material. - */ - class MaterialOwnerNotifications - : public AZ::ComponentBus - { - public: - - //! Sent when the material owner is fully initialized, and MaterialOwnerRequestBus can be used on the Material. - //! Before this event, MaterialOwnerRequestBus functions probably won't do anything, because the Material likely - //! doesn't exist yet. - virtual void OnMaterialOwnerReady() = 0; - - /** - * When connecting to this bus, if the material owner is ready you will immediately get an OnMaterialOwnerReady event - **/ - template - struct ConnectionPolicy - : public AZ::EBusConnectionPolicy - { - static void Connect(typename Bus::BusPtr& busPtr, typename Bus::Context& context, typename Bus::HandlerNode& handler, typename Bus::Context::ConnectLockGuard& connectLock, const typename Bus::BusIdType& id = 0) - { - AZ::EBusConnectionPolicy::Connect(busPtr, context, handler, connectLock, id); - - bool readyResult = false; - LmbrCentral::MaterialOwnerRequestBus::EventResult( - readyResult, - id, - &LmbrCentral::MaterialOwnerRequestBus::Events::IsMaterialOwnerReady); - - if (readyResult) - { - handler->OnMaterialOwnerReady(); - } - } - }; - }; - - using MaterialOwnerNotificationBus = AZ::EBus; - -} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MeshAsset.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MeshAsset.h index a1a8c5daba..66e992890e 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MeshAsset.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Rendering/MeshAsset.h @@ -18,7 +18,7 @@ namespace LmbrCentral : public AZ::Data::AssetData { public: - using MeshPtr = _smart_ptr; + using MeshPtr = IStatObj*; AZ_RTTI(MeshAsset, "{C2869E3B-DDA0-4E01-8FE3-6770D788866B}", AZ::Data::AssetData); AZ_CLASS_ALLOCATOR(MeshAsset, AZ::SystemAllocator, 0); diff --git a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake index 73cd12d2b7..d663d2ec06 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake @@ -34,7 +34,6 @@ set(FILES include/LmbrCentral/Rendering/LightComponentBus.h include/LmbrCentral/Rendering/MaterialAsset.h include/LmbrCentral/Rendering/MaterialHandle.h - include/LmbrCentral/Rendering/MaterialOwnerBus.h include/LmbrCentral/Rendering/MeshAsset.h include/LmbrCentral/Rendering/MeshModificationBus.h include/LmbrCentral/Rendering/RenderNodeBus.h diff --git a/Gems/LyShine/Code/Source/Tests/internal/test_UiTextComponent.cpp b/Gems/LyShine/Code/Source/Tests/internal/test_UiTextComponent.cpp index 05e670fdd5..33c2738e54 100644 --- a/Gems/LyShine/Code/Source/Tests/internal/test_UiTextComponent.cpp +++ b/Gems/LyShine/Code/Source/Tests/internal/test_UiTextComponent.cpp @@ -110,7 +110,7 @@ namespace ++drawBatchIt) { const UiTextComponent::DrawBatch& drawBatch = *drawBatchIt; - numNewlinesFound += static_cast(AZStd::count_if(drawBatch.text.begin(), drawBatch.text.end(), + numNewlinesFound += static_cast(AZStd::count_if(drawBatch.text.begin(), drawBatch.text.end(), [](char c) -> bool { return c == '\n'; @@ -135,11 +135,11 @@ namespace } //! \brief Verify fonts that ship with Open 3D Engine load correctly. - //! + //! //! This test depends on the LyShineExamples and UiBasics gems being //! included in the project. //! - //! There are other fonts that ship in other projects (SamplesProject, + //! There are other fonts that ship in other projects (SamplesProject, //! FeatureTests), but that would call for project-specific unit-tests //! which don't belong here. void VerifyShippingFonts() @@ -168,7 +168,7 @@ namespace AZ_Assert(AZStd::string(inputStringCopy.c_str()) == inputString, "Test failed"); } } - + } void BuildDrawBatchesTests(FontFamily* fontFamily) @@ -179,7 +179,7 @@ namespace STextDrawContext fontContext; fontContext.SetEffect(0); fontContext.SetSizeIn800x600(false); - fontContext.SetSize(vector2f(32.0f, 32.0f)); + fontContext.SetSize(Vec2(32.0f, 32.0f)); const float defaultAscent = fontFamily->normal->GetAscender(fontContext); // Plain string @@ -635,7 +635,7 @@ namespace } } - // Anchor tag with multiple colors within link + // Anchor tag with multiple colors within link { const LyShine::StringType markupTestString("this is a test!"); @@ -2021,7 +2021,7 @@ namespace STextDrawContext fontContext; fontContext.SetEffect(0); fontContext.SetSizeIn800x600(false); - fontContext.SetSize(vector2f(32.0f, 32.0f)); + fontContext.SetSize(Vec2(32.0f, 32.0f)); const float defaultAscent = fontFamily->normal->GetAscender(fontContext); { @@ -2082,7 +2082,7 @@ namespace AZ_Assert(0 == fontFamilyRefs.size(), "Test failed"); AZ_Assert(2 == drawBatches.size(), "Test failed"); AssertTextNotEmpty(drawBatches); - + StringList stringList; stringList.push_back("this"); stringList.push_back(" is a test!"); @@ -2149,7 +2149,7 @@ namespace STextDrawContext fontContext; fontContext.SetEffect(0); fontContext.SetSizeIn800x600(false); - fontContext.SetSize(vector2f(32.0f, 32.0f)); + fontContext.SetSize(Vec2(32.0f, 32.0f)); UiTextComponent::InlineImageContainer inlineImages; float defaultImageHeight = 32.0f; @@ -2581,7 +2581,7 @@ namespace } } - // Next line + // Next line ++batchLineIter; { const auto& batchLine = *batchLineIter; @@ -2667,7 +2667,7 @@ namespace } } - // Next line + // Next line ++batchLineIter; { const auto& batchLine = *batchLineIter; @@ -2725,7 +2725,7 @@ namespace { expectedWidth = 0.0f; } - + AZ_Assert(IsClose(newWidth, expectedWidth), "Test failed: Character Spacing, %s. Expected: %f, actual: %f", testName, expectedWidth, newWidth); lyshine->ReleaseCanvas(canvasEntityId, false); @@ -2981,7 +2981,7 @@ namespace AZ::EntityId testElemId = testElem->GetId(); // Verify that GetText and GetAsIs returns the unlocalized key "@ui_Hello" along - // with the original (escaped) markup characters + // with the original (escaped) markup characters { AZStd::string testString("&<>% @ui_Hello"); UiTextInterface::SetTextFlags setTextFlags = static_cast(UiTextInterface::SetEscapeMarkup | UiTextInterface::SetLocalized); @@ -3011,7 +3011,7 @@ namespace // Tests: Setting localized text with abutting invalid localization key chars // // Purpose: localization tokens appear in strings surrounded by characters that - // shouldn't be part of the localization key. + // shouldn't be part of the localization key. // // For example: // "@ui_Hello, @ui_Welcome!" @@ -3110,12 +3110,12 @@ namespace // Test that markup is disabled by default. EBUS_EVENT_ID_RESULT(enabled, testElemId, UiTextBus, GetIsMarkupEnabled); AZ_Assert(!enabled, "Test failed"); - + // Test that setting it to false when it is already false, does not set it to true. EBUS_EVENT_ID(testElemId, UiTextBus, SetIsMarkupEnabled, false); EBUS_EVENT_ID_RESULT(enabled, testElemId, UiTextBus, GetIsMarkupEnabled); AZ_Assert(!enabled, "Test failed"); - + // Check that the flag is actually disabled by checking the size of the textbox EBUS_EVENT_ID_RESULT(NewSize, testElemId, UiTextBus, GetTextSize); AZ_Assert(NewSize == MarkUpDisabledSize, "Test failed"); @@ -3287,7 +3287,7 @@ void FontSharedPtrTests() // This is a negative test which is difficult to support currently. // Uncommenting this line should trigger an assert in CryFont because - // the font was de-allocated while still being referenced by a + // the font was de-allocated while still being referenced by a // FontFamily //notoSans->normal->Release(); @@ -3418,7 +3418,7 @@ void FontSharedPtrTests() AZ_Assert(fontBoldItalic == notoSans->boldItalic, "Test failed"); } - // Once FontFamilyPtr goes out of scope, all associated font family + // Once FontFamilyPtr goes out of scope, all associated font family // fonts should get unloaded too. IFFont* fontRegular = GetISystem()->GetICryFont()->GetFont(notoSansRegular); AZ_Assert(!fontRegular, "Test failed"); @@ -3454,11 +3454,11 @@ void FontSharedPtrTests() const char* veraFontFamilyFile = "fonts/vera.fontfamily"; FontFamilyPtr veraFontFamily = gEnv->pCryFont->LoadFontFamily(veraFontFamilyFile); - + // BEGIN JAV_LY_FORK: The above "vera.font" is a pass-through font (not a font family) // and is now mapped by by its full filepath rather than just the filename. AZ_Assert(veraFontFamily.get(), "Test failed"); - + // The vera font family uses vera.font for its regular-weighted font, // so the ref count for vera.font increases by one, from 4 to 5. AZ_Assert(6 == veraFont->normal->AddRef(), "Test failed"); @@ -3483,12 +3483,12 @@ void UiTextComponent::UnitTest(CLyShine* lyshine, IConsoleCmdArgs* cmdArgs) else { // These tests assume the unit-tests run at startup in order for ref count - // values to make sense. + // values to make sense. AZ_Warning("LyShine", false, "Unit-tests: skipping FontSharedPtrTests due to tests running " "ad-hoc. Run unit tests at startup for full coverage. See ui_RunUnitTestsOnStartup."); } - + VerifyShippingFonts(); // These fonts are required for subsequent unit-tests to work. diff --git a/Gems/LyShine/Code/Source/UiTextComponent.cpp b/Gems/LyShine/Code/Source/UiTextComponent.cpp index 1c8189fa2a..e18a9cefe2 100644 --- a/Gems/LyShine/Code/Source/UiTextComponent.cpp +++ b/Gems/LyShine/Code/Source/UiTextComponent.cpp @@ -62,7 +62,7 @@ namespace AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) { - // This element is a pre-version-8 text component. Prior to version 8 there was no MarkupEnabled + // This element is a pre-version-8 text component. Prior to version 8 there was no MarkupEnabled // flag and markup was always enabled. Going forward, for new components we want to default to // markupEnabled = false because of the performance hit of parsing text strings for XML. // However, we want to be backward compatible with old data so for pre-version-8 components @@ -168,10 +168,10 @@ namespace //! Migrate legacy shrink-to-fit setting to new ShrinkToFit enum. //! - //! As of V8 of text component, the "shrink to fit" setting was a value of + //! As of V8 of text component, the "shrink to fit" setting was a value of //! the WrapTextSetting enum. With V9, a new ShrinkToFit enum was introduced //! and offered an additional "width-only" option (previously, shrink-to-fit - //! only performed uniform scaling along both axes). + //! only performed uniform scaling along both axes). bool ConvertV8ShrinkToFitSetting( AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) @@ -194,7 +194,7 @@ namespace if (shrinkToFitSettingNeedsUpdating) { // It wasn't possible to word-wrap and have shrink-to-fit before, so we just - // reset the wrap text setting to NoWrap to maintain backwards compatibilty. + // reset the wrap text setting to NoWrap to maintain backwards compatibilty. if (!wrapTextSettingNode.SetData(context, static_cast(UiTextInterface::WrapTextSetting::NoWrap))) { AZ_Error("Serialization", false, "Unable to set WrapTextSetting to NoWrap (%d).", static_cast(UiTextInterface::WrapTextSetting::NoWrap)); @@ -964,7 +964,7 @@ namespace //! \param imageStartPos Upper-left coordinate of unclipped image //! \param imageEndPos Bottom-right coordinate of unclipped image void ClipImageQuadAndUvs( - AZ::Vector3* imageQuad, + AZ::Vector3* imageQuad, AZ::Vector2* uvs, const UiTransformInterface::RectPoints& points, const UiTextComponent::DrawBatch& drawBatch, @@ -1022,7 +1022,7 @@ namespace //! Note that this assumes the lines have been word-wrapped and don't overflow horizontally. int GetNumNonOverflowingLinesForElement( const UiTextComponent::DrawBatchLineContainer& batchLines, - const AZ::Vector2& currentElementSize, + const AZ::Vector2& currentElementSize, float lineSpacing) { int maxLinesElementCanHold = 0; @@ -1426,7 +1426,7 @@ bool UiTextComponent::DrawBatchLine::CheckAndSplitLine(const STextDrawContext& c DrawBatchLine& newDrawBatchLineOut) { bool lineSplit = false; - + // Allow a space at the end of the line to overflow. This is to remain consistent with the non-image // line split implementation. If the space at the end of the line was simply removed, the character // indexes wouldn't match the localized text character indexes, and would cause issues with cursor positioning @@ -1453,7 +1453,7 @@ bool UiTextComponent::DrawBatchLine::CheckAndSplitLine(const STextDrawContext& c // Check whether current batch is overflowing and get overflow info UiTextComponent::DrawBatch::OverflowInfo overflowInfoOut; bool overflowing = drawBatchIterator->GetOverflowInfo(ctx, availableWidth, skipFirstChar, overflowInfoOut); - + // Check if this batch has a space and remember for later if (overflowInfoOut.lastSpaceIndex >= 0) { @@ -1483,7 +1483,7 @@ bool UiTextComponent::DrawBatchLine::CheckAndSplitLine(const STextDrawContext& c isLastSpaceAtEndOfBatch = false; numCharsSinceLastSpace = -1; } - + if (overflowing) { // Find a batch to split @@ -1667,13 +1667,13 @@ void UiTextComponent::ResetOverrides() m_overrideColor = m_color; colorChanged = true; } - + if (m_overrideAlpha != m_alpha) { m_overrideAlpha = m_alpha; alphaChanged = true; } - + if (m_overrideFontFamily != m_fontFamily) { m_overrideFontFamily = m_fontFamily; @@ -1771,7 +1771,7 @@ void UiTextComponent::Render(LyShine::IRenderGraph* renderGraph) float finalAlpha = fade * m_overrideAlpha; uint8 finalAlphaByte = static_cast(finalAlpha * 255.0f); - // if we have any cached text batches that have transparency in their font effects then we need to + // if we have any cached text batches that have transparency in their font effects then we need to // regenerate the render cache if alpha has changed. This is fairly unusual so it still // makes sense to not mark the render cache dirty on most fades or alpha changes. if (m_drawBatchLines.m_fontEffectHasTransparency) @@ -1779,7 +1779,7 @@ void UiTextComponent::Render(LyShine::IRenderGraph* renderGraph) if (!m_renderCache.m_batches.empty() && m_renderCache.m_batches[0]->m_color.a != finalAlphaByte) { MarkRenderCacheDirty(); - } + } } // If the cache is out of date then regenerate it @@ -1889,7 +1889,7 @@ void UiTextComponent::Render(LyShine::IRenderGraph* renderGraph) batch->m_color.a = finalAlphaByte; } - // We always use wrap mode for text (isClamp false). This is historically what was done + // We always use wrap mode for text (isClamp false). This is historically what was done // in CryFont and without it characters that are on the left of the font texture look bad // because there is no padding on the left of the glyphs. bool isClampTextureMode = false; @@ -2029,7 +2029,7 @@ void UiTextComponent::SetColor(const AZ::Color& color) { if (m_drawBatchLines.m_fontEffectHasTransparency) { - MarkRenderCacheDirty(); + MarkRenderCacheDirty(); } else { @@ -2378,7 +2378,7 @@ void UiTextComponent::SetSelectionRange(int startIndex, int endIndex, const AZ:: // The render cache stores positions based on these values so mark it dirty MarkRenderCacheDirty(); -} +} //////////////////////////////////////////////////////////////////////////////////////////////////// void UiTextComponent::ClearSelectionRange() @@ -2691,7 +2691,7 @@ void UiTextComponent::GetClickableTextRects(UiClickableTextInterface::ClickableT alignedPosition.SetX(alignedPosition.GetX() + xDrawPosOffset); Vec2 textSize(drawBatch.size.GetX(), drawBatch.size.GetY()); xDrawPosOffset = textSize.x; - + if (drawBatch.IsClickable()) { UiClickableTextInterface::ClickableTextRect clickableRect; @@ -2736,7 +2736,7 @@ void UiTextComponent::SetClickableTextColor(int id, const AZ::Color& color) if (id == drawBatch.clickableId) { // Don't return here. We purposely continue iterating in - // case there are subsequent draw batches (especially + // case there are subsequent draw batches (especially // across multiple draw batch lines) with the same ID. // This will occur with word-wrapped text. drawBatch.color = color.GetAsVector3(); @@ -2851,7 +2851,7 @@ float UiTextComponent::GetTargetWidth(float maxWidth) // for rendering, a new empty line will be added to account for the newline that gets added // due to not having enough room for the trailing space bool excludeTrailingSpaceWidth = false; - + DrawBatchLines drawBatchLines; CalculateDrawBatchLines(drawBatchLines, forceNoWrap, maxWidth, excludeTrailingSpaceWidth); @@ -2891,7 +2891,7 @@ float UiTextComponent::GetTargetHeight(float maxHeight) const bool haveMaxHeight = LyShine::IsUiLayoutCellSizeSpecified(maxHeight); const bool ellipsis = m_overflowMode == OverflowMode::Ellipsis; const bool shrinkToFit = m_shrinkToFit == ShrinkToFit::Uniform; - + const bool handleOverflow = haveMaxHeight && (ellipsis || shrinkToFit); const bool handleNoOverflow = !haveMaxHeight && (m_drawBatchLines.fontSizeScale.GetY() != 1.0f); @@ -3431,7 +3431,7 @@ void UiTextComponent::OnFontSizeChange() { m_isRequestFontSizeDirty = true; - // We need to re-prepare the text for rendering, however this may not be + // We need to re-prepare the text for rendering, however this may not be // very efficient since completely re-preparing the text (parsing markup, // preparing batches, etc.) may not be necessary. MarkDrawBatchLinesDirty(true); @@ -3499,7 +3499,7 @@ void UiTextComponent::OnLineSpacingChange() // If shrink-to-fit applies, we need to re-create draw batch lines in // order to ensure overflow conditions are properly applied. if (m_shrinkToFit != ShrinkToFit::None) - { + { MarkDrawBatchLinesDirty(true); } else @@ -3863,7 +3863,7 @@ void UiTextComponent::CalculateDrawBatchLines( drawBatches.push_back(DrawBatch()); drawBatches.front().font = font; drawBatches.front().text = m_locText; - + // If the font effect we are using has any passes with alpha of less than 1 (not common) then // we set a flag in the batch lines since it affects how we can update the alpha in the cache drawBatchLinesOut.m_fontEffectHasTransparency = font->DoesEffectHaveTransparency(fontContext.m_fxIdx); @@ -3875,7 +3875,7 @@ void UiTextComponent::CalculateDrawBatchLines( delete image; } prevInlineImages.clear(); - + // Check if we have any inline images that require us to connect to the texture atlas bus if (drawBatchLinesOut.inlineImages.size() > 0) { @@ -4107,7 +4107,7 @@ void UiTextComponent::RenderDrawBatchLines( const AZ::Vector2 imageStartPos = AZ::Vector2( alignedPosition.GetX() + drawBatch.image->m_leftPadding, alignedPosition.GetY() + drawBatch.yOffset); - + const AZ::Vector2 imageEndPos = AZ::Vector2( imageStartPos.GetX() + drawBatch.image->m_size.GetX(), imageStartPos.GetY() + drawBatch.image->m_size.GetY()); @@ -4121,7 +4121,7 @@ void UiTextComponent::RenderDrawBatchLines( AZ::Vector2 uvs[4]; if (drawBatch.image->m_atlas) { - uvs[0] = AZ::Vector2(static_cast(drawBatch.image->m_coordinates.GetLeft()) / drawBatch.image->m_atlas->GetWidth(), + uvs[0] = AZ::Vector2(static_cast(drawBatch.image->m_coordinates.GetLeft()) / drawBatch.image->m_atlas->GetWidth(), static_cast(drawBatch.image->m_coordinates.GetTop()) / drawBatch.image->m_atlas->GetHeight()); uvs[2] = AZ::Vector2(static_cast(drawBatch.image->m_coordinates.GetRight()) / drawBatch.image->m_atlas->GetWidth(), static_cast(drawBatch.image->m_coordinates.GetBottom()) / drawBatch.image->m_atlas->GetHeight()); @@ -4227,9 +4227,9 @@ STextDrawContext UiTextComponent::GetTextDrawContextPrototype(int requestFontSiz // Shrink-to-fit scaling (fontSizeScale) gets applied to font size, but not request size. // This means that re-rendered fonts will not re-render characters that are scaled via // shrink-to-fit - a scale transformation is applied for these characters instead. For - // higher quality font scaling with shrink-to-fit, consider taking m_fontSizeScale into + // higher quality font scaling with shrink-to-fit, consider taking m_fontSizeScale into // account. - ctx.SetSize(vector2f(m_fontSize * fontSizeScale.GetX(), m_fontSize * fontSizeScale.GetY())); + ctx.SetSize(Vec2(m_fontSize * fontSizeScale.GetX(), m_fontSize * fontSizeScale.GetY())); ctx.m_requestSize = Vec2i(requestFontSize, requestFontSize); ctx.m_processSpecialChars = false; ctx.m_tracking = (m_charSpacing * ctx.m_size.x) / 1000.0f; // m_charSpacing units are 1/1000th of ems, 1 em is equal to font size. @@ -4406,7 +4406,7 @@ void UiTextComponent::HandleShrinkToFitWithWrapping( //////////////////////////////////////////////////////////////////////////////////////////////////// void UiTextComponent::HandleWidthOnlyShrinkToFitWithWrapping( UiTextComponent::DrawBatchLines& drawBatchLinesOut, - const AZ::Vector2& currentElementSize, + const AZ::Vector2& currentElementSize, int maxLinesElementCanHold) { bool textStillOverflows = true; @@ -4418,8 +4418,8 @@ void UiTextComponent::HandleWidthOnlyShrinkToFitWithWrapping( DrawBatchLineContainer::reverse_iterator riter; int overflowLineCount = 0; float overflowingLineSize = 0.0f; - for (riter = drawBatchLinesOut.batchLines.rbegin(); - riter != drawBatchLinesOut.batchLines.rend() && overflowLineCount < numOverflowingLines; + for (riter = drawBatchLinesOut.batchLines.rbegin(); + riter != drawBatchLinesOut.batchLines.rend() && overflowLineCount < numOverflowingLines; ++riter, ++overflowLineCount) { DrawBatchLine& batchLine = *riter; @@ -4458,7 +4458,7 @@ void UiTextComponent::HandleWidthOnlyShrinkToFitWithWrapping( maxLinesElementCanHold = GetNumNonOverflowingLinesForElement(drawBatchLinesOut.batchLines, currentElementSize, m_lineSpacing); // Just because we applied a scale doesn't mean the text fits. This is due to word wrap. - // Even though we calculate the exact scale to accmmodate all the characters for the + // Even though we calculate the exact scale to accmmodate all the characters for the // max number of lines the element can hold, word-wrap divides the characters unevenly // across the total space required by the text, because overflowing words/characters are // wrapped to the next line (and a character is "atomic" and can't be divided arbitrarily @@ -4485,7 +4485,7 @@ void UiTextComponent::HandleUniformShrinkToFitWithWrapping( // This keeps track of the last known largest scale that fits the text // to the element bounds with word wrap. float bestScaleFoundSoFar = curFontScale; - + // Calculate a default scale multiplier used to reduce the font scale by a percentage // until the text no longer overflows. // The default scale multiplier is the ratio of available height to the required height. @@ -4500,14 +4500,14 @@ void UiTextComponent::HandleUniformShrinkToFitWithWrapping( // If min shrink scale applies, and it's bigger than the default scale multplier, // we set the scale to be half the difference between 1.0f (no scale) and the // min shrink scale (a "half step"). This gives a starting point that avoids - // applying a scale that is too small too soon (esp for text that "almost fits" + // applying a scale that is too small too soon (esp for text that "almost fits" // the element bounds). const float minShrinkScaleHalfStep = (1.0f - m_minShrinkScale) * 0.5f + m_minShrinkScale; const bool useMinShrinkScale = m_minShrinkScale > 0.0f; const float scaleMultiplierUnclamped = useMinShrinkScale ? minShrinkScaleHalfStep : defaultScaleMultiplier; const float scaleMultiplier = AZStd::GetMax(defaultScaleMultiplier, scaleMultiplierUnclamped); - + // Text always starts out overflowing bool textStillOverflows = true; @@ -4532,7 +4532,7 @@ void UiTextComponent::HandleUniformShrinkToFitWithWrapping( maxLinesElementCanHold = GetNumNonOverflowingLinesForElement(drawBatchLinesOut.batchLines, currentElementSize, m_lineSpacing); // Just because we applied a scale doesn't mean the text fits. This is due to word wrap. - // Even though we calculate the exact scale to accmmodate all the characters for the + // Even though we calculate the exact scale to accmmodate all the characters for the // max number of lines the element can hold, word-wrap divides the characters unevenly // across the total space required by the text, because overflowing words/characters are // wrapped to the next line (and a character is "atomic" and can't be divided arbitrarily @@ -4585,7 +4585,7 @@ void UiTextComponent::HandleEllipsis(UiTextComponent::DrawBatchLines& drawBatchL { return; } - + AZ::Vector2 textSize = GetTextSizeFromDrawBatchLines(drawBatchLinesOut); AZ::Vector2 currentElementSize; // This needs to be computed with the unscaled size. This is because scaling happens after the text is laid out. EBUS_EVENT_ID_RESULT(currentElementSize, GetEntityId(), UiTransformBus, GetCanvasSpaceSizeNoScaleRotate); @@ -4651,7 +4651,7 @@ void UiTextComponent::HandleEllipsis(UiTextComponent::DrawBatchLines& drawBatchL const bool noOtherBatches = 1 == lineToEllipsisPtr->drawBatchList.size(); const bool removeBatchContainingOnlyEllipsis = batchContainsOnlyEllipsis && noOtherBatches; if (removeBatchContainingOnlyEllipsis) - { + { linesToRemove.push_back(lineToEllipsis); } else @@ -4716,7 +4716,7 @@ void UiTextComponent::GetLineToEllipsisAndLinesToTruncate(UiTextComponent::DrawB prevBatchLine = iter; continue; } - + // Prevent the first line of text from being removed, even if the text // is overflowing. With ellipsis enabled, this content will be clipped. const bool firstLine = iter == drawBatchLinesOut.batchLines.begin(); @@ -4776,7 +4776,7 @@ UiTextComponent::DrawBatch* UiTextComponent::GetDrawBatchToEllipseAndPositions(c ellipsisSize = drawBatchToEllipse->font->GetTextSize(ellipseText, true, ctx).x; // Calculate where the ellipsis must start in order to be contained within the - // element bounds. Also, guard against narrow elements that aren't wide enough + // element bounds. Also, guard against narrow elements that aren't wide enough // to accommodate ellipsis. *ellipsisPos = AZStd::GetMax(0.0f, currentElementSize.GetX() - ellipsisSize); *drawBatchStartPos = startPositions->back().second; @@ -4838,7 +4838,7 @@ int UiTextComponent::GetStartEllipseIndexInDrawBatch(const DrawBatch* drawBatchT char codepoint[5] = { 0 }; char* codepointPtr = codepoint; Utf8::Unchecked::octet_iterator::to_utf8_sequence(ch, codepointPtr, maxSize); - + overflowStringSize += drawBatchToEllipse->font->GetTextSize(codepoint, true, ctx).x; if (prevCh && ctx.m_kerningEnabled) @@ -4863,7 +4863,7 @@ int UiTextComponent::GetStartEllipseIndexInDrawBatch(const DrawBatch* drawBatchT } ellipsisCharPos = stringBufferIndex; - + } return ellipsisCharPos; @@ -4939,7 +4939,7 @@ AZ::Vector2 UiTextComponent::CalculateAlignedPositionWithYOffset(const UiTransfo AZ::Vector2 pos; const DrawBatchLines& drawBatchLines = GetDrawBatchLines(); size_t numLinesOfText = drawBatchLines.batchLines.size(); - + switch (m_textHAlignment) { case IDraw2d::HAlign::Left: @@ -5047,7 +5047,7 @@ bool UiTextComponent::VersionConverter(AZ::SerializeContext& context, } } - // conversion from version 8 to current: + // conversion from version 8 to current: // - "shrink to fit" wrap text setting now becomes the "uniform" value of the new "shrink to fit" enum // - legacy "ResizeToText" overflow mode (enum value 2) gets reset back to zero (overflow) if (classElement.GetVersion() <= 8) diff --git a/Gems/LyShineExamples/Code/Include/LyShineExamples/UiCustomImageBus.h b/Gems/LyShineExamples/Code/Include/LyShineExamples/UiCustomImageBus.h index 0830e4229a..26f793d774 100644 --- a/Gems/LyShineExamples/Code/Include/LyShineExamples/UiCustomImageBus.h +++ b/Gems/LyShineExamples/Code/Include/LyShineExamples/UiCustomImageBus.h @@ -42,10 +42,10 @@ public: // types void UnitClamp() { - m_left = FClamp(m_left, 0.0f, 1.0f); - m_top = FClamp(m_top, 0.0f, 1.0f); - m_right = FClamp(m_right, 0.0f, 1.0f); - m_bottom = FClamp(m_bottom, 0.0f, 1.0f); + m_left = AZStd::clamp(m_left, 0.0f, 1.0f); + m_top = AZStd::clamp(m_top, 0.0f, 1.0f); + m_right = AZStd::clamp(m_right, 0.0f, 1.0f); + m_bottom = AZStd::clamp(m_bottom, 0.0f, 1.0f); } bool operator==(const UVRect& rhs) const diff --git a/Gems/Maestro/Code/Source/Cinematics/CharacterTrackAnimator.h b/Gems/Maestro/Code/Source/Cinematics/CharacterTrackAnimator.h index e7c974e7a9..ae9f6bfce3 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CharacterTrackAnimator.h +++ b/Gems/Maestro/Code/Source/Cinematics/CharacterTrackAnimator.h @@ -11,7 +11,7 @@ Utility class to handle Animation of Character Tracks (aka 'Animation' Tracks in the TrackView UI) */ -#include +#include struct SAnimContext; struct ICharacterKey; @@ -36,11 +36,6 @@ public: float m_jumpTime[3]; }; - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - } - void OnReset(IAnimNode* animNode); ILINE bool IsAnimationPlaying(const SAnimState& animState) const; diff --git a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp index 9a54b21d7f..d124b37490 100644 --- a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.cpp @@ -6,20 +6,19 @@ * */ - -#include #include "MaterialNode.h" #include "AnimTrack.h" +#include -#include #include #include +#include #include "AnimSplineTrack.h" #include "CompoundSplineTrack.h" #include "Maestro/Types/AnimNodeType.h" -#include "Maestro/Types/AnimValueType.h" #include "Maestro/Types/AnimParamType.h" +#include "Maestro/Types/AnimValueType.h" // Don't remove or the console builds will break! #define s_nodeParamsInitialized s_nodeParamsInitializedMat @@ -39,11 +38,11 @@ namespace param.valueType = valueType; s_nodeParams.push_back(param); } -} +} // namespace enum EMaterialNodeParam { - MTL_PARAM_SHADER_PARAM1 = static_cast(AnimParamType::User) + 100, + MTL_PARAM_SHADER_PARAM1 = static_cast(AnimParamType::User) + 100, }; ////////////////////////////////////////////////////////////////////////// @@ -105,7 +104,7 @@ void CAnimMaterialNode::UpdateDynamicParamsInternal() m_nameToDynamicShaderParam.clear(); const char* pName = GetName(); - _smart_ptr pMtl = GetMaterialByName(pName); + IMaterial* pMtl = GetMaterialByName(pName); if (!pMtl) { @@ -123,7 +122,7 @@ void CAnimMaterialNode::UpdateDynamicParamsInternal() for (int i = 0; i < shaderParams.size(); ++i) { SShaderParam& shaderParam = shaderParams[i]; - m_nameToDynamicShaderParam[ shaderParams[i].m_Name.c_str() ] = i; + m_nameToDynamicShaderParam[shaderParams[i].m_Name.c_str()] = i; CAnimNode::SParamInfo paramInfo; @@ -184,8 +183,9 @@ CAnimParamType CAnimMaterialNode::GetParamType(unsigned int nIndex) const { return s_nodeParams[nIndex].paramType; } - else if (nIndex >= (unsigned int)s_nodeParams.size() && - nIndex < ((unsigned int)s_nodeParams.size() + (unsigned int)m_dynamicShaderParamInfos.size())) + else if ( + nIndex >= (unsigned int)s_nodeParams.size() && + nIndex < ((unsigned int)s_nodeParams.size() + (unsigned int)m_dynamicShaderParamInfos.size())) { return m_dynamicShaderParamInfos[nIndex - (int)s_nodeParams.size()].paramType; } @@ -264,7 +264,7 @@ void CAnimMaterialNode::Animate(SAnimContext& ec) // Find material. const char* pName = GetName(); - _smart_ptr pMtl = GetMaterialByName(pName); + IMaterial* pMtl = GetMaterialByName(pName); if (!pMtl) { @@ -348,7 +348,8 @@ void CAnimMaterialNode::Animate(SAnimContext& ec) } } -void CAnimMaterialNode::AnimateNamedParameter(SAnimContext& ec, IRenderShaderResources* pShaderResources, const char* name, IAnimTrack* pTrack) +void CAnimMaterialNode::AnimateNamedParameter( + SAnimContext& ec, IRenderShaderResources* pShaderResources, const char* name, IAnimTrack* pTrack) { TDynamicShaderParamsMap::iterator findIter = m_nameToDynamicShaderParam.find(name); if (findIter != m_nameToDynamicShaderParam.end()) @@ -387,7 +388,7 @@ void CAnimMaterialNode::AnimateNamedParameter(SAnimContext& ec, IRenderShaderRes } } -_smart_ptr CAnimMaterialNode::GetMaterialByName(const char*) +IMaterial* CAnimMaterialNode::GetMaterialByName(const char*) { return nullptr; } @@ -404,8 +405,7 @@ void CAnimMaterialNode::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast(context)) { - serializeContext->Class() - ->Version(1); + serializeContext->Class()->Version(1); } } diff --git a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h index 0c8bc38f1a..fcc308e5c8 100644 --- a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h @@ -54,7 +54,7 @@ protected: void UpdateDynamicParamsInternal() override; private: void AnimateNamedParameter(SAnimContext& ec, IRenderShaderResources* pShaderResources, const char* name, IAnimTrack* pTrack); - _smart_ptr GetMaterialByName(const char* pName); + IMaterial * GetMaterialByName(const char* pName); float m_fMinKeyValue; float m_fMaxKeyValue; diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.cpp b/Gems/Maestro/Code/Source/Cinematics/Movie.cpp index 467ab37dab..3654af52dd 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.cpp @@ -709,7 +709,7 @@ void CMovieSystem::NotifyListeners(IAnimSequence* sequence, IMovieListener::EMov { /* * When a sequence is stopped, Resume is called just before stopped (not sure why). To ensure that a OnStop notification is sent out after the Resume, - * notifications for eMovieEvent_Started and eMovieEvent_Stopped are handled in IAnimSequence::OnStart and IAnimSequence::OnStop + * notifications for eMovieEvent_Started and eMovieEvent_Stopped are handled in IAnimSequence::OnStart and IAnimSequence::OnStop */ case IMovieListener::eMovieEvent_Aborted: { @@ -726,7 +726,7 @@ void CMovieSystem::NotifyListeners(IAnimSequence* sequence, IMovieListener::EMov // do nothing for unhandled IMovieListener events break; } - } + } } ////////////////////////////////////////////////////////////////////////// @@ -1860,12 +1860,6 @@ void CMovieSystem::OnSequenceActivated(IAnimSequence* sequence) m_newlyActivatedSequences.push_back(sequence); } -////////////////////////////////////////////////////////////////////////// -ILightAnimWrapper* CMovieSystem::CreateLightAnimWrapper(const char* name) const -{ - return CLightAnimWrapper::Create(name); -} - ////////////////////////////////////////////////////////////////////////// StaticInstance CLightAnimWrapper::ms_lightAnimWrapperCache; AZStd::intrusive_ptr CLightAnimWrapper::ms_pLightAnimSet; diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.h b/Gems/Maestro/Code/Source/Cinematics/Movie.h index 0d7d1743f1..8ab888178d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.h +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.h @@ -154,7 +154,6 @@ public: bool IsRecording() const { return m_bRecording; }; void EnableCameraShake(bool bEnabled){ m_bEnableCameraShake = bEnabled; }; - bool IsCameraShakeEnabled() const {return m_bEnableCameraShake; }; void SetCallback(IMovieCallback* pCallback) { m_pCallback = pCallback; } IMovieCallback* GetCallback() { return m_pCallback; } @@ -187,8 +186,6 @@ public: virtual void EnableBatchRenderMode(bool bOn) { m_bBatchRenderMode = bOn; } virtual bool IsInBatchRenderMode() const { return m_bBatchRenderMode; } - ILightAnimWrapper* CreateLightAnimWrapper(const char* name) const; - void SerializeNodeType(AnimNodeType& animNodeType, XmlNodeRef& xmlNode, bool bLoading, const uint version, int flags) override; virtual void LoadParamTypeFromXml(CAnimParamType& animParamType, const XmlNodeRef& xmlNode, const uint version) override; virtual void SaveParamTypeToXml(const CAnimParamType& animParamType, XmlNodeRef& xmlNode) override; diff --git a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h index 58ba8c78c6..c55b2de520 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h @@ -6,35 +6,20 @@ * */ - -#ifndef CRYINCLUDE_CRYMOVIE_SOUNDTRACK_H -#define CRYINCLUDE_CRYMOVIE_SOUNDTRACK_H +#pragma once #include "AnimTrack.h" -#include struct SSoundInfo { - SSoundInfo() - : nSoundKeyStart(-1) - , nSoundKeyStop(-1) - { - Reset(); - } - void Reset() { nSoundKeyStart = -1; nSoundKeyStop = -1; } - void GetMemoryUsage(ICrySizer* pSizer) const - { - pSizer->AddObject(this, sizeof(*this)); - } - - int nSoundKeyStart; - int nSoundKeyStop; + int nSoundKeyStart = -1; + int nSoundKeyStop = -1; }; class CSoundTrack @@ -54,5 +39,3 @@ public: static void Reflect(AZ::ReflectContext* context); }; - -#endif // CRYINCLUDE_CRYMOVIE_SOUNDTRACK_H diff --git a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp index e4c65c8667..f65768cec9 100644 --- a/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp +++ b/Gems/PhysX/Code/Editor/Source/Components/EditorSystemComponent.cpp @@ -14,7 +14,6 @@ #include #include -#include #include #include diff --git a/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsLegacyDefinitions.h b/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsLegacyDefinitions.h index 3a0575c129..b61d07295d 100644 --- a/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsLegacyDefinitions.h +++ b/Gems/ScriptEvents/Code/Include/ScriptEvents/ScriptEventsLegacyDefinitions.h @@ -18,32 +18,24 @@ namespace ScriptEventsLegacy { - - class IValidator - { - public: - virtual AZ::Outcome Validate() = 0; - }; - - /** - * This class represents an EBus event parameter. + * This class represents an EBus event parameter. * void Foo(parameterType parameterName) - * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * parameter */ struct ParameterDefinition { AZ_TYPE_INFO(ParameterDefinition, "{6586FFB5-0FF6-424F-A542-C797E2FF3458}"); AZ_CLASS_ALLOCATOR(ParameterDefinition, AZ::SystemAllocator, 0); - + ParameterDefinition() = default; ParameterDefinition(const AZStd::string& name, const AZStd::string& tooltip, const AZ::Uuid& type) : m_name(name) , m_tooltip(tooltip) - , m_type(type) + , m_type(type) {} - + AZStd::string m_name; AZStd::string m_tooltip; AZ::Uuid m_type = AZ::BehaviorContext::GetVoidTypeId(); @@ -52,20 +44,20 @@ namespace ScriptEventsLegacy /** * This class represents an EBus event. * void Foo (parameterType parameterName, parameterType2 parameterName2) - * ^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * ^^^^ ^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ * m_returnType, m_name, m_parameters */ struct EventDefinition { AZ_TYPE_INFO(EventDefinition, "{211BB356-FA42-400F-B3DD-9326C6A686B6}"); AZ_CLASS_ALLOCATOR(EventDefinition, AZ::SystemAllocator, 0); - + EventDefinition() = default; EventDefinition(const AZStd::string& eventName, const AZStd::string& tooltip, const AZ::Uuid& returnValue, const AZStd::vector& parameters) : m_name(eventName) , m_tooltip(tooltip) , m_returnType(returnValue) - , m_parameters(parameters) + , m_parameters(parameters) {} AZStd::string m_name; @@ -86,7 +78,7 @@ namespace ScriptEventsLegacy TypeTraitsDefinition() = default; TypeTraitsDefinition(const AZ::Uuid& busIdType) : m_busIdType(busIdType) {} - + AZ::Uuid m_busIdType = AZ::BehaviorContext::GetVoidTypeId(); }; diff --git a/Gems/Vegetation/Code/Tests/VegetationMocks.h b/Gems/Vegetation/Code/Tests/VegetationMocks.h index ebc51d1b3b..97eaa50b69 100644 --- a/Gems/Vegetation/Code/Tests/VegetationMocks.h +++ b/Gems/Vegetation/Code/Tests/VegetationMocks.h @@ -32,13 +32,6 @@ #include #include -// used for the mock for IStatObj -#ifndef CRYINCLUDE_CRY3DENGINE_STATOBJ_H -struct SPhysGeomArray -{ -}; -#endif - ////////////////////////////////////////////////////////////////////////// // mock event bus classes for testing vegetation namespace UnitTest From 1d4487f4f8fa95f2cf363e7330ea1505e4933ce1 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 11:53:40 -0700 Subject: [PATCH 170/355] Improvement suggestion from another PR Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/3rdParty.cmake | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cmake/3rdParty.cmake b/cmake/3rdParty.cmake index 310e341305..f70ed1aa02 100644 --- a/cmake/3rdParty.cmake +++ b/cmake/3rdParty.cmake @@ -123,10 +123,8 @@ function(ly_add_external_target) else() # only install external 3rdParty that are within the source tree - cmake_path(RELATIVE_PATH ly_add_external_target_3RDPARTY_ROOT_DIRECTORY - BASE_DIRECTORY ${LY_ROOT_FOLDER} - OUTPUT_VARIABLE relative_path) - if(relative_path AND NOT relative_path MATCHES "^../") + cmake_path(IS_PREFIX LY_ROOT_FOLDER ${ly_add_external_target_3RDPARTY_ROOT_DIRECTORY} NORMALIZE is_in_source_tree) + if(is_in_source_tree) ly_install_external_target(${ly_add_external_target_3RDPARTY_ROOT_DIRECTORY}) endif() set(BASE_PATH "${ly_add_external_target_3RDPARTY_ROOT_DIRECTORY}") From fd007548e00f30bb4d5c705178e6bbef34d02013 Mon Sep 17 00:00:00 2001 From: dmcdiar Date: Tue, 7 Sep 2021 12:16:04 -0700 Subject: [PATCH 171/355] MeshFeatureProcessor::SetVisible now adds or removes the mesh from the raytracing scene as appropriate. Signed-off-by: dmcdiar --- .../Common/Code/Source/Mesh/MeshFeatureProcessor.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp index f52d9fe37c..67702a8176 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp @@ -425,6 +425,7 @@ namespace AZ if (meshHandle.IsValid()) { meshHandle->SetVisible(visible); + SetRayTracingEnabled(meshHandle, visible); } } @@ -696,8 +697,13 @@ namespace AZ void MeshDataInstance::SetRayTracingData() { + if (!m_model) + { + return; + } + RayTracingFeatureProcessor* rayTracingFeatureProcessor = m_scene->GetFeatureProcessor(); - if (rayTracingFeatureProcessor == nullptr) + if (!rayTracingFeatureProcessor) { return; } From 214ebb730864e922aab709b1d30796f5d99b7224 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Tue, 7 Sep 2021 14:40:20 -0500 Subject: [PATCH 172/355] Adding null checks to Gestures gem if gEnv isn't set Signed-off-by: Guthrie Adams --- .../Code/Include/Gestures/GestureRecognizerClickOrTap.inl | 6 +++--- .../Code/Include/Gestures/GestureRecognizerDrag.inl | 4 ++-- Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.h | 2 +- .../Code/Include/Gestures/GestureRecognizerHold.inl | 4 ++-- .../Code/Include/Gestures/GestureRecognizerPinch.inl | 2 +- .../Code/Include/Gestures/GestureRecognizerRotate.inl | 2 +- .../Code/Include/Gestures/GestureRecognizerSwipe.inl | 6 +++--- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl index 9333c5cbc9..77f6044642 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl @@ -73,7 +73,7 @@ inline Gestures::RecognizerClickOrTap::~RecognizerClickOrTap() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerClickOrTap::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } @@ -120,7 +120,7 @@ inline bool Gestures::RecognizerClickOrTap::OnPressedEvent(const AZ::Vector2& sc //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerClickOrTap::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } @@ -159,7 +159,7 @@ inline bool Gestures::RecognizerClickOrTap::OnDownEvent(const AZ::Vector2& scree //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerClickOrTap::OnReleasedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl index 642ae9b852..c473293765 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl @@ -59,7 +59,7 @@ inline Gestures::RecognizerDrag::~RecognizerDrag() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerDrag::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } @@ -90,7 +90,7 @@ inline bool Gestures::RecognizerDrag::OnPressedEvent(const AZ::Vector2& screenPo //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerDrag::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.h b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.h index facdd899c8..11bd56ff4d 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.h +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.h @@ -64,7 +64,7 @@ namespace Gestures AZ::Vector2 GetStartPosition() const { return m_startPosition; } AZ::Vector2 GetCurrentPosition() const { return m_currentPosition; } - float GetDuration() const { return gEnv->pTimer->GetFrameStartTime().GetDifferenceInSeconds(m_startTime); } + float GetDuration() const { return (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime().GetDifferenceInSeconds(m_startTime) : 0.0f; } private: enum class State diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl index a85acfe466..99a3f7042c 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl @@ -59,7 +59,7 @@ inline Gestures::RecognizerHold::~RecognizerHold() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerHold::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } @@ -90,7 +90,7 @@ inline bool Gestures::RecognizerHold::OnPressedEvent(const AZ::Vector2& screenPo //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerHold::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl index 1a198eab59..c64e310c36 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl @@ -106,7 +106,7 @@ inline float AngleInDegreesBetweenVectors(const AZ::Vector2& vec0, const AZ::Vec //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerPinch::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex > s_maxPinchPointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex > s_maxPinchPointerIndex) { return false; } diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl index 6cc82f47dc..da6f84afca 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl @@ -95,7 +95,7 @@ inline bool Gestures::RecognizerRotate::OnPressedEvent(const AZ::Vector2& screen //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerRotate::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex > s_maxRotatePointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex > s_maxRotatePointerIndex) { return false; } diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl index 8d59525e93..f84e85df52 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl @@ -59,7 +59,7 @@ inline Gestures::RecognizerSwipe::~RecognizerSwipe() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerSwipe::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } @@ -89,7 +89,7 @@ inline bool Gestures::RecognizerSwipe::OnPressedEvent(const AZ::Vector2& screenP //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerSwipe::OnDownEvent([[maybe_unused]] const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } @@ -125,7 +125,7 @@ inline bool Gestures::RecognizerSwipe::OnDownEvent([[maybe_unused]] const AZ::Ve //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerSwipe::OnReleasedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (pointerIndex != m_config.pointerIndex) + if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) { return false; } From fe8f4a772070d1f0c923dc49ac8a1d0ac1f54644 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 12:55:07 -0700 Subject: [PATCH 173/355] typo Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/Plugins/FFMPEGPlugin/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Editor/Plugins/FFMPEGPlugin/main.cpp b/Code/Editor/Plugins/FFMPEGPlugin/main.cpp index fed0ec8678..f7d3dfd57b 100644 --- a/Code/Editor/Plugins/FFMPEGPlugin/main.cpp +++ b/Code/Editor/Plugins/FFMPEGPlugin/main.cpp @@ -24,7 +24,7 @@ PLUGIN_API IPlugin* CreatePluginInstance(PLUGIN_INIT_PARAM* pInitParam) // Make sure the ffmpeg command can be executed before registering the command if (!CFFMPEGPlugin::RuntimeTest()) { - GetIEditor()->GetSystem()->GetILog()->Log("FFMPEG plugin: Failed to execute FFmepg. Please install FFmepg."); + GetIEditor()->GetSystem()->GetILog()->Log("FFMPEG plugin: Failed to execute FFmpeg. Please install FFmpeg."); } else { From 8edcc504bd13c4d9e8ef57abddf1ff17c6e5ff68 Mon Sep 17 00:00:00 2001 From: Junbo Liang <68558268+junbo75@users.noreply.github.com> Date: Tue, 7 Sep 2021 13:02:13 -0700 Subject: [PATCH 174/355] Add AWSI automation tests to a new test suite and pipe (#3913) Signed-off-by: junbo --- .../Gem/PythonTests/AWS/CMakeLists.txt | 4 +-- .../aws_metrics_automation_test.py | 2 +- .../aws_client_auth_automation_test.py | 2 +- .../core/test_aws_resource_interaction.py | 2 +- .../Source/TestImpactCommandLineOptions.cpp | 5 ++-- .../TestImpactTestSequence.h | 3 ++- .../Runtime/Code/Source/TestImpactUtils.cpp | 2 ++ cmake/LYTestWrappers.cmake | 13 ++++++---- ctest_pytest.ini | 1 + .../build/Platform/Linux/build_config.json | 4 +-- .../build/Platform/Windows/build_config.json | 25 ++++++++++++++++--- scripts/ctest/ctest_driver.py | 3 ++- scripts/ctest/sanity_test.py | 4 +++ 13 files changed, 51 insertions(+), 19 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt index a589a395c1..2a5e1d7cab 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/AWS/CMakeLists.txt @@ -17,15 +17,15 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) return() endif() - # Enable after installing NodeJS and CDK on jenkins Windows AMI. ly_add_pytest( NAME AutomatedTesting::AWSTests - TEST_SUITE periodic + TEST_SUITE awsi TEST_SERIAL PATH ${CMAKE_CURRENT_LIST_DIR}/${PAL_PLATFORM_NAME}/ RUNTIME_DEPENDENCIES Legacy::Editor AZ::AssetProcessor + AutomatedTesting.GameLauncher AutomatedTesting.Assets COMPONENT AWS diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py index 061db991cf..1fb35cb9e8 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py @@ -133,7 +133,7 @@ def update_kinesis_analytics_application_status(aws_metrics_utils: pytest.fixtur aws_metrics_utils.stop_kinesis_data_analytics_application( resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsApplicationName')) -@pytest.mark.SUITE_periodic +@pytest.mark.SUITE_awsi @pytest.mark.usefixtures('automatic_process_killer') @pytest.mark.usefixtures('aws_credentials') @pytest.mark.usefixtures('resource_mappings') diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py index b56d3f88f5..198fb934d9 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/client_auth/aws_client_auth_automation_test.py @@ -21,7 +21,7 @@ AWS_CLIENT_AUTH_FEATURE_NAME = 'AWSClientAuth' logger = logging.getLogger(__name__) -@pytest.mark.SUITE_periodic +@pytest.mark.SUITE_awsi @pytest.mark.usefixtures('asset_processor') @pytest.mark.usefixtures('automatic_process_killer') @pytest.mark.usefixtures('aws_utils') diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py index 529151f3f6..949186ad50 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/core/test_aws_resource_interaction.py @@ -74,7 +74,7 @@ def write_test_data_to_dynamodb_table(resource_mappings: pytest.fixture, aws_uti raise -@pytest.mark.SUITE_periodic +@pytest.mark.SUITE_awsi @pytest.mark.usefixtures('automatic_process_killer') @pytest.mark.usefixtures('asset_processor') @pytest.mark.parametrize('feature_name', [AWS_CORE_FEATURE_NAME]) diff --git a/Code/Tools/TestImpactFramework/Frontend/Console/Code/Source/TestImpactCommandLineOptions.cpp b/Code/Tools/TestImpactFramework/Frontend/Console/Code/Source/TestImpactCommandLineOptions.cpp index 0d1f352f21..1bd57e49aa 100644 --- a/Code/Tools/TestImpactFramework/Frontend/Console/Code/Source/TestImpactCommandLineOptions.cpp +++ b/Code/Tools/TestImpactFramework/Frontend/Console/Code/Source/TestImpactCommandLineOptions.cpp @@ -266,7 +266,8 @@ namespace TestImpact { { SuiteTypeAsString(SuiteType::Main), SuiteType::Main }, { SuiteTypeAsString(SuiteType::Periodic), SuiteType::Periodic }, - { SuiteTypeAsString(SuiteType::Sandbox), SuiteType::Sandbox } + { SuiteTypeAsString(SuiteType::Sandbox), SuiteType::Sandbox }, + { SuiteTypeAsString(SuiteType::AWSI), SuiteType::AWSI } }; return ParseMultiStateOption(OptionKeys[SuiteFilterKey], states, cmd).value_or(SuiteType::Main); @@ -472,7 +473,7 @@ namespace TestImpact " available, no prioritization will occur).\n" " -maxconcurrency= The maximum number of concurrent test targets/shards to be in flight at \n" " any given moment.\n" - " -suite= The test suite to select from for this test sequence."; + " -suite= The test suite to select from for this test sequence."; return help; } diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactTestSequence.h b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactTestSequence.h index 38b716398c..0a62b7a004 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactTestSequence.h +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactTestSequence.h @@ -30,7 +30,8 @@ namespace TestImpact { Main = 0, Periodic, - Sandbox + Sandbox, + AWSI }; //! Result of a test sequence that was run. diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp index 993aee9af5..3f6c9dafd4 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp @@ -53,6 +53,8 @@ namespace TestImpact return "periodic"; case SuiteType::Sandbox: return "sandbox"; + case SuiteType::AWSI: + return "awsi"; default: throw(Exception("Unexpected suite type")); } diff --git a/cmake/LYTestWrappers.cmake b/cmake/LYTestWrappers.cmake index 8e71cb3db1..a305f0be38 100644 --- a/cmake/LYTestWrappers.cmake +++ b/cmake/LYTestWrappers.cmake @@ -18,7 +18,7 @@ set(LY_GOOGLETEST_EXTRA_PARAMS CACHE STRING "Allows injection of additional opti find_package(Python REQUIRED MODULE) ly_set(LY_PYTEST_EXECUTABLE ${LY_PYTHON_CMD} -B -m pytest -v --tb=short --show-capture=log -c ${LY_ROOT_FOLDER}/ctest_pytest.ini --build-directory "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$") -ly_set(LY_TEST_GLOBAL_KNOWN_SUITE_NAMES "smoke" "main" "periodic" "benchmark" "sandbox") +ly_set(LY_TEST_GLOBAL_KNOWN_SUITE_NAMES "smoke" "main" "periodic" "benchmark" "sandbox" "awsi") ly_set(LY_TEST_GLOBAL_KNOWN_REQUIREMENTS "gpu") # Set default test aborts to 25 minutes, avoids hitting the CI pipeline inactivity timeout usually set to 30 minutes @@ -71,11 +71,14 @@ endfunction() # \arg:PARENT_NAME(optional) - Name of the parent test run target (if this is a subsequent call to specify a suite) # \arg:TEST_REQUIRES(optional) - List of system resources that are required to run this test. # Only available option is "gpu" -# \arg:TEST_SUITE(optional) - "smoke" or "periodic" or "sandbox" - prevents the test from running normally +# \arg:TEST_SUITE(optional) - "smoke" or "periodic" or "benchmark" or "sandbox" or "awsi" - prevents the test from running normally # and instead places it a special suite of tests that only run when requested. # Otherwise, do not specify a TEST_SUITE value and the default ("main") will apply. +# "smoke" is tiny, quick tests of fundamental operation (tests with no suite marker will also execute here in CI) +# "periodic" is low-priority verification, which should not block code submission # "benchmark" is currently reserved for Google Benchmarks # "sandbox" should be only be used for the workflow of flaky tests +# "awsi" Time consuming AWS integration end-to-end tests # \arg:TIMEOUT (optional) The timeout in seconds for the module. Defaults to LY_TEST_DEFAULT_TIMEOUT. # \arg:TEST_COMMAND - Command which runs the tests. It is a required argument # \arg:NON_IDE_PARAMS - extra params that will be run in ctest, but will not be used in the IDE. @@ -279,7 +282,7 @@ endfunction() # \arg:RUNTIME_DEPENDENCIES (optional) - List of additional runtime dependencies required by this test. # \arg:COMPONENT (optional) - Scope of the feature area that the test belongs to (eg. physics, graphics, etc.). # \arg:EXCLUDE_TEST_RUN_TARGET_FROM_IDE(bool) - If set the test run target will be not be shown in the IDE -# \arg:TEST_SUITE(optional) - "smoke" or "periodic" or "sandbox" - prevents the test from running normally +# \arg:TEST_SUITE(optional) - "smoke" or "periodic" or "sandbox" or "awsi" - prevents the test from running normally # and instead places it a special suite of tests that only run when requested. # \arg:TIMEOUT (optional) The timeout in seconds for the module. If not set defaults to LY_TEST_DEFAULT_TIMEOUT # @@ -331,7 +334,7 @@ endfunction() # \arg:TARGET Name of the target module that is being run for tests. If not provided, will default to 'NAME' # \arg:TEST_REQUIRES(optional) List of system resources that are required to run this test. # Only available option is "gpu" -# \arg:TEST_SUITE(optional) - "smoke" or "periodic" or "sandbox" - prevents the test from running normally +# \arg:TEST_SUITE(optional) - "smoke" or "periodic" or "sandbox" or "awsi" - prevents the test from running normally # and instead places it a special suite of tests that only run when requested. # \arg:TEST_COMMAND(optional) - Command which runs the tests. # If not supplied, a default of "AzTestRunner $ AzRunUnitTests" will be used @@ -372,7 +375,7 @@ function(ly_add_googletest) # will actually run everything in main OR everything tagged as requiring a GPU # instead of only tests tagged with BOTH main and gpu... # so we have to do it this way (negating all others) - set(non_ide_params "--gtest_filter=-*SUITE_smoke*:*SUITE_periodic*:*SUITE_benchmark*:*SUITE_sandbox*") + set(non_ide_params "--gtest_filter=-*SUITE_smoke*:*SUITE_periodic*:*SUITE_benchmark*:*SUITE_sandbox*:*SUITE_awsi*") endif() if(NOT ly_add_googletest_TEST_COMMAND) diff --git a/ctest_pytest.ini b/ctest_pytest.ini index 8365e07988..93310a522d 100644 --- a/ctest_pytest.ini +++ b/ctest_pytest.ini @@ -18,6 +18,7 @@ markers = SUITE_smoke: Tiny, quick tests of fundamental operation (tests with no SUITE_periodic: low-priority verification, which should not block code submission SUITE_benchmark: Benchmarks which do not pass or fail but instead output statistics SUITE_sandbox: Temporarly contains flaky/unstable tests, this should not block code submission. This test suite should be ideally empty + SUITE_awsi: Time consuming AWS integration end-to-end tests # secondary markers which may appear alongisde a suite marker: REQUIRES_gpu: Tests which require a physical GPU # custom markers not listed above will cause pytest to emit a typo warning diff --git a/scripts/build/Platform/Linux/build_config.json b/scripts/build/Platform/Linux/build_config.json index e60b5deee9..e70fa32878 100644 --- a/scripts/build/Platform/Linux/build_config.json +++ b/scripts/build/Platform/Linux/build_config.json @@ -83,7 +83,7 @@ "CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=TRUE -DLY_PARALLEL_LINK_JOBS=4", "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "all", - "CTEST_OPTIONS": "-E Gem::EMotionFX.Editor.Tests -LE SUITE_sandbox -L FRAMEWORK_googletest" + "CTEST_OPTIONS": "-E Gem::EMotionFX.Editor.Tests -LE (SUITE_sandbox|SUITE_awsi) -L FRAMEWORK_googletest" } }, "test_profile_nounity": { @@ -95,7 +95,7 @@ "CMAKE_OPTIONS": "-G 'Ninja Multi-Config' -DCMAKE_C_COMPILER=clang-6.0 -DCMAKE_CXX_COMPILER=clang++-6.0 -DLY_UNITY_BUILD=FALSE -DLY_PARALLEL_LINK_JOBS=4", "CMAKE_LY_PROJECTS": "AutomatedTesting", "CMAKE_TARGET": "all", - "CTEST_OPTIONS": "-E Gem::EMotionFX.Editor.Tests -LE SUITE_sandbox -L FRAMEWORK_googletest" + "CTEST_OPTIONS": "-E Gem::EMotionFX.Editor.Tests -LE (SUITE_sandbox|SUITE_awsi) -L FRAMEWORK_googletest" } }, "asset_profile": { diff --git a/scripts/build/Platform/Windows/build_config.json b/scripts/build/Platform/Windows/build_config.json index 583a73b58b..689ba6935d 100644 --- a/scripts/build/Platform/Windows/build_config.json +++ b/scripts/build/Platform/Windows/build_config.json @@ -213,19 +213,38 @@ "ASSET_PROCESSOR_PLATFORMS": "pc,server" } }, - "periodic_test_profile_vs2019_pipe": { + "awsi_test_profile_vs2019_pipe": { "TAGS": [ "nightly-incremental", "nightly-clean" ], "steps": [ "awsi_deployment", - "periodic_test_profile_vs2019" + "awsi_test_profile_vs2019" ] }, + "awsi_test_profile_vs2019": { + "TAGS": [ + "weekly-build-metrics" + ], + "COMMAND": "build_test_windows.cmd", + "PARAMETERS": { + "CONFIGURATION": "profile", + "OUTPUT_DIRECTORY": "build\\windows_vs2019", + "CMAKE_OPTIONS": "-G \"Visual Studio 16 2019\" -DCMAKE_SYSTEM_VERSION=10.0 -DLY_UNITY_BUILD=TRUE", + "CMAKE_LY_PROJECTS": "AutomatedTesting", + "CMAKE_TARGET": "TEST_SUITE_awsi", + "CMAKE_NATIVE_BUILD_ARGS": "/m /nologo", + "CTEST_OPTIONS": "-L \"(SUITE_awsi)\" -T Test", + "TEST_METRICS": "True", + "TEST_RESULTS": "True" + } + }, "periodic_test_profile_vs2019": { "TAGS": [ - "weekly-build-metrics" + "nightly-incremental", + "nightly-clean", + "weekly-build-metrics" ], "COMMAND": "build_test_windows.cmd", "PARAMETERS": { diff --git a/scripts/ctest/ctest_driver.py b/scripts/ctest/ctest_driver.py index 3fc07921fd..aaad523186 100755 --- a/scripts/ctest/ctest_driver.py +++ b/scripts/ctest/ctest_driver.py @@ -19,7 +19,8 @@ SUITES_AND_DESCRIPTIONS = { "main": "The default set of tests, covers most of all testing.", "periodic": "Tests which can take a long time and should be done periodially instead of every commit - these should not block code submission", "benchmark": "Benchmarks - instead of pass/fail, these collect data for comparison against historic data", - "sandbox": "Flaky/Intermittent failing tests, this is used as a temporary spot to hold flaky tests, this will not block code submission. Ideally, this suite should always be empty" + "sandbox": "Flaky/Intermittent failing tests, this is used as a temporary spot to hold flaky tests, this will not block code submission. Ideally, this suite should always be empty", + "awsi": "Time consuming AWS integration end-to-end tests" } BUILD_CONFIGURATIONS = [ diff --git a/scripts/ctest/sanity_test.py b/scripts/ctest/sanity_test.py index dcbab281bb..2972546c65 100755 --- a/scripts/ctest/sanity_test.py +++ b/scripts/ctest/sanity_test.py @@ -32,6 +32,10 @@ def test_Sanity_Benchmark_Pass(): def test_Sanity_Sandbox_Pass(): pass +@pytest.mark.SUITE_awsi +def test_Sanity_AWSI_Pass(): + pass + @pytest.mark.REQUIRES_gpu def test_Sanity_RequireGpu_Pass(): pass From 12fb91a484ecd473bca49d79ead2a30a24c17857 Mon Sep 17 00:00:00 2001 From: bosnichd Date: Tue, 7 Sep 2021 15:08:39 -0600 Subject: [PATCH 175/355] Fix some debug compile errors introduced by https://github.com/o3de/o3de/pull/3903 Signed-off-by: bosnichd --- Code/Legacy/CryCommon/Cry_Camera.h | 2 - Code/Legacy/CryCommon/Cry_Matrix34.h | 77 ++++++++++++++++++++++++++++ Code/Legacy/CryCommon/Cry_Vector4.h | 2 +- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/Code/Legacy/CryCommon/Cry_Camera.h b/Code/Legacy/CryCommon/Cry_Camera.h index 668d15cbc1..6ccae5bce1 100644 --- a/Code/Legacy/CryCommon/Cry_Camera.h +++ b/Code/Legacy/CryCommon/Cry_Camera.h @@ -279,8 +279,6 @@ inline void CCamera::SetFrustum(int nWidth, int nHeight, f32 FOV, f32 nearplane, m_edge_plt.y = projLeftTopY; m_edge_plt.z = projLeftTopZ; - assert(fabs(acos_tpl(Vec3d(0, m_edge_plt.y, m_edge_plt.z).GetNormalized().y) * 2 - m_fov) < 0.001); - float invProjLeftTopY = 1.0f / projLeftTopY; //Apply asym shift to the camera frustum - Necessary for properly culling tessellated objects in VR diff --git a/Code/Legacy/CryCommon/Cry_Matrix34.h b/Code/Legacy/CryCommon/Cry_Matrix34.h index 8dcb48cf6a..eb9c22086b 100644 --- a/Code/Legacy/CryCommon/Cry_Matrix34.h +++ b/Code/Legacy/CryCommon/Cry_Matrix34.h @@ -587,6 +587,30 @@ struct Matrix34_tpl m22 = m33.m22; } + //check if we have an orthonormal-base (general case, works even with reflection matrices) + int IsOrthonormal(F threshold = 0.001) const + { + f32 d0 = fabs_tpl(GetColumn0() | GetColumn1()); + if (d0 > threshold) + { + return 0; + } + f32 d1 = fabs_tpl(GetColumn0() | GetColumn2()); + if (d1 > threshold) + { + return 0; + } + f32 d2 = fabs_tpl(GetColumn1() | GetColumn2()); + if (d2 > threshold) + { + return 0; + } + int a = (fabs_tpl(1 - (GetColumn0() | GetColumn0()))) < threshold; + int b = (fabs_tpl(1 - (GetColumn1() | GetColumn1()))) < threshold; + int c = (fabs_tpl(1 - (GetColumn2() | GetColumn2()))) < threshold; + return a & b & c; + } + //check if we have an orthonormal-base (assuming we are using a right-handed coordinate system) int IsOrthonormalRH(F threshold = 0.001) const { @@ -604,6 +628,59 @@ struct Matrix34_tpl ); } + bool IsValid() const + { + if (!NumberValid(m00)) + { + return false; + } + if (!NumberValid(m01)) + { + return false; + } + if (!NumberValid(m02)) + { + return false; + } + if (!NumberValid(m03)) + { + return false; + } + if (!NumberValid(m10)) + { + return false; + } + if (!NumberValid(m11)) + { + return false; + } + if (!NumberValid(m12)) + { + return false; + } + if (!NumberValid(m13)) + { + return false; + } + if (!NumberValid(m20)) + { + return false; + } + if (!NumberValid(m21)) + { + return false; + } + if (!NumberValid(m22)) + { + return false; + } + if (!NumberValid(m23)) + { + return false; + } + return true; + } + /*! * Create a matrix with SCALING, ROTATION and TRANSLATION (in this order). * diff --git a/Code/Legacy/CryCommon/Cry_Vector4.h b/Code/Legacy/CryCommon/Cry_Vector4.h index 2b1af84c54..ddb4bf5ffe 100644 --- a/Code/Legacy/CryCommon/Cry_Vector4.h +++ b/Code/Legacy/CryCommon/Cry_Vector4.h @@ -27,7 +27,7 @@ struct Vec4 f32 x, y, z, w; #if defined(_DEBUG) - ILINE Vec4_tpl() + ILINE Vec4() { if constexpr (sizeof(f32) == 4) { From d0b7ffab67f4f9e7ad44016eb878cf96a5fabab9 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 7 Sep 2021 14:27:00 -0700 Subject: [PATCH 176/355] Changed parameter names to reflect the recursive nature of functions and some more changes Signed-off-by: srikappa-amzn --- Code/Editor/EditorPreferencesPageGeneral.cpp | 16 ++--- Code/Editor/EditorPreferencesPageGeneral.h | 6 +- Code/Editor/Settings.cpp | 6 +- Code/Editor/Settings.h | 4 +- .../Prefab/PrefabSystemComponent.cpp | 27 ++++---- .../Prefab/PrefabSystemComponent.h | 8 +-- .../Prefab/PrefabSystemComponentInterface.h | 12 ++-- .../UI/Prefab/PrefabIntegrationManager.cpp | 64 +++++++++++-------- 8 files changed, 76 insertions(+), 67 deletions(-) diff --git a/Code/Editor/EditorPreferencesPageGeneral.cpp b/Code/Editor/EditorPreferencesPageGeneral.cpp index 2b044e800a..95b3bc4c50 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageGeneral.cpp @@ -42,9 +42,9 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->Field("EnableSceneInspector", &GeneralSettings::m_enableSceneInspector) ->Field("RestoreViewportCamera", &GeneralSettings::m_restoreViewportCamera); - serialize.Class() + serialize.Class() ->Version(1) - ->Field("SaveAllPrefabsPreference", &GlobalSaveSettings::m_saveAllPrefabsPreference); + ->Field("SaveAllPrefabsPreference", &LevelSaveSettings::m_saveAllPrefabsPreference); serialize.Class() ->Version(2) @@ -68,7 +68,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) serialize.Class() ->Version(1) ->Field("General Settings", &CEditorPreferencesPage_General::m_generalSettings) - ->Field("Global Save Settings", &CEditorPreferencesPage_General::m_globalSaveSettings) + ->Field("Level Save Settings", &CEditorPreferencesPage_General::m_levelSaveSettings) ->Field("Messaging", &CEditorPreferencesPage_General::m_messaging) ->Field("Undo", &CEditorPreferencesPage_General::m_undo) ->Field("Deep Selection", &CEditorPreferencesPage_General::m_deepSelection) @@ -97,9 +97,9 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_restoreViewportCamera, EditorPreferencesGeneralRestoreViewportCameraSettingName, "Keep the original editor viewport transform when exiting game mode.") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &GeneralSettings::m_enableSceneInspector, "Enable Scene Inspector (EXPERIMENTAL)", "Enable the option to inspect the internal data loaded from scene files like .fbx. This is an experimental feature. Restart the Scene Settings if the option is not visible under the Help menu."); - editContext->Class("Global Save Settings", "") + editContext->Class("Level Save Settings", "") ->DataElement( - AZ::Edit::UIHandlers::ComboBox, &GlobalSaveSettings::m_saveAllPrefabsPreference, "Save Prefabs Preference", + AZ::Edit::UIHandlers::ComboBox, &LevelSaveSettings::m_saveAllPrefabsPreference, "Save All Prefabs Preference", "This option controls whether prefabs should be saved along with the level") ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime, "Ask every time") ->EnumAttribute(AzToolsFramework::Prefab::SaveAllPrefabsPreference::SaveAll, "Save all") @@ -128,7 +128,7 @@ void CEditorPreferencesPage_General::Reflect(AZ::SerializeContext& serialize) ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_generalSettings, "General Settings", "General Editor Preferences") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_globalSaveSettings, "Global Save Settings", "Global Save Settings (File>Save & Ctrl+S)") + ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_levelSaveSettings, "Level Save Settings", "File>Save") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_messaging, "Messaging", "Messaging") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_undo, "Undo", "Undo Preferences") ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_General::m_deepSelection, "Selection", "Selection") @@ -176,7 +176,7 @@ void CEditorPreferencesPage_General::OnApply() } //prefabs - gSettings.globalSaveSettings.saveAllPrefabsPreference = m_globalSaveSettings.m_saveAllPrefabsPreference; + gSettings.levelSaveSettings.saveAllPrefabsPreference = m_levelSaveSettings.m_saveAllPrefabsPreference; //undo gSettings.undoLevels = m_undo.m_undoLevels; @@ -208,7 +208,7 @@ void CEditorPreferencesPage_General::InitializeSettings() m_generalSettings.m_toolbarIconSize = static_cast(gSettings.gui.nToolbarIconSize); //prefabs - m_globalSaveSettings.m_saveAllPrefabsPreference = gSettings.globalSaveSettings.saveAllPrefabsPreference; + m_levelSaveSettings.m_saveAllPrefabsPreference = gSettings.levelSaveSettings.saveAllPrefabsPreference; //Messaging m_messaging.m_showDashboard = gSettings.bShowDashboardAtStartup; diff --git a/Code/Editor/EditorPreferencesPageGeneral.h b/Code/Editor/EditorPreferencesPageGeneral.h index e5888b2705..01700dea88 100644 --- a/Code/Editor/EditorPreferencesPageGeneral.h +++ b/Code/Editor/EditorPreferencesPageGeneral.h @@ -58,9 +58,9 @@ private: bool m_enableSceneInspector; }; - struct GlobalSaveSettings + struct LevelSaveSettings { - AZ_TYPE_INFO(GlobalSaveSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); + AZ_TYPE_INFO(LevelSaveSettings, "{E297DAE3-3985-4BC2-8B43-45F3B1522F6B}"); AzToolsFramework::Prefab::SaveAllPrefabsPreference m_saveAllPrefabsPreference; }; @@ -96,7 +96,7 @@ private: }; GeneralSettings m_generalSettings; - GlobalSaveSettings m_globalSaveSettings; + LevelSaveSettings m_levelSaveSettings; Messaging m_messaging; Undo m_undo; DeepSelection m_deepSelection; diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 92617248d3..81182c0a20 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -254,7 +254,7 @@ SEditorSettings::SEditorSettings() g_TemporaryLevelName = nullptr; sliceSettings.dynamicByDefault = false; - globalSaveSettings.saveAllPrefabsPreference = AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime; + levelSaveSettings.saveAllPrefabsPreference = AzToolsFramework::Prefab::SaveAllPrefabsPreference::AskEveryTime; } void SEditorSettings::Connect() @@ -671,7 +671,7 @@ void SEditorSettings::Save() AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = AZ::Interface::Get(); - prefabLoaderInterface->SetSaveAllPrefabsPreference(globalSaveSettings.saveAllPrefabsPreference); + prefabLoaderInterface->SetSaveAllPrefabsPreference(levelSaveSettings.saveAllPrefabsPreference); SaveSettingsRegistryFile(); } @@ -681,7 +681,7 @@ void SEditorSettings::Load() { AzToolsFramework::Prefab::PrefabLoaderInterface* prefabLoaderInterface = AZ::Interface::Get(); - globalSaveSettings.saveAllPrefabsPreference = prefabLoaderInterface->GetSaveAllPrefabsPreference(); + levelSaveSettings.saveAllPrefabsPreference = prefabLoaderInterface->GetSaveAllPrefabsPreference(); // Load from Settings Registry AzFramework::ApplicationRequests::Bus::BroadcastResult( diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index fca3480241..8f94e482d3 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -231,7 +231,7 @@ struct SSliceSettings bool dynamicByDefault; }; -struct SGlobalSaveSettings +struct SLevelSaveSettings { AzToolsFramework::Prefab::SaveAllPrefabsPreference saveAllPrefabsPreference; }; @@ -472,7 +472,7 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING SSliceSettings sliceSettings; - SGlobalSaveSettings globalSaveSettings; + SLevelSaveSettings levelSaveSettings; bool prefabSystem = true; ///< Toggle to enable/disable the Prefab system for level entities. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 9059bf5368..5863ccfbf9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -370,7 +370,7 @@ namespace AzToolsFramework PrefabDom& PrefabSystemComponent::FindTemplateDom(TemplateId templateId) { AZStd::optional> findTemplateResult = FindTemplate(templateId); - AZ_Assert(findTemplateResult.has_value(), + AZ_Assert(false, "PrefabSystemComponent::FindTemplateDom - Unable to retrieve Prefab template with id: '%llu'. " "Template could not be found", templateId); @@ -754,17 +754,17 @@ namespace AzToolsFramework } } - bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId templateId) + bool PrefabSystemComponent::AreDirtyTemplatesPresent(TemplateId rootTemplateId) { - TemplateReference prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(rootTemplateId); if (!prefabTemplate.has_value()) { - AZ_Assert(false, "Template with id %llu is not found", templateId); + AZ_Assert(false, "Template with id %llu is not found", rootTemplateId); return false; } - if (IsTemplateDirty(templateId)) + if (IsTemplateDirty(rootTemplateId)) { return true; } @@ -782,9 +782,9 @@ namespace AzToolsFramework return false; } - void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId templateId) + void PrefabSystemComponent::SaveAllDirtyTemplates(TemplateId rootTemplateId) { - AZStd::set dirtyTemplatePaths = GetDirtyTemplatePaths(templateId); + AZStd::set dirtyTemplatePaths = GetDirtyTemplatePaths(rootTemplateId); for (AZ::IO::PathView dirtyTemplatePath : dirtyTemplatePaths) { @@ -800,26 +800,27 @@ namespace AzToolsFramework } } - AZStd::set PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId templateId) + AZStd::set PrefabSystemComponent::GetDirtyTemplatePaths(TemplateId rootTemplateId) { AZStd::vector dirtyTemplatePathVector; - GetDirtyTemplatePathsHelper(templateId, dirtyTemplatePathVector); + GetDirtyTemplatePathsHelper(rootTemplateId, dirtyTemplatePathVector); AZStd::set dirtyTemplatePaths; dirtyTemplatePaths.insert(dirtyTemplatePathVector.begin(), dirtyTemplatePathVector.end()); return AZStd::move(dirtyTemplatePaths); } - void PrefabSystemComponent::GetDirtyTemplatePathsHelper(TemplateId templateId, AZStd::vector& dirtyTemplatePaths) + void PrefabSystemComponent::GetDirtyTemplatePathsHelper( + TemplateId rootTemplateId, AZStd::vector& dirtyTemplatePaths) { - TemplateReference prefabTemplate = FindTemplate(templateId); + TemplateReference prefabTemplate = FindTemplate(rootTemplateId); if (!prefabTemplate.has_value()) { - AZ_Assert(false, "Template with id %llu is not found", templateId); + AZ_Assert(false, "Template with id %llu is not found", rootTemplateId); return; } - if (IsTemplateDirty(templateId)) + if (IsTemplateDirty(rootTemplateId)) { dirtyTemplatePaths.emplace_back(prefabTemplate->get().GetFilePath()); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index a09edfe03a..04bcee2961 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -183,11 +183,11 @@ namespace AzToolsFramework */ void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) override; - bool AreDirtyTemplatesPresent(TemplateId templateId) override; + bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) override; - void SaveAllDirtyTemplates(TemplateId templateId) override; + void SaveAllDirtyTemplates(TemplateId rootTemplateId) override; - AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) override; + AZStd::set GetDirtyTemplatePaths(TemplateId rootTemplateId) override; ////////////////////////////////////////////////////////////////////////// @@ -342,7 +342,7 @@ namespace AzToolsFramework bool RemoveLinkFromTargetTemplate(const LinkId& linkId, const Link& link); // Helper function for GetDirtyTemplatePaths(). It uses vector to speed up iteration times. - void GetDirtyTemplatePathsHelper(TemplateId parentTemplateId, AZStd::vector& dirtyTemplatePaths); + void GetDirtyTemplatePathsHelper(TemplateId rootTemplateId, AZStd::vector& dirtyTemplatePaths); // A container for mapping Templates to the Links they may propagate changes to. AZStd::unordered_map> m_templateToLinkIdsMap; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index 72b8fad162..ae66700728 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -52,17 +52,17 @@ namespace AzToolsFramework virtual void SetTemplateDirtyFlag(const TemplateId& templateId, bool dirty) = 0; //! Recursive function to check if the template is dirty or if any dirty templates are presents in the links of the template. - //! @param templateId The id of the template provided as the beginning template to check the outgoing links. - virtual bool AreDirtyTemplatesPresent(TemplateId templateId) = 0; + //! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links. + virtual bool AreDirtyTemplatesPresent(TemplateId rootTemplateId) = 0; //! Recursive function to save if the template is dirty and save all the dirty templates in the links of the template. - //! @param templateId The id of the template provided as the beginning template to check the outgoing links. - virtual void SaveAllDirtyTemplates(TemplateId templateId) = 0; + //! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links. + virtual void SaveAllDirtyTemplates(TemplateId rootTemplateId) = 0; //! Recursive function that fetches the set of dirty templates given a starting template to check for outgoing links. - //! @param templateId The id of the template provided as the beginning template to check the outgoing links. + //! @param rootTemplateId The id of the template provided as the beginning template to check the outgoing links. //! @return The set of dirty template paths populated. - virtual AZStd::set GetDirtyTemplatePaths(TemplateId parentTemplateId) = 0; + virtual AZStd::set GetDirtyTemplatePaths(TemplateId rootTemplateId) = 0; virtual PrefabDom& FindTemplateDom(TemplateId templateId) = 0; virtual void UpdatePrefabTemplate(TemplateId templateId, const PrefabDom& updatedDom) = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index e82e8fa0ca..6b67f94582 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1088,16 +1088,21 @@ namespace AzToolsFramework int PrefabIntegrationManager::ExecuteClosePrefabDialog(TemplateId templateId) { - auto prefabSaveSelectionDialog = ConstructClosePrefabDialog(templateId); - - int prefabSaveSelection = prefabSaveSelectionDialog->exec(); - - if (prefabSaveSelection == QDialog::Accepted) + if (s_prefabSystemComponentInterface->AreDirtyTemplatesPresent(templateId)) { - SavePrefabsInDialog(prefabSaveSelectionDialog.get()); + auto prefabSaveSelectionDialog = ConstructClosePrefabDialog(templateId); + + int prefabSaveSelection = prefabSaveSelectionDialog->exec(); + + if (prefabSaveSelection == QDialog::Accepted) + { + SavePrefabsInDialog(prefabSaveSelectionDialog.get()); + } + + return prefabSaveSelection; } - return prefabSaveSelection; + return QDialogButtonBox::DestructiveRole; } void PrefabIntegrationManager::ExecuteSavePrefabDialog(TemplateId templateId, bool useSaveAllPrefabsPreference) @@ -1114,29 +1119,32 @@ namespace AzToolsFramework } } - if (useSaveAllPrefabsPreference) + if (s_prefabSystemComponentInterface->AreDirtyTemplatesPresent(templateId)) { - SaveAllPrefabsPreference saveAllPrefabsPreference = s_prefabLoaderInterface->GetSaveAllPrefabsPreference(); - - if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveAll) + if (useSaveAllPrefabsPreference) { - s_prefabSystemComponentInterface->SaveAllDirtyTemplates(templateId); - return; + SaveAllPrefabsPreference saveAllPrefabsPreference = s_prefabLoaderInterface->GetSaveAllPrefabsPreference(); + + if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveAll) + { + s_prefabSystemComponentInterface->SaveAllDirtyTemplates(templateId); + return; + } + else if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveNone) + { + return; + } } - else if (saveAllPrefabsPreference == SaveAllPrefabsPreference::SaveNone) - { - return; - } - } - AZStd::unique_ptr savePrefabDialog = ConstructSavePrefabDialog(templateId, useSaveAllPrefabsPreference); - if (savePrefabDialog) - { - int prefabSaveSelection = savePrefabDialog->exec(); - - if (prefabSaveSelection == QDialog::Accepted) + AZStd::unique_ptr savePrefabDialog = ConstructSavePrefabDialog(templateId, useSaveAllPrefabsPreference); + if (savePrefabDialog) { - SavePrefabsInDialog(savePrefabDialog.get()); + int prefabSaveSelection = savePrefabDialog->exec(); + + if (prefabSaveSelection == QDialog::Accepted) + { + SavePrefabsInDialog(savePrefabDialog.get()); + } } } } @@ -1152,7 +1160,7 @@ namespace AzToolsFramework AzToolsFramework::Prefab::TemplateId unsavedPrefabTemplateId = s_prefabSystemComponentInterface->GetTemplateIdFromFilePath(unsavedPrefabFileName.data()); bool isTemplateSavedSuccessfully = s_prefabLoaderInterface->SaveTemplate(unsavedPrefabTemplateId); - AZ_Assert(isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str()); + AZ_Error("Prefab", isTemplateSavedSuccessfully, "Prefab '%s' could not be saved successfully.", unsavedPrefabFileName.c_str()); } } } @@ -1222,6 +1230,7 @@ namespace AzToolsFramework connect(prefabSaveConfirmationButtons, &QDialogButtonBox::rejected, savePrefabDialog.get(), &QDialog::reject); AzQtComponents::StyleManager::setStyleSheet(savePrefabDialog->parentWidget(), QStringLiteral("style:Editor.qss")); + savePrefabDialog->setLayout(contentLayout); return AZStd::move(savePrefabDialog); } @@ -1251,8 +1260,6 @@ namespace AzToolsFramework levelEntitiesSaveQuestionLayout->addWidget(prefabSaveQuestionLabel); contentLayout->addWidget(prefabSaveWarningFrame); - AZStd::set dirtyTemplatePaths = s_prefabSystemComponentInterface->GetDirtyTemplatePaths(templateId); - auto templateToSave = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path templateToSaveFilePath = templateToSave->get().GetFilePath(); AZStd::unique_ptr unsavedPrefabsCard = ConstructUnsavedPrefabsCard(templateId); @@ -1276,6 +1283,7 @@ namespace AzToolsFramework closePrefabDialogWeakPtr.lock()->done(prefabSaveSelection); }); AzQtComponents::StyleManager::setStyleSheet(closePrefabDialog.get(), QStringLiteral("style:Editor.qss")); + closePrefabDialog->setLayout(contentLayout); return closePrefabDialog; } From 0f1e117904730637f9ae09a5d88cd0234ec5a223 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Tue, 7 Sep 2021 14:32:13 -0700 Subject: [PATCH 177/355] Reverted a small local change that got pushed by mistake Signed-off-by: srikappa-amzn --- .../AzToolsFramework/Prefab/PrefabSystemComponent.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 5863ccfbf9..76254b6717 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -370,9 +370,11 @@ namespace AzToolsFramework PrefabDom& PrefabSystemComponent::FindTemplateDom(TemplateId templateId) { AZStd::optional> findTemplateResult = FindTemplate(templateId); - AZ_Assert(false, + AZ_Assert( + findTemplateResult.has_value(), "PrefabSystemComponent::FindTemplateDom - Unable to retrieve Prefab template with id: '%llu'. " - "Template could not be found", templateId); + "Template could not be found", + templateId); AZ_Assert(findTemplateResult->get().IsValid(), "PrefabSystemComponent::FindTemplateDom - Unable to retrieve Prefab template with id: '%llu'. " From 5c0bbe7ac1f659c39dae36fbbe2fcbadbc2e716c Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Tue, 7 Sep 2021 14:32:24 -0700 Subject: [PATCH 178/355] add SC cvar settings cache Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Code/Builder/ScriptCanvasBuilderWorker.cpp | 7 ------- .../Tools/UpgradeTool/VersionExplorer.cpp | 8 +++++--- .../Tools/UpgradeTool/VersionExplorer.h | 2 ++ .../Grammar/PrimitivesDeclarations.cpp | 18 ++++++++++++++++++ .../Grammar/PrimitivesDeclarations.h | 16 ++++++++++++++++ 5 files changed, 41 insertions(+), 10 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp index ecb28b60c6..f474c10532 100644 --- a/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp +++ b/Gems/ScriptCanvas/Code/Builder/ScriptCanvasBuilderWorker.cpp @@ -314,13 +314,6 @@ namespace ScriptCanvasBuilder } else { - // force load all dependencies into memory -// for (auto& dependency : m_processEditorAssetDependencies) -// { -// auto depAsset = AZ::Data::AssetManager::Instance().GetAsset(dependency.m_assetId, dependency.m_assetType, AZ::Data::AssetLoadBehavior::PreLoad); -// depAsset.BlockUntilLoadComplete(); -// } - AZ::Entity* buildEntity = asset.Get()->GetScriptCanvasEntity(); ProcessTranslationJobInput input; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index e7d1445e74..280bdbcf1d 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -218,6 +218,7 @@ namespace ScriptCanvasEditor m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset); m_inProgress = false; m_state = ProcessState::Inactive; + m_settingsCache.reset(); AZ::SystemTickBus::Handler::BusDisconnect(); AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); } @@ -277,7 +278,7 @@ namespace ScriptCanvasEditor void VersionExplorer::OnUpgradeAll() { m_state = ProcessState::Upgrade; - // cache these...with a widget thing + m_settingsCache = AZStd::make_unique(); ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; ScriptCanvas::Grammar::g_printAbstractCodeModel = false; ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; @@ -693,6 +694,7 @@ namespace ScriptCanvasEditor AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); UpgradeNotifications::Bus::Handler::BusDisconnect(); AZ::Interface::Get()->SetIsUpgrading(false); + m_settingsCache.reset(); } // Scanning @@ -712,8 +714,7 @@ namespace ScriptCanvasEditor void VersionExplorer::DoScan() { m_state = ProcessState::Scan; - // cache pre-tool values (make a little widget that does that, actually - // so one can destroy it and reset it + m_settingsCache = AZStd::make_unique(); ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; ScriptCanvas::Grammar::g_printAbstractCodeModel = false; ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false; @@ -938,6 +939,7 @@ namespace ScriptCanvasEditor UpgradeNotifications::Bus::Handler::BusDisconnect(); m_keepEditorAlive.reset(); + m_settingsCache.reset(); m_state = ProcessState::Inactive; } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h index bcde6fbbd0..acb28a7dba 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h @@ -135,6 +135,8 @@ namespace ScriptCanvasEditor AZStd::unique_ptr m_ui; + AZStd::unique_ptr m_settingsCache; + // upgrade fields AZStd::recursive_mutex m_mutex; bool m_upgradeComplete = false; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp index 4878dfdc6c..14f7a926b1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.cpp @@ -17,5 +17,23 @@ namespace ScriptCanvas AZ_CVAR(bool, g_printAbstractCodeModelAtPrefabTime, false, {}, AZ::ConsoleFunctorFlags::Null, "Print out the Abstract Code Model at the end of parsing (at prefab time) for debug purposes."); AZ_CVAR(bool, g_saveRawTranslationOuputToFile, true, {}, AZ::ConsoleFunctorFlags::Null, "Save out the raw result of translation for debug purposes."); AZ_CVAR(bool, g_saveRawTranslationOuputToFileAtPrefabTime, false, {}, AZ::ConsoleFunctorFlags::Null, "Save out the raw result of translation (at prefab time) for debug purposes."); + + SettingsCache::SettingsCache() + { + m_disableParseOnGraphValidation = g_disableParseOnGraphValidation; + m_printAbstractCodeModel = g_printAbstractCodeModel; + m_printAbstractCodeModelAtPrefabTime = g_printAbstractCodeModelAtPrefabTime; + m_saveRawTranslationOuputToFile = g_saveRawTranslationOuputToFile; + m_saveRawTranslationOuputToFileAtPrefabTime = g_saveRawTranslationOuputToFileAtPrefabTime; + } + + SettingsCache::~SettingsCache() + { + g_disableParseOnGraphValidation = m_disableParseOnGraphValidation; + g_printAbstractCodeModel = m_printAbstractCodeModel; + g_printAbstractCodeModelAtPrefabTime = m_printAbstractCodeModelAtPrefabTime; + g_saveRawTranslationOuputToFile = m_saveRawTranslationOuputToFile; + g_saveRawTranslationOuputToFileAtPrefabTime = m_saveRawTranslationOuputToFileAtPrefabTime; + } } } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h index 16befe79b0..a6ce31d6e7 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Grammar/PrimitivesDeclarations.h @@ -248,6 +248,22 @@ namespace ScriptCanvas AZ_CVAR_EXTERNED(bool, g_saveRawTranslationOuputToFile); AZ_CVAR_EXTERNED(bool, g_saveRawTranslationOuputToFileAtPrefabTime); + class SettingsCache + { + public: + AZ_CLASS_ALLOCATOR(SettingsCache, AZ::SystemAllocator, 0); + + SettingsCache(); + ~SettingsCache(); + + private: + bool m_disableParseOnGraphValidation; + bool m_printAbstractCodeModel; + bool m_printAbstractCodeModelAtPrefabTime; + bool m_saveRawTranslationOuputToFile; + bool m_saveRawTranslationOuputToFileAtPrefabTime; + }; + struct DependencyInfo { AZ::Data::AssetId assetId; From 5f95c41eb5e21a83d47ed5a03ac34092142ab8e3 Mon Sep 17 00:00:00 2001 From: dmcdiar Date: Tue, 7 Sep 2021 15:52:03 -0700 Subject: [PATCH 179/355] Added RayTracingPass support for the Scene Srg. Signed-off-by: dmcdiar --- .../Common/Code/Source/RayTracing/RayTracingPass.cpp | 10 +++++++++- .../Common/Code/Source/RayTracing/RayTracingPass.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.cpp b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.cpp index 4e84187165..af17e3a1da 100644 --- a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.cpp @@ -115,10 +115,13 @@ namespace AZ AZ_Assert(m_shaderResourceGroup, "RayTracingPass [%s]: Failed to create RayTracingGlobalSrg", GetPathName().GetCStr()); RPI::PassUtils::BindDataMappingsToSrg(m_passDescriptor, m_shaderResourceGroup.get()); - // check to see if the shader requires the View and RayTracingMaterial Srgs + // check to see if the shader requires the View, Scene, or RayTracingMaterial Srgs const auto& viewSrgLayout = m_rayGenerationShader->FindShaderResourceGroupLayout(RPI::SrgBindingSlot::View); m_requiresViewSrg = (viewSrgLayout != nullptr); + const auto& sceneSrgLayout = m_rayGenerationShader->FindShaderResourceGroupLayout(RPI::SrgBindingSlot::Scene); + m_requiresSceneSrg = (sceneSrgLayout != nullptr); + const auto& rayTracingMaterialSrgLayout = m_rayGenerationShader->FindShaderResourceGroupLayout(RayTracingMaterialSrgBindingSlot); m_requiresRayTracingMaterialSrg = (rayTracingMaterialSrgLayout != nullptr); @@ -324,6 +327,11 @@ namespace AZ } } + if (m_requiresSceneSrg) + { + shaderResourceGroups.push_back(scene->GetShaderResourceGroup()->GetRHIShaderResourceGroup()); + } + if (m_requiresRayTracingMaterialSrg) { shaderResourceGroups.push_back(rayTracingFeatureProcessor->GetRayTracingMaterialSrg()->GetRHIShaderResourceGroup()); diff --git a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.h b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.h index 5eafa5b2f4..6ef97e0f10 100644 --- a/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/RayTracing/RayTracingPass.h @@ -72,6 +72,7 @@ namespace AZ RHI::ConstPtr m_globalPipelineState; RHI::Ptr m_rayTracingShaderTable; bool m_requiresViewSrg = false; + bool m_requiresSceneSrg = false; bool m_requiresRayTracingMaterialSrg = false; }; } // namespace RPI From 6b13e8bfc8c600660c7ce970434f6311c6af0d04 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 16:11:48 -0700 Subject: [PATCH 180/355] Enabling PreFast to find virtual/override issues, some better organization of files Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/LYTestWrappers.cmake | 2 +- cmake/Platform/Common/MSVC/CodeAnalysis.ruleset | 7 +++++++ cmake/Platform/Common/MSVC/Configurations_msvc.cmake | 2 +- cmake/Platform/Common/{ => MSVC}/Directory.Build.props | 3 ++- cmake/Platform/Common/{ => MSVC}/TestProject.props | 0 cmake/Platform/Common/{ => MSVC}/VisualStudio_common.cmake | 0 cmake/Platform/Windows/platform_windows_files.cmake | 6 ++++-- 7 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 cmake/Platform/Common/MSVC/CodeAnalysis.ruleset rename cmake/Platform/Common/{ => MSVC}/Directory.Build.props (91%) rename cmake/Platform/Common/{ => MSVC}/TestProject.props (100%) rename cmake/Platform/Common/{ => MSVC}/VisualStudio_common.cmake (100%) diff --git a/cmake/LYTestWrappers.cmake b/cmake/LYTestWrappers.cmake index 8e71cb3db1..f319d19763 100644 --- a/cmake/LYTestWrappers.cmake +++ b/cmake/LYTestWrappers.cmake @@ -228,7 +228,7 @@ function(ly_add_test) # For test projects that are custom targets, pass a props file that sets the project as "Console" so # it leaves the console open when it finishes - set_target_properties(${unaliased_test_name} PROPERTIES VS_USER_PROPS "${LY_ROOT_FOLDER}/cmake/Platform/Common/TestProject.props") + set_target_properties(${unaliased_test_name} PROPERTIES VS_USER_PROPS "${LY_ROOT_FOLDER}/cmake/Platform/Common/MSVC/TestProject.props") # Include additional dependencies if (ly_add_test_RUNTIME_DEPENDENCIES) diff --git a/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset b/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset new file mode 100644 index 0000000000..a612135e94 --- /dev/null +++ b/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index f10ef844a4..c613b79d87 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -13,7 +13,7 @@ endif() unset(minimum_supported_toolset) include(cmake/Platform/Common/Configurations_common.cmake) -include(cmake/Platform/Common/VisualStudio_common.cmake) +include(cmake/Platform/Common/MSVC/VisualStudio_common.cmake) # Verify that it wasn't invoked with an unsupported target/host architecture. Currently only supports x64/x64 if(CMAKE_VS_PLATFORM_NAME AND NOT CMAKE_VS_PLATFORM_NAME STREQUAL "x64") diff --git a/cmake/Platform/Common/Directory.Build.props b/cmake/Platform/Common/MSVC/Directory.Build.props similarity index 91% rename from cmake/Platform/Common/Directory.Build.props rename to cmake/Platform/Common/MSVC/Directory.Build.props index 76e4b28922..4b82cd7048 100644 --- a/cmake/Platform/Common/Directory.Build.props +++ b/cmake/Platform/Common/MSVC/Directory.Build.props @@ -14,6 +14,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT @VCPKG_CONFIGURATION_MAPPING@ false + @LY_ROOT_FOLDER@\cmake\Platform\Common\MSVC\CodeAnalysis.ruleset @@ -25,4 +26,4 @@ SPDX-License-Identifier: Apache-2.0 OR MIT - \ No newline at end of file + diff --git a/cmake/Platform/Common/TestProject.props b/cmake/Platform/Common/MSVC/TestProject.props similarity index 100% rename from cmake/Platform/Common/TestProject.props rename to cmake/Platform/Common/MSVC/TestProject.props diff --git a/cmake/Platform/Common/VisualStudio_common.cmake b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake similarity index 100% rename from cmake/Platform/Common/VisualStudio_common.cmake rename to cmake/Platform/Common/MSVC/VisualStudio_common.cmake diff --git a/cmake/Platform/Windows/platform_windows_files.cmake b/cmake/Platform/Windows/platform_windows_files.cmake index a1e26bd992..fcc47ab6eb 100644 --- a/cmake/Platform/Windows/platform_windows_files.cmake +++ b/cmake/Platform/Windows/platform_windows_files.cmake @@ -7,10 +7,12 @@ # set(FILES - ../Common/Directory.Build.props - ../Common/VisualStudio_common.cmake ../Common/Configurations_common.cmake ../Common/MSVC/Configurations_msvc.cmake + ../Common/MSVC/CodeAnalysis.ruleset + ../Common/MSVC/Directory.Build.props + ../Common/MSVC/TestProject.props + ../Common/MSVC/VisualStudio_common.cmake ../Common/Install_common.cmake ../Common/LYWrappers_default.cmake ../Common/TargetIncludeSystemDirectories_unsupported.cmake From f30ac7204036a35f297f6f567961e2c5301541b3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 16:14:52 -0700 Subject: [PATCH 181/355] fixing AzCore for linux/windows virtual warn Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/Component/ComponentApplication.h | 16 +++---- .../AzCore/Debug/TraceMessagesDriller.h | 20 ++++---- Code/Framework/AzCore/AzCore/Driller/Stream.h | 8 ++-- .../AzCore/AzCore/IO/CompressorZLib.h | 16 +++---- .../AzCore/AzCore/Jobs/Internal/JobNotify.h | 2 +- .../AzCore/AzCore/Math/InterpolationSample.h | 8 ++-- .../AzCore/AzCore/Memory/HeapSchema.h | 20 ++++---- .../AzCore/AzCore/Memory/HphaSchema.h | 22 ++++----- .../AzCore/AzCore/Memory/MallocSchema.h | 20 ++++---- .../AzCore/AzCore/Memory/MemoryDriller.h | 24 +++++----- .../AzCore/Memory/OverrunDetectionAllocator.h | 20 ++++---- Code/Framework/AzCore/AzCore/Module/Module.h | 2 +- .../AzCore/AzCore/RTTI/BehaviorContext.h | 4 +- Code/Framework/AzCore/AzCore/RTTI/RTTI.h | 47 +++++++------------ .../Serialization/Json/JsonSystemComponent.h | 4 +- .../UserSettings/UserSettingsProvider.h | 6 +-- .../AzCore/AzCore/std/parallel/thread.h | 2 +- .../AzCore/std/smart_ptr/shared_count.h | 12 ++--- .../Memory/OverrunDetectionAllocator_WinAPI.h | 10 ++-- 19 files changed, 126 insertions(+), 137 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h index 3768a75d83..bfc541ca09 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.h @@ -196,14 +196,14 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// // ComponentApplicationRequests - void RegisterComponentDescriptor(const ComponentDescriptor* descriptor) override final; - void UnregisterComponentDescriptor(const ComponentDescriptor* descriptor) override final; - void RegisterEntityAddedEventHandler(EntityAddedEvent::Handler& handler) override final; - void RegisterEntityRemovedEventHandler(EntityRemovedEvent::Handler& handler) override final; - void RegisterEntityActivatedEventHandler(EntityActivatedEvent::Handler& handler) override final; - void RegisterEntityDeactivatedEventHandler(EntityDeactivatedEvent::Handler& handler) override final; - void SignalEntityActivated(Entity* entity) override final; - void SignalEntityDeactivated(Entity* entity) override final; + void RegisterComponentDescriptor(const ComponentDescriptor* descriptor) final; + void UnregisterComponentDescriptor(const ComponentDescriptor* descriptor) final; + void RegisterEntityAddedEventHandler(EntityAddedEvent::Handler& handler) final; + void RegisterEntityRemovedEventHandler(EntityRemovedEvent::Handler& handler) final; + void RegisterEntityActivatedEventHandler(EntityActivatedEvent::Handler& handler) final; + void RegisterEntityDeactivatedEventHandler(EntityDeactivatedEvent::Handler& handler) final; + void SignalEntityActivated(Entity* entity) final; + void SignalEntityDeactivated(Entity* entity) final; bool AddEntity(Entity* entity) override; bool RemoveEntity(Entity* entity) override; bool DeleteEntity(const EntityId& id) override; diff --git a/Code/Framework/AzCore/AzCore/Debug/TraceMessagesDriller.h b/Code/Framework/AzCore/AzCore/Debug/TraceMessagesDriller.h index 16d8f4fba3..32726931fc 100644 --- a/Code/Framework/AzCore/AzCore/Debug/TraceMessagesDriller.h +++ b/Code/Framework/AzCore/AzCore/Debug/TraceMessagesDriller.h @@ -28,21 +28,21 @@ namespace AZ protected: ////////////////////////////////////////////////////////////////////////// // Driller - virtual const char* GroupName() const { return "SystemDrillers"; } - virtual const char* GetName() const { return "TraceMessagesDriller"; } - virtual const char* GetDescription() const { return "Handles all system messages like Assert, Exception, Error, Warning, Printf, etc."; } - virtual void Start(const Param* params = NULL, int numParams = 0); - virtual void Stop(); + const char* GroupName() const override { return "SystemDrillers"; } + const char* GetName() const override { return "TraceMessagesDriller"; } + const char* GetDescription() const override { return "Handles all system messages like Assert, Exception, Error, Warning, Printf, etc."; } + void Start(const Param* params = NULL, int numParams = 0) override; + void Stop() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // TraceMessagesDrillerBus /// Triggered when a AZ_Assert failed. This is terminating event! (the code will break, crash). - virtual void OnAssert(const char* message); - virtual void OnException(const char* message); - virtual void OnError(const char* window, const char* message); - virtual void OnWarning(const char* window, const char* message); - virtual void OnPrintf(const char* window, const char* message); + void OnAssert(const char* message) override; + void OnException(const char* message) override; + void OnError(const char* window, const char* message) override; + void OnWarning(const char* window, const char* message) override; + void OnPrintf(const char* window, const char* message) override; ////////////////////////////////////////////////////////////////////////// }; } // namespace Debug diff --git a/Code/Framework/AzCore/AzCore/Driller/Stream.h b/Code/Framework/AzCore/AzCore/Driller/Stream.h index f883984b11..5efa416ef4 100644 --- a/Code/Framework/AzCore/AzCore/Driller/Stream.h +++ b/Code/Framework/AzCore/AzCore/Driller/Stream.h @@ -443,7 +443,7 @@ namespace AZ const unsigned char* GetData() const { return m_data.data(); } unsigned int GetDataSize() const { return static_cast(m_data.size()); } inline void Reset() { m_data.clear(); } - virtual void WriteBinary(const void* data, unsigned int dataSize) + void WriteBinary(const void* data, unsigned int dataSize) override { m_data.insert(m_data.end(), reinterpret_cast(data), reinterpret_cast(data) + dataSize); } @@ -489,7 +489,7 @@ namespace AZ } unsigned int GetDataLeft() const { return static_cast(m_dataEnd - m_data); } - virtual unsigned int ReadBinary(void* data, unsigned int maxDataSize) + unsigned int ReadBinary(void* data, unsigned int maxDataSize) override { AZ_Assert(m_data != nullptr, "You must call SetData function, before you can read data!"); AZ_Assert(data != nullptr && maxDataSize > 0, "We must have a valid pointer and max data size!"); @@ -523,7 +523,7 @@ namespace AZ bool Open(const char* fileName, int mode, int platformFlags = 0); void Close(); - virtual void WriteBinary(const void* data, unsigned int dataSize); + void WriteBinary(const void* data, unsigned int dataSize) override; }; /** @@ -540,7 +540,7 @@ namespace AZ DrillerInputFileStream(); ~DrillerInputFileStream(); bool Open(const char* fileName, int mode, int platformFlags = 0); - virtual unsigned int ReadBinary(void* data, unsigned int maxDataSize); + unsigned int ReadBinary(void* data, unsigned int maxDataSize) override; void Close(); }; diff --git a/Code/Framework/AzCore/AzCore/IO/CompressorZLib.h b/Code/Framework/AzCore/AzCore/IO/CompressorZLib.h index abd21e1450..dd1fb226c3 100644 --- a/Code/Framework/AzCore/AzCore/IO/CompressorZLib.h +++ b/Code/Framework/AzCore/AzCore/IO/CompressorZLib.h @@ -98,21 +98,21 @@ namespace AZ /// Return compressor type id. static AZ::u32 TypeId(); - virtual AZ::u32 GetTypeId() const { return TypeId(); } + AZ::u32 GetTypeId() const override { return TypeId(); } /// Called when we open a stream to Read for the first time. Data contains the first. dataSize <= m_maxHeaderSize. - virtual bool ReadHeaderAndData(CompressorStream* stream, AZ::u8* data, unsigned int dataSize); + bool ReadHeaderAndData(CompressorStream* stream, AZ::u8* data, unsigned int dataSize) override; /// Called when we are about to start writing to a compressed stream. - virtual bool WriteHeaderAndData(CompressorStream* stream); + bool WriteHeaderAndData(CompressorStream* stream) override; /// Forwarded function from the Device when we from a compressed stream. - virtual SizeType Read(CompressorStream* stream, SizeType byteSize, SizeType offset, void* buffer); + SizeType Read(CompressorStream* stream, SizeType byteSize, SizeType offset, void* buffer) override; /// Forwarded function from the Device when we write to a compressed stream. - virtual SizeType Write(CompressorStream* stream, SizeType byteSize, const void* data, SizeType offset = SizeType(-1)); + SizeType Write(CompressorStream* stream, SizeType byteSize, const void* data, SizeType offset = SizeType(-1)) override; /// Write a seek point. - virtual bool WriteSeekPoint(CompressorStream* stream); + bool WriteSeekPoint(CompressorStream* stream) override; /// Set auto seek point even dataSize bytes. - virtual bool StartCompressor(CompressorStream* stream, int compressionLevel, SizeType autoSeekDataSize); + bool StartCompressor(CompressorStream* stream, int compressionLevel, SizeType autoSeekDataSize) override; /// Called just before we close the stream. All compression data will be flushed and finalized. (You can't add data afterwards). - virtual bool Close(CompressorStream* stream); + bool Close(CompressorStream* stream) override; protected: diff --git a/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h b/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h index 9b6a39af4f..1c15b7105e 100644 --- a/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h +++ b/Code/Framework/AzCore/AzCore/Jobs/Internal/JobNotify.h @@ -31,7 +31,7 @@ namespace AZ { } protected: - virtual void Process() + void Process() override { m_notifyFlag->store(true, AZStd::memory_order_release); } diff --git a/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h b/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h index 12b18f86b8..942f02727e 100644 --- a/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h +++ b/Code/Framework/AzCore/AzCore/Math/InterpolationSample.h @@ -77,7 +77,7 @@ namespace AZ : public Sample { public: - Vector3 GetInterpolatedValue(TimeType time) override final + Vector3 GetInterpolatedValue(TimeType time) final { Vector3 interpolatedValue = m_previousValue; if (m_targetTimestamp != 0) @@ -108,7 +108,7 @@ namespace AZ : public Sample { public: - Quaternion GetInterpolatedValue(TimeType time) override final + Quaternion GetInterpolatedValue(TimeType time) final { Quaternion interpolatedValue = m_previousValue; if (m_targetTimestamp != 0) @@ -144,7 +144,7 @@ namespace AZ : public Sample { public: - Vector3 GetInterpolatedValue(TimeType /*time*/) override final + Vector3 GetInterpolatedValue(TimeType /*time*/) final { return GetTargetValue(); } @@ -155,7 +155,7 @@ namespace AZ : public Sample { public: - Quaternion GetInterpolatedValue(TimeType /*time*/) override final + Quaternion GetInterpolatedValue(TimeType /*time*/) final { return GetTargetValue(); } diff --git a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h index af3e2d9986..15e849309d 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h @@ -48,17 +48,17 @@ namespace AZ HeapSchema(const Descriptor& desc); virtual ~HeapSchema(); - virtual pointer_type Allocate(size_type byteSize, size_type alignment, int flags, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0); - virtual void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0); - virtual pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) { (void)ptr; (void)newSize; (void)newAlignment; return NULL; } - virtual size_type Resize(pointer_type ptr, size_type newSize) { (void)ptr; (void)newSize; return 0; } - virtual size_type AllocationSize(pointer_type ptr); + pointer_type Allocate(size_type byteSize, size_type alignment, int flags, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0) override; + void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0) override; + pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) override { (void)ptr; (void)newSize; (void)newAlignment; return NULL; } + size_type Resize(pointer_type ptr, size_type newSize) override { (void)ptr; (void)newSize; return 0; } + size_type AllocationSize(pointer_type ptr) override; - virtual size_type NumAllocatedBytes() const { return m_used; } - virtual size_type Capacity() const { return m_capacity; } - virtual size_type GetMaxAllocationSize() const; - virtual IAllocatorAllocate* GetSubAllocator() { return m_subAllocator; } - virtual void GarbageCollect() {} + size_type NumAllocatedBytes() const override { return m_used; } + size_type Capacity() const override { return m_capacity; } + size_type GetMaxAllocationSize() const override; + IAllocatorAllocate* GetSubAllocator() override { return m_subAllocator; } + void GarbageCollect() override {} private: AZ_FORCE_INLINE size_type ChunckSize(pointer_type ptr); diff --git a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h index fc10bcd768..ea521213bb 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h @@ -56,21 +56,21 @@ namespace AZ HphaSchema(const Descriptor& desc); virtual ~HphaSchema(); - virtual pointer_type Allocate(size_type byteSize, size_type alignment, int flags = 0, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0); - virtual void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0); - virtual pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment); + pointer_type Allocate(size_type byteSize, size_type alignment, int flags = 0, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0) override; + void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0) override; + pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) override; /// Resizes allocated memory block to the size possible and returns that size. - virtual size_type Resize(pointer_type ptr, size_type newSize); - virtual size_type AllocationSize(pointer_type ptr); + size_type Resize(pointer_type ptr, size_type newSize) override; + size_type AllocationSize(pointer_type ptr) override; - virtual size_type NumAllocatedBytes() const; - virtual size_type Capacity() const; - virtual size_type GetMaxAllocationSize() const; - virtual size_type GetUnAllocatedMemory(bool isPrint = false) const; - virtual IAllocatorAllocate* GetSubAllocator() { return m_desc.m_subAllocator; } + size_type NumAllocatedBytes() const override; + size_type Capacity() const override; + size_type GetMaxAllocationSize() const override; + size_type GetUnAllocatedMemory(bool isPrint = false) const override; + IAllocatorAllocate* GetSubAllocator() override { return m_desc.m_subAllocator; } /// Return unused memory to the OS (if we don't use fixed block). Don't call this unless you really need free memory, it is slow. - virtual void GarbageCollect(); + void GarbageCollect() override; private: // [LY-84974][sconel@][2018-08-10] SliceStrike integration up to CL 671758 diff --git a/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h b/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h index 3a363cb069..b74d07871b 100644 --- a/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h @@ -41,17 +41,17 @@ namespace AZ //--------------------------------------------------------------------- // IAllocatorAllocate //--------------------------------------------------------------------- - virtual pointer_type Allocate(size_type byteSize, size_type alignment, int flags, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0) override; - virtual void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0) override; - virtual pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) override; - virtual size_type Resize(pointer_type ptr, size_type newSize) override; - virtual size_type AllocationSize(pointer_type ptr) override; + pointer_type Allocate(size_type byteSize, size_type alignment, int flags, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0) override; + void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0) override; + pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) override; + size_type Resize(pointer_type ptr, size_type newSize) override; + size_type AllocationSize(pointer_type ptr) override; - virtual size_type NumAllocatedBytes() const override; - virtual size_type Capacity() const override; - virtual size_type GetMaxAllocationSize() const override; - virtual IAllocatorAllocate* GetSubAllocator() override; - virtual void GarbageCollect() override; + size_type NumAllocatedBytes() const override; + size_type Capacity() const override; + size_type GetMaxAllocationSize() const override; + IAllocatorAllocate* GetSubAllocator() override; + void GarbageCollect() override; private: typedef void* (*MallocFn)(size_t); diff --git a/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.h b/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.h index 94c364c719..9bcbc85217 100644 --- a/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.h +++ b/Code/Framework/AzCore/AzCore/Memory/MemoryDriller.h @@ -38,24 +38,24 @@ namespace AZ protected: ////////////////////////////////////////////////////////////////////////// // Driller - virtual const char* GroupName() const { return "SystemDrillers"; } - virtual const char* GetName() const { return "MemoryDriller"; } - virtual const char* GetDescription() const { return "Reports all allocators and memory allocations."; } - virtual void Start(const Param* params = NULL, int numParams = 0); - virtual void Stop(); + const char* GroupName() const override { return "SystemDrillers"; } + const char* GetName() const override { return "MemoryDriller"; } + const char* GetDescription() const override { return "Reports all allocators and memory allocations."; } + void Start(const Param* params = NULL, int numParams = 0) override; + void Stop() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // MemoryDrillerBus - virtual void RegisterAllocator(IAllocator* allocator); - virtual void UnregisterAllocator(IAllocator* allocator); + void RegisterAllocator(IAllocator* allocator) override; + void UnregisterAllocator(IAllocator* allocator) override; - virtual void RegisterAllocation(IAllocator* allocator, void* address, size_t byteSize, size_t alignment, const char* name, const char* fileName, int lineNum, unsigned int stackSuppressCount); - virtual void UnregisterAllocation(IAllocator* allocator, void* address, size_t byteSize, size_t alignment, AllocationInfo* info); - virtual void ReallocateAllocation(IAllocator* allocator, void* prevAddress, void* newAddress, size_t newByteSize, size_t newAlignment); - virtual void ResizeAllocation(IAllocator* allocator, void* address, size_t newSize); + void RegisterAllocation(IAllocator* allocator, void* address, size_t byteSize, size_t alignment, const char* name, const char* fileName, int lineNum, unsigned int stackSuppressCount) override; + void UnregisterAllocation(IAllocator* allocator, void* address, size_t byteSize, size_t alignment, AllocationInfo* info) override; + void ReallocateAllocation(IAllocator* allocator, void* prevAddress, void* newAddress, size_t newByteSize, size_t newAlignment) override; + void ResizeAllocation(IAllocator* allocator, void* address, size_t newSize) override; - virtual void DumpAllAllocations(); + void DumpAllAllocations() override; ////////////////////////////////////////////////////////////////////////// void RegisterAllocatorOutput(IAllocator* allocator); diff --git a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h index 669fda8a04..c6e7b05341 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h @@ -77,17 +77,17 @@ namespace AZ //--------------------------------------------------------------------- // IAllocatorAllocate //--------------------------------------------------------------------- - virtual pointer_type Allocate(size_type byteSize, size_type alignment, int flags, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0) override; - virtual void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0) override; - virtual pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) override; - virtual size_type Resize(pointer_type ptr, size_type newSize) override; - virtual size_type AllocationSize(pointer_type ptr) override; + pointer_type Allocate(size_type byteSize, size_type alignment, int flags, const char* name = 0, const char* fileName = 0, int lineNum = 0, unsigned int suppressStackRecord = 0) override; + void DeAllocate(pointer_type ptr, size_type byteSize = 0, size_type alignment = 0) override; + pointer_type ReAllocate(pointer_type ptr, size_type newSize, size_type newAlignment) override; + size_type Resize(pointer_type ptr, size_type newSize) override; + size_type AllocationSize(pointer_type ptr) override; - virtual size_type NumAllocatedBytes() const override; - virtual size_type Capacity() const override; - virtual size_type GetMaxAllocationSize() const override; - virtual IAllocatorAllocate* GetSubAllocator() override; - virtual void GarbageCollect() override; + size_type NumAllocatedBytes() const override; + size_type Capacity() const override; + size_type GetMaxAllocationSize() const override; + IAllocatorAllocate* GetSubAllocator() override; + void GarbageCollect() override; private: OverrunDetectionSchemaImpl* m_impl; diff --git a/Code/Framework/AzCore/AzCore/Module/Module.h b/Code/Framework/AzCore/AzCore/Module/Module.h index a4843f002c..3809bd1bb4 100644 --- a/Code/Framework/AzCore/AzCore/Module/Module.h +++ b/Code/Framework/AzCore/AzCore/Module/Module.h @@ -62,7 +62,7 @@ namespace AZ * DO NOT OVERRIDE. This method will return in the future, but at this point things reflected here are not unreflected for all ReflectContexts (Serialize, Editor, Network, Script, etc.) * Place all calls to non-component reflect functions inside of a component reflect function to ensure that your types are unreflected. */ - virtual void Reflect(AZ::ReflectContext*) final { } + void Reflect(AZ::ReflectContext*) {} /** * Override to require specific components on the system entity. diff --git a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h index b436f5adab..0a1af21213 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h +++ b/Code/Framework/AzCore/AzCore/RTTI/BehaviorContext.h @@ -594,8 +594,8 @@ namespace AZ void SetArgumentName(size_t index, const AZStd::string& name) override; const AZStd::string* GetArgumentToolTip(size_t index) const override; void SetArgumentToolTip(size_t index, const AZStd::string& name) override; - virtual void SetDefaultValue(size_t index, BehaviorDefaultValuePtr defaultValue) override; - virtual BehaviorDefaultValuePtr GetDefaultValue(size_t index) const override; + void SetDefaultValue(size_t index, BehaviorDefaultValuePtr defaultValue) override; + BehaviorDefaultValuePtr GetDefaultValue(size_t index) const override; const BehaviorParameter* GetResult() const override; void OverrideParameterTraits(size_t index, AZ::u32 addTraits, AZ::u32 removeTraits) override; diff --git a/Code/Framework/AzCore/AzCore/RTTI/RTTI.h b/Code/Framework/AzCore/AzCore/RTTI/RTTI.h index fa081a9497..43bc1660ee 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/RTTI.h +++ b/Code/Framework/AzCore/AzCore/RTTI/RTTI.h @@ -5,8 +5,8 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#ifndef AZCORE_RTTI_H -#define AZCORE_RTTI_H + +#pragma once #include #include @@ -44,21 +44,9 @@ namespace AZ /// RTTI typeId typedef void (* RTTI_EnumCallback)(const AZ::TypeId& /*typeId*/, void* /*userData*/); - // Disabling missing override warning because we intentionally want to allow for declaring RTTI base classes that don't impelment RTTI. -#if defined(AZ_COMPILER_CLANG) -# define AZ_PUSH_DISABLE_OVERRIDE_WARNING \ - _Pragma("clang diagnostic push") \ - _Pragma("clang diagnostic ignored \"-Winconsistent-missing-override\"") -# define AZ_POP_DISABLE_OVERRIDE_WARNING \ - _Pragma("clang diagnostic pop") -#else -# define AZ_PUSH_DISABLE_OVERRIDE_WARNING -# define AZ_POP_DISABLE_OVERRIDE_WARNING -#endif - // We require AZ_TYPE_INFO to be declared #define AZ_RTTI_COMMON() \ - AZ_PUSH_DISABLE_OVERRIDE_WARNING \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ void RTTI_Enable(); \ virtual inline const AZ::TypeId& RTTI_GetType() const { return RTTI_Type(); } \ virtual inline const char* RTTI_GetTypeName() const { return RTTI_TypeName(); } \ @@ -66,7 +54,7 @@ namespace AZ virtual void RTTI_EnumTypes(AZ::RTTI_EnumCallback cb, void* userData) { RTTI_EnumHierarchy(cb, userData); } \ static inline const AZ::TypeId& RTTI_Type() { return TYPEINFO_Uuid(); } \ static inline const char* RTTI_TypeName() { return TYPEINFO_Name(); } \ - AZ_POP_DISABLE_OVERRIDE_WARNING + AZ_POP_DISABLE_WARNING //#define AZ_RTTI_1(_1) static_assert(false,"You must provide a valid classUuid!") @@ -74,8 +62,10 @@ namespace AZ #define AZ_RTTI_1() AZ_RTTI_COMMON() \ static bool RTTI_IsContainType(const AZ::TypeId& id) { return id == RTTI_Type(); } \ static void RTTI_EnumHierarchy(AZ::RTTI_EnumCallback cb, void* userData) { cb(RTTI_Type(), userData); } \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ virtual inline const void* RTTI_AddressOf(const AZ::TypeId& id) const { return (id == RTTI_Type()) ? this : nullptr; } \ - virtual inline void* RTTI_AddressOf(const AZ::TypeId& id) { return (id == RTTI_Type()) ? this : nullptr; } + virtual inline void* RTTI_AddressOf(const AZ::TypeId& id) { return (id == RTTI_Type()) ? this : nullptr; } \ + AZ_POP_DISABLE_WARNING /// AZ_RTTI(BaseClass) #define AZ_RTTI_2(_1) AZ_RTTI_COMMON() \ @@ -85,14 +75,14 @@ namespace AZ static void RTTI_EnumHierarchy(AZ::RTTI_EnumCallback cb, void* userData) { \ cb(RTTI_Type(), userData); \ AZ::Internal::RttiCaller<_1>::RTTI_EnumHierarchy(cb, userData); } \ - AZ_PUSH_DISABLE_OVERRIDE_WARNING \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ virtual inline const void* RTTI_AddressOf(const AZ::TypeId& id) const { \ if (id == RTTI_Type()) { return this; } \ return AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); } \ virtual inline void* RTTI_AddressOf(const AZ::TypeId& id) { \ if (id == RTTI_Type()) { return this; } \ return AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); } \ - AZ_POP_DISABLE_OVERRIDE_WARNING + AZ_POP_DISABLE_WARNING /// AZ_RTTI(BaseClass1,BaseClass2) #define AZ_RTTI_3(_1, _2) AZ_RTTI_COMMON() \ @@ -104,7 +94,7 @@ namespace AZ cb(RTTI_Type(), userData); \ AZ::Internal::RttiCaller<_1>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_2>::RTTI_EnumHierarchy(cb, userData); } \ - AZ_PUSH_DISABLE_OVERRIDE_WARNING \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ virtual inline const void* RTTI_AddressOf(const AZ::TypeId& id) const { \ if (id == RTTI_Type()) { return this; } \ const void* r = AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); if (r) { return r; } \ @@ -113,7 +103,7 @@ namespace AZ if (id == RTTI_Type()) { return this; } \ void* r = AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); if (r) { return r; } \ return AZ::Internal::RttiCaller<_2>::RTTI_AddressOf(this, id); } \ - AZ_POP_DISABLE_OVERRIDE_WARNING + AZ_POP_DISABLE_WARNING /// AZ_RTTI(BaseClass1,BaseClass2,BaseClass3) #define AZ_RTTI_4(_1, _2, _3) AZ_RTTI_COMMON() \ @@ -127,7 +117,7 @@ namespace AZ AZ::Internal::RttiCaller<_1>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_2>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_3>::RTTI_EnumHierarchy(cb, userData); } \ - AZ_PUSH_DISABLE_OVERRIDE_WARNING \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ virtual inline const void* RTTI_AddressOf(const AZ::TypeId& id) const { \ if (id == RTTI_Type()) { return this; } \ const void* r = AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); if (r) { return r; } \ @@ -138,7 +128,7 @@ namespace AZ void* r = AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); if (r) { return r; } \ r = AZ::Internal::RttiCaller<_2>::RTTI_AddressOf(this, id); if (r) { return r; } \ return AZ::Internal::RttiCaller<_3>::RTTI_AddressOf(this, id); } \ - AZ_POP_DISABLE_OVERRIDE_WARNING + AZ_POP_DISABLE_WARNING /// AZ_RTTI(BaseClass1,BaseClass2,BaseClass3,BaseClass4) #define AZ_RTTI_5(_1, _2, _3, _4) AZ_RTTI_COMMON() \ @@ -154,7 +144,7 @@ namespace AZ AZ::Internal::RttiCaller<_2>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_3>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_4>::RTTI_EnumHierarchy(cb, userData); } \ - AZ_PUSH_DISABLE_OVERRIDE_WARNING \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ virtual inline const void* RTTI_AddressOf(const AZ::TypeId& id) const { \ if (id == RTTI_Type()) { return this; } \ const void* r = AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); if (r) { return r; } \ @@ -167,7 +157,7 @@ namespace AZ r = AZ::Internal::RttiCaller<_2>::RTTI_AddressOf(this, id); if (r) { return r; } \ r = AZ::Internal::RttiCaller<_3>::RTTI_AddressOf(this, id); if (r) { return r; } \ return AZ::Internal::RttiCaller<_4>::RTTI_AddressOf(this, id); } \ - AZ_POP_DISABLE_OVERRIDE_WARNING + AZ_POP_DISABLE_WARNING /// AZ_RTTI(BaseClass1,BaseClass2,BaseClass3,BaseClass4,BaseClass5) #define AZ_RTTI_6(_1, _2, _3, _4, _5) AZ_RTTI_COMMON() \ @@ -185,7 +175,7 @@ namespace AZ AZ::Internal::RttiCaller<_3>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_4>::RTTI_EnumHierarchy(cb, userData); \ AZ::Internal::RttiCaller<_5>::RTTI_EnumHierarchy(cb, userData); } \ - AZ_PUSH_DISABLE_OVERRIDE_WARNING \ + AZ_PUSH_DISABLE_WARNING(26433, "-Winconsistent-missing-override") \ virtual inline const void* RTTI_AddressOf(const AZ::TypeId& id) const { \ if (id == RTTI_Type()) { return this; } \ const void* r = AZ::Internal::RttiCaller<_1>::RTTI_AddressOf(this, id); if (r) { return r; } \ @@ -200,7 +190,7 @@ namespace AZ r = AZ::Internal::RttiCaller<_3>::RTTI_AddressOf(this, id); if (r) { return r; } \ r = AZ::Internal::RttiCaller<_4>::RTTI_AddressOf(this, id); if (r) { return r; } \ return AZ::Internal::RttiCaller<_5>::RTTI_AddressOf(this, id); } \ - AZ_POP_DISABLE_OVERRIDE_WARNING + AZ_POP_DISABLE_WARNING ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MACRO specialization to allow optional parameters for template version of AZ_RTTI @@ -1077,7 +1067,6 @@ namespace AZ { return AZ::Internal::RttiIsTypeOfIdHelper::Check(id, data, typename HasAZRtti>::kind_type()); } + } // namespace AZ -#endif // AZCORE_RTTI_H -#pragma once diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSystemComponent.h b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSystemComponent.h index c46ba32209..a691bb1bcb 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSystemComponent.h +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonSystemComponent.h @@ -19,8 +19,8 @@ namespace AZ public: AZ_COMPONENT(JsonSystemComponent, "{3C2C7234-9512-4E24-86F0-C40865D7EECE}", Component); - void Activate(); - void Deactivate(); + void Activate() override; + void Deactivate() override; static void Reflect(ReflectContext* reflectContext); }; diff --git a/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.h b/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.h index 4721d3baa8..6a807c915e 100644 --- a/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.h +++ b/Code/Framework/AzCore/AzCore/UserSettings/UserSettingsProvider.h @@ -116,9 +116,9 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// // UserSettingsBus - virtual AZStd::intrusive_ptr FindUserSettings(u32 id); - virtual void AddUserSettings(u32 id, UserSettings* settings); - virtual bool Save(const char* settingsPath, SerializeContext* sc); + AZStd::intrusive_ptr FindUserSettings(u32 id) override; + void AddUserSettings(u32 id, UserSettings* settings) override; + bool Save(const char* settingsPath, SerializeContext* sc) override; ////////////////////////////////////////////////////////////////////////// static void Reflect(ReflectContext* reflection); diff --git a/Code/Framework/AzCore/AzCore/std/parallel/thread.h b/Code/Framework/AzCore/AzCore/std/parallel/thread.h index 9f7830c91b..15d8c9dc8e 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/thread.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/thread.h @@ -187,7 +187,7 @@ namespace AZStd : m_f(AZStd::move(f)) {} thread_info_impl(Internal::thread_move_t f) : m_f(f) {} - virtual void execute() { m_f(); } + void execute() override { m_f(); } private: F m_f; diff --git a/Code/Framework/AzCore/AzCore/std/smart_ptr/shared_count.h b/Code/Framework/AzCore/AzCore/std/smart_ptr/shared_count.h index c86adbd69e..ac49dc9ae5 100644 --- a/Code/Framework/AzCore/AzCore/std/smart_ptr/shared_count.h +++ b/Code/Framework/AzCore/AzCore/std/smart_ptr/shared_count.h @@ -129,16 +129,16 @@ namespace AZStd { } - virtual void dispose() // nothrow + void dispose() override // nothrow { AZStd::checked_delete(px_); } - virtual void destroy() // nothrow + void destroy() override // nothrow { this->~this_type(); a_.deallocate(this, sizeof(this_type), AZStd::alignment_of::value); } - virtual void* get_deleter(Internal::sp_typeinfo const&) + void* get_deleter(Internal::sp_typeinfo const&) override { return 0; } @@ -176,18 +176,18 @@ namespace AZStd { } - virtual void dispose() // nothrow + void dispose() override // nothrow { d_(p_); } - virtual void destroy() // nothrow + void destroy() override // nothrow { this->~this_type(); a_.deallocate(this, sizeof(this_type), AZStd::alignment_of::value); } - virtual void* get_deleter(Internal::sp_typeinfo const& ti) + void* get_deleter(Internal::sp_typeinfo const& ti) override { return ti == aztypeid(D) ? &reinterpret_cast(d_) : 0; } diff --git a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Memory/OverrunDetectionAllocator_WinAPI.h b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Memory/OverrunDetectionAllocator_WinAPI.h index 19f83374e7..b5cdc11d5d 100644 --- a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Memory/OverrunDetectionAllocator_WinAPI.h +++ b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/Memory/OverrunDetectionAllocator_WinAPI.h @@ -21,7 +21,7 @@ namespace AZ class WinAPIOverrunDetectionSchema : public OverrunDetectionSchema::PlatformAllocator { public: - virtual SystemInformation GetSystemInformation() override + SystemInformation GetSystemInformation() override { SystemInformation result; SYSTEM_INFO info; @@ -32,7 +32,7 @@ namespace AZ return result; } - virtual void* ReserveBytes(size_t amount) override + void* ReserveBytes(size_t amount) override { void* result = VirtualAlloc(0, amount, MEM_RESERVE, PAGE_NOACCESS); @@ -45,12 +45,12 @@ namespace AZ return result; } - virtual void ReleaseReservedBytes(void* base) override + void ReleaseReservedBytes(void* base) override { VirtualFree(base, 0, MEM_RELEASE); } - virtual void* CommitBytes(void* base, size_t amount) override + void* CommitBytes(void* base, size_t amount) override { void* result = VirtualAlloc(base, amount, MEM_COMMIT, PAGE_READWRITE); @@ -63,7 +63,7 @@ namespace AZ return result; } - virtual void DecommitBytes(void* base, size_t amount) override + void DecommitBytes(void* base, size_t amount) override { VirtualFree(base, amount, MEM_DECOMMIT); } From 9e0ff8e55dab4520ae2ac3f19614d0a379faedf3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 18:36:40 -0700 Subject: [PATCH 182/355] disabling external headers for analyzer Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/MSVC/Configurations_msvc.cmake | 1 + cmake/Platform/Common/MSVC/Directory.Build.props | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index c613b79d87..01e3063028 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -136,6 +136,7 @@ endif() ly_set(LY_CXX_SYSTEM_INCLUDE_CONFIGURATION_FLAG /experimental:external # Turns on "external" headers feature for MSVC compilers /external:W0 # Set warning level in external headers to 0. This is used to suppress warnings 3rdParty libraries which uses the "system_includes" option in their json configuration + /analyze:external- # disable analysis on external headers ) if(NOT CMAKE_INCLUDE_SYSTEM_FLAG_CXX) ly_set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX /external:I) diff --git a/cmake/Platform/Common/MSVC/Directory.Build.props b/cmake/Platform/Common/MSVC/Directory.Build.props index 4b82cd7048..589e14a6cb 100644 --- a/cmake/Platform/Common/MSVC/Directory.Build.props +++ b/cmake/Platform/Common/MSVC/Directory.Build.props @@ -22,6 +22,8 @@ SPDX-License-Identifier: Apache-2.0 OR MIT handles external headers in MSVC, we can remove that code and this --> TurnOffAllWarnings + + true From cc00a535d72b2e36cc7fa7ccfbad83e3dec719ec Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 18:37:45 -0700 Subject: [PATCH 183/355] more Code/Framework fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/AzCore/Component/Component.h | 2 +- Code/Framework/AzCore/AzCore/RTTI/RTTI.h | 5 +---- .../AzFramework/Archive/ArchiveFileIO.h | 2 +- .../AzFramework/Archive/NestedArchive.h | 20 +++++++++---------- .../AzFramework/Asset/GenericAssetHandler.h | 4 ++-- .../Components/NonUniformScaleComponent.h | 2 +- .../Entity/GameEntityContextComponent.h | 2 +- .../AzFramework/Logging/LoggingComponent.h | 6 +++--- .../Viewport/ViewportControllerList.h | 4 ++-- Code/Framework/AzTest/AzTest/AzTest.h | 8 ++++---- .../Replica/Interest/BitmaskInterestHandler.h | 2 +- 11 files changed, 27 insertions(+), 30 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Component/Component.h b/Code/Framework/AzCore/AzCore/Component/Component.h index 9b4ae3f55f..3cbb9b5a86 100644 --- a/Code/Framework/AzCore/AzCore/Component/Component.h +++ b/Code/Framework/AzCore/AzCore/Component/Component.h @@ -266,7 +266,7 @@ namespace AZ _ComponentClass::RTTI_Type().ToString().c_str(), descriptor->GetName(), _ComponentClass::RTTI_TypeName()); \ return nullptr; \ } \ - else if (descriptor->GetName() != _ComponentClass::RTTI_TypeName()) \ + if (descriptor->GetName() != _ComponentClass::RTTI_TypeName()) \ { \ AZ_Error("Component", false, "The same component UUID (%s) / name (%s) was registered twice. This isn't allowed, " \ "it can cause lifetime management issues / crashes.\nThis situation can happen by declaring a component " \ diff --git a/Code/Framework/AzCore/AzCore/RTTI/RTTI.h b/Code/Framework/AzCore/AzCore/RTTI/RTTI.h index 43bc1660ee..acf6f64f77 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/RTTI.h +++ b/Code/Framework/AzCore/AzCore/RTTI/RTTI.h @@ -941,10 +941,7 @@ namespace AZ { return AZStd::shared_ptr(ptr, castPtr); } - else - { - return AZStd::shared_ptr(); - } + return AZStd::shared_ptr(); } // RttiCast specialization for intrusive_ptr. diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h index 2cd8f37adc..c99fbb14c5 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h @@ -65,7 +65,7 @@ namespace AZ::IO void SetAlias(const char* alias, const char* path) override; void ClearAlias(const char* alias) override; AZStd::optional ConvertToAlias(char* inOutBuffer, AZ::u64 bufferLength) const override; - bool ConvertToAlias(AZ::IO::FixedMaxPath& convertedPath, const AZ::IO::PathView& path) const; + bool ConvertToAlias(AZ::IO::FixedMaxPath& convertedPath, const AZ::IO::PathView& path) const override; using FileIOBase::ConvertToAlias; const char* GetAlias(const char* alias) const override; bool ResolvePath(const char* path, char* resolvedPath, AZ::u64 resolvedPathSize) const override; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h index 8ab943a24e..eac98b2f07 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h @@ -40,7 +40,7 @@ namespace AZ::IO NestedArchive(IArchive* pArchive, AZStd::string_view strBindRoot, ZipDir::CachePtr pCache, uint32_t nFlags = 0); ~NestedArchive() override; - auto GetRootFolderHandle() -> Handle; + auto GetRootFolderHandle() -> Handle override; // Adds a new file to the zip or update an existing one // adds a directory (creates several nested directories if needed) @@ -66,26 +66,26 @@ namespace AZ::IO int RemoveDir(AZStd::string_view szRelativePath) override; // deletes all files from the archive - int RemoveAll(); + int RemoveAll() override; // finds the file; you don't have to close the returned handle - Handle FindFile(AZStd::string_view szRelativePath); + Handle FindFile(AZStd::string_view szRelativePath) override; // returns the size of the file (unpacked) by the handle - uint64_t GetFileSize(Handle fileHandle); + uint64_t GetFileSize(Handle fileHandle) override; // reads the file into the preallocated buffer (must be at least the size of GetFileSize()) - int ReadFile(Handle fileHandle, void* pBuffer); + int ReadFile(Handle fileHandle, void* pBuffer) override; // returns the full path to the archive file - const char* GetFullPath() const; + const char* GetFullPath() const override; ZipDir::Cache* GetCache(); - uint32_t GetFlags() const; - bool SetFlags(uint32_t nFlagsToSet); - bool ResetFlags(uint32_t nFlagsToReset); + uint32_t GetFlags() const override; + bool SetFlags(uint32_t nFlagsToSet) override; + bool ResetFlags(uint32_t nFlagsToReset) override; - bool SetPackAccessible(bool bAccessible); + bool SetPackAccessible(bool bAccessible) override; protected: // returns the pointer to the relative file path to be passed diff --git a/Code/Framework/AzFramework/AzFramework/Asset/GenericAssetHandler.h b/Code/Framework/AzFramework/AzFramework/Asset/GenericAssetHandler.h index 5ead8154e6..4c3f911871 100644 --- a/Code/Framework/AzFramework/AzFramework/Asset/GenericAssetHandler.h +++ b/Code/Framework/AzFramework/AzFramework/Asset/GenericAssetHandler.h @@ -75,7 +75,7 @@ namespace AzFramework { public: AZ_RTTI(GenericAssetHandlerBase, "{B153B8B5-25CC-4BB7-A2BD-9A47ECF4123C}", AZ::Data::AssetHandler); - virtual ~GenericAssetHandlerBase() {} + virtual ~GenericAssetHandlerBase() = default; }; template @@ -186,7 +186,7 @@ namespace AzFramework } } - bool CanHandleAsset(const AZ::Data::AssetId& id) const + bool CanHandleAsset(const AZ::Data::AssetId& id) const override { AZStd::string assetPath; EBUS_EVENT_RESULT(assetPath, AZ::Data::AssetCatalogRequestBus, GetAssetPathById, id); diff --git a/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.h b/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.h index 16032e5337..bc1bf1a6b2 100644 --- a/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Components/NonUniformScaleComponent.h @@ -28,7 +28,7 @@ namespace AzFramework // AZ::NonUniformScaleRequests::Handler ... AZ::Vector3 GetScale() const override; void SetScale(const AZ::Vector3& scale) override; - void RegisterScaleChangedEvent(AZ::NonUniformScaleChangedEvent::Handler& handler); + void RegisterScaleChangedEvent(AZ::NonUniformScaleChangedEvent::Handler& handler) override; protected: // AZ::Component ... diff --git a/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.h b/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.h index 831067d728..b9a4ea0da1 100644 --- a/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Entity/GameEntityContextComponent.h @@ -69,7 +69,7 @@ namespace AzFramework // EntityContext AZ::Entity* CreateEntity(const char* name) override; void OnRootEntityReloaded() override; - void OnContextEntitiesAdded(const EntityList& entities); + void OnContextEntitiesAdded(const EntityList& entities) override; void OnContextReset() override; bool ValidateEntitiesAreValidForContext(const EntityList& entities) override; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.h b/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.h index 98eb6df95a..73f2ff2c75 100644 --- a/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.h +++ b/Code/Framework/AzFramework/AzFramework/Logging/LoggingComponent.h @@ -31,9 +31,9 @@ namespace AzFramework ////////////////////////////////////////////////////////////////////////// // AZ::Component - virtual void Init(); - virtual void Activate(); - virtual void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h index 4016f29f8f..7a31665259 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h +++ b/Code/Framework/AzFramework/AzFramework/Viewport/ViewportControllerList.h @@ -45,10 +45,10 @@ namespace AzFramework //! All current and added controllers will be registered with this viewport. void RegisterViewportContext(ViewportId viewport) override; //! Unregisters a Viewport from this list and all associated controllers. - void UnregisterViewportContext(ViewportId viewport); + void UnregisterViewportContext(ViewportId viewport) override; //! All ViewportControllerLists have a priority of Custom to ensure //! that they receive events at all priorities from any parent controllers. - AzFramework::ViewportControllerPriority GetPriority() const { return ViewportControllerPriority::DispatchToAllPriorities; } + AzFramework::ViewportControllerPriority GetPriority() const override { return ViewportControllerPriority::DispatchToAllPriorities; } //! Returns true if this controller list is enabled, i.e. //! it is accepting and forwarding input and update events to its children. bool IsEnabled() const; diff --git a/Code/Framework/AzTest/AzTest/AzTest.h b/Code/Framework/AzTest/AzTest/AzTest.h index 18e846f9d8..352db1a0b5 100644 --- a/Code/Framework/AzTest/AzTest/AzTest.h +++ b/Code/Framework/AzTest/AzTest/AzTest.h @@ -44,12 +44,12 @@ namespace AZ virtual ~ITestEnvironment() {} - void SetUp() override final + void SetUp() final { SetupEnvironment(); } - void TearDown() override final + void TearDown() final { TeardownEnvironment(); } @@ -218,7 +218,7 @@ namespace AZ public: std::list resultList; - void OnTestEnd(const ::testing::TestInfo& test_info) + void OnTestEnd(const ::testing::TestInfo& test_info) override { std::string result; if (test_info.result()->Failed()) @@ -233,7 +233,7 @@ namespace AZ resultList.emplace_back(formattedResult); } - void OnTestProgramEnd(const ::testing::UnitTest& unit_test) + void OnTestProgramEnd(const ::testing::UnitTest& unit_test) override { for (std::string testResults : resultList) { diff --git a/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h b/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h index 3de3fe8bfe..6b91859c95 100644 --- a/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h +++ b/Code/Framework/GridMate/GridMate/Replica/Interest/BitmaskInterestHandler.h @@ -133,7 +133,7 @@ namespace GridMate typedef AZStd::intrusive_ptr Ptr; bool IsReplicaMigratable() override { return false; } - bool IsBroadcast() { return true; } + bool IsBroadcast() override { return true; } static const char* GetChunkName() { return "BitmaskInterestChunk"; } void OnReplicaActivate(const ReplicaContext& rc) override; From 7d34004b6de173be438d7bd8d796632a3b99b8ac Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 18:38:05 -0700 Subject: [PATCH 184/355] some Code/Legacy fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Legacy/CryCommon/IConsole.h | 44 ++--- Code/Legacy/CryCommon/ILocalizationManager.h | 64 +++---- .../Legacy/CrySystem/LocalizedStringManager.h | 68 +++---- Code/Legacy/CrySystem/System.h | 170 +++++++++--------- Code/Legacy/CrySystem/Timer.h | 54 +++--- Code/Legacy/CrySystem/ViewSystem/View.h | 32 ++-- Code/Legacy/CrySystem/ViewSystem/ViewSystem.h | 68 +++---- Code/Legacy/CrySystem/XConsole.h | 152 ++++++++-------- Code/Legacy/CrySystem/XConsoleVariable.h | 96 +++++----- Code/Legacy/CrySystem/XML/XmlUtils.cpp | 56 +++--- 10 files changed, 402 insertions(+), 402 deletions(-) diff --git a/Code/Legacy/CryCommon/IConsole.h b/Code/Legacy/CryCommon/IConsole.h index f68a82f9dc..b99d4c84b9 100644 --- a/Code/Legacy/CryCommon/IConsole.h +++ b/Code/Legacy/CryCommon/IConsole.h @@ -84,7 +84,7 @@ enum EVarFlags struct ICVarDumpSink { // - virtual ~ICVarDumpSink(){} + virtual ~ICVarDumpSink()= default; virtual void OnElementFound(ICVar* pCVar) = 0; // }; @@ -92,7 +92,7 @@ struct ICVarDumpSink struct IKeyBindDumpSink { // - virtual ~IKeyBindDumpSink(){} + virtual ~IKeyBindDumpSink()= default; virtual void OnKeyBindFound(const char* sBind, const char* sCommand) = 0; // }; @@ -100,7 +100,7 @@ struct IKeyBindDumpSink struct IOutputPrintSink { // - virtual ~IOutputPrintSink(){} + virtual ~IOutputPrintSink()= default; virtual void Print(const char* inszText) = 0; // }; @@ -109,7 +109,7 @@ struct IOutputPrintSink struct IConsoleVarSink { // - virtual ~IConsoleVarSink(){} + virtual ~IConsoleVarSink()= default; // Called by Console before changing console var value, to validate if var can be changed. // Return value: true if ok to change value, false if should not change value. virtual bool OnBeforeVarChange(ICVar* pVar, const char* sNewValue) = 0; @@ -122,7 +122,7 @@ struct IConsoleVarSink struct IConsoleCmdArgs { // - virtual ~IConsoleCmdArgs(){} + virtual ~IConsoleCmdArgs()= default; // Gets number of arguments supplied to the command (including the command itself) virtual int GetArgCount() const = 0; // Gets argument by index, nIndex must be in 0 <= nIndex < GetArgCount() @@ -136,7 +136,7 @@ struct IConsoleCmdArgs struct IConsoleArgumentAutoComplete { // - virtual ~IConsoleArgumentAutoComplete(){} + virtual ~IConsoleArgumentAutoComplete()= default; // Gets number of matches for the argument to auto complete. virtual int GetCount() const = 0; // Gets argument value by index, nIndex must be in 0 <= nIndex < GetCount() @@ -145,10 +145,10 @@ struct IConsoleArgumentAutoComplete }; // This a definition of the console command function that can be added to console with AddCommand. -typedef void (* ConsoleCommandFunc)(IConsoleCmdArgs*); +using ConsoleCommandFunc = void (*)(IConsoleCmdArgs*); // This a definition of the callback function that is called when variable change. -typedef void (* ConsoleVarFunc)(ICVar*); +using ConsoleVarFunc = void (*)(ICVar*); /* Summary: Interface to the engine console. @@ -165,7 +165,7 @@ typedef void (* ConsoleVarFunc)(ICVar*); struct IConsole { // - virtual ~IConsole(){} + virtual ~IConsole()= default; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Deletes the console virtual void Release() = 0; @@ -182,7 +182,7 @@ struct IConsole // help - help text that is shown when you use ? in the console // Return: // pointer to the interface ICVar - virtual ICVar* RegisterString(const char* sName, const char* sValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) = 0; + virtual ICVar* RegisterString(const char* sName, const char* sValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) = 0; // Create a new console variable that store the value in a int // Arguments: // sName - console variable name @@ -191,7 +191,7 @@ struct IConsole // help - help text that is shown when you use ? in the console // Return: // pointer to the interface ICVar - virtual ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) = 0; + virtual ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) = 0; // Create a new console variable that store the value in a int64 // Arguments: // sName - console variable name @@ -200,7 +200,7 @@ struct IConsole // help - help text that is shown when you use ? in the console // Return: // pointer to the interface ICVar - virtual ICVar* RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) = 0; + virtual ICVar* RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) = 0; // Create a new console variable that store the value in a float // Arguments: // sName - console variable name @@ -209,7 +209,7 @@ struct IConsole // help - help text that is shown when you use ? in the console // Return: // pointer to the interface ICVar - virtual ICVar* RegisterFloat(const char* sName, float fValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0) = 0; + virtual ICVar* RegisterFloat(const char* sName, float fValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) = 0; // Create a new console variable that will update the user defined float // Arguments: @@ -220,7 +220,7 @@ struct IConsole // allowModify - allow modification through config vars, prevents missing modifications in release mode // Return: // pointer to the interface ICVar - virtual ICVar* Register(const char* name, float* src, float defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) = 0; + virtual ICVar* Register(const char* name, float* src, float defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr, bool allowModify = true) = 0; // Create a new console variable that will update the user defined integer // Arguments: // sName - console variable name @@ -230,7 +230,7 @@ struct IConsole // allowModify - allow modification through config vars, prevents missing modifications in release mode // Return: // pointer to the interface ICVar - virtual ICVar* Register(const char* name, int* src, int defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) = 0; + virtual ICVar* Register(const char* name, int* src, int defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr, bool allowModify = true) = 0; // Create a new console variable that will update the user defined pointer to null terminated string // Arguments: @@ -241,7 +241,7 @@ struct IConsole // allowModify - allow modification through config vars, prevents missing modifications in release mode // Return: // pointer to the interface ICVar - virtual ICVar* Register(const char* name, const char** src, const char* defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true) = 0; + virtual ICVar* Register(const char* name, const char** src, const char* defaultvalue, int nFlags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr, bool allowModify = true) = 0; // Registers an existing console variable // Should only be used with static duration objects, object is never freed @@ -367,7 +367,7 @@ struct IConsole // sHelp - Help string, will be displayed when typing in console "command ?". // Return // True if successful, false otherwise. - virtual bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = NULL) = 0; + virtual bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = nullptr) = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Description: @@ -382,7 +382,7 @@ struct IConsole // Return // True if successful, false otherwise. //////////////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = NULL) = 0; + virtual bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = nullptr) = 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Description: @@ -421,7 +421,7 @@ struct IConsole // szPrefix - 0 or prefix e.g. "sys_spec_" // Return // used size - virtual size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = 0) = 0; + virtual size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = nullptr) = 0; virtual const char* AutoComplete(const char* substr) = 0; virtual const char* AutoCompletePrev(const char* substr) = 0; virtual const char* ProcessCompletion(const char* szInputBuffer) = 0; @@ -488,7 +488,7 @@ struct IConsole // This interface for the remote console struct IRemoteConsoleListener { - virtual ~IRemoteConsoleListener() {} + virtual ~IRemoteConsoleListener() = default; virtual void OnConsoleCommand([[maybe_unused]] const char* cmd) {}; virtual void OnGameplayCommand([[maybe_unused]] const char* cmd) {}; @@ -496,7 +496,7 @@ struct IRemoteConsoleListener struct IRemoteConsole { - virtual ~IRemoteConsole() {}; + virtual ~IRemoteConsole() = default;; virtual void RegisterConsoleVariables() = 0; virtual void UnregisterConsoleVariables() = 0; @@ -535,7 +535,7 @@ struct ICVar // // TODO make protected; - virtual ~ICVar() {} + virtual ~ICVar() = default; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // delete the variable // NOTE: the variable will automatically unregister itself from the console diff --git a/Code/Legacy/CryCommon/ILocalizationManager.h b/Code/Legacy/CryCommon/ILocalizationManager.h index 0f0ba88250..8646906dfe 100644 --- a/Code/Legacy/CryCommon/ILocalizationManager.h +++ b/Code/Legacy/CryCommon/ILocalizationManager.h @@ -28,7 +28,7 @@ class XmlNodeRef; struct SLocalizedInfoGame { SLocalizedInfoGame () - : szCharacterName(NULL) + : szCharacterName(nullptr) , bUseSubtitle(false) { } @@ -54,15 +54,15 @@ struct SLocalizedSoundInfoGame : public SLocalizedInfoGame { SLocalizedSoundInfoGame() - : sSoundEvent(NULL) + : sSoundEvent(nullptr) , fVolume(0.f) , fRadioRatio (0.f) , bIsDirectRadio(false) , bIsIntercepted(false) , nNumSoundMoods(0) - , pSoundMoods (NULL) + , pSoundMoods (nullptr) , nNumEventParameters(0) - , pEventParameters(NULL) + , pEventParameters(nullptr) { } @@ -86,10 +86,10 @@ struct SLocalizedInfoEditor : public SLocalizedInfoGame { SLocalizedInfoEditor() - : sKey(NULL) - , sOriginalCharacterName(NULL) - , sOriginalActorLine(NULL) - , sUtf8TranslatedActorLine(NULL) + : sKey(nullptr) + , sOriginalCharacterName(nullptr) + , sOriginalActorLine(nullptr) + , sUtf8TranslatedActorLine(nullptr) , nRow(0) { } @@ -137,21 +137,21 @@ struct ILocalizationManager ePILID_MAX_OR_INVALID, //Not a language, denotes the maximum number of languages or an unknown language }; - typedef uint32 TLocalizationBitfield; + using TLocalizationBitfield = uint32; // - virtual ~ILocalizationManager(){} + virtual ~ILocalizationManager()= default; virtual const char* LangNameFromPILID(const ILocalizationManager::EPlatformIndependentLanguageID id) = 0; virtual ILocalizationManager::EPlatformIndependentLanguageID PILIDFromLangName(AZStd::string langName) = 0; virtual ILocalizationManager::EPlatformIndependentLanguageID GetSystemLanguage() { return ILocalizationManager::EPlatformIndependentLanguageID::ePILID_English_US; } virtual ILocalizationManager::TLocalizationBitfield MaskSystemLanguagesFromSupportedLocalizations(const ILocalizationManager::TLocalizationBitfield systemLanguages) = 0; virtual ILocalizationManager::TLocalizationBitfield IsLanguageSupported(const ILocalizationManager::EPlatformIndependentLanguageID id) = 0; - virtual bool SetLanguage([[maybe_unused]] const char* sLanguage) override { return false; } - virtual const char* GetLanguage() override { return nullptr; } + bool SetLanguage([[maybe_unused]] const char* sLanguage) override { return false; } + const char* GetLanguage() override { return nullptr; } - virtual int GetLocalizationFormat() const { return -1; } - virtual AZStd::string GetLocalizedSubtitleFilePath([[maybe_unused]] const AZStd::string& localVideoPath, [[maybe_unused]] const AZStd::string& subtitleFileExtension) const { return ""; } - virtual AZStd::string GetLocalizedLocXMLFilePath([[maybe_unused]] const AZStd::string& localXmlPath) const { return ""; } + int GetLocalizationFormat() const override { return -1; } + AZStd::string GetLocalizedSubtitleFilePath([[maybe_unused]] const AZStd::string& localVideoPath, [[maybe_unused]] const AZStd::string& subtitleFileExtension) const override { return ""; } + AZStd::string GetLocalizedLocXMLFilePath([[maybe_unused]] const AZStd::string& localXmlPath) const override { return ""; } // load the descriptor file with tag information virtual bool InitLocalizationData(const char* sFileName, bool bReload = false) = 0; // request to load loca data by tag. Actual loading will happen during next level load begin event. @@ -161,8 +161,8 @@ struct ILocalizationManager virtual bool ReleaseLocalizationDataByTag(const char* sTag) = 0; virtual bool LoadAllLocalizationData(bool bReload = false) = 0; - virtual bool LoadExcelXmlSpreadsheet([[maybe_unused]] const char* sFileName, [[maybe_unused]] bool bReload = false) override { return false; } - virtual void ReloadData() override {}; + bool LoadExcelXmlSpreadsheet([[maybe_unused]] const char* sFileName, [[maybe_unused]] bool bReload = false) override { return false; } + void ReloadData() override {}; // Summary: // Free localization data. @@ -178,15 +178,15 @@ struct ILocalizationManager // bEnglish - if true, translates the string into the always present English language. // Returns: // true if localization was successful, false otherwise - virtual bool LocalizeString_ch([[maybe_unused]] const char* sString, [[maybe_unused]] AZStd::string& outLocalizedString, [[maybe_unused]] bool bEnglish = false) override { return false; } + bool LocalizeString_ch([[maybe_unused]] const char* sString, [[maybe_unused]] AZStd::string& outLocalizedString, [[maybe_unused]] bool bEnglish = false) override { return false; } // Summary: // Same as LocalizeString( const char* sString, AZStd::string& outLocalizedString, bool bEnglish=false ) // but at the moment this is faster. - virtual bool LocalizeString_s([[maybe_unused]] const AZStd::string& sString, [[maybe_unused]] AZStd::string& outLocalizedString, [[maybe_unused]] bool bEnglish = false) override { return false; } + bool LocalizeString_s([[maybe_unused]] const AZStd::string& sString, [[maybe_unused]] AZStd::string& outLocalizedString, [[maybe_unused]] bool bEnglish = false) override { return false; } // Summary: - virtual void LocalizeAndSubstituteInternal([[maybe_unused]] AZStd::string& locString, [[maybe_unused]] const AZStd::vector& keys, [[maybe_unused]] const AZStd::vector& values) override {} + void LocalizeAndSubstituteInternal([[maybe_unused]] AZStd::string& locString, [[maybe_unused]] const AZStd::vector& keys, [[maybe_unused]] const AZStd::vector& values) override {} // Return the localized version corresponding to a label. // Description: // A label has to start with '@' sign. @@ -196,7 +196,7 @@ struct ILocalizationManager // bEnglish - if true, returns the always present English version of the label. // Returns: // True if localization was successful, false otherwise. - virtual bool LocalizeLabel([[maybe_unused]] const char* sLabel, [[maybe_unused]] AZStd::string& outLocalizedString, [[maybe_unused]] bool bEnglish = false) override { return false; } + bool LocalizeLabel([[maybe_unused]] const char* sLabel, [[maybe_unused]] AZStd::string& outLocalizedString, [[maybe_unused]] bool bEnglish = false) override { return false; } virtual bool IsLocalizedInfoFound([[maybe_unused]] const char* sKey) { return false; } // Summary: @@ -224,7 +224,7 @@ struct ILocalizationManager // Summary: // Return number of localization entries. - virtual int GetLocalizedStringCount() override { return -1; } + int GetLocalizedStringCount() override { return -1; } // Summary: // Get the localization info structure at index nIndex. @@ -251,7 +251,7 @@ struct ILocalizationManager // sLocalizedString - Corresponding english language string. // Returns: // True if successful, false otherwise (key not found). - virtual bool GetEnglishString([[maybe_unused]] const char* sKey, [[maybe_unused]] AZStd::string& sLocalizedString) override { return false; } + bool GetEnglishString([[maybe_unused]] const char* sKey, [[maybe_unused]] AZStd::string& sLocalizedString) override { return false; } // Summary: // Get Subtitle for Key or Label . @@ -261,25 +261,25 @@ struct ILocalizationManager // bForceSubtitle - If true, get subtitle (sLocalized or sEnglish) even if not specified in Data file. // Returns: // True if subtitle found (and outSubtitle filled in), false otherwise. - virtual bool GetSubtitle([[maybe_unused]] const char* sKeyOrLabel, [[maybe_unused]] AZStd::string& outSubtitle, [[maybe_unused]] bool bForceSubtitle = false) override { return false; } + bool GetSubtitle([[maybe_unused]] const char* sKeyOrLabel, [[maybe_unused]] AZStd::string& outSubtitle, [[maybe_unused]] bool bForceSubtitle = false) override { return false; } // Description: // These methods format outString depending on sString with ordered arguments // FormatStringMessage(outString, "This is %2 and this is %1", "second", "first"); // Arguments: // outString - This is first and this is second. - virtual void FormatStringMessage_List([[maybe_unused]] AZStd::string& outString, [[maybe_unused]] const AZStd::string& sString, [[maybe_unused]] const char** sParams, [[maybe_unused]] int nParams) override {} - virtual void FormatStringMessage([[maybe_unused]] AZStd::string& outString, [[maybe_unused]] const AZStd::string& sString, [[maybe_unused]] const char* param1, [[maybe_unused]] const char* param2 = 0, [[maybe_unused]] const char* param3 = 0, [[maybe_unused]] const char* param4 = 0) override {} + void FormatStringMessage_List([[maybe_unused]] AZStd::string& outString, [[maybe_unused]] const AZStd::string& sString, [[maybe_unused]] const char** sParams, [[maybe_unused]] int nParams) override {} + void FormatStringMessage([[maybe_unused]] AZStd::string& outString, [[maybe_unused]] const AZStd::string& sString, [[maybe_unused]] const char* param1, [[maybe_unused]] const char* param2 = nullptr, [[maybe_unused]] const char* param3 = nullptr, [[maybe_unused]] const char* param4 = nullptr) override {} - virtual void LocalizeTime([[maybe_unused]] time_t t, [[maybe_unused]] bool bMakeLocalTime, [[maybe_unused]] bool bShowSeconds, [[maybe_unused]] AZStd::string& outTimeString) override {} - virtual void LocalizeDate([[maybe_unused]] time_t t, [[maybe_unused]] bool bMakeLocalTime, [[maybe_unused]] bool bShort, [[maybe_unused]] bool bIncludeWeekday, [[maybe_unused]] AZStd::string& outDateString) override {} - virtual void LocalizeDuration([[maybe_unused]] int seconds, [[maybe_unused]] AZStd::string& outDurationString) override {} - virtual void LocalizeNumber([[maybe_unused]] int number, [[maybe_unused]] AZStd::string& outNumberString) override {} - virtual void LocalizeNumber_Decimal([[maybe_unused]] float number, [[maybe_unused]] int decimals, [[maybe_unused]] AZStd::string& outNumberString) override {} + void LocalizeTime([[maybe_unused]] time_t t, [[maybe_unused]] bool bMakeLocalTime, [[maybe_unused]] bool bShowSeconds, [[maybe_unused]] AZStd::string& outTimeString) override {} + void LocalizeDate([[maybe_unused]] time_t t, [[maybe_unused]] bool bMakeLocalTime, [[maybe_unused]] bool bShort, [[maybe_unused]] bool bIncludeWeekday, [[maybe_unused]] AZStd::string& outDateString) override {} + void LocalizeDuration([[maybe_unused]] int seconds, [[maybe_unused]] AZStd::string& outDurationString) override {} + void LocalizeNumber([[maybe_unused]] int number, [[maybe_unused]] AZStd::string& outNumberString) override {} + void LocalizeNumber_Decimal([[maybe_unused]] float number, [[maybe_unused]] int decimals, [[maybe_unused]] AZStd::string& outNumberString) override {} // Summary: // Returns true if the project has localization configured for use, false otherwise. - virtual bool ProjectUsesLocalization() const override { return false; } + bool ProjectUsesLocalization() const override { return false; } // static ILINE TLocalizationBitfield LocalizationBitfieldFromPILID(EPlatformIndependentLanguageID pilid) diff --git a/Code/Legacy/CrySystem/LocalizedStringManager.h b/Code/Legacy/CrySystem/LocalizedStringManager.h index 1fba05f9ac..c0a57fd93f 100644 --- a/Code/Legacy/CrySystem/LocalizedStringManager.h +++ b/Code/Legacy/CrySystem/LocalizedStringManager.h @@ -27,7 +27,7 @@ class CLocalizedStringsManager , public ISystemEventListener { public: - typedef std::vector TLocalizationTagVec; + using TLocalizationTagVec = std::vector; constexpr const static size_t LOADING_FIXED_STRING_LENGTH = 2048; constexpr const static size_t COMPRESSION_FIXED_BUFFER_LENGTH = 6144; @@ -36,45 +36,45 @@ public: virtual ~CLocalizedStringsManager(); // ILocalizationManager - const char* LangNameFromPILID(const ILocalizationManager::EPlatformIndependentLanguageID id); + const char* LangNameFromPILID(const ILocalizationManager::EPlatformIndependentLanguageID id) override; ILocalizationManager::EPlatformIndependentLanguageID PILIDFromLangName(AZStd::string langName) override; ILocalizationManager::EPlatformIndependentLanguageID GetSystemLanguage() override; - ILocalizationManager::TLocalizationBitfield MaskSystemLanguagesFromSupportedLocalizations(const ILocalizationManager::TLocalizationBitfield systemLanguages); - ILocalizationManager::TLocalizationBitfield IsLanguageSupported(const ILocalizationManager::EPlatformIndependentLanguageID id); + ILocalizationManager::TLocalizationBitfield MaskSystemLanguagesFromSupportedLocalizations(const ILocalizationManager::TLocalizationBitfield systemLanguages) override; + ILocalizationManager::TLocalizationBitfield IsLanguageSupported(const ILocalizationManager::EPlatformIndependentLanguageID id) override; const char* GetLanguage() override; bool SetLanguage(const char* sLanguage) override; int GetLocalizationFormat() const override; - virtual AZStd::string GetLocalizedSubtitleFilePath(const AZStd::string& localVideoPath, const AZStd::string& subtitleFileExtension) const override; - virtual AZStd::string GetLocalizedLocXMLFilePath(const AZStd::string& localXmlPath) const override; - bool InitLocalizationData(const char* sFileName, bool bReload = false); - bool RequestLoadLocalizationDataByTag(const char* sTag); - bool LoadLocalizationDataByTag(const char* sTag, bool bReload = false); - bool ReleaseLocalizationDataByTag(const char* sTag); + AZStd::string GetLocalizedSubtitleFilePath(const AZStd::string& localVideoPath, const AZStd::string& subtitleFileExtension) const override; + AZStd::string GetLocalizedLocXMLFilePath(const AZStd::string& localXmlPath) const override; + bool InitLocalizationData(const char* sFileName, bool bReload = false) override; + bool RequestLoadLocalizationDataByTag(const char* sTag) override; + bool LoadLocalizationDataByTag(const char* sTag, bool bReload = false) override; + bool ReleaseLocalizationDataByTag(const char* sTag) override; bool LoadAllLocalizationData(bool bReload = false) override; bool LoadExcelXmlSpreadsheet(const char* sFileName, bool bReload = false) override; void ReloadData() override; - void FreeData(); + void FreeData() override; bool LocalizeString_s(const AZStd::string& sString, AZStd::string& outLocalizedString, bool bEnglish = false) override; bool LocalizeString_ch(const char* sString, AZStd::string& outLocalizedString, bool bEnglish = false) override; void LocalizeAndSubstituteInternal(AZStd::string& locString, const AZStd::vector& keys, const AZStd::vector& values) override; bool LocalizeLabel(const char* sLabel, AZStd::string& outLocalizedString, bool bEnglish = false) override; - bool IsLocalizedInfoFound(const char* sKey); - bool GetLocalizedInfoByKey(const char* sKey, SLocalizedInfoGame& outGameInfo); - bool GetLocalizedInfoByKey(const char* sKey, SLocalizedSoundInfoGame* pOutSoundInfoGame); - int GetLocalizedStringCount(); - bool GetLocalizedInfoByIndex(int nIndex, SLocalizedInfoGame& outGameInfo); - bool GetLocalizedInfoByIndex(int nIndex, SLocalizedInfoEditor& outEditorInfo); + bool IsLocalizedInfoFound(const char* sKey) override; + bool GetLocalizedInfoByKey(const char* sKey, SLocalizedInfoGame& outGameInfo) override; + bool GetLocalizedInfoByKey(const char* sKey, SLocalizedSoundInfoGame* pOutSoundInfoGame) override; + int GetLocalizedStringCount() override; + bool GetLocalizedInfoByIndex(int nIndex, SLocalizedInfoGame& outGameInfo) override; + bool GetLocalizedInfoByIndex(int nIndex, SLocalizedInfoEditor& outEditorInfo) override; bool GetEnglishString(const char* sKey, AZStd::string& sLocalizedString) override; bool GetSubtitle(const char* sKeyOrLabel, AZStd::string& outSubtitle, bool bForceSubtitle = false) override; void FormatStringMessage_List(AZStd::string& outString, const AZStd::string& sString, const char** sParams, int nParams) override; - void FormatStringMessage(AZStd::string& outString, const AZStd::string& sString, const char* param1, const char* param2 = 0, const char* param3 = 0, const char* param4 = 0) override; + void FormatStringMessage(AZStd::string& outString, const AZStd::string& sString, const char* param1, const char* param2 = nullptr, const char* param3 = nullptr, const char* param4 = nullptr) override; void LocalizeTime(time_t t, bool bMakeLocalTime, bool bShowSeconds, AZStd::string& outTimeString) override; void LocalizeDate(time_t t, bool bMakeLocalTime, bool bShort, bool bIncludeWeekday, AZStd::string& outDateString) override; @@ -86,7 +86,7 @@ public: // ~ILocalizationManager // ISystemEventManager - void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam); + void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override; // ~ISystemEventManager int GetMemoryUsage(ICrySizer* pSizer); @@ -100,7 +100,7 @@ private: bool LocalizeStringInternal(const char* pStr, size_t len, AZStd::string& outLocalizedString, bool bEnglish); bool DoLoadExcelXmlSpreadsheet(const char* sFileName, uint8 tagID, bool bReload); - typedef bool(CLocalizedStringsManager::*LoadFunc)(const char*, uint8, bool); + using LoadFunc = bool(CLocalizedStringsManager::*)(const char*, uint8, bool); bool DoLoadAGSXmlDocument(const char* sFileName, uint8 tagID, bool bReload); LoadFunc GetLoadFunction() const; @@ -176,9 +176,9 @@ private: SLocalizedStringEntry() : flags(0) , huffmanTreeIndex(-1) - , pEditorExtension(NULL) + , pEditorExtension(nullptr) { - TranslatedText.psUtf8Uncompressed = NULL; + TranslatedText.psUtf8Uncompressed = nullptr; }; ~SLocalizedStringEntry() { @@ -201,7 +201,7 @@ private: pSizer->AddObject(sCharacterName); - if ((flags & IS_COMPRESSED) == 0 && TranslatedText.psUtf8Uncompressed != NULL) //Number of bytes stored for compressed text is unknown, which throws this GetMemoryUsage off + if ((flags & IS_COMPRESSED) == 0 && TranslatedText.psUtf8Uncompressed != nullptr) //Number of bytes stored for compressed text is unknown, which throws this GetMemoryUsage off { pSizer->AddObject(*TranslatedText.psUtf8Uncompressed); } @@ -211,7 +211,7 @@ private: pSizer->AddObject(SoundMoods); pSizer->AddObject(EventParameters); - if (pEditorExtension != NULL) + if (pEditorExtension != nullptr) { pEditorExtension->GetMemoryUsage(pSizer); } @@ -219,12 +219,12 @@ private: }; //Keys as CRC32. Strings previously, but these proved too large - typedef VectorMap StringsKeyMap; + using StringsKeyMap = VectorMap; struct SLanguage { - typedef std::vector TLocalizedStringEntries; - typedef std::vector THuffmanCoders; + using TLocalizedStringEntries = std::vector; + using THuffmanCoders = std::vector; AZStd::string sLanguage; StringsKeyMap m_keysMap; @@ -268,27 +268,27 @@ private: SLanguage* m_pLanguage; // all loaded Localization Files - typedef std::pair pairFileName; - typedef std::map tmapFilenames; + using pairFileName = std::pair; + using tmapFilenames = std::map; tmapFilenames m_loadedTables; // filenames per tag - typedef std::vector TStringVec; + using TStringVec = std::vector; struct STag { TStringVec filenames; uint8 id; bool loaded; }; - typedef std::map TTagFileNames; + using TTagFileNames = std::map; TTagFileNames m_tagFileNames; TStringVec m_tagLoadRequests; // Array of loaded languages. std::vector m_languages; - typedef std::set PrototypeSoundEvents; + using PrototypeSoundEvents = std::set; PrototypeSoundEvents m_prototypeEvents; // this set is purely used for clever string/string assigning to save memory struct less_strcmp @@ -299,7 +299,7 @@ private: } }; - typedef std::set CharacterNameSet; + using CharacterNameSet = std::set; CharacterNameSet m_characterNameSet; // this set is purely used for clever string/string assigning to save memory // CVARs @@ -312,5 +312,5 @@ private: //Lock for mutable AZStd::mutex m_cs; - typedef AZStd::lock_guard AutoLock; + using AutoLock = AZStd::lock_guard; }; diff --git a/Code/Legacy/CrySystem/System.h b/Code/Legacy/CrySystem/System.h index 738ffd4bfb..3244143cdf 100644 --- a/Code/Legacy/CrySystem/System.h +++ b/Code/Legacy/CrySystem/System.h @@ -159,7 +159,7 @@ class CWatchdogThread; #endif #ifdef WIN32 -typedef void* WIN_HMODULE; +using WIN_HMODULE = void*; #else typedef void* WIN_HMODULE; #endif @@ -174,7 +174,7 @@ struct IDataProbe; #define PHSYICS_OBJECT_ENTITY 0 -typedef void (__cdecl * VTuneFunction)(void); +using VTuneFunction = void (__cdecl *)(void); extern VTuneFunction VTResume; extern VTuneFunction VTPause; @@ -246,10 +246,10 @@ struct CProfilingSystem // Summary: // Resumes vtune data collection. - virtual void VTuneResume(); + void VTuneResume() override; // Summary: // Pauses vtune data collection. - virtual void VTunePause(); + void VTunePause() override; ////////////////////////////////////////////////////////////////////////// }; @@ -286,105 +286,105 @@ public: // interface ILoadConfigurationEntrySink ---------------------------------- - virtual void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup); + void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup) override; // ISystemEventListener - virtual void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam); + void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override; /////////////////////////////////////////////////////////////////////////// //! @name ISystem implementation //@{ virtual bool Init(const SSystemInitParams& startupParams); - virtual void Release(); + void Release() override; - virtual SSystemGlobalEnvironment* GetGlobalEnvironment() { return &m_env; } + SSystemGlobalEnvironment* GetGlobalEnvironment() override { return &m_env; } - virtual bool UpdatePreTickBus(int updateFlags = 0, int nPauseMode = 0); - virtual bool UpdatePostTickBus(int updateFlags = 0, int nPauseMode = 0); - virtual bool UpdateLoadtime(); + bool UpdatePreTickBus(int updateFlags = 0, int nPauseMode = 0) override; + bool UpdatePostTickBus(int updateFlags = 0, int nPauseMode = 0) override; + bool UpdateLoadtime() override; //////////////////////////////////////////////////////////////////////// // CrySystemRequestBus interface implementation ISystem* GetCrySystem() override; //////////////////////////////////////////////////////////////////////// - void Relaunch(bool bRelaunch); - bool IsRelaunch() const { return m_bRelaunch; }; + void Relaunch(bool bRelaunch) override; + bool IsRelaunch() const override { return m_bRelaunch; }; - void SerializingFile(int mode) { m_iLoadingMode = mode; } - int IsSerializingFile() const { return m_iLoadingMode; } - void Quit(); - bool IsQuitting() const; + void SerializingFile(int mode) override { m_iLoadingMode = mode; } + int IsSerializingFile() const override { return m_iLoadingMode; } + void Quit() override; + bool IsQuitting() const override; void ShutdownFileSystem(); // used to cleanup any file resources, such as cache handle. void SetAffinity(); - virtual const char* GetUserName(); - virtual int GetApplicationInstance(); + const char* GetUserName() override; + int GetApplicationInstance() override; int GetApplicationLogInstance(const char* logFilePath) override; - ITimer* GetITimer(){ return m_env.pTimer; } - AZ::IO::IArchive* GetIPak() { return m_env.pCryPak; }; - IConsole* GetIConsole() { return m_env.pConsole; }; - IRemoteConsole* GetIRemoteConsole(); - IMovieSystem* GetIMovieSystem() { return m_env.pMovieSystem; }; - ICryFont* GetICryFont(){ return m_env.pCryFont; } - ILog* GetILog(){ return m_env.pLog; } - ICmdLine* GetICmdLine(){ return m_pCmdLine; } - IViewSystem* GetIViewSystem(); - ILevelSystem* GetILevelSystem(); - ISystemEventDispatcher* GetISystemEventDispatcher() { return m_pSystemEventDispatcher; } - IProfilingSystem* GetIProfilingSystem() { return &m_ProfilingSystem; } + ITimer* GetITimer() override{ return m_env.pTimer; } + AZ::IO::IArchive* GetIPak() override { return m_env.pCryPak; }; + IConsole* GetIConsole() override { return m_env.pConsole; }; + IRemoteConsole* GetIRemoteConsole() override; + IMovieSystem* GetIMovieSystem() override { return m_env.pMovieSystem; }; + ICryFont* GetICryFont() override{ return m_env.pCryFont; } + ILog* GetILog() override{ return m_env.pLog; } + ICmdLine* GetICmdLine() override{ return m_pCmdLine; } + IViewSystem* GetIViewSystem() override; + ILevelSystem* GetILevelSystem() override; + ISystemEventDispatcher* GetISystemEventDispatcher() override { return m_pSystemEventDispatcher; } + IProfilingSystem* GetIProfilingSystem() override { return &m_ProfilingSystem; } ////////////////////////////////////////////////////////////////////////// // retrieves the perlin noise singleton instance - CPNoise3* GetNoiseGen(); - virtual uint64 GetUpdateCounter() { return m_nUpdateCounter; }; + CPNoise3* GetNoiseGen() override; + uint64 GetUpdateCounter() override { return m_nUpdateCounter; }; void DetectGameFolderAccessRights(); - virtual void ExecuteCommandLine(bool deferred=true); + void ExecuteCommandLine(bool deferred=true) override; - virtual void GetUpdateStats(SSystemUpdateStats& stats); + void GetUpdateStats(SSystemUpdateStats& stats) override; ////////////////////////////////////////////////////////////////////////// - virtual XmlNodeRef CreateXmlNode(const char* sNodeName = "", bool bReuseStrings = false, bool bIsProcessingInstruction = false); - virtual XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false); - virtual XmlNodeRef LoadXmlFromBuffer(const char* buffer, size_t size, bool bReuseStrings = false, bool bSuppressWarnings = false); - virtual IXmlUtils* GetXmlUtils(); + XmlNodeRef CreateXmlNode(const char* sNodeName = "", bool bReuseStrings = false, bool bIsProcessingInstruction = false) override; + XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false) override; + XmlNodeRef LoadXmlFromBuffer(const char* buffer, size_t size, bool bReuseStrings = false, bool bSuppressWarnings = false) override; + IXmlUtils* GetXmlUtils() override; ////////////////////////////////////////////////////////////////////////// - void IgnoreUpdates(bool bIgnore) { m_bIgnoreUpdates = bIgnore; }; + void IgnoreUpdates(bool bIgnore) override { m_bIgnoreUpdates = bIgnore; }; - void SetIProcess(IProcess* process); - IProcess* GetIProcess(){ return m_pProcess; } + void SetIProcess(IProcess* process) override; + IProcess* GetIProcess() override{ return m_pProcess; } - bool IsTestMode() const { return m_bTestMode; } + bool IsTestMode() const override { return m_bTestMode; } //@} void SleepIfNeeded(); - virtual void FatalError(const char* format, ...) PRINTF_PARAMS(2, 3); - virtual void ReportBug(const char* format, ...) PRINTF_PARAMS(2, 3); + void FatalError(const char* format, ...) override PRINTF_PARAMS(2, 3); + void ReportBug(const char* format, ...) override PRINTF_PARAMS(2, 3); // Validator Warning. - void WarningV(EValidatorModule module, EValidatorSeverity severity, int flags, const char* file, const char* format, va_list args); - void Warning(EValidatorModule module, EValidatorSeverity severity, int flags, const char* file, const char* format, ...); - virtual int ShowMessage(const char* text, const char* caption, unsigned int uType); - bool CheckLogVerbosity(int verbosity); + void WarningV(EValidatorModule module, EValidatorSeverity severity, int flags, const char* file, const char* format, va_list args) override; + void Warning(EValidatorModule module, EValidatorSeverity severity, int flags, const char* file, const char* format, ...) override; + int ShowMessage(const char* text, const char* caption, unsigned int uType) override; + bool CheckLogVerbosity(int verbosity) override; //! Return pointer to user defined callback. ISystemUserCallback* GetUserCallback() const { return m_pUserCallback; }; ////////////////////////////////////////////////////////////////////////// - virtual void SaveConfiguration(); - virtual void LoadConfiguration(const char* sFilename, ILoadConfigurationEntrySink* pSink = 0, bool warnIfMissing = true); - virtual ESystemConfigSpec GetMaxConfigSpec() const; - virtual ESystemConfigPlatform GetConfigPlatform() const; - virtual void SetConfigPlatform(ESystemConfigPlatform platform); + void SaveConfiguration() override; + void LoadConfiguration(const char* sFilename, ILoadConfigurationEntrySink* pSink = nullptr, bool warnIfMissing = true) override; + ESystemConfigSpec GetMaxConfigSpec() const override; + ESystemConfigPlatform GetConfigPlatform() const override; + void SetConfigPlatform(ESystemConfigPlatform platform) override; ////////////////////////////////////////////////////////////////////////// - virtual bool IsPaused() const { return m_bPaused; }; + bool IsPaused() const override { return m_bPaused; }; - virtual ILocalizationManager* GetLocalizationManager(); - virtual void debug_GetCallStack(const char** pFunctions, int& nCount); - virtual void debug_LogCallStack(int nMaxFuncs = 32, int nFlags = 0); + ILocalizationManager* GetLocalizationManager() override; + void debug_GetCallStack(const char** pFunctions, int& nCount) override; + void debug_LogCallStack(int nMaxFuncs = 32, int nFlags = 0) override; // Get the current callstack in raw address form (more lightweight than the above functions) // static as memReplay needs it before CSystem has been setup - expose a ISystem interface to this function if you need it outside CrySystem static void debug_GetCallStackRaw(void** callstack, uint32& callstackLength); @@ -399,13 +399,13 @@ public: #if defined(WIN32) friend LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif - virtual void* GetRootWindowMessageHandler(); - virtual void RegisterWindowMessageHandler(IWindowMessageHandler* pHandler); - virtual void UnregisterWindowMessageHandler(IWindowMessageHandler* pHandler); + void* GetRootWindowMessageHandler() override; + void RegisterWindowMessageHandler(IWindowMessageHandler* pHandler) override; + void UnregisterWindowMessageHandler(IWindowMessageHandler* pHandler) override; // IWindowMessageHandler #if defined(WIN32) - virtual bool HandleMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult); + bool HandleMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult) override; #endif // ~IWindowMessageHandler @@ -448,7 +448,7 @@ private: bool ReLaunchMediaCenter(); void UpdateAudioSystems(); - void AddCVarGroupDirectory(const AZStd::string& sPath); + void AddCVarGroupDirectory(const AZStd::string& sPath) override; AZStd::unique_ptr LoadDynamiclibrary(const char* dllName) const; @@ -464,13 +464,13 @@ public: // interface ISystem ------------------------------------------- virtual IDataProbe* GetIDataProbe() { return m_pDataProbe; }; - virtual void SetForceNonDevMode(bool bValue); - virtual bool GetForceNonDevMode() const; - virtual bool WasInDevMode() const { return m_bWasInDevMode; }; - virtual bool IsDevMode() const { return m_bInDevMode && !GetForceNonDevMode(); } + void SetForceNonDevMode(bool bValue) override; + bool GetForceNonDevMode() const override; + bool WasInDevMode() const override { return m_bWasInDevMode; }; + bool IsDevMode() const override { return m_bInDevMode && !GetForceNonDevMode(); } - virtual void SetConsoleDrawEnabled(bool enabled) { m_bDrawConsole = enabled; } - virtual void SetUIDrawEnabled(bool enabled) { m_bDrawUI = enabled; } + void SetConsoleDrawEnabled(bool enabled) override { m_bDrawConsole = enabled; } + void SetUIDrawEnabled(bool enabled) override { m_bDrawUI = enabled; } // ------------------------------------------------------------- @@ -478,10 +478,10 @@ public: //! recreates the variable if necessary ICVar* attachVariable (const char* szVarName, int* pContainer, const char* szComment, int dwFlags = 0); - const CTimeValue& GetLastTickTime(void) const { return m_lastTickTime; } - const ICVar* GetDedicatedMaxRate(void) const { return m_svDedicatedMaxRate; } + const CTimeValue& GetLastTickTime() const { return m_lastTickTime; } + const ICVar* GetDedicatedMaxRate() const { return m_svDedicatedMaxRate; } - std::shared_ptr CreateLocalFileIO(); + std::shared_ptr CreateLocalFileIO() override; private: // ------------------------------------------------------ @@ -654,9 +654,9 @@ public: ////////////////////////////////////////////////////////////////////////// // File version. ////////////////////////////////////////////////////////////////////////// - virtual const SFileVersion& GetFileVersion(); - virtual const SFileVersion& GetProductVersion(); - virtual const SFileVersion& GetBuildVersion(); + const SFileVersion& GetFileVersion() override; + const SFileVersion& GetProductVersion() override; + const SFileVersion& GetBuildVersion() override; bool InitVTuneProfiler(); @@ -671,16 +671,16 @@ public: ////////////////////////////////////////////////////////////////////////// // CryAssert and error related. - virtual bool RegisterErrorObserver(IErrorObserver* errorObserver); - bool UnregisterErrorObserver(IErrorObserver* errorObserver); - virtual void OnAssert(const char* condition, const char* message, const char* fileName, unsigned int fileLineNumber); + bool RegisterErrorObserver(IErrorObserver* errorObserver) override; + bool UnregisterErrorObserver(IErrorObserver* errorObserver) override; + void OnAssert(const char* condition, const char* message, const char* fileName, unsigned int fileLineNumber) override; void OnFatalError(const char* message); - bool IsAssertDialogVisible() const; - void SetAssertVisible(bool bAssertVisble); + bool IsAssertDialogVisible() const override; + void SetAssertVisible(bool bAssertVisble) override; ////////////////////////////////////////////////////////////////////////// - virtual void ClearErrorMessages() + void ClearErrorMessages() override { m_ErrorMessages.clear(); } @@ -690,11 +690,11 @@ public: return m_eRuntimeState == ESYSTEM_EVENT_LEVEL_LOAD_START_LOADINGSCREEN; } - virtual ESystemGlobalState GetSystemGlobalState(void); - virtual void SetSystemGlobalState(ESystemGlobalState systemGlobalState); + ESystemGlobalState GetSystemGlobalState() override; + void SetSystemGlobalState(ESystemGlobalState systemGlobalState) override; #if !defined(_RELEASE) - virtual bool IsSavingResourceList() const { return (g_cvars.archiveVars.nSaveLevelResourceList != 0); } + bool IsSavingResourceList() const override { return (g_cvars.archiveVars.nSaveLevelResourceList != 0); } #endif private: @@ -721,7 +721,7 @@ protected: // ------------------------------------------------------------- float m_Color[4]; bool m_HardFailure; }; - typedef std::list TErrorMessages; + using TErrorMessages = std::list; TErrorMessages m_ErrorMessages; bool m_bHasRenderedErrorMessage; diff --git a/Code/Legacy/CrySystem/Timer.h b/Code/Legacy/CrySystem/Timer.h index 93dffeec13..c988c1fa38 100644 --- a/Code/Legacy/CrySystem/Timer.h +++ b/Code/Legacy/CrySystem/Timer.h @@ -21,7 +21,7 @@ public: // constructor CTimer(); // destructor - ~CTimer() {}; + ~CTimer() = default;; bool Init(); @@ -30,57 +30,57 @@ public: // TODO: Review m_time usage in System.cpp // if it wants Game Time / UI Time or a new Render Time? - virtual void ResetTimer(); - virtual void UpdateOnFrameStart(); - virtual float GetCurrTime(ETimer which = ETIMER_GAME) const; - virtual CTimeValue GetAsyncTime() const; - virtual float GetAsyncCurTime(); // retrieve the actual wall clock time passed since the game started, in seconds - virtual float GetFrameTime(ETimer which = ETIMER_GAME) const; - virtual float GetRealFrameTime() const; - virtual float GetTimeScale() const; - virtual float GetTimeScale(uint32 channel) const; - virtual void SetTimeScale(float scale, uint32 channel = 0); - virtual void ClearTimeScales(); - virtual void EnableTimer(bool bEnable); - virtual float GetFrameRate(); - virtual float GetProfileFrameBlending(float* pfBlendTime = 0, int* piBlendMode = 0); - virtual void Serialize(TSerialize ser); - virtual bool IsTimerEnabled() const; + void ResetTimer() override; + void UpdateOnFrameStart() override; + float GetCurrTime(ETimer which = ETIMER_GAME) const override; + CTimeValue GetAsyncTime() const override; + float GetAsyncCurTime() override; // retrieve the actual wall clock time passed since the game started, in seconds + float GetFrameTime(ETimer which = ETIMER_GAME) const override; + float GetRealFrameTime() const override; + float GetTimeScale() const override; + float GetTimeScale(uint32 channel) const override; + void SetTimeScale(float scale, uint32 channel = 0) override; + void ClearTimeScales() override; + void EnableTimer(bool bEnable) override; + float GetFrameRate() override; + float GetProfileFrameBlending(float* pfBlendTime = nullptr, int* piBlendMode = nullptr) override; + void Serialize(TSerialize ser) override; + bool IsTimerEnabled() const override; //! try to pause/unpause a timer // returns true if successfully paused/unpaused, false otherwise - virtual bool PauseTimer(ETimer which, bool bPause); + bool PauseTimer(ETimer which, bool bPause) override; //! determine if a timer is paused // returns true if paused, false otherwise - virtual bool IsTimerPaused(ETimer which); + bool IsTimerPaused(ETimer which) override; //! try to set a timer // return true if successful, false otherwise - virtual bool SetTimer(ETimer which, float timeInSeconds); + bool SetTimer(ETimer which, float timeInSeconds) override; //! make a tm struct from a time_t in UTC (like gmtime) - virtual void SecondsToDateUTC(time_t time, struct tm& outDateUTC); + void SecondsToDateUTC(time_t time, struct tm& outDateUTC) override; //! make a UTC time from a tm (like timegm, but not available on all platforms) - virtual time_t DateToSecondsUTC(struct tm& timePtr); + time_t DateToSecondsUTC(struct tm& timePtr) override; //! Convert from Tics to Seconds - virtual float TicksToSeconds(int64 ticks) + float TicksToSeconds(int64 ticks) override { return float((double)ticks * m_fSecsPerTick); } //! Get number of ticks per second - virtual int64 GetTicksPerSecond() + int64 GetTicksPerSecond() override { return m_lTicksPerSec; } - virtual const CTimeValue& GetFrameStartTime(ETimer which = ETIMER_GAME) const { return m_CurrTime[(int)which]; } - virtual ITimer* CreateNewTimer(); + const CTimeValue& GetFrameStartTime(ETimer which = ETIMER_GAME) const override { return m_CurrTime[(int)which]; } + ITimer* CreateNewTimer() override; - virtual void EnableFixedTimeMode(bool enable, float timeStep) override; + void EnableFixedTimeMode(bool enable, float timeStep) override; private: // --------------------------------------------------------------------- diff --git a/Code/Legacy/CrySystem/ViewSystem/View.h b/Code/Legacy/CrySystem/ViewSystem/View.h index 689c254897..c58aa19ee5 100644 --- a/Code/Legacy/CrySystem/ViewSystem/View.h +++ b/Code/Legacy/CrySystem/ViewSystem/View.h @@ -87,24 +87,24 @@ public: // IView - virtual void Release(); - virtual void Update(float frameTime, bool isActive); + void Release() override; + void Update(float frameTime, bool isActive) override; virtual void ProcessShaking(float frameTime); virtual void ProcessShake(SShake* pShake, float frameTime); - virtual void ResetShaking(); - virtual void ResetBlending() { m_viewParams.ResetBlending(); } - virtual void LinkTo(AZ::Entity* follow); - virtual void Unlink(); - virtual AZ::EntityId GetLinkedId() {return m_linkedTo; }; - virtual void SetCurrentParams(SViewParams& params) { m_viewParams = params; }; - virtual const SViewParams* GetCurrentParams() {return &m_viewParams; } - virtual void SetViewShake(Ang3 shakeAngle, Vec3 shakeShift, float duration, float frequency, float randomness, int shakeID, bool bFlipVec = true, bool bUpdateOnly = false, bool bGroundOnly = false); - virtual void SetViewShakeEx(const SShakeParams& params); - virtual void StopShake(int shakeID); - virtual void SetFrameAdditiveCameraAngles(const Ang3& addFrameAngles); - virtual void SetScale(const float scale); - virtual void SetZoomedScale(const float scale); - virtual void SetActive(const bool bActive); + void ResetShaking() override; + void ResetBlending() override { m_viewParams.ResetBlending(); } + void LinkTo(AZ::Entity* follow) override; + void Unlink() override; + AZ::EntityId GetLinkedId() override {return m_linkedTo; }; + void SetCurrentParams(SViewParams& params) override { m_viewParams = params; }; + const SViewParams* GetCurrentParams() override {return &m_viewParams; } + void SetViewShake(Ang3 shakeAngle, Vec3 shakeShift, float duration, float frequency, float randomness, int shakeID, bool bFlipVec = true, bool bUpdateOnly = false, bool bGroundOnly = false) override; + void SetViewShakeEx(const SShakeParams& params) override; + void StopShake(int shakeID) override; + void SetFrameAdditiveCameraAngles(const Ang3& addFrameAngles) override; + void SetScale(const float scale) override; + void SetZoomedScale(const float scale) override; + void SetActive(const bool bActive) override; // ~IView void PostSerialize() override; diff --git a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h index dd49e09e04..d9e8962d71 100644 --- a/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h +++ b/Code/Legacy/CrySystem/ViewSystem/ViewSystem.h @@ -29,60 +29,60 @@ class CViewSystem { private: - typedef std::map TViewMap; - typedef std::vector TViewIdVector; + using TViewMap = std::map; + using TViewIdVector = std::vector; public: //IViewSystem - virtual IView* CreateView(); - virtual unsigned int AddView(IView* pView) override; - virtual void RemoveView(IView* pView); - virtual void RemoveView(unsigned int viewId); + IView* CreateView() override; + unsigned int AddView(IView* pView) override; + void RemoveView(IView* pView) override; + void RemoveView(unsigned int viewId) override; - virtual void SetActiveView(IView* pView); - virtual void SetActiveView(unsigned int viewId); + void SetActiveView(IView* pView) override; + void SetActiveView(unsigned int viewId) override; //CameraSystemRequestBus AZ::EntityId GetActiveCamera() override { return m_activeViewId ? GetActiveView()->GetLinkedId() : AZ::EntityId(); } //utility functions - virtual IView* GetView(unsigned int viewId); - virtual IView* GetActiveView(); + IView* GetView(unsigned int viewId) override; + IView* GetActiveView() override; - virtual unsigned int GetViewId(IView* pView); - virtual unsigned int GetActiveViewId(); + unsigned int GetViewId(IView* pView) override; + unsigned int GetActiveViewId() override; - virtual void PostSerialize(); + void PostSerialize() override; - virtual IView* GetViewByEntityId(const AZ::EntityId& id, bool forceCreate); + IView* GetViewByEntityId(const AZ::EntityId& id, bool forceCreate) override; - virtual float GetDefaultZNear() { return m_fDefaultCameraNearZ; }; - virtual void SetBlendParams(float fBlendPosSpeed, float fBlendRotSpeed, bool performBlendOut) { m_fBlendInPosSpeed = fBlendPosSpeed; m_fBlendInRotSpeed = fBlendRotSpeed; m_bPerformBlendOut = performBlendOut; }; - virtual void SetOverrideCameraRotation(bool bOverride, Quat rotation); - virtual bool IsPlayingCutScene() const + float GetDefaultZNear() override { return m_fDefaultCameraNearZ; }; + void SetBlendParams(float fBlendPosSpeed, float fBlendRotSpeed, bool performBlendOut) override { m_fBlendInPosSpeed = fBlendPosSpeed; m_fBlendInRotSpeed = fBlendRotSpeed; m_bPerformBlendOut = performBlendOut; }; + void SetOverrideCameraRotation(bool bOverride, Quat rotation) override; + bool IsPlayingCutScene() const override { return m_cutsceneCount > 0; } - virtual void SetDeferredViewSystemUpdate(bool const bDeferred){ m_useDeferredViewSystemUpdate = bDeferred; } - virtual bool UseDeferredViewSystemUpdate() const { return m_useDeferredViewSystemUpdate; } - virtual void SetControlAudioListeners(bool const bActive); + void SetDeferredViewSystemUpdate(bool const bDeferred) override{ m_useDeferredViewSystemUpdate = bDeferred; } + bool UseDeferredViewSystemUpdate() const override { return m_useDeferredViewSystemUpdate; } + void SetControlAudioListeners(bool const bActive) override; //~IViewSystem //IMovieUser - virtual void SetActiveCamera(const SCameraParams& Params); - virtual void BeginCutScene(IAnimSequence* pSeq, unsigned long dwFlags, bool bResetFX); - virtual void EndCutScene(IAnimSequence* pSeq, unsigned long dwFlags); - virtual void SendGlobalEvent(const char* pszEvent); + void SetActiveCamera(const SCameraParams& Params) override; + void BeginCutScene(IAnimSequence* pSeq, unsigned long dwFlags, bool bResetFX) override; + void EndCutScene(IAnimSequence* pSeq, unsigned long dwFlags) override; + void SendGlobalEvent(const char* pszEvent) override; //~IMovieUser // ILevelSystemListener - virtual void OnLevelNotFound([[maybe_unused]] const char* levelName) {}; - virtual void OnLoadingStart([[maybe_unused]] const char* levelName); - virtual void OnLoadingComplete([[maybe_unused]] const char* levelName){}; - virtual void OnLoadingError([[maybe_unused]] const char* levelName, [[maybe_unused]] const char* error){}; - virtual void OnLoadingProgress([[maybe_unused]] const char* levelName, [[maybe_unused]] int progressAmount){}; - virtual void OnUnloadComplete([[maybe_unused]] const char* levelName); + void OnLevelNotFound([[maybe_unused]] const char* levelName) override {}; + void OnLoadingStart([[maybe_unused]] const char* levelName) override; + void OnLoadingComplete([[maybe_unused]] const char* levelName) override{}; + void OnLoadingError([[maybe_unused]] const char* levelName, [[maybe_unused]] const char* error) override{}; + void OnLoadingProgress([[maybe_unused]] const char* levelName, [[maybe_unused]] int progressAmount) override{}; + void OnUnloadComplete([[maybe_unused]] const char* levelName) override; //~ILevelSystemListener CViewSystem(ISystem* pSystem); @@ -91,16 +91,16 @@ public: void Release() override { delete this; }; void Update(float frameTime) override; - virtual void ForceUpdate(float elapsed) { Update(elapsed); } + void ForceUpdate(float elapsed) override { Update(elapsed); } //void RegisterViewClass(const char *name, IView *(*func)()); - bool AddListener(IViewSystemListener* pListener) + bool AddListener(IViewSystemListener* pListener) override { return stl::push_back_unique(m_listeners, pListener); } - bool RemoveListener(IViewSystemListener* pListener) + bool RemoveListener(IViewSystemListener* pListener) override { return stl::find_and_erase(m_listeners, pListener); } diff --git a/Code/Legacy/CrySystem/XConsole.h b/Code/Legacy/CrySystem/XConsole.h index 3ff9824e6f..2069d31a74 100644 --- a/Code/Legacy/CrySystem/XConsole.h +++ b/Code/Legacy/CrySystem/XConsole.h @@ -50,7 +50,7 @@ struct CConsoleCommand ////////////////////////////////////////////////////////////////////////// CConsoleCommand() - : m_func(0) + : m_func(nullptr) , m_nFlags(0) {} size_t sizeofThis () const {return sizeof(*this) + m_sName.capacity() + 1 + m_sCommand.capacity() + 1; } void GetMemoryUsage (class ICrySizer* pSizer) const @@ -70,18 +70,18 @@ struct CConsoleCommandArgs CConsoleCommandArgs(AZStd::string& line, std::vector& args) : m_line(line) , m_args(args) {}; - virtual int GetArgCount() const { return static_cast(m_args.size()); }; + int GetArgCount() const override { return static_cast(m_args.size()); }; // Get argument by index, nIndex must be in 0 <= nIndex < GetArgCount() - virtual const char* GetArg(int nIndex) const + const char* GetArg(int nIndex) const override { assert(nIndex >= 0 && nIndex < GetArgCount()); if (!(nIndex >= 0 && nIndex < GetArgCount())) { - return NULL; + return nullptr; } return m_args[nIndex].c_str(); } - virtual const char* GetCommandLine() const + const char* GetCommandLine() const override { return m_line.c_str(); } @@ -118,9 +118,9 @@ class CXConsole , public AzFramework::CommandRegistrationBus::Handler { public: - typedef std::deque ConsoleBuffer; - typedef ConsoleBuffer::iterator ConsoleBufferItor; - typedef ConsoleBuffer::reverse_iterator ConsoleBufferRItor; + using ConsoleBuffer = std::deque; + using ConsoleBufferItor = ConsoleBuffer::iterator; + using ConsoleBufferRItor = ConsoleBuffer::reverse_iterator; // constructor CXConsole(); @@ -136,71 +136,71 @@ public: void Paste(); // interface IConsole --------------------------------------------------------- - virtual void Release(); + void Release() override; - virtual void Init(ISystem* pSystem); - virtual ICVar* RegisterString(const char* sName, const char* sValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* RegisterFloat(const char* sName, float fValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = 0); - virtual ICVar* Register(const char* name, float* src, float defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true); - virtual ICVar* Register(const char* name, int* src, int defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true); - virtual ICVar* Register(const char* name, const char** src, const char* defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = 0, bool allowModify = true); - virtual ICVar* Register(ICVar* pVar) { RegisterVar(pVar); return pVar; } + void Init(ISystem* pSystem) override; + ICVar* RegisterString(const char* sName, const char* sValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) override; + ICVar* RegisterInt(const char* sName, int iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) override; + ICVar* RegisterInt64(const char* sName, int64 iValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) override; + ICVar* RegisterFloat(const char* sName, float fValue, int nFlags, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr) override; + ICVar* Register(const char* name, float* src, float defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr, bool allowModify = true) override; + ICVar* Register(const char* name, int* src, int defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr, bool allowModify = true) override; + ICVar* Register(const char* name, const char** src, const char* defaultvalue, int flags = 0, const char* help = "", ConsoleVarFunc pChangeFunc = nullptr, bool allowModify = true) override; + ICVar* Register(ICVar* pVar) override { RegisterVar(pVar); return pVar; } - virtual void UnregisterVariable(const char* sVarName, bool bDelete = false); - virtual void SetScrollMax(int value); - virtual void AddOutputPrintSink(IOutputPrintSink* inpSink); - virtual void RemoveOutputPrintSink(IOutputPrintSink* inpSink); - virtual void ShowConsole(bool show, int iRequestScrollMax = -1); - virtual void DumpCVars(ICVarDumpSink* pCallback, unsigned int nFlagsFilter = 0); - virtual void DumpKeyBinds(IKeyBindDumpSink* pCallback); - virtual void CreateKeyBind(const char* sCmd, const char* sRes); - virtual const char* FindKeyBind(const char* sCmd) const; - virtual void SetImage(ITexture* pImage, bool bDeleteCurrent); - virtual inline ITexture* GetImage() { return m_pImage; } - virtual void StaticBackground(bool bStatic) { m_bStaticBackground = bStatic; } - virtual bool GetLineNo(int indwLineNo, char* outszBuffer, int indwBufferSize) const; - virtual int GetLineCount() const; - virtual ICVar* GetCVar(const char* name); - virtual char* GetVariable(const char* szVarName, const char* szFileName, const char* def_val); - virtual float GetVariable(const char* szVarName, const char* szFileName, float def_val); - virtual void PrintLine(const char* s); - virtual void PrintLinePlus(const char* s); - virtual bool GetStatus(); - virtual void Clear(); - virtual void Update(); - virtual void Draw(); - virtual bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = NULL); - virtual bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = NULL); - virtual void RemoveCommand(const char* sName); - virtual void ExecuteString(const char* command, bool bSilentMode, bool bDeferExecution = false); - virtual void ExecuteConsoleCommand(const char* command) override; - virtual void ResetCVarsToDefaults() override; - virtual void Exit(const char* command, ...) PRINTF_PARAMS(2, 3); - virtual bool IsOpened(); - virtual int GetNumVars(); - virtual int GetNumVisibleVars(); - virtual size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = 0); + void UnregisterVariable(const char* sVarName, bool bDelete = false) override; + void SetScrollMax(int value) override; + void AddOutputPrintSink(IOutputPrintSink* inpSink) override; + void RemoveOutputPrintSink(IOutputPrintSink* inpSink) override; + void ShowConsole(bool show, int iRequestScrollMax = -1) override; + void DumpCVars(ICVarDumpSink* pCallback, unsigned int nFlagsFilter = 0) override; + void DumpKeyBinds(IKeyBindDumpSink* pCallback) override; + void CreateKeyBind(const char* sCmd, const char* sRes) override; + const char* FindKeyBind(const char* sCmd) const override; + void SetImage(ITexture* pImage, bool bDeleteCurrent) override; + inline ITexture* GetImage() override { return m_pImage; } + void StaticBackground(bool bStatic) override { m_bStaticBackground = bStatic; } + bool GetLineNo(int indwLineNo, char* outszBuffer, int indwBufferSize) const override; + int GetLineCount() const override; + ICVar* GetCVar(const char* name) override; + char* GetVariable(const char* szVarName, const char* szFileName, const char* def_val) override; + float GetVariable(const char* szVarName, const char* szFileName, float def_val) override; + void PrintLine(const char* s) override; + void PrintLinePlus(const char* s) override; + bool GetStatus() override; + void Clear() override; + void Update() override; + void Draw() override; + bool AddCommand(const char* sCommand, ConsoleCommandFunc func, int nFlags = 0, const char* sHelp = nullptr) override; + bool AddCommand(const char* sName, const char* sScriptFunc, int nFlags = 0, const char* sHelp = nullptr) override; + void RemoveCommand(const char* sName) override; + void ExecuteString(const char* command, bool bSilentMode, bool bDeferExecution = false) override; + void ExecuteConsoleCommand(const char* command) override; + void ResetCVarsToDefaults() override; + void Exit(const char* command, ...) override PRINTF_PARAMS(2, 3); + bool IsOpened() override; + int GetNumVars() override; + int GetNumVisibleVars() override; + size_t GetSortedVars(AZStd::vector& pszArray, const char* szPrefix = nullptr) override; virtual void FindVar(const char* substr); - virtual const char* AutoComplete(const char* substr); - virtual const char* AutoCompletePrev(const char* substr); - virtual const char* ProcessCompletion(const char* szInputBuffer); - virtual void RegisterAutoComplete(const char* sVarOrCommand, IConsoleArgumentAutoComplete* pArgAutoComplete); - virtual void UnRegisterAutoComplete(const char* sVarOrCommand); - virtual void ResetAutoCompletion(); - virtual void GetMemoryUsage (ICrySizer* pSizer) const; - virtual void ResetProgressBar(int nProgressRange); - virtual void TickProgressBar(); - virtual void SetLoadingImage(const char* szFilename); - virtual void AddConsoleVarSink(IConsoleVarSink* pSink); - virtual void RemoveConsoleVarSink(IConsoleVarSink* pSink); - virtual const char* GetHistoryElement(bool bUpOrDown); - virtual void AddCommandToHistory(const char* szCommand); - virtual void SetInputLine(const char* szLine); - virtual void LoadConfigVar(const char* sVariable, const char* sValue); - virtual void EnableActivationKey(bool bEnable); - virtual void SetClientDataProbeString(const char* pName, const char* pValue); + const char* AutoComplete(const char* substr) override; + const char* AutoCompletePrev(const char* substr) override; + const char* ProcessCompletion(const char* szInputBuffer) override; + void RegisterAutoComplete(const char* sVarOrCommand, IConsoleArgumentAutoComplete* pArgAutoComplete) override; + void UnRegisterAutoComplete(const char* sVarOrCommand) override; + void ResetAutoCompletion() override; + void GetMemoryUsage (ICrySizer* pSizer) const override; + void ResetProgressBar(int nProgressRange) override; + void TickProgressBar() override; + void SetLoadingImage(const char* szFilename) override; + void AddConsoleVarSink(IConsoleVarSink* pSink) override; + void RemoveConsoleVarSink(IConsoleVarSink* pSink) override; + const char* GetHistoryElement(bool bUpOrDown) override; + void AddCommandToHistory(const char* szCommand) override; + void SetInputLine(const char* szLine) override; + void LoadConfigVar(const char* sVariable, const char* sValue) override; + void EnableActivationKey(bool bEnable) override; + void SetClientDataProbeString(const char* pName, const char* pValue) override; // InputChannelEventListener / InputTextEventListener bool OnInputChannelEventFiltered(const AzFramework::InputChannel& inputChannel) override; @@ -208,7 +208,7 @@ public: // interface IRemoteConsoleListener ------------------------------------------------------------------ - virtual void OnConsoleCommand(const char* cmd); + void OnConsoleCommand(const char* cmd) override; // interface IConsoleVarSink ---------------------------------------------------------------------- @@ -227,12 +227,12 @@ public: ICVar* RegisterCVarGroup(const char* sName, const char* szFileName); void SetProcessingGroup(bool isGroup) { m_bIsProcessingGroup = isGroup; } - bool GetIsProcessingGroup(void) const { return m_bIsProcessingGroup; } + bool GetIsProcessingGroup() const { return m_bIsProcessingGroup; } protected: // ---------------------------------------------------------------------------------------- void DrawBuffer(int nScrollPos, const char* szEffect); - void RegisterVar(ICVar* pCVar, ConsoleVarFunc pChangeFunc = 0); + void RegisterVar(ICVar* pCVar, ConsoleVarFunc pChangeFunc = nullptr); bool ProcessInput(const AzFramework::InputChannel& inputChannel); void AddLine(const char* inputStr); @@ -283,7 +283,7 @@ private: // ---------------------------------------------------------- typedef std::map ConsoleVariablesMap; // key points into string stored in ICVar or in .exe/.dll typedef ConsoleVariablesMap::iterator ConsoleVariablesMapItor; - typedef std::vector > ConsoleVariablesVector; + using ConsoleVariablesVector = std::vector >; void LogChangeMessage(const char* name, const bool isConst, const bool isCheat, const bool isReadOnly, const bool isDeprecated, const char* oldValue, const char* newValue, const bool isProcessingGroup, const bool allowChange); @@ -320,9 +320,9 @@ private: // ---------------------------------------------------------- , silentMode(_silentMode) {} }; - typedef std::list TDeferredCommandList; + using TDeferredCommandList = std::list; - typedef std::list ConsoleVarSinks; + using ConsoleVarSinks = std::list; // -------------------------------------------------------------------------------- diff --git a/Code/Legacy/CrySystem/XConsoleVariable.h b/Code/Legacy/CrySystem/XConsoleVariable.h index f761287b41..41ebc8e4fc 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.h +++ b/Code/Legacy/CrySystem/XConsoleVariable.h @@ -16,7 +16,7 @@ #include "SFunctor.h" class CXConsole; -typedef AZStd::fixed_string<512> stack_string; +using stack_string = AZStd::fixed_string<512>; inline int64 TextToInt64(const char* s, int64 nCurrent, bool bBitfield) { @@ -99,19 +99,19 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual void ClearFlags(int flags); - virtual int GetFlags() const; - virtual int SetFlags(int flags); - virtual const char* GetName() const; - virtual const char* GetHelp(); - virtual void Release(); - virtual void ForceSet(const char* s); - virtual void SetOnChangeCallback(ConsoleVarFunc pChangeFunc); - virtual uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) override; - virtual ConsoleVarFunc GetOnChangeCallback() const; + void ClearFlags(int flags) override; + int GetFlags() const override; + int SetFlags(int flags) override; + const char* GetName() const override; + const char* GetHelp() override; + void Release() override; + void ForceSet(const char* s) override; + void SetOnChangeCallback(ConsoleVarFunc pChangeFunc) override; + uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) override; + ConsoleVarFunc GetOnChangeCallback() const override; - virtual bool ShouldReset() const { return (m_nFlags & VF_RESETTABLE) != 0; } - virtual void Reset() override + bool ShouldReset() const { return (m_nFlags & VF_RESETTABLE) != 0; } + void Reset() override { if (ShouldReset()) { @@ -121,19 +121,19 @@ public: virtual void ResetImpl() = 0; - virtual void SetLimits(float min, float max) override; - virtual void GetLimits(float& min, float& max) override; - virtual bool HasCustomLimits() override; + void SetLimits(float min, float max) override; + void GetLimits(float& min, float& max) override; + bool HasCustomLimits() override; - virtual int GetRealIVal() const { return GetIVal(); } - virtual bool IsConstCVar() const {return (m_nFlags & VF_CONST_CVAR) != 0; } - virtual void SetDataProbeString(const char* pDataProbeString) + int GetRealIVal() const override { return GetIVal(); } + bool IsConstCVar() const override {return (m_nFlags & VF_CONST_CVAR) != 0; } + void SetDataProbeString(const char* pDataProbeString) override { CRY_ASSERT(m_pDataProbeString == NULL); m_pDataProbeString = new char[ strlen(pDataProbeString) + 1 ]; azstrcpy(m_pDataProbeString, strlen(pDataProbeString) + 1, pDataProbeString); } - virtual const char* GetDataProbeString() const + const char* GetDataProbeString() const override { if (gEnv->IsDedicated() && m_pDataProbeString) { @@ -157,7 +157,7 @@ protected: // ------------------------------------------------------------------ char* m_pDataProbeString; // value client is required to have for data probes int m_nFlags; // e.g. VF_CHEAT, ... - typedef std::vector > ChangeFunctorContainer; + using ChangeFunctorContainer = std::vector >; ChangeFunctorContainer m_changeFunctors; ConsoleVarFunc m_pChangeFunc; // Callback function that is called when this variable changes. CXConsole* m_pConsole; // used for the callback OnBeforeVarChange() @@ -185,15 +185,15 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return atoi(m_sValue.c_str()); } - virtual int64 GetI64Val() const { return _atoi64(m_sValue.c_str()); } - virtual float GetFVal() const { return (float)atof(m_sValue.c_str()); } - virtual const char* GetString() const { return m_sValue.c_str(); } - virtual void ResetImpl() + int GetIVal() const override { return atoi(m_sValue.c_str()); } + int64 GetI64Val() const override { return _atoi64(m_sValue.c_str()); } + float GetFVal() const override { return (float)atof(m_sValue.c_str()); } + const char* GetString() const override { return m_sValue.c_str(); } + void ResetImpl() override { Set(m_sDefault.c_str()); } - virtual void Set(const char* s) + void Set(const char* s) override { if (!s) { @@ -218,7 +218,7 @@ public: } } - virtual void Set(float f) + void Set(float f) override { stack_string s = stack_string::format("%g", f); @@ -231,7 +231,7 @@ public: Set(s.c_str()); } - virtual void Set(int i) + void Set(int i) override { stack_string s = stack_string::format("%d", i); @@ -243,9 +243,9 @@ public: m_nFlags |= VF_MODIFIED; Set(s.c_str()); } - virtual int GetType() { return CVAR_STRING; } + int GetType() override { return CVAR_STRING; } - virtual void GetMemoryUsage(class ICrySizer* pSizer) const { pSizer->AddObject(this, sizeof(*this)); } + void GetMemoryUsage(class ICrySizer* pSizer) const override { pSizer->AddObject(this, sizeof(*this)); } private: // -------------------------------------------------------------------------------------------- AZStd::string m_sValue; AZStd::string m_sDefault; //!< @@ -277,7 +277,7 @@ public: sprintf_s(szReturnString, "%d", GetIVal()); return szReturnString; } - virtual void ResetImpl() { Set(m_iDefault); } + void ResetImpl() override { Set(m_iDefault); } virtual void Set(const char* s) { int nValue = TextToInt(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); @@ -340,7 +340,7 @@ public: sprintf_s(szReturnString, "%lld", GetI64Val()); return szReturnString; } - virtual void ResetImpl() { Set(m_iDefault); } + void ResetImpl() override { Set(m_iDefault); } virtual void Set(const char* s) { int64 nValue = TextToInt64(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); @@ -408,7 +408,7 @@ public: sprintf_s(szReturnString, "%g", m_fValue); // %g -> "2.01", %f -> "2.01000" return szReturnString; } - virtual void ResetImpl() { Set(m_fDefault); } + void ResetImpl() override { Set(m_fDefault); } virtual void Set(const char* s) { float fValue = 0; @@ -475,7 +475,7 @@ public: protected: - virtual const char* GetOwnDataProbeString() const + const char* GetOwnDataProbeString() const override { static char szReturnString[8]; @@ -516,7 +516,7 @@ public: sprintf_s(szReturnString, "%d", m_iValue); return szReturnString; } - virtual void ResetImpl() { Set(m_iDefault); } + void ResetImpl() override { Set(m_iDefault); } virtual void Set(const char* s) { int nValue = TextToInt(s, m_iValue, (m_nFlags & VF_BITFIELD) != 0); @@ -609,7 +609,7 @@ public: sprintf_s(szReturnString, "%g", m_fValue); return szReturnString; } - virtual void ResetImpl() { Set(m_fDefault); } + void ResetImpl() override { Set(m_fDefault); } virtual void Set(const char* s) { float fValue = 0; @@ -673,7 +673,7 @@ public: protected: - virtual const char* GetOwnDataProbeString() const + const char* GetOwnDataProbeString() const override { static char szReturnString[8]; @@ -714,7 +714,7 @@ public: { return m_sValue.c_str(); } - virtual void ResetImpl() { Set(m_sDefault.c_str()); } + void ResetImpl() override { Set(m_sDefault.c_str()); } virtual void Set(const char* s) { if ((m_sValue == s) && (m_nFlags & VF_ALWAYSONCHANGE) == 0) @@ -776,13 +776,13 @@ public: // interface ICVar ----------------------------------------------------------------------------------- - virtual const char* GetHelp(); + const char* GetHelp() override; - virtual int GetRealIVal() const; + int GetRealIVal() const override; virtual void DebugLog(const int iExpectedValue, const ICVar::EConsoleLogMode mode) const; - virtual void Set(int i); + void Set(int i) override; // ConsoleVarFunc ------------------------------------------------------------------------------------ @@ -790,10 +790,10 @@ public: // interface ILoadConfigurationEntrySink ------------------------------------------------------------- - virtual void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup); - virtual void OnLoadConfigurationEntry_End(); + void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup) override; + void OnLoadConfigurationEntry_End() override; - virtual void GetMemoryUsage(class ICrySizer* pSizer) const + void GetMemoryUsage(class ICrySizer* pSizer) const override { pSizer->AddObject(this, sizeof(*this)); pSizer->AddObject(m_sDefaultValue); @@ -815,17 +815,17 @@ private: // -------------------------------------------------------------------- TCVarGroupStateMap m_CVarGroupStates; AZStd::string m_sDefaultValue; // used by OnLoadConfigurationEntry_End() - void ApplyCVars(const SCVarGroup& rGroup, const SCVarGroup* pExclude = 0); + void ApplyCVars(const SCVarGroup& rGroup, const SCVarGroup* pExclude = nullptr); // Arguments: // sKey - must exist, at least in default // pSpec - can be 0 - AZStd::string GetValueSpec(const AZStd::string& sKey, const int* pSpec = 0) const; + AZStd::string GetValueSpec(const AZStd::string& sKey, const int* pSpec = nullptr) const; // should only be used by TestCVars() // Returns: // true=all console variables match the state (excluding default state), false otherwise - bool TestCVars(const SCVarGroup& rGroup, const ICVar::EConsoleLogMode mode, const SCVarGroup* pExclude = 0) const; + bool TestCVars(const SCVarGroup& rGroup, const ICVar::EConsoleLogMode mode, const SCVarGroup* pExclude = nullptr) const; // Arguments: // pGroup - can be 0 to test if the default state is set diff --git a/Code/Legacy/CrySystem/XML/XmlUtils.cpp b/Code/Legacy/CrySystem/XML/XmlUtils.cpp index 56944eb344..4620b3f7a0 100644 --- a/Code/Legacy/CrySystem/XML/XmlUtils.cpp +++ b/Code/Legacy/CrySystem/XML/XmlUtils.cpp @@ -40,11 +40,11 @@ CXmlUtils::CXmlUtils(ISystem* pSystem) #ifdef CRY_COLLECT_XML_NODE_STATS g_pCXmlNode_Stats = new SXmlNodeStats(); #endif - m_pStatsXmlNodePool = 0; + m_pStatsXmlNodePool = nullptr; #ifndef _RELEASE m_statsThreadOwner = CryGetCurrentThreadId(); #endif - m_pXMLPatcher = NULL; + m_pXMLPatcher = nullptr; } ////////////////////////////////////////////////////////////////////////// @@ -129,10 +129,10 @@ class CXmlSerializer public: CXmlSerializer() : m_nRefCount(0) - , m_pReaderImpl(NULL) - , m_pReaderSer(NULL) - , m_pWriterSer(NULL) - , m_pWriterImpl(NULL) + , m_pReaderImpl(nullptr) + , m_pReaderSer(nullptr) + , m_pWriterSer(nullptr) + , m_pWriterImpl(nullptr) { } ~CXmlSerializer() @@ -148,8 +148,8 @@ public: } ////////////////////////////////////////////////////////////////////////// - virtual void AddRef() { ++m_nRefCount; } - virtual void Release() + void AddRef() override { ++m_nRefCount; } + void Release() override { if (--m_nRefCount <= 0) { @@ -157,14 +157,14 @@ public: } } - virtual ISerialize* GetWriter(XmlNodeRef& node) + ISerialize* GetWriter(XmlNodeRef& node) override { ClearAll(); m_pWriterImpl = new CSerializeXMLWriterImpl(node); m_pWriterSer = new CSimpleSerializeWithDefaults(*m_pWriterImpl); return m_pWriterSer; } - virtual ISerialize* GetReader(XmlNodeRef& node) + ISerialize* GetReader(XmlNodeRef& node) override { ClearAll(); m_pReaderImpl = new CSerializeXMLReaderImpl(node); @@ -172,7 +172,7 @@ public: return m_pReaderSer; } - virtual void GetMemoryUsage(ICrySizer* pSizer) const + void GetMemoryUsage(ICrySizer* pSizer) const override { pSizer->Add(*this); pSizer->AddObject(m_pReaderImpl); @@ -271,7 +271,7 @@ public: return m_fileHandle != AZ::IO::InvalidHandle; } ; - virtual void Write(const void* pData, size_t size) + void Write(const void* pData, size_t size) override { if (m_fileHandle != AZ::IO::InvalidHandle) { @@ -292,7 +292,7 @@ bool CXmlUtils::SaveBinaryXmlFile(const char* filename, XmlNodeRef root) } XMLBinary::CXMLBinaryWriter writer; AZStd::string error; - return writer.WriteNode(&fileSink, root, false, 0, error); + return writer.WriteNode(&fileSink, root, false, nullptr, error); } ////////////////////////////////////////////////////////////////////////// @@ -302,7 +302,7 @@ XmlNodeRef CXmlUtils::LoadBinaryXmlFile(const char* filename, bool bEnablePatchi XMLBinary::XMLBinaryReader::EResult result; XmlNodeRef root = reader.LoadFromFile(filename, result); - if (result == XMLBinary::XMLBinaryReader::eResult_Success && bEnablePatching == true && m_pXMLPatcher != NULL) + if (result == XMLBinary::XMLBinaryReader::eResult_Success && bEnablePatching == true && m_pXMLPatcher != nullptr) { root = m_pXMLPatcher->ApplyXMLDataPatch(root, filename); } @@ -326,12 +326,12 @@ public: CXmlTableReader(); virtual ~CXmlTableReader(); - virtual void Release(); + void Release() override; - virtual bool Begin(XmlNodeRef rootNode); - virtual int GetEstimatedRowCount(); - virtual bool ReadRow(int& rowIndex); - virtual bool ReadCell(int& columnIndex, const char*& pContent, size_t& contentSize); + bool Begin(XmlNodeRef rootNode) override; + int GetEstimatedRowCount() override; + bool ReadRow(int& rowIndex) override; + bool ReadCell(int& columnIndex, const char*& pContent, size_t& contentSize) override; float GetCurrentRowHeight() override; private: @@ -372,7 +372,7 @@ void CXmlTableReader::Release() ////////////////////////////////////////////////////////////////////////// bool CXmlTableReader::Begin(XmlNodeRef rootNode) { - m_tableNode = 0; + m_tableNode = nullptr; if (!rootNode) { @@ -391,11 +391,11 @@ bool CXmlTableReader::Begin(XmlNodeRef rootNode) m_tableNode = rootNode->findChild("Table"); } - m_rowNode = 0; + m_rowNode = nullptr; m_rowNodeIndex = -1; m_row = -1; - return (m_tableNode != 0); + return (m_tableNode != nullptr); } ////////////////////////////////////////////////////////////////////////// @@ -441,7 +441,7 @@ bool CXmlTableReader::ReadRow(int& rowIndex) if (!m_rowNode->isTag("Row")) { - m_rowNode = 0; + m_rowNode = nullptr; continue; } @@ -454,7 +454,7 @@ bool CXmlTableReader::ReadRow(int& rowIndex) if (index < m_row) { m_rowNodeIndex = rowNodeCount; - m_rowNode = 0; + m_rowNode = nullptr; return false; } m_row = index; @@ -502,7 +502,7 @@ bool CXmlTableReader::ReadRow(int& rowIndex) ////////////////////////////////////////////////////////////////////////// bool CXmlTableReader::ReadCell(int& columnIndex, const char*& pContent, size_t& contentSize) { - pContent = 0; + pContent = nullptr; contentSize = 0; if (!m_tableNode) @@ -632,7 +632,7 @@ IXmlTableReader* CXmlUtils::CreateXmlTableReader() void CXmlUtils::InitStatsXmlNodePool(uint32 nPoolSize) { CHECK_STATS_THREAD_OWNERSHIP(); - if (0 == m_pStatsXmlNodePool) + if (nullptr == m_pStatsXmlNodePool) { // create special xml node pools for game statistics @@ -651,7 +651,7 @@ void CXmlUtils::InitStatsXmlNodePool(uint32 nPoolSize) XmlNodeRef CXmlUtils::CreateStatsXmlNode(const char* sNodeName) { CHECK_STATS_THREAD_OWNERSHIP(); - if (0 == m_pStatsXmlNodePool) + if (nullptr == m_pStatsXmlNodePool) { CryLog("[CXmlNodePool]: Xml stats nodes pool isn't initialized. Perform default initialization."); InitStatsXmlNodePool(); @@ -682,7 +682,7 @@ void CXmlUtils::SetXMLPatcher(XmlNodeRef* pPatcher) { SAFE_DELETE(m_pXMLPatcher); - if (pPatcher != NULL) + if (pPatcher != nullptr) { m_pXMLPatcher = new CXMLPatcher(*pPatcher); } From a72b8a025fb84deeecb2443e7a57a203c01187d4 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 7 Sep 2021 18:38:16 -0700 Subject: [PATCH 185/355] others Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AWSNativeSDKInit/AWSLogSystemInterface.h | 14 +++++++++++++- .../Code/Source/AchievementsSystemComponent.h | 2 +- .../RHI/Code/Include/Atom/RHI/FreeListAllocator.h | 2 +- .../Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h | 2 +- .../Include/Atom/RHI/ShaderResourceGroupPool.h | 2 +- 5 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h index 85d780bf3d..4982d3efbd 100644 --- a/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h +++ b/Code/Tools/AWSNativeSDKInit/include/AWSNativeSDKInit/AWSLogSystemInterface.h @@ -57,14 +57,26 @@ namespace AWSNativeSDKInit /** * Does a printf style output to the output stream. Don't use this, it's unsafe. See LogStream */ +#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK) + void Log(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const char* formatStr, ...) override; +#else void Log(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const char* formatStr, ...); +#endif /** * Writes the stream to the output stream. */ - void LogStream(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const Aws::OStringStream &messageStream); +#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK) + void LogStream(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const Aws::OStringStream &messageStream) override; +#else + void LogStream(Aws::Utils::Logging::LogLevel logLevel, const char* tag, const Aws::OStringStream& messageStream); +#endif +#if defined(PLATFORM_SUPPORTS_AWS_NATIVE_SDK) + void Flush() override; +#else void Flush(); +#endif private: bool ShouldLog(Aws::Utils::Logging::LogLevel logLevel); diff --git a/Gems/Achievements/Code/Source/AchievementsSystemComponent.h b/Gems/Achievements/Code/Source/AchievementsSystemComponent.h index 840974a2dc..25b28ae690 100644 --- a/Gems/Achievements/Code/Source/AchievementsSystemComponent.h +++ b/Gems/Achievements/Code/Source/AchievementsSystemComponent.h @@ -42,7 +42,7 @@ namespace Achievements //////////////////////////////////////////////////////////////////////////////////////// // AchievementsRequestBus interface implementation void UnlockAchievement(const UnlockAchievementParams& params) override; - void QueryAchievementDetails(const QueryAchievementParams& params); + void QueryAchievementDetails(const QueryAchievementParams& params) override; public: //////////////////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h index 49d5cc9345..ee1cb7c7f4 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/FreeListAllocator.h @@ -51,7 +51,7 @@ namespace AZ VirtualAddress Allocate(size_t byteCount, size_t byteAlignment) override; void DeAllocate(VirtualAddress allocation) override; void GarbageCollect() override; - void GarbageCollectForce(); + void GarbageCollectForce() override; size_t GetAllocationCount() const override; size_t GetAllocatedByteCount() const override; const Descriptor& GetDescriptor() const override; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h index 1392d1a59d..70a9937b1c 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/PoolAllocator.h @@ -51,7 +51,7 @@ namespace AZ VirtualAddress Allocate(size_t byteCount, size_t byteAlignment) override; void DeAllocate(VirtualAddress allocation) override; void GarbageCollect() override; - void GarbageCollectForce(); + void GarbageCollectForce() override; size_t GetAllocationCount() const override; size_t GetAllocatedByteCount() const override; const Descriptor& GetDescriptor() const override; diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupPool.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupPool.h index 44bf80a980..a8775f8625 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupPool.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/ShaderResourceGroupPool.h @@ -38,7 +38,7 @@ namespace AZ ResultCode InitGroup(ShaderResourceGroup& srg); //! Returns the descriptor passed at initialization time. - const ShaderResourceGroupPoolDescriptor& GetDescriptor() const; + const ShaderResourceGroupPoolDescriptor& GetDescriptor() const override; //! Returns the SRG layout used when initializing the pool. const ShaderResourceGroupLayout* GetLayout() const; From 0b7c4fff8553bf32ac34870951e7dd9ba473848c Mon Sep 17 00:00:00 2001 From: kberg-amzn Date: Tue, 7 Sep 2021 21:08:51 -0700 Subject: [PATCH 186/355] Clear rewound entities if we attempt to sync rewind state outside of a scoped rewind Signed-off-by: kberg-amzn --- .../Code/Source/NetworkEntity/NetworkEntityManager.cpp | 2 -- Gems/Multiplayer/Code/Source/NetworkTime/NetworkTime.cpp | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp index 69d2726c65..f981966ae1 100644 --- a/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkEntity/NetworkEntityManager.cpp @@ -281,8 +281,6 @@ namespace Multiplayer void NetworkEntityManager::RemoveEntities() { - //RewindableObjectState::ClearRewoundEntities(); - AZStd::vector removeList; removeList.swap(m_removeList); for (NetEntityId entityId : removeList) diff --git a/Gems/Multiplayer/Code/Source/NetworkTime/NetworkTime.cpp b/Gems/Multiplayer/Code/Source/NetworkTime/NetworkTime.cpp index db8d6bd2f7..cd9c1737d6 100644 --- a/Gems/Multiplayer/Code/Source/NetworkTime/NetworkTime.cpp +++ b/Gems/Multiplayer/Code/Source/NetworkTime/NetworkTime.cpp @@ -93,6 +93,13 @@ namespace Multiplayer void NetworkTime::SyncEntitiesToRewindState(const AZ::Aabb& rewindVolume) { + if (!IsTimeRewound()) + { + // If we're not inside a rewind scope then reset any rewound state and exit + ClearRewoundEntities(); + return; + } + // Since the vis system doesn't support rewound queries, first query with an expanded volume to catch any fast moving entities const AZ::Aabb expandedVolume = rewindVolume.GetExpanded(AZ::Vector3(sv_RewindVolumeExtrudeDistance)); From 052ff90c9db1f0df57cb5d940ea637ce36a4baac Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Wed, 8 Sep 2021 09:36:04 +0100 Subject: [PATCH 187/355] Preparatory work to allow for more viewport integration tests (#3961) * preparatory work to allow for more viewport integration tests Signed-off-by: hultonha * minor grammatical fix Signed-off-by: hultonha * fix for missed bus call update Signed-off-by: hultonha --- Code/Editor/EditorViewportWidget.cpp | 2 ++ Code/Editor/EditorViewportWidget.h | 28 +++++++++------ Code/Editor/Viewport.cpp | 5 ++- .../AzFramework/Visibility/BoundsBus.h | 1 + .../AzManipulatorTestFramework.h | 3 ++ .../AzManipulatorTestFrameworkTestHelpers.h | 14 ++++---- .../IndirectManipulatorViewportInteraction.h | 7 ++-- .../ViewportInteraction.h | 7 ++++ .../AzManipulatorTestFrameworkUtils.cpp | 6 ++-- ...IndirectManipulatorViewportInteraction.cpp | 8 ++--- .../Source/ViewportInteraction.cpp | 12 +++++++ .../API/ComponentEntitySelectionBus.h | 2 +- .../Viewport/ViewportMessages.cpp | 19 ++++++++++ .../Viewport/ViewportMessages.h | 36 +++++++++---------- .../ViewportSelection/EditorSelectionUtil.cpp | 26 +++++++++----- .../ViewportSelection/EditorSelectionUtil.h | 4 +++ .../EditorVisibleEntityDataCache.cpp | 4 +-- .../Tests/ComponentModeTestFixture.cpp | 16 ++++----- .../ModularViewportCameraController.cpp | 2 ++ 19 files changed, 129 insertions(+), 73 deletions(-) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index b33469affb..736bbe5feb 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -1087,6 +1087,7 @@ void EditorViewportWidget::ConnectViewportInteractionRequestBus() { AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler::BusConnect(GetViewportId()); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); m_viewportUi.ConnectViewportUiBus(GetViewportId()); AzFramework::InputSystemCursorConstraintRequestBus::Handler::BusConnect(); @@ -1097,6 +1098,7 @@ void EditorViewportWidget::DisconnectViewportInteractionRequestBus() AzFramework::InputSystemCursorConstraintRequestBus::Handler::BusDisconnect(); m_viewportUi.DisconnectViewportUiBus(); + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler::BusDisconnect(); } diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index 5d332ae3f0..dff0adb55a 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -91,6 +91,7 @@ class SANDBOX_API EditorViewportWidget final , private AzFramework::InputSystemCursorConstraintRequestBus::Handler , private AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler , private AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler + , private AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler , private AzFramework::AssetCatalogEventBus::Handler , private AZ::RPI::SceneNotificationBus::Handler { @@ -128,10 +129,12 @@ private: CameraComponent, ViewSourceTypesCount, }; + enum class PlayInEditorState { Editor, Starting, Started }; + enum class KeyPressedState { AllUp, @@ -142,7 +145,7 @@ private: //////////////////////////////////////////////////////////////////////// // Method overrides ... - // QWidget + // QWidget overrides ... void focusOutEvent(QFocusEvent* event) override; void keyPressEvent(QKeyEvent* event) override; bool event(QEvent* event) override; @@ -150,7 +153,7 @@ private: void paintEvent(QPaintEvent* event) override; void mousePressEvent(QMouseEvent* event) override; - // QtViewport/IDisplayViewport/CViewport + // QtViewport/IDisplayViewport/CViewport overrides ... EViewportType GetType() const override { return ET_ViewportCamera; } void SetType([[maybe_unused]] EViewportType type) override { assert(type == ET_ViewportCamera); }; AzToolsFramework::ViewportInteraction::MouseInteraction BuildMouseInteraction( @@ -176,16 +179,17 @@ private: void Update() override; void UpdateContent(int flags) override; - // SceneNotificationBus + // SceneNotificationBus overrides ... void OnBeginPrepareRender() override; - // Camera::CameraNotificationBus + // Camera::CameraNotificationBus overrides ... void OnActiveViewChanged(const AZ::EntityId&) override; - // IEditorEventListener + // IEditorEventListener overrides ... void OnEditorNotifyEvent(EEditorNotifyEvent event) override; - // AzToolsFramework::EditorEntityContextNotificationBus (handler moved to cpp to resolve link issues in unity builds) + // AzToolsFramework::EditorEntityContextNotificationBus overrides ... + // note: handler moved to cpp to resolve link issues in unity builds void OnStartPlayInEditor(); void OnStopPlayInEditor(); void OnStartPlayInEditorBegin(); @@ -194,10 +198,10 @@ private: void BeginUndoTransaction() override; void EndUndoTransaction() override; - // AzFramework::InputSystemCursorConstraintRequestBus + // AzFramework::InputSystemCursorConstraintRequestBus overrides ... void* GetSystemCursorConstraintWindow() const override; - // AzToolsFramework::ViewportFreezeRequestBus + // AzToolsFramework::ViewportFreezeRequestBus overrides ... bool IsViewportInputFrozen() override; void FreezeViewportInput(bool freeze) override; @@ -205,13 +209,15 @@ private: AZ::EntityId PickEntity(const AzFramework::ScreenPoint& point) override; AZ::Vector3 PickTerrain(const AzFramework::ScreenPoint& point) override; float TerrainHeight(const AZ::Vector2& position) override; - void FindVisibleEntities(AZStd::vector& visibleEntitiesOut) override; bool ShowingWorldSpace() override; QWidget* GetWidgetForViewportContextMenu() override; void BeginWidgetContext() override; void EndWidgetContext() override; - // Camera::EditorCameraRequestBus + // EditorEntityViewportInteractionRequestBus overrides ... + void FindVisibleEntities(AZStd::vector& visibleEntities) override; + + // Camera::EditorCameraRequestBus overrides ... void SetViewFromEntityPerspective(const AZ::EntityId& entityId) override; void SetViewAndMovementLockFromEntityPerspective(const AZ::EntityId& entityId, bool lockCameraMovement) override; AZ::EntityId GetCurrentViewEntityId() override; @@ -327,7 +333,7 @@ private: // Determines also if the current camera for this viewport is default editor camera ViewSourceType m_viewSourceType = ViewSourceType::None; - // During play game in editor, holds the editor entity ID of the last + // During play game in editor, holds the editor entity ID of the last AZ::EntityId m_viewEntityIdCachedForEditMode; // The editor camera TM before switching to game mode diff --git a/Code/Editor/Viewport.cpp b/Code/Editor/Viewport.cpp index 92e193bddf..9c6088e340 100644 --- a/Code/Editor/Viewport.cpp +++ b/Code/Editor/Viewport.cpp @@ -1092,9 +1092,8 @@ bool QtViewport::HitTest(const QPoint& point, HitContext& hitInfo) const int viewportId = GetViewportId(); AzToolsFramework::EntityIdList visibleEntityIds; - AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Event( - viewportId, - &AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequests::FindVisibleEntities, + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Event( + viewportId, &AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Events::FindVisibleEntities, visibleEntityIds); // Look through all visible entities to find the closest one to the specified mouse point diff --git a/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h b/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h index ebd9484c55..7a60d5fdc5 100644 --- a/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h +++ b/Code/Framework/AzFramework/AzFramework/Visibility/BoundsBus.h @@ -45,6 +45,7 @@ namespace AzFramework protected: ~BoundsRequests() = default; }; + using BoundsRequestBus = AZ::EBus; //! Returns a union of all local Aabbs provided by components implementing the BoundsRequestBus. diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h index 5e907ae680..7f838b0073 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h @@ -45,6 +45,9 @@ namespace AzManipulatorTestFramework virtual void SetAngularStep(float step) = 0; //! Get the viewport id. virtual int GetViewportId() const = 0; + //! Updates the visibility state. + //! Updates which entities are currently visible given the current camera state. + virtual void UpdateVisibility() = 0; }; //! This interface is used to simulate the manipulator manager while the manipulators are under test. diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h index 9b253c718b..f87f83c1b2 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkTestHelpers.h @@ -12,8 +12,8 @@ #include #include #include -#include #include +#include #include namespace UnitTest @@ -21,20 +21,18 @@ namespace UnitTest //! Fixture to provide the indirect call viewport interaction that is dependent on AzToolsFramework::ToolsApplication. //! \tparam ToolsApplicationFixtureT The fixture that provides the AzToolsFramework::ToolsApplication functionality. template - class IndirectCallManipulatorViewportInteractionFixtureMixin - : public ToolsApplicationFixtureT + class IndirectCallManipulatorViewportInteractionFixtureMixin : public ToolsApplicationFixtureT { - using IndirectCallManipulatorViewportInteraction = - AzManipulatorTestFramework::IndirectCallManipulatorViewportInteraction; + using IndirectCallManipulatorViewportInteraction = AzManipulatorTestFramework::IndirectCallManipulatorViewportInteraction; using ImmediateModeActionDispatcher = AzManipulatorTestFramework::ImmediateModeActionDispatcher; - + void SetUpEditorFixtureImpl() override { ToolsApplicationFixtureT::SetUpEditorFixtureImpl(); m_viewportManipulatorInteraction = AZStd::make_unique(); m_actionDispatcher = AZStd::make_unique(*m_viewportManipulatorInteraction); - m_cameraState = AzFramework::CreateIdentityDefaultCamera( - AZ::Vector3::CreateZero(), AzManipulatorTestFramework::DefaultViewportSize); + m_cameraState = + AzFramework::CreateIdentityDefaultCamera(AZ::Vector3::CreateZero(), AzManipulatorTestFramework::DefaultViewportSize); } void TearDownEditorFixtureImpl() override diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h index dabcf567db..a7b1be2c7d 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h @@ -9,8 +9,8 @@ #pragma once #include -#include #include +#include namespace AzManipulatorTestFramework { @@ -18,13 +18,12 @@ namespace AzManipulatorTestFramework class IndirectCallManipulatorManager; //! Implementation of manipulator viewport interaction that manipulates the manager indirectly via bus calls. - class IndirectCallManipulatorViewportInteraction - : public ManipulatorViewportInteraction + class IndirectCallManipulatorViewportInteraction : public ManipulatorViewportInteraction { public: IndirectCallManipulatorViewportInteraction(); ~IndirectCallManipulatorViewportInteraction(); - + // ManipulatorViewportInteractionInterface ... const ViewportInteractionInterface& GetViewportInteraction() const override; const ManipulatorManagerInterface& GetManipulatorManager() const override; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index b6944e0355..8b6ea5c59b 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -8,6 +8,7 @@ #pragma once +#include #include namespace AzManipulatorTestFramework @@ -19,6 +20,7 @@ namespace AzManipulatorTestFramework : public ViewportInteractionInterface , public AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler , public AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler + , private AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler { public: ViewportInteraction(); @@ -34,6 +36,7 @@ namespace AzManipulatorTestFramework void SetGridSize(float size) override; void SetAngularStep(float step) override; int GetViewportId() const override; + void UpdateVisibility() override; // ViewportInteractionRequestBus overrides ... AzFramework::CameraState GetCameraState() override; @@ -52,7 +55,11 @@ namespace AzManipulatorTestFramework float ManipulatorLineBoundWidth() const override; float ManipulatorCircleBoundWidth() const override; + // EditorEntityViewportInteractionRequestBus overrides ... + void FindVisibleEntities(AZStd::vector& visibleEntities) override; + private: + AzFramework::EntityVisibilityQuery m_entityVisibilityQuery; AZStd::unique_ptr m_nullDebugDisplayRequests; const int m_viewportId = 1234; // Arbitrary viewport id for manipulator tests AzFramework::CameraState m_cameraState; diff --git a/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp b/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp index 1b68a3d0cd..4f1e108a14 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/AzManipulatorTestFrameworkUtils.cpp @@ -91,12 +91,12 @@ namespace AzManipulatorTestFramework AzToolsFramework::ViewportInteraction::MousePick BuildMousePick( const AzFramework::ScreenPoint& screenPoint, const AzFramework::CameraState& cameraState) { - const auto screenToWorld = AzFramework::ScreenToWorld(screenPoint, cameraState); + const auto nearPlaneWorldPosition = AzFramework::ScreenToWorld(screenPoint, cameraState); AzToolsFramework::ViewportInteraction::MousePick mousePick; mousePick.m_screenCoordinates = screenPoint; - mousePick.m_rayOrigin = screenToWorld; - mousePick.m_rayDirection = (screenToWorld - cameraState.m_position).GetNormalized(); + mousePick.m_rayOrigin = cameraState.m_position; + mousePick.m_rayDirection = (nearPlaneWorldPosition - cameraState.m_position).GetNormalized(); return mousePick; } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp index ff5e3981ef..14723800ff 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp @@ -16,8 +16,7 @@ namespace AzManipulatorTestFramework using MouseInteractionEvent = AzToolsFramework::ViewportInteraction::MouseInteractionEvent; //! Implementation of the manipulator interface using bus calls to access to the manipulator manager. - class IndirectCallManipulatorManager - : public ManipulatorManagerInterface + class IndirectCallManipulatorManager : public ManipulatorManagerInterface { public: IndirectCallManipulatorManager(ViewportInteractionInterface& viewportInteraction); @@ -39,11 +38,12 @@ namespace AzManipulatorTestFramework void IndirectCallManipulatorManager::ConsumeMouseInteractionEvent(const MouseInteractionEvent& event) { + m_viewportInteraction.UpdateVisibility(); + DrawManipulators(); AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus::Event( AzToolsFramework::GetEntityContextId(), - &AzToolsFramework::ViewportInteraction::InternalMouseViewportRequests::InternalHandleAllMouseInteractions, - event); + &AzToolsFramework::ViewportInteraction::InternalMouseViewportRequests::InternalHandleAllMouseInteractions, event); DrawManipulators(); } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 0817df3849..4dae4fc00d 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -26,10 +26,12 @@ namespace AzManipulatorTestFramework { AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler::BusConnect(m_viewportId); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusConnect(m_viewportId); + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusConnect(m_viewportId); } ViewportInteraction::~ViewportInteraction() { + AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::ViewportInteractionRequestBus::Handler::BusDisconnect(); } @@ -74,6 +76,16 @@ namespace AzManipulatorTestFramework return 0.1f; } + void ViewportInteraction::FindVisibleEntities(AZStd::vector& visibleEntitiesOut) + { + visibleEntitiesOut.assign(m_entityVisibilityQuery.Begin(), m_entityVisibilityQuery.End()); + } + + void ViewportInteraction::UpdateVisibility() + { + m_entityVisibilityQuery.UpdateVisibility(m_cameraState); + } + AzFramework::ScreenPoint ViewportInteraction::ViewportWorldToScreen(const AZ::Vector3& worldPosition) { return AzFramework::WorldToScreen(worldPosition, m_cameraState); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h index 64cae9ca3d..dd5af35649 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ComponentEntitySelectionBus.h @@ -96,7 +96,7 @@ namespace AzToolsFramework { AZ::EBusReduceResult aabbResult(AZ::Aabb::CreateNull()); EditorComponentSelectionRequestsBus::EventResult( - aabbResult, entityId, &EditorComponentSelectionRequests::GetEditorSelectionBoundsViewport, viewportInfo); + aabbResult, entityId, &EditorComponentSelectionRequestsBus::Events::GetEditorSelectionBoundsViewport, viewportInfo); return aabbResult.value; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp index 955ee61525..e3b45aca2b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.cpp @@ -10,6 +10,25 @@ namespace AzToolsFramework { + AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction( + const ViewportInteraction::MouseInteractionEvent& mouseInteraction) + { + if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left()) + { + if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down) + { + return AzFramework::ClickDetector::ClickEvent::Down; + } + + if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up) + { + return AzFramework::ClickDetector::ClickEvent::Up; + } + } + + return AzFramework::ClickDetector::ClickEvent::Nil; + } + float ManipulatorLineBoundWidth(const AzFramework::ViewportId viewportId /*= AzFramework::InvalidViewportId*/) { float lineBoundWidth = 0.0f; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index 147c71c8e8..942fee1a49 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -250,8 +250,6 @@ namespace AzToolsFramework virtual AZ::Vector3 PickTerrain(const AzFramework::ScreenPoint& point) = 0; //! Return the terrain height given a world position in 2d (xy plane). virtual float TerrainHeight(const AZ::Vector2& position) = 0; - //! Given the current view frustum (viewport) return all visible entities. - virtual void FindVisibleEntities(AZStd::vector& visibleEntities) = 0; //! Is the user holding a modifier key to move the manipulator space from local to world. virtual bool ShowingWorldSpace() = 0; //! Return the widget to use as the parent for the viewport context menu. @@ -269,7 +267,20 @@ namespace AzToolsFramework //! Type to inherit to implement MainEditorViewportInteractionRequests. using MainEditorViewportInteractionRequestBus = AZ::EBus; - //! Viewport requests for managing the viewport's cursor state. + //! Editor entity requests to be made about the viewport. + class EditorEntityViewportInteractionRequests + { + public: + //! Given the current view frustum (viewport) return all visible entities. + virtual void FindVisibleEntities(AZStd::vector& visibleEntities) = 0; + + protected: + ~EditorEntityViewportInteractionRequests() = default; + }; + + using EditorEntityViewportInteractionRequestBus = AZ::EBus; + + //! Viewport requests for managing the viewport cursor state. class ViewportMouseCursorRequests { public: @@ -321,23 +332,8 @@ namespace AzToolsFramework //! Maps a mouse interaction event to a ClickDetector event. //! @note Function only cares about up or down events, all other events are mapped to Nil (ignored). - inline AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction( - const ViewportInteraction::MouseInteractionEvent& mouseInteraction) - { - if (mouseInteraction.m_mouseInteraction.m_mouseButtons.Left()) - { - if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down) - { - return AzFramework::ClickDetector::ClickEvent::Down; - } - - if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Up) - { - return AzFramework::ClickDetector::ClickEvent::Up; - } - } - return AzFramework::ClickDetector::ClickEvent::Nil; - } + AzFramework::ClickDetector::ClickEvent ClickDetectorEventFromViewportInteraction( + const ViewportInteraction::MouseInteractionEvent& mouseInteraction); //! Wrap EBus call to retrieve manipulator line bound width. //! @note It is possible to pass AzFramework::InvalidViewportId (the default) to perform a Broadcast as opposed to a targeted Event. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp index 7cb0e718a8..f4b68b5970 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp @@ -19,7 +19,7 @@ namespace AzToolsFramework { // default ray length for picking in the viewport - static const float s_pickRayLength = 1000.0f; + static const float EditorPickRayLength = 1000.0f; AZ::Vector3 CalculateCenterOffset(const AZ::EntityId entityId, const EditorTransformComponentSelectionRequests::Pivot pivot) { @@ -60,16 +60,27 @@ namespace AzToolsFramework return screenPosition; } - bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb) + bool AabbIntersectRay(const AZ::Vector3& origin, const AZ::Vector3& direction, const AZ::Aabb& aabb, float& distance) { AZ_PROFILE_FUNCTION(AzToolsFramework); - const AZ::Vector3 rayScaledDir = mouseInteraction.m_mousePick.m_rayDirection * s_pickRayLength; + const AZ::Vector3 rayScaledDir = direction * EditorPickRayLength; - AZ::Vector3 startNormal; float t, end; - return AZ::Intersect::IntersectRayAABB( - mouseInteraction.m_mousePick.m_rayOrigin, rayScaledDir, rayScaledDir.GetReciprocal(), aabb, t, end, startNormal) > 0; + AZ::Vector3 startNormal; + if (AZ::Intersect::IntersectRayAABB(origin, rayScaledDir, rayScaledDir.GetReciprocal(), aabb, t, end, startNormal) > 0) + { + distance = t * EditorPickRayLength; + return true; + } + + return false; + } + + bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb) + { + float unused; + return AabbIntersectRay(mouseInteraction.m_mousePick.m_rayOrigin, mouseInteraction.m_mousePick.m_rayDirection, aabb, unused); } bool PickEntity( @@ -117,8 +128,7 @@ namespace AzToolsFramework { float scaling = 1.0f; ViewportInteraction::ViewportInteractionRequestBus::EventResult( - scaling, viewportId, - &ViewportInteraction::ViewportInteractionRequestBus::Events::DeviceScalingFactor); + scaling, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::DeviceScalingFactor); return scaling; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h index aa1b3ae5ce..ec9bde9f9c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h @@ -46,6 +46,10 @@ namespace AzToolsFramework //! in screen space intersected an aabb in world space. bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb); + //! Wrapper to perform an intersection between a ray and an aabb. + //! Note: direction should be normalized (it is scaled internally by the editor pick distance). + bool AabbIntersectRay(const AZ::Vector3& origin, const AZ::Vector3& direction, const AZ::Aabb& aabb, float& distance); + //! Return if a mouse interaction (pick ray) did intersect the tested EntityId. bool PickEntity( AZ::EntityId entityId, const ViewportInteraction::MouseInteraction& mouseInteraction, float& closestDistance, int viewportId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp index c65f494b72..5da827244f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp @@ -161,8 +161,8 @@ namespace AzToolsFramework // request list of visible entities from authoritative system EntityIdList nextVisibleEntityIds; - ViewportInteraction::MainEditorViewportInteractionRequestBus::Event( - viewportInfo.m_viewportId, &ViewportInteraction::MainEditorViewportInteractionRequestBus::Events::FindVisibleEntities, + ViewportInteraction::EditorEntityViewportInteractionRequestBus::Event( + viewportInfo.m_viewportId, &ViewportInteraction::EditorEntityViewportInteractionRequestBus::Events::FindVisibleEntities, nextVisibleEntityIds); // only bother resorting if we know the lists have changed diff --git a/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp b/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp index cfdd2d082c..672a0d6705 100644 --- a/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ComponentModeTestFixture.cpp @@ -6,8 +6,8 @@ * */ -#include "ComponentModeTestDoubles.h" #include "ComponentModeTestFixture.h" +#include "ComponentModeTestDoubles.h" #include @@ -15,17 +15,15 @@ namespace UnitTest { void ComponentModeTestFixture::SetUpEditorFixtureImpl() { - using namespace AzToolsFramework; - using namespace AzToolsFramework::ComponentModeFramework; + namespace AztfCmf = AzToolsFramework::ComponentModeFramework; auto* app = GetApplication(); - ASSERT_TRUE(app); - app->RegisterComponentDescriptor(PlaceholderEditorComponent::CreateDescriptor()); - app->RegisterComponentDescriptor(AnotherPlaceholderEditorComponent::CreateDescriptor()); - app->RegisterComponentDescriptor(DependentPlaceholderEditorComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::PlaceholderEditorComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::AnotherPlaceholderEditorComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::DependentPlaceholderEditorComponent::CreateDescriptor()); app->RegisterComponentDescriptor( - TestComponentModeComponent::CreateDescriptor()); - app->RegisterComponentDescriptor(IncompatiblePlaceholderEditorComponent::CreateDescriptor()); + AztfCmf::TestComponentModeComponent::CreateDescriptor()); + app->RegisterComponentDescriptor(AztfCmf::IncompatiblePlaceholderEditorComponent::CreateDescriptor()); } } // namespace UnitTest diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp index 0fc55e2363..4419e0c49f 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/ModularViewportCameraController.cpp @@ -73,6 +73,7 @@ namespace AtomToolsFramework return AZ::Transform::CreateIdentity(); } + void ModularCameraViewportContextImpl::SetCameraTransform(const AZ::Transform& transform) { if (auto viewportContext = RetrieveViewportContext(m_viewportId)) @@ -80,6 +81,7 @@ namespace AtomToolsFramework viewportContext->SetCameraTransform(transform); } } + void ModularCameraViewportContextImpl::ConnectViewMatrixChangedHandler(AZ::RPI::ViewportContext::MatrixChangedEvent::Handler& handler) { if (auto viewportContext = RetrieveViewportContext(m_viewportId)) From 5a6daf43528bc1b6d63bff65e1220d4873990389 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Wed, 8 Sep 2021 02:02:24 -0700 Subject: [PATCH 188/355] Maximize read file size limit and set it to 1MiB for Atom use cases Signed-off-by: srikappa-amzn --- .../AzCore/AzCore/Serialization/Json/JsonUtils.cpp | 9 ++------- .../AzCore/AzCore/Serialization/Json/JsonUtils.h | 3 ++- Code/Framework/AzCore/AzCore/Utils/Utils.h | 7 ++----- .../Asset/Shader/Code/Source/Editor/AzslCompiler.cpp | 4 ++-- .../Shader/Code/Source/Editor/ShaderAssetBuilder.cpp | 3 ++- .../Shader/Code/Source/Editor/ShaderBuilderUtility.cpp | 9 +++++---- .../Code/Source/Editor/ShaderVariantAssetBuilder.cpp | 10 +++++----- .../RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h | 6 +++++- .../Source/RPI.Builders/Material/MaterialBuilder.cpp | 5 +++-- .../RPI.Edit/Material/MaterialSourceDataSerializer.cpp | 3 ++- .../Code/Source/RPI.Edit/Material/MaterialUtils.cpp | 3 ++- .../Editor/AssetCollectionAsyncLoaderTestComponent.cpp | 3 ++- 12 files changed, 34 insertions(+), 31 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp index af35842afc..9498b67e79 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.cpp @@ -240,11 +240,6 @@ namespace AZ { IO::SizeType length = stream.GetLength(); - if (length > AZ::Utils::DefaultMaxFileSize) - { - return AZ::Failure(AZStd::string{ "Data is too large." }); - } - AZStd::vector memoryBuffer; memoryBuffer.resize_no_construct(static_cast::size_type>(static_cast::size_type>(length) + 1)); @@ -259,12 +254,12 @@ namespace AZ return ReadJsonString(AZStd::string_view{memoryBuffer.data(), memoryBuffer.size()}); } - AZ::Outcome ReadJsonFile(AZStd::string_view filePath) + AZ::Outcome ReadJsonFile(AZStd::string_view filePath, size_t maxFileSize) { // Read into memory first and then parse the json, rather than passing a file stream to rapidjson. // This should avoid creating a large number of micro-reads from the file. - auto readResult = AZ::Utils::ReadFile(filePath); + auto readResult = AZ::Utils::ReadFile(filePath, maxFileSize); if(!readResult.IsSuccess()) { return AZ::Failure(readResult.GetError()); diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h index c7777feec0..c81497aa95 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h @@ -71,7 +71,8 @@ namespace AZ AZ::Outcome ReadJsonString(AZStd::string_view jsonText); //! Parse a json file. Returns a failure with error message if the content is not valid JSON. - AZ::Outcome ReadJsonFile(AZStd::string_view filePath); + AZ::Outcome ReadJsonFile( + AZStd::string_view filePath, size_t maxFileSize = AZStd::numeric_limits::max()); //! Parse a json stream. Returns a failure with error message if the content is not valid JSON. AZ::Outcome ReadJsonStream(IO::GenericStream& stream); diff --git a/Code/Framework/AzCore/AzCore/Utils/Utils.h b/Code/Framework/AzCore/AzCore/Utils/Utils.h index e72a9b3f9c..1d3cbd777b 100644 --- a/Code/Framework/AzCore/AzCore/Utils/Utils.h +++ b/Code/Framework/AzCore/AzCore/Utils/Utils.h @@ -22,10 +22,6 @@ namespace AZ { namespace Utils { - //! Protects from allocating too much memory. The choice of a 1MB threshold is arbitrary. - //! If you need to work with larger files, please use AZ::IO directly instead of these utility functions. - inline constexpr size_t DefaultMaxFileSize = 1024 * 1024; - //! Terminates the application without going through the shutdown procedure. //! This is used when due to abnormal circumstances the application can no //! longer continue. On most platforms and in most configurations this will @@ -115,6 +111,7 @@ namespace AZ //! Read a file into a string. Returns a failure with error message if the content could not be loaded or if //! the file size is larger than the max file size provided. template - AZ::Outcome ReadFile(AZStd::string_view filePath, size_t maxFileSize = DefaultMaxFileSize); + AZ::Outcome ReadFile( + AZStd::string_view filePath, size_t maxFileSize); } } diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp index 154bfdd607..8f761b621e 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp @@ -1149,7 +1149,7 @@ namespace AZ return BuildResult::CompilationFailed; } - auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile); + auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile, AZ::RPI::JsonUtils::AtomMaxFileSize); if (readJsonResult.IsSuccess()) { @@ -1170,7 +1170,7 @@ namespace AZ AZStd::string outputFile = m_inputFilePath; AzFramework::StringFunc::Path::ReplaceExtension(outputFile, outputExtension); - auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile); + auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile, AZ::RPI::JsonUtils::AtomMaxFileSize); if (readJsonResult.IsSuccess()) { diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp index 9ee4ff2161..6b673759cf 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -555,7 +556,7 @@ namespace AZ shaderAssetCreator.SetRenderStates(renderStates); } - Outcome hlslSourceCodeOutcome = Utils::ReadFile(hlslFullPath); + Outcome hlslSourceCodeOutcome = Utils::ReadFile(hlslFullPath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!hlslSourceCodeOutcome.IsSuccess()) { AZ_Error( diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp index 88abf92e54..928655111a 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -51,7 +52,7 @@ namespace AZ { RPI::ShaderSourceData shaderSourceData; - auto document = JsonSerializationUtils::ReadJsonFile(fullPathToJsonFile); + auto document = JsonSerializationUtils::ReadJsonFile(fullPathToJsonFile, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!document.IsSuccess()) { @@ -127,7 +128,7 @@ namespace AZ AZStd::unordered_map> outcomes; for (int i : indicesOfInterest) { - outcomes[i] = JsonSerializationUtils::ReadJsonFile(pathOfJsonFiles[i]); + outcomes[i] = JsonSerializationUtils::ReadJsonFile(pathOfJsonFiles[i], AZ::RPI::JsonUtils::AtomMaxFileSize); if (!outcomes[i].IsSuccess()) { AZ_Error(builderName, false, "%s", outcomes[i].GetError().c_str()); @@ -622,7 +623,7 @@ namespace AZ StructData inputStruct; inputStruct.m_id = ""; - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToIaJson); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToIaJson, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderBuilderUtilityName, false, "%s", jsonOutcome.GetError().c_str()); @@ -715,7 +716,7 @@ namespace AZ StructData outputStruct; outputStruct.m_id = ""; - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToOmJson); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToOmJson, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderBuilderUtilityName, false, "%s", jsonOutcome.GetError().c_str()); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp index 12e5382b63..5a552a2702 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp @@ -478,7 +478,7 @@ namespace AZ RPI::Ptr shaderOptionGroupLayout = RPI::ShaderOptionGroupLayout::Create(); // The shader options define what options are available, what are the allowed values/range // for each option and what is its default value. - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(optionsGroupJsonPath); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(optionsGroupJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -509,7 +509,7 @@ namespace AZ } auto functionsJsonPath = functionsJsonPathOutcome.TakeValue(); - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(functionsJsonPath); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(functionsJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -541,7 +541,7 @@ namespace AZ } auto srgJsonPath = srgJsonPathOutcome.TakeValue(); - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(srgJsonPath); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(srgJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -598,7 +598,7 @@ namespace AZ } auto bindingsJsonPath = bindingsJsonPathOutcome.TakeValue(); - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(bindingsJsonPath); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(bindingsJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -630,7 +630,7 @@ namespace AZ } hlslSourcePath = hlslSourcePathOutcome.TakeValue(); - Outcome hlslSourceOutcome = Utils::ReadFile(hlslSourcePath); + Outcome hlslSourceOutcome = Utils::ReadFile(hlslSourcePath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!hlslSourceOutcome.IsSuccess()) { AZ_Error( diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h index 1a62e1753c..913a9702b1 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h @@ -20,6 +20,10 @@ namespace AZ { namespace JsonUtils { + //! Protects from allocating too much memory. The choice of a 1MB threshold is arbitrary. + //! If you need to work with larger files, please use AZ::IO directly instead of these utility functions. + inline constexpr size_t AtomMaxFileSize = 1024 * 1024; + // Declarations... //! Loads serialized object data from a json file at the specified path @@ -39,7 +43,7 @@ namespace AZ { objectData = ObjectType(); - auto loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(path); + auto loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(path, AtomMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error("AZ::RPI::JsonUtils", false, "%s", loadOutcome.GetError().c_str()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp index 09f6610150..d2ccad1997 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -151,7 +152,7 @@ namespace AZ AZStd::string fullSourcePath; AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.data(), request.m_sourceFile.data(), fullSourcePath, true); - auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath); + auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error(MaterialBuilderName, false, "%s", loadOutcome.GetError().c_str()); @@ -298,7 +299,7 @@ namespace AZ AZStd::string fullSourcePath; AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.data(), request.m_sourceFile.data(), fullSourcePath, true); - auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath); + auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error(MaterialBuilderName, false, "Failed to load material file: %s", loadOutcome.GetError().c_str()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp index 307d2bb80f..6f68115ccb 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -67,7 +68,7 @@ namespace AZ { AZStd::string materialTypePath = AssetUtils::ResolvePathReference(jsonFileLoadContext->GetFilePath(), materialSourceData->m_materialType); - auto materialTypeJson = JsonSerializationUtils::ReadJsonFile(materialTypePath); + auto materialTypeJson = JsonSerializationUtils::ReadJsonFile(materialTypePath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!materialTypeJson.IsSuccess()) { AZStd::string failureMessage; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp index 0c2e9dca1f..80b292ea9b 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -64,7 +65,7 @@ namespace AZ AZ::Outcome loadOutcome; if (document == nullptr) { - loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(filePath); + loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(filePath, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error("AZ::RPI::JsonUtils", false, "%s", loadOutcome.GetError().c_str()); diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp index 2a72641050..ef902fec3e 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp @@ -16,6 +16,7 @@ #include // Included so we can deduce the asset type from asset paths. +#include #include #include #include @@ -114,7 +115,7 @@ namespace AZ { rapidjson::Document jsonDoc; - auto readJsonResult = JsonSerializationUtils::ReadJsonFile(pathToAssetListJson); + auto readJsonResult = JsonSerializationUtils::ReadJsonFile(pathToAssetListJson, AZ::RPI::JsonUtils::AtomMaxFileSize); if (!readJsonResult.IsSuccess()) { From 5c4ce8cd065f33365068120f0ba98b63a865dfa7 Mon Sep 17 00:00:00 2001 From: jromnoa <80134229+jromnoa@users.noreply.github.com> Date: Wed, 8 Sep 2021 04:11:44 -0700 Subject: [PATCH 189/355] Upload test screenshots to s3 on test failure. (#3815) * add s3 upload on screenshot test failure, should only apply to the test_gpu_profile_vs2019 job on nightly runs * adds support for zipping screenshot files up prior to uploading to the s3 bucket and also adds the ACL extra arg to the upload_to_s3.py execution * remove unused json import * remove regex to use .endswith() instead and rename variables to be more clear (PR feedback) * rename create_zip_archive to create_screenshots_archive Signed-off-by: jromnoa --- .../atom_renderer/test_Atom_GPUTests.py | 40 +++++++++++++++++-- scripts/build/Jenkins/Jenkinsfile | 24 +++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py index 047f46a40f..e62ab5e5dc 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_GPUTests.py @@ -7,8 +7,10 @@ SPDX-License-Identifier: Apache-2.0 OR MIT Tests that require a GPU in order to run. """ +import datetime import logging import os +import zipfile import pytest @@ -40,6 +42,33 @@ def golden_images_directory(): return golden_images_dir +def create_screenshots_archive(screenshot_path): + """ + Creates a new zip file archive at archive_path containing all files listed within archive_path. + :param screenshot_path: location containing the files to archive, the zip archive file will also be saved here. + :return: None, but creates a new zip file archive inside path containing all of the files inside archive_path. + """ + files_to_archive = [] + + # Search for .png and .ppm files to add to the zip archive file. + for (folder_name, sub_folders, file_names) in os.walk(screenshot_path): + for file_name in file_names: + if file_name.endswith(".png") or file_name.endswith(".ppm"): + file_path = os.path.join(folder_name, file_name) + files_to_archive.append(file_path) + + # Setup variables for naming the zip archive file. + timestamp = datetime.datetime.now().timestamp() + formatted_timestamp = datetime.datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d_%H-%M-%S") + screenshots_file = os.path.join(screenshot_path, f'zip_archive_{formatted_timestamp}.zip') + + # Write all of the valid .png and .ppm files to the archive file. + with zipfile.ZipFile(screenshots_file, 'w', compression=zipfile.ZIP_DEFLATED, allowZip64=True) as zip_archive: + for file_path in files_to_archive: + file_name = os.path.basename(file_path) + zip_archive.write(file_path, file_name) + + @pytest.mark.parametrize("project", ["AutomatedTesting"]) @pytest.mark.parametrize("launcher_platform", ["windows_editor"]) @pytest.mark.parametrize("level", ["auto_test"]) @@ -53,8 +82,8 @@ class TestAllComponentsIndepthTests(object): Tests that a basic rendering level setup can be created (lighting, meshes, materials, etc.). """ # Clear existing test screenshots before starting test. - test_screenshots = [os.path.join( - workspace.paths.project(), DEFAULT_SUBFOLDER_PATH, screenshot_name)] + screenshot_directory = os.path.join(workspace.paths.project(), DEFAULT_SUBFOLDER_PATH) + test_screenshots = [os.path.join(screenshot_directory, screenshot_name)] file_system.delete(test_screenshots, True, True) golden_images = [os.path.join(golden_images_directory(), screenshot_name)] @@ -86,6 +115,8 @@ class TestAllComponentsIndepthTests(object): for test_screenshot, golden_screenshot in zip(test_screenshots, golden_images): compare_screenshots(test_screenshot, golden_screenshot) + create_screenshots_archive(screenshot_directory) + def test_LightComponent_ScreenshotMatchesGoldenImage( self, request, editor, workspace, project, launcher_platform, level): """ @@ -105,9 +136,10 @@ class TestAllComponentsIndepthTests(object): "SpotLight_5.ppm", "SpotLight_6.ppm", ] + screenshot_directory = os.path.join(workspace.paths.project(), DEFAULT_SUBFOLDER_PATH) test_screenshots = [] for screenshot in screenshot_names: - screenshot_path = os.path.join(workspace.paths.project(), DEFAULT_SUBFOLDER_PATH, screenshot) + screenshot_path = os.path.join(screenshot_directory, screenshot) test_screenshots.append(screenshot_path) file_system.delete(test_screenshots, True, True) @@ -139,6 +171,8 @@ class TestAllComponentsIndepthTests(object): for test_screenshot, golden_screenshot in zip(test_screenshots, golden_images): compare_screenshots(test_screenshot, golden_screenshot) + create_screenshots_archive(screenshot_directory) + @pytest.mark.parametrize('rhi', ['dx12', 'vulkan']) @pytest.mark.parametrize("project", ["AutomatedTesting"]) diff --git a/scripts/build/Jenkins/Jenkinsfile b/scripts/build/Jenkins/Jenkinsfile index 328e5f8df7..5bc4b919fb 100644 --- a/scripts/build/Jenkins/Jenkinsfile +++ b/scripts/build/Jenkins/Jenkinsfile @@ -415,6 +415,19 @@ def ExportTestResults(Map options, String platform, String type, String workspac } } +def ExportTestScreenshots(Map options, String workspace, String platformName, String jobName, Map params) { + catchError(message: "Error exporting test screenshots (this won't fail the build)", buildResult: 'SUCCESS', stageResult: 'FAILURE') { + def screenshotsFolder = '${workspace}/${ENGINE_REPOSITORY_NAME}/AutomatedTesting/user/PythonTests/Automated/Screenshots' + def s3Uploader = '${workspace}/${ENGINE_REPOSITORY_NAME}/scripts/build/tools/upload_to_s3.py' + def command = '${options.PYTHON_DIR}/python.cmd -u ${s3Uploader} --base_dir ${screenshotsFolder} ' + + '--file_regex "(.*zip$)" --bucket ${env.TEST_SCREENSHOT_BUCKET} ' + + '--search_subdirectories True --key_prefix ${branchName}_${env.BUILD_NUMBER}' + + '--extra-args {"ACL": "bucket-owner-full-control"}' + bat label: "Uploading test screenshots for ${jobName}", + script: command + } +} + def PostBuildCommonSteps(String workspace, boolean mount = true) { echo 'Starting post-build common steps...' @@ -470,6 +483,14 @@ def CreateExportTestResultsStage(Map pipelineConfig, String platformName, String } } +def CreateExportTestScreenshotsStage(Map pipelineConfig, String platformName, String jobName, Map environmentVars, Map params) { + return { + stage("${jobName}_screenshots") { + ExportTestScreenshots(pipelineConfig, platformName, jobName, environmentVars['WORKSPACE'], params) + } + } +} + def CreateTeardownStage(Map environmentVars) { return { stage('Teardown') { @@ -532,6 +553,9 @@ def CreateSingleNode(Map pipelineConfig, def platform, def build_job, Map envVar if (params && params.containsKey('TEST_RESULTS') && params.TEST_RESULTS == 'True') { CreateExportTestResultsStage(pipelineConfig, platform.key, build_job_name, envVars, params).call() } + if (params && params.containsKey('TEST_SCREENSHOTS') && params.TEST_SCREENSHOTS == 'True' && currentResult == 'FAILURE') { + CreateExportTestScreenshotsStage(pipelineConfig, platform.key, build_job_name, envVars, params).call() + } CreateTeardownStage(envVars).call() } } From 6863e9cf9e245f6affc77bf8ca95e37f1fd8f6e6 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Wed, 8 Sep 2021 13:37:06 +0100 Subject: [PATCH 190/355] Camera orbit fix (#3963) * Fix for camera look-at and position being the same when calculating orbit point Signed-off-by: hultonha * add unit test to verify camera orbit behavior Signed-off-by: hultonha --- .../AzFramework/Viewport/CameraInput.cpp | 6 ++ .../AzFramework/Tests/CameraInputTests.cpp | 71 +++++++++++++------ 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp index 89338a355f..18667ac153 100644 --- a/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp +++ b/Code/Framework/AzFramework/AzFramework/Viewport/CameraInput.cpp @@ -588,6 +588,12 @@ namespace AzFramework // pass through the camera's position and look vector for use in the lookAt function if (const auto lookAt = lookAtFn(targetCamera.Translation(), targetCamera.Rotation().GetBasisY())) { + // default to internal look at behavior if the look at point matches the camera translation + if (targetCamera.m_lookAt.IsClose(*lookAt)) + { + return false; + } + auto transform = AZ::Transform::CreateLookAt(targetCamera.m_lookAt, *lookAt); nextCamera.m_lookDist = -lookAt->GetDistance(targetCamera.m_lookAt); UpdateCameraFromTransform(nextCamera, transform); diff --git a/Code/Framework/AzFramework/Tests/CameraInputTests.cpp b/Code/Framework/AzFramework/Tests/CameraInputTests.cpp index 486cca2af0..df7d22f7ca 100644 --- a/Code/Framework/AzFramework/Tests/CameraInputTests.cpp +++ b/Code/Framework/AzFramework/Tests/CameraInputTests.cpp @@ -6,6 +6,7 @@ * */ +#include #include #include #include @@ -47,18 +48,17 @@ namespace UnitTest m_firstPersonTranslateCamera = AZStd::make_shared(AzFramework::LookTranslation, m_translateCameraInputChannelIds); - auto orbitCamera = - AZStd::make_shared(AzFramework::InputChannelId("keyboard_key_modifier_alt_l")); + m_orbitCamera = AZStd::make_shared(m_orbitChannelId); auto orbitRotateCamera = AZStd::make_shared(AzFramework::InputDeviceMouse::Button::Left); auto orbitTranslateCamera = AZStd::make_shared(AzFramework::OrbitTranslation, m_translateCameraInputChannelIds); - orbitCamera->m_orbitCameras.AddCamera(orbitRotateCamera); - orbitCamera->m_orbitCameras.AddCamera(orbitTranslateCamera); + m_orbitCamera->m_orbitCameras.AddCamera(orbitRotateCamera); + m_orbitCamera->m_orbitCameras.AddCamera(orbitTranslateCamera); m_cameraSystem->m_cameras.AddCamera(m_firstPersonRotateCamera); m_cameraSystem->m_cameras.AddCamera(m_firstPersonTranslateCamera); - m_cameraSystem->m_cameras.AddCamera(orbitCamera); + m_cameraSystem->m_cameras.AddCamera(m_orbitCamera); // these tests rely on using motion delta, not cursor positions (default is true) AzFramework::ed_cameraSystemUseCursor = false; @@ -68,6 +68,7 @@ namespace UnitTest { AzFramework::ed_cameraSystemUseCursor = true; + m_orbitCamera.reset(); m_firstPersonRotateCamera.reset(); m_firstPersonTranslateCamera.reset(); @@ -77,12 +78,14 @@ namespace UnitTest AllocatorsTestFixture::TearDown(); } + AzFramework::InputChannelId m_orbitChannelId = AzFramework::InputChannelId("keyboard_key_modifier_alt_l"); AzFramework::TranslateCameraInputChannelIds m_translateCameraInputChannelIds; AZStd::shared_ptr m_firstPersonRotateCamera; AZStd::shared_ptr m_firstPersonTranslateCamera; + AZStd::shared_ptr m_orbitCamera; }; - TEST_F(CameraInputFixture, Begin_and_end_OrbitCameraInput_consumes_correct_events) + TEST_F(CameraInputFixture, BeginAndEndOrbitCameraInputConsumesCorrectEvents) { // begin orbit camera const bool consumed1 = HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ AzFramework::InputDeviceKeyboard::Key::ModifierAltL, @@ -102,7 +105,7 @@ namespace UnitTest EXPECT_THAT(allConsumed, ElementsAre(true, false, true, false)); } - TEST_F(CameraInputFixture, Begin_CameraInput_notifies_ActivationBeganFn_for_TranslateCameraInput) + TEST_F(CameraInputFixture, BeginCameraInputNotifiesActivationBeganFnForTranslateCameraInput) { bool activationBegan = false; m_firstPersonTranslateCamera->SetActivationBeganFn( @@ -111,13 +114,13 @@ namespace UnitTest activationBegan = true; }); - HandleEventAndUpdate( - AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, AzFramework::InputChannel::State::Began }); + HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, + AzFramework::InputChannel::State::Began }); EXPECT_TRUE(activationBegan); } - TEST_F(CameraInputFixture, Begin_CameraInput_notifies_ActivationBeganFn_after_delta_for_RotateCameraInput) + TEST_F(CameraInputFixture, BeginCameraInputNotifiesActivationBeganFnAfterDeltaForRotateCameraInput) { bool activationBegan = false; m_firstPersonRotateCamera->SetActivationBeganFn( @@ -133,7 +136,7 @@ namespace UnitTest EXPECT_TRUE(activationBegan); } - TEST_F(CameraInputFixture, Begin_CameraInput_does_not_notify_ActivationBeganFn_with_no_delta_for_RotateCameraInput) + TEST_F(CameraInputFixture, BeginCameraInputDoesNotNotifyActivationBeganFnWithNoDeltaForRotateCameraInput) { bool activationBegan = false; m_firstPersonRotateCamera->SetActivationBeganFn( @@ -148,7 +151,7 @@ namespace UnitTest EXPECT_FALSE(activationBegan); } - TEST_F(CameraInputFixture, End_CameraInput_notifies_ActivationEndFn_after_delta_for_RotateCameraInput) + TEST_F(CameraInputFixture, EndCameraInputNotifiesActivationEndFnAfterDeltaForRotateCameraInput) { bool activationEnded = false; m_firstPersonRotateCamera->SetActivationEndedFn( @@ -166,7 +169,7 @@ namespace UnitTest EXPECT_TRUE(activationEnded); } - TEST_F(CameraInputFixture, End_CameraInput_does_not_notify_ActivationBeganFn_or_ActivationBeganFn_with_no_delta_for_RotateCameraInput) + TEST_F(CameraInputFixture, EndCameraInputDoesNotNotifyActivationBeganFnOrActivationBeganFnWithNoDeltaForRotateCameraInput) { bool activationBegan = false; m_firstPersonRotateCamera->SetActivationBeganFn( @@ -191,7 +194,7 @@ namespace UnitTest EXPECT_FALSE(activationEnded); } - TEST_F(CameraInputFixture, End_CameraInput_notifies_ActivationBeganFn_or_ActivationEndFn_with_TranslateCamera) + TEST_F(CameraInputFixture, End_CameraInputNotifiesActivationBeganFnOrActivationEndFnWithTranslateCamera) { bool activationBegan = false; m_firstPersonTranslateCamera->SetActivationBeganFn( @@ -207,16 +210,16 @@ namespace UnitTest activationEnded = true; }); - HandleEventAndUpdate( - AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, AzFramework::InputChannel::State::Began }); - HandleEventAndUpdate( - AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, AzFramework::InputChannel::State::Ended }); + HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, + AzFramework::InputChannel::State::Began }); + HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, + AzFramework::InputChannel::State::Ended }); EXPECT_TRUE(activationBegan); EXPECT_TRUE(activationEnded); } - TEST_F(CameraInputFixture, End_activation_called_for_CameraInput_if_active_when_cameras_are_cleared) + TEST_F(CameraInputFixture, EndActivationCalledForCameraInputIfActiveWhenCamerasAreCleared) { bool activationEnded = false; m_firstPersonTranslateCamera->SetActivationEndedFn( @@ -225,11 +228,37 @@ namespace UnitTest activationEnded = true; }); - HandleEventAndUpdate( - AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, AzFramework::InputChannel::State::Began }); + HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ m_translateCameraInputChannelIds.m_forwardChannelId, + AzFramework::InputChannel::State::Began }); m_cameraSystem->m_cameras.Clear(); EXPECT_TRUE(activationEnded); } + + TEST_F(CameraInputFixture, OrbitCameraInputHandlesLookAtPointAndSelfAtSamePositionWhenOrbiting) + { + // create pathological lookAtFn that just returns the same position as the camera + m_orbitCamera->SetLookAtFn( + [](const AZ::Vector3& position, [[maybe_unused]] const AZ::Vector3& direction) + { + return position; + }); + + AzFramework::UpdateCameraFromTransform( + m_targetCamera, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 10.0f, 10.0f))); + + m_camera = m_targetCamera; + + HandleEventAndUpdate(AzFramework::DiscreteInputEvent{ m_orbitChannelId, AzFramework::InputChannel::State::Began }); + + // verify the camera yaw has not changed and the look at point + // does not match that of the camera translation + using ::testing::Eq; + using ::testing::Not; + EXPECT_THAT(m_camera.m_yaw, Eq(AZ::DegToRad(90.0f))); + EXPECT_THAT(m_camera.m_lookAt, Not(IsClose(m_camera.Translation()))); + } } // namespace UnitTest From 860b28c10bbe36d11588121c54630f628dd8a204 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 8 Sep 2021 08:48:32 -0700 Subject: [PATCH 191/355] more fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzCore/AzCore/Memory/Memory.h | 2 +- .../Asset/AssetProcessorMessages.h | 4 +- .../TargetManagement/TargetManagementAPI.h | 2 +- .../UdpTransport/UdpFragmentQueue.h | 2 +- .../Tests/TcpTransport/TcpTransportTests.cpp | 2 +- .../Tests/UdpTransport/UdpTransportTests.cpp | 2 +- .../UI/Logging/LogPanel_Panel.h | 8 +- .../GridMate/Carrier/DefaultHandshake.h | 16 +-- .../GridMate/Carrier/DefaultSimulator.h | 16 +-- .../GridMate/GridMate/Carrier/SocketDriver.h | 42 +++--- .../GridMate/Drillers/SessionDriller.h | 34 ++--- .../GridMate/GridMate/Replica/DataSet.h | 4 +- .../GridMate/Replica/MigrationSequence.h | 4 +- Code/Legacy/CryCommon/IMiniLog.h | 4 +- Code/Legacy/CryCommon/SimpleSerialize.h | 20 +-- .../CrySystem/LevelSystem/LevelSystem.h | 41 +++--- Code/Legacy/CrySystem/XConsoleVariable.h | 78 +++++------ Code/Legacy/CrySystem/XML/XMLBinaryNode.h | 126 +++++++++--------- Code/Tools/GridHub/GridHub/gridhub.hxx | 22 +-- Code/Tools/GridHub/GridHub/main.cpp | 4 +- .../RemoteConsole/Core/RemoteConsoleCore.h | 12 +- .../Framework/ServiceRequestJobConfig.h | 2 +- .../Source/AssetValidationSystemComponent.h | 2 +- Gems/Atom/RHI/Code/CMakeLists.txt | 3 - .../Code/Source/RHI/MemoryTypeAllocator.h | 2 +- Gems/Atom/RHI/Vulkan/Code/Source/RHI/Scope.h | 2 +- .../RPI.Reflect/Material/ShaderCollection.cpp | 2 +- .../Code/Source/Engine/AudioSystem.h | 2 +- .../Include/CrashReporting/GameCrashHandler.h | 10 +- .../CrashReporting/GameCrashUploader.h | 2 +- .../Code/Source/DebugDrawSystemComponent.h | 2 +- .../Code/MCore/Source/AttributeBool.h | 2 +- .../Code/MCore/Source/AttributeInt32.h | 2 +- .../ExpressionEvaluationSystemComponent.cpp | 6 +- Gems/LyShine/Code/Source/Sprite.h | 4 +- .../Code/Source/LZ4Compressor.h | 12 +- .../Code/Source/PresenceSystemComponent.h | 2 +- .../Platform/Common/MSVC/CodeAnalysis.ruleset | 5 +- 38 files changed, 251 insertions(+), 256 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Memory/Memory.h b/Code/Framework/AzCore/AzCore/Memory/Memory.h index af175c7a64..d2c570d48d 100644 --- a/Code/Framework/AzCore/AzCore/Memory/Memory.h +++ b/Code/Framework/AzCore/AzCore/Memory/Memory.h @@ -844,7 +844,7 @@ namespace AZ return AZ::AllocatorInstance::Get().GetUnAllocatedMemory(isPrint); } - virtual IAllocatorAllocate* GetSubAllocator() override + IAllocatorAllocate* GetSubAllocator() override { return AZ::AllocatorInstance::Get().GetSubAllocator(); } diff --git a/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h b/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h index d6d67c2aa2..ac811ae478 100644 --- a/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h +++ b/Code/Framework/AzFramework/AzFramework/Asset/AssetProcessorMessages.h @@ -866,7 +866,7 @@ namespace AzFramework FileIsReadOnlyResponse() = default; FileIsReadOnlyResponse(bool isReadOnly); - unsigned int GetMessageType() const; + unsigned int GetMessageType() const override; bool m_isReadOnly; }; @@ -945,7 +945,7 @@ namespace AzFramework FileModTimeRequest() = default; FileModTimeRequest(const AZ::OSString& filePath); - unsigned int GetMessageType() const; + unsigned int GetMessageType() const override; AZ::OSString m_filePath; }; diff --git a/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementAPI.h b/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementAPI.h index 6582e145cb..bbfb4c88c1 100644 --- a/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementAPI.h +++ b/Code/Framework/AzFramework/AzFramework/TargetManagement/TargetManagementAPI.h @@ -195,7 +195,7 @@ namespace AzFramework TmMsgCallback(const MsgCB& cb = NULL) : m_cb(cb) {} - virtual void OnReceivedMsg(TmMsgPtr msg) + void OnReceivedMsg(TmMsgPtr msg) override { if (m_cb) { diff --git a/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h b/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h index 0243395d1e..9c929d63e8 100644 --- a/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h +++ b/Code/Framework/AzNetworking/AzNetworking/UdpTransport/UdpFragmentQueue.h @@ -54,7 +54,7 @@ namespace AzNetworking //! Handler callback for timed out items. //! @param item containing registered timeout details //! @return ETimeoutResult for whether to re-register or discard the timeout params - virtual TimeoutResult HandleTimeout(TimeoutQueue::TimeoutItem& item) override; + TimeoutResult HandleTimeout(TimeoutQueue::TimeoutItem& item) override; TimeoutQueue m_timeoutQueue; SequenceGenerator m_sequenceGenerator; diff --git a/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp b/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp index 9dc7ae0ccf..bc9ecab2cb 100644 --- a/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp +++ b/Code/Framework/AzNetworking/Tests/TcpTransport/TcpTransportTests.cpp @@ -33,7 +33,7 @@ namespace UnitTest ; } - PacketDispatchResult OnPacketReceived([[maybe_unused]] IConnection* connection, const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) + PacketDispatchResult OnPacketReceived([[maybe_unused]] IConnection* connection, const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) override { EXPECT_TRUE((packetHeader.GetPacketType() == static_cast(CorePackets::PacketType::InitiateConnectionPacket)) || (packetHeader.GetPacketType() == static_cast(CorePackets::PacketType::HeartbeatPacket))); diff --git a/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp b/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp index 02c7085023..c4de3fc6dd 100644 --- a/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp +++ b/Code/Framework/AzNetworking/Tests/UdpTransport/UdpTransportTests.cpp @@ -36,7 +36,7 @@ namespace UnitTest ; } - PacketDispatchResult OnPacketReceived([[maybe_unused]] IConnection* connection, const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) + PacketDispatchResult OnPacketReceived([[maybe_unused]] IConnection* connection, const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) override { EXPECT_TRUE((packetHeader.GetPacketType() == static_cast(CorePackets::PacketType::InitiateConnectionPacket)) || (packetHeader.GetPacketType() == static_cast(CorePackets::PacketType::HeartbeatPacket))); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.h index 18a03cafe9..fdf7866284 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/LogPanel_Panel.h @@ -300,13 +300,13 @@ namespace AzToolsFramework bool editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index) override; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; - QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const; + QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const override; - void setEditorData(QWidget* editor, const QModelIndex& index) const; - void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const; + void setEditorData(QWidget* editor, const QModelIndex& index) const override; + void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override; QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; - void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const; + void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const override; QWidget* pOwnerWidget; QLabel* m_painterLabel; diff --git a/Code/Framework/GridMate/GridMate/Carrier/DefaultHandshake.h b/Code/Framework/GridMate/GridMate/Carrier/DefaultHandshake.h index 9225cca8d7..4e1d6f59bb 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/DefaultHandshake.h +++ b/Code/Framework/GridMate/GridMate/Carrier/DefaultHandshake.h @@ -25,34 +25,34 @@ namespace GridMate DefaultHandshake(unsigned int timeOut, VersionType version); virtual ~DefaultHandshake(); /// Called from the system to write initial handshake data. - virtual void OnInitiate(ConnectionID id, WriteBuffer& wb); + void OnInitiate(ConnectionID id, WriteBuffer& wb) override; /** * Called when a system receives a handshake initiation from another system. * You can write a reply in the WriteBuffer. * return true if you accept this connection and false if you reject it. */ - virtual HandshakeErrorCode OnReceiveRequest(ConnectionID id, ReadBuffer& rb, WriteBuffer& wb); + HandshakeErrorCode OnReceiveRequest(ConnectionID id, ReadBuffer& rb, WriteBuffer& wb) override; /** * If we already have a valid connection and we receive another connection request, the system will * call this function to verify the state of the connection. */ - virtual bool OnConfirmRequest(ConnectionID id, ReadBuffer& rb); + bool OnConfirmRequest(ConnectionID id, ReadBuffer& rb) override; /** * Called when we receive Ack from the other system on our initial data \ref OnInitiate. * return true to accept the ack or false to reject the handshake. */ - virtual bool OnReceiveAck(ConnectionID id, ReadBuffer& rb); + bool OnReceiveAck(ConnectionID id, ReadBuffer& rb) override; /** * Called when we receive Ack from the other system while we were connected. This callback is called * so we can just confirm that our connection is valid! */ - virtual bool OnConfirmAck(ConnectionID id, ReadBuffer& rb); + bool OnConfirmAck(ConnectionID id, ReadBuffer& rb) override; /// Return true if you want to reject early reject a connection. - virtual bool OnNewConnection(const AZStd::string& address); + bool OnNewConnection(const AZStd::string& address) override; /// Called when we close a connection. - virtual void OnDisconnect(ConnectionID id); + void OnDisconnect(ConnectionID id) override; /// Return timeout in milliseconds of the handshake procedure. - virtual unsigned int GetHandshakeTimeOutMS() const { return m_handshakeTimeOutMS; } + unsigned int GetHandshakeTimeOutMS() const override { return m_handshakeTimeOutMS; } private: unsigned int m_handshakeTimeOutMS; VersionType m_version; diff --git a/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h b/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h index 07681a5837..e975223442 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h +++ b/Code/Framework/GridMate/GridMate/Carrier/DefaultSimulator.h @@ -23,21 +23,21 @@ namespace GridMate friend class CarrierThread; /// Called from Carrier, so simulator can use the low level driver directly. - virtual void BindDriver(Driver* driver); + void BindDriver(Driver* driver) override; /// Called from Carrier when driver can no longer be used(ie. will be destroyed) - virtual void UnbindDriver(); + void UnbindDriver() override; /// Called when Carrier has established a new connection. - virtual void OnConnect(const AZStd::intrusive_ptr& address); + void OnConnect(const AZStd::intrusive_ptr& address) override; /// Called when Carrier has lost a connection. - virtual void OnDisconnect(const AZStd::intrusive_ptr& address); + void OnDisconnect(const AZStd::intrusive_ptr& address) override; /// Called when Carrier has send a package. - virtual bool OnSend(const AZStd::intrusive_ptr& to, const void* data, unsigned int dataSize); + bool OnSend(const AZStd::intrusive_ptr& to, const void* data, unsigned int dataSize) override; /// Called when Carrier receives package receive. - virtual bool OnReceive(const AZStd::intrusive_ptr& from, const void* data, unsigned int dataSize); + bool OnReceive(const AZStd::intrusive_ptr& from, const void* data, unsigned int dataSize) override; /// Called from Carrier when no more data has arrived and you can supply you data (with latency, out of order, etc. - virtual unsigned int ReceiveDataFrom(AZStd::intrusive_ptr& from, char* data, unsigned int maxDataSize); + unsigned int ReceiveDataFrom(AZStd::intrusive_ptr& from, char* data, unsigned int maxDataSize) override; - virtual void Update(); + void Update() override; public: GM_CLASS_ALLOCATOR(DefaultSimulator); diff --git a/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.h b/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.h index 835414b374..eb4130a477 100644 --- a/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.h +++ b/Code/Framework/GridMate/GridMate/Carrier/SocketDriver.h @@ -88,11 +88,11 @@ namespace GridMate bool operator==(const SocketDriverAddress& rhs) const; bool operator!=(const SocketDriverAddress& rhs) const; - virtual AZStd::string ToString() const; - virtual AZStd::string ToAddress() const; - virtual AZStd::string GetIP() const; - virtual unsigned int GetPort() const; - virtual const void* GetTargetAddress(unsigned int& addressSize) const; + AZStd::string ToString() const override; + AZStd::string ToAddress() const override; + AZStd::string GetIP() const override; + unsigned int GetPort() const override; + const void* GetTargetAddress(unsigned int& addressSize) const override; union { @@ -117,11 +117,11 @@ namespace GridMate * Platform specific functionality. */ /// Return maximum number of active connections at the same time. - virtual unsigned int GetMaxNumConnections() const { return 32; } + unsigned int GetMaxNumConnections() const override { return 32; } /// Return maximum data size we can send/receive at once in bytes, supported by the platform. - virtual unsigned int GetMaxSendSize() const; + unsigned int GetMaxSendSize() const override; /// Return packet overhead size in bytes. - virtual unsigned int GetPacketOverheadSize() const; + unsigned int GetPacketOverheadSize() const override; /** * User should implement create and bind a UDP socket. This socket will be used for all communications. @@ -132,39 +132,39 @@ namespace GridMate * \param receiveBufferSize socket receive buffer size in bytes, use 0 for default values. * \param sendBufferSize socket send buffer size, use 0 for default values. */ - virtual ResultCode Initialize(int familyType = BSD_AF_INET, const char* address = nullptr, unsigned int port = 0, bool isBroadcast = false, unsigned int receiveBufferSize = 0, unsigned int sendBufferSize = 0); + ResultCode Initialize(int familyType = BSD_AF_INET, const char* address = nullptr, unsigned int port = 0, bool isBroadcast = false, unsigned int receiveBufferSize = 0, unsigned int sendBufferSize = 0) override; /// Returns communication port (must be called after Initialize, otherwise it will return 0) - virtual unsigned int GetPort() const; + unsigned int GetPort() const override; /// Send data to a user defined address - virtual ResultCode Send(const AZStd::intrusive_ptr& to, const char* data, unsigned int dataSize); + ResultCode Send(const AZStd::intrusive_ptr& to, const char* data, unsigned int dataSize) override; /** * Receives a datagram and stores the source address. maxDataSize must be >= than GetMaxSendSize(). Returns the num of of received bytes. * \note If a datagram from a new connection is received, NewConnectionCB will be called. If it rejects the connection the returned from pointer * will be NULL while the actual data will be returned. */ - virtual unsigned int Receive(char* data, unsigned int maxDataSize, AZStd::intrusive_ptr& from, ResultCode* resultCode = 0); + unsigned int Receive(char* data, unsigned int maxDataSize, AZStd::intrusive_ptr& from, ResultCode* resultCode = 0) override; /** * Wait for data to be to the ready for receive. Time out is the maximum time to wait * before this function returns. If left to default value it will be in blocking mode (wait until data is ready to be received). * \returns true if there is data to be received (always true if timeOut == 0), otherwise false. */ - virtual bool WaitForData(AZStd::chrono::microseconds timeOut = AZStd::chrono::microseconds(0)); + bool WaitForData(AZStd::chrono::microseconds timeOut = AZStd::chrono::microseconds(0)) override; /** * When you enter wait for data mode, for many reasons you might want to stop wait for data. * If you implement this function you need to make sure it's a thread safe function. */ - virtual void StopWaitForData(); + void StopWaitForData() override; /// Return true if WaitForData was interrupted before the timeOut expired, otherwise false. - virtual bool WasStopeedWaitingForData() { return m_isStoppedWaitForData; } + bool WasStopeedWaitingForData() override { return m_isStoppedWaitForData; } /// @{ Address conversion functionality. They MUST implemented thread safe. Generally this is not a problem since they just part local data. /// Create address from ip and port. If ip == NULL we will assign a broadcast address. - virtual AZStd::string IPPortToAddress(const char* ip, unsigned int port) const { return IPPortToAddressString(ip, port); } - virtual bool AddressToIPPort(const AZStd::string& address, AZStd::string& ip, unsigned int& port) const { return AddressStringToIPPort(address, ip, port); } + AZStd::string IPPortToAddress(const char* ip, unsigned int port) const override { return IPPortToAddressString(ip, port); } + bool AddressToIPPort(const AZStd::string& address, AZStd::string& ip, unsigned int& port) const override { return AddressStringToIPPort(address, ip, port); } /// Create address for the socket driver from IP and port static AZStd::string IPPortToAddressString(const char* ip, unsigned int port); /// Decompose an address to IP and port @@ -174,7 +174,7 @@ namespace GridMate static BSDSocketFamilyType AddressFamilyType(const char* ip) { return AddressFamilyType(AZStd::string(ip)); } /// @} - virtual AZStd::intrusive_ptr CreateDriverAddress(const AZStd::string& address) = 0; + AZStd::intrusive_ptr CreateDriverAddress(const AZStd::string& address) override = 0; /// Additional CreateDriverAddress function should be implemented. virtual AZStd::intrusive_ptr CreateDriverAddress(const sockaddr* sockAddr) = 0; @@ -352,10 +352,10 @@ namespace GridMate * \note Driver address allocates internal resources, use it only when you intend to communicate. Otherwise operate with * the string address. */ - virtual AZStd::intrusive_ptr CreateDriverAddress(const AZStd::string& address); - virtual AZStd::intrusive_ptr CreateDriverAddress(const sockaddr* addr); + AZStd::intrusive_ptr CreateDriverAddress(const AZStd::string& address) override; + AZStd::intrusive_ptr CreateDriverAddress(const sockaddr* addr) override; /// Called only from the DriverAddress when the use count becomes 0 - virtual void DestroyDriverAddress(DriverAddress* address); + void DestroyDriverAddress(DriverAddress* address) override; typedef AZStd::unordered_set AddressSetType; AddressSetType m_addressMap; diff --git a/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h b/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h index 59f178976f..7af318287a 100644 --- a/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h +++ b/Code/Framework/GridMate/GridMate/Drillers/SessionDriller.h @@ -33,42 +33,42 @@ namespace GridMate ////////////////////////////////////////////////////////////////////////// // Driller - virtual const char* GroupName() const { return "GridMate"; } - virtual const char* GetName() const { return "SessionDriller"; } - virtual const char* GetDescription() const { return "Drills GridSession, Search, etc."; } - virtual void Start(const Param* params = NULL, int numParams = 0); - virtual void Stop(); + const char* GroupName() const override { return "GridMate"; } + const char* GetName() const override { return "SessionDriller"; } + const char* GetDescription() const override { return "Drills GridSession, Search, etc."; } + void Start(const Param* params = NULL, int numParams = 0) override; + void Stop() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Session Event Bus /// Callback that is called when the Session service is ready to process sessions. - virtual void OnSessionServiceReady(); + void OnSessionServiceReady() override; //virtual OnCommucationChanged() = 0 Callback that notifies the title when a member's communication settings change. /// Callback that notifies the title when a game search query have completed. - virtual void OnGridSearchComplete(GridSearch* gridSearch); + void OnGridSearchComplete(GridSearch* gridSearch) override; /// Callback that notifies the title when a new member joins the game session. - virtual void OnMemberJoined(GridSession* session, GridMember* member); + void OnMemberJoined(GridSession* session, GridMember* member) override; /// Callback that notifies the title that a member is leaving the game session. member pointer is NOT valid after the callback returns. - virtual void OnMemberLeaving(GridSession* session, GridMember* member); + void OnMemberLeaving(GridSession* session, GridMember* member) override; // \todo a better way will be (after we solve migration) is to supply a reason to OnMemberLeaving... like the member was kicked. // this will require that we actually remove the replica at the same moment. /// Callback that host decided to kick a member. You will receive a OnMemberLeaving when the actual member leaves the session. - virtual void OnMemberKicked(GridSession* session, GridMember* member); + void OnMemberKicked(GridSession* session, GridMember* member) override; /// After this callback it is safe to access session features. If host session is fully operational if client wait for OnSessionJoined. - virtual void OnSessionCreated(GridSession* session); + void OnSessionCreated(GridSession* session) override; /// Called on client machines to indicate that we join successfully. - virtual void OnSessionJoined(GridSession* session); + void OnSessionJoined(GridSession* session) override; /// Callback that notifies the title when a session will be left. session pointer is NOT valid after the callback returns. - virtual void OnSessionDelete(GridSession* session); + void OnSessionDelete(GridSession* session) override; /// Called when a session error occurs. - virtual void OnSessionError(GridSession* session, const AZStd::string& errorMsg); + void OnSessionError(GridSession* session, const AZStd::string& errorMsg) override; /// Called when the actual game(match) starts - virtual void OnSessionStart(GridSession* session); + void OnSessionStart(GridSession* session) override; /// Called when the actual game(match) ends - virtual void OnSessionEnd(GridSession* session); + void OnSessionEnd(GridSession* session) override; /// Called when we have our last chance to write statistics data for member in the session. - virtual void OnWriteStatistics(GridSession* session, GridMember* member, StatisticsData& data); + void OnWriteStatistics(GridSession* session, GridMember* member, StatisticsData& data) override; ////////////////////////////////////////////////////////////////////////// }; } diff --git a/Code/Framework/GridMate/GridMate/Replica/DataSet.h b/Code/Framework/GridMate/GridMate/Replica/DataSet.h index b0c5e669c1..1c1b6209c5 100644 --- a/Code/Framework/GridMate/GridMate/Replica/DataSet.h +++ b/Code/Framework/GridMate/GridMate/Replica/DataSet.h @@ -525,12 +525,12 @@ namespace GridMate void Set(const DataType& val) { m_value = val; } const DataType& Get() const { return m_value; } - virtual void Marshal(WriteBuffer& wb) + void Marshal(WriteBuffer& wb) override { wb.Write(m_value, m_marshaler); } - virtual void Unmarshal(ReadBuffer& rb) + void Unmarshal(ReadBuffer& rb) override { rb.Read(m_value, m_marshaler); } diff --git a/Code/Framework/GridMate/GridMate/Replica/MigrationSequence.h b/Code/Framework/GridMate/GridMate/Replica/MigrationSequence.h index ea4ed683b7..35febb873a 100644 --- a/Code/Framework/GridMate/GridMate/Replica/MigrationSequence.h +++ b/Code/Framework/GridMate/GridMate/Replica/MigrationSequence.h @@ -64,8 +64,8 @@ namespace GridMate /////////////////////////////////////////////////////////////////// // ReplicaMgrCallbackBus - virtual void OnDeactivateReplica(ReplicaId replicaId, ReplicaManager* pMgr) override; - virtual void OnPeerRemoved(PeerId peerId, ReplicaManager* pMgr) override; + void OnDeactivateReplica(ReplicaId replicaId, ReplicaManager* pMgr) override; + void OnPeerRemoved(PeerId peerId, ReplicaManager* pMgr) override; /////////////////////////////////////////////////////////////////// void OnReceivedAckUpstreamSuspended(PeerId from, AZ::u32 requestTime); diff --git a/Code/Legacy/CryCommon/IMiniLog.h b/Code/Legacy/CryCommon/IMiniLog.h index 51ff5f586e..ad6921cf09 100644 --- a/Code/Legacy/CryCommon/IMiniLog.h +++ b/Code/Legacy/CryCommon/IMiniLog.h @@ -119,8 +119,8 @@ struct CNullMiniLog // The default implementation just won't do anything //##@{ void LogV([[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} - void LogV([[maybe_unused]] ELogType nType, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} - void LogV ([[maybe_unused]] ELogType nType, [[maybe_unused]] int flags, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) {} + void LogV([[maybe_unused]] ELogType nType, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) override {} + void LogV ([[maybe_unused]] ELogType nType, [[maybe_unused]] int flags, [[maybe_unused]] const char* szFormat, [[maybe_unused]] va_list args) override {} //##@} }; diff --git a/Code/Legacy/CryCommon/SimpleSerialize.h b/Code/Legacy/CryCommon/SimpleSerialize.h index 2fd57b7bc3..8b7108ba6a 100644 --- a/Code/Legacy/CryCommon/SimpleSerialize.h +++ b/Code/Legacy/CryCommon/SimpleSerialize.h @@ -54,39 +54,39 @@ public: { } - void BeginGroup(const char* szName) + void BeginGroup(const char* szName) override { m_impl.BeginGroup(szName); } - bool BeginOptionalGroup(const char* szName, bool condition) + bool BeginOptionalGroup(const char* szName, bool condition) override { return m_impl.BeginOptionalGroup(szName, condition); } - void EndGroup() + void EndGroup() override { m_impl.EndGroup(); } - bool IsReading() const + bool IsReading() const override { return m_impl.IsReading(); } - void WriteStringValue(const char* name, SSerializeString& value) + void WriteStringValue(const char* name, SSerializeString& value) override { m_impl.Value(name, value); } - void ReadStringValue(const char* name, SSerializeString& curValue) + void ReadStringValue(const char* name, SSerializeString& curValue) override { m_impl.Value(name, curValue); } -#define SERIALIZATION_TYPE(T) \ - void Value(const char* name, T& x) override \ - { \ - m_impl.Value(name, x); \ +#define SERIALIZATION_TYPE(T) \ + void Value(const char* name, T& x) override \ + { \ + m_impl.Value(name, x); \ } #include "SerializationTypes.h" #undef SERIALIZATION_TYPE diff --git a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h index 836d2c2484..d7230347e9 100644 --- a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h +++ b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.h @@ -25,9 +25,9 @@ public: CLevelInfo() = default; // ILevelInfo - virtual const char* GetName() const { return m_levelName.c_str(); } - virtual const char* GetPath() const { return m_levelPath.c_str(); } - virtual const char* GetAssetName() const { return m_levelAssetName.c_str(); } + const char* GetName() const override { return m_levelName.c_str(); } + const char* GetPath() const override { return m_levelPath.c_str(); } + const char* GetAssetName() const override { return m_levelAssetName.c_str(); } // ~ILevelInfo @@ -62,9 +62,9 @@ public: CLevel() {} virtual ~CLevel() = default; - virtual void Release() { delete this; } + void Release() override { delete this; } - virtual ILevelInfo* GetLevelInfo() { return &m_levelInfo; } + ILevelInfo* GetLevelInfo() override { return &m_levelInfo; } private: CLevelInfo m_levelInfo; @@ -77,38 +77,35 @@ public: CLevelSystem(ISystem* pSystem, const char* levelsFolder); virtual ~CLevelSystem(); - void Release() { delete this; }; + void Release() override { delete this; }; // ILevelSystem - virtual void Rescan(const char* levelsFolder); - virtual int GetLevelCount(); - virtual ILevelInfo* GetLevelInfo(int level); - virtual ILevelInfo* GetLevelInfo(const char* levelName); + void Rescan(const char* levelsFolder) override; + int GetLevelCount() override; + ILevelInfo* GetLevelInfo(int level) override; + ILevelInfo* GetLevelInfo(const char* levelName) override; - virtual void AddListener(ILevelSystemListener* pListener); - virtual void RemoveListener(ILevelSystemListener* pListener); + void AddListener(ILevelSystemListener* pListener) override; + void RemoveListener(ILevelSystemListener* pListener) override; - virtual bool LoadLevel(const char* levelName); - virtual void UnloadLevel(); - virtual bool IsLevelLoaded() { return m_bLevelLoaded; } + bool LoadLevel(const char* levelName) override; + void UnloadLevel() override; + bool IsLevelLoaded() override { return m_bLevelLoaded; } const char* GetCurrentLevelName() const override { if (m_pCurrentLevel && m_pCurrentLevel->GetLevelInfo()) { return m_pCurrentLevel->GetLevelInfo()->GetName(); } - else - { - return ""; - } + return ""; } // If the level load failed then we need to have a different shutdown procedure vs when a level is naturally unloaded - virtual void SetLevelLoadFailed(bool loadFailed) { m_levelLoadFailed = loadFailed; } - virtual bool GetLevelLoadFailed() { return m_levelLoadFailed; } + void SetLevelLoadFailed(bool loadFailed) override { m_levelLoadFailed = loadFailed; } + bool GetLevelLoadFailed() override { return m_levelLoadFailed; } // Unsupported by legacy level system. - virtual AZ::Data::AssetType GetLevelAssetType() const { return {}; } + AZ::Data::AssetType GetLevelAssetType() const override { return {}; } // ~ILevelSystem diff --git a/Code/Legacy/CrySystem/XConsoleVariable.h b/Code/Legacy/CrySystem/XConsoleVariable.h index 13808e7dd6..3ff71f9f39 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.h +++ b/Code/Legacy/CrySystem/XConsoleVariable.h @@ -34,7 +34,7 @@ public: void Release() override; void ForceSet(const char* s) override; void SetOnChangeCallback(ConsoleVarFunc pChangeFunc) override; - virtual uint64 AddOnChangeFunctor(const SFunctor& pChangeFunctor) override; + uint64 AddOnChangeFunctor(const AZStd::function& pChangeFunctor) override; ConsoleVarFunc GetOnChangeCallback() const override; bool ShouldReset() const { return (m_nFlags & VF_RESETTABLE) != 0; } @@ -77,7 +77,7 @@ protected: // ------------------------------------------------------------------ char* m_pDataProbeString; // value client is required to have for data probes int m_nFlags; // e.g. VF_CHEAT, ... - typedef std::vector> > ChangeFunctorContainer; + using ChangeFunctorContainer = std::vector> >; ChangeFunctorContainer m_changeFunctors; ConsoleVarFunc m_pChangeFunc; // Callback function that is called when this variable changes. CXConsole* m_pConsole; // used for the callback OnBeforeVarChange() @@ -169,15 +169,15 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return (int)m_fValue; } - virtual int64 GetI64Val() const { return (int64)m_fValue; } - virtual float GetFVal() const { return m_fValue; } - virtual const char* GetString() const; - virtual void ResetImpl() { Set(m_fDefault); } - virtual void Set(const char* s); - virtual void Set(float f); - virtual void Set(int i); - virtual int GetType() { return CVAR_FLOAT; } + int GetIVal() const override { return (int)m_fValue; } + int64 GetI64Val() const override { return (int64)m_fValue; } + float GetFVal() const override { return m_fValue; } + const char* GetString() const override; + void ResetImpl() override { Set(m_fDefault); } + void Set(const char* s) override; + void Set(float f) override; + void Set(int i) override; + int GetType() override { return CVAR_FLOAT; } protected: @@ -212,15 +212,15 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return m_iValue; } - virtual int64 GetI64Val() const { return m_iValue; } - virtual float GetFVal() const { return (float)m_iValue; } - virtual const char* GetString() const; - virtual void ResetImpl() { Set(m_iDefault); } - virtual void Set(const char* s); - virtual void Set(float f); - virtual void Set(int i); - virtual int GetType() { return CVAR_INT; } + int GetIVal() const override { return m_iValue; } + int64 GetI64Val() const override { return m_iValue; } + float GetFVal() const override { return (float)m_iValue; } + const char* GetString() const override; + void ResetImpl() override { Set(m_iDefault); } + void Set(const char* s) override; + void Set(float f) override; + void Set(int i) override; + int GetType() override { return CVAR_INT; } private: // -------------------------------------------------------------------------------------------- @@ -246,26 +246,26 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return atoi(m_sValue.c_str()); } - virtual int64 GetI64Val() const { return _atoi64(m_sValue.c_str()); } - virtual float GetFVal() const { return (float)atof(m_sValue.c_str()); } - virtual const char* GetString() const + int GetIVal() const override { return atoi(m_sValue.c_str()); } + int64 GetI64Val() const override { return _atoi64(m_sValue.c_str()); } + float GetFVal() const override { return (float)atof(m_sValue.c_str()); } + const char* GetString() const override { return m_sValue.c_str(); } - virtual void ResetImpl() { Set(m_sDefault.c_str()); } - virtual void Set(const char* s); - virtual void Set(float f) + void ResetImpl() override { Set(m_sDefault.c_str()); } + void Set(const char* s) override; + void Set(float f) override { stack_string s = stack_string::format("%g", f); Set(s.c_str()); } - virtual void Set(int i) + void Set(int i) override { stack_string s = stack_string::format("%d", i); Set(s.c_str()); } - virtual int GetType() { return CVAR_STRING; } + int GetType() override { return CVAR_STRING; } private: // -------------------------------------------------------------------------------------------- @@ -290,19 +290,19 @@ public: // interface ICVar -------------------------------------------------------------------------------------- - virtual int GetIVal() const { return (int)m_fValue; } - virtual int64 GetI64Val() const { return (int64)m_fValue; } - virtual float GetFVal() const { return m_fValue; } - virtual const char* GetString() const; - virtual void ResetImpl() { Set(m_fDefault); } - virtual void Set(const char* s); - virtual void Set(float f); - virtual void Set(int i); - virtual int GetType() { return CVAR_FLOAT; } + int GetIVal() const override { return (int)m_fValue; } + int64 GetI64Val() const override { return (int64)m_fValue; } + float GetFVal() const override { return m_fValue; } + const char* GetString() const override; + void ResetImpl() override { Set(m_fDefault); } + void Set(const char* s) override; + void Set(float f) override; + void Set(int i) override; + int GetType() override { return CVAR_FLOAT; } protected: - virtual const char *GetOwnDataProbeString() const + const char *GetOwnDataProbeString() const override { static char szReturnString[8]; diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryNode.h b/Code/Legacy/CrySystem/XML/XMLBinaryNode.h index d6c66e79f3..b4706f1b85 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryNode.h +++ b/Code/Legacy/CrySystem/XML/XMLBinaryNode.h @@ -63,17 +63,17 @@ public: //void* operator new( size_t nSize ); //void operator delete( void *ptr ); - virtual void DeleteThis() { } + void DeleteThis() override { } //! Create new XML node. - XmlNodeRef createNode(const char* tag); + XmlNodeRef createNode(const char* tag) override; // Summary: // Reference counting. - virtual void AddRef() { ++m_pData->nRefCount; }; + void AddRef() override { ++m_pData->nRefCount; }; // Notes: // When ref count reach zero XML node dies. - virtual void Release() + void Release() override { if (--m_pData->nRefCount <= 0) { @@ -82,105 +82,105 @@ public: }; //! Get XML node tag. - const char* getTag() const { return _string(_node()->nTagStringOffset); }; - void setTag([[maybe_unused]] const char* tag) { assert(0); }; + const char* getTag() const override { return _string(_node()->nTagStringOffset); }; + void setTag([[maybe_unused]] const char* tag) override { assert(0); }; //! Return true if given tag is equal to node tag. - bool isTag(const char* tag) const; + bool isTag(const char* tag) const override; //! Get XML Node attributes. - virtual int getNumAttributes() const { return (int)_node()->nAttributeCount; }; + int getNumAttributes() const override { return (int)_node()->nAttributeCount; }; //! Return attribute key and value by attribute index. - virtual bool getAttributeByIndex(int index, const char** key, const char** value); + bool getAttributeByIndex(int index, const char** key, const char** value) override; //! Return attribute key and value by attribute index, string version. virtual bool getAttributeByIndex(int index, XmlString& key, XmlString& value); - virtual void shareChildren([[maybe_unused]] const XmlNodeRef& fromNode) { assert(0); }; - virtual void copyAttributes(XmlNodeRef fromNode) { assert(0); }; + void shareChildren([[maybe_unused]] const XmlNodeRef& fromNode) override { assert(0); }; + void copyAttributes(XmlNodeRef fromNode) override { assert(0); }; //! Get XML Node attribute for specified key. - const char* getAttr(const char* key) const; + const char* getAttr(const char* key) const override; //! Get XML Node attribute for specified key. // Returns true if the attribute exists, false otherwise. - bool getAttr(const char* key, const char** value) const; + bool getAttr(const char* key, const char** value) const override; //! Check if attributes with specified key exist. - bool haveAttr(const char* key) const; + bool haveAttr(const char* key) const override; - XmlNodeRef newChild([[maybe_unused]] const char* tagName) { assert(0); return 0; }; - void replaceChild([[maybe_unused]] int inChild, [[maybe_unused]] const XmlNodeRef& node) { assert(0); }; - void insertChild([[maybe_unused]] int inChild, [[maybe_unused]] const XmlNodeRef& node) { assert(0); }; - void addChild([[maybe_unused]] const XmlNodeRef& node) { assert(0); }; - void removeChild([[maybe_unused]] const XmlNodeRef& node) { assert(0); }; + XmlNodeRef newChild([[maybe_unused]] const char* tagName) override { assert(0); return 0; }; + void replaceChild([[maybe_unused]] int inChild, [[maybe_unused]] const XmlNodeRef& node) override { assert(0); }; + void insertChild([[maybe_unused]] int inChild, [[maybe_unused]] const XmlNodeRef& node) override { assert(0); }; + void addChild([[maybe_unused]] const XmlNodeRef& node) override { assert(0); }; + void removeChild([[maybe_unused]] const XmlNodeRef& node) override { assert(0); }; //! Remove all child nodes. - void removeAllChilds() { assert(0); }; + void removeAllChilds() override { assert(0); }; //! Get number of child XML nodes. - int getChildCount() const { return (int)_node()->nChildCount; }; + int getChildCount() const override { return (int)_node()->nChildCount; }; //! Get XML Node child nodes. - XmlNodeRef getChild(int i) const; + XmlNodeRef getChild(int i) const override; //! Find node with specified tag. - XmlNodeRef findChild(const char* tag) const; + XmlNodeRef findChild(const char* tag) const override; void deleteChild([[maybe_unused]] const char* tag) { assert(0); }; - void deleteChildAt([[maybe_unused]] int nIndex) { assert(0); }; + void deleteChildAt([[maybe_unused]] int nIndex) override { assert(0); }; //! Get parent XML node. - XmlNodeRef getParent() const; + XmlNodeRef getParent() const override; //! Returns content of this node. - const char* getContent() const { return _string(_node()->nContentStringOffset); }; - void setContent([[maybe_unused]] const char* str) { assert(0); }; + const char* getContent() const override { return _string(_node()->nContentStringOffset); }; + void setContent([[maybe_unused]] const char* str) override { assert(0); }; - XmlNodeRef clone() { assert(0); return 0; }; + XmlNodeRef clone() override { assert(0); return 0; }; //! Returns line number for XML tag. - int getLine() const { return 0; }; + int getLine() const override { return 0; }; //! Set line number in xml. - void setLine([[maybe_unused]] int line) { assert(0); }; + void setLine([[maybe_unused]] int line) override { assert(0); }; //! Returns XML of this node and sub nodes. - virtual IXmlStringData* getXMLData([[maybe_unused]] int nReserveMem = 0) const { assert(0); return 0; }; - XmlString getXML([[maybe_unused]] int level = 0) const { assert(0); return ""; }; - bool saveToFile([[maybe_unused]] const char* fileName) { assert(0); return false; }; // saves in one huge chunk - bool saveToFile([[maybe_unused]] const char* fileName, [[maybe_unused]] size_t chunkSizeBytes, [[maybe_unused]] AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle) { assert(0); return false; }; // save in small memory chunks + IXmlStringData* getXMLData([[maybe_unused]] int nReserveMem = 0) const override { assert(0); return 0; }; + XmlString getXML([[maybe_unused]] int level = 0) const override { assert(0); return ""; }; + bool saveToFile([[maybe_unused]] const char* fileName) override { assert(0); return false; }; // saves in one huge chunk + bool saveToFile([[maybe_unused]] const char* fileName, [[maybe_unused]] size_t chunkSizeBytes, [[maybe_unused]] AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle) override { assert(0); return false; }; // save in small memory chunks //! Set new XML Node attribute (or override attribute with same key). using IXmlNode::setAttr; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const char* value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] int value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] unsigned int value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] int64 value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] uint64 value, [[maybe_unused]] bool useHexFormat = true /* ignored */) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] float value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] f64 value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec2& value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Ang3& value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec3& value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec4& value) { assert(0); }; - void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Quat& value) { assert(0); }; - void delAttr([[maybe_unused]] const char* key) { assert(0); }; - void removeAllAttributes() { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const char* value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] int value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] unsigned int value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] int64 value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] uint64 value, [[maybe_unused]] bool useHexFormat = true /* ignored */) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] float value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] f64 value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec2& value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Ang3& value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec3& value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Vec4& value) override { assert(0); }; + void setAttr([[maybe_unused]] const char* key, [[maybe_unused]] const Quat& value) override { assert(0); }; + void delAttr([[maybe_unused]] const char* key) override { assert(0); }; + void removeAllAttributes() override { assert(0); }; //! Get attribute value of node. - bool getAttr(const char* key, int& value) const; - bool getAttr(const char* key, unsigned int& value) const; - bool getAttr(const char* key, int64& value) const; - bool getAttr(const char* key, uint64& value, bool useHexFormat = true /* ignored */) const; - bool getAttr(const char* key, float& value) const; - bool getAttr(const char* key, f64& value) const; - bool getAttr(const char* key, bool& value) const; - bool getAttr(const char* key, XmlString& value) const {const char* v(NULL); bool boHasAttribute(getAttr(key, &v)); value = v; return boHasAttribute; } - bool getAttr(const char* key, Vec2& value) const; - bool getAttr(const char* key, Ang3& value) const; - bool getAttr(const char* key, Vec3& value) const; - bool getAttr(const char* key, Vec4& value) const; - bool getAttr(const char* key, Quat& value) const; - bool getAttr(const char* key, ColorB& value) const; + bool getAttr(const char* key, int& value) const override; + bool getAttr(const char* key, unsigned int& value) const override; + bool getAttr(const char* key, int64& value) const override; + bool getAttr(const char* key, uint64& value, bool useHexFormat = true /* ignored */) const override; + bool getAttr(const char* key, float& value) const override; + bool getAttr(const char* key, f64& value) const override; + bool getAttr(const char* key, bool& value) const override; + bool getAttr(const char* key, XmlString& value) const override {const char* v(NULL); bool boHasAttribute(getAttr(key, &v)); value = v; return boHasAttribute; } + bool getAttr(const char* key, Vec2& value) const override; + bool getAttr(const char* key, Ang3& value) const override; + bool getAttr(const char* key, Vec3& value) const override; + bool getAttr(const char* key, Vec4& value) const override; + bool getAttr(const char* key, Quat& value) const override; + bool getAttr(const char* key, ColorB& value) const override; private: ////////////////////////////////////////////////////////////////////////// @@ -217,7 +217,7 @@ private: } protected: - virtual void setParent([[maybe_unused]] const XmlNodeRef& inRef) { assert(0); } + void setParent([[maybe_unused]] const XmlNodeRef& inRef) override { assert(0); } ////////////////////////////////////////////////////////////////////////// private: diff --git a/Code/Tools/GridHub/GridHub/gridhub.hxx b/Code/Tools/GridHub/GridHub/gridhub.hxx index 849dbb92e1..14ed468345 100644 --- a/Code/Tools/GridHub/GridHub/gridhub.hxx +++ b/Code/Tools/GridHub/GridHub/gridhub.hxx @@ -57,8 +57,8 @@ public slots: protected: void SanityCheckDetectionTimeout(); - void timerEvent(QTimerEvent *event); - void closeEvent(QCloseEvent *event); + void timerEvent(QTimerEvent *event) override; + void closeEvent(QCloseEvent *event) override; void SystemTick(); private: @@ -125,7 +125,7 @@ public: /// Callback that is called when the Session service is ready to process sessions. void OnSessionServiceReady() override {} /// Callback that notifies the title when a game search query have completed. - void OnGridSearchComplete(GridMate::GridSearch* gridSearch) { (void)gridSearch; } + void OnGridSearchComplete(GridMate::GridSearch* gridSearch) override { (void)gridSearch; } /// Callback that notifies the title when a new member joins the game session. void OnMemberJoined(GridMate::GridSession* session, GridMate::GridMember* member) override; /// Callback that notifies the title that a member is leaving the game session. member pointer is NOT valid after the callback returns. @@ -133,25 +133,25 @@ public: // \todo a better way will be (after we solve migration) is to supply a reason to OnMemberLeaving... like the member was kicked. // this will require that we actually remove the replica at the same moment. /// Callback that host decided to kick a member. You will receive a OnMemberLeaving when the actual member leaves the session. - void OnMemberKicked(GridMate::GridSession* session, GridMate::GridMember* member, AZ::u8 reason) { (void)session;(void)member;(void)reason; } + void OnMemberKicked(GridMate::GridSession* session, GridMate::GridMember* member, AZ::u8 reason) override { (void)session;(void)member;(void)reason; } /// After this callback it is safe to access session features. If host session is fully operational if client wait for OnSessionJoined. void OnSessionCreated(GridMate::GridSession* session) override; /// Called on client machines to indicate that we join successfully. - void OnSessionJoined(GridMate::GridSession* session) { (void)session; } + void OnSessionJoined(GridMate::GridSession* session) override { (void)session; } /// Callback that notifies the title when a session will be left. session pointer is NOT valid after the callback returns. void OnSessionDelete(GridMate::GridSession* session) override; /// Called when a session error occurs. - void OnSessionError(GridMate::GridSession* session, const AZStd::string& errorMsg ) { (void)session; (void)errorMsg; } + void OnSessionError(GridMate::GridSession* session, const AZStd::string& errorMsg ) override { (void)session; (void)errorMsg; } /// Called when the actual game(match) starts - void OnSessionStart(GridMate::GridSession* session) { (void)session; } + void OnSessionStart(GridMate::GridSession* session) override { (void)session; } /// Called when the actual game(match) ends - void OnSessionEnd(GridMate::GridSession* session) { (void)session; } + void OnSessionEnd(GridMate::GridSession* session) override { (void)session; } /// Called when we start a host migration. - void OnMigrationStart(GridMate::GridSession* session) { (void)session; } + void OnMigrationStart(GridMate::GridSession* session) override { (void)session; } /// Called so the user can select a member that should be the new Host. Value will be ignored if NULL, current host or the member has invalid connection id. - void OnMigrationElectHost(GridMate::GridSession* session,GridMate::GridMember*& newHost) { (void)session;(void)newHost; } + void OnMigrationElectHost(GridMate::GridSession* session,GridMate::GridMember*& newHost) override { (void)session;(void)newHost; } /// Called when the host migration has completed. - void OnMigrationEnd(GridMate::GridSession* session,GridMate::GridMember* newHost) { (void)session;(void)newHost; } + void OnMigrationEnd(GridMate::GridSession* session,GridMate::GridMember* newHost) override { (void)session;(void)newHost; } ////////////////////////////////////////////////////////////////////////// void SetUI(GridHub* ui) { m_ui = ui; } diff --git a/Code/Tools/GridHub/GridHub/main.cpp b/Code/Tools/GridHub/GridHub/main.cpp index 3b853910be..fe27301714 100644 --- a/Code/Tools/GridHub/GridHub/main.cpp +++ b/Code/Tools/GridHub/GridHub/main.cpp @@ -140,7 +140,7 @@ protected: * ComponentApplication::RegisterCoreComponents and then register the application * specific core components. */ - virtual void RegisterCoreComponents(); + void RegisterCoreComponents() override; /** AZ::SystemTickBus::Handler @@ -220,7 +220,7 @@ public: } //virtual bool QGridHubApplication::winEventFilter( MSG *msg , long *result) - virtual bool nativeEventFilter(const QByteArray &eventType, void *message, [[maybe_unused]] long *result) + bool nativeEventFilter(const QByteArray &eventType, void *message, [[maybe_unused]] long *result) override { #ifdef AZ_PLATFORM_WINDOWS if ((eventType == "windows_generic_MSG")||(eventType == "windows_dispatcher_MSG")) diff --git a/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.h b/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.h index d9a6f7aba6..458cfc44a2 100644 --- a/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.h +++ b/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.h @@ -94,11 +94,11 @@ struct SNoDataEvent { SNoDataEvent() : IRemoteEvent(T) {}; - virtual IRemoteEvent* Clone() { return new SNoDataEvent(); } + IRemoteEvent* Clone() override { return new SNoDataEvent(); } protected: - virtual void WriteToBuffer([[maybe_unused]] char* buffer, int& size, [[maybe_unused]] int maxsize) { size = 0; } - virtual IRemoteEvent* CreateFromBuffer([[maybe_unused]] const char* buffer, [[maybe_unused]] int size) { return Clone(); } + void WriteToBuffer([[maybe_unused]] char* buffer, int& size, [[maybe_unused]] int maxsize) override { size = 0; } + IRemoteEvent* CreateFromBuffer([[maybe_unused]] const char* buffer, [[maybe_unused]] int size) override { return Clone(); } }; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -109,17 +109,17 @@ struct SStringEvent SStringEvent(const char* data) : IRemoteEvent(T) , m_data(data) {}; - virtual IRemoteEvent* Clone() { return new SStringEvent(GetData()); } + IRemoteEvent* Clone() override { return new SStringEvent(GetData()); } const char* GetData() const { return m_data.c_str(); } protected: - virtual void WriteToBuffer(char* buffer, int& size, int maxsize) + void WriteToBuffer(char* buffer, int& size, int maxsize) override { const char* data = GetData(); size = min((int)strlen(data), maxsize); memcpy(buffer, data, size); } - virtual IRemoteEvent* CreateFromBuffer(const char* buffer, [[maybe_unused]] int size) { return new SStringEvent(buffer); } + IRemoteEvent* CreateFromBuffer(const char* buffer, [[maybe_unused]] int size) override { return new SStringEvent(buffer); } private: AZStd::string m_data; diff --git a/Gems/AWSCore/Code/Include/Public/Framework/ServiceRequestJobConfig.h b/Gems/AWSCore/Code/Include/Public/Framework/ServiceRequestJobConfig.h index 240331496e..10b14ed5af 100644 --- a/Gems/AWSCore/Code/Include/Public/Framework/ServiceRequestJobConfig.h +++ b/Gems/AWSCore/Code/Include/Public/Framework/ServiceRequestJobConfig.h @@ -75,7 +75,7 @@ namespace AWSCore return (m_requestUrl.length() > 0); } - std::shared_ptr GetCredentialsProvider() + std::shared_ptr GetCredentialsProvider() override { ServiceClientJobConfigType::EnsureSettingsApplied(); return m_credentialsProvider; diff --git a/Gems/AssetValidation/Code/Source/AssetValidationSystemComponent.h b/Gems/AssetValidation/Code/Source/AssetValidationSystemComponent.h index 8f7a177ca2..e8b2c0acc3 100644 --- a/Gems/AssetValidation/Code/Source/AssetValidationSystemComponent.h +++ b/Gems/AssetValidation/Code/Source/AssetValidationSystemComponent.h @@ -92,7 +92,7 @@ namespace AssetValidation //////////////////////////////////////////////////////////////////////// // ArchiveNotificationBus interface implementation - void FileAccess(const char* filePath) /*override*/; + void FileAccess(const char* filePath) override /*override*/; //////////////////////////////////////////////////////////////////////// bool AddSeedList(const char* seedPath) override; diff --git a/Gems/Atom/RHI/Code/CMakeLists.txt b/Gems/Atom/RHI/Code/CMakeLists.txt index 879fc7d2ce..ae471b1ca1 100644 --- a/Gems/Atom/RHI/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Code/CMakeLists.txt @@ -55,9 +55,6 @@ ly_add_target( Gem::Atom_RHI.Reflect PUBLIC ${RENDERDOC_DEPENDENCY} - COMPILE_DEFINITIONS - PUBLIC - ${RENDERDOC_DEFINE} ) ly_add_target( diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/MemoryTypeAllocator.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/MemoryTypeAllocator.h index c628cb61e0..8fd083d4b9 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/MemoryTypeAllocator.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/MemoryTypeAllocator.h @@ -38,7 +38,7 @@ namespace AZ void Init(const Descriptor& descriptor); - void Shutdown(); + void Shutdown() override; void GarbageCollect(); diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Scope.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Scope.h index 86140e2c7c..dad356cab6 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Scope.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Scope.h @@ -142,7 +142,7 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// // FrameEventBus::Handler - void OnFrameCompileEnd(RHI::FrameGraph& frameGraph); + void OnFrameCompileEnd(RHI::FrameGraph& frameGraph) override; ////////////////////////////////////////////////////////////////////////// // Returns if a barrier can be converted to an implicit subpass barrier. diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/ShaderCollection.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/ShaderCollection.cpp index 180f6a5d99..7b3b6b7a28 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/ShaderCollection.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/ShaderCollection.cpp @@ -22,7 +22,7 @@ namespace AZ : public SerializeContext::IEventHandler { //! Called right before we start reading from the instance pointed by classPtr. - virtual void OnReadBegin(void* classPtr) + void OnReadBegin(void* classPtr) override { ShaderCollection::Item* shaderVariantReference = reinterpret_cast(classPtr); shaderVariantReference->m_shaderVariantId = shaderVariantReference->m_shaderOptionGroup.GetShaderVariantId(); diff --git a/Gems/AudioSystem/Code/Source/Engine/AudioSystem.h b/Gems/AudioSystem/Code/Source/Engine/AudioSystem.h index 1d8f8fb286..615d202e25 100644 --- a/Gems/AudioSystem/Code/Source/Engine/AudioSystem.h +++ b/Gems/AudioSystem/Code/Source/Engine/AudioSystem.h @@ -120,7 +120,7 @@ namespace Audio void FreeAudioProxy(IAudioProxy* const pIAudioProxy) override; TAudioSourceId CreateAudioSource(const SAudioInputConfig& sourceConfig) override; - void DestroyAudioSource(TAudioSourceId sourceId); + void DestroyAudioSource(TAudioSourceId sourceId) override; // When AUDIO_RELEASE is defined, these two functions always return nullptr const char* GetAudioControlName(const EAudioControlType controlType, const TATLIDType atlID) const override; diff --git a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h index 08d3ccf90b..e5aaaa2e93 100644 --- a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h +++ b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashHandler.h @@ -22,13 +22,13 @@ namespace CrashHandler static void InitCrashHandler(const std::string& moduleTag, const std::string& devRoot, const std::string& crashUrl = {}, const std::string& crashToken = {}, const std::string& handlerFolder = {}, const CrashHandlerAnnotations& baseAnnotations = CrashHandlerAnnotations(), const CrashHandlerArguments& argumentVec = CrashHandlerArguments()); protected: - virtual const char* GetCrashHandlerExecutableName() const override; - virtual std::string DetermineAppPath() const override; + const char* GetCrashHandlerExecutableName() const override; + std::string DetermineAppPath() const override; - virtual std::string GetCrashSubmissionURL() const override; - virtual std::string GetCrashSubmissionToken() const override; + std::string GetCrashSubmissionURL() const override; + std::string GetCrashSubmissionToken() const override; - virtual std::string GetCrashHandlerPath(const std::string& lyAppRoot) const override; + std::string GetCrashHandlerPath(const std::string& lyAppRoot) const override; }; diff --git a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h index 48d2bd25f7..c48440bed4 100644 --- a/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h +++ b/Gems/CrashReporting/Code/Include/CrashReporting/GameCrashUploader.h @@ -17,7 +17,7 @@ namespace O3de { public: GameCrashUploader(int& argcount, char** argv); - virtual bool CheckConfirmation(const crashpad::CrashReportDatabase::Report& report) override; + bool CheckConfirmation(const crashpad::CrashReportDatabase::Report& report) override; static std::string GetRootFolder(); }; diff --git a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h index 24a6eae3aa..b534bd3bd4 100644 --- a/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h +++ b/Gems/DebugDraw/Code/Source/DebugDrawSystemComponent.h @@ -117,7 +117,7 @@ namespace DebugDraw void OnBeginPrepareRender() override; // AZ::Render::Bootstrap::NotificationBus - void OnBootstrapSceneReady(AZ::RPI::Scene* scene); + void OnBootstrapSceneReady(AZ::RPI::Scene* scene) override; // EntityBus void OnEntityDeactivated(const AZ::EntityId& entityId) override; diff --git a/Gems/EMotionFX/Code/MCore/Source/AttributeBool.h b/Gems/EMotionFX/Code/MCore/Source/AttributeBool.h index bf5d13d8fe..1dac643667 100644 --- a/Gems/EMotionFX/Code/MCore/Source/AttributeBool.h +++ b/Gems/EMotionFX/Code/MCore/Source/AttributeBool.h @@ -44,7 +44,7 @@ namespace MCore // overloaded from the attribute base class Attribute* Clone() const override { return AttributeBool::Create(m_value); } const char* GetTypeString() const override { return "AttributeBool"; } - bool InitFrom(const Attribute* other); + bool InitFrom(const Attribute* other) override; bool InitFromString(const AZStd::string& valueString) override { return AzFramework::StringFunc::LooksLikeBool(valueString.c_str(), &m_value); diff --git a/Gems/EMotionFX/Code/MCore/Source/AttributeInt32.h b/Gems/EMotionFX/Code/MCore/Source/AttributeInt32.h index e195d584a5..ebde060209 100644 --- a/Gems/EMotionFX/Code/MCore/Source/AttributeInt32.h +++ b/Gems/EMotionFX/Code/MCore/Source/AttributeInt32.h @@ -45,7 +45,7 @@ namespace MCore // overloaded from the attribute base class Attribute* Clone() const override { return AttributeInt32::Create(m_value); } const char* GetTypeString() const override { return "AttributeInt32"; } - bool InitFrom(const Attribute* other); + bool InitFrom(const Attribute* other) override; bool InitFromString(const AZStd::string& valueString) override { return AzFramework::StringFunc::LooksLikeInt(valueString.c_str(), &m_value); diff --git a/Gems/ExpressionEvaluation/Code/Source/ExpressionEvaluationSystemComponent.cpp b/Gems/ExpressionEvaluation/Code/Source/ExpressionEvaluationSystemComponent.cpp index 1a72f30e7c..5c4b9c61d9 100644 --- a/Gems/ExpressionEvaluation/Code/Source/ExpressionEvaluationSystemComponent.cpp +++ b/Gems/ExpressionEvaluation/Code/Source/ExpressionEvaluationSystemComponent.cpp @@ -37,12 +37,12 @@ namespace ExpressionEvaluation } - ExpressionParserId GetParserId() const + ExpressionParserId GetParserId() const override { return InternalTypes::Interfaces::InternalParser; } - ParseResult ParseElement(const AZStd::string& inputText, size_t offset) const + ParseResult ParseElement(const AZStd::string& inputText, size_t offset) const override { ParseResult result; AZStd::smatch match; @@ -69,7 +69,7 @@ namespace ExpressionEvaluation return result; } - void EvaluateToken(const ElementInformation& parseResult, ExpressionResultStack& evaluationStack) const + void EvaluateToken(const ElementInformation& parseResult, ExpressionResultStack& evaluationStack) const override { AZ_UNUSED(parseResult); AZ_UNUSED(evaluationStack); diff --git a/Gems/LyShine/Code/Source/Sprite.h b/Gems/LyShine/Code/Source/Sprite.h index 8a645b78b1..0b2c790cf6 100644 --- a/Gems/LyShine/Code/Source/Sprite.h +++ b/Gems/LyShine/Code/Source/Sprite.h @@ -44,7 +44,7 @@ public: // member functions AZ::Vector2 GetSize() override; AZ::Vector2 GetCellSize(int cellIndex) override; const SpriteSheetCellContainer& GetSpriteSheetCells() const override; - virtual void SetSpriteSheetCells(const SpriteSheetCellContainer& cells); + void SetSpriteSheetCells(const SpriteSheetCellContainer& cells) override; void ClearSpriteSheetCells() override; void AddSpriteSheetCell(const SpriteSheetCell& spriteSheetCell) override; AZ::Vector2 GetCellUvSize(int cellIndex) const override; @@ -96,7 +96,7 @@ protected: // member functions bool CellIndexWithinRange(int cellIndex) const; private: // types - typedef AZStd::unordered_map, stl::equality_string_caseless > CSpriteHashMap; + using CSpriteHashMap = AZStd::unordered_map, stl::equality_string_caseless >; private: // member functions bool LoadFromXmlFile(); diff --git a/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.h b/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.h index 640cf03ee4..f7fec70813 100644 --- a/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.h +++ b/Gems/MultiplayerCompression/Code/Source/LZ4Compressor.h @@ -31,13 +31,13 @@ namespace MultiplayerCompression LZ4Compressor() = default; const char* GetName() const { return CompressorName; } - AzNetworking::CompressorType GetType() const { return CompressorType; }; + AzNetworking::CompressorType GetType() const override { return CompressorType; }; - bool Init() { return true; } - size_t GetMaxChunkSize(size_t maxCompSize) const; - size_t GetMaxCompressedBufferSize(size_t uncompSize) const; + bool Init() override { return true; } + size_t GetMaxChunkSize(size_t maxCompSize) const override; + size_t GetMaxCompressedBufferSize(size_t uncompSize) const override; - AzNetworking::CompressorError Compress(const void* uncompData, size_t uncompSize, void* compData, size_t compDataSize, size_t& compSize); - AzNetworking::CompressorError Decompress(const void* compData, size_t compDataSize, void* uncompData, size_t uncompDataSize, size_t& consumedSize, size_t& uncompSize); + AzNetworking::CompressorError Compress(const void* uncompData, size_t uncompSize, void* compData, size_t compDataSize, size_t& compSize) override; + AzNetworking::CompressorError Decompress(const void* compData, size_t compDataSize, void* uncompData, size_t uncompDataSize, size_t& consumedSize, size_t& uncompSize) override; }; } diff --git a/Gems/Presence/Code/Source/PresenceSystemComponent.h b/Gems/Presence/Code/Source/PresenceSystemComponent.h index cc3ab48bae..bc4ec01906 100644 --- a/Gems/Presence/Code/Source/PresenceSystemComponent.h +++ b/Gems/Presence/Code/Source/PresenceSystemComponent.h @@ -43,7 +43,7 @@ namespace Presence //////////////////////////////////////////////////////////////////////// //! PresenceRequestBus interface implementation void SetPresence(const SetPresenceParams& params) override; - void QueryPresence(const QueryPresenceParams& params); + void QueryPresence(const QueryPresenceParams& params) override; public: //////////////////////////////////////////////////////////////////////// diff --git a/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset b/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset index a612135e94..2a248b216b 100644 --- a/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset +++ b/cmake/Platform/Common/MSVC/CodeAnalysis.ruleset @@ -1,7 +1,8 @@  - - + + + \ No newline at end of file From 817f8ce4c1288c0cd45cf3aa461e4152ec4bf1a8 Mon Sep 17 00:00:00 2001 From: John Jones-Steele <82226755+jjjoness@users.noreply.github.com> Date: Wed, 8 Sep 2021 16:50:29 +0100 Subject: [PATCH 192/355] Terrain/jjjoness/3172 axis aligned box shape component (#3981) * CHanges to Push/Pop Matrix Signed-off-by: John Jones-Steele * Fixed bad commit Signed-off-by: John Jones-Steele * REmoved the AxisAlignedBoxShapeComponentBux and AxisAlignedBoxShapeConfig Signed-off-by: John Jones-Steele * Fixed derivation of AxisAlignedBoxShape Signed-off-by: John Jones-Steele * Added ShowChildrenOnly to Component Signed-off-by: John Jones-Steele * Fixed cmake file Signed-off-by: John Jones-Steele * Changes from review Signed-off-by: John Jones-Steele * Added tests for AxisAlignedBoxShape Signed-off-by: John Jones-Steele * Addressed PR comments and added one further test. Signed-off-by: John Jones-Steele * Removed dead code. Signed-off-by: John Jones-Steele * Changes from review Signed-off-by: John Jones-Steele * Spelling fix and changed link to docs Signed-off-by: John Jones-Steele * Fixed profile bug in Linux Signed-off-by: John Jones-Steele * Fixed problem with Unity Profile Build in Tests Signed-off-by: John Jones-Steele --- .../Entity/EntityDebugDisplayBus.h | 3 + .../AtomDebugDisplayViewportInterface.cpp | 20 ++ .../AtomDebugDisplayViewportInterface.h | 2 + Gems/LmbrCentral/Code/Source/LmbrCentral.cpp | 3 + .../Code/Source/LmbrCentralEditor.cpp | 2 + .../Code/Source/Shape/AxisAlignedBoxShape.cpp | 59 +++++ .../Code/Source/Shape/AxisAlignedBoxShape.h | 44 ++++ .../Shape/AxisAlignedBoxShapeComponent.cpp | 159 ++++++++++++ .../Shape/AxisAlignedBoxShapeComponent.h | 76 ++++++ Gems/LmbrCentral/Code/Source/Shape/BoxShape.h | 10 +- .../Code/Source/Shape/BoxShapeComponent.cpp | 106 +------- .../EditorAxisAlignedBoxShapeComponent.cpp | 168 +++++++++++++ .../EditorAxisAlignedBoxShapeComponent.h | 71 ++++++ .../Source/Shape/EditorBoxShapeComponent.cpp | 2 +- .../Code/Tests/AxisAlignedBoxShapeTest.cpp | 238 ++++++++++++++++++ Gems/LmbrCentral/Code/Tests/DiskShapeTest.cpp | 30 +-- Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp | 32 +-- .../LmbrCentral/Shape/BoxShapeComponentBus.h | 5 +- .../Code/lmbrcentral_editor_files.cmake | 2 + Gems/LmbrCentral/Code/lmbrcentral_files.cmake | 4 + .../Code/lmbrcentral_tests_files.cmake | 1 + 21 files changed, 897 insertions(+), 140 deletions(-) create mode 100644 Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.cpp create mode 100644 Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.h create mode 100644 Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.cpp create mode 100644 Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.h create mode 100644 Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.cpp create mode 100644 Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.h create mode 100644 Gems/LmbrCentral/Code/Tests/AxisAlignedBoxShapeTest.cpp diff --git a/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h b/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h index fddaddf303..68af9dbb26 100644 --- a/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h +++ b/Code/Framework/AzFramework/AzFramework/Entity/EntityDebugDisplayBus.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -100,6 +101,8 @@ namespace AzFramework virtual AZ::u32 SetState(AZ::u32 state) { (void)state; return 0; } virtual void PushMatrix(const AZ::Transform& tm) { (void)tm; } virtual void PopMatrix() {} + virtual void PushPremultipliedMatrix(const AZ::Matrix3x4& matrix) { (void)matrix; } + virtual AZ::Matrix3x4 PopPremultipliedMatrix() { return AZ::Matrix3x4::CreateIdentity(); } protected: ~DebugDisplayRequests() = default; diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp index d720463ce2..b45fbe05f6 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.cpp @@ -1552,6 +1552,26 @@ namespace AZ::AtomBridge } } + void AtomDebugDisplayViewportInterface::PushPremultipliedMatrix(const AZ::Matrix3x4& matrix) + { + AZ_Assert(m_rendState.m_currentTransform < RenderState::TransformStackSize, "Exceeded AtomDebugDisplayViewportInterface matrix stack size"); + if (m_rendState.m_currentTransform < RenderState::TransformStackSize) + { + m_rendState.m_currentTransform++; + m_rendState.m_transformStack[m_rendState.m_currentTransform] = matrix; + } + } + + AZ::Matrix3x4 AtomDebugDisplayViewportInterface::PopPremultipliedMatrix() + { + AZ_Assert(m_rendState.m_currentTransform > 0, "Underflowed AtomDebugDisplayViewportInterface matrix stack"); + if (m_rendState.m_currentTransform > 0) + { + m_rendState.m_currentTransform--; + } + return m_rendState.m_transformStack[m_rendState.m_currentTransform + 1]; + } + const AZ::Matrix3x4& AtomDebugDisplayViewportInterface::GetCurrentTransform() const { return m_rendState.m_transformStack[m_rendState.m_currentTransform]; diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h index 22fb8875a4..07f4efdf50 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/AtomDebugDisplayViewportInterface.h @@ -193,6 +193,8 @@ namespace AZ::AtomBridge AZ::u32 SetState(AZ::u32 state) override; void PushMatrix(const AZ::Transform& tm) override; void PopMatrix() override; + void PushPremultipliedMatrix(const AZ::Matrix3x4& matrix) override; + AZ::Matrix3x4 PopPremultipliedMatrix() override; private: diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp index 78742028f9..31cf68e9a0 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentral.cpp @@ -72,6 +72,7 @@ // Shape components #include "Shape/SphereShapeComponent.h" #include "Shape/DiskShapeComponent.h" +#include "Shape/AxisAlignedBoxShapeComponent.h" #include "Shape/BoxShapeComponent.h" #include "Shape/QuadShapeComponent.h" #include "Shape/CylinderShapeComponent.h" @@ -202,6 +203,7 @@ namespace LmbrCentral SphereShapeComponent::CreateDescriptor(), DiskShapeComponent::CreateDescriptor(), BoxShapeComponent::CreateDescriptor(), + AxisAlignedBoxShapeComponent::CreateDescriptor(), QuadShapeComponent::CreateDescriptor(), CylinderShapeComponent::CreateDescriptor(), CapsuleShapeComponent::CreateDescriptor(), @@ -215,6 +217,7 @@ namespace LmbrCentral SphereShapeDebugDisplayComponent::CreateDescriptor(), DiskShapeDebugDisplayComponent::CreateDescriptor(), BoxShapeDebugDisplayComponent::CreateDescriptor(), + AxisAlignedBoxShapeDebugDisplayComponent::CreateDescriptor(), QuadShapeDebugDisplayComponent::CreateDescriptor(), CapsuleShapeDebugDisplayComponent::CreateDescriptor(), CylinderShapeDebugDisplayComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp index b15a31f8b3..511bf98582 100644 --- a/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp +++ b/Gems/LmbrCentral/Code/Source/LmbrCentralEditor.cpp @@ -24,6 +24,7 @@ #include "Scripting/EditorSpawnerComponent.h" #include "Scripting/EditorTagComponent.h" +#include "Shape/EditorAxisAlignedBoxShapeComponent.h" #include "Shape/EditorBoxShapeComponent.h" #include "Shape/EditorQuadShapeComponent.h" #include "Shape/EditorSphereShapeComponent.h" @@ -67,6 +68,7 @@ namespace LmbrCentral EditorDiskShapeComponent::CreateDescriptor(), EditorTubeShapeComponent::CreateDescriptor(), EditorBoxShapeComponent::CreateDescriptor(), + EditorAxisAlignedBoxShapeComponent::CreateDescriptor(), EditorQuadShapeComponent::CreateDescriptor(), EditorLookAtComponent::CreateDescriptor(), EditorCylinderShapeComponent::CreateDescriptor(), diff --git a/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.cpp b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.cpp new file mode 100644 index 0000000000..2553f8ab3e --- /dev/null +++ b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include "AxisAlignedBoxShape.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace LmbrCentral +{ + AxisAlignedBoxShape::AxisAlignedBoxShape() + : BoxShape() + { + } + + void AxisAlignedBoxShape::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("Axis Aligned Box Shape", "Axis Aligned Box shape configuration parameters") + ; + } + } + } + + void AxisAlignedBoxShape::Activate(AZ::EntityId entityId) + { + BoxShape::Activate(entityId); + m_currentTransform.SetRotation(AZ::Quaternion::CreateIdentity()); + } + + void AxisAlignedBoxShape::OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) + { + AZ::Transform worldNoRotation(world.GetTranslation(), AZ::Quaternion::CreateIdentity(), world.GetUniformScale()); + BoxShape::OnTransformChanged(local, worldNoRotation); + } +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.h b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.h new file mode 100644 index 0000000000..724092b608 --- /dev/null +++ b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShape.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include "BoxShape.h" + +namespace AzFramework +{ + class DebugDisplayRequests; +} + +namespace LmbrCentral +{ + struct ShapeDrawParams; + + class AxisAlignedBoxShape + : public BoxShape + { + public: + AZ_CLASS_ALLOCATOR(AxisAlignedBoxShape, AZ::SystemAllocator, 0) + AZ_RTTI(AxisAlignedBoxShape, "{CFDC96C5-287A-4033-8D7D-BA9331C13F25}", BoxShape) + + AxisAlignedBoxShape(); + + static void Reflect(AZ::ReflectContext* context); + + void Activate(AZ::EntityId entityId) override; + + // AZ::TransformNotificationBus::Handler + void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; + }; +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.cpp new file mode 100644 index 0000000000..7f919bc097 --- /dev/null +++ b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.cpp @@ -0,0 +1,159 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + +#include "AxisAlignedBoxShapeComponent.h" +#include +#include +#include +#include +#include + +namespace LmbrCentral +{ + void AxisAlignedBoxShapeComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("ShapeService")); + provided.push_back(AZ_CRC_CE("BoxShapeService")); + provided.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); + } + + void AxisAlignedBoxShapeComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) + { + incompatible.push_back(AZ_CRC_CE("ShapeService")); + incompatible.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); + } + + void AxisAlignedBoxShapeComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required) + { + required.push_back(AZ_CRC_CE("TransformService")); + } + + void AxisAlignedBoxShapeComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + dependent.push_back(AZ_CRC_CE("NonUniformScaleService")); + } + + void AxisAlignedBoxShapeDebugDisplayComponent::Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1)->Field( + "Configuration", &AxisAlignedBoxShapeDebugDisplayComponent::m_boxShapeConfig) + ; + } + } + + void AxisAlignedBoxShapeDebugDisplayComponent::Activate() + { + EntityDebugDisplayComponent::Activate(); + ShapeComponentNotificationsBus::Handler::BusConnect(GetEntityId()); + m_nonUniformScale = AZ::Vector3::CreateOne(); + AZ::NonUniformScaleRequestBus::EventResult(m_nonUniformScale, GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + } + + void AxisAlignedBoxShapeDebugDisplayComponent::Deactivate() + { + ShapeComponentNotificationsBus::Handler::BusDisconnect(); + EntityDebugDisplayComponent::Deactivate(); + } + + void AxisAlignedBoxShapeDebugDisplayComponent::Draw(AzFramework::DebugDisplayRequests& debugDisplay) + { + AZ::Matrix3x4 saveMatrix; + ShapeDrawParams drawParams = g_defaultShapeDrawParams; + drawParams.m_shapeColor = m_boxShapeConfig.GetDrawColor(); + drawParams.m_filled = m_boxShapeConfig.IsFilled(); + AZ::Transform transform = GetCurrentTransform(); + transform.SetRotation(AZ::Quaternion::CreateIdentity()); + saveMatrix = debugDisplay.PopPremultipliedMatrix(); + debugDisplay.PushMatrix(transform); + DrawBoxShape(drawParams, m_boxShapeConfig, debugDisplay, m_nonUniformScale); + debugDisplay.PopMatrix(); + debugDisplay.PushPremultipliedMatrix(saveMatrix); + } + + bool AxisAlignedBoxShapeDebugDisplayComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) + { + if (const auto config = azrtti_cast(baseConfig)) + { + m_boxShapeConfig = *config; + return true; + } + return false; + } + + bool AxisAlignedBoxShapeDebugDisplayComponent::WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const + { + if (auto outConfig = azrtti_cast(outBaseConfig)) + { + *outConfig = m_boxShapeConfig; + return true; + } + return false; + } + + void AxisAlignedBoxShapeDebugDisplayComponent::OnShapeChanged(ShapeChangeReasons changeReason) + { + if (changeReason == ShapeChangeReasons::ShapeChanged) + { + BoxShapeComponentRequestsBus::EventResult(m_boxShapeConfig, GetEntityId(), &BoxShapeComponentRequests::GetBoxConfiguration); + AZ::NonUniformScaleRequestBus::EventResult(m_nonUniformScale, GetEntityId(), &AZ::NonUniformScaleRequests::GetScale); + } + } + + void AxisAlignedBoxShapeComponent::Reflect(AZ::ReflectContext* context) + { + AxisAlignedBoxShape::Reflect(context); + + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1) + ->Field("AxisAlignedBoxShape", &AxisAlignedBoxShapeComponent::m_aaboxShape) + ; + } + + if (AZ::BehaviorContext* behaviorContext = azrtti_cast(context)) + { + behaviorContext->Constant("AxisAlignedBoxShapeComponentTypeId", BehaviorConstant(AxisAlignedBoxShapeComponentTypeId)); + } + } + + void AxisAlignedBoxShapeComponent::Activate() + { + m_aaboxShape.Activate(GetEntityId()); + } + + void AxisAlignedBoxShapeComponent::Deactivate() + { + m_aaboxShape.Deactivate(); + } + + bool AxisAlignedBoxShapeComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) + { + if (const auto config = azrtti_cast(baseConfig)) + { + m_aaboxShape.SetBoxConfiguration(*config); + return true; + } + return false; + } + + bool AxisAlignedBoxShapeComponent::WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const + { + if (auto config = azrtti_cast(outBaseConfig)) + { + *config = m_aaboxShape.GetBoxConfiguration(); + return true; + } + return false; + } + +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.h b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.h new file mode 100644 index 0000000000..094f9591d1 --- /dev/null +++ b/Gems/LmbrCentral/Code/Source/Shape/AxisAlignedBoxShapeComponent.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include + +#include "Rendering/EntityDebugDisplayComponent.h" +#include "AxisAlignedBoxShape.h" + +namespace LmbrCentral +{ + /// Type ID for the AxisAlignedBoxShapeComponent + static const AZ::Uuid AxisAlignedBoxShapeComponentTypeId = "{641D817E-1BC6-406A-BBB2-218541808E45}"; + + /// Type ID for the EditorAxisAlignedBoxShapeComponent + static const AZ::Uuid EditorAxisAlignedBoxShapeComponentTypeId = "{8C027DF6-E157-4159-9BF8-F1B925466F1F}"; + + /// Provide a Component interface for AxisAlignedBoxShape functionality. + class AxisAlignedBoxShapeComponent + : public AZ::Component + { + public: + AZ_COMPONENT(AxisAlignedBoxShapeComponent, AxisAlignedBoxShapeComponentTypeId) + static void Reflect(AZ::ReflectContext* context); + + // AZ::Component + void Activate() override; + void Deactivate() override; + bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override; + bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override; + + private: + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); + static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + + AxisAlignedBoxShape m_aaboxShape; ///< Stores underlying box type for this component. + }; + + /// Concrete EntityDebugDisplay implementation for BoxShape. + class AxisAlignedBoxShapeDebugDisplayComponent + : public EntityDebugDisplayComponent + , public ShapeComponentNotificationsBus::Handler + { + public: + AZ_COMPONENT(AxisAlignedBoxShapeDebugDisplayComponent, "{BA93F933-1DC9-4E0E-B930-A7E3968D5DD1}", EntityDebugDisplayComponent) + static void Reflect(AZ::ReflectContext* context); + + AxisAlignedBoxShapeDebugDisplayComponent() = default; + + // AZ::Component + void Activate() override; + void Deactivate() override; + bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override; + bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override; + + // EntityDebugDisplayComponent + void Draw(AzFramework::DebugDisplayRequests& debugDisplay) override; + + private: + AZ_DISABLE_COPY_MOVE(AxisAlignedBoxShapeDebugDisplayComponent) + + // ShapeComponentNotificationsBus + void OnShapeChanged(ShapeChangeReasons changeReason) override; + + BoxShapeConfig m_boxShapeConfig; ///< Stores configuration data for box shape. + AZ::Vector3 m_nonUniformScale = AZ::Vector3::CreateOne(); ///< Caches non-uniform scale for this entity. + }; +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/BoxShape.h b/Gems/LmbrCentral/Code/Source/Shape/BoxShape.h index a3831fbee6..a9dfd5c35f 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/BoxShape.h +++ b/Gems/LmbrCentral/Code/Source/Shape/BoxShape.h @@ -37,7 +37,7 @@ namespace LmbrCentral static void Reflect(AZ::ReflectContext* context); - void Activate(AZ::EntityId entityId); + virtual void Activate(AZ::EntityId entityId); void Deactivate(); void InvalidateCache(InvalidateShapeCacheReason reason); @@ -67,12 +67,9 @@ namespace LmbrCentral void SetDrawColor(const AZ::Color& color) { m_boxShapeConfig.SetDrawColor(color); } - protected: - - friend class EditorBoxShapeComponent; BoxShapeConfig& ModifyConfiguration() { return m_boxShapeConfig; } - private: + protected: /// Runtime data - cache potentially expensive operations. class BoxIntersectionDataCache : public IntersectionTestDataCache @@ -82,6 +79,7 @@ namespace LmbrCentral const AZ::Vector3& currentNonUniformScale = AZ::Vector3::CreateOne()) override; friend BoxShape; + friend class AxisAlignedBoxShape; AZ::Aabb m_aabb; ///< Aabb representing this Box (including the effects of scale). AZ::Obb m_obb; ///< Obb representing this Box (including the effects of scale). @@ -90,12 +88,12 @@ namespace LmbrCentral bool m_axisAligned = true; ///< Indicates whether the box is axis or object aligned. }; - BoxShapeConfig m_boxShapeConfig; ///< Underlying box configuration. BoxIntersectionDataCache m_intersectionDataCache; ///< Caches transient intersection data. AZ::Transform m_currentTransform; ///< Caches the current transform for the entity on which this component lives. AZ::EntityId m_entityId; ///< Id of the entity the box shape is attached to. AZ::NonUniformScaleChangedEvent::Handler m_nonUniformScaleChangedHandler; ///< Responds to changes in non-uniform scale. AZ::Vector3 m_currentNonUniformScale = AZ::Vector3::CreateOne(); ///< Caches the current non-uniform scale. + BoxShapeConfig m_boxShapeConfig; ///< Underlying box configuration. }; void DrawBoxShape( diff --git a/Gems/LmbrCentral/Code/Source/Shape/BoxShapeComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/BoxShapeComponent.cpp index 40d5dce3cc..ce4a934e91 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/BoxShapeComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/BoxShapeComponent.cpp @@ -101,23 +101,15 @@ namespace LmbrCentral } } - namespace ClassConverters - { - static bool DeprecateBoxColliderConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); - static bool DeprecateBoxColliderComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement); - } - void BoxShapeConfig::Reflect(AZ::ReflectContext* context) { + // Don't reflect again if we're already reflected to the passed in context + if (context->IsTypeReflected(BoxShapeConfigTypeId)) + { + return; + } if (auto serializeContext = azrtti_cast(context)) { - // Deprecate: BoxColliderConfiguration -> BoxShapeConfig - serializeContext->ClassDeprecate( - "BoxColliderConfiguration", - "{282E47CB-9F6D-47AE-A210-4CE879527EFD}", - &ClassConverters::DeprecateBoxColliderConfiguration) - ; - serializeContext->Class() ->Version(2) ->Field("Dimensions", &BoxShapeConfig::m_dimensions) @@ -151,13 +143,6 @@ namespace LmbrCentral if (auto serializeContext = azrtti_cast(context)) { - // Deprecate: BoxColliderComponent -> BoxShapeComponent - serializeContext->ClassDeprecate( - "BoxColliderComponent", - "{C215EB2A-1803-4EDC-B032-F7C92C142337}", - &ClassConverters::DeprecateBoxColliderComponent) - ; - serializeContext->Class() ->Version(2, &ClassConverters::UpgradeBoxShapeComponent) ->Field("BoxShape", &BoxShapeComponent::m_boxShape) @@ -205,85 +190,4 @@ namespace LmbrCentral } return false; } - - namespace ClassConverters - { - static bool DeprecateBoxColliderConfiguration(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) - { - /* - Old: - - - - - New: - - - - */ - - // Cache the Dimensions - AZ::Vector3 oldDimensions; - const int oldIndex = classElement.FindElement(AZ_CRC("Size", 0xf7c0246a)); - if (oldIndex != -1) - { - classElement.GetSubElement(oldIndex).GetData(oldDimensions); - } - - // Convert to BoxShapeConfig - const bool result = classElement.Convert(context, "{F034FBA2-AC2F-4E66-8152-14DFB90D6283}"); - if (result) - { - const int newIndex = classElement.AddElement(context, "Dimensions"); - if (newIndex != -1) - { - classElement.GetSubElement(newIndex).SetData(context, oldDimensions); - return true; - } - } - return false; - } - - static bool DeprecateBoxColliderComponent(AZ::SerializeContext& context, AZ::SerializeContext::DataElementNode& classElement) - { - /* - Old: - - - - - - - New: - - - - - - */ - - // Cache the Configuration - BoxShapeConfig configuration; - int configIndex = classElement.FindElement(AZ_CRC("Configuration", 0xa5e2a5d7)); - if (configIndex != -1) - { - classElement.GetSubElement(configIndex).GetData(configuration); - } - - // Convert to BoxShapeComponent - const bool result = classElement.Convert(context, BoxShapeComponentTypeId); - if (result) - { - configIndex = classElement.AddElement(context, "Configuration"); - if (configIndex != -1) - { - classElement.GetSubElement(configIndex).SetData(context, configuration); - } - return true; - } - return false; - } - - } // namespace ClassConverters - } // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.cpp new file mode 100644 index 0000000000..c833677b1d --- /dev/null +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.cpp @@ -0,0 +1,168 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + +#include +#include +#include +#include +#include + +#include "AxisAlignedBoxShapeComponent.h" +#include "EditorAxisAlignedBoxShapeComponent.h" +#include "EditorShapeComponentConverters.h" +#include "ShapeDisplay.h" + +namespace LmbrCentral +{ + void EditorAxisAlignedBoxShapeComponent::Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(1) + ->Field("AxisAlignedBoxShape", &EditorAxisAlignedBoxShapeComponent::m_aaboxShape) + ->Field("ComponentMode", &EditorAxisAlignedBoxShapeComponent::m_componentModeDelegate) + ; + + if (auto editContext = serializeContext->GetEditContext()) + { + editContext->Class( + "Axis Aligned Box Shape", "The Axis Aligned Box Shape component creates a box around the associated entity") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::Category, "Shape") + ->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Box_Shape.svg") + ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Box_Shape.svg") + ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC_CE("Game")) + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/shape/axis-aligned-box-shape/") + ->DataElement(AZ::Edit::UIHandlers::Default, &EditorAxisAlignedBoxShapeComponent::m_aaboxShape, "Axis Aligned Box Shape", "Axis Aligned Box Shape Configuration") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorAxisAlignedBoxShapeComponent::ConfigurationChanged) + ->DataElement(AZ::Edit::UIHandlers::Default, &EditorAxisAlignedBoxShapeComponent::m_componentModeDelegate, "Component Mode", "Axis Aligned Box Shape Component Mode") + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) + ; + } + } + } + + void EditorAxisAlignedBoxShapeComponent::Init() + { + EditorBaseShapeComponent::Init(); + + SetShapeComponentConfig(&m_aaboxShape.ModifyConfiguration()); + } + + void EditorAxisAlignedBoxShapeComponent::Activate() + { + EditorBaseShapeComponent::Activate(); + m_aaboxShape.Activate(GetEntityId()); + AzFramework::EntityDebugDisplayEventBus::Handler::BusConnect(GetEntityId()); + AzToolsFramework::BoxManipulatorRequestBus::Handler::BusConnect( + AZ::EntityComponentIdPair(GetEntityId(), GetId())); + + // ComponentMode + m_componentModeDelegate.ConnectWithSingleComponentMode< + EditorAxisAlignedBoxShapeComponent, AzToolsFramework::BoxComponentMode>( + AZ::EntityComponentIdPair(GetEntityId(), GetId()), this); + } + + void EditorAxisAlignedBoxShapeComponent::Deactivate() + { + m_componentModeDelegate.Disconnect(); + + AzToolsFramework::BoxManipulatorRequestBus::Handler::BusDisconnect(); + AzFramework::EntityDebugDisplayEventBus::Handler::BusDisconnect(); + m_aaboxShape.Deactivate(); + EditorBaseShapeComponent::Deactivate(); + } + + void EditorAxisAlignedBoxShapeComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + EditorBaseShapeComponent::GetProvidedServices(provided); + provided.push_back(AZ_CRC_CE("BoxShapeService")); + provided.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); + } + + void EditorAxisAlignedBoxShapeComponent::GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + dependent.push_back(AZ_CRC_CE("NonUniformScaleService")); + } + + void EditorAxisAlignedBoxShapeComponent::DisplayEntityViewport( + [[maybe_unused]] const AzFramework::ViewportInfo& viewportInfo, + AzFramework::DebugDisplayRequests& debugDisplay) + { + DisplayShape( + debugDisplay, [this]() { return CanDraw(); }, + [this](AzFramework::DebugDisplayRequests& debugDisplay) + { + DrawBoxShape( + { m_aaboxShape.GetBoxConfiguration().GetDrawColor(), m_shapeWireColor, m_aaboxShape.GetBoxConfiguration().IsFilled() }, + m_aaboxShape.GetBoxConfiguration(), debugDisplay, m_aaboxShape.GetCurrentNonUniformScale()); + }, + m_aaboxShape.GetCurrentTransform()); + } + + void EditorAxisAlignedBoxShapeComponent::ConfigurationChanged() + { + m_aaboxShape.InvalidateCache(InvalidateShapeCacheReason::ShapeChange); + + ShapeComponentNotificationsBus::Event(GetEntityId(), + &ShapeComponentNotificationsBus::Events::OnShapeChanged, + ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged); + + AzToolsFramework::ComponentModeFramework::ComponentModeSystemRequestBus::Broadcast( + &AzToolsFramework::ComponentModeFramework::ComponentModeSystemRequests::Refresh, + AZ::EntityComponentIdPair(GetEntityId(), GetId())); + } + + void EditorAxisAlignedBoxShapeComponent::BuildGameEntity(AZ::Entity* gameEntity) + { + if (AxisAlignedBoxShapeComponent* boxShapeComponent = gameEntity->CreateComponent()) + { + boxShapeComponent->SetConfiguration(m_aaboxShape.GetBoxConfiguration()); + } + + if (m_visibleInGameView) + { + if (auto component = gameEntity->CreateComponent()) + { + component->SetConfiguration(m_aaboxShape.GetBoxConfiguration()); + } + } + } + + void EditorAxisAlignedBoxShapeComponent::OnTransformChanged( + const AZ::Transform& /*local*/, const AZ::Transform& /*world*/) + { + AzToolsFramework::ComponentModeFramework::ComponentModeSystemRequestBus::Broadcast( + &AzToolsFramework::ComponentModeFramework::ComponentModeSystemRequests::Refresh, + AZ::EntityComponentIdPair(GetEntityId(), GetId())); + } + + AZ::Vector3 EditorAxisAlignedBoxShapeComponent::GetDimensions() + { + return m_aaboxShape.GetBoxDimensions(); + } + + void EditorAxisAlignedBoxShapeComponent::SetDimensions(const AZ::Vector3& dimensions) + { + return m_aaboxShape.SetBoxDimensions(dimensions); + } + + AZ::Transform EditorAxisAlignedBoxShapeComponent::GetCurrentTransform() + { + return AzToolsFramework::TransformNormalizedScale(m_aaboxShape.GetCurrentTransform()); + } + + AZ::Vector3 EditorAxisAlignedBoxShapeComponent::GetBoxScale() + { + return AZ::Vector3(m_aaboxShape.GetCurrentTransform().GetUniformScale() * m_aaboxShape.GetCurrentNonUniformScale()); + } +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.h b/Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.h new file mode 100644 index 0000000000..8bff4ea7e1 --- /dev/null +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorAxisAlignedBoxShapeComponent.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include "AxisAlignedBoxShape.h" +#include "AxisAlignedBoxShapeComponent.h" +#include "EditorBaseShapeComponent.h" + +#include +#include +#include + + +namespace LmbrCentral +{ + /// Editor representation of Box Shape Component. + class EditorAxisAlignedBoxShapeComponent + : public EditorBaseShapeComponent + , private AzFramework::EntityDebugDisplayEventBus::Handler + , private AzToolsFramework::BoxManipulatorRequestBus::Handler + { + public: + AZ_EDITOR_COMPONENT(EditorAxisAlignedBoxShapeComponent, EditorAxisAlignedBoxShapeComponentTypeId, EditorBaseShapeComponent); + static void Reflect(AZ::ReflectContext* context); + + EditorAxisAlignedBoxShapeComponent() = default; + + // AZ::Component + void Init() override; + void Activate() override; + void Deactivate() override; + + protected: + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); + + // EditorComponentBase + void BuildGameEntity(AZ::Entity* gameEntity) override; + + // AZ::TransformNotificationBus::Handler + void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; + + private: + AZ_DISABLE_COPY_MOVE(EditorAxisAlignedBoxShapeComponent) + + // AzFramework::EntityDebugDisplayEventBus + void DisplayEntityViewport( + const AzFramework::ViewportInfo& viewportInfo, + AzFramework::DebugDisplayRequests& debugDisplay) override; + + // AzToolsFramework::BoxManipulatorRequestBus + AZ::Vector3 GetDimensions() override; + void SetDimensions(const AZ::Vector3& dimensions) override; + AZ::Transform GetCurrentTransform() override; + AZ::Vector3 GetBoxScale() override; + + void ConfigurationChanged(); + + AxisAlignedBoxShape m_aaboxShape; ///< Stores underlying box representation for this component. + + using ComponentModeDelegate = AzToolsFramework::ComponentModeFramework::ComponentModeDelegate; + ComponentModeDelegate m_componentModeDelegate; /**< Responsible for detecting ComponentMode activation + * and creating a concrete ComponentMode.*/ + }; +} // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp index f645c54610..2983ca7753 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/EditorBoxShapeComponent.cpp @@ -49,7 +49,7 @@ namespace LmbrCentral ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/shape/box-shape/") ->DataElement(AZ::Edit::UIHandlers::Default, &EditorBoxShapeComponent::m_boxShape, "Box Shape", "Box Shape Configuration") - // ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) // disabled - prevents ChangeNotify attribute firing correctly + ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorBoxShapeComponent::ConfigurationChanged) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorBoxShapeComponent::m_componentModeDelegate, "Component Mode", "Box Shape Component Mode") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) diff --git a/Gems/LmbrCentral/Code/Tests/AxisAlignedBoxShapeTest.cpp b/Gems/LmbrCentral/Code/Tests/AxisAlignedBoxShapeTest.cpp new file mode 100644 index 0000000000..c3e8d06791 --- /dev/null +++ b/Gems/LmbrCentral/Code/Tests/AxisAlignedBoxShapeTest.cpp @@ -0,0 +1,238 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace UnitTest +{ + class AxisAlignedBoxShapeTest : public AllocatorsFixture + { + AZStd::unique_ptr m_serializeContext; + AZStd::unique_ptr m_transformComponentDescriptor; + AZStd::unique_ptr m_axisAlignedBoxShapeComponentDescriptor; + AZStd::unique_ptr m_axisAlignedBoxShapeDebugDisplayComponentDescriptor; + AZStd::unique_ptr m_nonUniformScaleComponentDescriptor; + + public: + void SetUp() override + { + AllocatorsFixture::SetUp(); + m_serializeContext = AZStd::make_unique(); + + m_transformComponentDescriptor = + AZStd::unique_ptr(AzFramework::TransformComponent::CreateDescriptor()); + m_transformComponentDescriptor->Reflect(&(*m_serializeContext)); + m_axisAlignedBoxShapeComponentDescriptor = + AZStd::unique_ptr(LmbrCentral::AxisAlignedBoxShapeComponent::CreateDescriptor()); + m_axisAlignedBoxShapeComponentDescriptor->Reflect(&(*m_serializeContext)); + m_axisAlignedBoxShapeDebugDisplayComponentDescriptor = + AZStd::unique_ptr(LmbrCentral::AxisAlignedBoxShapeDebugDisplayComponent::CreateDescriptor()); + m_axisAlignedBoxShapeDebugDisplayComponentDescriptor->Reflect(&(*m_serializeContext)); + m_nonUniformScaleComponentDescriptor = + AZStd::unique_ptr(AzFramework::NonUniformScaleComponent::CreateDescriptor()); + m_nonUniformScaleComponentDescriptor->Reflect(&(*m_serializeContext)); + } + + void TearDown() override + { + m_transformComponentDescriptor.reset(); + m_axisAlignedBoxShapeComponentDescriptor.reset(); + m_axisAlignedBoxShapeDebugDisplayComponentDescriptor.reset(); + m_nonUniformScaleComponentDescriptor.reset(); + m_serializeContext.reset(); + AllocatorsFixture::TearDown(); + } + }; + + void CreateAxisAlignedBox(const AZ::Transform& transform, const AZ::Vector3& dimensions, AZ::Entity& entity) + { + entity.CreateComponent(); + entity.CreateComponent(); + entity.CreateComponent(); + + entity.Init(); + entity.Activate(); + + AZ::TransformBus::Event(entity.GetId(), &AZ::TransformBus::Events::SetWorldTM, transform); + LmbrCentral::BoxShapeComponentRequestsBus::Event( + entity.GetId(), &LmbrCentral::BoxShapeComponentRequestsBus::Events::SetBoxDimensions, dimensions); + } + + void CreateAxisAlignedBoxWithNonUniformScale( + const AZ::Transform& transform, const AZ::Vector3& nonUniformScale, const AZ::Vector3& dimensions, AZ::Entity& entity) + { + entity.CreateComponent(); + entity.CreateComponent(); + entity.CreateComponent(); + entity.CreateComponent(); + + entity.Init(); + entity.Activate(); + + AZ::TransformBus::Event(entity.GetId(), &AZ::TransformBus::Events::SetWorldTM, transform); + LmbrCentral::BoxShapeComponentRequestsBus::Event( + entity.GetId(), &LmbrCentral::BoxShapeComponentRequestsBus::Events::SetBoxDimensions, dimensions); + AZ::NonUniformScaleRequestBus::Event(entity.GetId(), &AZ::NonUniformScaleRequests::SetScale, nonUniformScale); + } + + void CreateDefaultAxisAlignedBox(const AZ::Transform& transform, AZ::Entity& entity) + { + CreateAxisAlignedBox(transform, AZ::Vector3(10.0f, 10.0f, 10.0f), entity); + } + + TEST_F(AxisAlignedBoxShapeTest, EntityTransformIsCorrect) + { + AZ::Entity entity; + CreateAxisAlignedBox( + AZ::Transform::CreateTranslation(AZ::Vector3(0.0f, 0.0f, 0.0f)) * AZ::Transform::CreateRotationZ(AZ::Constants::QuarterPi), + AZ::Vector3(1.0f), entity); + + AZ::Transform transform; + AZ::TransformBus::EventResult(transform, entity.GetId(), &AZ::TransformBus::Events::GetWorldTM); + + EXPECT_EQ(transform, AZ::Transform::CreateRotationZ(AZ::Constants::QuarterPi)); + } + + TEST_F(AxisAlignedBoxShapeTest, BoxWithZRotationHasCorrectRayIntersection) + { + AZ::Entity entity; + CreateAxisAlignedBox( + AZ::Transform::CreateRotationZ(AZ::Constants::QuarterPi), + AZ::Vector3(1.0f), entity); + + bool rayHit = false; + float distance; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(5.0f, 0.0f, 0.0f), + AZ::Vector3(-1.0f, 0.0f, 0.0f), distance); + + // This test creates a unit box centered on (0, 0, 0) and rotated by 45 degrees. The distance to the box should + // be 4.5 if it isn't rotated but less if there is any rotation. + EXPECT_TRUE(rayHit); + EXPECT_NEAR(distance, 4.5f, 1e-2f); + } + + TEST_F(AxisAlignedBoxShapeTest, BoxWithTranslationAndRotationsHasCorrectRayIntersection) + { + AZ::Entity entity; + CreateAxisAlignedBox( + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisX(), AZ::Constants::HalfPi) * + AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisZ(), AZ::Constants::QuarterPi), + AZ::Vector3(-10.0f, -10.0f, -10.0f)), + AZ::Vector3(4.0f, 4.0f, 2.0f), entity); + + bool rayHit = false; + float distance; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(-10.0f, -10.0f, 0.0f), + AZ::Vector3(0.0f, 0.0f, -1.0f), distance); + + // This test creates a box of dimensions (4.0, 4.0, 2.0) centered on (-10, -10, 0) and rotated in X and Z. The distance to the box should + // be 9.0 if it isn't rotated but less if there is any rotation. + EXPECT_TRUE(rayHit); + EXPECT_NEAR(distance, 9.00f, 1e-2f); + } + + TEST_F(AxisAlignedBoxShapeTest, BoxWithTranslationHasCorrectRayIntersection) + { + AZ::Entity entity; + CreateAxisAlignedBox( + AZ::Transform::CreateTranslation(AZ::Vector3(100.0f, 100.0f, 0.0f)), + AZ::Vector3(5.0f, 5.0f, 5.0f), entity); + + bool rayHit = false; + float distance; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(100.0f, 100.0f, -100.0f), + AZ::Vector3(0.0f, 0.0f, 1.0f), distance); + + // This test creates a box of dimensions (5.0, 5.0, 5.0) centered on (100, 100, 0) and not rotated. The distance to the box + // should be 97.5. + EXPECT_TRUE(rayHit); + EXPECT_NEAR(distance, 97.5f, 1e-2f); + } + + TEST_F(AxisAlignedBoxShapeTest, BoxWithTranslationRotationAndScaleHasCorrectRayIntersection) + { + AZ::Entity entity; + CreateAxisAlignedBox( + AZ::Transform( + AZ::Vector3(0.0f, 0.0f, 5.0f), AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisY(), AZ::Constants::QuarterPi), 3.0f), + AZ::Vector3(2.0f, 4.0f, 1.0f), entity); + + bool rayHit = false; + float distance; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(1.0f, -10.0f, 4.0f), + AZ::Vector3(0.0f, 1.0f, 0.0f), distance); + + // This test creates a box of dimensions (2.0, 4.0, 1.0) centered on (0, 0, 5) and rotated about the Y axis by 45 degrees. + // The distance to the box should be 4.0 if not rotated but scaled and less if it is. + EXPECT_TRUE(rayHit); + EXPECT_NEAR(distance, 4.0f, 1e-2f); + } + + TEST_F(AxisAlignedBoxShapeTest, RayIntersectWithBoxRotatedNonUniformScale) + { + AZ::Entity entity; + CreateAxisAlignedBoxWithNonUniformScale( + AZ::Transform( + AZ::Vector3(2.0f, -5.0f, 3.0f), AZ::Quaternion::CreateFromAxisAngle(AZ::Vector3::CreateAxisY(), AZ::Constants::QuarterPi), + 0.5f), + AZ::Vector3(2.2f, 1.8f, 0.4f), AZ::Vector3(0.2f, 2.6f, 1.2f), entity); + + // This test creates a box of dimensions (2.2, 1.8, 0.4) centered on (2.0, -5, 3) and rotated about the Y axis by 45 degrees. + // The box is tested for axis-alignment by firing various rays and ensuring they either hit or miss the box. Any failure here + // would show the box has been rotated. + + // Ray should just miss the box + bool rayHit = false; + float distance = AZ::Constants::FloatMax; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(1.8f, -6.2f, 3.0f), + AZ::Vector3(1.0f, 0.0f, 0.0f), distance); + EXPECT_FALSE(rayHit); + + // Ray should just hit the box + rayHit = false; + distance = AZ::Constants::FloatMax; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(1.8f, -6.1f, 3.0f), + AZ::Vector3(1.0f, 0.0f, 0.0f), distance); + EXPECT_TRUE(rayHit); + EXPECT_NEAR(distance, 0.09f, 1e-3f); + + // Ray should just miss the box + rayHit = false; + distance = AZ::Constants::FloatMax; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(2.2f, -6.2f, 3.0f), + AZ::Vector3(0.0f, 1.0f, 0.0f), distance); + EXPECT_FALSE(rayHit); + + // Ray should just hit the box + rayHit = false; + distance = AZ::Constants::FloatMax; + LmbrCentral::ShapeComponentRequestsBus::EventResult( + rayHit, entity.GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, AZ::Vector3(2.1f, -6.2f, 3.0f), + AZ::Vector3(0.0f, 1.0f, 0.0f), distance); + EXPECT_TRUE(rayHit); + EXPECT_NEAR(distance, 0.03f, 1e-3f); + } +} // namespace UnitTest diff --git a/Gems/LmbrCentral/Code/Tests/DiskShapeTest.cpp b/Gems/LmbrCentral/Code/Tests/DiskShapeTest.cpp index e9c19585cc..65693a2a2e 100644 --- a/Gems/LmbrCentral/Code/Tests/DiskShapeTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/DiskShapeTest.cpp @@ -34,10 +34,10 @@ namespace 0.5f, 1.0f, 2.0f, 4.0f, 8.0f, }; - const uint32_t RayCount = 5; + const uint32_t RayCountDisk = 5; // Various normalized offset directions from center of disk along disk's surface. - const AZStd::array OffsetsFromCenter = + const AZStd::array OffsetsFromCenterDisk = { AZ::Vector3(0.18f, -0.50f, 0.0f).GetNormalized(), AZ::Vector3(-0.08f, 0.59f, 0.0f).GetNormalized(), @@ -47,7 +47,7 @@ namespace }; // Various directions away from a point on the disk's surface - const AZStd::array OffsetsFromSurface = + const AZStd::array OffsetsFromSurfaceDisk = { AZ::Vector3(0.69f, 0.38f, 0.09f).GetNormalized(), AZ::Vector3(-0.98f, -0.68f, -0.28f).GetNormalized(), @@ -57,7 +57,7 @@ namespace }; // Various distance away from the surface for the rays - const AZStd::array RayDistances = + const AZStd::array RayDistancesDisk = { 0.5f, 1.0f, 2.0f, 4.0f, 8.0f }; @@ -185,7 +185,7 @@ namespace UnitTest } // Offsets from center scaled down from the disk edge so that all the rays should hit - const AZStd::array offsetFromCenterScale = + const AZStd::array offsetFromCenterScale = { 0.8f, 0.2f, @@ -197,20 +197,20 @@ namespace UnitTest // Construct rays and test against the different disks for (uint32_t diskIndex = 0; diskIndex < DiskCount; ++diskIndex) { - for (uint32_t rayIndex = 0; rayIndex < RayCount; ++rayIndex) + for (uint32_t rayIndex = 0; rayIndex < RayCountDisk; ++rayIndex) { - AZ::Vector3 scaledOffsetFromCenter = OffsetsFromCenter[rayIndex] * DiskRadii[diskIndex] * offsetFromCenterScale[rayIndex]; + AZ::Vector3 scaledOffsetFromCenter = OffsetsFromCenterDisk[rayIndex] * DiskRadii[diskIndex] * offsetFromCenterScale[rayIndex]; AZ::Vector3 positionOnDiskSurface = DiskTransforms[diskIndex].TransformPoint(scaledOffsetFromCenter); - AZ::Vector3 rayOrigin = positionOnDiskSurface + OffsetsFromSurface[rayIndex] * RayDistances[rayIndex]; + AZ::Vector3 rayOrigin = positionOnDiskSurface + OffsetsFromSurfaceDisk[rayIndex] * RayDistancesDisk[rayIndex]; bool rayHit2 = false; float distance2; LmbrCentral::ShapeComponentRequestsBus::EventResult( rayHit2, diskEntities[diskIndex].GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, - rayOrigin, -OffsetsFromSurface[rayIndex], distance2); + rayOrigin, -OffsetsFromSurfaceDisk[rayIndex], distance2); EXPECT_TRUE(rayHit2); - EXPECT_NEAR(distance2, RayDistances[rayIndex], 1e-4f); + EXPECT_NEAR(distance2, RayDistancesDisk[rayIndex], 1e-4f); } } @@ -241,7 +241,7 @@ namespace UnitTest } // Offsets from center scaled up from the disk edge so that all the rays should miss - const AZStd::array offsetFromCenterScale = + const AZStd::array offsetFromCenterScale = { 1.8f, 1.2f, @@ -253,17 +253,17 @@ namespace UnitTest // Construct rays and test against the different disks for (uint32_t diskIndex = 0; diskIndex < DiskCount; ++diskIndex) { - for (uint32_t rayIndex = 0; rayIndex < RayCount; ++rayIndex) + for (uint32_t rayIndex = 0; rayIndex < RayCountDisk; ++rayIndex) { - AZ::Vector3 scaledOffsetFromCenter = OffsetsFromCenter[rayIndex] * DiskRadii[diskIndex] * offsetFromCenterScale[rayIndex]; + AZ::Vector3 scaledOffsetFromCenter = OffsetsFromCenterDisk[rayIndex] * DiskRadii[diskIndex] * offsetFromCenterScale[rayIndex]; AZ::Vector3 positionOnDiskSurface = DiskTransforms[diskIndex].TransformPoint(scaledOffsetFromCenter); - AZ::Vector3 rayOrigin = positionOnDiskSurface + OffsetsFromSurface[rayIndex] * RayDistances[rayIndex]; + AZ::Vector3 rayOrigin = positionOnDiskSurface + OffsetsFromSurfaceDisk[rayIndex] * RayDistancesDisk[rayIndex]; bool rayHit2 = false; float distance2; LmbrCentral::ShapeComponentRequestsBus::EventResult( rayHit2, diskEntities[diskIndex].GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, - rayOrigin, -OffsetsFromSurface[rayIndex], distance2); + rayOrigin, -OffsetsFromSurfaceDisk[rayIndex], distance2); EXPECT_FALSE(rayHit2); } diff --git a/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp b/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp index a28916bb24..c02cf18aca 100644 --- a/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/QuadShapeTest.cpp @@ -41,10 +41,10 @@ namespace LmbrCentral::QuadShapeConfig(1.0f, 0.5f), }; - const uint32_t RayCount = 5; + const uint32_t RayCountQuad = 5; // Various normalized offset directions from center of quad along quad's surface. - const AZStd::array OffsetsFromCenter = + const AZStd::array OffsetsFromCenterQuad = { AZ::Vector3( 0.18f, -0.50f, 0.0f).GetNormalized(), AZ::Vector3(-0.08f, 0.59f, 0.0f).GetNormalized(), @@ -54,7 +54,7 @@ namespace }; // Various directions away from a point on the quad's surface - const AZStd::array OffsetsFromSurface = + const AZStd::array OffsetsFromSurfaceQuad = { AZ::Vector3( 0.69f, 0.38f, 0.09f).GetNormalized(), AZ::Vector3(-0.98f, -0.68f, -0.28f).GetNormalized(), @@ -64,7 +64,7 @@ namespace }; // Various distance away from the surface for the rays - const AZStd::array RayDistances = + const AZStd::array RayDistancesQuad = { 0.5f, 1.0f, 2.0f, 4.0f, 8.0f }; @@ -248,23 +248,23 @@ namespace UnitTest // Construct rays and test against the different quads for (uint32_t quadIndex = 0; quadIndex < QuadCount; ++quadIndex) { - for (uint32_t rayIndex = 0; rayIndex < RayCount; ++rayIndex) + for (uint32_t rayIndex = 0; rayIndex < RayCountQuad; ++rayIndex) { - // OffsetsFromCenter are all less than 1, so scale by the dimensions of the quad. + // OffsetsFromCenterQuad are all less than 1, so scale by the dimensions of the quad. AZ::Vector3 scaledWidthHeight = AZ::Vector3(QuadDims[quadIndex].m_width, QuadDims[quadIndex].m_height, 0.0f); // Scale the offset and multiply by 0.5 because distance from center is half the width/height - AZ::Vector3 scaledOffsetFromCenter = OffsetsFromCenter[rayIndex] * scaledWidthHeight * 0.5f; + AZ::Vector3 scaledOffsetFromCenter = OffsetsFromCenterQuad[rayIndex] * scaledWidthHeight * 0.5f; AZ::Vector3 positionOnQuadSurface = QuadTransforms[quadIndex].TransformPoint(scaledOffsetFromCenter); - AZ::Vector3 rayOrigin = positionOnQuadSurface + OffsetsFromSurface[rayIndex] * RayDistances[rayIndex]; + AZ::Vector3 rayOrigin = positionOnQuadSurface + OffsetsFromSurfaceQuad[rayIndex] * RayDistancesQuad[rayIndex]; bool rayHit2 = false; float distance2; LmbrCentral::ShapeComponentRequestsBus::EventResult( rayHit2, quadEntities[quadIndex].GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, - rayOrigin, -OffsetsFromSurface[rayIndex], distance2); + rayOrigin, -OffsetsFromSurfaceQuad[rayIndex], distance2); EXPECT_TRUE(rayHit2); - EXPECT_NEAR(distance2, RayDistances[rayIndex], 1e-4f); + EXPECT_NEAR(distance2, RayDistancesQuad[rayIndex], 1e-4f); } } @@ -297,20 +297,20 @@ namespace UnitTest // Construct rays and test against the different quads for (uint32_t quadIndex = 0; quadIndex < QuadCount; ++quadIndex) { - for (uint32_t rayIndex = 0; rayIndex < RayCount; ++rayIndex) + for (uint32_t rayIndex = 0; rayIndex < RayCountQuad; ++rayIndex) { - // OffsetsFromCenter are all less than 1, so scale by the dimensions of the quad. + // OffsetsFromCenterQuad are all less than 1, so scale by the dimensions of the quad. AZ::Vector3 scaledWidthHeight = AZ::Vector3(QuadDims[quadIndex].m_width, QuadDims[quadIndex].m_height, 0.0f); - // Scale the offset and add 1.0 to OffsetsFromCenter to ensure the point is outside the quad. - AZ::Vector3 scaledOffsetFromCenter = (AZ::Vector3::CreateOne() + OffsetsFromCenter[rayIndex]) * scaledWidthHeight; + // Scale the offset and add 1.0 to OffsetsFromCenterQuad to ensure the point is outside the quad. + AZ::Vector3 scaledOffsetFromCenter = (AZ::Vector3::CreateOne() + OffsetsFromCenterQuad[rayIndex]) * scaledWidthHeight; AZ::Vector3 positionOnQuadSurface = QuadTransforms[quadIndex].TransformPoint(scaledOffsetFromCenter); - AZ::Vector3 rayOrigin = positionOnQuadSurface + OffsetsFromSurface[rayIndex] * RayDistances[rayIndex]; + AZ::Vector3 rayOrigin = positionOnQuadSurface + OffsetsFromSurfaceQuad[rayIndex] * RayDistancesQuad[rayIndex]; bool rayHit2 = false; float distance2; LmbrCentral::ShapeComponentRequestsBus::EventResult( rayHit2, quadEntities[quadIndex].GetId(), &LmbrCentral::ShapeComponentRequests::IntersectRay, - rayOrigin, -OffsetsFromSurface[rayIndex], distance2); + rayOrigin, -OffsetsFromSurfaceQuad[rayIndex], distance2); EXPECT_FALSE(rayHit2); } diff --git a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h index a84b0e2a4f..488e8b5617 100644 --- a/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h +++ b/Gems/LmbrCentral/Code/include/LmbrCentral/Shape/BoxShapeComponentBus.h @@ -21,13 +21,16 @@ namespace LmbrCentral /// Type ID for the EditorBoxShapeComponent static const AZ::Uuid EditorBoxShapeComponentTypeId = "{2ADD9043-48E8-4263-859A-72E0024372BF}"; + /// Type ID for the BoxShapeConfig + static const AZ::Uuid BoxShapeConfigTypeId = "{F034FBA2-AC2F-4E66-8152-14DFB90D6283}"; + /// Configuration data for BoxShapeComponent class BoxShapeConfig : public ShapeComponentConfig { public: AZ_CLASS_ALLOCATOR(BoxShapeConfig, AZ::SystemAllocator, 0) - AZ_RTTI(BoxShapeConfig, "{F034FBA2-AC2F-4E66-8152-14DFB90D6283}", ShapeComponentConfig) + AZ_RTTI(BoxShapeConfig, BoxShapeConfigTypeId, ShapeComponentConfig) static void Reflect(AZ::ReflectContext* context); diff --git a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake index f96fd7a3b2..5c77888922 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_editor_files.cmake @@ -50,6 +50,8 @@ set(FILES Source/Shape/EditorDiskShapeComponent.cpp Source/Shape/EditorBoxShapeComponent.h Source/Shape/EditorBoxShapeComponent.cpp + Source/Shape/EditorAxisAlignedBoxShapeComponent.h + Source/Shape/EditorAxisAlignedBoxShapeComponent.cpp Source/Shape/EditorCylinderShapeComponent.h Source/Shape/EditorCylinderShapeComponent.cpp Source/Shape/EditorCapsuleShapeComponent.h diff --git a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake index d663d2ec06..18412e2a38 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_files.cmake @@ -106,6 +106,10 @@ set(FILES Source/Shape/SphereShape.cpp Source/Shape/SphereShapeComponent.h Source/Shape/SphereShapeComponent.cpp + Source/Shape/AxisAlignedBoxShape.h + Source/Shape/AxisAlignedBoxShape.cpp + Source/Shape/AxisAlignedBoxShapeComponent.h + Source/Shape/AxisAlignedBoxShapeComponent.cpp Source/Shape/BoxShape.h Source/Shape/BoxShape.cpp Source/Shape/BoxShapeComponent.h diff --git a/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake index 5c4da3db73..c0f1ffd9ec 100644 --- a/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake +++ b/Gems/LmbrCentral/Code/lmbrcentral_tests_files.cmake @@ -8,6 +8,7 @@ set(FILES Tests/AudioComponentTests.cpp + Tests/AxisAlignedBoxShapeTest.cpp Tests/BoxShapeTest.cpp Tests/BundlingSystemComponentTests.cpp Tests/SphereShapeTest.cpp From cc7cc9b7a88d6516fe0a6a4d8833f4b77ce3c351 Mon Sep 17 00:00:00 2001 From: sphrose <82213493+sphrose@users.noreply.github.com> Date: Wed, 8 Sep 2021 16:55:22 +0100 Subject: [PATCH 193/355] Terrain/sphrose/layer spawner (#3980) * #3326 Get layer priorities to work. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Refresh terrain when layer settings change Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Removed dependency notification handling: it isn't needed due to deactivate/activate cycle caused by editor redrawing. Moved layer registering to ordered map sorted by priority. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Remove unused code, add extra sort condition. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Fix copy/paste error. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Change erase method. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Review suggestions. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Fix bus disconnect order, change GetUseGroundPlane to return bool. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Create unit tests for Terrain Spawning component #3224 Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Remove unintended commit. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Remove blank line. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * PR changes. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> --- .../TerrainLayerSpawnerComponent.cpp | 19 +- .../Components/TerrainLayerSpawnerComponent.h | 6 +- .../Source/TerrainSystem/TerrainSystem.cpp | 113 ++++++--- .../Code/Source/TerrainSystem/TerrainSystem.h | 7 +- .../Source/TerrainSystem/TerrainSystemBus.h | 21 ++ Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp | 222 ++++++++++++++++++ Gems/Terrain/Code/Tests/TerrainMocks.h | 104 ++++++++ Gems/Terrain/Code/terrain_tests_files.cmake | 2 + 8 files changed, 451 insertions(+), 43 deletions(-) create mode 100644 Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp create mode 100644 Gems/Terrain/Code/Tests/TerrainMocks.h diff --git a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp index 06372a3490..1c296b2e2c 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp @@ -105,17 +105,19 @@ namespace Terrain AZ::TransformNotificationBus::Handler::BusConnect(GetEntityId()); LmbrCentral::ShapeComponentNotificationsBus::Handler::BusConnect(GetEntityId()); TerrainAreaRequestBus::Handler::BusConnect(GetEntityId()); + TerrainSpawnerRequestBus::Handler::BusConnect(GetEntityId()); TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::RegisterArea, GetEntityId()); } void TerrainLayerSpawnerComponent::Deactivate() { - TerrainAreaRequestBus::Handler::BusDisconnect(); TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::UnregisterArea, GetEntityId()); - - AZ::TransformNotificationBus::Handler::BusDisconnect(); + TerrainSpawnerRequestBus::Handler::BusDisconnect(); + TerrainAreaRequestBus::Handler::BusDisconnect(); LmbrCentral::ShapeComponentNotificationsBus::Handler::BusDisconnect(); + AZ::TransformNotificationBus::Handler::BusDisconnect(); + } bool TerrainLayerSpawnerComponent::ReadInConfig(const AZ::ComponentConfig* baseConfig) @@ -147,6 +149,17 @@ namespace Terrain { RefreshArea(); } + + void TerrainLayerSpawnerComponent::GetPriority(AZ::u32& outLayer, AZ::u32& outPriority) + { + outLayer = m_configuration.m_layer; + outPriority = m_configuration.m_priority; + } + + bool TerrainLayerSpawnerComponent::GetUseGroundPlane() + { + return m_configuration.m_useGroundPlane; + } void TerrainLayerSpawnerComponent::RegisterArea() { diff --git a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h index 1f1ae90227..3f8e72e1b8 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h @@ -59,6 +59,7 @@ namespace Terrain , private AZ::TransformNotificationBus::Handler , private LmbrCentral::ShapeComponentNotificationsBus::Handler , private Terrain::TerrainAreaRequestBus::Handler + , private Terrain::TerrainSpawnerRequestBus::Handler { public: template @@ -80,7 +81,6 @@ namespace Terrain bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override; bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override; - ////////////////////////////////////////////////////////////////////////// // AZ::TransformNotificationBus::Handler void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; @@ -88,6 +88,10 @@ namespace Terrain // ShapeComponentNotificationsBus void OnShapeChanged(ShapeChangeReasons changeReason) override; + // TerrainSpawnerRequestBus + void GetPriority(AZ::u32& outLayer, AZ::u32& outPriority) override; + bool GetUseGroundPlane() override; + void RegisterArea() override; void RefreshArea() override; diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp index 90b74f08ba..a271d624f5 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp @@ -17,6 +17,33 @@ using namespace Terrain; +bool TerrainLayerPriorityComparator::operator()(const AZ::EntityId& layer1id, const AZ::EntityId& layer2id) const +{ + // Comparator for insertion/keylookup. + // Sorts into layer/priority order, highest priority first. + AZ::u32 priority1, layer1; + Terrain::TerrainSpawnerRequestBus::Event(layer1id, &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer1, priority1); + + AZ::u32 priority2, layer2; + Terrain::TerrainSpawnerRequestBus::Event(layer2id, &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer2, priority2); + + if (layer1 < layer2) + { + return false; + } + else if (layer1 > layer2) + { + return true; + } + + if (priority1 != priority2) + { + return priority1 > priority2; + } + + return layer1id > layer2id; +} + TerrainSystem::TerrainSystem() { Terrain::TerrainSystemServiceRequestBus::Handler::BusConnect(); @@ -78,17 +105,14 @@ float TerrainSystem::GetHeightSynchronous(float x, float y) const AZStd::shared_lock lock(m_areaMutex); - if (!m_registeredAreas.empty()) + for (auto& [areaId, areaBounds] : m_registeredAreas) { - for (auto& [areaId, areaBounds] : m_registeredAreas) + inPosition.SetZ(areaBounds.GetMin().GetZ()); + if (areaBounds.Contains(inPosition)) { - inPosition.SetZ(areaBounds.GetMin().GetZ()); - if (areaBounds.Contains(inPosition)) - { - Terrain::TerrainAreaHeightRequestBus::Event( - areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, - Terrain::TerrainAreaHeightRequestBus::Events::Sampler::DEFAULT); - } + Terrain::TerrainAreaHeightRequestBus::Event( + areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, + Terrain::TerrainAreaHeightRequestBus::Events::Sampler::DEFAULT); } } @@ -305,26 +329,34 @@ void TerrainSystem::SystemDeactivate() void TerrainSystem::RegisterArea(AZ::EntityId areaId) { - { - AZStd::unique_lock lock(m_areaMutex); - AZ::Aabb aabb = AZ::Aabb::CreateNull(); - LmbrCentral::ShapeComponentRequestsBus::EventResult(aabb, areaId, &LmbrCentral::ShapeComponentRequestsBus::Events::GetEncompassingAabb); - m_registeredAreas[areaId] = aabb; - } - - RefreshArea(areaId); + AZStd::unique_lock lock(m_areaMutex); + AZ::Aabb aabb = AZ::Aabb::CreateNull(); + LmbrCentral::ShapeComponentRequestsBus::EventResult(aabb, areaId, &LmbrCentral::ShapeComponentRequestsBus::Events::GetEncompassingAabb); + m_registeredAreas[areaId] = aabb; + m_dirtyRegion.AddAabb(aabb); + m_terrainHeightDirty = true; } void TerrainSystem::UnregisterArea(AZ::EntityId areaId) { - { - AZStd::unique_lock lock(m_areaMutex); - AZ::Aabb aabb = AZ::Aabb::CreateNull(); - LmbrCentral::ShapeComponentRequestsBus::EventResult(aabb, areaId, &LmbrCentral::ShapeComponentRequestsBus::Events::GetEncompassingAabb); - m_registeredAreas.erase(areaId); - } + AZStd::unique_lock lock(m_areaMutex); - RefreshArea(areaId); + // Remove the data for this entity from the registered areas. + // Erase_if is used as erase would use the comparator to lookup the entity id in the map. + // As the comparator will get the new layer/priority data for the entity, the id lookup will fail. + AZStd::erase_if( + m_registeredAreas, + [areaId, this](const auto& item) + { + auto const& [entityId, aabb] = item; + if (areaId == entityId) + { + m_dirtyRegion.AddAabb(aabb); + m_terrainHeightDirty = true; + return true; + } + return false; + }); } void TerrainSystem::RefreshArea(AZ::EntityId areaId) @@ -336,7 +368,6 @@ void TerrainSystem::RefreshArea(AZ::EntityId areaId) AZ::Aabb oldAabb = (areaAabb != m_registeredAreas.end()) ? areaAabb->second : AZ::Aabb::CreateNull(); AZ::Aabb newAabb = AZ::Aabb::CreateNull(); LmbrCentral::ShapeComponentRequestsBus::EventResult(newAabb, areaId, &LmbrCentral::ShapeComponentRequestsBus::Events::GetEncompassingAabb); - m_registeredAreas[areaId] = newAabb; AZ::Aabb expandedAabb = oldAabb; @@ -400,31 +431,37 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) const uint32_t pixelDataSize = width * height * sizeof(float); memset(pixels.data(), 0, pixelDataSize); - for (auto& [areaId, areaBounds] : m_registeredAreas) + for (uint32_t y = 0; y < height; y++) { - for (uint32_t y = 0; y < height; y++) + for (uint32_t x = 0; x < width; x++) { - for (uint32_t x = 0; x < width; x++) + // Find the first terrain layer that covers this position. This will be the highest priority, so others can be ignored. + for (auto& [areaId, areaBounds] : m_registeredAreas) { AZ::Vector3 inPosition( (x * m_currentSettings.m_heightQueryResolution.GetX()) + m_currentSettings.m_worldBounds.GetMin().GetX(), (y * m_currentSettings.m_heightQueryResolution.GetY()) + m_currentSettings.m_worldBounds.GetMin().GetY(), areaBounds.GetMin().GetZ()); - if (areaBounds.Contains(inPosition)) + + if (!areaBounds.Contains(inPosition)) { - AZ::Vector3 outPosition; - const Terrain::TerrainAreaHeightRequests::Sampler sampleFilter = - Terrain::TerrainAreaHeightRequests::Sampler::DEFAULT; - - Terrain::TerrainAreaHeightRequestBus::Event( - areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, sampleFilter); - - pixels[(y * width) + x] = (outPosition.GetZ() - m_currentSettings.m_worldBounds.GetMin().GetZ()) / - m_currentSettings.m_worldBounds.GetExtents().GetZ(); + continue; } + + AZ::Vector3 outPosition; + const Terrain::TerrainAreaHeightRequests::Sampler sampleFilter = Terrain::TerrainAreaHeightRequests::Sampler::DEFAULT; + + Terrain::TerrainAreaHeightRequestBus::Event( + areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, sampleFilter); + + pixels[(y * width) + x] = (outPosition.GetZ() - m_currentSettings.m_worldBounds.GetMin().GetZ()) / + m_currentSettings.m_worldBounds.GetExtents().GetZ(); + + break; } } } + const AZ::RPI::Scene* scene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get(); auto terrainFeatureProcessor = scene->GetFeatureProcessor(); diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h index 2d2286a0c3..0239170640 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h @@ -25,6 +25,11 @@ namespace Terrain { + struct TerrainLayerPriorityComparator + { + bool operator()(const AZ::EntityId& layer1id, const AZ::EntityId& layer2id) const; + }; + class TerrainSystem : public AzFramework::Terrain::TerrainDataRequestBus::Handler , private Terrain::TerrainSystemServiceRequestBus::Handler @@ -112,6 +117,6 @@ namespace Terrain AZ::Aabb m_dirtyRegion; mutable AZStd::shared_mutex m_areaMutex; - AZStd::unordered_map m_registeredAreas; + AZStd::map m_registeredAreas; }; } // namespace Terrain diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h index e999cbf8be..cb41ba9957 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h @@ -112,5 +112,26 @@ namespace Terrain }; using TerrainAreaHeightRequestBus = AZ::EBus; + + /** + * A bus for the TerrainSystem to interrogate TerrainLayerSpawners. + */ + class TerrainSpawnerRequests + : public AZ::ComponentBus + { + public: + //////////////////////////////////////////////////////////////////////// + // EBusTraits + using MutexType = AZStd::recursive_mutex; + //////////////////////////////////////////////////////////////////////// + + virtual ~TerrainSpawnerRequests() = default; + + virtual void GetPriority(AZ::u32& outLayer, AZ::u32& outPriority) = 0; + virtual bool GetUseGroundPlane() = 0; + + }; + + using TerrainSpawnerRequestBus = AZ::EBus; } diff --git a/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp b/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp new file mode 100644 index 0000000000..91d6a26f75 --- /dev/null +++ b/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp @@ -0,0 +1,222 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +#include + +#include +#include +#include + +#include + +class LayerSpawnerComponentTest + : public ::testing::Test +{ +protected: + AZ::ComponentApplication m_app; + + AZStd::unique_ptr m_entity; + Terrain::TerrainLayerSpawnerComponent* m_layerSpawnerComponent; + UnitTest::MockBoxShapeComponent* m_shapeComponent; + AZStd::unique_ptr m_terrainSystem; + + void SetUp() override + { + AZ::ComponentApplication::Descriptor appDesc; + appDesc.m_memoryBlocksByteSize = 20 * 1024 * 1024; + appDesc.m_recordingMode = AZ::Debug::AllocationRecords::RECORD_NO_RECORDS; + appDesc.m_stackRecordLevels = 20; + + m_app.Create(appDesc); + } + + void TearDown() override + { + if (m_terrainSystem) + { + m_terrainSystem->Deactivate(); + } + m_app.Destroy(); + } + + void CreateEntity() + { + m_entity = AZStd::make_unique(); + m_entity->Init(); + + ASSERT_TRUE(m_entity); + } + + void AddLayerSpawnerAndShapeComponentToEntity() + { + AddLayerSpawnerAndShapeComponentToEntity(Terrain::TerrainLayerSpawnerConfig()); + } + + void AddLayerSpawnerAndShapeComponentToEntity(const Terrain::TerrainLayerSpawnerConfig& config) + { + m_layerSpawnerComponent = m_entity->CreateComponent(config); + m_app.RegisterComponentDescriptor(m_layerSpawnerComponent->CreateDescriptor()); + + m_shapeComponent = m_entity->CreateComponent(); + m_app.RegisterComponentDescriptor(m_shapeComponent->CreateDescriptor()); + + ASSERT_TRUE(m_layerSpawnerComponent); + ASSERT_TRUE(m_shapeComponent); + } + + void ResetEntity() + { + m_entity->Deactivate(); + m_entity->Reset(); + } + + void CreateMockTerrainSystem() + { + m_terrainSystem = AZStd::make_unique(); + m_terrainSystem->Activate(); + } +}; + +TEST_F(LayerSpawnerComponentTest, ActivatEntityActivateSuccess) +{ + CreateEntity(); + AddLayerSpawnerAndShapeComponentToEntity(); + + m_entity->Activate(); + EXPECT_EQ(m_entity->GetState(), AZ::Entity::State::Active); + + ResetEntity(); +} + +TEST_F(LayerSpawnerComponentTest, LayerSpawnerDefaultValuesCorrect) +{ + CreateEntity(); + AddLayerSpawnerAndShapeComponentToEntity(); + + m_entity->Activate(); + + AZ::u32 priority = 999, layer = 999; + Terrain::TerrainSpawnerRequestBus::Event(m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer, priority); + + EXPECT_EQ(0, priority); + EXPECT_EQ(1, layer); + + bool useGroundPlane = false; + + Terrain::TerrainSpawnerRequestBus::EventResult(useGroundPlane, m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetUseGroundPlane); + + EXPECT_TRUE(useGroundPlane); + + ResetEntity(); +} + +TEST_F(LayerSpawnerComponentTest, LayerSpawnerConfigValuesCorrect) +{ + CreateEntity(); + + constexpr static AZ::u32 testPriority = 15; + constexpr static AZ::u32 testLayer = 0; + + Terrain::TerrainLayerSpawnerConfig config; + config.m_layer = testLayer; + config.m_priority = testPriority; + config.m_useGroundPlane = false; + + AddLayerSpawnerAndShapeComponentToEntity(config); + + m_entity->Activate(); + + AZ::u32 priority = 999, layer = 999; + Terrain::TerrainSpawnerRequestBus::Event(m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetPriority, layer, priority); + + EXPECT_EQ(testPriority, priority); + EXPECT_EQ(testLayer, layer); + + bool useGroundPlane = true; + + Terrain::TerrainSpawnerRequestBus::EventResult( + useGroundPlane, m_entity->GetId(), &Terrain::TerrainSpawnerRequestBus::Events::GetUseGroundPlane); + + EXPECT_FALSE(useGroundPlane); + + ResetEntity(); +} + +TEST_F(LayerSpawnerComponentTest, LayerSpawnerRegisterAreaUpdatesTerrainSystem) +{ + CreateEntity(); + + CreateMockTerrainSystem(); + + AddLayerSpawnerAndShapeComponentToEntity(); + + m_entity->Activate(); + + // The Activate call should have registered the area. + EXPECT_EQ(1, m_terrainSystem->m_registerAreaCalledCount); + + ResetEntity(); +} + +TEST_F(LayerSpawnerComponentTest, LayerSpawnerUnregisterAreaUpdatesTerrainSystem) +{ + CreateEntity(); + + CreateMockTerrainSystem(); + + AddLayerSpawnerAndShapeComponentToEntity(); + + m_entity->Activate(); + + m_layerSpawnerComponent->Deactivate(); + + // The Deactivate call should have unregistered the area. + EXPECT_EQ(1, m_terrainSystem->m_unregisterAreaCalledCount); + + ResetEntity(); +} + +TEST_F(LayerSpawnerComponentTest, LayerSpawnerTransformChangedUpdatesTerrainSystem) +{ + CreateEntity(); + + CreateMockTerrainSystem(); + + AddLayerSpawnerAndShapeComponentToEntity(); + + m_entity->Activate(); + + AZ::TransformNotificationBus::Event( + m_entity->GetId(), &AZ::TransformNotificationBus::Events::OnTransformChanged, AZ::Transform(), AZ::Transform()); + + EXPECT_EQ(1, m_terrainSystem->m_refreshAreaCalledCount); + + ResetEntity(); +} + +TEST_F(LayerSpawnerComponentTest, LayerSpawnerShapeChangedUpdatesTerrainSystem) +{ + CreateEntity(); + + CreateMockTerrainSystem(); + + AddLayerSpawnerAndShapeComponentToEntity(); + + m_entity->Activate(); + + LmbrCentral::ShapeComponentNotificationsBus::Event( + m_entity->GetId(), &LmbrCentral::ShapeComponentNotificationsBus::Events::OnShapeChanged, + LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged); + + EXPECT_EQ(1, m_terrainSystem->m_refreshAreaCalledCount); + + ResetEntity(); +} diff --git a/Gems/Terrain/Code/Tests/TerrainMocks.h b/Gems/Terrain/Code/Tests/TerrainMocks.h new file mode 100644 index 0000000000..5f90cafd69 --- /dev/null +++ b/Gems/Terrain/Code/Tests/TerrainMocks.h @@ -0,0 +1,104 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include +#include + +namespace UnitTest +{ + static const AZ::Uuid BoxShapeComponentTypeId = "{5EDF4B9E-0D3D-40B8-8C91-5142BCFC30A6}"; + + class MockBoxShapeComponent + : public AZ::Component + { + public: + AZ_COMPONENT(MockBoxShapeComponent, BoxShapeComponentTypeId) + static void Reflect([[maybe_unused]] AZ::ReflectContext* context) + { + } + + void Activate() override + { + } + + void Deactivate() override + { + } + + bool ReadInConfig([[maybe_unused]] const AZ::ComponentConfig* baseConfig) override + { + return true; + } + + bool WriteOutConfig([[maybe_unused]] AZ::ComponentConfig* outBaseConfig) const override + { + return true; + } + + private: + static void GetProvidedServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); + provided.push_back(AZ_CRC("BoxShapeService", 0x946a0032)); + } + + static void GetIncompatibleServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& incompatible) + { + } + + static void GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required) + { + } + + static void GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent) + { + } + }; + + class MockTerrainSystem : private Terrain::TerrainSystemServiceRequestBus::Handler + { + public: + void Activate() override + { + Terrain::TerrainSystemServiceRequestBus::Handler::BusConnect(); + } + + void Deactivate() override + { + Terrain::TerrainSystemServiceRequestBus::Handler::BusDisconnect(); + } + + void SetWorldBounds(const AZ::Aabb& worldBounds) override + { + } + + void SetHeightQueryResolution([[maybe_unused]] AZ::Vector2 queryResolution) override + { + } + + void RegisterArea([[maybe_unused]] AZ::EntityId areaId) override + { + m_registerAreaCalledCount++; + } + + void UnregisterArea([[maybe_unused]] AZ::EntityId areaId) override + { + m_unregisterAreaCalledCount++; + } + + void RefreshArea([[maybe_unused]] AZ::EntityId areaId) override + { + m_refreshAreaCalledCount++; + } + + int m_registerAreaCalledCount = 0; + int m_refreshAreaCalledCount = 0; + int m_unregisterAreaCalledCount = 0; + }; +} diff --git a/Gems/Terrain/Code/terrain_tests_files.cmake b/Gems/Terrain/Code/terrain_tests_files.cmake index beed6bd83d..b44f143f3b 100644 --- a/Gems/Terrain/Code/terrain_tests_files.cmake +++ b/Gems/Terrain/Code/terrain_tests_files.cmake @@ -7,5 +7,7 @@ # set(FILES + Tests/TerrainMocks.h Tests/TerrainTest.cpp + Tests/LayerSpawnerTests.cpp ) From f2e6c2dc2b4eb90fedb354822c26ea6b5c0a92b6 Mon Sep 17 00:00:00 2001 From: amzn-phist <52085794+amzn-phist@users.noreply.github.com> Date: Wed, 8 Sep 2021 13:26:50 -0500 Subject: [PATCH 194/355] Fix compile errors in the Wwise Gem (#3989) One fixes string literal format specifiers warnings that were disabled. One fixes a FileFunc utility that was removed. Signed-off-by: amzn-phist <52085794+amzn-phist@users.noreply.github.com> --- .../Code/Source/Engine/Config_wwise.cpp | 6 +++--- .../Code/Source/Engine/FileIOHandler_wwise.cpp | 17 ++++++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Gems/AudioEngineWwise/Code/Source/Engine/Config_wwise.cpp b/Gems/AudioEngineWwise/Code/Source/Engine/Config_wwise.cpp index 9bd376b641..437c1d156a 100644 --- a/Gems/AudioEngineWwise/Code/Source/Engine/Config_wwise.cpp +++ b/Gems/AudioEngineWwise/Code/Source/Engine/Config_wwise.cpp @@ -11,8 +11,8 @@ #include #include #include +#include #include -#include // For AZ_Printf statements... #define WWISE_CONFIG_WINDOW "WwiseConfig" @@ -56,7 +56,7 @@ namespace Audio::Wwise bool ConfigurationSettings::Load(const AZStd::string& filePath) { AZ::IO::Path fileIoPath(filePath); - auto outcome = AzFramework::FileFunc::ReadJsonFile(fileIoPath); + auto outcome = AZ::JsonSerializationUtils::ReadJsonFile(fileIoPath.Native()); if (!outcome) { AZ_Printf(WWISE_CONFIG_WINDOW, "ERROR: %s\n", outcome.GetError().c_str()); @@ -92,7 +92,7 @@ namespace Audio::Wwise return false; } - auto outcome = AzFramework::FileFunc::WriteJsonFile(jsonDoc, filePath); + auto outcome = AZ::JsonSerializationUtils::WriteJsonFile(jsonDoc, filePath); if (!outcome) { AZ_Printf(WWISE_CONFIG_WINDOW, "ERROR: %s\n", outcome.GetError().c_str()); diff --git a/Gems/AudioEngineWwise/Code/Source/Engine/FileIOHandler_wwise.cpp b/Gems/AudioEngineWwise/Code/Source/Engine/FileIOHandler_wwise.cpp index 07113e09d3..cf042dc4ac 100644 --- a/Gems/AudioEngineWwise/Code/Source/Engine/FileIOHandler_wwise.cpp +++ b/Gems/AudioEngineWwise/Code/Source/Engine/FileIOHandler_wwise.cpp @@ -19,9 +19,7 @@ #include #include -#define MAX_NUMBER_STRING_SIZE (10) // 4G -#define ID_TO_STRING_FORMAT_BANK AKTEXT("%u.bnk") -#define ID_TO_STRING_FORMAT_WEM AKTEXT("%u.wem") +#define MAX_NUMBER_STRING_SIZE (10) // max digits in u32 base-10 number #define MAX_EXTENSION_SIZE (4) // .xxx #define MAX_FILETITLE_SIZE (MAX_NUMBER_STRING_SIZE + MAX_EXTENSION_SIZE + 1) // null-terminated @@ -442,11 +440,16 @@ namespace Audio } } - AkOSChar fileName[MAX_FILETITLE_SIZE] = { '\0' }; + AkOSChar fileName[MAX_FILETITLE_SIZE] = { 0 }; - const AkOSChar* const filenameFormat = (flags->uCodecID == AKCODECID_BANK ? ID_TO_STRING_FORMAT_BANK : ID_TO_STRING_FORMAT_WEM); - - AK_OSPRINTF(fileName, MAX_FILETITLE_SIZE, filenameFormat, static_cast(fileID)); + if (flags->uCodecID == AKCODECID_BANK) + { + AK_OSPRINTF(fileName, MAX_FILETITLE_SIZE, AKTEXT("%u.bnk"), static_cast(fileID)); + } + else + { + AK_OSPRINTF(fileName, MAX_FILETITLE_SIZE, AKTEXT("%u.wem"), static_cast(fileID)); + } AKPLATFORM::SafeStrCat(finalFilePath, fileName, AK_MAX_PATH); From 2a810c48457cd80984848b35e4bb3e10386eaca1 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Wed, 8 Sep 2021 11:36:04 -0700 Subject: [PATCH 195/355] fix backup file action in version explorer Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Tools/UpgradeTool/VersionExplorer.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp index 280bdbcf1d..eb182ed291 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp @@ -295,9 +295,9 @@ namespace ScriptCanvasEditor AZStd::string VersionExplorer::BackupGraph(const AZ::Data::Asset& asset) { - bool makeBackup = m_ui->makeBackupCheckbox->isChecked(); - if (!makeBackup) + if (!m_ui->makeBackupCheckbox->isChecked()) { + // considered a success return ""; } @@ -363,19 +363,20 @@ namespace ScriptCanvasEditor relativePath = relativePath.substr(1, relativePath.size() - 1); } - AZStd::string targetFilePath; - AzFramework::StringFunc::Path::Join(backupPath.c_str(), relativePath.c_str(), targetFilePath); + AzFramework::StringFunc::Path::Normalize(relativePath); + AzFramework::StringFunc::Path::Normalize(backupPath); - if (AZ::IO::FileIOBase::GetInstance()->Copy(sourceFilePath.c_str(), targetFilePath.c_str()) != AZ::IO::ResultCode::Error) - { - Log("VersionExplorer::BackupGraph: Backed up: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); - return ""; - } - else + AZStd::string targetFilePath = backupPath; + targetFilePath += relativePath; + + if (AZ::IO::FileIOBase::GetInstance()->Copy(sourceFilePath.c_str(), targetFilePath.c_str()) != AZ::IO::ResultCode::Success) { AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "VersionExplorer::BackupGraph: Error creating backup: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); return "Failed to copy source file to backup location"; } + + Log("VersionExplorer::BackupGraph: Backed up: %s ---> %s\n", sourceFilePath.c_str(), targetFilePath.c_str()); + return ""; } void VersionExplorer::UpgradeGraph(const AZ::Data::Asset& asset) From c7fbdb0ace923bbf274204480c55c2c9342e10e3 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Wed, 8 Sep 2021 11:49:33 -0700 Subject: [PATCH 196/355] Make level name appear in bold and update save all prefabs settings registry key Signed-off-by: srikappa-amzn --- .../AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp | 2 +- .../AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp index 3db78b1d39..09439724cd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabLoader.cpp @@ -26,7 +26,7 @@ namespace AzToolsFramework { namespace Prefab { - static constexpr const char s_saveAllPrefabsKey[] = "/O3DE/Preferences/SaveAllPrefabs"; + static constexpr const char s_saveAllPrefabsKey[] = "/O3DE/Preferences/Prefabs/SaveAllPrefabs"; void PrefabLoader::Reflect(AZ::ReflectContext* context) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index 6b67f94582..a1c3b936b2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1191,7 +1191,7 @@ namespace AzToolsFramework auto prefabTemplate = s_prefabSystemComponentInterface->FindTemplate(templateId); AZ::IO::Path prefabTemplatePath = prefabTemplate->get().GetFilePath(); QLabel* prefabSavedSuccessfullyLabel = new QLabel( - QString("Prefab %1 has been saved. Do you want to save the below dependent prefabs too?").arg(prefabTemplatePath.c_str()), + QString("Prefab '%1' has been saved. Do you want to save the below dependent prefabs too?").arg(prefabTemplatePath.c_str()), savePrefabDialog.get()); prefabSavedMessageLayout->addWidget(prefabSavedSuccessfullyIconContainer); prefabSavedMessageLayout->addWidget(prefabSavedSuccessfullyLabel); From 88319fcaf9a219412c2de04f8f74687b4e5cf53b Mon Sep 17 00:00:00 2001 From: Jackson <23512001+jackalbe@users.noreply.github.com> Date: Wed, 8 Sep 2021 13:52:19 -0500 Subject: [PATCH 197/355] {LYN6482} Fix warning as error in Editor Python Bindings Signed-off-by: Jackson <23512001+jackalbe@users.noreply.github.com> --- Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp index 561daa269e..38e8ad6b21 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp @@ -293,7 +293,7 @@ namespace EditorPythonBindings handler->m_ebus->m_name.c_str(), eventName); } - void OnEventGenericHook(const char* eventName, pybind11::function callback, [[maybe_unused]] int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) + void OnEventGenericHook([[maybe_unused]] const char* eventName, pybind11::function callback, [[maybe_unused]] int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) { // build the parameters to send to callback Convert::StackVariableAllocator stackVariableAllocator; From 8941c9d227a20f4dc14b7ac00bf936f177010fcf Mon Sep 17 00:00:00 2001 From: bosnichd Date: Wed, 8 Sep 2021 13:21:15 -0600 Subject: [PATCH 198/355] Add [[maybe_unused]] to some local variables that are only referenced as arguments to CryLogAlways that is not compiled in release. (#3992) Signed-off-by: bosnichd --- Code/Legacy/CrySystem/SystemCFG.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Legacy/CrySystem/SystemCFG.cpp b/Code/Legacy/CrySystem/SystemCFG.cpp index 52e377db7f..802e577386 100644 --- a/Code/Legacy/CrySystem/SystemCFG.cpp +++ b/Code/Legacy/CrySystem/SystemCFG.cpp @@ -178,7 +178,7 @@ void CSystem::LogVersion() strftime(s, 128, "%d %b %y (%H %M %S)", today); #endif - const SFileVersion& ver = GetFileVersion(); + [[maybe_unused]] const SFileVersion& ver = GetFileVersion(); CryLogAlways("BackupNameAttachment=\" Build(%d) %s\" -- used by backup system\n", ver.v[0], s); // read by CreateBackupFile() @@ -249,7 +249,7 @@ void CSystem::LogVersion() ////////////////////////////////////////////////////////////////////////// void CSystem::LogBuildInfo() { - auto projectName = AZ::Utils::GetProjectName(); + [[maybe_unused]] auto projectName = AZ::Utils::GetProjectName(); CryLogAlways("GameName: %s", projectName.c_str()); CryLogAlways("BuildTime: " __DATE__ " " __TIME__); } From 3ad3e557e5818c954899263f64be6ccb83f6f0a7 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Wed, 8 Sep 2021 14:37:19 -0500 Subject: [PATCH 199/355] Fixing gestures gem warnings when gEnv/pTimer is null Signed-off-by: Guthrie Adams --- .../Include/Gestures/GestureRecognizerClickOrTap.inl | 12 ++++++------ .../Code/Include/Gestures/GestureRecognizerDrag.inl | 8 ++++---- .../Code/Include/Gestures/GestureRecognizerHold.inl | 8 ++++---- .../Code/Include/Gestures/GestureRecognizerPinch.inl | 4 ++-- .../Include/Gestures/GestureRecognizerRotate.inl | 4 ++-- .../Code/Include/Gestures/GestureRecognizerSwipe.inl | 12 ++++++------ 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl index 77f6044642..b14ef18994 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerClickOrTap.inl @@ -73,12 +73,12 @@ inline Gestures::RecognizerClickOrTap::~RecognizerClickOrTap() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerClickOrTap::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); switch (m_currentState) { case State::Idle: @@ -120,7 +120,7 @@ inline bool Gestures::RecognizerClickOrTap::OnPressedEvent(const AZ::Vector2& sc //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerClickOrTap::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -129,7 +129,7 @@ inline bool Gestures::RecognizerClickOrTap::OnDownEvent(const AZ::Vector2& scree { case State::Pressed: { - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); if ((currentTime.GetDifferenceInSeconds(m_timeOfLastEvent) > m_config.maxSecondsHeld) || (screenPosition.GetDistance(m_positionOfLastEvent) > m_config.maxPixelsMoved)) { @@ -159,7 +159,7 @@ inline bool Gestures::RecognizerClickOrTap::OnDownEvent(const AZ::Vector2& scree //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerClickOrTap::OnReleasedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -168,7 +168,7 @@ inline bool Gestures::RecognizerClickOrTap::OnReleasedEvent(const AZ::Vector2& s { case State::Pressed: { - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); if ((currentTime.GetDifferenceInSeconds(m_timeOfLastEvent) > m_config.maxSecondsHeld) || (screenPosition.GetDistance(m_positionOfLastEvent) > m_config.maxPixelsMoved)) { diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl index c473293765..0c83893c9d 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerDrag.inl @@ -59,7 +59,7 @@ inline Gestures::RecognizerDrag::~RecognizerDrag() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerDrag::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -68,7 +68,7 @@ inline bool Gestures::RecognizerDrag::OnPressedEvent(const AZ::Vector2& screenPo { case State::Idle: { - m_startTime = gEnv->pTimer->GetFrameStartTime().GetValue(); + m_startTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime().GetValue() : 0; m_startPosition = screenPosition; m_currentPosition = screenPosition; m_currentState = State::Pressed; @@ -90,7 +90,7 @@ inline bool Gestures::RecognizerDrag::OnPressedEvent(const AZ::Vector2& screenPo //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerDrag::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -101,7 +101,7 @@ inline bool Gestures::RecognizerDrag::OnDownEvent(const AZ::Vector2& screenPosit { case State::Pressed: { - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); if ((currentTime.GetDifferenceInSeconds(m_startTime) >= m_config.minSecondsHeld) && (GetDistance() >= m_config.minPixelsMoved)) { diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl index 99a3f7042c..6af8a10890 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerHold.inl @@ -59,7 +59,7 @@ inline Gestures::RecognizerHold::~RecognizerHold() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerHold::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -68,7 +68,7 @@ inline bool Gestures::RecognizerHold::OnPressedEvent(const AZ::Vector2& screenPo { case State::Idle: { - m_startTime = gEnv->pTimer->GetFrameStartTime().GetValue(); + m_startTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime().GetValue() : 0; m_startPosition = screenPosition; m_currentPosition = screenPosition; m_currentState = State::Pressed; @@ -90,7 +90,7 @@ inline bool Gestures::RecognizerHold::OnPressedEvent(const AZ::Vector2& screenPo //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerHold::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -101,7 +101,7 @@ inline bool Gestures::RecognizerHold::OnDownEvent(const AZ::Vector2& screenPosit { case State::Pressed: { - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); if (screenPosition.GetDistance(m_startPosition) > m_config.maxPixelsMoved) { // Hold recognition failed. diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl index c64e310c36..642d781c35 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerPinch.inl @@ -106,13 +106,13 @@ inline float AngleInDegreesBetweenVectors(const AZ::Vector2& vec0, const AZ::Vec //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerPinch::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex > s_maxPinchPointerIndex) + if (pointerIndex > s_maxPinchPointerIndex) { return false; } m_currentPositions[pointerIndex] = screenPosition; - m_lastUpdateTimes[pointerIndex] = gEnv->pTimer->GetFrameStartTime().GetValue(); + m_lastUpdateTimes[pointerIndex] = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime().GetValue() : 0; if (m_lastUpdateTimes[0] != m_lastUpdateTimes[1]) { // We need to wait until both touches have been updated this frame. diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl index da6f84afca..2ae504e309 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerRotate.inl @@ -95,13 +95,13 @@ inline bool Gestures::RecognizerRotate::OnPressedEvent(const AZ::Vector2& screen //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerRotate::OnDownEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex > s_maxRotatePointerIndex) + if (pointerIndex > s_maxRotatePointerIndex) { return false; } m_currentPositions[pointerIndex] = screenPosition; - m_lastUpdateTimes[pointerIndex] = gEnv->pTimer->GetFrameStartTime().GetValue(); + m_lastUpdateTimes[pointerIndex] = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime().GetValue() : 0; if (m_lastUpdateTimes[0] != m_lastUpdateTimes[1]) { // We need to wait until both touches have been updated this frame. diff --git a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl index f84e85df52..5f879ce423 100644 --- a/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl +++ b/Gems/Gestures/Code/Include/Gestures/GestureRecognizerSwipe.inl @@ -59,7 +59,7 @@ inline Gestures::RecognizerSwipe::~RecognizerSwipe() //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerSwipe::OnPressedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -68,7 +68,7 @@ inline bool Gestures::RecognizerSwipe::OnPressedEvent(const AZ::Vector2& screenP { case State::Idle: { - m_startTime = gEnv->pTimer->GetFrameStartTime().GetValue(); + m_startTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime().GetValue() : 0; m_startPosition = screenPosition; m_endPosition = screenPosition; m_currentState = State::Pressed; @@ -89,7 +89,7 @@ inline bool Gestures::RecognizerSwipe::OnPressedEvent(const AZ::Vector2& screenP //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerSwipe::OnDownEvent([[maybe_unused]] const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -98,7 +98,7 @@ inline bool Gestures::RecognizerSwipe::OnDownEvent([[maybe_unused]] const AZ::Ve { case State::Pressed: { - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); if (currentTime.GetDifferenceInSeconds(m_startTime) > m_config.maxSecondsHeld) { // Swipe recognition failed because we took too long. @@ -125,7 +125,7 @@ inline bool Gestures::RecognizerSwipe::OnDownEvent([[maybe_unused]] const AZ::Ve //////////////////////////////////////////////////////////////////////////////////////////////////// inline bool Gestures::RecognizerSwipe::OnReleasedEvent(const AZ::Vector2& screenPosition, uint32_t pointerIndex) { - if (!gEnv || !gEnv->pTimer || pointerIndex != m_config.pointerIndex) + if (pointerIndex != m_config.pointerIndex) { return false; } @@ -134,7 +134,7 @@ inline bool Gestures::RecognizerSwipe::OnReleasedEvent(const AZ::Vector2& screen { case State::Pressed: { - const CTimeValue currentTime = gEnv->pTimer->GetFrameStartTime(); + const CTimeValue currentTime = (gEnv && gEnv->pTimer) ? gEnv->pTimer->GetFrameStartTime() : CTimeValue(); if ((currentTime.GetDifferenceInSeconds(m_startTime) <= m_config.maxSecondsHeld) && (screenPosition.GetDistance(m_startPosition) >= m_config.minPixelsMoved)) { From 81966cbcbf551c2b56f67a593887f26d9dd4684c Mon Sep 17 00:00:00 2001 From: Vincent Liu <5900509+onecent1101@users.noreply.github.com> Date: Wed, 8 Sep 2021 12:57:13 -0700 Subject: [PATCH 200/355] [LYN-5564] Update AWSNativeSDK revision (#3686) Signed-off-by: onecent1101 --- cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 2 +- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 1e0de4f2ed..7e22488caf 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -28,7 +28,7 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-linux TARGETS AWSGameLiftServerSDK PACKAGE_HASH a8149a95bd100384af6ade97e2b21a56173740d921e6c3da8188cd51554d39af) ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-linux TARGETS freetype PACKAGE_HASH 9ad246873067717962c6b780d28a5ce3cef3321b73c9aea746a039c798f52e93) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-linux TARGETS tiff PACKAGE_HASH ae92b4d3b189c42ef644abc5cac865d1fb2eb7cb5622ec17e35642b00d1a0a76) -ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev5-linux TARGETS AWSNativeSDK PACKAGE_HASH 0101a4052d9fce83a6f5515e00f366e97b308ecb8261ad23a6e4eb4365212ab6) +ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev6-linux TARGETS AWSNativeSDK PACKAGE_HASH 490291e4c8057975c3ab86feb971b8a38871c58bac5e5d86abdd1aeb7141eec4) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-linux TARGETS Lua PACKAGE_HASH 1adc812abe3dd0dbb2ca9756f81d8f0e0ba45779ac85bf1d8455b25c531a38b0) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-linux TARGETS PhysX PACKAGE_HASH a110249cbef4f266b0002c4ee9a71f59f373040cefbe6b82f1e1510c811edde6) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-linux TARGETS etc2comp PACKAGE_HASH 9283aa5db5bb7fb90a0ddb7a9f3895317c8ebe8044943124bbb3673a41407430) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 58c6849657..0a8d042ffe 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -30,7 +30,7 @@ ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-ma ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-mac TARGETS SPIRVCross PACKAGE_HASH 78c6376ed2fd195b9b1f5fb2b56e5267a32c3aa21fb399e905308de470eb4515) ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-mac-ios TARGETS freetype PACKAGE_HASH 67b4f57aed92082d3fd7c16aa244a7d908d90122c296b0a63f73e0a0b8761977) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) -ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev4-mac TARGETS AWSNativeSDK PACKAGE_HASH 89e1651cde6b4e6bd80cdb96ed6b624accad9f9688ff38bfca226777f4fcb678) +ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev5-mac TARGETS AWSNativeSDK PACKAGE_HASH ffb890bd9cf23afb429b9214ad9bac1bf04696f07a0ebb93c42058c482ab2f01) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev6-mac TARGETS Lua PACKAGE_HASH b9079fd35634774c9269028447562c6b712dbc83b9c64975c095fd423ff04c08) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-mac TARGETS PhysX PACKAGE_HASH 5e092a11d5c0a50c4dd99bb681a04b566a4f6f29aa08443d9bffc8dc12c27c8e) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-mac TARGETS etc2comp PACKAGE_HASH 1966ab101c89db7ecf30984917e0a48c0d02ee0e4d65b798743842b9469c0818) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 17792675d3..22f5db0e27 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -31,7 +31,7 @@ ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-wi ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-windows TARGETS SPIRVCross PACKAGE_HASH 7d601ea9d625b1d509d38bd132a1f433d7e895b16adab76bac6103567a7a6817) ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-windows TARGETS freetype PACKAGE_HASH 88dedc86ccb8c92f14c2c033e51ee7d828fa08eafd6475c6aa963938a99f4bf3) ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-windows TARGETS tiff PACKAGE_HASH ab60d1398e4e1e375ec0f1a00cdb1d812a07c0096d827db575ce52dd6d714207) -ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-windows TARGETS AWSNativeSDK PACKAGE_HASH 929873d4252c464620a9d288e41bd5d47c0bd22750aeb3a1caa68a3da8247c48) +ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev4-windows TARGETS AWSNativeSDK PACKAGE_HASH a900e80f7259e43aed5c847afee2599ada37f29db70505481397675bcbb6c76c) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-windows TARGETS Lua PACKAGE_HASH 136faccf1f73891e3fa3b95f908523187792e56f5b92c63c6a6d7e72d1158d40) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-windows TARGETS PhysX PACKAGE_HASH 0c5ffbd9fa588e5cf7643721a7cfe74d0fe448bf82252d39b3a96d06dfca2298) ly_associate_package(PACKAGE_NAME etc2comp-9cd0f9cae0-rev1-windows TARGETS etc2comp PACKAGE_HASH fc9ae937b2ec0d42d5e7d0e9e8c80e5e4d257673fb33bc9b7d6db76002117123) From 9f06bffc1b40ac79ccd19b7cfdedfb444fb1151a Mon Sep 17 00:00:00 2001 From: Alex Peterson <26804013+AMZN-alexpete@users.noreply.github.com> Date: Wed, 8 Sep 2021 13:19:03 -0700 Subject: [PATCH 201/355] Fix ebus node slots not checked for vars (#3994) Signed-off-by: AMZN-alexpete <26804013+AMZN-alexpete@users.noreply.github.com> --- .../ScriptCanvas/Libraries/Core/EBusEventHandler.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp index ef73bb967d..4e2d740656 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp @@ -78,6 +78,8 @@ namespace ScriptCanvas variableIds.insert(scopedVariableId->m_identifier); } } + + Node::CollectVariableReferences(variableIds); } bool EBusEventHandler::ContainsReferencesToVariables(const AZStd::unordered_set< ScriptCanvas::VariableId >& variableIds) const @@ -90,11 +92,14 @@ namespace ScriptCanvas if (scopedVariableId) { - return variableIds.find(scopedVariableId->m_identifier) != variableIds.end(); + if(variableIds.find(scopedVariableId->m_identifier) != variableIds.end()) + { + return true; + } } } - return false; + return Node::ContainsReferencesToVariables(variableIds); } size_t EBusEventHandler::GenerateFingerprint() const From 30cafff04dc9c2477e7c60bd28ba52d8ff92043c Mon Sep 17 00:00:00 2001 From: Nicholas Lawson <70027408+lawsonamzn@users.noreply.github.com> Date: Wed, 8 Sep 2021 13:37:37 -0700 Subject: [PATCH 202/355] new LZ4 package to fix debug compile issue (#3993) * Updates lz4 to rev3 of packages which fixes debug builds Signed-off-by: lawsonamzn <70027408+lawsonamzn@users.noreply.github.com> --- cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake | 3 ++- cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 4 +--- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 2 +- cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index fe03f2e7c9..f22de7e4c8 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -11,7 +11,6 @@ ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-android TARGETS lz4 PACKAGE_HASH da8ec7736640a3e9834f6db1c69e8a0ea61c054fe8b6324509f36928cfc21dc9) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) @@ -28,3 +27,5 @@ ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-android TARGETS Goo ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-android TARGETS libsamplerate PACKAGE_HASH bf13662afe65d02bcfa16258a4caa9b875534978227d6f9f36c9cfa92b3fb12b) ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-android TARGETS OpenSSL PACKAGE_HASH 4036d4019d722f0e1b7a1621bf60b5a17ca6a65c9c78fd8701cee1131eec8480) ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-android TARGETS zlib PACKAGE_HASH 85b730b97176772538cfcacd6b6aaf4655fc2d368d134d6dd55e02f28f183826) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-android TARGETS lz4 PACKAGE_HASH f5b22642d218dbbb442cae61e469e5b241c4740acd258c3e8678e60dec61ea93) + diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 7e22488caf..c9315336b9 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -15,7 +15,6 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-linux TARGETS lz4 PACKAGE_HASH 2e2653ce04a036c38fe28f3971bc3bfb8a4e771335aa8d1b95b0feb3423f1b0a) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) @@ -46,5 +45,4 @@ ly_associate_package(PACKAGE_NAME azslc-1.7.23-rev2-linux ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-linux TARGETS zlib PACKAGE_HASH 16f3b9e11cda525efb62144f354c1cfc30a5def9eff020dbe49cb00ee7d8234f) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-linux TARGETS squish-ccr PACKAGE_HASH 85fecafbddc6a41a27c5f59ed4a5dfb123a94cb4666782cf26e63c0a4724c530) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-linux TARGETS ISPCTexComp PACKAGE_HASH 065fd12abe4247dde247330313763cf816c3375c221da030bdec35024947f259) - - +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-linux TARGETS lz4 PACKAGE_HASH 5de3dbd3e2a3537c6555d759b3c5bb98e5456cf85c74ff6d046f809b7087290d) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 0a8d042ffe..4d62f6a7bf 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -15,7 +15,6 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-mac TARGETS lz4 PACKAGE_HASH 3ce6866b43d024452c0412f385ae46aba0e1ae99eb64f7099d3fc539c8460881) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) @@ -44,4 +43,5 @@ ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-mac ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-mac TARGETS zlib PACKAGE_HASH 21714e8a6de4f2523ee92a7f52d51fbee29c5f37ced334e00dc3c029115b472e) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-mac TARGETS squish-ccr PACKAGE_HASH 155bfbfa17c19a9cd2ef025de14c5db598f4290045d5b0d83ab58cb345089a77) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-mac TARGETS ISPCTexComp PACKAGE_HASH 8a4e93277b8face6ea2fd57c6d017bdb55643ed3d6387110bc5f6b3b884dd169) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-mac TARGETS lz4 PACKAGE_HASH 891ff630bf34f7ab1d8eaee2ea0a8f1fca89dbdc63fca41ee592703dd488a73b) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 22f5db0e27..64cbfa05dd 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -15,7 +15,6 @@ ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-windows TARGETS lz4 PACKAGE_HASH 02e6ba2ca1407483bac082fd97803c5e19f48bc576171bfc8cec62412efe639c) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME SQLite-3.32.2-rev3-multiplatform TARGETS SQLite PACKAGE_HASH dd4d3de6cbb4ce3d15fc504ba0ae0587e515dc89a25228037035fc0aef4831f4) @@ -51,3 +50,4 @@ ly_associate_package(PACKAGE_NAME Crashpad-0.8.0-rev1-windows ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-windows TARGETS zlib PACKAGE_HASH 9afab1d67641ed8bef2fb38fc53942da47f2ab339d9e77d3d20704a48af2da0b) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-windows TARGETS squish-ccr PACKAGE_HASH 5c3d9fa491e488ccaf802304ad23b932268a2b2846e383f088779962af2bfa84) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-windows TARGETS ISPCTexComp PACKAGE_HASH b6fa6ea28a2808a9a5524c72c37789c525925e435770f2d94eb2d387360fa2d0) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-windows TARGETS lz4 PACKAGE_HASH 4ea457b833cd8cfaf8e8e06ed6df601d3e6783b606bdbc44a677f77e19e0db16) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index f98f2009f2..69576bb665 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -11,7 +11,6 @@ ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) -ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev1-ios TARGETS lz4 PACKAGE_HASH 7a9391daf53e47e529cf811dca3554c83769f62a2ee52488610ec73214961ae1) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) @@ -29,3 +28,4 @@ ly_associate_package(PACKAGE_NAME googlebenchmark-1.5.0-rev2-ios TARGETS GoogleB ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-ios TARGETS libsamplerate PACKAGE_HASH 7656b961697f490d4f9c35d2e61559f6fc38c32102e542a33c212cd618fc2119) ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev1-ios TARGETS OpenSSL PACKAGE_HASH cd0dfce3086a7172777c63dadbaf0ac3695b676119ecb6d0614b5fb1da03462f) ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-ios TARGETS zlib PACKAGE_HASH a59fc0f83a02c616b679799310e9d86fde84514c6d2acefa12c6def0ae4a880c) +ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-ios TARGETS lz4 PACKAGE_HASH 588ea05739caa9231a9a17a1e8cf64c5b9a265e16528bc05420af7e2534e86c1) From d58bda5bbf2452b45afb82360cffac5cdf39e780 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 8 Sep 2021 13:43:30 -0700 Subject: [PATCH 203/355] WIP Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/AzCore/Asset/AssetCommon.h | 4 +-- Code/Framework/AzCore/AzCore/Debug/Trace.h | 24 ++++++------- .../AzCore/AzCore/Driller/Stream.cpp | 2 +- .../AzCore/AzCore/IO/IStreamerTypes.h | 2 -- Code/Framework/AzCore/AzCore/base.h | 36 +++++++++++++------ .../Prefab/PrefabSystemComponent.cpp | 9 ++--- Code/LauncherUnified/Launcher.cpp | 7 ++-- .../Include/Atom/RPI.Reflect/AssetCreator.h | 4 +-- .../Code/Source/PythonProxyBus.cpp | 5 +-- .../BenchmarkAssetBuilderWorker.cpp | 2 -- .../Execution/RuntimeComponent.cpp | 4 +-- 11 files changed, 50 insertions(+), 49 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h index 477677948f..0c8e5209ca 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h +++ b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.h @@ -990,7 +990,7 @@ namespace AZ template u8 Asset::GetFlags() const { - AZ_Warning("Asset", false, "Deprecated - replaced by GetAutoLoadBehavior") + AZ_Warning("Asset", false, "Deprecated - replaced by GetAutoLoadBehavior"); return static_cast(m_loadBehavior); } @@ -1012,7 +1012,7 @@ namespace AZ template bool Asset::SetFlags(u8 flags) { - AZ_Warning("Asset", false, "Deprecated - replaced by SetAutoLoadBehavior") + AZ_Warning("Asset", false, "Deprecated - replaced by SetAutoLoadBehavior"); if (!m_assetData) { AZ_Assert(flags < static_cast(AssetLoadBehavior::Count), "Flags value is out of range"); diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.h b/Code/Framework/AzCore/AzCore/Debug/Trace.h index 5cb8c23821..11545375e4 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.h +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.h @@ -8,8 +8,7 @@ #pragma once #include -#define AZ_VA_HAS_ARGS(...) ""#__VA_ARGS__[0] != 0 - +#include namespace AZ { @@ -262,17 +261,18 @@ namespace AZ #define AZ_VerifyWarning(window, expression, ...) AZ_Warning(window, 0 != (expression), __VA_ARGS__) #else // !AZ_ENABLE_TRACING - #define AZ_Assert(expression, ...) - #define AZ_Error(window, expression, ...) - #define AZ_ErrorOnce(window, expression, ...) - #define AZ_Warning(window, expression, ...) - #define AZ_WarningOnce(window, expression, ...) - #define AZ_TracePrintf(window, ...) - #define AZ_TracePrintfOnce(window, ...) - #define AZ_Verify(expression, ...) (void)(expression) - #define AZ_VerifyError(window, expression, ...) (void)(expression) - #define AZ_VerifyWarning(window, expression, ...) (void)(expression) + #define AZ_Assert(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_Error(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_ErrorOnce(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_Warning(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_WarningOnce(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_TracePrintf(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_TracePrintfOnce(...) AZ_UNUSED(__VA_ARGS__) + + #define AZ_Verify(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_VerifyError(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_VerifyWarning(...) AZ_UNUSED(__VA_ARGS__) #endif // AZ_ENABLE_TRACING diff --git a/Code/Framework/AzCore/AzCore/Driller/Stream.cpp b/Code/Framework/AzCore/AzCore/Driller/Stream.cpp index 761f964561..14e983b09c 100644 --- a/Code/Framework/AzCore/AzCore/Driller/Stream.cpp +++ b/Code/Framework/AzCore/AzCore/Driller/Stream.cpp @@ -693,7 +693,7 @@ namespace AZ } else { - AZ_Assert(m_isPooledString == false && m_isPooledStringCrc32 == false, "This stream requires using of a string pool as the string is send only once and afterwards only the Crc32 is used!") + AZ_Assert(m_isPooledString == false && m_isPooledStringCrc32 == false, "This stream requires using of a string pool as the string is send only once and afterwards only the Crc32 is used!"); } return srcData; } diff --git a/Code/Framework/AzCore/AzCore/IO/IStreamerTypes.h b/Code/Framework/AzCore/AzCore/IO/IStreamerTypes.h index 6afe078514..901fc5e594 100644 --- a/Code/Framework/AzCore/AzCore/IO/IStreamerTypes.h +++ b/Code/Framework/AzCore/AzCore/IO/IStreamerTypes.h @@ -150,9 +150,7 @@ namespace AZ::IO::IStreamerTypes private: AZStd::atomic_int m_lockCounter{ 0 }; -#ifdef AZ_ENABLE_TRACING AZStd::atomic_int m_allocationCounter{ 0 }; -#endif AZ::IAllocatorAllocate& m_allocator; }; diff --git a/Code/Framework/AzCore/AzCore/base.h b/Code/Framework/AzCore/AzCore/base.h index f6ae39dcda..f2a64c3224 100644 --- a/Code/Framework/AzCore/AzCore/base.h +++ b/Code/Framework/AzCore/AzCore/base.h @@ -143,6 +143,9 @@ * example. AZ_VA_NUM_ARGS(x,y,z) -> expands to 3 */ #ifndef AZ_VA_NUM_ARGS + +# define AZ_VA_HAS_ARGS(...) ""#__VA_ARGS__[0] != 0 + // we add the zero to avoid the case when we require at least 1 param at the end... # define AZ_VA_NUM_ARGS(...) AZ_VA_NUM_ARGS_IMPL_((__VA_ARGS__, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116, 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)) # define AZ_VA_NUM_ARGS_IMPL_(tuple) AZ_VA_NUM_ARGS_IMPL tuple @@ -170,15 +173,15 @@ // This is a pain they we use macros to call functions (with no params). // we implement functions for up to 10 params -#define AZ_FUNCTION_CALL_1(_1) _1() -#define AZ_FUNCTION_CALL_2(_1, _2) _1(_2) -#define AZ_FUNCTION_CALL_3(_1, _2, _3) _1(_2, _3) -#define AZ_FUNCTION_CALL_4(_1, _2, _3, _4) _1(_2, _3, _4) -#define AZ_FUNCTION_CALL_5(_1, _2, _3, _4, _5) _1(_2, _3, _4, _5) -#define AZ_FUNCTION_CALL_6(_1, _2, _3, _4, _5, _6) _1(_2, _3, _4, _5, _6) -#define AZ_FUNCTION_CALL_7(_1, _2, _3, _4, _5, _6, _7) _1(_2, _3, _4, _5, _6, _7) -#define AZ_FUNCTION_CALL_8(_1, _2, _3, _4, _5, _6, _7, _8) _1(_2, _3, _4, _5, _6, _7, _8) -#define AZ_FUNCTION_CALL_9(_1, _2, _3, _4, _5, _6, _7, _8, _9) _1(_2, _3, _4, _5, _6, _7, _8, _9) +#define AZ_FUNCTION_CALL_1(_1) _1() +#define AZ_FUNCTION_CALL_2(_1, _2) _1(_2) +#define AZ_FUNCTION_CALL_3(_1, _2, _3) _1(_2, _3) +#define AZ_FUNCTION_CALL_4(_1, _2, _3, _4) _1(_2, _3, _4) +#define AZ_FUNCTION_CALL_5(_1, _2, _3, _4, _5) _1(_2, _3, _4, _5) +#define AZ_FUNCTION_CALL_6(_1, _2, _3, _4, _5, _6) _1(_2, _3, _4, _5, _6) +#define AZ_FUNCTION_CALL_7(_1, _2, _3, _4, _5, _6, _7) _1(_2, _3, _4, _5, _6, _7) +#define AZ_FUNCTION_CALL_8(_1, _2, _3, _4, _5, _6, _7, _8) _1(_2, _3, _4, _5, _6, _7, _8) +#define AZ_FUNCTION_CALL_9(_1, _2, _3, _4, _5, _6, _7, _8, _9) _1(_2, _3, _4, _5, _6, _7, _8, _9) #define AZ_FUNCTION_CALL_10(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) _1(_2, _3, _4, _5, _6, _7, _8, _9, _10) // We require at least 1 param FunctionName @@ -293,7 +296,20 @@ namespace AZ #define AZ_DEFAULT_COPY_MOVE(_Class) AZ_DEFAULT_COPY(_Class) AZ_DEFAULT_MOVE(_Class) // Macro that can be used to avoid unreferenced variable warnings -#define AZ_UNUSED(x) (void)x +#define AZ_UNUSED_1(x) (void)(x); +#define AZ_UNUSED_2(x1, x2) AZ_UNUSED_1(x1) AZ_UNUSED_1(x2) +#define AZ_UNUSED_3(x1, x2, x3) AZ_UNUSED_1(x1) AZ_UNUSED_2(x2, x3) +#define AZ_UNUSED_4(x1, x2, x3, x4) AZ_UNUSED_2(x1, x2) AZ_UNUSED_2(x3, x4) +#define AZ_UNUSED_5(x1, x2, x3, x4, x5) AZ_UNUSED_2(x1, x2) AZ_UNUSED_3(x3, x4, x5) +#define AZ_UNUSED_6(x1, x2, x3, x4, x5, x6) AZ_UNUSED_3(x1, x2, x3) AZ_UNUSED_3(x4, x5, x6) +#define AZ_UNUSED_7(x1, x2, x3, x4, x5, x6, x7) AZ_UNUSED_3(x1, x2, x3) AZ_UNUSED_4(x4, x5, x6, x7) +#define AZ_UNUSED_8(x1, x2, x3, x4, x5, x6, x7, x8) AZ_UNUSED_4(x1, x2, x3, x4) AZ_UNUSED_4(x5, x6, x7, x8) +#define AZ_UNUSED_9(x1, x2, x3, x4, x5, x6, x7, x8, x9) AZ_UNUSED_4(x1, x2, x3, x4) AZ_UNUSED_5(x5, x6, x7, x8, x9) +#define AZ_UNUSED_10(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10) AZ_UNUSED_5(x1, x2, x3, x4, x5) AZ_UNUSED_5(x6, x7, x8, x9, x10) +#define AZ_UNUSED_11(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11) AZ_UNUSED_5(x1, x2, x3, x4, x5) AZ_UNUSED_6(x6, x7, x8, x9, x10, x11) +#define AZ_UNUSED_12(x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12) AZ_UNUSED_6(x1, x2, x3, x4, x5, x6) AZ_UNUSED_6(x7, x8, x9, x10, x11, x12) + +#define AZ_UNUSED(...) AZ_MACRO_SPECIALIZE(AZ_UNUSED_, AZ_VA_NUM_ARGS(__VA_ARGS__), (__VA_ARGS__)) #define AZ_DEFINE_ENUM_BITWISE_OPERATORS(EnumType) \ inline constexpr EnumType operator | (EnumType a, EnumType b) \ diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index 2d3d1722ca..092c40827c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -526,12 +526,10 @@ namespace AzToolsFramework Template& targetTemplate = targetTemplateReference->get(); -#if defined(AZ_ENABLE_TRACING) Template& sourceTemplate = sourceTemplateReference->get(); AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength()); const AZStd::string& targetTemplateFilePath = targetTemplate.GetFilePath().Native(); const AZStd::string& sourceTemplateFilePath = sourceTemplate.GetFilePath().Native(); -#endif LinkId newLinkId = CreateUniqueLinkId(); Link newLink(newLinkId); @@ -770,10 +768,8 @@ namespace AzToolsFramework return false; } -#if defined(AZ_ENABLE_TRACING) Template& sourceTemplate = sourceTemplateReference->get(); Template& targetTemplate = targetTemplateReference->get(); -#endif AZStd::string_view instanceName(instanceIterator->name.GetString(), instanceIterator->name.GetStringLength()); @@ -783,10 +779,9 @@ namespace AzToolsFramework PrefabDomValue& instance = instanceIterator->value; AZ_Assert(instance.IsObject(), "Nested instance DOM provided is not a valid JSON object."); - [[maybe_unused]] PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); + PrefabDomValueReference sourceTemplateName = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::SourceName); AZ_Assert(sourceTemplateName, "Couldn't find source template name in the DOM of the nested instance while creating a link."); - AZ_Assert( - sourceTemplateName->get() == sourceTemplate.GetFilePath().c_str(), + AZ_Assert(sourceTemplateName->get() == sourceTemplate.GetFilePath().c_str(), "The name of the source template in the nested instance DOM does not match the name of the source template already loaded"); PrefabDomValueReference patchesReference = PrefabDomUtils::FindPrefabDomValue(instance, PrefabDomUtils::PatchesName); diff --git a/Code/LauncherUnified/Launcher.cpp b/Code/LauncherUnified/Launcher.cpp index f5da40ccad..de4c496b2a 100644 --- a/Code/LauncherUnified/Launcher.cpp +++ b/Code/LauncherUnified/Launcher.cpp @@ -626,11 +626,8 @@ namespace O3DELauncher AZ_TracePrintf("Launcher", "Application is configured for VFS"); AZ_TracePrintf("Launcher", "Log and cache files will be written to the Cache directory on your host PC"); -#if defined(AZ_ENABLE_TRACING) - const char* message = "If your game does not run, check any of the following:\n" - "\t- Verify the remote_ip address is correct in bootstrap.cfg"; -#endif - + constexpr const char* message = "If your game does not run, check any of the following:\n" + "\t- Verify the remote_ip address is correct in bootstrap.cfg"; if (mainInfo.m_additionalVfsResolution) { AZ_TracePrintf("Launcher", "%s\n%s", message, mainInfo.m_additionalVfsResolution) diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h index 378a8743d8..08d6292541 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h @@ -150,7 +150,7 @@ namespace AZ template template - void AssetCreator::ReportError([[maybe_unused]] const char* format, [[maybe_unused]] Args... args) + void AssetCreator::ReportError(const char* format, Args... args) { ++m_errorCount; AZ_Error(m_assetClassName, false, format, args...); @@ -158,7 +158,7 @@ namespace AZ template template - void AssetCreator::ReportWarning([[maybe_unused]] const char* format, [[maybe_unused]] Args... args) + void AssetCreator::ReportWarning(const char* format, Args... args) { ++m_warningCount; AZ_Warning(m_assetClassName, false, format, args...); diff --git a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp index 561daa269e..8edb52e066 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp @@ -206,10 +206,7 @@ namespace EditorPythonBindings if (eventName == e.m_name) { AZStd::string eventNameValue{ eventName }; -#if defined(AZ_ENABLE_TRACING) - const auto& callbackIt = m_callbackMap.find(eventNameValue); -#endif - AZ_Warning("python", m_callbackMap.end() == callbackIt, "Replacing callback for eventName:%s", eventNameValue.c_str()); + AZ_Warning("python", m_callbackMap.end() == m_callbackMap.find(eventNameValue), "Replacing callback for eventName:%s", eventNameValue.c_str()); m_callbackMap[eventNameValue] = callback; return true; } diff --git a/Gems/LmbrCentral/Code/Source/Builders/BenchmarkAssetBuilder/BenchmarkAssetBuilderWorker.cpp b/Gems/LmbrCentral/Code/Source/Builders/BenchmarkAssetBuilder/BenchmarkAssetBuilderWorker.cpp index da7181ae04..22be22265a 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/BenchmarkAssetBuilder/BenchmarkAssetBuilderWorker.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/BenchmarkAssetBuilder/BenchmarkAssetBuilderWorker.cpp @@ -253,12 +253,10 @@ namespace BenchmarkAssetBuilder // and 2 bytes of storage for text-based formats. // This is just an approximate total size because there's a bit of additional overhead // for asset headers and the other fields in the generated asset. -#if defined(AZ_ENABLE_TRACING) uint64_t approximateTotalStorageBytes = (settingsPtr->m_assetStorageType == AZ::DataStream::StreamType::ST_BINARY) ? UINT64_C(1) * totalGeneratedBytes : UINT64_C(2) * totalGeneratedBytes; -#endif AZ_TracePrintf(AssetBuilderSDK::InfoWindow, "Benchmark asset generation will generate %" PRIu64 " assets " diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp index c1b0d51ac8..5fe5c32a48 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/RuntimeComponent.cpp @@ -116,7 +116,7 @@ namespace ScriptCanvas return; } #else - AZ_Assert(m_runtimeAsset.Get(), "RuntimeComponent::m_runtimeAsset AssetId: %s was valid, but the data was not pre-loaded, so this script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString().data()); + AZ_Assert(m_runtimeOverrides.m_runtimeAsset.Get(), "RuntimeComponent::m_runtimeAsset AssetId: %s was valid, but the data was not pre-loaded, so this script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString().data()); #endif AZ_PROFILE_SCOPE(ScriptCanvas, "RuntimeComponent::InitializeExecution (%s)", m_runtimeOverrides.m_runtimeAsset.GetId().ToString().c_str()); @@ -130,7 +130,7 @@ namespace ScriptCanvas return; } #else - AZ_Assert(m_executionState, "RuntimeComponent::m_runtimeAsset AssetId: %s failed to create an execution state, possibly due to missing dependent asset, script will not run", m_runtimeAsset.GetId().ToString().data()); + AZ_Assert(m_executionState, "RuntimeComponent::m_runtimeAsset AssetId: %s failed to create an execution state, possibly due to missing dependent asset, script will not run", m_runtimeOverrides.m_runtimeAsset.GetId().ToString().data()); #endif AZ::EntityBus::Handler::BusConnect(GetEntityId()); From 7bf58945134f83a1b8433f53b345d1d7634fe733 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Wed, 8 Sep 2021 14:29:08 -0700 Subject: [PATCH 204/355] Set max file size limit as default parameter for ReadFile Signed-off-by: srikappa-amzn --- Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h | 3 ++- Code/Framework/AzCore/AzCore/Utils/Utils.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h index c81497aa95..c684d0397a 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/JsonUtils.h @@ -70,7 +70,8 @@ namespace AZ //! Parse json text. Returns a failure with error message if the content is not valid JSON. AZ::Outcome ReadJsonString(AZStd::string_view jsonText); - //! Parse a json file. Returns a failure with error message if the content is not valid JSON. + //! Parse a json file. Returns a failure with error message if the content is not valid JSON or if + //! the file size is larger than the max file size provided. AZ::Outcome ReadJsonFile( AZStd::string_view filePath, size_t maxFileSize = AZStd::numeric_limits::max()); diff --git a/Code/Framework/AzCore/AzCore/Utils/Utils.h b/Code/Framework/AzCore/AzCore/Utils/Utils.h index 1d3cbd777b..d8d4290f7f 100644 --- a/Code/Framework/AzCore/AzCore/Utils/Utils.h +++ b/Code/Framework/AzCore/AzCore/Utils/Utils.h @@ -112,6 +112,6 @@ namespace AZ //! the file size is larger than the max file size provided. template AZ::Outcome ReadFile( - AZStd::string_view filePath, size_t maxFileSize); + AZStd::string_view filePath, size_t maxFileSize = AZStd::numeric_limits::max()); } } From b87b807de90e7dded698c5b2f32b5b255f0007fc Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Wed, 8 Sep 2021 16:07:22 -0700 Subject: [PATCH 205/355] Fixed an unused variable error in linux build Signed-off-by: srikappa-amzn --- .../AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp index a1c3b936b2..0c61ccb501 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabIntegrationManager.cpp @@ -1305,7 +1305,7 @@ namespace AzToolsFramework } AZStd::unique_ptr unsavedPrefabsContainer = AZStd::make_unique(AzToolsFramework::GetActiveWindow()); - unsavedPrefabsContainer->setObjectName("SaveDependentPrefabsCard"); + unsavedPrefabsContainer->setObjectName(SaveDependentPrefabsCard); unsavedPrefabsContainer->setTitle("Unsaved Prefabs"); unsavedPrefabsContainer->header()->setHasContextMenu(false); unsavedPrefabsContainer->header()->setIcon(QIcon(QStringLiteral(":/Entity/prefab_edit.svg"))); From 443bf472cb59aa8bb3eaba0f05c97782f8a870ec Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Wed, 8 Sep 2021 16:31:46 -0700 Subject: [PATCH 206/355] removed unused function from script event handler node Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Libraries/Core/ReceiveScriptEvent.cpp | 23 ------------------- .../Libraries/Core/ReceiveScriptEvent.h | 1 - 2 files changed, 24 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp index 734c2a1242..5a2eb80187 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.cpp @@ -556,29 +556,6 @@ namespace ScriptCanvas return true; } - bool ReceiveScriptEvent::SetupHandler() - { - if (!m_handler) - { - if (!m_asset.IsReady() && m_scriptEventAssetId.IsValid()) - { - m_asset = AZ::Data::AssetManager::Instance().GetAsset(m_scriptEventAssetId, AZ::Data::AssetLoadBehavior::PreLoad); - m_asset.BlockUntilLoadComplete(); - CreateHandler(m_asset); - CreateEbus(); - } - - if (!m_handler) - { - AZStd::string error = AZStd::string::format("Script Event receiver node was not initialized (%s)!", m_definition.GetName().c_str()); - SCRIPTCANVAS_REPORT_ERROR((*this), error.c_str()); - return false; - } - } - - return true; - } - bool ReceiveScriptEvent::IsOutOfDate(const VersionData& graphVersion) const { AZ_UNUSED(graphVersion); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h index f2bdd98b2b..0f8d673629 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/ReceiveScriptEvent.h @@ -88,7 +88,6 @@ namespace ScriptCanvas private: bool CreateEbus(); - bool SetupHandler(); AZ::BehaviorEBusHandler* m_handler = nullptr; AZ::BehaviorEBus* m_ebus = nullptr; From f414cd3966b9f0af79a5860df99fc553487fb148 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 8 Sep 2021 16:50:57 -0700 Subject: [PATCH 207/355] More fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/AzCore/Asset/AssetCommon.cpp | 2 +- .../AzCore/AzCore/Asset/AssetManager.cpp | 2 +- Code/Framework/AzCore/AzCore/Debug/Trace.h | 20 +++++++++---------- .../AzCore/AzCore/Script/ScriptContext.cpp | 2 +- .../Serialization/Json/MapSerializer.cpp | 2 +- .../AzCore/Serialization/SerializeContext.cpp | 2 +- .../Settings/SettingsRegistryMergeUtils.cpp | 4 ++-- .../AzCore/AzCore/Slice/SliceComponent.cpp | 2 +- .../Windows/AzCore/Platform_Windows.cpp | 2 +- Code/Framework/AzCore/Tests/Patching.cpp | 2 +- .../AzFramework/IO/RemoteStorageDrive.cpp | 2 +- .../Components/Widgets/VectorInput.cpp | 6 +++--- .../GFxFramework/MaterialIO/Material.cpp | 6 +++--- .../GridMate/Replica/ReplicaChunk.cpp | 2 +- .../GridMate/GridMate/Replica/ReplicaTarget.h | 2 +- .../GridMate/GridMate/Session/Session.cpp | 2 +- .../GridMate/GridMate/Session/Session.h | 2 +- .../Include/Atom/RPI.Reflect/AssetCreator.h | 8 ++++++-- .../Model/ModelAssetBuilderComponent.cpp | 2 -- .../Model/MorphTargetExporter.cpp | 4 ---- .../RPI.Reflect/Material/MaterialFunctor.cpp | 2 -- .../ScriptEventsNodePaletteTreeItemTypes.cpp | 2 -- .../Rendering/Atom/TangentSpaceHelper.cpp | 2 -- 23 files changed, 37 insertions(+), 45 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp index af3aba49a3..fdc3053b5c 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetCommon.cpp @@ -213,7 +213,7 @@ namespace AZ void AssetData::Acquire() { - AZ_Assert(m_useCount >= 0, "AssetData has been deleted") + AZ_Assert(m_useCount >= 0, "AssetData has been deleted"); AcquireWeak(); ++m_useCount; diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp index 6ba69cffd5..98182a9568 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp +++ b/Code/Framework/AzCore/AzCore/Asset/AssetManager.cpp @@ -2132,7 +2132,7 @@ namespace AZ } else { - AZ_Warning("AssetManager", false, "Couldn't find handler for asset %s (%s)", asset.GetId().ToString().c_str(), asset.GetHint().c_str()) + AZ_Warning("AssetManager", false, "Couldn't find handler for asset %s (%s)", asset.GetId().ToString().c_str(), asset.GetHint().c_str()); } // Notify any dependent jobs. diff --git a/Code/Framework/AzCore/AzCore/Debug/Trace.h b/Code/Framework/AzCore/AzCore/Debug/Trace.h index 11545375e4..a1334d334e 100644 --- a/Code/Framework/AzCore/AzCore/Debug/Trace.h +++ b/Code/Framework/AzCore/AzCore/Debug/Trace.h @@ -262,17 +262,17 @@ namespace AZ #else // !AZ_ENABLE_TRACING - #define AZ_Assert(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_Error(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_ErrorOnce(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_Warning(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_WarningOnce(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_TracePrintf(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_TracePrintfOnce(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_Assert(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_Error(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_ErrorOnce(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_Warning(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_WarningOnce(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_TracePrintf(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_TracePrintfOnce(...) AZ_UNUSED(__VA_ARGS__); - #define AZ_Verify(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_VerifyError(...) AZ_UNUSED(__VA_ARGS__) - #define AZ_VerifyWarning(...) AZ_UNUSED(__VA_ARGS__) + #define AZ_Verify(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_VerifyError(...) AZ_UNUSED(__VA_ARGS__); + #define AZ_VerifyWarning(...) AZ_UNUSED(__VA_ARGS__); #endif // AZ_ENABLE_TRACING diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp index e4e3141c11..5a35603d0a 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp @@ -222,7 +222,7 @@ namespace AZ int AddRefCount(int value) { - AZ_Assert(value == 1 || value == -1, "ModRefCount is only for incrementing or decrementing on copy or destruction of ExposedLambda") + AZ_Assert(value == 1 || value == -1, "ModRefCount is only for incrementing or decrementing on copy or destruction of ExposedLambda"); lua_rawgeti(m_lua, LUA_REGISTRYINDEX, m_refCountRegistryIndex); // Lua: refCount-old const int refCount = Internal::azlua_tointeger(m_lua, -1) + value; diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.cpp b/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.cpp index 39132ddb52..7978b8104b 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/MapSerializer.cpp @@ -293,7 +293,7 @@ namespace AZ } AZ_Assert(!keyValues.Empty(), "Intermediate array for associative container can't be empty " - "because an empty array would be stored as an empty default object.") + "because an empty array would be stored as an empty default object."); if (CanBeConvertedToObject(keyValues)) { diff --git a/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp b/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp index f326b021e7..b74039c876 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp +++ b/Code/Framework/AzCore/AzCore/Serialization/SerializeContext.cpp @@ -2300,7 +2300,7 @@ namespace AZ { if (classData->m_converter) { - AZ_Assert(false, "A deprecated element with a data converter was passed to CloneObject, this is not supported.") + AZ_Assert(false, "A deprecated element with a data converter was passed to CloneObject, this is not supported."); } // push a dummy node in the stack cloneData->m_parentStack.push_back(); diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp index cb666a7c02..71ffece892 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryMergeUtils.cpp @@ -109,12 +109,12 @@ namespace AZ::Internal { FixedValueString engineName; settingsRegistry.Get(engineName, engineMonikerKey); - AZ_Warning("SettingsRegistryMergeUtils",engineInfo.m_moniker == engineName, + AZ_Warning("SettingsRegistryMergeUtils", engineInfo.m_moniker == engineName, R"(The engine name key "%s" mapped to engine path "%s" within the global manifest of "%s")" R"( does not match the "engine_name" field "%s" in the engine.json)" "\n" "This engine should be re-registered.", engineInfo.m_moniker.c_str(), engineInfo.m_path.c_str(), engineManifestPath.c_str(), - engineName.c_str()) + engineName.c_str()); engineInfo.m_moniker = engineName; } } diff --git a/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp b/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp index 03ed3f6ebb..82a9175cf9 100644 --- a/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp +++ b/Code/Framework/AzCore/AzCore/Slice/SliceComponent.cpp @@ -3464,7 +3464,7 @@ namespace AZ const SliceComponent::DataFlagsPerEntity* SliceComponent::GetCorrectBundleOfDataFlags(EntityId entityId) const { // It would be possible to search non-instantiated slices by crawling over lists, but we haven't needed the capability yet. - AZ_Assert(IsInstantiated(), "Data flag access is only permitted after slice is instantiated.") + AZ_Assert(IsInstantiated(), "Data flag access is only permitted after slice is instantiated."); if (IsInstantiated()) { diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/Platform_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/Platform_Windows.cpp index cc45b36c41..39cb9e8c10 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/Platform_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/Platform_Windows.cpp @@ -42,7 +42,7 @@ namespace AZ } else { - AZ_Error("System", false, "Failed to open HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MachineGuid!") + AZ_Error("System", false, "Failed to open HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography\\MachineGuid!"); } wchar_t* hostname = machineInfo + wcslen(machineInfo); diff --git a/Code/Framework/AzCore/Tests/Patching.cpp b/Code/Framework/AzCore/Tests/Patching.cpp index ee887d66c2..29b25ebf28 100644 --- a/Code/Framework/AzCore/Tests/Patching.cpp +++ b/Code/Framework/AzCore/Tests/Patching.cpp @@ -2651,7 +2651,7 @@ namespace UnitTest if (!rootElement.GetChildData(AZ_CRC("InnerBaseStringField"), stringField)) { AZ_Error("PatchingTest", false, "Unable to retrieve 'InnerBaseStringField' data for %u version of the InnerObjectFieldConverterClass", - rootElement.GetVersion()) + rootElement.GetVersion()); return false; } diff --git a/Code/Framework/AzFramework/AzFramework/IO/RemoteStorageDrive.cpp b/Code/Framework/AzFramework/AzFramework/IO/RemoteStorageDrive.cpp index 8db0c27475..5cd36ca05a 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/RemoteStorageDrive.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/RemoteStorageDrive.cpp @@ -281,7 +281,7 @@ namespace AzFramework AZ_PROFILE_FUNCTION(AzCore); auto data = AZStd::get_if(&request->GetCommand()); - AZ_Assert(data, "Request doing reading in the RemoteStorageDrive didn't contain read data.") + AZ_Assert(data, "Request doing reading in the RemoteStorageDrive didn't contain read data."); HandleType file = InvalidHandle; diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp index 7acc7ad0d0..7b879e89b1 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/VectorInput.cpp @@ -303,7 +303,7 @@ VectorInput::~VectorInput() void VectorInput::setLabel(int index, const QString& label) { AZ_Warning("PropertyGrid", index < m_elementCount, - "This control handles only %i controls", m_elementCount) + "This control handles only %i controls", m_elementCount); if (index < m_elementCount) { m_elements[index]->setLabel(label); @@ -313,7 +313,7 @@ void VectorInput::setLabel(int index, const QString& label) void VectorInput::setLabelStyle(int index, const QString& qss) { AZ_Warning("PropertyGrid", index < m_elementCount, - "This control handles only %i controls", m_elementCount) + "This control handles only %i controls", m_elementCount); if (index < m_elementCount) { m_elements[index]->getLabelWidget()->setStyleSheet(qss); @@ -323,7 +323,7 @@ void VectorInput::setLabelStyle(int index, const QString& qss) void VectorInput::setValuebyIndex(double value, int elementIndex) { AZ_Warning("PropertyGrid", elementIndex < m_elementCount, - "This control handles only %i controls", m_elementCount) + "This control handles only %i controls", m_elementCount); if (elementIndex < m_elementCount) { m_elements[elementIndex]->setValue(value); diff --git a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp index de035ed9b6..22843fa230 100644 --- a/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp +++ b/Code/Framework/GFxFramework/GFxFramework/MaterialIO/Material.cpp @@ -236,7 +236,7 @@ namespace AZ case TextureMapType::Bump: return m_normalMap; default: - AZ_Assert(false, "Invalid Texture map requested.") + AZ_Assert(false, "Invalid Texture map requested."); return m_empty; } } @@ -255,7 +255,7 @@ namespace AZ m_normalMap = texture; break; default: - AZ_Assert(false, "Invalid Texture map requested.") + AZ_Assert(false, "Invalid Texture map requested."); break; } } @@ -599,7 +599,7 @@ namespace AZ if (!materialNode) { - AZ_Assert(false, "Attempted to add material to invalid xml document.") + AZ_Assert(false, "Attempted to add material to invalid xml document."); return false; } diff --git a/Code/Framework/GridMate/GridMate/Replica/ReplicaChunk.cpp b/Code/Framework/GridMate/GridMate/Replica/ReplicaChunk.cpp index ee42ff2ad0..d3db481ccd 100644 --- a/Code/Framework/GridMate/GridMate/Replica/ReplicaChunk.cpp +++ b/Code/Framework/GridMate/GridMate/Replica/ReplicaChunk.cpp @@ -351,7 +351,7 @@ namespace GridMate DataSetBase* dataset = descriptor->GetDataSet(this, i); if (!dataset) { - AZ_Assert(false, "How can we have a dirty dataset that doesn't exist?") + AZ_Assert(false, "How can we have a dirty dataset that doesn't exist?"); continue; } diff --git a/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.h b/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.h index 03f813ac6c..be1a86b627 100644 --- a/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.h +++ b/Code/Framework/GridMate/GridMate/Replica/ReplicaTarget.h @@ -64,7 +64,7 @@ namespace GridMate // Create Callback AZStd::weak_ptr CreateCallback(AZ::u64 revision) { - AZ_Assert(IsAckEnabled(), "ACK disabled.") //Shouldn't happen + AZ_Assert(IsAckEnabled(), "ACK disabled."); //Shouldn't happen AZ_Assert(m_replicaRevision <= revision, "Cannot decrease replica revision"); if(!m_callback || m_callback->m_revision != revision) diff --git a/Code/Framework/GridMate/GridMate/Session/Session.cpp b/Code/Framework/GridMate/GridMate/Session/Session.cpp index b731d82b71..3dcb16b08d 100644 --- a/Code/Framework/GridMate/GridMate/Session/Session.cpp +++ b/Code/Framework/GridMate/GridMate/Session/Session.cpp @@ -1583,7 +1583,7 @@ GridSession::OnStateCreate(HSM& sm, const HSM::Event& e) // Bind member replica bool isAdded = AddMember(m_myMember); - AZ_Error("GridMate", isAdded, "Failed to add my replica, check the number of open slots!") + AZ_Error("GridMate", isAdded, "Failed to add my replica, check the number of open slots!"); if (!isAdded) { sm.Transition(SS_DELETE); diff --git a/Code/Framework/GridMate/GridMate/Session/Session.h b/Code/Framework/GridMate/GridMate/Session/Session.h index 5080570373..e075a0aa48 100644 --- a/Code/Framework/GridMate/GridMate/Session/Session.h +++ b/Code/Framework/GridMate/GridMate/Session/Session.h @@ -698,7 +698,7 @@ namespace GridMate static void* UserDataCopier(const void* sourceData, unsigned int sourceDataSize) { (void)sourceDataSize; - AZ_Assert(sizeof(T) == sourceDataSize, "Data size %d doesn't match the type size %d", sourceDataSize, sizeof(T)) + AZ_Assert(sizeof(T) == sourceDataSize, "Data size %d doesn't match the type size %d", sourceDataSize, sizeof(T)); return azcreate(T, (*static_cast(sourceData)), GridMateAllocatorMP, "UserDataCopier"); } template diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h index 08d6292541..abdbe9cdce 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/AssetCreator.h @@ -150,18 +150,22 @@ namespace AZ template template - void AssetCreator::ReportError(const char* format, Args... args) + void AssetCreator::ReportError([[maybe_unused]] const char* format, [[maybe_unused]] Args... args) { ++m_errorCount; +#if defined(AZ_ENABLE_TRACING) // disabling since it requires argument expansion in this context AZ_Error(m_assetClassName, false, format, args...); +#endif } template template - void AssetCreator::ReportWarning(const char* format, Args... args) + void AssetCreator::ReportWarning([[maybe_unused]] const char* format, [[maybe_unused]] Args... args) { ++m_warningCount; +#if defined(AZ_ENABLE_TRACING) // disabling since it requires argument expansion in this context AZ_Warning(m_assetClassName, false, format, args...); +#endif } template diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp index 9fc99e3ea4..1da16b44b6 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelAssetBuilderComponent.cpp @@ -1078,9 +1078,7 @@ namespace AZ template void ModelAssetBuilderComponent::ValidateStreamSize([[maybe_unused]] size_t expectedVertexCount, [[maybe_unused]] const AZStd::vector& bufferData, [[maybe_unused]] AZ::RHI::Format format, [[maybe_unused]] const char* streamName) const { -#if defined(AZ_ENABLE_TRACING) size_t actualVertexCount = (bufferData.size() * sizeof(T)) / RHI::GetFormatSize(format); -#endif AZ_Error(s_builderName, expectedVertexCount == actualVertexCount, "VertexStream '%s' does not match the expected vertex count. This typically means multiple sub-meshes have mis-matched vertex stream layouts (such as one having more uv sets than the other) but are assigned the same material in the dcc tool so they were merged.", streamName); } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp index 44141f3ae3..f5812aae8b 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MorphTargetExporter.cpp @@ -70,11 +70,9 @@ namespace AZ::RPI { const Containers::SceneGraph& sceneGraph = scene.GetGraph(); -#if defined(AZ_ENABLE_TRACING) const auto baseMeshIt = AZStd::find(sceneGraph.GetContentStorage().cbegin(), sceneGraph.GetContentStorage().cend(), sourceMesh.m_meshData); const Containers::SceneGraph::NodeIndex baseMeshIndex = sceneGraph.ConvertToNodeIndex(baseMeshIt); const AZStd::string_view baseMeshName{sceneGraph.GetNodeName(baseMeshIndex).GetName(), sceneGraph.GetNodeName(baseMeshIndex).GetNameLength()}; -#endif // Get the blend shapes for the given mesh AZStd::unordered_map blendShapeInfos = GetBlendShapeInfos(scene, sourceMesh.m_meshData.get()); @@ -90,10 +88,8 @@ namespace AZ::RPI AZ_Assert(blendShapeData, "Node is expected to be a blend shape."); if (blendShapeData) { -#if defined(AZ_ENABLE_TRACING) const Containers::SceneGraph::NodeIndex morphMeshParentIndex = sceneGraph.GetNodeParent(sceneNodeIndex); const AZStd::string_view sourceMeshName{sceneGraph.GetNodeName(morphMeshParentIndex).GetName(), sceneGraph.GetNodeName(morphMeshParentIndex).GetNameLength()}; -#endif AZ_Assert(AZ::StringFunc::Equal(baseMeshName, sourceMeshName, /*bCaseSensitive=*/true), "Scene graph mesh node (%.*s) has a different name than the product mesh (%.*s).", diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp index 3945560eb3..d08fa3e58e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp @@ -419,9 +419,7 @@ namespace AZ { if (!materialPropertyDependencies.test(index.GetIndex())) { -#if defined(AZ_ENABLE_TRACING) const MaterialPropertyDescriptor* propertyDescriptor = materialPropertiesLayout.GetPropertyDescriptor(index); -#endif AZ_Error("MaterialFunctor", false, "Material functor accessing an unregistered material property '%s'.", propertyDescriptor ? propertyDescriptor->GetName().GetCStr() : ""); } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.cpp index da0e9c6045..704f67e034 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.cpp @@ -154,9 +154,7 @@ namespace ScriptCanvasEditor const ScriptEvents::ScriptEvent& definition = data->m_definition; -#if defined(AZ_ENABLE_TRACING) bool recategorize = previousDefinition ? definition.GetCategory().compare(previousDefinition->GetCategory()) != 0 : false; -#endif AZ_Warning("ScriptCanvas", !recategorize, "Unable to recategorize ScriptEvents events while open. Please close and re-open the Script Canvas Editor to see the new categorization"); if (definition.GetName().empty()) diff --git a/Gems/WhiteBox/Code/Source/Rendering/Atom/TangentSpaceHelper.cpp b/Gems/WhiteBox/Code/Source/Rendering/Atom/TangentSpaceHelper.cpp index 913778cc44..a43b48d3b9 100644 --- a/Gems/WhiteBox/Code/Source/Rendering/Atom/TangentSpaceHelper.cpp +++ b/Gems/WhiteBox/Code/Source/Rendering/Atom/TangentSpaceHelper.cpp @@ -73,9 +73,7 @@ namespace WhiteBox for (AZ::u32 i = 0; i < triangleCount; ++i) { -#if defined(AZ_ENABLE_TRACING) const auto& trianglePositions = trianglesPositions[i]; -#endif const auto& triangleUVs = trianglesUVs[i]; const auto& triangleEdges = trianglesEdges[i]; From e6573766c276bf4651439b32cd4ffeaa28d964a7 Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Wed, 8 Sep 2021 21:13:36 -0700 Subject: [PATCH 208/355] Fixes for release builds for unused variable warnings (#4000) Signed-off-by: Steve Pham --- .../AzToolsFramework/AzToolsFramework/Asset/AssetBundler.cpp | 2 +- .../Linux/AzToolsFramework/Archive/ArchiveComponent_Linux.cpp | 2 +- Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.cpp | 4 ++-- .../Code/Source/Processing/ImageConvert.cpp | 2 +- .../Atom/Asset/Shader/Code/Source/Editor/AtomShaderConfig.cpp | 2 +- .../Shader/Code/Source/Editor/CommonFiles/CommonTypes.cpp | 2 +- .../Shader/Code/Source/Editor/PrecompiledShaderBuilder.cpp | 2 +- .../Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp | 2 +- Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp | 2 +- .../Code/Source/RHI.Builders/ShaderPlatformInterface.cpp | 2 +- .../RPI/Code/Source/RPI.Builders/Common/AnyAssetBuilder.cpp | 2 +- .../RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp | 2 +- .../RPI.Builders/Model/MaterialAssetBuilderComponent.cpp | 2 +- .../Code/Source/RPI.Builders/Model/ModelExporterComponent.cpp | 2 +- Gems/Atom/RPI/Code/Source/RPI.Builders/Pass/PassBuilder.cpp | 2 +- .../Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp | 2 +- Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp | 2 +- .../Builders/MaterialBuilder/MaterialBuilderComponent.cpp | 2 +- .../Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp | 2 +- .../Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.cpp | 2 +- .../Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp | 2 +- .../Execution/Interpreted/ExecutionInterpretedAPI.cpp | 2 +- Gems/ScriptEvents/Code/Builder/ScriptEventsBuilderWorker.cpp | 2 +- .../Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp | 2 +- 24 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetBundler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetBundler.cpp index 99d53f6c62..92334f404c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetBundler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Asset/AssetBundler.cpp @@ -44,7 +44,7 @@ namespace AzToolsFramework const char AssetBundleSettingsFileExtension[] = "bundlesettings"; const char BundleFileExtension[] = "pak"; const char ComparisonRulesFileExtension[] = "rules"; - const char ErrorWindowName[] = "AssetBundler"; + [[maybe_unused]] const char ErrorWindowName[] = "AssetBundler"; const char* AssetFileInfoListComparison::ComparisonTypeNames[] = { "delta", "union", "intersection", "complement", "filepattern", "intersectioncount" }; const char* AssetFileInfoListComparison::FilePatternTypeNames[] = { "wildcard", "regex" }; const char DefaultTypeName[] = "default"; diff --git a/Code/Framework/AzToolsFramework/Platform/Linux/AzToolsFramework/Archive/ArchiveComponent_Linux.cpp b/Code/Framework/AzToolsFramework/Platform/Linux/AzToolsFramework/Archive/ArchiveComponent_Linux.cpp index 4a834bdedb..cc8b9492e8 100644 --- a/Code/Framework/AzToolsFramework/Platform/Linux/AzToolsFramework/Archive/ArchiveComponent_Linux.cpp +++ b/Code/Framework/AzToolsFramework/Platform/Linux/AzToolsFramework/Archive/ArchiveComponent_Linux.cpp @@ -15,7 +15,7 @@ namespace AzToolsFramework { namespace Platform { - static const char ErrorChannel[] = "ArchiveComponent_Linux"; + [[maybe_unused]] static const char ErrorChannel[] = "ArchiveComponent_Linux"; static const char ZipExePath[] = R"(/usr/bin/zip)"; static const char UnzipExePath[] = R"(/usr/bin/unzip)"; diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.cpp b/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.cpp index ffbc5a445c..c88ea59bdb 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.cpp +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.cpp @@ -60,8 +60,8 @@ void initSharedResources() namespace { - const char* LUAEditorDebugName = "LUA Debug"; - const char* LUAEditorInfoName = "LUA Editor"; + [[maybe_unused]] const char* LUAEditorDebugName = "LUA Debug"; + [[maybe_unused]] const char* LUAEditorInfoName = "LUA Editor"; } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp index 1618f376b4..9b41645280 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp @@ -63,7 +63,7 @@ namespace ImageProcessingAtom StepAll }; - const char ProcessStepNames[StepAll][64] = + [[maybe_unused]] const char ProcessStepNames[StepAll][64] = { "ValidateInput", "GenerateColorChart", diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AtomShaderConfig.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AtomShaderConfig.cpp index d2bcf4b985..e20d9ecf6c 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AtomShaderConfig.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AtomShaderConfig.cpp @@ -21,7 +21,7 @@ namespace AZ { namespace AtomShaderConfig { - static constexpr char AtomShaderConfigName[] = "AtomShaderConfig"; + [[maybe_unused]] static constexpr char AtomShaderConfigName[] = "AtomShaderConfig"; bool MutateToFirstAbsoluteFolderThatExists(AZStd::string& relativeFolder, AZStd::vector& watchFolders) { diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/CommonTypes.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/CommonTypes.cpp index 35c1e48d37..d960b25c10 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/CommonTypes.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/CommonTypes.cpp @@ -16,7 +16,7 @@ namespace AZ { namespace ShaderBuilder { - static const char* s_azslShaderCompilerName = "AZSL Compiler"; + [[maybe_unused]] static const char* s_azslShaderCompilerName = "AZSL Compiler"; AZ::RHI::Format StringToFormat(const char* format) { diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/PrecompiledShaderBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/PrecompiledShaderBuilder.cpp index 21eda31ca2..2abee4d297 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/PrecompiledShaderBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/PrecompiledShaderBuilder.cpp @@ -26,7 +26,7 @@ namespace AZ { namespace { - static const char* PrecompiledShaderBuilderName = "PrecompiledShaderBuilder"; + [[maybe_unused]] static const char* PrecompiledShaderBuilderName = "PrecompiledShaderBuilder"; static const char* PrecompiledShaderBuilderJobKey = "PrecompiledShader Asset Builder"; static const char* ShaderAssetExtension = "azshader"; } diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp index 88abf92e54..78a3f1057a 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp @@ -45,7 +45,7 @@ namespace AZ { namespace ShaderBuilderUtility { - static constexpr char ShaderBuilderUtilityName[] = "ShaderBuilderUtility"; + [[maybe_unused]] static constexpr char ShaderBuilderUtilityName[] = "ShaderBuilderUtility"; Outcome LoadShaderDataJson(const AZStd::string& fullPathToJsonFile) { diff --git a/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp b/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp index d5b626917b..b4c68b3f75 100644 --- a/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI.Edit/Utils.cpp @@ -30,7 +30,7 @@ namespace AZ namespace RHI { static AZStd::mutex s_profilingMutex; - static constexpr char ShaderPlatformInterfaceName[] = "ShaderPlatformInterface"; + [[maybe_unused]] static constexpr char ShaderPlatformInterfaceName[] = "ShaderPlatformInterface"; void ShaderCompilerProfiling::Entry::Reflect(ReflectContext* context) { diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp index db6a454cea..8b99b7b510 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Builders/ShaderPlatformInterface.cpp @@ -23,7 +23,7 @@ namespace AZ { namespace Vulkan { - static const char* VulkanShaderPlatformName = "VulkanShaderPlatform"; + [[maybe_unused]] static const char* VulkanShaderPlatformName = "VulkanShaderPlatform"; static const char* WindowsPlatformShaderHeader = "Builders/ShaderHeaders/Platform/Windows/Vulkan/PlatformHeader.hlsli"; static const char* AndroidPlatformShaderHeader = "Builders/ShaderHeaders/Platform/Android/Vulkan/PlatformHeader.hlsli"; static const char* WindowsAzslShaderHeader = "Builders/ShaderHeaders/Platform/Windows/Vulkan/AzslcHeader.azsli"; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Common/AnyAssetBuilder.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Common/AnyAssetBuilder.cpp index c9c477048f..4d060b97b1 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Common/AnyAssetBuilder.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Common/AnyAssetBuilder.cpp @@ -30,7 +30,7 @@ namespace AZ { namespace { - const char* AnyAssetBuilderName = "AnyAssetBuilder"; + [[maybe_unused]] const char* AnyAssetBuilderName = "AnyAssetBuilder"; const char* AnyAssetBuilderJobKey = "Any Asset Builder"; const char* AnyAssetBuilderDefaultExtension = "azasset"; const char* AnyAssetSourceExtensions[] = diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp index 09f6610150..b8fc9b170f 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp @@ -36,7 +36,7 @@ namespace AZ { namespace { - static constexpr char const MaterialBuilderName[] = "MaterialBuilder"; + [[maybe_unused]] static constexpr char const MaterialBuilderName[] = "MaterialBuilder"; } const char* MaterialBuilder::JobKey = "Atom Material Builder"; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp index 0ac5b61662..cf7e53c596 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/MaterialAssetBuilderComponent.cpp @@ -37,7 +37,7 @@ namespace AZ { namespace RPI { - static const char* MaterialExporterName = "Scene Material Builder"; + [[maybe_unused]] static const char* MaterialExporterName = "Scene Material Builder"; void MaterialAssetDependenciesComponent::Reflect(ReflectContext* context) { diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelExporterComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelExporterComponent.cpp index f7e672ab32..4539f4b432 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelExporterComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Model/ModelExporterComponent.cpp @@ -37,7 +37,7 @@ namespace AZ { namespace RPI { - static const char* s_exporterName = "Atom Model Builder"; + [[maybe_unused]] static const char* s_exporterName = "Atom Model Builder"; ModelExporterComponent::ModelExporterComponent() { diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Pass/PassBuilder.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Pass/PassBuilder.cpp index b67f1643df..d5e243c687 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Pass/PassBuilder.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Pass/PassBuilder.cpp @@ -28,7 +28,7 @@ namespace AZ { namespace { - static const char* PassBuilderName = "PassBuilder"; + [[maybe_unused]] static const char* PassBuilderName = "PassBuilder"; static const char* PassBuilderJobKey = "Pass Asset Builder"; static const char* PassAssetExtension = "pass"; } diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp index 2a72641050..bbf1ad9059 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp @@ -24,7 +24,7 @@ namespace AZ { namespace AtomBridge { - static constexpr char AssetCollectionAsyncLoaderTestComponentName[] = " AssetCollectionAsyncLoaderTestComponent"; + [[maybe_unused]] static constexpr char AssetCollectionAsyncLoaderTestComponentName[] = " AssetCollectionAsyncLoaderTestComponent"; void AssetCollectionAsyncLoaderTestComponent::Reflect(AZ::ReflectContext* context) { diff --git a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp index 561daa269e..38e8ad6b21 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonProxyBus.cpp @@ -293,7 +293,7 @@ namespace EditorPythonBindings handler->m_ebus->m_name.c_str(), eventName); } - void OnEventGenericHook(const char* eventName, pybind11::function callback, [[maybe_unused]] int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) + void OnEventGenericHook([[maybe_unused]] const char* eventName, pybind11::function callback, [[maybe_unused]] int eventIndex, AZ::BehaviorValueParameter* result, int numParameters, AZ::BehaviorValueParameter* parameters) { // build the parameters to send to callback Convert::StackVariableAllocator stackVariableAllocator; diff --git a/Gems/LmbrCentral/Code/Source/Builders/MaterialBuilder/MaterialBuilderComponent.cpp b/Gems/LmbrCentral/Code/Source/Builders/MaterialBuilder/MaterialBuilderComponent.cpp index b5dce54f85..c06b21337b 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/MaterialBuilder/MaterialBuilderComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/MaterialBuilder/MaterialBuilderComponent.cpp @@ -19,7 +19,7 @@ namespace MaterialBuilder { - const char s_materialBuilder[] = "MaterialBuilder"; + [[maybe_unused]] const char s_materialBuilder[] = "MaterialBuilder"; namespace Internal { diff --git a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp index 14096f73d2..79cf3ac282 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp @@ -49,7 +49,7 @@ namespace SliceBuilder } } // namespace anonymous - static const char* const s_sliceBuilder = "SliceBuilder"; + [[maybe_unused]] static const char* const s_sliceBuilder = "SliceBuilder"; static const char* const s_sliceBuilderSettingsFilename = "SliceBuilderSettings.json"; SliceBuilderWorker::SliceBuilderWorker() diff --git a/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.cpp b/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.cpp index 68ce1497f0..e0802fa4d1 100644 --- a/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.cpp +++ b/Gems/LyShine/Code/Pipeline/LyShineBuilder/UiCanvasBuilderWorker.cpp @@ -31,7 +31,7 @@ namespace LyShine { - static const char* const s_uiSliceBuilder = "UiSliceBuilder"; + [[maybe_unused]] static const char* const s_uiSliceBuilder = "UiSliceBuilder"; void UiCanvasBuilderWorker::ShutDown() { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp index 5a88036a0f..d77789b6e3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/SubgraphInterface.cpp @@ -33,7 +33,7 @@ namespace SubgraphInterfaceCpp Current }; - const size_t k_maxTabs = 20; + [[maybe_unused]] const size_t k_maxTabs = 20; AZ_INLINE const char* GetTabs(size_t tabs) { diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp index e93fd1263d..8d324e95c0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Execution/Interpreted/ExecutionInterpretedAPI.cpp @@ -45,7 +45,7 @@ namespace ExecutionInterpretedAPICpp 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, k_Bad,k_Bad,k_Bad,k_Bad,k_Bad,k_Bad,k_Bad, 10, 11, 12, 13, 14, 15 }; - constexpr unsigned char k_FastValuesIndexSentinel = 'G' - '0'; + [[maybe_unused]] constexpr unsigned char k_FastValuesIndexSentinel = 'G' - '0'; template T* GetAs(AZ::BehaviorValueParameter& argument) diff --git a/Gems/ScriptEvents/Code/Builder/ScriptEventsBuilderWorker.cpp b/Gems/ScriptEvents/Code/Builder/ScriptEventsBuilderWorker.cpp index bc9ed886ea..caf3d3c42c 100644 --- a/Gems/ScriptEvents/Code/Builder/ScriptEventsBuilderWorker.cpp +++ b/Gems/ScriptEvents/Code/Builder/ScriptEventsBuilderWorker.cpp @@ -27,7 +27,7 @@ namespace ScriptEventsBuilder { - static const char* s_scriptEventsBuilder = "ScriptEventsBuilder"; + [[maybe_unused]] static const char* s_scriptEventsBuilder = "ScriptEventsBuilder"; Worker::Worker() { diff --git a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp index 2178151e3d..c4aaa6db04 100644 --- a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp +++ b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp @@ -36,7 +36,7 @@ namespace Terrain namespace { const uint32_t DEFAULT_UploadBufferSize = 512 * 1024; // 512k - const char* TerrainFPName = "TerrainFeatureProcessor"; + [[maybe_unused]] const char* TerrainFPName = "TerrainFeatureProcessor"; } namespace ShaderInputs From 34ca9bd5ba606a9fe69b578f3e7c8e4765090ac5 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Wed, 8 Sep 2021 22:29:32 -0700 Subject: [PATCH 209/355] fix Linux error Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp index fde48dbf3a..6da134ed6a 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasBaseAssetData.cpp @@ -6,8 +6,6 @@ * */ -#pragma once - #include #include From 5dcfb8e6542f858a31b04b090650ee3b55197900 Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Wed, 8 Sep 2021 23:19:05 -0700 Subject: [PATCH 210/355] Initialize prefab interface pointers only when prefabs are enabled Signed-off-by: srikappa-amzn --- Code/Editor/CryEditDoc.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index 76704a3f07..a61429fc87 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -132,14 +132,19 @@ CCryEditDoc::CCryEditDoc() RegisterConsoleVariables(); MainWindow::instance()->GetActionManager()->RegisterActionHandler(ID_FILE_SAVE_AS, this, &CCryEditDoc::OnFileSaveAs); - m_prefabSystemComponentInterface = AZ::Interface::Get(); - AZ_Assert(m_prefabSystemComponentInterface, "PrefabSystemComponentInterface is not found."); - m_prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); - AZ_Assert(m_prefabEditorEntityOwnershipInterface, "PrefabEditorEntityOwnershipInterface is not found."); - m_prefabLoaderInterface = AZ::Interface::Get(); - AZ_Assert(m_prefabLoaderInterface, "PrefabLoaderInterface is not found."); - m_prefabIntegrationInterface = AZ::Interface::Get(); - AZ_Assert(m_prefabIntegrationInterface, "PrefabIntegrationInterface is not found."); + bool isPrefabSystemEnabled = false; + AzFramework::ApplicationRequests::Bus::BroadcastResult(isPrefabSystemEnabled, &AzFramework::ApplicationRequests::IsPrefabSystemEnabled); + if (isPrefabSystemEnabled) + { + m_prefabSystemComponentInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabSystemComponentInterface, "PrefabSystemComponentInterface is not found."); + m_prefabEditorEntityOwnershipInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabEditorEntityOwnershipInterface, "PrefabEditorEntityOwnershipInterface is not found."); + m_prefabLoaderInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabLoaderInterface, "PrefabLoaderInterface is not found."); + m_prefabIntegrationInterface = AZ::Interface::Get(); + AZ_Assert(m_prefabIntegrationInterface, "PrefabIntegrationInterface is not found."); + } } CCryEditDoc::~CCryEditDoc() From a80314f84a7d6867ff5db187830c320ba0eda20d Mon Sep 17 00:00:00 2001 From: srikappa-amzn Date: Wed, 8 Sep 2021 23:25:24 -0700 Subject: [PATCH 211/355] Added a missing include file Signed-off-by: srikappa-amzn --- Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp index 8f761b621e..a82c731d7b 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include From 1442f1275bdb1652932a37fa1a66c5dca3ea863e Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza <82234181+AMZN-AlexOteiza@users.noreply.github.com> Date: Thu, 9 Sep 2021 09:32:43 +0200 Subject: [PATCH 212/355] Fixed Physics SC tests (#4001) Signed-off-by: AMZN-AlexOteiza --- .../ScriptCanvas_CollisionEvents.ly | 4 +- .../collision_events_script.scriptcanvas | 3096 +++++++------ .../ScriptCanvas_PreUpdateEvent.ly | 4 +- .../ScriptCanvas_PostUpdateEvent.scriptcanvas | 3797 ++++++---------- .../ScriptCanvas_PreUpdateEvent.scriptcanvas | 3911 +++++++---------- 5 files changed, 4609 insertions(+), 6203 deletions(-) diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly index 6c70bbf067..8fcf2dcde2 100644 --- a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/ScriptCanvas_CollisionEvents.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c1b6f5e409a8358ad95b310473046ce1a2f2aa5f7e05d0c3396044aa52aa7f6d -size 9103 +oid sha256:d674eac2070ed0028ceff1e84692c9cf1f69db2192c2295b6d714670ccd50308 +size 8936 diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas index a565c64b60..ce545a30b5 100644 --- a/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_CollisionEvents/collision_events_script.scriptcanvas @@ -5,7 +5,7 @@ "ClassData": { "m_scriptCanvas": { "Id": { - "id": 70086661081986 + "id": 18841028265353 }, "Name": "collision_events_script", "Components": { @@ -16,7 +16,222 @@ "m_nodes": [ { "Id": { - "id": 70125315787650 + "id": 18896862840201 + }, + "Name": "SC-EventNode(On Collision Persist event)", + "Components": { + "Component_[11051578760533229880]": { + "$type": "AzEventHandler", + "Id": 11051578760533229880, + "Slots": [ + { + "id": { + "m_id": "{D60E85B8-F645-47F8-92BE-0A0251269168}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18866798069129 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{BFE76B23-D14A-4C0A-83B9-6BC9BB87E542}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{D9A1AFC3-AEF9-4550-877D-D5C8BC460AB9}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{FB927B57-AC8B-4EE4-96F5-9F5712FFEF53}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{6B89E130-60D1-42A4-9C9C-679E84DD6389}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{2D6BF58F-C430-4795-9470-D1C44EA23B9D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Simulated Body Handle", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{5DE43B16-4121-4CFF-8BA0-56099371A836}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Collision Event", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{1C7070F8-D281-414C-BF9B-D6B6B5F12926}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 18866798069129 + } + } + ], + "slotName": "On Collision Persist event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "isNullPointer": true, + "label": "On Collision Persist event" + } + ], + "m_azEventEntry": { + "m_eventName": "On Collision Persist event", + "m_parameterSlotIds": [ + { + "m_id": "{2D6BF58F-C430-4795-9470-D1C44EA23B9D}" + }, + { + "m_id": "{5DE43B16-4121-4CFF-8BA0-56099371A836}" + }, + { + "m_id": "{2D6BF58F-C430-4795-9470-D1C44EA23B9D}" + }, + { + "m_id": "{5DE43B16-4121-4CFF-8BA0-56099371A836}" + } + ], + "m_parameterNames": [ + { + "m_id": "{2D6BF58F-C430-4795-9470-D1C44EA23B9D}" + }, + { + "m_id": "{5DE43B16-4121-4CFF-8BA0-56099371A836}" + }, + { + "m_id": "{2D6BF58F-C430-4795-9470-D1C44EA23B9D}" + }, + { + "m_id": "{5DE43B16-4121-4CFF-8BA0-56099371A836}" + } + ], + "m_eventSlotId": { + "m_id": "{1C7070F8-D281-414C-BF9B-D6B6B5F12926}" + } + } + } + } + }, + { + "Id": { + "id": 18939812513161 }, "Name": "SC-Node(Print)", "Components": { @@ -65,7 +280,7 @@ }, { "Id": { - "id": 70095251016578 + "id": 18849618199945 }, "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", "Components": { @@ -159,7 +374,7 @@ }, { "Id": { - "id": 70163970493314 + "id": 18871093036425 }, "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", "Components": { @@ -253,7 +468,7 @@ }, { "Id": { - "id": 70172560427906 + "id": 18931222578569 }, "Name": "SC-Node((NodeFunctionGenericMultiReturn)<{bool(const EntityId& )}* IsActiveTraits >)", "Components": { @@ -347,7 +562,7 @@ }, { "Id": { - "id": 70121020820354 + "id": 18909747742089 }, "Name": "SC Node(GetVariable)", "Components": { @@ -418,216 +633,7 @@ }, { "Id": { - "id": 70112430885762 - }, - "Name": "SC-EventNode(On Collision Begin event)", - "Components": { - "Component_[14000580813563007620]": { - "$type": "AzEventHandler", - "Id": 14000580813563007620, - "Slots": [ - { - "id": { - "m_id": "{74B54CB0-A72C-4A6A-ABB3-9EA6529DDF78}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - { - "$type": "ConnectionLimitContract", - "limit": 1 - }, - { - "$type": "RestrictedNodeContract", - "m_nodeId": { - "id": 70142495656834 - } - } - ], - "slotName": "Connect", - "toolTip": "Connect the AZ Event to this AZ Event Handler.", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{8DDBE14E-02C2-49A2-ABB1-47EC97B5D970}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Disconnect", - "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{0EE06A10-EB10-4C5D-AB8F-D7B8B7A921E0}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "On Connected", - "toolTip": "Signaled when a connection has taken place.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{8B0C1988-7783-42F5-A3C5-42184B5DC7FE}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "On Disconnected", - "toolTip": "Signaled when this event handler is disconnected.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{E32049C5-FF99-4E74-91EC-D007B0D6EF7B}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "OnEvent", - "toolTip": "Triggered when the AZ Event invokes Signal() function.", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - }, - "IsLatent": true - }, - { - "id": { - "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Simulated Body Handle", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{53C0CD3E-D0FC-5D90-9E9B-EF364D430B08}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Collision Event", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{7602AA36-792C-4BDC-BDF8-AA16792151A3}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{F7A6B1A7-EB72-45DE-8A87-7C6E36FCA2A3}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - null, - { - "$type": "ConnectionLimitContract", - "limit": 1 - }, - { - "$type": "RestrictedNodeContract", - "m_nodeId": { - "id": 70142495656834 - } - } - ], - "slotName": "On Collision Begin event", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - } - ], - "Datums": [ - {} - ], - "m_azEventEntry": { - "m_eventName": "On Collision Begin event", - "m_parameterSlotIds": [ - { - "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" - }, - { - "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" - }, - { - "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" - }, - { - "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" - } - ], - "m_parameterNames": [ - { - "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" - }, - { - "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" - }, - { - "m_id": "{B3D58CDB-A773-47CE-B06D-BA3CF619A8E3}" - }, - { - "m_id": "{51A6844B-AD3E-48C3-8770-20E425CA125A}" - } - ], - "m_eventSlotId": { - "m_id": "{F7A6B1A7-EB72-45DE-8A87-7C6E36FCA2A3}" - } - } - } - } - }, - { - "Id": { - "id": 70099545983874 + "id": 18901157807497 }, "Name": "SC Node(GetVariable)", "Components": { @@ -698,108 +704,7 @@ }, { "Id": { - "id": 70142495656834 - }, - "Name": "SC-Node(GetOnCollisionBeginEvent)", - "Components": { - "Component_[14536104846481825629]": { - "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 14536104846481825629, - "Slots": [ - { - "id": { - "m_id": "{C1CC691F-49A7-4348-89AD-F11BFBE3AFAE}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - null - ], - "slotName": "EntityID: 0", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{88B3237D-3297-4837-A80A-19ECAB4B4D61}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{5AD134C7-A8BC-4BE7-B815-68901BBEBE0D}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{FCF4B185-2AD4-42BD-A304-B36B437CEA61}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Result: Event const CollisionEvent& >", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "EntityID: 0" - } - ], - "methodType": 2, - "methodName": "GetOnCollisionBeginEvent", - "className": "SimulatedBody", - "resultSlotIDs": [ - {} - ], - "prettyClassName": "SimulatedBody" - } - } - }, - { - "Id": { - "id": 70159675526018 + "id": 18853913167241 }, "Name": "EBusEventHandler", "Components": { @@ -1040,108 +945,7 @@ }, { "Id": { - "id": 70168265460610 - }, - "Name": "SC-Node(GetOnCollisionPersistEvent)", - "Components": { - "Component_[2456924078822417742]": { - "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 2456924078822417742, - "Slots": [ - { - "id": { - "m_id": "{76C563E8-85C7-4E2F-A09A-9D982064F966}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - null - ], - "slotName": "EntityID: 0", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{7AE56C6B-CF55-4FC7-AA96-E5845B406017}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{8A08ADFB-F581-40F8-B900-A5A968A11F6D}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{79F0D577-9326-4334-A996-74E400870874}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Result: Event const CollisionEvent& >", - "DisplayDataType": { - "m_type": 4, - "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" - }, - "Descriptor": { - "ConnectionType": 2, - "SlotType": 2 - }, - "DataType": 1 - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "EntityID: 0" - } - ], - "methodType": 2, - "methodName": "GetOnCollisionPersistEvent", - "className": "SimulatedBody", - "resultSlotIDs": [ - {} - ], - "prettyClassName": "SimulatedBody" - } - } - }, - { - "Id": { - "id": 70090956049282 + "id": 18875388003721 }, "Name": "SC-Node(ActivateGameEntity)", "Components": { @@ -1222,7 +1026,7 @@ }, { "Id": { - "id": 70129610754946 + "id": 18888272905609 }, "Name": "SC-Node(ActivateGameEntity)", "Components": { @@ -1303,7 +1107,7 @@ }, { "Id": { - "id": 70176855395202 + "id": 18914042709385 }, "Name": "SC-Node(ActivateGameEntity)", "Components": { @@ -1384,23 +1188,22 @@ }, { "Id": { - "id": 70133905722242 + "id": 18944107480457 }, "Name": "SC-Node(GetOnCollisionEndEvent)", "Components": { - "Component_[6024679188177357420]": { + "Component_[4035501780545896984]": { "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 6024679188177357420, + "Id": 4035501780545896984, "Slots": [ { "id": { - "m_id": "{4C021C78-C51F-40AD-8D0C-E912A7216BEC}" + "m_id": "{76E6B371-B7EF-43E6-BDBE-8BEB7A6CB444}" }, "contracts": [ { "$type": "SlotTypeContract" - }, - null + } ], "slotName": "EntityID: 0", "Descriptor": { @@ -1411,7 +1214,7 @@ }, { "id": { - "m_id": "{F0E14922-5337-4F26-91ED-E23E557B8723}" + "m_id": "{3933A5FE-5430-41E9-AE89-39DBF93EE427}" }, "contracts": [ { @@ -1426,7 +1229,7 @@ }, { "id": { - "m_id": "{84128820-5F2E-497F-9B13-A262484DE323}" + "m_id": "{1F68015F-AB0F-4A63-8FF3-E4EB3EE000C9}" }, "contracts": [ { @@ -1441,7 +1244,7 @@ }, { "id": { - "m_id": "{B825CA1B-36A9-4634-8D66-0C510EC4D4E8}" + "m_id": "{CBF241C4-DB7C-4DCA-AD01-AA806F28AA1A}" }, "contracts": [ { @@ -1479,23 +1282,238 @@ "resultSlotIDs": [ {} ], + "inputSlots": [ + { + "m_id": "{76E6B371-B7EF-43E6-BDBE-8BEB7A6CB444}" + } + ], "prettyClassName": "SimulatedBody" } } }, { "Id": { - "id": 70181150362498 + "id": 18866798069129 }, - "Name": "SC-EventNode(On Collision Persist event)", + "Name": "SC-Node(GetOnCollisionPersistEvent)", "Components": { - "Component_[6434307319231468785]": { - "$type": "AzEventHandler", - "Id": 6434307319231468785, + "Component_[4924826946960882301]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 4924826946960882301, "Slots": [ { "id": { - "m_id": "{EB9CE3A4-B8A4-4436-9E3C-026580D17AC3}" + "m_id": "{DA0047B5-620F-49A9-9322-DDCE6DFF5B69}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{3EE67098-3620-40AE-9463-4812E39075B9}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{FF7196F6-D599-44FC-8481-9DBE522529DF}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{79056EFB-B34F-4702-B206-C9400F3408D6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event const CollisionEvent& >", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 2, + "methodName": "GetOnCollisionPersistEvent", + "className": "SimulatedBody", + "resultSlotIDs": [ + {} + ], + "inputSlots": [ + { + "m_id": "{DA0047B5-620F-49A9-9322-DDCE6DFF5B69}" + } + ], + "prettyClassName": "SimulatedBody" + } + } + }, + { + "Id": { + "id": 18845323232649 + }, + "Name": "SC-Node(GetOnCollisionBeginEvent)", + "Components": { + "Component_[6029479490625241424]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 6029479490625241424, + "Slots": [ + { + "id": { + "m_id": "{6B8EFFB6-8208-4BCB-BA1B-221A215AC0E0}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{ADA8C93D-8987-4537-99CD-A96986C8BF74}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{4C7050D8-46F3-4E72-865E-8F2897430750}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{B647ABD6-B8B1-45CB-ACF4-495E416BB744}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event const CollisionEvent& >", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 2, + "methodName": "GetOnCollisionBeginEvent", + "className": "SimulatedBody", + "resultSlotIDs": [ + {} + ], + "inputSlots": [ + { + "m_id": "{6B8EFFB6-8208-4BCB-BA1B-221A215AC0E0}" + } + ], + "prettyClassName": "SimulatedBody" + } + } + }, + { + "Id": { + "id": 18905452774793 + }, + "Name": "SC-EventNode(On Collision Begin event)", + "Components": { + "Component_[7324959113754460428]": { + "$type": "AzEventHandler", + "Id": 7324959113754460428, + "Slots": [ + { + "id": { + "m_id": "{C3576303-C50B-4466-B3C1-A96F40F0B494}" }, "contracts": [ { @@ -1508,7 +1526,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 70168265460610 + "id": 18845323232649 } } ], @@ -1521,7 +1539,7 @@ }, { "id": { - "m_id": "{E5E8BE86-5B33-452C-BC59-FE4A6482048E}" + "m_id": "{CB06AA39-2756-413B-863E-07A228FAEC7B}" }, "contracts": [ { @@ -1537,7 +1555,7 @@ }, { "id": { - "m_id": "{FBAFC668-BD77-4ABB-8B93-E030D02DF348}" + "m_id": "{4A0BBEC7-22E2-4F4B-A8BF-251A69B33CC3}" }, "contracts": [ { @@ -1553,7 +1571,7 @@ }, { "id": { - "m_id": "{D37C1BFC-8EC1-4C8E-B6C3-FC036891A7ED}" + "m_id": "{2EFD7225-D076-46E0-A998-E1236986A2AD}" }, "contracts": [ { @@ -1569,7 +1587,7 @@ }, { "id": { - "m_id": "{1A994B40-F1C6-4F60-9F44-4CE42732554C}" + "m_id": "{FDC1C72B-2C39-43BA-87B4-2E88D1C2F82A}" }, "contracts": [ { @@ -1586,7 +1604,7 @@ }, { "id": { - "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + "m_id": "{E604218A-3CEF-4B0D-9028-5CF64C814C0B}" }, "contracts": [ { @@ -1606,7 +1624,7 @@ }, { "id": { - "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + "m_id": "{1B8B8A0A-6ABF-4660-932E-E2D62FBB238F}" }, "contracts": [ { @@ -1626,13 +1644,12 @@ }, { "id": { - "m_id": "{210423A5-D203-4C26-9B62-2B7DBA3320BD}" + "m_id": "{D4CACFC7-0F7B-4311-9125-D6624D302C50}" }, "contracts": [ { "$type": "SlotTypeContract" }, - null, { "$type": "ConnectionLimitContract", "limit": 1 @@ -1640,11 +1657,11 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 70168265460610 + "id": 18845323232649 } } ], - "slotName": "On Collision Persist event", + "slotName": "On Collision Begin event", "Descriptor": { "ConnectionType": 1, "SlotType": 2 @@ -1653,40 +1670,47 @@ } ], "Datums": [ - {} + { + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "isNullPointer": true, + "label": "On Collision Begin event" + } ], "m_azEventEntry": { - "m_eventName": "On Collision Persist event", + "m_eventName": "On Collision Begin event", "m_parameterSlotIds": [ { - "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + "m_id": "{E604218A-3CEF-4B0D-9028-5CF64C814C0B}" }, { - "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + "m_id": "{1B8B8A0A-6ABF-4660-932E-E2D62FBB238F}" }, { - "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + "m_id": "{E604218A-3CEF-4B0D-9028-5CF64C814C0B}" }, { - "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + "m_id": "{1B8B8A0A-6ABF-4660-932E-E2D62FBB238F}" } ], "m_parameterNames": [ { - "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + "m_id": "{E604218A-3CEF-4B0D-9028-5CF64C814C0B}" }, { - "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + "m_id": "{1B8B8A0A-6ABF-4660-932E-E2D62FBB238F}" }, { - "m_id": "{7C28872F-1A80-496F-9D34-467A80D7B4EF}" + "m_id": "{E604218A-3CEF-4B0D-9028-5CF64C814C0B}" }, { - "m_id": "{0A68E758-7230-4202-A54E-EC7BDA2BE643}" + "m_id": "{1B8B8A0A-6ABF-4660-932E-E2D62FBB238F}" } ], "m_eventSlotId": { - "m_id": "{210423A5-D203-4C26-9B62-2B7DBA3320BD}" + "m_id": "{D4CACFC7-0F7B-4311-9125-D6624D302C50}" } } } @@ -1694,260 +1718,17 @@ }, { "Id": { - "id": 70103840951170 - }, - "Name": "SC-Node(DeactivateGameEntity)", - "Components": { - "Component_[846968981672785962]": { - "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 846968981672785962, - "Slots": [ - { - "id": { - "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - null - ], - "slotName": "EntityID: 0", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "EntityID: 0" - } - ], - "methodType": 0, - "methodName": "DeactivateGameEntity", - "className": "GameEntityContextRequestBus", - "resultSlotIDs": [ - {} - ], - "prettyClassName": "GameEntityContextRequestBus" - } - } - }, - { - "Id": { - "id": 70146790624130 - }, - "Name": "SC-Node(DeactivateGameEntity)", - "Components": { - "Component_[846968981672785962]": { - "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 846968981672785962, - "Slots": [ - { - "id": { - "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - null - ], - "slotName": "EntityID: 0", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "EntityID: 0" - } - ], - "methodType": 0, - "methodName": "DeactivateGameEntity", - "className": "GameEntityContextRequestBus", - "resultSlotIDs": [ - {} - ], - "prettyClassName": "GameEntityContextRequestBus" - } - } - }, - { - "Id": { - "id": 70151085591426 - }, - "Name": "SC-Node(DeactivateGameEntity)", - "Components": { - "Component_[846968981672785962]": { - "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", - "Id": 846968981672785962, - "Slots": [ - { - "id": { - "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - }, - null - ], - "slotName": "EntityID: 0", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 2 - }, - "DataType": 1 - }, - { - "id": { - "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "In", - "Descriptor": { - "ConnectionType": 1, - "SlotType": 1 - } - }, - { - "id": { - "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" - }, - "contracts": [ - { - "$type": "SlotTypeContract" - } - ], - "slotName": "Out", - "Descriptor": { - "ConnectionType": 2, - "SlotType": 1 - } - } - ], - "Datums": [ - { - "scriptCanvasType": { - "m_type": 1 - }, - "isNullPointer": false, - "$type": "EntityId", - "value": { - "id": 2901262558 - }, - "label": "EntityID: 0" - } - ], - "methodType": 0, - "methodName": "DeactivateGameEntity", - "className": "GameEntityContextRequestBus", - "resultSlotIDs": [ - {} - ], - "prettyClassName": "GameEntityContextRequestBus" - } - } - }, - { - "Id": { - "id": 70185445329794 + "id": 18918337676681 }, "Name": "SC-EventNode(On Collision End event)", "Components": { - "Component_[8849170053396419306]": { + "Component_[7576015398665994859]": { "$type": "AzEventHandler", - "Id": 8849170053396419306, + "Id": 7576015398665994859, "Slots": [ { "id": { - "m_id": "{5F5A4D6A-50EF-4561-B5D3-F8CF1C4530F6}" + "m_id": "{63E9373E-95EC-407F-ACED-A5D50598A0D9}" }, "contracts": [ { @@ -1960,7 +1741,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 70133905722242 + "id": 18944107480457 } } ], @@ -1973,7 +1754,7 @@ }, { "id": { - "m_id": "{76FBE35A-BD29-4A8D-8B6E-AC6A2AD2306B}" + "m_id": "{5DF49BC4-1EFB-4312-8844-1BCF61E96610}" }, "contracts": [ { @@ -1989,7 +1770,7 @@ }, { "id": { - "m_id": "{2E933E93-BD7E-4B9D-A9F5-E1A15995E00B}" + "m_id": "{48AB5D80-6670-44CC-B38B-E15CDF47420D}" }, "contracts": [ { @@ -2005,7 +1786,7 @@ }, { "id": { - "m_id": "{1773DFC3-FCF8-43C6-8CBC-B2457A05EFD6}" + "m_id": "{6C053A9E-1317-44A4-826D-79B27C6D8A5A}" }, "contracts": [ { @@ -2021,7 +1802,7 @@ }, { "id": { - "m_id": "{FFBDBAC4-AF71-443C-BD6C-6C9E6BFAD858}" + "m_id": "{DFF1C200-D219-4959-8E01-2BD77B973C40}" }, "contracts": [ { @@ -2038,7 +1819,7 @@ }, { "id": { - "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + "m_id": "{E316BB0C-7C7A-480F-BEFD-6CAEAC01C0D1}" }, "contracts": [ { @@ -2058,7 +1839,7 @@ }, { "id": { - "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + "m_id": "{868EF452-C945-4EAA-990A-CC4998AD1B46}" }, "contracts": [ { @@ -2078,13 +1859,12 @@ }, { "id": { - "m_id": "{BBC0A5CC-0C89-47E1-BDEE-2F21BF6053DC}" + "m_id": "{AF5C00D0-E405-4350-B4B2-0B7FB2CDB410}" }, "contracts": [ { "$type": "SlotTypeContract" }, - null, { "$type": "ConnectionLimitContract", "limit": 1 @@ -2092,7 +1872,7 @@ { "$type": "RestrictedNodeContract", "m_nodeId": { - "id": 70133905722242 + "id": 18944107480457 } } ], @@ -2105,40 +1885,47 @@ } ], "Datums": [ - {} + { + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{4C19E257-F929-524E-80E3-C910C5F3E2D9}" + }, + "isNullPointer": true, + "label": "On Collision End event" + } ], "m_azEventEntry": { "m_eventName": "On Collision End event", "m_parameterSlotIds": [ { - "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + "m_id": "{E316BB0C-7C7A-480F-BEFD-6CAEAC01C0D1}" }, { - "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + "m_id": "{868EF452-C945-4EAA-990A-CC4998AD1B46}" }, { - "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + "m_id": "{E316BB0C-7C7A-480F-BEFD-6CAEAC01C0D1}" }, { - "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + "m_id": "{868EF452-C945-4EAA-990A-CC4998AD1B46}" } ], "m_parameterNames": [ { - "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + "m_id": "{E316BB0C-7C7A-480F-BEFD-6CAEAC01C0D1}" }, { - "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + "m_id": "{868EF452-C945-4EAA-990A-CC4998AD1B46}" }, { - "m_id": "{785405C8-1F85-4C9C-8ABE-C47A9A801BE3}" + "m_id": "{E316BB0C-7C7A-480F-BEFD-6CAEAC01C0D1}" }, { - "m_id": "{734C7A25-3E8A-4E3E-8CB5-E2F3383A3E18}" + "m_id": "{868EF452-C945-4EAA-990A-CC4998AD1B46}" } ], "m_eventSlotId": { - "m_id": "{BBC0A5CC-0C89-47E1-BDEE-2F21BF6053DC}" + "m_id": "{AF5C00D0-E405-4350-B4B2-0B7FB2CDB410}" } } } @@ -2146,7 +1933,250 @@ }, { "Id": { - "id": 70108135918466 + "id": 18892567872905 + }, + "Name": "SC-Node(DeactivateGameEntity)", + "Components": { + "Component_[846968981672785962]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 846968981672785962, + "Slots": [ + { + "id": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "DeactivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18926927611273 + }, + "Name": "SC-Node(DeactivateGameEntity)", + "Components": { + "Component_[846968981672785962]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 846968981672785962, + "Slots": [ + { + "id": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "DeactivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18935517545865 + }, + "Name": "SC-Node(DeactivateGameEntity)", + "Components": { + "Component_[846968981672785962]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 846968981672785962, + "Slots": [ + { + "id": { + "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "EntityID: 0" + } + ], + "methodType": 0, + "methodName": "DeactivateGameEntity", + "className": "GameEntityContextRequestBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "GameEntityContextRequestBus" + } + } + }, + { + "Id": { + "id": 18862503101833 }, "Name": "SC-Node(Gate)", "Components": { @@ -2237,7 +2267,7 @@ }, { "Id": { - "id": 70116725853058 + "id": 18883977938313 }, "Name": "SC-Node(Gate)", "Components": { @@ -2328,7 +2358,7 @@ }, { "Id": { - "id": 70189740297090 + "id": 18922632643977 }, "Name": "SC-Node(Gate)", "Components": { @@ -2419,7 +2449,7 @@ }, { "Id": { - "id": 70138200689538 + "id": 18858208134537 }, "Name": "SC-Node(Print)", "Components": { @@ -2468,7 +2498,7 @@ }, { "Id": { - "id": 70155380558722 + "id": 18879682971017 }, "Name": "SC Node(GetVariable)", "Components": { @@ -2541,7 +2571,7 @@ "m_connections": [ { "Id": { - "id": 70194035264386 + "id": 18948402447753 }, "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", "Components": { @@ -2550,7 +2580,7 @@ "Id": 8790567172666668723, "sourceEndpoint": { "nodeId": { - "id": 70163970493314 + "id": 18871093036425 }, "slotId": { "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" @@ -2558,7 +2588,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70116725853058 + "id": 18883977938313 }, "slotId": { "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" @@ -2569,7 +2599,7 @@ }, { "Id": { - "id": 70198330231682 + "id": 18952697415049 }, "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", "Components": { @@ -2578,7 +2608,7 @@ "Id": 2434331826651875004, "sourceEndpoint": { "nodeId": { - "id": 70163970493314 + "id": 18871093036425 }, "slotId": { "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" @@ -2586,7 +2616,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70116725853058 + "id": 18883977938313 }, "slotId": { "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" @@ -2597,7 +2627,7 @@ }, { "Id": { - "id": 70202625198978 + "id": 18956992382345 }, "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", "Components": { @@ -2606,7 +2636,7 @@ "Id": 11237921104715455686, "sourceEndpoint": { "nodeId": { - "id": 70116725853058 + "id": 18883977938313 }, "slotId": { "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" @@ -2614,7 +2644,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70146790624130 + "id": 18935517545865 }, "slotId": { "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" @@ -2625,7 +2655,7 @@ }, { "Id": { - "id": 70206920166274 + "id": 18961287349641 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", "Components": { @@ -2634,7 +2664,7 @@ "Id": 14362014279952360310, "sourceEndpoint": { "nodeId": { - "id": 70155380558722 + "id": 18879682971017 }, "slotId": { "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" @@ -2642,7 +2672,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70163970493314 + "id": 18871093036425 }, "slotId": { "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" @@ -2653,7 +2683,7 @@ }, { "Id": { - "id": 70211215133570 + "id": 18965582316937 }, "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", "Components": { @@ -2662,7 +2692,7 @@ "Id": 16755694922186694113, "sourceEndpoint": { "nodeId": { - "id": 70116725853058 + "id": 18883977938313 }, "slotId": { "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" @@ -2670,7 +2700,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70090956049282 + "id": 18914042709385 }, "slotId": { "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" @@ -2681,7 +2711,7 @@ }, { "Id": { - "id": 70215510100866 + "id": 18969877284233 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", "Components": { @@ -2690,7 +2720,7 @@ "Id": 1634747738940978819, "sourceEndpoint": { "nodeId": { - "id": 70155380558722 + "id": 18879682971017 }, "slotId": { "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" @@ -2698,7 +2728,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70090956049282 + "id": 18914042709385 }, "slotId": { "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" @@ -2709,7 +2739,7 @@ }, { "Id": { - "id": 70219805068162 + "id": 18974172251529 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", "Components": { @@ -2718,7 +2748,7 @@ "Id": 8821531688847258487, "sourceEndpoint": { "nodeId": { - "id": 70155380558722 + "id": 18879682971017 }, "slotId": { "m_id": "{473E8586-669E-4DDD-B7A8-3A9F5EC510D5}" @@ -2726,7 +2756,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70146790624130 + "id": 18935517545865 }, "slotId": { "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" @@ -2737,7 +2767,7 @@ }, { "Id": { - "id": 70224100035458 + "id": 18978467218825 }, "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", "Components": { @@ -2746,7 +2776,7 @@ "Id": 8561478604291958262, "sourceEndpoint": { "nodeId": { - "id": 70095251016578 + "id": 18931222578569 }, "slotId": { "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" @@ -2754,7 +2784,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70108135918466 + "id": 18862503101833 }, "slotId": { "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" @@ -2765,7 +2795,7 @@ }, { "Id": { - "id": 70228395002754 + "id": 18982762186121 }, "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", "Components": { @@ -2774,7 +2804,7 @@ "Id": 9146734319289132197, "sourceEndpoint": { "nodeId": { - "id": 70095251016578 + "id": 18931222578569 }, "slotId": { "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" @@ -2782,7 +2812,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70108135918466 + "id": 18862503101833 }, "slotId": { "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" @@ -2793,7 +2823,7 @@ }, { "Id": { - "id": 70232689970050 + "id": 18987057153417 }, "Name": "srcEndpoint=(IsActive: Out), destEndpoint=(If: In)", "Components": { @@ -2802,7 +2832,7 @@ "Id": 11833205937891498095, "sourceEndpoint": { "nodeId": { - "id": 70172560427906 + "id": 18849618199945 }, "slotId": { "m_id": "{3E203C3C-5BEE-4D9A-B323-C2E4E1FC6A4E}" @@ -2810,7 +2840,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70189740297090 + "id": 18922632643977 }, "slotId": { "m_id": "{6E61BAF4-4F8C-4D6D-8573-960755DEC094}" @@ -2821,7 +2851,7 @@ }, { "Id": { - "id": 70236984937346 + "id": 18991352120713 }, "Name": "srcEndpoint=(IsActive: Result: Boolean), destEndpoint=(If: Condition)", "Components": { @@ -2830,7 +2860,7 @@ "Id": 10467104857840052907, "sourceEndpoint": { "nodeId": { - "id": 70172560427906 + "id": 18849618199945 }, "slotId": { "m_id": "{14EE86BB-E7E2-4210-B5ED-8F543D82F66C}" @@ -2838,7 +2868,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70189740297090 + "id": 18922632643977 }, "slotId": { "m_id": "{3C9FBBC2-3934-4C35-B959-9E26F93AB525}" @@ -2849,7 +2879,7 @@ }, { "Id": { - "id": 70241279904642 + "id": 18995647088009 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", "Components": { @@ -2858,7 +2888,7 @@ "Id": 1012188603409101617, "sourceEndpoint": { "nodeId": { - "id": 70099545983874 + "id": 18901157807497 }, "slotId": { "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" @@ -2866,7 +2896,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70095251016578 + "id": 18931222578569 }, "slotId": { "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" @@ -2877,7 +2907,7 @@ }, { "Id": { - "id": 70245574871938 + "id": 18999942055305 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(IsActive: EntityID: Entity Id)", "Components": { @@ -2886,7 +2916,7 @@ "Id": 5402619035508314979, "sourceEndpoint": { "nodeId": { - "id": 70121020820354 + "id": 18909747742089 }, "slotId": { "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" @@ -2894,7 +2924,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70172560427906 + "id": 18849618199945 }, "slotId": { "m_id": "{170B4D1A-5D4A-466F-98AF-A51747B2623A}" @@ -2905,7 +2935,7 @@ }, { "Id": { - "id": 70249869839234 + "id": 19004237022601 }, "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", "Components": { @@ -2914,7 +2944,7 @@ "Id": 18435267100506239768, "sourceEndpoint": { "nodeId": { - "id": 70108135918466 + "id": 18862503101833 }, "slotId": { "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" @@ -2922,7 +2952,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70151085591426 + "id": 18892567872905 }, "slotId": { "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" @@ -2933,7 +2963,7 @@ }, { "Id": { - "id": 70254164806530 + "id": 19008531989897 }, "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", "Components": { @@ -2942,7 +2972,7 @@ "Id": 15164751479546717561, "sourceEndpoint": { "nodeId": { - "id": 70108135918466 + "id": 18862503101833 }, "slotId": { "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" @@ -2950,7 +2980,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70176855395202 + "id": 18875388003721 }, "slotId": { "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" @@ -2961,7 +2991,7 @@ }, { "Id": { - "id": 70258459773826 + "id": 19012826957193 }, "Name": "srcEndpoint=(If: True), destEndpoint=(DeactivateGameEntity: In)", "Components": { @@ -2970,7 +3000,7 @@ "Id": 5061560116223750730, "sourceEndpoint": { "nodeId": { - "id": 70189740297090 + "id": 18922632643977 }, "slotId": { "m_id": "{7BF2F1C4-4831-4B6B-A63B-1046AD1FACFF}" @@ -2978,7 +3008,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70103840951170 + "id": 18926927611273 }, "slotId": { "m_id": "{A015E6E8-A025-4A2D-B1D4-E7D8732FCE52}" @@ -2989,7 +3019,7 @@ }, { "Id": { - "id": 70262754741122 + "id": 19017121924489 }, "Name": "srcEndpoint=(If: False), destEndpoint=(ActivateGameEntity: In)", "Components": { @@ -2998,7 +3028,7 @@ "Id": 10711100284272855896, "sourceEndpoint": { "nodeId": { - "id": 70189740297090 + "id": 18922632643977 }, "slotId": { "m_id": "{EDE70327-9E66-4A5E-AFE3-B9C4D099021E}" @@ -3006,7 +3036,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70129610754946 + "id": 18888272905609 }, "slotId": { "m_id": "{53670F84-98ED-4559-A2EC-3D2285DBC8E3}" @@ -3017,7 +3047,7 @@ }, { "Id": { - "id": 70267049708418 + "id": 19021416891785 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", "Components": { @@ -3026,7 +3056,7 @@ "Id": 4394555422677501602, "sourceEndpoint": { "nodeId": { - "id": 70099545983874 + "id": 18901157807497 }, "slotId": { "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" @@ -3034,7 +3064,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70151085591426 + "id": 18892567872905 }, "slotId": { "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" @@ -3045,7 +3075,7 @@ }, { "Id": { - "id": 70271344675714 + "id": 19025711859081 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(DeactivateGameEntity: EntityID: 0)", "Components": { @@ -3054,7 +3084,7 @@ "Id": 4685709028181371637, "sourceEndpoint": { "nodeId": { - "id": 70121020820354 + "id": 18909747742089 }, "slotId": { "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" @@ -3062,7 +3092,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70103840951170 + "id": 18926927611273 }, "slotId": { "m_id": "{993AA3E4-ABCF-40FF-9CCB-030F22627151}" @@ -3073,7 +3103,7 @@ }, { "Id": { - "id": 70275639643010 + "id": 19030006826377 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", "Components": { @@ -3082,7 +3112,7 @@ "Id": 3306462520084951475, "sourceEndpoint": { "nodeId": { - "id": 70121020820354 + "id": 18909747742089 }, "slotId": { "m_id": "{640B69D0-23E0-4A8E-BB94-477CFDE2E5F5}" @@ -3090,7 +3120,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70129610754946 + "id": 18888272905609 }, "slotId": { "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" @@ -3101,7 +3131,7 @@ }, { "Id": { - "id": 70279934610306 + "id": 19034301793673 }, "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3110,7 +3140,7 @@ "Id": 17145465513158447772, "sourceEndpoint": { "nodeId": { - "id": 70146790624130 + "id": 18935517545865 }, "slotId": { "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" @@ -3118,7 +3148,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70125315787650 + "id": 18939812513161 }, "slotId": { "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" @@ -3129,7 +3159,7 @@ }, { "Id": { - "id": 70284229577602 + "id": 19038596760969 }, "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3138,7 +3168,7 @@ "Id": 14069026837818796272, "sourceEndpoint": { "nodeId": { - "id": 70090956049282 + "id": 18914042709385 }, "slotId": { "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" @@ -3146,7 +3176,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70138200689538 + "id": 18858208134537 }, "slotId": { "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" @@ -3157,7 +3187,7 @@ }, { "Id": { - "id": 70288524544898 + "id": 19042891728265 }, "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3166,7 +3196,7 @@ "Id": 7728736156493449863, "sourceEndpoint": { "nodeId": { - "id": 70151085591426 + "id": 18892567872905 }, "slotId": { "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" @@ -3174,7 +3204,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70125315787650 + "id": 18939812513161 }, "slotId": { "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" @@ -3185,7 +3215,7 @@ }, { "Id": { - "id": 70292819512194 + "id": 19047186695561 }, "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3194,7 +3224,7 @@ "Id": 10386336352272981702, "sourceEndpoint": { "nodeId": { - "id": 70176855395202 + "id": 18875388003721 }, "slotId": { "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" @@ -3202,7 +3232,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70138200689538 + "id": 18858208134537 }, "slotId": { "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" @@ -3213,7 +3243,7 @@ }, { "Id": { - "id": 70297114479490 + "id": 19051481662857 }, "Name": "srcEndpoint=(DeactivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3222,7 +3252,7 @@ "Id": 16807949046056318365, "sourceEndpoint": { "nodeId": { - "id": 70103840951170 + "id": 18926927611273 }, "slotId": { "m_id": "{925E7BB1-22EB-46A2-98E2-9A9805A4D019}" @@ -3230,7 +3260,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70125315787650 + "id": 18939812513161 }, "slotId": { "m_id": "{8A68C668-FF05-4B9C-8AF3-20BA7AC5A783}" @@ -3241,7 +3271,7 @@ }, { "Id": { - "id": 70301409446786 + "id": 19055776630153 }, "Name": "srcEndpoint=(ActivateGameEntity: Out), destEndpoint=(Print: In)", "Components": { @@ -3250,7 +3280,7 @@ "Id": 13893900813580744359, "sourceEndpoint": { "nodeId": { - "id": 70129610754946 + "id": 18888272905609 }, "slotId": { "m_id": "{1904FF69-ECF6-47AC-9318-2EBDAA8A5485}" @@ -3258,7 +3288,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70138200689538 + "id": 18858208134537 }, "slotId": { "m_id": "{451A59EF-BD5D-4E7D-82BE-3B4E7EAF9B48}" @@ -3269,7 +3299,7 @@ }, { "Id": { - "id": 70305704414082 + "id": 19060071597449 }, "Name": "srcEndpoint=(Get Variable: EntityID), destEndpoint=(ActivateGameEntity: EntityID: 0)", "Components": { @@ -3278,7 +3308,7 @@ "Id": 3566132196647215905, "sourceEndpoint": { "nodeId": { - "id": 70099545983874 + "id": 18901157807497 }, "slotId": { "m_id": "{6DDB4692-35F9-4570-B914-951F1FFAB089}" @@ -3286,7 +3316,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70176855395202 + "id": 18875388003721 }, "slotId": { "m_id": "{4BCEF1F2-EB16-44C9-837F-CA936DAC9A2F}" @@ -3297,7 +3327,7 @@ }, { "Id": { - "id": 70309999381378 + "id": 19064366564745 }, "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", "Components": { @@ -3306,7 +3336,7 @@ "Id": 15737173947743935362, "sourceEndpoint": { "nodeId": { - "id": 70155380558722 + "id": 18879682971017 }, "slotId": { "m_id": "{B36D2C46-0A2B-4C90-B57C-5D9B7D3C1A63}" @@ -3314,7 +3344,7 @@ }, "targetEndpoint": { "nodeId": { - "id": 70163970493314 + "id": 18871093036425 }, "slotId": { "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" @@ -3325,24 +3355,248 @@ }, { "Id": { - "id": 70314294348674 + "id": 19068661532041 }, - "Name": "srcEndpoint=(On Collision Begin event: OnEvent), destEndpoint=(Get Variable: In)", + "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", "Components": { - "Component_[6115424509860805504]": { + "Component_[10250827968868397862]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 6115424509860805504, + "Id": 10250827968868397862, "sourceEndpoint": { "nodeId": { - "id": 70112430885762 + "id": 18901157807497 }, "slotId": { - "m_id": "{E32049C5-FF99-4E74-91EC-D007B0D6EF7B}" + "m_id": "{DF9C6AFF-531F-4E74-80CC-1F6889A1CE9E}" } }, "targetEndpoint": { "nodeId": { - "id": 70155380558722 + "id": 18931222578569 + }, + "slotId": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + } + } + } + } + }, + { + "Id": { + "id": 19072956499337 + }, + "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", + "Components": { + "Component_[2090477647964111499]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2090477647964111499, + "sourceEndpoint": { + "nodeId": { + "id": 18909747742089 + }, + "slotId": { + "m_id": "{6B862981-524C-4643-A2C2-9454CB1FD552}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18849618199945 + }, + "slotId": { + "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + } + } + } + } + }, + { + "Id": { + "id": 19077251466633 + }, + "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Begin event: On Collision Begin event)", + "Components": { + "Component_[2569723425229584356]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2569723425229584356, + "sourceEndpoint": { + "nodeId": { + "id": 18845323232649 + }, + "slotId": { + "m_id": "{B647ABD6-B8B1-45CB-ACF4-495E416BB744}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18905452774793 + }, + "slotId": { + "m_id": "{D4CACFC7-0F7B-4311-9125-D6624D302C50}" + } + } + } + } + }, + { + "Id": { + "id": 19081546433929 + }, + "Name": "srcEndpoint=(GetOnCollisionBeginEvent: Out), destEndpoint=(On Collision Begin event: Connect)", + "Components": { + "Component_[15942787264105251949]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 15942787264105251949, + "sourceEndpoint": { + "nodeId": { + "id": 18845323232649 + }, + "slotId": { + "m_id": "{4C7050D8-46F3-4E72-865E-8F2897430750}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18905452774793 + }, + "slotId": { + "m_id": "{C3576303-C50B-4466-B3C1-A96F40F0B494}" + } + } + } + } + }, + { + "Id": { + "id": 19085841401225 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionBeginEvent: In)", + "Components": { + "Component_[8910888382874480678]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8910888382874480678, + "sourceEndpoint": { + "nodeId": { + "id": 18853913167241 + }, + "slotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18845323232649 + }, + "slotId": { + "m_id": "{ADA8C93D-8987-4537-99CD-A96986C8BF74}" + } + } + } + } + }, + { + "Id": { + "id": 19090136368521 + }, + "Name": "srcEndpoint=(GetOnCollisionPersistEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision Persist event: On Collision Persist event)", + "Components": { + "Component_[6698981601680662520]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 6698981601680662520, + "sourceEndpoint": { + "nodeId": { + "id": 18866798069129 + }, + "slotId": { + "m_id": "{79056EFB-B34F-4702-B206-C9400F3408D6}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18896862840201 + }, + "slotId": { + "m_id": "{1C7070F8-D281-414C-BF9B-D6B6B5F12926}" + } + } + } + } + }, + { + "Id": { + "id": 19094431335817 + }, + "Name": "srcEndpoint=(GetOnCollisionPersistEvent: Out), destEndpoint=(On Collision Persist event: Connect)", + "Components": { + "Component_[2650501895853204017]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2650501895853204017, + "sourceEndpoint": { + "nodeId": { + "id": 18866798069129 + }, + "slotId": { + "m_id": "{FF7196F6-D599-44FC-8481-9DBE522529DF}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18896862840201 + }, + "slotId": { + "m_id": "{D60E85B8-F645-47F8-92BE-0A0251269168}" + } + } + } + } + }, + { + "Id": { + "id": 19098726303113 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionPersistEvent: In)", + "Components": { + "Component_[7564290783625553287]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 7564290783625553287, + "sourceEndpoint": { + "nodeId": { + "id": 18853913167241 + }, + "slotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18866798069129 + }, + "slotId": { + "m_id": "{3EE67098-3620-40AE-9463-4812E39075B9}" + } + } + } + } + }, + { + "Id": { + "id": 19103021270409 + }, + "Name": "srcEndpoint=(On Collision Begin event: OnEvent), destEndpoint=(Get Variable: In)", + "Components": { + "Component_[6368337435612519589]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 6368337435612519589, + "sourceEndpoint": { + "nodeId": { + "id": 18905452774793 + }, + "slotId": { + "m_id": "{FDC1C72B-2C39-43BA-87B4-2E88D1C2F82A}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18879682971017 }, "slotId": { "m_id": "{5A04BA4A-061E-4775-A6CE-713E298D4E9A}" @@ -3353,52 +3607,24 @@ }, { "Id": { - "id": 70318589315970 - }, - "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", - "Components": { - "Component_[10250827968868397862]": { - "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 10250827968868397862, - "sourceEndpoint": { - "nodeId": { - "id": 70099545983874 - }, - "slotId": { - "m_id": "{DF9C6AFF-531F-4E74-80CC-1F6889A1CE9E}" - } - }, - "targetEndpoint": { - "nodeId": { - "id": 70095251016578 - }, - "slotId": { - "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" - } - } - } - } - }, - { - "Id": { - "id": 70322884283266 + "id": 19107316237705 }, "Name": "srcEndpoint=(On Collision Persist event: OnEvent), destEndpoint=(Get Variable: In)", "Components": { - "Component_[13286675358080560883]": { + "Component_[12264834104825978898]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 13286675358080560883, + "Id": 12264834104825978898, "sourceEndpoint": { "nodeId": { - "id": 70181150362498 + "id": 18896862840201 }, "slotId": { - "m_id": "{1A994B40-F1C6-4F60-9F44-4CE42732554C}" + "m_id": "{6B89E130-60D1-42A4-9C9C-679E84DD6389}" } }, "targetEndpoint": { "nodeId": { - "id": 70099545983874 + "id": 18901157807497 }, "slotId": { "m_id": "{245126A2-D7FE-4C59-BF8D-46F791EEE730}" @@ -3409,27 +3635,27 @@ }, { "Id": { - "id": 70327179250562 + "id": 19111611205001 }, - "Name": "srcEndpoint=(Get Variable: Out), destEndpoint=(IsActive: In)", + "Name": "srcEndpoint=(GetOnCollisionEndEvent: Result: Event const CollisionEvent& >), destEndpoint=(On Collision End event: On Collision End event)", "Components": { - "Component_[2090477647964111499]": { + "Component_[7813602739286642138]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 2090477647964111499, + "Id": 7813602739286642138, "sourceEndpoint": { "nodeId": { - "id": 70121020820354 + "id": 18944107480457 }, "slotId": { - "m_id": "{6B862981-524C-4643-A2C2-9454CB1FD552}" + "m_id": "{CBF241C4-DB7C-4DCA-AD01-AA806F28AA1A}" } }, "targetEndpoint": { "nodeId": { - "id": 70172560427906 + "id": 18918337676681 }, "slotId": { - "m_id": "{5A9AE174-D5E3-4512-A0BF-BA442C001F00}" + "m_id": "{AF5C00D0-E405-4350-B4B2-0B7FB2CDB410}" } } } @@ -3437,24 +3663,52 @@ }, { "Id": { - "id": 70331474217858 + "id": 19115906172297 }, - "Name": "srcEndpoint=(On Collision End event: OnEvent), destEndpoint=(Get Variable: In)", + "Name": "srcEndpoint=(GetOnCollisionEndEvent: Out), destEndpoint=(On Collision End event: Connect)", "Components": { - "Component_[9355447111337093492]": { + "Component_[16385427931163233532]": { "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", - "Id": 9355447111337093492, + "Id": 16385427931163233532, "sourceEndpoint": { "nodeId": { - "id": 70185445329794 + "id": 18944107480457 }, "slotId": { - "m_id": "{FFBDBAC4-AF71-443C-BD6C-6C9E6BFAD858}" + "m_id": "{1F68015F-AB0F-4A63-8FF3-E4EB3EE000C9}" } }, "targetEndpoint": { "nodeId": { - "id": 70121020820354 + "id": 18918337676681 + }, + "slotId": { + "m_id": "{63E9373E-95EC-407F-ACED-A5D50598A0D9}" + } + } + } + } + }, + { + "Id": { + "id": 19120201139593 + }, + "Name": "srcEndpoint=(On Collision End event: OnEvent), destEndpoint=(Get Variable: In)", + "Components": { + "Component_[11664109633636291302]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11664109633636291302, + "sourceEndpoint": { + "nodeId": { + "id": 18918337676681 + }, + "slotId": { + "m_id": "{DFF1C200-D219-4959-8E01-2BD77B973C40}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18909747742089 }, "slotId": { "m_id": "{7A817841-79D4-41FC-97DA-72E599A770CC}" @@ -3462,6 +3716,34 @@ } } } + }, + { + "Id": { + "id": 19124496106889 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnCollisionEndEvent: In)", + "Components": { + "Component_[7299601167427661211]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 7299601167427661211, + "sourceEndpoint": { + "nodeId": { + "id": 18853913167241 + }, + "slotId": { + "m_id": "{4B50FCC8-C542-42E4-B17C-BD56173F1A26}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 18944107480457 + }, + "slotId": { + "m_id": "{3933A5FE-5430-41E9-AE89-39DBF93EE427}" + } + } + } + } } ] }, @@ -3474,54 +3756,16 @@ "GraphCanvasData": [ { "Key": { - "id": 70086661081986 + "id": 18841028265353 }, "Value": { "ComponentData": { "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { "$type": "SceneComponentSaveData", - "Constructs": [ - { - "Type": 1, - "DataContainer": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{524D8380-AC09-444E-870E-9CEF2535B4A2}": { - "$type": "CommentNodeTextSaveData", - "Comment": "These are disconnected because a bug in Script Canvas with AZ::Events.\n\nOnce the issue is fixed reconnecting the nodes should make the test to pass", - "BackgroundColor": [ - 0.9800000190734863, - 0.9700000286102295, - 0.6499999761581421 - ], - "FontSettings": { - "PixelSize": 32 - } - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -1280.0, - -500.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{014DAF90-9434-4257-9670-6378E4D62A11}" - } - } - } - } - ], "ViewParams": { - "Scale": 0.6573655545525766, - "AnchorX": -1186.554443359375, - "AnchorY": -578.06494140625 + "Scale": 0.829105973051423, + "AnchorX": -1567.9539794921875, + "AnchorY": -593.4102783203125 } } } @@ -3529,315 +3773,7 @@ }, { "Key": { - "id": 70090956049282 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, - -140.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{8B43E9D6-660F-4AD8-ABAF-D2CA12714C8C}" - } - } - } - }, - { - "Key": { - "id": 70095251016578 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "DefaultNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 600.0, - 100.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{FA508AFD-513D-4334-9760-909A9D4C765A}" - } - } - } - }, - { - "Key": { - "id": 70099545983874 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "GetVariableNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 200.0, - 100.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".getVariable" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{4970AE58-0BC4-45EE-B2E9-E14AF347E91F}" - } - } - } - }, - { - "Key": { - "id": 70103840951170 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, - 380.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{5DB80931-443B-48A6-9B96-79152E545DE9}" - } - } - } - }, - { - "Key": { - "id": 70108135918466 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "LogicNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1080.0, - 120.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".logic" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{455C1E31-F37D-4EE7-B954-B0532C66EE2C}" - } - } - } - }, - { - "Key": { - "id": 70112430885762 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "HandlerNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -280.0, - -280.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".azeventhandler" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{7DBDAF02-24F5-4FEF-97F6-5C71F5596B09}" - } - } - } - }, - { - "Key": { - "id": 70116725853058 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "LogicNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1080.0, - -220.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".logic" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{D9B0DBAE-33BB-4DD0-853F-3609B859651E}" - } - } - } - }, - { - "Key": { - "id": 70121020820354 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "GetVariableNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 220.0, - 460.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".getVariable" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{D2E4DE42-76F7-4B2E-838A-49EA403EA569}" - } - } - } - }, - { - "Key": { - "id": 70125315787650 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "StringNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 2000.0, - -160.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{389C6D5B-CE48-4C06-9A9C-BF8A63B50375}" - } - } - } - }, - { - "Key": { - "id": 70129610754946 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, - 560.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{DA5DCC2B-9E77-46F7-8CA9-A2FADE367B25}" - } - } - } - }, - { - "Key": { - "id": 70133905722242 + "id": 18845323232649 }, "Value": { "ComponentData": { @@ -3852,98 +3788,6 @@ "$type": "GeometrySaveData", "Position": [ -880.0, - 400.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{64E2639D-6884-4692-9008-CFDACD35023F}" - } - } - } - }, - { - "Key": { - "id": 70138200689538 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "StringNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 2000.0, - 260.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{6EDB526D-EFA0-44C2-8A0C-9083BE1143D8}" - } - } - } - }, - { - "Key": { - "id": 70142495656834 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -900.0, - -260.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{B9CA5B12-F636-47FE-804B-E11C972D4D8F}" - } - } - } - }, - { - "Key": { - "id": 70146790624130 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 1420.0, -300.0 ] }, @@ -3953,14 +3797,14 @@ }, "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { "$type": "PersistentIdComponentSaveData", - "PersistentId": "{453BE3A7-5198-45D2-A8C8-A343CAA048C1}" + "PersistentId": "{E613A2EF-EEC7-48F5-8A25-06D37B765791}" } } } }, { "Key": { - "id": 70151085591426 + "id": 18849618199945 }, "Value": { "ComponentData": { @@ -3969,60 +3813,28 @@ }, "{328FF15C-C302-458F-A43D-E1794DE0904E}": { "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" + "PaletteOverride": "DefaultNodeTitlePalette" }, "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - 1420.0, - 20.0 + 600.0, + 460.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" + "$type": "StylingComponentSaveData" }, "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { "$type": "PersistentIdComponentSaveData", - "PersistentId": "{0722BECC-EBCA-43E3-8EEC-618BD189E739}" + "PersistentId": "{2B76EE69-5338-4B1A-A4BE-98960F9F71D4}" } } } }, { "Key": { - "id": 70155380558722 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "GetVariableNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 200.0, - -240.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".getVariable" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{6F168FFF-9795-4C98-803C-FC4903E0C0A9}" - } - } - } - }, - { - "Key": { - "id": 70159675526018 + "id": 18853913167241 }, "Value": { "ComponentData": { @@ -4056,7 +3868,99 @@ }, { "Key": { - "id": 70163970493314 + "id": 18858208134537 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 2000.0, + 260.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{6EDB526D-EFA0-44C2-8A0C-9083BE1143D8}" + } + } + } + }, + { + "Key": { + "id": 18862503101833 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + 120.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{455C1E31-F37D-4EE7-B954-B0532C66EE2C}" + } + } + } + }, + { + "Key": { + "id": 18866798069129 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -880.0, + 60.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{99545608-279F-4AD9-B274-44414E4C23C4}" + } + } + } + }, + { + "Key": { + "id": 18871093036425 }, "Value": { "ComponentData": { @@ -4086,68 +3990,7 @@ }, { "Key": { - "id": 70168265460610 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "MethodNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - -900.0, - 40.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData", - "SubStyle": ".method" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{4B279432-B947-45C5-8BF0-473703906A28}" - } - } - } - }, - { - "Key": { - "id": 70172560427906 - }, - "Value": { - "ComponentData": { - "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { - "$type": "NodeSaveData" - }, - "{328FF15C-C302-458F-A43D-E1794DE0904E}": { - "$type": "GeneralNodeTitleComponentSaveData", - "PaletteOverride": "DefaultNodeTitlePalette" - }, - "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { - "$type": "GeometrySaveData", - "Position": [ - 600.0, - 460.0 - ] - }, - "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { - "$type": "StylingComponentSaveData" - }, - "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { - "$type": "PersistentIdComponentSaveData", - "PersistentId": "{2B76EE69-5338-4B1A-A4BE-98960F9F71D4}" - } - } - } - }, - { - "Key": { - "id": 70176855395202 + "id": 18875388003721 }, "Value": { "ComponentData": { @@ -4178,7 +4021,131 @@ }, { "Key": { - "id": 70181150362498 + "id": 18879682971017 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 200.0, + -240.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{6F168FFF-9795-4C98-803C-FC4903E0C0A9}" + } + } + } + }, + { + "Key": { + "id": 18883977938313 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "LogicNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1080.0, + -220.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".logic" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D9B0DBAE-33BB-4DD0-853F-3609B859651E}" + } + } + } + }, + { + "Key": { + "id": 18888272905609 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 560.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{DA5DCC2B-9E77-46F7-8CA9-A2FADE367B25}" + } + } + } + }, + { + "Key": { + "id": 18892567872905 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 20.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{0722BECC-EBCA-43E3-8EEC-618BD189E739}" + } + } + } + }, + { + "Key": { + "id": 18896862840201 }, "Value": { "ComponentData": { @@ -4192,8 +4159,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - -280.0, - 60.0 + -260.0, + 40.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { @@ -4202,14 +4169,45 @@ }, "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { "$type": "PersistentIdComponentSaveData", - "PersistentId": "{752364F1-EDC4-42D0-82CB-84FFE27AE3BC}" + "PersistentId": "{81D06A9B-7E9B-4D71-86F3-094C5AE71E6C}" } } } }, { "Key": { - "id": 70185445329794 + "id": 18901157807497 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 200.0, + 100.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{4970AE58-0BC4-45EE-B2E9-E14AF347E91F}" + } + } + } + }, + { + "Key": { + "id": 18905452774793 }, "Value": { "ComponentData": { @@ -4223,8 +4221,8 @@ "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { "$type": "GeometrySaveData", "Position": [ - -280.0, - 420.0 + -260.0, + -320.0 ] }, "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { @@ -4233,14 +4231,107 @@ }, "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { "$type": "PersistentIdComponentSaveData", - "PersistentId": "{DFC56761-5B10-4D07-A98F-32E24DFA4649}" + "PersistentId": "{62A35A1F-ED7F-4D4A-8E9F-E8875037EF0C}" } } } }, { "Key": { - "id": 70189740297090 + "id": 18909747742089 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "GetVariableNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 220.0, + 460.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".getVariable" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{D2E4DE42-76F7-4B2E-838A-49EA403EA569}" + } + } + } + }, + { + "Key": { + "id": 18914042709385 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + -140.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{8B43E9D6-660F-4AD8-ABAF-D2CA12714C8C}" + } + } + } + }, + { + "Key": { + "id": 18918337676681 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -260.0, + 400.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{8FB39DE9-7038-4B5A-81E9-409FFD3ADF1F}" + } + } + } + }, + { + "Key": { + "id": 18922632643977 }, "Value": { "ComponentData": { @@ -4268,6 +4359,159 @@ } } } + }, + { + "Key": { + "id": 18926927611273 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + 380.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{5DB80931-443B-48A6-9B96-79152E545DE9}" + } + } + } + }, + { + "Key": { + "id": 18931222578569 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "DefaultNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 600.0, + 100.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{FA508AFD-513D-4334-9760-909A9D4C765A}" + } + } + } + }, + { + "Key": { + "id": 18935517545865 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1420.0, + -300.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{453BE3A7-5198-45D2-A8C8-A343CAA048C1}" + } + } + } + }, + { + "Key": { + "id": 18939812513161 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "StringNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 2000.0, + -160.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{389C6D5B-CE48-4C06-9A9C-BF8A63B50375}" + } + } + } + }, + { + "Key": { + "id": 18944107480457 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -900.0, + 400.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{2DF9B4CD-AAD9-4BB8-B35A-6F0C68AB89BC}" + } + } + } } ], "StatisticsHelper": { diff --git a/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly index 1b6fd04102..60cec8af58 100644 --- a/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly +++ b/AutomatedTesting/Levels/Physics/ScriptCanvas_PreUpdateEvent/ScriptCanvas_PreUpdateEvent.ly @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a1e648464adab2e7d3218aa61888676f6f016d65bed18c303273986614fe9a7e -size 6703 +oid sha256:982f085cfb17ce957cd1534e89a6fb5c76bcbe6936caec214ecd422b0a5dbe7b +size 5214 diff --git a/AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas index 2db2f9c88f..bb497e3bf1 100644 --- a/AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PostUpdateEvent.scriptcanvas @@ -1,2356 +1,1441 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "ScriptCanvasData", + "ClassData": { + "m_scriptCanvas": { + "Id": { + "id": 7246990957034 + }, + "Name": "ScriptCanvas_PostUpdateEvent", + "Components": { + "Component_[7859303221537826322]": { + "$type": "EditorGraphVariableManagerComponent", + "Id": 7859303221537826322 + }, + "Component_[8048615284941550971]": { + "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", + "Id": 8048615284941550971, + "m_graphData": { + "m_nodes": [ + { + "Id": { + "id": 7255580891626 + }, + "Name": "SC-EventNode(Postsimulate event)", + "Components": { + "Component_[1026420909310573434]": { + "$type": "AzEventHandler", + "Id": 1026420909310573434, + "Slots": [ + { + "id": { + "m_id": "{298E1FBB-EA4C-461A-BDBD-B143B6240DDA}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 7259875858922 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{0AB59F20-FB04-4F9C-A48D-D2429A97345E}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{A933624F-AD95-44B4-95C7-B72E948B28DE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{81CFBC65-1257-4553-AADD-28941CA5A394}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{9412D23F-5C3C-4BAE-9434-FEF63C61D19F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{491F4CF1-420C-447C-9347-1286E513D99D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 7259875858922 + } + } + ], + "slotName": "Postsimulate event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{F429F985-AF00-529B-8449-16E56694E5F9}" + }, + "isNullPointer": true, + "label": "Postsimulate event" + } + ], + "m_azEventEntry": { + "m_eventName": "Postsimulate event", + "m_eventSlotId": { + "m_id": "{491F4CF1-420C-447C-9347-1286E513D99D}" + } + } + } + } + }, + { + "Id": { + "id": 7264170826218 + }, + "Name": "SC-Node(SetWorldTranslation)", + "Components": { + "Component_[18174025885473549905]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 18174025885473549905, + "Slots": [ + { + "id": { + "m_id": "{517676CA-4595-4065-BEF3-6ACB6863E50D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{903CDBDF-A22B-477B-AA16-8FDC81255835}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Vector3: 1", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{6F5CB726-93B1-42EB-B489-2A9C4EEAE97A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8E82FC83-E0D2-42BB-864F-BE7F205CD4E9}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Source" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "Translation" + } + ], + "methodType": 0, + "methodName": "SetWorldTranslation", + "className": "TransformBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "TransformBus" + } + } + }, + { + "Id": { + "id": 7259875858922 + }, + "Name": "SC-Node(GetOnPostsimulateEvent)", + "Components": { + "Component_[2298887429127007522]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 2298887429127007522, + "Slots": [ + { + "id": { + "m_id": "{8B02A209-89DE-40B9-882E-851A1C82CFEE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{F2AFC1DB-F1B3-4A0A-ABC4-FAFB09CC0EDB}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{5331CDE9-F1F6-4EA0-A8E8-DCB099CF5212}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event<>", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{F429F985-AF00-529B-8449-16E56694E5F9}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "methodType": 2, + "methodName": "GetOnPostsimulateEvent", + "className": "PhysicsSystemInterface", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "PhysicsSystemInterface" + } + } + }, + { + "Id": { + "id": 7268465793514 + }, + "Name": "EBusEventHandler", + "Components": { + "Component_[2481096262197714664]": { + "$type": "EBusEventHandler", + "Id": 2481096262197714664, + "Slots": [ + { + "id": { + "m_id": "{6AFF8E96-F047-4379-93F7-A1E3A0DEA69C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Connect", + "toolTip": "Connect this event handler to the specified entity.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{5261B1DD-E9A8-470F-8CC4-68ADDB423CB5}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect this event handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{52AAD5FF-EB9B-49E4-BE42-5776A21B9676}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnConnected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{A1D62B65-5AC4-4D3E-8F26-4EE6BE9A3A3C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnDisconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{EDA8F8A0-47A4-4359-AB6D-A6B7317CF57C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnFailure", + "toolTip": "Signaled when it is not possible to connect this handler.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{5F7A39A0-01D0-4ED5-B6D4-F16D16E367FE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Source", + "toolTip": "ID used to connect on a specific Event address (Type: EntityId)", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{FEBDC32A-663D-4C24-9490-E47AE860ED35}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{A2CD891C-F7F3-4F87-95C6-3F08456A39C8}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityActivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{BA3D7E71-5ED0-419E-89CC-BED3BB49EB99}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{04DDA62D-DEB6-4106-8AB5-3320F4497DBA}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityDeactivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Source" + } + ], + "m_eventMap": [ + { + "Key": { + "Value": 245425936 + }, + "Value": { + "m_eventName": "OnEntityActivated", + "m_eventId": { + "Value": 245425936 + }, + "m_eventSlotId": { + "m_id": "{A2CD891C-F7F3-4F87-95C6-3F08456A39C8}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{FEBDC32A-663D-4C24-9490-E47AE860ED35}" + } + ], + "m_numExpectedArguments": 1 + } + }, + { + "Key": { + "Value": 4273369222 + }, + "Value": { + "m_eventName": "OnEntityDeactivated", + "m_eventId": { + "Value": 4273369222 + }, + "m_eventSlotId": { + "m_id": "{04DDA62D-DEB6-4106-8AB5-3320F4497DBA}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{BA3D7E71-5ED0-419E-89CC-BED3BB49EB99}" + } + ], + "m_numExpectedArguments": 1 + } + } + ], + "m_ebusName": "EntityBus", + "m_busId": { + "Value": 3358774020 + } + } + } + }, + { + "Id": { + "id": 7251285924330 + }, + "Name": "SC-Node(OperatorAdd)", + "Components": { + "Component_[2947356292726636849]": { + "$type": "OperatorAdd", + "Id": 2947356292726636849, + "Slots": [ + { + "id": { + "m_id": "{365919DD-D8DE-4209-A5B7-1EBF1B84E58C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{4A7D3757-64E3-47D7-B7AF-B27165154631}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1BDE6B10-A2C0-42D3-B954-EC8F756D9854}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "MathOperatorContract", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Vector3", + "toolTip": "An operand to use in performing the specified Operation", + "DisplayDataType": { + "m_type": 8 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{6DF37237-B149-4FC4-8FF8-245ECCFBC542}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "MathOperatorContract", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Vector3", + "toolTip": "An operand to use in performing the specified Operation", + "DisplayDataType": { + "m_type": 8 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{982F1726-1327-49B5-BEB1-D64D9FC7C0D6}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "MathOperatorContract", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Result", + "toolTip": "The result of the specified operation", + "DisplayDataType": { + "m_type": 8 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "Vector3" + }, + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + -1.0, + 0.0, + 0.0 + ], + "label": "Vector3" + } + ] + } + } + }, + { + "Id": { + "id": 7272760760810 + }, + "Name": "SC-Node(GetWorldTranslation)", + "Components": { + "Component_[7906397568238626559]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 7906397568238626559, + "Slots": [ + { + "id": { + "m_id": "{4D8E536D-BAF4-4AAC-A88E-6B082D58420A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{8D0B9B7A-415D-44B1-B66F-A6C859CDF068}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1225D555-C7F9-45E8-B625-A2FFC71A60D6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Vector3", + "DisplayDataType": { + "m_type": 8 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EEBEB400-B5D6-4025-87D8-3DE1EFCCE26A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "isOverloadedStorage": false, + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 281697622333 + }, + "label": "Source" + } + ], + "methodType": 0, + "methodName": "GetWorldTranslation", + "className": "TransformBus", + "resultSlotIDs": [ + { + "m_id": "{1225D555-C7F9-45E8-B625-A2FFC71A60D6}" + } + ], + "prettyClassName": "TransformBus" + } + } + } + ], + "m_connections": [ + { + "Id": { + "id": 7277055728106 + }, + "Name": "srcEndpoint=(GetWorldTranslation: Result: Vector3), destEndpoint=(Add (+): Value)", + "Components": { + "Component_[242178999561252379]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 242178999561252379, + "sourceEndpoint": { + "nodeId": { + "id": 7272760760810 + }, + "slotId": { + "m_id": "{1225D555-C7F9-45E8-B625-A2FFC71A60D6}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7251285924330 + }, + "slotId": { + "m_id": "{1BDE6B10-A2C0-42D3-B954-EC8F756D9854}" + } + } + } + } + }, + { + "Id": { + "id": 7281350695402 + }, + "Name": "srcEndpoint=(GetWorldTranslation: Out), destEndpoint=(Add (+): In)", + "Components": { + "Component_[3863909945377931474]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 3863909945377931474, + "sourceEndpoint": { + "nodeId": { + "id": 7272760760810 + }, + "slotId": { + "m_id": "{EEBEB400-B5D6-4025-87D8-3DE1EFCCE26A}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7251285924330 + }, + "slotId": { + "m_id": "{365919DD-D8DE-4209-A5B7-1EBF1B84E58C}" + } + } + } + } + }, + { + "Id": { + "id": 7285645662698 + }, + "Name": "srcEndpoint=(Add (+): Out), destEndpoint=(SetWorldTranslation: In)", + "Components": { + "Component_[11373809959868110927]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11373809959868110927, + "sourceEndpoint": { + "nodeId": { + "id": 7251285924330 + }, + "slotId": { + "m_id": "{4A7D3757-64E3-47D7-B7AF-B27165154631}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7264170826218 + }, + "slotId": { + "m_id": "{6F5CB726-93B1-42EB-B489-2A9C4EEAE97A}" + } + } + } + } + }, + { + "Id": { + "id": 7289940629994 + }, + "Name": "srcEndpoint=(Add (+): Result), destEndpoint=(SetWorldTranslation: Vector3: 1)", + "Components": { + "Component_[6872695239256977190]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 6872695239256977190, + "sourceEndpoint": { + "nodeId": { + "id": 7251285924330 + }, + "slotId": { + "m_id": "{982F1726-1327-49B5-BEB1-D64D9FC7C0D6}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7264170826218 + }, + "slotId": { + "m_id": "{903CDBDF-A22B-477B-AA16-8FDC81255835}" + } + } + } + } + }, + { + "Id": { + "id": 7294235597290 + }, + "Name": "srcEndpoint=(GetOnPostsimulateEvent: Result: Event<>), destEndpoint=(Postsimulate event: Postsimulate event)", + "Components": { + "Component_[14941476969640620853]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 14941476969640620853, + "sourceEndpoint": { + "nodeId": { + "id": 7259875858922 + }, + "slotId": { + "m_id": "{5331CDE9-F1F6-4EA0-A8E8-DCB099CF5212}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7255580891626 + }, + "slotId": { + "m_id": "{491F4CF1-420C-447C-9347-1286E513D99D}" + } + } + } + } + }, + { + "Id": { + "id": 7298530564586 + }, + "Name": "srcEndpoint=(GetOnPostsimulateEvent: Out), destEndpoint=(Postsimulate event: Connect)", + "Components": { + "Component_[14053430938252148760]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 14053430938252148760, + "sourceEndpoint": { + "nodeId": { + "id": 7259875858922 + }, + "slotId": { + "m_id": "{F2AFC1DB-F1B3-4A0A-ABC4-FAFB09CC0EDB}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7255580891626 + }, + "slotId": { + "m_id": "{298E1FBB-EA4C-461A-BDBD-B143B6240DDA}" + } + } + } + } + }, + { + "Id": { + "id": 7302825531882 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnPostsimulateEvent: In)", + "Components": { + "Component_[2413811060506403971]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2413811060506403971, + "sourceEndpoint": { + "nodeId": { + "id": 7268465793514 + }, + "slotId": { + "m_id": "{A2CD891C-F7F3-4F87-95C6-3F08456A39C8}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7259875858922 + }, + "slotId": { + "m_id": "{8B02A209-89DE-40B9-882E-851A1C82CFEE}" + } + } + } + } + }, + { + "Id": { + "id": 7307120499178 + }, + "Name": "srcEndpoint=(Postsimulate event: OnEvent), destEndpoint=(GetWorldTranslation: In)", + "Components": { + "Component_[1592781785499451182]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 1592781785499451182, + "sourceEndpoint": { + "nodeId": { + "id": 7255580891626 + }, + "slotId": { + "m_id": "{9412D23F-5C3C-4BAE-9434-FEF63C61D19F}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 7272760760810 + }, + "slotId": { + "m_id": "{8D0B9B7A-415D-44B1-B66F-A6C859CDF068}" + } + } + } + } + } + ] + }, + "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", + "versionData": { + "_grammarVersion": 1, + "_runtimeVersion": 1 + }, + "GraphCanvasData": [ + { + "Key": { + "id": 7246990957034 + }, + "Value": { + "ComponentData": { + "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { + "$type": "SceneComponentSaveData", + "ViewParams": { + "Scale": 1.0498028, + "AnchorX": -413.4109802246094, + "AnchorY": -143.83653259277344 + } + } + } + } + }, + { + "Key": { + "id": 7251285924330 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MathNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 640.0, + 120.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{21EF1E23-A534-4534-8AAE-E750DD0BB42F}" + } + } + } + }, + { + "Key": { + "id": 7255580891626 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -140.0, + 80.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{5BF8EBFB-0DC5-4708-B618-671B47FB9B94}" + } + } + } + }, + { + "Key": { + "id": 7259875858922 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -500.0, + 100.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{8FD53D85-4783-4AAB-B779-6C03BAD63717}" + } + } + } + }, + { + "Key": { + "id": 7264170826218 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 1100.0, + 120.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{A6FDC96D-8B0B-4B9E-84CF-A4A6DA49FF2D}" + } + } + } + }, + { + "Key": { + "id": 7268465793514 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -880.0, + 40.0 + ] + }, + "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { + "$type": "EBusHandlerNodeDescriptorSaveData", + "EventIds": [ + { + "Value": 245425936 + } + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{ABEA26C6-312E-4CDB-A78B-22FFFD0C1621}" + } + } + } + }, + { + "Key": { + "id": 7272760760810 + }, + "Value": { + "ComponentData": { + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + 180.0, + 120.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{9CC9588E-0054-4615-B627-F8D04CAD5970}" + } + } + } + } + ], + "CRCCacheMap": [ + { + "Key": { + "Value": 418594340 + }, + "Value": { + "String": "AZPhysicalWorld", + "Count": 1 + } + }, + { + "Key": { + "Value": 3249382599 + }, + "Value": { + "String": "DefaultScene", + "Count": 1 + } + } + ], + "StatisticsHelper": { + "InstanceCounter": [ + { + "Key": 1244476766431948410, + "Value": 1 + }, + { + "Key": 4847610523576971761, + "Value": 1 + }, + { + "Key": 5842116761103598202, + "Value": 1 + }, + { + "Key": 6332589079726754678, + "Value": 1 + }, + { + "Key": 13774516554886911373, + "Value": 1 + }, + { + "Key": 13774516556399355685, + "Value": 1 + } + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas index f355b3e6e9..0cfb3c8c48 100644 --- a/AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas +++ b/AutomatedTesting/ScriptCanvas/ScriptCanvas_PreUpdateEvent.scriptcanvas @@ -1,2417 +1,1494 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "ScriptCanvasData", + "ClassData": { + "m_scriptCanvas": { + "Id": { + "id": 80662787523977 + }, + "Name": "ScriptCanvas_PreUpdateEvent", + "Components": { + "Component_[7859303221537826322]": { + "$type": "EditorGraphVariableManagerComponent", + "Id": 7859303221537826322 + }, + "Component_[8048615284941550971]": { + "$type": "{4D755CA9-AB92-462C-B24F-0B3376F19967} Graph", + "Id": 8048615284941550971, + "m_graphData": { + "m_nodes": [ + { + "Id": { + "id": 80688557327753 + }, + "Name": "EBusEventHandler", + "Components": { + "Component_[10194282752280979681]": { + "$type": "EBusEventHandler", + "Id": 10194282752280979681, + "Slots": [ + { + "id": { + "m_id": "{E76AE1C2-5BE0-4CEA-B2A1-6B5599877A53}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Connect", + "toolTip": "Connect this event handler to the specified entity.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{D55DEAE2-7FE4-4154-B91A-C392E6450BAE}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect this event handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{16B87363-9D49-4344-88D2-743E51706A64}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnConnected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{C354C37D-B6FD-4E17-95CA-4EB7B3F75AD9}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnDisconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{CA917050-D510-4B13-8158-71C72A56B55B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnFailure", + "toolTip": "Signaled when it is not possible to connect this handler.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{895BFE09-55D1-4AB7-AB6D-7D7EDC8AB27F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Source", + "toolTip": "ID used to connect on a specific Event address (Type: EntityId)", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{94B92BA7-AD10-4370-8004-37D6BA6140D0}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{6AAE0625-E567-448A-85EC-002727CB0C9B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityActivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{78A7A34E-7605-42A6-AFDA-B8F33CC997F4}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "EntityID", + "DisplayDataType": { + "m_type": 1 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{639510EC-C5CD-442E-9585-DD0014642379}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "ExecutionSlot:OnEntityDeactivated", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Source" + } + ], + "m_eventMap": [ + { + "Key": { + "Value": 245425936 + }, + "Value": { + "m_eventName": "OnEntityActivated", + "m_eventId": { + "Value": 245425936 + }, + "m_eventSlotId": { + "m_id": "{6AAE0625-E567-448A-85EC-002727CB0C9B}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{94B92BA7-AD10-4370-8004-37D6BA6140D0}" + } + ], + "m_numExpectedArguments": 1 + } + }, + { + "Key": { + "Value": 4273369222 + }, + "Value": { + "m_eventName": "OnEntityDeactivated", + "m_eventId": { + "Value": 4273369222 + }, + "m_eventSlotId": { + "m_id": "{639510EC-C5CD-442E-9585-DD0014642379}" + }, + "m_parameterSlotIds": [ + { + "m_id": "{78A7A34E-7605-42A6-AFDA-B8F33CC997F4}" + } + ], + "m_numExpectedArguments": 1 + } + } + ], + "m_ebusName": "EntityBus", + "m_busId": { + "Value": 3358774020 + } + } + } + }, + { + "Id": { + "id": 80684262360457 + }, + "Name": "SC-Node(GetOnPresimulateEvent)", + "Components": { + "Component_[10220237333641525118]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 10220237333641525118, + "Slots": [ + { + "id": { + "m_id": "{671D1A67-1F82-4BB4-9287-099AA81073DF}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{235F1C50-06B0-4793-BD83-C9F3E8B28479}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{13AE2AAB-FBEB-4851-A148-325652B1FDC1}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Event", + "DisplayDataType": { + "m_type": 4, + "m_azType": "{F0A3166F-115C-5C3E-8D65-28FBA4420028}" + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "methodType": 2, + "methodName": "GetOnPresimulateEvent", + "className": "PhysicsSystemInterface", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "PhysicsSystemInterface" + } + } + }, + { + "Id": { + "id": 80675672425865 + }, + "Name": "SC-Node(OperatorAdd)", + "Components": { + "Component_[11406838928576978587]": { + "$type": "OperatorAdd", + "Id": 11406838928576978587, + "Slots": [ + { + "id": { + "m_id": "{F2AB1C73-D779-4306-A336-96D085EFD20C}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8C84B74E-F975-4957-8039-19E7719327AD}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{0B1A1CA1-9D6A-4402-8953-E62C9329D70A}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "MathOperatorContract", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Vector3", + "toolTip": "An operand to use in performing the specified Operation", + "DisplayDataType": { + "m_type": 8 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{D9E65807-CFEA-4848-A7DB-DEFF328E1100}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "MathOperatorContract", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Vector3", + "toolTip": "An operand to use in performing the specified Operation", + "DisplayDataType": { + "m_type": 8 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{540EF6ED-F6B9-4BCE-A7A9-8271DE09E28E}" + }, + "DynamicTypeOverride": 3, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "MathOperatorContract", + "NativeTypes": [ + { + "m_type": 3 + }, + { + "m_type": 6 + }, + { + "m_type": 8 + }, + { + "m_type": 9 + }, + { + "m_type": 10 + }, + { + "m_type": 11 + }, + { + "m_type": 12 + }, + { + "m_type": 14 + }, + { + "m_type": 15 + } + ] + } + ], + "slotName": "Result", + "toolTip": "The result of the specified operation", + "DisplayDataType": { + "m_type": 8 + }, + "DisplayGroup": { + "Value": 1114760223 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DynamicGroup": { + "Value": 1114760223 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "Vector3" + }, + { + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + -1.0, + 0.0, + 0.0 + ], + "label": "Vector3" + } + ] + } + } + }, + { + "Id": { + "id": 80671377458569 + }, + "Name": "SC-Node(SetWorldTranslation)", + "Components": { + "Component_[18174025885473549905]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 18174025885473549905, + "Slots": [ + { + "id": { + "m_id": "{517676CA-4595-4065-BEF3-6ACB6863E50D}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{903CDBDF-A22B-477B-AA16-8FDC81255835}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "Vector3: 1", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{6F5CB726-93B1-42EB-B489-2A9C4EEAE97A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{8E82FC83-E0D2-42BB-864F-BE7F205CD4E9}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 2901262558 + }, + "label": "Source" + }, + { + "scriptCanvasType": { + "m_type": 8 + }, + "isNullPointer": false, + "$type": "Vector3", + "value": [ + 0.0, + 0.0, + 0.0 + ], + "label": "Translation" + } + ], + "methodType": 0, + "methodName": "SetWorldTranslation", + "className": "TransformBus", + "resultSlotIDs": [ + {} + ], + "prettyClassName": "TransformBus" + } + } + }, + { + "Id": { + "id": 80667082491273 + }, + "Name": "SC-Node(GetWorldTranslation)", + "Components": { + "Component_[7906397568238626559]": { + "$type": "{E42861BD-1956-45AE-8DD7-CCFC1E3E5ACF} Method", + "Id": 7906397568238626559, + "Slots": [ + { + "id": { + "m_id": "{4D8E536D-BAF4-4AAC-A88E-6B082D58420A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null + ], + "slotName": "EntityID: 0", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{8D0B9B7A-415D-44B1-B66F-A6C859CDF068}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "In", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{1225D555-C7F9-45E8-B625-A2FFC71A60D6}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Result: Vector3", + "DisplayDataType": { + "m_type": 8 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{EEBEB400-B5D6-4025-87D8-3DE1EFCCE26A}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Out", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 1 + }, + "isNullPointer": false, + "$type": "EntityId", + "value": { + "id": 284799455595 + }, + "label": "Source" + } + ], + "methodType": 0, + "methodName": "GetWorldTranslation", + "className": "TransformBus", + "resultSlotIDs": [ + { + "m_id": "{1225D555-C7F9-45E8-B625-A2FFC71A60D6}" + } + ], + "prettyClassName": "TransformBus" + } + } + }, + { + "Id": { + "id": 80679967393161 + }, + "Name": "SC-EventNode(Presimulate event)", + "Components": { + "Component_[9821965988545835220]": { + "$type": "AzEventHandler", + "Id": 9821965988545835220, + "Slots": [ + { + "id": { + "m_id": "{785642C6-C68F-4C78-B388-DB2032C55B8B}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 80684262360457 + } + } + ], + "slotName": "Connect", + "toolTip": "Connect the AZ Event to this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{57857370-96BF-4C14-973A-E11CD3ACEE2F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Disconnect", + "toolTip": "Disconnect current AZ Event from this AZ Event Handler.", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{D4C449D4-34FF-4478-A429-7577FFF9A4D0}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Connected", + "toolTip": "Signaled when a connection has taken place.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{A5BADE33-9F5F-494F-95F8-0B88B307F243}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "On Disconnected", + "toolTip": "Signaled when this event handler is disconnected.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + } + }, + { + "id": { + "m_id": "{CECB84BC-6AC2-4C51-A38A-63FE7E01A056}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "OnEvent", + "toolTip": "Triggered when the AZ Event invokes Signal() function.", + "Descriptor": { + "ConnectionType": 2, + "SlotType": 1 + }, + "IsLatent": true + }, + { + "id": { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + } + ], + "slotName": "Tick time", + "DisplayDataType": { + "m_type": 3 + }, + "Descriptor": { + "ConnectionType": 2, + "SlotType": 2 + }, + "DataType": 1 + }, + { + "id": { + "m_id": "{477D1D40-3833-46BB-8DC7-E4DCCF688E99}" + }, + "contracts": [ + { + "$type": "SlotTypeContract" + }, + null, + { + "$type": "ConnectionLimitContract", + "limit": 1 + }, + { + "$type": "RestrictedNodeContract", + "m_nodeId": { + "id": 80684262360457 + } + } + ], + "slotName": "Presimulate event", + "Descriptor": { + "ConnectionType": 1, + "SlotType": 2 + }, + "DataType": 1 + } + ], + "Datums": [ + { + "scriptCanvasType": { + "m_type": 4, + "m_azType": "{F0A3166F-115C-5C3E-8D65-28FBA4420028}" + }, + "isNullPointer": true, + "label": "Presimulate event" + } + ], + "m_azEventEntry": { + "m_eventName": "Presimulate event", + "m_parameterSlotIds": [ + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + } + ], + "m_parameterNames": [ + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + }, + { + "m_id": "{141AA0B1-CA62-45CF-9ED2-FB55354FA26F}" + } + ], + "m_eventSlotId": { + "m_id": "{477D1D40-3833-46BB-8DC7-E4DCCF688E99}" + } + } + } + } + } + ], + "m_connections": [ + { + "Id": { + "id": 80692852295049 + }, + "Name": "srcEndpoint=(GetWorldTranslation: Result: Vector3), destEndpoint=(Add (+): Value)", + "Components": { + "Component_[14061883664044186409]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 14061883664044186409, + "sourceEndpoint": { + "nodeId": { + "id": 80667082491273 + }, + "slotId": { + "m_id": "{1225D555-C7F9-45E8-B625-A2FFC71A60D6}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80675672425865 + }, + "slotId": { + "m_id": "{0B1A1CA1-9D6A-4402-8953-E62C9329D70A}" + } + } + } + } + }, + { + "Id": { + "id": 80697147262345 + }, + "Name": "srcEndpoint=(GetWorldTranslation: Out), destEndpoint=(Add (+): In)", + "Components": { + "Component_[9507558893143824342]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 9507558893143824342, + "sourceEndpoint": { + "nodeId": { + "id": 80667082491273 + }, + "slotId": { + "m_id": "{EEBEB400-B5D6-4025-87D8-3DE1EFCCE26A}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80675672425865 + }, + "slotId": { + "m_id": "{F2AB1C73-D779-4306-A336-96D085EFD20C}" + } + } + } + } + }, + { + "Id": { + "id": 80701442229641 + }, + "Name": "srcEndpoint=(Add (+): Out), destEndpoint=(SetWorldTranslation: In)", + "Components": { + "Component_[15133880696098216097]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 15133880696098216097, + "sourceEndpoint": { + "nodeId": { + "id": 80675672425865 + }, + "slotId": { + "m_id": "{8C84B74E-F975-4957-8039-19E7719327AD}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80671377458569 + }, + "slotId": { + "m_id": "{6F5CB726-93B1-42EB-B489-2A9C4EEAE97A}" + } + } + } + } + }, + { + "Id": { + "id": 80705737196937 + }, + "Name": "srcEndpoint=(Add (+): Result), destEndpoint=(SetWorldTranslation: Vector3: 1)", + "Components": { + "Component_[11733116393313919050]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 11733116393313919050, + "sourceEndpoint": { + "nodeId": { + "id": 80675672425865 + }, + "slotId": { + "m_id": "{540EF6ED-F6B9-4BCE-A7A9-8271DE09E28E}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80671377458569 + }, + "slotId": { + "m_id": "{903CDBDF-A22B-477B-AA16-8FDC81255835}" + } + } + } + } + }, + { + "Id": { + "id": 80710032164233 + }, + "Name": "srcEndpoint=(GetOnPresimulateEvent: Result: Event), destEndpoint=(Presimulate event: Presimulate event)", + "Components": { + "Component_[8351382586130482188]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 8351382586130482188, + "sourceEndpoint": { + "nodeId": { + "id": 80684262360457 + }, + "slotId": { + "m_id": "{13AE2AAB-FBEB-4851-A148-325652B1FDC1}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80679967393161 + }, + "slotId": { + "m_id": "{477D1D40-3833-46BB-8DC7-E4DCCF688E99}" + } + } + } + } + }, + { + "Id": { + "id": 80714327131529 + }, + "Name": "srcEndpoint=(GetOnPresimulateEvent: Out), destEndpoint=(Presimulate event: Connect)", + "Components": { + "Component_[14628666297034614869]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 14628666297034614869, + "sourceEndpoint": { + "nodeId": { + "id": 80684262360457 + }, + "slotId": { + "m_id": "{235F1C50-06B0-4793-BD83-C9F3E8B28479}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80679967393161 + }, + "slotId": { + "m_id": "{785642C6-C68F-4C78-B388-DB2032C55B8B}" + } + } + } + } + }, + { + "Id": { + "id": 80718622098825 + }, + "Name": "srcEndpoint=(EntityBus Handler: ExecutionSlot:OnEntityActivated), destEndpoint=(GetOnPresimulateEvent: In)", + "Components": { + "Component_[16571789671982644265]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 16571789671982644265, + "sourceEndpoint": { + "nodeId": { + "id": 80688557327753 + }, + "slotId": { + "m_id": "{6AAE0625-E567-448A-85EC-002727CB0C9B}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80684262360457 + }, + "slotId": { + "m_id": "{671D1A67-1F82-4BB4-9287-099AA81073DF}" + } + } + } + } + }, + { + "Id": { + "id": 80722917066121 + }, + "Name": "srcEndpoint=(Presimulate event: OnEvent), destEndpoint=(GetWorldTranslation: In)", + "Components": { + "Component_[2247867446063002806]": { + "$type": "{64CA5016-E803-4AC4-9A36-BDA2C890C6EB} Connection", + "Id": 2247867446063002806, + "sourceEndpoint": { + "nodeId": { + "id": 80679967393161 + }, + "slotId": { + "m_id": "{CECB84BC-6AC2-4C51-A38A-63FE7E01A056}" + } + }, + "targetEndpoint": { + "nodeId": { + "id": 80667082491273 + }, + "slotId": { + "m_id": "{8D0B9B7A-415D-44B1-B66F-A6C859CDF068}" + } + } + } + } + } + ] + }, + "m_assetType": "{3E2AC8CD-713F-453E-967F-29517F331784}", + "versionData": { + "_grammarVersion": 1, + "_runtimeVersion": 1 + }, + "m_variableCounter": 2, + "GraphCanvasData": [ + { + "Key": { + "id": 80662787523977 + }, + "Value": { + "ComponentData": { + "{5F84B500-8C45-40D1-8EFC-A5306B241444}": { + "$type": "SceneComponentSaveData", + "ViewParams": { + "Scale": 0.7791539, + "AnchorX": -1672.326904296875, + "AnchorY": -143.74566650390625 + } + } + } + } + }, + { + "Key": { + "id": 80667082491273 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -1380.0, + 180.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{9CC9588E-0054-4615-B627-F8D04CAD5970}" + } + } + } + }, + { + "Key": { + "id": 80671377458569 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -400.0, + 160.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{A6FDC96D-8B0B-4B9E-84CF-A4A6DA49FF2D}" + } + } + } + }, + { + "Key": { + "id": 80675672425865 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MathNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -860.0, + 140.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{45DAC3F8-C64F-4E4D-BEC5-E4E888D02A5B}" + } + } + } + }, + { + "Key": { + "id": 80679967393161 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "HandlerNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -1720.0, + 140.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".azeventhandler" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{23D34A34-DB1F-4E79-A120-B50777838FE0}" + } + } + } + }, + { + "Key": { + "id": 80684262360457 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{328FF15C-C302-458F-A43D-E1794DE0904E}": { + "$type": "GeneralNodeTitleComponentSaveData", + "PaletteOverride": "MethodNodeTitlePalette" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -2080.0, + 140.0 + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData", + "SubStyle": ".method" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{A52D0EA0-17F9-4F50-BC1B-D89AF9E82C8F}" + } + } + } + }, + { + "Key": { + "id": 80688557327753 + }, + "Value": { + "ComponentData": { + "{24CB38BB-1705-4EC5-8F63-B574571B4DCD}": { + "$type": "NodeSaveData" + }, + "{7CC444B1-F9B3-41B5-841B-0C4F2179F111}": { + "$type": "GeometrySaveData", + "Position": [ + -2420.0, + 100.0 + ] + }, + "{9E81C95F-89C0-4476-8E82-63CCC4E52E04}": { + "$type": "EBusHandlerNodeDescriptorSaveData", + "EventIds": [ + { + "Value": 245425936 + } + ] + }, + "{B0B99C8A-03AF-4CF6-A926-F65C874C3D97}": { + "$type": "StylingComponentSaveData" + }, + "{B1F49A35-8408-40DA-B79E-F1E3B64322CE}": { + "$type": "PersistentIdComponentSaveData", + "PersistentId": "{FBA5ADF8-A282-4C7F-A3FF-265E075EE6CA}" + } + } + } + } + ], + "CRCCacheMap": [ + { + "Key": { + "Value": 418594340 + }, + "Value": { + "String": "AZPhysicalWorld", + "Count": 3 + } + }, + { + "Key": { + "Value": 2381303867 + }, + "Value": { + "String": "Az", + "Count": 1 + } + }, + { + "Key": { + "Value": 3249382599 + }, + "Value": { + "String": "DefaultScene", + "Count": 1 + } + } + ], + "StatisticsHelper": { + "InstanceCounter": [ + { + "Key": 1244476766431948410, + "Value": 1 + }, + { + "Key": 4847610523576971761, + "Value": 1 + }, + { + "Key": 5842116761103598202, + "Value": 1 + }, + { + "Key": 13774516554886911373, + "Value": 1 + }, + { + "Key": 13774516556399355685, + "Value": 1 + }, + { + "Key": 16012451037867406043, + "Value": 1 + } + ] + } + } + } + } + } +} \ No newline at end of file From c86a1427a0c3ad186b9083aeb9d74872b6e3d687 Mon Sep 17 00:00:00 2001 From: moraaar Date: Thu, 9 Sep 2021 09:48:32 +0100 Subject: [PATCH 213/355] Fixed ragdoll panel being available in Animation Editor when PhysX gem is enabled. (#3985) Following the same approach as cloth plugin, which is to ask if the system component of the gem is available (in this case PhysX::SystemComponent). Fixes #2540 Signed-off-by: moraaar moraaar@amazon.com --- .../Ragdoll/RagdollNodeInspectorPlugin.cpp | 19 +++++++------------ .../Ragdoll/RagdollNodeInspectorPlugin.h | 2 +- .../Code/Tests/D6JointLimitConfiguration.h | 5 ++--- .../Code/Tests/Mocks/PhysicsSystem.h | 16 ++++++++++++++++ .../Ragdoll/CanCopyPasteColliders.cpp | 5 ++++- .../Ragdoll/CanCopyPasteJointLimits.cpp | 5 ++++- .../Code/Tests/UI/CanAddToSimulatedObject.cpp | 1 + .../Code/Tests/UI/RagdollEditTests.cpp | 1 + 8 files changed, 36 insertions(+), 18 deletions(-) diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp b/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp index 171100592d..cb5c525cec 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.cpp @@ -50,26 +50,21 @@ namespace EMotionFX return newPlugin; } - bool RagdollNodeInspectorPlugin::PhysXGemAvailable() const + bool RagdollNodeInspectorPlugin::IsPhysXGemAvailable() const { AZ::SerializeContext* serializeContext = nullptr; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); - if (serializeContext) - { - // TypeId of D6JointLimitConfiguration - const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(AZ::TypeId::CreateString("{90C5C23D-16C0-4F23-AD50-A190E402388E}")); - if (classData && ColliderHelpers::AreCollidersReflected()) - { - return true; - } - } - return false; + // TypeId of PhysX::SystemComponent + const char* typeIDPhysXSystem = "{85F90819-4D9A-4A77-AB89-68035201F34B}"; + + return serializeContext + && serializeContext->FindClassData(AZ::TypeId::CreateString(typeIDPhysXSystem)); } bool RagdollNodeInspectorPlugin::Init() { - if (PhysXGemAvailable()) + if (IsPhysXGemAvailable() && ColliderHelpers::AreCollidersReflected()) { m_nodeWidget = new RagdollNodeWidget(); m_nodeWidget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); diff --git a/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.h b/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.h index 2df0fc2d95..36a33c1cd3 100644 --- a/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.h +++ b/Gems/EMotionFX/Code/Source/Editor/Plugins/Ragdoll/RagdollNodeInspectorPlugin.h @@ -80,7 +80,7 @@ namespace EMotionFX void OnPasteJointLimits(); private: - bool PhysXGemAvailable() const; + bool IsPhysXGemAvailable() const; RagdollNodeWidget* m_nodeWidget; diff --git a/Gems/EMotionFX/Code/Tests/D6JointLimitConfiguration.h b/Gems/EMotionFX/Code/Tests/D6JointLimitConfiguration.h index c35ed4fefe..edb7b57017 100644 --- a/Gems/EMotionFX/Code/Tests/D6JointLimitConfiguration.h +++ b/Gems/EMotionFX/Code/Tests/D6JointLimitConfiguration.h @@ -14,14 +14,13 @@ namespace EMotionFX { // Add so that RagdollNodeInspectorPlugin::PhysXCharactersGemAvailable() will return the correct value // We duplicated the D6JointLimitConfiguration because it doesn't exist in the test environment. - class D6JointLimitConfiguration + struct D6JointLimitConfiguration : public AzPhysics::JointConfiguration { public: AZ_CLASS_ALLOCATOR(D6JointLimitConfiguration, AZ::SystemAllocator, 0); // This uses the same uuid as the production D6JointLimitConfiguration. - // The Ragdoll UI uses this UUID to see if physx is available. - AZ_RTTI(D6JointLimitConfiguration, "{90C5C23D-16C0-4F23-AD50-A190E402388E}", AzPhysics::JointConfiguration); + AZ_RTTI(D6JointLimitConfiguration, "{88E067B4-21E8-4FFA-9142-6C52605B704C}", AzPhysics::JointConfiguration); static void Reflect(AZ::ReflectContext* context); diff --git a/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h b/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h index a78fe52aa1..882d198092 100644 --- a/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h +++ b/Gems/EMotionFX/Code/Tests/Mocks/PhysicsSystem.h @@ -8,6 +8,8 @@ #pragma once +#include +#include #include #include #include @@ -20,6 +22,20 @@ namespace Physics , AZ::Interface::Registrar { public: + // This uses the same uuid as the production PhysX::SystemComponent. + // The Ragdoll UI uses this UUID to see if physx is available. + AZ_RTTI(MockPhysicsSystem, "{85F90819-4D9A-4A77-AB89-68035201F34B}"); + + static void Reflect(AZ::ReflectContext* context) + { + if (auto serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(0) + ; + } + } + MockPhysicsSystem() { BusConnect(); diff --git a/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteColliders.cpp b/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteColliders.cpp index a30750071e..4f43e7dae5 100644 --- a/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteColliders.cpp +++ b/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteColliders.cpp @@ -39,7 +39,10 @@ namespace EMotionFX UIFixture::SetUp(); - D6JointLimitConfiguration::Reflect(GetSerializeContext()); + AZ::SerializeContext* serializeContext = GetSerializeContext(); + + Physics::MockPhysicsSystem::Reflect(serializeContext); // Required by Ragdoll plugin to fake PhysX Gem is available + D6JointLimitConfiguration::Reflect(serializeContext); EXPECT_CALL(m_jointHelpers, GetSupportedJointTypeIds) .WillRepeatedly(testing::Return(AZStd::vector{ azrtti_typeid() })); diff --git a/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteJointLimits.cpp b/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteJointLimits.cpp index 7fd0ec61e1..8e4fba0dd6 100644 --- a/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteJointLimits.cpp +++ b/Gems/EMotionFX/Code/Tests/ProvidesUI/Ragdoll/CanCopyPasteJointLimits.cpp @@ -41,7 +41,10 @@ namespace EMotionFX { using testing::_; - D6JointLimitConfiguration::Reflect(GetSerializeContext()); + AZ::SerializeContext* serializeContext = GetSerializeContext(); + + Physics::MockPhysicsSystem::Reflect(serializeContext); // Required by Ragdoll plugin to fake PhysX Gem is available + D6JointLimitConfiguration::Reflect(serializeContext); EMStudio::GetMainWindow()->ApplicationModeChanged("Physics"); diff --git a/Gems/EMotionFX/Code/Tests/UI/CanAddToSimulatedObject.cpp b/Gems/EMotionFX/Code/Tests/UI/CanAddToSimulatedObject.cpp index ae1752cddd..e27d558664 100644 --- a/Gems/EMotionFX/Code/Tests/UI/CanAddToSimulatedObject.cpp +++ b/Gems/EMotionFX/Code/Tests/UI/CanAddToSimulatedObject.cpp @@ -41,6 +41,7 @@ namespace EMotionFX AZ::SerializeContext* serializeContext = nullptr; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + Physics::MockPhysicsSystem::Reflect(serializeContext); // Required by Ragdoll plugin to fake PhysX Gem is available D6JointLimitConfiguration::Reflect(serializeContext); SetupPluginWindows(); diff --git a/Gems/EMotionFX/Code/Tests/UI/RagdollEditTests.cpp b/Gems/EMotionFX/Code/Tests/UI/RagdollEditTests.cpp index b700a39472..1c39cde5b6 100644 --- a/Gems/EMotionFX/Code/Tests/UI/RagdollEditTests.cpp +++ b/Gems/EMotionFX/Code/Tests/UI/RagdollEditTests.cpp @@ -40,6 +40,7 @@ namespace EMotionFX AZ::SerializeContext* serializeContext = nullptr; AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationBus::Events::GetSerializeContext); + Physics::MockPhysicsSystem::Reflect(serializeContext); // Required by Ragdoll plugin to fake PhysX Gem is available D6JointLimitConfiguration::Reflect(serializeContext); EXPECT_CALL(m_jointHelpers, GetSupportedJointTypeIds) From d82b2a0608dcdd886a583805cb4371507046deb1 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Thu, 9 Sep 2021 10:23:55 +0100 Subject: [PATCH 214/355] Initial test coverage for viewport selection before introducing new 'single' select functionality (#3987) * WIP changes for viewport single select and better integration tests Signed-off-by: hultonha * update test to verify single click selection in the viewport Signed-off-by: hultonha * temporarily remove changes for single select Signed-off-by: hultonha * temporarily remove ChangeSelectedEntity call Signed-off-by: hultonha * initial tests to validate current viewport selection model Signed-off-by: hultonha * some tidy-up before publishing PR Signed-off-by: hultonha * add reference to const type in loop Signed-off-by: hultonha * temporarily disable box select test Signed-off-by: hultonha --- ...IndirectManipulatorViewportInteraction.cpp | 6 + .../ViewportSelection/EditorBoxSelect.cpp | 33 +- .../ViewportSelection/EditorBoxSelect.h | 1 + .../EditorTransformComponentSelection.cpp | 76 ++-- .../EditorTransformComponentSelection.h | 37 +- ...EditorTransformComponentSelectionTests.cpp | 369 +++++++++++++++++- 6 files changed, 432 insertions(+), 90 deletions(-) diff --git a/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp index 14723800ff..730c106301 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/IndirectManipulatorViewportInteraction.cpp @@ -40,6 +40,12 @@ namespace AzManipulatorTestFramework { m_viewportInteraction.UpdateVisibility(); + // ensure we call display viewport 2d to simulate this update step (some state may be + // updated here, e.g. box select) + AzFramework::ViewportDebugDisplayEventBus::Event( + AzToolsFramework::GetEntityContextId(), &AzFramework::ViewportDebugDisplayEvents::DisplayViewport2d, + AzFramework::ViewportInfo{ m_viewportInteraction.GetViewportId() }, m_viewportInteraction.GetDebugDisplay()); + DrawManipulators(); AzToolsFramework::EditorInteractionSystemViewportSelectionRequestBus::Event( AzToolsFramework::GetEntityContextId(), diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp index c39b2c0ebc..eafd37f199 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp @@ -9,8 +9,8 @@ #include "EditorBoxSelect.h" #include -#include #include +#include #include @@ -19,11 +19,15 @@ namespace AzToolsFramework static const AZ::Color s_boxSelectColor = AZ::Color(1.0f, 1.0f, 1.0f, 0.4f); static const float s_boxSelectLineWidth = 2.0f; - void EditorBoxSelect::HandleMouseInteraction( - const ViewportInteraction::MouseInteractionEvent& mouseInteraction) + void EditorBoxSelect::HandleMouseInteraction(const ViewportInteraction::MouseInteractionEvent& mouseInteraction) { AZ_PROFILE_FUNCTION(AzToolsFramework); + if (mouseInteraction.m_mouseEvent == ViewportInteraction::MouseEvent::Down) + { + m_cursorPositionAtDownEvent = mouseInteraction.m_mouseInteraction.m_mousePick.m_screenCoordinates; + } + m_cursorState.SetCurrentPosition(mouseInteraction.m_mouseInteraction.m_mousePick.m_screenCoordinates); const auto selectClickEvent = ClickDetectorEventFromViewportInteraction(mouseInteraction); @@ -35,12 +39,7 @@ namespace AzToolsFramework m_leftMouseDown(mouseInteraction); } - m_boxSelectRegion = QRect - { - ViewportInteraction::QPointFromScreenPoint( - mouseInteraction.m_mouseInteraction.m_mousePick.m_screenCoordinates), - QSize { 0, 0 } - }; + m_boxSelectRegion = QRect{ ViewportInteraction::QPointFromScreenPoint(m_cursorPositionAtDownEvent), QSize{ 0, 0 } }; } if (m_boxSelectRegion) @@ -87,11 +86,11 @@ namespace AzToolsFramework AZ::Vector2 viewportSize = AzToolsFramework::GetCameraState(viewportInfo.m_viewportId).m_viewportSize; debugDisplay.DrawWireQuad2d( - AZ::Vector2( - aznumeric_cast(m_boxSelectRegion->x()), aznumeric_cast(m_boxSelectRegion->y())) / viewportSize, + AZ::Vector2(aznumeric_cast(m_boxSelectRegion->x()), aznumeric_cast(m_boxSelectRegion->y())) / viewportSize, AZ::Vector2( aznumeric_cast(m_boxSelectRegion->x()) + aznumeric_cast(m_boxSelectRegion->width()), - aznumeric_cast(m_boxSelectRegion->y()) + aznumeric_cast(m_boxSelectRegion->height())) / viewportSize, + aznumeric_cast(m_boxSelectRegion->y()) + aznumeric_cast(m_boxSelectRegion->height())) / + viewportSize, 0.f); debugDisplay.DepthTestOn(); @@ -101,8 +100,7 @@ namespace AzToolsFramework } } - void EditorBoxSelect::DisplayScene( - const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) + void EditorBoxSelect::DisplayScene(const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) { if (m_displayScene) { @@ -122,15 +120,14 @@ namespace AzToolsFramework m_mouseMove = mouseMove; } - void EditorBoxSelect::InstallLeftMouseUp( - const AZStd::function& leftMouseUp) + void EditorBoxSelect::InstallLeftMouseUp(const AZStd::function& leftMouseUp) { m_leftMouseUp = leftMouseUp; } void EditorBoxSelect::InstallDisplayScene( - const AZStd::function& displayScene) + const AZStd::function& + displayScene) { m_displayScene = displayScene; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h index 8b36ec0a32..f1c59f9fd8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h @@ -81,5 +81,6 @@ namespace AzToolsFramework ViewportInteraction::KeyboardModifiers m_previousModifiers; //!< Modifier keys active on the previous frame. AzFramework::ClickDetector m_clickDetector; //!< Utility type to detect if a mouse click or move has occurred. AzFramework::CursorState m_cursorState; //!< Utility type to track the current cursor position (and movement/delta). + AzFramework::ScreenPoint m_cursorPositionAtDownEvent; //!< The position of the cursor when first potentially starting a box select. }; } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 101d7094db..afcade944a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -44,39 +44,46 @@ namespace AzToolsFramework AZ_CVAR( float, - cl_viewportGizmoAxisLineWidth, + ed_viewportGizmoAxisLineWidth, 4.0f, nullptr, AZ::ConsoleFunctorFlags::Null, "The width of the line for the viewport axis gizmo"); AZ_CVAR( float, - cl_viewportGizmoAxisLineLength, + ed_viewportGizmoAxisLineLength, 0.7f, nullptr, AZ::ConsoleFunctorFlags::Null, "The length of the line for the viewport axis gizmo"); AZ_CVAR( float, - cl_viewportGizmoAxisLabelOffset, + ed_viewportGizmoAxisLabelOffset, 1.15f, nullptr, AZ::ConsoleFunctorFlags::Null, "The offset of the label for the viewport axis gizmo"); AZ_CVAR( float, - cl_viewportGizmoAxisLabelSize, + ed_viewportGizmoAxisLabelSize, 1.0f, nullptr, AZ::ConsoleFunctorFlags::Null, "The size of each label for the viewport axis gizmo"); AZ_CVAR( AZ::Vector2, - cl_viewportGizmoAxisScreenPosition, + ed_viewportGizmoAxisScreenPosition, AZ::Vector2(0.045f, 0.9f), nullptr, AZ::ConsoleFunctorFlags::Null, "The screen position of the gizmo in normalized (0-1) ndc space"); + AZ_CVAR( + bool, + ed_viewportStickySelect, + true, + nullptr, + AZ::ConsoleFunctorFlags::Null, + "Sticky select implies a single click will not change selection with an entity already selected"); // strings related to new viewport interaction model (EditorTransformComponentSelection) static const char* const s_togglePivotTitleRightClick = "Toggle pivot"; @@ -991,14 +998,19 @@ namespace AzToolsFramework // ask the visible entity data cache if the entity is selectable in the viewport // (useful in the context of drawing when we only care about entities we can see) - static bool SelectableInVisibleViewportCache(const EditorVisibleEntityDataCache& entityDataCache, const AZ::EntityId entityId) + // note: return the index if it is selectable, nullopt otherwise + static AZStd::optional SelectableInVisibleViewportCache( + const EditorVisibleEntityDataCache& entityDataCache, const AZ::EntityId entityId) { if (auto entityIndex = entityDataCache.GetVisibleEntityIndexFromId(entityId)) { - return entityDataCache.IsVisibleEntitySelectableInViewport(*entityIndex); + if (entityDataCache.IsVisibleEntitySelectableInViewport(*entityIndex)) + { + return *entityIndex; + } } - return false; + return AZStd::nullopt; } static AZ::ComponentId GetTransformComponentId(const AZ::EntityId entityId) @@ -1709,17 +1721,17 @@ namespace AzToolsFramework m_pivotOverrideFrame.Reset(); } - bool EditorTransformComponentSelection::SelectDeselect(const AZ::EntityId entityIdUnderCursor) + bool EditorTransformComponentSelection::SelectDeselect(const AZ::EntityId entityId) { AZ_PROFILE_FUNCTION(AzToolsFramework); - if (entityIdUnderCursor.IsValid()) + if (entityId.IsValid()) { - if (IsEntitySelectedInternal(entityIdUnderCursor, m_selectedEntityIds)) + if (IsEntitySelectedInternal(entityId, m_selectedEntityIds)) { if (!UndoRedoOperationInProgress()) { - RemoveEntityFromSelection(entityIdUnderCursor); + RemoveEntityFromSelection(entityId); const auto nextEntityIds = EntityIdVectorFromContainer(m_selectedEntityIds); @@ -1742,7 +1754,7 @@ namespace AzToolsFramework { if (!UndoRedoOperationInProgress()) { - AddEntityToSelection(entityIdUnderCursor); + AddEntityToSelection(entityId); const auto nextEntityIds = EntityIdVectorFromContainer(m_selectedEntityIds); @@ -1783,25 +1795,21 @@ namespace AzToolsFramework // for entities selected with no bounds of their own (just TransformComponent) // check selection against the selection indicator aabb - for (AZ::EntityId entityId : m_selectedEntityIds) + for (const AZ::EntityId& entityId : m_selectedEntityIds) { - if (!SelectableInVisibleViewportCache(*m_entityDataCache, entityId)) + if (const auto entityIndex = SelectableInVisibleViewportCache(*m_entityDataCache, entityId); entityIndex.has_value()) { - continue; - } + const AZ::Transform& worldFromLocal = m_entityDataCache->GetVisibleEntityTransform(*entityIndex); + const AZ::Vector3 boxPosition = worldFromLocal.TransformPoint(CalculateCenterOffset(entityId, m_pivotMode)); + const AZ::Vector3 scaledSize = + AZ::Vector3(s_pivotSize) * CalculateScreenToWorldMultiplier(worldFromLocal.GetTranslation(), cameraState); - AZ::Transform worldFromLocal; - AZ::TransformBus::EventResult(worldFromLocal, entityId, &AZ::TransformBus::Events::GetWorldTM); - - const AZ::Vector3 boxPosition = worldFromLocal.TransformPoint(CalculateCenterOffset(entityId, m_pivotMode)); - - const AZ::Vector3 scaledSize = - AZ::Vector3(s_pivotSize) * CalculateScreenToWorldMultiplier(worldFromLocal.GetTranslation(), cameraState); - - if (AabbIntersectMouseRay( - mouseInteraction.m_mouseInteraction, AZ::Aabb::CreateFromMinMax(boxPosition - scaledSize, boxPosition + scaledSize))) - { - m_cachedEntityIdUnderCursor = entityId; + if (AabbIntersectMouseRay( + mouseInteraction.m_mouseInteraction, + AZ::Aabb::CreateFromMinMax(boxPosition - scaledSize, boxPosition + scaledSize))) + { + m_cachedEntityIdUnderCursor = entityId; + } } } @@ -3490,7 +3498,7 @@ namespace AzToolsFramework const auto cameraProjection = AzFramework::CameraProjection(gizmoCameraState); // screen space offset to move the 2d gizmo around - const AZ::Vector2 screenOffset = AZ::Vector2(cl_viewportGizmoAxisScreenPosition) - AZ::Vector2(0.5f, 0.5f); + const AZ::Vector2 screenOffset = AZ::Vector2(ed_viewportGizmoAxisScreenPosition) - AZ::Vector2(0.5f, 0.5f); // map from a position in world space (relative to the the gizmo camera near the origin) to a position in // screen space @@ -3502,7 +3510,7 @@ namespace AzToolsFramework }; // get all important axis positions in screen space - const float lineLength = cl_viewportGizmoAxisLineLength; + const float lineLength = ed_viewportGizmoAxisLineLength; const auto gizmoStart = calculateGizmoAxis(AZ::Vector3::CreateZero()); const auto gizmoEndAxisX = calculateGizmoAxis(-AZ::Vector3::CreateAxisX() * lineLength); const auto gizmoEndAxisY = calculateGizmoAxis(-AZ::Vector3::CreateAxisY() * lineLength); @@ -3513,7 +3521,7 @@ namespace AzToolsFramework const AZ::Vector2 gizmoAxisZ = gizmoEndAxisZ - gizmoStart; // draw the axes of the gizmo - debugDisplay.SetLineWidth(cl_viewportGizmoAxisLineWidth); + debugDisplay.SetLineWidth(ed_viewportGizmoAxisLineWidth); debugDisplay.SetColor(AZ::Colors::Red); debugDisplay.DrawLine2d(gizmoStart, gizmoEndAxisX, 1.0f); debugDisplay.SetColor(AZ::Colors::Lime); @@ -3522,14 +3530,14 @@ namespace AzToolsFramework debugDisplay.DrawLine2d(gizmoStart, gizmoEndAxisZ, 1.0f); debugDisplay.SetLineWidth(1.0f); - const float labelOffset = cl_viewportGizmoAxisLabelOffset; + const float labelOffset = ed_viewportGizmoAxisLabelOffset; const float screenScale = GetScreenDisplayScaling(viewportId); const auto labelXScreenPosition = (gizmoStart + (gizmoAxisX * labelOffset)) * editorCameraState.m_viewportSize * screenScale; const auto labelYScreenPosition = (gizmoStart + (gizmoAxisY * labelOffset)) * editorCameraState.m_viewportSize * screenScale; const auto labelZScreenPosition = (gizmoStart + (gizmoAxisZ * labelOffset)) * editorCameraState.m_viewportSize * screenScale; // draw the label of of each axis for the gizmo - const float labelSize = cl_viewportGizmoAxisLabelSize; + const float labelSize = ed_viewportGizmoAxisLabelSize; debugDisplay.SetColor(AZ::Colors::White); debugDisplay.Draw2dTextLabel(labelXScreenPosition.GetX(), labelXScreenPosition.GetY(), labelSize, "X", true); debugDisplay.Draw2dTextLabel(labelYScreenPosition.GetX(), labelYScreenPosition.GetY(), labelSize, "Y", true); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h index 42ec423b03..f528a11688 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h @@ -9,6 +9,7 @@ #pragma once #include +#include #include #include #include @@ -32,6 +33,8 @@ namespace AzToolsFramework { + AZ_CVAR_EXTERNED(bool, ed_viewportStickySelect); + class EditorVisibleEntityDataCache; using EntityIdSet = AZStd::unordered_set; //!< Alias for unordered_set of EntityIds. @@ -170,14 +173,11 @@ namespace AzToolsFramework //! ViewportInteraction::ViewportSelectionRequests //! Intercept all viewport mouse events and respond to inputs. - bool HandleMouseInteraction( - const ViewportInteraction::MouseInteractionEvent& mouseInteraction) override; + bool HandleMouseInteraction(const ViewportInteraction::MouseInteractionEvent& mouseInteraction) override; void DisplayViewportSelection( - const AzFramework::ViewportInfo& viewportInfo, - AzFramework::DebugDisplayRequests& debugDisplay) override; + const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override; void DisplayViewportSelection2d( - const AzFramework::ViewportInfo& viewportInfo, - AzFramework::DebugDisplayRequests& debugDisplay) override; + const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) override; //! Add an entity to the current selection void AddEntityToSelection(AZ::EntityId entityId); @@ -206,7 +206,7 @@ namespace AzToolsFramework bool IsEntitySelected(AZ::EntityId entityId) const; void SetSelectedEntities(const EntityIdList& entityIds); void DeselectEntities(); - bool SelectDeselect(AZ::EntityId entityIdUnderCursor); + bool SelectDeselect(AZ::EntityId entityId); void RefreshSelectedEntityIds(); void RefreshSelectedEntityIds(const EntityIdList& selectedEntityIds); @@ -253,11 +253,10 @@ namespace AzToolsFramework void SnapSelectedEntitiesToWorldGrid(float gridSize) override; // EditorManipulatorCommandUndoRedoRequestBus ... - void UndoRedoEntityManipulatorCommand( - AZ::u8 pivotOverride, const AZ::Transform& transform, AZ::EntityId entityId) override; + void UndoRedoEntityManipulatorCommand(AZ::u8 pivotOverride, const AZ::Transform& transform, AZ::EntityId entityId) override; // EditorContextMenuBus... - void PopulateEditorGlobalContextMenu(QMenu* menu, const AZ::Vector2 & point, int flags) override; + void PopulateEditorGlobalContextMenu(QMenu* menu, const AZ::Vector2& point, int flags) override; int GetMenuPosition() const override; AZStd::string GetMenuIdentifier() const override; @@ -266,8 +265,7 @@ namespace AzToolsFramework // ToolsApplicationNotificationBus ... void BeforeEntitySelectionChanged() override; - void AfterEntitySelectionChanged( - const EntityIdList& newlySelectedEntities, const EntityIdList& newlyDeselectedEntities) override; + void AfterEntitySelectionChanged(const EntityIdList& newlySelectedEntities, const EntityIdList& newlyDeselectedEntities) override; // TransformNotificationBus ... void OnTransformChanged(const AZ::Transform& localTM, const AZ::Transform& worldTM) override; @@ -318,7 +316,8 @@ namespace AzToolsFramework EntityIdManipulators m_entityIdManipulators; //!< Mapping from a Manipulator to potentially many EntityIds. EditorBoxSelect m_boxSelect; //!< Type responsible for handling box select. - AZStd::unique_ptr m_manipulatorMoveCommand; //!< Track adjustments to manipulator translation and orientation (during mouse press/move). + //! Track adjustments to manipulator translation and orientation (during mouse press/move). + AZStd::unique_ptr m_manipulatorMoveCommand; AZStd::vector> m_actions; //!< What actions are tied to this handler. ViewportInteraction::KeyboardModifiers m_previousModifiers; //!< What modifiers were held last frame. EditorContextMenu m_contextMenu; //!< Viewport right click context menu. @@ -328,8 +327,10 @@ namespace AzToolsFramework ReferenceFrame m_referenceFrame = ReferenceFrame::Parent; //!< What reference frame is the Manipulator currently operating in. Frame m_axisPreview; //!< Axes of entity at the time of mouse down to indicate delta of translation. bool m_triedToRefresh = false; //!< Did a refresh event occur to recalculate the current Manipulator transform. - bool m_didSetSelectedEntities = false; //!< Was EditorTransformComponentSelection responsible for the most recent entity selection change. - bool m_selectedEntityIdsAndManipulatorsDirty = false; //!< Do the active manipulators need to recalculated after a modification (lock/visibility etc). + //! Was EditorTransformComponentSelection responsible for the most recent entity selection change. + bool m_didSetSelectedEntities = false; + //! Do the active manipulators need to recalculated after a modification (lock/visibility etc). + bool m_selectedEntityIdsAndManipulatorsDirty = false; bool m_transformChangedInternally = false; //!< Was an OnTransformChanged event triggered internally or not. ViewportUi::ClusterId m_transformModeClusterId; //!< Id of the Viewport UI cluster for changing transform mode. ViewportUi::ButtonId m_translateButtonId; //!< Id of the Viewport UI button for translate mode. @@ -363,15 +364,13 @@ namespace AzToolsFramework //! Calculate the orientation for a group of entities based on the incoming reference frame. template - PivotOrientationResult CalculatePivotOrientationForEntityIds( - const EntityIdMap& entityIdMap, const ReferenceFrame referenceFrame); + PivotOrientationResult CalculatePivotOrientationForEntityIds(const EntityIdMap& entityIdMap, const ReferenceFrame referenceFrame); //! Calculate the orientation for a group of entities based on the incoming //! reference frame with possible pivot override. template PivotOrientationResult CalculateSelectionPivotOrientation( - const EntityIdMap& entityIdMap, const OptionalFrame& pivotOverrideFrame, - const ReferenceFrame referenceFrame); + const EntityIdMap& entityIdMap, const OptionalFrame& pivotOverrideFrame, const ReferenceFrame referenceFrame); void SetEntityWorldTranslation(AZ::EntityId entityId, const AZ::Vector3& worldTranslation, bool& internal); void SetEntityLocalTranslation(AZ::EntityId entityId, const AZ::Vector3& localTranslation, bool& internal); diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index c1c158d0f9..dc6e38ecd5 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -6,12 +6,14 @@ * */ +#include #include #include #include #include #include #include +#include #include #include #include @@ -20,10 +22,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -32,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -46,6 +51,14 @@ namespace AZ namespace UnitTest { + AzToolsFramework::EntityIdList SelectedEntities() + { + AzToolsFramework::EntityIdList selectedEntitiesBefore; + AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult( + selectedEntitiesBefore, &AzToolsFramework::ToolsApplicationRequestBus::Events::GetSelectedEntities); + return selectedEntitiesBefore; + } + class EditorEntityVisibilityCacheFixture : public ToolsApplicationFixture { public: @@ -110,6 +123,80 @@ namespace UnitTest EXPECT_FALSE(m_cache.IsVisibleEntityVisible(m_cache.GetVisibleEntityIndexFromId(m_entityIds[2]).value())); } + //! Basic component that implements BoundsRequestBus and EditorComponentSelectionRequestsBus to be compatible + //! with the Editor visibility system. + //! Note: Used for simulating selection (picking) in the viewport. + class BoundsTestComponent + : public AzToolsFramework::Components::EditorComponentBase + , public AzFramework::BoundsRequestBus::Handler + , public AzToolsFramework::EditorComponentSelectionRequestsBus::Handler + { + public: + AZ_EDITOR_COMPONENT( + BoundsTestComponent, "{E6312E9D-8489-4677-9980-C93C328BC92C}", AzToolsFramework::Components::EditorComponentBase); + + static void Reflect(AZ::ReflectContext* context); + + // AZ::Component overrides ... + void Activate() override; + void Deactivate() override; + + // EditorComponentSelectionRequestsBus overrides ... + AZ::Aabb GetEditorSelectionBoundsViewport(const AzFramework::ViewportInfo& viewportInfo) override; + bool EditorSelectionIntersectRayViewport( + const AzFramework::ViewportInfo& viewportInfo, const AZ::Vector3& src, const AZ::Vector3& dir, float& distance) override; + bool SupportsEditorRayIntersect() override; + + // BoundsRequestBus overrides ... + AZ::Aabb GetWorldBounds() override; + AZ::Aabb GetLocalBounds() override; + }; + + AZ::Aabb BoundsTestComponent::GetEditorSelectionBoundsViewport([[maybe_unused]] const AzFramework::ViewportInfo& viewportInfo) + { + return GetWorldBounds(); + } + + bool BoundsTestComponent::EditorSelectionIntersectRayViewport( + [[maybe_unused]] const AzFramework::ViewportInfo& viewportInfo, const AZ::Vector3& src, const AZ::Vector3& dir, float& distance) + { + return AzToolsFramework::AabbIntersectRay(src, dir, GetWorldBounds(), distance); + } + + bool BoundsTestComponent::SupportsEditorRayIntersect() + { + return true; + } + + void BoundsTestComponent::Reflect([[maybe_unused]] AZ::ReflectContext* context) + { + // noop + } + + void BoundsTestComponent::Activate() + { + AzFramework::BoundsRequestBus::Handler::BusConnect(GetEntityId()); + AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusConnect(GetEntityId()); + } + + void BoundsTestComponent::Deactivate() + { + AzToolsFramework::EditorComponentSelectionRequestsBus::Handler::BusDisconnect(); + AzFramework::BoundsRequestBus::Handler::BusDisconnect(); + } + + AZ::Aabb BoundsTestComponent::GetWorldBounds() + { + AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); + AZ::TransformBus::EventResult(worldFromLocal, GetEntityId(), &AZ::TransformBus::Events::GetWorldTM); + return GetLocalBounds().GetTransformedAabb(worldFromLocal); + } + + AZ::Aabb BoundsTestComponent::GetLocalBounds() + { + return AZ::Aabb::CreateFromMinMax(AZ::Vector3(-0.5f), AZ::Vector3(0.5f)); + } + // Fixture to support testing EditorTransformComponentSelection functionality on an Entity selection. class EditorTransformComponentSelectionFixture : public ToolsApplicationFixture { @@ -120,27 +207,52 @@ namespace UnitTest m_entityIds.push_back(m_entityId1); } - void ArrangeIndividualRotatedEntitySelection(const AZ::Quaternion& orientation); - AZStd::optional GetManipulatorTransform() const; - void RefreshManipulators(AzToolsFramework::EditorTransformComponentSelectionRequestBus::Events::RefreshType refreshType); - void SetTransformMode(AzToolsFramework::EditorTransformComponentSelectionRequestBus::Events::Mode transformMode); - void OverrideManipulatorOrientation(const AZ::Quaternion& orientation); - void OverrideManipulatorTranslation(const AZ::Vector3& translation); - public: AZ::EntityId m_entityId1; AzToolsFramework::EntityIdList m_entityIds; }; - void EditorTransformComponentSelectionFixture::ArrangeIndividualRotatedEntitySelection(const AZ::Quaternion& orientation) + class EditorTransformComponentSelectionViewportPickingFixture : public ToolsApplicationFixture { - for (auto entityId : m_entityIds) + public: + void SetUpEditorFixtureImpl() override + { + auto* app = GetApplication(); + // register a simple component implementing BoundsRequestBus and EditorComponentSelectionRequestsBus + app->RegisterComponentDescriptor(BoundsTestComponent::CreateDescriptor()); + + auto createEntityWithBoundsFn = [](const char* entityName) + { + AZ::Entity* entity = nullptr; + AZ::EntityId entityId = CreateDefaultEditorEntity(entityName, &entity); + + entity->Deactivate(); + entity->CreateComponent(); + entity->Activate(); + + return entityId; + }; + + m_entityId1 = createEntityWithBoundsFn("Entity1"); + m_entityId2 = createEntityWithBoundsFn("Entity2"); + m_entityId3 = createEntityWithBoundsFn("Entity3"); + } + + public: + AZ::EntityId m_entityId1; + AZ::EntityId m_entityId2; + AZ::EntityId m_entityId3; + }; + + void ArrangeIndividualRotatedEntitySelection(const AzToolsFramework::EntityIdList& entityIds, const AZ::Quaternion& orientation) + { + for (auto entityId : entityIds) { AZ::TransformBus::Event(entityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, orientation); } } - AZStd::optional EditorTransformComponentSelectionFixture::GetManipulatorTransform() const + AZStd::optional GetManipulatorTransform() { using AzToolsFramework::EditorTransformComponentSelectionRequestBus; @@ -151,8 +263,7 @@ namespace UnitTest return manipulatorTransform; } - void EditorTransformComponentSelectionFixture::RefreshManipulators( - AzToolsFramework::EditorTransformComponentSelectionRequestBus::Events::RefreshType refreshType) + void RefreshManipulators(const AzToolsFramework::EditorTransformComponentSelectionRequestBus::Events::RefreshType refreshType) { using AzToolsFramework::EditorTransformComponentSelectionRequestBus; @@ -160,8 +271,7 @@ namespace UnitTest AzToolsFramework::GetEntityContextId(), &EditorTransformComponentSelectionRequestBus::Events::RefreshManipulators, refreshType); } - void EditorTransformComponentSelectionFixture::SetTransformMode( - AzToolsFramework::EditorTransformComponentSelectionRequestBus::Events::Mode transformMode) + void SetTransformMode(const AzToolsFramework::EditorTransformComponentSelectionRequestBus::Events::Mode transformMode) { using AzToolsFramework::EditorTransformComponentSelectionRequestBus; @@ -169,7 +279,7 @@ namespace UnitTest AzToolsFramework::GetEntityContextId(), &EditorTransformComponentSelectionRequestBus::Events::SetTransformMode, transformMode); } - void EditorTransformComponentSelectionFixture::OverrideManipulatorOrientation(const AZ::Quaternion& orientation) + void OverrideManipulatorOrientation(const AZ::Quaternion& orientation) { using AzToolsFramework::EditorTransformComponentSelectionRequestBus; @@ -178,7 +288,7 @@ namespace UnitTest orientation); } - void EditorTransformComponentSelectionFixture::OverrideManipulatorTranslation(const AZ::Vector3& translation) + void OverrideManipulatorTranslation(const AZ::Vector3& translation) { using AzToolsFramework::EditorTransformComponentSelectionRequestBus; @@ -190,7 +300,7 @@ namespace UnitTest /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // EditorTransformComponentSelection Tests - TEST_F(EditorTransformComponentSelectionFixture, Focus_is_not_changed_while_switching_viewport_interaction_request_instance) + TEST_F(EditorTransformComponentSelectionFixture, FocusIsNotChangedWhileSwitchingViewportInteractionRequestInstance) { // setup a dummy widget and make it the active window to ensure focus in/out events are fired auto dummyWidget = AZStd::make_unique(); @@ -239,7 +349,7 @@ namespace UnitTest // Given AzToolsFramework::SelectEntity(m_entityId1); - ArrangeIndividualRotatedEntitySelection(AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f))); + ArrangeIndividualRotatedEntitySelection(m_entityIds, AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f))); RefreshManipulators(EditorTransformComponentSelectionRequestBus::Events::RefreshType::All); SetTransformMode(EditorTransformComponentSelectionRequestBus::Events::Mode::Rotation); @@ -286,7 +396,7 @@ namespace UnitTest AzToolsFramework::SelectEntity(m_entityId1); const AZ::Quaternion initialEntityOrientation = AZ::Quaternion::CreateRotationX(AZ::DegToRad(90.0f)); - ArrangeIndividualRotatedEntitySelection(initialEntityOrientation); + ArrangeIndividualRotatedEntitySelection(m_entityIds, initialEntityOrientation); // assign new orientation to manipulator which does not match entity orientation OverrideManipulatorOrientation(AZ::Quaternion::CreateRotationZ(AZ::DegToRad(90.0f))); @@ -478,6 +588,227 @@ namespace UnitTest /////////////////////////////////////////////////////////////////////////////////////////////////////////////// } + // fixture for use with the indirect manipulator test framework + using EditorTransformComponentSelectionViewportPickingManipulatorTestFixture = + IndirectCallManipulatorViewportInteractionFixtureMixin; + + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, SingleClickWithNoSelectionWillSelectEntity) + { + AzToolsFramework::ed_viewportStickySelect = true; + + // the initial starting position of the entity + const auto initialTransformWorld = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f)); + AZ::TransformBus::Event(m_entityId1, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorld); + + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + m_cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + + using ::testing::Eq; + auto selectedEntitiesBefore = SelectedEntities(); + EXPECT_TRUE(selectedEntitiesBefore.empty()); + + // calculate the position in screen space of the initial entity position + const auto initialPositionScreen = AzFramework::WorldToScreen(initialTransformWorld.GetTranslation(), m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(initialPositionScreen)->MouseLButtonDown()->MouseLButtonUp(); + + // entity is selected + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter.size(), Eq(1)); + EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId1)); + } + + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, SingleClickOffEntityWithSelectionWillNotDeselectEntity) + { + AzToolsFramework::ed_viewportStickySelect = true; + + // the initial starting position of the entity + AZ::TransformBus::Event( + m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); + + // position in space above the entity + const auto clickOffPositionWorld = AZ::Vector3(5.0f, 15.0f, 12.0f); + + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + m_cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + + AzToolsFramework::SelectEntity(m_entityId1); + + // calculate the position in screen space of the initial position of the entity + const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); + + // click the empty space in the viewport + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(clickOffPositionScreen)->MouseLButtonDown()->MouseLButtonUp(); + + // entity was not deselected + using ::testing::Eq; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter.size(), Eq(1)); + EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId1)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + SingleClickOnNewEntityWithSelectionWillNotChangeSelectedEntity) + { + AzToolsFramework::ed_viewportStickySelect = true; + + // the initial starting position of the entity + AZ::TransformBus::Event( + m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); + + const auto initialTransformWorldSecondEntity = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 10.0f, 10.0f)); + AZ::TransformBus::Event(m_entityId2, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorldSecondEntity); + + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + m_cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + + AzToolsFramework::SelectEntity(m_entityId1); + + // calculate the position in screen space of the second entity + const auto initialPositionScreenSecondEntity = + AzFramework::WorldToScreen(initialTransformWorldSecondEntity.GetTranslation(), m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(initialPositionScreenSecondEntity) + ->MouseLButtonDown() + ->MouseLButtonUp(); + + // entity selection was not changed + using ::testing::Eq; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter.size(), Eq(1)); + EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId1)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + CtrlSingleClickOnNewEntityWithSelectionWillAppendSelectedEntityToSelection) + { + AzToolsFramework::ed_viewportStickySelect = true; + + // the initial starting position of the entity + AZ::TransformBus::Event( + m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); + + const auto initialTransformWorldSecondEntity = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 10.0f, 10.0f)); + AZ::TransformBus::Event(m_entityId2, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorldSecondEntity); + + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + m_cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + + AzToolsFramework::SelectEntity(m_entityId1); + + // calculate the position in screen space of the second entity + const auto initialPositionScreenSecondEntity = + AzFramework::WorldToScreen(initialTransformWorldSecondEntity.GetTranslation(), m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(initialPositionScreenSecondEntity) + ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) + ->MouseLButtonDown() + ->MouseLButtonUp(); + + // entity selection was changed (one entity selected to two) + using ::testing::UnorderedElementsAre; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1, m_entityId2)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + CtrlSingleClickOnEntityInSelectionWillRemoveEntityFromSelection) + { + AzToolsFramework::ed_viewportStickySelect = true; + + // the initial starting position of the entity + AZ::TransformBus::Event( + m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); + + const auto initialTransformWorldSecondEntity = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 10.0f, 10.0f)); + AZ::TransformBus::Event(m_entityId2, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorldSecondEntity); + + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + m_cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + + AzToolsFramework::SelectEntities({ m_entityId1, m_entityId2 }); + + // calculate the position in screen space of the second entity + const auto initialPositionScreenSecondEntity = + AzFramework::WorldToScreen(initialTransformWorldSecondEntity.GetTranslation(), m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(initialPositionScreenSecondEntity) + ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) + ->MouseLButtonDown() + ->MouseLButtonUp(); + + // entity selection was changed (entity2 was deselected) + using ::testing::UnorderedElementsAre; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1)); + } + + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, DISABLED_BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) + { + AzToolsFramework::ed_viewportStickySelect = true; + + // the initial starting position of the entities + AZ::TransformBus::Event( + m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); + AZ::TransformBus::Event( + m_entityId2, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 14.0f, 10.0f))); + AZ::TransformBus::Event( + m_entityId3, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 16.0f, 10.0f))); + + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + m_cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + + using ::testing::Eq; + auto selectedEntitiesBefore = SelectedEntities(); + EXPECT_THAT(selectedEntitiesBefore.size(), Eq(0)); + + // calculate the position in screen space of where to begin and end the box select action + const auto beginningPositionWorldBoxSelectStart = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 13.5f, 10.5f), m_cameraState); + const auto middlePositionWorldBoxSelectStart = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 15.0f, 10.0f), m_cameraState); + const auto endingPositionWorldBoxSelectStart = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); + + // perform a box select in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(beginningPositionWorldBoxSelectStart) + ->MouseLButtonDown() + ->MousePosition(middlePositionWorldBoxSelectStart) + ->MousePosition(endingPositionWorldBoxSelectStart) + ->MouseLButtonUp(); + + // entities are selected + using ::testing::UnorderedElementsAre; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1, m_entityId2, m_entityId3)); + } + using EditorTransformComponentSelectionManipulatorTestFixture = IndirectCallManipulatorViewportInteractionFixtureMixin; From 65de5ec3e61a3f9a998584173c8377136c8ee991 Mon Sep 17 00:00:00 2001 From: sphrose <82213493+sphrose@users.noreply.github.com> Date: Thu, 9 Sep 2021 17:12:18 +0100 Subject: [PATCH 215/355] Change TerrainLayerSpawner to use axis aligned box. (#4019) * Change TerrainLayerSpawner to use axis aligned box. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> * Review change. Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> --- .../Code/Source/Components/TerrainLayerSpawnerComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp index 1c296b2e2c..e17dbd0e93 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp @@ -78,7 +78,7 @@ namespace Terrain void TerrainLayerSpawnerComponent::GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& services) { - services.push_back(AZ_CRC("BoxShapeService")); + services.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); } void TerrainLayerSpawnerComponent::Reflect(AZ::ReflectContext* context) From 6cb2222da8e34114b7b568dba7c2846c62f9ac49 Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Thu, 9 Sep 2021 10:49:39 -0700 Subject: [PATCH 216/355] Linux native window (#3975) Initial implementation of Native Window for Linux Signed-off-by: Steve Pham --- .../Windowing/NativeWindow_Android.cpp | 1 + .../AzFramework/API/ApplicationAPI_Linux.h | 23 ++ .../Application/Application_Linux.cpp | 97 +------ .../Application/Application_Linux_xcb.cpp | 94 +++++++ .../Application/Application_Linux_xcb.h | 40 +++ .../Windowing/NativeWindow_Linux.cpp | 48 +--- .../Windowing/NativeWindow_Linux_xcb.cpp | 244 ++++++++++++++++++ .../Windowing/NativeWindow_Linux_xcb.h | 53 ++++ .../Platform/Linux/platform_linux_files.cmake | 4 + .../RHI/Code/Include/Atom/RHI/SwapChain.h | 6 +- Gems/Atom/RHI/Code/Source/RHI/SwapChain.cpp | 4 +- .../Vulkan/Code/Source/RHI/CommandQueue.cpp | 2 +- .../RHI/Vulkan/Code/Source/RHI/SwapChain.cpp | 12 + 13 files changed, 502 insertions(+), 126 deletions(-) create mode 100644 Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp create mode 100644 Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h create mode 100644 Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp create mode 100644 Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h diff --git a/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp b/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp index e655435011..5910111ab7 100644 --- a/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp +++ b/Code/Framework/AzFramework/Platform/Android/AzFramework/Windowing/NativeWindow_Android.cpp @@ -57,6 +57,7 @@ namespace AzFramework uint32_t NativeWindowImpl_Android::GetDisplayRefreshRate() const { + // [GFX TODO][GHI - 2678] // Using 60 for now until proper support is added return 60; } diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h index 9b57d1d49e..833f4019f8 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/API/ApplicationAPI_Linux.h @@ -55,6 +55,29 @@ namespace AzFramework using LinuxXcbConnectionManagerBus = AZ::EBus; using LinuxXcbConnectionManagerInterface = AZ::Interface; + + class LinuxXcbEventHandler + { + public: + AZ_RTTI(LinuxXcbEventHandler, "{3F756E14-8D74-42FD-843C-4863307710DB}"); + + virtual ~LinuxXcbEventHandler() = default; + + virtual void HandleXcbEvent(xcb_generic_event_t* event) = 0; + }; + + class LinuxXcbEventHandlerBusTraits + : public AZ::EBusTraits + { + public: + ////////////////////////////////////////////////////////////////////////// + // EBusTraits overrides + static constexpr AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; + static constexpr AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + ////////////////////////////////////////////////////////////////////////// + }; + + using LinuxXcbEventHandlerBus = AZ::EBus; #endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB } // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp index 407e256052..5cc147b038 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp @@ -6,101 +6,28 @@ * */ -#include #include +#include "Application_Linux_xcb.h" + //////////////////////////////////////////////////////////////////////////////////////////////////// namespace AzFramework { -#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - class LinuxXcbConnectionManagerImpl - : public LinuxXcbConnectionManagerBus::Handler - { - public: - LinuxXcbConnectionManagerImpl() - { - m_xcbConnection = xcb_connect(nullptr, nullptr); - AZ_Error("ApplicationLinux", m_xcbConnection != nullptr, "Unable to connect to X11 Server."); - LinuxXcbConnectionManagerBus::Handler::BusConnect(); - } - - ~LinuxXcbConnectionManagerImpl() override - { - LinuxXcbConnectionManagerBus::Handler::BusDisconnect(); - xcb_disconnect(m_xcbConnection); - } - xcb_connection_t* GetXcbConnection() const override - { - return m_xcbConnection; - } - private: - xcb_connection_t* m_xcbConnection = nullptr; - }; -#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - - //////////////////////////////////////////////////////////////////////////////////////////////// - class ApplicationLinux - : public Application::Implementation - , public LinuxLifecycleEvents::Bus::Handler - { - public: - //////////////////////////////////////////////////////////////////////////////////////////// - AZ_CLASS_ALLOCATOR(ApplicationLinux, AZ::SystemAllocator, 0); - ApplicationLinux(); - ~ApplicationLinux() override; - - //////////////////////////////////////////////////////////////////////////////////////////// - // Application::Implementation - void PumpSystemEventLoopOnce() override; - void PumpSystemEventLoopUntilEmpty() override; - private: - -#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - AZStd::unique_ptr m_xcbConnectionManager; -#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - - }; - //////////////////////////////////////////////////////////////////////////////////////////////// Application::Implementation* Application::Implementation::Create() { - return aznew ApplicationLinux(); - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - ApplicationLinux::ApplicationLinux() - { - LinuxLifecycleEvents::Bus::Handler::BusConnect(); - #if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - m_xcbConnectionManager = AZStd::make_unique(); - if (LinuxXcbConnectionManagerInterface::Get() == nullptr) - { - LinuxXcbConnectionManagerInterface::Register(m_xcbConnectionManager.get()); - } + return aznew ApplicationLinux_xcb(); +#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND + #error "Linux Window Manager Wayland not supported." + return nullptr; +#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_XLIB + #error "Linux Window Manager XLIB not supported." + return nullptr; +#else + #error "Linux Window Manager not recognized." + return nullptr; #endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB } - //////////////////////////////////////////////////////////////////////////////////////////////// - ApplicationLinux::~ApplicationLinux() - { -#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - if (LinuxXcbConnectionManagerInterface::Get() == m_xcbConnectionManager.get()) - { - LinuxXcbConnectionManagerInterface::Unregister(m_xcbConnectionManager.get()); - } - m_xcbConnectionManager.reset(); -#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB - LinuxLifecycleEvents::Bus::Handler::BusDisconnect(); - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - void ApplicationLinux::PumpSystemEventLoopOnce() - { - } - - //////////////////////////////////////////////////////////////////////////////////////////////// - void ApplicationLinux::PumpSystemEventLoopUntilEmpty() - { - } } // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp new file mode 100644 index 0000000000..aaab67b2a1 --- /dev/null +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include "Application_Linux_xcb.h" + +//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace AzFramework +{ +#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + //////////////////////////////////////////////////////////////////////////////////////////////// + class LinuxXcbConnectionManagerImpl + : public LinuxXcbConnectionManagerBus::Handler + { + public: + LinuxXcbConnectionManagerImpl() + { + m_xcbConnection = xcb_connect(nullptr, nullptr); + AZ_Error("ApplicationLinux", m_xcbConnection != nullptr, "Unable to connect to X11 Server."); + LinuxXcbConnectionManagerBus::Handler::BusConnect(); + } + + ~LinuxXcbConnectionManagerImpl() + { + LinuxXcbConnectionManagerBus::Handler::BusDisconnect(); + xcb_disconnect(m_xcbConnection); + } + + xcb_connection_t* GetXcbConnection() const override + { + return m_xcbConnection; + } + + private: + xcb_connection_t* m_xcbConnection = nullptr; + }; + + //////////////////////////////////////////////////////////////////////////////////////////////// + ApplicationLinux_xcb::ApplicationLinux_xcb() + { + LinuxLifecycleEvents::Bus::Handler::BusConnect(); + m_xcbConnectionManager = AZStd::make_unique(); + if (LinuxXcbConnectionManagerInterface::Get() == nullptr) + { + LinuxXcbConnectionManagerInterface::Register(m_xcbConnectionManager.get()); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + ApplicationLinux_xcb::~ApplicationLinux_xcb() + { + if (LinuxXcbConnectionManagerInterface::Get() == m_xcbConnectionManager.get()) + { + LinuxXcbConnectionManagerInterface::Unregister(m_xcbConnectionManager.get()); + } + m_xcbConnectionManager.reset(); + LinuxLifecycleEvents::Bus::Handler::BusDisconnect(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void ApplicationLinux_xcb::PumpSystemEventLoopOnce() + { + if (xcb_connection_t* xcbConnection = m_xcbConnectionManager->GetXcbConnection()) + { + if (xcb_generic_event_t* event = xcb_poll_for_event(xcbConnection)) + { + LinuxXcbEventHandlerBus::Broadcast(&LinuxXcbEventHandlerBus::Events::HandleXcbEvent, event); + free(event); + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void ApplicationLinux_xcb::PumpSystemEventLoopUntilEmpty() + { + if (xcb_connection_t* xcbConnection = m_xcbConnectionManager->GetXcbConnection()) + { + while (xcb_generic_event_t* event = xcb_poll_for_event(xcbConnection)) + { + LinuxXcbEventHandlerBus::Broadcast(&LinuxXcbEventHandlerBus::Events::HandleXcbEvent, event); + free(event); + } + } + } + +#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h new file mode 100644 index 0000000000..55daedb4dd --- /dev/null +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace AzFramework +{ + +#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + + //////////////////////////////////////////////////////////////////////////////////////////////// + class ApplicationLinux_xcb + : public Application::Implementation + , public LinuxLifecycleEvents::Bus::Handler + { + public: + //////////////////////////////////////////////////////////////////////////////////////////// + AZ_CLASS_ALLOCATOR(ApplicationLinux_xcb, AZ::SystemAllocator, 0); + ApplicationLinux_xcb(); + ~ApplicationLinux_xcb() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + // Application::Implementation + void PumpSystemEventLoopOnce() override; + void PumpSystemEventLoopUntilEmpty() override; + + private: + AZStd::unique_ptr m_xcbConnectionManager; + }; + +#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp index 0ab1281eda..436be28ee6 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp @@ -6,48 +6,24 @@ * */ -#include +#include "NativeWindow_Linux_xcb.h" namespace AzFramework { - class NativeWindowImpl_Linux final - : public NativeWindow::Implementation - { - public: - AZ_CLASS_ALLOCATOR(NativeWindowImpl_Linux, AZ::SystemAllocator, 0); - NativeWindowImpl_Linux() = default; - ~NativeWindowImpl_Linux() override = default; - - // NativeWindow::Implementation overrides... - void InitWindow(const AZStd::string& title, - const WindowGeometry& geometry, - const WindowStyleMasks& styleMasks) override; - NativeWindowHandle GetWindowHandle() const override; - uint32_t GetDisplayRefreshRate() const override; - }; - NativeWindow::Implementation* NativeWindow::Implementation::Create() { - return aznew NativeWindowImpl_Linux(); - } - - void NativeWindowImpl_Linux::InitWindow([[maybe_unused]]const AZStd::string& title, - const WindowGeometry& geometry, - [[maybe_unused]]const WindowStyleMasks& styleMasks) - { - m_width = geometry.m_width; - m_height = geometry.m_height; - } - - NativeWindowHandle NativeWindowImpl_Linux::GetWindowHandle() const - { - AZ_Assert(false, "NativeWindow not implemented for Linux"); +#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + return aznew NativeWindowImpl_Linux_xcb(); +#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND + #error "Linux Window Manager Wayland not supported." return nullptr; +#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_XLIB + #error "Linux Window Manager XLIB not supported." + return nullptr; +#else + #error "Linux Window Manager not recognized." + return nullptr; +#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB } - uint32_t NativeWindowImpl_Linux::GetDisplayRefreshRate() const - { - //Using 60 for now until proper support is added - return 60; - } } // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp new file mode 100644 index 0000000000..005c1858a3 --- /dev/null +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.cpp @@ -0,0 +1,244 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include +#include + +#include "NativeWindow_Linux_xcb.h" + +namespace AzFramework +{ +#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + + [[maybe_unused]] const char LinuxXcbErrorWindow[] = "NativeWindow_Linux_xcb"; + static constexpr uint8_t s_XcbFormatDataSize = 32; // Format indicator for xcb for client messages + static constexpr uint16_t s_DefaultXcbWindowBorderWidth = 4; // The default border with in pixels if a border was specified + static constexpr uint8_t s_XcbResponseTypeMask = 0x7f; // Mask to extract the specific event type from an xcb event + + //////////////////////////////////////////////////////////////////////////////////////////////// + NativeWindowImpl_Linux_xcb::NativeWindowImpl_Linux_xcb() + : NativeWindow::Implementation() + { + if (auto xcbConnectionManager = AzFramework::LinuxXcbConnectionManagerInterface::Get(); + xcbConnectionManager != nullptr) + { + m_xcbConnection = xcbConnectionManager->GetXcbConnection(); + } + AZ_Error(LinuxXcbErrorWindow, m_xcbConnection != nullptr, "Unable to get XCB Connection"); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + NativeWindowImpl_Linux_xcb::~NativeWindowImpl_Linux_xcb() + { + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::InitWindow(const AZStd::string& title, + const WindowGeometry& geometry, + const WindowStyleMasks& styleMasks) + { + // Get the parent window + const xcb_setup_t* xcbSetup = xcb_get_setup(m_xcbConnection); + xcb_screen_t* xcbRootScreen = xcb_setup_roots_iterator(xcbSetup).data; + xcb_window_t xcbParentWindow = xcbRootScreen->root; + + // Create an XCB window from the connection + m_xcbWindow = xcb_generate_id(m_xcbConnection); + + uint16_t borderWidth = 0; + const uint32_t mask = styleMasks.m_platformAgnosticStyleMask; + if ((mask & WindowStyleMasks::WINDOW_STYLE_BORDERED) || + (mask & WindowStyleMasks::WINDOW_STYLE_RESIZEABLE)) + { + borderWidth = s_DefaultXcbWindowBorderWidth; + } + + uint32_t eventMask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK; + + uint32_t valueList[] = { xcbRootScreen->black_pixel, + XCB_EVENT_MASK_STRUCTURE_NOTIFY }; + + xcb_void_cookie_t xcbCheckResult; + + xcbCheckResult = xcb_create_window_checked(m_xcbConnection, + XCB_COPY_FROM_PARENT, + m_xcbWindow, + xcbParentWindow, + aznumeric_cast(geometry.m_posX), + aznumeric_cast(geometry.m_posY), + aznumeric_cast(geometry.m_width), + aznumeric_cast(geometry.m_height), + borderWidth, + XCB_WINDOW_CLASS_INPUT_OUTPUT, + xcbRootScreen->root_visual, + eventMask, + valueList); + + AZ_Assert(ValidateXcbResult(xcbCheckResult), "Failed to create xcb window."); + + SetWindowTitle(title); + + // Setup the window close event + const static char* wmProtocolString = "WM_PROTOCOLS"; + + xcb_intern_atom_cookie_t cookieProtocol = xcb_intern_atom(m_xcbConnection, 1, strlen(wmProtocolString), wmProtocolString); + xcb_intern_atom_reply_t* replyProtocol = xcb_intern_atom_reply(m_xcbConnection, cookieProtocol, nullptr); + AZ_Error(LinuxXcbErrorWindow, replyProtocol != nullptr, "Unable to query xcb '%s' atom", wmProtocolString); + m_xcbAtomProtocols = replyProtocol->atom; + + const static char* wmDeleteWindowString = "WM_DELETE_WINDOW"; + xcb_intern_atom_cookie_t cookieDeleteWindow = xcb_intern_atom(m_xcbConnection, 0, strlen(wmDeleteWindowString), wmDeleteWindowString); + xcb_intern_atom_reply_t* replyDeleteWindow = xcb_intern_atom_reply(m_xcbConnection, cookieDeleteWindow, nullptr); + AZ_Error(LinuxXcbErrorWindow, replyDeleteWindow != nullptr, "Unable to query xcb '%s' atom", wmDeleteWindowString); + m_xcbAtomDeleteWindow = replyDeleteWindow->atom; + + xcbCheckResult = xcb_change_property_checked(m_xcbConnection, + XCB_PROP_MODE_REPLACE, + m_xcbWindow, + m_xcbAtomProtocols, + XCB_ATOM_ATOM, + s_XcbFormatDataSize, + 1, + &m_xcbAtomDeleteWindow); + + AZ_Assert(ValidateXcbResult(xcbCheckResult), "Failed to change the xcb atom property for WM_CLOSE event"); + + m_width = geometry.m_width; + m_height = geometry.m_height; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::Activate() + { + LinuxXcbEventHandlerBus::Handler::BusConnect(); + + if (!m_activated) // nothing to do if window was already activated + { + m_activated = true; + + xcb_map_window(m_xcbConnection, m_xcbWindow); + xcb_flush(m_xcbConnection); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::Deactivate() + { + if (m_activated) // nothing to do if window was already deactivated + { + m_activated = false; + + WindowNotificationBus::Event(reinterpret_cast(m_xcbWindow), &WindowNotificationBus::Events::OnWindowClosed); + + xcb_unmap_window(m_xcbConnection, m_xcbWindow); + xcb_flush(m_xcbConnection); + } + LinuxXcbEventHandlerBus::Handler::BusDisconnect(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + NativeWindowHandle NativeWindowImpl_Linux_xcb::GetWindowHandle() const + { + return reinterpret_cast(m_xcbWindow); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::SetWindowTitle(const AZStd::string& title) + { + xcb_void_cookie_t xcbCheckResult; + xcbCheckResult = xcb_change_property(m_xcbConnection, + XCB_PROP_MODE_REPLACE, + m_xcbWindow, + XCB_ATOM_WM_NAME, + XCB_ATOM_STRING, + 8, + static_cast(title.size()), + title.c_str()); + AZ_Assert(ValidateXcbResult(xcbCheckResult), "Failed to set window title."); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::ResizeClientArea(WindowSize clientAreaSize) + { + const uint32_t values[] = { clientAreaSize.m_width, clientAreaSize.m_height }; + + xcb_configure_window(m_xcbConnection, m_xcbWindow, XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, values); + + m_width = clientAreaSize.m_width; + m_height = clientAreaSize.m_height; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + uint32_t NativeWindowImpl_Linux_xcb::GetDisplayRefreshRate() const + { + // [GFX TODO][GHI - 2678] + // Using 60 for now until proper support is added + return 60; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + bool NativeWindowImpl_Linux_xcb::ValidateXcbResult(xcb_void_cookie_t cookie) + { + bool result = true; + if (xcb_generic_error_t* error = xcb_request_check(m_xcbConnection, cookie)) + { + AZ_TracePrintf("Error","Error code %d", error->error_code); + result = false; + } + return result; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::HandleXcbEvent(xcb_generic_event_t* event) + { + switch (event->response_type & s_XcbResponseTypeMask) + { + case XCB_CONFIGURE_NOTIFY: + { + xcb_configure_notify_event_t* cne = reinterpret_cast(event); + WindowSizeChanged(aznumeric_cast(cne->width), + aznumeric_cast(cne->height)); + + break; + } + case XCB_CLIENT_MESSAGE: + { + xcb_client_message_event_t* cme = reinterpret_cast(event); + if ((cme->type == m_xcbAtomProtocols) && + (cme->format == s_XcbFormatDataSize) && + (cme->data.data32[0] == m_xcbAtomDeleteWindow)) + { + Deactivate(); + + ApplicationRequests::Bus::Broadcast(&ApplicationRequests::ExitMainLoop); + } + break; + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void NativeWindowImpl_Linux_xcb::WindowSizeChanged(const uint32_t width, const uint32_t height) + { + if (m_width != width || m_height != height) + { + m_width = width; + m_height = height; + + if (m_activated) + { + WindowNotificationBus::Event(reinterpret_cast(m_xcbWindow), &WindowNotificationBus::Events::OnWindowResized, width, height); + } + } + } + +#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h new file mode 100644 index 0000000000..73e255bab0 --- /dev/null +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include +#include + +namespace AzFramework +{ +#if PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + class NativeWindowImpl_Linux_xcb final + : public NativeWindow::Implementation + , public LinuxXcbEventHandlerBus::Handler + { + public: + AZ_CLASS_ALLOCATOR(NativeWindowImpl_Linux_xcb, AZ::SystemAllocator, 0); + NativeWindowImpl_Linux_xcb(); + ~NativeWindowImpl_Linux_xcb() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + // NativeWindow::Implementation + void InitWindow(const AZStd::string& title, + const WindowGeometry& geometry, + const WindowStyleMasks& styleMasks) override; + void Activate() override; + void Deactivate() override; + NativeWindowHandle GetWindowHandle() const override; + void SetWindowTitle(const AZStd::string& title) override; + void ResizeClientArea(WindowSize clientAreaSize) override; + uint32_t GetDisplayRefreshRate() const override; + + //////////////////////////////////////////////////////////////////////////////////////////// + // LinuxXcbEventHandlerBus::Handler + void HandleXcbEvent(xcb_generic_event_t* event) override; + + private: + bool ValidateXcbResult(xcb_void_cookie_t cookie); + void WindowSizeChanged(const uint32_t width, const uint32_t height); + + xcb_connection_t* m_xcbConnection = nullptr; + xcb_window_t m_xcbWindow = 0; + xcb_atom_t m_xcbAtomProtocols; + xcb_atom_t m_xcbAtomDeleteWindow; + }; +#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake b/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake index 21201d954d..4330675fc7 100644 --- a/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake +++ b/Code/Framework/AzFramework/Platform/Linux/platform_linux_files.cmake @@ -12,6 +12,8 @@ set(FILES AzFramework/API/ApplicationAPI_Platform.h AzFramework/API/ApplicationAPI_Linux.h AzFramework/Application/Application_Linux.cpp + AzFramework/Application/Application_Linux_xcb.h + AzFramework/Application/Application_Linux_xcb.cpp AzFramework/Asset/AssetSystemComponentHelper_Linux.cpp AzFramework/Process/ProcessWatcher_Linux.cpp AzFramework/Process/ProcessCommon.h @@ -20,6 +22,8 @@ set(FILES ../Common/Unimplemented/AzFramework/StreamingInstall/StreamingInstall_Unimplemented.cpp ../Common/Default/AzFramework/TargetManagement/TargetManagementComponent_Default.cpp AzFramework/Windowing/NativeWindow_Linux.cpp + AzFramework/Windowing/NativeWindow_Linux_xcb.h + AzFramework/Windowing/NativeWindow_Linux_xcb.cpp ../Common/Unimplemented/AzFramework/Input/Devices/Gamepad/InputDeviceGamepad_Unimplemented.cpp ../Common/Unimplemented/AzFramework/Input/Devices/Keyboard/InputDeviceKeyboard_Unimplemented.cpp ../Common/Unimplemented/AzFramework/Input/Devices/Motion/InputDeviceMotion_Unimplemented.cpp diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChain.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChain.h index c1fd4453d4..42ba2d2e25 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChain.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/SwapChain.h @@ -83,11 +83,11 @@ namespace AZ #if defined(PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB) // On Linux platforms that uses XCB, a resize may occur in the swap chain but the command queue may still - // reference the original surface. This flag is a temporary fix to make sure that all the swap chains - // have finished their resize events before presenting the command queue. + // reference the original surface. This flag is a temporary fix to make sure the swap chain is ready to present + // We need to remove this work around with // [GFX TODO][GHI - 2678] - AZStd::atomic_bool m_resized{ false }; + AZStd::atomic_bool m_readyToPresent { false }; #endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB protected: diff --git a/Gems/Atom/RHI/Code/Source/RHI/SwapChain.cpp b/Gems/Atom/RHI/Code/Source/RHI/SwapChain.cpp index 5fbb83fccf..92d7a125d8 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/SwapChain.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/SwapChain.cpp @@ -165,7 +165,9 @@ namespace AZ } #if defined(PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB) - m_resized.store(true); + // If we are presenting through the editor, the resize is triggered through the editor's window, which + // won't happen until after the surface is ready to present + m_readyToPresent.store(true); #endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB return resultCode; diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandQueue.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandQueue.cpp index dc52e530e0..e4d8212228 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandQueue.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/CommandQueue.cpp @@ -45,7 +45,7 @@ namespace AZ #if defined(PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB) for (RHI::SwapChain* swapChain : rhiRequest.m_swapChainsToPresent) { - if (!swapChain->m_resized) + if (!swapChain->m_readyToPresent) { return; } diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp index 0ae3ae1114..e1d3e8c060 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/SwapChain.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -127,6 +128,17 @@ namespace AZ nativeDimensions->m_imageFormat = ConvertFormat(m_surfaceFormat.format); } +#if defined(PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB) + // When launching in game mode, the surface will be ready at this point, meaning that after + // intialization, this swap chain is ready to present + AZ::ApplicationTypeQuery appType; + ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationBus::Events::QueryApplicationType, appType); + if (appType.IsGame()) + { + m_readyToPresent.store(true); + } +#endif // PAL_TRAIT_LINUX_WINDOW_MANAGER_XCB + SetName(GetName()); return result; } From d17ac748ac44244955ebb3af59aeafede2f6954e Mon Sep 17 00:00:00 2001 From: Ken Pruiksma Date: Thu, 9 Sep 2021 12:56:16 -0500 Subject: [PATCH 217/355] Various terrain improvements: (#3942) * Various terrain improvements: - Height now stored in a R16_unorm to decrease the amount of memory / memory bandwidth needed for the height field - Many simplifications to the feature processor - Added a shader to render to the depth pre pass - Pulled common functionality needed by depth and forward to a common include shader - Forward shader now outputs to all the expected render targets - Adjusted the way normals and lighting are being calculated Signed-off-by: Ken Pruiksma * Adding missing shader files. Updated terrain shader to alter the color slightly with height. Signed-off-by: Ken Pruiksma * Removed pixel shader code from terrain depth pass Signed-off-by: Ken Pruiksma * Renamed the depth pass shaders to no longer indicate they include a pixel shader. Signed-off-by: Ken Pruiksma * Removing unneeded code from TerrainCommon.azsli Signed-off-by: Ken Pruiksma --- Code/Editor/Include/ObjectEvent.h | 1 - Code/Editor/Objects/BaseObject.cpp | 14 -- Code/Editor/Objects/BaseObject.h | 2 - .../Shadow/ReceiverPlaneDepthBias.azsli | 2 +- .../Assets/Shaders/Terrain/Terrain.azsl | 160 ++++++-------- .../Assets/Shaders/Terrain/Terrain.shader | 28 +-- .../Shaders/Terrain/TerrainCommon.azsli | 76 +++++++ .../Shaders/Terrain/Terrain_DepthPass.azsl | 25 +++ .../Shaders/Terrain/Terrain_DepthPass.shader | 26 +++ .../TerrainFeatureProcessor.cpp | 207 ++++++++++-------- .../TerrainRenderer/TerrainFeatureProcessor.h | 53 +++-- 11 files changed, 357 insertions(+), 237 deletions(-) create mode 100644 Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli create mode 100644 Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.azsl create mode 100644 Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.shader diff --git a/Code/Editor/Include/ObjectEvent.h b/Code/Editor/Include/ObjectEvent.h index 7d137d7b84..e59bca6111 100644 --- a/Code/Editor/Include/ObjectEvent.h +++ b/Code/Editor/Include/ObjectEvent.h @@ -27,7 +27,6 @@ enum ObjectEvent EVENT_OUTOFGAME, //!< Signals that editor is switching out of the game mode. EVENT_REFRESH, //!< Signals that editor is refreshing level. EVENT_DBLCLICK, //!< Signals that object have been double clicked. - EVENT_KEEP_HEIGHT, //!< Signals that object must preserve its height over changed terrain. EVENT_RELOAD_ENTITY,//!< Signals that entities scripts must be reloaded. EVENT_RELOAD_GEOM, //!< Signals that all possible geometries should be reloaded. EVENT_UNLOAD_GEOM, //!< Signals that all possible geometries should be unloaded. diff --git a/Code/Editor/Objects/BaseObject.cpp b/Code/Editor/Objects/BaseObject.cpp index 14291a3e4d..4ae01faddf 100644 --- a/Code/Editor/Objects/BaseObject.cpp +++ b/Code/Editor/Objects/BaseObject.cpp @@ -618,12 +618,6 @@ bool CBaseObject::SetPos(const Vec3& pos, int flags) StoreUndo("Position", true, flags); } - float terrainElevation = AzFramework::Terrain::TerrainDataRequests::GetDefaultTerrainHeight(); - AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult(terrainElevation - , &AzFramework::Terrain::TerrainDataRequests::GetHeightFromFloats - , pos.x, pos.y, AzFramework::Terrain::TerrainDataRequests::Sampler::BILINEAR, nullptr); - m_height = pos.z - terrainElevation; - if (!bPositionDelegated) { m_pos = pos; @@ -1275,14 +1269,6 @@ void CBaseObject::OnEvent(ObjectEvent event) { switch (event) { - case EVENT_KEEP_HEIGHT: - { - float h = m_height; - float newz = GetIEditor()->GetTerrainElevation(m_pos.x, m_pos.y) + m_height; - SetPos(Vec3(m_pos.x, m_pos.y, newz)); - m_height = h; - } - break; case EVENT_CONFIG_SPEC_CHANGE: UpdateVisibility(!IsHidden()); break; diff --git a/Code/Editor/Objects/BaseObject.h b/Code/Editor/Objects/BaseObject.h index 89e47ae881..ea58b4e78d 100644 --- a/Code/Editor/Objects/BaseObject.h +++ b/Code/Editor/Objects/BaseObject.h @@ -798,8 +798,6 @@ private: ////////////////////////////////////////////////////////////////////////// //! Area radius around object, where terrain is flatten and static objects removed. float m_flattenArea; - //! Every object keeps for itself height above terrain. - float m_height; //! Object's name. QString m_name; //! Class description for this object. diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli index 6225bb3434..9d785e2086 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ReceiverPlaneDepthBias.azsli @@ -35,4 +35,4 @@ float ApplyReceiverPlaneDepthBias(const float2 receiverPlaneDepthBias, const flo // Clamping this will remove this effect fragmentDepthBias = min(fragmentDepthBias, 0.0); return fragmentDepthBias; -} \ No newline at end of file +} diff --git a/Gems/Terrain/Assets/Shaders/Terrain/Terrain.azsl b/Gems/Terrain/Assets/Shaders/Terrain/Terrain.azsl index 57d0909ae4..50d11ca610 100644 --- a/Gems/Terrain/Assets/Shaders/Terrain/Terrain.azsl +++ b/Gems/Terrain/Assets/Shaders/Terrain/Terrain.azsl @@ -6,120 +6,90 @@ */ #include +#include #include - - -struct VertexInput -{ - float2 Position : POSITION; - float2 UV : UV; -}; +#include "TerrainCommon.azsli" struct VertexOutput { - float4 Position : SV_Position; - float3 Normal : NORMAL; - float2 UV : UV; + linear centroid float4 m_position : SV_Position; + float3 m_normal : NORMAL; + float3 m_tangent : TANGENT; + float3 m_bitangent : BITANGENT; + float m_height : UV; }; -ShaderResourceGroup ObjectSrg : SRG_PerObject +struct ForwardPassOutput { - Texture2D HeightmapImage; - - Sampler LinearSampler - { - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; - AddressU = Clamp; - AddressV = Clamp; - AddressW = Clamp; - }; - - row_major float3x4 m_modelToWorld; - float m_heightScale; - float2 m_uvMin; - float2 m_uvMax; - float2 m_uvStep; -} - -float4x4 GetObject_WorldMatrix() -{ - float4x4 modelToWorld = float4x4( - float4(1, 0, 0, 0), - float4(0, 1, 0, 0), - float4(0, 0, 1, 0), - float4(0, 0, 0, 1)); - - modelToWorld[0] = ObjectSrg::m_modelToWorld[0]; - modelToWorld[1] = ObjectSrg::m_modelToWorld[1]; - modelToWorld[2] = ObjectSrg::m_modelToWorld[2]; - return modelToWorld; -} - -float GetHeight(float2 origUv) -{ - float2 uv = clamp(origUv, 0.0f, 1.0f); - return ObjectSrg::m_heightScale * (ObjectSrg::HeightmapImage.SampleLevel(ObjectSrg::LinearSampler, uv, 0).r - 0.5f); -} - -VertexOutput MainVS(in VertexInput input) -{ - VertexOutput output; - - // Clamp the UVs *after* lerping to ensure that everything aligns properly right to the edge. - // We use out-of-bounds UV values to denote vertices that need to be removed. - float2 origUv = lerp(ObjectSrg::m_uvMin, ObjectSrg::m_uvMax, input.UV); - float2 uv = clamp(origUv, 0.0f, 1.0f); - - // Loop up the height and calculate our final position. - float height = GetHeight(uv); - float3 worldPosition = mul(GetObject_WorldMatrix(), float4(input.Position, height, 1.0f)).xyz; - output.Position = mul(ViewSrg::m_viewProjectionMatrix, float4(worldPosition, 1.0f)); - - // Remove all vertices outside our bounds by turning them into NaN positions. - output.Position = output.Position / ((origUv.x >= 0.0f && origUv.x < 1.0f && origUv.y >= 0.0f && origUv.y < 1.0f) ? 1.0f : 0.0f); - - // Calculate normal - float2 gridSize = {1.0f, 1.0f}; - float up = GetHeight(uv + ObjectSrg::m_uvStep * float2(-1.0f, 0.0f)); - float right = GetHeight(uv + ObjectSrg::m_uvStep * float2( 0.0f, 1.0f)); - float down = GetHeight(uv + ObjectSrg::m_uvStep * float2( 1.0f, 0.0f)); - float left = GetHeight(uv + ObjectSrg::m_uvStep * float2( 0.0f, -1.0f)); - - float dydx = (right - left) * gridSize[0]; - float dydz = (down - up) * gridSize[1]; - - output.Normal = normalize(float3(dydx, 2.0f, dydz)); - - output.UV = uv; - return output; -} + float4 m_diffuseColor : SV_Target0; //!< RGB = Diffuse Lighting, A = Blend Alpha (for blended surfaces) OR A = special encoding of surfaceScatteringFactor, m_subsurfaceScatteringQuality, o_enableSubsurfaceScattering + float4 m_specularColor : SV_Target1; //!< RGB = Specular Lighting, A = Unused + float4 m_albedo : SV_Target2; //!< RGB = Surface albedo pre-multiplied by other factors that will be multiplied later by diffuse GI, A = specularOcclusion + float4 m_specularF0 : SV_Target3; //!< RGB = Specular F0, A = roughness + float4 m_normal : SV_Target4; //!< RGB10 = EncodeNormalSignedOctahedron(worldNormal), A2 = multiScatterCompensationEnabled +}; struct PixelOutput { float4 m_color : SV_Target0; }; - -PixelOutput MainPS(in VertexOutput input) + +VertexOutput MainVS(in VertexInput input) { - PixelOutput output; + VertexOutput output; + ObjectSrg::TerrainData terrainData = ObjectSrg::m_terrainData; - // Hard-coded fake light direction - float3 lightDirection = normalize(float3(1.0, -1.0, 1.0)); + float2 uv = input.m_uv; + float2 origUv = lerp(terrainData.m_uvMin, terrainData.m_uvMax, uv); + output.m_position = GetTerrainProjectedPosition(terrainData, input.m_position, origUv); + // Calculate normal + float up = GetHeight(origUv + terrainData.m_uvStep * float2( 0.0f, -1.0f)); + float right = GetHeight(origUv + terrainData.m_uvStep * float2( 1.0f, 0.0f)); + float down = GetHeight(origUv + terrainData.m_uvStep * float2( 0.0f, 1.0f)); + float left = GetHeight(origUv + terrainData.m_uvStep * float2(-1.0f, 0.0f)); + + output.m_bitangent = normalize(float3(0.0, terrainData.m_sampleSpacing * 2.0f, down - up)); + output.m_tangent = normalize(float3(terrainData.m_sampleSpacing * 2.0f, 0.0, right - left)); + output.m_normal = cross(output.m_tangent, output.m_bitangent); + + output.m_height = GetHeight(origUv); + return output; +} + +ForwardPassOutput MainPS(in VertexOutput input) +{ + ForwardPassOutput output; + + float3 lightDirection = normalize(float3(-1.0, 1.0, -1.0)); + float3 lightIntensity = float3(1.0, 1.0, 1.0); + if (SceneSrg::m_directionalLightCount > 0) + { + lightDirection = SceneSrg::m_directionalLights[0].m_direction; + lightIntensity = SceneSrg::m_directionalLights[0].m_rgbIntensityLux; + } + // Fake light intensity ranges from 1.0 for normals directly facing the light to zero for those // directly facing away. - float lightDot = dot(normalize(input.Normal), lightDirection); - float lightIntensity = lightDot * 0.5 + 0.5; + const float minLight = 0.01; + const float midLight = 0.1; + float lightDot = dot(normalize(input.m_normal), -lightDirection); + lightIntensity *= lightDot > 0.0 ? + lightDot * (1.0 - midLight) + midLight : // surface facing light + (lightDot + 1.0) * (midLight - minLight) + minLight; // surface facing away - // add a small amount of ambient and reduce direct light to keep in 0-1 range - lightIntensity = saturate(0.1 + lightIntensity * 0.9); + output.m_diffuseColor.rgb = 0.5 * lightIntensity; + output.m_diffuseColor.a = 0.0f; - // The lightIntensity should not affect alpha so only apply it to rgb. - //output.m_color.rgb = ((input.Normal + float3(1.0, 1.0, 1.0)) / 2.0); - output.m_color.rgb = float3(1.0, 1.0, 1.0) * lightIntensity; - output.m_color.a = 1.0f; + output.m_specularColor.rgb = 0.0; + + output.m_albedo.rgb = 0.25 + input.m_height * 0.5; + output.m_albedo.a = 0.0; + + output.m_specularF0.rgb = 0.04; + output.m_specularF0.a = 1.0; + + output.m_normal.rgb = input.m_normal; + output.m_normal.a = 0.0; return output; } diff --git a/Gems/Terrain/Assets/Shaders/Terrain/Terrain.shader b/Gems/Terrain/Assets/Shaders/Terrain/Terrain.shader index f20f4201ae..e844a54a21 100644 --- a/Gems/Terrain/Assets/Shaders/Terrain/Terrain.shader +++ b/Gems/Terrain/Assets/Shaders/Terrain/Terrain.shader @@ -1,21 +1,13 @@ { - - "Source" : "Terrain", + "Source" : "./Terrain.azsl", - - "RasterState" : { "CullMode" : "None" }, - - "DepthStencilState" : { - "Depth" : { "Enable" : true, "CompareFunc" : "GreaterEqual" } - }, - - "BlendState" : { - "Enable" : true, - "BlendSource" : "One", - "BlendAlphaSource" : "One", - "BlendDest" : "AlphaSourceInverse", - "BlendAlphaDest" : "AlphaSourceInverse", - "BlendAlphaOp" : "Add" + "DepthStencilState" : + { + "Depth" : + { + "Enable" : true, + "CompareFunc" : "GreaterEqual" + } }, "DrawList" : "forward", @@ -33,5 +25,9 @@ "type": "Fragment" } ] + }, + + "BlendState" : { + "Enable" : false } } diff --git a/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli b/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli new file mode 100644 index 0000000000..6e489796d7 --- /dev/null +++ b/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli @@ -0,0 +1,76 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +ShaderResourceGroup ObjectSrg : SRG_PerObject +{ + Texture2D m_heightmapImage; + + Sampler LinearSampler + { + MinFilter = Linear; + MagFilter = Linear; + MipFilter = Linear; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; + }; + + row_major float3x4 m_modelToWorld; + + struct TerrainData + { + float2 m_uvMin; + float2 m_uvMax; + float2 m_uvStep; + float m_sampleSpacing; + float m_heightScale; + }; + + TerrainData m_terrainData; +} + +struct VertexInput +{ + float2 m_position : POSITION; + float2 m_uv : UV; +}; + +float4x4 GetObject_WorldMatrix() +{ + float4x4 modelToWorld = float4x4( + float4(1, 0, 0, 0), + float4(0, 1, 0, 0), + float4(0, 0, 1, 0), + float4(0, 0, 0, 1)); + + modelToWorld[0] = ObjectSrg::m_modelToWorld[0]; + modelToWorld[1] = ObjectSrg::m_modelToWorld[1]; + modelToWorld[2] = ObjectSrg::m_modelToWorld[2]; + return modelToWorld; +} + +float GetHeight(float2 origUv) +{ + float2 uv = clamp(origUv, 0.0f, 1.0f); + return ObjectSrg::m_terrainData.m_heightScale * (ObjectSrg::m_heightmapImage.SampleLevel(ObjectSrg::LinearSampler, uv, 0).r - 0.5f); +} + +float4 GetTerrainProjectedPosition(ObjectSrg::TerrainData terrainData, float2 vertexPosition, float2 uv) +{ + // Remove all vertices outside our bounds by turning them into NaN positions. + if (any(uv > 1.0) || any (uv < 0.0)) + { + return asfloat(0x7fc00000); // NaN + } + + // Loop up the height and calculate our final position. + float height = GetHeight(uv); + float4 worldPosition = mul(GetObject_WorldMatrix(), float4(vertexPosition, height, 1.0f)); + return mul(ViewSrg::m_viewProjectionMatrix, worldPosition); +} diff --git a/Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.azsl b/Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.azsl new file mode 100644 index 0000000000..20c56323ac --- /dev/null +++ b/Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.azsl @@ -0,0 +1,25 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include "TerrainCommon.azsli" + +struct VSDepthOutput +{ + float4 m_position : SV_Position; +}; + +VSDepthOutput MainVS(in VertexInput input) +{ + VSDepthOutput output; + ObjectSrg::TerrainData terrainData = ObjectSrg::m_terrainData; + + float2 origUv = lerp(terrainData.m_uvMin, terrainData.m_uvMax, input.m_uv); + output.m_position = GetTerrainProjectedPosition(terrainData, input.m_position, origUv); + return output; +} diff --git a/Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.shader b/Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.shader new file mode 100644 index 0000000000..f1bcdbc1d3 --- /dev/null +++ b/Gems/Terrain/Assets/Shaders/Terrain/Terrain_DepthPass.shader @@ -0,0 +1,26 @@ +{ + "Source" : "./Terrain_DepthPass.azsl", + + "DepthStencilState" : + { + "Depth" : + { + "Enable" : true, + "CompareFunc" : "GreaterEqual" + } + }, + + "DrawList" : "depth", + + "ProgramSettings": + { + "EntryPoints": + [ + { + "name": "MainVS", + "type": "Vertex" + } + ] + } + +} diff --git a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp index c4aaa6db04..f0743cfb52 100644 --- a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp +++ b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp @@ -41,12 +41,9 @@ namespace Terrain namespace ShaderInputs { - static const char* const HeightmapImage("HeightmapImage"); + static const char* const HeightmapImage("m_heightmapImage"); static const char* const ModelToWorld("m_modelToWorld"); - static const char* const HeightScale("m_heightScale"); - static const char* const UvMin("m_uvMin"); - static const char* const UvMax("m_uvMax"); - static const char* const UvStep("m_uvStep"); + static const char* const TerrainData("m_terrainData"); } @@ -68,76 +65,76 @@ namespace Terrain EnableSceneNotification(); } + void TerrainFeatureProcessor::ConfigurePipelineState(ShaderState& shaderState, bool assertOnFail) + { + bool success = GetParentScene()->ConfigurePipelineState(shaderState.m_shader->GetDrawListTag(), shaderState.m_pipelineStateDescriptor); + AZ_Assert(success || !assertOnFail, "Couldn't configure the pipeline state."); + if (success) + { + shaderState.m_pipelineState = shaderState.m_shader->AcquirePipelineState(shaderState.m_pipelineStateDescriptor); + AZ_Assert(shaderState.m_pipelineState, "Failed to acquire default pipeline state."); + } + } + void TerrainFeatureProcessor::InitializeAtomStuff() { m_rhiSystem = AZ::RHI::RHISystemInterface::Get(); - { - // Load the shader - constexpr const char* TerrainShaderFilePath = "Shaders/Terrain/Terrain.azshader"; - m_shader = AZ::RPI::LoadShader(TerrainShaderFilePath); - if (!m_shader) + { + auto LoadShader = [this](const char* filePath, ShaderState& shaderState) { - AZ_Error(TerrainFPName, false, "Failed to find or create a shader instance from shader asset '%s'", TerrainShaderFilePath); + shaderState.m_shader = AZ::RPI::LoadShader(filePath); + if (!shaderState.m_shader) + { + AZ_Error(TerrainFPName, false, "Failed to find or create a shader instance from shader asset '%s'", filePath); + return; + } + + // Create the data layout + shaderState.m_pipelineStateDescriptor = AZ::RHI::PipelineStateDescriptorForDraw{}; + { + AZ::RHI::InputStreamLayoutBuilder layoutBuilder; + + layoutBuilder.AddBuffer() + ->Channel("POSITION", AZ::RHI::Format::R32G32_FLOAT) + ->Channel("UV", AZ::RHI::Format::R32G32_FLOAT) + ; + shaderState.m_pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End(); + } + + auto shaderVariant = shaderState.m_shader->GetVariant(AZ::RPI::ShaderAsset::RootShaderVariantStableId); + shaderVariant.ConfigurePipelineState(shaderState.m_pipelineStateDescriptor); + + // If this fails to run now, it's ok, we'll initialize it in OnRenderPipelineAdded later. + ConfigurePipelineState(shaderState, false); + }; + + LoadShader("Shaders/Terrain/Terrain.azshader", m_shaderStates[ShaderType::Forward]); + LoadShader("Shaders/Terrain/Terrain_DepthPass_WithPS.azshader", m_shaderStates[ShaderType::Depth]); + + // Forward and depth shader use same srg layout. + AZ::RHI::Ptr perObjectSrgLayout = + m_shaderStates[ShaderType::Forward].m_shader->FindShaderResourceGroupLayout(AZ::Name{"ObjectSrg"}); + + if (!perObjectSrgLayout) + { + AZ_Error(TerrainFPName, false, "Failed to get shader resource group layout"); + return; + } + else if (!perObjectSrgLayout->IsFinalized()) + { + AZ_Error(TerrainFPName, false, "Shader resource group layout is not loaded"); return; } - // Create the data layout - m_pipelineStateDescriptor = AZ::RHI::PipelineStateDescriptorForDraw{}; - { - AZ::RHI::InputStreamLayoutBuilder layoutBuilder; - - layoutBuilder.AddBuffer() - ->Channel("POSITION", AZ::RHI::Format::R32G32_FLOAT) - ->Channel("UV", AZ::RHI::Format::R32G32_FLOAT) - ; - m_pipelineStateDescriptor.m_inputStreamLayout = layoutBuilder.End(); - } - - auto shaderVariant = m_shader->GetVariant(AZ::RPI::ShaderAsset::RootShaderVariantStableId); - shaderVariant.ConfigurePipelineState(m_pipelineStateDescriptor); - - m_drawListTag = m_shader->GetDrawListTag(); - - m_perObjectSrgAsset = m_shader->FindShaderResourceGroupLayout(AZ::Name{"ObjectSrg"}); - if (!m_perObjectSrgAsset) - { - AZ_Error(TerrainFPName, false, "Failed to get shader resource group asset"); - return; - } - else if (!m_perObjectSrgAsset->IsFinalized()) - { - AZ_Error(TerrainFPName, false, "Shader resource group asset is not loaded"); - return; - } - - const AZ::RHI::ShaderResourceGroupLayout* shaderResourceGroupLayout = &(*m_perObjectSrgAsset); - - m_heightmapImageIndex = shaderResourceGroupLayout->FindShaderInputImageIndex(AZ::Name(ShaderInputs::HeightmapImage)); + m_heightmapImageIndex = perObjectSrgLayout->FindShaderInputImageIndex(AZ::Name(ShaderInputs::HeightmapImage)); AZ_Error(TerrainFPName, m_heightmapImageIndex.IsValid(), "Failed to find shader input image %s.", ShaderInputs::HeightmapImage); - m_modelToWorldIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::ModelToWorld)); + m_modelToWorldIndex = perObjectSrgLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::ModelToWorld)); AZ_Error(TerrainFPName, m_modelToWorldIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::ModelToWorld); - m_heightScaleIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::HeightScale)); - AZ_Error(TerrainFPName, m_heightScaleIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::HeightScale); - - m_uvMinIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::UvMin)); - AZ_Error(TerrainFPName, m_uvMinIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvMin); - - m_uvMaxIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::UvMax)); - AZ_Error(TerrainFPName, m_uvMaxIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvMax); - - m_uvStepIndex = shaderResourceGroupLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::UvStep)); - AZ_Error(TerrainFPName, m_uvStepIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::UvStep); - - // If this fails to run now, it's ok, we'll initialize it in OnRenderPipelineAdded later. - bool success = GetParentScene()->ConfigurePipelineState(m_shader->GetDrawListTag(), m_pipelineStateDescriptor); - if (success) - { - m_pipelineState = m_shader->AcquirePipelineState(m_pipelineStateDescriptor); - AZ_Assert(m_pipelineState, "Failed to acquire default pipeline state for shader '%s'", TerrainShaderFilePath); - } + m_terrainDataIndex = perObjectSrgLayout->FindShaderInputConstantIndex(AZ::Name(ShaderInputs::TerrainData)); + AZ_Error(TerrainFPName, m_terrainDataIndex.IsValid(), "Failed to find shader input constant %s.", ShaderInputs::TerrainData); } AZ::RHI::BufferPoolDescriptor dmaPoolDescriptor; @@ -165,12 +162,9 @@ namespace Terrain void TerrainFeatureProcessor::OnRenderPipelineAdded([[maybe_unused]] AZ::RPI::RenderPipelinePtr pipeline) { - bool success = GetParentScene()->ConfigurePipelineState(m_drawListTag, m_pipelineStateDescriptor); - AZ_Assert(success, "Couldn't configure the pipeline state."); - if (success) + for (ShaderState& shaderState: m_shaderStates) { - m_pipelineState = m_shader->AcquirePipelineState(m_pipelineStateDescriptor); - AZ_Assert(m_pipelineState, "Failed to acquire default pipeline state."); + ConfigurePipelineState(shaderState, true); } } @@ -206,7 +200,7 @@ namespace Terrain void TerrainFeatureProcessor::UpdateTerrainData( const AZ::Transform& transform, const AZ::Aabb& worldBounds, - [[maybe_unused]] float sampleSpacing, + float sampleSpacing, uint32_t width, uint32_t height, const AZStd::vector& heightData) { if (!worldBounds.IsValid()) @@ -219,6 +213,7 @@ namespace Terrain m_areaData.m_terrainBounds = worldBounds; m_areaData.m_heightmapImageHeight = height; m_areaData.m_heightmapImageWidth = width; + m_areaData.m_sampleSpacing = sampleSpacing; // Create heightmap image data { @@ -228,13 +223,22 @@ namespace Terrain imageSize.m_width = width; imageSize.m_height = height; + AZStd::vector uint16Heights; + uint16Heights.reserve(heightData.size()); + for (float sampleHeight : heightData) + { + float clampedSample = AZ::GetClamp(sampleHeight, 0.0f, 1.0f); + constexpr uint16_t MaxUint16 = 0xFFFF; + uint16Heights.push_back(aznumeric_cast(clampedSample * MaxUint16)); + } + AZ::Data::Instance streamingImagePool = AZ::RPI::ImageSystemInterface::Get()->GetSystemStreamingPool(); m_areaData.m_heightmapImage = AZ::RPI::StreamingImage::CreateFromCpuData(*streamingImagePool, AZ::RHI::ImageDimension::Image2D, imageSize, - AZ::RHI::Format::R32_FLOAT, - (uint8_t*)heightData.data(), - heightData.size() * sizeof(float)); + AZ::RHI::Format::R16_UNORM, + (uint8_t*)uint16Heights.data(), + heightData.size() * sizeof(uint16_t)); AZ_Error(TerrainFPName, m_areaData.m_heightmapImage, "Failed to initialize the heightmap image!"); } @@ -244,7 +248,8 @@ namespace Terrain { AZ_PROFILE_FUNCTION(AzRender); - if (m_drawListTag.IsNull()) + if (m_shaderStates[ShaderType::Forward].m_shader->GetDrawListTag().IsNull() || + m_shaderStates[ShaderType::Depth].m_shader->GetDrawListTag().IsNull()) { return; } @@ -256,6 +261,7 @@ namespace Terrain if (m_areaData.m_propertiesDirty) { + m_areaData.m_propertiesDirty = false; m_sectorData.clear(); AZ::RHI::DrawPacketBuilder drawPacketBuilder; @@ -281,17 +287,17 @@ namespace Terrain drawPacketBuilder.Begin(nullptr); drawPacketBuilder.SetDrawArguments(drawIndexed); drawPacketBuilder.SetIndexBufferView(m_indexBufferView); + auto& forwardShader = m_shaderStates[ShaderType::Forward].m_shader; - auto resourceGroup = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), m_shader->GetSupervariantIndex(), AZ::Name("ObjectSrg")); - //auto m_resourceGroup = AZ::RPI::ShaderResourceGroup::Create(m_shader->GetAsset(), AZ::Name("ObjectSrg")); + auto resourceGroup = AZ::RPI::ShaderResourceGroup::Create(forwardShader->GetAsset(), forwardShader->GetSupervariantIndex(), AZ::Name("ObjectSrg")); if (!resourceGroup) { AZ_Error(TerrainFPName, false, "Failed to create shader resource group"); return; } - float uvMin[2] = { 0.0f, 0.0f }; - float uvMax[2] = { 1.0f, 1.0f }; + AZStd::array uvMin = { 0.0f, 0.0f }; + AZStd::array uvMax = { 1.0f, 1.0f }; uvMin[0] = (float)((xPatch - m_areaData.m_terrainBounds.GetMin().GetX()) / m_areaData.m_terrainBounds.GetXExtent()); uvMin[1] = (float)((yPatch - m_areaData.m_terrainBounds.GetMin().GetY()) / m_areaData.m_terrainBounds.GetYExtent()); @@ -301,7 +307,7 @@ namespace Terrain uvMax[1] = (float)(((yPatch + m_gridMeters) - m_areaData.m_terrainBounds.GetMin().GetY()) / m_areaData.m_terrainBounds.GetYExtent()); - float uvStep[2] = + AZStd::array uvStep = { 1.0f / m_areaData.m_heightmapImageWidth, 1.0f / m_areaData.m_heightmapImageHeight, }; @@ -313,18 +319,32 @@ namespace Terrain resourceGroup->SetImage(m_heightmapImageIndex, m_areaData.m_heightmapImage); resourceGroup->SetConstant(m_modelToWorldIndex, matrix3x4); - resourceGroup->SetConstant(m_heightScaleIndex, m_areaData.m_heightScale); - resourceGroup->SetConstant(m_uvMinIndex, uvMin); - resourceGroup->SetConstant(m_uvMaxIndex, uvMax); - resourceGroup->SetConstant(m_uvStepIndex, uvStep); + + ShaderTerrainData terrainDataForSrg; + terrainDataForSrg.m_sampleSpacing = m_areaData.m_sampleSpacing; + terrainDataForSrg.m_heightScale = m_areaData.m_heightScale; + terrainDataForSrg.m_uvMin = uvMin; + terrainDataForSrg.m_uvMax = uvMax; + terrainDataForSrg.m_uvStep = uvStep; + resourceGroup->SetConstant(m_terrainDataIndex, terrainDataForSrg); + resourceGroup->Compile(); drawPacketBuilder.AddShaderResourceGroup(resourceGroup->GetRHIShaderResourceGroup()); - AZ::RHI::DrawPacketBuilder::DrawRequest drawRequest; - drawRequest.m_listTag = m_drawListTag; - drawRequest.m_pipelineState = m_pipelineState.get(); - drawRequest.m_streamBufferViews = AZStd::array_view(&m_vertexBufferView, 1); - drawPacketBuilder.AddDrawItem(drawRequest); + auto addDrawItem = [&](ShaderState& shaderState) + { + AZ::RHI::DrawPacketBuilder::DrawRequest drawRequest; + drawRequest.m_listTag = shaderState.m_shader->GetDrawListTag(); + drawRequest.m_pipelineState = shaderState.m_pipelineState.get(); + drawRequest.m_streamBufferViews = AZStd::array_view(&m_vertexBufferView, 1); + drawPacketBuilder.AddDrawItem(drawRequest); + }; + + for (ShaderState& shaderState : m_shaderStates) + { + addDrawItem(shaderState); + } + //addDrawItem(m_shaderStates[ShaderType::Forward]); m_sectorData.emplace_back( drawPacketBuilder.End(), @@ -368,16 +388,16 @@ namespace Terrain uint16_t startIndex = (uint16_t)(m_gridVertices.size()); m_gridVertices.emplace_back(x0, y0, x0 / m_gridMeters, y0 / m_gridMeters); - m_gridVertices.emplace_back(x0, y1, x0 / m_gridMeters, y1 / m_gridMeters); m_gridVertices.emplace_back(x1, y0, x1 / m_gridMeters, y0 / m_gridMeters); + m_gridVertices.emplace_back(x0, y1, x0 / m_gridMeters, y1 / m_gridMeters); m_gridVertices.emplace_back(x1, y1, x1 / m_gridMeters, y1 / m_gridMeters); m_gridIndices.emplace_back(startIndex); m_gridIndices.emplace_back(aznumeric_cast(startIndex + 1)); m_gridIndices.emplace_back(aznumeric_cast(startIndex + 2)); m_gridIndices.emplace_back(aznumeric_cast(startIndex + 1)); - m_gridIndices.emplace_back(aznumeric_cast(startIndex + 2)); m_gridIndices.emplace_back(aznumeric_cast(startIndex + 3)); + m_gridIndices.emplace_back(aznumeric_cast(startIndex + 2)); } } } @@ -441,8 +461,6 @@ namespace Terrain m_vertexBufferView = AZ::RHI::StreamBufferView( *buffer, 0, static_cast(elementSize), static_cast(sizeof(Vertex))); - - AZ::RHI::ValidateStreamBufferViews(m_pipelineStateDescriptor.m_inputStreamLayout, { { m_vertexBufferView } }); } m_hostPool->UnmapBuffer(*buffer); @@ -459,8 +477,9 @@ namespace Terrain m_indexBufferView = {}; m_vertexBufferView = {}; - m_pipelineStateDescriptor = AZ::RHI::PipelineStateDescriptorForDraw{}; - m_pipelineState = nullptr; + for (ShaderState& shaderState : m_shaderStates) + { + shaderState.Reset(); + } } - } diff --git a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h index 7a7b63b634..382f473b25 100644 --- a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h +++ b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.h @@ -56,12 +56,45 @@ namespace Terrain } private: + + // System-level references to the shader, pipeline, and shader-related information + enum ShaderType + { + Depth, + Forward, + Count, + }; + + struct ShaderState + { + AZ::Data::Instance m_shader; + AZ::RHI::ConstPtr m_pipelineState; + AZ::RHI::PipelineStateDescriptorForDraw m_pipelineStateDescriptor; + + void Reset() + { + m_shader.reset(); + m_pipelineState.reset(); + m_pipelineStateDescriptor = {}; + } + }; + + struct ShaderTerrainData // Must align with struct in Object Srg + { + AZStd::array m_uvMin; + AZStd::array m_uvMax; + AZStd::array m_uvStep; + float m_sampleSpacing; + float m_heightScale; + }; + // RPI::SceneNotificationBus overrides ... void OnRenderPipelineAdded(AZ::RPI::RenderPipelinePtr pipeline) override; void OnRenderPipelineRemoved(AZ::RPI::RenderPipeline* pipeline) override; void OnRenderPipelinePassesChanged(AZ::RPI::RenderPipeline* renderPipeline) override; void InitializeAtomStuff(); + void ConfigurePipelineState(ShaderState& shaderState, bool assertOnFail); void InitializeTerrainPatch(); @@ -77,20 +110,11 @@ namespace Terrain // System-level cached reference to the Atom RHI AZ::RHI::RHISystemInterface* m_rhiSystem = nullptr; - // System-level references to the shader, pipeline, and shader-related information - AZ::Data::Instance m_shader{}; - AZ::RHI::PipelineStateDescriptorForDraw m_pipelineStateDescriptor; - AZ::RHI::ConstPtr m_pipelineState = nullptr; - AZ::RHI::DrawListTag m_drawListTag; - AZ::RHI::Ptr m_perObjectSrgAsset; + AZStd::array m_shaderStates; AZ::RHI::ShaderInputImageIndex m_heightmapImageIndex; AZ::RHI::ShaderInputConstantIndex m_modelToWorldIndex; - AZ::RHI::ShaderInputConstantIndex m_heightScaleIndex; - AZ::RHI::ShaderInputConstantIndex m_uvMinIndex; - AZ::RHI::ShaderInputConstantIndex m_uvMaxIndex; - AZ::RHI::ShaderInputConstantIndex m_uvStepIndex; - + AZ::RHI::ShaderInputConstantIndex m_terrainDataIndex; // Pos_float_2 + UV_float_2 struct Vertex @@ -125,11 +149,12 @@ namespace Terrain { AZ::Transform m_transform{ AZ::Transform::CreateIdentity() }; AZ::Aabb m_terrainBounds{ AZ::Aabb::CreateNull() }; - float m_heightScale; + float m_heightScale{ 0.0f }; AZ::Data::Instance m_heightmapImage; - uint32_t m_heightmapImageWidth; - uint32_t m_heightmapImageHeight; + uint32_t m_heightmapImageWidth{ 0 }; + uint32_t m_heightmapImageHeight{ 0 }; bool m_propertiesDirty{ true }; + float m_sampleSpacing{ 0.0f }; }; TerrainAreaData m_areaData; From 9976ee2b8ef6fca6f95a80257e3c54fe38cccf48 Mon Sep 17 00:00:00 2001 From: bosnichd Date: Thu, 9 Sep 2021 12:09:17 -0600 Subject: [PATCH 218/355] Miscellaneous fixes and PAL changes required for restricted platforms. (#4021) * Miscellaneous fixes and PAL changes required for restricted platforms. Signed-off-by: bosnichd * Rename O3DE::ProjectManager::ProjectUtils::ReplaceFile -> ReplaceProjectFile to prevent conflict with Windows ReplaceFile #define Signed-off-by: bosnichd --- .../AzFramework/API/ApplicationAPI.h | 1 + .../ProjectManager/ProjectManager.cpp | 2 +- Code/Legacy/CryCommon/WinBase.cpp | 5 +- Code/Legacy/CrySystem/System.cpp | 1 - Code/Legacy/CrySystem/SystemWin32.cpp | 4 - .../ProjectManager/Source/ProjectUtils.cpp | 2 +- .../ProjectManager/Source/ProjectUtils.h | 2 +- .../Source/UpdateProjectCtrl.cpp | 2 +- .../Tools/ProjectManager/tests/UtilsTests.cpp | 2 +- .../Platform/Windows/RHI/Device_Windows.cpp | 8 ++ .../Platform/Windows/RHI/SwapChain_Platform.h | 10 +++ .../Windows/RHI/SwapChain_Windows.cpp | 56 +++++++++++++- .../Platform/Windows/RHI/SwapChain_Windows.h | 60 +++++++++++++++ .../platform_private_windows_files.cmake | 2 + Gems/Atom/RHI/DX12/Code/Source/RHI/Device.h | 4 + .../Source/RHI/RayTracingPipelineState.cpp | 4 +- .../RHI/DX12/Code/Source/RHI/SwapChain.cpp | 73 ------------------- .../Atom/RHI/DX12/Code/Source/RHI/SwapChain.h | 54 +------------- .../atom_rhi_dx12_private_common_files.cmake | 1 - Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt | 3 + .../ModuleStub_Unimplemented.cpp | 9 ++- Gems/PhysX/Code/physx_unsupported_files.cmake | 10 +++ 22 files changed, 172 insertions(+), 143 deletions(-) create mode 100644 Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Platform.h create mode 100644 Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.h delete mode 100644 Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.cpp create mode 100644 Gems/PhysX/Code/physx_unsupported_files.cmake diff --git a/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h b/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h index dbbf443656..1c5db0a82b 100644 --- a/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h +++ b/Code/Framework/AzFramework/AzFramework/API/ApplicationAPI.h @@ -18,6 +18,7 @@ #include #include #include +#include #include diff --git a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp index 33fafa2110..6bbb07ea74 100644 --- a/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp +++ b/Code/Framework/AzFramework/AzFramework/ProjectManager/ProjectManager.cpp @@ -83,7 +83,7 @@ namespace AzFramework::ProjectManager return ProjectPathCheckResult::ProjectManagerLaunchFailed; } - bool LaunchProjectManager(const AZStd::string& commandLineArgs) + bool LaunchProjectManager([[maybe_unused]]const AZStd::string& commandLineArgs) { bool launchSuccess = false; #if (AZ_TRAIT_AZFRAMEWORK_USE_PROJECT_MANAGER) diff --git a/Code/Legacy/CryCommon/WinBase.cpp b/Code/Legacy/CryCommon/WinBase.cpp index 71bec78f69..9f7cdfd609 100644 --- a/Code/Legacy/CryCommon/WinBase.cpp +++ b/Code/Legacy/CryCommon/WinBase.cpp @@ -6,9 +6,10 @@ * */ +#include // Description : Linux/Mac port support for Win32API calls -#if !defined(WIN32) +#if AZ_TRAIT_LEGACY_CRYCOMMON_USE_WINDOWS_STUBS #include "platform.h" // Note: This should be first to get consistent debugging definitions @@ -1391,4 +1392,4 @@ __finddata64_t::~__finddata64_t() } #endif //defined(APPLE) || defined(LINUX) -#endif // !defined(WIN32) +#endif // AZ_TRAIT_LEGACY_CRYCOMMON_USE_WINDOWS_STUBS diff --git a/Code/Legacy/CrySystem/System.cpp b/Code/Legacy/CrySystem/System.cpp index 71775dbb6c..4a9d9ece5f 100644 --- a/Code/Legacy/CrySystem/System.cpp +++ b/Code/Legacy/CrySystem/System.cpp @@ -131,7 +131,6 @@ LRESULT WINAPI WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) #include "SystemEventDispatcher.h" #include "HMDBus.h" -#include "zlib.h" #include "RemoteConsole/RemoteConsole.h" #include diff --git a/Code/Legacy/CrySystem/SystemWin32.cpp b/Code/Legacy/CrySystem/SystemWin32.cpp index 20f4d7ef65..4f0a154afe 100644 --- a/Code/Legacy/CrySystem/SystemWin32.cpp +++ b/Code/Legacy/CrySystem/SystemWin32.cpp @@ -273,11 +273,7 @@ static const char* GetLastSystemErrorMessage() return szBuffer; } -#else - return 0; - #endif //WIN32 - return 0; } diff --git a/Code/Tools/ProjectManager/Source/ProjectUtils.cpp b/Code/Tools/ProjectManager/Source/ProjectUtils.cpp index fb3f7e0270..84d731832e 100644 --- a/Code/Tools/ProjectManager/Source/ProjectUtils.cpp +++ b/Code/Tools/ProjectManager/Source/ProjectUtils.cpp @@ -441,7 +441,7 @@ namespace O3DE::ProjectManager return true; } - bool ReplaceFile(const QString& origFile, const QString& newFile, QWidget* parent, bool interactive) + bool ReplaceProjectFile(const QString& origFile, const QString& newFile, QWidget* parent, bool interactive) { QFileInfo original(origFile); if (original.exists()) diff --git a/Code/Tools/ProjectManager/Source/ProjectUtils.h b/Code/Tools/ProjectManager/Source/ProjectUtils.h index d06b8c2c8b..f1050531d4 100644 --- a/Code/Tools/ProjectManager/Source/ProjectUtils.h +++ b/Code/Tools/ProjectManager/Source/ProjectUtils.h @@ -25,7 +25,7 @@ namespace O3DE::ProjectManager bool DeleteProjectFiles(const QString& path, bool force = false); bool MoveProject(QString origPath, QString newPath, QWidget* parent, bool skipRegister = false); - bool ReplaceFile(const QString& origFile, const QString& newFile, QWidget* parent = nullptr, bool interactive = true); + bool ReplaceProjectFile(const QString& origFile, const QString& newFile, QWidget* parent = nullptr, bool interactive = true); bool FindSupportedCompiler(QWidget* parent = nullptr); AZ::Outcome FindSupportedCompilerForPlatform(); diff --git a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp index e1b6d740e2..08ad7f24d9 100644 --- a/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp +++ b/Code/Tools/ProjectManager/Source/UpdateProjectCtrl.cpp @@ -242,7 +242,7 @@ namespace O3DE::ProjectManager if (!newProjectSettings.m_newPreviewImagePath.isEmpty()) { - if (!ProjectUtils::ReplaceFile( + if (!ProjectUtils::ReplaceProjectFile( QDir(newProjectSettings.m_path).filePath(newProjectSettings.m_iconPath), newProjectSettings.m_newPreviewImagePath)) { QMessageBox::critical(this, tr("File replace failed"), tr("Failed to replace project preview image.")); diff --git a/Code/Tools/ProjectManager/tests/UtilsTests.cpp b/Code/Tools/ProjectManager/tests/UtilsTests.cpp index bfe26ba760..760b599ad8 100644 --- a/Code/Tools/ProjectManager/tests/UtilsTests.cpp +++ b/Code/Tools/ProjectManager/tests/UtilsTests.cpp @@ -202,7 +202,7 @@ namespace O3DE::ProjectManager TEST_F(ProjectManagerUtilsTests, ReplaceFile_Succeeds) #endif // !AZ_TRAIT_DISABLE_FAILED_PROJECT_MANAGER_TESTS { - EXPECT_TRUE(ReplaceFile(m_projectAOrigFilePath, m_projectAReplaceFilePath, nullptr, false)); + EXPECT_TRUE(ReplaceProjectFile(m_projectAOrigFilePath, m_projectAReplaceFilePath, nullptr, false)); QFile origFile(m_projectAOrigFilePath); EXPECT_TRUE(origFile.open(QIODevice::ReadOnly)); diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp index 7cf83e28bc..51272f3488 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp @@ -258,6 +258,14 @@ namespace AZ return RHI::ResultCode::Success; } + RHI::ResultCode Device::CreateSwapChain( + [[maybe_unused]] const DXGI_SWAP_CHAIN_DESCX& swapChainDesc, + [[maybe_unused]] AZStd::array, RHI::Limits::Device::FrameCountMax>& outSwapChainResources) + { + AZ_Assert(false, "Wrong Device::CreateSwapChain function called on Windows."); + return RHI::ResultCode::Fail; + } + AZStd::vector Device::GetValidSwapChainImageFormats(const RHI::WindowHandle& windowHandle) const { AZStd::vector formatsList; diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Platform.h b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Platform.h new file mode 100644 index 0000000000..f611027497 --- /dev/null +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Platform.h @@ -0,0 +1,10 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.cpp b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.cpp index 9a6d7e44d1..ab14f9b5d3 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.cpp @@ -5,15 +5,28 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#include + +#include + #include #include +#include #include namespace AZ { namespace DX12 { + RHI::Ptr SwapChain::Create() + { + return aznew SwapChain(); + } + + Device& SwapChain::GetDevice() const + { + return static_cast(RHI::SwapChain::GetDevice()); + } + RHI::ResultCode SwapChain::InitInternal(RHI::Device& deviceBase, const RHI::SwapChainDescriptor& descriptor, RHI::SwapChainDimensions* nativeDimensions) { // Check whether tearing support is available for full screen borderless windowed mode. @@ -165,6 +178,47 @@ namespace AZ return GetCurrentImageIndex(); } + RHI::ResultCode SwapChain::InitImageInternal(const InitImageRequest& request) + { + Device& device = GetDevice(); + + Microsoft::WRL::ComPtr resource; + DX12::AssertSuccess(m_swapChain->GetBuffer(request.m_imageIndex, IID_GRAPHICS_PPV_ARGS(resource.GetAddressOf()))); + + D3D12_RESOURCE_ALLOCATION_INFO allocationInfo; + device.GetImageAllocationInfo(request.m_descriptor, allocationInfo); + + Name name(AZStd::string::format("SwapChainImage_%d", request.m_imageIndex)); + + Image& image = static_cast(*request.m_image); + image.m_memoryView = MemoryView(resource.Get(), 0, allocationInfo.SizeInBytes, allocationInfo.Alignment, MemoryViewType::Image); + image.SetName(name); + image.GenerateSubresourceLayouts(); + // Overwrite m_initialAttachmentState because Swapchain images are created with D3D12_RESOURCE_STATE_COMMON state + image.SetAttachmentState(D3D12_RESOURCE_STATE_COMMON); + + RHI::HeapMemoryUsage& memoryUsage = m_memoryUsage.GetHeapMemoryUsage(RHI::HeapMemoryLevel::Device); + memoryUsage.m_reservedInBytes += allocationInfo.SizeInBytes; + memoryUsage.m_residentInBytes += allocationInfo.SizeInBytes; + + return RHI::ResultCode::Success; + } + + void SwapChain::ShutdownResourceInternal(RHI::Resource& resourceBase) + { + Image& image = static_cast(resourceBase); + + const size_t sizeInBytes = image.GetMemoryView().GetSize(); + + RHI::HeapMemoryUsage& memoryUsage = m_memoryUsage.GetHeapMemoryUsage(RHI::HeapMemoryLevel::Device); + memoryUsage.m_reservedInBytes -= sizeInBytes; + memoryUsage.m_residentInBytes -= sizeInBytes; + + GetDevice().QueueForRelease(image.m_memoryView); + + image.m_memoryView = {}; + } + RHI::ResultCode SwapChain::ResizeInternal(const RHI::SwapChainDimensions& dimensions, RHI::SwapChainDimensions* nativeDimensions) { GetDevice().WaitForIdle(); diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.h b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.h new file mode 100644 index 0000000000..2e45371c48 --- /dev/null +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/SwapChain_Windows.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include +#include + +namespace AZ +{ + namespace DX12 + { + class Device; + + class SwapChain + : public RHI::SwapChain + { + public: + AZ_RTTI(SwapChain, "{974AC6A9-5009-47BE-BD7E-61348BF623F0}", RHI::SwapChain); + AZ_CLASS_ALLOCATOR(SwapChain, AZ::SystemAllocator, 0); + + static RHI::Ptr Create(); + + Device& GetDevice() const; + + private: + SwapChain() = default; + friend class SwapChainFactory; + + ////////////////////////////////////////////////////////////////////////// + // RHI::SwapChain + RHI::ResultCode InitInternal(RHI::Device& deviceBase, const RHI::SwapChainDescriptor& descriptor, RHI::SwapChainDimensions* nativeDimensions) override; + void ShutdownInternal() override; + uint32_t PresentInternal() override; + RHI::ResultCode InitImageInternal(const InitImageRequest& request) override; + void ShutdownResourceInternal(RHI::Resource& resourceBase) override; + RHI::ResultCode ResizeInternal(const RHI::SwapChainDimensions& dimensions, RHI::SwapChainDimensions* nativeDimensions) override; + bool IsExclusiveFullScreenPreferred() const override; + bool GetExclusiveFullScreenState() const override; + bool SetExclusiveFullScreenState(bool fullScreenState) override; + ////////////////////////////////////////////////////////////////////////// + + void ConfigureDisplayMode(const RHI::SwapChainDimensions& dimensions); + void EnsureColorSpace(const DXGI_COLOR_SPACE_TYPE& colorSpace); + void DisableHdr(); + void SetHDRMetaData(float maxOutputNits, float minOutputNits, float maxContentLightLevel, float maxFrameAverageLightLevel); + + static const uint32_t InvalidColorSpace = 0xFFFFFFFE; + DXGI_COLOR_SPACE_TYPE m_colorSpace = static_cast(InvalidColorSpace); + + RHI::Ptr m_swapChain; + bool m_isInFullScreenExclusiveState = false; //!< Was SetFullscreenState used to enter full screen exclusive state? + bool m_isTearingSupported = false; //!< Is tearing support available for full screen borderless windowed mode? + }; + } +} diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows_files.cmake b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows_files.cmake index e3a60c937c..5333b89336 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows_files.cmake +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows_files.cmake @@ -22,7 +22,9 @@ set(FILES RHI/DX12_Windows.cpp RHI/DX12_Windows.h RHI/SystemComponent_Windows.cpp + RHI/SwapChain_Platform.h RHI/SwapChain_Windows.cpp + RHI/SwapChain_Windows.h RHI/NsightAftermathGpuCrashTracker_Windows.cpp RHI/NsightAftermathGpuCrashTracker_Windows.h RHI/NsightAftermath_Windows.cpp diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.h index 4d1f2c4ac9..7004900ec5 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.h @@ -57,6 +57,10 @@ namespace AZ const DXGI_SWAP_CHAIN_DESCX& swapChainDesc, RHI::Ptr& swapChain); + RHI::ResultCode CreateSwapChain( + const DXGI_SWAP_CHAIN_DESCX& swapChainDesc, + AZStd::array, RHI::Limits::Device::FrameCountMax>& outSwapChainResources); + void GetImageAllocationInfo( const RHI::ImageDescriptor& descriptor, D3D12_RESOURCE_ALLOCATION_INFO& info); diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingPipelineState.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingPipelineState.cpp index be0c084d95..37f4e6b49a 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingPipelineState.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingPipelineState.cpp @@ -28,11 +28,11 @@ namespace AZ } #endif - RHI::ResultCode RayTracingPipelineState::InitInternal(RHI::Device& deviceBase, [[maybe_unused]]const RHI::RayTracingPipelineStateDescriptor* descriptor) + RHI::ResultCode RayTracingPipelineState::InitInternal([[maybe_unused]]RHI::Device& deviceBase, [[maybe_unused]]const RHI::RayTracingPipelineStateDescriptor* descriptor) { +#ifdef AZ_DX12_DXR_SUPPORT Device& device = static_cast(deviceBase); -#ifdef AZ_DX12_DXR_SUPPORT size_t dxilLibraryCount = descriptor->GetShaderLibraries().size(); size_t hitGroupCount = descriptor->GetHitGroups().size(); diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.cpp deleted file mode 100644 index bb5acc878a..0000000000 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -#include -#include -#include -#include -#include -#include -#include -#include - -namespace AZ -{ - namespace DX12 - { - RHI::Ptr SwapChain::Create() - { - return aznew SwapChain(); - } - - Device& SwapChain::GetDevice() const - { - return static_cast(Base::GetDevice()); - } - - RHI::ResultCode SwapChain::InitImageInternal(const InitImageRequest& request) - { - - Device& device = GetDevice(); - - Microsoft::WRL::ComPtr resource; - DX12::AssertSuccess(m_swapChain->GetBuffer(request.m_imageIndex, IID_GRAPHICS_PPV_ARGS(resource.GetAddressOf()))); - - D3D12_RESOURCE_ALLOCATION_INFO allocationInfo; - device.GetImageAllocationInfo(request.m_descriptor, allocationInfo); - - Name name(AZStd::string::format("SwapChainImage_%d", request.m_imageIndex)); - - Image& image = static_cast(*request.m_image); - image.m_memoryView = MemoryView(resource.Get(), 0, allocationInfo.SizeInBytes, allocationInfo.Alignment, MemoryViewType::Image); - image.SetName(name); - image.GenerateSubresourceLayouts(); - // Overwrite m_initialAttachmentState because Swapchain images are created with D3D12_RESOURCE_STATE_COMMON state - image.SetAttachmentState(D3D12_RESOURCE_STATE_COMMON); - - RHI::HeapMemoryUsage& memoryUsage = m_memoryUsage.GetHeapMemoryUsage(RHI::HeapMemoryLevel::Device); - memoryUsage.m_reservedInBytes += allocationInfo.SizeInBytes; - memoryUsage.m_residentInBytes += allocationInfo.SizeInBytes; - - return RHI::ResultCode::Success; - } - - void SwapChain::ShutdownResourceInternal(RHI::Resource& resourceBase) - { - Image& image = static_cast(resourceBase); - - const size_t sizeInBytes = image.GetMemoryView().GetSize(); - - RHI::HeapMemoryUsage& memoryUsage = m_memoryUsage.GetHeapMemoryUsage(RHI::HeapMemoryLevel::Device); - memoryUsage.m_reservedInBytes -= sizeInBytes; - memoryUsage.m_residentInBytes -= sizeInBytes; - - GetDevice().QueueForRelease(image.m_memoryView); - - image.m_memoryView = {}; - } - } -} diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h index 8035ae1e38..bd12b1f316 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/SwapChain.h @@ -7,56 +7,4 @@ */ #pragma once -#include -#include - -namespace AZ -{ - namespace DX12 - { - class Device; - class Image; - class CommandQueue; - - class SwapChain - : public RHI::SwapChain - { - using Base = RHI::SwapChain; - public: - AZ_RTTI(SwapChain, "{974AC6A9-5009-47BE-BD7E-61348BF623F0}", Base); - AZ_CLASS_ALLOCATOR(SwapChain, AZ::SystemAllocator, 0); - - static RHI::Ptr Create(); - - Device& GetDevice() const; - - private: - SwapChain() = default; - - ////////////////////////////////////////////////////////////////////////// - // RHI::SwapChain - RHI::ResultCode InitInternal(RHI::Device& deviceBase, const RHI::SwapChainDescriptor& descriptor, RHI::SwapChainDimensions* nativeDimensions) override; - void ShutdownInternal() override; - uint32_t PresentInternal() override; - RHI::ResultCode InitImageInternal(const InitImageRequest& request) override; - void ShutdownResourceInternal(RHI::Resource& resourceBase) override; - RHI::ResultCode ResizeInternal(const RHI::SwapChainDimensions& dimensions, RHI::SwapChainDimensions* nativeDimensions) override; - bool IsExclusiveFullScreenPreferred() const override; - bool GetExclusiveFullScreenState() const override; - bool SetExclusiveFullScreenState(bool fullScreenState) override; - ////////////////////////////////////////////////////////////////////////// - - void ConfigureDisplayMode(const RHI::SwapChainDimensions& dimensions); - void EnsureColorSpace(const DXGI_COLOR_SPACE_TYPE& colorSpace); - void DisableHdr(); - void SetHDRMetaData(float maxOutputNits, float minOutputNits, float maxContentLightLevel, float maxFrameAverageLightLevel); - - static const uint32_t InvalidColorSpace = 0xFFFFFFFE; - DXGI_COLOR_SPACE_TYPE m_colorSpace = static_cast(InvalidColorSpace); - - RHI::Ptr m_swapChain; - bool m_isInFullScreenExclusiveState = false; //!< Was SetFullscreenState used to enter full screen exclusive state? - bool m_isTearingSupported = false; //!< Is tearing support available for full screen borderless windowed mode? - }; - } -} +#include diff --git a/Gems/Atom/RHI/DX12/Code/atom_rhi_dx12_private_common_files.cmake b/Gems/Atom/RHI/DX12/Code/atom_rhi_dx12_private_common_files.cmake index 3ad79398b4..807a637b0f 100644 --- a/Gems/Atom/RHI/DX12/Code/atom_rhi_dx12_private_common_files.cmake +++ b/Gems/Atom/RHI/DX12/Code/atom_rhi_dx12_private_common_files.cmake @@ -95,7 +95,6 @@ set(FILES Source/RHI/ShaderResourceGroup.h Source/RHI/ShaderResourceGroupPool.cpp Source/RHI/ShaderResourceGroupPool.h - Source/RHI/SwapChain.cpp Source/RHI/SwapChain.h Source/RHI/DX12.cpp Source/RHI/DX12.h diff --git a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt index f4148b435e..5c74852f57 100644 --- a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt @@ -19,9 +19,12 @@ if(NOT PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED) NAMESPACE Gem FILES_CMAKE atom_rhi_vulkan_stub_module.cmake + atom_rhi_vulkan_reflect_common_files.cmake INCLUDE_DIRECTORIES PRIVATE + Include Source + ${pal_include_dir} Include/Atom/RHI.Loader/Glad BUILD_DEPENDENCIES PRIVATE diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp index 8c06700404..44a8a26968 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp @@ -5,6 +5,8 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + +#include #include namespace AZ @@ -17,7 +19,12 @@ namespace AZ public: AZ_RTTI(PlatformModule, "{958CB096-796C-42C7-9B29-17C6FE792C30}", Module); - PlatformModule() = default; + PlatformModule() + { + m_descriptors.insert(m_descriptors.end(), { + ReflectSystemComponent::CreateDescriptor() + }); + } ~PlatformModule() override = default; AZ::ComponentTypeList GetRequiredSystemComponents() const override diff --git a/Gems/PhysX/Code/physx_unsupported_files.cmake b/Gems/PhysX/Code/physx_unsupported_files.cmake new file mode 100644 index 0000000000..c2c5a11c4c --- /dev/null +++ b/Gems/PhysX/Code/physx_unsupported_files.cmake @@ -0,0 +1,10 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES +) From d8365038147d0205ae64df7c80c605ff042366f4 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Thu, 9 Sep 2021 11:50:13 -0700 Subject: [PATCH 219/355] some more fixes Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Application/ToolsApplication.h | 2 +- .../Entity/EditorEntitySortComponent.h | 2 +- .../Instance/InstanceToTemplatePropagator.h | 2 +- .../SliceMetadataEntityContextComponent.h | 4 +-- .../EditorInspectorComponent.h | 2 +- .../EditorNonUniformScaleComponent.h | 2 +- .../UI/Logging/TracePrintFLogPanel.h | 10 +++---- .../UI/PropertyEditor/PropertyEditorAPI.h | 26 +++++++++---------- .../PropertyEditor/PropertyManagerComponent.h | 12 ++++----- .../UI/Slice/SlicePushWidget.hxx | 2 +- .../AtomLyIntegration/AtomFont/AtomFont.h | 2 +- .../Code/Source/AtomFontSystemComponent.h | 2 +- .../Code/Source/BarrierInputKeyboard.h | 6 ++--- .../Code/EMotionFX/Source/AnimGraphHubNode.h | 2 +- .../EMotionFX/Source/AnimGraphReferenceNode.h | 4 +-- .../Integration/System/SystemComponent.cpp | 2 +- .../Code/Include/ScriptCanvas/Core/Node.h | 18 ++++++------- .../ScriptCanvas/Debugger/ClientTransceiver.h | 2 +- .../TerrainSurfaceDataSystemComponent.h | 2 +- 19 files changed, 52 insertions(+), 52 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h index e7fa543faf..0e70fe0b41 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h @@ -37,7 +37,7 @@ namespace AzToolsFramework ToolsApplication(int* argc = nullptr, char*** argv = nullptr); ~ToolsApplication(); - void Stop(); + void Stop() override; void CreateReflectionManager() override; void Reflect(AZ::ReflectContext* context) override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntitySortComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntitySortComponent.h index b5a771f658..d728191c64 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntitySortComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/EditorEntitySortComponent.h @@ -65,7 +65,7 @@ namespace AzToolsFramework /** * Called right before we start reading from the instance pointed by classPtr. */ - void OnReadBegin(void* classPtr) + void OnReadBegin(void* classPtr) override { EditorEntitySortComponent* component = reinterpret_cast(classPtr); component->PrepareSave(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h index 57d92d78f4..75acb410c9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Instance/InstanceToTemplatePropagator.h @@ -31,7 +31,7 @@ namespace AzToolsFramework void AppendEntityAliasToPatchPaths(PrefabDom& providedPatch, const AZ::EntityId& entityId) override; - InstanceOptionalReference GetTopMostInstanceInHierarchy(AZ::EntityId entityId); + InstanceOptionalReference GetTopMostInstanceInHierarchy(AZ::EntityId entityId) override; bool PatchTemplate(PrefabDomValue& providedPatch, TemplateId templateId, InstanceOptionalReference instanceToExclude = AZStd::nullopt) override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.h index 08fa9f03ce..71e4e8d8f3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Slice/SliceMetadataEntityContextComponent.h @@ -76,10 +76,10 @@ namespace AzToolsFramework void ResetContext() override; void GetRequiredComponentTypes(AZ::ComponentTypeList& required) override; bool IsSliceMetadataEntity(const AZ::EntityId entityId) override; - AZ::Entity* GetMetadataEntity(const AZ::EntityId entityId); + AZ::Entity* GetMetadataEntity(const AZ::EntityId entityId) override; AZ::EntityId GetMetadataEntityIdFromEditorEntity(const AZ::EntityId editorEntityId) override; AZ::EntityId GetMetadataEntityIdFromSliceAddress(const AZ::SliceComponent::SliceInstanceAddress& address) override; - void AddMetadataEntityToContext(const AZ::SliceComponent::SliceInstanceAddress& /*sliceAddress*/, AZ::Entity& entity); + void AddMetadataEntityToContext(const AZ::SliceComponent::SliceInstanceAddress& /*sliceAddress*/, AZ::Entity& entity) override; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h index ecc7e34c76..f9170e67b0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorInspectorComponent.h @@ -61,7 +61,7 @@ namespace AzToolsFramework /** * Called right before we start reading from the instance pointed by classPtr. */ - void OnReadBegin(void* classPtr) + void OnReadBegin(void* classPtr) override { EditorInspectorComponent* component = reinterpret_cast(classPtr); component->PrepareSave(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.h index 66d7cd67d7..0c1ec4c153 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ToolsComponents/EditorNonUniformScaleComponent.h @@ -37,7 +37,7 @@ namespace AzToolsFramework // AZ::NonUniformScaleRequestBus::Handler ... AZ::Vector3 GetScale() const override; void SetScale(const AZ::Vector3& scale) override; - void RegisterScaleChangedEvent(AZ::NonUniformScaleChangedEvent::Handler& handler); + void RegisterScaleChangedEvent(AZ::NonUniformScaleChangedEvent::Handler& handler) override; private: static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h index 78462e842f..755e27db67 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Logging/TracePrintFLogPanel.h @@ -62,11 +62,11 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// // TraceMessagesBus - virtual bool OnAssert(const char* message); - virtual bool OnException(const char* message); - virtual bool OnError(const char* window, const char* message); - virtual bool OnWarning(const char* window, const char* message); - virtual bool OnPrintf(const char* window, const char* message); + bool OnAssert(const char* message) override; + bool OnException(const char* message) override; + bool OnError(const char* window, const char* message) override; + bool OnWarning(const char* window, const char* message) override; + bool OnPrintf(const char* window, const char* message) override; ////////////////////////////////////////////////////////////////////////// /// Log a message received from the TraceMessageBus diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h index 9ab896ab9d..6d3ccd45bd 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h @@ -55,12 +55,12 @@ namespace AzToolsFramework // GUI is a pointer to the GUI used to editor your property (the one you created in CreateGUI) // and instance is a the actual value (PropertyType). // you may not cache the pointer to anything. - virtual void WriteGUIValuesIntoProperty(size_t index, WidgetType* GUI, PropertyType& instance, InstanceDataNode* node) = 0; + void WriteGUIValuesIntoProperty(size_t index, WidgetType* GUI, PropertyType& instance, InstanceDataNode* node) override = 0; // this will get called in order to initialize your gui. It will be called once for each instance. // for example if you have multiple objects selected, index will go from 0 to however many there are. // you may not cache the pointer to anything. - virtual bool ReadValuesIntoGUI(size_t index, WidgetType* GUI, const PropertyType& instance, InstanceDataNode* node) = 0; + bool ReadValuesIntoGUI(size_t index, WidgetType* GUI, const PropertyType& instance, InstanceDataNode* node) override = 0; // this will be called in order to initialize or refresh your gui. Your class will be fed one attribute at a time // you may override this to interpret the attributes as you wish - use attrValue->Read() for example, to interpret it as an int. @@ -87,19 +87,19 @@ namespace AzToolsFramework // and cause the next row to tab to your last button, when the user hits shift+tab on the next row. // if your widget is a single widget or has a single focus proxy there is no need to override. // you may not cache the pointer to anything. - virtual QWidget* GetFirstInTabOrder(WidgetType* widget) { return widget; } - virtual QWidget* GetLastInTabOrder(WidgetType* widget) { return widget; } + QWidget* GetFirstInTabOrder(WidgetType* widget) override { return widget; } + QWidget* GetLastInTabOrder(WidgetType* widget) override { return widget; } // implement this function in order to set your internal tab order between child controls. // just call a series of QWidget::setTabOrder // you may not cache the pointer to anything. - virtual void UpdateWidgetInternalTabbing(WidgetType* /*widget*/) { } + void UpdateWidgetInternalTabbing(WidgetType* /*widget*/) override {} // you must implement CreateGUI: // create an instance of the GUI that is used to edit this property type. // the QWidget pointer you return also serves as a handle for accessing data. This means that in order to trigger // a write, you need to call RequestWrite(...) on that same widget handle you return. - virtual QWidget* CreateGUI(QWidget *pParent) override = 0; + QWidget* CreateGUI(QWidget *pParent) override = 0; // you MAY override this if you wish to pool your widgets or reuse them. The default implementation simply calls delete. //virtual QWidget* DestroyGUI(QWidget* object) override; @@ -129,24 +129,24 @@ namespace AzToolsFramework return false; } - virtual QWidget* GetFirstInTabOrder(WidgetType* widget) { return widget; } + QWidget* GetFirstInTabOrder(WidgetType* widget) override { return widget; } virtual QWidget* GetLastInTabOrder(WidgetType* widget) { return widget; } virtual void UpdateWidgetInternalTabbing(WidgetType* /*widget*/) { } - virtual QWidget* CreateGUI(QWidget *pParent) override = 0; + QWidget* CreateGUI(QWidget *pParent) override = 0; protected: - virtual bool HandlesType(const AZ::Uuid& id) const override + bool HandlesType(const AZ::Uuid& id) const override { (void)id; return true; } - virtual const AZ::Uuid& GetHandledType() const override + const AZ::Uuid& GetHandledType() const override { return nullUuid; } - virtual void WriteGUIValuesIntoProperty_Internal(QWidget* widget, InstanceDataNode* node) override + void WriteGUIValuesIntoProperty_Internal(QWidget* widget, InstanceDataNode* node) override { for (size_t i = 0; i < node->GetNumInstances(); ++i) { @@ -154,13 +154,13 @@ namespace AzToolsFramework } } - virtual void WriteGUIValuesIntoTempProperty_Internal(QWidget* widget, void* tempValue, const AZ::Uuid& propertyType, AZ::SerializeContext* serializeContext) override + void WriteGUIValuesIntoTempProperty_Internal(QWidget* widget, void* tempValue, const AZ::Uuid& propertyType, AZ::SerializeContext* serializeContext) override { (void)serializeContext; WriteGUIValuesIntoProperty(0, reinterpret_cast(widget), tempValue, propertyType); } - virtual void ReadValuesIntoGUI_Internal(QWidget* widget, InstanceDataNode* node) override + void ReadValuesIntoGUI_Internal(QWidget* widget, InstanceDataNode* node) override { AZ_PROFILE_FUNCTION(AzToolsFramework); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.h index 4be288f52b..423bf401af 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyManagerComponent.h @@ -34,11 +34,11 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// // AZ::Component - virtual void Init(); - virtual void Activate(); - virtual void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; - virtual PropertyHandlerBase* ResolvePropertyHandler(AZ::u32 handlerName, const AZ::Uuid& handlerType) override; + PropertyHandlerBase* ResolvePropertyHandler(AZ::u32 handlerName, const AZ::Uuid& handlerType) override; ////////////////////////////////////////////////////////////////////////// private: @@ -57,8 +57,8 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// // PropertyTypeRegistrationMessages::Bus::Handler - virtual void RegisterPropertyType(PropertyHandlerBase* pHandler) override; - virtual void UnregisterPropertyType(PropertyHandlerBase* pHandler) override; + void RegisterPropertyType(PropertyHandlerBase* pHandler) override; + void UnregisterPropertyType(PropertyHandlerBase* pHandler) override; ////////////////////////////////////////////////////////////////////////// typedef AZStd::unordered_multimap HandlerMap; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.hxx index 61cbf4a541..879d0d4abc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Slice/SlicePushWidget.hxx @@ -235,7 +235,7 @@ namespace AzToolsFramework void PopulateFieldTreeRemovedEntities(); /// Event filter for key presses. - bool eventFilter(QObject* target, QEvent *event); + bool eventFilter(QObject* target, QEvent *event) override; /// Conduct the push operation for all selected fields. bool PushSelectedFields(); diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h index 8862462093..b1a91b5aa5 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/AtomFont.h @@ -82,7 +82,7 @@ namespace AZ FontFamilyPtr LoadFontFamily(const char* fontFamilyName) override; FontFamilyPtr GetFontFamily(const char* fontFamilyName) override; void AddCharsToFontTextures(FontFamilyPtr fontFamily, const char* chars, int glyphSizeX = ICryFont::defaultGlyphSizeX, int glyphSizeY = ICryFont::defaultGlyphSizeY) override; - AZStd::string GetLoadedFontNames() const; + AZStd::string GetLoadedFontNames() const override; void OnLanguageChanged() override; void ReloadAllFonts() override; ////////////////////////////////////////////////////////////////////////////////// diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFontSystemComponent.h b/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFontSystemComponent.h index 02290e0fed..59f057ddaf 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFontSystemComponent.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/AtomFontSystemComponent.h @@ -38,7 +38,7 @@ namespace AZ //////////////////////////////////////////////////////////////////////// // CrySystemEventBus - void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& initParams); + void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& initParams) override; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// diff --git a/Gems/BarrierInput/Code/Source/BarrierInputKeyboard.h b/Gems/BarrierInput/Code/Source/BarrierInputKeyboard.h index d7321faaec..946d0df11a 100644 --- a/Gems/BarrierInput/Code/Source/BarrierInputKeyboard.h +++ b/Gems/BarrierInput/Code/Source/BarrierInputKeyboard.h @@ -64,15 +64,15 @@ namespace BarrierInput //////////////////////////////////////////////////////////////////////////////////////////// //! \ref RawInputNotificationsBarrier::OnRawKeyboardKeyDownEvent - virtual void OnRawKeyboardKeyDownEvent(uint32_t scanCode, ModifierMask activeModifiers); + void OnRawKeyboardKeyDownEvent(uint32_t scanCode, ModifierMask activeModifiers) override; //////////////////////////////////////////////////////////////////////////////////////////// //! \ref RawInputNotificationsBarrier::OnRawKeyboardKeyUpEvent - virtual void OnRawKeyboardKeyUpEvent(uint32_t scanCode, ModifierMask activeModifiers); + void OnRawKeyboardKeyUpEvent(uint32_t scanCode, ModifierMask activeModifiers) override; //////////////////////////////////////////////////////////////////////////////////////////// //! \ref RawInputNotificationsBarrier::OnRawKeyboardKeyRepeatEvent - virtual void OnRawKeyboardKeyRepeatEvent(uint32_t scanCode, ModifierMask activeModifiers); + void OnRawKeyboardKeyRepeatEvent(uint32_t scanCode, ModifierMask activeModifiers) override; //////////////////////////////////////////////////////////////////////////////////////////// //! Thread safe method to queue raw key events to be processed in the main thread update diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphHubNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphHubNode.h index 6db908cf33..99ad6ced7d 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphHubNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphHubNode.h @@ -61,7 +61,7 @@ namespace EMotionFX bool GetSupportsVisualization() const override { return true; } AnimGraphPose* GetMainOutputPose(AnimGraphInstance* animGraphInstance) const override { return GetOutputPose(animGraphInstance, OUTPUTPORT_RESULT)->GetValue(); } bool GetHasOutputPose() const override { return true; } - bool GetCanBeEntryNode() const { return true; } + bool GetCanBeEntryNode() const override { return true; } bool GetCanBeInsideStateMachineOnly() const override { return true; } bool GetHasVisualOutputPorts() const override { return false; } bool GetCanHaveOnlyOneInsideParent() const override { return false; } diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphReferenceNode.h b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphReferenceNode.h index db4dc0ea3e..db1d6e1279 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphReferenceNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/AnimGraphReferenceNode.h @@ -82,8 +82,8 @@ namespace EMotionFX AnimGraphReferenceNode(); ~AnimGraphReferenceNode(); - void Reinit(); - void RecursiveReinit(); + void Reinit() override; + void RecursiveReinit() override; bool InitAfterLoading(AnimGraph* animGraph) override; AnimGraphObjectData* CreateUniqueData(AnimGraphInstance* animGraphInstance) override { return aznew UniqueData(this, animGraphInstance); } diff --git a/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp b/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp index b5a252e293..56c22bb1ff 100644 --- a/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp +++ b/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.cpp @@ -115,7 +115,7 @@ namespace EMotionFX public: AZ_CLASS_ALLOCATOR(EMotionFXEventHandler, EMotionFXAllocator, 0); - const AZStd::vector GetHandledEventTypes() const + const AZStd::vector GetHandledEventTypes() const override { return { EVENT_TYPE_ON_EVENT, diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h index 0ef109d383..a54f330e18 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Node.h @@ -69,14 +69,14 @@ namespace ScriptCanvas { public: /// Called right before we start reading from the instance pointed by classPtr. - void OnReadBegin(void* objectPtr) + void OnReadBegin(void* objectPtr) override { t_Class* deserializedObject = reinterpret_cast(objectPtr); deserializedObject->OnReadBegin(); } /// Called after we are done reading from the instance pointed by classPtr. - void OnReadEnd(void* objectPtr) + void OnReadEnd(void* objectPtr) override { t_Class* deserializedObject = reinterpret_cast(objectPtr); deserializedObject->OnReadEnd(); @@ -224,7 +224,7 @@ namespace ScriptCanvas m_dataType = dataReference; } - virtual Data::Type GetDataType() override + Data::Type GetDataType() override { return Data::FromAZType(azrtti_typeid()); } @@ -310,7 +310,7 @@ namespace ScriptCanvas } // ComboBoxPropertyInterface - int GetSelectedIndex() const + int GetSelectedIndex() const override { int counter = -1; @@ -328,7 +328,7 @@ namespace ScriptCanvas return counter; } - void SetSelectedIndex(int index) + void SetSelectedIndex(int index) override { if (index >= 0 || index < m_displaySet.size()) { @@ -513,13 +513,13 @@ namespace ScriptCanvas //! Node internal initialization, for custom init, use OnInit - void Init() override final; + void Init() final; //! Node internal activation and housekeeping, for custom activation configuration use OnActivate - void Activate() override final; + void Activate() final; //! Node internal deactivation and housekeeping, for custom deactivation configuration use OnDeactivate - void Deactivate() override final; + void Deactivate() final; void PostActivate(); @@ -591,7 +591,7 @@ namespace ScriptCanvas NodeDisabledFlag GetNodeDisabledFlag() const; void SetNodeDisabledFlag(NodeDisabledFlag disabledFlag); - bool RemoveVariableReferences(const AZStd::unordered_set< ScriptCanvas::VariableId >& variableIds); + bool RemoveVariableReferences(const AZStd::unordered_set< ScriptCanvas::VariableId >& variableIds) override; //// Slot* GetSlotByName(AZStd::string_view slotName) const; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ClientTransceiver.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ClientTransceiver.h index 23406fbf56..78e293c4b0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ClientTransceiver.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ClientTransceiver.h @@ -78,7 +78,7 @@ namespace ScriptCanvas ////////////////////////////////////////////////////////////////////////// // TargetManagerClient void DesiredTargetConnected(bool connected) override; - void DesiredTargetChanged(AZ::u32 newId, AZ::u32 oldId); + void DesiredTargetChanged(AZ::u32 newId, AZ::u32 oldId) override; void TargetJoinedNetwork(AzFramework::TargetInfo info) override; void TargetLeftNetwork(AzFramework::TargetInfo info) override; ////////////////////////////////////////////////////////////////////////// diff --git a/Gems/Terrain/Code/Source/Components/TerrainSurfaceDataSystemComponent.h b/Gems/Terrain/Code/Source/Components/TerrainSurfaceDataSystemComponent.h index a742eab78c..d9c7893c77 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainSurfaceDataSystemComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainSurfaceDataSystemComponent.h @@ -56,7 +56,7 @@ namespace Terrain ////////////////////////////////////////////////////////////////////////// // SurfaceDataProviderRequestBus - void GetSurfacePoints(const AZ::Vector3& inPosition, SurfaceData::SurfacePointList& surfacePointList) const; + void GetSurfacePoints(const AZ::Vector3& inPosition, SurfaceData::SurfacePointList& surfacePointList) const override; ////////////////////////////////////////////////////////////////////////// // AzFramework::Terrain::TerrainDataNotificationBus From 8dbecb654e43fa52303311c7a83ed1b49d19b404 Mon Sep 17 00:00:00 2001 From: Vincent Liu <5900509+onecent1101@users.noreply.github.com> Date: Thu, 9 Sep 2021 13:28:52 -0700 Subject: [PATCH 220/355] [SPEC-7868] Update AWS Gems cmake target with correct runtime dependencies (#3991) Signed-off-by: onecent1101 --- Gems/AWSClientAuth/Code/CMakeLists.txt | 45 ++++++++++++++----- Gems/AWSCore/Code/CMakeLists.txt | 34 +++++++++++--- .../Code/AWSGameLiftClient/CMakeLists.txt | 19 ++++++-- Gems/AWSMetrics/Code/CMakeLists.txt | 37 ++++++++++++--- 4 files changed, 110 insertions(+), 25 deletions(-) diff --git a/Gems/AWSClientAuth/Code/CMakeLists.txt b/Gems/AWSClientAuth/Code/CMakeLists.txt index 514b1ab79e..bd8b174b65 100644 --- a/Gems/AWSClientAuth/Code/CMakeLists.txt +++ b/Gems/AWSClientAuth/Code/CMakeLists.txt @@ -26,9 +26,6 @@ ly_add_target( Gem::HttpRequestor 3rdParty::AWSNativeSDK::AWSClientAuth 3rdParty::AWSNativeSDK::Core - RUNTIME_DEPENDENCIES - Gem::AWSCore - Gem::HttpRequestor ) ly_add_target( @@ -48,17 +45,45 @@ ly_add_target( 3rdParty::AWSNativeSDK::Core PUBLIC Gem::AWSClientAuth.Static - RUNTIME_DEPENDENCIES - Gem::AWSCore - Gem::HttpRequestor ) # Load the "Gem::AWSClientAuth" module in all types of applications. -ly_create_alias(NAME AWSClientAuth.Servers NAMESPACE Gem TARGETS Gem::AWSClientAuth) -ly_create_alias(NAME AWSClientAuth.Clients NAMESPACE Gem TARGETS Gem::AWSClientAuth) +ly_create_alias( + NAME AWSClientAuth.Servers + NAMESPACE Gem + TARGETS + Gem::AWSClientAuth + Gem::AWSCore.Servers + Gem::HttpRequestor.Servers +) + +ly_create_alias( + NAME AWSClientAuth.Clients + NAMESPACE Gem + TARGETS + Gem::AWSClientAuth + Gem::AWSCore.Clients + Gem::HttpRequestor.Clients +) + if (PAL_TRAIT_BUILD_HOST_TOOLS) - ly_create_alias(NAME AWSClientAuth.Tools NAMESPACE Gem TARGETS Gem::AWSClientAuth) - ly_create_alias(NAME AWSClientAuth.Builders NAMESPACE Gem TARGETS Gem::AWSClientAuth) + ly_create_alias( + NAME AWSClientAuth.Tools + NAMESPACE Gem + TARGETS + Gem::AWSClientAuth + Gem::AWSCore.Tools + Gem::HttpRequestor.Tools + ) + + ly_create_alias( + NAME AWSClientAuth.Builders + NAMESPACE Gem + TARGETS + Gem::AWSClientAuth + Gem::AWSCore.Builders + Gem::HttpRequestor.Builders + ) endif() ################################################################################ diff --git a/Gems/AWSCore/Code/CMakeLists.txt b/Gems/AWSCore/Code/CMakeLists.txt index 5fdefa9f9e..808436b7fd 100644 --- a/Gems/AWSCore/Code/CMakeLists.txt +++ b/Gems/AWSCore/Code/CMakeLists.txt @@ -45,8 +45,19 @@ ly_add_target( ) # clients and servers will use the above Gem::AWSCore module. -ly_create_alias(NAME AWSCore.Servers NAMESPACE Gem TARGETS Gem::AWSCore) -ly_create_alias(NAME AWSCore.Clients NAMESPACE Gem TARGETS Gem::AWSCore) +ly_create_alias( + NAME AWSCore.Servers + NAMESPACE Gem + TARGETS + Gem::AWSCore +) + +ly_create_alias( + NAME AWSCore.Clients + NAMESPACE Gem + TARGETS + Gem::AWSCore +) if (PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_target( @@ -84,8 +95,6 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) PRIVATE AZ::AzCore Gem::AWSCore.Editor.Static - RUNTIME_DEPENDENCIES - Gem::AWSCore ) # This target is not a real gem module @@ -106,8 +115,21 @@ if (PAL_TRAIT_BUILD_HOST_TOOLS) ly_add_dependencies(AWSCore.Editor AWSCore.ResourceMappingTool) # Builders and Tools (such as the Editor use AWSCore.Editor) use the .Editor module above. - ly_create_alias(NAME AWSCore.Tools NAMESPACE Gem TARGETS Gem::AWSCore.Editor) - ly_create_alias(NAME AWSCore.Builders NAMESPACE Gem TARGETS Gem::AWSCore.Editor) + ly_create_alias( + NAME AWSCore.Tools + NAMESPACE Gem + TARGETS + Gem::AWSCore + Gem::AWSCore.Editor + ) + + ly_create_alias( + NAME AWSCore.Builders + NAMESPACE Gem + TARGETS + Gem::AWSCore + Gem::AWSCore.Editor + ) endif() diff --git a/Gems/AWSGameLift/Code/AWSGameLiftClient/CMakeLists.txt b/Gems/AWSGameLift/Code/AWSGameLiftClient/CMakeLists.txt index a2e7a5b2e1..3eb5eafab0 100644 --- a/Gems/AWSGameLift/Code/AWSGameLiftClient/CMakeLists.txt +++ b/Gems/AWSGameLift/Code/AWSGameLiftClient/CMakeLists.txt @@ -45,13 +45,26 @@ ly_add_target( PUBLIC Gem::AWSGameLift.Client.Static RUNTIME_DEPENDENCIES - Gem::AWSCore + Gem::AWSCore.Clients ) # Load the "Gem::AWSGameLift" module in all types of applications. if (PAL_TRAIT_BUILD_HOST_TOOLS) - ly_create_alias(NAME AWSGameLift.Tools NAMESPACE Gem TARGETS Gem::AWSGameLift.Clients) - ly_create_alias(NAME AWSGameLift.Builders NAMESPACE Gem TARGETS Gem::AWSGameLift.Clients) + ly_create_alias( + NAME AWSGameLift.Tools + NAMESPACE Gem + TARGETS + Gem::AWSCore.Tools + Gem::AWSGameLift.Clients + ) + + ly_create_alias( + NAME AWSGameLift.Builders + NAMESPACE Gem + TARGETS + Gem::AWSCore.Builders + Gem::AWSGameLift.Clients + ) endif() ################################################################################ diff --git a/Gems/AWSMetrics/Code/CMakeLists.txt b/Gems/AWSMetrics/Code/CMakeLists.txt index 2bba967bb7..2e78ee8c42 100644 --- a/Gems/AWSMetrics/Code/CMakeLists.txt +++ b/Gems/AWSMetrics/Code/CMakeLists.txt @@ -40,16 +40,41 @@ ly_add_target( AZ::AzCore AZ::AzFramework Gem::AWSMetrics.Static - RUNTIME_DEPENDENCIES - Gem::AWSCore ) # Load the "Gem::AWSMetrics" module in all types of applications. -ly_create_alias(NAME AWSMetrics.Servers NAMESPACE Gem TARGETS Gem::AWSMetrics) -ly_create_alias(NAME AWSMetrics.Clients NAMESPACE Gem TARGETS Gem::AWSMetrics) +ly_create_alias( + NAME AWSMetrics.Servers + NAMESPACE Gem + TARGETS + Gem::AWSCore.Servers + Gem::AWSMetrics +) + +ly_create_alias( + NAME AWSMetrics.Clients + NAMESPACE Gem + TARGETS + Gem::AWSCore.Clients + Gem::AWSMetrics +) + if (PAL_TRAIT_BUILD_HOST_TOOLS) - ly_create_alias(NAME AWSMetrics.Tools NAMESPACE Gem TARGETS Gem::AWSMetrics) - ly_create_alias(NAME AWSMetrics.Builders NAMESPACE Gem TARGETS Gem::AWSMetrics) + ly_create_alias( + NAME AWSMetrics.Tools + NAMESPACE Gem + TARGETS + Gem::AWSCore.Tools + Gem::AWSMetrics + ) + + ly_create_alias( + NAME AWSMetrics.Builders + NAMESPACE Gem + TARGETS + Gem::AWSCore.Builders + Gem::AWSMetrics + ) endif() ################################################################################ From 10900fee388651ab0d81ee5d06082ee90d02a08b Mon Sep 17 00:00:00 2001 From: moudgils <47460854+moudgils@users.noreply.github.com> Date: Thu, 9 Sep 2021 14:30:35 -0700 Subject: [PATCH 221/355] =?UTF-8?q?Disable=20PSO=20caching=20if=20Renderdo?= =?UTF-8?q?c=20or=20Pix=20dlls=20are=20loaded=20as=20they=20confl=E2=80=A6?= =?UTF-8?q?=20(#3976)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Disable PSO caching if Renderdoc or Pix dlls are loaded as they conflict with dx12 api * Add support for command line param --enablePixGPU which manually loads the pix gpu capture dll - This will allow pix to attach to a running process if the enablePixGPU is enabled - Support for enabling/disabling gpu markers based on enablePixGPU Signed-off-by: moudgils --- Gems/Atom/RHI/Code/CMakeLists.txt | 1 + Gems/Atom/RHI/Code/Include/Atom/RHI/Factory.h | 111 +++++++++--------- .../platform_private_android_files.cmake | 11 ++ .../Unimplemented/Empty_Unimplemented.cpp | 21 ++++ .../Linux/platform_private_linux_files.cmake | 11 ++ .../Mac/platform_private_mac_files.cmake | 11 ++ .../Windows/Atom_RHI_Traits_Windows.h | 1 + .../Platform/Windows/RHI/Factory_windows.cpp | 59 ++++++++++ .../platform_private_windows_files.cmake | 11 ++ .../iOS/platform_private_ios_files.cmake | 11 ++ Gems/Atom/RHI/Code/Source/RHI/Factory.cpp | 70 ++++++++++- .../RHI/DX12/Code/Source/RHI/CommandList.cpp | 16 ++- .../DX12/Code/Source/RHI/PipelineLibrary.cpp | 24 ++-- Gems/Atom/RHI/DX12/Code/Source/RHI/Scope.cpp | 11 +- 14 files changed, 294 insertions(+), 75 deletions(-) create mode 100644 Gems/Atom/RHI/Code/Source/Platform/Android/platform_private_android_files.cmake create mode 100644 Gems/Atom/RHI/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp create mode 100644 Gems/Atom/RHI/Code/Source/Platform/Linux/platform_private_linux_files.cmake create mode 100644 Gems/Atom/RHI/Code/Source/Platform/Mac/platform_private_mac_files.cmake create mode 100644 Gems/Atom/RHI/Code/Source/Platform/Windows/RHI/Factory_windows.cpp create mode 100644 Gems/Atom/RHI/Code/Source/Platform/Windows/platform_private_windows_files.cmake create mode 100644 Gems/Atom/RHI/Code/Source/Platform/iOS/platform_private_ios_files.cmake diff --git a/Gems/Atom/RHI/Code/CMakeLists.txt b/Gems/Atom/RHI/Code/CMakeLists.txt index 879fc7d2ce..843eeb6364 100644 --- a/Gems/Atom/RHI/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Code/CMakeLists.txt @@ -42,6 +42,7 @@ ly_add_target( FILES_CMAKE atom_rhi_public_files.cmake ${pal_source_dir}/platform_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake + ${pal_source_dir}/platform_private_${PAL_PLATFORM_NAME_LOWERCASE}_files.cmake INCLUDE_DIRECTORIES PRIVATE Source diff --git a/Gems/Atom/RHI/Code/Include/Atom/RHI/Factory.h b/Gems/Atom/RHI/Code/Include/Atom/RHI/Factory.h index e0f03df9d7..992cc0e79a 100644 --- a/Gems/Atom/RHI/Code/Include/Atom/RHI/Factory.h +++ b/Gems/Atom/RHI/Code/Include/Atom/RHI/Factory.h @@ -50,24 +50,21 @@ namespace AZ class RayTracingPipelineState; class RayTracingShaderTable; - /* Priority of a Factory. The lower the number the higher the priority. - * Used when there's multiple factories available and the user hasn't define - * a priority. - */ + //! Priority of a Factory. The lower the number the higher the priority. + //! Used when there's multiple factories available and the user hasn't define + //! a priority. using APIPriority = uint32_t; static const APIPriority APITopPriority = 1; static const APIPriority APILowPriority = 10; static const APIPriority APIMiddlePriority = (APILowPriority - APITopPriority) / 2; - /** - * The factory is an interface for creating RHI data structures. The platform system should - * register itself with the factory by calling Register, and unregister on shutdown with - * Unregister. - * - * A call to Get will return the active instance. In the event that it's unclear whether - * a platform instance exists, you must call IsReady to determine whether it's safe to - * call Get. Calling Get without a registered platform will result in an assert. - */ + //! The factory is an interface for creating RHI data structures. The platform system should + //! register itself with the factory by calling Register, and unregister on shutdown with + //! Unregister. + //! + //! A call to Get will return the active instance. In the event that it's unclear whether + //! a platform instance exists, you must call IsReady to determine whether it's safe to + //! call Get. Calling Get without a registered platform will result in an assert. class Factory { public: @@ -79,78 +76,78 @@ namespace AZ // Note that you have to delete these for safety reasons, you will trip a static_assert if you do not AZ_DISABLE_COPY_MOVE(Factory); - /// Returns the component service name CRC used by the platform RHI system component. + //! Returns the component service name CRC used by the platform RHI system component. static uint32_t GetComponentService(); - /// Returns the component service name CRC used by the Factory manager component. + //! Returns the component service name CRC used by the Factory manager component. static uint32_t GetManagerComponentService(); - /// Returns the component service name CRC used by the platform RHI system component. + //! Returns the component service name CRC used by the platform RHI system component. static uint32_t GetPlatformService(); - /// Registers the global factory instance. + //! Registers the global factory instance. static void Register(Factory* instance); - /// Unregisters the global factory instance. + //! Unregisters the global factory instance. static void Unregister(Factory* instance); - /// Returns whether the factory is initialized and active in this module. + //! Returns whether the factory is initialized and active in this module. static bool IsReady(); - /// Access the global factory instance. + //! Access the global factory instance. static Factory& Get(); #if defined(USE_RENDERDOC) - /// Access the RenderDoc API pointer if available. - /// The availability of the render doc API at runtime depends on the following: - /// - You must not be building a packaged game/product (LY_MONOLITHIC_GAME not enabled in CMake) - /// - A valid renderdoc installation was found, either by auto-discovery, or by supplying ATOM_RENDERDOC_PATH as an environment variable - /// - The module loaded successfully at runtime, and the API function pointer was retrieved successfully + //! Access the RenderDoc API pointer if available. + //! The availability of the render doc API at runtime depends on the following: + //! - You must not be building a packaged game/product (LY_MONOLITHIC_GAME not enabled in CMake) + //! - A valid renderdoc installation was found, either by auto-discovery, or by supplying ATOM_RENDERDOC_PATH as an environment variable + //! - The module loaded successfully at runtime, and the API function pointer was retrieved successfully static RENDERDOC_API_1_1_2* GetRenderDocAPI(); #endif + + //! Returns true if RenderDoc dll is loaded + static bool IsRenderDocModuleLoaded(); - /// Returns the name of the Factory. + //! Returns true if Pix dll is loaded + static bool IsPixModuleLoaded(); + + //! Returns the name of the Factory. virtual Name GetName() = 0; - /// Returns the APIType of the factory. + //! Returns the APIType of the factory. virtual APIType GetType() = 0; - /// Returns the default priority of the factory in case there's no priorities set in the FactoryManager. + //! Returns the default priority of the factory in case there's no priorities set in the FactoryManager. virtual APIPriority GetDefaultPriority() = 0; - /** - * Purpose: The API Unique Index will be encoded in the 2 Most Significant Bits of a ShaderVariantAsset ProductSubId (a 32bits integer). - * Returns a number in the range [0..3]. - * In theory any given AssetBuilderSdk::PlatformInfo can support several RHI::APITypes. - * In reality "pc" only supports DX12 & Vulkan. - * "ios" supports only Metal. - * "mac" supports only Metal. - * "android" supports only Vulkan. - * So, for all practical purposes, a single PlatformInfo won't support more than 2 ShaderPlatformInterfaces, but for the sake of - * hedging our bets into the future We assume no more than 4 ShaderPlatformInterfaces will ever be supported for any given PlatformInfo. - * REMARK: It is the responsibility of the Factory subclass to return a unique number between 0...3. - * For example DX12 can return 0, while Vulkan should return 1 (Satisfies "pc", "android" and "linux"). - * Metal can return 0 because it is the only ShaderPlatformInterface for "ios", "mac" and "appletv". - * See AZ::RHI::Limits::APIType::PerPlatformApiUniqueIndexMax. - */ + //! Purpose: The API Unique Index will be encoded in the 2 Most Significant Bits of a ShaderVariantAsset ProductSubId (a 32bits integer). + //! Returns a number in the range [0..3]. + //! In theory any given AssetBuilderSdk::PlatformInfo can support several RHI::APITypes. + //! In reality "pc" only supports DX12 & Vulkan. + //! "ios" supports only Metal. + //! "mac" supports only Metal. + //! "android" supports only Vulkan. + //! So, for all practical purposes, a single PlatformInfo won't support more than 2 ShaderPlatformInterfaces, but for the sake of + //! hedging our bets into the future We assume no more than 4 ShaderPlatformInterfaces will ever be supported for any given PlatformInfo. + //! REMARK: It is the responsibility of the Factory subclass to return a unique number between 0...3. + //! For example DX12 can return 0, while Vulkan should return 1 (Satisfies "pc", "android" and "linux"). + //! Metal can return 0 because it is the only ShaderPlatformInterface for "ios", "mac" and "appletv". + //! See AZ::RHI::Limits::APIType::PerPlatformApiUniqueIndexMax. virtual uint32_t GetAPIUniqueIndex() const = 0; - /** - * Collects the set of physical devices on the system and returns a list of them. Physical - * devices represent the hardware attached to the system. Physical devices can be grouped - * into nodes for linked setups (e.g. SLI / Crossfire). They can also represent software - * reference implementations. Check the PhysicalDeviceType on the descriptor to inspect - * this information. - */ + //! Collects the set of physical devices on the system and returns a list of them. Physical + //! devices represent the hardware attached to the system. Physical devices can be grouped + //! into nodes for linked setups (e.g. SLI / Crossfire). They can also represent software + //! reference implementations. Check the PhysicalDeviceType on the descriptor to inspect + //! this information. virtual PhysicalDeviceList EnumeratePhysicalDevices() = 0; - /** - * Factory Creation Methods: - * - * Returns the platform-specific derived variant of the RHI type. All instances are created - * in an uninitialized state; the operation simply allocates the memory for the appropriate - * platform type and returns the pointer. - */ + //! Factory Creation Methods: + //! + //! Returns the platform-specific derived variant of the RHI type. All instances are created + //! in an uninitialized state; the operation simply allocates the memory for the appropriate + //! platform type and returns the pointer. virtual Ptr CreateBuffer() = 0; diff --git a/Gems/Atom/RHI/Code/Source/Platform/Android/platform_private_android_files.cmake b/Gems/Atom/RHI/Code/Source/Platform/Android/platform_private_android_files.cmake new file mode 100644 index 0000000000..6c7f8f46f1 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/Android/platform_private_android_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + ../Common/Unimplemented/Empty_Unimplemented.cpp +) diff --git a/Gems/Atom/RHI/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp b/Gems/Atom/RHI/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp new file mode 100644 index 0000000000..4152be0696 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/Common/Unimplemented/Empty_Unimplemented.cpp @@ -0,0 +1,21 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#include + +namespace AZ::RHI::Platform +{ + bool IsPixDllInjected([[maybe_unused]] const char* dllName) + { + return false; + } + + AZStd::wstring GetLatestWinPixGpuCapturerPath() + { + return L""; + } +} diff --git a/Gems/Atom/RHI/Code/Source/Platform/Linux/platform_private_linux_files.cmake b/Gems/Atom/RHI/Code/Source/Platform/Linux/platform_private_linux_files.cmake new file mode 100644 index 0000000000..6c7f8f46f1 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/Linux/platform_private_linux_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + ../Common/Unimplemented/Empty_Unimplemented.cpp +) diff --git a/Gems/Atom/RHI/Code/Source/Platform/Mac/platform_private_mac_files.cmake b/Gems/Atom/RHI/Code/Source/Platform/Mac/platform_private_mac_files.cmake new file mode 100644 index 0000000000..6c7f8f46f1 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/Mac/platform_private_mac_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + ../Common/Unimplemented/Empty_Unimplemented.cpp +) diff --git a/Gems/Atom/RHI/Code/Source/Platform/Windows/Atom_RHI_Traits_Windows.h b/Gems/Atom/RHI/Code/Source/Platform/Windows/Atom_RHI_Traits_Windows.h index 82358784a3..9ca1afb5c7 100644 --- a/Gems/Atom/RHI/Code/Source/Platform/Windows/Atom_RHI_Traits_Windows.h +++ b/Gems/Atom/RHI/Code/Source/Platform/Windows/Atom_RHI_Traits_Windows.h @@ -8,3 +8,4 @@ #pragma once #define AZ_TRAIT_RENDERDOC_MODULE "renderdoc.dll" +#define AZ_TRAIT_PIX_MODULE "WinPixGpuCapturer.dll" diff --git a/Gems/Atom/RHI/Code/Source/Platform/Windows/RHI/Factory_windows.cpp b/Gems/Atom/RHI/Code/Source/Platform/Windows/RHI/Factory_windows.cpp new file mode 100644 index 0000000000..808575c7e8 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/Windows/RHI/Factory_windows.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include +#include + +namespace AZ::RHI::Platform +{ + bool IsPixDllInjected(const char* dllName) + { + bool isDllLoaded = false; + + wchar_t fileNameW[256]; + size_t numCharsConverted; + errno_t wcharResult = mbstowcs_s(&numCharsConverted, fileNameW, dllName, AZ_ARRAY_SIZE(fileNameW) - 1); + if (wcharResult == 0) + { + isDllLoaded = NULL != GetModuleHandleW(fileNameW); + } + return isDllLoaded; + } + + AZStd::wstring GetLatestWinPixGpuCapturerPath() + { + LPWSTR programFilesPath = nullptr; + SHGetKnownFolderPath(FOLDERID_ProgramFiles, KF_FLAG_DEFAULT, NULL, &programFilesPath); + + std::filesystem::path pixInstallationPath = programFilesPath; + pixInstallationPath /= "Microsoft PIX"; + + std::wstring newestVersionFound; + + for (auto const& directory_entry : std::filesystem::directory_iterator(pixInstallationPath)) + { + if (directory_entry.is_directory()) + { + if (newestVersionFound.empty() || newestVersionFound < directory_entry.path().filename().c_str()) + { + newestVersionFound = directory_entry.path().filename().c_str(); + } + } + } + + if (newestVersionFound.empty()) + { + return L""; + } + + std::wstring finalPath = pixInstallationPath / newestVersionFound / L"WinPixGpuCapturer.dll"; + return AZStd::wstring(finalPath.c_str()); + } +} diff --git a/Gems/Atom/RHI/Code/Source/Platform/Windows/platform_private_windows_files.cmake b/Gems/Atom/RHI/Code/Source/Platform/Windows/platform_private_windows_files.cmake new file mode 100644 index 0000000000..ac0a5526ea --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/Windows/platform_private_windows_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + RHI/Factory_windows.cpp +) diff --git a/Gems/Atom/RHI/Code/Source/Platform/iOS/platform_private_ios_files.cmake b/Gems/Atom/RHI/Code/Source/Platform/iOS/platform_private_ios_files.cmake new file mode 100644 index 0000000000..6c7f8f46f1 --- /dev/null +++ b/Gems/Atom/RHI/Code/Source/Platform/iOS/platform_private_ios_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + ../Common/Unimplemented/Empty_Unimplemented.cpp +) diff --git a/Gems/Atom/RHI/Code/Source/RHI/Factory.cpp b/Gems/Atom/RHI/Code/Source/RHI/Factory.cpp index 3162a71e34..48b64c17c0 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/Factory.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/Factory.cpp @@ -11,20 +11,33 @@ #include #include -#if defined(USE_RENDERDOC) +#if defined(USE_RENDERDOC) || defined(USE_PIX) #include #include #include - -static AZStd::unique_ptr s_renderDocModule; -static RENDERDOC_API_1_1_2* s_renderDocApi = nullptr; #endif +#if defined(USE_RENDERDOC) +static AZStd::unique_ptr s_renderDocModule; +static RENDERDOC_API_1_1_2* s_renderDocApi = nullptr; +static bool s_isRenderDocDllLoaded = false; +#endif + +#if defined(USE_PIX) +static AZStd::unique_ptr s_pixModule; +static bool s_isPixGpuCaptureDllLoaded = false; +#endif namespace AZ { namespace RHI { + namespace Platform + { + bool IsPixDllInjected(const char* dllName); + AZStd::wstring GetLatestWinPixGpuCapturerPath(); + } + uint32_t Factory::GetComponentService() { return AZ_CRC("RHIService", 0x45d8e053); @@ -53,6 +66,7 @@ namespace AZ { if (s_renderDocModule->Load(false)) { + s_isRenderDocDllLoaded = true; pRENDERDOC_GetAPI renderDocGetAPI = s_renderDocModule->GetFunction("RENDERDOC_GetAPI"); if (renderDocGetAPI) { @@ -78,8 +92,30 @@ namespace AZ } } } -#endif // defined(USE_RENDERDOC) +#endif +#if defined(USE_PIX) + // If GPU capture is requested, we need to load the pix library as early as possible (before device queries/factories are made) + bool enablePixGPU = RHI::QueryCommandLineOption("enablePixGPU"); + if (enablePixGPU && AZ_TRAIT_PIX_MODULE && !s_pixModule) + { + //Get the path to the latest pix install directory + AZStd::wstring pixGpuDllPath = Platform::GetLatestWinPixGpuCapturerPath(); + AZStd::string dllPath; + AZStd::to_string(dllPath, pixGpuDllPath); + s_pixModule = DynamicModuleHandle::Create(dllPath.c_str()); + if (s_pixModule) + { + if (!s_pixModule->Load(false)) + { + AZ_Printf("RHISystem", "Pix capture requested but module failed to load.\n"); + } + } + } + + //Pix dll can still be injected even if we do not pass in enablePixGPU. This can be done if we launch the app from Pix. + s_isPixGpuCaptureDllLoaded = Platform::IsPixDllInjected(AZ_TRAIT_PIX_MODULE); +#endif } void Factory::Register(Factory* instance) @@ -116,6 +152,12 @@ namespace AZ { s_renderDocModule->Unload(); } +#endif +#if defined(USE_PIX) + if (s_pixModule) + { + s_pixModule->Unload(); + } #endif } @@ -137,5 +179,23 @@ namespace AZ return s_renderDocApi; } #endif + + bool Factory::IsRenderDocModuleLoaded() + { +#if defined(USE_RENDERDOC) + return s_isRenderDocDllLoaded; +#else + return false; +#endif + } + + bool Factory::IsPixModuleLoaded() + { +#if defined(USE_PIX) + return s_isPixGpuCaptureDllLoaded; +#else + return false; +#endif + } } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.cpp index a38de024d5..1ee35c513a 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/CommandList.cpp @@ -41,6 +41,8 @@ #define DX12_COMMANDLIST_TIMER_DETAIL(id) #endif +#define PIX_MARKER_CMDLIST_COL 0xFF0000FF + namespace AZ { namespace DX12 @@ -94,16 +96,22 @@ namespace AZ { SetName(name); - PIXBeginEvent(0xFF0000FF, name.GetCStr()); - PIXBeginEvent(GetCommandList(), 0xFF0000FF, name.GetCStr()); + PIXBeginEvent(PIX_MARKER_CMDLIST_COL, name.GetCStr()); + if (RHI::Factory::Get().IsPixModuleLoaded() || RHI::Factory::Get().IsRenderDocModuleLoaded()) + { + PIXBeginEvent(GetCommandList(), PIX_MARKER_CMDLIST_COL, name.GetCStr()); + } } void CommandList::Close() { FlushBarriers(); - - PIXEndEvent(GetCommandList()); PIXEndEvent(); + if (RHI::Factory::Get().IsPixModuleLoaded() || RHI::Factory::Get().IsRenderDocModuleLoaded()) + { + PIXEndEvent(GetCommandList()); + } + CommandListBase::Close(); } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp index d0a9ef0c07..182edb1298 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp @@ -7,6 +7,7 @@ */ #include #include +#include namespace AZ { @@ -46,7 +47,16 @@ namespace AZ #if defined (AZ_DX12_USE_PIPELINE_LIBRARY) AZStd::array_view bytes; - if (serializedData) + + bool shouldCreateLibFromSerializedData = true; + if (RHI::Factory::Get().IsRenderDocModuleLoaded() || RHI::Factory::Get().IsPixModuleLoaded()) + { + // CreatePipelineLibrary api does not function properly if Renderdoc or Pix is enabled + shouldCreateLibFromSerializedData = false; + } + + + if (serializedData && shouldCreateLibFromSerializedData) { bytes = serializedData->GetData(); } @@ -205,10 +215,11 @@ namespace AZ RHI::ResultCode PipelineLibrary::MergeIntoInternal([[maybe_unused]] AZStd::array_view pipelineLibraries) { -#if defined(USE_PIX) || defined(USE_RENDERDOC) - // StorePipeline api does not function properly if Pix or RenderDoc is enabled - return RHI::ResultCode::Fail; -#else + if (RHI::Factory::Get().IsRenderDocModuleLoaded() || RHI::Factory::Get().IsPixModuleLoaded()) + { + // StorePipeline api does not function properly if RenderDoc or Pix is enabled + return RHI::ResultCode::Fail; + } #if defined (AZ_DX12_USE_PIPELINE_LIBRARY) AZStd::lock_guard lock(m_mutex); @@ -226,8 +237,7 @@ namespace AZ } } #endif - return RHI::ResultCode::Success; -#endif + return RHI::ResultCode::Success; } RHI::ConstPtr PipelineLibrary::GetSerializedDataInternal() const diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Scope.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/Scope.cpp index 80e41434b9..cea072954a 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Scope.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Scope.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -309,8 +310,11 @@ namespace AZ commandList.GetValidator().BeginScope(*this); PIXBeginEvent(0xFFFF00FF, GetId().GetCStr()); - PIXBeginEvent(commandList.GetCommandList(), 0xFFFF00FF, GetId().GetCStr()); + if (RHI::Factory::Get().IsPixModuleLoaded() || RHI::Factory::Get().IsRenderDocModuleLoaded()) + { + PIXBeginEvent(commandList.GetCommandList(), 0xFFFF00FF, GetId().GetCStr()); + } commandList.SetAftermathEventMarker(GetId().GetCStr()); @@ -424,7 +428,10 @@ namespace AZ } } - PIXEndEvent(commandList.GetCommandList()); + if (RHI::Factory::Get().IsPixModuleLoaded() || RHI::Factory::Get().IsRenderDocModuleLoaded()) + { + PIXEndEvent(commandList.GetCommandList()); + } PIXEndEvent(); commandList.GetValidator().EndScope(); From e3d007319d4efadcbee33188e8da77f31af4f6b4 Mon Sep 17 00:00:00 2001 From: chcurran <82187351+carlitosan@users.noreply.github.com> Date: Thu, 9 Sep 2021 14:37:08 -0700 Subject: [PATCH 222/355] remove false error from deserializing BC nodes Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com> --- .../Libraries/Core/EBusEventHandler.cpp | 2 +- .../ScriptCanvas/Libraries/Core/Method.cpp | 42 +++++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp index 4e2d740656..a2ccfd46f2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.cpp @@ -610,7 +610,7 @@ namespace ScriptCanvas void EBusEventHandler::OnDeserialize() { AZStd::lock_guard lock(m_mutex); - if (!m_ebus) + if (!m_ebus && !m_ebusName.empty()) { CreateHandler(m_ebusName); } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp index 793224fd86..7e3f5f7d24 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.cpp @@ -769,27 +769,30 @@ namespace ScriptCanvas { AZStd::lock_guard lock(m_mutex); - m_warnOnMissingFunction = true; - const AZ::BehaviorClass* bcClass{}; - const AZ::BehaviorMethod* method{}; - EventType eventType; + if (!m_lookupName.empty() || !m_className.empty()) + { + m_warnOnMissingFunction = true; + const AZ::BehaviorClass* bcClass{}; + const AZ::BehaviorMethod* method{}; + EventType eventType; - if (GetBehaviorContextClassMethod(m_lookupName, bcClass, method, eventType)) - { - m_eventType = eventType; - ConfigureMethod(*method, bcClass); - } - else - { - if (!m_method) + if (GetBehaviorContextClassMethod(m_lookupName, bcClass, method, eventType)) { - AZ_Warning("ScriptCanvas", !m_warnOnMissingFunction, "method node failed to deserialize properly"); + m_eventType = eventType; + ConfigureMethod(*method, bcClass); + } + else + { + if (!m_method) + { + AZ_Warning("ScriptCanvas", !m_warnOnMissingFunction, "method node failed to deserialize properly"); + } } - } - if (m_resultSlotIDs.empty()) - { - m_resultSlotIDs.emplace_back(SlotId{}); + if (m_resultSlotIDs.empty()) + { + m_resultSlotIDs.emplace_back(SlotId{}); + } } Node::OnDeserialize(); @@ -798,6 +801,11 @@ namespace ScriptCanvas #if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)//// void Method::OnWriteEnd() { + if (m_lookupName.empty() && m_className.empty()) + { + return; + } + OnDeserialize(); } #endif//defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED) From 7f7d3d9c1c1e52b685cc4e16e6375da130e98500 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Thu, 9 Sep 2021 16:09:55 -0700 Subject: [PATCH 223/355] Creates destination directory if it doesnt exists, `file(ARCHIVE_CREATE` will fail if the directory is not there Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Projects.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmake/Projects.cmake b/cmake/Projects.cmake index e70c8a4b14..7f2ac6a4fd 100644 --- a/cmake/Projects.cmake +++ b/cmake/Projects.cmake @@ -149,8 +149,9 @@ foreach(project ${LY_PROJECTS}) if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") set(install_output_folder "${CMAKE_INSTALL_PREFIX}/@runtime_output_directory@/@PAL_PLATFORM_NAME@/${CMAKE_INSTALL_CONFIG_NAME}") message(STATUS "Generating ${install_output_folder}/Engine.pak from @full_directory_path@/Cache") - file(ARCHIVE_CREATE OUTPUT ${install_output_folder}/Engine.pak - PATHS @full_directory_path@/Cache + file(MAKE_DIRECTORY "${install_output_folder}") + file(ARCHIVE_CREATE OUTPUT "${install_output_folder}/Engine.pak" + PATHS "@full_directory_path@/Cache" FORMAT zip ) message(STATUS "${install_output_folder}/Engine.pak generated") From 0445ec395619324e88f56c0c2e02eb5cc08da4d8 Mon Sep 17 00:00:00 2001 From: Chris Burel Date: Thu, 9 Sep 2021 16:13:23 -0700 Subject: [PATCH 224/355] Remove references to unsupported "xlib" windowing system support (#4028) Support for X clients is provided by xcb instead. Signed-off-by: Chris Burel --- .../Linux/AzFramework/Application/Application_Linux.cpp | 3 --- .../Linux/AzFramework/Windowing/NativeWindow_Linux.cpp | 3 --- .../AzFramework/Platform/Linux/platform_linux.cmake | 6 +----- .../Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake | 4 ---- .../Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp | 3 --- cmake/Platform/Linux/PAL_linux.cmake | 5 +++-- 6 files changed, 4 insertions(+), 20 deletions(-) diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp index 5cc147b038..59602fe788 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux.cpp @@ -21,9 +21,6 @@ namespace AzFramework #elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND #error "Linux Window Manager Wayland not supported." return nullptr; -#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_XLIB - #error "Linux Window Manager XLIB not supported." - return nullptr; #else #error "Linux Window Manager not recognized." return nullptr; diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp index 436be28ee6..2950f8dcfc 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux.cpp @@ -17,9 +17,6 @@ namespace AzFramework #elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND #error "Linux Window Manager Wayland not supported." return nullptr; -#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_XLIB - #error "Linux Window Manager XLIB not supported." - return nullptr; #else #error "Linux Window Manager not recognized." return nullptr; diff --git a/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake b/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake index c79c5f1dff..4480f86c1d 100644 --- a/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake +++ b/Code/Framework/AzFramework/Platform/Linux/platform_linux.cmake @@ -7,7 +7,7 @@ # # Based on the linux window manager trait, perform the appropriate additional build configurations -# Only 'xcb', 'wayland', and 'xlib' are recognized +# Only 'xcb' and 'wayland' are recognized if (${PAL_TRAIT_LINUX_WINDOW_MANAGER} STREQUAL "xcb") find_library(XCB_LIBRARY xcb) @@ -23,10 +23,6 @@ elseif(PAL_TRAIT_LINUX_WINDOW_MANAGER STREQUAL "wayland") set(LY_COMPILE_DEFINITIONS PUBLIC PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND) -elseif(PAL_TRAIT_LINUX_WINDOW_MANAGER STREQUAL "xlib") - - set(LY_COMPILE_DEFINITIONS PUBLIC PAL_TRAIT_LINUX_WINDOW_MANAGER_XLIB) - else() message(FATAL_ERROR, "Linux Window Manager ${PAL_TRAIT_LINUX_WINDOW_MANAGER} is not recognized") diff --git a/Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake b/Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake index 1936c5b911..c89bbcb3f2 100644 --- a/Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake +++ b/Gems/Atom/RHI/Vulkan/3rdParty/Platform/Linux/glad_vulkan_linux.cmake @@ -14,10 +14,6 @@ elseif(PAL_TRAIT_LINUX_WINDOW_MANAGER STREQUAL "wayland") set(GLAD_VULKAN_COMPILE_DEFINITIONS VK_USE_PLATFORM_WAYLAND_KHR ) -elseif(PAL_TRAIT_LINUX_WINDOW_MANAGER STREQUAL "xlib") - set(GLAD_VULKAN_COMPILE_DEFINITIONS - VK_USE_PLATFORM_XLIB_KHR - ) else() message(FATAL_ERROR, "Linux Window Manager ${PAL_TRAIT_LINUX_WINDOW_MANAGER} is not recognized") endif() diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp index 98e91519ea..a818599b0d 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Linux/RHI/WSISurface_Linux.cpp @@ -41,9 +41,6 @@ namespace AZ #elif PAL_TRAIT_LINUX_WINDOW_MANAGER_WAYLAND #error "Linux Window Manager Wayland not supported." return RHI::ResultCode::Unimplemented; -#elif PAL_TRAIT_LINUX_WINDOW_MANAGER_XLIB - #error "Linux Window Manager XLIB not supported." - return RHI::ResultCode::Unimplemented; #else #error "Linux Window Manager not recognized." return RHI::ResultCode::Unimplemented; diff --git a/cmake/Platform/Linux/PAL_linux.cmake b/cmake/Platform/Linux/PAL_linux.cmake index 528bb5794c..c088163dca 100644 --- a/cmake/Platform/Linux/PAL_linux.cmake +++ b/cmake/Platform/Linux/PAL_linux.cmake @@ -41,5 +41,6 @@ set(LY_ASSET_DEPLOY_ASSET_TYPE "pc" CACHE STRING "Set the asset type for deploym ly_set(LY_PYTHON_CMD ${CMAKE_CURRENT_SOURCE_DIR}/python/python.sh) # Set the default window manager that applications should be using on Linux -# Note: Only ("xcb", "wayland", or "xlib" should be considered) -set(PAL_TRAIT_LINUX_WINDOW_MANAGER "xcb" CACHE STRING "Sets the Window Manager type to use when configuring Linux (xcb, wayland, or xlib)") +# Note: Only ("xcb" or "wayland" should be considered) +set(PAL_TRAIT_LINUX_WINDOW_MANAGER "xcb" CACHE STRING "Sets the Window Manager type to use when configuring Linux") +set_property(CACHE PAL_TRAIT_LINUX_WINDOW_MANAGER PROPERTY STRINGS xcb wayland) From cf4cb2750a0e5692fc35aaa4b27df62b064c402b Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Thu, 9 Sep 2021 16:27:39 -0700 Subject: [PATCH 225/355] Adding missing pragma header guards to _xcb.h header files (#4029) Signed-off-by: Steve Pham --- .../Linux/AzFramework/Application/Application_Linux_xcb.h | 1 + .../Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h | 1 + 2 files changed, 2 insertions(+) diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h index 55daedb4dd..fbd7f165d3 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Application/Application_Linux_xcb.h @@ -5,6 +5,7 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ +#pragma once #include #include diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h index 73e255bab0..40181395e4 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Windowing/NativeWindow_Linux_xcb.h @@ -5,6 +5,7 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ +#pragma once #include #include From 3a4937456a507c52a726e32be3057936ad00618b Mon Sep 17 00:00:00 2001 From: Artur K <96597+nemerle@users.noreply.github.com> Date: Fri, 10 Sep 2021 02:08:33 +0200 Subject: [PATCH 226/355] Build time reduction: AzStdOnDemandReflection (#3111) * Move a few specializations from AzStdOnDemandReflection.inl to cpp file This reduces compilation time and produced profile/debug file sizes. The specializations for string and string_view are only implemented for 'char' type, since others are not used anywhere. Extracted `Reflect` method from `ClientAuthAWSCredentials` to a cpp file. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Windows build fixes. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Added missing license. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Fix missing spaces in template argument lists Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Clang format on ClientAuthAWSCredentials.cpp Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> * Merge upstream development and fix linux build. Signed-off-by: nemerle <96597+nemerle@users.noreply.github.com> --- .../AzCore/AzCore/Asset/AssetSerializer.h | 1 + .../AzCore/RTTI/AzStdOnDemandReflection.inl | 225 ++++-------------- ...AzStdOnDemandReflectionSpecializations.cpp | 208 ++++++++++++++++ .../Settings/SettingsRegistryScriptUtils.cpp | 1 + .../AzCore/AzCore/azcore_files.cmake | 1 + .../SettingsRegistryScriptUtilsTests.cpp | 9 +- .../Terrain/TerrainDataRequestBus.cpp | 1 + .../SceneCore/Events/ExportProductList.cpp | 1 + .../Authorization/ClientAuthAWSCredentials.h | 31 +-- .../ClientAuthAWSCredentials.cpp | 50 ++++ .../Code/awsclientauth_files.cmake | 1 + ...adiusWeightModifierComponentController.cpp | 1 + .../Code/Source/Asset/BlastChunksAsset.cpp | 1 + .../Code/Source/PythonReflectionComponent.cpp | 1 + .../Code/Source/PythonUtility.cpp | 5 +- .../Code/Source/Shape/ShapeComponent.cpp | 5 +- .../Code/Source/TerrainSystem/TerrainSystem.h | 3 +- .../Code/Source/WhiteBoxToolApiReflection.cpp | 1 + 18 files changed, 332 insertions(+), 214 deletions(-) create mode 100644 Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflectionSpecializations.cpp create mode 100644 Gems/AWSClientAuth/Code/Source/Authorization/ClientAuthAWSCredentials.cpp diff --git a/Code/Framework/AzCore/AzCore/Asset/AssetSerializer.h b/Code/Framework/AzCore/AzCore/Asset/AssetSerializer.h index f2ac6ea459..a9e7f5f02a 100644 --- a/Code/Framework/AzCore/AzCore/Asset/AssetSerializer.h +++ b/Code/Framework/AzCore/AzCore/Asset/AssetSerializer.h @@ -10,6 +10,7 @@ #include #include +#include namespace AZ { struct Uuid; diff --git a/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl b/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl index 690bbb0b04..bba79e36f7 100644 --- a/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl +++ b/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflection.inl @@ -7,18 +7,17 @@ */ #pragma once -#include #include #include #include -#include -#include -#include -#include -#include +#include #include #include -#include + +#ifndef AZ_USE_CUSTOM_SCRIPT_BIND +struct lua_State; +struct lua_Debug; +#endif // AZ_USE_CUSTOM_SCRIPT_BIND // forward declare specialized types namespace AZStd @@ -59,6 +58,26 @@ namespace AZ class BehaviorContext; class ScriptDataContext; + namespace OnDemandLuaFunctions + { + inline void AnyToLua(lua_State* lua, BehaviorValueParameter& param); + } + namespace ScriptCanvasOnDemandReflection + { + template + struct OnDemandPrettyName; + template + struct OnDemandToolTip; + template + struct OnDemandCategoryName; + } + namespace CommonOnDemandReflections + { + void ReflectCommonString(ReflectContext* context); + void ReflectCommonStringView(ReflectContext* context); + void ReflectStdAny(ReflectContext* context); + void ReflectVoidOutcome(ReflectContext* context); + } /// OnDemand reflection for AZStd::basic_string template struct OnDemandReflection< AZStd::basic_string > @@ -66,108 +85,16 @@ namespace AZ using ContainerType = AZStd::basic_string; using SizeType = typename ContainerType::size_type; using ValueType = typename ContainerType::value_type; - + static void Reflect(ReflectContext* context) { - if (BehaviorContext* behaviorContext = azrtti_cast(context)) + constexpr bool is_string = AZStd::is_same_v && AZStd::is_same_v> + && AZStd::is_same_v; + if constexpr(is_string) { - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) - ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) - ->template Constructor() - ->Attribute(AZ::Script::Attributes::ConstructorOverride, &OnDemandLuaFunctions::ConstructBasicString) - ->Attribute(AZ::Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&OnDemandLuaFunctions::StringTypeToLua, &OnDemandLuaFunctions::StringTypeFromLua)) - ->template WrappingMember(&ContainerType::c_str) - ->Method("c_str", &ContainerType::c_str) - ->Method("Length", [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->length()); }) - ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length) - ->Method("Equal", [](const ContainerType& lhs, const ContainerType& rhs) - { - return lhs == rhs; - }) - ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Equal) - ->Method("Find", [](ContainerType* thisPtr, const ContainerType& stringToFind, const int& startPos) - { - return aznumeric_cast(thisPtr->find(stringToFind, startPos)); - }) - ->Method("Substring", [](ContainerType* thisPtr, const int& pos, const int& len) - { - return thisPtr->substr(pos, len); - }) - ->Method("Replace", [](ContainerType* thisPtr, const ContainerType& stringToReplace, const ContainerType& replacementString) - { - SizeType startPos = 0; - while ((startPos = thisPtr->find(stringToReplace, startPos)) != ContainerType::npos && !stringToReplace.empty()) - { - thisPtr->replace(startPos, stringToReplace.length(), replacementString); - startPos += replacementString.length(); - } - - return *thisPtr; - }) - ->Method("ReplaceByIndex", [](ContainerType* thisPtr, const int& beginIndex, const int& endIndex, const ContainerType& replacementString) - { - thisPtr->replace(beginIndex, endIndex - beginIndex + 1, replacementString); - return *thisPtr; - }) - ->Method("Add", [](ContainerType* thisPtr, const ContainerType& addend) - { - return *thisPtr + addend; - }) - ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Concat) - ->Method("TrimLeft", [](ContainerType* thisPtr) - { - auto wsfront = AZStd::find_if_not(thisPtr->begin(), thisPtr->end(), [](char c) {return AZStd::is_space(c);}); - thisPtr->erase(thisPtr->begin(), wsfront); - return *thisPtr; - }) - ->Method("TrimRight", [](ContainerType* thisPtr) - { - auto wsend = AZStd::find_if_not(thisPtr->rbegin(), thisPtr->rend(), [](char c) {return AZStd::is_space(c);}); - thisPtr->erase(wsend.base(), thisPtr->end()); - return *thisPtr; - }) - ->Method("ToLower", [](ContainerType* thisPtr) - { - ContainerType toLowerString; - for (auto itr = thisPtr->begin(); itr < thisPtr->end(); itr++) - { - toLowerString.push_back(static_cast(tolower(*itr))); - } - return toLowerString; - }) - ->Method("ToUpper", [](ContainerType* thisPtr) - { - ContainerType toUpperString; - for (auto itr = thisPtr->begin(); itr < thisPtr->end(); itr++) - { - toUpperString.push_back(static_cast(toupper(*itr))); - } - return toUpperString; - }) - ->Method("Join", [](AZStd::vector* stringsToJoinPtr, const ContainerType& joinStr) - { - ContainerType joinString; - for (auto& stringToJoin : *stringsToJoinPtr) - { - joinString.append(stringToJoin).append(joinStr); - } - //Cut off the last join str - if (!stringsToJoinPtr->empty()) - { - joinString = joinString.substr(0, joinString.length() - joinStr.length()); - } - return joinString; - }) - - ->Method("Split", [](ContainerType* thisPtr, const ContainerType& splitter) - { - AZStd::vector splitStringList; - AZStd::tokenize(*thisPtr, splitter, splitStringList); - return splitStringList; - }) - ; + CommonOnDemandReflections::ReflectCommonString(context); } + static_assert (is_string, "Unspecialized basic_string<> template reflection requested."); } }; @@ -181,44 +108,9 @@ namespace AZ static void Reflect(ReflectContext* context) { - if (BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::Category, "Core") - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) - ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) - ->template Constructor() - ->Attribute(AZ::Script::Attributes::ConstructorOverride, &OnDemandLuaFunctions::ConstructStringView) - ->Attribute(AZ::Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&OnDemandLuaFunctions::StringTypeToLua, &OnDemandLuaFunctions::StringTypeFromLua)) - ->Method("ToString", [](const ContainerType& stringView) { return static_cast(stringView).c_str(); }, { { { "Reference", "String view object being converted to string" } } }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Converts string_view to string") - ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::ToString) - ->template WrappingMember(&ContainerType::data) - ->Method("data", &ContainerType::data) - ->Attribute(AZ::Script::Attributes::ToolTip, "Returns reference to raw string data") - ->Method("length", [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->length()); }, { { { "This", "Reference to the object the method is being performed on" } } }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Returns length of string view") - ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length) - ->Method("size", [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->size()); }, { { { "This", "Reference to the object the method is being performed on" }} }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Returns length of string view") - ->Method("find", [](ContainerType* thisPtr, ContainerType stringToFind, int startPos) - { - return aznumeric_cast(thisPtr->find(stringToFind, startPos)); - }, { { { "This", "Reference to the object the method is being performed on" }, { "View", "View to search " }, { "Position", "Index in view to start search" }} }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Searches for supplied string within this string") - ->Method("substr", [](ContainerType* thisPtr, int pos, int len) - { - return thisPtr->substr(pos, len); - }, { {{"This", "Reference to the object the method is being performed on"}, {"Position", "Index in view that indicates the beginning of the sub string"}, {"Count", "Length of characters that sub string view occupies" }} }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Creates a sub view of this string view. The string data is not actually modified") - ->Method("remove_prefix", [](ContainerType* thisPtr, int n) {thisPtr->remove_prefix(n); }, - { { { "This", "Reference to the object the method is being performed on" }, { "Count", "Number of characters to remove from start of view" }} }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Moves the supplied number of characters from the beginning of this sub view") - ->Method("remove_suffix", [](ContainerType* thisPtr, int n) {thisPtr->remove_suffix(n); }, - { { { "This", "Reference to the object the method is being performed on" } ,{ "Count", "Number of characters to remove from end of view" }} }) - ->Attribute(AZ::Script::Attributes::ToolTip, "Moves the supplied number of characters from the end of this sub view") - ; - } + constexpr bool is_common = AZStd::is_same_v && AZStd::is_same_v>; + static_assert (is_common, "Unspecialized basic_string_view<> template reflection requested."); + CommonOnDemandReflections::ReflectCommonStringView(context); } }; @@ -228,7 +120,7 @@ namespace AZ { using ContainerType = AZStd::intrusive_ptr; - // TODO: Count reflection types for a proper un-reflect + // TODO: Count reflection types for a proper un-reflect static void CustomConstructor(ContainerType* thisPtr, ScriptDataContext& dc) { @@ -276,7 +168,7 @@ namespace AZ { using ContainerType = AZStd::shared_ptr; - // TODO: Count reflection types for a proper un-reflect + // TODO: Count reflection types for a proper un-reflect static void CustomConstructor(ContainerType* thisPtr, ScriptDataContext& dc) { @@ -435,7 +327,7 @@ namespace AZ thisPtr[uindex] = value; } - + static bool EraseCheck_VM(ContainerType& thisPtr, AZ::u64 index) { if (index < thisPtr.size()) @@ -448,7 +340,7 @@ namespace AZ return false; } } - + static ContainerType& ErasePost_VM(ContainerType& thisPtr, AZ::u64 /*index*/) { return thisPtr; @@ -604,7 +496,7 @@ namespace AZ return AZ::Failure(AZStd::string::format("Index out of bounds: %zu (size: %zu)", index, thisContainer.size())); } } - + static AZ::Outcome Replace(ContainerType& thisContainer, size_t index, T& value) { if (index >= 0 && index < thisContainer.size()) @@ -634,7 +526,7 @@ namespace AZ ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length) ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) ->Attribute(AZ::Script::Attributes::Deprecated, true) - + ->Method(k_accessElementName, &At, {{ {}, { "Index", "The index to read from", nullptr, BehaviorParameter::Traits::TR_INDEX }}}) ->Method(k_sizeName, [](ContainerType*) { return aznumeric_cast(N); }) ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length) @@ -743,27 +635,8 @@ namespace AZ template<> // in case someone has an issue with bool struct OnDemandReflection> { - using OutcomeType = AZ::Outcome; - - static void Reflect(ReflectContext* context) - { - if (BehaviorContext* behaviorContext = azrtti_cast(context)) - { - // note we can reflect iterator types and support iterators, as of know we want to keep it simple - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) - ->Attribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, true) - ->Attribute(AZ::ScriptCanvasAttributes::PrettyName, &ScriptCanvasOnDemandReflection::OnDemandPrettyName::Get) - ->Attribute(AZ::Script::Attributes::ToolTip, &ScriptCanvasOnDemandReflection::OnDemandToolTip::Get) - ->Attribute(AZ::Script::Attributes::Category, &ScriptCanvasOnDemandReflection::OnDemandCategoryName::Get) - ->Attribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, AttributeIsValid::IfPresent) - ->Attribute(AZ::ScriptCanvasAttributes::VariableCreationForbidden, AttributeIsValid::IfPresent) - ->Method("Failure", []() -> OutcomeType { return AZ::Failure(); }) - ->Method("Success", []() -> OutcomeType { return AZ::Success(); }) - ->Method("IsSuccess", &OutcomeType::IsSuccess) - ; - } + static void Reflect(ReflectContext* context) { + CommonOnDemandReflections::ReflectVoidOutcome(context); } }; @@ -1179,16 +1052,8 @@ namespace AZ template <> struct OnDemandReflection { - static void Reflect(ReflectContext* context) - { - if (BehaviorContext* behaviorContext = azrtti_cast(context)) - { - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) - ->Attribute(Script::Attributes::Ignore, true) // Don't reflect any type to script (there should never be an any instance in script) - ->Attribute(Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&AZ::OnDemandLuaFunctions::AnyToLua, &OnDemandLuaFunctions::AnyFromLua)) - ; - } + static void Reflect(ReflectContext* context) { + CommonOnDemandReflections::ReflectStdAny(context); } }; diff --git a/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflectionSpecializations.cpp b/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflectionSpecializations.cpp new file mode 100644 index 0000000000..c42e32cd42 --- /dev/null +++ b/Code/Framework/AzCore/AzCore/RTTI/AzStdOnDemandReflectionSpecializations.cpp @@ -0,0 +1,208 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +namespace AZ::CommonOnDemandReflections +{ + void ReflectCommonString(ReflectContext* context) + { + using ContainerType = AZStd::string; + using SizeType = typename ContainerType::size_type; + using ValueType = typename ContainerType::value_type; + if (BehaviorContext* behaviorContext = azrtti_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) + ->template Constructor() + ->Attribute(AZ::Script::Attributes::ConstructorOverride, &OnDemandLuaFunctions::ConstructBasicString) + ->Attribute(AZ::Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&OnDemandLuaFunctions::StringTypeToLua, &OnDemandLuaFunctions::StringTypeFromLua)) + ->template WrappingMember(&ContainerType::c_str) + ->Method("c_str", &ContainerType::c_str) + ->Method("Length", [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->length()); }) + ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length) + ->Method("Equal", [](const ContainerType& lhs, const ContainerType& rhs) + { + return lhs == rhs; + }) + ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Equal) + ->Method("Find", [](ContainerType* thisPtr, const ContainerType& stringToFind, const int& startPos) + { + return aznumeric_cast(thisPtr->find(stringToFind, startPos)); + }) + ->Method("Substring", [](ContainerType* thisPtr, const int& pos, const int& len) + { + return thisPtr->substr(pos, len); + }) + ->Method("Replace", [](ContainerType* thisPtr, const ContainerType& stringToReplace, const ContainerType& replacementString) + { + SizeType startPos = 0; + while ((startPos = thisPtr->find(stringToReplace, startPos)) != ContainerType::npos && !stringToReplace.empty()) + { + thisPtr->replace(startPos, stringToReplace.length(), replacementString); + startPos += replacementString.length(); + } + + return *thisPtr; + }) + ->Method("ReplaceByIndex", [](ContainerType* thisPtr, const int& beginIndex, const int& endIndex, const ContainerType& replacementString) + { + thisPtr->replace(beginIndex, endIndex - beginIndex + 1, replacementString); + return *thisPtr; + }) + ->Method("Add", [](ContainerType* thisPtr, const ContainerType& addend) + { + return *thisPtr + addend; + }) + ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Concat) + ->Method("TrimLeft", [](ContainerType* thisPtr) + { + auto wsfront = AZStd::find_if_not(thisPtr->begin(), thisPtr->end(), [](char c) {return AZStd::is_space(c);}); + thisPtr->erase(thisPtr->begin(), wsfront); + return *thisPtr; + }) + ->Method("TrimRight", [](ContainerType* thisPtr) + { + auto wsend = AZStd::find_if_not(thisPtr->rbegin(), thisPtr->rend(), [](char c) {return AZStd::is_space(c);}); + thisPtr->erase(wsend.base(), thisPtr->end()); + return *thisPtr; + }) + ->Method("ToLower", [](ContainerType* thisPtr) + { + ContainerType toLowerString; + for (auto itr = thisPtr->begin(); itr < thisPtr->end(); itr++) + { + toLowerString.push_back(static_cast(tolower(*itr))); + } + return toLowerString; + }) + ->Method("ToUpper", [](ContainerType* thisPtr) + { + ContainerType toUpperString; + for (auto itr = thisPtr->begin(); itr < thisPtr->end(); itr++) + { + toUpperString.push_back(static_cast(toupper(*itr))); + } + return toUpperString; + }) + ->Method("Join", [](AZStd::vector* stringsToJoinPtr, const ContainerType& joinStr) + { + ContainerType joinString; + for (auto& stringToJoin : *stringsToJoinPtr) + { + joinString.append(stringToJoin).append(joinStr); + } + //Cut off the last join str + if (!stringsToJoinPtr->empty()) + { + joinString = joinString.substr(0, joinString.length() - joinStr.length()); + } + return joinString; + }) + + ->Method("Split", [](ContainerType* thisPtr, const ContainerType& splitter) + { + AZStd::vector splitStringList; + AZStd::tokenize(*thisPtr, splitter, splitStringList); + return splitStringList; + }) + ; + } + } + void ReflectCommonStringView(ReflectContext* context) + { + using ContainerType = AZStd::string_view; + + if (BehaviorContext* behaviorContext = azrtti_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Category, "Core") + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) + ->template Constructor() + ->Attribute(AZ::Script::Attributes::ConstructorOverride, &OnDemandLuaFunctions::ConstructStringView) + ->Attribute(AZ::Script::Attributes::ReaderWriterOverride, ScriptContext::CustomReaderWriter(&OnDemandLuaFunctions::StringTypeToLua, &OnDemandLuaFunctions::StringTypeFromLua)) + ->Method("ToString", [](const ContainerType& stringView) { return static_cast(stringView).c_str(); }, { { { "Reference", "String view object being converted to string" } } }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Converts string_view to string") + ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::ToString) + ->template WrappingMember(&ContainerType::data) + ->Method("data", &ContainerType::data) + ->Attribute(AZ::Script::Attributes::ToolTip, "Returns reference to raw string data") + ->Method("length", [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->length()); }, { { { "This", "Reference to the object the method is being performed on" } } }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Returns length of string view") + ->Attribute(AZ::Script::Attributes::Operator, AZ::Script::Attributes::OperatorType::Length) + ->Method("size", [](ContainerType* thisPtr) { return aznumeric_cast(thisPtr->size()); }, { { { "This", "Reference to the object the method is being performed on" }} }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Returns length of string view") + ->Method("find", [](ContainerType* thisPtr, ContainerType stringToFind, int startPos) + { + return aznumeric_cast(thisPtr->find(stringToFind, startPos)); + }, { { { "This", "Reference to the object the method is being performed on" }, { "View", "View to search " }, { "Position", "Index in view to start search" }} }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Searches for supplied string within this string") + ->Method("substr", [](ContainerType* thisPtr, int pos, int len) + { + return thisPtr->substr(pos, len); + }, { {{"This", "Reference to the object the method is being performed on"}, {"Position", "Index in view that indicates the beginning of the sub string"}, {"Count", "Length of characters that sub string view occupies" }} }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Creates a sub view of this string view. The string data is not actually modified") + ->Method("remove_prefix", [](ContainerType* thisPtr, int n) {thisPtr->remove_prefix(n); }, + { { { "This", "Reference to the object the method is being performed on" }, { "Count", "Number of characters to remove from start of view" }} }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Moves the supplied number of characters from the beginning of this sub view") + ->Method("remove_suffix", [](ContainerType* thisPtr, int n) {thisPtr->remove_suffix(n); }, + { { { "This", "Reference to the object the method is being performed on" } ,{ "Count", "Number of characters to remove from end of view" }} }) + ->Attribute(AZ::Script::Attributes::ToolTip, "Moves the supplied number of characters from the end of this sub view") + ; + } + } + + + void ReflectVoidOutcome(ReflectContext* context) + { + using OutcomeType = AZ::Outcome; + + if (BehaviorContext* behaviorContext = azrtti_cast(context)) + { + // note we can reflect iterator types and support iterators, as of know we want to keep it simple + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Attribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, true) + ->Attribute(AZ::ScriptCanvasAttributes::PrettyName, &ScriptCanvasOnDemandReflection::OnDemandPrettyName::Get) + ->Attribute(AZ::Script::Attributes::ToolTip, &ScriptCanvasOnDemandReflection::OnDemandToolTip::Get) + ->Attribute(AZ::Script::Attributes::Category, &ScriptCanvasOnDemandReflection::OnDemandCategoryName::Get) + ->Attribute(AZ::ScriptCanvasAttributes::AllowInternalCreation, AttributeIsValid::IfPresent) + ->Attribute(AZ::ScriptCanvasAttributes::VariableCreationForbidden, AttributeIsValid::IfPresent) + ->Method("Failure", []() -> OutcomeType { return AZ::Failure(); }) + ->Method("Success", []() -> OutcomeType { return AZ::Success(); }) + ->Method("IsSuccess", &OutcomeType::IsSuccess) + ; + } + } + + void ReflectStdAny(ReflectContext* context) + { + if (BehaviorContext* behaviorContext = azrtti_cast(context)) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::ExcludeFrom, AZ::Script::Attributes::ExcludeFlags::All) + ->Attribute( + Script::Attributes::Ignore, true) // Don't reflect any type to script (there should never be an any instance in script) + ->Attribute( + Script::Attributes::ReaderWriterOverride, + ScriptContext::CustomReaderWriter(&AZ::OnDemandLuaFunctions::AnyToLua, &OnDemandLuaFunctions::AnyFromLua)); + } + } + +} // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryScriptUtils.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryScriptUtils.cpp index abaab425d3..c32591874b 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryScriptUtils.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryScriptUtils.cpp @@ -6,6 +6,7 @@ * */ +#include #include #include #include diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake index c2ee439645..b2ef586053 100644 --- a/Code/Framework/AzCore/AzCore/azcore_files.cmake +++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake @@ -440,6 +440,7 @@ set(FILES RTTI/AttributeReader.h RTTI/AzStdOnDemandPrettyName.inl RTTI/AzStdOnDemandReflection.inl + RTTI/AzStdOnDemandReflectionSpecializations.cpp RTTI/AzStdOnDemandReflectionLuaFunctions.inl RTTI/BehaviorContext.cpp RTTI/BehaviorContext.h diff --git a/Code/Framework/AzCore/Tests/Settings/SettingsRegistryScriptUtilsTests.cpp b/Code/Framework/AzCore/Tests/Settings/SettingsRegistryScriptUtilsTests.cpp index 111b4a027a..0fc491ac34 100644 --- a/Code/Framework/AzCore/Tests/Settings/SettingsRegistryScriptUtilsTests.cpp +++ b/Code/Framework/AzCore/Tests/Settings/SettingsRegistryScriptUtilsTests.cpp @@ -10,11 +10,12 @@ #include #include #include +#include namespace SettingsRegistryScriptUtilsTests { static constexpr const char* SettingsRegistryScriptClassName = "SettingsRegistryInterface"; - + class SettingsRegistryBehaviorContextFixture : public UnitTest::ScopedAllocatorSetupFixture @@ -77,7 +78,7 @@ namespace SettingsRegistryScriptUtilsTests // so the invoking the getter on global Settings Registry should succeed, but return nullptr EXPECT_TRUE(globalSettingsRegistryGetter->InvokeResult(settingsRegistryObject)); EXPECT_EQ(nullptr, settingsRegistryObject.m_settingsRegistry); - + // Register the Settings Registry stored on the fixture with the SettingsRegistry Interface AZ::SettingsRegistry::Register(m_registry.get()); EXPECT_TRUE(globalSettingsRegistryGetter->InvokeResult(settingsRegistryObject)); @@ -227,7 +228,7 @@ namespace SettingsRegistryScriptUtilsTests R"( "intIndex": -55)" "\n" R"( })" "\n" R"(])"; - + // Populate the settings registry to match the expected json values m_registry->Set("/TestObject/boolValue", false); m_registry->Set("/TestObject/intValue", aznumeric_cast(17)); @@ -562,4 +563,4 @@ namespace SettingsRegistryScriptUtilsTests SettingsRegistryBehaviorContextParams{ "/TestObject/stringValue", AZStd::string_view{"Hello World"}, "GetString", "SetString" } ) ); -} +} diff --git a/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp b/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp index 59a49a48e1..947d3821ab 100644 --- a/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp +++ b/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp @@ -7,6 +7,7 @@ */ #include "TerrainDataRequestBus.h" +#include namespace AzFramework { diff --git a/Code/Tools/SceneAPI/SceneCore/Events/ExportProductList.cpp b/Code/Tools/SceneAPI/SceneCore/Events/ExportProductList.cpp index d8a4cf1991..2392ed8219 100644 --- a/Code/Tools/SceneAPI/SceneCore/Events/ExportProductList.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Events/ExportProductList.cpp @@ -8,6 +8,7 @@ #include #include +#include #include namespace AZ diff --git a/Gems/AWSClientAuth/Code/Include/Public/Authorization/ClientAuthAWSCredentials.h b/Gems/AWSClientAuth/Code/Include/Public/Authorization/ClientAuthAWSCredentials.h index ba08534d91..9a838be556 100644 --- a/Gems/AWSClientAuth/Code/Include/Public/Authorization/ClientAuthAWSCredentials.h +++ b/Gems/AWSClientAuth/Code/Include/Public/Authorization/ClientAuthAWSCredentials.h @@ -8,11 +8,15 @@ #pragma once -#include #include #include +namespace AZ +{ + class ReflectContext; +} + namespace AWSClientAuth { //! Client auth AWS Credentials object for serialization. @@ -54,31 +58,8 @@ namespace AWSClientAuth return m_sessionToken; } - static void Reflect(AZ::ReflectContext* context) - { - auto serializeContext = azrtti_cast(context); - if (serializeContext) - { - serializeContext->Class() - ->Field("AWSAccessKeyId", &ClientAuthAWSCredentials::m_accessKeyId) - ->Field("AWSSecretKey", &ClientAuthAWSCredentials::m_secretKey) - ->Field("AWSSessionToken", &ClientAuthAWSCredentials::m_sessionToken); - } + static void Reflect(AZ::ReflectContext* context); - AZ::BehaviorContext* behaviorContext = azrtti_cast(context); - if (behaviorContext) - { - behaviorContext->Class() - ->Attribute(AZ::Script::Attributes::Category, "AWSClientAuth") - ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) - ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) - ->Constructor() - ->Constructor() - ->Property("AWSAccessKeyId", BehaviorValueGetter(&ClientAuthAWSCredentials::m_accessKeyId), BehaviorValueSetter(&ClientAuthAWSCredentials::m_accessKeyId)) - ->Property("AWSSecretKey", BehaviorValueGetter(&ClientAuthAWSCredentials::m_secretKey), BehaviorValueSetter(&ClientAuthAWSCredentials::m_secretKey)) - ->Property("AWSSessionToken", BehaviorValueGetter(&ClientAuthAWSCredentials::m_sessionToken), BehaviorValueSetter(&ClientAuthAWSCredentials::m_sessionToken)); - } - } private: AZStd::string m_accessKeyId; diff --git a/Gems/AWSClientAuth/Code/Source/Authorization/ClientAuthAWSCredentials.cpp b/Gems/AWSClientAuth/Code/Source/Authorization/ClientAuthAWSCredentials.cpp new file mode 100644 index 0000000000..764c67a4a6 --- /dev/null +++ b/Gems/AWSClientAuth/Code/Source/Authorization/ClientAuthAWSCredentials.cpp @@ -0,0 +1,50 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include + +#include +#include +#include +#include +#include + +namespace AWSClientAuth +{ + void ClientAuthAWSCredentials::Reflect(AZ::ReflectContext* context) + { + auto serializeContext = azrtti_cast(context); + if (serializeContext) + { + serializeContext->Class() + ->Field("AWSAccessKeyId", &ClientAuthAWSCredentials::m_accessKeyId) + ->Field("AWSSecretKey", &ClientAuthAWSCredentials::m_secretKey) + ->Field("AWSSessionToken", &ClientAuthAWSCredentials::m_sessionToken); + } + + AZ::BehaviorContext* behaviorContext = azrtti_cast(context); + if (behaviorContext) + { + behaviorContext->Class() + ->Attribute(AZ::Script::Attributes::Category, "AWSClientAuth") + ->Attribute(AZ::Script::Attributes::Storage, AZ::Script::Attributes::StorageType::Value) + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Constructor() + ->Constructor() + ->Property( + "AWSAccessKeyId", BehaviorValueGetter(&ClientAuthAWSCredentials::m_accessKeyId), + BehaviorValueSetter(&ClientAuthAWSCredentials::m_accessKeyId)) + ->Property( + "AWSSecretKey", BehaviorValueGetter(&ClientAuthAWSCredentials::m_secretKey), + BehaviorValueSetter(&ClientAuthAWSCredentials::m_secretKey)) + ->Property( + "AWSSessionToken", BehaviorValueGetter(&ClientAuthAWSCredentials::m_sessionToken), + BehaviorValueSetter(&ClientAuthAWSCredentials::m_sessionToken)); + } + } +} // namespace AWSClientAuth diff --git a/Gems/AWSClientAuth/Code/awsclientauth_files.cmake b/Gems/AWSClientAuth/Code/awsclientauth_files.cmake index ad679fe13a..bd4c971377 100644 --- a/Gems/AWSClientAuth/Code/awsclientauth_files.cmake +++ b/Gems/AWSClientAuth/Code/awsclientauth_files.cmake @@ -42,6 +42,7 @@ set(FILES Source/Authentication/LWAAuthenticationProvider.cpp Source/Authentication/GoogleAuthenticationProvider.cpp + Source/Authorization/ClientAuthAWSCredentials.cpp Source/Authorization/AWSCognitoAuthorizationController.cpp Source/Authorization/AWSClientAuthPersistentCognitoIdentityProvider.cpp diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/RadiusWeightModifier/RadiusWeightModifierComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/RadiusWeightModifier/RadiusWeightModifierComponentController.cpp index c2d7176436..434fc81e8f 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/RadiusWeightModifier/RadiusWeightModifierComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/PostProcess/RadiusWeightModifier/RadiusWeightModifierComponentController.cpp @@ -8,6 +8,7 @@ #include #include +#include namespace AZ { diff --git a/Gems/Blast/Code/Source/Asset/BlastChunksAsset.cpp b/Gems/Blast/Code/Source/Asset/BlastChunksAsset.cpp index 1d0ce15241..2a1ae5eb04 100644 --- a/Gems/Blast/Code/Source/Asset/BlastChunksAsset.cpp +++ b/Gems/Blast/Code/Source/Asset/BlastChunksAsset.cpp @@ -7,6 +7,7 @@ #include #include +#include namespace Blast { diff --git a/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp b/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp index 38e00e73ed..4ca40a5bab 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonReflectionComponent.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include diff --git a/Gems/EditorPythonBindings/Code/Source/PythonUtility.cpp b/Gems/EditorPythonBindings/Code/Source/PythonUtility.cpp index bc1a7d45a3..d324c6c14b 100644 --- a/Gems/EditorPythonBindings/Code/Source/PythonUtility.cpp +++ b/Gems/EditorPythonBindings/Code/Source/PythonUtility.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -276,7 +277,7 @@ namespace EditorPythonBindings } return false; } - + bool AllocateBehaviorValueParameter(const AZ::BehaviorMethod* behaviorMethod, AZ::BehaviorValueParameter& result, Convert::StackVariableAllocator& stackVariableAllocator) { if (const AZ::BehaviorParameter* resultType = behaviorMethod->GetResult()) @@ -390,7 +391,7 @@ namespace EditorPythonBindings cleanUp(); } } - + void StackVariableAllocator::StoreVariableDeleter(VariableDeleter&& deleter) { m_cleanUpItems.emplace_back(deleter); diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponent.cpp b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponent.cpp index 522493e1b4..9599b3f6e7 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeComponent.cpp @@ -7,6 +7,7 @@ */ #include +#include #include namespace LmbrCentral @@ -23,7 +24,7 @@ namespace LmbrCentral Call(FN_OnShapeChanged, changeReason); } }; - + void ShapeComponentGeneric::Reflect(AZ::ReflectContext* context) { AZ::BehaviorContext* behaviorContext = azrtti_cast(context); @@ -41,7 +42,7 @@ namespace LmbrCentral behaviorContext->Enum<(int)ShapeComponentNotifications::ShapeChangeReasons::TransformChanged>("ShapeChangeReasons_TransformChanged") ->Enum<(int)LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged>("ShapeChangeReasons_ShapeChanged"); - + behaviorContext->EBus("ShapeComponentNotificationsBus") ->Handler() ; diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h index 0239170640..a75685fb12 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -41,7 +42,7 @@ namespace Terrain /////////////////////////////////////////// // TerrainSystemServiceRequestBus::Handler Impl - + void SetWorldBounds(const AZ::Aabb& worldBounds) override; void SetHeightQueryResolution(AZ::Vector2 queryResolution) override; diff --git a/Gems/WhiteBox/Code/Source/WhiteBoxToolApiReflection.cpp b/Gems/WhiteBox/Code/Source/WhiteBoxToolApiReflection.cpp index f1b015b359..9c954e628c 100644 --- a/Gems/WhiteBox/Code/Source/WhiteBoxToolApiReflection.cpp +++ b/Gems/WhiteBox/Code/Source/WhiteBoxToolApiReflection.cpp @@ -10,6 +10,7 @@ #include "WhiteBoxToolApiReflection.h" #include +#include #include #include #include From e1829ac05238797da5245a3b9392003e5812ea62 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza Date: Fri, 10 Sep 2021 11:19:58 +0200 Subject: [PATCH 227/355] Added EntityExists for automation Signed-off-by: AMZN-AlexOteiza --- .../AzToolsFramework/API/ToolsApplicationAPI.h | 3 +++ .../Application/ToolsApplication.cpp | 14 ++++++++++---- .../Application/ToolsApplication.h | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h index d4707a3e8c..c037747a08 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/API/ToolsApplicationAPI.h @@ -414,6 +414,9 @@ namespace AzToolsFramework //! Gets an existing entity id from a known id. virtual AZ::EntityId GetExistingEntity(AZ::u64 id) = 0; + //! Returns if an entity with the given id exists + virtual bool EntityExists(AZ::EntityId id) = 0; + /*! * Delete all currently-selected entities. */ diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp index 6de529e456..0a6022eeba 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp @@ -378,6 +378,7 @@ namespace AzToolsFramework ->Event("CreateNewEntityAtPosition", &ToolsApplicationRequests::CreateNewEntityAtPosition) ->Event("GetCurrentLevelEntityId", &ToolsApplicationRequests::GetCurrentLevelEntityId) ->Event("GetExistingEntity", &ToolsApplicationRequests::GetExistingEntity) + ->Event("EntityExists", &ToolsApplicationRequests::EntityExists) ->Event("DeleteEntityById", &ToolsApplicationRequests::DeleteEntityById) ->Event("DeleteEntities", &ToolsApplicationRequests::DeleteEntities) ->Event("DeleteEntityAndAllDescendants", &ToolsApplicationRequests::DeleteEntityAndAllDescendants) @@ -483,7 +484,7 @@ namespace AzToolsFramework EBUS_EVENT_RESULT(serializeContext, AZ::ComponentApplicationBus, GetSerializeContext); AZ_Assert(serializeContext, "No serialization context found"); - const AZ::Entity::ComponentArrayType& editorComponents = source.GetComponents(); + const AZ::Entity::ComponentArrayType& editorComponents = source.GetUserComponents(); // Propagate components from source entity to target, in preparation for exporting target. for (AZ::Component* component : editorComponents) @@ -493,15 +494,15 @@ namespace AzToolsFramework if (asEditorComponent) { - const size_t oldComponentCount = target.GetComponents().size(); + const size_t oldComponentCount = target.GetUserComponents().size(); asEditorComponent->BuildGameEntity(&target); // Applying same Id persistence trick as we do in the slice compiler. Once we're off levels, // this code all goes away and everything runs through the slice compiler. - if (target.GetComponents().size() > oldComponentCount) + if (target.GetUserComponents().size() > oldComponentCount) { - AZ::Component* newComponent = target.GetComponents().back(); + AZ::Component* newComponent = target.GetUserComponents().back(); AZ_Error("Export", asEditorComponent->GetId() != AZ::InvalidComponentId, "For entity \"%s\", component \"%s\" doesn't have a valid component id", source.GetName().c_str(), asEditorComponent->RTTI_GetType().ToString().c_str()); newComponent->SetId(asEditorComponent->GetId()); @@ -783,6 +784,11 @@ namespace AzToolsFramework return AZ::EntityId{id}; } + bool ToolsApplication::EntityExists(AZ::EntityId id) + { + return FindEntity(id) != nullptr; + } + void ToolsApplication::DeleteSelected() { if (IsPrefabSystemEnabled()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h index e7fa543faf..d05ec5728d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.h @@ -115,6 +115,7 @@ namespace AzToolsFramework AZ::EntityId CreateNewEntity(AZ::EntityId parentId = AZ::EntityId()) override; AZ::EntityId CreateNewEntityAtPosition(const AZ::Vector3& pos, AZ::EntityId parentId = AZ::EntityId()) override; AZ::EntityId GetExistingEntity(AZ::u64 id) override; + bool EntityExists(AZ::EntityId id) override; void DeleteSelected() override; void DeleteEntityById(AZ::EntityId entityId) override; void DeleteEntities(const EntityIdList& entities) override; From 0f0812c198b3e337d8976610281f6205cf00c65c Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza Date: Fri, 10 Sep 2021 11:25:51 +0200 Subject: [PATCH 228/355] Reverted unintended change Signed-off-by: AMZN-AlexOteiza --- .../AzToolsFramework/Application/ToolsApplication.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp index 0a6022eeba..75d31321c2 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Application/ToolsApplication.cpp @@ -484,7 +484,7 @@ namespace AzToolsFramework EBUS_EVENT_RESULT(serializeContext, AZ::ComponentApplicationBus, GetSerializeContext); AZ_Assert(serializeContext, "No serialization context found"); - const AZ::Entity::ComponentArrayType& editorComponents = source.GetUserComponents(); + const AZ::Entity::ComponentArrayType& editorComponents = source.GetComponents(); // Propagate components from source entity to target, in preparation for exporting target. for (AZ::Component* component : editorComponents) @@ -494,15 +494,15 @@ namespace AzToolsFramework if (asEditorComponent) { - const size_t oldComponentCount = target.GetUserComponents().size(); + const size_t oldComponentCount = target.GetComponents().size(); asEditorComponent->BuildGameEntity(&target); // Applying same Id persistence trick as we do in the slice compiler. Once we're off levels, // this code all goes away and everything runs through the slice compiler. - if (target.GetUserComponents().size() > oldComponentCount) + if (target.GetComponents().size() > oldComponentCount) { - AZ::Component* newComponent = target.GetUserComponents().back(); + AZ::Component* newComponent = target.GetComponents().back(); AZ_Error("Export", asEditorComponent->GetId() != AZ::InvalidComponentId, "For entity \"%s\", component \"%s\" doesn't have a valid component id", source.GetName().c_str(), asEditorComponent->RTTI_GetType().ToString().c_str()); newComponent->SetId(asEditorComponent->GetId()); From ddd662f6b9bebcb32a88b7d0835bfe5a68492073 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza Date: Fri, 10 Sep 2021 14:28:40 +0200 Subject: [PATCH 229/355] rename to tmp name --- .../Gem/PythonTests/{physics => physics_}/CMakeLists.txt | 0 .../PythonTests/{physics => physics_}/TestSuite_InDevelopment.py | 0 .../Gem/PythonTests/{physics => physics_}/TestSuite_Main.py | 0 .../PythonTests/{physics => physics_}/TestSuite_Main_Optimized.py | 0 .../Gem/PythonTests/{physics => physics_}/TestSuite_Periodic.py | 0 .../Gem/PythonTests/{physics => physics_}/TestSuite_Sandbox.py | 0 .../Gem/PythonTests/{physics => physics_}/TestSuite_Utils.py | 0 .../Gem/PythonTests/{physics => physics_}/__init__.py | 0 .../tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py | 0 .../tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py | 0 .../Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py | 0 .../tests/Physics_WorldBodyBusWorksOnEditorComponents.py | 0 .../character_controller/CharacterController_SwitchLevels.py | 0 .../tests/collider/Collider_AddColliderComponent.py | 0 .../tests/collider/Collider_AddingNewGroupWorks.py | 0 .../tests/collider/Collider_BoxShapeEditting.py | 0 .../tests/collider/Collider_CapsuleShapeEditting.py | 0 .../tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py | 0 .../tests/collider/Collider_ColliderPositionOffset.py | 0 .../tests/collider/Collider_ColliderRotationOffset.py | 0 .../tests/collider/Collider_CollisionGroupsWorkflow.py | 0 .../Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py | 0 .../tests/collider/Collider_MultipleSurfaceSlots.py | 0 .../collider/Collider_NoneCollisionGroupSameLayerNotCollide.py | 0 .../Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py | 0 ...Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py | 0 .../tests/collider/Collider_PxMeshConvexMeshCollides.py | 0 .../tests/collider/Collider_PxMeshErrorIfNoMesh.py | 0 .../collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py | 0 .../collider/Collider_SameCollisionGroupDiffLayersCollide.py | 0 .../collider/Collider_SameCollisionGroupSameCustomLayerCollide.py | 0 .../tests/collider/Collider_SameCollisionGroupSameLayerCollide.py | 0 .../tests/collider/Collider_SphereShapeEditting.py | 0 .../tests/collider/Collider_TriggerPassThrough.py | 0 .../tests/force_region/ForceRegion_CapsuleShapedForce.py | 0 .../force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py | 0 .../ForceRegion_HighValuesDirectionAxesWorkWithNoError.py | 0 .../tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py | 0 .../force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py | 0 .../force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py | 0 .../force_region/ForceRegion_LinearDampingForceOnRigidBodies.py | 0 .../force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py | 0 .../force_region/ForceRegion_MovingForceRegionChangesNetForce.py | 0 .../force_region/ForceRegion_MultipleComponentsCombineForces.py | 0 .../ForceRegion_MultipleForcesInSameComponentCombineForces.py | 0 .../force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py | 0 .../force_region/ForceRegion_ParentChildForcesCombineForces.py | 0 .../tests/force_region/ForceRegion_PointForceOnRigidBodies.py | 0 .../tests/force_region/ForceRegion_PositionOffset.py | 0 .../tests/force_region/ForceRegion_PxMeshShapedForce.py | 0 .../tests/force_region/ForceRegion_RotationalOffset.py | 0 .../force_region/ForceRegion_SimpleDragForceOnRigidBodies.py | 0 .../tests/force_region/ForceRegion_SliceFileInstantiates.py | 0 .../ForceRegion_SmallMagnitudeDeviationOnLargeForces.py | 0 .../tests/force_region/ForceRegion_SphereShapedForce.py | 0 .../tests/force_region/ForceRegion_SplineForceOnRigidBodies.py | 0 .../force_region/ForceRegion_SplineRegionWithModifiedTransform.py | 0 .../force_region/ForceRegion_WithNonTriggerColliderWarning.py | 0 .../force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py | 0 .../force_region/ForceRegion_ZeroLinearDampingDoesNothing.py | 0 .../force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py | 0 .../tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py | 0 .../force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py | 0 .../tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py | 0 .../force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py | 0 .../{physics => physics_}/tests/joints/JointsHelper.py | 0 .../tests/joints/Joints_Ball2BodiesConstrained.py | 0 .../{physics => physics_}/tests/joints/Joints_BallBreakable.py | 0 .../tests/joints/Joints_BallLeadFollowerCollide.py | 0 .../tests/joints/Joints_BallNoLimitsConstrained.py | 0 .../tests/joints/Joints_BallSoftLimitsConstrained.py | 0 .../tests/joints/Joints_Fixed2BodiesConstrained.py | 0 .../{physics => physics_}/tests/joints/Joints_FixedBreakable.py | 0 .../tests/joints/Joints_FixedLeadFollowerCollide.py | 0 .../tests/joints/Joints_GlobalFrameConstrained.py | 0 .../tests/joints/Joints_Hinge2BodiesConstrained.py | 0 .../{physics => physics_}/tests/joints/Joints_HingeBreakable.py | 0 .../tests/joints/Joints_HingeLeadFollowerCollide.py | 0 .../tests/joints/Joints_HingeNoLimitsConstrained.py | 0 .../tests/joints/Joints_HingeSoftLimitsConstrained.py | 0 .../{physics => physics_}/tests/material/AddModifyDelete_Utils.py | 0 .../tests/material/Material_CanBeAssignedToTerrain.py | 0 .../tests/material/Material_CharacterController.py | 0 .../tests/material/Material_ComponentsInSyncWithLibrary.py | 0 .../material/Material_DefaultLibraryConsistentOnAllFeatures.py | 0 .../material/Material_DefaultLibraryUpdatedAcrossLevels_after.py | 0 .../material/Material_DefaultLibraryUpdatedAcrossLevels_before.py | 0 .../tests/material/Material_DefaultMaterialLibraryChangesWork.py | 0 .../tests/material/Material_DynamicFriction.py | 0 .../tests/material/Material_EmptyLibraryUsesDefault.py | 0 .../tests/material/Material_FrictionCombine.py | 0 .../tests/material/Material_FrictionCombinePriorityOrder.py | 0 .../tests/material/Material_LibraryChangesReflectInstantly.py | 0 .../tests/material/Material_LibraryClearingAssignsDefault.py | 0 .../Material_LibraryCrudOperationsReflectOnCharacterController.py | 0 .../material/Material_LibraryCrudOperationsReflectOnCollider.py | 0 .../Material_LibraryCrudOperationsReflectOnRagdollBones.py | 0 .../material/Material_LibraryCrudOperationsReflectOnTerrain.py | 0 .../tests/material/Material_LibraryUpdatedAcrossLevels.py | 0 .../tests/material/Material_NoEffectIfNoColliderShape.py | 0 .../tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py | 0 .../{physics => physics_}/tests/material/Material_RagdollBones.py | 0 .../{physics => physics_}/tests/material/Material_Restitution.py | 0 .../tests/material/Material_RestitutionCombine.py | 0 .../tests/material/Material_RestitutionCombinePriorityOrder.py | 0 .../tests/material/Material_StaticFriction.py | 0 .../{physics => physics_}/tests/material/Physmaterial_Editor.py | 0 .../tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py | 0 .../tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py | 0 .../tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py | 0 .../tests/ragdoll/Ragdoll_WorldBodyBusWorks.py | 0 .../tests/rigid_body/RigidBody_AddRigidBodyComponent.py | 0 .../tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py | 0 .../tests/rigid_body/RigidBody_COM_ComputingWorks.py | 0 .../tests/rigid_body/RigidBody_COM_ManualSettingWorks.py | 0 .../tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py | 0 .../tests/rigid_body/RigidBody_ComputeInertiaWorks.py | 0 .../tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py | 0 .../RigidBody_EnablingGravityWorksUsingNotificationsPoC.py | 0 .../tests/rigid_body/RigidBody_InitialAngularVelocity.py | 0 .../tests/rigid_body/RigidBody_InitialLinearVelocity.py | 0 .../tests/rigid_body/RigidBody_KinematicModeWorks.py | 0 .../tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py | 0 .../tests/rigid_body/RigidBody_MassDifferentValuesWorks.py | 0 .../tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py | 0 .../tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py | 0 .../tests/rigid_body/RigidBody_SetGravityWorks.py | 0 .../tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py | 0 .../tests/rigid_body/RigidBody_StartAsleepWorks.py | 0 .../tests/rigid_body/RigidBody_StartGravityEnabledWorks.py | 0 .../tests/script_canvas/ScriptCanvas_CollisionEvents.py | 0 .../script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py | 0 ...iptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py | 0 .../tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py | 0 .../tests/script_canvas/ScriptCanvas_OverlapNode.py | 0 .../tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py | 0 .../tests/script_canvas/ScriptCanvas_PostUpdateEvent.py | 0 .../tests/script_canvas/ScriptCanvas_PreUpdateEvent.py | 0 .../script_canvas/ScriptCanvas_SetKinematicTargetTransform.py | 0 .../tests/script_canvas/ScriptCanvas_ShapeCast.py | 0 .../script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py | 0 .../tests/script_canvas/ScriptCanvas_TriggerEvents.py | 0 .../tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py | 0 .../tests/shape_collider/ShapeCollider_CylinderShapeCollides.py | 0 .../shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py | 0 .../ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py | 0 .../tests/terrain/Terrain_AddPhysTerrainComponent.py | 0 .../tests/terrain/Terrain_CanAddMultipleTerrainComponents.py | 0 .../tests/terrain/Terrain_CollisionAgainstRigidBody.py | 0 .../tests/terrain/Terrain_MultipleResolutionsValid.py | 0 .../tests/terrain/Terrain_MultipleTerrainComponentsWarning.py | 0 .../tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py | 0 .../tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py | 0 .../tests/terrain/Terrain_TerrainTexturePainterWorks.py | 0 .../Gem/PythonTests/{physics => physics_}/utils/FileManagement.py | 0 .../{physics => physics_}/utils/UtilTest_Managed_Files.py | 0 .../{physics => physics_}/utils/UtilTest_Physmaterial_Editor.py | 0 .../{physics => physics_}/utils/UtilTest_PhysxConfig_Default.py | 0 .../{physics => physics_}/utils/UtilTest_PhysxConfig_Override.py | 0 .../utils/UtilTest_Tracer_PicksErrorsAndWarnings.py | 0 160 files changed, 0 insertions(+), 0 deletions(-) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/CMakeLists.txt (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/TestSuite_InDevelopment.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/TestSuite_Main.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/TestSuite_Main_Optimized.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/TestSuite_Periodic.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/TestSuite_Sandbox.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/TestSuite_Utils.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/__init__.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/Physics_WorldBodyBusWorksOnEditorComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/character_controller/CharacterController_SwitchLevels.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_AddColliderComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_AddingNewGroupWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_BoxShapeEditting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_CapsuleShapeEditting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_ColliderPositionOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_ColliderRotationOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_CollisionGroupsWorkflow.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_MultipleSurfaceSlots.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_PxMeshConvexMeshCollides.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_PxMeshErrorIfNoMesh.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_SphereShapeEditting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/collider/Collider_TriggerPassThrough.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_CapsuleShapedForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_PointForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_PositionOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_PxMeshShapedForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_RotationalOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_SliceFileInstantiates.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_SphereShapedForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/JointsHelper.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_Ball2BodiesConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_BallBreakable.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_BallLeadFollowerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_BallNoLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_BallSoftLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_Fixed2BodiesConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_FixedBreakable.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_FixedLeadFollowerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_GlobalFrameConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_Hinge2BodiesConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_HingeBreakable.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_HingeLeadFollowerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_HingeNoLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/joints/Joints_HingeSoftLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/AddModifyDelete_Utils.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_CanBeAssignedToTerrain.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_CharacterController.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_ComponentsInSyncWithLibrary.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_DefaultMaterialLibraryChangesWork.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_DynamicFriction.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_EmptyLibraryUsesDefault.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_FrictionCombine.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_FrictionCombinePriorityOrder.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryChangesReflectInstantly.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryClearingAssignsDefault.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_LibraryUpdatedAcrossLevels.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_NoEffectIfNoColliderShape.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_RagdollBones.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_Restitution.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_RestitutionCombine.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_RestitutionCombinePriorityOrder.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Material_StaticFriction.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/material/Physmaterial_Editor.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_AddRigidBodyComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_COM_ComputingWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_ComputeInertiaWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_InitialAngularVelocity.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_InitialLinearVelocity.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_KinematicModeWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_SetGravityWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_StartAsleepWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_CollisionEvents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_OverlapNode.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_ShapeCast.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/script_canvas/ScriptCanvas_TriggerEvents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_AddPhysTerrainComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_CollisionAgainstRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_MultipleResolutionsValid.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/tests/terrain/Terrain_TerrainTexturePainterWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/utils/FileManagement.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/utils/UtilTest_Managed_Files.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/utils/UtilTest_Physmaterial_Editor.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/utils/UtilTest_PhysxConfig_Default.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/utils/UtilTest_PhysxConfig_Override.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics => physics_}/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py (100%) diff --git a/AutomatedTesting/Gem/PythonTests/physics/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/physics_/CMakeLists.txt similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/CMakeLists.txt rename to AutomatedTesting/Gem/PythonTests/physics_/CMakeLists.txt diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py b/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_InDevelopment.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_InDevelopment.py rename to AutomatedTesting/Gem/PythonTests/physics_/TestSuite_InDevelopment.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main.py rename to AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main_Optimized.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Main_Optimized.py rename to AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main_Optimized.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Periodic.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Periodic.py rename to AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Periodic.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Sandbox.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Sandbox.py rename to AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Sandbox.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/TestSuite_Utils.py b/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Utils.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/TestSuite_Utils.py rename to AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Utils.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/__init__.py b/AutomatedTesting/Gem/PythonTests/physics_/__init__.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/__init__.py rename to AutomatedTesting/Gem/PythonTests/physics_/__init__.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_WorldBodyBusWorksOnEditorComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_WorldBodyBusWorksOnEditorComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/character_controller/CharacterController_SwitchLevels.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/character_controller/CharacterController_SwitchLevels.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/character_controller/CharacterController_SwitchLevels.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/character_controller/CharacterController_SwitchLevels.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddColliderComponent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddColliderComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddColliderComponent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddColliderComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddingNewGroupWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddingNewGroupWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_AddingNewGroupWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddingNewGroupWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_BoxShapeEditting.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_BoxShapeEditting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_BoxShapeEditting.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_BoxShapeEditting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CapsuleShapeEditting.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CapsuleShapeEditting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CapsuleShapeEditting.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CapsuleShapeEditting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderPositionOffset.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderPositionOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderPositionOffset.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderPositionOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderRotationOffset.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderRotationOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_ColliderRotationOffset.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderRotationOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CollisionGroupsWorkflow.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CollisionGroupsWorkflow.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_CollisionGroupsWorkflow.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CollisionGroupsWorkflow.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_MultipleSurfaceSlots.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_MultipleSurfaceSlots.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_MultipleSurfaceSlots.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_MultipleSurfaceSlots.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshConvexMeshCollides.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshConvexMeshCollides.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshConvexMeshCollides.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshConvexMeshCollides.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshErrorIfNoMesh.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshErrorIfNoMesh.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SphereShapeEditting.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SphereShapeEditting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_SphereShapeEditting.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SphereShapeEditting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_TriggerPassThrough.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_TriggerPassThrough.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/collider/Collider_TriggerPassThrough.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_TriggerPassThrough.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_CapsuleShapedForce.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_CapsuleShapedForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_CapsuleShapedForce.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_CapsuleShapedForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PointForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PointForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PositionOffset.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PositionOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PositionOffset.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PositionOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PxMeshShapedForce.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PxMeshShapedForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_PxMeshShapedForce.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PxMeshShapedForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_RotationalOffset.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_RotationalOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_RotationalOffset.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_RotationalOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SliceFileInstantiates.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SliceFileInstantiates.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SliceFileInstantiates.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SliceFileInstantiates.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SphereShapedForce.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SphereShapedForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SphereShapedForce.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SphereShapedForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/JointsHelper.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/JointsHelper.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/JointsHelper.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/JointsHelper.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Ball2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Ball2BodiesConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Ball2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Ball2BodiesConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallBreakable.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallBreakable.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallBreakable.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallLeadFollowerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallLeadFollowerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallNoLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallNoLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallSoftLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_BallSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallSoftLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Fixed2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Fixed2BodiesConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Fixed2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Fixed2BodiesConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedBreakable.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedBreakable.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedBreakable.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedLeadFollowerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_FixedLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedLeadFollowerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_GlobalFrameConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_GlobalFrameConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_GlobalFrameConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_GlobalFrameConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Hinge2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Hinge2BodiesConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_Hinge2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Hinge2BodiesConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeBreakable.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeBreakable.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeBreakable.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeBreakable.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeLeadFollowerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeLeadFollowerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeNoLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeNoLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeSoftLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/joints/Joints_HingeSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeSoftLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/AddModifyDelete_Utils.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/AddModifyDelete_Utils.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/AddModifyDelete_Utils.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/AddModifyDelete_Utils.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CanBeAssignedToTerrain.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CanBeAssignedToTerrain.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CanBeAssignedToTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CanBeAssignedToTerrain.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CharacterController.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CharacterController.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_CharacterController.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CharacterController.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_ComponentsInSyncWithLibrary.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_ComponentsInSyncWithLibrary.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_ComponentsInSyncWithLibrary.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_ComponentsInSyncWithLibrary.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultMaterialLibraryChangesWork.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultMaterialLibraryChangesWork.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DynamicFriction.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DynamicFriction.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_DynamicFriction.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DynamicFriction.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_EmptyLibraryUsesDefault.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_EmptyLibraryUsesDefault.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_EmptyLibraryUsesDefault.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_EmptyLibraryUsesDefault.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombine.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombine.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombine.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombine.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombinePriorityOrder.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombinePriorityOrder.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_FrictionCombinePriorityOrder.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombinePriorityOrder.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryChangesReflectInstantly.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryChangesReflectInstantly.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryChangesReflectInstantly.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryChangesReflectInstantly.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryClearingAssignsDefault.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryClearingAssignsDefault.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryClearingAssignsDefault.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryClearingAssignsDefault.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryUpdatedAcrossLevels.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryUpdatedAcrossLevels.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_LibraryUpdatedAcrossLevels.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryUpdatedAcrossLevels.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_NoEffectIfNoColliderShape.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_NoEffectIfNoColliderShape.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_NoEffectIfNoColliderShape.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_NoEffectIfNoColliderShape.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RagdollBones.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RagdollBones.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RagdollBones.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RagdollBones.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_Restitution.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_Restitution.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_Restitution.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_Restitution.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombine.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombine.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombine.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombine.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombinePriorityOrder.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombinePriorityOrder.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_RestitutionCombinePriorityOrder.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombinePriorityOrder.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_StaticFriction.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_StaticFriction.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Material_StaticFriction.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_StaticFriction.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/material/Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Physmaterial_Editor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/material/Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/material/Physmaterial_Editor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AddRigidBodyComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AddRigidBodyComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ComputingWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ComputingWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_ComputeInertiaWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_ComputeInertiaWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialAngularVelocity.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialAngularVelocity.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialLinearVelocity.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialLinearVelocity.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_KinematicModeWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_KinematicModeWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_KinematicModeWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_KinematicModeWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SetGravityWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SetGravityWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SetGravityWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SetGravityWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartAsleepWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartAsleepWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartAsleepWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartAsleepWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_CollisionEvents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_CollisionEvents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_OverlapNode.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_OverlapNode.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_OverlapNode.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_OverlapNode.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_ShapeCast.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_ShapeCast.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_ShapeCast.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_ShapeCast.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_TriggerEvents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_TriggerEvents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_AddPhysTerrainComponent.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_AddPhysTerrainComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_AddPhysTerrainComponent.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_AddPhysTerrainComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CollisionAgainstRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CollisionAgainstRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleResolutionsValid.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleResolutionsValid.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleResolutionsValid.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleResolutionsValid.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py b/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_TerrainTexturePainterWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py rename to AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_TerrainTexturePainterWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py b/AutomatedTesting/Gem/PythonTests/physics_/utils/FileManagement.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/utils/FileManagement.py rename to AutomatedTesting/Gem/PythonTests/physics_/utils/FileManagement.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Managed_Files.py b/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Managed_Files.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Managed_Files.py rename to AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Managed_Files.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Physmaterial_Editor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Physmaterial_Editor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Default.py b/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Default.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Default.py rename to AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Default.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Override.py b/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Override.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_PhysxConfig_Override.py rename to AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Override.py diff --git a/AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py b/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py rename to AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py From 5441ab4baca64c5b7dc7695dc0c2950fa71e0dd2 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza Date: Fri, 10 Sep 2021 14:29:17 +0200 Subject: [PATCH 230/355] Rename to final folder name --- .../Gem/PythonTests/{physics_ => Physics}/CMakeLists.txt | 0 .../PythonTests/{physics_ => Physics}/TestSuite_InDevelopment.py | 0 .../Gem/PythonTests/{physics_ => Physics}/TestSuite_Main.py | 0 .../PythonTests/{physics_ => Physics}/TestSuite_Main_Optimized.py | 0 .../Gem/PythonTests/{physics_ => Physics}/TestSuite_Periodic.py | 0 .../Gem/PythonTests/{physics_ => Physics}/TestSuite_Sandbox.py | 0 .../Gem/PythonTests/{physics_ => Physics}/TestSuite_Utils.py | 0 .../Gem/PythonTests/{physics_ => Physics}/__init__.py | 0 .../tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py | 0 .../tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py | 0 .../Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py | 0 .../tests/Physics_WorldBodyBusWorksOnEditorComponents.py | 0 .../character_controller/CharacterController_SwitchLevels.py | 0 .../tests/collider/Collider_AddColliderComponent.py | 0 .../tests/collider/Collider_AddingNewGroupWorks.py | 0 .../tests/collider/Collider_BoxShapeEditting.py | 0 .../tests/collider/Collider_CapsuleShapeEditting.py | 0 .../tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py | 0 .../tests/collider/Collider_ColliderPositionOffset.py | 0 .../tests/collider/Collider_ColliderRotationOffset.py | 0 .../tests/collider/Collider_CollisionGroupsWorkflow.py | 0 .../Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py | 0 .../tests/collider/Collider_MultipleSurfaceSlots.py | 0 .../collider/Collider_NoneCollisionGroupSameLayerNotCollide.py | 0 .../Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py | 0 ...Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py | 0 .../tests/collider/Collider_PxMeshConvexMeshCollides.py | 0 .../tests/collider/Collider_PxMeshErrorIfNoMesh.py | 0 .../collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py | 0 .../collider/Collider_SameCollisionGroupDiffLayersCollide.py | 0 .../collider/Collider_SameCollisionGroupSameCustomLayerCollide.py | 0 .../tests/collider/Collider_SameCollisionGroupSameLayerCollide.py | 0 .../tests/collider/Collider_SphereShapeEditting.py | 0 .../tests/collider/Collider_TriggerPassThrough.py | 0 .../tests/force_region/ForceRegion_CapsuleShapedForce.py | 0 .../force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py | 0 .../ForceRegion_HighValuesDirectionAxesWorkWithNoError.py | 0 .../tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py | 0 .../force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py | 0 .../force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py | 0 .../force_region/ForceRegion_LinearDampingForceOnRigidBodies.py | 0 .../force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py | 0 .../force_region/ForceRegion_MovingForceRegionChangesNetForce.py | 0 .../force_region/ForceRegion_MultipleComponentsCombineForces.py | 0 .../ForceRegion_MultipleForcesInSameComponentCombineForces.py | 0 .../force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py | 0 .../force_region/ForceRegion_ParentChildForcesCombineForces.py | 0 .../tests/force_region/ForceRegion_PointForceOnRigidBodies.py | 0 .../tests/force_region/ForceRegion_PositionOffset.py | 0 .../tests/force_region/ForceRegion_PxMeshShapedForce.py | 0 .../tests/force_region/ForceRegion_RotationalOffset.py | 0 .../force_region/ForceRegion_SimpleDragForceOnRigidBodies.py | 0 .../tests/force_region/ForceRegion_SliceFileInstantiates.py | 0 .../ForceRegion_SmallMagnitudeDeviationOnLargeForces.py | 0 .../tests/force_region/ForceRegion_SphereShapedForce.py | 0 .../tests/force_region/ForceRegion_SplineForceOnRigidBodies.py | 0 .../force_region/ForceRegion_SplineRegionWithModifiedTransform.py | 0 .../force_region/ForceRegion_WithNonTriggerColliderWarning.py | 0 .../force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py | 0 .../force_region/ForceRegion_ZeroLinearDampingDoesNothing.py | 0 .../force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py | 0 .../tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py | 0 .../force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py | 0 .../tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py | 0 .../force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py | 0 .../{physics_ => Physics}/tests/joints/JointsHelper.py | 0 .../tests/joints/Joints_Ball2BodiesConstrained.py | 0 .../{physics_ => Physics}/tests/joints/Joints_BallBreakable.py | 0 .../tests/joints/Joints_BallLeadFollowerCollide.py | 0 .../tests/joints/Joints_BallNoLimitsConstrained.py | 0 .../tests/joints/Joints_BallSoftLimitsConstrained.py | 0 .../tests/joints/Joints_Fixed2BodiesConstrained.py | 0 .../{physics_ => Physics}/tests/joints/Joints_FixedBreakable.py | 0 .../tests/joints/Joints_FixedLeadFollowerCollide.py | 0 .../tests/joints/Joints_GlobalFrameConstrained.py | 0 .../tests/joints/Joints_Hinge2BodiesConstrained.py | 0 .../{physics_ => Physics}/tests/joints/Joints_HingeBreakable.py | 0 .../tests/joints/Joints_HingeLeadFollowerCollide.py | 0 .../tests/joints/Joints_HingeNoLimitsConstrained.py | 0 .../tests/joints/Joints_HingeSoftLimitsConstrained.py | 0 .../{physics_ => Physics}/tests/material/AddModifyDelete_Utils.py | 0 .../tests/material/Material_CanBeAssignedToTerrain.py | 0 .../tests/material/Material_CharacterController.py | 0 .../tests/material/Material_ComponentsInSyncWithLibrary.py | 0 .../material/Material_DefaultLibraryConsistentOnAllFeatures.py | 0 .../material/Material_DefaultLibraryUpdatedAcrossLevels_after.py | 0 .../material/Material_DefaultLibraryUpdatedAcrossLevels_before.py | 0 .../tests/material/Material_DefaultMaterialLibraryChangesWork.py | 0 .../tests/material/Material_DynamicFriction.py | 0 .../tests/material/Material_EmptyLibraryUsesDefault.py | 0 .../tests/material/Material_FrictionCombine.py | 0 .../tests/material/Material_FrictionCombinePriorityOrder.py | 0 .../tests/material/Material_LibraryChangesReflectInstantly.py | 0 .../tests/material/Material_LibraryClearingAssignsDefault.py | 0 .../Material_LibraryCrudOperationsReflectOnCharacterController.py | 0 .../material/Material_LibraryCrudOperationsReflectOnCollider.py | 0 .../Material_LibraryCrudOperationsReflectOnRagdollBones.py | 0 .../material/Material_LibraryCrudOperationsReflectOnTerrain.py | 0 .../tests/material/Material_LibraryUpdatedAcrossLevels.py | 0 .../tests/material/Material_NoEffectIfNoColliderShape.py | 0 .../tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py | 0 .../{physics_ => Physics}/tests/material/Material_RagdollBones.py | 0 .../{physics_ => Physics}/tests/material/Material_Restitution.py | 0 .../tests/material/Material_RestitutionCombine.py | 0 .../tests/material/Material_RestitutionCombinePriorityOrder.py | 0 .../tests/material/Material_StaticFriction.py | 0 .../{physics_ => Physics}/tests/material/Physmaterial_Editor.py | 0 .../tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py | 0 .../tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py | 0 .../tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py | 0 .../tests/ragdoll/Ragdoll_WorldBodyBusWorks.py | 0 .../tests/rigid_body/RigidBody_AddRigidBodyComponent.py | 0 .../tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py | 0 .../tests/rigid_body/RigidBody_COM_ComputingWorks.py | 0 .../tests/rigid_body/RigidBody_COM_ManualSettingWorks.py | 0 .../tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py | 0 .../tests/rigid_body/RigidBody_ComputeInertiaWorks.py | 0 .../tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py | 0 .../RigidBody_EnablingGravityWorksUsingNotificationsPoC.py | 0 .../tests/rigid_body/RigidBody_InitialAngularVelocity.py | 0 .../tests/rigid_body/RigidBody_InitialLinearVelocity.py | 0 .../tests/rigid_body/RigidBody_KinematicModeWorks.py | 0 .../tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py | 0 .../tests/rigid_body/RigidBody_MassDifferentValuesWorks.py | 0 .../tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py | 0 .../tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py | 0 .../tests/rigid_body/RigidBody_SetGravityWorks.py | 0 .../tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py | 0 .../tests/rigid_body/RigidBody_StartAsleepWorks.py | 0 .../tests/rigid_body/RigidBody_StartGravityEnabledWorks.py | 0 .../tests/script_canvas/ScriptCanvas_CollisionEvents.py | 0 .../script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py | 0 ...iptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py | 0 .../tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py | 0 .../tests/script_canvas/ScriptCanvas_OverlapNode.py | 0 .../tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py | 0 .../tests/script_canvas/ScriptCanvas_PostUpdateEvent.py | 0 .../tests/script_canvas/ScriptCanvas_PreUpdateEvent.py | 0 .../script_canvas/ScriptCanvas_SetKinematicTargetTransform.py | 0 .../tests/script_canvas/ScriptCanvas_ShapeCast.py | 0 .../script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py | 0 .../tests/script_canvas/ScriptCanvas_TriggerEvents.py | 0 .../tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py | 0 .../tests/shape_collider/ShapeCollider_CylinderShapeCollides.py | 0 .../shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py | 0 .../ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py | 0 .../tests/terrain/Terrain_AddPhysTerrainComponent.py | 0 .../tests/terrain/Terrain_CanAddMultipleTerrainComponents.py | 0 .../tests/terrain/Terrain_CollisionAgainstRigidBody.py | 0 .../tests/terrain/Terrain_MultipleResolutionsValid.py | 0 .../tests/terrain/Terrain_MultipleTerrainComponentsWarning.py | 0 .../tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py | 0 .../tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py | 0 .../tests/terrain/Terrain_TerrainTexturePainterWorks.py | 0 .../Gem/PythonTests/{physics_ => Physics}/utils/FileManagement.py | 0 .../{physics_ => Physics}/utils/UtilTest_Managed_Files.py | 0 .../{physics_ => Physics}/utils/UtilTest_Physmaterial_Editor.py | 0 .../{physics_ => Physics}/utils/UtilTest_PhysxConfig_Default.py | 0 .../{physics_ => Physics}/utils/UtilTest_PhysxConfig_Override.py | 0 .../utils/UtilTest_Tracer_PicksErrorsAndWarnings.py | 0 160 files changed, 0 insertions(+), 0 deletions(-) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/CMakeLists.txt (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/TestSuite_InDevelopment.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/TestSuite_Main.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/TestSuite_Main_Optimized.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/TestSuite_Periodic.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/TestSuite_Sandbox.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/TestSuite_Utils.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/__init__.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/Physics_WorldBodyBusWorksOnEditorComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/character_controller/CharacterController_SwitchLevels.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_AddColliderComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_AddingNewGroupWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_BoxShapeEditting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_CapsuleShapeEditting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_ColliderPositionOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_ColliderRotationOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_CollisionGroupsWorkflow.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_MultipleSurfaceSlots.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_PxMeshConvexMeshCollides.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_PxMeshErrorIfNoMesh.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_SphereShapeEditting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/collider/Collider_TriggerPassThrough.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_CapsuleShapedForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_PointForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_PositionOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_PxMeshShapedForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_RotationalOffset.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_SliceFileInstantiates.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_SphereShapedForce.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/JointsHelper.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_Ball2BodiesConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_BallBreakable.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_BallLeadFollowerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_BallNoLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_BallSoftLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_Fixed2BodiesConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_FixedBreakable.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_FixedLeadFollowerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_GlobalFrameConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_Hinge2BodiesConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_HingeBreakable.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_HingeLeadFollowerCollide.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_HingeNoLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/joints/Joints_HingeSoftLimitsConstrained.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/AddModifyDelete_Utils.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_CanBeAssignedToTerrain.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_CharacterController.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_ComponentsInSyncWithLibrary.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_DefaultMaterialLibraryChangesWork.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_DynamicFriction.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_EmptyLibraryUsesDefault.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_FrictionCombine.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_FrictionCombinePriorityOrder.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryChangesReflectInstantly.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryClearingAssignsDefault.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_LibraryUpdatedAcrossLevels.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_NoEffectIfNoColliderShape.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_RagdollBones.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_Restitution.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_RestitutionCombine.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_RestitutionCombinePriorityOrder.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Material_StaticFriction.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/material/Physmaterial_Editor.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_AddRigidBodyComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_COM_ComputingWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_ComputeInertiaWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_InitialAngularVelocity.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_InitialLinearVelocity.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_KinematicModeWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_SetGravityWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_StartAsleepWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_CollisionEvents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_OverlapNode.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_ShapeCast.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/script_canvas/ScriptCanvas_TriggerEvents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_AddPhysTerrainComponent.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_CollisionAgainstRigidBody.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_MultipleResolutionsValid.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/tests/terrain/Terrain_TerrainTexturePainterWorks.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/utils/FileManagement.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/utils/UtilTest_Managed_Files.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/utils/UtilTest_Physmaterial_Editor.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/utils/UtilTest_PhysxConfig_Default.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/utils/UtilTest_PhysxConfig_Override.py (100%) rename AutomatedTesting/Gem/PythonTests/{physics_ => Physics}/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py (100%) diff --git a/AutomatedTesting/Gem/PythonTests/physics_/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/Physics/CMakeLists.txt similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/CMakeLists.txt rename to AutomatedTesting/Gem/PythonTests/Physics/CMakeLists.txt diff --git a/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_InDevelopment.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_InDevelopment.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/TestSuite_InDevelopment.py rename to AutomatedTesting/Gem/PythonTests/Physics/TestSuite_InDevelopment.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main.py rename to AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main_Optimized.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main_Optimized.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Main_Optimized.py rename to AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Main_Optimized.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Periodic.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Periodic.py rename to AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Periodic.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Sandbox.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Sandbox.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Sandbox.py rename to AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Sandbox.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Utils.py b/AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Utils.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/TestSuite_Utils.py rename to AutomatedTesting/Gem/PythonTests/Physics/TestSuite_Utils.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/__init__.py b/AutomatedTesting/Gem/PythonTests/Physics/__init__.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/__init__.py rename to AutomatedTesting/Gem/PythonTests/Physics/__init__.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_DynamicSliceWithPhysNotSpawnsStaticSlice.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_UndoRedoWorksOnEntityWithPhysComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_VerifyColliderRigidBodyMeshAndTerrainWorkTogether.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_WorldBodyBusWorksOnEditorComponents.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/Physics_WorldBodyBusWorksOnEditorComponents.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/Physics_WorldBodyBusWorksOnEditorComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/character_controller/CharacterController_SwitchLevels.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/character_controller/CharacterController_SwitchLevels.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/character_controller/CharacterController_SwitchLevels.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/character_controller/CharacterController_SwitchLevels.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddColliderComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_AddColliderComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddColliderComponent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_AddColliderComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddingNewGroupWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_AddingNewGroupWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_AddingNewGroupWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_AddingNewGroupWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_BoxShapeEditting.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_BoxShapeEditting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_BoxShapeEditting.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_BoxShapeEditting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CapsuleShapeEditting.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CapsuleShapeEditting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CapsuleShapeEditting.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CapsuleShapeEditting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CheckDefaultShapeSettingIsPxMesh.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderPositionOffset.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_ColliderPositionOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderPositionOffset.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_ColliderPositionOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderRotationOffset.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_ColliderRotationOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_ColliderRotationOffset.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_ColliderRotationOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CollisionGroupsWorkflow.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CollisionGroupsWorkflow.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_CollisionGroupsWorkflow.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_CollisionGroupsWorkflow.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_DiffCollisionGroupDiffCollidingLayersNotCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_MultipleSurfaceSlots.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_MultipleSurfaceSlots.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_MultipleSurfaceSlots.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_MultipleSurfaceSlots.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_NoneCollisionGroupSameLayerNotCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenAddingRenderMeshComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshAutoAssignedWhenModifyingRenderMeshComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshConvexMeshCollides.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshConvexMeshCollides.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshConvexMeshCollides.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshConvexMeshCollides.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshErrorIfNoMesh.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshErrorIfNoMesh.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshErrorIfNoMesh.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_PxMeshNotAutoAssignedWhenNoPhysicsFbx.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SameCollisionGroupDiffLayersCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SameCollisionGroupSameCustomLayerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SameCollisionGroupSameLayerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SphereShapeEditting.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SphereShapeEditting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_SphereShapeEditting.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_SphereShapeEditting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_TriggerPassThrough.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_TriggerPassThrough.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/collider/Collider_TriggerPassThrough.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/collider/Collider_TriggerPassThrough.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_CapsuleShapedForce.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_CapsuleShapedForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_CapsuleShapedForce.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_CapsuleShapedForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_DirectionHasNoAffectOnTotalForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_HighValuesDirectionAxesWorkWithNoError.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ImpulsesBoxShapedRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ImpulsesCapsuleShapedRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ImpulsesPxMeshShapedRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LinearDampingForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_LocalSpaceForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_MovingForceRegionChangesNetForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_MultipleComponentsCombineForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_MultipleForcesInSameComponentCombineForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_NoQuiverOnHighLinearDampingForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ParentChildForcesCombineForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PointForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PointForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_PointForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PositionOffset.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_PositionOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PositionOffset.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_PositionOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PxMeshShapedForce.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_PxMeshShapedForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_PxMeshShapedForce.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_PxMeshShapedForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_RotationalOffset.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_RotationalOffset.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_RotationalOffset.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_RotationalOffset.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SimpleDragForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SliceFileInstantiates.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SliceFileInstantiates.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SliceFileInstantiates.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SliceFileInstantiates.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SmallMagnitudeDeviationOnLargeForces.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SphereShapedForce.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SphereShapedForce.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SphereShapedForce.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SphereShapedForce.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SplineForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_SplineRegionWithModifiedTransform.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WithNonTriggerColliderWarning.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_WorldSpaceForceOnRigidBodies.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroLinearDampingDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroLocalSpaceForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroPointForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroSimpleDragForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroSplineForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/force_region/ForceRegion_ZeroWorldSpaceForceDoesNothing.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/JointsHelper.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/JointsHelper.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/JointsHelper.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/JointsHelper.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Ball2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_Ball2BodiesConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Ball2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_Ball2BodiesConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallBreakable.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallBreakable.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallBreakable.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallBreakable.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallLeadFollowerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallLeadFollowerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallNoLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallNoLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallSoftLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_BallSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_BallSoftLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Fixed2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_Fixed2BodiesConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Fixed2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_Fixed2BodiesConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedBreakable.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_FixedBreakable.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedBreakable.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_FixedBreakable.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_FixedLeadFollowerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_FixedLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_FixedLeadFollowerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_GlobalFrameConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_GlobalFrameConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_GlobalFrameConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_GlobalFrameConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Hinge2BodiesConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_Hinge2BodiesConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_Hinge2BodiesConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_Hinge2BodiesConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeBreakable.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeBreakable.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeBreakable.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeBreakable.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeLeadFollowerCollide.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeLeadFollowerCollide.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeLeadFollowerCollide.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeLeadFollowerCollide.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeNoLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeNoLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeNoLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeNoLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeSoftLimitsConstrained.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeSoftLimitsConstrained.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/joints/Joints_HingeSoftLimitsConstrained.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/joints/Joints_HingeSoftLimitsConstrained.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/AddModifyDelete_Utils.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/AddModifyDelete_Utils.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/AddModifyDelete_Utils.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/AddModifyDelete_Utils.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CanBeAssignedToTerrain.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_CanBeAssignedToTerrain.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CanBeAssignedToTerrain.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_CanBeAssignedToTerrain.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CharacterController.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_CharacterController.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_CharacterController.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_CharacterController.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_ComponentsInSyncWithLibrary.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_ComponentsInSyncWithLibrary.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_ComponentsInSyncWithLibrary.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_ComponentsInSyncWithLibrary.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultLibraryConsistentOnAllFeatures.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_after.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultLibraryUpdatedAcrossLevels_before.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultMaterialLibraryChangesWork.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DefaultMaterialLibraryChangesWork.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DefaultMaterialLibraryChangesWork.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DynamicFriction.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DynamicFriction.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_DynamicFriction.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_DynamicFriction.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_EmptyLibraryUsesDefault.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_EmptyLibraryUsesDefault.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_EmptyLibraryUsesDefault.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_EmptyLibraryUsesDefault.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombine.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_FrictionCombine.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombine.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_FrictionCombine.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombinePriorityOrder.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_FrictionCombinePriorityOrder.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_FrictionCombinePriorityOrder.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_FrictionCombinePriorityOrder.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryChangesReflectInstantly.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryChangesReflectInstantly.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryChangesReflectInstantly.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryChangesReflectInstantly.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryClearingAssignsDefault.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryClearingAssignsDefault.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryClearingAssignsDefault.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryClearingAssignsDefault.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnCharacterController.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnCollider.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnRagdollBones.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryCrudOperationsReflectOnTerrain.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryUpdatedAcrossLevels.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryUpdatedAcrossLevels.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_LibraryUpdatedAcrossLevels.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_LibraryUpdatedAcrossLevels.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_NoEffectIfNoColliderShape.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_NoEffectIfNoColliderShape.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_NoEffectIfNoColliderShape.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_NoEffectIfNoColliderShape.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_PerFaceMaterialGetsCorrectMaterial.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RagdollBones.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_RagdollBones.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RagdollBones.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_RagdollBones.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_Restitution.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_Restitution.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_Restitution.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_Restitution.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombine.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_RestitutionCombine.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombine.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_RestitutionCombine.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombinePriorityOrder.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_RestitutionCombinePriorityOrder.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_RestitutionCombinePriorityOrder.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_RestitutionCombinePriorityOrder.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_StaticFriction.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_StaticFriction.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Material_StaticFriction.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Material_StaticFriction.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/material/Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/material/Physmaterial_Editor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/material/Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/material/Physmaterial_Editor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_AddPhysxRagdollComponentWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_LevelSwitchDoesNotCrash.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_OldRagdollSerializationNoErrors.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/ragdoll/Ragdoll_WorldBodyBusWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AddRigidBodyComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AddRigidBodyComponent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_AddRigidBodyComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_AngularDampingAffectsRotation.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ComputingWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ComputingWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_COM_ComputingWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_COM_ManualSettingWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_COM_NotIncludesTriggerShapes.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_ComputeInertiaWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_ComputeInertiaWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_ComputeInertiaWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_EnablingGravityWorksPoC.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_EnablingGravityWorksUsingNotificationsPoC.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialAngularVelocity.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialAngularVelocity.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_InitialAngularVelocity.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialLinearVelocity.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_InitialLinearVelocity.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_InitialLinearVelocity.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_KinematicModeWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_KinematicModeWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_KinematicModeWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_KinematicModeWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_LinearDampingAffectsMotion.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_MassDifferentValuesWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_MaxAngularVelocityWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_MomentOfInertiaManualSetting.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SetGravityWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_SetGravityWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SetGravityWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_SetGravityWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_SleepWhenBelowKineticThreshold.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartAsleepWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_StartAsleepWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartAsleepWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_StartAsleepWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/rigid_body/RigidBody_StartGravityEnabledWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_CollisionEvents.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_CollisionEvents.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_CollisionEvents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsName.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_GetCollisionNameReturnsNothingWhenHasToggledLayer.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_MultipleRaycastNode.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_OverlapNode.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_OverlapNode.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_OverlapNode.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_OverlapNode.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_PostPhysicsUpdate.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_PostUpdateEvent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_PreUpdateEvent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_SetKinematicTargetTransform.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_ShapeCast.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_ShapeCast.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_ShapeCast.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_ShapeCast.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_SpawnEntityWithPhysComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_TriggerEvents.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/script_canvas/ScriptCanvas_TriggerEvents.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/script_canvas/ScriptCanvas_TriggerEvents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CanBeAddedWitNoWarnings.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_CylinderShapeCollides.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_InactiveWhenNoShapeComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/shape_collider/ShapeCollider_LargeNumberOfShapeCollidersWontCrashEditor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_AddPhysTerrainComponent.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_AddPhysTerrainComponent.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_AddPhysTerrainComponent.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_AddPhysTerrainComponent.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_CanAddMultipleTerrainComponents.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CollisionAgainstRigidBody.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_CollisionAgainstRigidBody.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_CollisionAgainstRigidBody.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleResolutionsValid.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_MultipleResolutionsValid.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleResolutionsValid.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_MultipleResolutionsValid.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_MultipleTerrainComponentsWarning.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_NoPhysTerrainComponentNoCollision.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_SpawnSecondTerrainComponentWarning.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_TerrainTexturePainterWorks.py b/AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/tests/terrain/Terrain_TerrainTexturePainterWorks.py rename to AutomatedTesting/Gem/PythonTests/Physics/tests/terrain/Terrain_TerrainTexturePainterWorks.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/utils/FileManagement.py b/AutomatedTesting/Gem/PythonTests/Physics/utils/FileManagement.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/utils/FileManagement.py rename to AutomatedTesting/Gem/PythonTests/Physics/utils/FileManagement.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Managed_Files.py b/AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_Managed_Files.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Managed_Files.py rename to AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_Managed_Files.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Physmaterial_Editor.py b/AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_Physmaterial_Editor.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Physmaterial_Editor.py rename to AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_Physmaterial_Editor.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Default.py b/AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_PhysxConfig_Default.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Default.py rename to AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_PhysxConfig_Default.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Override.py b/AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_PhysxConfig_Override.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_PhysxConfig_Override.py rename to AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_PhysxConfig_Override.py diff --git a/AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py b/AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py similarity index 100% rename from AutomatedTesting/Gem/PythonTests/physics_/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py rename to AutomatedTesting/Gem/PythonTests/Physics/utils/UtilTest_Tracer_PicksErrorsAndWarnings.py From 78d0b46f08645c10b8aa92d347e4881bf298dd22 Mon Sep 17 00:00:00 2001 From: AMZN-AlexOteiza Date: Fri, 10 Sep 2021 14:37:45 +0200 Subject: [PATCH 231/355] Updated path in CMakeLists.txt Signed-off-by: AMZN-AlexOteiza --- AutomatedTesting/Gem/PythonTests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt index a54229f6ba..7fd3b3a241 100644 --- a/AutomatedTesting/Gem/PythonTests/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/CMakeLists.txt @@ -21,7 +21,7 @@ add_subdirectory(assetpipeline) add_subdirectory(atom_renderer) ## Physics ## -add_subdirectory(physics) +add_subdirectory(Physics) ## ScriptCanvas ## add_subdirectory(scripting) From 0505f200e55e67175aabced45bc18bd8c170ba07 Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Fri, 10 Sep 2021 09:11:06 -0500 Subject: [PATCH 232/355] Remove extra/bad profile markers (#4031) Many of these are just extra noise in the profile, but the one in Archive.cpp could also cause PIX to crash. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> --- .../Framework/AzFramework/AzFramework/Archive/Archive.cpp | 3 --- .../Visibility/EntityVisibilityBoundsUnionSystem.cpp | 8 -------- .../ViewportSelection/EditorVisibleEntityDataCache.cpp | 2 -- .../Common/Code/Source/Mesh/MeshFeatureProcessor.cpp | 7 ------- Gems/Atom/RHI/Code/Source/RHI/FrameScheduler.cpp | 1 - Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp | 2 -- Gems/Atom/RPI/Code/Source/RPI.Public/MeshDrawPacket.cpp | 4 ---- Gems/Atom/RPI/Code/Source/RPI.Public/Model/ModelLod.cpp | 4 ---- Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp | 2 -- Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp | 4 ---- .../Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAsset.cpp | 2 -- .../RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp | 4 ---- .../Source/RPI.Reflect/Shader/ShaderVariantTreeAsset.cpp | 2 -- .../Code/Source/SurfaceData/SurfaceDataMeshComponent.cpp | 2 -- .../Source/Components/SurfaceDataColliderComponent.cpp | 2 -- .../Code/Source/SurfaceDataSystemComponent.cpp | 2 -- 16 files changed, 51 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp index ce0cc23a4e..e125cc1df6 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp @@ -689,9 +689,6 @@ namespace AZ::IO return AZ::IO::InvalidHandle; } - AZ_PROFILE_SCOPE(Game, "File: %.*s Archive: %p", - aznumeric_cast(pName.size()), pName.data(), this); - SAutoCollectFileAccessTime accessTime(this); AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; diff --git a/Code/Framework/AzFramework/AzFramework/Visibility/EntityVisibilityBoundsUnionSystem.cpp b/Code/Framework/AzFramework/AzFramework/Visibility/EntityVisibilityBoundsUnionSystem.cpp index 4a6b29b95c..826570fee5 100644 --- a/Code/Framework/AzFramework/AzFramework/Visibility/EntityVisibilityBoundsUnionSystem.cpp +++ b/Code/Framework/AzFramework/AzFramework/Visibility/EntityVisibilityBoundsUnionSystem.cpp @@ -45,8 +45,6 @@ namespace AzFramework void EntityVisibilityBoundsUnionSystem::OnEntityActivated(AZ::Entity* entity) { - AZ_PROFILE_FUNCTION(AzFramework); - // ignore any entity that might activate which does not have a TransformComponent if (entity->GetTransform() == nullptr) { @@ -68,8 +66,6 @@ namespace AzFramework void EntityVisibilityBoundsUnionSystem::OnEntityDeactivated(AZ::Entity* entity) { - AZ_PROFILE_FUNCTION(AzFramework); - // ignore any entity that might deactivate which does not have a TransformComponent if (entity->GetTransform() == nullptr) { @@ -89,8 +85,6 @@ namespace AzFramework void EntityVisibilityBoundsUnionSystem::UpdateVisibilitySystem(AZ::Entity* entity, EntityVisibilityBoundsUnionInstance& instance) { - AZ_PROFILE_FUNCTION(AzFramework); - if (const auto& localEntityBoundsUnions = instance.m_localEntityBoundsUnion; localEntityBoundsUnions.IsValid()) { // note: worldEntityBounds will not be a 'tight-fit' Aabb but that of a transformed local aabb @@ -155,8 +149,6 @@ namespace AzFramework void EntityVisibilityBoundsUnionSystem::OnTransformUpdated(AZ::Entity* entity) { - AZ_PROFILE_FUNCTION(AzFramework); - // update the world transform of the visibility bounds union if (auto instance_it = m_entityVisibilityBoundsUnionInstanceMapping.find(entity); instance_it != m_entityVisibilityBoundsUnionInstanceMapping.end()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp index 5da827244f..babc6f972c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorVisibleEntityDataCache.cpp @@ -312,8 +312,6 @@ namespace AzToolsFramework void EditorVisibleEntityDataCache::OnTransformChanged(const AZ::Transform& /*local*/, const AZ::Transform& world) { - AZ_PROFILE_FUNCTION(AzToolsFramework); - const AZ::EntityId entityId = *AZ::TransformNotificationBus::GetCurrentBusId(); if (AZStd::optional entityIndex = GetVisibleEntityIndexFromId(entityId)) diff --git a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp index 67702a8176..8ab324cdf7 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Mesh/MeshFeatureProcessor.cpp @@ -479,8 +479,6 @@ namespace AZ : m_modelAsset(modelAsset) , m_parent(parent) { - AZ_PROFILE_FUNCTION(AzRender); - if (!m_modelAsset.GetId().IsValid()) { AZ_Error("MeshDataInstance::MeshLoader", false, "Invalid model asset Id."); @@ -508,7 +506,6 @@ namespace AZ //! AssetBus::Handler overrides... void MeshDataInstance::MeshLoader::OnAssetReady(Data::Asset asset) { - AZ_PROFILE_FUNCTION(AzRender); Data::Asset modelAsset = asset; // Assign the fully loaded asset back to the mesh handle to not only hold asset id, but the actual data as well. @@ -580,8 +577,6 @@ namespace AZ void MeshDataInstance::Init(Data::Instance model) { - AZ_PROFILE_FUNCTION(AzRender); - m_model = model; const size_t modelLodCount = m_model->GetLodCount(); m_drawPacketListsByLod.resize(modelLodCount); @@ -612,8 +607,6 @@ namespace AZ void MeshDataInstance::BuildDrawPacketList(size_t modelLodIndex) { - AZ_PROFILE_FUNCTION(AzRender); - RPI::ModelLod& modelLod = *m_model->GetLods()[modelLodIndex]; const size_t meshCount = modelLod.GetMeshes().size(); diff --git a/Gems/Atom/RHI/Code/Source/RHI/FrameScheduler.cpp b/Gems/Atom/RHI/Code/Source/RHI/FrameScheduler.cpp index 0b8c6ad9ce..fe69f56856 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/FrameScheduler.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/FrameScheduler.cpp @@ -417,7 +417,6 @@ namespace AZ void FrameScheduler::ExecuteContextInternal(FrameGraphExecuteGroup& group, uint32_t index) { - AZ_PROFILE_FUNCTION(RHI); FrameGraphExecuteContext* executeContext = group.BeginContext(index); { diff --git a/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp b/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp index a2a2736106..6e98456933 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/PipelineStateCache.cpp @@ -278,8 +278,6 @@ namespace AZ const PipelineState* PipelineStateCache::AcquirePipelineState(PipelineLibraryHandle handle, const PipelineStateDescriptor& descriptor) { - AZ_PROFILE_FUNCTION(RHI); - if (handle.IsNull()) { return nullptr; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/MeshDrawPacket.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/MeshDrawPacket.cpp index 0e4c8ec15a..49b093d4be 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/MeshDrawPacket.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/MeshDrawPacket.cpp @@ -124,7 +124,6 @@ namespace AZ bool MeshDrawPacket::DoUpdate(const Scene& parentScene) { - AZ_PROFILE_FUNCTION(RPI); const ModelLod::Mesh& mesh = m_modelLod->GetMeshes()[m_modelLodMeshIndex]; if (!m_material) @@ -155,8 +154,6 @@ namespace AZ auto appendShader = [&](const ShaderCollection::Item& shaderItem) { - AZ_PROFILE_SCOPE(RPI, "appendShader()"); - // Skip the shader item without creating the shader instance // if the mesh is not going to be rendered based on the draw tag RHI::RHISystemInterface* rhiSystem = RHI::RHISystemInterface::Get(); @@ -256,7 +253,6 @@ namespace AZ Data::Instance drawSrg; if (drawSrgLayout) { - AZ_PROFILE_SCOPE(RPI, "create drawSrg"); // If the DrawSrg exists we must create and bind it, otherwise the CommandList will fail validation for SRG being null drawSrg = RPI::ShaderResourceGroup::Create(shader->GetAsset(), shader->GetSupervariantIndex(), drawSrgLayout->GetName()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Model/ModelLod.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Model/ModelLod.cpp index 04fa004228..7850aa6da2 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Model/ModelLod.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Model/ModelLod.cpp @@ -264,8 +264,6 @@ namespace AZ const MaterialModelUvOverrideMap& materialModelUvMap, const MaterialUvNameMap& materialUvNameMap) const { - AZ_PROFILE_FUNCTION(RPI); - streamBufferViewsOut.clear(); RHI::InputStreamLayoutBuilder layoutBuilder; @@ -366,8 +364,6 @@ namespace AZ const MaterialModelUvOverrideMap& materialModelUvMap, const MaterialUvNameMap& materialUvNameMap) const { - AZ_PROFILE_FUNCTION(RPI); - const Mesh& mesh = m_meshes[meshIndex]; auto defaultUv = FindDefaultUvStream(meshIndex, materialUvNameMap); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp index 51cbc82f2b..4c923d4a1a 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/RasterPass.cpp @@ -230,8 +230,6 @@ namespace AZ void RasterPass::BuildCommandListInternal(const RHI::FrameGraphExecuteContext& context) { - AZ_PROFILE_FUNCTION(RPI); - RHI::CommandList* commandList = context.GetCommandList(); const RHI::DrawListView drawListViewPartition = RHI::GetDrawListPartition(m_drawListView, context.GetCommandListIndex(), context.GetCommandListCount()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp index e602e3e91b..51dd9c36d3 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Shader/Shader.cpp @@ -299,7 +299,6 @@ namespace AZ const ShaderVariant& Shader::GetVariant(const ShaderVariantId& shaderVariantId) { - AZ_PROFILE_FUNCTION(RPI); Data::Asset shaderVariantAsset = m_asset->GetVariant(shaderVariantId, m_supervariantIndex); if (!shaderVariantAsset || shaderVariantAsset->IsRootVariant()) { @@ -316,15 +315,12 @@ namespace AZ ShaderVariantSearchResult Shader::FindVariantStableId(const ShaderVariantId& shaderVariantId) const { - AZ_PROFILE_FUNCTION(RPI); ShaderVariantSearchResult variantSearchResult = m_asset->FindVariantStableId(shaderVariantId); return variantSearchResult; } const ShaderVariant& Shader::GetVariant(ShaderVariantStableId shaderVariantStableId) { - AZ_PROFILE_FUNCTION(RPI); - if (!shaderVariantStableId.IsValid() || shaderVariantStableId == ShaderAsset::RootShaderVariantStableId) { return m_rootVariant; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAsset.cpp index 8230c57e15..8e2d1bdd7e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Model/ModelAsset.cpp @@ -96,8 +96,6 @@ namespace AZ const AZ::Vector3& rayStart, const AZ::Vector3& rayDir, bool allowBruteForce, float& distanceNormalized, AZ::Vector3& normal) const { - AZ_PROFILE_FUNCTION(RPI); - if (!m_modelTriangleCount) { // [GFX TODO][ATOM-4343 Bake mesh spatial information during AP processing] diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp index 616aa44299..49ef457311 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderAsset.cpp @@ -172,8 +172,6 @@ namespace AZ Data::Asset ShaderAsset::GetVariant( const ShaderVariantId& shaderVariantId, SupervariantIndex supervariantIndex) { - AZ_PROFILE_FUNCTION(RPI); - auto variantFinder = AZ::Interface::Get(); AZ_Assert(variantFinder, "The IShaderVariantFinder doesn't exist"); @@ -189,8 +187,6 @@ namespace AZ ShaderVariantSearchResult ShaderAsset::FindVariantStableId(const ShaderVariantId& shaderVariantId) { - AZ_PROFILE_FUNCTION(RPI); - uint32_t dynamicOptionCount = aznumeric_cast(GetShaderOptionGroupLayout()->GetShaderOptions().size()); ShaderVariantSearchResult variantSearchResult{RootShaderVariantStableId, dynamicOptionCount }; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantTreeAsset.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantTreeAsset.cpp index f17a144adb..4565e3ce25 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantTreeAsset.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Shader/ShaderVariantTreeAsset.cpp @@ -72,8 +72,6 @@ namespace AZ ShaderVariantSearchResult ShaderVariantTreeAsset::FindVariantStableId(const ShaderOptionGroupLayout* shaderOptionGroupLayout, const ShaderVariantId& shaderVariantId) const { - AZ_PROFILE_FUNCTION(RPI); - struct NodeToVisit { uint32_t m_branchCount; // Number of static branches diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SurfaceData/SurfaceDataMeshComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SurfaceData/SurfaceDataMeshComponent.cpp index be4d5186c8..cbb30e6cd8 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SurfaceData/SurfaceDataMeshComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SurfaceData/SurfaceDataMeshComponent.cpp @@ -147,8 +147,6 @@ namespace SurfaceData bool SurfaceDataMeshComponent::DoRayTrace(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, AZ::Vector3& outNormal) const { - AZ_PROFILE_FUNCTION(Entity); - AZStd::lock_guard lock(m_cacheMutex); // test AABB as first pass to claim the point diff --git a/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp b/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp index eef9179194..31bf4e7028 100644 --- a/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp +++ b/Gems/SurfaceData/Code/Source/Components/SurfaceDataColliderComponent.cpp @@ -184,8 +184,6 @@ namespace SurfaceData bool SurfaceDataColliderComponent::DoRayTrace(const AZ::Vector3& inPosition, bool queryPointOnly, AZ::Vector3& outPosition, AZ::Vector3& outNormal) const { - AZ_PROFILE_FUNCTION(Entity); - AZStd::lock_guard lock(m_cacheMutex); // test AABB as first pass to claim the point diff --git a/Gems/SurfaceData/Code/Source/SurfaceDataSystemComponent.cpp b/Gems/SurfaceData/Code/Source/SurfaceDataSystemComponent.cpp index 7638b6720e..9038d2f082 100644 --- a/Gems/SurfaceData/Code/Source/SurfaceDataSystemComponent.cpp +++ b/Gems/SurfaceData/Code/Source/SurfaceDataSystemComponent.cpp @@ -229,8 +229,6 @@ namespace SurfaceData void SurfaceDataSystemComponent::GetSurfacePointsFromRegion(const AZ::Aabb& inRegion, const AZ::Vector2 stepSize, const SurfaceTagVector& desiredTags, SurfacePointListPerPosition& surfacePointListPerPosition) const { - AZ_PROFILE_FUNCTION(Entity); - AZStd::lock_guard registrationLock(m_registrationMutex); surfacePointListPerPosition.clear(); From e638f27572841755335e335ecca03ce4c6da23d7 Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Fri, 10 Sep 2021 10:02:17 -0500 Subject: [PATCH 233/355] Fixed PathView `MakeRelativeTo` and `Append` functions path segment comparisons (#3628) * Fixed PathView `MakeRelativeTo` and `Append` functions path segment comparisons when using the Windows path separator of '\' The PathSegment comparisons were case-sensitive in both those functions and now use `Internal::ComparePathSegments` function to perform the appropriate case comparison based on the path separator value of the Path class Reverted the LocalFileIO::CheckInvalidWrite function back to not lowercasing the assets alias and input path before invoking `PathView::IsRelativeTo` Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Simplified the LocalFileIO::ConvertToAliasBuffer logic Fix for the ArchiveTest `IResourceList_Add_AbsolutePath_RemovesAndReplacesWithAlias` and `TestArchiveViaFileIO` test Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Added a PathIterable structure stores a non-heap container of normalized path segments of an input path. Moved the PathParser logic to a PathParser.inl file Removed dependency of the PathView::IsRelativeTo logic on FixedMaxPath There is no longer a 1024 character limit when determining if a path is relative to a base Added a GetNormalPathParts and AppendNormalPathParts to function and removed LexicallyNormalInplace to share the logic for creating a normalized path between IsRelativeTo and LexicallyNormal Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Clang PathIterable.inl build fix Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed Normalize and Relative Path functions initialize the result paths With the correct path separator for the paths being transformed Ported over the Custom Path Root Separator logic to the PathParser.inl Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated he Shader Preprocessor include path gather. It now uses AZ::IO::Path for the path operations and checks if the path exist before adding it to the list of include paths. Finally the set logic has been removed for a simpler find_if check to see if the include path already since in the project include paths This fixes the Asset Processing issues with shader includes due to the Path.inl changes Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed tail recursion call to AppendNormalPathParts to supply a PathView with the same path separator as the parent call Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Adding reference qualifier overloads to the Path class Native function Removed the conversion operators from the Path class for converting to a string_type&/const string_type& Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- Code/Framework/AzCore/AzCore/IO/Path/Path.h | 25 +- Code/Framework/AzCore/AzCore/IO/Path/Path.inl | 908 +++--------------- .../AzCore/AzCore/IO/Path/PathIterable.inl | 162 ++++ .../AzCore/AzCore/IO/Path/PathParser.inl | 706 ++++++++++++++ .../AzCore/AzCore/azcore_files.cmake | 2 + .../AzCore/Tests/IO/Path/PathTests.cpp | 22 +- .../AzFramework/Archive/Archive.cpp | 6 +- .../AzFramework/AzFramework/Archive/Archive.h | 2 +- .../AzFramework/Archive/IArchive.h | 2 +- .../AzFramework/IO/LocalFileIO.cpp | 31 +- .../AzFramework/Tests/ArchiveTests.cpp | 13 +- Code/Legacy/CryCommon/Mocks/ICryPakMock.h | 2 +- .../Editor/CommonFiles/Preprocessor.cpp | 132 ++- 13 files changed, 1132 insertions(+), 881 deletions(-) create mode 100644 Code/Framework/AzCore/AzCore/IO/Path/PathIterable.inl create mode 100644 Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.h b/Code/Framework/AzCore/AzCore/IO/Path/Path.h index 36640e821d..c0c4b1c974 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.h +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.h @@ -256,8 +256,22 @@ namespace AZ::IO template static constexpr void MakeRelativeTo(PathResultType& pathResult, const AZ::IO::PathView& path, const AZ::IO::PathView& base); - template - static constexpr void LexicallyNormalInplace(PathResultType& pathResult, const AZ::IO::PathView& path); + + struct PathIterable; + //! Returns a structure that provides a view of the path parts which can be used for iteration + //! Only the path parts that correspond to creating an normalized path is returned + //! This function is useful for returning a "view" into a normalized path without the need + //! to allocate memory for the heap + static constexpr PathIterable GetNormalPathParts(const AZ::IO::PathView& path) noexcept; + // joins the input path to the Path Iterable structure using similiar logic to Path::Append + // If the input path is absolute it will replace the current PathIterable otherwise + // the input path will be appended to the Path Iterable structure + // For example a PathIterable with parts = ['C:', '/', 'foo'] + // If the path input = 'bar', then the new PathIterable parts = [C:', '/', 'foo', 'bar'] + // If the path input = 'C:/bar', then the new PathIterable parts = [C:', '/', 'bar'] + // If the path input = 'C:bar', then the new PathIterable parts = [C:', '/', 'foo', 'bar' ] + // If the path input = 'D:bar', then the new PathIterable parts = [D:, 'bar' ] + static constexpr void AppendNormalPathParts(PathIterable& pathIterableResult, const AZ::IO::PathView& path) noexcept; constexpr int compare_string_view(AZStd::string_view other) const; constexpr AZStd::string_view root_name_view() const; @@ -442,14 +456,15 @@ namespace AZ::IO constexpr void swap(BasicPath& rhs) noexcept; // native format observers - constexpr const string_type& Native() const noexcept; + constexpr const string_type& Native() const& noexcept; + constexpr const string_type&& Native() const&& noexcept; constexpr const value_type* c_str() const noexcept; constexpr explicit operator string_type() const; // Adds support for retrieving a modifiable copy of the underlying string // Any modifications to the string invalidates existing PathIterators - constexpr string_type& Native() noexcept; - constexpr explicit operator string_type&() noexcept; + constexpr string_type& Native() & noexcept; + constexpr string_type&& Native() && noexcept; //! The string and wstring functions cannot be constexpr until AZStd::basic_string is made constexpr. //! This cannot occur until C++20 as operator new/delete cannot be used within constexpr functions diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl index 6354324136..40cbf6f46b 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl @@ -8,10 +8,10 @@ #pragma once -#include #include #include -#include + +#include // extern instantiations of Path templates to prevent implicit instantiations namespace AZ::IO @@ -56,702 +56,6 @@ namespace AZ::IO const PathIterator& rhs); } -namespace AZ::IO::Internal -{ - constexpr bool IsSeparator(const char elem) - { - return elem == '/' || elem == '\\'; - } - template >> - static constexpr bool HasDrivePrefix(InputIt first, EndIt last) - { - size_t prefixSize = AZStd::distance(first, last); - if (prefixSize < 2 || *AZStd::next(first, 1) != ':') - { - // Drive prefix must be at least two characters and have a colon for the second character - return false; - } - - constexpr size_t ValidDrivePrefixRange = 26; - // Uppercase the drive letter by bitwise and'ing out the the 2^5 bit - unsigned char driveLetter = static_cast(*first); - - driveLetter &= 0b1101'1111; - // normalize the character value in the range of A-Z -> 0-25 - driveLetter -= 'A'; - return driveLetter < ValidDrivePrefixRange; - } - - static constexpr bool HasDrivePrefix(AZStd::string_view prefix) - { - return HasDrivePrefix(prefix.begin(), prefix.end()); - } - - //! Returns an iterator past the end of the consumed root name - //! Windows root names can have include drive letter within them - template - constexpr auto ConsumeRootName(InputIt entryBeginIter, InputIt entryEndIter, const char preferredSeparator) - -> AZStd::enable_if_t, InputIt> - { - if (preferredSeparator == PosixPathSeparator) - { - // If the preferred separator is forward slash the parser is in posix path - // parsing mode, which doesn't have a root name, - // unless we're on a posix platform that uses a custom path root separator - #if defined(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) - const AZStd::string_view path{ entryBeginIter, entryEndIter }; - const auto positionOfPathSeparator = path.find(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR); - if (positionOfPathSeparator == AZStd::string_view::npos) - { - return entryBeginIter; - } - const AZStd::string_view rootName{ path.substr(0, positionOfPathSeparator + 1) }; - return AZStd::next(entryBeginIter, rootName.size()); - #else - return entryBeginIter; - #endif - } - else - { - // Information for GetRootName has been gathered from Microsoft header - // Below are examples of paths and what there root-name will return - // "/" - returns "" - // "foo/" - returns "" - // "C:DriveRelative" - returns "C:" - // "C:\\DriveAbsolute" - returns "C:" - // "C://DriveAbsolute" - returns "C:" - // "\\server\share" - returns "\\server" - // The following paths are based on the UNC specification to work with paths longer than the 260 character path limit - // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maximum-path-length-limitation - // \\?\device - returns "\\?" - // \??\device - returns "\??" - // \\.\device - returns "\\." - - - AZStd::string_view path{ entryBeginIter, entryEndIter }; - - if (path.size() < 2) - { - // A root name is either or a network path - // therefore it has a least two characters - return entryBeginIter; - } - - if (HasDrivePrefix(path)) - { - // If the path has a drive prefix, then it has a root name of - return AZStd::next(entryBeginIter, 2); - } - - if (!Internal::IsSeparator(path[0])) - { - // At this point all other root names start with a path separator - return entryBeginIter; - } - - // Check if the path has the form of "\\?\, "\??\" or "\\.\" - const bool pathInUncForm = path.size() >= 4 && Internal::IsSeparator(path[3]) - && (path.size() == 4 || !Internal::IsSeparator(path[4])); - if (pathInUncForm) - { - // \\?\<0 or more> or \\.\$ - const bool slashQuestionMark = Internal::IsSeparator(path[1]) && (path[2] == '?' || path[2] == '.'); - // \??\<0 or more> - const bool questionMarkTwice = path[1] == '?' && path[2] == '?'; - if (slashQuestionMark || questionMarkTwice) - { - // Return the root value root slash - i.e "\\?" - return AZStd::next(entryBeginIter, 3); - } - } - - if (path.size() >= 3 && Internal::IsSeparator(path[1]) && !Internal::IsSeparator(path[2])) - { - // Find the next path separator for network paths that have the form of \\server\share - constexpr AZStd::string_view PathSeparators = { "/\\" }; - size_t nextPathSeparatorOffset = path.find_first_of(PathSeparators, 3); - return AZStd::next(entryBeginIter, nextPathSeparatorOffset != AZStd::string_view::npos ? nextPathSeparatorOffset : path.size()); - } - - return entryBeginIter; - } - } - - //! Returns an iterator past the end of the consumed path separator(s) - template - constexpr InputIt ConsumeSeparator(InputIt entryBeginIter, InputIt entryEndIter) noexcept - { - return AZStd::find_if_not(entryBeginIter, entryEndIter, [](const char elem) { return Internal::IsSeparator(elem); }); - } - - //! Returns an iterator past the end of the consumed filename - template - constexpr InputIt ConsumeName(InputIt entryBeginIter, InputIt entryEndIter) noexcept - { - return AZStd::find_if(entryBeginIter, entryEndIter, [](const char elem) { return Internal::IsSeparator(elem); }); - } - - //! Check if a path is absolute on a OS basis - //! If the preferred separator is '/' just checks if the path starts with a '/ - //! Otherwise a check for a Windows absolute path occurs - //! Windows absolute paths can include a RootName - template >> - static constexpr bool IsAbsolute(InputIt first, EndIt last, const char preferredSeparator) - { - // If the preferred separator is a forward slash - // than an absolute path is simply one that starts with a forward slash, - // unless we're on a posix platform that uses a custom path root separator - if (preferredSeparator == PosixPathSeparator) - { - #if defined(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) - const AZStd::string_view path{ first, last }; - return path.find(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) != AZStd::string_view::npos; - #else - const size_t pathSize = AZStd::distance(first, last); - return pathSize > 0 && IsSeparator(*first); - #endif - } - else - { - if (Internal::HasDrivePrefix(first, last)) - { - // If a windows path ends starts with C:foo it is a root relative path - // A path is absolute root absolute on windows if it starts with - const size_t pathSize = AZStd::distance(first, last); - return pathSize > 2 && Internal::IsSeparator(*AZStd::next(first, 2)); - } - - return first != ConsumeRootName(first, last, preferredSeparator); - } - } - static constexpr bool IsAbsolute(AZStd::string_view pathView, const char preferredSeparator) - { - // Uses the template preferred to branch on the absolute path check - // logic - return IsAbsolute(pathView.begin(), pathView.end(), preferredSeparator); - } - - // Compares path segments using either Posix or Windows path rules based on the path separator in use - // Posix paths perform a case-sensitive comparison, while Windows paths perform a case-insensitive comparison - static int ComparePathSegment(AZStd::string_view left, AZStd::string_view right, char pathSeparator) - { - const size_t maxCharsToCompare = (AZStd::min)(left.size(), right.size()); - - int charCompareResult = pathSeparator == PosixPathSeparator - ? strncmp(left.data(), right.data(), maxCharsToCompare) - : azstrnicmp(left.data(), right.data(), maxCharsToCompare); - return charCompareResult == 0 - ? static_cast(aznumeric_cast(left.size()) - aznumeric_cast(right.size())) - : charCompareResult; - } -} - -//! PathParser implementation -//! For internal use only -namespace AZ::IO::parser -{ - using parser_path_type = PathView; - using string_view_pair = AZStd::pair; - using PosPtr = const typename parser_path_type::value_type*; - - enum ParserState : uint8_t - { - // Zero is a special sentinel value used by default constructed iterators. - PS_BeforeBegin = PathIterator::BeforeBegin, - PS_InRootName = PathIterator::InRootName, - PS_InRootDir = PathIterator::InRootDir, - PS_InFilenames = PathIterator::InFilenames, - PS_AtEnd = PathIterator::AtEnd - }; - - struct PathParser - { - AZStd::string_view m_path_view; - AZStd::string_view m_path_raw_entry; - ParserState m_parser_state{}; - const char m_preferred_separator{ AZ_TRAIT_OS_PATH_SEPARATOR }; - - constexpr PathParser(AZStd::string_view path, ParserState state, const char preferredSeparator) noexcept - : m_path_view(path) - , m_parser_state(state) - , m_preferred_separator(preferredSeparator) - { - } - - constexpr PathParser(AZStd::string_view path, AZStd::string_view entry, ParserState state, const char preferredSeparator) noexcept - : m_path_view(path) - , m_path_raw_entry(entry) - , m_parser_state(static_cast(state)) - , m_preferred_separator(preferredSeparator) - { - } - - constexpr static PathParser CreateBegin(AZStd::string_view path, const char preferredSeparator) noexcept - { - PathParser pathParser(path, PS_BeforeBegin, preferredSeparator); - pathParser.Increment(); - return pathParser; - } - - constexpr static PathParser CreateEnd(AZStd::string_view path, const char preferredSeparator) noexcept - { - PathParser pathParser(path, PS_AtEnd, preferredSeparator); - return pathParser; - } - - constexpr PosPtr Peek() const noexcept - { - auto tokenEnd = getNextTokenStartPos(); - auto End = m_path_view.end(); - return tokenEnd == End ? nullptr : tokenEnd; - } - - constexpr void Increment() noexcept - { - const PosPtr pathEnd = m_path_view.end(); - const PosPtr currentPathEntry = getNextTokenStartPos(); - if (currentPathEntry == pathEnd) - { - return MakeState(PS_AtEnd); - } - - switch (m_parser_state) - { - case PS_BeforeBegin: - { - /* - * First the determine if the path contains only a root-name such as "C:" or is a filename such as "foo" - * root-relative path(Windows only) - C:foo - * root-absolute path - C:\foo - * root-absolute path - /foo - * relative path - foo - * - * Try to consume the root-name then the root directory to determine if path entry - * being parsed is a root-name or filename - * The State transitions from BeforeBegin are - * "C:", "\\server\", "\\?\", "\??\", "\\.\" -> Root Name - * "/", "\" -> Root Directory - * "path/foo", "foo" -> Filename - */ - auto rootNameEnd = Internal::ConsumeRootName(currentPathEntry, pathEnd, m_preferred_separator); - if (currentPathEntry != rootNameEnd) - { - // Transition to the Root Name state - return MakeState(PS_InRootName, currentPathEntry, rootNameEnd); - } - [[fallthrough]]; - } - case PS_InRootName: - { - auto rootDirEnd = Internal::ConsumeSeparator(currentPathEntry, pathEnd); - if (currentPathEntry != rootDirEnd) - { - // Transition to Root Directory state - return MakeState(PS_InRootDir, currentPathEntry, rootDirEnd); - } - [[fallthrough]]; - } - case PS_InRootDir: - { - auto filenameEnd = Internal::ConsumeName(currentPathEntry, pathEnd); - if (currentPathEntry != filenameEnd) - { - return MakeState(PS_InFilenames, currentPathEntry, filenameEnd); - } - [[fallthrough]]; - } - case PS_InFilenames: - { - auto separatorEnd = Internal::ConsumeSeparator(currentPathEntry, pathEnd); - if (separatorEnd != pathEnd) - { - // find the end of the current filename entry - auto filenameEnd = Internal::ConsumeName(separatorEnd, pathEnd); - return MakeState(PS_InFilenames, separatorEnd, filenameEnd); - } - // If after consuming the separator that path entry is at the end iterator - // move the path state to AtEnd - return MakeState(PS_AtEnd); - } - case PS_AtEnd: - AZ_Assert(false, "Path Parser cannot be incremented when it is in the AtEnd state"); - } - } - - constexpr void Decrement() noexcept - { - auto pathStart = m_path_view.begin(); - auto currentPathEntry = getCurrentTokenStartPos(); - - if (currentPathEntry == pathStart) - { - // we're decrementing the begin - return MakeState(PS_BeforeBegin); - } - switch (m_parser_state) - { - case PS_AtEnd: - { - /* - * First the determine if the path contains only a root-name such as "C:" or is a filename such as "foo" - * root-relative path(Windows only) - C:foo - * root-absolute path - C:\foo - * root-absolute path - /foo - * relative path - foo - * Try to consume the root-name then the root directory to determine if path entry - * being parsed is a root-name or filename - * The State transitions from AtEnd are - * "/path/foo/", "foo/", "C:foo\", "C:\foo\" -> Trailing Separator - * "/path/foo", "foo", "C:foo", "C:\foo" -> Filename - * "/", "C:\" or "\\server\" -> Root Directory - * "C:", "\\server", "\\?", "\??", "\\." -> Root Name - */ - auto rootNameEnd = Internal::ConsumeRootName(pathStart, currentPathEntry, m_preferred_separator); - if (pathStart != rootNameEnd && currentPathEntry == rootNameEnd) - { - // Transition to the Root Name state - return MakeState(PS_InRootName, pathStart, currentPathEntry); - } - - auto rootDirEnd = Internal::ConsumeSeparator(rootNameEnd, currentPathEntry); - if (rootNameEnd != rootDirEnd && currentPathEntry == rootDirEnd) - { - // Transition to Root Directory state - return MakeState(PS_InRootDir, rootNameEnd, currentPathEntry); - } - - auto filenameEnd = currentPathEntry; - if (Internal::IsSeparator(*(filenameEnd - 1))) - { - // The last character a path separator that isn't root directory - // consume all the preceding path separators - filenameEnd = Internal::ConsumeSeparator(AZStd::make_reverse_iterator(filenameEnd), - AZStd::make_reverse_iterator(rootDirEnd)).base(); - } - - // The previous state will be Filename, so the beginning of the filename is searched found - auto filenameBegin = Internal::ConsumeName(AZStd::make_reverse_iterator(filenameEnd), - AZStd::make_reverse_iterator(rootDirEnd)).base(); - return MakeState(PS_InFilenames, filenameBegin, filenameEnd); - } - case PS_InFilenames: - { - /* The State transitions from Filename are - * "/path/foo" -> Filename - * ^ - * "C:\foo" -> Root Directory - * ^ - * "C:foo" -> Root Name - * ^ - * "foo" -> This case has been taken care of by the current path entry != path start check - * ^ - */ - auto rootNameEnd = Internal::ConsumeRootName(pathStart, currentPathEntry, m_preferred_separator); - if (pathStart != rootNameEnd && currentPathEntry == rootNameEnd) - { - // Transition to the Root Name state - return MakeState(PS_InRootName, pathStart, rootNameEnd); - } - - auto rootDirEnd = Internal::ConsumeSeparator(rootNameEnd, currentPathEntry); - if (rootNameEnd != rootDirEnd && currentPathEntry == rootDirEnd) - { - // Transition to Root Directory state - return MakeState(PS_InRootDir, rootNameEnd, rootDirEnd); - } - // The previous state will be Filename again, so first the end of that filename is found - // proceeded by finding the beginning of that filename - auto filenameEnd = Internal::ConsumeSeparator(AZStd::make_reverse_iterator(currentPathEntry), - AZStd::make_reverse_iterator(rootDirEnd)).base(); - auto filenameBegin = Internal::ConsumeName(AZStd::make_reverse_iterator(filenameEnd), - AZStd::make_reverse_iterator(rootDirEnd)).base(); - return MakeState(PS_InFilenames, filenameBegin, filenameEnd); - } - case PS_InRootDir: - { - /* The State transitions from Root Directory are - * "C:\" "\\server\", "\\?\", "\??\", "\\.\" -> Root Name - * ^ ^ ^ ^ ^ - * "/" -> This case has been taken care of by the current path entry != path start check - * ^ - */ - return MakeState(PS_InRootName, pathStart, currentPathEntry); - } - case PS_InRootName: - // The only valid state transition from Root Name is BeforeBegin - return MakeState(PS_BeforeBegin); - case PS_BeforeBegin: - AZ_Assert(false, "Path Parser cannot be decremented when it is in the BeforeBegin State"); - } - } - - //! Return a view of the current element in the path processor state - constexpr AZStd::string_view operator*() const noexcept - { - switch (m_parser_state) - { - case PS_BeforeBegin: - [[fallthrough]]; - case PS_AtEnd: - [[fallthrough]]; - case PS_InRootDir: - return m_preferred_separator == '/' ? "/" : "\\"; - case PS_InRootName: - case PS_InFilenames: - return m_path_raw_entry; - default: - AZ_Assert(false, "Path Parser is in an invalid state"); - } - return {}; - } - - constexpr explicit operator bool() const noexcept - { - return m_parser_state != PS_BeforeBegin && m_parser_state != PS_AtEnd; - } - - constexpr PathParser& operator++() noexcept - { - Increment(); - return *this; - } - - constexpr PathParser& operator--() noexcept - { - Decrement(); - return *this; - } - - constexpr bool AtEnd() const noexcept - { - return m_parser_state == PS_AtEnd; - } - - constexpr bool InRootDir() const noexcept - { - return m_parser_state == PS_InRootDir; - } - - constexpr bool InRootName() const noexcept - { - return m_parser_state == PS_InRootName; - } - - constexpr bool InRootPath() const noexcept - { - return InRootName() || InRootDir(); - } - - private: - constexpr void MakeState(ParserState newState, typename AZStd::string_view::iterator start, typename AZStd::string_view::iterator end) noexcept - { - m_parser_state = newState; - m_path_raw_entry = AZStd::string_view(start, end); - } - constexpr void MakeState(ParserState newState) noexcept - { - m_parser_state = newState; - m_path_raw_entry = {}; - } - - //! Return a pointer to the first character after the currently lexed element. - constexpr typename AZStd::string_view::iterator getNextTokenStartPos() const noexcept - { - switch (m_parser_state) - { - case PS_BeforeBegin: - return m_path_view.begin(); - case PS_InRootName: - case PS_InRootDir: - case PS_InFilenames: - return m_path_raw_entry.end(); - case PS_AtEnd: - return m_path_view.end(); - default: - AZ_Assert(false, "Path Parser is in an invalid state"); - } - return m_path_view.end(); - } - - //! Return a pointer to the first character in the currently lexed element. - constexpr typename AZStd::string_view::iterator getCurrentTokenStartPos() const noexcept - { - switch (m_parser_state) - { - case PS_BeforeBegin: - case PS_InRootName: - return m_path_view.begin(); - case PS_InRootDir: - case PS_InFilenames: - return m_path_raw_entry.begin(); - case PS_AtEnd: - return m_path_view.end(); - default: - AZ_Assert(false, "Path Parser is in an invalid state"); - } - return m_path_view.end(); - } - }; - - constexpr string_view_pair SeparateFilename(const AZStd::string_view& srcView) - { - if (srcView == "." || srcView == ".." || srcView.empty()) - { - return string_view_pair{ srcView, "" }; - } - auto pos = srcView.find_last_of('.'); - if (pos == AZStd::string_view::npos || pos == 0) - { - return string_view_pair{ srcView, AZStd::string_view{} }; - } - return string_view_pair{ srcView.substr(0, pos), srcView.substr(pos) }; - } - - - // path part consumption - constexpr bool ConsumeRootName(PathParser* pathParser) - { - static_assert(PS_BeforeBegin == 1 && PS_InRootName == 2, - "PathParser must be in state before begin or in the root name in order to consume the root name"); - while (pathParser->m_parser_state <= PS_InRootName) - { - ++(*pathParser); - } - return pathParser->m_parser_state == PS_AtEnd; - } - constexpr bool ConsumeRootDir(PathParser* pathParser) - { - static_assert(PS_BeforeBegin == 1 && PS_InRootName == 2 && PS_InRootDir == 3, - "PathParser must be in state before begin, in the root name or in the root directory in order to consume the root directory"); - while (pathParser->m_parser_state <= PS_InRootDir) - { - ++(*pathParser); - } - return pathParser->m_parser_state == PS_AtEnd; - } - - // path.comparisons - constexpr int CompareRootName(PathParser* lhsPathParser, PathParser* rhsPathParser) - { - if (!lhsPathParser->InRootName() && !rhsPathParser->InRootName()) - { - return 0; - } - - auto GetRootName = [](PathParser* pathParser) constexpr -> AZStd::string_view - { - return pathParser->InRootName() ? **pathParser : ""; - }; - int res = Internal::ComparePathSegment(GetRootName(lhsPathParser), GetRootName(rhsPathParser), lhsPathParser->m_preferred_separator); - ConsumeRootName(lhsPathParser); - ConsumeRootName(rhsPathParser); - return res; - } - constexpr int CompareRootDir(PathParser* lhsPathParser, PathParser* rhsPathParser) - { - if (!lhsPathParser->InRootDir() && rhsPathParser->InRootDir()) - { - return -1; - } - else if (lhsPathParser->InRootDir() && !rhsPathParser->InRootDir()) - { - return 1; - } - else - { - ConsumeRootDir(lhsPathParser); - ConsumeRootDir(rhsPathParser); - return 0; - } - } - constexpr int CompareRelative(PathParser* lhsPathParserPtr, PathParser* rhsPathParserPtr) - { - auto& lhsPathParser = *lhsPathParserPtr; - auto& rhsPathParser = *rhsPathParserPtr; - - while (lhsPathParser && rhsPathParser) - { - if (int res = Internal::ComparePathSegment(*lhsPathParser, *rhsPathParser, lhsPathParser.m_preferred_separator); - res != 0) - { - return res; - } - ++lhsPathParser; - ++rhsPathParser; - } - return 0; - } - constexpr int CompareEndState(PathParser* lhsPathParser, PathParser* rhsPathParser) - { - if (lhsPathParser->AtEnd() && !rhsPathParser->AtEnd()) - { - return -1; - } - else if (!lhsPathParser->AtEnd() && rhsPathParser->AtEnd()) - { - return 1; - } - return 0; - } - - enum class PathPartKind : uint8_t - { - PK_None, - PK_RootName, - PK_RootSep, - PK_Filename, - PK_Dot, - PK_DotDot, - }; - - constexpr PathPartKind ClassifyPathPart(const PathParser& parser) - { - // Check each parser state to determine the PathPartKind - if (parser.m_parser_state == PS_InRootDir) - { - return PathPartKind::PK_RootSep; - } - if (parser.m_parser_state == PS_InRootName) - { - return PathPartKind::PK_RootName; - } - - // Fallback to checking parser pathEntry view value - // to determine if the special "." or ".." values are being used - AZStd::string_view pathPart = *parser; - if (pathPart == ".") - { - return PathPartKind::PK_Dot; - } - if (pathPart == "..") - { - return PathPartKind::PK_DotDot; - } - - // Return PathPartKind of Filename if the parser state doesn't match - // the states of InRootDir or InRootName and the filename - // isn't made up of the special directory values of "." and ".." - return PathPartKind::PK_Filename; - } - - constexpr int DetermineLexicalElementCount(PathParser pathParser) - { - int count = 0; - for (; pathParser; ++pathParser) - { - auto pathElement = *pathParser; - if (pathElement == "..") - { - --count; - } - else if (pathElement != "." && pathElement != "") - { - ++count; - } - } - return count; - } -} //! PathView implementation namespace AZ::IO @@ -1183,7 +487,8 @@ namespace AZ::IO }; if (pathParser.InRootName() && pathParserBase.InRootName()) { - if (*pathParser != *pathParserBase) + if (int res = Internal::ComparePathSegment(*pathParser, *pathParserBase, pathParser.m_preferred_separator); + res != 0) { pathResult.m_path = AZStd::string_view{}; return; @@ -1213,7 +518,8 @@ namespace AZ::IO // Find the first mismatching element auto pathParser = parser::PathParser::CreateBegin(path.m_path, path.m_preferred_separator); auto pathParserBase = parser::PathParser::CreateBegin(base.m_path, base.m_preferred_separator); - while (pathParser && pathParserBase && pathParser.m_parser_state == pathParserBase.m_parser_state && *pathParser == *pathParserBase) + while (pathParser && pathParserBase && pathParser.m_parser_state == pathParserBase.m_parser_state && + Internal::ComparePathSegment(*pathParser, *pathParserBase, pathParser.m_preferred_separator) == 0) { ++pathParser; ++pathParserBase; @@ -1255,66 +561,92 @@ namespace AZ::IO } } - template - constexpr void PathView::LexicallyNormalInplace(PathResultType& pathResult, const AZ::IO::PathView& path) + constexpr auto PathView::AppendNormalPathParts(PathIterable& pathIterable, const AZ::IO::PathView& path) noexcept -> void { if (path.m_path.empty()) { - pathResult = path; return; } - using PartKindPair = AZStd::pair; - // Max number of path parts supported when normalizing a path - constexpr size_t MaxPathParts = 64; - AZStd::array pathParts{}; - size_t currentPartSize = 0; - - // Track the total size of the parts as we collect them. This allows the - // resulting path to reserve the correct amount of memory. - size_t newPathSize = 0; - auto AddPart = [&newPathSize, &pathParts, ¤tPartSize](parser::PathPartKind pathKind, AZStd::string_view parserPathPart) constexpr - { - newPathSize += parserPathPart.size(); - pathParts[currentPartSize++] = { parserPathPart, pathKind }; - }; - auto LastPartKind = [&pathParts, ¤tPartSize]() constexpr - { - if (currentPartSize == 0) - { - return parser::PathPartKind::PK_None; - } - return pathParts[currentPartSize - 1].second; - }; - // Build a stack containing the remaining elements of the path, popping off // elements which occur before a '..' entry. for (auto pathParser = parser::PathParser::CreateBegin(path.m_path, path.m_preferred_separator); pathParser; ++pathParser) { - parser::PathPartKind Kind = parser::ClassifyPathPart(pathParser); - switch (Kind) + switch (const parser::PathPartKind Kind = parser::ClassifyPathPart(pathParser); Kind) { case parser::PathPartKind::PK_RootName: - case parser::PathPartKind::PK_Filename: - [[fallthrough]]; + { + // Root Name normalization is a bit tricky. + // A path of C:/foo/C:bar = C:/foo/bar and a path of C:foo/C:bar = C:foo/bar + // A path of C:/foo/C: = C:/foo + // A path of C:/foo/C:/bar = C:/bar + // Also a path of C:/foo/C: = C:/foo, but C:/foo/C:/ = C:/ + // A path of C:foo/D:bar = D:bar + // The pathIterable only stores the Root Name at the front + if (const auto [firstPartView, firstPartKind] = !pathIterable.empty() ? pathIterable.front() : PathIterable::PartKindPair{}; + firstPartKind != parser::PathPartKind::PK_RootName || firstPartView != *pathParser) + { + // The root name has changed or this is the first time a root name has been seen, + // discard the accumulated path parts + pathIterable.clear(); + pathIterable.emplace_back(*pathParser, Kind); + } + break; + } case parser::PathPartKind::PK_RootSep: { - // Add all non-dot and non-dot-dot elements to the stack of elements. - AddPart(Kind, *pathParser); + // If a root directory has been found, discard the accumulated path parts so far + // but not before storing of the first path part in case it is a Root Name + const auto [firstPartView, firstPartKind] = !pathIterable.empty() ? pathIterable.front() : PathIterable::PartKindPair{}; + pathIterable.clear(); + + if (firstPartKind == parser::PathPartKind::PK_RootName) + { + pathIterable.emplace_back(firstPartView, firstPartKind); + } + pathIterable.emplace_back(*pathParser, Kind); + break; + } + case parser::PathPartKind::PK_Filename: + { + // Special Case: The "filename" starts with a root name + // i.e D:/foo/C:/baz + // ^ + // The result should be C:/baz + // In this case restart path parsing at this element into the same PathIterable + // using tail recursion + AZStd::string_view filenameView{ *pathParser }; + if (auto filenameParser = parser::PathParser::CreateBegin(filenameView, pathParser.m_preferred_separator); + filenameParser && parser::ClassifyPathPart(filenameParser) == parser::PathPartKind::PK_RootName) + { + AZ::IO::PathView fileNamePath{ AZStd::string_view{ filenameView.begin(), path.m_path.end() }, + pathParser.m_preferred_separator }; + AppendNormalPathParts(pathIterable, fileNamePath); + return; + } + else + { + // Normal Case: The "filename" does not start with a root name + // Add all non-dot and non-dot-dot elements to the stack of elements. + pathIterable.emplace_back(*pathParser, Kind); + } break; } case parser::PathPartKind::PK_DotDot: { // Only push a ".." element if there are no elements preceding the "..", // or if the preceding element is itself "..". - auto lastPartKind = LastPartKind(); - if (lastPartKind == parser::PathPartKind::PK_Filename) + + if (const auto lastPartKind = !pathIterable.empty() ? pathIterable.back().second : parser::PathPartKind::PK_None; + lastPartKind == parser::PathPartKind::PK_Filename) { - newPathSize -= pathParts[--currentPartSize].first.size(); + // Due to the previous path part being a filename, the and the ".." cancels each other + // So remove the filename from the normalized path + pathIterable.pop_back(); } else if (lastPartKind != parser::PathPartKind::PK_RootSep) { - AddPart(parser::PathPartKind::PK_DotDot, ".."); + pathIterable.emplace_back("..", parser::PathPartKind::PK_DotDot); } break; } @@ -1324,21 +656,13 @@ namespace AZ::IO AZ_Assert(false, "Path Parser is in an invalid state"); } } - //! If the path is empty, add a dot. - if (currentPartSize == 0) - { - pathResult.m_path = AZStd::string_view{ "." }; - return; - } - - pathResult = PathResultType(path.m_preferred_separator); - pathResult.m_path.reserve(currentPartSize + newPathSize); - for (size_t partIndex = 0; partIndex < currentPartSize; ++partIndex) - { - auto& pathPart = pathParts[partIndex]; - pathResult /= pathPart.first; - } + } + constexpr auto PathView::GetNormalPathParts(const AZ::IO::PathView& path) noexcept -> PathIterable + { + PathIterable pathIterable; + AppendNormalPathParts(pathIterable, path); + return pathIterable; } } @@ -1573,12 +897,22 @@ namespace AZ::IO // Check if the other path has a root name and // that the root name doesn't match the current path root name // The scenario where this would occur was if the current path object had a path of - // "C:"foo and the other path object had a path "F:bar". + // "C:foo" and the other path object had a path "F:bar". // As the root names are different the other path replaces current path in it's entirety auto postRootNameIter = Internal::ConsumeRootName(m_path.begin(), m_path.end(), m_preferred_separator); auto otherPostRootNameIter = Internal::ConsumeRootName(first, last, m_preferred_separator); AZStd::string_view rootNameView{ m_path.begin(), postRootNameIter }; - if (first != otherPostRootNameIter && !AZStd::equal(rootNameView.begin(), rootNameView.end(), first, otherPostRootNameIter)) + + // The RootName can only ever be two characters long which is ":" + auto ToLower = [](const char element) constexpr -> char + { + return element >= 'A' && element <= 'Z' ? (element - 'A') + 'a' : element; + }; + auto compareRootName = [ToLower = AZStd::move(ToLower), path_separator = m_preferred_separator](const char lhs, const char rhs) constexpr + { + return path_separator == PosixPathSeparator ? lhs == rhs : ToLower(lhs) == ToLower(rhs); + }; + if (first != otherPostRootNameIter && !AZStd::equal(rootNameView.begin(), rootNameView.end(), first, otherPostRootNameIter, compareRootName)) { m_path.assign(first, last); return *this; @@ -1708,15 +1042,26 @@ namespace AZ::IO // native format observers template - constexpr auto BasicPath::Native() const noexcept -> const string_type& + constexpr auto BasicPath::Native() const & noexcept -> const string_type& + { + return m_path; + } + template + constexpr auto BasicPath::Native() const && noexcept -> const string_type&& + { + return AZStd::move(m_path); + } + + template + constexpr auto BasicPath::Native() & noexcept -> string_type& { return m_path; } template - constexpr auto BasicPath::Native() noexcept -> string_type& + constexpr auto BasicPath::Native() && noexcept -> string_type&& { - return m_path; + return AZStd::move(m_path); } template @@ -1726,13 +1071,7 @@ namespace AZ::IO } template - constexpr BasicPath::operator string_type() const - { - return m_path; - } - - template - constexpr BasicPath::operator string_type&() noexcept + constexpr BasicPath::operator string_type() const { return m_path; } @@ -1887,15 +1226,19 @@ namespace AZ::IO template constexpr auto BasicPath::LexicallyNormal() const -> BasicPath { - BasicPath pathResult; - static_cast(*this).LexicallyNormalInplace(pathResult, *this); + BasicPath pathResult(m_preferred_separator); + PathView::PathIterable pathIterable = PathView::GetNormalPathParts(*this); + for ([[maybe_unused]] auto [pathPartView, pathPartKind] : pathIterable) + { + pathResult /= pathPartView; + } return pathResult; } template constexpr auto BasicPath::LexicallyRelative(const PathView& base) const -> BasicPath { - BasicPath pathResult; + BasicPath pathResult(m_preferred_separator); static_cast(*this).MakeRelativeTo(pathResult, *this, base); return pathResult; } @@ -1984,20 +1327,45 @@ namespace AZ::IO { [[nodiscard]] constexpr bool PathView::IsRelativeTo(const PathView& base) const { - auto relativePath = LexicallyRelative(base); - return !relativePath.empty() && !relativePath.Native().starts_with(".."); + // PathView::LexicallyRelative is not being used as it returns a FixedMaxPath + // which has a limitation that it requires the relative path to fit within + // an AZ::IO::MaxPathLength buffer + auto ComparePathPart = [pathSeparator = m_preferred_separator]( + const PathIterable::PartKindPair& left, const PathIterable::PartKindPair& right) -> bool + { + return Internal::ComparePathSegment(left.first, right.first, pathSeparator) == 0; + }; + + const PathIterable thisPathParts = GetNormalPathParts(*this); + const PathIterable basePathParts = GetNormalPathParts(base); + [[maybe_unused]] auto [thisPathIter, basePathIter] = AZStd::mismatch(thisPathParts.begin(), thisPathParts.end(), + basePathParts.begin(), basePathParts.end(), ComparePathPart); + // Check if the entire base path has been consumed. If not, *this path cannot be relative to it + if (basePathIter != basePathParts.end()) + { + return false; + } + + // If the base path isn't empty and has been fully consumed, then *this path is relative + // Also if the base path is empty, then any relative path is relative to an empty path('.') + return !basePathParts.empty() || !thisPathParts.IsAbsolute(); } constexpr FixedMaxPath PathView::LexicallyNormal() const { - FixedMaxPath pathResult; - LexicallyNormalInplace(pathResult, *this); + FixedMaxPath pathResult(m_preferred_separator); + PathIterable pathIterable = GetNormalPathParts(*this); + for ([[maybe_unused]] auto [pathPartView, pathPartKind] : pathIterable) + { + pathResult /= pathPartView; + } + return pathResult; } constexpr FixedMaxPath PathView::LexicallyRelative(const PathView& base) const { - FixedMaxPath pathResult; + FixedMaxPath pathResult(m_preferred_separator); MakeRelativeTo(pathResult, *this, base); return pathResult; } diff --git a/Code/Framework/AzCore/AzCore/IO/Path/PathIterable.inl b/Code/Framework/AzCore/AzCore/IO/Path/PathIterable.inl new file mode 100644 index 0000000000..a1faa29b31 --- /dev/null +++ b/Code/Framework/AzCore/AzCore/IO/Path/PathIterable.inl @@ -0,0 +1,162 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include + +namespace AZ::IO +{ + struct PathView::PathIterable + { + inline static constexpr size_t MaxPathParts = 64; + using PartKindPair = AZStd::pair; + using PartKindArray = AZStd::array; + constexpr PathIterable() = default; + + [[nodiscard]] constexpr bool empty() const noexcept; + constexpr auto size() const noexcept-> size_t; + constexpr auto begin() noexcept-> PartKindArray::iterator; + constexpr auto begin() const noexcept -> PartKindArray::const_iterator; + constexpr auto cbegin() const noexcept -> PartKindArray::const_iterator; + constexpr auto end() noexcept -> PartKindArray::iterator; + constexpr auto end() const noexcept -> PartKindArray::const_iterator; + constexpr auto cend() const noexcept -> PartKindArray::const_iterator; + constexpr auto rbegin() noexcept -> PartKindArray::reverse_iterator; + constexpr auto rbegin() const noexcept -> PartKindArray::const_reverse_iterator; + constexpr auto crbegin() const noexcept -> PartKindArray::const_reverse_iterator; + constexpr auto rend() noexcept -> PartKindArray::reverse_iterator; + constexpr auto rend() const noexcept -> PartKindArray::const_reverse_iterator; + constexpr auto crend() const noexcept -> PartKindArray::const_reverse_iterator; + + [[nodiscard]] constexpr bool IsAbsolute() const noexcept; + + private: + template + constexpr PartKindPair& emplace_back(Args&&... args) noexcept; + constexpr void pop_back() noexcept; + constexpr const PartKindPair& back() const noexcept; + constexpr PartKindPair& back() noexcept; + + constexpr const PartKindPair& front() const noexcept; + constexpr PartKindPair& front() noexcept; + + constexpr void clear() noexcept; + + friend constexpr auto PathView::GetNormalPathParts(const AZ::IO::PathView&) noexcept -> PathIterable; + friend constexpr auto PathView::AppendNormalPathParts(PathIterable& pathIterable, const AZ::IO::PathView&) noexcept -> void; + PartKindArray m_parts{}; + size_t m_size{}; + }; + + // public + [[nodiscard]] constexpr auto PathView::PathIterable::empty() const noexcept -> bool + { + return m_size == 0; + } + constexpr auto PathView::PathIterable::size() const noexcept -> size_t + { + return m_size; + } + + constexpr auto PathView::PathIterable::begin() noexcept -> PartKindArray::iterator + { + return m_parts.begin(); + } + constexpr auto PathView::PathIterable::begin() const noexcept -> PartKindArray::const_iterator + { + return m_parts.begin(); + } + constexpr auto PathView::PathIterable::cbegin() const noexcept -> PartKindArray::const_iterator + { + return begin(); + } + constexpr auto PathView::PathIterable::end() noexcept -> PartKindArray::iterator + { + return begin() + size(); + } + constexpr auto PathView::PathIterable::end() const noexcept -> PartKindArray::const_iterator + { + return begin() + size(); + } + constexpr auto PathView::PathIterable::cend() const noexcept -> PartKindArray::const_iterator + { + return end(); + } + constexpr auto PathView::PathIterable::rbegin() noexcept -> PartKindArray::reverse_iterator + { + return PartKindArray::reverse_iterator(begin() + size()); + } + constexpr auto PathView::PathIterable::rbegin() const noexcept -> PartKindArray::const_reverse_iterator + { + return PartKindArray::const_reverse_iterator(begin() + size()); + } + constexpr auto PathView::PathIterable::crbegin() const noexcept -> PartKindArray::const_reverse_iterator + { + return rbegin(); + } + constexpr auto PathView::PathIterable::rend() noexcept -> PartKindArray::reverse_iterator + { + return PartKindArray::reverse_iterator(begin()); + } + constexpr auto PathView::PathIterable::rend() const noexcept -> PartKindArray::const_reverse_iterator + { + return PartKindArray::const_reverse_iterator(begin()); + } + constexpr auto PathView::PathIterable::crend() const noexcept -> PartKindArray::const_reverse_iterator + { + return rend(); + } + + [[nodiscard]] constexpr auto PathView::PathIterable::IsAbsolute() const noexcept -> bool + { + return !empty() && (front().second == parser::PathPartKind::PK_RootSep + || (size() > 1 && front().second == parser::PathPartKind::PK_RootName && m_parts[1].second == parser::PathPartKind::PK_RootSep)); + } + + // private + template + constexpr auto PathView::PathIterable::emplace_back(Args&&... args) noexcept -> PartKindPair& + { + AZ_Assert(m_size < MaxPathParts, "PathIterable cannot be made out of a path with more than %zu parts", MaxPathParts); + m_parts[m_size++] = PartKindPair{ AZStd::forward(args)... }; + return back(); + } + constexpr auto PathView::PathIterable::pop_back() noexcept -> void + { + AZ_Assert(m_size > 0, "Cannot pop_back() from a PathIterable with 0 parts"); + --m_size; + } + constexpr auto PathView::PathIterable::back() const noexcept -> const PartKindPair& + { + AZ_Assert(!empty(), "back() was invoked on PathIterable with 0 parts"); + return m_parts[m_size - 1]; + } + constexpr auto PathView::PathIterable::back() noexcept -> PartKindPair& + { + AZ_Assert(!empty(), "back() was invoked on PathIterable with 0 parts"); + return m_parts[m_size - 1]; + } + + constexpr auto PathView::PathIterable::front() const noexcept -> const PartKindPair& + { + AZ_Assert(!empty(), "front() was invoked on PathIterable with 0 parts"); + return m_parts[0]; + } + constexpr auto PathView::PathIterable::front() noexcept -> PartKindPair& + { + AZ_Assert(!empty(), "front() was invoked on PathIterable with 0 parts"); + return m_parts[0]; + } + + constexpr auto PathView::PathIterable::clear() noexcept -> void + { + m_size = 0; + } +} diff --git a/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl b/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl new file mode 100644 index 0000000000..3ab2c4376c --- /dev/null +++ b/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl @@ -0,0 +1,706 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include + +namespace AZ::IO::Internal +{ + constexpr bool IsSeparator(const char elem) + { + return elem == '/' || elem == '\\'; + } + template >> + static constexpr bool HasDrivePrefix(InputIt first, EndIt last) + { + size_t prefixSize = AZStd::distance(first, last); + if (prefixSize < 2 || *AZStd::next(first, 1) != ':') + { + // Drive prefix must be at least two characters and have a colon for the second character + return false; + } + + constexpr size_t ValidDrivePrefixRange = 26; + // Uppercase the drive letter by bitwise and'ing out the the 2^5 bit + unsigned char driveLetter = static_cast(*first); + + driveLetter &= 0b1101'1111; + // normalize the character value in the range of A-Z -> 0-25 + driveLetter -= 'A'; + return driveLetter < ValidDrivePrefixRange; + } + + static constexpr bool HasDrivePrefix(AZStd::string_view prefix) + { + return HasDrivePrefix(prefix.begin(), prefix.end()); + } + + //! Returns an iterator past the end of the consumed root name + //! Windows root names can have include drive letter within them + template + constexpr auto ConsumeRootName(InputIt entryBeginIter, InputIt entryEndIter, const char preferredSeparator) + -> AZStd::enable_if_t, InputIt> + { + if (preferredSeparator == PosixPathSeparator) + { + // If the preferred separator is forward slash the parser is in posix path + // parsing mode, which doesn't have a root name, + // unless we're on a posix platform that uses a custom path root separator +#if defined(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) + const AZStd::string_view path{ entryBeginIter, entryEndIter }; + const auto positionOfPathSeparator = path.find(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR); + if (positionOfPathSeparator != AZStd::string_view::npos) + { + return AZStd::next(entryBeginIter, positionOfPathSeparator + 1); + } +#endif + return entryBeginIter; + } + else + { + // Information for GetRootName has been gathered from Microsoft header + // Below are examples of paths and what there root-name will return + // "/" - returns "" + // "foo/" - returns "" + // "C:DriveRelative" - returns "C:" + // "C:\\DriveAbsolute" - returns "C:" + // "C://DriveAbsolute" - returns "C:" + // "\\server\share" - returns "\\server" + // The following paths are based on the UNC specification to work with paths longer than the 260 character path limit + // https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file?redirectedfrom=MSDN#maximum-path-length-limitation + // \\?\device - returns "\\?" + // \??\device - returns "\??" + // \\.\device - returns "\\." + + + AZStd::string_view path{ entryBeginIter, entryEndIter }; + + if (path.size() < 2) + { + // A root name is either or a network path + // therefore it has a least two characters + return entryBeginIter; + } + + if (HasDrivePrefix(path)) + { + // If the path has a drive prefix, then it has a root name of + return AZStd::next(entryBeginIter, 2); + } + + if (!Internal::IsSeparator(path[0])) + { + // At this point all other root names start with a path separator + return entryBeginIter; + } + + // Check if the path has the form of "\\?\, "\??\" or "\\.\" + const bool pathInUncForm = path.size() >= 4 && Internal::IsSeparator(path[3]) + && (path.size() == 4 || !Internal::IsSeparator(path[4])); + if (pathInUncForm) + { + // \\?\<0 or more> or \\.\$ + const bool slashQuestionMark = Internal::IsSeparator(path[1]) && (path[2] == '?' || path[2] == '.'); + // \??\<0 or more> + const bool questionMarkTwice = path[1] == '?' && path[2] == '?'; + if (slashQuestionMark || questionMarkTwice) + { + // Return the root value root slash - i.e "\\?" + return AZStd::next(entryBeginIter, 3); + } + } + + if (path.size() >= 3 && Internal::IsSeparator(path[1]) && !Internal::IsSeparator(path[2])) + { + // Find the next path separator for network paths that have the form of \\server\share + constexpr AZStd::string_view PathSeparators = { "/\\" }; + size_t nextPathSeparatorOffset = path.find_first_of(PathSeparators, 3); + return AZStd::next(entryBeginIter, nextPathSeparatorOffset != AZStd::string_view::npos ? nextPathSeparatorOffset : path.size()); + } + + return entryBeginIter; + } + } + + //! Returns an iterator past the end of the consumed path separator(s) + template + constexpr InputIt ConsumeSeparator(InputIt entryBeginIter, InputIt entryEndIter) noexcept + { + return AZStd::find_if_not(entryBeginIter, entryEndIter, [](const char elem) { return Internal::IsSeparator(elem); }); + } + + //! Returns an iterator past the end of the consumed filename + template + constexpr InputIt ConsumeName(InputIt entryBeginIter, InputIt entryEndIter) noexcept + { + return AZStd::find_if(entryBeginIter, entryEndIter, [](const char elem) { return Internal::IsSeparator(elem); }); + } + + //! Check if a path is absolute on a OS basis + //! If the preferred separator is '/' just checks if the path starts with a '/ + //! Otherwise a check for a Windows absolute path occurs + //! Windows absolute paths can include a RootName + template >> + static constexpr bool IsAbsolute(InputIt first, EndIt last, const char preferredSeparator) + { + size_t pathSize = AZStd::distance(first, last); + + // If the preferred separator is a forward slash + // than an absolute path is simply one that starts with a forward slash, + // unless we're on a posix platform that uses a custom path root separator + if (preferredSeparator == PosixPathSeparator) + { +#if defined(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) + const AZStd::string_view path{ first, last }; + return path.find(AZ_TRAIT_CUSTOM_PATH_ROOT_SEPARATOR) != AZStd::string_view::npos; +#else + return pathSize > 0 && IsSeparator(*first); +#endif + } + else + { + if (Internal::HasDrivePrefix(first, last)) + { + // If a windows path ends starts with C:foo it is a root relative path + // A path is absolute root absolute on windows if it starts with + return pathSize > 2 && Internal::IsSeparator(*AZStd::next(first, 2)); + } + + return first != ConsumeRootName(first, last, preferredSeparator); + } + } + static constexpr bool IsAbsolute(AZStd::string_view pathView, const char preferredSeparator) + { + // Uses the template preferred to branch on the absolute path check + // logic + return IsAbsolute(pathView.begin(), pathView.end(), preferredSeparator); + } + + // Compares path segments using either Posix or Windows path rules based on the path separator in use + // Posix paths perform a case-sensitive comparison, while Windows paths perform a case-insensitive comparison + static int ComparePathSegment(AZStd::string_view left, AZStd::string_view right, char pathSeparator) + { + const size_t maxCharsToCompare = (AZStd::min)(left.size(), right.size()); + + int charCompareResult = pathSeparator == PosixPathSeparator + ? maxCharsToCompare ? strncmp(left.data(), right.data(), maxCharsToCompare) : 0 + : maxCharsToCompare ? azstrnicmp(left.data(), right.data(), maxCharsToCompare) : 0; + return charCompareResult == 0 + ? static_cast(aznumeric_cast(left.size()) - aznumeric_cast(right.size())) + : charCompareResult; + } +} + +//! PathParser implementation +//! For internal use only +namespace AZ::IO::parser +{ + using parser_path_type = PathView; + using string_view_pair = AZStd::pair; + using PosPtr = const typename parser_path_type::value_type*; + + enum ParserState : uint8_t + { + // Zero is a special sentinel value used by default constructed iterators. + PS_BeforeBegin = PathIterator::BeforeBegin, + PS_InRootName = PathIterator::InRootName, + PS_InRootDir = PathIterator::InRootDir, + PS_InFilenames = PathIterator::InFilenames, + PS_AtEnd = PathIterator::AtEnd + }; + + struct PathParser + { + AZStd::string_view m_path_view; + AZStd::string_view m_path_raw_entry; + ParserState m_parser_state{}; + const char m_preferred_separator{ AZ_TRAIT_OS_PATH_SEPARATOR }; + + constexpr PathParser(AZStd::string_view path, ParserState state, const char preferredSeparator) noexcept + : m_path_view(path) + , m_parser_state(state) + , m_preferred_separator(preferredSeparator) + { + } + + constexpr PathParser(AZStd::string_view path, AZStd::string_view entry, ParserState state, const char preferredSeparator) noexcept + : m_path_view(path) + , m_path_raw_entry(entry) + , m_parser_state(static_cast(state)) + , m_preferred_separator(preferredSeparator) + { + } + + constexpr static PathParser CreateBegin(AZStd::string_view path, const char preferredSeparator) noexcept + { + PathParser pathParser(path, PS_BeforeBegin, preferredSeparator); + pathParser.Increment(); + return pathParser; + } + + constexpr static PathParser CreateEnd(AZStd::string_view path, const char preferredSeparator) noexcept + { + PathParser pathParser(path, PS_AtEnd, preferredSeparator); + return pathParser; + } + + constexpr PosPtr Peek() const noexcept + { + auto tokenEnd = getNextTokenStartPos(); + auto End = m_path_view.end(); + return tokenEnd == End ? nullptr : tokenEnd; + } + + constexpr void Increment() noexcept + { + const PosPtr pathEnd = m_path_view.end(); + const PosPtr currentPathEntry = getNextTokenStartPos(); + if (currentPathEntry == pathEnd) + { + return MakeState(PS_AtEnd); + } + + switch (m_parser_state) + { + case PS_BeforeBegin: + { + /* + * First the determine if the path contains only a root-name such as "C:" or is a filename such as "foo" + * root-relative path(Windows only) - C:foo + * root-absolute path - C:\foo + * root-absolute path - /foo + * relative path - foo + * + * Try to consume the root-name then the root directory to determine if path entry + * being parsed is a root-name or filename + * The State transitions from BeforeBegin are + * "C:", "\\server\", "\\?\", "\??\", "\\.\" -> Root Name + * "/", "\" -> Root Directory + * "path/foo", "foo" -> Filename + */ + auto rootNameEnd = Internal::ConsumeRootName(currentPathEntry, pathEnd, m_preferred_separator); + if (currentPathEntry != rootNameEnd) + { + // Transition to the Root Name state + return MakeState(PS_InRootName, currentPathEntry, rootNameEnd); + } + [[fallthrough]]; + } + case PS_InRootName: + { + auto rootDirEnd = Internal::ConsumeSeparator(currentPathEntry, pathEnd); + if (currentPathEntry != rootDirEnd) + { + // Transition to Root Directory state + return MakeState(PS_InRootDir, currentPathEntry, rootDirEnd); + } + [[fallthrough]]; + } + case PS_InRootDir: + { + auto filenameEnd = Internal::ConsumeName(currentPathEntry, pathEnd); + if (currentPathEntry != filenameEnd) + { + return MakeState(PS_InFilenames, currentPathEntry, filenameEnd); + } + [[fallthrough]]; + } + case PS_InFilenames: + { + auto separatorEnd = Internal::ConsumeSeparator(currentPathEntry, pathEnd); + if (separatorEnd != pathEnd) + { + // find the end of the current filename entry + auto filenameEnd = Internal::ConsumeName(separatorEnd, pathEnd); + return MakeState(PS_InFilenames, separatorEnd, filenameEnd); + } + // If after consuming the separator that path entry is at the end iterator + // move the path state to AtEnd + return MakeState(PS_AtEnd); + } + case PS_AtEnd: + AZ_Assert(false, "Path Parser cannot be incremented when it is in the AtEnd state"); + } + } + + constexpr void Decrement() noexcept + { + auto pathStart = m_path_view.begin(); + auto currentPathEntry = getCurrentTokenStartPos(); + + if (currentPathEntry == pathStart) + { + // we're decrementing the begin + return MakeState(PS_BeforeBegin); + } + switch (m_parser_state) + { + case PS_AtEnd: + { + /* + * First the determine if the path contains only a root-name such as "C:" or is a filename such as "foo" + * root-relative path(Windows only) - C:foo + * root-absolute path - C:\foo + * root-absolute path - /foo + * relative path - foo + * Try to consume the root-name then the root directory to determine if path entry + * being parsed is a root-name or filename + * The State transitions from AtEnd are + * "/path/foo/", "foo/", "C:foo\", "C:\foo\" -> Trailing Separator + * "/path/foo", "foo", "C:foo", "C:\foo" -> Filename + * "/", "C:\" or "\\server\" -> Root Directory + * "C:", "\\server", "\\?", "\??", "\\." -> Root Name + */ + auto rootNameEnd = Internal::ConsumeRootName(pathStart, currentPathEntry, m_preferred_separator); + if (pathStart != rootNameEnd && currentPathEntry == rootNameEnd) + { + // Transition to the Root Name state + return MakeState(PS_InRootName, pathStart, currentPathEntry); + } + + auto rootDirEnd = Internal::ConsumeSeparator(rootNameEnd, currentPathEntry); + if (rootNameEnd != rootDirEnd && currentPathEntry == rootDirEnd) + { + // Transition to Root Directory state + return MakeState(PS_InRootDir, rootNameEnd, currentPathEntry); + } + + auto filenameEnd = currentPathEntry; + if (Internal::IsSeparator(*(filenameEnd - 1))) + { + // The last character a path separator that isn't root directory + // consume all the preceding path separators + filenameEnd = Internal::ConsumeSeparator(AZStd::make_reverse_iterator(filenameEnd), + AZStd::make_reverse_iterator(rootDirEnd)).base(); + } + + // The previous state will be Filename, so the beginning of the filename is searched found + auto filenameBegin = Internal::ConsumeName(AZStd::make_reverse_iterator(filenameEnd), + AZStd::make_reverse_iterator(rootDirEnd)).base(); + return MakeState(PS_InFilenames, filenameBegin, filenameEnd); + } + case PS_InFilenames: + { + /* The State transitions from Filename are + * "/path/foo" -> Filename + * ^ + * "C:\foo" -> Root Directory + * ^ + * "C:foo" -> Root Name + * ^ + * "foo" -> This case has been taken care of by the current path entry != path start check + * ^ + */ + auto rootNameEnd = Internal::ConsumeRootName(pathStart, currentPathEntry, m_preferred_separator); + if (pathStart != rootNameEnd && currentPathEntry == rootNameEnd) + { + // Transition to the Root Name state + return MakeState(PS_InRootName, pathStart, rootNameEnd); + } + + auto rootDirEnd = Internal::ConsumeSeparator(rootNameEnd, currentPathEntry); + if (rootNameEnd != rootDirEnd && currentPathEntry == rootDirEnd) + { + // Transition to Root Directory state + return MakeState(PS_InRootDir, rootNameEnd, rootDirEnd); + } + // The previous state will be Filename again, so first the end of that filename is found + // proceeded by finding the beginning of that filename + auto filenameEnd = Internal::ConsumeSeparator(AZStd::make_reverse_iterator(currentPathEntry), + AZStd::make_reverse_iterator(rootDirEnd)).base(); + auto filenameBegin = Internal::ConsumeName(AZStd::make_reverse_iterator(filenameEnd), + AZStd::make_reverse_iterator(rootDirEnd)).base(); + return MakeState(PS_InFilenames, filenameBegin, filenameEnd); + } + case PS_InRootDir: + { + /* The State transitions from Root Directory are + * "C:\" "\\server\", "\\?\", "\??\", "\\.\" -> Root Name + * ^ ^ ^ ^ ^ + * "/" -> This case has been taken care of by the current path entry != path start check + * ^ + */ + return MakeState(PS_InRootName, pathStart, currentPathEntry); + } + case PS_InRootName: + // The only valid state transition from Root Name is BeforeBegin + return MakeState(PS_BeforeBegin); + case PS_BeforeBegin: + AZ_Assert(false, "Path Parser cannot be decremented when it is in the BeforeBegin State"); + } + } + + //! Return a view of the current element in the path processor state + constexpr AZStd::string_view operator*() const noexcept + { + switch (m_parser_state) + { + case PS_BeforeBegin: + [[fallthrough]]; + case PS_AtEnd: + [[fallthrough]]; + case PS_InRootDir: + return m_preferred_separator == '/' ? "/" : "\\"; + case PS_InRootName: + case PS_InFilenames: + return m_path_raw_entry; + default: + AZ_Assert(false, "Path Parser is in an invalid state"); + } + return {}; + } + + constexpr explicit operator bool() const noexcept + { + return m_parser_state != PS_BeforeBegin && m_parser_state != PS_AtEnd; + } + + constexpr PathParser& operator++() noexcept + { + Increment(); + return *this; + } + + constexpr PathParser& operator--() noexcept + { + Decrement(); + return *this; + } + + constexpr bool AtEnd() const noexcept + { + return m_parser_state == PS_AtEnd; + } + + constexpr bool InRootDir() const noexcept + { + return m_parser_state == PS_InRootDir; + } + + constexpr bool InRootName() const noexcept + { + return m_parser_state == PS_InRootName; + } + + constexpr bool InRootPath() const noexcept + { + return InRootName() || InRootDir(); + } + + private: + constexpr void MakeState(ParserState newState, typename AZStd::string_view::iterator start, typename AZStd::string_view::iterator end) noexcept + { + m_parser_state = newState; + m_path_raw_entry = AZStd::string_view(start, end); + } + constexpr void MakeState(ParserState newState) noexcept + { + m_parser_state = newState; + m_path_raw_entry = {}; + } + + //! Return a pointer to the first character after the currently lexed element. + constexpr typename AZStd::string_view::iterator getNextTokenStartPos() const noexcept + { + switch (m_parser_state) + { + case PS_BeforeBegin: + return m_path_view.begin(); + case PS_InRootName: + case PS_InRootDir: + case PS_InFilenames: + return m_path_raw_entry.end(); + case PS_AtEnd: + return m_path_view.end(); + default: + AZ_Assert(false, "Path Parser is in an invalid state"); + } + return m_path_view.end(); + } + + //! Return a pointer to the first character in the currently lexed element. + constexpr typename AZStd::string_view::iterator getCurrentTokenStartPos() const noexcept + { + switch (m_parser_state) + { + case PS_BeforeBegin: + case PS_InRootName: + return m_path_view.begin(); + case PS_InRootDir: + case PS_InFilenames: + return m_path_raw_entry.begin(); + case PS_AtEnd: + return m_path_view.end(); + default: + AZ_Assert(false, "Path Parser is in an invalid state"); + } + return m_path_view.end(); + } + }; + + constexpr string_view_pair SeparateFilename(const AZStd::string_view& srcView) + { + if (srcView == "." || srcView == ".." || srcView.empty()) + { + return string_view_pair{ srcView, "" }; + } + auto pos = srcView.find_last_of('.'); + if (pos == AZStd::string_view::npos || pos == 0) + { + return string_view_pair{ srcView, AZStd::string_view{} }; + } + return string_view_pair{ srcView.substr(0, pos), srcView.substr(pos) }; + } + + + // path part consumption + constexpr bool ConsumeRootName(PathParser* pathParser) + { + static_assert(PS_BeforeBegin == 1 && PS_InRootName == 2, + "PathParser must be in state before begin or in the root name in order to consume the root name"); + while (pathParser->m_parser_state <= PS_InRootName) + { + ++(*pathParser); + } + return pathParser->m_parser_state == PS_AtEnd; + } + constexpr bool ConsumeRootDir(PathParser* pathParser) + { + static_assert(PS_BeforeBegin == 1 && PS_InRootName == 2 && PS_InRootDir == 3, + "PathParser must be in state before begin, in the root name or in the root directory in order to consume the root directory"); + while (pathParser->m_parser_state <= PS_InRootDir) + { + ++(*pathParser); + } + return pathParser->m_parser_state == PS_AtEnd; + } + + // path.comparisons + constexpr int CompareRootName(PathParser* lhsPathParser, PathParser* rhsPathParser) + { + if (!lhsPathParser->InRootName() && !rhsPathParser->InRootName()) + { + return 0; + } + + auto GetRootName = [](PathParser* pathParser) constexpr -> AZStd::string_view + { + return pathParser->InRootName() ? **pathParser : ""; + }; + int res = Internal::ComparePathSegment(GetRootName(lhsPathParser), GetRootName(rhsPathParser), lhsPathParser->m_preferred_separator); + ConsumeRootName(lhsPathParser); + ConsumeRootName(rhsPathParser); + return res; + } + constexpr int CompareRootDir(PathParser* lhsPathParser, PathParser* rhsPathParser) + { + if (!lhsPathParser->InRootDir() && rhsPathParser->InRootDir()) + { + return -1; + } + else if (lhsPathParser->InRootDir() && !rhsPathParser->InRootDir()) + { + return 1; + } + else + { + ConsumeRootDir(lhsPathParser); + ConsumeRootDir(rhsPathParser); + return 0; + } + } + constexpr int CompareRelative(PathParser* lhsPathParserPtr, PathParser* rhsPathParserPtr) + { + auto& lhsPathParser = *lhsPathParserPtr; + auto& rhsPathParser = *rhsPathParserPtr; + + while (lhsPathParser && rhsPathParser) + { + if (int res = Internal::ComparePathSegment(*lhsPathParser, *rhsPathParser, lhsPathParser.m_preferred_separator); + res != 0) + { + return res; + } + ++lhsPathParser; + ++rhsPathParser; + } + return 0; + } + constexpr int CompareEndState(PathParser* lhsPathParser, PathParser* rhsPathParser) + { + if (lhsPathParser->AtEnd() && !rhsPathParser->AtEnd()) + { + return -1; + } + else if (!lhsPathParser->AtEnd() && rhsPathParser->AtEnd()) + { + return 1; + } + return 0; + } + + constexpr int DetermineLexicalElementCount(PathParser pathParser) + { + int count = 0; + for (; pathParser; ++pathParser) + { + auto pathElement = *pathParser; + if (pathElement == "..") + { + --count; + } + else if (pathElement != "." && pathElement != "") + { + ++count; + } + } + return count; + } + + enum class PathPartKind : uint8_t + { + PK_None, + PK_RootName, + PK_RootSep, + PK_Filename, + PK_Dot, + PK_DotDot, + }; + + constexpr PathPartKind ClassifyPathPart(const PathParser& parser) + { + // Check each parser state to determine the PathPartKind + if (parser.m_parser_state == PS_InRootDir) + { + return PathPartKind::PK_RootSep; + } + if (parser.m_parser_state == PS_InRootName) + { + return PathPartKind::PK_RootName; + } + + // Fallback to checking parser pathEntry view value + // to determine if the special "." or ".." values are being used + AZStd::string_view pathPart = *parser; + if (pathPart == ".") + { + return PathPartKind::PK_Dot; + } + if (pathPart == "..") + { + return PathPartKind::PK_DotDot; + } + + // Return PathPartKind of PK_ilename if the parser state doesn't match + // the states of InRootDir or InRootName and the filename + // isn't made up of the special directory values of "." and ".." + return PathPartKind::PK_Filename; + } +} diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake index b2ef586053..a41107e539 100644 --- a/Code/Framework/AzCore/AzCore/azcore_files.cmake +++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake @@ -176,6 +176,8 @@ set(FILES IO/Path/Path.cpp IO/Path/Path.h IO/Path/Path.inl + IO/Path/PathIterable.inl + IO/Path/PathParser.inl IO/Path/Path_fwd.h IO/SystemFile.cpp IO/SystemFile.h diff --git a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp index 2fca03bc59..dbdb4fee78 100644 --- a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp +++ b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp @@ -56,7 +56,7 @@ namespace UnitTest } - // filesystem::path::is_absolute test + // PathView::IsAbsolute test TEST_F(PathFixture, IsAbsolute_ReturnsTrue) { using fixed_max_path = AZ::IO::FixedMaxPath; @@ -88,7 +88,7 @@ namespace UnitTest static_assert(IsAbsolute()); } - // filesystem::path::is_relative test + // PathView::isRelative test TEST_F(PathFixture, IsRelative_ReturnsTrue) { using fixed_max_path = AZ::IO::FixedMaxPath; @@ -573,7 +573,16 @@ namespace UnitTest PathLexicallyNormalParams{ '/', "foo/./bar/..", "foo" }, PathLexicallyNormalParams{ '/', "foo/.///bar/../", "foo" }, PathLexicallyNormalParams{ '/', R"(/foo\./bar\..\)", "/foo" }, - PathLexicallyNormalParams{ '\\', R"(C:/O3DE/dev/Cache\game/../pc)", R"(C:\O3DE\dev\Cache\pc)" } + PathLexicallyNormalParams{ '/', R"(/..)", "/" }, + PathLexicallyNormalParams{ '\\', R"(C:/O3DE/dev/Cache\game/../pc)", R"(C:\O3DE\dev\Cache\pc)" }, + PathLexicallyNormalParams{ '\\', R"(C:/foo/C:bar)", R"(C:\foo\bar)" }, + PathLexicallyNormalParams{ '\\', R"(C:foo/C:bar)", R"(C:foo\bar)" }, + PathLexicallyNormalParams{ '\\', R"(C:/foo/C:/bar)", R"(C:\bar)" }, + PathLexicallyNormalParams{ '\\', R"(C:/foo/C:)", R"(C:\foo)" }, + PathLexicallyNormalParams{ '\\', R"(C:/foo/C:/)", R"(C:\)" }, + PathLexicallyNormalParams{ '\\', R"(C:/foo/D:bar)", R"(D:bar)" }, + PathLexicallyNormalParams{ '\\', R"(..)", R"(..)" }, + PathLexicallyNormalParams{ '\\', R"(foo/../../bar)", R"(..\bar)" } ) ); @@ -641,7 +650,12 @@ namespace UnitTest PathViewLexicallyProximateParams{ '\\', "C:\\a\\b", "C:\\a\\d\\c", "..\\..\\b", false }, PathViewLexicallyProximateParams{ '\\', "C:a\\b", "C:\\a\\b", "C:a\\b", false }, PathViewLexicallyProximateParams{ '\\', "C:\\a\\b", "C:a\\b", "C:\\a\\b", false }, - PathViewLexicallyProximateParams{ '\\', "E:\\a\\b", "F:\\a\\b", "E:\\a\\b", false } + PathViewLexicallyProximateParams{ '\\', "E:\\a\\b", "F:\\a\\b", "E:\\a\\b", false }, + PathViewLexicallyProximateParams{ '\\', "D:/o3de/proJECT/cache/asset.txt", "d:\\o3de\\Project\\Cache", "asset.txt", true }, + PathViewLexicallyProximateParams{ '\\', "D:/o3de/proJECT/cache/pc/..", "d:\\o3de\\Project\\Cache", "pc\\..", true }, + PathViewLexicallyProximateParams{ '\\', "D:/o3de/proJECT/cache/pc/asset.txt/..", "d:\\o3de\\Project\\Cache\\", "pc\\asset.txt\\..", true }, + PathViewLexicallyProximateParams{ '\\', "D:/o3de/proJECT/cache\\", "D:\\o3de\\Project\\Cache/", ".", true }, + PathViewLexicallyProximateParams{ '\\', "D:/o3de/proJECT/cache/../foo", "D:\\o3de\\Project\\Cache", "..\\foo", false } ) ); diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp index e125cc1df6..012d713cf5 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp @@ -1912,7 +1912,7 @@ namespace AZ::IO return m_pFileEntry->nFileDataOffset; } - bool Archive::MakeDir(AZStd::string_view szPathIn, [[maybe_unused]] bool bGamePathMapping) + bool Archive::MakeDir(AZStd::string_view szPathIn) { AZ::IO::StackString pathStr{ szPathIn }; // Determine if there is a period ('.') after the last slash to determine if the path contains a file. @@ -2327,7 +2327,9 @@ namespace AZ::IO // we only want to record ASSET access // assets are identified as things which start with no alias, or with the @assets@ alias auto assetPath = AZ::IO::FileIOBase::GetInstance()->ConvertToAlias(szFilename); - if (assetPath && assetPath->Native().starts_with("@assets@")) + if (assetPath && (assetPath->Native().starts_with("@assets@") + || assetPath->Native().starts_with("@root@") + || assetPath->Native().starts_with("@projectplatformcache@"))) { IResourceList* pList = GetResourceList(m_eRecordFileOpenList); diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.h b/Code/Framework/AzFramework/AzFramework/Archive/Archive.h index bd10387d17..ec964f7fa3 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.h @@ -249,7 +249,7 @@ namespace AZ::IO IArchive::SignedFileSize GetFileSizeOnDisk(AZStd::string_view filename) override; // creates a directory - bool MakeDir(AZStd::string_view szPath, bool bGamePathMapping = false) override; + bool MakeDir(AZStd::string_view szPath) override; // compresses the raw data into raw data. The buffer for compressed data itself with the heap passed. Uses method 8 (deflate) // returns one of the Z_* errors (Z_OK upon success) diff --git a/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h index 14a810e2cf..5ac417564a 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h @@ -335,7 +335,7 @@ namespace AZ::IO virtual IArchive::SignedFileSize GetFileSizeOnDisk(AZStd::string_view filename) = 0; // creates a directory - virtual bool MakeDir(AZStd::string_view szPath, bool bGamePathMapping = false) = 0; + virtual bool MakeDir(AZStd::string_view szPath) = 0; // open the physical archive file - creates if it doesn't exist // returns NULL if it's invalid or can't open the file diff --git a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp index 55e4f06db0..50190ac7d5 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp @@ -287,11 +287,8 @@ namespace AZ const char* assetAliasPath = GetAlias("@assets@"); if (path && assetAliasPath) { - AZStd::string assetsAlias(assetAliasPath); - AZStd::string pathString = path; - AZStd::to_lower(assetsAlias.begin(), assetsAlias.end()); - AZStd::to_lower(pathString.begin(), pathString.end()); - if (AZ::IO::PathView(pathString.c_str()).IsRelativeTo(assetsAlias.c_str())) + const AZ::IO::PathView pathView(path); + if (pathView.IsRelativeTo(assetAliasPath)) { AZ_Error("FileIO", false, "You may not alter data inside the asset cache. Please check the call stack and consider writing into the source asset folder instead.\n" "Attempted write location: %s", path); @@ -587,26 +584,11 @@ namespace AZ // strings that are shorter than the alias's mapped path without checking. if ((longestMatch == 0) || (resolvedAlias.size() > longestMatch) && (resolvedAlias.size() <= bufStringLength)) { - // custom strcmp that ignores slash directions - constexpr AZStd::string_view pathSeparators{ "/\\" }; - bool allMatch = AZStd::equal(resolvedAlias.begin(), resolvedAlias.end(), inBuffer.begin(), - [&pathSeparators](const char lhs, const char rhs) + // Check if the input path is relative to the alias value + if (AZ::IO::PathView(inBuffer).IsRelativeTo(AZ::IO::PathView(resolvedAlias))) { - const bool lhsIsSeparator = pathSeparators.find_first_of(lhs) != AZStd::string_view::npos; - const bool rhsIsSeparator = pathSeparators.find_first_of(lhs) != AZStd::string_view::npos; - return (lhsIsSeparator && rhsIsSeparator) || tolower(lhs) == tolower(rhs); - }); - - if (allMatch) - { - // Either the resolvedAlias path must match the path exactly or the path must have a path separator character - // right after the resolved alias - if (const size_t matchLen = resolvedAlias.size(); - matchLen == bufStringLength || (pathSeparators.find_first_of(inBuffer[matchLen]) != AZStd::string_view::npos)) - { - longestMatch = matchLen; - longestAlias = alias; - } + longestMatch = resolvedAlias.size(); + longestAlias = alias; } } } @@ -712,6 +694,7 @@ namespace AZ const char* assetAliasPath = GetAlias("@assets@"); const char* rootAliasPath = GetAlias("@root@"); const char* projectPlatformCacheAliasPath = GetAlias("@projectplatformcache@"); + const bool lowercasePath = (assetAliasPath != nullptr && AZ::StringFunc::StartsWith(resolvedPath, assetAliasPath)) || (rootAliasPath != nullptr && AZ::StringFunc::StartsWith(resolvedPath, rootAliasPath)) || (projectPlatformCacheAliasPath != nullptr && AZ::StringFunc::StartsWith(resolvedPath, projectPlatformCacheAliasPath)); diff --git a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp index 6a359e714c..f3764a5e96 100644 --- a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp +++ b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp @@ -608,6 +608,9 @@ namespace UnitTest archive->ClosePack(genericArchiveFileName); cpfio.Remove(genericArchiveFileName); + // create the asset alias directory + cpfio.CreatePath("@assets@"); + // create generic file HandleType normalFileHandle; @@ -848,13 +851,17 @@ namespace UnitTest const char *assetsPath = ioBase->GetAlias("@assets@"); ASSERT_NE(nullptr, assetsPath); - AZStd::string stringToAdd = AZStd::string::format("%s/textures/test.dds", assetsPath); + auto stringToAdd = AZ::IO::Path(assetsPath) / "textures" / "test.dds"; reslist->Clear(); - reslist->Add(stringToAdd.c_str()); + reslist->Add(stringToAdd.Native()); // it normalizes the string, so the slashes flip and everything is lowercased. - EXPECT_STREQ(reslist->GetFirst(), "@assets@/textures/test.dds"); + AZ::IO::FixedMaxPath resolvedAddedPath; + AZ::IO::FixedMaxPath resolvedResourcePath; + EXPECT_TRUE(ioBase->ReplaceAlias(resolvedAddedPath, "@assets@/textures/test.dds")); + EXPECT_TRUE(ioBase->ReplaceAlias(resolvedResourcePath, reslist->GetFirst())); + EXPECT_EQ(resolvedAddedPath, resolvedResourcePath); reslist->Clear(); } diff --git a/Code/Legacy/CryCommon/Mocks/ICryPakMock.h b/Code/Legacy/CryCommon/Mocks/ICryPakMock.h index 94ffbf6f6d..ab3b3875af 100644 --- a/Code/Legacy/CryCommon/Mocks/ICryPakMock.h +++ b/Code/Legacy/CryCommon/Mocks/ICryPakMock.h @@ -70,7 +70,7 @@ struct CryPakMock MOCK_METHOD2(IsFileExist, bool(AZStd::string_view sFilename, EFileSearchLocation)); MOCK_METHOD1(IsFolder, bool(AZStd::string_view sPath)); MOCK_METHOD1(GetFileSizeOnDisk, AZ::IO::IArchive::SignedFileSize(AZStd::string_view filename)); - MOCK_METHOD2(MakeDir, bool(AZStd::string_view szPath, bool bGamePathMapping)); + MOCK_METHOD1(MakeDir, bool(AZStd::string_view szPath)); MOCK_METHOD4(OpenArchive, AZStd::intrusive_ptr (AZStd::string_view szPath, AZStd::string_view bindRoot, uint32_t nFlags, AZStd::intrusive_ptr pData)); MOCK_METHOD1(GetFileArchivePath, const char* (AZ::IO::HandleType f)); MOCK_METHOD5(RawCompress, int(const void* pUncompressed, size_t* pDestSize, void* pCompressed, size_t nSrcSize, int nLevel)); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp index fe1fd99f4e..1a97032864 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/CommonFiles/Preprocessor.cpp @@ -14,11 +14,11 @@ #include #include #include +#include #include #include #include -#include #include #include @@ -56,7 +56,7 @@ namespace AZ m_predefinedMacros.begin(), m_predefinedMacros.end(), [&](const AZStd::string& predefinedMacro) { // Haystack, needle, bCaseSensitive - if (!AzFramework::StringFunc::StartsWith(predefinedMacro, macroName, true)) + if (!AZ::StringFunc::StartsWith(predefinedMacro, macroName, true)) { return false; } @@ -117,11 +117,11 @@ namespace AZ char localBuffer[DefaultFprintfBufferSize]; va_list args; - + va_start(args, format); int count = azvsnprintf(localBuffer, DefaultFprintfBufferSize, format, args); va_end(args); - + char* result = localBuffer; // @result will be bound to @biggerData in case @localBuffer is not big enough. @@ -134,7 +134,7 @@ namespace AZ count++; // vsnprintf returns a size that doesn't include the null character. biggerData.reset(new char[count]); result = &biggerData[0]; - + // Remark: for MacOS & Linux it is important to call va_start again before // each call to azvsnprintf. Not required for Windows. va_start(args, format); @@ -149,7 +149,7 @@ namespace AZ // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l?view=msvc-160 // In particular: "If the number of characters to write is greater than count, // these functions return -1 indicating that output has been truncated." - + // There wasn't enough space in the local store. // Remark: for MacOS & Linux it is important to call va_start again before // each call to azvsnprintf. Not required for Windows. @@ -157,10 +157,10 @@ namespace AZ count = azvscprintf(format, args); count += 1; // vscprintf returns a size that doesn't include the null character. va_end(args); - + biggerData.reset(new char[count]); result = &biggerData[0]; - + va_start(args, format); count = azvsnprintf(result, count, format, args); va_end(args); @@ -191,7 +191,7 @@ namespace AZ // definitions for the linker AZStd::mutex McppBinder::s_mcppExclusiveProtection; - McppBinder* McppBinder::s_currentInstance = nullptr; + McppBinder* McppBinder::s_currentInstance = nullptr; // McppBinder ends /////////////////////////////////////////////////////////////////////// @@ -204,7 +204,7 @@ namespace AZ // create the argc/argv const char* processName = "builder"; - const char* inputPath = fullPath.c_str(); + const char* inputPath = fullPath.c_str(); // let's create the equivalent of that expression but in dynamic form: //const char* argv[] = { processName, szInPath, "-C", "-+", "-D macro1"..., "-I path"..., NULL }; AZStd::vector< const char* > argv; @@ -230,7 +230,7 @@ namespace AZ argv.push_back(nullptr); // usual argv terminator // output the command line: AZStd::string stringifiedCommandLine; - AzFramework::StringFunc::Join(stringifiedCommandLine, argv.begin(), argv.end() - 1, " "); + AZ::StringFunc::Join(stringifiedCommandLine, argv.begin(), argv.end() - 1, " "); AZ_TracePrintf("Preprocessor", "%s", stringifiedCommandLine.c_str()); // when we don't specify an -o outfile, mcpp uses stdout. // the trick is that since we hijacked putc & puts, stdout will not be written. @@ -238,17 +238,12 @@ namespace AZ return result; } - static void VerifySameFolder(const AZStd::string& path1, const AZStd::string& path2) + static void VerifySameFolder([[maybe_unused]] AZStd::string_view path1, [[maybe_unused]] AZStd::string_view path2) { - AZStd::string folder1, folder2; - AzFramework::StringFunc::Path::GetFolderPath(path1.c_str(), folder1); - AzFramework::StringFunc::Path::GetFolderPath(path2.c_str(), folder2); - AzFramework::StringFunc::Path::Normalize(folder1); - AzFramework::StringFunc::Path::Normalize(folder2); AZ_Warning("Preprocessing", - folder1 == folder2, - "The preprocessed file %s is in a different folder than its origin %s. Watch for #include problems with relative paths.", - path1.c_str(), path2.c_str() + AZ::IO::PathView(path1).ParentPath().LexicallyNormal() == AZ::IO::PathView(path2).ParentPath().LexicallyNormal(), + "The preprocessed file %.*s is in a different folder than its origin %.*s. Watch for #include problems with relative paths.", + AZ_STRING_ARG(path1), AZ_STRING_ARG(path2) ); } @@ -260,7 +255,7 @@ namespace AZ // containing file names, to match the ORIGINAL source, and not the actual source in use by azslc. // That gymnastic is better for error messages anyway, so instead of making the SRG layout builder more intelligent, // we'll fake the origin of the file, by setting the original source as a filename - // note that it is not possible to build a file in a different folder and fake it to a file eslewhere because relative includes will fail. + // note that it is not possible to build a file in a different folder and fake it to a file elsewhere because relative includes will fail. void MutateLineDirectivesFileOrigin( AZStd::string& sourceCode, AZStd::string newFileOrigin) @@ -272,11 +267,11 @@ namespace AZ // we will use that as the information of the source path to mutate. if (sourceCode.starts_with("#line")) { - auto firstQuote = sourceCode.find('"'); - auto secondQuote = sourceCode.find('"', firstQuote + 1); + auto firstQuote = sourceCode.find('"'); + auto secondQuote = firstQuote != AZStd::string::npos ? sourceCode.find('"', firstQuote + 1) : AZStd::string::npos; auto originalFile = sourceCode.substr(firstQuote + 1, secondQuote - firstQuote - 1); // start +1, count -1 because we don't want the quotes included. VerifySameFolder(originalFile, newFileOrigin); - [[maybe_unused]] bool didReplace = AzFramework::StringFunc::Replace(sourceCode, originalFile.c_str(), newFileOrigin.c_str(), true /*case sensitive*/); + [[maybe_unused]] bool didReplace = AZ::StringFunc::Replace(sourceCode, originalFile.c_str(), newFileOrigin.c_str(), true /*case sensitive*/); AZ_Assert(didReplace, "Failed to replace %s for %s in preprocessed source.", originalFile.c_str(), newFileOrigin.c_str()); } else @@ -285,26 +280,6 @@ namespace AZ } } - namespace - { - template< typename Container1, typename Container2 > - void TransferContent(Container1& destination, Container2&& source) - { - destination.insert(AZStd::end(destination), - AZStd::make_move_iterator(AZStd::begin(source)), - AZStd::make_move_iterator(AZStd::end(source))); - } - - void DeleteFromSet(const AZStd::string& string, AZStd::set& set) - { - auto iter = set.find(string); - if (iter != set.end()) - { - set.erase(iter); - } - } - } - // populate options with scan folders and contents of parsing shader_global_build_options.json void InitializePreprocessorOptions( PreprocessorOptions& options, [[maybe_unused]] const char* builderName, const char* optionalIncludeFolder) @@ -315,44 +290,61 @@ namespace AZ bool success = true; AZStd::vector scanFoldersVector; AzToolsFramework::AssetSystemRequestBus::BroadcastResult(success, - &AzToolsFramework::AssetSystemRequestBus::Events::GetScanFolders, - scanFoldersVector); + &AzToolsFramework::AssetSystemRequestBus::Events::GetScanFolders, + scanFoldersVector); AZ_Warning(builderName, success, "Preprocessor option: Could not acquire a list of scan folders from the database."); - // we transfer to a set, to order the folders, uniquify them, and ensure deterministic build behavior - AZStd::set scanFoldersSet; // Add the project path to list of include paths - AZ::IO::FixedMaxPathString projectPath = AZ::Utils::GetProjectPath(); - scanFoldersSet.emplace(projectPath.c_str(), projectPath.size()); + AZ::IO::FixedMaxPath projectPath = AZ::Utils::GetProjectPath(); + auto FindPath = [](AZ::IO::PathView searchPath) + { + return [searchPath](AZStd::string_view includePathView) + { + return searchPath == AZ::IO::PathView(includePathView); + }; + }; + if (auto it = AZStd::find_if(options.m_projectIncludePaths.begin(), options.m_projectIncludePaths.end(), FindPath(projectPath)); + it == options.m_projectIncludePaths.end()) + { + options.m_projectIncludePaths.emplace_back(projectPath.c_str(), projectPath.Native().size()); + } if (optionalIncludeFolder) { - scanFoldersSet.emplace(optionalIncludeFolder, strnlen(optionalIncludeFolder, AZ::IO::MaxPathLength)); + if (auto it = AZStd::find_if(options.m_projectIncludePaths.begin(), options.m_projectIncludePaths.end(), FindPath(optionalIncludeFolder)); + it == options.m_projectIncludePaths.end()) + { + if (AZ::IO::SystemFile::Exists(optionalIncludeFolder)) + { + options.m_projectIncludePaths.emplace_back(AZStd::move(AZ::IO::Path(optionalIncludeFolder).LexicallyNormal().Native())); + } + } } // but while we transfer to the set, we're going to keep only folders where +/ShaderLib exists - for (AZStd::string folder : scanFoldersVector) + for (AZ::IO::Path shaderScanFolder : scanFoldersVector) { - AzFramework::StringFunc::Path::Join(folder.c_str(), "ShaderLib", folder); - if (AZ::IO::SystemFile::Exists(folder.c_str())) + shaderScanFolder /= "ShaderLib"; + if (auto it = AZStd::find_if(options.m_projectIncludePaths.begin(), options.m_projectIncludePaths.end(), FindPath(shaderScanFolder)); + it == options.m_projectIncludePaths.end()) { - scanFoldersSet.emplace(std::move(folder)); + // the folders constructed this fashion constitute the base of automatic include search paths + if (AZ::IO::SystemFile::Exists(shaderScanFolder.c_str())) + { + options.m_projectIncludePaths.emplace_back(AZStd::move(shaderScanFolder.LexicallyNormal().Native())); + } } - } // the folders constructed this fashion constitute the base of automatic include search paths - - // get the engine root: - AZ::IO::FixedMaxPath engineRoot = AZ::Utils::GetEnginePath(); - - // add optional additional options - for (AZStd::string& path : options.m_projectIncludePaths) - { - path = (engineRoot / path).String(); - DeleteFromSet(path, scanFoldersSet); // no need to add a path two times. } - // back-insert the default paths (after the config-read paths we just read) - TransferContent(/*to:*/options.m_projectIncludePaths, /*from:*/scanFoldersSet); + // finally the /Gems fallback - AZStd::string gemsFolder; - AzFramework::StringFunc::Path::Join(engineRoot.c_str(), "Gems", gemsFolder); - options.m_projectIncludePaths.push_back(gemsFolder); + AZ::IO::Path engineGemsFolder(AZStd::string_view{ AZ::Utils::GetEnginePath() }); + engineGemsFolder /= "Gems"; + if (auto it = AZStd::find_if(options.m_projectIncludePaths.begin(), options.m_projectIncludePaths.end(), FindPath(engineGemsFolder)); + it == options.m_projectIncludePaths.end()) + { + if (AZ::IO::SystemFile::Exists(engineGemsFolder.c_str())) + { + options.m_projectIncludePaths.emplace_back(AZStd::move(engineGemsFolder.Native())); + } + } } } // namespace ShaderBuilder From d366620818760060093e1108904bdcb22a8f5308 Mon Sep 17 00:00:00 2001 From: bosnichd Date: Fri, 10 Sep 2021 09:08:07 -0600 Subject: [PATCH 234/355] More PAL related changes required for restricted platforms. (#4037) Signed-off-by: bosnichd --- .../WinAPI/AzCore/std/parallel/internal/thread_WinAPI.cpp | 6 ++---- .../Windows/AzCore/std/parallel/internal/thread_Windows.cpp | 3 ++- .../Code/Source/Platform/Windows/RHI/Device_Windows.cpp | 5 +++++ Gems/Atom/RHI/DX12/Code/Source/RHI/Device.cpp | 5 ----- Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp | 4 ++++ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/thread_WinAPI.cpp b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/thread_WinAPI.cpp index dfe265aaa5..c84b4ecd98 100644 --- a/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/thread_WinAPI.cpp +++ b/Code/Framework/AzCore/Platform/Common/WinAPI/AzCore/std/parallel/internal/thread_WinAPI.cpp @@ -15,7 +15,7 @@ namespace AZStd { namespace Platform { - void PostThreadRun(); + unsigned __stdcall PostThreadRun(); HANDLE CreateThread(unsigned stackSize, unsigned (__stdcall* threadRunFunction)(void*), AZStd::Internal::thread_info* ti, unsigned int* id); unsigned HardwareConcurrency(); void SetThreadName(HANDLE hThread, const char* threadName); @@ -40,9 +40,7 @@ namespace AZStd ThreadEventBus::Broadcast(&ThreadEventBus::Events::OnThreadExit, this_thread::get_id()); // goes to client listeners ThreadDrillerEventBus::Broadcast(&ThreadDrillerEventBus::Events::OnThreadExit, this_thread::get_id()); // goes to the profiler. - Platform::PostThreadRun(); - - return 0; + return Platform::PostThreadRun(); } /** diff --git a/Code/Framework/AzCore/Platform/Windows/AzCore/std/parallel/internal/thread_Windows.cpp b/Code/Framework/AzCore/Platform/Windows/AzCore/std/parallel/internal/thread_Windows.cpp index 246181334a..fd6e81e536 100644 --- a/Code/Framework/AzCore/Platform/Windows/AzCore/std/parallel/internal/thread_Windows.cpp +++ b/Code/Framework/AzCore/Platform/Windows/AzCore/std/parallel/internal/thread_Windows.cpp @@ -16,9 +16,10 @@ namespace AZStd { namespace Platform { - void PostThreadRun() + unsigned __stdcall PostThreadRun() { _endthreadex(0); + return 0; } HANDLE CreateThread(unsigned stackSize, unsigned (__stdcall* threadRunFunction)(void*), AZStd::Internal::thread_info* ti, unsigned int* id) diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp index 51272f3488..cb2b8d4ef8 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/Device_Windows.cpp @@ -325,5 +325,10 @@ namespace AZ return formatsList; } + + void Device::BeginFrameInternal() + { + m_commandQueueContext.Begin(); + } } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.cpp index 371aa20a84..82e4aba57c 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/Device.cpp @@ -189,11 +189,6 @@ namespace AZ m_commandQueueContext.UpdateCpuTimingStatistics(cpuTimingStatistics); } - void Device::BeginFrameInternal() - { - m_commandQueueContext.Begin(); - } - void Device::EndFrameInternal() { AZ_TRACE_METHOD(); diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp index 182edb1298..66b3f9623a 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/PipelineLibrary.cpp @@ -262,7 +262,11 @@ namespace AZ bool PipelineLibrary::IsMergeRequired() const { +#if defined (AZ_DX12_USE_PIPELINE_LIBRARY) return !m_pipelineStates.empty(); +#else + return false; +#endif } } } From 81749ac31870eee58ecd860d4d2556b4014a6625 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 08:41:19 -0700 Subject: [PATCH 235/355] Improves numeric_cast compilation (#3995) * Improves numeric_cast compilation: before: 872s after: 824s (5.5% reduction) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../AzCore/AzCore/Casting/numeric_cast.h | 102 ++++-------------- .../AzCore/Casting/numeric_cast_internal.h | 81 ++++++++++++++ .../Serialization/Json/CastingHelpers.h | 8 +- .../AzCore/AzCore/azcore_files.cmake | 1 + .../Components/FancyDocking.cpp | 1 + .../Components/Widgets/GradientSlider.cpp | 2 +- 6 files changed, 106 insertions(+), 89 deletions(-) create mode 100644 Code/Framework/AzCore/AzCore/Casting/numeric_cast_internal.h diff --git a/Code/Framework/AzCore/AzCore/Casting/numeric_cast.h b/Code/Framework/AzCore/AzCore/Casting/numeric_cast.h index 4cfe3a3d8d..c31a2e2f32 100644 --- a/Code/Framework/AzCore/AzCore/Casting/numeric_cast.h +++ b/Code/Framework/AzCore/AzCore/Casting/numeric_cast.h @@ -8,14 +8,25 @@ #pragma once +// This is disabled by default because it puts in costly runtime checking of casted values. +// You can either change it here to enable it across the engine, or use push/pop_macro to enable per file/feature. +// Note that if using push/pop_macro, you may get some of the functions not inline and the definition coming from +// another compilation unit, in such case, you will have to push/pop_macro on that compilation unit as well. +// #define AZ_NUMERICCAST_ENABLED 1 + +#if !AZ_NUMERICCAST_ENABLED + +#define aznumeric_cast static_cast + +#else + +#include #include #include #include #include #include -#include #include -#include #include #include #include @@ -28,7 +39,7 @@ // enabled. // // Because we can't do partial function specialization, I'm using enable_if to chop up the implementation into one of these -// implementations. If none of these fit, then we will get a compile error because it is an unknown conversionr. +// implementations. If none of these fit, then we will get a compile error because it is an unknown conversion. // //-------------------------------------------- // TYPE <- TYPE DigitLoss @@ -51,85 +62,7 @@ // (K) Floating Floating Y */ -// This is disabled by default because it puts in costly runtime checking of casted values. -// You can either change it here to enable it across the engine, or use push/pop_macro to enable per file/feature. -// Note that if using push/pop_macro, you may get some of the functions not inline and the definition coming from -// another compilation unit, in such case, you will have to push/pop_macro on that compilation unit as well. -// #define AZ_NUMERICCAST_ENABLED 1 - -#if AZ_NUMERICCAST_ENABLED #define AZ_NUMERIC_ASSERT(expr, ...) AZ_Assert(expr, __VA_ARGS__) -#else -#define AZ_NUMERIC_ASSERT(expr, ...) void(0) -#endif - -#pragma push_macro("max") -#undef max - -namespace NumericCastInternal -{ - template - inline constexpr typename AZStd::enable_if< - !AZStd::is_integral::value || !AZStd::is_floating_point::value - , bool> ::type UnderflowsToType(const FromType& value) - { - return (value < static_cast(std::numeric_limits::lowest())); - } - - template - inline constexpr typename AZStd::enable_if< - AZStd::is_integral::value && AZStd::is_floating_point::value - , bool> ::type UnderflowsToType(const FromType& value) - { - return (static_cast(value) < std::numeric_limits::lowest()); - } - - template - inline constexpr typename AZStd::enable_if< - !AZStd::is_integral::value || !AZStd::is_floating_point::value - , bool> ::type OverflowsToType(const FromType& value) - { - return (value > static_cast(std::numeric_limits::max())); - } - - template - inline constexpr typename AZStd::enable_if< - AZStd::is_integral::value && AZStd::is_floating_point::value - , bool> ::type OverflowsToType(const FromType& value) - { - return (static_cast(value) > std::numeric_limits::max()); - } - - template - inline constexpr typename AZStd::enable_if< - AZStd::is_integral::value && AZStd::is_integral::value - && std::numeric_limits::digits <= std::numeric_limits::digits - && AZStd::is_signed::value && AZStd::is_unsigned::value - , bool> ::type FitsInToType(const FromType& value) - { - return !NumericCastInternal::UnderflowsToType(value); - } - - template - inline constexpr typename AZStd::enable_if< - AZStd::is_integral::value && AZStd::is_integral::value - && (std::numeric_limits::digits > std::numeric_limits::digits) - && AZStd::is_unsigned::value - , bool> ::type FitsInToType(const FromType& value) - { - return !NumericCastInternal::OverflowsToType(value); - } - - template - inline constexpr typename AZStd::enable_if< - (!AZStd::is_integral::value || !AZStd::is_integral::value) - || ((std::numeric_limits::digits <= std::numeric_limits::digits) && (AZStd::is_unsigned::value || AZStd::is_signed::value)) - || ((std::numeric_limits::digits > std::numeric_limits::digits) && AZStd::is_signed::value) - , bool> ::type FitsInToType(const FromType& value) - { - return !NumericCastInternal::OverflowsToType(value) && !NumericCastInternal::UnderflowsToType(value); - } -} // namespace AZ // INTEGER -> INTEGER // (A) Not losing digits or risking sign loss @@ -276,8 +209,10 @@ inline constexpr auto aznumeric_cast(FromType&& value) -> return static_cast(value); } +#endif + // This is a helper class that lets us induce the destination type of a numeric cast -// It should never be directly used by anything other than azlossy_caster. +// It should never be directly used by anything other than aznumeric_caster. namespace AZ { template @@ -295,7 +230,7 @@ namespace AZ FromType m_value; }; -} +} // namespace AZ // This is the primary function we should use when doing numeric casting, since it induces the // type we need to cast to from the code rather than requiring an explicit coupling in the source. @@ -305,4 +240,3 @@ inline constexpr AZ::NumericCasted aznumeric_caster(FromType value) return AZ::NumericCasted(value); } -#pragma pop_macro("max") diff --git a/Code/Framework/AzCore/AzCore/Casting/numeric_cast_internal.h b/Code/Framework/AzCore/AzCore/Casting/numeric_cast_internal.h new file mode 100644 index 0000000000..ee2f91e95a --- /dev/null +++ b/Code/Framework/AzCore/AzCore/Casting/numeric_cast_internal.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace NumericCastInternal +{ + template + inline constexpr typename AZStd::enable_if::value || !AZStd::is_floating_point::value, bool>::type + UnderflowsToType(const FromType& value) + { + return (value < static_cast(std::numeric_limits::lowest())); + } + + template + inline constexpr typename AZStd::enable_if::value && AZStd::is_floating_point::value, bool>::type + UnderflowsToType(const FromType& value) + { + return (static_cast(value) < std::numeric_limits::lowest()); + } + + template + inline constexpr typename AZStd::enable_if::value || !AZStd::is_floating_point::value, bool>::type + OverflowsToType(const FromType& value) + { + return (value > static_cast(std::numeric_limits::max())); + } + + template + inline constexpr typename AZStd::enable_if::value && AZStd::is_floating_point::value, bool>::type + OverflowsToType(const FromType& value) + { + return (static_cast(value) > std::numeric_limits::max()); + } + + template + inline constexpr typename AZStd::enable_if< + AZStd::is_integral::value && AZStd::is_integral::value && + std::numeric_limits::digits <= std::numeric_limits::digits && AZStd::is_signed::value && + AZStd::is_unsigned::value, + bool>::type + FitsInToType(const FromType& value) + { + return !NumericCastInternal::UnderflowsToType(value); + } + + template + inline constexpr typename AZStd::enable_if< + AZStd::is_integral::value && AZStd::is_integral::value && + (std::numeric_limits::digits > std::numeric_limits::digits) && AZStd::is_unsigned::value, + bool>::type + FitsInToType(const FromType& value) + { + return !NumericCastInternal::OverflowsToType(value); + } + + template + inline constexpr typename AZStd::enable_if< + (!AZStd::is_integral::value || !AZStd::is_integral::value) || + ((std::numeric_limits::digits <= std::numeric_limits::digits) && + (AZStd::is_unsigned::value || AZStd::is_signed::value)) || + ((std::numeric_limits::digits > std::numeric_limits::digits) && AZStd::is_signed::value), + bool>::type + FitsInToType(const FromType& value) + { + return !NumericCastInternal::OverflowsToType(value) && !NumericCastInternal::UnderflowsToType(value); + } + +} diff --git a/Code/Framework/AzCore/AzCore/Serialization/Json/CastingHelpers.h b/Code/Framework/AzCore/AzCore/Serialization/Json/CastingHelpers.h index 36b0426a2d..bcd1a84d03 100644 --- a/Code/Framework/AzCore/AzCore/Serialization/Json/CastingHelpers.h +++ b/Code/Framework/AzCore/AzCore/Serialization/Json/CastingHelpers.h @@ -8,14 +8,14 @@ #pragma once -#include +#include #include #include #include namespace AZ { - //! A helper function to casts between numeric types, and consider the data which is being converted comse from user data. + //! A helper function to casts between numeric types, and consider the data which is being converted comes from user data. //! If a conversion from FromType to ToType will not cause overflow or underflow, the result is stored in result, and the function returns Success //! Otherwise, the target is left untouched. template @@ -24,9 +24,9 @@ namespace AZ { using namespace JsonSerializationResult; - if (NumericCastInternal::FitsInToType(value)) + if (NumericCastInternal::template FitsInToType(value)) { - result = aznumeric_cast(value); + result = static_cast(value); return reporting("Successfully cast number.", ResultCode(Tasks::Convert, Outcomes::Success), path); } else diff --git a/Code/Framework/AzCore/AzCore/azcore_files.cmake b/Code/Framework/AzCore/AzCore/azcore_files.cmake index a41107e539..6c498c3335 100644 --- a/Code/Framework/AzCore/AzCore/azcore_files.cmake +++ b/Code/Framework/AzCore/AzCore/azcore_files.cmake @@ -35,6 +35,7 @@ set(FILES Asset/AssetInternal/WeakAsset.h Casting/lossy_cast.h Casting/numeric_cast.h + Casting/numeric_cast_internal.h Component/Component.cpp Component/Component.h Component/ComponentApplication.cpp diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp index 4ced4ea635..d73ebbec28 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp @@ -9,6 +9,7 @@ #include #include +#include #include #include diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/GradientSlider.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/GradientSlider.cpp index 1ffff57ade..920ff17eac 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/GradientSlider.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/Widgets/GradientSlider.cpp @@ -114,7 +114,7 @@ void GradientSlider::mouseMoveEvent(QMouseEvent* event) { int intValue = Slider::valueFromPosition(this, event->pos(), width(), height(), rect().bottom()); - qreal value = (aznumeric_cast(intValue - minimum()) / aznumeric_cast(maximum() - minimum())); + qreal value = (aznumeric_cast(intValue - minimum()) / aznumeric_cast(maximum() - minimum())); const QString toolTipText = m_toolTipFunction(value); From 280796e1f4c916934c62dbdd0bb65d8717da1e2f Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Fri, 10 Sep 2021 11:59:20 -0500 Subject: [PATCH 236/355] Fix GHI 4041 Terrain Shader Crash (#4050) The terrain feature processor was crashing due to an invalid shader name. The shader name has been fixed, but the feature processor has also been hardened so that it no longer crashes if a shader fails to load. Also, while testing, this inadvertently exposed a second crash in EntitySerializer that occurs when components don't serialize in correctly. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> --- .../AzCore/AzCore/Component/EntitySerializer.cpp | 5 +++-- .../TerrainRenderer/TerrainFeatureProcessor.cpp | 14 +++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp index 803daf1373..1dd685f763 100644 --- a/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp +++ b/Code/Framework/AzCore/AzCore/Component/EntitySerializer.cpp @@ -84,8 +84,9 @@ namespace AZ static TypeId genericComponentWrapperTypeId("{68D358CA-89B9-4730-8BA6-E181DEA28FDE}"); for (auto& [componentKey, component] : componentMap) { - // if underlying type is genericComponentWrapperTypeId, the template is null and the component should not be addded - if (component->GetUnderlyingComponentType() != genericComponentWrapperTypeId) + // if the component didn't serialize (i.e. is null) or the underlying type is genericComponentWrapperTypeId, the + // template is null and the component should not be addded + if (component && (component->GetUnderlyingComponentType() != genericComponentWrapperTypeId)) { entityInstance->m_components.emplace_back(component); } diff --git a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp index f0743cfb52..511b206b84 100644 --- a/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp +++ b/Gems/Terrain/Code/Source/TerrainRenderer/TerrainFeatureProcessor.cpp @@ -66,7 +66,13 @@ namespace Terrain } void TerrainFeatureProcessor::ConfigurePipelineState(ShaderState& shaderState, bool assertOnFail) - { + { + if (shaderState.m_shader == nullptr) + { + AZ_Assert(shaderState.m_shader || !assertOnFail, "Terrain shader failed to load correctly."); + return; + } + bool success = GetParentScene()->ConfigurePipelineState(shaderState.m_shader->GetDrawListTag(), shaderState.m_pipelineStateDescriptor); AZ_Assert(success || !assertOnFail, "Couldn't configure the pipeline state."); if (success) @@ -110,7 +116,7 @@ namespace Terrain }; LoadShader("Shaders/Terrain/Terrain.azshader", m_shaderStates[ShaderType::Forward]); - LoadShader("Shaders/Terrain/Terrain_DepthPass_WithPS.azshader", m_shaderStates[ShaderType::Depth]); + LoadShader("Shaders/Terrain/Terrain_DepthPass.azshader", m_shaderStates[ShaderType::Depth]); // Forward and depth shader use same srg layout. AZ::RHI::Ptr perObjectSrgLayout = @@ -248,7 +254,9 @@ namespace Terrain { AZ_PROFILE_FUNCTION(AzRender); - if (m_shaderStates[ShaderType::Forward].m_shader->GetDrawListTag().IsNull() || + if ((m_shaderStates[ShaderType::Forward].m_shader == nullptr) || + (m_shaderStates[ShaderType::Depth].m_shader == nullptr) || + m_shaderStates[ShaderType::Forward].m_shader->GetDrawListTag().IsNull() || m_shaderStates[ShaderType::Depth].m_shader->GetDrawListTag().IsNull()) { return; From d9cbc97ec07909e6ddb6687e0c22da07cc6bbdb6 Mon Sep 17 00:00:00 2001 From: Qing Tao <55564570+VickyAtAZ@users.noreply.github.com> Date: Fri, 10 Sep 2021 10:38:16 -0700 Subject: [PATCH 237/355] ATOM-16063 Remove SetShaderResourceGroupCallback in scene and update scene srg handling (#3969) ATOM-16273 Compiling SceneSRG before updating it can cause a gpu crash Changes include: 1. Removed Scene::SetShaderResourceGroupCallback() function and clean up code which use this function. 2. Moved SceneTimeSrg.azsli to RPI's DefaultSceneSrg folder and setup the constants in RPI::Scene 3. Add AZ::Event for Scene's update srg event which features and update scene srg at proper place 4. UpdateTransformServcie FP to use PrepareSceneSrg event handler. 5. Clean up shaders and srgs used in project templates. Signed-off-by: Qing Tao --- AutomatedTesting/Shaders/CommonVS.azsli | 51 ------------------ .../Code/Source/BootstrapSystemComponent.cpp | 33 +----------- .../Code/Source/BootstrapSystemComponent.h | 3 -- .../ShaderResourceGroups/SceneSrgAll.azsli | 2 +- .../Shaders/PostProcessing/EyeAdaptation.azsl | 4 +- .../PostProcessing/EyeAdaptationUtil.azsli | 3 +- .../atom_feature_common_asset_files.cmake | 1 - .../TransformServiceFeatureProcessor.h | 15 +++--- .../ExposureControlRenderProxy.cpp | 12 ++--- .../Source/PostProcessing/EyeAdaptationPass.h | 1 + .../TransformServiceFeatureProcessor.cpp | 25 ++++----- .../DefaultSceneSrg.azsli} | 1 - .../RPI/Code/Include/Atom/RPI.Public/Scene.h | 23 +++++--- .../Code/Include/Atom/RPI.Public/SceneBus.h | 1 - .../RPI.Public/Pass/AttachmentReadback.cpp | 6 +-- .../RPI/Code/Source/RPI.Public/RPISystem.cpp | 2 +- .../Atom/RPI/Code/Source/RPI.Public/Scene.cpp | 47 ++++++++++------- .../Viewport/MaterialViewportRenderer.cpp | 20 +------ .../Viewport/MaterialViewportRenderer.h | 2 - .../Rendering/ThumbnailRendererData.h | 2 - .../ThumbnailRendererSteps/CaptureStep.cpp | 5 +- .../ThumbnailRendererSteps/InitializeStep.cpp | 28 ---------- .../Template/ShaderLib/scenesrg.srgi | 3 +- .../Template/Shaders/CommonVS.azsli | 52 ------------------- .../ShaderResourceGroups/SceneSrg.azsli | 20 ------- Templates/DefaultProject/template.json | 12 ----- .../Template/ShaderLib/scenesrg.srgi | 3 +- .../Template/Shaders/CommonVS.azsli | 52 ------------------- .../ShaderResourceGroups/SceneSrg.azsli | 20 ------- Templates/MinimalProject/template.json | 12 ----- 30 files changed, 80 insertions(+), 381 deletions(-) delete mode 100644 AutomatedTesting/Shaders/CommonVS.azsli rename Gems/Atom/{Feature/Common/Assets/ShaderResourceGroups/SceneTimeSrg.azsli => RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/DefaultSceneSrg.azsli} (94%) delete mode 100644 Templates/DefaultProject/Template/Shaders/CommonVS.azsli delete mode 100644 Templates/DefaultProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli delete mode 100644 Templates/MinimalProject/Template/Shaders/CommonVS.azsli delete mode 100644 Templates/MinimalProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli diff --git a/AutomatedTesting/Shaders/CommonVS.azsli b/AutomatedTesting/Shaders/CommonVS.azsli deleted file mode 100644 index 3d46871b59..0000000000 --- a/AutomatedTesting/Shaders/CommonVS.azsli +++ /dev/null @@ -1,51 +0,0 @@ - -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once - -#include -#include -#include - -struct VertexInput -{ - float3 m_position : POSITION; - float3 m_normal : NORMAL; - float4 m_tangent : TANGENT; - float3 m_bitangent : BITANGENT; - float2 m_uv : UV0; -}; - -struct VertexOutput -{ - float4 m_position : SV_Position; - float3 m_normal : NORMAL; - float3 m_tangent : TANGENT; - float3 m_bitangent : BITANGENT; - float2 m_uv : UV0; - float3 m_view : VIEW; -}; - -VertexOutput CommonVS(VertexInput input) -{ - float4x4 objectToWorld = ObjectSrg::GetWorldMatrix(); - float3x3 objectToWorldIT = ObjectSrg::GetWorldMatrixInverseTranspose(); - - VertexOutput output; - float3 worldPosition = mul(objectToWorld, float4(input.m_position, 1)).xyz; - output.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(worldPosition, 1.0)); - - output.m_uv = input.m_uv; - - output.m_view = worldPosition - ViewSrg::m_worldPosition; - - ConstructTBN(input.m_normal, input.m_tangent, input.m_bitangent, objectToWorld, objectToWorldIT, output.m_normal, output.m_tangent, output.m_bitangent); - - return output; -} diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp index 11758138e0..d837988cfb 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp @@ -253,34 +253,6 @@ namespace AZ RPI::SceneDescriptor sceneDesc; AZ::RPI::ScenePtr atomScene = RPI::Scene::CreateScene(sceneDesc); atomScene->EnableAllFeatureProcessors(); - - // Setup scene srg modification callback. - RPI::ShaderResourceGroupCallback callback = [this](RPI::ShaderResourceGroup* srg) - { - if (srg == nullptr) - { - return; - } - bool needCompile = false; - RHI::ShaderInputConstantIndex timeIndex = srg->FindShaderInputConstantIndex(Name{ "m_time" }); - if (timeIndex.IsValid()) - { - srg->SetConstant(timeIndex, m_simulateTime); - needCompile = true; - } - RHI::ShaderInputConstantIndex deltaTimeIndex = srg->FindShaderInputConstantIndex(Name{ "m_deltaTime" }); - if (deltaTimeIndex.IsValid()) - { - srg->SetConstant(deltaTimeIndex, m_deltaTime); - needCompile = true; - } - - if (needCompile) - { - srg->Compile(); - } - }; - atomScene->SetShaderResourceGroupCallback(callback); atomScene->Activate(); // Register scene to RPI system so it will be processed/rendered per tick @@ -408,11 +380,8 @@ namespace AZ m_renderPipelineId = ""; } - void BootstrapSystemComponent::OnTick(float deltaTime, [[maybe_unused]] ScriptTimePoint time) + void BootstrapSystemComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] ScriptTimePoint time) { - m_simulateTime += deltaTime; - m_deltaTime = deltaTime; - // Temp: When running in the launcher without the legacy renderer // we need to call RenderTick on the viewport context each frame. if (m_viewportContext) diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h index bd5d417b8f..566d19b1a4 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h @@ -105,9 +105,6 @@ namespace AZ RPI::ScenePtr m_defaultScene = nullptr; AZStd::shared_ptr m_defaultFrameworkScene = nullptr; - float m_simulateTime = 0; - float m_deltaTime = 0.016f; - bool m_isAssetCatalogLoaded = false; // The id of the render pipeline created by this component diff --git a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneSrgAll.azsli b/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneSrgAll.azsli index 96ed740f98..421178bb01 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneSrgAll.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneSrgAll.azsli @@ -11,6 +11,6 @@ // Please review README.md to understand how this file is used in SceneSrg.azsrg generation #ifdef AZ_COLLECTING_PARTIAL_SRGS -#include +#include #include #endif diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl index ce10eb9b91..1844144401 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptation.azsl @@ -78,10 +78,12 @@ void MainCS(uint3 dispatch_id : SV_DispatchThreadID) const float speed = exposureDifference > 0.0 ? ViewSrg::m_exposureControl.m_speedUp : ViewSrg::m_exposureControl.m_speedDown; // Update the adjustment for this frame based on the frame deltaTime and speed - float exposureAdjustment = exposureDifference * SceneSrg::m_deltaTime * speed; + float deltaTime = clamp(SceneSrg::m_time - PassSrg::m_eyeAdaptationData[0].m_setValueTime, 0.0f, 1.0f); + float exposureAdjustment = exposureDifference * deltaTime * speed; float newExposureLog2 = previousFrameExposureLog2 + exposureAdjustment; // Store the linear exposure so it can be used by the look modification transform later. // newExposureLog2 is negated because m_exposureValue is used to correct for a given exposure. PassSrg::m_eyeAdaptationData[0].m_exposureValue = pow(2.0f, -newExposureLog2); + PassSrg::m_eyeAdaptationData[0].m_setValueTime = SceneSrg::m_time; } diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptationUtil.azsli b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptationUtil.azsli index 54e96122ac..fb75e1079c 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptationUtil.azsli +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/EyeAdaptationUtil.azsli @@ -8,5 +8,6 @@ struct EyeAdaptation { - float m_exposureValue; // current frame's exposure value in stops (logarithmic space) + float m_exposureValue; // current frame's exposure value in stops (logarithmic space) + float m_setValueTime; // the time when the m_exposureValue was set }; diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake index 75181517a4..e43498c55d 100644 --- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake +++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake @@ -289,7 +289,6 @@ set(FILES ShaderLib/Atom/Features/Vertex/VertexHelper.azsli ShaderResourceGroups/SceneSrg.azsli ShaderResourceGroups/SceneSrgAll.azsli - ShaderResourceGroups/SceneTimeSrg.azsli ShaderResourceGroups/ViewSrg.azsli ShaderResourceGroups/ViewSrgAll.azsli ShaderResourceGroups/CoreLights/SceneSrg.azsli diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h index 6482871234..936fc88fa6 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/TransformService/TransformServiceFeatureProcessor.h @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace AZ @@ -36,8 +37,6 @@ namespace AZ void Activate() override; //! Releases GPU resources. void Deactivate() override; - //! Binds buffers - void Render(const FeatureProcessor::RenderPacket& packet) override; // RPI::SceneNotificationBus overrides ... void OnBeginPrepareRender() override; @@ -68,11 +67,13 @@ namespace AZ // Prepare GPU buffers for object transformation matrices // Create the buffers if they don't exist. Otherwise, resize them if they are not large enough for the matrices void PrepareBuffers(); - - Data::Instance m_sceneSrg; - RHI::ShaderInputBufferIndex m_objectToWorldBufferIndex; - RHI::ShaderInputBufferIndex m_objectToWorldInverseTransposeBufferIndex; - RHI::ShaderInputBufferIndex m_objectToWorldHistoryBufferIndex; + + void UpdateSceneSrg(RPI::ShaderResourceGroup *sceneSrg); + + RPI::Scene::PrepareSceneSrgEvent::Handler m_updateSceneSrgHandler; + RHI::ShaderInputNameIndex m_objectToWorldBufferIndex = "m_objectToWorldBuffer"; + RHI::ShaderInputNameIndex m_objectToWorldInverseTransposeBufferIndex = "m_objectToWorldInverseTransposeBuffer"; + RHI::ShaderInputNameIndex m_objectToWorldHistoryBufferIndex = "m_objectToWorldHistoryBuffer"; // Stores transforms that are uploaded to a GPU buffer. Used slots have float12(matrix3x4) values, empty slots // have a uint32_t that points to the next empty slot like a linked list. m_firstAvailableMeshTransformIndex stores the first diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/ExposureControlRenderProxy.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/ExposureControlRenderProxy.cpp index 1d345a2432..924af4ab98 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/ExposureControlRenderProxy.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/ExposureControlRenderProxy.cpp @@ -36,8 +36,6 @@ namespace AZ m_viewPtr = view; m_viewSrg = view->GetShaderResourceGroup(); - m_exposureControlBufferInputIndex = m_viewSrg->FindShaderInputBufferIndex(Name("m_exposureControl")); - m_eyeAdaptationBuffer.Init(m_viewSrg, idNumber); } @@ -109,14 +107,10 @@ namespace AZ m_eyeAdaptationBuffer.UpdateSrg(); - if (m_exposureControlBufferInputIndex.IsValid()) + m_viewSrg->SetBufferView(m_exposureControlBufferInputIndex, m_buffer->GetBufferView()); + if (m_viewPtr) { - m_viewSrg->SetBufferView(m_exposureControlBufferInputIndex, m_buffer->GetBufferView()); - - if (m_viewPtr) - { - m_viewPtr->InvalidateSrg(); - } + m_viewPtr->InvalidateSrg(); } } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/EyeAdaptationPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/EyeAdaptationPass.h index 0d045a0f78..bec3af2934 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/EyeAdaptationPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/EyeAdaptationPass.h @@ -52,6 +52,7 @@ namespace AZ struct ExposureCalculationData { float m_exposureValue = 1.0f; + float m_setValueTime = 0; }; void BuildInternal() override; diff --git a/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp index 7a76e1b7e0..6f9c0dc73a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/TransformService/TransformServiceFeatureProcessor.cpp @@ -36,11 +36,8 @@ namespace AZ void TransformServiceFeatureProcessor::Activate() { - m_sceneSrg = GetParentScene()->GetShaderResourceGroup(); - - m_objectToWorldBufferIndex = m_sceneSrg->FindShaderInputBufferIndex(Name{"m_objectToWorldBuffer"}); - m_objectToWorldInverseTransposeBufferIndex = m_sceneSrg->FindShaderInputBufferIndex(Name{"m_objectToWorldInverseTransposeBuffer"}); - m_objectToWorldHistoryBufferIndex = m_sceneSrg->FindShaderInputBufferIndex(Name{"m_objectToWorldHistoryBuffer"}); + m_updateSceneSrgHandler = RPI::Scene::PrepareSceneSrgEvent::Handler([this](RPI::ShaderResourceGroup *sceneSrg) { this->UpdateSceneSrg(sceneSrg); }); + GetParentScene()->ConnectEvent(m_updateSceneSrgHandler); m_deviceBufferNeedsUpdate = true; m_objectToWorldTransforms.reserve(BufferReserveCount); @@ -62,9 +59,14 @@ namespace AZ m_firstAvailableTransformIndex = NoAvailableTransformIndices; + m_objectToWorldBufferIndex.Reset(); + m_objectToWorldInverseTransposeBufferIndex.Reset(); + m_objectToWorldHistoryBufferIndex.Reset(); + m_isWriteable = false; RPI::SceneNotificationBus::Handler::BusDisconnect(); + m_updateSceneSrgHandler.Disconnect(); } void TransformServiceFeatureProcessor::PrepareBuffers() @@ -131,16 +133,11 @@ namespace AZ } } - void TransformServiceFeatureProcessor::Render([[maybe_unused]] const FeatureProcessor::RenderPacket& packet) + void TransformServiceFeatureProcessor::UpdateSceneSrg(RPI::ShaderResourceGroup *sceneSrg) { - AZ_ATOM_PROFILE_FUNCTION("RPI", "TransformServiceFeatureProcessor: Render"); - AZ_UNUSED(packet); - - AZ_Assert(!m_isWriteable, "Must be called between OnBeginPrepareRender() and OnEndPrepareRender()"); - - m_sceneSrg->SetBufferView(m_objectToWorldBufferIndex, m_objectToWorldBuffer->GetBufferView()); - m_sceneSrg->SetBufferView(m_objectToWorldInverseTransposeBufferIndex, m_objectToWorldInverseTransposeBuffer->GetBufferView()); - m_sceneSrg->SetBufferView(m_objectToWorldHistoryBufferIndex, m_objectToWorldHistoryBuffer->GetBufferView()); + sceneSrg->SetBufferView(m_objectToWorldBufferIndex, m_objectToWorldBuffer->GetBufferView()); + sceneSrg->SetBufferView(m_objectToWorldInverseTransposeBufferIndex, m_objectToWorldInverseTransposeBuffer->GetBufferView()); + sceneSrg->SetBufferView(m_objectToWorldHistoryBufferIndex, m_objectToWorldHistoryBuffer->GetBufferView()); } void TransformServiceFeatureProcessor::OnBeginPrepareRender() diff --git a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneTimeSrg.azsli b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/DefaultSceneSrg.azsli similarity index 94% rename from Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneTimeSrg.azsli rename to Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/DefaultSceneSrg.azsli index c89fc6b4c4..f9428b3125 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/SceneTimeSrg.azsli +++ b/Gems/Atom/RPI/Assets/ShaderLib/Atom/RPI/ShaderResourceGroups/DefaultSceneSrg.azsli @@ -13,6 +13,5 @@ partial ShaderResourceGroup SceneSrg { float m_time; - float m_deltaTime; } diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h index fa918ae033..b1c6aac92d 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Scene.h @@ -129,10 +129,6 @@ namespace AZ void RemoveRenderPipeline(const RenderPipelineId& pipelineId); - //! Set a callback function to set values for scene's srg. - //! The callback function is usually defined by the one who create the scene since it knows how the layout look like. - void SetShaderResourceGroupCallback(ShaderResourceGroupCallback callback); - const RHI::ShaderResourceGroup* GetRHIShaderResourceGroup() const; Data::Instance GetShaderResourceGroup() const; @@ -166,9 +162,13 @@ namespace AZ RenderPipelinePtr FindRenderPipelineForWindow(AzFramework::NativeWindowHandle windowHandle); + using PrepareSceneSrgEvent = AZ::Event; + //! Connect a handler to listen to the event that the Scene is ready to update and compile its scene srg + //! User should use this event to update the part scene srg they know of + void ConnectEvent(PrepareSceneSrgEvent::Handler& handler); + protected: // SceneFinder overrides... - Scene* FindSelf(); void OnSceneNotifictaionHandlerConnected(SceneNotification* handler); // Cpu simulation which runs all active FeatureProcessor Simulate() functions. @@ -183,7 +183,7 @@ namespace AZ // Function called when the current frame is finished rendering. void OnFrameEnd(); - // Update and compile view srgs + // Update and compile scene and view srgs // This is called after PassSystem's FramePrepare so passes can still modify view srgs in its FramePrepareIntenal function before they are submitted to command list void UpdateSrgs(); @@ -200,6 +200,10 @@ namespace AZ // Add a created feature processor to this scene void AddFeatureProcessor(FeatureProcessorPtr fp); + // Send out event to PrepareSceneSrgEvent::Handlers so they can update scene srg as needed + // This happens in UpdateSrgs() + void PrepareSceneSrg(); + // List of feature processors that are active for this scene AZStd::vector m_featureProcessors; @@ -215,9 +219,10 @@ namespace AZ AZ::RPI::FeatureProcessor::SimulatePacket m_simulatePacket; AZ::RPI::FeatureProcessor::RenderPacket m_renderPacket; - // Scene's srg and its set function + // Scene's srg Data::Instance m_srg; - ShaderResourceGroupCallback m_srgCallback; + // Event to for prepare scene srg + PrepareSceneSrgEvent m_prepareSrgEvent; // The uuid to identify this scene. SceneId m_id; @@ -234,6 +239,8 @@ namespace AZ // Registry which allocates draw filter tag for RenderPipeline RHI::Ptr m_drawFilterTagRegistry; + + float m_simulationTime; }; // --- Template functions --- diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h index 4222f634cc..ca531d2de6 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h @@ -80,7 +80,6 @@ namespace AZ static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; using BusIdType = SceneId; - virtual Scene* FindSelf() = 0; virtual void OnSceneNotifictaionHandlerConnected(SceneNotification* handler) = 0; }; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp index 146c37fe1b..c19ae565d0 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/AttachmentReadback.cpp @@ -308,10 +308,10 @@ namespace AZ // The fix is to clear the buffer outside of the callback. for (int32_t i = 0; i < RHI::Limits::Device::FrameCountMax; i++) { - if (m_isReadbackComplete[m_readbackBufferCurrentIndex]) + if (m_isReadbackComplete[i]) { - m_isReadbackComplete[m_readbackBufferCurrentIndex] = false; - m_readbackBufferArray[m_readbackBufferCurrentIndex] = nullptr; + m_isReadbackComplete[i] = false; + m_readbackBufferArray[i] = nullptr; } } // Loop the triple buffer index and cache the current index to the callback. diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/RPISystem.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/RPISystem.cpp index 66c4f6d20a..500bf21628 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/RPISystem.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/RPISystem.cpp @@ -293,7 +293,7 @@ namespace AZ // scope producers only can be added to the frame when frame started which cleans up previous scope producers. m_passSystem.FrameUpdate(frameGraphBuilder); - // Update View Srgs + // Update Scene and View Srgs for (auto& scenePtr : m_scenes) { scenePtr->UpdateSrgs(); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp index 761ce20ee8..0b0481b960 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp @@ -352,6 +352,8 @@ namespace AZ { AZ_ATOM_PROFILE_FUNCTION("RPI", "Scene: Simulate"); + m_simulationTime = tickInfo.m_currentGameTime; + // If previous simulation job wasn't done, wait for it to finish. WaitAndCleanCompletionJob(m_simulationCompletion); @@ -395,6 +397,29 @@ namespace AZ } } + void Scene::ConnectEvent(PrepareSceneSrgEvent::Handler& handler) + { + handler.Connect(m_prepareSrgEvent); + } + + void Scene::PrepareSceneSrg() + { + if (m_srg) + { + // Set value for constants defined in SceneTimeSrg.azsli + RHI::ShaderInputConstantIndex timeIndex = m_srg->FindShaderInputConstantIndex(Name{ "m_time" }); + if (timeIndex.IsValid()) + { + m_srg->SetConstant(timeIndex, m_simulationTime); + } + + // signal any handlers to update values for their partial scene srg + m_prepareSrgEvent.Signal(m_srg.get()); + + m_srg->Compile(); + } + } + void Scene::PrepareRender(const TickTimeInfo& tickInfo, RHI::JobPolicy jobPolicy) { AZ_ATOM_PROFILE_FUNCTION("RPI", "Scene: PrepareRender"); @@ -407,16 +432,6 @@ namespace AZ SceneNotificationBus::Event(GetId(), &SceneNotification::OnBeginPrepareRender); - { - AZ_PROFILE_SCOPE(RPI, "m_srgCallback"); - AZ_ATOM_PROFILE_TIME_GROUP_REGION("RPI", "ShaderResourceGroupCallback: SrgCallback"); - // Set values for scene srg - if (m_srg && m_srgCallback) - { - m_srgCallback(m_srg.get()); - } - } - // Get active pipelines which need to be rendered and notify them frame started AZStd::vector activePipelines; { @@ -587,17 +602,14 @@ namespace AZ void Scene::UpdateSrgs() { + PrepareSceneSrg(); + for (auto& view : m_renderPacket.m_views) { view->UpdateSrg(); } } - void Scene::SetShaderResourceGroupCallback(ShaderResourceGroupCallback callback) - { - m_srgCallback = callback; - } - const RHI::ShaderResourceGroup* Scene::GetRHIShaderResourceGroup() const { if (m_srg.get()) @@ -641,11 +653,6 @@ namespace AZ return m_pipelines; } - Scene* Scene::FindSelf() - { - return this; - } - void Scene::OnSceneNotifictaionHandlerConnected(SceneNotification* handler) { for (auto renderPipeline : m_pipelines) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.cpp index f98cdce91b..36498d6d08 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.cpp @@ -70,22 +70,6 @@ namespace MaterialEditor m_scene = AZ::RPI::Scene::CreateScene(sceneDesc); m_scene->EnableAllFeatureProcessors(); - // Setup scene srg modification callback. - AZ::RPI::ShaderResourceGroupCallback callback = [this](AZ::RPI::ShaderResourceGroup* srg) - { - if (srg == nullptr) - { - return; - } - AZ::RHI::ShaderInputConstantIndex timeIndex = srg->FindShaderInputConstantIndex(AZ::Name{ "m_time" }); - if (timeIndex.IsValid()) - { - srg->SetConstant(timeIndex, m_simulateTime); - srg->Compile(); - } - }; - m_scene->SetShaderResourceGroupCallback(callback); - // Bind m_defaultScene to the GameEntityContext's AzFramework::Scene auto sceneSystem = AzFramework::SceneSystemInterface::Get(); AZ_Assert(sceneSystem, "MaterialViewportRenderer was unable to get the scene system during construction."); @@ -448,14 +432,12 @@ namespace MaterialEditor } } - void MaterialViewportRenderer::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) + void MaterialViewportRenderer::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time) { m_renderPipeline->AddToRenderTickOnce(); PerformanceMonitorRequestBus::Broadcast(&PerformanceMonitorRequestBus::Handler::GatherMetrics); - m_simulateTime += deltaTime; - if (m_shadowCatcherMaterial) { // Compile the m_shadowCatcherMaterial in OnTick because changes can only be compiled once per frame. diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.h index 240d66fd43..8a3e0ca4ff 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Viewport/MaterialViewportRenderer.h @@ -114,8 +114,6 @@ namespace MaterialEditor AZ::Entity* m_iblEntity = nullptr; AZ::Render::SkyBoxFeatureProcessorInterface* m_skyboxFeatureProcessor = nullptr; - float m_simulateTime = 0; - AZStd::shared_ptr m_viewportController; }; } // namespace MaterialEditor diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h index 4ced050fc1..c471cf90d7 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererData.h @@ -46,8 +46,6 @@ namespace AZ RPI::ViewPtr m_view = nullptr; Entity* m_modelEntity = nullptr; - double m_simulateTime = 0.0f; - float m_deltaTime = 0.0f; int m_thumbnailSize = 512; //! Incoming thumbnail requests are appended to this queue and processed one at a time in OnTick function. diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp index 9a425ddeb4..f728d56bbc 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/CaptureStep.cpp @@ -81,11 +81,8 @@ namespace AZ m_context->GetData()->m_view->SetCameraTransform(Matrix3x4::CreateFromTransform(cameraTransform)); } - void CaptureStep::OnTick(float deltaTime, ScriptTimePoint time) + void CaptureStep::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] ScriptTimePoint time) { - m_context->GetData()->m_deltaTime = deltaTime; - m_context->GetData()->m_simulateTime = time.GetSeconds(); - if (m_readyToCapture && m_ticksToCapture-- <= 0) { m_context->GetData()->m_renderPipeline->AddToRenderTickOnce(); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp index 4851d8f792..46eb0937bd 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Thumbnails/Rendering/ThumbnailRendererSteps/InitializeStep.cpp @@ -72,34 +72,6 @@ namespace AZ data->m_scene = RPI::Scene::CreateScene(sceneDesc); - // Setup scene srg modification callback (to push per-frame values to the shaders) - RPI::ShaderResourceGroupCallback callback = [data](RPI::ShaderResourceGroup* srg) - { - if (srg == nullptr) - { - return; - } - bool needCompile = false; - RHI::ShaderInputConstantIndex timeIndex = srg->FindShaderInputConstantIndex(Name{ "m_time" }); - if (timeIndex.IsValid()) - { - srg->SetConstant(timeIndex, aznumeric_cast(data->m_simulateTime)); - needCompile = true; - } - RHI::ShaderInputConstantIndex deltaTimeIndex = srg->FindShaderInputConstantIndex(Name{ "m_deltaTime" }); - if (deltaTimeIndex.IsValid()) - { - srg->SetConstant(deltaTimeIndex, data->m_deltaTime); - needCompile = true; - } - - if (needCompile) - { - srg->Compile(); - } - }; - data->m_scene->SetShaderResourceGroupCallback(callback); - // Bind m_defaultScene to the GameEntityContext's AzFramework::Scene auto* sceneSystem = AzFramework::SceneSystemInterface::Get(); AZ_Assert(sceneSystem, "Thumbnail system failed to get scene system implementation."); diff --git a/Templates/DefaultProject/Template/ShaderLib/scenesrg.srgi b/Templates/DefaultProject/Template/ShaderLib/scenesrg.srgi index 38335bfc26..c5024b86ad 100644 --- a/Templates/DefaultProject/Template/ShaderLib/scenesrg.srgi +++ b/Templates/DefaultProject/Template/ShaderLib/scenesrg.srgi @@ -22,6 +22,5 @@ partial ShaderResourceGroup SceneSrg : SRG_PerScene }; #define AZ_COLLECTING_PARTIAL_SRGS -#include -#include +#include #undef AZ_COLLECTING_PARTIAL_SRGS diff --git a/Templates/DefaultProject/Template/Shaders/CommonVS.azsli b/Templates/DefaultProject/Template/Shaders/CommonVS.azsli deleted file mode 100644 index 4c20d85b88..0000000000 --- a/Templates/DefaultProject/Template/Shaders/CommonVS.azsli +++ /dev/null @@ -1,52 +0,0 @@ -// {BEGIN_LICENSE} -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -// {END_LICENSE} - -#pragma once - -#include -#include -#include - -struct VertexInput -{ - float3 m_position : POSITION; - float3 m_normal : NORMAL; - float4 m_tangent : TANGENT; - float3 m_bitangent : BITANGENT; - float2 m_uv : UV0; -}; - -struct VertexOutput -{ - float4 m_position : SV_Position; - float3 m_normal : NORMAL; - float3 m_tangent : TANGENT; - float3 m_bitangent : BITANGENT; - float2 m_uv : UV0; - float3 m_view : VIEW; -}; - -VertexOutput CommonVS(VertexInput input) -{ - float4x4 objectToWorld = ObjectSrg::GetWorldMatrix(); - float3x3 objectToWorldIT = ObjectSrg::GetWorldMatrixInverseTranspose(); - - VertexOutput output; - float3 worldPosition = mul(objectToWorld, float4(input.m_position, 1)).xyz; - output.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(worldPosition, 1.0)); - - output.m_uv = input.m_uv; - - output.m_view = worldPosition - ViewSrg::m_worldPosition; - - ConstructTBN(input.m_normal, input.m_tangent, input.m_bitangent, objectToWorld, objectToWorldIT, output.m_normal, output.m_tangent, output.m_bitangent); - - return output; -} diff --git a/Templates/DefaultProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli b/Templates/DefaultProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli deleted file mode 100644 index f6422f8b2f..0000000000 --- a/Templates/DefaultProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli +++ /dev/null @@ -1,20 +0,0 @@ -// {BEGIN_LICENSE} -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -// {END_LICENSE} - -#ifndef AZ_COLLECTING_PARTIAL_SRGS -#error Do not include this file directly. Include the main .srgi file instead. -#endif - -partial ShaderResourceGroup SceneSrg -{ - float m_time; - float m_deltaTime; -} - diff --git a/Templates/DefaultProject/template.json b/Templates/DefaultProject/template.json index 6cf861a2ef..1e84ea8424 100644 --- a/Templates/DefaultProject/template.json +++ b/Templates/DefaultProject/template.json @@ -504,18 +504,6 @@ "isTemplated": true, "isOptional": false }, - { - "file": "Shaders/CommonVS.azsli", - "origin": "Shaders/CommonVS.azsli", - "isTemplated": true, - "isOptional": false - }, - { - "file": "Shaders/ShaderResourceGroups/SceneSrg.azsli", - "origin": "Shaders/ShaderResourceGroups/SceneSrg.azsli", - "isTemplated": true, - "isOptional": false - }, { "file": "autoexec.cfg", "origin": "autoexec.cfg", diff --git a/Templates/MinimalProject/Template/ShaderLib/scenesrg.srgi b/Templates/MinimalProject/Template/ShaderLib/scenesrg.srgi index 38335bfc26..c5024b86ad 100644 --- a/Templates/MinimalProject/Template/ShaderLib/scenesrg.srgi +++ b/Templates/MinimalProject/Template/ShaderLib/scenesrg.srgi @@ -22,6 +22,5 @@ partial ShaderResourceGroup SceneSrg : SRG_PerScene }; #define AZ_COLLECTING_PARTIAL_SRGS -#include -#include +#include #undef AZ_COLLECTING_PARTIAL_SRGS diff --git a/Templates/MinimalProject/Template/Shaders/CommonVS.azsli b/Templates/MinimalProject/Template/Shaders/CommonVS.azsli deleted file mode 100644 index 4c20d85b88..0000000000 --- a/Templates/MinimalProject/Template/Shaders/CommonVS.azsli +++ /dev/null @@ -1,52 +0,0 @@ -// {BEGIN_LICENSE} -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -// {END_LICENSE} - -#pragma once - -#include -#include -#include - -struct VertexInput -{ - float3 m_position : POSITION; - float3 m_normal : NORMAL; - float4 m_tangent : TANGENT; - float3 m_bitangent : BITANGENT; - float2 m_uv : UV0; -}; - -struct VertexOutput -{ - float4 m_position : SV_Position; - float3 m_normal : NORMAL; - float3 m_tangent : TANGENT; - float3 m_bitangent : BITANGENT; - float2 m_uv : UV0; - float3 m_view : VIEW; -}; - -VertexOutput CommonVS(VertexInput input) -{ - float4x4 objectToWorld = ObjectSrg::GetWorldMatrix(); - float3x3 objectToWorldIT = ObjectSrg::GetWorldMatrixInverseTranspose(); - - VertexOutput output; - float3 worldPosition = mul(objectToWorld, float4(input.m_position, 1)).xyz; - output.m_position = mul(ViewSrg::m_viewProjectionMatrix, float4(worldPosition, 1.0)); - - output.m_uv = input.m_uv; - - output.m_view = worldPosition - ViewSrg::m_worldPosition; - - ConstructTBN(input.m_normal, input.m_tangent, input.m_bitangent, objectToWorld, objectToWorldIT, output.m_normal, output.m_tangent, output.m_bitangent); - - return output; -} diff --git a/Templates/MinimalProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli b/Templates/MinimalProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli deleted file mode 100644 index f6422f8b2f..0000000000 --- a/Templates/MinimalProject/Template/Shaders/ShaderResourceGroups/SceneSrg.azsli +++ /dev/null @@ -1,20 +0,0 @@ -// {BEGIN_LICENSE} -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -// {END_LICENSE} - -#ifndef AZ_COLLECTING_PARTIAL_SRGS -#error Do not include this file directly. Include the main .srgi file instead. -#endif - -partial ShaderResourceGroup SceneSrg -{ - float m_time; - float m_deltaTime; -} - diff --git a/Templates/MinimalProject/template.json b/Templates/MinimalProject/template.json index 9d9ef730c1..21608e9204 100644 --- a/Templates/MinimalProject/template.json +++ b/Templates/MinimalProject/template.json @@ -490,18 +490,6 @@ "isTemplated": true, "isOptional": false }, - { - "file": "Shaders/CommonVS.azsli", - "origin": "Shaders/CommonVS.azsli", - "isTemplated": true, - "isOptional": false - }, - { - "file": "Shaders/ShaderResourceGroups/SceneSrg.azsli", - "origin": "Shaders/ShaderResourceGroups/SceneSrg.azsli", - "isTemplated": true, - "isOptional": false - }, { "file": "autoexec.cfg", "origin": "autoexec.cfg", From 5909e471e648b57ed3e111f50b62e3ad2af214b4 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 10:39:42 -0700 Subject: [PATCH 238/355] Limits configuration types a project sees when using an engine SDK (#4033) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/ConfigurationTypes.cmake | 14 ++++++++++++ cmake/Configurations.cmake | 21 +++++++++++++----- cmake/Platform/Common/Install_common.cmake | 22 +++++++++++++++++-- .../install/ConfigurationType_config.cmake.in | 11 ++++++++++ cmake/install/ConfigurationTypes.cmake | 22 +++++++++++++++++++ 5 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 cmake/ConfigurationTypes.cmake create mode 100644 cmake/install/ConfigurationType_config.cmake.in create mode 100644 cmake/install/ConfigurationTypes.cmake diff --git a/cmake/ConfigurationTypes.cmake b/cmake/ConfigurationTypes.cmake new file mode 100644 index 0000000000..fe9c2daa51 --- /dev/null +++ b/cmake/ConfigurationTypes.cmake @@ -0,0 +1,14 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +include_guard(GLOBAL) + +# By default, CMAKE_CONFIGURATION_TYPES = LY_CONFIGURATION_TYPES, but in installed SDKs, this +# file will be replaced with cmake/install/ConfigurationTypes.cmake and discover configurations +# that are available from the SDK +set(CMAKE_CONFIGURATION_TYPES ${LY_CONFIGURATION_TYPES} CACHE STRING "" FORCE) diff --git a/cmake/Configurations.cmake b/cmake/Configurations.cmake index 693cc23c7d..51dee2f07b 100644 --- a/cmake/Configurations.cmake +++ b/cmake/Configurations.cmake @@ -8,6 +8,17 @@ include_guard(GLOBAL) +# LY_CONFIGURATION_TYPES defines all the configuration types that O3DE supports +# We dont set CMAKE_CONFIGURATION_TYPES directly because we want to be able to configure which +# configuration types are supported in an SDK installation. SDK installations will fill a +# CMAKE_CONFIGURATION_TYPES based on the configurations that were generated during the install process. +# ly_append_configurations_options depends on LY_CONFIGURATION_TYPES being +# set in order to successfully parse the arguments. Even for non-multi-config +# generators, it needs to be set. +set(LY_CONFIGURATION_TYPES "debug;profile;release" CACHE STRING "" FORCE) + +include(cmake/ConfigurationTypes.cmake) + #! ly_append_configurations_options: adds options to the different configurations (debug, profile, release, etc) # # \arg:DEFINES @@ -43,7 +54,9 @@ function(ly_append_configurations_options) ) foreach(arg IN LISTS multiArgs) list(APPEND multiValueArgs ${arg}) - foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) + # we parse the parameters based on all configuration types so unknown configurations + # are not passed as values to other parameters + foreach(conf IN LISTS LY_CONFIGURATION_TYPES) string(TOUPPER ${conf} UCONF) list(APPEND multiValueArgs ${arg}_${UCONF}) endforeach() @@ -96,6 +109,7 @@ function(ly_append_configurations_options) set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINK_STR}" PARENT_SCOPE) endif() + # We only iterate for the actual configuration types foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) string(TOUPPER ${conf} UCONF) @@ -143,11 +157,6 @@ endfunction() set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ Standard to target") ly_set(CMAKE_CXX_STANDARD_REQUIRED ON) -# ly_append_configurations_options depends on CMAKE_CONFIGURATION_TYPES being -# set in order to successfully parse the arguments. Even for non-multi-config -# generators, it needs to be set. -set(CMAKE_CONFIGURATION_TYPES "debug;profile;release" CACHE STRING "" FORCE) - get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(NOT _isMultiConfig) # No reason set CMAKE_BUILD_TYPE if it's a multiconfig generator. diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index 9a0fbbd872..86f46a6e0b 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -350,8 +350,26 @@ function(ly_setup_cmake_install) DESTINATION . COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} PATTERN "__pycache__" EXCLUDE - REGEX "Findo3de.cmake" EXCLUDE - REGEX "Platform\/.*\/BuiltInPackages_.*\.cmake" EXCLUDE + PATTERN "Findo3de.cmake" EXCLUDE + PATTERN "ConfigurationTypes.cmake" EXCLUDE + REGEX "3rdParty/Platform\/.*\/BuiltInPackages_.*\.cmake" EXCLUDE + ) + # Connect configuration types + install(FILES "${LY_ROOT_FOLDER}/cmake/install/ConfigurationTypes.cmake" + DESTINATION cmake + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) + # Inject code that will generate each ConfigurationType_.cmake file + set(install_configuration_type_template [=[ + configure_file(@LY_ROOT_FOLDER@/cmake/install/ConfigurationType_config.cmake.in + ${CMAKE_INSTALL_PREFIX}/cmake/ConfigurationTypes_${CMAKE_INSTALL_CONFIG_NAME}.cmake + @ONLY + ) + message(STATUS "Generated ${CMAKE_INSTALL_PREFIX}/cmake/ConfigurationTypes_${CMAKE_INSTALL_CONFIG_NAME}.cmake") + ]=]) + string(CONFIGURE "${install_configuration_type_template}" install_configuration_type @ONLY) + install(CODE "${install_configuration_type}" + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) # Transform the LY_EXTERNAL_SUBDIRS list into a json array diff --git a/cmake/install/ConfigurationType_config.cmake.in b/cmake/install/ConfigurationType_config.cmake.in new file mode 100644 index 0000000000..074e034899 --- /dev/null +++ b/cmake/install/ConfigurationType_config.cmake.in @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +include_guard(GLOBAL) + +list(APPEND CMAKE_CONFIGURATION_TYPES @CMAKE_INSTALL_CONFIG_NAME@) diff --git a/cmake/install/ConfigurationTypes.cmake b/cmake/install/ConfigurationTypes.cmake new file mode 100644 index 0000000000..709f3e71ab --- /dev/null +++ b/cmake/install/ConfigurationTypes.cmake @@ -0,0 +1,22 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +include_guard(GLOBAL) + + +# In SDK builds CMAKE_CONFIGURATION_TYPES will be filled by entries generated per configuration build. +# At install time we generate `cmake/ConfigurationTypes_.cmake` files that append the configuration +# to CMAKE_CONFIGURATION_TYPES +set(CMAKE_CONFIGURATION_TYPES "" CACHE STRING "" FORCE) + +# For the SDK case, we want to only define the confiuguration types that have been added to the SDK +file(GLOB configuration_type_files "cmake/ConfigurationTypes_*.cmake") +foreach(configuration_type_file ${configuration_type_files}) + include(${configuration_type_file}) +endforeach() +ly_set(CMAKE_CONFIGURATION_TYPES ${CMAKE_CONFIGURATION_TYPES}) # propagate to parent \ No newline at end of file From 43355e47cacd3218b76be66236a4ba6f67e56572 Mon Sep 17 00:00:00 2001 From: Jonny Galloway Date: Fri, 10 Sep 2021 14:00:36 -0500 Subject: [PATCH 239/355] minor bug fixes based on finding defects while using (#4035) Signed-off-by: Jonny Gallowy --- .../ColorGrading/exr_to_3dl_azasset.py | 4 +- .../ColorGrading/from_3dl_to_azasset.py | 3 - .../test-grade_inv-Log2-48nits_32_LUT.azasset | 65543 ++++++++-------- .../cmdline/CMD_ColorGradingTools.bat | 24 +- .../Tools/ColorGrading/cmdline/Env_Core.bat | 3 - .../cmdline/User_Env.bat.template | 2 +- 6 files changed, 32790 insertions(+), 32789 deletions(-) diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py index 6c2aa1d5bb..a3aae9cb94 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/exr_to_3dl_azasset.py @@ -113,7 +113,9 @@ if __name__ == '__main__': lut_intervals, lut_values = generate_lut_values(image_spec, image_buffer) write_3DL(args.o, image_spec.height, lut_intervals, lut_values) - write_azasset(args.o, image_spec.height, lut_intervals, lut_values) + + # write_azasset(file_path, lut_intervals, lut_values, azasset_json=AZASSET_LUT) + write_azasset(args.o, lut_intervals, lut_values) # example from command line # python % DCCSI_COLORGRADING_SCRIPTS %\lut_helper.py - -i C: \Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\linear_32_LUT.exr - -op pre - grading - -shaper Log2 - 48nits - -o C: \Depot\o3de\Gems\Atom\Feature\Common\Tools\ColorGrading\Resources\LUTs\base_Log2-48nits_32_LUT.exr diff --git a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py index ba37994e63..da9e5f9d34 100644 --- a/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py +++ b/Gems/Atom/Feature/Common/Editor/Scripts/ColorGrading/from_3dl_to_azasset.py @@ -31,11 +31,8 @@ if ColorGrading.initialize.start(): sys.exit(1) # ------------------------------------------------------------------------ - -# ------------------------------------------------------------------------ from ColorGrading import AZASSET_LUT - # ------------------------------------------------------------------------ def find_first_line(alist): for lno, line in enumerate(alist): diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset index a91e9d0c1a..bd1ccbf572 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/Resources/TestData/Nuke/HDR/Test_Grade/test-grade_inv-Log2-48nits_32_LUT.azasset @@ -4,32777 +4,32774 @@ "ClassName": "LookupTableAsset", "ClassData": { "Name": "LookupTable", - "Intervals": [ - 0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], - "Values": [ - 0, 0, 0, - 0, 0, 0, - 0, 15, 0, - 0, 104, 0, - 0, 201, 0, - 0, 305, 0, - 0, 415, 0, - 0, 530, 0, - 0, 649, 0, - 0, 771, 0, - 0, 895, 0, - 0, 1022, 0, - 0, 1149, 0, - 0, 1278, 0, - 0, 1408, 0, - 0, 1538, 0, - 0, 1668, 0, - 0, 1799, 0, - 0, 1931, 0, - 0, 2062, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2457, 0, - 0, 2589, 0, - 0, 2721, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3381, 0, - 0, 3514, 0, - 0, 3646, 0, - 130, 0, 20, - 28, 0, 0, - 0, 33, 0, - 0, 119, 0, - 0, 213, 0, - 0, 315, 0, - 0, 423, 0, - 0, 536, 0, - 0, 654, 0, - 0, 775, 0, - 0, 898, 0, - 0, 1024, 0, - 0, 1151, 0, - 0, 1279, 0, - 0, 1408, 0, - 0, 1538, 0, - 0, 1669, 0, - 0, 1800, 0, - 0, 1931, 0, - 0, 2062, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2589, 0, - 0, 2721, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3381, 0, - 0, 3514, 0, - 0, 3646, 0, - 342, 0, 170, - 280, 0, 102, - 183, 56, 0, - 7, 139, 0, - 0, 229, 0, - 0, 328, 0, - 0, 433, 0, - 0, 544, 0, - 0, 660, 0, - 0, 779, 0, - 0, 902, 0, - 0, 1026, 0, - 0, 1153, 0, - 0, 1281, 0, - 0, 1410, 0, - 0, 1539, 0, - 0, 1670, 0, - 0, 1800, 0, - 0, 1931, 0, - 0, 2063, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2589, 0, - 0, 2721, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3381, 0, - 0, 3514, 0, - 0, 3646, 0, - 526, 0, 315, - 486, 18, 266, - 426, 86, 192, - 331, 163, 68, - 163, 250, 0, - 0, 344, 0, - 0, 446, 0, - 0, 555, 0, - 0, 668, 0, - 0, 785, 0, - 0, 906, 0, - 0, 1030, 0, - 0, 1156, 0, - 0, 1283, 0, - 0, 1411, 0, - 0, 1540, 0, - 0, 1670, 0, - 0, 1801, 0, - 0, 1932, 0, - 0, 2063, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 693, 8, 457, - 666, 60, 422, - 626, 123, 370, - 568, 195, 290, - 475, 276, 155, - 312, 366, 0, - 0, 463, 0, - 0, 568, 0, - 0, 678, 0, - 0, 794, 0, - 0, 913, 0, - 0, 1035, 0, - 0, 1159, 0, - 0, 1285, 0, - 0, 1413, 0, - 0, 1542, 0, - 0, 1672, 0, - 0, 1802, 0, - 0, 1932, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 850, 65, 596, - 831, 112, 570, - 804, 168, 534, - 765, 233, 479, - 707, 308, 395, - 616, 393, 250, - 457, 485, 0, - 82, 585, 0, - 0, 692, 0, - 0, 804, 0, - 0, 921, 0, - 0, 1041, 0, - 0, 1164, 0, - 0, 1289, 0, - 0, 1416, 0, - 0, 1544, 0, - 0, 1673, 0, - 0, 1803, 0, - 0, 1933, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 999, 131, 733, - 986, 172, 714, - 967, 222, 688, - 940, 280, 650, - 901, 348, 594, - 844, 426, 505, - 755, 513, 352, - 598, 608, 3, - 235, 710, 0, - 0, 818, 0, - 0, 932, 0, - 0, 1049, 0, - 0, 1170, 0, - 0, 1294, 0, - 0, 1420, 0, - 0, 1547, 0, - 0, 1675, 0, - 0, 1805, 0, - 0, 1935, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1144, 207, 869, - 1134, 242, 855, - 1121, 285, 836, - 1102, 336, 809, - 1075, 397, 770, - 1037, 468, 712, - 980, 547, 621, - 892, 636, 461, - 737, 732, 82, - 382, 836, 0, - 0, 946, 0, - 0, 1060, 0, - 0, 1179, 0, - 0, 1300, 0, - 0, 1424, 0, - 0, 1550, 0, - 0, 1678, 0, - 0, 1807, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1286, 293, 1004, - 1278, 322, 994, - 1268, 358, 980, - 1255, 402, 960, - 1236, 455, 932, - 1210, 518, 893, - 1172, 590, 833, - 1115, 671, 740, - 1027, 761, 574, - 874, 859, 170, - 525, 964, 0, - 0, 1074, 0, - 0, 1190, 0, - 0, 1309, 0, - 0, 1431, 0, - 0, 1555, 0, - 0, 1682, 0, - 0, 1809, 0, - 0, 1938, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1424, 386, 1138, - 1419, 410, 1131, - 1412, 440, 1120, - 1402, 477, 1106, - 1389, 523, 1086, - 1370, 577, 1058, - 1343, 641, 1018, - 1306, 714, 958, - 1250, 797, 862, - 1162, 888, 692, - 1010, 987, 267, - 665, 1093, 0, - 0, 1204, 0, - 0, 1320, 0, - 0, 1439, 0, - 0, 1562, 0, - 0, 1687, 0, - 0, 1813, 0, - 0, 1941, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1562, 487, 1272, - 1558, 506, 1266, - 1552, 531, 1258, - 1545, 561, 1248, - 1535, 599, 1234, - 1522, 646, 1213, - 1503, 701, 1185, - 1477, 766, 1144, - 1439, 840, 1084, - 1383, 924, 987, - 1296, 1016, 813, - 1145, 1116, 370, - 802, 1222, 0, - 0, 1334, 0, - 0, 1450, 0, - 0, 1570, 0, - 0, 1693, 0, - 0, 1818, 0, - 0, 1945, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2331, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1697, 595, 1405, - 1695, 610, 1401, - 1691, 629, 1395, - 1685, 654, 1387, - 1678, 685, 1377, - 1668, 724, 1362, - 1655, 771, 1342, - 1636, 827, 1314, - 1610, 893, 1273, - 1572, 968, 1211, - 1517, 1053, 1113, - 1430, 1145, 937, - 1279, 1246, 479, - 939, 1352, 0, - 0, 1465, 0, - 0, 1581, 0, - 0, 1701, 0, - 0, 1824, 0, - 0, 1950, 0, - 0, 2076, 0, - 0, 2204, 0, - 0, 2334, 0, - 0, 2463, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1832, 707, 1538, - 1830, 719, 1535, - 1827, 735, 1531, - 1823, 755, 1525, - 1818, 780, 1517, - 1811, 811, 1507, - 1801, 851, 1492, - 1788, 898, 1472, - 1769, 955, 1443, - 1743, 1021, 1402, - 1705, 1097, 1340, - 1650, 1182, 1241, - 1563, 1275, 1062, - 1412, 1376, 594, - 1074, 1483, 0, - 0, 1596, 0, - 0, 1712, 0, - 0, 1833, 0, - 0, 1956, 0, - 0, 2081, 0, - 0, 2208, 0, - 0, 2336, 0, - 0, 2466, 0, - 0, 2595, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1966, 824, 1671, - 1965, 834, 1668, - 1963, 846, 1665, - 1960, 861, 1661, - 1956, 881, 1655, - 1951, 907, 1647, - 1943, 939, 1637, - 1934, 978, 1622, - 1920, 1026, 1602, - 1902, 1084, 1573, - 1875, 1150, 1531, - 1838, 1227, 1469, - 1782, 1312, 1370, - 1696, 1406, 1190, - 1545, 1507, 712, - 1209, 1614, 0, - 0, 1727, 0, - 0, 1844, 0, - 0, 1964, 0, - 0, 2088, 0, - 0, 2213, 0, - 0, 2340, 0, - 0, 2468, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 2100, 945, 1803, - 2099, 952, 1802, - 2097, 961, 1799, - 2095, 973, 1796, - 2092, 989, 1792, - 2088, 1009, 1786, - 2083, 1035, 1778, - 2076, 1067, 1768, - 2066, 1107, 1753, - 2053, 1156, 1732, - 2034, 1213, 1703, - 2008, 1280, 1662, - 1970, 1357, 1599, - 1915, 1442, 1499, - 1828, 1536, 1318, - 1678, 1638, 834, - 1342, 1745, 0, - 0, 1858, 0, - 0, 1976, 0, - 0, 2096, 0, - 0, 2220, 0, - 0, 2345, 0, - 0, 2472, 0, - 0, 2600, 0, - 0, 2730, 0, - 0, 2859, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2233, 1068, 1936, - 2232, 1074, 1935, - 2231, 1081, 1933, - 2230, 1090, 1930, - 2227, 1102, 1927, - 2225, 1118, 1923, - 2221, 1139, 1917, - 2215, 1164, 1909, - 2208, 1197, 1899, - 2198, 1237, 1884, - 2185, 1286, 1863, - 2166, 1343, 1834, - 2140, 1411, 1793, - 2103, 1488, 1730, - 2047, 1573, 1629, - 1961, 1668, 1447, - 1811, 1769, 958, - 1476, 1877, 0, - 0, 1990, 0, - 0, 2107, 0, - 0, 2228, 0, - 0, 2351, 0, - 0, 2477, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2862, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2366, 1194, 2068, - 2366, 1198, 2067, - 2365, 1203, 2066, - 2364, 1210, 2064, - 2362, 1220, 2062, - 2360, 1232, 2059, - 2357, 1248, 2054, - 2353, 1268, 2049, - 2348, 1294, 2041, - 2340, 1327, 2030, - 2331, 1367, 2015, - 2317, 1416, 1995, - 2299, 1474, 1966, - 2273, 1542, 1924, - 2235, 1619, 1861, - 2180, 1705, 1760, - 2093, 1799, 1577, - 1944, 1901, 1084, - 1609, 2009, 0, - 0, 2122, 0, - 0, 2239, 0, - 0, 2360, 0, - 0, 2483, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2499, 1321, 2200, - 2499, 1324, 2200, - 2498, 1328, 2199, - 2497, 1333, 2197, - 2496, 1340, 2196, - 2494, 1350, 2193, - 2492, 1362, 2190, - 2489, 1378, 2186, - 2485, 1399, 2180, - 2480, 1425, 2172, - 2473, 1458, 2161, - 2463, 1498, 2147, - 2450, 1547, 2126, - 2431, 1605, 2097, - 2405, 1673, 2055, - 2367, 1750, 1992, - 2312, 1836, 1891, - 2226, 1931, 1708, - 2076, 2032, 1211, - 1742, 2140, 0, - 0, 2254, 0, - 0, 2371, 0, - 0, 2492, 0, - 0, 2615, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2996, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2632, 1449, 2333, - 2631, 1451, 2332, - 2631, 1454, 2331, - 2630, 1458, 2330, - 2629, 1464, 2329, - 2628, 1471, 2327, - 2626, 1481, 2325, - 2624, 1493, 2322, - 2621, 1509, 2318, - 2617, 1530, 2312, - 2612, 1556, 2304, - 2605, 1589, 2293, - 2595, 1629, 2278, - 2582, 1678, 2258, - 2563, 1736, 2229, - 2537, 1804, 2187, - 2500, 1881, 2123, - 2444, 1968, 2023, - 2358, 2062, 1839, - 2208, 2164, 1340, - 1874, 2272, 0, - 0, 2385, 0, - 0, 2503, 0, - 0, 2624, 0, - 0, 2747, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3128, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2764, 1578, 2465, - 2764, 1580, 2465, - 2763, 1582, 2464, - 2763, 1585, 2463, - 2762, 1589, 2462, - 2761, 1595, 2461, - 2760, 1602, 2459, - 2759, 1612, 2457, - 2756, 1624, 2454, - 2753, 1640, 2449, - 2750, 1661, 2444, - 2744, 1687, 2436, - 2737, 1720, 2425, - 2727, 1760, 2410, - 2714, 1809, 2389, - 2695, 1868, 2360, - 2669, 1936, 2318, - 2632, 2013, 2255, - 2577, 2099, 2154, - 2490, 2194, 1970, - 2341, 2296, 1469, - 2007, 2404, 0, - 0, 2517, 0, - 0, 2635, 0, - 0, 2756, 0, - 0, 2879, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3260, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1708, 2597, - 2896, 1709, 2597, - 2896, 1711, 2596, - 2896, 1713, 2596, - 2895, 1716, 2595, - 2894, 1721, 2594, - 2893, 1726, 2593, - 2892, 1733, 2591, - 2891, 1743, 2589, - 2889, 1755, 2586, - 2886, 1771, 2581, - 2882, 1792, 2575, - 2876, 1818, 2568, - 2869, 1851, 2557, - 2859, 1892, 2542, - 2846, 1941, 2521, - 2828, 1999, 2492, - 2801, 2067, 2450, - 2764, 2145, 2387, - 2709, 2231, 2286, - 2622, 2326, 2101, - 2473, 2428, 1599, - 2139, 2536, 0, - 0, 2649, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3011, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3029, 1838, 2729, - 3029, 1839, 2729, - 3028, 1841, 2729, - 3028, 1842, 2728, - 3028, 1845, 2728, - 3027, 1848, 2727, - 3027, 1852, 2726, - 3026, 1858, 2725, - 3024, 1865, 2723, - 3023, 1874, 2721, - 3021, 1887, 2717, - 3018, 1903, 2713, - 3014, 1924, 2707, - 3009, 1950, 2699, - 3001, 1983, 2689, - 2992, 2024, 2674, - 2978, 2073, 2653, - 2960, 2131, 2624, - 2934, 2199, 2582, - 2896, 2277, 2519, - 2841, 2363, 2418, - 2755, 2458, 2233, - 2605, 2560, 1730, - 2272, 2668, 0, - 0, 2781, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3143, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3161, 1969, 2861, - 3161, 1970, 2861, - 3161, 1971, 2861, - 3160, 1972, 2861, - 3160, 1974, 2860, - 3160, 1976, 2860, - 3159, 1980, 2859, - 3159, 1984, 2858, - 3158, 1989, 2857, - 3157, 1996, 2855, - 3155, 2006, 2853, - 3153, 2018, 2849, - 3150, 2035, 2845, - 3146, 2055, 2839, - 3141, 2082, 2831, - 3134, 2115, 2821, - 3124, 2155, 2806, - 3110, 2205, 2785, - 3092, 2263, 2756, - 3066, 2331, 2714, - 3028, 2409, 2651, - 2973, 2495, 2549, - 2887, 2590, 2365, - 2737, 2692, 1861, - 2404, 2800, 0, - 0, 2913, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3293, 2100, 2994, - 3293, 2101, 2993, - 3293, 2102, 2993, - 3293, 2103, 2993, - 3293, 2104, 2993, - 3292, 2106, 2992, - 3292, 2108, 2992, - 3291, 2111, 2991, - 3291, 2115, 2990, - 3290, 2121, 2989, - 3289, 2128, 2987, - 3287, 2138, 2985, - 3285, 2150, 2981, - 3282, 2166, 2977, - 3278, 2187, 2971, - 3273, 2213, 2963, - 3266, 2246, 2953, - 3256, 2287, 2938, - 3242, 2336, 2917, - 3224, 2395, 2888, - 3198, 2463, 2846, - 3161, 2541, 2783, - 3105, 2627, 2681, - 3019, 2722, 2497, - 2870, 2824, 1992, - 2536, 2932, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3660, 0, - 3425, 2232, 3126, - 3425, 2232, 3126, - 3425, 2233, 3125, - 3425, 2233, 3125, - 3425, 2234, 3125, - 3425, 2236, 3125, - 3424, 2238, 3124, - 3424, 2240, 3124, - 3424, 2243, 3123, - 3423, 2247, 3122, - 3422, 2253, 3121, - 3421, 2260, 3119, - 3419, 2270, 3117, - 3417, 2282, 3113, - 3414, 2298, 3109, - 3410, 2319, 3103, - 3405, 2345, 3095, - 3398, 2378, 3085, - 3388, 2419, 3070, - 3375, 2468, 3049, - 3356, 2527, 3020, - 3330, 2595, 2978, - 3293, 2673, 2915, - 3237, 2759, 2813, - 3151, 2854, 2629, - 3002, 2956, 2124, - 2668, 3064, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2363, 3258, - 3557, 2364, 3258, - 3557, 2364, 3258, - 3557, 2365, 3258, - 3557, 2365, 3257, - 3557, 2366, 3257, - 3557, 2368, 3257, - 3557, 2370, 3256, - 3556, 2372, 3256, - 3556, 2375, 3255, - 3555, 2379, 3254, - 3554, 2385, 3253, - 3553, 2392, 3251, - 3551, 2402, 3249, - 3549, 2414, 3245, - 3546, 2430, 3241, - 3542, 2451, 3235, - 3537, 2477, 3227, - 3530, 2510, 3217, - 3520, 2551, 3202, - 3507, 2600, 3181, - 3488, 2659, 3152, - 3462, 2727, 3110, - 3425, 2805, 3047, - 3369, 2891, 2945, - 3283, 2986, 2760, - 3134, 3088, 2255, - 2800, 3196, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3690, 2495, 3390, - 3690, 2495, 3390, - 3690, 2496, 3390, - 3689, 2496, 3390, - 3689, 2497, 3390, - 3689, 2497, 3389, - 3689, 2498, 3389, - 3689, 2500, 3389, - 3689, 2501, 3388, - 3688, 2504, 3388, - 3688, 2507, 3387, - 3687, 2511, 3386, - 3686, 2517, 3385, - 3685, 2524, 3383, - 3683, 2534, 3381, - 3681, 2546, 3378, - 3678, 2562, 3373, - 3674, 2583, 3367, - 3669, 2609, 3360, - 3662, 2642, 3349, - 3652, 2683, 3334, - 3639, 2732, 3313, - 3620, 2791, 3284, - 3594, 2859, 3242, - 3557, 2937, 3179, - 3502, 3023, 3077, - 3415, 3118, 2892, - 3266, 3220, 2387, - 2933, 3328, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3822, 2627, 3522, - 3822, 2627, 3522, - 3822, 2627, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2629, 3522, - 3821, 2629, 3521, - 3821, 2630, 3521, - 3821, 2632, 3521, - 3821, 2633, 3521, - 3820, 2636, 3520, - 3820, 2639, 3519, - 3819, 2643, 3518, - 3818, 2649, 3517, - 3817, 2656, 3515, - 3816, 2666, 3513, - 3813, 2678, 3510, - 3810, 2694, 3505, - 3807, 2715, 3499, - 3801, 2741, 3492, - 3794, 2774, 3481, - 3784, 2815, 3466, - 3771, 2864, 3445, - 3752, 2923, 3416, - 3726, 2991, 3374, - 3689, 3069, 3311, - 3634, 3155, 3209, - 3547, 3250, 3024, - 3398, 3352, 2519, - 3065, 3460, 0, - 0, 3574, 0, - 0, 3691, 0, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3953, 2761, 3654, - 3953, 2762, 3653, - 3953, 2764, 3653, - 3953, 2765, 3653, - 3952, 2768, 3652, - 3952, 2771, 3651, - 3951, 2775, 3650, - 3950, 2781, 3649, - 3949, 2788, 3647, - 3948, 2798, 3645, - 3945, 2810, 3642, - 3943, 2826, 3637, - 3939, 2847, 3632, - 3933, 2873, 3624, - 3926, 2906, 3613, - 3916, 2947, 3598, - 3903, 2996, 3577, - 3884, 3055, 3548, - 3858, 3123, 3506, - 3821, 3201, 3443, - 3766, 3287, 3341, - 3679, 3382, 3156, - 3530, 3484, 2651, - 3197, 3592, 0, - 0, 3706, 0, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2893, 3786, - 4085, 2894, 3785, - 4085, 2896, 3785, - 4085, 2897, 3785, - 4085, 2900, 3784, - 4084, 2903, 3783, - 4083, 2907, 3782, - 4083, 2913, 3781, - 4081, 2920, 3779, - 4080, 2930, 3777, - 4078, 2942, 3774, - 4075, 2958, 3769, - 4071, 2979, 3764, - 4065, 3005, 3756, - 4058, 3038, 3745, - 4049, 3079, 3730, - 4035, 3128, 3709, - 4017, 3187, 3680, - 3991, 3255, 3638, - 3953, 3333, 3575, - 3898, 3419, 3473, - 3812, 3514, 3289, - 3662, 3616, 2783, - 3329, 3725, 0, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3025, 3918, - 4095, 3026, 3917, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3032, 3916, - 4095, 3035, 3915, - 4095, 3039, 3915, - 4095, 3045, 3913, - 4095, 3052, 3911, - 4095, 3062, 3909, - 4095, 3074, 3906, - 4095, 3090, 3902, - 4095, 3111, 3896, - 4095, 3137, 3888, - 4095, 3170, 3877, - 4095, 3211, 3862, - 4095, 3261, 3842, - 4095, 3319, 3812, - 4095, 3387, 3770, - 4085, 3465, 3707, - 4030, 3551, 3605, - 3944, 3646, 3421, - 3794, 3748, 2915, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3167, 4048, - 4095, 3171, 4047, - 4095, 3177, 4045, - 4095, 3184, 4044, - 4095, 3194, 4041, - 4095, 3206, 4038, - 4095, 3222, 4034, - 4095, 3243, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3343, 3994, - 4095, 3393, 3974, - 4095, 3451, 3944, - 4095, 3519, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 0, 0, - 0, 0, 0, - 0, 49, 0, - 0, 132, 0, - 0, 224, 0, - 0, 324, 0, - 0, 430, 0, - 0, 542, 0, - 0, 658, 0, - 0, 778, 0, - 0, 901, 0, - 0, 1025, 0, - 0, 1152, 0, - 0, 1280, 0, - 0, 1409, 0, - 0, 1539, 0, - 0, 1669, 0, - 0, 1800, 0, - 0, 1931, 0, - 0, 2063, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2589, 0, - 0, 2721, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3381, 0, - 0, 3514, 0, - 0, 3646, 0, - 104, 0, 80, - 0, 0, 0, - 0, 66, 0, - 0, 147, 0, - 0, 236, 0, - 0, 333, 0, - 0, 438, 0, - 0, 548, 0, - 0, 662, 0, - 0, 781, 0, - 0, 903, 0, - 0, 1028, 0, - 0, 1154, 0, - 0, 1281, 0, - 0, 1410, 0, - 0, 1540, 0, - 0, 1670, 0, - 0, 1800, 0, - 0, 1931, 0, - 0, 2063, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2721, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3381, 0, - 0, 3514, 0, - 0, 3646, 0, - 326, 0, 214, - 262, 20, 152, - 160, 88, 54, - 0, 165, 0, - 0, 251, 0, - 0, 346, 0, - 0, 447, 0, - 0, 555, 0, - 0, 668, 0, - 0, 786, 0, - 0, 907, 0, - 0, 1030, 0, - 0, 1156, 0, - 0, 1283, 0, - 0, 1411, 0, - 0, 1540, 0, - 0, 1670, 0, - 0, 1801, 0, - 0, 1932, 0, - 0, 2063, 0, - 0, 2194, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 515, 0, 347, - 474, 52, 302, - 413, 116, 234, - 315, 188, 122, - 139, 271, 0, - 0, 361, 0, - 0, 460, 0, - 0, 565, 0, - 0, 676, 0, - 0, 792, 0, - 0, 911, 0, - 0, 1034, 0, - 0, 1158, 0, - 0, 1285, 0, - 0, 1413, 0, - 0, 1542, 0, - 0, 1671, 0, - 0, 1802, 0, - 0, 1932, 0, - 0, 2063, 0, - 0, 2195, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 686, 42, 481, - 658, 92, 447, - 618, 150, 399, - 558, 218, 324, - 463, 295, 200, - 295, 382, 0, - 0, 477, 0, - 0, 579, 0, - 0, 687, 0, - 0, 800, 0, - 0, 918, 0, - 0, 1039, 0, - 0, 1162, 0, - 0, 1288, 0, - 0, 1415, 0, - 0, 1543, 0, - 0, 1673, 0, - 0, 1802, 0, - 0, 1933, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 844, 96, 614, - 825, 140, 589, - 798, 192, 554, - 758, 255, 502, - 700, 327, 422, - 607, 408, 287, - 444, 498, 4, - 53, 596, 0, - 0, 700, 0, - 0, 811, 0, - 0, 926, 0, - 0, 1045, 0, - 0, 1167, 0, - 0, 1291, 0, - 0, 1418, 0, - 0, 1545, 0, - 0, 1674, 0, - 0, 1804, 0, - 0, 1934, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 996, 158, 746, - 982, 197, 728, - 963, 244, 702, - 936, 300, 666, - 897, 365, 611, - 839, 440, 527, - 748, 525, 382, - 589, 617, 65, - 214, 718, 0, - 0, 824, 0, - 0, 936, 0, - 0, 1053, 0, - 0, 1173, 0, - 0, 1296, 0, - 0, 1421, 0, - 0, 1548, 0, - 0, 1676, 0, - 0, 1805, 0, - 0, 1935, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1141, 230, 879, - 1131, 263, 865, - 1118, 304, 846, - 1099, 354, 820, - 1072, 412, 782, - 1034, 481, 726, - 976, 558, 638, - 887, 645, 484, - 730, 740, 135, - 367, 842, 0, - 0, 950, 0, - 0, 1064, 0, - 0, 1181, 0, - 0, 1302, 0, - 0, 1426, 0, - 0, 1552, 0, - 0, 1679, 0, - 0, 1807, 0, - 0, 1937, 0, - 0, 2067, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1284, 312, 1011, - 1276, 340, 1001, - 1266, 374, 987, - 1253, 417, 968, - 1234, 468, 941, - 1207, 529, 902, - 1169, 600, 844, - 1112, 679, 753, - 1024, 768, 593, - 869, 865, 214, - 514, 968, 0, - 0, 1078, 0, - 0, 1192, 0, - 0, 1311, 0, - 0, 1432, 0, - 0, 1557, 0, - 0, 1683, 0, - 0, 1810, 0, - 0, 1939, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1423, 402, 1144, - 1418, 425, 1136, - 1410, 454, 1126, - 1401, 490, 1112, - 1387, 534, 1092, - 1368, 587, 1064, - 1342, 650, 1025, - 1304, 722, 966, - 1247, 803, 872, - 1159, 893, 706, - 1006, 991, 302, - 657, 1096, 0, - 0, 1206, 0, - 0, 1322, 0, - 0, 1441, 0, - 0, 1563, 0, - 0, 1687, 0, - 0, 1814, 0, - 0, 1941, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1561, 500, 1276, - 1557, 518, 1270, - 1551, 542, 1263, - 1544, 572, 1252, - 1534, 609, 1238, - 1521, 655, 1218, - 1502, 709, 1190, - 1476, 773, 1150, - 1438, 846, 1090, - 1382, 929, 994, - 1294, 1020, 824, - 1142, 1119, 399, - 797, 1225, 0, - 0, 1336, 0, - 0, 1452, 0, - 0, 1571, 0, - 0, 1694, 0, - 0, 1819, 0, - 0, 1945, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1697, 605, 1408, - 1694, 619, 1404, - 1690, 639, 1398, - 1684, 663, 1391, - 1677, 694, 1380, - 1667, 732, 1366, - 1654, 778, 1346, - 1635, 833, 1317, - 1609, 898, 1277, - 1571, 973, 1216, - 1515, 1056, 1119, - 1428, 1148, 945, - 1277, 1248, 502, - 935, 1354, 0, - 0, 1466, 0, - 0, 1582, 0, - 0, 1702, 0, - 0, 1825, 0, - 0, 1950, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1832, 715, 1540, - 1830, 727, 1537, - 1827, 742, 1533, - 1823, 761, 1527, - 1817, 786, 1519, - 1810, 818, 1509, - 1800, 856, 1494, - 1787, 903, 1474, - 1768, 959, 1446, - 1742, 1025, 1405, - 1704, 1100, 1343, - 1649, 1185, 1245, - 1562, 1277, 1069, - 1411, 1378, 612, - 1071, 1484, 0, - 0, 1597, 0, - 0, 1713, 0, - 0, 1833, 0, - 0, 1956, 0, - 0, 2082, 0, - 0, 2208, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1966, 830, 1672, - 1964, 840, 1670, - 1962, 851, 1667, - 1959, 867, 1663, - 1955, 887, 1657, - 1950, 912, 1649, - 1943, 943, 1639, - 1933, 983, 1624, - 1920, 1030, 1604, - 1901, 1087, 1575, - 1875, 1153, 1534, - 1837, 1229, 1472, - 1782, 1314, 1373, - 1695, 1407, 1194, - 1544, 1508, 726, - 1206, 1615, 0, - 0, 1728, 0, - 0, 1845, 0, - 0, 1965, 0, - 0, 2088, 0, - 0, 2213, 0, - 0, 2340, 0, - 0, 2468, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 2100, 950, 1805, - 2099, 957, 1803, - 2097, 966, 1801, - 2095, 978, 1797, - 2092, 993, 1793, - 2088, 1013, 1787, - 2083, 1039, 1780, - 2075, 1071, 1769, - 2066, 1110, 1754, - 2052, 1159, 1734, - 2034, 1216, 1705, - 2007, 1282, 1663, - 1970, 1359, 1601, - 1914, 1444, 1502, - 1828, 1538, 1322, - 1678, 1639, 844, - 1341, 1746, 0, - 0, 1859, 0, - 0, 1976, 0, - 0, 2097, 0, - 0, 2220, 0, - 0, 2345, 0, - 0, 2472, 0, - 0, 2600, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2233, 1072, 1937, - 2232, 1077, 1935, - 2231, 1084, 1934, - 2229, 1093, 1931, - 2227, 1106, 1928, - 2224, 1121, 1924, - 2220, 1142, 1918, - 2215, 1167, 1910, - 2208, 1200, 1900, - 2198, 1239, 1885, - 2185, 1288, 1864, - 2166, 1345, 1836, - 2140, 1412, 1794, - 2103, 1489, 1731, - 2047, 1575, 1631, - 1960, 1669, 1450, - 1810, 1770, 966, - 1475, 1878, 0, - 0, 1990, 0, - 0, 2108, 0, - 0, 2228, 0, - 0, 2352, 0, - 0, 2477, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2366, 1196, 2069, - 2365, 1200, 2068, - 2365, 1206, 2067, - 2363, 1213, 2065, - 2362, 1222, 2063, - 2360, 1234, 2059, - 2357, 1250, 2055, - 2353, 1271, 2049, - 2347, 1297, 2041, - 2340, 1329, 2031, - 2330, 1369, 2016, - 2317, 1418, 1995, - 2298, 1475, 1966, - 2272, 1543, 1925, - 2235, 1620, 1862, - 2180, 1706, 1762, - 2093, 1800, 1579, - 1943, 1901, 1090, - 1608, 2009, 0, - 0, 2122, 0, - 0, 2239, 0, - 0, 2360, 0, - 0, 2483, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2499, 1323, 2201, - 2498, 1326, 2200, - 2498, 1330, 2199, - 2497, 1335, 2198, - 2496, 1342, 2196, - 2494, 1352, 2194, - 2492, 1364, 2191, - 2489, 1380, 2186, - 2485, 1400, 2181, - 2480, 1426, 2173, - 2473, 1459, 2162, - 2463, 1499, 2147, - 2449, 1548, 2127, - 2431, 1606, 2098, - 2405, 1674, 2056, - 2367, 1751, 1993, - 2312, 1837, 1892, - 2225, 1931, 1709, - 2076, 2033, 1216, - 1741, 2141, 0, - 0, 2254, 0, - 0, 2371, 0, - 0, 2492, 0, - 0, 2615, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2996, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2631, 1450, 2333, - 2631, 1453, 2333, - 2631, 1456, 2332, - 2630, 1460, 2331, - 2629, 1465, 2330, - 2628, 1473, 2328, - 2626, 1482, 2325, - 2624, 1494, 2322, - 2621, 1510, 2318, - 2617, 1531, 2312, - 2612, 1557, 2304, - 2605, 1590, 2294, - 2595, 1630, 2279, - 2582, 1679, 2258, - 2563, 1737, 2229, - 2537, 1805, 2187, - 2500, 1882, 2124, - 2444, 1968, 2023, - 2358, 2063, 1840, - 2208, 2164, 1343, - 1874, 2272, 0, - 0, 2386, 0, - 0, 2503, 0, - 0, 2624, 0, - 0, 2747, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3128, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2764, 1579, 2465, - 2764, 1581, 2465, - 2763, 1583, 2464, - 2763, 1586, 2464, - 2762, 1590, 2463, - 2761, 1596, 2461, - 2760, 1603, 2460, - 2758, 1613, 2457, - 2756, 1625, 2454, - 2753, 1641, 2450, - 2749, 1662, 2444, - 2744, 1688, 2436, - 2737, 1721, 2425, - 2727, 1761, 2410, - 2714, 1810, 2390, - 2695, 1868, 2361, - 2669, 1936, 2319, - 2632, 2013, 2256, - 2576, 2100, 2155, - 2490, 2194, 1971, - 2341, 2296, 1472, - 2006, 2404, 0, - 0, 2518, 0, - 0, 2635, 0, - 0, 2756, 0, - 0, 2879, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1709, 2597, - 2896, 1710, 2597, - 2896, 1712, 2597, - 2895, 1714, 2596, - 2895, 1717, 2595, - 2894, 1721, 2594, - 2893, 1727, 2593, - 2892, 1734, 2591, - 2891, 1744, 2589, - 2888, 1756, 2586, - 2886, 1772, 2581, - 2882, 1793, 2576, - 2876, 1819, 2568, - 2869, 1852, 2557, - 2859, 1892, 2542, - 2846, 1942, 2522, - 2827, 2000, 2492, - 2801, 2068, 2450, - 2764, 2145, 2387, - 2709, 2232, 2286, - 2622, 2326, 2102, - 2473, 2428, 1601, - 2139, 2536, 0, - 0, 2650, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3011, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3029, 1839, 2729, - 3029, 1840, 2729, - 3028, 1841, 2729, - 3028, 1843, 2729, - 3028, 1845, 2728, - 3027, 1849, 2727, - 3026, 1853, 2726, - 3026, 1858, 2725, - 3024, 1865, 2723, - 3023, 1875, 2721, - 3021, 1887, 2718, - 3018, 1904, 2713, - 3014, 1924, 2708, - 3009, 1950, 2700, - 3001, 1983, 2689, - 2992, 2024, 2674, - 2978, 2073, 2653, - 2960, 2132, 2624, - 2934, 2199, 2582, - 2896, 2277, 2519, - 2841, 2363, 2418, - 2754, 2458, 2234, - 2605, 2560, 1732, - 2271, 2668, 0, - 0, 2781, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3161, 1970, 2862, - 3161, 1970, 2861, - 3161, 1971, 2861, - 3160, 1973, 2861, - 3160, 1975, 2860, - 3160, 1977, 2860, - 3159, 1980, 2859, - 3159, 1984, 2858, - 3158, 1990, 2857, - 3157, 1997, 2855, - 3155, 2006, 2853, - 3153, 2019, 2850, - 3150, 2035, 2845, - 3146, 2056, 2839, - 3141, 2082, 2832, - 3133, 2115, 2821, - 3124, 2156, 2806, - 3110, 2205, 2785, - 3092, 2263, 2756, - 3066, 2331, 2714, - 3028, 2409, 2651, - 2973, 2495, 2550, - 2887, 2590, 2365, - 2737, 2692, 1862, - 2404, 2800, 0, - 0, 2914, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3293, 2101, 2994, - 3293, 2101, 2994, - 3293, 2102, 2993, - 3293, 2103, 2993, - 3293, 2104, 2993, - 3292, 2106, 2992, - 3292, 2109, 2992, - 3291, 2112, 2991, - 3291, 2116, 2990, - 3290, 2121, 2989, - 3289, 2129, 2987, - 3287, 2138, 2985, - 3285, 2151, 2982, - 3282, 2167, 2977, - 3278, 2187, 2971, - 3273, 2214, 2963, - 3266, 2247, 2953, - 3256, 2287, 2938, - 3242, 2337, 2917, - 3224, 2395, 2888, - 3198, 2463, 2846, - 3160, 2541, 2783, - 3105, 2627, 2681, - 3019, 2722, 2497, - 2870, 2824, 1993, - 2536, 2932, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3660, 0, - 3425, 2232, 3126, - 3425, 2232, 3126, - 3425, 2233, 3126, - 3425, 2234, 3125, - 3425, 2235, 3125, - 3425, 2236, 3125, - 3424, 2238, 3124, - 3424, 2240, 3124, - 3424, 2243, 3123, - 3423, 2248, 3122, - 3422, 2253, 3121, - 3421, 2260, 3119, - 3419, 2270, 3117, - 3417, 2282, 3114, - 3414, 2299, 3109, - 3410, 2319, 3103, - 3405, 2346, 3095, - 3398, 2379, 3085, - 3388, 2419, 3070, - 3375, 2469, 3049, - 3356, 2527, 3020, - 3330, 2595, 2978, - 3293, 2673, 2915, - 3237, 2759, 2813, - 3151, 2854, 2629, - 3002, 2956, 2124, - 2668, 3064, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2364, 3258, - 3557, 2364, 3258, - 3557, 2364, 3258, - 3557, 2365, 3258, - 3557, 2366, 3257, - 3557, 2367, 3257, - 3557, 2368, 3257, - 3557, 2370, 3256, - 3556, 2372, 3256, - 3556, 2375, 3255, - 3555, 2379, 3254, - 3554, 2385, 3253, - 3553, 2392, 3251, - 3551, 2402, 3249, - 3549, 2414, 3246, - 3546, 2430, 3241, - 3542, 2451, 3235, - 3537, 2477, 3228, - 3530, 2510, 3217, - 3520, 2551, 3202, - 3507, 2600, 3181, - 3488, 2659, 3152, - 3462, 2727, 3110, - 3425, 2805, 3047, - 3369, 2891, 2945, - 3283, 2986, 2761, - 3134, 3088, 2256, - 2800, 3196, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3690, 2495, 3390, - 3690, 2495, 3390, - 3690, 2496, 3390, - 3689, 2496, 3390, - 3689, 2497, 3390, - 3689, 2497, 3389, - 3689, 2498, 3389, - 3689, 2500, 3389, - 3689, 2502, 3389, - 3688, 2504, 3388, - 3688, 2507, 3387, - 3687, 2511, 3386, - 3686, 2517, 3385, - 3685, 2524, 3383, - 3683, 2534, 3381, - 3681, 2546, 3378, - 3678, 2562, 3373, - 3674, 2583, 3367, - 3669, 2609, 3360, - 3662, 2642, 3349, - 3652, 2683, 3334, - 3639, 2732, 3313, - 3620, 2791, 3284, - 3594, 2859, 3242, - 3557, 2937, 3179, - 3502, 3023, 3077, - 3415, 3118, 2893, - 3266, 3220, 2387, - 2933, 3328, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3822, 2627, 3522, - 3822, 2627, 3522, - 3822, 2627, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3821, 2629, 3522, - 3821, 2629, 3522, - 3821, 2630, 3521, - 3821, 2632, 3521, - 3821, 2634, 3521, - 3820, 2636, 3520, - 3820, 2639, 3519, - 3819, 2643, 3518, - 3818, 2649, 3517, - 3817, 2656, 3515, - 3815, 2666, 3513, - 3813, 2678, 3510, - 3810, 2694, 3505, - 3807, 2715, 3500, - 3801, 2741, 3492, - 3794, 2774, 3481, - 3784, 2815, 3466, - 3771, 2864, 3445, - 3752, 2923, 3416, - 3726, 2991, 3374, - 3689, 3069, 3311, - 3634, 3155, 3209, - 3547, 3250, 3025, - 3398, 3352, 2519, - 3065, 3460, 0, - 0, 3574, 0, - 0, 3691, 0, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3953, 2761, 3654, - 3953, 2762, 3653, - 3953, 2764, 3653, - 3953, 2766, 3653, - 3952, 2768, 3652, - 3952, 2771, 3651, - 3951, 2775, 3650, - 3950, 2781, 3649, - 3949, 2788, 3647, - 3948, 2798, 3645, - 3945, 2810, 3642, - 3943, 2826, 3637, - 3939, 2847, 3632, - 3933, 2873, 3624, - 3926, 2906, 3613, - 3916, 2947, 3598, - 3903, 2996, 3577, - 3884, 3055, 3548, - 3858, 3123, 3506, - 3821, 3201, 3443, - 3766, 3287, 3341, - 3679, 3382, 3157, - 3530, 3484, 2651, - 3197, 3592, 0, - 0, 3706, 0, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2893, 3786, - 4085, 2894, 3785, - 4085, 2896, 3785, - 4085, 2898, 3785, - 4085, 2900, 3784, - 4084, 2903, 3783, - 4083, 2907, 3782, - 4083, 2913, 3781, - 4081, 2920, 3779, - 4080, 2930, 3777, - 4078, 2942, 3774, - 4075, 2958, 3769, - 4071, 2979, 3764, - 4065, 3005, 3756, - 4058, 3038, 3745, - 4049, 3079, 3730, - 4035, 3129, 3709, - 4017, 3187, 3680, - 3991, 3255, 3638, - 3953, 3333, 3575, - 3898, 3419, 3473, - 3811, 3514, 3289, - 3662, 3616, 2783, - 3329, 3725, 0, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3032, 3916, - 4095, 3035, 3916, - 4095, 3039, 3915, - 4095, 3045, 3913, - 4095, 3052, 3911, - 4095, 3062, 3909, - 4095, 3074, 3906, - 4095, 3090, 3902, - 4095, 3111, 3896, - 4095, 3137, 3888, - 4095, 3171, 3877, - 4095, 3211, 3862, - 4095, 3261, 3842, - 4095, 3319, 3812, - 4095, 3387, 3770, - 4085, 3465, 3707, - 4030, 3551, 3605, - 3944, 3646, 3421, - 3794, 3748, 2915, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3167, 4048, - 4095, 3171, 4047, - 4095, 3177, 4045, - 4095, 3184, 4044, - 4095, 3194, 4041, - 4095, 3206, 4038, - 4095, 3222, 4034, - 4095, 3243, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3343, 3994, - 4095, 3393, 3974, - 4095, 3451, 3944, - 4095, 3519, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 0, 36, - 0, 24, 0, - 0, 91, 0, - 0, 168, 0, - 0, 254, 0, - 0, 348, 0, - 0, 449, 0, - 0, 557, 0, - 0, 669, 0, - 0, 787, 0, - 0, 907, 0, - 0, 1031, 0, - 0, 1156, 0, - 0, 1283, 0, - 0, 1411, 0, - 0, 1541, 0, - 0, 1671, 0, - 0, 1801, 0, - 0, 1932, 0, - 0, 2063, 0, - 0, 2195, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 67, 0, 149, - 0, 42, 77, - 0, 107, 0, - 0, 181, 0, - 0, 264, 0, - 0, 356, 0, - 0, 456, 0, - 0, 562, 0, - 0, 674, 0, - 0, 790, 0, - 0, 910, 0, - 0, 1033, 0, - 0, 1158, 0, - 0, 1284, 0, - 0, 1412, 0, - 0, 1541, 0, - 0, 1671, 0, - 0, 1801, 0, - 0, 1932, 0, - 0, 2063, 0, - 0, 2195, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2853, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3249, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 303, 13, 267, - 236, 65, 212, - 127, 127, 127, - 0, 198, 0, - 0, 279, 0, - 0, 368, 0, - 0, 465, 0, - 0, 570, 0, - 0, 680, 0, - 0, 795, 0, - 0, 913, 0, - 0, 1035, 0, - 0, 1160, 0, - 0, 1286, 0, - 0, 1413, 0, - 0, 1542, 0, - 0, 1672, 0, - 0, 1802, 0, - 0, 1933, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2326, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2985, 0, - 0, 3117, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 500, 45, 387, - 458, 94, 346, - 394, 152, 284, - 292, 220, 186, - 105, 297, 8, - 0, 383, 0, - 0, 478, 0, - 0, 579, 0, - 0, 687, 0, - 0, 801, 0, - 0, 918, 0, - 0, 1039, 0, - 0, 1162, 0, - 0, 1288, 0, - 0, 1415, 0, - 0, 1543, 0, - 0, 1673, 0, - 0, 1803, 0, - 0, 1933, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 676, 85, 511, - 647, 130, 480, - 606, 184, 434, - 545, 248, 366, - 447, 321, 254, - 271, 403, 43, - 0, 494, 0, - 0, 592, 0, - 0, 697, 0, - 0, 808, 0, - 0, 924, 0, - 0, 1044, 0, - 0, 1166, 0, - 0, 1291, 0, - 0, 1417, 0, - 0, 1545, 0, - 0, 1674, 0, - 0, 1803, 0, - 0, 1934, 0, - 0, 2064, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 837, 134, 636, - 818, 175, 613, - 790, 224, 579, - 750, 282, 531, - 690, 350, 456, - 596, 428, 332, - 427, 514, 85, - 12, 609, 0, - 0, 711, 0, - 0, 819, 0, - 0, 932, 0, - 0, 1050, 0, - 0, 1171, 0, - 0, 1294, 0, - 0, 1420, 0, - 0, 1547, 0, - 0, 1675, 0, - 0, 1805, 0, - 0, 1935, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 991, 192, 763, - 977, 228, 746, - 957, 272, 721, - 930, 325, 686, - 891, 387, 634, - 832, 459, 554, - 740, 540, 419, - 577, 630, 136, - 186, 728, 0, - 0, 832, 0, - 0, 943, 0, - 0, 1058, 0, - 0, 1177, 0, - 0, 1299, 0, - 0, 1423, 0, - 0, 1550, 0, - 0, 1677, 0, - 0, 1806, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1138, 259, 892, - 1128, 290, 878, - 1114, 329, 860, - 1095, 376, 834, - 1068, 432, 798, - 1029, 497, 743, - 971, 572, 659, - 880, 657, 514, - 721, 749, 197, - 347, 850, 0, - 0, 956, 0, - 0, 1068, 0, - 0, 1185, 0, - 0, 1305, 0, - 0, 1428, 0, - 0, 1553, 0, - 0, 1680, 0, - 0, 1808, 0, - 0, 1937, 0, - 0, 2067, 0, - 0, 2198, 0, - 0, 2328, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1281, 336, 1021, - 1274, 362, 1011, - 1264, 395, 997, - 1250, 436, 978, - 1231, 486, 952, - 1204, 544, 914, - 1166, 613, 858, - 1109, 690, 770, - 1019, 777, 616, - 862, 872, 267, - 499, 974, 0, - 0, 1082, 0, - 0, 1196, 0, - 0, 1314, 0, - 0, 1435, 0, - 0, 1558, 0, - 0, 1684, 0, - 0, 1811, 0, - 0, 1939, 0, - 0, 2069, 0, - 0, 2199, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1421, 422, 1151, - 1416, 444, 1143, - 1408, 472, 1133, - 1398, 506, 1119, - 1385, 549, 1100, - 1366, 601, 1073, - 1339, 661, 1034, - 1301, 732, 976, - 1245, 811, 885, - 1156, 900, 725, - 1001, 997, 346, - 646, 1100, 0, - 0, 1210, 0, - 0, 1324, 0, - 0, 1443, 0, - 0, 1565, 0, - 0, 1689, 0, - 0, 1815, 0, - 0, 1942, 0, - 0, 2071, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1559, 516, 1281, - 1555, 534, 1276, - 1550, 557, 1268, - 1543, 586, 1258, - 1533, 622, 1244, - 1519, 666, 1224, - 1500, 719, 1197, - 1474, 782, 1157, - 1436, 854, 1098, - 1380, 935, 1004, - 1291, 1025, 838, - 1138, 1123, 434, - 789, 1228, 0, - 0, 1339, 0, - 0, 1454, 0, - 0, 1573, 0, - 0, 1695, 0, - 0, 1820, 0, - 0, 1946, 0, - 0, 2074, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1696, 617, 1412, - 1693, 632, 1408, - 1689, 651, 1402, - 1683, 674, 1395, - 1676, 704, 1384, - 1666, 741, 1370, - 1653, 787, 1350, - 1634, 841, 1322, - 1608, 905, 1282, - 1570, 978, 1222, - 1514, 1061, 1126, - 1426, 1152, 956, - 1274, 1251, 531, - 929, 1357, 0, - 0, 1468, 0, - 0, 1584, 0, - 0, 1703, 0, - 0, 1826, 0, - 0, 1951, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1831, 725, 1543, - 1829, 737, 1540, - 1826, 752, 1536, - 1822, 771, 1530, - 1817, 795, 1523, - 1809, 826, 1512, - 1800, 864, 1498, - 1786, 910, 1478, - 1767, 965, 1449, - 1741, 1030, 1409, - 1703, 1105, 1348, - 1648, 1188, 1251, - 1560, 1280, 1077, - 1409, 1380, 634, - 1067, 1486, 0, - 0, 1598, 0, - 0, 1714, 0, - 0, 1834, 0, - 0, 1957, 0, - 0, 2082, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1965, 838, 1675, - 1964, 847, 1672, - 1962, 859, 1669, - 1959, 874, 1665, - 1955, 894, 1659, - 1949, 918, 1652, - 1942, 950, 1641, - 1932, 988, 1626, - 1919, 1035, 1606, - 1900, 1092, 1578, - 1874, 1157, 1537, - 1837, 1232, 1475, - 1781, 1317, 1377, - 1694, 1409, 1201, - 1543, 1510, 744, - 1203, 1617, 0, - 0, 1729, 0, - 0, 1845, 0, - 0, 1966, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 2099, 956, 1806, - 2098, 963, 1805, - 2097, 972, 1802, - 2094, 983, 1799, - 2091, 999, 1795, - 2087, 1019, 1789, - 2082, 1044, 1781, - 2075, 1076, 1771, - 2065, 1115, 1756, - 2052, 1162, 1736, - 2033, 1219, 1707, - 2007, 1285, 1666, - 1969, 1361, 1604, - 1914, 1446, 1505, - 1827, 1539, 1326, - 1676, 1640, 858, - 1338, 1747, 0, - 0, 1860, 0, - 0, 1977, 0, - 0, 2097, 0, - 0, 2220, 0, - 0, 2345, 0, - 0, 2472, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2233, 1076, 1938, - 2232, 1082, 1937, - 2231, 1089, 1935, - 2229, 1098, 1933, - 2227, 1110, 1929, - 2224, 1125, 1925, - 2220, 1146, 1919, - 2215, 1171, 1912, - 2208, 1203, 1901, - 2198, 1243, 1886, - 2184, 1291, 1866, - 2166, 1348, 1837, - 2140, 1415, 1796, - 2102, 1491, 1733, - 2047, 1576, 1634, - 1960, 1670, 1454, - 1810, 1771, 976, - 1473, 1878, 0, - 0, 1991, 0, - 0, 2108, 0, - 0, 2229, 0, - 0, 2352, 0, - 0, 2477, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2366, 1200, 2070, - 2365, 1204, 2069, - 2364, 1209, 2068, - 2363, 1216, 2066, - 2361, 1226, 2063, - 2359, 1238, 2060, - 2356, 1253, 2056, - 2352, 1274, 2050, - 2347, 1299, 2042, - 2340, 1332, 2032, - 2330, 1371, 2017, - 2317, 1420, 1997, - 2298, 1477, 1968, - 2272, 1544, 1926, - 2235, 1621, 1863, - 2179, 1707, 1763, - 2092, 1801, 1582, - 1943, 1902, 1098, - 1607, 2010, 0, - 0, 2123, 0, - 0, 2240, 0, - 0, 2360, 0, - 0, 2484, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2499, 1325, 2202, - 2498, 1328, 2201, - 2498, 1332, 2200, - 2497, 1338, 2199, - 2495, 1345, 2197, - 2494, 1354, 2195, - 2492, 1367, 2191, - 2489, 1382, 2187, - 2485, 1403, 2181, - 2480, 1429, 2174, - 2472, 1461, 2163, - 2463, 1501, 2148, - 2449, 1550, 2128, - 2431, 1608, 2099, - 2404, 1675, 2057, - 2367, 1752, 1994, - 2312, 1838, 1894, - 2225, 1932, 1711, - 2075, 2033, 1222, - 1740, 2141, 0, - 0, 2254, 0, - 0, 2371, 0, - 0, 2492, 0, - 0, 2616, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2996, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2631, 1452, 2334, - 2631, 1455, 2333, - 2630, 1458, 2332, - 2630, 1462, 2331, - 2629, 1467, 2330, - 2628, 1474, 2328, - 2626, 1484, 2326, - 2624, 1496, 2323, - 2621, 1512, 2319, - 2617, 1533, 2313, - 2612, 1559, 2305, - 2605, 1591, 2294, - 2595, 1631, 2279, - 2581, 1680, 2259, - 2563, 1738, 2230, - 2537, 1806, 2188, - 2499, 1883, 2125, - 2444, 1969, 2024, - 2357, 2063, 1842, - 2208, 2165, 1348, - 1873, 2273, 0, - 0, 2386, 0, - 0, 2503, 0, - 0, 2624, 0, - 0, 2748, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2764, 1581, 2466, - 2764, 1582, 2465, - 2763, 1585, 2465, - 2763, 1588, 2464, - 2762, 1592, 2463, - 2761, 1597, 2462, - 2760, 1605, 2460, - 2758, 1614, 2458, - 2756, 1626, 2454, - 2753, 1642, 2450, - 2749, 1663, 2444, - 2744, 1689, 2436, - 2737, 1722, 2426, - 2727, 1762, 2411, - 2714, 1811, 2390, - 2695, 1869, 2361, - 2669, 1937, 2319, - 2632, 2014, 2256, - 2576, 2100, 2155, - 2490, 2195, 1972, - 2340, 2297, 1475, - 2006, 2405, 0, - 0, 2518, 0, - 0, 2635, 0, - 0, 2756, 0, - 0, 2880, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1710, 2598, - 2896, 1711, 2597, - 2896, 1713, 2597, - 2895, 1715, 2596, - 2895, 1718, 2596, - 2894, 1723, 2595, - 2893, 1728, 2593, - 2892, 1735, 2592, - 2891, 1745, 2589, - 2888, 1757, 2586, - 2885, 1773, 2582, - 2882, 1794, 2576, - 2876, 1820, 2568, - 2869, 1853, 2557, - 2859, 1893, 2542, - 2846, 1942, 2522, - 2827, 2001, 2493, - 2801, 2068, 2451, - 2764, 2146, 2388, - 2709, 2232, 2287, - 2622, 2326, 2103, - 2473, 2428, 1604, - 2139, 2536, 0, - 0, 2650, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3012, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3029, 1840, 2730, - 3028, 1841, 2729, - 3028, 1842, 2729, - 3028, 1844, 2729, - 3028, 1846, 2728, - 3027, 1849, 2727, - 3026, 1854, 2726, - 3026, 1859, 2725, - 3024, 1866, 2723, - 3023, 1876, 2721, - 3021, 1888, 2718, - 3018, 1904, 2714, - 3014, 1925, 2708, - 3008, 1951, 2700, - 3001, 1984, 2689, - 2992, 2025, 2674, - 2978, 2074, 2654, - 2960, 2132, 2625, - 2933, 2200, 2582, - 2896, 2277, 2519, - 2841, 2364, 2418, - 2754, 2458, 2234, - 2605, 2560, 1733, - 2271, 2668, 0, - 0, 2782, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3161, 1970, 2862, - 3161, 1971, 2862, - 3161, 1972, 2861, - 3160, 1973, 2861, - 3160, 1975, 2861, - 3160, 1978, 2860, - 3159, 1981, 2859, - 3159, 1985, 2858, - 3158, 1990, 2857, - 3156, 1998, 2855, - 3155, 2007, 2853, - 3153, 2020, 2850, - 3150, 2036, 2845, - 3146, 2056, 2840, - 3141, 2083, 2832, - 3133, 2115, 2821, - 3124, 2156, 2806, - 3110, 2205, 2785, - 3092, 2264, 2756, - 3066, 2332, 2714, - 3028, 2409, 2651, - 2973, 2495, 2550, - 2887, 2590, 2366, - 2737, 2692, 1864, - 2403, 2800, 0, - 0, 2914, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3293, 2101, 2994, - 3293, 2102, 2994, - 3293, 2103, 2993, - 3293, 2104, 2993, - 3293, 2105, 2993, - 3292, 2107, 2993, - 3292, 2109, 2992, - 3291, 2112, 2991, - 3291, 2116, 2990, - 3290, 2122, 2989, - 3289, 2129, 2987, - 3287, 2139, 2985, - 3285, 2151, 2982, - 3282, 2167, 2977, - 3278, 2188, 2972, - 3273, 2214, 2964, - 3266, 2247, 2953, - 3256, 2288, 2938, - 3242, 2337, 2917, - 3224, 2395, 2888, - 3198, 2463, 2846, - 3160, 2541, 2783, - 3105, 2627, 2682, - 3019, 2722, 2497, - 2869, 2824, 1994, - 2536, 2932, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3660, 0, - 3425, 2232, 3126, - 3425, 2233, 3126, - 3425, 2233, 3126, - 3425, 2234, 3125, - 3425, 2235, 3125, - 3425, 2236, 3125, - 3424, 2238, 3125, - 3424, 2241, 3124, - 3424, 2244, 3123, - 3423, 2248, 3122, - 3422, 2253, 3121, - 3421, 2261, 3119, - 3419, 2270, 3117, - 3417, 2283, 3114, - 3414, 2299, 3109, - 3410, 2320, 3103, - 3405, 2346, 3096, - 3398, 2379, 3085, - 3388, 2420, 3070, - 3375, 2469, 3049, - 3356, 2527, 3020, - 3330, 2595, 2978, - 3293, 2673, 2915, - 3237, 2759, 2814, - 3151, 2854, 2629, - 3002, 2956, 2125, - 2668, 3064, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2364, 3258, - 3557, 2364, 3258, - 3557, 2365, 3258, - 3557, 2365, 3258, - 3557, 2366, 3257, - 3557, 2367, 3257, - 3557, 2368, 3257, - 3557, 2370, 3257, - 3556, 2372, 3256, - 3556, 2375, 3255, - 3555, 2380, 3254, - 3554, 2385, 3253, - 3553, 2392, 3251, - 3551, 2402, 3249, - 3549, 2414, 3246, - 3546, 2431, 3241, - 3542, 2451, 3235, - 3537, 2478, 3228, - 3530, 2511, 3217, - 3520, 2551, 3202, - 3507, 2601, 3181, - 3488, 2659, 3152, - 3462, 2727, 3110, - 3425, 2805, 3047, - 3369, 2891, 2945, - 3283, 2986, 2761, - 3134, 3088, 2256, - 2800, 3196, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3690, 2495, 3390, - 3690, 2496, 3390, - 3690, 2496, 3390, - 3689, 2496, 3390, - 3689, 2497, 3390, - 3689, 2498, 3389, - 3689, 2499, 3389, - 3689, 2500, 3389, - 3689, 2502, 3389, - 3688, 2504, 3388, - 3688, 2507, 3387, - 3687, 2511, 3386, - 3686, 2517, 3385, - 3685, 2524, 3383, - 3683, 2534, 3381, - 3681, 2546, 3378, - 3678, 2562, 3373, - 3674, 2583, 3368, - 3669, 2610, 3360, - 3662, 2643, 3349, - 3652, 2683, 3334, - 3639, 2733, 3313, - 3620, 2791, 3284, - 3594, 2859, 3242, - 3557, 2937, 3179, - 3502, 3023, 3077, - 3415, 3118, 2893, - 3266, 3220, 2388, - 2932, 3328, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3822, 2627, 3522, - 3822, 2627, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3821, 2629, 3522, - 3821, 2630, 3522, - 3821, 2631, 3521, - 3821, 2632, 3521, - 3821, 2634, 3521, - 3820, 2636, 3520, - 3820, 2639, 3519, - 3819, 2643, 3518, - 3818, 2649, 3517, - 3817, 2656, 3515, - 3815, 2666, 3513, - 3813, 2678, 3510, - 3810, 2694, 3505, - 3807, 2715, 3500, - 3801, 2742, 3492, - 3794, 2775, 3481, - 3784, 2815, 3466, - 3771, 2865, 3445, - 3752, 2923, 3416, - 3726, 2991, 3374, - 3689, 3069, 3311, - 3634, 3155, 3209, - 3547, 3250, 3025, - 3398, 3352, 2520, - 3065, 3460, 0, - 0, 3574, 0, - 0, 3691, 0, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3953, 2762, 3654, - 3953, 2763, 3653, - 3953, 2764, 3653, - 3953, 2766, 3653, - 3952, 2768, 3652, - 3952, 2771, 3651, - 3951, 2775, 3650, - 3950, 2781, 3649, - 3949, 2788, 3647, - 3948, 2798, 3645, - 3945, 2810, 3642, - 3943, 2826, 3637, - 3939, 2847, 3632, - 3933, 2873, 3624, - 3926, 2907, 3613, - 3916, 2947, 3598, - 3903, 2997, 3577, - 3884, 3055, 3548, - 3858, 3123, 3506, - 3821, 3201, 3443, - 3766, 3287, 3341, - 3679, 3382, 3157, - 3530, 3484, 2651, - 3197, 3592, 0, - 0, 3706, 0, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4085, 2895, 3785, - 4085, 2896, 3785, - 4085, 2898, 3785, - 4085, 2900, 3784, - 4084, 2903, 3783, - 4083, 2907, 3782, - 4083, 2913, 3781, - 4081, 2920, 3779, - 4080, 2930, 3777, - 4078, 2942, 3774, - 4075, 2958, 3770, - 4071, 2979, 3764, - 4065, 3005, 3756, - 4058, 3039, 3745, - 4049, 3079, 3730, - 4035, 3129, 3709, - 4017, 3187, 3680, - 3991, 3255, 3638, - 3953, 3333, 3575, - 3898, 3419, 3473, - 3811, 3514, 3289, - 3662, 3616, 2783, - 3329, 3725, 0, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3032, 3916, - 4095, 3035, 3916, - 4095, 3039, 3915, - 4095, 3045, 3913, - 4095, 3052, 3911, - 4095, 3062, 3909, - 4095, 3074, 3906, - 4095, 3090, 3902, - 4095, 3111, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3211, 3862, - 4095, 3261, 3842, - 4095, 3319, 3812, - 4095, 3387, 3770, - 4085, 3465, 3707, - 4030, 3551, 3606, - 3944, 3646, 3421, - 3794, 3748, 2915, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3167, 4048, - 4095, 3171, 4047, - 4095, 3177, 4045, - 4095, 3184, 4044, - 4095, 3194, 4041, - 4095, 3206, 4038, - 4095, 3222, 4034, - 4095, 3243, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3343, 3994, - 4095, 3393, 3974, - 4095, 3451, 3944, - 4095, 3519, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 33, 135, - 0, 83, 61, - 0, 142, 0, - 0, 211, 0, - 0, 290, 0, - 0, 377, 0, - 0, 473, 0, - 0, 576, 0, - 0, 684, 0, - 0, 798, 0, - 0, 916, 0, - 0, 1037, 0, - 0, 1161, 0, - 0, 1287, 0, - 0, 1414, 0, - 0, 1543, 0, - 0, 1672, 0, - 0, 1802, 0, - 0, 1933, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 11, 50, 228, - 0, 99, 168, - 0, 156, 74, - 0, 223, 0, - 0, 300, 0, - 0, 386, 0, - 0, 480, 0, - 0, 581, 0, - 0, 689, 0, - 0, 802, 0, - 0, 919, 0, - 0, 1039, 0, - 0, 1163, 0, - 0, 1288, 0, - 0, 1415, 0, - 0, 1543, 0, - 0, 1673, 0, - 0, 1803, 0, - 0, 1933, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 271, 73, 329, - 199, 119, 281, - 79, 174, 209, - 0, 239, 91, - 0, 313, 0, - 0, 397, 0, - 0, 489, 0, - 0, 588, 0, - 0, 694, 0, - 0, 806, 0, - 0, 922, 0, - 0, 1042, 0, - 0, 1165, 0, - 0, 1290, 0, - 0, 1416, 0, - 0, 1544, 0, - 0, 1673, 0, - 0, 1803, 0, - 0, 1934, 0, - 0, 2064, 0, - 0, 2195, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 480, 102, 436, - 435, 145, 399, - 368, 197, 344, - 259, 259, 259, - 54, 330, 113, - 0, 411, 0, - 0, 500, 0, - 0, 597, 0, - 0, 702, 0, - 0, 812, 0, - 0, 927, 0, - 0, 1045, 0, - 0, 1167, 0, - 0, 1292, 0, - 0, 1418, 0, - 0, 1546, 0, - 0, 1674, 0, - 0, 1804, 0, - 0, 1934, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2458, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 662, 137, 548, - 632, 177, 519, - 590, 226, 478, - 526, 284, 416, - 424, 352, 318, - 237, 429, 140, - 0, 515, 0, - 0, 610, 0, - 0, 711, 0, - 0, 819, 0, - 0, 933, 0, - 0, 1050, 0, - 0, 1171, 0, - 0, 1294, 0, - 0, 1420, 0, - 0, 1547, 0, - 0, 1675, 0, - 0, 1805, 0, - 0, 1935, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 828, 181, 665, - 808, 217, 643, - 779, 262, 612, - 738, 316, 566, - 677, 380, 498, - 579, 453, 386, - 403, 535, 175, - 0, 626, 0, - 0, 724, 0, - 0, 830, 0, - 0, 941, 0, - 0, 1056, 0, - 0, 1176, 0, - 0, 1298, 0, - 0, 1423, 0, - 0, 1549, 0, - 0, 1677, 0, - 0, 1806, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 984, 233, 785, - 970, 266, 768, - 950, 307, 745, - 922, 356, 712, - 882, 414, 663, - 822, 482, 588, - 728, 560, 464, - 559, 646, 217, - 144, 741, 0, - 0, 843, 0, - 0, 951, 0, - 0, 1064, 0, - 0, 1182, 0, - 0, 1303, 0, - 0, 1426, 0, - 0, 1552, 0, - 0, 1679, 0, - 0, 1807, 0, - 0, 1937, 0, - 0, 2067, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1133, 295, 908, - 1123, 324, 895, - 1109, 360, 878, - 1089, 404, 853, - 1062, 457, 818, - 1023, 519, 766, - 964, 591, 686, - 872, 672, 551, - 709, 762, 268, - 318, 860, 0, - 0, 964, 0, - 0, 1075, 0, - 0, 1190, 0, - 0, 1309, 0, - 0, 1431, 0, - 0, 1555, 0, - 0, 1682, 0, - 0, 1809, 0, - 0, 1938, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1277, 366, 1033, - 1270, 391, 1024, - 1260, 422, 1010, - 1246, 461, 992, - 1227, 508, 967, - 1200, 564, 930, - 1161, 629, 876, - 1103, 705, 791, - 1013, 789, 646, - 853, 882, 329, - 479, 982, 0, - 0, 1088, 0, - 0, 1201, 0, - 0, 1317, 0, - 0, 1437, 0, - 0, 1560, 0, - 0, 1685, 0, - 0, 1812, 0, - 0, 1940, 0, - 0, 2069, 0, - 0, 2199, 0, - 0, 2330, 0, - 0, 2460, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1418, 447, 1160, - 1413, 468, 1153, - 1406, 494, 1143, - 1396, 528, 1129, - 1382, 568, 1111, - 1363, 618, 1084, - 1336, 677, 1046, - 1298, 745, 990, - 1241, 822, 902, - 1151, 909, 748, - 994, 1004, 399, - 631, 1106, 0, - 0, 1214, 0, - 0, 1328, 0, - 0, 1446, 0, - 0, 1567, 0, - 0, 1690, 0, - 0, 1816, 0, - 0, 1943, 0, - 0, 2072, 0, - 0, 2201, 0, - 0, 2331, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1557, 537, 1288, - 1553, 554, 1283, - 1548, 576, 1275, - 1540, 604, 1265, - 1531, 639, 1251, - 1517, 681, 1232, - 1498, 733, 1205, - 1471, 793, 1166, - 1433, 864, 1108, - 1377, 944, 1017, - 1288, 1032, 857, - 1133, 1129, 478, - 778, 1232, 0, - 0, 1342, 0, - 0, 1456, 0, - 0, 1575, 0, - 0, 1697, 0, - 0, 1821, 0, - 0, 1947, 0, - 0, 2074, 0, - 0, 2203, 0, - 0, 2332, 0, - 0, 2463, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1694, 634, 1417, - 1691, 648, 1413, - 1687, 666, 1408, - 1682, 689, 1400, - 1675, 718, 1390, - 1665, 754, 1376, - 1651, 798, 1356, - 1632, 851, 1329, - 1606, 914, 1289, - 1568, 986, 1230, - 1512, 1067, 1136, - 1424, 1157, 970, - 1270, 1255, 567, - 921, 1360, 0, - 0, 1471, 0, - 0, 1586, 0, - 0, 1705, 0, - 0, 1827, 0, - 0, 1952, 0, - 0, 2078, 0, - 0, 2206, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1830, 738, 1547, - 1828, 750, 1544, - 1825, 764, 1540, - 1821, 783, 1534, - 1815, 806, 1527, - 1808, 836, 1516, - 1798, 873, 1502, - 1785, 919, 1482, - 1766, 973, 1454, - 1740, 1037, 1414, - 1702, 1110, 1354, - 1646, 1193, 1258, - 1558, 1284, 1088, - 1406, 1383, 663, - 1061, 1489, 0, - 0, 1600, 0, - 0, 1716, 0, - 0, 1836, 0, - 0, 1958, 0, - 0, 2083, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1965, 849, 1678, - 1963, 857, 1675, - 1961, 869, 1672, - 1958, 884, 1668, - 1954, 903, 1662, - 1949, 927, 1655, - 1941, 958, 1644, - 1932, 996, 1630, - 1918, 1042, 1610, - 1899, 1097, 1582, - 1873, 1162, 1541, - 1835, 1237, 1480, - 1780, 1320, 1383, - 1692, 1412, 1209, - 1541, 1512, 766, - 1199, 1618, 0, - 0, 1730, 0, - 0, 1847, 0, - 0, 1966, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 2099, 964, 1809, - 2098, 970, 1807, - 2096, 979, 1804, - 2094, 991, 1801, - 2091, 1006, 1797, - 2087, 1026, 1791, - 2082, 1051, 1784, - 2074, 1082, 1773, - 2065, 1120, 1759, - 2051, 1167, 1738, - 2032, 1224, 1710, - 2006, 1289, 1669, - 1969, 1364, 1607, - 1913, 1449, 1509, - 1826, 1542, 1333, - 1675, 1642, 876, - 1335, 1749, 0, - 0, 1861, 0, - 0, 1978, 0, - 0, 2098, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2232, 1083, 1940, - 2231, 1088, 1938, - 2230, 1095, 1937, - 2229, 1104, 1934, - 2226, 1116, 1931, - 2224, 1131, 1927, - 2220, 1151, 1921, - 2214, 1176, 1913, - 2207, 1208, 1903, - 2197, 1247, 1888, - 2184, 1294, 1868, - 2165, 1351, 1839, - 2139, 1417, 1798, - 2101, 1493, 1736, - 2046, 1578, 1637, - 1959, 1671, 1459, - 1809, 1772, 990, - 1470, 1879, 0, - 0, 1992, 0, - 0, 2109, 0, - 0, 2229, 0, - 0, 2352, 0, - 0, 2478, 0, - 0, 2604, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2366, 1204, 2071, - 2365, 1208, 2070, - 2364, 1214, 2069, - 2363, 1221, 2067, - 2361, 1230, 2065, - 2359, 1242, 2062, - 2356, 1258, 2057, - 2352, 1278, 2052, - 2347, 1303, 2044, - 2340, 1335, 2033, - 2330, 1375, 2018, - 2316, 1423, 1998, - 2298, 1480, 1969, - 2272, 1547, 1928, - 2234, 1623, 1865, - 2179, 1708, 1766, - 2092, 1802, 1586, - 1942, 1903, 1108, - 1605, 2010, 0, - 0, 2123, 0, - 0, 2240, 0, - 0, 2361, 0, - 0, 2484, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2498, 1329, 2203, - 2498, 1332, 2202, - 2497, 1336, 2201, - 2496, 1341, 2200, - 2495, 1348, 2198, - 2494, 1358, 2196, - 2491, 1370, 2192, - 2488, 1385, 2188, - 2485, 1406, 2182, - 2479, 1431, 2175, - 2472, 1464, 2164, - 2462, 1504, 2149, - 2449, 1552, 2129, - 2430, 1609, 2100, - 2404, 1677, 2058, - 2367, 1753, 1995, - 2311, 1839, 1896, - 2225, 1933, 1714, - 2075, 2034, 1230, - 1739, 2142, 0, - 0, 2255, 0, - 0, 2372, 0, - 0, 2492, 0, - 0, 2616, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2631, 1455, 2334, - 2631, 1457, 2334, - 2630, 1460, 2333, - 2630, 1464, 2332, - 2629, 1470, 2331, - 2628, 1477, 2329, - 2626, 1486, 2327, - 2624, 1499, 2324, - 2621, 1514, 2319, - 2617, 1535, 2313, - 2612, 1561, 2306, - 2604, 1593, 2295, - 2595, 1633, 2280, - 2581, 1682, 2260, - 2563, 1740, 2231, - 2537, 1807, 2189, - 2499, 1884, 2126, - 2444, 1970, 2026, - 2357, 2064, 1844, - 2207, 2165, 1354, - 1872, 2273, 0, - 0, 2386, 0, - 0, 2504, 0, - 0, 2624, 0, - 0, 2748, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2764, 1583, 2466, - 2763, 1584, 2466, - 2763, 1587, 2465, - 2763, 1590, 2464, - 2762, 1594, 2464, - 2761, 1599, 2462, - 2760, 1607, 2460, - 2758, 1616, 2458, - 2756, 1628, 2455, - 2753, 1644, 2451, - 2749, 1665, 2445, - 2744, 1691, 2437, - 2737, 1723, 2426, - 2727, 1764, 2411, - 2714, 1812, 2391, - 2695, 1870, 2362, - 2669, 1938, 2320, - 2631, 2015, 2257, - 2576, 2101, 2156, - 2490, 2195, 1974, - 2340, 2297, 1480, - 2005, 2405, 0, - 0, 2518, 0, - 0, 2635, 0, - 0, 2756, 0, - 0, 2880, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1711, 2598, - 2896, 1713, 2598, - 2896, 1714, 2597, - 2895, 1717, 2597, - 2895, 1720, 2596, - 2894, 1724, 2595, - 2893, 1730, 2594, - 2892, 1737, 2592, - 2890, 1746, 2590, - 2888, 1759, 2586, - 2885, 1775, 2582, - 2881, 1795, 2576, - 2876, 1821, 2568, - 2869, 1854, 2558, - 2859, 1894, 2543, - 2846, 1943, 2522, - 2827, 2001, 2493, - 2801, 2069, 2451, - 2764, 2146, 2388, - 2708, 2232, 2288, - 2622, 2327, 2104, - 2472, 2429, 1608, - 2138, 2537, 0, - 0, 2650, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3012, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3029, 1841, 2730, - 3028, 1842, 2730, - 3028, 1843, 2729, - 3028, 1845, 2729, - 3028, 1847, 2728, - 3027, 1851, 2728, - 3026, 1855, 2727, - 3025, 1860, 2725, - 3024, 1867, 2724, - 3023, 1877, 2721, - 3020, 1889, 2718, - 3018, 1905, 2714, - 3014, 1926, 2708, - 3008, 1952, 2700, - 3001, 1985, 2689, - 2991, 2025, 2675, - 2978, 2074, 2654, - 2959, 2133, 2625, - 2933, 2200, 2583, - 2896, 2278, 2520, - 2841, 2364, 2419, - 2754, 2459, 2235, - 2605, 2560, 1736, - 2271, 2668, 0, - 0, 2782, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3161, 1971, 2862, - 3161, 1972, 2862, - 3161, 1973, 2862, - 3160, 1974, 2861, - 3160, 1976, 2861, - 3160, 1978, 2860, - 3159, 1981, 2860, - 3159, 1986, 2859, - 3158, 1991, 2857, - 3156, 1998, 2856, - 3155, 2008, 2853, - 3153, 2020, 2850, - 3150, 2036, 2846, - 3146, 2057, 2840, - 3141, 2083, 2832, - 3133, 2116, 2821, - 3124, 2157, 2806, - 3110, 2206, 2786, - 3092, 2264, 2757, - 3066, 2332, 2715, - 3028, 2409, 2651, - 2973, 2496, 2550, - 2886, 2590, 2366, - 2737, 2692, 1866, - 2403, 2800, 0, - 0, 2914, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3293, 2102, 2994, - 3293, 2102, 2994, - 3293, 2103, 2994, - 3293, 2104, 2993, - 3292, 2105, 2993, - 3292, 2107, 2993, - 3292, 2110, 2992, - 3291, 2113, 2991, - 3291, 2117, 2990, - 3290, 2122, 2989, - 3289, 2130, 2987, - 3287, 2139, 2985, - 3285, 2152, 2982, - 3282, 2168, 2978, - 3278, 2188, 2972, - 3273, 2215, 2964, - 3266, 2248, 2953, - 3256, 2288, 2938, - 3242, 2337, 2918, - 3224, 2396, 2888, - 3198, 2464, 2846, - 3160, 2541, 2783, - 3105, 2628, 2682, - 3019, 2722, 2498, - 2869, 2824, 1996, - 2536, 2932, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3660, 0, - 3425, 2233, 3126, - 3425, 2233, 3126, - 3425, 2234, 3126, - 3425, 2235, 3126, - 3425, 2236, 3125, - 3425, 2237, 3125, - 3424, 2239, 3125, - 3424, 2241, 3124, - 3423, 2244, 3123, - 3423, 2248, 3122, - 3422, 2254, 3121, - 3421, 2261, 3119, - 3419, 2271, 3117, - 3417, 2283, 3114, - 3414, 2299, 3109, - 3410, 2320, 3104, - 3405, 2346, 3096, - 3398, 2379, 3085, - 3388, 2420, 3070, - 3375, 2469, 3049, - 3356, 2527, 3020, - 3330, 2595, 2978, - 3293, 2673, 2915, - 3237, 2759, 2814, - 3151, 2854, 2629, - 3002, 2956, 2126, - 2668, 3064, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2364, 3258, - 3557, 2365, 3258, - 3557, 2365, 3258, - 3557, 2365, 3258, - 3557, 2366, 3258, - 3557, 2367, 3257, - 3557, 2369, 3257, - 3556, 2370, 3257, - 3556, 2373, 3256, - 3556, 2376, 3255, - 3555, 2380, 3254, - 3554, 2386, 3253, - 3553, 2393, 3251, - 3551, 2402, 3249, - 3549, 2415, 3246, - 3546, 2431, 3241, - 3542, 2452, 3236, - 3537, 2478, 3228, - 3530, 2511, 3217, - 3520, 2552, 3202, - 3507, 2601, 3181, - 3488, 2659, 3152, - 3462, 2727, 3110, - 3425, 2805, 3047, - 3369, 2891, 2946, - 3283, 2986, 2761, - 3134, 3088, 2257, - 2800, 3196, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3690, 2496, 3390, - 3690, 2496, 3390, - 3690, 2496, 3390, - 3689, 2497, 3390, - 3689, 2497, 3390, - 3689, 2498, 3390, - 3689, 2499, 3389, - 3689, 2500, 3389, - 3689, 2502, 3389, - 3688, 2504, 3388, - 3688, 2508, 3387, - 3687, 2512, 3386, - 3686, 2517, 3385, - 3685, 2525, 3383, - 3683, 2534, 3381, - 3681, 2547, 3378, - 3678, 2563, 3373, - 3674, 2583, 3368, - 3669, 2610, 3360, - 3662, 2643, 3349, - 3652, 2683, 3334, - 3639, 2733, 3313, - 3620, 2791, 3284, - 3594, 2859, 3242, - 3557, 2937, 3179, - 3501, 3023, 3078, - 3415, 3118, 2893, - 3266, 3220, 2389, - 2932, 3328, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3822, 2627, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3821, 2629, 3522, - 3821, 2630, 3522, - 3821, 2631, 3521, - 3821, 2632, 3521, - 3821, 2634, 3521, - 3820, 2636, 3520, - 3820, 2639, 3519, - 3819, 2644, 3518, - 3818, 2649, 3517, - 3817, 2656, 3515, - 3815, 2666, 3513, - 3813, 2678, 3510, - 3810, 2695, 3505, - 3806, 2715, 3500, - 3801, 2742, 3492, - 3794, 2775, 3481, - 3784, 2815, 3466, - 3771, 2865, 3445, - 3752, 2923, 3416, - 3726, 2991, 3374, - 3689, 3069, 3311, - 3634, 3155, 3210, - 3547, 3250, 3025, - 3398, 3352, 2520, - 3065, 3460, 0, - 0, 3574, 0, - 0, 3691, 0, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3953, 2762, 3654, - 3953, 2763, 3653, - 3953, 2764, 3653, - 3953, 2766, 3653, - 3952, 2768, 3652, - 3952, 2771, 3651, - 3951, 2775, 3650, - 3950, 2781, 3649, - 3949, 2788, 3647, - 3948, 2798, 3645, - 3945, 2810, 3642, - 3943, 2826, 3637, - 3939, 2847, 3632, - 3933, 2874, 3624, - 3926, 2907, 3613, - 3916, 2947, 3598, - 3903, 2997, 3577, - 3884, 3055, 3548, - 3858, 3123, 3506, - 3821, 3201, 3443, - 3766, 3287, 3342, - 3679, 3382, 3157, - 3530, 3484, 2652, - 3197, 3593, 0, - 0, 3706, 0, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4085, 2895, 3785, - 4085, 2896, 3785, - 4085, 2898, 3785, - 4085, 2900, 3784, - 4084, 2903, 3783, - 4083, 2907, 3782, - 4082, 2913, 3781, - 4081, 2920, 3779, - 4080, 2930, 3777, - 4078, 2942, 3774, - 4075, 2958, 3770, - 4071, 2979, 3764, - 4065, 3006, 3756, - 4058, 3039, 3745, - 4048, 3079, 3730, - 4035, 3129, 3710, - 4017, 3187, 3680, - 3990, 3255, 3638, - 3953, 3333, 3575, - 3898, 3419, 3474, - 3811, 3514, 3289, - 3662, 3616, 2783, - 3329, 3725, 0, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3032, 3916, - 4095, 3035, 3916, - 4095, 3039, 3915, - 4095, 3045, 3913, - 4095, 3052, 3911, - 4095, 3062, 3909, - 4095, 3074, 3906, - 4095, 3090, 3902, - 4095, 3111, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3211, 3862, - 4095, 3261, 3842, - 4095, 3319, 3812, - 4095, 3387, 3770, - 4085, 3465, 3707, - 4030, 3552, 3606, - 3944, 3646, 3421, - 3794, 3748, 2915, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3167, 4048, - 4095, 3171, 4047, - 4095, 3177, 4045, - 4095, 3184, 4044, - 4095, 3194, 4041, - 4095, 3206, 4038, - 4095, 3222, 4034, - 4095, 3243, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3343, 3994, - 4095, 3393, 3974, - 4095, 3451, 3944, - 4095, 3519, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 108, 241, - 0, 151, 183, - 0, 203, 91, - 0, 264, 0, - 0, 334, 0, - 0, 414, 0, - 0, 503, 0, - 0, 600, 0, - 0, 704, 0, - 0, 813, 0, - 0, 928, 0, - 0, 1046, 0, - 0, 1168, 0, - 0, 1292, 0, - 0, 1418, 0, - 0, 1546, 0, - 0, 1674, 0, - 0, 1804, 0, - 0, 1934, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 123, 316, - 0, 165, 267, - 0, 215, 193, - 0, 274, 69, - 0, 343, 0, - 0, 422, 0, - 0, 509, 0, - 0, 605, 0, - 0, 708, 0, - 0, 816, 0, - 0, 930, 0, - 0, 1048, 0, - 0, 1170, 0, - 0, 1293, 0, - 0, 1419, 0, - 0, 1546, 0, - 0, 1675, 0, - 0, 1804, 0, - 0, 1934, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 225, 143, 400, - 144, 182, 360, - 6, 231, 300, - 0, 288, 206, - 0, 355, 37, - 0, 432, 0, - 0, 518, 0, - 0, 612, 0, - 0, 713, 0, - 0, 821, 0, - 0, 934, 0, - 0, 1051, 0, - 0, 1171, 0, - 0, 1295, 0, - 0, 1420, 0, - 0, 1547, 0, - 0, 1676, 0, - 0, 1805, 0, - 0, 1935, 0, - 0, 2065, 0, - 0, 2196, 0, - 0, 2327, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 451, 167, 493, - 403, 205, 461, - 331, 251, 413, - 211, 306, 341, - 0, 371, 223, - 0, 445, 0, - 0, 529, 0, - 0, 621, 0, - 0, 720, 0, - 0, 826, 0, - 0, 938, 0, - 0, 1054, 0, - 0, 1174, 0, - 0, 1297, 0, - 0, 1422, 0, - 0, 1548, 0, - 0, 1676, 0, - 0, 1805, 0, - 0, 1935, 0, - 0, 2066, 0, - 0, 2196, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2590, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 643, 198, 593, - 612, 234, 568, - 567, 277, 531, - 500, 329, 476, - 391, 391, 391, - 186, 462, 245, - 0, 543, 0, - 0, 632, 0, - 0, 730, 0, - 0, 834, 0, - 0, 944, 0, - 0, 1059, 0, - 0, 1178, 0, - 0, 1299, 0, - 0, 1424, 0, - 0, 1550, 0, - 0, 1678, 0, - 0, 1806, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 815, 237, 700, - 794, 269, 680, - 765, 310, 651, - 722, 358, 610, - 658, 417, 548, - 556, 484, 450, - 369, 561, 272, - 0, 647, 0, - 0, 742, 0, - 0, 844, 0, - 0, 952, 0, - 0, 1065, 0, - 0, 1182, 0, - 0, 1303, 0, - 0, 1426, 0, - 0, 1552, 0, - 0, 1679, 0, - 0, 1808, 0, - 0, 1937, 0, - 0, 2067, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 974, 283, 813, - 960, 313, 797, - 940, 350, 775, - 911, 395, 744, - 870, 448, 699, - 809, 512, 630, - 711, 585, 518, - 535, 667, 307, - 81, 758, 0, - 0, 856, 0, - 0, 962, 0, - 0, 1073, 0, - 0, 1188, 0, - 0, 1308, 0, - 0, 1430, 0, - 0, 1555, 0, - 0, 1681, 0, - 0, 1809, 0, - 0, 1938, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1126, 339, 929, - 1116, 365, 917, - 1102, 398, 900, - 1082, 439, 877, - 1054, 488, 844, - 1014, 546, 795, - 954, 614, 720, - 860, 692, 596, - 691, 778, 349, - 276, 873, 0, - 0, 975, 0, - 0, 1083, 0, - 0, 1196, 0, - 0, 1314, 0, - 0, 1435, 0, - 0, 1558, 0, - 0, 1684, 0, - 0, 1811, 0, - 0, 1939, 0, - 0, 2069, 0, - 0, 2199, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1272, 404, 1049, - 1265, 427, 1040, - 1255, 456, 1027, - 1241, 492, 1010, - 1221, 536, 985, - 1194, 589, 950, - 1155, 651, 898, - 1096, 723, 818, - 1004, 804, 683, - 841, 894, 400, - 450, 992, 0, - 0, 1096, 0, - 0, 1207, 0, - 0, 1322, 0, - 0, 1441, 0, - 0, 1563, 0, - 0, 1688, 0, - 0, 1814, 0, - 0, 1942, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1415, 479, 1172, - 1409, 499, 1165, - 1402, 523, 1156, - 1392, 554, 1143, - 1378, 593, 1124, - 1359, 640, 1099, - 1332, 696, 1062, - 1293, 762, 1008, - 1235, 837, 923, - 1145, 921, 778, - 985, 1014, 461, - 611, 1114, 0, - 0, 1221, 0, - 0, 1333, 0, - 0, 1449, 0, - 0, 1569, 0, - 0, 1692, 0, - 0, 1817, 0, - 0, 1944, 0, - 0, 2072, 0, - 0, 2202, 0, - 0, 2331, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1555, 563, 1298, - 1551, 579, 1292, - 1545, 600, 1285, - 1538, 627, 1275, - 1528, 660, 1262, - 1514, 701, 1243, - 1495, 750, 1216, - 1468, 809, 1178, - 1430, 877, 1122, - 1373, 955, 1034, - 1283, 1041, 880, - 1127, 1136, 531, - 763, 1238, 0, - 0, 1347, 0, - 0, 1460, 0, - 0, 1578, 0, - 0, 1699, 0, - 0, 1822, 0, - 0, 1948, 0, - 0, 2075, 0, - 0, 2204, 0, - 0, 2333, 0, - 0, 2463, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1692, 656, 1424, - 1689, 669, 1420, - 1685, 686, 1415, - 1680, 708, 1408, - 1673, 736, 1397, - 1663, 771, 1384, - 1649, 813, 1364, - 1630, 865, 1337, - 1604, 926, 1298, - 1565, 996, 1240, - 1509, 1076, 1149, - 1420, 1164, 989, - 1265, 1261, 610, - 910, 1365, 0, - 0, 1474, 0, - 0, 1589, 0, - 0, 1707, 0, - 0, 1829, 0, - 0, 1953, 0, - 0, 2079, 0, - 0, 2206, 0, - 0, 2335, 0, - 0, 2464, 0, - 0, 2595, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1828, 756, 1553, - 1826, 766, 1550, - 1823, 780, 1545, - 1819, 798, 1540, - 1814, 821, 1532, - 1807, 850, 1522, - 1797, 886, 1508, - 1783, 930, 1488, - 1764, 983, 1461, - 1738, 1046, 1421, - 1700, 1118, 1362, - 1644, 1199, 1268, - 1556, 1289, 1103, - 1402, 1387, 699, - 1053, 1492, 0, - 0, 1603, 0, - 0, 1718, 0, - 0, 1837, 0, - 0, 1959, 0, - 0, 2084, 0, - 0, 2210, 0, - 0, 2338, 0, - 0, 2467, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1964, 862, 1682, - 1962, 871, 1679, - 1960, 882, 1676, - 1957, 896, 1672, - 1953, 915, 1667, - 1948, 938, 1659, - 1940, 968, 1649, - 1930, 1006, 1634, - 1917, 1051, 1614, - 1898, 1105, 1586, - 1872, 1169, 1546, - 1834, 1243, 1486, - 1778, 1325, 1391, - 1690, 1416, 1220, - 1538, 1515, 795, - 1193, 1621, 0, - 0, 1732, 0, - 0, 1848, 0, - 0, 1968, 0, - 0, 2090, 0, - 0, 2215, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 2098, 974, 1812, - 2097, 981, 1810, - 2095, 989, 1808, - 2093, 1001, 1804, - 2090, 1016, 1800, - 2086, 1035, 1795, - 2081, 1059, 1787, - 2074, 1090, 1776, - 2064, 1128, 1762, - 2050, 1174, 1742, - 2032, 1230, 1714, - 2005, 1294, 1673, - 1968, 1369, 1612, - 1912, 1452, 1515, - 1824, 1545, 1341, - 1673, 1644, 898, - 1331, 1751, 0, - 0, 1862, 0, - 0, 1979, 0, - 0, 2099, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2232, 1091, 1942, - 2231, 1096, 1941, - 2230, 1103, 1939, - 2228, 1111, 1937, - 2226, 1123, 1933, - 2223, 1138, 1929, - 2219, 1158, 1924, - 2214, 1183, 1916, - 2206, 1214, 1905, - 2197, 1253, 1891, - 2183, 1300, 1870, - 2165, 1356, 1842, - 2138, 1421, 1801, - 2101, 1497, 1739, - 2045, 1581, 1641, - 1958, 1674, 1465, - 1807, 1774, 1008, - 1467, 1881, 0, - 0, 1993, 0, - 0, 2110, 0, - 0, 2230, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2365, 1211, 2073, - 2364, 1215, 2072, - 2364, 1220, 2071, - 2362, 1227, 2069, - 2361, 1236, 2066, - 2359, 1248, 2063, - 2356, 1263, 2059, - 2352, 1283, 2053, - 2346, 1308, 2046, - 2339, 1340, 2035, - 2329, 1379, 2020, - 2316, 1427, 2000, - 2297, 1483, 1971, - 2271, 1550, 1930, - 2234, 1625, 1868, - 2178, 1710, 1769, - 2091, 1804, 1591, - 1941, 1904, 1122, - 1603, 2011, 0, - 0, 2124, 0, - 0, 2241, 0, - 0, 2361, 0, - 0, 2484, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2498, 1334, 2204, - 2498, 1337, 2203, - 2497, 1341, 2202, - 2496, 1346, 2201, - 2495, 1353, 2199, - 2493, 1362, 2197, - 2491, 1374, 2194, - 2488, 1390, 2189, - 2484, 1410, 2184, - 2479, 1435, 2176, - 2472, 1467, 2165, - 2462, 1507, 2150, - 2449, 1555, 2130, - 2430, 1612, 2101, - 2404, 1679, 2060, - 2366, 1755, 1997, - 2311, 1840, 1898, - 2224, 1934, 1718, - 2074, 2035, 1241, - 1737, 2142, 0, - 0, 2255, 0, - 0, 2372, 0, - 0, 2493, 0, - 0, 2616, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2631, 1459, 2335, - 2631, 1461, 2335, - 2630, 1464, 2334, - 2629, 1468, 2333, - 2628, 1473, 2332, - 2627, 1480, 2330, - 2626, 1490, 2328, - 2624, 1502, 2324, - 2621, 1518, 2320, - 2617, 1538, 2314, - 2611, 1564, 2307, - 2604, 1596, 2296, - 2594, 1636, 2281, - 2581, 1684, 2261, - 2562, 1742, 2232, - 2536, 1809, 2190, - 2499, 1885, 2128, - 2443, 1971, 2028, - 2357, 2065, 1846, - 2207, 2166, 1362, - 1871, 2274, 0, - 0, 2387, 0, - 0, 2504, 0, - 0, 2625, 0, - 0, 2748, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2764, 1585, 2467, - 2763, 1587, 2466, - 2763, 1589, 2466, - 2762, 1593, 2465, - 2762, 1597, 2464, - 2761, 1602, 2463, - 2760, 1609, 2461, - 2758, 1618, 2459, - 2756, 1631, 2456, - 2753, 1647, 2451, - 2749, 1667, 2446, - 2744, 1693, 2438, - 2737, 1725, 2427, - 2727, 1765, 2412, - 2713, 1814, 2392, - 2695, 1872, 2363, - 2669, 1939, 2321, - 2631, 2016, 2258, - 2576, 2102, 2158, - 2489, 2196, 1976, - 2340, 2297, 1486, - 2004, 2405, 0, - 0, 2518, 0, - 0, 2636, 0, - 0, 2756, 0, - 0, 2880, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1713, 2599, - 2896, 1715, 2598, - 2896, 1717, 2598, - 2895, 1719, 2597, - 2895, 1722, 2597, - 2894, 1726, 2596, - 2893, 1731, 2594, - 2892, 1739, 2593, - 2890, 1748, 2590, - 2888, 1760, 2587, - 2885, 1776, 2583, - 2881, 1797, 2577, - 2876, 1823, 2569, - 2869, 1855, 2558, - 2859, 1896, 2544, - 2846, 1944, 2523, - 2827, 2002, 2494, - 2801, 2070, 2452, - 2764, 2147, 2389, - 2708, 2233, 2289, - 2622, 2327, 2106, - 2472, 2429, 1612, - 2137, 2537, 0, - 0, 2650, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3012, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3028, 1843, 2730, - 3028, 1844, 2730, - 3028, 1845, 2730, - 3028, 1847, 2729, - 3027, 1849, 2729, - 3027, 1852, 2728, - 3026, 1856, 2727, - 3025, 1862, 2726, - 3024, 1869, 2724, - 3023, 1878, 2722, - 3020, 1891, 2719, - 3017, 1907, 2714, - 3014, 1927, 2708, - 3008, 1953, 2701, - 3001, 1986, 2690, - 2991, 2026, 2675, - 2978, 2075, 2654, - 2959, 2133, 2625, - 2933, 2201, 2583, - 2896, 2278, 2520, - 2840, 2364, 2420, - 2754, 2459, 2236, - 2605, 2561, 1740, - 2270, 2669, 0, - 0, 2782, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3161, 1972, 2862, - 3161, 1973, 2862, - 3160, 1974, 2862, - 3160, 1975, 2862, - 3160, 1977, 2861, - 3160, 1980, 2861, - 3159, 1983, 2860, - 3158, 1987, 2859, - 3158, 1992, 2858, - 3156, 1999, 2856, - 3155, 2009, 2853, - 3153, 2021, 2850, - 3150, 2037, 2846, - 3146, 2058, 2840, - 3140, 2084, 2832, - 3133, 2117, 2821, - 3124, 2157, 2807, - 3110, 2206, 2786, - 3092, 2265, 2757, - 3065, 2333, 2715, - 3028, 2410, 2652, - 2973, 2496, 2551, - 2886, 2591, 2367, - 2737, 2692, 1868, - 2403, 2801, 0, - 0, 2914, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3293, 2103, 2994, - 3293, 2103, 2994, - 3293, 2104, 2994, - 3293, 2105, 2994, - 3292, 2106, 2993, - 3292, 2108, 2993, - 3292, 2110, 2992, - 3291, 2114, 2992, - 3291, 2118, 2991, - 3290, 2123, 2989, - 3289, 2130, 2988, - 3287, 2140, 2985, - 3285, 2152, 2982, - 3282, 2168, 2978, - 3278, 2189, 2972, - 3273, 2215, 2964, - 3265, 2248, 2953, - 3256, 2289, 2938, - 3242, 2338, 2918, - 3224, 2396, 2889, - 3198, 2464, 2847, - 3160, 2541, 2784, - 3105, 2628, 2682, - 3019, 2722, 2498, - 2869, 2824, 1998, - 2535, 2932, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3660, 0, - 3425, 2234, 3126, - 3425, 2234, 3126, - 3425, 2235, 3126, - 3425, 2235, 3126, - 3425, 2236, 3126, - 3425, 2238, 3125, - 3424, 2239, 3125, - 3424, 2242, 3124, - 3423, 2245, 3124, - 3423, 2249, 3123, - 3422, 2255, 3121, - 3421, 2262, 3119, - 3419, 2271, 3117, - 3417, 2284, 3114, - 3414, 2300, 3110, - 3410, 2320, 3104, - 3405, 2347, 3096, - 3398, 2380, 3085, - 3388, 2420, 3070, - 3374, 2469, 3050, - 3356, 2528, 3021, - 3330, 2596, 2978, - 3292, 2673, 2915, - 3237, 2760, 2814, - 3151, 2854, 2630, - 3001, 2956, 2128, - 2668, 3064, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2365, 3258, - 3557, 2365, 3258, - 3557, 2365, 3258, - 3557, 2366, 3258, - 3557, 2367, 3258, - 3557, 2368, 3257, - 3557, 2369, 3257, - 3556, 2371, 3257, - 3556, 2373, 3256, - 3556, 2376, 3255, - 3555, 2380, 3254, - 3554, 2386, 3253, - 3553, 2393, 3251, - 3551, 2403, 3249, - 3549, 2415, 3246, - 3546, 2431, 3242, - 3542, 2452, 3236, - 3537, 2478, 3228, - 3530, 2511, 3217, - 3520, 2552, 3202, - 3507, 2601, 3182, - 3488, 2660, 3152, - 3462, 2728, 3110, - 3425, 2805, 3047, - 3369, 2892, 2946, - 3283, 2986, 2761, - 3134, 3088, 2258, - 2800, 3196, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3690, 2496, 3390, - 3690, 2496, 3390, - 3689, 2497, 3390, - 3689, 2497, 3390, - 3689, 2498, 3390, - 3689, 2498, 3390, - 3689, 2499, 3389, - 3689, 2501, 3389, - 3689, 2502, 3389, - 3688, 2505, 3388, - 3688, 2508, 3387, - 3687, 2512, 3386, - 3686, 2518, 3385, - 3685, 2525, 3383, - 3683, 2534, 3381, - 3681, 2547, 3378, - 3678, 2563, 3374, - 3674, 2584, 3368, - 3669, 2610, 3360, - 3662, 2643, 3349, - 3652, 2684, 3334, - 3639, 2733, 3314, - 3620, 2791, 3284, - 3594, 2859, 3242, - 3557, 2937, 3179, - 3501, 3023, 3078, - 3415, 3118, 2893, - 3266, 3220, 2389, - 2932, 3328, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2629, 3522, - 3821, 2629, 3522, - 3821, 2630, 3522, - 3821, 2631, 3521, - 3821, 2632, 3521, - 3821, 2634, 3521, - 3820, 2637, 3520, - 3820, 2640, 3519, - 3819, 2644, 3518, - 3818, 2649, 3517, - 3817, 2657, 3515, - 3815, 2666, 3513, - 3813, 2679, 3510, - 3810, 2695, 3506, - 3806, 2716, 3500, - 3801, 2742, 3492, - 3794, 2775, 3481, - 3784, 2816, 3466, - 3771, 2865, 3446, - 3752, 2923, 3416, - 3726, 2991, 3374, - 3689, 3069, 3311, - 3634, 3155, 3210, - 3547, 3250, 3025, - 3398, 3352, 2521, - 3064, 3460, 0, - 0, 3574, 0, - 0, 3691, 0, - 3954, 2759, 3654, - 3954, 2759, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3954, 2761, 3654, - 3953, 2762, 3654, - 3953, 2763, 3653, - 3953, 2764, 3653, - 3953, 2766, 3653, - 3952, 2768, 3652, - 3952, 2772, 3651, - 3951, 2776, 3650, - 3950, 2781, 3649, - 3949, 2788, 3647, - 3948, 2798, 3645, - 3945, 2811, 3642, - 3943, 2827, 3638, - 3939, 2847, 3632, - 3933, 2874, 3624, - 3926, 2907, 3613, - 3916, 2947, 3598, - 3903, 2997, 3578, - 3884, 3055, 3548, - 3858, 3123, 3506, - 3821, 3201, 3443, - 3766, 3287, 3342, - 3679, 3382, 3157, - 3530, 3484, 2652, - 3197, 3593, 0, - 0, 3706, 0, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4085, 2895, 3786, - 4085, 2896, 3785, - 4085, 2898, 3785, - 4085, 2900, 3784, - 4084, 2903, 3784, - 4083, 2908, 3783, - 4082, 2913, 3781, - 4081, 2920, 3779, - 4080, 2930, 3777, - 4078, 2942, 3774, - 4075, 2959, 3770, - 4071, 2979, 3764, - 4065, 3006, 3756, - 4058, 3039, 3745, - 4048, 3079, 3730, - 4035, 3129, 3710, - 4017, 3187, 3680, - 3990, 3255, 3638, - 3953, 3333, 3575, - 3898, 3420, 3474, - 3811, 3514, 3289, - 3662, 3616, 2784, - 3329, 3725, 0, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3032, 3916, - 4095, 3035, 3916, - 4095, 3040, 3915, - 4095, 3045, 3913, - 4095, 3052, 3912, - 4095, 3062, 3909, - 4095, 3074, 3906, - 4095, 3091, 3902, - 4095, 3111, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3211, 3862, - 4095, 3261, 3842, - 4095, 3319, 3812, - 4095, 3387, 3770, - 4085, 3465, 3707, - 4030, 3552, 3606, - 3944, 3646, 3421, - 3794, 3748, 2916, - 4095, 3155, 4051, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3167, 4048, - 4095, 3172, 4047, - 4095, 3177, 4045, - 4095, 3184, 4044, - 4095, 3194, 4041, - 4095, 3206, 4038, - 4095, 3223, 4034, - 4095, 3243, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3343, 3994, - 4095, 3393, 3974, - 4095, 3451, 3945, - 4095, 3519, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 193, 352, - 0, 229, 307, - 0, 273, 239, - 0, 326, 129, - 0, 388, 0, - 0, 459, 0, - 0, 540, 0, - 0, 630, 0, - 0, 728, 0, - 0, 833, 0, - 0, 943, 0, - 0, 1058, 0, - 0, 1177, 0, - 0, 1299, 0, - 0, 1423, 0, - 0, 1550, 0, - 0, 1677, 0, - 0, 1806, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 205, 412, - 0, 240, 373, - 0, 283, 315, - 0, 335, 223, - 0, 396, 62, - 0, 466, 0, - 0, 546, 0, - 0, 635, 0, - 0, 732, 0, - 0, 836, 0, - 0, 945, 0, - 0, 1060, 0, - 0, 1178, 0, - 0, 1300, 0, - 0, 1424, 0, - 0, 1550, 0, - 0, 1678, 0, - 0, 1807, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 154, 222, 481, - 58, 255, 448, - 0, 297, 399, - 0, 347, 325, - 0, 407, 201, - 0, 476, 0, - 0, 554, 0, - 0, 641, 0, - 0, 737, 0, - 0, 840, 0, - 0, 949, 0, - 0, 1062, 0, - 0, 1180, 0, - 0, 1302, 0, - 0, 1425, 0, - 0, 1551, 0, - 0, 1679, 0, - 0, 1807, 0, - 0, 1936, 0, - 0, 2066, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 409, 242, 560, - 357, 275, 532, - 276, 315, 492, - 138, 363, 433, - 0, 420, 338, - 0, 488, 170, - 0, 564, 0, - 0, 650, 0, - 0, 744, 0, - 0, 845, 0, - 0, 953, 0, - 0, 1066, 0, - 0, 1183, 0, - 0, 1304, 0, - 0, 1427, 0, - 0, 1552, 0, - 0, 1679, 0, - 0, 1808, 0, - 0, 1937, 0, - 0, 2067, 0, - 0, 2197, 0, - 0, 2328, 0, - 0, 2459, 0, - 0, 2591, 0, - 0, 2722, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 616, 269, 648, - 583, 299, 625, - 535, 337, 593, - 463, 383, 546, - 343, 438, 474, - 109, 503, 355, - 0, 577, 124, - 0, 661, 0, - 0, 753, 0, - 0, 852, 0, - 0, 958, 0, - 0, 1070, 0, - 0, 1186, 0, - 0, 1306, 0, - 0, 1429, 0, - 0, 1554, 0, - 0, 1681, 0, - 0, 1809, 0, - 0, 1938, 0, - 0, 2067, 0, - 0, 2198, 0, - 0, 2328, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 796, 302, 744, - 775, 330, 726, - 744, 366, 700, - 700, 409, 663, - 632, 461, 608, - 523, 523, 523, - 318, 594, 377, - 0, 675, 54, - 0, 764, 0, - 0, 862, 0, - 0, 966, 0, - 0, 1076, 0, - 0, 1191, 0, - 0, 1310, 0, - 0, 1432, 0, - 0, 1556, 0, - 0, 1682, 0, - 0, 1810, 0, - 0, 1938, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 962, 343, 847, - 947, 369, 832, - 926, 401, 812, - 897, 442, 784, - 854, 490, 742, - 790, 549, 680, - 688, 616, 582, - 501, 693, 404, - 0, 780, 0, - 0, 874, 0, - 0, 976, 0, - 0, 1084, 0, - 0, 1197, 0, - 0, 1314, 0, - 0, 1435, 0, - 0, 1559, 0, - 0, 1684, 0, - 0, 1811, 0, - 0, 1940, 0, - 0, 2069, 0, - 0, 2199, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1117, 392, 956, - 1107, 415, 945, - 1092, 445, 929, - 1072, 482, 907, - 1043, 527, 876, - 1002, 581, 831, - 941, 644, 762, - 843, 717, 650, - 667, 799, 439, - 213, 890, 0, - 0, 988, 0, - 0, 1094, 0, - 0, 1205, 0, - 0, 1320, 0, - 0, 1440, 0, - 0, 1562, 0, - 0, 1687, 0, - 0, 1813, 0, - 0, 1941, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1266, 450, 1070, - 1258, 471, 1061, - 1248, 497, 1049, - 1234, 530, 1032, - 1214, 571, 1009, - 1186, 620, 976, - 1146, 678, 927, - 1086, 746, 852, - 992, 824, 728, - 824, 910, 481, - 408, 1005, 0, - 0, 1107, 0, - 0, 1215, 0, - 0, 1328, 0, - 0, 1446, 0, - 0, 1567, 0, - 0, 1690, 0, - 0, 1816, 0, - 0, 1943, 0, - 0, 2072, 0, - 0, 2201, 0, - 0, 2331, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1410, 519, 1188, - 1405, 536, 1182, - 1397, 559, 1172, - 1387, 588, 1160, - 1373, 624, 1142, - 1353, 668, 1117, - 1326, 721, 1082, - 1287, 783, 1030, - 1228, 855, 950, - 1136, 936, 815, - 973, 1026, 532, - 582, 1124, 0, - 0, 1229, 0, - 0, 1339, 0, - 0, 1454, 0, - 0, 1573, 0, - 0, 1695, 0, - 0, 1820, 0, - 0, 1946, 0, - 0, 2074, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1551, 596, 1310, - 1547, 611, 1305, - 1542, 631, 1297, - 1534, 655, 1288, - 1524, 687, 1275, - 1510, 725, 1256, - 1491, 772, 1231, - 1464, 828, 1194, - 1425, 894, 1140, - 1367, 969, 1055, - 1277, 1053, 910, - 1117, 1146, 593, - 743, 1246, 0, - 0, 1353, 0, - 0, 1465, 0, - 0, 1581, 0, - 0, 1702, 0, - 0, 1824, 0, - 0, 1950, 0, - 0, 2076, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2463, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1690, 683, 1434, - 1687, 695, 1430, - 1683, 711, 1424, - 1677, 732, 1417, - 1670, 759, 1407, - 1660, 792, 1394, - 1646, 833, 1375, - 1627, 882, 1348, - 1600, 941, 1310, - 1562, 1009, 1254, - 1505, 1087, 1166, - 1415, 1173, 1013, - 1259, 1268, 663, - 895, 1370, 0, - 0, 1479, 0, - 0, 1592, 0, - 0, 1710, 0, - 0, 1831, 0, - 0, 1954, 0, - 0, 2080, 0, - 0, 2207, 0, - 0, 2336, 0, - 0, 2465, 0, - 0, 2595, 0, - 0, 2726, 0, - 0, 2856, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1826, 777, 1560, - 1824, 788, 1557, - 1821, 801, 1552, - 1817, 818, 1547, - 1812, 840, 1540, - 1805, 868, 1530, - 1795, 903, 1516, - 1781, 945, 1496, - 1762, 997, 1469, - 1736, 1058, 1430, - 1697, 1128, 1372, - 1641, 1208, 1281, - 1552, 1296, 1121, - 1397, 1393, 742, - 1042, 1497, 0, - 0, 1606, 0, - 0, 1721, 0, - 0, 1839, 0, - 0, 1961, 0, - 0, 2085, 0, - 0, 2211, 0, - 0, 2338, 0, - 0, 2467, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1962, 880, 1687, - 1961, 888, 1685, - 1958, 898, 1682, - 1955, 912, 1678, - 1951, 930, 1672, - 1946, 953, 1664, - 1939, 982, 1654, - 1929, 1018, 1640, - 1915, 1062, 1620, - 1897, 1116, 1593, - 1870, 1178, 1553, - 1832, 1250, 1494, - 1776, 1331, 1400, - 1688, 1422, 1235, - 1534, 1520, 831, - 1185, 1624, 0, - 0, 1735, 0, - 0, 1850, 0, - 0, 1969, 0, - 0, 2091, 0, - 0, 2216, 0, - 0, 2342, 0, - 0, 2470, 0, - 0, 2599, 0, - 0, 2728, 0, - 0, 2859, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2097, 988, 1815, - 2096, 994, 1814, - 2094, 1003, 1811, - 2092, 1014, 1808, - 2089, 1028, 1804, - 2085, 1047, 1799, - 2080, 1071, 1791, - 2072, 1100, 1781, - 2063, 1138, 1766, - 2049, 1183, 1746, - 2030, 1237, 1719, - 2004, 1301, 1678, - 1966, 1375, 1618, - 1910, 1457, 1523, - 1822, 1548, 1352, - 1670, 1647, 927, - 1325, 1753, 0, - 0, 1864, 0, - 0, 1980, 0, - 0, 2100, 0, - 0, 2222, 0, - 0, 2347, 0, - 0, 2474, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2231, 1101, 1945, - 2230, 1106, 1944, - 2229, 1113, 1942, - 2227, 1122, 1940, - 2225, 1133, 1936, - 2222, 1148, 1932, - 2218, 1167, 1927, - 2213, 1191, 1919, - 2206, 1222, 1908, - 2196, 1260, 1894, - 2182, 1306, 1874, - 2164, 1362, 1846, - 2137, 1427, 1805, - 2100, 1501, 1744, - 2044, 1585, 1647, - 1956, 1677, 1473, - 1805, 1776, 1031, - 1463, 1883, 0, - 0, 1994, 0, - 0, 2111, 0, - 0, 2231, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2364, 1219, 2075, - 2364, 1223, 2074, - 2363, 1228, 2073, - 2362, 1235, 2071, - 2360, 1244, 2069, - 2358, 1255, 2066, - 2355, 1270, 2061, - 2351, 1290, 2056, - 2346, 1315, 2048, - 2339, 1346, 2037, - 2329, 1385, 2023, - 2315, 1432, 2003, - 2297, 1488, 1974, - 2270, 1553, 1933, - 2233, 1629, 1871, - 2177, 1713, 1773, - 2090, 1806, 1597, - 1939, 1906, 1140, - 1599, 2013, 0, - 0, 2125, 0, - 0, 2242, 0, - 0, 2362, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2498, 1340, 2206, - 2497, 1343, 2205, - 2497, 1347, 2204, - 2496, 1352, 2203, - 2494, 1359, 2201, - 2493, 1368, 2199, - 2491, 1380, 2195, - 2488, 1395, 2191, - 2484, 1415, 2185, - 2478, 1440, 2178, - 2471, 1472, 2167, - 2461, 1511, 2152, - 2448, 1559, 2132, - 2429, 1615, 2103, - 2403, 1682, 2062, - 2366, 1757, 2000, - 2310, 1842, 1901, - 2223, 1936, 1723, - 2073, 2036, 1254, - 1735, 2144, 0, - 0, 2256, 0, - 0, 2373, 0, - 0, 2493, 0, - 0, 2616, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2631, 1463, 2337, - 2630, 1466, 2336, - 2630, 1469, 2335, - 2629, 1473, 2334, - 2628, 1478, 2333, - 2627, 1485, 2331, - 2625, 1494, 2329, - 2623, 1506, 2326, - 2620, 1522, 2322, - 2616, 1542, 2316, - 2611, 1567, 2308, - 2604, 1599, 2297, - 2594, 1639, 2283, - 2581, 1687, 2262, - 2562, 1744, 2233, - 2536, 1811, 2192, - 2498, 1887, 2130, - 2443, 1972, 2030, - 2356, 2066, 1850, - 2206, 2167, 1373, - 1869, 2275, 0, - 0, 2387, 0, - 0, 2504, 0, - 0, 2625, 0, - 0, 2748, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2763, 1589, 2468, - 2763, 1591, 2467, - 2763, 1593, 2467, - 2762, 1596, 2466, - 2761, 1600, 2465, - 2761, 1605, 2464, - 2759, 1613, 2462, - 2758, 1622, 2460, - 2756, 1634, 2457, - 2753, 1650, 2452, - 2749, 1670, 2447, - 2743, 1696, 2439, - 2736, 1728, 2428, - 2727, 1768, 2413, - 2713, 1816, 2393, - 2694, 1874, 2364, - 2668, 1941, 2322, - 2631, 2017, 2260, - 2575, 2103, 2160, - 2489, 2197, 1978, - 2339, 2298, 1494, - 2003, 2406, 0, - 0, 2519, 0, - 0, 2636, 0, - 0, 2757, 0, - 0, 2880, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1716, 2599, - 2896, 1717, 2599, - 2895, 1719, 2599, - 2895, 1722, 2598, - 2894, 1725, 2597, - 2894, 1729, 2596, - 2893, 1734, 2595, - 2892, 1741, 2593, - 2890, 1751, 2591, - 2888, 1763, 2588, - 2885, 1779, 2583, - 2881, 1799, 2578, - 2876, 1825, 2570, - 2869, 1857, 2559, - 2859, 1897, 2544, - 2845, 1946, 2524, - 2827, 2004, 2495, - 2801, 2071, 2453, - 2763, 2148, 2390, - 2708, 2234, 2290, - 2621, 2328, 2108, - 2472, 2430, 1618, - 2136, 2537, 0, - 0, 2650, 0, - 0, 2768, 0, - 0, 2888, 0, - 0, 3012, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3028, 1845, 2731, - 3028, 1846, 2731, - 3028, 1847, 2730, - 3028, 1849, 2730, - 3027, 1851, 2729, - 3027, 1854, 2729, - 3026, 1858, 2728, - 3025, 1864, 2726, - 3024, 1871, 2725, - 3022, 1880, 2722, - 3020, 1892, 2719, - 3017, 1908, 2715, - 3013, 1929, 2709, - 3008, 1955, 2701, - 3001, 1987, 2690, - 2991, 2028, 2676, - 2978, 2076, 2655, - 2959, 2134, 2626, - 2933, 2202, 2584, - 2896, 2279, 2521, - 2840, 2365, 2421, - 2754, 2459, 2238, - 2604, 2561, 1744, - 2269, 2669, 0, - 0, 2782, 0, - 0, 2900, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3161, 1974, 2863, - 3161, 1975, 2862, - 3160, 1976, 2862, - 3160, 1977, 2862, - 3160, 1979, 2862, - 3160, 1981, 2861, - 3159, 1984, 2860, - 3158, 1988, 2859, - 3157, 1994, 2858, - 3156, 2001, 2856, - 3155, 2010, 2854, - 3152, 2023, 2851, - 3150, 2039, 2846, - 3146, 2059, 2841, - 3140, 2085, 2833, - 3133, 2118, 2822, - 3123, 2158, 2807, - 3110, 2207, 2787, - 3091, 2266, 2758, - 3065, 2333, 2716, - 3028, 2410, 2653, - 2973, 2497, 2552, - 2886, 2591, 2368, - 2737, 2693, 1872, - 2402, 2801, 0, - 0, 2914, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3293, 2104, 2994, - 3293, 2104, 2994, - 3293, 2105, 2994, - 3293, 2106, 2994, - 3292, 2107, 2994, - 3292, 2109, 2993, - 3292, 2112, 2993, - 3291, 2115, 2992, - 3291, 2119, 2991, - 3290, 2124, 2990, - 3288, 2132, 2988, - 3287, 2141, 2986, - 3285, 2153, 2982, - 3282, 2169, 2978, - 3278, 2190, 2972, - 3273, 2216, 2964, - 3265, 2249, 2954, - 3256, 2290, 2939, - 3242, 2339, 2918, - 3224, 2397, 2889, - 3198, 2465, 2847, - 3160, 2542, 2784, - 3105, 2628, 2683, - 3018, 2723, 2499, - 2869, 2825, 2000, - 2535, 2933, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3661, 0, - 3425, 2234, 3126, - 3425, 2235, 3126, - 3425, 2235, 3126, - 3425, 2236, 3126, - 3425, 2237, 3126, - 3425, 2238, 3125, - 3424, 2240, 3125, - 3424, 2243, 3124, - 3423, 2246, 3124, - 3423, 2250, 3123, - 3422, 2255, 3121, - 3421, 2263, 3120, - 3419, 2272, 3117, - 3417, 2284, 3114, - 3414, 2301, 3110, - 3410, 2321, 3104, - 3405, 2347, 3096, - 3398, 2380, 3085, - 3388, 2421, 3071, - 3374, 2470, 3050, - 3356, 2528, 3021, - 3330, 2596, 2979, - 3292, 2674, 2916, - 3237, 2760, 2815, - 3151, 2855, 2631, - 3001, 2956, 2130, - 2667, 3065, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2365, 3258, - 3557, 2366, 3258, - 3557, 2366, 3258, - 3557, 2367, 3258, - 3557, 2367, 3258, - 3557, 2368, 3258, - 3557, 2370, 3257, - 3556, 2371, 3257, - 3556, 2374, 3256, - 3556, 2377, 3256, - 3555, 2381, 3255, - 3554, 2387, 3253, - 3553, 2394, 3252, - 3551, 2403, 3249, - 3549, 2416, 3246, - 3546, 2432, 3242, - 3542, 2453, 3236, - 3537, 2479, 3228, - 3530, 2512, 3217, - 3520, 2552, 3202, - 3507, 2602, 3182, - 3488, 2660, 3153, - 3462, 2728, 3111, - 3425, 2805, 3047, - 3369, 2892, 2946, - 3283, 2986, 2762, - 3134, 3088, 2260, - 2800, 3197, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3690, 2497, 3390, - 3690, 2497, 3390, - 3689, 2497, 3390, - 3689, 2498, 3390, - 3689, 2498, 3390, - 3689, 2499, 3390, - 3689, 2500, 3390, - 3689, 2501, 3389, - 3689, 2503, 3389, - 3688, 2505, 3388, - 3688, 2508, 3388, - 3687, 2513, 3387, - 3686, 2518, 3385, - 3685, 2525, 3384, - 3683, 2535, 3381, - 3681, 2547, 3378, - 3678, 2563, 3374, - 3674, 2584, 3368, - 3669, 2610, 3360, - 3662, 2643, 3349, - 3652, 2684, 3334, - 3639, 2733, 3314, - 3620, 2792, 3285, - 3594, 2860, 3242, - 3557, 2937, 3179, - 3501, 3024, 3078, - 3415, 3118, 2894, - 3266, 3220, 2391, - 2932, 3329, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2628, 3522, - 3822, 2629, 3522, - 3822, 2629, 3522, - 3821, 2630, 3522, - 3821, 2630, 3522, - 3821, 2631, 3522, - 3821, 2633, 3521, - 3821, 2635, 3521, - 3820, 2637, 3520, - 3820, 2640, 3520, - 3819, 2644, 3519, - 3818, 2650, 3517, - 3817, 2657, 3515, - 3815, 2667, 3513, - 3813, 2679, 3510, - 3810, 2695, 3506, - 3806, 2716, 3500, - 3801, 2742, 3492, - 3794, 2775, 3481, - 3784, 2816, 3466, - 3771, 2865, 3446, - 3752, 2924, 3416, - 3726, 2992, 3374, - 3689, 3069, 3311, - 3634, 3156, 3210, - 3547, 3250, 3025, - 3398, 3352, 2521, - 3064, 3461, 0, - 0, 3574, 0, - 0, 3692, 0, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3954, 2761, 3654, - 3953, 2762, 3654, - 3953, 2763, 3654, - 3953, 2764, 3653, - 3953, 2766, 3653, - 3952, 2769, 3652, - 3952, 2772, 3652, - 3951, 2776, 3651, - 3950, 2781, 3649, - 3949, 2789, 3647, - 3948, 2798, 3645, - 3945, 2811, 3642, - 3942, 2827, 3638, - 3939, 2848, 3632, - 3933, 2874, 3624, - 3926, 2907, 3613, - 3916, 2948, 3598, - 3903, 2997, 3578, - 3884, 3055, 3548, - 3858, 3123, 3506, - 3821, 3201, 3443, - 3766, 3288, 3342, - 3679, 3382, 3157, - 3530, 3484, 2653, - 3197, 3593, 0, - 0, 3706, 0, - 4086, 2891, 3786, - 4086, 2891, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4085, 2895, 3786, - 4085, 2896, 3785, - 4085, 2898, 3785, - 4085, 2900, 3784, - 4084, 2904, 3784, - 4083, 2908, 3783, - 4082, 2913, 3781, - 4081, 2921, 3780, - 4080, 2930, 3777, - 4078, 2943, 3774, - 4075, 2959, 3770, - 4071, 2980, 3764, - 4065, 3006, 3756, - 4058, 3039, 3745, - 4048, 3080, 3730, - 4035, 3129, 3710, - 4017, 3187, 3680, - 3990, 3255, 3638, - 3953, 3333, 3575, - 3898, 3420, 3474, - 3811, 3514, 3289, - 3662, 3616, 2784, - 3329, 3725, 0, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3032, 3916, - 4095, 3036, 3916, - 4095, 3040, 3915, - 4095, 3045, 3913, - 4095, 3052, 3912, - 4095, 3062, 3909, - 4095, 3075, 3906, - 4095, 3091, 3902, - 4095, 3111, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3212, 3862, - 4095, 3261, 3842, - 4095, 3319, 3813, - 4095, 3387, 3770, - 4085, 3465, 3707, - 4030, 3552, 3606, - 3944, 3646, 3421, - 3794, 3748, 2916, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3155, 4050, - 4095, 3155, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3167, 4048, - 4095, 3172, 4047, - 4095, 3177, 4045, - 4095, 3184, 4044, - 4095, 3194, 4041, - 4095, 3206, 4038, - 4095, 3223, 4034, - 4095, 3243, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3344, 3994, - 4095, 3393, 3974, - 4095, 3451, 3945, - 4095, 3520, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 286, 468, - 0, 316, 433, - 0, 352, 383, - 0, 397, 305, - 0, 450, 175, - 0, 514, 0, - 0, 586, 0, - 0, 668, 0, - 0, 759, 0, - 0, 857, 0, - 0, 962, 0, - 0, 1073, 0, - 0, 1189, 0, - 0, 1308, 0, - 0, 1430, 0, - 0, 1555, 0, - 0, 1681, 0, - 0, 1809, 0, - 0, 1938, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 296, 515, - 0, 325, 484, - 0, 361, 439, - 0, 405, 371, - 0, 458, 261, - 0, 520, 54, - 0, 592, 0, - 0, 673, 0, - 0, 762, 0, - 0, 860, 0, - 0, 965, 0, - 0, 1075, 0, - 0, 1190, 0, - 0, 1309, 0, - 0, 1431, 0, - 0, 1556, 0, - 0, 1682, 0, - 0, 1810, 0, - 0, 1938, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 38, 310, 571, - 0, 338, 544, - 0, 372, 505, - 0, 415, 447, - 0, 467, 355, - 0, 528, 195, - 0, 599, 0, - 0, 678, 0, - 0, 767, 0, - 0, 864, 0, - 0, 968, 0, - 0, 1077, 0, - 0, 1192, 0, - 0, 1311, 0, - 0, 1432, 0, - 0, 1556, 0, - 0, 1682, 0, - 0, 1810, 0, - 0, 1939, 0, - 0, 2068, 0, - 0, 2198, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 347, 327, 637, - 286, 354, 613, - 190, 387, 580, - 17, 429, 531, - 0, 479, 457, - 0, 539, 333, - 0, 608, 87, - 0, 686, 0, - 0, 774, 0, - 0, 869, 0, - 0, 972, 0, - 0, 1081, 0, - 0, 1194, 0, - 0, 1312, 0, - 0, 1434, 0, - 0, 1558, 0, - 0, 1683, 0, - 0, 1811, 0, - 0, 1939, 0, - 0, 2069, 0, - 0, 2199, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 577, 349, 712, - 541, 375, 692, - 489, 407, 664, - 408, 447, 624, - 270, 495, 565, - 0, 553, 470, - 0, 620, 302, - 0, 696, 0, - 0, 782, 0, - 0, 876, 0, - 0, 977, 0, - 0, 1085, 0, - 0, 1198, 0, - 0, 1315, 0, - 0, 1436, 0, - 0, 1559, 0, - 0, 1684, 0, - 0, 1812, 0, - 0, 1940, 0, - 0, 2069, 0, - 0, 2199, 0, - 0, 2329, 0, - 0, 2460, 0, - 0, 2591, 0, - 0, 2723, 0, - 0, 2854, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 771, 377, 796, - 748, 401, 780, - 715, 431, 757, - 668, 469, 725, - 595, 515, 678, - 475, 571, 606, - 241, 635, 487, - 0, 709, 256, - 0, 793, 0, - 0, 885, 0, - 0, 984, 0, - 0, 1091, 0, - 0, 1202, 0, - 0, 1318, 0, - 0, 1438, 0, - 0, 1561, 0, - 0, 1686, 0, - 0, 1813, 0, - 0, 1941, 0, - 0, 2070, 0, - 0, 2199, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 944, 411, 889, - 928, 434, 876, - 907, 462, 858, - 876, 498, 832, - 832, 541, 795, - 764, 594, 740, - 655, 655, 655, - 450, 726, 509, - 0, 807, 186, - 0, 896, 0, - 0, 994, 0, - 0, 1098, 0, - 0, 1208, 0, - 0, 1323, 0, - 0, 1442, 0, - 0, 1564, 0, - 0, 1688, 0, - 0, 1814, 0, - 0, 1942, 0, - 0, 2071, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1105, 454, 990, - 1094, 475, 979, - 1079, 501, 965, - 1058, 533, 944, - 1029, 574, 916, - 986, 623, 874, - 922, 681, 813, - 820, 748, 714, - 633, 825, 536, - 113, 912, 73, - 0, 1006, 0, - 0, 1108, 0, - 0, 1216, 0, - 0, 1329, 0, - 0, 1446, 0, - 0, 1567, 0, - 0, 1691, 0, - 0, 1816, 0, - 0, 1943, 0, - 0, 2072, 0, - 0, 2201, 0, - 0, 2331, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1257, 506, 1097, - 1249, 524, 1088, - 1239, 547, 1077, - 1224, 577, 1061, - 1204, 614, 1039, - 1175, 659, 1008, - 1134, 713, 963, - 1073, 776, 894, - 975, 849, 783, - 799, 931, 571, - 345, 1022, 0, - 0, 1121, 0, - 0, 1226, 0, - 0, 1337, 0, - 0, 1452, 0, - 0, 1572, 0, - 0, 1694, 0, - 0, 1819, 0, - 0, 1945, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1404, 566, 1209, - 1398, 582, 1202, - 1390, 603, 1193, - 1380, 629, 1181, - 1366, 662, 1165, - 1346, 703, 1141, - 1318, 752, 1108, - 1278, 811, 1059, - 1218, 878, 984, - 1124, 956, 860, - 956, 1042, 613, - 540, 1137, 0, - 0, 1239, 0, - 0, 1347, 0, - 0, 1461, 0, - 0, 1578, 0, - 0, 1699, 0, - 0, 1823, 0, - 0, 1948, 0, - 0, 2075, 0, - 0, 2204, 0, - 0, 2333, 0, - 0, 2463, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1546, 637, 1325, - 1542, 651, 1320, - 1537, 668, 1314, - 1529, 691, 1304, - 1519, 720, 1292, - 1505, 756, 1274, - 1486, 800, 1249, - 1458, 853, 1214, - 1419, 915, 1162, - 1360, 987, 1082, - 1268, 1068, 947, - 1105, 1158, 665, - 714, 1256, 0, - 0, 1361, 0, - 0, 1471, 0, - 0, 1586, 0, - 0, 1705, 0, - 0, 1827, 0, - 0, 1952, 0, - 0, 2078, 0, - 0, 2206, 0, - 0, 2335, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1686, 717, 1446, - 1683, 728, 1442, - 1679, 743, 1437, - 1674, 763, 1430, - 1666, 787, 1420, - 1656, 819, 1407, - 1642, 857, 1388, - 1623, 904, 1363, - 1596, 960, 1326, - 1557, 1026, 1272, - 1500, 1101, 1187, - 1409, 1185, 1042, - 1250, 1278, 725, - 875, 1378, 0, - 0, 1485, 0, - 0, 1597, 0, - 0, 1713, 0, - 0, 1834, 0, - 0, 1957, 0, - 0, 2082, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1824, 805, 1569, - 1822, 815, 1566, - 1819, 827, 1562, - 1815, 843, 1556, - 1809, 864, 1549, - 1802, 891, 1539, - 1792, 924, 1526, - 1778, 965, 1507, - 1759, 1014, 1480, - 1732, 1073, 1442, - 1694, 1141, 1386, - 1637, 1219, 1298, - 1547, 1305, 1145, - 1391, 1400, 795, - 1028, 1502, 0, - 0, 1611, 0, - 0, 1724, 0, - 0, 1842, 0, - 0, 1963, 0, - 0, 2087, 0, - 0, 2212, 0, - 0, 2339, 0, - 0, 2468, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1960, 902, 1694, - 1959, 910, 1692, - 1956, 920, 1689, - 1953, 933, 1685, - 1949, 950, 1679, - 1944, 972, 1672, - 1937, 1000, 1662, - 1927, 1035, 1648, - 1913, 1077, 1628, - 1894, 1129, 1601, - 1868, 1190, 1562, - 1830, 1260, 1505, - 1773, 1340, 1413, - 1684, 1428, 1253, - 1530, 1525, 875, - 1174, 1629, 0, - 0, 1738, 0, - 0, 1853, 0, - 0, 1971, 0, - 0, 2093, 0, - 0, 2217, 0, - 0, 2343, 0, - 0, 2471, 0, - 0, 2599, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2095, 1005, 1821, - 2094, 1012, 1819, - 2093, 1020, 1817, - 2090, 1030, 1814, - 2087, 1044, 1810, - 2084, 1062, 1804, - 2078, 1085, 1797, - 2071, 1114, 1786, - 2061, 1150, 1772, - 2047, 1195, 1753, - 2029, 1248, 1725, - 2002, 1310, 1685, - 1964, 1382, 1626, - 1908, 1464, 1533, - 1820, 1554, 1367, - 1667, 1652, 963, - 1317, 1756, 0, - 0, 1867, 0, - 0, 1982, 0, - 0, 2101, 0, - 0, 2223, 0, - 0, 2348, 0, - 0, 2474, 0, - 0, 2602, 0, - 0, 2731, 0, - 0, 2860, 0, - 0, 2991, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2230, 1115, 1949, - 2229, 1120, 1948, - 2228, 1126, 1946, - 2226, 1135, 1944, - 2224, 1146, 1941, - 2221, 1160, 1936, - 2217, 1179, 1931, - 2212, 1203, 1923, - 2205, 1233, 1913, - 2195, 1270, 1898, - 2181, 1315, 1879, - 2162, 1369, 1851, - 2136, 1433, 1810, - 2098, 1507, 1750, - 2042, 1589, 1655, - 1955, 1681, 1484, - 1802, 1780, 1059, - 1457, 1885, 0, - 0, 1996, 0, - 0, 2112, 0, - 0, 2232, 0, - 0, 2354, 0, - 0, 2479, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2364, 1229, 2078, - 2363, 1233, 2077, - 2362, 1238, 2076, - 2361, 1245, 2074, - 2359, 1254, 2072, - 2357, 1265, 2069, - 2354, 1280, 2064, - 2350, 1299, 2059, - 2345, 1323, 2051, - 2338, 1354, 2041, - 2328, 1392, 2026, - 2314, 1438, 2006, - 2296, 1494, 1978, - 2269, 1559, 1937, - 2232, 1633, 1876, - 2176, 1717, 1779, - 2089, 1809, 1606, - 1937, 1908, 1163, - 1595, 2015, 0, - 0, 2127, 0, - 0, 2243, 0, - 0, 2363, 0, - 0, 2486, 0, - 0, 2611, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2497, 1348, 2208, - 2497, 1351, 2207, - 2496, 1355, 2206, - 2495, 1360, 2205, - 2494, 1367, 2203, - 2492, 1376, 2201, - 2490, 1387, 2198, - 2487, 1402, 2193, - 2483, 1422, 2188, - 2478, 1447, 2180, - 2471, 1478, 2169, - 2461, 1517, 2155, - 2447, 1564, 2135, - 2429, 1620, 2106, - 2402, 1686, 2065, - 2365, 1761, 2004, - 2309, 1845, 1906, - 2222, 1938, 1729, - 2071, 2038, 1272, - 1731, 2145, 0, - 0, 2257, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2630, 1470, 2338, - 2630, 1472, 2338, - 2629, 1475, 2337, - 2629, 1479, 2336, - 2628, 1484, 2335, - 2627, 1491, 2333, - 2625, 1500, 2331, - 2623, 1512, 2327, - 2620, 1527, 2323, - 2616, 1547, 2317, - 2611, 1572, 2310, - 2603, 1604, 2299, - 2594, 1643, 2284, - 2580, 1691, 2264, - 2561, 1748, 2236, - 2535, 1814, 2194, - 2498, 1890, 2132, - 2442, 1974, 2033, - 2355, 2068, 1855, - 2205, 2168, 1386, - 1867, 2276, 0, - 0, 2388, 0, - 0, 2505, 0, - 0, 2625, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2763, 1594, 2469, - 2763, 1595, 2469, - 2762, 1598, 2468, - 2762, 1601, 2467, - 2761, 1605, 2466, - 2760, 1610, 2465, - 2759, 1617, 2463, - 2757, 1626, 2461, - 2755, 1638, 2458, - 2752, 1654, 2454, - 2748, 1674, 2448, - 2743, 1699, 2440, - 2736, 1731, 2429, - 2726, 1771, 2415, - 2713, 1819, 2394, - 2694, 1876, 2366, - 2668, 1943, 2324, - 2630, 2019, 2262, - 2575, 2104, 2162, - 2488, 2198, 1982, - 2338, 2299, 1505, - 2001, 2407, 0, - 0, 2519, 0, - 0, 2637, 0, - 0, 2757, 0, - 0, 2880, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2896, 1720, 2600, - 2895, 1721, 2600, - 2895, 1723, 2600, - 2895, 1725, 2599, - 2894, 1728, 2598, - 2894, 1732, 2597, - 2893, 1738, 2596, - 2891, 1745, 2594, - 2890, 1754, 2592, - 2888, 1766, 2589, - 2885, 1782, 2584, - 2881, 1802, 2579, - 2876, 1828, 2571, - 2868, 1860, 2560, - 2859, 1900, 2545, - 2845, 1948, 2525, - 2827, 2006, 2496, - 2800, 2073, 2454, - 2763, 2149, 2392, - 2708, 2235, 2292, - 2621, 2329, 2111, - 2471, 2430, 1626, - 2135, 2538, 0, - 0, 2651, 0, - 0, 2768, 0, - 0, 2889, 0, - 0, 3012, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3028, 1847, 2732, - 3028, 1848, 2731, - 3028, 1850, 2731, - 3027, 1851, 2731, - 3027, 1854, 2730, - 3027, 1857, 2729, - 3026, 1861, 2728, - 3025, 1866, 2727, - 3024, 1873, 2725, - 3022, 1883, 2723, - 3020, 1895, 2720, - 3017, 1911, 2716, - 3013, 1931, 2710, - 3008, 1957, 2702, - 3001, 1989, 2691, - 2991, 2030, 2676, - 2978, 2078, 2656, - 2959, 2136, 2627, - 2933, 2203, 2585, - 2895, 2280, 2522, - 2840, 2366, 2422, - 2753, 2460, 2240, - 2604, 2562, 1750, - 2268, 2670, 0, - 0, 2783, 0, - 0, 2900, 0, - 0, 3021, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 3160, 1976, 2863, - 3160, 1977, 2863, - 3160, 1978, 2863, - 3160, 1979, 2862, - 3160, 1981, 2862, - 3159, 1983, 2862, - 3159, 1986, 2861, - 3158, 1990, 2860, - 3157, 1996, 2858, - 3156, 2003, 2857, - 3154, 2012, 2854, - 3152, 2025, 2851, - 3149, 2040, 2847, - 3146, 2061, 2841, - 3140, 2087, 2833, - 3133, 2120, 2822, - 3123, 2160, 2808, - 3110, 2209, 2787, - 3091, 2267, 2758, - 3065, 2334, 2716, - 3028, 2411, 2653, - 2972, 2497, 2553, - 2886, 2592, 2370, - 2736, 2693, 1876, - 2401, 2801, 0, - 0, 2914, 0, - 0, 3032, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3529, 0, - 0, 3657, 0, - 3293, 2105, 2995, - 3293, 2106, 2995, - 3293, 2107, 2995, - 3292, 2108, 2994, - 3292, 2109, 2994, - 3292, 2111, 2994, - 3292, 2113, 2993, - 3291, 2116, 2992, - 3290, 2120, 2991, - 3290, 2126, 2990, - 3288, 2133, 2988, - 3287, 2142, 2986, - 3285, 2155, 2983, - 3282, 2171, 2978, - 3278, 2191, 2973, - 3272, 2217, 2965, - 3265, 2250, 2954, - 3256, 2291, 2939, - 3242, 2339, 2919, - 3224, 2398, 2890, - 3197, 2465, 2848, - 3160, 2542, 2785, - 3105, 2629, 2684, - 3018, 2723, 2500, - 2869, 2825, 2004, - 2534, 2933, 0, - 0, 3046, 0, - 0, 3164, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3661, 0, - 3425, 2236, 3127, - 3425, 2236, 3127, - 3425, 2237, 3126, - 3425, 2237, 3126, - 3425, 2238, 3126, - 3424, 2240, 3126, - 3424, 2241, 3125, - 3424, 2244, 3125, - 3423, 2247, 3124, - 3423, 2251, 3123, - 3422, 2256, 3122, - 3421, 2264, 3120, - 3419, 2273, 3118, - 3417, 2286, 3114, - 3414, 2302, 3110, - 3410, 2322, 3104, - 3405, 2348, 3096, - 3397, 2381, 3086, - 3388, 2422, 3071, - 3374, 2471, 3050, - 3356, 2529, 3021, - 3330, 2597, 2979, - 3292, 2674, 2916, - 3237, 2760, 2815, - 3150, 2855, 2631, - 3001, 2957, 2132, - 2667, 3065, 0, - 0, 3178, 0, - 0, 3296, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3557, 2366, 3259, - 3557, 2367, 3258, - 3557, 2367, 3258, - 3557, 2367, 3258, - 3557, 2368, 3258, - 3557, 2369, 3258, - 3557, 2371, 3258, - 3556, 2372, 3257, - 3556, 2375, 3257, - 3555, 2378, 3256, - 3555, 2382, 3255, - 3554, 2387, 3254, - 3553, 2395, 3252, - 3551, 2404, 3249, - 3549, 2417, 3246, - 3546, 2433, 3242, - 3542, 2453, 3236, - 3537, 2480, 3228, - 3530, 2512, 3217, - 3520, 2553, 3203, - 3506, 2602, 3182, - 3488, 2660, 3153, - 3462, 2728, 3111, - 3424, 2806, 3048, - 3369, 2892, 2947, - 3283, 2987, 2763, - 3133, 3089, 2262, - 2799, 3197, 0, - 0, 3310, 0, - 0, 3428, 0, - 0, 3548, 0, - 0, 3672, 0, - 3689, 2497, 3390, - 3689, 2497, 3390, - 3689, 2498, 3390, - 3689, 2498, 3390, - 3689, 2499, 3390, - 3689, 2499, 3390, - 3689, 2500, 3390, - 3689, 2502, 3389, - 3688, 2504, 3389, - 3688, 2506, 3388, - 3688, 2509, 3388, - 3687, 2513, 3387, - 3686, 2519, 3385, - 3685, 2526, 3384, - 3683, 2535, 3381, - 3681, 2548, 3378, - 3678, 2564, 3374, - 3674, 2585, 3368, - 3669, 2611, 3360, - 3662, 2644, 3349, - 3652, 2684, 3334, - 3639, 2734, 3314, - 3620, 2792, 3285, - 3594, 2860, 3243, - 3557, 2937, 3179, - 3501, 3024, 3078, - 3415, 3119, 2894, - 3266, 3220, 2392, - 2932, 3329, 0, - 0, 3442, 0, - 0, 3560, 0, - 0, 3680, 0, - 3822, 2628, 3522, - 3822, 2629, 3522, - 3822, 2629, 3522, - 3822, 2629, 3522, - 3821, 2630, 3522, - 3821, 2630, 3522, - 3821, 2631, 3522, - 3821, 2632, 3522, - 3821, 2633, 3521, - 3821, 2635, 3521, - 3820, 2637, 3520, - 3820, 2641, 3520, - 3819, 2645, 3519, - 3818, 2650, 3517, - 3817, 2657, 3516, - 3815, 2667, 3513, - 3813, 2679, 3510, - 3810, 2696, 3506, - 3806, 2716, 3500, - 3801, 2743, 3492, - 3794, 2775, 3481, - 3784, 2816, 3466, - 3771, 2865, 3446, - 3752, 2924, 3417, - 3726, 2992, 3375, - 3689, 3069, 3311, - 3633, 3156, 3210, - 3547, 3250, 3026, - 3398, 3352, 2523, - 3064, 3461, 0, - 0, 3574, 0, - 0, 3692, 0, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2760, 3654, - 3954, 2761, 3654, - 3954, 2761, 3654, - 3954, 2762, 3654, - 3953, 2763, 3654, - 3953, 2764, 3654, - 3953, 2765, 3653, - 3953, 2767, 3653, - 3952, 2769, 3652, - 3952, 2772, 3652, - 3951, 2776, 3651, - 3950, 2782, 3649, - 3949, 2789, 3648, - 3948, 2799, 3645, - 3945, 2811, 3642, - 3942, 2827, 3638, - 3939, 2848, 3632, - 3933, 2874, 3624, - 3926, 2907, 3613, - 3916, 2948, 3598, - 3903, 2997, 3578, - 3884, 3056, 3549, - 3858, 3124, 3506, - 3821, 3201, 3443, - 3766, 3288, 3342, - 3679, 3382, 3157, - 3530, 3484, 2654, - 3196, 3593, 0, - 0, 3706, 0, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4086, 2894, 3786, - 4085, 2895, 3786, - 4085, 2897, 3785, - 4085, 2898, 3785, - 4085, 2901, 3784, - 4084, 2904, 3784, - 4083, 2908, 3783, - 4082, 2914, 3781, - 4081, 2921, 3780, - 4080, 2930, 3777, - 4077, 2943, 3774, - 4075, 2959, 3770, - 4071, 2980, 3764, - 4065, 3006, 3756, - 4058, 3039, 3745, - 4048, 3080, 3730, - 4035, 3129, 3710, - 4017, 3188, 3681, - 3990, 3256, 3638, - 3953, 3333, 3575, - 3898, 3420, 3474, - 3811, 3514, 3289, - 3662, 3616, 2785, - 3329, 3725, 0, - 4095, 3023, 3919, - 4095, 3023, 3918, - 4095, 3023, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3917, - 4095, 3030, 3917, - 4095, 3033, 3916, - 4095, 3036, 3916, - 4095, 3040, 3915, - 4095, 3045, 3913, - 4095, 3053, 3912, - 4095, 3062, 3909, - 4095, 3075, 3906, - 4095, 3091, 3902, - 4095, 3112, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3212, 3862, - 4095, 3261, 3842, - 4095, 3319, 3813, - 4095, 3388, 3770, - 4085, 3465, 3707, - 4030, 3552, 3606, - 3944, 3646, 3421, - 3794, 3748, 2916, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4049, - 4095, 3162, 4049, - 4095, 3164, 4048, - 4095, 3168, 4048, - 4095, 3172, 4047, - 4095, 3177, 4045, - 4095, 3185, 4044, - 4095, 3194, 4041, - 4095, 3207, 4038, - 4095, 3223, 4034, - 4095, 3244, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3344, 3994, - 4095, 3393, 3974, - 4095, 3451, 3945, - 4095, 3520, 3902, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3778, 3553, - 0, 387, 587, - 0, 410, 561, - 0, 440, 523, - 0, 477, 468, - 0, 523, 381, - 0, 577, 231, - 0, 641, 0, - 0, 714, 0, - 0, 797, 0, - 0, 888, 0, - 0, 987, 0, - 0, 1093, 0, - 0, 1204, 0, - 0, 1320, 0, - 0, 1439, 0, - 0, 1562, 0, - 0, 1687, 0, - 0, 1813, 0, - 0, 1941, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 395, 624, - 0, 418, 600, - 0, 448, 565, - 0, 484, 515, - 0, 529, 437, - 0, 583, 307, - 0, 646, 42, - 0, 718, 0, - 0, 800, 0, - 0, 891, 0, - 0, 989, 0, - 0, 1094, 0, - 0, 1205, 0, - 0, 1321, 0, - 0, 1440, 0, - 0, 1562, 0, - 0, 1687, 0, - 0, 1813, 0, - 0, 1941, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 406, 669, - 0, 428, 647, - 0, 457, 616, - 0, 493, 571, - 0, 537, 503, - 0, 590, 393, - 0, 652, 186, - 0, 724, 0, - 0, 805, 0, - 0, 894, 0, - 0, 992, 0, - 0, 1097, 0, - 0, 1207, 0, - 0, 1322, 0, - 0, 1441, 0, - 0, 1563, 0, - 0, 1688, 0, - 0, 1814, 0, - 0, 1942, 0, - 0, 2070, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 247, 420, 722, - 170, 442, 703, - 41, 470, 676, - 0, 505, 637, - 0, 547, 579, - 0, 599, 487, - 0, 660, 327, - 0, 731, 0, - 0, 811, 0, - 0, 899, 0, - 0, 996, 0, - 0, 1100, 0, - 0, 1210, 0, - 0, 1324, 0, - 0, 1443, 0, - 0, 1564, 0, - 0, 1688, 0, - 0, 1815, 0, - 0, 1942, 0, - 0, 2071, 0, - 0, 2200, 0, - 0, 2330, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2986, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 519, 438, 786, - 479, 459, 769, - 418, 486, 745, - 322, 520, 712, - 149, 561, 663, - 0, 611, 589, - 0, 671, 465, - 0, 740, 219, - 0, 818, 0, - 0, 906, 0, - 0, 1001, 0, - 0, 1104, 0, - 0, 1213, 0, - 0, 1327, 0, - 0, 1445, 0, - 0, 1566, 0, - 0, 1690, 0, - 0, 1815, 0, - 0, 1943, 0, - 0, 2071, 0, - 0, 2201, 0, - 0, 2331, 0, - 0, 2461, 0, - 0, 2592, 0, - 0, 2723, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 734, 461, 858, - 709, 481, 844, - 673, 507, 824, - 621, 539, 797, - 540, 579, 756, - 402, 627, 697, - 110, 685, 602, - 0, 752, 434, - 0, 828, 18, - 0, 914, 0, - 0, 1008, 0, - 0, 1109, 0, - 0, 1217, 0, - 0, 1330, 0, - 0, 1447, 0, - 0, 1568, 0, - 0, 1691, 0, - 0, 1817, 0, - 0, 1944, 0, - 0, 2072, 0, - 0, 2201, 0, - 0, 2331, 0, - 0, 2462, 0, - 0, 2592, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 919, 490, 940, - 903, 509, 929, - 880, 533, 912, - 847, 563, 889, - 800, 601, 857, - 727, 647, 810, - 607, 703, 738, - 373, 767, 619, - 0, 842, 388, - 0, 925, 0, - 0, 1017, 0, - 0, 1116, 0, - 0, 1223, 0, - 0, 1334, 0, - 0, 1451, 0, - 0, 1570, 0, - 0, 1693, 0, - 0, 1818, 0, - 0, 1945, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1087, 526, 1031, - 1076, 544, 1021, - 1061, 566, 1008, - 1039, 594, 990, - 1008, 630, 964, - 964, 673, 927, - 896, 726, 872, - 787, 787, 787, - 582, 859, 641, - 0, 939, 318, - 0, 1029, 0, - 0, 1126, 0, - 0, 1230, 0, - 0, 1340, 0, - 0, 1455, 0, - 0, 1574, 0, - 0, 1696, 0, - 0, 1820, 0, - 0, 1946, 0, - 0, 2074, 0, - 0, 2203, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1245, 570, 1130, - 1237, 586, 1122, - 1226, 607, 1111, - 1211, 633, 1097, - 1190, 665, 1076, - 1161, 706, 1048, - 1118, 755, 1006, - 1055, 813, 945, - 952, 880, 846, - 765, 958, 669, - 245, 1044, 205, - 0, 1138, 0, - 0, 1240, 0, - 0, 1348, 0, - 0, 1461, 0, - 0, 1578, 0, - 0, 1699, 0, - 0, 1823, 0, - 0, 1948, 0, - 0, 2075, 0, - 0, 2204, 0, - 0, 2333, 0, - 0, 2463, 0, - 0, 2594, 0, - 0, 2724, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1395, 623, 1235, - 1389, 638, 1229, - 1381, 656, 1220, - 1371, 679, 1209, - 1356, 709, 1193, - 1336, 746, 1171, - 1308, 791, 1140, - 1267, 845, 1095, - 1205, 908, 1026, - 1107, 981, 915, - 932, 1063, 703, - 477, 1154, 0, - 0, 1253, 0, - 0, 1358, 0, - 0, 1469, 0, - 0, 1585, 0, - 0, 1704, 0, - 0, 1826, 0, - 0, 1951, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1540, 686, 1346, - 1536, 698, 1341, - 1530, 715, 1334, - 1522, 735, 1326, - 1512, 762, 1313, - 1498, 794, 1297, - 1478, 835, 1273, - 1450, 884, 1240, - 1410, 943, 1191, - 1351, 1011, 1116, - 1256, 1088, 993, - 1088, 1174, 745, - 672, 1269, 0, - 0, 1371, 0, - 0, 1479, 0, - 0, 1593, 0, - 0, 1710, 0, - 0, 1831, 0, - 0, 1955, 0, - 0, 2080, 0, - 0, 2207, 0, - 0, 2336, 0, - 0, 2465, 0, - 0, 2595, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1681, 758, 1461, - 1678, 769, 1458, - 1674, 783, 1453, - 1669, 801, 1446, - 1661, 823, 1436, - 1651, 852, 1424, - 1637, 888, 1406, - 1618, 932, 1381, - 1590, 985, 1346, - 1551, 1047, 1295, - 1492, 1119, 1215, - 1400, 1200, 1079, - 1237, 1290, 797, - 846, 1388, 0, - 0, 1493, 0, - 0, 1603, 0, - 0, 1718, 0, - 0, 1837, 0, - 0, 1959, 0, - 0, 2084, 0, - 0, 2210, 0, - 0, 2338, 0, - 0, 2467, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1820, 840, 1581, - 1818, 849, 1578, - 1815, 860, 1574, - 1811, 875, 1569, - 1806, 895, 1562, - 1798, 920, 1552, - 1788, 951, 1539, - 1774, 989, 1521, - 1755, 1036, 1495, - 1728, 1092, 1458, - 1689, 1158, 1404, - 1632, 1233, 1319, - 1541, 1317, 1174, - 1382, 1410, 857, - 1007, 1510, 0, - 0, 1617, 0, - 0, 1729, 0, - 0, 1846, 0, - 0, 1966, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1958, 930, 1703, - 1956, 937, 1701, - 1954, 947, 1698, - 1951, 959, 1694, - 1947, 976, 1689, - 1941, 996, 1681, - 1934, 1023, 1671, - 1924, 1056, 1658, - 1910, 1097, 1639, - 1891, 1146, 1613, - 1865, 1205, 1575, - 1826, 1273, 1518, - 1769, 1351, 1430, - 1679, 1437, 1277, - 1523, 1532, 927, - 1160, 1635, 0, - 0, 1743, 0, - 0, 1856, 0, - 0, 1974, 0, - 0, 2095, 0, - 0, 2219, 0, - 0, 2344, 0, - 0, 2471, 0, - 0, 2600, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2094, 1028, 1828, - 2092, 1034, 1826, - 2091, 1042, 1824, - 2088, 1052, 1821, - 2086, 1065, 1817, - 2082, 1082, 1811, - 2076, 1104, 1804, - 2069, 1132, 1794, - 2059, 1167, 1780, - 2045, 1210, 1761, - 2026, 1261, 1733, - 2000, 1322, 1695, - 1962, 1392, 1637, - 1905, 1472, 1545, - 1816, 1561, 1385, - 1662, 1657, 1007, - 1307, 1761, 0, - 0, 1870, 0, - 0, 1985, 0, - 0, 2103, 0, - 0, 2225, 0, - 0, 2349, 0, - 0, 2475, 0, - 0, 2603, 0, - 0, 2731, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2228, 1133, 1954, - 2228, 1138, 1953, - 2226, 1144, 1951, - 2225, 1152, 1949, - 2223, 1163, 1946, - 2220, 1176, 1942, - 2216, 1194, 1936, - 2210, 1217, 1929, - 2203, 1246, 1918, - 2193, 1282, 1904, - 2180, 1327, 1885, - 2161, 1380, 1857, - 2134, 1442, 1817, - 2096, 1514, 1758, - 2040, 1596, 1665, - 1952, 1686, 1499, - 1799, 1784, 1095, - 1449, 1888, 0, - 0, 1999, 0, - 0, 2114, 0, - 0, 2233, 0, - 0, 2356, 0, - 0, 2480, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2863, 0, - 0, 2992, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2363, 1243, 2082, - 2362, 1247, 2081, - 2361, 1252, 2080, - 2360, 1258, 2078, - 2358, 1267, 2076, - 2356, 1278, 2073, - 2353, 1292, 2068, - 2349, 1311, 2063, - 2344, 1335, 2055, - 2337, 1365, 2045, - 2327, 1402, 2031, - 2313, 1447, 2011, - 2294, 1502, 1983, - 2268, 1565, 1942, - 2230, 1639, 1882, - 2174, 1721, 1787, - 2087, 1813, 1617, - 1934, 1912, 1191, - 1589, 2017, 0, - 0, 2129, 0, - 0, 2244, 0, - 0, 2364, 0, - 0, 2486, 0, - 0, 2611, 0, - 0, 2738, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3124, 0, - 0, 3255, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2496, 1359, 2211, - 2496, 1362, 2210, - 2495, 1365, 2209, - 2494, 1370, 2208, - 2493, 1377, 2206, - 2491, 1386, 2204, - 2489, 1397, 2201, - 2486, 1412, 2196, - 2482, 1431, 2191, - 2477, 1455, 2183, - 2470, 1486, 2173, - 2460, 1524, 2158, - 2446, 1570, 2138, - 2428, 1626, 2110, - 2402, 1691, 2069, - 2364, 1765, 2008, - 2308, 1849, 1911, - 2221, 1941, 1738, - 2069, 2041, 1295, - 1727, 2147, 0, - 0, 2259, 0, - 0, 2375, 0, - 0, 2495, 0, - 0, 2618, 0, - 0, 2743, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3648, 0, - 2630, 1478, 2340, - 2629, 1480, 2340, - 2629, 1483, 2339, - 2628, 1487, 2338, - 2627, 1492, 2337, - 2626, 1499, 2335, - 2624, 1508, 2333, - 2622, 1519, 2330, - 2619, 1535, 2326, - 2615, 1554, 2320, - 2610, 1579, 2312, - 2603, 1610, 2302, - 2593, 1649, 2287, - 2579, 1696, 2267, - 2561, 1752, 2238, - 2535, 1818, 2197, - 2497, 1893, 2136, - 2441, 1977, 2038, - 2354, 2070, 1861, - 2203, 2170, 1404, - 1864, 2277, 0, - 0, 2389, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 2763, 1600, 2471, - 2762, 1602, 2470, - 2762, 1604, 2470, - 2761, 1607, 2469, - 2761, 1611, 2468, - 2760, 1616, 2467, - 2759, 1623, 2465, - 2757, 1632, 2463, - 2755, 1644, 2460, - 2752, 1659, 2455, - 2748, 1679, 2450, - 2743, 1704, 2442, - 2735, 1736, 2431, - 2726, 1775, 2417, - 2712, 1823, 2396, - 2694, 1880, 2368, - 2667, 1946, 2326, - 2630, 2022, 2264, - 2574, 2107, 2165, - 2487, 2200, 1987, - 2337, 2301, 1518, - 1999, 2408, 0, - 0, 2520, 0, - 0, 2637, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 2895, 1725, 2601, - 2895, 1726, 2601, - 2895, 1728, 2601, - 2894, 1730, 2600, - 2894, 1733, 2599, - 2893, 1737, 2599, - 2892, 1742, 2597, - 2891, 1749, 2595, - 2890, 1758, 2593, - 2887, 1770, 2590, - 2884, 1786, 2586, - 2881, 1806, 2580, - 2875, 1832, 2572, - 2868, 1864, 2561, - 2858, 1903, 2547, - 2845, 1951, 2526, - 2826, 2008, 2498, - 2800, 2075, 2456, - 2763, 2151, 2394, - 2707, 2237, 2294, - 2620, 2330, 2114, - 2470, 2431, 1637, - 2133, 2539, 0, - 0, 2652, 0, - 0, 2769, 0, - 0, 2889, 0, - 0, 3012, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3028, 1851, 2733, - 3028, 1852, 2732, - 3027, 1853, 2732, - 3027, 1855, 2732, - 3027, 1857, 2731, - 3026, 1860, 2730, - 3026, 1864, 2729, - 3025, 1870, 2728, - 3024, 1877, 2726, - 3022, 1886, 2724, - 3020, 1898, 2721, - 3017, 1914, 2717, - 3013, 1934, 2711, - 3008, 1960, 2703, - 3000, 1992, 2692, - 2991, 2032, 2677, - 2977, 2080, 2657, - 2959, 2138, 2628, - 2933, 2205, 2586, - 2895, 2282, 2524, - 2840, 2367, 2424, - 2753, 2461, 2243, - 2603, 2562, 1758, - 2267, 2670, 0, - 0, 2783, 0, - 0, 2900, 0, - 0, 3021, 0, - 0, 3144, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 3160, 1979, 2864, - 3160, 1979, 2864, - 3160, 1980, 2863, - 3160, 1982, 2863, - 3160, 1983, 2863, - 3159, 1986, 2862, - 3159, 1989, 2861, - 3158, 1993, 2861, - 3157, 1998, 2859, - 3156, 2005, 2857, - 3154, 2015, 2855, - 3152, 2027, 2852, - 3149, 2043, 2848, - 3145, 2063, 2842, - 3140, 2089, 2834, - 3133, 2122, 2823, - 3123, 2162, 2809, - 3110, 2210, 2788, - 3091, 2268, 2759, - 3065, 2335, 2717, - 3028, 2412, 2654, - 2972, 2498, 2554, - 2886, 2592, 2372, - 2736, 2694, 1882, - 2401, 2802, 0, - 0, 2915, 0, - 0, 3032, 0, - 0, 3153, 0, - 0, 3276, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 3293, 2107, 2995, - 3293, 2108, 2995, - 3292, 2109, 2995, - 3292, 2110, 2995, - 3292, 2111, 2995, - 3292, 2113, 2994, - 3291, 2115, 2994, - 3291, 2118, 2993, - 3290, 2122, 2992, - 3289, 2128, 2991, - 3288, 2135, 2989, - 3287, 2144, 2986, - 3284, 2157, 2983, - 3282, 2173, 2979, - 3278, 2193, 2973, - 3272, 2219, 2965, - 3265, 2252, 2955, - 3255, 2292, 2940, - 3242, 2341, 2919, - 3223, 2399, 2890, - 3197, 2466, 2848, - 3160, 2543, 2785, - 3104, 2629, 2685, - 3018, 2724, 2502, - 2868, 2825, 2008, - 2534, 2933, 0, - 0, 3046, 0, - 0, 3164, 0, - 0, 3285, 0, - 0, 3408, 0, - 0, 3534, 0, - 0, 3661, 0, - 3425, 2237, 3127, - 3425, 2238, 3127, - 3425, 2238, 3127, - 3425, 2239, 3127, - 3425, 2240, 3126, - 3424, 2241, 3126, - 3424, 2243, 3126, - 3424, 2245, 3125, - 3423, 2248, 3124, - 3423, 2252, 3123, - 3422, 2258, 3122, - 3420, 2265, 3120, - 3419, 2275, 3118, - 3417, 2287, 3115, - 3414, 2303, 3111, - 3410, 2323, 3105, - 3405, 2350, 3097, - 3397, 2382, 3086, - 3388, 2423, 3071, - 3374, 2472, 3051, - 3356, 2530, 3022, - 3330, 2597, 2980, - 3292, 2675, 2917, - 3237, 2761, 2816, - 3150, 2855, 2633, - 3001, 2957, 2136, - 2666, 3065, 0, - 0, 3178, 0, - 0, 3296, 0, - 0, 3417, 0, - 0, 3540, 0, - 0, 3666, 0, - 3557, 2367, 3259, - 3557, 2368, 3259, - 3557, 2368, 3259, - 3557, 2369, 3259, - 3557, 2369, 3258, - 3557, 2370, 3258, - 3557, 2372, 3258, - 3556, 2373, 3257, - 3556, 2376, 3257, - 3555, 2379, 3256, - 3555, 2383, 3255, - 3554, 2389, 3254, - 3553, 2396, 3252, - 3551, 2405, 3250, - 3549, 2418, 3247, - 3546, 2434, 3242, - 3542, 2454, 3236, - 3537, 2480, 3229, - 3530, 2513, 3218, - 3520, 2554, 3203, - 3506, 2603, 3182, - 3488, 2661, 3153, - 3462, 2729, 3111, - 3424, 2806, 3048, - 3369, 2892, 2947, - 3283, 2987, 2763, - 3133, 3089, 2264, - 2799, 3197, 0, - 0, 3310, 0, - 0, 3428, 0, - 0, 3548, 0, - 0, 3672, 0, - 3689, 2498, 3391, - 3689, 2498, 3391, - 3689, 2499, 3391, - 3689, 2499, 3390, - 3689, 2500, 3390, - 3689, 2500, 3390, - 3689, 2501, 3390, - 3689, 2503, 3390, - 3688, 2504, 3389, - 3688, 2507, 3389, - 3688, 2510, 3388, - 3687, 2514, 3387, - 3686, 2520, 3386, - 3685, 2527, 3384, - 3683, 2536, 3382, - 3681, 2549, 3378, - 3678, 2565, 3374, - 3674, 2585, 3368, - 3669, 2612, 3360, - 3662, 2644, 3350, - 3652, 2685, 3335, - 3639, 2734, 3314, - 3620, 2792, 3285, - 3594, 2860, 3243, - 3557, 2938, 3180, - 3501, 3024, 3079, - 3415, 3119, 2895, - 3265, 3221, 2394, - 2932, 3329, 0, - 0, 3442, 0, - 0, 3560, 0, - 0, 3681, 0, - 3822, 2629, 3523, - 3822, 2629, 3523, - 3822, 2630, 3523, - 3822, 2630, 3522, - 3821, 2630, 3522, - 3821, 2631, 3522, - 3821, 2632, 3522, - 3821, 2633, 3522, - 3821, 2634, 3522, - 3821, 2636, 3521, - 3820, 2638, 3521, - 3820, 2641, 3520, - 3819, 2645, 3519, - 3818, 2651, 3518, - 3817, 2658, 3516, - 3815, 2668, 3513, - 3813, 2680, 3510, - 3810, 2696, 3506, - 3806, 2717, 3500, - 3801, 2743, 3492, - 3794, 2776, 3481, - 3784, 2817, 3467, - 3771, 2866, 3446, - 3752, 2924, 3417, - 3726, 2992, 3375, - 3689, 3069, 3312, - 3633, 3156, 3210, - 3547, 3251, 3026, - 3398, 3353, 2524, - 3064, 3461, 0, - 0, 3574, 0, - 0, 3692, 0, - 3954, 2760, 3655, - 3954, 2761, 3655, - 3954, 2761, 3654, - 3954, 2761, 3654, - 3954, 2761, 3654, - 3954, 2762, 3654, - 3953, 2762, 3654, - 3953, 2763, 3654, - 3953, 2764, 3654, - 3953, 2765, 3653, - 3953, 2767, 3653, - 3952, 2769, 3652, - 3952, 2773, 3652, - 3951, 2777, 3651, - 3950, 2782, 3649, - 3949, 2790, 3648, - 3947, 2799, 3645, - 3945, 2812, 3642, - 3942, 2828, 3638, - 3939, 2848, 3632, - 3933, 2875, 3624, - 3926, 2908, 3613, - 3916, 2948, 3598, - 3903, 2997, 3578, - 3884, 3056, 3549, - 3858, 3124, 3507, - 3821, 3201, 3443, - 3766, 3288, 3342, - 3679, 3383, 3158, - 3530, 3485, 2655, - 3196, 3593, 0, - 0, 3706, 0, - 4086, 2892, 3787, - 4086, 2892, 3787, - 4086, 2892, 3787, - 4086, 2892, 3786, - 4086, 2893, 3786, - 4086, 2893, 3786, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4086, 2895, 3786, - 4085, 2896, 3786, - 4085, 2897, 3785, - 4085, 2899, 3785, - 4084, 2901, 3784, - 4084, 2904, 3784, - 4083, 2908, 3783, - 4082, 2914, 3781, - 4081, 2921, 3780, - 4080, 2931, 3777, - 4077, 2943, 3774, - 4075, 2959, 3770, - 4071, 2980, 3764, - 4065, 3006, 3756, - 4058, 3039, 3745, - 4048, 3080, 3730, - 4035, 3129, 3710, - 4016, 3188, 3681, - 3990, 3256, 3639, - 3953, 3333, 3575, - 3898, 3420, 3474, - 3811, 3515, 3289, - 3662, 3617, 2786, - 3329, 3725, 0, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3024, 3918, - 4095, 3024, 3918, - 4095, 3025, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3029, 3917, - 4095, 3030, 3917, - 4095, 3033, 3916, - 4095, 3036, 3916, - 4095, 3040, 3915, - 4095, 3046, 3913, - 4095, 3053, 3912, - 4095, 3062, 3909, - 4095, 3075, 3906, - 4095, 3091, 3902, - 4095, 3112, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3212, 3862, - 4095, 3261, 3842, - 4095, 3320, 3813, - 4095, 3388, 3771, - 4085, 3465, 3707, - 4030, 3552, 3606, - 3943, 3647, 3421, - 3794, 3749, 2917, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3155, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4050, - 4095, 3156, 4050, - 4095, 3157, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3161, 4049, - 4095, 3162, 4049, - 4095, 3165, 4048, - 4095, 3168, 4048, - 4095, 3172, 4047, - 4095, 3177, 4045, - 4095, 3185, 4044, - 4095, 3194, 4041, - 4095, 3207, 4038, - 4095, 3223, 4034, - 4095, 3244, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3344, 3994, - 4095, 3393, 3974, - 4095, 3452, 3945, - 4095, 3520, 3903, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3779, 3553, - 0, 494, 709, - 0, 513, 690, - 0, 537, 662, - 0, 567, 621, - 0, 604, 561, - 0, 650, 466, - 0, 705, 295, - 0, 770, 0, - 0, 843, 0, - 0, 927, 0, - 0, 1018, 0, - 0, 1118, 0, - 0, 1223, 0, - 0, 1335, 0, - 0, 1451, 0, - 0, 1571, 0, - 0, 1693, 0, - 0, 1818, 0, - 0, 1945, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 500, 738, - 0, 519, 719, - 0, 543, 693, - 0, 572, 655, - 0, 610, 600, - 0, 655, 513, - 0, 709, 363, - 0, 773, 25, - 0, 846, 0, - 0, 929, 0, - 0, 1020, 0, - 0, 1119, 0, - 0, 1225, 0, - 0, 1336, 0, - 0, 1452, 0, - 0, 1571, 0, - 0, 1694, 0, - 0, 1819, 0, - 0, 1945, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 509, 773, - 0, 527, 756, - 0, 550, 732, - 0, 580, 697, - 0, 616, 647, - 0, 661, 569, - 0, 715, 440, - 0, 778, 174, - 0, 850, 0, - 0, 932, 0, - 0, 1023, 0, - 0, 1121, 0, - 0, 1227, 0, - 0, 1337, 0, - 0, 1453, 0, - 0, 1572, 0, - 0, 1694, 0, - 0, 1819, 0, - 0, 1946, 0, - 0, 2073, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 66, 520, 816, - 0, 538, 801, - 0, 561, 779, - 0, 589, 748, - 0, 625, 703, - 0, 669, 635, - 0, 722, 525, - 0, 784, 318, - 0, 856, 0, - 0, 937, 0, - 0, 1027, 0, - 0, 1124, 0, - 0, 1229, 0, - 0, 1339, 0, - 0, 1454, 0, - 0, 1573, 0, - 0, 1695, 0, - 0, 1820, 0, - 0, 1946, 0, - 0, 2074, 0, - 0, 2202, 0, - 0, 2332, 0, - 0, 2462, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3118, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 429, 534, 868, - 379, 552, 854, - 302, 574, 835, - 173, 602, 808, - 0, 637, 769, - 0, 680, 711, - 0, 731, 620, - 0, 792, 459, - 0, 863, 78, - 0, 943, 0, - 0, 1031, 0, - 0, 1128, 0, - 0, 1232, 0, - 0, 1342, 0, - 0, 1456, 0, - 0, 1575, 0, - 0, 1696, 0, - 0, 1821, 0, - 0, 1947, 0, - 0, 2074, 0, - 0, 2203, 0, - 0, 2332, 0, - 0, 2463, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2855, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 680, 553, 930, - 652, 570, 918, - 611, 591, 901, - 550, 618, 878, - 454, 652, 844, - 281, 693, 796, - 0, 743, 721, - 0, 803, 597, - 0, 872, 351, - 0, 950, 0, - 0, 1038, 0, - 0, 1133, 0, - 0, 1236, 0, - 0, 1345, 0, - 0, 1459, 0, - 0, 1577, 0, - 0, 1698, 0, - 0, 1822, 0, - 0, 1948, 0, - 0, 2075, 0, - 0, 2203, 0, - 0, 2333, 0, - 0, 2463, 0, - 0, 2593, 0, - 0, 2724, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 884, 577, 1001, - 866, 593, 990, - 841, 613, 976, - 806, 639, 956, - 753, 671, 929, - 672, 711, 889, - 534, 759, 829, - 243, 817, 734, - 0, 884, 566, - 0, 960, 150, - 0, 1046, 0, - 0, 1140, 0, - 0, 1241, 0, - 0, 1349, 0, - 0, 1462, 0, - 0, 1579, 0, - 0, 1700, 0, - 0, 1823, 0, - 0, 1949, 0, - 0, 2076, 0, - 0, 2204, 0, - 0, 2333, 0, - 0, 2463, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1063, 607, 1081, - 1051, 622, 1072, - 1035, 641, 1061, - 1012, 665, 1044, - 979, 696, 1022, - 932, 733, 989, - 859, 780, 942, - 739, 835, 870, - 505, 899, 751, - 0, 974, 520, - 0, 1057, 0, - 0, 1149, 0, - 0, 1249, 0, - 0, 1355, 0, - 0, 1466, 0, - 0, 1583, 0, - 0, 1702, 0, - 0, 1825, 0, - 0, 1950, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1228, 644, 1170, - 1219, 658, 1163, - 1208, 676, 1153, - 1193, 698, 1140, - 1171, 727, 1122, - 1140, 762, 1096, - 1096, 805, 1059, - 1029, 858, 1005, - 919, 919, 919, - 715, 991, 773, - 63, 1071, 450, - 0, 1161, 0, - 0, 1258, 0, - 0, 1362, 0, - 0, 1472, 0, - 0, 1587, 0, - 0, 1706, 0, - 0, 1828, 0, - 0, 1952, 0, - 0, 2078, 0, - 0, 2206, 0, - 0, 2335, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1383, 690, 1267, - 1377, 702, 1262, - 1369, 718, 1254, - 1358, 739, 1243, - 1343, 765, 1229, - 1322, 798, 1208, - 1293, 838, 1180, - 1250, 887, 1139, - 1187, 945, 1077, - 1084, 1013, 978, - 897, 1090, 801, - 377, 1176, 337, - 0, 1270, 0, - 0, 1372, 0, - 0, 1480, 0, - 0, 1593, 0, - 0, 1711, 0, - 0, 1831, 0, - 0, 1955, 0, - 0, 2080, 0, - 0, 2208, 0, - 0, 2336, 0, - 0, 2465, 0, - 0, 2595, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1531, 745, 1371, - 1527, 756, 1367, - 1521, 770, 1361, - 1513, 788, 1352, - 1503, 812, 1341, - 1488, 841, 1325, - 1468, 878, 1303, - 1440, 923, 1272, - 1399, 977, 1227, - 1337, 1040, 1158, - 1239, 1113, 1047, - 1064, 1195, 835, - 609, 1286, 120, - 0, 1385, 0, - 0, 1490, 0, - 0, 1601, 0, - 0, 1717, 0, - 0, 1836, 0, - 0, 1958, 0, - 0, 2083, 0, - 0, 2210, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1675, 809, 1481, - 1672, 818, 1478, - 1668, 831, 1473, - 1662, 847, 1466, - 1655, 867, 1458, - 1644, 894, 1445, - 1630, 927, 1429, - 1610, 967, 1405, - 1582, 1016, 1372, - 1542, 1075, 1323, - 1483, 1143, 1249, - 1388, 1220, 1125, - 1220, 1307, 878, - 804, 1401, 0, - 0, 1503, 0, - 0, 1611, 0, - 0, 1725, 0, - 0, 1842, 0, - 0, 1963, 0, - 0, 2087, 0, - 0, 2212, 0, - 0, 2340, 0, - 0, 2468, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1816, 882, 1596, - 1813, 890, 1593, - 1810, 901, 1590, - 1806, 915, 1585, - 1801, 933, 1578, - 1793, 955, 1569, - 1783, 984, 1556, - 1769, 1020, 1538, - 1750, 1064, 1514, - 1722, 1117, 1478, - 1683, 1179, 1427, - 1625, 1251, 1347, - 1532, 1333, 1212, - 1369, 1422, 929, - 978, 1520, 0, - 0, 1625, 0, - 0, 1735, 0, - 0, 1850, 0, - 0, 1969, 0, - 0, 2092, 0, - 0, 2216, 0, - 0, 2342, 0, - 0, 2470, 0, - 0, 2599, 0, - 0, 2728, 0, - 0, 2859, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1954, 965, 1715, - 1952, 972, 1713, - 1950, 981, 1710, - 1947, 992, 1706, - 1943, 1007, 1701, - 1938, 1027, 1694, - 1930, 1052, 1684, - 1920, 1083, 1671, - 1906, 1121, 1653, - 1887, 1168, 1627, - 1860, 1224, 1590, - 1821, 1290, 1536, - 1764, 1365, 1452, - 1673, 1449, 1307, - 1514, 1542, 989, - 1139, 1642, 0, - 0, 1749, 0, - 0, 1861, 0, - 0, 1978, 0, - 0, 2098, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 2091, 1056, 1837, - 2090, 1062, 1835, - 2088, 1069, 1833, - 2086, 1079, 1830, - 2083, 1091, 1826, - 2079, 1108, 1821, - 2073, 1129, 1813, - 2066, 1155, 1803, - 2056, 1188, 1790, - 2042, 1229, 1771, - 2023, 1278, 1745, - 1997, 1337, 1707, - 1958, 1405, 1650, - 1901, 1483, 1562, - 1812, 1570, 1409, - 1655, 1664, 1059, - 1292, 1767, 0, - 0, 1875, 0, - 0, 1988, 0, - 0, 2106, 0, - 0, 2227, 0, - 0, 2351, 0, - 0, 2476, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2227, 1156, 1961, - 2226, 1160, 1960, - 2224, 1166, 1958, - 2223, 1174, 1956, - 2221, 1184, 1953, - 2218, 1197, 1949, - 2214, 1214, 1943, - 2208, 1236, 1936, - 2201, 1264, 1926, - 2191, 1299, 1912, - 2177, 1342, 1893, - 2158, 1393, 1866, - 2132, 1454, 1827, - 2094, 1524, 1769, - 2037, 1604, 1678, - 1948, 1693, 1517, - 1794, 1789, 1139, - 1439, 1893, 0, - 0, 2002, 0, - 0, 2117, 0, - 0, 2235, 0, - 0, 2357, 0, - 0, 2481, 0, - 0, 2607, 0, - 0, 2735, 0, - 0, 2863, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3647, 0, - 2361, 1261, 2087, - 2361, 1265, 2086, - 2360, 1270, 2085, - 2358, 1276, 2083, - 2357, 1284, 2081, - 2355, 1295, 2078, - 2352, 1309, 2074, - 2348, 1327, 2068, - 2342, 1349, 2061, - 2335, 1378, 2050, - 2325, 1415, 2036, - 2312, 1459, 2017, - 2293, 1512, 1989, - 2266, 1574, 1949, - 2228, 1646, 1890, - 2172, 1728, 1797, - 2084, 1818, 1631, - 1931, 1916, 1227, - 1581, 2021, 0, - 0, 2131, 0, - 0, 2246, 0, - 0, 2365, 0, - 0, 2488, 0, - 0, 2612, 0, - 0, 2738, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2495, 1373, 2215, - 2495, 1376, 2214, - 2494, 1379, 2213, - 2493, 1384, 2212, - 2492, 1391, 2210, - 2490, 1399, 2208, - 2488, 1410, 2205, - 2485, 1424, 2201, - 2481, 1443, 2195, - 2476, 1467, 2187, - 2469, 1497, 2177, - 2459, 1534, 2163, - 2445, 1579, 2143, - 2427, 1634, 2115, - 2400, 1698, 2074, - 2362, 1771, 2014, - 2306, 1854, 1919, - 2219, 1945, 1749, - 2066, 2044, 1323, - 1721, 2149, 0, - 0, 2261, 0, - 0, 2376, 0, - 0, 2496, 0, - 0, 2619, 0, - 0, 2743, 0, - 0, 2870, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3649, 0, - 2629, 1489, 2343, - 2628, 1491, 2343, - 2628, 1494, 2342, - 2627, 1497, 2341, - 2626, 1503, 2340, - 2625, 1509, 2338, - 2623, 1518, 2336, - 2621, 1529, 2333, - 2618, 1544, 2329, - 2614, 1563, 2323, - 2609, 1588, 2315, - 2602, 1618, 2305, - 2592, 1656, 2290, - 2579, 1703, 2270, - 2560, 1758, 2242, - 2534, 1823, 2201, - 2496, 1897, 2140, - 2440, 1981, 2043, - 2353, 2073, 1870, - 2201, 2173, 1427, - 1859, 2279, 0, - 0, 2391, 0, - 0, 2507, 0, - 0, 2627, 0, - 0, 2750, 0, - 0, 2875, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 2762, 1608, 2473, - 2762, 1610, 2473, - 2761, 1612, 2472, - 2761, 1615, 2471, - 2760, 1619, 2470, - 2759, 1624, 2469, - 2758, 1631, 2467, - 2756, 1640, 2465, - 2754, 1652, 2462, - 2751, 1667, 2458, - 2747, 1686, 2452, - 2742, 1711, 2444, - 2735, 1742, 2434, - 2725, 1781, 2419, - 2712, 1828, 2399, - 2693, 1884, 2370, - 2667, 1950, 2329, - 2629, 2025, 2268, - 2573, 2109, 2170, - 2486, 2202, 1993, - 2335, 2302, 1536, - 1996, 2409, 0, - 0, 2521, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 2895, 1731, 2603, - 2895, 1732, 2603, - 2894, 1734, 2602, - 2894, 1736, 2602, - 2893, 1739, 2601, - 2893, 1743, 2600, - 2892, 1748, 2599, - 2891, 1755, 2597, - 2889, 1764, 2595, - 2887, 1776, 2592, - 2884, 1791, 2587, - 2880, 1811, 2582, - 2875, 1836, 2574, - 2868, 1868, 2563, - 2858, 1907, 2549, - 2844, 1955, 2528, - 2826, 2012, 2500, - 2800, 2078, 2458, - 2762, 2154, 2396, - 2706, 2239, 2298, - 2619, 2332, 2119, - 2469, 2433, 1651, - 2131, 2540, 0, - 0, 2652, 0, - 0, 2769, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3028, 1856, 2734, - 3027, 1857, 2734, - 3027, 1858, 2733, - 3027, 1860, 2733, - 3027, 1862, 2732, - 3026, 1865, 2732, - 3025, 1869, 2731, - 3024, 1874, 2729, - 3023, 1881, 2728, - 3022, 1890, 2725, - 3019, 1902, 2722, - 3017, 1918, 2718, - 3013, 1938, 2712, - 3007, 1964, 2704, - 3000, 1996, 2694, - 2990, 2035, 2679, - 2977, 2083, 2658, - 2958, 2140, 2630, - 2932, 2207, 2588, - 2895, 2283, 2526, - 2839, 2369, 2426, - 2752, 2462, 2246, - 2602, 2563, 1769, - 2265, 2671, 0, - 0, 2784, 0, - 0, 2901, 0, - 0, 3021, 0, - 0, 3144, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 3160, 1982, 2865, - 3160, 1983, 2865, - 3160, 1984, 2864, - 3160, 1985, 2864, - 3159, 1987, 2864, - 3159, 1989, 2863, - 3158, 1992, 2862, - 3158, 1996, 2861, - 3157, 2002, 2860, - 3156, 2009, 2858, - 3154, 2018, 2856, - 3152, 2030, 2853, - 3149, 2046, 2849, - 3145, 2066, 2843, - 3140, 2092, 2835, - 3133, 2124, 2824, - 3123, 2164, 2810, - 3109, 2212, 2789, - 3091, 2270, 2760, - 3065, 2337, 2719, - 3027, 2414, 2656, - 2972, 2499, 2556, - 2885, 2593, 2375, - 2735, 2695, 1890, - 2399, 2802, 0, - 0, 2915, 0, - 0, 3032, 0, - 0, 3153, 0, - 0, 3276, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 3292, 2110, 2996, - 3292, 2111, 2996, - 3292, 2111, 2996, - 3292, 2112, 2996, - 3292, 2114, 2995, - 3292, 2116, 2995, - 3291, 2118, 2994, - 3291, 2121, 2994, - 3290, 2125, 2993, - 3289, 2130, 2991, - 3288, 2138, 2990, - 3286, 2147, 2987, - 3284, 2159, 2984, - 3281, 2175, 2980, - 3277, 2195, 2974, - 3272, 2221, 2966, - 3265, 2254, 2955, - 3255, 2294, 2941, - 3242, 2342, 2920, - 3223, 2400, 2891, - 3197, 2467, 2849, - 3160, 2544, 2787, - 3104, 2630, 2686, - 3018, 2724, 2504, - 2868, 2826, 2015, - 2533, 2934, 0, - 0, 3047, 0, - 0, 3164, 0, - 0, 3285, 0, - 0, 3408, 0, - 0, 3534, 0, - 0, 3661, 0, - 3425, 2239, 3128, - 3425, 2240, 3127, - 3425, 2240, 3127, - 3425, 2241, 3127, - 3424, 2242, 3127, - 3424, 2243, 3127, - 3424, 2245, 3126, - 3424, 2247, 3126, - 3423, 2250, 3125, - 3422, 2254, 3124, - 3421, 2260, 3123, - 3420, 2267, 3121, - 3419, 2276, 3119, - 3417, 2289, 3115, - 3414, 2305, 3111, - 3410, 2325, 3105, - 3404, 2351, 3097, - 3397, 2384, 3087, - 3387, 2424, 3072, - 3374, 2473, 3051, - 3355, 2531, 3022, - 3329, 2598, 2980, - 3292, 2675, 2918, - 3237, 2761, 2817, - 3150, 2856, 2634, - 3000, 2957, 2141, - 2666, 3065, 0, - 0, 3178, 0, - 0, 3296, 0, - 0, 3417, 0, - 0, 3540, 0, - 0, 3666, 0, - 3557, 2369, 3259, - 3557, 2369, 3259, - 3557, 2370, 3259, - 3557, 2370, 3259, - 3557, 2371, 3259, - 3557, 2372, 3259, - 3556, 2373, 3258, - 3556, 2375, 3258, - 3556, 2377, 3257, - 3555, 2380, 3257, - 3555, 2385, 3256, - 3554, 2390, 3254, - 3553, 2397, 3252, - 3551, 2407, 3250, - 3549, 2419, 3247, - 3546, 2435, 3243, - 3542, 2456, 3237, - 3537, 2482, 3229, - 3529, 2514, 3218, - 3520, 2555, 3203, - 3506, 2604, 3183, - 3488, 2662, 3154, - 3462, 2729, 3112, - 3424, 2807, 3049, - 3369, 2893, 2948, - 3282, 2987, 2765, - 3133, 3089, 2268, - 2799, 3197, 0, - 0, 3310, 0, - 0, 3428, 0, - 0, 3549, 0, - 0, 3672, 0, - 3689, 2499, 3391, - 3689, 2499, 3391, - 3689, 2500, 3391, - 3689, 2500, 3391, - 3689, 2501, 3391, - 3689, 2501, 3390, - 3689, 2502, 3390, - 3689, 2504, 3390, - 3688, 2506, 3390, - 3688, 2508, 3389, - 3687, 2511, 3388, - 3687, 2515, 3387, - 3686, 2521, 3386, - 3685, 2528, 3384, - 3683, 2537, 3382, - 3681, 2550, 3379, - 3678, 2566, 3374, - 3674, 2586, 3369, - 3669, 2613, 3361, - 3662, 2645, 3350, - 3652, 2686, 3335, - 3639, 2735, 3314, - 3620, 2793, 3285, - 3594, 2861, 3243, - 3556, 2938, 3180, - 3501, 3024, 3079, - 3415, 3119, 2896, - 3265, 3221, 2397, - 2931, 3329, 0, - 0, 3442, 0, - 0, 3560, 0, - 0, 3681, 0, - 3822, 2630, 3523, - 3822, 2630, 3523, - 3821, 2630, 3523, - 3821, 2631, 3523, - 3821, 2631, 3523, - 3821, 2632, 3522, - 3821, 2632, 3522, - 3821, 2633, 3522, - 3821, 2635, 3522, - 3821, 2637, 3521, - 3820, 2639, 3521, - 3820, 2642, 3520, - 3819, 2646, 3519, - 3818, 2652, 3518, - 3817, 2659, 3516, - 3815, 2668, 3514, - 3813, 2681, 3510, - 3810, 2697, 3506, - 3806, 2717, 3500, - 3801, 2744, 3492, - 3794, 2777, 3482, - 3784, 2817, 3467, - 3771, 2866, 3446, - 3752, 2925, 3417, - 3726, 2992, 3375, - 3689, 3070, 3312, - 3633, 3156, 3211, - 3547, 3251, 3027, - 3398, 3353, 2526, - 3064, 3461, 0, - 0, 3574, 0, - 0, 3692, 0, - 3954, 2761, 3655, - 3954, 2761, 3655, - 3954, 2761, 3655, - 3954, 2762, 3655, - 3954, 2762, 3655, - 3954, 2762, 3654, - 3953, 2763, 3654, - 3953, 2764, 3654, - 3953, 2765, 3654, - 3953, 2766, 3654, - 3953, 2768, 3653, - 3952, 2770, 3653, - 3952, 2773, 3652, - 3951, 2777, 3651, - 3950, 2783, 3650, - 3949, 2790, 3648, - 3947, 2800, 3645, - 3945, 2812, 3642, - 3942, 2828, 3638, - 3938, 2849, 3632, - 3933, 2875, 3624, - 3926, 2908, 3614, - 3916, 2949, 3599, - 3903, 2998, 3578, - 3884, 3056, 3549, - 3858, 3124, 3507, - 3821, 3202, 3444, - 3766, 3288, 3343, - 3679, 3383, 3158, - 3530, 3485, 2656, - 3196, 3593, 0, - 0, 3706, 0, - 4086, 2892, 3787, - 4086, 2893, 3787, - 4086, 2893, 3787, - 4086, 2893, 3787, - 4086, 2893, 3787, - 4086, 2893, 3786, - 4086, 2894, 3786, - 4086, 2894, 3786, - 4085, 2895, 3786, - 4085, 2896, 3786, - 4085, 2897, 3786, - 4085, 2899, 3785, - 4084, 2902, 3785, - 4084, 2905, 3784, - 4083, 2909, 3783, - 4082, 2914, 3782, - 4081, 2922, 3780, - 4080, 2931, 3777, - 4077, 2944, 3774, - 4075, 2960, 3770, - 4071, 2980, 3764, - 4065, 3007, 3756, - 4058, 3040, 3745, - 4048, 3080, 3731, - 4035, 3130, 3710, - 4016, 3188, 3681, - 3990, 3256, 3639, - 3953, 3333, 3575, - 3898, 3420, 3474, - 3811, 3515, 3290, - 3662, 3617, 2787, - 3328, 3725, 0, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3024, 3919, - 4095, 3025, 3919, - 4095, 3025, 3918, - 4095, 3025, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3918, - 4095, 3029, 3918, - 4095, 3031, 3917, - 4095, 3033, 3917, - 4095, 3036, 3916, - 4095, 3040, 3915, - 4095, 3046, 3914, - 4095, 3053, 3912, - 4095, 3063, 3909, - 4095, 3075, 3906, - 4095, 3091, 3902, - 4095, 3112, 3896, - 4095, 3138, 3888, - 4095, 3171, 3877, - 4095, 3212, 3863, - 4095, 3261, 3842, - 4095, 3320, 3813, - 4095, 3388, 3771, - 4085, 3465, 3707, - 4030, 3552, 3606, - 3943, 3647, 3422, - 3794, 3749, 2918, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3157, 4050, - 4095, 3157, 4050, - 4095, 3158, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3161, 4050, - 4095, 3163, 4049, - 4095, 3165, 4049, - 4095, 3168, 4048, - 4095, 3172, 4047, - 4095, 3178, 4046, - 4095, 3185, 4044, - 4095, 3195, 4041, - 4095, 3207, 4038, - 4095, 3223, 4034, - 4095, 3244, 4028, - 4095, 3270, 4020, - 4095, 3303, 4009, - 4095, 3344, 3995, - 4095, 3393, 3974, - 4095, 3452, 3945, - 4095, 3520, 3903, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3779, 3553, - 0, 606, 834, - 0, 621, 819, - 0, 640, 798, - 0, 664, 769, - 0, 695, 726, - 0, 733, 662, - 0, 779, 559, - 0, 834, 370, - 0, 899, 0, - 0, 973, 0, - 0, 1057, 0, - 0, 1149, 0, - 0, 1248, 0, - 0, 1355, 0, - 0, 1466, 0, - 0, 1583, 0, - 0, 1702, 0, - 0, 1825, 0, - 0, 1950, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3250, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 611, 856, - 0, 626, 842, - 0, 645, 822, - 0, 669, 794, - 0, 699, 753, - 0, 737, 693, - 0, 782, 598, - 0, 837, 427, - 0, 902, 2, - 0, 976, 0, - 0, 1059, 0, - 0, 1150, 0, - 0, 1250, 0, - 0, 1356, 0, - 0, 1467, 0, - 0, 1583, 0, - 0, 1703, 0, - 0, 1825, 0, - 0, 1950, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 618, 883, - 0, 632, 870, - 0, 651, 851, - 0, 675, 825, - 0, 705, 788, - 0, 742, 732, - 0, 787, 645, - 0, 841, 495, - 0, 905, 157, - 0, 979, 0, - 0, 1061, 0, - 0, 1152, 0, - 0, 1251, 0, - 0, 1357, 0, - 0, 1468, 0, - 0, 1584, 0, - 0, 1703, 0, - 0, 1826, 0, - 0, 1951, 0, - 0, 2077, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 627, 918, - 0, 641, 905, - 0, 659, 888, - 0, 682, 864, - 0, 712, 829, - 0, 748, 779, - 0, 793, 702, - 0, 847, 572, - 0, 910, 306, - 0, 983, 0, - 0, 1064, 0, - 0, 1155, 0, - 0, 1253, 0, - 0, 1359, 0, - 0, 1469, 0, - 0, 1585, 0, - 0, 1704, 0, - 0, 1827, 0, - 0, 1951, 0, - 0, 2078, 0, - 0, 2205, 0, - 0, 2334, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 271, 638, 960, - 198, 652, 948, - 78, 670, 933, - 0, 693, 911, - 0, 721, 880, - 0, 757, 835, - 0, 801, 768, - 0, 854, 657, - 0, 916, 450, - 0, 988, 0, - 0, 1069, 0, - 0, 1159, 0, - 0, 1256, 0, - 0, 1361, 0, - 0, 1471, 0, - 0, 1586, 0, - 0, 1705, 0, - 0, 1827, 0, - 0, 1952, 0, - 0, 2078, 0, - 0, 2206, 0, - 0, 2335, 0, - 0, 2464, 0, - 0, 2594, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2987, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 595, 653, 1011, - 561, 667, 1000, - 511, 684, 986, - 434, 706, 967, - 305, 734, 940, - 43, 769, 901, - 0, 812, 843, - 0, 863, 752, - 0, 924, 591, - 0, 995, 210, - 0, 1075, 0, - 0, 1164, 0, - 0, 1260, 0, - 0, 1364, 0, - 0, 1474, 0, - 0, 1588, 0, - 0, 1707, 0, - 0, 1829, 0, - 0, 1953, 0, - 0, 2079, 0, - 0, 2206, 0, - 0, 2335, 0, - 0, 2464, 0, - 0, 2595, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 832, 672, 1071, - 812, 685, 1062, - 784, 702, 1050, - 743, 723, 1033, - 682, 750, 1010, - 586, 784, 976, - 413, 825, 928, - 0, 875, 853, - 0, 935, 729, - 0, 1004, 483, - 0, 1082, 0, - 0, 1170, 0, - 0, 1265, 0, - 0, 1368, 0, - 0, 1477, 0, - 0, 1591, 0, - 0, 1709, 0, - 0, 1830, 0, - 0, 1954, 0, - 0, 2080, 0, - 0, 2207, 0, - 0, 2335, 0, - 0, 2465, 0, - 0, 2595, 0, - 0, 2725, 0, - 0, 2856, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3382, 0, - 0, 3514, 0, - 0, 3646, 0, - 1029, 697, 1140, - 1016, 709, 1133, - 998, 725, 1122, - 973, 745, 1108, - 938, 771, 1089, - 885, 803, 1061, - 804, 843, 1021, - 666, 891, 961, - 375, 949, 866, - 0, 1016, 698, - 0, 1093, 282, - 0, 1178, 0, - 0, 1272, 0, - 0, 1374, 0, - 0, 1481, 0, - 0, 1594, 0, - 0, 1711, 0, - 0, 1832, 0, - 0, 1955, 0, - 0, 2081, 0, - 0, 2208, 0, - 0, 2336, 0, - 0, 2465, 0, - 0, 2595, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1204, 728, 1220, - 1195, 739, 1213, - 1183, 754, 1205, - 1167, 773, 1193, - 1144, 797, 1176, - 1111, 828, 1154, - 1064, 866, 1121, - 991, 912, 1074, - 872, 967, 1002, - 637, 1032, 883, - 0, 1106, 652, - 0, 1189, 0, - 0, 1281, 0, - 0, 1381, 0, - 0, 1487, 0, - 0, 1599, 0, - 0, 1715, 0, - 0, 1835, 0, - 0, 1957, 0, - 0, 2082, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1366, 766, 1308, - 1360, 777, 1302, - 1352, 790, 1295, - 1340, 808, 1286, - 1325, 830, 1272, - 1303, 859, 1254, - 1272, 894, 1228, - 1228, 938, 1191, - 1161, 990, 1137, - 1052, 1052, 1052, - 847, 1123, 905, - 195, 1203, 583, - 0, 1293, 0, - 0, 1390, 0, - 0, 1494, 0, - 0, 1604, 0, - 0, 1719, 0, - 0, 1838, 0, - 0, 1960, 0, - 0, 2084, 0, - 0, 2210, 0, - 0, 2338, 0, - 0, 2467, 0, - 0, 2596, 0, - 0, 2727, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 1519, 813, 1404, - 1515, 822, 1399, - 1509, 834, 1394, - 1501, 850, 1386, - 1490, 871, 1375, - 1475, 897, 1361, - 1454, 930, 1341, - 1425, 970, 1312, - 1383, 1019, 1271, - 1319, 1077, 1209, - 1216, 1145, 1110, - 1029, 1222, 933, - 509, 1308, 469, - 0, 1402, 0, - 0, 1504, 0, - 0, 1612, 0, - 0, 1725, 0, - 0, 1843, 0, - 0, 1963, 0, - 0, 2087, 0, - 0, 2213, 0, - 0, 2340, 0, - 0, 2468, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1666, 868, 1507, - 1663, 877, 1504, - 1659, 888, 1499, - 1653, 902, 1493, - 1645, 920, 1484, - 1635, 944, 1473, - 1620, 973, 1457, - 1600, 1010, 1435, - 1572, 1055, 1404, - 1531, 1109, 1359, - 1469, 1172, 1290, - 1372, 1245, 1179, - 1196, 1327, 967, - 741, 1418, 252, - 0, 1517, 0, - 0, 1622, 0, - 0, 1733, 0, - 0, 1849, 0, - 0, 1968, 0, - 0, 2091, 0, - 0, 2215, 0, - 0, 2342, 0, - 0, 2470, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1809, 933, 1616, - 1807, 941, 1613, - 1804, 950, 1610, - 1800, 963, 1605, - 1794, 979, 1599, - 1787, 999, 1590, - 1776, 1026, 1578, - 1762, 1059, 1561, - 1742, 1099, 1537, - 1715, 1148, 1504, - 1675, 1207, 1455, - 1615, 1275, 1381, - 1520, 1352, 1257, - 1352, 1439, 1010, - 936, 1533, 0, - 0, 1635, 0, - 0, 1743, 0, - 0, 1857, 0, - 0, 1974, 0, - 0, 2095, 0, - 0, 2219, 0, - 0, 2344, 0, - 0, 2472, 0, - 0, 2600, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1949, 1008, 1730, - 1948, 1014, 1728, - 1946, 1022, 1725, - 1943, 1033, 1722, - 1938, 1047, 1717, - 1933, 1065, 1710, - 1925, 1088, 1701, - 1915, 1116, 1688, - 1901, 1152, 1670, - 1882, 1196, 1646, - 1855, 1249, 1610, - 1815, 1312, 1559, - 1757, 1383, 1479, - 1664, 1465, 1344, - 1501, 1555, 1061, - 1110, 1652, 0, - 0, 1757, 0, - 0, 1867, 0, - 0, 1983, 0, - 0, 2102, 0, - 0, 2224, 0, - 0, 2348, 0, - 0, 2474, 0, - 0, 2602, 0, - 0, 2731, 0, - 0, 2860, 0, - 0, 2991, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2087, 1092, 1849, - 2086, 1097, 1847, - 2085, 1104, 1845, - 2082, 1113, 1842, - 2079, 1124, 1838, - 2075, 1140, 1833, - 2070, 1159, 1826, - 2062, 1184, 1816, - 2052, 1215, 1803, - 2039, 1254, 1785, - 2019, 1300, 1759, - 1992, 1357, 1722, - 1954, 1422, 1668, - 1896, 1497, 1584, - 1805, 1581, 1439, - 1646, 1674, 1121, - 1271, 1774, 0, - 0, 1881, 0, - 0, 1993, 0, - 0, 2110, 0, - 0, 2230, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2224, 1184, 1970, - 2223, 1189, 1969, - 2222, 1194, 1967, - 2220, 1201, 1965, - 2218, 1211, 1962, - 2215, 1224, 1958, - 2211, 1240, 1953, - 2206, 1261, 1945, - 2198, 1287, 1936, - 2188, 1320, 1922, - 2175, 1361, 1903, - 2156, 1410, 1877, - 2129, 1469, 1839, - 2090, 1537, 1782, - 2033, 1615, 1694, - 1944, 1702, 1541, - 1787, 1797, 1191, - 1424, 1899, 0, - 0, 2007, 0, - 0, 2121, 0, - 0, 2238, 0, - 0, 2359, 0, - 0, 2483, 0, - 0, 2608, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2359, 1284, 2094, - 2359, 1288, 2093, - 2358, 1292, 2092, - 2357, 1298, 2090, - 2355, 1306, 2088, - 2353, 1316, 2085, - 2350, 1329, 2081, - 2346, 1346, 2075, - 2340, 1368, 2068, - 2333, 1396, 2058, - 2323, 1431, 2044, - 2309, 1474, 2025, - 2291, 1525, 1998, - 2264, 1586, 1959, - 2226, 1656, 1901, - 2169, 1736, 1810, - 2080, 1825, 1649, - 1926, 1921, 1271, - 1571, 2025, 0, - 0, 2135, 0, - 0, 2249, 0, - 0, 2368, 0, - 0, 2489, 0, - 0, 2613, 0, - 0, 2739, 0, - 0, 2867, 0, - 0, 2995, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2494, 1391, 2220, - 2493, 1393, 2219, - 2493, 1397, 2218, - 2492, 1402, 2217, - 2491, 1408, 2215, - 2489, 1416, 2213, - 2487, 1427, 2210, - 2484, 1441, 2206, - 2480, 1459, 2200, - 2474, 1482, 2193, - 2467, 1511, 2183, - 2457, 1547, 2168, - 2444, 1591, 2149, - 2425, 1644, 2121, - 2398, 1706, 2082, - 2361, 1779, 2022, - 2304, 1860, 1929, - 2216, 1950, 1763, - 2063, 2048, 1359, - 1714, 2153, 0, - 0, 2263, 0, - 0, 2378, 0, - 0, 2498, 0, - 0, 2620, 0, - 0, 2744, 0, - 0, 2871, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 2628, 1503, 2347, - 2627, 1505, 2347, - 2627, 1508, 2346, - 2626, 1511, 2345, - 2625, 1516, 2344, - 2624, 1523, 2342, - 2622, 1531, 2340, - 2620, 1542, 2337, - 2617, 1557, 2333, - 2613, 1575, 2327, - 2608, 1599, 2319, - 2601, 1629, 2309, - 2591, 1666, 2295, - 2577, 1711, 2275, - 2559, 1766, 2247, - 2532, 1830, 2207, - 2495, 1903, 2146, - 2438, 1986, 2051, - 2351, 2077, 1881, - 2199, 2176, 1456, - 1853, 2281, 0, - 0, 2393, 0, - 0, 2509, 0, - 0, 2628, 0, - 0, 2751, 0, - 0, 2875, 0, - 0, 3002, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3650, 0, - 2761, 1619, 2476, - 2761, 1621, 2476, - 2760, 1623, 2475, - 2760, 1626, 2474, - 2759, 1630, 2473, - 2758, 1635, 2472, - 2757, 1641, 2470, - 2756, 1650, 2468, - 2753, 1661, 2465, - 2750, 1676, 2461, - 2747, 1695, 2455, - 2741, 1720, 2447, - 2734, 1750, 2437, - 2724, 1788, 2422, - 2711, 1835, 2402, - 2692, 1890, 2374, - 2666, 1955, 2333, - 2628, 2029, 2272, - 2572, 2113, 2176, - 2485, 2205, 2002, - 2333, 2305, 1559, - 1991, 2411, 0, - 0, 2523, 0, - 0, 2639, 0, - 0, 2759, 0, - 0, 2882, 0, - 0, 3007, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3520, 0, - 0, 3651, 0, - 2894, 1739, 2605, - 2894, 1740, 2605, - 2894, 1742, 2605, - 2893, 1744, 2604, - 2893, 1747, 2603, - 2892, 1751, 2602, - 2891, 1756, 2601, - 2890, 1763, 2599, - 2888, 1772, 2597, - 2886, 1784, 2594, - 2883, 1799, 2590, - 2879, 1818, 2584, - 2874, 1843, 2576, - 2867, 1874, 2566, - 2857, 1913, 2551, - 2844, 1960, 2531, - 2825, 2016, 2502, - 2799, 2082, 2461, - 2761, 2157, 2400, - 2705, 2241, 2302, - 2618, 2334, 2125, - 2468, 2434, 1668, - 2128, 2541, 0, - 0, 2653, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 3027, 1862, 2735, - 3027, 1863, 2735, - 3027, 1864, 2735, - 3026, 1866, 2735, - 3026, 1868, 2734, - 3026, 1871, 2733, - 3025, 1875, 2732, - 3024, 1880, 2731, - 3023, 1887, 2729, - 3021, 1896, 2727, - 3019, 1908, 2724, - 3016, 1924, 2720, - 3012, 1943, 2714, - 3007, 1969, 2706, - 3000, 2000, 2695, - 2990, 2039, 2681, - 2976, 2087, 2660, - 2958, 2144, 2632, - 2932, 2210, 2590, - 2894, 2286, 2528, - 2838, 2371, 2430, - 2752, 2464, 2251, - 2601, 2565, 1783, - 2263, 2672, 0, - 0, 2784, 0, - 0, 2901, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 3160, 1987, 2866, - 3160, 1988, 2866, - 3159, 1989, 2866, - 3159, 1990, 2865, - 3159, 1992, 2865, - 3159, 1994, 2864, - 3158, 1997, 2864, - 3157, 2001, 2863, - 3157, 2006, 2861, - 3155, 2013, 2860, - 3154, 2023, 2857, - 3152, 2035, 2854, - 3149, 2050, 2850, - 3145, 2070, 2844, - 3139, 2096, 2836, - 3132, 2128, 2826, - 3122, 2167, 2811, - 3109, 2215, 2791, - 3090, 2272, 2762, - 3064, 2339, 2720, - 3027, 2415, 2658, - 2971, 2501, 2558, - 2884, 2594, 2378, - 2734, 2696, 1901, - 2397, 2803, 0, - 0, 2916, 0, - 0, 3033, 0, - 0, 3153, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 3292, 2114, 2997, - 3292, 2114, 2997, - 3292, 2115, 2997, - 3292, 2116, 2997, - 3292, 2117, 2996, - 3291, 2119, 2996, - 3291, 2121, 2995, - 3291, 2124, 2995, - 3290, 2128, 2994, - 3289, 2134, 2992, - 3288, 2141, 2990, - 3286, 2150, 2988, - 3284, 2162, 2985, - 3281, 2178, 2981, - 3277, 2198, 2975, - 3272, 2224, 2967, - 3265, 2256, 2956, - 3255, 2296, 2942, - 3241, 2344, 2921, - 3223, 2402, 2892, - 3197, 2469, 2851, - 3159, 2546, 2788, - 3104, 2631, 2688, - 3017, 2725, 2507, - 2867, 2827, 2023, - 2531, 2934, 0, - 0, 3047, 0, - 0, 3164, 0, - 0, 3285, 0, - 0, 3408, 0, - 0, 3534, 0, - 0, 3661, 0, - 3425, 2242, 3128, - 3425, 2242, 3128, - 3425, 2243, 3128, - 3424, 2244, 3128, - 3424, 2245, 3128, - 3424, 2246, 3127, - 3424, 2248, 3127, - 3423, 2250, 3126, - 3423, 2253, 3126, - 3422, 2257, 3125, - 3421, 2262, 3123, - 3420, 2270, 3122, - 3418, 2279, 3119, - 3416, 2291, 3116, - 3413, 2307, 3112, - 3410, 2327, 3106, - 3404, 2353, 3098, - 3397, 2386, 3087, - 3387, 2426, 3073, - 3374, 2474, 3052, - 3355, 2532, 3023, - 3329, 2600, 2981, - 3292, 2676, 2919, - 3236, 2762, 2818, - 3150, 2856, 2636, - 3000, 2958, 2147, - 2665, 3066, 0, - 0, 3179, 0, - 0, 3296, 0, - 0, 3417, 0, - 0, 3540, 0, - 0, 3666, 0, - 3557, 2371, 3260, - 3557, 2371, 3260, - 3557, 2372, 3260, - 3557, 2372, 3259, - 3557, 2373, 3259, - 3557, 2374, 3259, - 3556, 2375, 3259, - 3556, 2377, 3258, - 3556, 2379, 3258, - 3555, 2382, 3257, - 3554, 2387, 3256, - 3554, 2392, 3255, - 3552, 2399, 3253, - 3551, 2409, 3251, - 3549, 2421, 3247, - 3546, 2437, 3243, - 3542, 2457, 3237, - 3537, 2483, 3230, - 3529, 2516, 3219, - 3520, 2556, 3204, - 3506, 2605, 3183, - 3488, 2663, 3154, - 3461, 2730, 3113, - 3424, 2807, 3050, - 3369, 2894, 2949, - 3282, 2988, 2766, - 3133, 3090, 2273, - 2798, 3197, 0, - 0, 3311, 0, - 0, 3428, 0, - 0, 3549, 0, - 0, 3672, 0, - 3689, 2501, 3391, - 3689, 2501, 3391, - 3689, 2501, 3391, - 3689, 2502, 3391, - 3689, 2502, 3391, - 3689, 2503, 3391, - 3689, 2504, 3391, - 3689, 2505, 3390, - 3688, 2507, 3390, - 3688, 2509, 3389, - 3687, 2513, 3389, - 3687, 2517, 3388, - 3686, 2522, 3386, - 3685, 2529, 3385, - 3683, 2539, 3382, - 3681, 2551, 3379, - 3678, 2567, 3375, - 3674, 2588, 3369, - 3669, 2614, 3361, - 3662, 2646, 3350, - 3652, 2687, 3336, - 3638, 2736, 3315, - 3620, 2794, 3286, - 3594, 2862, 3244, - 3556, 2939, 3181, - 3501, 3025, 3080, - 3414, 3119, 2897, - 3265, 3221, 2400, - 2931, 3329, 0, - 0, 3442, 0, - 0, 3560, 0, - 0, 3681, 0, - 3821, 2631, 3523, - 3821, 2631, 3523, - 3821, 2632, 3523, - 3821, 2632, 3523, - 3821, 2632, 3523, - 3821, 2633, 3523, - 3821, 2634, 3523, - 3821, 2635, 3522, - 3821, 2636, 3522, - 3820, 2638, 3522, - 3820, 2640, 3521, - 3820, 2643, 3520, - 3819, 2647, 3519, - 3818, 2653, 3518, - 3817, 2660, 3516, - 3815, 2669, 3514, - 3813, 2682, 3511, - 3810, 2698, 3506, - 3806, 2718, 3501, - 3801, 2745, 3493, - 3794, 2777, 3482, - 3784, 2818, 3467, - 3771, 2867, 3447, - 3752, 2925, 3418, - 3726, 2993, 3375, - 3689, 3070, 3312, - 3633, 3157, 3211, - 3547, 3251, 3028, - 3397, 3353, 2529, - 3063, 3461, 0, - 0, 3574, 0, - 0, 3692, 0, - 3954, 2762, 3655, - 3954, 2762, 3655, - 3954, 2762, 3655, - 3954, 2762, 3655, - 3954, 2763, 3655, - 3953, 2763, 3655, - 3953, 2764, 3655, - 3953, 2765, 3654, - 3953, 2766, 3654, - 3953, 2767, 3654, - 3953, 2769, 3653, - 3952, 2771, 3653, - 3952, 2774, 3652, - 3951, 2778, 3651, - 3950, 2784, 3650, - 3949, 2791, 3648, - 3947, 2800, 3646, - 3945, 2813, 3643, - 3942, 2829, 3638, - 3938, 2850, 3632, - 3933, 2876, 3625, - 3926, 2909, 3614, - 3916, 2949, 3599, - 3903, 2998, 3578, - 3884, 3057, 3549, - 3858, 3125, 3507, - 3821, 3202, 3444, - 3765, 3288, 3343, - 3679, 3383, 3159, - 3530, 3485, 2658, - 3196, 3593, 0, - 0, 3706, 0, - 4086, 2893, 3787, - 4086, 2893, 3787, - 4086, 2893, 3787, - 4086, 2893, 3787, - 4086, 2894, 3787, - 4086, 2894, 3787, - 4086, 2894, 3787, - 4086, 2895, 3786, - 4085, 2896, 3786, - 4085, 2897, 3786, - 4085, 2898, 3786, - 4085, 2900, 3785, - 4084, 2902, 3785, - 4084, 2905, 3784, - 4083, 2909, 3783, - 4082, 2915, 3782, - 4081, 2922, 3780, - 4080, 2932, 3778, - 4077, 2944, 3774, - 4074, 2960, 3770, - 4071, 2981, 3764, - 4065, 3007, 3756, - 4058, 3040, 3746, - 4048, 3081, 3731, - 4035, 3130, 3710, - 4016, 3188, 3681, - 3990, 3256, 3639, - 3953, 3334, 3576, - 3898, 3420, 3475, - 3811, 3515, 3290, - 3662, 3617, 2788, - 3328, 3725, 0, - 4095, 3024, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3026, 3918, - 4095, 3026, 3918, - 4095, 3027, 3918, - 4095, 3028, 3918, - 4095, 3030, 3918, - 4095, 3031, 3917, - 4095, 3034, 3917, - 4095, 3037, 3916, - 4095, 3041, 3915, - 4095, 3046, 3914, - 4095, 3054, 3912, - 4095, 3063, 3910, - 4095, 3076, 3906, - 4095, 3092, 3902, - 4095, 3113, 3896, - 4095, 3139, 3888, - 4095, 3172, 3878, - 4095, 3212, 3863, - 4095, 3262, 3842, - 4095, 3320, 3813, - 4095, 3388, 3771, - 4085, 3466, 3708, - 4030, 3552, 3606, - 3943, 3647, 3422, - 3794, 3749, 2919, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3156, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3158, 4050, - 4095, 3158, 4050, - 4095, 3159, 4050, - 4095, 3160, 4050, - 4095, 3161, 4050, - 4095, 3163, 4049, - 4095, 3165, 4049, - 4095, 3168, 4048, - 4095, 3173, 4047, - 4095, 3178, 4046, - 4095, 3185, 4044, - 4095, 3195, 4041, - 4095, 3207, 4038, - 4095, 3224, 4034, - 4095, 3244, 4028, - 4095, 3271, 4020, - 4095, 3304, 4009, - 4095, 3344, 3995, - 4095, 3393, 3974, - 4095, 3452, 3945, - 4095, 3520, 3903, - 4095, 3597, 3839, - 4095, 3684, 3738, - 4076, 3779, 3554, - 0, 723, 961, - 0, 734, 949, - 0, 749, 934, - 0, 769, 912, - 0, 793, 881, - 0, 824, 837, - 0, 862, 769, - 0, 908, 660, - 0, 964, 453, - 0, 1029, 0, - 0, 1104, 0, - 0, 1187, 0, - 0, 1280, 0, - 0, 1380, 0, - 0, 1486, 0, - 0, 1598, 0, - 0, 1714, 0, - 0, 1834, 0, - 0, 1957, 0, - 0, 2082, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 727, 977, - 0, 738, 966, - 0, 753, 951, - 0, 772, 930, - 0, 796, 901, - 0, 827, 858, - 0, 865, 794, - 0, 911, 691, - 0, 966, 502, - 0, 1031, 0, - 0, 1105, 0, - 0, 1189, 0, - 0, 1281, 0, - 0, 1380, 0, - 0, 1487, 0, - 0, 1598, 0, - 0, 1715, 0, - 0, 1835, 0, - 0, 1957, 0, - 0, 2082, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 732, 998, - 0, 743, 988, - 0, 758, 974, - 0, 777, 954, - 0, 801, 926, - 0, 831, 886, - 0, 869, 825, - 0, 915, 730, - 0, 969, 560, - 0, 1034, 134, - 0, 1108, 0, - 0, 1191, 0, - 0, 1282, 0, - 0, 1382, 0, - 0, 1488, 0, - 0, 1599, 0, - 0, 1715, 0, - 0, 1835, 0, - 0, 1958, 0, - 0, 2082, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 739, 1025, - 0, 750, 1015, - 0, 764, 1002, - 0, 783, 983, - 0, 807, 957, - 0, 837, 920, - 0, 874, 864, - 0, 919, 777, - 0, 973, 627, - 0, 1037, 289, - 0, 1111, 0, - 0, 1193, 0, - 0, 1284, 0, - 0, 1383, 0, - 0, 1489, 0, - 0, 1600, 0, - 0, 1716, 0, - 0, 1836, 0, - 0, 1958, 0, - 0, 2083, 0, - 0, 2209, 0, - 0, 2337, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 0, 748, 1059, - 0, 759, 1050, - 0, 773, 1037, - 0, 791, 1020, - 0, 815, 996, - 0, 844, 962, - 0, 880, 911, - 0, 925, 834, - 0, 979, 704, - 0, 1042, 438, - 0, 1115, 0, - 0, 1197, 0, - 0, 1287, 0, - 0, 1386, 0, - 0, 1491, 0, - 0, 1602, 0, - 0, 1717, 0, - 0, 1836, 0, - 0, 1959, 0, - 0, 2083, 0, - 0, 2210, 0, - 0, 2338, 0, - 0, 2466, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3119, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 450, 760, 1100, - 403, 770, 1092, - 330, 784, 1080, - 210, 802, 1065, - 0, 825, 1043, - 0, 853, 1012, - 0, 889, 967, - 0, 933, 900, - 0, 986, 790, - 0, 1048, 582, - 0, 1120, 0, - 0, 1201, 0, - 0, 1291, 0, - 0, 1388, 0, - 0, 1493, 0, - 0, 1603, 0, - 0, 1718, 0, - 0, 1837, 0, - 0, 1960, 0, - 0, 2084, 0, - 0, 2210, 0, - 0, 2338, 0, - 0, 2467, 0, - 0, 2596, 0, - 0, 2726, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 751, 775, 1150, - 727, 785, 1143, - 693, 799, 1132, - 643, 816, 1119, - 566, 838, 1099, - 437, 866, 1072, - 175, 901, 1033, - 0, 944, 975, - 0, 995, 884, - 0, 1056, 723, - 0, 1127, 342, - 0, 1207, 0, - 0, 1296, 0, - 0, 1392, 0, - 0, 1496, 0, - 0, 1606, 0, - 0, 1720, 0, - 0, 1839, 0, - 0, 1961, 0, - 0, 2085, 0, - 0, 2211, 0, - 0, 2338, 0, - 0, 2467, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2857, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3514, 0, - 0, 3646, 0, - 978, 795, 1209, - 964, 805, 1203, - 944, 817, 1194, - 916, 834, 1182, - 875, 855, 1165, - 814, 882, 1142, - 718, 916, 1108, - 545, 957, 1060, - 108, 1008, 985, - 0, 1067, 862, - 0, 1136, 615, - 0, 1215, 0, - 0, 1302, 0, - 0, 1397, 0, - 0, 1500, 0, - 0, 1609, 0, - 0, 1723, 0, - 0, 1841, 0, - 0, 1962, 0, - 0, 2086, 0, - 0, 2212, 0, - 0, 2339, 0, - 0, 2468, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2858, 0, - 0, 2988, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1170, 820, 1278, - 1161, 829, 1273, - 1148, 841, 1265, - 1130, 857, 1255, - 1105, 877, 1240, - 1070, 903, 1221, - 1017, 935, 1193, - 936, 975, 1153, - 798, 1023, 1093, - 507, 1081, 998, - 0, 1148, 830, - 0, 1225, 414, - 0, 1310, 0, - 0, 1404, 0, - 0, 1506, 0, - 0, 1613, 0, - 0, 1726, 0, - 0, 1843, 0, - 0, 1964, 0, - 0, 2087, 0, - 0, 2213, 0, - 0, 2340, 0, - 0, 2468, 0, - 0, 2597, 0, - 0, 2727, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1343, 851, 1356, - 1336, 860, 1352, - 1327, 871, 1345, - 1316, 886, 1337, - 1299, 905, 1325, - 1276, 929, 1308, - 1244, 960, 1286, - 1196, 998, 1253, - 1123, 1044, 1206, - 1004, 1099, 1134, - 769, 1164, 1015, - 0, 1238, 784, - 0, 1321, 0, - 0, 1413, 0, - 0, 1513, 0, - 0, 1619, 0, - 0, 1731, 0, - 0, 1847, 0, - 0, 1967, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 1502, 890, 1444, - 1498, 898, 1440, - 1492, 909, 1434, - 1484, 922, 1427, - 1472, 940, 1418, - 1457, 962, 1404, - 1435, 991, 1386, - 1405, 1026, 1360, - 1360, 1070, 1323, - 1293, 1122, 1269, - 1184, 1184, 1184, - 979, 1255, 1037, - 327, 1335, 715, - 0, 1425, 0, - 0, 1522, 0, - 0, 1626, 0, - 0, 1736, 0, - 0, 1851, 0, - 0, 1970, 0, - 0, 2092, 0, - 0, 2216, 0, - 0, 2343, 0, - 0, 2470, 0, - 0, 2599, 0, - 0, 2728, 0, - 0, 2859, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1654, 938, 1539, - 1651, 945, 1536, - 1647, 954, 1532, - 1641, 967, 1526, - 1633, 982, 1518, - 1622, 1003, 1507, - 1607, 1029, 1493, - 1586, 1062, 1473, - 1557, 1102, 1444, - 1515, 1151, 1403, - 1451, 1209, 1341, - 1349, 1277, 1243, - 1161, 1354, 1065, - 641, 1440, 601, - 0, 1534, 0, - 0, 1636, 0, - 0, 1744, 0, - 0, 1857, 0, - 0, 1975, 0, - 0, 2096, 0, - 0, 2219, 0, - 0, 2345, 0, - 0, 2472, 0, - 0, 2600, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1801, 994, 1642, - 1798, 1000, 1639, - 1795, 1009, 1636, - 1791, 1020, 1631, - 1785, 1034, 1625, - 1778, 1052, 1617, - 1767, 1076, 1605, - 1752, 1105, 1589, - 1732, 1142, 1567, - 1704, 1187, 1536, - 1663, 1241, 1491, - 1601, 1304, 1423, - 1504, 1377, 1311, - 1328, 1459, 1099, - 874, 1550, 384, - 0, 1649, 0, - 0, 1754, 0, - 0, 1865, 0, - 0, 1981, 0, - 0, 2100, 0, - 0, 2223, 0, - 0, 2347, 0, - 0, 2474, 0, - 0, 2602, 0, - 0, 2731, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1943, 1060, 1750, - 1941, 1066, 1748, - 1939, 1073, 1746, - 1936, 1082, 1742, - 1932, 1095, 1737, - 1926, 1111, 1731, - 1919, 1132, 1722, - 1908, 1158, 1710, - 1894, 1191, 1693, - 1874, 1231, 1670, - 1847, 1281, 1636, - 1807, 1339, 1587, - 1747, 1407, 1513, - 1652, 1484, 1389, - 1484, 1571, 1142, - 1068, 1665, 0, - 0, 1767, 0, - 0, 1876, 0, - 0, 1989, 0, - 0, 2106, 0, - 0, 2227, 0, - 0, 2351, 0, - 0, 2477, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 2083, 1136, 1864, - 2082, 1140, 1862, - 2080, 1146, 1860, - 2078, 1155, 1858, - 2075, 1165, 1854, - 2071, 1179, 1849, - 2065, 1197, 1842, - 2058, 1220, 1833, - 2047, 1249, 1820, - 2033, 1284, 1802, - 2014, 1328, 1778, - 1987, 1381, 1743, - 1947, 1444, 1691, - 1889, 1516, 1611, - 1796, 1597, 1476, - 1633, 1687, 1193, - 1242, 1784, 0, - 0, 1889, 0, - 0, 1999, 0, - 0, 2115, 0, - 0, 2234, 0, - 0, 2356, 0, - 0, 2480, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2863, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3647, 0, - 2221, 1220, 1982, - 2220, 1224, 1981, - 2218, 1229, 1979, - 2217, 1236, 1977, - 2214, 1245, 1974, - 2211, 1257, 1970, - 2207, 1272, 1965, - 2202, 1291, 1958, - 2195, 1316, 1948, - 2185, 1347, 1935, - 2171, 1386, 1917, - 2151, 1433, 1891, - 2124, 1489, 1854, - 2086, 1554, 1800, - 2028, 1629, 1716, - 1937, 1713, 1571, - 1778, 1806, 1253, - 1403, 1906, 0, - 0, 2013, 0, - 0, 2125, 0, - 0, 2242, 0, - 0, 2362, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2357, 1313, 2103, - 2356, 1316, 2102, - 2355, 1321, 2101, - 2354, 1326, 2099, - 2352, 1334, 2097, - 2350, 1343, 2094, - 2347, 1356, 2090, - 2343, 1372, 2085, - 2338, 1393, 2078, - 2330, 1419, 2068, - 2320, 1452, 2054, - 2307, 1493, 2035, - 2288, 1543, 2009, - 2261, 1601, 1971, - 2222, 1669, 1915, - 2165, 1747, 1826, - 2076, 1834, 1673, - 1919, 1929, 1323, - 1556, 2031, 0, - 0, 2139, 0, - 0, 2253, 0, - 0, 2370, 0, - 0, 2491, 0, - 0, 2615, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2996, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2492, 1414, 2227, - 2491, 1416, 2226, - 2491, 1420, 2225, - 2490, 1424, 2224, - 2489, 1430, 2222, - 2487, 1438, 2220, - 2485, 1448, 2217, - 2482, 1461, 2213, - 2478, 1479, 2208, - 2472, 1501, 2200, - 2465, 1528, 2190, - 2455, 1563, 2176, - 2442, 1606, 2157, - 2423, 1657, 2130, - 2396, 1718, 2091, - 2358, 1788, 2033, - 2301, 1868, 1942, - 2213, 1957, 1782, - 2058, 2053, 1403, - 1703, 2157, 0, - 0, 2267, 0, - 0, 2381, 0, - 0, 2500, 0, - 0, 2621, 0, - 0, 2745, 0, - 0, 2871, 0, - 0, 2999, 0, - 0, 3128, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 2626, 1521, 2353, - 2626, 1523, 2352, - 2625, 1526, 2351, - 2625, 1529, 2350, - 2624, 1534, 2349, - 2623, 1540, 2347, - 2621, 1548, 2345, - 2619, 1559, 2342, - 2616, 1573, 2338, - 2612, 1591, 2332, - 2607, 1614, 2325, - 2599, 1643, 2315, - 2589, 1679, 2301, - 2576, 1723, 2281, - 2557, 1776, 2253, - 2531, 1839, 2214, - 2493, 1911, 2154, - 2436, 1992, 2061, - 2348, 2082, 1895, - 2195, 2180, 1491, - 1846, 2285, 0, - 0, 2395, 0, - 0, 2511, 0, - 0, 2630, 0, - 0, 2752, 0, - 0, 2876, 0, - 0, 3003, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 2760, 1633, 2480, - 2760, 1635, 2479, - 2759, 1637, 2479, - 2759, 1640, 2478, - 2758, 1643, 2477, - 2757, 1648, 2476, - 2756, 1655, 2474, - 2755, 1663, 2472, - 2752, 1674, 2469, - 2749, 1689, 2465, - 2745, 1707, 2459, - 2740, 1731, 2451, - 2733, 1761, 2441, - 2723, 1798, 2427, - 2710, 1843, 2407, - 2691, 1898, 2379, - 2664, 1962, 2339, - 2627, 2035, 2278, - 2571, 2118, 2183, - 2483, 2209, 2013, - 2331, 2308, 1588, - 1986, 2414, 0, - 0, 2525, 0, - 0, 2641, 0, - 0, 2760, 0, - 0, 2883, 0, - 0, 3007, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 2893, 1750, 2608, - 2893, 1751, 2608, - 2893, 1753, 2608, - 2893, 1755, 2607, - 2892, 1758, 2606, - 2891, 1762, 2605, - 2891, 1767, 2604, - 2889, 1773, 2602, - 2888, 1782, 2600, - 2886, 1793, 2597, - 2883, 1808, 2593, - 2879, 1827, 2587, - 2873, 1852, 2579, - 2866, 1882, 2569, - 2856, 1920, 2554, - 2843, 1967, 2534, - 2824, 2022, 2506, - 2798, 2087, 2465, - 2760, 2161, 2404, - 2704, 2245, 2308, - 2617, 2337, 2134, - 2465, 2437, 1691, - 2123, 2543, 0, - 0, 2655, 0, - 0, 2771, 0, - 0, 2891, 0, - 0, 3014, 0, - 0, 3139, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3652, 0, - 3026, 1870, 2738, - 3026, 1871, 2737, - 3026, 1873, 2737, - 3026, 1874, 2737, - 3025, 1876, 2736, - 3025, 1879, 2735, - 3024, 1883, 2735, - 3023, 1888, 2733, - 3022, 1895, 2732, - 3021, 1904, 2729, - 3018, 1916, 2726, - 3015, 1931, 2722, - 3012, 1950, 2716, - 3006, 1975, 2708, - 2999, 2006, 2698, - 2989, 2045, 2683, - 2976, 2092, 2663, - 2957, 2148, 2635, - 2931, 2214, 2593, - 2893, 2289, 2532, - 2838, 2373, 2434, - 2750, 2466, 2258, - 2600, 2567, 1800, - 2260, 2673, 0, - 0, 2786, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 3159, 1993, 2868, - 3159, 1994, 2868, - 3159, 1995, 2867, - 3159, 1996, 2867, - 3159, 1998, 2867, - 3158, 2000, 2866, - 3158, 2003, 2865, - 3157, 2007, 2864, - 3156, 2012, 2863, - 3155, 2019, 2861, - 3153, 2028, 2859, - 3151, 2040, 2856, - 3148, 2056, 2852, - 3144, 2075, 2846, - 3139, 2101, 2838, - 3132, 2132, 2827, - 3122, 2172, 2813, - 3109, 2219, 2793, - 3090, 2276, 2764, - 3064, 2342, 2723, - 3026, 2418, 2661, - 2971, 2503, 2562, - 2884, 2596, 2383, - 2733, 2697, 1915, - 2395, 2804, 0, - 0, 2917, 0, - 0, 3033, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 3292, 2119, 2998, - 3292, 2119, 2998, - 3292, 2120, 2998, - 3292, 2121, 2998, - 3291, 2122, 2997, - 3291, 2124, 2997, - 3291, 2126, 2997, - 3290, 2129, 2996, - 3290, 2133, 2995, - 3289, 2138, 2994, - 3287, 2145, 2992, - 3286, 2155, 2989, - 3284, 2167, 2986, - 3281, 2182, 2982, - 3277, 2202, 2976, - 3272, 2228, 2968, - 3264, 2260, 2958, - 3255, 2299, 2943, - 3241, 2347, 2923, - 3222, 2405, 2894, - 3196, 2471, 2852, - 3159, 2548, 2790, - 3103, 2633, 2691, - 3017, 2727, 2510, - 2866, 2828, 2033, - 2530, 2935, 0, - 0, 3048, 0, - 0, 3165, 0, - 0, 3285, 0, - 0, 3409, 0, - 0, 3534, 0, - 0, 3661, 0, - 3424, 2246, 3129, - 3424, 2246, 3129, - 3424, 2246, 3129, - 3424, 2247, 3129, - 3424, 2248, 3129, - 3424, 2249, 3128, - 3424, 2251, 3128, - 3423, 2253, 3127, - 3423, 2257, 3127, - 3422, 2261, 3126, - 3421, 2266, 3124, - 3420, 2273, 3123, - 3418, 2282, 3120, - 3416, 2294, 3117, - 3413, 2310, 3113, - 3409, 2330, 3107, - 3404, 2356, 3099, - 3397, 2388, 3088, - 3387, 2428, 3074, - 3374, 2477, 3053, - 3355, 2534, 3024, - 3329, 2601, 2983, - 3291, 2678, 2920, - 3236, 2763, 2820, - 3149, 2857, 2639, - 2999, 2959, 2155, - 2663, 3066, 0, - 0, 3179, 0, - 0, 3297, 0, - 0, 3417, 0, - 0, 3540, 0, - 0, 3666, 0, - 3557, 2374, 3260, - 3557, 2374, 3260, - 3557, 2374, 3260, - 3557, 2375, 3260, - 3556, 2376, 3260, - 3556, 2377, 3260, - 3556, 2378, 3259, - 3556, 2380, 3259, - 3555, 2382, 3259, - 3555, 2385, 3258, - 3554, 2389, 3257, - 3553, 2395, 3255, - 3552, 2402, 3254, - 3551, 2411, 3251, - 3548, 2423, 3248, - 3546, 2439, 3244, - 3542, 2459, 3238, - 3536, 2485, 3230, - 3529, 2518, 3220, - 3519, 2558, 3205, - 3506, 2607, 3184, - 3487, 2664, 3155, - 3461, 2732, 3114, - 3424, 2808, 3051, - 3368, 2894, 2950, - 3282, 2989, 2768, - 3132, 3090, 2279, - 2797, 3198, 0, - 0, 3311, 0, - 0, 3428, 0, - 0, 3549, 0, - 0, 3672, 0, - 3689, 2503, 3392, - 3689, 2503, 3392, - 3689, 2503, 3392, - 3689, 2504, 3392, - 3689, 2504, 3392, - 3689, 2505, 3391, - 3689, 2506, 3391, - 3688, 2507, 3391, - 3688, 2509, 3390, - 3688, 2511, 3390, - 3687, 2515, 3389, - 3687, 2519, 3388, - 3686, 2524, 3387, - 3684, 2531, 3385, - 3683, 2541, 3383, - 3681, 2553, 3380, - 3678, 2569, 3375, - 3674, 2589, 3369, - 3669, 2615, 3362, - 3661, 2648, 3351, - 3652, 2688, 3336, - 3638, 2737, 3316, - 3620, 2795, 3287, - 3594, 2863, 3245, - 3556, 2940, 3182, - 3501, 3026, 3081, - 3414, 3120, 2898, - 3265, 3222, 2405, - 2930, 3330, 0, - 0, 3443, 0, - 0, 3560, 0, - 0, 3681, 0, - 3821, 2633, 3524, - 3821, 2633, 3523, - 3821, 2633, 3523, - 3821, 2633, 3523, - 3821, 2634, 3523, - 3821, 2634, 3523, - 3821, 2635, 3523, - 3821, 2636, 3523, - 3821, 2637, 3522, - 3820, 2639, 3522, - 3820, 2642, 3521, - 3819, 2645, 3521, - 3819, 2649, 3520, - 3818, 2654, 3518, - 3817, 2661, 3517, - 3815, 2671, 3514, - 3813, 2683, 3511, - 3810, 2699, 3507, - 3806, 2720, 3501, - 3801, 2746, 3493, - 3794, 2779, 3482, - 3784, 2819, 3468, - 3770, 2868, 3447, - 3752, 2926, 3418, - 3726, 2994, 3376, - 3688, 3071, 3313, - 3633, 3157, 3212, - 3547, 3252, 3029, - 3397, 3353, 2532, - 3063, 3461, 0, - 0, 3575, 0, - 0, 3692, 0, - 3954, 2763, 3655, - 3954, 2763, 3655, - 3954, 2763, 3655, - 3954, 2764, 3655, - 3953, 2764, 3655, - 3953, 2764, 3655, - 3953, 2765, 3655, - 3953, 2766, 3655, - 3953, 2767, 3654, - 3953, 2768, 3654, - 3953, 2770, 3654, - 3952, 2772, 3653, - 3952, 2775, 3652, - 3951, 2779, 3651, - 3950, 2785, 3650, - 3949, 2792, 3648, - 3947, 2802, 3646, - 3945, 2814, 3643, - 3942, 2830, 3639, - 3938, 2851, 3633, - 3933, 2877, 3625, - 3926, 2910, 3614, - 3916, 2950, 3599, - 3903, 2999, 3579, - 3884, 3057, 3550, - 3858, 3125, 3508, - 3821, 3202, 3444, - 3765, 3289, 3344, - 3679, 3383, 3160, - 3529, 3485, 2661, - 3195, 3593, 0, - 0, 3706, 0, - 4086, 2894, 3787, - 4086, 2894, 3787, - 4086, 2894, 3787, - 4086, 2894, 3787, - 4086, 2895, 3787, - 4086, 2895, 3787, - 4086, 2895, 3787, - 4085, 2896, 3787, - 4085, 2897, 3786, - 4085, 2898, 3786, - 4085, 2899, 3786, - 4085, 2901, 3786, - 4084, 2903, 3785, - 4084, 2906, 3784, - 4083, 2910, 3783, - 4082, 2916, 3782, - 4081, 2923, 3780, - 4079, 2933, 3778, - 4077, 2945, 3775, - 4074, 2961, 3770, - 4071, 2982, 3765, - 4065, 3008, 3757, - 4058, 3041, 3746, - 4048, 3081, 3731, - 4035, 3130, 3710, - 4016, 3189, 3681, - 3990, 3257, 3639, - 3953, 3334, 3576, - 3898, 3420, 3475, - 3811, 3515, 3291, - 3662, 3617, 2790, - 3328, 3725, 0, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3025, 3919, - 4095, 3026, 3919, - 4095, 3026, 3919, - 4095, 3026, 3919, - 4095, 3027, 3919, - 4095, 3027, 3919, - 4095, 3028, 3918, - 4095, 3029, 3918, - 4095, 3030, 3918, - 4095, 3032, 3917, - 4095, 3034, 3917, - 4095, 3037, 3916, - 4095, 3042, 3915, - 4095, 3047, 3914, - 4095, 3054, 3912, - 4095, 3064, 3910, - 4095, 3076, 3906, - 4095, 3092, 3902, - 4095, 3113, 3896, - 4095, 3139, 3888, - 4095, 3172, 3878, - 4095, 3213, 3863, - 4095, 3262, 3842, - 4095, 3320, 3813, - 4095, 3388, 3771, - 4085, 3466, 3708, - 4030, 3552, 3607, - 3943, 3647, 3422, - 3794, 3749, 2920, - 4095, 3156, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3159, 4050, - 4095, 3159, 4050, - 4095, 3160, 4050, - 4095, 3162, 4050, - 4095, 3163, 4049, - 4095, 3166, 4049, - 4095, 3169, 4048, - 4095, 3173, 4047, - 4095, 3179, 4046, - 4095, 3186, 4044, - 4095, 3195, 4042, - 4095, 3208, 4038, - 4095, 3224, 4034, - 4095, 3245, 4028, - 4095, 3271, 4020, - 4095, 3304, 4010, - 4095, 3345, 3995, - 4095, 3394, 3974, - 4095, 3452, 3945, - 4095, 3520, 3903, - 4095, 3598, 3840, - 4095, 3684, 3738, - 4075, 3779, 3554, - 0, 843, 1089, - 0, 852, 1080, - 0, 864, 1068, - 0, 879, 1052, - 0, 898, 1030, - 0, 923, 998, - 0, 954, 952, - 0, 992, 882, - 0, 1039, 767, - 0, 1094, 545, - 0, 1160, 0, - 0, 1234, 0, - 0, 1318, 0, - 0, 1411, 0, - 0, 1511, 0, - 0, 1617, 0, - 0, 1729, 0, - 0, 1846, 0, - 0, 1966, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 0, 846, 1101, - 0, 855, 1093, - 0, 867, 1082, - 0, 881, 1066, - 0, 901, 1044, - 0, 925, 1013, - 0, 956, 969, - 0, 994, 901, - 0, 1041, 792, - 0, 1096, 585, - 0, 1161, 0, - 0, 1236, 0, - 0, 1319, 0, - 0, 1412, 0, - 0, 1512, 0, - 0, 1618, 0, - 0, 1730, 0, - 0, 1846, 0, - 0, 1966, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 0, 850, 1117, - 0, 859, 1109, - 0, 870, 1098, - 0, 885, 1083, - 0, 904, 1063, - 0, 928, 1033, - 0, 959, 990, - 0, 997, 926, - 0, 1043, 823, - 0, 1098, 634, - 0, 1163, 101, - 0, 1237, 0, - 0, 1321, 0, - 0, 1413, 0, - 0, 1513, 0, - 0, 1619, 0, - 0, 1730, 0, - 0, 1847, 0, - 0, 1967, 0, - 0, 2089, 0, - 0, 2214, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 0, 856, 1138, - 0, 864, 1130, - 0, 875, 1120, - 0, 890, 1106, - 0, 909, 1086, - 0, 933, 1058, - 0, 963, 1018, - 0, 1001, 957, - 0, 1047, 862, - 0, 1101, 692, - 0, 1166, 266, - 0, 1240, 0, - 0, 1323, 0, - 0, 1414, 0, - 0, 1514, 0, - 0, 1620, 0, - 0, 1731, 0, - 0, 1847, 0, - 0, 1967, 0, - 0, 2090, 0, - 0, 2215, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3251, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 0, 863, 1164, - 0, 871, 1157, - 0, 882, 1147, - 0, 897, 1134, - 0, 915, 1115, - 0, 939, 1089, - 0, 969, 1052, - 0, 1006, 996, - 0, 1051, 909, - 0, 1106, 759, - 0, 1169, 421, - 0, 1243, 0, - 0, 1325, 0, - 0, 1417, 0, - 0, 1515, 0, - 0, 1621, 0, - 0, 1732, 0, - 0, 1848, 0, - 0, 1968, 0, - 0, 2090, 0, - 0, 2215, 0, - 0, 2341, 0, - 0, 2469, 0, - 0, 2598, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3646, 0, - 133, 872, 1198, - 32, 880, 1191, - 0, 891, 1182, - 0, 905, 1169, - 0, 923, 1152, - 0, 947, 1128, - 0, 976, 1094, - 0, 1013, 1043, - 0, 1057, 966, - 0, 1111, 836, - 0, 1174, 570, - 0, 1247, 0, - 0, 1329, 0, - 0, 1419, 0, - 0, 1518, 0, - 0, 1623, 0, - 0, 1734, 0, - 0, 1849, 0, - 0, 1968, 0, - 0, 2091, 0, - 0, 2215, 0, - 0, 2342, 0, - 0, 2470, 0, - 0, 2599, 0, - 0, 2728, 0, - 0, 2858, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 615, 884, 1238, - 582, 892, 1232, - 535, 902, 1224, - 462, 916, 1213, - 342, 934, 1197, - 107, 957, 1175, - 0, 986, 1144, - 0, 1021, 1100, - 0, 1065, 1032, - 0, 1118, 922, - 0, 1180, 714, - 0, 1252, 39, - 0, 1333, 0, - 0, 1423, 0, - 0, 1521, 0, - 0, 1625, 0, - 0, 1735, 0, - 0, 1851, 0, - 0, 1970, 0, - 0, 2092, 0, - 0, 2216, 0, - 0, 2342, 0, - 0, 2470, 0, - 0, 2599, 0, - 0, 2728, 0, - 0, 2859, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 901, 899, 1288, - 883, 907, 1282, - 859, 917, 1275, - 825, 931, 1265, - 775, 948, 1251, - 698, 970, 1231, - 569, 998, 1204, - 307, 1033, 1165, - 0, 1076, 1107, - 0, 1127, 1016, - 0, 1188, 855, - 0, 1259, 474, - 0, 1339, 0, - 0, 1428, 0, - 0, 1524, 0, - 0, 1628, 0, - 0, 1738, 0, - 0, 1852, 0, - 0, 1971, 0, - 0, 2093, 0, - 0, 2217, 0, - 0, 2343, 0, - 0, 2470, 0, - 0, 2599, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2989, 0, - 0, 3120, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1121, 919, 1346, - 1110, 927, 1341, - 1096, 937, 1335, - 1076, 949, 1326, - 1048, 966, 1314, - 1007, 987, 1297, - 947, 1014, 1274, - 850, 1048, 1241, - 677, 1089, 1192, - 240, 1140, 1117, - 0, 1199, 994, - 0, 1268, 747, - 0, 1347, 0, - 0, 1434, 0, - 0, 1530, 0, - 0, 1632, 0, - 0, 1741, 0, - 0, 1855, 0, - 0, 1973, 0, - 0, 2094, 0, - 0, 2218, 0, - 0, 2344, 0, - 0, 2471, 0, - 0, 2600, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1309, 945, 1414, - 1302, 952, 1410, - 1293, 961, 1405, - 1280, 973, 1397, - 1262, 989, 1387, - 1237, 1009, 1372, - 1202, 1035, 1353, - 1149, 1067, 1325, - 1068, 1107, 1285, - 930, 1156, 1225, - 639, 1213, 1130, - 0, 1280, 962, - 0, 1357, 546, - 0, 1442, 0, - 0, 1536, 0, - 0, 1638, 0, - 0, 1745, 0, - 0, 1858, 0, - 0, 1976, 0, - 0, 2096, 0, - 0, 2220, 0, - 0, 2345, 0, - 0, 2472, 0, - 0, 2600, 0, - 0, 2729, 0, - 0, 2859, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 1479, 977, 1492, - 1475, 983, 1488, - 1468, 992, 1484, - 1460, 1003, 1477, - 1448, 1018, 1469, - 1431, 1037, 1457, - 1408, 1061, 1441, - 1376, 1092, 1418, - 1328, 1130, 1385, - 1255, 1176, 1338, - 1136, 1231, 1266, - 901, 1296, 1148, - 0, 1370, 916, - 0, 1453, 0, - 0, 1545, 0, - 0, 1645, 0, - 0, 1751, 0, - 0, 1863, 0, - 0, 1979, 0, - 0, 2099, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1638, 1016, 1579, - 1635, 1022, 1576, - 1630, 1030, 1572, - 1624, 1041, 1567, - 1616, 1054, 1559, - 1604, 1072, 1550, - 1589, 1094, 1537, - 1567, 1123, 1518, - 1537, 1158, 1492, - 1492, 1202, 1455, - 1425, 1254, 1401, - 1316, 1316, 1316, - 1111, 1387, 1169, - 459, 1468, 847, - 0, 1557, 0, - 0, 1654, 0, - 0, 1758, 0, - 0, 1869, 0, - 0, 1983, 0, - 0, 2102, 0, - 0, 2224, 0, - 0, 2348, 0, - 0, 2475, 0, - 0, 2602, 0, - 0, 2731, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1789, 1064, 1673, - 1786, 1070, 1671, - 1783, 1077, 1668, - 1779, 1086, 1664, - 1773, 1099, 1658, - 1765, 1115, 1650, - 1754, 1135, 1640, - 1739, 1161, 1625, - 1719, 1194, 1605, - 1689, 1234, 1576, - 1647, 1283, 1535, - 1583, 1341, 1473, - 1481, 1409, 1375, - 1293, 1486, 1197, - 773, 1572, 733, - 0, 1667, 0, - 0, 1768, 0, - 0, 1876, 0, - 0, 1989, 0, - 0, 2107, 0, - 0, 2228, 0, - 0, 2351, 0, - 0, 2477, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1934, 1121, 1775, - 1933, 1126, 1774, - 1930, 1133, 1771, - 1927, 1141, 1768, - 1923, 1152, 1763, - 1917, 1166, 1757, - 1910, 1184, 1749, - 1899, 1208, 1737, - 1885, 1237, 1721, - 1864, 1274, 1700, - 1836, 1319, 1668, - 1795, 1373, 1623, - 1734, 1436, 1555, - 1636, 1509, 1443, - 1460, 1592, 1231, - 1006, 1682, 516, - 0, 1781, 0, - 0, 1886, 0, - 0, 1997, 0, - 0, 2113, 0, - 0, 2232, 0, - 0, 2355, 0, - 0, 2479, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2863, 0, - 0, 2992, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 2076, 1188, 1884, - 2075, 1192, 1882, - 2074, 1198, 1880, - 2071, 1205, 1878, - 2068, 1214, 1874, - 2064, 1227, 1869, - 2058, 1243, 1863, - 2051, 1264, 1854, - 2041, 1290, 1842, - 2026, 1323, 1825, - 2007, 1363, 1802, - 1979, 1413, 1768, - 1939, 1471, 1720, - 1879, 1539, 1645, - 1784, 1616, 1521, - 1616, 1703, 1274, - 1200, 1798, 0, - 0, 1899, 0, - 0, 2008, 0, - 0, 2121, 0, - 0, 2239, 0, - 0, 2359, 0, - 0, 2483, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2216, 1264, 1997, - 2215, 1268, 1996, - 2214, 1272, 1995, - 2212, 1279, 1992, - 2210, 1287, 1990, - 2207, 1297, 1986, - 2203, 1311, 1981, - 2197, 1329, 1974, - 2190, 1352, 1965, - 2179, 1381, 1952, - 2165, 1417, 1935, - 2146, 1461, 1910, - 2119, 1513, 1875, - 2079, 1576, 1823, - 2021, 1648, 1743, - 1928, 1729, 1608, - 1765, 1819, 1325, - 1374, 1916, 0, - 0, 2021, 0, - 0, 2132, 0, - 0, 2247, 0, - 0, 2366, 0, - 0, 2488, 0, - 0, 2612, 0, - 0, 2739, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2353, 1349, 2115, - 2353, 1352, 2114, - 2352, 1356, 2113, - 2350, 1361, 2111, - 2349, 1368, 2109, - 2347, 1377, 2106, - 2344, 1389, 2102, - 2340, 1404, 2097, - 2334, 1423, 2090, - 2327, 1448, 2080, - 2317, 1479, 2067, - 2303, 1518, 2049, - 2284, 1565, 2023, - 2257, 1621, 1987, - 2218, 1686, 1932, - 2160, 1761, 1848, - 2069, 1846, 1703, - 1910, 1938, 1386, - 1535, 2039, 0, - 0, 2145, 0, - 0, 2257, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2489, 1443, 2236, - 2489, 1445, 2235, - 2488, 1449, 2234, - 2487, 1453, 2233, - 2486, 1458, 2231, - 2484, 1466, 2229, - 2482, 1475, 2226, - 2479, 1488, 2222, - 2475, 1504, 2217, - 2470, 1525, 2210, - 2462, 1551, 2200, - 2452, 1584, 2186, - 2439, 1625, 2167, - 2420, 1675, 2141, - 2393, 1733, 2103, - 2355, 1802, 2047, - 2297, 1879, 1958, - 2208, 1966, 1805, - 2051, 2061, 1456, - 1688, 2163, 0, - 0, 2271, 0, - 0, 2385, 0, - 0, 2502, 0, - 0, 2623, 0, - 0, 2747, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3128, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2624, 1544, 2359, - 2624, 1546, 2359, - 2624, 1549, 2358, - 2623, 1552, 2357, - 2622, 1556, 2356, - 2621, 1562, 2354, - 2619, 1570, 2352, - 2617, 1580, 2349, - 2614, 1593, 2345, - 2610, 1611, 2340, - 2605, 1633, 2332, - 2597, 1661, 2322, - 2587, 1695, 2308, - 2574, 1738, 2289, - 2555, 1789, 2262, - 2528, 1850, 2223, - 2490, 1921, 2165, - 2433, 2000, 2074, - 2345, 2089, 1914, - 2190, 2186, 1535, - 1835, 2289, 0, - 0, 2399, 0, - 0, 2513, 0, - 0, 2632, 0, - 0, 2753, 0, - 0, 2877, 0, - 0, 3004, 0, - 0, 3131, 0, - 0, 3260, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 2759, 1651, 2485, - 2758, 1653, 2485, - 2758, 1655, 2484, - 2758, 1658, 2483, - 2757, 1661, 2482, - 2756, 1666, 2481, - 2755, 1672, 2480, - 2753, 1680, 2477, - 2751, 1691, 2474, - 2748, 1705, 2470, - 2744, 1723, 2465, - 2739, 1746, 2457, - 2731, 1775, 2447, - 2721, 1811, 2433, - 2708, 1855, 2413, - 2689, 1908, 2385, - 2663, 1971, 2346, - 2625, 2043, 2287, - 2568, 2124, 2193, - 2480, 2214, 2027, - 2327, 2312, 1623, - 1978, 2417, 0, - 0, 2527, 0, - 0, 2643, 0, - 0, 2762, 0, - 0, 2884, 0, - 0, 3008, 0, - 0, 3135, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 2892, 1764, 2612, - 2892, 1765, 2612, - 2892, 1767, 2612, - 2892, 1769, 2611, - 2891, 1772, 2610, - 2890, 1775, 2609, - 2889, 1780, 2608, - 2888, 1787, 2606, - 2887, 1795, 2604, - 2884, 1806, 2601, - 2882, 1821, 2597, - 2878, 1839, 2591, - 2872, 1863, 2584, - 2865, 1893, 2573, - 2855, 1930, 2559, - 2842, 1976, 2539, - 2823, 2030, 2511, - 2797, 2094, 2471, - 2759, 2167, 2411, - 2703, 2250, 2315, - 2615, 2341, 2145, - 2463, 2440, 1720, - 2118, 2546, 0, - 0, 2657, 0, - 0, 2773, 0, - 0, 2892, 0, - 0, 3015, 0, - 0, 3140, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3653, 0, - 3026, 1881, 2741, - 3026, 1882, 2740, - 3025, 1883, 2740, - 3025, 1885, 2740, - 3025, 1887, 2739, - 3024, 1890, 2738, - 3024, 1894, 2737, - 3023, 1899, 2736, - 3021, 1905, 2734, - 3020, 1914, 2732, - 3018, 1926, 2729, - 3015, 1940, 2725, - 3011, 1960, 2719, - 3005, 1984, 2712, - 2998, 2015, 2701, - 2988, 2053, 2687, - 2975, 2099, 2667, - 2956, 2154, 2638, - 2930, 2219, 2598, - 2892, 2294, 2537, - 2836, 2377, 2440, - 2749, 2469, 2266, - 2598, 2569, 1823, - 2256, 2675, 0, - 0, 2787, 0, - 0, 2903, 0, - 0, 3023, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 3159, 2002, 2870, - 3159, 2002, 2870, - 3158, 2003, 2870, - 3158, 2005, 2869, - 3158, 2006, 2869, - 3158, 2008, 2868, - 3157, 2011, 2868, - 3156, 2015, 2867, - 3156, 2020, 2865, - 3154, 2027, 2864, - 3153, 2036, 2861, - 3151, 2048, 2858, - 3148, 2063, 2854, - 3144, 2082, 2848, - 3138, 2107, 2840, - 3131, 2139, 2830, - 3121, 2177, 2815, - 3108, 2224, 2795, - 3089, 2280, 2767, - 3063, 2346, 2726, - 3025, 2421, 2664, - 2970, 2506, 2566, - 2883, 2598, 2390, - 2732, 2699, 1933, - 2392, 2805, 0, - 0, 2918, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3403, 0, - 0, 3529, 0, - 0, 3658, 0, - 3291, 2125, 3000, - 3291, 2125, 3000, - 3291, 2126, 3000, - 3291, 2127, 2999, - 3291, 2128, 2999, - 3291, 2130, 2999, - 3290, 2132, 2998, - 3290, 2135, 2997, - 3289, 2139, 2996, - 3288, 2145, 2995, - 3287, 2151, 2993, - 3285, 2161, 2991, - 3283, 2172, 2988, - 3280, 2188, 2984, - 3276, 2208, 2978, - 3271, 2233, 2970, - 3264, 2264, 2960, - 3254, 2304, 2945, - 3241, 2351, 2925, - 3222, 2408, 2896, - 3196, 2474, 2855, - 3158, 2550, 2793, - 3103, 2635, 2694, - 3016, 2728, 2515, - 2865, 2829, 2047, - 2527, 2936, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3534, 0, - 0, 3661, 0, - 3424, 2250, 3130, - 3424, 2251, 3130, - 3424, 2251, 3130, - 3424, 2252, 3130, - 3424, 2253, 3130, - 3423, 2254, 3130, - 3423, 2256, 3129, - 3423, 2258, 3129, - 3422, 2261, 3128, - 3422, 2265, 3127, - 3421, 2271, 3126, - 3420, 2278, 3124, - 3418, 2287, 3122, - 3416, 2299, 3118, - 3413, 2314, 3114, - 3409, 2334, 3108, - 3404, 2360, 3101, - 3396, 2392, 3090, - 3387, 2431, 3075, - 3373, 2479, 3055, - 3355, 2537, 3026, - 3328, 2603, 2984, - 3291, 2680, 2922, - 3235, 2765, 2823, - 3149, 2859, 2643, - 2999, 2960, 2165, - 2662, 3067, 0, - 0, 3180, 0, - 0, 3297, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3666, 0, - 3557, 2377, 3261, - 3557, 2378, 3261, - 3556, 2378, 3261, - 3556, 2379, 3261, - 3556, 2379, 3261, - 3556, 2380, 3261, - 3556, 2382, 3260, - 3556, 2383, 3260, - 3555, 2386, 3259, - 3555, 2389, 3259, - 3554, 2393, 3258, - 3553, 2398, 3256, - 3552, 2405, 3255, - 3550, 2414, 3252, - 3548, 2427, 3249, - 3545, 2442, 3245, - 3541, 2462, 3239, - 3536, 2488, 3231, - 3529, 2520, 3221, - 3519, 2560, 3206, - 3506, 2609, 3185, - 3487, 2666, 3157, - 3461, 2733, 3115, - 3423, 2810, 3052, - 3368, 2896, 2952, - 3281, 2989, 2771, - 3131, 3091, 2287, - 2795, 3198, 0, - 0, 3311, 0, - 0, 3429, 0, - 0, 3549, 0, - 0, 3673, 0, - 3689, 2506, 3393, - 3689, 2506, 3393, - 3689, 2506, 3392, - 3689, 2506, 3392, - 3689, 2507, 3392, - 3689, 2508, 3392, - 3688, 2509, 3392, - 3688, 2510, 3392, - 3688, 2512, 3391, - 3688, 2514, 3391, - 3687, 2517, 3390, - 3686, 2521, 3389, - 3686, 2527, 3388, - 3684, 2534, 3386, - 3683, 2543, 3383, - 3681, 2555, 3380, - 3678, 2571, 3376, - 3674, 2592, 3370, - 3668, 2617, 3362, - 3661, 2650, 3352, - 3651, 2690, 3337, - 3638, 2739, 3316, - 3619, 2796, 3287, - 3593, 2864, 3246, - 3556, 2941, 3183, - 3500, 3026, 3083, - 3414, 3121, 2900, - 3264, 3222, 2411, - 2929, 3330, 0, - 0, 3443, 0, - 0, 3560, 0, - 0, 3681, 0, - 3821, 2635, 3524, - 3821, 2635, 3524, - 3821, 2635, 3524, - 3821, 2635, 3524, - 3821, 2636, 3524, - 3821, 2636, 3524, - 3821, 2637, 3523, - 3821, 2638, 3523, - 3821, 2639, 3523, - 3820, 2641, 3523, - 3820, 2644, 3522, - 3819, 2647, 3521, - 3819, 2651, 3520, - 3818, 2656, 3519, - 3817, 2663, 3517, - 3815, 2673, 3515, - 3813, 2685, 3512, - 3810, 2701, 3507, - 3806, 2721, 3502, - 3801, 2747, 3494, - 3794, 2780, 3483, - 3784, 2820, 3468, - 3770, 2869, 3448, - 3752, 2927, 3419, - 3726, 2995, 3377, - 3688, 3072, 3314, - 3633, 3158, 3213, - 3546, 3252, 3030, - 3397, 3354, 2537, - 3062, 3462, 0, - 0, 3575, 0, - 0, 3692, 0, - 3953, 2765, 3656, - 3953, 2765, 3656, - 3953, 2765, 3656, - 3953, 2765, 3656, - 3953, 2765, 3655, - 3953, 2766, 3655, - 3953, 2766, 3655, - 3953, 2767, 3655, - 3953, 2768, 3655, - 3953, 2770, 3655, - 3952, 2771, 3654, - 3952, 2774, 3654, - 3952, 2777, 3653, - 3951, 2781, 3652, - 3950, 2786, 3651, - 3949, 2793, 3649, - 3947, 2803, 3646, - 3945, 2815, 3643, - 3942, 2831, 3639, - 3938, 2852, 3633, - 3933, 2878, 3625, - 3926, 2911, 3615, - 3916, 2951, 3600, - 3903, 3000, 3579, - 3884, 3058, 3550, - 3858, 3126, 3508, - 3821, 3203, 3445, - 3765, 3289, 3344, - 3679, 3384, 3161, - 3529, 3485, 2664, - 3195, 3593, 0, - 0, 3707, 0, - 4086, 2895, 3787, - 4086, 2895, 3787, - 4086, 2895, 3787, - 4086, 2896, 3787, - 4086, 2896, 3787, - 4086, 2896, 3787, - 4086, 2896, 3787, - 4085, 2897, 3787, - 4085, 2898, 3787, - 4085, 2899, 3787, - 4085, 2900, 3786, - 4085, 2902, 3786, - 4084, 2904, 3785, - 4084, 2907, 3785, - 4083, 2911, 3784, - 4082, 2917, 3782, - 4081, 2924, 3780, - 4079, 2934, 3778, - 4077, 2946, 3775, - 4074, 2962, 3771, - 4070, 2983, 3765, - 4065, 3009, 3757, - 4058, 3042, 3746, - 4048, 3082, 3731, - 4035, 3131, 3711, - 4016, 3189, 3682, - 3990, 3257, 3640, - 3953, 3334, 3577, - 3897, 3421, 3476, - 3811, 3515, 3292, - 3662, 3617, 2793, - 3327, 3725, 0, - 4095, 3026, 3919, - 4095, 3026, 3919, - 4095, 3026, 3919, - 4095, 3026, 3919, - 4095, 3026, 3919, - 4095, 3027, 3919, - 4095, 3027, 3919, - 4095, 3027, 3919, - 4095, 3028, 3919, - 4095, 3029, 3919, - 4095, 3030, 3918, - 4095, 3031, 3918, - 4095, 3033, 3918, - 4095, 3035, 3917, - 4095, 3038, 3916, - 4095, 3042, 3915, - 4095, 3048, 3914, - 4095, 3055, 3912, - 4095, 3065, 3910, - 4095, 3077, 3907, - 4095, 3093, 3902, - 4095, 3114, 3897, - 4095, 3140, 3889, - 4095, 3173, 3878, - 4095, 3213, 3863, - 4095, 3263, 3843, - 4095, 3321, 3813, - 4095, 3389, 3771, - 4085, 3466, 3708, - 4030, 3552, 3607, - 3943, 3647, 3423, - 3794, 3749, 2922, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3157, 4051, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3159, 4051, - 4095, 3159, 4051, - 4095, 3160, 4050, - 4095, 3161, 4050, - 4095, 3162, 4050, - 4095, 3164, 4049, - 4095, 3166, 4049, - 4095, 3170, 4048, - 4095, 3174, 4047, - 4095, 3179, 4046, - 4095, 3186, 4044, - 4095, 3196, 4042, - 4095, 3208, 4039, - 4095, 3224, 4034, - 4095, 3245, 4028, - 4095, 3271, 4021, - 4095, 3304, 4010, - 4095, 3345, 3995, - 4095, 3394, 3974, - 4095, 3453, 3945, - 4095, 3520, 3903, - 4095, 3598, 3840, - 4095, 3684, 3739, - 4075, 3779, 3555, - 0, 966, 1218, - 0, 973, 1211, - 0, 982, 1202, - 0, 994, 1191, - 0, 1009, 1174, - 0, 1028, 1151, - 0, 1053, 1119, - 0, 1084, 1071, - 0, 1122, 999, - 0, 1169, 879, - 0, 1225, 645, - 0, 1291, 0, - 0, 1366, 0, - 0, 1450, 0, - 0, 1542, 0, - 0, 1643, 0, - 0, 1749, 0, - 0, 1861, 0, - 0, 1978, 0, - 0, 2098, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3383, 0, - 0, 3515, 0, - 0, 3647, 0, - 0, 969, 1227, - 0, 975, 1221, - 0, 984, 1212, - 0, 996, 1201, - 0, 1011, 1185, - 0, 1030, 1162, - 0, 1055, 1130, - 0, 1086, 1084, - 0, 1124, 1014, - 0, 1171, 899, - 0, 1226, 677, - 0, 1292, 0, - 0, 1367, 0, - 0, 1451, 0, - 0, 1543, 0, - 0, 1643, 0, - 0, 1750, 0, - 0, 1862, 0, - 0, 1978, 0, - 0, 2098, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 0, 972, 1239, - 0, 978, 1233, - 0, 987, 1225, - 0, 999, 1214, - 0, 1014, 1198, - 0, 1033, 1176, - 0, 1057, 1146, - 0, 1088, 1101, - 0, 1126, 1033, - 0, 1173, 924, - 0, 1228, 717, - 0, 1293, 53, - 0, 1368, 0, - 0, 1452, 0, - 0, 1544, 0, - 0, 1644, 0, - 0, 1750, 0, - 0, 1862, 0, - 0, 1978, 0, - 0, 2098, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 0, 976, 1255, - 0, 982, 1249, - 0, 991, 1241, - 0, 1002, 1230, - 0, 1017, 1215, - 0, 1036, 1195, - 0, 1061, 1165, - 0, 1091, 1122, - 0, 1129, 1058, - 0, 1175, 955, - 0, 1231, 766, - 0, 1295, 233, - 0, 1370, 0, - 0, 1453, 0, - 0, 1545, 0, - 0, 1645, 0, - 0, 1751, 0, - 0, 1863, 0, - 0, 1979, 0, - 0, 2099, 0, - 0, 2221, 0, - 0, 2346, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 0, 981, 1276, - 0, 988, 1270, - 0, 996, 1263, - 0, 1008, 1252, - 0, 1022, 1238, - 0, 1041, 1218, - 0, 1065, 1190, - 0, 1095, 1150, - 0, 1133, 1090, - 0, 1179, 994, - 0, 1234, 824, - 0, 1298, 398, - 0, 1372, 0, - 0, 1455, 0, - 0, 1547, 0, - 0, 1646, 0, - 0, 1752, 0, - 0, 1863, 0, - 0, 1979, 0, - 0, 2099, 0, - 0, 2222, 0, - 0, 2347, 0, - 0, 2473, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 0, 988, 1302, - 0, 995, 1297, - 0, 1003, 1289, - 0, 1014, 1280, - 0, 1029, 1266, - 0, 1047, 1247, - 0, 1071, 1221, - 0, 1101, 1184, - 0, 1138, 1128, - 0, 1183, 1041, - 0, 1238, 891, - 0, 1301, 553, - 0, 1375, 0, - 0, 1457, 0, - 0, 1549, 0, - 0, 1648, 0, - 0, 1753, 0, - 0, 1864, 0, - 0, 1980, 0, - 0, 2100, 0, - 0, 2222, 0, - 0, 2347, 0, - 0, 2474, 0, - 0, 2601, 0, - 0, 2730, 0, - 0, 2860, 0, - 0, 2990, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 329, 998, 1335, - 265, 1004, 1330, - 164, 1012, 1323, - 0, 1023, 1314, - 0, 1037, 1301, - 0, 1055, 1284, - 0, 1079, 1260, - 0, 1108, 1226, - 0, 1145, 1175, - 0, 1189, 1098, - 0, 1243, 968, - 0, 1306, 702, - 0, 1379, 0, - 0, 1461, 0, - 0, 1551, 0, - 0, 1650, 0, - 0, 1755, 0, - 0, 1866, 0, - 0, 1981, 0, - 0, 2101, 0, - 0, 2223, 0, - 0, 2347, 0, - 0, 2474, 0, - 0, 2602, 0, - 0, 2731, 0, - 0, 2860, 0, - 0, 2991, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 770, 1010, 1375, - 747, 1016, 1370, - 715, 1024, 1364, - 667, 1035, 1356, - 594, 1048, 1345, - 474, 1066, 1329, - 239, 1089, 1307, - 0, 1118, 1276, - 0, 1154, 1232, - 0, 1197, 1164, - 0, 1250, 1054, - 0, 1312, 846, - 0, 1384, 171, - 0, 1465, 0, - 0, 1555, 0, - 0, 1653, 0, - 0, 1757, 0, - 0, 1868, 0, - 0, 1983, 0, - 0, 2102, 0, - 0, 2224, 0, - 0, 2348, 0, - 0, 2474, 0, - 0, 2602, 0, - 0, 2731, 0, - 0, 2860, 0, - 0, 2991, 0, - 0, 3121, 0, - 0, 3252, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1045, 1025, 1424, - 1033, 1031, 1420, - 1016, 1039, 1414, - 992, 1049, 1407, - 957, 1063, 1397, - 907, 1080, 1383, - 830, 1102, 1364, - 702, 1130, 1336, - 440, 1165, 1297, - 0, 1208, 1239, - 0, 1260, 1148, - 0, 1321, 987, - 0, 1391, 606, - 0, 1471, 0, - 0, 1560, 0, - 0, 1657, 0, - 0, 1760, 0, - 0, 1870, 0, - 0, 1985, 0, - 0, 2103, 0, - 0, 2225, 0, - 0, 2349, 0, - 0, 2475, 0, - 0, 2603, 0, - 0, 2731, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1261, 1046, 1482, - 1253, 1051, 1478, - 1242, 1059, 1473, - 1228, 1069, 1467, - 1208, 1082, 1458, - 1180, 1098, 1446, - 1139, 1119, 1429, - 1079, 1146, 1406, - 982, 1180, 1373, - 810, 1222, 1324, - 372, 1272, 1249, - 0, 1331, 1126, - 0, 1400, 879, - 0, 1479, 0, - 0, 1566, 0, - 0, 1662, 0, - 0, 1764, 0, - 0, 1873, 0, - 0, 1987, 0, - 0, 2105, 0, - 0, 2226, 0, - 0, 2350, 0, - 0, 2476, 0, - 0, 2603, 0, - 0, 2732, 0, - 0, 2861, 0, - 0, 2991, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1446, 1072, 1550, - 1441, 1077, 1546, - 1434, 1084, 1542, - 1425, 1093, 1537, - 1412, 1105, 1529, - 1394, 1121, 1519, - 1370, 1141, 1505, - 1334, 1167, 1485, - 1282, 1199, 1457, - 1200, 1239, 1417, - 1063, 1288, 1357, - 771, 1345, 1263, - 0, 1412, 1094, - 0, 1489, 678, - 0, 1575, 0, - 0, 1668, 0, - 0, 1770, 0, - 0, 1877, 0, - 0, 1990, 0, - 0, 2108, 0, - 0, 2228, 0, - 0, 2352, 0, - 0, 2477, 0, - 0, 2604, 0, - 0, 2732, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3515, 0, - 0, 3647, 0, - 1615, 1104, 1627, - 1611, 1109, 1624, - 1607, 1115, 1621, - 1600, 1124, 1616, - 1592, 1135, 1609, - 1580, 1150, 1601, - 1563, 1169, 1589, - 1540, 1193, 1573, - 1508, 1224, 1550, - 1460, 1262, 1518, - 1388, 1308, 1470, - 1268, 1363, 1398, - 1033, 1428, 1280, - 0, 1502, 1048, - 0, 1585, 57, - 0, 1677, 0, - 0, 1777, 0, - 0, 1883, 0, - 0, 1995, 0, - 0, 2111, 0, - 0, 2231, 0, - 0, 2354, 0, - 0, 2479, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 1772, 1144, 1713, - 1770, 1148, 1711, - 1767, 1154, 1708, - 1762, 1162, 1704, - 1756, 1173, 1699, - 1748, 1186, 1692, - 1737, 1204, 1682, - 1721, 1226, 1669, - 1699, 1255, 1650, - 1669, 1290, 1624, - 1624, 1334, 1588, - 1557, 1386, 1533, - 1448, 1448, 1448, - 1243, 1519, 1301, - 591, 1600, 979, - 0, 1689, 0, - 0, 1786, 0, - 0, 1891, 0, - 0, 2001, 0, - 0, 2116, 0, - 0, 2234, 0, - 0, 2356, 0, - 0, 2481, 0, - 0, 2607, 0, - 0, 2734, 0, - 0, 2863, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3647, 0, - 1923, 1192, 1807, - 1921, 1196, 1805, - 1919, 1202, 1803, - 1915, 1209, 1800, - 1911, 1218, 1796, - 1905, 1231, 1790, - 1897, 1247, 1782, - 1886, 1267, 1772, - 1871, 1293, 1757, - 1851, 1326, 1737, - 1821, 1366, 1708, - 1779, 1415, 1667, - 1715, 1473, 1605, - 1613, 1541, 1507, - 1426, 1618, 1329, - 905, 1704, 865, - 0, 1799, 0, - 0, 1900, 0, - 0, 2008, 0, - 0, 2122, 0, - 0, 2239, 0, - 0, 2360, 0, - 0, 2483, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2068, 1250, 1909, - 2067, 1253, 1908, - 2065, 1258, 1906, - 2063, 1265, 1903, - 2059, 1273, 1900, - 2055, 1284, 1895, - 2049, 1298, 1889, - 2042, 1317, 1881, - 2031, 1340, 1869, - 2017, 1370, 1854, - 1997, 1406, 1832, - 1968, 1451, 1801, - 1927, 1505, 1755, - 1866, 1569, 1687, - 1768, 1641, 1575, - 1592, 1724, 1364, - 1138, 1815, 648, - 0, 1913, 0, - 0, 2018, 0, - 0, 2129, 0, - 0, 2245, 0, - 0, 2364, 0, - 0, 2487, 0, - 0, 2612, 0, - 0, 2738, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3124, 0, - 0, 3255, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 2210, 1317, 2017, - 2209, 1320, 2016, - 2207, 1324, 2014, - 2206, 1330, 2012, - 2203, 1337, 2010, - 2200, 1347, 2006, - 2196, 1359, 2001, - 2191, 1375, 1995, - 2183, 1396, 1986, - 2173, 1422, 1974, - 2158, 1455, 1957, - 2139, 1496, 1934, - 2111, 1545, 1900, - 2071, 1603, 1852, - 2011, 1671, 1777, - 1916, 1749, 1653, - 1748, 1835, 1406, - 1333, 1930, 0, - 0, 2032, 0, - 0, 2140, 0, - 0, 2253, 0, - 0, 2371, 0, - 0, 2492, 0, - 0, 2615, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2996, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2349, 1394, 2130, - 2348, 1396, 2129, - 2347, 1400, 2128, - 2346, 1404, 2127, - 2344, 1411, 2125, - 2342, 1419, 2122, - 2339, 1429, 2118, - 2335, 1443, 2113, - 2329, 1461, 2106, - 2322, 1484, 2097, - 2312, 1513, 2084, - 2298, 1549, 2067, - 2278, 1593, 2042, - 2251, 1646, 2007, - 2211, 1708, 1955, - 2153, 1780, 1875, - 2061, 1861, 1740, - 1898, 1951, 1457, - 1507, 2049, 0, - 0, 2153, 0, - 0, 2264, 0, - 0, 2379, 0, - 0, 2498, 0, - 0, 2620, 0, - 0, 2744, 0, - 0, 2871, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 2486, 1479, 2248, - 2485, 1482, 2247, - 2485, 1484, 2246, - 2484, 1488, 2245, - 2483, 1493, 2243, - 2481, 1500, 2241, - 2479, 1509, 2238, - 2476, 1521, 2234, - 2472, 1536, 2229, - 2466, 1555, 2222, - 2459, 1580, 2213, - 2449, 1611, 2199, - 2435, 1650, 2181, - 2416, 1697, 2155, - 2389, 1753, 2119, - 2350, 1818, 2064, - 2292, 1893, 1980, - 2201, 1978, 1835, - 2042, 2070, 1518, - 1668, 2171, 0, - 0, 2277, 0, - 0, 2389, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 2622, 1573, 2368, - 2621, 1575, 2368, - 2621, 1578, 2367, - 2620, 1581, 2366, - 2619, 1585, 2365, - 2618, 1590, 2363, - 2616, 1598, 2361, - 2614, 1607, 2358, - 2611, 1620, 2354, - 2607, 1636, 2349, - 2602, 1657, 2342, - 2595, 1683, 2332, - 2585, 1716, 2318, - 2571, 1757, 2299, - 2552, 1807, 2273, - 2525, 1865, 2235, - 2487, 1934, 2179, - 2430, 2011, 2091, - 2340, 2098, 1937, - 2183, 2193, 1588, - 1820, 2295, 0, - 0, 2403, 0, - 0, 2517, 0, - 0, 2634, 0, - 0, 2755, 0, - 0, 2879, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3260, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2757, 1675, 2492, - 2756, 1676, 2491, - 2756, 1678, 2491, - 2756, 1681, 2490, - 2755, 1684, 2489, - 2754, 1688, 2488, - 2753, 1694, 2486, - 2751, 1702, 2484, - 2749, 1712, 2481, - 2746, 1726, 2477, - 2742, 1743, 2472, - 2737, 1765, 2464, - 2729, 1793, 2454, - 2719, 1827, 2440, - 2706, 1870, 2421, - 2687, 1922, 2394, - 2660, 1982, 2355, - 2622, 2053, 2297, - 2566, 2132, 2206, - 2477, 2221, 2046, - 2322, 2318, 1667, - 1967, 2421, 0, - 0, 2531, 0, - 0, 2645, 0, - 0, 2764, 0, - 0, 2885, 0, - 0, 3010, 0, - 0, 3136, 0, - 0, 3263, 0, - 0, 3392, 0, - 0, 3521, 0, - 0, 3651, 0, - 2891, 1782, 2617, - 2891, 1784, 2617, - 2890, 1785, 2617, - 2890, 1787, 2616, - 2890, 1790, 2615, - 2889, 1793, 2615, - 2888, 1798, 2613, - 2887, 1804, 2612, - 2885, 1812, 2609, - 2883, 1823, 2606, - 2880, 1837, 2602, - 2876, 1855, 2597, - 2871, 1878, 2589, - 2863, 1907, 2579, - 2854, 1943, 2565, - 2840, 1987, 2545, - 2821, 2040, 2518, - 2795, 2103, 2478, - 2757, 2175, 2419, - 2701, 2256, 2325, - 2612, 2346, 2159, - 2459, 2444, 1755, - 2110, 2549, 0, - 0, 2659, 0, - 0, 2775, 0, - 0, 2894, 0, - 0, 3016, 0, - 0, 3140, 0, - 0, 3267, 0, - 0, 3395, 0, - 0, 3523, 0, - 0, 3653, 0, - 3025, 1895, 2745, - 3024, 1896, 2744, - 3024, 1897, 2744, - 3024, 1899, 2744, - 3024, 1901, 2743, - 3023, 1904, 2742, - 3022, 1908, 2741, - 3022, 1912, 2740, - 3020, 1919, 2738, - 3019, 1927, 2736, - 3017, 1938, 2733, - 3014, 1953, 2729, - 3010, 1971, 2723, - 3004, 1995, 2716, - 2997, 2025, 2705, - 2987, 2062, 2691, - 2974, 2108, 2671, - 2955, 2162, 2643, - 2929, 2226, 2603, - 2891, 2299, 2543, - 2835, 2382, 2447, - 2747, 2473, 2277, - 2595, 2572, 1852, - 2250, 2678, 0, - 0, 2789, 0, - 0, 2905, 0, - 0, 3024, 0, - 0, 3147, 0, - 0, 3272, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 3158, 2013, 2873, - 3158, 2013, 2873, - 3158, 2014, 2872, - 3157, 2015, 2872, - 3157, 2017, 2872, - 3157, 2019, 2871, - 3156, 2022, 2871, - 3156, 2026, 2870, - 3155, 2031, 2868, - 3154, 2038, 2867, - 3152, 2046, 2864, - 3150, 2058, 2861, - 3147, 2073, 2857, - 3143, 2092, 2851, - 3138, 2116, 2844, - 3130, 2147, 2833, - 3120, 2185, 2819, - 3107, 2231, 2799, - 3088, 2286, 2770, - 3062, 2351, 2730, - 3024, 2426, 2669, - 2968, 2509, 2572, - 2881, 2601, 2398, - 2730, 2701, 1955, - 2388, 2807, 0, - 0, 2919, 0, - 0, 3035, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 3291, 2133, 3002, - 3291, 2134, 3002, - 3291, 2135, 3002, - 3291, 2135, 3002, - 3290, 2137, 3001, - 3290, 2138, 3001, - 3290, 2141, 3000, - 3289, 2143, 3000, - 3288, 2147, 2999, - 3288, 2153, 2997, - 3286, 2159, 2996, - 3285, 2168, 2993, - 3283, 2180, 2990, - 3280, 2195, 2986, - 3276, 2215, 2980, - 3270, 2239, 2973, - 3263, 2271, 2962, - 3253, 2309, 2947, - 3240, 2356, 2927, - 3221, 2412, 2899, - 3195, 2478, 2858, - 3157, 2553, 2796, - 3102, 2638, 2698, - 3015, 2730, 2522, - 2864, 2831, 2065, - 2524, 2938, 0, - 0, 3050, 0, - 0, 3166, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 3424, 2257, 3132, - 3424, 2257, 3132, - 3423, 2258, 3132, - 3423, 2258, 3132, - 3423, 2259, 3132, - 3423, 2261, 3131, - 3423, 2262, 3131, - 3422, 2264, 3130, - 3422, 2267, 3130, - 3421, 2271, 3129, - 3420, 2277, 3127, - 3419, 2284, 3126, - 3417, 2293, 3123, - 3415, 2304, 3120, - 3412, 2320, 3116, - 3408, 2340, 3110, - 3403, 2365, 3102, - 3396, 2397, 3092, - 3386, 2436, 3077, - 3373, 2483, 3057, - 3354, 2540, 3028, - 3328, 2606, 2987, - 3290, 2682, 2925, - 3235, 2767, 2826, - 3148, 2860, 2647, - 2997, 2961, 2179, - 2659, 3068, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3666, 0, - 3556, 2382, 3263, - 3556, 2382, 3263, - 3556, 2383, 3262, - 3556, 2383, 3262, - 3556, 2384, 3262, - 3556, 2385, 3262, - 3556, 2386, 3262, - 3555, 2388, 3261, - 3555, 2390, 3261, - 3554, 2393, 3260, - 3554, 2397, 3259, - 3553, 2403, 3258, - 3552, 2410, 3256, - 3550, 2419, 3254, - 3548, 2431, 3250, - 3545, 2446, 3246, - 3541, 2466, 3240, - 3536, 2492, 3233, - 3529, 2524, 3222, - 3519, 2564, 3207, - 3505, 2612, 3187, - 3487, 2669, 3158, - 3461, 2736, 3117, - 3423, 2812, 3054, - 3368, 2897, 2955, - 3281, 2991, 2775, - 3131, 3092, 2297, - 2794, 3199, 0, - 0, 3312, 0, - 0, 3429, 0, - 0, 3550, 0, - 0, 3673, 0, - 3689, 2509, 3394, - 3689, 2509, 3393, - 3689, 2510, 3393, - 3689, 2510, 3393, - 3688, 2511, 3393, - 3688, 2511, 3393, - 3688, 2512, 3393, - 3688, 2514, 3392, - 3688, 2515, 3392, - 3687, 2518, 3392, - 3687, 2521, 3391, - 3686, 2525, 3390, - 3685, 2530, 3389, - 3684, 2537, 3387, - 3682, 2546, 3384, - 3680, 2559, 3381, - 3677, 2574, 3377, - 3673, 2595, 3371, - 3668, 2620, 3363, - 3661, 2653, 3353, - 3651, 2692, 3338, - 3638, 2741, 3318, - 3619, 2798, 3289, - 3593, 2865, 3247, - 3556, 2942, 3184, - 3500, 3028, 3084, - 3413, 3122, 2903, - 3264, 3223, 2419, - 2928, 3331, 0, - 0, 3443, 0, - 0, 3561, 0, - 0, 3681, 0, - 3821, 2637, 3525, - 3821, 2638, 3525, - 3821, 2638, 3525, - 3821, 2638, 3525, - 3821, 2639, 3524, - 3821, 2639, 3524, - 3821, 2640, 3524, - 3821, 2641, 3524, - 3820, 2642, 3524, - 3820, 2644, 3523, - 3820, 2646, 3523, - 3819, 2649, 3522, - 3818, 2653, 3521, - 3818, 2659, 3520, - 3816, 2666, 3518, - 3815, 2675, 3516, - 3813, 2687, 3512, - 3810, 2703, 3508, - 3806, 2724, 3502, - 3801, 2750, 3494, - 3793, 2782, 3484, - 3784, 2822, 3469, - 3770, 2871, 3448, - 3752, 2929, 3420, - 3725, 2996, 3378, - 3688, 3073, 3315, - 3633, 3159, 3215, - 3546, 3253, 3032, - 3396, 3354, 2543, - 3061, 3462, 0, - 0, 3575, 0, - 0, 3692, 0, - 3953, 2767, 3656, - 3953, 2767, 3656, - 3953, 2767, 3656, - 3953, 2767, 3656, - 3953, 2768, 3656, - 3953, 2768, 3656, - 3953, 2769, 3656, - 3953, 2769, 3656, - 3953, 2770, 3655, - 3953, 2772, 3655, - 3952, 2773, 3655, - 3952, 2776, 3654, - 3951, 2779, 3653, - 3951, 2783, 3652, - 3950, 2788, 3651, - 3949, 2795, 3649, - 3947, 2805, 3647, - 3945, 2817, 3644, - 3942, 2833, 3639, - 3938, 2854, 3634, - 3933, 2880, 3626, - 3926, 2912, 3615, - 3916, 2952, 3600, - 3902, 3001, 3580, - 3884, 3059, 3551, - 3858, 3127, 3509, - 3820, 3204, 3446, - 3765, 3290, 3345, - 3678, 3384, 3162, - 3529, 3486, 2669, - 3194, 3594, 0, - 0, 3707, 0, - 4086, 2897, 3788, - 4086, 2897, 3788, - 4086, 2897, 3788, - 4086, 2897, 3788, - 4086, 2897, 3788, - 4085, 2898, 3788, - 4085, 2898, 3787, - 4085, 2899, 3787, - 4085, 2899, 3787, - 4085, 2900, 3787, - 4085, 2902, 3787, - 4085, 2903, 3786, - 4084, 2906, 3786, - 4084, 2909, 3785, - 4083, 2913, 3784, - 4082, 2918, 3783, - 4081, 2926, 3781, - 4079, 2935, 3779, - 4077, 2947, 3775, - 4074, 2963, 3771, - 4070, 2984, 3765, - 4065, 3010, 3757, - 4058, 3043, 3747, - 4048, 3083, 3732, - 4035, 3132, 3711, - 4016, 3190, 3682, - 3990, 3258, 3640, - 3953, 3335, 3577, - 3897, 3421, 3476, - 3811, 3516, 3293, - 3661, 3617, 2796, - 3327, 3725, 0, - 4095, 3027, 3919, - 4095, 3027, 3919, - 4095, 3027, 3919, - 4095, 3027, 3919, - 4095, 3028, 3919, - 4095, 3028, 3919, - 4095, 3028, 3919, - 4095, 3029, 3919, - 4095, 3029, 3919, - 4095, 3030, 3919, - 4095, 3031, 3919, - 4095, 3032, 3918, - 4095, 3034, 3918, - 4095, 3036, 3917, - 4095, 3039, 3917, - 4095, 3044, 3916, - 4095, 3049, 3914, - 4095, 3056, 3913, - 4095, 3066, 3910, - 4095, 3078, 3907, - 4095, 3094, 3903, - 4095, 3115, 3897, - 4095, 3141, 3889, - 4095, 3174, 3878, - 4095, 3214, 3863, - 4095, 3263, 3843, - 4095, 3321, 3814, - 4095, 3389, 3772, - 4085, 3467, 3709, - 4030, 3553, 3608, - 3943, 3647, 3424, - 3794, 3749, 2925, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3158, 4051, - 4095, 3159, 4051, - 4095, 3159, 4051, - 4095, 3159, 4051, - 4095, 3160, 4051, - 4095, 3160, 4051, - 4095, 3161, 4051, - 4095, 3162, 4050, - 4095, 3163, 4050, - 4095, 3165, 4050, - 4095, 3167, 4049, - 4095, 3170, 4048, - 4095, 3175, 4047, - 4095, 3180, 4046, - 4095, 3187, 4044, - 4095, 3197, 4042, - 4095, 3209, 4039, - 4095, 3225, 4035, - 4095, 3246, 4029, - 4095, 3272, 4021, - 4095, 3305, 4010, - 4095, 3346, 3995, - 4095, 3395, 3975, - 4095, 3453, 3946, - 4095, 3521, 3903, - 4095, 3598, 3840, - 4095, 3685, 3739, - 4075, 3779, 3555, - 0, 1092, 1347, - 0, 1097, 1342, - 0, 1104, 1336, - 0, 1112, 1327, - 0, 1124, 1315, - 0, 1139, 1298, - 0, 1159, 1275, - 0, 1183, 1242, - 0, 1215, 1193, - 0, 1253, 1119, - 0, 1300, 996, - 0, 1356, 751, - 0, 1422, 0, - 0, 1497, 0, - 0, 1581, 0, - 0, 1674, 0, - 0, 1774, 0, - 0, 1881, 0, - 0, 1993, 0, - 0, 2110, 0, - 0, 2230, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 0, 1093, 1354, - 0, 1098, 1350, - 0, 1105, 1343, - 0, 1114, 1335, - 0, 1126, 1323, - 0, 1141, 1306, - 0, 1160, 1283, - 0, 1185, 1251, - 0, 1216, 1203, - 0, 1254, 1131, - 0, 1301, 1011, - 0, 1357, 777, - 0, 1423, 0, - 0, 1498, 0, - 0, 1582, 0, - 0, 1674, 0, - 0, 1775, 0, - 0, 1881, 0, - 0, 1993, 0, - 0, 2110, 0, - 0, 2230, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 0, 1096, 1364, - 0, 1101, 1359, - 0, 1107, 1353, - 0, 1116, 1344, - 0, 1128, 1333, - 0, 1143, 1317, - 0, 1162, 1294, - 0, 1187, 1262, - 0, 1218, 1216, - 0, 1256, 1146, - 0, 1303, 1031, - 0, 1359, 809, - 0, 1424, 0, - 0, 1499, 0, - 0, 1583, 0, - 0, 1675, 0, - 0, 1775, 0, - 0, 1882, 0, - 0, 1994, 0, - 0, 2110, 0, - 0, 2230, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 0, 1099, 1376, - 0, 1104, 1371, - 0, 1110, 1365, - 0, 1119, 1357, - 0, 1131, 1346, - 0, 1146, 1330, - 0, 1165, 1308, - 0, 1189, 1278, - 0, 1220, 1233, - 0, 1258, 1165, - 0, 1305, 1056, - 0, 1360, 850, - 0, 1425, 185, - 0, 1500, 0, - 0, 1584, 0, - 0, 1676, 0, - 0, 1776, 0, - 0, 1882, 0, - 0, 1994, 0, - 0, 2110, 0, - 0, 2230, 0, - 0, 2353, 0, - 0, 2478, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 0, 1103, 1392, - 0, 1108, 1387, - 0, 1114, 1381, - 0, 1123, 1373, - 0, 1135, 1363, - 0, 1149, 1348, - 0, 1168, 1327, - 0, 1193, 1297, - 0, 1223, 1255, - 0, 1261, 1190, - 0, 1307, 1087, - 0, 1363, 898, - 0, 1427, 365, - 0, 1502, 0, - 0, 1585, 0, - 0, 1677, 0, - 0, 1777, 0, - 0, 1883, 0, - 0, 1995, 0, - 0, 2111, 0, - 0, 2231, 0, - 0, 2354, 0, - 0, 2479, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 0, 1108, 1412, - 0, 1113, 1408, - 0, 1120, 1402, - 0, 1128, 1395, - 0, 1140, 1384, - 0, 1154, 1370, - 0, 1173, 1350, - 0, 1197, 1322, - 0, 1227, 1282, - 0, 1265, 1222, - 0, 1311, 1126, - 0, 1366, 956, - 0, 1430, 530, - 0, 1504, 0, - 0, 1587, 0, - 0, 1679, 0, - 0, 1778, 0, - 0, 1884, 0, - 0, 1995, 0, - 0, 2112, 0, - 0, 2231, 0, - 0, 2354, 0, - 0, 2479, 0, - 0, 2605, 0, - 0, 2733, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3122, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 0, 1115, 1438, - 0, 1120, 1434, - 0, 1127, 1429, - 0, 1135, 1421, - 0, 1146, 1412, - 0, 1161, 1398, - 0, 1179, 1380, - 0, 1203, 1353, - 0, 1233, 1316, - 0, 1270, 1260, - 0, 1315, 1173, - 0, 1370, 1023, - 0, 1434, 686, - 0, 1507, 0, - 0, 1590, 0, - 0, 1681, 0, - 0, 1780, 0, - 0, 1885, 0, - 0, 1996, 0, - 0, 2112, 0, - 0, 2232, 0, - 0, 2354, 0, - 0, 2479, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2862, 0, - 0, 2992, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 503, 1125, 1470, - 461, 1130, 1467, - 397, 1136, 1462, - 296, 1144, 1455, - 111, 1155, 1446, - 0, 1169, 1433, - 0, 1188, 1416, - 0, 1211, 1392, - 0, 1240, 1358, - 0, 1277, 1307, - 0, 1322, 1230, - 0, 1375, 1100, - 0, 1438, 834, - 0, 1511, 0, - 0, 1593, 0, - 0, 1683, 0, - 0, 1782, 0, - 0, 1887, 0, - 0, 1998, 0, - 0, 2113, 0, - 0, 2233, 0, - 0, 2355, 0, - 0, 2480, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2863, 0, - 0, 2992, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3384, 0, - 0, 3516, 0, - 0, 3647, 0, - 919, 1137, 1510, - 902, 1142, 1507, - 879, 1148, 1502, - 847, 1156, 1496, - 799, 1167, 1488, - 726, 1180, 1477, - 606, 1198, 1461, - 371, 1221, 1439, - 0, 1250, 1409, - 0, 1286, 1364, - 0, 1330, 1296, - 0, 1382, 1186, - 0, 1444, 978, - 0, 1516, 303, - 0, 1597, 0, - 0, 1687, 0, - 0, 1785, 0, - 0, 1889, 0, - 0, 2000, 0, - 0, 2115, 0, - 0, 2234, 0, - 0, 2356, 0, - 0, 2480, 0, - 0, 2606, 0, - 0, 2734, 0, - 0, 2863, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3253, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3647, 0, - 1186, 1153, 1559, - 1177, 1158, 1556, - 1165, 1164, 1552, - 1148, 1171, 1546, - 1124, 1182, 1539, - 1090, 1195, 1529, - 1039, 1212, 1515, - 962, 1234, 1496, - 834, 1262, 1468, - 572, 1297, 1429, - 0, 1340, 1371, - 0, 1392, 1280, - 0, 1453, 1119, - 0, 1523, 738, - 0, 1603, 0, - 0, 1692, 0, - 0, 1789, 0, - 0, 1892, 0, - 0, 2002, 0, - 0, 2117, 0, - 0, 2235, 0, - 0, 2357, 0, - 0, 2481, 0, - 0, 2607, 0, - 0, 2735, 0, - 0, 2863, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3647, 0, - 1398, 1174, 1617, - 1393, 1178, 1614, - 1385, 1184, 1610, - 1375, 1191, 1606, - 1360, 1201, 1599, - 1340, 1214, 1590, - 1312, 1230, 1578, - 1271, 1251, 1561, - 1211, 1278, 1538, - 1114, 1312, 1505, - 942, 1354, 1456, - 504, 1404, 1382, - 0, 1463, 1258, - 0, 1532, 1012, - 0, 1611, 0, - 0, 1698, 0, - 0, 1794, 0, - 0, 1896, 0, - 0, 2005, 0, - 0, 2119, 0, - 0, 2237, 0, - 0, 2358, 0, - 0, 2482, 0, - 0, 2608, 0, - 0, 2735, 0, - 0, 2864, 0, - 0, 2993, 0, - 0, 3123, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3647, 0, - 1582, 1200, 1684, - 1579, 1204, 1682, - 1573, 1209, 1679, - 1567, 1216, 1674, - 1557, 1225, 1669, - 1544, 1237, 1661, - 1527, 1253, 1651, - 1502, 1273, 1637, - 1466, 1299, 1617, - 1414, 1331, 1589, - 1332, 1371, 1549, - 1195, 1420, 1489, - 903, 1477, 1395, - 0, 1544, 1226, - 0, 1621, 810, - 0, 1707, 0, - 0, 1801, 0, - 0, 1902, 0, - 0, 2010, 0, - 0, 2123, 0, - 0, 2240, 0, - 0, 2360, 0, - 0, 2484, 0, - 0, 2609, 0, - 0, 2736, 0, - 0, 2864, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 1750, 1232, 1761, - 1747, 1236, 1759, - 1744, 1241, 1756, - 1739, 1248, 1753, - 1732, 1256, 1748, - 1724, 1268, 1742, - 1712, 1282, 1733, - 1695, 1301, 1721, - 1672, 1326, 1705, - 1640, 1356, 1682, - 1592, 1394, 1650, - 1520, 1440, 1602, - 1400, 1495, 1530, - 1165, 1560, 1412, - 102, 1634, 1180, - 0, 1718, 189, - 0, 1809, 0, - 0, 1909, 0, - 0, 2015, 0, - 0, 2127, 0, - 0, 2243, 0, - 0, 2363, 0, - 0, 2486, 0, - 0, 2611, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 1906, 1272, 1846, - 1905, 1276, 1845, - 1902, 1280, 1843, - 1899, 1286, 1840, - 1894, 1294, 1836, - 1888, 1305, 1831, - 1880, 1319, 1824, - 1869, 1336, 1814, - 1853, 1359, 1801, - 1831, 1387, 1782, - 1801, 1422, 1757, - 1756, 1466, 1720, - 1689, 1518, 1665, - 1580, 1580, 1580, - 1375, 1651, 1434, - 723, 1732, 1111, - 0, 1821, 0, - 0, 1918, 0, - 0, 2023, 0, - 0, 2133, 0, - 0, 2248, 0, - 0, 2366, 0, - 0, 2488, 0, - 0, 2613, 0, - 0, 2739, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2056, 1321, 1941, - 2055, 1324, 1939, - 2053, 1328, 1938, - 2051, 1334, 1935, - 2047, 1341, 1932, - 2043, 1350, 1928, - 2037, 1363, 1922, - 2029, 1379, 1914, - 2018, 1399, 1904, - 2003, 1425, 1889, - 1983, 1458, 1869, - 1953, 1498, 1840, - 1911, 1547, 1799, - 1847, 1605, 1737, - 1745, 1673, 1639, - 1558, 1750, 1461, - 1037, 1836, 997, - 0, 1931, 0, - 0, 2032, 0, - 0, 2140, 0, - 0, 2254, 0, - 0, 2371, 0, - 0, 2492, 0, - 0, 2615, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2996, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 2201, 1379, 2042, - 2200, 1382, 2041, - 2199, 1386, 2040, - 2197, 1390, 2038, - 2195, 1397, 2035, - 2191, 1405, 2032, - 2187, 1416, 2027, - 2182, 1430, 2021, - 2174, 1449, 2013, - 2163, 1472, 2001, - 2149, 1502, 1986, - 2129, 1538, 1964, - 2100, 1583, 1933, - 2059, 1637, 1887, - 1998, 1701, 1819, - 1900, 1774, 1707, - 1724, 1856, 1496, - 1270, 1947, 780, - 0, 2045, 0, - 0, 2151, 0, - 0, 2262, 0, - 0, 2377, 0, - 0, 2497, 0, - 0, 2619, 0, - 0, 2744, 0, - 0, 2870, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 2342, 1447, 2150, - 2342, 1449, 2149, - 2341, 1452, 2148, - 2339, 1456, 2146, - 2338, 1462, 2145, - 2335, 1469, 2142, - 2332, 1479, 2138, - 2328, 1491, 2133, - 2323, 1507, 2127, - 2315, 1528, 2118, - 2305, 1554, 2106, - 2290, 1587, 2089, - 2271, 1628, 2066, - 2243, 1677, 2032, - 2203, 1735, 1984, - 2143, 1803, 1909, - 2049, 1881, 1785, - 1880, 1967, 1538, - 1465, 2062, 3, - 0, 2164, 0, - 0, 2272, 0, - 0, 2385, 0, - 0, 2503, 0, - 0, 2624, 0, - 0, 2747, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3128, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2481, 1524, 2263, - 2481, 1526, 2262, - 2480, 1528, 2261, - 2479, 1532, 2260, - 2478, 1537, 2259, - 2476, 1543, 2257, - 2474, 1551, 2254, - 2471, 1561, 2250, - 2467, 1575, 2245, - 2461, 1593, 2238, - 2454, 1616, 2229, - 2444, 1645, 2216, - 2430, 1681, 2199, - 2410, 1725, 2174, - 2383, 1778, 2139, - 2344, 1840, 2087, - 2285, 1912, 2007, - 2193, 1993, 1872, - 2030, 2083, 1589, - 1639, 2181, 0, - 0, 2285, 0, - 0, 2396, 0, - 0, 2511, 0, - 0, 2630, 0, - 0, 2752, 0, - 0, 2876, 0, - 0, 3003, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 2618, 1610, 2380, - 2618, 1611, 2380, - 2617, 1614, 2379, - 2617, 1617, 2378, - 2616, 1620, 2377, - 2615, 1626, 2375, - 2613, 1632, 2373, - 2611, 1641, 2370, - 2608, 1653, 2367, - 2604, 1668, 2361, - 2598, 1687, 2354, - 2591, 1712, 2345, - 2581, 1743, 2331, - 2567, 1782, 2313, - 2548, 1829, 2287, - 2521, 1885, 2251, - 2482, 1950, 2197, - 2424, 2026, 2112, - 2333, 2110, 1967, - 2174, 2202, 1650, - 1800, 2303, 0, - 0, 2409, 0, - 0, 2522, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 2754, 1704, 2501, - 2754, 1705, 2500, - 2754, 1707, 2500, - 2753, 1710, 2499, - 2752, 1713, 2498, - 2751, 1717, 2497, - 2750, 1723, 2496, - 2749, 1730, 2493, - 2746, 1739, 2490, - 2743, 1752, 2486, - 2739, 1768, 2481, - 2734, 1789, 2474, - 2727, 1815, 2464, - 2717, 1849, 2450, - 2703, 1889, 2432, - 2684, 1939, 2405, - 2657, 1997, 2367, - 2619, 2066, 2311, - 2562, 2143, 2223, - 2472, 2230, 2069, - 2315, 2325, 1720, - 1952, 2427, 0, - 0, 2535, 0, - 0, 2649, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3011, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3392, 0, - 0, 3522, 0, - 0, 3652, 0, - 2889, 1806, 2624, - 2889, 1807, 2624, - 2889, 1808, 2624, - 2888, 1810, 2623, - 2888, 1813, 2622, - 2887, 1816, 2621, - 2886, 1821, 2620, - 2885, 1826, 2619, - 2883, 1834, 2616, - 2881, 1844, 2613, - 2878, 1858, 2609, - 2874, 1875, 2604, - 2869, 1897, 2596, - 2861, 1925, 2586, - 2852, 1959, 2572, - 2838, 2002, 2553, - 2819, 2054, 2526, - 2792, 2114, 2487, - 2754, 2185, 2429, - 2698, 2265, 2338, - 2609, 2353, 2178, - 2454, 2450, 1799, - 2099, 2553, 0, - 0, 2663, 0, - 0, 2777, 0, - 0, 2896, 0, - 0, 3018, 0, - 0, 3142, 0, - 0, 3268, 0, - 0, 3395, 0, - 0, 3524, 0, - 0, 3653, 0, - 3023, 1914, 2750, - 3023, 1915, 2749, - 3023, 1916, 2749, - 3023, 1917, 2749, - 3022, 1919, 2748, - 3022, 1922, 2748, - 3021, 1925, 2747, - 3020, 1930, 2745, - 3019, 1936, 2744, - 3017, 1944, 2741, - 3015, 1955, 2738, - 3012, 1969, 2734, - 3008, 1987, 2729, - 3003, 2010, 2721, - 2996, 2039, 2711, - 2986, 2075, 2697, - 2972, 2119, 2677, - 2953, 2172, 2650, - 2927, 2235, 2610, - 2889, 2307, 2551, - 2833, 2388, 2457, - 2744, 2478, 2291, - 2591, 2576, 1888, - 2242, 2681, 0, - 0, 2792, 0, - 0, 2907, 0, - 0, 3026, 0, - 0, 3148, 0, - 0, 3273, 0, - 0, 3399, 0, - 0, 3527, 0, - 0, 3655, 0, - 3157, 2027, 2877, - 3157, 2028, 2877, - 3157, 2028, 2876, - 3156, 2030, 2876, - 3156, 2031, 2876, - 3156, 2033, 2875, - 3155, 2036, 2874, - 3155, 2040, 2874, - 3154, 2045, 2872, - 3152, 2051, 2871, - 3151, 2059, 2868, - 3149, 2071, 2865, - 3146, 2085, 2861, - 3142, 2104, 2855, - 3136, 2127, 2848, - 3129, 2157, 2837, - 3119, 2194, 2823, - 3106, 2240, 2803, - 3087, 2294, 2775, - 3061, 2358, 2735, - 3023, 2431, 2675, - 2967, 2514, 2579, - 2879, 2605, 2409, - 2727, 2704, 1984, - 2382, 2810, 0, - 0, 2921, 0, - 0, 3037, 0, - 0, 3157, 0, - 0, 3279, 0, - 0, 3404, 0, - 0, 3530, 0, - 0, 3658, 0, - 3290, 2144, 3005, - 3290, 2145, 3005, - 3290, 2145, 3005, - 3290, 2146, 3005, - 3290, 2148, 3004, - 3289, 2149, 3004, - 3289, 2151, 3003, - 3288, 2154, 3003, - 3288, 2158, 3002, - 3287, 2163, 3000, - 3286, 2170, 2999, - 3284, 2178, 2996, - 3282, 2190, 2993, - 3279, 2205, 2989, - 3275, 2224, 2983, - 3270, 2248, 2976, - 3262, 2279, 2965, - 3253, 2317, 2951, - 3239, 2363, 2931, - 3220, 2418, 2902, - 3194, 2483, 2862, - 3156, 2558, 2801, - 3101, 2641, 2704, - 3013, 2733, 2530, - 2862, 2833, 2087, - 2520, 2939, 0, - 0, 3051, 0, - 0, 3168, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 3423, 2265, 3134, - 3423, 2265, 3134, - 3423, 2266, 3134, - 3423, 2267, 3134, - 3423, 2268, 3134, - 3422, 2269, 3133, - 3422, 2270, 3133, - 3422, 2273, 3132, - 3421, 2276, 3132, - 3421, 2279, 3131, - 3420, 2285, 3130, - 3418, 2291, 3128, - 3417, 2300, 3125, - 3415, 2312, 3122, - 3412, 2327, 3118, - 3408, 2347, 3112, - 3403, 2371, 3105, - 3395, 2403, 3094, - 3386, 2441, 3080, - 3372, 2488, 3059, - 3353, 2545, 3031, - 3327, 2610, 2990, - 3290, 2685, 2928, - 3234, 2770, 2830, - 3147, 2863, 2654, - 2996, 2963, 2197, - 2656, 3070, 0, - 0, 3182, 0, - 0, 3298, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 3556, 2388, 3264, - 3556, 2389, 3264, - 3556, 2389, 3264, - 3556, 2390, 3264, - 3555, 2390, 3264, - 3555, 2391, 3264, - 3555, 2393, 3263, - 3555, 2394, 3263, - 3554, 2397, 3262, - 3554, 2400, 3262, - 3553, 2403, 3261, - 3552, 2409, 3259, - 3551, 2416, 3258, - 3550, 2425, 3255, - 3547, 2437, 3252, - 3544, 2452, 3248, - 3541, 2472, 3242, - 3535, 2497, 3234, - 3528, 2529, 3224, - 3518, 2568, 3209, - 3505, 2615, 3189, - 3486, 2672, 3160, - 3460, 2738, 3119, - 3422, 2814, 3057, - 3367, 2899, 2958, - 3280, 2992, 2780, - 3130, 3093, 2311, - 2791, 3200, 0, - 0, 3313, 0, - 0, 3430, 0, - 0, 3550, 0, - 0, 3673, 0, - 3688, 2514, 3395, - 3688, 2514, 3395, - 3688, 2515, 3395, - 3688, 2515, 3395, - 3688, 2515, 3394, - 3688, 2516, 3394, - 3688, 2517, 3394, - 3688, 2518, 3394, - 3687, 2520, 3393, - 3687, 2522, 3393, - 3686, 2525, 3392, - 3686, 2529, 3391, - 3685, 2535, 3390, - 3684, 2542, 3388, - 3682, 2551, 3386, - 3680, 2563, 3383, - 3677, 2579, 3378, - 3673, 2599, 3373, - 3668, 2624, 3365, - 3661, 2656, 3354, - 3651, 2696, 3339, - 3637, 2744, 3319, - 3619, 2801, 3290, - 3593, 2868, 3249, - 3555, 2944, 3186, - 3500, 3029, 3087, - 3413, 3123, 2907, - 3263, 3224, 2429, - 2926, 3331, 0, - 0, 3444, 0, - 0, 3561, 0, - 0, 3682, 0, - 3821, 2641, 3526, - 3821, 2641, 3526, - 3821, 2641, 3526, - 3821, 2642, 3526, - 3821, 2642, 3525, - 3821, 2643, 3525, - 3820, 2643, 3525, - 3820, 2644, 3525, - 3820, 2646, 3525, - 3820, 2647, 3524, - 3819, 2650, 3524, - 3819, 2653, 3523, - 3818, 2657, 3522, - 3817, 2662, 3521, - 3816, 2669, 3519, - 3815, 2679, 3517, - 3812, 2691, 3513, - 3809, 2706, 3509, - 3806, 2727, 3503, - 3800, 2752, 3495, - 3793, 2785, 3485, - 3783, 2825, 3470, - 3770, 2873, 3450, - 3751, 2930, 3421, - 3725, 2998, 3379, - 3688, 3074, 3316, - 3632, 3160, 3216, - 3546, 3254, 3035, - 3396, 3355, 2551, - 3060, 3463, 0, - 0, 3576, 0, - 0, 3693, 0, - 3953, 2769, 3657, - 3953, 2770, 3657, - 3953, 2770, 3657, - 3953, 2770, 3657, - 3953, 2770, 3657, - 3953, 2771, 3657, - 3953, 2771, 3656, - 3953, 2772, 3656, - 3953, 2773, 3656, - 3952, 2774, 3656, - 3952, 2776, 3655, - 3952, 2778, 3655, - 3951, 2781, 3654, - 3951, 2785, 3653, - 3950, 2791, 3652, - 3948, 2798, 3650, - 3947, 2807, 3648, - 3945, 2820, 3644, - 3942, 2835, 3640, - 3938, 2856, 3634, - 3933, 2882, 3627, - 3925, 2914, 3616, - 3916, 2954, 3601, - 3902, 3003, 3581, - 3884, 3061, 3552, - 3858, 3128, 3510, - 3820, 3205, 3447, - 3765, 3291, 3347, - 3678, 3385, 3165, - 3528, 3486, 2675, - 3193, 3594, 0, - 0, 3707, 0, - 4085, 2899, 3788, - 4085, 2899, 3788, - 4085, 2899, 3788, - 4085, 2899, 3788, - 4085, 2899, 3788, - 4085, 2900, 3788, - 4085, 2900, 3788, - 4085, 2901, 3788, - 4085, 2901, 3788, - 4085, 2902, 3787, - 4085, 2904, 3787, - 4084, 2905, 3787, - 4084, 2908, 3786, - 4084, 2911, 3785, - 4083, 2915, 3784, - 4082, 2920, 3783, - 4081, 2928, 3781, - 4079, 2937, 3779, - 4077, 2949, 3776, - 4074, 2965, 3772, - 4070, 2986, 3766, - 4065, 3012, 3758, - 4058, 3044, 3747, - 4048, 3084, 3732, - 4035, 3133, 3712, - 4016, 3191, 3683, - 3990, 3259, 3641, - 3952, 3336, 3578, - 3897, 3422, 3477, - 3811, 3516, 3295, - 3661, 3618, 2801, - 3326, 3726, 0, - 4095, 3029, 3920, - 4095, 3029, 3920, - 4095, 3029, 3920, - 4095, 3029, 3920, - 4095, 3029, 3920, - 4095, 3029, 3920, - 4095, 3030, 3920, - 4095, 3030, 3920, - 4095, 3031, 3919, - 4095, 3031, 3919, - 4095, 3032, 3919, - 4095, 3034, 3919, - 4095, 3035, 3918, - 4095, 3038, 3918, - 4095, 3041, 3917, - 4095, 3045, 3916, - 4095, 3050, 3915, - 4095, 3058, 3913, - 4095, 3067, 3911, - 4095, 3079, 3907, - 4095, 3095, 3903, - 4095, 3116, 3897, - 4095, 3142, 3889, - 4095, 3175, 3879, - 4095, 3215, 3864, - 4095, 3264, 3843, - 4095, 3322, 3814, - 4095, 3390, 3772, - 4085, 3467, 3709, - 4029, 3553, 3609, - 3943, 3648, 3425, - 3793, 3750, 2928, - 4095, 3159, 4052, - 4095, 3159, 4052, - 4095, 3159, 4052, - 4095, 3159, 4052, - 4095, 3160, 4052, - 4095, 3160, 4051, - 4095, 3160, 4051, - 4095, 3160, 4051, - 4095, 3161, 4051, - 4095, 3161, 4051, - 4095, 3162, 4051, - 4095, 3163, 4051, - 4095, 3164, 4050, - 4095, 3166, 4050, - 4095, 3168, 4049, - 4095, 3171, 4049, - 4095, 3176, 4048, - 4095, 3181, 4046, - 4095, 3188, 4045, - 4095, 3198, 4042, - 4095, 3210, 4039, - 4095, 3226, 4035, - 4095, 3247, 4029, - 4095, 3273, 4021, - 4095, 3306, 4010, - 4095, 3346, 3996, - 4095, 3395, 3975, - 4095, 3454, 3946, - 4095, 3521, 3904, - 4095, 3599, 3841, - 4095, 3685, 3740, - 4075, 3780, 3556, - 0, 1218, 1478, - 0, 1222, 1474, - 0, 1228, 1469, - 0, 1234, 1463, - 0, 1243, 1454, - 0, 1255, 1441, - 0, 1270, 1424, - 0, 1290, 1401, - 0, 1314, 1367, - 0, 1346, 1318, - 0, 1384, 1242, - 0, 1431, 1116, - 0, 1488, 863, - 0, 1553, 0, - 0, 1629, 0, - 0, 1713, 0, - 0, 1806, 0, - 0, 1906, 0, - 0, 2013, 0, - 0, 2125, 0, - 0, 2242, 0, - 0, 2362, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1220, 1483, - 0, 1224, 1479, - 0, 1229, 1475, - 0, 1236, 1468, - 0, 1245, 1459, - 0, 1256, 1447, - 0, 1271, 1430, - 0, 1291, 1407, - 0, 1316, 1374, - 0, 1347, 1325, - 0, 1385, 1251, - 0, 1432, 1128, - 0, 1488, 883, - 0, 1554, 0, - 0, 1629, 0, - 0, 1713, 0, - 0, 1806, 0, - 0, 1906, 0, - 0, 2013, 0, - 0, 2125, 0, - 0, 2242, 0, - 0, 2362, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1222, 1490, - 0, 1225, 1486, - 0, 1231, 1482, - 0, 1237, 1475, - 0, 1246, 1467, - 0, 1258, 1455, - 0, 1273, 1438, - 0, 1292, 1415, - 0, 1317, 1383, - 0, 1348, 1335, - 0, 1387, 1263, - 0, 1433, 1143, - 0, 1489, 909, - 0, 1555, 0, - 0, 1630, 0, - 0, 1714, 0, - 0, 1807, 0, - 0, 1907, 0, - 0, 2013, 0, - 0, 2125, 0, - 0, 2242, 0, - 0, 2362, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1224, 1499, - 0, 1228, 1496, - 0, 1233, 1491, - 0, 1240, 1485, - 0, 1248, 1476, - 0, 1260, 1465, - 0, 1275, 1449, - 0, 1294, 1426, - 0, 1319, 1395, - 0, 1350, 1348, - 0, 1388, 1278, - 0, 1435, 1163, - 0, 1491, 942, - 0, 1556, 111, - 0, 1631, 0, - 0, 1715, 0, - 0, 1807, 0, - 0, 1907, 0, - 0, 2014, 0, - 0, 2126, 0, - 0, 2242, 0, - 0, 2362, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1227, 1511, - 0, 1231, 1508, - 0, 1236, 1503, - 0, 1243, 1497, - 0, 1251, 1489, - 0, 1263, 1478, - 0, 1278, 1462, - 0, 1297, 1441, - 0, 1321, 1410, - 0, 1352, 1365, - 0, 1390, 1298, - 0, 1437, 1188, - 0, 1492, 982, - 0, 1557, 317, - 0, 1632, 0, - 0, 1716, 0, - 0, 1808, 0, - 0, 1908, 0, - 0, 2014, 0, - 0, 2126, 0, - 0, 2243, 0, - 0, 2363, 0, - 0, 2485, 0, - 0, 2610, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1231, 1527, - 0, 1235, 1524, - 0, 1240, 1519, - 0, 1247, 1514, - 0, 1255, 1506, - 0, 1267, 1495, - 0, 1281, 1480, - 0, 1300, 1459, - 0, 1325, 1429, - 0, 1355, 1387, - 0, 1393, 1322, - 0, 1439, 1219, - 0, 1495, 1030, - 0, 1559, 497, - 0, 1634, 0, - 0, 1717, 0, - 0, 1809, 0, - 0, 1909, 0, - 0, 2015, 0, - 0, 2127, 0, - 0, 2243, 0, - 0, 2363, 0, - 0, 2486, 0, - 0, 2611, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3254, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1237, 1547, - 0, 1240, 1544, - 0, 1245, 1540, - 0, 1252, 1534, - 0, 1260, 1527, - 0, 1272, 1516, - 0, 1286, 1502, - 0, 1305, 1482, - 0, 1329, 1454, - 0, 1360, 1414, - 0, 1397, 1354, - 0, 1443, 1258, - 0, 1498, 1088, - 0, 1562, 662, - 0, 1636, 0, - 0, 1719, 0, - 0, 1811, 0, - 0, 1910, 0, - 0, 2016, 0, - 0, 2128, 0, - 0, 2244, 0, - 0, 2363, 0, - 0, 2486, 0, - 0, 2611, 0, - 0, 2737, 0, - 0, 2865, 0, - 0, 2994, 0, - 0, 3124, 0, - 0, 3255, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 0, 1244, 1573, - 0, 1248, 1570, - 0, 1252, 1566, - 0, 1259, 1561, - 0, 1267, 1554, - 0, 1278, 1544, - 0, 1293, 1530, - 0, 1311, 1512, - 0, 1335, 1486, - 0, 1365, 1448, - 0, 1402, 1392, - 0, 1448, 1306, - 0, 1502, 1155, - 0, 1566, 818, - 0, 1639, 0, - 0, 1722, 0, - 0, 1813, 0, - 0, 1912, 0, - 0, 2017, 0, - 0, 2129, 0, - 0, 2244, 0, - 0, 2364, 0, - 0, 2486, 0, - 0, 2611, 0, - 0, 2738, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3124, 0, - 0, 3255, 0, - 0, 3385, 0, - 0, 3516, 0, - 0, 3648, 0, - 664, 1253, 1605, - 635, 1257, 1602, - 593, 1262, 1599, - 530, 1268, 1594, - 428, 1276, 1587, - 243, 1287, 1578, - 0, 1301, 1566, - 0, 1320, 1548, - 0, 1343, 1524, - 0, 1372, 1490, - 0, 1409, 1440, - 0, 1454, 1362, - 0, 1507, 1232, - 0, 1570, 966, - 0, 1643, 0, - 0, 1725, 0, - 0, 1816, 0, - 0, 1914, 0, - 0, 2019, 0, - 0, 2130, 0, - 0, 2245, 0, - 0, 2365, 0, - 0, 2487, 0, - 0, 2612, 0, - 0, 2738, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3124, 0, - 0, 3255, 0, - 0, 3385, 0, - 0, 3517, 0, - 0, 3648, 0, - 1063, 1266, 1645, - 1051, 1269, 1642, - 1034, 1274, 1639, - 1011, 1280, 1635, - 979, 1288, 1628, - 931, 1299, 1620, - 858, 1313, 1609, - 738, 1330, 1593, - 503, 1353, 1571, - 0, 1382, 1541, - 0, 1418, 1496, - 0, 1462, 1428, - 0, 1514, 1318, - 0, 1577, 1110, - 0, 1648, 435, - 0, 1729, 0, - 0, 1819, 0, - 0, 1917, 0, - 0, 2021, 0, - 0, 2132, 0, - 0, 2247, 0, - 0, 2366, 0, - 0, 2488, 0, - 0, 2612, 0, - 0, 2739, 0, - 0, 2866, 0, - 0, 2995, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 1325, 1282, 1693, - 1318, 1285, 1691, - 1309, 1290, 1688, - 1297, 1296, 1684, - 1280, 1303, 1678, - 1256, 1314, 1671, - 1222, 1327, 1661, - 1172, 1344, 1647, - 1095, 1366, 1628, - 966, 1394, 1601, - 704, 1429, 1562, - 0, 1472, 1503, - 0, 1524, 1412, - 0, 1585, 1251, - 0, 1655, 870, - 0, 1735, 0, - 0, 1824, 0, - 0, 1921, 0, - 0, 2024, 0, - 0, 2134, 0, - 0, 2249, 0, - 0, 2367, 0, - 0, 2489, 0, - 0, 2613, 0, - 0, 2739, 0, - 0, 2867, 0, - 0, 2995, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 1535, 1302, 1751, - 1530, 1306, 1749, - 1525, 1310, 1746, - 1517, 1316, 1742, - 1507, 1323, 1738, - 1492, 1333, 1731, - 1472, 1346, 1722, - 1444, 1362, 1710, - 1404, 1384, 1693, - 1343, 1411, 1670, - 1246, 1444, 1637, - 1074, 1486, 1588, - 636, 1536, 1514, - 0, 1595, 1390, - 0, 1664, 1144, - 0, 1743, 0, - 0, 1830, 0, - 0, 1926, 0, - 0, 2029, 0, - 0, 2137, 0, - 0, 2251, 0, - 0, 2369, 0, - 0, 2490, 0, - 0, 2614, 0, - 0, 2740, 0, - 0, 2867, 0, - 0, 2996, 0, - 0, 3125, 0, - 0, 3255, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 1717, 1329, 1818, - 1714, 1332, 1816, - 1711, 1336, 1814, - 1706, 1341, 1811, - 1699, 1348, 1806, - 1689, 1357, 1801, - 1676, 1370, 1793, - 1659, 1385, 1783, - 1634, 1406, 1769, - 1598, 1431, 1749, - 1546, 1464, 1721, - 1465, 1503, 1681, - 1327, 1552, 1621, - 1035, 1609, 1527, - 0, 1676, 1358, - 0, 1753, 942, - 0, 1839, 0, - 0, 1933, 0, - 0, 2034, 0, - 0, 2142, 0, - 0, 2255, 0, - 0, 2372, 0, - 0, 2492, 0, - 0, 2616, 0, - 0, 2741, 0, - 0, 2868, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 1884, 1361, 1894, - 1882, 1364, 1893, - 1879, 1368, 1891, - 1876, 1373, 1888, - 1871, 1380, 1885, - 1865, 1388, 1880, - 1856, 1400, 1874, - 1844, 1414, 1865, - 1827, 1433, 1853, - 1805, 1458, 1837, - 1772, 1488, 1814, - 1724, 1526, 1782, - 1652, 1572, 1734, - 1532, 1627, 1662, - 1297, 1692, 1544, - 234, 1766, 1313, - 0, 1850, 322, - 0, 1942, 0, - 0, 2041, 0, - 0, 2147, 0, - 0, 2259, 0, - 0, 2375, 0, - 0, 2495, 0, - 0, 2618, 0, - 0, 2743, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3648, 0, - 2040, 1402, 1980, - 2038, 1405, 1979, - 2037, 1408, 1977, - 2034, 1413, 1975, - 2031, 1419, 1972, - 2026, 1427, 1968, - 2020, 1437, 1963, - 2012, 1451, 1956, - 2001, 1468, 1946, - 1985, 1491, 1933, - 1964, 1519, 1914, - 1933, 1555, 1889, - 1888, 1598, 1852, - 1821, 1650, 1797, - 1712, 1712, 1712, - 1507, 1783, 1566, - 855, 1864, 1243, - 0, 1953, 0, - 0, 2051, 0, - 0, 2155, 0, - 0, 2265, 0, - 0, 2380, 0, - 0, 2499, 0, - 0, 2620, 0, - 0, 2745, 0, - 0, 2871, 0, - 0, 2999, 0, - 0, 3127, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 2189, 1451, 2074, - 2188, 1453, 2073, - 2187, 1456, 2071, - 2185, 1461, 2070, - 2183, 1466, 2067, - 2180, 1473, 2064, - 2175, 1483, 2060, - 2169, 1495, 2054, - 2161, 1511, 2046, - 2151, 1531, 2036, - 2136, 1557, 2021, - 2115, 1590, 2001, - 2085, 1630, 1972, - 2043, 1679, 1931, - 1979, 1737, 1869, - 1877, 1805, 1771, - 1690, 1882, 1593, - 1170, 1968, 1129, - 0, 2063, 0, - 0, 2165, 0, - 0, 2273, 0, - 0, 2386, 0, - 0, 2503, 0, - 0, 2624, 0, - 0, 2747, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3128, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2334, 1509, 2175, - 2333, 1511, 2174, - 2332, 1514, 2173, - 2331, 1518, 2172, - 2329, 1522, 2170, - 2327, 1529, 2167, - 2324, 1537, 2164, - 2319, 1548, 2159, - 2314, 1562, 2153, - 2306, 1581, 2145, - 2295, 1604, 2134, - 2281, 1634, 2118, - 2261, 1671, 2096, - 2232, 1716, 2065, - 2191, 1769, 2019, - 2130, 1833, 1951, - 2032, 1906, 1839, - 1856, 1988, 1628, - 1402, 2079, 912, - 0, 2177, 0, - 0, 2283, 0, - 0, 2394, 0, - 0, 2509, 0, - 0, 2629, 0, - 0, 2751, 0, - 0, 2876, 0, - 0, 3002, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 2475, 1577, 2283, - 2474, 1579, 2282, - 2474, 1581, 2281, - 2473, 1584, 2280, - 2472, 1588, 2279, - 2470, 1594, 2277, - 2468, 1601, 2274, - 2464, 1611, 2270, - 2460, 1623, 2266, - 2455, 1639, 2259, - 2447, 1660, 2250, - 2437, 1686, 2238, - 2423, 1719, 2221, - 2403, 1760, 2198, - 2375, 1809, 2165, - 2335, 1867, 2116, - 2275, 1935, 2041, - 2181, 2013, 1917, - 2012, 2099, 1670, - 1597, 2194, 135, - 0, 2296, 0, - 0, 2404, 0, - 0, 2517, 0, - 0, 2635, 0, - 0, 2756, 0, - 0, 2879, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3260, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2614, 1654, 2395, - 2613, 1656, 2395, - 2613, 1658, 2394, - 2612, 1660, 2393, - 2611, 1664, 2392, - 2610, 1669, 2391, - 2608, 1675, 2389, - 2606, 1683, 2386, - 2603, 1694, 2382, - 2599, 1707, 2377, - 2593, 1725, 2370, - 2586, 1748, 2361, - 2576, 1777, 2348, - 2562, 1813, 2331, - 2542, 1857, 2306, - 2515, 1910, 2271, - 2476, 1972, 2219, - 2417, 2044, 2139, - 2325, 2125, 2004, - 2162, 2215, 1721, - 1771, 2313, 0, - 0, 2417, 0, - 0, 2528, 0, - 0, 2643, 0, - 0, 2762, 0, - 0, 2884, 0, - 0, 3009, 0, - 0, 3135, 0, - 0, 3263, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 2751, 1741, 2513, - 2750, 1742, 2512, - 2750, 1744, 2512, - 2750, 1746, 2511, - 2749, 1749, 2510, - 2748, 1753, 2509, - 2747, 1758, 2507, - 2745, 1764, 2505, - 2743, 1773, 2502, - 2740, 1785, 2499, - 2736, 1800, 2493, - 2730, 1819, 2486, - 2723, 1844, 2477, - 2713, 1875, 2464, - 2699, 1914, 2445, - 2680, 1961, 2420, - 2653, 2017, 2383, - 2614, 2083, 2329, - 2556, 2158, 2244, - 2466, 2242, 2099, - 2306, 2335, 1782, - 1932, 2435, 0, - 0, 2542, 0, - 0, 2654, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 2887, 1835, 2633, - 2886, 1836, 2633, - 2886, 1838, 2633, - 2886, 1839, 2632, - 2885, 1842, 2631, - 2884, 1845, 2630, - 2884, 1849, 2629, - 2882, 1855, 2628, - 2881, 1862, 2625, - 2878, 1872, 2623, - 2875, 1884, 2619, - 2871, 1900, 2613, - 2866, 1921, 2606, - 2859, 1948, 2596, - 2849, 1981, 2582, - 2835, 2021, 2564, - 2816, 2071, 2537, - 2789, 2130, 2499, - 2751, 2198, 2443, - 2694, 2275, 2355, - 2604, 2362, 2201, - 2447, 2457, 1852, - 2084, 2559, 0, - 0, 2668, 0, - 0, 2781, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3143, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 3021, 1937, 2757, - 3021, 1938, 2756, - 3021, 1939, 2756, - 3021, 1940, 2756, - 3020, 1942, 2755, - 3020, 1945, 2754, - 3019, 1948, 2754, - 3018, 1953, 2752, - 3017, 1959, 2751, - 3015, 1966, 2748, - 3013, 1977, 2745, - 3010, 1990, 2741, - 3006, 2007, 2736, - 3001, 2029, 2728, - 2994, 2057, 2718, - 2984, 2092, 2705, - 2970, 2134, 2685, - 2951, 2186, 2658, - 2924, 2247, 2619, - 2886, 2317, 2561, - 2830, 2397, 2470, - 2741, 2485, 2310, - 2586, 2582, 1931, - 2231, 2685, 0, - 0, 2795, 0, - 0, 2910, 0, - 0, 3028, 0, - 0, 3150, 0, - 0, 3274, 0, - 0, 3400, 0, - 0, 3527, 0, - 0, 3656, 0, - 3155, 2045, 2882, - 3155, 2046, 2882, - 3155, 2047, 2882, - 3155, 2048, 2881, - 3155, 2049, 2881, - 3154, 2051, 2880, - 3154, 2054, 2880, - 3153, 2057, 2879, - 3152, 2062, 2877, - 3151, 2068, 2876, - 3149, 2077, 2874, - 3147, 2087, 2870, - 3144, 2101, 2866, - 3140, 2119, 2861, - 3135, 2142, 2853, - 3128, 2171, 2843, - 3118, 2207, 2829, - 3104, 2251, 2809, - 3085, 2304, 2782, - 3059, 2367, 2742, - 3021, 2439, 2683, - 2965, 2520, 2589, - 2877, 2610, 2423, - 2723, 2708, 2020, - 2374, 2813, 0, - 0, 2924, 0, - 0, 3039, 0, - 0, 3158, 0, - 0, 3280, 0, - 0, 3405, 0, - 0, 3531, 0, - 0, 3659, 0, - 3289, 2158, 3009, - 3289, 2159, 3009, - 3289, 2160, 3009, - 3289, 2160, 3009, - 3288, 2162, 3008, - 3288, 2163, 3008, - 3288, 2165, 3007, - 3287, 2168, 3007, - 3287, 2172, 3006, - 3286, 2177, 3004, - 3285, 2183, 3003, - 3283, 2192, 3000, - 3281, 2203, 2997, - 3278, 2217, 2993, - 3274, 2236, 2988, - 3269, 2259, 2980, - 3261, 2289, 2969, - 3251, 2326, 2955, - 3238, 2372, 2935, - 3219, 2426, 2907, - 3193, 2490, 2867, - 3155, 2563, 2807, - 3099, 2646, 2711, - 3011, 2737, 2541, - 2859, 2836, 2116, - 2514, 2942, 0, - 0, 3053, 0, - 0, 3169, 0, - 0, 3289, 0, - 0, 3411, 0, - 0, 3536, 0, - 0, 3662, 0, - 3422, 2276, 3137, - 3422, 2276, 3137, - 3422, 2277, 3137, - 3422, 2278, 3137, - 3422, 2278, 3137, - 3422, 2280, 3136, - 3421, 2281, 3136, - 3421, 2283, 3135, - 3420, 2286, 3135, - 3420, 2290, 3134, - 3419, 2295, 3133, - 3418, 2302, 3131, - 3416, 2310, 3128, - 3414, 2322, 3125, - 3411, 2337, 3121, - 3407, 2356, 3115, - 3402, 2380, 3108, - 3394, 2411, 3097, - 3385, 2449, 3083, - 3371, 2495, 3063, - 3352, 2551, 3035, - 3326, 2615, 2994, - 3289, 2690, 2933, - 3233, 2773, 2836, - 3145, 2866, 2662, - 2994, 2965, 2219, - 2652, 3072, 0, - 0, 3183, 0, - 0, 3300, 0, - 0, 3420, 0, - 0, 3542, 0, - 0, 3667, 0, - 3555, 2397, 3267, - 3555, 2397, 3266, - 3555, 2398, 3266, - 3555, 2398, 3266, - 3555, 2399, 3266, - 3555, 2400, 3266, - 3555, 2401, 3266, - 3554, 2403, 3265, - 3554, 2405, 3265, - 3553, 2408, 3264, - 3553, 2412, 3263, - 3552, 2417, 3262, - 3551, 2423, 3260, - 3549, 2432, 3258, - 3547, 2444, 3254, - 3544, 2459, 3250, - 3540, 2479, 3245, - 3535, 2504, 3237, - 3527, 2535, 3226, - 3518, 2573, 3212, - 3504, 2621, 3191, - 3485, 2677, 3163, - 3459, 2742, 3122, - 3422, 2818, 3060, - 3366, 2902, 2962, - 3279, 2995, 2786, - 3128, 3095, 2329, - 2788, 3202, 0, - 0, 3314, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 3688, 2520, 3396, - 3688, 2521, 3396, - 3688, 2521, 3396, - 3688, 2521, 3396, - 3688, 2522, 3396, - 3688, 2522, 3396, - 3687, 2523, 3396, - 3687, 2525, 3395, - 3687, 2526, 3395, - 3687, 2529, 3394, - 3686, 2532, 3394, - 3685, 2536, 3393, - 3684, 2541, 3391, - 3683, 2548, 3390, - 3682, 2557, 3387, - 3679, 2569, 3384, - 3677, 2584, 3380, - 3673, 2604, 3374, - 3667, 2629, 3366, - 3660, 2661, 3356, - 3650, 2700, 3341, - 3637, 2748, 3321, - 3618, 2804, 3292, - 3592, 2871, 3251, - 3555, 2946, 3189, - 3499, 3031, 3090, - 3412, 3125, 2912, - 3262, 3225, 2443, - 2923, 3332, 0, - 0, 3445, 0, - 0, 3562, 0, - 0, 3682, 0, - 3820, 2646, 3527, - 3820, 2646, 3527, - 3820, 2646, 3527, - 3820, 2647, 3527, - 3820, 2647, 3527, - 3820, 2648, 3527, - 3820, 2648, 3526, - 3820, 2649, 3526, - 3820, 2651, 3526, - 3819, 2652, 3525, - 3819, 2654, 3525, - 3819, 2658, 3524, - 3818, 2662, 3523, - 3817, 2667, 3522, - 3816, 2674, 3520, - 3814, 2683, 3518, - 3812, 2695, 3515, - 3809, 2711, 3510, - 3805, 2731, 3505, - 3800, 2756, 3497, - 3793, 2788, 3486, - 3783, 2828, 3471, - 3769, 2876, 3451, - 3751, 2933, 3422, - 3725, 3000, 3381, - 3687, 3076, 3318, - 3632, 3161, 3219, - 3545, 3255, 3039, - 3395, 3356, 2562, - 3058, 3463, 0, - 0, 3576, 0, - 0, 3693, 0, - 3953, 2773, 3658, - 3953, 2773, 3658, - 3953, 2773, 3658, - 3953, 2774, 3658, - 3953, 2774, 3658, - 3953, 2774, 3658, - 3953, 2775, 3657, - 3953, 2776, 3657, - 3952, 2777, 3657, - 3952, 2778, 3657, - 3952, 2780, 3656, - 3952, 2782, 3656, - 3951, 2785, 3655, - 3950, 2789, 3654, - 3949, 2794, 3653, - 3948, 2801, 3651, - 3947, 2811, 3649, - 3944, 2823, 3645, - 3942, 2839, 3641, - 3938, 2859, 3635, - 3932, 2885, 3628, - 3925, 2917, 3617, - 3915, 2957, 3602, - 3902, 3005, 3582, - 3883, 3063, 3553, - 3857, 3130, 3511, - 3820, 3206, 3449, - 3764, 3292, 3349, - 3678, 3386, 3167, - 3528, 3487, 2683, - 3192, 3595, 0, - 0, 3708, 0, - 4085, 2901, 3789, - 4085, 2902, 3789, - 4085, 2902, 3789, - 4085, 2902, 3789, - 4085, 2902, 3789, - 4085, 2902, 3789, - 4085, 2903, 3789, - 4085, 2903, 3789, - 4085, 2904, 3788, - 4085, 2905, 3788, - 4085, 2906, 3788, - 4084, 2908, 3787, - 4084, 2910, 3787, - 4083, 2913, 3786, - 4083, 2918, 3785, - 4082, 2923, 3784, - 4081, 2930, 3782, - 4079, 2939, 3780, - 4077, 2952, 3777, - 4074, 2968, 3772, - 4070, 2988, 3767, - 4065, 3014, 3759, - 4058, 3046, 3748, - 4048, 3086, 3733, - 4034, 3135, 3713, - 4016, 3193, 3684, - 3990, 3260, 3642, - 3952, 3337, 3579, - 3897, 3423, 3479, - 3810, 3517, 3297, - 3660, 3618, 2807, - 3325, 3726, 0, - 4095, 3031, 3920, - 4095, 3031, 3920, - 4095, 3031, 3920, - 4095, 3031, 3920, - 4095, 3031, 3920, - 4095, 3031, 3920, - 4095, 3032, 3920, - 4095, 3032, 3920, - 4095, 3033, 3920, - 4095, 3033, 3920, - 4095, 3034, 3920, - 4095, 3036, 3919, - 4095, 3037, 3919, - 4095, 3040, 3918, - 4095, 3043, 3918, - 4095, 3047, 3917, - 4095, 3052, 3915, - 4095, 3060, 3914, - 4095, 3069, 3911, - 4095, 3081, 3908, - 4095, 3097, 3904, - 4095, 3118, 3898, - 4095, 3144, 3890, - 4095, 3176, 3879, - 4095, 3217, 3864, - 4095, 3265, 3844, - 4095, 3323, 3815, - 4095, 3391, 3773, - 4085, 3468, 3710, - 4029, 3554, 3610, - 3943, 3648, 3427, - 3793, 3750, 2933, - 4095, 3161, 4052, - 4095, 3161, 4052, - 4095, 3161, 4052, - 4095, 3161, 4052, - 4095, 3161, 4052, - 4095, 3161, 4052, - 4095, 3161, 4052, - 4095, 3162, 4052, - 4095, 3162, 4052, - 4095, 3163, 4052, - 4095, 3163, 4051, - 4095, 3164, 4051, - 4095, 3166, 4051, - 4095, 3168, 4050, - 4095, 3170, 4050, - 4095, 3173, 4049, - 4095, 3177, 4048, - 4095, 3183, 4047, - 4095, 3190, 4045, - 4095, 3199, 4043, - 4095, 3212, 4040, - 4095, 3228, 4035, - 4095, 3248, 4029, - 4095, 3274, 4022, - 4095, 3307, 4011, - 4095, 3347, 3996, - 4095, 3396, 3975, - 4095, 3454, 3946, - 4095, 3522, 3904, - 4095, 3599, 3841, - 4095, 3685, 3741, - 4075, 3780, 3557, - 0, 1347, 1608, - 0, 1350, 1606, - 0, 1354, 1602, - 0, 1359, 1597, - 0, 1365, 1590, - 0, 1374, 1581, - 0, 1386, 1569, - 0, 1401, 1552, - 0, 1421, 1528, - 0, 1446, 1494, - 0, 1477, 1444, - 0, 1516, 1367, - 0, 1563, 1239, - 0, 1619, 979, - 0, 1685, 0, - 0, 1760, 0, - 0, 1845, 0, - 0, 1938, 0, - 0, 2038, 0, - 0, 2145, 0, - 0, 2257, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1348, 1612, - 0, 1351, 1610, - 0, 1354, 1606, - 0, 1360, 1601, - 0, 1366, 1595, - 0, 1375, 1586, - 0, 1387, 1573, - 0, 1402, 1557, - 0, 1422, 1533, - 0, 1447, 1499, - 0, 1478, 1450, - 0, 1516, 1374, - 0, 1564, 1248, - 0, 1620, 995, - 0, 1685, 0, - 0, 1761, 0, - 0, 1845, 0, - 0, 1938, 0, - 0, 2038, 0, - 0, 2145, 0, - 0, 2257, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1349, 1618, - 0, 1352, 1615, - 0, 1356, 1611, - 0, 1361, 1607, - 0, 1368, 1600, - 0, 1377, 1591, - 0, 1388, 1579, - 0, 1403, 1563, - 0, 1423, 1539, - 0, 1448, 1506, - 0, 1479, 1457, - 0, 1517, 1383, - 0, 1564, 1260, - 0, 1620, 1015, - 0, 1686, 0, - 0, 1761, 0, - 0, 1845, 0, - 0, 1938, 0, - 0, 2038, 0, - 0, 2145, 0, - 0, 2257, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1351, 1625, - 0, 1354, 1622, - 0, 1358, 1619, - 0, 1363, 1614, - 0, 1369, 1607, - 0, 1378, 1599, - 0, 1390, 1587, - 0, 1405, 1570, - 0, 1424, 1548, - 0, 1449, 1515, - 0, 1480, 1467, - 0, 1519, 1395, - 0, 1565, 1275, - 0, 1621, 1041, - 0, 1687, 0, - 0, 1762, 0, - 0, 1846, 0, - 0, 1939, 0, - 0, 2039, 0, - 0, 2145, 0, - 0, 2258, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1353, 1634, - 0, 1356, 1631, - 0, 1360, 1628, - 0, 1365, 1623, - 0, 1372, 1617, - 0, 1381, 1608, - 0, 1392, 1597, - 0, 1407, 1581, - 0, 1426, 1558, - 0, 1451, 1527, - 0, 1482, 1480, - 0, 1520, 1410, - 0, 1567, 1295, - 0, 1623, 1074, - 0, 1688, 244, - 0, 1763, 0, - 0, 1847, 0, - 0, 1939, 0, - 0, 2039, 0, - 0, 2146, 0, - 0, 2258, 0, - 0, 2374, 0, - 0, 2494, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3386, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1356, 1646, - 0, 1359, 1643, - 0, 1363, 1640, - 0, 1368, 1636, - 0, 1375, 1629, - 0, 1383, 1621, - 0, 1395, 1610, - 0, 1410, 1594, - 0, 1429, 1573, - 0, 1453, 1542, - 0, 1484, 1497, - 0, 1522, 1430, - 0, 1569, 1320, - 0, 1624, 1114, - 0, 1690, 449, - 0, 1764, 0, - 0, 1848, 0, - 0, 1940, 0, - 0, 2040, 0, - 0, 2146, 0, - 0, 2258, 0, - 0, 2375, 0, - 0, 2495, 0, - 0, 2617, 0, - 0, 2742, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1360, 1662, - 0, 1363, 1659, - 0, 1367, 1656, - 0, 1372, 1652, - 0, 1379, 1646, - 0, 1387, 1638, - 0, 1399, 1627, - 0, 1414, 1612, - 0, 1433, 1591, - 0, 1457, 1561, - 0, 1487, 1519, - 0, 1525, 1455, - 0, 1572, 1351, - 0, 1627, 1162, - 0, 1692, 629, - 0, 1766, 0, - 0, 1849, 0, - 0, 1941, 0, - 0, 2041, 0, - 0, 2147, 0, - 0, 2259, 0, - 0, 2375, 0, - 0, 2495, 0, - 0, 2618, 0, - 0, 2743, 0, - 0, 2869, 0, - 0, 2997, 0, - 0, 3126, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3648, 0, - 0, 1366, 1682, - 0, 1369, 1679, - 0, 1373, 1676, - 0, 1377, 1672, - 0, 1384, 1666, - 0, 1393, 1659, - 0, 1404, 1648, - 0, 1418, 1634, - 0, 1437, 1614, - 0, 1461, 1586, - 0, 1492, 1546, - 0, 1529, 1486, - 0, 1575, 1390, - 0, 1630, 1220, - 0, 1694, 795, - 0, 1768, 0, - 0, 1851, 0, - 0, 1943, 0, - 0, 2042, 0, - 0, 2148, 0, - 0, 2260, 0, - 0, 2376, 0, - 0, 2495, 0, - 0, 2618, 0, - 0, 2743, 0, - 0, 2870, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3649, 0, - 0, 1373, 1707, - 0, 1376, 1705, - 0, 1380, 1702, - 0, 1385, 1698, - 0, 1391, 1693, - 0, 1399, 1686, - 0, 1411, 1676, - 0, 1425, 1662, - 0, 1444, 1644, - 0, 1467, 1618, - 0, 1497, 1580, - 0, 1534, 1525, - 0, 1580, 1438, - 0, 1634, 1287, - 0, 1698, 950, - 0, 1771, 0, - 0, 1854, 0, - 0, 1945, 0, - 0, 2044, 0, - 0, 2149, 0, - 0, 2261, 0, - 0, 2377, 0, - 0, 2496, 0, - 0, 2619, 0, - 0, 2743, 0, - 0, 2870, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3256, 0, - 0, 3387, 0, - 0, 3517, 0, - 0, 3649, 0, - 817, 1383, 1739, - 796, 1385, 1737, - 767, 1389, 1734, - 725, 1394, 1731, - 662, 1400, 1726, - 560, 1408, 1719, - 375, 1419, 1710, - 0, 1433, 1698, - 0, 1452, 1680, - 0, 1475, 1656, - 0, 1504, 1622, - 0, 1541, 1572, - 0, 1586, 1494, - 0, 1639, 1364, - 0, 1702, 1098, - 0, 1775, 0, - 0, 1857, 0, - 0, 1948, 0, - 0, 2046, 0, - 0, 2151, 0, - 0, 2262, 0, - 0, 2378, 0, - 0, 2497, 0, - 0, 2619, 0, - 0, 2744, 0, - 0, 2870, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 1204, 1395, 1779, - 1195, 1398, 1777, - 1183, 1401, 1775, - 1166, 1406, 1771, - 1143, 1412, 1767, - 1111, 1420, 1761, - 1063, 1431, 1752, - 990, 1445, 1741, - 870, 1462, 1725, - 635, 1485, 1704, - 0, 1514, 1673, - 0, 1550, 1628, - 0, 1594, 1560, - 0, 1646, 1450, - 0, 1709, 1243, - 0, 1780, 567, - 0, 1861, 0, - 0, 1951, 0, - 0, 2049, 0, - 0, 2154, 0, - 0, 2264, 0, - 0, 2379, 0, - 0, 2498, 0, - 0, 2620, 0, - 0, 2744, 0, - 0, 2871, 0, - 0, 2998, 0, - 0, 3127, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 1462, 1411, 1827, - 1457, 1414, 1825, - 1450, 1417, 1823, - 1441, 1422, 1820, - 1429, 1428, 1816, - 1412, 1436, 1811, - 1388, 1446, 1803, - 1354, 1459, 1793, - 1304, 1476, 1779, - 1227, 1498, 1760, - 1098, 1526, 1733, - 836, 1561, 1694, - 0, 1604, 1636, - 0, 1656, 1544, - 0, 1717, 1383, - 0, 1787, 1003, - 0, 1867, 0, - 0, 1956, 0, - 0, 2053, 0, - 0, 2157, 0, - 0, 2266, 0, - 0, 2381, 0, - 0, 2499, 0, - 0, 2621, 0, - 0, 2745, 0, - 0, 2871, 0, - 0, 2999, 0, - 0, 3128, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 1670, 1432, 1884, - 1667, 1435, 1883, - 1663, 1438, 1881, - 1657, 1442, 1878, - 1649, 1448, 1875, - 1639, 1455, 1870, - 1624, 1465, 1863, - 1604, 1478, 1854, - 1576, 1494, 1842, - 1536, 1516, 1826, - 1475, 1543, 1802, - 1378, 1576, 1769, - 1206, 1618, 1720, - 769, 1668, 1646, - 0, 1728, 1522, - 0, 1797, 1276, - 0, 1875, 0, - 0, 1962, 0, - 0, 2058, 0, - 0, 2161, 0, - 0, 2270, 0, - 0, 2383, 0, - 0, 2501, 0, - 0, 2623, 0, - 0, 2746, 0, - 0, 2872, 0, - 0, 3000, 0, - 0, 3128, 0, - 0, 3257, 0, - 0, 3387, 0, - 0, 3518, 0, - 0, 3649, 0, - 1851, 1458, 1951, - 1849, 1461, 1950, - 1847, 1464, 1948, - 1843, 1468, 1946, - 1838, 1473, 1943, - 1831, 1480, 1939, - 1821, 1490, 1933, - 1809, 1502, 1925, - 1791, 1517, 1915, - 1766, 1538, 1901, - 1730, 1563, 1881, - 1678, 1596, 1853, - 1597, 1636, 1813, - 1459, 1684, 1753, - 1167, 1741, 1659, - 0, 1809, 1491, - 0, 1885, 1074, - 0, 1971, 0, - 0, 2065, 0, - 0, 2166, 0, - 0, 2274, 0, - 0, 2387, 0, - 0, 2504, 0, - 0, 2625, 0, - 0, 2748, 0, - 0, 2873, 0, - 0, 3000, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 2017, 1491, 2027, - 2016, 1494, 2026, - 2014, 1496, 2025, - 2011, 1500, 2023, - 2008, 1505, 2020, - 2003, 1512, 2017, - 1997, 1520, 2012, - 1988, 1532, 2006, - 1976, 1547, 1997, - 1960, 1566, 1985, - 1937, 1590, 1969, - 1904, 1620, 1946, - 1856, 1658, 1914, - 1784, 1704, 1867, - 1664, 1759, 1794, - 1430, 1824, 1676, - 367, 1898, 1445, - 0, 1982, 454, - 0, 2074, 0, - 0, 2173, 0, - 0, 2279, 0, - 0, 2391, 0, - 0, 2507, 0, - 0, 2627, 0, - 0, 2750, 0, - 0, 2875, 0, - 0, 3002, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 2173, 1532, 2113, - 2172, 1534, 2112, - 2171, 1537, 2111, - 2169, 1540, 2109, - 2166, 1545, 2107, - 2163, 1551, 2104, - 2158, 1559, 2100, - 2152, 1569, 2095, - 2144, 1583, 2088, - 2133, 1600, 2078, - 2117, 1623, 2065, - 2096, 1651, 2047, - 2065, 1687, 2021, - 2021, 1730, 1984, - 1953, 1782, 1929, - 1844, 1844, 1844, - 1639, 1915, 1698, - 988, 1996, 1375, - 0, 2085, 0, - 0, 2183, 0, - 0, 2287, 0, - 0, 2397, 0, - 0, 2512, 0, - 0, 2631, 0, - 0, 2753, 0, - 0, 2877, 0, - 0, 3003, 0, - 0, 3131, 0, - 0, 3259, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 2322, 1581, 2206, - 2321, 1583, 2206, - 2320, 1585, 2205, - 2319, 1588, 2204, - 2317, 1593, 2202, - 2315, 1598, 2199, - 2312, 1605, 2196, - 2307, 1615, 2192, - 2301, 1627, 2186, - 2293, 1643, 2179, - 2283, 1663, 2168, - 2268, 1690, 2153, - 2247, 1722, 2133, - 2218, 1763, 2105, - 2175, 1811, 2063, - 2111, 1870, 2001, - 2009, 1937, 1903, - 1822, 2014, 1725, - 1302, 2100, 1261, - 0, 2195, 0, - 0, 2297, 0, - 0, 2405, 0, - 0, 2518, 0, - 0, 2635, 0, - 0, 2756, 0, - 0, 2880, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2466, 1640, 2308, - 2466, 1641, 2307, - 2465, 1643, 2306, - 2464, 1646, 2305, - 2463, 1650, 2304, - 2461, 1655, 2302, - 2459, 1661, 2299, - 2456, 1669, 2296, - 2451, 1680, 2292, - 2446, 1694, 2285, - 2438, 1713, 2277, - 2427, 1736, 2266, - 2413, 1766, 2250, - 2393, 1803, 2228, - 2364, 1848, 2197, - 2323, 1902, 2152, - 2262, 1965, 2083, - 2164, 2038, 1971, - 1988, 2120, 1760, - 1534, 2211, 1044, - 0, 2309, 0, - 0, 2415, 0, - 0, 2526, 0, - 0, 2641, 0, - 0, 2761, 0, - 0, 2883, 0, - 0, 3008, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 2607, 1708, 2415, - 2607, 1709, 2415, - 2607, 1711, 2414, - 2606, 1713, 2413, - 2605, 1716, 2412, - 2604, 1721, 2411, - 2602, 1726, 2409, - 2600, 1733, 2406, - 2597, 1743, 2402, - 2592, 1755, 2398, - 2587, 1771, 2391, - 2579, 1792, 2382, - 2569, 1818, 2370, - 2555, 1851, 2353, - 2535, 1892, 2330, - 2507, 1941, 2297, - 2467, 1999, 2248, - 2407, 2067, 2173, - 2313, 2145, 2049, - 2144, 2231, 1802, - 1729, 2326, 267, - 0, 2428, 0, - 0, 2536, 0, - 0, 2649, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3011, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 2746, 1785, 2528, - 2746, 1786, 2528, - 2745, 1788, 2527, - 2745, 1790, 2526, - 2744, 1793, 2526, - 2743, 1796, 2524, - 2742, 1801, 2523, - 2740, 1807, 2521, - 2738, 1815, 2518, - 2735, 1826, 2514, - 2731, 1839, 2509, - 2726, 1857, 2502, - 2718, 1880, 2493, - 2708, 1909, 2480, - 2694, 1945, 2463, - 2674, 1989, 2438, - 2647, 2042, 2403, - 2608, 2104, 2351, - 2549, 2176, 2271, - 2457, 2257, 2136, - 2294, 2347, 1853, - 1903, 2445, 0, - 0, 2549, 0, - 0, 2660, 0, - 0, 2775, 0, - 0, 2894, 0, - 0, 3016, 0, - 0, 3141, 0, - 0, 3267, 0, - 0, 3395, 0, - 0, 3523, 0, - 0, 3653, 0, - 2883, 1872, 2645, - 2883, 1873, 2645, - 2883, 1874, 2644, - 2882, 1876, 2644, - 2882, 1878, 2643, - 2881, 1881, 2642, - 2880, 1885, 2641, - 2879, 1890, 2640, - 2877, 1897, 2637, - 2875, 1905, 2635, - 2872, 1917, 2631, - 2868, 1932, 2625, - 2862, 1952, 2618, - 2855, 1976, 2609, - 2845, 2008, 2596, - 2831, 2046, 2577, - 2812, 2093, 2552, - 2785, 2149, 2515, - 2746, 2215, 2461, - 2688, 2290, 2376, - 2598, 2374, 2231, - 2438, 2467, 1914, - 2064, 2567, 0, - 0, 2674, 0, - 0, 2786, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3271, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 3019, 1967, 2766, - 3019, 1967, 2765, - 3018, 1968, 2765, - 3018, 1970, 2765, - 3018, 1971, 2764, - 3017, 1974, 2763, - 3017, 1977, 2763, - 3016, 1981, 2761, - 3014, 1987, 2760, - 3013, 1994, 2758, - 3011, 2004, 2755, - 3008, 2016, 2751, - 3004, 2032, 2745, - 2998, 2053, 2738, - 2991, 2080, 2728, - 2981, 2113, 2715, - 2967, 2154, 2696, - 2948, 2203, 2669, - 2921, 2262, 2631, - 2883, 2330, 2575, - 2826, 2408, 2487, - 2736, 2494, 2334, - 2580, 2589, 1984, - 2216, 2691, 0, - 0, 2800, 0, - 0, 2913, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3275, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3154, 2069, 2889, - 3153, 2069, 2889, - 3153, 2070, 2888, - 3153, 2071, 2888, - 3153, 2072, 2888, - 3152, 2074, 2887, - 3152, 2077, 2887, - 3151, 2080, 2886, - 3150, 2085, 2884, - 3149, 2091, 2883, - 3147, 2098, 2881, - 3145, 2109, 2878, - 3142, 2122, 2873, - 3138, 2139, 2868, - 3133, 2161, 2861, - 3126, 2189, 2850, - 3116, 2224, 2837, - 3102, 2266, 2817, - 3083, 2318, 2790, - 3057, 2379, 2751, - 3018, 2449, 2693, - 2962, 2529, 2602, - 2873, 2617, 2442, - 2718, 2714, 2063, - 2363, 2818, 0, - 0, 2927, 0, - 0, 3042, 0, - 0, 3160, 0, - 0, 3282, 0, - 0, 3406, 0, - 0, 3532, 0, - 0, 3659, 0, - 3288, 2177, 3014, - 3288, 2177, 3014, - 3287, 2178, 3014, - 3287, 2179, 3014, - 3287, 2180, 3013, - 3287, 2181, 3013, - 3286, 2183, 3012, - 3286, 2186, 3012, - 3285, 2190, 3011, - 3284, 2194, 3010, - 3283, 2200, 3008, - 3281, 2209, 3006, - 3279, 2219, 3003, - 3276, 2233, 2998, - 3272, 2251, 2993, - 3267, 2274, 2985, - 3260, 2303, 2975, - 3250, 2339, 2961, - 3236, 2383, 2941, - 3217, 2437, 2914, - 3191, 2499, 2874, - 3153, 2571, 2815, - 3097, 2652, 2721, - 3009, 2743, 2556, - 2855, 2840, 2152, - 2506, 2945, 0, - 0, 3056, 0, - 0, 3171, 0, - 0, 3290, 0, - 0, 3412, 0, - 0, 3537, 0, - 0, 3663, 0, - 3421, 2290, 3141, - 3421, 2291, 3141, - 3421, 2291, 3141, - 3421, 2292, 3141, - 3421, 2293, 3141, - 3421, 2294, 3140, - 3420, 2295, 3140, - 3420, 2297, 3139, - 3419, 2300, 3139, - 3419, 2304, 3138, - 3418, 2309, 3136, - 3417, 2315, 3135, - 3415, 2324, 3132, - 3413, 2335, 3129, - 3410, 2349, 3125, - 3406, 2368, 3120, - 3401, 2392, 3112, - 3393, 2421, 3102, - 3384, 2459, 3087, - 3370, 2504, 3067, - 3351, 2558, 3039, - 3325, 2622, 2999, - 3287, 2696, 2939, - 3231, 2778, 2844, - 3143, 2869, 2673, - 2991, 2968, 2248, - 2646, 3074, 0, - 0, 3185, 0, - 0, 3301, 0, - 0, 3421, 0, - 0, 3543, 0, - 0, 3668, 0, - 3554, 2408, 3269, - 3554, 2408, 3269, - 3554, 2408, 3269, - 3554, 2409, 3269, - 3554, 2410, 3269, - 3554, 2411, 3269, - 3554, 2412, 3268, - 3553, 2413, 3268, - 3553, 2416, 3268, - 3553, 2418, 3267, - 3552, 2422, 3266, - 3551, 2427, 3265, - 3550, 2434, 3263, - 3548, 2443, 3261, - 3546, 2454, 3257, - 3543, 2469, 3253, - 3539, 2488, 3248, - 3534, 2512, 3240, - 3527, 2543, 3229, - 3517, 2581, 3215, - 3503, 2627, 3195, - 3485, 2683, 3167, - 3458, 2747, 3126, - 3421, 2822, 3065, - 3365, 2905, 2968, - 3277, 2998, 2794, - 3126, 3097, 2352, - 2784, 3204, 0, - 0, 3315, 0, - 0, 3432, 0, - 0, 3552, 0, - 0, 3674, 0, - 3687, 2529, 3399, - 3687, 2529, 3399, - 3687, 2529, 3399, - 3687, 2530, 3398, - 3687, 2530, 3398, - 3687, 2531, 3398, - 3687, 2532, 3398, - 3687, 2533, 3398, - 3686, 2535, 3397, - 3686, 2537, 3397, - 3685, 2540, 3396, - 3685, 2544, 3395, - 3684, 2549, 3394, - 3683, 2556, 3392, - 3681, 2565, 3390, - 3679, 2576, 3387, - 3676, 2591, 3382, - 3672, 2611, 3377, - 3667, 2636, 3369, - 3660, 2667, 3358, - 3650, 2706, 3344, - 3636, 2753, 3324, - 3618, 2809, 3295, - 3591, 2874, 3254, - 3554, 2950, 3192, - 3498, 3034, 3094, - 3411, 3127, 2918, - 3260, 3227, 2461, - 2920, 3334, 0, - 0, 3446, 0, - 0, 3563, 0, - 0, 3683, 0, - 3820, 2652, 3529, - 3820, 2652, 3529, - 3820, 2653, 3528, - 3820, 2653, 3528, - 3820, 2653, 3528, - 3820, 2654, 3528, - 3820, 2655, 3528, - 3820, 2656, 3528, - 3819, 2657, 3528, - 3819, 2658, 3527, - 3819, 2661, 3527, - 3818, 2664, 3526, - 3817, 2668, 3525, - 3817, 2673, 3524, - 3815, 2680, 3522, - 3814, 2689, 3519, - 3812, 2701, 3516, - 3809, 2716, 3512, - 3805, 2736, 3506, - 3799, 2761, 3499, - 3792, 2793, 3488, - 3782, 2832, 3473, - 3769, 2880, 3453, - 3750, 2936, 3424, - 3724, 3003, 3383, - 3687, 3078, 3321, - 3631, 3163, 3222, - 3544, 3257, 3044, - 3394, 3357, 2575, - 3056, 3465, 0, - 0, 3577, 0, - 0, 3694, 0, - 3953, 2778, 3659, - 3953, 2778, 3659, - 3953, 2778, 3659, - 3953, 2778, 3659, - 3952, 2779, 3659, - 3952, 2779, 3659, - 3952, 2780, 3659, - 3952, 2780, 3658, - 3952, 2781, 3658, - 3952, 2783, 3658, - 3952, 2784, 3658, - 3951, 2787, 3657, - 3951, 2790, 3656, - 3950, 2794, 3655, - 3949, 2799, 3654, - 3948, 2806, 3652, - 3946, 2815, 3650, - 3944, 2827, 3647, - 3941, 2843, 3642, - 3937, 2863, 3637, - 3932, 2888, 3629, - 3925, 2920, 3618, - 3915, 2960, 3604, - 3902, 3008, 3583, - 3883, 3065, 3554, - 3857, 3132, 3513, - 3819, 3208, 3450, - 3764, 3293, 3351, - 3677, 3387, 3171, - 3527, 3488, 2694, - 3190, 3596, 0, - 0, 3708, 0, - 4085, 2905, 3790, - 4085, 2905, 3790, - 4085, 2905, 3790, - 4085, 2905, 3790, - 4085, 2906, 3790, - 4085, 2906, 3790, - 4085, 2906, 3790, - 4085, 2907, 3789, - 4085, 2908, 3789, - 4084, 2909, 3789, - 4084, 2910, 3789, - 4084, 2912, 3788, - 4084, 2914, 3788, - 4083, 2917, 3787, - 4082, 2921, 3786, - 4082, 2926, 3785, - 4080, 2933, 3783, - 4079, 2943, 3781, - 4077, 2955, 3778, - 4074, 2971, 3773, - 4070, 2991, 3768, - 4064, 3017, 3760, - 4057, 3049, 3749, - 4047, 3089, 3734, - 4034, 3137, 3714, - 4015, 3195, 3685, - 3989, 3262, 3643, - 3952, 3338, 3581, - 3896, 3424, 3481, - 3810, 3518, 3299, - 3660, 3619, 2815, - 3324, 3727, 0, - 4095, 3033, 3921, - 4095, 3034, 3921, - 4095, 3034, 3921, - 4095, 3034, 3921, - 4095, 3034, 3921, - 4095, 3034, 3921, - 4095, 3034, 3921, - 4095, 3035, 3921, - 4095, 3035, 3921, - 4095, 3036, 3920, - 4095, 3037, 3920, - 4095, 3038, 3920, - 4095, 3040, 3920, - 4095, 3042, 3919, - 4095, 3046, 3918, - 4095, 3050, 3917, - 4095, 3055, 3916, - 4095, 3062, 3914, - 4095, 3072, 3912, - 4095, 3084, 3909, - 4095, 3100, 3904, - 4095, 3120, 3899, - 4095, 3146, 3891, - 4095, 3178, 3880, - 4095, 3218, 3865, - 4095, 3267, 3845, - 4095, 3325, 3816, - 4095, 3392, 3774, - 4084, 3469, 3711, - 4029, 3555, 3611, - 3942, 3649, 3429, - 3793, 3751, 2939, - 4095, 3163, 4053, - 4095, 3163, 4052, - 4095, 3163, 4052, - 4095, 3163, 4052, - 4095, 3163, 4052, - 4095, 3163, 4052, - 4095, 3164, 4052, - 4095, 3164, 4052, - 4095, 3164, 4052, - 4095, 3165, 4052, - 4095, 3166, 4052, - 4095, 3167, 4052, - 4095, 3168, 4051, - 4095, 3170, 4051, - 4095, 3172, 4050, - 4095, 3175, 4050, - 4095, 3179, 4049, - 4095, 3185, 4047, - 4095, 3192, 4046, - 4095, 3201, 4043, - 4095, 3213, 4040, - 4095, 3229, 4036, - 4095, 3250, 4030, - 4095, 3276, 4022, - 4095, 3308, 4011, - 4095, 3349, 3997, - 4095, 3397, 3976, - 4095, 3455, 3947, - 4095, 3523, 3905, - 4095, 3600, 3842, - 4095, 3686, 3742, - 4075, 3780, 3559, - 0, 1476, 1739, - 0, 1478, 1737, - 0, 1481, 1735, - 0, 1485, 1731, - 0, 1490, 1726, - 0, 1497, 1719, - 0, 1506, 1710, - 0, 1518, 1698, - 0, 1533, 1681, - 0, 1552, 1657, - 0, 1577, 1622, - 0, 1609, 1572, - 0, 1647, 1494, - 0, 1695, 1365, - 0, 1751, 1099, - 0, 1817, 0, - 0, 1892, 0, - 0, 1976, 0, - 0, 2069, 0, - 0, 2170, 0, - 0, 2277, 0, - 0, 2389, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3518, 0, - 0, 3649, 0, - 0, 1477, 1742, - 0, 1479, 1740, - 0, 1482, 1738, - 0, 1486, 1734, - 0, 1491, 1729, - 0, 1498, 1723, - 0, 1507, 1713, - 0, 1518, 1701, - 0, 1533, 1684, - 0, 1553, 1660, - 0, 1578, 1626, - 0, 1609, 1576, - 0, 1648, 1500, - 0, 1695, 1371, - 0, 1751, 1111, - 0, 1817, 0, - 0, 1892, 0, - 0, 1977, 0, - 0, 2070, 0, - 0, 2170, 0, - 0, 2277, 0, - 0, 2389, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1478, 1746, - 0, 1480, 1744, - 0, 1483, 1742, - 0, 1487, 1738, - 0, 1492, 1733, - 0, 1499, 1727, - 0, 1507, 1718, - 0, 1519, 1706, - 0, 1534, 1689, - 0, 1554, 1665, - 0, 1579, 1631, - 0, 1610, 1582, - 0, 1649, 1506, - 0, 1696, 1380, - 0, 1752, 1127, - 0, 1818, 0, - 0, 1893, 0, - 0, 1977, 0, - 0, 2070, 0, - 0, 2170, 0, - 0, 2277, 0, - 0, 2389, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1479, 1752, - 0, 1481, 1750, - 0, 1484, 1747, - 0, 1488, 1744, - 0, 1493, 1739, - 0, 1500, 1732, - 0, 1509, 1723, - 0, 1520, 1711, - 0, 1535, 1695, - 0, 1555, 1671, - 0, 1580, 1638, - 0, 1611, 1590, - 0, 1650, 1515, - 0, 1696, 1392, - 0, 1753, 1147, - 0, 1818, 0, - 0, 1893, 0, - 0, 1978, 0, - 0, 2070, 0, - 0, 2171, 0, - 0, 2277, 0, - 0, 2389, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1481, 1759, - 0, 1483, 1757, - 0, 1486, 1754, - 0, 1490, 1751, - 0, 1495, 1746, - 0, 1502, 1740, - 0, 1510, 1731, - 0, 1522, 1719, - 0, 1537, 1703, - 0, 1556, 1680, - 0, 1581, 1647, - 0, 1612, 1600, - 0, 1651, 1527, - 0, 1698, 1407, - 0, 1754, 1173, - 0, 1819, 122, - 0, 1894, 0, - 0, 1978, 0, - 0, 2071, 0, - 0, 2171, 0, - 0, 2278, 0, - 0, 2390, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1483, 1768, - 0, 1485, 1766, - 0, 1488, 1763, - 0, 1492, 1760, - 0, 1497, 1755, - 0, 1504, 1749, - 0, 1513, 1741, - 0, 1524, 1729, - 0, 1539, 1713, - 0, 1558, 1691, - 0, 1583, 1659, - 0, 1614, 1612, - 0, 1652, 1542, - 0, 1699, 1427, - 0, 1755, 1206, - 0, 1820, 376, - 0, 1895, 0, - 0, 1979, 0, - 0, 2071, 0, - 0, 2171, 0, - 0, 2278, 0, - 0, 2390, 0, - 0, 2506, 0, - 0, 2626, 0, - 0, 2749, 0, - 0, 2874, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1486, 1780, - 0, 1488, 1778, - 0, 1491, 1776, - 0, 1495, 1772, - 0, 1500, 1768, - 0, 1507, 1762, - 0, 1516, 1753, - 0, 1527, 1742, - 0, 1542, 1726, - 0, 1561, 1705, - 0, 1586, 1674, - 0, 1616, 1629, - 0, 1655, 1562, - 0, 1701, 1452, - 0, 1757, 1246, - 0, 1822, 581, - 0, 1896, 0, - 0, 1980, 0, - 0, 2072, 0, - 0, 2172, 0, - 0, 2279, 0, - 0, 2390, 0, - 0, 2507, 0, - 0, 2627, 0, - 0, 2750, 0, - 0, 2875, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3258, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1490, 1795, - 0, 1493, 1794, - 0, 1495, 1791, - 0, 1499, 1788, - 0, 1504, 1784, - 0, 1511, 1778, - 0, 1519, 1770, - 0, 1531, 1759, - 0, 1546, 1744, - 0, 1565, 1723, - 0, 1589, 1694, - 0, 1620, 1651, - 0, 1657, 1587, - 0, 1704, 1484, - 0, 1759, 1294, - 0, 1824, 762, - 0, 1898, 0, - 0, 1981, 0, - 0, 2073, 0, - 0, 2173, 0, - 0, 2279, 0, - 0, 2391, 0, - 0, 2507, 0, - 0, 2627, 0, - 0, 2750, 0, - 0, 2875, 0, - 0, 3001, 0, - 0, 3129, 0, - 0, 3259, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1496, 1815, - 0, 1498, 1814, - 0, 1501, 1811, - 0, 1505, 1808, - 0, 1510, 1804, - 0, 1516, 1799, - 0, 1525, 1791, - 0, 1536, 1781, - 0, 1551, 1766, - 0, 1569, 1746, - 0, 1593, 1718, - 0, 1624, 1678, - 0, 1661, 1618, - 0, 1707, 1522, - 0, 1762, 1352, - 0, 1826, 927, - 0, 1900, 0, - 0, 1983, 0, - 0, 2075, 0, - 0, 2174, 0, - 0, 2280, 0, - 0, 2392, 0, - 0, 2508, 0, - 0, 2628, 0, - 0, 2750, 0, - 0, 2875, 0, - 0, 3002, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3649, 0, - 0, 1503, 1841, - 0, 1505, 1839, - 0, 1508, 1837, - 0, 1512, 1834, - 0, 1517, 1830, - 0, 1523, 1825, - 0, 1532, 1818, - 0, 1543, 1808, - 0, 1557, 1795, - 0, 1576, 1776, - 0, 1599, 1750, - 0, 1629, 1712, - 0, 1666, 1657, - 0, 1712, 1570, - 0, 1766, 1419, - 0, 1830, 1082, - 0, 1903, 0, - 0, 1986, 0, - 0, 2077, 0, - 0, 2176, 0, - 0, 2282, 0, - 0, 2393, 0, - 0, 2509, 0, - 0, 2628, 0, - 0, 2751, 0, - 0, 2875, 0, - 0, 3002, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3388, 0, - 0, 3519, 0, - 0, 3650, 0, - 964, 1513, 1873, - 949, 1515, 1871, - 928, 1518, 1869, - 899, 1521, 1867, - 857, 1526, 1863, - 794, 1532, 1858, - 692, 1541, 1851, - 507, 1551, 1842, - 0, 1566, 1830, - 0, 1584, 1813, - 0, 1607, 1788, - 0, 1637, 1754, - 0, 1673, 1704, - 0, 1718, 1626, - 0, 1771, 1496, - 0, 1835, 1231, - 0, 1907, 0, - 0, 1989, 0, - 0, 2080, 0, - 0, 2178, 0, - 0, 2283, 0, - 0, 2394, 0, - 0, 2510, 0, - 0, 2629, 0, - 0, 2751, 0, - 0, 2876, 0, - 0, 3002, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 1342, 1525, 1912, - 1336, 1527, 1911, - 1327, 1530, 1909, - 1315, 1533, 1907, - 1299, 1538, 1903, - 1276, 1544, 1899, - 1243, 1552, 1893, - 1195, 1563, 1884, - 1123, 1577, 1873, - 1003, 1595, 1857, - 767, 1617, 1836, - 0, 1646, 1805, - 0, 1682, 1760, - 0, 1726, 1692, - 0, 1779, 1582, - 0, 1841, 1375, - 0, 1912, 699, - 0, 1994, 0, - 0, 2083, 0, - 0, 2181, 0, - 0, 2286, 0, - 0, 2396, 0, - 0, 2511, 0, - 0, 2630, 0, - 0, 2752, 0, - 0, 2877, 0, - 0, 3003, 0, - 0, 3130, 0, - 0, 3259, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 1598, 1542, 1960, - 1594, 1543, 1959, - 1589, 1546, 1957, - 1582, 1549, 1955, - 1573, 1554, 1952, - 1561, 1560, 1948, - 1544, 1568, 1943, - 1520, 1578, 1935, - 1486, 1591, 1925, - 1436, 1608, 1911, - 1359, 1631, 1892, - 1230, 1659, 1865, - 968, 1693, 1826, - 0, 1736, 1768, - 0, 1788, 1676, - 0, 1849, 1516, - 0, 1919, 1135, - 0, 1999, 0, - 0, 2088, 0, - 0, 2185, 0, - 0, 2289, 0, - 0, 2398, 0, - 0, 2513, 0, - 0, 2632, 0, - 0, 2753, 0, - 0, 2877, 0, - 0, 3003, 0, - 0, 3131, 0, - 0, 3260, 0, - 0, 3389, 0, - 0, 3519, 0, - 0, 3650, 0, - 1804, 1562, 2017, - 1802, 1564, 2016, - 1799, 1567, 2015, - 1795, 1570, 2013, - 1789, 1574, 2010, - 1781, 1580, 2007, - 1771, 1587, 2002, - 1756, 1597, 1995, - 1737, 1610, 1987, - 1708, 1626, 1974, - 1668, 1648, 1958, - 1607, 1675, 1934, - 1511, 1708, 1901, - 1338, 1750, 1852, - 901, 1800, 1778, - 0, 1860, 1654, - 0, 1929, 1408, - 0, 2007, 0, - 0, 2095, 0, - 0, 2190, 0, - 0, 2293, 0, - 0, 2402, 0, - 0, 2515, 0, - 0, 2633, 0, - 0, 2755, 0, - 0, 2878, 0, - 0, 3004, 0, - 0, 3132, 0, - 0, 3260, 0, - 0, 3389, 0, - 0, 3520, 0, - 0, 3650, 0, - 1985, 1589, 2084, - 1983, 1591, 2083, - 1981, 1593, 2082, - 1979, 1596, 2080, - 1975, 1600, 2078, - 1970, 1605, 2075, - 1963, 1612, 2071, - 1953, 1622, 2065, - 1941, 1634, 2058, - 1923, 1650, 2047, - 1898, 1670, 2033, - 1862, 1695, 2013, - 1810, 1728, 1985, - 1729, 1768, 1945, - 1591, 1816, 1886, - 1299, 1874, 1791, - 0, 1941, 1623, - 0, 2017, 1207, - 0, 2103, 0, - 0, 2197, 0, - 0, 2298, 0, - 0, 2406, 0, - 0, 2519, 0, - 0, 2636, 0, - 0, 2757, 0, - 0, 2880, 0, - 0, 3005, 0, - 0, 3132, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3650, 0, - 2150, 1622, 2160, - 2149, 1623, 2159, - 2148, 1626, 2158, - 2146, 1628, 2157, - 2143, 1632, 2155, - 2140, 1637, 2152, - 2135, 1644, 2149, - 2129, 1653, 2144, - 2120, 1664, 2138, - 2108, 1679, 2129, - 2092, 1698, 2117, - 2069, 1722, 2101, - 2036, 1752, 2078, - 1989, 1790, 2046, - 1916, 1836, 1999, - 1796, 1892, 1927, - 1562, 1956, 1808, - 499, 2030, 1577, - 0, 2114, 586, - 0, 2206, 0, - 0, 2305, 0, - 0, 2412, 0, - 0, 2523, 0, - 0, 2639, 0, - 0, 2759, 0, - 0, 2882, 0, - 0, 3007, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3520, 0, - 0, 3651, 0, - 2306, 1663, 2246, - 2305, 1664, 2245, - 2304, 1666, 2244, - 2303, 1669, 2243, - 2301, 1672, 2241, - 2298, 1677, 2239, - 2295, 1683, 2236, - 2291, 1691, 2232, - 2284, 1701, 2227, - 2276, 1715, 2220, - 2265, 1732, 2210, - 2249, 1755, 2197, - 2228, 1783, 2179, - 2197, 1819, 2153, - 2153, 1862, 2116, - 2085, 1915, 2061, - 1976, 1976, 1976, - 1771, 2047, 1830, - 1120, 2128, 1507, - 0, 2217, 0, - 0, 2315, 0, - 0, 2419, 0, - 0, 2529, 0, - 0, 2644, 0, - 0, 2763, 0, - 0, 2885, 0, - 0, 3009, 0, - 0, 3135, 0, - 0, 3263, 0, - 0, 3392, 0, - 0, 3521, 0, - 0, 3651, 0, - 2455, 1712, 2339, - 2454, 1713, 2339, - 2453, 1715, 2338, - 2452, 1717, 2337, - 2451, 1721, 2336, - 2449, 1725, 2334, - 2447, 1730, 2332, - 2444, 1737, 2328, - 2439, 1747, 2324, - 2434, 1759, 2318, - 2426, 1775, 2311, - 2415, 1796, 2300, - 2400, 1822, 2285, - 2379, 1854, 2265, - 2350, 1895, 2237, - 2307, 1944, 2195, - 2243, 2002, 2134, - 2141, 2069, 2035, - 1954, 2146, 1857, - 1434, 2233, 1394, - 0, 2327, 0, - 0, 2429, 0, - 0, 2537, 0, - 0, 2650, 0, - 0, 2767, 0, - 0, 2888, 0, - 0, 3012, 0, - 0, 3137, 0, - 0, 3264, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 2599, 1771, 2440, - 2598, 1772, 2440, - 2598, 1773, 2439, - 2597, 1775, 2438, - 2596, 1778, 2437, - 2595, 1782, 2436, - 2593, 1787, 2434, - 2591, 1793, 2432, - 2588, 1801, 2428, - 2584, 1812, 2424, - 2578, 1827, 2418, - 2570, 1845, 2409, - 2560, 1868, 2398, - 2545, 1898, 2382, - 2525, 1935, 2360, - 2496, 1980, 2329, - 2455, 2034, 2284, - 2394, 2097, 2215, - 2296, 2170, 2104, - 2120, 2252, 1892, - 1666, 2343, 1176, - 0, 2441, 0, - 0, 2547, 0, - 0, 2658, 0, - 0, 2773, 0, - 0, 2893, 0, - 0, 3015, 0, - 0, 3140, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3653, 0, - 2740, 1839, 2548, - 2740, 1840, 2547, - 2739, 1841, 2547, - 2739, 1843, 2546, - 2738, 1845, 2545, - 2737, 1848, 2544, - 2736, 1853, 2543, - 2734, 1858, 2541, - 2732, 1865, 2538, - 2729, 1875, 2535, - 2725, 1887, 2530, - 2719, 1903, 2523, - 2711, 1924, 2514, - 2701, 1950, 2502, - 2687, 1983, 2486, - 2667, 2024, 2462, - 2639, 2073, 2429, - 2599, 2132, 2380, - 2539, 2199, 2305, - 2445, 2277, 2181, - 2277, 2363, 1934, - 1861, 2458, 400, - 0, 2560, 0, - 0, 2668, 0, - 0, 2781, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 2878, 1917, 2660, - 2878, 1917, 2660, - 2878, 1919, 2660, - 2878, 1920, 2659, - 2877, 1922, 2659, - 2876, 1925, 2658, - 2875, 1928, 2657, - 2874, 1933, 2655, - 2872, 1939, 2653, - 2870, 1947, 2650, - 2867, 1958, 2646, - 2863, 1972, 2641, - 2858, 1989, 2635, - 2850, 2012, 2625, - 2840, 2041, 2613, - 2826, 2077, 2595, - 2807, 2121, 2570, - 2779, 2174, 2535, - 2740, 2236, 2483, - 2681, 2308, 2403, - 2589, 2389, 2268, - 2426, 2479, 1986, - 2035, 2577, 0, - 0, 2682, 0, - 0, 2792, 0, - 0, 2907, 0, - 0, 3026, 0, - 0, 3148, 0, - 0, 3273, 0, - 0, 3399, 0, - 0, 3527, 0, - 0, 3656, 0, - 3015, 2003, 2777, - 3015, 2004, 2777, - 3015, 2005, 2777, - 3015, 2006, 2776, - 3014, 2008, 2776, - 3014, 2010, 2775, - 3013, 2013, 2774, - 3012, 2017, 2773, - 3011, 2022, 2772, - 3009, 2029, 2770, - 3007, 2038, 2767, - 3004, 2049, 2763, - 3000, 2064, 2758, - 2995, 2084, 2751, - 2987, 2108, 2741, - 2977, 2140, 2728, - 2963, 2178, 2709, - 2944, 2225, 2684, - 2917, 2281, 2647, - 2878, 2347, 2593, - 2821, 2422, 2508, - 2730, 2506, 2363, - 2570, 2599, 2046, - 2196, 2699, 0, - 0, 2806, 0, - 0, 2918, 0, - 0, 3034, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3529, 0, - 0, 3658, 0, - 3151, 2098, 2898, - 3151, 2099, 2898, - 3151, 2099, 2897, - 3150, 2100, 2897, - 3150, 2102, 2897, - 3150, 2104, 2896, - 3149, 2106, 2896, - 3149, 2109, 2895, - 3148, 2113, 2893, - 3147, 2119, 2892, - 3145, 2126, 2890, - 3143, 2136, 2887, - 3140, 2148, 2883, - 3136, 2164, 2877, - 3130, 2185, 2870, - 3123, 2212, 2860, - 3113, 2245, 2847, - 3099, 2286, 2828, - 3080, 2335, 2801, - 3053, 2394, 2763, - 3015, 2462, 2707, - 2958, 2540, 2619, - 2868, 2626, 2466, - 2712, 2721, 2116, - 2349, 2823, 0, - 0, 2932, 0, - 0, 3045, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3407, 0, - 0, 3533, 0, - 0, 3660, 0, - 3286, 2200, 3021, - 3286, 2201, 3021, - 3286, 2201, 3021, - 3285, 2202, 3021, - 3285, 2203, 3020, - 3285, 2205, 3020, - 3284, 2206, 3019, - 3284, 2209, 3019, - 3283, 2212, 3018, - 3282, 2217, 3016, - 3281, 2223, 3015, - 3280, 2231, 3013, - 3277, 2241, 3010, - 3274, 2254, 3006, - 3270, 2271, 3000, - 3265, 2293, 2993, - 3258, 2321, 2983, - 3248, 2356, 2969, - 3234, 2398, 2949, - 3215, 2450, 2922, - 3189, 2511, 2883, - 3151, 2581, 2825, - 3094, 2661, 2734, - 3005, 2749, 2574, - 2850, 2846, 2196, - 2495, 2950, 0, - 0, 3059, 0, - 0, 3174, 0, - 0, 3292, 0, - 0, 3414, 0, - 0, 3538, 0, - 0, 3664, 0, - 3420, 2309, 3146, - 3420, 2309, 3146, - 3420, 2309, 3146, - 3420, 2310, 3146, - 3419, 2311, 3146, - 3419, 2312, 3145, - 3419, 2313, 3145, - 3418, 2315, 3145, - 3418, 2318, 3144, - 3417, 2322, 3143, - 3416, 2326, 3142, - 3415, 2333, 3140, - 3414, 2341, 3138, - 3411, 2351, 3135, - 3408, 2365, 3131, - 3404, 2383, 3125, - 3399, 2406, 3117, - 3392, 2435, 3107, - 3382, 2471, 3093, - 3368, 2516, 3074, - 3350, 2569, 3046, - 3323, 2631, 3006, - 3285, 2703, 2947, - 3229, 2785, 2853, - 3141, 2875, 2688, - 2988, 2973, 2284, - 2638, 3077, 0, - 0, 3188, 0, - 0, 3303, 0, - 0, 3422, 0, - 0, 3544, 0, - 0, 3669, 0, - 3553, 2422, 3273, - 3553, 2422, 3273, - 3553, 2423, 3273, - 3553, 2423, 3273, - 3553, 2424, 3273, - 3553, 2425, 3273, - 3553, 2426, 3272, - 3552, 2427, 3272, - 3552, 2430, 3271, - 3552, 2432, 3271, - 3551, 2436, 3270, - 3550, 2441, 3269, - 3549, 2447, 3267, - 3547, 2456, 3265, - 3545, 2467, 3261, - 3542, 2481, 3257, - 3538, 2500, 3252, - 3533, 2524, 3244, - 3525, 2554, 3234, - 3516, 2591, 3219, - 3502, 2636, 3200, - 3483, 2690, 3172, - 3457, 2754, 3131, - 3419, 2828, 3071, - 3363, 2910, 2976, - 3275, 3002, 2805, - 3123, 3100, 2380, - 2778, 3206, 0, - 0, 3317, 0, - 0, 3433, 0, - 0, 3553, 0, - 0, 3675, 0, - 3687, 2540, 3402, - 3687, 2540, 3402, - 3686, 2540, 3401, - 3686, 2541, 3401, - 3686, 2541, 3401, - 3686, 2542, 3401, - 3686, 2543, 3401, - 3686, 2544, 3401, - 3686, 2545, 3400, - 3685, 2548, 3400, - 3685, 2550, 3399, - 3684, 2554, 3398, - 3683, 2559, 3397, - 3682, 2566, 3395, - 3680, 2575, 3393, - 3678, 2586, 3390, - 3675, 2601, 3385, - 3671, 2620, 3380, - 3666, 2644, 3372, - 3659, 2675, 3362, - 3649, 2713, 3347, - 3635, 2759, 3327, - 3617, 2815, 3299, - 3590, 2880, 3258, - 3553, 2954, 3197, - 3497, 3038, 3100, - 3410, 3130, 2926, - 3258, 3229, 2484, - 2916, 3336, 0, - 0, 3448, 0, - 0, 3564, 0, - 0, 3684, 0, - 3819, 2661, 3531, - 3819, 2661, 3531, - 3819, 2661, 3531, - 3819, 2661, 3531, - 3819, 2662, 3531, - 3819, 2662, 3530, - 3819, 2663, 3530, - 3819, 2664, 3530, - 3819, 2665, 3530, - 3818, 2667, 3529, - 3818, 2669, 3529, - 3818, 2672, 3528, - 3817, 2676, 3527, - 3816, 2681, 3526, - 3815, 2688, 3524, - 3813, 2697, 3522, - 3811, 2708, 3519, - 3808, 2723, 3514, - 3804, 2743, 3509, - 3799, 2768, 3501, - 3792, 2799, 3490, - 3782, 2838, 3476, - 3768, 2885, 3456, - 3750, 2941, 3427, - 3723, 3007, 3386, - 3686, 3082, 3325, - 3630, 3166, 3227, - 3543, 3259, 3050, - 3392, 3359, 2593, - 3052, 3466, 0, - 0, 3578, 0, - 0, 3695, 0, - 3952, 2784, 3661, - 3952, 2784, 3661, - 3952, 2785, 3661, - 3952, 2785, 3661, - 3952, 2785, 3661, - 3952, 2785, 3660, - 3952, 2786, 3660, - 3952, 2787, 3660, - 3952, 2788, 3660, - 3951, 2789, 3660, - 3951, 2791, 3659, - 3951, 2793, 3659, - 3950, 2796, 3658, - 3950, 2800, 3657, - 3949, 2805, 3656, - 3947, 2812, 3654, - 3946, 2821, 3652, - 3944, 2833, 3648, - 3941, 2848, 3644, - 3937, 2868, 3638, - 3932, 2893, 3631, - 3924, 2925, 3620, - 3915, 2964, 3605, - 3901, 3012, 3585, - 3882, 3068, 3556, - 3856, 3135, 3515, - 3819, 3211, 3453, - 3763, 3295, 3354, - 3676, 3389, 3176, - 3526, 3489, 2707, - 3188, 3597, 0, - 0, 3709, 0, - 4085, 2910, 3791, - 4085, 2910, 3791, - 4085, 2910, 3791, - 4085, 2910, 3791, - 4085, 2911, 3791, - 4085, 2911, 3791, - 4085, 2911, 3791, - 4084, 2912, 3791, - 4084, 2912, 3791, - 4084, 2913, 3790, - 4084, 2915, 3790, - 4084, 2916, 3790, - 4083, 2919, 3789, - 4083, 2922, 3788, - 4082, 2926, 3787, - 4081, 2931, 3786, - 4080, 2938, 3784, - 4078, 2947, 3782, - 4076, 2959, 3779, - 4073, 2975, 3775, - 4069, 2995, 3769, - 4064, 3020, 3761, - 4057, 3052, 3750, - 4047, 3092, 3736, - 4034, 3140, 3715, - 4015, 3197, 3686, - 3989, 3264, 3645, - 3951, 3340, 3583, - 3896, 3425, 3483, - 3809, 3519, 3303, - 3659, 3620, 2826, - 3322, 3728, 0, - 4095, 3037, 3922, - 4095, 3037, 3922, - 4095, 3037, 3922, - 4095, 3037, 3922, - 4095, 3038, 3922, - 4095, 3038, 3922, - 4095, 3038, 3922, - 4095, 3039, 3922, - 4095, 3039, 3922, - 4095, 3040, 3921, - 4095, 3041, 3921, - 4095, 3042, 3921, - 4095, 3044, 3920, - 4095, 3046, 3920, - 4095, 3049, 3919, - 4095, 3053, 3918, - 4095, 3059, 3917, - 4095, 3066, 3915, - 4095, 3075, 3913, - 4095, 3087, 3910, - 4095, 3103, 3905, - 4095, 3123, 3900, - 4095, 3149, 3892, - 4095, 3181, 3881, - 4095, 3221, 3866, - 4095, 3269, 3846, - 4095, 3327, 3817, - 4095, 3394, 3775, - 4084, 3470, 3713, - 4029, 3556, 3613, - 3942, 3650, 3432, - 3792, 3751, 2947, - 4095, 3166, 4053, - 4095, 3166, 4053, - 4095, 3166, 4053, - 4095, 3166, 4053, - 4095, 3166, 4053, - 4095, 3166, 4053, - 4095, 3166, 4053, - 4095, 3167, 4053, - 4095, 3167, 4053, - 4095, 3168, 4053, - 4095, 3168, 4053, - 4095, 3169, 4052, - 4095, 3171, 4052, - 4095, 3172, 4052, - 4095, 3175, 4051, - 4095, 3178, 4050, - 4095, 3182, 4049, - 4095, 3187, 4048, - 4095, 3194, 4046, - 4095, 3204, 4044, - 4095, 3216, 4041, - 4095, 3232, 4037, - 4095, 3252, 4031, - 4095, 3278, 4023, - 4095, 3310, 4012, - 4095, 3350, 3997, - 4095, 3399, 3977, - 4095, 3457, 3948, - 4095, 3524, 3906, - 4095, 3601, 3843, - 4095, 3687, 3743, - 4074, 3781, 3561, - 0, 1606, 1871, - 0, 1607, 1869, - 0, 1610, 1867, - 0, 1612, 1864, - 0, 1616, 1861, - 0, 1622, 1856, - 0, 1628, 1849, - 0, 1637, 1840, - 0, 1649, 1827, - 0, 1664, 1810, - 0, 1684, 1786, - 0, 1709, 1751, - 0, 1740, 1701, - 0, 1779, 1623, - 0, 1826, 1491, - 0, 1883, 1222, - 0, 1949, 0, - 0, 2024, 0, - 0, 2108, 0, - 0, 2201, 0, - 0, 2302, 0, - 0, 2409, 0, - 0, 2521, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1606, 1873, - 0, 1608, 1871, - 0, 1610, 1869, - 0, 1613, 1867, - 0, 1617, 1863, - 0, 1622, 1858, - 0, 1629, 1851, - 0, 1638, 1842, - 0, 1650, 1830, - 0, 1665, 1813, - 0, 1684, 1789, - 0, 1709, 1754, - 0, 1741, 1704, - 0, 1779, 1626, - 0, 1827, 1497, - 0, 1883, 1231, - 0, 1949, 0, - 0, 2024, 0, - 0, 2109, 0, - 0, 2202, 0, - 0, 2302, 0, - 0, 2409, 0, - 0, 2521, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1607, 1876, - 0, 1609, 1874, - 0, 1611, 1872, - 0, 1614, 1870, - 0, 1618, 1866, - 0, 1623, 1861, - 0, 1630, 1855, - 0, 1639, 1846, - 0, 1650, 1833, - 0, 1666, 1816, - 0, 1685, 1792, - 0, 1710, 1758, - 0, 1741, 1708, - 0, 1780, 1632, - 0, 1827, 1503, - 0, 1883, 1243, - 0, 1949, 0, - 0, 2024, 0, - 0, 2109, 0, - 0, 2202, 0, - 0, 2302, 0, - 0, 2409, 0, - 0, 2521, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1608, 1880, - 0, 1610, 1878, - 0, 1612, 1876, - 0, 1615, 1874, - 0, 1619, 1870, - 0, 1624, 1865, - 0, 1631, 1859, - 0, 1640, 1850, - 0, 1651, 1838, - 0, 1666, 1821, - 0, 1686, 1797, - 0, 1711, 1763, - 0, 1742, 1714, - 0, 1781, 1638, - 0, 1828, 1512, - 0, 1884, 1259, - 0, 1950, 0, - 0, 2025, 0, - 0, 2109, 0, - 0, 2202, 0, - 0, 2302, 0, - 0, 2409, 0, - 0, 2521, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1609, 1885, - 0, 1611, 1884, - 0, 1613, 1882, - 0, 1616, 1879, - 0, 1620, 1876, - 0, 1625, 1871, - 0, 1632, 1864, - 0, 1641, 1855, - 0, 1652, 1843, - 0, 1668, 1827, - 0, 1687, 1803, - 0, 1712, 1770, - 0, 1743, 1722, - 0, 1782, 1647, - 0, 1829, 1524, - 0, 1885, 1280, - 0, 1950, 0, - 0, 2025, 0, - 0, 2110, 0, - 0, 2202, 0, - 0, 2303, 0, - 0, 2409, 0, - 0, 2522, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1611, 1892, - 0, 1613, 1891, - 0, 1615, 1889, - 0, 1618, 1886, - 0, 1622, 1883, - 0, 1627, 1878, - 0, 1634, 1872, - 0, 1642, 1863, - 0, 1654, 1851, - 0, 1669, 1835, - 0, 1689, 1812, - 0, 1713, 1779, - 0, 1744, 1732, - 0, 1783, 1659, - 0, 1830, 1540, - 0, 1886, 1305, - 0, 1951, 254, - 0, 2026, 0, - 0, 2110, 0, - 0, 2203, 0, - 0, 2303, 0, - 0, 2410, 0, - 0, 2522, 0, - 0, 2638, 0, - 0, 2758, 0, - 0, 2881, 0, - 0, 3006, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1614, 1901, - 0, 1615, 1900, - 0, 1617, 1898, - 0, 1620, 1896, - 0, 1624, 1892, - 0, 1629, 1887, - 0, 1636, 1881, - 0, 1645, 1873, - 0, 1656, 1861, - 0, 1671, 1845, - 0, 1691, 1823, - 0, 1715, 1791, - 0, 1746, 1745, - 0, 1784, 1674, - 0, 1831, 1559, - 0, 1887, 1338, - 0, 1952, 508, - 0, 2027, 0, - 0, 2111, 0, - 0, 2203, 0, - 0, 2304, 0, - 0, 2410, 0, - 0, 2522, 0, - 0, 2639, 0, - 0, 2759, 0, - 0, 2881, 0, - 0, 3007, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3390, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1617, 1913, - 0, 1618, 1912, - 0, 1620, 1910, - 0, 1623, 1908, - 0, 1627, 1904, - 0, 1632, 1900, - 0, 1639, 1894, - 0, 1648, 1885, - 0, 1659, 1874, - 0, 1674, 1859, - 0, 1693, 1837, - 0, 1718, 1806, - 0, 1748, 1761, - 0, 1787, 1694, - 0, 1833, 1584, - 0, 1889, 1378, - 0, 1954, 713, - 0, 2028, 0, - 0, 2112, 0, - 0, 2204, 0, - 0, 2304, 0, - 0, 2411, 0, - 0, 2522, 0, - 0, 2639, 0, - 0, 2759, 0, - 0, 2882, 0, - 0, 3007, 0, - 0, 3133, 0, - 0, 3261, 0, - 0, 3391, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1621, 1929, - 0, 1622, 1928, - 0, 1625, 1926, - 0, 1627, 1923, - 0, 1631, 1920, - 0, 1636, 1916, - 0, 1643, 1910, - 0, 1652, 1902, - 0, 1663, 1891, - 0, 1678, 1876, - 0, 1697, 1855, - 0, 1721, 1826, - 0, 1752, 1783, - 0, 1790, 1719, - 0, 1836, 1616, - 0, 1891, 1426, - 0, 1956, 894, - 0, 2030, 0, - 0, 2113, 0, - 0, 2206, 0, - 0, 2305, 0, - 0, 2411, 0, - 0, 2523, 0, - 0, 2639, 0, - 0, 2759, 0, - 0, 2882, 0, - 0, 3007, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1626, 1949, - 0, 1628, 1948, - 0, 1630, 1946, - 0, 1633, 1944, - 0, 1637, 1940, - 0, 1642, 1936, - 0, 1648, 1931, - 0, 1657, 1923, - 0, 1668, 1913, - 0, 1683, 1898, - 0, 1701, 1878, - 0, 1726, 1851, - 0, 1756, 1810, - 0, 1793, 1750, - 0, 1839, 1655, - 0, 1894, 1484, - 0, 1958, 1059, - 0, 2032, 0, - 0, 2115, 0, - 0, 2207, 0, - 0, 2306, 0, - 0, 2412, 0, - 0, 2524, 0, - 0, 2640, 0, - 0, 2760, 0, - 0, 2882, 0, - 0, 3007, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3520, 0, - 0, 3651, 0, - 0, 1634, 1974, - 0, 1635, 1973, - 0, 1637, 1971, - 0, 1640, 1969, - 0, 1644, 1966, - 0, 1649, 1962, - 0, 1655, 1957, - 0, 1664, 1950, - 0, 1675, 1940, - 0, 1689, 1927, - 0, 1708, 1908, - 0, 1731, 1882, - 0, 1761, 1844, - 0, 1798, 1789, - 0, 1844, 1702, - 0, 1898, 1552, - 0, 1962, 1214, - 0, 2035, 0, - 0, 2118, 0, - 0, 2209, 0, - 0, 2308, 0, - 0, 2414, 0, - 0, 2525, 0, - 0, 2641, 0, - 0, 2760, 0, - 0, 2883, 0, - 0, 3008, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 1107, 1643, 2006, - 1096, 1645, 2005, - 1081, 1647, 2003, - 1061, 1650, 2001, - 1031, 1653, 1999, - 989, 1658, 1995, - 926, 1664, 1990, - 824, 1673, 1983, - 639, 1684, 1974, - 132, 1698, 1962, - 0, 1716, 1945, - 0, 1739, 1921, - 0, 1769, 1886, - 0, 1805, 1836, - 0, 1850, 1758, - 0, 1904, 1628, - 0, 1967, 1363, - 0, 2039, 0, - 0, 2121, 0, - 0, 2212, 0, - 0, 2310, 0, - 0, 2415, 0, - 0, 2526, 0, - 0, 2642, 0, - 0, 2761, 0, - 0, 2883, 0, - 0, 3008, 0, - 0, 3134, 0, - 0, 3262, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 1479, 1656, 2045, - 1474, 1657, 2044, - 1468, 1659, 2043, - 1459, 1662, 2041, - 1447, 1666, 2039, - 1431, 1670, 2035, - 1408, 1676, 2031, - 1375, 1684, 2025, - 1327, 1695, 2016, - 1255, 1709, 2005, - 1135, 1727, 1989, - 899, 1749, 1968, - 0, 1778, 1937, - 0, 1814, 1892, - 0, 1858, 1824, - 0, 1911, 1714, - 0, 1973, 1507, - 0, 2045, 831, - 0, 2126, 0, - 0, 2215, 0, - 0, 2313, 0, - 0, 2418, 0, - 0, 2528, 0, - 0, 2643, 0, - 0, 2762, 0, - 0, 2884, 0, - 0, 3009, 0, - 0, 3135, 0, - 0, 3263, 0, - 0, 3391, 0, - 0, 3521, 0, - 0, 3651, 0, - 1732, 1672, 2093, - 1730, 1674, 2092, - 1726, 1676, 2091, - 1721, 1678, 2089, - 1715, 1681, 2087, - 1706, 1686, 2084, - 1693, 1692, 2080, - 1676, 1700, 2075, - 1652, 1710, 2067, - 1618, 1723, 2057, - 1568, 1741, 2043, - 1491, 1763, 2024, - 1362, 1791, 1997, - 1100, 1826, 1958, - 0, 1868, 1900, - 0, 1920, 1808, - 0, 1981, 1648, - 0, 2052, 1267, - 0, 2132, 0, - 0, 2220, 0, - 0, 2317, 0, - 0, 2421, 0, - 0, 2530, 0, - 0, 2645, 0, - 0, 2764, 0, - 0, 2885, 0, - 0, 3009, 0, - 0, 3136, 0, - 0, 3263, 0, - 0, 3392, 0, - 0, 3521, 0, - 0, 3651, 0, - 1938, 1693, 2150, - 1936, 1694, 2150, - 1934, 1696, 2148, - 1931, 1699, 2147, - 1927, 1702, 2145, - 1921, 1706, 2142, - 1913, 1712, 2139, - 1903, 1719, 2134, - 1889, 1729, 2127, - 1869, 1742, 2119, - 1840, 1759, 2106, - 1800, 1780, 2090, - 1739, 1807, 2066, - 1643, 1841, 2033, - 1470, 1882, 1984, - 1033, 1932, 1910, - 0, 1992, 1786, - 0, 2061, 1540, - 0, 2139, 54, - 0, 2227, 0, - 0, 2322, 0, - 0, 2425, 0, - 0, 2534, 0, - 0, 2648, 0, - 0, 2766, 0, - 0, 2887, 0, - 0, 3011, 0, - 0, 3136, 0, - 0, 3264, 0, - 0, 3392, 0, - 0, 3522, 0, - 0, 3652, 0, - 2118, 1720, 2217, - 2117, 1721, 2216, - 2116, 1723, 2215, - 2113, 1725, 2214, - 2111, 1728, 2212, - 2107, 1732, 2210, - 2102, 1737, 2207, - 2095, 1744, 2203, - 2086, 1754, 2197, - 2073, 1766, 2190, - 2055, 1782, 2179, - 2030, 1802, 2165, - 1994, 1828, 2145, - 1942, 1860, 2118, - 1861, 1900, 2077, - 1723, 1948, 2018, - 1431, 2006, 1923, - 0, 2073, 1755, - 0, 2149, 1339, - 0, 2235, 0, - 0, 2329, 0, - 0, 2430, 0, - 0, 2538, 0, - 0, 2651, 0, - 0, 2768, 0, - 0, 2889, 0, - 0, 3012, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 2283, 1753, 2293, - 2282, 1754, 2292, - 2281, 1756, 2292, - 2280, 1758, 2290, - 2278, 1761, 2289, - 2275, 1764, 2287, - 2272, 1769, 2285, - 2267, 1776, 2281, - 2261, 1785, 2276, - 2252, 1796, 2270, - 2240, 1811, 2261, - 2224, 1830, 2249, - 2201, 1854, 2233, - 2168, 1884, 2210, - 2121, 1922, 2178, - 2048, 1968, 2131, - 1928, 2024, 2059, - 1694, 2088, 1940, - 631, 2163, 1709, - 0, 2246, 718, - 0, 2338, 0, - 0, 2437, 0, - 0, 2544, 0, - 0, 2655, 0, - 0, 2772, 0, - 0, 2891, 0, - 0, 3014, 0, - 0, 3139, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3653, 0, - 2439, 1794, 2378, - 2438, 1795, 2378, - 2437, 1796, 2377, - 2436, 1798, 2376, - 2435, 1801, 2375, - 2433, 1804, 2373, - 2430, 1809, 2371, - 2427, 1815, 2368, - 2423, 1823, 2364, - 2417, 1833, 2359, - 2408, 1847, 2352, - 2397, 1864, 2342, - 2382, 1887, 2329, - 2360, 1915, 2311, - 2329, 1951, 2285, - 2285, 1994, 2248, - 2217, 2047, 2193, - 2108, 2108, 2108, - 1903, 2180, 1962, - 1252, 2260, 1639, - 0, 2350, 0, - 0, 2447, 0, - 0, 2551, 0, - 0, 2661, 0, - 0, 2776, 0, - 0, 2895, 0, - 0, 3017, 0, - 0, 3141, 0, - 0, 3267, 0, - 0, 3395, 0, - 0, 3524, 0, - 0, 3653, 0, - 2587, 1843, 2472, - 2587, 1844, 2471, - 2586, 1845, 2471, - 2585, 1847, 2470, - 2584, 1850, 2469, - 2583, 1853, 2468, - 2581, 1857, 2466, - 2579, 1862, 2464, - 2576, 1869, 2460, - 2571, 1879, 2456, - 2566, 1891, 2451, - 2558, 1907, 2443, - 2547, 1928, 2432, - 2532, 1954, 2418, - 2511, 1986, 2397, - 2482, 2027, 2369, - 2439, 2076, 2327, - 2375, 2134, 2266, - 2273, 2201, 2167, - 2086, 2279, 1990, - 1566, 2365, 1526, - 0, 2459, 0, - 0, 2561, 0, - 0, 2669, 0, - 0, 2782, 0, - 0, 2899, 0, - 0, 3020, 0, - 0, 3144, 0, - 0, 3269, 0, - 0, 3396, 0, - 0, 3525, 0, - 0, 3654, 0, - 2731, 1902, 2573, - 2731, 1903, 2572, - 2731, 1904, 2572, - 2730, 1906, 2571, - 2729, 1908, 2570, - 2728, 1910, 2569, - 2727, 1914, 2568, - 2725, 1919, 2566, - 2723, 1925, 2564, - 2720, 1933, 2560, - 2716, 1944, 2556, - 2710, 1959, 2550, - 2702, 1977, 2541, - 2692, 2000, 2530, - 2677, 2030, 2514, - 2657, 2067, 2492, - 2629, 2112, 2461, - 2588, 2166, 2416, - 2526, 2229, 2347, - 2428, 2302, 2236, - 2252, 2384, 2024, - 1798, 2475, 1309, - 0, 2574, 0, - 0, 2679, 0, - 0, 2790, 0, - 0, 2906, 0, - 0, 3025, 0, - 0, 3147, 0, - 0, 3272, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 2872, 1970, 2680, - 2872, 1971, 2680, - 2872, 1972, 2679, - 2871, 1973, 2679, - 2871, 1975, 2678, - 2870, 1977, 2677, - 2869, 1981, 2676, - 2868, 1985, 2675, - 2866, 1990, 2673, - 2864, 1998, 2670, - 2861, 2007, 2667, - 2857, 2019, 2662, - 2851, 2036, 2655, - 2843, 2056, 2646, - 2833, 2083, 2634, - 2819, 2115, 2618, - 2799, 2156, 2594, - 2771, 2205, 2561, - 2731, 2264, 2512, - 2672, 2332, 2437, - 2577, 2409, 2314, - 2409, 2495, 2066, - 1993, 2590, 532, - 0, 2692, 0, - 0, 2800, 0, - 0, 2914, 0, - 0, 3031, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3657, 0, - 3011, 2048, 2793, - 3011, 2049, 2792, - 3010, 2050, 2792, - 3010, 2051, 2792, - 3010, 2052, 2791, - 3009, 2054, 2791, - 3008, 2057, 2790, - 3007, 2060, 2789, - 3006, 2065, 2787, - 3005, 2071, 2785, - 3002, 2079, 2782, - 2999, 2090, 2779, - 2995, 2104, 2774, - 2990, 2122, 2767, - 2982, 2144, 2757, - 2972, 2173, 2745, - 2958, 2209, 2727, - 2939, 2253, 2702, - 2911, 2306, 2667, - 2872, 2368, 2616, - 2813, 2440, 2536, - 2721, 2521, 2400, - 2558, 2611, 2118, - 2167, 2709, 0, - 0, 2814, 0, - 0, 2924, 0, - 0, 3039, 0, - 0, 3158, 0, - 0, 3280, 0, - 0, 3405, 0, - 0, 3531, 0, - 0, 3659, 0, - 3148, 2135, 2910, - 3147, 2135, 2909, - 3147, 2136, 2909, - 3147, 2137, 2909, - 3147, 2138, 2909, - 3146, 2140, 2908, - 3146, 2142, 2907, - 3145, 2145, 2907, - 3144, 2149, 2905, - 3143, 2154, 2904, - 3141, 2161, 2902, - 3139, 2170, 2899, - 3136, 2181, 2895, - 3132, 2196, 2890, - 3127, 2216, 2883, - 3119, 2241, 2873, - 3109, 2272, 2860, - 3095, 2310, 2842, - 3076, 2357, 2816, - 3049, 2413, 2779, - 3010, 2479, 2725, - 2953, 2554, 2640, - 2862, 2638, 2495, - 2703, 2731, 2178, - 2328, 2831, 0, - 0, 2938, 0, - 0, 3050, 0, - 0, 3167, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 3283, 2230, 3030, - 3283, 2230, 3030, - 3283, 2231, 3030, - 3283, 2232, 3030, - 3283, 2233, 3029, - 3282, 2234, 3029, - 3282, 2236, 3028, - 3281, 2238, 3028, - 3281, 2241, 3027, - 3280, 2245, 3026, - 3279, 2251, 3024, - 3277, 2258, 3022, - 3275, 2268, 3019, - 3272, 2280, 3015, - 3268, 2297, 3010, - 3262, 2317, 3002, - 3255, 2344, 2992, - 3245, 2377, 2979, - 3231, 2418, 2960, - 3212, 2467, 2933, - 3186, 2526, 2896, - 3147, 2594, 2839, - 3090, 2672, 2751, - 3000, 2758, 2598, - 2844, 2853, 2248, - 2481, 2955, 0, - 0, 3064, 0, - 0, 3177, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3418, 2332, 3153, - 3418, 2332, 3153, - 3418, 2333, 3153, - 3418, 2333, 3153, - 3417, 2334, 3153, - 3417, 2335, 3152, - 3417, 2337, 3152, - 3417, 2339, 3151, - 3416, 2341, 3151, - 3415, 2344, 3150, - 3414, 2349, 3149, - 3413, 2355, 3147, - 3412, 2363, 3145, - 3409, 2373, 3142, - 3406, 2386, 3138, - 3403, 2403, 3132, - 3397, 2425, 3125, - 3390, 2453, 3115, - 3380, 2488, 3101, - 3366, 2531, 3082, - 3347, 2582, 3054, - 3321, 2643, 3016, - 3283, 2713, 2958, - 3226, 2793, 2866, - 3137, 2882, 2706, - 2983, 2978, 2328, - 2627, 3082, 0, - 0, 3191, 0, - 0, 3306, 0, - 0, 3424, 0, - 0, 3546, 0, - 0, 3670, 0, - 3552, 2440, 3279, - 3552, 2441, 3278, - 3552, 2441, 3278, - 3552, 2441, 3278, - 3552, 2442, 3278, - 3551, 2443, 3278, - 3551, 2444, 3278, - 3551, 2446, 3277, - 3551, 2448, 3277, - 3550, 2450, 3276, - 3549, 2454, 3275, - 3549, 2458, 3274, - 3547, 2465, 3272, - 3546, 2473, 3270, - 3543, 2484, 3267, - 3541, 2497, 3263, - 3537, 2515, 3257, - 3531, 2538, 3250, - 3524, 2567, 3239, - 3514, 2603, 3225, - 3500, 2648, 3206, - 3482, 2701, 3178, - 3455, 2763, 3138, - 3417, 2835, 3079, - 3361, 2917, 2986, - 3273, 3007, 2820, - 3120, 3105, 2416, - 2770, 3209, 0, - 0, 3320, 0, - 0, 3435, 0, - 0, 3554, 0, - 0, 3676, 0, - 3685, 2554, 3406, - 3685, 2554, 3405, - 3685, 2554, 3405, - 3685, 2555, 3405, - 3685, 2555, 3405, - 3685, 2556, 3405, - 3685, 2557, 3405, - 3685, 2558, 3405, - 3684, 2560, 3404, - 3684, 2562, 3404, - 3684, 2564, 3403, - 3683, 2568, 3402, - 3682, 2573, 3401, - 3681, 2579, 3399, - 3679, 2588, 3397, - 3677, 2599, 3394, - 3674, 2613, 3389, - 3670, 2632, 3384, - 3665, 2656, 3376, - 3658, 2686, 3366, - 3648, 2723, 3351, - 3634, 2768, 3332, - 3615, 2823, 3304, - 3589, 2886, 3263, - 3551, 2960, 3203, - 3495, 3042, 3108, - 3408, 3134, 2938, - 3255, 3233, 2512, - 2910, 3338, 0, - 0, 3449, 0, - 0, 3565, 0, - 0, 3685, 0, - 3819, 2672, 3534, - 3819, 2672, 3534, - 3819, 2672, 3534, - 3819, 2672, 3534, - 3818, 2673, 3533, - 3818, 2673, 3533, - 3818, 2674, 3533, - 3818, 2675, 3533, - 3818, 2676, 3533, - 3818, 2678, 3532, - 3817, 2680, 3532, - 3817, 2683, 3531, - 3816, 2686, 3530, - 3815, 2691, 3529, - 3814, 2698, 3527, - 3812, 2707, 3525, - 3810, 2718, 3522, - 3807, 2733, 3517, - 3803, 2752, 3512, - 3798, 2776, 3504, - 3791, 2807, 3494, - 3781, 2845, 3479, - 3767, 2891, 3459, - 3749, 2947, 3431, - 3722, 3012, 3390, - 3685, 3086, 3329, - 3629, 3170, 3232, - 3542, 3262, 3059, - 3390, 3362, 2616, - 3048, 3468, 0, - 0, 3580, 0, - 0, 3696, 0, - 3952, 2793, 3663, - 3952, 2793, 3663, - 3952, 2793, 3663, - 3951, 2793, 3663, - 3951, 2793, 3663, - 3951, 2794, 3663, - 3951, 2794, 3663, - 3951, 2795, 3662, - 3951, 2796, 3662, - 3951, 2797, 3662, - 3951, 2799, 3661, - 3950, 2801, 3661, - 3950, 2804, 3660, - 3949, 2808, 3659, - 3948, 2813, 3658, - 3947, 2820, 3656, - 3945, 2829, 3654, - 3943, 2840, 3651, - 3940, 2856, 3646, - 3936, 2875, 3641, - 3931, 2900, 3633, - 3924, 2931, 3622, - 3914, 2970, 3608, - 3900, 3017, 3588, - 3882, 3073, 3559, - 3856, 3139, 3518, - 3818, 3214, 3457, - 3762, 3298, 3359, - 3675, 3391, 3182, - 3524, 3491, 2725, - 3184, 3598, 0, - 0, 3710, 0, - 4084, 2916, 3793, - 4084, 2916, 3793, - 4084, 2916, 3793, - 4084, 2917, 3793, - 4084, 2917, 3793, - 4084, 2917, 3793, - 4084, 2918, 3793, - 4084, 2918, 3792, - 4084, 2919, 3792, - 4084, 2920, 3792, - 4083, 2921, 3792, - 4083, 2923, 3791, - 4083, 2925, 3791, - 4082, 2928, 3790, - 4082, 2932, 3789, - 4081, 2937, 3788, - 4080, 2944, 3786, - 4078, 2953, 3784, - 4076, 2965, 3781, - 4073, 2980, 3776, - 4069, 3000, 3771, - 4064, 3025, 3763, - 4056, 3057, 3752, - 4047, 3096, 3738, - 4033, 3144, 3717, - 4015, 3201, 3689, - 3988, 3267, 3647, - 3951, 3343, 3585, - 3895, 3428, 3486, - 3808, 3521, 3308, - 3658, 3622, 2839, - 3320, 3729, 0, - 4095, 3042, 3923, - 4095, 3042, 3923, - 4095, 3042, 3923, - 4095, 3042, 3923, - 4095, 3042, 3923, - 4095, 3043, 3923, - 4095, 3043, 3923, - 4095, 3043, 3923, - 4095, 3044, 3923, - 4095, 3045, 3923, - 4095, 3046, 3922, - 4095, 3047, 3922, - 4095, 3049, 3922, - 4095, 3051, 3921, - 4095, 3054, 3920, - 4095, 3058, 3919, - 4095, 3063, 3918, - 4095, 3070, 3916, - 4095, 3079, 3914, - 4095, 3091, 3911, - 4095, 3107, 3907, - 4095, 3127, 3901, - 4095, 3152, 3893, - 4095, 3184, 3882, - 4095, 3224, 3868, - 4095, 3272, 3847, - 4095, 3329, 3819, - 4095, 3396, 3777, - 4084, 3472, 3715, - 4028, 3558, 3615, - 3941, 3651, 3435, - 3791, 3752, 2958, - 4095, 3169, 4054, - 4095, 3169, 4054, - 4095, 3169, 4054, - 4095, 3169, 4054, - 4095, 3169, 4054, - 4095, 3170, 4054, - 4095, 3170, 4054, - 4095, 3170, 4054, - 4095, 3171, 4054, - 4095, 3171, 4054, - 4095, 3172, 4054, - 4095, 3173, 4053, - 4095, 3174, 4053, - 4095, 3176, 4053, - 4095, 3178, 4052, - 4095, 3181, 4051, - 4095, 3185, 4050, - 4095, 3191, 4049, - 4095, 3198, 4047, - 4095, 3207, 4045, - 4095, 3219, 4042, - 4095, 3235, 4037, - 4095, 3255, 4032, - 4095, 3281, 4024, - 4095, 3313, 4013, - 4095, 3353, 3998, - 4095, 3401, 3978, - 4095, 3459, 3949, - 4095, 3526, 3907, - 4095, 3602, 3845, - 4095, 3688, 3745, - 4074, 3782, 3564, - 0, 1736, 2002, - 0, 1737, 2001, - 0, 1739, 2000, - 0, 1741, 1998, - 0, 1744, 1995, - 0, 1748, 1991, - 0, 1753, 1986, - 0, 1760, 1979, - 0, 1769, 1970, - 0, 1781, 1958, - 0, 1796, 1940, - 0, 1816, 1916, - 0, 1841, 1881, - 0, 1872, 1830, - 0, 1911, 1752, - 0, 1958, 1620, - 0, 2015, 1347, - 0, 2080, 0, - 0, 2156, 0, - 0, 2240, 0, - 0, 2333, 0, - 0, 2434, 0, - 0, 2541, 0, - 0, 2653, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 0, 1737, 2004, - 0, 1738, 2003, - 0, 1739, 2001, - 0, 1742, 1999, - 0, 1745, 1997, - 0, 1749, 1993, - 0, 1754, 1988, - 0, 1761, 1981, - 0, 1769, 1972, - 0, 1781, 1960, - 0, 1796, 1942, - 0, 1816, 1918, - 0, 1841, 1883, - 0, 1872, 1833, - 0, 1911, 1755, - 0, 1958, 1624, - 0, 2015, 1354, - 0, 2081, 0, - 0, 2156, 0, - 0, 2241, 0, - 0, 2333, 0, - 0, 2434, 0, - 0, 2541, 0, - 0, 2653, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 0, 1737, 2006, - 0, 1738, 2005, - 0, 1740, 2004, - 0, 1742, 2002, - 0, 1745, 1999, - 0, 1749, 1995, - 0, 1754, 1990, - 0, 1761, 1984, - 0, 1770, 1974, - 0, 1782, 1962, - 0, 1797, 1945, - 0, 1817, 1921, - 0, 1841, 1886, - 0, 1873, 1836, - 0, 1912, 1759, - 0, 1959, 1629, - 0, 2015, 1363, - 0, 2081, 0, - 0, 2156, 0, - 0, 2241, 0, - 0, 2334, 0, - 0, 2434, 0, - 0, 2541, 0, - 0, 2653, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 0, 1738, 2009, - 0, 1739, 2008, - 0, 1741, 2007, - 0, 1743, 2005, - 0, 1746, 2002, - 0, 1750, 1998, - 0, 1755, 1993, - 0, 1762, 1987, - 0, 1771, 1978, - 0, 1782, 1965, - 0, 1798, 1948, - 0, 1817, 1924, - 0, 1842, 1890, - 0, 1873, 1840, - 0, 1912, 1764, - 0, 1959, 1636, - 0, 2015, 1375, - 0, 2081, 0, - 0, 2157, 0, - 0, 2241, 0, - 0, 2334, 0, - 0, 2434, 0, - 0, 2541, 0, - 0, 2653, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 0, 1739, 2013, - 0, 1740, 2012, - 0, 1742, 2011, - 0, 1744, 2009, - 0, 1747, 2006, - 0, 1751, 2002, - 0, 1756, 1997, - 0, 1763, 1991, - 0, 1772, 1982, - 0, 1783, 1970, - 0, 1798, 1953, - 0, 1818, 1929, - 0, 1843, 1895, - 0, 1874, 1846, - 0, 1913, 1771, - 0, 1960, 1645, - 0, 2016, 1391, - 0, 2082, 0, - 0, 2157, 0, - 0, 2241, 0, - 0, 2334, 0, - 0, 2434, 0, - 0, 2541, 0, - 0, 2653, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 0, 1740, 2018, - 0, 1741, 2017, - 0, 1743, 2016, - 0, 1745, 2014, - 0, 1748, 2011, - 0, 1752, 2008, - 0, 1757, 2003, - 0, 1764, 1996, - 0, 1773, 1988, - 0, 1785, 1975, - 0, 1800, 1959, - 0, 1819, 1935, - 0, 1844, 1902, - 0, 1875, 1854, - 0, 1914, 1779, - 0, 1961, 1656, - 0, 2017, 1412, - 0, 2082, 13, - 0, 2157, 0, - 0, 2242, 0, - 0, 2334, 0, - 0, 2435, 0, - 0, 2541, 0, - 0, 2654, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3138, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3522, 0, - 0, 3652, 0, - 0, 1742, 2025, - 0, 1743, 2024, - 0, 1745, 2023, - 0, 1747, 2021, - 0, 1750, 2018, - 0, 1754, 2015, - 0, 1759, 2010, - 0, 1766, 2004, - 0, 1775, 1995, - 0, 1786, 1983, - 0, 1801, 1967, - 0, 1821, 1944, - 0, 1845, 1911, - 0, 1876, 1864, - 0, 1915, 1791, - 0, 1962, 1672, - 0, 2018, 1438, - 0, 2083, 386, - 0, 2158, 0, - 0, 2242, 0, - 0, 2335, 0, - 0, 2435, 0, - 0, 2542, 0, - 0, 2654, 0, - 0, 2770, 0, - 0, 2890, 0, - 0, 3013, 0, - 0, 3139, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3523, 0, - 0, 3652, 0, - 0, 1744, 2035, - 0, 1746, 2033, - 0, 1747, 2032, - 0, 1749, 2030, - 0, 1752, 2028, - 0, 1756, 2024, - 0, 1761, 2020, - 0, 1768, 2013, - 0, 1777, 2005, - 0, 1788, 1993, - 0, 1803, 1977, - 0, 1823, 1955, - 0, 1847, 1923, - 0, 1878, 1877, - 0, 1917, 1806, - 0, 1963, 1691, - 0, 2019, 1470, - 0, 2084, 640, - 0, 2159, 0, - 0, 2243, 0, - 0, 2336, 0, - 0, 2436, 0, - 0, 2542, 0, - 0, 2654, 0, - 0, 2771, 0, - 0, 2891, 0, - 0, 3014, 0, - 0, 3139, 0, - 0, 3265, 0, - 0, 3393, 0, - 0, 3523, 0, - 0, 3652, 0, - 0, 1748, 2046, - 0, 1749, 2045, - 0, 1750, 2044, - 0, 1753, 2042, - 0, 1755, 2040, - 0, 1759, 2036, - 0, 1764, 2032, - 0, 1771, 2026, - 0, 1780, 2018, - 0, 1791, 2006, - 0, 1806, 1991, - 0, 1825, 1969, - 0, 1850, 1938, - 0, 1881, 1893, - 0, 1919, 1826, - 0, 1965, 1716, - 0, 2021, 1510, - 0, 2086, 846, - 0, 2160, 0, - 0, 2244, 0, - 0, 2336, 0, - 0, 2436, 0, - 0, 2543, 0, - 0, 2655, 0, - 0, 2771, 0, - 0, 2891, 0, - 0, 3014, 0, - 0, 3139, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3652, 0, - 0, 1752, 2062, - 0, 1753, 2061, - 0, 1755, 2060, - 0, 1757, 2058, - 0, 1760, 2055, - 0, 1763, 2052, - 0, 1768, 2048, - 0, 1775, 2042, - 0, 1784, 2034, - 0, 1795, 2023, - 0, 1810, 2008, - 0, 1829, 1987, - 0, 1853, 1958, - 0, 1884, 1915, - 0, 1922, 1851, - 0, 1968, 1748, - 0, 2023, 1559, - 0, 2088, 1026, - 0, 2162, 0, - 0, 2246, 0, - 0, 2338, 0, - 0, 2437, 0, - 0, 2543, 0, - 0, 2655, 0, - 0, 2771, 0, - 0, 2891, 0, - 0, 3014, 0, - 0, 3139, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3652, 0, - 0, 1757, 2082, - 0, 1759, 2081, - 0, 1760, 2080, - 0, 1762, 2078, - 0, 1765, 2076, - 0, 1769, 2073, - 0, 1774, 2068, - 0, 1780, 2063, - 0, 1789, 2055, - 0, 1800, 2045, - 0, 1815, 2030, - 0, 1834, 2011, - 0, 1858, 1983, - 0, 1888, 1942, - 0, 1925, 1882, - 0, 1971, 1787, - 0, 2026, 1616, - 0, 2090, 1191, - 0, 2164, 0, - 0, 2247, 0, - 0, 2339, 0, - 0, 2438, 0, - 0, 2544, 0, - 0, 2656, 0, - 0, 2772, 0, - 0, 2892, 0, - 0, 3014, 0, - 0, 3139, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3653, 0, - 30, 1765, 2107, - 0, 1766, 2106, - 0, 1767, 2105, - 0, 1770, 2103, - 0, 1772, 2101, - 0, 1776, 2098, - 0, 1781, 2094, - 0, 1787, 2089, - 0, 1796, 2082, - 0, 1807, 2072, - 0, 1821, 2059, - 0, 1840, 2040, - 0, 1864, 2014, - 0, 1893, 1976, - 0, 1931, 1921, - 0, 1976, 1834, - 0, 2030, 1684, - 0, 2094, 1346, - 0, 2167, 0, - 0, 2250, 0, - 0, 2341, 0, - 0, 2440, 0, - 0, 2546, 0, - 0, 2657, 0, - 0, 2773, 0, - 0, 2892, 0, - 0, 3015, 0, - 0, 3140, 0, - 0, 3266, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3653, 0, - 1247, 1774, 2139, - 1239, 1775, 2138, - 1228, 1777, 2137, - 1213, 1779, 2136, - 1193, 1782, 2133, - 1163, 1785, 2131, - 1121, 1790, 2127, - 1058, 1796, 2122, - 956, 1805, 2116, - 771, 1816, 2106, - 265, 1830, 2094, - 0, 1848, 2077, - 0, 1871, 2053, - 0, 1901, 2018, - 0, 1937, 1968, - 0, 1982, 1890, - 0, 2036, 1760, - 0, 2099, 1495, - 0, 2171, 0, - 0, 2253, 0, - 0, 2344, 0, - 0, 2442, 0, - 0, 2547, 0, - 0, 2658, 0, - 0, 2774, 0, - 0, 2893, 0, - 0, 3015, 0, - 0, 3140, 0, - 0, 3267, 0, - 0, 3394, 0, - 0, 3523, 0, - 0, 3653, 0, - 1614, 1787, 2178, - 1611, 1788, 2178, - 1606, 1790, 2177, - 1600, 1792, 2175, - 1591, 1794, 2173, - 1579, 1798, 2171, - 1563, 1802, 2167, - 1540, 1808, 2163, - 1507, 1817, 2157, - 1459, 1827, 2149, - 1387, 1841, 2137, - 1267, 1859, 2122, - 1031, 1881, 2100, - 0, 1910, 2069, - 0, 1946, 2024, - 0, 1990, 1956, - 0, 2043, 1846, - 0, 2105, 1639, - 0, 2177, 963, - 0, 2258, 0, - 0, 2348, 0, - 0, 2445, 0, - 0, 2550, 0, - 0, 2660, 0, - 0, 2775, 0, - 0, 2894, 0, - 0, 3016, 0, - 0, 3141, 0, - 0, 3267, 0, - 0, 3395, 0, - 0, 3523, 0, - 0, 3653, 0, - 1867, 1803, 2226, - 1865, 1804, 2225, - 1862, 1806, 2224, - 1858, 1808, 2223, - 1853, 1810, 2222, - 1847, 1814, 2219, - 1838, 1818, 2216, - 1825, 1824, 2212, - 1808, 1832, 2207, - 1784, 1842, 2199, - 1750, 1855, 2189, - 1700, 1873, 2175, - 1623, 1895, 2156, - 1494, 1923, 2129, - 1232, 1958, 2090, - 0, 2000, 2032, - 0, 2052, 1940, - 0, 2113, 1780, - 0, 2184, 1399, - 0, 2264, 0, - 0, 2352, 0, - 0, 2449, 0, - 0, 2553, 0, - 0, 2663, 0, - 0, 2777, 0, - 0, 2896, 0, - 0, 3017, 0, - 0, 3142, 0, - 0, 3268, 0, - 0, 3395, 0, - 0, 3524, 0, - 0, 3653, 0, - 2071, 1824, 2283, - 2070, 1825, 2282, - 2068, 1827, 2282, - 2066, 1828, 2281, - 2063, 1831, 2279, - 2059, 1834, 2277, - 2053, 1838, 2274, - 2046, 1844, 2271, - 2035, 1851, 2266, - 2021, 1861, 2260, - 2001, 1874, 2251, - 1973, 1891, 2239, - 1932, 1912, 2222, - 1871, 1939, 2198, - 1775, 1973, 2165, - 1602, 2014, 2117, - 1165, 2064, 2042, - 0, 2124, 1918, - 0, 2193, 1672, - 0, 2271, 186, - 0, 2359, 0, - 0, 2454, 0, - 0, 2557, 0, - 0, 2666, 0, - 0, 2780, 0, - 0, 2898, 0, - 0, 3019, 0, - 0, 3143, 0, - 0, 3268, 0, - 0, 3396, 0, - 0, 3524, 0, - 0, 3654, 0, - 2251, 1851, 2350, - 2250, 1852, 2349, - 2249, 1853, 2348, - 2248, 1855, 2347, - 2246, 1857, 2346, - 2243, 1860, 2344, - 2239, 1864, 2342, - 2234, 1869, 2339, - 2227, 1877, 2335, - 2218, 1886, 2329, - 2205, 1898, 2322, - 2187, 1914, 2311, - 2162, 1934, 2297, - 2127, 1960, 2277, - 2074, 1992, 2250, - 1993, 2032, 2210, - 1855, 2080, 2150, - 1563, 2138, 2055, - 0, 2205, 1887, - 0, 2281, 1471, - 0, 2367, 0, - 0, 2461, 0, - 0, 2562, 0, - 0, 2670, 0, - 0, 2783, 0, - 0, 2900, 0, - 0, 3021, 0, - 0, 3144, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 2416, 1884, 2425, - 2415, 1885, 2425, - 2415, 1886, 2424, - 2413, 1888, 2424, - 2412, 1890, 2423, - 2410, 1893, 2421, - 2408, 1896, 2419, - 2404, 1901, 2417, - 2399, 1908, 2413, - 2393, 1917, 2408, - 2384, 1928, 2402, - 2372, 1943, 2393, - 2356, 1962, 2382, - 2333, 1986, 2365, - 2300, 2017, 2342, - 2253, 2054, 2310, - 2180, 2101, 2263, - 2060, 2156, 2191, - 1826, 2220, 2072, - 763, 2295, 1841, - 0, 2378, 850, - 0, 2470, 0, - 0, 2570, 0, - 0, 2676, 0, - 0, 2787, 0, - 0, 2904, 0, - 0, 3023, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 2571, 1925, 2511, - 2571, 1926, 2510, - 2570, 1927, 2510, - 2569, 1928, 2509, - 2568, 1930, 2508, - 2567, 1933, 2507, - 2565, 1936, 2505, - 2563, 1941, 2503, - 2559, 1947, 2500, - 2555, 1955, 2496, - 2549, 1965, 2491, - 2540, 1979, 2484, - 2529, 1997, 2474, - 2514, 2019, 2461, - 2492, 2048, 2443, - 2461, 2083, 2417, - 2417, 2126, 2380, - 2350, 2179, 2326, - 2240, 2240, 2240, - 2036, 2312, 2094, - 1384, 2392, 1771, - 0, 2482, 0, - 0, 2579, 0, - 0, 2683, 0, - 0, 2793, 0, - 0, 2908, 0, - 0, 3027, 0, - 0, 3149, 0, - 0, 3273, 0, - 0, 3399, 0, - 0, 3527, 0, - 0, 3656, 0, - 2720, 1975, 2604, - 2719, 1975, 2604, - 2719, 1976, 2603, - 2718, 1978, 2603, - 2718, 1979, 2602, - 2717, 1982, 2601, - 2715, 1985, 2600, - 2713, 1989, 2598, - 2711, 1994, 2596, - 2708, 2002, 2593, - 2704, 2011, 2588, - 2698, 2023, 2583, - 2690, 2039, 2575, - 2679, 2060, 2564, - 2664, 2086, 2550, - 2643, 2119, 2529, - 2614, 2159, 2501, - 2571, 2208, 2460, - 2508, 2266, 2398, - 2405, 2333, 2299, - 2218, 2411, 2122, - 1698, 2497, 1658, - 0, 2591, 0, - 0, 2693, 0, - 0, 2801, 0, - 0, 2914, 0, - 0, 3032, 0, - 0, 3152, 0, - 0, 3276, 0, - 0, 3401, 0, - 0, 3529, 0, - 0, 3657, 0, - 2864, 2033, 2705, - 2863, 2034, 2705, - 2863, 2035, 2704, - 2863, 2036, 2704, - 2862, 2038, 2703, - 2861, 2040, 2703, - 2860, 2042, 2702, - 2859, 2046, 2700, - 2857, 2051, 2698, - 2855, 2057, 2696, - 2852, 2066, 2692, - 2848, 2076, 2688, - 2842, 2091, 2682, - 2834, 2109, 2673, - 2824, 2133, 2662, - 2809, 2162, 2646, - 2789, 2199, 2624, - 2761, 2244, 2593, - 2720, 2298, 2548, - 2658, 2361, 2479, - 2560, 2434, 2368, - 2385, 2516, 2156, - 1930, 2607, 1441, - 0, 2706, 0, - 0, 2811, 0, - 0, 2922, 0, - 0, 3038, 0, - 0, 3157, 0, - 0, 3279, 0, - 0, 3404, 0, - 0, 3531, 0, - 0, 3658, 0, - 3004, 2102, 2812, - 3004, 2102, 2812, - 3004, 2103, 2812, - 3004, 2104, 2811, - 3003, 2105, 2811, - 3003, 2107, 2810, - 3002, 2110, 2810, - 3001, 2113, 2808, - 3000, 2117, 2807, - 2998, 2122, 2805, - 2996, 2130, 2802, - 2993, 2139, 2799, - 2989, 2152, 2794, - 2983, 2168, 2787, - 2976, 2188, 2779, - 2965, 2215, 2766, - 2951, 2248, 2750, - 2931, 2288, 2726, - 2903, 2337, 2693, - 2863, 2396, 2644, - 2804, 2464, 2570, - 2709, 2541, 2446, - 2541, 2628, 2199, - 2125, 2722, 664, - 0, 2824, 0, - 0, 2932, 0, - 0, 3046, 0, - 0, 3163, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3660, 0, - 3143, 2180, 2925, - 3143, 2180, 2925, - 3143, 2181, 2924, - 3142, 2182, 2924, - 3142, 2183, 2924, - 3142, 2184, 2923, - 3141, 2186, 2923, - 3141, 2189, 2922, - 3140, 2192, 2921, - 3138, 2197, 2919, - 3137, 2203, 2917, - 3134, 2211, 2914, - 3131, 2222, 2911, - 3127, 2236, 2906, - 3122, 2254, 2899, - 3114, 2276, 2890, - 3104, 2305, 2877, - 3090, 2341, 2859, - 3071, 2385, 2835, - 3043, 2438, 2799, - 3004, 2500, 2748, - 2945, 2572, 2668, - 2853, 2653, 2532, - 2690, 2743, 2250, - 2299, 2841, 0, - 0, 2946, 0, - 0, 3056, 0, - 0, 3171, 0, - 0, 3290, 0, - 0, 3412, 0, - 0, 3537, 0, - 0, 3663, 0, - 3280, 2267, 3042, - 3280, 2267, 3042, - 3280, 2267, 3041, - 3279, 2268, 3041, - 3279, 2269, 3041, - 3279, 2270, 3041, - 3278, 2272, 3040, - 3278, 2274, 3039, - 3277, 2277, 3039, - 3276, 2281, 3037, - 3275, 2286, 3036, - 3273, 2293, 3034, - 3271, 2302, 3031, - 3268, 2313, 3027, - 3264, 2328, 3022, - 3259, 2348, 3015, - 3251, 2373, 3005, - 3241, 2404, 2992, - 3227, 2442, 2974, - 3208, 2489, 2948, - 3181, 2545, 2911, - 3142, 2611, 2857, - 3085, 2686, 2773, - 2994, 2770, 2628, - 2835, 2863, 2310, - 2460, 2963, 0, - 0, 3070, 0, - 0, 3182, 0, - 0, 3299, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 3415, 2362, 3162, - 3415, 2362, 3162, - 3415, 2362, 3162, - 3415, 2363, 3162, - 3415, 2364, 3162, - 3415, 2365, 3161, - 3414, 2366, 3161, - 3414, 2368, 3160, - 3414, 2370, 3160, - 3413, 2373, 3159, - 3412, 2377, 3158, - 3411, 2383, 3156, - 3409, 2390, 3154, - 3407, 2400, 3151, - 3404, 2412, 3147, - 3400, 2429, 3142, - 3394, 2449, 3134, - 3387, 2476, 3124, - 3377, 2509, 3111, - 3363, 2550, 3092, - 3344, 2599, 3066, - 3318, 2658, 3028, - 3279, 2726, 2971, - 3222, 2804, 2883, - 3132, 2891, 2730, - 2976, 2985, 2380, - 2613, 3088, 0, - 0, 3196, 0, - 0, 3309, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3550, 2464, 3285, - 3550, 2464, 3285, - 3550, 2464, 3285, - 3550, 2465, 3285, - 3550, 2465, 3285, - 3550, 2466, 3285, - 3549, 2467, 3284, - 3549, 2469, 3284, - 3549, 2471, 3284, - 3548, 2473, 3283, - 3548, 2477, 3282, - 3547, 2481, 3281, - 3545, 2487, 3279, - 3544, 2495, 3277, - 3542, 2505, 3274, - 3539, 2518, 3270, - 3535, 2535, 3264, - 3529, 2557, 3257, - 3522, 2585, 3247, - 3512, 2620, 3233, - 3498, 2663, 3214, - 3479, 2714, 3187, - 3453, 2775, 3148, - 3415, 2845, 3090, - 3358, 2925, 2999, - 3269, 3014, 2838, - 3115, 3110, 2460, - 2760, 3214, 0, - 0, 3323, 0, - 0, 3438, 0, - 0, 3556, 0, - 0, 3678, 0, - 3684, 2572, 3411, - 3684, 2572, 3411, - 3684, 2573, 3411, - 3684, 2573, 3410, - 3684, 2574, 3410, - 3684, 2574, 3410, - 3684, 2575, 3410, - 3683, 2576, 3410, - 3683, 2578, 3409, - 3683, 2580, 3409, - 3682, 2582, 3408, - 3682, 2586, 3407, - 3681, 2591, 3406, - 3679, 2597, 3404, - 3678, 2605, 3402, - 3676, 2616, 3399, - 3673, 2630, 3395, - 3669, 2647, 3389, - 3663, 2670, 3382, - 3656, 2699, 3371, - 3646, 2736, 3357, - 3633, 2780, 3338, - 3614, 2833, 3310, - 3587, 2895, 3270, - 3549, 2967, 3211, - 3493, 3049, 3118, - 3405, 3139, 2952, - 3252, 3237, 2548, - 2902, 3342, 0, - 0, 3452, 0, - 0, 3567, 0, - 0, 3686, 0, - 3818, 2686, 3538, - 3818, 2686, 3538, - 3818, 2686, 3538, - 3818, 2686, 3537, - 3817, 2687, 3537, - 3817, 2687, 3537, - 3817, 2688, 3537, - 3817, 2689, 3537, - 3817, 2690, 3537, - 3817, 2692, 3536, - 3816, 2694, 3536, - 3816, 2696, 3535, - 3815, 2700, 3534, - 3814, 2705, 3533, - 3813, 2711, 3531, - 3811, 2720, 3529, - 3809, 2731, 3526, - 3806, 2745, 3522, - 3802, 2764, 3516, - 3797, 2788, 3508, - 3790, 2818, 3498, - 3780, 2855, 3484, - 3766, 2900, 3464, - 3748, 2955, 3436, - 3721, 3018, 3395, - 3683, 3092, 3335, - 3627, 3174, 3240, - 3540, 3266, 3070, - 3387, 3365, 2644, - 3042, 3470, 0, - 0, 3582, 0, - 0, 3697, 0, - 3951, 2804, 3666, - 3951, 2804, 3666, - 3951, 2804, 3666, - 3951, 2804, 3666, - 3951, 2804, 3666, - 3951, 2805, 3666, - 3951, 2805, 3665, - 3950, 2806, 3665, - 3950, 2807, 3665, - 3950, 2808, 3665, - 3950, 2810, 3664, - 3949, 2812, 3664, - 3949, 2815, 3663, - 3948, 2818, 3662, - 3947, 2823, 3661, - 3946, 2830, 3659, - 3944, 2839, 3657, - 3942, 2850, 3654, - 3939, 2865, 3650, - 3935, 2884, 3644, - 3930, 2909, 3636, - 3923, 2939, 3626, - 3913, 2977, 3611, - 3900, 3024, 3591, - 3881, 3079, 3563, - 3855, 3144, 3522, - 3817, 3218, 3461, - 3761, 3302, 3364, - 3674, 3394, 3191, - 3522, 3494, 2748, - 3180, 3600, 0, - 0, 3712, 0, - 4084, 2925, 3795, - 4084, 2925, 3795, - 4084, 2925, 3795, - 4084, 2925, 3795, - 4084, 2925, 3795, - 4084, 2926, 3795, - 4083, 2926, 3795, - 4083, 2926, 3795, - 4083, 2927, 3794, - 4083, 2928, 3794, - 4083, 2929, 3794, - 4083, 2931, 3794, - 4082, 2933, 3793, - 4082, 2936, 3792, - 4081, 2940, 3791, - 4080, 2945, 3790, - 4079, 2952, 3788, - 4077, 2961, 3786, - 4075, 2972, 3783, - 4072, 2988, 3779, - 4068, 3007, 3773, - 4063, 3032, 3765, - 4056, 3063, 3755, - 4046, 3102, 3740, - 4033, 3149, 3720, - 4014, 3205, 3691, - 3988, 3271, 3650, - 3950, 3346, 3589, - 3894, 3430, 3491, - 3807, 3523, 3314, - 3656, 3623, 2857, - 3317, 3730, 0, - 4095, 3048, 3925, - 4095, 3048, 3925, - 4095, 3048, 3925, - 4095, 3049, 3925, - 4095, 3049, 3925, - 4095, 3049, 3925, - 4095, 3049, 3925, - 4095, 3050, 3925, - 4095, 3050, 3924, - 4095, 3051, 3924, - 4095, 3052, 3924, - 4095, 3053, 3924, - 4095, 3055, 3923, - 4095, 3057, 3923, - 4095, 3060, 3922, - 4095, 3064, 3921, - 4095, 3069, 3920, - 4095, 3076, 3918, - 4095, 3085, 3916, - 4095, 3097, 3913, - 4095, 3112, 3908, - 4095, 3132, 3903, - 4095, 3157, 3895, - 4095, 3189, 3884, - 4095, 3228, 3870, - 4095, 3276, 3849, - 4095, 3333, 3821, - 4095, 3399, 3779, - 4083, 3475, 3717, - 4027, 3560, 3619, - 3940, 3653, 3440, - 3790, 3754, 2972, - 4095, 3174, 4055, - 4095, 3174, 4055, - 4095, 3174, 4055, - 4095, 3174, 4055, - 4095, 3174, 4055, - 4095, 3174, 4055, - 4095, 3175, 4055, - 4095, 3175, 4055, - 4095, 3175, 4055, - 4095, 3176, 4055, - 4095, 3177, 4055, - 4095, 3178, 4055, - 4095, 3179, 4054, - 4095, 3181, 4054, - 4095, 3183, 4053, - 4095, 3186, 4053, - 4095, 3190, 4052, - 4095, 3195, 4050, - 4095, 3202, 4049, - 4095, 3211, 4046, - 4095, 3223, 4043, - 4095, 3239, 4039, - 4095, 3259, 4033, - 4095, 3285, 4025, - 4095, 3317, 4015, - 4095, 3356, 4000, - 4095, 3404, 3979, - 4095, 3461, 3951, - 4095, 3528, 3909, - 4095, 3604, 3847, - 4095, 3690, 3747, - 4073, 3783, 3567, - 0, 1867, 2134, - 0, 1868, 2133, - 0, 1869, 2132, - 0, 1871, 2130, - 0, 1873, 2128, - 0, 1876, 2126, - 0, 1880, 2122, - 0, 1885, 2117, - 0, 1892, 2110, - 0, 1901, 2101, - 0, 1913, 2088, - 0, 1928, 2071, - 0, 1948, 2047, - 0, 1973, 2012, - 0, 2004, 1961, - 0, 2043, 1882, - 0, 2090, 1749, - 0, 2146, 1473, - 0, 2212, 0, - 0, 2288, 0, - 0, 2372, 0, - 0, 2465, 0, - 0, 2566, 0, - 0, 2673, 0, - 0, 2785, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 0, 1867, 2135, - 0, 1868, 2134, - 0, 1869, 2133, - 0, 1871, 2132, - 0, 1873, 2130, - 0, 1876, 2127, - 0, 1880, 2123, - 0, 1885, 2118, - 0, 1892, 2112, - 0, 1901, 2102, - 0, 1913, 2090, - 0, 1928, 2072, - 0, 1948, 2048, - 0, 1973, 2013, - 0, 2004, 1962, - 0, 2043, 1884, - 0, 2090, 1752, - 0, 2147, 1479, - 0, 2213, 0, - 0, 2288, 0, - 0, 2372, 0, - 0, 2465, 0, - 0, 2566, 0, - 0, 2673, 0, - 0, 2785, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3654, 0, - 0, 1868, 2137, - 0, 1869, 2136, - 0, 1870, 2135, - 0, 1872, 2133, - 0, 1874, 2131, - 0, 1877, 2129, - 0, 1881, 2125, - 0, 1886, 2120, - 0, 1893, 2113, - 0, 1902, 2104, - 0, 1913, 2092, - 0, 1929, 2074, - 0, 1948, 2050, - 0, 1973, 2016, - 0, 2004, 1965, - 0, 2043, 1887, - 0, 2091, 1756, - 0, 2147, 1486, - 0, 2213, 0, - 0, 2288, 0, - 0, 2373, 0, - 0, 2466, 0, - 0, 2566, 0, - 0, 2673, 0, - 0, 2785, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 0, 1868, 2139, - 0, 1869, 2138, - 0, 1870, 2137, - 0, 1872, 2136, - 0, 1874, 2134, - 0, 1877, 2131, - 0, 1881, 2127, - 0, 1886, 2122, - 0, 1893, 2116, - 0, 1902, 2107, - 0, 1914, 2094, - 0, 1929, 2077, - 0, 1949, 2053, - 0, 1974, 2019, - 0, 2005, 1968, - 0, 2044, 1891, - 0, 2091, 1761, - 0, 2147, 1495, - 0, 2213, 0, - 0, 2288, 0, - 0, 2373, 0, - 0, 2466, 0, - 0, 2566, 0, - 0, 2673, 0, - 0, 2785, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 0, 1869, 2142, - 0, 1870, 2141, - 0, 1871, 2140, - 0, 1873, 2139, - 0, 1875, 2137, - 0, 1878, 2134, - 0, 1882, 2130, - 0, 1887, 2125, - 0, 1894, 2119, - 0, 1903, 2110, - 0, 1915, 2097, - 0, 1930, 2080, - 0, 1949, 2056, - 0, 1974, 2022, - 0, 2005, 1973, - 0, 2044, 1896, - 0, 2091, 1768, - 0, 2148, 1508, - 0, 2213, 0, - 0, 2289, 0, - 0, 2373, 0, - 0, 2466, 0, - 0, 2566, 0, - 0, 2673, 0, - 0, 2785, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 0, 1870, 2146, - 0, 1871, 2145, - 0, 1872, 2144, - 0, 1874, 2143, - 0, 1876, 2141, - 0, 1879, 2138, - 0, 1883, 2134, - 0, 1888, 2130, - 0, 1895, 2123, - 0, 1904, 2114, - 0, 1915, 2102, - 0, 1931, 2085, - 0, 1950, 2061, - 0, 1975, 2028, - 0, 2006, 1978, - 0, 2045, 1903, - 0, 2092, 1777, - 0, 2148, 1523, - 0, 2214, 0, - 0, 2289, 0, - 0, 2373, 0, - 0, 2466, 0, - 0, 2567, 0, - 0, 2673, 0, - 0, 2786, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3270, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 0, 1871, 2151, - 0, 1872, 2151, - 0, 1874, 2149, - 0, 1875, 2148, - 0, 1877, 2146, - 0, 1880, 2143, - 0, 1884, 2140, - 0, 1889, 2135, - 0, 1896, 2129, - 0, 1905, 2120, - 0, 1917, 2108, - 0, 1932, 2091, - 0, 1951, 2068, - 0, 1976, 2034, - 0, 2007, 1986, - 0, 2046, 1912, - 0, 2093, 1788, - 0, 2149, 1544, - 0, 2214, 145, - 0, 2290, 0, - 0, 2374, 0, - 0, 2467, 0, - 0, 2567, 0, - 0, 2674, 0, - 0, 2786, 0, - 0, 2902, 0, - 0, 3022, 0, - 0, 3145, 0, - 0, 3271, 0, - 0, 3397, 0, - 0, 3525, 0, - 0, 3655, 0, - 0, 1873, 2158, - 0, 1874, 2157, - 0, 1875, 2156, - 0, 1877, 2155, - 0, 1879, 2153, - 0, 1882, 2150, - 0, 1886, 2147, - 0, 1891, 2142, - 0, 1898, 2136, - 0, 1907, 2127, - 0, 1918, 2115, - 0, 1933, 2099, - 0, 1953, 2076, - 0, 1977, 2043, - 0, 2009, 1996, - 0, 2047, 1923, - 0, 2094, 1804, - 0, 2150, 1570, - 0, 2215, 518, - 0, 2290, 0, - 0, 2374, 0, - 0, 2467, 0, - 0, 2567, 0, - 0, 2674, 0, - 0, 2786, 0, - 0, 2902, 0, - 0, 3023, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3397, 0, - 0, 3526, 0, - 0, 3655, 0, - 0, 1876, 2167, - 0, 1876, 2167, - 0, 1878, 2166, - 0, 1879, 2164, - 0, 1882, 2162, - 0, 1884, 2160, - 0, 1888, 2156, - 0, 1893, 2152, - 0, 1900, 2145, - 0, 1909, 2137, - 0, 1920, 2125, - 0, 1935, 2109, - 0, 1955, 2087, - 0, 1979, 2055, - 0, 2010, 2009, - 0, 2049, 1938, - 0, 2095, 1823, - 0, 2151, 1602, - 0, 2216, 772, - 0, 2291, 0, - 0, 2375, 0, - 0, 2468, 0, - 0, 2568, 0, - 0, 2674, 0, - 0, 2786, 0, - 0, 2903, 0, - 0, 3023, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 0, 1879, 2179, - 0, 1880, 2179, - 0, 1881, 2178, - 0, 1883, 2176, - 0, 1885, 2174, - 0, 1888, 2172, - 0, 1891, 2168, - 0, 1896, 2164, - 0, 1903, 2158, - 0, 1912, 2150, - 0, 1923, 2138, - 0, 1938, 2123, - 0, 1957, 2101, - 0, 1982, 2070, - 0, 2013, 2026, - 0, 2051, 1958, - 0, 2097, 1848, - 0, 2153, 1642, - 0, 2218, 978, - 0, 2293, 0, - 0, 2376, 0, - 0, 2469, 0, - 0, 2568, 0, - 0, 2675, 0, - 0, 2787, 0, - 0, 2903, 0, - 0, 3023, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 0, 1883, 2195, - 0, 1884, 2194, - 0, 1885, 2193, - 0, 1887, 2192, - 0, 1889, 2190, - 0, 1892, 2188, - 0, 1895, 2184, - 0, 1900, 2180, - 0, 1907, 2174, - 0, 1916, 2166, - 0, 1927, 2155, - 0, 1942, 2140, - 0, 1961, 2119, - 0, 1985, 2090, - 0, 2016, 2047, - 0, 2054, 1983, - 0, 2100, 1880, - 0, 2155, 1691, - 0, 2220, 1158, - 0, 2294, 0, - 0, 2378, 0, - 0, 2470, 0, - 0, 2569, 0, - 0, 2676, 0, - 0, 2787, 0, - 0, 2904, 0, - 0, 3023, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 0, 1889, 2215, - 0, 1889, 2214, - 0, 1891, 2213, - 0, 1892, 2212, - 0, 1894, 2210, - 0, 1897, 2208, - 0, 1901, 2205, - 0, 1906, 2200, - 0, 1912, 2195, - 0, 1921, 2187, - 0, 1932, 2177, - 0, 1947, 2163, - 0, 1966, 2143, - 0, 1990, 2115, - 0, 2020, 2074, - 0, 2058, 2014, - 0, 2103, 1919, - 0, 2158, 1748, - 0, 2223, 1323, - 0, 2296, 0, - 0, 2380, 0, - 0, 2471, 0, - 0, 2571, 0, - 0, 2677, 0, - 0, 2788, 0, - 0, 2904, 0, - 0, 3024, 0, - 0, 3146, 0, - 0, 3271, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 241, 1896, 2240, - 162, 1897, 2239, - 31, 1898, 2238, - 0, 1900, 2237, - 0, 1902, 2236, - 0, 1904, 2233, - 0, 1908, 2230, - 0, 1913, 2227, - 0, 1919, 2221, - 0, 1928, 2214, - 0, 1939, 2204, - 0, 1953, 2191, - 0, 1972, 2172, - 0, 1996, 2146, - 0, 2026, 2108, - 0, 2063, 2053, - 0, 2108, 1966, - 0, 2162, 1816, - 0, 2226, 1478, - 0, 2299, 0, - 0, 2382, 0, - 0, 2473, 0, - 0, 2572, 0, - 0, 2678, 0, - 0, 2789, 0, - 0, 2905, 0, - 0, 3024, 0, - 0, 3147, 0, - 0, 3272, 0, - 0, 3398, 0, - 0, 3526, 0, - 0, 3655, 0, - 1385, 1906, 2272, - 1379, 1906, 2271, - 1371, 1908, 2270, - 1360, 1909, 2269, - 1345, 1911, 2268, - 1325, 1914, 2266, - 1296, 1917, 2263, - 1253, 1922, 2259, - 1190, 1929, 2254, - 1089, 1937, 2248, - 903, 1948, 2239, - 397, 1962, 2226, - 0, 1980, 2209, - 0, 2003, 2185, - 0, 2033, 2150, - 0, 2069, 2100, - 0, 2114, 2023, - 0, 2168, 1893, - 0, 2231, 1627, - 0, 2303, 0, - 0, 2385, 0, - 0, 2476, 0, - 0, 2574, 0, - 0, 2680, 0, - 0, 2790, 0, - 0, 2906, 0, - 0, 3025, 0, - 0, 3148, 0, - 0, 3272, 0, - 0, 3399, 0, - 0, 3526, 0, - 0, 3655, 0, - 1749, 1918, 2311, - 1747, 1919, 2310, - 1743, 1920, 2310, - 1738, 1922, 2309, - 1732, 1924, 2307, - 1723, 1926, 2305, - 1711, 1930, 2303, - 1695, 1934, 2300, - 1672, 1941, 2295, - 1639, 1949, 2289, - 1592, 1959, 2281, - 1519, 1973, 2269, - 1399, 1991, 2254, - 1164, 2014, 2232, - 83, 2042, 2201, - 0, 2078, 2156, - 0, 2122, 2088, - 0, 2175, 1978, - 0, 2237, 1771, - 0, 2309, 1096, - 0, 2390, 0, - 0, 2480, 0, - 0, 2577, 0, - 0, 2682, 0, - 0, 2792, 0, - 0, 2907, 0, - 0, 3026, 0, - 0, 3148, 0, - 0, 3273, 0, - 0, 3399, 0, - 0, 3527, 0, - 0, 3656, 0, - 2000, 1935, 2359, - 1999, 1935, 2358, - 1997, 1936, 2358, - 1994, 1938, 2357, - 1990, 1940, 2355, - 1985, 1942, 2354, - 1979, 1946, 2351, - 1970, 1950, 2348, - 1957, 1956, 2344, - 1940, 1964, 2339, - 1916, 1974, 2331, - 1882, 1988, 2321, - 1832, 2005, 2307, - 1755, 2027, 2288, - 1626, 2055, 2261, - 1364, 2090, 2222, - 0, 2133, 2164, - 0, 2184, 2073, - 0, 2245, 1912, - 0, 2316, 1531, - 0, 2396, 0, - 0, 2484, 0, - 0, 2581, 0, - 0, 2685, 0, - 0, 2795, 0, - 0, 2909, 0, - 0, 3028, 0, - 0, 3149, 0, - 0, 3274, 0, - 0, 3400, 0, - 0, 3527, 0, - 0, 3656, 0, - 2205, 1955, 2416, - 2204, 1956, 2415, - 2202, 1957, 2415, - 2201, 1959, 2414, - 2198, 1960, 2413, - 2195, 1963, 2411, - 2191, 1966, 2409, - 2185, 1970, 2407, - 2178, 1976, 2403, - 2167, 1984, 2398, - 2153, 1993, 2392, - 2133, 2006, 2383, - 2105, 2023, 2371, - 2064, 2044, 2354, - 2003, 2071, 2331, - 1907, 2105, 2297, - 1734, 2146, 2249, - 1297, 2196, 2174, - 0, 2256, 2050, - 0, 2325, 1804, - 0, 2403, 318, - 0, 2491, 0, - 0, 2586, 0, - 0, 2689, 0, - 0, 2798, 0, - 0, 2912, 0, - 0, 3030, 0, - 0, 3151, 0, - 0, 3275, 0, - 0, 3401, 0, - 0, 3528, 0, - 0, 3656, 0, - 2384, 1982, 2482, - 2383, 1983, 2482, - 2382, 1984, 2481, - 2381, 1985, 2480, - 2380, 1987, 2479, - 2378, 1989, 2478, - 2375, 1992, 2476, - 2371, 1996, 2474, - 2366, 2002, 2471, - 2359, 2009, 2467, - 2350, 2018, 2461, - 2337, 2030, 2454, - 2319, 2046, 2443, - 2294, 2066, 2429, - 2259, 2092, 2410, - 2206, 2124, 2382, - 2125, 2164, 2342, - 1987, 2212, 2282, - 1696, 2270, 2187, - 0, 2337, 2019, - 0, 2414, 1603, - 0, 2499, 0, - 0, 2593, 0, - 0, 2694, 0, - 0, 2802, 0, - 0, 2915, 0, - 0, 3032, 0, - 0, 3153, 0, - 0, 3276, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 2549, 2015, 2558, - 2548, 2016, 2558, - 2547, 2017, 2557, - 2547, 2018, 2557, - 2546, 2020, 2556, - 2544, 2022, 2555, - 2542, 2025, 2553, - 2540, 2029, 2551, - 2536, 2034, 2549, - 2531, 2040, 2545, - 2525, 2049, 2541, - 2516, 2060, 2534, - 2504, 2075, 2526, - 2488, 2094, 2514, - 2465, 2118, 2497, - 2432, 2149, 2475, - 2385, 2187, 2442, - 2312, 2233, 2395, - 2192, 2288, 2323, - 1958, 2352, 2204, - 895, 2427, 1973, - 0, 2510, 982, - 0, 2602, 0, - 0, 2702, 0, - 0, 2808, 0, - 0, 2919, 0, - 0, 3036, 0, - 0, 3156, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 2703, 2056, 2643, - 2703, 2057, 2643, - 2703, 2058, 2642, - 2702, 2059, 2642, - 2701, 2060, 2641, - 2700, 2062, 2640, - 2699, 2065, 2639, - 2697, 2068, 2637, - 2695, 2073, 2635, - 2691, 2079, 2632, - 2687, 2087, 2629, - 2681, 2097, 2623, - 2673, 2111, 2616, - 2661, 2129, 2607, - 2646, 2151, 2593, - 2624, 2180, 2575, - 2593, 2215, 2549, - 2549, 2259, 2512, - 2482, 2311, 2458, - 2373, 2373, 2373, - 2168, 2444, 2226, - 1516, 2524, 1903, - 0, 2614, 0, - 0, 2711, 0, - 0, 2815, 0, - 0, 2925, 0, - 0, 3040, 0, - 0, 3159, 0, - 0, 3281, 0, - 0, 3405, 0, - 0, 3531, 0, - 0, 3659, 0, - 2852, 2106, 2736, - 2852, 2107, 2736, - 2851, 2107, 2736, - 2851, 2108, 2735, - 2850, 2110, 2735, - 2850, 2111, 2734, - 2849, 2114, 2733, - 2847, 2117, 2732, - 2846, 2121, 2730, - 2843, 2126, 2728, - 2840, 2134, 2725, - 2836, 2143, 2720, - 2830, 2155, 2715, - 2822, 2171, 2707, - 2811, 2192, 2696, - 2796, 2218, 2682, - 2775, 2251, 2662, - 2746, 2291, 2633, - 2703, 2340, 2592, - 2640, 2398, 2530, - 2537, 2466, 2431, - 2350, 2543, 2254, - 1830, 2629, 1790, - 0, 2723, 0, - 0, 2825, 0, - 0, 2933, 0, - 0, 3046, 0, - 0, 3164, 0, - 0, 3284, 0, - 0, 3408, 0, - 0, 3533, 0, - 0, 3661, 0, - 2996, 2165, 2837, - 2996, 2165, 2837, - 2995, 2166, 2837, - 2995, 2167, 2836, - 2995, 2168, 2836, - 2994, 2170, 2835, - 2994, 2172, 2835, - 2993, 2174, 2834, - 2991, 2178, 2832, - 2990, 2183, 2830, - 2987, 2189, 2828, - 2984, 2198, 2825, - 2980, 2209, 2820, - 2974, 2223, 2814, - 2966, 2241, 2805, - 2956, 2265, 2794, - 2941, 2294, 2778, - 2921, 2331, 2756, - 2893, 2376, 2725, - 2852, 2430, 2680, - 2790, 2493, 2611, - 2693, 2566, 2500, - 2517, 2648, 2288, - 2062, 2739, 1573, - 0, 2838, 0, - 0, 2943, 0, - 0, 3054, 0, - 0, 3170, 0, - 0, 3289, 0, - 0, 3412, 0, - 0, 3536, 0, - 0, 3663, 0, - 3137, 2233, 2944, - 3136, 2234, 2944, - 3136, 2234, 2944, - 3136, 2235, 2944, - 3136, 2236, 2944, - 3135, 2238, 2943, - 3135, 2239, 2942, - 3134, 2242, 2942, - 3133, 2245, 2941, - 3132, 2249, 2939, - 3130, 2254, 2937, - 3128, 2262, 2934, - 3125, 2271, 2931, - 3121, 2284, 2926, - 3115, 2300, 2920, - 3108, 2320, 2911, - 3097, 2347, 2899, - 3083, 2380, 2882, - 3063, 2420, 2858, - 3036, 2469, 2825, - 2996, 2528, 2776, - 2936, 2596, 2702, - 2841, 2673, 2578, - 2673, 2760, 2331, - 2257, 2854, 796, - 0, 2956, 0, - 0, 3064, 0, - 0, 3178, 0, - 0, 3295, 0, - 0, 3416, 0, - 0, 3540, 0, - 0, 3665, 0, - 3275, 2311, 3057, - 3275, 2312, 3057, - 3275, 2312, 3057, - 3275, 2313, 3057, - 3275, 2314, 3056, - 3274, 2315, 3056, - 3274, 2316, 3055, - 3273, 2318, 3055, - 3273, 2321, 3054, - 3272, 2324, 3053, - 3270, 2329, 3051, - 3269, 2335, 3049, - 3267, 2343, 3046, - 3263, 2354, 3043, - 3259, 2368, 3038, - 3254, 2386, 3031, - 3246, 2409, 3022, - 3236, 2437, 3009, - 3222, 2473, 2991, - 3203, 2517, 2967, - 3175, 2570, 2931, - 3136, 2633, 2880, - 3078, 2704, 2800, - 2985, 2786, 2665, - 2822, 2875, 2382, - 2431, 2973, 0, - 0, 3078, 0, - 0, 3188, 0, - 0, 3303, 0, - 0, 3422, 0, - 0, 3545, 0, - 0, 3669, 0, - 3412, 2398, 3174, - 3412, 2399, 3174, - 3412, 2399, 3174, - 3412, 2400, 3174, - 3411, 2400, 3173, - 3411, 2401, 3173, - 3411, 2402, 3173, - 3411, 2404, 3172, - 3410, 2406, 3172, - 3409, 2409, 3171, - 3408, 2413, 3170, - 3407, 2418, 3168, - 3406, 2425, 3166, - 3403, 2434, 3163, - 3400, 2445, 3159, - 3396, 2461, 3154, - 3391, 2480, 3147, - 3383, 2505, 3137, - 3373, 2536, 3124, - 3360, 2574, 3106, - 3340, 2621, 3080, - 3313, 2677, 3043, - 3275, 2743, 2989, - 3217, 2818, 2905, - 3126, 2902, 2760, - 2967, 2995, 2442, - 2592, 3095, 0, - 0, 3202, 0, - 0, 3314, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 3547, 2493, 3294, - 3547, 2494, 3294, - 3547, 2494, 3294, - 3547, 2494, 3294, - 3547, 2495, 3294, - 3547, 2496, 3294, - 3547, 2497, 3293, - 3547, 2498, 3293, - 3546, 2500, 3293, - 3546, 2502, 3292, - 3545, 2505, 3291, - 3544, 2510, 3290, - 3543, 2515, 3288, - 3541, 2522, 3286, - 3539, 2532, 3283, - 3536, 2545, 3279, - 3532, 2561, 3274, - 3527, 2582, 3266, - 3519, 2608, 3257, - 3509, 2641, 3243, - 3496, 2682, 3224, - 3476, 2731, 3198, - 3450, 2790, 3160, - 3411, 2858, 3103, - 3354, 2936, 3015, - 3265, 3023, 2862, - 3108, 3118, 2512, - 2745, 3220, 0, - 0, 3328, 0, - 0, 3442, 0, - 0, 3559, 0, - 0, 3680, 0, - 3682, 2596, 3418, - 3682, 2596, 3417, - 3682, 2596, 3417, - 3682, 2597, 3417, - 3682, 2597, 3417, - 3682, 2598, 3417, - 3682, 2598, 3417, - 3681, 2599, 3417, - 3681, 2601, 3416, - 3681, 2603, 3416, - 3680, 2605, 3415, - 3680, 2609, 3414, - 3679, 2613, 3413, - 3677, 2619, 3411, - 3676, 2627, 3409, - 3674, 2637, 3406, - 3671, 2650, 3402, - 3667, 2667, 3396, - 3661, 2689, 3389, - 3654, 2717, 3379, - 3644, 2752, 3365, - 3630, 2795, 3346, - 3612, 2846, 3319, - 3585, 2907, 3280, - 3547, 2977, 3222, - 3490, 3057, 3131, - 3401, 3146, 2970, - 3247, 3242, 2592, - 2892, 3346, 0, - 0, 3456, 0, - 0, 3570, 0, - 0, 3689, 0, - 3816, 2704, 3543, - 3816, 2704, 3543, - 3816, 2705, 3543, - 3816, 2705, 3543, - 3816, 2705, 3543, - 3816, 2706, 3542, - 3816, 2706, 3542, - 3816, 2707, 3542, - 3815, 2708, 3542, - 3815, 2710, 3541, - 3815, 2712, 3541, - 3814, 2714, 3540, - 3814, 2718, 3539, - 3813, 2723, 3538, - 3811, 2729, 3536, - 3810, 2737, 3534, - 3808, 2748, 3531, - 3805, 2762, 3527, - 3801, 2780, 3521, - 3795, 2803, 3514, - 3788, 2832, 3504, - 3778, 2868, 3489, - 3765, 2912, 3470, - 3746, 2965, 3442, - 3719, 3027, 3403, - 3681, 3099, 3343, - 3625, 3181, 3250, - 3537, 3271, 3084, - 3384, 3369, 2680, - 3034, 3474, 0, - 0, 3584, 0, - 0, 3699, 0, - 3950, 2818, 3670, - 3950, 2818, 3670, - 3950, 2818, 3670, - 3950, 2818, 3670, - 3950, 2819, 3670, - 3950, 2819, 3669, - 3949, 2819, 3669, - 3949, 2820, 3669, - 3949, 2821, 3669, - 3949, 2822, 3669, - 3949, 2824, 3668, - 3948, 2826, 3668, - 3948, 2829, 3667, - 3947, 2832, 3666, - 3946, 2837, 3665, - 3945, 2844, 3663, - 3943, 2852, 3661, - 3941, 2863, 3658, - 3938, 2878, 3654, - 3934, 2896, 3648, - 3929, 2920, 3640, - 3922, 2950, 3630, - 3912, 2987, 3616, - 3898, 3032, 3596, - 3880, 3087, 3568, - 3853, 3151, 3528, - 3815, 3224, 3467, - 3759, 3307, 3372, - 3672, 3398, 3202, - 3520, 3497, 2776, - 3174, 3602, 0, - 0, 3714, 0, - 4083, 2936, 3798, - 4083, 2936, 3798, - 4083, 2936, 3798, - 4083, 2936, 3798, - 4083, 2936, 3798, - 4083, 2936, 3798, - 4083, 2937, 3798, - 4083, 2937, 3798, - 4082, 2938, 3797, - 4082, 2939, 3797, - 4082, 2940, 3797, - 4082, 2942, 3796, - 4081, 2944, 3796, - 4081, 2947, 3795, - 4080, 2951, 3794, - 4079, 2956, 3793, - 4078, 2962, 3791, - 4077, 2971, 3789, - 4074, 2982, 3786, - 4071, 2997, 3782, - 4068, 3016, 3776, - 4062, 3041, 3768, - 4055, 3071, 3758, - 4045, 3109, 3743, - 4032, 3156, 3723, - 4013, 3211, 3695, - 3987, 3276, 3654, - 3949, 3350, 3593, - 3893, 3434, 3496, - 3806, 3526, 3323, - 3654, 3626, 2880, - 3312, 3732, 0, - 4095, 3057, 3927, - 4095, 3057, 3927, - 4095, 3057, 3927, - 4095, 3057, 3927, - 4095, 3057, 3927, - 4095, 3057, 3927, - 4095, 3058, 3927, - 4095, 3058, 3927, - 4095, 3059, 3927, - 4095, 3059, 3927, - 4095, 3060, 3926, - 4095, 3061, 3926, - 4095, 3063, 3926, - 4095, 3065, 3925, - 4095, 3068, 3924, - 4095, 3072, 3923, - 4095, 3077, 3922, - 4095, 3084, 3920, - 4095, 3093, 3918, - 4095, 3105, 3915, - 4095, 3120, 3911, - 4095, 3139, 3905, - 4095, 3164, 3897, - 4095, 3195, 3887, - 4095, 3234, 3872, - 4095, 3281, 3852, - 4095, 3337, 3823, - 4095, 3403, 3782, - 4082, 3478, 3721, - 4026, 3562, 3623, - 3939, 3655, 3446, - 3788, 3755, 2989, - 4095, 3180, 4057, - 4095, 3180, 4057, - 4095, 3180, 4057, - 4095, 3181, 4057, - 4095, 3181, 4057, - 4095, 3181, 4057, - 4095, 3181, 4057, - 4095, 3181, 4057, - 4095, 3182, 4057, - 4095, 3182, 4057, - 4095, 3183, 4056, - 4095, 3184, 4056, - 4095, 3185, 4056, - 4095, 3187, 4055, - 4095, 3189, 4055, - 4095, 3192, 4054, - 4095, 3196, 4053, - 4095, 3201, 4052, - 4095, 3208, 4050, - 4095, 3217, 4048, - 4095, 3229, 4045, - 4095, 3245, 4040, - 4095, 3264, 4035, - 4095, 3290, 4027, - 4095, 3321, 4016, - 4095, 3360, 4002, - 4095, 3408, 3981, - 4095, 3465, 3953, - 4095, 3531, 3911, - 4095, 3607, 3849, - 4095, 3692, 3751, - 4073, 3785, 3572, - 0, 1998, 2266, - 0, 1999, 2265, - 0, 2000, 2264, - 0, 2001, 2263, - 0, 2003, 2262, - 0, 2005, 2260, - 0, 2008, 2257, - 0, 2012, 2253, - 0, 2017, 2248, - 0, 2024, 2241, - 0, 2033, 2232, - 0, 2045, 2219, - 0, 2060, 2202, - 0, 2079, 2177, - 0, 2104, 2143, - 0, 2136, 2091, - 0, 2175, 2012, - 0, 2222, 1879, - 0, 2278, 1601, - 0, 2344, 0, - 0, 2420, 0, - 0, 2504, 0, - 0, 2597, 0, - 0, 2698, 0, - 0, 2805, 0, - 0, 2917, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 0, 1998, 2267, - 0, 1999, 2266, - 0, 2000, 2265, - 0, 2001, 2264, - 0, 2003, 2263, - 0, 2005, 2260, - 0, 2008, 2258, - 0, 2012, 2254, - 0, 2017, 2249, - 0, 2024, 2242, - 0, 2033, 2233, - 0, 2045, 2220, - 0, 2060, 2203, - 0, 2080, 2179, - 0, 2105, 2144, - 0, 2136, 2093, - 0, 2175, 2014, - 0, 2222, 1881, - 0, 2279, 1606, - 0, 2344, 0, - 0, 2420, 0, - 0, 2504, 0, - 0, 2597, 0, - 0, 2698, 0, - 0, 2805, 0, - 0, 2917, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 0, 1999, 2268, - 0, 1999, 2267, - 0, 2000, 2266, - 0, 2002, 2265, - 0, 2003, 2264, - 0, 2005, 2262, - 0, 2008, 2259, - 0, 2012, 2255, - 0, 2017, 2250, - 0, 2024, 2244, - 0, 2033, 2234, - 0, 2045, 2222, - 0, 2060, 2204, - 0, 2080, 2180, - 0, 2105, 2145, - 0, 2136, 2095, - 0, 2175, 2016, - 0, 2222, 1884, - 0, 2279, 1611, - 0, 2345, 0, - 0, 2420, 0, - 0, 2505, 0, - 0, 2598, 0, - 0, 2698, 0, - 0, 2805, 0, - 0, 2917, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 0, 1999, 2270, - 0, 2000, 2269, - 0, 2001, 2268, - 0, 2002, 2267, - 0, 2004, 2265, - 0, 2006, 2263, - 0, 2009, 2261, - 0, 2013, 2257, - 0, 2018, 2252, - 0, 2025, 2245, - 0, 2034, 2236, - 0, 2045, 2224, - 0, 2061, 2206, - 0, 2080, 2182, - 0, 2105, 2148, - 0, 2137, 2097, - 0, 2175, 2019, - 0, 2223, 1888, - 0, 2279, 1618, - 0, 2345, 0, - 0, 2420, 0, - 0, 2505, 0, - 0, 2598, 0, - 0, 2698, 0, - 0, 2805, 0, - 0, 2917, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 0, 2000, 2272, - 0, 2000, 2271, - 0, 2001, 2270, - 0, 2003, 2269, - 0, 2004, 2268, - 0, 2006, 2266, - 0, 2009, 2263, - 0, 2013, 2259, - 0, 2018, 2254, - 0, 2025, 2248, - 0, 2034, 2239, - 0, 2046, 2226, - 0, 2061, 2209, - 0, 2081, 2185, - 0, 2106, 2151, - 0, 2137, 2100, - 0, 2176, 2023, - 0, 2223, 1893, - 0, 2279, 1627, - 0, 2345, 0, - 0, 2420, 0, - 0, 2505, 0, - 0, 2598, 0, - 0, 2698, 0, - 0, 2805, 0, - 0, 2917, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3402, 0, - 0, 3529, 0, - 0, 3657, 0, - 0, 2000, 2275, - 0, 2001, 2274, - 0, 2002, 2273, - 0, 2003, 2272, - 0, 2005, 2271, - 0, 2007, 2269, - 0, 2010, 2266, - 0, 2014, 2262, - 0, 2019, 2258, - 0, 2026, 2251, - 0, 2035, 2242, - 0, 2047, 2230, - 0, 2062, 2212, - 0, 2081, 2189, - 0, 2106, 2155, - 0, 2138, 2105, - 0, 2176, 2028, - 0, 2223, 1900, - 0, 2280, 1640, - 0, 2345, 0, - 0, 2421, 0, - 0, 2505, 0, - 0, 2598, 0, - 0, 2698, 0, - 0, 2805, 0, - 0, 2917, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3403, 0, - 0, 3529, 0, - 0, 3658, 0, - 0, 2001, 2279, - 0, 2002, 2278, - 0, 2003, 2277, - 0, 2004, 2276, - 0, 2006, 2275, - 0, 2008, 2273, - 0, 2011, 2270, - 0, 2015, 2267, - 0, 2020, 2262, - 0, 2027, 2255, - 0, 2036, 2246, - 0, 2048, 2234, - 0, 2063, 2217, - 0, 2082, 2193, - 0, 2107, 2160, - 0, 2138, 2110, - 0, 2177, 2035, - 0, 2224, 1909, - 0, 2280, 1655, - 0, 2346, 0, - 0, 2421, 0, - 0, 2505, 0, - 0, 2598, 0, - 0, 2699, 0, - 0, 2805, 0, - 0, 2918, 0, - 0, 3034, 0, - 0, 3154, 0, - 0, 3277, 0, - 0, 3403, 0, - 0, 3529, 0, - 0, 3658, 0, - 0, 2003, 2284, - 0, 2003, 2283, - 0, 2004, 2283, - 0, 2006, 2282, - 0, 2007, 2280, - 0, 2009, 2278, - 0, 2012, 2275, - 0, 2016, 2272, - 0, 2021, 2267, - 0, 2028, 2261, - 0, 2037, 2252, - 0, 2049, 2240, - 0, 2064, 2223, - 0, 2083, 2200, - 0, 2108, 2166, - 0, 2139, 2118, - 0, 2178, 2044, - 0, 2225, 1921, - 0, 2281, 1676, - 0, 2347, 277, - 0, 2422, 0, - 0, 2506, 0, - 0, 2599, 0, - 0, 2699, 0, - 0, 2806, 0, - 0, 2918, 0, - 0, 3034, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3529, 0, - 0, 3658, 0, - 0, 2005, 2291, - 0, 2005, 2290, - 0, 2006, 2290, - 0, 2007, 2288, - 0, 2009, 2287, - 0, 2011, 2285, - 0, 2014, 2283, - 0, 2018, 2279, - 0, 2023, 2274, - 0, 2030, 2268, - 0, 2039, 2259, - 0, 2050, 2247, - 0, 2065, 2231, - 0, 2085, 2208, - 0, 2110, 2175, - 0, 2141, 2128, - 0, 2179, 2055, - 0, 2226, 1936, - 0, 2282, 1702, - 0, 2347, 650, - 0, 2422, 0, - 0, 2507, 0, - 0, 2599, 0, - 0, 2699, 0, - 0, 2806, 0, - 0, 2918, 0, - 0, 3035, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 0, 2007, 2300, - 0, 2008, 2299, - 0, 2009, 2299, - 0, 2010, 2298, - 0, 2011, 2296, - 0, 2014, 2294, - 0, 2017, 2292, - 0, 2020, 2288, - 0, 2025, 2284, - 0, 2032, 2277, - 0, 2041, 2269, - 0, 2053, 2257, - 0, 2068, 2241, - 0, 2087, 2219, - 0, 2111, 2187, - 0, 2142, 2141, - 0, 2181, 2071, - 0, 2227, 1955, - 0, 2283, 1734, - 0, 2349, 904, - 0, 2423, 0, - 0, 2507, 0, - 0, 2600, 0, - 0, 2700, 0, - 0, 2806, 0, - 0, 2918, 0, - 0, 3035, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 0, 2010, 2312, - 0, 2011, 2311, - 0, 2012, 2311, - 0, 2013, 2310, - 0, 2015, 2308, - 0, 2017, 2306, - 0, 2020, 2304, - 0, 2023, 2301, - 0, 2029, 2296, - 0, 2035, 2290, - 0, 2044, 2282, - 0, 2055, 2270, - 0, 2070, 2255, - 0, 2090, 2233, - 0, 2114, 2202, - 0, 2145, 2158, - 0, 2183, 2090, - 0, 2229, 1980, - 0, 2285, 1774, - 0, 2350, 1110, - 0, 2425, 0, - 0, 2508, 0, - 0, 2601, 0, - 0, 2700, 0, - 0, 2807, 0, - 0, 2919, 0, - 0, 3035, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 0, 2014, 2327, - 0, 2015, 2327, - 0, 2016, 2326, - 0, 2017, 2325, - 0, 2019, 2324, - 0, 2021, 2322, - 0, 2024, 2320, - 0, 2028, 2316, - 0, 2033, 2312, - 0, 2039, 2306, - 0, 2048, 2298, - 0, 2059, 2287, - 0, 2074, 2272, - 0, 2093, 2251, - 0, 2117, 2222, - 0, 2148, 2179, - 0, 2186, 2115, - 0, 2232, 2012, - 0, 2287, 1823, - 0, 2352, 1290, - 0, 2426, 0, - 0, 2510, 0, - 0, 2602, 0, - 0, 2701, 0, - 0, 2808, 0, - 0, 2919, 0, - 0, 3036, 0, - 0, 3155, 0, - 0, 3278, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 0, 2020, 2347, - 0, 2021, 2347, - 0, 2022, 2346, - 0, 2023, 2345, - 0, 2024, 2344, - 0, 2026, 2342, - 0, 2029, 2340, - 0, 2033, 2337, - 0, 2038, 2333, - 0, 2044, 2327, - 0, 2053, 2319, - 0, 2064, 2309, - 0, 2079, 2295, - 0, 2098, 2275, - 0, 2122, 2247, - 0, 2152, 2206, - 0, 2190, 2146, - 0, 2235, 2051, - 0, 2290, 1881, - 0, 2355, 1455, - 0, 2429, 0, - 0, 2512, 0, - 0, 2603, 0, - 0, 2703, 0, - 0, 2809, 0, - 0, 2920, 0, - 0, 3036, 0, - 0, 3156, 0, - 0, 3279, 0, - 0, 3403, 0, - 0, 3530, 0, - 0, 3658, 0, - 423, 2027, 2373, - 373, 2028, 2372, - 295, 2029, 2371, - 163, 2030, 2370, - 0, 2032, 2369, - 0, 2034, 2368, - 0, 2036, 2365, - 0, 2040, 2363, - 0, 2045, 2359, - 0, 2051, 2353, - 0, 2060, 2346, - 0, 2071, 2336, - 0, 2085, 2323, - 0, 2104, 2304, - 0, 2128, 2278, - 0, 2158, 2241, - 0, 2195, 2185, - 0, 2240, 2098, - 0, 2294, 1948, - 0, 2358, 1610, - 0, 2432, 0, - 0, 2514, 0, - 0, 2605, 0, - 0, 2704, 0, - 0, 2810, 0, - 0, 2921, 0, - 0, 3037, 0, - 0, 3157, 0, - 0, 3279, 0, - 0, 3404, 0, - 0, 3530, 0, - 0, 3658, 0, - 1521, 2037, 2404, - 1517, 2038, 2404, - 1511, 2039, 2403, - 1503, 2040, 2402, - 1492, 2041, 2401, - 1477, 2043, 2400, - 1457, 2046, 2398, - 1428, 2050, 2395, - 1385, 2054, 2391, - 1322, 2061, 2386, - 1221, 2069, 2380, - 1036, 2080, 2371, - 529, 2094, 2358, - 0, 2112, 2341, - 0, 2135, 2317, - 0, 2165, 2283, - 0, 2201, 2232, - 0, 2246, 2155, - 0, 2300, 2025, - 0, 2363, 1759, - 0, 2436, 0, - 0, 2518, 0, - 0, 2608, 0, - 0, 2707, 0, - 0, 2812, 0, - 0, 2923, 0, - 0, 3038, 0, - 0, 3157, 0, - 0, 3280, 0, - 0, 3404, 0, - 0, 3531, 0, - 0, 3659, 0, - 1883, 2050, 2444, - 1881, 2050, 2443, - 1879, 2051, 2443, - 1875, 2052, 2442, - 1870, 2054, 2441, - 1864, 2056, 2439, - 1855, 2058, 2437, - 1843, 2062, 2435, - 1827, 2066, 2432, - 1804, 2073, 2427, - 1771, 2081, 2421, - 1724, 2091, 2413, - 1651, 2105, 2401, - 1531, 2123, 2386, - 1296, 2146, 2364, - 216, 2174, 2333, - 0, 2210, 2288, - 0, 2254, 2221, - 0, 2307, 2111, - 0, 2369, 1903, - 0, 2441, 1228, - 0, 2522, 0, - 0, 2612, 0, - 0, 2709, 0, - 0, 2814, 0, - 0, 2924, 0, - 0, 3039, 0, - 0, 3158, 0, - 0, 3280, 0, - 0, 3405, 0, - 0, 3531, 0, - 0, 3659, 0, - 2133, 2066, 2491, - 2132, 2067, 2491, - 2131, 2067, 2490, - 2129, 2068, 2490, - 2126, 2070, 2489, - 2122, 2072, 2487, - 2118, 2074, 2486, - 2111, 2078, 2484, - 2102, 2082, 2481, - 2089, 2088, 2476, - 2072, 2096, 2471, - 2048, 2106, 2464, - 2014, 2120, 2453, - 1964, 2137, 2440, - 1887, 2159, 2420, - 1758, 2187, 2393, - 1496, 2222, 2354, - 0, 2265, 2296, - 0, 2316, 2205, - 0, 2377, 2044, - 0, 2448, 1663, - 0, 2528, 0, - 0, 2617, 0, - 0, 2713, 0, - 0, 2817, 0, - 0, 2927, 0, - 0, 3041, 0, - 0, 3160, 0, - 0, 3282, 0, - 0, 3406, 0, - 0, 3532, 0, - 0, 3659, 0, - 2337, 2087, 2548, - 2337, 2088, 2548, - 2336, 2088, 2547, - 2334, 2089, 2547, - 2333, 2091, 2546, - 2330, 2093, 2545, - 2327, 2095, 2543, - 2323, 2098, 2541, - 2317, 2103, 2539, - 2310, 2108, 2535, - 2299, 2116, 2530, - 2285, 2126, 2524, - 2265, 2138, 2515, - 2237, 2155, 2503, - 2196, 2176, 2486, - 2135, 2203, 2463, - 2039, 2237, 2429, - 1866, 2278, 2381, - 1429, 2329, 2306, - 0, 2388, 2182, - 0, 2457, 1936, - 0, 2536, 450, - 0, 2623, 0, - 0, 2718, 0, - 0, 2821, 0, - 0, 2930, 0, - 0, 3044, 0, - 0, 3162, 0, - 0, 3283, 0, - 0, 3407, 0, - 0, 3533, 0, - 0, 3660, 0, - 2517, 2114, 2614, - 2516, 2114, 2614, - 2515, 2115, 2614, - 2515, 2116, 2613, - 2513, 2117, 2612, - 2512, 2119, 2612, - 2510, 2121, 2610, - 2507, 2124, 2609, - 2503, 2128, 2606, - 2498, 2134, 2603, - 2491, 2141, 2599, - 2482, 2150, 2593, - 2469, 2162, 2586, - 2451, 2178, 2576, - 2426, 2198, 2561, - 2391, 2224, 2542, - 2338, 2256, 2514, - 2257, 2296, 2474, - 2119, 2344, 2414, - 1828, 2402, 2319, - 0, 2469, 2151, - 0, 2546, 1735, - 0, 2631, 0, - 0, 2725, 0, - 0, 2827, 0, - 0, 2934, 0, - 0, 3047, 0, - 0, 3164, 0, - 0, 3285, 0, - 0, 3408, 0, - 0, 3534, 0, - 0, 3661, 0, - 2681, 2147, 2690, - 2681, 2147, 2690, - 2680, 2148, 2690, - 2680, 2149, 2689, - 2679, 2150, 2689, - 2678, 2152, 2688, - 2676, 2154, 2687, - 2674, 2157, 2685, - 2672, 2161, 2683, - 2668, 2166, 2681, - 2663, 2172, 2677, - 2657, 2181, 2673, - 2648, 2192, 2666, - 2636, 2207, 2658, - 2620, 2226, 2646, - 2597, 2250, 2629, - 2565, 2281, 2607, - 2517, 2319, 2574, - 2444, 2365, 2527, - 2325, 2420, 2455, - 2090, 2485, 2336, - 1027, 2559, 2105, - 0, 2642, 1114, - 0, 2734, 0, - 0, 2834, 0, - 0, 2940, 0, - 0, 3052, 0, - 0, 3168, 0, - 0, 3288, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 2836, 2188, 2775, - 2836, 2189, 2775, - 2835, 2189, 2775, - 2835, 2190, 2774, - 2834, 2191, 2774, - 2833, 2193, 2773, - 2832, 2194, 2772, - 2831, 2197, 2771, - 2829, 2201, 2770, - 2827, 2205, 2767, - 2823, 2211, 2765, - 2819, 2219, 2761, - 2813, 2230, 2755, - 2805, 2243, 2748, - 2793, 2261, 2739, - 2778, 2283, 2725, - 2756, 2312, 2707, - 2726, 2347, 2681, - 2681, 2391, 2644, - 2614, 2443, 2590, - 2505, 2505, 2505, - 2300, 2576, 2358, - 1648, 2656, 2036, - 0, 2746, 0, - 0, 2843, 0, - 0, 2947, 0, - 0, 3057, 0, - 0, 3172, 0, - 0, 3291, 0, - 0, 3413, 0, - 0, 3537, 0, - 0, 3664, 0, - 2984, 2238, 2869, - 2984, 2238, 2868, - 2984, 2239, 2868, - 2983, 2239, 2868, - 2983, 2240, 2868, - 2983, 2242, 2867, - 2982, 2244, 2866, - 2981, 2246, 2865, - 2979, 2249, 2864, - 2978, 2253, 2862, - 2975, 2259, 2860, - 2972, 2266, 2857, - 2968, 2275, 2853, - 2962, 2287, 2847, - 2954, 2303, 2839, - 2943, 2324, 2828, - 2928, 2350, 2814, - 2907, 2383, 2794, - 2878, 2423, 2765, - 2836, 2472, 2724, - 2772, 2530, 2662, - 2669, 2598, 2563, - 2482, 2675, 2386, - 1962, 2761, 1922, - 0, 2855, 0, - 0, 2957, 0, - 0, 3065, 0, - 0, 3178, 0, - 0, 3296, 0, - 0, 3417, 0, - 0, 3540, 0, - 0, 3666, 0, - 3128, 2297, 2969, - 3128, 2297, 2969, - 3128, 2298, 2969, - 3128, 2298, 2969, - 3127, 2299, 2969, - 3127, 2300, 2968, - 3126, 2302, 2968, - 3126, 2304, 2967, - 3125, 2307, 2966, - 3123, 2310, 2964, - 3122, 2315, 2962, - 3119, 2321, 2960, - 3116, 2330, 2957, - 3112, 2341, 2952, - 3106, 2355, 2946, - 3099, 2373, 2938, - 3088, 2397, 2926, - 3073, 2426, 2910, - 3053, 2463, 2888, - 3025, 2508, 2857, - 2984, 2562, 2812, - 2922, 2625, 2744, - 2825, 2698, 2632, - 2649, 2780, 2420, - 2195, 2871, 1705, - 0, 2970, 0, - 0, 3075, 0, - 0, 3186, 0, - 0, 3302, 0, - 0, 3421, 0, - 0, 3544, 0, - 0, 3668, 0, - 3269, 2365, 3077, - 3269, 2366, 3077, - 3269, 2366, 3076, - 3268, 2367, 3076, - 3268, 2367, 3076, - 3268, 2368, 3076, - 3268, 2370, 3075, - 3267, 2371, 3075, - 3266, 2374, 3074, - 3265, 2377, 3073, - 3264, 2381, 3071, - 3262, 2387, 3069, - 3260, 2394, 3067, - 3257, 2403, 3063, - 3253, 2416, 3058, - 3247, 2432, 3052, - 3240, 2453, 3043, - 3229, 2479, 3031, - 3215, 2512, 3014, - 3195, 2552, 2990, - 3168, 2601, 2957, - 3128, 2660, 2908, - 3068, 2728, 2834, - 2973, 2805, 2710, - 2805, 2892, 2463, - 2389, 2986, 928, - 0, 3088, 0, - 0, 3197, 0, - 0, 3310, 0, - 0, 3427, 0, - 0, 3548, 0, - 0, 3672, 0, - 3407, 2443, 3189, - 3407, 2444, 3189, - 3407, 2444, 3189, - 3407, 2444, 3189, - 3407, 2445, 3189, - 3407, 2446, 3188, - 3406, 2447, 3188, - 3406, 2448, 3188, - 3405, 2450, 3187, - 3405, 2453, 3186, - 3404, 2457, 3185, - 3403, 2461, 3183, - 3401, 2467, 3181, - 3399, 2475, 3179, - 3396, 2486, 3175, - 3392, 2500, 3170, - 3386, 2518, 3163, - 3379, 2541, 3154, - 3368, 2570, 3141, - 3354, 2605, 3123, - 3335, 2649, 3099, - 3308, 2702, 3064, - 3268, 2765, 3012, - 3210, 2836, 2932, - 3117, 2918, 2797, - 2954, 3008, 2514, - 2563, 3105, 0, - 0, 3210, 0, - 0, 3320, 0, - 0, 3436, 0, - 0, 3555, 0, - 0, 3677, 0, - 3544, 2530, 3306, - 3544, 2530, 3306, - 3544, 2531, 3306, - 3544, 2531, 3306, - 3544, 2532, 3306, - 3544, 2532, 3305, - 3543, 2533, 3305, - 3543, 2534, 3305, - 3543, 2536, 3304, - 3542, 2538, 3304, - 3541, 2541, 3303, - 3541, 2545, 3302, - 3539, 2550, 3300, - 3538, 2557, 3298, - 3535, 2566, 3295, - 3532, 2578, 3291, - 3528, 2593, 3286, - 3523, 2612, 3279, - 3516, 2637, 3269, - 3505, 2668, 3256, - 3492, 2707, 3238, - 3472, 2754, 3212, - 3445, 2810, 3175, - 3407, 2875, 3121, - 3349, 2950, 3037, - 3258, 3034, 2892, - 3099, 3127, 2574, - 2724, 3227, 0, - 0, 3334, 0, - 0, 3446, 0, - 0, 3563, 0, - 0, 3683, 0, - 3680, 2625, 3427, - 3680, 2626, 3426, - 3680, 2626, 3426, - 3679, 2626, 3426, - 3679, 2626, 3426, - 3679, 2627, 3426, - 3679, 2628, 3426, - 3679, 2629, 3426, - 3679, 2630, 3425, - 3678, 2632, 3425, - 3678, 2634, 3424, - 3677, 2637, 3423, - 3676, 2642, 3422, - 3675, 2647, 3420, - 3673, 2655, 3418, - 3671, 2664, 3415, - 3668, 2677, 3411, - 3664, 2693, 3406, - 3659, 2714, 3399, - 3651, 2740, 3389, - 3641, 2773, 3375, - 3628, 2814, 3356, - 3609, 2863, 3330, - 3582, 2922, 3292, - 3543, 2990, 3236, - 3486, 3068, 3147, - 3397, 3155, 2994, - 3240, 3250, 2644, - 2877, 3352, 0, - 0, 3460, 0, - 0, 3574, 0, - 0, 3691, 0, - 3814, 2728, 3550, - 3814, 2728, 3550, - 3814, 2728, 3550, - 3814, 2728, 3550, - 3814, 2729, 3549, - 3814, 2729, 3549, - 3814, 2730, 3549, - 3814, 2730, 3549, - 3814, 2732, 3549, - 3813, 2733, 3548, - 3813, 2735, 3548, - 3812, 2737, 3547, - 3812, 2741, 3546, - 3811, 2745, 3545, - 3810, 2751, 3543, - 3808, 2759, 3541, - 3806, 2769, 3538, - 3803, 2782, 3534, - 3799, 2800, 3528, - 3793, 2822, 3521, - 3786, 2849, 3511, - 3776, 2884, 3497, - 3763, 2927, 3478, - 3744, 2978, 3451, - 3717, 3039, 3412, - 3679, 3109, 3354, - 3622, 3189, 3263, - 3534, 3278, 3102, - 3379, 3374, 2724, - 3024, 3478, 0, - 0, 3588, 0, - 0, 3702, 0, - 3948, 2836, 3675, - 3948, 2836, 3675, - 3948, 2836, 3675, - 3948, 2837, 3675, - 3948, 2837, 3675, - 3948, 2837, 3675, - 3948, 2838, 3675, - 3948, 2838, 3674, - 3948, 2839, 3674, - 3948, 2840, 3674, - 3947, 2842, 3673, - 3947, 2844, 3673, - 3946, 2847, 3672, - 3946, 2850, 3671, - 3945, 2855, 3670, - 3944, 2861, 3668, - 3942, 2869, 3666, - 3940, 2880, 3663, - 3937, 2894, 3659, - 3933, 2912, 3653, - 3928, 2935, 3646, - 3920, 2964, 3636, - 3910, 3000, 3622, - 3897, 3044, 3602, - 3878, 3097, 3574, - 3852, 3160, 3535, - 3814, 3232, 3475, - 3757, 3313, 3382, - 3669, 3403, 3216, - 3516, 3501, 2812, - 3167, 3606, 0, - 0, 3716, 0, - 4082, 2950, 3802, - 4082, 2950, 3802, - 4082, 2950, 3802, - 4082, 2950, 3802, - 4082, 2950, 3802, - 4082, 2951, 3802, - 4082, 2951, 3802, - 4082, 2952, 3801, - 4081, 2952, 3801, - 4081, 2953, 3801, - 4081, 2954, 3801, - 4081, 2956, 3800, - 4080, 2958, 3800, - 4080, 2961, 3799, - 4079, 2964, 3798, - 4078, 2969, 3797, - 4077, 2976, 3795, - 4075, 2984, 3793, - 4073, 2995, 3790, - 4070, 3010, 3786, - 4066, 3028, 3780, - 4061, 3052, 3772, - 4054, 3082, 3762, - 4044, 3119, 3748, - 4030, 3164, 3728, - 4012, 3219, 3700, - 3985, 3283, 3660, - 3948, 3356, 3599, - 3892, 3439, 3504, - 3804, 3530, 3334, - 3652, 3629, 2909, - 3307, 3735, 0, - 4095, 3068, 3930, - 4095, 3068, 3930, - 4095, 3068, 3930, - 4095, 3068, 3930, - 4095, 3068, 3930, - 4095, 3068, 3930, - 4095, 3069, 3930, - 4095, 3069, 3930, - 4095, 3069, 3930, - 4095, 3070, 3929, - 4095, 3071, 3929, - 4095, 3072, 3929, - 4095, 3074, 3929, - 4095, 3076, 3928, - 4095, 3079, 3927, - 4095, 3083, 3926, - 4095, 3088, 3925, - 4095, 3094, 3923, - 4095, 3103, 3921, - 4095, 3114, 3918, - 4095, 3129, 3914, - 4095, 3148, 3908, - 4095, 3173, 3900, - 4095, 3203, 3890, - 4095, 3241, 3875, - 4095, 3288, 3855, - 4095, 3343, 3827, - 4095, 3408, 3786, - 4081, 3482, 3725, - 4025, 3566, 3629, - 3938, 3658, 3455, - 3786, 3758, 3012, - 4095, 3189, 4059, - 4095, 3189, 4059, - 4095, 3189, 4059, - 4095, 3189, 4059, - 4095, 3189, 4059, - 4095, 3189, 4059, - 4095, 3189, 4059, - 4095, 3190, 4059, - 4095, 3190, 4059, - 4095, 3191, 4059, - 4095, 3191, 4059, - 4095, 3192, 4058, - 4095, 3193, 4058, - 4095, 3195, 4058, - 4095, 3197, 4057, - 4095, 3200, 4056, - 4095, 3204, 4055, - 4095, 3209, 4054, - 4095, 3216, 4052, - 4095, 3225, 4050, - 4095, 3237, 4047, - 4095, 3252, 4043, - 4095, 3271, 4037, - 4095, 3296, 4029, - 4095, 3327, 4019, - 4095, 3366, 4004, - 4095, 3413, 3984, - 4095, 3469, 3956, - 4095, 3535, 3914, - 4095, 3610, 3853, - 4095, 3694, 3755, - 4071, 3787, 3579, - 0, 2129, 2398, - 0, 2130, 2397, - 0, 2131, 2396, - 0, 2132, 2396, - 0, 2133, 2394, - 0, 2135, 2393, - 0, 2137, 2391, - 0, 2140, 2388, - 0, 2144, 2384, - 0, 2149, 2379, - 0, 2156, 2373, - 0, 2165, 2363, - 0, 2176, 2351, - 0, 2192, 2333, - 0, 2211, 2309, - 0, 2236, 2274, - 0, 2268, 2222, - 0, 2307, 2143, - 0, 2354, 2009, - 0, 2410, 1731, - 0, 2476, 0, - 0, 2552, 0, - 0, 2636, 0, - 0, 2729, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2130, 2398, - 0, 2130, 2398, - 0, 2131, 2397, - 0, 2132, 2396, - 0, 2133, 2395, - 0, 2135, 2394, - 0, 2137, 2392, - 0, 2140, 2389, - 0, 2144, 2385, - 0, 2149, 2380, - 0, 2156, 2373, - 0, 2165, 2364, - 0, 2177, 2352, - 0, 2192, 2334, - 0, 2212, 2310, - 0, 2237, 2275, - 0, 2268, 2223, - 0, 2307, 2144, - 0, 2354, 2011, - 0, 2411, 1734, - 0, 2476, 0, - 0, 2552, 0, - 0, 2636, 0, - 0, 2729, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2130, 2399, - 0, 2130, 2399, - 0, 2131, 2398, - 0, 2132, 2397, - 0, 2133, 2396, - 0, 2135, 2395, - 0, 2137, 2393, - 0, 2140, 2390, - 0, 2144, 2386, - 0, 2149, 2381, - 0, 2156, 2374, - 0, 2165, 2365, - 0, 2177, 2353, - 0, 2192, 2335, - 0, 2212, 2311, - 0, 2237, 2276, - 0, 2268, 2225, - 0, 2307, 2146, - 0, 2354, 2013, - 0, 2411, 1738, - 0, 2477, 0, - 0, 2552, 0, - 0, 2637, 0, - 0, 2730, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2130, 2400, - 0, 2131, 2400, - 0, 2131, 2399, - 0, 2132, 2399, - 0, 2134, 2397, - 0, 2135, 2396, - 0, 2138, 2394, - 0, 2140, 2391, - 0, 2144, 2387, - 0, 2150, 2382, - 0, 2156, 2376, - 0, 2165, 2367, - 0, 2177, 2354, - 0, 2192, 2337, - 0, 2212, 2312, - 0, 2237, 2278, - 0, 2268, 2227, - 0, 2307, 2148, - 0, 2354, 2016, - 0, 2411, 1743, - 0, 2477, 0, - 0, 2552, 0, - 0, 2637, 0, - 0, 2730, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2131, 2402, - 0, 2131, 2402, - 0, 2132, 2401, - 0, 2133, 2400, - 0, 2134, 2399, - 0, 2136, 2398, - 0, 2138, 2396, - 0, 2141, 2393, - 0, 2145, 2389, - 0, 2150, 2384, - 0, 2157, 2377, - 0, 2166, 2368, - 0, 2177, 2356, - 0, 2193, 2339, - 0, 2212, 2314, - 0, 2237, 2280, - 0, 2269, 2229, - 0, 2307, 2151, - 0, 2355, 2020, - 0, 2411, 1750, - 0, 2477, 0, - 0, 2552, 0, - 0, 2637, 0, - 0, 2730, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2131, 2404, - 0, 2132, 2404, - 0, 2132, 2403, - 0, 2133, 2402, - 0, 2135, 2401, - 0, 2136, 2400, - 0, 2139, 2398, - 0, 2141, 2395, - 0, 2145, 2391, - 0, 2151, 2387, - 0, 2157, 2380, - 0, 2166, 2371, - 0, 2178, 2358, - 0, 2193, 2341, - 0, 2213, 2317, - 0, 2238, 2283, - 0, 2269, 2232, - 0, 2308, 2155, - 0, 2355, 2025, - 0, 2411, 1760, - 0, 2477, 0, - 0, 2553, 0, - 0, 2637, 0, - 0, 2730, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3049, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2132, 2407, - 0, 2133, 2407, - 0, 2133, 2406, - 0, 2134, 2405, - 0, 2135, 2404, - 0, 2137, 2403, - 0, 2139, 2401, - 0, 2142, 2398, - 0, 2146, 2395, - 0, 2151, 2390, - 0, 2158, 2383, - 0, 2167, 2374, - 0, 2179, 2362, - 0, 2194, 2345, - 0, 2213, 2321, - 0, 2238, 2287, - 0, 2270, 2237, - 0, 2308, 2160, - 0, 2356, 2032, - 0, 2412, 1772, - 0, 2478, 0, - 0, 2553, 0, - 0, 2637, 0, - 0, 2730, 0, - 0, 2830, 0, - 0, 2937, 0, - 0, 3050, 0, - 0, 3166, 0, - 0, 3286, 0, - 0, 3409, 0, - 0, 3535, 0, - 0, 3661, 0, - 0, 2133, 2411, - 0, 2134, 2411, - 0, 2134, 2410, - 0, 2135, 2409, - 0, 2136, 2408, - 0, 2138, 2407, - 0, 2140, 2405, - 0, 2143, 2402, - 0, 2147, 2399, - 0, 2152, 2394, - 0, 2159, 2387, - 0, 2168, 2378, - 0, 2180, 2366, - 0, 2195, 2349, - 0, 2214, 2325, - 0, 2239, 2292, - 0, 2270, 2242, - 0, 2309, 2167, - 0, 2356, 2041, - 0, 2412, 1788, - 0, 2478, 0, - 0, 2553, 0, - 0, 2638, 0, - 0, 2730, 0, - 0, 2831, 0, - 0, 2937, 0, - 0, 3050, 0, - 0, 3166, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 0, 2134, 2417, - 0, 2135, 2416, - 0, 2136, 2416, - 0, 2136, 2415, - 0, 2138, 2414, - 0, 2139, 2412, - 0, 2142, 2410, - 0, 2144, 2408, - 0, 2148, 2404, - 0, 2154, 2399, - 0, 2160, 2393, - 0, 2169, 2384, - 0, 2181, 2372, - 0, 2196, 2355, - 0, 2215, 2332, - 0, 2240, 2299, - 0, 2271, 2250, - 0, 2310, 2176, - 0, 2357, 2053, - 0, 2413, 1808, - 0, 2479, 410, - 0, 2554, 0, - 0, 2638, 0, - 0, 2731, 0, - 0, 2831, 0, - 0, 2938, 0, - 0, 3050, 0, - 0, 3166, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 0, 2136, 2424, - 0, 2137, 2423, - 0, 2137, 2422, - 0, 2138, 2422, - 0, 2140, 2421, - 0, 2141, 2419, - 0, 2143, 2417, - 0, 2146, 2415, - 0, 2150, 2411, - 0, 2155, 2406, - 0, 2162, 2400, - 0, 2171, 2391, - 0, 2182, 2379, - 0, 2198, 2363, - 0, 2217, 2340, - 0, 2242, 2308, - 0, 2273, 2260, - 0, 2311, 2187, - 0, 2358, 2068, - 0, 2414, 1834, - 0, 2479, 782, - 0, 2554, 0, - 0, 2639, 0, - 0, 2731, 0, - 0, 2831, 0, - 0, 2938, 0, - 0, 3050, 0, - 0, 3167, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 0, 2139, 2433, - 0, 2139, 2432, - 0, 2140, 2432, - 0, 2141, 2431, - 0, 2142, 2430, - 0, 2144, 2428, - 0, 2146, 2426, - 0, 2149, 2424, - 0, 2152, 2420, - 0, 2158, 2416, - 0, 2164, 2410, - 0, 2173, 2401, - 0, 2185, 2389, - 0, 2200, 2373, - 0, 2219, 2351, - 0, 2244, 2319, - 0, 2274, 2273, - 0, 2313, 2203, - 0, 2360, 2088, - 0, 2415, 1866, - 0, 2481, 1036, - 0, 2555, 0, - 0, 2639, 0, - 0, 2732, 0, - 0, 2832, 0, - 0, 2938, 0, - 0, 3050, 0, - 0, 3167, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 0, 2142, 2444, - 0, 2142, 2444, - 0, 2143, 2443, - 0, 2144, 2443, - 0, 2145, 2442, - 0, 2147, 2440, - 0, 2149, 2438, - 0, 2152, 2436, - 0, 2156, 2433, - 0, 2161, 2428, - 0, 2167, 2422, - 0, 2176, 2414, - 0, 2188, 2402, - 0, 2202, 2387, - 0, 2222, 2365, - 0, 2246, 2334, - 0, 2277, 2290, - 0, 2315, 2222, - 0, 2362, 2113, - 0, 2417, 1906, - 0, 2482, 1242, - 0, 2557, 0, - 0, 2640, 0, - 0, 2733, 0, - 0, 2833, 0, - 0, 2939, 0, - 0, 3051, 0, - 0, 3167, 0, - 0, 3287, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 0, 2146, 2460, - 0, 2146, 2460, - 0, 2147, 2459, - 0, 2148, 2458, - 0, 2149, 2457, - 0, 2151, 2456, - 0, 2153, 2454, - 0, 2156, 2452, - 0, 2160, 2448, - 0, 2165, 2444, - 0, 2171, 2438, - 0, 2180, 2430, - 0, 2191, 2419, - 0, 2206, 2404, - 0, 2225, 2383, - 0, 2249, 2354, - 0, 2280, 2311, - 0, 2318, 2247, - 0, 2364, 2144, - 0, 2419, 1955, - 0, 2484, 1422, - 0, 2558, 0, - 0, 2642, 0, - 0, 2734, 0, - 0, 2834, 0, - 0, 2940, 0, - 0, 3051, 0, - 0, 3168, 0, - 0, 3288, 0, - 0, 3410, 0, - 0, 3535, 0, - 0, 3662, 0, - 0, 2152, 2480, - 0, 2152, 2479, - 0, 2153, 2479, - 0, 2154, 2478, - 0, 2155, 2477, - 0, 2156, 2476, - 0, 2159, 2474, - 0, 2161, 2472, - 0, 2165, 2469, - 0, 2170, 2465, - 0, 2177, 2459, - 0, 2185, 2451, - 0, 2196, 2441, - 0, 2211, 2427, - 0, 2230, 2407, - 0, 2254, 2379, - 0, 2284, 2339, - 0, 2322, 2278, - 0, 2368, 2183, - 0, 2422, 2013, - 0, 2487, 1587, - 0, 2561, 0, - 0, 2644, 0, - 0, 2735, 0, - 0, 2835, 0, - 0, 2941, 0, - 0, 3052, 0, - 0, 3168, 0, - 0, 3288, 0, - 0, 3411, 0, - 0, 3536, 0, - 0, 3662, 0, - 590, 2159, 2505, - 556, 2159, 2505, - 505, 2160, 2504, - 427, 2161, 2503, - 295, 2162, 2503, - 26, 2164, 2501, - 0, 2166, 2500, - 0, 2169, 2498, - 0, 2172, 2495, - 0, 2177, 2491, - 0, 2184, 2485, - 0, 2192, 2478, - 0, 2203, 2468, - 0, 2218, 2455, - 0, 2236, 2436, - 0, 2260, 2410, - 0, 2290, 2373, - 0, 2327, 2317, - 0, 2372, 2230, - 0, 2427, 2080, - 0, 2490, 1742, - 0, 2564, 0, - 0, 2646, 0, - 0, 2737, 0, - 0, 2836, 0, - 0, 2942, 0, - 0, 3053, 0, - 0, 3169, 0, - 0, 3289, 0, - 0, 3411, 0, - 0, 3536, 0, - 0, 3662, 0, - 1656, 2169, 2537, - 1653, 2169, 2536, - 1649, 2170, 2536, - 1643, 2171, 2535, - 1635, 2172, 2534, - 1624, 2173, 2533, - 1610, 2175, 2532, - 1589, 2178, 2530, - 1560, 2182, 2527, - 1518, 2186, 2523, - 1454, 2193, 2518, - 1353, 2201, 2512, - 1168, 2212, 2503, - 661, 2226, 2490, - 0, 2244, 2473, - 0, 2268, 2449, - 0, 2297, 2415, - 0, 2334, 2364, - 0, 2378, 2287, - 0, 2432, 2157, - 0, 2495, 1891, - 0, 2568, 0, - 0, 2650, 0, - 0, 2740, 0, - 0, 2839, 0, - 0, 2944, 0, - 0, 3055, 0, - 0, 3170, 0, - 0, 3289, 0, - 0, 3412, 0, - 0, 3536, 0, - 0, 3663, 0, - 2017, 2181, 2576, - 2015, 2182, 2576, - 2013, 2182, 2575, - 2011, 2183, 2575, - 2007, 2184, 2574, - 2002, 2186, 2573, - 1996, 2188, 2571, - 1987, 2190, 2570, - 1975, 2194, 2567, - 1959, 2199, 2564, - 1936, 2205, 2559, - 1903, 2213, 2553, - 1856, 2223, 2545, - 1783, 2237, 2533, - 1663, 2255, 2518, - 1428, 2278, 2496, - 348, 2307, 2465, - 0, 2342, 2420, - 0, 2386, 2353, - 0, 2439, 2243, - 0, 2501, 2035, - 0, 2573, 1360, - 0, 2654, 0, - 0, 2744, 0, - 0, 2842, 0, - 0, 2946, 0, - 0, 3056, 0, - 0, 3172, 0, - 0, 3291, 0, - 0, 3413, 0, - 0, 3537, 0, - 0, 3663, 0, - 2266, 2198, 2624, - 2266, 2198, 2623, - 2264, 2199, 2623, - 2263, 2200, 2622, - 2261, 2201, 2622, - 2258, 2202, 2621, - 2255, 2204, 2620, - 2250, 2206, 2618, - 2243, 2210, 2616, - 2234, 2214, 2613, - 2222, 2220, 2609, - 2204, 2228, 2603, - 2180, 2238, 2596, - 2146, 2252, 2586, - 2096, 2269, 2572, - 2019, 2291, 2552, - 1890, 2319, 2525, - 1628, 2354, 2486, - 0, 2397, 2428, - 0, 2448, 2337, - 0, 2509, 2176, - 0, 2580, 1795, - 0, 2660, 0, - 0, 2749, 0, - 0, 2845, 0, - 0, 2949, 0, - 0, 3059, 0, - 0, 3173, 0, - 0, 3292, 0, - 0, 3414, 0, - 0, 3538, 0, - 0, 3664, 0, - 2470, 2219, 2680, - 2469, 2219, 2680, - 2469, 2220, 2680, - 2468, 2220, 2679, - 2466, 2221, 2679, - 2465, 2223, 2678, - 2462, 2225, 2677, - 2459, 2227, 2675, - 2455, 2230, 2673, - 2450, 2235, 2671, - 2442, 2240, 2667, - 2431, 2248, 2662, - 2417, 2258, 2656, - 2397, 2270, 2647, - 2369, 2287, 2635, - 2328, 2308, 2618, - 2267, 2335, 2595, - 2171, 2369, 2561, - 1998, 2410, 2513, - 1561, 2461, 2438, - 0, 2520, 2315, - 0, 2589, 2068, - 0, 2668, 582, - 0, 2755, 0, - 0, 2851, 0, - 0, 2953, 0, - 0, 3062, 0, - 0, 3176, 0, - 0, 3294, 0, - 0, 3415, 0, - 0, 3539, 0, - 0, 3665, 0, - 2649, 2245, 2747, - 2649, 2246, 2746, - 2648, 2246, 2746, - 2648, 2247, 2746, - 2647, 2248, 2745, - 2646, 2249, 2745, - 2644, 2251, 2744, - 2642, 2253, 2742, - 2639, 2256, 2741, - 2635, 2260, 2738, - 2630, 2266, 2735, - 2623, 2273, 2731, - 2614, 2282, 2726, - 2601, 2294, 2718, - 2583, 2310, 2708, - 2558, 2330, 2693, - 2523, 2356, 2674, - 2470, 2388, 2646, - 2389, 2428, 2606, - 2251, 2476, 2546, - 1960, 2534, 2451, - 0, 2601, 2283, - 0, 2678, 1867, - 0, 2763, 0, - 0, 2857, 0, - 0, 2959, 0, - 0, 3066, 0, - 0, 3179, 0, - 0, 3296, 0, - 0, 3417, 0, - 0, 3540, 0, - 0, 3666, 0, - 2813, 2279, 2823, - 2813, 2279, 2822, - 2813, 2280, 2822, - 2812, 2280, 2822, - 2812, 2281, 2821, - 2811, 2282, 2821, - 2810, 2284, 2820, - 2808, 2286, 2819, - 2806, 2289, 2817, - 2804, 2293, 2816, - 2800, 2298, 2813, - 2796, 2304, 2809, - 2789, 2313, 2805, - 2780, 2324, 2798, - 2769, 2339, 2790, - 2752, 2358, 2778, - 2729, 2382, 2762, - 2697, 2413, 2739, - 2649, 2451, 2706, - 2576, 2497, 2659, - 2457, 2552, 2587, - 2222, 2617, 2468, - 1159, 2691, 2237, - 0, 2774, 1246, - 0, 2866, 0, - 0, 2966, 0, - 0, 3072, 0, - 0, 3184, 0, - 0, 3300, 0, - 0, 3420, 0, - 0, 3542, 0, - 0, 3667, 0, - 2968, 2320, 2907, - 2968, 2320, 2907, - 2968, 2321, 2907, - 2967, 2321, 2907, - 2967, 2322, 2906, - 2966, 2323, 2906, - 2966, 2325, 2905, - 2965, 2327, 2904, - 2963, 2329, 2903, - 2961, 2333, 2902, - 2959, 2337, 2900, - 2956, 2343, 2897, - 2951, 2351, 2893, - 2945, 2362, 2888, - 2937, 2375, 2880, - 2925, 2393, 2871, - 2910, 2415, 2857, - 2888, 2444, 2839, - 2858, 2479, 2813, - 2813, 2523, 2776, - 2746, 2575, 2722, - 2637, 2637, 2637, - 2432, 2708, 2490, - 1780, 2789, 2168, - 0, 2878, 0, - 0, 2975, 0, - 0, 3079, 0, - 0, 3190, 0, - 0, 3304, 0, - 0, 3423, 0, - 0, 3545, 0, - 0, 3669, 0, - 3116, 2370, 3001, - 3116, 2370, 3001, - 3116, 2370, 3001, - 3116, 2371, 3000, - 3116, 2372, 3000, - 3115, 2373, 3000, - 3115, 2374, 2999, - 3114, 2376, 2998, - 3113, 2378, 2997, - 3112, 2381, 2996, - 3110, 2385, 2994, - 3107, 2391, 2992, - 3104, 2398, 2989, - 3100, 2407, 2985, - 3094, 2420, 2979, - 3086, 2436, 2971, - 3075, 2456, 2961, - 3060, 2482, 2946, - 3039, 2515, 2926, - 3010, 2555, 2897, - 2968, 2604, 2856, - 2904, 2662, 2794, - 2802, 2730, 2696, - 2614, 2807, 2518, - 2094, 2893, 2054, - 0, 2987, 0, - 0, 3089, 0, - 0, 3197, 0, - 0, 3310, 0, - 0, 3428, 0, - 0, 3549, 0, - 0, 3672, 0, - 3260, 2429, 3102, - 3260, 2429, 3102, - 3260, 2429, 3101, - 3260, 2430, 3101, - 3260, 2430, 3101, - 3259, 2431, 3101, - 3259, 2432, 3100, - 3258, 2434, 3100, - 3258, 2436, 3099, - 3257, 2439, 3098, - 3255, 2442, 3096, - 3254, 2447, 3095, - 3251, 2453, 3092, - 3248, 2462, 3089, - 3244, 2473, 3084, - 3238, 2487, 3078, - 3231, 2505, 3070, - 3220, 2529, 3058, - 3206, 2558, 3042, - 3185, 2595, 3021, - 3157, 2640, 2989, - 3116, 2694, 2944, - 3054, 2757, 2876, - 2957, 2830, 2764, - 2781, 2913, 2552, - 2327, 3003, 1837, - 0, 3102, 0, - 0, 3207, 0, - 0, 3318, 0, - 0, 3434, 0, - 0, 3553, 0, - 0, 3676, 0, - 3401, 2497, 3209, - 3401, 2497, 3209, - 3401, 2498, 3209, - 3401, 2498, 3208, - 3401, 2499, 3208, - 3400, 2499, 3208, - 3400, 2500, 3208, - 3400, 2502, 3207, - 3399, 2503, 3207, - 3398, 2506, 3206, - 3397, 2509, 3205, - 3396, 2513, 3203, - 3394, 2519, 3201, - 3392, 2526, 3199, - 3389, 2535, 3195, - 3385, 2548, 3190, - 3379, 2564, 3184, - 3372, 2585, 3175, - 3361, 2611, 3163, - 3347, 2644, 3146, - 3328, 2684, 3123, - 3300, 2734, 3089, - 3260, 2792, 3040, - 3200, 2860, 2966, - 3105, 2937, 2842, - 2937, 3024, 2595, - 2521, 3118, 1060, - 0, 3220, 0, - 0, 3329, 0, - 0, 3442, 0, - 0, 3560, 0, - 0, 3680, 0, - 3539, 2575, 3321, - 3539, 2575, 3321, - 3539, 2576, 3321, - 3539, 2576, 3321, - 3539, 2576, 3321, - 3539, 2577, 3321, - 3539, 2578, 3320, - 3538, 2579, 3320, - 3538, 2581, 3320, - 3537, 2582, 3319, - 3537, 2585, 3318, - 3536, 2589, 3317, - 3535, 2593, 3315, - 3533, 2599, 3313, - 3531, 2608, 3311, - 3528, 2618, 3307, - 3524, 2632, 3302, - 3518, 2650, 3295, - 3511, 2673, 3286, - 3500, 2702, 3273, - 3486, 2738, 3255, - 3467, 2782, 3231, - 3440, 2834, 3196, - 3400, 2897, 3144, - 3342, 2969, 3064, - 3249, 3050, 2929, - 3086, 3140, 2646, - 2695, 3237, 0, - 0, 3342, 0, - 0, 3452, 0, - 0, 3568, 0, - 0, 3687, 0, - 3676, 2662, 3438, - 3676, 2662, 3438, - 3676, 2663, 3438, - 3676, 2663, 3438, - 3676, 2663, 3438, - 3676, 2664, 3438, - 3676, 2664, 3438, - 3675, 2665, 3437, - 3675, 2667, 3437, - 3675, 2668, 3436, - 3674, 2670, 3436, - 3674, 2673, 3435, - 3673, 2677, 3434, - 3671, 2682, 3432, - 3670, 2689, 3430, - 3668, 2698, 3427, - 3665, 2710, 3423, - 3661, 2725, 3418, - 3655, 2744, 3411, - 3648, 2769, 3401, - 3638, 2800, 3388, - 3624, 2839, 3370, - 3605, 2886, 3344, - 3578, 2942, 3308, - 3539, 3007, 3253, - 3481, 3082, 3169, - 3390, 3167, 3024, - 3231, 3259, 2706, - 2856, 3359, 0, - 0, 3466, 0, - 0, 3578, 0, - 0, 3695, 0, - 3812, 2757, 3559, - 3812, 2757, 3559, - 3812, 2758, 3559, - 3812, 2758, 3558, - 3812, 2758, 3558, - 3811, 2759, 3558, - 3811, 2759, 3558, - 3811, 2760, 3558, - 3811, 2761, 3558, - 3811, 2762, 3557, - 3810, 2764, 3557, - 3810, 2766, 3556, - 3809, 2770, 3555, - 3808, 2774, 3554, - 3807, 2779, 3552, - 3805, 2787, 3550, - 3803, 2796, 3547, - 3800, 2809, 3543, - 3796, 2825, 3538, - 3791, 2846, 3531, - 3783, 2872, 3521, - 3773, 2905, 3507, - 3760, 2946, 3488, - 3741, 2996, 3462, - 3714, 3054, 3424, - 3675, 3122, 3368, - 3618, 3200, 3279, - 3529, 3287, 3126, - 3372, 3382, 2777, - 3009, 3484, 0, - 0, 3592, 0, - 0, 3706, 0, - 3946, 2860, 3682, - 3946, 2860, 3682, - 3946, 2860, 3682, - 3946, 2860, 3682, - 3946, 2860, 3682, - 3946, 2861, 3682, - 3946, 2861, 3681, - 3946, 2862, 3681, - 3946, 2863, 3681, - 3946, 2864, 3681, - 3945, 2865, 3680, - 3945, 2867, 3680, - 3944, 2869, 3679, - 3944, 2873, 3678, - 3943, 2877, 3677, - 3942, 2883, 3675, - 3940, 2891, 3673, - 3938, 2901, 3670, - 3935, 2914, 3666, - 3931, 2932, 3661, - 3926, 2954, 3653, - 3918, 2981, 3643, - 3908, 3016, 3629, - 3895, 3059, 3610, - 3876, 3110, 3583, - 3849, 3171, 3544, - 3811, 3242, 3486, - 3754, 3321, 3395, - 3666, 3410, 3235, - 3511, 3507, 2856, - 3156, 3610, 0, - 0, 3720, 0, - 4080, 2968, 3807, - 4080, 2968, 3807, - 4080, 2968, 3807, - 4080, 2969, 3807, - 4080, 2969, 3807, - 4080, 2969, 3807, - 4080, 2969, 3807, - 4080, 2970, 3807, - 4080, 2970, 3806, - 4080, 2971, 3806, - 4080, 2972, 3806, - 4079, 2974, 3806, - 4079, 2976, 3805, - 4078, 2979, 3804, - 4078, 2982, 3803, - 4077, 2987, 3802, - 4076, 2993, 3800, - 4074, 3001, 3798, - 4072, 3012, 3795, - 4069, 3026, 3791, - 4065, 3044, 3786, - 4060, 3067, 3778, - 4052, 3096, 3768, - 4042, 3132, 3754, - 4029, 3176, 3734, - 4010, 3229, 3706, - 3984, 3292, 3667, - 3946, 3364, 3608, - 3889, 3445, 3514, - 3801, 3535, 3348, - 3648, 3633, 2944, - 3299, 3738, 0, - 4095, 3082, 3934, - 4095, 3082, 3934, - 4095, 3082, 3934, - 4095, 3082, 3934, - 4095, 3082, 3934, - 4095, 3082, 3934, - 4095, 3083, 3934, - 4095, 3083, 3934, - 4095, 3084, 3934, - 4095, 3084, 3933, - 4095, 3085, 3933, - 4095, 3086, 3933, - 4095, 3088, 3932, - 4095, 3090, 3932, - 4095, 3093, 3931, - 4095, 3096, 3930, - 4095, 3101, 3929, - 4095, 3108, 3927, - 4095, 3116, 3925, - 4095, 3127, 3922, - 4095, 3142, 3918, - 4095, 3160, 3912, - 4095, 3184, 3905, - 4095, 3214, 3894, - 4095, 3251, 3880, - 4095, 3297, 3860, - 4095, 3351, 3832, - 4095, 3415, 3792, - 4080, 3488, 3732, - 4024, 3571, 3636, - 3936, 3662, 3466, - 3784, 3761, 3041, - 4095, 3200, 4062, - 4095, 3200, 4062, - 4095, 3200, 4062, - 4095, 3200, 4062, - 4095, 3200, 4062, - 4095, 3200, 4062, - 4095, 3200, 4062, - 4095, 3201, 4062, - 4095, 3201, 4062, - 4095, 3202, 4062, - 4095, 3202, 4062, - 4095, 3203, 4061, - 4095, 3204, 4061, - 4095, 3206, 4061, - 4095, 3208, 4060, - 4095, 3211, 4059, - 4095, 3215, 4058, - 4095, 3220, 4057, - 4095, 3226, 4055, - 4095, 3235, 4053, - 4095, 3247, 4050, - 4095, 3261, 4046, - 4095, 3280, 4040, - 4095, 3305, 4032, - 4095, 3335, 4022, - 4095, 3374, 4008, - 4095, 3420, 3988, - 4095, 3475, 3959, - 4095, 3540, 3918, - 4095, 3614, 3858, - 4095, 3698, 3761, - 4070, 3790, 3587, - 0, 2261, 2529, - 0, 2261, 2529, - 0, 2262, 2529, - 0, 2263, 2528, - 0, 2264, 2527, - 0, 2265, 2526, - 0, 2267, 2524, - 0, 2269, 2522, - 0, 2272, 2520, - 0, 2276, 2516, - 0, 2281, 2511, - 0, 2288, 2504, - 0, 2297, 2495, - 0, 2308, 2482, - 0, 2324, 2465, - 0, 2343, 2440, - 0, 2368, 2405, - 0, 2400, 2354, - 0, 2439, 2274, - 0, 2486, 2140, - 0, 2542, 1860, - 0, 2608, 0, - 0, 2684, 0, - 0, 2768, 0, - 0, 2861, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3667, 0, - 0, 2261, 2530, - 0, 2262, 2530, - 0, 2262, 2529, - 0, 2263, 2529, - 0, 2264, 2528, - 0, 2265, 2527, - 0, 2267, 2525, - 0, 2269, 2523, - 0, 2272, 2520, - 0, 2276, 2517, - 0, 2281, 2512, - 0, 2288, 2505, - 0, 2297, 2495, - 0, 2309, 2483, - 0, 2324, 2465, - 0, 2343, 2441, - 0, 2368, 2406, - 0, 2400, 2354, - 0, 2439, 2275, - 0, 2486, 2141, - 0, 2543, 1863, - 0, 2608, 0, - 0, 2684, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3667, 0, - 0, 2261, 2531, - 0, 2262, 2530, - 0, 2262, 2530, - 0, 2263, 2529, - 0, 2264, 2528, - 0, 2265, 2527, - 0, 2267, 2526, - 0, 2269, 2524, - 0, 2272, 2521, - 0, 2276, 2517, - 0, 2281, 2512, - 0, 2288, 2505, - 0, 2297, 2496, - 0, 2309, 2484, - 0, 2324, 2466, - 0, 2344, 2442, - 0, 2369, 2407, - 0, 2400, 2355, - 0, 2439, 2276, - 0, 2486, 2143, - 0, 2543, 1866, - 0, 2609, 0, - 0, 2684, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3667, 0, - 0, 2262, 2532, - 0, 2262, 2531, - 0, 2263, 2531, - 0, 2263, 2530, - 0, 2264, 2529, - 0, 2265, 2528, - 0, 2267, 2527, - 0, 2269, 2525, - 0, 2272, 2522, - 0, 2276, 2518, - 0, 2281, 2513, - 0, 2288, 2506, - 0, 2297, 2497, - 0, 2309, 2485, - 0, 2324, 2467, - 0, 2344, 2443, - 0, 2369, 2408, - 0, 2400, 2357, - 0, 2439, 2278, - 0, 2486, 2145, - 0, 2543, 1870, - 0, 2609, 0, - 0, 2684, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3667, 0, - 0, 2262, 2533, - 0, 2262, 2533, - 0, 2263, 2532, - 0, 2264, 2531, - 0, 2264, 2531, - 0, 2266, 2529, - 0, 2267, 2528, - 0, 2270, 2526, - 0, 2273, 2523, - 0, 2276, 2520, - 0, 2282, 2515, - 0, 2288, 2508, - 0, 2297, 2499, - 0, 2309, 2486, - 0, 2324, 2469, - 0, 2344, 2444, - 0, 2369, 2410, - 0, 2400, 2359, - 0, 2439, 2280, - 0, 2487, 2148, - 0, 2543, 1875, - 0, 2609, 0, - 0, 2684, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3667, 0, - 0, 2262, 2535, - 0, 2263, 2534, - 0, 2263, 2534, - 0, 2264, 2533, - 0, 2265, 2532, - 0, 2266, 2531, - 0, 2268, 2530, - 0, 2270, 2528, - 0, 2273, 2525, - 0, 2277, 2521, - 0, 2282, 2516, - 0, 2289, 2510, - 0, 2298, 2500, - 0, 2310, 2488, - 0, 2325, 2471, - 0, 2344, 2446, - 0, 2369, 2412, - 0, 2401, 2361, - 0, 2440, 2283, - 0, 2487, 2152, - 0, 2543, 1882, - 0, 2609, 0, - 0, 2684, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3181, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3541, 0, - 0, 3667, 0, - 0, 2263, 2537, - 0, 2263, 2537, - 0, 2264, 2536, - 0, 2265, 2535, - 0, 2265, 2535, - 0, 2267, 2533, - 0, 2268, 2532, - 0, 2271, 2530, - 0, 2274, 2527, - 0, 2277, 2524, - 0, 2283, 2519, - 0, 2289, 2512, - 0, 2298, 2503, - 0, 2310, 2490, - 0, 2325, 2473, - 0, 2345, 2449, - 0, 2370, 2415, - 0, 2401, 2364, - 0, 2440, 2287, - 0, 2487, 2157, - 0, 2543, 1892, - 0, 2609, 0, - 0, 2685, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2962, 0, - 0, 3069, 0, - 0, 3182, 0, - 0, 3298, 0, - 0, 3418, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2264, 2540, - 0, 2264, 2539, - 0, 2265, 2539, - 0, 2265, 2538, - 0, 2266, 2538, - 0, 2267, 2536, - 0, 2269, 2535, - 0, 2271, 2533, - 0, 2274, 2530, - 0, 2278, 2527, - 0, 2283, 2522, - 0, 2290, 2515, - 0, 2299, 2506, - 0, 2311, 2494, - 0, 2326, 2477, - 0, 2346, 2453, - 0, 2370, 2419, - 0, 2402, 2369, - 0, 2440, 2292, - 0, 2488, 2164, - 0, 2544, 1904, - 0, 2610, 0, - 0, 2685, 0, - 0, 2769, 0, - 0, 2862, 0, - 0, 2963, 0, - 0, 3069, 0, - 0, 3182, 0, - 0, 3298, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2265, 2544, - 0, 2265, 2543, - 0, 2266, 2543, - 0, 2266, 2542, - 0, 2267, 2542, - 0, 2268, 2540, - 0, 2270, 2539, - 0, 2272, 2537, - 0, 2275, 2534, - 0, 2279, 2531, - 0, 2284, 2526, - 0, 2291, 2519, - 0, 2300, 2510, - 0, 2312, 2498, - 0, 2327, 2481, - 0, 2346, 2458, - 0, 2371, 2424, - 0, 2402, 2375, - 0, 2441, 2299, - 0, 2488, 2173, - 0, 2544, 1920, - 0, 2610, 0, - 0, 2685, 0, - 0, 2770, 0, - 0, 2862, 0, - 0, 2963, 0, - 0, 3070, 0, - 0, 3182, 0, - 0, 3298, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2266, 2549, - 0, 2266, 2549, - 0, 2267, 2548, - 0, 2268, 2548, - 0, 2269, 2547, - 0, 2270, 2546, - 0, 2271, 2544, - 0, 2274, 2542, - 0, 2277, 2540, - 0, 2280, 2536, - 0, 2286, 2531, - 0, 2292, 2525, - 0, 2301, 2516, - 0, 2313, 2504, - 0, 2328, 2487, - 0, 2348, 2464, - 0, 2372, 2431, - 0, 2403, 2382, - 0, 2442, 2308, - 0, 2489, 2185, - 0, 2545, 1940, - 0, 2611, 542, - 0, 2686, 0, - 0, 2770, 0, - 0, 2863, 0, - 0, 2963, 0, - 0, 3070, 0, - 0, 3182, 0, - 0, 3299, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2268, 2556, - 0, 2268, 2556, - 0, 2269, 2555, - 0, 2269, 2555, - 0, 2270, 2554, - 0, 2272, 2553, - 0, 2273, 2551, - 0, 2275, 2549, - 0, 2278, 2547, - 0, 2282, 2543, - 0, 2287, 2538, - 0, 2294, 2532, - 0, 2303, 2523, - 0, 2315, 2512, - 0, 2330, 2495, - 0, 2349, 2472, - 0, 2374, 2440, - 0, 2405, 2392, - 0, 2443, 2320, - 0, 2490, 2200, - 0, 2546, 1966, - 0, 2612, 914, - 0, 2687, 0, - 0, 2771, 0, - 0, 2863, 0, - 0, 2963, 0, - 0, 3070, 0, - 0, 3182, 0, - 0, 3299, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2270, 2565, - 0, 2271, 2565, - 0, 2271, 2564, - 0, 2272, 2564, - 0, 2273, 2563, - 0, 2274, 2562, - 0, 2276, 2560, - 0, 2278, 2559, - 0, 2281, 2556, - 0, 2285, 2553, - 0, 2290, 2548, - 0, 2296, 2542, - 0, 2305, 2533, - 0, 2317, 2522, - 0, 2332, 2505, - 0, 2351, 2483, - 0, 2376, 2451, - 0, 2407, 2405, - 0, 2445, 2335, - 0, 2492, 2220, - 0, 2547, 1998, - 0, 2613, 1168, - 0, 2688, 0, - 0, 2772, 0, - 0, 2864, 0, - 0, 2964, 0, - 0, 3071, 0, - 0, 3183, 0, - 0, 3299, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2273, 2577, - 0, 2274, 2577, - 0, 2274, 2576, - 0, 2275, 2576, - 0, 2276, 2575, - 0, 2277, 2574, - 0, 2279, 2572, - 0, 2281, 2571, - 0, 2284, 2568, - 0, 2288, 2565, - 0, 2293, 2560, - 0, 2299, 2554, - 0, 2308, 2546, - 0, 2320, 2535, - 0, 2335, 2519, - 0, 2354, 2497, - 0, 2378, 2467, - 0, 2409, 2422, - 0, 2447, 2354, - 0, 2494, 2245, - 0, 2549, 2038, - 0, 2614, 1374, - 0, 2689, 0, - 0, 2773, 0, - 0, 2865, 0, - 0, 2965, 0, - 0, 3071, 0, - 0, 3183, 0, - 0, 3299, 0, - 0, 3419, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2278, 2592, - 0, 2278, 2592, - 0, 2279, 2592, - 0, 2279, 2591, - 0, 2280, 2590, - 0, 2281, 2589, - 0, 2283, 2588, - 0, 2285, 2586, - 0, 2288, 2584, - 0, 2292, 2581, - 0, 2297, 2576, - 0, 2303, 2570, - 0, 2312, 2562, - 0, 2323, 2551, - 0, 2338, 2536, - 0, 2357, 2516, - 0, 2382, 2486, - 0, 2412, 2443, - 0, 2450, 2379, - 0, 2496, 2276, - 0, 2551, 2087, - 0, 2616, 1554, - 0, 2690, 0, - 0, 2774, 0, - 0, 2866, 0, - 0, 2966, 0, - 0, 3072, 0, - 0, 3184, 0, - 0, 3300, 0, - 0, 3420, 0, - 0, 3542, 0, - 0, 3667, 0, - 0, 2283, 2612, - 0, 2284, 2612, - 0, 2284, 2611, - 0, 2285, 2611, - 0, 2286, 2610, - 0, 2287, 2609, - 0, 2289, 2608, - 0, 2291, 2606, - 0, 2293, 2604, - 0, 2297, 2601, - 0, 2302, 2597, - 0, 2309, 2591, - 0, 2317, 2584, - 0, 2329, 2573, - 0, 2343, 2559, - 0, 2362, 2539, - 0, 2386, 2511, - 0, 2416, 2471, - 0, 2454, 2410, - 0, 2500, 2315, - 0, 2555, 2145, - 0, 2619, 1719, - 0, 2693, 0, - 0, 2776, 0, - 0, 2868, 0, - 0, 2967, 0, - 0, 3073, 0, - 0, 3184, 0, - 0, 3300, 0, - 0, 3420, 0, - 0, 3543, 0, - 0, 3668, 0, - 746, 2291, 2637, - 722, 2291, 2637, - 688, 2292, 2637, - 637, 2292, 2636, - 559, 2293, 2636, - 428, 2294, 2635, - 158, 2296, 2633, - 0, 2298, 2632, - 0, 2301, 2630, - 0, 2304, 2627, - 0, 2309, 2623, - 0, 2316, 2618, - 0, 2324, 2610, - 0, 2335, 2601, - 0, 2350, 2587, - 0, 2368, 2568, - 0, 2392, 2542, - 0, 2422, 2505, - 0, 2459, 2449, - 0, 2504, 2362, - 0, 2559, 2212, - 0, 2622, 1874, - 0, 2696, 0, - 0, 2778, 0, - 0, 2870, 0, - 0, 2969, 0, - 0, 3074, 0, - 0, 3185, 0, - 0, 3301, 0, - 0, 3421, 0, - 0, 3543, 0, - 0, 3668, 0, - 1791, 2300, 2669, - 1789, 2301, 2669, - 1785, 2301, 2668, - 1781, 2302, 2668, - 1775, 2303, 2667, - 1767, 2304, 2667, - 1757, 2305, 2665, - 1742, 2307, 2664, - 1721, 2310, 2662, - 1692, 2314, 2659, - 1650, 2319, 2656, - 1586, 2325, 2651, - 1485, 2333, 2644, - 1300, 2344, 2635, - 793, 2358, 2622, - 0, 2376, 2605, - 0, 2400, 2581, - 0, 2429, 2547, - 0, 2466, 2496, - 0, 2510, 2419, - 0, 2564, 2289, - 0, 2627, 2023, - 0, 2700, 0, - 0, 2782, 0, - 0, 2872, 0, - 0, 2971, 0, - 0, 3076, 0, - 0, 3187, 0, - 0, 3302, 0, - 0, 3422, 0, - 0, 3544, 0, - 0, 3668, 0, - 2150, 2313, 2708, - 2149, 2313, 2708, - 2147, 2314, 2708, - 2145, 2314, 2707, - 2143, 2315, 2707, - 2139, 2316, 2706, - 2135, 2318, 2705, - 2128, 2320, 2704, - 2119, 2323, 2702, - 2108, 2326, 2699, - 2091, 2331, 2696, - 2068, 2337, 2691, - 2036, 2345, 2685, - 1988, 2356, 2677, - 1915, 2369, 2666, - 1795, 2387, 2650, - 1560, 2410, 2628, - 480, 2439, 2597, - 0, 2474, 2553, - 0, 2518, 2485, - 0, 2571, 2375, - 0, 2633, 2167, - 0, 2705, 1492, - 0, 2786, 0, - 0, 2876, 0, - 0, 2974, 0, - 0, 3078, 0, - 0, 3189, 0, - 0, 3304, 0, - 0, 3423, 0, - 0, 3545, 0, - 0, 3669, 0, - 2399, 2329, 2756, - 2398, 2330, 2756, - 2398, 2330, 2755, - 2396, 2331, 2755, - 2395, 2332, 2754, - 2393, 2333, 2754, - 2390, 2334, 2753, - 2387, 2336, 2752, - 2382, 2339, 2750, - 2375, 2342, 2748, - 2366, 2346, 2745, - 2354, 2352, 2741, - 2337, 2360, 2735, - 2313, 2370, 2728, - 2278, 2384, 2718, - 2228, 2401, 2704, - 2151, 2423, 2684, - 2023, 2451, 2657, - 1760, 2486, 2618, - 0, 2529, 2560, - 0, 2581, 2469, - 0, 2642, 2308, - 0, 2712, 1927, - 0, 2792, 0, - 0, 2881, 0, - 0, 2978, 0, - 0, 3081, 0, - 0, 3191, 0, - 0, 3306, 0, - 0, 3424, 0, - 0, 3546, 0, - 0, 3670, 0, - 2602, 2350, 2813, - 2602, 2351, 2812, - 2602, 2351, 2812, - 2601, 2352, 2812, - 2600, 2353, 2811, - 2599, 2354, 2811, - 2597, 2355, 2810, - 2595, 2357, 2809, - 2591, 2359, 2807, - 2587, 2362, 2805, - 2582, 2367, 2803, - 2574, 2372, 2799, - 2563, 2380, 2794, - 2549, 2390, 2788, - 2529, 2402, 2779, - 2501, 2419, 2767, - 2460, 2440, 2750, - 2400, 2467, 2727, - 2303, 2501, 2694, - 2131, 2543, 2645, - 1693, 2593, 2570, - 0, 2652, 2447, - 0, 2721, 2200, - 0, 2800, 714, - 0, 2887, 0, - 0, 2983, 0, - 0, 3085, 0, - 0, 3194, 0, - 0, 3308, 0, - 0, 3426, 0, - 0, 3547, 0, - 0, 3671, 0, - 2781, 2377, 2879, - 2781, 2377, 2879, - 2781, 2378, 2879, - 2780, 2378, 2878, - 2780, 2379, 2878, - 2779, 2380, 2877, - 2778, 2381, 2877, - 2776, 2383, 2876, - 2774, 2385, 2874, - 2771, 2388, 2873, - 2767, 2392, 2870, - 2762, 2398, 2867, - 2755, 2405, 2863, - 2746, 2414, 2858, - 2733, 2426, 2850, - 2715, 2442, 2840, - 2691, 2462, 2826, - 2655, 2488, 2806, - 2602, 2520, 2778, - 2521, 2560, 2738, - 2384, 2609, 2678, - 2092, 2666, 2584, - 0, 2733, 2415, - 0, 2810, 1999, - 0, 2895, 0, - 0, 2989, 0, - 0, 3091, 0, - 0, 3198, 0, - 0, 3311, 0, - 0, 3429, 0, - 0, 3549, 0, - 0, 3673, 0, - 2946, 2411, 2955, - 2945, 2411, 2955, - 2945, 2411, 2954, - 2945, 2412, 2954, - 2944, 2412, 2954, - 2944, 2413, 2953, - 2943, 2414, 2953, - 2942, 2416, 2952, - 2940, 2418, 2951, - 2939, 2421, 2950, - 2936, 2425, 2948, - 2932, 2430, 2945, - 2928, 2436, 2942, - 2921, 2445, 2937, - 2913, 2456, 2930, - 2901, 2471, 2922, - 2884, 2490, 2910, - 2861, 2514, 2894, - 2829, 2545, 2871, - 2781, 2583, 2838, - 2709, 2629, 2791, - 2589, 2684, 2719, - 2354, 2749, 2601, - 1291, 2823, 2369, - 0, 2906, 1378, - 0, 2998, 0, - 0, 3098, 0, - 0, 3204, 0, - 0, 3316, 0, - 0, 3432, 0, - 0, 3552, 0, - 0, 3675, 0, - 3100, 2452, 3040, - 3100, 2452, 3040, - 3100, 2452, 3039, - 3100, 2453, 3039, - 3099, 2453, 3039, - 3099, 2454, 3039, - 3098, 2455, 3038, - 3098, 2457, 3037, - 3097, 2459, 3037, - 3095, 2461, 3035, - 3093, 2465, 3034, - 3091, 2469, 3032, - 3088, 2475, 3029, - 3083, 2483, 3025, - 3077, 2494, 3020, - 3069, 2507, 3013, - 3058, 2525, 3003, - 3042, 2547, 2990, - 3020, 2576, 2971, - 2990, 2611, 2945, - 2945, 2655, 2909, - 2878, 2707, 2854, - 2769, 2769, 2769, - 2564, 2840, 2622, - 1912, 2921, 2300, - 0, 3010, 0, - 0, 3107, 0, - 0, 3212, 0, - 0, 3322, 0, - 0, 3437, 0, - 0, 3555, 0, - 0, 3677, 0, - 3249, 2501, 3133, - 3248, 2502, 3133, - 3248, 2502, 3133, - 3248, 2502, 3133, - 3248, 2503, 3132, - 3248, 2504, 3132, - 3247, 2505, 3132, - 3247, 2506, 3131, - 3246, 2508, 3130, - 3245, 2510, 3129, - 3244, 2513, 3128, - 3242, 2517, 3126, - 3239, 2523, 3124, - 3236, 2530, 3121, - 3232, 2539, 3117, - 3226, 2552, 3111, - 3218, 2568, 3103, - 3207, 2588, 3093, - 3192, 2614, 3078, - 3172, 2647, 3058, - 3142, 2687, 3029, - 3100, 2736, 2988, - 3036, 2794, 2926, - 2934, 2862, 2828, - 2746, 2939, 2650, - 2226, 3025, 2186, - 0, 3120, 0, - 0, 3221, 0, - 0, 3329, 0, - 0, 3443, 0, - 0, 3560, 0, - 0, 3681, 0, - 3392, 2560, 3234, - 3392, 2561, 3234, - 3392, 2561, 3234, - 3392, 2561, 3233, - 3392, 2562, 3233, - 3392, 2562, 3233, - 3391, 2563, 3233, - 3391, 2564, 3232, - 3391, 2566, 3232, - 3390, 2568, 3231, - 3389, 2571, 3230, - 3388, 2574, 3229, - 3386, 2579, 3227, - 3383, 2586, 3224, - 3380, 2594, 3221, - 3376, 2605, 3216, - 3370, 2619, 3210, - 3363, 2637, 3202, - 3352, 2661, 3190, - 3338, 2691, 3175, - 3317, 2727, 3153, - 3289, 2772, 3121, - 3248, 2826, 3076, - 3187, 2890, 3008, - 3089, 2962, 2896, - 2913, 3045, 2685, - 2459, 3135, 1969, - 0, 3234, 0, - 0, 3339, 0, - 0, 3450, 0, - 0, 3566, 0, - 0, 3685, 0, - 3533, 2629, 3341, - 3533, 2629, 3341, - 3533, 2629, 3341, - 3533, 2630, 3341, - 3533, 2630, 3341, - 3533, 2631, 3340, - 3532, 2631, 3340, - 3532, 2632, 3340, - 3532, 2634, 3339, - 3531, 2636, 3339, - 3530, 2638, 3338, - 3530, 2641, 3337, - 3528, 2645, 3335, - 3527, 2651, 3333, - 3524, 2658, 3331, - 3521, 2668, 3327, - 3517, 2680, 3322, - 3512, 2696, 3316, - 3504, 2717, 3307, - 3494, 2743, 3295, - 3479, 2776, 3278, - 3460, 2817, 3255, - 3432, 2866, 3221, - 3392, 2924, 3173, - 3332, 2992, 3098, - 3237, 3069, 2974, - 3069, 3156, 2727, - 2654, 3251, 1192, - 0, 3353, 0, - 0, 3461, 0, - 0, 3574, 0, - 0, 3692, 0, - 3672, 2707, 3453, - 3672, 2707, 3453, - 3671, 2707, 3453, - 3671, 2708, 3453, - 3671, 2708, 3453, - 3671, 2709, 3453, - 3671, 2709, 3453, - 3671, 2710, 3453, - 3671, 2711, 3452, - 3670, 2713, 3452, - 3670, 2715, 3451, - 3669, 2717, 3450, - 3668, 2721, 3449, - 3667, 2725, 3448, - 3665, 2732, 3446, - 3663, 2740, 3443, - 3660, 2750, 3439, - 3656, 2764, 3434, - 3650, 2782, 3427, - 3643, 2805, 3418, - 3633, 2834, 3405, - 3619, 2870, 3388, - 3599, 2914, 3363, - 3572, 2967, 3328, - 3532, 3029, 3276, - 3474, 3101, 3196, - 3382, 3182, 3061, - 3218, 3272, 2778, - 2827, 3370, 0, - 0, 3474, 0, - 0, 3585, 0, - 0, 3700, 0, - 3808, 2794, 3570, - 3808, 2794, 3570, - 3808, 2794, 3570, - 3808, 2795, 3570, - 3808, 2795, 3570, - 3808, 2795, 3570, - 3808, 2796, 3570, - 3808, 2796, 3570, - 3808, 2797, 3569, - 3807, 2799, 3569, - 3807, 2800, 3569, - 3806, 2803, 3568, - 3806, 2805, 3567, - 3805, 2809, 3566, - 3804, 2814, 3564, - 3802, 2821, 3562, - 3800, 2830, 3559, - 3797, 2842, 3555, - 3793, 2857, 3550, - 3787, 2876, 3543, - 3780, 2901, 3533, - 3770, 2932, 3520, - 3756, 2971, 3502, - 3737, 3018, 3476, - 3710, 3074, 3440, - 3671, 3139, 3385, - 3613, 3214, 3301, - 3522, 3299, 3156, - 3363, 3391, 2839, - 2989, 3492, 0, - 0, 3598, 0, - 0, 3710, 0, - 3944, 2889, 3691, - 3944, 2889, 3691, - 3944, 2890, 3691, - 3944, 2890, 3691, - 3944, 2890, 3691, - 3944, 2890, 3691, - 3944, 2891, 3690, - 3943, 2891, 3690, - 3943, 2892, 3690, - 3943, 2893, 3690, - 3943, 2894, 3689, - 3942, 2896, 3689, - 3942, 2898, 3688, - 3941, 2902, 3687, - 3940, 2906, 3686, - 3939, 2911, 3684, - 3937, 2919, 3682, - 3935, 2928, 3679, - 3932, 2941, 3675, - 3928, 2957, 3670, - 3923, 2978, 3663, - 3916, 3004, 3653, - 3906, 3037, 3639, - 3892, 3078, 3620, - 3873, 3128, 3594, - 3846, 3186, 3556, - 3808, 3255, 3500, - 3750, 3332, 3412, - 3661, 3419, 3258, - 3504, 3514, 2909, - 3141, 3616, 0, - 0, 3724, 0, - 4079, 2992, 3814, - 4079, 2992, 3814, - 4078, 2992, 3814, - 4078, 2992, 3814, - 4078, 2992, 3814, - 4078, 2992, 3814, - 4078, 2993, 3814, - 4078, 2993, 3813, - 4078, 2994, 3813, - 4078, 2995, 3813, - 4078, 2996, 3813, - 4077, 2997, 3812, - 4077, 2999, 3812, - 4077, 3002, 3811, - 4076, 3005, 3810, - 4075, 3009, 3809, - 4074, 3015, 3807, - 4072, 3023, 3805, - 4070, 3033, 3802, - 4067, 3047, 3798, - 4063, 3064, 3793, - 4058, 3086, 3785, - 4050, 3114, 3775, - 4040, 3148, 3761, - 4027, 3191, 3742, - 4008, 3242, 3715, - 3981, 3303, 3676, - 3943, 3374, 3618, - 3886, 3453, 3527, - 3798, 3542, 3367, - 3643, 3639, 2988, - 3288, 3742, 0, - 4095, 3100, 3939, - 4095, 3100, 3939, - 4095, 3100, 3939, - 4095, 3101, 3939, - 4095, 3101, 3939, - 4095, 3101, 3939, - 4095, 3101, 3939, - 4095, 3101, 3939, - 4095, 3102, 3939, - 4095, 3103, 3939, - 4095, 3103, 3938, - 4095, 3105, 3938, - 4095, 3106, 3938, - 4095, 3108, 3937, - 4095, 3111, 3936, - 4095, 3114, 3936, - 4095, 3119, 3934, - 4095, 3125, 3933, - 4095, 3133, 3930, - 4095, 3144, 3927, - 4095, 3158, 3923, - 4095, 3176, 3918, - 4095, 3199, 3910, - 4095, 3228, 3900, - 4095, 3264, 3886, - 4095, 3308, 3866, - 4095, 3361, 3839, - 4095, 3424, 3799, - 4078, 3496, 3740, - 4021, 3577, 3646, - 3933, 3667, 3480, - 3780, 3765, 3076, - 4095, 3214, 4066, - 4095, 3214, 4066, - 4095, 3214, 4066, - 4095, 3214, 4066, - 4095, 3214, 4066, - 4095, 3214, 4066, - 4095, 3215, 4066, - 4095, 3215, 4066, - 4095, 3215, 4066, - 4095, 3216, 4066, - 4095, 3216, 4066, - 4095, 3217, 4065, - 4095, 3218, 4065, - 4095, 3220, 4065, - 4095, 3222, 4064, - 4095, 3225, 4063, - 4095, 3229, 4062, - 4095, 3233, 4061, - 4095, 3240, 4059, - 4095, 3248, 4057, - 4095, 3259, 4054, - 4095, 3274, 4050, - 4095, 3292, 4044, - 4095, 3316, 4037, - 4095, 3346, 4026, - 4095, 3383, 4012, - 4095, 3429, 3992, - 4095, 3483, 3964, - 4095, 3547, 3924, - 4095, 3620, 3864, - 4095, 3703, 3768, - 4068, 3794, 3598, - 0, 2393, 2661, - 0, 2393, 2661, - 0, 2393, 2661, - 0, 2394, 2660, - 0, 2395, 2660, - 0, 2396, 2659, - 0, 2397, 2658, - 0, 2399, 2656, - 0, 2401, 2654, - 0, 2404, 2651, - 0, 2408, 2648, - 0, 2413, 2643, - 0, 2420, 2636, - 0, 2429, 2627, - 0, 2440, 2614, - 0, 2456, 2596, - 0, 2475, 2572, - 0, 2500, 2537, - 0, 2532, 2485, - 0, 2571, 2406, - 0, 2618, 2271, - 0, 2674, 1991, - 0, 2740, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3313, 0, - 0, 3430, 0, - 0, 3550, 0, - 0, 3673, 0, - 0, 2393, 2662, - 0, 2393, 2662, - 0, 2394, 2661, - 0, 2394, 2661, - 0, 2395, 2660, - 0, 2396, 2659, - 0, 2397, 2658, - 0, 2399, 2657, - 0, 2401, 2655, - 0, 2404, 2652, - 0, 2408, 2648, - 0, 2413, 2643, - 0, 2420, 2636, - 0, 2429, 2627, - 0, 2441, 2614, - 0, 2456, 2597, - 0, 2475, 2572, - 0, 2500, 2537, - 0, 2532, 2486, - 0, 2571, 2406, - 0, 2618, 2272, - 0, 2675, 1992, - 0, 2740, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3313, 0, - 0, 3430, 0, - 0, 3550, 0, - 0, 3673, 0, - 0, 2393, 2662, - 0, 2393, 2662, - 0, 2394, 2662, - 0, 2394, 2661, - 0, 2395, 2661, - 0, 2396, 2660, - 0, 2397, 2659, - 0, 2399, 2657, - 0, 2401, 2655, - 0, 2404, 2652, - 0, 2408, 2649, - 0, 2413, 2644, - 0, 2420, 2637, - 0, 2429, 2628, - 0, 2441, 2615, - 0, 2456, 2597, - 0, 2476, 2573, - 0, 2501, 2538, - 0, 2532, 2487, - 0, 2571, 2407, - 0, 2618, 2273, - 0, 2675, 1995, - 0, 2741, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3313, 0, - 0, 3430, 0, - 0, 3550, 0, - 0, 3673, 0, - 0, 2393, 2663, - 0, 2393, 2663, - 0, 2394, 2662, - 0, 2394, 2662, - 0, 2395, 2661, - 0, 2396, 2661, - 0, 2397, 2659, - 0, 2399, 2658, - 0, 2401, 2656, - 0, 2404, 2653, - 0, 2408, 2649, - 0, 2413, 2644, - 0, 2420, 2638, - 0, 2429, 2628, - 0, 2441, 2616, - 0, 2456, 2598, - 0, 2476, 2574, - 0, 2501, 2539, - 0, 2532, 2488, - 0, 2571, 2408, - 0, 2618, 2275, - 0, 2675, 1998, - 0, 2741, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3313, 0, - 0, 3430, 0, - 0, 3550, 0, - 0, 3674, 0, - 0, 2393, 2664, - 0, 2394, 2664, - 0, 2394, 2663, - 0, 2395, 2663, - 0, 2395, 2662, - 0, 2396, 2661, - 0, 2398, 2660, - 0, 2399, 2659, - 0, 2401, 2657, - 0, 2404, 2654, - 0, 2408, 2650, - 0, 2413, 2645, - 0, 2420, 2639, - 0, 2429, 2629, - 0, 2441, 2617, - 0, 2456, 2599, - 0, 2476, 2575, - 0, 2501, 2540, - 0, 2532, 2489, - 0, 2571, 2410, - 0, 2618, 2277, - 0, 2675, 2002, - 0, 2741, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3313, 0, - 0, 3430, 0, - 0, 3550, 0, - 0, 3674, 0, - 0, 2394, 2665, - 0, 2394, 2665, - 0, 2394, 2665, - 0, 2395, 2664, - 0, 2396, 2664, - 0, 2397, 2663, - 0, 2398, 2662, - 0, 2399, 2660, - 0, 2402, 2658, - 0, 2405, 2655, - 0, 2409, 2652, - 0, 2414, 2647, - 0, 2421, 2640, - 0, 2430, 2631, - 0, 2441, 2618, - 0, 2457, 2601, - 0, 2476, 2576, - 0, 2501, 2542, - 0, 2533, 2491, - 0, 2571, 2412, - 0, 2619, 2280, - 0, 2675, 2007, - 0, 2741, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3314, 0, - 0, 3430, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2394, 2667, - 0, 2394, 2667, - 0, 2395, 2666, - 0, 2395, 2666, - 0, 2396, 2665, - 0, 2397, 2664, - 0, 2398, 2663, - 0, 2400, 2662, - 0, 2402, 2660, - 0, 2405, 2657, - 0, 2409, 2653, - 0, 2414, 2648, - 0, 2421, 2642, - 0, 2430, 2633, - 0, 2442, 2620, - 0, 2457, 2603, - 0, 2477, 2579, - 0, 2501, 2544, - 0, 2533, 2493, - 0, 2572, 2415, - 0, 2619, 2284, - 0, 2675, 2014, - 0, 2741, 0, - 0, 2816, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3094, 0, - 0, 3201, 0, - 0, 3314, 0, - 0, 3430, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2395, 2669, - 0, 2395, 2669, - 0, 2395, 2669, - 0, 2396, 2668, - 0, 2397, 2668, - 0, 2398, 2667, - 0, 2399, 2666, - 0, 2400, 2664, - 0, 2403, 2662, - 0, 2406, 2659, - 0, 2410, 2656, - 0, 2415, 2651, - 0, 2422, 2644, - 0, 2430, 2635, - 0, 2442, 2623, - 0, 2457, 2605, - 0, 2477, 2581, - 0, 2502, 2547, - 0, 2533, 2497, - 0, 2572, 2419, - 0, 2619, 2289, - 0, 2676, 2024, - 0, 2741, 0, - 0, 2817, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3095, 0, - 0, 3201, 0, - 0, 3314, 0, - 0, 3430, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2395, 2672, - 0, 2396, 2672, - 0, 2396, 2672, - 0, 2397, 2671, - 0, 2397, 2670, - 0, 2398, 2670, - 0, 2400, 2669, - 0, 2401, 2667, - 0, 2403, 2665, - 0, 2406, 2662, - 0, 2410, 2659, - 0, 2415, 2654, - 0, 2422, 2647, - 0, 2431, 2638, - 0, 2443, 2626, - 0, 2458, 2609, - 0, 2478, 2585, - 0, 2503, 2551, - 0, 2534, 2501, - 0, 2573, 2424, - 0, 2620, 2296, - 0, 2676, 2036, - 0, 2742, 0, - 0, 2817, 0, - 0, 2901, 0, - 0, 2994, 0, - 0, 3095, 0, - 0, 3202, 0, - 0, 3314, 0, - 0, 3430, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2397, 2676, - 0, 2397, 2676, - 0, 2397, 2676, - 0, 2398, 2675, - 0, 2398, 2674, - 0, 2399, 2674, - 0, 2401, 2673, - 0, 2402, 2671, - 0, 2404, 2669, - 0, 2407, 2666, - 0, 2411, 2663, - 0, 2416, 2658, - 0, 2423, 2651, - 0, 2432, 2642, - 0, 2444, 2630, - 0, 2459, 2613, - 0, 2478, 2590, - 0, 2503, 2556, - 0, 2535, 2507, - 0, 2573, 2431, - 0, 2620, 2305, - 0, 2677, 2052, - 0, 2742, 0, - 0, 2817, 0, - 0, 2902, 0, - 0, 2995, 0, - 0, 3095, 0, - 0, 3202, 0, - 0, 3314, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2398, 2681, - 0, 2398, 2681, - 0, 2399, 2681, - 0, 2399, 2680, - 0, 2400, 2680, - 0, 2401, 2679, - 0, 2402, 2678, - 0, 2404, 2676, - 0, 2406, 2674, - 0, 2409, 2672, - 0, 2413, 2668, - 0, 2418, 2663, - 0, 2424, 2657, - 0, 2433, 2648, - 0, 2445, 2636, - 0, 2460, 2619, - 0, 2480, 2596, - 0, 2504, 2563, - 0, 2536, 2514, - 0, 2574, 2440, - 0, 2621, 2317, - 0, 2677, 2072, - 0, 2743, 674, - 0, 2818, 0, - 0, 2902, 0, - 0, 2995, 0, - 0, 3095, 0, - 0, 3202, 0, - 0, 3314, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2400, 2688, - 0, 2400, 2688, - 0, 2400, 2688, - 0, 2401, 2687, - 0, 2402, 2687, - 0, 2402, 2686, - 0, 2404, 2685, - 0, 2405, 2683, - 0, 2408, 2681, - 0, 2410, 2679, - 0, 2414, 2675, - 0, 2419, 2671, - 0, 2426, 2664, - 0, 2435, 2656, - 0, 2447, 2644, - 0, 2462, 2627, - 0, 2481, 2604, - 0, 2506, 2572, - 0, 2537, 2524, - 0, 2575, 2452, - 0, 2622, 2332, - 0, 2678, 2098, - 0, 2744, 1046, - 0, 2819, 0, - 0, 2903, 0, - 0, 2995, 0, - 0, 3096, 0, - 0, 3202, 0, - 0, 3314, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2402, 2697, - 0, 2402, 2697, - 0, 2403, 2697, - 0, 2403, 2696, - 0, 2404, 2696, - 0, 2405, 2695, - 0, 2406, 2694, - 0, 2408, 2693, - 0, 2410, 2691, - 0, 2413, 2688, - 0, 2417, 2685, - 0, 2422, 2680, - 0, 2428, 2674, - 0, 2437, 2665, - 0, 2449, 2654, - 0, 2464, 2638, - 0, 2483, 2615, - 0, 2508, 2583, - 0, 2539, 2537, - 0, 2577, 2467, - 0, 2624, 2352, - 0, 2680, 2130, - 0, 2745, 1300, - 0, 2820, 0, - 0, 2904, 0, - 0, 2996, 0, - 0, 3096, 0, - 0, 3203, 0, - 0, 3315, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2405, 2709, - 0, 2406, 2709, - 0, 2406, 2709, - 0, 2406, 2708, - 0, 2407, 2708, - 0, 2408, 2707, - 0, 2409, 2706, - 0, 2411, 2705, - 0, 2413, 2703, - 0, 2416, 2700, - 0, 2420, 2697, - 0, 2425, 2692, - 0, 2431, 2686, - 0, 2440, 2678, - 0, 2452, 2667, - 0, 2467, 2651, - 0, 2486, 2629, - 0, 2510, 2599, - 0, 2541, 2554, - 0, 2579, 2486, - 0, 2626, 2377, - 0, 2681, 2170, - 0, 2746, 1506, - 0, 2821, 0, - 0, 2905, 0, - 0, 2997, 0, - 0, 3097, 0, - 0, 3203, 0, - 0, 3315, 0, - 0, 3431, 0, - 0, 3551, 0, - 0, 3674, 0, - 0, 2410, 2725, - 0, 2410, 2724, - 0, 2410, 2724, - 0, 2411, 2724, - 0, 2411, 2723, - 0, 2412, 2722, - 0, 2413, 2721, - 0, 2415, 2720, - 0, 2417, 2718, - 0, 2420, 2716, - 0, 2424, 2713, - 0, 2429, 2708, - 0, 2435, 2702, - 0, 2444, 2694, - 0, 2456, 2684, - 0, 2470, 2669, - 0, 2489, 2648, - 0, 2514, 2618, - 0, 2544, 2575, - 0, 2582, 2511, - 0, 2628, 2408, - 0, 2684, 2219, - 0, 2748, 1686, - 0, 2823, 0, - 0, 2906, 0, - 0, 2998, 0, - 0, 3098, 0, - 0, 3204, 0, - 0, 3316, 0, - 0, 3432, 0, - 0, 3552, 0, - 0, 3675, 0, - 0, 2415, 2744, - 0, 2415, 2744, - 0, 2416, 2744, - 0, 2416, 2744, - 0, 2417, 2743, - 0, 2418, 2742, - 0, 2419, 2741, - 0, 2421, 2740, - 0, 2423, 2738, - 0, 2426, 2736, - 0, 2429, 2733, - 0, 2434, 2729, - 0, 2441, 2723, - 0, 2449, 2716, - 0, 2461, 2705, - 0, 2475, 2691, - 0, 2494, 2671, - 0, 2518, 2643, - 0, 2548, 2603, - 0, 2586, 2543, - 0, 2632, 2447, - 0, 2687, 2277, - 0, 2751, 1851, - 0, 2825, 0, - 0, 2908, 0, - 0, 3000, 0, - 0, 3099, 0, - 0, 3205, 0, - 0, 3316, 0, - 0, 3432, 0, - 0, 3552, 0, - 0, 3675, 0, - 896, 2423, 2770, - 879, 2423, 2769, - 854, 2423, 2769, - 820, 2424, 2769, - 769, 2424, 2768, - 691, 2425, 2768, - 560, 2426, 2767, - 290, 2428, 2766, - 0, 2430, 2764, - 0, 2433, 2762, - 0, 2436, 2759, - 0, 2441, 2755, - 0, 2448, 2750, - 0, 2456, 2742, - 0, 2467, 2733, - 0, 2482, 2719, - 0, 2500, 2701, - 0, 2524, 2674, - 0, 2554, 2637, - 0, 2591, 2581, - 0, 2636, 2494, - 0, 2691, 2344, - 0, 2755, 2007, - 0, 2828, 0, - 0, 2910, 0, - 0, 3002, 0, - 0, 3101, 0, - 0, 3206, 0, - 0, 3317, 0, - 0, 3433, 0, - 0, 3553, 0, - 0, 3675, 0, - 1925, 2432, 2801, - 1923, 2432, 2801, - 1921, 2433, 2801, - 1917, 2433, 2801, - 1913, 2434, 2800, - 1907, 2435, 2799, - 1899, 2436, 2799, - 1889, 2438, 2798, - 1874, 2440, 2796, - 1853, 2442, 2794, - 1824, 2446, 2791, - 1782, 2451, 2788, - 1718, 2457, 2783, - 1617, 2465, 2776, - 1432, 2476, 2767, - 925, 2490, 2754, - 0, 2508, 2737, - 0, 2532, 2713, - 0, 2561, 2679, - 0, 2598, 2628, - 0, 2642, 2551, - 0, 2696, 2421, - 0, 2759, 2155, - 0, 2832, 0, - 0, 2914, 0, - 0, 3004, 0, - 0, 3103, 0, - 0, 3208, 0, - 0, 3319, 0, - 0, 3434, 0, - 0, 3554, 0, - 0, 3676, 0, - 2283, 2445, 2841, - 2282, 2445, 2840, - 2281, 2445, 2840, - 2279, 2446, 2840, - 2278, 2447, 2839, - 2275, 2447, 2839, - 2271, 2449, 2838, - 2267, 2450, 2837, - 2260, 2452, 2836, - 2252, 2455, 2834, - 2240, 2458, 2831, - 2223, 2463, 2828, - 2200, 2469, 2823, - 2168, 2477, 2817, - 2120, 2488, 2809, - 2047, 2501, 2798, - 1927, 2519, 2782, - 1692, 2542, 2760, - 612, 2571, 2729, - 0, 2607, 2685, - 0, 2650, 2617, - 0, 2703, 2507, - 0, 2765, 2299, - 0, 2837, 1624, - 0, 2918, 0, - 0, 3008, 0, - 0, 3106, 0, - 0, 3210, 0, - 0, 3321, 0, - 0, 3436, 0, - 0, 3555, 0, - 0, 3677, 0, - 2532, 2461, 2888, - 2531, 2462, 2888, - 2531, 2462, 2888, - 2530, 2462, 2887, - 2529, 2463, 2887, - 2527, 2464, 2887, - 2525, 2465, 2886, - 2522, 2466, 2885, - 2519, 2468, 2884, - 2514, 2471, 2882, - 2507, 2474, 2880, - 2498, 2479, 2877, - 2486, 2484, 2873, - 2469, 2492, 2867, - 2445, 2503, 2860, - 2411, 2516, 2850, - 2360, 2533, 2836, - 2283, 2555, 2817, - 2155, 2583, 2789, - 1893, 2618, 2750, - 0, 2661, 2692, - 0, 2713, 2601, - 0, 2774, 2440, - 0, 2844, 2059, - 0, 2924, 0, - 0, 3013, 0, - 0, 3110, 0, - 0, 3213, 0, - 0, 3323, 0, - 0, 3438, 0, - 0, 3556, 0, - 0, 3678, 0, - 2735, 2482, 2945, - 2735, 2483, 2945, - 2734, 2483, 2945, - 2734, 2483, 2944, - 2733, 2484, 2944, - 2732, 2485, 2944, - 2731, 2486, 2943, - 2729, 2487, 2942, - 2727, 2489, 2941, - 2724, 2491, 2940, - 2719, 2495, 2938, - 2714, 2499, 2935, - 2706, 2504, 2931, - 2696, 2512, 2927, - 2681, 2522, 2920, - 2661, 2535, 2911, - 2633, 2551, 2899, - 2592, 2572, 2882, - 2532, 2599, 2859, - 2435, 2633, 2826, - 2263, 2675, 2777, - 1825, 2725, 2702, - 0, 2784, 2579, - 0, 2853, 2332, - 0, 2932, 847, - 0, 3019, 0, - 0, 3115, 0, - 0, 3217, 0, - 0, 3326, 0, - 0, 3440, 0, - 0, 3558, 0, - 0, 3679, 0, - 2914, 2509, 3011, - 2913, 2509, 3011, - 2913, 2510, 3011, - 2913, 2510, 3011, - 2912, 2510, 3010, - 2912, 2511, 3010, - 2911, 2512, 3009, - 2910, 2513, 3009, - 2908, 2515, 3008, - 2906, 2517, 3007, - 2903, 2521, 3005, - 2900, 2525, 3003, - 2894, 2530, 3000, - 2888, 2537, 2995, - 2878, 2546, 2990, - 2865, 2558, 2982, - 2848, 2574, 2972, - 2823, 2594, 2958, - 2787, 2620, 2938, - 2735, 2652, 2910, - 2653, 2692, 2870, - 2516, 2741, 2810, - 2224, 2798, 2716, - 0, 2865, 2547, - 0, 2942, 2131, - 0, 3028, 0, - 0, 3122, 0, - 0, 3223, 0, - 0, 3331, 0, - 0, 3443, 0, - 0, 3561, 0, - 0, 3681, 0, - 3078, 2542, 3087, - 3078, 2543, 3087, - 3077, 2543, 3087, - 3077, 2543, 3087, - 3077, 2544, 3086, - 3076, 2544, 3086, - 3076, 2545, 3086, - 3075, 2547, 3085, - 3074, 2548, 3084, - 3073, 2550, 3083, - 3071, 2553, 3082, - 3068, 2557, 3080, - 3064, 2562, 3077, - 3060, 2569, 3074, - 3053, 2577, 3069, - 3045, 2589, 3063, - 3033, 2603, 3054, - 3016, 2622, 3042, - 2993, 2647, 3026, - 2961, 2677, 3003, - 2913, 2715, 2971, - 2841, 2761, 2923, - 2721, 2816, 2851, - 2486, 2881, 2733, - 1423, 2955, 2501, - 0, 3039, 1510, - 0, 3130, 0, - 0, 3230, 0, - 0, 3336, 0, - 0, 3448, 0, - 0, 3564, 0, - 0, 3684, 0, - 3232, 2584, 3172, - 3232, 2584, 3172, - 3232, 2584, 3172, - 3232, 2584, 3172, - 3232, 2585, 3171, - 3232, 2585, 3171, - 3231, 2586, 3171, - 3231, 2587, 3170, - 3230, 2589, 3170, - 3229, 2591, 3169, - 3227, 2593, 3167, - 3226, 2597, 3166, - 3223, 2601, 3164, - 3220, 2607, 3161, - 3215, 2615, 3157, - 3209, 2626, 3152, - 3201, 2639, 3145, - 3190, 2657, 3135, - 3174, 2680, 3122, - 3152, 2708, 3103, - 3122, 2743, 3078, - 3077, 2787, 3041, - 3010, 2839, 2986, - 2901, 2901, 2901, - 2696, 2972, 2754, - 2044, 3053, 2432, - 0, 3142, 0, - 0, 3239, 0, - 0, 3344, 0, - 0, 3454, 0, - 0, 3569, 0, - 0, 3687, 0, - 3381, 2633, 3265, - 3381, 2634, 3265, - 3381, 2634, 3265, - 3380, 2634, 3265, - 3380, 2634, 3265, - 3380, 2635, 3265, - 3380, 2636, 3264, - 3379, 2637, 3264, - 3379, 2638, 3263, - 3378, 2640, 3263, - 3377, 2642, 3262, - 3376, 2645, 3260, - 3374, 2649, 3259, - 3372, 2655, 3256, - 3368, 2662, 3253, - 3364, 2671, 3249, - 3358, 2684, 3243, - 3350, 2700, 3235, - 3339, 2720, 3225, - 3324, 2746, 3210, - 3304, 2779, 3190, - 3274, 2819, 3161, - 3232, 2868, 3120, - 3168, 2926, 3058, - 3066, 2994, 2960, - 2879, 3071, 2782, - 2358, 3157, 2318, - 0, 3252, 0, - 0, 3353, 0, - 0, 3461, 0, - 0, 3575, 0, - 0, 3692, 0, - 3525, 2692, 3366, - 3525, 2693, 3366, - 3524, 2693, 3366, - 3524, 2693, 3366, - 3524, 2693, 3366, - 3524, 2694, 3365, - 3524, 2695, 3365, - 3524, 2695, 3365, - 3523, 2697, 3364, - 3523, 2698, 3364, - 3522, 2700, 3363, - 3521, 2703, 3362, - 3520, 2707, 3361, - 3518, 2711, 3359, - 3516, 2718, 3356, - 3512, 2726, 3353, - 3508, 2737, 3348, - 3503, 2751, 3342, - 3495, 2770, 3334, - 3484, 2793, 3322, - 3470, 2823, 3307, - 3450, 2859, 3285, - 3421, 2904, 3254, - 3380, 2958, 3208, - 3319, 3022, 3140, - 3221, 3095, 3028, - 3045, 3177, 2817, - 2591, 3268, 2101, - 0, 3366, 0, - 0, 3471, 0, - 0, 3582, 0, - 0, 3698, 0, - 3665, 2761, 3473, - 3665, 2761, 3473, - 3665, 2761, 3473, - 3665, 2762, 3473, - 3665, 2762, 3473, - 3665, 2762, 3473, - 3665, 2763, 3472, - 3665, 2764, 3472, - 3664, 2765, 3472, - 3664, 2766, 3471, - 3663, 2768, 3471, - 3663, 2770, 3470, - 3662, 2773, 3469, - 3660, 2777, 3467, - 3659, 2783, 3465, - 3656, 2790, 3463, - 3653, 2800, 3459, - 3649, 2812, 3454, - 3644, 2828, 3448, - 3636, 2849, 3439, - 3626, 2875, 3427, - 3611, 2908, 3410, - 3592, 2949, 3387, - 3564, 2998, 3353, - 3524, 3056, 3305, - 3464, 3124, 3230, - 3370, 3202, 3106, - 3201, 3288, 2859, - 2786, 3383, 1324, - 0, 3485, 0, - 0, 3593, 0, - 0, 3706, 0, - 3804, 2839, 3586, - 3804, 2839, 3586, - 3804, 2839, 3586, - 3804, 2840, 3585, - 3803, 2840, 3585, - 3803, 2840, 3585, - 3803, 2841, 3585, - 3803, 2841, 3585, - 3803, 2842, 3585, - 3803, 2843, 3584, - 3802, 2845, 3584, - 3802, 2847, 3583, - 3801, 2849, 3582, - 3800, 2853, 3581, - 3799, 2858, 3580, - 3797, 2864, 3578, - 3795, 2872, 3575, - 3792, 2882, 3571, - 3788, 2896, 3566, - 3782, 2914, 3559, - 3775, 2937, 3550, - 3765, 2966, 3537, - 3751, 3002, 3520, - 3731, 3046, 3495, - 3704, 3099, 3460, - 3665, 3161, 3408, - 3606, 3233, 3328, - 3514, 3314, 3193, - 3351, 3404, 2910, - 2960, 3502, 0, - 0, 3606, 0, - 0, 3717, 0, - 3940, 2926, 3703, - 3940, 2926, 3702, - 3940, 2926, 3702, - 3940, 2926, 3702, - 3940, 2927, 3702, - 3940, 2927, 3702, - 3940, 2927, 3702, - 3940, 2928, 3702, - 3940, 2929, 3702, - 3940, 2930, 3702, - 3939, 2931, 3701, - 3939, 2932, 3701, - 3938, 2935, 3700, - 3938, 2938, 3699, - 3937, 2941, 3698, - 3936, 2947, 3696, - 3934, 2953, 3694, - 3932, 2962, 3691, - 3929, 2974, 3687, - 3925, 2989, 3682, - 3919, 3008, 3675, - 3912, 3033, 3666, - 3902, 3064, 3652, - 3888, 3103, 3634, - 3869, 3150, 3608, - 3842, 3206, 3572, - 3803, 3271, 3517, - 3745, 3347, 3433, - 3654, 3431, 3288, - 3495, 3523, 2971, - 3121, 3624, 0, - 0, 3730, 0, - 4076, 3021, 3823, - 4076, 3021, 3823, - 4076, 3021, 3823, - 4076, 3022, 3823, - 4076, 3022, 3823, - 4076, 3022, 3823, - 4076, 3022, 3823, - 4076, 3023, 3822, - 4076, 3023, 3822, - 4075, 3024, 3822, - 4075, 3025, 3822, - 4075, 3026, 3821, - 4075, 3028, 3821, - 4074, 3031, 3820, - 4073, 3034, 3819, - 4072, 3038, 3818, - 4071, 3043, 3817, - 4070, 3051, 3814, - 4067, 3060, 3811, - 4064, 3073, 3807, - 4060, 3089, 3802, - 4055, 3110, 3795, - 4048, 3136, 3785, - 4038, 3170, 3771, - 4024, 3210, 3753, - 4005, 3260, 3726, - 3978, 3318, 3688, - 3940, 3387, 3632, - 3883, 3464, 3544, - 3793, 3551, 3390, - 3636, 3646, 3041, - 3273, 3748, 0, - 4095, 3124, 3946, - 4095, 3124, 3946, - 4095, 3124, 3946, - 4095, 3124, 3946, - 4095, 3124, 3946, - 4095, 3124, 3946, - 4095, 3125, 3946, - 4095, 3125, 3946, - 4095, 3125, 3946, - 4095, 3126, 3945, - 4095, 3127, 3945, - 4095, 3128, 3945, - 4095, 3129, 3945, - 4095, 3131, 3944, - 4095, 3134, 3943, - 4095, 3137, 3942, - 4095, 3142, 3941, - 4095, 3147, 3940, - 4095, 3155, 3937, - 4095, 3165, 3934, - 4095, 3179, 3930, - 4095, 3196, 3925, - 4095, 3218, 3917, - 4095, 3246, 3907, - 4095, 3280, 3893, - 4095, 3323, 3874, - 4095, 3375, 3847, - 4095, 3435, 3808, - 4075, 3506, 3750, - 4019, 3586, 3659, - 3930, 3674, 3499, - 3775, 3771, 3120, - 4095, 3232, 4071, - 4095, 3232, 4071, - 4095, 3232, 4071, - 4095, 3232, 4071, - 4095, 3233, 4071, - 4095, 3233, 4071, - 4095, 3233, 4071, - 4095, 3233, 4071, - 4095, 3234, 4071, - 4095, 3234, 4071, - 4095, 3235, 4071, - 4095, 3236, 4070, - 4095, 3237, 4070, - 4095, 3238, 4070, - 4095, 3240, 4069, - 4095, 3243, 4069, - 4095, 3246, 4068, - 4095, 3251, 4066, - 4095, 3257, 4065, - 4095, 3265, 4062, - 4095, 3276, 4059, - 4095, 3290, 4055, - 4095, 3308, 4050, - 4095, 3331, 4042, - 4095, 3360, 4032, - 4095, 3396, 4018, - 4095, 3440, 3998, - 4095, 3493, 3971, - 4095, 3556, 3931, - 4095, 3628, 3872, - 4095, 3709, 3778, - 4065, 3799, 3612, - 0, 2525, 2793, - 0, 2525, 2793, - 0, 2525, 2793, - 0, 2525, 2793, - 0, 2526, 2792, - 0, 2527, 2792, - 0, 2528, 2791, - 0, 2529, 2790, - 0, 2531, 2788, - 0, 2533, 2786, - 0, 2536, 2783, - 0, 2540, 2779, - 0, 2545, 2774, - 0, 2552, 2768, - 0, 2561, 2758, - 0, 2572, 2746, - 0, 2588, 2728, - 0, 2607, 2704, - 0, 2632, 2668, - 0, 2664, 2617, - 0, 2703, 2537, - 0, 2750, 2402, - 0, 2807, 2121, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3445, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2525, 2794, - 0, 2525, 2794, - 0, 2525, 2793, - 0, 2526, 2793, - 0, 2526, 2792, - 0, 2527, 2792, - 0, 2528, 2791, - 0, 2529, 2790, - 0, 2531, 2788, - 0, 2533, 2786, - 0, 2536, 2783, - 0, 2540, 2780, - 0, 2545, 2775, - 0, 2552, 2768, - 0, 2561, 2759, - 0, 2573, 2746, - 0, 2588, 2728, - 0, 2607, 2704, - 0, 2632, 2669, - 0, 2664, 2617, - 0, 2703, 2538, - 0, 2750, 2403, - 0, 2807, 2123, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2525, 2794, - 0, 2525, 2794, - 0, 2525, 2794, - 0, 2526, 2793, - 0, 2526, 2793, - 0, 2527, 2792, - 0, 2528, 2791, - 0, 2529, 2790, - 0, 2531, 2789, - 0, 2533, 2787, - 0, 2536, 2784, - 0, 2540, 2780, - 0, 2545, 2775, - 0, 2552, 2768, - 0, 2561, 2759, - 0, 2573, 2746, - 0, 2588, 2729, - 0, 2608, 2704, - 0, 2633, 2669, - 0, 2664, 2618, - 0, 2703, 2538, - 0, 2750, 2404, - 0, 2807, 2124, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2525, 2795, - 0, 2525, 2794, - 0, 2525, 2794, - 0, 2526, 2794, - 0, 2526, 2793, - 0, 2527, 2793, - 0, 2528, 2792, - 0, 2529, 2791, - 0, 2531, 2789, - 0, 2533, 2787, - 0, 2536, 2784, - 0, 2540, 2781, - 0, 2545, 2776, - 0, 2552, 2769, - 0, 2561, 2760, - 0, 2573, 2747, - 0, 2588, 2730, - 0, 2608, 2705, - 0, 2633, 2670, - 0, 2664, 2619, - 0, 2703, 2539, - 0, 2750, 2405, - 0, 2807, 2127, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2525, 2795, - 0, 2525, 2795, - 0, 2526, 2795, - 0, 2526, 2795, - 0, 2526, 2794, - 0, 2527, 2793, - 0, 2528, 2793, - 0, 2529, 2791, - 0, 2531, 2790, - 0, 2533, 2788, - 0, 2536, 2785, - 0, 2540, 2781, - 0, 2545, 2776, - 0, 2552, 2770, - 0, 2561, 2760, - 0, 2573, 2748, - 0, 2588, 2730, - 0, 2608, 2706, - 0, 2633, 2671, - 0, 2664, 2620, - 0, 2703, 2540, - 0, 2750, 2407, - 0, 2807, 2130, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2525, 2796, - 0, 2526, 2796, - 0, 2526, 2796, - 0, 2526, 2795, - 0, 2527, 2795, - 0, 2527, 2794, - 0, 2528, 2794, - 0, 2530, 2792, - 0, 2531, 2791, - 0, 2533, 2789, - 0, 2536, 2786, - 0, 2540, 2782, - 0, 2546, 2777, - 0, 2552, 2771, - 0, 2561, 2761, - 0, 2573, 2749, - 0, 2588, 2731, - 0, 2608, 2707, - 0, 2633, 2672, - 0, 2664, 2621, - 0, 2703, 2542, - 0, 2751, 2409, - 0, 2807, 2134, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2526, 2798, - 0, 2526, 2797, - 0, 2526, 2797, - 0, 2527, 2797, - 0, 2527, 2796, - 0, 2528, 2796, - 0, 2529, 2795, - 0, 2530, 2794, - 0, 2532, 2792, - 0, 2534, 2790, - 0, 2537, 2787, - 0, 2541, 2784, - 0, 2546, 2779, - 0, 2553, 2772, - 0, 2562, 2763, - 0, 2573, 2750, - 0, 2589, 2733, - 0, 2608, 2709, - 0, 2633, 2674, - 0, 2665, 2623, - 0, 2703, 2544, - 0, 2751, 2412, - 0, 2807, 2139, - 0, 2873, 0, - 0, 2948, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2526, 2799, - 0, 2526, 2799, - 0, 2527, 2799, - 0, 2527, 2798, - 0, 2527, 2798, - 0, 2528, 2797, - 0, 2529, 2797, - 0, 2530, 2795, - 0, 2532, 2794, - 0, 2534, 2792, - 0, 2537, 2789, - 0, 2541, 2785, - 0, 2546, 2780, - 0, 2553, 2774, - 0, 2562, 2765, - 0, 2574, 2752, - 0, 2589, 2735, - 0, 2609, 2711, - 0, 2634, 2676, - 0, 2665, 2625, - 0, 2704, 2547, - 0, 2751, 2416, - 0, 2807, 2146, - 0, 2873, 0, - 0, 2949, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3226, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2527, 2801, - 0, 2527, 2801, - 0, 2527, 2801, - 0, 2528, 2801, - 0, 2528, 2800, - 0, 2529, 2800, - 0, 2530, 2799, - 0, 2531, 2798, - 0, 2533, 2796, - 0, 2535, 2794, - 0, 2538, 2791, - 0, 2542, 2788, - 0, 2547, 2783, - 0, 2554, 2776, - 0, 2563, 2767, - 0, 2574, 2755, - 0, 2590, 2737, - 0, 2609, 2713, - 0, 2634, 2679, - 0, 2665, 2629, - 0, 2704, 2551, - 0, 2751, 2421, - 0, 2808, 2156, - 0, 2873, 0, - 0, 2949, 0, - 0, 3033, 0, - 0, 3126, 0, - 0, 3227, 0, - 0, 3333, 0, - 0, 3446, 0, - 0, 3562, 0, - 0, 3683, 0, - 0, 2527, 2804, - 0, 2528, 2804, - 0, 2528, 2804, - 0, 2528, 2804, - 0, 2529, 2803, - 0, 2529, 2803, - 0, 2530, 2802, - 0, 2532, 2801, - 0, 2533, 2799, - 0, 2536, 2797, - 0, 2538, 2794, - 0, 2542, 2791, - 0, 2548, 2786, - 0, 2554, 2779, - 0, 2563, 2770, - 0, 2575, 2758, - 0, 2590, 2741, - 0, 2610, 2717, - 0, 2635, 2683, - 0, 2666, 2633, - 0, 2705, 2556, - 0, 2752, 2428, - 0, 2808, 2168, - 0, 2874, 0, - 0, 2949, 0, - 0, 3034, 0, - 0, 3126, 0, - 0, 3227, 0, - 0, 3334, 0, - 0, 3446, 0, - 0, 3563, 0, - 0, 3683, 0, - 0, 2528, 2808, - 0, 2529, 2808, - 0, 2529, 2808, - 0, 2529, 2808, - 0, 2530, 2807, - 0, 2531, 2807, - 0, 2531, 2806, - 0, 2533, 2805, - 0, 2534, 2803, - 0, 2537, 2801, - 0, 2539, 2799, - 0, 2543, 2795, - 0, 2549, 2790, - 0, 2555, 2783, - 0, 2564, 2775, - 0, 2576, 2762, - 0, 2591, 2745, - 0, 2611, 2722, - 0, 2635, 2688, - 0, 2667, 2639, - 0, 2705, 2563, - 0, 2752, 2437, - 0, 2809, 2184, - 0, 2874, 0, - 0, 2949, 0, - 0, 3034, 0, - 0, 3127, 0, - 0, 3227, 0, - 0, 3334, 0, - 0, 3446, 0, - 0, 3563, 0, - 0, 3683, 0, - 0, 2530, 2814, - 0, 2530, 2813, - 0, 2530, 2813, - 0, 2531, 2813, - 0, 2531, 2812, - 0, 2532, 2812, - 0, 2533, 2811, - 0, 2534, 2810, - 0, 2536, 2808, - 0, 2538, 2806, - 0, 2541, 2804, - 0, 2545, 2800, - 0, 2550, 2795, - 0, 2557, 2789, - 0, 2565, 2780, - 0, 2577, 2768, - 0, 2592, 2751, - 0, 2612, 2728, - 0, 2636, 2695, - 0, 2668, 2646, - 0, 2706, 2572, - 0, 2753, 2449, - 0, 2809, 2204, - 0, 2875, 806, - 0, 2950, 0, - 0, 3034, 0, - 0, 3127, 0, - 0, 3227, 0, - 0, 3334, 0, - 0, 3446, 0, - 0, 3563, 0, - 0, 3683, 0, - 0, 2532, 2821, - 0, 2532, 2820, - 0, 2532, 2820, - 0, 2532, 2820, - 0, 2533, 2819, - 0, 2534, 2819, - 0, 2535, 2818, - 0, 2536, 2817, - 0, 2537, 2815, - 0, 2540, 2814, - 0, 2543, 2811, - 0, 2546, 2807, - 0, 2552, 2803, - 0, 2558, 2796, - 0, 2567, 2788, - 0, 2579, 2776, - 0, 2594, 2759, - 0, 2613, 2736, - 0, 2638, 2704, - 0, 2669, 2656, - 0, 2708, 2584, - 0, 2754, 2464, - 0, 2810, 2230, - 0, 2876, 1179, - 0, 2951, 0, - 0, 3035, 0, - 0, 3128, 0, - 0, 3228, 0, - 0, 3334, 0, - 0, 3446, 0, - 0, 3563, 0, - 0, 3683, 0, - 0, 2534, 2830, - 0, 2534, 2829, - 0, 2534, 2829, - 0, 2535, 2829, - 0, 2535, 2828, - 0, 2536, 2828, - 0, 2537, 2827, - 0, 2538, 2826, - 0, 2540, 2825, - 0, 2542, 2823, - 0, 2545, 2820, - 0, 2549, 2817, - 0, 2554, 2812, - 0, 2561, 2806, - 0, 2569, 2797, - 0, 2581, 2786, - 0, 2596, 2770, - 0, 2615, 2747, - 0, 2640, 2716, - 0, 2671, 2669, - 0, 2709, 2599, - 0, 2756, 2484, - 0, 2812, 2263, - 0, 2877, 1432, - 0, 2952, 0, - 0, 3036, 0, - 0, 3128, 0, - 0, 3228, 0, - 0, 3335, 0, - 0, 3447, 0, - 0, 3563, 0, - 0, 3683, 0, - 0, 2537, 2842, - 0, 2537, 2841, - 0, 2538, 2841, - 0, 2538, 2841, - 0, 2539, 2840, - 0, 2539, 2840, - 0, 2540, 2839, - 0, 2541, 2838, - 0, 2543, 2837, - 0, 2545, 2835, - 0, 2548, 2832, - 0, 2552, 2829, - 0, 2557, 2824, - 0, 2564, 2818, - 0, 2572, 2810, - 0, 2584, 2799, - 0, 2599, 2783, - 0, 2618, 2761, - 0, 2642, 2731, - 0, 2673, 2686, - 0, 2711, 2618, - 0, 2758, 2509, - 0, 2813, 2303, - 0, 2878, 1638, - 0, 2953, 0, - 0, 3037, 0, - 0, 3129, 0, - 0, 3229, 0, - 0, 3335, 0, - 0, 3447, 0, - 0, 3564, 0, - 0, 3684, 0, - 0, 2541, 2857, - 0, 2542, 2857, - 0, 2542, 2857, - 0, 2542, 2856, - 0, 2543, 2856, - 0, 2543, 2855, - 0, 2544, 2854, - 0, 2546, 2854, - 0, 2547, 2852, - 0, 2549, 2850, - 0, 2552, 2848, - 0, 2556, 2845, - 0, 2561, 2840, - 0, 2568, 2835, - 0, 2576, 2827, - 0, 2588, 2816, - 0, 2602, 2801, - 0, 2621, 2780, - 0, 2646, 2750, - 0, 2676, 2708, - 0, 2714, 2643, - 0, 2760, 2540, - 0, 2816, 2351, - 0, 2880, 1818, - 0, 2955, 0, - 0, 3038, 0, - 0, 3130, 0, - 0, 3230, 0, - 0, 3336, 0, - 0, 3448, 0, - 0, 3564, 0, - 0, 3684, 0, - 0, 2547, 2877, - 0, 2547, 2877, - 0, 2547, 2876, - 0, 2548, 2876, - 0, 2548, 2876, - 0, 2549, 2875, - 0, 2550, 2874, - 0, 2551, 2873, - 0, 2553, 2872, - 0, 2555, 2870, - 0, 2558, 2868, - 0, 2561, 2865, - 0, 2566, 2861, - 0, 2573, 2855, - 0, 2581, 2848, - 0, 2593, 2837, - 0, 2607, 2823, - 0, 2626, 2803, - 0, 2650, 2775, - 0, 2680, 2735, - 0, 2718, 2675, - 0, 2764, 2579, - 0, 2819, 2409, - 0, 2883, 1983, - 0, 2957, 0, - 0, 3040, 0, - 0, 3132, 0, - 0, 3231, 0, - 0, 3337, 0, - 0, 3449, 0, - 0, 3565, 0, - 0, 3684, 0, - 1040, 2554, 2902, - 1028, 2555, 2902, - 1011, 2555, 2902, - 986, 2555, 2901, - 952, 2556, 2901, - 901, 2556, 2900, - 823, 2557, 2900, - 692, 2558, 2899, - 422, 2560, 2898, - 0, 2562, 2896, - 0, 2565, 2894, - 0, 2569, 2891, - 0, 2573, 2887, - 0, 2580, 2882, - 0, 2588, 2875, - 0, 2599, 2865, - 0, 2614, 2851, - 0, 2632, 2833, - 0, 2656, 2806, - 0, 2686, 2769, - 0, 2723, 2713, - 0, 2768, 2627, - 0, 2823, 2476, - 0, 2887, 2139, - 0, 2960, 0, - 0, 3043, 0, - 0, 3134, 0, - 0, 3233, 0, - 0, 3338, 0, - 0, 3450, 0, - 0, 3565, 0, - 0, 3685, 0, - 2058, 2564, 2934, - 2057, 2564, 2933, - 2055, 2565, 2933, - 2053, 2565, 2933, - 2050, 2565, 2933, - 2045, 2566, 2932, - 2039, 2567, 2932, - 2032, 2568, 2931, - 2021, 2570, 2930, - 2006, 2572, 2928, - 1985, 2574, 2926, - 1956, 2578, 2923, - 1914, 2583, 2920, - 1850, 2589, 2915, - 1749, 2597, 2908, - 1564, 2608, 2899, - 1057, 2622, 2887, - 0, 2641, 2869, - 0, 2664, 2845, - 0, 2693, 2811, - 0, 2730, 2761, - 0, 2775, 2683, - 0, 2828, 2553, - 0, 2891, 2287, - 0, 2964, 0, - 0, 3046, 0, - 0, 3137, 0, - 0, 3235, 0, - 0, 3340, 0, - 0, 3451, 0, - 0, 3566, 0, - 0, 3686, 0, - 2415, 2577, 2973, - 2415, 2577, 2973, - 2414, 2577, 2972, - 2413, 2578, 2972, - 2412, 2578, 2972, - 2410, 2579, 2971, - 2407, 2580, 2971, - 2404, 2581, 2970, - 2399, 2582, 2969, - 2392, 2584, 2968, - 2384, 2587, 2966, - 2372, 2590, 2963, - 2355, 2595, 2960, - 2332, 2601, 2956, - 2300, 2609, 2949, - 2252, 2620, 2941, - 2179, 2633, 2930, - 2059, 2651, 2914, - 1824, 2674, 2892, - 744, 2703, 2862, - 0, 2739, 2817, - 0, 2783, 2749, - 0, 2835, 2639, - 0, 2898, 2431, - 0, 2969, 1756, - 0, 3050, 0, - 0, 3140, 0, - 0, 3238, 0, - 0, 3342, 0, - 0, 3453, 0, - 0, 3568, 0, - 0, 3687, 0, - 2664, 2593, 3020, - 2664, 2593, 3020, - 2663, 2594, 3020, - 2663, 2594, 3020, - 2662, 2594, 3020, - 2661, 2595, 3019, - 2659, 2596, 3019, - 2657, 2597, 3018, - 2654, 2598, 3017, - 2651, 2600, 3016, - 2646, 2603, 3014, - 2639, 2606, 3012, - 2630, 2611, 3009, - 2618, 2617, 3005, - 2601, 2624, 2999, - 2577, 2635, 2992, - 2543, 2648, 2982, - 2493, 2665, 2968, - 2416, 2687, 2949, - 2287, 2715, 2922, - 2025, 2750, 2883, - 0, 2793, 2824, - 0, 2845, 2733, - 0, 2906, 2572, - 0, 2976, 2191, - 0, 3056, 0, - 0, 3145, 0, - 0, 3242, 0, - 0, 3345, 0, - 0, 3455, 0, - 0, 3570, 0, - 0, 3688, 0, - 2867, 2614, 3077, - 2867, 2614, 3077, - 2867, 2615, 3077, - 2866, 2615, 3077, - 2866, 2615, 3076, - 2865, 2616, 3076, - 2864, 2617, 3076, - 2863, 2618, 3075, - 2861, 2619, 3074, - 2859, 2621, 3073, - 2856, 2623, 3072, - 2851, 2627, 3070, - 2846, 2631, 3067, - 2838, 2637, 3063, - 2828, 2644, 3059, - 2813, 2654, 3052, - 2793, 2667, 3043, - 2765, 2683, 3031, - 2724, 2705, 3014, - 2664, 2731, 2991, - 2567, 2765, 2958, - 2395, 2807, 2909, - 1957, 2857, 2835, - 0, 2916, 2711, - 0, 2985, 2465, - 0, 3064, 979, - 0, 3151, 0, - 0, 3247, 0, - 0, 3350, 0, - 0, 3458, 0, - 0, 3572, 0, - 0, 3690, 0, - 3046, 2641, 3143, - 3046, 2641, 3143, - 3046, 2641, 3143, - 3045, 2642, 3143, - 3045, 2642, 3143, - 3044, 2643, 3142, - 3044, 2643, 3142, - 3043, 2644, 3142, - 3042, 2646, 3141, - 3040, 2647, 3140, - 3038, 2650, 3139, - 3035, 2653, 3137, - 3032, 2657, 3135, - 3027, 2662, 3132, - 3020, 2669, 3127, - 3010, 2678, 3122, - 2997, 2691, 3114, - 2980, 2706, 3104, - 2955, 2727, 3090, - 2919, 2752, 3070, - 2867, 2785, 3042, - 2786, 2824, 3002, - 2648, 2873, 2942, - 2356, 2930, 2848, - 0, 2997, 2679, - 0, 3074, 2263, - 0, 3160, 0, - 0, 3254, 0, - 0, 3355, 0, - 0, 3463, 0, - 0, 3576, 0, - 0, 3693, 0, - 3210, 2674, 3219, - 3210, 2674, 3219, - 3210, 2675, 3219, - 3210, 2675, 3219, - 3209, 2675, 3219, - 3209, 2676, 3218, - 3209, 2677, 3218, - 3208, 2677, 3218, - 3207, 2679, 3217, - 3206, 2680, 3216, - 3205, 2682, 3215, - 3203, 2685, 3214, - 3200, 2689, 3212, - 3197, 2694, 3209, - 3192, 2701, 3206, - 3185, 2709, 3201, - 3177, 2721, 3195, - 3165, 2735, 3186, - 3148, 2754, 3174, - 3126, 2779, 3158, - 3093, 2809, 3135, - 3045, 2847, 3103, - 2973, 2893, 3055, - 2853, 2948, 2983, - 2618, 3013, 2865, - 1555, 3087, 2634, - 0, 3171, 1643, - 0, 3263, 0, - 0, 3362, 0, - 0, 3468, 0, - 0, 3580, 0, - 0, 3696, 0, - 3365, 2716, 3304, - 3365, 2716, 3304, - 3364, 2716, 3304, - 3364, 2716, 3304, - 3364, 2716, 3304, - 3364, 2717, 3303, - 3364, 2718, 3303, - 3363, 2718, 3303, - 3363, 2719, 3302, - 3362, 2721, 3302, - 3361, 2723, 3301, - 3359, 2725, 3300, - 3358, 2729, 3298, - 3355, 2734, 3296, - 3352, 2740, 3293, - 3347, 2748, 3289, - 3341, 2758, 3284, - 3333, 2772, 3277, - 3322, 2789, 3267, - 3306, 2812, 3254, - 3285, 2840, 3235, - 3254, 2876, 3210, - 3209, 2919, 3173, - 3142, 2971, 3118, - 3033, 3033, 3033, - 2828, 3104, 2887, - 2176, 3185, 2564, - 0, 3274, 0, - 0, 3372, 0, - 0, 3476, 0, - 0, 3586, 0, - 0, 3701, 0, - 3513, 2765, 3397, - 3513, 2765, 3397, - 3513, 2766, 3397, - 3513, 2766, 3397, - 3513, 2766, 3397, - 3512, 2767, 3397, - 3512, 2767, 3397, - 3512, 2768, 3396, - 3511, 2769, 3396, - 3511, 2770, 3395, - 3510, 2772, 3395, - 3509, 2774, 3394, - 3508, 2777, 3392, - 3506, 2781, 3391, - 3504, 2787, 3388, - 3500, 2794, 3385, - 3496, 2804, 3381, - 3490, 2816, 3375, - 3482, 2832, 3367, - 3471, 2852, 3357, - 3457, 2878, 3342, - 3436, 2911, 3322, - 3406, 2951, 3293, - 3364, 3000, 3252, - 3300, 3058, 3190, - 3198, 3126, 3092, - 3011, 3203, 2914, - 2491, 3289, 2450, - 0, 3384, 0, - 0, 3486, 0, - 0, 3594, 0, - 0, 3707, 0, - 3657, 2824, 3498, - 3657, 2824, 3498, - 3657, 2825, 3498, - 3657, 2825, 3498, - 3656, 2825, 3498, - 3656, 2825, 3498, - 3656, 2826, 3497, - 3656, 2827, 3497, - 3656, 2827, 3497, - 3655, 2829, 3497, - 3655, 2830, 3496, - 3654, 2832, 3495, - 3653, 2835, 3494, - 3652, 2839, 3493, - 3650, 2843, 3491, - 3648, 2850, 3488, - 3645, 2858, 3485, - 3640, 2869, 3480, - 3635, 2883, 3474, - 3627, 2902, 3466, - 3616, 2925, 3454, - 3602, 2955, 3439, - 3582, 2992, 3417, - 3553, 3036, 3386, - 3512, 3090, 3340, - 3451, 3154, 3272, - 3353, 3227, 3160, - 3177, 3309, 2949, - 2723, 3400, 2233, - 0, 3498, 0, - 0, 3604, 0, - 0, 3715, 0, - 3797, 2893, 3605, - 3797, 2893, 3605, - 3797, 2893, 3605, - 3797, 2893, 3605, - 3797, 2894, 3605, - 3797, 2894, 3605, - 3797, 2894, 3605, - 3797, 2895, 3605, - 3797, 2896, 3604, - 3796, 2897, 3604, - 3796, 2898, 3604, - 3795, 2900, 3603, - 3795, 2902, 3602, - 3794, 2905, 3601, - 3792, 2909, 3600, - 3791, 2915, 3598, - 3788, 2922, 3595, - 3785, 2932, 3591, - 3781, 2944, 3587, - 3776, 2960, 3580, - 3768, 2981, 3571, - 3758, 3007, 3559, - 3744, 3040, 3542, - 3724, 3081, 3519, - 3696, 3130, 3486, - 3656, 3188, 3437, - 3596, 3256, 3362, - 3502, 3334, 3238, - 3333, 3420, 2991, - 2918, 3515, 1456, - 0, 3617, 0, - 0, 3725, 0, - 3936, 2971, 3718, - 3936, 2971, 3718, - 3936, 2971, 3718, - 3936, 2971, 3718, - 3936, 2972, 3718, - 3936, 2972, 3717, - 3935, 2972, 3717, - 3935, 2973, 3717, - 3935, 2973, 3717, - 3935, 2974, 3717, - 3935, 2975, 3716, - 3934, 2977, 3716, - 3934, 2979, 3715, - 3933, 2981, 3714, - 3932, 2985, 3713, - 3931, 2990, 3712, - 3929, 2996, 3710, - 3927, 3004, 3707, - 3924, 3015, 3703, - 3920, 3028, 3698, - 3914, 3046, 3691, - 3907, 3069, 3682, - 3897, 3098, 3669, - 3883, 3134, 3652, - 3863, 3178, 3627, - 3836, 3231, 3592, - 3797, 3293, 3540, - 3738, 3365, 3460, - 3646, 3446, 3325, - 3483, 3536, 3042, - 3092, 3634, 0, - 0, 3738, 0, - 4073, 3058, 3835, - 4073, 3058, 3835, - 4072, 3058, 3835, - 4072, 3058, 3835, - 4072, 3059, 3834, - 4072, 3059, 3834, - 4072, 3059, 3834, - 4072, 3059, 3834, - 4072, 3060, 3834, - 4072, 3061, 3834, - 4072, 3062, 3834, - 4071, 3063, 3833, - 4071, 3064, 3833, - 4071, 3067, 3832, - 4070, 3070, 3831, - 4069, 3073, 3830, - 4068, 3079, 3828, - 4066, 3085, 3826, - 4064, 3094, 3823, - 4061, 3106, 3820, - 4057, 3121, 3814, - 4051, 3140, 3807, - 4044, 3165, 3798, - 4034, 3196, 3784, - 4020, 3235, 3766, - 4001, 3282, 3741, - 3974, 3338, 3704, - 3935, 3404, 3650, - 3877, 3479, 3565, - 3787, 3563, 3420, - 3627, 3656, 3103, - 3253, 3756, 0, - 4095, 3153, 3955, - 4095, 3153, 3955, - 4095, 3153, 3955, - 4095, 3154, 3955, - 4095, 3154, 3955, - 4095, 3154, 3955, - 4095, 3154, 3955, - 4095, 3154, 3955, - 4095, 3155, 3955, - 4095, 3155, 3954, - 4095, 3156, 3954, - 4095, 3157, 3954, - 4095, 3159, 3954, - 4095, 3160, 3953, - 4095, 3163, 3952, - 4095, 3166, 3951, - 4095, 3170, 3950, - 4095, 3176, 3949, - 4095, 3183, 3946, - 4095, 3192, 3943, - 4095, 3205, 3940, - 4095, 3221, 3934, - 4095, 3242, 3927, - 4095, 3269, 3917, - 4095, 3302, 3903, - 4095, 3342, 3885, - 4095, 3392, 3858, - 4095, 3451, 3820, - 4072, 3519, 3764, - 4015, 3596, 3676, - 3925, 3683, 3522, - 3768, 3778, 3173, - 4095, 3256, 4078, - 4095, 3256, 4078, - 4095, 3256, 4078, - 4095, 3256, 4078, - 4095, 3256, 4078, - 4095, 3256, 4078, - 4095, 3256, 4078, - 4095, 3257, 4078, - 4095, 3257, 4078, - 4095, 3257, 4078, - 4095, 3258, 4078, - 4095, 3259, 4077, - 4095, 3260, 4077, - 4095, 3261, 4077, - 4095, 3263, 4076, - 4095, 3266, 4075, - 4095, 3269, 4075, - 4095, 3274, 4073, - 4095, 3280, 4072, - 4095, 3287, 4069, - 4095, 3297, 4066, - 4095, 3311, 4062, - 4095, 3328, 4057, - 4095, 3350, 4049, - 4095, 3378, 4039, - 4095, 3413, 4025, - 4095, 3455, 4006, - 4095, 3507, 3979, - 4095, 3567, 3940, - 4095, 3638, 3882, - 4095, 3718, 3791, - 4062, 3806, 3631, - 0, 2656, 2925, - 0, 2657, 2925, - 0, 2657, 2925, - 0, 2657, 2925, - 0, 2658, 2924, - 0, 2658, 2924, - 0, 2659, 2923, - 0, 2660, 2923, - 0, 2661, 2921, - 0, 2663, 2920, - 0, 2665, 2918, - 0, 2668, 2915, - 0, 2672, 2911, - 0, 2677, 2906, - 0, 2684, 2899, - 0, 2693, 2890, - 0, 2705, 2878, - 0, 2720, 2860, - 0, 2739, 2835, - 0, 2764, 2800, - 0, 2796, 2749, - 0, 2835, 2669, - 0, 2882, 2534, - 0, 2939, 2253, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2657, 2926, - 0, 2657, 2926, - 0, 2657, 2925, - 0, 2657, 2925, - 0, 2658, 2925, - 0, 2658, 2924, - 0, 2659, 2924, - 0, 2660, 2923, - 0, 2661, 2922, - 0, 2663, 2920, - 0, 2665, 2918, - 0, 2668, 2915, - 0, 2672, 2912, - 0, 2677, 2907, - 0, 2684, 2900, - 0, 2693, 2890, - 0, 2705, 2878, - 0, 2720, 2860, - 0, 2739, 2836, - 0, 2765, 2801, - 0, 2796, 2749, - 0, 2835, 2669, - 0, 2882, 2535, - 0, 2939, 2254, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2657, 2926, - 0, 2657, 2926, - 0, 2657, 2926, - 0, 2657, 2925, - 0, 2658, 2925, - 0, 2658, 2925, - 0, 2659, 2924, - 0, 2660, 2923, - 0, 2661, 2922, - 0, 2663, 2920, - 0, 2665, 2918, - 0, 2668, 2916, - 0, 2672, 2912, - 0, 2677, 2907, - 0, 2684, 2900, - 0, 2693, 2891, - 0, 2705, 2878, - 0, 2720, 2861, - 0, 2740, 2836, - 0, 2765, 2801, - 0, 2796, 2749, - 0, 2835, 2670, - 0, 2882, 2535, - 0, 2939, 2255, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2657, 2926, - 0, 2657, 2926, - 0, 2657, 2926, - 0, 2657, 2926, - 0, 2658, 2925, - 0, 2658, 2925, - 0, 2659, 2924, - 0, 2660, 2923, - 0, 2661, 2922, - 0, 2663, 2921, - 0, 2665, 2919, - 0, 2668, 2916, - 0, 2672, 2912, - 0, 2677, 2907, - 0, 2684, 2900, - 0, 2693, 2891, - 0, 2705, 2879, - 0, 2720, 2861, - 0, 2740, 2836, - 0, 2765, 2801, - 0, 2796, 2750, - 0, 2835, 2670, - 0, 2882, 2536, - 0, 2939, 2257, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2657, 2927, - 0, 2657, 2927, - 0, 2657, 2927, - 0, 2657, 2926, - 0, 2658, 2926, - 0, 2658, 2925, - 0, 2659, 2925, - 0, 2660, 2924, - 0, 2661, 2923, - 0, 2663, 2921, - 0, 2665, 2919, - 0, 2668, 2917, - 0, 2672, 2913, - 0, 2677, 2908, - 0, 2684, 2901, - 0, 2693, 2892, - 0, 2705, 2879, - 0, 2720, 2862, - 0, 2740, 2837, - 0, 2765, 2802, - 0, 2796, 2751, - 0, 2835, 2671, - 0, 2882, 2537, - 0, 2939, 2259, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2657, 2928, - 0, 2657, 2927, - 0, 2657, 2927, - 0, 2658, 2927, - 0, 2658, 2927, - 0, 2659, 2926, - 0, 2659, 2926, - 0, 2660, 2925, - 0, 2661, 2924, - 0, 2663, 2922, - 0, 2665, 2920, - 0, 2668, 2917, - 0, 2672, 2914, - 0, 2677, 2909, - 0, 2684, 2902, - 0, 2693, 2893, - 0, 2705, 2880, - 0, 2720, 2862, - 0, 2740, 2838, - 0, 2765, 2803, - 0, 2796, 2752, - 0, 2835, 2673, - 0, 2882, 2539, - 0, 2939, 2262, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2657, 2929, - 0, 2657, 2928, - 0, 2658, 2928, - 0, 2658, 2928, - 0, 2658, 2928, - 0, 2659, 2927, - 0, 2660, 2926, - 0, 2660, 2926, - 0, 2662, 2925, - 0, 2663, 2923, - 0, 2666, 2921, - 0, 2669, 2918, - 0, 2672, 2915, - 0, 2678, 2910, - 0, 2684, 2903, - 0, 2693, 2894, - 0, 2705, 2881, - 0, 2720, 2864, - 0, 2740, 2839, - 0, 2765, 2804, - 0, 2796, 2753, - 0, 2835, 2674, - 0, 2883, 2541, - 0, 2939, 2266, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2658, 2930, - 0, 2658, 2930, - 0, 2658, 2929, - 0, 2658, 2929, - 0, 2659, 2929, - 0, 2659, 2928, - 0, 2660, 2928, - 0, 2661, 2927, - 0, 2662, 2926, - 0, 2664, 2924, - 0, 2666, 2922, - 0, 2669, 2919, - 0, 2673, 2916, - 0, 2678, 2911, - 0, 2685, 2904, - 0, 2694, 2895, - 0, 2706, 2882, - 0, 2721, 2865, - 0, 2740, 2841, - 0, 2765, 2806, - 0, 2797, 2755, - 0, 2836, 2676, - 0, 2883, 2544, - 0, 2939, 2271, - 0, 3005, 0, - 0, 3080, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3358, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2658, 2931, - 0, 2658, 2931, - 0, 2658, 2931, - 0, 2659, 2931, - 0, 2659, 2931, - 0, 2660, 2930, - 0, 2660, 2929, - 0, 2661, 2929, - 0, 2662, 2927, - 0, 2664, 2926, - 0, 2666, 2924, - 0, 2669, 2921, - 0, 2673, 2918, - 0, 2678, 2913, - 0, 2685, 2906, - 0, 2694, 2897, - 0, 2706, 2884, - 0, 2721, 2867, - 0, 2741, 2843, - 0, 2766, 2808, - 0, 2797, 2757, - 0, 2836, 2679, - 0, 2883, 2548, - 0, 2939, 2279, - 0, 3005, 0, - 0, 3081, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3359, 0, - 0, 3465, 0, - 0, 3578, 0, - 0, 3694, 0, - 0, 2659, 2934, - 0, 2659, 2934, - 0, 2659, 2933, - 0, 2659, 2933, - 0, 2660, 2933, - 0, 2660, 2932, - 0, 2661, 2932, - 0, 2662, 2931, - 0, 2663, 2930, - 0, 2665, 2928, - 0, 2667, 2926, - 0, 2670, 2924, - 0, 2674, 2920, - 0, 2679, 2915, - 0, 2686, 2908, - 0, 2695, 2899, - 0, 2706, 2887, - 0, 2722, 2870, - 0, 2741, 2845, - 0, 2766, 2811, - 0, 2797, 2761, - 0, 2836, 2683, - 0, 2883, 2553, - 0, 2940, 2288, - 0, 3006, 0, - 0, 3081, 0, - 0, 3165, 0, - 0, 3258, 0, - 0, 3359, 0, - 0, 3466, 0, - 0, 3578, 0, - 0, 3695, 0, - 0, 2659, 2937, - 0, 2659, 2937, - 0, 2660, 2936, - 0, 2660, 2936, - 0, 2660, 2936, - 0, 2661, 2935, - 0, 2662, 2935, - 0, 2663, 2934, - 0, 2664, 2933, - 0, 2665, 2931, - 0, 2668, 2929, - 0, 2671, 2927, - 0, 2674, 2923, - 0, 2680, 2918, - 0, 2686, 2911, - 0, 2695, 2902, - 0, 2707, 2890, - 0, 2722, 2873, - 0, 2742, 2849, - 0, 2767, 2815, - 0, 2798, 2765, - 0, 2837, 2688, - 0, 2884, 2560, - 0, 2940, 2300, - 0, 3006, 0, - 0, 3081, 0, - 0, 3166, 0, - 0, 3258, 0, - 0, 3359, 0, - 0, 3466, 0, - 0, 3578, 0, - 0, 3695, 0, - 0, 2660, 2941, - 0, 2660, 2941, - 0, 2661, 2940, - 0, 2661, 2940, - 0, 2661, 2940, - 0, 2662, 2939, - 0, 2663, 2939, - 0, 2664, 2938, - 0, 2665, 2937, - 0, 2666, 2935, - 0, 2669, 2933, - 0, 2672, 2931, - 0, 2675, 2927, - 0, 2681, 2922, - 0, 2687, 2916, - 0, 2696, 2907, - 0, 2708, 2894, - 0, 2723, 2877, - 0, 2743, 2854, - 0, 2768, 2820, - 0, 2799, 2771, - 0, 2837, 2695, - 0, 2885, 2569, - 0, 2941, 2316, - 0, 3006, 0, - 0, 3082, 0, - 0, 3166, 0, - 0, 3259, 0, - 0, 3359, 0, - 0, 3466, 0, - 0, 3578, 0, - 0, 3695, 0, - 0, 2662, 2946, - 0, 2662, 2946, - 0, 2662, 2946, - 0, 2662, 2945, - 0, 2663, 2945, - 0, 2663, 2945, - 0, 2664, 2944, - 0, 2665, 2943, - 0, 2666, 2942, - 0, 2668, 2941, - 0, 2670, 2939, - 0, 2673, 2936, - 0, 2677, 2932, - 0, 2682, 2928, - 0, 2689, 2921, - 0, 2698, 2912, - 0, 2709, 2900, - 0, 2724, 2883, - 0, 2744, 2860, - 0, 2769, 2827, - 0, 2800, 2778, - 0, 2838, 2704, - 0, 2885, 2581, - 0, 2941, 2336, - 0, 3007, 938, - 0, 3082, 0, - 0, 3166, 0, - 0, 3259, 0, - 0, 3359, 0, - 0, 3466, 0, - 0, 3578, 0, - 0, 3695, 0, - 0, 2663, 2953, - 0, 2664, 2953, - 0, 2664, 2952, - 0, 2664, 2952, - 0, 2665, 2952, - 0, 2665, 2951, - 0, 2666, 2951, - 0, 2667, 2950, - 0, 2668, 2949, - 0, 2670, 2948, - 0, 2672, 2946, - 0, 2675, 2943, - 0, 2679, 2940, - 0, 2684, 2935, - 0, 2690, 2928, - 0, 2699, 2920, - 0, 2711, 2908, - 0, 2726, 2891, - 0, 2745, 2868, - 0, 2770, 2836, - 0, 2801, 2788, - 0, 2840, 2716, - 0, 2886, 2596, - 0, 2942, 2362, - 0, 3008, 1311, - 0, 3083, 0, - 0, 3167, 0, - 0, 3260, 0, - 0, 3360, 0, - 0, 3466, 0, - 0, 3579, 0, - 0, 3695, 0, - 0, 2666, 2962, - 0, 2666, 2962, - 0, 2666, 2962, - 0, 2667, 2961, - 0, 2667, 2961, - 0, 2667, 2961, - 0, 2668, 2960, - 0, 2669, 2959, - 0, 2670, 2958, - 0, 2672, 2957, - 0, 2674, 2955, - 0, 2677, 2952, - 0, 2681, 2949, - 0, 2686, 2944, - 0, 2693, 2938, - 0, 2701, 2929, - 0, 2713, 2918, - 0, 2728, 2902, - 0, 2747, 2879, - 0, 2772, 2848, - 0, 2803, 2801, - 0, 2841, 2731, - 0, 2888, 2616, - 0, 2944, 2395, - 0, 3009, 1565, - 0, 3084, 0, - 0, 3168, 0, - 0, 3260, 0, - 0, 3360, 0, - 0, 3467, 0, - 0, 3579, 0, - 0, 3695, 0, - 0, 2669, 2974, - 0, 2669, 2974, - 0, 2669, 2973, - 0, 2670, 2973, - 0, 2670, 2973, - 0, 2671, 2972, - 0, 2671, 2972, - 0, 2672, 2971, - 0, 2673, 2970, - 0, 2675, 2969, - 0, 2677, 2967, - 0, 2680, 2964, - 0, 2684, 2961, - 0, 2689, 2957, - 0, 2696, 2950, - 0, 2704, 2942, - 0, 2716, 2931, - 0, 2731, 2915, - 0, 2750, 2894, - 0, 2774, 2863, - 0, 2805, 2818, - 0, 2843, 2751, - 0, 2890, 2641, - 0, 2945, 2435, - 0, 3010, 1770, - 0, 3085, 0, - 0, 3169, 0, - 0, 3261, 0, - 0, 3361, 0, - 0, 3467, 0, - 0, 3579, 0, - 0, 3696, 0, - 0, 2673, 2989, - 0, 2673, 2989, - 0, 2674, 2989, - 0, 2674, 2989, - 0, 2674, 2988, - 0, 2675, 2988, - 0, 2676, 2987, - 0, 2676, 2987, - 0, 2678, 2986, - 0, 2679, 2984, - 0, 2681, 2982, - 0, 2684, 2980, - 0, 2688, 2977, - 0, 2693, 2973, - 0, 2700, 2967, - 0, 2708, 2959, - 0, 2720, 2948, - 0, 2735, 2933, - 0, 2754, 2912, - 0, 2778, 2882, - 0, 2808, 2840, - 0, 2846, 2775, - 0, 2893, 2672, - 0, 2948, 2483, - 0, 3013, 1950, - 0, 3087, 0, - 0, 3170, 0, - 0, 3262, 0, - 0, 3362, 0, - 0, 3468, 0, - 0, 3580, 0, - 0, 3696, 0, - 0, 2679, 3009, - 0, 2679, 3009, - 0, 2679, 3009, - 0, 2680, 3008, - 0, 2680, 3008, - 0, 2680, 3008, - 0, 2681, 3007, - 0, 2682, 3007, - 0, 2683, 3006, - 0, 2685, 3004, - 0, 2687, 3003, - 0, 2690, 3000, - 0, 2693, 2997, - 0, 2698, 2993, - 0, 2705, 2987, - 0, 2714, 2980, - 0, 2725, 2969, - 0, 2739, 2955, - 0, 2758, 2935, - 0, 2782, 2907, - 0, 2813, 2867, - 0, 2850, 2807, - 0, 2896, 2711, - 0, 2951, 2541, - 0, 3015, 2115, - 0, 3089, 0, - 0, 3172, 0, - 0, 3264, 0, - 0, 3363, 0, - 0, 3469, 0, - 0, 3581, 0, - 0, 3697, 0, - 1182, 2686, 3034, - 1173, 2686, 3034, - 1160, 2687, 3034, - 1143, 2687, 3034, - 1119, 2687, 3033, - 1084, 2688, 3033, - 1033, 2688, 3033, - 955, 2689, 3032, - 824, 2691, 3031, - 554, 2692, 3030, - 0, 2694, 3028, - 0, 2697, 3026, - 0, 2701, 3023, - 0, 2706, 3019, - 0, 2712, 3014, - 0, 2720, 3007, - 0, 2731, 2997, - 0, 2746, 2983, - 0, 2764, 2965, - 0, 2788, 2939, - 0, 2818, 2901, - 0, 2855, 2846, - 0, 2901, 2759, - 0, 2955, 2608, - 0, 3019, 2271, - 0, 3092, 0, - 0, 3175, 0, - 0, 3266, 0, - 0, 3365, 0, - 0, 3470, 0, - 0, 3582, 0, - 0, 3697, 0, - 2191, 2696, 3066, - 2190, 2696, 3066, - 2189, 2696, 3066, - 2187, 2697, 3065, - 2185, 2697, 3065, - 2182, 2698, 3065, - 2177, 2698, 3064, - 2172, 2699, 3064, - 2164, 2700, 3063, - 2153, 2702, 3062, - 2138, 2704, 3060, - 2117, 2706, 3058, - 2088, 2710, 3055, - 2046, 2715, 3052, - 1983, 2721, 3047, - 1881, 2729, 3040, - 1696, 2740, 3031, - 1189, 2754, 3019, - 0, 2773, 3001, - 0, 2796, 2977, - 0, 2825, 2943, - 0, 2862, 2893, - 0, 2907, 2815, - 0, 2960, 2685, - 0, 3023, 2419, - 0, 3096, 0, - 0, 3178, 0, - 0, 3269, 0, - 0, 3367, 0, - 0, 3472, 0, - 0, 3583, 0, - 0, 3699, 0, - 2548, 2709, 3105, - 2548, 2709, 3105, - 2547, 2709, 3105, - 2546, 2709, 3105, - 2545, 2710, 3104, - 2544, 2710, 3104, - 2542, 2711, 3104, - 2539, 2712, 3103, - 2536, 2713, 3102, - 2531, 2714, 3101, - 2524, 2716, 3100, - 2516, 2719, 3098, - 2504, 2722, 3095, - 2487, 2727, 3092, - 2464, 2733, 3088, - 2432, 2741, 3082, - 2384, 2752, 3073, - 2311, 2766, 3062, - 2191, 2783, 3046, - 1956, 2806, 3025, - 876, 2835, 2994, - 0, 2871, 2949, - 0, 2915, 2881, - 0, 2967, 2771, - 0, 3030, 2564, - 0, 3101, 1888, - 0, 3182, 0, - 0, 3272, 0, - 0, 3370, 0, - 0, 3474, 0, - 0, 3585, 0, - 0, 3700, 0, - 2796, 2725, 3153, - 2796, 2725, 3152, - 2796, 2725, 3152, - 2795, 2726, 3152, - 2795, 2726, 3152, - 2794, 2726, 3152, - 2793, 2727, 3151, - 2791, 2728, 3151, - 2789, 2729, 3150, - 2787, 2730, 3149, - 2783, 2732, 3148, - 2778, 2735, 3146, - 2771, 2738, 3144, - 2762, 2743, 3141, - 2750, 2749, 3137, - 2733, 2756, 3131, - 2709, 2767, 3124, - 2675, 2780, 3114, - 2625, 2797, 3100, - 2548, 2819, 3081, - 2419, 2847, 3054, - 2157, 2882, 3015, - 0, 2925, 2957, - 0, 2977, 2865, - 0, 3038, 2704, - 0, 3108, 2323, - 0, 3188, 0, - 0, 3277, 0, - 0, 3374, 0, - 0, 3478, 0, - 0, 3587, 0, - 0, 3702, 0, - 2999, 2746, 3209, - 2999, 2746, 3209, - 2999, 2746, 3209, - 2999, 2747, 3209, - 2998, 2747, 3209, - 2998, 2747, 3209, - 2997, 2748, 3208, - 2996, 2749, 3208, - 2995, 2750, 3207, - 2993, 2751, 3206, - 2991, 2753, 3205, - 2988, 2755, 3204, - 2984, 2759, 3202, - 2978, 2763, 3199, - 2970, 2769, 3196, - 2960, 2776, 3191, - 2945, 2786, 3184, - 2925, 2799, 3175, - 2897, 2815, 3163, - 2857, 2837, 3147, - 2796, 2864, 3123, - 2699, 2897, 3090, - 2527, 2939, 3041, - 2089, 2989, 2967, - 0, 3048, 2843, - 0, 3118, 2597, - 0, 3196, 1111, - 0, 3283, 0, - 0, 3379, 0, - 0, 3482, 0, - 0, 3590, 0, - 0, 3704, 0, - 3178, 2773, 3276, - 3178, 2773, 3275, - 3178, 2773, 3275, - 3178, 2773, 3275, - 3177, 2774, 3275, - 3177, 2774, 3275, - 3177, 2775, 3275, - 3176, 2775, 3274, - 3175, 2776, 3274, - 3174, 2778, 3273, - 3172, 2779, 3272, - 3170, 2782, 3271, - 3167, 2785, 3269, - 3164, 2789, 3267, - 3159, 2794, 3264, - 3152, 2801, 3260, - 3142, 2811, 3254, - 3130, 2823, 3246, - 3112, 2838, 3236, - 3087, 2859, 3222, - 3051, 2884, 3202, - 2999, 2917, 3174, - 2918, 2956, 3134, - 2780, 3005, 3074, - 2488, 3062, 2980, - 0, 3130, 2811, - 0, 3206, 2395, - 0, 3292, 0, - 0, 3386, 0, - 0, 3487, 0, - 0, 3595, 0, - 0, 3708, 0, - 3342, 2806, 3351, - 3342, 2806, 3351, - 3342, 2807, 3351, - 3342, 2807, 3351, - 3342, 2807, 3351, - 3341, 2807, 3351, - 3341, 2808, 3350, - 3341, 2809, 3350, - 3340, 2810, 3350, - 3339, 2811, 3349, - 3338, 2812, 3348, - 3337, 2814, 3347, - 3335, 2817, 3346, - 3332, 2821, 3344, - 3329, 2826, 3341, - 3324, 2833, 3338, - 3318, 2841, 3333, - 3309, 2853, 3327, - 3297, 2867, 3318, - 3281, 2886, 3306, - 3258, 2911, 3290, - 3225, 2941, 3267, - 3177, 2979, 3235, - 3105, 3025, 3187, - 2985, 3080, 3115, - 2750, 3145, 2997, - 1687, 3219, 2766, - 0, 3303, 1775, - 0, 3395, 0, - 0, 3494, 0, - 0, 3600, 0, - 0, 3712, 0, - 3497, 2847, 3436, - 3497, 2848, 3436, - 3497, 2848, 3436, - 3497, 2848, 3436, - 3496, 2848, 3436, - 3496, 2849, 3436, - 3496, 2849, 3436, - 3496, 2850, 3435, - 3495, 2850, 3435, - 3495, 2852, 3434, - 3494, 2853, 3434, - 3493, 2855, 3433, - 3492, 2858, 3432, - 3490, 2861, 3430, - 3487, 2866, 3428, - 3484, 2872, 3425, - 3479, 2880, 3421, - 3473, 2890, 3416, - 3465, 2904, 3409, - 3454, 2921, 3399, - 3438, 2944, 3386, - 3417, 2972, 3368, - 3386, 3008, 3342, - 3341, 3051, 3305, - 3274, 3103, 3250, - 3165, 3165, 3165, - 2960, 3236, 3019, - 2308, 3317, 2696, - 0, 3406, 0, - 0, 3504, 0, - 0, 3608, 0, - 0, 3718, 0, - 3645, 2897, 3529, - 3645, 2897, 3529, - 3645, 2898, 3529, - 3645, 2898, 3529, - 3645, 2898, 3529, - 3645, 2898, 3529, - 3644, 2899, 3529, - 3644, 2899, 3529, - 3644, 2900, 3528, - 3644, 2901, 3528, - 3643, 2902, 3527, - 3642, 2904, 3527, - 3641, 2906, 3526, - 3640, 2909, 3524, - 3638, 2914, 3523, - 3636, 2919, 3520, - 3633, 2926, 3517, - 3628, 2936, 3513, - 3622, 2948, 3507, - 3614, 2964, 3500, - 3604, 2984, 3489, - 3589, 3011, 3474, - 3568, 3043, 3454, - 3539, 3084, 3426, - 3496, 3132, 3384, - 3432, 3191, 3322, - 3330, 3258, 3224, - 3143, 3335, 3046, - 2623, 3421, 2582, - 0, 3516, 0, - 0, 3618, 0, - 0, 3726, 0, - 3789, 2956, 3630, - 3789, 2956, 3630, - 3789, 2957, 3630, - 3789, 2957, 3630, - 3789, 2957, 3630, - 3789, 2957, 3630, - 3788, 2958, 3630, - 3788, 2958, 3630, - 3788, 2959, 3629, - 3788, 2960, 3629, - 3787, 2961, 3629, - 3787, 2962, 3628, - 3786, 2964, 3627, - 3785, 2967, 3626, - 3784, 2971, 3625, - 3782, 2976, 3623, - 3780, 2982, 3620, - 3777, 2990, 3617, - 3772, 3001, 3613, - 3767, 3015, 3606, - 3759, 3034, 3598, - 3748, 3057, 3587, - 3734, 3087, 3571, - 3714, 3124, 3549, - 3685, 3169, 3518, - 3644, 3222, 3473, - 3583, 3286, 3404, - 3485, 3359, 3292, - 3309, 3441, 3081, - 2855, 3532, 2365, - 0, 3630, 0, - 0, 3736, 0, - 3929, 3025, 3737, - 3929, 3025, 3737, - 3929, 3025, 3737, - 3929, 3025, 3737, - 3929, 3026, 3737, - 3929, 3026, 3737, - 3929, 3026, 3737, - 3929, 3026, 3737, - 3929, 3027, 3737, - 3929, 3028, 3736, - 3928, 3029, 3736, - 3928, 3030, 3736, - 3927, 3032, 3735, - 3927, 3034, 3734, - 3926, 3037, 3733, - 3925, 3042, 3732, - 3923, 3047, 3730, - 3921, 3054, 3727, - 3918, 3064, 3723, - 3913, 3076, 3719, - 3908, 3092, 3712, - 3900, 3113, 3703, - 3890, 3139, 3691, - 3876, 3172, 3674, - 3856, 3213, 3651, - 3828, 3262, 3618, - 3788, 3320, 3569, - 3728, 3388, 3494, - 3634, 3466, 3370, - 3465, 3552, 3123, - 3050, 3647, 1588, - 0, 3749, 0, - 4068, 3103, 3850, - 4068, 3103, 3850, - 4068, 3103, 3850, - 4068, 3103, 3850, - 4068, 3104, 3850, - 4068, 3104, 3850, - 4068, 3104, 3850, - 4068, 3104, 3849, - 4067, 3105, 3849, - 4067, 3105, 3849, - 4067, 3106, 3849, - 4067, 3107, 3849, - 4066, 3109, 3848, - 4066, 3111, 3847, - 4065, 3114, 3847, - 4064, 3117, 3845, - 4063, 3122, 3844, - 4061, 3128, 3842, - 4059, 3136, 3839, - 4056, 3147, 3835, - 4052, 3160, 3830, - 4046, 3178, 3823, - 4039, 3201, 3814, - 4029, 3230, 3801, - 4015, 3266, 3784, - 3995, 3310, 3759, - 3968, 3363, 3724, - 3929, 3425, 3672, - 3870, 3497, 3592, - 3778, 3578, 3457, - 3615, 3668, 3174, - 3224, 3766, 0, - 4095, 3190, 3967, - 4095, 3190, 3967, - 4095, 3190, 3967, - 4095, 3190, 3967, - 4095, 3191, 3967, - 4095, 3191, 3967, - 4095, 3191, 3967, - 4095, 3191, 3966, - 4095, 3192, 3966, - 4095, 3192, 3966, - 4095, 3193, 3966, - 4095, 3194, 3966, - 4095, 3195, 3965, - 4095, 3197, 3965, - 4095, 3199, 3964, - 4095, 3202, 3963, - 4095, 3206, 3962, - 4095, 3211, 3961, - 4095, 3217, 3958, - 4095, 3226, 3956, - 4095, 3238, 3952, - 4095, 3253, 3946, - 4095, 3273, 3939, - 4095, 3297, 3930, - 4095, 3328, 3917, - 4095, 3367, 3898, - 4095, 3414, 3873, - 4095, 3470, 3836, - 4067, 3536, 3782, - 4009, 3611, 3697, - 3919, 3695, 3552, - 3759, 3788, 3235, - 4095, 3285, 4087, - 4095, 3285, 4087, - 4095, 3286, 4087, - 4095, 3286, 4087, - 4095, 3286, 4087, - 4095, 3286, 4087, - 4095, 3286, 4087, - 4095, 3286, 4087, - 4095, 3287, 4087, - 4095, 3287, 4087, - 4095, 3288, 4087, - 4095, 3288, 4086, - 4095, 3289, 4086, - 4095, 3291, 4086, - 4095, 3292, 4085, - 4095, 3295, 4084, - 4095, 3298, 4084, - 4095, 3302, 4082, - 4095, 3308, 4081, - 4095, 3315, 4079, - 4095, 3325, 4076, - 4095, 3337, 4072, - 4095, 3353, 4066, - 4095, 3374, 4059, - 4095, 3401, 4049, - 4095, 3434, 4036, - 4095, 3475, 4017, - 4095, 3524, 3990, - 4095, 3583, 3952, - 4095, 3651, 3896, - 4095, 3729, 3808, - 4057, 3815, 3655, - 0, 2788, 3057, - 0, 2789, 3057, - 0, 2789, 3057, - 0, 2789, 3057, - 0, 2789, 3057, - 0, 2790, 3056, - 0, 2790, 3056, - 0, 2791, 3055, - 0, 2792, 3054, - 0, 2793, 3053, - 0, 2795, 3052, - 0, 2797, 3050, - 0, 2800, 3047, - 0, 2804, 3043, - 0, 2809, 3038, - 0, 2816, 3031, - 0, 2825, 3022, - 0, 2837, 3009, - 0, 2852, 2992, - 0, 2872, 2967, - 0, 2897, 2932, - 0, 2928, 2880, - 0, 2967, 2801, - 0, 3014, 2666, - 0, 3071, 2384, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2788, 3058, - 0, 2789, 3058, - 0, 2789, 3057, - 0, 2789, 3057, - 0, 2789, 3057, - 0, 2790, 3057, - 0, 2790, 3056, - 0, 2791, 3055, - 0, 2792, 3055, - 0, 2793, 3053, - 0, 2795, 3052, - 0, 2797, 3050, - 0, 2800, 3047, - 0, 2804, 3043, - 0, 2809, 3038, - 0, 2816, 3032, - 0, 2825, 3022, - 0, 2837, 3010, - 0, 2852, 2992, - 0, 2872, 2967, - 0, 2897, 2932, - 0, 2928, 2881, - 0, 2967, 2801, - 0, 3014, 2666, - 0, 3071, 2385, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2788, 3058, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2789, 3057, - 0, 2789, 3057, - 0, 2790, 3057, - 0, 2790, 3056, - 0, 2791, 3056, - 0, 2792, 3055, - 0, 2793, 3054, - 0, 2795, 3052, - 0, 2797, 3050, - 0, 2800, 3047, - 0, 2804, 3044, - 0, 2809, 3039, - 0, 2816, 3032, - 0, 2825, 3023, - 0, 2837, 3010, - 0, 2852, 2992, - 0, 2872, 2968, - 0, 2897, 2933, - 0, 2928, 2881, - 0, 2967, 2801, - 0, 3014, 2667, - 0, 3071, 2386, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2789, 3057, - 0, 2790, 3057, - 0, 2790, 3057, - 0, 2791, 3056, - 0, 2792, 3055, - 0, 2793, 3054, - 0, 2795, 3052, - 0, 2797, 3050, - 0, 2800, 3048, - 0, 2804, 3044, - 0, 2809, 3039, - 0, 2816, 3032, - 0, 2825, 3023, - 0, 2837, 3010, - 0, 2852, 2993, - 0, 2872, 2968, - 0, 2897, 2933, - 0, 2928, 2881, - 0, 2967, 2802, - 0, 3014, 2667, - 0, 3071, 2387, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2789, 3059, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2789, 3058, - 0, 2790, 3058, - 0, 2790, 3057, - 0, 2791, 3056, - 0, 2792, 3056, - 0, 2793, 3054, - 0, 2795, 3053, - 0, 2797, 3051, - 0, 2800, 3048, - 0, 2804, 3044, - 0, 2809, 3039, - 0, 2816, 3033, - 0, 2825, 3023, - 0, 2837, 3011, - 0, 2852, 2993, - 0, 2872, 2969, - 0, 2897, 2934, - 0, 2928, 2882, - 0, 2967, 2802, - 0, 3014, 2668, - 0, 3071, 2389, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2789, 3059, - 0, 2789, 3059, - 0, 2789, 3059, - 0, 2789, 3059, - 0, 2790, 3058, - 0, 2790, 3058, - 0, 2791, 3058, - 0, 2791, 3057, - 0, 2792, 3056, - 0, 2793, 3055, - 0, 2795, 3053, - 0, 2797, 3051, - 0, 2800, 3049, - 0, 2804, 3045, - 0, 2809, 3040, - 0, 2816, 3033, - 0, 2825, 3024, - 0, 2837, 3011, - 0, 2852, 2994, - 0, 2872, 2969, - 0, 2897, 2934, - 0, 2928, 2883, - 0, 2967, 2803, - 0, 3014, 2670, - 0, 3071, 2391, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2789, 3060, - 0, 2789, 3060, - 0, 2789, 3060, - 0, 2789, 3059, - 0, 2790, 3059, - 0, 2790, 3059, - 0, 2791, 3058, - 0, 2791, 3058, - 0, 2792, 3057, - 0, 2794, 3056, - 0, 2795, 3054, - 0, 2797, 3052, - 0, 2800, 3049, - 0, 2804, 3046, - 0, 2810, 3041, - 0, 2816, 3034, - 0, 2825, 3025, - 0, 2837, 3012, - 0, 2852, 2995, - 0, 2872, 2970, - 0, 2897, 2935, - 0, 2928, 2884, - 0, 2967, 2805, - 0, 3015, 2671, - 0, 3071, 2394, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3490, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2789, 3061, - 0, 2789, 3061, - 0, 2789, 3061, - 0, 2790, 3060, - 0, 2790, 3060, - 0, 2790, 3060, - 0, 2791, 3059, - 0, 2792, 3059, - 0, 2793, 3058, - 0, 2794, 3057, - 0, 2795, 3055, - 0, 2798, 3053, - 0, 2801, 3050, - 0, 2805, 3047, - 0, 2810, 3042, - 0, 2817, 3035, - 0, 2826, 3026, - 0, 2837, 3013, - 0, 2853, 2996, - 0, 2872, 2971, - 0, 2897, 2936, - 0, 2929, 2885, - 0, 2967, 2806, - 0, 3015, 2673, - 0, 3071, 2398, - 0, 3137, 0, - 0, 3212, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3491, 0, - 0, 3597, 0, - 0, 3710, 0, - 0, 2790, 3062, - 0, 2790, 3062, - 0, 2790, 3062, - 0, 2790, 3062, - 0, 2790, 3061, - 0, 2791, 3061, - 0, 2791, 3060, - 0, 2792, 3060, - 0, 2793, 3059, - 0, 2794, 3058, - 0, 2796, 3056, - 0, 2798, 3054, - 0, 2801, 3052, - 0, 2805, 3048, - 0, 2810, 3043, - 0, 2817, 3036, - 0, 2826, 3027, - 0, 2838, 3014, - 0, 2853, 2997, - 0, 2872, 2973, - 0, 2897, 2938, - 0, 2929, 2887, - 0, 2968, 2809, - 0, 3015, 2676, - 0, 3071, 2404, - 0, 3137, 0, - 0, 3213, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3491, 0, - 0, 3598, 0, - 0, 3710, 0, - 0, 2790, 3064, - 0, 2790, 3064, - 0, 2790, 3063, - 0, 2790, 3063, - 0, 2791, 3063, - 0, 2791, 3063, - 0, 2792, 3062, - 0, 2792, 3062, - 0, 2793, 3061, - 0, 2795, 3060, - 0, 2796, 3058, - 0, 2798, 3056, - 0, 2801, 3053, - 0, 2805, 3050, - 0, 2810, 3045, - 0, 2817, 3038, - 0, 2826, 3029, - 0, 2838, 3016, - 0, 2853, 2999, - 0, 2873, 2975, - 0, 2898, 2940, - 0, 2929, 2890, - 0, 2968, 2811, - 0, 3015, 2680, - 0, 3072, 2411, - 0, 3137, 0, - 0, 3213, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3491, 0, - 0, 3598, 0, - 0, 3710, 0, - 0, 2791, 3066, - 0, 2791, 3066, - 0, 2791, 3066, - 0, 2791, 3065, - 0, 2791, 3065, - 0, 2792, 3065, - 0, 2792, 3064, - 0, 2793, 3064, - 0, 2794, 3063, - 0, 2795, 3062, - 0, 2797, 3060, - 0, 2799, 3058, - 0, 2802, 3056, - 0, 2806, 3052, - 0, 2811, 3047, - 0, 2818, 3040, - 0, 2827, 3031, - 0, 2838, 3019, - 0, 2854, 3002, - 0, 2873, 2978, - 0, 2898, 2943, - 0, 2930, 2893, - 0, 2968, 2815, - 0, 3016, 2685, - 0, 3072, 2420, - 0, 3138, 0, - 0, 3213, 0, - 0, 3297, 0, - 0, 3390, 0, - 0, 3491, 0, - 0, 3598, 0, - 0, 3710, 0, - 0, 2791, 3069, - 0, 2791, 3069, - 0, 2792, 3069, - 0, 2792, 3068, - 0, 2792, 3068, - 0, 2792, 3068, - 0, 2793, 3067, - 0, 2794, 3067, - 0, 2795, 3066, - 0, 2796, 3065, - 0, 2798, 3063, - 0, 2800, 3061, - 0, 2803, 3059, - 0, 2807, 3055, - 0, 2812, 3050, - 0, 2819, 3043, - 0, 2827, 3034, - 0, 2839, 3022, - 0, 2854, 3005, - 0, 2874, 2981, - 0, 2899, 2947, - 0, 2930, 2897, - 0, 2969, 2821, - 0, 3016, 2692, - 0, 3072, 2432, - 0, 3138, 0, - 0, 3213, 0, - 0, 3298, 0, - 0, 3391, 0, - 0, 3491, 0, - 0, 3598, 0, - 0, 3710, 0, - 0, 2792, 3073, - 0, 2792, 3073, - 0, 2793, 3073, - 0, 2793, 3072, - 0, 2793, 3072, - 0, 2793, 3072, - 0, 2794, 3071, - 0, 2795, 3071, - 0, 2796, 3070, - 0, 2797, 3069, - 0, 2799, 3067, - 0, 2801, 3065, - 0, 2804, 3063, - 0, 2808, 3059, - 0, 2813, 3054, - 0, 2819, 3048, - 0, 2828, 3039, - 0, 2840, 3026, - 0, 2855, 3010, - 0, 2875, 2986, - 0, 2900, 2952, - 0, 2931, 2903, - 0, 2970, 2827, - 0, 3017, 2701, - 0, 3073, 2448, - 0, 3138, 0, - 0, 3214, 0, - 0, 3298, 0, - 0, 3391, 0, - 0, 3491, 0, - 0, 3598, 0, - 0, 3710, 0, - 0, 2794, 3078, - 0, 2794, 3078, - 0, 2794, 3078, - 0, 2794, 3078, - 0, 2794, 3077, - 0, 2795, 3077, - 0, 2795, 3077, - 0, 2796, 3076, - 0, 2797, 3075, - 0, 2798, 3074, - 0, 2800, 3073, - 0, 2802, 3071, - 0, 2805, 3068, - 0, 2809, 3064, - 0, 2814, 3060, - 0, 2821, 3053, - 0, 2830, 3044, - 0, 2841, 3032, - 0, 2856, 3016, - 0, 2876, 2992, - 0, 2901, 2959, - 0, 2932, 2911, - 0, 2970, 2836, - 0, 3017, 2713, - 0, 3074, 2468, - 0, 3139, 1070, - 0, 3214, 0, - 0, 3298, 0, - 0, 3391, 0, - 0, 3491, 0, - 0, 3598, 0, - 0, 3710, 0, - 0, 2795, 3085, - 0, 2796, 3085, - 0, 2796, 3085, - 0, 2796, 3085, - 0, 2796, 3084, - 0, 2797, 3084, - 0, 2797, 3084, - 0, 2798, 3083, - 0, 2799, 3082, - 0, 2800, 3081, - 0, 2802, 3080, - 0, 2804, 3078, - 0, 2807, 3075, - 0, 2811, 3072, - 0, 2816, 3067, - 0, 2822, 3060, - 0, 2831, 3052, - 0, 2843, 3040, - 0, 2858, 3023, - 0, 2877, 3001, - 0, 2902, 2968, - 0, 2933, 2920, - 0, 2972, 2848, - 0, 3019, 2728, - 0, 3075, 2494, - 0, 3140, 1443, - 0, 3215, 0, - 0, 3299, 0, - 0, 3392, 0, - 0, 3492, 0, - 0, 3599, 0, - 0, 3711, 0, - 0, 2798, 3094, - 0, 2798, 3094, - 0, 2798, 3094, - 0, 2798, 3094, - 0, 2799, 3093, - 0, 2799, 3093, - 0, 2800, 3093, - 0, 2800, 3092, - 0, 2801, 3091, - 0, 2802, 3090, - 0, 2804, 3089, - 0, 2806, 3087, - 0, 2809, 3084, - 0, 2813, 3081, - 0, 2818, 3076, - 0, 2825, 3070, - 0, 2834, 3062, - 0, 2845, 3050, - 0, 2860, 3034, - 0, 2879, 3011, - 0, 2904, 2980, - 0, 2935, 2933, - 0, 2973, 2863, - 0, 3020, 2748, - 0, 3076, 2527, - 0, 3141, 1697, - 0, 3216, 0, - 0, 3300, 0, - 0, 3392, 0, - 0, 3492, 0, - 0, 3599, 0, - 0, 3711, 0, - 0, 2801, 3106, - 0, 2801, 3106, - 0, 2801, 3106, - 0, 2802, 3106, - 0, 2802, 3105, - 0, 2802, 3105, - 0, 2803, 3105, - 0, 2803, 3104, - 0, 2804, 3103, - 0, 2806, 3102, - 0, 2807, 3101, - 0, 2809, 3099, - 0, 2812, 3096, - 0, 2816, 3093, - 0, 2821, 3089, - 0, 2828, 3083, - 0, 2837, 3074, - 0, 2848, 3063, - 0, 2863, 3047, - 0, 2882, 3026, - 0, 2907, 2995, - 0, 2937, 2950, - 0, 2976, 2883, - 0, 3022, 2773, - 0, 3078, 2567, - 0, 3143, 1902, - 0, 3217, 0, - 0, 3301, 0, - 0, 3393, 0, - 0, 3493, 0, - 0, 3599, 0, - 0, 3711, 0, - 0, 2805, 3121, - 0, 2805, 3121, - 0, 2806, 3121, - 0, 2806, 3121, - 0, 2806, 3121, - 0, 2806, 3120, - 0, 2807, 3120, - 0, 2808, 3119, - 0, 2809, 3119, - 0, 2810, 3118, - 0, 2811, 3116, - 0, 2814, 3115, - 0, 2816, 3112, - 0, 2820, 3109, - 0, 2825, 3105, - 0, 2832, 3099, - 0, 2840, 3091, - 0, 2852, 3080, - 0, 2867, 3065, - 0, 2886, 3044, - 0, 2910, 3014, - 0, 2940, 2972, - 0, 2978, 2908, - 0, 3025, 2805, - 0, 3080, 2615, - 0, 3145, 2083, - 0, 3219, 0, - 0, 3302, 0, - 0, 3394, 0, - 0, 3494, 0, - 0, 3600, 0, - 0, 3712, 0, - 0, 2811, 3141, - 0, 2811, 3141, - 0, 2811, 3141, - 0, 2811, 3141, - 0, 2812, 3141, - 0, 2812, 3140, - 0, 2813, 3140, - 0, 2813, 3139, - 0, 2814, 3139, - 0, 2815, 3138, - 0, 2817, 3136, - 0, 2819, 3135, - 0, 2822, 3132, - 0, 2826, 3129, - 0, 2831, 3125, - 0, 2837, 3120, - 0, 2846, 3112, - 0, 2857, 3101, - 0, 2872, 3087, - 0, 2890, 3067, - 0, 2914, 3039, - 0, 2945, 2999, - 0, 2982, 2939, - 0, 3028, 2843, - 0, 3083, 2673, - 0, 3147, 2248, - 0, 3221, 0, - 0, 3304, 0, - 0, 3396, 0, - 0, 3495, 0, - 0, 3601, 0, - 0, 3713, 0, - 1321, 2818, 3166, - 1314, 2818, 3166, - 1305, 2819, 3166, - 1292, 2819, 3166, - 1275, 2819, 3166, - 1251, 2819, 3165, - 1216, 2820, 3165, - 1165, 2821, 3165, - 1087, 2821, 3164, - 956, 2823, 3163, - 686, 2824, 3162, - 0, 2826, 3160, - 0, 2829, 3158, - 0, 2833, 3155, - 0, 2838, 3151, - 0, 2844, 3146, - 0, 2853, 3139, - 0, 2864, 3129, - 0, 2878, 3115, - 0, 2897, 3097, - 0, 2920, 3071, - 0, 2950, 3033, - 0, 2987, 2978, - 0, 3033, 2891, - 0, 3087, 2740, - 0, 3151, 2403, - 0, 3224, 0, - 0, 3307, 0, - 0, 3398, 0, - 0, 3497, 0, - 0, 3603, 0, - 0, 3714, 0, - 2324, 2828, 3198, - 2323, 2828, 3198, - 2322, 2828, 3198, - 2321, 2828, 3198, - 2319, 2829, 3197, - 2317, 2829, 3197, - 2314, 2830, 3197, - 2309, 2830, 3196, - 2304, 2831, 3196, - 2296, 2832, 3195, - 2285, 2834, 3194, - 2270, 2836, 3192, - 2249, 2839, 3190, - 2220, 2842, 3188, - 2178, 2847, 3184, - 2115, 2853, 3179, - 2013, 2862, 3172, - 1828, 2872, 3163, - 1321, 2887, 3151, - 0, 2905, 3134, - 0, 2928, 3109, - 0, 2957, 3075, - 0, 2994, 3025, - 0, 3039, 2947, - 0, 3092, 2817, - 0, 3156, 2552, - 0, 3228, 0, - 0, 3310, 0, - 0, 3401, 0, - 0, 3499, 0, - 0, 3604, 0, - 0, 3715, 0, - 2680, 2841, 3237, - 2680, 2841, 3237, - 2680, 2841, 3237, - 2679, 2841, 3237, - 2678, 2841, 3237, - 2677, 2842, 3236, - 2676, 2842, 3236, - 2674, 2843, 3236, - 2671, 2844, 3235, - 2668, 2845, 3234, - 2663, 2846, 3233, - 2657, 2848, 3232, - 2648, 2851, 3230, - 2636, 2854, 3228, - 2620, 2859, 3224, - 2597, 2865, 3220, - 2564, 2873, 3214, - 2516, 2884, 3205, - 2444, 2898, 3194, - 2324, 2915, 3178, - 2088, 2938, 3157, - 1008, 2967, 3126, - 0, 3003, 3081, - 0, 3047, 3013, - 0, 3100, 2903, - 0, 3162, 2696, - 0, 3233, 2020, - 0, 3315, 0, - 0, 3404, 0, - 0, 3502, 0, - 0, 3607, 0, - 0, 3717, 0, - 2929, 2857, 3285, - 2929, 2857, 3285, - 2928, 2857, 3285, - 2928, 2858, 3284, - 2927, 2858, 3284, - 2927, 2858, 3284, - 2926, 2859, 3284, - 2925, 2859, 3283, - 2923, 2860, 3283, - 2921, 2861, 3282, - 2919, 2863, 3281, - 2915, 2864, 3280, - 2910, 2867, 3278, - 2903, 2870, 3276, - 2894, 2875, 3273, - 2882, 2881, 3269, - 2865, 2889, 3264, - 2841, 2899, 3256, - 2807, 2912, 3246, - 2757, 2929, 3232, - 2680, 2952, 3213, - 2551, 2980, 3186, - 2289, 3014, 3147, - 0, 3057, 3089, - 0, 3109, 2997, - 0, 3170, 2837, - 0, 3240, 2456, - 0, 3320, 0, - 0, 3409, 0, - 0, 3506, 0, - 0, 3610, 0, - 0, 3719, 0, - 3132, 2878, 3341, - 3132, 2878, 3341, - 3131, 2878, 3341, - 3131, 2879, 3341, - 3131, 2879, 3341, - 3130, 2879, 3341, - 3130, 2880, 3341, - 3129, 2880, 3340, - 3128, 2881, 3340, - 3127, 2882, 3339, - 3125, 2883, 3338, - 3123, 2885, 3337, - 3120, 2888, 3336, - 3116, 2891, 3334, - 3110, 2895, 3331, - 3102, 2901, 3328, - 3092, 2908, 3323, - 3077, 2918, 3316, - 3057, 2931, 3307, - 3029, 2947, 3295, - 2989, 2969, 3279, - 2928, 2996, 3255, - 2832, 3029, 3222, - 2659, 3071, 3173, - 2222, 3121, 3099, - 0, 3181, 2975, - 0, 3250, 2729, - 0, 3328, 1243, - 0, 3415, 0, - 0, 3511, 0, - 0, 3614, 0, - 0, 3723, 0, - 3310, 2905, 3408, - 3310, 2905, 3408, - 3310, 2905, 3408, - 3310, 2905, 3407, - 3310, 2906, 3407, - 3309, 2906, 3407, - 3309, 2906, 3407, - 3309, 2907, 3407, - 3308, 2907, 3406, - 3307, 2908, 3406, - 3306, 2910, 3405, - 3304, 2911, 3404, - 3302, 2914, 3403, - 3300, 2917, 3401, - 3296, 2921, 3399, - 3291, 2926, 3396, - 3284, 2933, 3392, - 3274, 2943, 3386, - 3262, 2955, 3378, - 3244, 2970, 3368, - 3219, 2991, 3354, - 3183, 3016, 3334, - 3131, 3049, 3306, - 3050, 3089, 3266, - 2912, 3137, 3207, - 2620, 3195, 3112, - 0, 3262, 2944, - 0, 3338, 2528, - 0, 3424, 0, - 0, 3518, 0, - 0, 3619, 0, - 0, 3727, 0, - 3474, 2938, 3483, - 3474, 2938, 3483, - 3474, 2939, 3483, - 3474, 2939, 3483, - 3474, 2939, 3483, - 3474, 2939, 3483, - 3474, 2940, 3483, - 3473, 2940, 3483, - 3473, 2941, 3482, - 3472, 2942, 3482, - 3471, 2943, 3481, - 3470, 2944, 3480, - 3469, 2947, 3479, - 3467, 2949, 3478, - 3464, 2953, 3476, - 3461, 2958, 3473, - 3456, 2965, 3470, - 3450, 2973, 3465, - 3441, 2985, 3459, - 3429, 3000, 3450, - 3413, 3019, 3438, - 3390, 3043, 3422, - 3357, 3073, 3399, - 3310, 3111, 3367, - 3237, 3157, 3320, - 3117, 3213, 3248, - 2883, 3277, 3129, - 1820, 3351, 2898, - 0, 3435, 1907, - 0, 3527, 0, - 0, 3626, 0, - 0, 3732, 0, - 3629, 2980, 3568, - 3629, 2980, 3568, - 3629, 2980, 3568, - 3629, 2980, 3568, - 3629, 2980, 3568, - 3629, 2980, 3568, - 3628, 2981, 3568, - 3628, 2981, 3568, - 3628, 2982, 3567, - 3627, 2983, 3567, - 3627, 2984, 3566, - 3626, 2985, 3566, - 3625, 2987, 3565, - 3624, 2990, 3564, - 3622, 2993, 3562, - 3619, 2998, 3560, - 3616, 3004, 3557, - 3612, 3012, 3553, - 3605, 3022, 3548, - 3597, 3036, 3541, - 3586, 3053, 3531, - 3570, 3076, 3518, - 3549, 3104, 3500, - 3518, 3140, 3474, - 3474, 3183, 3437, - 3406, 3235, 3382, - 3297, 3297, 3297, - 3092, 3368, 3151, - 2441, 3449, 2828, - 0, 3538, 0, - 0, 3636, 0, - 0, 3740, 0, - 3777, 3029, 3662, - 3777, 3029, 3662, - 3777, 3030, 3662, - 3777, 3030, 3661, - 3777, 3030, 3661, - 3777, 3030, 3661, - 3777, 3030, 3661, - 3777, 3031, 3661, - 3776, 3031, 3661, - 3776, 3032, 3660, - 3776, 3033, 3660, - 3775, 3034, 3660, - 3774, 3036, 3659, - 3773, 3038, 3658, - 3772, 3042, 3657, - 3770, 3046, 3655, - 3768, 3051, 3652, - 3765, 3058, 3649, - 3760, 3068, 3645, - 3754, 3080, 3639, - 3747, 3096, 3632, - 3736, 3117, 3621, - 3721, 3143, 3606, - 3700, 3175, 3586, - 3671, 3216, 3558, - 3628, 3265, 3516, - 3564, 3323, 3455, - 3462, 3390, 3356, - 3275, 3467, 3178, - 2755, 3554, 2715, - 0, 3648, 0, - 0, 3750, 0, - 3921, 3088, 3762, - 3921, 3088, 3762, - 3921, 3089, 3762, - 3921, 3089, 3762, - 3921, 3089, 3762, - 3921, 3089, 3762, - 3921, 3089, 3762, - 3921, 3090, 3762, - 3920, 3090, 3762, - 3920, 3091, 3761, - 3920, 3092, 3761, - 3919, 3093, 3761, - 3919, 3094, 3760, - 3918, 3096, 3759, - 3917, 3099, 3758, - 3916, 3103, 3757, - 3914, 3108, 3755, - 3912, 3114, 3753, - 3909, 3122, 3749, - 3905, 3133, 3745, - 3899, 3148, 3738, - 3891, 3166, 3730, - 3881, 3189, 3719, - 3866, 3219, 3703, - 3846, 3256, 3681, - 3817, 3301, 3650, - 3776, 3355, 3605, - 3715, 3418, 3536, - 3617, 3491, 3424, - 3441, 3573, 3213, - 2987, 3664, 2497, - 0, 3762, 0, - 4062, 3157, 3869, - 4062, 3157, 3869, - 4062, 3157, 3869, - 4062, 3157, 3869, - 4062, 3157, 3869, - 4061, 3158, 3869, - 4061, 3158, 3869, - 4061, 3158, 3869, - 4061, 3159, 3869, - 4061, 3159, 3869, - 4061, 3160, 3869, - 4060, 3161, 3868, - 4060, 3162, 3868, - 4060, 3164, 3867, - 4059, 3166, 3866, - 4058, 3169, 3865, - 4057, 3174, 3864, - 4055, 3179, 3862, - 4053, 3186, 3859, - 4050, 3196, 3856, - 4045, 3208, 3851, - 4040, 3224, 3844, - 4032, 3245, 3835, - 4022, 3271, 3823, - 4008, 3304, 3806, - 3988, 3345, 3783, - 3960, 3394, 3750, - 3920, 3452, 3701, - 3860, 3520, 3626, - 3766, 3598, 3502, - 3598, 3684, 3255, - 3182, 3779, 1720, - 4095, 3235, 3982, - 4095, 3235, 3982, - 4095, 3235, 3982, - 4095, 3235, 3982, - 4095, 3235, 3982, - 4095, 3236, 3982, - 4095, 3236, 3982, - 4095, 3236, 3982, - 4095, 3236, 3982, - 4095, 3237, 3981, - 4095, 3238, 3981, - 4095, 3238, 3981, - 4095, 3239, 3981, - 4095, 3241, 3980, - 4095, 3243, 3979, - 4095, 3246, 3979, - 4095, 3249, 3978, - 4095, 3254, 3976, - 4095, 3260, 3974, - 4095, 3268, 3971, - 4095, 3279, 3967, - 4095, 3293, 3962, - 4095, 3310, 3956, - 4095, 3333, 3946, - 4095, 3362, 3934, - 4095, 3398, 3916, - 4095, 3442, 3891, - 4095, 3495, 3856, - 4061, 3557, 3804, - 4002, 3629, 3724, - 3910, 3710, 3589, - 3747, 3800, 3306, - 4095, 3322, 4095, - 4095, 3322, 4095, - 4095, 3322, 4095, - 4095, 3322, 4095, - 4095, 3322, 4095, - 4095, 3323, 4095, - 4095, 3323, 4095, - 4095, 3323, 4095, - 4095, 3323, 4095, - 4095, 3324, 4095, - 4095, 3324, 4095, - 4095, 3325, 4095, - 4095, 3326, 4095, - 4095, 3327, 4095, - 4095, 3329, 4095, - 4095, 3331, 4095, - 4095, 3334, 4095, - 4095, 3338, 4094, - 4095, 3343, 4093, - 4095, 3350, 4090, - 4095, 3358, 4088, - 4095, 3370, 4084, - 4095, 3385, 4079, - 4095, 3405, 4071, - 4095, 3429, 4062, - 4095, 3461, 4049, - 4095, 3499, 4030, - 4095, 3546, 4005, - 4095, 3602, 3968, - 4095, 3668, 3914, - 4095, 3743, 3829, - 4051, 3827, 3684, - 0, 2920, 3190, - 0, 2920, 3189, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2922, 3188, - 0, 2922, 3188, - 0, 2923, 3187, - 0, 2924, 3186, - 0, 2925, 3185, - 0, 2927, 3184, - 0, 2929, 3182, - 0, 2932, 3179, - 0, 2936, 3175, - 0, 2941, 3170, - 0, 2948, 3163, - 0, 2957, 3154, - 0, 2969, 3141, - 0, 2984, 3124, - 0, 3004, 3099, - 0, 3029, 3064, - 0, 3060, 3012, - 0, 3099, 2932, - 0, 3146, 2798, - 0, 3203, 2515, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3622, 0, - 0, 3729, 0, - 0, 2920, 3190, - 0, 2920, 3190, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2922, 3189, - 0, 2922, 3188, - 0, 2923, 3187, - 0, 2924, 3187, - 0, 2925, 3185, - 0, 2927, 3184, - 0, 2929, 3182, - 0, 2932, 3179, - 0, 2936, 3175, - 0, 2941, 3170, - 0, 2948, 3163, - 0, 2957, 3154, - 0, 2969, 3142, - 0, 2984, 3124, - 0, 3004, 3099, - 0, 3029, 3064, - 0, 3060, 3013, - 0, 3099, 2933, - 0, 3146, 2798, - 0, 3203, 2516, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3622, 0, - 0, 3729, 0, - 0, 2920, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2921, 3189, - 0, 2922, 3189, - 0, 2922, 3188, - 0, 2923, 3188, - 0, 2924, 3187, - 0, 2925, 3186, - 0, 2927, 3184, - 0, 2929, 3182, - 0, 2932, 3179, - 0, 2936, 3176, - 0, 2941, 3170, - 0, 2948, 3164, - 0, 2957, 3154, - 0, 2969, 3142, - 0, 2984, 3124, - 0, 3004, 3100, - 0, 3029, 3064, - 0, 3060, 3013, - 0, 3099, 2933, - 0, 3146, 2798, - 0, 3203, 2517, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3622, 0, - 0, 3729, 0, - 0, 2920, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3189, - 0, 2922, 3189, - 0, 2922, 3188, - 0, 2923, 3188, - 0, 2924, 3187, - 0, 2925, 3186, - 0, 2927, 3184, - 0, 2929, 3182, - 0, 2932, 3179, - 0, 2936, 3176, - 0, 2941, 3171, - 0, 2948, 3164, - 0, 2957, 3155, - 0, 2969, 3142, - 0, 2984, 3124, - 0, 3004, 3100, - 0, 3029, 3065, - 0, 3060, 3013, - 0, 3099, 2933, - 0, 3146, 2799, - 0, 3203, 2518, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3622, 0, - 0, 3729, 0, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2922, 3189, - 0, 2922, 3189, - 0, 2923, 3188, - 0, 2924, 3187, - 0, 2925, 3186, - 0, 2927, 3185, - 0, 2929, 3183, - 0, 2932, 3180, - 0, 2936, 3176, - 0, 2941, 3171, - 0, 2948, 3164, - 0, 2957, 3155, - 0, 2969, 3142, - 0, 2984, 3125, - 0, 3004, 3100, - 0, 3029, 3065, - 0, 3060, 3014, - 0, 3099, 2934, - 0, 3146, 2799, - 0, 3203, 2519, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3622, 0, - 0, 3729, 0, - 0, 2921, 3191, - 0, 2921, 3191, - 0, 2921, 3191, - 0, 2921, 3190, - 0, 2921, 3190, - 0, 2922, 3190, - 0, 2922, 3190, - 0, 2922, 3189, - 0, 2923, 3188, - 0, 2924, 3188, - 0, 2925, 3187, - 0, 2927, 3185, - 0, 2929, 3183, - 0, 2932, 3180, - 0, 2936, 3176, - 0, 2941, 3171, - 0, 2948, 3165, - 0, 2957, 3155, - 0, 2969, 3143, - 0, 2984, 3125, - 0, 3004, 3101, - 0, 3029, 3066, - 0, 3060, 3014, - 0, 3099, 2935, - 0, 3146, 2800, - 0, 3203, 2521, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3622, 0, - 0, 3729, 0, - 0, 2921, 3191, - 0, 2921, 3191, - 0, 2921, 3191, - 0, 2921, 3191, - 0, 2921, 3191, - 0, 2922, 3190, - 0, 2922, 3190, - 0, 2923, 3190, - 0, 2923, 3189, - 0, 2924, 3188, - 0, 2925, 3187, - 0, 2927, 3186, - 0, 2929, 3183, - 0, 2932, 3181, - 0, 2936, 3177, - 0, 2941, 3172, - 0, 2948, 3165, - 0, 2957, 3156, - 0, 2969, 3143, - 0, 2984, 3126, - 0, 3004, 3101, - 0, 3029, 3066, - 0, 3060, 3015, - 0, 3099, 2936, - 0, 3147, 2802, - 0, 3203, 2523, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3623, 0, - 0, 3729, 0, - 0, 2921, 3192, - 0, 2921, 3192, - 0, 2921, 3192, - 0, 2921, 3192, - 0, 2922, 3191, - 0, 2922, 3191, - 0, 2922, 3191, - 0, 2923, 3190, - 0, 2923, 3190, - 0, 2924, 3189, - 0, 2926, 3188, - 0, 2927, 3186, - 0, 2930, 3184, - 0, 2933, 3181, - 0, 2936, 3178, - 0, 2942, 3173, - 0, 2948, 3166, - 0, 2957, 3157, - 0, 2969, 3144, - 0, 2984, 3127, - 0, 3004, 3102, - 0, 3029, 3067, - 0, 3061, 3016, - 0, 3099, 2937, - 0, 3147, 2803, - 0, 3203, 2526, - 0, 3269, 0, - 0, 3344, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2921, 3193, - 0, 2921, 3193, - 0, 2921, 3193, - 0, 2922, 3193, - 0, 2922, 3192, - 0, 2922, 3192, - 0, 2922, 3192, - 0, 2923, 3191, - 0, 2924, 3191, - 0, 2925, 3190, - 0, 2926, 3189, - 0, 2928, 3187, - 0, 2930, 3185, - 0, 2933, 3182, - 0, 2937, 3179, - 0, 2942, 3174, - 0, 2949, 3167, - 0, 2958, 3158, - 0, 2969, 3145, - 0, 2985, 3128, - 0, 3004, 3103, - 0, 3029, 3069, - 0, 3061, 3017, - 0, 3100, 2938, - 0, 3147, 2806, - 0, 3203, 2530, - 0, 3269, 0, - 0, 3345, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2922, 3194, - 0, 2922, 3194, - 0, 2922, 3194, - 0, 2922, 3194, - 0, 2922, 3194, - 0, 2922, 3193, - 0, 2923, 3193, - 0, 2923, 3193, - 0, 2924, 3192, - 0, 2925, 3191, - 0, 2926, 3190, - 0, 2928, 3188, - 0, 2930, 3186, - 0, 2933, 3184, - 0, 2937, 3180, - 0, 2942, 3175, - 0, 2949, 3168, - 0, 2958, 3159, - 0, 2970, 3147, - 0, 2985, 3129, - 0, 3005, 3105, - 0, 3030, 3070, - 0, 3061, 3019, - 0, 3100, 2941, - 0, 3147, 2808, - 0, 3203, 2536, - 0, 3269, 0, - 0, 3345, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2922, 3196, - 0, 2922, 3196, - 0, 2922, 3196, - 0, 2922, 3196, - 0, 2923, 3195, - 0, 2923, 3195, - 0, 2923, 3195, - 0, 2924, 3194, - 0, 2924, 3194, - 0, 2925, 3193, - 0, 2927, 3192, - 0, 2928, 3190, - 0, 2931, 3188, - 0, 2933, 3185, - 0, 2937, 3182, - 0, 2943, 3177, - 0, 2949, 3170, - 0, 2958, 3161, - 0, 2970, 3148, - 0, 2985, 3131, - 0, 3005, 3107, - 0, 3030, 3072, - 0, 3061, 3022, - 0, 3100, 2944, - 0, 3147, 2812, - 0, 3204, 2543, - 0, 3269, 0, - 0, 3345, 0, - 0, 3429, 0, - 0, 3522, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2923, 3198, - 0, 2923, 3198, - 0, 2923, 3198, - 0, 2923, 3198, - 0, 2923, 3198, - 0, 2923, 3197, - 0, 2924, 3197, - 0, 2924, 3197, - 0, 2925, 3196, - 0, 2926, 3195, - 0, 2927, 3194, - 0, 2929, 3192, - 0, 2931, 3190, - 0, 2934, 3188, - 0, 2938, 3184, - 0, 2943, 3179, - 0, 2950, 3172, - 0, 2959, 3163, - 0, 2971, 3151, - 0, 2986, 3134, - 0, 3005, 3110, - 0, 3030, 3075, - 0, 3062, 3025, - 0, 3100, 2947, - 0, 3148, 2818, - 0, 3204, 2552, - 0, 3270, 0, - 0, 3345, 0, - 0, 3430, 0, - 0, 3522, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2923, 3201, - 0, 2923, 3201, - 0, 2924, 3201, - 0, 2924, 3201, - 0, 2924, 3201, - 0, 2924, 3200, - 0, 2925, 3200, - 0, 2925, 3200, - 0, 2926, 3199, - 0, 2927, 3198, - 0, 2928, 3197, - 0, 2930, 3195, - 0, 2932, 3193, - 0, 2935, 3191, - 0, 2939, 3187, - 0, 2944, 3182, - 0, 2951, 3176, - 0, 2960, 3167, - 0, 2971, 3154, - 0, 2986, 3137, - 0, 3006, 3113, - 0, 3031, 3079, - 0, 3062, 3029, - 0, 3101, 2953, - 0, 3148, 2824, - 0, 3204, 2564, - 0, 3270, 0, - 0, 3345, 0, - 0, 3430, 0, - 0, 3523, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2924, 3205, - 0, 2924, 3205, - 0, 2925, 3205, - 0, 2925, 3205, - 0, 2925, 3205, - 0, 2925, 3204, - 0, 2926, 3204, - 0, 2926, 3203, - 0, 2927, 3203, - 0, 2928, 3202, - 0, 2929, 3201, - 0, 2931, 3199, - 0, 2933, 3197, - 0, 2936, 3195, - 0, 2940, 3191, - 0, 2945, 3186, - 0, 2952, 3180, - 0, 2961, 3171, - 0, 2972, 3159, - 0, 2987, 3142, - 0, 3007, 3118, - 0, 3032, 3084, - 0, 3063, 3035, - 0, 3102, 2959, - 0, 3149, 2833, - 0, 3205, 2580, - 0, 3271, 0, - 0, 3346, 0, - 0, 3430, 0, - 0, 3523, 0, - 0, 3623, 0, - 0, 3730, 0, - 0, 2926, 3210, - 0, 2926, 3210, - 0, 2926, 3210, - 0, 2926, 3210, - 0, 2926, 3210, - 0, 2927, 3210, - 0, 2927, 3209, - 0, 2927, 3209, - 0, 2928, 3208, - 0, 2929, 3207, - 0, 2930, 3206, - 0, 2932, 3205, - 0, 2934, 3203, - 0, 2937, 3200, - 0, 2941, 3197, - 0, 2946, 3192, - 0, 2953, 3185, - 0, 2962, 3176, - 0, 2973, 3164, - 0, 2989, 3148, - 0, 3008, 3124, - 0, 3033, 3091, - 0, 3064, 3043, - 0, 3103, 2968, - 0, 3150, 2845, - 0, 3206, 2601, - 0, 3271, 1202, - 0, 3346, 0, - 0, 3431, 0, - 0, 3523, 0, - 0, 3624, 0, - 0, 3730, 0, - 0, 2927, 3217, - 0, 2928, 3217, - 0, 2928, 3217, - 0, 2928, 3217, - 0, 2928, 3217, - 0, 2928, 3216, - 0, 2929, 3216, - 0, 2929, 3216, - 0, 2930, 3215, - 0, 2931, 3214, - 0, 2932, 3213, - 0, 2934, 3212, - 0, 2936, 3210, - 0, 2939, 3207, - 0, 2943, 3204, - 0, 2948, 3199, - 0, 2955, 3193, - 0, 2963, 3184, - 0, 2975, 3172, - 0, 2990, 3156, - 0, 3010, 3133, - 0, 3034, 3100, - 0, 3065, 3053, - 0, 3104, 2980, - 0, 3151, 2860, - 0, 3207, 2626, - 0, 3272, 1575, - 0, 3347, 0, - 0, 3431, 0, - 0, 3524, 0, - 0, 3624, 0, - 0, 3731, 0, - 0, 2930, 3226, - 0, 2930, 3226, - 0, 2930, 3226, - 0, 2930, 3226, - 0, 2930, 3226, - 0, 2931, 3226, - 0, 2931, 3225, - 0, 2932, 3225, - 0, 2932, 3224, - 0, 2933, 3223, - 0, 2934, 3222, - 0, 2936, 3221, - 0, 2938, 3219, - 0, 2941, 3216, - 0, 2945, 3213, - 0, 2950, 3208, - 0, 2957, 3202, - 0, 2966, 3194, - 0, 2977, 3182, - 0, 2992, 3166, - 0, 3012, 3144, - 0, 3036, 3112, - 0, 3067, 3066, - 0, 3105, 2995, - 0, 3152, 2880, - 0, 3208, 2659, - 0, 3273, 1829, - 0, 3348, 0, - 0, 3432, 0, - 0, 3524, 0, - 0, 3624, 0, - 0, 3731, 0, - 0, 2933, 3238, - 0, 2933, 3238, - 0, 2933, 3238, - 0, 2933, 3238, - 0, 2934, 3238, - 0, 2934, 3237, - 0, 2934, 3237, - 0, 2935, 3237, - 0, 2936, 3236, - 0, 2936, 3235, - 0, 2938, 3234, - 0, 2939, 3233, - 0, 2941, 3231, - 0, 2944, 3229, - 0, 2948, 3225, - 0, 2953, 3221, - 0, 2960, 3215, - 0, 2969, 3206, - 0, 2980, 3195, - 0, 2995, 3179, - 0, 3014, 3158, - 0, 3039, 3127, - 0, 3069, 3082, - 0, 3108, 3015, - 0, 3154, 2905, - 0, 3210, 2699, - 0, 3275, 2034, - 0, 3349, 0, - 0, 3433, 0, - 0, 3525, 0, - 0, 3625, 0, - 0, 3732, 0, - 0, 2937, 3254, - 0, 2937, 3253, - 0, 2938, 3253, - 0, 2938, 3253, - 0, 2938, 3253, - 0, 2938, 3253, - 0, 2939, 3252, - 0, 2939, 3252, - 0, 2940, 3252, - 0, 2941, 3251, - 0, 2942, 3250, - 0, 2943, 3248, - 0, 2946, 3247, - 0, 2948, 3244, - 0, 2952, 3241, - 0, 2957, 3237, - 0, 2964, 3231, - 0, 2973, 3223, - 0, 2984, 3212, - 0, 2999, 3197, - 0, 3018, 3176, - 0, 3042, 3147, - 0, 3073, 3104, - 0, 3110, 3040, - 0, 3157, 2937, - 0, 3212, 2747, - 0, 3277, 2215, - 0, 3351, 0, - 0, 3434, 0, - 0, 3526, 0, - 0, 3626, 0, - 0, 3732, 0, - 0, 2943, 3273, - 0, 2943, 3273, - 0, 2943, 3273, - 0, 2943, 3273, - 0, 2944, 3273, - 0, 2944, 3273, - 0, 2944, 3272, - 0, 2945, 3272, - 0, 2945, 3271, - 0, 2946, 3271, - 0, 2947, 3270, - 0, 2949, 3268, - 0, 2951, 3267, - 0, 2954, 3264, - 0, 2958, 3261, - 0, 2963, 3257, - 0, 2969, 3252, - 0, 2978, 3244, - 0, 2989, 3234, - 0, 3004, 3219, - 0, 3022, 3199, - 0, 3046, 3171, - 0, 3077, 3131, - 0, 3114, 3071, - 0, 3160, 2976, - 0, 3215, 2805, - 0, 3279, 2380, - 0, 3353, 0, - 0, 3436, 0, - 0, 3528, 0, - 0, 3627, 0, - 0, 3733, 0, - 1458, 2950, 3298, - 1453, 2950, 3298, - 1446, 2951, 3298, - 1437, 2951, 3298, - 1424, 2951, 3298, - 1407, 2951, 3298, - 1383, 2952, 3298, - 1348, 2952, 3297, - 1297, 2953, 3297, - 1219, 2954, 3296, - 1088, 2955, 3295, - 818, 2956, 3294, - 0, 2958, 3292, - 0, 2961, 3290, - 0, 2965, 3287, - 0, 2970, 3283, - 0, 2976, 3278, - 0, 2985, 3271, - 0, 2996, 3261, - 0, 3010, 3248, - 0, 3029, 3229, - 0, 3052, 3203, - 0, 3082, 3165, - 0, 3119, 3110, - 0, 3165, 3023, - 0, 3219, 2873, - 0, 3283, 2535, - 0, 3356, 0, - 0, 3439, 0, - 0, 3530, 0, - 0, 3629, 0, - 0, 3735, 0, - 2457, 2960, 3330, - 2456, 2960, 3330, - 2456, 2960, 3330, - 2455, 2960, 3330, - 2453, 2961, 3330, - 2451, 2961, 3330, - 2449, 2961, 3329, - 2446, 2962, 3329, - 2442, 2962, 3328, - 2436, 2963, 3328, - 2428, 2964, 3327, - 2417, 2966, 3326, - 2402, 2968, 3324, - 2382, 2971, 3322, - 2352, 2974, 3320, - 2310, 2979, 3316, - 2247, 2985, 3311, - 2145, 2994, 3304, - 1960, 3004, 3295, - 1453, 3019, 3283, - 0, 3037, 3266, - 0, 3060, 3242, - 0, 3090, 3207, - 0, 3126, 3157, - 0, 3171, 3079, - 0, 3225, 2949, - 0, 3288, 2684, - 0, 3360, 0, - 0, 3442, 0, - 0, 3533, 0, - 0, 3631, 0, - 0, 3736, 0, - 2813, 2973, 3369, - 2813, 2973, 3369, - 2812, 2973, 3369, - 2812, 2973, 3369, - 2811, 2973, 3369, - 2810, 2974, 3369, - 2809, 2974, 3369, - 2808, 2974, 3368, - 2806, 2975, 3368, - 2803, 2976, 3367, - 2800, 2977, 3366, - 2795, 2978, 3365, - 2789, 2980, 3364, - 2780, 2983, 3362, - 2768, 2987, 3360, - 2752, 2991, 3356, - 2729, 2997, 3352, - 2696, 3005, 3346, - 2648, 3016, 3337, - 2576, 3030, 3326, - 2456, 3048, 3310, - 2220, 3070, 3289, - 1140, 3099, 3258, - 0, 3135, 3213, - 0, 3179, 3145, - 0, 3232, 3035, - 0, 3294, 2828, - 0, 3366, 2152, - 0, 3447, 0, - 0, 3536, 0, - 0, 3634, 0, - 0, 3739, 0, - 3061, 2989, 3417, - 3061, 2989, 3417, - 3061, 2989, 3417, - 3060, 2989, 3417, - 3060, 2990, 3417, - 3060, 2990, 3416, - 3059, 2990, 3416, - 3058, 2991, 3416, - 3057, 2991, 3415, - 3055, 2992, 3415, - 3053, 2993, 3414, - 3051, 2995, 3413, - 3047, 2997, 3412, - 3042, 2999, 3410, - 3036, 3002, 3408, - 3027, 3007, 3405, - 3014, 3013, 3401, - 2997, 3021, 3396, - 2973, 3031, 3388, - 2939, 3044, 3378, - 2889, 3062, 3364, - 2812, 3084, 3345, - 2683, 3112, 3318, - 2421, 3147, 3279, - 0, 3189, 3221, - 0, 3241, 3129, - 0, 3302, 2969, - 0, 3373, 2588, - 0, 3452, 0, - 0, 3541, 0, - 0, 3638, 0, - 0, 3742, 0, - 3264, 3010, 3474, - 3264, 3010, 3474, - 3264, 3010, 3473, - 3263, 3010, 3473, - 3263, 3011, 3473, - 3263, 3011, 3473, - 3263, 3011, 3473, - 3262, 3012, 3473, - 3261, 3012, 3472, - 3260, 3013, 3472, - 3259, 3014, 3471, - 3257, 3015, 3470, - 3255, 3017, 3469, - 3252, 3020, 3468, - 3248, 3023, 3466, - 3242, 3027, 3463, - 3234, 3033, 3460, - 3224, 3040, 3455, - 3210, 3050, 3448, - 3190, 3063, 3440, - 3161, 3080, 3427, - 3121, 3101, 3411, - 3060, 3128, 3387, - 2964, 3162, 3354, - 2791, 3203, 3305, - 2354, 3253, 3231, - 0, 3313, 3107, - 0, 3382, 2861, - 0, 3460, 1375, - 0, 3548, 0, - 0, 3643, 0, - 0, 3746, 0, - 3442, 3037, 3540, - 3442, 3037, 3540, - 3442, 3037, 3540, - 3442, 3037, 3540, - 3442, 3037, 3540, - 3442, 3038, 3539, - 3442, 3038, 3539, - 3441, 3038, 3539, - 3441, 3039, 3539, - 3440, 3040, 3538, - 3439, 3041, 3538, - 3438, 3042, 3537, - 3437, 3044, 3536, - 3434, 3046, 3535, - 3432, 3049, 3533, - 3428, 3053, 3531, - 3423, 3058, 3528, - 3416, 3065, 3524, - 3407, 3075, 3518, - 3394, 3087, 3511, - 3376, 3103, 3500, - 3351, 3123, 3486, - 3315, 3149, 3466, - 3263, 3181, 3438, - 3182, 3221, 3398, - 3044, 3269, 3339, - 2752, 3327, 3244, - 0, 3394, 3076, - 0, 3470, 2660, - 0, 3556, 0, - 0, 3650, 0, - 0, 3751, 0, - 3606, 3070, 3616, - 3606, 3070, 3616, - 3606, 3071, 3616, - 3606, 3071, 3615, - 3606, 3071, 3615, - 3606, 3071, 3615, - 3606, 3071, 3615, - 3606, 3072, 3615, - 3605, 3072, 3615, - 3605, 3073, 3614, - 3604, 3074, 3614, - 3603, 3075, 3613, - 3602, 3077, 3613, - 3601, 3079, 3611, - 3599, 3082, 3610, - 3596, 3085, 3608, - 3593, 3090, 3605, - 3588, 3097, 3602, - 3582, 3106, 3597, - 3573, 3117, 3591, - 3561, 3132, 3582, - 3545, 3151, 3570, - 3522, 3175, 3554, - 3489, 3205, 3531, - 3442, 3243, 3499, - 3369, 3289, 3452, - 3249, 3345, 3380, - 3015, 3409, 3261, - 1952, 3483, 3030, - 0, 3567, 2039, - 0, 3659, 0, - 0, 3758, 0, - 3761, 3112, 3700, - 3761, 3112, 3700, - 3761, 3112, 3700, - 3761, 3112, 3700, - 3761, 3112, 3700, - 3761, 3112, 3700, - 3761, 3112, 3700, - 3760, 3113, 3700, - 3760, 3113, 3700, - 3760, 3114, 3699, - 3759, 3115, 3699, - 3759, 3116, 3699, - 3758, 3117, 3698, - 3757, 3119, 3697, - 3756, 3122, 3696, - 3754, 3125, 3694, - 3751, 3130, 3692, - 3748, 3136, 3689, - 3744, 3144, 3685, - 3738, 3154, 3680, - 3729, 3168, 3673, - 3718, 3185, 3663, - 3702, 3208, 3650, - 3681, 3236, 3632, - 3650, 3272, 3606, - 3606, 3315, 3569, - 3538, 3368, 3514, - 3429, 3429, 3429, - 3224, 3501, 3283, - 2573, 3581, 2960, - 0, 3671, 0, - 0, 3768, 0, - 3909, 3161, 3794, - 3909, 3161, 3794, - 3909, 3162, 3794, - 3909, 3162, 3794, - 3909, 3162, 3794, - 3909, 3162, 3794, - 3909, 3162, 3793, - 3909, 3162, 3793, - 3909, 3163, 3793, - 3908, 3163, 3793, - 3908, 3164, 3793, - 3908, 3165, 3792, - 3907, 3166, 3792, - 3906, 3168, 3791, - 3905, 3171, 3790, - 3904, 3174, 3789, - 3902, 3178, 3787, - 3900, 3183, 3785, - 3897, 3190, 3781, - 3892, 3200, 3777, - 3887, 3212, 3771, - 3879, 3228, 3764, - 3868, 3249, 3753, - 3853, 3275, 3739, - 3832, 3307, 3718, - 3803, 3348, 3690, - 3760, 3397, 3648, - 3696, 3455, 3587, - 3594, 3522, 3488, - 3407, 3599, 3311, - 2887, 3686, 2847, - 0, 3780, 0, - 4053, 3220, 3894, - 4053, 3221, 3894, - 4053, 3221, 3894, - 4053, 3221, 3894, - 4053, 3221, 3894, - 4053, 3221, 3894, - 4053, 3221, 3894, - 4053, 3221, 3894, - 4053, 3222, 3894, - 4052, 3222, 3894, - 4052, 3223, 3894, - 4052, 3224, 3893, - 4052, 3225, 3893, - 4051, 3226, 3892, - 4050, 3229, 3891, - 4049, 3231, 3890, - 4048, 3235, 3889, - 4046, 3240, 3887, - 4044, 3246, 3885, - 4041, 3254, 3881, - 4037, 3265, 3877, - 4031, 3280, 3871, - 4023, 3298, 3862, - 4013, 3321, 3851, - 3998, 3351, 3835, - 3978, 3388, 3813, - 3950, 3433, 3782, - 3908, 3487, 3737, - 3847, 3550, 3668, - 3749, 3623, 3557, - 3573, 3705, 3345, - 3119, 3796, 2630, - 4095, 3289, 4002, - 4095, 3289, 4002, - 4095, 3289, 4002, - 4095, 3289, 4002, - 4095, 3289, 4001, - 4095, 3290, 4001, - 4095, 3290, 4001, - 4095, 3290, 4001, - 4095, 3290, 4001, - 4095, 3291, 4001, - 4095, 3291, 4001, - 4095, 3292, 4001, - 4095, 3293, 4000, - 4095, 3294, 4000, - 4095, 3296, 3999, - 4095, 3298, 3998, - 4095, 3302, 3997, - 4095, 3306, 3996, - 4095, 3311, 3994, - 4095, 3318, 3991, - 4095, 3328, 3988, - 4095, 3340, 3983, - 4095, 3357, 3976, - 4095, 3377, 3967, - 4095, 3403, 3955, - 4095, 3436, 3939, - 4095, 3477, 3915, - 4092, 3526, 3882, - 4052, 3585, 3833, - 3993, 3653, 3758, - 3898, 3730, 3634, - 3730, 3816, 3387, - 4095, 3367, 4095, - 4095, 3367, 4095, - 4095, 3367, 4095, - 4095, 3367, 4095, - 4095, 3367, 4095, - 4095, 3368, 4095, - 4095, 3368, 4095, - 4095, 3368, 4095, - 4095, 3368, 4095, - 4095, 3369, 4095, - 4095, 3369, 4095, - 4095, 3370, 4095, - 4095, 3370, 4095, - 4095, 3372, 4095, - 4095, 3373, 4095, - 4095, 3375, 4095, - 4095, 3378, 4095, - 4095, 3381, 4095, - 4095, 3386, 4095, - 4095, 3392, 4095, - 4095, 3400, 4095, - 4095, 3411, 4095, - 4095, 3425, 4094, - 4095, 3442, 4088, - 4095, 3465, 4078, - 4095, 3494, 4066, - 4095, 3530, 4048, - 4095, 3574, 4023, - 4095, 3627, 3988, - 4095, 3689, 3936, - 4095, 3761, 3857, - 4042, 3842, 3721, - 0, 3052, 3322, - 0, 3052, 3322, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3054, 3320, - 0, 3054, 3320, - 0, 3055, 3319, - 0, 3056, 3318, - 0, 3057, 3317, - 0, 3059, 3316, - 0, 3061, 3314, - 0, 3064, 3311, - 0, 3068, 3307, - 0, 3073, 3302, - 0, 3080, 3295, - 0, 3089, 3286, - 0, 3101, 3273, - 0, 3116, 3256, - 0, 3136, 3231, - 0, 3161, 3196, - 0, 3192, 3144, - 0, 3231, 3064, - 0, 3278, 2929, - 0, 3335, 2647, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3052, 3322, - 0, 3052, 3322, - 0, 3053, 3322, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3054, 3320, - 0, 3054, 3320, - 0, 3055, 3319, - 0, 3056, 3319, - 0, 3057, 3317, - 0, 3059, 3316, - 0, 3061, 3314, - 0, 3064, 3311, - 0, 3068, 3307, - 0, 3073, 3302, - 0, 3080, 3295, - 0, 3089, 3286, - 0, 3101, 3273, - 0, 3116, 3256, - 0, 3136, 3231, - 0, 3161, 3196, - 0, 3192, 3144, - 0, 3231, 3065, - 0, 3278, 2930, - 0, 3335, 2648, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3052, 3322, - 0, 3052, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3054, 3321, - 0, 3054, 3320, - 0, 3055, 3319, - 0, 3056, 3319, - 0, 3057, 3318, - 0, 3059, 3316, - 0, 3061, 3314, - 0, 3064, 3311, - 0, 3068, 3307, - 0, 3073, 3302, - 0, 3080, 3296, - 0, 3089, 3286, - 0, 3101, 3274, - 0, 3116, 3256, - 0, 3136, 3231, - 0, 3161, 3196, - 0, 3192, 3145, - 0, 3231, 3065, - 0, 3278, 2930, - 0, 3335, 2648, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3052, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3321, - 0, 3053, 3321, - 0, 3054, 3321, - 0, 3054, 3320, - 0, 3055, 3320, - 0, 3056, 3319, - 0, 3057, 3318, - 0, 3059, 3316, - 0, 3061, 3314, - 0, 3064, 3311, - 0, 3068, 3308, - 0, 3073, 3303, - 0, 3080, 3296, - 0, 3089, 3286, - 0, 3101, 3274, - 0, 3116, 3256, - 0, 3136, 3232, - 0, 3161, 3197, - 0, 3192, 3145, - 0, 3231, 3065, - 0, 3278, 2930, - 0, 3335, 2649, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3321, - 0, 3054, 3321, - 0, 3054, 3321, - 0, 3055, 3320, - 0, 3056, 3319, - 0, 3057, 3318, - 0, 3059, 3316, - 0, 3061, 3314, - 0, 3064, 3312, - 0, 3068, 3308, - 0, 3073, 3303, - 0, 3080, 3296, - 0, 3089, 3287, - 0, 3101, 3274, - 0, 3116, 3256, - 0, 3136, 3232, - 0, 3161, 3197, - 0, 3192, 3145, - 0, 3231, 3065, - 0, 3278, 2931, - 0, 3335, 2650, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3053, 3323, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3053, 3322, - 0, 3054, 3322, - 0, 3054, 3321, - 0, 3054, 3321, - 0, 3055, 3320, - 0, 3056, 3319, - 0, 3057, 3318, - 0, 3059, 3317, - 0, 3061, 3315, - 0, 3064, 3312, - 0, 3068, 3308, - 0, 3073, 3303, - 0, 3080, 3296, - 0, 3089, 3287, - 0, 3101, 3274, - 0, 3116, 3257, - 0, 3136, 3232, - 0, 3161, 3197, - 0, 3192, 3146, - 0, 3231, 3066, - 0, 3279, 2932, - 0, 3335, 2651, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3322, - 0, 3054, 3322, - 0, 3054, 3322, - 0, 3055, 3321, - 0, 3055, 3321, - 0, 3056, 3320, - 0, 3057, 3319, - 0, 3059, 3317, - 0, 3061, 3315, - 0, 3064, 3312, - 0, 3068, 3309, - 0, 3073, 3304, - 0, 3080, 3297, - 0, 3089, 3287, - 0, 3101, 3275, - 0, 3116, 3257, - 0, 3136, 3233, - 0, 3161, 3198, - 0, 3192, 3146, - 0, 3231, 3067, - 0, 3279, 2932, - 0, 3335, 2653, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3053, 3323, - 0, 3054, 3323, - 0, 3054, 3322, - 0, 3055, 3322, - 0, 3055, 3321, - 0, 3056, 3320, - 0, 3058, 3319, - 0, 3059, 3318, - 0, 3061, 3316, - 0, 3064, 3313, - 0, 3068, 3309, - 0, 3074, 3304, - 0, 3080, 3297, - 0, 3089, 3288, - 0, 3101, 3275, - 0, 3116, 3258, - 0, 3136, 3233, - 0, 3161, 3198, - 0, 3192, 3147, - 0, 3231, 3068, - 0, 3279, 2934, - 0, 3335, 2655, - 0, 3401, 0, - 0, 3476, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3053, 3324, - 0, 3053, 3324, - 0, 3053, 3324, - 0, 3053, 3324, - 0, 3053, 3324, - 0, 3054, 3324, - 0, 3054, 3323, - 0, 3054, 3323, - 0, 3055, 3322, - 0, 3056, 3322, - 0, 3057, 3321, - 0, 3058, 3320, - 0, 3059, 3318, - 0, 3062, 3316, - 0, 3065, 3314, - 0, 3069, 3310, - 0, 3074, 3305, - 0, 3081, 3298, - 0, 3090, 3289, - 0, 3101, 3276, - 0, 3117, 3259, - 0, 3136, 3234, - 0, 3161, 3199, - 0, 3193, 3148, - 0, 3231, 3069, - 0, 3279, 2935, - 0, 3335, 2658, - 0, 3401, 0, - 0, 3477, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3053, 3325, - 0, 3053, 3325, - 0, 3053, 3325, - 0, 3054, 3325, - 0, 3054, 3325, - 0, 3054, 3325, - 0, 3054, 3324, - 0, 3055, 3324, - 0, 3055, 3323, - 0, 3056, 3323, - 0, 3057, 3322, - 0, 3058, 3321, - 0, 3060, 3319, - 0, 3062, 3317, - 0, 3065, 3314, - 0, 3069, 3311, - 0, 3074, 3306, - 0, 3081, 3299, - 0, 3090, 3290, - 0, 3102, 3277, - 0, 3117, 3260, - 0, 3136, 3235, - 0, 3161, 3201, - 0, 3193, 3149, - 0, 3232, 3071, - 0, 3279, 2938, - 0, 3335, 2662, - 0, 3401, 0, - 0, 3477, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3054, 3326, - 0, 3054, 3326, - 0, 3054, 3326, - 0, 3054, 3326, - 0, 3054, 3326, - 0, 3054, 3326, - 0, 3055, 3326, - 0, 3055, 3325, - 0, 3055, 3325, - 0, 3056, 3324, - 0, 3057, 3323, - 0, 3058, 3322, - 0, 3060, 3321, - 0, 3062, 3319, - 0, 3065, 3316, - 0, 3069, 3312, - 0, 3074, 3307, - 0, 3081, 3300, - 0, 3090, 3291, - 0, 3102, 3279, - 0, 3117, 3261, - 0, 3137, 3237, - 0, 3162, 3202, - 0, 3193, 3151, - 0, 3232, 3073, - 0, 3279, 2941, - 0, 3335, 2668, - 0, 3401, 0, - 0, 3477, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3054, 3328, - 0, 3054, 3328, - 0, 3054, 3328, - 0, 3054, 3328, - 0, 3054, 3328, - 0, 3055, 3327, - 0, 3055, 3327, - 0, 3055, 3327, - 0, 3056, 3326, - 0, 3057, 3326, - 0, 3057, 3325, - 0, 3059, 3324, - 0, 3060, 3322, - 0, 3063, 3320, - 0, 3066, 3318, - 0, 3069, 3314, - 0, 3075, 3309, - 0, 3081, 3302, - 0, 3090, 3293, - 0, 3102, 3281, - 0, 3117, 3263, - 0, 3137, 3239, - 0, 3162, 3204, - 0, 3193, 3154, - 0, 3232, 3076, - 0, 3279, 2944, - 0, 3336, 2675, - 0, 3402, 0, - 0, 3477, 0, - 0, 3561, 0, - 0, 3654, 0, - 0, 3755, 0, - 0, 3055, 3330, - 0, 3055, 3330, - 0, 3055, 3330, - 0, 3055, 3330, - 0, 3055, 3330, - 0, 3055, 3330, - 0, 3056, 3329, - 0, 3056, 3329, - 0, 3056, 3329, - 0, 3057, 3328, - 0, 3058, 3327, - 0, 3059, 3326, - 0, 3061, 3325, - 0, 3063, 3323, - 0, 3066, 3320, - 0, 3070, 3316, - 0, 3075, 3311, - 0, 3082, 3305, - 0, 3091, 3295, - 0, 3103, 3283, - 0, 3118, 3266, - 0, 3137, 3242, - 0, 3162, 3207, - 0, 3194, 3157, - 0, 3233, 3080, - 0, 3280, 2950, - 0, 3336, 2684, - 0, 3402, 0, - 0, 3477, 0, - 0, 3562, 0, - 0, 3655, 0, - 0, 3755, 0, - 0, 3055, 3333, - 0, 3055, 3333, - 0, 3055, 3333, - 0, 3056, 3333, - 0, 3056, 3333, - 0, 3056, 3333, - 0, 3056, 3332, - 0, 3057, 3332, - 0, 3057, 3332, - 0, 3058, 3331, - 0, 3059, 3330, - 0, 3060, 3329, - 0, 3062, 3328, - 0, 3064, 3326, - 0, 3067, 3323, - 0, 3071, 3319, - 0, 3076, 3314, - 0, 3083, 3308, - 0, 3092, 3299, - 0, 3103, 3286, - 0, 3119, 3269, - 0, 3138, 3245, - 0, 3163, 3211, - 0, 3194, 3161, - 0, 3233, 3085, - 0, 3280, 2957, - 0, 3336, 2696, - 0, 3402, 0, - 0, 3477, 0, - 0, 3562, 0, - 0, 3655, 0, - 0, 3755, 0, - 0, 3056, 3337, - 0, 3056, 3337, - 0, 3056, 3337, - 0, 3057, 3337, - 0, 3057, 3337, - 0, 3057, 3337, - 0, 3057, 3336, - 0, 3058, 3336, - 0, 3058, 3336, - 0, 3059, 3335, - 0, 3060, 3334, - 0, 3061, 3333, - 0, 3063, 3332, - 0, 3065, 3330, - 0, 3068, 3327, - 0, 3072, 3323, - 0, 3077, 3318, - 0, 3084, 3312, - 0, 3093, 3303, - 0, 3104, 3291, - 0, 3119, 3274, - 0, 3139, 3250, - 0, 3164, 3216, - 0, 3195, 3167, - 0, 3234, 3092, - 0, 3281, 2966, - 0, 3337, 2712, - 0, 3403, 0, - 0, 3478, 0, - 0, 3562, 0, - 0, 3655, 0, - 0, 3755, 0, - 0, 3058, 3342, - 0, 3058, 3342, - 0, 3058, 3342, - 0, 3058, 3342, - 0, 3058, 3342, - 0, 3058, 3342, - 0, 3059, 3342, - 0, 3059, 3341, - 0, 3060, 3341, - 0, 3060, 3340, - 0, 3061, 3339, - 0, 3062, 3338, - 0, 3064, 3337, - 0, 3066, 3335, - 0, 3069, 3332, - 0, 3073, 3329, - 0, 3078, 3324, - 0, 3085, 3317, - 0, 3094, 3309, - 0, 3106, 3296, - 0, 3121, 3280, - 0, 3140, 3256, - 0, 3165, 3223, - 0, 3196, 3175, - 0, 3235, 3100, - 0, 3282, 2977, - 0, 3338, 2733, - 0, 3403, 1334, - 0, 3478, 0, - 0, 3563, 0, - 0, 3655, 0, - 0, 3756, 0, - 0, 3059, 3349, - 0, 3060, 3349, - 0, 3060, 3349, - 0, 3060, 3349, - 0, 3060, 3349, - 0, 3060, 3349, - 0, 3060, 3349, - 0, 3061, 3348, - 0, 3061, 3348, - 0, 3062, 3347, - 0, 3063, 3346, - 0, 3064, 3345, - 0, 3066, 3344, - 0, 3068, 3342, - 0, 3071, 3339, - 0, 3075, 3336, - 0, 3080, 3331, - 0, 3087, 3325, - 0, 3096, 3316, - 0, 3107, 3304, - 0, 3122, 3288, - 0, 3142, 3265, - 0, 3166, 3232, - 0, 3197, 3185, - 0, 3236, 3112, - 0, 3283, 2993, - 0, 3339, 2758, - 0, 3404, 1707, - 0, 3479, 0, - 0, 3563, 0, - 0, 3656, 0, - 0, 3756, 0, - 0, 3062, 3358, - 0, 3062, 3358, - 0, 3062, 3358, - 0, 3062, 3358, - 0, 3062, 3358, - 0, 3063, 3358, - 0, 3063, 3358, - 0, 3063, 3357, - 0, 3064, 3357, - 0, 3064, 3356, - 0, 3065, 3355, - 0, 3067, 3354, - 0, 3068, 3353, - 0, 3070, 3351, - 0, 3073, 3349, - 0, 3077, 3345, - 0, 3082, 3341, - 0, 3089, 3334, - 0, 3098, 3326, - 0, 3109, 3314, - 0, 3124, 3298, - 0, 3144, 3276, - 0, 3168, 3244, - 0, 3199, 3198, - 0, 3238, 3127, - 0, 3284, 3012, - 0, 3340, 2791, - 0, 3405, 1961, - 0, 3480, 0, - 0, 3564, 0, - 0, 3657, 0, - 0, 3757, 0, - 0, 3065, 3370, - 0, 3065, 3370, - 0, 3065, 3370, - 0, 3065, 3370, - 0, 3066, 3370, - 0, 3066, 3370, - 0, 3066, 3369, - 0, 3066, 3369, - 0, 3067, 3369, - 0, 3068, 3368, - 0, 3069, 3367, - 0, 3070, 3366, - 0, 3071, 3365, - 0, 3074, 3363, - 0, 3076, 3361, - 0, 3080, 3357, - 0, 3085, 3353, - 0, 3092, 3347, - 0, 3101, 3338, - 0, 3112, 3327, - 0, 3127, 3312, - 0, 3146, 3290, - 0, 3171, 3259, - 0, 3202, 3214, - 0, 3240, 3147, - 0, 3286, 3037, - 0, 3342, 2831, - 0, 3407, 2166, - 0, 3481, 0, - 0, 3565, 0, - 0, 3657, 0, - 0, 3757, 0, - 0, 3069, 3386, - 0, 3069, 3386, - 0, 3070, 3386, - 0, 3070, 3385, - 0, 3070, 3385, - 0, 3070, 3385, - 0, 3070, 3385, - 0, 3071, 3385, - 0, 3071, 3384, - 0, 3072, 3384, - 0, 3073, 3383, - 0, 3074, 3382, - 0, 3076, 3381, - 0, 3078, 3379, - 0, 3081, 3376, - 0, 3084, 3373, - 0, 3089, 3369, - 0, 3096, 3363, - 0, 3105, 3355, - 0, 3116, 3344, - 0, 3131, 3329, - 0, 3150, 3308, - 0, 3174, 3279, - 0, 3205, 3236, - 0, 3243, 3172, - 0, 3289, 3069, - 0, 3344, 2880, - 0, 3409, 2347, - 0, 3483, 0, - 0, 3567, 0, - 0, 3659, 0, - 0, 3758, 0, - 0, 3075, 3405, - 0, 3075, 3405, - 0, 3075, 3405, - 0, 3075, 3405, - 0, 3075, 3405, - 0, 3076, 3405, - 0, 3076, 3405, - 0, 3076, 3404, - 0, 3077, 3404, - 0, 3077, 3404, - 0, 3078, 3403, - 0, 3080, 3402, - 0, 3081, 3401, - 0, 3083, 3399, - 0, 3086, 3397, - 0, 3090, 3393, - 0, 3095, 3389, - 0, 3101, 3384, - 0, 3110, 3376, - 0, 3121, 3366, - 0, 3136, 3351, - 0, 3155, 3332, - 0, 3179, 3304, - 0, 3209, 3263, - 0, 3246, 3203, - 0, 3292, 3108, - 0, 3347, 2937, - 0, 3411, 2512, - 0, 3485, 0, - 0, 3568, 0, - 0, 3660, 0, - 0, 3759, 0, - 1593, 3082, 3431, - 1590, 3082, 3431, - 1585, 3083, 3431, - 1578, 3083, 3430, - 1569, 3083, 3430, - 1556, 3083, 3430, - 1539, 3083, 3430, - 1515, 3084, 3430, - 1480, 3084, 3429, - 1429, 3085, 3429, - 1351, 3086, 3428, - 1220, 3087, 3427, - 950, 3088, 3426, - 0, 3090, 3424, - 0, 3093, 3422, - 0, 3097, 3419, - 0, 3102, 3415, - 0, 3108, 3410, - 0, 3117, 3403, - 0, 3128, 3393, - 0, 3142, 3380, - 0, 3161, 3361, - 0, 3184, 3335, - 0, 3214, 3297, - 0, 3252, 3242, - 0, 3297, 3155, - 0, 3351, 3005, - 0, 3415, 2667, - 0, 3488, 0, - 0, 3571, 0, - 0, 3662, 0, - 0, 3761, 0, - 2589, 3092, 3462, - 2589, 3092, 3462, - 2588, 3092, 3462, - 2588, 3092, 3462, - 2587, 3092, 3462, - 2585, 3093, 3462, - 2584, 3093, 3462, - 2581, 3093, 3461, - 2578, 3094, 3461, - 2574, 3094, 3461, - 2568, 3095, 3460, - 2560, 3096, 3459, - 2549, 3098, 3458, - 2534, 3100, 3456, - 2514, 3103, 3454, - 2484, 3106, 3452, - 2442, 3111, 3448, - 2379, 3117, 3443, - 2277, 3126, 3436, - 2092, 3137, 3427, - 1586, 3151, 3415, - 0, 3169, 3398, - 0, 3192, 3374, - 0, 3222, 3339, - 0, 3258, 3289, - 0, 3303, 3211, - 0, 3357, 3081, - 0, 3420, 2816, - 0, 3492, 0, - 0, 3574, 0, - 0, 3665, 0, - 0, 3763, 0, - 2945, 3105, 3501, - 2945, 3105, 3501, - 2945, 3105, 3501, - 2944, 3105, 3501, - 2944, 3105, 3501, - 2943, 3105, 3501, - 2942, 3106, 3501, - 2941, 3106, 3501, - 2940, 3106, 3500, - 2938, 3107, 3500, - 2935, 3108, 3499, - 2932, 3109, 3499, - 2927, 3110, 3497, - 2921, 3112, 3496, - 2912, 3115, 3494, - 2900, 3119, 3492, - 2884, 3123, 3488, - 2861, 3129, 3484, - 2828, 3137, 3478, - 2780, 3148, 3470, - 2708, 3162, 3458, - 2588, 3180, 3443, - 2352, 3202, 3421, - 1272, 3231, 3390, - 0, 3267, 3345, - 0, 3311, 3277, - 0, 3364, 3167, - 0, 3426, 2960, - 0, 3498, 2284, - 0, 3579, 0, - 0, 3669, 0, - 0, 3766, 0, - 3193, 3121, 3549, - 3193, 3121, 3549, - 3193, 3121, 3549, - 3193, 3121, 3549, - 3192, 3122, 3549, - 3192, 3122, 3549, - 3192, 3122, 3548, - 3191, 3122, 3548, - 3190, 3123, 3548, - 3189, 3123, 3548, - 3188, 3124, 3547, - 3186, 3125, 3546, - 3183, 3127, 3545, - 3179, 3129, 3544, - 3174, 3131, 3543, - 3168, 3135, 3540, - 3159, 3139, 3537, - 3146, 3145, 3533, - 3129, 3153, 3528, - 3105, 3163, 3520, - 3071, 3176, 3510, - 3021, 3194, 3496, - 2944, 3216, 3477, - 2815, 3244, 3450, - 2553, 3279, 3411, - 0, 3321, 3353, - 0, 3373, 3261, - 0, 3434, 3101, - 0, 3505, 2720, - 0, 3585, 0, - 0, 3673, 0, - 0, 3770, 0, - 3396, 3142, 3606, - 3396, 3142, 3606, - 3396, 3142, 3606, - 3396, 3142, 3606, - 3396, 3143, 3605, - 3395, 3143, 3605, - 3395, 3143, 3605, - 3395, 3143, 3605, - 3394, 3144, 3605, - 3393, 3144, 3604, - 3392, 3145, 3604, - 3391, 3146, 3603, - 3389, 3148, 3603, - 3387, 3149, 3601, - 3384, 3152, 3600, - 3380, 3155, 3598, - 3374, 3159, 3595, - 3367, 3165, 3592, - 3356, 3172, 3587, - 3342, 3182, 3581, - 3322, 3195, 3572, - 3294, 3212, 3560, - 3253, 3233, 3543, - 3192, 3260, 3519, - 3096, 3294, 3486, - 2923, 3335, 3437, - 2486, 3385, 3363, - 0, 3445, 3239, - 0, 3514, 2993, - 0, 3592, 1507, - 0, 3680, 0, - 0, 3775, 0, - 3575, 3169, 3672, - 3575, 3169, 3672, - 3574, 3169, 3672, - 3574, 3169, 3672, - 3574, 3169, 3672, - 3574, 3169, 3672, - 3574, 3170, 3672, - 3574, 3170, 3671, - 3573, 3170, 3671, - 3573, 3171, 3671, - 3572, 3172, 3670, - 3571, 3173, 3670, - 3570, 3174, 3669, - 3569, 3176, 3668, - 3567, 3178, 3667, - 3564, 3181, 3665, - 3560, 3185, 3663, - 3555, 3190, 3660, - 3548, 3198, 3656, - 3539, 3207, 3650, - 3526, 3219, 3643, - 3508, 3235, 3632, - 3483, 3255, 3618, - 3448, 3281, 3598, - 3395, 3313, 3571, - 3314, 3353, 3531, - 3176, 3401, 3471, - 2884, 3459, 3376, - 0, 3526, 3208, - 0, 3602, 2792, - 0, 3688, 0, - 0, 3782, 0, - 3739, 3202, 3748, - 3739, 3202, 3748, - 3739, 3203, 3748, - 3738, 3203, 3748, - 3738, 3203, 3748, - 3738, 3203, 3747, - 3738, 3203, 3747, - 3738, 3203, 3747, - 3738, 3204, 3747, - 3737, 3204, 3747, - 3737, 3205, 3746, - 3736, 3206, 3746, - 3736, 3207, 3745, - 3734, 3209, 3745, - 3733, 3211, 3744, - 3731, 3214, 3742, - 3728, 3217, 3740, - 3725, 3222, 3738, - 3720, 3229, 3734, - 3714, 3238, 3729, - 3705, 3249, 3723, - 3693, 3264, 3714, - 3677, 3283, 3703, - 3654, 3307, 3686, - 3621, 3338, 3663, - 3574, 3375, 3631, - 3501, 3422, 3584, - 3381, 3477, 3512, - 3147, 3541, 3393, - 2084, 3616, 3162, - 0, 3699, 2171, - 0, 3791, 0, - 3893, 3244, 3833, - 3893, 3244, 3833, - 3893, 3244, 3833, - 3893, 3244, 3832, - 3893, 3244, 3832, - 3893, 3244, 3832, - 3893, 3244, 3832, - 3893, 3244, 3832, - 3893, 3245, 3832, - 3892, 3245, 3832, - 3892, 3246, 3832, - 3892, 3247, 3831, - 3891, 3248, 3831, - 3890, 3249, 3830, - 3889, 3251, 3829, - 3888, 3254, 3828, - 3886, 3257, 3826, - 3884, 3262, 3824, - 3880, 3268, 3821, - 3876, 3276, 3817, - 3870, 3286, 3812, - 3861, 3300, 3805, - 3850, 3318, 3795, - 3835, 3340, 3782, - 3813, 3368, 3764, - 3782, 3404, 3738, - 3738, 3447, 3701, - 3670, 3500, 3646, - 3561, 3561, 3561, - 3357, 3633, 3415, - 2705, 3713, 3092, - 0, 3803, 0, - 4041, 3293, 3926, - 4041, 3293, 3926, - 4041, 3294, 3926, - 4041, 3294, 3926, - 4041, 3294, 3926, - 4041, 3294, 3926, - 4041, 3294, 3926, - 4041, 3294, 3926, - 4041, 3295, 3925, - 4041, 3295, 3925, - 4041, 3296, 3925, - 4040, 3296, 3925, - 4040, 3297, 3924, - 4039, 3299, 3924, - 4039, 3300, 3923, - 4038, 3303, 3922, - 4036, 3306, 3921, - 4034, 3310, 3919, - 4032, 3315, 3917, - 4029, 3322, 3914, - 4025, 3332, 3909, - 4019, 3344, 3904, - 4011, 3360, 3896, - 4000, 3381, 3885, - 3985, 3407, 3871, - 3964, 3440, 3850, - 3935, 3480, 3822, - 3892, 3529, 3781, - 3829, 3587, 3719, - 3726, 3654, 3620, - 3539, 3732, 3443, - 3019, 3818, 2979, - 4095, 3353, 4027, - 4095, 3353, 4027, - 4095, 3353, 4027, - 4095, 3353, 4027, - 4095, 3353, 4026, - 4095, 3353, 4026, - 4095, 3353, 4026, - 4095, 3353, 4026, - 4095, 3354, 4026, - 4095, 3354, 4026, - 4095, 3354, 4026, - 4095, 3355, 4026, - 4095, 3356, 4025, - 4095, 3357, 4025, - 4095, 3359, 4024, - 4095, 3361, 4024, - 4095, 3363, 4023, - 4095, 3367, 4021, - 4095, 3372, 4019, - 4095, 3378, 4017, - 4095, 3387, 4013, - 4095, 3397, 4009, - 4095, 3412, 4003, - 4095, 3430, 3994, - 4095, 3454, 3983, - 4095, 3483, 3967, - 4095, 3520, 3945, - 4082, 3565, 3914, - 4041, 3619, 3869, - 3979, 3682, 3800, - 3881, 3755, 3689, - 3706, 3837, 3477, - 4095, 3421, 4095, - 4095, 3421, 4095, - 4095, 3421, 4095, - 4095, 3421, 4095, - 4095, 3421, 4095, - 4095, 3421, 4095, - 4095, 3422, 4095, - 4095, 3422, 4095, - 4095, 3422, 4095, - 4095, 3422, 4095, - 4095, 3423, 4095, - 4095, 3423, 4095, - 4095, 3424, 4095, - 4095, 3425, 4095, - 4095, 3426, 4095, - 4095, 3428, 4095, - 4095, 3431, 4095, - 4095, 3434, 4095, - 4095, 3438, 4095, - 4095, 3443, 4095, - 4095, 3451, 4095, - 4095, 3460, 4095, - 4095, 3473, 4095, - 4095, 3489, 4095, - 4095, 3509, 4095, - 4095, 3536, 4087, - 4095, 3568, 4071, - 4095, 3609, 4047, - 4095, 3658, 4014, - 4095, 3717, 3965, - 4095, 3785, 3891, - 4030, 3862, 3767, - 0, 3184, 3454, - 0, 3184, 3454, - 0, 3185, 3454, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3186, 3452, - 0, 3186, 3452, - 0, 3187, 3451, - 0, 3188, 3450, - 0, 3189, 3449, - 0, 3191, 3448, - 0, 3193, 3446, - 0, 3196, 3443, - 0, 3200, 3439, - 0, 3205, 3434, - 0, 3212, 3427, - 0, 3221, 3418, - 0, 3233, 3405, - 0, 3248, 3388, - 0, 3268, 3363, - 0, 3293, 3328, - 0, 3324, 3276, - 0, 3363, 3196, - 0, 3410, 3061, - 0, 3467, 2779, - 0, 3533, 0, - 0, 3608, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3184, 3454, - 0, 3184, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3186, 3452, - 0, 3186, 3452, - 0, 3187, 3451, - 0, 3188, 3451, - 0, 3189, 3449, - 0, 3191, 3448, - 0, 3193, 3446, - 0, 3196, 3443, - 0, 3200, 3439, - 0, 3205, 3434, - 0, 3212, 3427, - 0, 3221, 3418, - 0, 3233, 3405, - 0, 3248, 3388, - 0, 3268, 3363, - 0, 3293, 3328, - 0, 3324, 3276, - 0, 3363, 3196, - 0, 3410, 3061, - 0, 3467, 2779, - 0, 3533, 0, - 0, 3608, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3184, 3454, - 0, 3184, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3186, 3453, - 0, 3186, 3452, - 0, 3187, 3451, - 0, 3188, 3451, - 0, 3189, 3449, - 0, 3191, 3448, - 0, 3193, 3446, - 0, 3196, 3443, - 0, 3200, 3439, - 0, 3205, 3434, - 0, 3212, 3428, - 0, 3221, 3418, - 0, 3233, 3406, - 0, 3248, 3388, - 0, 3268, 3363, - 0, 3293, 3328, - 0, 3324, 3277, - 0, 3363, 3197, - 0, 3411, 3062, - 0, 3467, 2780, - 0, 3533, 0, - 0, 3608, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3184, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3453, - 0, 3185, 3453, - 0, 3186, 3453, - 0, 3186, 3452, - 0, 3187, 3452, - 0, 3188, 3451, - 0, 3189, 3450, - 0, 3191, 3448, - 0, 3193, 3446, - 0, 3196, 3443, - 0, 3200, 3440, - 0, 3205, 3434, - 0, 3212, 3428, - 0, 3221, 3418, - 0, 3233, 3406, - 0, 3248, 3388, - 0, 3268, 3364, - 0, 3293, 3328, - 0, 3324, 3277, - 0, 3363, 3197, - 0, 3411, 3062, - 0, 3467, 2780, - 0, 3533, 0, - 0, 3608, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3184, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3453, - 0, 3186, 3453, - 0, 3186, 3453, - 0, 3186, 3452, - 0, 3187, 3452, - 0, 3188, 3451, - 0, 3189, 3450, - 0, 3191, 3448, - 0, 3193, 3446, - 0, 3196, 3443, - 0, 3200, 3440, - 0, 3205, 3435, - 0, 3212, 3428, - 0, 3221, 3419, - 0, 3233, 3406, - 0, 3248, 3388, - 0, 3268, 3364, - 0, 3293, 3329, - 0, 3324, 3277, - 0, 3363, 3197, - 0, 3411, 3062, - 0, 3467, 2781, - 0, 3533, 0, - 0, 3608, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3186, 3453, - 0, 3186, 3453, - 0, 3186, 3453, - 0, 3187, 3452, - 0, 3188, 3451, - 0, 3189, 3450, - 0, 3191, 3448, - 0, 3193, 3446, - 0, 3196, 3444, - 0, 3200, 3440, - 0, 3205, 3435, - 0, 3212, 3428, - 0, 3221, 3419, - 0, 3233, 3406, - 0, 3248, 3389, - 0, 3268, 3364, - 0, 3293, 3329, - 0, 3324, 3277, - 0, 3363, 3198, - 0, 3411, 3063, - 0, 3467, 2782, - 0, 3533, 0, - 0, 3608, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3185, 3454, - 0, 3186, 3454, - 0, 3186, 3453, - 0, 3187, 3453, - 0, 3187, 3452, - 0, 3188, 3451, - 0, 3189, 3450, - 0, 3191, 3449, - 0, 3193, 3447, - 0, 3196, 3444, - 0, 3200, 3440, - 0, 3205, 3435, - 0, 3212, 3428, - 0, 3221, 3419, - 0, 3233, 3406, - 0, 3248, 3389, - 0, 3268, 3364, - 0, 3293, 3329, - 0, 3324, 3278, - 0, 3363, 3198, - 0, 3411, 3064, - 0, 3467, 2783, - 0, 3533, 0, - 0, 3609, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3454, - 0, 3186, 3454, - 0, 3186, 3454, - 0, 3187, 3453, - 0, 3187, 3453, - 0, 3188, 3452, - 0, 3190, 3451, - 0, 3191, 3449, - 0, 3193, 3447, - 0, 3196, 3444, - 0, 3200, 3441, - 0, 3205, 3436, - 0, 3212, 3429, - 0, 3221, 3420, - 0, 3233, 3407, - 0, 3248, 3389, - 0, 3268, 3365, - 0, 3293, 3330, - 0, 3324, 3278, - 0, 3363, 3199, - 0, 3411, 3065, - 0, 3467, 2785, - 0, 3533, 0, - 0, 3609, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3185, 3456, - 0, 3185, 3456, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3185, 3455, - 0, 3186, 3455, - 0, 3186, 3455, - 0, 3186, 3454, - 0, 3187, 3454, - 0, 3187, 3453, - 0, 3188, 3452, - 0, 3190, 3451, - 0, 3191, 3450, - 0, 3194, 3448, - 0, 3197, 3445, - 0, 3200, 3441, - 0, 3206, 3436, - 0, 3212, 3429, - 0, 3221, 3420, - 0, 3233, 3407, - 0, 3248, 3390, - 0, 3268, 3365, - 0, 3293, 3331, - 0, 3325, 3279, - 0, 3363, 3200, - 0, 3411, 3066, - 0, 3467, 2787, - 0, 3533, 0, - 0, 3609, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3185, 3456, - 0, 3185, 3456, - 0, 3185, 3456, - 0, 3185, 3456, - 0, 3185, 3456, - 0, 3186, 3456, - 0, 3186, 3456, - 0, 3186, 3455, - 0, 3186, 3455, - 0, 3187, 3455, - 0, 3188, 3454, - 0, 3189, 3453, - 0, 3190, 3452, - 0, 3192, 3450, - 0, 3194, 3448, - 0, 3197, 3446, - 0, 3201, 3442, - 0, 3206, 3437, - 0, 3213, 3430, - 0, 3222, 3421, - 0, 3233, 3408, - 0, 3249, 3391, - 0, 3268, 3366, - 0, 3293, 3331, - 0, 3325, 3280, - 0, 3364, 3201, - 0, 3411, 3067, - 0, 3467, 2790, - 0, 3533, 0, - 0, 3609, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3185, 3457, - 0, 3185, 3457, - 0, 3185, 3457, - 0, 3185, 3457, - 0, 3186, 3457, - 0, 3186, 3457, - 0, 3186, 3457, - 0, 3186, 3456, - 0, 3187, 3456, - 0, 3187, 3456, - 0, 3188, 3455, - 0, 3189, 3454, - 0, 3190, 3453, - 0, 3192, 3451, - 0, 3194, 3449, - 0, 3197, 3447, - 0, 3201, 3443, - 0, 3206, 3438, - 0, 3213, 3431, - 0, 3222, 3422, - 0, 3234, 3409, - 0, 3249, 3392, - 0, 3268, 3368, - 0, 3293, 3333, - 0, 3325, 3282, - 0, 3364, 3203, - 0, 3411, 3070, - 0, 3467, 2794, - 0, 3533, 0, - 0, 3609, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3186, 3459, - 0, 3186, 3458, - 0, 3186, 3458, - 0, 3186, 3458, - 0, 3186, 3458, - 0, 3186, 3458, - 0, 3186, 3458, - 0, 3187, 3458, - 0, 3187, 3457, - 0, 3188, 3457, - 0, 3188, 3456, - 0, 3189, 3455, - 0, 3190, 3454, - 0, 3192, 3453, - 0, 3194, 3451, - 0, 3197, 3448, - 0, 3201, 3444, - 0, 3206, 3439, - 0, 3213, 3432, - 0, 3222, 3423, - 0, 3234, 3411, - 0, 3249, 3393, - 0, 3269, 3369, - 0, 3294, 3334, - 0, 3325, 3283, - 0, 3364, 3205, - 0, 3411, 3073, - 0, 3468, 2800, - 0, 3533, 0, - 0, 3609, 0, - 0, 3693, 0, - 0, 3786, 0, - 0, 3186, 3460, - 0, 3186, 3460, - 0, 3186, 3460, - 0, 3186, 3460, - 0, 3186, 3460, - 0, 3187, 3460, - 0, 3187, 3460, - 0, 3187, 3459, - 0, 3187, 3459, - 0, 3188, 3458, - 0, 3189, 3458, - 0, 3190, 3457, - 0, 3191, 3456, - 0, 3193, 3454, - 0, 3195, 3452, - 0, 3198, 3450, - 0, 3202, 3446, - 0, 3207, 3441, - 0, 3214, 3434, - 0, 3223, 3425, - 0, 3234, 3413, - 0, 3250, 3395, - 0, 3269, 3371, - 0, 3294, 3337, - 0, 3325, 3286, - 0, 3364, 3208, - 0, 3411, 3077, - 0, 3468, 2807, - 0, 3534, 0, - 0, 3609, 0, - 0, 3694, 0, - 0, 3787, 0, - 0, 3187, 3462, - 0, 3187, 3462, - 0, 3187, 3462, - 0, 3187, 3462, - 0, 3187, 3462, - 0, 3187, 3462, - 0, 3187, 3462, - 0, 3188, 3462, - 0, 3188, 3461, - 0, 3189, 3461, - 0, 3189, 3460, - 0, 3190, 3459, - 0, 3191, 3458, - 0, 3193, 3457, - 0, 3195, 3455, - 0, 3198, 3452, - 0, 3202, 3448, - 0, 3207, 3443, - 0, 3214, 3437, - 0, 3223, 3428, - 0, 3235, 3415, - 0, 3250, 3398, - 0, 3270, 3374, - 0, 3295, 3339, - 0, 3326, 3289, - 0, 3365, 3212, - 0, 3412, 3082, - 0, 3468, 2816, - 0, 3534, 0, - 0, 3609, 0, - 0, 3694, 0, - 0, 3787, 0, - 0, 3187, 3465, - 0, 3187, 3465, - 0, 3187, 3465, - 0, 3188, 3465, - 0, 3188, 3465, - 0, 3188, 3465, - 0, 3188, 3465, - 0, 3188, 3465, - 0, 3189, 3464, - 0, 3189, 3464, - 0, 3190, 3463, - 0, 3191, 3462, - 0, 3192, 3461, - 0, 3194, 3460, - 0, 3196, 3458, - 0, 3199, 3455, - 0, 3203, 3451, - 0, 3208, 3446, - 0, 3215, 3440, - 0, 3224, 3431, - 0, 3235, 3418, - 0, 3251, 3401, - 0, 3270, 3377, - 0, 3295, 3343, - 0, 3326, 3293, - 0, 3365, 3217, - 0, 3412, 3089, - 0, 3469, 2829, - 0, 3534, 0, - 0, 3610, 0, - 0, 3694, 0, - 0, 3787, 0, - 0, 3188, 3469, - 0, 3188, 3469, - 0, 3188, 3469, - 0, 3189, 3469, - 0, 3189, 3469, - 0, 3189, 3469, - 0, 3189, 3469, - 0, 3189, 3468, - 0, 3190, 3468, - 0, 3190, 3468, - 0, 3191, 3467, - 0, 3192, 3466, - 0, 3193, 3465, - 0, 3195, 3464, - 0, 3197, 3462, - 0, 3200, 3459, - 0, 3204, 3455, - 0, 3209, 3451, - 0, 3216, 3444, - 0, 3225, 3435, - 0, 3236, 3423, - 0, 3252, 3406, - 0, 3271, 3382, - 0, 3296, 3349, - 0, 3327, 3299, - 0, 3366, 3224, - 0, 3413, 3098, - 0, 3469, 2844, - 0, 3535, 106, - 0, 3610, 0, - 0, 3694, 0, - 0, 3787, 0, - 0, 3190, 3475, - 0, 3190, 3475, - 0, 3190, 3474, - 0, 3190, 3474, - 0, 3190, 3474, - 0, 3190, 3474, - 0, 3190, 3474, - 0, 3191, 3474, - 0, 3191, 3473, - 0, 3192, 3473, - 0, 3192, 3472, - 0, 3193, 3471, - 0, 3195, 3470, - 0, 3196, 3469, - 0, 3198, 3467, - 0, 3201, 3464, - 0, 3205, 3461, - 0, 3210, 3456, - 0, 3217, 3449, - 0, 3226, 3441, - 0, 3238, 3429, - 0, 3253, 3412, - 0, 3272, 3389, - 0, 3297, 3355, - 0, 3328, 3307, - 0, 3367, 3233, - 0, 3414, 3109, - 0, 3470, 2865, - 0, 3535, 1466, - 0, 3611, 0, - 0, 3695, 0, - 0, 3788, 0, - 0, 3192, 3481, - 0, 3192, 3481, - 0, 3192, 3481, - 0, 3192, 3481, - 0, 3192, 3481, - 0, 3192, 3481, - 0, 3192, 3481, - 0, 3193, 3481, - 0, 3193, 3480, - 0, 3193, 3480, - 0, 3194, 3479, - 0, 3195, 3478, - 0, 3196, 3477, - 0, 3198, 3476, - 0, 3200, 3474, - 0, 3203, 3471, - 0, 3207, 3468, - 0, 3212, 3463, - 0, 3219, 3457, - 0, 3228, 3448, - 0, 3239, 3436, - 0, 3254, 3420, - 0, 3274, 3397, - 0, 3298, 3364, - 0, 3329, 3317, - 0, 3368, 3244, - 0, 3415, 3125, - 0, 3471, 2891, - 0, 3536, 1839, - 0, 3611, 0, - 0, 3695, 0, - 0, 3788, 0, - 0, 3194, 3491, - 0, 3194, 3491, - 0, 3194, 3490, - 0, 3194, 3490, - 0, 3194, 3490, - 0, 3194, 3490, - 0, 3195, 3490, - 0, 3195, 3490, - 0, 3195, 3489, - 0, 3196, 3489, - 0, 3197, 3488, - 0, 3197, 3488, - 0, 3199, 3487, - 0, 3200, 3485, - 0, 3202, 3483, - 0, 3205, 3481, - 0, 3209, 3477, - 0, 3214, 3473, - 0, 3221, 3466, - 0, 3230, 3458, - 0, 3241, 3446, - 0, 3256, 3430, - 0, 3276, 3408, - 0, 3300, 3376, - 0, 3331, 3330, - 0, 3370, 3259, - 0, 3416, 3144, - 0, 3472, 2923, - 0, 3537, 2093, - 0, 3612, 0, - 0, 3696, 0, - 0, 3789, 0, - 0, 3197, 3502, - 0, 3197, 3502, - 0, 3197, 3502, - 0, 3197, 3502, - 0, 3197, 3502, - 0, 3198, 3502, - 0, 3198, 3502, - 0, 3198, 3502, - 0, 3199, 3501, - 0, 3199, 3501, - 0, 3200, 3500, - 0, 3201, 3500, - 0, 3202, 3498, - 0, 3203, 3497, - 0, 3206, 3495, - 0, 3209, 3493, - 0, 3212, 3489, - 0, 3217, 3485, - 0, 3224, 3479, - 0, 3233, 3471, - 0, 3244, 3459, - 0, 3259, 3444, - 0, 3278, 3422, - 0, 3303, 3391, - 0, 3334, 3347, - 0, 3372, 3279, - 0, 3418, 3169, - 0, 3474, 2963, - 0, 3539, 2299, - 0, 3613, 0, - 0, 3697, 0, - 0, 3790, 0, - 0, 3201, 3518, - 0, 3201, 3518, - 0, 3202, 3518, - 0, 3202, 3518, - 0, 3202, 3518, - 0, 3202, 3517, - 0, 3202, 3517, - 0, 3202, 3517, - 0, 3203, 3517, - 0, 3203, 3516, - 0, 3204, 3516, - 0, 3205, 3515, - 0, 3206, 3514, - 0, 3208, 3513, - 0, 3210, 3511, - 0, 3213, 3508, - 0, 3216, 3505, - 0, 3221, 3501, - 0, 3228, 3495, - 0, 3237, 3487, - 0, 3248, 3476, - 0, 3263, 3461, - 0, 3282, 3440, - 0, 3306, 3411, - 0, 3337, 3368, - 0, 3375, 3304, - 0, 3421, 3201, - 0, 3476, 3012, - 0, 3541, 2479, - 0, 3615, 0, - 0, 3699, 0, - 0, 3791, 0, - 0, 3207, 3538, - 0, 3207, 3538, - 0, 3207, 3537, - 0, 3207, 3537, - 0, 3207, 3537, - 0, 3207, 3537, - 0, 3208, 3537, - 0, 3208, 3537, - 0, 3208, 3537, - 0, 3209, 3536, - 0, 3210, 3536, - 0, 3210, 3535, - 0, 3212, 3534, - 0, 3213, 3533, - 0, 3215, 3531, - 0, 3218, 3529, - 0, 3222, 3526, - 0, 3227, 3521, - 0, 3233, 3516, - 0, 3242, 3508, - 0, 3253, 3498, - 0, 3268, 3483, - 0, 3287, 3464, - 0, 3311, 3436, - 0, 3341, 3395, - 0, 3379, 3335, - 0, 3424, 3240, - 0, 3479, 3069, - 0, 3544, 2644, - 0, 3617, 0, - 0, 3701, 0, - 0, 3792, 0, - 1728, 3214, 3563, - 1725, 3214, 3563, - 1722, 3215, 3563, - 1717, 3215, 3563, - 1710, 3215, 3563, - 1701, 3215, 3562, - 1688, 3215, 3562, - 1671, 3215, 3562, - 1647, 3216, 3562, - 1612, 3216, 3561, - 1562, 3217, 3561, - 1483, 3218, 3560, - 1352, 3219, 3559, - 1082, 3220, 3558, - 0, 3223, 3557, - 0, 3225, 3554, - 0, 3229, 3551, - 0, 3234, 3548, - 0, 3240, 3542, - 0, 3249, 3535, - 0, 3260, 3525, - 0, 3274, 3512, - 0, 3293, 3493, - 0, 3317, 3467, - 0, 3346, 3429, - 0, 3384, 3374, - 0, 3429, 3287, - 0, 3483, 3137, - 0, 3547, 2799, - 0, 3620, 0, - 0, 3703, 0, - 0, 3794, 0, - 2722, 3224, 3594, - 2721, 3224, 3594, - 2721, 3224, 3594, - 2720, 3224, 3594, - 2720, 3224, 3594, - 2719, 3225, 3594, - 2717, 3225, 3594, - 2716, 3225, 3594, - 2713, 3225, 3593, - 2710, 3226, 3593, - 2706, 3227, 3593, - 2700, 3227, 3592, - 2692, 3229, 3591, - 2681, 3230, 3590, - 2666, 3232, 3589, - 2646, 3235, 3587, - 2617, 3238, 3584, - 2574, 3243, 3580, - 2511, 3250, 3575, - 2410, 3258, 3569, - 2224, 3269, 3559, - 1718, 3283, 3547, - 0, 3301, 3530, - 0, 3324, 3506, - 0, 3354, 3471, - 0, 3390, 3421, - 0, 3435, 3343, - 0, 3489, 3214, - 0, 3552, 2948, - 0, 3624, 0, - 0, 3706, 0, - 0, 3797, 0, - 3077, 3237, 3634, - 3077, 3237, 3634, - 3077, 3237, 3633, - 3077, 3237, 3633, - 3076, 3237, 3633, - 3076, 3237, 3633, - 3075, 3237, 3633, - 3075, 3238, 3633, - 3073, 3238, 3633, - 3072, 3239, 3632, - 3070, 3239, 3632, - 3068, 3240, 3631, - 3064, 3241, 3631, - 3059, 3243, 3630, - 3053, 3245, 3628, - 3044, 3247, 3626, - 3032, 3251, 3624, - 3016, 3255, 3621, - 2993, 3262, 3616, - 2960, 3270, 3610, - 2913, 3280, 3602, - 2840, 3294, 3590, - 2720, 3312, 3575, - 2485, 3335, 3553, - 1404, 3363, 3522, - 0, 3399, 3477, - 0, 3443, 3409, - 0, 3496, 3299, - 0, 3558, 3092, - 0, 3630, 2417, - 0, 3711, 0, - 0, 3801, 0, - 3325, 3253, 3681, - 3325, 3253, 3681, - 3325, 3253, 3681, - 3325, 3253, 3681, - 3325, 3254, 3681, - 3325, 3254, 3681, - 3324, 3254, 3681, - 3324, 3254, 3681, - 3323, 3254, 3680, - 3322, 3255, 3680, - 3321, 3255, 3680, - 3320, 3256, 3679, - 3318, 3257, 3678, - 3315, 3259, 3678, - 3311, 3261, 3676, - 3306, 3263, 3675, - 3300, 3267, 3672, - 3291, 3271, 3669, - 3278, 3277, 3665, - 3261, 3285, 3660, - 3237, 3295, 3652, - 3203, 3308, 3642, - 3153, 3326, 3628, - 3076, 3348, 3609, - 2947, 3376, 3582, - 2685, 3411, 3543, - 0, 3454, 3485, - 0, 3505, 3394, - 0, 3566, 3233, - 0, 3637, 2852, - 0, 3717, 0, - 0, 3805, 0, - 3528, 3274, 3738, - 3528, 3274, 3738, - 3528, 3274, 3738, - 3528, 3274, 3738, - 3528, 3275, 3738, - 3528, 3275, 3738, - 3527, 3275, 3737, - 3527, 3275, 3737, - 3527, 3275, 3737, - 3526, 3276, 3737, - 3525, 3276, 3737, - 3525, 3277, 3736, - 3523, 3278, 3735, - 3522, 3280, 3735, - 3519, 3281, 3734, - 3516, 3284, 3732, - 3512, 3287, 3730, - 3506, 3291, 3728, - 3499, 3297, 3724, - 3488, 3305, 3719, - 3474, 3314, 3713, - 3454, 3327, 3704, - 3426, 3344, 3692, - 3385, 3365, 3675, - 3324, 3392, 3652, - 3228, 3426, 3618, - 3055, 3467, 3570, - 2618, 3517, 3495, - 0, 3577, 3371, - 0, 3646, 3125, - 0, 3724, 1639, - 0, 3812, 0, - 3707, 3301, 3804, - 3707, 3301, 3804, - 3707, 3301, 3804, - 3707, 3301, 3804, - 3707, 3301, 3804, - 3706, 3301, 3804, - 3706, 3302, 3804, - 3706, 3302, 3804, - 3706, 3302, 3803, - 3705, 3303, 3803, - 3705, 3303, 3803, - 3704, 3304, 3803, - 3703, 3305, 3802, - 3702, 3306, 3801, - 3701, 3308, 3800, - 3699, 3310, 3799, - 3696, 3313, 3797, - 3692, 3317, 3795, - 3687, 3323, 3792, - 3680, 3330, 3788, - 3671, 3339, 3782, - 3658, 3351, 3775, - 3640, 3367, 3764, - 3615, 3387, 3750, - 3580, 3413, 3730, - 3527, 3445, 3703, - 3446, 3485, 3663, - 3308, 3533, 3603, - 3017, 3591, 3508, - 0, 3658, 3340, - 0, 3734, 2924, - 0, 3820, 0, - 3871, 3334, 3880, - 3871, 3334, 3880, - 3871, 3335, 3880, - 3871, 3335, 3880, - 3871, 3335, 3880, - 3871, 3335, 3880, - 3870, 3335, 3880, - 3870, 3335, 3879, - 3870, 3335, 3879, - 3870, 3336, 3879, - 3869, 3336, 3879, - 3869, 3337, 3879, - 3868, 3338, 3878, - 3868, 3339, 3878, - 3867, 3341, 3877, - 3865, 3343, 3876, - 3863, 3346, 3874, - 3861, 3349, 3872, - 3857, 3354, 3870, - 3852, 3361, 3866, - 3846, 3370, 3862, - 3837, 3381, 3855, - 3825, 3396, 3846, - 3809, 3415, 3835, - 3786, 3439, 3818, - 3753, 3470, 3796, - 3706, 3507, 3763, - 3633, 3554, 3716, - 3513, 3609, 3644, - 3279, 3673, 3525, - 2216, 3748, 3294, - 0, 3831, 2303, - 4025, 3376, 3965, - 4025, 3376, 3965, - 4025, 3376, 3965, - 4025, 3376, 3965, - 4025, 3376, 3965, - 4025, 3376, 3965, - 4025, 3376, 3964, - 4025, 3376, 3964, - 4025, 3377, 3964, - 4025, 3377, 3964, - 4024, 3377, 3964, - 4024, 3378, 3964, - 4024, 3379, 3963, - 4023, 3380, 3963, - 4022, 3381, 3962, - 4021, 3383, 3961, - 4020, 3386, 3960, - 4018, 3389, 3958, - 4016, 3394, 3956, - 4012, 3400, 3953, - 4008, 3408, 3950, - 4002, 3418, 3944, - 3993, 3432, 3937, - 3982, 3450, 3928, - 3967, 3472, 3914, - 3945, 3501, 3896, - 3914, 3536, 3870, - 3870, 3579, 3833, - 3803, 3632, 3779, - 3693, 3693, 3693, - 3489, 3765, 3547, - 2837, 3845, 3224, - 4095, 3425, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3426, 4058, - 4095, 3427, 4057, - 4095, 3427, 4057, - 4095, 3428, 4057, - 4095, 3428, 4057, - 4095, 3429, 4056, - 4095, 3431, 4056, - 4095, 3432, 4055, - 4095, 3435, 4054, - 4095, 3438, 4053, - 4095, 3442, 4051, - 4095, 3447, 4049, - 4095, 3455, 4046, - 4095, 3464, 4041, - 4095, 3476, 4036, - 4095, 3492, 4028, - 4095, 3513, 4017, - 4095, 3539, 4003, - 4095, 3572, 3982, - 4067, 3612, 3954, - 4024, 3661, 3913, - 3961, 3719, 3851, - 3858, 3787, 3752, - 3671, 3864, 3575, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3485, 4095, - 4095, 3486, 4095, - 4095, 3486, 4095, - 4095, 3486, 4095, - 4095, 3487, 4095, - 4095, 3488, 4095, - 4095, 3489, 4095, - 4095, 3491, 4095, - 4095, 3493, 4095, - 4095, 3495, 4095, - 4095, 3499, 4095, - 4095, 3504, 4095, - 4095, 3510, 4095, - 4095, 3519, 4095, - 4095, 3530, 4095, - 4095, 3544, 4095, - 4095, 3562, 4095, - 4095, 3586, 4095, - 4095, 3615, 4095, - 4095, 3652, 4077, - 4095, 3697, 4046, - 4095, 3751, 4001, - 4095, 3814, 3932, - 4014, 3887, 3821, - 0, 3316, 3586, - 0, 3316, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3318, 3584, - 0, 3318, 3584, - 0, 3319, 3583, - 0, 3320, 3582, - 0, 3321, 3581, - 0, 3323, 3580, - 0, 3325, 3578, - 0, 3328, 3575, - 0, 3332, 3571, - 0, 3337, 3566, - 0, 3344, 3559, - 0, 3353, 3550, - 0, 3365, 3537, - 0, 3380, 3520, - 0, 3400, 3495, - 0, 3425, 3460, - 0, 3456, 3408, - 0, 3495, 3328, - 0, 3543, 3193, - 0, 3599, 2911, - 0, 3665, 0, - 0, 3740, 0, - 0, 3825, 0, - 0, 3316, 3586, - 0, 3316, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3318, 3585, - 0, 3318, 3584, - 0, 3319, 3583, - 0, 3320, 3583, - 0, 3321, 3581, - 0, 3323, 3580, - 0, 3325, 3578, - 0, 3328, 3575, - 0, 3332, 3571, - 0, 3337, 3566, - 0, 3344, 3559, - 0, 3353, 3550, - 0, 3365, 3537, - 0, 3380, 3520, - 0, 3400, 3495, - 0, 3425, 3460, - 0, 3456, 3408, - 0, 3495, 3328, - 0, 3543, 3193, - 0, 3599, 2911, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3316, 3586, - 0, 3316, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3318, 3585, - 0, 3318, 3585, - 0, 3318, 3584, - 0, 3319, 3583, - 0, 3320, 3583, - 0, 3321, 3581, - 0, 3323, 3580, - 0, 3325, 3578, - 0, 3328, 3575, - 0, 3332, 3571, - 0, 3337, 3566, - 0, 3344, 3560, - 0, 3353, 3550, - 0, 3365, 3538, - 0, 3380, 3520, - 0, 3400, 3495, - 0, 3425, 3460, - 0, 3456, 3408, - 0, 3495, 3329, - 0, 3543, 3194, - 0, 3599, 2911, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3316, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3585, - 0, 3317, 3585, - 0, 3318, 3585, - 0, 3318, 3585, - 0, 3318, 3584, - 0, 3319, 3584, - 0, 3320, 3583, - 0, 3321, 3582, - 0, 3323, 3580, - 0, 3325, 3578, - 0, 3328, 3575, - 0, 3332, 3571, - 0, 3337, 3566, - 0, 3344, 3560, - 0, 3353, 3550, - 0, 3365, 3538, - 0, 3380, 3520, - 0, 3400, 3495, - 0, 3425, 3460, - 0, 3456, 3409, - 0, 3495, 3329, - 0, 3543, 3194, - 0, 3599, 2912, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3585, - 0, 3318, 3585, - 0, 3318, 3585, - 0, 3318, 3584, - 0, 3319, 3584, - 0, 3320, 3583, - 0, 3321, 3582, - 0, 3323, 3580, - 0, 3325, 3578, - 0, 3328, 3575, - 0, 3332, 3572, - 0, 3337, 3567, - 0, 3344, 3560, - 0, 3353, 3551, - 0, 3365, 3538, - 0, 3380, 3520, - 0, 3400, 3496, - 0, 3425, 3460, - 0, 3456, 3409, - 0, 3495, 3329, - 0, 3543, 3194, - 0, 3599, 2912, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3318, 3585, - 0, 3318, 3585, - 0, 3319, 3584, - 0, 3319, 3584, - 0, 3320, 3583, - 0, 3321, 3582, - 0, 3323, 3580, - 0, 3325, 3578, - 0, 3328, 3576, - 0, 3332, 3572, - 0, 3337, 3567, - 0, 3344, 3560, - 0, 3353, 3551, - 0, 3365, 3538, - 0, 3380, 3520, - 0, 3400, 3496, - 0, 3425, 3461, - 0, 3456, 3409, - 0, 3495, 3329, - 0, 3543, 3194, - 0, 3599, 2913, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3318, 3586, - 0, 3318, 3585, - 0, 3319, 3585, - 0, 3319, 3584, - 0, 3320, 3583, - 0, 3321, 3582, - 0, 3323, 3581, - 0, 3325, 3579, - 0, 3328, 3576, - 0, 3332, 3572, - 0, 3337, 3567, - 0, 3344, 3560, - 0, 3353, 3551, - 0, 3365, 3538, - 0, 3380, 3521, - 0, 3400, 3496, - 0, 3425, 3461, - 0, 3456, 3409, - 0, 3495, 3330, - 0, 3543, 3195, - 0, 3599, 2914, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3317, 3586, - 0, 3318, 3586, - 0, 3318, 3585, - 0, 3319, 3585, - 0, 3319, 3584, - 0, 3320, 3584, - 0, 3322, 3582, - 0, 3323, 3581, - 0, 3325, 3579, - 0, 3328, 3576, - 0, 3332, 3572, - 0, 3338, 3567, - 0, 3344, 3561, - 0, 3353, 3551, - 0, 3365, 3539, - 0, 3380, 3521, - 0, 3400, 3496, - 0, 3425, 3461, - 0, 3456, 3410, - 0, 3495, 3330, - 0, 3543, 3196, - 0, 3599, 2915, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3318, 3587, - 0, 3318, 3586, - 0, 3318, 3586, - 0, 3319, 3585, - 0, 3319, 3585, - 0, 3320, 3584, - 0, 3322, 3583, - 0, 3323, 3581, - 0, 3326, 3579, - 0, 3328, 3576, - 0, 3332, 3573, - 0, 3338, 3568, - 0, 3344, 3561, - 0, 3353, 3552, - 0, 3365, 3539, - 0, 3380, 3521, - 0, 3400, 3497, - 0, 3425, 3462, - 0, 3457, 3410, - 0, 3495, 3331, - 0, 3543, 3197, - 0, 3599, 2917, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3317, 3587, - 0, 3318, 3587, - 0, 3318, 3587, - 0, 3318, 3586, - 0, 3319, 3586, - 0, 3320, 3585, - 0, 3321, 3584, - 0, 3322, 3583, - 0, 3323, 3582, - 0, 3326, 3580, - 0, 3329, 3577, - 0, 3333, 3573, - 0, 3338, 3568, - 0, 3345, 3561, - 0, 3354, 3552, - 0, 3365, 3540, - 0, 3381, 3522, - 0, 3400, 3498, - 0, 3425, 3463, - 0, 3457, 3411, - 0, 3496, 3332, - 0, 3543, 3198, - 0, 3599, 2919, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3317, 3588, - 0, 3318, 3588, - 0, 3318, 3588, - 0, 3318, 3587, - 0, 3319, 3587, - 0, 3319, 3587, - 0, 3320, 3586, - 0, 3321, 3585, - 0, 3322, 3584, - 0, 3324, 3583, - 0, 3326, 3580, - 0, 3329, 3578, - 0, 3333, 3574, - 0, 3338, 3569, - 0, 3345, 3562, - 0, 3354, 3553, - 0, 3365, 3540, - 0, 3381, 3523, - 0, 3400, 3498, - 0, 3425, 3464, - 0, 3457, 3412, - 0, 3496, 3333, - 0, 3543, 3200, - 0, 3599, 2922, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3317, 3589, - 0, 3317, 3589, - 0, 3317, 3589, - 0, 3317, 3589, - 0, 3318, 3589, - 0, 3318, 3589, - 0, 3318, 3589, - 0, 3318, 3589, - 0, 3318, 3588, - 0, 3319, 3588, - 0, 3319, 3588, - 0, 3320, 3587, - 0, 3321, 3586, - 0, 3322, 3585, - 0, 3324, 3583, - 0, 3326, 3581, - 0, 3329, 3579, - 0, 3333, 3575, - 0, 3338, 3570, - 0, 3345, 3563, - 0, 3354, 3554, - 0, 3366, 3541, - 0, 3381, 3524, - 0, 3401, 3500, - 0, 3426, 3465, - 0, 3457, 3414, - 0, 3496, 3335, - 0, 3543, 3202, - 0, 3600, 2927, - 0, 3665, 0, - 0, 3741, 0, - 0, 3825, 0, - 0, 3318, 3591, - 0, 3318, 3591, - 0, 3318, 3591, - 0, 3318, 3590, - 0, 3318, 3590, - 0, 3318, 3590, - 0, 3318, 3590, - 0, 3318, 3590, - 0, 3319, 3590, - 0, 3319, 3589, - 0, 3320, 3589, - 0, 3320, 3588, - 0, 3321, 3587, - 0, 3323, 3586, - 0, 3324, 3585, - 0, 3326, 3583, - 0, 3329, 3580, - 0, 3333, 3576, - 0, 3338, 3571, - 0, 3345, 3565, - 0, 3354, 3555, - 0, 3366, 3543, - 0, 3381, 3525, - 0, 3401, 3501, - 0, 3426, 3466, - 0, 3457, 3415, - 0, 3496, 3337, - 0, 3543, 3205, - 0, 3600, 2932, - 0, 3666, 0, - 0, 3741, 0, - 0, 3826, 0, - 0, 3318, 3592, - 0, 3318, 3592, - 0, 3318, 3592, - 0, 3318, 3592, - 0, 3318, 3592, - 0, 3318, 3592, - 0, 3319, 3592, - 0, 3319, 3592, - 0, 3319, 3591, - 0, 3320, 3591, - 0, 3320, 3591, - 0, 3321, 3590, - 0, 3322, 3589, - 0, 3323, 3588, - 0, 3325, 3586, - 0, 3327, 3584, - 0, 3330, 3582, - 0, 3334, 3578, - 0, 3339, 3573, - 0, 3346, 3566, - 0, 3355, 3557, - 0, 3366, 3545, - 0, 3382, 3527, - 0, 3401, 3503, - 0, 3426, 3469, - 0, 3458, 3418, - 0, 3496, 3340, - 0, 3544, 3209, - 0, 3600, 2939, - 0, 3666, 0, - 0, 3741, 0, - 0, 3826, 0, - 0, 3319, 3595, - 0, 3319, 3595, - 0, 3319, 3594, - 0, 3319, 3594, - 0, 3319, 3594, - 0, 3319, 3594, - 0, 3319, 3594, - 0, 3319, 3594, - 0, 3320, 3594, - 0, 3320, 3593, - 0, 3321, 3593, - 0, 3321, 3592, - 0, 3322, 3591, - 0, 3324, 3590, - 0, 3325, 3589, - 0, 3327, 3587, - 0, 3330, 3584, - 0, 3334, 3580, - 0, 3339, 3575, - 0, 3346, 3569, - 0, 3355, 3560, - 0, 3367, 3547, - 0, 3382, 3530, - 0, 3402, 3506, - 0, 3427, 3472, - 0, 3458, 3421, - 0, 3497, 3344, - 0, 3544, 3214, - 0, 3600, 2948, - 0, 3666, 0, - 0, 3741, 0, - 0, 3826, 0, - 0, 3319, 3598, - 0, 3319, 3597, - 0, 3320, 3597, - 0, 3320, 3597, - 0, 3320, 3597, - 0, 3320, 3597, - 0, 3320, 3597, - 0, 3320, 3597, - 0, 3320, 3597, - 0, 3321, 3596, - 0, 3321, 3596, - 0, 3322, 3595, - 0, 3323, 3594, - 0, 3324, 3593, - 0, 3326, 3592, - 0, 3328, 3590, - 0, 3331, 3587, - 0, 3335, 3583, - 0, 3340, 3579, - 0, 3347, 3572, - 0, 3356, 3563, - 0, 3368, 3550, - 0, 3383, 3533, - 0, 3402, 3510, - 0, 3427, 3475, - 0, 3459, 3426, - 0, 3497, 3349, - 0, 3544, 3221, - 0, 3601, 2961, - 0, 3666, 0, - 0, 3742, 0, - 0, 3826, 0, - 0, 3320, 3601, - 0, 3320, 3601, - 0, 3321, 3601, - 0, 3321, 3601, - 0, 3321, 3601, - 0, 3321, 3601, - 0, 3321, 3601, - 0, 3321, 3601, - 0, 3321, 3601, - 0, 3322, 3600, - 0, 3322, 3600, - 0, 3323, 3599, - 0, 3324, 3598, - 0, 3325, 3597, - 0, 3327, 3596, - 0, 3329, 3594, - 0, 3332, 3591, - 0, 3336, 3587, - 0, 3341, 3583, - 0, 3348, 3576, - 0, 3357, 3567, - 0, 3368, 3555, - 0, 3384, 3538, - 0, 3403, 3514, - 0, 3428, 3481, - 0, 3459, 3431, - 0, 3498, 3356, - 0, 3545, 3230, - 0, 3601, 2976, - 0, 3667, 238, - 0, 3742, 0, - 0, 3826, 0, - 0, 3322, 3607, - 0, 3322, 3607, - 0, 3322, 3607, - 0, 3322, 3607, - 0, 3322, 3606, - 0, 3322, 3606, - 0, 3322, 3606, - 0, 3323, 3606, - 0, 3323, 3606, - 0, 3323, 3605, - 0, 3324, 3605, - 0, 3324, 3604, - 0, 3325, 3604, - 0, 3327, 3603, - 0, 3328, 3601, - 0, 3330, 3599, - 0, 3333, 3596, - 0, 3337, 3593, - 0, 3342, 3588, - 0, 3349, 3582, - 0, 3358, 3573, - 0, 3370, 3561, - 0, 3385, 3544, - 0, 3404, 3521, - 0, 3429, 3487, - 0, 3460, 3439, - 0, 3499, 3365, - 0, 3546, 3241, - 0, 3602, 2997, - 0, 3668, 1599, - 0, 3743, 0, - 0, 3827, 0, - 0, 3324, 3614, - 0, 3324, 3614, - 0, 3324, 3614, - 0, 3324, 3613, - 0, 3324, 3613, - 0, 3324, 3613, - 0, 3324, 3613, - 0, 3324, 3613, - 0, 3325, 3613, - 0, 3325, 3612, - 0, 3326, 3612, - 0, 3326, 3611, - 0, 3327, 3611, - 0, 3328, 3609, - 0, 3330, 3608, - 0, 3332, 3606, - 0, 3335, 3603, - 0, 3339, 3600, - 0, 3344, 3595, - 0, 3351, 3589, - 0, 3360, 3580, - 0, 3371, 3568, - 0, 3386, 3552, - 0, 3406, 3529, - 0, 3431, 3496, - 0, 3462, 3449, - 0, 3500, 3376, - 0, 3547, 3257, - 0, 3603, 3023, - 0, 3668, 1971, - 0, 3743, 0, - 0, 3827, 0, - 0, 3326, 3623, - 0, 3326, 3623, - 0, 3326, 3623, - 0, 3326, 3623, - 0, 3326, 3622, - 0, 3326, 3622, - 0, 3327, 3622, - 0, 3327, 3622, - 0, 3327, 3622, - 0, 3327, 3621, - 0, 3328, 3621, - 0, 3329, 3620, - 0, 3330, 3620, - 0, 3331, 3619, - 0, 3332, 3617, - 0, 3335, 3615, - 0, 3337, 3613, - 0, 3341, 3609, - 0, 3346, 3605, - 0, 3353, 3598, - 0, 3362, 3590, - 0, 3374, 3578, - 0, 3388, 3562, - 0, 3408, 3540, - 0, 3432, 3508, - 0, 3463, 3462, - 0, 3502, 3392, - 0, 3548, 3276, - 0, 3604, 3055, - 0, 3669, 2225, - 0, 3744, 0, - 0, 3828, 0, - 0, 3329, 3635, - 0, 3329, 3635, - 0, 3329, 3634, - 0, 3329, 3634, - 0, 3329, 3634, - 0, 3330, 3634, - 0, 3330, 3634, - 0, 3330, 3634, - 0, 3330, 3634, - 0, 3331, 3633, - 0, 3331, 3633, - 0, 3332, 3632, - 0, 3333, 3632, - 0, 3334, 3631, - 0, 3336, 3629, - 0, 3338, 3627, - 0, 3341, 3625, - 0, 3344, 3622, - 0, 3349, 3617, - 0, 3356, 3611, - 0, 3365, 3603, - 0, 3376, 3591, - 0, 3391, 3576, - 0, 3410, 3554, - 0, 3435, 3523, - 0, 3466, 3479, - 0, 3504, 3411, - 0, 3550, 3301, - 0, 3606, 3095, - 0, 3671, 2431, - 0, 3746, 0, - 0, 3829, 0, - 0, 3333, 3650, - 0, 3333, 3650, - 0, 3334, 3650, - 0, 3334, 3650, - 0, 3334, 3650, - 0, 3334, 3650, - 0, 3334, 3649, - 0, 3334, 3649, - 0, 3334, 3649, - 0, 3335, 3649, - 0, 3335, 3648, - 0, 3336, 3648, - 0, 3337, 3647, - 0, 3338, 3646, - 0, 3340, 3645, - 0, 3342, 3643, - 0, 3345, 3641, - 0, 3349, 3637, - 0, 3354, 3633, - 0, 3360, 3627, - 0, 3369, 3619, - 0, 3380, 3608, - 0, 3395, 3593, - 0, 3414, 3572, - 0, 3438, 3543, - 0, 3469, 3500, - 0, 3507, 3436, - 0, 3553, 3333, - 0, 3608, 3144, - 0, 3673, 2611, - 0, 3747, 0, - 0, 3831, 0, - 0, 3339, 3670, - 0, 3339, 3670, - 0, 3339, 3670, - 0, 3339, 3670, - 0, 3339, 3670, - 0, 3339, 3669, - 0, 3340, 3669, - 0, 3340, 3669, - 0, 3340, 3669, - 0, 3340, 3669, - 0, 3341, 3668, - 0, 3342, 3668, - 0, 3343, 3667, - 0, 3344, 3666, - 0, 3345, 3665, - 0, 3347, 3663, - 0, 3350, 3661, - 0, 3354, 3658, - 0, 3359, 3654, - 0, 3365, 3648, - 0, 3374, 3640, - 0, 3385, 3630, - 0, 3400, 3616, - 0, 3419, 3596, - 0, 3443, 3568, - 0, 3473, 3527, - 0, 3511, 3467, - 0, 3556, 3372, - 0, 3611, 3202, - 0, 3676, 2776, - 0, 3750, 0, - 0, 3833, 0, - 1862, 3346, 3695, - 1860, 3347, 3695, - 1858, 3347, 3695, - 1854, 3347, 3695, - 1849, 3347, 3695, - 1842, 3347, 3695, - 1833, 3347, 3695, - 1821, 3347, 3694, - 1803, 3347, 3694, - 1779, 3348, 3694, - 1744, 3348, 3693, - 1694, 3349, 3693, - 1616, 3350, 3692, - 1484, 3351, 3691, - 1214, 3353, 3690, - 0, 3355, 3689, - 0, 3357, 3686, - 0, 3361, 3684, - 0, 3366, 3680, - 0, 3372, 3674, - 0, 3381, 3667, - 0, 3392, 3657, - 0, 3406, 3644, - 0, 3425, 3625, - 0, 3449, 3599, - 0, 3479, 3562, - 0, 3516, 3506, - 0, 3561, 3419, - 0, 3615, 3269, - 0, 3679, 2931, - 0, 3753, 0, - 0, 3835, 0, - 2854, 3356, 3727, - 2854, 3356, 3727, - 2853, 3356, 3726, - 2853, 3356, 3726, - 2853, 3356, 3726, - 2852, 3357, 3726, - 2851, 3357, 3726, - 2849, 3357, 3726, - 2848, 3357, 3726, - 2845, 3358, 3726, - 2842, 3358, 3725, - 2838, 3359, 3725, - 2832, 3360, 3724, - 2824, 3361, 3723, - 2813, 3362, 3722, - 2798, 3364, 3721, - 2778, 3367, 3719, - 2749, 3371, 3716, - 2706, 3375, 3712, - 2643, 3382, 3707, - 2542, 3390, 3701, - 2357, 3401, 3692, - 1850, 3415, 3679, - 0, 3433, 3662, - 0, 3456, 3638, - 0, 3486, 3604, - 0, 3522, 3553, - 0, 3567, 3476, - 0, 3621, 3346, - 0, 3684, 3080, - 0, 3757, 0, - 0, 3838, 0, - 3210, 3369, 3766, - 3209, 3369, 3766, - 3209, 3369, 3766, - 3209, 3369, 3766, - 3209, 3369, 3766, - 3209, 3369, 3765, - 3208, 3369, 3765, - 3207, 3370, 3765, - 3207, 3370, 3765, - 3206, 3370, 3765, - 3204, 3371, 3764, - 3202, 3371, 3764, - 3200, 3372, 3763, - 3196, 3373, 3763, - 3191, 3375, 3762, - 3185, 3377, 3760, - 3176, 3379, 3758, - 3164, 3383, 3756, - 3148, 3387, 3753, - 3125, 3394, 3748, - 3092, 3402, 3742, - 3045, 3412, 3734, - 2972, 3426, 3722, - 2852, 3444, 3707, - 2617, 3467, 3685, - 1537, 3495, 3654, - 0, 3531, 3609, - 0, 3575, 3542, - 0, 3628, 3431, - 0, 3690, 3224, - 0, 3762, 2549, - 0, 3843, 0, - 3457, 3385, 3813, - 3457, 3385, 3813, - 3457, 3385, 3813, - 3457, 3385, 3813, - 3457, 3385, 3813, - 3457, 3386, 3813, - 3457, 3386, 3813, - 3456, 3386, 3813, - 3456, 3386, 3813, - 3455, 3387, 3812, - 3454, 3387, 3812, - 3453, 3388, 3812, - 3452, 3388, 3811, - 3450, 3389, 3811, - 3447, 3391, 3810, - 3443, 3393, 3808, - 3439, 3395, 3807, - 3432, 3399, 3805, - 3423, 3403, 3802, - 3410, 3409, 3797, - 3393, 3417, 3792, - 3369, 3427, 3785, - 3335, 3441, 3774, - 3285, 3458, 3761, - 3208, 3480, 3741, - 3079, 3508, 3714, - 2817, 3543, 3675, - 0, 3586, 3617, - 0, 3637, 3526, - 0, 3698, 3365, - 0, 3769, 2984, - 0, 3849, 0, - 3660, 3406, 3870, - 3660, 3406, 3870, - 3660, 3406, 3870, - 3660, 3406, 3870, - 3660, 3407, 3870, - 3660, 3407, 3870, - 3660, 3407, 3870, - 3660, 3407, 3870, - 3659, 3407, 3869, - 3659, 3408, 3869, - 3658, 3408, 3869, - 3658, 3409, 3869, - 3657, 3409, 3868, - 3655, 3410, 3868, - 3654, 3412, 3867, - 3651, 3414, 3866, - 3648, 3416, 3864, - 3644, 3419, 3862, - 3638, 3424, 3860, - 3631, 3429, 3856, - 3620, 3437, 3851, - 3606, 3446, 3845, - 3586, 3459, 3836, - 3558, 3476, 3824, - 3517, 3497, 3807, - 3456, 3524, 3784, - 3360, 3558, 3750, - 3187, 3599, 3702, - 2750, 3650, 3627, - 0, 3709, 3503, - 0, 3778, 3257, - 0, 3856, 1771, - 3839, 3433, 3936, - 3839, 3433, 3936, - 3839, 3433, 3936, - 3839, 3433, 3936, - 3839, 3433, 3936, - 3839, 3433, 3936, - 3838, 3433, 3936, - 3838, 3434, 3936, - 3838, 3434, 3936, - 3838, 3434, 3936, - 3838, 3435, 3935, - 3837, 3435, 3935, - 3836, 3436, 3935, - 3836, 3437, 3934, - 3834, 3438, 3933, - 3833, 3440, 3932, - 3831, 3442, 3931, - 3828, 3445, 3930, - 3824, 3449, 3927, - 3819, 3455, 3924, - 3812, 3462, 3920, - 3803, 3471, 3914, - 3790, 3483, 3907, - 3772, 3499, 3897, - 3747, 3519, 3882, - 3712, 3545, 3863, - 3659, 3577, 3835, - 3578, 3617, 3795, - 3440, 3665, 3735, - 3149, 3723, 3640, - 0, 3790, 3472, - 0, 3867, 3056, - 4003, 3467, 4012, - 4003, 3467, 4012, - 4003, 3467, 4012, - 4003, 3467, 4012, - 4003, 3467, 4012, - 4003, 3467, 4012, - 4003, 3467, 4012, - 4002, 3467, 4012, - 4002, 3467, 4012, - 4002, 3468, 4011, - 4002, 3468, 4011, - 4002, 3468, 4011, - 4001, 3469, 4011, - 4001, 3470, 4010, - 4000, 3471, 4010, - 3999, 3473, 4009, - 3997, 3475, 4008, - 3995, 3478, 4006, - 3993, 3482, 4004, - 3989, 3487, 4002, - 3984, 3493, 3998, - 3978, 3502, 3994, - 3969, 3513, 3987, - 3957, 3528, 3979, - 3941, 3547, 3967, - 3918, 3571, 3950, - 3886, 3602, 3928, - 3838, 3640, 3895, - 3765, 3686, 3848, - 3646, 3741, 3776, - 3411, 3806, 3657, - 2348, 3880, 3426, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3508, 4095, - 4095, 3509, 4095, - 4095, 3509, 4095, - 4095, 3509, 4095, - 4095, 3510, 4095, - 4095, 3511, 4095, - 4095, 3512, 4095, - 4095, 3513, 4094, - 4095, 3515, 4093, - 4095, 3518, 4092, - 4095, 3522, 4091, - 4095, 3526, 4088, - 4095, 3532, 4086, - 4095, 3540, 4082, - 4095, 3551, 4076, - 4095, 3564, 4069, - 4095, 3582, 4060, - 4095, 3604, 4046, - 4077, 3633, 4028, - 4046, 3668, 4002, - 4002, 3712, 3965, - 3935, 3764, 3911, - 3826, 3826, 3826, - 3621, 3897, 3679, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3558, 4095, - 4095, 3559, 4095, - 4095, 3559, 4095, - 4095, 3560, 4095, - 4095, 3560, 4095, - 4095, 3561, 4095, - 4095, 3563, 4095, - 4095, 3564, 4095, - 4095, 3567, 4095, - 4095, 3570, 4095, - 4095, 3574, 4095, - 4095, 3580, 4095, - 4095, 3587, 4095, - 4095, 3596, 4095, - 4095, 3608, 4095, - 4095, 3624, 4095, - 4095, 3645, 4095, - 4095, 3671, 4095, - 4095, 3704, 4095, - 4095, 3744, 4086, - 4095, 3793, 4045, - 4093, 3851, 3983, - 3990, 3919, 3884, - 0, 3448, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3717, - 0, 3449, 3717, - 0, 3449, 3717, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3450, 3716, - 0, 3451, 3715, - 0, 3452, 3715, - 0, 3453, 3713, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3707, - 0, 3464, 3703, - 0, 3469, 3698, - 0, 3476, 3691, - 0, 3485, 3682, - 0, 3497, 3669, - 0, 3512, 3652, - 0, 3532, 3627, - 0, 3557, 3592, - 0, 3588, 3540, - 0, 3627, 3460, - 0, 3675, 3325, - 0, 3731, 3043, - 0, 3797, 0, - 0, 3873, 0, - 0, 3448, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3717, - 0, 3449, 3717, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3451, 3716, - 0, 3451, 3715, - 0, 3452, 3715, - 0, 3453, 3713, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3707, - 0, 3464, 3703, - 0, 3469, 3698, - 0, 3476, 3692, - 0, 3485, 3682, - 0, 3497, 3670, - 0, 3512, 3652, - 0, 3532, 3627, - 0, 3557, 3592, - 0, 3588, 3540, - 0, 3627, 3460, - 0, 3675, 3325, - 0, 3731, 3043, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3717, - 0, 3449, 3717, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3451, 3716, - 0, 3451, 3716, - 0, 3452, 3715, - 0, 3453, 3714, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3707, - 0, 3464, 3703, - 0, 3469, 3698, - 0, 3476, 3692, - 0, 3485, 3682, - 0, 3497, 3670, - 0, 3512, 3652, - 0, 3532, 3627, - 0, 3557, 3592, - 0, 3588, 3540, - 0, 3627, 3461, - 0, 3675, 3326, - 0, 3731, 3043, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3717, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3451, 3716, - 0, 3451, 3716, - 0, 3452, 3715, - 0, 3453, 3714, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3707, - 0, 3464, 3703, - 0, 3469, 3698, - 0, 3476, 3692, - 0, 3485, 3682, - 0, 3497, 3670, - 0, 3512, 3652, - 0, 3532, 3627, - 0, 3557, 3592, - 0, 3588, 3541, - 0, 3627, 3461, - 0, 3675, 3326, - 0, 3731, 3043, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3717, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3451, 3716, - 0, 3451, 3716, - 0, 3452, 3715, - 0, 3453, 3714, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3707, - 0, 3464, 3704, - 0, 3469, 3699, - 0, 3476, 3692, - 0, 3485, 3682, - 0, 3497, 3670, - 0, 3512, 3652, - 0, 3532, 3628, - 0, 3557, 3592, - 0, 3588, 3541, - 0, 3627, 3461, - 0, 3675, 3326, - 0, 3731, 3044, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3451, 3716, - 0, 3451, 3716, - 0, 3452, 3715, - 0, 3453, 3714, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3707, - 0, 3464, 3704, - 0, 3469, 3699, - 0, 3476, 3692, - 0, 3485, 3683, - 0, 3497, 3670, - 0, 3512, 3652, - 0, 3532, 3628, - 0, 3557, 3593, - 0, 3588, 3541, - 0, 3627, 3461, - 0, 3675, 3326, - 0, 3731, 3044, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3450, 3717, - 0, 3450, 3717, - 0, 3451, 3717, - 0, 3451, 3716, - 0, 3452, 3715, - 0, 3454, 3714, - 0, 3455, 3712, - 0, 3457, 3710, - 0, 3460, 3708, - 0, 3464, 3704, - 0, 3469, 3699, - 0, 3476, 3692, - 0, 3485, 3683, - 0, 3497, 3670, - 0, 3512, 3653, - 0, 3532, 3628, - 0, 3557, 3593, - 0, 3588, 3541, - 0, 3627, 3461, - 0, 3675, 3327, - 0, 3731, 3045, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3449, 3718, - 0, 3450, 3718, - 0, 3450, 3717, - 0, 3451, 3717, - 0, 3451, 3716, - 0, 3452, 3715, - 0, 3454, 3714, - 0, 3455, 3713, - 0, 3457, 3711, - 0, 3460, 3708, - 0, 3464, 3704, - 0, 3470, 3699, - 0, 3476, 3692, - 0, 3485, 3683, - 0, 3497, 3670, - 0, 3512, 3653, - 0, 3532, 3628, - 0, 3557, 3593, - 0, 3589, 3541, - 0, 3627, 3462, - 0, 3675, 3327, - 0, 3731, 3046, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3718, - 0, 3450, 3718, - 0, 3450, 3718, - 0, 3450, 3718, - 0, 3451, 3717, - 0, 3451, 3716, - 0, 3452, 3716, - 0, 3454, 3714, - 0, 3455, 3713, - 0, 3458, 3711, - 0, 3460, 3708, - 0, 3464, 3704, - 0, 3470, 3699, - 0, 3476, 3693, - 0, 3485, 3683, - 0, 3497, 3671, - 0, 3512, 3653, - 0, 3532, 3629, - 0, 3557, 3593, - 0, 3589, 3542, - 0, 3627, 3462, - 0, 3675, 3328, - 0, 3731, 3047, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3449, 3719, - 0, 3450, 3719, - 0, 3450, 3718, - 0, 3450, 3718, - 0, 3451, 3718, - 0, 3452, 3717, - 0, 3452, 3716, - 0, 3454, 3715, - 0, 3455, 3713, - 0, 3458, 3711, - 0, 3461, 3709, - 0, 3465, 3705, - 0, 3470, 3700, - 0, 3477, 3693, - 0, 3486, 3684, - 0, 3497, 3671, - 0, 3513, 3654, - 0, 3532, 3629, - 0, 3557, 3594, - 0, 3589, 3542, - 0, 3628, 3463, - 0, 3675, 3329, - 0, 3731, 3049, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3719, - 0, 3450, 3719, - 0, 3450, 3719, - 0, 3450, 3719, - 0, 3450, 3719, - 0, 3451, 3718, - 0, 3452, 3717, - 0, 3453, 3717, - 0, 3454, 3715, - 0, 3456, 3714, - 0, 3458, 3712, - 0, 3461, 3709, - 0, 3465, 3705, - 0, 3470, 3700, - 0, 3477, 3694, - 0, 3486, 3684, - 0, 3497, 3672, - 0, 3513, 3654, - 0, 3532, 3630, - 0, 3557, 3595, - 0, 3589, 3543, - 0, 3628, 3464, - 0, 3675, 3330, - 0, 3731, 3051, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3721, - 0, 3449, 3721, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3449, 3720, - 0, 3450, 3720, - 0, 3450, 3720, - 0, 3450, 3720, - 0, 3450, 3720, - 0, 3451, 3719, - 0, 3451, 3719, - 0, 3452, 3718, - 0, 3453, 3717, - 0, 3454, 3716, - 0, 3456, 3715, - 0, 3458, 3713, - 0, 3461, 3710, - 0, 3465, 3706, - 0, 3470, 3701, - 0, 3477, 3694, - 0, 3486, 3685, - 0, 3498, 3672, - 0, 3513, 3655, - 0, 3532, 3631, - 0, 3557, 3596, - 0, 3589, 3544, - 0, 3628, 3465, - 0, 3675, 3332, - 0, 3731, 3055, - 0, 3797, 0, - 0, 3873, 0, - 0, 3449, 3721, - 0, 3449, 3721, - 0, 3449, 3721, - 0, 3450, 3721, - 0, 3450, 3721, - 0, 3450, 3721, - 0, 3450, 3721, - 0, 3450, 3721, - 0, 3450, 3721, - 0, 3450, 3721, - 0, 3451, 3720, - 0, 3451, 3720, - 0, 3452, 3719, - 0, 3453, 3718, - 0, 3454, 3717, - 0, 3456, 3716, - 0, 3458, 3714, - 0, 3461, 3711, - 0, 3465, 3707, - 0, 3470, 3702, - 0, 3477, 3695, - 0, 3486, 3686, - 0, 3498, 3674, - 0, 3513, 3656, - 0, 3533, 3632, - 0, 3558, 3597, - 0, 3589, 3546, - 0, 3628, 3467, - 0, 3675, 3334, - 0, 3732, 3059, - 0, 3798, 0, - 0, 3873, 0, - 0, 3450, 3723, - 0, 3450, 3723, - 0, 3450, 3723, - 0, 3450, 3723, - 0, 3450, 3723, - 0, 3450, 3723, - 0, 3450, 3722, - 0, 3450, 3722, - 0, 3451, 3722, - 0, 3451, 3722, - 0, 3451, 3721, - 0, 3452, 3721, - 0, 3452, 3720, - 0, 3453, 3719, - 0, 3455, 3718, - 0, 3456, 3717, - 0, 3458, 3715, - 0, 3461, 3712, - 0, 3465, 3708, - 0, 3471, 3703, - 0, 3477, 3697, - 0, 3486, 3687, - 0, 3498, 3675, - 0, 3513, 3658, - 0, 3533, 3633, - 0, 3558, 3599, - 0, 3589, 3548, - 0, 3628, 3469, - 0, 3675, 3337, - 0, 3732, 3064, - 0, 3798, 0, - 0, 3873, 0, - 0, 3450, 3724, - 0, 3450, 3724, - 0, 3450, 3724, - 0, 3450, 3724, - 0, 3450, 3724, - 0, 3450, 3724, - 0, 3451, 3724, - 0, 3451, 3724, - 0, 3451, 3724, - 0, 3451, 3723, - 0, 3452, 3723, - 0, 3452, 3723, - 0, 3453, 3722, - 0, 3454, 3721, - 0, 3455, 3720, - 0, 3457, 3719, - 0, 3459, 3717, - 0, 3462, 3714, - 0, 3466, 3710, - 0, 3471, 3705, - 0, 3478, 3698, - 0, 3487, 3689, - 0, 3498, 3677, - 0, 3514, 3659, - 0, 3533, 3635, - 0, 3558, 3601, - 0, 3590, 3550, - 0, 3628, 3472, - 0, 3676, 3341, - 0, 3732, 3071, - 0, 3798, 0, - 0, 3873, 0, - 0, 3451, 3727, - 0, 3451, 3727, - 0, 3451, 3727, - 0, 3451, 3727, - 0, 3451, 3727, - 0, 3451, 3726, - 0, 3451, 3726, - 0, 3451, 3726, - 0, 3452, 3726, - 0, 3452, 3726, - 0, 3452, 3725, - 0, 3453, 3725, - 0, 3453, 3724, - 0, 3454, 3723, - 0, 3456, 3722, - 0, 3457, 3721, - 0, 3459, 3719, - 0, 3462, 3716, - 0, 3466, 3712, - 0, 3471, 3708, - 0, 3478, 3701, - 0, 3487, 3692, - 0, 3499, 3679, - 0, 3514, 3662, - 0, 3534, 3638, - 0, 3559, 3604, - 0, 3590, 3553, - 0, 3629, 3476, - 0, 3676, 3346, - 0, 3732, 3081, - 0, 3798, 0, - 0, 3873, 0, - 0, 3451, 3730, - 0, 3452, 3730, - 0, 3452, 3730, - 0, 3452, 3730, - 0, 3452, 3729, - 0, 3452, 3729, - 0, 3452, 3729, - 0, 3452, 3729, - 0, 3452, 3729, - 0, 3453, 3729, - 0, 3453, 3728, - 0, 3453, 3728, - 0, 3454, 3727, - 0, 3455, 3726, - 0, 3456, 3725, - 0, 3458, 3724, - 0, 3460, 3722, - 0, 3463, 3719, - 0, 3467, 3716, - 0, 3472, 3711, - 0, 3479, 3704, - 0, 3488, 3695, - 0, 3500, 3683, - 0, 3515, 3666, - 0, 3534, 3642, - 0, 3559, 3608, - 0, 3591, 3558, - 0, 3629, 3481, - 0, 3676, 3353, - 0, 3733, 3093, - 0, 3798, 0, - 0, 3874, 0, - 0, 3453, 3734, - 0, 3453, 3734, - 0, 3453, 3734, - 0, 3453, 3734, - 0, 3453, 3733, - 0, 3453, 3733, - 0, 3453, 3733, - 0, 3453, 3733, - 0, 3453, 3733, - 0, 3454, 3733, - 0, 3454, 3732, - 0, 3454, 3732, - 0, 3455, 3731, - 0, 3456, 3730, - 0, 3457, 3729, - 0, 3459, 3728, - 0, 3461, 3726, - 0, 3464, 3723, - 0, 3468, 3720, - 0, 3473, 3715, - 0, 3480, 3708, - 0, 3489, 3699, - 0, 3501, 3687, - 0, 3516, 3670, - 0, 3535, 3646, - 0, 3560, 3613, - 0, 3591, 3563, - 0, 3630, 3488, - 0, 3677, 3362, - 0, 3733, 3109, - 0, 3799, 370, - 0, 3874, 0, - 0, 3454, 3739, - 0, 3454, 3739, - 0, 3454, 3739, - 0, 3454, 3739, - 0, 3454, 3739, - 0, 3454, 3739, - 0, 3454, 3738, - 0, 3454, 3738, - 0, 3455, 3738, - 0, 3455, 3738, - 0, 3455, 3738, - 0, 3456, 3737, - 0, 3457, 3737, - 0, 3457, 3736, - 0, 3459, 3735, - 0, 3460, 3733, - 0, 3463, 3731, - 0, 3465, 3729, - 0, 3469, 3725, - 0, 3474, 3720, - 0, 3481, 3714, - 0, 3490, 3705, - 0, 3502, 3693, - 0, 3517, 3676, - 0, 3536, 3653, - 0, 3561, 3620, - 0, 3592, 3571, - 0, 3631, 3497, - 0, 3678, 3374, - 0, 3734, 3129, - 0, 3800, 1731, - 0, 3875, 0, - 0, 3456, 3746, - 0, 3456, 3746, - 0, 3456, 3746, - 0, 3456, 3746, - 0, 3456, 3746, - 0, 3456, 3745, - 0, 3456, 3745, - 0, 3456, 3745, - 0, 3456, 3745, - 0, 3457, 3745, - 0, 3457, 3744, - 0, 3458, 3744, - 0, 3458, 3743, - 0, 3459, 3743, - 0, 3460, 3742, - 0, 3462, 3740, - 0, 3464, 3738, - 0, 3467, 3736, - 0, 3471, 3732, - 0, 3476, 3727, - 0, 3483, 3721, - 0, 3492, 3712, - 0, 3503, 3700, - 0, 3518, 3684, - 0, 3538, 3661, - 0, 3563, 3629, - 0, 3594, 3581, - 0, 3632, 3508, - 0, 3679, 3389, - 0, 3735, 3155, - 0, 3800, 2103, - 0, 3875, 0, - 0, 3458, 3755, - 0, 3458, 3755, - 0, 3458, 3755, - 0, 3458, 3755, - 0, 3458, 3755, - 0, 3458, 3755, - 0, 3458, 3754, - 0, 3459, 3754, - 0, 3459, 3754, - 0, 3459, 3754, - 0, 3460, 3754, - 0, 3460, 3753, - 0, 3461, 3753, - 0, 3462, 3752, - 0, 3463, 3751, - 0, 3465, 3749, - 0, 3467, 3747, - 0, 3470, 3745, - 0, 3473, 3741, - 0, 3479, 3737, - 0, 3485, 3731, - 0, 3494, 3722, - 0, 3506, 3710, - 0, 3521, 3694, - 0, 3540, 3672, - 0, 3565, 3640, - 0, 3595, 3594, - 0, 3634, 3524, - 0, 3681, 3409, - 0, 3736, 3187, - 0, 3802, 2357, - 0, 3876, 0, - 0, 3461, 3767, - 0, 3461, 3767, - 0, 3461, 3767, - 0, 3461, 3767, - 0, 3461, 3767, - 0, 3462, 3766, - 0, 3462, 3766, - 0, 3462, 3766, - 0, 3462, 3766, - 0, 3462, 3766, - 0, 3463, 3765, - 0, 3463, 3765, - 0, 3464, 3764, - 0, 3465, 3764, - 0, 3466, 3763, - 0, 3468, 3761, - 0, 3470, 3759, - 0, 3473, 3757, - 0, 3477, 3754, - 0, 3482, 3749, - 0, 3488, 3743, - 0, 3497, 3735, - 0, 3508, 3723, - 0, 3523, 3708, - 0, 3543, 3686, - 0, 3567, 3655, - 0, 3598, 3611, - 0, 3636, 3543, - 0, 3682, 3434, - 0, 3738, 3227, - 0, 3803, 2563, - 0, 3878, 0, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3782, - 0, 3466, 3781, - 0, 3467, 3781, - 0, 3467, 3781, - 0, 3467, 3780, - 0, 3468, 3780, - 0, 3469, 3779, - 0, 3470, 3778, - 0, 3472, 3777, - 0, 3474, 3775, - 0, 3477, 3773, - 0, 3481, 3769, - 0, 3486, 3765, - 0, 3492, 3759, - 0, 3501, 3751, - 0, 3512, 3740, - 0, 3527, 3725, - 0, 3546, 3704, - 0, 3570, 3675, - 0, 3601, 3632, - 0, 3639, 3568, - 0, 3685, 3465, - 0, 3740, 3276, - 0, 3805, 2743, - 0, 3879, 0, - 0, 3471, 3802, - 0, 3471, 3802, - 0, 3471, 3802, - 0, 3471, 3802, - 0, 3471, 3802, - 0, 3471, 3802, - 0, 3472, 3802, - 0, 3472, 3801, - 0, 3472, 3801, - 0, 3472, 3801, - 0, 3473, 3801, - 0, 3473, 3800, - 0, 3474, 3800, - 0, 3475, 3799, - 0, 3476, 3798, - 0, 3477, 3797, - 0, 3480, 3795, - 0, 3482, 3793, - 0, 3486, 3790, - 0, 3491, 3786, - 0, 3498, 3780, - 0, 3506, 3772, - 0, 3517, 3762, - 0, 3532, 3748, - 0, 3551, 3728, - 0, 3575, 3700, - 0, 3605, 3660, - 0, 3643, 3599, - 0, 3689, 3504, - 0, 3743, 3334, - 0, 3808, 2908, - 0, 3882, 0, - 1996, 3479, 3827, - 1994, 3479, 3827, - 1992, 3479, 3827, - 1990, 3479, 3827, - 1986, 3479, 3827, - 1981, 3479, 3827, - 1974, 3479, 3827, - 1965, 3479, 3827, - 1953, 3479, 3826, - 1935, 3480, 3826, - 1911, 3480, 3826, - 1877, 3480, 3826, - 1826, 3481, 3825, - 1748, 3482, 3824, - 1616, 3483, 3824, - 1346, 3485, 3822, - 0, 3487, 3821, - 0, 3490, 3819, - 0, 3493, 3816, - 0, 3498, 3812, - 0, 3505, 3806, - 0, 3513, 3799, - 0, 3524, 3789, - 0, 3538, 3776, - 0, 3557, 3757, - 0, 3581, 3731, - 0, 3611, 3694, - 0, 3648, 3638, - 0, 3693, 3551, - 0, 3748, 3401, - 0, 3811, 3063, - 0, 3885, 0, - 2986, 3488, 3859, - 2986, 3488, 3859, - 2986, 3488, 3859, - 2986, 3488, 3859, - 2985, 3488, 3859, - 2985, 3489, 3858, - 2984, 3489, 3858, - 2983, 3489, 3858, - 2982, 3489, 3858, - 2980, 3489, 3858, - 2977, 3490, 3858, - 2974, 3490, 3857, - 2970, 3491, 3857, - 2964, 3492, 3856, - 2956, 3493, 3855, - 2945, 3494, 3854, - 2931, 3496, 3853, - 2910, 3499, 3851, - 2881, 3503, 3848, - 2839, 3507, 3844, - 2775, 3514, 3839, - 2674, 3522, 3833, - 2489, 3533, 3824, - 1982, 3547, 3811, - 0, 3565, 3794, - 0, 3589, 3770, - 0, 3618, 3736, - 0, 3655, 3685, - 0, 3699, 3608, - 0, 3753, 3478, - 0, 3816, 3212, - 0, 3889, 0, - 3342, 3501, 3898, - 3342, 3501, 3898, - 3342, 3501, 3898, - 3341, 3501, 3898, - 3341, 3501, 3898, - 3341, 3501, 3898, - 3341, 3501, 3898, - 3340, 3501, 3897, - 3340, 3502, 3897, - 3339, 3502, 3897, - 3338, 3502, 3897, - 3336, 3503, 3897, - 3334, 3503, 3896, - 3332, 3504, 3896, - 3328, 3505, 3895, - 3323, 3507, 3894, - 3317, 3509, 3892, - 3308, 3511, 3891, - 3296, 3515, 3888, - 3280, 3520, 3885, - 3257, 3526, 3880, - 3224, 3534, 3874, - 3177, 3544, 3866, - 3104, 3558, 3854, - 2984, 3576, 3839, - 2749, 3599, 3817, - 1669, 3628, 3786, - 0, 3663, 3741, - 0, 3707, 3674, - 0, 3760, 3564, - 0, 3822, 3356, - 0, 3894, 2681, - 3590, 3517, 3945, - 3590, 3517, 3945, - 3590, 3517, 3945, - 3589, 3517, 3945, - 3589, 3518, 3945, - 3589, 3518, 3945, - 3589, 3518, 3945, - 3589, 3518, 3945, - 3588, 3518, 3945, - 3588, 3518, 3945, - 3587, 3519, 3945, - 3586, 3519, 3944, - 3585, 3520, 3944, - 3584, 3520, 3943, - 3582, 3522, 3943, - 3579, 3523, 3942, - 3576, 3525, 3941, - 3571, 3527, 3939, - 3564, 3531, 3937, - 3555, 3535, 3934, - 3543, 3541, 3930, - 3525, 3549, 3924, - 3501, 3559, 3917, - 3467, 3573, 3907, - 3417, 3590, 3893, - 3340, 3612, 3873, - 3211, 3640, 3846, - 2949, 3675, 3807, - 0, 3718, 3749, - 0, 3769, 3658, - 0, 3830, 3497, - 0, 3901, 3116, - 3792, 3538, 4002, - 3792, 3538, 4002, - 3792, 3538, 4002, - 3792, 3539, 4002, - 3792, 3539, 4002, - 3792, 3539, 4002, - 3792, 3539, 4002, - 3792, 3539, 4002, - 3792, 3539, 4002, - 3791, 3539, 4002, - 3791, 3540, 4001, - 3790, 3540, 4001, - 3790, 3541, 4001, - 3789, 3541, 4000, - 3787, 3542, 4000, - 3786, 3544, 3999, - 3783, 3546, 3998, - 3780, 3548, 3996, - 3776, 3551, 3994, - 3770, 3556, 3992, - 3763, 3561, 3988, - 3752, 3569, 3983, - 3738, 3579, 3977, - 3718, 3591, 3968, - 3690, 3608, 3956, - 3649, 3629, 3939, - 3588, 3656, 3916, - 3492, 3690, 3882, - 3319, 3731, 3834, - 2882, 3782, 3759, - 0, 3841, 3636, - 0, 3910, 3389, - 3971, 3565, 4068, - 3971, 3565, 4068, - 3971, 3565, 4068, - 3971, 3565, 4068, - 3971, 3565, 4068, - 3971, 3565, 4068, - 3971, 3565, 4068, - 3971, 3566, 4068, - 3970, 3566, 4068, - 3970, 3566, 4068, - 3970, 3566, 4068, - 3970, 3567, 4067, - 3969, 3567, 4067, - 3968, 3568, 4067, - 3968, 3569, 4066, - 3966, 3570, 4066, - 3965, 3572, 4065, - 3963, 3574, 4063, - 3960, 3577, 4062, - 3956, 3581, 4059, - 3951, 3587, 4056, - 3944, 3594, 4052, - 3935, 3603, 4047, - 3922, 3615, 4039, - 3904, 3631, 4029, - 3879, 3651, 4014, - 3844, 3677, 3995, - 3791, 3709, 3967, - 3710, 3749, 3927, - 3572, 3797, 3867, - 3281, 3855, 3772, - 0, 3922, 3604, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3599, 4095, - 4095, 3600, 4095, - 4095, 3600, 4095, - 4095, 3601, 4095, - 4095, 3601, 4095, - 4095, 3602, 4095, - 4095, 3603, 4095, - 4095, 3605, 4095, - 4095, 3607, 4095, - 4095, 3610, 4095, - 4095, 3614, 4095, - 4095, 3619, 4095, - 4095, 3625, 4095, - 4095, 3634, 4095, - 4095, 3645, 4095, - 4090, 3660, 4095, - 4073, 3679, 4095, - 4050, 3703, 4083, - 4018, 3734, 4060, - 3970, 3772, 4027, - 3897, 3818, 3980, - 3778, 3873, 3908, - 3543, 3938, 3789, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3640, 4095, - 4095, 3641, 4095, - 4095, 3641, 4095, - 4095, 3641, 4095, - 4095, 3642, 4095, - 4095, 3642, 4095, - 4095, 3643, 4095, - 4095, 3644, 4095, - 4095, 3646, 4095, - 4095, 3648, 4095, - 4095, 3650, 4095, - 4095, 3654, 4095, - 4095, 3658, 4095, - 4095, 3664, 4095, - 4095, 3672, 4095, - 4095, 3683, 4095, - 4095, 3696, 4095, - 4095, 3714, 4095, - 4095, 3736, 4095, - 4095, 3765, 4095, - 4095, 3800, 4095, - 4095, 3844, 4095, - 4067, 3896, 4043, - 3958, 3958, 3958 -] + "Intervals": [0, 33, 66, 99, 132, 165, 198, 231, 264, 297, 330, 363, 396, 429, 462, 495, 528, 561, 594, 627, 660, 693, 726, 759, 792, 825, 858, 891, 924, 957, 990, 1023], + "Values": [0, 0, 0, +0, 0, 0, +0, 15, 0, +0, 104, 0, +0, 201, 0, +0, 305, 0, +0, 415, 0, +0, 530, 0, +0, 649, 0, +0, 771, 0, +0, 895, 0, +0, 1022, 0, +0, 1149, 0, +0, 1278, 0, +0, 1408, 0, +0, 1538, 0, +0, 1668, 0, +0, 1799, 0, +0, 1931, 0, +0, 2062, 0, +0, 2194, 0, +0, 2326, 0, +0, 2457, 0, +0, 2589, 0, +0, 2721, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3381, 0, +0, 3514, 0, +0, 3646, 0, +130, 0, 20, +28, 0, 0, +0, 33, 0, +0, 119, 0, +0, 213, 0, +0, 315, 0, +0, 423, 0, +0, 536, 0, +0, 654, 0, +0, 775, 0, +0, 898, 0, +0, 1024, 0, +0, 1151, 0, +0, 1279, 0, +0, 1408, 0, +0, 1538, 0, +0, 1669, 0, +0, 1800, 0, +0, 1931, 0, +0, 2062, 0, +0, 2194, 0, +0, 2326, 0, +0, 2458, 0, +0, 2589, 0, +0, 2721, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3381, 0, +0, 3514, 0, +0, 3646, 0, +342, 0, 170, +280, 0, 102, +183, 56, 0, +7, 139, 0, +0, 229, 0, +0, 328, 0, +0, 433, 0, +0, 544, 0, +0, 660, 0, +0, 779, 0, +0, 902, 0, +0, 1026, 0, +0, 1153, 0, +0, 1281, 0, +0, 1410, 0, +0, 1539, 0, +0, 1670, 0, +0, 1800, 0, +0, 1931, 0, +0, 2063, 0, +0, 2194, 0, +0, 2326, 0, +0, 2458, 0, +0, 2589, 0, +0, 2721, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3381, 0, +0, 3514, 0, +0, 3646, 0, +526, 0, 315, +486, 18, 266, +426, 86, 192, +331, 163, 68, +163, 250, 0, +0, 344, 0, +0, 446, 0, +0, 555, 0, +0, 668, 0, +0, 785, 0, +0, 906, 0, +0, 1030, 0, +0, 1156, 0, +0, 1283, 0, +0, 1411, 0, +0, 1540, 0, +0, 1670, 0, +0, 1801, 0, +0, 1932, 0, +0, 2063, 0, +0, 2194, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +693, 8, 457, +666, 60, 422, +626, 123, 370, +568, 195, 290, +475, 276, 155, +312, 366, 0, +0, 463, 0, +0, 568, 0, +0, 678, 0, +0, 794, 0, +0, 913, 0, +0, 1035, 0, +0, 1159, 0, +0, 1285, 0, +0, 1413, 0, +0, 1542, 0, +0, 1672, 0, +0, 1802, 0, +0, 1932, 0, +0, 2064, 0, +0, 2195, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +850, 65, 596, +831, 112, 570, +804, 168, 534, +765, 233, 479, +707, 308, 395, +616, 393, 250, +457, 485, 0, +82, 585, 0, +0, 692, 0, +0, 804, 0, +0, 921, 0, +0, 1041, 0, +0, 1164, 0, +0, 1289, 0, +0, 1416, 0, +0, 1544, 0, +0, 1673, 0, +0, 1803, 0, +0, 1933, 0, +0, 2064, 0, +0, 2195, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +999, 131, 733, +986, 172, 714, +967, 222, 688, +940, 280, 650, +901, 348, 594, +844, 426, 505, +755, 513, 352, +598, 608, 3, +235, 710, 0, +0, 818, 0, +0, 932, 0, +0, 1049, 0, +0, 1170, 0, +0, 1294, 0, +0, 1420, 0, +0, 1547, 0, +0, 1675, 0, +0, 1805, 0, +0, 1935, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1144, 207, 869, +1134, 242, 855, +1121, 285, 836, +1102, 336, 809, +1075, 397, 770, +1037, 468, 712, +980, 547, 621, +892, 636, 461, +737, 732, 82, +382, 836, 0, +0, 946, 0, +0, 1060, 0, +0, 1179, 0, +0, 1300, 0, +0, 1424, 0, +0, 1550, 0, +0, 1678, 0, +0, 1807, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1286, 293, 1004, +1278, 322, 994, +1268, 358, 980, +1255, 402, 960, +1236, 455, 932, +1210, 518, 893, +1172, 590, 833, +1115, 671, 740, +1027, 761, 574, +874, 859, 170, +525, 964, 0, +0, 1074, 0, +0, 1190, 0, +0, 1309, 0, +0, 1431, 0, +0, 1555, 0, +0, 1682, 0, +0, 1809, 0, +0, 1938, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1424, 386, 1138, +1419, 410, 1131, +1412, 440, 1120, +1402, 477, 1106, +1389, 523, 1086, +1370, 577, 1058, +1343, 641, 1018, +1306, 714, 958, +1250, 797, 862, +1162, 888, 692, +1010, 987, 267, +665, 1093, 0, +0, 1204, 0, +0, 1320, 0, +0, 1439, 0, +0, 1562, 0, +0, 1687, 0, +0, 1813, 0, +0, 1941, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1562, 487, 1272, +1558, 506, 1266, +1552, 531, 1258, +1545, 561, 1248, +1535, 599, 1234, +1522, 646, 1213, +1503, 701, 1185, +1477, 766, 1144, +1439, 840, 1084, +1383, 924, 987, +1296, 1016, 813, +1145, 1116, 370, +802, 1222, 0, +0, 1334, 0, +0, 1450, 0, +0, 1570, 0, +0, 1693, 0, +0, 1818, 0, +0, 1945, 0, +0, 2073, 0, +0, 2202, 0, +0, 2331, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1697, 595, 1405, +1695, 610, 1401, +1691, 629, 1395, +1685, 654, 1387, +1678, 685, 1377, +1668, 724, 1362, +1655, 771, 1342, +1636, 827, 1314, +1610, 893, 1273, +1572, 968, 1211, +1517, 1053, 1113, +1430, 1145, 937, +1279, 1246, 479, +939, 1352, 0, +0, 1465, 0, +0, 1581, 0, +0, 1701, 0, +0, 1824, 0, +0, 1950, 0, +0, 2076, 0, +0, 2204, 0, +0, 2334, 0, +0, 2463, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1832, 707, 1538, +1830, 719, 1535, +1827, 735, 1531, +1823, 755, 1525, +1818, 780, 1517, +1811, 811, 1507, +1801, 851, 1492, +1788, 898, 1472, +1769, 955, 1443, +1743, 1021, 1402, +1705, 1097, 1340, +1650, 1182, 1241, +1563, 1275, 1062, +1412, 1376, 594, +1074, 1483, 0, +0, 1596, 0, +0, 1712, 0, +0, 1833, 0, +0, 1956, 0, +0, 2081, 0, +0, 2208, 0, +0, 2336, 0, +0, 2466, 0, +0, 2595, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1966, 824, 1671, +1965, 834, 1668, +1963, 846, 1665, +1960, 861, 1661, +1956, 881, 1655, +1951, 907, 1647, +1943, 939, 1637, +1934, 978, 1622, +1920, 1026, 1602, +1902, 1084, 1573, +1875, 1150, 1531, +1838, 1227, 1469, +1782, 1312, 1370, +1696, 1406, 1190, +1545, 1507, 712, +1209, 1614, 0, +0, 1727, 0, +0, 1844, 0, +0, 1964, 0, +0, 2088, 0, +0, 2213, 0, +0, 2340, 0, +0, 2468, 0, +0, 2597, 0, +0, 2727, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +2100, 945, 1803, +2099, 952, 1802, +2097, 961, 1799, +2095, 973, 1796, +2092, 989, 1792, +2088, 1009, 1786, +2083, 1035, 1778, +2076, 1067, 1768, +2066, 1107, 1753, +2053, 1156, 1732, +2034, 1213, 1703, +2008, 1280, 1662, +1970, 1357, 1599, +1915, 1442, 1499, +1828, 1536, 1318, +1678, 1638, 834, +1342, 1745, 0, +0, 1858, 0, +0, 1976, 0, +0, 2096, 0, +0, 2220, 0, +0, 2345, 0, +0, 2472, 0, +0, 2600, 0, +0, 2730, 0, +0, 2859, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2233, 1068, 1936, +2232, 1074, 1935, +2231, 1081, 1933, +2230, 1090, 1930, +2227, 1102, 1927, +2225, 1118, 1923, +2221, 1139, 1917, +2215, 1164, 1909, +2208, 1197, 1899, +2198, 1237, 1884, +2185, 1286, 1863, +2166, 1343, 1834, +2140, 1411, 1793, +2103, 1488, 1730, +2047, 1573, 1629, +1961, 1668, 1447, +1811, 1769, 958, +1476, 1877, 0, +0, 1990, 0, +0, 2107, 0, +0, 2228, 0, +0, 2351, 0, +0, 2477, 0, +0, 2604, 0, +0, 2732, 0, +0, 2862, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2366, 1194, 2068, +2366, 1198, 2067, +2365, 1203, 2066, +2364, 1210, 2064, +2362, 1220, 2062, +2360, 1232, 2059, +2357, 1248, 2054, +2353, 1268, 2049, +2348, 1294, 2041, +2340, 1327, 2030, +2331, 1367, 2015, +2317, 1416, 1995, +2299, 1474, 1966, +2273, 1542, 1924, +2235, 1619, 1861, +2180, 1705, 1760, +2093, 1799, 1577, +1944, 1901, 1084, +1609, 2009, 0, +0, 2122, 0, +0, 2239, 0, +0, 2360, 0, +0, 2483, 0, +0, 2609, 0, +0, 2736, 0, +0, 2864, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2499, 1321, 2200, +2499, 1324, 2200, +2498, 1328, 2199, +2497, 1333, 2197, +2496, 1340, 2196, +2494, 1350, 2193, +2492, 1362, 2190, +2489, 1378, 2186, +2485, 1399, 2180, +2480, 1425, 2172, +2473, 1458, 2161, +2463, 1498, 2147, +2450, 1547, 2126, +2431, 1605, 2097, +2405, 1673, 2055, +2367, 1750, 1992, +2312, 1836, 1891, +2226, 1931, 1708, +2076, 2032, 1211, +1742, 2140, 0, +0, 2254, 0, +0, 2371, 0, +0, 2492, 0, +0, 2615, 0, +0, 2741, 0, +0, 2868, 0, +0, 2996, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2632, 1449, 2333, +2631, 1451, 2332, +2631, 1454, 2331, +2630, 1458, 2330, +2629, 1464, 2329, +2628, 1471, 2327, +2626, 1481, 2325, +2624, 1493, 2322, +2621, 1509, 2318, +2617, 1530, 2312, +2612, 1556, 2304, +2605, 1589, 2293, +2595, 1629, 2278, +2582, 1678, 2258, +2563, 1736, 2229, +2537, 1804, 2187, +2500, 1881, 2123, +2444, 1968, 2023, +2358, 2062, 1839, +2208, 2164, 1340, +1874, 2272, 0, +0, 2385, 0, +0, 2503, 0, +0, 2624, 0, +0, 2747, 0, +0, 2873, 0, +0, 3000, 0, +0, 3128, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2764, 1578, 2465, +2764, 1580, 2465, +2763, 1582, 2464, +2763, 1585, 2463, +2762, 1589, 2462, +2761, 1595, 2461, +2760, 1602, 2459, +2759, 1612, 2457, +2756, 1624, 2454, +2753, 1640, 2449, +2750, 1661, 2444, +2744, 1687, 2436, +2737, 1720, 2425, +2727, 1760, 2410, +2714, 1809, 2389, +2695, 1868, 2360, +2669, 1936, 2318, +2632, 2013, 2255, +2577, 2099, 2154, +2490, 2194, 1970, +2341, 2296, 1469, +2007, 2404, 0, +0, 2517, 0, +0, 2635, 0, +0, 2756, 0, +0, 2879, 0, +0, 3005, 0, +0, 3132, 0, +0, 3260, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1708, 2597, +2896, 1709, 2597, +2896, 1711, 2596, +2896, 1713, 2596, +2895, 1716, 2595, +2894, 1721, 2594, +2893, 1726, 2593, +2892, 1733, 2591, +2891, 1743, 2589, +2889, 1755, 2586, +2886, 1771, 2581, +2882, 1792, 2575, +2876, 1818, 2568, +2869, 1851, 2557, +2859, 1892, 2542, +2846, 1941, 2521, +2828, 1999, 2492, +2801, 2067, 2450, +2764, 2145, 2387, +2709, 2231, 2286, +2622, 2326, 2101, +2473, 2428, 1599, +2139, 2536, 0, +0, 2649, 0, +0, 2767, 0, +0, 2888, 0, +0, 3011, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3029, 1838, 2729, +3029, 1839, 2729, +3028, 1841, 2729, +3028, 1842, 2728, +3028, 1845, 2728, +3027, 1848, 2727, +3027, 1852, 2726, +3026, 1858, 2725, +3024, 1865, 2723, +3023, 1874, 2721, +3021, 1887, 2717, +3018, 1903, 2713, +3014, 1924, 2707, +3009, 1950, 2699, +3001, 1983, 2689, +2992, 2024, 2674, +2978, 2073, 2653, +2960, 2131, 2624, +2934, 2199, 2582, +2896, 2277, 2519, +2841, 2363, 2418, +2755, 2458, 2233, +2605, 2560, 1730, +2272, 2668, 0, +0, 2781, 0, +0, 2899, 0, +0, 3020, 0, +0, 3143, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3161, 1969, 2861, +3161, 1970, 2861, +3161, 1971, 2861, +3160, 1972, 2861, +3160, 1974, 2860, +3160, 1976, 2860, +3159, 1980, 2859, +3159, 1984, 2858, +3158, 1989, 2857, +3157, 1996, 2855, +3155, 2006, 2853, +3153, 2018, 2849, +3150, 2035, 2845, +3146, 2055, 2839, +3141, 2082, 2831, +3134, 2115, 2821, +3124, 2155, 2806, +3110, 2205, 2785, +3092, 2263, 2756, +3066, 2331, 2714, +3028, 2409, 2651, +2973, 2495, 2549, +2887, 2590, 2365, +2737, 2692, 1861, +2404, 2800, 0, +0, 2913, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3293, 2100, 2994, +3293, 2101, 2993, +3293, 2102, 2993, +3293, 2103, 2993, +3293, 2104, 2993, +3292, 2106, 2992, +3292, 2108, 2992, +3291, 2111, 2991, +3291, 2115, 2990, +3290, 2121, 2989, +3289, 2128, 2987, +3287, 2138, 2985, +3285, 2150, 2981, +3282, 2166, 2977, +3278, 2187, 2971, +3273, 2213, 2963, +3266, 2246, 2953, +3256, 2287, 2938, +3242, 2336, 2917, +3224, 2395, 2888, +3198, 2463, 2846, +3161, 2541, 2783, +3105, 2627, 2681, +3019, 2722, 2497, +2870, 2824, 1992, +2536, 2932, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3660, 0, +3425, 2232, 3126, +3425, 2232, 3126, +3425, 2233, 3125, +3425, 2233, 3125, +3425, 2234, 3125, +3425, 2236, 3125, +3424, 2238, 3124, +3424, 2240, 3124, +3424, 2243, 3123, +3423, 2247, 3122, +3422, 2253, 3121, +3421, 2260, 3119, +3419, 2270, 3117, +3417, 2282, 3113, +3414, 2298, 3109, +3410, 2319, 3103, +3405, 2345, 3095, +3398, 2378, 3085, +3388, 2419, 3070, +3375, 2468, 3049, +3356, 2527, 3020, +3330, 2595, 2978, +3293, 2673, 2915, +3237, 2759, 2813, +3151, 2854, 2629, +3002, 2956, 2124, +2668, 3064, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2363, 3258, +3557, 2364, 3258, +3557, 2364, 3258, +3557, 2365, 3258, +3557, 2365, 3257, +3557, 2366, 3257, +3557, 2368, 3257, +3557, 2370, 3256, +3556, 2372, 3256, +3556, 2375, 3255, +3555, 2379, 3254, +3554, 2385, 3253, +3553, 2392, 3251, +3551, 2402, 3249, +3549, 2414, 3245, +3546, 2430, 3241, +3542, 2451, 3235, +3537, 2477, 3227, +3530, 2510, 3217, +3520, 2551, 3202, +3507, 2600, 3181, +3488, 2659, 3152, +3462, 2727, 3110, +3425, 2805, 3047, +3369, 2891, 2945, +3283, 2986, 2760, +3134, 3088, 2255, +2800, 3196, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3690, 2495, 3390, +3690, 2495, 3390, +3690, 2496, 3390, +3689, 2496, 3390, +3689, 2497, 3390, +3689, 2497, 3389, +3689, 2498, 3389, +3689, 2500, 3389, +3689, 2501, 3388, +3688, 2504, 3388, +3688, 2507, 3387, +3687, 2511, 3386, +3686, 2517, 3385, +3685, 2524, 3383, +3683, 2534, 3381, +3681, 2546, 3378, +3678, 2562, 3373, +3674, 2583, 3367, +3669, 2609, 3360, +3662, 2642, 3349, +3652, 2683, 3334, +3639, 2732, 3313, +3620, 2791, 3284, +3594, 2859, 3242, +3557, 2937, 3179, +3502, 3023, 3077, +3415, 3118, 2892, +3266, 3220, 2387, +2933, 3328, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3822, 2627, 3522, +3822, 2627, 3522, +3822, 2627, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2629, 3522, +3821, 2629, 3521, +3821, 2630, 3521, +3821, 2632, 3521, +3821, 2633, 3521, +3820, 2636, 3520, +3820, 2639, 3519, +3819, 2643, 3518, +3818, 2649, 3517, +3817, 2656, 3515, +3816, 2666, 3513, +3813, 2678, 3510, +3810, 2694, 3505, +3807, 2715, 3499, +3801, 2741, 3492, +3794, 2774, 3481, +3784, 2815, 3466, +3771, 2864, 3445, +3752, 2923, 3416, +3726, 2991, 3374, +3689, 3069, 3311, +3634, 3155, 3209, +3547, 3250, 3024, +3398, 3352, 2519, +3065, 3460, 0, +0, 3574, 0, +0, 3691, 0, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3953, 2761, 3654, +3953, 2762, 3653, +3953, 2764, 3653, +3953, 2765, 3653, +3952, 2768, 3652, +3952, 2771, 3651, +3951, 2775, 3650, +3950, 2781, 3649, +3949, 2788, 3647, +3948, 2798, 3645, +3945, 2810, 3642, +3943, 2826, 3637, +3939, 2847, 3632, +3933, 2873, 3624, +3926, 2906, 3613, +3916, 2947, 3598, +3903, 2996, 3577, +3884, 3055, 3548, +3858, 3123, 3506, +3821, 3201, 3443, +3766, 3287, 3341, +3679, 3382, 3156, +3530, 3484, 2651, +3197, 3592, 0, +0, 3706, 0, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2893, 3786, +4085, 2894, 3785, +4085, 2896, 3785, +4085, 2897, 3785, +4085, 2900, 3784, +4084, 2903, 3783, +4083, 2907, 3782, +4083, 2913, 3781, +4081, 2920, 3779, +4080, 2930, 3777, +4078, 2942, 3774, +4075, 2958, 3769, +4071, 2979, 3764, +4065, 3005, 3756, +4058, 3038, 3745, +4049, 3079, 3730, +4035, 3128, 3709, +4017, 3187, 3680, +3991, 3255, 3638, +3953, 3333, 3575, +3898, 3419, 3473, +3812, 3514, 3289, +3662, 3616, 2783, +3329, 3725, 0, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3025, 3918, +4095, 3026, 3917, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3032, 3916, +4095, 3035, 3915, +4095, 3039, 3915, +4095, 3045, 3913, +4095, 3052, 3911, +4095, 3062, 3909, +4095, 3074, 3906, +4095, 3090, 3902, +4095, 3111, 3896, +4095, 3137, 3888, +4095, 3170, 3877, +4095, 3211, 3862, +4095, 3261, 3842, +4095, 3319, 3812, +4095, 3387, 3770, +4085, 3465, 3707, +4030, 3551, 3605, +3944, 3646, 3421, +3794, 3748, 2915, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3167, 4048, +4095, 3171, 4047, +4095, 3177, 4045, +4095, 3184, 4044, +4095, 3194, 4041, +4095, 3206, 4038, +4095, 3222, 4034, +4095, 3243, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3343, 3994, +4095, 3393, 3974, +4095, 3451, 3944, +4095, 3519, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 0, 0, +0, 0, 0, +0, 49, 0, +0, 132, 0, +0, 224, 0, +0, 324, 0, +0, 430, 0, +0, 542, 0, +0, 658, 0, +0, 778, 0, +0, 901, 0, +0, 1025, 0, +0, 1152, 0, +0, 1280, 0, +0, 1409, 0, +0, 1539, 0, +0, 1669, 0, +0, 1800, 0, +0, 1931, 0, +0, 2063, 0, +0, 2194, 0, +0, 2326, 0, +0, 2458, 0, +0, 2589, 0, +0, 2721, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3381, 0, +0, 3514, 0, +0, 3646, 0, +104, 0, 80, +0, 0, 0, +0, 66, 0, +0, 147, 0, +0, 236, 0, +0, 333, 0, +0, 438, 0, +0, 548, 0, +0, 662, 0, +0, 781, 0, +0, 903, 0, +0, 1028, 0, +0, 1154, 0, +0, 1281, 0, +0, 1410, 0, +0, 1540, 0, +0, 1670, 0, +0, 1800, 0, +0, 1931, 0, +0, 2063, 0, +0, 2194, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2721, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3381, 0, +0, 3514, 0, +0, 3646, 0, +326, 0, 214, +262, 20, 152, +160, 88, 54, +0, 165, 0, +0, 251, 0, +0, 346, 0, +0, 447, 0, +0, 555, 0, +0, 668, 0, +0, 786, 0, +0, 907, 0, +0, 1030, 0, +0, 1156, 0, +0, 1283, 0, +0, 1411, 0, +0, 1540, 0, +0, 1670, 0, +0, 1801, 0, +0, 1932, 0, +0, 2063, 0, +0, 2194, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +515, 0, 347, +474, 52, 302, +413, 116, 234, +315, 188, 122, +139, 271, 0, +0, 361, 0, +0, 460, 0, +0, 565, 0, +0, 676, 0, +0, 792, 0, +0, 911, 0, +0, 1034, 0, +0, 1158, 0, +0, 1285, 0, +0, 1413, 0, +0, 1542, 0, +0, 1671, 0, +0, 1802, 0, +0, 1932, 0, +0, 2063, 0, +0, 2195, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +686, 42, 481, +658, 92, 447, +618, 150, 399, +558, 218, 324, +463, 295, 200, +295, 382, 0, +0, 477, 0, +0, 579, 0, +0, 687, 0, +0, 800, 0, +0, 918, 0, +0, 1039, 0, +0, 1162, 0, +0, 1288, 0, +0, 1415, 0, +0, 1543, 0, +0, 1673, 0, +0, 1802, 0, +0, 1933, 0, +0, 2064, 0, +0, 2195, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +844, 96, 614, +825, 140, 589, +798, 192, 554, +758, 255, 502, +700, 327, 422, +607, 408, 287, +444, 498, 4, +53, 596, 0, +0, 700, 0, +0, 811, 0, +0, 926, 0, +0, 1045, 0, +0, 1167, 0, +0, 1291, 0, +0, 1418, 0, +0, 1545, 0, +0, 1674, 0, +0, 1804, 0, +0, 1934, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +996, 158, 746, +982, 197, 728, +963, 244, 702, +936, 300, 666, +897, 365, 611, +839, 440, 527, +748, 525, 382, +589, 617, 65, +214, 718, 0, +0, 824, 0, +0, 936, 0, +0, 1053, 0, +0, 1173, 0, +0, 1296, 0, +0, 1421, 0, +0, 1548, 0, +0, 1676, 0, +0, 1805, 0, +0, 1935, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1141, 230, 879, +1131, 263, 865, +1118, 304, 846, +1099, 354, 820, +1072, 412, 782, +1034, 481, 726, +976, 558, 638, +887, 645, 484, +730, 740, 135, +367, 842, 0, +0, 950, 0, +0, 1064, 0, +0, 1181, 0, +0, 1302, 0, +0, 1426, 0, +0, 1552, 0, +0, 1679, 0, +0, 1807, 0, +0, 1937, 0, +0, 2067, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1284, 312, 1011, +1276, 340, 1001, +1266, 374, 987, +1253, 417, 968, +1234, 468, 941, +1207, 529, 902, +1169, 600, 844, +1112, 679, 753, +1024, 768, 593, +869, 865, 214, +514, 968, 0, +0, 1078, 0, +0, 1192, 0, +0, 1311, 0, +0, 1432, 0, +0, 1557, 0, +0, 1683, 0, +0, 1810, 0, +0, 1939, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1423, 402, 1144, +1418, 425, 1136, +1410, 454, 1126, +1401, 490, 1112, +1387, 534, 1092, +1368, 587, 1064, +1342, 650, 1025, +1304, 722, 966, +1247, 803, 872, +1159, 893, 706, +1006, 991, 302, +657, 1096, 0, +0, 1206, 0, +0, 1322, 0, +0, 1441, 0, +0, 1563, 0, +0, 1687, 0, +0, 1814, 0, +0, 1941, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1561, 500, 1276, +1557, 518, 1270, +1551, 542, 1263, +1544, 572, 1252, +1534, 609, 1238, +1521, 655, 1218, +1502, 709, 1190, +1476, 773, 1150, +1438, 846, 1090, +1382, 929, 994, +1294, 1020, 824, +1142, 1119, 399, +797, 1225, 0, +0, 1336, 0, +0, 1452, 0, +0, 1571, 0, +0, 1694, 0, +0, 1819, 0, +0, 1945, 0, +0, 2073, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1697, 605, 1408, +1694, 619, 1404, +1690, 639, 1398, +1684, 663, 1391, +1677, 694, 1380, +1667, 732, 1366, +1654, 778, 1346, +1635, 833, 1317, +1609, 898, 1277, +1571, 973, 1216, +1515, 1056, 1119, +1428, 1148, 945, +1277, 1248, 502, +935, 1354, 0, +0, 1466, 0, +0, 1582, 0, +0, 1702, 0, +0, 1825, 0, +0, 1950, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1832, 715, 1540, +1830, 727, 1537, +1827, 742, 1533, +1823, 761, 1527, +1817, 786, 1519, +1810, 818, 1509, +1800, 856, 1494, +1787, 903, 1474, +1768, 959, 1446, +1742, 1025, 1405, +1704, 1100, 1343, +1649, 1185, 1245, +1562, 1277, 1069, +1411, 1378, 612, +1071, 1484, 0, +0, 1597, 0, +0, 1713, 0, +0, 1833, 0, +0, 1956, 0, +0, 2082, 0, +0, 2208, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1966, 830, 1672, +1964, 840, 1670, +1962, 851, 1667, +1959, 867, 1663, +1955, 887, 1657, +1950, 912, 1649, +1943, 943, 1639, +1933, 983, 1624, +1920, 1030, 1604, +1901, 1087, 1575, +1875, 1153, 1534, +1837, 1229, 1472, +1782, 1314, 1373, +1695, 1407, 1194, +1544, 1508, 726, +1206, 1615, 0, +0, 1728, 0, +0, 1845, 0, +0, 1965, 0, +0, 2088, 0, +0, 2213, 0, +0, 2340, 0, +0, 2468, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +2100, 950, 1805, +2099, 957, 1803, +2097, 966, 1801, +2095, 978, 1797, +2092, 993, 1793, +2088, 1013, 1787, +2083, 1039, 1780, +2075, 1071, 1769, +2066, 1110, 1754, +2052, 1159, 1734, +2034, 1216, 1705, +2007, 1282, 1663, +1970, 1359, 1601, +1914, 1444, 1502, +1828, 1538, 1322, +1678, 1639, 844, +1341, 1746, 0, +0, 1859, 0, +0, 1976, 0, +0, 2097, 0, +0, 2220, 0, +0, 2345, 0, +0, 2472, 0, +0, 2600, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2233, 1072, 1937, +2232, 1077, 1935, +2231, 1084, 1934, +2229, 1093, 1931, +2227, 1106, 1928, +2224, 1121, 1924, +2220, 1142, 1918, +2215, 1167, 1910, +2208, 1200, 1900, +2198, 1239, 1885, +2185, 1288, 1864, +2166, 1345, 1836, +2140, 1412, 1794, +2103, 1489, 1731, +2047, 1575, 1631, +1960, 1669, 1450, +1810, 1770, 966, +1475, 1878, 0, +0, 1990, 0, +0, 2108, 0, +0, 2228, 0, +0, 2352, 0, +0, 2477, 0, +0, 2604, 0, +0, 2732, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2366, 1196, 2069, +2365, 1200, 2068, +2365, 1206, 2067, +2363, 1213, 2065, +2362, 1222, 2063, +2360, 1234, 2059, +2357, 1250, 2055, +2353, 1271, 2049, +2347, 1297, 2041, +2340, 1329, 2031, +2330, 1369, 2016, +2317, 1418, 1995, +2298, 1475, 1966, +2272, 1543, 1925, +2235, 1620, 1862, +2180, 1706, 1762, +2093, 1800, 1579, +1943, 1901, 1090, +1608, 2009, 0, +0, 2122, 0, +0, 2239, 0, +0, 2360, 0, +0, 2483, 0, +0, 2609, 0, +0, 2736, 0, +0, 2864, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2499, 1323, 2201, +2498, 1326, 2200, +2498, 1330, 2199, +2497, 1335, 2198, +2496, 1342, 2196, +2494, 1352, 2194, +2492, 1364, 2191, +2489, 1380, 2186, +2485, 1400, 2181, +2480, 1426, 2173, +2473, 1459, 2162, +2463, 1499, 2147, +2449, 1548, 2127, +2431, 1606, 2098, +2405, 1674, 2056, +2367, 1751, 1993, +2312, 1837, 1892, +2225, 1931, 1709, +2076, 2033, 1216, +1741, 2141, 0, +0, 2254, 0, +0, 2371, 0, +0, 2492, 0, +0, 2615, 0, +0, 2741, 0, +0, 2868, 0, +0, 2996, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2631, 1450, 2333, +2631, 1453, 2333, +2631, 1456, 2332, +2630, 1460, 2331, +2629, 1465, 2330, +2628, 1473, 2328, +2626, 1482, 2325, +2624, 1494, 2322, +2621, 1510, 2318, +2617, 1531, 2312, +2612, 1557, 2304, +2605, 1590, 2294, +2595, 1630, 2279, +2582, 1679, 2258, +2563, 1737, 2229, +2537, 1805, 2187, +2500, 1882, 2124, +2444, 1968, 2023, +2358, 2063, 1840, +2208, 2164, 1343, +1874, 2272, 0, +0, 2386, 0, +0, 2503, 0, +0, 2624, 0, +0, 2747, 0, +0, 2873, 0, +0, 3000, 0, +0, 3128, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2764, 1579, 2465, +2764, 1581, 2465, +2763, 1583, 2464, +2763, 1586, 2464, +2762, 1590, 2463, +2761, 1596, 2461, +2760, 1603, 2460, +2758, 1613, 2457, +2756, 1625, 2454, +2753, 1641, 2450, +2749, 1662, 2444, +2744, 1688, 2436, +2737, 1721, 2425, +2727, 1761, 2410, +2714, 1810, 2390, +2695, 1868, 2361, +2669, 1936, 2319, +2632, 2013, 2256, +2576, 2100, 2155, +2490, 2194, 1971, +2341, 2296, 1472, +2006, 2404, 0, +0, 2518, 0, +0, 2635, 0, +0, 2756, 0, +0, 2879, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1709, 2597, +2896, 1710, 2597, +2896, 1712, 2597, +2895, 1714, 2596, +2895, 1717, 2595, +2894, 1721, 2594, +2893, 1727, 2593, +2892, 1734, 2591, +2891, 1744, 2589, +2888, 1756, 2586, +2886, 1772, 2581, +2882, 1793, 2576, +2876, 1819, 2568, +2869, 1852, 2557, +2859, 1892, 2542, +2846, 1942, 2522, +2827, 2000, 2492, +2801, 2068, 2450, +2764, 2145, 2387, +2709, 2232, 2286, +2622, 2326, 2102, +2473, 2428, 1601, +2139, 2536, 0, +0, 2650, 0, +0, 2767, 0, +0, 2888, 0, +0, 3011, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3029, 1839, 2729, +3029, 1840, 2729, +3028, 1841, 2729, +3028, 1843, 2729, +3028, 1845, 2728, +3027, 1849, 2727, +3026, 1853, 2726, +3026, 1858, 2725, +3024, 1865, 2723, +3023, 1875, 2721, +3021, 1887, 2718, +3018, 1904, 2713, +3014, 1924, 2708, +3009, 1950, 2700, +3001, 1983, 2689, +2992, 2024, 2674, +2978, 2073, 2653, +2960, 2132, 2624, +2934, 2199, 2582, +2896, 2277, 2519, +2841, 2363, 2418, +2754, 2458, 2234, +2605, 2560, 1732, +2271, 2668, 0, +0, 2781, 0, +0, 2899, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3161, 1970, 2862, +3161, 1970, 2861, +3161, 1971, 2861, +3160, 1973, 2861, +3160, 1975, 2860, +3160, 1977, 2860, +3159, 1980, 2859, +3159, 1984, 2858, +3158, 1990, 2857, +3157, 1997, 2855, +3155, 2006, 2853, +3153, 2019, 2850, +3150, 2035, 2845, +3146, 2056, 2839, +3141, 2082, 2832, +3133, 2115, 2821, +3124, 2156, 2806, +3110, 2205, 2785, +3092, 2263, 2756, +3066, 2331, 2714, +3028, 2409, 2651, +2973, 2495, 2550, +2887, 2590, 2365, +2737, 2692, 1862, +2404, 2800, 0, +0, 2914, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3293, 2101, 2994, +3293, 2101, 2994, +3293, 2102, 2993, +3293, 2103, 2993, +3293, 2104, 2993, +3292, 2106, 2992, +3292, 2109, 2992, +3291, 2112, 2991, +3291, 2116, 2990, +3290, 2121, 2989, +3289, 2129, 2987, +3287, 2138, 2985, +3285, 2151, 2982, +3282, 2167, 2977, +3278, 2187, 2971, +3273, 2214, 2963, +3266, 2247, 2953, +3256, 2287, 2938, +3242, 2337, 2917, +3224, 2395, 2888, +3198, 2463, 2846, +3160, 2541, 2783, +3105, 2627, 2681, +3019, 2722, 2497, +2870, 2824, 1993, +2536, 2932, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3660, 0, +3425, 2232, 3126, +3425, 2232, 3126, +3425, 2233, 3126, +3425, 2234, 3125, +3425, 2235, 3125, +3425, 2236, 3125, +3424, 2238, 3124, +3424, 2240, 3124, +3424, 2243, 3123, +3423, 2248, 3122, +3422, 2253, 3121, +3421, 2260, 3119, +3419, 2270, 3117, +3417, 2282, 3114, +3414, 2299, 3109, +3410, 2319, 3103, +3405, 2346, 3095, +3398, 2379, 3085, +3388, 2419, 3070, +3375, 2469, 3049, +3356, 2527, 3020, +3330, 2595, 2978, +3293, 2673, 2915, +3237, 2759, 2813, +3151, 2854, 2629, +3002, 2956, 2124, +2668, 3064, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2364, 3258, +3557, 2364, 3258, +3557, 2364, 3258, +3557, 2365, 3258, +3557, 2366, 3257, +3557, 2367, 3257, +3557, 2368, 3257, +3557, 2370, 3256, +3556, 2372, 3256, +3556, 2375, 3255, +3555, 2379, 3254, +3554, 2385, 3253, +3553, 2392, 3251, +3551, 2402, 3249, +3549, 2414, 3246, +3546, 2430, 3241, +3542, 2451, 3235, +3537, 2477, 3228, +3530, 2510, 3217, +3520, 2551, 3202, +3507, 2600, 3181, +3488, 2659, 3152, +3462, 2727, 3110, +3425, 2805, 3047, +3369, 2891, 2945, +3283, 2986, 2761, +3134, 3088, 2256, +2800, 3196, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3690, 2495, 3390, +3690, 2495, 3390, +3690, 2496, 3390, +3689, 2496, 3390, +3689, 2497, 3390, +3689, 2497, 3389, +3689, 2498, 3389, +3689, 2500, 3389, +3689, 2502, 3389, +3688, 2504, 3388, +3688, 2507, 3387, +3687, 2511, 3386, +3686, 2517, 3385, +3685, 2524, 3383, +3683, 2534, 3381, +3681, 2546, 3378, +3678, 2562, 3373, +3674, 2583, 3367, +3669, 2609, 3360, +3662, 2642, 3349, +3652, 2683, 3334, +3639, 2732, 3313, +3620, 2791, 3284, +3594, 2859, 3242, +3557, 2937, 3179, +3502, 3023, 3077, +3415, 3118, 2893, +3266, 3220, 2387, +2933, 3328, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3822, 2627, 3522, +3822, 2627, 3522, +3822, 2627, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3821, 2629, 3522, +3821, 2629, 3522, +3821, 2630, 3521, +3821, 2632, 3521, +3821, 2634, 3521, +3820, 2636, 3520, +3820, 2639, 3519, +3819, 2643, 3518, +3818, 2649, 3517, +3817, 2656, 3515, +3815, 2666, 3513, +3813, 2678, 3510, +3810, 2694, 3505, +3807, 2715, 3500, +3801, 2741, 3492, +3794, 2774, 3481, +3784, 2815, 3466, +3771, 2864, 3445, +3752, 2923, 3416, +3726, 2991, 3374, +3689, 3069, 3311, +3634, 3155, 3209, +3547, 3250, 3025, +3398, 3352, 2519, +3065, 3460, 0, +0, 3574, 0, +0, 3691, 0, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3953, 2761, 3654, +3953, 2762, 3653, +3953, 2764, 3653, +3953, 2766, 3653, +3952, 2768, 3652, +3952, 2771, 3651, +3951, 2775, 3650, +3950, 2781, 3649, +3949, 2788, 3647, +3948, 2798, 3645, +3945, 2810, 3642, +3943, 2826, 3637, +3939, 2847, 3632, +3933, 2873, 3624, +3926, 2906, 3613, +3916, 2947, 3598, +3903, 2996, 3577, +3884, 3055, 3548, +3858, 3123, 3506, +3821, 3201, 3443, +3766, 3287, 3341, +3679, 3382, 3157, +3530, 3484, 2651, +3197, 3592, 0, +0, 3706, 0, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2893, 3786, +4085, 2894, 3785, +4085, 2896, 3785, +4085, 2898, 3785, +4085, 2900, 3784, +4084, 2903, 3783, +4083, 2907, 3782, +4083, 2913, 3781, +4081, 2920, 3779, +4080, 2930, 3777, +4078, 2942, 3774, +4075, 2958, 3769, +4071, 2979, 3764, +4065, 3005, 3756, +4058, 3038, 3745, +4049, 3079, 3730, +4035, 3129, 3709, +4017, 3187, 3680, +3991, 3255, 3638, +3953, 3333, 3575, +3898, 3419, 3473, +3811, 3514, 3289, +3662, 3616, 2783, +3329, 3725, 0, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3032, 3916, +4095, 3035, 3916, +4095, 3039, 3915, +4095, 3045, 3913, +4095, 3052, 3911, +4095, 3062, 3909, +4095, 3074, 3906, +4095, 3090, 3902, +4095, 3111, 3896, +4095, 3137, 3888, +4095, 3171, 3877, +4095, 3211, 3862, +4095, 3261, 3842, +4095, 3319, 3812, +4095, 3387, 3770, +4085, 3465, 3707, +4030, 3551, 3605, +3944, 3646, 3421, +3794, 3748, 2915, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3167, 4048, +4095, 3171, 4047, +4095, 3177, 4045, +4095, 3184, 4044, +4095, 3194, 4041, +4095, 3206, 4038, +4095, 3222, 4034, +4095, 3243, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3343, 3994, +4095, 3393, 3974, +4095, 3451, 3944, +4095, 3519, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 0, 36, +0, 24, 0, +0, 91, 0, +0, 168, 0, +0, 254, 0, +0, 348, 0, +0, 449, 0, +0, 557, 0, +0, 669, 0, +0, 787, 0, +0, 907, 0, +0, 1031, 0, +0, 1156, 0, +0, 1283, 0, +0, 1411, 0, +0, 1541, 0, +0, 1671, 0, +0, 1801, 0, +0, 1932, 0, +0, 2063, 0, +0, 2195, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +67, 0, 149, +0, 42, 77, +0, 107, 0, +0, 181, 0, +0, 264, 0, +0, 356, 0, +0, 456, 0, +0, 562, 0, +0, 674, 0, +0, 790, 0, +0, 910, 0, +0, 1033, 0, +0, 1158, 0, +0, 1284, 0, +0, 1412, 0, +0, 1541, 0, +0, 1671, 0, +0, 1801, 0, +0, 1932, 0, +0, 2063, 0, +0, 2195, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2853, 0, +0, 2985, 0, +0, 3117, 0, +0, 3249, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +303, 13, 267, +236, 65, 212, +127, 127, 127, +0, 198, 0, +0, 279, 0, +0, 368, 0, +0, 465, 0, +0, 570, 0, +0, 680, 0, +0, 795, 0, +0, 913, 0, +0, 1035, 0, +0, 1160, 0, +0, 1286, 0, +0, 1413, 0, +0, 1542, 0, +0, 1672, 0, +0, 1802, 0, +0, 1933, 0, +0, 2064, 0, +0, 2195, 0, +0, 2326, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2985, 0, +0, 3117, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +500, 45, 387, +458, 94, 346, +394, 152, 284, +292, 220, 186, +105, 297, 8, +0, 383, 0, +0, 478, 0, +0, 579, 0, +0, 687, 0, +0, 801, 0, +0, 918, 0, +0, 1039, 0, +0, 1162, 0, +0, 1288, 0, +0, 1415, 0, +0, 1543, 0, +0, 1673, 0, +0, 1803, 0, +0, 1933, 0, +0, 2064, 0, +0, 2195, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +676, 85, 511, +647, 130, 480, +606, 184, 434, +545, 248, 366, +447, 321, 254, +271, 403, 43, +0, 494, 0, +0, 592, 0, +0, 697, 0, +0, 808, 0, +0, 924, 0, +0, 1044, 0, +0, 1166, 0, +0, 1291, 0, +0, 1417, 0, +0, 1545, 0, +0, 1674, 0, +0, 1803, 0, +0, 1934, 0, +0, 2064, 0, +0, 2196, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +837, 134, 636, +818, 175, 613, +790, 224, 579, +750, 282, 531, +690, 350, 456, +596, 428, 332, +427, 514, 85, +12, 609, 0, +0, 711, 0, +0, 819, 0, +0, 932, 0, +0, 1050, 0, +0, 1171, 0, +0, 1294, 0, +0, 1420, 0, +0, 1547, 0, +0, 1675, 0, +0, 1805, 0, +0, 1935, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +991, 192, 763, +977, 228, 746, +957, 272, 721, +930, 325, 686, +891, 387, 634, +832, 459, 554, +740, 540, 419, +577, 630, 136, +186, 728, 0, +0, 832, 0, +0, 943, 0, +0, 1058, 0, +0, 1177, 0, +0, 1299, 0, +0, 1423, 0, +0, 1550, 0, +0, 1677, 0, +0, 1806, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1138, 259, 892, +1128, 290, 878, +1114, 329, 860, +1095, 376, 834, +1068, 432, 798, +1029, 497, 743, +971, 572, 659, +880, 657, 514, +721, 749, 197, +347, 850, 0, +0, 956, 0, +0, 1068, 0, +0, 1185, 0, +0, 1305, 0, +0, 1428, 0, +0, 1553, 0, +0, 1680, 0, +0, 1808, 0, +0, 1937, 0, +0, 2067, 0, +0, 2198, 0, +0, 2328, 0, +0, 2460, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1281, 336, 1021, +1274, 362, 1011, +1264, 395, 997, +1250, 436, 978, +1231, 486, 952, +1204, 544, 914, +1166, 613, 858, +1109, 690, 770, +1019, 777, 616, +862, 872, 267, +499, 974, 0, +0, 1082, 0, +0, 1196, 0, +0, 1314, 0, +0, 1435, 0, +0, 1558, 0, +0, 1684, 0, +0, 1811, 0, +0, 1939, 0, +0, 2069, 0, +0, 2199, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1421, 422, 1151, +1416, 444, 1143, +1408, 472, 1133, +1398, 506, 1119, +1385, 549, 1100, +1366, 601, 1073, +1339, 661, 1034, +1301, 732, 976, +1245, 811, 885, +1156, 900, 725, +1001, 997, 346, +646, 1100, 0, +0, 1210, 0, +0, 1324, 0, +0, 1443, 0, +0, 1565, 0, +0, 1689, 0, +0, 1815, 0, +0, 1942, 0, +0, 2071, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1559, 516, 1281, +1555, 534, 1276, +1550, 557, 1268, +1543, 586, 1258, +1533, 622, 1244, +1519, 666, 1224, +1500, 719, 1197, +1474, 782, 1157, +1436, 854, 1098, +1380, 935, 1004, +1291, 1025, 838, +1138, 1123, 434, +789, 1228, 0, +0, 1339, 0, +0, 1454, 0, +0, 1573, 0, +0, 1695, 0, +0, 1820, 0, +0, 1946, 0, +0, 2074, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1696, 617, 1412, +1693, 632, 1408, +1689, 651, 1402, +1683, 674, 1395, +1676, 704, 1384, +1666, 741, 1370, +1653, 787, 1350, +1634, 841, 1322, +1608, 905, 1282, +1570, 978, 1222, +1514, 1061, 1126, +1426, 1152, 956, +1274, 1251, 531, +929, 1357, 0, +0, 1468, 0, +0, 1584, 0, +0, 1703, 0, +0, 1826, 0, +0, 1951, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1831, 725, 1543, +1829, 737, 1540, +1826, 752, 1536, +1822, 771, 1530, +1817, 795, 1523, +1809, 826, 1512, +1800, 864, 1498, +1786, 910, 1478, +1767, 965, 1449, +1741, 1030, 1409, +1703, 1105, 1348, +1648, 1188, 1251, +1560, 1280, 1077, +1409, 1380, 634, +1067, 1486, 0, +0, 1598, 0, +0, 1714, 0, +0, 1834, 0, +0, 1957, 0, +0, 2082, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1965, 838, 1675, +1964, 847, 1672, +1962, 859, 1669, +1959, 874, 1665, +1955, 894, 1659, +1949, 918, 1652, +1942, 950, 1641, +1932, 988, 1626, +1919, 1035, 1606, +1900, 1092, 1578, +1874, 1157, 1537, +1837, 1232, 1475, +1781, 1317, 1377, +1694, 1409, 1201, +1543, 1510, 744, +1203, 1617, 0, +0, 1729, 0, +0, 1845, 0, +0, 1966, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +2099, 956, 1806, +2098, 963, 1805, +2097, 972, 1802, +2094, 983, 1799, +2091, 999, 1795, +2087, 1019, 1789, +2082, 1044, 1781, +2075, 1076, 1771, +2065, 1115, 1756, +2052, 1162, 1736, +2033, 1219, 1707, +2007, 1285, 1666, +1969, 1361, 1604, +1914, 1446, 1505, +1827, 1539, 1326, +1676, 1640, 858, +1338, 1747, 0, +0, 1860, 0, +0, 1977, 0, +0, 2097, 0, +0, 2220, 0, +0, 2345, 0, +0, 2472, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2233, 1076, 1938, +2232, 1082, 1937, +2231, 1089, 1935, +2229, 1098, 1933, +2227, 1110, 1929, +2224, 1125, 1925, +2220, 1146, 1919, +2215, 1171, 1912, +2208, 1203, 1901, +2198, 1243, 1886, +2184, 1291, 1866, +2166, 1348, 1837, +2140, 1415, 1796, +2102, 1491, 1733, +2047, 1576, 1634, +1960, 1670, 1454, +1810, 1771, 976, +1473, 1878, 0, +0, 1991, 0, +0, 2108, 0, +0, 2229, 0, +0, 2352, 0, +0, 2477, 0, +0, 2604, 0, +0, 2732, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2366, 1200, 2070, +2365, 1204, 2069, +2364, 1209, 2068, +2363, 1216, 2066, +2361, 1226, 2063, +2359, 1238, 2060, +2356, 1253, 2056, +2352, 1274, 2050, +2347, 1299, 2042, +2340, 1332, 2032, +2330, 1371, 2017, +2317, 1420, 1997, +2298, 1477, 1968, +2272, 1544, 1926, +2235, 1621, 1863, +2179, 1707, 1763, +2092, 1801, 1582, +1943, 1902, 1098, +1607, 2010, 0, +0, 2123, 0, +0, 2240, 0, +0, 2360, 0, +0, 2484, 0, +0, 2609, 0, +0, 2736, 0, +0, 2864, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2499, 1325, 2202, +2498, 1328, 2201, +2498, 1332, 2200, +2497, 1338, 2199, +2495, 1345, 2197, +2494, 1354, 2195, +2492, 1367, 2191, +2489, 1382, 2187, +2485, 1403, 2181, +2480, 1429, 2174, +2472, 1461, 2163, +2463, 1501, 2148, +2449, 1550, 2128, +2431, 1608, 2099, +2404, 1675, 2057, +2367, 1752, 1994, +2312, 1838, 1894, +2225, 1932, 1711, +2075, 2033, 1222, +1740, 2141, 0, +0, 2254, 0, +0, 2371, 0, +0, 2492, 0, +0, 2616, 0, +0, 2741, 0, +0, 2868, 0, +0, 2996, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2631, 1452, 2334, +2631, 1455, 2333, +2630, 1458, 2332, +2630, 1462, 2331, +2629, 1467, 2330, +2628, 1474, 2328, +2626, 1484, 2326, +2624, 1496, 2323, +2621, 1512, 2319, +2617, 1533, 2313, +2612, 1559, 2305, +2605, 1591, 2294, +2595, 1631, 2279, +2581, 1680, 2259, +2563, 1738, 2230, +2537, 1806, 2188, +2499, 1883, 2125, +2444, 1969, 2024, +2357, 2063, 1842, +2208, 2165, 1348, +1873, 2273, 0, +0, 2386, 0, +0, 2503, 0, +0, 2624, 0, +0, 2748, 0, +0, 2873, 0, +0, 3000, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2764, 1581, 2466, +2764, 1582, 2465, +2763, 1585, 2465, +2763, 1588, 2464, +2762, 1592, 2463, +2761, 1597, 2462, +2760, 1605, 2460, +2758, 1614, 2458, +2756, 1626, 2454, +2753, 1642, 2450, +2749, 1663, 2444, +2744, 1689, 2436, +2737, 1722, 2426, +2727, 1762, 2411, +2714, 1811, 2390, +2695, 1869, 2361, +2669, 1937, 2319, +2632, 2014, 2256, +2576, 2100, 2155, +2490, 2195, 1972, +2340, 2297, 1475, +2006, 2405, 0, +0, 2518, 0, +0, 2635, 0, +0, 2756, 0, +0, 2880, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1710, 2598, +2896, 1711, 2597, +2896, 1713, 2597, +2895, 1715, 2596, +2895, 1718, 2596, +2894, 1723, 2595, +2893, 1728, 2593, +2892, 1735, 2592, +2891, 1745, 2589, +2888, 1757, 2586, +2885, 1773, 2582, +2882, 1794, 2576, +2876, 1820, 2568, +2869, 1853, 2557, +2859, 1893, 2542, +2846, 1942, 2522, +2827, 2001, 2493, +2801, 2068, 2451, +2764, 2146, 2388, +2709, 2232, 2287, +2622, 2326, 2103, +2473, 2428, 1604, +2139, 2536, 0, +0, 2650, 0, +0, 2767, 0, +0, 2888, 0, +0, 3012, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3029, 1840, 2730, +3028, 1841, 2729, +3028, 1842, 2729, +3028, 1844, 2729, +3028, 1846, 2728, +3027, 1849, 2727, +3026, 1854, 2726, +3026, 1859, 2725, +3024, 1866, 2723, +3023, 1876, 2721, +3021, 1888, 2718, +3018, 1904, 2714, +3014, 1925, 2708, +3008, 1951, 2700, +3001, 1984, 2689, +2992, 2025, 2674, +2978, 2074, 2654, +2960, 2132, 2625, +2933, 2200, 2582, +2896, 2277, 2519, +2841, 2364, 2418, +2754, 2458, 2234, +2605, 2560, 1733, +2271, 2668, 0, +0, 2782, 0, +0, 2899, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3161, 1970, 2862, +3161, 1971, 2862, +3161, 1972, 2861, +3160, 1973, 2861, +3160, 1975, 2861, +3160, 1978, 2860, +3159, 1981, 2859, +3159, 1985, 2858, +3158, 1990, 2857, +3156, 1998, 2855, +3155, 2007, 2853, +3153, 2020, 2850, +3150, 2036, 2845, +3146, 2056, 2840, +3141, 2083, 2832, +3133, 2115, 2821, +3124, 2156, 2806, +3110, 2205, 2785, +3092, 2264, 2756, +3066, 2332, 2714, +3028, 2409, 2651, +2973, 2495, 2550, +2887, 2590, 2366, +2737, 2692, 1864, +2403, 2800, 0, +0, 2914, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3293, 2101, 2994, +3293, 2102, 2994, +3293, 2103, 2993, +3293, 2104, 2993, +3293, 2105, 2993, +3292, 2107, 2993, +3292, 2109, 2992, +3291, 2112, 2991, +3291, 2116, 2990, +3290, 2122, 2989, +3289, 2129, 2987, +3287, 2139, 2985, +3285, 2151, 2982, +3282, 2167, 2977, +3278, 2188, 2972, +3273, 2214, 2964, +3266, 2247, 2953, +3256, 2288, 2938, +3242, 2337, 2917, +3224, 2395, 2888, +3198, 2463, 2846, +3160, 2541, 2783, +3105, 2627, 2682, +3019, 2722, 2497, +2869, 2824, 1994, +2536, 2932, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3660, 0, +3425, 2232, 3126, +3425, 2233, 3126, +3425, 2233, 3126, +3425, 2234, 3125, +3425, 2235, 3125, +3425, 2236, 3125, +3424, 2238, 3125, +3424, 2241, 3124, +3424, 2244, 3123, +3423, 2248, 3122, +3422, 2253, 3121, +3421, 2261, 3119, +3419, 2270, 3117, +3417, 2283, 3114, +3414, 2299, 3109, +3410, 2320, 3103, +3405, 2346, 3096, +3398, 2379, 3085, +3388, 2420, 3070, +3375, 2469, 3049, +3356, 2527, 3020, +3330, 2595, 2978, +3293, 2673, 2915, +3237, 2759, 2814, +3151, 2854, 2629, +3002, 2956, 2125, +2668, 3064, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2364, 3258, +3557, 2364, 3258, +3557, 2365, 3258, +3557, 2365, 3258, +3557, 2366, 3257, +3557, 2367, 3257, +3557, 2368, 3257, +3557, 2370, 3257, +3556, 2372, 3256, +3556, 2375, 3255, +3555, 2380, 3254, +3554, 2385, 3253, +3553, 2392, 3251, +3551, 2402, 3249, +3549, 2414, 3246, +3546, 2431, 3241, +3542, 2451, 3235, +3537, 2478, 3228, +3530, 2511, 3217, +3520, 2551, 3202, +3507, 2601, 3181, +3488, 2659, 3152, +3462, 2727, 3110, +3425, 2805, 3047, +3369, 2891, 2945, +3283, 2986, 2761, +3134, 3088, 2256, +2800, 3196, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3690, 2495, 3390, +3690, 2496, 3390, +3690, 2496, 3390, +3689, 2496, 3390, +3689, 2497, 3390, +3689, 2498, 3389, +3689, 2499, 3389, +3689, 2500, 3389, +3689, 2502, 3389, +3688, 2504, 3388, +3688, 2507, 3387, +3687, 2511, 3386, +3686, 2517, 3385, +3685, 2524, 3383, +3683, 2534, 3381, +3681, 2546, 3378, +3678, 2562, 3373, +3674, 2583, 3368, +3669, 2610, 3360, +3662, 2643, 3349, +3652, 2683, 3334, +3639, 2733, 3313, +3620, 2791, 3284, +3594, 2859, 3242, +3557, 2937, 3179, +3502, 3023, 3077, +3415, 3118, 2893, +3266, 3220, 2388, +2932, 3328, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3822, 2627, 3522, +3822, 2627, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3821, 2629, 3522, +3821, 2630, 3522, +3821, 2631, 3521, +3821, 2632, 3521, +3821, 2634, 3521, +3820, 2636, 3520, +3820, 2639, 3519, +3819, 2643, 3518, +3818, 2649, 3517, +3817, 2656, 3515, +3815, 2666, 3513, +3813, 2678, 3510, +3810, 2694, 3505, +3807, 2715, 3500, +3801, 2742, 3492, +3794, 2775, 3481, +3784, 2815, 3466, +3771, 2865, 3445, +3752, 2923, 3416, +3726, 2991, 3374, +3689, 3069, 3311, +3634, 3155, 3209, +3547, 3250, 3025, +3398, 3352, 2520, +3065, 3460, 0, +0, 3574, 0, +0, 3691, 0, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3953, 2762, 3654, +3953, 2763, 3653, +3953, 2764, 3653, +3953, 2766, 3653, +3952, 2768, 3652, +3952, 2771, 3651, +3951, 2775, 3650, +3950, 2781, 3649, +3949, 2788, 3647, +3948, 2798, 3645, +3945, 2810, 3642, +3943, 2826, 3637, +3939, 2847, 3632, +3933, 2873, 3624, +3926, 2907, 3613, +3916, 2947, 3598, +3903, 2997, 3577, +3884, 3055, 3548, +3858, 3123, 3506, +3821, 3201, 3443, +3766, 3287, 3341, +3679, 3382, 3157, +3530, 3484, 2651, +3197, 3592, 0, +0, 3706, 0, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2894, 3786, +4085, 2895, 3785, +4085, 2896, 3785, +4085, 2898, 3785, +4085, 2900, 3784, +4084, 2903, 3783, +4083, 2907, 3782, +4083, 2913, 3781, +4081, 2920, 3779, +4080, 2930, 3777, +4078, 2942, 3774, +4075, 2958, 3770, +4071, 2979, 3764, +4065, 3005, 3756, +4058, 3039, 3745, +4049, 3079, 3730, +4035, 3129, 3709, +4017, 3187, 3680, +3991, 3255, 3638, +3953, 3333, 3575, +3898, 3419, 3473, +3811, 3514, 3289, +3662, 3616, 2783, +3329, 3725, 0, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3032, 3916, +4095, 3035, 3916, +4095, 3039, 3915, +4095, 3045, 3913, +4095, 3052, 3911, +4095, 3062, 3909, +4095, 3074, 3906, +4095, 3090, 3902, +4095, 3111, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3211, 3862, +4095, 3261, 3842, +4095, 3319, 3812, +4095, 3387, 3770, +4085, 3465, 3707, +4030, 3551, 3606, +3944, 3646, 3421, +3794, 3748, 2915, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3167, 4048, +4095, 3171, 4047, +4095, 3177, 4045, +4095, 3184, 4044, +4095, 3194, 4041, +4095, 3206, 4038, +4095, 3222, 4034, +4095, 3243, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3343, 3994, +4095, 3393, 3974, +4095, 3451, 3944, +4095, 3519, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 33, 135, +0, 83, 61, +0, 142, 0, +0, 211, 0, +0, 290, 0, +0, 377, 0, +0, 473, 0, +0, 576, 0, +0, 684, 0, +0, 798, 0, +0, 916, 0, +0, 1037, 0, +0, 1161, 0, +0, 1287, 0, +0, 1414, 0, +0, 1543, 0, +0, 1672, 0, +0, 1802, 0, +0, 1933, 0, +0, 2064, 0, +0, 2195, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +11, 50, 228, +0, 99, 168, +0, 156, 74, +0, 223, 0, +0, 300, 0, +0, 386, 0, +0, 480, 0, +0, 581, 0, +0, 689, 0, +0, 802, 0, +0, 919, 0, +0, 1039, 0, +0, 1163, 0, +0, 1288, 0, +0, 1415, 0, +0, 1543, 0, +0, 1673, 0, +0, 1803, 0, +0, 1933, 0, +0, 2064, 0, +0, 2195, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +271, 73, 329, +199, 119, 281, +79, 174, 209, +0, 239, 91, +0, 313, 0, +0, 397, 0, +0, 489, 0, +0, 588, 0, +0, 694, 0, +0, 806, 0, +0, 922, 0, +0, 1042, 0, +0, 1165, 0, +0, 1290, 0, +0, 1416, 0, +0, 1544, 0, +0, 1673, 0, +0, 1803, 0, +0, 1934, 0, +0, 2064, 0, +0, 2195, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +480, 102, 436, +435, 145, 399, +368, 197, 344, +259, 259, 259, +54, 330, 113, +0, 411, 0, +0, 500, 0, +0, 597, 0, +0, 702, 0, +0, 812, 0, +0, 927, 0, +0, 1045, 0, +0, 1167, 0, +0, 1292, 0, +0, 1418, 0, +0, 1546, 0, +0, 1674, 0, +0, 1804, 0, +0, 1934, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2458, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +662, 137, 548, +632, 177, 519, +590, 226, 478, +526, 284, 416, +424, 352, 318, +237, 429, 140, +0, 515, 0, +0, 610, 0, +0, 711, 0, +0, 819, 0, +0, 933, 0, +0, 1050, 0, +0, 1171, 0, +0, 1294, 0, +0, 1420, 0, +0, 1547, 0, +0, 1675, 0, +0, 1805, 0, +0, 1935, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +828, 181, 665, +808, 217, 643, +779, 262, 612, +738, 316, 566, +677, 380, 498, +579, 453, 386, +403, 535, 175, +0, 626, 0, +0, 724, 0, +0, 830, 0, +0, 941, 0, +0, 1056, 0, +0, 1176, 0, +0, 1298, 0, +0, 1423, 0, +0, 1549, 0, +0, 1677, 0, +0, 1806, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +984, 233, 785, +970, 266, 768, +950, 307, 745, +922, 356, 712, +882, 414, 663, +822, 482, 588, +728, 560, 464, +559, 646, 217, +144, 741, 0, +0, 843, 0, +0, 951, 0, +0, 1064, 0, +0, 1182, 0, +0, 1303, 0, +0, 1426, 0, +0, 1552, 0, +0, 1679, 0, +0, 1807, 0, +0, 1937, 0, +0, 2067, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1133, 295, 908, +1123, 324, 895, +1109, 360, 878, +1089, 404, 853, +1062, 457, 818, +1023, 519, 766, +964, 591, 686, +872, 672, 551, +709, 762, 268, +318, 860, 0, +0, 964, 0, +0, 1075, 0, +0, 1190, 0, +0, 1309, 0, +0, 1431, 0, +0, 1555, 0, +0, 1682, 0, +0, 1809, 0, +0, 1938, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1277, 366, 1033, +1270, 391, 1024, +1260, 422, 1010, +1246, 461, 992, +1227, 508, 967, +1200, 564, 930, +1161, 629, 876, +1103, 705, 791, +1013, 789, 646, +853, 882, 329, +479, 982, 0, +0, 1088, 0, +0, 1201, 0, +0, 1317, 0, +0, 1437, 0, +0, 1560, 0, +0, 1685, 0, +0, 1812, 0, +0, 1940, 0, +0, 2069, 0, +0, 2199, 0, +0, 2330, 0, +0, 2460, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1418, 447, 1160, +1413, 468, 1153, +1406, 494, 1143, +1396, 528, 1129, +1382, 568, 1111, +1363, 618, 1084, +1336, 677, 1046, +1298, 745, 990, +1241, 822, 902, +1151, 909, 748, +994, 1004, 399, +631, 1106, 0, +0, 1214, 0, +0, 1328, 0, +0, 1446, 0, +0, 1567, 0, +0, 1690, 0, +0, 1816, 0, +0, 1943, 0, +0, 2072, 0, +0, 2201, 0, +0, 2331, 0, +0, 2461, 0, +0, 2592, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1557, 537, 1288, +1553, 554, 1283, +1548, 576, 1275, +1540, 604, 1265, +1531, 639, 1251, +1517, 681, 1232, +1498, 733, 1205, +1471, 793, 1166, +1433, 864, 1108, +1377, 944, 1017, +1288, 1032, 857, +1133, 1129, 478, +778, 1232, 0, +0, 1342, 0, +0, 1456, 0, +0, 1575, 0, +0, 1697, 0, +0, 1821, 0, +0, 1947, 0, +0, 2074, 0, +0, 2203, 0, +0, 2332, 0, +0, 2463, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1694, 634, 1417, +1691, 648, 1413, +1687, 666, 1408, +1682, 689, 1400, +1675, 718, 1390, +1665, 754, 1376, +1651, 798, 1356, +1632, 851, 1329, +1606, 914, 1289, +1568, 986, 1230, +1512, 1067, 1136, +1424, 1157, 970, +1270, 1255, 567, +921, 1360, 0, +0, 1471, 0, +0, 1586, 0, +0, 1705, 0, +0, 1827, 0, +0, 1952, 0, +0, 2078, 0, +0, 2206, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1830, 738, 1547, +1828, 750, 1544, +1825, 764, 1540, +1821, 783, 1534, +1815, 806, 1527, +1808, 836, 1516, +1798, 873, 1502, +1785, 919, 1482, +1766, 973, 1454, +1740, 1037, 1414, +1702, 1110, 1354, +1646, 1193, 1258, +1558, 1284, 1088, +1406, 1383, 663, +1061, 1489, 0, +0, 1600, 0, +0, 1716, 0, +0, 1836, 0, +0, 1958, 0, +0, 2083, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1965, 849, 1678, +1963, 857, 1675, +1961, 869, 1672, +1958, 884, 1668, +1954, 903, 1662, +1949, 927, 1655, +1941, 958, 1644, +1932, 996, 1630, +1918, 1042, 1610, +1899, 1097, 1582, +1873, 1162, 1541, +1835, 1237, 1480, +1780, 1320, 1383, +1692, 1412, 1209, +1541, 1512, 766, +1199, 1618, 0, +0, 1730, 0, +0, 1847, 0, +0, 1966, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +2099, 964, 1809, +2098, 970, 1807, +2096, 979, 1804, +2094, 991, 1801, +2091, 1006, 1797, +2087, 1026, 1791, +2082, 1051, 1784, +2074, 1082, 1773, +2065, 1120, 1759, +2051, 1167, 1738, +2032, 1224, 1710, +2006, 1289, 1669, +1969, 1364, 1607, +1913, 1449, 1509, +1826, 1542, 1333, +1675, 1642, 876, +1335, 1749, 0, +0, 1861, 0, +0, 1978, 0, +0, 2098, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2232, 1083, 1940, +2231, 1088, 1938, +2230, 1095, 1937, +2229, 1104, 1934, +2226, 1116, 1931, +2224, 1131, 1927, +2220, 1151, 1921, +2214, 1176, 1913, +2207, 1208, 1903, +2197, 1247, 1888, +2184, 1294, 1868, +2165, 1351, 1839, +2139, 1417, 1798, +2101, 1493, 1736, +2046, 1578, 1637, +1959, 1671, 1459, +1809, 1772, 990, +1470, 1879, 0, +0, 1992, 0, +0, 2109, 0, +0, 2229, 0, +0, 2352, 0, +0, 2478, 0, +0, 2604, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2366, 1204, 2071, +2365, 1208, 2070, +2364, 1214, 2069, +2363, 1221, 2067, +2361, 1230, 2065, +2359, 1242, 2062, +2356, 1258, 2057, +2352, 1278, 2052, +2347, 1303, 2044, +2340, 1335, 2033, +2330, 1375, 2018, +2316, 1423, 1998, +2298, 1480, 1969, +2272, 1547, 1928, +2234, 1623, 1865, +2179, 1708, 1766, +2092, 1802, 1586, +1942, 1903, 1108, +1605, 2010, 0, +0, 2123, 0, +0, 2240, 0, +0, 2361, 0, +0, 2484, 0, +0, 2609, 0, +0, 2736, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2498, 1329, 2203, +2498, 1332, 2202, +2497, 1336, 2201, +2496, 1341, 2200, +2495, 1348, 2198, +2494, 1358, 2196, +2491, 1370, 2192, +2488, 1385, 2188, +2485, 1406, 2182, +2479, 1431, 2175, +2472, 1464, 2164, +2462, 1504, 2149, +2449, 1552, 2129, +2430, 1609, 2100, +2404, 1677, 2058, +2367, 1753, 1995, +2311, 1839, 1896, +2225, 1933, 1714, +2075, 2034, 1230, +1739, 2142, 0, +0, 2255, 0, +0, 2372, 0, +0, 2492, 0, +0, 2616, 0, +0, 2741, 0, +0, 2868, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2631, 1455, 2334, +2631, 1457, 2334, +2630, 1460, 2333, +2630, 1464, 2332, +2629, 1470, 2331, +2628, 1477, 2329, +2626, 1486, 2327, +2624, 1499, 2324, +2621, 1514, 2319, +2617, 1535, 2313, +2612, 1561, 2306, +2604, 1593, 2295, +2595, 1633, 2280, +2581, 1682, 2260, +2563, 1740, 2231, +2537, 1807, 2189, +2499, 1884, 2126, +2444, 1970, 2026, +2357, 2064, 1844, +2207, 2165, 1354, +1872, 2273, 0, +0, 2386, 0, +0, 2504, 0, +0, 2624, 0, +0, 2748, 0, +0, 2873, 0, +0, 3000, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2764, 1583, 2466, +2763, 1584, 2466, +2763, 1587, 2465, +2763, 1590, 2464, +2762, 1594, 2464, +2761, 1599, 2462, +2760, 1607, 2460, +2758, 1616, 2458, +2756, 1628, 2455, +2753, 1644, 2451, +2749, 1665, 2445, +2744, 1691, 2437, +2737, 1723, 2426, +2727, 1764, 2411, +2714, 1812, 2391, +2695, 1870, 2362, +2669, 1938, 2320, +2631, 2015, 2257, +2576, 2101, 2156, +2490, 2195, 1974, +2340, 2297, 1480, +2005, 2405, 0, +0, 2518, 0, +0, 2635, 0, +0, 2756, 0, +0, 2880, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1711, 2598, +2896, 1713, 2598, +2896, 1714, 2597, +2895, 1717, 2597, +2895, 1720, 2596, +2894, 1724, 2595, +2893, 1730, 2594, +2892, 1737, 2592, +2890, 1746, 2590, +2888, 1759, 2586, +2885, 1775, 2582, +2881, 1795, 2576, +2876, 1821, 2568, +2869, 1854, 2558, +2859, 1894, 2543, +2846, 1943, 2522, +2827, 2001, 2493, +2801, 2069, 2451, +2764, 2146, 2388, +2708, 2232, 2288, +2622, 2327, 2104, +2472, 2429, 1608, +2138, 2537, 0, +0, 2650, 0, +0, 2767, 0, +0, 2888, 0, +0, 3012, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3029, 1841, 2730, +3028, 1842, 2730, +3028, 1843, 2729, +3028, 1845, 2729, +3028, 1847, 2728, +3027, 1851, 2728, +3026, 1855, 2727, +3025, 1860, 2725, +3024, 1867, 2724, +3023, 1877, 2721, +3020, 1889, 2718, +3018, 1905, 2714, +3014, 1926, 2708, +3008, 1952, 2700, +3001, 1985, 2689, +2991, 2025, 2675, +2978, 2074, 2654, +2959, 2133, 2625, +2933, 2200, 2583, +2896, 2278, 2520, +2841, 2364, 2419, +2754, 2459, 2235, +2605, 2560, 1736, +2271, 2668, 0, +0, 2782, 0, +0, 2899, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3161, 1971, 2862, +3161, 1972, 2862, +3161, 1973, 2862, +3160, 1974, 2861, +3160, 1976, 2861, +3160, 1978, 2860, +3159, 1981, 2860, +3159, 1986, 2859, +3158, 1991, 2857, +3156, 1998, 2856, +3155, 2008, 2853, +3153, 2020, 2850, +3150, 2036, 2846, +3146, 2057, 2840, +3141, 2083, 2832, +3133, 2116, 2821, +3124, 2157, 2806, +3110, 2206, 2786, +3092, 2264, 2757, +3066, 2332, 2715, +3028, 2409, 2651, +2973, 2496, 2550, +2886, 2590, 2366, +2737, 2692, 1866, +2403, 2800, 0, +0, 2914, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3293, 2102, 2994, +3293, 2102, 2994, +3293, 2103, 2994, +3293, 2104, 2993, +3292, 2105, 2993, +3292, 2107, 2993, +3292, 2110, 2992, +3291, 2113, 2991, +3291, 2117, 2990, +3290, 2122, 2989, +3289, 2130, 2987, +3287, 2139, 2985, +3285, 2152, 2982, +3282, 2168, 2978, +3278, 2188, 2972, +3273, 2215, 2964, +3266, 2248, 2953, +3256, 2288, 2938, +3242, 2337, 2918, +3224, 2396, 2888, +3198, 2464, 2846, +3160, 2541, 2783, +3105, 2628, 2682, +3019, 2722, 2498, +2869, 2824, 1996, +2536, 2932, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3660, 0, +3425, 2233, 3126, +3425, 2233, 3126, +3425, 2234, 3126, +3425, 2235, 3126, +3425, 2236, 3125, +3425, 2237, 3125, +3424, 2239, 3125, +3424, 2241, 3124, +3423, 2244, 3123, +3423, 2248, 3122, +3422, 2254, 3121, +3421, 2261, 3119, +3419, 2271, 3117, +3417, 2283, 3114, +3414, 2299, 3109, +3410, 2320, 3104, +3405, 2346, 3096, +3398, 2379, 3085, +3388, 2420, 3070, +3375, 2469, 3049, +3356, 2527, 3020, +3330, 2595, 2978, +3293, 2673, 2915, +3237, 2759, 2814, +3151, 2854, 2629, +3002, 2956, 2126, +2668, 3064, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2364, 3258, +3557, 2365, 3258, +3557, 2365, 3258, +3557, 2365, 3258, +3557, 2366, 3258, +3557, 2367, 3257, +3557, 2369, 3257, +3556, 2370, 3257, +3556, 2373, 3256, +3556, 2376, 3255, +3555, 2380, 3254, +3554, 2386, 3253, +3553, 2393, 3251, +3551, 2402, 3249, +3549, 2415, 3246, +3546, 2431, 3241, +3542, 2452, 3236, +3537, 2478, 3228, +3530, 2511, 3217, +3520, 2552, 3202, +3507, 2601, 3181, +3488, 2659, 3152, +3462, 2727, 3110, +3425, 2805, 3047, +3369, 2891, 2946, +3283, 2986, 2761, +3134, 3088, 2257, +2800, 3196, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3690, 2496, 3390, +3690, 2496, 3390, +3690, 2496, 3390, +3689, 2497, 3390, +3689, 2497, 3390, +3689, 2498, 3390, +3689, 2499, 3389, +3689, 2500, 3389, +3689, 2502, 3389, +3688, 2504, 3388, +3688, 2508, 3387, +3687, 2512, 3386, +3686, 2517, 3385, +3685, 2525, 3383, +3683, 2534, 3381, +3681, 2547, 3378, +3678, 2563, 3373, +3674, 2583, 3368, +3669, 2610, 3360, +3662, 2643, 3349, +3652, 2683, 3334, +3639, 2733, 3313, +3620, 2791, 3284, +3594, 2859, 3242, +3557, 2937, 3179, +3501, 3023, 3078, +3415, 3118, 2893, +3266, 3220, 2389, +2932, 3328, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3822, 2627, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3821, 2629, 3522, +3821, 2630, 3522, +3821, 2631, 3521, +3821, 2632, 3521, +3821, 2634, 3521, +3820, 2636, 3520, +3820, 2639, 3519, +3819, 2644, 3518, +3818, 2649, 3517, +3817, 2656, 3515, +3815, 2666, 3513, +3813, 2678, 3510, +3810, 2695, 3505, +3806, 2715, 3500, +3801, 2742, 3492, +3794, 2775, 3481, +3784, 2815, 3466, +3771, 2865, 3445, +3752, 2923, 3416, +3726, 2991, 3374, +3689, 3069, 3311, +3634, 3155, 3210, +3547, 3250, 3025, +3398, 3352, 2520, +3065, 3460, 0, +0, 3574, 0, +0, 3691, 0, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3953, 2762, 3654, +3953, 2763, 3653, +3953, 2764, 3653, +3953, 2766, 3653, +3952, 2768, 3652, +3952, 2771, 3651, +3951, 2775, 3650, +3950, 2781, 3649, +3949, 2788, 3647, +3948, 2798, 3645, +3945, 2810, 3642, +3943, 2826, 3637, +3939, 2847, 3632, +3933, 2874, 3624, +3926, 2907, 3613, +3916, 2947, 3598, +3903, 2997, 3577, +3884, 3055, 3548, +3858, 3123, 3506, +3821, 3201, 3443, +3766, 3287, 3342, +3679, 3382, 3157, +3530, 3484, 2652, +3197, 3593, 0, +0, 3706, 0, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2894, 3786, +4085, 2895, 3785, +4085, 2896, 3785, +4085, 2898, 3785, +4085, 2900, 3784, +4084, 2903, 3783, +4083, 2907, 3782, +4082, 2913, 3781, +4081, 2920, 3779, +4080, 2930, 3777, +4078, 2942, 3774, +4075, 2958, 3770, +4071, 2979, 3764, +4065, 3006, 3756, +4058, 3039, 3745, +4048, 3079, 3730, +4035, 3129, 3710, +4017, 3187, 3680, +3990, 3255, 3638, +3953, 3333, 3575, +3898, 3419, 3474, +3811, 3514, 3289, +3662, 3616, 2783, +3329, 3725, 0, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3032, 3916, +4095, 3035, 3916, +4095, 3039, 3915, +4095, 3045, 3913, +4095, 3052, 3911, +4095, 3062, 3909, +4095, 3074, 3906, +4095, 3090, 3902, +4095, 3111, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3211, 3862, +4095, 3261, 3842, +4095, 3319, 3812, +4095, 3387, 3770, +4085, 3465, 3707, +4030, 3552, 3606, +3944, 3646, 3421, +3794, 3748, 2915, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3167, 4048, +4095, 3171, 4047, +4095, 3177, 4045, +4095, 3184, 4044, +4095, 3194, 4041, +4095, 3206, 4038, +4095, 3222, 4034, +4095, 3243, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3343, 3994, +4095, 3393, 3974, +4095, 3451, 3944, +4095, 3519, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 108, 241, +0, 151, 183, +0, 203, 91, +0, 264, 0, +0, 334, 0, +0, 414, 0, +0, 503, 0, +0, 600, 0, +0, 704, 0, +0, 813, 0, +0, 928, 0, +0, 1046, 0, +0, 1168, 0, +0, 1292, 0, +0, 1418, 0, +0, 1546, 0, +0, 1674, 0, +0, 1804, 0, +0, 1934, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 123, 316, +0, 165, 267, +0, 215, 193, +0, 274, 69, +0, 343, 0, +0, 422, 0, +0, 509, 0, +0, 605, 0, +0, 708, 0, +0, 816, 0, +0, 930, 0, +0, 1048, 0, +0, 1170, 0, +0, 1293, 0, +0, 1419, 0, +0, 1546, 0, +0, 1675, 0, +0, 1804, 0, +0, 1934, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +225, 143, 400, +144, 182, 360, +6, 231, 300, +0, 288, 206, +0, 355, 37, +0, 432, 0, +0, 518, 0, +0, 612, 0, +0, 713, 0, +0, 821, 0, +0, 934, 0, +0, 1051, 0, +0, 1171, 0, +0, 1295, 0, +0, 1420, 0, +0, 1547, 0, +0, 1676, 0, +0, 1805, 0, +0, 1935, 0, +0, 2065, 0, +0, 2196, 0, +0, 2327, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +451, 167, 493, +403, 205, 461, +331, 251, 413, +211, 306, 341, +0, 371, 223, +0, 445, 0, +0, 529, 0, +0, 621, 0, +0, 720, 0, +0, 826, 0, +0, 938, 0, +0, 1054, 0, +0, 1174, 0, +0, 1297, 0, +0, 1422, 0, +0, 1548, 0, +0, 1676, 0, +0, 1805, 0, +0, 1935, 0, +0, 2066, 0, +0, 2196, 0, +0, 2328, 0, +0, 2459, 0, +0, 2590, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +643, 198, 593, +612, 234, 568, +567, 277, 531, +500, 329, 476, +391, 391, 391, +186, 462, 245, +0, 543, 0, +0, 632, 0, +0, 730, 0, +0, 834, 0, +0, 944, 0, +0, 1059, 0, +0, 1178, 0, +0, 1299, 0, +0, 1424, 0, +0, 1550, 0, +0, 1678, 0, +0, 1806, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +815, 237, 700, +794, 269, 680, +765, 310, 651, +722, 358, 610, +658, 417, 548, +556, 484, 450, +369, 561, 272, +0, 647, 0, +0, 742, 0, +0, 844, 0, +0, 952, 0, +0, 1065, 0, +0, 1182, 0, +0, 1303, 0, +0, 1426, 0, +0, 1552, 0, +0, 1679, 0, +0, 1808, 0, +0, 1937, 0, +0, 2067, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +974, 283, 813, +960, 313, 797, +940, 350, 775, +911, 395, 744, +870, 448, 699, +809, 512, 630, +711, 585, 518, +535, 667, 307, +81, 758, 0, +0, 856, 0, +0, 962, 0, +0, 1073, 0, +0, 1188, 0, +0, 1308, 0, +0, 1430, 0, +0, 1555, 0, +0, 1681, 0, +0, 1809, 0, +0, 1938, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1126, 339, 929, +1116, 365, 917, +1102, 398, 900, +1082, 439, 877, +1054, 488, 844, +1014, 546, 795, +954, 614, 720, +860, 692, 596, +691, 778, 349, +276, 873, 0, +0, 975, 0, +0, 1083, 0, +0, 1196, 0, +0, 1314, 0, +0, 1435, 0, +0, 1558, 0, +0, 1684, 0, +0, 1811, 0, +0, 1939, 0, +0, 2069, 0, +0, 2199, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1272, 404, 1049, +1265, 427, 1040, +1255, 456, 1027, +1241, 492, 1010, +1221, 536, 985, +1194, 589, 950, +1155, 651, 898, +1096, 723, 818, +1004, 804, 683, +841, 894, 400, +450, 992, 0, +0, 1096, 0, +0, 1207, 0, +0, 1322, 0, +0, 1441, 0, +0, 1563, 0, +0, 1688, 0, +0, 1814, 0, +0, 1942, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1415, 479, 1172, +1409, 499, 1165, +1402, 523, 1156, +1392, 554, 1143, +1378, 593, 1124, +1359, 640, 1099, +1332, 696, 1062, +1293, 762, 1008, +1235, 837, 923, +1145, 921, 778, +985, 1014, 461, +611, 1114, 0, +0, 1221, 0, +0, 1333, 0, +0, 1449, 0, +0, 1569, 0, +0, 1692, 0, +0, 1817, 0, +0, 1944, 0, +0, 2072, 0, +0, 2202, 0, +0, 2331, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1555, 563, 1298, +1551, 579, 1292, +1545, 600, 1285, +1538, 627, 1275, +1528, 660, 1262, +1514, 701, 1243, +1495, 750, 1216, +1468, 809, 1178, +1430, 877, 1122, +1373, 955, 1034, +1283, 1041, 880, +1127, 1136, 531, +763, 1238, 0, +0, 1347, 0, +0, 1460, 0, +0, 1578, 0, +0, 1699, 0, +0, 1822, 0, +0, 1948, 0, +0, 2075, 0, +0, 2204, 0, +0, 2333, 0, +0, 2463, 0, +0, 2593, 0, +0, 2724, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1692, 656, 1424, +1689, 669, 1420, +1685, 686, 1415, +1680, 708, 1408, +1673, 736, 1397, +1663, 771, 1384, +1649, 813, 1364, +1630, 865, 1337, +1604, 926, 1298, +1565, 996, 1240, +1509, 1076, 1149, +1420, 1164, 989, +1265, 1261, 610, +910, 1365, 0, +0, 1474, 0, +0, 1589, 0, +0, 1707, 0, +0, 1829, 0, +0, 1953, 0, +0, 2079, 0, +0, 2206, 0, +0, 2335, 0, +0, 2464, 0, +0, 2595, 0, +0, 2725, 0, +0, 2856, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1828, 756, 1553, +1826, 766, 1550, +1823, 780, 1545, +1819, 798, 1540, +1814, 821, 1532, +1807, 850, 1522, +1797, 886, 1508, +1783, 930, 1488, +1764, 983, 1461, +1738, 1046, 1421, +1700, 1118, 1362, +1644, 1199, 1268, +1556, 1289, 1103, +1402, 1387, 699, +1053, 1492, 0, +0, 1603, 0, +0, 1718, 0, +0, 1837, 0, +0, 1959, 0, +0, 2084, 0, +0, 2210, 0, +0, 2338, 0, +0, 2467, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1964, 862, 1682, +1962, 871, 1679, +1960, 882, 1676, +1957, 896, 1672, +1953, 915, 1667, +1948, 938, 1659, +1940, 968, 1649, +1930, 1006, 1634, +1917, 1051, 1614, +1898, 1105, 1586, +1872, 1169, 1546, +1834, 1243, 1486, +1778, 1325, 1391, +1690, 1416, 1220, +1538, 1515, 795, +1193, 1621, 0, +0, 1732, 0, +0, 1848, 0, +0, 1968, 0, +0, 2090, 0, +0, 2215, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +2098, 974, 1812, +2097, 981, 1810, +2095, 989, 1808, +2093, 1001, 1804, +2090, 1016, 1800, +2086, 1035, 1795, +2081, 1059, 1787, +2074, 1090, 1776, +2064, 1128, 1762, +2050, 1174, 1742, +2032, 1230, 1714, +2005, 1294, 1673, +1968, 1369, 1612, +1912, 1452, 1515, +1824, 1545, 1341, +1673, 1644, 898, +1331, 1751, 0, +0, 1862, 0, +0, 1979, 0, +0, 2099, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2232, 1091, 1942, +2231, 1096, 1941, +2230, 1103, 1939, +2228, 1111, 1937, +2226, 1123, 1933, +2223, 1138, 1929, +2219, 1158, 1924, +2214, 1183, 1916, +2206, 1214, 1905, +2197, 1253, 1891, +2183, 1300, 1870, +2165, 1356, 1842, +2138, 1421, 1801, +2101, 1497, 1739, +2045, 1581, 1641, +1958, 1674, 1465, +1807, 1774, 1008, +1467, 1881, 0, +0, 1993, 0, +0, 2110, 0, +0, 2230, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2365, 1211, 2073, +2364, 1215, 2072, +2364, 1220, 2071, +2362, 1227, 2069, +2361, 1236, 2066, +2359, 1248, 2063, +2356, 1263, 2059, +2352, 1283, 2053, +2346, 1308, 2046, +2339, 1340, 2035, +2329, 1379, 2020, +2316, 1427, 2000, +2297, 1483, 1971, +2271, 1550, 1930, +2234, 1625, 1868, +2178, 1710, 1769, +2091, 1804, 1591, +1941, 1904, 1122, +1603, 2011, 0, +0, 2124, 0, +0, 2241, 0, +0, 2361, 0, +0, 2484, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2498, 1334, 2204, +2498, 1337, 2203, +2497, 1341, 2202, +2496, 1346, 2201, +2495, 1353, 2199, +2493, 1362, 2197, +2491, 1374, 2194, +2488, 1390, 2189, +2484, 1410, 2184, +2479, 1435, 2176, +2472, 1467, 2165, +2462, 1507, 2150, +2449, 1555, 2130, +2430, 1612, 2101, +2404, 1679, 2060, +2366, 1755, 1997, +2311, 1840, 1898, +2224, 1934, 1718, +2074, 2035, 1241, +1737, 2142, 0, +0, 2255, 0, +0, 2372, 0, +0, 2493, 0, +0, 2616, 0, +0, 2741, 0, +0, 2868, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2631, 1459, 2335, +2631, 1461, 2335, +2630, 1464, 2334, +2629, 1468, 2333, +2628, 1473, 2332, +2627, 1480, 2330, +2626, 1490, 2328, +2624, 1502, 2324, +2621, 1518, 2320, +2617, 1538, 2314, +2611, 1564, 2307, +2604, 1596, 2296, +2594, 1636, 2281, +2581, 1684, 2261, +2562, 1742, 2232, +2536, 1809, 2190, +2499, 1885, 2128, +2443, 1971, 2028, +2357, 2065, 1846, +2207, 2166, 1362, +1871, 2274, 0, +0, 2387, 0, +0, 2504, 0, +0, 2625, 0, +0, 2748, 0, +0, 2873, 0, +0, 3000, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2764, 1585, 2467, +2763, 1587, 2466, +2763, 1589, 2466, +2762, 1593, 2465, +2762, 1597, 2464, +2761, 1602, 2463, +2760, 1609, 2461, +2758, 1618, 2459, +2756, 1631, 2456, +2753, 1647, 2451, +2749, 1667, 2446, +2744, 1693, 2438, +2737, 1725, 2427, +2727, 1765, 2412, +2713, 1814, 2392, +2695, 1872, 2363, +2669, 1939, 2321, +2631, 2016, 2258, +2576, 2102, 2158, +2489, 2196, 1976, +2340, 2297, 1486, +2004, 2405, 0, +0, 2518, 0, +0, 2636, 0, +0, 2756, 0, +0, 2880, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1713, 2599, +2896, 1715, 2598, +2896, 1717, 2598, +2895, 1719, 2597, +2895, 1722, 2597, +2894, 1726, 2596, +2893, 1731, 2594, +2892, 1739, 2593, +2890, 1748, 2590, +2888, 1760, 2587, +2885, 1776, 2583, +2881, 1797, 2577, +2876, 1823, 2569, +2869, 1855, 2558, +2859, 1896, 2544, +2846, 1944, 2523, +2827, 2002, 2494, +2801, 2070, 2452, +2764, 2147, 2389, +2708, 2233, 2289, +2622, 2327, 2106, +2472, 2429, 1612, +2137, 2537, 0, +0, 2650, 0, +0, 2767, 0, +0, 2888, 0, +0, 3012, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3028, 1843, 2730, +3028, 1844, 2730, +3028, 1845, 2730, +3028, 1847, 2729, +3027, 1849, 2729, +3027, 1852, 2728, +3026, 1856, 2727, +3025, 1862, 2726, +3024, 1869, 2724, +3023, 1878, 2722, +3020, 1891, 2719, +3017, 1907, 2714, +3014, 1927, 2708, +3008, 1953, 2701, +3001, 1986, 2690, +2991, 2026, 2675, +2978, 2075, 2654, +2959, 2133, 2625, +2933, 2201, 2583, +2896, 2278, 2520, +2840, 2364, 2420, +2754, 2459, 2236, +2605, 2561, 1740, +2270, 2669, 0, +0, 2782, 0, +0, 2899, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3161, 1972, 2862, +3161, 1973, 2862, +3160, 1974, 2862, +3160, 1975, 2862, +3160, 1977, 2861, +3160, 1980, 2861, +3159, 1983, 2860, +3158, 1987, 2859, +3158, 1992, 2858, +3156, 1999, 2856, +3155, 2009, 2853, +3153, 2021, 2850, +3150, 2037, 2846, +3146, 2058, 2840, +3140, 2084, 2832, +3133, 2117, 2821, +3124, 2157, 2807, +3110, 2206, 2786, +3092, 2265, 2757, +3065, 2333, 2715, +3028, 2410, 2652, +2973, 2496, 2551, +2886, 2591, 2367, +2737, 2692, 1868, +2403, 2801, 0, +0, 2914, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3293, 2103, 2994, +3293, 2103, 2994, +3293, 2104, 2994, +3293, 2105, 2994, +3292, 2106, 2993, +3292, 2108, 2993, +3292, 2110, 2992, +3291, 2114, 2992, +3291, 2118, 2991, +3290, 2123, 2989, +3289, 2130, 2988, +3287, 2140, 2985, +3285, 2152, 2982, +3282, 2168, 2978, +3278, 2189, 2972, +3273, 2215, 2964, +3265, 2248, 2953, +3256, 2289, 2938, +3242, 2338, 2918, +3224, 2396, 2889, +3198, 2464, 2847, +3160, 2541, 2784, +3105, 2628, 2682, +3019, 2722, 2498, +2869, 2824, 1998, +2535, 2932, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3660, 0, +3425, 2234, 3126, +3425, 2234, 3126, +3425, 2235, 3126, +3425, 2235, 3126, +3425, 2236, 3126, +3425, 2238, 3125, +3424, 2239, 3125, +3424, 2242, 3124, +3423, 2245, 3124, +3423, 2249, 3123, +3422, 2255, 3121, +3421, 2262, 3119, +3419, 2271, 3117, +3417, 2284, 3114, +3414, 2300, 3110, +3410, 2320, 3104, +3405, 2347, 3096, +3398, 2380, 3085, +3388, 2420, 3070, +3374, 2469, 3050, +3356, 2528, 3021, +3330, 2596, 2978, +3292, 2673, 2915, +3237, 2760, 2814, +3151, 2854, 2630, +3001, 2956, 2128, +2668, 3064, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2365, 3258, +3557, 2365, 3258, +3557, 2365, 3258, +3557, 2366, 3258, +3557, 2367, 3258, +3557, 2368, 3257, +3557, 2369, 3257, +3556, 2371, 3257, +3556, 2373, 3256, +3556, 2376, 3255, +3555, 2380, 3254, +3554, 2386, 3253, +3553, 2393, 3251, +3551, 2403, 3249, +3549, 2415, 3246, +3546, 2431, 3242, +3542, 2452, 3236, +3537, 2478, 3228, +3530, 2511, 3217, +3520, 2552, 3202, +3507, 2601, 3182, +3488, 2660, 3152, +3462, 2728, 3110, +3425, 2805, 3047, +3369, 2892, 2946, +3283, 2986, 2761, +3134, 3088, 2258, +2800, 3196, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3690, 2496, 3390, +3690, 2496, 3390, +3689, 2497, 3390, +3689, 2497, 3390, +3689, 2498, 3390, +3689, 2498, 3390, +3689, 2499, 3389, +3689, 2501, 3389, +3689, 2502, 3389, +3688, 2505, 3388, +3688, 2508, 3387, +3687, 2512, 3386, +3686, 2518, 3385, +3685, 2525, 3383, +3683, 2534, 3381, +3681, 2547, 3378, +3678, 2563, 3374, +3674, 2584, 3368, +3669, 2610, 3360, +3662, 2643, 3349, +3652, 2684, 3334, +3639, 2733, 3314, +3620, 2791, 3284, +3594, 2859, 3242, +3557, 2937, 3179, +3501, 3023, 3078, +3415, 3118, 2893, +3266, 3220, 2389, +2932, 3328, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2629, 3522, +3821, 2629, 3522, +3821, 2630, 3522, +3821, 2631, 3521, +3821, 2632, 3521, +3821, 2634, 3521, +3820, 2637, 3520, +3820, 2640, 3519, +3819, 2644, 3518, +3818, 2649, 3517, +3817, 2657, 3515, +3815, 2666, 3513, +3813, 2679, 3510, +3810, 2695, 3506, +3806, 2716, 3500, +3801, 2742, 3492, +3794, 2775, 3481, +3784, 2816, 3466, +3771, 2865, 3446, +3752, 2923, 3416, +3726, 2991, 3374, +3689, 3069, 3311, +3634, 3155, 3210, +3547, 3250, 3025, +3398, 3352, 2521, +3064, 3460, 0, +0, 3574, 0, +0, 3691, 0, +3954, 2759, 3654, +3954, 2759, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3954, 2761, 3654, +3953, 2762, 3654, +3953, 2763, 3653, +3953, 2764, 3653, +3953, 2766, 3653, +3952, 2768, 3652, +3952, 2772, 3651, +3951, 2776, 3650, +3950, 2781, 3649, +3949, 2788, 3647, +3948, 2798, 3645, +3945, 2811, 3642, +3943, 2827, 3638, +3939, 2847, 3632, +3933, 2874, 3624, +3926, 2907, 3613, +3916, 2947, 3598, +3903, 2997, 3578, +3884, 3055, 3548, +3858, 3123, 3506, +3821, 3201, 3443, +3766, 3287, 3342, +3679, 3382, 3157, +3530, 3484, 2652, +3197, 3593, 0, +0, 3706, 0, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2894, 3786, +4085, 2895, 3786, +4085, 2896, 3785, +4085, 2898, 3785, +4085, 2900, 3784, +4084, 2903, 3784, +4083, 2908, 3783, +4082, 2913, 3781, +4081, 2920, 3779, +4080, 2930, 3777, +4078, 2942, 3774, +4075, 2959, 3770, +4071, 2979, 3764, +4065, 3006, 3756, +4058, 3039, 3745, +4048, 3079, 3730, +4035, 3129, 3710, +4017, 3187, 3680, +3990, 3255, 3638, +3953, 3333, 3575, +3898, 3420, 3474, +3811, 3514, 3289, +3662, 3616, 2784, +3329, 3725, 0, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3032, 3916, +4095, 3035, 3916, +4095, 3040, 3915, +4095, 3045, 3913, +4095, 3052, 3912, +4095, 3062, 3909, +4095, 3074, 3906, +4095, 3091, 3902, +4095, 3111, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3211, 3862, +4095, 3261, 3842, +4095, 3319, 3812, +4095, 3387, 3770, +4085, 3465, 3707, +4030, 3552, 3606, +3944, 3646, 3421, +3794, 3748, 2916, +4095, 3155, 4051, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3167, 4048, +4095, 3172, 4047, +4095, 3177, 4045, +4095, 3184, 4044, +4095, 3194, 4041, +4095, 3206, 4038, +4095, 3223, 4034, +4095, 3243, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3343, 3994, +4095, 3393, 3974, +4095, 3451, 3945, +4095, 3519, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 193, 352, +0, 229, 307, +0, 273, 239, +0, 326, 129, +0, 388, 0, +0, 459, 0, +0, 540, 0, +0, 630, 0, +0, 728, 0, +0, 833, 0, +0, 943, 0, +0, 1058, 0, +0, 1177, 0, +0, 1299, 0, +0, 1423, 0, +0, 1550, 0, +0, 1677, 0, +0, 1806, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 205, 412, +0, 240, 373, +0, 283, 315, +0, 335, 223, +0, 396, 62, +0, 466, 0, +0, 546, 0, +0, 635, 0, +0, 732, 0, +0, 836, 0, +0, 945, 0, +0, 1060, 0, +0, 1178, 0, +0, 1300, 0, +0, 1424, 0, +0, 1550, 0, +0, 1678, 0, +0, 1807, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +154, 222, 481, +58, 255, 448, +0, 297, 399, +0, 347, 325, +0, 407, 201, +0, 476, 0, +0, 554, 0, +0, 641, 0, +0, 737, 0, +0, 840, 0, +0, 949, 0, +0, 1062, 0, +0, 1180, 0, +0, 1302, 0, +0, 1425, 0, +0, 1551, 0, +0, 1679, 0, +0, 1807, 0, +0, 1936, 0, +0, 2066, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +409, 242, 560, +357, 275, 532, +276, 315, 492, +138, 363, 433, +0, 420, 338, +0, 488, 170, +0, 564, 0, +0, 650, 0, +0, 744, 0, +0, 845, 0, +0, 953, 0, +0, 1066, 0, +0, 1183, 0, +0, 1304, 0, +0, 1427, 0, +0, 1552, 0, +0, 1679, 0, +0, 1808, 0, +0, 1937, 0, +0, 2067, 0, +0, 2197, 0, +0, 2328, 0, +0, 2459, 0, +0, 2591, 0, +0, 2722, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +616, 269, 648, +583, 299, 625, +535, 337, 593, +463, 383, 546, +343, 438, 474, +109, 503, 355, +0, 577, 124, +0, 661, 0, +0, 753, 0, +0, 852, 0, +0, 958, 0, +0, 1070, 0, +0, 1186, 0, +0, 1306, 0, +0, 1429, 0, +0, 1554, 0, +0, 1681, 0, +0, 1809, 0, +0, 1938, 0, +0, 2067, 0, +0, 2198, 0, +0, 2328, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +796, 302, 744, +775, 330, 726, +744, 366, 700, +700, 409, 663, +632, 461, 608, +523, 523, 523, +318, 594, 377, +0, 675, 54, +0, 764, 0, +0, 862, 0, +0, 966, 0, +0, 1076, 0, +0, 1191, 0, +0, 1310, 0, +0, 1432, 0, +0, 1556, 0, +0, 1682, 0, +0, 1810, 0, +0, 1938, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +962, 343, 847, +947, 369, 832, +926, 401, 812, +897, 442, 784, +854, 490, 742, +790, 549, 680, +688, 616, 582, +501, 693, 404, +0, 780, 0, +0, 874, 0, +0, 976, 0, +0, 1084, 0, +0, 1197, 0, +0, 1314, 0, +0, 1435, 0, +0, 1559, 0, +0, 1684, 0, +0, 1811, 0, +0, 1940, 0, +0, 2069, 0, +0, 2199, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1117, 392, 956, +1107, 415, 945, +1092, 445, 929, +1072, 482, 907, +1043, 527, 876, +1002, 581, 831, +941, 644, 762, +843, 717, 650, +667, 799, 439, +213, 890, 0, +0, 988, 0, +0, 1094, 0, +0, 1205, 0, +0, 1320, 0, +0, 1440, 0, +0, 1562, 0, +0, 1687, 0, +0, 1813, 0, +0, 1941, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1266, 450, 1070, +1258, 471, 1061, +1248, 497, 1049, +1234, 530, 1032, +1214, 571, 1009, +1186, 620, 976, +1146, 678, 927, +1086, 746, 852, +992, 824, 728, +824, 910, 481, +408, 1005, 0, +0, 1107, 0, +0, 1215, 0, +0, 1328, 0, +0, 1446, 0, +0, 1567, 0, +0, 1690, 0, +0, 1816, 0, +0, 1943, 0, +0, 2072, 0, +0, 2201, 0, +0, 2331, 0, +0, 2461, 0, +0, 2592, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1410, 519, 1188, +1405, 536, 1182, +1397, 559, 1172, +1387, 588, 1160, +1373, 624, 1142, +1353, 668, 1117, +1326, 721, 1082, +1287, 783, 1030, +1228, 855, 950, +1136, 936, 815, +973, 1026, 532, +582, 1124, 0, +0, 1229, 0, +0, 1339, 0, +0, 1454, 0, +0, 1573, 0, +0, 1695, 0, +0, 1820, 0, +0, 1946, 0, +0, 2074, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1551, 596, 1310, +1547, 611, 1305, +1542, 631, 1297, +1534, 655, 1288, +1524, 687, 1275, +1510, 725, 1256, +1491, 772, 1231, +1464, 828, 1194, +1425, 894, 1140, +1367, 969, 1055, +1277, 1053, 910, +1117, 1146, 593, +743, 1246, 0, +0, 1353, 0, +0, 1465, 0, +0, 1581, 0, +0, 1702, 0, +0, 1824, 0, +0, 1950, 0, +0, 2076, 0, +0, 2205, 0, +0, 2334, 0, +0, 2463, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1690, 683, 1434, +1687, 695, 1430, +1683, 711, 1424, +1677, 732, 1417, +1670, 759, 1407, +1660, 792, 1394, +1646, 833, 1375, +1627, 882, 1348, +1600, 941, 1310, +1562, 1009, 1254, +1505, 1087, 1166, +1415, 1173, 1013, +1259, 1268, 663, +895, 1370, 0, +0, 1479, 0, +0, 1592, 0, +0, 1710, 0, +0, 1831, 0, +0, 1954, 0, +0, 2080, 0, +0, 2207, 0, +0, 2336, 0, +0, 2465, 0, +0, 2595, 0, +0, 2726, 0, +0, 2856, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1826, 777, 1560, +1824, 788, 1557, +1821, 801, 1552, +1817, 818, 1547, +1812, 840, 1540, +1805, 868, 1530, +1795, 903, 1516, +1781, 945, 1496, +1762, 997, 1469, +1736, 1058, 1430, +1697, 1128, 1372, +1641, 1208, 1281, +1552, 1296, 1121, +1397, 1393, 742, +1042, 1497, 0, +0, 1606, 0, +0, 1721, 0, +0, 1839, 0, +0, 1961, 0, +0, 2085, 0, +0, 2211, 0, +0, 2338, 0, +0, 2467, 0, +0, 2597, 0, +0, 2727, 0, +0, 2857, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1962, 880, 1687, +1961, 888, 1685, +1958, 898, 1682, +1955, 912, 1678, +1951, 930, 1672, +1946, 953, 1664, +1939, 982, 1654, +1929, 1018, 1640, +1915, 1062, 1620, +1897, 1116, 1593, +1870, 1178, 1553, +1832, 1250, 1494, +1776, 1331, 1400, +1688, 1422, 1235, +1534, 1520, 831, +1185, 1624, 0, +0, 1735, 0, +0, 1850, 0, +0, 1969, 0, +0, 2091, 0, +0, 2216, 0, +0, 2342, 0, +0, 2470, 0, +0, 2599, 0, +0, 2728, 0, +0, 2859, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2097, 988, 1815, +2096, 994, 1814, +2094, 1003, 1811, +2092, 1014, 1808, +2089, 1028, 1804, +2085, 1047, 1799, +2080, 1071, 1791, +2072, 1100, 1781, +2063, 1138, 1766, +2049, 1183, 1746, +2030, 1237, 1719, +2004, 1301, 1678, +1966, 1375, 1618, +1910, 1457, 1523, +1822, 1548, 1352, +1670, 1647, 927, +1325, 1753, 0, +0, 1864, 0, +0, 1980, 0, +0, 2100, 0, +0, 2222, 0, +0, 2347, 0, +0, 2474, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2231, 1101, 1945, +2230, 1106, 1944, +2229, 1113, 1942, +2227, 1122, 1940, +2225, 1133, 1936, +2222, 1148, 1932, +2218, 1167, 1927, +2213, 1191, 1919, +2206, 1222, 1908, +2196, 1260, 1894, +2182, 1306, 1874, +2164, 1362, 1846, +2137, 1427, 1805, +2100, 1501, 1744, +2044, 1585, 1647, +1956, 1677, 1473, +1805, 1776, 1031, +1463, 1883, 0, +0, 1994, 0, +0, 2111, 0, +0, 2231, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2364, 1219, 2075, +2364, 1223, 2074, +2363, 1228, 2073, +2362, 1235, 2071, +2360, 1244, 2069, +2358, 1255, 2066, +2355, 1270, 2061, +2351, 1290, 2056, +2346, 1315, 2048, +2339, 1346, 2037, +2329, 1385, 2023, +2315, 1432, 2003, +2297, 1488, 1974, +2270, 1553, 1933, +2233, 1629, 1871, +2177, 1713, 1773, +2090, 1806, 1597, +1939, 1906, 1140, +1599, 2013, 0, +0, 2125, 0, +0, 2242, 0, +0, 2362, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2498, 1340, 2206, +2497, 1343, 2205, +2497, 1347, 2204, +2496, 1352, 2203, +2494, 1359, 2201, +2493, 1368, 2199, +2491, 1380, 2195, +2488, 1395, 2191, +2484, 1415, 2185, +2478, 1440, 2178, +2471, 1472, 2167, +2461, 1511, 2152, +2448, 1559, 2132, +2429, 1615, 2103, +2403, 1682, 2062, +2366, 1757, 2000, +2310, 1842, 1901, +2223, 1936, 1723, +2073, 2036, 1254, +1735, 2144, 0, +0, 2256, 0, +0, 2373, 0, +0, 2493, 0, +0, 2616, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2631, 1463, 2337, +2630, 1466, 2336, +2630, 1469, 2335, +2629, 1473, 2334, +2628, 1478, 2333, +2627, 1485, 2331, +2625, 1494, 2329, +2623, 1506, 2326, +2620, 1522, 2322, +2616, 1542, 2316, +2611, 1567, 2308, +2604, 1599, 2297, +2594, 1639, 2283, +2581, 1687, 2262, +2562, 1744, 2233, +2536, 1811, 2192, +2498, 1887, 2130, +2443, 1972, 2030, +2356, 2066, 1850, +2206, 2167, 1373, +1869, 2275, 0, +0, 2387, 0, +0, 2504, 0, +0, 2625, 0, +0, 2748, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2763, 1589, 2468, +2763, 1591, 2467, +2763, 1593, 2467, +2762, 1596, 2466, +2761, 1600, 2465, +2761, 1605, 2464, +2759, 1613, 2462, +2758, 1622, 2460, +2756, 1634, 2457, +2753, 1650, 2452, +2749, 1670, 2447, +2743, 1696, 2439, +2736, 1728, 2428, +2727, 1768, 2413, +2713, 1816, 2393, +2694, 1874, 2364, +2668, 1941, 2322, +2631, 2017, 2260, +2575, 2103, 2160, +2489, 2197, 1978, +2339, 2298, 1494, +2003, 2406, 0, +0, 2519, 0, +0, 2636, 0, +0, 2757, 0, +0, 2880, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1716, 2599, +2896, 1717, 2599, +2895, 1719, 2599, +2895, 1722, 2598, +2894, 1725, 2597, +2894, 1729, 2596, +2893, 1734, 2595, +2892, 1741, 2593, +2890, 1751, 2591, +2888, 1763, 2588, +2885, 1779, 2583, +2881, 1799, 2578, +2876, 1825, 2570, +2869, 1857, 2559, +2859, 1897, 2544, +2845, 1946, 2524, +2827, 2004, 2495, +2801, 2071, 2453, +2763, 2148, 2390, +2708, 2234, 2290, +2621, 2328, 2108, +2472, 2430, 1618, +2136, 2537, 0, +0, 2650, 0, +0, 2768, 0, +0, 2888, 0, +0, 3012, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3028, 1845, 2731, +3028, 1846, 2731, +3028, 1847, 2730, +3028, 1849, 2730, +3027, 1851, 2729, +3027, 1854, 2729, +3026, 1858, 2728, +3025, 1864, 2726, +3024, 1871, 2725, +3022, 1880, 2722, +3020, 1892, 2719, +3017, 1908, 2715, +3013, 1929, 2709, +3008, 1955, 2701, +3001, 1987, 2690, +2991, 2028, 2676, +2978, 2076, 2655, +2959, 2134, 2626, +2933, 2202, 2584, +2896, 2279, 2521, +2840, 2365, 2421, +2754, 2459, 2238, +2604, 2561, 1744, +2269, 2669, 0, +0, 2782, 0, +0, 2900, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3161, 1974, 2863, +3161, 1975, 2862, +3160, 1976, 2862, +3160, 1977, 2862, +3160, 1979, 2862, +3160, 1981, 2861, +3159, 1984, 2860, +3158, 1988, 2859, +3157, 1994, 2858, +3156, 2001, 2856, +3155, 2010, 2854, +3152, 2023, 2851, +3150, 2039, 2846, +3146, 2059, 2841, +3140, 2085, 2833, +3133, 2118, 2822, +3123, 2158, 2807, +3110, 2207, 2787, +3091, 2266, 2758, +3065, 2333, 2716, +3028, 2410, 2653, +2973, 2497, 2552, +2886, 2591, 2368, +2737, 2693, 1872, +2402, 2801, 0, +0, 2914, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3293, 2104, 2994, +3293, 2104, 2994, +3293, 2105, 2994, +3293, 2106, 2994, +3292, 2107, 2994, +3292, 2109, 2993, +3292, 2112, 2993, +3291, 2115, 2992, +3291, 2119, 2991, +3290, 2124, 2990, +3288, 2132, 2988, +3287, 2141, 2986, +3285, 2153, 2982, +3282, 2169, 2978, +3278, 2190, 2972, +3273, 2216, 2964, +3265, 2249, 2954, +3256, 2290, 2939, +3242, 2339, 2918, +3224, 2397, 2889, +3198, 2465, 2847, +3160, 2542, 2784, +3105, 2628, 2683, +3018, 2723, 2499, +2869, 2825, 2000, +2535, 2933, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3661, 0, +3425, 2234, 3126, +3425, 2235, 3126, +3425, 2235, 3126, +3425, 2236, 3126, +3425, 2237, 3126, +3425, 2238, 3125, +3424, 2240, 3125, +3424, 2243, 3124, +3423, 2246, 3124, +3423, 2250, 3123, +3422, 2255, 3121, +3421, 2263, 3120, +3419, 2272, 3117, +3417, 2284, 3114, +3414, 2301, 3110, +3410, 2321, 3104, +3405, 2347, 3096, +3398, 2380, 3085, +3388, 2421, 3071, +3374, 2470, 3050, +3356, 2528, 3021, +3330, 2596, 2979, +3292, 2674, 2916, +3237, 2760, 2815, +3151, 2855, 2631, +3001, 2956, 2130, +2667, 3065, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2365, 3258, +3557, 2366, 3258, +3557, 2366, 3258, +3557, 2367, 3258, +3557, 2367, 3258, +3557, 2368, 3258, +3557, 2370, 3257, +3556, 2371, 3257, +3556, 2374, 3256, +3556, 2377, 3256, +3555, 2381, 3255, +3554, 2387, 3253, +3553, 2394, 3252, +3551, 2403, 3249, +3549, 2416, 3246, +3546, 2432, 3242, +3542, 2453, 3236, +3537, 2479, 3228, +3530, 2512, 3217, +3520, 2552, 3202, +3507, 2602, 3182, +3488, 2660, 3153, +3462, 2728, 3111, +3425, 2805, 3047, +3369, 2892, 2946, +3283, 2986, 2762, +3134, 3088, 2260, +2800, 3197, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3690, 2497, 3390, +3690, 2497, 3390, +3689, 2497, 3390, +3689, 2498, 3390, +3689, 2498, 3390, +3689, 2499, 3390, +3689, 2500, 3390, +3689, 2501, 3389, +3689, 2503, 3389, +3688, 2505, 3388, +3688, 2508, 3388, +3687, 2513, 3387, +3686, 2518, 3385, +3685, 2525, 3384, +3683, 2535, 3381, +3681, 2547, 3378, +3678, 2563, 3374, +3674, 2584, 3368, +3669, 2610, 3360, +3662, 2643, 3349, +3652, 2684, 3334, +3639, 2733, 3314, +3620, 2792, 3285, +3594, 2860, 3242, +3557, 2937, 3179, +3501, 3024, 3078, +3415, 3118, 2894, +3266, 3220, 2391, +2932, 3329, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2628, 3522, +3822, 2629, 3522, +3822, 2629, 3522, +3821, 2630, 3522, +3821, 2630, 3522, +3821, 2631, 3522, +3821, 2633, 3521, +3821, 2635, 3521, +3820, 2637, 3520, +3820, 2640, 3520, +3819, 2644, 3519, +3818, 2650, 3517, +3817, 2657, 3515, +3815, 2667, 3513, +3813, 2679, 3510, +3810, 2695, 3506, +3806, 2716, 3500, +3801, 2742, 3492, +3794, 2775, 3481, +3784, 2816, 3466, +3771, 2865, 3446, +3752, 2924, 3416, +3726, 2992, 3374, +3689, 3069, 3311, +3634, 3156, 3210, +3547, 3250, 3025, +3398, 3352, 2521, +3064, 3461, 0, +0, 3574, 0, +0, 3692, 0, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3954, 2761, 3654, +3953, 2762, 3654, +3953, 2763, 3654, +3953, 2764, 3653, +3953, 2766, 3653, +3952, 2769, 3652, +3952, 2772, 3652, +3951, 2776, 3651, +3950, 2781, 3649, +3949, 2789, 3647, +3948, 2798, 3645, +3945, 2811, 3642, +3942, 2827, 3638, +3939, 2848, 3632, +3933, 2874, 3624, +3926, 2907, 3613, +3916, 2948, 3598, +3903, 2997, 3578, +3884, 3055, 3548, +3858, 3123, 3506, +3821, 3201, 3443, +3766, 3288, 3342, +3679, 3382, 3157, +3530, 3484, 2653, +3197, 3593, 0, +0, 3706, 0, +4086, 2891, 3786, +4086, 2891, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2893, 3786, +4086, 2894, 3786, +4085, 2895, 3786, +4085, 2896, 3785, +4085, 2898, 3785, +4085, 2900, 3784, +4084, 2904, 3784, +4083, 2908, 3783, +4082, 2913, 3781, +4081, 2921, 3780, +4080, 2930, 3777, +4078, 2943, 3774, +4075, 2959, 3770, +4071, 2980, 3764, +4065, 3006, 3756, +4058, 3039, 3745, +4048, 3080, 3730, +4035, 3129, 3710, +4017, 3187, 3680, +3990, 3255, 3638, +3953, 3333, 3575, +3898, 3420, 3474, +3811, 3514, 3289, +3662, 3616, 2784, +3329, 3725, 0, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3032, 3916, +4095, 3036, 3916, +4095, 3040, 3915, +4095, 3045, 3913, +4095, 3052, 3912, +4095, 3062, 3909, +4095, 3075, 3906, +4095, 3091, 3902, +4095, 3111, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3212, 3862, +4095, 3261, 3842, +4095, 3319, 3813, +4095, 3387, 3770, +4085, 3465, 3707, +4030, 3552, 3606, +3944, 3646, 3421, +3794, 3748, 2916, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3155, 4050, +4095, 3155, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3167, 4048, +4095, 3172, 4047, +4095, 3177, 4045, +4095, 3184, 4044, +4095, 3194, 4041, +4095, 3206, 4038, +4095, 3223, 4034, +4095, 3243, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3344, 3994, +4095, 3393, 3974, +4095, 3451, 3945, +4095, 3520, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 286, 468, +0, 316, 433, +0, 352, 383, +0, 397, 305, +0, 450, 175, +0, 514, 0, +0, 586, 0, +0, 668, 0, +0, 759, 0, +0, 857, 0, +0, 962, 0, +0, 1073, 0, +0, 1189, 0, +0, 1308, 0, +0, 1430, 0, +0, 1555, 0, +0, 1681, 0, +0, 1809, 0, +0, 1938, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 296, 515, +0, 325, 484, +0, 361, 439, +0, 405, 371, +0, 458, 261, +0, 520, 54, +0, 592, 0, +0, 673, 0, +0, 762, 0, +0, 860, 0, +0, 965, 0, +0, 1075, 0, +0, 1190, 0, +0, 1309, 0, +0, 1431, 0, +0, 1556, 0, +0, 1682, 0, +0, 1810, 0, +0, 1938, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +38, 310, 571, +0, 338, 544, +0, 372, 505, +0, 415, 447, +0, 467, 355, +0, 528, 195, +0, 599, 0, +0, 678, 0, +0, 767, 0, +0, 864, 0, +0, 968, 0, +0, 1077, 0, +0, 1192, 0, +0, 1311, 0, +0, 1432, 0, +0, 1556, 0, +0, 1682, 0, +0, 1810, 0, +0, 1939, 0, +0, 2068, 0, +0, 2198, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +347, 327, 637, +286, 354, 613, +190, 387, 580, +17, 429, 531, +0, 479, 457, +0, 539, 333, +0, 608, 87, +0, 686, 0, +0, 774, 0, +0, 869, 0, +0, 972, 0, +0, 1081, 0, +0, 1194, 0, +0, 1312, 0, +0, 1434, 0, +0, 1558, 0, +0, 1683, 0, +0, 1811, 0, +0, 1939, 0, +0, 2069, 0, +0, 2199, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +577, 349, 712, +541, 375, 692, +489, 407, 664, +408, 447, 624, +270, 495, 565, +0, 553, 470, +0, 620, 302, +0, 696, 0, +0, 782, 0, +0, 876, 0, +0, 977, 0, +0, 1085, 0, +0, 1198, 0, +0, 1315, 0, +0, 1436, 0, +0, 1559, 0, +0, 1684, 0, +0, 1812, 0, +0, 1940, 0, +0, 2069, 0, +0, 2199, 0, +0, 2329, 0, +0, 2460, 0, +0, 2591, 0, +0, 2723, 0, +0, 2854, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +771, 377, 796, +748, 401, 780, +715, 431, 757, +668, 469, 725, +595, 515, 678, +475, 571, 606, +241, 635, 487, +0, 709, 256, +0, 793, 0, +0, 885, 0, +0, 984, 0, +0, 1091, 0, +0, 1202, 0, +0, 1318, 0, +0, 1438, 0, +0, 1561, 0, +0, 1686, 0, +0, 1813, 0, +0, 1941, 0, +0, 2070, 0, +0, 2199, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +944, 411, 889, +928, 434, 876, +907, 462, 858, +876, 498, 832, +832, 541, 795, +764, 594, 740, +655, 655, 655, +450, 726, 509, +0, 807, 186, +0, 896, 0, +0, 994, 0, +0, 1098, 0, +0, 1208, 0, +0, 1323, 0, +0, 1442, 0, +0, 1564, 0, +0, 1688, 0, +0, 1814, 0, +0, 1942, 0, +0, 2071, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1105, 454, 990, +1094, 475, 979, +1079, 501, 965, +1058, 533, 944, +1029, 574, 916, +986, 623, 874, +922, 681, 813, +820, 748, 714, +633, 825, 536, +113, 912, 73, +0, 1006, 0, +0, 1108, 0, +0, 1216, 0, +0, 1329, 0, +0, 1446, 0, +0, 1567, 0, +0, 1691, 0, +0, 1816, 0, +0, 1943, 0, +0, 2072, 0, +0, 2201, 0, +0, 2331, 0, +0, 2461, 0, +0, 2592, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1257, 506, 1097, +1249, 524, 1088, +1239, 547, 1077, +1224, 577, 1061, +1204, 614, 1039, +1175, 659, 1008, +1134, 713, 963, +1073, 776, 894, +975, 849, 783, +799, 931, 571, +345, 1022, 0, +0, 1121, 0, +0, 1226, 0, +0, 1337, 0, +0, 1452, 0, +0, 1572, 0, +0, 1694, 0, +0, 1819, 0, +0, 1945, 0, +0, 2073, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1404, 566, 1209, +1398, 582, 1202, +1390, 603, 1193, +1380, 629, 1181, +1366, 662, 1165, +1346, 703, 1141, +1318, 752, 1108, +1278, 811, 1059, +1218, 878, 984, +1124, 956, 860, +956, 1042, 613, +540, 1137, 0, +0, 1239, 0, +0, 1347, 0, +0, 1461, 0, +0, 1578, 0, +0, 1699, 0, +0, 1823, 0, +0, 1948, 0, +0, 2075, 0, +0, 2204, 0, +0, 2333, 0, +0, 2463, 0, +0, 2593, 0, +0, 2724, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1546, 637, 1325, +1542, 651, 1320, +1537, 668, 1314, +1529, 691, 1304, +1519, 720, 1292, +1505, 756, 1274, +1486, 800, 1249, +1458, 853, 1214, +1419, 915, 1162, +1360, 987, 1082, +1268, 1068, 947, +1105, 1158, 665, +714, 1256, 0, +0, 1361, 0, +0, 1471, 0, +0, 1586, 0, +0, 1705, 0, +0, 1827, 0, +0, 1952, 0, +0, 2078, 0, +0, 2206, 0, +0, 2335, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1686, 717, 1446, +1683, 728, 1442, +1679, 743, 1437, +1674, 763, 1430, +1666, 787, 1420, +1656, 819, 1407, +1642, 857, 1388, +1623, 904, 1363, +1596, 960, 1326, +1557, 1026, 1272, +1500, 1101, 1187, +1409, 1185, 1042, +1250, 1278, 725, +875, 1378, 0, +0, 1485, 0, +0, 1597, 0, +0, 1713, 0, +0, 1834, 0, +0, 1957, 0, +0, 2082, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1824, 805, 1569, +1822, 815, 1566, +1819, 827, 1562, +1815, 843, 1556, +1809, 864, 1549, +1802, 891, 1539, +1792, 924, 1526, +1778, 965, 1507, +1759, 1014, 1480, +1732, 1073, 1442, +1694, 1141, 1386, +1637, 1219, 1298, +1547, 1305, 1145, +1391, 1400, 795, +1028, 1502, 0, +0, 1611, 0, +0, 1724, 0, +0, 1842, 0, +0, 1963, 0, +0, 2087, 0, +0, 2212, 0, +0, 2339, 0, +0, 2468, 0, +0, 2597, 0, +0, 2727, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1960, 902, 1694, +1959, 910, 1692, +1956, 920, 1689, +1953, 933, 1685, +1949, 950, 1679, +1944, 972, 1672, +1937, 1000, 1662, +1927, 1035, 1648, +1913, 1077, 1628, +1894, 1129, 1601, +1868, 1190, 1562, +1830, 1260, 1505, +1773, 1340, 1413, +1684, 1428, 1253, +1530, 1525, 875, +1174, 1629, 0, +0, 1738, 0, +0, 1853, 0, +0, 1971, 0, +0, 2093, 0, +0, 2217, 0, +0, 2343, 0, +0, 2471, 0, +0, 2599, 0, +0, 2729, 0, +0, 2859, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2095, 1005, 1821, +2094, 1012, 1819, +2093, 1020, 1817, +2090, 1030, 1814, +2087, 1044, 1810, +2084, 1062, 1804, +2078, 1085, 1797, +2071, 1114, 1786, +2061, 1150, 1772, +2047, 1195, 1753, +2029, 1248, 1725, +2002, 1310, 1685, +1964, 1382, 1626, +1908, 1464, 1533, +1820, 1554, 1367, +1667, 1652, 963, +1317, 1756, 0, +0, 1867, 0, +0, 1982, 0, +0, 2101, 0, +0, 2223, 0, +0, 2348, 0, +0, 2474, 0, +0, 2602, 0, +0, 2731, 0, +0, 2860, 0, +0, 2991, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2230, 1115, 1949, +2229, 1120, 1948, +2228, 1126, 1946, +2226, 1135, 1944, +2224, 1146, 1941, +2221, 1160, 1936, +2217, 1179, 1931, +2212, 1203, 1923, +2205, 1233, 1913, +2195, 1270, 1898, +2181, 1315, 1879, +2162, 1369, 1851, +2136, 1433, 1810, +2098, 1507, 1750, +2042, 1589, 1655, +1955, 1681, 1484, +1802, 1780, 1059, +1457, 1885, 0, +0, 1996, 0, +0, 2112, 0, +0, 2232, 0, +0, 2354, 0, +0, 2479, 0, +0, 2606, 0, +0, 2734, 0, +0, 2862, 0, +0, 2992, 0, +0, 3123, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2364, 1229, 2078, +2363, 1233, 2077, +2362, 1238, 2076, +2361, 1245, 2074, +2359, 1254, 2072, +2357, 1265, 2069, +2354, 1280, 2064, +2350, 1299, 2059, +2345, 1323, 2051, +2338, 1354, 2041, +2328, 1392, 2026, +2314, 1438, 2006, +2296, 1494, 1978, +2269, 1559, 1937, +2232, 1633, 1876, +2176, 1717, 1779, +2089, 1809, 1606, +1937, 1908, 1163, +1595, 2015, 0, +0, 2127, 0, +0, 2243, 0, +0, 2363, 0, +0, 2486, 0, +0, 2611, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2497, 1348, 2208, +2497, 1351, 2207, +2496, 1355, 2206, +2495, 1360, 2205, +2494, 1367, 2203, +2492, 1376, 2201, +2490, 1387, 2198, +2487, 1402, 2193, +2483, 1422, 2188, +2478, 1447, 2180, +2471, 1478, 2169, +2461, 1517, 2155, +2447, 1564, 2135, +2429, 1620, 2106, +2402, 1686, 2065, +2365, 1761, 2004, +2309, 1845, 1906, +2222, 1938, 1729, +2071, 2038, 1272, +1731, 2145, 0, +0, 2257, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2630, 1470, 2338, +2630, 1472, 2338, +2629, 1475, 2337, +2629, 1479, 2336, +2628, 1484, 2335, +2627, 1491, 2333, +2625, 1500, 2331, +2623, 1512, 2327, +2620, 1527, 2323, +2616, 1547, 2317, +2611, 1572, 2310, +2603, 1604, 2299, +2594, 1643, 2284, +2580, 1691, 2264, +2561, 1748, 2236, +2535, 1814, 2194, +2498, 1890, 2132, +2442, 1974, 2033, +2355, 2068, 1855, +2205, 2168, 1386, +1867, 2276, 0, +0, 2388, 0, +0, 2505, 0, +0, 2625, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2763, 1594, 2469, +2763, 1595, 2469, +2762, 1598, 2468, +2762, 1601, 2467, +2761, 1605, 2466, +2760, 1610, 2465, +2759, 1617, 2463, +2757, 1626, 2461, +2755, 1638, 2458, +2752, 1654, 2454, +2748, 1674, 2448, +2743, 1699, 2440, +2736, 1731, 2429, +2726, 1771, 2415, +2713, 1819, 2394, +2694, 1876, 2366, +2668, 1943, 2324, +2630, 2019, 2262, +2575, 2104, 2162, +2488, 2198, 1982, +2338, 2299, 1505, +2001, 2407, 0, +0, 2519, 0, +0, 2637, 0, +0, 2757, 0, +0, 2880, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2896, 1720, 2600, +2895, 1721, 2600, +2895, 1723, 2600, +2895, 1725, 2599, +2894, 1728, 2598, +2894, 1732, 2597, +2893, 1738, 2596, +2891, 1745, 2594, +2890, 1754, 2592, +2888, 1766, 2589, +2885, 1782, 2584, +2881, 1802, 2579, +2876, 1828, 2571, +2868, 1860, 2560, +2859, 1900, 2545, +2845, 1948, 2525, +2827, 2006, 2496, +2800, 2073, 2454, +2763, 2149, 2392, +2708, 2235, 2292, +2621, 2329, 2111, +2471, 2430, 1626, +2135, 2538, 0, +0, 2651, 0, +0, 2768, 0, +0, 2889, 0, +0, 3012, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3028, 1847, 2732, +3028, 1848, 2731, +3028, 1850, 2731, +3027, 1851, 2731, +3027, 1854, 2730, +3027, 1857, 2729, +3026, 1861, 2728, +3025, 1866, 2727, +3024, 1873, 2725, +3022, 1883, 2723, +3020, 1895, 2720, +3017, 1911, 2716, +3013, 1931, 2710, +3008, 1957, 2702, +3001, 1989, 2691, +2991, 2030, 2676, +2978, 2078, 2656, +2959, 2136, 2627, +2933, 2203, 2585, +2895, 2280, 2522, +2840, 2366, 2422, +2753, 2460, 2240, +2604, 2562, 1750, +2268, 2670, 0, +0, 2783, 0, +0, 2900, 0, +0, 3021, 0, +0, 3144, 0, +0, 3269, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +3160, 1976, 2863, +3160, 1977, 2863, +3160, 1978, 2863, +3160, 1979, 2862, +3160, 1981, 2862, +3159, 1983, 2862, +3159, 1986, 2861, +3158, 1990, 2860, +3157, 1996, 2858, +3156, 2003, 2857, +3154, 2012, 2854, +3152, 2025, 2851, +3149, 2040, 2847, +3146, 2061, 2841, +3140, 2087, 2833, +3133, 2120, 2822, +3123, 2160, 2808, +3110, 2209, 2787, +3091, 2267, 2758, +3065, 2334, 2716, +3028, 2411, 2653, +2972, 2497, 2553, +2886, 2592, 2370, +2736, 2693, 1876, +2401, 2801, 0, +0, 2914, 0, +0, 3032, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3529, 0, +0, 3657, 0, +3293, 2105, 2995, +3293, 2106, 2995, +3293, 2107, 2995, +3292, 2108, 2994, +3292, 2109, 2994, +3292, 2111, 2994, +3292, 2113, 2993, +3291, 2116, 2992, +3290, 2120, 2991, +3290, 2126, 2990, +3288, 2133, 2988, +3287, 2142, 2986, +3285, 2155, 2983, +3282, 2171, 2978, +3278, 2191, 2973, +3272, 2217, 2965, +3265, 2250, 2954, +3256, 2291, 2939, +3242, 2339, 2919, +3224, 2398, 2890, +3197, 2465, 2848, +3160, 2542, 2785, +3105, 2629, 2684, +3018, 2723, 2500, +2869, 2825, 2004, +2534, 2933, 0, +0, 3046, 0, +0, 3164, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3661, 0, +3425, 2236, 3127, +3425, 2236, 3127, +3425, 2237, 3126, +3425, 2237, 3126, +3425, 2238, 3126, +3424, 2240, 3126, +3424, 2241, 3125, +3424, 2244, 3125, +3423, 2247, 3124, +3423, 2251, 3123, +3422, 2256, 3122, +3421, 2264, 3120, +3419, 2273, 3118, +3417, 2286, 3114, +3414, 2302, 3110, +3410, 2322, 3104, +3405, 2348, 3096, +3397, 2381, 3086, +3388, 2422, 3071, +3374, 2471, 3050, +3356, 2529, 3021, +3330, 2597, 2979, +3292, 2674, 2916, +3237, 2760, 2815, +3150, 2855, 2631, +3001, 2957, 2132, +2667, 3065, 0, +0, 3178, 0, +0, 3296, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3557, 2366, 3259, +3557, 2367, 3258, +3557, 2367, 3258, +3557, 2367, 3258, +3557, 2368, 3258, +3557, 2369, 3258, +3557, 2371, 3258, +3556, 2372, 3257, +3556, 2375, 3257, +3555, 2378, 3256, +3555, 2382, 3255, +3554, 2387, 3254, +3553, 2395, 3252, +3551, 2404, 3249, +3549, 2417, 3246, +3546, 2433, 3242, +3542, 2453, 3236, +3537, 2480, 3228, +3530, 2512, 3217, +3520, 2553, 3203, +3506, 2602, 3182, +3488, 2660, 3153, +3462, 2728, 3111, +3424, 2806, 3048, +3369, 2892, 2947, +3283, 2987, 2763, +3133, 3089, 2262, +2799, 3197, 0, +0, 3310, 0, +0, 3428, 0, +0, 3548, 0, +0, 3672, 0, +3689, 2497, 3390, +3689, 2497, 3390, +3689, 2498, 3390, +3689, 2498, 3390, +3689, 2499, 3390, +3689, 2499, 3390, +3689, 2500, 3390, +3689, 2502, 3389, +3688, 2504, 3389, +3688, 2506, 3388, +3688, 2509, 3388, +3687, 2513, 3387, +3686, 2519, 3385, +3685, 2526, 3384, +3683, 2535, 3381, +3681, 2548, 3378, +3678, 2564, 3374, +3674, 2585, 3368, +3669, 2611, 3360, +3662, 2644, 3349, +3652, 2684, 3334, +3639, 2734, 3314, +3620, 2792, 3285, +3594, 2860, 3243, +3557, 2937, 3179, +3501, 3024, 3078, +3415, 3119, 2894, +3266, 3220, 2392, +2932, 3329, 0, +0, 3442, 0, +0, 3560, 0, +0, 3680, 0, +3822, 2628, 3522, +3822, 2629, 3522, +3822, 2629, 3522, +3822, 2629, 3522, +3821, 2630, 3522, +3821, 2630, 3522, +3821, 2631, 3522, +3821, 2632, 3522, +3821, 2633, 3521, +3821, 2635, 3521, +3820, 2637, 3520, +3820, 2641, 3520, +3819, 2645, 3519, +3818, 2650, 3517, +3817, 2657, 3516, +3815, 2667, 3513, +3813, 2679, 3510, +3810, 2696, 3506, +3806, 2716, 3500, +3801, 2743, 3492, +3794, 2775, 3481, +3784, 2816, 3466, +3771, 2865, 3446, +3752, 2924, 3417, +3726, 2992, 3375, +3689, 3069, 3311, +3633, 3156, 3210, +3547, 3250, 3026, +3398, 3352, 2523, +3064, 3461, 0, +0, 3574, 0, +0, 3692, 0, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2760, 3654, +3954, 2761, 3654, +3954, 2761, 3654, +3954, 2762, 3654, +3953, 2763, 3654, +3953, 2764, 3654, +3953, 2765, 3653, +3953, 2767, 3653, +3952, 2769, 3652, +3952, 2772, 3652, +3951, 2776, 3651, +3950, 2782, 3649, +3949, 2789, 3648, +3948, 2799, 3645, +3945, 2811, 3642, +3942, 2827, 3638, +3939, 2848, 3632, +3933, 2874, 3624, +3926, 2907, 3613, +3916, 2948, 3598, +3903, 2997, 3578, +3884, 3056, 3549, +3858, 3124, 3506, +3821, 3201, 3443, +3766, 3288, 3342, +3679, 3382, 3157, +3530, 3484, 2654, +3196, 3593, 0, +0, 3706, 0, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2893, 3786, +4086, 2894, 3786, +4086, 2894, 3786, +4085, 2895, 3786, +4085, 2897, 3785, +4085, 2898, 3785, +4085, 2901, 3784, +4084, 2904, 3784, +4083, 2908, 3783, +4082, 2914, 3781, +4081, 2921, 3780, +4080, 2930, 3777, +4077, 2943, 3774, +4075, 2959, 3770, +4071, 2980, 3764, +4065, 3006, 3756, +4058, 3039, 3745, +4048, 3080, 3730, +4035, 3129, 3710, +4017, 3188, 3681, +3990, 3256, 3638, +3953, 3333, 3575, +3898, 3420, 3474, +3811, 3514, 3289, +3662, 3616, 2785, +3329, 3725, 0, +4095, 3023, 3919, +4095, 3023, 3918, +4095, 3023, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3917, +4095, 3030, 3917, +4095, 3033, 3916, +4095, 3036, 3916, +4095, 3040, 3915, +4095, 3045, 3913, +4095, 3053, 3912, +4095, 3062, 3909, +4095, 3075, 3906, +4095, 3091, 3902, +4095, 3112, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3212, 3862, +4095, 3261, 3842, +4095, 3319, 3813, +4095, 3388, 3770, +4085, 3465, 3707, +4030, 3552, 3606, +3944, 3646, 3421, +3794, 3748, 2916, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4049, +4095, 3162, 4049, +4095, 3164, 4048, +4095, 3168, 4048, +4095, 3172, 4047, +4095, 3177, 4045, +4095, 3185, 4044, +4095, 3194, 4041, +4095, 3207, 4038, +4095, 3223, 4034, +4095, 3244, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3344, 3994, +4095, 3393, 3974, +4095, 3451, 3945, +4095, 3520, 3902, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3778, 3553, +0, 387, 587, +0, 410, 561, +0, 440, 523, +0, 477, 468, +0, 523, 381, +0, 577, 231, +0, 641, 0, +0, 714, 0, +0, 797, 0, +0, 888, 0, +0, 987, 0, +0, 1093, 0, +0, 1204, 0, +0, 1320, 0, +0, 1439, 0, +0, 1562, 0, +0, 1687, 0, +0, 1813, 0, +0, 1941, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 395, 624, +0, 418, 600, +0, 448, 565, +0, 484, 515, +0, 529, 437, +0, 583, 307, +0, 646, 42, +0, 718, 0, +0, 800, 0, +0, 891, 0, +0, 989, 0, +0, 1094, 0, +0, 1205, 0, +0, 1321, 0, +0, 1440, 0, +0, 1562, 0, +0, 1687, 0, +0, 1813, 0, +0, 1941, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 406, 669, +0, 428, 647, +0, 457, 616, +0, 493, 571, +0, 537, 503, +0, 590, 393, +0, 652, 186, +0, 724, 0, +0, 805, 0, +0, 894, 0, +0, 992, 0, +0, 1097, 0, +0, 1207, 0, +0, 1322, 0, +0, 1441, 0, +0, 1563, 0, +0, 1688, 0, +0, 1814, 0, +0, 1942, 0, +0, 2070, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +247, 420, 722, +170, 442, 703, +41, 470, 676, +0, 505, 637, +0, 547, 579, +0, 599, 487, +0, 660, 327, +0, 731, 0, +0, 811, 0, +0, 899, 0, +0, 996, 0, +0, 1100, 0, +0, 1210, 0, +0, 1324, 0, +0, 1443, 0, +0, 1564, 0, +0, 1688, 0, +0, 1815, 0, +0, 1942, 0, +0, 2071, 0, +0, 2200, 0, +0, 2330, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2986, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +519, 438, 786, +479, 459, 769, +418, 486, 745, +322, 520, 712, +149, 561, 663, +0, 611, 589, +0, 671, 465, +0, 740, 219, +0, 818, 0, +0, 906, 0, +0, 1001, 0, +0, 1104, 0, +0, 1213, 0, +0, 1327, 0, +0, 1445, 0, +0, 1566, 0, +0, 1690, 0, +0, 1815, 0, +0, 1943, 0, +0, 2071, 0, +0, 2201, 0, +0, 2331, 0, +0, 2461, 0, +0, 2592, 0, +0, 2723, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +734, 461, 858, +709, 481, 844, +673, 507, 824, +621, 539, 797, +540, 579, 756, +402, 627, 697, +110, 685, 602, +0, 752, 434, +0, 828, 18, +0, 914, 0, +0, 1008, 0, +0, 1109, 0, +0, 1217, 0, +0, 1330, 0, +0, 1447, 0, +0, 1568, 0, +0, 1691, 0, +0, 1817, 0, +0, 1944, 0, +0, 2072, 0, +0, 2201, 0, +0, 2331, 0, +0, 2462, 0, +0, 2592, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +919, 490, 940, +903, 509, 929, +880, 533, 912, +847, 563, 889, +800, 601, 857, +727, 647, 810, +607, 703, 738, +373, 767, 619, +0, 842, 388, +0, 925, 0, +0, 1017, 0, +0, 1116, 0, +0, 1223, 0, +0, 1334, 0, +0, 1451, 0, +0, 1570, 0, +0, 1693, 0, +0, 1818, 0, +0, 1945, 0, +0, 2073, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1087, 526, 1031, +1076, 544, 1021, +1061, 566, 1008, +1039, 594, 990, +1008, 630, 964, +964, 673, 927, +896, 726, 872, +787, 787, 787, +582, 859, 641, +0, 939, 318, +0, 1029, 0, +0, 1126, 0, +0, 1230, 0, +0, 1340, 0, +0, 1455, 0, +0, 1574, 0, +0, 1696, 0, +0, 1820, 0, +0, 1946, 0, +0, 2074, 0, +0, 2203, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1245, 570, 1130, +1237, 586, 1122, +1226, 607, 1111, +1211, 633, 1097, +1190, 665, 1076, +1161, 706, 1048, +1118, 755, 1006, +1055, 813, 945, +952, 880, 846, +765, 958, 669, +245, 1044, 205, +0, 1138, 0, +0, 1240, 0, +0, 1348, 0, +0, 1461, 0, +0, 1578, 0, +0, 1699, 0, +0, 1823, 0, +0, 1948, 0, +0, 2075, 0, +0, 2204, 0, +0, 2333, 0, +0, 2463, 0, +0, 2594, 0, +0, 2724, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1395, 623, 1235, +1389, 638, 1229, +1381, 656, 1220, +1371, 679, 1209, +1356, 709, 1193, +1336, 746, 1171, +1308, 791, 1140, +1267, 845, 1095, +1205, 908, 1026, +1107, 981, 915, +932, 1063, 703, +477, 1154, 0, +0, 1253, 0, +0, 1358, 0, +0, 1469, 0, +0, 1585, 0, +0, 1704, 0, +0, 1826, 0, +0, 1951, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1540, 686, 1346, +1536, 698, 1341, +1530, 715, 1334, +1522, 735, 1326, +1512, 762, 1313, +1498, 794, 1297, +1478, 835, 1273, +1450, 884, 1240, +1410, 943, 1191, +1351, 1011, 1116, +1256, 1088, 993, +1088, 1174, 745, +672, 1269, 0, +0, 1371, 0, +0, 1479, 0, +0, 1593, 0, +0, 1710, 0, +0, 1831, 0, +0, 1955, 0, +0, 2080, 0, +0, 2207, 0, +0, 2336, 0, +0, 2465, 0, +0, 2595, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1681, 758, 1461, +1678, 769, 1458, +1674, 783, 1453, +1669, 801, 1446, +1661, 823, 1436, +1651, 852, 1424, +1637, 888, 1406, +1618, 932, 1381, +1590, 985, 1346, +1551, 1047, 1295, +1492, 1119, 1215, +1400, 1200, 1079, +1237, 1290, 797, +846, 1388, 0, +0, 1493, 0, +0, 1603, 0, +0, 1718, 0, +0, 1837, 0, +0, 1959, 0, +0, 2084, 0, +0, 2210, 0, +0, 2338, 0, +0, 2467, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1820, 840, 1581, +1818, 849, 1578, +1815, 860, 1574, +1811, 875, 1569, +1806, 895, 1562, +1798, 920, 1552, +1788, 951, 1539, +1774, 989, 1521, +1755, 1036, 1495, +1728, 1092, 1458, +1689, 1158, 1404, +1632, 1233, 1319, +1541, 1317, 1174, +1382, 1410, 857, +1007, 1510, 0, +0, 1617, 0, +0, 1729, 0, +0, 1846, 0, +0, 1966, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1958, 930, 1703, +1956, 937, 1701, +1954, 947, 1698, +1951, 959, 1694, +1947, 976, 1689, +1941, 996, 1681, +1934, 1023, 1671, +1924, 1056, 1658, +1910, 1097, 1639, +1891, 1146, 1613, +1865, 1205, 1575, +1826, 1273, 1518, +1769, 1351, 1430, +1679, 1437, 1277, +1523, 1532, 927, +1160, 1635, 0, +0, 1743, 0, +0, 1856, 0, +0, 1974, 0, +0, 2095, 0, +0, 2219, 0, +0, 2344, 0, +0, 2471, 0, +0, 2600, 0, +0, 2729, 0, +0, 2859, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2094, 1028, 1828, +2092, 1034, 1826, +2091, 1042, 1824, +2088, 1052, 1821, +2086, 1065, 1817, +2082, 1082, 1811, +2076, 1104, 1804, +2069, 1132, 1794, +2059, 1167, 1780, +2045, 1210, 1761, +2026, 1261, 1733, +2000, 1322, 1695, +1962, 1392, 1637, +1905, 1472, 1545, +1816, 1561, 1385, +1662, 1657, 1007, +1307, 1761, 0, +0, 1870, 0, +0, 1985, 0, +0, 2103, 0, +0, 2225, 0, +0, 2349, 0, +0, 2475, 0, +0, 2603, 0, +0, 2731, 0, +0, 2861, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2228, 1133, 1954, +2228, 1138, 1953, +2226, 1144, 1951, +2225, 1152, 1949, +2223, 1163, 1946, +2220, 1176, 1942, +2216, 1194, 1936, +2210, 1217, 1929, +2203, 1246, 1918, +2193, 1282, 1904, +2180, 1327, 1885, +2161, 1380, 1857, +2134, 1442, 1817, +2096, 1514, 1758, +2040, 1596, 1665, +1952, 1686, 1499, +1799, 1784, 1095, +1449, 1888, 0, +0, 1999, 0, +0, 2114, 0, +0, 2233, 0, +0, 2356, 0, +0, 2480, 0, +0, 2606, 0, +0, 2734, 0, +0, 2863, 0, +0, 2992, 0, +0, 3123, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2363, 1243, 2082, +2362, 1247, 2081, +2361, 1252, 2080, +2360, 1258, 2078, +2358, 1267, 2076, +2356, 1278, 2073, +2353, 1292, 2068, +2349, 1311, 2063, +2344, 1335, 2055, +2337, 1365, 2045, +2327, 1402, 2031, +2313, 1447, 2011, +2294, 1502, 1983, +2268, 1565, 1942, +2230, 1639, 1882, +2174, 1721, 1787, +2087, 1813, 1617, +1934, 1912, 1191, +1589, 2017, 0, +0, 2129, 0, +0, 2244, 0, +0, 2364, 0, +0, 2486, 0, +0, 2611, 0, +0, 2738, 0, +0, 2866, 0, +0, 2995, 0, +0, 3124, 0, +0, 3255, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2496, 1359, 2211, +2496, 1362, 2210, +2495, 1365, 2209, +2494, 1370, 2208, +2493, 1377, 2206, +2491, 1386, 2204, +2489, 1397, 2201, +2486, 1412, 2196, +2482, 1431, 2191, +2477, 1455, 2183, +2470, 1486, 2173, +2460, 1524, 2158, +2446, 1570, 2138, +2428, 1626, 2110, +2402, 1691, 2069, +2364, 1765, 2008, +2308, 1849, 1911, +2221, 1941, 1738, +2069, 2041, 1295, +1727, 2147, 0, +0, 2259, 0, +0, 2375, 0, +0, 2495, 0, +0, 2618, 0, +0, 2743, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3648, 0, +2630, 1478, 2340, +2629, 1480, 2340, +2629, 1483, 2339, +2628, 1487, 2338, +2627, 1492, 2337, +2626, 1499, 2335, +2624, 1508, 2333, +2622, 1519, 2330, +2619, 1535, 2326, +2615, 1554, 2320, +2610, 1579, 2312, +2603, 1610, 2302, +2593, 1649, 2287, +2579, 1696, 2267, +2561, 1752, 2238, +2535, 1818, 2197, +2497, 1893, 2136, +2441, 1977, 2038, +2354, 2070, 1861, +2203, 2170, 1404, +1864, 2277, 0, +0, 2389, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +2763, 1600, 2471, +2762, 1602, 2470, +2762, 1604, 2470, +2761, 1607, 2469, +2761, 1611, 2468, +2760, 1616, 2467, +2759, 1623, 2465, +2757, 1632, 2463, +2755, 1644, 2460, +2752, 1659, 2455, +2748, 1679, 2450, +2743, 1704, 2442, +2735, 1736, 2431, +2726, 1775, 2417, +2712, 1823, 2396, +2694, 1880, 2368, +2667, 1946, 2326, +2630, 2022, 2264, +2574, 2107, 2165, +2487, 2200, 1987, +2337, 2301, 1518, +1999, 2408, 0, +0, 2520, 0, +0, 2637, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +2895, 1725, 2601, +2895, 1726, 2601, +2895, 1728, 2601, +2894, 1730, 2600, +2894, 1733, 2599, +2893, 1737, 2599, +2892, 1742, 2597, +2891, 1749, 2595, +2890, 1758, 2593, +2887, 1770, 2590, +2884, 1786, 2586, +2881, 1806, 2580, +2875, 1832, 2572, +2868, 1864, 2561, +2858, 1903, 2547, +2845, 1951, 2526, +2826, 2008, 2498, +2800, 2075, 2456, +2763, 2151, 2394, +2707, 2237, 2294, +2620, 2330, 2114, +2470, 2431, 1637, +2133, 2539, 0, +0, 2652, 0, +0, 2769, 0, +0, 2889, 0, +0, 3012, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3028, 1851, 2733, +3028, 1852, 2732, +3027, 1853, 2732, +3027, 1855, 2732, +3027, 1857, 2731, +3026, 1860, 2730, +3026, 1864, 2729, +3025, 1870, 2728, +3024, 1877, 2726, +3022, 1886, 2724, +3020, 1898, 2721, +3017, 1914, 2717, +3013, 1934, 2711, +3008, 1960, 2703, +3000, 1992, 2692, +2991, 2032, 2677, +2977, 2080, 2657, +2959, 2138, 2628, +2933, 2205, 2586, +2895, 2282, 2524, +2840, 2367, 2424, +2753, 2461, 2243, +2603, 2562, 1758, +2267, 2670, 0, +0, 2783, 0, +0, 2900, 0, +0, 3021, 0, +0, 3144, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +3160, 1979, 2864, +3160, 1979, 2864, +3160, 1980, 2863, +3160, 1982, 2863, +3160, 1983, 2863, +3159, 1986, 2862, +3159, 1989, 2861, +3158, 1993, 2861, +3157, 1998, 2859, +3156, 2005, 2857, +3154, 2015, 2855, +3152, 2027, 2852, +3149, 2043, 2848, +3145, 2063, 2842, +3140, 2089, 2834, +3133, 2122, 2823, +3123, 2162, 2809, +3110, 2210, 2788, +3091, 2268, 2759, +3065, 2335, 2717, +3028, 2412, 2654, +2972, 2498, 2554, +2886, 2592, 2372, +2736, 2694, 1882, +2401, 2802, 0, +0, 2915, 0, +0, 3032, 0, +0, 3153, 0, +0, 3276, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +3293, 2107, 2995, +3293, 2108, 2995, +3292, 2109, 2995, +3292, 2110, 2995, +3292, 2111, 2995, +3292, 2113, 2994, +3291, 2115, 2994, +3291, 2118, 2993, +3290, 2122, 2992, +3289, 2128, 2991, +3288, 2135, 2989, +3287, 2144, 2986, +3284, 2157, 2983, +3282, 2173, 2979, +3278, 2193, 2973, +3272, 2219, 2965, +3265, 2252, 2955, +3255, 2292, 2940, +3242, 2341, 2919, +3223, 2399, 2890, +3197, 2466, 2848, +3160, 2543, 2785, +3104, 2629, 2685, +3018, 2724, 2502, +2868, 2825, 2008, +2534, 2933, 0, +0, 3046, 0, +0, 3164, 0, +0, 3285, 0, +0, 3408, 0, +0, 3534, 0, +0, 3661, 0, +3425, 2237, 3127, +3425, 2238, 3127, +3425, 2238, 3127, +3425, 2239, 3127, +3425, 2240, 3126, +3424, 2241, 3126, +3424, 2243, 3126, +3424, 2245, 3125, +3423, 2248, 3124, +3423, 2252, 3123, +3422, 2258, 3122, +3420, 2265, 3120, +3419, 2275, 3118, +3417, 2287, 3115, +3414, 2303, 3111, +3410, 2323, 3105, +3405, 2350, 3097, +3397, 2382, 3086, +3388, 2423, 3071, +3374, 2472, 3051, +3356, 2530, 3022, +3330, 2597, 2980, +3292, 2675, 2917, +3237, 2761, 2816, +3150, 2855, 2633, +3001, 2957, 2136, +2666, 3065, 0, +0, 3178, 0, +0, 3296, 0, +0, 3417, 0, +0, 3540, 0, +0, 3666, 0, +3557, 2367, 3259, +3557, 2368, 3259, +3557, 2368, 3259, +3557, 2369, 3259, +3557, 2369, 3258, +3557, 2370, 3258, +3557, 2372, 3258, +3556, 2373, 3257, +3556, 2376, 3257, +3555, 2379, 3256, +3555, 2383, 3255, +3554, 2389, 3254, +3553, 2396, 3252, +3551, 2405, 3250, +3549, 2418, 3247, +3546, 2434, 3242, +3542, 2454, 3236, +3537, 2480, 3229, +3530, 2513, 3218, +3520, 2554, 3203, +3506, 2603, 3182, +3488, 2661, 3153, +3462, 2729, 3111, +3424, 2806, 3048, +3369, 2892, 2947, +3283, 2987, 2763, +3133, 3089, 2264, +2799, 3197, 0, +0, 3310, 0, +0, 3428, 0, +0, 3548, 0, +0, 3672, 0, +3689, 2498, 3391, +3689, 2498, 3391, +3689, 2499, 3391, +3689, 2499, 3390, +3689, 2500, 3390, +3689, 2500, 3390, +3689, 2501, 3390, +3689, 2503, 3390, +3688, 2504, 3389, +3688, 2507, 3389, +3688, 2510, 3388, +3687, 2514, 3387, +3686, 2520, 3386, +3685, 2527, 3384, +3683, 2536, 3382, +3681, 2549, 3378, +3678, 2565, 3374, +3674, 2585, 3368, +3669, 2612, 3360, +3662, 2644, 3350, +3652, 2685, 3335, +3639, 2734, 3314, +3620, 2792, 3285, +3594, 2860, 3243, +3557, 2938, 3180, +3501, 3024, 3079, +3415, 3119, 2895, +3265, 3221, 2394, +2932, 3329, 0, +0, 3442, 0, +0, 3560, 0, +0, 3681, 0, +3822, 2629, 3523, +3822, 2629, 3523, +3822, 2630, 3523, +3822, 2630, 3522, +3821, 2630, 3522, +3821, 2631, 3522, +3821, 2632, 3522, +3821, 2633, 3522, +3821, 2634, 3522, +3821, 2636, 3521, +3820, 2638, 3521, +3820, 2641, 3520, +3819, 2645, 3519, +3818, 2651, 3518, +3817, 2658, 3516, +3815, 2668, 3513, +3813, 2680, 3510, +3810, 2696, 3506, +3806, 2717, 3500, +3801, 2743, 3492, +3794, 2776, 3481, +3784, 2817, 3467, +3771, 2866, 3446, +3752, 2924, 3417, +3726, 2992, 3375, +3689, 3069, 3312, +3633, 3156, 3210, +3547, 3251, 3026, +3398, 3353, 2524, +3064, 3461, 0, +0, 3574, 0, +0, 3692, 0, +3954, 2760, 3655, +3954, 2761, 3655, +3954, 2761, 3654, +3954, 2761, 3654, +3954, 2761, 3654, +3954, 2762, 3654, +3953, 2762, 3654, +3953, 2763, 3654, +3953, 2764, 3654, +3953, 2765, 3653, +3953, 2767, 3653, +3952, 2769, 3652, +3952, 2773, 3652, +3951, 2777, 3651, +3950, 2782, 3649, +3949, 2790, 3648, +3947, 2799, 3645, +3945, 2812, 3642, +3942, 2828, 3638, +3939, 2848, 3632, +3933, 2875, 3624, +3926, 2908, 3613, +3916, 2948, 3598, +3903, 2997, 3578, +3884, 3056, 3549, +3858, 3124, 3507, +3821, 3201, 3443, +3766, 3288, 3342, +3679, 3383, 3158, +3530, 3485, 2655, +3196, 3593, 0, +0, 3706, 0, +4086, 2892, 3787, +4086, 2892, 3787, +4086, 2892, 3787, +4086, 2892, 3786, +4086, 2893, 3786, +4086, 2893, 3786, +4086, 2893, 3786, +4086, 2894, 3786, +4086, 2895, 3786, +4085, 2896, 3786, +4085, 2897, 3785, +4085, 2899, 3785, +4084, 2901, 3784, +4084, 2904, 3784, +4083, 2908, 3783, +4082, 2914, 3781, +4081, 2921, 3780, +4080, 2931, 3777, +4077, 2943, 3774, +4075, 2959, 3770, +4071, 2980, 3764, +4065, 3006, 3756, +4058, 3039, 3745, +4048, 3080, 3730, +4035, 3129, 3710, +4016, 3188, 3681, +3990, 3256, 3639, +3953, 3333, 3575, +3898, 3420, 3474, +3811, 3515, 3289, +3662, 3617, 2786, +3329, 3725, 0, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3024, 3918, +4095, 3024, 3918, +4095, 3025, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3029, 3917, +4095, 3030, 3917, +4095, 3033, 3916, +4095, 3036, 3916, +4095, 3040, 3915, +4095, 3046, 3913, +4095, 3053, 3912, +4095, 3062, 3909, +4095, 3075, 3906, +4095, 3091, 3902, +4095, 3112, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3212, 3862, +4095, 3261, 3842, +4095, 3320, 3813, +4095, 3388, 3771, +4085, 3465, 3707, +4030, 3552, 3606, +3943, 3647, 3421, +3794, 3749, 2917, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3155, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4050, +4095, 3156, 4050, +4095, 3157, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3161, 4049, +4095, 3162, 4049, +4095, 3165, 4048, +4095, 3168, 4048, +4095, 3172, 4047, +4095, 3177, 4045, +4095, 3185, 4044, +4095, 3194, 4041, +4095, 3207, 4038, +4095, 3223, 4034, +4095, 3244, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3344, 3994, +4095, 3393, 3974, +4095, 3452, 3945, +4095, 3520, 3903, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3779, 3553, +0, 494, 709, +0, 513, 690, +0, 537, 662, +0, 567, 621, +0, 604, 561, +0, 650, 466, +0, 705, 295, +0, 770, 0, +0, 843, 0, +0, 927, 0, +0, 1018, 0, +0, 1118, 0, +0, 1223, 0, +0, 1335, 0, +0, 1451, 0, +0, 1571, 0, +0, 1693, 0, +0, 1818, 0, +0, 1945, 0, +0, 2073, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 500, 738, +0, 519, 719, +0, 543, 693, +0, 572, 655, +0, 610, 600, +0, 655, 513, +0, 709, 363, +0, 773, 25, +0, 846, 0, +0, 929, 0, +0, 1020, 0, +0, 1119, 0, +0, 1225, 0, +0, 1336, 0, +0, 1452, 0, +0, 1571, 0, +0, 1694, 0, +0, 1819, 0, +0, 1945, 0, +0, 2073, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 509, 773, +0, 527, 756, +0, 550, 732, +0, 580, 697, +0, 616, 647, +0, 661, 569, +0, 715, 440, +0, 778, 174, +0, 850, 0, +0, 932, 0, +0, 1023, 0, +0, 1121, 0, +0, 1227, 0, +0, 1337, 0, +0, 1453, 0, +0, 1572, 0, +0, 1694, 0, +0, 1819, 0, +0, 1946, 0, +0, 2073, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +66, 520, 816, +0, 538, 801, +0, 561, 779, +0, 589, 748, +0, 625, 703, +0, 669, 635, +0, 722, 525, +0, 784, 318, +0, 856, 0, +0, 937, 0, +0, 1027, 0, +0, 1124, 0, +0, 1229, 0, +0, 1339, 0, +0, 1454, 0, +0, 1573, 0, +0, 1695, 0, +0, 1820, 0, +0, 1946, 0, +0, 2074, 0, +0, 2202, 0, +0, 2332, 0, +0, 2462, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3118, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +429, 534, 868, +379, 552, 854, +302, 574, 835, +173, 602, 808, +0, 637, 769, +0, 680, 711, +0, 731, 620, +0, 792, 459, +0, 863, 78, +0, 943, 0, +0, 1031, 0, +0, 1128, 0, +0, 1232, 0, +0, 1342, 0, +0, 1456, 0, +0, 1575, 0, +0, 1696, 0, +0, 1821, 0, +0, 1947, 0, +0, 2074, 0, +0, 2203, 0, +0, 2332, 0, +0, 2463, 0, +0, 2593, 0, +0, 2724, 0, +0, 2855, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +680, 553, 930, +652, 570, 918, +611, 591, 901, +550, 618, 878, +454, 652, 844, +281, 693, 796, +0, 743, 721, +0, 803, 597, +0, 872, 351, +0, 950, 0, +0, 1038, 0, +0, 1133, 0, +0, 1236, 0, +0, 1345, 0, +0, 1459, 0, +0, 1577, 0, +0, 1698, 0, +0, 1822, 0, +0, 1948, 0, +0, 2075, 0, +0, 2203, 0, +0, 2333, 0, +0, 2463, 0, +0, 2593, 0, +0, 2724, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +884, 577, 1001, +866, 593, 990, +841, 613, 976, +806, 639, 956, +753, 671, 929, +672, 711, 889, +534, 759, 829, +243, 817, 734, +0, 884, 566, +0, 960, 150, +0, 1046, 0, +0, 1140, 0, +0, 1241, 0, +0, 1349, 0, +0, 1462, 0, +0, 1579, 0, +0, 1700, 0, +0, 1823, 0, +0, 1949, 0, +0, 2076, 0, +0, 2204, 0, +0, 2333, 0, +0, 2463, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1063, 607, 1081, +1051, 622, 1072, +1035, 641, 1061, +1012, 665, 1044, +979, 696, 1022, +932, 733, 989, +859, 780, 942, +739, 835, 870, +505, 899, 751, +0, 974, 520, +0, 1057, 0, +0, 1149, 0, +0, 1249, 0, +0, 1355, 0, +0, 1466, 0, +0, 1583, 0, +0, 1702, 0, +0, 1825, 0, +0, 1950, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1228, 644, 1170, +1219, 658, 1163, +1208, 676, 1153, +1193, 698, 1140, +1171, 727, 1122, +1140, 762, 1096, +1096, 805, 1059, +1029, 858, 1005, +919, 919, 919, +715, 991, 773, +63, 1071, 450, +0, 1161, 0, +0, 1258, 0, +0, 1362, 0, +0, 1472, 0, +0, 1587, 0, +0, 1706, 0, +0, 1828, 0, +0, 1952, 0, +0, 2078, 0, +0, 2206, 0, +0, 2335, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1383, 690, 1267, +1377, 702, 1262, +1369, 718, 1254, +1358, 739, 1243, +1343, 765, 1229, +1322, 798, 1208, +1293, 838, 1180, +1250, 887, 1139, +1187, 945, 1077, +1084, 1013, 978, +897, 1090, 801, +377, 1176, 337, +0, 1270, 0, +0, 1372, 0, +0, 1480, 0, +0, 1593, 0, +0, 1711, 0, +0, 1831, 0, +0, 1955, 0, +0, 2080, 0, +0, 2208, 0, +0, 2336, 0, +0, 2465, 0, +0, 2595, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1531, 745, 1371, +1527, 756, 1367, +1521, 770, 1361, +1513, 788, 1352, +1503, 812, 1341, +1488, 841, 1325, +1468, 878, 1303, +1440, 923, 1272, +1399, 977, 1227, +1337, 1040, 1158, +1239, 1113, 1047, +1064, 1195, 835, +609, 1286, 120, +0, 1385, 0, +0, 1490, 0, +0, 1601, 0, +0, 1717, 0, +0, 1836, 0, +0, 1958, 0, +0, 2083, 0, +0, 2210, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1675, 809, 1481, +1672, 818, 1478, +1668, 831, 1473, +1662, 847, 1466, +1655, 867, 1458, +1644, 894, 1445, +1630, 927, 1429, +1610, 967, 1405, +1582, 1016, 1372, +1542, 1075, 1323, +1483, 1143, 1249, +1388, 1220, 1125, +1220, 1307, 878, +804, 1401, 0, +0, 1503, 0, +0, 1611, 0, +0, 1725, 0, +0, 1842, 0, +0, 1963, 0, +0, 2087, 0, +0, 2212, 0, +0, 2340, 0, +0, 2468, 0, +0, 2597, 0, +0, 2727, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1816, 882, 1596, +1813, 890, 1593, +1810, 901, 1590, +1806, 915, 1585, +1801, 933, 1578, +1793, 955, 1569, +1783, 984, 1556, +1769, 1020, 1538, +1750, 1064, 1514, +1722, 1117, 1478, +1683, 1179, 1427, +1625, 1251, 1347, +1532, 1333, 1212, +1369, 1422, 929, +978, 1520, 0, +0, 1625, 0, +0, 1735, 0, +0, 1850, 0, +0, 1969, 0, +0, 2092, 0, +0, 2216, 0, +0, 2342, 0, +0, 2470, 0, +0, 2599, 0, +0, 2728, 0, +0, 2859, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1954, 965, 1715, +1952, 972, 1713, +1950, 981, 1710, +1947, 992, 1706, +1943, 1007, 1701, +1938, 1027, 1694, +1930, 1052, 1684, +1920, 1083, 1671, +1906, 1121, 1653, +1887, 1168, 1627, +1860, 1224, 1590, +1821, 1290, 1536, +1764, 1365, 1452, +1673, 1449, 1307, +1514, 1542, 989, +1139, 1642, 0, +0, 1749, 0, +0, 1861, 0, +0, 1978, 0, +0, 2098, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +2091, 1056, 1837, +2090, 1062, 1835, +2088, 1069, 1833, +2086, 1079, 1830, +2083, 1091, 1826, +2079, 1108, 1821, +2073, 1129, 1813, +2066, 1155, 1803, +2056, 1188, 1790, +2042, 1229, 1771, +2023, 1278, 1745, +1997, 1337, 1707, +1958, 1405, 1650, +1901, 1483, 1562, +1812, 1570, 1409, +1655, 1664, 1059, +1292, 1767, 0, +0, 1875, 0, +0, 1988, 0, +0, 2106, 0, +0, 2227, 0, +0, 2351, 0, +0, 2476, 0, +0, 2604, 0, +0, 2732, 0, +0, 2861, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2227, 1156, 1961, +2226, 1160, 1960, +2224, 1166, 1958, +2223, 1174, 1956, +2221, 1184, 1953, +2218, 1197, 1949, +2214, 1214, 1943, +2208, 1236, 1936, +2201, 1264, 1926, +2191, 1299, 1912, +2177, 1342, 1893, +2158, 1393, 1866, +2132, 1454, 1827, +2094, 1524, 1769, +2037, 1604, 1678, +1948, 1693, 1517, +1794, 1789, 1139, +1439, 1893, 0, +0, 2002, 0, +0, 2117, 0, +0, 2235, 0, +0, 2357, 0, +0, 2481, 0, +0, 2607, 0, +0, 2735, 0, +0, 2863, 0, +0, 2993, 0, +0, 3123, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3647, 0, +2361, 1261, 2087, +2361, 1265, 2086, +2360, 1270, 2085, +2358, 1276, 2083, +2357, 1284, 2081, +2355, 1295, 2078, +2352, 1309, 2074, +2348, 1327, 2068, +2342, 1349, 2061, +2335, 1378, 2050, +2325, 1415, 2036, +2312, 1459, 2017, +2293, 1512, 1989, +2266, 1574, 1949, +2228, 1646, 1890, +2172, 1728, 1797, +2084, 1818, 1631, +1931, 1916, 1227, +1581, 2021, 0, +0, 2131, 0, +0, 2246, 0, +0, 2365, 0, +0, 2488, 0, +0, 2612, 0, +0, 2738, 0, +0, 2866, 0, +0, 2995, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2495, 1373, 2215, +2495, 1376, 2214, +2494, 1379, 2213, +2493, 1384, 2212, +2492, 1391, 2210, +2490, 1399, 2208, +2488, 1410, 2205, +2485, 1424, 2201, +2481, 1443, 2195, +2476, 1467, 2187, +2469, 1497, 2177, +2459, 1534, 2163, +2445, 1579, 2143, +2427, 1634, 2115, +2400, 1698, 2074, +2362, 1771, 2014, +2306, 1854, 1919, +2219, 1945, 1749, +2066, 2044, 1323, +1721, 2149, 0, +0, 2261, 0, +0, 2376, 0, +0, 2496, 0, +0, 2619, 0, +0, 2743, 0, +0, 2870, 0, +0, 2998, 0, +0, 3127, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3649, 0, +2629, 1489, 2343, +2628, 1491, 2343, +2628, 1494, 2342, +2627, 1497, 2341, +2626, 1503, 2340, +2625, 1509, 2338, +2623, 1518, 2336, +2621, 1529, 2333, +2618, 1544, 2329, +2614, 1563, 2323, +2609, 1588, 2315, +2602, 1618, 2305, +2592, 1656, 2290, +2579, 1703, 2270, +2560, 1758, 2242, +2534, 1823, 2201, +2496, 1897, 2140, +2440, 1981, 2043, +2353, 2073, 1870, +2201, 2173, 1427, +1859, 2279, 0, +0, 2391, 0, +0, 2507, 0, +0, 2627, 0, +0, 2750, 0, +0, 2875, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +2762, 1608, 2473, +2762, 1610, 2473, +2761, 1612, 2472, +2761, 1615, 2471, +2760, 1619, 2470, +2759, 1624, 2469, +2758, 1631, 2467, +2756, 1640, 2465, +2754, 1652, 2462, +2751, 1667, 2458, +2747, 1686, 2452, +2742, 1711, 2444, +2735, 1742, 2434, +2725, 1781, 2419, +2712, 1828, 2399, +2693, 1884, 2370, +2667, 1950, 2329, +2629, 2025, 2268, +2573, 2109, 2170, +2486, 2202, 1993, +2335, 2302, 1536, +1996, 2409, 0, +0, 2521, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +2895, 1731, 2603, +2895, 1732, 2603, +2894, 1734, 2602, +2894, 1736, 2602, +2893, 1739, 2601, +2893, 1743, 2600, +2892, 1748, 2599, +2891, 1755, 2597, +2889, 1764, 2595, +2887, 1776, 2592, +2884, 1791, 2587, +2880, 1811, 2582, +2875, 1836, 2574, +2868, 1868, 2563, +2858, 1907, 2549, +2844, 1955, 2528, +2826, 2012, 2500, +2800, 2078, 2458, +2762, 2154, 2396, +2706, 2239, 2298, +2619, 2332, 2119, +2469, 2433, 1651, +2131, 2540, 0, +0, 2652, 0, +0, 2769, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3028, 1856, 2734, +3027, 1857, 2734, +3027, 1858, 2733, +3027, 1860, 2733, +3027, 1862, 2732, +3026, 1865, 2732, +3025, 1869, 2731, +3024, 1874, 2729, +3023, 1881, 2728, +3022, 1890, 2725, +3019, 1902, 2722, +3017, 1918, 2718, +3013, 1938, 2712, +3007, 1964, 2704, +3000, 1996, 2694, +2990, 2035, 2679, +2977, 2083, 2658, +2958, 2140, 2630, +2932, 2207, 2588, +2895, 2283, 2526, +2839, 2369, 2426, +2752, 2462, 2246, +2602, 2563, 1769, +2265, 2671, 0, +0, 2784, 0, +0, 2901, 0, +0, 3021, 0, +0, 3144, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +3160, 1982, 2865, +3160, 1983, 2865, +3160, 1984, 2864, +3160, 1985, 2864, +3159, 1987, 2864, +3159, 1989, 2863, +3158, 1992, 2862, +3158, 1996, 2861, +3157, 2002, 2860, +3156, 2009, 2858, +3154, 2018, 2856, +3152, 2030, 2853, +3149, 2046, 2849, +3145, 2066, 2843, +3140, 2092, 2835, +3133, 2124, 2824, +3123, 2164, 2810, +3109, 2212, 2789, +3091, 2270, 2760, +3065, 2337, 2719, +3027, 2414, 2656, +2972, 2499, 2556, +2885, 2593, 2375, +2735, 2695, 1890, +2399, 2802, 0, +0, 2915, 0, +0, 3032, 0, +0, 3153, 0, +0, 3276, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +3292, 2110, 2996, +3292, 2111, 2996, +3292, 2111, 2996, +3292, 2112, 2996, +3292, 2114, 2995, +3292, 2116, 2995, +3291, 2118, 2994, +3291, 2121, 2994, +3290, 2125, 2993, +3289, 2130, 2991, +3288, 2138, 2990, +3286, 2147, 2987, +3284, 2159, 2984, +3281, 2175, 2980, +3277, 2195, 2974, +3272, 2221, 2966, +3265, 2254, 2955, +3255, 2294, 2941, +3242, 2342, 2920, +3223, 2400, 2891, +3197, 2467, 2849, +3160, 2544, 2787, +3104, 2630, 2686, +3018, 2724, 2504, +2868, 2826, 2015, +2533, 2934, 0, +0, 3047, 0, +0, 3164, 0, +0, 3285, 0, +0, 3408, 0, +0, 3534, 0, +0, 3661, 0, +3425, 2239, 3128, +3425, 2240, 3127, +3425, 2240, 3127, +3425, 2241, 3127, +3424, 2242, 3127, +3424, 2243, 3127, +3424, 2245, 3126, +3424, 2247, 3126, +3423, 2250, 3125, +3422, 2254, 3124, +3421, 2260, 3123, +3420, 2267, 3121, +3419, 2276, 3119, +3417, 2289, 3115, +3414, 2305, 3111, +3410, 2325, 3105, +3404, 2351, 3097, +3397, 2384, 3087, +3387, 2424, 3072, +3374, 2473, 3051, +3355, 2531, 3022, +3329, 2598, 2980, +3292, 2675, 2918, +3237, 2761, 2817, +3150, 2856, 2634, +3000, 2957, 2141, +2666, 3065, 0, +0, 3178, 0, +0, 3296, 0, +0, 3417, 0, +0, 3540, 0, +0, 3666, 0, +3557, 2369, 3259, +3557, 2369, 3259, +3557, 2370, 3259, +3557, 2370, 3259, +3557, 2371, 3259, +3557, 2372, 3259, +3556, 2373, 3258, +3556, 2375, 3258, +3556, 2377, 3257, +3555, 2380, 3257, +3555, 2385, 3256, +3554, 2390, 3254, +3553, 2397, 3252, +3551, 2407, 3250, +3549, 2419, 3247, +3546, 2435, 3243, +3542, 2456, 3237, +3537, 2482, 3229, +3529, 2514, 3218, +3520, 2555, 3203, +3506, 2604, 3183, +3488, 2662, 3154, +3462, 2729, 3112, +3424, 2807, 3049, +3369, 2893, 2948, +3282, 2987, 2765, +3133, 3089, 2268, +2799, 3197, 0, +0, 3310, 0, +0, 3428, 0, +0, 3549, 0, +0, 3672, 0, +3689, 2499, 3391, +3689, 2499, 3391, +3689, 2500, 3391, +3689, 2500, 3391, +3689, 2501, 3391, +3689, 2501, 3390, +3689, 2502, 3390, +3689, 2504, 3390, +3688, 2506, 3390, +3688, 2508, 3389, +3687, 2511, 3388, +3687, 2515, 3387, +3686, 2521, 3386, +3685, 2528, 3384, +3683, 2537, 3382, +3681, 2550, 3379, +3678, 2566, 3374, +3674, 2586, 3369, +3669, 2613, 3361, +3662, 2645, 3350, +3652, 2686, 3335, +3639, 2735, 3314, +3620, 2793, 3285, +3594, 2861, 3243, +3556, 2938, 3180, +3501, 3024, 3079, +3415, 3119, 2896, +3265, 3221, 2397, +2931, 3329, 0, +0, 3442, 0, +0, 3560, 0, +0, 3681, 0, +3822, 2630, 3523, +3822, 2630, 3523, +3821, 2630, 3523, +3821, 2631, 3523, +3821, 2631, 3523, +3821, 2632, 3522, +3821, 2632, 3522, +3821, 2633, 3522, +3821, 2635, 3522, +3821, 2637, 3521, +3820, 2639, 3521, +3820, 2642, 3520, +3819, 2646, 3519, +3818, 2652, 3518, +3817, 2659, 3516, +3815, 2668, 3514, +3813, 2681, 3510, +3810, 2697, 3506, +3806, 2717, 3500, +3801, 2744, 3492, +3794, 2777, 3482, +3784, 2817, 3467, +3771, 2866, 3446, +3752, 2925, 3417, +3726, 2992, 3375, +3689, 3070, 3312, +3633, 3156, 3211, +3547, 3251, 3027, +3398, 3353, 2526, +3064, 3461, 0, +0, 3574, 0, +0, 3692, 0, +3954, 2761, 3655, +3954, 2761, 3655, +3954, 2761, 3655, +3954, 2762, 3655, +3954, 2762, 3655, +3954, 2762, 3654, +3953, 2763, 3654, +3953, 2764, 3654, +3953, 2765, 3654, +3953, 2766, 3654, +3953, 2768, 3653, +3952, 2770, 3653, +3952, 2773, 3652, +3951, 2777, 3651, +3950, 2783, 3650, +3949, 2790, 3648, +3947, 2800, 3645, +3945, 2812, 3642, +3942, 2828, 3638, +3938, 2849, 3632, +3933, 2875, 3624, +3926, 2908, 3614, +3916, 2949, 3599, +3903, 2998, 3578, +3884, 3056, 3549, +3858, 3124, 3507, +3821, 3202, 3444, +3766, 3288, 3343, +3679, 3383, 3158, +3530, 3485, 2656, +3196, 3593, 0, +0, 3706, 0, +4086, 2892, 3787, +4086, 2893, 3787, +4086, 2893, 3787, +4086, 2893, 3787, +4086, 2893, 3787, +4086, 2893, 3786, +4086, 2894, 3786, +4086, 2894, 3786, +4085, 2895, 3786, +4085, 2896, 3786, +4085, 2897, 3786, +4085, 2899, 3785, +4084, 2902, 3785, +4084, 2905, 3784, +4083, 2909, 3783, +4082, 2914, 3782, +4081, 2922, 3780, +4080, 2931, 3777, +4077, 2944, 3774, +4075, 2960, 3770, +4071, 2980, 3764, +4065, 3007, 3756, +4058, 3040, 3745, +4048, 3080, 3731, +4035, 3130, 3710, +4016, 3188, 3681, +3990, 3256, 3639, +3953, 3333, 3575, +3898, 3420, 3474, +3811, 3515, 3290, +3662, 3617, 2787, +3328, 3725, 0, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3024, 3919, +4095, 3025, 3919, +4095, 3025, 3918, +4095, 3025, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3918, +4095, 3029, 3918, +4095, 3031, 3917, +4095, 3033, 3917, +4095, 3036, 3916, +4095, 3040, 3915, +4095, 3046, 3914, +4095, 3053, 3912, +4095, 3063, 3909, +4095, 3075, 3906, +4095, 3091, 3902, +4095, 3112, 3896, +4095, 3138, 3888, +4095, 3171, 3877, +4095, 3212, 3863, +4095, 3261, 3842, +4095, 3320, 3813, +4095, 3388, 3771, +4085, 3465, 3707, +4030, 3552, 3606, +3943, 3647, 3422, +3794, 3749, 2918, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3157, 4050, +4095, 3157, 4050, +4095, 3158, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3161, 4050, +4095, 3163, 4049, +4095, 3165, 4049, +4095, 3168, 4048, +4095, 3172, 4047, +4095, 3178, 4046, +4095, 3185, 4044, +4095, 3195, 4041, +4095, 3207, 4038, +4095, 3223, 4034, +4095, 3244, 4028, +4095, 3270, 4020, +4095, 3303, 4009, +4095, 3344, 3995, +4095, 3393, 3974, +4095, 3452, 3945, +4095, 3520, 3903, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3779, 3553, +0, 606, 834, +0, 621, 819, +0, 640, 798, +0, 664, 769, +0, 695, 726, +0, 733, 662, +0, 779, 559, +0, 834, 370, +0, 899, 0, +0, 973, 0, +0, 1057, 0, +0, 1149, 0, +0, 1248, 0, +0, 1355, 0, +0, 1466, 0, +0, 1583, 0, +0, 1702, 0, +0, 1825, 0, +0, 1950, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3250, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 611, 856, +0, 626, 842, +0, 645, 822, +0, 669, 794, +0, 699, 753, +0, 737, 693, +0, 782, 598, +0, 837, 427, +0, 902, 2, +0, 976, 0, +0, 1059, 0, +0, 1150, 0, +0, 1250, 0, +0, 1356, 0, +0, 1467, 0, +0, 1583, 0, +0, 1703, 0, +0, 1825, 0, +0, 1950, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 618, 883, +0, 632, 870, +0, 651, 851, +0, 675, 825, +0, 705, 788, +0, 742, 732, +0, 787, 645, +0, 841, 495, +0, 905, 157, +0, 979, 0, +0, 1061, 0, +0, 1152, 0, +0, 1251, 0, +0, 1357, 0, +0, 1468, 0, +0, 1584, 0, +0, 1703, 0, +0, 1826, 0, +0, 1951, 0, +0, 2077, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +0, 627, 918, +0, 641, 905, +0, 659, 888, +0, 682, 864, +0, 712, 829, +0, 748, 779, +0, 793, 702, +0, 847, 572, +0, 910, 306, +0, 983, 0, +0, 1064, 0, +0, 1155, 0, +0, 1253, 0, +0, 1359, 0, +0, 1469, 0, +0, 1585, 0, +0, 1704, 0, +0, 1827, 0, +0, 1951, 0, +0, 2078, 0, +0, 2205, 0, +0, 2334, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +271, 638, 960, +198, 652, 948, +78, 670, 933, +0, 693, 911, +0, 721, 880, +0, 757, 835, +0, 801, 768, +0, 854, 657, +0, 916, 450, +0, 988, 0, +0, 1069, 0, +0, 1159, 0, +0, 1256, 0, +0, 1361, 0, +0, 1471, 0, +0, 1586, 0, +0, 1705, 0, +0, 1827, 0, +0, 1952, 0, +0, 2078, 0, +0, 2206, 0, +0, 2335, 0, +0, 2464, 0, +0, 2594, 0, +0, 2725, 0, +0, 2856, 0, +0, 2987, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +595, 653, 1011, +561, 667, 1000, +511, 684, 986, +434, 706, 967, +305, 734, 940, +43, 769, 901, +0, 812, 843, +0, 863, 752, +0, 924, 591, +0, 995, 210, +0, 1075, 0, +0, 1164, 0, +0, 1260, 0, +0, 1364, 0, +0, 1474, 0, +0, 1588, 0, +0, 1707, 0, +0, 1829, 0, +0, 1953, 0, +0, 2079, 0, +0, 2206, 0, +0, 2335, 0, +0, 2464, 0, +0, 2595, 0, +0, 2725, 0, +0, 2856, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +832, 672, 1071, +812, 685, 1062, +784, 702, 1050, +743, 723, 1033, +682, 750, 1010, +586, 784, 976, +413, 825, 928, +0, 875, 853, +0, 935, 729, +0, 1004, 483, +0, 1082, 0, +0, 1170, 0, +0, 1265, 0, +0, 1368, 0, +0, 1477, 0, +0, 1591, 0, +0, 1709, 0, +0, 1830, 0, +0, 1954, 0, +0, 2080, 0, +0, 2207, 0, +0, 2335, 0, +0, 2465, 0, +0, 2595, 0, +0, 2725, 0, +0, 2856, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3382, 0, +0, 3514, 0, +0, 3646, 0, +1029, 697, 1140, +1016, 709, 1133, +998, 725, 1122, +973, 745, 1108, +938, 771, 1089, +885, 803, 1061, +804, 843, 1021, +666, 891, 961, +375, 949, 866, +0, 1016, 698, +0, 1093, 282, +0, 1178, 0, +0, 1272, 0, +0, 1374, 0, +0, 1481, 0, +0, 1594, 0, +0, 1711, 0, +0, 1832, 0, +0, 1955, 0, +0, 2081, 0, +0, 2208, 0, +0, 2336, 0, +0, 2465, 0, +0, 2595, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1204, 728, 1220, +1195, 739, 1213, +1183, 754, 1205, +1167, 773, 1193, +1144, 797, 1176, +1111, 828, 1154, +1064, 866, 1121, +991, 912, 1074, +872, 967, 1002, +637, 1032, 883, +0, 1106, 652, +0, 1189, 0, +0, 1281, 0, +0, 1381, 0, +0, 1487, 0, +0, 1599, 0, +0, 1715, 0, +0, 1835, 0, +0, 1957, 0, +0, 2082, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1366, 766, 1308, +1360, 777, 1302, +1352, 790, 1295, +1340, 808, 1286, +1325, 830, 1272, +1303, 859, 1254, +1272, 894, 1228, +1228, 938, 1191, +1161, 990, 1137, +1052, 1052, 1052, +847, 1123, 905, +195, 1203, 583, +0, 1293, 0, +0, 1390, 0, +0, 1494, 0, +0, 1604, 0, +0, 1719, 0, +0, 1838, 0, +0, 1960, 0, +0, 2084, 0, +0, 2210, 0, +0, 2338, 0, +0, 2467, 0, +0, 2596, 0, +0, 2727, 0, +0, 2857, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +1519, 813, 1404, +1515, 822, 1399, +1509, 834, 1394, +1501, 850, 1386, +1490, 871, 1375, +1475, 897, 1361, +1454, 930, 1341, +1425, 970, 1312, +1383, 1019, 1271, +1319, 1077, 1209, +1216, 1145, 1110, +1029, 1222, 933, +509, 1308, 469, +0, 1402, 0, +0, 1504, 0, +0, 1612, 0, +0, 1725, 0, +0, 1843, 0, +0, 1963, 0, +0, 2087, 0, +0, 2213, 0, +0, 2340, 0, +0, 2468, 0, +0, 2597, 0, +0, 2727, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1666, 868, 1507, +1663, 877, 1504, +1659, 888, 1499, +1653, 902, 1493, +1645, 920, 1484, +1635, 944, 1473, +1620, 973, 1457, +1600, 1010, 1435, +1572, 1055, 1404, +1531, 1109, 1359, +1469, 1172, 1290, +1372, 1245, 1179, +1196, 1327, 967, +741, 1418, 252, +0, 1517, 0, +0, 1622, 0, +0, 1733, 0, +0, 1849, 0, +0, 1968, 0, +0, 2091, 0, +0, 2215, 0, +0, 2342, 0, +0, 2470, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1809, 933, 1616, +1807, 941, 1613, +1804, 950, 1610, +1800, 963, 1605, +1794, 979, 1599, +1787, 999, 1590, +1776, 1026, 1578, +1762, 1059, 1561, +1742, 1099, 1537, +1715, 1148, 1504, +1675, 1207, 1455, +1615, 1275, 1381, +1520, 1352, 1257, +1352, 1439, 1010, +936, 1533, 0, +0, 1635, 0, +0, 1743, 0, +0, 1857, 0, +0, 1974, 0, +0, 2095, 0, +0, 2219, 0, +0, 2344, 0, +0, 2472, 0, +0, 2600, 0, +0, 2729, 0, +0, 2859, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1949, 1008, 1730, +1948, 1014, 1728, +1946, 1022, 1725, +1943, 1033, 1722, +1938, 1047, 1717, +1933, 1065, 1710, +1925, 1088, 1701, +1915, 1116, 1688, +1901, 1152, 1670, +1882, 1196, 1646, +1855, 1249, 1610, +1815, 1312, 1559, +1757, 1383, 1479, +1664, 1465, 1344, +1501, 1555, 1061, +1110, 1652, 0, +0, 1757, 0, +0, 1867, 0, +0, 1983, 0, +0, 2102, 0, +0, 2224, 0, +0, 2348, 0, +0, 2474, 0, +0, 2602, 0, +0, 2731, 0, +0, 2860, 0, +0, 2991, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2087, 1092, 1849, +2086, 1097, 1847, +2085, 1104, 1845, +2082, 1113, 1842, +2079, 1124, 1838, +2075, 1140, 1833, +2070, 1159, 1826, +2062, 1184, 1816, +2052, 1215, 1803, +2039, 1254, 1785, +2019, 1300, 1759, +1992, 1357, 1722, +1954, 1422, 1668, +1896, 1497, 1584, +1805, 1581, 1439, +1646, 1674, 1121, +1271, 1774, 0, +0, 1881, 0, +0, 1993, 0, +0, 2110, 0, +0, 2230, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2224, 1184, 1970, +2223, 1189, 1969, +2222, 1194, 1967, +2220, 1201, 1965, +2218, 1211, 1962, +2215, 1224, 1958, +2211, 1240, 1953, +2206, 1261, 1945, +2198, 1287, 1936, +2188, 1320, 1922, +2175, 1361, 1903, +2156, 1410, 1877, +2129, 1469, 1839, +2090, 1537, 1782, +2033, 1615, 1694, +1944, 1702, 1541, +1787, 1797, 1191, +1424, 1899, 0, +0, 2007, 0, +0, 2121, 0, +0, 2238, 0, +0, 2359, 0, +0, 2483, 0, +0, 2608, 0, +0, 2736, 0, +0, 2864, 0, +0, 2993, 0, +0, 3123, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2359, 1284, 2094, +2359, 1288, 2093, +2358, 1292, 2092, +2357, 1298, 2090, +2355, 1306, 2088, +2353, 1316, 2085, +2350, 1329, 2081, +2346, 1346, 2075, +2340, 1368, 2068, +2333, 1396, 2058, +2323, 1431, 2044, +2309, 1474, 2025, +2291, 1525, 1998, +2264, 1586, 1959, +2226, 1656, 1901, +2169, 1736, 1810, +2080, 1825, 1649, +1926, 1921, 1271, +1571, 2025, 0, +0, 2135, 0, +0, 2249, 0, +0, 2368, 0, +0, 2489, 0, +0, 2613, 0, +0, 2739, 0, +0, 2867, 0, +0, 2995, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2494, 1391, 2220, +2493, 1393, 2219, +2493, 1397, 2218, +2492, 1402, 2217, +2491, 1408, 2215, +2489, 1416, 2213, +2487, 1427, 2210, +2484, 1441, 2206, +2480, 1459, 2200, +2474, 1482, 2193, +2467, 1511, 2183, +2457, 1547, 2168, +2444, 1591, 2149, +2425, 1644, 2121, +2398, 1706, 2082, +2361, 1779, 2022, +2304, 1860, 1929, +2216, 1950, 1763, +2063, 2048, 1359, +1714, 2153, 0, +0, 2263, 0, +0, 2378, 0, +0, 2498, 0, +0, 2620, 0, +0, 2744, 0, +0, 2871, 0, +0, 2998, 0, +0, 3127, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +2628, 1503, 2347, +2627, 1505, 2347, +2627, 1508, 2346, +2626, 1511, 2345, +2625, 1516, 2344, +2624, 1523, 2342, +2622, 1531, 2340, +2620, 1542, 2337, +2617, 1557, 2333, +2613, 1575, 2327, +2608, 1599, 2319, +2601, 1629, 2309, +2591, 1666, 2295, +2577, 1711, 2275, +2559, 1766, 2247, +2532, 1830, 2207, +2495, 1903, 2146, +2438, 1986, 2051, +2351, 2077, 1881, +2199, 2176, 1456, +1853, 2281, 0, +0, 2393, 0, +0, 2509, 0, +0, 2628, 0, +0, 2751, 0, +0, 2875, 0, +0, 3002, 0, +0, 3130, 0, +0, 3259, 0, +0, 3388, 0, +0, 3519, 0, +0, 3650, 0, +2761, 1619, 2476, +2761, 1621, 2476, +2760, 1623, 2475, +2760, 1626, 2474, +2759, 1630, 2473, +2758, 1635, 2472, +2757, 1641, 2470, +2756, 1650, 2468, +2753, 1661, 2465, +2750, 1676, 2461, +2747, 1695, 2455, +2741, 1720, 2447, +2734, 1750, 2437, +2724, 1788, 2422, +2711, 1835, 2402, +2692, 1890, 2374, +2666, 1955, 2333, +2628, 2029, 2272, +2572, 2113, 2176, +2485, 2205, 2002, +2333, 2305, 1559, +1991, 2411, 0, +0, 2523, 0, +0, 2639, 0, +0, 2759, 0, +0, 2882, 0, +0, 3007, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3520, 0, +0, 3651, 0, +2894, 1739, 2605, +2894, 1740, 2605, +2894, 1742, 2605, +2893, 1744, 2604, +2893, 1747, 2603, +2892, 1751, 2602, +2891, 1756, 2601, +2890, 1763, 2599, +2888, 1772, 2597, +2886, 1784, 2594, +2883, 1799, 2590, +2879, 1818, 2584, +2874, 1843, 2576, +2867, 1874, 2566, +2857, 1913, 2551, +2844, 1960, 2531, +2825, 2016, 2502, +2799, 2082, 2461, +2761, 2157, 2400, +2705, 2241, 2302, +2618, 2334, 2125, +2468, 2434, 1668, +2128, 2541, 0, +0, 2653, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +3027, 1862, 2735, +3027, 1863, 2735, +3027, 1864, 2735, +3026, 1866, 2735, +3026, 1868, 2734, +3026, 1871, 2733, +3025, 1875, 2732, +3024, 1880, 2731, +3023, 1887, 2729, +3021, 1896, 2727, +3019, 1908, 2724, +3016, 1924, 2720, +3012, 1943, 2714, +3007, 1969, 2706, +3000, 2000, 2695, +2990, 2039, 2681, +2976, 2087, 2660, +2958, 2144, 2632, +2932, 2210, 2590, +2894, 2286, 2528, +2838, 2371, 2430, +2752, 2464, 2251, +2601, 2565, 1783, +2263, 2672, 0, +0, 2784, 0, +0, 2901, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +3160, 1987, 2866, +3160, 1988, 2866, +3159, 1989, 2866, +3159, 1990, 2865, +3159, 1992, 2865, +3159, 1994, 2864, +3158, 1997, 2864, +3157, 2001, 2863, +3157, 2006, 2861, +3155, 2013, 2860, +3154, 2023, 2857, +3152, 2035, 2854, +3149, 2050, 2850, +3145, 2070, 2844, +3139, 2096, 2836, +3132, 2128, 2826, +3122, 2167, 2811, +3109, 2215, 2791, +3090, 2272, 2762, +3064, 2339, 2720, +3027, 2415, 2658, +2971, 2501, 2558, +2884, 2594, 2378, +2734, 2696, 1901, +2397, 2803, 0, +0, 2916, 0, +0, 3033, 0, +0, 3153, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +3292, 2114, 2997, +3292, 2114, 2997, +3292, 2115, 2997, +3292, 2116, 2997, +3292, 2117, 2996, +3291, 2119, 2996, +3291, 2121, 2995, +3291, 2124, 2995, +3290, 2128, 2994, +3289, 2134, 2992, +3288, 2141, 2990, +3286, 2150, 2988, +3284, 2162, 2985, +3281, 2178, 2981, +3277, 2198, 2975, +3272, 2224, 2967, +3265, 2256, 2956, +3255, 2296, 2942, +3241, 2344, 2921, +3223, 2402, 2892, +3197, 2469, 2851, +3159, 2546, 2788, +3104, 2631, 2688, +3017, 2725, 2507, +2867, 2827, 2023, +2531, 2934, 0, +0, 3047, 0, +0, 3164, 0, +0, 3285, 0, +0, 3408, 0, +0, 3534, 0, +0, 3661, 0, +3425, 2242, 3128, +3425, 2242, 3128, +3425, 2243, 3128, +3424, 2244, 3128, +3424, 2245, 3128, +3424, 2246, 3127, +3424, 2248, 3127, +3423, 2250, 3126, +3423, 2253, 3126, +3422, 2257, 3125, +3421, 2262, 3123, +3420, 2270, 3122, +3418, 2279, 3119, +3416, 2291, 3116, +3413, 2307, 3112, +3410, 2327, 3106, +3404, 2353, 3098, +3397, 2386, 3087, +3387, 2426, 3073, +3374, 2474, 3052, +3355, 2532, 3023, +3329, 2600, 2981, +3292, 2676, 2919, +3236, 2762, 2818, +3150, 2856, 2636, +3000, 2958, 2147, +2665, 3066, 0, +0, 3179, 0, +0, 3296, 0, +0, 3417, 0, +0, 3540, 0, +0, 3666, 0, +3557, 2371, 3260, +3557, 2371, 3260, +3557, 2372, 3260, +3557, 2372, 3259, +3557, 2373, 3259, +3557, 2374, 3259, +3556, 2375, 3259, +3556, 2377, 3258, +3556, 2379, 3258, +3555, 2382, 3257, +3554, 2387, 3256, +3554, 2392, 3255, +3552, 2399, 3253, +3551, 2409, 3251, +3549, 2421, 3247, +3546, 2437, 3243, +3542, 2457, 3237, +3537, 2483, 3230, +3529, 2516, 3219, +3520, 2556, 3204, +3506, 2605, 3183, +3488, 2663, 3154, +3461, 2730, 3113, +3424, 2807, 3050, +3369, 2894, 2949, +3282, 2988, 2766, +3133, 3090, 2273, +2798, 3197, 0, +0, 3311, 0, +0, 3428, 0, +0, 3549, 0, +0, 3672, 0, +3689, 2501, 3391, +3689, 2501, 3391, +3689, 2501, 3391, +3689, 2502, 3391, +3689, 2502, 3391, +3689, 2503, 3391, +3689, 2504, 3391, +3689, 2505, 3390, +3688, 2507, 3390, +3688, 2509, 3389, +3687, 2513, 3389, +3687, 2517, 3388, +3686, 2522, 3386, +3685, 2529, 3385, +3683, 2539, 3382, +3681, 2551, 3379, +3678, 2567, 3375, +3674, 2588, 3369, +3669, 2614, 3361, +3662, 2646, 3350, +3652, 2687, 3336, +3638, 2736, 3315, +3620, 2794, 3286, +3594, 2862, 3244, +3556, 2939, 3181, +3501, 3025, 3080, +3414, 3119, 2897, +3265, 3221, 2400, +2931, 3329, 0, +0, 3442, 0, +0, 3560, 0, +0, 3681, 0, +3821, 2631, 3523, +3821, 2631, 3523, +3821, 2632, 3523, +3821, 2632, 3523, +3821, 2632, 3523, +3821, 2633, 3523, +3821, 2634, 3523, +3821, 2635, 3522, +3821, 2636, 3522, +3820, 2638, 3522, +3820, 2640, 3521, +3820, 2643, 3520, +3819, 2647, 3519, +3818, 2653, 3518, +3817, 2660, 3516, +3815, 2669, 3514, +3813, 2682, 3511, +3810, 2698, 3506, +3806, 2718, 3501, +3801, 2745, 3493, +3794, 2777, 3482, +3784, 2818, 3467, +3771, 2867, 3447, +3752, 2925, 3418, +3726, 2993, 3375, +3689, 3070, 3312, +3633, 3157, 3211, +3547, 3251, 3028, +3397, 3353, 2529, +3063, 3461, 0, +0, 3574, 0, +0, 3692, 0, +3954, 2762, 3655, +3954, 2762, 3655, +3954, 2762, 3655, +3954, 2762, 3655, +3954, 2763, 3655, +3953, 2763, 3655, +3953, 2764, 3655, +3953, 2765, 3654, +3953, 2766, 3654, +3953, 2767, 3654, +3953, 2769, 3653, +3952, 2771, 3653, +3952, 2774, 3652, +3951, 2778, 3651, +3950, 2784, 3650, +3949, 2791, 3648, +3947, 2800, 3646, +3945, 2813, 3643, +3942, 2829, 3638, +3938, 2850, 3632, +3933, 2876, 3625, +3926, 2909, 3614, +3916, 2949, 3599, +3903, 2998, 3578, +3884, 3057, 3549, +3858, 3125, 3507, +3821, 3202, 3444, +3765, 3288, 3343, +3679, 3383, 3159, +3530, 3485, 2658, +3196, 3593, 0, +0, 3706, 0, +4086, 2893, 3787, +4086, 2893, 3787, +4086, 2893, 3787, +4086, 2893, 3787, +4086, 2894, 3787, +4086, 2894, 3787, +4086, 2894, 3787, +4086, 2895, 3786, +4085, 2896, 3786, +4085, 2897, 3786, +4085, 2898, 3786, +4085, 2900, 3785, +4084, 2902, 3785, +4084, 2905, 3784, +4083, 2909, 3783, +4082, 2915, 3782, +4081, 2922, 3780, +4080, 2932, 3778, +4077, 2944, 3774, +4074, 2960, 3770, +4071, 2981, 3764, +4065, 3007, 3756, +4058, 3040, 3746, +4048, 3081, 3731, +4035, 3130, 3710, +4016, 3188, 3681, +3990, 3256, 3639, +3953, 3334, 3576, +3898, 3420, 3475, +3811, 3515, 3290, +3662, 3617, 2788, +3328, 3725, 0, +4095, 3024, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3026, 3918, +4095, 3026, 3918, +4095, 3027, 3918, +4095, 3028, 3918, +4095, 3030, 3918, +4095, 3031, 3917, +4095, 3034, 3917, +4095, 3037, 3916, +4095, 3041, 3915, +4095, 3046, 3914, +4095, 3054, 3912, +4095, 3063, 3910, +4095, 3076, 3906, +4095, 3092, 3902, +4095, 3113, 3896, +4095, 3139, 3888, +4095, 3172, 3878, +4095, 3212, 3863, +4095, 3262, 3842, +4095, 3320, 3813, +4095, 3388, 3771, +4085, 3466, 3708, +4030, 3552, 3606, +3943, 3647, 3422, +3794, 3749, 2919, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3156, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3158, 4050, +4095, 3158, 4050, +4095, 3159, 4050, +4095, 3160, 4050, +4095, 3161, 4050, +4095, 3163, 4049, +4095, 3165, 4049, +4095, 3168, 4048, +4095, 3173, 4047, +4095, 3178, 4046, +4095, 3185, 4044, +4095, 3195, 4041, +4095, 3207, 4038, +4095, 3224, 4034, +4095, 3244, 4028, +4095, 3271, 4020, +4095, 3304, 4009, +4095, 3344, 3995, +4095, 3393, 3974, +4095, 3452, 3945, +4095, 3520, 3903, +4095, 3597, 3839, +4095, 3684, 3738, +4076, 3779, 3554, +0, 723, 961, +0, 734, 949, +0, 749, 934, +0, 769, 912, +0, 793, 881, +0, 824, 837, +0, 862, 769, +0, 908, 660, +0, 964, 453, +0, 1029, 0, +0, 1104, 0, +0, 1187, 0, +0, 1280, 0, +0, 1380, 0, +0, 1486, 0, +0, 1598, 0, +0, 1714, 0, +0, 1834, 0, +0, 1957, 0, +0, 2082, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +0, 727, 977, +0, 738, 966, +0, 753, 951, +0, 772, 930, +0, 796, 901, +0, 827, 858, +0, 865, 794, +0, 911, 691, +0, 966, 502, +0, 1031, 0, +0, 1105, 0, +0, 1189, 0, +0, 1281, 0, +0, 1380, 0, +0, 1487, 0, +0, 1598, 0, +0, 1715, 0, +0, 1835, 0, +0, 1957, 0, +0, 2082, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +0, 732, 998, +0, 743, 988, +0, 758, 974, +0, 777, 954, +0, 801, 926, +0, 831, 886, +0, 869, 825, +0, 915, 730, +0, 969, 560, +0, 1034, 134, +0, 1108, 0, +0, 1191, 0, +0, 1282, 0, +0, 1382, 0, +0, 1488, 0, +0, 1599, 0, +0, 1715, 0, +0, 1835, 0, +0, 1958, 0, +0, 2082, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +0, 739, 1025, +0, 750, 1015, +0, 764, 1002, +0, 783, 983, +0, 807, 957, +0, 837, 920, +0, 874, 864, +0, 919, 777, +0, 973, 627, +0, 1037, 289, +0, 1111, 0, +0, 1193, 0, +0, 1284, 0, +0, 1383, 0, +0, 1489, 0, +0, 1600, 0, +0, 1716, 0, +0, 1836, 0, +0, 1958, 0, +0, 2083, 0, +0, 2209, 0, +0, 2337, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +0, 748, 1059, +0, 759, 1050, +0, 773, 1037, +0, 791, 1020, +0, 815, 996, +0, 844, 962, +0, 880, 911, +0, 925, 834, +0, 979, 704, +0, 1042, 438, +0, 1115, 0, +0, 1197, 0, +0, 1287, 0, +0, 1386, 0, +0, 1491, 0, +0, 1602, 0, +0, 1717, 0, +0, 1836, 0, +0, 1959, 0, +0, 2083, 0, +0, 2210, 0, +0, 2338, 0, +0, 2466, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3119, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +450, 760, 1100, +403, 770, 1092, +330, 784, 1080, +210, 802, 1065, +0, 825, 1043, +0, 853, 1012, +0, 889, 967, +0, 933, 900, +0, 986, 790, +0, 1048, 582, +0, 1120, 0, +0, 1201, 0, +0, 1291, 0, +0, 1388, 0, +0, 1493, 0, +0, 1603, 0, +0, 1718, 0, +0, 1837, 0, +0, 1960, 0, +0, 2084, 0, +0, 2210, 0, +0, 2338, 0, +0, 2467, 0, +0, 2596, 0, +0, 2726, 0, +0, 2857, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +751, 775, 1150, +727, 785, 1143, +693, 799, 1132, +643, 816, 1119, +566, 838, 1099, +437, 866, 1072, +175, 901, 1033, +0, 944, 975, +0, 995, 884, +0, 1056, 723, +0, 1127, 342, +0, 1207, 0, +0, 1296, 0, +0, 1392, 0, +0, 1496, 0, +0, 1606, 0, +0, 1720, 0, +0, 1839, 0, +0, 1961, 0, +0, 2085, 0, +0, 2211, 0, +0, 2338, 0, +0, 2467, 0, +0, 2597, 0, +0, 2727, 0, +0, 2857, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3514, 0, +0, 3646, 0, +978, 795, 1209, +964, 805, 1203, +944, 817, 1194, +916, 834, 1182, +875, 855, 1165, +814, 882, 1142, +718, 916, 1108, +545, 957, 1060, +108, 1008, 985, +0, 1067, 862, +0, 1136, 615, +0, 1215, 0, +0, 1302, 0, +0, 1397, 0, +0, 1500, 0, +0, 1609, 0, +0, 1723, 0, +0, 1841, 0, +0, 1962, 0, +0, 2086, 0, +0, 2212, 0, +0, 2339, 0, +0, 2468, 0, +0, 2597, 0, +0, 2727, 0, +0, 2858, 0, +0, 2988, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1170, 820, 1278, +1161, 829, 1273, +1148, 841, 1265, +1130, 857, 1255, +1105, 877, 1240, +1070, 903, 1221, +1017, 935, 1193, +936, 975, 1153, +798, 1023, 1093, +507, 1081, 998, +0, 1148, 830, +0, 1225, 414, +0, 1310, 0, +0, 1404, 0, +0, 1506, 0, +0, 1613, 0, +0, 1726, 0, +0, 1843, 0, +0, 1964, 0, +0, 2087, 0, +0, 2213, 0, +0, 2340, 0, +0, 2468, 0, +0, 2597, 0, +0, 2727, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1343, 851, 1356, +1336, 860, 1352, +1327, 871, 1345, +1316, 886, 1337, +1299, 905, 1325, +1276, 929, 1308, +1244, 960, 1286, +1196, 998, 1253, +1123, 1044, 1206, +1004, 1099, 1134, +769, 1164, 1015, +0, 1238, 784, +0, 1321, 0, +0, 1413, 0, +0, 1513, 0, +0, 1619, 0, +0, 1731, 0, +0, 1847, 0, +0, 1967, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +1502, 890, 1444, +1498, 898, 1440, +1492, 909, 1434, +1484, 922, 1427, +1472, 940, 1418, +1457, 962, 1404, +1435, 991, 1386, +1405, 1026, 1360, +1360, 1070, 1323, +1293, 1122, 1269, +1184, 1184, 1184, +979, 1255, 1037, +327, 1335, 715, +0, 1425, 0, +0, 1522, 0, +0, 1626, 0, +0, 1736, 0, +0, 1851, 0, +0, 1970, 0, +0, 2092, 0, +0, 2216, 0, +0, 2343, 0, +0, 2470, 0, +0, 2599, 0, +0, 2728, 0, +0, 2859, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1654, 938, 1539, +1651, 945, 1536, +1647, 954, 1532, +1641, 967, 1526, +1633, 982, 1518, +1622, 1003, 1507, +1607, 1029, 1493, +1586, 1062, 1473, +1557, 1102, 1444, +1515, 1151, 1403, +1451, 1209, 1341, +1349, 1277, 1243, +1161, 1354, 1065, +641, 1440, 601, +0, 1534, 0, +0, 1636, 0, +0, 1744, 0, +0, 1857, 0, +0, 1975, 0, +0, 2096, 0, +0, 2219, 0, +0, 2345, 0, +0, 2472, 0, +0, 2600, 0, +0, 2729, 0, +0, 2859, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1801, 994, 1642, +1798, 1000, 1639, +1795, 1009, 1636, +1791, 1020, 1631, +1785, 1034, 1625, +1778, 1052, 1617, +1767, 1076, 1605, +1752, 1105, 1589, +1732, 1142, 1567, +1704, 1187, 1536, +1663, 1241, 1491, +1601, 1304, 1423, +1504, 1377, 1311, +1328, 1459, 1099, +874, 1550, 384, +0, 1649, 0, +0, 1754, 0, +0, 1865, 0, +0, 1981, 0, +0, 2100, 0, +0, 2223, 0, +0, 2347, 0, +0, 2474, 0, +0, 2602, 0, +0, 2731, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1943, 1060, 1750, +1941, 1066, 1748, +1939, 1073, 1746, +1936, 1082, 1742, +1932, 1095, 1737, +1926, 1111, 1731, +1919, 1132, 1722, +1908, 1158, 1710, +1894, 1191, 1693, +1874, 1231, 1670, +1847, 1281, 1636, +1807, 1339, 1587, +1747, 1407, 1513, +1652, 1484, 1389, +1484, 1571, 1142, +1068, 1665, 0, +0, 1767, 0, +0, 1876, 0, +0, 1989, 0, +0, 2106, 0, +0, 2227, 0, +0, 2351, 0, +0, 2477, 0, +0, 2604, 0, +0, 2732, 0, +0, 2861, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +2083, 1136, 1864, +2082, 1140, 1862, +2080, 1146, 1860, +2078, 1155, 1858, +2075, 1165, 1854, +2071, 1179, 1849, +2065, 1197, 1842, +2058, 1220, 1833, +2047, 1249, 1820, +2033, 1284, 1802, +2014, 1328, 1778, +1987, 1381, 1743, +1947, 1444, 1691, +1889, 1516, 1611, +1796, 1597, 1476, +1633, 1687, 1193, +1242, 1784, 0, +0, 1889, 0, +0, 1999, 0, +0, 2115, 0, +0, 2234, 0, +0, 2356, 0, +0, 2480, 0, +0, 2606, 0, +0, 2734, 0, +0, 2863, 0, +0, 2993, 0, +0, 3123, 0, +0, 3253, 0, +0, 3385, 0, +0, 3516, 0, +0, 3647, 0, +2221, 1220, 1982, +2220, 1224, 1981, +2218, 1229, 1979, +2217, 1236, 1977, +2214, 1245, 1974, +2211, 1257, 1970, +2207, 1272, 1965, +2202, 1291, 1958, +2195, 1316, 1948, +2185, 1347, 1935, +2171, 1386, 1917, +2151, 1433, 1891, +2124, 1489, 1854, +2086, 1554, 1800, +2028, 1629, 1716, +1937, 1713, 1571, +1778, 1806, 1253, +1403, 1906, 0, +0, 2013, 0, +0, 2125, 0, +0, 2242, 0, +0, 2362, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2357, 1313, 2103, +2356, 1316, 2102, +2355, 1321, 2101, +2354, 1326, 2099, +2352, 1334, 2097, +2350, 1343, 2094, +2347, 1356, 2090, +2343, 1372, 2085, +2338, 1393, 2078, +2330, 1419, 2068, +2320, 1452, 2054, +2307, 1493, 2035, +2288, 1543, 2009, +2261, 1601, 1971, +2222, 1669, 1915, +2165, 1747, 1826, +2076, 1834, 1673, +1919, 1929, 1323, +1556, 2031, 0, +0, 2139, 0, +0, 2253, 0, +0, 2370, 0, +0, 2491, 0, +0, 2615, 0, +0, 2741, 0, +0, 2868, 0, +0, 2996, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2492, 1414, 2227, +2491, 1416, 2226, +2491, 1420, 2225, +2490, 1424, 2224, +2489, 1430, 2222, +2487, 1438, 2220, +2485, 1448, 2217, +2482, 1461, 2213, +2478, 1479, 2208, +2472, 1501, 2200, +2465, 1528, 2190, +2455, 1563, 2176, +2442, 1606, 2157, +2423, 1657, 2130, +2396, 1718, 2091, +2358, 1788, 2033, +2301, 1868, 1942, +2213, 1957, 1782, +2058, 2053, 1403, +1703, 2157, 0, +0, 2267, 0, +0, 2381, 0, +0, 2500, 0, +0, 2621, 0, +0, 2745, 0, +0, 2871, 0, +0, 2999, 0, +0, 3128, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +2626, 1521, 2353, +2626, 1523, 2352, +2625, 1526, 2351, +2625, 1529, 2350, +2624, 1534, 2349, +2623, 1540, 2347, +2621, 1548, 2345, +2619, 1559, 2342, +2616, 1573, 2338, +2612, 1591, 2332, +2607, 1614, 2325, +2599, 1643, 2315, +2589, 1679, 2301, +2576, 1723, 2281, +2557, 1776, 2253, +2531, 1839, 2214, +2493, 1911, 2154, +2436, 1992, 2061, +2348, 2082, 1895, +2195, 2180, 1491, +1846, 2285, 0, +0, 2395, 0, +0, 2511, 0, +0, 2630, 0, +0, 2752, 0, +0, 2876, 0, +0, 3003, 0, +0, 3130, 0, +0, 3259, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +2760, 1633, 2480, +2760, 1635, 2479, +2759, 1637, 2479, +2759, 1640, 2478, +2758, 1643, 2477, +2757, 1648, 2476, +2756, 1655, 2474, +2755, 1663, 2472, +2752, 1674, 2469, +2749, 1689, 2465, +2745, 1707, 2459, +2740, 1731, 2451, +2733, 1761, 2441, +2723, 1798, 2427, +2710, 1843, 2407, +2691, 1898, 2379, +2664, 1962, 2339, +2627, 2035, 2278, +2571, 2118, 2183, +2483, 2209, 2013, +2331, 2308, 1588, +1986, 2414, 0, +0, 2525, 0, +0, 2641, 0, +0, 2760, 0, +0, 2883, 0, +0, 3007, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +2893, 1750, 2608, +2893, 1751, 2608, +2893, 1753, 2608, +2893, 1755, 2607, +2892, 1758, 2606, +2891, 1762, 2605, +2891, 1767, 2604, +2889, 1773, 2602, +2888, 1782, 2600, +2886, 1793, 2597, +2883, 1808, 2593, +2879, 1827, 2587, +2873, 1852, 2579, +2866, 1882, 2569, +2856, 1920, 2554, +2843, 1967, 2534, +2824, 2022, 2506, +2798, 2087, 2465, +2760, 2161, 2404, +2704, 2245, 2308, +2617, 2337, 2134, +2465, 2437, 1691, +2123, 2543, 0, +0, 2655, 0, +0, 2771, 0, +0, 2891, 0, +0, 3014, 0, +0, 3139, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3652, 0, +3026, 1870, 2738, +3026, 1871, 2737, +3026, 1873, 2737, +3026, 1874, 2737, +3025, 1876, 2736, +3025, 1879, 2735, +3024, 1883, 2735, +3023, 1888, 2733, +3022, 1895, 2732, +3021, 1904, 2729, +3018, 1916, 2726, +3015, 1931, 2722, +3012, 1950, 2716, +3006, 1975, 2708, +2999, 2006, 2698, +2989, 2045, 2683, +2976, 2092, 2663, +2957, 2148, 2635, +2931, 2214, 2593, +2893, 2289, 2532, +2838, 2373, 2434, +2750, 2466, 2258, +2600, 2567, 1800, +2260, 2673, 0, +0, 2786, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +3159, 1993, 2868, +3159, 1994, 2868, +3159, 1995, 2867, +3159, 1996, 2867, +3159, 1998, 2867, +3158, 2000, 2866, +3158, 2003, 2865, +3157, 2007, 2864, +3156, 2012, 2863, +3155, 2019, 2861, +3153, 2028, 2859, +3151, 2040, 2856, +3148, 2056, 2852, +3144, 2075, 2846, +3139, 2101, 2838, +3132, 2132, 2827, +3122, 2172, 2813, +3109, 2219, 2793, +3090, 2276, 2764, +3064, 2342, 2723, +3026, 2418, 2661, +2971, 2503, 2562, +2884, 2596, 2383, +2733, 2697, 1915, +2395, 2804, 0, +0, 2917, 0, +0, 3033, 0, +0, 3154, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +3292, 2119, 2998, +3292, 2119, 2998, +3292, 2120, 2998, +3292, 2121, 2998, +3291, 2122, 2997, +3291, 2124, 2997, +3291, 2126, 2997, +3290, 2129, 2996, +3290, 2133, 2995, +3289, 2138, 2994, +3287, 2145, 2992, +3286, 2155, 2989, +3284, 2167, 2986, +3281, 2182, 2982, +3277, 2202, 2976, +3272, 2228, 2968, +3264, 2260, 2958, +3255, 2299, 2943, +3241, 2347, 2923, +3222, 2405, 2894, +3196, 2471, 2852, +3159, 2548, 2790, +3103, 2633, 2691, +3017, 2727, 2510, +2866, 2828, 2033, +2530, 2935, 0, +0, 3048, 0, +0, 3165, 0, +0, 3285, 0, +0, 3409, 0, +0, 3534, 0, +0, 3661, 0, +3424, 2246, 3129, +3424, 2246, 3129, +3424, 2246, 3129, +3424, 2247, 3129, +3424, 2248, 3129, +3424, 2249, 3128, +3424, 2251, 3128, +3423, 2253, 3127, +3423, 2257, 3127, +3422, 2261, 3126, +3421, 2266, 3124, +3420, 2273, 3123, +3418, 2282, 3120, +3416, 2294, 3117, +3413, 2310, 3113, +3409, 2330, 3107, +3404, 2356, 3099, +3397, 2388, 3088, +3387, 2428, 3074, +3374, 2477, 3053, +3355, 2534, 3024, +3329, 2601, 2983, +3291, 2678, 2920, +3236, 2763, 2820, +3149, 2857, 2639, +2999, 2959, 2155, +2663, 3066, 0, +0, 3179, 0, +0, 3297, 0, +0, 3417, 0, +0, 3540, 0, +0, 3666, 0, +3557, 2374, 3260, +3557, 2374, 3260, +3557, 2374, 3260, +3557, 2375, 3260, +3556, 2376, 3260, +3556, 2377, 3260, +3556, 2378, 3259, +3556, 2380, 3259, +3555, 2382, 3259, +3555, 2385, 3258, +3554, 2389, 3257, +3553, 2395, 3255, +3552, 2402, 3254, +3551, 2411, 3251, +3548, 2423, 3248, +3546, 2439, 3244, +3542, 2459, 3238, +3536, 2485, 3230, +3529, 2518, 3220, +3519, 2558, 3205, +3506, 2607, 3184, +3487, 2664, 3155, +3461, 2732, 3114, +3424, 2808, 3051, +3368, 2894, 2950, +3282, 2989, 2768, +3132, 3090, 2279, +2797, 3198, 0, +0, 3311, 0, +0, 3428, 0, +0, 3549, 0, +0, 3672, 0, +3689, 2503, 3392, +3689, 2503, 3392, +3689, 2503, 3392, +3689, 2504, 3392, +3689, 2504, 3392, +3689, 2505, 3391, +3689, 2506, 3391, +3688, 2507, 3391, +3688, 2509, 3390, +3688, 2511, 3390, +3687, 2515, 3389, +3687, 2519, 3388, +3686, 2524, 3387, +3684, 2531, 3385, +3683, 2541, 3383, +3681, 2553, 3380, +3678, 2569, 3375, +3674, 2589, 3369, +3669, 2615, 3362, +3661, 2648, 3351, +3652, 2688, 3336, +3638, 2737, 3316, +3620, 2795, 3287, +3594, 2863, 3245, +3556, 2940, 3182, +3501, 3026, 3081, +3414, 3120, 2898, +3265, 3222, 2405, +2930, 3330, 0, +0, 3443, 0, +0, 3560, 0, +0, 3681, 0, +3821, 2633, 3524, +3821, 2633, 3523, +3821, 2633, 3523, +3821, 2633, 3523, +3821, 2634, 3523, +3821, 2634, 3523, +3821, 2635, 3523, +3821, 2636, 3523, +3821, 2637, 3522, +3820, 2639, 3522, +3820, 2642, 3521, +3819, 2645, 3521, +3819, 2649, 3520, +3818, 2654, 3518, +3817, 2661, 3517, +3815, 2671, 3514, +3813, 2683, 3511, +3810, 2699, 3507, +3806, 2720, 3501, +3801, 2746, 3493, +3794, 2779, 3482, +3784, 2819, 3468, +3770, 2868, 3447, +3752, 2926, 3418, +3726, 2994, 3376, +3688, 3071, 3313, +3633, 3157, 3212, +3547, 3252, 3029, +3397, 3353, 2532, +3063, 3461, 0, +0, 3575, 0, +0, 3692, 0, +3954, 2763, 3655, +3954, 2763, 3655, +3954, 2763, 3655, +3954, 2764, 3655, +3953, 2764, 3655, +3953, 2764, 3655, +3953, 2765, 3655, +3953, 2766, 3655, +3953, 2767, 3654, +3953, 2768, 3654, +3953, 2770, 3654, +3952, 2772, 3653, +3952, 2775, 3652, +3951, 2779, 3651, +3950, 2785, 3650, +3949, 2792, 3648, +3947, 2802, 3646, +3945, 2814, 3643, +3942, 2830, 3639, +3938, 2851, 3633, +3933, 2877, 3625, +3926, 2910, 3614, +3916, 2950, 3599, +3903, 2999, 3579, +3884, 3057, 3550, +3858, 3125, 3508, +3821, 3202, 3444, +3765, 3289, 3344, +3679, 3383, 3160, +3529, 3485, 2661, +3195, 3593, 0, +0, 3706, 0, +4086, 2894, 3787, +4086, 2894, 3787, +4086, 2894, 3787, +4086, 2894, 3787, +4086, 2895, 3787, +4086, 2895, 3787, +4086, 2895, 3787, +4085, 2896, 3787, +4085, 2897, 3786, +4085, 2898, 3786, +4085, 2899, 3786, +4085, 2901, 3786, +4084, 2903, 3785, +4084, 2906, 3784, +4083, 2910, 3783, +4082, 2916, 3782, +4081, 2923, 3780, +4079, 2933, 3778, +4077, 2945, 3775, +4074, 2961, 3770, +4071, 2982, 3765, +4065, 3008, 3757, +4058, 3041, 3746, +4048, 3081, 3731, +4035, 3130, 3710, +4016, 3189, 3681, +3990, 3257, 3639, +3953, 3334, 3576, +3898, 3420, 3475, +3811, 3515, 3291, +3662, 3617, 2790, +3328, 3725, 0, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3025, 3919, +4095, 3026, 3919, +4095, 3026, 3919, +4095, 3026, 3919, +4095, 3027, 3919, +4095, 3027, 3919, +4095, 3028, 3918, +4095, 3029, 3918, +4095, 3030, 3918, +4095, 3032, 3917, +4095, 3034, 3917, +4095, 3037, 3916, +4095, 3042, 3915, +4095, 3047, 3914, +4095, 3054, 3912, +4095, 3064, 3910, +4095, 3076, 3906, +4095, 3092, 3902, +4095, 3113, 3896, +4095, 3139, 3888, +4095, 3172, 3878, +4095, 3213, 3863, +4095, 3262, 3842, +4095, 3320, 3813, +4095, 3388, 3771, +4085, 3466, 3708, +4030, 3552, 3607, +3943, 3647, 3422, +3794, 3749, 2920, +4095, 3156, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3159, 4050, +4095, 3159, 4050, +4095, 3160, 4050, +4095, 3162, 4050, +4095, 3163, 4049, +4095, 3166, 4049, +4095, 3169, 4048, +4095, 3173, 4047, +4095, 3179, 4046, +4095, 3186, 4044, +4095, 3195, 4042, +4095, 3208, 4038, +4095, 3224, 4034, +4095, 3245, 4028, +4095, 3271, 4020, +4095, 3304, 4010, +4095, 3345, 3995, +4095, 3394, 3974, +4095, 3452, 3945, +4095, 3520, 3903, +4095, 3598, 3840, +4095, 3684, 3738, +4075, 3779, 3554, +0, 843, 1089, +0, 852, 1080, +0, 864, 1068, +0, 879, 1052, +0, 898, 1030, +0, 923, 998, +0, 954, 952, +0, 992, 882, +0, 1039, 767, +0, 1094, 545, +0, 1160, 0, +0, 1234, 0, +0, 1318, 0, +0, 1411, 0, +0, 1511, 0, +0, 1617, 0, +0, 1729, 0, +0, 1846, 0, +0, 1966, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +0, 846, 1101, +0, 855, 1093, +0, 867, 1082, +0, 881, 1066, +0, 901, 1044, +0, 925, 1013, +0, 956, 969, +0, 994, 901, +0, 1041, 792, +0, 1096, 585, +0, 1161, 0, +0, 1236, 0, +0, 1319, 0, +0, 1412, 0, +0, 1512, 0, +0, 1618, 0, +0, 1730, 0, +0, 1846, 0, +0, 1966, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +0, 850, 1117, +0, 859, 1109, +0, 870, 1098, +0, 885, 1083, +0, 904, 1063, +0, 928, 1033, +0, 959, 990, +0, 997, 926, +0, 1043, 823, +0, 1098, 634, +0, 1163, 101, +0, 1237, 0, +0, 1321, 0, +0, 1413, 0, +0, 1513, 0, +0, 1619, 0, +0, 1730, 0, +0, 1847, 0, +0, 1967, 0, +0, 2089, 0, +0, 2214, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +0, 856, 1138, +0, 864, 1130, +0, 875, 1120, +0, 890, 1106, +0, 909, 1086, +0, 933, 1058, +0, 963, 1018, +0, 1001, 957, +0, 1047, 862, +0, 1101, 692, +0, 1166, 266, +0, 1240, 0, +0, 1323, 0, +0, 1414, 0, +0, 1514, 0, +0, 1620, 0, +0, 1731, 0, +0, 1847, 0, +0, 1967, 0, +0, 2090, 0, +0, 2215, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3251, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +0, 863, 1164, +0, 871, 1157, +0, 882, 1147, +0, 897, 1134, +0, 915, 1115, +0, 939, 1089, +0, 969, 1052, +0, 1006, 996, +0, 1051, 909, +0, 1106, 759, +0, 1169, 421, +0, 1243, 0, +0, 1325, 0, +0, 1417, 0, +0, 1515, 0, +0, 1621, 0, +0, 1732, 0, +0, 1848, 0, +0, 1968, 0, +0, 2090, 0, +0, 2215, 0, +0, 2341, 0, +0, 2469, 0, +0, 2598, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3646, 0, +133, 872, 1198, +32, 880, 1191, +0, 891, 1182, +0, 905, 1169, +0, 923, 1152, +0, 947, 1128, +0, 976, 1094, +0, 1013, 1043, +0, 1057, 966, +0, 1111, 836, +0, 1174, 570, +0, 1247, 0, +0, 1329, 0, +0, 1419, 0, +0, 1518, 0, +0, 1623, 0, +0, 1734, 0, +0, 1849, 0, +0, 1968, 0, +0, 2091, 0, +0, 2215, 0, +0, 2342, 0, +0, 2470, 0, +0, 2599, 0, +0, 2728, 0, +0, 2858, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +615, 884, 1238, +582, 892, 1232, +535, 902, 1224, +462, 916, 1213, +342, 934, 1197, +107, 957, 1175, +0, 986, 1144, +0, 1021, 1100, +0, 1065, 1032, +0, 1118, 922, +0, 1180, 714, +0, 1252, 39, +0, 1333, 0, +0, 1423, 0, +0, 1521, 0, +0, 1625, 0, +0, 1735, 0, +0, 1851, 0, +0, 1970, 0, +0, 2092, 0, +0, 2216, 0, +0, 2342, 0, +0, 2470, 0, +0, 2599, 0, +0, 2728, 0, +0, 2859, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +901, 899, 1288, +883, 907, 1282, +859, 917, 1275, +825, 931, 1265, +775, 948, 1251, +698, 970, 1231, +569, 998, 1204, +307, 1033, 1165, +0, 1076, 1107, +0, 1127, 1016, +0, 1188, 855, +0, 1259, 474, +0, 1339, 0, +0, 1428, 0, +0, 1524, 0, +0, 1628, 0, +0, 1738, 0, +0, 1852, 0, +0, 1971, 0, +0, 2093, 0, +0, 2217, 0, +0, 2343, 0, +0, 2470, 0, +0, 2599, 0, +0, 2729, 0, +0, 2859, 0, +0, 2989, 0, +0, 3120, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1121, 919, 1346, +1110, 927, 1341, +1096, 937, 1335, +1076, 949, 1326, +1048, 966, 1314, +1007, 987, 1297, +947, 1014, 1274, +850, 1048, 1241, +677, 1089, 1192, +240, 1140, 1117, +0, 1199, 994, +0, 1268, 747, +0, 1347, 0, +0, 1434, 0, +0, 1530, 0, +0, 1632, 0, +0, 1741, 0, +0, 1855, 0, +0, 1973, 0, +0, 2094, 0, +0, 2218, 0, +0, 2344, 0, +0, 2471, 0, +0, 2600, 0, +0, 2729, 0, +0, 2859, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1309, 945, 1414, +1302, 952, 1410, +1293, 961, 1405, +1280, 973, 1397, +1262, 989, 1387, +1237, 1009, 1372, +1202, 1035, 1353, +1149, 1067, 1325, +1068, 1107, 1285, +930, 1156, 1225, +639, 1213, 1130, +0, 1280, 962, +0, 1357, 546, +0, 1442, 0, +0, 1536, 0, +0, 1638, 0, +0, 1745, 0, +0, 1858, 0, +0, 1976, 0, +0, 2096, 0, +0, 2220, 0, +0, 2345, 0, +0, 2472, 0, +0, 2600, 0, +0, 2729, 0, +0, 2859, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +1479, 977, 1492, +1475, 983, 1488, +1468, 992, 1484, +1460, 1003, 1477, +1448, 1018, 1469, +1431, 1037, 1457, +1408, 1061, 1441, +1376, 1092, 1418, +1328, 1130, 1385, +1255, 1176, 1338, +1136, 1231, 1266, +901, 1296, 1148, +0, 1370, 916, +0, 1453, 0, +0, 1545, 0, +0, 1645, 0, +0, 1751, 0, +0, 1863, 0, +0, 1979, 0, +0, 2099, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1638, 1016, 1579, +1635, 1022, 1576, +1630, 1030, 1572, +1624, 1041, 1567, +1616, 1054, 1559, +1604, 1072, 1550, +1589, 1094, 1537, +1567, 1123, 1518, +1537, 1158, 1492, +1492, 1202, 1455, +1425, 1254, 1401, +1316, 1316, 1316, +1111, 1387, 1169, +459, 1468, 847, +0, 1557, 0, +0, 1654, 0, +0, 1758, 0, +0, 1869, 0, +0, 1983, 0, +0, 2102, 0, +0, 2224, 0, +0, 2348, 0, +0, 2475, 0, +0, 2602, 0, +0, 2731, 0, +0, 2861, 0, +0, 2991, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1789, 1064, 1673, +1786, 1070, 1671, +1783, 1077, 1668, +1779, 1086, 1664, +1773, 1099, 1658, +1765, 1115, 1650, +1754, 1135, 1640, +1739, 1161, 1625, +1719, 1194, 1605, +1689, 1234, 1576, +1647, 1283, 1535, +1583, 1341, 1473, +1481, 1409, 1375, +1293, 1486, 1197, +773, 1572, 733, +0, 1667, 0, +0, 1768, 0, +0, 1876, 0, +0, 1989, 0, +0, 2107, 0, +0, 2228, 0, +0, 2351, 0, +0, 2477, 0, +0, 2604, 0, +0, 2732, 0, +0, 2861, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1934, 1121, 1775, +1933, 1126, 1774, +1930, 1133, 1771, +1927, 1141, 1768, +1923, 1152, 1763, +1917, 1166, 1757, +1910, 1184, 1749, +1899, 1208, 1737, +1885, 1237, 1721, +1864, 1274, 1700, +1836, 1319, 1668, +1795, 1373, 1623, +1734, 1436, 1555, +1636, 1509, 1443, +1460, 1592, 1231, +1006, 1682, 516, +0, 1781, 0, +0, 1886, 0, +0, 1997, 0, +0, 2113, 0, +0, 2232, 0, +0, 2355, 0, +0, 2479, 0, +0, 2606, 0, +0, 2734, 0, +0, 2863, 0, +0, 2992, 0, +0, 3123, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +2076, 1188, 1884, +2075, 1192, 1882, +2074, 1198, 1880, +2071, 1205, 1878, +2068, 1214, 1874, +2064, 1227, 1869, +2058, 1243, 1863, +2051, 1264, 1854, +2041, 1290, 1842, +2026, 1323, 1825, +2007, 1363, 1802, +1979, 1413, 1768, +1939, 1471, 1720, +1879, 1539, 1645, +1784, 1616, 1521, +1616, 1703, 1274, +1200, 1798, 0, +0, 1899, 0, +0, 2008, 0, +0, 2121, 0, +0, 2239, 0, +0, 2359, 0, +0, 2483, 0, +0, 2609, 0, +0, 2736, 0, +0, 2864, 0, +0, 2993, 0, +0, 3123, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2216, 1264, 1997, +2215, 1268, 1996, +2214, 1272, 1995, +2212, 1279, 1992, +2210, 1287, 1990, +2207, 1297, 1986, +2203, 1311, 1981, +2197, 1329, 1974, +2190, 1352, 1965, +2179, 1381, 1952, +2165, 1417, 1935, +2146, 1461, 1910, +2119, 1513, 1875, +2079, 1576, 1823, +2021, 1648, 1743, +1928, 1729, 1608, +1765, 1819, 1325, +1374, 1916, 0, +0, 2021, 0, +0, 2132, 0, +0, 2247, 0, +0, 2366, 0, +0, 2488, 0, +0, 2612, 0, +0, 2739, 0, +0, 2866, 0, +0, 2995, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2353, 1349, 2115, +2353, 1352, 2114, +2352, 1356, 2113, +2350, 1361, 2111, +2349, 1368, 2109, +2347, 1377, 2106, +2344, 1389, 2102, +2340, 1404, 2097, +2334, 1423, 2090, +2327, 1448, 2080, +2317, 1479, 2067, +2303, 1518, 2049, +2284, 1565, 2023, +2257, 1621, 1987, +2218, 1686, 1932, +2160, 1761, 1848, +2069, 1846, 1703, +1910, 1938, 1386, +1535, 2039, 0, +0, 2145, 0, +0, 2257, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2489, 1443, 2236, +2489, 1445, 2235, +2488, 1449, 2234, +2487, 1453, 2233, +2486, 1458, 2231, +2484, 1466, 2229, +2482, 1475, 2226, +2479, 1488, 2222, +2475, 1504, 2217, +2470, 1525, 2210, +2462, 1551, 2200, +2452, 1584, 2186, +2439, 1625, 2167, +2420, 1675, 2141, +2393, 1733, 2103, +2355, 1802, 2047, +2297, 1879, 1958, +2208, 1966, 1805, +2051, 2061, 1456, +1688, 2163, 0, +0, 2271, 0, +0, 2385, 0, +0, 2502, 0, +0, 2623, 0, +0, 2747, 0, +0, 2873, 0, +0, 3000, 0, +0, 3128, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2624, 1544, 2359, +2624, 1546, 2359, +2624, 1549, 2358, +2623, 1552, 2357, +2622, 1556, 2356, +2621, 1562, 2354, +2619, 1570, 2352, +2617, 1580, 2349, +2614, 1593, 2345, +2610, 1611, 2340, +2605, 1633, 2332, +2597, 1661, 2322, +2587, 1695, 2308, +2574, 1738, 2289, +2555, 1789, 2262, +2528, 1850, 2223, +2490, 1921, 2165, +2433, 2000, 2074, +2345, 2089, 1914, +2190, 2186, 1535, +1835, 2289, 0, +0, 2399, 0, +0, 2513, 0, +0, 2632, 0, +0, 2753, 0, +0, 2877, 0, +0, 3004, 0, +0, 3131, 0, +0, 3260, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +2759, 1651, 2485, +2758, 1653, 2485, +2758, 1655, 2484, +2758, 1658, 2483, +2757, 1661, 2482, +2756, 1666, 2481, +2755, 1672, 2480, +2753, 1680, 2477, +2751, 1691, 2474, +2748, 1705, 2470, +2744, 1723, 2465, +2739, 1746, 2457, +2731, 1775, 2447, +2721, 1811, 2433, +2708, 1855, 2413, +2689, 1908, 2385, +2663, 1971, 2346, +2625, 2043, 2287, +2568, 2124, 2193, +2480, 2214, 2027, +2327, 2312, 1623, +1978, 2417, 0, +0, 2527, 0, +0, 2643, 0, +0, 2762, 0, +0, 2884, 0, +0, 3008, 0, +0, 3135, 0, +0, 3262, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +2892, 1764, 2612, +2892, 1765, 2612, +2892, 1767, 2612, +2892, 1769, 2611, +2891, 1772, 2610, +2890, 1775, 2609, +2889, 1780, 2608, +2888, 1787, 2606, +2887, 1795, 2604, +2884, 1806, 2601, +2882, 1821, 2597, +2878, 1839, 2591, +2872, 1863, 2584, +2865, 1893, 2573, +2855, 1930, 2559, +2842, 1976, 2539, +2823, 2030, 2511, +2797, 2094, 2471, +2759, 2167, 2411, +2703, 2250, 2315, +2615, 2341, 2145, +2463, 2440, 1720, +2118, 2546, 0, +0, 2657, 0, +0, 2773, 0, +0, 2892, 0, +0, 3015, 0, +0, 3140, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3653, 0, +3026, 1881, 2741, +3026, 1882, 2740, +3025, 1883, 2740, +3025, 1885, 2740, +3025, 1887, 2739, +3024, 1890, 2738, +3024, 1894, 2737, +3023, 1899, 2736, +3021, 1905, 2734, +3020, 1914, 2732, +3018, 1926, 2729, +3015, 1940, 2725, +3011, 1960, 2719, +3005, 1984, 2712, +2998, 2015, 2701, +2988, 2053, 2687, +2975, 2099, 2667, +2956, 2154, 2638, +2930, 2219, 2598, +2892, 2294, 2537, +2836, 2377, 2440, +2749, 2469, 2266, +2598, 2569, 1823, +2256, 2675, 0, +0, 2787, 0, +0, 2903, 0, +0, 3023, 0, +0, 3146, 0, +0, 3271, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +3159, 2002, 2870, +3159, 2002, 2870, +3158, 2003, 2870, +3158, 2005, 2869, +3158, 2006, 2869, +3158, 2008, 2868, +3157, 2011, 2868, +3156, 2015, 2867, +3156, 2020, 2865, +3154, 2027, 2864, +3153, 2036, 2861, +3151, 2048, 2858, +3148, 2063, 2854, +3144, 2082, 2848, +3138, 2107, 2840, +3131, 2139, 2830, +3121, 2177, 2815, +3108, 2224, 2795, +3089, 2280, 2767, +3063, 2346, 2726, +3025, 2421, 2664, +2970, 2506, 2566, +2883, 2598, 2390, +2732, 2699, 1933, +2392, 2805, 0, +0, 2918, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3403, 0, +0, 3529, 0, +0, 3658, 0, +3291, 2125, 3000, +3291, 2125, 3000, +3291, 2126, 3000, +3291, 2127, 2999, +3291, 2128, 2999, +3291, 2130, 2999, +3290, 2132, 2998, +3290, 2135, 2997, +3289, 2139, 2996, +3288, 2145, 2995, +3287, 2151, 2993, +3285, 2161, 2991, +3283, 2172, 2988, +3280, 2188, 2984, +3276, 2208, 2978, +3271, 2233, 2970, +3264, 2264, 2960, +3254, 2304, 2945, +3241, 2351, 2925, +3222, 2408, 2896, +3196, 2474, 2855, +3158, 2550, 2793, +3103, 2635, 2694, +3016, 2728, 2515, +2865, 2829, 2047, +2527, 2936, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3534, 0, +0, 3661, 0, +3424, 2250, 3130, +3424, 2251, 3130, +3424, 2251, 3130, +3424, 2252, 3130, +3424, 2253, 3130, +3423, 2254, 3130, +3423, 2256, 3129, +3423, 2258, 3129, +3422, 2261, 3128, +3422, 2265, 3127, +3421, 2271, 3126, +3420, 2278, 3124, +3418, 2287, 3122, +3416, 2299, 3118, +3413, 2314, 3114, +3409, 2334, 3108, +3404, 2360, 3101, +3396, 2392, 3090, +3387, 2431, 3075, +3373, 2479, 3055, +3355, 2537, 3026, +3328, 2603, 2984, +3291, 2680, 2922, +3235, 2765, 2823, +3149, 2859, 2643, +2999, 2960, 2165, +2662, 3067, 0, +0, 3180, 0, +0, 3297, 0, +0, 3418, 0, +0, 3541, 0, +0, 3666, 0, +3557, 2377, 3261, +3557, 2378, 3261, +3556, 2378, 3261, +3556, 2379, 3261, +3556, 2379, 3261, +3556, 2380, 3261, +3556, 2382, 3260, +3556, 2383, 3260, +3555, 2386, 3259, +3555, 2389, 3259, +3554, 2393, 3258, +3553, 2398, 3256, +3552, 2405, 3255, +3550, 2414, 3252, +3548, 2427, 3249, +3545, 2442, 3245, +3541, 2462, 3239, +3536, 2488, 3231, +3529, 2520, 3221, +3519, 2560, 3206, +3506, 2609, 3185, +3487, 2666, 3157, +3461, 2733, 3115, +3423, 2810, 3052, +3368, 2896, 2952, +3281, 2989, 2771, +3131, 3091, 2287, +2795, 3198, 0, +0, 3311, 0, +0, 3429, 0, +0, 3549, 0, +0, 3673, 0, +3689, 2506, 3393, +3689, 2506, 3393, +3689, 2506, 3392, +3689, 2506, 3392, +3689, 2507, 3392, +3689, 2508, 3392, +3688, 2509, 3392, +3688, 2510, 3392, +3688, 2512, 3391, +3688, 2514, 3391, +3687, 2517, 3390, +3686, 2521, 3389, +3686, 2527, 3388, +3684, 2534, 3386, +3683, 2543, 3383, +3681, 2555, 3380, +3678, 2571, 3376, +3674, 2592, 3370, +3668, 2617, 3362, +3661, 2650, 3352, +3651, 2690, 3337, +3638, 2739, 3316, +3619, 2796, 3287, +3593, 2864, 3246, +3556, 2941, 3183, +3500, 3026, 3083, +3414, 3121, 2900, +3264, 3222, 2411, +2929, 3330, 0, +0, 3443, 0, +0, 3560, 0, +0, 3681, 0, +3821, 2635, 3524, +3821, 2635, 3524, +3821, 2635, 3524, +3821, 2635, 3524, +3821, 2636, 3524, +3821, 2636, 3524, +3821, 2637, 3523, +3821, 2638, 3523, +3821, 2639, 3523, +3820, 2641, 3523, +3820, 2644, 3522, +3819, 2647, 3521, +3819, 2651, 3520, +3818, 2656, 3519, +3817, 2663, 3517, +3815, 2673, 3515, +3813, 2685, 3512, +3810, 2701, 3507, +3806, 2721, 3502, +3801, 2747, 3494, +3794, 2780, 3483, +3784, 2820, 3468, +3770, 2869, 3448, +3752, 2927, 3419, +3726, 2995, 3377, +3688, 3072, 3314, +3633, 3158, 3213, +3546, 3252, 3030, +3397, 3354, 2537, +3062, 3462, 0, +0, 3575, 0, +0, 3692, 0, +3953, 2765, 3656, +3953, 2765, 3656, +3953, 2765, 3656, +3953, 2765, 3656, +3953, 2765, 3655, +3953, 2766, 3655, +3953, 2766, 3655, +3953, 2767, 3655, +3953, 2768, 3655, +3953, 2770, 3655, +3952, 2771, 3654, +3952, 2774, 3654, +3952, 2777, 3653, +3951, 2781, 3652, +3950, 2786, 3651, +3949, 2793, 3649, +3947, 2803, 3646, +3945, 2815, 3643, +3942, 2831, 3639, +3938, 2852, 3633, +3933, 2878, 3625, +3926, 2911, 3615, +3916, 2951, 3600, +3903, 3000, 3579, +3884, 3058, 3550, +3858, 3126, 3508, +3821, 3203, 3445, +3765, 3289, 3344, +3679, 3384, 3161, +3529, 3485, 2664, +3195, 3593, 0, +0, 3707, 0, +4086, 2895, 3787, +4086, 2895, 3787, +4086, 2895, 3787, +4086, 2896, 3787, +4086, 2896, 3787, +4086, 2896, 3787, +4086, 2896, 3787, +4085, 2897, 3787, +4085, 2898, 3787, +4085, 2899, 3787, +4085, 2900, 3786, +4085, 2902, 3786, +4084, 2904, 3785, +4084, 2907, 3785, +4083, 2911, 3784, +4082, 2917, 3782, +4081, 2924, 3780, +4079, 2934, 3778, +4077, 2946, 3775, +4074, 2962, 3771, +4070, 2983, 3765, +4065, 3009, 3757, +4058, 3042, 3746, +4048, 3082, 3731, +4035, 3131, 3711, +4016, 3189, 3682, +3990, 3257, 3640, +3953, 3334, 3577, +3897, 3421, 3476, +3811, 3515, 3292, +3662, 3617, 2793, +3327, 3725, 0, +4095, 3026, 3919, +4095, 3026, 3919, +4095, 3026, 3919, +4095, 3026, 3919, +4095, 3026, 3919, +4095, 3027, 3919, +4095, 3027, 3919, +4095, 3027, 3919, +4095, 3028, 3919, +4095, 3029, 3919, +4095, 3030, 3918, +4095, 3031, 3918, +4095, 3033, 3918, +4095, 3035, 3917, +4095, 3038, 3916, +4095, 3042, 3915, +4095, 3048, 3914, +4095, 3055, 3912, +4095, 3065, 3910, +4095, 3077, 3907, +4095, 3093, 3902, +4095, 3114, 3897, +4095, 3140, 3889, +4095, 3173, 3878, +4095, 3213, 3863, +4095, 3263, 3843, +4095, 3321, 3813, +4095, 3389, 3771, +4085, 3466, 3708, +4030, 3552, 3607, +3943, 3647, 3423, +3794, 3749, 2922, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3157, 4051, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3159, 4051, +4095, 3159, 4051, +4095, 3160, 4050, +4095, 3161, 4050, +4095, 3162, 4050, +4095, 3164, 4049, +4095, 3166, 4049, +4095, 3170, 4048, +4095, 3174, 4047, +4095, 3179, 4046, +4095, 3186, 4044, +4095, 3196, 4042, +4095, 3208, 4039, +4095, 3224, 4034, +4095, 3245, 4028, +4095, 3271, 4021, +4095, 3304, 4010, +4095, 3345, 3995, +4095, 3394, 3974, +4095, 3453, 3945, +4095, 3520, 3903, +4095, 3598, 3840, +4095, 3684, 3739, +4075, 3779, 3555, +0, 966, 1218, +0, 973, 1211, +0, 982, 1202, +0, 994, 1191, +0, 1009, 1174, +0, 1028, 1151, +0, 1053, 1119, +0, 1084, 1071, +0, 1122, 999, +0, 1169, 879, +0, 1225, 645, +0, 1291, 0, +0, 1366, 0, +0, 1450, 0, +0, 1542, 0, +0, 1643, 0, +0, 1749, 0, +0, 1861, 0, +0, 1978, 0, +0, 2098, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3383, 0, +0, 3515, 0, +0, 3647, 0, +0, 969, 1227, +0, 975, 1221, +0, 984, 1212, +0, 996, 1201, +0, 1011, 1185, +0, 1030, 1162, +0, 1055, 1130, +0, 1086, 1084, +0, 1124, 1014, +0, 1171, 899, +0, 1226, 677, +0, 1292, 0, +0, 1367, 0, +0, 1451, 0, +0, 1543, 0, +0, 1643, 0, +0, 1750, 0, +0, 1862, 0, +0, 1978, 0, +0, 2098, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +0, 972, 1239, +0, 978, 1233, +0, 987, 1225, +0, 999, 1214, +0, 1014, 1198, +0, 1033, 1176, +0, 1057, 1146, +0, 1088, 1101, +0, 1126, 1033, +0, 1173, 924, +0, 1228, 717, +0, 1293, 53, +0, 1368, 0, +0, 1452, 0, +0, 1544, 0, +0, 1644, 0, +0, 1750, 0, +0, 1862, 0, +0, 1978, 0, +0, 2098, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +0, 976, 1255, +0, 982, 1249, +0, 991, 1241, +0, 1002, 1230, +0, 1017, 1215, +0, 1036, 1195, +0, 1061, 1165, +0, 1091, 1122, +0, 1129, 1058, +0, 1175, 955, +0, 1231, 766, +0, 1295, 233, +0, 1370, 0, +0, 1453, 0, +0, 1545, 0, +0, 1645, 0, +0, 1751, 0, +0, 1863, 0, +0, 1979, 0, +0, 2099, 0, +0, 2221, 0, +0, 2346, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +0, 981, 1276, +0, 988, 1270, +0, 996, 1263, +0, 1008, 1252, +0, 1022, 1238, +0, 1041, 1218, +0, 1065, 1190, +0, 1095, 1150, +0, 1133, 1090, +0, 1179, 994, +0, 1234, 824, +0, 1298, 398, +0, 1372, 0, +0, 1455, 0, +0, 1547, 0, +0, 1646, 0, +0, 1752, 0, +0, 1863, 0, +0, 1979, 0, +0, 2099, 0, +0, 2222, 0, +0, 2347, 0, +0, 2473, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +0, 988, 1302, +0, 995, 1297, +0, 1003, 1289, +0, 1014, 1280, +0, 1029, 1266, +0, 1047, 1247, +0, 1071, 1221, +0, 1101, 1184, +0, 1138, 1128, +0, 1183, 1041, +0, 1238, 891, +0, 1301, 553, +0, 1375, 0, +0, 1457, 0, +0, 1549, 0, +0, 1648, 0, +0, 1753, 0, +0, 1864, 0, +0, 1980, 0, +0, 2100, 0, +0, 2222, 0, +0, 2347, 0, +0, 2474, 0, +0, 2601, 0, +0, 2730, 0, +0, 2860, 0, +0, 2990, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +329, 998, 1335, +265, 1004, 1330, +164, 1012, 1323, +0, 1023, 1314, +0, 1037, 1301, +0, 1055, 1284, +0, 1079, 1260, +0, 1108, 1226, +0, 1145, 1175, +0, 1189, 1098, +0, 1243, 968, +0, 1306, 702, +0, 1379, 0, +0, 1461, 0, +0, 1551, 0, +0, 1650, 0, +0, 1755, 0, +0, 1866, 0, +0, 1981, 0, +0, 2101, 0, +0, 2223, 0, +0, 2347, 0, +0, 2474, 0, +0, 2602, 0, +0, 2731, 0, +0, 2860, 0, +0, 2991, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +770, 1010, 1375, +747, 1016, 1370, +715, 1024, 1364, +667, 1035, 1356, +594, 1048, 1345, +474, 1066, 1329, +239, 1089, 1307, +0, 1118, 1276, +0, 1154, 1232, +0, 1197, 1164, +0, 1250, 1054, +0, 1312, 846, +0, 1384, 171, +0, 1465, 0, +0, 1555, 0, +0, 1653, 0, +0, 1757, 0, +0, 1868, 0, +0, 1983, 0, +0, 2102, 0, +0, 2224, 0, +0, 2348, 0, +0, 2474, 0, +0, 2602, 0, +0, 2731, 0, +0, 2860, 0, +0, 2991, 0, +0, 3121, 0, +0, 3252, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1045, 1025, 1424, +1033, 1031, 1420, +1016, 1039, 1414, +992, 1049, 1407, +957, 1063, 1397, +907, 1080, 1383, +830, 1102, 1364, +702, 1130, 1336, +440, 1165, 1297, +0, 1208, 1239, +0, 1260, 1148, +0, 1321, 987, +0, 1391, 606, +0, 1471, 0, +0, 1560, 0, +0, 1657, 0, +0, 1760, 0, +0, 1870, 0, +0, 1985, 0, +0, 2103, 0, +0, 2225, 0, +0, 2349, 0, +0, 2475, 0, +0, 2603, 0, +0, 2731, 0, +0, 2861, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1261, 1046, 1482, +1253, 1051, 1478, +1242, 1059, 1473, +1228, 1069, 1467, +1208, 1082, 1458, +1180, 1098, 1446, +1139, 1119, 1429, +1079, 1146, 1406, +982, 1180, 1373, +810, 1222, 1324, +372, 1272, 1249, +0, 1331, 1126, +0, 1400, 879, +0, 1479, 0, +0, 1566, 0, +0, 1662, 0, +0, 1764, 0, +0, 1873, 0, +0, 1987, 0, +0, 2105, 0, +0, 2226, 0, +0, 2350, 0, +0, 2476, 0, +0, 2603, 0, +0, 2732, 0, +0, 2861, 0, +0, 2991, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1446, 1072, 1550, +1441, 1077, 1546, +1434, 1084, 1542, +1425, 1093, 1537, +1412, 1105, 1529, +1394, 1121, 1519, +1370, 1141, 1505, +1334, 1167, 1485, +1282, 1199, 1457, +1200, 1239, 1417, +1063, 1288, 1357, +771, 1345, 1263, +0, 1412, 1094, +0, 1489, 678, +0, 1575, 0, +0, 1668, 0, +0, 1770, 0, +0, 1877, 0, +0, 1990, 0, +0, 2108, 0, +0, 2228, 0, +0, 2352, 0, +0, 2477, 0, +0, 2604, 0, +0, 2732, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3515, 0, +0, 3647, 0, +1615, 1104, 1627, +1611, 1109, 1624, +1607, 1115, 1621, +1600, 1124, 1616, +1592, 1135, 1609, +1580, 1150, 1601, +1563, 1169, 1589, +1540, 1193, 1573, +1508, 1224, 1550, +1460, 1262, 1518, +1388, 1308, 1470, +1268, 1363, 1398, +1033, 1428, 1280, +0, 1502, 1048, +0, 1585, 57, +0, 1677, 0, +0, 1777, 0, +0, 1883, 0, +0, 1995, 0, +0, 2111, 0, +0, 2231, 0, +0, 2354, 0, +0, 2479, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +1772, 1144, 1713, +1770, 1148, 1711, +1767, 1154, 1708, +1762, 1162, 1704, +1756, 1173, 1699, +1748, 1186, 1692, +1737, 1204, 1682, +1721, 1226, 1669, +1699, 1255, 1650, +1669, 1290, 1624, +1624, 1334, 1588, +1557, 1386, 1533, +1448, 1448, 1448, +1243, 1519, 1301, +591, 1600, 979, +0, 1689, 0, +0, 1786, 0, +0, 1891, 0, +0, 2001, 0, +0, 2116, 0, +0, 2234, 0, +0, 2356, 0, +0, 2481, 0, +0, 2607, 0, +0, 2734, 0, +0, 2863, 0, +0, 2993, 0, +0, 3123, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3647, 0, +1923, 1192, 1807, +1921, 1196, 1805, +1919, 1202, 1803, +1915, 1209, 1800, +1911, 1218, 1796, +1905, 1231, 1790, +1897, 1247, 1782, +1886, 1267, 1772, +1871, 1293, 1757, +1851, 1326, 1737, +1821, 1366, 1708, +1779, 1415, 1667, +1715, 1473, 1605, +1613, 1541, 1507, +1426, 1618, 1329, +905, 1704, 865, +0, 1799, 0, +0, 1900, 0, +0, 2008, 0, +0, 2122, 0, +0, 2239, 0, +0, 2360, 0, +0, 2483, 0, +0, 2609, 0, +0, 2736, 0, +0, 2864, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2068, 1250, 1909, +2067, 1253, 1908, +2065, 1258, 1906, +2063, 1265, 1903, +2059, 1273, 1900, +2055, 1284, 1895, +2049, 1298, 1889, +2042, 1317, 1881, +2031, 1340, 1869, +2017, 1370, 1854, +1997, 1406, 1832, +1968, 1451, 1801, +1927, 1505, 1755, +1866, 1569, 1687, +1768, 1641, 1575, +1592, 1724, 1364, +1138, 1815, 648, +0, 1913, 0, +0, 2018, 0, +0, 2129, 0, +0, 2245, 0, +0, 2364, 0, +0, 2487, 0, +0, 2612, 0, +0, 2738, 0, +0, 2866, 0, +0, 2995, 0, +0, 3124, 0, +0, 3255, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +2210, 1317, 2017, +2209, 1320, 2016, +2207, 1324, 2014, +2206, 1330, 2012, +2203, 1337, 2010, +2200, 1347, 2006, +2196, 1359, 2001, +2191, 1375, 1995, +2183, 1396, 1986, +2173, 1422, 1974, +2158, 1455, 1957, +2139, 1496, 1934, +2111, 1545, 1900, +2071, 1603, 1852, +2011, 1671, 1777, +1916, 1749, 1653, +1748, 1835, 1406, +1333, 1930, 0, +0, 2032, 0, +0, 2140, 0, +0, 2253, 0, +0, 2371, 0, +0, 2492, 0, +0, 2615, 0, +0, 2741, 0, +0, 2868, 0, +0, 2996, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2349, 1394, 2130, +2348, 1396, 2129, +2347, 1400, 2128, +2346, 1404, 2127, +2344, 1411, 2125, +2342, 1419, 2122, +2339, 1429, 2118, +2335, 1443, 2113, +2329, 1461, 2106, +2322, 1484, 2097, +2312, 1513, 2084, +2298, 1549, 2067, +2278, 1593, 2042, +2251, 1646, 2007, +2211, 1708, 1955, +2153, 1780, 1875, +2061, 1861, 1740, +1898, 1951, 1457, +1507, 2049, 0, +0, 2153, 0, +0, 2264, 0, +0, 2379, 0, +0, 2498, 0, +0, 2620, 0, +0, 2744, 0, +0, 2871, 0, +0, 2998, 0, +0, 3127, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +2486, 1479, 2248, +2485, 1482, 2247, +2485, 1484, 2246, +2484, 1488, 2245, +2483, 1493, 2243, +2481, 1500, 2241, +2479, 1509, 2238, +2476, 1521, 2234, +2472, 1536, 2229, +2466, 1555, 2222, +2459, 1580, 2213, +2449, 1611, 2199, +2435, 1650, 2181, +2416, 1697, 2155, +2389, 1753, 2119, +2350, 1818, 2064, +2292, 1893, 1980, +2201, 1978, 1835, +2042, 2070, 1518, +1668, 2171, 0, +0, 2277, 0, +0, 2389, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +2622, 1573, 2368, +2621, 1575, 2368, +2621, 1578, 2367, +2620, 1581, 2366, +2619, 1585, 2365, +2618, 1590, 2363, +2616, 1598, 2361, +2614, 1607, 2358, +2611, 1620, 2354, +2607, 1636, 2349, +2602, 1657, 2342, +2595, 1683, 2332, +2585, 1716, 2318, +2571, 1757, 2299, +2552, 1807, 2273, +2525, 1865, 2235, +2487, 1934, 2179, +2430, 2011, 2091, +2340, 2098, 1937, +2183, 2193, 1588, +1820, 2295, 0, +0, 2403, 0, +0, 2517, 0, +0, 2634, 0, +0, 2755, 0, +0, 2879, 0, +0, 3005, 0, +0, 3132, 0, +0, 3260, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2757, 1675, 2492, +2756, 1676, 2491, +2756, 1678, 2491, +2756, 1681, 2490, +2755, 1684, 2489, +2754, 1688, 2488, +2753, 1694, 2486, +2751, 1702, 2484, +2749, 1712, 2481, +2746, 1726, 2477, +2742, 1743, 2472, +2737, 1765, 2464, +2729, 1793, 2454, +2719, 1827, 2440, +2706, 1870, 2421, +2687, 1922, 2394, +2660, 1982, 2355, +2622, 2053, 2297, +2566, 2132, 2206, +2477, 2221, 2046, +2322, 2318, 1667, +1967, 2421, 0, +0, 2531, 0, +0, 2645, 0, +0, 2764, 0, +0, 2885, 0, +0, 3010, 0, +0, 3136, 0, +0, 3263, 0, +0, 3392, 0, +0, 3521, 0, +0, 3651, 0, +2891, 1782, 2617, +2891, 1784, 2617, +2890, 1785, 2617, +2890, 1787, 2616, +2890, 1790, 2615, +2889, 1793, 2615, +2888, 1798, 2613, +2887, 1804, 2612, +2885, 1812, 2609, +2883, 1823, 2606, +2880, 1837, 2602, +2876, 1855, 2597, +2871, 1878, 2589, +2863, 1907, 2579, +2854, 1943, 2565, +2840, 1987, 2545, +2821, 2040, 2518, +2795, 2103, 2478, +2757, 2175, 2419, +2701, 2256, 2325, +2612, 2346, 2159, +2459, 2444, 1755, +2110, 2549, 0, +0, 2659, 0, +0, 2775, 0, +0, 2894, 0, +0, 3016, 0, +0, 3140, 0, +0, 3267, 0, +0, 3395, 0, +0, 3523, 0, +0, 3653, 0, +3025, 1895, 2745, +3024, 1896, 2744, +3024, 1897, 2744, +3024, 1899, 2744, +3024, 1901, 2743, +3023, 1904, 2742, +3022, 1908, 2741, +3022, 1912, 2740, +3020, 1919, 2738, +3019, 1927, 2736, +3017, 1938, 2733, +3014, 1953, 2729, +3010, 1971, 2723, +3004, 1995, 2716, +2997, 2025, 2705, +2987, 2062, 2691, +2974, 2108, 2671, +2955, 2162, 2643, +2929, 2226, 2603, +2891, 2299, 2543, +2835, 2382, 2447, +2747, 2473, 2277, +2595, 2572, 1852, +2250, 2678, 0, +0, 2789, 0, +0, 2905, 0, +0, 3024, 0, +0, 3147, 0, +0, 3272, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +3158, 2013, 2873, +3158, 2013, 2873, +3158, 2014, 2872, +3157, 2015, 2872, +3157, 2017, 2872, +3157, 2019, 2871, +3156, 2022, 2871, +3156, 2026, 2870, +3155, 2031, 2868, +3154, 2038, 2867, +3152, 2046, 2864, +3150, 2058, 2861, +3147, 2073, 2857, +3143, 2092, 2851, +3138, 2116, 2844, +3130, 2147, 2833, +3120, 2185, 2819, +3107, 2231, 2799, +3088, 2286, 2770, +3062, 2351, 2730, +3024, 2426, 2669, +2968, 2509, 2572, +2881, 2601, 2398, +2730, 2701, 1955, +2388, 2807, 0, +0, 2919, 0, +0, 3035, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +3291, 2133, 3002, +3291, 2134, 3002, +3291, 2135, 3002, +3291, 2135, 3002, +3290, 2137, 3001, +3290, 2138, 3001, +3290, 2141, 3000, +3289, 2143, 3000, +3288, 2147, 2999, +3288, 2153, 2997, +3286, 2159, 2996, +3285, 2168, 2993, +3283, 2180, 2990, +3280, 2195, 2986, +3276, 2215, 2980, +3270, 2239, 2973, +3263, 2271, 2962, +3253, 2309, 2947, +3240, 2356, 2927, +3221, 2412, 2899, +3195, 2478, 2858, +3157, 2553, 2796, +3102, 2638, 2698, +3015, 2730, 2522, +2864, 2831, 2065, +2524, 2938, 0, +0, 3050, 0, +0, 3166, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +3424, 2257, 3132, +3424, 2257, 3132, +3423, 2258, 3132, +3423, 2258, 3132, +3423, 2259, 3132, +3423, 2261, 3131, +3423, 2262, 3131, +3422, 2264, 3130, +3422, 2267, 3130, +3421, 2271, 3129, +3420, 2277, 3127, +3419, 2284, 3126, +3417, 2293, 3123, +3415, 2304, 3120, +3412, 2320, 3116, +3408, 2340, 3110, +3403, 2365, 3102, +3396, 2397, 3092, +3386, 2436, 3077, +3373, 2483, 3057, +3354, 2540, 3028, +3328, 2606, 2987, +3290, 2682, 2925, +3235, 2767, 2826, +3148, 2860, 2647, +2997, 2961, 2179, +2659, 3068, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3666, 0, +3556, 2382, 3263, +3556, 2382, 3263, +3556, 2383, 3262, +3556, 2383, 3262, +3556, 2384, 3262, +3556, 2385, 3262, +3556, 2386, 3262, +3555, 2388, 3261, +3555, 2390, 3261, +3554, 2393, 3260, +3554, 2397, 3259, +3553, 2403, 3258, +3552, 2410, 3256, +3550, 2419, 3254, +3548, 2431, 3250, +3545, 2446, 3246, +3541, 2466, 3240, +3536, 2492, 3233, +3529, 2524, 3222, +3519, 2564, 3207, +3505, 2612, 3187, +3487, 2669, 3158, +3461, 2736, 3117, +3423, 2812, 3054, +3368, 2897, 2955, +3281, 2991, 2775, +3131, 3092, 2297, +2794, 3199, 0, +0, 3312, 0, +0, 3429, 0, +0, 3550, 0, +0, 3673, 0, +3689, 2509, 3394, +3689, 2509, 3393, +3689, 2510, 3393, +3689, 2510, 3393, +3688, 2511, 3393, +3688, 2511, 3393, +3688, 2512, 3393, +3688, 2514, 3392, +3688, 2515, 3392, +3687, 2518, 3392, +3687, 2521, 3391, +3686, 2525, 3390, +3685, 2530, 3389, +3684, 2537, 3387, +3682, 2546, 3384, +3680, 2559, 3381, +3677, 2574, 3377, +3673, 2595, 3371, +3668, 2620, 3363, +3661, 2653, 3353, +3651, 2692, 3338, +3638, 2741, 3318, +3619, 2798, 3289, +3593, 2865, 3247, +3556, 2942, 3184, +3500, 3028, 3084, +3413, 3122, 2903, +3264, 3223, 2419, +2928, 3331, 0, +0, 3443, 0, +0, 3561, 0, +0, 3681, 0, +3821, 2637, 3525, +3821, 2638, 3525, +3821, 2638, 3525, +3821, 2638, 3525, +3821, 2639, 3524, +3821, 2639, 3524, +3821, 2640, 3524, +3821, 2641, 3524, +3820, 2642, 3524, +3820, 2644, 3523, +3820, 2646, 3523, +3819, 2649, 3522, +3818, 2653, 3521, +3818, 2659, 3520, +3816, 2666, 3518, +3815, 2675, 3516, +3813, 2687, 3512, +3810, 2703, 3508, +3806, 2724, 3502, +3801, 2750, 3494, +3793, 2782, 3484, +3784, 2822, 3469, +3770, 2871, 3448, +3752, 2929, 3420, +3725, 2996, 3378, +3688, 3073, 3315, +3633, 3159, 3215, +3546, 3253, 3032, +3396, 3354, 2543, +3061, 3462, 0, +0, 3575, 0, +0, 3692, 0, +3953, 2767, 3656, +3953, 2767, 3656, +3953, 2767, 3656, +3953, 2767, 3656, +3953, 2768, 3656, +3953, 2768, 3656, +3953, 2769, 3656, +3953, 2769, 3656, +3953, 2770, 3655, +3953, 2772, 3655, +3952, 2773, 3655, +3952, 2776, 3654, +3951, 2779, 3653, +3951, 2783, 3652, +3950, 2788, 3651, +3949, 2795, 3649, +3947, 2805, 3647, +3945, 2817, 3644, +3942, 2833, 3639, +3938, 2854, 3634, +3933, 2880, 3626, +3926, 2912, 3615, +3916, 2952, 3600, +3902, 3001, 3580, +3884, 3059, 3551, +3858, 3127, 3509, +3820, 3204, 3446, +3765, 3290, 3345, +3678, 3384, 3162, +3529, 3486, 2669, +3194, 3594, 0, +0, 3707, 0, +4086, 2897, 3788, +4086, 2897, 3788, +4086, 2897, 3788, +4086, 2897, 3788, +4086, 2897, 3788, +4085, 2898, 3788, +4085, 2898, 3787, +4085, 2899, 3787, +4085, 2899, 3787, +4085, 2900, 3787, +4085, 2902, 3787, +4085, 2903, 3786, +4084, 2906, 3786, +4084, 2909, 3785, +4083, 2913, 3784, +4082, 2918, 3783, +4081, 2926, 3781, +4079, 2935, 3779, +4077, 2947, 3775, +4074, 2963, 3771, +4070, 2984, 3765, +4065, 3010, 3757, +4058, 3043, 3747, +4048, 3083, 3732, +4035, 3132, 3711, +4016, 3190, 3682, +3990, 3258, 3640, +3953, 3335, 3577, +3897, 3421, 3476, +3811, 3516, 3293, +3661, 3617, 2796, +3327, 3725, 0, +4095, 3027, 3919, +4095, 3027, 3919, +4095, 3027, 3919, +4095, 3027, 3919, +4095, 3028, 3919, +4095, 3028, 3919, +4095, 3028, 3919, +4095, 3029, 3919, +4095, 3029, 3919, +4095, 3030, 3919, +4095, 3031, 3919, +4095, 3032, 3918, +4095, 3034, 3918, +4095, 3036, 3917, +4095, 3039, 3917, +4095, 3044, 3916, +4095, 3049, 3914, +4095, 3056, 3913, +4095, 3066, 3910, +4095, 3078, 3907, +4095, 3094, 3903, +4095, 3115, 3897, +4095, 3141, 3889, +4095, 3174, 3878, +4095, 3214, 3863, +4095, 3263, 3843, +4095, 3321, 3814, +4095, 3389, 3772, +4085, 3467, 3709, +4030, 3553, 3608, +3943, 3647, 3424, +3794, 3749, 2925, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3158, 4051, +4095, 3159, 4051, +4095, 3159, 4051, +4095, 3159, 4051, +4095, 3160, 4051, +4095, 3160, 4051, +4095, 3161, 4051, +4095, 3162, 4050, +4095, 3163, 4050, +4095, 3165, 4050, +4095, 3167, 4049, +4095, 3170, 4048, +4095, 3175, 4047, +4095, 3180, 4046, +4095, 3187, 4044, +4095, 3197, 4042, +4095, 3209, 4039, +4095, 3225, 4035, +4095, 3246, 4029, +4095, 3272, 4021, +4095, 3305, 4010, +4095, 3346, 3995, +4095, 3395, 3975, +4095, 3453, 3946, +4095, 3521, 3903, +4095, 3598, 3840, +4095, 3685, 3739, +4075, 3779, 3555, +0, 1092, 1347, +0, 1097, 1342, +0, 1104, 1336, +0, 1112, 1327, +0, 1124, 1315, +0, 1139, 1298, +0, 1159, 1275, +0, 1183, 1242, +0, 1215, 1193, +0, 1253, 1119, +0, 1300, 996, +0, 1356, 751, +0, 1422, 0, +0, 1497, 0, +0, 1581, 0, +0, 1674, 0, +0, 1774, 0, +0, 1881, 0, +0, 1993, 0, +0, 2110, 0, +0, 2230, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +0, 1093, 1354, +0, 1098, 1350, +0, 1105, 1343, +0, 1114, 1335, +0, 1126, 1323, +0, 1141, 1306, +0, 1160, 1283, +0, 1185, 1251, +0, 1216, 1203, +0, 1254, 1131, +0, 1301, 1011, +0, 1357, 777, +0, 1423, 0, +0, 1498, 0, +0, 1582, 0, +0, 1674, 0, +0, 1775, 0, +0, 1881, 0, +0, 1993, 0, +0, 2110, 0, +0, 2230, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +0, 1096, 1364, +0, 1101, 1359, +0, 1107, 1353, +0, 1116, 1344, +0, 1128, 1333, +0, 1143, 1317, +0, 1162, 1294, +0, 1187, 1262, +0, 1218, 1216, +0, 1256, 1146, +0, 1303, 1031, +0, 1359, 809, +0, 1424, 0, +0, 1499, 0, +0, 1583, 0, +0, 1675, 0, +0, 1775, 0, +0, 1882, 0, +0, 1994, 0, +0, 2110, 0, +0, 2230, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +0, 1099, 1376, +0, 1104, 1371, +0, 1110, 1365, +0, 1119, 1357, +0, 1131, 1346, +0, 1146, 1330, +0, 1165, 1308, +0, 1189, 1278, +0, 1220, 1233, +0, 1258, 1165, +0, 1305, 1056, +0, 1360, 850, +0, 1425, 185, +0, 1500, 0, +0, 1584, 0, +0, 1676, 0, +0, 1776, 0, +0, 1882, 0, +0, 1994, 0, +0, 2110, 0, +0, 2230, 0, +0, 2353, 0, +0, 2478, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +0, 1103, 1392, +0, 1108, 1387, +0, 1114, 1381, +0, 1123, 1373, +0, 1135, 1363, +0, 1149, 1348, +0, 1168, 1327, +0, 1193, 1297, +0, 1223, 1255, +0, 1261, 1190, +0, 1307, 1087, +0, 1363, 898, +0, 1427, 365, +0, 1502, 0, +0, 1585, 0, +0, 1677, 0, +0, 1777, 0, +0, 1883, 0, +0, 1995, 0, +0, 2111, 0, +0, 2231, 0, +0, 2354, 0, +0, 2479, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +0, 1108, 1412, +0, 1113, 1408, +0, 1120, 1402, +0, 1128, 1395, +0, 1140, 1384, +0, 1154, 1370, +0, 1173, 1350, +0, 1197, 1322, +0, 1227, 1282, +0, 1265, 1222, +0, 1311, 1126, +0, 1366, 956, +0, 1430, 530, +0, 1504, 0, +0, 1587, 0, +0, 1679, 0, +0, 1778, 0, +0, 1884, 0, +0, 1995, 0, +0, 2112, 0, +0, 2231, 0, +0, 2354, 0, +0, 2479, 0, +0, 2605, 0, +0, 2733, 0, +0, 2862, 0, +0, 2992, 0, +0, 3122, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +0, 1115, 1438, +0, 1120, 1434, +0, 1127, 1429, +0, 1135, 1421, +0, 1146, 1412, +0, 1161, 1398, +0, 1179, 1380, +0, 1203, 1353, +0, 1233, 1316, +0, 1270, 1260, +0, 1315, 1173, +0, 1370, 1023, +0, 1434, 686, +0, 1507, 0, +0, 1590, 0, +0, 1681, 0, +0, 1780, 0, +0, 1885, 0, +0, 1996, 0, +0, 2112, 0, +0, 2232, 0, +0, 2354, 0, +0, 2479, 0, +0, 2606, 0, +0, 2734, 0, +0, 2862, 0, +0, 2992, 0, +0, 3123, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +503, 1125, 1470, +461, 1130, 1467, +397, 1136, 1462, +296, 1144, 1455, +111, 1155, 1446, +0, 1169, 1433, +0, 1188, 1416, +0, 1211, 1392, +0, 1240, 1358, +0, 1277, 1307, +0, 1322, 1230, +0, 1375, 1100, +0, 1438, 834, +0, 1511, 0, +0, 1593, 0, +0, 1683, 0, +0, 1782, 0, +0, 1887, 0, +0, 1998, 0, +0, 2113, 0, +0, 2233, 0, +0, 2355, 0, +0, 2480, 0, +0, 2606, 0, +0, 2734, 0, +0, 2863, 0, +0, 2992, 0, +0, 3123, 0, +0, 3253, 0, +0, 3384, 0, +0, 3516, 0, +0, 3647, 0, +919, 1137, 1510, +902, 1142, 1507, +879, 1148, 1502, +847, 1156, 1496, +799, 1167, 1488, +726, 1180, 1477, +606, 1198, 1461, +371, 1221, 1439, +0, 1250, 1409, +0, 1286, 1364, +0, 1330, 1296, +0, 1382, 1186, +0, 1444, 978, +0, 1516, 303, +0, 1597, 0, +0, 1687, 0, +0, 1785, 0, +0, 1889, 0, +0, 2000, 0, +0, 2115, 0, +0, 2234, 0, +0, 2356, 0, +0, 2480, 0, +0, 2606, 0, +0, 2734, 0, +0, 2863, 0, +0, 2993, 0, +0, 3123, 0, +0, 3253, 0, +0, 3385, 0, +0, 3516, 0, +0, 3647, 0, +1186, 1153, 1559, +1177, 1158, 1556, +1165, 1164, 1552, +1148, 1171, 1546, +1124, 1182, 1539, +1090, 1195, 1529, +1039, 1212, 1515, +962, 1234, 1496, +834, 1262, 1468, +572, 1297, 1429, +0, 1340, 1371, +0, 1392, 1280, +0, 1453, 1119, +0, 1523, 738, +0, 1603, 0, +0, 1692, 0, +0, 1789, 0, +0, 1892, 0, +0, 2002, 0, +0, 2117, 0, +0, 2235, 0, +0, 2357, 0, +0, 2481, 0, +0, 2607, 0, +0, 2735, 0, +0, 2863, 0, +0, 2993, 0, +0, 3123, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3647, 0, +1398, 1174, 1617, +1393, 1178, 1614, +1385, 1184, 1610, +1375, 1191, 1606, +1360, 1201, 1599, +1340, 1214, 1590, +1312, 1230, 1578, +1271, 1251, 1561, +1211, 1278, 1538, +1114, 1312, 1505, +942, 1354, 1456, +504, 1404, 1382, +0, 1463, 1258, +0, 1532, 1012, +0, 1611, 0, +0, 1698, 0, +0, 1794, 0, +0, 1896, 0, +0, 2005, 0, +0, 2119, 0, +0, 2237, 0, +0, 2358, 0, +0, 2482, 0, +0, 2608, 0, +0, 2735, 0, +0, 2864, 0, +0, 2993, 0, +0, 3123, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3647, 0, +1582, 1200, 1684, +1579, 1204, 1682, +1573, 1209, 1679, +1567, 1216, 1674, +1557, 1225, 1669, +1544, 1237, 1661, +1527, 1253, 1651, +1502, 1273, 1637, +1466, 1299, 1617, +1414, 1331, 1589, +1332, 1371, 1549, +1195, 1420, 1489, +903, 1477, 1395, +0, 1544, 1226, +0, 1621, 810, +0, 1707, 0, +0, 1801, 0, +0, 1902, 0, +0, 2010, 0, +0, 2123, 0, +0, 2240, 0, +0, 2360, 0, +0, 2484, 0, +0, 2609, 0, +0, 2736, 0, +0, 2864, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +1750, 1232, 1761, +1747, 1236, 1759, +1744, 1241, 1756, +1739, 1248, 1753, +1732, 1256, 1748, +1724, 1268, 1742, +1712, 1282, 1733, +1695, 1301, 1721, +1672, 1326, 1705, +1640, 1356, 1682, +1592, 1394, 1650, +1520, 1440, 1602, +1400, 1495, 1530, +1165, 1560, 1412, +102, 1634, 1180, +0, 1718, 189, +0, 1809, 0, +0, 1909, 0, +0, 2015, 0, +0, 2127, 0, +0, 2243, 0, +0, 2363, 0, +0, 2486, 0, +0, 2611, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +1906, 1272, 1846, +1905, 1276, 1845, +1902, 1280, 1843, +1899, 1286, 1840, +1894, 1294, 1836, +1888, 1305, 1831, +1880, 1319, 1824, +1869, 1336, 1814, +1853, 1359, 1801, +1831, 1387, 1782, +1801, 1422, 1757, +1756, 1466, 1720, +1689, 1518, 1665, +1580, 1580, 1580, +1375, 1651, 1434, +723, 1732, 1111, +0, 1821, 0, +0, 1918, 0, +0, 2023, 0, +0, 2133, 0, +0, 2248, 0, +0, 2366, 0, +0, 2488, 0, +0, 2613, 0, +0, 2739, 0, +0, 2866, 0, +0, 2995, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2056, 1321, 1941, +2055, 1324, 1939, +2053, 1328, 1938, +2051, 1334, 1935, +2047, 1341, 1932, +2043, 1350, 1928, +2037, 1363, 1922, +2029, 1379, 1914, +2018, 1399, 1904, +2003, 1425, 1889, +1983, 1458, 1869, +1953, 1498, 1840, +1911, 1547, 1799, +1847, 1605, 1737, +1745, 1673, 1639, +1558, 1750, 1461, +1037, 1836, 997, +0, 1931, 0, +0, 2032, 0, +0, 2140, 0, +0, 2254, 0, +0, 2371, 0, +0, 2492, 0, +0, 2615, 0, +0, 2741, 0, +0, 2868, 0, +0, 2996, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +2201, 1379, 2042, +2200, 1382, 2041, +2199, 1386, 2040, +2197, 1390, 2038, +2195, 1397, 2035, +2191, 1405, 2032, +2187, 1416, 2027, +2182, 1430, 2021, +2174, 1449, 2013, +2163, 1472, 2001, +2149, 1502, 1986, +2129, 1538, 1964, +2100, 1583, 1933, +2059, 1637, 1887, +1998, 1701, 1819, +1900, 1774, 1707, +1724, 1856, 1496, +1270, 1947, 780, +0, 2045, 0, +0, 2151, 0, +0, 2262, 0, +0, 2377, 0, +0, 2497, 0, +0, 2619, 0, +0, 2744, 0, +0, 2870, 0, +0, 2998, 0, +0, 3127, 0, +0, 3256, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +2342, 1447, 2150, +2342, 1449, 2149, +2341, 1452, 2148, +2339, 1456, 2146, +2338, 1462, 2145, +2335, 1469, 2142, +2332, 1479, 2138, +2328, 1491, 2133, +2323, 1507, 2127, +2315, 1528, 2118, +2305, 1554, 2106, +2290, 1587, 2089, +2271, 1628, 2066, +2243, 1677, 2032, +2203, 1735, 1984, +2143, 1803, 1909, +2049, 1881, 1785, +1880, 1967, 1538, +1465, 2062, 3, +0, 2164, 0, +0, 2272, 0, +0, 2385, 0, +0, 2503, 0, +0, 2624, 0, +0, 2747, 0, +0, 2873, 0, +0, 3000, 0, +0, 3128, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2481, 1524, 2263, +2481, 1526, 2262, +2480, 1528, 2261, +2479, 1532, 2260, +2478, 1537, 2259, +2476, 1543, 2257, +2474, 1551, 2254, +2471, 1561, 2250, +2467, 1575, 2245, +2461, 1593, 2238, +2454, 1616, 2229, +2444, 1645, 2216, +2430, 1681, 2199, +2410, 1725, 2174, +2383, 1778, 2139, +2344, 1840, 2087, +2285, 1912, 2007, +2193, 1993, 1872, +2030, 2083, 1589, +1639, 2181, 0, +0, 2285, 0, +0, 2396, 0, +0, 2511, 0, +0, 2630, 0, +0, 2752, 0, +0, 2876, 0, +0, 3003, 0, +0, 3130, 0, +0, 3259, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +2618, 1610, 2380, +2618, 1611, 2380, +2617, 1614, 2379, +2617, 1617, 2378, +2616, 1620, 2377, +2615, 1626, 2375, +2613, 1632, 2373, +2611, 1641, 2370, +2608, 1653, 2367, +2604, 1668, 2361, +2598, 1687, 2354, +2591, 1712, 2345, +2581, 1743, 2331, +2567, 1782, 2313, +2548, 1829, 2287, +2521, 1885, 2251, +2482, 1950, 2197, +2424, 2026, 2112, +2333, 2110, 1967, +2174, 2202, 1650, +1800, 2303, 0, +0, 2409, 0, +0, 2522, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +2754, 1704, 2501, +2754, 1705, 2500, +2754, 1707, 2500, +2753, 1710, 2499, +2752, 1713, 2498, +2751, 1717, 2497, +2750, 1723, 2496, +2749, 1730, 2493, +2746, 1739, 2490, +2743, 1752, 2486, +2739, 1768, 2481, +2734, 1789, 2474, +2727, 1815, 2464, +2717, 1849, 2450, +2703, 1889, 2432, +2684, 1939, 2405, +2657, 1997, 2367, +2619, 2066, 2311, +2562, 2143, 2223, +2472, 2230, 2069, +2315, 2325, 1720, +1952, 2427, 0, +0, 2535, 0, +0, 2649, 0, +0, 2767, 0, +0, 2888, 0, +0, 3011, 0, +0, 3137, 0, +0, 3264, 0, +0, 3392, 0, +0, 3522, 0, +0, 3652, 0, +2889, 1806, 2624, +2889, 1807, 2624, +2889, 1808, 2624, +2888, 1810, 2623, +2888, 1813, 2622, +2887, 1816, 2621, +2886, 1821, 2620, +2885, 1826, 2619, +2883, 1834, 2616, +2881, 1844, 2613, +2878, 1858, 2609, +2874, 1875, 2604, +2869, 1897, 2596, +2861, 1925, 2586, +2852, 1959, 2572, +2838, 2002, 2553, +2819, 2054, 2526, +2792, 2114, 2487, +2754, 2185, 2429, +2698, 2265, 2338, +2609, 2353, 2178, +2454, 2450, 1799, +2099, 2553, 0, +0, 2663, 0, +0, 2777, 0, +0, 2896, 0, +0, 3018, 0, +0, 3142, 0, +0, 3268, 0, +0, 3395, 0, +0, 3524, 0, +0, 3653, 0, +3023, 1914, 2750, +3023, 1915, 2749, +3023, 1916, 2749, +3023, 1917, 2749, +3022, 1919, 2748, +3022, 1922, 2748, +3021, 1925, 2747, +3020, 1930, 2745, +3019, 1936, 2744, +3017, 1944, 2741, +3015, 1955, 2738, +3012, 1969, 2734, +3008, 1987, 2729, +3003, 2010, 2721, +2996, 2039, 2711, +2986, 2075, 2697, +2972, 2119, 2677, +2953, 2172, 2650, +2927, 2235, 2610, +2889, 2307, 2551, +2833, 2388, 2457, +2744, 2478, 2291, +2591, 2576, 1888, +2242, 2681, 0, +0, 2792, 0, +0, 2907, 0, +0, 3026, 0, +0, 3148, 0, +0, 3273, 0, +0, 3399, 0, +0, 3527, 0, +0, 3655, 0, +3157, 2027, 2877, +3157, 2028, 2877, +3157, 2028, 2876, +3156, 2030, 2876, +3156, 2031, 2876, +3156, 2033, 2875, +3155, 2036, 2874, +3155, 2040, 2874, +3154, 2045, 2872, +3152, 2051, 2871, +3151, 2059, 2868, +3149, 2071, 2865, +3146, 2085, 2861, +3142, 2104, 2855, +3136, 2127, 2848, +3129, 2157, 2837, +3119, 2194, 2823, +3106, 2240, 2803, +3087, 2294, 2775, +3061, 2358, 2735, +3023, 2431, 2675, +2967, 2514, 2579, +2879, 2605, 2409, +2727, 2704, 1984, +2382, 2810, 0, +0, 2921, 0, +0, 3037, 0, +0, 3157, 0, +0, 3279, 0, +0, 3404, 0, +0, 3530, 0, +0, 3658, 0, +3290, 2144, 3005, +3290, 2145, 3005, +3290, 2145, 3005, +3290, 2146, 3005, +3290, 2148, 3004, +3289, 2149, 3004, +3289, 2151, 3003, +3288, 2154, 3003, +3288, 2158, 3002, +3287, 2163, 3000, +3286, 2170, 2999, +3284, 2178, 2996, +3282, 2190, 2993, +3279, 2205, 2989, +3275, 2224, 2983, +3270, 2248, 2976, +3262, 2279, 2965, +3253, 2317, 2951, +3239, 2363, 2931, +3220, 2418, 2902, +3194, 2483, 2862, +3156, 2558, 2801, +3101, 2641, 2704, +3013, 2733, 2530, +2862, 2833, 2087, +2520, 2939, 0, +0, 3051, 0, +0, 3168, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +3423, 2265, 3134, +3423, 2265, 3134, +3423, 2266, 3134, +3423, 2267, 3134, +3423, 2268, 3134, +3422, 2269, 3133, +3422, 2270, 3133, +3422, 2273, 3132, +3421, 2276, 3132, +3421, 2279, 3131, +3420, 2285, 3130, +3418, 2291, 3128, +3417, 2300, 3125, +3415, 2312, 3122, +3412, 2327, 3118, +3408, 2347, 3112, +3403, 2371, 3105, +3395, 2403, 3094, +3386, 2441, 3080, +3372, 2488, 3059, +3353, 2545, 3031, +3327, 2610, 2990, +3290, 2685, 2928, +3234, 2770, 2830, +3147, 2863, 2654, +2996, 2963, 2197, +2656, 3070, 0, +0, 3182, 0, +0, 3298, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +3556, 2388, 3264, +3556, 2389, 3264, +3556, 2389, 3264, +3556, 2390, 3264, +3555, 2390, 3264, +3555, 2391, 3264, +3555, 2393, 3263, +3555, 2394, 3263, +3554, 2397, 3262, +3554, 2400, 3262, +3553, 2403, 3261, +3552, 2409, 3259, +3551, 2416, 3258, +3550, 2425, 3255, +3547, 2437, 3252, +3544, 2452, 3248, +3541, 2472, 3242, +3535, 2497, 3234, +3528, 2529, 3224, +3518, 2568, 3209, +3505, 2615, 3189, +3486, 2672, 3160, +3460, 2738, 3119, +3422, 2814, 3057, +3367, 2899, 2958, +3280, 2992, 2780, +3130, 3093, 2311, +2791, 3200, 0, +0, 3313, 0, +0, 3430, 0, +0, 3550, 0, +0, 3673, 0, +3688, 2514, 3395, +3688, 2514, 3395, +3688, 2515, 3395, +3688, 2515, 3395, +3688, 2515, 3394, +3688, 2516, 3394, +3688, 2517, 3394, +3688, 2518, 3394, +3687, 2520, 3393, +3687, 2522, 3393, +3686, 2525, 3392, +3686, 2529, 3391, +3685, 2535, 3390, +3684, 2542, 3388, +3682, 2551, 3386, +3680, 2563, 3383, +3677, 2579, 3378, +3673, 2599, 3373, +3668, 2624, 3365, +3661, 2656, 3354, +3651, 2696, 3339, +3637, 2744, 3319, +3619, 2801, 3290, +3593, 2868, 3249, +3555, 2944, 3186, +3500, 3029, 3087, +3413, 3123, 2907, +3263, 3224, 2429, +2926, 3331, 0, +0, 3444, 0, +0, 3561, 0, +0, 3682, 0, +3821, 2641, 3526, +3821, 2641, 3526, +3821, 2641, 3526, +3821, 2642, 3526, +3821, 2642, 3525, +3821, 2643, 3525, +3820, 2643, 3525, +3820, 2644, 3525, +3820, 2646, 3525, +3820, 2647, 3524, +3819, 2650, 3524, +3819, 2653, 3523, +3818, 2657, 3522, +3817, 2662, 3521, +3816, 2669, 3519, +3815, 2679, 3517, +3812, 2691, 3513, +3809, 2706, 3509, +3806, 2727, 3503, +3800, 2752, 3495, +3793, 2785, 3485, +3783, 2825, 3470, +3770, 2873, 3450, +3751, 2930, 3421, +3725, 2998, 3379, +3688, 3074, 3316, +3632, 3160, 3216, +3546, 3254, 3035, +3396, 3355, 2551, +3060, 3463, 0, +0, 3576, 0, +0, 3693, 0, +3953, 2769, 3657, +3953, 2770, 3657, +3953, 2770, 3657, +3953, 2770, 3657, +3953, 2770, 3657, +3953, 2771, 3657, +3953, 2771, 3656, +3953, 2772, 3656, +3953, 2773, 3656, +3952, 2774, 3656, +3952, 2776, 3655, +3952, 2778, 3655, +3951, 2781, 3654, +3951, 2785, 3653, +3950, 2791, 3652, +3948, 2798, 3650, +3947, 2807, 3648, +3945, 2820, 3644, +3942, 2835, 3640, +3938, 2856, 3634, +3933, 2882, 3627, +3925, 2914, 3616, +3916, 2954, 3601, +3902, 3003, 3581, +3884, 3061, 3552, +3858, 3128, 3510, +3820, 3205, 3447, +3765, 3291, 3347, +3678, 3385, 3165, +3528, 3486, 2675, +3193, 3594, 0, +0, 3707, 0, +4085, 2899, 3788, +4085, 2899, 3788, +4085, 2899, 3788, +4085, 2899, 3788, +4085, 2899, 3788, +4085, 2900, 3788, +4085, 2900, 3788, +4085, 2901, 3788, +4085, 2901, 3788, +4085, 2902, 3787, +4085, 2904, 3787, +4084, 2905, 3787, +4084, 2908, 3786, +4084, 2911, 3785, +4083, 2915, 3784, +4082, 2920, 3783, +4081, 2928, 3781, +4079, 2937, 3779, +4077, 2949, 3776, +4074, 2965, 3772, +4070, 2986, 3766, +4065, 3012, 3758, +4058, 3044, 3747, +4048, 3084, 3732, +4035, 3133, 3712, +4016, 3191, 3683, +3990, 3259, 3641, +3952, 3336, 3578, +3897, 3422, 3477, +3811, 3516, 3295, +3661, 3618, 2801, +3326, 3726, 0, +4095, 3029, 3920, +4095, 3029, 3920, +4095, 3029, 3920, +4095, 3029, 3920, +4095, 3029, 3920, +4095, 3029, 3920, +4095, 3030, 3920, +4095, 3030, 3920, +4095, 3031, 3919, +4095, 3031, 3919, +4095, 3032, 3919, +4095, 3034, 3919, +4095, 3035, 3918, +4095, 3038, 3918, +4095, 3041, 3917, +4095, 3045, 3916, +4095, 3050, 3915, +4095, 3058, 3913, +4095, 3067, 3911, +4095, 3079, 3907, +4095, 3095, 3903, +4095, 3116, 3897, +4095, 3142, 3889, +4095, 3175, 3879, +4095, 3215, 3864, +4095, 3264, 3843, +4095, 3322, 3814, +4095, 3390, 3772, +4085, 3467, 3709, +4029, 3553, 3609, +3943, 3648, 3425, +3793, 3750, 2928, +4095, 3159, 4052, +4095, 3159, 4052, +4095, 3159, 4052, +4095, 3159, 4052, +4095, 3160, 4052, +4095, 3160, 4051, +4095, 3160, 4051, +4095, 3160, 4051, +4095, 3161, 4051, +4095, 3161, 4051, +4095, 3162, 4051, +4095, 3163, 4051, +4095, 3164, 4050, +4095, 3166, 4050, +4095, 3168, 4049, +4095, 3171, 4049, +4095, 3176, 4048, +4095, 3181, 4046, +4095, 3188, 4045, +4095, 3198, 4042, +4095, 3210, 4039, +4095, 3226, 4035, +4095, 3247, 4029, +4095, 3273, 4021, +4095, 3306, 4010, +4095, 3346, 3996, +4095, 3395, 3975, +4095, 3454, 3946, +4095, 3521, 3904, +4095, 3599, 3841, +4095, 3685, 3740, +4075, 3780, 3556, +0, 1218, 1478, +0, 1222, 1474, +0, 1228, 1469, +0, 1234, 1463, +0, 1243, 1454, +0, 1255, 1441, +0, 1270, 1424, +0, 1290, 1401, +0, 1314, 1367, +0, 1346, 1318, +0, 1384, 1242, +0, 1431, 1116, +0, 1488, 863, +0, 1553, 0, +0, 1629, 0, +0, 1713, 0, +0, 1806, 0, +0, 1906, 0, +0, 2013, 0, +0, 2125, 0, +0, 2242, 0, +0, 2362, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1220, 1483, +0, 1224, 1479, +0, 1229, 1475, +0, 1236, 1468, +0, 1245, 1459, +0, 1256, 1447, +0, 1271, 1430, +0, 1291, 1407, +0, 1316, 1374, +0, 1347, 1325, +0, 1385, 1251, +0, 1432, 1128, +0, 1488, 883, +0, 1554, 0, +0, 1629, 0, +0, 1713, 0, +0, 1806, 0, +0, 1906, 0, +0, 2013, 0, +0, 2125, 0, +0, 2242, 0, +0, 2362, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1222, 1490, +0, 1225, 1486, +0, 1231, 1482, +0, 1237, 1475, +0, 1246, 1467, +0, 1258, 1455, +0, 1273, 1438, +0, 1292, 1415, +0, 1317, 1383, +0, 1348, 1335, +0, 1387, 1263, +0, 1433, 1143, +0, 1489, 909, +0, 1555, 0, +0, 1630, 0, +0, 1714, 0, +0, 1807, 0, +0, 1907, 0, +0, 2013, 0, +0, 2125, 0, +0, 2242, 0, +0, 2362, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1224, 1499, +0, 1228, 1496, +0, 1233, 1491, +0, 1240, 1485, +0, 1248, 1476, +0, 1260, 1465, +0, 1275, 1449, +0, 1294, 1426, +0, 1319, 1395, +0, 1350, 1348, +0, 1388, 1278, +0, 1435, 1163, +0, 1491, 942, +0, 1556, 111, +0, 1631, 0, +0, 1715, 0, +0, 1807, 0, +0, 1907, 0, +0, 2014, 0, +0, 2126, 0, +0, 2242, 0, +0, 2362, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1227, 1511, +0, 1231, 1508, +0, 1236, 1503, +0, 1243, 1497, +0, 1251, 1489, +0, 1263, 1478, +0, 1278, 1462, +0, 1297, 1441, +0, 1321, 1410, +0, 1352, 1365, +0, 1390, 1298, +0, 1437, 1188, +0, 1492, 982, +0, 1557, 317, +0, 1632, 0, +0, 1716, 0, +0, 1808, 0, +0, 1908, 0, +0, 2014, 0, +0, 2126, 0, +0, 2243, 0, +0, 2363, 0, +0, 2485, 0, +0, 2610, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1231, 1527, +0, 1235, 1524, +0, 1240, 1519, +0, 1247, 1514, +0, 1255, 1506, +0, 1267, 1495, +0, 1281, 1480, +0, 1300, 1459, +0, 1325, 1429, +0, 1355, 1387, +0, 1393, 1322, +0, 1439, 1219, +0, 1495, 1030, +0, 1559, 497, +0, 1634, 0, +0, 1717, 0, +0, 1809, 0, +0, 1909, 0, +0, 2015, 0, +0, 2127, 0, +0, 2243, 0, +0, 2363, 0, +0, 2486, 0, +0, 2611, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3254, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1237, 1547, +0, 1240, 1544, +0, 1245, 1540, +0, 1252, 1534, +0, 1260, 1527, +0, 1272, 1516, +0, 1286, 1502, +0, 1305, 1482, +0, 1329, 1454, +0, 1360, 1414, +0, 1397, 1354, +0, 1443, 1258, +0, 1498, 1088, +0, 1562, 662, +0, 1636, 0, +0, 1719, 0, +0, 1811, 0, +0, 1910, 0, +0, 2016, 0, +0, 2128, 0, +0, 2244, 0, +0, 2363, 0, +0, 2486, 0, +0, 2611, 0, +0, 2737, 0, +0, 2865, 0, +0, 2994, 0, +0, 3124, 0, +0, 3255, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +0, 1244, 1573, +0, 1248, 1570, +0, 1252, 1566, +0, 1259, 1561, +0, 1267, 1554, +0, 1278, 1544, +0, 1293, 1530, +0, 1311, 1512, +0, 1335, 1486, +0, 1365, 1448, +0, 1402, 1392, +0, 1448, 1306, +0, 1502, 1155, +0, 1566, 818, +0, 1639, 0, +0, 1722, 0, +0, 1813, 0, +0, 1912, 0, +0, 2017, 0, +0, 2129, 0, +0, 2244, 0, +0, 2364, 0, +0, 2486, 0, +0, 2611, 0, +0, 2738, 0, +0, 2866, 0, +0, 2995, 0, +0, 3124, 0, +0, 3255, 0, +0, 3385, 0, +0, 3516, 0, +0, 3648, 0, +664, 1253, 1605, +635, 1257, 1602, +593, 1262, 1599, +530, 1268, 1594, +428, 1276, 1587, +243, 1287, 1578, +0, 1301, 1566, +0, 1320, 1548, +0, 1343, 1524, +0, 1372, 1490, +0, 1409, 1440, +0, 1454, 1362, +0, 1507, 1232, +0, 1570, 966, +0, 1643, 0, +0, 1725, 0, +0, 1816, 0, +0, 1914, 0, +0, 2019, 0, +0, 2130, 0, +0, 2245, 0, +0, 2365, 0, +0, 2487, 0, +0, 2612, 0, +0, 2738, 0, +0, 2866, 0, +0, 2995, 0, +0, 3124, 0, +0, 3255, 0, +0, 3385, 0, +0, 3517, 0, +0, 3648, 0, +1063, 1266, 1645, +1051, 1269, 1642, +1034, 1274, 1639, +1011, 1280, 1635, +979, 1288, 1628, +931, 1299, 1620, +858, 1313, 1609, +738, 1330, 1593, +503, 1353, 1571, +0, 1382, 1541, +0, 1418, 1496, +0, 1462, 1428, +0, 1514, 1318, +0, 1577, 1110, +0, 1648, 435, +0, 1729, 0, +0, 1819, 0, +0, 1917, 0, +0, 2021, 0, +0, 2132, 0, +0, 2247, 0, +0, 2366, 0, +0, 2488, 0, +0, 2612, 0, +0, 2739, 0, +0, 2866, 0, +0, 2995, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +1325, 1282, 1693, +1318, 1285, 1691, +1309, 1290, 1688, +1297, 1296, 1684, +1280, 1303, 1678, +1256, 1314, 1671, +1222, 1327, 1661, +1172, 1344, 1647, +1095, 1366, 1628, +966, 1394, 1601, +704, 1429, 1562, +0, 1472, 1503, +0, 1524, 1412, +0, 1585, 1251, +0, 1655, 870, +0, 1735, 0, +0, 1824, 0, +0, 1921, 0, +0, 2024, 0, +0, 2134, 0, +0, 2249, 0, +0, 2367, 0, +0, 2489, 0, +0, 2613, 0, +0, 2739, 0, +0, 2867, 0, +0, 2995, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +1535, 1302, 1751, +1530, 1306, 1749, +1525, 1310, 1746, +1517, 1316, 1742, +1507, 1323, 1738, +1492, 1333, 1731, +1472, 1346, 1722, +1444, 1362, 1710, +1404, 1384, 1693, +1343, 1411, 1670, +1246, 1444, 1637, +1074, 1486, 1588, +636, 1536, 1514, +0, 1595, 1390, +0, 1664, 1144, +0, 1743, 0, +0, 1830, 0, +0, 1926, 0, +0, 2029, 0, +0, 2137, 0, +0, 2251, 0, +0, 2369, 0, +0, 2490, 0, +0, 2614, 0, +0, 2740, 0, +0, 2867, 0, +0, 2996, 0, +0, 3125, 0, +0, 3255, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +1717, 1329, 1818, +1714, 1332, 1816, +1711, 1336, 1814, +1706, 1341, 1811, +1699, 1348, 1806, +1689, 1357, 1801, +1676, 1370, 1793, +1659, 1385, 1783, +1634, 1406, 1769, +1598, 1431, 1749, +1546, 1464, 1721, +1465, 1503, 1681, +1327, 1552, 1621, +1035, 1609, 1527, +0, 1676, 1358, +0, 1753, 942, +0, 1839, 0, +0, 1933, 0, +0, 2034, 0, +0, 2142, 0, +0, 2255, 0, +0, 2372, 0, +0, 2492, 0, +0, 2616, 0, +0, 2741, 0, +0, 2868, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +1884, 1361, 1894, +1882, 1364, 1893, +1879, 1368, 1891, +1876, 1373, 1888, +1871, 1380, 1885, +1865, 1388, 1880, +1856, 1400, 1874, +1844, 1414, 1865, +1827, 1433, 1853, +1805, 1458, 1837, +1772, 1488, 1814, +1724, 1526, 1782, +1652, 1572, 1734, +1532, 1627, 1662, +1297, 1692, 1544, +234, 1766, 1313, +0, 1850, 322, +0, 1942, 0, +0, 2041, 0, +0, 2147, 0, +0, 2259, 0, +0, 2375, 0, +0, 2495, 0, +0, 2618, 0, +0, 2743, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3648, 0, +2040, 1402, 1980, +2038, 1405, 1979, +2037, 1408, 1977, +2034, 1413, 1975, +2031, 1419, 1972, +2026, 1427, 1968, +2020, 1437, 1963, +2012, 1451, 1956, +2001, 1468, 1946, +1985, 1491, 1933, +1964, 1519, 1914, +1933, 1555, 1889, +1888, 1598, 1852, +1821, 1650, 1797, +1712, 1712, 1712, +1507, 1783, 1566, +855, 1864, 1243, +0, 1953, 0, +0, 2051, 0, +0, 2155, 0, +0, 2265, 0, +0, 2380, 0, +0, 2499, 0, +0, 2620, 0, +0, 2745, 0, +0, 2871, 0, +0, 2999, 0, +0, 3127, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +2189, 1451, 2074, +2188, 1453, 2073, +2187, 1456, 2071, +2185, 1461, 2070, +2183, 1466, 2067, +2180, 1473, 2064, +2175, 1483, 2060, +2169, 1495, 2054, +2161, 1511, 2046, +2151, 1531, 2036, +2136, 1557, 2021, +2115, 1590, 2001, +2085, 1630, 1972, +2043, 1679, 1931, +1979, 1737, 1869, +1877, 1805, 1771, +1690, 1882, 1593, +1170, 1968, 1129, +0, 2063, 0, +0, 2165, 0, +0, 2273, 0, +0, 2386, 0, +0, 2503, 0, +0, 2624, 0, +0, 2747, 0, +0, 2873, 0, +0, 3000, 0, +0, 3128, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2334, 1509, 2175, +2333, 1511, 2174, +2332, 1514, 2173, +2331, 1518, 2172, +2329, 1522, 2170, +2327, 1529, 2167, +2324, 1537, 2164, +2319, 1548, 2159, +2314, 1562, 2153, +2306, 1581, 2145, +2295, 1604, 2134, +2281, 1634, 2118, +2261, 1671, 2096, +2232, 1716, 2065, +2191, 1769, 2019, +2130, 1833, 1951, +2032, 1906, 1839, +1856, 1988, 1628, +1402, 2079, 912, +0, 2177, 0, +0, 2283, 0, +0, 2394, 0, +0, 2509, 0, +0, 2629, 0, +0, 2751, 0, +0, 2876, 0, +0, 3002, 0, +0, 3130, 0, +0, 3259, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +2475, 1577, 2283, +2474, 1579, 2282, +2474, 1581, 2281, +2473, 1584, 2280, +2472, 1588, 2279, +2470, 1594, 2277, +2468, 1601, 2274, +2464, 1611, 2270, +2460, 1623, 2266, +2455, 1639, 2259, +2447, 1660, 2250, +2437, 1686, 2238, +2423, 1719, 2221, +2403, 1760, 2198, +2375, 1809, 2165, +2335, 1867, 2116, +2275, 1935, 2041, +2181, 2013, 1917, +2012, 2099, 1670, +1597, 2194, 135, +0, 2296, 0, +0, 2404, 0, +0, 2517, 0, +0, 2635, 0, +0, 2756, 0, +0, 2879, 0, +0, 3005, 0, +0, 3132, 0, +0, 3260, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2614, 1654, 2395, +2613, 1656, 2395, +2613, 1658, 2394, +2612, 1660, 2393, +2611, 1664, 2392, +2610, 1669, 2391, +2608, 1675, 2389, +2606, 1683, 2386, +2603, 1694, 2382, +2599, 1707, 2377, +2593, 1725, 2370, +2586, 1748, 2361, +2576, 1777, 2348, +2562, 1813, 2331, +2542, 1857, 2306, +2515, 1910, 2271, +2476, 1972, 2219, +2417, 2044, 2139, +2325, 2125, 2004, +2162, 2215, 1721, +1771, 2313, 0, +0, 2417, 0, +0, 2528, 0, +0, 2643, 0, +0, 2762, 0, +0, 2884, 0, +0, 3009, 0, +0, 3135, 0, +0, 3263, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +2751, 1741, 2513, +2750, 1742, 2512, +2750, 1744, 2512, +2750, 1746, 2511, +2749, 1749, 2510, +2748, 1753, 2509, +2747, 1758, 2507, +2745, 1764, 2505, +2743, 1773, 2502, +2740, 1785, 2499, +2736, 1800, 2493, +2730, 1819, 2486, +2723, 1844, 2477, +2713, 1875, 2464, +2699, 1914, 2445, +2680, 1961, 2420, +2653, 2017, 2383, +2614, 2083, 2329, +2556, 2158, 2244, +2466, 2242, 2099, +2306, 2335, 1782, +1932, 2435, 0, +0, 2542, 0, +0, 2654, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +2887, 1835, 2633, +2886, 1836, 2633, +2886, 1838, 2633, +2886, 1839, 2632, +2885, 1842, 2631, +2884, 1845, 2630, +2884, 1849, 2629, +2882, 1855, 2628, +2881, 1862, 2625, +2878, 1872, 2623, +2875, 1884, 2619, +2871, 1900, 2613, +2866, 1921, 2606, +2859, 1948, 2596, +2849, 1981, 2582, +2835, 2021, 2564, +2816, 2071, 2537, +2789, 2130, 2499, +2751, 2198, 2443, +2694, 2275, 2355, +2604, 2362, 2201, +2447, 2457, 1852, +2084, 2559, 0, +0, 2668, 0, +0, 2781, 0, +0, 2899, 0, +0, 3020, 0, +0, 3143, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +3021, 1937, 2757, +3021, 1938, 2756, +3021, 1939, 2756, +3021, 1940, 2756, +3020, 1942, 2755, +3020, 1945, 2754, +3019, 1948, 2754, +3018, 1953, 2752, +3017, 1959, 2751, +3015, 1966, 2748, +3013, 1977, 2745, +3010, 1990, 2741, +3006, 2007, 2736, +3001, 2029, 2728, +2994, 2057, 2718, +2984, 2092, 2705, +2970, 2134, 2685, +2951, 2186, 2658, +2924, 2247, 2619, +2886, 2317, 2561, +2830, 2397, 2470, +2741, 2485, 2310, +2586, 2582, 1931, +2231, 2685, 0, +0, 2795, 0, +0, 2910, 0, +0, 3028, 0, +0, 3150, 0, +0, 3274, 0, +0, 3400, 0, +0, 3527, 0, +0, 3656, 0, +3155, 2045, 2882, +3155, 2046, 2882, +3155, 2047, 2882, +3155, 2048, 2881, +3155, 2049, 2881, +3154, 2051, 2880, +3154, 2054, 2880, +3153, 2057, 2879, +3152, 2062, 2877, +3151, 2068, 2876, +3149, 2077, 2874, +3147, 2087, 2870, +3144, 2101, 2866, +3140, 2119, 2861, +3135, 2142, 2853, +3128, 2171, 2843, +3118, 2207, 2829, +3104, 2251, 2809, +3085, 2304, 2782, +3059, 2367, 2742, +3021, 2439, 2683, +2965, 2520, 2589, +2877, 2610, 2423, +2723, 2708, 2020, +2374, 2813, 0, +0, 2924, 0, +0, 3039, 0, +0, 3158, 0, +0, 3280, 0, +0, 3405, 0, +0, 3531, 0, +0, 3659, 0, +3289, 2158, 3009, +3289, 2159, 3009, +3289, 2160, 3009, +3289, 2160, 3009, +3288, 2162, 3008, +3288, 2163, 3008, +3288, 2165, 3007, +3287, 2168, 3007, +3287, 2172, 3006, +3286, 2177, 3004, +3285, 2183, 3003, +3283, 2192, 3000, +3281, 2203, 2997, +3278, 2217, 2993, +3274, 2236, 2988, +3269, 2259, 2980, +3261, 2289, 2969, +3251, 2326, 2955, +3238, 2372, 2935, +3219, 2426, 2907, +3193, 2490, 2867, +3155, 2563, 2807, +3099, 2646, 2711, +3011, 2737, 2541, +2859, 2836, 2116, +2514, 2942, 0, +0, 3053, 0, +0, 3169, 0, +0, 3289, 0, +0, 3411, 0, +0, 3536, 0, +0, 3662, 0, +3422, 2276, 3137, +3422, 2276, 3137, +3422, 2277, 3137, +3422, 2278, 3137, +3422, 2278, 3137, +3422, 2280, 3136, +3421, 2281, 3136, +3421, 2283, 3135, +3420, 2286, 3135, +3420, 2290, 3134, +3419, 2295, 3133, +3418, 2302, 3131, +3416, 2310, 3128, +3414, 2322, 3125, +3411, 2337, 3121, +3407, 2356, 3115, +3402, 2380, 3108, +3394, 2411, 3097, +3385, 2449, 3083, +3371, 2495, 3063, +3352, 2551, 3035, +3326, 2615, 2994, +3289, 2690, 2933, +3233, 2773, 2836, +3145, 2866, 2662, +2994, 2965, 2219, +2652, 3072, 0, +0, 3183, 0, +0, 3300, 0, +0, 3420, 0, +0, 3542, 0, +0, 3667, 0, +3555, 2397, 3267, +3555, 2397, 3266, +3555, 2398, 3266, +3555, 2398, 3266, +3555, 2399, 3266, +3555, 2400, 3266, +3555, 2401, 3266, +3554, 2403, 3265, +3554, 2405, 3265, +3553, 2408, 3264, +3553, 2412, 3263, +3552, 2417, 3262, +3551, 2423, 3260, +3549, 2432, 3258, +3547, 2444, 3254, +3544, 2459, 3250, +3540, 2479, 3245, +3535, 2504, 3237, +3527, 2535, 3226, +3518, 2573, 3212, +3504, 2621, 3191, +3485, 2677, 3163, +3459, 2742, 3122, +3422, 2818, 3060, +3366, 2902, 2962, +3279, 2995, 2786, +3128, 3095, 2329, +2788, 3202, 0, +0, 3314, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +3688, 2520, 3396, +3688, 2521, 3396, +3688, 2521, 3396, +3688, 2521, 3396, +3688, 2522, 3396, +3688, 2522, 3396, +3687, 2523, 3396, +3687, 2525, 3395, +3687, 2526, 3395, +3687, 2529, 3394, +3686, 2532, 3394, +3685, 2536, 3393, +3684, 2541, 3391, +3683, 2548, 3390, +3682, 2557, 3387, +3679, 2569, 3384, +3677, 2584, 3380, +3673, 2604, 3374, +3667, 2629, 3366, +3660, 2661, 3356, +3650, 2700, 3341, +3637, 2748, 3321, +3618, 2804, 3292, +3592, 2871, 3251, +3555, 2946, 3189, +3499, 3031, 3090, +3412, 3125, 2912, +3262, 3225, 2443, +2923, 3332, 0, +0, 3445, 0, +0, 3562, 0, +0, 3682, 0, +3820, 2646, 3527, +3820, 2646, 3527, +3820, 2646, 3527, +3820, 2647, 3527, +3820, 2647, 3527, +3820, 2648, 3527, +3820, 2648, 3526, +3820, 2649, 3526, +3820, 2651, 3526, +3819, 2652, 3525, +3819, 2654, 3525, +3819, 2658, 3524, +3818, 2662, 3523, +3817, 2667, 3522, +3816, 2674, 3520, +3814, 2683, 3518, +3812, 2695, 3515, +3809, 2711, 3510, +3805, 2731, 3505, +3800, 2756, 3497, +3793, 2788, 3486, +3783, 2828, 3471, +3769, 2876, 3451, +3751, 2933, 3422, +3725, 3000, 3381, +3687, 3076, 3318, +3632, 3161, 3219, +3545, 3255, 3039, +3395, 3356, 2562, +3058, 3463, 0, +0, 3576, 0, +0, 3693, 0, +3953, 2773, 3658, +3953, 2773, 3658, +3953, 2773, 3658, +3953, 2774, 3658, +3953, 2774, 3658, +3953, 2774, 3658, +3953, 2775, 3657, +3953, 2776, 3657, +3952, 2777, 3657, +3952, 2778, 3657, +3952, 2780, 3656, +3952, 2782, 3656, +3951, 2785, 3655, +3950, 2789, 3654, +3949, 2794, 3653, +3948, 2801, 3651, +3947, 2811, 3649, +3944, 2823, 3645, +3942, 2839, 3641, +3938, 2859, 3635, +3932, 2885, 3628, +3925, 2917, 3617, +3915, 2957, 3602, +3902, 3005, 3582, +3883, 3063, 3553, +3857, 3130, 3511, +3820, 3206, 3449, +3764, 3292, 3349, +3678, 3386, 3167, +3528, 3487, 2683, +3192, 3595, 0, +0, 3708, 0, +4085, 2901, 3789, +4085, 2902, 3789, +4085, 2902, 3789, +4085, 2902, 3789, +4085, 2902, 3789, +4085, 2902, 3789, +4085, 2903, 3789, +4085, 2903, 3789, +4085, 2904, 3788, +4085, 2905, 3788, +4085, 2906, 3788, +4084, 2908, 3787, +4084, 2910, 3787, +4083, 2913, 3786, +4083, 2918, 3785, +4082, 2923, 3784, +4081, 2930, 3782, +4079, 2939, 3780, +4077, 2952, 3777, +4074, 2968, 3772, +4070, 2988, 3767, +4065, 3014, 3759, +4058, 3046, 3748, +4048, 3086, 3733, +4034, 3135, 3713, +4016, 3193, 3684, +3990, 3260, 3642, +3952, 3337, 3579, +3897, 3423, 3479, +3810, 3517, 3297, +3660, 3618, 2807, +3325, 3726, 0, +4095, 3031, 3920, +4095, 3031, 3920, +4095, 3031, 3920, +4095, 3031, 3920, +4095, 3031, 3920, +4095, 3031, 3920, +4095, 3032, 3920, +4095, 3032, 3920, +4095, 3033, 3920, +4095, 3033, 3920, +4095, 3034, 3920, +4095, 3036, 3919, +4095, 3037, 3919, +4095, 3040, 3918, +4095, 3043, 3918, +4095, 3047, 3917, +4095, 3052, 3915, +4095, 3060, 3914, +4095, 3069, 3911, +4095, 3081, 3908, +4095, 3097, 3904, +4095, 3118, 3898, +4095, 3144, 3890, +4095, 3176, 3879, +4095, 3217, 3864, +4095, 3265, 3844, +4095, 3323, 3815, +4095, 3391, 3773, +4085, 3468, 3710, +4029, 3554, 3610, +3943, 3648, 3427, +3793, 3750, 2933, +4095, 3161, 4052, +4095, 3161, 4052, +4095, 3161, 4052, +4095, 3161, 4052, +4095, 3161, 4052, +4095, 3161, 4052, +4095, 3161, 4052, +4095, 3162, 4052, +4095, 3162, 4052, +4095, 3163, 4052, +4095, 3163, 4051, +4095, 3164, 4051, +4095, 3166, 4051, +4095, 3168, 4050, +4095, 3170, 4050, +4095, 3173, 4049, +4095, 3177, 4048, +4095, 3183, 4047, +4095, 3190, 4045, +4095, 3199, 4043, +4095, 3212, 4040, +4095, 3228, 4035, +4095, 3248, 4029, +4095, 3274, 4022, +4095, 3307, 4011, +4095, 3347, 3996, +4095, 3396, 3975, +4095, 3454, 3946, +4095, 3522, 3904, +4095, 3599, 3841, +4095, 3685, 3741, +4075, 3780, 3557, +0, 1347, 1608, +0, 1350, 1606, +0, 1354, 1602, +0, 1359, 1597, +0, 1365, 1590, +0, 1374, 1581, +0, 1386, 1569, +0, 1401, 1552, +0, 1421, 1528, +0, 1446, 1494, +0, 1477, 1444, +0, 1516, 1367, +0, 1563, 1239, +0, 1619, 979, +0, 1685, 0, +0, 1760, 0, +0, 1845, 0, +0, 1938, 0, +0, 2038, 0, +0, 2145, 0, +0, 2257, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +0, 1348, 1612, +0, 1351, 1610, +0, 1354, 1606, +0, 1360, 1601, +0, 1366, 1595, +0, 1375, 1586, +0, 1387, 1573, +0, 1402, 1557, +0, 1422, 1533, +0, 1447, 1499, +0, 1478, 1450, +0, 1516, 1374, +0, 1564, 1248, +0, 1620, 995, +0, 1685, 0, +0, 1761, 0, +0, 1845, 0, +0, 1938, 0, +0, 2038, 0, +0, 2145, 0, +0, 2257, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +0, 1349, 1618, +0, 1352, 1615, +0, 1356, 1611, +0, 1361, 1607, +0, 1368, 1600, +0, 1377, 1591, +0, 1388, 1579, +0, 1403, 1563, +0, 1423, 1539, +0, 1448, 1506, +0, 1479, 1457, +0, 1517, 1383, +0, 1564, 1260, +0, 1620, 1015, +0, 1686, 0, +0, 1761, 0, +0, 1845, 0, +0, 1938, 0, +0, 2038, 0, +0, 2145, 0, +0, 2257, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +0, 1351, 1625, +0, 1354, 1622, +0, 1358, 1619, +0, 1363, 1614, +0, 1369, 1607, +0, 1378, 1599, +0, 1390, 1587, +0, 1405, 1570, +0, 1424, 1548, +0, 1449, 1515, +0, 1480, 1467, +0, 1519, 1395, +0, 1565, 1275, +0, 1621, 1041, +0, 1687, 0, +0, 1762, 0, +0, 1846, 0, +0, 1939, 0, +0, 2039, 0, +0, 2145, 0, +0, 2258, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +0, 1353, 1634, +0, 1356, 1631, +0, 1360, 1628, +0, 1365, 1623, +0, 1372, 1617, +0, 1381, 1608, +0, 1392, 1597, +0, 1407, 1581, +0, 1426, 1558, +0, 1451, 1527, +0, 1482, 1480, +0, 1520, 1410, +0, 1567, 1295, +0, 1623, 1074, +0, 1688, 244, +0, 1763, 0, +0, 1847, 0, +0, 1939, 0, +0, 2039, 0, +0, 2146, 0, +0, 2258, 0, +0, 2374, 0, +0, 2494, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3386, 0, +0, 3517, 0, +0, 3648, 0, +0, 1356, 1646, +0, 1359, 1643, +0, 1363, 1640, +0, 1368, 1636, +0, 1375, 1629, +0, 1383, 1621, +0, 1395, 1610, +0, 1410, 1594, +0, 1429, 1573, +0, 1453, 1542, +0, 1484, 1497, +0, 1522, 1430, +0, 1569, 1320, +0, 1624, 1114, +0, 1690, 449, +0, 1764, 0, +0, 1848, 0, +0, 1940, 0, +0, 2040, 0, +0, 2146, 0, +0, 2258, 0, +0, 2375, 0, +0, 2495, 0, +0, 2617, 0, +0, 2742, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3648, 0, +0, 1360, 1662, +0, 1363, 1659, +0, 1367, 1656, +0, 1372, 1652, +0, 1379, 1646, +0, 1387, 1638, +0, 1399, 1627, +0, 1414, 1612, +0, 1433, 1591, +0, 1457, 1561, +0, 1487, 1519, +0, 1525, 1455, +0, 1572, 1351, +0, 1627, 1162, +0, 1692, 629, +0, 1766, 0, +0, 1849, 0, +0, 1941, 0, +0, 2041, 0, +0, 2147, 0, +0, 2259, 0, +0, 2375, 0, +0, 2495, 0, +0, 2618, 0, +0, 2743, 0, +0, 2869, 0, +0, 2997, 0, +0, 3126, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3648, 0, +0, 1366, 1682, +0, 1369, 1679, +0, 1373, 1676, +0, 1377, 1672, +0, 1384, 1666, +0, 1393, 1659, +0, 1404, 1648, +0, 1418, 1634, +0, 1437, 1614, +0, 1461, 1586, +0, 1492, 1546, +0, 1529, 1486, +0, 1575, 1390, +0, 1630, 1220, +0, 1694, 795, +0, 1768, 0, +0, 1851, 0, +0, 1943, 0, +0, 2042, 0, +0, 2148, 0, +0, 2260, 0, +0, 2376, 0, +0, 2495, 0, +0, 2618, 0, +0, 2743, 0, +0, 2870, 0, +0, 2998, 0, +0, 3127, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3649, 0, +0, 1373, 1707, +0, 1376, 1705, +0, 1380, 1702, +0, 1385, 1698, +0, 1391, 1693, +0, 1399, 1686, +0, 1411, 1676, +0, 1425, 1662, +0, 1444, 1644, +0, 1467, 1618, +0, 1497, 1580, +0, 1534, 1525, +0, 1580, 1438, +0, 1634, 1287, +0, 1698, 950, +0, 1771, 0, +0, 1854, 0, +0, 1945, 0, +0, 2044, 0, +0, 2149, 0, +0, 2261, 0, +0, 2377, 0, +0, 2496, 0, +0, 2619, 0, +0, 2743, 0, +0, 2870, 0, +0, 2998, 0, +0, 3127, 0, +0, 3256, 0, +0, 3387, 0, +0, 3517, 0, +0, 3649, 0, +817, 1383, 1739, +796, 1385, 1737, +767, 1389, 1734, +725, 1394, 1731, +662, 1400, 1726, +560, 1408, 1719, +375, 1419, 1710, +0, 1433, 1698, +0, 1452, 1680, +0, 1475, 1656, +0, 1504, 1622, +0, 1541, 1572, +0, 1586, 1494, +0, 1639, 1364, +0, 1702, 1098, +0, 1775, 0, +0, 1857, 0, +0, 1948, 0, +0, 2046, 0, +0, 2151, 0, +0, 2262, 0, +0, 2378, 0, +0, 2497, 0, +0, 2619, 0, +0, 2744, 0, +0, 2870, 0, +0, 2998, 0, +0, 3127, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +1204, 1395, 1779, +1195, 1398, 1777, +1183, 1401, 1775, +1166, 1406, 1771, +1143, 1412, 1767, +1111, 1420, 1761, +1063, 1431, 1752, +990, 1445, 1741, +870, 1462, 1725, +635, 1485, 1704, +0, 1514, 1673, +0, 1550, 1628, +0, 1594, 1560, +0, 1646, 1450, +0, 1709, 1243, +0, 1780, 567, +0, 1861, 0, +0, 1951, 0, +0, 2049, 0, +0, 2154, 0, +0, 2264, 0, +0, 2379, 0, +0, 2498, 0, +0, 2620, 0, +0, 2744, 0, +0, 2871, 0, +0, 2998, 0, +0, 3127, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +1462, 1411, 1827, +1457, 1414, 1825, +1450, 1417, 1823, +1441, 1422, 1820, +1429, 1428, 1816, +1412, 1436, 1811, +1388, 1446, 1803, +1354, 1459, 1793, +1304, 1476, 1779, +1227, 1498, 1760, +1098, 1526, 1733, +836, 1561, 1694, +0, 1604, 1636, +0, 1656, 1544, +0, 1717, 1383, +0, 1787, 1003, +0, 1867, 0, +0, 1956, 0, +0, 2053, 0, +0, 2157, 0, +0, 2266, 0, +0, 2381, 0, +0, 2499, 0, +0, 2621, 0, +0, 2745, 0, +0, 2871, 0, +0, 2999, 0, +0, 3128, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +1670, 1432, 1884, +1667, 1435, 1883, +1663, 1438, 1881, +1657, 1442, 1878, +1649, 1448, 1875, +1639, 1455, 1870, +1624, 1465, 1863, +1604, 1478, 1854, +1576, 1494, 1842, +1536, 1516, 1826, +1475, 1543, 1802, +1378, 1576, 1769, +1206, 1618, 1720, +769, 1668, 1646, +0, 1728, 1522, +0, 1797, 1276, +0, 1875, 0, +0, 1962, 0, +0, 2058, 0, +0, 2161, 0, +0, 2270, 0, +0, 2383, 0, +0, 2501, 0, +0, 2623, 0, +0, 2746, 0, +0, 2872, 0, +0, 3000, 0, +0, 3128, 0, +0, 3257, 0, +0, 3387, 0, +0, 3518, 0, +0, 3649, 0, +1851, 1458, 1951, +1849, 1461, 1950, +1847, 1464, 1948, +1843, 1468, 1946, +1838, 1473, 1943, +1831, 1480, 1939, +1821, 1490, 1933, +1809, 1502, 1925, +1791, 1517, 1915, +1766, 1538, 1901, +1730, 1563, 1881, +1678, 1596, 1853, +1597, 1636, 1813, +1459, 1684, 1753, +1167, 1741, 1659, +0, 1809, 1491, +0, 1885, 1074, +0, 1971, 0, +0, 2065, 0, +0, 2166, 0, +0, 2274, 0, +0, 2387, 0, +0, 2504, 0, +0, 2625, 0, +0, 2748, 0, +0, 2873, 0, +0, 3000, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +2017, 1491, 2027, +2016, 1494, 2026, +2014, 1496, 2025, +2011, 1500, 2023, +2008, 1505, 2020, +2003, 1512, 2017, +1997, 1520, 2012, +1988, 1532, 2006, +1976, 1547, 1997, +1960, 1566, 1985, +1937, 1590, 1969, +1904, 1620, 1946, +1856, 1658, 1914, +1784, 1704, 1867, +1664, 1759, 1794, +1430, 1824, 1676, +367, 1898, 1445, +0, 1982, 454, +0, 2074, 0, +0, 2173, 0, +0, 2279, 0, +0, 2391, 0, +0, 2507, 0, +0, 2627, 0, +0, 2750, 0, +0, 2875, 0, +0, 3002, 0, +0, 3130, 0, +0, 3259, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +2173, 1532, 2113, +2172, 1534, 2112, +2171, 1537, 2111, +2169, 1540, 2109, +2166, 1545, 2107, +2163, 1551, 2104, +2158, 1559, 2100, +2152, 1569, 2095, +2144, 1583, 2088, +2133, 1600, 2078, +2117, 1623, 2065, +2096, 1651, 2047, +2065, 1687, 2021, +2021, 1730, 1984, +1953, 1782, 1929, +1844, 1844, 1844, +1639, 1915, 1698, +988, 1996, 1375, +0, 2085, 0, +0, 2183, 0, +0, 2287, 0, +0, 2397, 0, +0, 2512, 0, +0, 2631, 0, +0, 2753, 0, +0, 2877, 0, +0, 3003, 0, +0, 3131, 0, +0, 3259, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +2322, 1581, 2206, +2321, 1583, 2206, +2320, 1585, 2205, +2319, 1588, 2204, +2317, 1593, 2202, +2315, 1598, 2199, +2312, 1605, 2196, +2307, 1615, 2192, +2301, 1627, 2186, +2293, 1643, 2179, +2283, 1663, 2168, +2268, 1690, 2153, +2247, 1722, 2133, +2218, 1763, 2105, +2175, 1811, 2063, +2111, 1870, 2001, +2009, 1937, 1903, +1822, 2014, 1725, +1302, 2100, 1261, +0, 2195, 0, +0, 2297, 0, +0, 2405, 0, +0, 2518, 0, +0, 2635, 0, +0, 2756, 0, +0, 2880, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2466, 1640, 2308, +2466, 1641, 2307, +2465, 1643, 2306, +2464, 1646, 2305, +2463, 1650, 2304, +2461, 1655, 2302, +2459, 1661, 2299, +2456, 1669, 2296, +2451, 1680, 2292, +2446, 1694, 2285, +2438, 1713, 2277, +2427, 1736, 2266, +2413, 1766, 2250, +2393, 1803, 2228, +2364, 1848, 2197, +2323, 1902, 2152, +2262, 1965, 2083, +2164, 2038, 1971, +1988, 2120, 1760, +1534, 2211, 1044, +0, 2309, 0, +0, 2415, 0, +0, 2526, 0, +0, 2641, 0, +0, 2761, 0, +0, 2883, 0, +0, 3008, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +2607, 1708, 2415, +2607, 1709, 2415, +2607, 1711, 2414, +2606, 1713, 2413, +2605, 1716, 2412, +2604, 1721, 2411, +2602, 1726, 2409, +2600, 1733, 2406, +2597, 1743, 2402, +2592, 1755, 2398, +2587, 1771, 2391, +2579, 1792, 2382, +2569, 1818, 2370, +2555, 1851, 2353, +2535, 1892, 2330, +2507, 1941, 2297, +2467, 1999, 2248, +2407, 2067, 2173, +2313, 2145, 2049, +2144, 2231, 1802, +1729, 2326, 267, +0, 2428, 0, +0, 2536, 0, +0, 2649, 0, +0, 2767, 0, +0, 2888, 0, +0, 3011, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +2746, 1785, 2528, +2746, 1786, 2528, +2745, 1788, 2527, +2745, 1790, 2526, +2744, 1793, 2526, +2743, 1796, 2524, +2742, 1801, 2523, +2740, 1807, 2521, +2738, 1815, 2518, +2735, 1826, 2514, +2731, 1839, 2509, +2726, 1857, 2502, +2718, 1880, 2493, +2708, 1909, 2480, +2694, 1945, 2463, +2674, 1989, 2438, +2647, 2042, 2403, +2608, 2104, 2351, +2549, 2176, 2271, +2457, 2257, 2136, +2294, 2347, 1853, +1903, 2445, 0, +0, 2549, 0, +0, 2660, 0, +0, 2775, 0, +0, 2894, 0, +0, 3016, 0, +0, 3141, 0, +0, 3267, 0, +0, 3395, 0, +0, 3523, 0, +0, 3653, 0, +2883, 1872, 2645, +2883, 1873, 2645, +2883, 1874, 2644, +2882, 1876, 2644, +2882, 1878, 2643, +2881, 1881, 2642, +2880, 1885, 2641, +2879, 1890, 2640, +2877, 1897, 2637, +2875, 1905, 2635, +2872, 1917, 2631, +2868, 1932, 2625, +2862, 1952, 2618, +2855, 1976, 2609, +2845, 2008, 2596, +2831, 2046, 2577, +2812, 2093, 2552, +2785, 2149, 2515, +2746, 2215, 2461, +2688, 2290, 2376, +2598, 2374, 2231, +2438, 2467, 1914, +2064, 2567, 0, +0, 2674, 0, +0, 2786, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3271, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +3019, 1967, 2766, +3019, 1967, 2765, +3018, 1968, 2765, +3018, 1970, 2765, +3018, 1971, 2764, +3017, 1974, 2763, +3017, 1977, 2763, +3016, 1981, 2761, +3014, 1987, 2760, +3013, 1994, 2758, +3011, 2004, 2755, +3008, 2016, 2751, +3004, 2032, 2745, +2998, 2053, 2738, +2991, 2080, 2728, +2981, 2113, 2715, +2967, 2154, 2696, +2948, 2203, 2669, +2921, 2262, 2631, +2883, 2330, 2575, +2826, 2408, 2487, +2736, 2494, 2334, +2580, 2589, 1984, +2216, 2691, 0, +0, 2800, 0, +0, 2913, 0, +0, 3031, 0, +0, 3152, 0, +0, 3275, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3154, 2069, 2889, +3153, 2069, 2889, +3153, 2070, 2888, +3153, 2071, 2888, +3153, 2072, 2888, +3152, 2074, 2887, +3152, 2077, 2887, +3151, 2080, 2886, +3150, 2085, 2884, +3149, 2091, 2883, +3147, 2098, 2881, +3145, 2109, 2878, +3142, 2122, 2873, +3138, 2139, 2868, +3133, 2161, 2861, +3126, 2189, 2850, +3116, 2224, 2837, +3102, 2266, 2817, +3083, 2318, 2790, +3057, 2379, 2751, +3018, 2449, 2693, +2962, 2529, 2602, +2873, 2617, 2442, +2718, 2714, 2063, +2363, 2818, 0, +0, 2927, 0, +0, 3042, 0, +0, 3160, 0, +0, 3282, 0, +0, 3406, 0, +0, 3532, 0, +0, 3659, 0, +3288, 2177, 3014, +3288, 2177, 3014, +3287, 2178, 3014, +3287, 2179, 3014, +3287, 2180, 3013, +3287, 2181, 3013, +3286, 2183, 3012, +3286, 2186, 3012, +3285, 2190, 3011, +3284, 2194, 3010, +3283, 2200, 3008, +3281, 2209, 3006, +3279, 2219, 3003, +3276, 2233, 2998, +3272, 2251, 2993, +3267, 2274, 2985, +3260, 2303, 2975, +3250, 2339, 2961, +3236, 2383, 2941, +3217, 2437, 2914, +3191, 2499, 2874, +3153, 2571, 2815, +3097, 2652, 2721, +3009, 2743, 2556, +2855, 2840, 2152, +2506, 2945, 0, +0, 3056, 0, +0, 3171, 0, +0, 3290, 0, +0, 3412, 0, +0, 3537, 0, +0, 3663, 0, +3421, 2290, 3141, +3421, 2291, 3141, +3421, 2291, 3141, +3421, 2292, 3141, +3421, 2293, 3141, +3421, 2294, 3140, +3420, 2295, 3140, +3420, 2297, 3139, +3419, 2300, 3139, +3419, 2304, 3138, +3418, 2309, 3136, +3417, 2315, 3135, +3415, 2324, 3132, +3413, 2335, 3129, +3410, 2349, 3125, +3406, 2368, 3120, +3401, 2392, 3112, +3393, 2421, 3102, +3384, 2459, 3087, +3370, 2504, 3067, +3351, 2558, 3039, +3325, 2622, 2999, +3287, 2696, 2939, +3231, 2778, 2844, +3143, 2869, 2673, +2991, 2968, 2248, +2646, 3074, 0, +0, 3185, 0, +0, 3301, 0, +0, 3421, 0, +0, 3543, 0, +0, 3668, 0, +3554, 2408, 3269, +3554, 2408, 3269, +3554, 2408, 3269, +3554, 2409, 3269, +3554, 2410, 3269, +3554, 2411, 3269, +3554, 2412, 3268, +3553, 2413, 3268, +3553, 2416, 3268, +3553, 2418, 3267, +3552, 2422, 3266, +3551, 2427, 3265, +3550, 2434, 3263, +3548, 2443, 3261, +3546, 2454, 3257, +3543, 2469, 3253, +3539, 2488, 3248, +3534, 2512, 3240, +3527, 2543, 3229, +3517, 2581, 3215, +3503, 2627, 3195, +3485, 2683, 3167, +3458, 2747, 3126, +3421, 2822, 3065, +3365, 2905, 2968, +3277, 2998, 2794, +3126, 3097, 2352, +2784, 3204, 0, +0, 3315, 0, +0, 3432, 0, +0, 3552, 0, +0, 3674, 0, +3687, 2529, 3399, +3687, 2529, 3399, +3687, 2529, 3399, +3687, 2530, 3398, +3687, 2530, 3398, +3687, 2531, 3398, +3687, 2532, 3398, +3687, 2533, 3398, +3686, 2535, 3397, +3686, 2537, 3397, +3685, 2540, 3396, +3685, 2544, 3395, +3684, 2549, 3394, +3683, 2556, 3392, +3681, 2565, 3390, +3679, 2576, 3387, +3676, 2591, 3382, +3672, 2611, 3377, +3667, 2636, 3369, +3660, 2667, 3358, +3650, 2706, 3344, +3636, 2753, 3324, +3618, 2809, 3295, +3591, 2874, 3254, +3554, 2950, 3192, +3498, 3034, 3094, +3411, 3127, 2918, +3260, 3227, 2461, +2920, 3334, 0, +0, 3446, 0, +0, 3563, 0, +0, 3683, 0, +3820, 2652, 3529, +3820, 2652, 3529, +3820, 2653, 3528, +3820, 2653, 3528, +3820, 2653, 3528, +3820, 2654, 3528, +3820, 2655, 3528, +3820, 2656, 3528, +3819, 2657, 3528, +3819, 2658, 3527, +3819, 2661, 3527, +3818, 2664, 3526, +3817, 2668, 3525, +3817, 2673, 3524, +3815, 2680, 3522, +3814, 2689, 3519, +3812, 2701, 3516, +3809, 2716, 3512, +3805, 2736, 3506, +3799, 2761, 3499, +3792, 2793, 3488, +3782, 2832, 3473, +3769, 2880, 3453, +3750, 2936, 3424, +3724, 3003, 3383, +3687, 3078, 3321, +3631, 3163, 3222, +3544, 3257, 3044, +3394, 3357, 2575, +3056, 3465, 0, +0, 3577, 0, +0, 3694, 0, +3953, 2778, 3659, +3953, 2778, 3659, +3953, 2778, 3659, +3953, 2778, 3659, +3952, 2779, 3659, +3952, 2779, 3659, +3952, 2780, 3659, +3952, 2780, 3658, +3952, 2781, 3658, +3952, 2783, 3658, +3952, 2784, 3658, +3951, 2787, 3657, +3951, 2790, 3656, +3950, 2794, 3655, +3949, 2799, 3654, +3948, 2806, 3652, +3946, 2815, 3650, +3944, 2827, 3647, +3941, 2843, 3642, +3937, 2863, 3637, +3932, 2888, 3629, +3925, 2920, 3618, +3915, 2960, 3604, +3902, 3008, 3583, +3883, 3065, 3554, +3857, 3132, 3513, +3819, 3208, 3450, +3764, 3293, 3351, +3677, 3387, 3171, +3527, 3488, 2694, +3190, 3596, 0, +0, 3708, 0, +4085, 2905, 3790, +4085, 2905, 3790, +4085, 2905, 3790, +4085, 2905, 3790, +4085, 2906, 3790, +4085, 2906, 3790, +4085, 2906, 3790, +4085, 2907, 3789, +4085, 2908, 3789, +4084, 2909, 3789, +4084, 2910, 3789, +4084, 2912, 3788, +4084, 2914, 3788, +4083, 2917, 3787, +4082, 2921, 3786, +4082, 2926, 3785, +4080, 2933, 3783, +4079, 2943, 3781, +4077, 2955, 3778, +4074, 2971, 3773, +4070, 2991, 3768, +4064, 3017, 3760, +4057, 3049, 3749, +4047, 3089, 3734, +4034, 3137, 3714, +4015, 3195, 3685, +3989, 3262, 3643, +3952, 3338, 3581, +3896, 3424, 3481, +3810, 3518, 3299, +3660, 3619, 2815, +3324, 3727, 0, +4095, 3033, 3921, +4095, 3034, 3921, +4095, 3034, 3921, +4095, 3034, 3921, +4095, 3034, 3921, +4095, 3034, 3921, +4095, 3034, 3921, +4095, 3035, 3921, +4095, 3035, 3921, +4095, 3036, 3920, +4095, 3037, 3920, +4095, 3038, 3920, +4095, 3040, 3920, +4095, 3042, 3919, +4095, 3046, 3918, +4095, 3050, 3917, +4095, 3055, 3916, +4095, 3062, 3914, +4095, 3072, 3912, +4095, 3084, 3909, +4095, 3100, 3904, +4095, 3120, 3899, +4095, 3146, 3891, +4095, 3178, 3880, +4095, 3218, 3865, +4095, 3267, 3845, +4095, 3325, 3816, +4095, 3392, 3774, +4084, 3469, 3711, +4029, 3555, 3611, +3942, 3649, 3429, +3793, 3751, 2939, +4095, 3163, 4053, +4095, 3163, 4052, +4095, 3163, 4052, +4095, 3163, 4052, +4095, 3163, 4052, +4095, 3163, 4052, +4095, 3164, 4052, +4095, 3164, 4052, +4095, 3164, 4052, +4095, 3165, 4052, +4095, 3166, 4052, +4095, 3167, 4052, +4095, 3168, 4051, +4095, 3170, 4051, +4095, 3172, 4050, +4095, 3175, 4050, +4095, 3179, 4049, +4095, 3185, 4047, +4095, 3192, 4046, +4095, 3201, 4043, +4095, 3213, 4040, +4095, 3229, 4036, +4095, 3250, 4030, +4095, 3276, 4022, +4095, 3308, 4011, +4095, 3349, 3997, +4095, 3397, 3976, +4095, 3455, 3947, +4095, 3523, 3905, +4095, 3600, 3842, +4095, 3686, 3742, +4075, 3780, 3559, +0, 1476, 1739, +0, 1478, 1737, +0, 1481, 1735, +0, 1485, 1731, +0, 1490, 1726, +0, 1497, 1719, +0, 1506, 1710, +0, 1518, 1698, +0, 1533, 1681, +0, 1552, 1657, +0, 1577, 1622, +0, 1609, 1572, +0, 1647, 1494, +0, 1695, 1365, +0, 1751, 1099, +0, 1817, 0, +0, 1892, 0, +0, 1976, 0, +0, 2069, 0, +0, 2170, 0, +0, 2277, 0, +0, 2389, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3518, 0, +0, 3649, 0, +0, 1477, 1742, +0, 1479, 1740, +0, 1482, 1738, +0, 1486, 1734, +0, 1491, 1729, +0, 1498, 1723, +0, 1507, 1713, +0, 1518, 1701, +0, 1533, 1684, +0, 1553, 1660, +0, 1578, 1626, +0, 1609, 1576, +0, 1648, 1500, +0, 1695, 1371, +0, 1751, 1111, +0, 1817, 0, +0, 1892, 0, +0, 1977, 0, +0, 2070, 0, +0, 2170, 0, +0, 2277, 0, +0, 2389, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1478, 1746, +0, 1480, 1744, +0, 1483, 1742, +0, 1487, 1738, +0, 1492, 1733, +0, 1499, 1727, +0, 1507, 1718, +0, 1519, 1706, +0, 1534, 1689, +0, 1554, 1665, +0, 1579, 1631, +0, 1610, 1582, +0, 1649, 1506, +0, 1696, 1380, +0, 1752, 1127, +0, 1818, 0, +0, 1893, 0, +0, 1977, 0, +0, 2070, 0, +0, 2170, 0, +0, 2277, 0, +0, 2389, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1479, 1752, +0, 1481, 1750, +0, 1484, 1747, +0, 1488, 1744, +0, 1493, 1739, +0, 1500, 1732, +0, 1509, 1723, +0, 1520, 1711, +0, 1535, 1695, +0, 1555, 1671, +0, 1580, 1638, +0, 1611, 1590, +0, 1650, 1515, +0, 1696, 1392, +0, 1753, 1147, +0, 1818, 0, +0, 1893, 0, +0, 1978, 0, +0, 2070, 0, +0, 2171, 0, +0, 2277, 0, +0, 2389, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1481, 1759, +0, 1483, 1757, +0, 1486, 1754, +0, 1490, 1751, +0, 1495, 1746, +0, 1502, 1740, +0, 1510, 1731, +0, 1522, 1719, +0, 1537, 1703, +0, 1556, 1680, +0, 1581, 1647, +0, 1612, 1600, +0, 1651, 1527, +0, 1698, 1407, +0, 1754, 1173, +0, 1819, 122, +0, 1894, 0, +0, 1978, 0, +0, 2071, 0, +0, 2171, 0, +0, 2278, 0, +0, 2390, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1483, 1768, +0, 1485, 1766, +0, 1488, 1763, +0, 1492, 1760, +0, 1497, 1755, +0, 1504, 1749, +0, 1513, 1741, +0, 1524, 1729, +0, 1539, 1713, +0, 1558, 1691, +0, 1583, 1659, +0, 1614, 1612, +0, 1652, 1542, +0, 1699, 1427, +0, 1755, 1206, +0, 1820, 376, +0, 1895, 0, +0, 1979, 0, +0, 2071, 0, +0, 2171, 0, +0, 2278, 0, +0, 2390, 0, +0, 2506, 0, +0, 2626, 0, +0, 2749, 0, +0, 2874, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1486, 1780, +0, 1488, 1778, +0, 1491, 1776, +0, 1495, 1772, +0, 1500, 1768, +0, 1507, 1762, +0, 1516, 1753, +0, 1527, 1742, +0, 1542, 1726, +0, 1561, 1705, +0, 1586, 1674, +0, 1616, 1629, +0, 1655, 1562, +0, 1701, 1452, +0, 1757, 1246, +0, 1822, 581, +0, 1896, 0, +0, 1980, 0, +0, 2072, 0, +0, 2172, 0, +0, 2279, 0, +0, 2390, 0, +0, 2507, 0, +0, 2627, 0, +0, 2750, 0, +0, 2875, 0, +0, 3001, 0, +0, 3129, 0, +0, 3258, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1490, 1795, +0, 1493, 1794, +0, 1495, 1791, +0, 1499, 1788, +0, 1504, 1784, +0, 1511, 1778, +0, 1519, 1770, +0, 1531, 1759, +0, 1546, 1744, +0, 1565, 1723, +0, 1589, 1694, +0, 1620, 1651, +0, 1657, 1587, +0, 1704, 1484, +0, 1759, 1294, +0, 1824, 762, +0, 1898, 0, +0, 1981, 0, +0, 2073, 0, +0, 2173, 0, +0, 2279, 0, +0, 2391, 0, +0, 2507, 0, +0, 2627, 0, +0, 2750, 0, +0, 2875, 0, +0, 3001, 0, +0, 3129, 0, +0, 3259, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1496, 1815, +0, 1498, 1814, +0, 1501, 1811, +0, 1505, 1808, +0, 1510, 1804, +0, 1516, 1799, +0, 1525, 1791, +0, 1536, 1781, +0, 1551, 1766, +0, 1569, 1746, +0, 1593, 1718, +0, 1624, 1678, +0, 1661, 1618, +0, 1707, 1522, +0, 1762, 1352, +0, 1826, 927, +0, 1900, 0, +0, 1983, 0, +0, 2075, 0, +0, 2174, 0, +0, 2280, 0, +0, 2392, 0, +0, 2508, 0, +0, 2628, 0, +0, 2750, 0, +0, 2875, 0, +0, 3002, 0, +0, 3130, 0, +0, 3259, 0, +0, 3388, 0, +0, 3519, 0, +0, 3649, 0, +0, 1503, 1841, +0, 1505, 1839, +0, 1508, 1837, +0, 1512, 1834, +0, 1517, 1830, +0, 1523, 1825, +0, 1532, 1818, +0, 1543, 1808, +0, 1557, 1795, +0, 1576, 1776, +0, 1599, 1750, +0, 1629, 1712, +0, 1666, 1657, +0, 1712, 1570, +0, 1766, 1419, +0, 1830, 1082, +0, 1903, 0, +0, 1986, 0, +0, 2077, 0, +0, 2176, 0, +0, 2282, 0, +0, 2393, 0, +0, 2509, 0, +0, 2628, 0, +0, 2751, 0, +0, 2875, 0, +0, 3002, 0, +0, 3130, 0, +0, 3259, 0, +0, 3388, 0, +0, 3519, 0, +0, 3650, 0, +964, 1513, 1873, +949, 1515, 1871, +928, 1518, 1869, +899, 1521, 1867, +857, 1526, 1863, +794, 1532, 1858, +692, 1541, 1851, +507, 1551, 1842, +0, 1566, 1830, +0, 1584, 1813, +0, 1607, 1788, +0, 1637, 1754, +0, 1673, 1704, +0, 1718, 1626, +0, 1771, 1496, +0, 1835, 1231, +0, 1907, 0, +0, 1989, 0, +0, 2080, 0, +0, 2178, 0, +0, 2283, 0, +0, 2394, 0, +0, 2510, 0, +0, 2629, 0, +0, 2751, 0, +0, 2876, 0, +0, 3002, 0, +0, 3130, 0, +0, 3259, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +1342, 1525, 1912, +1336, 1527, 1911, +1327, 1530, 1909, +1315, 1533, 1907, +1299, 1538, 1903, +1276, 1544, 1899, +1243, 1552, 1893, +1195, 1563, 1884, +1123, 1577, 1873, +1003, 1595, 1857, +767, 1617, 1836, +0, 1646, 1805, +0, 1682, 1760, +0, 1726, 1692, +0, 1779, 1582, +0, 1841, 1375, +0, 1912, 699, +0, 1994, 0, +0, 2083, 0, +0, 2181, 0, +0, 2286, 0, +0, 2396, 0, +0, 2511, 0, +0, 2630, 0, +0, 2752, 0, +0, 2877, 0, +0, 3003, 0, +0, 3130, 0, +0, 3259, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +1598, 1542, 1960, +1594, 1543, 1959, +1589, 1546, 1957, +1582, 1549, 1955, +1573, 1554, 1952, +1561, 1560, 1948, +1544, 1568, 1943, +1520, 1578, 1935, +1486, 1591, 1925, +1436, 1608, 1911, +1359, 1631, 1892, +1230, 1659, 1865, +968, 1693, 1826, +0, 1736, 1768, +0, 1788, 1676, +0, 1849, 1516, +0, 1919, 1135, +0, 1999, 0, +0, 2088, 0, +0, 2185, 0, +0, 2289, 0, +0, 2398, 0, +0, 2513, 0, +0, 2632, 0, +0, 2753, 0, +0, 2877, 0, +0, 3003, 0, +0, 3131, 0, +0, 3260, 0, +0, 3389, 0, +0, 3519, 0, +0, 3650, 0, +1804, 1562, 2017, +1802, 1564, 2016, +1799, 1567, 2015, +1795, 1570, 2013, +1789, 1574, 2010, +1781, 1580, 2007, +1771, 1587, 2002, +1756, 1597, 1995, +1737, 1610, 1987, +1708, 1626, 1974, +1668, 1648, 1958, +1607, 1675, 1934, +1511, 1708, 1901, +1338, 1750, 1852, +901, 1800, 1778, +0, 1860, 1654, +0, 1929, 1408, +0, 2007, 0, +0, 2095, 0, +0, 2190, 0, +0, 2293, 0, +0, 2402, 0, +0, 2515, 0, +0, 2633, 0, +0, 2755, 0, +0, 2878, 0, +0, 3004, 0, +0, 3132, 0, +0, 3260, 0, +0, 3389, 0, +0, 3520, 0, +0, 3650, 0, +1985, 1589, 2084, +1983, 1591, 2083, +1981, 1593, 2082, +1979, 1596, 2080, +1975, 1600, 2078, +1970, 1605, 2075, +1963, 1612, 2071, +1953, 1622, 2065, +1941, 1634, 2058, +1923, 1650, 2047, +1898, 1670, 2033, +1862, 1695, 2013, +1810, 1728, 1985, +1729, 1768, 1945, +1591, 1816, 1886, +1299, 1874, 1791, +0, 1941, 1623, +0, 2017, 1207, +0, 2103, 0, +0, 2197, 0, +0, 2298, 0, +0, 2406, 0, +0, 2519, 0, +0, 2636, 0, +0, 2757, 0, +0, 2880, 0, +0, 3005, 0, +0, 3132, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3650, 0, +2150, 1622, 2160, +2149, 1623, 2159, +2148, 1626, 2158, +2146, 1628, 2157, +2143, 1632, 2155, +2140, 1637, 2152, +2135, 1644, 2149, +2129, 1653, 2144, +2120, 1664, 2138, +2108, 1679, 2129, +2092, 1698, 2117, +2069, 1722, 2101, +2036, 1752, 2078, +1989, 1790, 2046, +1916, 1836, 1999, +1796, 1892, 1927, +1562, 1956, 1808, +499, 2030, 1577, +0, 2114, 586, +0, 2206, 0, +0, 2305, 0, +0, 2412, 0, +0, 2523, 0, +0, 2639, 0, +0, 2759, 0, +0, 2882, 0, +0, 3007, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3520, 0, +0, 3651, 0, +2306, 1663, 2246, +2305, 1664, 2245, +2304, 1666, 2244, +2303, 1669, 2243, +2301, 1672, 2241, +2298, 1677, 2239, +2295, 1683, 2236, +2291, 1691, 2232, +2284, 1701, 2227, +2276, 1715, 2220, +2265, 1732, 2210, +2249, 1755, 2197, +2228, 1783, 2179, +2197, 1819, 2153, +2153, 1862, 2116, +2085, 1915, 2061, +1976, 1976, 1976, +1771, 2047, 1830, +1120, 2128, 1507, +0, 2217, 0, +0, 2315, 0, +0, 2419, 0, +0, 2529, 0, +0, 2644, 0, +0, 2763, 0, +0, 2885, 0, +0, 3009, 0, +0, 3135, 0, +0, 3263, 0, +0, 3392, 0, +0, 3521, 0, +0, 3651, 0, +2455, 1712, 2339, +2454, 1713, 2339, +2453, 1715, 2338, +2452, 1717, 2337, +2451, 1721, 2336, +2449, 1725, 2334, +2447, 1730, 2332, +2444, 1737, 2328, +2439, 1747, 2324, +2434, 1759, 2318, +2426, 1775, 2311, +2415, 1796, 2300, +2400, 1822, 2285, +2379, 1854, 2265, +2350, 1895, 2237, +2307, 1944, 2195, +2243, 2002, 2134, +2141, 2069, 2035, +1954, 2146, 1857, +1434, 2233, 1394, +0, 2327, 0, +0, 2429, 0, +0, 2537, 0, +0, 2650, 0, +0, 2767, 0, +0, 2888, 0, +0, 3012, 0, +0, 3137, 0, +0, 3264, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +2599, 1771, 2440, +2598, 1772, 2440, +2598, 1773, 2439, +2597, 1775, 2438, +2596, 1778, 2437, +2595, 1782, 2436, +2593, 1787, 2434, +2591, 1793, 2432, +2588, 1801, 2428, +2584, 1812, 2424, +2578, 1827, 2418, +2570, 1845, 2409, +2560, 1868, 2398, +2545, 1898, 2382, +2525, 1935, 2360, +2496, 1980, 2329, +2455, 2034, 2284, +2394, 2097, 2215, +2296, 2170, 2104, +2120, 2252, 1892, +1666, 2343, 1176, +0, 2441, 0, +0, 2547, 0, +0, 2658, 0, +0, 2773, 0, +0, 2893, 0, +0, 3015, 0, +0, 3140, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3653, 0, +2740, 1839, 2548, +2740, 1840, 2547, +2739, 1841, 2547, +2739, 1843, 2546, +2738, 1845, 2545, +2737, 1848, 2544, +2736, 1853, 2543, +2734, 1858, 2541, +2732, 1865, 2538, +2729, 1875, 2535, +2725, 1887, 2530, +2719, 1903, 2523, +2711, 1924, 2514, +2701, 1950, 2502, +2687, 1983, 2486, +2667, 2024, 2462, +2639, 2073, 2429, +2599, 2132, 2380, +2539, 2199, 2305, +2445, 2277, 2181, +2277, 2363, 1934, +1861, 2458, 400, +0, 2560, 0, +0, 2668, 0, +0, 2781, 0, +0, 2899, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +2878, 1917, 2660, +2878, 1917, 2660, +2878, 1919, 2660, +2878, 1920, 2659, +2877, 1922, 2659, +2876, 1925, 2658, +2875, 1928, 2657, +2874, 1933, 2655, +2872, 1939, 2653, +2870, 1947, 2650, +2867, 1958, 2646, +2863, 1972, 2641, +2858, 1989, 2635, +2850, 2012, 2625, +2840, 2041, 2613, +2826, 2077, 2595, +2807, 2121, 2570, +2779, 2174, 2535, +2740, 2236, 2483, +2681, 2308, 2403, +2589, 2389, 2268, +2426, 2479, 1986, +2035, 2577, 0, +0, 2682, 0, +0, 2792, 0, +0, 2907, 0, +0, 3026, 0, +0, 3148, 0, +0, 3273, 0, +0, 3399, 0, +0, 3527, 0, +0, 3656, 0, +3015, 2003, 2777, +3015, 2004, 2777, +3015, 2005, 2777, +3015, 2006, 2776, +3014, 2008, 2776, +3014, 2010, 2775, +3013, 2013, 2774, +3012, 2017, 2773, +3011, 2022, 2772, +3009, 2029, 2770, +3007, 2038, 2767, +3004, 2049, 2763, +3000, 2064, 2758, +2995, 2084, 2751, +2987, 2108, 2741, +2977, 2140, 2728, +2963, 2178, 2709, +2944, 2225, 2684, +2917, 2281, 2647, +2878, 2347, 2593, +2821, 2422, 2508, +2730, 2506, 2363, +2570, 2599, 2046, +2196, 2699, 0, +0, 2806, 0, +0, 2918, 0, +0, 3034, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3529, 0, +0, 3658, 0, +3151, 2098, 2898, +3151, 2099, 2898, +3151, 2099, 2897, +3150, 2100, 2897, +3150, 2102, 2897, +3150, 2104, 2896, +3149, 2106, 2896, +3149, 2109, 2895, +3148, 2113, 2893, +3147, 2119, 2892, +3145, 2126, 2890, +3143, 2136, 2887, +3140, 2148, 2883, +3136, 2164, 2877, +3130, 2185, 2870, +3123, 2212, 2860, +3113, 2245, 2847, +3099, 2286, 2828, +3080, 2335, 2801, +3053, 2394, 2763, +3015, 2462, 2707, +2958, 2540, 2619, +2868, 2626, 2466, +2712, 2721, 2116, +2349, 2823, 0, +0, 2932, 0, +0, 3045, 0, +0, 3163, 0, +0, 3284, 0, +0, 3407, 0, +0, 3533, 0, +0, 3660, 0, +3286, 2200, 3021, +3286, 2201, 3021, +3286, 2201, 3021, +3285, 2202, 3021, +3285, 2203, 3020, +3285, 2205, 3020, +3284, 2206, 3019, +3284, 2209, 3019, +3283, 2212, 3018, +3282, 2217, 3016, +3281, 2223, 3015, +3280, 2231, 3013, +3277, 2241, 3010, +3274, 2254, 3006, +3270, 2271, 3000, +3265, 2293, 2993, +3258, 2321, 2983, +3248, 2356, 2969, +3234, 2398, 2949, +3215, 2450, 2922, +3189, 2511, 2883, +3151, 2581, 2825, +3094, 2661, 2734, +3005, 2749, 2574, +2850, 2846, 2196, +2495, 2950, 0, +0, 3059, 0, +0, 3174, 0, +0, 3292, 0, +0, 3414, 0, +0, 3538, 0, +0, 3664, 0, +3420, 2309, 3146, +3420, 2309, 3146, +3420, 2309, 3146, +3420, 2310, 3146, +3419, 2311, 3146, +3419, 2312, 3145, +3419, 2313, 3145, +3418, 2315, 3145, +3418, 2318, 3144, +3417, 2322, 3143, +3416, 2326, 3142, +3415, 2333, 3140, +3414, 2341, 3138, +3411, 2351, 3135, +3408, 2365, 3131, +3404, 2383, 3125, +3399, 2406, 3117, +3392, 2435, 3107, +3382, 2471, 3093, +3368, 2516, 3074, +3350, 2569, 3046, +3323, 2631, 3006, +3285, 2703, 2947, +3229, 2785, 2853, +3141, 2875, 2688, +2988, 2973, 2284, +2638, 3077, 0, +0, 3188, 0, +0, 3303, 0, +0, 3422, 0, +0, 3544, 0, +0, 3669, 0, +3553, 2422, 3273, +3553, 2422, 3273, +3553, 2423, 3273, +3553, 2423, 3273, +3553, 2424, 3273, +3553, 2425, 3273, +3553, 2426, 3272, +3552, 2427, 3272, +3552, 2430, 3271, +3552, 2432, 3271, +3551, 2436, 3270, +3550, 2441, 3269, +3549, 2447, 3267, +3547, 2456, 3265, +3545, 2467, 3261, +3542, 2481, 3257, +3538, 2500, 3252, +3533, 2524, 3244, +3525, 2554, 3234, +3516, 2591, 3219, +3502, 2636, 3200, +3483, 2690, 3172, +3457, 2754, 3131, +3419, 2828, 3071, +3363, 2910, 2976, +3275, 3002, 2805, +3123, 3100, 2380, +2778, 3206, 0, +0, 3317, 0, +0, 3433, 0, +0, 3553, 0, +0, 3675, 0, +3687, 2540, 3402, +3687, 2540, 3402, +3686, 2540, 3401, +3686, 2541, 3401, +3686, 2541, 3401, +3686, 2542, 3401, +3686, 2543, 3401, +3686, 2544, 3401, +3686, 2545, 3400, +3685, 2548, 3400, +3685, 2550, 3399, +3684, 2554, 3398, +3683, 2559, 3397, +3682, 2566, 3395, +3680, 2575, 3393, +3678, 2586, 3390, +3675, 2601, 3385, +3671, 2620, 3380, +3666, 2644, 3372, +3659, 2675, 3362, +3649, 2713, 3347, +3635, 2759, 3327, +3617, 2815, 3299, +3590, 2880, 3258, +3553, 2954, 3197, +3497, 3038, 3100, +3410, 3130, 2926, +3258, 3229, 2484, +2916, 3336, 0, +0, 3448, 0, +0, 3564, 0, +0, 3684, 0, +3819, 2661, 3531, +3819, 2661, 3531, +3819, 2661, 3531, +3819, 2661, 3531, +3819, 2662, 3531, +3819, 2662, 3530, +3819, 2663, 3530, +3819, 2664, 3530, +3819, 2665, 3530, +3818, 2667, 3529, +3818, 2669, 3529, +3818, 2672, 3528, +3817, 2676, 3527, +3816, 2681, 3526, +3815, 2688, 3524, +3813, 2697, 3522, +3811, 2708, 3519, +3808, 2723, 3514, +3804, 2743, 3509, +3799, 2768, 3501, +3792, 2799, 3490, +3782, 2838, 3476, +3768, 2885, 3456, +3750, 2941, 3427, +3723, 3007, 3386, +3686, 3082, 3325, +3630, 3166, 3227, +3543, 3259, 3050, +3392, 3359, 2593, +3052, 3466, 0, +0, 3578, 0, +0, 3695, 0, +3952, 2784, 3661, +3952, 2784, 3661, +3952, 2785, 3661, +3952, 2785, 3661, +3952, 2785, 3661, +3952, 2785, 3660, +3952, 2786, 3660, +3952, 2787, 3660, +3952, 2788, 3660, +3951, 2789, 3660, +3951, 2791, 3659, +3951, 2793, 3659, +3950, 2796, 3658, +3950, 2800, 3657, +3949, 2805, 3656, +3947, 2812, 3654, +3946, 2821, 3652, +3944, 2833, 3648, +3941, 2848, 3644, +3937, 2868, 3638, +3932, 2893, 3631, +3924, 2925, 3620, +3915, 2964, 3605, +3901, 3012, 3585, +3882, 3068, 3556, +3856, 3135, 3515, +3819, 3211, 3453, +3763, 3295, 3354, +3676, 3389, 3176, +3526, 3489, 2707, +3188, 3597, 0, +0, 3709, 0, +4085, 2910, 3791, +4085, 2910, 3791, +4085, 2910, 3791, +4085, 2910, 3791, +4085, 2911, 3791, +4085, 2911, 3791, +4085, 2911, 3791, +4084, 2912, 3791, +4084, 2912, 3791, +4084, 2913, 3790, +4084, 2915, 3790, +4084, 2916, 3790, +4083, 2919, 3789, +4083, 2922, 3788, +4082, 2926, 3787, +4081, 2931, 3786, +4080, 2938, 3784, +4078, 2947, 3782, +4076, 2959, 3779, +4073, 2975, 3775, +4069, 2995, 3769, +4064, 3020, 3761, +4057, 3052, 3750, +4047, 3092, 3736, +4034, 3140, 3715, +4015, 3197, 3686, +3989, 3264, 3645, +3951, 3340, 3583, +3896, 3425, 3483, +3809, 3519, 3303, +3659, 3620, 2826, +3322, 3728, 0, +4095, 3037, 3922, +4095, 3037, 3922, +4095, 3037, 3922, +4095, 3037, 3922, +4095, 3038, 3922, +4095, 3038, 3922, +4095, 3038, 3922, +4095, 3039, 3922, +4095, 3039, 3922, +4095, 3040, 3921, +4095, 3041, 3921, +4095, 3042, 3921, +4095, 3044, 3920, +4095, 3046, 3920, +4095, 3049, 3919, +4095, 3053, 3918, +4095, 3059, 3917, +4095, 3066, 3915, +4095, 3075, 3913, +4095, 3087, 3910, +4095, 3103, 3905, +4095, 3123, 3900, +4095, 3149, 3892, +4095, 3181, 3881, +4095, 3221, 3866, +4095, 3269, 3846, +4095, 3327, 3817, +4095, 3394, 3775, +4084, 3470, 3713, +4029, 3556, 3613, +3942, 3650, 3432, +3792, 3751, 2947, +4095, 3166, 4053, +4095, 3166, 4053, +4095, 3166, 4053, +4095, 3166, 4053, +4095, 3166, 4053, +4095, 3166, 4053, +4095, 3166, 4053, +4095, 3167, 4053, +4095, 3167, 4053, +4095, 3168, 4053, +4095, 3168, 4053, +4095, 3169, 4052, +4095, 3171, 4052, +4095, 3172, 4052, +4095, 3175, 4051, +4095, 3178, 4050, +4095, 3182, 4049, +4095, 3187, 4048, +4095, 3194, 4046, +4095, 3204, 4044, +4095, 3216, 4041, +4095, 3232, 4037, +4095, 3252, 4031, +4095, 3278, 4023, +4095, 3310, 4012, +4095, 3350, 3997, +4095, 3399, 3977, +4095, 3457, 3948, +4095, 3524, 3906, +4095, 3601, 3843, +4095, 3687, 3743, +4074, 3781, 3561, +0, 1606, 1871, +0, 1607, 1869, +0, 1610, 1867, +0, 1612, 1864, +0, 1616, 1861, +0, 1622, 1856, +0, 1628, 1849, +0, 1637, 1840, +0, 1649, 1827, +0, 1664, 1810, +0, 1684, 1786, +0, 1709, 1751, +0, 1740, 1701, +0, 1779, 1623, +0, 1826, 1491, +0, 1883, 1222, +0, 1949, 0, +0, 2024, 0, +0, 2108, 0, +0, 2201, 0, +0, 2302, 0, +0, 2409, 0, +0, 2521, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1606, 1873, +0, 1608, 1871, +0, 1610, 1869, +0, 1613, 1867, +0, 1617, 1863, +0, 1622, 1858, +0, 1629, 1851, +0, 1638, 1842, +0, 1650, 1830, +0, 1665, 1813, +0, 1684, 1789, +0, 1709, 1754, +0, 1741, 1704, +0, 1779, 1626, +0, 1827, 1497, +0, 1883, 1231, +0, 1949, 0, +0, 2024, 0, +0, 2109, 0, +0, 2202, 0, +0, 2302, 0, +0, 2409, 0, +0, 2521, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1607, 1876, +0, 1609, 1874, +0, 1611, 1872, +0, 1614, 1870, +0, 1618, 1866, +0, 1623, 1861, +0, 1630, 1855, +0, 1639, 1846, +0, 1650, 1833, +0, 1666, 1816, +0, 1685, 1792, +0, 1710, 1758, +0, 1741, 1708, +0, 1780, 1632, +0, 1827, 1503, +0, 1883, 1243, +0, 1949, 0, +0, 2024, 0, +0, 2109, 0, +0, 2202, 0, +0, 2302, 0, +0, 2409, 0, +0, 2521, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1608, 1880, +0, 1610, 1878, +0, 1612, 1876, +0, 1615, 1874, +0, 1619, 1870, +0, 1624, 1865, +0, 1631, 1859, +0, 1640, 1850, +0, 1651, 1838, +0, 1666, 1821, +0, 1686, 1797, +0, 1711, 1763, +0, 1742, 1714, +0, 1781, 1638, +0, 1828, 1512, +0, 1884, 1259, +0, 1950, 0, +0, 2025, 0, +0, 2109, 0, +0, 2202, 0, +0, 2302, 0, +0, 2409, 0, +0, 2521, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1609, 1885, +0, 1611, 1884, +0, 1613, 1882, +0, 1616, 1879, +0, 1620, 1876, +0, 1625, 1871, +0, 1632, 1864, +0, 1641, 1855, +0, 1652, 1843, +0, 1668, 1827, +0, 1687, 1803, +0, 1712, 1770, +0, 1743, 1722, +0, 1782, 1647, +0, 1829, 1524, +0, 1885, 1280, +0, 1950, 0, +0, 2025, 0, +0, 2110, 0, +0, 2202, 0, +0, 2303, 0, +0, 2409, 0, +0, 2522, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1611, 1892, +0, 1613, 1891, +0, 1615, 1889, +0, 1618, 1886, +0, 1622, 1883, +0, 1627, 1878, +0, 1634, 1872, +0, 1642, 1863, +0, 1654, 1851, +0, 1669, 1835, +0, 1689, 1812, +0, 1713, 1779, +0, 1744, 1732, +0, 1783, 1659, +0, 1830, 1540, +0, 1886, 1305, +0, 1951, 254, +0, 2026, 0, +0, 2110, 0, +0, 2203, 0, +0, 2303, 0, +0, 2410, 0, +0, 2522, 0, +0, 2638, 0, +0, 2758, 0, +0, 2881, 0, +0, 3006, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1614, 1901, +0, 1615, 1900, +0, 1617, 1898, +0, 1620, 1896, +0, 1624, 1892, +0, 1629, 1887, +0, 1636, 1881, +0, 1645, 1873, +0, 1656, 1861, +0, 1671, 1845, +0, 1691, 1823, +0, 1715, 1791, +0, 1746, 1745, +0, 1784, 1674, +0, 1831, 1559, +0, 1887, 1338, +0, 1952, 508, +0, 2027, 0, +0, 2111, 0, +0, 2203, 0, +0, 2304, 0, +0, 2410, 0, +0, 2522, 0, +0, 2639, 0, +0, 2759, 0, +0, 2881, 0, +0, 3007, 0, +0, 3133, 0, +0, 3261, 0, +0, 3390, 0, +0, 3520, 0, +0, 3651, 0, +0, 1617, 1913, +0, 1618, 1912, +0, 1620, 1910, +0, 1623, 1908, +0, 1627, 1904, +0, 1632, 1900, +0, 1639, 1894, +0, 1648, 1885, +0, 1659, 1874, +0, 1674, 1859, +0, 1693, 1837, +0, 1718, 1806, +0, 1748, 1761, +0, 1787, 1694, +0, 1833, 1584, +0, 1889, 1378, +0, 1954, 713, +0, 2028, 0, +0, 2112, 0, +0, 2204, 0, +0, 2304, 0, +0, 2411, 0, +0, 2522, 0, +0, 2639, 0, +0, 2759, 0, +0, 2882, 0, +0, 3007, 0, +0, 3133, 0, +0, 3261, 0, +0, 3391, 0, +0, 3520, 0, +0, 3651, 0, +0, 1621, 1929, +0, 1622, 1928, +0, 1625, 1926, +0, 1627, 1923, +0, 1631, 1920, +0, 1636, 1916, +0, 1643, 1910, +0, 1652, 1902, +0, 1663, 1891, +0, 1678, 1876, +0, 1697, 1855, +0, 1721, 1826, +0, 1752, 1783, +0, 1790, 1719, +0, 1836, 1616, +0, 1891, 1426, +0, 1956, 894, +0, 2030, 0, +0, 2113, 0, +0, 2206, 0, +0, 2305, 0, +0, 2411, 0, +0, 2523, 0, +0, 2639, 0, +0, 2759, 0, +0, 2882, 0, +0, 3007, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3520, 0, +0, 3651, 0, +0, 1626, 1949, +0, 1628, 1948, +0, 1630, 1946, +0, 1633, 1944, +0, 1637, 1940, +0, 1642, 1936, +0, 1648, 1931, +0, 1657, 1923, +0, 1668, 1913, +0, 1683, 1898, +0, 1701, 1878, +0, 1726, 1851, +0, 1756, 1810, +0, 1793, 1750, +0, 1839, 1655, +0, 1894, 1484, +0, 1958, 1059, +0, 2032, 0, +0, 2115, 0, +0, 2207, 0, +0, 2306, 0, +0, 2412, 0, +0, 2524, 0, +0, 2640, 0, +0, 2760, 0, +0, 2882, 0, +0, 3007, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3520, 0, +0, 3651, 0, +0, 1634, 1974, +0, 1635, 1973, +0, 1637, 1971, +0, 1640, 1969, +0, 1644, 1966, +0, 1649, 1962, +0, 1655, 1957, +0, 1664, 1950, +0, 1675, 1940, +0, 1689, 1927, +0, 1708, 1908, +0, 1731, 1882, +0, 1761, 1844, +0, 1798, 1789, +0, 1844, 1702, +0, 1898, 1552, +0, 1962, 1214, +0, 2035, 0, +0, 2118, 0, +0, 2209, 0, +0, 2308, 0, +0, 2414, 0, +0, 2525, 0, +0, 2641, 0, +0, 2760, 0, +0, 2883, 0, +0, 3008, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +1107, 1643, 2006, +1096, 1645, 2005, +1081, 1647, 2003, +1061, 1650, 2001, +1031, 1653, 1999, +989, 1658, 1995, +926, 1664, 1990, +824, 1673, 1983, +639, 1684, 1974, +132, 1698, 1962, +0, 1716, 1945, +0, 1739, 1921, +0, 1769, 1886, +0, 1805, 1836, +0, 1850, 1758, +0, 1904, 1628, +0, 1967, 1363, +0, 2039, 0, +0, 2121, 0, +0, 2212, 0, +0, 2310, 0, +0, 2415, 0, +0, 2526, 0, +0, 2642, 0, +0, 2761, 0, +0, 2883, 0, +0, 3008, 0, +0, 3134, 0, +0, 3262, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +1479, 1656, 2045, +1474, 1657, 2044, +1468, 1659, 2043, +1459, 1662, 2041, +1447, 1666, 2039, +1431, 1670, 2035, +1408, 1676, 2031, +1375, 1684, 2025, +1327, 1695, 2016, +1255, 1709, 2005, +1135, 1727, 1989, +899, 1749, 1968, +0, 1778, 1937, +0, 1814, 1892, +0, 1858, 1824, +0, 1911, 1714, +0, 1973, 1507, +0, 2045, 831, +0, 2126, 0, +0, 2215, 0, +0, 2313, 0, +0, 2418, 0, +0, 2528, 0, +0, 2643, 0, +0, 2762, 0, +0, 2884, 0, +0, 3009, 0, +0, 3135, 0, +0, 3263, 0, +0, 3391, 0, +0, 3521, 0, +0, 3651, 0, +1732, 1672, 2093, +1730, 1674, 2092, +1726, 1676, 2091, +1721, 1678, 2089, +1715, 1681, 2087, +1706, 1686, 2084, +1693, 1692, 2080, +1676, 1700, 2075, +1652, 1710, 2067, +1618, 1723, 2057, +1568, 1741, 2043, +1491, 1763, 2024, +1362, 1791, 1997, +1100, 1826, 1958, +0, 1868, 1900, +0, 1920, 1808, +0, 1981, 1648, +0, 2052, 1267, +0, 2132, 0, +0, 2220, 0, +0, 2317, 0, +0, 2421, 0, +0, 2530, 0, +0, 2645, 0, +0, 2764, 0, +0, 2885, 0, +0, 3009, 0, +0, 3136, 0, +0, 3263, 0, +0, 3392, 0, +0, 3521, 0, +0, 3651, 0, +1938, 1693, 2150, +1936, 1694, 2150, +1934, 1696, 2148, +1931, 1699, 2147, +1927, 1702, 2145, +1921, 1706, 2142, +1913, 1712, 2139, +1903, 1719, 2134, +1889, 1729, 2127, +1869, 1742, 2119, +1840, 1759, 2106, +1800, 1780, 2090, +1739, 1807, 2066, +1643, 1841, 2033, +1470, 1882, 1984, +1033, 1932, 1910, +0, 1992, 1786, +0, 2061, 1540, +0, 2139, 54, +0, 2227, 0, +0, 2322, 0, +0, 2425, 0, +0, 2534, 0, +0, 2648, 0, +0, 2766, 0, +0, 2887, 0, +0, 3011, 0, +0, 3136, 0, +0, 3264, 0, +0, 3392, 0, +0, 3522, 0, +0, 3652, 0, +2118, 1720, 2217, +2117, 1721, 2216, +2116, 1723, 2215, +2113, 1725, 2214, +2111, 1728, 2212, +2107, 1732, 2210, +2102, 1737, 2207, +2095, 1744, 2203, +2086, 1754, 2197, +2073, 1766, 2190, +2055, 1782, 2179, +2030, 1802, 2165, +1994, 1828, 2145, +1942, 1860, 2118, +1861, 1900, 2077, +1723, 1948, 2018, +1431, 2006, 1923, +0, 2073, 1755, +0, 2149, 1339, +0, 2235, 0, +0, 2329, 0, +0, 2430, 0, +0, 2538, 0, +0, 2651, 0, +0, 2768, 0, +0, 2889, 0, +0, 3012, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +2283, 1753, 2293, +2282, 1754, 2292, +2281, 1756, 2292, +2280, 1758, 2290, +2278, 1761, 2289, +2275, 1764, 2287, +2272, 1769, 2285, +2267, 1776, 2281, +2261, 1785, 2276, +2252, 1796, 2270, +2240, 1811, 2261, +2224, 1830, 2249, +2201, 1854, 2233, +2168, 1884, 2210, +2121, 1922, 2178, +2048, 1968, 2131, +1928, 2024, 2059, +1694, 2088, 1940, +631, 2163, 1709, +0, 2246, 718, +0, 2338, 0, +0, 2437, 0, +0, 2544, 0, +0, 2655, 0, +0, 2772, 0, +0, 2891, 0, +0, 3014, 0, +0, 3139, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3653, 0, +2439, 1794, 2378, +2438, 1795, 2378, +2437, 1796, 2377, +2436, 1798, 2376, +2435, 1801, 2375, +2433, 1804, 2373, +2430, 1809, 2371, +2427, 1815, 2368, +2423, 1823, 2364, +2417, 1833, 2359, +2408, 1847, 2352, +2397, 1864, 2342, +2382, 1887, 2329, +2360, 1915, 2311, +2329, 1951, 2285, +2285, 1994, 2248, +2217, 2047, 2193, +2108, 2108, 2108, +1903, 2180, 1962, +1252, 2260, 1639, +0, 2350, 0, +0, 2447, 0, +0, 2551, 0, +0, 2661, 0, +0, 2776, 0, +0, 2895, 0, +0, 3017, 0, +0, 3141, 0, +0, 3267, 0, +0, 3395, 0, +0, 3524, 0, +0, 3653, 0, +2587, 1843, 2472, +2587, 1844, 2471, +2586, 1845, 2471, +2585, 1847, 2470, +2584, 1850, 2469, +2583, 1853, 2468, +2581, 1857, 2466, +2579, 1862, 2464, +2576, 1869, 2460, +2571, 1879, 2456, +2566, 1891, 2451, +2558, 1907, 2443, +2547, 1928, 2432, +2532, 1954, 2418, +2511, 1986, 2397, +2482, 2027, 2369, +2439, 2076, 2327, +2375, 2134, 2266, +2273, 2201, 2167, +2086, 2279, 1990, +1566, 2365, 1526, +0, 2459, 0, +0, 2561, 0, +0, 2669, 0, +0, 2782, 0, +0, 2899, 0, +0, 3020, 0, +0, 3144, 0, +0, 3269, 0, +0, 3396, 0, +0, 3525, 0, +0, 3654, 0, +2731, 1902, 2573, +2731, 1903, 2572, +2731, 1904, 2572, +2730, 1906, 2571, +2729, 1908, 2570, +2728, 1910, 2569, +2727, 1914, 2568, +2725, 1919, 2566, +2723, 1925, 2564, +2720, 1933, 2560, +2716, 1944, 2556, +2710, 1959, 2550, +2702, 1977, 2541, +2692, 2000, 2530, +2677, 2030, 2514, +2657, 2067, 2492, +2629, 2112, 2461, +2588, 2166, 2416, +2526, 2229, 2347, +2428, 2302, 2236, +2252, 2384, 2024, +1798, 2475, 1309, +0, 2574, 0, +0, 2679, 0, +0, 2790, 0, +0, 2906, 0, +0, 3025, 0, +0, 3147, 0, +0, 3272, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +2872, 1970, 2680, +2872, 1971, 2680, +2872, 1972, 2679, +2871, 1973, 2679, +2871, 1975, 2678, +2870, 1977, 2677, +2869, 1981, 2676, +2868, 1985, 2675, +2866, 1990, 2673, +2864, 1998, 2670, +2861, 2007, 2667, +2857, 2019, 2662, +2851, 2036, 2655, +2843, 2056, 2646, +2833, 2083, 2634, +2819, 2115, 2618, +2799, 2156, 2594, +2771, 2205, 2561, +2731, 2264, 2512, +2672, 2332, 2437, +2577, 2409, 2314, +2409, 2495, 2066, +1993, 2590, 532, +0, 2692, 0, +0, 2800, 0, +0, 2914, 0, +0, 3031, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3528, 0, +0, 3657, 0, +3011, 2048, 2793, +3011, 2049, 2792, +3010, 2050, 2792, +3010, 2051, 2792, +3010, 2052, 2791, +3009, 2054, 2791, +3008, 2057, 2790, +3007, 2060, 2789, +3006, 2065, 2787, +3005, 2071, 2785, +3002, 2079, 2782, +2999, 2090, 2779, +2995, 2104, 2774, +2990, 2122, 2767, +2982, 2144, 2757, +2972, 2173, 2745, +2958, 2209, 2727, +2939, 2253, 2702, +2911, 2306, 2667, +2872, 2368, 2616, +2813, 2440, 2536, +2721, 2521, 2400, +2558, 2611, 2118, +2167, 2709, 0, +0, 2814, 0, +0, 2924, 0, +0, 3039, 0, +0, 3158, 0, +0, 3280, 0, +0, 3405, 0, +0, 3531, 0, +0, 3659, 0, +3148, 2135, 2910, +3147, 2135, 2909, +3147, 2136, 2909, +3147, 2137, 2909, +3147, 2138, 2909, +3146, 2140, 2908, +3146, 2142, 2907, +3145, 2145, 2907, +3144, 2149, 2905, +3143, 2154, 2904, +3141, 2161, 2902, +3139, 2170, 2899, +3136, 2181, 2895, +3132, 2196, 2890, +3127, 2216, 2883, +3119, 2241, 2873, +3109, 2272, 2860, +3095, 2310, 2842, +3076, 2357, 2816, +3049, 2413, 2779, +3010, 2479, 2725, +2953, 2554, 2640, +2862, 2638, 2495, +2703, 2731, 2178, +2328, 2831, 0, +0, 2938, 0, +0, 3050, 0, +0, 3167, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +3283, 2230, 3030, +3283, 2230, 3030, +3283, 2231, 3030, +3283, 2232, 3030, +3283, 2233, 3029, +3282, 2234, 3029, +3282, 2236, 3028, +3281, 2238, 3028, +3281, 2241, 3027, +3280, 2245, 3026, +3279, 2251, 3024, +3277, 2258, 3022, +3275, 2268, 3019, +3272, 2280, 3015, +3268, 2297, 3010, +3262, 2317, 3002, +3255, 2344, 2992, +3245, 2377, 2979, +3231, 2418, 2960, +3212, 2467, 2933, +3186, 2526, 2896, +3147, 2594, 2839, +3090, 2672, 2751, +3000, 2758, 2598, +2844, 2853, 2248, +2481, 2955, 0, +0, 3064, 0, +0, 3177, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3418, 2332, 3153, +3418, 2332, 3153, +3418, 2333, 3153, +3418, 2333, 3153, +3417, 2334, 3153, +3417, 2335, 3152, +3417, 2337, 3152, +3417, 2339, 3151, +3416, 2341, 3151, +3415, 2344, 3150, +3414, 2349, 3149, +3413, 2355, 3147, +3412, 2363, 3145, +3409, 2373, 3142, +3406, 2386, 3138, +3403, 2403, 3132, +3397, 2425, 3125, +3390, 2453, 3115, +3380, 2488, 3101, +3366, 2531, 3082, +3347, 2582, 3054, +3321, 2643, 3016, +3283, 2713, 2958, +3226, 2793, 2866, +3137, 2882, 2706, +2983, 2978, 2328, +2627, 3082, 0, +0, 3191, 0, +0, 3306, 0, +0, 3424, 0, +0, 3546, 0, +0, 3670, 0, +3552, 2440, 3279, +3552, 2441, 3278, +3552, 2441, 3278, +3552, 2441, 3278, +3552, 2442, 3278, +3551, 2443, 3278, +3551, 2444, 3278, +3551, 2446, 3277, +3551, 2448, 3277, +3550, 2450, 3276, +3549, 2454, 3275, +3549, 2458, 3274, +3547, 2465, 3272, +3546, 2473, 3270, +3543, 2484, 3267, +3541, 2497, 3263, +3537, 2515, 3257, +3531, 2538, 3250, +3524, 2567, 3239, +3514, 2603, 3225, +3500, 2648, 3206, +3482, 2701, 3178, +3455, 2763, 3138, +3417, 2835, 3079, +3361, 2917, 2986, +3273, 3007, 2820, +3120, 3105, 2416, +2770, 3209, 0, +0, 3320, 0, +0, 3435, 0, +0, 3554, 0, +0, 3676, 0, +3685, 2554, 3406, +3685, 2554, 3405, +3685, 2554, 3405, +3685, 2555, 3405, +3685, 2555, 3405, +3685, 2556, 3405, +3685, 2557, 3405, +3685, 2558, 3405, +3684, 2560, 3404, +3684, 2562, 3404, +3684, 2564, 3403, +3683, 2568, 3402, +3682, 2573, 3401, +3681, 2579, 3399, +3679, 2588, 3397, +3677, 2599, 3394, +3674, 2613, 3389, +3670, 2632, 3384, +3665, 2656, 3376, +3658, 2686, 3366, +3648, 2723, 3351, +3634, 2768, 3332, +3615, 2823, 3304, +3589, 2886, 3263, +3551, 2960, 3203, +3495, 3042, 3108, +3408, 3134, 2938, +3255, 3233, 2512, +2910, 3338, 0, +0, 3449, 0, +0, 3565, 0, +0, 3685, 0, +3819, 2672, 3534, +3819, 2672, 3534, +3819, 2672, 3534, +3819, 2672, 3534, +3818, 2673, 3533, +3818, 2673, 3533, +3818, 2674, 3533, +3818, 2675, 3533, +3818, 2676, 3533, +3818, 2678, 3532, +3817, 2680, 3532, +3817, 2683, 3531, +3816, 2686, 3530, +3815, 2691, 3529, +3814, 2698, 3527, +3812, 2707, 3525, +3810, 2718, 3522, +3807, 2733, 3517, +3803, 2752, 3512, +3798, 2776, 3504, +3791, 2807, 3494, +3781, 2845, 3479, +3767, 2891, 3459, +3749, 2947, 3431, +3722, 3012, 3390, +3685, 3086, 3329, +3629, 3170, 3232, +3542, 3262, 3059, +3390, 3362, 2616, +3048, 3468, 0, +0, 3580, 0, +0, 3696, 0, +3952, 2793, 3663, +3952, 2793, 3663, +3952, 2793, 3663, +3951, 2793, 3663, +3951, 2793, 3663, +3951, 2794, 3663, +3951, 2794, 3663, +3951, 2795, 3662, +3951, 2796, 3662, +3951, 2797, 3662, +3951, 2799, 3661, +3950, 2801, 3661, +3950, 2804, 3660, +3949, 2808, 3659, +3948, 2813, 3658, +3947, 2820, 3656, +3945, 2829, 3654, +3943, 2840, 3651, +3940, 2856, 3646, +3936, 2875, 3641, +3931, 2900, 3633, +3924, 2931, 3622, +3914, 2970, 3608, +3900, 3017, 3588, +3882, 3073, 3559, +3856, 3139, 3518, +3818, 3214, 3457, +3762, 3298, 3359, +3675, 3391, 3182, +3524, 3491, 2725, +3184, 3598, 0, +0, 3710, 0, +4084, 2916, 3793, +4084, 2916, 3793, +4084, 2916, 3793, +4084, 2917, 3793, +4084, 2917, 3793, +4084, 2917, 3793, +4084, 2918, 3793, +4084, 2918, 3792, +4084, 2919, 3792, +4084, 2920, 3792, +4083, 2921, 3792, +4083, 2923, 3791, +4083, 2925, 3791, +4082, 2928, 3790, +4082, 2932, 3789, +4081, 2937, 3788, +4080, 2944, 3786, +4078, 2953, 3784, +4076, 2965, 3781, +4073, 2980, 3776, +4069, 3000, 3771, +4064, 3025, 3763, +4056, 3057, 3752, +4047, 3096, 3738, +4033, 3144, 3717, +4015, 3201, 3689, +3988, 3267, 3647, +3951, 3343, 3585, +3895, 3428, 3486, +3808, 3521, 3308, +3658, 3622, 2839, +3320, 3729, 0, +4095, 3042, 3923, +4095, 3042, 3923, +4095, 3042, 3923, +4095, 3042, 3923, +4095, 3042, 3923, +4095, 3043, 3923, +4095, 3043, 3923, +4095, 3043, 3923, +4095, 3044, 3923, +4095, 3045, 3923, +4095, 3046, 3922, +4095, 3047, 3922, +4095, 3049, 3922, +4095, 3051, 3921, +4095, 3054, 3920, +4095, 3058, 3919, +4095, 3063, 3918, +4095, 3070, 3916, +4095, 3079, 3914, +4095, 3091, 3911, +4095, 3107, 3907, +4095, 3127, 3901, +4095, 3152, 3893, +4095, 3184, 3882, +4095, 3224, 3868, +4095, 3272, 3847, +4095, 3329, 3819, +4095, 3396, 3777, +4084, 3472, 3715, +4028, 3558, 3615, +3941, 3651, 3435, +3791, 3752, 2958, +4095, 3169, 4054, +4095, 3169, 4054, +4095, 3169, 4054, +4095, 3169, 4054, +4095, 3169, 4054, +4095, 3170, 4054, +4095, 3170, 4054, +4095, 3170, 4054, +4095, 3171, 4054, +4095, 3171, 4054, +4095, 3172, 4054, +4095, 3173, 4053, +4095, 3174, 4053, +4095, 3176, 4053, +4095, 3178, 4052, +4095, 3181, 4051, +4095, 3185, 4050, +4095, 3191, 4049, +4095, 3198, 4047, +4095, 3207, 4045, +4095, 3219, 4042, +4095, 3235, 4037, +4095, 3255, 4032, +4095, 3281, 4024, +4095, 3313, 4013, +4095, 3353, 3998, +4095, 3401, 3978, +4095, 3459, 3949, +4095, 3526, 3907, +4095, 3602, 3845, +4095, 3688, 3745, +4074, 3782, 3564, +0, 1736, 2002, +0, 1737, 2001, +0, 1739, 2000, +0, 1741, 1998, +0, 1744, 1995, +0, 1748, 1991, +0, 1753, 1986, +0, 1760, 1979, +0, 1769, 1970, +0, 1781, 1958, +0, 1796, 1940, +0, 1816, 1916, +0, 1841, 1881, +0, 1872, 1830, +0, 1911, 1752, +0, 1958, 1620, +0, 2015, 1347, +0, 2080, 0, +0, 2156, 0, +0, 2240, 0, +0, 2333, 0, +0, 2434, 0, +0, 2541, 0, +0, 2653, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +0, 1737, 2004, +0, 1738, 2003, +0, 1739, 2001, +0, 1742, 1999, +0, 1745, 1997, +0, 1749, 1993, +0, 1754, 1988, +0, 1761, 1981, +0, 1769, 1972, +0, 1781, 1960, +0, 1796, 1942, +0, 1816, 1918, +0, 1841, 1883, +0, 1872, 1833, +0, 1911, 1755, +0, 1958, 1624, +0, 2015, 1354, +0, 2081, 0, +0, 2156, 0, +0, 2241, 0, +0, 2333, 0, +0, 2434, 0, +0, 2541, 0, +0, 2653, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +0, 1737, 2006, +0, 1738, 2005, +0, 1740, 2004, +0, 1742, 2002, +0, 1745, 1999, +0, 1749, 1995, +0, 1754, 1990, +0, 1761, 1984, +0, 1770, 1974, +0, 1782, 1962, +0, 1797, 1945, +0, 1817, 1921, +0, 1841, 1886, +0, 1873, 1836, +0, 1912, 1759, +0, 1959, 1629, +0, 2015, 1363, +0, 2081, 0, +0, 2156, 0, +0, 2241, 0, +0, 2334, 0, +0, 2434, 0, +0, 2541, 0, +0, 2653, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +0, 1738, 2009, +0, 1739, 2008, +0, 1741, 2007, +0, 1743, 2005, +0, 1746, 2002, +0, 1750, 1998, +0, 1755, 1993, +0, 1762, 1987, +0, 1771, 1978, +0, 1782, 1965, +0, 1798, 1948, +0, 1817, 1924, +0, 1842, 1890, +0, 1873, 1840, +0, 1912, 1764, +0, 1959, 1636, +0, 2015, 1375, +0, 2081, 0, +0, 2157, 0, +0, 2241, 0, +0, 2334, 0, +0, 2434, 0, +0, 2541, 0, +0, 2653, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +0, 1739, 2013, +0, 1740, 2012, +0, 1742, 2011, +0, 1744, 2009, +0, 1747, 2006, +0, 1751, 2002, +0, 1756, 1997, +0, 1763, 1991, +0, 1772, 1982, +0, 1783, 1970, +0, 1798, 1953, +0, 1818, 1929, +0, 1843, 1895, +0, 1874, 1846, +0, 1913, 1771, +0, 1960, 1645, +0, 2016, 1391, +0, 2082, 0, +0, 2157, 0, +0, 2241, 0, +0, 2334, 0, +0, 2434, 0, +0, 2541, 0, +0, 2653, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +0, 1740, 2018, +0, 1741, 2017, +0, 1743, 2016, +0, 1745, 2014, +0, 1748, 2011, +0, 1752, 2008, +0, 1757, 2003, +0, 1764, 1996, +0, 1773, 1988, +0, 1785, 1975, +0, 1800, 1959, +0, 1819, 1935, +0, 1844, 1902, +0, 1875, 1854, +0, 1914, 1779, +0, 1961, 1656, +0, 2017, 1412, +0, 2082, 13, +0, 2157, 0, +0, 2242, 0, +0, 2334, 0, +0, 2435, 0, +0, 2541, 0, +0, 2654, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3138, 0, +0, 3265, 0, +0, 3393, 0, +0, 3522, 0, +0, 3652, 0, +0, 1742, 2025, +0, 1743, 2024, +0, 1745, 2023, +0, 1747, 2021, +0, 1750, 2018, +0, 1754, 2015, +0, 1759, 2010, +0, 1766, 2004, +0, 1775, 1995, +0, 1786, 1983, +0, 1801, 1967, +0, 1821, 1944, +0, 1845, 1911, +0, 1876, 1864, +0, 1915, 1791, +0, 1962, 1672, +0, 2018, 1438, +0, 2083, 386, +0, 2158, 0, +0, 2242, 0, +0, 2335, 0, +0, 2435, 0, +0, 2542, 0, +0, 2654, 0, +0, 2770, 0, +0, 2890, 0, +0, 3013, 0, +0, 3139, 0, +0, 3265, 0, +0, 3393, 0, +0, 3523, 0, +0, 3652, 0, +0, 1744, 2035, +0, 1746, 2033, +0, 1747, 2032, +0, 1749, 2030, +0, 1752, 2028, +0, 1756, 2024, +0, 1761, 2020, +0, 1768, 2013, +0, 1777, 2005, +0, 1788, 1993, +0, 1803, 1977, +0, 1823, 1955, +0, 1847, 1923, +0, 1878, 1877, +0, 1917, 1806, +0, 1963, 1691, +0, 2019, 1470, +0, 2084, 640, +0, 2159, 0, +0, 2243, 0, +0, 2336, 0, +0, 2436, 0, +0, 2542, 0, +0, 2654, 0, +0, 2771, 0, +0, 2891, 0, +0, 3014, 0, +0, 3139, 0, +0, 3265, 0, +0, 3393, 0, +0, 3523, 0, +0, 3652, 0, +0, 1748, 2046, +0, 1749, 2045, +0, 1750, 2044, +0, 1753, 2042, +0, 1755, 2040, +0, 1759, 2036, +0, 1764, 2032, +0, 1771, 2026, +0, 1780, 2018, +0, 1791, 2006, +0, 1806, 1991, +0, 1825, 1969, +0, 1850, 1938, +0, 1881, 1893, +0, 1919, 1826, +0, 1965, 1716, +0, 2021, 1510, +0, 2086, 846, +0, 2160, 0, +0, 2244, 0, +0, 2336, 0, +0, 2436, 0, +0, 2543, 0, +0, 2655, 0, +0, 2771, 0, +0, 2891, 0, +0, 3014, 0, +0, 3139, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3652, 0, +0, 1752, 2062, +0, 1753, 2061, +0, 1755, 2060, +0, 1757, 2058, +0, 1760, 2055, +0, 1763, 2052, +0, 1768, 2048, +0, 1775, 2042, +0, 1784, 2034, +0, 1795, 2023, +0, 1810, 2008, +0, 1829, 1987, +0, 1853, 1958, +0, 1884, 1915, +0, 1922, 1851, +0, 1968, 1748, +0, 2023, 1559, +0, 2088, 1026, +0, 2162, 0, +0, 2246, 0, +0, 2338, 0, +0, 2437, 0, +0, 2543, 0, +0, 2655, 0, +0, 2771, 0, +0, 2891, 0, +0, 3014, 0, +0, 3139, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3652, 0, +0, 1757, 2082, +0, 1759, 2081, +0, 1760, 2080, +0, 1762, 2078, +0, 1765, 2076, +0, 1769, 2073, +0, 1774, 2068, +0, 1780, 2063, +0, 1789, 2055, +0, 1800, 2045, +0, 1815, 2030, +0, 1834, 2011, +0, 1858, 1983, +0, 1888, 1942, +0, 1925, 1882, +0, 1971, 1787, +0, 2026, 1616, +0, 2090, 1191, +0, 2164, 0, +0, 2247, 0, +0, 2339, 0, +0, 2438, 0, +0, 2544, 0, +0, 2656, 0, +0, 2772, 0, +0, 2892, 0, +0, 3014, 0, +0, 3139, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3653, 0, +30, 1765, 2107, +0, 1766, 2106, +0, 1767, 2105, +0, 1770, 2103, +0, 1772, 2101, +0, 1776, 2098, +0, 1781, 2094, +0, 1787, 2089, +0, 1796, 2082, +0, 1807, 2072, +0, 1821, 2059, +0, 1840, 2040, +0, 1864, 2014, +0, 1893, 1976, +0, 1931, 1921, +0, 1976, 1834, +0, 2030, 1684, +0, 2094, 1346, +0, 2167, 0, +0, 2250, 0, +0, 2341, 0, +0, 2440, 0, +0, 2546, 0, +0, 2657, 0, +0, 2773, 0, +0, 2892, 0, +0, 3015, 0, +0, 3140, 0, +0, 3266, 0, +0, 3394, 0, +0, 3523, 0, +0, 3653, 0, +1247, 1774, 2139, +1239, 1775, 2138, +1228, 1777, 2137, +1213, 1779, 2136, +1193, 1782, 2133, +1163, 1785, 2131, +1121, 1790, 2127, +1058, 1796, 2122, +956, 1805, 2116, +771, 1816, 2106, +265, 1830, 2094, +0, 1848, 2077, +0, 1871, 2053, +0, 1901, 2018, +0, 1937, 1968, +0, 1982, 1890, +0, 2036, 1760, +0, 2099, 1495, +0, 2171, 0, +0, 2253, 0, +0, 2344, 0, +0, 2442, 0, +0, 2547, 0, +0, 2658, 0, +0, 2774, 0, +0, 2893, 0, +0, 3015, 0, +0, 3140, 0, +0, 3267, 0, +0, 3394, 0, +0, 3523, 0, +0, 3653, 0, +1614, 1787, 2178, +1611, 1788, 2178, +1606, 1790, 2177, +1600, 1792, 2175, +1591, 1794, 2173, +1579, 1798, 2171, +1563, 1802, 2167, +1540, 1808, 2163, +1507, 1817, 2157, +1459, 1827, 2149, +1387, 1841, 2137, +1267, 1859, 2122, +1031, 1881, 2100, +0, 1910, 2069, +0, 1946, 2024, +0, 1990, 1956, +0, 2043, 1846, +0, 2105, 1639, +0, 2177, 963, +0, 2258, 0, +0, 2348, 0, +0, 2445, 0, +0, 2550, 0, +0, 2660, 0, +0, 2775, 0, +0, 2894, 0, +0, 3016, 0, +0, 3141, 0, +0, 3267, 0, +0, 3395, 0, +0, 3523, 0, +0, 3653, 0, +1867, 1803, 2226, +1865, 1804, 2225, +1862, 1806, 2224, +1858, 1808, 2223, +1853, 1810, 2222, +1847, 1814, 2219, +1838, 1818, 2216, +1825, 1824, 2212, +1808, 1832, 2207, +1784, 1842, 2199, +1750, 1855, 2189, +1700, 1873, 2175, +1623, 1895, 2156, +1494, 1923, 2129, +1232, 1958, 2090, +0, 2000, 2032, +0, 2052, 1940, +0, 2113, 1780, +0, 2184, 1399, +0, 2264, 0, +0, 2352, 0, +0, 2449, 0, +0, 2553, 0, +0, 2663, 0, +0, 2777, 0, +0, 2896, 0, +0, 3017, 0, +0, 3142, 0, +0, 3268, 0, +0, 3395, 0, +0, 3524, 0, +0, 3653, 0, +2071, 1824, 2283, +2070, 1825, 2282, +2068, 1827, 2282, +2066, 1828, 2281, +2063, 1831, 2279, +2059, 1834, 2277, +2053, 1838, 2274, +2046, 1844, 2271, +2035, 1851, 2266, +2021, 1861, 2260, +2001, 1874, 2251, +1973, 1891, 2239, +1932, 1912, 2222, +1871, 1939, 2198, +1775, 1973, 2165, +1602, 2014, 2117, +1165, 2064, 2042, +0, 2124, 1918, +0, 2193, 1672, +0, 2271, 186, +0, 2359, 0, +0, 2454, 0, +0, 2557, 0, +0, 2666, 0, +0, 2780, 0, +0, 2898, 0, +0, 3019, 0, +0, 3143, 0, +0, 3268, 0, +0, 3396, 0, +0, 3524, 0, +0, 3654, 0, +2251, 1851, 2350, +2250, 1852, 2349, +2249, 1853, 2348, +2248, 1855, 2347, +2246, 1857, 2346, +2243, 1860, 2344, +2239, 1864, 2342, +2234, 1869, 2339, +2227, 1877, 2335, +2218, 1886, 2329, +2205, 1898, 2322, +2187, 1914, 2311, +2162, 1934, 2297, +2127, 1960, 2277, +2074, 1992, 2250, +1993, 2032, 2210, +1855, 2080, 2150, +1563, 2138, 2055, +0, 2205, 1887, +0, 2281, 1471, +0, 2367, 0, +0, 2461, 0, +0, 2562, 0, +0, 2670, 0, +0, 2783, 0, +0, 2900, 0, +0, 3021, 0, +0, 3144, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +2416, 1884, 2425, +2415, 1885, 2425, +2415, 1886, 2424, +2413, 1888, 2424, +2412, 1890, 2423, +2410, 1893, 2421, +2408, 1896, 2419, +2404, 1901, 2417, +2399, 1908, 2413, +2393, 1917, 2408, +2384, 1928, 2402, +2372, 1943, 2393, +2356, 1962, 2382, +2333, 1986, 2365, +2300, 2017, 2342, +2253, 2054, 2310, +2180, 2101, 2263, +2060, 2156, 2191, +1826, 2220, 2072, +763, 2295, 1841, +0, 2378, 850, +0, 2470, 0, +0, 2570, 0, +0, 2676, 0, +0, 2787, 0, +0, 2904, 0, +0, 3023, 0, +0, 3146, 0, +0, 3271, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +2571, 1925, 2511, +2571, 1926, 2510, +2570, 1927, 2510, +2569, 1928, 2509, +2568, 1930, 2508, +2567, 1933, 2507, +2565, 1936, 2505, +2563, 1941, 2503, +2559, 1947, 2500, +2555, 1955, 2496, +2549, 1965, 2491, +2540, 1979, 2484, +2529, 1997, 2474, +2514, 2019, 2461, +2492, 2048, 2443, +2461, 2083, 2417, +2417, 2126, 2380, +2350, 2179, 2326, +2240, 2240, 2240, +2036, 2312, 2094, +1384, 2392, 1771, +0, 2482, 0, +0, 2579, 0, +0, 2683, 0, +0, 2793, 0, +0, 2908, 0, +0, 3027, 0, +0, 3149, 0, +0, 3273, 0, +0, 3399, 0, +0, 3527, 0, +0, 3656, 0, +2720, 1975, 2604, +2719, 1975, 2604, +2719, 1976, 2603, +2718, 1978, 2603, +2718, 1979, 2602, +2717, 1982, 2601, +2715, 1985, 2600, +2713, 1989, 2598, +2711, 1994, 2596, +2708, 2002, 2593, +2704, 2011, 2588, +2698, 2023, 2583, +2690, 2039, 2575, +2679, 2060, 2564, +2664, 2086, 2550, +2643, 2119, 2529, +2614, 2159, 2501, +2571, 2208, 2460, +2508, 2266, 2398, +2405, 2333, 2299, +2218, 2411, 2122, +1698, 2497, 1658, +0, 2591, 0, +0, 2693, 0, +0, 2801, 0, +0, 2914, 0, +0, 3032, 0, +0, 3152, 0, +0, 3276, 0, +0, 3401, 0, +0, 3529, 0, +0, 3657, 0, +2864, 2033, 2705, +2863, 2034, 2705, +2863, 2035, 2704, +2863, 2036, 2704, +2862, 2038, 2703, +2861, 2040, 2703, +2860, 2042, 2702, +2859, 2046, 2700, +2857, 2051, 2698, +2855, 2057, 2696, +2852, 2066, 2692, +2848, 2076, 2688, +2842, 2091, 2682, +2834, 2109, 2673, +2824, 2133, 2662, +2809, 2162, 2646, +2789, 2199, 2624, +2761, 2244, 2593, +2720, 2298, 2548, +2658, 2361, 2479, +2560, 2434, 2368, +2385, 2516, 2156, +1930, 2607, 1441, +0, 2706, 0, +0, 2811, 0, +0, 2922, 0, +0, 3038, 0, +0, 3157, 0, +0, 3279, 0, +0, 3404, 0, +0, 3531, 0, +0, 3658, 0, +3004, 2102, 2812, +3004, 2102, 2812, +3004, 2103, 2812, +3004, 2104, 2811, +3003, 2105, 2811, +3003, 2107, 2810, +3002, 2110, 2810, +3001, 2113, 2808, +3000, 2117, 2807, +2998, 2122, 2805, +2996, 2130, 2802, +2993, 2139, 2799, +2989, 2152, 2794, +2983, 2168, 2787, +2976, 2188, 2779, +2965, 2215, 2766, +2951, 2248, 2750, +2931, 2288, 2726, +2903, 2337, 2693, +2863, 2396, 2644, +2804, 2464, 2570, +2709, 2541, 2446, +2541, 2628, 2199, +2125, 2722, 664, +0, 2824, 0, +0, 2932, 0, +0, 3046, 0, +0, 3163, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3660, 0, +3143, 2180, 2925, +3143, 2180, 2925, +3143, 2181, 2924, +3142, 2182, 2924, +3142, 2183, 2924, +3142, 2184, 2923, +3141, 2186, 2923, +3141, 2189, 2922, +3140, 2192, 2921, +3138, 2197, 2919, +3137, 2203, 2917, +3134, 2211, 2914, +3131, 2222, 2911, +3127, 2236, 2906, +3122, 2254, 2899, +3114, 2276, 2890, +3104, 2305, 2877, +3090, 2341, 2859, +3071, 2385, 2835, +3043, 2438, 2799, +3004, 2500, 2748, +2945, 2572, 2668, +2853, 2653, 2532, +2690, 2743, 2250, +2299, 2841, 0, +0, 2946, 0, +0, 3056, 0, +0, 3171, 0, +0, 3290, 0, +0, 3412, 0, +0, 3537, 0, +0, 3663, 0, +3280, 2267, 3042, +3280, 2267, 3042, +3280, 2267, 3041, +3279, 2268, 3041, +3279, 2269, 3041, +3279, 2270, 3041, +3278, 2272, 3040, +3278, 2274, 3039, +3277, 2277, 3039, +3276, 2281, 3037, +3275, 2286, 3036, +3273, 2293, 3034, +3271, 2302, 3031, +3268, 2313, 3027, +3264, 2328, 3022, +3259, 2348, 3015, +3251, 2373, 3005, +3241, 2404, 2992, +3227, 2442, 2974, +3208, 2489, 2948, +3181, 2545, 2911, +3142, 2611, 2857, +3085, 2686, 2773, +2994, 2770, 2628, +2835, 2863, 2310, +2460, 2963, 0, +0, 3070, 0, +0, 3182, 0, +0, 3299, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +3415, 2362, 3162, +3415, 2362, 3162, +3415, 2362, 3162, +3415, 2363, 3162, +3415, 2364, 3162, +3415, 2365, 3161, +3414, 2366, 3161, +3414, 2368, 3160, +3414, 2370, 3160, +3413, 2373, 3159, +3412, 2377, 3158, +3411, 2383, 3156, +3409, 2390, 3154, +3407, 2400, 3151, +3404, 2412, 3147, +3400, 2429, 3142, +3394, 2449, 3134, +3387, 2476, 3124, +3377, 2509, 3111, +3363, 2550, 3092, +3344, 2599, 3066, +3318, 2658, 3028, +3279, 2726, 2971, +3222, 2804, 2883, +3132, 2891, 2730, +2976, 2985, 2380, +2613, 3088, 0, +0, 3196, 0, +0, 3309, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3550, 2464, 3285, +3550, 2464, 3285, +3550, 2464, 3285, +3550, 2465, 3285, +3550, 2465, 3285, +3550, 2466, 3285, +3549, 2467, 3284, +3549, 2469, 3284, +3549, 2471, 3284, +3548, 2473, 3283, +3548, 2477, 3282, +3547, 2481, 3281, +3545, 2487, 3279, +3544, 2495, 3277, +3542, 2505, 3274, +3539, 2518, 3270, +3535, 2535, 3264, +3529, 2557, 3257, +3522, 2585, 3247, +3512, 2620, 3233, +3498, 2663, 3214, +3479, 2714, 3187, +3453, 2775, 3148, +3415, 2845, 3090, +3358, 2925, 2999, +3269, 3014, 2838, +3115, 3110, 2460, +2760, 3214, 0, +0, 3323, 0, +0, 3438, 0, +0, 3556, 0, +0, 3678, 0, +3684, 2572, 3411, +3684, 2572, 3411, +3684, 2573, 3411, +3684, 2573, 3410, +3684, 2574, 3410, +3684, 2574, 3410, +3684, 2575, 3410, +3683, 2576, 3410, +3683, 2578, 3409, +3683, 2580, 3409, +3682, 2582, 3408, +3682, 2586, 3407, +3681, 2591, 3406, +3679, 2597, 3404, +3678, 2605, 3402, +3676, 2616, 3399, +3673, 2630, 3395, +3669, 2647, 3389, +3663, 2670, 3382, +3656, 2699, 3371, +3646, 2736, 3357, +3633, 2780, 3338, +3614, 2833, 3310, +3587, 2895, 3270, +3549, 2967, 3211, +3493, 3049, 3118, +3405, 3139, 2952, +3252, 3237, 2548, +2902, 3342, 0, +0, 3452, 0, +0, 3567, 0, +0, 3686, 0, +3818, 2686, 3538, +3818, 2686, 3538, +3818, 2686, 3538, +3818, 2686, 3537, +3817, 2687, 3537, +3817, 2687, 3537, +3817, 2688, 3537, +3817, 2689, 3537, +3817, 2690, 3537, +3817, 2692, 3536, +3816, 2694, 3536, +3816, 2696, 3535, +3815, 2700, 3534, +3814, 2705, 3533, +3813, 2711, 3531, +3811, 2720, 3529, +3809, 2731, 3526, +3806, 2745, 3522, +3802, 2764, 3516, +3797, 2788, 3508, +3790, 2818, 3498, +3780, 2855, 3484, +3766, 2900, 3464, +3748, 2955, 3436, +3721, 3018, 3395, +3683, 3092, 3335, +3627, 3174, 3240, +3540, 3266, 3070, +3387, 3365, 2644, +3042, 3470, 0, +0, 3582, 0, +0, 3697, 0, +3951, 2804, 3666, +3951, 2804, 3666, +3951, 2804, 3666, +3951, 2804, 3666, +3951, 2804, 3666, +3951, 2805, 3666, +3951, 2805, 3665, +3950, 2806, 3665, +3950, 2807, 3665, +3950, 2808, 3665, +3950, 2810, 3664, +3949, 2812, 3664, +3949, 2815, 3663, +3948, 2818, 3662, +3947, 2823, 3661, +3946, 2830, 3659, +3944, 2839, 3657, +3942, 2850, 3654, +3939, 2865, 3650, +3935, 2884, 3644, +3930, 2909, 3636, +3923, 2939, 3626, +3913, 2977, 3611, +3900, 3024, 3591, +3881, 3079, 3563, +3855, 3144, 3522, +3817, 3218, 3461, +3761, 3302, 3364, +3674, 3394, 3191, +3522, 3494, 2748, +3180, 3600, 0, +0, 3712, 0, +4084, 2925, 3795, +4084, 2925, 3795, +4084, 2925, 3795, +4084, 2925, 3795, +4084, 2925, 3795, +4084, 2926, 3795, +4083, 2926, 3795, +4083, 2926, 3795, +4083, 2927, 3794, +4083, 2928, 3794, +4083, 2929, 3794, +4083, 2931, 3794, +4082, 2933, 3793, +4082, 2936, 3792, +4081, 2940, 3791, +4080, 2945, 3790, +4079, 2952, 3788, +4077, 2961, 3786, +4075, 2972, 3783, +4072, 2988, 3779, +4068, 3007, 3773, +4063, 3032, 3765, +4056, 3063, 3755, +4046, 3102, 3740, +4033, 3149, 3720, +4014, 3205, 3691, +3988, 3271, 3650, +3950, 3346, 3589, +3894, 3430, 3491, +3807, 3523, 3314, +3656, 3623, 2857, +3317, 3730, 0, +4095, 3048, 3925, +4095, 3048, 3925, +4095, 3048, 3925, +4095, 3049, 3925, +4095, 3049, 3925, +4095, 3049, 3925, +4095, 3049, 3925, +4095, 3050, 3925, +4095, 3050, 3924, +4095, 3051, 3924, +4095, 3052, 3924, +4095, 3053, 3924, +4095, 3055, 3923, +4095, 3057, 3923, +4095, 3060, 3922, +4095, 3064, 3921, +4095, 3069, 3920, +4095, 3076, 3918, +4095, 3085, 3916, +4095, 3097, 3913, +4095, 3112, 3908, +4095, 3132, 3903, +4095, 3157, 3895, +4095, 3189, 3884, +4095, 3228, 3870, +4095, 3276, 3849, +4095, 3333, 3821, +4095, 3399, 3779, +4083, 3475, 3717, +4027, 3560, 3619, +3940, 3653, 3440, +3790, 3754, 2972, +4095, 3174, 4055, +4095, 3174, 4055, +4095, 3174, 4055, +4095, 3174, 4055, +4095, 3174, 4055, +4095, 3174, 4055, +4095, 3175, 4055, +4095, 3175, 4055, +4095, 3175, 4055, +4095, 3176, 4055, +4095, 3177, 4055, +4095, 3178, 4055, +4095, 3179, 4054, +4095, 3181, 4054, +4095, 3183, 4053, +4095, 3186, 4053, +4095, 3190, 4052, +4095, 3195, 4050, +4095, 3202, 4049, +4095, 3211, 4046, +4095, 3223, 4043, +4095, 3239, 4039, +4095, 3259, 4033, +4095, 3285, 4025, +4095, 3317, 4015, +4095, 3356, 4000, +4095, 3404, 3979, +4095, 3461, 3951, +4095, 3528, 3909, +4095, 3604, 3847, +4095, 3690, 3747, +4073, 3783, 3567, +0, 1867, 2134, +0, 1868, 2133, +0, 1869, 2132, +0, 1871, 2130, +0, 1873, 2128, +0, 1876, 2126, +0, 1880, 2122, +0, 1885, 2117, +0, 1892, 2110, +0, 1901, 2101, +0, 1913, 2088, +0, 1928, 2071, +0, 1948, 2047, +0, 1973, 2012, +0, 2004, 1961, +0, 2043, 1882, +0, 2090, 1749, +0, 2146, 1473, +0, 2212, 0, +0, 2288, 0, +0, 2372, 0, +0, 2465, 0, +0, 2566, 0, +0, 2673, 0, +0, 2785, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +0, 1867, 2135, +0, 1868, 2134, +0, 1869, 2133, +0, 1871, 2132, +0, 1873, 2130, +0, 1876, 2127, +0, 1880, 2123, +0, 1885, 2118, +0, 1892, 2112, +0, 1901, 2102, +0, 1913, 2090, +0, 1928, 2072, +0, 1948, 2048, +0, 1973, 2013, +0, 2004, 1962, +0, 2043, 1884, +0, 2090, 1752, +0, 2147, 1479, +0, 2213, 0, +0, 2288, 0, +0, 2372, 0, +0, 2465, 0, +0, 2566, 0, +0, 2673, 0, +0, 2785, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3654, 0, +0, 1868, 2137, +0, 1869, 2136, +0, 1870, 2135, +0, 1872, 2133, +0, 1874, 2131, +0, 1877, 2129, +0, 1881, 2125, +0, 1886, 2120, +0, 1893, 2113, +0, 1902, 2104, +0, 1913, 2092, +0, 1929, 2074, +0, 1948, 2050, +0, 1973, 2016, +0, 2004, 1965, +0, 2043, 1887, +0, 2091, 1756, +0, 2147, 1486, +0, 2213, 0, +0, 2288, 0, +0, 2373, 0, +0, 2466, 0, +0, 2566, 0, +0, 2673, 0, +0, 2785, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +0, 1868, 2139, +0, 1869, 2138, +0, 1870, 2137, +0, 1872, 2136, +0, 1874, 2134, +0, 1877, 2131, +0, 1881, 2127, +0, 1886, 2122, +0, 1893, 2116, +0, 1902, 2107, +0, 1914, 2094, +0, 1929, 2077, +0, 1949, 2053, +0, 1974, 2019, +0, 2005, 1968, +0, 2044, 1891, +0, 2091, 1761, +0, 2147, 1495, +0, 2213, 0, +0, 2288, 0, +0, 2373, 0, +0, 2466, 0, +0, 2566, 0, +0, 2673, 0, +0, 2785, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +0, 1869, 2142, +0, 1870, 2141, +0, 1871, 2140, +0, 1873, 2139, +0, 1875, 2137, +0, 1878, 2134, +0, 1882, 2130, +0, 1887, 2125, +0, 1894, 2119, +0, 1903, 2110, +0, 1915, 2097, +0, 1930, 2080, +0, 1949, 2056, +0, 1974, 2022, +0, 2005, 1973, +0, 2044, 1896, +0, 2091, 1768, +0, 2148, 1508, +0, 2213, 0, +0, 2289, 0, +0, 2373, 0, +0, 2466, 0, +0, 2566, 0, +0, 2673, 0, +0, 2785, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +0, 1870, 2146, +0, 1871, 2145, +0, 1872, 2144, +0, 1874, 2143, +0, 1876, 2141, +0, 1879, 2138, +0, 1883, 2134, +0, 1888, 2130, +0, 1895, 2123, +0, 1904, 2114, +0, 1915, 2102, +0, 1931, 2085, +0, 1950, 2061, +0, 1975, 2028, +0, 2006, 1978, +0, 2045, 1903, +0, 2092, 1777, +0, 2148, 1523, +0, 2214, 0, +0, 2289, 0, +0, 2373, 0, +0, 2466, 0, +0, 2567, 0, +0, 2673, 0, +0, 2786, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3270, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +0, 1871, 2151, +0, 1872, 2151, +0, 1874, 2149, +0, 1875, 2148, +0, 1877, 2146, +0, 1880, 2143, +0, 1884, 2140, +0, 1889, 2135, +0, 1896, 2129, +0, 1905, 2120, +0, 1917, 2108, +0, 1932, 2091, +0, 1951, 2068, +0, 1976, 2034, +0, 2007, 1986, +0, 2046, 1912, +0, 2093, 1788, +0, 2149, 1544, +0, 2214, 145, +0, 2290, 0, +0, 2374, 0, +0, 2467, 0, +0, 2567, 0, +0, 2674, 0, +0, 2786, 0, +0, 2902, 0, +0, 3022, 0, +0, 3145, 0, +0, 3271, 0, +0, 3397, 0, +0, 3525, 0, +0, 3655, 0, +0, 1873, 2158, +0, 1874, 2157, +0, 1875, 2156, +0, 1877, 2155, +0, 1879, 2153, +0, 1882, 2150, +0, 1886, 2147, +0, 1891, 2142, +0, 1898, 2136, +0, 1907, 2127, +0, 1918, 2115, +0, 1933, 2099, +0, 1953, 2076, +0, 1977, 2043, +0, 2009, 1996, +0, 2047, 1923, +0, 2094, 1804, +0, 2150, 1570, +0, 2215, 518, +0, 2290, 0, +0, 2374, 0, +0, 2467, 0, +0, 2567, 0, +0, 2674, 0, +0, 2786, 0, +0, 2902, 0, +0, 3023, 0, +0, 3146, 0, +0, 3271, 0, +0, 3397, 0, +0, 3526, 0, +0, 3655, 0, +0, 1876, 2167, +0, 1876, 2167, +0, 1878, 2166, +0, 1879, 2164, +0, 1882, 2162, +0, 1884, 2160, +0, 1888, 2156, +0, 1893, 2152, +0, 1900, 2145, +0, 1909, 2137, +0, 1920, 2125, +0, 1935, 2109, +0, 1955, 2087, +0, 1979, 2055, +0, 2010, 2009, +0, 2049, 1938, +0, 2095, 1823, +0, 2151, 1602, +0, 2216, 772, +0, 2291, 0, +0, 2375, 0, +0, 2468, 0, +0, 2568, 0, +0, 2674, 0, +0, 2786, 0, +0, 2903, 0, +0, 3023, 0, +0, 3146, 0, +0, 3271, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +0, 1879, 2179, +0, 1880, 2179, +0, 1881, 2178, +0, 1883, 2176, +0, 1885, 2174, +0, 1888, 2172, +0, 1891, 2168, +0, 1896, 2164, +0, 1903, 2158, +0, 1912, 2150, +0, 1923, 2138, +0, 1938, 2123, +0, 1957, 2101, +0, 1982, 2070, +0, 2013, 2026, +0, 2051, 1958, +0, 2097, 1848, +0, 2153, 1642, +0, 2218, 978, +0, 2293, 0, +0, 2376, 0, +0, 2469, 0, +0, 2568, 0, +0, 2675, 0, +0, 2787, 0, +0, 2903, 0, +0, 3023, 0, +0, 3146, 0, +0, 3271, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +0, 1883, 2195, +0, 1884, 2194, +0, 1885, 2193, +0, 1887, 2192, +0, 1889, 2190, +0, 1892, 2188, +0, 1895, 2184, +0, 1900, 2180, +0, 1907, 2174, +0, 1916, 2166, +0, 1927, 2155, +0, 1942, 2140, +0, 1961, 2119, +0, 1985, 2090, +0, 2016, 2047, +0, 2054, 1983, +0, 2100, 1880, +0, 2155, 1691, +0, 2220, 1158, +0, 2294, 0, +0, 2378, 0, +0, 2470, 0, +0, 2569, 0, +0, 2676, 0, +0, 2787, 0, +0, 2904, 0, +0, 3023, 0, +0, 3146, 0, +0, 3271, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +0, 1889, 2215, +0, 1889, 2214, +0, 1891, 2213, +0, 1892, 2212, +0, 1894, 2210, +0, 1897, 2208, +0, 1901, 2205, +0, 1906, 2200, +0, 1912, 2195, +0, 1921, 2187, +0, 1932, 2177, +0, 1947, 2163, +0, 1966, 2143, +0, 1990, 2115, +0, 2020, 2074, +0, 2058, 2014, +0, 2103, 1919, +0, 2158, 1748, +0, 2223, 1323, +0, 2296, 0, +0, 2380, 0, +0, 2471, 0, +0, 2571, 0, +0, 2677, 0, +0, 2788, 0, +0, 2904, 0, +0, 3024, 0, +0, 3146, 0, +0, 3271, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +241, 1896, 2240, +162, 1897, 2239, +31, 1898, 2238, +0, 1900, 2237, +0, 1902, 2236, +0, 1904, 2233, +0, 1908, 2230, +0, 1913, 2227, +0, 1919, 2221, +0, 1928, 2214, +0, 1939, 2204, +0, 1953, 2191, +0, 1972, 2172, +0, 1996, 2146, +0, 2026, 2108, +0, 2063, 2053, +0, 2108, 1966, +0, 2162, 1816, +0, 2226, 1478, +0, 2299, 0, +0, 2382, 0, +0, 2473, 0, +0, 2572, 0, +0, 2678, 0, +0, 2789, 0, +0, 2905, 0, +0, 3024, 0, +0, 3147, 0, +0, 3272, 0, +0, 3398, 0, +0, 3526, 0, +0, 3655, 0, +1385, 1906, 2272, +1379, 1906, 2271, +1371, 1908, 2270, +1360, 1909, 2269, +1345, 1911, 2268, +1325, 1914, 2266, +1296, 1917, 2263, +1253, 1922, 2259, +1190, 1929, 2254, +1089, 1937, 2248, +903, 1948, 2239, +397, 1962, 2226, +0, 1980, 2209, +0, 2003, 2185, +0, 2033, 2150, +0, 2069, 2100, +0, 2114, 2023, +0, 2168, 1893, +0, 2231, 1627, +0, 2303, 0, +0, 2385, 0, +0, 2476, 0, +0, 2574, 0, +0, 2680, 0, +0, 2790, 0, +0, 2906, 0, +0, 3025, 0, +0, 3148, 0, +0, 3272, 0, +0, 3399, 0, +0, 3526, 0, +0, 3655, 0, +1749, 1918, 2311, +1747, 1919, 2310, +1743, 1920, 2310, +1738, 1922, 2309, +1732, 1924, 2307, +1723, 1926, 2305, +1711, 1930, 2303, +1695, 1934, 2300, +1672, 1941, 2295, +1639, 1949, 2289, +1592, 1959, 2281, +1519, 1973, 2269, +1399, 1991, 2254, +1164, 2014, 2232, +83, 2042, 2201, +0, 2078, 2156, +0, 2122, 2088, +0, 2175, 1978, +0, 2237, 1771, +0, 2309, 1096, +0, 2390, 0, +0, 2480, 0, +0, 2577, 0, +0, 2682, 0, +0, 2792, 0, +0, 2907, 0, +0, 3026, 0, +0, 3148, 0, +0, 3273, 0, +0, 3399, 0, +0, 3527, 0, +0, 3656, 0, +2000, 1935, 2359, +1999, 1935, 2358, +1997, 1936, 2358, +1994, 1938, 2357, +1990, 1940, 2355, +1985, 1942, 2354, +1979, 1946, 2351, +1970, 1950, 2348, +1957, 1956, 2344, +1940, 1964, 2339, +1916, 1974, 2331, +1882, 1988, 2321, +1832, 2005, 2307, +1755, 2027, 2288, +1626, 2055, 2261, +1364, 2090, 2222, +0, 2133, 2164, +0, 2184, 2073, +0, 2245, 1912, +0, 2316, 1531, +0, 2396, 0, +0, 2484, 0, +0, 2581, 0, +0, 2685, 0, +0, 2795, 0, +0, 2909, 0, +0, 3028, 0, +0, 3149, 0, +0, 3274, 0, +0, 3400, 0, +0, 3527, 0, +0, 3656, 0, +2205, 1955, 2416, +2204, 1956, 2415, +2202, 1957, 2415, +2201, 1959, 2414, +2198, 1960, 2413, +2195, 1963, 2411, +2191, 1966, 2409, +2185, 1970, 2407, +2178, 1976, 2403, +2167, 1984, 2398, +2153, 1993, 2392, +2133, 2006, 2383, +2105, 2023, 2371, +2064, 2044, 2354, +2003, 2071, 2331, +1907, 2105, 2297, +1734, 2146, 2249, +1297, 2196, 2174, +0, 2256, 2050, +0, 2325, 1804, +0, 2403, 318, +0, 2491, 0, +0, 2586, 0, +0, 2689, 0, +0, 2798, 0, +0, 2912, 0, +0, 3030, 0, +0, 3151, 0, +0, 3275, 0, +0, 3401, 0, +0, 3528, 0, +0, 3656, 0, +2384, 1982, 2482, +2383, 1983, 2482, +2382, 1984, 2481, +2381, 1985, 2480, +2380, 1987, 2479, +2378, 1989, 2478, +2375, 1992, 2476, +2371, 1996, 2474, +2366, 2002, 2471, +2359, 2009, 2467, +2350, 2018, 2461, +2337, 2030, 2454, +2319, 2046, 2443, +2294, 2066, 2429, +2259, 2092, 2410, +2206, 2124, 2382, +2125, 2164, 2342, +1987, 2212, 2282, +1696, 2270, 2187, +0, 2337, 2019, +0, 2414, 1603, +0, 2499, 0, +0, 2593, 0, +0, 2694, 0, +0, 2802, 0, +0, 2915, 0, +0, 3032, 0, +0, 3153, 0, +0, 3276, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +2549, 2015, 2558, +2548, 2016, 2558, +2547, 2017, 2557, +2547, 2018, 2557, +2546, 2020, 2556, +2544, 2022, 2555, +2542, 2025, 2553, +2540, 2029, 2551, +2536, 2034, 2549, +2531, 2040, 2545, +2525, 2049, 2541, +2516, 2060, 2534, +2504, 2075, 2526, +2488, 2094, 2514, +2465, 2118, 2497, +2432, 2149, 2475, +2385, 2187, 2442, +2312, 2233, 2395, +2192, 2288, 2323, +1958, 2352, 2204, +895, 2427, 1973, +0, 2510, 982, +0, 2602, 0, +0, 2702, 0, +0, 2808, 0, +0, 2919, 0, +0, 3036, 0, +0, 3156, 0, +0, 3278, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +2703, 2056, 2643, +2703, 2057, 2643, +2703, 2058, 2642, +2702, 2059, 2642, +2701, 2060, 2641, +2700, 2062, 2640, +2699, 2065, 2639, +2697, 2068, 2637, +2695, 2073, 2635, +2691, 2079, 2632, +2687, 2087, 2629, +2681, 2097, 2623, +2673, 2111, 2616, +2661, 2129, 2607, +2646, 2151, 2593, +2624, 2180, 2575, +2593, 2215, 2549, +2549, 2259, 2512, +2482, 2311, 2458, +2373, 2373, 2373, +2168, 2444, 2226, +1516, 2524, 1903, +0, 2614, 0, +0, 2711, 0, +0, 2815, 0, +0, 2925, 0, +0, 3040, 0, +0, 3159, 0, +0, 3281, 0, +0, 3405, 0, +0, 3531, 0, +0, 3659, 0, +2852, 2106, 2736, +2852, 2107, 2736, +2851, 2107, 2736, +2851, 2108, 2735, +2850, 2110, 2735, +2850, 2111, 2734, +2849, 2114, 2733, +2847, 2117, 2732, +2846, 2121, 2730, +2843, 2126, 2728, +2840, 2134, 2725, +2836, 2143, 2720, +2830, 2155, 2715, +2822, 2171, 2707, +2811, 2192, 2696, +2796, 2218, 2682, +2775, 2251, 2662, +2746, 2291, 2633, +2703, 2340, 2592, +2640, 2398, 2530, +2537, 2466, 2431, +2350, 2543, 2254, +1830, 2629, 1790, +0, 2723, 0, +0, 2825, 0, +0, 2933, 0, +0, 3046, 0, +0, 3164, 0, +0, 3284, 0, +0, 3408, 0, +0, 3533, 0, +0, 3661, 0, +2996, 2165, 2837, +2996, 2165, 2837, +2995, 2166, 2837, +2995, 2167, 2836, +2995, 2168, 2836, +2994, 2170, 2835, +2994, 2172, 2835, +2993, 2174, 2834, +2991, 2178, 2832, +2990, 2183, 2830, +2987, 2189, 2828, +2984, 2198, 2825, +2980, 2209, 2820, +2974, 2223, 2814, +2966, 2241, 2805, +2956, 2265, 2794, +2941, 2294, 2778, +2921, 2331, 2756, +2893, 2376, 2725, +2852, 2430, 2680, +2790, 2493, 2611, +2693, 2566, 2500, +2517, 2648, 2288, +2062, 2739, 1573, +0, 2838, 0, +0, 2943, 0, +0, 3054, 0, +0, 3170, 0, +0, 3289, 0, +0, 3412, 0, +0, 3536, 0, +0, 3663, 0, +3137, 2233, 2944, +3136, 2234, 2944, +3136, 2234, 2944, +3136, 2235, 2944, +3136, 2236, 2944, +3135, 2238, 2943, +3135, 2239, 2942, +3134, 2242, 2942, +3133, 2245, 2941, +3132, 2249, 2939, +3130, 2254, 2937, +3128, 2262, 2934, +3125, 2271, 2931, +3121, 2284, 2926, +3115, 2300, 2920, +3108, 2320, 2911, +3097, 2347, 2899, +3083, 2380, 2882, +3063, 2420, 2858, +3036, 2469, 2825, +2996, 2528, 2776, +2936, 2596, 2702, +2841, 2673, 2578, +2673, 2760, 2331, +2257, 2854, 796, +0, 2956, 0, +0, 3064, 0, +0, 3178, 0, +0, 3295, 0, +0, 3416, 0, +0, 3540, 0, +0, 3665, 0, +3275, 2311, 3057, +3275, 2312, 3057, +3275, 2312, 3057, +3275, 2313, 3057, +3275, 2314, 3056, +3274, 2315, 3056, +3274, 2316, 3055, +3273, 2318, 3055, +3273, 2321, 3054, +3272, 2324, 3053, +3270, 2329, 3051, +3269, 2335, 3049, +3267, 2343, 3046, +3263, 2354, 3043, +3259, 2368, 3038, +3254, 2386, 3031, +3246, 2409, 3022, +3236, 2437, 3009, +3222, 2473, 2991, +3203, 2517, 2967, +3175, 2570, 2931, +3136, 2633, 2880, +3078, 2704, 2800, +2985, 2786, 2665, +2822, 2875, 2382, +2431, 2973, 0, +0, 3078, 0, +0, 3188, 0, +0, 3303, 0, +0, 3422, 0, +0, 3545, 0, +0, 3669, 0, +3412, 2398, 3174, +3412, 2399, 3174, +3412, 2399, 3174, +3412, 2400, 3174, +3411, 2400, 3173, +3411, 2401, 3173, +3411, 2402, 3173, +3411, 2404, 3172, +3410, 2406, 3172, +3409, 2409, 3171, +3408, 2413, 3170, +3407, 2418, 3168, +3406, 2425, 3166, +3403, 2434, 3163, +3400, 2445, 3159, +3396, 2461, 3154, +3391, 2480, 3147, +3383, 2505, 3137, +3373, 2536, 3124, +3360, 2574, 3106, +3340, 2621, 3080, +3313, 2677, 3043, +3275, 2743, 2989, +3217, 2818, 2905, +3126, 2902, 2760, +2967, 2995, 2442, +2592, 3095, 0, +0, 3202, 0, +0, 3314, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +3547, 2493, 3294, +3547, 2494, 3294, +3547, 2494, 3294, +3547, 2494, 3294, +3547, 2495, 3294, +3547, 2496, 3294, +3547, 2497, 3293, +3547, 2498, 3293, +3546, 2500, 3293, +3546, 2502, 3292, +3545, 2505, 3291, +3544, 2510, 3290, +3543, 2515, 3288, +3541, 2522, 3286, +3539, 2532, 3283, +3536, 2545, 3279, +3532, 2561, 3274, +3527, 2582, 3266, +3519, 2608, 3257, +3509, 2641, 3243, +3496, 2682, 3224, +3476, 2731, 3198, +3450, 2790, 3160, +3411, 2858, 3103, +3354, 2936, 3015, +3265, 3023, 2862, +3108, 3118, 2512, +2745, 3220, 0, +0, 3328, 0, +0, 3442, 0, +0, 3559, 0, +0, 3680, 0, +3682, 2596, 3418, +3682, 2596, 3417, +3682, 2596, 3417, +3682, 2597, 3417, +3682, 2597, 3417, +3682, 2598, 3417, +3682, 2598, 3417, +3681, 2599, 3417, +3681, 2601, 3416, +3681, 2603, 3416, +3680, 2605, 3415, +3680, 2609, 3414, +3679, 2613, 3413, +3677, 2619, 3411, +3676, 2627, 3409, +3674, 2637, 3406, +3671, 2650, 3402, +3667, 2667, 3396, +3661, 2689, 3389, +3654, 2717, 3379, +3644, 2752, 3365, +3630, 2795, 3346, +3612, 2846, 3319, +3585, 2907, 3280, +3547, 2977, 3222, +3490, 3057, 3131, +3401, 3146, 2970, +3247, 3242, 2592, +2892, 3346, 0, +0, 3456, 0, +0, 3570, 0, +0, 3689, 0, +3816, 2704, 3543, +3816, 2704, 3543, +3816, 2705, 3543, +3816, 2705, 3543, +3816, 2705, 3543, +3816, 2706, 3542, +3816, 2706, 3542, +3816, 2707, 3542, +3815, 2708, 3542, +3815, 2710, 3541, +3815, 2712, 3541, +3814, 2714, 3540, +3814, 2718, 3539, +3813, 2723, 3538, +3811, 2729, 3536, +3810, 2737, 3534, +3808, 2748, 3531, +3805, 2762, 3527, +3801, 2780, 3521, +3795, 2803, 3514, +3788, 2832, 3504, +3778, 2868, 3489, +3765, 2912, 3470, +3746, 2965, 3442, +3719, 3027, 3403, +3681, 3099, 3343, +3625, 3181, 3250, +3537, 3271, 3084, +3384, 3369, 2680, +3034, 3474, 0, +0, 3584, 0, +0, 3699, 0, +3950, 2818, 3670, +3950, 2818, 3670, +3950, 2818, 3670, +3950, 2818, 3670, +3950, 2819, 3670, +3950, 2819, 3669, +3949, 2819, 3669, +3949, 2820, 3669, +3949, 2821, 3669, +3949, 2822, 3669, +3949, 2824, 3668, +3948, 2826, 3668, +3948, 2829, 3667, +3947, 2832, 3666, +3946, 2837, 3665, +3945, 2844, 3663, +3943, 2852, 3661, +3941, 2863, 3658, +3938, 2878, 3654, +3934, 2896, 3648, +3929, 2920, 3640, +3922, 2950, 3630, +3912, 2987, 3616, +3898, 3032, 3596, +3880, 3087, 3568, +3853, 3151, 3528, +3815, 3224, 3467, +3759, 3307, 3372, +3672, 3398, 3202, +3520, 3497, 2776, +3174, 3602, 0, +0, 3714, 0, +4083, 2936, 3798, +4083, 2936, 3798, +4083, 2936, 3798, +4083, 2936, 3798, +4083, 2936, 3798, +4083, 2936, 3798, +4083, 2937, 3798, +4083, 2937, 3798, +4082, 2938, 3797, +4082, 2939, 3797, +4082, 2940, 3797, +4082, 2942, 3796, +4081, 2944, 3796, +4081, 2947, 3795, +4080, 2951, 3794, +4079, 2956, 3793, +4078, 2962, 3791, +4077, 2971, 3789, +4074, 2982, 3786, +4071, 2997, 3782, +4068, 3016, 3776, +4062, 3041, 3768, +4055, 3071, 3758, +4045, 3109, 3743, +4032, 3156, 3723, +4013, 3211, 3695, +3987, 3276, 3654, +3949, 3350, 3593, +3893, 3434, 3496, +3806, 3526, 3323, +3654, 3626, 2880, +3312, 3732, 0, +4095, 3057, 3927, +4095, 3057, 3927, +4095, 3057, 3927, +4095, 3057, 3927, +4095, 3057, 3927, +4095, 3057, 3927, +4095, 3058, 3927, +4095, 3058, 3927, +4095, 3059, 3927, +4095, 3059, 3927, +4095, 3060, 3926, +4095, 3061, 3926, +4095, 3063, 3926, +4095, 3065, 3925, +4095, 3068, 3924, +4095, 3072, 3923, +4095, 3077, 3922, +4095, 3084, 3920, +4095, 3093, 3918, +4095, 3105, 3915, +4095, 3120, 3911, +4095, 3139, 3905, +4095, 3164, 3897, +4095, 3195, 3887, +4095, 3234, 3872, +4095, 3281, 3852, +4095, 3337, 3823, +4095, 3403, 3782, +4082, 3478, 3721, +4026, 3562, 3623, +3939, 3655, 3446, +3788, 3755, 2989, +4095, 3180, 4057, +4095, 3180, 4057, +4095, 3180, 4057, +4095, 3181, 4057, +4095, 3181, 4057, +4095, 3181, 4057, +4095, 3181, 4057, +4095, 3181, 4057, +4095, 3182, 4057, +4095, 3182, 4057, +4095, 3183, 4056, +4095, 3184, 4056, +4095, 3185, 4056, +4095, 3187, 4055, +4095, 3189, 4055, +4095, 3192, 4054, +4095, 3196, 4053, +4095, 3201, 4052, +4095, 3208, 4050, +4095, 3217, 4048, +4095, 3229, 4045, +4095, 3245, 4040, +4095, 3264, 4035, +4095, 3290, 4027, +4095, 3321, 4016, +4095, 3360, 4002, +4095, 3408, 3981, +4095, 3465, 3953, +4095, 3531, 3911, +4095, 3607, 3849, +4095, 3692, 3751, +4073, 3785, 3572, +0, 1998, 2266, +0, 1999, 2265, +0, 2000, 2264, +0, 2001, 2263, +0, 2003, 2262, +0, 2005, 2260, +0, 2008, 2257, +0, 2012, 2253, +0, 2017, 2248, +0, 2024, 2241, +0, 2033, 2232, +0, 2045, 2219, +0, 2060, 2202, +0, 2079, 2177, +0, 2104, 2143, +0, 2136, 2091, +0, 2175, 2012, +0, 2222, 1879, +0, 2278, 1601, +0, 2344, 0, +0, 2420, 0, +0, 2504, 0, +0, 2597, 0, +0, 2698, 0, +0, 2805, 0, +0, 2917, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +0, 1998, 2267, +0, 1999, 2266, +0, 2000, 2265, +0, 2001, 2264, +0, 2003, 2263, +0, 2005, 2260, +0, 2008, 2258, +0, 2012, 2254, +0, 2017, 2249, +0, 2024, 2242, +0, 2033, 2233, +0, 2045, 2220, +0, 2060, 2203, +0, 2080, 2179, +0, 2105, 2144, +0, 2136, 2093, +0, 2175, 2014, +0, 2222, 1881, +0, 2279, 1606, +0, 2344, 0, +0, 2420, 0, +0, 2504, 0, +0, 2597, 0, +0, 2698, 0, +0, 2805, 0, +0, 2917, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +0, 1999, 2268, +0, 1999, 2267, +0, 2000, 2266, +0, 2002, 2265, +0, 2003, 2264, +0, 2005, 2262, +0, 2008, 2259, +0, 2012, 2255, +0, 2017, 2250, +0, 2024, 2244, +0, 2033, 2234, +0, 2045, 2222, +0, 2060, 2204, +0, 2080, 2180, +0, 2105, 2145, +0, 2136, 2095, +0, 2175, 2016, +0, 2222, 1884, +0, 2279, 1611, +0, 2345, 0, +0, 2420, 0, +0, 2505, 0, +0, 2598, 0, +0, 2698, 0, +0, 2805, 0, +0, 2917, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +0, 1999, 2270, +0, 2000, 2269, +0, 2001, 2268, +0, 2002, 2267, +0, 2004, 2265, +0, 2006, 2263, +0, 2009, 2261, +0, 2013, 2257, +0, 2018, 2252, +0, 2025, 2245, +0, 2034, 2236, +0, 2045, 2224, +0, 2061, 2206, +0, 2080, 2182, +0, 2105, 2148, +0, 2137, 2097, +0, 2175, 2019, +0, 2223, 1888, +0, 2279, 1618, +0, 2345, 0, +0, 2420, 0, +0, 2505, 0, +0, 2598, 0, +0, 2698, 0, +0, 2805, 0, +0, 2917, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +0, 2000, 2272, +0, 2000, 2271, +0, 2001, 2270, +0, 2003, 2269, +0, 2004, 2268, +0, 2006, 2266, +0, 2009, 2263, +0, 2013, 2259, +0, 2018, 2254, +0, 2025, 2248, +0, 2034, 2239, +0, 2046, 2226, +0, 2061, 2209, +0, 2081, 2185, +0, 2106, 2151, +0, 2137, 2100, +0, 2176, 2023, +0, 2223, 1893, +0, 2279, 1627, +0, 2345, 0, +0, 2420, 0, +0, 2505, 0, +0, 2598, 0, +0, 2698, 0, +0, 2805, 0, +0, 2917, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3402, 0, +0, 3529, 0, +0, 3657, 0, +0, 2000, 2275, +0, 2001, 2274, +0, 2002, 2273, +0, 2003, 2272, +0, 2005, 2271, +0, 2007, 2269, +0, 2010, 2266, +0, 2014, 2262, +0, 2019, 2258, +0, 2026, 2251, +0, 2035, 2242, +0, 2047, 2230, +0, 2062, 2212, +0, 2081, 2189, +0, 2106, 2155, +0, 2138, 2105, +0, 2176, 2028, +0, 2223, 1900, +0, 2280, 1640, +0, 2345, 0, +0, 2421, 0, +0, 2505, 0, +0, 2598, 0, +0, 2698, 0, +0, 2805, 0, +0, 2917, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3403, 0, +0, 3529, 0, +0, 3658, 0, +0, 2001, 2279, +0, 2002, 2278, +0, 2003, 2277, +0, 2004, 2276, +0, 2006, 2275, +0, 2008, 2273, +0, 2011, 2270, +0, 2015, 2267, +0, 2020, 2262, +0, 2027, 2255, +0, 2036, 2246, +0, 2048, 2234, +0, 2063, 2217, +0, 2082, 2193, +0, 2107, 2160, +0, 2138, 2110, +0, 2177, 2035, +0, 2224, 1909, +0, 2280, 1655, +0, 2346, 0, +0, 2421, 0, +0, 2505, 0, +0, 2598, 0, +0, 2699, 0, +0, 2805, 0, +0, 2918, 0, +0, 3034, 0, +0, 3154, 0, +0, 3277, 0, +0, 3403, 0, +0, 3529, 0, +0, 3658, 0, +0, 2003, 2284, +0, 2003, 2283, +0, 2004, 2283, +0, 2006, 2282, +0, 2007, 2280, +0, 2009, 2278, +0, 2012, 2275, +0, 2016, 2272, +0, 2021, 2267, +0, 2028, 2261, +0, 2037, 2252, +0, 2049, 2240, +0, 2064, 2223, +0, 2083, 2200, +0, 2108, 2166, +0, 2139, 2118, +0, 2178, 2044, +0, 2225, 1921, +0, 2281, 1676, +0, 2347, 277, +0, 2422, 0, +0, 2506, 0, +0, 2599, 0, +0, 2699, 0, +0, 2806, 0, +0, 2918, 0, +0, 3034, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3529, 0, +0, 3658, 0, +0, 2005, 2291, +0, 2005, 2290, +0, 2006, 2290, +0, 2007, 2288, +0, 2009, 2287, +0, 2011, 2285, +0, 2014, 2283, +0, 2018, 2279, +0, 2023, 2274, +0, 2030, 2268, +0, 2039, 2259, +0, 2050, 2247, +0, 2065, 2231, +0, 2085, 2208, +0, 2110, 2175, +0, 2141, 2128, +0, 2179, 2055, +0, 2226, 1936, +0, 2282, 1702, +0, 2347, 650, +0, 2422, 0, +0, 2507, 0, +0, 2599, 0, +0, 2699, 0, +0, 2806, 0, +0, 2918, 0, +0, 3035, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +0, 2007, 2300, +0, 2008, 2299, +0, 2009, 2299, +0, 2010, 2298, +0, 2011, 2296, +0, 2014, 2294, +0, 2017, 2292, +0, 2020, 2288, +0, 2025, 2284, +0, 2032, 2277, +0, 2041, 2269, +0, 2053, 2257, +0, 2068, 2241, +0, 2087, 2219, +0, 2111, 2187, +0, 2142, 2141, +0, 2181, 2071, +0, 2227, 1955, +0, 2283, 1734, +0, 2349, 904, +0, 2423, 0, +0, 2507, 0, +0, 2600, 0, +0, 2700, 0, +0, 2806, 0, +0, 2918, 0, +0, 3035, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +0, 2010, 2312, +0, 2011, 2311, +0, 2012, 2311, +0, 2013, 2310, +0, 2015, 2308, +0, 2017, 2306, +0, 2020, 2304, +0, 2023, 2301, +0, 2029, 2296, +0, 2035, 2290, +0, 2044, 2282, +0, 2055, 2270, +0, 2070, 2255, +0, 2090, 2233, +0, 2114, 2202, +0, 2145, 2158, +0, 2183, 2090, +0, 2229, 1980, +0, 2285, 1774, +0, 2350, 1110, +0, 2425, 0, +0, 2508, 0, +0, 2601, 0, +0, 2700, 0, +0, 2807, 0, +0, 2919, 0, +0, 3035, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +0, 2014, 2327, +0, 2015, 2327, +0, 2016, 2326, +0, 2017, 2325, +0, 2019, 2324, +0, 2021, 2322, +0, 2024, 2320, +0, 2028, 2316, +0, 2033, 2312, +0, 2039, 2306, +0, 2048, 2298, +0, 2059, 2287, +0, 2074, 2272, +0, 2093, 2251, +0, 2117, 2222, +0, 2148, 2179, +0, 2186, 2115, +0, 2232, 2012, +0, 2287, 1823, +0, 2352, 1290, +0, 2426, 0, +0, 2510, 0, +0, 2602, 0, +0, 2701, 0, +0, 2808, 0, +0, 2919, 0, +0, 3036, 0, +0, 3155, 0, +0, 3278, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +0, 2020, 2347, +0, 2021, 2347, +0, 2022, 2346, +0, 2023, 2345, +0, 2024, 2344, +0, 2026, 2342, +0, 2029, 2340, +0, 2033, 2337, +0, 2038, 2333, +0, 2044, 2327, +0, 2053, 2319, +0, 2064, 2309, +0, 2079, 2295, +0, 2098, 2275, +0, 2122, 2247, +0, 2152, 2206, +0, 2190, 2146, +0, 2235, 2051, +0, 2290, 1881, +0, 2355, 1455, +0, 2429, 0, +0, 2512, 0, +0, 2603, 0, +0, 2703, 0, +0, 2809, 0, +0, 2920, 0, +0, 3036, 0, +0, 3156, 0, +0, 3279, 0, +0, 3403, 0, +0, 3530, 0, +0, 3658, 0, +423, 2027, 2373, +373, 2028, 2372, +295, 2029, 2371, +163, 2030, 2370, +0, 2032, 2369, +0, 2034, 2368, +0, 2036, 2365, +0, 2040, 2363, +0, 2045, 2359, +0, 2051, 2353, +0, 2060, 2346, +0, 2071, 2336, +0, 2085, 2323, +0, 2104, 2304, +0, 2128, 2278, +0, 2158, 2241, +0, 2195, 2185, +0, 2240, 2098, +0, 2294, 1948, +0, 2358, 1610, +0, 2432, 0, +0, 2514, 0, +0, 2605, 0, +0, 2704, 0, +0, 2810, 0, +0, 2921, 0, +0, 3037, 0, +0, 3157, 0, +0, 3279, 0, +0, 3404, 0, +0, 3530, 0, +0, 3658, 0, +1521, 2037, 2404, +1517, 2038, 2404, +1511, 2039, 2403, +1503, 2040, 2402, +1492, 2041, 2401, +1477, 2043, 2400, +1457, 2046, 2398, +1428, 2050, 2395, +1385, 2054, 2391, +1322, 2061, 2386, +1221, 2069, 2380, +1036, 2080, 2371, +529, 2094, 2358, +0, 2112, 2341, +0, 2135, 2317, +0, 2165, 2283, +0, 2201, 2232, +0, 2246, 2155, +0, 2300, 2025, +0, 2363, 1759, +0, 2436, 0, +0, 2518, 0, +0, 2608, 0, +0, 2707, 0, +0, 2812, 0, +0, 2923, 0, +0, 3038, 0, +0, 3157, 0, +0, 3280, 0, +0, 3404, 0, +0, 3531, 0, +0, 3659, 0, +1883, 2050, 2444, +1881, 2050, 2443, +1879, 2051, 2443, +1875, 2052, 2442, +1870, 2054, 2441, +1864, 2056, 2439, +1855, 2058, 2437, +1843, 2062, 2435, +1827, 2066, 2432, +1804, 2073, 2427, +1771, 2081, 2421, +1724, 2091, 2413, +1651, 2105, 2401, +1531, 2123, 2386, +1296, 2146, 2364, +216, 2174, 2333, +0, 2210, 2288, +0, 2254, 2221, +0, 2307, 2111, +0, 2369, 1903, +0, 2441, 1228, +0, 2522, 0, +0, 2612, 0, +0, 2709, 0, +0, 2814, 0, +0, 2924, 0, +0, 3039, 0, +0, 3158, 0, +0, 3280, 0, +0, 3405, 0, +0, 3531, 0, +0, 3659, 0, +2133, 2066, 2491, +2132, 2067, 2491, +2131, 2067, 2490, +2129, 2068, 2490, +2126, 2070, 2489, +2122, 2072, 2487, +2118, 2074, 2486, +2111, 2078, 2484, +2102, 2082, 2481, +2089, 2088, 2476, +2072, 2096, 2471, +2048, 2106, 2464, +2014, 2120, 2453, +1964, 2137, 2440, +1887, 2159, 2420, +1758, 2187, 2393, +1496, 2222, 2354, +0, 2265, 2296, +0, 2316, 2205, +0, 2377, 2044, +0, 2448, 1663, +0, 2528, 0, +0, 2617, 0, +0, 2713, 0, +0, 2817, 0, +0, 2927, 0, +0, 3041, 0, +0, 3160, 0, +0, 3282, 0, +0, 3406, 0, +0, 3532, 0, +0, 3659, 0, +2337, 2087, 2548, +2337, 2088, 2548, +2336, 2088, 2547, +2334, 2089, 2547, +2333, 2091, 2546, +2330, 2093, 2545, +2327, 2095, 2543, +2323, 2098, 2541, +2317, 2103, 2539, +2310, 2108, 2535, +2299, 2116, 2530, +2285, 2126, 2524, +2265, 2138, 2515, +2237, 2155, 2503, +2196, 2176, 2486, +2135, 2203, 2463, +2039, 2237, 2429, +1866, 2278, 2381, +1429, 2329, 2306, +0, 2388, 2182, +0, 2457, 1936, +0, 2536, 450, +0, 2623, 0, +0, 2718, 0, +0, 2821, 0, +0, 2930, 0, +0, 3044, 0, +0, 3162, 0, +0, 3283, 0, +0, 3407, 0, +0, 3533, 0, +0, 3660, 0, +2517, 2114, 2614, +2516, 2114, 2614, +2515, 2115, 2614, +2515, 2116, 2613, +2513, 2117, 2612, +2512, 2119, 2612, +2510, 2121, 2610, +2507, 2124, 2609, +2503, 2128, 2606, +2498, 2134, 2603, +2491, 2141, 2599, +2482, 2150, 2593, +2469, 2162, 2586, +2451, 2178, 2576, +2426, 2198, 2561, +2391, 2224, 2542, +2338, 2256, 2514, +2257, 2296, 2474, +2119, 2344, 2414, +1828, 2402, 2319, +0, 2469, 2151, +0, 2546, 1735, +0, 2631, 0, +0, 2725, 0, +0, 2827, 0, +0, 2934, 0, +0, 3047, 0, +0, 3164, 0, +0, 3285, 0, +0, 3408, 0, +0, 3534, 0, +0, 3661, 0, +2681, 2147, 2690, +2681, 2147, 2690, +2680, 2148, 2690, +2680, 2149, 2689, +2679, 2150, 2689, +2678, 2152, 2688, +2676, 2154, 2687, +2674, 2157, 2685, +2672, 2161, 2683, +2668, 2166, 2681, +2663, 2172, 2677, +2657, 2181, 2673, +2648, 2192, 2666, +2636, 2207, 2658, +2620, 2226, 2646, +2597, 2250, 2629, +2565, 2281, 2607, +2517, 2319, 2574, +2444, 2365, 2527, +2325, 2420, 2455, +2090, 2485, 2336, +1027, 2559, 2105, +0, 2642, 1114, +0, 2734, 0, +0, 2834, 0, +0, 2940, 0, +0, 3052, 0, +0, 3168, 0, +0, 3288, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +2836, 2188, 2775, +2836, 2189, 2775, +2835, 2189, 2775, +2835, 2190, 2774, +2834, 2191, 2774, +2833, 2193, 2773, +2832, 2194, 2772, +2831, 2197, 2771, +2829, 2201, 2770, +2827, 2205, 2767, +2823, 2211, 2765, +2819, 2219, 2761, +2813, 2230, 2755, +2805, 2243, 2748, +2793, 2261, 2739, +2778, 2283, 2725, +2756, 2312, 2707, +2726, 2347, 2681, +2681, 2391, 2644, +2614, 2443, 2590, +2505, 2505, 2505, +2300, 2576, 2358, +1648, 2656, 2036, +0, 2746, 0, +0, 2843, 0, +0, 2947, 0, +0, 3057, 0, +0, 3172, 0, +0, 3291, 0, +0, 3413, 0, +0, 3537, 0, +0, 3664, 0, +2984, 2238, 2869, +2984, 2238, 2868, +2984, 2239, 2868, +2983, 2239, 2868, +2983, 2240, 2868, +2983, 2242, 2867, +2982, 2244, 2866, +2981, 2246, 2865, +2979, 2249, 2864, +2978, 2253, 2862, +2975, 2259, 2860, +2972, 2266, 2857, +2968, 2275, 2853, +2962, 2287, 2847, +2954, 2303, 2839, +2943, 2324, 2828, +2928, 2350, 2814, +2907, 2383, 2794, +2878, 2423, 2765, +2836, 2472, 2724, +2772, 2530, 2662, +2669, 2598, 2563, +2482, 2675, 2386, +1962, 2761, 1922, +0, 2855, 0, +0, 2957, 0, +0, 3065, 0, +0, 3178, 0, +0, 3296, 0, +0, 3417, 0, +0, 3540, 0, +0, 3666, 0, +3128, 2297, 2969, +3128, 2297, 2969, +3128, 2298, 2969, +3128, 2298, 2969, +3127, 2299, 2969, +3127, 2300, 2968, +3126, 2302, 2968, +3126, 2304, 2967, +3125, 2307, 2966, +3123, 2310, 2964, +3122, 2315, 2962, +3119, 2321, 2960, +3116, 2330, 2957, +3112, 2341, 2952, +3106, 2355, 2946, +3099, 2373, 2938, +3088, 2397, 2926, +3073, 2426, 2910, +3053, 2463, 2888, +3025, 2508, 2857, +2984, 2562, 2812, +2922, 2625, 2744, +2825, 2698, 2632, +2649, 2780, 2420, +2195, 2871, 1705, +0, 2970, 0, +0, 3075, 0, +0, 3186, 0, +0, 3302, 0, +0, 3421, 0, +0, 3544, 0, +0, 3668, 0, +3269, 2365, 3077, +3269, 2366, 3077, +3269, 2366, 3076, +3268, 2367, 3076, +3268, 2367, 3076, +3268, 2368, 3076, +3268, 2370, 3075, +3267, 2371, 3075, +3266, 2374, 3074, +3265, 2377, 3073, +3264, 2381, 3071, +3262, 2387, 3069, +3260, 2394, 3067, +3257, 2403, 3063, +3253, 2416, 3058, +3247, 2432, 3052, +3240, 2453, 3043, +3229, 2479, 3031, +3215, 2512, 3014, +3195, 2552, 2990, +3168, 2601, 2957, +3128, 2660, 2908, +3068, 2728, 2834, +2973, 2805, 2710, +2805, 2892, 2463, +2389, 2986, 928, +0, 3088, 0, +0, 3197, 0, +0, 3310, 0, +0, 3427, 0, +0, 3548, 0, +0, 3672, 0, +3407, 2443, 3189, +3407, 2444, 3189, +3407, 2444, 3189, +3407, 2444, 3189, +3407, 2445, 3189, +3407, 2446, 3188, +3406, 2447, 3188, +3406, 2448, 3188, +3405, 2450, 3187, +3405, 2453, 3186, +3404, 2457, 3185, +3403, 2461, 3183, +3401, 2467, 3181, +3399, 2475, 3179, +3396, 2486, 3175, +3392, 2500, 3170, +3386, 2518, 3163, +3379, 2541, 3154, +3368, 2570, 3141, +3354, 2605, 3123, +3335, 2649, 3099, +3308, 2702, 3064, +3268, 2765, 3012, +3210, 2836, 2932, +3117, 2918, 2797, +2954, 3008, 2514, +2563, 3105, 0, +0, 3210, 0, +0, 3320, 0, +0, 3436, 0, +0, 3555, 0, +0, 3677, 0, +3544, 2530, 3306, +3544, 2530, 3306, +3544, 2531, 3306, +3544, 2531, 3306, +3544, 2532, 3306, +3544, 2532, 3305, +3543, 2533, 3305, +3543, 2534, 3305, +3543, 2536, 3304, +3542, 2538, 3304, +3541, 2541, 3303, +3541, 2545, 3302, +3539, 2550, 3300, +3538, 2557, 3298, +3535, 2566, 3295, +3532, 2578, 3291, +3528, 2593, 3286, +3523, 2612, 3279, +3516, 2637, 3269, +3505, 2668, 3256, +3492, 2707, 3238, +3472, 2754, 3212, +3445, 2810, 3175, +3407, 2875, 3121, +3349, 2950, 3037, +3258, 3034, 2892, +3099, 3127, 2574, +2724, 3227, 0, +0, 3334, 0, +0, 3446, 0, +0, 3563, 0, +0, 3683, 0, +3680, 2625, 3427, +3680, 2626, 3426, +3680, 2626, 3426, +3679, 2626, 3426, +3679, 2626, 3426, +3679, 2627, 3426, +3679, 2628, 3426, +3679, 2629, 3426, +3679, 2630, 3425, +3678, 2632, 3425, +3678, 2634, 3424, +3677, 2637, 3423, +3676, 2642, 3422, +3675, 2647, 3420, +3673, 2655, 3418, +3671, 2664, 3415, +3668, 2677, 3411, +3664, 2693, 3406, +3659, 2714, 3399, +3651, 2740, 3389, +3641, 2773, 3375, +3628, 2814, 3356, +3609, 2863, 3330, +3582, 2922, 3292, +3543, 2990, 3236, +3486, 3068, 3147, +3397, 3155, 2994, +3240, 3250, 2644, +2877, 3352, 0, +0, 3460, 0, +0, 3574, 0, +0, 3691, 0, +3814, 2728, 3550, +3814, 2728, 3550, +3814, 2728, 3550, +3814, 2728, 3550, +3814, 2729, 3549, +3814, 2729, 3549, +3814, 2730, 3549, +3814, 2730, 3549, +3814, 2732, 3549, +3813, 2733, 3548, +3813, 2735, 3548, +3812, 2737, 3547, +3812, 2741, 3546, +3811, 2745, 3545, +3810, 2751, 3543, +3808, 2759, 3541, +3806, 2769, 3538, +3803, 2782, 3534, +3799, 2800, 3528, +3793, 2822, 3521, +3786, 2849, 3511, +3776, 2884, 3497, +3763, 2927, 3478, +3744, 2978, 3451, +3717, 3039, 3412, +3679, 3109, 3354, +3622, 3189, 3263, +3534, 3278, 3102, +3379, 3374, 2724, +3024, 3478, 0, +0, 3588, 0, +0, 3702, 0, +3948, 2836, 3675, +3948, 2836, 3675, +3948, 2836, 3675, +3948, 2837, 3675, +3948, 2837, 3675, +3948, 2837, 3675, +3948, 2838, 3675, +3948, 2838, 3674, +3948, 2839, 3674, +3948, 2840, 3674, +3947, 2842, 3673, +3947, 2844, 3673, +3946, 2847, 3672, +3946, 2850, 3671, +3945, 2855, 3670, +3944, 2861, 3668, +3942, 2869, 3666, +3940, 2880, 3663, +3937, 2894, 3659, +3933, 2912, 3653, +3928, 2935, 3646, +3920, 2964, 3636, +3910, 3000, 3622, +3897, 3044, 3602, +3878, 3097, 3574, +3852, 3160, 3535, +3814, 3232, 3475, +3757, 3313, 3382, +3669, 3403, 3216, +3516, 3501, 2812, +3167, 3606, 0, +0, 3716, 0, +4082, 2950, 3802, +4082, 2950, 3802, +4082, 2950, 3802, +4082, 2950, 3802, +4082, 2950, 3802, +4082, 2951, 3802, +4082, 2951, 3802, +4082, 2952, 3801, +4081, 2952, 3801, +4081, 2953, 3801, +4081, 2954, 3801, +4081, 2956, 3800, +4080, 2958, 3800, +4080, 2961, 3799, +4079, 2964, 3798, +4078, 2969, 3797, +4077, 2976, 3795, +4075, 2984, 3793, +4073, 2995, 3790, +4070, 3010, 3786, +4066, 3028, 3780, +4061, 3052, 3772, +4054, 3082, 3762, +4044, 3119, 3748, +4030, 3164, 3728, +4012, 3219, 3700, +3985, 3283, 3660, +3948, 3356, 3599, +3892, 3439, 3504, +3804, 3530, 3334, +3652, 3629, 2909, +3307, 3735, 0, +4095, 3068, 3930, +4095, 3068, 3930, +4095, 3068, 3930, +4095, 3068, 3930, +4095, 3068, 3930, +4095, 3068, 3930, +4095, 3069, 3930, +4095, 3069, 3930, +4095, 3069, 3930, +4095, 3070, 3929, +4095, 3071, 3929, +4095, 3072, 3929, +4095, 3074, 3929, +4095, 3076, 3928, +4095, 3079, 3927, +4095, 3083, 3926, +4095, 3088, 3925, +4095, 3094, 3923, +4095, 3103, 3921, +4095, 3114, 3918, +4095, 3129, 3914, +4095, 3148, 3908, +4095, 3173, 3900, +4095, 3203, 3890, +4095, 3241, 3875, +4095, 3288, 3855, +4095, 3343, 3827, +4095, 3408, 3786, +4081, 3482, 3725, +4025, 3566, 3629, +3938, 3658, 3455, +3786, 3758, 3012, +4095, 3189, 4059, +4095, 3189, 4059, +4095, 3189, 4059, +4095, 3189, 4059, +4095, 3189, 4059, +4095, 3189, 4059, +4095, 3189, 4059, +4095, 3190, 4059, +4095, 3190, 4059, +4095, 3191, 4059, +4095, 3191, 4059, +4095, 3192, 4058, +4095, 3193, 4058, +4095, 3195, 4058, +4095, 3197, 4057, +4095, 3200, 4056, +4095, 3204, 4055, +4095, 3209, 4054, +4095, 3216, 4052, +4095, 3225, 4050, +4095, 3237, 4047, +4095, 3252, 4043, +4095, 3271, 4037, +4095, 3296, 4029, +4095, 3327, 4019, +4095, 3366, 4004, +4095, 3413, 3984, +4095, 3469, 3956, +4095, 3535, 3914, +4095, 3610, 3853, +4095, 3694, 3755, +4071, 3787, 3579, +0, 2129, 2398, +0, 2130, 2397, +0, 2131, 2396, +0, 2132, 2396, +0, 2133, 2394, +0, 2135, 2393, +0, 2137, 2391, +0, 2140, 2388, +0, 2144, 2384, +0, 2149, 2379, +0, 2156, 2373, +0, 2165, 2363, +0, 2176, 2351, +0, 2192, 2333, +0, 2211, 2309, +0, 2236, 2274, +0, 2268, 2222, +0, 2307, 2143, +0, 2354, 2009, +0, 2410, 1731, +0, 2476, 0, +0, 2552, 0, +0, 2636, 0, +0, 2729, 0, +0, 2830, 0, +0, 2937, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2130, 2398, +0, 2130, 2398, +0, 2131, 2397, +0, 2132, 2396, +0, 2133, 2395, +0, 2135, 2394, +0, 2137, 2392, +0, 2140, 2389, +0, 2144, 2385, +0, 2149, 2380, +0, 2156, 2373, +0, 2165, 2364, +0, 2177, 2352, +0, 2192, 2334, +0, 2212, 2310, +0, 2237, 2275, +0, 2268, 2223, +0, 2307, 2144, +0, 2354, 2011, +0, 2411, 1734, +0, 2476, 0, +0, 2552, 0, +0, 2636, 0, +0, 2729, 0, +0, 2830, 0, +0, 2937, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2130, 2399, +0, 2130, 2399, +0, 2131, 2398, +0, 2132, 2397, +0, 2133, 2396, +0, 2135, 2395, +0, 2137, 2393, +0, 2140, 2390, +0, 2144, 2386, +0, 2149, 2381, +0, 2156, 2374, +0, 2165, 2365, +0, 2177, 2353, +0, 2192, 2335, +0, 2212, 2311, +0, 2237, 2276, +0, 2268, 2225, +0, 2307, 2146, +0, 2354, 2013, +0, 2411, 1738, +0, 2477, 0, +0, 2552, 0, +0, 2637, 0, +0, 2730, 0, +0, 2830, 0, +0, 2937, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2130, 2400, +0, 2131, 2400, +0, 2131, 2399, +0, 2132, 2399, +0, 2134, 2397, +0, 2135, 2396, +0, 2138, 2394, +0, 2140, 2391, +0, 2144, 2387, +0, 2150, 2382, +0, 2156, 2376, +0, 2165, 2367, +0, 2177, 2354, +0, 2192, 2337, +0, 2212, 2312, +0, 2237, 2278, +0, 2268, 2227, +0, 2307, 2148, +0, 2354, 2016, +0, 2411, 1743, +0, 2477, 0, +0, 2552, 0, +0, 2637, 0, +0, 2730, 0, +0, 2830, 0, +0, 2937, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2131, 2402, +0, 2131, 2402, +0, 2132, 2401, +0, 2133, 2400, +0, 2134, 2399, +0, 2136, 2398, +0, 2138, 2396, +0, 2141, 2393, +0, 2145, 2389, +0, 2150, 2384, +0, 2157, 2377, +0, 2166, 2368, +0, 2177, 2356, +0, 2193, 2339, +0, 2212, 2314, +0, 2237, 2280, +0, 2269, 2229, +0, 2307, 2151, +0, 2355, 2020, +0, 2411, 1750, +0, 2477, 0, +0, 2552, 0, +0, 2637, 0, +0, 2730, 0, +0, 2830, 0, +0, 2937, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2131, 2404, +0, 2132, 2404, +0, 2132, 2403, +0, 2133, 2402, +0, 2135, 2401, +0, 2136, 2400, +0, 2139, 2398, +0, 2141, 2395, +0, 2145, 2391, +0, 2151, 2387, +0, 2157, 2380, +0, 2166, 2371, +0, 2178, 2358, +0, 2193, 2341, +0, 2213, 2317, +0, 2238, 2283, +0, 2269, 2232, +0, 2308, 2155, +0, 2355, 2025, +0, 2411, 1760, +0, 2477, 0, +0, 2553, 0, +0, 2637, 0, +0, 2730, 0, +0, 2830, 0, +0, 2937, 0, +0, 3049, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2132, 2407, +0, 2133, 2407, +0, 2133, 2406, +0, 2134, 2405, +0, 2135, 2404, +0, 2137, 2403, +0, 2139, 2401, +0, 2142, 2398, +0, 2146, 2395, +0, 2151, 2390, +0, 2158, 2383, +0, 2167, 2374, +0, 2179, 2362, +0, 2194, 2345, +0, 2213, 2321, +0, 2238, 2287, +0, 2270, 2237, +0, 2308, 2160, +0, 2356, 2032, +0, 2412, 1772, +0, 2478, 0, +0, 2553, 0, +0, 2637, 0, +0, 2730, 0, +0, 2830, 0, +0, 2937, 0, +0, 3050, 0, +0, 3166, 0, +0, 3286, 0, +0, 3409, 0, +0, 3535, 0, +0, 3661, 0, +0, 2133, 2411, +0, 2134, 2411, +0, 2134, 2410, +0, 2135, 2409, +0, 2136, 2408, +0, 2138, 2407, +0, 2140, 2405, +0, 2143, 2402, +0, 2147, 2399, +0, 2152, 2394, +0, 2159, 2387, +0, 2168, 2378, +0, 2180, 2366, +0, 2195, 2349, +0, 2214, 2325, +0, 2239, 2292, +0, 2270, 2242, +0, 2309, 2167, +0, 2356, 2041, +0, 2412, 1788, +0, 2478, 0, +0, 2553, 0, +0, 2638, 0, +0, 2730, 0, +0, 2831, 0, +0, 2937, 0, +0, 3050, 0, +0, 3166, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +0, 2134, 2417, +0, 2135, 2416, +0, 2136, 2416, +0, 2136, 2415, +0, 2138, 2414, +0, 2139, 2412, +0, 2142, 2410, +0, 2144, 2408, +0, 2148, 2404, +0, 2154, 2399, +0, 2160, 2393, +0, 2169, 2384, +0, 2181, 2372, +0, 2196, 2355, +0, 2215, 2332, +0, 2240, 2299, +0, 2271, 2250, +0, 2310, 2176, +0, 2357, 2053, +0, 2413, 1808, +0, 2479, 410, +0, 2554, 0, +0, 2638, 0, +0, 2731, 0, +0, 2831, 0, +0, 2938, 0, +0, 3050, 0, +0, 3166, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +0, 2136, 2424, +0, 2137, 2423, +0, 2137, 2422, +0, 2138, 2422, +0, 2140, 2421, +0, 2141, 2419, +0, 2143, 2417, +0, 2146, 2415, +0, 2150, 2411, +0, 2155, 2406, +0, 2162, 2400, +0, 2171, 2391, +0, 2182, 2379, +0, 2198, 2363, +0, 2217, 2340, +0, 2242, 2308, +0, 2273, 2260, +0, 2311, 2187, +0, 2358, 2068, +0, 2414, 1834, +0, 2479, 782, +0, 2554, 0, +0, 2639, 0, +0, 2731, 0, +0, 2831, 0, +0, 2938, 0, +0, 3050, 0, +0, 3167, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +0, 2139, 2433, +0, 2139, 2432, +0, 2140, 2432, +0, 2141, 2431, +0, 2142, 2430, +0, 2144, 2428, +0, 2146, 2426, +0, 2149, 2424, +0, 2152, 2420, +0, 2158, 2416, +0, 2164, 2410, +0, 2173, 2401, +0, 2185, 2389, +0, 2200, 2373, +0, 2219, 2351, +0, 2244, 2319, +0, 2274, 2273, +0, 2313, 2203, +0, 2360, 2088, +0, 2415, 1866, +0, 2481, 1036, +0, 2555, 0, +0, 2639, 0, +0, 2732, 0, +0, 2832, 0, +0, 2938, 0, +0, 3050, 0, +0, 3167, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +0, 2142, 2444, +0, 2142, 2444, +0, 2143, 2443, +0, 2144, 2443, +0, 2145, 2442, +0, 2147, 2440, +0, 2149, 2438, +0, 2152, 2436, +0, 2156, 2433, +0, 2161, 2428, +0, 2167, 2422, +0, 2176, 2414, +0, 2188, 2402, +0, 2202, 2387, +0, 2222, 2365, +0, 2246, 2334, +0, 2277, 2290, +0, 2315, 2222, +0, 2362, 2113, +0, 2417, 1906, +0, 2482, 1242, +0, 2557, 0, +0, 2640, 0, +0, 2733, 0, +0, 2833, 0, +0, 2939, 0, +0, 3051, 0, +0, 3167, 0, +0, 3287, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +0, 2146, 2460, +0, 2146, 2460, +0, 2147, 2459, +0, 2148, 2458, +0, 2149, 2457, +0, 2151, 2456, +0, 2153, 2454, +0, 2156, 2452, +0, 2160, 2448, +0, 2165, 2444, +0, 2171, 2438, +0, 2180, 2430, +0, 2191, 2419, +0, 2206, 2404, +0, 2225, 2383, +0, 2249, 2354, +0, 2280, 2311, +0, 2318, 2247, +0, 2364, 2144, +0, 2419, 1955, +0, 2484, 1422, +0, 2558, 0, +0, 2642, 0, +0, 2734, 0, +0, 2834, 0, +0, 2940, 0, +0, 3051, 0, +0, 3168, 0, +0, 3288, 0, +0, 3410, 0, +0, 3535, 0, +0, 3662, 0, +0, 2152, 2480, +0, 2152, 2479, +0, 2153, 2479, +0, 2154, 2478, +0, 2155, 2477, +0, 2156, 2476, +0, 2159, 2474, +0, 2161, 2472, +0, 2165, 2469, +0, 2170, 2465, +0, 2177, 2459, +0, 2185, 2451, +0, 2196, 2441, +0, 2211, 2427, +0, 2230, 2407, +0, 2254, 2379, +0, 2284, 2339, +0, 2322, 2278, +0, 2368, 2183, +0, 2422, 2013, +0, 2487, 1587, +0, 2561, 0, +0, 2644, 0, +0, 2735, 0, +0, 2835, 0, +0, 2941, 0, +0, 3052, 0, +0, 3168, 0, +0, 3288, 0, +0, 3411, 0, +0, 3536, 0, +0, 3662, 0, +590, 2159, 2505, +556, 2159, 2505, +505, 2160, 2504, +427, 2161, 2503, +295, 2162, 2503, +26, 2164, 2501, +0, 2166, 2500, +0, 2169, 2498, +0, 2172, 2495, +0, 2177, 2491, +0, 2184, 2485, +0, 2192, 2478, +0, 2203, 2468, +0, 2218, 2455, +0, 2236, 2436, +0, 2260, 2410, +0, 2290, 2373, +0, 2327, 2317, +0, 2372, 2230, +0, 2427, 2080, +0, 2490, 1742, +0, 2564, 0, +0, 2646, 0, +0, 2737, 0, +0, 2836, 0, +0, 2942, 0, +0, 3053, 0, +0, 3169, 0, +0, 3289, 0, +0, 3411, 0, +0, 3536, 0, +0, 3662, 0, +1656, 2169, 2537, +1653, 2169, 2536, +1649, 2170, 2536, +1643, 2171, 2535, +1635, 2172, 2534, +1624, 2173, 2533, +1610, 2175, 2532, +1589, 2178, 2530, +1560, 2182, 2527, +1518, 2186, 2523, +1454, 2193, 2518, +1353, 2201, 2512, +1168, 2212, 2503, +661, 2226, 2490, +0, 2244, 2473, +0, 2268, 2449, +0, 2297, 2415, +0, 2334, 2364, +0, 2378, 2287, +0, 2432, 2157, +0, 2495, 1891, +0, 2568, 0, +0, 2650, 0, +0, 2740, 0, +0, 2839, 0, +0, 2944, 0, +0, 3055, 0, +0, 3170, 0, +0, 3289, 0, +0, 3412, 0, +0, 3536, 0, +0, 3663, 0, +2017, 2181, 2576, +2015, 2182, 2576, +2013, 2182, 2575, +2011, 2183, 2575, +2007, 2184, 2574, +2002, 2186, 2573, +1996, 2188, 2571, +1987, 2190, 2570, +1975, 2194, 2567, +1959, 2199, 2564, +1936, 2205, 2559, +1903, 2213, 2553, +1856, 2223, 2545, +1783, 2237, 2533, +1663, 2255, 2518, +1428, 2278, 2496, +348, 2307, 2465, +0, 2342, 2420, +0, 2386, 2353, +0, 2439, 2243, +0, 2501, 2035, +0, 2573, 1360, +0, 2654, 0, +0, 2744, 0, +0, 2842, 0, +0, 2946, 0, +0, 3056, 0, +0, 3172, 0, +0, 3291, 0, +0, 3413, 0, +0, 3537, 0, +0, 3663, 0, +2266, 2198, 2624, +2266, 2198, 2623, +2264, 2199, 2623, +2263, 2200, 2622, +2261, 2201, 2622, +2258, 2202, 2621, +2255, 2204, 2620, +2250, 2206, 2618, +2243, 2210, 2616, +2234, 2214, 2613, +2222, 2220, 2609, +2204, 2228, 2603, +2180, 2238, 2596, +2146, 2252, 2586, +2096, 2269, 2572, +2019, 2291, 2552, +1890, 2319, 2525, +1628, 2354, 2486, +0, 2397, 2428, +0, 2448, 2337, +0, 2509, 2176, +0, 2580, 1795, +0, 2660, 0, +0, 2749, 0, +0, 2845, 0, +0, 2949, 0, +0, 3059, 0, +0, 3173, 0, +0, 3292, 0, +0, 3414, 0, +0, 3538, 0, +0, 3664, 0, +2470, 2219, 2680, +2469, 2219, 2680, +2469, 2220, 2680, +2468, 2220, 2679, +2466, 2221, 2679, +2465, 2223, 2678, +2462, 2225, 2677, +2459, 2227, 2675, +2455, 2230, 2673, +2450, 2235, 2671, +2442, 2240, 2667, +2431, 2248, 2662, +2417, 2258, 2656, +2397, 2270, 2647, +2369, 2287, 2635, +2328, 2308, 2618, +2267, 2335, 2595, +2171, 2369, 2561, +1998, 2410, 2513, +1561, 2461, 2438, +0, 2520, 2315, +0, 2589, 2068, +0, 2668, 582, +0, 2755, 0, +0, 2851, 0, +0, 2953, 0, +0, 3062, 0, +0, 3176, 0, +0, 3294, 0, +0, 3415, 0, +0, 3539, 0, +0, 3665, 0, +2649, 2245, 2747, +2649, 2246, 2746, +2648, 2246, 2746, +2648, 2247, 2746, +2647, 2248, 2745, +2646, 2249, 2745, +2644, 2251, 2744, +2642, 2253, 2742, +2639, 2256, 2741, +2635, 2260, 2738, +2630, 2266, 2735, +2623, 2273, 2731, +2614, 2282, 2726, +2601, 2294, 2718, +2583, 2310, 2708, +2558, 2330, 2693, +2523, 2356, 2674, +2470, 2388, 2646, +2389, 2428, 2606, +2251, 2476, 2546, +1960, 2534, 2451, +0, 2601, 2283, +0, 2678, 1867, +0, 2763, 0, +0, 2857, 0, +0, 2959, 0, +0, 3066, 0, +0, 3179, 0, +0, 3296, 0, +0, 3417, 0, +0, 3540, 0, +0, 3666, 0, +2813, 2279, 2823, +2813, 2279, 2822, +2813, 2280, 2822, +2812, 2280, 2822, +2812, 2281, 2821, +2811, 2282, 2821, +2810, 2284, 2820, +2808, 2286, 2819, +2806, 2289, 2817, +2804, 2293, 2816, +2800, 2298, 2813, +2796, 2304, 2809, +2789, 2313, 2805, +2780, 2324, 2798, +2769, 2339, 2790, +2752, 2358, 2778, +2729, 2382, 2762, +2697, 2413, 2739, +2649, 2451, 2706, +2576, 2497, 2659, +2457, 2552, 2587, +2222, 2617, 2468, +1159, 2691, 2237, +0, 2774, 1246, +0, 2866, 0, +0, 2966, 0, +0, 3072, 0, +0, 3184, 0, +0, 3300, 0, +0, 3420, 0, +0, 3542, 0, +0, 3667, 0, +2968, 2320, 2907, +2968, 2320, 2907, +2968, 2321, 2907, +2967, 2321, 2907, +2967, 2322, 2906, +2966, 2323, 2906, +2966, 2325, 2905, +2965, 2327, 2904, +2963, 2329, 2903, +2961, 2333, 2902, +2959, 2337, 2900, +2956, 2343, 2897, +2951, 2351, 2893, +2945, 2362, 2888, +2937, 2375, 2880, +2925, 2393, 2871, +2910, 2415, 2857, +2888, 2444, 2839, +2858, 2479, 2813, +2813, 2523, 2776, +2746, 2575, 2722, +2637, 2637, 2637, +2432, 2708, 2490, +1780, 2789, 2168, +0, 2878, 0, +0, 2975, 0, +0, 3079, 0, +0, 3190, 0, +0, 3304, 0, +0, 3423, 0, +0, 3545, 0, +0, 3669, 0, +3116, 2370, 3001, +3116, 2370, 3001, +3116, 2370, 3001, +3116, 2371, 3000, +3116, 2372, 3000, +3115, 2373, 3000, +3115, 2374, 2999, +3114, 2376, 2998, +3113, 2378, 2997, +3112, 2381, 2996, +3110, 2385, 2994, +3107, 2391, 2992, +3104, 2398, 2989, +3100, 2407, 2985, +3094, 2420, 2979, +3086, 2436, 2971, +3075, 2456, 2961, +3060, 2482, 2946, +3039, 2515, 2926, +3010, 2555, 2897, +2968, 2604, 2856, +2904, 2662, 2794, +2802, 2730, 2696, +2614, 2807, 2518, +2094, 2893, 2054, +0, 2987, 0, +0, 3089, 0, +0, 3197, 0, +0, 3310, 0, +0, 3428, 0, +0, 3549, 0, +0, 3672, 0, +3260, 2429, 3102, +3260, 2429, 3102, +3260, 2429, 3101, +3260, 2430, 3101, +3260, 2430, 3101, +3259, 2431, 3101, +3259, 2432, 3100, +3258, 2434, 3100, +3258, 2436, 3099, +3257, 2439, 3098, +3255, 2442, 3096, +3254, 2447, 3095, +3251, 2453, 3092, +3248, 2462, 3089, +3244, 2473, 3084, +3238, 2487, 3078, +3231, 2505, 3070, +3220, 2529, 3058, +3206, 2558, 3042, +3185, 2595, 3021, +3157, 2640, 2989, +3116, 2694, 2944, +3054, 2757, 2876, +2957, 2830, 2764, +2781, 2913, 2552, +2327, 3003, 1837, +0, 3102, 0, +0, 3207, 0, +0, 3318, 0, +0, 3434, 0, +0, 3553, 0, +0, 3676, 0, +3401, 2497, 3209, +3401, 2497, 3209, +3401, 2498, 3209, +3401, 2498, 3208, +3401, 2499, 3208, +3400, 2499, 3208, +3400, 2500, 3208, +3400, 2502, 3207, +3399, 2503, 3207, +3398, 2506, 3206, +3397, 2509, 3205, +3396, 2513, 3203, +3394, 2519, 3201, +3392, 2526, 3199, +3389, 2535, 3195, +3385, 2548, 3190, +3379, 2564, 3184, +3372, 2585, 3175, +3361, 2611, 3163, +3347, 2644, 3146, +3328, 2684, 3123, +3300, 2734, 3089, +3260, 2792, 3040, +3200, 2860, 2966, +3105, 2937, 2842, +2937, 3024, 2595, +2521, 3118, 1060, +0, 3220, 0, +0, 3329, 0, +0, 3442, 0, +0, 3560, 0, +0, 3680, 0, +3539, 2575, 3321, +3539, 2575, 3321, +3539, 2576, 3321, +3539, 2576, 3321, +3539, 2576, 3321, +3539, 2577, 3321, +3539, 2578, 3320, +3538, 2579, 3320, +3538, 2581, 3320, +3537, 2582, 3319, +3537, 2585, 3318, +3536, 2589, 3317, +3535, 2593, 3315, +3533, 2599, 3313, +3531, 2608, 3311, +3528, 2618, 3307, +3524, 2632, 3302, +3518, 2650, 3295, +3511, 2673, 3286, +3500, 2702, 3273, +3486, 2738, 3255, +3467, 2782, 3231, +3440, 2834, 3196, +3400, 2897, 3144, +3342, 2969, 3064, +3249, 3050, 2929, +3086, 3140, 2646, +2695, 3237, 0, +0, 3342, 0, +0, 3452, 0, +0, 3568, 0, +0, 3687, 0, +3676, 2662, 3438, +3676, 2662, 3438, +3676, 2663, 3438, +3676, 2663, 3438, +3676, 2663, 3438, +3676, 2664, 3438, +3676, 2664, 3438, +3675, 2665, 3437, +3675, 2667, 3437, +3675, 2668, 3436, +3674, 2670, 3436, +3674, 2673, 3435, +3673, 2677, 3434, +3671, 2682, 3432, +3670, 2689, 3430, +3668, 2698, 3427, +3665, 2710, 3423, +3661, 2725, 3418, +3655, 2744, 3411, +3648, 2769, 3401, +3638, 2800, 3388, +3624, 2839, 3370, +3605, 2886, 3344, +3578, 2942, 3308, +3539, 3007, 3253, +3481, 3082, 3169, +3390, 3167, 3024, +3231, 3259, 2706, +2856, 3359, 0, +0, 3466, 0, +0, 3578, 0, +0, 3695, 0, +3812, 2757, 3559, +3812, 2757, 3559, +3812, 2758, 3559, +3812, 2758, 3558, +3812, 2758, 3558, +3811, 2759, 3558, +3811, 2759, 3558, +3811, 2760, 3558, +3811, 2761, 3558, +3811, 2762, 3557, +3810, 2764, 3557, +3810, 2766, 3556, +3809, 2770, 3555, +3808, 2774, 3554, +3807, 2779, 3552, +3805, 2787, 3550, +3803, 2796, 3547, +3800, 2809, 3543, +3796, 2825, 3538, +3791, 2846, 3531, +3783, 2872, 3521, +3773, 2905, 3507, +3760, 2946, 3488, +3741, 2996, 3462, +3714, 3054, 3424, +3675, 3122, 3368, +3618, 3200, 3279, +3529, 3287, 3126, +3372, 3382, 2777, +3009, 3484, 0, +0, 3592, 0, +0, 3706, 0, +3946, 2860, 3682, +3946, 2860, 3682, +3946, 2860, 3682, +3946, 2860, 3682, +3946, 2860, 3682, +3946, 2861, 3682, +3946, 2861, 3681, +3946, 2862, 3681, +3946, 2863, 3681, +3946, 2864, 3681, +3945, 2865, 3680, +3945, 2867, 3680, +3944, 2869, 3679, +3944, 2873, 3678, +3943, 2877, 3677, +3942, 2883, 3675, +3940, 2891, 3673, +3938, 2901, 3670, +3935, 2914, 3666, +3931, 2932, 3661, +3926, 2954, 3653, +3918, 2981, 3643, +3908, 3016, 3629, +3895, 3059, 3610, +3876, 3110, 3583, +3849, 3171, 3544, +3811, 3242, 3486, +3754, 3321, 3395, +3666, 3410, 3235, +3511, 3507, 2856, +3156, 3610, 0, +0, 3720, 0, +4080, 2968, 3807, +4080, 2968, 3807, +4080, 2968, 3807, +4080, 2969, 3807, +4080, 2969, 3807, +4080, 2969, 3807, +4080, 2969, 3807, +4080, 2970, 3807, +4080, 2970, 3806, +4080, 2971, 3806, +4080, 2972, 3806, +4079, 2974, 3806, +4079, 2976, 3805, +4078, 2979, 3804, +4078, 2982, 3803, +4077, 2987, 3802, +4076, 2993, 3800, +4074, 3001, 3798, +4072, 3012, 3795, +4069, 3026, 3791, +4065, 3044, 3786, +4060, 3067, 3778, +4052, 3096, 3768, +4042, 3132, 3754, +4029, 3176, 3734, +4010, 3229, 3706, +3984, 3292, 3667, +3946, 3364, 3608, +3889, 3445, 3514, +3801, 3535, 3348, +3648, 3633, 2944, +3299, 3738, 0, +4095, 3082, 3934, +4095, 3082, 3934, +4095, 3082, 3934, +4095, 3082, 3934, +4095, 3082, 3934, +4095, 3082, 3934, +4095, 3083, 3934, +4095, 3083, 3934, +4095, 3084, 3934, +4095, 3084, 3933, +4095, 3085, 3933, +4095, 3086, 3933, +4095, 3088, 3932, +4095, 3090, 3932, +4095, 3093, 3931, +4095, 3096, 3930, +4095, 3101, 3929, +4095, 3108, 3927, +4095, 3116, 3925, +4095, 3127, 3922, +4095, 3142, 3918, +4095, 3160, 3912, +4095, 3184, 3905, +4095, 3214, 3894, +4095, 3251, 3880, +4095, 3297, 3860, +4095, 3351, 3832, +4095, 3415, 3792, +4080, 3488, 3732, +4024, 3571, 3636, +3936, 3662, 3466, +3784, 3761, 3041, +4095, 3200, 4062, +4095, 3200, 4062, +4095, 3200, 4062, +4095, 3200, 4062, +4095, 3200, 4062, +4095, 3200, 4062, +4095, 3200, 4062, +4095, 3201, 4062, +4095, 3201, 4062, +4095, 3202, 4062, +4095, 3202, 4062, +4095, 3203, 4061, +4095, 3204, 4061, +4095, 3206, 4061, +4095, 3208, 4060, +4095, 3211, 4059, +4095, 3215, 4058, +4095, 3220, 4057, +4095, 3226, 4055, +4095, 3235, 4053, +4095, 3247, 4050, +4095, 3261, 4046, +4095, 3280, 4040, +4095, 3305, 4032, +4095, 3335, 4022, +4095, 3374, 4008, +4095, 3420, 3988, +4095, 3475, 3959, +4095, 3540, 3918, +4095, 3614, 3858, +4095, 3698, 3761, +4070, 3790, 3587, +0, 2261, 2529, +0, 2261, 2529, +0, 2262, 2529, +0, 2263, 2528, +0, 2264, 2527, +0, 2265, 2526, +0, 2267, 2524, +0, 2269, 2522, +0, 2272, 2520, +0, 2276, 2516, +0, 2281, 2511, +0, 2288, 2504, +0, 2297, 2495, +0, 2308, 2482, +0, 2324, 2465, +0, 2343, 2440, +0, 2368, 2405, +0, 2400, 2354, +0, 2439, 2274, +0, 2486, 2140, +0, 2542, 1860, +0, 2608, 0, +0, 2684, 0, +0, 2768, 0, +0, 2861, 0, +0, 2962, 0, +0, 3069, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3667, 0, +0, 2261, 2530, +0, 2262, 2530, +0, 2262, 2529, +0, 2263, 2529, +0, 2264, 2528, +0, 2265, 2527, +0, 2267, 2525, +0, 2269, 2523, +0, 2272, 2520, +0, 2276, 2517, +0, 2281, 2512, +0, 2288, 2505, +0, 2297, 2495, +0, 2309, 2483, +0, 2324, 2465, +0, 2343, 2441, +0, 2368, 2406, +0, 2400, 2354, +0, 2439, 2275, +0, 2486, 2141, +0, 2543, 1863, +0, 2608, 0, +0, 2684, 0, +0, 2769, 0, +0, 2862, 0, +0, 2962, 0, +0, 3069, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3667, 0, +0, 2261, 2531, +0, 2262, 2530, +0, 2262, 2530, +0, 2263, 2529, +0, 2264, 2528, +0, 2265, 2527, +0, 2267, 2526, +0, 2269, 2524, +0, 2272, 2521, +0, 2276, 2517, +0, 2281, 2512, +0, 2288, 2505, +0, 2297, 2496, +0, 2309, 2484, +0, 2324, 2466, +0, 2344, 2442, +0, 2369, 2407, +0, 2400, 2355, +0, 2439, 2276, +0, 2486, 2143, +0, 2543, 1866, +0, 2609, 0, +0, 2684, 0, +0, 2769, 0, +0, 2862, 0, +0, 2962, 0, +0, 3069, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3667, 0, +0, 2262, 2532, +0, 2262, 2531, +0, 2263, 2531, +0, 2263, 2530, +0, 2264, 2529, +0, 2265, 2528, +0, 2267, 2527, +0, 2269, 2525, +0, 2272, 2522, +0, 2276, 2518, +0, 2281, 2513, +0, 2288, 2506, +0, 2297, 2497, +0, 2309, 2485, +0, 2324, 2467, +0, 2344, 2443, +0, 2369, 2408, +0, 2400, 2357, +0, 2439, 2278, +0, 2486, 2145, +0, 2543, 1870, +0, 2609, 0, +0, 2684, 0, +0, 2769, 0, +0, 2862, 0, +0, 2962, 0, +0, 3069, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3667, 0, +0, 2262, 2533, +0, 2262, 2533, +0, 2263, 2532, +0, 2264, 2531, +0, 2264, 2531, +0, 2266, 2529, +0, 2267, 2528, +0, 2270, 2526, +0, 2273, 2523, +0, 2276, 2520, +0, 2282, 2515, +0, 2288, 2508, +0, 2297, 2499, +0, 2309, 2486, +0, 2324, 2469, +0, 2344, 2444, +0, 2369, 2410, +0, 2400, 2359, +0, 2439, 2280, +0, 2487, 2148, +0, 2543, 1875, +0, 2609, 0, +0, 2684, 0, +0, 2769, 0, +0, 2862, 0, +0, 2962, 0, +0, 3069, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3667, 0, +0, 2262, 2535, +0, 2263, 2534, +0, 2263, 2534, +0, 2264, 2533, +0, 2265, 2532, +0, 2266, 2531, +0, 2268, 2530, +0, 2270, 2528, +0, 2273, 2525, +0, 2277, 2521, +0, 2282, 2516, +0, 2289, 2510, +0, 2298, 2500, +0, 2310, 2488, +0, 2325, 2471, +0, 2344, 2446, +0, 2369, 2412, +0, 2401, 2361, +0, 2440, 2283, +0, 2487, 2152, +0, 2543, 1882, +0, 2609, 0, +0, 2684, 0, +0, 2769, 0, +0, 2862, 0, +0, 2962, 0, +0, 3069, 0, +0, 3181, 0, +0, 3298, 0, +0, 3418, 0, +0, 3541, 0, +0, 3667, 0, +0, 2263, 2537, +0, 2263, 2537, +0, 2264, 2536, +0, 2265, 2535, +0, 2265, 2535, +0, 2267, 2533, +0, 2268, 2532, +0, 2271, 2530, +0, 2274, 2527, +0, 2277, 2524, +0, 2283, 2519, +0, 2289, 2512, +0, 2298, 2503, +0, 2310, 2490, +0, 2325, 2473, +0, 2345, 2449, +0, 2370, 2415, +0, 2401, 2364, +0, 2440, 2287, +0, 2487, 2157, +0, 2543, 1892, +0, 2609, 0, +0, 2685, 0, +0, 2769, 0, +0, 2862, 0, +0, 2962, 0, +0, 3069, 0, +0, 3182, 0, +0, 3298, 0, +0, 3418, 0, +0, 3542, 0, +0, 3667, 0, +0, 2264, 2540, +0, 2264, 2539, +0, 2265, 2539, +0, 2265, 2538, +0, 2266, 2538, +0, 2267, 2536, +0, 2269, 2535, +0, 2271, 2533, +0, 2274, 2530, +0, 2278, 2527, +0, 2283, 2522, +0, 2290, 2515, +0, 2299, 2506, +0, 2311, 2494, +0, 2326, 2477, +0, 2346, 2453, +0, 2370, 2419, +0, 2402, 2369, +0, 2440, 2292, +0, 2488, 2164, +0, 2544, 1904, +0, 2610, 0, +0, 2685, 0, +0, 2769, 0, +0, 2862, 0, +0, 2963, 0, +0, 3069, 0, +0, 3182, 0, +0, 3298, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +0, 2265, 2544, +0, 2265, 2543, +0, 2266, 2543, +0, 2266, 2542, +0, 2267, 2542, +0, 2268, 2540, +0, 2270, 2539, +0, 2272, 2537, +0, 2275, 2534, +0, 2279, 2531, +0, 2284, 2526, +0, 2291, 2519, +0, 2300, 2510, +0, 2312, 2498, +0, 2327, 2481, +0, 2346, 2458, +0, 2371, 2424, +0, 2402, 2375, +0, 2441, 2299, +0, 2488, 2173, +0, 2544, 1920, +0, 2610, 0, +0, 2685, 0, +0, 2770, 0, +0, 2862, 0, +0, 2963, 0, +0, 3070, 0, +0, 3182, 0, +0, 3298, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +0, 2266, 2549, +0, 2266, 2549, +0, 2267, 2548, +0, 2268, 2548, +0, 2269, 2547, +0, 2270, 2546, +0, 2271, 2544, +0, 2274, 2542, +0, 2277, 2540, +0, 2280, 2536, +0, 2286, 2531, +0, 2292, 2525, +0, 2301, 2516, +0, 2313, 2504, +0, 2328, 2487, +0, 2348, 2464, +0, 2372, 2431, +0, 2403, 2382, +0, 2442, 2308, +0, 2489, 2185, +0, 2545, 1940, +0, 2611, 542, +0, 2686, 0, +0, 2770, 0, +0, 2863, 0, +0, 2963, 0, +0, 3070, 0, +0, 3182, 0, +0, 3299, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +0, 2268, 2556, +0, 2268, 2556, +0, 2269, 2555, +0, 2269, 2555, +0, 2270, 2554, +0, 2272, 2553, +0, 2273, 2551, +0, 2275, 2549, +0, 2278, 2547, +0, 2282, 2543, +0, 2287, 2538, +0, 2294, 2532, +0, 2303, 2523, +0, 2315, 2512, +0, 2330, 2495, +0, 2349, 2472, +0, 2374, 2440, +0, 2405, 2392, +0, 2443, 2320, +0, 2490, 2200, +0, 2546, 1966, +0, 2612, 914, +0, 2687, 0, +0, 2771, 0, +0, 2863, 0, +0, 2963, 0, +0, 3070, 0, +0, 3182, 0, +0, 3299, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +0, 2270, 2565, +0, 2271, 2565, +0, 2271, 2564, +0, 2272, 2564, +0, 2273, 2563, +0, 2274, 2562, +0, 2276, 2560, +0, 2278, 2559, +0, 2281, 2556, +0, 2285, 2553, +0, 2290, 2548, +0, 2296, 2542, +0, 2305, 2533, +0, 2317, 2522, +0, 2332, 2505, +0, 2351, 2483, +0, 2376, 2451, +0, 2407, 2405, +0, 2445, 2335, +0, 2492, 2220, +0, 2547, 1998, +0, 2613, 1168, +0, 2688, 0, +0, 2772, 0, +0, 2864, 0, +0, 2964, 0, +0, 3071, 0, +0, 3183, 0, +0, 3299, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +0, 2273, 2577, +0, 2274, 2577, +0, 2274, 2576, +0, 2275, 2576, +0, 2276, 2575, +0, 2277, 2574, +0, 2279, 2572, +0, 2281, 2571, +0, 2284, 2568, +0, 2288, 2565, +0, 2293, 2560, +0, 2299, 2554, +0, 2308, 2546, +0, 2320, 2535, +0, 2335, 2519, +0, 2354, 2497, +0, 2378, 2467, +0, 2409, 2422, +0, 2447, 2354, +0, 2494, 2245, +0, 2549, 2038, +0, 2614, 1374, +0, 2689, 0, +0, 2773, 0, +0, 2865, 0, +0, 2965, 0, +0, 3071, 0, +0, 3183, 0, +0, 3299, 0, +0, 3419, 0, +0, 3542, 0, +0, 3667, 0, +0, 2278, 2592, +0, 2278, 2592, +0, 2279, 2592, +0, 2279, 2591, +0, 2280, 2590, +0, 2281, 2589, +0, 2283, 2588, +0, 2285, 2586, +0, 2288, 2584, +0, 2292, 2581, +0, 2297, 2576, +0, 2303, 2570, +0, 2312, 2562, +0, 2323, 2551, +0, 2338, 2536, +0, 2357, 2516, +0, 2382, 2486, +0, 2412, 2443, +0, 2450, 2379, +0, 2496, 2276, +0, 2551, 2087, +0, 2616, 1554, +0, 2690, 0, +0, 2774, 0, +0, 2866, 0, +0, 2966, 0, +0, 3072, 0, +0, 3184, 0, +0, 3300, 0, +0, 3420, 0, +0, 3542, 0, +0, 3667, 0, +0, 2283, 2612, +0, 2284, 2612, +0, 2284, 2611, +0, 2285, 2611, +0, 2286, 2610, +0, 2287, 2609, +0, 2289, 2608, +0, 2291, 2606, +0, 2293, 2604, +0, 2297, 2601, +0, 2302, 2597, +0, 2309, 2591, +0, 2317, 2584, +0, 2329, 2573, +0, 2343, 2559, +0, 2362, 2539, +0, 2386, 2511, +0, 2416, 2471, +0, 2454, 2410, +0, 2500, 2315, +0, 2555, 2145, +0, 2619, 1719, +0, 2693, 0, +0, 2776, 0, +0, 2868, 0, +0, 2967, 0, +0, 3073, 0, +0, 3184, 0, +0, 3300, 0, +0, 3420, 0, +0, 3543, 0, +0, 3668, 0, +746, 2291, 2637, +722, 2291, 2637, +688, 2292, 2637, +637, 2292, 2636, +559, 2293, 2636, +428, 2294, 2635, +158, 2296, 2633, +0, 2298, 2632, +0, 2301, 2630, +0, 2304, 2627, +0, 2309, 2623, +0, 2316, 2618, +0, 2324, 2610, +0, 2335, 2601, +0, 2350, 2587, +0, 2368, 2568, +0, 2392, 2542, +0, 2422, 2505, +0, 2459, 2449, +0, 2504, 2362, +0, 2559, 2212, +0, 2622, 1874, +0, 2696, 0, +0, 2778, 0, +0, 2870, 0, +0, 2969, 0, +0, 3074, 0, +0, 3185, 0, +0, 3301, 0, +0, 3421, 0, +0, 3543, 0, +0, 3668, 0, +1791, 2300, 2669, +1789, 2301, 2669, +1785, 2301, 2668, +1781, 2302, 2668, +1775, 2303, 2667, +1767, 2304, 2667, +1757, 2305, 2665, +1742, 2307, 2664, +1721, 2310, 2662, +1692, 2314, 2659, +1650, 2319, 2656, +1586, 2325, 2651, +1485, 2333, 2644, +1300, 2344, 2635, +793, 2358, 2622, +0, 2376, 2605, +0, 2400, 2581, +0, 2429, 2547, +0, 2466, 2496, +0, 2510, 2419, +0, 2564, 2289, +0, 2627, 2023, +0, 2700, 0, +0, 2782, 0, +0, 2872, 0, +0, 2971, 0, +0, 3076, 0, +0, 3187, 0, +0, 3302, 0, +0, 3422, 0, +0, 3544, 0, +0, 3668, 0, +2150, 2313, 2708, +2149, 2313, 2708, +2147, 2314, 2708, +2145, 2314, 2707, +2143, 2315, 2707, +2139, 2316, 2706, +2135, 2318, 2705, +2128, 2320, 2704, +2119, 2323, 2702, +2108, 2326, 2699, +2091, 2331, 2696, +2068, 2337, 2691, +2036, 2345, 2685, +1988, 2356, 2677, +1915, 2369, 2666, +1795, 2387, 2650, +1560, 2410, 2628, +480, 2439, 2597, +0, 2474, 2553, +0, 2518, 2485, +0, 2571, 2375, +0, 2633, 2167, +0, 2705, 1492, +0, 2786, 0, +0, 2876, 0, +0, 2974, 0, +0, 3078, 0, +0, 3189, 0, +0, 3304, 0, +0, 3423, 0, +0, 3545, 0, +0, 3669, 0, +2399, 2329, 2756, +2398, 2330, 2756, +2398, 2330, 2755, +2396, 2331, 2755, +2395, 2332, 2754, +2393, 2333, 2754, +2390, 2334, 2753, +2387, 2336, 2752, +2382, 2339, 2750, +2375, 2342, 2748, +2366, 2346, 2745, +2354, 2352, 2741, +2337, 2360, 2735, +2313, 2370, 2728, +2278, 2384, 2718, +2228, 2401, 2704, +2151, 2423, 2684, +2023, 2451, 2657, +1760, 2486, 2618, +0, 2529, 2560, +0, 2581, 2469, +0, 2642, 2308, +0, 2712, 1927, +0, 2792, 0, +0, 2881, 0, +0, 2978, 0, +0, 3081, 0, +0, 3191, 0, +0, 3306, 0, +0, 3424, 0, +0, 3546, 0, +0, 3670, 0, +2602, 2350, 2813, +2602, 2351, 2812, +2602, 2351, 2812, +2601, 2352, 2812, +2600, 2353, 2811, +2599, 2354, 2811, +2597, 2355, 2810, +2595, 2357, 2809, +2591, 2359, 2807, +2587, 2362, 2805, +2582, 2367, 2803, +2574, 2372, 2799, +2563, 2380, 2794, +2549, 2390, 2788, +2529, 2402, 2779, +2501, 2419, 2767, +2460, 2440, 2750, +2400, 2467, 2727, +2303, 2501, 2694, +2131, 2543, 2645, +1693, 2593, 2570, +0, 2652, 2447, +0, 2721, 2200, +0, 2800, 714, +0, 2887, 0, +0, 2983, 0, +0, 3085, 0, +0, 3194, 0, +0, 3308, 0, +0, 3426, 0, +0, 3547, 0, +0, 3671, 0, +2781, 2377, 2879, +2781, 2377, 2879, +2781, 2378, 2879, +2780, 2378, 2878, +2780, 2379, 2878, +2779, 2380, 2877, +2778, 2381, 2877, +2776, 2383, 2876, +2774, 2385, 2874, +2771, 2388, 2873, +2767, 2392, 2870, +2762, 2398, 2867, +2755, 2405, 2863, +2746, 2414, 2858, +2733, 2426, 2850, +2715, 2442, 2840, +2691, 2462, 2826, +2655, 2488, 2806, +2602, 2520, 2778, +2521, 2560, 2738, +2384, 2609, 2678, +2092, 2666, 2584, +0, 2733, 2415, +0, 2810, 1999, +0, 2895, 0, +0, 2989, 0, +0, 3091, 0, +0, 3198, 0, +0, 3311, 0, +0, 3429, 0, +0, 3549, 0, +0, 3673, 0, +2946, 2411, 2955, +2945, 2411, 2955, +2945, 2411, 2954, +2945, 2412, 2954, +2944, 2412, 2954, +2944, 2413, 2953, +2943, 2414, 2953, +2942, 2416, 2952, +2940, 2418, 2951, +2939, 2421, 2950, +2936, 2425, 2948, +2932, 2430, 2945, +2928, 2436, 2942, +2921, 2445, 2937, +2913, 2456, 2930, +2901, 2471, 2922, +2884, 2490, 2910, +2861, 2514, 2894, +2829, 2545, 2871, +2781, 2583, 2838, +2709, 2629, 2791, +2589, 2684, 2719, +2354, 2749, 2601, +1291, 2823, 2369, +0, 2906, 1378, +0, 2998, 0, +0, 3098, 0, +0, 3204, 0, +0, 3316, 0, +0, 3432, 0, +0, 3552, 0, +0, 3675, 0, +3100, 2452, 3040, +3100, 2452, 3040, +3100, 2452, 3039, +3100, 2453, 3039, +3099, 2453, 3039, +3099, 2454, 3039, +3098, 2455, 3038, +3098, 2457, 3037, +3097, 2459, 3037, +3095, 2461, 3035, +3093, 2465, 3034, +3091, 2469, 3032, +3088, 2475, 3029, +3083, 2483, 3025, +3077, 2494, 3020, +3069, 2507, 3013, +3058, 2525, 3003, +3042, 2547, 2990, +3020, 2576, 2971, +2990, 2611, 2945, +2945, 2655, 2909, +2878, 2707, 2854, +2769, 2769, 2769, +2564, 2840, 2622, +1912, 2921, 2300, +0, 3010, 0, +0, 3107, 0, +0, 3212, 0, +0, 3322, 0, +0, 3437, 0, +0, 3555, 0, +0, 3677, 0, +3249, 2501, 3133, +3248, 2502, 3133, +3248, 2502, 3133, +3248, 2502, 3133, +3248, 2503, 3132, +3248, 2504, 3132, +3247, 2505, 3132, +3247, 2506, 3131, +3246, 2508, 3130, +3245, 2510, 3129, +3244, 2513, 3128, +3242, 2517, 3126, +3239, 2523, 3124, +3236, 2530, 3121, +3232, 2539, 3117, +3226, 2552, 3111, +3218, 2568, 3103, +3207, 2588, 3093, +3192, 2614, 3078, +3172, 2647, 3058, +3142, 2687, 3029, +3100, 2736, 2988, +3036, 2794, 2926, +2934, 2862, 2828, +2746, 2939, 2650, +2226, 3025, 2186, +0, 3120, 0, +0, 3221, 0, +0, 3329, 0, +0, 3443, 0, +0, 3560, 0, +0, 3681, 0, +3392, 2560, 3234, +3392, 2561, 3234, +3392, 2561, 3234, +3392, 2561, 3233, +3392, 2562, 3233, +3392, 2562, 3233, +3391, 2563, 3233, +3391, 2564, 3232, +3391, 2566, 3232, +3390, 2568, 3231, +3389, 2571, 3230, +3388, 2574, 3229, +3386, 2579, 3227, +3383, 2586, 3224, +3380, 2594, 3221, +3376, 2605, 3216, +3370, 2619, 3210, +3363, 2637, 3202, +3352, 2661, 3190, +3338, 2691, 3175, +3317, 2727, 3153, +3289, 2772, 3121, +3248, 2826, 3076, +3187, 2890, 3008, +3089, 2962, 2896, +2913, 3045, 2685, +2459, 3135, 1969, +0, 3234, 0, +0, 3339, 0, +0, 3450, 0, +0, 3566, 0, +0, 3685, 0, +3533, 2629, 3341, +3533, 2629, 3341, +3533, 2629, 3341, +3533, 2630, 3341, +3533, 2630, 3341, +3533, 2631, 3340, +3532, 2631, 3340, +3532, 2632, 3340, +3532, 2634, 3339, +3531, 2636, 3339, +3530, 2638, 3338, +3530, 2641, 3337, +3528, 2645, 3335, +3527, 2651, 3333, +3524, 2658, 3331, +3521, 2668, 3327, +3517, 2680, 3322, +3512, 2696, 3316, +3504, 2717, 3307, +3494, 2743, 3295, +3479, 2776, 3278, +3460, 2817, 3255, +3432, 2866, 3221, +3392, 2924, 3173, +3332, 2992, 3098, +3237, 3069, 2974, +3069, 3156, 2727, +2654, 3251, 1192, +0, 3353, 0, +0, 3461, 0, +0, 3574, 0, +0, 3692, 0, +3672, 2707, 3453, +3672, 2707, 3453, +3671, 2707, 3453, +3671, 2708, 3453, +3671, 2708, 3453, +3671, 2709, 3453, +3671, 2709, 3453, +3671, 2710, 3453, +3671, 2711, 3452, +3670, 2713, 3452, +3670, 2715, 3451, +3669, 2717, 3450, +3668, 2721, 3449, +3667, 2725, 3448, +3665, 2732, 3446, +3663, 2740, 3443, +3660, 2750, 3439, +3656, 2764, 3434, +3650, 2782, 3427, +3643, 2805, 3418, +3633, 2834, 3405, +3619, 2870, 3388, +3599, 2914, 3363, +3572, 2967, 3328, +3532, 3029, 3276, +3474, 3101, 3196, +3382, 3182, 3061, +3218, 3272, 2778, +2827, 3370, 0, +0, 3474, 0, +0, 3585, 0, +0, 3700, 0, +3808, 2794, 3570, +3808, 2794, 3570, +3808, 2794, 3570, +3808, 2795, 3570, +3808, 2795, 3570, +3808, 2795, 3570, +3808, 2796, 3570, +3808, 2796, 3570, +3808, 2797, 3569, +3807, 2799, 3569, +3807, 2800, 3569, +3806, 2803, 3568, +3806, 2805, 3567, +3805, 2809, 3566, +3804, 2814, 3564, +3802, 2821, 3562, +3800, 2830, 3559, +3797, 2842, 3555, +3793, 2857, 3550, +3787, 2876, 3543, +3780, 2901, 3533, +3770, 2932, 3520, +3756, 2971, 3502, +3737, 3018, 3476, +3710, 3074, 3440, +3671, 3139, 3385, +3613, 3214, 3301, +3522, 3299, 3156, +3363, 3391, 2839, +2989, 3492, 0, +0, 3598, 0, +0, 3710, 0, +3944, 2889, 3691, +3944, 2889, 3691, +3944, 2890, 3691, +3944, 2890, 3691, +3944, 2890, 3691, +3944, 2890, 3691, +3944, 2891, 3690, +3943, 2891, 3690, +3943, 2892, 3690, +3943, 2893, 3690, +3943, 2894, 3689, +3942, 2896, 3689, +3942, 2898, 3688, +3941, 2902, 3687, +3940, 2906, 3686, +3939, 2911, 3684, +3937, 2919, 3682, +3935, 2928, 3679, +3932, 2941, 3675, +3928, 2957, 3670, +3923, 2978, 3663, +3916, 3004, 3653, +3906, 3037, 3639, +3892, 3078, 3620, +3873, 3128, 3594, +3846, 3186, 3556, +3808, 3255, 3500, +3750, 3332, 3412, +3661, 3419, 3258, +3504, 3514, 2909, +3141, 3616, 0, +0, 3724, 0, +4079, 2992, 3814, +4079, 2992, 3814, +4078, 2992, 3814, +4078, 2992, 3814, +4078, 2992, 3814, +4078, 2992, 3814, +4078, 2993, 3814, +4078, 2993, 3813, +4078, 2994, 3813, +4078, 2995, 3813, +4078, 2996, 3813, +4077, 2997, 3812, +4077, 2999, 3812, +4077, 3002, 3811, +4076, 3005, 3810, +4075, 3009, 3809, +4074, 3015, 3807, +4072, 3023, 3805, +4070, 3033, 3802, +4067, 3047, 3798, +4063, 3064, 3793, +4058, 3086, 3785, +4050, 3114, 3775, +4040, 3148, 3761, +4027, 3191, 3742, +4008, 3242, 3715, +3981, 3303, 3676, +3943, 3374, 3618, +3886, 3453, 3527, +3798, 3542, 3367, +3643, 3639, 2988, +3288, 3742, 0, +4095, 3100, 3939, +4095, 3100, 3939, +4095, 3100, 3939, +4095, 3101, 3939, +4095, 3101, 3939, +4095, 3101, 3939, +4095, 3101, 3939, +4095, 3101, 3939, +4095, 3102, 3939, +4095, 3103, 3939, +4095, 3103, 3938, +4095, 3105, 3938, +4095, 3106, 3938, +4095, 3108, 3937, +4095, 3111, 3936, +4095, 3114, 3936, +4095, 3119, 3934, +4095, 3125, 3933, +4095, 3133, 3930, +4095, 3144, 3927, +4095, 3158, 3923, +4095, 3176, 3918, +4095, 3199, 3910, +4095, 3228, 3900, +4095, 3264, 3886, +4095, 3308, 3866, +4095, 3361, 3839, +4095, 3424, 3799, +4078, 3496, 3740, +4021, 3577, 3646, +3933, 3667, 3480, +3780, 3765, 3076, +4095, 3214, 4066, +4095, 3214, 4066, +4095, 3214, 4066, +4095, 3214, 4066, +4095, 3214, 4066, +4095, 3214, 4066, +4095, 3215, 4066, +4095, 3215, 4066, +4095, 3215, 4066, +4095, 3216, 4066, +4095, 3216, 4066, +4095, 3217, 4065, +4095, 3218, 4065, +4095, 3220, 4065, +4095, 3222, 4064, +4095, 3225, 4063, +4095, 3229, 4062, +4095, 3233, 4061, +4095, 3240, 4059, +4095, 3248, 4057, +4095, 3259, 4054, +4095, 3274, 4050, +4095, 3292, 4044, +4095, 3316, 4037, +4095, 3346, 4026, +4095, 3383, 4012, +4095, 3429, 3992, +4095, 3483, 3964, +4095, 3547, 3924, +4095, 3620, 3864, +4095, 3703, 3768, +4068, 3794, 3598, +0, 2393, 2661, +0, 2393, 2661, +0, 2393, 2661, +0, 2394, 2660, +0, 2395, 2660, +0, 2396, 2659, +0, 2397, 2658, +0, 2399, 2656, +0, 2401, 2654, +0, 2404, 2651, +0, 2408, 2648, +0, 2413, 2643, +0, 2420, 2636, +0, 2429, 2627, +0, 2440, 2614, +0, 2456, 2596, +0, 2475, 2572, +0, 2500, 2537, +0, 2532, 2485, +0, 2571, 2406, +0, 2618, 2271, +0, 2674, 1991, +0, 2740, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3313, 0, +0, 3430, 0, +0, 3550, 0, +0, 3673, 0, +0, 2393, 2662, +0, 2393, 2662, +0, 2394, 2661, +0, 2394, 2661, +0, 2395, 2660, +0, 2396, 2659, +0, 2397, 2658, +0, 2399, 2657, +0, 2401, 2655, +0, 2404, 2652, +0, 2408, 2648, +0, 2413, 2643, +0, 2420, 2636, +0, 2429, 2627, +0, 2441, 2614, +0, 2456, 2597, +0, 2475, 2572, +0, 2500, 2537, +0, 2532, 2486, +0, 2571, 2406, +0, 2618, 2272, +0, 2675, 1992, +0, 2740, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3313, 0, +0, 3430, 0, +0, 3550, 0, +0, 3673, 0, +0, 2393, 2662, +0, 2393, 2662, +0, 2394, 2662, +0, 2394, 2661, +0, 2395, 2661, +0, 2396, 2660, +0, 2397, 2659, +0, 2399, 2657, +0, 2401, 2655, +0, 2404, 2652, +0, 2408, 2649, +0, 2413, 2644, +0, 2420, 2637, +0, 2429, 2628, +0, 2441, 2615, +0, 2456, 2597, +0, 2476, 2573, +0, 2501, 2538, +0, 2532, 2487, +0, 2571, 2407, +0, 2618, 2273, +0, 2675, 1995, +0, 2741, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3313, 0, +0, 3430, 0, +0, 3550, 0, +0, 3673, 0, +0, 2393, 2663, +0, 2393, 2663, +0, 2394, 2662, +0, 2394, 2662, +0, 2395, 2661, +0, 2396, 2661, +0, 2397, 2659, +0, 2399, 2658, +0, 2401, 2656, +0, 2404, 2653, +0, 2408, 2649, +0, 2413, 2644, +0, 2420, 2638, +0, 2429, 2628, +0, 2441, 2616, +0, 2456, 2598, +0, 2476, 2574, +0, 2501, 2539, +0, 2532, 2488, +0, 2571, 2408, +0, 2618, 2275, +0, 2675, 1998, +0, 2741, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3313, 0, +0, 3430, 0, +0, 3550, 0, +0, 3674, 0, +0, 2393, 2664, +0, 2394, 2664, +0, 2394, 2663, +0, 2395, 2663, +0, 2395, 2662, +0, 2396, 2661, +0, 2398, 2660, +0, 2399, 2659, +0, 2401, 2657, +0, 2404, 2654, +0, 2408, 2650, +0, 2413, 2645, +0, 2420, 2639, +0, 2429, 2629, +0, 2441, 2617, +0, 2456, 2599, +0, 2476, 2575, +0, 2501, 2540, +0, 2532, 2489, +0, 2571, 2410, +0, 2618, 2277, +0, 2675, 2002, +0, 2741, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3313, 0, +0, 3430, 0, +0, 3550, 0, +0, 3674, 0, +0, 2394, 2665, +0, 2394, 2665, +0, 2394, 2665, +0, 2395, 2664, +0, 2396, 2664, +0, 2397, 2663, +0, 2398, 2662, +0, 2399, 2660, +0, 2402, 2658, +0, 2405, 2655, +0, 2409, 2652, +0, 2414, 2647, +0, 2421, 2640, +0, 2430, 2631, +0, 2441, 2618, +0, 2457, 2601, +0, 2476, 2576, +0, 2501, 2542, +0, 2533, 2491, +0, 2571, 2412, +0, 2619, 2280, +0, 2675, 2007, +0, 2741, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3314, 0, +0, 3430, 0, +0, 3551, 0, +0, 3674, 0, +0, 2394, 2667, +0, 2394, 2667, +0, 2395, 2666, +0, 2395, 2666, +0, 2396, 2665, +0, 2397, 2664, +0, 2398, 2663, +0, 2400, 2662, +0, 2402, 2660, +0, 2405, 2657, +0, 2409, 2653, +0, 2414, 2648, +0, 2421, 2642, +0, 2430, 2633, +0, 2442, 2620, +0, 2457, 2603, +0, 2477, 2579, +0, 2501, 2544, +0, 2533, 2493, +0, 2572, 2415, +0, 2619, 2284, +0, 2675, 2014, +0, 2741, 0, +0, 2816, 0, +0, 2901, 0, +0, 2994, 0, +0, 3094, 0, +0, 3201, 0, +0, 3314, 0, +0, 3430, 0, +0, 3551, 0, +0, 3674, 0, +0, 2395, 2669, +0, 2395, 2669, +0, 2395, 2669, +0, 2396, 2668, +0, 2397, 2668, +0, 2398, 2667, +0, 2399, 2666, +0, 2400, 2664, +0, 2403, 2662, +0, 2406, 2659, +0, 2410, 2656, +0, 2415, 2651, +0, 2422, 2644, +0, 2430, 2635, +0, 2442, 2623, +0, 2457, 2605, +0, 2477, 2581, +0, 2502, 2547, +0, 2533, 2497, +0, 2572, 2419, +0, 2619, 2289, +0, 2676, 2024, +0, 2741, 0, +0, 2817, 0, +0, 2901, 0, +0, 2994, 0, +0, 3095, 0, +0, 3201, 0, +0, 3314, 0, +0, 3430, 0, +0, 3551, 0, +0, 3674, 0, +0, 2395, 2672, +0, 2396, 2672, +0, 2396, 2672, +0, 2397, 2671, +0, 2397, 2670, +0, 2398, 2670, +0, 2400, 2669, +0, 2401, 2667, +0, 2403, 2665, +0, 2406, 2662, +0, 2410, 2659, +0, 2415, 2654, +0, 2422, 2647, +0, 2431, 2638, +0, 2443, 2626, +0, 2458, 2609, +0, 2478, 2585, +0, 2503, 2551, +0, 2534, 2501, +0, 2573, 2424, +0, 2620, 2296, +0, 2676, 2036, +0, 2742, 0, +0, 2817, 0, +0, 2901, 0, +0, 2994, 0, +0, 3095, 0, +0, 3202, 0, +0, 3314, 0, +0, 3430, 0, +0, 3551, 0, +0, 3674, 0, +0, 2397, 2676, +0, 2397, 2676, +0, 2397, 2676, +0, 2398, 2675, +0, 2398, 2674, +0, 2399, 2674, +0, 2401, 2673, +0, 2402, 2671, +0, 2404, 2669, +0, 2407, 2666, +0, 2411, 2663, +0, 2416, 2658, +0, 2423, 2651, +0, 2432, 2642, +0, 2444, 2630, +0, 2459, 2613, +0, 2478, 2590, +0, 2503, 2556, +0, 2535, 2507, +0, 2573, 2431, +0, 2620, 2305, +0, 2677, 2052, +0, 2742, 0, +0, 2817, 0, +0, 2902, 0, +0, 2995, 0, +0, 3095, 0, +0, 3202, 0, +0, 3314, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +0, 2398, 2681, +0, 2398, 2681, +0, 2399, 2681, +0, 2399, 2680, +0, 2400, 2680, +0, 2401, 2679, +0, 2402, 2678, +0, 2404, 2676, +0, 2406, 2674, +0, 2409, 2672, +0, 2413, 2668, +0, 2418, 2663, +0, 2424, 2657, +0, 2433, 2648, +0, 2445, 2636, +0, 2460, 2619, +0, 2480, 2596, +0, 2504, 2563, +0, 2536, 2514, +0, 2574, 2440, +0, 2621, 2317, +0, 2677, 2072, +0, 2743, 674, +0, 2818, 0, +0, 2902, 0, +0, 2995, 0, +0, 3095, 0, +0, 3202, 0, +0, 3314, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +0, 2400, 2688, +0, 2400, 2688, +0, 2400, 2688, +0, 2401, 2687, +0, 2402, 2687, +0, 2402, 2686, +0, 2404, 2685, +0, 2405, 2683, +0, 2408, 2681, +0, 2410, 2679, +0, 2414, 2675, +0, 2419, 2671, +0, 2426, 2664, +0, 2435, 2656, +0, 2447, 2644, +0, 2462, 2627, +0, 2481, 2604, +0, 2506, 2572, +0, 2537, 2524, +0, 2575, 2452, +0, 2622, 2332, +0, 2678, 2098, +0, 2744, 1046, +0, 2819, 0, +0, 2903, 0, +0, 2995, 0, +0, 3096, 0, +0, 3202, 0, +0, 3314, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +0, 2402, 2697, +0, 2402, 2697, +0, 2403, 2697, +0, 2403, 2696, +0, 2404, 2696, +0, 2405, 2695, +0, 2406, 2694, +0, 2408, 2693, +0, 2410, 2691, +0, 2413, 2688, +0, 2417, 2685, +0, 2422, 2680, +0, 2428, 2674, +0, 2437, 2665, +0, 2449, 2654, +0, 2464, 2638, +0, 2483, 2615, +0, 2508, 2583, +0, 2539, 2537, +0, 2577, 2467, +0, 2624, 2352, +0, 2680, 2130, +0, 2745, 1300, +0, 2820, 0, +0, 2904, 0, +0, 2996, 0, +0, 3096, 0, +0, 3203, 0, +0, 3315, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +0, 2405, 2709, +0, 2406, 2709, +0, 2406, 2709, +0, 2406, 2708, +0, 2407, 2708, +0, 2408, 2707, +0, 2409, 2706, +0, 2411, 2705, +0, 2413, 2703, +0, 2416, 2700, +0, 2420, 2697, +0, 2425, 2692, +0, 2431, 2686, +0, 2440, 2678, +0, 2452, 2667, +0, 2467, 2651, +0, 2486, 2629, +0, 2510, 2599, +0, 2541, 2554, +0, 2579, 2486, +0, 2626, 2377, +0, 2681, 2170, +0, 2746, 1506, +0, 2821, 0, +0, 2905, 0, +0, 2997, 0, +0, 3097, 0, +0, 3203, 0, +0, 3315, 0, +0, 3431, 0, +0, 3551, 0, +0, 3674, 0, +0, 2410, 2725, +0, 2410, 2724, +0, 2410, 2724, +0, 2411, 2724, +0, 2411, 2723, +0, 2412, 2722, +0, 2413, 2721, +0, 2415, 2720, +0, 2417, 2718, +0, 2420, 2716, +0, 2424, 2713, +0, 2429, 2708, +0, 2435, 2702, +0, 2444, 2694, +0, 2456, 2684, +0, 2470, 2669, +0, 2489, 2648, +0, 2514, 2618, +0, 2544, 2575, +0, 2582, 2511, +0, 2628, 2408, +0, 2684, 2219, +0, 2748, 1686, +0, 2823, 0, +0, 2906, 0, +0, 2998, 0, +0, 3098, 0, +0, 3204, 0, +0, 3316, 0, +0, 3432, 0, +0, 3552, 0, +0, 3675, 0, +0, 2415, 2744, +0, 2415, 2744, +0, 2416, 2744, +0, 2416, 2744, +0, 2417, 2743, +0, 2418, 2742, +0, 2419, 2741, +0, 2421, 2740, +0, 2423, 2738, +0, 2426, 2736, +0, 2429, 2733, +0, 2434, 2729, +0, 2441, 2723, +0, 2449, 2716, +0, 2461, 2705, +0, 2475, 2691, +0, 2494, 2671, +0, 2518, 2643, +0, 2548, 2603, +0, 2586, 2543, +0, 2632, 2447, +0, 2687, 2277, +0, 2751, 1851, +0, 2825, 0, +0, 2908, 0, +0, 3000, 0, +0, 3099, 0, +0, 3205, 0, +0, 3316, 0, +0, 3432, 0, +0, 3552, 0, +0, 3675, 0, +896, 2423, 2770, +879, 2423, 2769, +854, 2423, 2769, +820, 2424, 2769, +769, 2424, 2768, +691, 2425, 2768, +560, 2426, 2767, +290, 2428, 2766, +0, 2430, 2764, +0, 2433, 2762, +0, 2436, 2759, +0, 2441, 2755, +0, 2448, 2750, +0, 2456, 2742, +0, 2467, 2733, +0, 2482, 2719, +0, 2500, 2701, +0, 2524, 2674, +0, 2554, 2637, +0, 2591, 2581, +0, 2636, 2494, +0, 2691, 2344, +0, 2755, 2007, +0, 2828, 0, +0, 2910, 0, +0, 3002, 0, +0, 3101, 0, +0, 3206, 0, +0, 3317, 0, +0, 3433, 0, +0, 3553, 0, +0, 3675, 0, +1925, 2432, 2801, +1923, 2432, 2801, +1921, 2433, 2801, +1917, 2433, 2801, +1913, 2434, 2800, +1907, 2435, 2799, +1899, 2436, 2799, +1889, 2438, 2798, +1874, 2440, 2796, +1853, 2442, 2794, +1824, 2446, 2791, +1782, 2451, 2788, +1718, 2457, 2783, +1617, 2465, 2776, +1432, 2476, 2767, +925, 2490, 2754, +0, 2508, 2737, +0, 2532, 2713, +0, 2561, 2679, +0, 2598, 2628, +0, 2642, 2551, +0, 2696, 2421, +0, 2759, 2155, +0, 2832, 0, +0, 2914, 0, +0, 3004, 0, +0, 3103, 0, +0, 3208, 0, +0, 3319, 0, +0, 3434, 0, +0, 3554, 0, +0, 3676, 0, +2283, 2445, 2841, +2282, 2445, 2840, +2281, 2445, 2840, +2279, 2446, 2840, +2278, 2447, 2839, +2275, 2447, 2839, +2271, 2449, 2838, +2267, 2450, 2837, +2260, 2452, 2836, +2252, 2455, 2834, +2240, 2458, 2831, +2223, 2463, 2828, +2200, 2469, 2823, +2168, 2477, 2817, +2120, 2488, 2809, +2047, 2501, 2798, +1927, 2519, 2782, +1692, 2542, 2760, +612, 2571, 2729, +0, 2607, 2685, +0, 2650, 2617, +0, 2703, 2507, +0, 2765, 2299, +0, 2837, 1624, +0, 2918, 0, +0, 3008, 0, +0, 3106, 0, +0, 3210, 0, +0, 3321, 0, +0, 3436, 0, +0, 3555, 0, +0, 3677, 0, +2532, 2461, 2888, +2531, 2462, 2888, +2531, 2462, 2888, +2530, 2462, 2887, +2529, 2463, 2887, +2527, 2464, 2887, +2525, 2465, 2886, +2522, 2466, 2885, +2519, 2468, 2884, +2514, 2471, 2882, +2507, 2474, 2880, +2498, 2479, 2877, +2486, 2484, 2873, +2469, 2492, 2867, +2445, 2503, 2860, +2411, 2516, 2850, +2360, 2533, 2836, +2283, 2555, 2817, +2155, 2583, 2789, +1893, 2618, 2750, +0, 2661, 2692, +0, 2713, 2601, +0, 2774, 2440, +0, 2844, 2059, +0, 2924, 0, +0, 3013, 0, +0, 3110, 0, +0, 3213, 0, +0, 3323, 0, +0, 3438, 0, +0, 3556, 0, +0, 3678, 0, +2735, 2482, 2945, +2735, 2483, 2945, +2734, 2483, 2945, +2734, 2483, 2944, +2733, 2484, 2944, +2732, 2485, 2944, +2731, 2486, 2943, +2729, 2487, 2942, +2727, 2489, 2941, +2724, 2491, 2940, +2719, 2495, 2938, +2714, 2499, 2935, +2706, 2504, 2931, +2696, 2512, 2927, +2681, 2522, 2920, +2661, 2535, 2911, +2633, 2551, 2899, +2592, 2572, 2882, +2532, 2599, 2859, +2435, 2633, 2826, +2263, 2675, 2777, +1825, 2725, 2702, +0, 2784, 2579, +0, 2853, 2332, +0, 2932, 847, +0, 3019, 0, +0, 3115, 0, +0, 3217, 0, +0, 3326, 0, +0, 3440, 0, +0, 3558, 0, +0, 3679, 0, +2914, 2509, 3011, +2913, 2509, 3011, +2913, 2510, 3011, +2913, 2510, 3011, +2912, 2510, 3010, +2912, 2511, 3010, +2911, 2512, 3009, +2910, 2513, 3009, +2908, 2515, 3008, +2906, 2517, 3007, +2903, 2521, 3005, +2900, 2525, 3003, +2894, 2530, 3000, +2888, 2537, 2995, +2878, 2546, 2990, +2865, 2558, 2982, +2848, 2574, 2972, +2823, 2594, 2958, +2787, 2620, 2938, +2735, 2652, 2910, +2653, 2692, 2870, +2516, 2741, 2810, +2224, 2798, 2716, +0, 2865, 2547, +0, 2942, 2131, +0, 3028, 0, +0, 3122, 0, +0, 3223, 0, +0, 3331, 0, +0, 3443, 0, +0, 3561, 0, +0, 3681, 0, +3078, 2542, 3087, +3078, 2543, 3087, +3077, 2543, 3087, +3077, 2543, 3087, +3077, 2544, 3086, +3076, 2544, 3086, +3076, 2545, 3086, +3075, 2547, 3085, +3074, 2548, 3084, +3073, 2550, 3083, +3071, 2553, 3082, +3068, 2557, 3080, +3064, 2562, 3077, +3060, 2569, 3074, +3053, 2577, 3069, +3045, 2589, 3063, +3033, 2603, 3054, +3016, 2622, 3042, +2993, 2647, 3026, +2961, 2677, 3003, +2913, 2715, 2971, +2841, 2761, 2923, +2721, 2816, 2851, +2486, 2881, 2733, +1423, 2955, 2501, +0, 3039, 1510, +0, 3130, 0, +0, 3230, 0, +0, 3336, 0, +0, 3448, 0, +0, 3564, 0, +0, 3684, 0, +3232, 2584, 3172, +3232, 2584, 3172, +3232, 2584, 3172, +3232, 2584, 3172, +3232, 2585, 3171, +3232, 2585, 3171, +3231, 2586, 3171, +3231, 2587, 3170, +3230, 2589, 3170, +3229, 2591, 3169, +3227, 2593, 3167, +3226, 2597, 3166, +3223, 2601, 3164, +3220, 2607, 3161, +3215, 2615, 3157, +3209, 2626, 3152, +3201, 2639, 3145, +3190, 2657, 3135, +3174, 2680, 3122, +3152, 2708, 3103, +3122, 2743, 3078, +3077, 2787, 3041, +3010, 2839, 2986, +2901, 2901, 2901, +2696, 2972, 2754, +2044, 3053, 2432, +0, 3142, 0, +0, 3239, 0, +0, 3344, 0, +0, 3454, 0, +0, 3569, 0, +0, 3687, 0, +3381, 2633, 3265, +3381, 2634, 3265, +3381, 2634, 3265, +3380, 2634, 3265, +3380, 2634, 3265, +3380, 2635, 3265, +3380, 2636, 3264, +3379, 2637, 3264, +3379, 2638, 3263, +3378, 2640, 3263, +3377, 2642, 3262, +3376, 2645, 3260, +3374, 2649, 3259, +3372, 2655, 3256, +3368, 2662, 3253, +3364, 2671, 3249, +3358, 2684, 3243, +3350, 2700, 3235, +3339, 2720, 3225, +3324, 2746, 3210, +3304, 2779, 3190, +3274, 2819, 3161, +3232, 2868, 3120, +3168, 2926, 3058, +3066, 2994, 2960, +2879, 3071, 2782, +2358, 3157, 2318, +0, 3252, 0, +0, 3353, 0, +0, 3461, 0, +0, 3575, 0, +0, 3692, 0, +3525, 2692, 3366, +3525, 2693, 3366, +3524, 2693, 3366, +3524, 2693, 3366, +3524, 2693, 3366, +3524, 2694, 3365, +3524, 2695, 3365, +3524, 2695, 3365, +3523, 2697, 3364, +3523, 2698, 3364, +3522, 2700, 3363, +3521, 2703, 3362, +3520, 2707, 3361, +3518, 2711, 3359, +3516, 2718, 3356, +3512, 2726, 3353, +3508, 2737, 3348, +3503, 2751, 3342, +3495, 2770, 3334, +3484, 2793, 3322, +3470, 2823, 3307, +3450, 2859, 3285, +3421, 2904, 3254, +3380, 2958, 3208, +3319, 3022, 3140, +3221, 3095, 3028, +3045, 3177, 2817, +2591, 3268, 2101, +0, 3366, 0, +0, 3471, 0, +0, 3582, 0, +0, 3698, 0, +3665, 2761, 3473, +3665, 2761, 3473, +3665, 2761, 3473, +3665, 2762, 3473, +3665, 2762, 3473, +3665, 2762, 3473, +3665, 2763, 3472, +3665, 2764, 3472, +3664, 2765, 3472, +3664, 2766, 3471, +3663, 2768, 3471, +3663, 2770, 3470, +3662, 2773, 3469, +3660, 2777, 3467, +3659, 2783, 3465, +3656, 2790, 3463, +3653, 2800, 3459, +3649, 2812, 3454, +3644, 2828, 3448, +3636, 2849, 3439, +3626, 2875, 3427, +3611, 2908, 3410, +3592, 2949, 3387, +3564, 2998, 3353, +3524, 3056, 3305, +3464, 3124, 3230, +3370, 3202, 3106, +3201, 3288, 2859, +2786, 3383, 1324, +0, 3485, 0, +0, 3593, 0, +0, 3706, 0, +3804, 2839, 3586, +3804, 2839, 3586, +3804, 2839, 3586, +3804, 2840, 3585, +3803, 2840, 3585, +3803, 2840, 3585, +3803, 2841, 3585, +3803, 2841, 3585, +3803, 2842, 3585, +3803, 2843, 3584, +3802, 2845, 3584, +3802, 2847, 3583, +3801, 2849, 3582, +3800, 2853, 3581, +3799, 2858, 3580, +3797, 2864, 3578, +3795, 2872, 3575, +3792, 2882, 3571, +3788, 2896, 3566, +3782, 2914, 3559, +3775, 2937, 3550, +3765, 2966, 3537, +3751, 3002, 3520, +3731, 3046, 3495, +3704, 3099, 3460, +3665, 3161, 3408, +3606, 3233, 3328, +3514, 3314, 3193, +3351, 3404, 2910, +2960, 3502, 0, +0, 3606, 0, +0, 3717, 0, +3940, 2926, 3703, +3940, 2926, 3702, +3940, 2926, 3702, +3940, 2926, 3702, +3940, 2927, 3702, +3940, 2927, 3702, +3940, 2927, 3702, +3940, 2928, 3702, +3940, 2929, 3702, +3940, 2930, 3702, +3939, 2931, 3701, +3939, 2932, 3701, +3938, 2935, 3700, +3938, 2938, 3699, +3937, 2941, 3698, +3936, 2947, 3696, +3934, 2953, 3694, +3932, 2962, 3691, +3929, 2974, 3687, +3925, 2989, 3682, +3919, 3008, 3675, +3912, 3033, 3666, +3902, 3064, 3652, +3888, 3103, 3634, +3869, 3150, 3608, +3842, 3206, 3572, +3803, 3271, 3517, +3745, 3347, 3433, +3654, 3431, 3288, +3495, 3523, 2971, +3121, 3624, 0, +0, 3730, 0, +4076, 3021, 3823, +4076, 3021, 3823, +4076, 3021, 3823, +4076, 3022, 3823, +4076, 3022, 3823, +4076, 3022, 3823, +4076, 3022, 3823, +4076, 3023, 3822, +4076, 3023, 3822, +4075, 3024, 3822, +4075, 3025, 3822, +4075, 3026, 3821, +4075, 3028, 3821, +4074, 3031, 3820, +4073, 3034, 3819, +4072, 3038, 3818, +4071, 3043, 3817, +4070, 3051, 3814, +4067, 3060, 3811, +4064, 3073, 3807, +4060, 3089, 3802, +4055, 3110, 3795, +4048, 3136, 3785, +4038, 3170, 3771, +4024, 3210, 3753, +4005, 3260, 3726, +3978, 3318, 3688, +3940, 3387, 3632, +3883, 3464, 3544, +3793, 3551, 3390, +3636, 3646, 3041, +3273, 3748, 0, +4095, 3124, 3946, +4095, 3124, 3946, +4095, 3124, 3946, +4095, 3124, 3946, +4095, 3124, 3946, +4095, 3124, 3946, +4095, 3125, 3946, +4095, 3125, 3946, +4095, 3125, 3946, +4095, 3126, 3945, +4095, 3127, 3945, +4095, 3128, 3945, +4095, 3129, 3945, +4095, 3131, 3944, +4095, 3134, 3943, +4095, 3137, 3942, +4095, 3142, 3941, +4095, 3147, 3940, +4095, 3155, 3937, +4095, 3165, 3934, +4095, 3179, 3930, +4095, 3196, 3925, +4095, 3218, 3917, +4095, 3246, 3907, +4095, 3280, 3893, +4095, 3323, 3874, +4095, 3375, 3847, +4095, 3435, 3808, +4075, 3506, 3750, +4019, 3586, 3659, +3930, 3674, 3499, +3775, 3771, 3120, +4095, 3232, 4071, +4095, 3232, 4071, +4095, 3232, 4071, +4095, 3232, 4071, +4095, 3233, 4071, +4095, 3233, 4071, +4095, 3233, 4071, +4095, 3233, 4071, +4095, 3234, 4071, +4095, 3234, 4071, +4095, 3235, 4071, +4095, 3236, 4070, +4095, 3237, 4070, +4095, 3238, 4070, +4095, 3240, 4069, +4095, 3243, 4069, +4095, 3246, 4068, +4095, 3251, 4066, +4095, 3257, 4065, +4095, 3265, 4062, +4095, 3276, 4059, +4095, 3290, 4055, +4095, 3308, 4050, +4095, 3331, 4042, +4095, 3360, 4032, +4095, 3396, 4018, +4095, 3440, 3998, +4095, 3493, 3971, +4095, 3556, 3931, +4095, 3628, 3872, +4095, 3709, 3778, +4065, 3799, 3612, +0, 2525, 2793, +0, 2525, 2793, +0, 2525, 2793, +0, 2525, 2793, +0, 2526, 2792, +0, 2527, 2792, +0, 2528, 2791, +0, 2529, 2790, +0, 2531, 2788, +0, 2533, 2786, +0, 2536, 2783, +0, 2540, 2779, +0, 2545, 2774, +0, 2552, 2768, +0, 2561, 2758, +0, 2572, 2746, +0, 2588, 2728, +0, 2607, 2704, +0, 2632, 2668, +0, 2664, 2617, +0, 2703, 2537, +0, 2750, 2402, +0, 2807, 2121, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3445, 0, +0, 3562, 0, +0, 3683, 0, +0, 2525, 2794, +0, 2525, 2794, +0, 2525, 2793, +0, 2526, 2793, +0, 2526, 2792, +0, 2527, 2792, +0, 2528, 2791, +0, 2529, 2790, +0, 2531, 2788, +0, 2533, 2786, +0, 2536, 2783, +0, 2540, 2780, +0, 2545, 2775, +0, 2552, 2768, +0, 2561, 2759, +0, 2573, 2746, +0, 2588, 2728, +0, 2607, 2704, +0, 2632, 2669, +0, 2664, 2617, +0, 2703, 2538, +0, 2750, 2403, +0, 2807, 2123, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2525, 2794, +0, 2525, 2794, +0, 2525, 2794, +0, 2526, 2793, +0, 2526, 2793, +0, 2527, 2792, +0, 2528, 2791, +0, 2529, 2790, +0, 2531, 2789, +0, 2533, 2787, +0, 2536, 2784, +0, 2540, 2780, +0, 2545, 2775, +0, 2552, 2768, +0, 2561, 2759, +0, 2573, 2746, +0, 2588, 2729, +0, 2608, 2704, +0, 2633, 2669, +0, 2664, 2618, +0, 2703, 2538, +0, 2750, 2404, +0, 2807, 2124, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2525, 2795, +0, 2525, 2794, +0, 2525, 2794, +0, 2526, 2794, +0, 2526, 2793, +0, 2527, 2793, +0, 2528, 2792, +0, 2529, 2791, +0, 2531, 2789, +0, 2533, 2787, +0, 2536, 2784, +0, 2540, 2781, +0, 2545, 2776, +0, 2552, 2769, +0, 2561, 2760, +0, 2573, 2747, +0, 2588, 2730, +0, 2608, 2705, +0, 2633, 2670, +0, 2664, 2619, +0, 2703, 2539, +0, 2750, 2405, +0, 2807, 2127, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2525, 2795, +0, 2525, 2795, +0, 2526, 2795, +0, 2526, 2795, +0, 2526, 2794, +0, 2527, 2793, +0, 2528, 2793, +0, 2529, 2791, +0, 2531, 2790, +0, 2533, 2788, +0, 2536, 2785, +0, 2540, 2781, +0, 2545, 2776, +0, 2552, 2770, +0, 2561, 2760, +0, 2573, 2748, +0, 2588, 2730, +0, 2608, 2706, +0, 2633, 2671, +0, 2664, 2620, +0, 2703, 2540, +0, 2750, 2407, +0, 2807, 2130, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2525, 2796, +0, 2526, 2796, +0, 2526, 2796, +0, 2526, 2795, +0, 2527, 2795, +0, 2527, 2794, +0, 2528, 2794, +0, 2530, 2792, +0, 2531, 2791, +0, 2533, 2789, +0, 2536, 2786, +0, 2540, 2782, +0, 2546, 2777, +0, 2552, 2771, +0, 2561, 2761, +0, 2573, 2749, +0, 2588, 2731, +0, 2608, 2707, +0, 2633, 2672, +0, 2664, 2621, +0, 2703, 2542, +0, 2751, 2409, +0, 2807, 2134, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2526, 2798, +0, 2526, 2797, +0, 2526, 2797, +0, 2527, 2797, +0, 2527, 2796, +0, 2528, 2796, +0, 2529, 2795, +0, 2530, 2794, +0, 2532, 2792, +0, 2534, 2790, +0, 2537, 2787, +0, 2541, 2784, +0, 2546, 2779, +0, 2553, 2772, +0, 2562, 2763, +0, 2573, 2750, +0, 2589, 2733, +0, 2608, 2709, +0, 2633, 2674, +0, 2665, 2623, +0, 2703, 2544, +0, 2751, 2412, +0, 2807, 2139, +0, 2873, 0, +0, 2948, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2526, 2799, +0, 2526, 2799, +0, 2527, 2799, +0, 2527, 2798, +0, 2527, 2798, +0, 2528, 2797, +0, 2529, 2797, +0, 2530, 2795, +0, 2532, 2794, +0, 2534, 2792, +0, 2537, 2789, +0, 2541, 2785, +0, 2546, 2780, +0, 2553, 2774, +0, 2562, 2765, +0, 2574, 2752, +0, 2589, 2735, +0, 2609, 2711, +0, 2634, 2676, +0, 2665, 2625, +0, 2704, 2547, +0, 2751, 2416, +0, 2807, 2146, +0, 2873, 0, +0, 2949, 0, +0, 3033, 0, +0, 3126, 0, +0, 3226, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2527, 2801, +0, 2527, 2801, +0, 2527, 2801, +0, 2528, 2801, +0, 2528, 2800, +0, 2529, 2800, +0, 2530, 2799, +0, 2531, 2798, +0, 2533, 2796, +0, 2535, 2794, +0, 2538, 2791, +0, 2542, 2788, +0, 2547, 2783, +0, 2554, 2776, +0, 2563, 2767, +0, 2574, 2755, +0, 2590, 2737, +0, 2609, 2713, +0, 2634, 2679, +0, 2665, 2629, +0, 2704, 2551, +0, 2751, 2421, +0, 2808, 2156, +0, 2873, 0, +0, 2949, 0, +0, 3033, 0, +0, 3126, 0, +0, 3227, 0, +0, 3333, 0, +0, 3446, 0, +0, 3562, 0, +0, 3683, 0, +0, 2527, 2804, +0, 2528, 2804, +0, 2528, 2804, +0, 2528, 2804, +0, 2529, 2803, +0, 2529, 2803, +0, 2530, 2802, +0, 2532, 2801, +0, 2533, 2799, +0, 2536, 2797, +0, 2538, 2794, +0, 2542, 2791, +0, 2548, 2786, +0, 2554, 2779, +0, 2563, 2770, +0, 2575, 2758, +0, 2590, 2741, +0, 2610, 2717, +0, 2635, 2683, +0, 2666, 2633, +0, 2705, 2556, +0, 2752, 2428, +0, 2808, 2168, +0, 2874, 0, +0, 2949, 0, +0, 3034, 0, +0, 3126, 0, +0, 3227, 0, +0, 3334, 0, +0, 3446, 0, +0, 3563, 0, +0, 3683, 0, +0, 2528, 2808, +0, 2529, 2808, +0, 2529, 2808, +0, 2529, 2808, +0, 2530, 2807, +0, 2531, 2807, +0, 2531, 2806, +0, 2533, 2805, +0, 2534, 2803, +0, 2537, 2801, +0, 2539, 2799, +0, 2543, 2795, +0, 2549, 2790, +0, 2555, 2783, +0, 2564, 2775, +0, 2576, 2762, +0, 2591, 2745, +0, 2611, 2722, +0, 2635, 2688, +0, 2667, 2639, +0, 2705, 2563, +0, 2752, 2437, +0, 2809, 2184, +0, 2874, 0, +0, 2949, 0, +0, 3034, 0, +0, 3127, 0, +0, 3227, 0, +0, 3334, 0, +0, 3446, 0, +0, 3563, 0, +0, 3683, 0, +0, 2530, 2814, +0, 2530, 2813, +0, 2530, 2813, +0, 2531, 2813, +0, 2531, 2812, +0, 2532, 2812, +0, 2533, 2811, +0, 2534, 2810, +0, 2536, 2808, +0, 2538, 2806, +0, 2541, 2804, +0, 2545, 2800, +0, 2550, 2795, +0, 2557, 2789, +0, 2565, 2780, +0, 2577, 2768, +0, 2592, 2751, +0, 2612, 2728, +0, 2636, 2695, +0, 2668, 2646, +0, 2706, 2572, +0, 2753, 2449, +0, 2809, 2204, +0, 2875, 806, +0, 2950, 0, +0, 3034, 0, +0, 3127, 0, +0, 3227, 0, +0, 3334, 0, +0, 3446, 0, +0, 3563, 0, +0, 3683, 0, +0, 2532, 2821, +0, 2532, 2820, +0, 2532, 2820, +0, 2532, 2820, +0, 2533, 2819, +0, 2534, 2819, +0, 2535, 2818, +0, 2536, 2817, +0, 2537, 2815, +0, 2540, 2814, +0, 2543, 2811, +0, 2546, 2807, +0, 2552, 2803, +0, 2558, 2796, +0, 2567, 2788, +0, 2579, 2776, +0, 2594, 2759, +0, 2613, 2736, +0, 2638, 2704, +0, 2669, 2656, +0, 2708, 2584, +0, 2754, 2464, +0, 2810, 2230, +0, 2876, 1179, +0, 2951, 0, +0, 3035, 0, +0, 3128, 0, +0, 3228, 0, +0, 3334, 0, +0, 3446, 0, +0, 3563, 0, +0, 3683, 0, +0, 2534, 2830, +0, 2534, 2829, +0, 2534, 2829, +0, 2535, 2829, +0, 2535, 2828, +0, 2536, 2828, +0, 2537, 2827, +0, 2538, 2826, +0, 2540, 2825, +0, 2542, 2823, +0, 2545, 2820, +0, 2549, 2817, +0, 2554, 2812, +0, 2561, 2806, +0, 2569, 2797, +0, 2581, 2786, +0, 2596, 2770, +0, 2615, 2747, +0, 2640, 2716, +0, 2671, 2669, +0, 2709, 2599, +0, 2756, 2484, +0, 2812, 2263, +0, 2877, 1432, +0, 2952, 0, +0, 3036, 0, +0, 3128, 0, +0, 3228, 0, +0, 3335, 0, +0, 3447, 0, +0, 3563, 0, +0, 3683, 0, +0, 2537, 2842, +0, 2537, 2841, +0, 2538, 2841, +0, 2538, 2841, +0, 2539, 2840, +0, 2539, 2840, +0, 2540, 2839, +0, 2541, 2838, +0, 2543, 2837, +0, 2545, 2835, +0, 2548, 2832, +0, 2552, 2829, +0, 2557, 2824, +0, 2564, 2818, +0, 2572, 2810, +0, 2584, 2799, +0, 2599, 2783, +0, 2618, 2761, +0, 2642, 2731, +0, 2673, 2686, +0, 2711, 2618, +0, 2758, 2509, +0, 2813, 2303, +0, 2878, 1638, +0, 2953, 0, +0, 3037, 0, +0, 3129, 0, +0, 3229, 0, +0, 3335, 0, +0, 3447, 0, +0, 3564, 0, +0, 3684, 0, +0, 2541, 2857, +0, 2542, 2857, +0, 2542, 2857, +0, 2542, 2856, +0, 2543, 2856, +0, 2543, 2855, +0, 2544, 2854, +0, 2546, 2854, +0, 2547, 2852, +0, 2549, 2850, +0, 2552, 2848, +0, 2556, 2845, +0, 2561, 2840, +0, 2568, 2835, +0, 2576, 2827, +0, 2588, 2816, +0, 2602, 2801, +0, 2621, 2780, +0, 2646, 2750, +0, 2676, 2708, +0, 2714, 2643, +0, 2760, 2540, +0, 2816, 2351, +0, 2880, 1818, +0, 2955, 0, +0, 3038, 0, +0, 3130, 0, +0, 3230, 0, +0, 3336, 0, +0, 3448, 0, +0, 3564, 0, +0, 3684, 0, +0, 2547, 2877, +0, 2547, 2877, +0, 2547, 2876, +0, 2548, 2876, +0, 2548, 2876, +0, 2549, 2875, +0, 2550, 2874, +0, 2551, 2873, +0, 2553, 2872, +0, 2555, 2870, +0, 2558, 2868, +0, 2561, 2865, +0, 2566, 2861, +0, 2573, 2855, +0, 2581, 2848, +0, 2593, 2837, +0, 2607, 2823, +0, 2626, 2803, +0, 2650, 2775, +0, 2680, 2735, +0, 2718, 2675, +0, 2764, 2579, +0, 2819, 2409, +0, 2883, 1983, +0, 2957, 0, +0, 3040, 0, +0, 3132, 0, +0, 3231, 0, +0, 3337, 0, +0, 3449, 0, +0, 3565, 0, +0, 3684, 0, +1040, 2554, 2902, +1028, 2555, 2902, +1011, 2555, 2902, +986, 2555, 2901, +952, 2556, 2901, +901, 2556, 2900, +823, 2557, 2900, +692, 2558, 2899, +422, 2560, 2898, +0, 2562, 2896, +0, 2565, 2894, +0, 2569, 2891, +0, 2573, 2887, +0, 2580, 2882, +0, 2588, 2875, +0, 2599, 2865, +0, 2614, 2851, +0, 2632, 2833, +0, 2656, 2806, +0, 2686, 2769, +0, 2723, 2713, +0, 2768, 2627, +0, 2823, 2476, +0, 2887, 2139, +0, 2960, 0, +0, 3043, 0, +0, 3134, 0, +0, 3233, 0, +0, 3338, 0, +0, 3450, 0, +0, 3565, 0, +0, 3685, 0, +2058, 2564, 2934, +2057, 2564, 2933, +2055, 2565, 2933, +2053, 2565, 2933, +2050, 2565, 2933, +2045, 2566, 2932, +2039, 2567, 2932, +2032, 2568, 2931, +2021, 2570, 2930, +2006, 2572, 2928, +1985, 2574, 2926, +1956, 2578, 2923, +1914, 2583, 2920, +1850, 2589, 2915, +1749, 2597, 2908, +1564, 2608, 2899, +1057, 2622, 2887, +0, 2641, 2869, +0, 2664, 2845, +0, 2693, 2811, +0, 2730, 2761, +0, 2775, 2683, +0, 2828, 2553, +0, 2891, 2287, +0, 2964, 0, +0, 3046, 0, +0, 3137, 0, +0, 3235, 0, +0, 3340, 0, +0, 3451, 0, +0, 3566, 0, +0, 3686, 0, +2415, 2577, 2973, +2415, 2577, 2973, +2414, 2577, 2972, +2413, 2578, 2972, +2412, 2578, 2972, +2410, 2579, 2971, +2407, 2580, 2971, +2404, 2581, 2970, +2399, 2582, 2969, +2392, 2584, 2968, +2384, 2587, 2966, +2372, 2590, 2963, +2355, 2595, 2960, +2332, 2601, 2956, +2300, 2609, 2949, +2252, 2620, 2941, +2179, 2633, 2930, +2059, 2651, 2914, +1824, 2674, 2892, +744, 2703, 2862, +0, 2739, 2817, +0, 2783, 2749, +0, 2835, 2639, +0, 2898, 2431, +0, 2969, 1756, +0, 3050, 0, +0, 3140, 0, +0, 3238, 0, +0, 3342, 0, +0, 3453, 0, +0, 3568, 0, +0, 3687, 0, +2664, 2593, 3020, +2664, 2593, 3020, +2663, 2594, 3020, +2663, 2594, 3020, +2662, 2594, 3020, +2661, 2595, 3019, +2659, 2596, 3019, +2657, 2597, 3018, +2654, 2598, 3017, +2651, 2600, 3016, +2646, 2603, 3014, +2639, 2606, 3012, +2630, 2611, 3009, +2618, 2617, 3005, +2601, 2624, 2999, +2577, 2635, 2992, +2543, 2648, 2982, +2493, 2665, 2968, +2416, 2687, 2949, +2287, 2715, 2922, +2025, 2750, 2883, +0, 2793, 2824, +0, 2845, 2733, +0, 2906, 2572, +0, 2976, 2191, +0, 3056, 0, +0, 3145, 0, +0, 3242, 0, +0, 3345, 0, +0, 3455, 0, +0, 3570, 0, +0, 3688, 0, +2867, 2614, 3077, +2867, 2614, 3077, +2867, 2615, 3077, +2866, 2615, 3077, +2866, 2615, 3076, +2865, 2616, 3076, +2864, 2617, 3076, +2863, 2618, 3075, +2861, 2619, 3074, +2859, 2621, 3073, +2856, 2623, 3072, +2851, 2627, 3070, +2846, 2631, 3067, +2838, 2637, 3063, +2828, 2644, 3059, +2813, 2654, 3052, +2793, 2667, 3043, +2765, 2683, 3031, +2724, 2705, 3014, +2664, 2731, 2991, +2567, 2765, 2958, +2395, 2807, 2909, +1957, 2857, 2835, +0, 2916, 2711, +0, 2985, 2465, +0, 3064, 979, +0, 3151, 0, +0, 3247, 0, +0, 3350, 0, +0, 3458, 0, +0, 3572, 0, +0, 3690, 0, +3046, 2641, 3143, +3046, 2641, 3143, +3046, 2641, 3143, +3045, 2642, 3143, +3045, 2642, 3143, +3044, 2643, 3142, +3044, 2643, 3142, +3043, 2644, 3142, +3042, 2646, 3141, +3040, 2647, 3140, +3038, 2650, 3139, +3035, 2653, 3137, +3032, 2657, 3135, +3027, 2662, 3132, +3020, 2669, 3127, +3010, 2678, 3122, +2997, 2691, 3114, +2980, 2706, 3104, +2955, 2727, 3090, +2919, 2752, 3070, +2867, 2785, 3042, +2786, 2824, 3002, +2648, 2873, 2942, +2356, 2930, 2848, +0, 2997, 2679, +0, 3074, 2263, +0, 3160, 0, +0, 3254, 0, +0, 3355, 0, +0, 3463, 0, +0, 3576, 0, +0, 3693, 0, +3210, 2674, 3219, +3210, 2674, 3219, +3210, 2675, 3219, +3210, 2675, 3219, +3209, 2675, 3219, +3209, 2676, 3218, +3209, 2677, 3218, +3208, 2677, 3218, +3207, 2679, 3217, +3206, 2680, 3216, +3205, 2682, 3215, +3203, 2685, 3214, +3200, 2689, 3212, +3197, 2694, 3209, +3192, 2701, 3206, +3185, 2709, 3201, +3177, 2721, 3195, +3165, 2735, 3186, +3148, 2754, 3174, +3126, 2779, 3158, +3093, 2809, 3135, +3045, 2847, 3103, +2973, 2893, 3055, +2853, 2948, 2983, +2618, 3013, 2865, +1555, 3087, 2634, +0, 3171, 1643, +0, 3263, 0, +0, 3362, 0, +0, 3468, 0, +0, 3580, 0, +0, 3696, 0, +3365, 2716, 3304, +3365, 2716, 3304, +3364, 2716, 3304, +3364, 2716, 3304, +3364, 2716, 3304, +3364, 2717, 3303, +3364, 2718, 3303, +3363, 2718, 3303, +3363, 2719, 3302, +3362, 2721, 3302, +3361, 2723, 3301, +3359, 2725, 3300, +3358, 2729, 3298, +3355, 2734, 3296, +3352, 2740, 3293, +3347, 2748, 3289, +3341, 2758, 3284, +3333, 2772, 3277, +3322, 2789, 3267, +3306, 2812, 3254, +3285, 2840, 3235, +3254, 2876, 3210, +3209, 2919, 3173, +3142, 2971, 3118, +3033, 3033, 3033, +2828, 3104, 2887, +2176, 3185, 2564, +0, 3274, 0, +0, 3372, 0, +0, 3476, 0, +0, 3586, 0, +0, 3701, 0, +3513, 2765, 3397, +3513, 2765, 3397, +3513, 2766, 3397, +3513, 2766, 3397, +3513, 2766, 3397, +3512, 2767, 3397, +3512, 2767, 3397, +3512, 2768, 3396, +3511, 2769, 3396, +3511, 2770, 3395, +3510, 2772, 3395, +3509, 2774, 3394, +3508, 2777, 3392, +3506, 2781, 3391, +3504, 2787, 3388, +3500, 2794, 3385, +3496, 2804, 3381, +3490, 2816, 3375, +3482, 2832, 3367, +3471, 2852, 3357, +3457, 2878, 3342, +3436, 2911, 3322, +3406, 2951, 3293, +3364, 3000, 3252, +3300, 3058, 3190, +3198, 3126, 3092, +3011, 3203, 2914, +2491, 3289, 2450, +0, 3384, 0, +0, 3486, 0, +0, 3594, 0, +0, 3707, 0, +3657, 2824, 3498, +3657, 2824, 3498, +3657, 2825, 3498, +3657, 2825, 3498, +3656, 2825, 3498, +3656, 2825, 3498, +3656, 2826, 3497, +3656, 2827, 3497, +3656, 2827, 3497, +3655, 2829, 3497, +3655, 2830, 3496, +3654, 2832, 3495, +3653, 2835, 3494, +3652, 2839, 3493, +3650, 2843, 3491, +3648, 2850, 3488, +3645, 2858, 3485, +3640, 2869, 3480, +3635, 2883, 3474, +3627, 2902, 3466, +3616, 2925, 3454, +3602, 2955, 3439, +3582, 2992, 3417, +3553, 3036, 3386, +3512, 3090, 3340, +3451, 3154, 3272, +3353, 3227, 3160, +3177, 3309, 2949, +2723, 3400, 2233, +0, 3498, 0, +0, 3604, 0, +0, 3715, 0, +3797, 2893, 3605, +3797, 2893, 3605, +3797, 2893, 3605, +3797, 2893, 3605, +3797, 2894, 3605, +3797, 2894, 3605, +3797, 2894, 3605, +3797, 2895, 3605, +3797, 2896, 3604, +3796, 2897, 3604, +3796, 2898, 3604, +3795, 2900, 3603, +3795, 2902, 3602, +3794, 2905, 3601, +3792, 2909, 3600, +3791, 2915, 3598, +3788, 2922, 3595, +3785, 2932, 3591, +3781, 2944, 3587, +3776, 2960, 3580, +3768, 2981, 3571, +3758, 3007, 3559, +3744, 3040, 3542, +3724, 3081, 3519, +3696, 3130, 3486, +3656, 3188, 3437, +3596, 3256, 3362, +3502, 3334, 3238, +3333, 3420, 2991, +2918, 3515, 1456, +0, 3617, 0, +0, 3725, 0, +3936, 2971, 3718, +3936, 2971, 3718, +3936, 2971, 3718, +3936, 2971, 3718, +3936, 2972, 3718, +3936, 2972, 3717, +3935, 2972, 3717, +3935, 2973, 3717, +3935, 2973, 3717, +3935, 2974, 3717, +3935, 2975, 3716, +3934, 2977, 3716, +3934, 2979, 3715, +3933, 2981, 3714, +3932, 2985, 3713, +3931, 2990, 3712, +3929, 2996, 3710, +3927, 3004, 3707, +3924, 3015, 3703, +3920, 3028, 3698, +3914, 3046, 3691, +3907, 3069, 3682, +3897, 3098, 3669, +3883, 3134, 3652, +3863, 3178, 3627, +3836, 3231, 3592, +3797, 3293, 3540, +3738, 3365, 3460, +3646, 3446, 3325, +3483, 3536, 3042, +3092, 3634, 0, +0, 3738, 0, +4073, 3058, 3835, +4073, 3058, 3835, +4072, 3058, 3835, +4072, 3058, 3835, +4072, 3059, 3834, +4072, 3059, 3834, +4072, 3059, 3834, +4072, 3059, 3834, +4072, 3060, 3834, +4072, 3061, 3834, +4072, 3062, 3834, +4071, 3063, 3833, +4071, 3064, 3833, +4071, 3067, 3832, +4070, 3070, 3831, +4069, 3073, 3830, +4068, 3079, 3828, +4066, 3085, 3826, +4064, 3094, 3823, +4061, 3106, 3820, +4057, 3121, 3814, +4051, 3140, 3807, +4044, 3165, 3798, +4034, 3196, 3784, +4020, 3235, 3766, +4001, 3282, 3741, +3974, 3338, 3704, +3935, 3404, 3650, +3877, 3479, 3565, +3787, 3563, 3420, +3627, 3656, 3103, +3253, 3756, 0, +4095, 3153, 3955, +4095, 3153, 3955, +4095, 3153, 3955, +4095, 3154, 3955, +4095, 3154, 3955, +4095, 3154, 3955, +4095, 3154, 3955, +4095, 3154, 3955, +4095, 3155, 3955, +4095, 3155, 3954, +4095, 3156, 3954, +4095, 3157, 3954, +4095, 3159, 3954, +4095, 3160, 3953, +4095, 3163, 3952, +4095, 3166, 3951, +4095, 3170, 3950, +4095, 3176, 3949, +4095, 3183, 3946, +4095, 3192, 3943, +4095, 3205, 3940, +4095, 3221, 3934, +4095, 3242, 3927, +4095, 3269, 3917, +4095, 3302, 3903, +4095, 3342, 3885, +4095, 3392, 3858, +4095, 3451, 3820, +4072, 3519, 3764, +4015, 3596, 3676, +3925, 3683, 3522, +3768, 3778, 3173, +4095, 3256, 4078, +4095, 3256, 4078, +4095, 3256, 4078, +4095, 3256, 4078, +4095, 3256, 4078, +4095, 3256, 4078, +4095, 3256, 4078, +4095, 3257, 4078, +4095, 3257, 4078, +4095, 3257, 4078, +4095, 3258, 4078, +4095, 3259, 4077, +4095, 3260, 4077, +4095, 3261, 4077, +4095, 3263, 4076, +4095, 3266, 4075, +4095, 3269, 4075, +4095, 3274, 4073, +4095, 3280, 4072, +4095, 3287, 4069, +4095, 3297, 4066, +4095, 3311, 4062, +4095, 3328, 4057, +4095, 3350, 4049, +4095, 3378, 4039, +4095, 3413, 4025, +4095, 3455, 4006, +4095, 3507, 3979, +4095, 3567, 3940, +4095, 3638, 3882, +4095, 3718, 3791, +4062, 3806, 3631, +0, 2656, 2925, +0, 2657, 2925, +0, 2657, 2925, +0, 2657, 2925, +0, 2658, 2924, +0, 2658, 2924, +0, 2659, 2923, +0, 2660, 2923, +0, 2661, 2921, +0, 2663, 2920, +0, 2665, 2918, +0, 2668, 2915, +0, 2672, 2911, +0, 2677, 2906, +0, 2684, 2899, +0, 2693, 2890, +0, 2705, 2878, +0, 2720, 2860, +0, 2739, 2835, +0, 2764, 2800, +0, 2796, 2749, +0, 2835, 2669, +0, 2882, 2534, +0, 2939, 2253, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2657, 2926, +0, 2657, 2926, +0, 2657, 2925, +0, 2657, 2925, +0, 2658, 2925, +0, 2658, 2924, +0, 2659, 2924, +0, 2660, 2923, +0, 2661, 2922, +0, 2663, 2920, +0, 2665, 2918, +0, 2668, 2915, +0, 2672, 2912, +0, 2677, 2907, +0, 2684, 2900, +0, 2693, 2890, +0, 2705, 2878, +0, 2720, 2860, +0, 2739, 2836, +0, 2765, 2801, +0, 2796, 2749, +0, 2835, 2669, +0, 2882, 2535, +0, 2939, 2254, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2657, 2926, +0, 2657, 2926, +0, 2657, 2926, +0, 2657, 2925, +0, 2658, 2925, +0, 2658, 2925, +0, 2659, 2924, +0, 2660, 2923, +0, 2661, 2922, +0, 2663, 2920, +0, 2665, 2918, +0, 2668, 2916, +0, 2672, 2912, +0, 2677, 2907, +0, 2684, 2900, +0, 2693, 2891, +0, 2705, 2878, +0, 2720, 2861, +0, 2740, 2836, +0, 2765, 2801, +0, 2796, 2749, +0, 2835, 2670, +0, 2882, 2535, +0, 2939, 2255, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2657, 2926, +0, 2657, 2926, +0, 2657, 2926, +0, 2657, 2926, +0, 2658, 2925, +0, 2658, 2925, +0, 2659, 2924, +0, 2660, 2923, +0, 2661, 2922, +0, 2663, 2921, +0, 2665, 2919, +0, 2668, 2916, +0, 2672, 2912, +0, 2677, 2907, +0, 2684, 2900, +0, 2693, 2891, +0, 2705, 2879, +0, 2720, 2861, +0, 2740, 2836, +0, 2765, 2801, +0, 2796, 2750, +0, 2835, 2670, +0, 2882, 2536, +0, 2939, 2257, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2657, 2927, +0, 2657, 2927, +0, 2657, 2927, +0, 2657, 2926, +0, 2658, 2926, +0, 2658, 2925, +0, 2659, 2925, +0, 2660, 2924, +0, 2661, 2923, +0, 2663, 2921, +0, 2665, 2919, +0, 2668, 2917, +0, 2672, 2913, +0, 2677, 2908, +0, 2684, 2901, +0, 2693, 2892, +0, 2705, 2879, +0, 2720, 2862, +0, 2740, 2837, +0, 2765, 2802, +0, 2796, 2751, +0, 2835, 2671, +0, 2882, 2537, +0, 2939, 2259, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2657, 2928, +0, 2657, 2927, +0, 2657, 2927, +0, 2658, 2927, +0, 2658, 2927, +0, 2659, 2926, +0, 2659, 2926, +0, 2660, 2925, +0, 2661, 2924, +0, 2663, 2922, +0, 2665, 2920, +0, 2668, 2917, +0, 2672, 2914, +0, 2677, 2909, +0, 2684, 2902, +0, 2693, 2893, +0, 2705, 2880, +0, 2720, 2862, +0, 2740, 2838, +0, 2765, 2803, +0, 2796, 2752, +0, 2835, 2673, +0, 2882, 2539, +0, 2939, 2262, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2657, 2929, +0, 2657, 2928, +0, 2658, 2928, +0, 2658, 2928, +0, 2658, 2928, +0, 2659, 2927, +0, 2660, 2926, +0, 2660, 2926, +0, 2662, 2925, +0, 2663, 2923, +0, 2666, 2921, +0, 2669, 2918, +0, 2672, 2915, +0, 2678, 2910, +0, 2684, 2903, +0, 2693, 2894, +0, 2705, 2881, +0, 2720, 2864, +0, 2740, 2839, +0, 2765, 2804, +0, 2796, 2753, +0, 2835, 2674, +0, 2883, 2541, +0, 2939, 2266, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2658, 2930, +0, 2658, 2930, +0, 2658, 2929, +0, 2658, 2929, +0, 2659, 2929, +0, 2659, 2928, +0, 2660, 2928, +0, 2661, 2927, +0, 2662, 2926, +0, 2664, 2924, +0, 2666, 2922, +0, 2669, 2919, +0, 2673, 2916, +0, 2678, 2911, +0, 2685, 2904, +0, 2694, 2895, +0, 2706, 2882, +0, 2721, 2865, +0, 2740, 2841, +0, 2765, 2806, +0, 2797, 2755, +0, 2836, 2676, +0, 2883, 2544, +0, 2939, 2271, +0, 3005, 0, +0, 3080, 0, +0, 3165, 0, +0, 3258, 0, +0, 3358, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2658, 2931, +0, 2658, 2931, +0, 2658, 2931, +0, 2659, 2931, +0, 2659, 2931, +0, 2660, 2930, +0, 2660, 2929, +0, 2661, 2929, +0, 2662, 2927, +0, 2664, 2926, +0, 2666, 2924, +0, 2669, 2921, +0, 2673, 2918, +0, 2678, 2913, +0, 2685, 2906, +0, 2694, 2897, +0, 2706, 2884, +0, 2721, 2867, +0, 2741, 2843, +0, 2766, 2808, +0, 2797, 2757, +0, 2836, 2679, +0, 2883, 2548, +0, 2939, 2279, +0, 3005, 0, +0, 3081, 0, +0, 3165, 0, +0, 3258, 0, +0, 3359, 0, +0, 3465, 0, +0, 3578, 0, +0, 3694, 0, +0, 2659, 2934, +0, 2659, 2934, +0, 2659, 2933, +0, 2659, 2933, +0, 2660, 2933, +0, 2660, 2932, +0, 2661, 2932, +0, 2662, 2931, +0, 2663, 2930, +0, 2665, 2928, +0, 2667, 2926, +0, 2670, 2924, +0, 2674, 2920, +0, 2679, 2915, +0, 2686, 2908, +0, 2695, 2899, +0, 2706, 2887, +0, 2722, 2870, +0, 2741, 2845, +0, 2766, 2811, +0, 2797, 2761, +0, 2836, 2683, +0, 2883, 2553, +0, 2940, 2288, +0, 3006, 0, +0, 3081, 0, +0, 3165, 0, +0, 3258, 0, +0, 3359, 0, +0, 3466, 0, +0, 3578, 0, +0, 3695, 0, +0, 2659, 2937, +0, 2659, 2937, +0, 2660, 2936, +0, 2660, 2936, +0, 2660, 2936, +0, 2661, 2935, +0, 2662, 2935, +0, 2663, 2934, +0, 2664, 2933, +0, 2665, 2931, +0, 2668, 2929, +0, 2671, 2927, +0, 2674, 2923, +0, 2680, 2918, +0, 2686, 2911, +0, 2695, 2902, +0, 2707, 2890, +0, 2722, 2873, +0, 2742, 2849, +0, 2767, 2815, +0, 2798, 2765, +0, 2837, 2688, +0, 2884, 2560, +0, 2940, 2300, +0, 3006, 0, +0, 3081, 0, +0, 3166, 0, +0, 3258, 0, +0, 3359, 0, +0, 3466, 0, +0, 3578, 0, +0, 3695, 0, +0, 2660, 2941, +0, 2660, 2941, +0, 2661, 2940, +0, 2661, 2940, +0, 2661, 2940, +0, 2662, 2939, +0, 2663, 2939, +0, 2664, 2938, +0, 2665, 2937, +0, 2666, 2935, +0, 2669, 2933, +0, 2672, 2931, +0, 2675, 2927, +0, 2681, 2922, +0, 2687, 2916, +0, 2696, 2907, +0, 2708, 2894, +0, 2723, 2877, +0, 2743, 2854, +0, 2768, 2820, +0, 2799, 2771, +0, 2837, 2695, +0, 2885, 2569, +0, 2941, 2316, +0, 3006, 0, +0, 3082, 0, +0, 3166, 0, +0, 3259, 0, +0, 3359, 0, +0, 3466, 0, +0, 3578, 0, +0, 3695, 0, +0, 2662, 2946, +0, 2662, 2946, +0, 2662, 2946, +0, 2662, 2945, +0, 2663, 2945, +0, 2663, 2945, +0, 2664, 2944, +0, 2665, 2943, +0, 2666, 2942, +0, 2668, 2941, +0, 2670, 2939, +0, 2673, 2936, +0, 2677, 2932, +0, 2682, 2928, +0, 2689, 2921, +0, 2698, 2912, +0, 2709, 2900, +0, 2724, 2883, +0, 2744, 2860, +0, 2769, 2827, +0, 2800, 2778, +0, 2838, 2704, +0, 2885, 2581, +0, 2941, 2336, +0, 3007, 938, +0, 3082, 0, +0, 3166, 0, +0, 3259, 0, +0, 3359, 0, +0, 3466, 0, +0, 3578, 0, +0, 3695, 0, +0, 2663, 2953, +0, 2664, 2953, +0, 2664, 2952, +0, 2664, 2952, +0, 2665, 2952, +0, 2665, 2951, +0, 2666, 2951, +0, 2667, 2950, +0, 2668, 2949, +0, 2670, 2948, +0, 2672, 2946, +0, 2675, 2943, +0, 2679, 2940, +0, 2684, 2935, +0, 2690, 2928, +0, 2699, 2920, +0, 2711, 2908, +0, 2726, 2891, +0, 2745, 2868, +0, 2770, 2836, +0, 2801, 2788, +0, 2840, 2716, +0, 2886, 2596, +0, 2942, 2362, +0, 3008, 1311, +0, 3083, 0, +0, 3167, 0, +0, 3260, 0, +0, 3360, 0, +0, 3466, 0, +0, 3579, 0, +0, 3695, 0, +0, 2666, 2962, +0, 2666, 2962, +0, 2666, 2962, +0, 2667, 2961, +0, 2667, 2961, +0, 2667, 2961, +0, 2668, 2960, +0, 2669, 2959, +0, 2670, 2958, +0, 2672, 2957, +0, 2674, 2955, +0, 2677, 2952, +0, 2681, 2949, +0, 2686, 2944, +0, 2693, 2938, +0, 2701, 2929, +0, 2713, 2918, +0, 2728, 2902, +0, 2747, 2879, +0, 2772, 2848, +0, 2803, 2801, +0, 2841, 2731, +0, 2888, 2616, +0, 2944, 2395, +0, 3009, 1565, +0, 3084, 0, +0, 3168, 0, +0, 3260, 0, +0, 3360, 0, +0, 3467, 0, +0, 3579, 0, +0, 3695, 0, +0, 2669, 2974, +0, 2669, 2974, +0, 2669, 2973, +0, 2670, 2973, +0, 2670, 2973, +0, 2671, 2972, +0, 2671, 2972, +0, 2672, 2971, +0, 2673, 2970, +0, 2675, 2969, +0, 2677, 2967, +0, 2680, 2964, +0, 2684, 2961, +0, 2689, 2957, +0, 2696, 2950, +0, 2704, 2942, +0, 2716, 2931, +0, 2731, 2915, +0, 2750, 2894, +0, 2774, 2863, +0, 2805, 2818, +0, 2843, 2751, +0, 2890, 2641, +0, 2945, 2435, +0, 3010, 1770, +0, 3085, 0, +0, 3169, 0, +0, 3261, 0, +0, 3361, 0, +0, 3467, 0, +0, 3579, 0, +0, 3696, 0, +0, 2673, 2989, +0, 2673, 2989, +0, 2674, 2989, +0, 2674, 2989, +0, 2674, 2988, +0, 2675, 2988, +0, 2676, 2987, +0, 2676, 2987, +0, 2678, 2986, +0, 2679, 2984, +0, 2681, 2982, +0, 2684, 2980, +0, 2688, 2977, +0, 2693, 2973, +0, 2700, 2967, +0, 2708, 2959, +0, 2720, 2948, +0, 2735, 2933, +0, 2754, 2912, +0, 2778, 2882, +0, 2808, 2840, +0, 2846, 2775, +0, 2893, 2672, +0, 2948, 2483, +0, 3013, 1950, +0, 3087, 0, +0, 3170, 0, +0, 3262, 0, +0, 3362, 0, +0, 3468, 0, +0, 3580, 0, +0, 3696, 0, +0, 2679, 3009, +0, 2679, 3009, +0, 2679, 3009, +0, 2680, 3008, +0, 2680, 3008, +0, 2680, 3008, +0, 2681, 3007, +0, 2682, 3007, +0, 2683, 3006, +0, 2685, 3004, +0, 2687, 3003, +0, 2690, 3000, +0, 2693, 2997, +0, 2698, 2993, +0, 2705, 2987, +0, 2714, 2980, +0, 2725, 2969, +0, 2739, 2955, +0, 2758, 2935, +0, 2782, 2907, +0, 2813, 2867, +0, 2850, 2807, +0, 2896, 2711, +0, 2951, 2541, +0, 3015, 2115, +0, 3089, 0, +0, 3172, 0, +0, 3264, 0, +0, 3363, 0, +0, 3469, 0, +0, 3581, 0, +0, 3697, 0, +1182, 2686, 3034, +1173, 2686, 3034, +1160, 2687, 3034, +1143, 2687, 3034, +1119, 2687, 3033, +1084, 2688, 3033, +1033, 2688, 3033, +955, 2689, 3032, +824, 2691, 3031, +554, 2692, 3030, +0, 2694, 3028, +0, 2697, 3026, +0, 2701, 3023, +0, 2706, 3019, +0, 2712, 3014, +0, 2720, 3007, +0, 2731, 2997, +0, 2746, 2983, +0, 2764, 2965, +0, 2788, 2939, +0, 2818, 2901, +0, 2855, 2846, +0, 2901, 2759, +0, 2955, 2608, +0, 3019, 2271, +0, 3092, 0, +0, 3175, 0, +0, 3266, 0, +0, 3365, 0, +0, 3470, 0, +0, 3582, 0, +0, 3697, 0, +2191, 2696, 3066, +2190, 2696, 3066, +2189, 2696, 3066, +2187, 2697, 3065, +2185, 2697, 3065, +2182, 2698, 3065, +2177, 2698, 3064, +2172, 2699, 3064, +2164, 2700, 3063, +2153, 2702, 3062, +2138, 2704, 3060, +2117, 2706, 3058, +2088, 2710, 3055, +2046, 2715, 3052, +1983, 2721, 3047, +1881, 2729, 3040, +1696, 2740, 3031, +1189, 2754, 3019, +0, 2773, 3001, +0, 2796, 2977, +0, 2825, 2943, +0, 2862, 2893, +0, 2907, 2815, +0, 2960, 2685, +0, 3023, 2419, +0, 3096, 0, +0, 3178, 0, +0, 3269, 0, +0, 3367, 0, +0, 3472, 0, +0, 3583, 0, +0, 3699, 0, +2548, 2709, 3105, +2548, 2709, 3105, +2547, 2709, 3105, +2546, 2709, 3105, +2545, 2710, 3104, +2544, 2710, 3104, +2542, 2711, 3104, +2539, 2712, 3103, +2536, 2713, 3102, +2531, 2714, 3101, +2524, 2716, 3100, +2516, 2719, 3098, +2504, 2722, 3095, +2487, 2727, 3092, +2464, 2733, 3088, +2432, 2741, 3082, +2384, 2752, 3073, +2311, 2766, 3062, +2191, 2783, 3046, +1956, 2806, 3025, +876, 2835, 2994, +0, 2871, 2949, +0, 2915, 2881, +0, 2967, 2771, +0, 3030, 2564, +0, 3101, 1888, +0, 3182, 0, +0, 3272, 0, +0, 3370, 0, +0, 3474, 0, +0, 3585, 0, +0, 3700, 0, +2796, 2725, 3153, +2796, 2725, 3152, +2796, 2725, 3152, +2795, 2726, 3152, +2795, 2726, 3152, +2794, 2726, 3152, +2793, 2727, 3151, +2791, 2728, 3151, +2789, 2729, 3150, +2787, 2730, 3149, +2783, 2732, 3148, +2778, 2735, 3146, +2771, 2738, 3144, +2762, 2743, 3141, +2750, 2749, 3137, +2733, 2756, 3131, +2709, 2767, 3124, +2675, 2780, 3114, +2625, 2797, 3100, +2548, 2819, 3081, +2419, 2847, 3054, +2157, 2882, 3015, +0, 2925, 2957, +0, 2977, 2865, +0, 3038, 2704, +0, 3108, 2323, +0, 3188, 0, +0, 3277, 0, +0, 3374, 0, +0, 3478, 0, +0, 3587, 0, +0, 3702, 0, +2999, 2746, 3209, +2999, 2746, 3209, +2999, 2746, 3209, +2999, 2747, 3209, +2998, 2747, 3209, +2998, 2747, 3209, +2997, 2748, 3208, +2996, 2749, 3208, +2995, 2750, 3207, +2993, 2751, 3206, +2991, 2753, 3205, +2988, 2755, 3204, +2984, 2759, 3202, +2978, 2763, 3199, +2970, 2769, 3196, +2960, 2776, 3191, +2945, 2786, 3184, +2925, 2799, 3175, +2897, 2815, 3163, +2857, 2837, 3147, +2796, 2864, 3123, +2699, 2897, 3090, +2527, 2939, 3041, +2089, 2989, 2967, +0, 3048, 2843, +0, 3118, 2597, +0, 3196, 1111, +0, 3283, 0, +0, 3379, 0, +0, 3482, 0, +0, 3590, 0, +0, 3704, 0, +3178, 2773, 3276, +3178, 2773, 3275, +3178, 2773, 3275, +3178, 2773, 3275, +3177, 2774, 3275, +3177, 2774, 3275, +3177, 2775, 3275, +3176, 2775, 3274, +3175, 2776, 3274, +3174, 2778, 3273, +3172, 2779, 3272, +3170, 2782, 3271, +3167, 2785, 3269, +3164, 2789, 3267, +3159, 2794, 3264, +3152, 2801, 3260, +3142, 2811, 3254, +3130, 2823, 3246, +3112, 2838, 3236, +3087, 2859, 3222, +3051, 2884, 3202, +2999, 2917, 3174, +2918, 2956, 3134, +2780, 3005, 3074, +2488, 3062, 2980, +0, 3130, 2811, +0, 3206, 2395, +0, 3292, 0, +0, 3386, 0, +0, 3487, 0, +0, 3595, 0, +0, 3708, 0, +3342, 2806, 3351, +3342, 2806, 3351, +3342, 2807, 3351, +3342, 2807, 3351, +3342, 2807, 3351, +3341, 2807, 3351, +3341, 2808, 3350, +3341, 2809, 3350, +3340, 2810, 3350, +3339, 2811, 3349, +3338, 2812, 3348, +3337, 2814, 3347, +3335, 2817, 3346, +3332, 2821, 3344, +3329, 2826, 3341, +3324, 2833, 3338, +3318, 2841, 3333, +3309, 2853, 3327, +3297, 2867, 3318, +3281, 2886, 3306, +3258, 2911, 3290, +3225, 2941, 3267, +3177, 2979, 3235, +3105, 3025, 3187, +2985, 3080, 3115, +2750, 3145, 2997, +1687, 3219, 2766, +0, 3303, 1775, +0, 3395, 0, +0, 3494, 0, +0, 3600, 0, +0, 3712, 0, +3497, 2847, 3436, +3497, 2848, 3436, +3497, 2848, 3436, +3497, 2848, 3436, +3496, 2848, 3436, +3496, 2849, 3436, +3496, 2849, 3436, +3496, 2850, 3435, +3495, 2850, 3435, +3495, 2852, 3434, +3494, 2853, 3434, +3493, 2855, 3433, +3492, 2858, 3432, +3490, 2861, 3430, +3487, 2866, 3428, +3484, 2872, 3425, +3479, 2880, 3421, +3473, 2890, 3416, +3465, 2904, 3409, +3454, 2921, 3399, +3438, 2944, 3386, +3417, 2972, 3368, +3386, 3008, 3342, +3341, 3051, 3305, +3274, 3103, 3250, +3165, 3165, 3165, +2960, 3236, 3019, +2308, 3317, 2696, +0, 3406, 0, +0, 3504, 0, +0, 3608, 0, +0, 3718, 0, +3645, 2897, 3529, +3645, 2897, 3529, +3645, 2898, 3529, +3645, 2898, 3529, +3645, 2898, 3529, +3645, 2898, 3529, +3644, 2899, 3529, +3644, 2899, 3529, +3644, 2900, 3528, +3644, 2901, 3528, +3643, 2902, 3527, +3642, 2904, 3527, +3641, 2906, 3526, +3640, 2909, 3524, +3638, 2914, 3523, +3636, 2919, 3520, +3633, 2926, 3517, +3628, 2936, 3513, +3622, 2948, 3507, +3614, 2964, 3500, +3604, 2984, 3489, +3589, 3011, 3474, +3568, 3043, 3454, +3539, 3084, 3426, +3496, 3132, 3384, +3432, 3191, 3322, +3330, 3258, 3224, +3143, 3335, 3046, +2623, 3421, 2582, +0, 3516, 0, +0, 3618, 0, +0, 3726, 0, +3789, 2956, 3630, +3789, 2956, 3630, +3789, 2957, 3630, +3789, 2957, 3630, +3789, 2957, 3630, +3789, 2957, 3630, +3788, 2958, 3630, +3788, 2958, 3630, +3788, 2959, 3629, +3788, 2960, 3629, +3787, 2961, 3629, +3787, 2962, 3628, +3786, 2964, 3627, +3785, 2967, 3626, +3784, 2971, 3625, +3782, 2976, 3623, +3780, 2982, 3620, +3777, 2990, 3617, +3772, 3001, 3613, +3767, 3015, 3606, +3759, 3034, 3598, +3748, 3057, 3587, +3734, 3087, 3571, +3714, 3124, 3549, +3685, 3169, 3518, +3644, 3222, 3473, +3583, 3286, 3404, +3485, 3359, 3292, +3309, 3441, 3081, +2855, 3532, 2365, +0, 3630, 0, +0, 3736, 0, +3929, 3025, 3737, +3929, 3025, 3737, +3929, 3025, 3737, +3929, 3025, 3737, +3929, 3026, 3737, +3929, 3026, 3737, +3929, 3026, 3737, +3929, 3026, 3737, +3929, 3027, 3737, +3929, 3028, 3736, +3928, 3029, 3736, +3928, 3030, 3736, +3927, 3032, 3735, +3927, 3034, 3734, +3926, 3037, 3733, +3925, 3042, 3732, +3923, 3047, 3730, +3921, 3054, 3727, +3918, 3064, 3723, +3913, 3076, 3719, +3908, 3092, 3712, +3900, 3113, 3703, +3890, 3139, 3691, +3876, 3172, 3674, +3856, 3213, 3651, +3828, 3262, 3618, +3788, 3320, 3569, +3728, 3388, 3494, +3634, 3466, 3370, +3465, 3552, 3123, +3050, 3647, 1588, +0, 3749, 0, +4068, 3103, 3850, +4068, 3103, 3850, +4068, 3103, 3850, +4068, 3103, 3850, +4068, 3104, 3850, +4068, 3104, 3850, +4068, 3104, 3850, +4068, 3104, 3849, +4067, 3105, 3849, +4067, 3105, 3849, +4067, 3106, 3849, +4067, 3107, 3849, +4066, 3109, 3848, +4066, 3111, 3847, +4065, 3114, 3847, +4064, 3117, 3845, +4063, 3122, 3844, +4061, 3128, 3842, +4059, 3136, 3839, +4056, 3147, 3835, +4052, 3160, 3830, +4046, 3178, 3823, +4039, 3201, 3814, +4029, 3230, 3801, +4015, 3266, 3784, +3995, 3310, 3759, +3968, 3363, 3724, +3929, 3425, 3672, +3870, 3497, 3592, +3778, 3578, 3457, +3615, 3668, 3174, +3224, 3766, 0, +4095, 3190, 3967, +4095, 3190, 3967, +4095, 3190, 3967, +4095, 3190, 3967, +4095, 3191, 3967, +4095, 3191, 3967, +4095, 3191, 3967, +4095, 3191, 3966, +4095, 3192, 3966, +4095, 3192, 3966, +4095, 3193, 3966, +4095, 3194, 3966, +4095, 3195, 3965, +4095, 3197, 3965, +4095, 3199, 3964, +4095, 3202, 3963, +4095, 3206, 3962, +4095, 3211, 3961, +4095, 3217, 3958, +4095, 3226, 3956, +4095, 3238, 3952, +4095, 3253, 3946, +4095, 3273, 3939, +4095, 3297, 3930, +4095, 3328, 3917, +4095, 3367, 3898, +4095, 3414, 3873, +4095, 3470, 3836, +4067, 3536, 3782, +4009, 3611, 3697, +3919, 3695, 3552, +3759, 3788, 3235, +4095, 3285, 4087, +4095, 3285, 4087, +4095, 3286, 4087, +4095, 3286, 4087, +4095, 3286, 4087, +4095, 3286, 4087, +4095, 3286, 4087, +4095, 3286, 4087, +4095, 3287, 4087, +4095, 3287, 4087, +4095, 3288, 4087, +4095, 3288, 4086, +4095, 3289, 4086, +4095, 3291, 4086, +4095, 3292, 4085, +4095, 3295, 4084, +4095, 3298, 4084, +4095, 3302, 4082, +4095, 3308, 4081, +4095, 3315, 4079, +4095, 3325, 4076, +4095, 3337, 4072, +4095, 3353, 4066, +4095, 3374, 4059, +4095, 3401, 4049, +4095, 3434, 4036, +4095, 3475, 4017, +4095, 3524, 3990, +4095, 3583, 3952, +4095, 3651, 3896, +4095, 3729, 3808, +4057, 3815, 3655, +0, 2788, 3057, +0, 2789, 3057, +0, 2789, 3057, +0, 2789, 3057, +0, 2789, 3057, +0, 2790, 3056, +0, 2790, 3056, +0, 2791, 3055, +0, 2792, 3054, +0, 2793, 3053, +0, 2795, 3052, +0, 2797, 3050, +0, 2800, 3047, +0, 2804, 3043, +0, 2809, 3038, +0, 2816, 3031, +0, 2825, 3022, +0, 2837, 3009, +0, 2852, 2992, +0, 2872, 2967, +0, 2897, 2932, +0, 2928, 2880, +0, 2967, 2801, +0, 3014, 2666, +0, 3071, 2384, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2788, 3058, +0, 2789, 3058, +0, 2789, 3057, +0, 2789, 3057, +0, 2789, 3057, +0, 2790, 3057, +0, 2790, 3056, +0, 2791, 3055, +0, 2792, 3055, +0, 2793, 3053, +0, 2795, 3052, +0, 2797, 3050, +0, 2800, 3047, +0, 2804, 3043, +0, 2809, 3038, +0, 2816, 3032, +0, 2825, 3022, +0, 2837, 3010, +0, 2852, 2992, +0, 2872, 2967, +0, 2897, 2932, +0, 2928, 2881, +0, 2967, 2801, +0, 3014, 2666, +0, 3071, 2385, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2788, 3058, +0, 2789, 3058, +0, 2789, 3058, +0, 2789, 3057, +0, 2789, 3057, +0, 2790, 3057, +0, 2790, 3056, +0, 2791, 3056, +0, 2792, 3055, +0, 2793, 3054, +0, 2795, 3052, +0, 2797, 3050, +0, 2800, 3047, +0, 2804, 3044, +0, 2809, 3039, +0, 2816, 3032, +0, 2825, 3023, +0, 2837, 3010, +0, 2852, 2992, +0, 2872, 2968, +0, 2897, 2933, +0, 2928, 2881, +0, 2967, 2801, +0, 3014, 2667, +0, 3071, 2386, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2789, 3058, +0, 2789, 3058, +0, 2789, 3058, +0, 2789, 3058, +0, 2789, 3057, +0, 2790, 3057, +0, 2790, 3057, +0, 2791, 3056, +0, 2792, 3055, +0, 2793, 3054, +0, 2795, 3052, +0, 2797, 3050, +0, 2800, 3048, +0, 2804, 3044, +0, 2809, 3039, +0, 2816, 3032, +0, 2825, 3023, +0, 2837, 3010, +0, 2852, 2993, +0, 2872, 2968, +0, 2897, 2933, +0, 2928, 2881, +0, 2967, 2802, +0, 3014, 2667, +0, 3071, 2387, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2789, 3059, +0, 2789, 3058, +0, 2789, 3058, +0, 2789, 3058, +0, 2789, 3058, +0, 2790, 3058, +0, 2790, 3057, +0, 2791, 3056, +0, 2792, 3056, +0, 2793, 3054, +0, 2795, 3053, +0, 2797, 3051, +0, 2800, 3048, +0, 2804, 3044, +0, 2809, 3039, +0, 2816, 3033, +0, 2825, 3023, +0, 2837, 3011, +0, 2852, 2993, +0, 2872, 2969, +0, 2897, 2934, +0, 2928, 2882, +0, 2967, 2802, +0, 3014, 2668, +0, 3071, 2389, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2789, 3059, +0, 2789, 3059, +0, 2789, 3059, +0, 2789, 3059, +0, 2790, 3058, +0, 2790, 3058, +0, 2791, 3058, +0, 2791, 3057, +0, 2792, 3056, +0, 2793, 3055, +0, 2795, 3053, +0, 2797, 3051, +0, 2800, 3049, +0, 2804, 3045, +0, 2809, 3040, +0, 2816, 3033, +0, 2825, 3024, +0, 2837, 3011, +0, 2852, 2994, +0, 2872, 2969, +0, 2897, 2934, +0, 2928, 2883, +0, 2967, 2803, +0, 3014, 2670, +0, 3071, 2391, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2789, 3060, +0, 2789, 3060, +0, 2789, 3060, +0, 2789, 3059, +0, 2790, 3059, +0, 2790, 3059, +0, 2791, 3058, +0, 2791, 3058, +0, 2792, 3057, +0, 2794, 3056, +0, 2795, 3054, +0, 2797, 3052, +0, 2800, 3049, +0, 2804, 3046, +0, 2810, 3041, +0, 2816, 3034, +0, 2825, 3025, +0, 2837, 3012, +0, 2852, 2995, +0, 2872, 2970, +0, 2897, 2935, +0, 2928, 2884, +0, 2967, 2805, +0, 3015, 2671, +0, 3071, 2394, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3490, 0, +0, 3597, 0, +0, 3710, 0, +0, 2789, 3061, +0, 2789, 3061, +0, 2789, 3061, +0, 2790, 3060, +0, 2790, 3060, +0, 2790, 3060, +0, 2791, 3059, +0, 2792, 3059, +0, 2793, 3058, +0, 2794, 3057, +0, 2795, 3055, +0, 2798, 3053, +0, 2801, 3050, +0, 2805, 3047, +0, 2810, 3042, +0, 2817, 3035, +0, 2826, 3026, +0, 2837, 3013, +0, 2853, 2996, +0, 2872, 2971, +0, 2897, 2936, +0, 2929, 2885, +0, 2967, 2806, +0, 3015, 2673, +0, 3071, 2398, +0, 3137, 0, +0, 3212, 0, +0, 3297, 0, +0, 3390, 0, +0, 3491, 0, +0, 3597, 0, +0, 3710, 0, +0, 2790, 3062, +0, 2790, 3062, +0, 2790, 3062, +0, 2790, 3062, +0, 2790, 3061, +0, 2791, 3061, +0, 2791, 3060, +0, 2792, 3060, +0, 2793, 3059, +0, 2794, 3058, +0, 2796, 3056, +0, 2798, 3054, +0, 2801, 3052, +0, 2805, 3048, +0, 2810, 3043, +0, 2817, 3036, +0, 2826, 3027, +0, 2838, 3014, +0, 2853, 2997, +0, 2872, 2973, +0, 2897, 2938, +0, 2929, 2887, +0, 2968, 2809, +0, 3015, 2676, +0, 3071, 2404, +0, 3137, 0, +0, 3213, 0, +0, 3297, 0, +0, 3390, 0, +0, 3491, 0, +0, 3598, 0, +0, 3710, 0, +0, 2790, 3064, +0, 2790, 3064, +0, 2790, 3063, +0, 2790, 3063, +0, 2791, 3063, +0, 2791, 3063, +0, 2792, 3062, +0, 2792, 3062, +0, 2793, 3061, +0, 2795, 3060, +0, 2796, 3058, +0, 2798, 3056, +0, 2801, 3053, +0, 2805, 3050, +0, 2810, 3045, +0, 2817, 3038, +0, 2826, 3029, +0, 2838, 3016, +0, 2853, 2999, +0, 2873, 2975, +0, 2898, 2940, +0, 2929, 2890, +0, 2968, 2811, +0, 3015, 2680, +0, 3072, 2411, +0, 3137, 0, +0, 3213, 0, +0, 3297, 0, +0, 3390, 0, +0, 3491, 0, +0, 3598, 0, +0, 3710, 0, +0, 2791, 3066, +0, 2791, 3066, +0, 2791, 3066, +0, 2791, 3065, +0, 2791, 3065, +0, 2792, 3065, +0, 2792, 3064, +0, 2793, 3064, +0, 2794, 3063, +0, 2795, 3062, +0, 2797, 3060, +0, 2799, 3058, +0, 2802, 3056, +0, 2806, 3052, +0, 2811, 3047, +0, 2818, 3040, +0, 2827, 3031, +0, 2838, 3019, +0, 2854, 3002, +0, 2873, 2978, +0, 2898, 2943, +0, 2930, 2893, +0, 2968, 2815, +0, 3016, 2685, +0, 3072, 2420, +0, 3138, 0, +0, 3213, 0, +0, 3297, 0, +0, 3390, 0, +0, 3491, 0, +0, 3598, 0, +0, 3710, 0, +0, 2791, 3069, +0, 2791, 3069, +0, 2792, 3069, +0, 2792, 3068, +0, 2792, 3068, +0, 2792, 3068, +0, 2793, 3067, +0, 2794, 3067, +0, 2795, 3066, +0, 2796, 3065, +0, 2798, 3063, +0, 2800, 3061, +0, 2803, 3059, +0, 2807, 3055, +0, 2812, 3050, +0, 2819, 3043, +0, 2827, 3034, +0, 2839, 3022, +0, 2854, 3005, +0, 2874, 2981, +0, 2899, 2947, +0, 2930, 2897, +0, 2969, 2821, +0, 3016, 2692, +0, 3072, 2432, +0, 3138, 0, +0, 3213, 0, +0, 3298, 0, +0, 3391, 0, +0, 3491, 0, +0, 3598, 0, +0, 3710, 0, +0, 2792, 3073, +0, 2792, 3073, +0, 2793, 3073, +0, 2793, 3072, +0, 2793, 3072, +0, 2793, 3072, +0, 2794, 3071, +0, 2795, 3071, +0, 2796, 3070, +0, 2797, 3069, +0, 2799, 3067, +0, 2801, 3065, +0, 2804, 3063, +0, 2808, 3059, +0, 2813, 3054, +0, 2819, 3048, +0, 2828, 3039, +0, 2840, 3026, +0, 2855, 3010, +0, 2875, 2986, +0, 2900, 2952, +0, 2931, 2903, +0, 2970, 2827, +0, 3017, 2701, +0, 3073, 2448, +0, 3138, 0, +0, 3214, 0, +0, 3298, 0, +0, 3391, 0, +0, 3491, 0, +0, 3598, 0, +0, 3710, 0, +0, 2794, 3078, +0, 2794, 3078, +0, 2794, 3078, +0, 2794, 3078, +0, 2794, 3077, +0, 2795, 3077, +0, 2795, 3077, +0, 2796, 3076, +0, 2797, 3075, +0, 2798, 3074, +0, 2800, 3073, +0, 2802, 3071, +0, 2805, 3068, +0, 2809, 3064, +0, 2814, 3060, +0, 2821, 3053, +0, 2830, 3044, +0, 2841, 3032, +0, 2856, 3016, +0, 2876, 2992, +0, 2901, 2959, +0, 2932, 2911, +0, 2970, 2836, +0, 3017, 2713, +0, 3074, 2468, +0, 3139, 1070, +0, 3214, 0, +0, 3298, 0, +0, 3391, 0, +0, 3491, 0, +0, 3598, 0, +0, 3710, 0, +0, 2795, 3085, +0, 2796, 3085, +0, 2796, 3085, +0, 2796, 3085, +0, 2796, 3084, +0, 2797, 3084, +0, 2797, 3084, +0, 2798, 3083, +0, 2799, 3082, +0, 2800, 3081, +0, 2802, 3080, +0, 2804, 3078, +0, 2807, 3075, +0, 2811, 3072, +0, 2816, 3067, +0, 2822, 3060, +0, 2831, 3052, +0, 2843, 3040, +0, 2858, 3023, +0, 2877, 3001, +0, 2902, 2968, +0, 2933, 2920, +0, 2972, 2848, +0, 3019, 2728, +0, 3075, 2494, +0, 3140, 1443, +0, 3215, 0, +0, 3299, 0, +0, 3392, 0, +0, 3492, 0, +0, 3599, 0, +0, 3711, 0, +0, 2798, 3094, +0, 2798, 3094, +0, 2798, 3094, +0, 2798, 3094, +0, 2799, 3093, +0, 2799, 3093, +0, 2800, 3093, +0, 2800, 3092, +0, 2801, 3091, +0, 2802, 3090, +0, 2804, 3089, +0, 2806, 3087, +0, 2809, 3084, +0, 2813, 3081, +0, 2818, 3076, +0, 2825, 3070, +0, 2834, 3062, +0, 2845, 3050, +0, 2860, 3034, +0, 2879, 3011, +0, 2904, 2980, +0, 2935, 2933, +0, 2973, 2863, +0, 3020, 2748, +0, 3076, 2527, +0, 3141, 1697, +0, 3216, 0, +0, 3300, 0, +0, 3392, 0, +0, 3492, 0, +0, 3599, 0, +0, 3711, 0, +0, 2801, 3106, +0, 2801, 3106, +0, 2801, 3106, +0, 2802, 3106, +0, 2802, 3105, +0, 2802, 3105, +0, 2803, 3105, +0, 2803, 3104, +0, 2804, 3103, +0, 2806, 3102, +0, 2807, 3101, +0, 2809, 3099, +0, 2812, 3096, +0, 2816, 3093, +0, 2821, 3089, +0, 2828, 3083, +0, 2837, 3074, +0, 2848, 3063, +0, 2863, 3047, +0, 2882, 3026, +0, 2907, 2995, +0, 2937, 2950, +0, 2976, 2883, +0, 3022, 2773, +0, 3078, 2567, +0, 3143, 1902, +0, 3217, 0, +0, 3301, 0, +0, 3393, 0, +0, 3493, 0, +0, 3599, 0, +0, 3711, 0, +0, 2805, 3121, +0, 2805, 3121, +0, 2806, 3121, +0, 2806, 3121, +0, 2806, 3121, +0, 2806, 3120, +0, 2807, 3120, +0, 2808, 3119, +0, 2809, 3119, +0, 2810, 3118, +0, 2811, 3116, +0, 2814, 3115, +0, 2816, 3112, +0, 2820, 3109, +0, 2825, 3105, +0, 2832, 3099, +0, 2840, 3091, +0, 2852, 3080, +0, 2867, 3065, +0, 2886, 3044, +0, 2910, 3014, +0, 2940, 2972, +0, 2978, 2908, +0, 3025, 2805, +0, 3080, 2615, +0, 3145, 2083, +0, 3219, 0, +0, 3302, 0, +0, 3394, 0, +0, 3494, 0, +0, 3600, 0, +0, 3712, 0, +0, 2811, 3141, +0, 2811, 3141, +0, 2811, 3141, +0, 2811, 3141, +0, 2812, 3141, +0, 2812, 3140, +0, 2813, 3140, +0, 2813, 3139, +0, 2814, 3139, +0, 2815, 3138, +0, 2817, 3136, +0, 2819, 3135, +0, 2822, 3132, +0, 2826, 3129, +0, 2831, 3125, +0, 2837, 3120, +0, 2846, 3112, +0, 2857, 3101, +0, 2872, 3087, +0, 2890, 3067, +0, 2914, 3039, +0, 2945, 2999, +0, 2982, 2939, +0, 3028, 2843, +0, 3083, 2673, +0, 3147, 2248, +0, 3221, 0, +0, 3304, 0, +0, 3396, 0, +0, 3495, 0, +0, 3601, 0, +0, 3713, 0, +1321, 2818, 3166, +1314, 2818, 3166, +1305, 2819, 3166, +1292, 2819, 3166, +1275, 2819, 3166, +1251, 2819, 3165, +1216, 2820, 3165, +1165, 2821, 3165, +1087, 2821, 3164, +956, 2823, 3163, +686, 2824, 3162, +0, 2826, 3160, +0, 2829, 3158, +0, 2833, 3155, +0, 2838, 3151, +0, 2844, 3146, +0, 2853, 3139, +0, 2864, 3129, +0, 2878, 3115, +0, 2897, 3097, +0, 2920, 3071, +0, 2950, 3033, +0, 2987, 2978, +0, 3033, 2891, +0, 3087, 2740, +0, 3151, 2403, +0, 3224, 0, +0, 3307, 0, +0, 3398, 0, +0, 3497, 0, +0, 3603, 0, +0, 3714, 0, +2324, 2828, 3198, +2323, 2828, 3198, +2322, 2828, 3198, +2321, 2828, 3198, +2319, 2829, 3197, +2317, 2829, 3197, +2314, 2830, 3197, +2309, 2830, 3196, +2304, 2831, 3196, +2296, 2832, 3195, +2285, 2834, 3194, +2270, 2836, 3192, +2249, 2839, 3190, +2220, 2842, 3188, +2178, 2847, 3184, +2115, 2853, 3179, +2013, 2862, 3172, +1828, 2872, 3163, +1321, 2887, 3151, +0, 2905, 3134, +0, 2928, 3109, +0, 2957, 3075, +0, 2994, 3025, +0, 3039, 2947, +0, 3092, 2817, +0, 3156, 2552, +0, 3228, 0, +0, 3310, 0, +0, 3401, 0, +0, 3499, 0, +0, 3604, 0, +0, 3715, 0, +2680, 2841, 3237, +2680, 2841, 3237, +2680, 2841, 3237, +2679, 2841, 3237, +2678, 2841, 3237, +2677, 2842, 3236, +2676, 2842, 3236, +2674, 2843, 3236, +2671, 2844, 3235, +2668, 2845, 3234, +2663, 2846, 3233, +2657, 2848, 3232, +2648, 2851, 3230, +2636, 2854, 3228, +2620, 2859, 3224, +2597, 2865, 3220, +2564, 2873, 3214, +2516, 2884, 3205, +2444, 2898, 3194, +2324, 2915, 3178, +2088, 2938, 3157, +1008, 2967, 3126, +0, 3003, 3081, +0, 3047, 3013, +0, 3100, 2903, +0, 3162, 2696, +0, 3233, 2020, +0, 3315, 0, +0, 3404, 0, +0, 3502, 0, +0, 3607, 0, +0, 3717, 0, +2929, 2857, 3285, +2929, 2857, 3285, +2928, 2857, 3285, +2928, 2858, 3284, +2927, 2858, 3284, +2927, 2858, 3284, +2926, 2859, 3284, +2925, 2859, 3283, +2923, 2860, 3283, +2921, 2861, 3282, +2919, 2863, 3281, +2915, 2864, 3280, +2910, 2867, 3278, +2903, 2870, 3276, +2894, 2875, 3273, +2882, 2881, 3269, +2865, 2889, 3264, +2841, 2899, 3256, +2807, 2912, 3246, +2757, 2929, 3232, +2680, 2952, 3213, +2551, 2980, 3186, +2289, 3014, 3147, +0, 3057, 3089, +0, 3109, 2997, +0, 3170, 2837, +0, 3240, 2456, +0, 3320, 0, +0, 3409, 0, +0, 3506, 0, +0, 3610, 0, +0, 3719, 0, +3132, 2878, 3341, +3132, 2878, 3341, +3131, 2878, 3341, +3131, 2879, 3341, +3131, 2879, 3341, +3130, 2879, 3341, +3130, 2880, 3341, +3129, 2880, 3340, +3128, 2881, 3340, +3127, 2882, 3339, +3125, 2883, 3338, +3123, 2885, 3337, +3120, 2888, 3336, +3116, 2891, 3334, +3110, 2895, 3331, +3102, 2901, 3328, +3092, 2908, 3323, +3077, 2918, 3316, +3057, 2931, 3307, +3029, 2947, 3295, +2989, 2969, 3279, +2928, 2996, 3255, +2832, 3029, 3222, +2659, 3071, 3173, +2222, 3121, 3099, +0, 3181, 2975, +0, 3250, 2729, +0, 3328, 1243, +0, 3415, 0, +0, 3511, 0, +0, 3614, 0, +0, 3723, 0, +3310, 2905, 3408, +3310, 2905, 3408, +3310, 2905, 3408, +3310, 2905, 3407, +3310, 2906, 3407, +3309, 2906, 3407, +3309, 2906, 3407, +3309, 2907, 3407, +3308, 2907, 3406, +3307, 2908, 3406, +3306, 2910, 3405, +3304, 2911, 3404, +3302, 2914, 3403, +3300, 2917, 3401, +3296, 2921, 3399, +3291, 2926, 3396, +3284, 2933, 3392, +3274, 2943, 3386, +3262, 2955, 3378, +3244, 2970, 3368, +3219, 2991, 3354, +3183, 3016, 3334, +3131, 3049, 3306, +3050, 3089, 3266, +2912, 3137, 3207, +2620, 3195, 3112, +0, 3262, 2944, +0, 3338, 2528, +0, 3424, 0, +0, 3518, 0, +0, 3619, 0, +0, 3727, 0, +3474, 2938, 3483, +3474, 2938, 3483, +3474, 2939, 3483, +3474, 2939, 3483, +3474, 2939, 3483, +3474, 2939, 3483, +3474, 2940, 3483, +3473, 2940, 3483, +3473, 2941, 3482, +3472, 2942, 3482, +3471, 2943, 3481, +3470, 2944, 3480, +3469, 2947, 3479, +3467, 2949, 3478, +3464, 2953, 3476, +3461, 2958, 3473, +3456, 2965, 3470, +3450, 2973, 3465, +3441, 2985, 3459, +3429, 3000, 3450, +3413, 3019, 3438, +3390, 3043, 3422, +3357, 3073, 3399, +3310, 3111, 3367, +3237, 3157, 3320, +3117, 3213, 3248, +2883, 3277, 3129, +1820, 3351, 2898, +0, 3435, 1907, +0, 3527, 0, +0, 3626, 0, +0, 3732, 0, +3629, 2980, 3568, +3629, 2980, 3568, +3629, 2980, 3568, +3629, 2980, 3568, +3629, 2980, 3568, +3629, 2980, 3568, +3628, 2981, 3568, +3628, 2981, 3568, +3628, 2982, 3567, +3627, 2983, 3567, +3627, 2984, 3566, +3626, 2985, 3566, +3625, 2987, 3565, +3624, 2990, 3564, +3622, 2993, 3562, +3619, 2998, 3560, +3616, 3004, 3557, +3612, 3012, 3553, +3605, 3022, 3548, +3597, 3036, 3541, +3586, 3053, 3531, +3570, 3076, 3518, +3549, 3104, 3500, +3518, 3140, 3474, +3474, 3183, 3437, +3406, 3235, 3382, +3297, 3297, 3297, +3092, 3368, 3151, +2441, 3449, 2828, +0, 3538, 0, +0, 3636, 0, +0, 3740, 0, +3777, 3029, 3662, +3777, 3029, 3662, +3777, 3030, 3662, +3777, 3030, 3661, +3777, 3030, 3661, +3777, 3030, 3661, +3777, 3030, 3661, +3777, 3031, 3661, +3776, 3031, 3661, +3776, 3032, 3660, +3776, 3033, 3660, +3775, 3034, 3660, +3774, 3036, 3659, +3773, 3038, 3658, +3772, 3042, 3657, +3770, 3046, 3655, +3768, 3051, 3652, +3765, 3058, 3649, +3760, 3068, 3645, +3754, 3080, 3639, +3747, 3096, 3632, +3736, 3117, 3621, +3721, 3143, 3606, +3700, 3175, 3586, +3671, 3216, 3558, +3628, 3265, 3516, +3564, 3323, 3455, +3462, 3390, 3356, +3275, 3467, 3178, +2755, 3554, 2715, +0, 3648, 0, +0, 3750, 0, +3921, 3088, 3762, +3921, 3088, 3762, +3921, 3089, 3762, +3921, 3089, 3762, +3921, 3089, 3762, +3921, 3089, 3762, +3921, 3089, 3762, +3921, 3090, 3762, +3920, 3090, 3762, +3920, 3091, 3761, +3920, 3092, 3761, +3919, 3093, 3761, +3919, 3094, 3760, +3918, 3096, 3759, +3917, 3099, 3758, +3916, 3103, 3757, +3914, 3108, 3755, +3912, 3114, 3753, +3909, 3122, 3749, +3905, 3133, 3745, +3899, 3148, 3738, +3891, 3166, 3730, +3881, 3189, 3719, +3866, 3219, 3703, +3846, 3256, 3681, +3817, 3301, 3650, +3776, 3355, 3605, +3715, 3418, 3536, +3617, 3491, 3424, +3441, 3573, 3213, +2987, 3664, 2497, +0, 3762, 0, +4062, 3157, 3869, +4062, 3157, 3869, +4062, 3157, 3869, +4062, 3157, 3869, +4062, 3157, 3869, +4061, 3158, 3869, +4061, 3158, 3869, +4061, 3158, 3869, +4061, 3159, 3869, +4061, 3159, 3869, +4061, 3160, 3869, +4060, 3161, 3868, +4060, 3162, 3868, +4060, 3164, 3867, +4059, 3166, 3866, +4058, 3169, 3865, +4057, 3174, 3864, +4055, 3179, 3862, +4053, 3186, 3859, +4050, 3196, 3856, +4045, 3208, 3851, +4040, 3224, 3844, +4032, 3245, 3835, +4022, 3271, 3823, +4008, 3304, 3806, +3988, 3345, 3783, +3960, 3394, 3750, +3920, 3452, 3701, +3860, 3520, 3626, +3766, 3598, 3502, +3598, 3684, 3255, +3182, 3779, 1720, +4095, 3235, 3982, +4095, 3235, 3982, +4095, 3235, 3982, +4095, 3235, 3982, +4095, 3235, 3982, +4095, 3236, 3982, +4095, 3236, 3982, +4095, 3236, 3982, +4095, 3236, 3982, +4095, 3237, 3981, +4095, 3238, 3981, +4095, 3238, 3981, +4095, 3239, 3981, +4095, 3241, 3980, +4095, 3243, 3979, +4095, 3246, 3979, +4095, 3249, 3978, +4095, 3254, 3976, +4095, 3260, 3974, +4095, 3268, 3971, +4095, 3279, 3967, +4095, 3293, 3962, +4095, 3310, 3956, +4095, 3333, 3946, +4095, 3362, 3934, +4095, 3398, 3916, +4095, 3442, 3891, +4095, 3495, 3856, +4061, 3557, 3804, +4002, 3629, 3724, +3910, 3710, 3589, +3747, 3800, 3306, +4095, 3322, 4095, +4095, 3322, 4095, +4095, 3322, 4095, +4095, 3322, 4095, +4095, 3322, 4095, +4095, 3323, 4095, +4095, 3323, 4095, +4095, 3323, 4095, +4095, 3323, 4095, +4095, 3324, 4095, +4095, 3324, 4095, +4095, 3325, 4095, +4095, 3326, 4095, +4095, 3327, 4095, +4095, 3329, 4095, +4095, 3331, 4095, +4095, 3334, 4095, +4095, 3338, 4094, +4095, 3343, 4093, +4095, 3350, 4090, +4095, 3358, 4088, +4095, 3370, 4084, +4095, 3385, 4079, +4095, 3405, 4071, +4095, 3429, 4062, +4095, 3461, 4049, +4095, 3499, 4030, +4095, 3546, 4005, +4095, 3602, 3968, +4095, 3668, 3914, +4095, 3743, 3829, +4051, 3827, 3684, +0, 2920, 3190, +0, 2920, 3189, +0, 2921, 3189, +0, 2921, 3189, +0, 2921, 3189, +0, 2921, 3189, +0, 2922, 3188, +0, 2922, 3188, +0, 2923, 3187, +0, 2924, 3186, +0, 2925, 3185, +0, 2927, 3184, +0, 2929, 3182, +0, 2932, 3179, +0, 2936, 3175, +0, 2941, 3170, +0, 2948, 3163, +0, 2957, 3154, +0, 2969, 3141, +0, 2984, 3124, +0, 3004, 3099, +0, 3029, 3064, +0, 3060, 3012, +0, 3099, 2932, +0, 3146, 2798, +0, 3203, 2515, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3622, 0, +0, 3729, 0, +0, 2920, 3190, +0, 2920, 3190, +0, 2921, 3189, +0, 2921, 3189, +0, 2921, 3189, +0, 2921, 3189, +0, 2922, 3189, +0, 2922, 3188, +0, 2923, 3187, +0, 2924, 3187, +0, 2925, 3185, +0, 2927, 3184, +0, 2929, 3182, +0, 2932, 3179, +0, 2936, 3175, +0, 2941, 3170, +0, 2948, 3163, +0, 2957, 3154, +0, 2969, 3142, +0, 2984, 3124, +0, 3004, 3099, +0, 3029, 3064, +0, 3060, 3013, +0, 3099, 2933, +0, 3146, 2798, +0, 3203, 2516, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3622, 0, +0, 3729, 0, +0, 2920, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3189, +0, 2921, 3189, +0, 2921, 3189, +0, 2922, 3189, +0, 2922, 3188, +0, 2923, 3188, +0, 2924, 3187, +0, 2925, 3186, +0, 2927, 3184, +0, 2929, 3182, +0, 2932, 3179, +0, 2936, 3176, +0, 2941, 3170, +0, 2948, 3164, +0, 2957, 3154, +0, 2969, 3142, +0, 2984, 3124, +0, 3004, 3100, +0, 3029, 3064, +0, 3060, 3013, +0, 3099, 2933, +0, 3146, 2798, +0, 3203, 2517, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3622, 0, +0, 3729, 0, +0, 2920, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3189, +0, 2922, 3189, +0, 2922, 3188, +0, 2923, 3188, +0, 2924, 3187, +0, 2925, 3186, +0, 2927, 3184, +0, 2929, 3182, +0, 2932, 3179, +0, 2936, 3176, +0, 2941, 3171, +0, 2948, 3164, +0, 2957, 3155, +0, 2969, 3142, +0, 2984, 3124, +0, 3004, 3100, +0, 3029, 3065, +0, 3060, 3013, +0, 3099, 2933, +0, 3146, 2799, +0, 3203, 2518, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3622, 0, +0, 3729, 0, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2921, 3190, +0, 2922, 3189, +0, 2922, 3189, +0, 2923, 3188, +0, 2924, 3187, +0, 2925, 3186, +0, 2927, 3185, +0, 2929, 3183, +0, 2932, 3180, +0, 2936, 3176, +0, 2941, 3171, +0, 2948, 3164, +0, 2957, 3155, +0, 2969, 3142, +0, 2984, 3125, +0, 3004, 3100, +0, 3029, 3065, +0, 3060, 3014, +0, 3099, 2934, +0, 3146, 2799, +0, 3203, 2519, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3622, 0, +0, 3729, 0, +0, 2921, 3191, +0, 2921, 3191, +0, 2921, 3191, +0, 2921, 3190, +0, 2921, 3190, +0, 2922, 3190, +0, 2922, 3190, +0, 2922, 3189, +0, 2923, 3188, +0, 2924, 3188, +0, 2925, 3187, +0, 2927, 3185, +0, 2929, 3183, +0, 2932, 3180, +0, 2936, 3176, +0, 2941, 3171, +0, 2948, 3165, +0, 2957, 3155, +0, 2969, 3143, +0, 2984, 3125, +0, 3004, 3101, +0, 3029, 3066, +0, 3060, 3014, +0, 3099, 2935, +0, 3146, 2800, +0, 3203, 2521, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3622, 0, +0, 3729, 0, +0, 2921, 3191, +0, 2921, 3191, +0, 2921, 3191, +0, 2921, 3191, +0, 2921, 3191, +0, 2922, 3190, +0, 2922, 3190, +0, 2923, 3190, +0, 2923, 3189, +0, 2924, 3188, +0, 2925, 3187, +0, 2927, 3186, +0, 2929, 3183, +0, 2932, 3181, +0, 2936, 3177, +0, 2941, 3172, +0, 2948, 3165, +0, 2957, 3156, +0, 2969, 3143, +0, 2984, 3126, +0, 3004, 3101, +0, 3029, 3066, +0, 3060, 3015, +0, 3099, 2936, +0, 3147, 2802, +0, 3203, 2523, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3623, 0, +0, 3729, 0, +0, 2921, 3192, +0, 2921, 3192, +0, 2921, 3192, +0, 2921, 3192, +0, 2922, 3191, +0, 2922, 3191, +0, 2922, 3191, +0, 2923, 3190, +0, 2923, 3190, +0, 2924, 3189, +0, 2926, 3188, +0, 2927, 3186, +0, 2930, 3184, +0, 2933, 3181, +0, 2936, 3178, +0, 2942, 3173, +0, 2948, 3166, +0, 2957, 3157, +0, 2969, 3144, +0, 2984, 3127, +0, 3004, 3102, +0, 3029, 3067, +0, 3061, 3016, +0, 3099, 2937, +0, 3147, 2803, +0, 3203, 2526, +0, 3269, 0, +0, 3344, 0, +0, 3429, 0, +0, 3522, 0, +0, 3623, 0, +0, 3730, 0, +0, 2921, 3193, +0, 2921, 3193, +0, 2921, 3193, +0, 2922, 3193, +0, 2922, 3192, +0, 2922, 3192, +0, 2922, 3192, +0, 2923, 3191, +0, 2924, 3191, +0, 2925, 3190, +0, 2926, 3189, +0, 2928, 3187, +0, 2930, 3185, +0, 2933, 3182, +0, 2937, 3179, +0, 2942, 3174, +0, 2949, 3167, +0, 2958, 3158, +0, 2969, 3145, +0, 2985, 3128, +0, 3004, 3103, +0, 3029, 3069, +0, 3061, 3017, +0, 3100, 2938, +0, 3147, 2806, +0, 3203, 2530, +0, 3269, 0, +0, 3345, 0, +0, 3429, 0, +0, 3522, 0, +0, 3623, 0, +0, 3730, 0, +0, 2922, 3194, +0, 2922, 3194, +0, 2922, 3194, +0, 2922, 3194, +0, 2922, 3194, +0, 2922, 3193, +0, 2923, 3193, +0, 2923, 3193, +0, 2924, 3192, +0, 2925, 3191, +0, 2926, 3190, +0, 2928, 3188, +0, 2930, 3186, +0, 2933, 3184, +0, 2937, 3180, +0, 2942, 3175, +0, 2949, 3168, +0, 2958, 3159, +0, 2970, 3147, +0, 2985, 3129, +0, 3005, 3105, +0, 3030, 3070, +0, 3061, 3019, +0, 3100, 2941, +0, 3147, 2808, +0, 3203, 2536, +0, 3269, 0, +0, 3345, 0, +0, 3429, 0, +0, 3522, 0, +0, 3623, 0, +0, 3730, 0, +0, 2922, 3196, +0, 2922, 3196, +0, 2922, 3196, +0, 2922, 3196, +0, 2923, 3195, +0, 2923, 3195, +0, 2923, 3195, +0, 2924, 3194, +0, 2924, 3194, +0, 2925, 3193, +0, 2927, 3192, +0, 2928, 3190, +0, 2931, 3188, +0, 2933, 3185, +0, 2937, 3182, +0, 2943, 3177, +0, 2949, 3170, +0, 2958, 3161, +0, 2970, 3148, +0, 2985, 3131, +0, 3005, 3107, +0, 3030, 3072, +0, 3061, 3022, +0, 3100, 2944, +0, 3147, 2812, +0, 3204, 2543, +0, 3269, 0, +0, 3345, 0, +0, 3429, 0, +0, 3522, 0, +0, 3623, 0, +0, 3730, 0, +0, 2923, 3198, +0, 2923, 3198, +0, 2923, 3198, +0, 2923, 3198, +0, 2923, 3198, +0, 2923, 3197, +0, 2924, 3197, +0, 2924, 3197, +0, 2925, 3196, +0, 2926, 3195, +0, 2927, 3194, +0, 2929, 3192, +0, 2931, 3190, +0, 2934, 3188, +0, 2938, 3184, +0, 2943, 3179, +0, 2950, 3172, +0, 2959, 3163, +0, 2971, 3151, +0, 2986, 3134, +0, 3005, 3110, +0, 3030, 3075, +0, 3062, 3025, +0, 3100, 2947, +0, 3148, 2818, +0, 3204, 2552, +0, 3270, 0, +0, 3345, 0, +0, 3430, 0, +0, 3522, 0, +0, 3623, 0, +0, 3730, 0, +0, 2923, 3201, +0, 2923, 3201, +0, 2924, 3201, +0, 2924, 3201, +0, 2924, 3201, +0, 2924, 3200, +0, 2925, 3200, +0, 2925, 3200, +0, 2926, 3199, +0, 2927, 3198, +0, 2928, 3197, +0, 2930, 3195, +0, 2932, 3193, +0, 2935, 3191, +0, 2939, 3187, +0, 2944, 3182, +0, 2951, 3176, +0, 2960, 3167, +0, 2971, 3154, +0, 2986, 3137, +0, 3006, 3113, +0, 3031, 3079, +0, 3062, 3029, +0, 3101, 2953, +0, 3148, 2824, +0, 3204, 2564, +0, 3270, 0, +0, 3345, 0, +0, 3430, 0, +0, 3523, 0, +0, 3623, 0, +0, 3730, 0, +0, 2924, 3205, +0, 2924, 3205, +0, 2925, 3205, +0, 2925, 3205, +0, 2925, 3205, +0, 2925, 3204, +0, 2926, 3204, +0, 2926, 3203, +0, 2927, 3203, +0, 2928, 3202, +0, 2929, 3201, +0, 2931, 3199, +0, 2933, 3197, +0, 2936, 3195, +0, 2940, 3191, +0, 2945, 3186, +0, 2952, 3180, +0, 2961, 3171, +0, 2972, 3159, +0, 2987, 3142, +0, 3007, 3118, +0, 3032, 3084, +0, 3063, 3035, +0, 3102, 2959, +0, 3149, 2833, +0, 3205, 2580, +0, 3271, 0, +0, 3346, 0, +0, 3430, 0, +0, 3523, 0, +0, 3623, 0, +0, 3730, 0, +0, 2926, 3210, +0, 2926, 3210, +0, 2926, 3210, +0, 2926, 3210, +0, 2926, 3210, +0, 2927, 3210, +0, 2927, 3209, +0, 2927, 3209, +0, 2928, 3208, +0, 2929, 3207, +0, 2930, 3206, +0, 2932, 3205, +0, 2934, 3203, +0, 2937, 3200, +0, 2941, 3197, +0, 2946, 3192, +0, 2953, 3185, +0, 2962, 3176, +0, 2973, 3164, +0, 2989, 3148, +0, 3008, 3124, +0, 3033, 3091, +0, 3064, 3043, +0, 3103, 2968, +0, 3150, 2845, +0, 3206, 2601, +0, 3271, 1202, +0, 3346, 0, +0, 3431, 0, +0, 3523, 0, +0, 3624, 0, +0, 3730, 0, +0, 2927, 3217, +0, 2928, 3217, +0, 2928, 3217, +0, 2928, 3217, +0, 2928, 3217, +0, 2928, 3216, +0, 2929, 3216, +0, 2929, 3216, +0, 2930, 3215, +0, 2931, 3214, +0, 2932, 3213, +0, 2934, 3212, +0, 2936, 3210, +0, 2939, 3207, +0, 2943, 3204, +0, 2948, 3199, +0, 2955, 3193, +0, 2963, 3184, +0, 2975, 3172, +0, 2990, 3156, +0, 3010, 3133, +0, 3034, 3100, +0, 3065, 3053, +0, 3104, 2980, +0, 3151, 2860, +0, 3207, 2626, +0, 3272, 1575, +0, 3347, 0, +0, 3431, 0, +0, 3524, 0, +0, 3624, 0, +0, 3731, 0, +0, 2930, 3226, +0, 2930, 3226, +0, 2930, 3226, +0, 2930, 3226, +0, 2930, 3226, +0, 2931, 3226, +0, 2931, 3225, +0, 2932, 3225, +0, 2932, 3224, +0, 2933, 3223, +0, 2934, 3222, +0, 2936, 3221, +0, 2938, 3219, +0, 2941, 3216, +0, 2945, 3213, +0, 2950, 3208, +0, 2957, 3202, +0, 2966, 3194, +0, 2977, 3182, +0, 2992, 3166, +0, 3012, 3144, +0, 3036, 3112, +0, 3067, 3066, +0, 3105, 2995, +0, 3152, 2880, +0, 3208, 2659, +0, 3273, 1829, +0, 3348, 0, +0, 3432, 0, +0, 3524, 0, +0, 3624, 0, +0, 3731, 0, +0, 2933, 3238, +0, 2933, 3238, +0, 2933, 3238, +0, 2933, 3238, +0, 2934, 3238, +0, 2934, 3237, +0, 2934, 3237, +0, 2935, 3237, +0, 2936, 3236, +0, 2936, 3235, +0, 2938, 3234, +0, 2939, 3233, +0, 2941, 3231, +0, 2944, 3229, +0, 2948, 3225, +0, 2953, 3221, +0, 2960, 3215, +0, 2969, 3206, +0, 2980, 3195, +0, 2995, 3179, +0, 3014, 3158, +0, 3039, 3127, +0, 3069, 3082, +0, 3108, 3015, +0, 3154, 2905, +0, 3210, 2699, +0, 3275, 2034, +0, 3349, 0, +0, 3433, 0, +0, 3525, 0, +0, 3625, 0, +0, 3732, 0, +0, 2937, 3254, +0, 2937, 3253, +0, 2938, 3253, +0, 2938, 3253, +0, 2938, 3253, +0, 2938, 3253, +0, 2939, 3252, +0, 2939, 3252, +0, 2940, 3252, +0, 2941, 3251, +0, 2942, 3250, +0, 2943, 3248, +0, 2946, 3247, +0, 2948, 3244, +0, 2952, 3241, +0, 2957, 3237, +0, 2964, 3231, +0, 2973, 3223, +0, 2984, 3212, +0, 2999, 3197, +0, 3018, 3176, +0, 3042, 3147, +0, 3073, 3104, +0, 3110, 3040, +0, 3157, 2937, +0, 3212, 2747, +0, 3277, 2215, +0, 3351, 0, +0, 3434, 0, +0, 3526, 0, +0, 3626, 0, +0, 3732, 0, +0, 2943, 3273, +0, 2943, 3273, +0, 2943, 3273, +0, 2943, 3273, +0, 2944, 3273, +0, 2944, 3273, +0, 2944, 3272, +0, 2945, 3272, +0, 2945, 3271, +0, 2946, 3271, +0, 2947, 3270, +0, 2949, 3268, +0, 2951, 3267, +0, 2954, 3264, +0, 2958, 3261, +0, 2963, 3257, +0, 2969, 3252, +0, 2978, 3244, +0, 2989, 3234, +0, 3004, 3219, +0, 3022, 3199, +0, 3046, 3171, +0, 3077, 3131, +0, 3114, 3071, +0, 3160, 2976, +0, 3215, 2805, +0, 3279, 2380, +0, 3353, 0, +0, 3436, 0, +0, 3528, 0, +0, 3627, 0, +0, 3733, 0, +1458, 2950, 3298, +1453, 2950, 3298, +1446, 2951, 3298, +1437, 2951, 3298, +1424, 2951, 3298, +1407, 2951, 3298, +1383, 2952, 3298, +1348, 2952, 3297, +1297, 2953, 3297, +1219, 2954, 3296, +1088, 2955, 3295, +818, 2956, 3294, +0, 2958, 3292, +0, 2961, 3290, +0, 2965, 3287, +0, 2970, 3283, +0, 2976, 3278, +0, 2985, 3271, +0, 2996, 3261, +0, 3010, 3248, +0, 3029, 3229, +0, 3052, 3203, +0, 3082, 3165, +0, 3119, 3110, +0, 3165, 3023, +0, 3219, 2873, +0, 3283, 2535, +0, 3356, 0, +0, 3439, 0, +0, 3530, 0, +0, 3629, 0, +0, 3735, 0, +2457, 2960, 3330, +2456, 2960, 3330, +2456, 2960, 3330, +2455, 2960, 3330, +2453, 2961, 3330, +2451, 2961, 3330, +2449, 2961, 3329, +2446, 2962, 3329, +2442, 2962, 3328, +2436, 2963, 3328, +2428, 2964, 3327, +2417, 2966, 3326, +2402, 2968, 3324, +2382, 2971, 3322, +2352, 2974, 3320, +2310, 2979, 3316, +2247, 2985, 3311, +2145, 2994, 3304, +1960, 3004, 3295, +1453, 3019, 3283, +0, 3037, 3266, +0, 3060, 3242, +0, 3090, 3207, +0, 3126, 3157, +0, 3171, 3079, +0, 3225, 2949, +0, 3288, 2684, +0, 3360, 0, +0, 3442, 0, +0, 3533, 0, +0, 3631, 0, +0, 3736, 0, +2813, 2973, 3369, +2813, 2973, 3369, +2812, 2973, 3369, +2812, 2973, 3369, +2811, 2973, 3369, +2810, 2974, 3369, +2809, 2974, 3369, +2808, 2974, 3368, +2806, 2975, 3368, +2803, 2976, 3367, +2800, 2977, 3366, +2795, 2978, 3365, +2789, 2980, 3364, +2780, 2983, 3362, +2768, 2987, 3360, +2752, 2991, 3356, +2729, 2997, 3352, +2696, 3005, 3346, +2648, 3016, 3337, +2576, 3030, 3326, +2456, 3048, 3310, +2220, 3070, 3289, +1140, 3099, 3258, +0, 3135, 3213, +0, 3179, 3145, +0, 3232, 3035, +0, 3294, 2828, +0, 3366, 2152, +0, 3447, 0, +0, 3536, 0, +0, 3634, 0, +0, 3739, 0, +3061, 2989, 3417, +3061, 2989, 3417, +3061, 2989, 3417, +3060, 2989, 3417, +3060, 2990, 3417, +3060, 2990, 3416, +3059, 2990, 3416, +3058, 2991, 3416, +3057, 2991, 3415, +3055, 2992, 3415, +3053, 2993, 3414, +3051, 2995, 3413, +3047, 2997, 3412, +3042, 2999, 3410, +3036, 3002, 3408, +3027, 3007, 3405, +3014, 3013, 3401, +2997, 3021, 3396, +2973, 3031, 3388, +2939, 3044, 3378, +2889, 3062, 3364, +2812, 3084, 3345, +2683, 3112, 3318, +2421, 3147, 3279, +0, 3189, 3221, +0, 3241, 3129, +0, 3302, 2969, +0, 3373, 2588, +0, 3452, 0, +0, 3541, 0, +0, 3638, 0, +0, 3742, 0, +3264, 3010, 3474, +3264, 3010, 3474, +3264, 3010, 3473, +3263, 3010, 3473, +3263, 3011, 3473, +3263, 3011, 3473, +3263, 3011, 3473, +3262, 3012, 3473, +3261, 3012, 3472, +3260, 3013, 3472, +3259, 3014, 3471, +3257, 3015, 3470, +3255, 3017, 3469, +3252, 3020, 3468, +3248, 3023, 3466, +3242, 3027, 3463, +3234, 3033, 3460, +3224, 3040, 3455, +3210, 3050, 3448, +3190, 3063, 3440, +3161, 3080, 3427, +3121, 3101, 3411, +3060, 3128, 3387, +2964, 3162, 3354, +2791, 3203, 3305, +2354, 3253, 3231, +0, 3313, 3107, +0, 3382, 2861, +0, 3460, 1375, +0, 3548, 0, +0, 3643, 0, +0, 3746, 0, +3442, 3037, 3540, +3442, 3037, 3540, +3442, 3037, 3540, +3442, 3037, 3540, +3442, 3037, 3540, +3442, 3038, 3539, +3442, 3038, 3539, +3441, 3038, 3539, +3441, 3039, 3539, +3440, 3040, 3538, +3439, 3041, 3538, +3438, 3042, 3537, +3437, 3044, 3536, +3434, 3046, 3535, +3432, 3049, 3533, +3428, 3053, 3531, +3423, 3058, 3528, +3416, 3065, 3524, +3407, 3075, 3518, +3394, 3087, 3511, +3376, 3103, 3500, +3351, 3123, 3486, +3315, 3149, 3466, +3263, 3181, 3438, +3182, 3221, 3398, +3044, 3269, 3339, +2752, 3327, 3244, +0, 3394, 3076, +0, 3470, 2660, +0, 3556, 0, +0, 3650, 0, +0, 3751, 0, +3606, 3070, 3616, +3606, 3070, 3616, +3606, 3071, 3616, +3606, 3071, 3615, +3606, 3071, 3615, +3606, 3071, 3615, +3606, 3071, 3615, +3606, 3072, 3615, +3605, 3072, 3615, +3605, 3073, 3614, +3604, 3074, 3614, +3603, 3075, 3613, +3602, 3077, 3613, +3601, 3079, 3611, +3599, 3082, 3610, +3596, 3085, 3608, +3593, 3090, 3605, +3588, 3097, 3602, +3582, 3106, 3597, +3573, 3117, 3591, +3561, 3132, 3582, +3545, 3151, 3570, +3522, 3175, 3554, +3489, 3205, 3531, +3442, 3243, 3499, +3369, 3289, 3452, +3249, 3345, 3380, +3015, 3409, 3261, +1952, 3483, 3030, +0, 3567, 2039, +0, 3659, 0, +0, 3758, 0, +3761, 3112, 3700, +3761, 3112, 3700, +3761, 3112, 3700, +3761, 3112, 3700, +3761, 3112, 3700, +3761, 3112, 3700, +3761, 3112, 3700, +3760, 3113, 3700, +3760, 3113, 3700, +3760, 3114, 3699, +3759, 3115, 3699, +3759, 3116, 3699, +3758, 3117, 3698, +3757, 3119, 3697, +3756, 3122, 3696, +3754, 3125, 3694, +3751, 3130, 3692, +3748, 3136, 3689, +3744, 3144, 3685, +3738, 3154, 3680, +3729, 3168, 3673, +3718, 3185, 3663, +3702, 3208, 3650, +3681, 3236, 3632, +3650, 3272, 3606, +3606, 3315, 3569, +3538, 3368, 3514, +3429, 3429, 3429, +3224, 3501, 3283, +2573, 3581, 2960, +0, 3671, 0, +0, 3768, 0, +3909, 3161, 3794, +3909, 3161, 3794, +3909, 3162, 3794, +3909, 3162, 3794, +3909, 3162, 3794, +3909, 3162, 3794, +3909, 3162, 3793, +3909, 3162, 3793, +3909, 3163, 3793, +3908, 3163, 3793, +3908, 3164, 3793, +3908, 3165, 3792, +3907, 3166, 3792, +3906, 3168, 3791, +3905, 3171, 3790, +3904, 3174, 3789, +3902, 3178, 3787, +3900, 3183, 3785, +3897, 3190, 3781, +3892, 3200, 3777, +3887, 3212, 3771, +3879, 3228, 3764, +3868, 3249, 3753, +3853, 3275, 3739, +3832, 3307, 3718, +3803, 3348, 3690, +3760, 3397, 3648, +3696, 3455, 3587, +3594, 3522, 3488, +3407, 3599, 3311, +2887, 3686, 2847, +0, 3780, 0, +4053, 3220, 3894, +4053, 3221, 3894, +4053, 3221, 3894, +4053, 3221, 3894, +4053, 3221, 3894, +4053, 3221, 3894, +4053, 3221, 3894, +4053, 3221, 3894, +4053, 3222, 3894, +4052, 3222, 3894, +4052, 3223, 3894, +4052, 3224, 3893, +4052, 3225, 3893, +4051, 3226, 3892, +4050, 3229, 3891, +4049, 3231, 3890, +4048, 3235, 3889, +4046, 3240, 3887, +4044, 3246, 3885, +4041, 3254, 3881, +4037, 3265, 3877, +4031, 3280, 3871, +4023, 3298, 3862, +4013, 3321, 3851, +3998, 3351, 3835, +3978, 3388, 3813, +3950, 3433, 3782, +3908, 3487, 3737, +3847, 3550, 3668, +3749, 3623, 3557, +3573, 3705, 3345, +3119, 3796, 2630, +4095, 3289, 4002, +4095, 3289, 4002, +4095, 3289, 4002, +4095, 3289, 4002, +4095, 3289, 4001, +4095, 3290, 4001, +4095, 3290, 4001, +4095, 3290, 4001, +4095, 3290, 4001, +4095, 3291, 4001, +4095, 3291, 4001, +4095, 3292, 4001, +4095, 3293, 4000, +4095, 3294, 4000, +4095, 3296, 3999, +4095, 3298, 3998, +4095, 3302, 3997, +4095, 3306, 3996, +4095, 3311, 3994, +4095, 3318, 3991, +4095, 3328, 3988, +4095, 3340, 3983, +4095, 3357, 3976, +4095, 3377, 3967, +4095, 3403, 3955, +4095, 3436, 3939, +4095, 3477, 3915, +4092, 3526, 3882, +4052, 3585, 3833, +3993, 3653, 3758, +3898, 3730, 3634, +3730, 3816, 3387, +4095, 3367, 4095, +4095, 3367, 4095, +4095, 3367, 4095, +4095, 3367, 4095, +4095, 3367, 4095, +4095, 3368, 4095, +4095, 3368, 4095, +4095, 3368, 4095, +4095, 3368, 4095, +4095, 3369, 4095, +4095, 3369, 4095, +4095, 3370, 4095, +4095, 3370, 4095, +4095, 3372, 4095, +4095, 3373, 4095, +4095, 3375, 4095, +4095, 3378, 4095, +4095, 3381, 4095, +4095, 3386, 4095, +4095, 3392, 4095, +4095, 3400, 4095, +4095, 3411, 4095, +4095, 3425, 4094, +4095, 3442, 4088, +4095, 3465, 4078, +4095, 3494, 4066, +4095, 3530, 4048, +4095, 3574, 4023, +4095, 3627, 3988, +4095, 3689, 3936, +4095, 3761, 3857, +4042, 3842, 3721, +0, 3052, 3322, +0, 3052, 3322, +0, 3053, 3321, +0, 3053, 3321, +0, 3053, 3321, +0, 3053, 3321, +0, 3053, 3321, +0, 3054, 3320, +0, 3054, 3320, +0, 3055, 3319, +0, 3056, 3318, +0, 3057, 3317, +0, 3059, 3316, +0, 3061, 3314, +0, 3064, 3311, +0, 3068, 3307, +0, 3073, 3302, +0, 3080, 3295, +0, 3089, 3286, +0, 3101, 3273, +0, 3116, 3256, +0, 3136, 3231, +0, 3161, 3196, +0, 3192, 3144, +0, 3231, 3064, +0, 3278, 2929, +0, 3335, 2647, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3052, 3322, +0, 3052, 3322, +0, 3053, 3322, +0, 3053, 3321, +0, 3053, 3321, +0, 3053, 3321, +0, 3053, 3321, +0, 3054, 3320, +0, 3054, 3320, +0, 3055, 3319, +0, 3056, 3319, +0, 3057, 3317, +0, 3059, 3316, +0, 3061, 3314, +0, 3064, 3311, +0, 3068, 3307, +0, 3073, 3302, +0, 3080, 3295, +0, 3089, 3286, +0, 3101, 3273, +0, 3116, 3256, +0, 3136, 3231, +0, 3161, 3196, +0, 3192, 3144, +0, 3231, 3065, +0, 3278, 2930, +0, 3335, 2648, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3052, 3322, +0, 3052, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3321, +0, 3053, 3321, +0, 3053, 3321, +0, 3054, 3321, +0, 3054, 3320, +0, 3055, 3319, +0, 3056, 3319, +0, 3057, 3318, +0, 3059, 3316, +0, 3061, 3314, +0, 3064, 3311, +0, 3068, 3307, +0, 3073, 3302, +0, 3080, 3296, +0, 3089, 3286, +0, 3101, 3274, +0, 3116, 3256, +0, 3136, 3231, +0, 3161, 3196, +0, 3192, 3145, +0, 3231, 3065, +0, 3278, 2930, +0, 3335, 2648, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3052, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3321, +0, 3053, 3321, +0, 3054, 3321, +0, 3054, 3320, +0, 3055, 3320, +0, 3056, 3319, +0, 3057, 3318, +0, 3059, 3316, +0, 3061, 3314, +0, 3064, 3311, +0, 3068, 3308, +0, 3073, 3303, +0, 3080, 3296, +0, 3089, 3286, +0, 3101, 3274, +0, 3116, 3256, +0, 3136, 3232, +0, 3161, 3197, +0, 3192, 3145, +0, 3231, 3065, +0, 3278, 2930, +0, 3335, 2649, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3321, +0, 3054, 3321, +0, 3054, 3321, +0, 3055, 3320, +0, 3056, 3319, +0, 3057, 3318, +0, 3059, 3316, +0, 3061, 3314, +0, 3064, 3312, +0, 3068, 3308, +0, 3073, 3303, +0, 3080, 3296, +0, 3089, 3287, +0, 3101, 3274, +0, 3116, 3256, +0, 3136, 3232, +0, 3161, 3197, +0, 3192, 3145, +0, 3231, 3065, +0, 3278, 2931, +0, 3335, 2650, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3053, 3323, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3053, 3322, +0, 3054, 3322, +0, 3054, 3321, +0, 3054, 3321, +0, 3055, 3320, +0, 3056, 3319, +0, 3057, 3318, +0, 3059, 3317, +0, 3061, 3315, +0, 3064, 3312, +0, 3068, 3308, +0, 3073, 3303, +0, 3080, 3296, +0, 3089, 3287, +0, 3101, 3274, +0, 3116, 3257, +0, 3136, 3232, +0, 3161, 3197, +0, 3192, 3146, +0, 3231, 3066, +0, 3279, 2932, +0, 3335, 2651, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3322, +0, 3054, 3322, +0, 3054, 3322, +0, 3055, 3321, +0, 3055, 3321, +0, 3056, 3320, +0, 3057, 3319, +0, 3059, 3317, +0, 3061, 3315, +0, 3064, 3312, +0, 3068, 3309, +0, 3073, 3304, +0, 3080, 3297, +0, 3089, 3287, +0, 3101, 3275, +0, 3116, 3257, +0, 3136, 3233, +0, 3161, 3198, +0, 3192, 3146, +0, 3231, 3067, +0, 3279, 2932, +0, 3335, 2653, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3053, 3323, +0, 3054, 3323, +0, 3054, 3322, +0, 3055, 3322, +0, 3055, 3321, +0, 3056, 3320, +0, 3058, 3319, +0, 3059, 3318, +0, 3061, 3316, +0, 3064, 3313, +0, 3068, 3309, +0, 3074, 3304, +0, 3080, 3297, +0, 3089, 3288, +0, 3101, 3275, +0, 3116, 3258, +0, 3136, 3233, +0, 3161, 3198, +0, 3192, 3147, +0, 3231, 3068, +0, 3279, 2934, +0, 3335, 2655, +0, 3401, 0, +0, 3476, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3053, 3324, +0, 3053, 3324, +0, 3053, 3324, +0, 3053, 3324, +0, 3053, 3324, +0, 3054, 3324, +0, 3054, 3323, +0, 3054, 3323, +0, 3055, 3322, +0, 3056, 3322, +0, 3057, 3321, +0, 3058, 3320, +0, 3059, 3318, +0, 3062, 3316, +0, 3065, 3314, +0, 3069, 3310, +0, 3074, 3305, +0, 3081, 3298, +0, 3090, 3289, +0, 3101, 3276, +0, 3117, 3259, +0, 3136, 3234, +0, 3161, 3199, +0, 3193, 3148, +0, 3231, 3069, +0, 3279, 2935, +0, 3335, 2658, +0, 3401, 0, +0, 3477, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3053, 3325, +0, 3053, 3325, +0, 3053, 3325, +0, 3054, 3325, +0, 3054, 3325, +0, 3054, 3325, +0, 3054, 3324, +0, 3055, 3324, +0, 3055, 3323, +0, 3056, 3323, +0, 3057, 3322, +0, 3058, 3321, +0, 3060, 3319, +0, 3062, 3317, +0, 3065, 3314, +0, 3069, 3311, +0, 3074, 3306, +0, 3081, 3299, +0, 3090, 3290, +0, 3102, 3277, +0, 3117, 3260, +0, 3136, 3235, +0, 3161, 3201, +0, 3193, 3149, +0, 3232, 3071, +0, 3279, 2938, +0, 3335, 2662, +0, 3401, 0, +0, 3477, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3054, 3326, +0, 3054, 3326, +0, 3054, 3326, +0, 3054, 3326, +0, 3054, 3326, +0, 3054, 3326, +0, 3055, 3326, +0, 3055, 3325, +0, 3055, 3325, +0, 3056, 3324, +0, 3057, 3323, +0, 3058, 3322, +0, 3060, 3321, +0, 3062, 3319, +0, 3065, 3316, +0, 3069, 3312, +0, 3074, 3307, +0, 3081, 3300, +0, 3090, 3291, +0, 3102, 3279, +0, 3117, 3261, +0, 3137, 3237, +0, 3162, 3202, +0, 3193, 3151, +0, 3232, 3073, +0, 3279, 2941, +0, 3335, 2668, +0, 3401, 0, +0, 3477, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3054, 3328, +0, 3054, 3328, +0, 3054, 3328, +0, 3054, 3328, +0, 3054, 3328, +0, 3055, 3327, +0, 3055, 3327, +0, 3055, 3327, +0, 3056, 3326, +0, 3057, 3326, +0, 3057, 3325, +0, 3059, 3324, +0, 3060, 3322, +0, 3063, 3320, +0, 3066, 3318, +0, 3069, 3314, +0, 3075, 3309, +0, 3081, 3302, +0, 3090, 3293, +0, 3102, 3281, +0, 3117, 3263, +0, 3137, 3239, +0, 3162, 3204, +0, 3193, 3154, +0, 3232, 3076, +0, 3279, 2944, +0, 3336, 2675, +0, 3402, 0, +0, 3477, 0, +0, 3561, 0, +0, 3654, 0, +0, 3755, 0, +0, 3055, 3330, +0, 3055, 3330, +0, 3055, 3330, +0, 3055, 3330, +0, 3055, 3330, +0, 3055, 3330, +0, 3056, 3329, +0, 3056, 3329, +0, 3056, 3329, +0, 3057, 3328, +0, 3058, 3327, +0, 3059, 3326, +0, 3061, 3325, +0, 3063, 3323, +0, 3066, 3320, +0, 3070, 3316, +0, 3075, 3311, +0, 3082, 3305, +0, 3091, 3295, +0, 3103, 3283, +0, 3118, 3266, +0, 3137, 3242, +0, 3162, 3207, +0, 3194, 3157, +0, 3233, 3080, +0, 3280, 2950, +0, 3336, 2684, +0, 3402, 0, +0, 3477, 0, +0, 3562, 0, +0, 3655, 0, +0, 3755, 0, +0, 3055, 3333, +0, 3055, 3333, +0, 3055, 3333, +0, 3056, 3333, +0, 3056, 3333, +0, 3056, 3333, +0, 3056, 3332, +0, 3057, 3332, +0, 3057, 3332, +0, 3058, 3331, +0, 3059, 3330, +0, 3060, 3329, +0, 3062, 3328, +0, 3064, 3326, +0, 3067, 3323, +0, 3071, 3319, +0, 3076, 3314, +0, 3083, 3308, +0, 3092, 3299, +0, 3103, 3286, +0, 3119, 3269, +0, 3138, 3245, +0, 3163, 3211, +0, 3194, 3161, +0, 3233, 3085, +0, 3280, 2957, +0, 3336, 2696, +0, 3402, 0, +0, 3477, 0, +0, 3562, 0, +0, 3655, 0, +0, 3755, 0, +0, 3056, 3337, +0, 3056, 3337, +0, 3056, 3337, +0, 3057, 3337, +0, 3057, 3337, +0, 3057, 3337, +0, 3057, 3336, +0, 3058, 3336, +0, 3058, 3336, +0, 3059, 3335, +0, 3060, 3334, +0, 3061, 3333, +0, 3063, 3332, +0, 3065, 3330, +0, 3068, 3327, +0, 3072, 3323, +0, 3077, 3318, +0, 3084, 3312, +0, 3093, 3303, +0, 3104, 3291, +0, 3119, 3274, +0, 3139, 3250, +0, 3164, 3216, +0, 3195, 3167, +0, 3234, 3092, +0, 3281, 2966, +0, 3337, 2712, +0, 3403, 0, +0, 3478, 0, +0, 3562, 0, +0, 3655, 0, +0, 3755, 0, +0, 3058, 3342, +0, 3058, 3342, +0, 3058, 3342, +0, 3058, 3342, +0, 3058, 3342, +0, 3058, 3342, +0, 3059, 3342, +0, 3059, 3341, +0, 3060, 3341, +0, 3060, 3340, +0, 3061, 3339, +0, 3062, 3338, +0, 3064, 3337, +0, 3066, 3335, +0, 3069, 3332, +0, 3073, 3329, +0, 3078, 3324, +0, 3085, 3317, +0, 3094, 3309, +0, 3106, 3296, +0, 3121, 3280, +0, 3140, 3256, +0, 3165, 3223, +0, 3196, 3175, +0, 3235, 3100, +0, 3282, 2977, +0, 3338, 2733, +0, 3403, 1334, +0, 3478, 0, +0, 3563, 0, +0, 3655, 0, +0, 3756, 0, +0, 3059, 3349, +0, 3060, 3349, +0, 3060, 3349, +0, 3060, 3349, +0, 3060, 3349, +0, 3060, 3349, +0, 3060, 3349, +0, 3061, 3348, +0, 3061, 3348, +0, 3062, 3347, +0, 3063, 3346, +0, 3064, 3345, +0, 3066, 3344, +0, 3068, 3342, +0, 3071, 3339, +0, 3075, 3336, +0, 3080, 3331, +0, 3087, 3325, +0, 3096, 3316, +0, 3107, 3304, +0, 3122, 3288, +0, 3142, 3265, +0, 3166, 3232, +0, 3197, 3185, +0, 3236, 3112, +0, 3283, 2993, +0, 3339, 2758, +0, 3404, 1707, +0, 3479, 0, +0, 3563, 0, +0, 3656, 0, +0, 3756, 0, +0, 3062, 3358, +0, 3062, 3358, +0, 3062, 3358, +0, 3062, 3358, +0, 3062, 3358, +0, 3063, 3358, +0, 3063, 3358, +0, 3063, 3357, +0, 3064, 3357, +0, 3064, 3356, +0, 3065, 3355, +0, 3067, 3354, +0, 3068, 3353, +0, 3070, 3351, +0, 3073, 3349, +0, 3077, 3345, +0, 3082, 3341, +0, 3089, 3334, +0, 3098, 3326, +0, 3109, 3314, +0, 3124, 3298, +0, 3144, 3276, +0, 3168, 3244, +0, 3199, 3198, +0, 3238, 3127, +0, 3284, 3012, +0, 3340, 2791, +0, 3405, 1961, +0, 3480, 0, +0, 3564, 0, +0, 3657, 0, +0, 3757, 0, +0, 3065, 3370, +0, 3065, 3370, +0, 3065, 3370, +0, 3065, 3370, +0, 3066, 3370, +0, 3066, 3370, +0, 3066, 3369, +0, 3066, 3369, +0, 3067, 3369, +0, 3068, 3368, +0, 3069, 3367, +0, 3070, 3366, +0, 3071, 3365, +0, 3074, 3363, +0, 3076, 3361, +0, 3080, 3357, +0, 3085, 3353, +0, 3092, 3347, +0, 3101, 3338, +0, 3112, 3327, +0, 3127, 3312, +0, 3146, 3290, +0, 3171, 3259, +0, 3202, 3214, +0, 3240, 3147, +0, 3286, 3037, +0, 3342, 2831, +0, 3407, 2166, +0, 3481, 0, +0, 3565, 0, +0, 3657, 0, +0, 3757, 0, +0, 3069, 3386, +0, 3069, 3386, +0, 3070, 3386, +0, 3070, 3385, +0, 3070, 3385, +0, 3070, 3385, +0, 3070, 3385, +0, 3071, 3385, +0, 3071, 3384, +0, 3072, 3384, +0, 3073, 3383, +0, 3074, 3382, +0, 3076, 3381, +0, 3078, 3379, +0, 3081, 3376, +0, 3084, 3373, +0, 3089, 3369, +0, 3096, 3363, +0, 3105, 3355, +0, 3116, 3344, +0, 3131, 3329, +0, 3150, 3308, +0, 3174, 3279, +0, 3205, 3236, +0, 3243, 3172, +0, 3289, 3069, +0, 3344, 2880, +0, 3409, 2347, +0, 3483, 0, +0, 3567, 0, +0, 3659, 0, +0, 3758, 0, +0, 3075, 3405, +0, 3075, 3405, +0, 3075, 3405, +0, 3075, 3405, +0, 3075, 3405, +0, 3076, 3405, +0, 3076, 3405, +0, 3076, 3404, +0, 3077, 3404, +0, 3077, 3404, +0, 3078, 3403, +0, 3080, 3402, +0, 3081, 3401, +0, 3083, 3399, +0, 3086, 3397, +0, 3090, 3393, +0, 3095, 3389, +0, 3101, 3384, +0, 3110, 3376, +0, 3121, 3366, +0, 3136, 3351, +0, 3155, 3332, +0, 3179, 3304, +0, 3209, 3263, +0, 3246, 3203, +0, 3292, 3108, +0, 3347, 2937, +0, 3411, 2512, +0, 3485, 0, +0, 3568, 0, +0, 3660, 0, +0, 3759, 0, +1593, 3082, 3431, +1590, 3082, 3431, +1585, 3083, 3431, +1578, 3083, 3430, +1569, 3083, 3430, +1556, 3083, 3430, +1539, 3083, 3430, +1515, 3084, 3430, +1480, 3084, 3429, +1429, 3085, 3429, +1351, 3086, 3428, +1220, 3087, 3427, +950, 3088, 3426, +0, 3090, 3424, +0, 3093, 3422, +0, 3097, 3419, +0, 3102, 3415, +0, 3108, 3410, +0, 3117, 3403, +0, 3128, 3393, +0, 3142, 3380, +0, 3161, 3361, +0, 3184, 3335, +0, 3214, 3297, +0, 3252, 3242, +0, 3297, 3155, +0, 3351, 3005, +0, 3415, 2667, +0, 3488, 0, +0, 3571, 0, +0, 3662, 0, +0, 3761, 0, +2589, 3092, 3462, +2589, 3092, 3462, +2588, 3092, 3462, +2588, 3092, 3462, +2587, 3092, 3462, +2585, 3093, 3462, +2584, 3093, 3462, +2581, 3093, 3461, +2578, 3094, 3461, +2574, 3094, 3461, +2568, 3095, 3460, +2560, 3096, 3459, +2549, 3098, 3458, +2534, 3100, 3456, +2514, 3103, 3454, +2484, 3106, 3452, +2442, 3111, 3448, +2379, 3117, 3443, +2277, 3126, 3436, +2092, 3137, 3427, +1586, 3151, 3415, +0, 3169, 3398, +0, 3192, 3374, +0, 3222, 3339, +0, 3258, 3289, +0, 3303, 3211, +0, 3357, 3081, +0, 3420, 2816, +0, 3492, 0, +0, 3574, 0, +0, 3665, 0, +0, 3763, 0, +2945, 3105, 3501, +2945, 3105, 3501, +2945, 3105, 3501, +2944, 3105, 3501, +2944, 3105, 3501, +2943, 3105, 3501, +2942, 3106, 3501, +2941, 3106, 3501, +2940, 3106, 3500, +2938, 3107, 3500, +2935, 3108, 3499, +2932, 3109, 3499, +2927, 3110, 3497, +2921, 3112, 3496, +2912, 3115, 3494, +2900, 3119, 3492, +2884, 3123, 3488, +2861, 3129, 3484, +2828, 3137, 3478, +2780, 3148, 3470, +2708, 3162, 3458, +2588, 3180, 3443, +2352, 3202, 3421, +1272, 3231, 3390, +0, 3267, 3345, +0, 3311, 3277, +0, 3364, 3167, +0, 3426, 2960, +0, 3498, 2284, +0, 3579, 0, +0, 3669, 0, +0, 3766, 0, +3193, 3121, 3549, +3193, 3121, 3549, +3193, 3121, 3549, +3193, 3121, 3549, +3192, 3122, 3549, +3192, 3122, 3549, +3192, 3122, 3548, +3191, 3122, 3548, +3190, 3123, 3548, +3189, 3123, 3548, +3188, 3124, 3547, +3186, 3125, 3546, +3183, 3127, 3545, +3179, 3129, 3544, +3174, 3131, 3543, +3168, 3135, 3540, +3159, 3139, 3537, +3146, 3145, 3533, +3129, 3153, 3528, +3105, 3163, 3520, +3071, 3176, 3510, +3021, 3194, 3496, +2944, 3216, 3477, +2815, 3244, 3450, +2553, 3279, 3411, +0, 3321, 3353, +0, 3373, 3261, +0, 3434, 3101, +0, 3505, 2720, +0, 3585, 0, +0, 3673, 0, +0, 3770, 0, +3396, 3142, 3606, +3396, 3142, 3606, +3396, 3142, 3606, +3396, 3142, 3606, +3396, 3143, 3605, +3395, 3143, 3605, +3395, 3143, 3605, +3395, 3143, 3605, +3394, 3144, 3605, +3393, 3144, 3604, +3392, 3145, 3604, +3391, 3146, 3603, +3389, 3148, 3603, +3387, 3149, 3601, +3384, 3152, 3600, +3380, 3155, 3598, +3374, 3159, 3595, +3367, 3165, 3592, +3356, 3172, 3587, +3342, 3182, 3581, +3322, 3195, 3572, +3294, 3212, 3560, +3253, 3233, 3543, +3192, 3260, 3519, +3096, 3294, 3486, +2923, 3335, 3437, +2486, 3385, 3363, +0, 3445, 3239, +0, 3514, 2993, +0, 3592, 1507, +0, 3680, 0, +0, 3775, 0, +3575, 3169, 3672, +3575, 3169, 3672, +3574, 3169, 3672, +3574, 3169, 3672, +3574, 3169, 3672, +3574, 3169, 3672, +3574, 3170, 3672, +3574, 3170, 3671, +3573, 3170, 3671, +3573, 3171, 3671, +3572, 3172, 3670, +3571, 3173, 3670, +3570, 3174, 3669, +3569, 3176, 3668, +3567, 3178, 3667, +3564, 3181, 3665, +3560, 3185, 3663, +3555, 3190, 3660, +3548, 3198, 3656, +3539, 3207, 3650, +3526, 3219, 3643, +3508, 3235, 3632, +3483, 3255, 3618, +3448, 3281, 3598, +3395, 3313, 3571, +3314, 3353, 3531, +3176, 3401, 3471, +2884, 3459, 3376, +0, 3526, 3208, +0, 3602, 2792, +0, 3688, 0, +0, 3782, 0, +3739, 3202, 3748, +3739, 3202, 3748, +3739, 3203, 3748, +3738, 3203, 3748, +3738, 3203, 3748, +3738, 3203, 3747, +3738, 3203, 3747, +3738, 3203, 3747, +3738, 3204, 3747, +3737, 3204, 3747, +3737, 3205, 3746, +3736, 3206, 3746, +3736, 3207, 3745, +3734, 3209, 3745, +3733, 3211, 3744, +3731, 3214, 3742, +3728, 3217, 3740, +3725, 3222, 3738, +3720, 3229, 3734, +3714, 3238, 3729, +3705, 3249, 3723, +3693, 3264, 3714, +3677, 3283, 3703, +3654, 3307, 3686, +3621, 3338, 3663, +3574, 3375, 3631, +3501, 3422, 3584, +3381, 3477, 3512, +3147, 3541, 3393, +2084, 3616, 3162, +0, 3699, 2171, +0, 3791, 0, +3893, 3244, 3833, +3893, 3244, 3833, +3893, 3244, 3833, +3893, 3244, 3832, +3893, 3244, 3832, +3893, 3244, 3832, +3893, 3244, 3832, +3893, 3244, 3832, +3893, 3245, 3832, +3892, 3245, 3832, +3892, 3246, 3832, +3892, 3247, 3831, +3891, 3248, 3831, +3890, 3249, 3830, +3889, 3251, 3829, +3888, 3254, 3828, +3886, 3257, 3826, +3884, 3262, 3824, +3880, 3268, 3821, +3876, 3276, 3817, +3870, 3286, 3812, +3861, 3300, 3805, +3850, 3318, 3795, +3835, 3340, 3782, +3813, 3368, 3764, +3782, 3404, 3738, +3738, 3447, 3701, +3670, 3500, 3646, +3561, 3561, 3561, +3357, 3633, 3415, +2705, 3713, 3092, +0, 3803, 0, +4041, 3293, 3926, +4041, 3293, 3926, +4041, 3294, 3926, +4041, 3294, 3926, +4041, 3294, 3926, +4041, 3294, 3926, +4041, 3294, 3926, +4041, 3294, 3926, +4041, 3295, 3925, +4041, 3295, 3925, +4041, 3296, 3925, +4040, 3296, 3925, +4040, 3297, 3924, +4039, 3299, 3924, +4039, 3300, 3923, +4038, 3303, 3922, +4036, 3306, 3921, +4034, 3310, 3919, +4032, 3315, 3917, +4029, 3322, 3914, +4025, 3332, 3909, +4019, 3344, 3904, +4011, 3360, 3896, +4000, 3381, 3885, +3985, 3407, 3871, +3964, 3440, 3850, +3935, 3480, 3822, +3892, 3529, 3781, +3829, 3587, 3719, +3726, 3654, 3620, +3539, 3732, 3443, +3019, 3818, 2979, +4095, 3353, 4027, +4095, 3353, 4027, +4095, 3353, 4027, +4095, 3353, 4027, +4095, 3353, 4026, +4095, 3353, 4026, +4095, 3353, 4026, +4095, 3353, 4026, +4095, 3354, 4026, +4095, 3354, 4026, +4095, 3354, 4026, +4095, 3355, 4026, +4095, 3356, 4025, +4095, 3357, 4025, +4095, 3359, 4024, +4095, 3361, 4024, +4095, 3363, 4023, +4095, 3367, 4021, +4095, 3372, 4019, +4095, 3378, 4017, +4095, 3387, 4013, +4095, 3397, 4009, +4095, 3412, 4003, +4095, 3430, 3994, +4095, 3454, 3983, +4095, 3483, 3967, +4095, 3520, 3945, +4082, 3565, 3914, +4041, 3619, 3869, +3979, 3682, 3800, +3881, 3755, 3689, +3706, 3837, 3477, +4095, 3421, 4095, +4095, 3421, 4095, +4095, 3421, 4095, +4095, 3421, 4095, +4095, 3421, 4095, +4095, 3421, 4095, +4095, 3422, 4095, +4095, 3422, 4095, +4095, 3422, 4095, +4095, 3422, 4095, +4095, 3423, 4095, +4095, 3423, 4095, +4095, 3424, 4095, +4095, 3425, 4095, +4095, 3426, 4095, +4095, 3428, 4095, +4095, 3431, 4095, +4095, 3434, 4095, +4095, 3438, 4095, +4095, 3443, 4095, +4095, 3451, 4095, +4095, 3460, 4095, +4095, 3473, 4095, +4095, 3489, 4095, +4095, 3509, 4095, +4095, 3536, 4087, +4095, 3568, 4071, +4095, 3609, 4047, +4095, 3658, 4014, +4095, 3717, 3965, +4095, 3785, 3891, +4030, 3862, 3767, +0, 3184, 3454, +0, 3184, 3454, +0, 3185, 3454, +0, 3185, 3453, +0, 3185, 3453, +0, 3185, 3453, +0, 3185, 3453, +0, 3185, 3453, +0, 3186, 3452, +0, 3186, 3452, +0, 3187, 3451, +0, 3188, 3450, +0, 3189, 3449, +0, 3191, 3448, +0, 3193, 3446, +0, 3196, 3443, +0, 3200, 3439, +0, 3205, 3434, +0, 3212, 3427, +0, 3221, 3418, +0, 3233, 3405, +0, 3248, 3388, +0, 3268, 3363, +0, 3293, 3328, +0, 3324, 3276, +0, 3363, 3196, +0, 3410, 3061, +0, 3467, 2779, +0, 3533, 0, +0, 3608, 0, +0, 3693, 0, +0, 3786, 0, +0, 3184, 3454, +0, 3184, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3453, +0, 3185, 3453, +0, 3185, 3453, +0, 3185, 3453, +0, 3186, 3452, +0, 3186, 3452, +0, 3187, 3451, +0, 3188, 3451, +0, 3189, 3449, +0, 3191, 3448, +0, 3193, 3446, +0, 3196, 3443, +0, 3200, 3439, +0, 3205, 3434, +0, 3212, 3427, +0, 3221, 3418, +0, 3233, 3405, +0, 3248, 3388, +0, 3268, 3363, +0, 3293, 3328, +0, 3324, 3276, +0, 3363, 3196, +0, 3410, 3061, +0, 3467, 2779, +0, 3533, 0, +0, 3608, 0, +0, 3693, 0, +0, 3786, 0, +0, 3184, 3454, +0, 3184, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3453, +0, 3185, 3453, +0, 3185, 3453, +0, 3186, 3453, +0, 3186, 3452, +0, 3187, 3451, +0, 3188, 3451, +0, 3189, 3449, +0, 3191, 3448, +0, 3193, 3446, +0, 3196, 3443, +0, 3200, 3439, +0, 3205, 3434, +0, 3212, 3428, +0, 3221, 3418, +0, 3233, 3406, +0, 3248, 3388, +0, 3268, 3363, +0, 3293, 3328, +0, 3324, 3277, +0, 3363, 3197, +0, 3411, 3062, +0, 3467, 2780, +0, 3533, 0, +0, 3608, 0, +0, 3693, 0, +0, 3786, 0, +0, 3184, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3453, +0, 3185, 3453, +0, 3186, 3453, +0, 3186, 3452, +0, 3187, 3452, +0, 3188, 3451, +0, 3189, 3450, +0, 3191, 3448, +0, 3193, 3446, +0, 3196, 3443, +0, 3200, 3440, +0, 3205, 3434, +0, 3212, 3428, +0, 3221, 3418, +0, 3233, 3406, +0, 3248, 3388, +0, 3268, 3364, +0, 3293, 3328, +0, 3324, 3277, +0, 3363, 3197, +0, 3411, 3062, +0, 3467, 2780, +0, 3533, 0, +0, 3608, 0, +0, 3693, 0, +0, 3786, 0, +0, 3184, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3453, +0, 3186, 3453, +0, 3186, 3453, +0, 3186, 3452, +0, 3187, 3452, +0, 3188, 3451, +0, 3189, 3450, +0, 3191, 3448, +0, 3193, 3446, +0, 3196, 3443, +0, 3200, 3440, +0, 3205, 3435, +0, 3212, 3428, +0, 3221, 3419, +0, 3233, 3406, +0, 3248, 3388, +0, 3268, 3364, +0, 3293, 3329, +0, 3324, 3277, +0, 3363, 3197, +0, 3411, 3062, +0, 3467, 2781, +0, 3533, 0, +0, 3608, 0, +0, 3693, 0, +0, 3786, 0, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3186, 3453, +0, 3186, 3453, +0, 3186, 3453, +0, 3187, 3452, +0, 3188, 3451, +0, 3189, 3450, +0, 3191, 3448, +0, 3193, 3446, +0, 3196, 3444, +0, 3200, 3440, +0, 3205, 3435, +0, 3212, 3428, +0, 3221, 3419, +0, 3233, 3406, +0, 3248, 3389, +0, 3268, 3364, +0, 3293, 3329, +0, 3324, 3277, +0, 3363, 3198, +0, 3411, 3063, +0, 3467, 2782, +0, 3533, 0, +0, 3608, 0, +0, 3693, 0, +0, 3786, 0, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3185, 3454, +0, 3186, 3454, +0, 3186, 3453, +0, 3187, 3453, +0, 3187, 3452, +0, 3188, 3451, +0, 3189, 3450, +0, 3191, 3449, +0, 3193, 3447, +0, 3196, 3444, +0, 3200, 3440, +0, 3205, 3435, +0, 3212, 3428, +0, 3221, 3419, +0, 3233, 3406, +0, 3248, 3389, +0, 3268, 3364, +0, 3293, 3329, +0, 3324, 3278, +0, 3363, 3198, +0, 3411, 3064, +0, 3467, 2783, +0, 3533, 0, +0, 3609, 0, +0, 3693, 0, +0, 3786, 0, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3454, +0, 3186, 3454, +0, 3186, 3454, +0, 3187, 3453, +0, 3187, 3453, +0, 3188, 3452, +0, 3190, 3451, +0, 3191, 3449, +0, 3193, 3447, +0, 3196, 3444, +0, 3200, 3441, +0, 3205, 3436, +0, 3212, 3429, +0, 3221, 3420, +0, 3233, 3407, +0, 3248, 3389, +0, 3268, 3365, +0, 3293, 3330, +0, 3324, 3278, +0, 3363, 3199, +0, 3411, 3065, +0, 3467, 2785, +0, 3533, 0, +0, 3609, 0, +0, 3693, 0, +0, 3786, 0, +0, 3185, 3456, +0, 3185, 3456, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3185, 3455, +0, 3186, 3455, +0, 3186, 3455, +0, 3186, 3454, +0, 3187, 3454, +0, 3187, 3453, +0, 3188, 3452, +0, 3190, 3451, +0, 3191, 3450, +0, 3194, 3448, +0, 3197, 3445, +0, 3200, 3441, +0, 3206, 3436, +0, 3212, 3429, +0, 3221, 3420, +0, 3233, 3407, +0, 3248, 3390, +0, 3268, 3365, +0, 3293, 3331, +0, 3325, 3279, +0, 3363, 3200, +0, 3411, 3066, +0, 3467, 2787, +0, 3533, 0, +0, 3609, 0, +0, 3693, 0, +0, 3786, 0, +0, 3185, 3456, +0, 3185, 3456, +0, 3185, 3456, +0, 3185, 3456, +0, 3185, 3456, +0, 3186, 3456, +0, 3186, 3456, +0, 3186, 3455, +0, 3186, 3455, +0, 3187, 3455, +0, 3188, 3454, +0, 3189, 3453, +0, 3190, 3452, +0, 3192, 3450, +0, 3194, 3448, +0, 3197, 3446, +0, 3201, 3442, +0, 3206, 3437, +0, 3213, 3430, +0, 3222, 3421, +0, 3233, 3408, +0, 3249, 3391, +0, 3268, 3366, +0, 3293, 3331, +0, 3325, 3280, +0, 3364, 3201, +0, 3411, 3067, +0, 3467, 2790, +0, 3533, 0, +0, 3609, 0, +0, 3693, 0, +0, 3786, 0, +0, 3185, 3457, +0, 3185, 3457, +0, 3185, 3457, +0, 3185, 3457, +0, 3186, 3457, +0, 3186, 3457, +0, 3186, 3457, +0, 3186, 3456, +0, 3187, 3456, +0, 3187, 3456, +0, 3188, 3455, +0, 3189, 3454, +0, 3190, 3453, +0, 3192, 3451, +0, 3194, 3449, +0, 3197, 3447, +0, 3201, 3443, +0, 3206, 3438, +0, 3213, 3431, +0, 3222, 3422, +0, 3234, 3409, +0, 3249, 3392, +0, 3268, 3368, +0, 3293, 3333, +0, 3325, 3282, +0, 3364, 3203, +0, 3411, 3070, +0, 3467, 2794, +0, 3533, 0, +0, 3609, 0, +0, 3693, 0, +0, 3786, 0, +0, 3186, 3459, +0, 3186, 3458, +0, 3186, 3458, +0, 3186, 3458, +0, 3186, 3458, +0, 3186, 3458, +0, 3186, 3458, +0, 3187, 3458, +0, 3187, 3457, +0, 3188, 3457, +0, 3188, 3456, +0, 3189, 3455, +0, 3190, 3454, +0, 3192, 3453, +0, 3194, 3451, +0, 3197, 3448, +0, 3201, 3444, +0, 3206, 3439, +0, 3213, 3432, +0, 3222, 3423, +0, 3234, 3411, +0, 3249, 3393, +0, 3269, 3369, +0, 3294, 3334, +0, 3325, 3283, +0, 3364, 3205, +0, 3411, 3073, +0, 3468, 2800, +0, 3533, 0, +0, 3609, 0, +0, 3693, 0, +0, 3786, 0, +0, 3186, 3460, +0, 3186, 3460, +0, 3186, 3460, +0, 3186, 3460, +0, 3186, 3460, +0, 3187, 3460, +0, 3187, 3460, +0, 3187, 3459, +0, 3187, 3459, +0, 3188, 3458, +0, 3189, 3458, +0, 3190, 3457, +0, 3191, 3456, +0, 3193, 3454, +0, 3195, 3452, +0, 3198, 3450, +0, 3202, 3446, +0, 3207, 3441, +0, 3214, 3434, +0, 3223, 3425, +0, 3234, 3413, +0, 3250, 3395, +0, 3269, 3371, +0, 3294, 3337, +0, 3325, 3286, +0, 3364, 3208, +0, 3411, 3077, +0, 3468, 2807, +0, 3534, 0, +0, 3609, 0, +0, 3694, 0, +0, 3787, 0, +0, 3187, 3462, +0, 3187, 3462, +0, 3187, 3462, +0, 3187, 3462, +0, 3187, 3462, +0, 3187, 3462, +0, 3187, 3462, +0, 3188, 3462, +0, 3188, 3461, +0, 3189, 3461, +0, 3189, 3460, +0, 3190, 3459, +0, 3191, 3458, +0, 3193, 3457, +0, 3195, 3455, +0, 3198, 3452, +0, 3202, 3448, +0, 3207, 3443, +0, 3214, 3437, +0, 3223, 3428, +0, 3235, 3415, +0, 3250, 3398, +0, 3270, 3374, +0, 3295, 3339, +0, 3326, 3289, +0, 3365, 3212, +0, 3412, 3082, +0, 3468, 2816, +0, 3534, 0, +0, 3609, 0, +0, 3694, 0, +0, 3787, 0, +0, 3187, 3465, +0, 3187, 3465, +0, 3187, 3465, +0, 3188, 3465, +0, 3188, 3465, +0, 3188, 3465, +0, 3188, 3465, +0, 3188, 3465, +0, 3189, 3464, +0, 3189, 3464, +0, 3190, 3463, +0, 3191, 3462, +0, 3192, 3461, +0, 3194, 3460, +0, 3196, 3458, +0, 3199, 3455, +0, 3203, 3451, +0, 3208, 3446, +0, 3215, 3440, +0, 3224, 3431, +0, 3235, 3418, +0, 3251, 3401, +0, 3270, 3377, +0, 3295, 3343, +0, 3326, 3293, +0, 3365, 3217, +0, 3412, 3089, +0, 3469, 2829, +0, 3534, 0, +0, 3610, 0, +0, 3694, 0, +0, 3787, 0, +0, 3188, 3469, +0, 3188, 3469, +0, 3188, 3469, +0, 3189, 3469, +0, 3189, 3469, +0, 3189, 3469, +0, 3189, 3469, +0, 3189, 3468, +0, 3190, 3468, +0, 3190, 3468, +0, 3191, 3467, +0, 3192, 3466, +0, 3193, 3465, +0, 3195, 3464, +0, 3197, 3462, +0, 3200, 3459, +0, 3204, 3455, +0, 3209, 3451, +0, 3216, 3444, +0, 3225, 3435, +0, 3236, 3423, +0, 3252, 3406, +0, 3271, 3382, +0, 3296, 3349, +0, 3327, 3299, +0, 3366, 3224, +0, 3413, 3098, +0, 3469, 2844, +0, 3535, 106, +0, 3610, 0, +0, 3694, 0, +0, 3787, 0, +0, 3190, 3475, +0, 3190, 3475, +0, 3190, 3474, +0, 3190, 3474, +0, 3190, 3474, +0, 3190, 3474, +0, 3190, 3474, +0, 3191, 3474, +0, 3191, 3473, +0, 3192, 3473, +0, 3192, 3472, +0, 3193, 3471, +0, 3195, 3470, +0, 3196, 3469, +0, 3198, 3467, +0, 3201, 3464, +0, 3205, 3461, +0, 3210, 3456, +0, 3217, 3449, +0, 3226, 3441, +0, 3238, 3429, +0, 3253, 3412, +0, 3272, 3389, +0, 3297, 3355, +0, 3328, 3307, +0, 3367, 3233, +0, 3414, 3109, +0, 3470, 2865, +0, 3535, 1466, +0, 3611, 0, +0, 3695, 0, +0, 3788, 0, +0, 3192, 3481, +0, 3192, 3481, +0, 3192, 3481, +0, 3192, 3481, +0, 3192, 3481, +0, 3192, 3481, +0, 3192, 3481, +0, 3193, 3481, +0, 3193, 3480, +0, 3193, 3480, +0, 3194, 3479, +0, 3195, 3478, +0, 3196, 3477, +0, 3198, 3476, +0, 3200, 3474, +0, 3203, 3471, +0, 3207, 3468, +0, 3212, 3463, +0, 3219, 3457, +0, 3228, 3448, +0, 3239, 3436, +0, 3254, 3420, +0, 3274, 3397, +0, 3298, 3364, +0, 3329, 3317, +0, 3368, 3244, +0, 3415, 3125, +0, 3471, 2891, +0, 3536, 1839, +0, 3611, 0, +0, 3695, 0, +0, 3788, 0, +0, 3194, 3491, +0, 3194, 3491, +0, 3194, 3490, +0, 3194, 3490, +0, 3194, 3490, +0, 3194, 3490, +0, 3195, 3490, +0, 3195, 3490, +0, 3195, 3489, +0, 3196, 3489, +0, 3197, 3488, +0, 3197, 3488, +0, 3199, 3487, +0, 3200, 3485, +0, 3202, 3483, +0, 3205, 3481, +0, 3209, 3477, +0, 3214, 3473, +0, 3221, 3466, +0, 3230, 3458, +0, 3241, 3446, +0, 3256, 3430, +0, 3276, 3408, +0, 3300, 3376, +0, 3331, 3330, +0, 3370, 3259, +0, 3416, 3144, +0, 3472, 2923, +0, 3537, 2093, +0, 3612, 0, +0, 3696, 0, +0, 3789, 0, +0, 3197, 3502, +0, 3197, 3502, +0, 3197, 3502, +0, 3197, 3502, +0, 3197, 3502, +0, 3198, 3502, +0, 3198, 3502, +0, 3198, 3502, +0, 3199, 3501, +0, 3199, 3501, +0, 3200, 3500, +0, 3201, 3500, +0, 3202, 3498, +0, 3203, 3497, +0, 3206, 3495, +0, 3209, 3493, +0, 3212, 3489, +0, 3217, 3485, +0, 3224, 3479, +0, 3233, 3471, +0, 3244, 3459, +0, 3259, 3444, +0, 3278, 3422, +0, 3303, 3391, +0, 3334, 3347, +0, 3372, 3279, +0, 3418, 3169, +0, 3474, 2963, +0, 3539, 2299, +0, 3613, 0, +0, 3697, 0, +0, 3790, 0, +0, 3201, 3518, +0, 3201, 3518, +0, 3202, 3518, +0, 3202, 3518, +0, 3202, 3518, +0, 3202, 3517, +0, 3202, 3517, +0, 3202, 3517, +0, 3203, 3517, +0, 3203, 3516, +0, 3204, 3516, +0, 3205, 3515, +0, 3206, 3514, +0, 3208, 3513, +0, 3210, 3511, +0, 3213, 3508, +0, 3216, 3505, +0, 3221, 3501, +0, 3228, 3495, +0, 3237, 3487, +0, 3248, 3476, +0, 3263, 3461, +0, 3282, 3440, +0, 3306, 3411, +0, 3337, 3368, +0, 3375, 3304, +0, 3421, 3201, +0, 3476, 3012, +0, 3541, 2479, +0, 3615, 0, +0, 3699, 0, +0, 3791, 0, +0, 3207, 3538, +0, 3207, 3538, +0, 3207, 3537, +0, 3207, 3537, +0, 3207, 3537, +0, 3207, 3537, +0, 3208, 3537, +0, 3208, 3537, +0, 3208, 3537, +0, 3209, 3536, +0, 3210, 3536, +0, 3210, 3535, +0, 3212, 3534, +0, 3213, 3533, +0, 3215, 3531, +0, 3218, 3529, +0, 3222, 3526, +0, 3227, 3521, +0, 3233, 3516, +0, 3242, 3508, +0, 3253, 3498, +0, 3268, 3483, +0, 3287, 3464, +0, 3311, 3436, +0, 3341, 3395, +0, 3379, 3335, +0, 3424, 3240, +0, 3479, 3069, +0, 3544, 2644, +0, 3617, 0, +0, 3701, 0, +0, 3792, 0, +1728, 3214, 3563, +1725, 3214, 3563, +1722, 3215, 3563, +1717, 3215, 3563, +1710, 3215, 3563, +1701, 3215, 3562, +1688, 3215, 3562, +1671, 3215, 3562, +1647, 3216, 3562, +1612, 3216, 3561, +1562, 3217, 3561, +1483, 3218, 3560, +1352, 3219, 3559, +1082, 3220, 3558, +0, 3223, 3557, +0, 3225, 3554, +0, 3229, 3551, +0, 3234, 3548, +0, 3240, 3542, +0, 3249, 3535, +0, 3260, 3525, +0, 3274, 3512, +0, 3293, 3493, +0, 3317, 3467, +0, 3346, 3429, +0, 3384, 3374, +0, 3429, 3287, +0, 3483, 3137, +0, 3547, 2799, +0, 3620, 0, +0, 3703, 0, +0, 3794, 0, +2722, 3224, 3594, +2721, 3224, 3594, +2721, 3224, 3594, +2720, 3224, 3594, +2720, 3224, 3594, +2719, 3225, 3594, +2717, 3225, 3594, +2716, 3225, 3594, +2713, 3225, 3593, +2710, 3226, 3593, +2706, 3227, 3593, +2700, 3227, 3592, +2692, 3229, 3591, +2681, 3230, 3590, +2666, 3232, 3589, +2646, 3235, 3587, +2617, 3238, 3584, +2574, 3243, 3580, +2511, 3250, 3575, +2410, 3258, 3569, +2224, 3269, 3559, +1718, 3283, 3547, +0, 3301, 3530, +0, 3324, 3506, +0, 3354, 3471, +0, 3390, 3421, +0, 3435, 3343, +0, 3489, 3214, +0, 3552, 2948, +0, 3624, 0, +0, 3706, 0, +0, 3797, 0, +3077, 3237, 3634, +3077, 3237, 3634, +3077, 3237, 3633, +3077, 3237, 3633, +3076, 3237, 3633, +3076, 3237, 3633, +3075, 3237, 3633, +3075, 3238, 3633, +3073, 3238, 3633, +3072, 3239, 3632, +3070, 3239, 3632, +3068, 3240, 3631, +3064, 3241, 3631, +3059, 3243, 3630, +3053, 3245, 3628, +3044, 3247, 3626, +3032, 3251, 3624, +3016, 3255, 3621, +2993, 3262, 3616, +2960, 3270, 3610, +2913, 3280, 3602, +2840, 3294, 3590, +2720, 3312, 3575, +2485, 3335, 3553, +1404, 3363, 3522, +0, 3399, 3477, +0, 3443, 3409, +0, 3496, 3299, +0, 3558, 3092, +0, 3630, 2417, +0, 3711, 0, +0, 3801, 0, +3325, 3253, 3681, +3325, 3253, 3681, +3325, 3253, 3681, +3325, 3253, 3681, +3325, 3254, 3681, +3325, 3254, 3681, +3324, 3254, 3681, +3324, 3254, 3681, +3323, 3254, 3680, +3322, 3255, 3680, +3321, 3255, 3680, +3320, 3256, 3679, +3318, 3257, 3678, +3315, 3259, 3678, +3311, 3261, 3676, +3306, 3263, 3675, +3300, 3267, 3672, +3291, 3271, 3669, +3278, 3277, 3665, +3261, 3285, 3660, +3237, 3295, 3652, +3203, 3308, 3642, +3153, 3326, 3628, +3076, 3348, 3609, +2947, 3376, 3582, +2685, 3411, 3543, +0, 3454, 3485, +0, 3505, 3394, +0, 3566, 3233, +0, 3637, 2852, +0, 3717, 0, +0, 3805, 0, +3528, 3274, 3738, +3528, 3274, 3738, +3528, 3274, 3738, +3528, 3274, 3738, +3528, 3275, 3738, +3528, 3275, 3738, +3527, 3275, 3737, +3527, 3275, 3737, +3527, 3275, 3737, +3526, 3276, 3737, +3525, 3276, 3737, +3525, 3277, 3736, +3523, 3278, 3735, +3522, 3280, 3735, +3519, 3281, 3734, +3516, 3284, 3732, +3512, 3287, 3730, +3506, 3291, 3728, +3499, 3297, 3724, +3488, 3305, 3719, +3474, 3314, 3713, +3454, 3327, 3704, +3426, 3344, 3692, +3385, 3365, 3675, +3324, 3392, 3652, +3228, 3426, 3618, +3055, 3467, 3570, +2618, 3517, 3495, +0, 3577, 3371, +0, 3646, 3125, +0, 3724, 1639, +0, 3812, 0, +3707, 3301, 3804, +3707, 3301, 3804, +3707, 3301, 3804, +3707, 3301, 3804, +3707, 3301, 3804, +3706, 3301, 3804, +3706, 3302, 3804, +3706, 3302, 3804, +3706, 3302, 3803, +3705, 3303, 3803, +3705, 3303, 3803, +3704, 3304, 3803, +3703, 3305, 3802, +3702, 3306, 3801, +3701, 3308, 3800, +3699, 3310, 3799, +3696, 3313, 3797, +3692, 3317, 3795, +3687, 3323, 3792, +3680, 3330, 3788, +3671, 3339, 3782, +3658, 3351, 3775, +3640, 3367, 3764, +3615, 3387, 3750, +3580, 3413, 3730, +3527, 3445, 3703, +3446, 3485, 3663, +3308, 3533, 3603, +3017, 3591, 3508, +0, 3658, 3340, +0, 3734, 2924, +0, 3820, 0, +3871, 3334, 3880, +3871, 3334, 3880, +3871, 3335, 3880, +3871, 3335, 3880, +3871, 3335, 3880, +3871, 3335, 3880, +3870, 3335, 3880, +3870, 3335, 3879, +3870, 3335, 3879, +3870, 3336, 3879, +3869, 3336, 3879, +3869, 3337, 3879, +3868, 3338, 3878, +3868, 3339, 3878, +3867, 3341, 3877, +3865, 3343, 3876, +3863, 3346, 3874, +3861, 3349, 3872, +3857, 3354, 3870, +3852, 3361, 3866, +3846, 3370, 3862, +3837, 3381, 3855, +3825, 3396, 3846, +3809, 3415, 3835, +3786, 3439, 3818, +3753, 3470, 3796, +3706, 3507, 3763, +3633, 3554, 3716, +3513, 3609, 3644, +3279, 3673, 3525, +2216, 3748, 3294, +0, 3831, 2303, +4025, 3376, 3965, +4025, 3376, 3965, +4025, 3376, 3965, +4025, 3376, 3965, +4025, 3376, 3965, +4025, 3376, 3965, +4025, 3376, 3964, +4025, 3376, 3964, +4025, 3377, 3964, +4025, 3377, 3964, +4024, 3377, 3964, +4024, 3378, 3964, +4024, 3379, 3963, +4023, 3380, 3963, +4022, 3381, 3962, +4021, 3383, 3961, +4020, 3386, 3960, +4018, 3389, 3958, +4016, 3394, 3956, +4012, 3400, 3953, +4008, 3408, 3950, +4002, 3418, 3944, +3993, 3432, 3937, +3982, 3450, 3928, +3967, 3472, 3914, +3945, 3501, 3896, +3914, 3536, 3870, +3870, 3579, 3833, +3803, 3632, 3779, +3693, 3693, 3693, +3489, 3765, 3547, +2837, 3845, 3224, +4095, 3425, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3426, 4058, +4095, 3427, 4057, +4095, 3427, 4057, +4095, 3428, 4057, +4095, 3428, 4057, +4095, 3429, 4056, +4095, 3431, 4056, +4095, 3432, 4055, +4095, 3435, 4054, +4095, 3438, 4053, +4095, 3442, 4051, +4095, 3447, 4049, +4095, 3455, 4046, +4095, 3464, 4041, +4095, 3476, 4036, +4095, 3492, 4028, +4095, 3513, 4017, +4095, 3539, 4003, +4095, 3572, 3982, +4067, 3612, 3954, +4024, 3661, 3913, +3961, 3719, 3851, +3858, 3787, 3752, +3671, 3864, 3575, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3485, 4095, +4095, 3486, 4095, +4095, 3486, 4095, +4095, 3486, 4095, +4095, 3487, 4095, +4095, 3488, 4095, +4095, 3489, 4095, +4095, 3491, 4095, +4095, 3493, 4095, +4095, 3495, 4095, +4095, 3499, 4095, +4095, 3504, 4095, +4095, 3510, 4095, +4095, 3519, 4095, +4095, 3530, 4095, +4095, 3544, 4095, +4095, 3562, 4095, +4095, 3586, 4095, +4095, 3615, 4095, +4095, 3652, 4077, +4095, 3697, 4046, +4095, 3751, 4001, +4095, 3814, 3932, +4014, 3887, 3821, +0, 3316, 3586, +0, 3316, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3585, +0, 3317, 3585, +0, 3317, 3585, +0, 3317, 3585, +0, 3318, 3584, +0, 3318, 3584, +0, 3319, 3583, +0, 3320, 3582, +0, 3321, 3581, +0, 3323, 3580, +0, 3325, 3578, +0, 3328, 3575, +0, 3332, 3571, +0, 3337, 3566, +0, 3344, 3559, +0, 3353, 3550, +0, 3365, 3537, +0, 3380, 3520, +0, 3400, 3495, +0, 3425, 3460, +0, 3456, 3408, +0, 3495, 3328, +0, 3543, 3193, +0, 3599, 2911, +0, 3665, 0, +0, 3740, 0, +0, 3825, 0, +0, 3316, 3586, +0, 3316, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3585, +0, 3317, 3585, +0, 3317, 3585, +0, 3317, 3585, +0, 3318, 3585, +0, 3318, 3584, +0, 3319, 3583, +0, 3320, 3583, +0, 3321, 3581, +0, 3323, 3580, +0, 3325, 3578, +0, 3328, 3575, +0, 3332, 3571, +0, 3337, 3566, +0, 3344, 3559, +0, 3353, 3550, +0, 3365, 3537, +0, 3380, 3520, +0, 3400, 3495, +0, 3425, 3460, +0, 3456, 3408, +0, 3495, 3328, +0, 3543, 3193, +0, 3599, 2911, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3316, 3586, +0, 3316, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3585, +0, 3317, 3585, +0, 3318, 3585, +0, 3318, 3585, +0, 3318, 3584, +0, 3319, 3583, +0, 3320, 3583, +0, 3321, 3581, +0, 3323, 3580, +0, 3325, 3578, +0, 3328, 3575, +0, 3332, 3571, +0, 3337, 3566, +0, 3344, 3560, +0, 3353, 3550, +0, 3365, 3538, +0, 3380, 3520, +0, 3400, 3495, +0, 3425, 3460, +0, 3456, 3408, +0, 3495, 3329, +0, 3543, 3194, +0, 3599, 2911, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3316, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3585, +0, 3317, 3585, +0, 3318, 3585, +0, 3318, 3585, +0, 3318, 3584, +0, 3319, 3584, +0, 3320, 3583, +0, 3321, 3582, +0, 3323, 3580, +0, 3325, 3578, +0, 3328, 3575, +0, 3332, 3571, +0, 3337, 3566, +0, 3344, 3560, +0, 3353, 3550, +0, 3365, 3538, +0, 3380, 3520, +0, 3400, 3495, +0, 3425, 3460, +0, 3456, 3409, +0, 3495, 3329, +0, 3543, 3194, +0, 3599, 2912, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3585, +0, 3318, 3585, +0, 3318, 3585, +0, 3318, 3584, +0, 3319, 3584, +0, 3320, 3583, +0, 3321, 3582, +0, 3323, 3580, +0, 3325, 3578, +0, 3328, 3575, +0, 3332, 3572, +0, 3337, 3567, +0, 3344, 3560, +0, 3353, 3551, +0, 3365, 3538, +0, 3380, 3520, +0, 3400, 3496, +0, 3425, 3460, +0, 3456, 3409, +0, 3495, 3329, +0, 3543, 3194, +0, 3599, 2912, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3318, 3585, +0, 3318, 3585, +0, 3319, 3584, +0, 3319, 3584, +0, 3320, 3583, +0, 3321, 3582, +0, 3323, 3580, +0, 3325, 3578, +0, 3328, 3576, +0, 3332, 3572, +0, 3337, 3567, +0, 3344, 3560, +0, 3353, 3551, +0, 3365, 3538, +0, 3380, 3520, +0, 3400, 3496, +0, 3425, 3461, +0, 3456, 3409, +0, 3495, 3329, +0, 3543, 3194, +0, 3599, 2913, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3318, 3586, +0, 3318, 3585, +0, 3319, 3585, +0, 3319, 3584, +0, 3320, 3583, +0, 3321, 3582, +0, 3323, 3581, +0, 3325, 3579, +0, 3328, 3576, +0, 3332, 3572, +0, 3337, 3567, +0, 3344, 3560, +0, 3353, 3551, +0, 3365, 3538, +0, 3380, 3521, +0, 3400, 3496, +0, 3425, 3461, +0, 3456, 3409, +0, 3495, 3330, +0, 3543, 3195, +0, 3599, 2914, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3586, +0, 3317, 3586, +0, 3317, 3586, +0, 3318, 3586, +0, 3318, 3585, +0, 3319, 3585, +0, 3319, 3584, +0, 3320, 3584, +0, 3322, 3582, +0, 3323, 3581, +0, 3325, 3579, +0, 3328, 3576, +0, 3332, 3572, +0, 3338, 3567, +0, 3344, 3561, +0, 3353, 3551, +0, 3365, 3539, +0, 3380, 3521, +0, 3400, 3496, +0, 3425, 3461, +0, 3456, 3410, +0, 3495, 3330, +0, 3543, 3196, +0, 3599, 2915, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3318, 3587, +0, 3318, 3586, +0, 3318, 3586, +0, 3319, 3585, +0, 3319, 3585, +0, 3320, 3584, +0, 3322, 3583, +0, 3323, 3581, +0, 3326, 3579, +0, 3328, 3576, +0, 3332, 3573, +0, 3338, 3568, +0, 3344, 3561, +0, 3353, 3552, +0, 3365, 3539, +0, 3380, 3521, +0, 3400, 3497, +0, 3425, 3462, +0, 3457, 3410, +0, 3495, 3331, +0, 3543, 3197, +0, 3599, 2917, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3587, +0, 3317, 3587, +0, 3317, 3587, +0, 3318, 3587, +0, 3318, 3587, +0, 3318, 3586, +0, 3319, 3586, +0, 3320, 3585, +0, 3321, 3584, +0, 3322, 3583, +0, 3323, 3582, +0, 3326, 3580, +0, 3329, 3577, +0, 3333, 3573, +0, 3338, 3568, +0, 3345, 3561, +0, 3354, 3552, +0, 3365, 3540, +0, 3381, 3522, +0, 3400, 3498, +0, 3425, 3463, +0, 3457, 3411, +0, 3496, 3332, +0, 3543, 3198, +0, 3599, 2919, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3588, +0, 3317, 3588, +0, 3318, 3588, +0, 3318, 3588, +0, 3318, 3587, +0, 3319, 3587, +0, 3319, 3587, +0, 3320, 3586, +0, 3321, 3585, +0, 3322, 3584, +0, 3324, 3583, +0, 3326, 3580, +0, 3329, 3578, +0, 3333, 3574, +0, 3338, 3569, +0, 3345, 3562, +0, 3354, 3553, +0, 3365, 3540, +0, 3381, 3523, +0, 3400, 3498, +0, 3425, 3464, +0, 3457, 3412, +0, 3496, 3333, +0, 3543, 3200, +0, 3599, 2922, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3317, 3589, +0, 3317, 3589, +0, 3317, 3589, +0, 3317, 3589, +0, 3318, 3589, +0, 3318, 3589, +0, 3318, 3589, +0, 3318, 3589, +0, 3318, 3588, +0, 3319, 3588, +0, 3319, 3588, +0, 3320, 3587, +0, 3321, 3586, +0, 3322, 3585, +0, 3324, 3583, +0, 3326, 3581, +0, 3329, 3579, +0, 3333, 3575, +0, 3338, 3570, +0, 3345, 3563, +0, 3354, 3554, +0, 3366, 3541, +0, 3381, 3524, +0, 3401, 3500, +0, 3426, 3465, +0, 3457, 3414, +0, 3496, 3335, +0, 3543, 3202, +0, 3600, 2927, +0, 3665, 0, +0, 3741, 0, +0, 3825, 0, +0, 3318, 3591, +0, 3318, 3591, +0, 3318, 3591, +0, 3318, 3590, +0, 3318, 3590, +0, 3318, 3590, +0, 3318, 3590, +0, 3318, 3590, +0, 3319, 3590, +0, 3319, 3589, +0, 3320, 3589, +0, 3320, 3588, +0, 3321, 3587, +0, 3323, 3586, +0, 3324, 3585, +0, 3326, 3583, +0, 3329, 3580, +0, 3333, 3576, +0, 3338, 3571, +0, 3345, 3565, +0, 3354, 3555, +0, 3366, 3543, +0, 3381, 3525, +0, 3401, 3501, +0, 3426, 3466, +0, 3457, 3415, +0, 3496, 3337, +0, 3543, 3205, +0, 3600, 2932, +0, 3666, 0, +0, 3741, 0, +0, 3826, 0, +0, 3318, 3592, +0, 3318, 3592, +0, 3318, 3592, +0, 3318, 3592, +0, 3318, 3592, +0, 3318, 3592, +0, 3319, 3592, +0, 3319, 3592, +0, 3319, 3591, +0, 3320, 3591, +0, 3320, 3591, +0, 3321, 3590, +0, 3322, 3589, +0, 3323, 3588, +0, 3325, 3586, +0, 3327, 3584, +0, 3330, 3582, +0, 3334, 3578, +0, 3339, 3573, +0, 3346, 3566, +0, 3355, 3557, +0, 3366, 3545, +0, 3382, 3527, +0, 3401, 3503, +0, 3426, 3469, +0, 3458, 3418, +0, 3496, 3340, +0, 3544, 3209, +0, 3600, 2939, +0, 3666, 0, +0, 3741, 0, +0, 3826, 0, +0, 3319, 3595, +0, 3319, 3595, +0, 3319, 3594, +0, 3319, 3594, +0, 3319, 3594, +0, 3319, 3594, +0, 3319, 3594, +0, 3319, 3594, +0, 3320, 3594, +0, 3320, 3593, +0, 3321, 3593, +0, 3321, 3592, +0, 3322, 3591, +0, 3324, 3590, +0, 3325, 3589, +0, 3327, 3587, +0, 3330, 3584, +0, 3334, 3580, +0, 3339, 3575, +0, 3346, 3569, +0, 3355, 3560, +0, 3367, 3547, +0, 3382, 3530, +0, 3402, 3506, +0, 3427, 3472, +0, 3458, 3421, +0, 3497, 3344, +0, 3544, 3214, +0, 3600, 2948, +0, 3666, 0, +0, 3741, 0, +0, 3826, 0, +0, 3319, 3598, +0, 3319, 3597, +0, 3320, 3597, +0, 3320, 3597, +0, 3320, 3597, +0, 3320, 3597, +0, 3320, 3597, +0, 3320, 3597, +0, 3320, 3597, +0, 3321, 3596, +0, 3321, 3596, +0, 3322, 3595, +0, 3323, 3594, +0, 3324, 3593, +0, 3326, 3592, +0, 3328, 3590, +0, 3331, 3587, +0, 3335, 3583, +0, 3340, 3579, +0, 3347, 3572, +0, 3356, 3563, +0, 3368, 3550, +0, 3383, 3533, +0, 3402, 3510, +0, 3427, 3475, +0, 3459, 3426, +0, 3497, 3349, +0, 3544, 3221, +0, 3601, 2961, +0, 3666, 0, +0, 3742, 0, +0, 3826, 0, +0, 3320, 3601, +0, 3320, 3601, +0, 3321, 3601, +0, 3321, 3601, +0, 3321, 3601, +0, 3321, 3601, +0, 3321, 3601, +0, 3321, 3601, +0, 3321, 3601, +0, 3322, 3600, +0, 3322, 3600, +0, 3323, 3599, +0, 3324, 3598, +0, 3325, 3597, +0, 3327, 3596, +0, 3329, 3594, +0, 3332, 3591, +0, 3336, 3587, +0, 3341, 3583, +0, 3348, 3576, +0, 3357, 3567, +0, 3368, 3555, +0, 3384, 3538, +0, 3403, 3514, +0, 3428, 3481, +0, 3459, 3431, +0, 3498, 3356, +0, 3545, 3230, +0, 3601, 2976, +0, 3667, 238, +0, 3742, 0, +0, 3826, 0, +0, 3322, 3607, +0, 3322, 3607, +0, 3322, 3607, +0, 3322, 3607, +0, 3322, 3606, +0, 3322, 3606, +0, 3322, 3606, +0, 3323, 3606, +0, 3323, 3606, +0, 3323, 3605, +0, 3324, 3605, +0, 3324, 3604, +0, 3325, 3604, +0, 3327, 3603, +0, 3328, 3601, +0, 3330, 3599, +0, 3333, 3596, +0, 3337, 3593, +0, 3342, 3588, +0, 3349, 3582, +0, 3358, 3573, +0, 3370, 3561, +0, 3385, 3544, +0, 3404, 3521, +0, 3429, 3487, +0, 3460, 3439, +0, 3499, 3365, +0, 3546, 3241, +0, 3602, 2997, +0, 3668, 1599, +0, 3743, 0, +0, 3827, 0, +0, 3324, 3614, +0, 3324, 3614, +0, 3324, 3614, +0, 3324, 3613, +0, 3324, 3613, +0, 3324, 3613, +0, 3324, 3613, +0, 3324, 3613, +0, 3325, 3613, +0, 3325, 3612, +0, 3326, 3612, +0, 3326, 3611, +0, 3327, 3611, +0, 3328, 3609, +0, 3330, 3608, +0, 3332, 3606, +0, 3335, 3603, +0, 3339, 3600, +0, 3344, 3595, +0, 3351, 3589, +0, 3360, 3580, +0, 3371, 3568, +0, 3386, 3552, +0, 3406, 3529, +0, 3431, 3496, +0, 3462, 3449, +0, 3500, 3376, +0, 3547, 3257, +0, 3603, 3023, +0, 3668, 1971, +0, 3743, 0, +0, 3827, 0, +0, 3326, 3623, +0, 3326, 3623, +0, 3326, 3623, +0, 3326, 3623, +0, 3326, 3622, +0, 3326, 3622, +0, 3327, 3622, +0, 3327, 3622, +0, 3327, 3622, +0, 3327, 3621, +0, 3328, 3621, +0, 3329, 3620, +0, 3330, 3620, +0, 3331, 3619, +0, 3332, 3617, +0, 3335, 3615, +0, 3337, 3613, +0, 3341, 3609, +0, 3346, 3605, +0, 3353, 3598, +0, 3362, 3590, +0, 3374, 3578, +0, 3388, 3562, +0, 3408, 3540, +0, 3432, 3508, +0, 3463, 3462, +0, 3502, 3392, +0, 3548, 3276, +0, 3604, 3055, +0, 3669, 2225, +0, 3744, 0, +0, 3828, 0, +0, 3329, 3635, +0, 3329, 3635, +0, 3329, 3634, +0, 3329, 3634, +0, 3329, 3634, +0, 3330, 3634, +0, 3330, 3634, +0, 3330, 3634, +0, 3330, 3634, +0, 3331, 3633, +0, 3331, 3633, +0, 3332, 3632, +0, 3333, 3632, +0, 3334, 3631, +0, 3336, 3629, +0, 3338, 3627, +0, 3341, 3625, +0, 3344, 3622, +0, 3349, 3617, +0, 3356, 3611, +0, 3365, 3603, +0, 3376, 3591, +0, 3391, 3576, +0, 3410, 3554, +0, 3435, 3523, +0, 3466, 3479, +0, 3504, 3411, +0, 3550, 3301, +0, 3606, 3095, +0, 3671, 2431, +0, 3746, 0, +0, 3829, 0, +0, 3333, 3650, +0, 3333, 3650, +0, 3334, 3650, +0, 3334, 3650, +0, 3334, 3650, +0, 3334, 3650, +0, 3334, 3649, +0, 3334, 3649, +0, 3334, 3649, +0, 3335, 3649, +0, 3335, 3648, +0, 3336, 3648, +0, 3337, 3647, +0, 3338, 3646, +0, 3340, 3645, +0, 3342, 3643, +0, 3345, 3641, +0, 3349, 3637, +0, 3354, 3633, +0, 3360, 3627, +0, 3369, 3619, +0, 3380, 3608, +0, 3395, 3593, +0, 3414, 3572, +0, 3438, 3543, +0, 3469, 3500, +0, 3507, 3436, +0, 3553, 3333, +0, 3608, 3144, +0, 3673, 2611, +0, 3747, 0, +0, 3831, 0, +0, 3339, 3670, +0, 3339, 3670, +0, 3339, 3670, +0, 3339, 3670, +0, 3339, 3670, +0, 3339, 3669, +0, 3340, 3669, +0, 3340, 3669, +0, 3340, 3669, +0, 3340, 3669, +0, 3341, 3668, +0, 3342, 3668, +0, 3343, 3667, +0, 3344, 3666, +0, 3345, 3665, +0, 3347, 3663, +0, 3350, 3661, +0, 3354, 3658, +0, 3359, 3654, +0, 3365, 3648, +0, 3374, 3640, +0, 3385, 3630, +0, 3400, 3616, +0, 3419, 3596, +0, 3443, 3568, +0, 3473, 3527, +0, 3511, 3467, +0, 3556, 3372, +0, 3611, 3202, +0, 3676, 2776, +0, 3750, 0, +0, 3833, 0, +1862, 3346, 3695, +1860, 3347, 3695, +1858, 3347, 3695, +1854, 3347, 3695, +1849, 3347, 3695, +1842, 3347, 3695, +1833, 3347, 3695, +1821, 3347, 3694, +1803, 3347, 3694, +1779, 3348, 3694, +1744, 3348, 3693, +1694, 3349, 3693, +1616, 3350, 3692, +1484, 3351, 3691, +1214, 3353, 3690, +0, 3355, 3689, +0, 3357, 3686, +0, 3361, 3684, +0, 3366, 3680, +0, 3372, 3674, +0, 3381, 3667, +0, 3392, 3657, +0, 3406, 3644, +0, 3425, 3625, +0, 3449, 3599, +0, 3479, 3562, +0, 3516, 3506, +0, 3561, 3419, +0, 3615, 3269, +0, 3679, 2931, +0, 3753, 0, +0, 3835, 0, +2854, 3356, 3727, +2854, 3356, 3727, +2853, 3356, 3726, +2853, 3356, 3726, +2853, 3356, 3726, +2852, 3357, 3726, +2851, 3357, 3726, +2849, 3357, 3726, +2848, 3357, 3726, +2845, 3358, 3726, +2842, 3358, 3725, +2838, 3359, 3725, +2832, 3360, 3724, +2824, 3361, 3723, +2813, 3362, 3722, +2798, 3364, 3721, +2778, 3367, 3719, +2749, 3371, 3716, +2706, 3375, 3712, +2643, 3382, 3707, +2542, 3390, 3701, +2357, 3401, 3692, +1850, 3415, 3679, +0, 3433, 3662, +0, 3456, 3638, +0, 3486, 3604, +0, 3522, 3553, +0, 3567, 3476, +0, 3621, 3346, +0, 3684, 3080, +0, 3757, 0, +0, 3838, 0, +3210, 3369, 3766, +3209, 3369, 3766, +3209, 3369, 3766, +3209, 3369, 3766, +3209, 3369, 3766, +3209, 3369, 3765, +3208, 3369, 3765, +3207, 3370, 3765, +3207, 3370, 3765, +3206, 3370, 3765, +3204, 3371, 3764, +3202, 3371, 3764, +3200, 3372, 3763, +3196, 3373, 3763, +3191, 3375, 3762, +3185, 3377, 3760, +3176, 3379, 3758, +3164, 3383, 3756, +3148, 3387, 3753, +3125, 3394, 3748, +3092, 3402, 3742, +3045, 3412, 3734, +2972, 3426, 3722, +2852, 3444, 3707, +2617, 3467, 3685, +1537, 3495, 3654, +0, 3531, 3609, +0, 3575, 3542, +0, 3628, 3431, +0, 3690, 3224, +0, 3762, 2549, +0, 3843, 0, +3457, 3385, 3813, +3457, 3385, 3813, +3457, 3385, 3813, +3457, 3385, 3813, +3457, 3385, 3813, +3457, 3386, 3813, +3457, 3386, 3813, +3456, 3386, 3813, +3456, 3386, 3813, +3455, 3387, 3812, +3454, 3387, 3812, +3453, 3388, 3812, +3452, 3388, 3811, +3450, 3389, 3811, +3447, 3391, 3810, +3443, 3393, 3808, +3439, 3395, 3807, +3432, 3399, 3805, +3423, 3403, 3802, +3410, 3409, 3797, +3393, 3417, 3792, +3369, 3427, 3785, +3335, 3441, 3774, +3285, 3458, 3761, +3208, 3480, 3741, +3079, 3508, 3714, +2817, 3543, 3675, +0, 3586, 3617, +0, 3637, 3526, +0, 3698, 3365, +0, 3769, 2984, +0, 3849, 0, +3660, 3406, 3870, +3660, 3406, 3870, +3660, 3406, 3870, +3660, 3406, 3870, +3660, 3407, 3870, +3660, 3407, 3870, +3660, 3407, 3870, +3660, 3407, 3870, +3659, 3407, 3869, +3659, 3408, 3869, +3658, 3408, 3869, +3658, 3409, 3869, +3657, 3409, 3868, +3655, 3410, 3868, +3654, 3412, 3867, +3651, 3414, 3866, +3648, 3416, 3864, +3644, 3419, 3862, +3638, 3424, 3860, +3631, 3429, 3856, +3620, 3437, 3851, +3606, 3446, 3845, +3586, 3459, 3836, +3558, 3476, 3824, +3517, 3497, 3807, +3456, 3524, 3784, +3360, 3558, 3750, +3187, 3599, 3702, +2750, 3650, 3627, +0, 3709, 3503, +0, 3778, 3257, +0, 3856, 1771, +3839, 3433, 3936, +3839, 3433, 3936, +3839, 3433, 3936, +3839, 3433, 3936, +3839, 3433, 3936, +3839, 3433, 3936, +3838, 3433, 3936, +3838, 3434, 3936, +3838, 3434, 3936, +3838, 3434, 3936, +3838, 3435, 3935, +3837, 3435, 3935, +3836, 3436, 3935, +3836, 3437, 3934, +3834, 3438, 3933, +3833, 3440, 3932, +3831, 3442, 3931, +3828, 3445, 3930, +3824, 3449, 3927, +3819, 3455, 3924, +3812, 3462, 3920, +3803, 3471, 3914, +3790, 3483, 3907, +3772, 3499, 3897, +3747, 3519, 3882, +3712, 3545, 3863, +3659, 3577, 3835, +3578, 3617, 3795, +3440, 3665, 3735, +3149, 3723, 3640, +0, 3790, 3472, +0, 3867, 3056, +4003, 3467, 4012, +4003, 3467, 4012, +4003, 3467, 4012, +4003, 3467, 4012, +4003, 3467, 4012, +4003, 3467, 4012, +4003, 3467, 4012, +4002, 3467, 4012, +4002, 3467, 4012, +4002, 3468, 4011, +4002, 3468, 4011, +4002, 3468, 4011, +4001, 3469, 4011, +4001, 3470, 4010, +4000, 3471, 4010, +3999, 3473, 4009, +3997, 3475, 4008, +3995, 3478, 4006, +3993, 3482, 4004, +3989, 3487, 4002, +3984, 3493, 3998, +3978, 3502, 3994, +3969, 3513, 3987, +3957, 3528, 3979, +3941, 3547, 3967, +3918, 3571, 3950, +3886, 3602, 3928, +3838, 3640, 3895, +3765, 3686, 3848, +3646, 3741, 3776, +3411, 3806, 3657, +2348, 3880, 3426, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3508, 4095, +4095, 3509, 4095, +4095, 3509, 4095, +4095, 3509, 4095, +4095, 3510, 4095, +4095, 3511, 4095, +4095, 3512, 4095, +4095, 3513, 4094, +4095, 3515, 4093, +4095, 3518, 4092, +4095, 3522, 4091, +4095, 3526, 4088, +4095, 3532, 4086, +4095, 3540, 4082, +4095, 3551, 4076, +4095, 3564, 4069, +4095, 3582, 4060, +4095, 3604, 4046, +4077, 3633, 4028, +4046, 3668, 4002, +4002, 3712, 3965, +3935, 3764, 3911, +3826, 3826, 3826, +3621, 3897, 3679, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3558, 4095, +4095, 3559, 4095, +4095, 3559, 4095, +4095, 3560, 4095, +4095, 3560, 4095, +4095, 3561, 4095, +4095, 3563, 4095, +4095, 3564, 4095, +4095, 3567, 4095, +4095, 3570, 4095, +4095, 3574, 4095, +4095, 3580, 4095, +4095, 3587, 4095, +4095, 3596, 4095, +4095, 3608, 4095, +4095, 3624, 4095, +4095, 3645, 4095, +4095, 3671, 4095, +4095, 3704, 4095, +4095, 3744, 4086, +4095, 3793, 4045, +4093, 3851, 3983, +3990, 3919, 3884, +0, 3448, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3717, +0, 3449, 3717, +0, 3449, 3717, +0, 3450, 3717, +0, 3450, 3717, +0, 3450, 3716, +0, 3451, 3715, +0, 3452, 3715, +0, 3453, 3713, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3707, +0, 3464, 3703, +0, 3469, 3698, +0, 3476, 3691, +0, 3485, 3682, +0, 3497, 3669, +0, 3512, 3652, +0, 3532, 3627, +0, 3557, 3592, +0, 3588, 3540, +0, 3627, 3460, +0, 3675, 3325, +0, 3731, 3043, +0, 3797, 0, +0, 3873, 0, +0, 3448, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3717, +0, 3449, 3717, +0, 3450, 3717, +0, 3450, 3717, +0, 3451, 3716, +0, 3451, 3715, +0, 3452, 3715, +0, 3453, 3713, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3707, +0, 3464, 3703, +0, 3469, 3698, +0, 3476, 3692, +0, 3485, 3682, +0, 3497, 3670, +0, 3512, 3652, +0, 3532, 3627, +0, 3557, 3592, +0, 3588, 3540, +0, 3627, 3460, +0, 3675, 3325, +0, 3731, 3043, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3717, +0, 3449, 3717, +0, 3450, 3717, +0, 3450, 3717, +0, 3451, 3716, +0, 3451, 3716, +0, 3452, 3715, +0, 3453, 3714, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3707, +0, 3464, 3703, +0, 3469, 3698, +0, 3476, 3692, +0, 3485, 3682, +0, 3497, 3670, +0, 3512, 3652, +0, 3532, 3627, +0, 3557, 3592, +0, 3588, 3540, +0, 3627, 3461, +0, 3675, 3326, +0, 3731, 3043, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3717, +0, 3450, 3717, +0, 3450, 3717, +0, 3451, 3716, +0, 3451, 3716, +0, 3452, 3715, +0, 3453, 3714, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3707, +0, 3464, 3703, +0, 3469, 3698, +0, 3476, 3692, +0, 3485, 3682, +0, 3497, 3670, +0, 3512, 3652, +0, 3532, 3627, +0, 3557, 3592, +0, 3588, 3541, +0, 3627, 3461, +0, 3675, 3326, +0, 3731, 3043, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3717, +0, 3450, 3717, +0, 3450, 3717, +0, 3451, 3716, +0, 3451, 3716, +0, 3452, 3715, +0, 3453, 3714, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3707, +0, 3464, 3704, +0, 3469, 3699, +0, 3476, 3692, +0, 3485, 3682, +0, 3497, 3670, +0, 3512, 3652, +0, 3532, 3628, +0, 3557, 3592, +0, 3588, 3541, +0, 3627, 3461, +0, 3675, 3326, +0, 3731, 3044, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3450, 3717, +0, 3450, 3717, +0, 3451, 3716, +0, 3451, 3716, +0, 3452, 3715, +0, 3453, 3714, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3707, +0, 3464, 3704, +0, 3469, 3699, +0, 3476, 3692, +0, 3485, 3683, +0, 3497, 3670, +0, 3512, 3652, +0, 3532, 3628, +0, 3557, 3593, +0, 3588, 3541, +0, 3627, 3461, +0, 3675, 3326, +0, 3731, 3044, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3450, 3717, +0, 3450, 3717, +0, 3451, 3717, +0, 3451, 3716, +0, 3452, 3715, +0, 3454, 3714, +0, 3455, 3712, +0, 3457, 3710, +0, 3460, 3708, +0, 3464, 3704, +0, 3469, 3699, +0, 3476, 3692, +0, 3485, 3683, +0, 3497, 3670, +0, 3512, 3653, +0, 3532, 3628, +0, 3557, 3593, +0, 3588, 3541, +0, 3627, 3461, +0, 3675, 3327, +0, 3731, 3045, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3449, 3718, +0, 3450, 3718, +0, 3450, 3717, +0, 3451, 3717, +0, 3451, 3716, +0, 3452, 3715, +0, 3454, 3714, +0, 3455, 3713, +0, 3457, 3711, +0, 3460, 3708, +0, 3464, 3704, +0, 3470, 3699, +0, 3476, 3692, +0, 3485, 3683, +0, 3497, 3670, +0, 3512, 3653, +0, 3532, 3628, +0, 3557, 3593, +0, 3589, 3541, +0, 3627, 3462, +0, 3675, 3327, +0, 3731, 3046, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3718, +0, 3450, 3718, +0, 3450, 3718, +0, 3450, 3718, +0, 3451, 3717, +0, 3451, 3716, +0, 3452, 3716, +0, 3454, 3714, +0, 3455, 3713, +0, 3458, 3711, +0, 3460, 3708, +0, 3464, 3704, +0, 3470, 3699, +0, 3476, 3693, +0, 3485, 3683, +0, 3497, 3671, +0, 3512, 3653, +0, 3532, 3629, +0, 3557, 3593, +0, 3589, 3542, +0, 3627, 3462, +0, 3675, 3328, +0, 3731, 3047, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3449, 3719, +0, 3450, 3719, +0, 3450, 3718, +0, 3450, 3718, +0, 3451, 3718, +0, 3452, 3717, +0, 3452, 3716, +0, 3454, 3715, +0, 3455, 3713, +0, 3458, 3711, +0, 3461, 3709, +0, 3465, 3705, +0, 3470, 3700, +0, 3477, 3693, +0, 3486, 3684, +0, 3497, 3671, +0, 3513, 3654, +0, 3532, 3629, +0, 3557, 3594, +0, 3589, 3542, +0, 3628, 3463, +0, 3675, 3329, +0, 3731, 3049, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3719, +0, 3450, 3719, +0, 3450, 3719, +0, 3450, 3719, +0, 3450, 3719, +0, 3451, 3718, +0, 3452, 3717, +0, 3453, 3717, +0, 3454, 3715, +0, 3456, 3714, +0, 3458, 3712, +0, 3461, 3709, +0, 3465, 3705, +0, 3470, 3700, +0, 3477, 3694, +0, 3486, 3684, +0, 3497, 3672, +0, 3513, 3654, +0, 3532, 3630, +0, 3557, 3595, +0, 3589, 3543, +0, 3628, 3464, +0, 3675, 3330, +0, 3731, 3051, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3721, +0, 3449, 3721, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3720, +0, 3449, 3720, +0, 3450, 3720, +0, 3450, 3720, +0, 3450, 3720, +0, 3450, 3720, +0, 3451, 3719, +0, 3451, 3719, +0, 3452, 3718, +0, 3453, 3717, +0, 3454, 3716, +0, 3456, 3715, +0, 3458, 3713, +0, 3461, 3710, +0, 3465, 3706, +0, 3470, 3701, +0, 3477, 3694, +0, 3486, 3685, +0, 3498, 3672, +0, 3513, 3655, +0, 3532, 3631, +0, 3557, 3596, +0, 3589, 3544, +0, 3628, 3465, +0, 3675, 3332, +0, 3731, 3055, +0, 3797, 0, +0, 3873, 0, +0, 3449, 3721, +0, 3449, 3721, +0, 3449, 3721, +0, 3450, 3721, +0, 3450, 3721, +0, 3450, 3721, +0, 3450, 3721, +0, 3450, 3721, +0, 3450, 3721, +0, 3450, 3721, +0, 3451, 3720, +0, 3451, 3720, +0, 3452, 3719, +0, 3453, 3718, +0, 3454, 3717, +0, 3456, 3716, +0, 3458, 3714, +0, 3461, 3711, +0, 3465, 3707, +0, 3470, 3702, +0, 3477, 3695, +0, 3486, 3686, +0, 3498, 3674, +0, 3513, 3656, +0, 3533, 3632, +0, 3558, 3597, +0, 3589, 3546, +0, 3628, 3467, +0, 3675, 3334, +0, 3732, 3059, +0, 3798, 0, +0, 3873, 0, +0, 3450, 3723, +0, 3450, 3723, +0, 3450, 3723, +0, 3450, 3723, +0, 3450, 3723, +0, 3450, 3723, +0, 3450, 3722, +0, 3450, 3722, +0, 3451, 3722, +0, 3451, 3722, +0, 3451, 3721, +0, 3452, 3721, +0, 3452, 3720, +0, 3453, 3719, +0, 3455, 3718, +0, 3456, 3717, +0, 3458, 3715, +0, 3461, 3712, +0, 3465, 3708, +0, 3471, 3703, +0, 3477, 3697, +0, 3486, 3687, +0, 3498, 3675, +0, 3513, 3658, +0, 3533, 3633, +0, 3558, 3599, +0, 3589, 3548, +0, 3628, 3469, +0, 3675, 3337, +0, 3732, 3064, +0, 3798, 0, +0, 3873, 0, +0, 3450, 3724, +0, 3450, 3724, +0, 3450, 3724, +0, 3450, 3724, +0, 3450, 3724, +0, 3450, 3724, +0, 3451, 3724, +0, 3451, 3724, +0, 3451, 3724, +0, 3451, 3723, +0, 3452, 3723, +0, 3452, 3723, +0, 3453, 3722, +0, 3454, 3721, +0, 3455, 3720, +0, 3457, 3719, +0, 3459, 3717, +0, 3462, 3714, +0, 3466, 3710, +0, 3471, 3705, +0, 3478, 3698, +0, 3487, 3689, +0, 3498, 3677, +0, 3514, 3659, +0, 3533, 3635, +0, 3558, 3601, +0, 3590, 3550, +0, 3628, 3472, +0, 3676, 3341, +0, 3732, 3071, +0, 3798, 0, +0, 3873, 0, +0, 3451, 3727, +0, 3451, 3727, +0, 3451, 3727, +0, 3451, 3727, +0, 3451, 3727, +0, 3451, 3726, +0, 3451, 3726, +0, 3451, 3726, +0, 3452, 3726, +0, 3452, 3726, +0, 3452, 3725, +0, 3453, 3725, +0, 3453, 3724, +0, 3454, 3723, +0, 3456, 3722, +0, 3457, 3721, +0, 3459, 3719, +0, 3462, 3716, +0, 3466, 3712, +0, 3471, 3708, +0, 3478, 3701, +0, 3487, 3692, +0, 3499, 3679, +0, 3514, 3662, +0, 3534, 3638, +0, 3559, 3604, +0, 3590, 3553, +0, 3629, 3476, +0, 3676, 3346, +0, 3732, 3081, +0, 3798, 0, +0, 3873, 0, +0, 3451, 3730, +0, 3452, 3730, +0, 3452, 3730, +0, 3452, 3730, +0, 3452, 3729, +0, 3452, 3729, +0, 3452, 3729, +0, 3452, 3729, +0, 3452, 3729, +0, 3453, 3729, +0, 3453, 3728, +0, 3453, 3728, +0, 3454, 3727, +0, 3455, 3726, +0, 3456, 3725, +0, 3458, 3724, +0, 3460, 3722, +0, 3463, 3719, +0, 3467, 3716, +0, 3472, 3711, +0, 3479, 3704, +0, 3488, 3695, +0, 3500, 3683, +0, 3515, 3666, +0, 3534, 3642, +0, 3559, 3608, +0, 3591, 3558, +0, 3629, 3481, +0, 3676, 3353, +0, 3733, 3093, +0, 3798, 0, +0, 3874, 0, +0, 3453, 3734, +0, 3453, 3734, +0, 3453, 3734, +0, 3453, 3734, +0, 3453, 3733, +0, 3453, 3733, +0, 3453, 3733, +0, 3453, 3733, +0, 3453, 3733, +0, 3454, 3733, +0, 3454, 3732, +0, 3454, 3732, +0, 3455, 3731, +0, 3456, 3730, +0, 3457, 3729, +0, 3459, 3728, +0, 3461, 3726, +0, 3464, 3723, +0, 3468, 3720, +0, 3473, 3715, +0, 3480, 3708, +0, 3489, 3699, +0, 3501, 3687, +0, 3516, 3670, +0, 3535, 3646, +0, 3560, 3613, +0, 3591, 3563, +0, 3630, 3488, +0, 3677, 3362, +0, 3733, 3109, +0, 3799, 370, +0, 3874, 0, +0, 3454, 3739, +0, 3454, 3739, +0, 3454, 3739, +0, 3454, 3739, +0, 3454, 3739, +0, 3454, 3739, +0, 3454, 3738, +0, 3454, 3738, +0, 3455, 3738, +0, 3455, 3738, +0, 3455, 3738, +0, 3456, 3737, +0, 3457, 3737, +0, 3457, 3736, +0, 3459, 3735, +0, 3460, 3733, +0, 3463, 3731, +0, 3465, 3729, +0, 3469, 3725, +0, 3474, 3720, +0, 3481, 3714, +0, 3490, 3705, +0, 3502, 3693, +0, 3517, 3676, +0, 3536, 3653, +0, 3561, 3620, +0, 3592, 3571, +0, 3631, 3497, +0, 3678, 3374, +0, 3734, 3129, +0, 3800, 1731, +0, 3875, 0, +0, 3456, 3746, +0, 3456, 3746, +0, 3456, 3746, +0, 3456, 3746, +0, 3456, 3746, +0, 3456, 3745, +0, 3456, 3745, +0, 3456, 3745, +0, 3456, 3745, +0, 3457, 3745, +0, 3457, 3744, +0, 3458, 3744, +0, 3458, 3743, +0, 3459, 3743, +0, 3460, 3742, +0, 3462, 3740, +0, 3464, 3738, +0, 3467, 3736, +0, 3471, 3732, +0, 3476, 3727, +0, 3483, 3721, +0, 3492, 3712, +0, 3503, 3700, +0, 3518, 3684, +0, 3538, 3661, +0, 3563, 3629, +0, 3594, 3581, +0, 3632, 3508, +0, 3679, 3389, +0, 3735, 3155, +0, 3800, 2103, +0, 3875, 0, +0, 3458, 3755, +0, 3458, 3755, +0, 3458, 3755, +0, 3458, 3755, +0, 3458, 3755, +0, 3458, 3755, +0, 3458, 3754, +0, 3459, 3754, +0, 3459, 3754, +0, 3459, 3754, +0, 3460, 3754, +0, 3460, 3753, +0, 3461, 3753, +0, 3462, 3752, +0, 3463, 3751, +0, 3465, 3749, +0, 3467, 3747, +0, 3470, 3745, +0, 3473, 3741, +0, 3479, 3737, +0, 3485, 3731, +0, 3494, 3722, +0, 3506, 3710, +0, 3521, 3694, +0, 3540, 3672, +0, 3565, 3640, +0, 3595, 3594, +0, 3634, 3524, +0, 3681, 3409, +0, 3736, 3187, +0, 3802, 2357, +0, 3876, 0, +0, 3461, 3767, +0, 3461, 3767, +0, 3461, 3767, +0, 3461, 3767, +0, 3461, 3767, +0, 3462, 3766, +0, 3462, 3766, +0, 3462, 3766, +0, 3462, 3766, +0, 3462, 3766, +0, 3463, 3765, +0, 3463, 3765, +0, 3464, 3764, +0, 3465, 3764, +0, 3466, 3763, +0, 3468, 3761, +0, 3470, 3759, +0, 3473, 3757, +0, 3477, 3754, +0, 3482, 3749, +0, 3488, 3743, +0, 3497, 3735, +0, 3508, 3723, +0, 3523, 3708, +0, 3543, 3686, +0, 3567, 3655, +0, 3598, 3611, +0, 3636, 3543, +0, 3682, 3434, +0, 3738, 3227, +0, 3803, 2563, +0, 3878, 0, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3782, +0, 3466, 3781, +0, 3467, 3781, +0, 3467, 3781, +0, 3467, 3780, +0, 3468, 3780, +0, 3469, 3779, +0, 3470, 3778, +0, 3472, 3777, +0, 3474, 3775, +0, 3477, 3773, +0, 3481, 3769, +0, 3486, 3765, +0, 3492, 3759, +0, 3501, 3751, +0, 3512, 3740, +0, 3527, 3725, +0, 3546, 3704, +0, 3570, 3675, +0, 3601, 3632, +0, 3639, 3568, +0, 3685, 3465, +0, 3740, 3276, +0, 3805, 2743, +0, 3879, 0, +0, 3471, 3802, +0, 3471, 3802, +0, 3471, 3802, +0, 3471, 3802, +0, 3471, 3802, +0, 3471, 3802, +0, 3472, 3802, +0, 3472, 3801, +0, 3472, 3801, +0, 3472, 3801, +0, 3473, 3801, +0, 3473, 3800, +0, 3474, 3800, +0, 3475, 3799, +0, 3476, 3798, +0, 3477, 3797, +0, 3480, 3795, +0, 3482, 3793, +0, 3486, 3790, +0, 3491, 3786, +0, 3498, 3780, +0, 3506, 3772, +0, 3517, 3762, +0, 3532, 3748, +0, 3551, 3728, +0, 3575, 3700, +0, 3605, 3660, +0, 3643, 3599, +0, 3689, 3504, +0, 3743, 3334, +0, 3808, 2908, +0, 3882, 0, +1996, 3479, 3827, +1994, 3479, 3827, +1992, 3479, 3827, +1990, 3479, 3827, +1986, 3479, 3827, +1981, 3479, 3827, +1974, 3479, 3827, +1965, 3479, 3827, +1953, 3479, 3826, +1935, 3480, 3826, +1911, 3480, 3826, +1877, 3480, 3826, +1826, 3481, 3825, +1748, 3482, 3824, +1616, 3483, 3824, +1346, 3485, 3822, +0, 3487, 3821, +0, 3490, 3819, +0, 3493, 3816, +0, 3498, 3812, +0, 3505, 3806, +0, 3513, 3799, +0, 3524, 3789, +0, 3538, 3776, +0, 3557, 3757, +0, 3581, 3731, +0, 3611, 3694, +0, 3648, 3638, +0, 3693, 3551, +0, 3748, 3401, +0, 3811, 3063, +0, 3885, 0, +2986, 3488, 3859, +2986, 3488, 3859, +2986, 3488, 3859, +2986, 3488, 3859, +2985, 3488, 3859, +2985, 3489, 3858, +2984, 3489, 3858, +2983, 3489, 3858, +2982, 3489, 3858, +2980, 3489, 3858, +2977, 3490, 3858, +2974, 3490, 3857, +2970, 3491, 3857, +2964, 3492, 3856, +2956, 3493, 3855, +2945, 3494, 3854, +2931, 3496, 3853, +2910, 3499, 3851, +2881, 3503, 3848, +2839, 3507, 3844, +2775, 3514, 3839, +2674, 3522, 3833, +2489, 3533, 3824, +1982, 3547, 3811, +0, 3565, 3794, +0, 3589, 3770, +0, 3618, 3736, +0, 3655, 3685, +0, 3699, 3608, +0, 3753, 3478, +0, 3816, 3212, +0, 3889, 0, +3342, 3501, 3898, +3342, 3501, 3898, +3342, 3501, 3898, +3341, 3501, 3898, +3341, 3501, 3898, +3341, 3501, 3898, +3341, 3501, 3898, +3340, 3501, 3897, +3340, 3502, 3897, +3339, 3502, 3897, +3338, 3502, 3897, +3336, 3503, 3897, +3334, 3503, 3896, +3332, 3504, 3896, +3328, 3505, 3895, +3323, 3507, 3894, +3317, 3509, 3892, +3308, 3511, 3891, +3296, 3515, 3888, +3280, 3520, 3885, +3257, 3526, 3880, +3224, 3534, 3874, +3177, 3544, 3866, +3104, 3558, 3854, +2984, 3576, 3839, +2749, 3599, 3817, +1669, 3628, 3786, +0, 3663, 3741, +0, 3707, 3674, +0, 3760, 3564, +0, 3822, 3356, +0, 3894, 2681, +3590, 3517, 3945, +3590, 3517, 3945, +3590, 3517, 3945, +3589, 3517, 3945, +3589, 3518, 3945, +3589, 3518, 3945, +3589, 3518, 3945, +3589, 3518, 3945, +3588, 3518, 3945, +3588, 3518, 3945, +3587, 3519, 3945, +3586, 3519, 3944, +3585, 3520, 3944, +3584, 3520, 3943, +3582, 3522, 3943, +3579, 3523, 3942, +3576, 3525, 3941, +3571, 3527, 3939, +3564, 3531, 3937, +3555, 3535, 3934, +3543, 3541, 3930, +3525, 3549, 3924, +3501, 3559, 3917, +3467, 3573, 3907, +3417, 3590, 3893, +3340, 3612, 3873, +3211, 3640, 3846, +2949, 3675, 3807, +0, 3718, 3749, +0, 3769, 3658, +0, 3830, 3497, +0, 3901, 3116, +3792, 3538, 4002, +3792, 3538, 4002, +3792, 3538, 4002, +3792, 3539, 4002, +3792, 3539, 4002, +3792, 3539, 4002, +3792, 3539, 4002, +3792, 3539, 4002, +3792, 3539, 4002, +3791, 3539, 4002, +3791, 3540, 4001, +3790, 3540, 4001, +3790, 3541, 4001, +3789, 3541, 4000, +3787, 3542, 4000, +3786, 3544, 3999, +3783, 3546, 3998, +3780, 3548, 3996, +3776, 3551, 3994, +3770, 3556, 3992, +3763, 3561, 3988, +3752, 3569, 3983, +3738, 3579, 3977, +3718, 3591, 3968, +3690, 3608, 3956, +3649, 3629, 3939, +3588, 3656, 3916, +3492, 3690, 3882, +3319, 3731, 3834, +2882, 3782, 3759, +0, 3841, 3636, +0, 3910, 3389, +3971, 3565, 4068, +3971, 3565, 4068, +3971, 3565, 4068, +3971, 3565, 4068, +3971, 3565, 4068, +3971, 3565, 4068, +3971, 3565, 4068, +3971, 3566, 4068, +3970, 3566, 4068, +3970, 3566, 4068, +3970, 3566, 4068, +3970, 3567, 4067, +3969, 3567, 4067, +3968, 3568, 4067, +3968, 3569, 4066, +3966, 3570, 4066, +3965, 3572, 4065, +3963, 3574, 4063, +3960, 3577, 4062, +3956, 3581, 4059, +3951, 3587, 4056, +3944, 3594, 4052, +3935, 3603, 4047, +3922, 3615, 4039, +3904, 3631, 4029, +3879, 3651, 4014, +3844, 3677, 3995, +3791, 3709, 3967, +3710, 3749, 3927, +3572, 3797, 3867, +3281, 3855, 3772, +0, 3922, 3604, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3599, 4095, +4095, 3600, 4095, +4095, 3600, 4095, +4095, 3601, 4095, +4095, 3601, 4095, +4095, 3602, 4095, +4095, 3603, 4095, +4095, 3605, 4095, +4095, 3607, 4095, +4095, 3610, 4095, +4095, 3614, 4095, +4095, 3619, 4095, +4095, 3625, 4095, +4095, 3634, 4095, +4095, 3645, 4095, +4090, 3660, 4095, +4073, 3679, 4095, +4050, 3703, 4083, +4018, 3734, 4060, +3970, 3772, 4027, +3897, 3818, 3980, +3778, 3873, 3908, +3543, 3938, 3789, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3640, 4095, +4095, 3641, 4095, +4095, 3641, 4095, +4095, 3641, 4095, +4095, 3642, 4095, +4095, 3642, 4095, +4095, 3643, 4095, +4095, 3644, 4095, +4095, 3646, 4095, +4095, 3648, 4095, +4095, 3650, 4095, +4095, 3654, 4095, +4095, 3658, 4095, +4095, 3664, 4095, +4095, 3672, 4095, +4095, 3683, 4095, +4095, 3696, 4095, +4095, 3714, 4095, +4095, 3736, 4095, +4095, 3765, 4095, +4095, 3800, 4095, +4095, 3844, 4095, +4067, 3896, 4043, +3958, 3958, 3958] } -} +} \ No newline at end of file diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat index c655eb2e6c..56021c0801 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/CMD_ColorGradingTools.bat @@ -17,6 +17,13 @@ TITLE O3DE Color Grading CMD :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E +echo. +echo _____________________________________________________________________ +echo. +echo ~ O3DE Color Grading Python CMD ... +echo _____________________________________________________________________ +echo. + %~d0 cd %~dp0 PUSHD %~dp0 @@ -27,16 +34,17 @@ SETLOCAL ENABLEDELAYEDEXPANSION IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat :: Initialize env +echo +echo ... calling Env_Core.bat CALL %~dp0\Env_Core.bat -CALL %~dp0\Env_Python.bat -CALL %~dp0\Env_Tools.bat -echo. -echo _____________________________________________________________________ -echo. -echo ~ O3DE Color Grading Python CMD ... -echo _____________________________________________________________________ -echo. +echo +echo ... calling Env_Python.bat +CALL %~dp0\Env_Python.bat + +echo +echo ... calling Env_Tools.bat +CALL %~dp0\Env_Tools.bat :: Change to root dir CD /D .. diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat index 730170dce7..74d1e77247 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/Env_Core.bat @@ -93,9 +93,6 @@ popd set DCCSIG_PATH=%O3DE_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface echo DCCSIG_PATH = %DCCSIG_PATH% -:: Change to DCCsi root dir -CD /D %DCCSIG_PATH% - :: per-dcc sdk path set DCCSI_SDK_PATH=%DCCSIG_PATH%\SDK echo DCCSI_SDK_PATH = %DCCSI_SDK_PATH% diff --git a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template index 81a53393cf..973d6d5afd 100644 --- a/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template +++ b/Gems/Atom/Feature/Common/Tools/ColorGrading/cmdline/User_Env.bat.template @@ -26,7 +26,7 @@ SET DCCSI_GDEBUG=True SET DCCSI_DEV_MODE=True :: set the your user name here for windows path -SET TAG_USERNAME=< not set > +SET TAG_USERNAME=NOT_SET SET DCCSI_PY_REV=rev1 SET DCCSI_PY_PLATFORM=windows From 141cb55903a98ac1f52d9946cf612e9b5e945e51 Mon Sep 17 00:00:00 2001 From: bosnichd Date: Fri, 10 Sep 2021 13:12:45 -0600 Subject: [PATCH 240/355] Fix issue #4045 (#4053) * Remove unused Vulkan ShaderDescriptor class. Signed-off-by: bosnichd * Add missing dependency on Gem::Atom_RHI.Public Signed-off-by: bosnichd * Revert changes made to Gems/Atom/RHI/Vulkan/Code/* in https://github.com/o3de/o3de/pull/4021, and instead just check a trait to determine whether the RHI Vulkan targets have been defined else where. Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt maybe needs to be revisited at some point, but my changes are causing numerous issues on mac so this just restores the prior behavior for all platforms while also providing a mechanism for any platform to simply define exactly what Vulkan related targets it needs independently. Signed-off-by: bosnichd --- Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt | 9 +-- .../RHI.Reflect/Vulkan/ShaderDescriptor.h | 57 ------------------ .../ModuleStub_Unimplemented.cpp | 9 +-- .../Source/RHI.Reflect/ShaderDescriptor.cpp | 59 ------------------- .../RHI/Vulkan/Code/Source/RHI/ShaderModule.h | 2 - ...atom_rhi_vulkan_reflect_common_files.cmake | 2 - 6 files changed, 6 insertions(+), 132 deletions(-) delete mode 100644 Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h delete mode 100644 Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp diff --git a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt index 5c74852f57..fb13d1fddb 100644 --- a/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt +++ b/Gems/Atom/RHI/Vulkan/Code/CMakeLists.txt @@ -9,7 +9,11 @@ ly_get_list_relative_pal_filename(pal_include_dir ${CMAKE_CURRENT_LIST_DIR}/Include/Platform/${PAL_PLATFORM_NAME}) ly_get_list_relative_pal_filename(pal_source_dir ${CMAKE_CURRENT_LIST_DIR}/Source/Platform/${PAL_PLATFORM_NAME}) -include(${pal_source_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) # PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED +include(${pal_source_dir}/PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) # PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED / PAL_TRAIT_ATOM_RHI_VULKAN_TARGETS_ALREADY_DEFINED + +if(PAL_TRAIT_ATOM_RHI_VULKAN_TARGETS_ALREADY_DEFINED) + return() # Vulkan targets already defined in PAL_${PAL_PLATFORM_NAME_LOWERCASE}.cmake +endif() if(NOT PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED) @@ -19,12 +23,9 @@ if(NOT PAL_TRAIT_ATOM_RHI_VULKAN_SUPPORTED) NAMESPACE Gem FILES_CMAKE atom_rhi_vulkan_stub_module.cmake - atom_rhi_vulkan_reflect_common_files.cmake INCLUDE_DIRECTORIES PRIVATE - Include Source - ${pal_include_dir} Include/Atom/RHI.Loader/Glad BUILD_DEPENDENCIES PRIVATE diff --git a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h b/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h deleted file mode 100644 index b432dcf0cb..0000000000 --- a/Gems/Atom/RHI/Vulkan/Code/Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -#pragma once - -#include -#include -#include -#include -#include - -namespace AZ -{ - class ReflectContext; - - namespace Vulkan - { - using ShaderByteCode = AZStd::vector; - - // TODO: remove this class after checking it is no longer necessary. - class ShaderDescriptor final - : public RHI::Object - { - using Base = RHI::Object; - public: - AZ_CLASS_ALLOCATOR(ShaderDescriptor, AZ::SystemAllocator, 0); - AZ_RTTI(ShaderDescriptor, "EB289A24-52DF-45E5-B3D0-C33B6DBAAAA7", Base); - - static void Reflect(AZ::ReflectContext* context); - - /// Clears all bytecodes and resets descriptor - void Clear(); - - /// Finalizes the descriptor and builds the hash value. - void Finalize(); - - /// Assigns bytecode to a specific shader stage. - void SetByteCode(RHI::ShaderStage shaderStage, const ShaderByteCode& bytecode); - - /// Returns whether bytecode exists for the given shader stage. - bool HasByteCode(RHI::ShaderStage shaderStage) const; - - /// Returns the bytecode for the given shader stage. - const ShaderByteCode& GetByteCode(RHI::ShaderStage shaderStage) const; - - private: - /// The set of shader bytecodes indexed by shader stage. - AZStd::array(RHI::ShaderStage::GraphicsCount)> m_byteCodesByStage; - size_t m_hash = 0; - }; - - } -} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp index 44a8a26968..8c06700404 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/Platform/Common/Unimplemented/ModuleStub_Unimplemented.cpp @@ -5,8 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ - -#include #include namespace AZ @@ -19,12 +17,7 @@ namespace AZ public: AZ_RTTI(PlatformModule, "{958CB096-796C-42C7-9B29-17C6FE792C30}", Module); - PlatformModule() - { - m_descriptors.insert(m_descriptors.end(), { - ReflectSystemComponent::CreateDescriptor() - }); - } + PlatformModule() = default; ~PlatformModule() override = default; AZ::ComponentTypeList GetRequiredSystemComponents() const override diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp deleted file mode 100644 index b82d72a98c..0000000000 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI.Reflect/ShaderDescriptor.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ -#include -#include - -namespace AZ -{ - namespace Vulkan - { - void ShaderDescriptor::Reflect(AZ::ReflectContext* context) - { - if (SerializeContext* serializeContext = azrtti_cast(context)) - { - serializeContext->Class() - ->Version(1) - ->Field("m_byteCodesByStage", &ShaderDescriptor::m_byteCodesByStage); - } - } - - void ShaderDescriptor::Clear() - { - m_hash = 0; - m_byteCodesByStage.fill(ShaderByteCode()); - } - - void ShaderDescriptor::Finalize() - { - AZ::Crc32 crc; - for (const ShaderByteCode& byteCode : m_byteCodesByStage) - { - if (!byteCode.empty()) - { - crc.Add(byteCode.data(), byteCode.size()); - } - } - m_hash = crc; - } - - void ShaderDescriptor::SetByteCode(RHI::ShaderStage shaderStage, const ShaderByteCode& bytecode) - { - m_byteCodesByStage[static_cast(shaderStage)] = bytecode; - } - - bool ShaderDescriptor::HasByteCode(RHI::ShaderStage shaderStage) const - { - return !(m_byteCodesByStage[static_cast(shaderStage)].empty()); - } - - const ShaderByteCode& ShaderDescriptor::GetByteCode(RHI::ShaderStage shaderStage) const - { - return m_byteCodesByStage[static_cast(shaderStage)]; - } - } -} diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h index 244a1c1b82..74632e4539 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/ShaderModule.h @@ -9,8 +9,6 @@ #include #include -#include -#include #include namespace AZ diff --git a/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_reflect_common_files.cmake b/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_reflect_common_files.cmake index 8965cd054d..92c22ddfc5 100644 --- a/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_reflect_common_files.cmake +++ b/Gems/Atom/RHI/Vulkan/Code/atom_rhi_vulkan_reflect_common_files.cmake @@ -11,8 +11,6 @@ set(FILES Include/Atom/RHI.Reflect/Vulkan/BufferPoolDescriptor.h Source/RHI.Reflect/ImagePoolDescriptor.cpp Include/Atom/RHI.Reflect/Vulkan/ImagePoolDescriptor.h - Source/RHI.Reflect/ShaderDescriptor.cpp - Include/Atom/RHI.Reflect/Vulkan/ShaderDescriptor.h Source/RHI.Reflect/ShaderStageFunction.cpp Include/Atom/RHI.Reflect/Vulkan/ShaderStageFunction.h Source/RHI.Reflect/ReflectSystemComponent.cpp From 2629216e463aef01df4a1bdda5090443817e4374 Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Fri, 10 Sep 2021 14:37:32 -0500 Subject: [PATCH 241/355] Optimize MemoryView::SetName (#4052) * Optimize MemoryView SetName Added a second version that uses wstring_view instead of string_view so that no temporaries need to be created when passing in a string literal that's already a wstring. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Changed to use SetPrivateData Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> --- .../Code/Source/Platform/Windows/RHI/DX12_Windows.h | 1 + .../Platform/Windows/platform_private_windows.cmake | 1 + .../DX12/Code/Source/RHI/MemoryPageAllocator.cpp | 2 +- Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.cpp | 13 ++++++++++++- Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.h | 3 +++ .../RHI/DX12/Code/Source/RHI/RayTracingBlas.cpp | 4 ++-- .../DX12/Code/Source/RHI/RayTracingShaderTable.cpp | 2 +- .../RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp | 6 +++--- 8 files changed, 24 insertions(+), 8 deletions(-) diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h index 3f9079422c..85b782aa6b 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h @@ -19,6 +19,7 @@ #include #include +#include // This define is enabled if LY_PIX_ENABLED is enabled during configure. You can use LY_PIX_PATH to point where pix is downloaded. // Enabling this define will allow the runtime code to add PIX markers which will help with pix and renderdoc gpu captures diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake index d792c3d2aa..c94b2a020e 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/platform_private_windows.cmake @@ -10,4 +10,5 @@ set(LY_BUILD_DEPENDENCIES PRIVATE d3d12 dxgi + dxguid ) diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryPageAllocator.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryPageAllocator.cpp index 5692befedf..2715b7063b 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryPageAllocator.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryPageAllocator.cpp @@ -51,7 +51,7 @@ namespace AZ if (memoryView.IsValid()) { heapMemoryUsage.m_residentInBytes += m_descriptor.m_pageSizeInBytes; - memoryView.SetName("BufferPage"); + memoryView.SetName(L"BufferPage"); } else { diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.cpp index c9d932afb1..6389076408 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.cpp @@ -7,6 +7,7 @@ */ #include +#include #include #include #include @@ -95,7 +96,17 @@ namespace AZ { AZStd::wstring wname; AZStd::to_wstring(wname, name); - m_memoryAllocation.m_memory->SetName(wname.data()); + m_memoryAllocation.m_memory->SetPrivateData( + WKPDID_D3DDebugObjectNameW, aznumeric_cast(wname.size() * sizeof(wchar_t)), wname.data()); + } + } + + void MemoryView::SetName(const AZStd::wstring_view& name) + { + if (m_memoryAllocation.m_memory) + { + m_memoryAllocation.m_memory->SetPrivateData( + WKPDID_D3DDebugObjectNameW, aznumeric_cast(name.size() * sizeof(wchar_t)), name.data()); } } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.h b/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.h index a5162d53de..f418af6058 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.h +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/MemoryView.h @@ -77,6 +77,9 @@ namespace AZ /// Sets the name of the ID3D12Resource. void SetName(const AZStd::string_view& name); + /// Sets the name of the ID3D12Resource. + void SetName(const AZStd::wstring_view& name); + private: void Construct(); diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingBlas.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingBlas.cpp index 917e1a4d98..0f651f9be3 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingBlas.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingBlas.cpp @@ -83,7 +83,7 @@ namespace AZ AZ_Assert(resultCode == RHI::ResultCode::Success, "failed to create BLAS scratch buffer"); MemoryView& scratchMemoryView = static_cast(buffers.m_scratchBuffer.get())->GetMemoryView(); - scratchMemoryView.SetName("BLAS Scratch"); + scratchMemoryView.SetName(L"BLAS Scratch"); // create BLAS buffer buffers.m_blasBuffer = RHI::Factory::Get().CreateBuffer(); @@ -98,7 +98,7 @@ namespace AZ AZ_Assert(resultCode == RHI::ResultCode::Success, "failed to create BLAS buffer"); MemoryView& blasMemoryView = static_cast(buffers.m_blasBuffer.get())->GetMemoryView(); - blasMemoryView.SetName("BLAS"); + blasMemoryView.SetName(L"BLAS"); #endif return RHI::ResultCode::Success; } diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingShaderTable.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingShaderTable.cpp index 21e7dbc82e..0a9ea63d2f 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingShaderTable.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingShaderTable.cpp @@ -72,7 +72,7 @@ namespace AZ AZ_Assert(resultCode == RHI::ResultCode::Success, "failed to create shader table buffer"); MemoryView& shaderTableMemoryView = static_cast(shaderTableBuffer.get())->GetMemoryView(); - shaderTableMemoryView.SetName("RayTracingShaderTable"); + shaderTableMemoryView.SetName(L"RayTracingShaderTable"); // copy records RHI::BufferMapResponse mapResponse; diff --git a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp index 8c4f63aacc..52e4aa4881 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp +++ b/Gems/Atom/RHI/DX12/Code/Source/RHI/RayTracingTlas.cpp @@ -66,7 +66,7 @@ namespace AZ AZ_Assert(resultCode == RHI::ResultCode::Success, "failed to create TLAS instances buffer"); MemoryView& tlasInstancesMemoryView = static_cast(buffers.m_tlasInstancesBuffer.get())->GetMemoryView(); - tlasInstancesMemoryView.SetName("TLAS Instance"); + tlasInstancesMemoryView.SetName(L"TLAS Instance"); RHI::BufferMapResponse mapResponse; resultCode = bufferPools.GetTlasInstancesBufferPool()->MapBuffer(RHI::BufferMapRequest(*buffers.m_tlasInstancesBuffer, 0, instanceDescsSizeInBytes), mapResponse); @@ -130,7 +130,7 @@ namespace AZ AZ_Assert(resultCode == RHI::ResultCode::Success, "failed to create TLAS scratch buffer"); MemoryView& scratchMemoryView = static_cast(buffers.m_scratchBuffer.get())->GetMemoryView(); - scratchMemoryView.SetName("TLAS Scratch"); + scratchMemoryView.SetName(L"TLAS Scratch"); // create TLAS buffer buffers.m_tlasBuffer = RHI::Factory::Get().CreateBuffer(); @@ -145,7 +145,7 @@ namespace AZ AZ_Assert(resultCode == RHI::ResultCode::Success, "failed to create TLAS buffer"); MemoryView& tlasMemoryView = static_cast(buffers.m_tlasBuffer.get())->GetMemoryView(); - tlasMemoryView.SetName("TLAS"); + tlasMemoryView.SetName(L"TLAS"); #endif return RHI::ResultCode::Success; } From 3535d6b6b34f8fb342414031fe3256abee10305f Mon Sep 17 00:00:00 2001 From: Junbo Liang <68558268+junbo75@users.noreply.github.com> Date: Fri, 10 Sep 2021 12:56:41 -0700 Subject: [PATCH 242/355] [AWS Automation] Stack tear down mechanism for the deployment on Jenkins (#3656) Make awsi_test_profile_vs2019 a nonblocking step to make sure that resources are cleaned up even though automation tests failed Signed-off-by: Junbo Liang --- .../Gem/PythonTests/AWS/README.md | 22 +++-- .../aws_metrics_automation_test.py | 8 +- .../build/Platform/Windows/build_config.json | 14 ++- .../Windows/destroy_cdk_applications.cmd | 92 +++++++++++++++++++ 4 files changed, 121 insertions(+), 15 deletions(-) create mode 100644 scripts/build/Platform/Windows/destroy_cdk_applications.cmd diff --git a/AutomatedTesting/Gem/PythonTests/AWS/README.md b/AutomatedTesting/Gem/PythonTests/AWS/README.md index 8b5e65d6d7..1429fc487f 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/README.md +++ b/AutomatedTesting/Gem/PythonTests/AWS/README.md @@ -8,19 +8,21 @@ ## Deploy CDK Applications 1. Go to the AWS IAM console and create an IAM role called o3de-automation-tests which adds your own account as as a trusted entity and uses the "AdministratorAccess" permissions policy. 2. Copy {engine_root}\scripts\build\Platform\Windows\deploy_cdk_applications.cmd to your engine root folder. -3. Open a Command Prompt window at the engine root and set the following environment variables: - Set O3DE_AWS_PROJECT_NAME=AWSAUTO - Set O3DE_AWS_DEPLOY_REGION=us-east-1 - Set ASSUME_ROLE_ARN="arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests" - Set COMMIT_ID=HEAD -4. Deploy the CDK applications for AWS gems by running deploy_cdk_applications.cmd in the same Command Prompt window. -5. Edit AWS\common\constants.py to replace the assume role ARN with your own: - arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests +3. Open a new Command Prompt window at the engine root and set the following environment variables: + Set O3DE_AWS_PROJECT_NAME=AWSAUTO + Set O3DE_AWS_DEPLOY_REGION=us-east-1 + Set ASSUME_ROLE_ARN="arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests" + Set COMMIT_ID=HEAD +4. In the same Command Prompt window, Deploy the CDK applications for AWS gems by running deploy_cdk_applications.cmd. ## Run Automation Tests ### CLI -Open a Command Prompt window at the engine root and run the following CLI command: +In the same Command Prompt window, run the following CLI command: python\python.cmd -m pytest {path_to_the_test_file} --build-directory {directory_to_the_profile_build} ### Pycharm -You can also run any specific automation test directly from Pycharm by providing the "--build-directory" argument in the Run Configuration. \ No newline at end of file +You can also run any specific automation test directly from Pycharm by providing the "--build-directory" argument in the Run Configuration. + +## Destroy CDK Applications +1. Copy {engine_root}\scripts\build\Platform\Windows\destroy_cdk_applications.cmd to your engine root folder. +2. In the same Command Prompt window, destroy the CDK applications for AWS gems by running destroy_cdk_applications.cmd. \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py index 1fb35cb9e8..a0a53f92b5 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py @@ -167,10 +167,6 @@ class TestAWSMetricsWindows(object): args=(aws_metrics_utils, resource_mappings, True)) kinesis_analytics_application_thread.start() - # Clear the analytics bucket objects before sending new metrics. - aws_metrics_utils.empty_bucket( - resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName')) - log_monitor = setup(launcher, asset_processor) # Kinesis analytics application needs to be in the running state before we start the game launcher. @@ -205,6 +201,10 @@ class TestAWSMetricsWindows(object): for thread in operational_threads: thread.join() + # Clear the analytics bucket objects so that the S3 bucket can be destroyed during tear down. + aws_metrics_utils.empty_bucket( + resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName')) + def test_unauthorized_user_request_rejected(self, level: str, launcher: pytest.fixture, diff --git a/scripts/build/Platform/Windows/build_config.json b/scripts/build/Platform/Windows/build_config.json index 689ba6935d..02bd01038a 100644 --- a/scripts/build/Platform/Windows/build_config.json +++ b/scripts/build/Platform/Windows/build_config.json @@ -220,13 +220,17 @@ ], "steps": [ "awsi_deployment", - "awsi_test_profile_vs2019" + "awsi_test_profile_vs2019", + "awsi_destruction" ] }, "awsi_test_profile_vs2019": { "TAGS": [ "weekly-build-metrics" ], + "PIPELINE_ENV": { + "NONBLOCKING_STEP": "True" + }, "COMMAND": "build_test_windows.cmd", "PARAMETERS": { "CONFIGURATION": "profile", @@ -411,5 +415,13 @@ }, "COMMAND": "deploy_cdk_applications.cmd", "PARAMETERS": {} + }, + "awsi_destruction": { + "TAGS": [], + "PIPELINE_ENV": { + "NONBLOCKING_STEP": "True" + }, + "COMMAND": "destroy_cdk_applications.cmd", + "PARAMETERS": {} } } diff --git a/scripts/build/Platform/Windows/destroy_cdk_applications.cmd b/scripts/build/Platform/Windows/destroy_cdk_applications.cmd new file mode 100644 index 0000000000..dacc9d327a --- /dev/null +++ b/scripts/build/Platform/Windows/destroy_cdk_applications.cmd @@ -0,0 +1,92 @@ +@ECHO OFF +REM +REM Copyright (c) Contributors to the Open 3D Engine Project. +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM +REM + +REM Destroy the CDK applcations for AWS gems (Windows only) +REM Prerequisites: +REM 1) Node.js is installed +REM 2) Node.js version >= 10.13.0, except for versions 13.0.0 - 13.6.0. A version in active long-term support is recommended. +SETLOCAL EnableDelayedExpansion + +SET SOURCE_DIRECTORY=%CD% +SET PATH=%SOURCE_DIRECTORY%\python;%PATH% +SET GEM_DIRECTORY=%SOURCE_DIRECTORY%\Gems + +REM Create and activate a virtualenv for the CDK destruction +CALL python -m venv .env +IF ERRORLEVEL 1 ( + ECHO [cdk_bootstrap] Failed to create a virtualenv for the CDK destruction + exit /b 1 +) +CALL .env\Scripts\activate.bat +IF ERRORLEVEL 1 ( + ECHO [cdk_bootstrap] Failed to activate the virtualenv for the CDK destruction + exit /b 1 +) + +ECHO [cdk_installation] Install the latest version of CDK +CALL npm uninstall -g aws-cdk +IF ERRORLEVEL 1 ( + ECHO [cdk_bootstrap] Failed to uninstall the current version of CDK + exit /b 1 +) +CALL npm install -g aws-cdk@latest +IF ERRORLEVEL 1 ( + ECHO [cdk_bootstrap] Failed to install the latest version of CDK + exit /b 1 +) + +REM Set temporary AWS credentials from the assume role +FOR /f "tokens=1,2,3" %%a IN ('CALL aws sts assume-role --query Credentials.[SecretAccessKey^,SessionToken^,AccessKeyId] --output text --role-arn %ASSUME_ROLE_ARN% --role-session-name o3de-Automation-session') DO ( + SET AWS_SECRET_ACCESS_KEY=%%a + SET AWS_SESSION_TOKEN=%%b + SET AWS_ACCESS_KEY_ID=%%c +) +FOR /F "tokens=4 delims=:" %%a IN ("%ASSUME_ROLE_ARN%") DO SET O3DE_AWS_DEPLOY_ACCOUNT=%%a + +SET ERROR_EXISTS=0 +CALL :DestroyCDKApplication AWSCore,ERROR_EXISTS +CALL :DestroyCDKApplication AWSClientAuth,ERROR_EXISTS +CALL :DestroyCDKApplication AWSMetrics,ERROR_EXISTS + +IF %ERROR_EXISTS% EQU 1 ( + EXIT /b 1 +) + +EXIT /b 0 + +:DestroyCDKApplication +REM Destroy the CDK application for a specific AWS gem +SET GEM_NAME=%~1 +ECHO [cdk_destruction] Destroy the CDK application for the %GEM_NAME% gem +PUSHD %GEM_DIRECTORY%\%GEM_NAME%\cdk + +REM Revert the CDK application code to a stable state using the provided commit ID +CALL git checkout %COMMIT_ID% -- . +IF ERRORLEVEL 1 ( + ECHO [git_checkout] Failed to checkout the CDK application for the %GEM_NAME% gem using commit ID %COMMIT_ID% + POPD + SET %~2=1 +) + +REM Install required packages for the CDK application +CALL python -m pip install -r requirements.txt +IF ERRORLEVEL 1 ( + ECHO [cdk_destruction] Failed to install required packages for the %GEM_NAME% gem + POPD + SET %~2=1 +) + +REM Destroy the CDK application +CALL cdk destroy --all -f +IF ERRORLEVEL 1 ( + ECHO [cdk_destruction] Failed to destroy the CDK application for the %GEM_NAME% gem + POPD + SET %~2=1 +) +POPD From 5bf749dcacab59b4c5a536fd9c2f68c33611c5ee Mon Sep 17 00:00:00 2001 From: Alex Peterson <26804013+AMZN-alexpete@users.noreply.github.com> Date: Fri, 10 Sep 2021 14:10:49 -0700 Subject: [PATCH 243/355] fix infinite loop due to thin triangles (#4027) * fix infinite loop due to thin triangles Signed-off-by: AMZN-alexpete <26804013+AMZN-alexpete@users.noreply.github.com> * check exact triangles size Signed-off-by: AMZN-alexpete <26804013+AMZN-alexpete@users.noreply.github.com> --- .../Code/Source/Shape/ShapeGeometryUtil.cpp | 11 ++++--- .../Code/Tests/ShapeGeometryUtilTest.cpp | 33 +++++++++++++++++++ 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.cpp b/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.cpp index 3b54447fdd..e8bf3748fa 100644 --- a/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.cpp +++ b/Gems/LmbrCentral/Code/Source/Shape/ShapeGeometryUtil.cpp @@ -152,17 +152,18 @@ namespace LmbrCentral const AZ::Vector2 edgeAfter = next - curr; const float triangleArea = Wedge(edgeBefore, edgeAfter); + const float tolerance = 0.001f; const bool interiorVertex = triangleArea <= 0.0f; - // if triangle is not an 'ear', continue. - if (!interiorVertex) + // if triangle is not an 'ear' and we have other vertices, continue. + if (!interiorVertex && vertices.size() > 3) { continue; } - // check no other vertices are inside the triangle formed - // by these three vertices, if so, continue to next vertex. - if (vertices.size() > 3) + // check if this is a large enough triangle, that there are no other vertices + // inside the triangle formed, otherwise, continue to next vertex. + if (vertices.size() > 3 && !AZ::IsClose(triangleArea, 0.f, tolerance)) { bool pointInside = false; for (size_t j = (nextIndex + 1) % vertices.size(); j != prevIndex; j = (j + 1) % vertices.size()) diff --git a/Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp b/Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp index 390b30abe3..77e4974db1 100644 --- a/Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/ShapeGeometryUtilTest.cpp @@ -94,6 +94,39 @@ namespace UnitTest EXPECT_TRUE(triangles.size() == 18); } + // thin + TEST_F(ShapeGeometryUtilTest, GenerateTrianglesThin) + { + // given a series of vertices that are known to cause an infinite loop in the past + // due to numerical precision issues with very thin triangles + AZStd::vector triangles = + LmbrCentral::GenerateTriangles( + { + AZ::Vector2( 2.00000000f, -1.50087357f), + AZ::Vector2( 2.00000000f, -1.24706364f), + AZ::Vector2( 1.99930608f, -0.999682188f), + AZ::Vector2( 1.99859631f, -0.746669292f), + AZ::Vector2( 1.99789453f, -0.496492654f), + AZ::Vector2( 1.89999998f, 34.4000015f), + AZ::Vector2( 1.95483327f, 0.787139893f), + AZ::Vector2( 1.95505607f, 0.650562286f), + AZ::Vector2( 1.95553458f, 0.357242584f), + AZ::Vector2( 1.95596826f, 0.0913925171f), + AZ::Vector2( 1.95620418f, -0.0532035828f), + AZ::Vector2( 1.95642424f, -0.188129425f), + AZ::Vector2( 1.95684254f, -0.444545746f), + AZ::Vector2( 1.95693028f, -0.498298645f), + AZ::Vector2( 1.95734584f, -0.753005981f), + AZ::Vector2( 1.95775008f, -1.00079727f), + AZ::Vector2( 1.95814919f, -1.24542999f), + AZ::Vector2( 1.95856297f, -1.49910200f) + } + ); + + // expect the algorithm completes and produces triangles (num verts - 2) * 3 + EXPECT_TRUE(triangles.size() == 48); + } + // test double to record if DrawTrianglesIndexed or DrawLines are called class DebugShapeDebugDisplayRequests : public AzFramework::DebugDisplayRequests { From 72cd282ad2f21aa479d764115040bb92a883e366 Mon Sep 17 00:00:00 2001 From: Chris Burel Date: Fri, 10 Sep 2021 15:16:33 -0700 Subject: [PATCH 244/355] Avoid redefining `PRI` macros on Linux (#4055) * Avoid redefining `PRI` macros on Linux The fixed width 64-bit integer types are defined differently per platform. Some platforms define it as "long", others define it as "long long". For consistency, `AZ::u64` or `AZ::s64` is always defined to "long long". However, this causes problems for formatting those types, because on platforms where `uint64_t` is a `long`, `PRIu64` gives the wrong format string for `AZ::u64`. Previously this was fixed by redefining the `PRI` macros so that they work for `AZ::u64`, but that breaks the ability to format `uint64_t`. We could add an AZ-specific version of the `PRI` macros for 64-bit integer types, but we don't really need to, since they are `long long` on every platform we support. * Use `%ll` for `AZ::u64` * Use `PRIu64` for `uint64_t` Signed-off-by: Chris Burel * Avoid redefining `PRI` macros in CryCommon Signed-off-by: Chris Burel --- .../UnixLike/AzCore/PlatformIncl_UnixLike.h | 13 ------------- Code/Legacy/CryCommon/platform.h | 15 ++------------- Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp | 11 ++--------- Code/Legacy/CrySystem/XML/xml.cpp | 11 ++--------- .../native/AssetManager/SourceFileRelocator.cpp | 4 ++-- .../native/utilities/assetUtils.cpp | 6 +++--- Gems/AudioSystem/Code/Source/Engine/ATL.cpp | 6 +++--- .../Code/Source/Engine/ATLAudioObject.cpp | 2 +- .../Builders/SliceBuilder/SliceBuilderWorker.cpp | 2 +- .../Code/Source/AreaSystemComponent.cpp | 4 ++-- 10 files changed, 18 insertions(+), 56 deletions(-) diff --git a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h index 451ba1763a..63e8a4ce70 100644 --- a/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h +++ b/Code/Framework/AzCore/Platform/Common/UnixLike/AzCore/PlatformIncl_UnixLike.h @@ -9,16 +9,3 @@ #pragma once #include - -#define __STDC_FORMAT_MACROS -#include - -// types like AZ::u64 require an usigned long long, but inttypes.h has it as unsigned long -#undef PRIX64 -#undef PRIx64 -#undef PRId64 -#undef PRIu64 -#define PRIX64 "llX" -#define PRIx64 "llx" -#define PRId64 "lld" -#define PRIu64 "llu" diff --git a/Code/Legacy/CryCommon/platform.h b/Code/Legacy/CryCommon/platform.h index 37f0636c3a..2baddaafd5 100644 --- a/Code/Legacy/CryCommon/platform.h +++ b/Code/Legacy/CryCommon/platform.h @@ -51,20 +51,9 @@ #undef AZ_RESTRICTED_SECTION_IMPLEMENTED #elif defined(LINUX) || defined(APPLE) #define __STDC_FORMAT_MACROS - #include - #if defined(APPLE) || defined(LINUX64) - // int64 is not the same type as the operating system's int64_t - #undef PRIX64 - #undef PRIx64 - #undef PRId64 - #undef PRIu64 - #define PRIX64 "llX" - #define PRIx64 "llx" - #define PRId64 "lld" - #define PRIu64 "llu" - #endif + #include #else - #include + #include #endif #if !defined(PRISIZE_T) diff --git a/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp b/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp index ec154b31e8..a13759e82b 100644 --- a/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp +++ b/Code/Legacy/CrySystem/XML/XMLBinaryNode.cpp @@ -125,7 +125,7 @@ bool CBinaryXmlNode::getAttr(const char* key, int64& value) const const char* svalue = GetValue(key); if (svalue) { - azsscanf(svalue, "%" PRId64, &value); + value = strtoll(svalue, nullptr, 10); return true; } return false; @@ -137,14 +137,7 @@ bool CBinaryXmlNode::getAttr(const char* key, uint64& value, bool useHexFormat) const char* svalue = GetValue(key); if (svalue) { - if (useHexFormat) - { - azsscanf(svalue, "%" PRIX64, &value); - } - else - { - azsscanf(svalue, "%" PRIu64, &value); - } + value = strtoull(svalue, nullptr, useHexFormat ? 16 : 10); return true; } return false; diff --git a/Code/Legacy/CrySystem/XML/xml.cpp b/Code/Legacy/CrySystem/XML/xml.cpp index b1f18142f1..826e74b758 100644 --- a/Code/Legacy/CrySystem/XML/xml.cpp +++ b/Code/Legacy/CrySystem/XML/xml.cpp @@ -400,7 +400,7 @@ bool CXmlNode::getAttr(const char* key, int64& value) const const char* svalue = GetValue(key); if (svalue) { - azsscanf(svalue, "%" PRId64, &value); + value = strtoll(key, nullptr, 10); return true; } return false; @@ -412,14 +412,7 @@ bool CXmlNode::getAttr(const char* key, uint64& value, bool useHexFormat) const const char* svalue = GetValue(key); if (svalue) { - if (useHexFormat) - { - azsscanf(svalue, "%" PRIX64, &value); - } - else - { - azsscanf(svalue, "%" PRIu64, &value); - } + value = strtoull(key, nullptr, useHexFormat ? 16 : 10); return true; } return false; diff --git a/Code/Tools/AssetProcessor/native/AssetManager/SourceFileRelocator.cpp b/Code/Tools/AssetProcessor/native/AssetManager/SourceFileRelocator.cpp index 64e176ffe4..04de6c64f3 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/SourceFileRelocator.cpp +++ b/Code/Tools/AssetProcessor/native/AssetManager/SourceFileRelocator.cpp @@ -699,7 +699,7 @@ Please note that only those seed files will get updated that are active for your if (isMove) { report.append(AZStd::string::format( - "SOURCEID: %" PRId64 ", CURRENT PATH: %s, NEW PATH: %s, CURRENT GUID: %s, NEW GUID: %s\n", + "SOURCEID: %lld, CURRENT PATH: %s, NEW PATH: %s, CURRENT GUID: %s, NEW GUID: %s\n", relocationInfo.m_sourceEntry.m_sourceID, relocationInfo.m_oldRelativePath.c_str(), relocationInfo.m_newRelativePath.c_str(), @@ -709,7 +709,7 @@ Please note that only those seed files will get updated that are active for your else { report.append(AZStd::string::format( - "SOURCEID: %" PRId64 ", CURRENT PATH: %s, CURRENT GUID: %s\n", + "SOURCEID: %lld, CURRENT PATH: %s, CURRENT GUID: %s\n", relocationInfo.m_sourceEntry.m_sourceID, relocationInfo.m_oldRelativePath.c_str(), relocationInfo.m_sourceEntry.m_sourceGuid.ToString().c_str())); diff --git a/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp b/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp index 85801bdf8a..c0e907f2d5 100644 --- a/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp +++ b/Code/Tools/AssetProcessor/native/utilities/assetUtils.cpp @@ -1018,7 +1018,7 @@ namespace AssetUtilities AZStd::string ComputeJobLogFileName(const AzToolsFramework::AssetSystem::JobInfo& jobInfo) { - return AZStd::string::format("%s-%u-%" PRIu64 ".log", jobInfo.m_sourceFile.c_str(), jobInfo.GetHash(), jobInfo.m_jobRunKey); + return AZStd::string::format("%s-%u-%llu.log", jobInfo.m_sourceFile.c_str(), jobInfo.GetHash(), jobInfo.m_jobRunKey); } AZStd::string ComputeJobLogFileName(const AssetBuilderSDK::CreateJobsRequest& createJobsRequest) @@ -1287,13 +1287,13 @@ namespace AssetUtilities // so we add the size of it too. // its also possible that it moved to a different file with the same modtime/hash AND size, // but with a different name. So we add that too. - return AZStd::string::format("%" PRIX64 ":%" PRIu64 ":%s", fileIdentifier, fileStateInfo.m_fileSize, nameToUse.c_str()); + return AZStd::string::format("%llX:%llu:%s", fileIdentifier, fileStateInfo.m_fileSize, nameToUse.c_str()); } } AZStd::string ComputeJobLogFileName(const AssetProcessor::JobEntry& jobEntry) { - return AZStd::string::format("%s-%u-%" PRIu64 ".log", jobEntry.m_databaseSourceName.toUtf8().constData(), jobEntry.GetHash(), jobEntry.m_jobRunKey); + return AZStd::string::format("%s-%u-%llu.log", jobEntry.m_databaseSourceName.toUtf8().constData(), jobEntry.GetHash(), jobEntry.m_jobRunKey); } bool CreateTempRootFolder(QString startFolder, QDir& tempRoot) diff --git a/Gems/AudioSystem/Code/Source/Engine/ATL.cpp b/Gems/AudioSystem/Code/Source/Engine/ATL.cpp index e43f7beba7..6a842785fa 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATL.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/ATL.cpp @@ -2144,7 +2144,7 @@ namespace Audio { if (bytes < (1 << 10)) { - azsnprintf(buffer, bufLength, "%" PRIu64 " B", bytes); + azsnprintf(buffer, bufLength, "%llu B", bytes); } else if (bytes < (1 << 20)) { @@ -2261,10 +2261,10 @@ namespace Audio auxGeom.Draw2dLabel(fPosX + xTablePositions[4], posY + lineHeight, textSize, color, false, "%s", buffer); auxGeom.Draw2dLabel(fPosX + xTablePositions[5], posY, textSize, color, false, "Total Allocs"); - auxGeom.Draw2dLabel(fPosX + xTablePositions[5], posY + lineHeight, textSize, color, false, "%" PRIu64, totalAllocs); + auxGeom.Draw2dLabel(fPosX + xTablePositions[5], posY + lineHeight, textSize, color, false, "%llu", totalAllocs); auxGeom.Draw2dLabel(fPosX + xTablePositions[6], posY, textSize, color, false, "Total Frees"); - auxGeom.Draw2dLabel(fPosX + xTablePositions[6], posY + lineHeight, textSize, color, false, "%" PRIu64, totalFrees); + auxGeom.Draw2dLabel(fPosX + xTablePositions[6], posY + lineHeight, textSize, color, false, "%llu", totalFrees); } else { diff --git a/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp b/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp index c8548efa04..6e229c7c0e 100644 --- a/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp +++ b/Gems/AudioSystem/Code/Source/Engine/ATLAudioObject.cpp @@ -762,7 +762,7 @@ namespace Audio AZStd::string eventsString; for (auto activeEvent : m_cActiveEvents) { - eventsString = AZStd::string::format("%s%" PRIu64 "%s", eventsString.c_str(), activeEvent, sSeparator); + eventsString = AZStd::string::format("%s%llu%s", eventsString.c_str(), activeEvent, sSeparator); } return eventsString; diff --git a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp index 79cf3ac282..d917a3b600 100644 --- a/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp +++ b/Gems/LmbrCentral/Code/Source/Builders/SliceBuilder/SliceBuilderWorker.cpp @@ -211,7 +211,7 @@ namespace SliceBuilder jobDescriptor.SetPlatformIdentifier(info.m_identifier.c_str()); jobDescriptor.m_additionalFingerprintInfo = AZStd::string(compilerVersion) - .append(AZStd::string::format("|%" PRIu64, static_cast(sourceSliceTypeFingerprint))); + .append(AZStd::string::format("|%zu", sourceSliceTypeFingerprint)); for (const auto& sourceDependency : sourceFileDependencies) { diff --git a/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp b/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp index 4ffed260de..6684aef913 100644 --- a/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp +++ b/Gems/Vegetation/Code/Source/AreaSystemComponent.cpp @@ -211,7 +211,7 @@ namespace Vegetation { return AZ::Failure( AZStd::string::format("The combination of View Area Grid Size and Sector Point Density will create %" PRId64 " instances. Only a max of %" PRId64 " instances is allowed.", - static_cast(totalInstances), static_cast(s_maxVegetationInstances))); + totalInstances, s_maxVegetationInstances)); } return AZ::Success(); @@ -235,7 +235,7 @@ namespace Vegetation { return AZ::Failure( AZStd::string::format("The combination of View Area Grid Size and Sector Point Density will create %" PRId64 " instances. Only a max of %" PRId64 " instances is allowed.", - static_cast(totalInstances), static_cast(s_maxVegetationInstances))); + totalInstances, s_maxVegetationInstances)); } const float instancesPerMeter = static_cast(sectorDensity) / static_cast(m_sectorSizeInMeters); From 8554cea0adb039e9b7c43579f7b4a4324eb6c7f3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:14:58 -0700 Subject: [PATCH 245/355] better organization of the warning Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Platform/Common/Clang/Configurations_clang.cmake | 12 +++++++++++- cmake/Platform/Common/MSVC/Configurations_msvc.cmake | 9 ++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 41949678be..5c24161a19 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -16,13 +16,23 @@ ly_append_configurations_options( -Wall -Werror - # Disabled warnings (please do not disable any others without first consulting ly-warnings) + ################### + # Disabled warnings (please do not disable any others without first consulting sig-build) + ################### + # -Wno-inconsistent-missing-override # unfortunately there is no warning in MSVC to detect missing overrides, + # MSVC's static analyzer can, but that is a different run that most developers are not ware of. A pass was + # done to fix all hits. Leaving this disabled until there is a matching warning in MSVC. + -Wrange-loop-analysis -Wno-unknown-warning-option # used as a way to mark warnings that are MSVC only -Wno-parentheses -Wno-reorder -Wno-switch -Wno-undefined-var-template + + ################### + # Enabled warnings (that are disabled by default) + ################### COMPILATION_DEBUG -O0 # No optimization diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index bac6cd6aa1..8885624a81 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -35,10 +35,14 @@ ly_append_configurations_options( /WX # Warnings as errors /permissive- # Conformance with standard - # Disabling some warnings + ################### + # Disabled warnings (please do not disable any others without first consulting sig-build) + ################### /wd4201 # nonstandard extension used: nameless struct/union. This actually became part of the C++11 std, MS has an open issue: https://developercommunity.visualstudio.com/t/warning-level-4-generates-a-bogus-warning-c4201-no/103064 - # Enabling warnings that are disabled by default from /W4 + ################### + # Enabled warnings (that are disabled by default from /W4) + ################### # https://docs.microsoft.com/en-us/cpp/preprocessor/compiler-warnings-that-are-off-by-default?view=vs-2019 /we4263 # 'function': member function does not override any base class virtual member function /we4264 # 'virtual_function': no override available for virtual member function from base 'class'; function is hidden @@ -54,7 +58,6 @@ ly_append_configurations_options( /we5032 # detected #pragma warning(push) with no corresponding #pragma warning(pop) /we5233 # explicit lambda capture 'identifier' is not used - /Zc:forScope # Force Conformance in for Loop Scope /diagnostics:caret # Compiler diagnostic options: includes the column where the issue was found and places a caret (^) under the location in the line of code where the issue was detected. /Zc:__cplusplus From 7f157f152dffe29c61309241b822226242724659 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:15:16 -0700 Subject: [PATCH 246/355] Code/Editor Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/2DViewport.h | 34 +-- Code/Editor/ActionManager.h | 2 +- Code/Editor/AnimationContext.h | 2 +- Code/Editor/BaseLibrary.h | 34 +-- Code/Editor/BaseLibraryManager.h | 84 +++--- Code/Editor/Controls/ColorGradientCtrl.h | 2 +- Code/Editor/Controls/FolderTreeCtrl.h | 2 +- .../ReflectedVarWrapper.h | 2 +- Code/Editor/Controls/SplineCtrlEx.h | 22 +- Code/Editor/Controls/TimelineCtrl.h | 4 +- Code/Editor/EditorToolsApplication.h | 2 +- Code/Editor/Export/ExportManager.h | 30 +- Code/Editor/IEditorImpl.h | 282 +++++++++--------- Code/Editor/LevelTreeModel.h | 2 +- Code/Editor/Objects/AxisGizmo.h | 18 +- Code/Editor/Objects/BaseObject.h | 2 +- Code/Editor/Objects/EntityObject.h | 54 ++-- Code/Editor/Objects/GizmoManager.h | 8 +- Code/Editor/Objects/LineGizmo.h | 8 +- Code/Editor/Objects/ObjectManager.h | 148 ++++----- .../Objects/ComponentEntityObject.h | 4 +- .../SandboxIntegration.h | 2 +- .../ComponentPalette/FavoriteComponentList.h | 2 +- .../UI/Outliner/OutlinerListModel.hxx | 2 +- Code/Editor/PreferencesStdPages.h | 12 +- Code/Editor/QtViewPane.h | 8 +- Code/Editor/SelectSequenceDialog.h | 2 +- Code/Editor/ToolbarCustomizationDialog.h | 2 +- Code/Editor/TopRendererWnd.h | 10 +- .../TrackView/SequenceBatchRenderDialog.h | 2 +- Code/Editor/TrackView/TrackViewCurveEditor.h | 10 +- Code/Editor/TrackView/TrackViewDialog.h | 12 +- Code/Editor/TrackView/TrackViewSequence.h | 32 +- .../TrackView/TrackViewSequenceManager.h | 4 +- Code/Editor/TrackView/TrackViewSplineCtrl.h | 10 +- Code/Editor/Util/ColumnGroupTreeView.h | 2 +- Code/Editor/Util/Variable.h | 84 +++--- Code/Editor/Viewport.h | 104 +++---- Code/Editor/ViewportTitleDlg.h | 2 +- 39 files changed, 524 insertions(+), 524 deletions(-) diff --git a/Code/Editor/2DViewport.h b/Code/Editor/2DViewport.h index 4ffda18514..007c1a47d3 100644 --- a/Code/Editor/2DViewport.h +++ b/Code/Editor/2DViewport.h @@ -35,32 +35,32 @@ public: Q2DViewport(QWidget* parent = nullptr); virtual ~Q2DViewport(); - virtual void SetType(EViewportType type); - virtual EViewportType GetType() const { return m_viewType; } - virtual float GetAspectRatio() const { return 1.0f; }; + void SetType(EViewportType type) override; + EViewportType GetType() const override { return m_viewType; } + float GetAspectRatio() const override { return 1.0f; }; - virtual void ResetContent(); - virtual void UpdateContent(int flags); + void ResetContent() override; + void UpdateContent(int flags) override; public slots: // Called every frame to update viewport. - virtual void Update(); + void Update() override; public: //! Map world space position to viewport position. - virtual QPoint WorldToView(const Vec3& wp) const; + QPoint WorldToView(const Vec3& wp) const override; - virtual QPoint WorldToViewParticleEditor(const Vec3& wp, int width, int height) const; //Eric@conffx + QPoint WorldToViewParticleEditor(const Vec3& wp, int width, int height) const override; //Eric@conffx //! Map viewport position to world space position. - virtual Vec3 ViewToWorld(const QPoint& vp, bool* collideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override; + Vec3 ViewToWorld(const QPoint& vp, bool* collideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override; //! Map viewport position to world space ray from camera. - virtual void ViewToWorldRay(const QPoint& vp, Vec3& raySrc, Vec3& rayDir) const; + void ViewToWorldRay(const QPoint& vp, Vec3& raySrc, Vec3& rayDir) const override; void OnTitleMenu(QMenu* menu) override; - virtual bool HitTest(const QPoint& point, HitContext& hitInfo) override; - virtual bool IsBoundsVisible(const AABB& box) const; + bool HitTest(const QPoint& point, HitContext& hitInfo) override; + bool IsBoundsVisible(const AABB& box) const override; // ovverided from CViewport. float GetScreenScaleFactor(const Vec3& worldPoint) const override; @@ -111,8 +111,8 @@ protected: virtual void SetZoom(float fZoomFactor, const QPoint& center); // overrides from CViewport. - virtual void MakeConstructionPlane(int axis); - virtual const Matrix34& GetConstructionMatrix(RefCoordSys coordSys); + void MakeConstructionPlane(int axis) override; + const Matrix34& GetConstructionMatrix(RefCoordSys coordSys) override; //! Calculate view transformation matrix. virtual void CalculateViewTM(); @@ -146,9 +146,9 @@ protected: void showEvent(QShowEvent* event) override; void paintEvent(QPaintEvent* event) override; int OnCreate(); - void OnRButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point); - void OnRButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point); - void OnMouseWheel(Qt::KeyboardModifiers modifiers, short zDelta, const QPoint& pt); + void OnRButtonDown(Qt::KeyboardModifiers modifiers, const QPoint& point) override; + void OnRButtonUp(Qt::KeyboardModifiers modifiers, const QPoint& point) override; + void OnMouseWheel(Qt::KeyboardModifiers modifiers, short zDelta, const QPoint& pt) override; void OnDestroy(); protected: diff --git a/Code/Editor/ActionManager.h b/Code/Editor/ActionManager.h index 2481b7e3ef..8879bdc1fb 100644 --- a/Code/Editor/ActionManager.h +++ b/Code/Editor/ActionManager.h @@ -353,7 +353,7 @@ public: m_actionHandlers[id] = std::bind(method, object, id); } - bool eventFilter(QObject* watched, QEvent* event); + bool eventFilter(QObject* watched, QEvent* event) override; // returns false if the action was already inserted, indicating that the action should not be processed again bool InsertActionExecuting(int id); diff --git a/Code/Editor/AnimationContext.h b/Code/Editor/AnimationContext.h index 98c951eda7..62ffa26634 100644 --- a/Code/Editor/AnimationContext.h +++ b/Code/Editor/AnimationContext.h @@ -197,7 +197,7 @@ private: virtual void OnSequenceRemoved(CTrackViewSequence* pSequence) override; - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event); + virtual void OnEditorNotifyEvent(EEditorNotifyEvent event) override; void AnimateActiveSequence(); diff --git a/Code/Editor/BaseLibrary.h b/Code/Editor/BaseLibrary.h index 6c807df56b..55079d3fde 100644 --- a/Code/Editor/BaseLibrary.h +++ b/Code/Editor/BaseLibrary.h @@ -40,57 +40,57 @@ public: //! Set library name. virtual void SetName(const QString& name); //! Get library name. - const QString& GetName() const; + const QString& GetName() const override; //! Set new filename for this library. virtual bool SetFilename(const QString& filename, [[maybe_unused]] bool checkForUnique = true) { m_filename = filename.toLower(); return true; }; - const QString& GetFilename() const { return m_filename; }; + const QString& GetFilename() const override { return m_filename; }; - virtual bool Save() = 0; - virtual bool Load(const QString& filename) = 0; - virtual void Serialize(XmlNodeRef& node, bool bLoading) = 0; + bool Save() override = 0; + bool Load(const QString& filename) override = 0; + void Serialize(XmlNodeRef& node, bool bLoading) override = 0; //! Mark library as modified. - void SetModified(bool bModified = true); + void SetModified(bool bModified = true) override; //! Check if library was modified. - bool IsModified() const { return m_bModified; }; + bool IsModified() const override { return m_bModified; }; ////////////////////////////////////////////////////////////////////////// // Working with items. ////////////////////////////////////////////////////////////////////////// //! Add a new prototype to library. - void AddItem(IDataBaseItem* item, bool bRegister = true); + void AddItem(IDataBaseItem* item, bool bRegister = true) override; //! Get number of known prototypes. - int GetItemCount() const { return static_cast(m_items.size()); } + int GetItemCount() const override { return static_cast(m_items.size()); } //! Get prototype by index. - IDataBaseItem* GetItem(int index); + IDataBaseItem* GetItem(int index) override; //! Delete item by pointer of item. - void RemoveItem(IDataBaseItem* item); + void RemoveItem(IDataBaseItem* item) override; //! Delete all items from library. - void RemoveAllItems(); + void RemoveAllItems() override; //! Find library item by name. //! Using linear search. - IDataBaseItem* FindItem(const QString& name); + IDataBaseItem* FindItem(const QString& name) override; //! Check if this library is local level library. - bool IsLevelLibrary() const { return m_bLevelLib; }; + bool IsLevelLibrary() const override { return m_bLevelLib; }; //! Set library to be level library. - void SetLevelLibrary(bool bEnable) { m_bLevelLib = bEnable; }; + void SetLevelLibrary(bool bEnable) override { m_bLevelLib = bEnable; }; ////////////////////////////////////////////////////////////////////////// //! Return manager for this library. - IBaseLibraryManager* GetManager(); + IBaseLibraryManager* GetManager() override; // Saves the library with the main tag defined by the parameter name bool SaveLibrary(const char* name, bool saveEmptyLibrary = false); //CONFETTI BEGIN // Used to change the library item order - virtual void ChangeItemOrder(CBaseLibraryItem* item, unsigned int newLocation) override; + void ChangeItemOrder(CBaseLibraryItem* item, unsigned int newLocation) override; //CONFETTI END signals: diff --git a/Code/Editor/BaseLibraryManager.h b/Code/Editor/BaseLibraryManager.h index 6f0b905760..118c7ef1f0 100644 --- a/Code/Editor/BaseLibraryManager.h +++ b/Code/Editor/BaseLibraryManager.h @@ -35,112 +35,112 @@ public: ~CBaseLibraryManager(); //! Clear all libraries. - virtual void ClearAll() override; + void ClearAll() override; ////////////////////////////////////////////////////////////////////////// // IDocListener implementation. ////////////////////////////////////////////////////////////////////////// - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event) override; + void OnEditorNotifyEvent(EEditorNotifyEvent event) override; ////////////////////////////////////////////////////////////////////////// // Library items. ////////////////////////////////////////////////////////////////////////// //! Make a new item in specified library. - virtual IDataBaseItem* CreateItem(IDataBaseLibrary* pLibrary) override; + IDataBaseItem* CreateItem(IDataBaseLibrary* pLibrary) override; //! Delete item from library and manager. - virtual void DeleteItem(IDataBaseItem* pItem) override; + void DeleteItem(IDataBaseItem* pItem) override; //! Find Item by its GUID. - virtual IDataBaseItem* FindItem(REFGUID guid) const; - virtual IDataBaseItem* FindItemByName(const QString& fullItemName); - virtual IDataBaseItem* LoadItemByName(const QString& fullItemName); + IDataBaseItem* FindItem(REFGUID guid) const override; + IDataBaseItem* FindItemByName(const QString& fullItemName) override; + IDataBaseItem* LoadItemByName(const QString& fullItemName) override; virtual IDataBaseItem* FindItemByName(const char* fullItemName); virtual IDataBaseItem* LoadItemByName(const char* fullItemName); - virtual IDataBaseItemEnumerator* GetItemEnumerator() override; + IDataBaseItemEnumerator* GetItemEnumerator() override; ////////////////////////////////////////////////////////////////////////// // Set item currently selected. - virtual void SetSelectedItem(IDataBaseItem* pItem) override; + void SetSelectedItem(IDataBaseItem* pItem) override; // Get currently selected item. - virtual IDataBaseItem* GetSelectedItem() const override; - virtual IDataBaseItem* GetSelectedParentItem() const override; + IDataBaseItem* GetSelectedItem() const override; + IDataBaseItem* GetSelectedParentItem() const override; ////////////////////////////////////////////////////////////////////////// // Libraries. ////////////////////////////////////////////////////////////////////////// //! Add Item library. - virtual IDataBaseLibrary* AddLibrary(const QString& library, bool bIsLevelLibrary = false, bool bIsLoading = true) override; - virtual void DeleteLibrary(const QString& library, bool forceDeleteLevel = false) override; + IDataBaseLibrary* AddLibrary(const QString& library, bool bIsLevelLibrary = false, bool bIsLoading = true) override; + void DeleteLibrary(const QString& library, bool forceDeleteLevel = false) override; //! Get number of libraries. - virtual int GetLibraryCount() const override { return static_cast(m_libs.size()); }; + int GetLibraryCount() const override { return static_cast(m_libs.size()); }; //! Get number of modified libraries. - virtual int GetModifiedLibraryCount() const override; + int GetModifiedLibraryCount() const override; //! Get Item library by index. - virtual IDataBaseLibrary* GetLibrary(int index) const override; + IDataBaseLibrary* GetLibrary(int index) const override; //! Get Level Item library. - virtual IDataBaseLibrary* GetLevelLibrary() const override; + IDataBaseLibrary* GetLevelLibrary() const override; //! Find Items Library by name. - virtual IDataBaseLibrary* FindLibrary(const QString& library) override; + IDataBaseLibrary* FindLibrary(const QString& library) override; //! Find Items Library's index by name. int FindLibraryIndex(const QString& library) override; //! Load Items library. - virtual IDataBaseLibrary* LoadLibrary(const QString& filename, bool bReload = false) override; + IDataBaseLibrary* LoadLibrary(const QString& filename, bool bReload = false) override; //! Save all modified libraries. - virtual void SaveAllLibs() override; + void SaveAllLibs() override; //! Serialize property manager. - virtual void Serialize(XmlNodeRef& node, bool bLoading) override; + void Serialize(XmlNodeRef& node, bool bLoading) override; //! Export items to game. - virtual void Export([[maybe_unused]] XmlNodeRef& node) override {}; + void Export([[maybe_unused]] XmlNodeRef& node) override {}; //! Returns unique name base on input name. - virtual QString MakeUniqueItemName(const QString& name, const QString& libName = "") override; - virtual QString MakeFullItemName(IDataBaseLibrary* pLibrary, const QString& group, const QString& itemName) override; + QString MakeUniqueItemName(const QString& name, const QString& libName = "") override; + QString MakeFullItemName(IDataBaseLibrary* pLibrary, const QString& group, const QString& itemName) override; //! Root node where this library will be saved. - virtual QString GetRootNodeName() override = 0; + QString GetRootNodeName() override = 0; //! Path to libraries in this manager. - virtual QString GetLibsPath() override = 0; + QString GetLibsPath() override = 0; ////////////////////////////////////////////////////////////////////////// //! Validate library items for errors. - virtual void Validate() override; + void Validate() override; ////////////////////////////////////////////////////////////////////////// - virtual void GatherUsedResources(CUsedResources& resources) override; + void GatherUsedResources(CUsedResources& resources) override; - virtual void AddListener(IDataBaseManagerListener* pListener) override; - virtual void RemoveListener(IDataBaseManagerListener* pListener) override; + void AddListener(IDataBaseManagerListener* pListener) override; + void RemoveListener(IDataBaseManagerListener* pListener) override; ////////////////////////////////////////////////////////////////////////// - virtual void RegisterItem(CBaseLibraryItem* pItem, REFGUID newGuid) override; - virtual void RegisterItem(CBaseLibraryItem* pItem) override; - virtual void UnregisterItem(CBaseLibraryItem* pItem) override; + void RegisterItem(CBaseLibraryItem* pItem, REFGUID newGuid) override; + void RegisterItem(CBaseLibraryItem* pItem) override; + void UnregisterItem(CBaseLibraryItem* pItem) override; // Only Used internally. - virtual void OnRenameItem(CBaseLibraryItem* pItem, const QString& oldName) override; + void OnRenameItem(CBaseLibraryItem* pItem, const QString& oldName) override; // Called by items to indicated that they have been modified. // Sends item changed event to listeners. - virtual void OnItemChanged(IDataBaseItem* pItem) override; - virtual void OnUpdateProperties(IDataBaseItem* pItem, bool bRefresh) override; + void OnItemChanged(IDataBaseItem* pItem) override; + void OnUpdateProperties(IDataBaseItem* pItem, bool bRefresh) override; QString MakeFilename(const QString& library); - virtual bool IsUniqueFilename(const QString& library) override; + bool IsUniqueFilename(const QString& library) override; //CONFETTI BEGIN // Used to change the library item order - virtual void ChangeLibraryOrder(IDataBaseLibrary* lib, unsigned int newLocation) override; + void ChangeLibraryOrder(IDataBaseLibrary* lib, unsigned int newLocation) override; - virtual bool SetLibraryName(CBaseLibrary* lib, const QString& name) override; + bool SetLibraryName(CBaseLibrary* lib, const QString& name) override; protected: void SplitFullItemName(const QString& fullItemName, QString& libraryName, QString& itemName); @@ -199,8 +199,8 @@ public: m_pMap = pMap; m_iterator = m_pMap->begin(); } - virtual void Release() { delete this; }; - virtual IDataBaseItem* GetFirst() + void Release() override { delete this; }; + IDataBaseItem* GetFirst() override { m_iterator = m_pMap->begin(); if (m_iterator == m_pMap->end()) @@ -209,7 +209,7 @@ public: } return m_iterator->second; } - virtual IDataBaseItem* GetNext() + IDataBaseItem* GetNext() override { if (m_iterator != m_pMap->end()) { diff --git a/Code/Editor/Controls/ColorGradientCtrl.h b/Code/Editor/Controls/ColorGradientCtrl.h index a3f95fcd8c..bb1a83b0c1 100644 --- a/Code/Editor/Controls/ColorGradientCtrl.h +++ b/Code/Editor/Controls/ColorGradientCtrl.h @@ -81,7 +81,7 @@ protected: HIT_SPLINE, }; - void paintEvent(QPaintEvent* e); + void paintEvent(QPaintEvent* e) override; void resizeEvent(QResizeEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void mouseReleaseEvent(QMouseEvent* event) override; diff --git a/Code/Editor/Controls/FolderTreeCtrl.h b/Code/Editor/Controls/FolderTreeCtrl.h index 48eff10a92..f74cca6143 100644 --- a/Code/Editor/Controls/FolderTreeCtrl.h +++ b/Code/Editor/Controls/FolderTreeCtrl.h @@ -83,7 +83,7 @@ protected Q_SLOTS: void OnIndexDoubleClicked(const QModelIndex& index); protected: - virtual void OnFileMonitorChange(const SFileChangeInfo& rChange); + void OnFileMonitorChange(const SFileChangeInfo& rChange) override; void contextMenuEvent(QContextMenuEvent* e) override; void InitTree(); diff --git a/Code/Editor/Controls/ReflectedPropertyControl/ReflectedVarWrapper.h b/Code/Editor/Controls/ReflectedPropertyControl/ReflectedVarWrapper.h index 9c49f1ae1a..4bcd6dcaa3 100644 --- a/Code/Editor/Controls/ReflectedPropertyControl/ReflectedVarWrapper.h +++ b/Code/Editor/Controls/ReflectedPropertyControl/ReflectedVarWrapper.h @@ -123,7 +123,7 @@ public: void SetVariable(IVariable* pVariable) override; void SyncReflectedVarToIVar(IVariable* pVariable) override; void SyncIVarToReflectedVar(IVariable* pVariable) override; - virtual void OnVariableChange(IVariable* var); + void OnVariableChange(IVariable* var) override; CReflectedVar* GetReflectedVar() override { return m_reflectedVar.data(); } protected: diff --git a/Code/Editor/Controls/SplineCtrlEx.h b/Code/Editor/Controls/SplineCtrlEx.h index 711cbcf8d4..9bf412f056 100644 --- a/Code/Editor/Controls/SplineCtrlEx.h +++ b/Code/Editor/Controls/SplineCtrlEx.h @@ -159,15 +159,15 @@ public: ////////////////////////////////////////////////////////////////////////// // IKeyTimeSet Implementation - virtual int GetKeyTimeCount() const; - virtual float GetKeyTime(int index) const; - virtual void MoveKeyTimes(int numChanges, int* indices, float scale, float offset, bool copyKeys); - virtual bool GetKeyTimeSelected(int index) const; - virtual void SetKeyTimeSelected(int index, bool selected); - virtual int GetKeyCount(int index) const; - virtual int GetKeyCountBound() const; - virtual void BeginEdittingKeyTimes(); - virtual void EndEdittingKeyTimes(); + int GetKeyTimeCount() const override; + float GetKeyTime(int index) const override; + void MoveKeyTimes(int numChanges, int* indices, float scale, float offset, bool copyKeys) override; + bool GetKeyTimeSelected(int index) const override; + void SetKeyTimeSelected(int index, bool selected) override; + int GetKeyCount(int index) const override; + int GetKeyCountBound() const override; + void BeginEdittingKeyTimes() override; + void EndEdittingKeyTimes() override; void SetEditLock(bool bLock) { m_bEditLock = bLock; } @@ -361,8 +361,8 @@ public: SplineWidget(QWidget* parent); virtual ~SplineWidget(); - void update() { QWidget::update(); } - void update(const QRect& rect) { QWidget::update(rect); } + void update() override { QWidget::update(); } + void update(const QRect& rect) override { QWidget::update(rect); } QPoint mapFromGlobal(const QPoint& point) const override { return QWidget::mapFromGlobal(point); } diff --git a/Code/Editor/Controls/TimelineCtrl.h b/Code/Editor/Controls/TimelineCtrl.h index f87bdf3410..7e1fc6fcb2 100644 --- a/Code/Editor/Controls/TimelineCtrl.h +++ b/Code/Editor/Controls/TimelineCtrl.h @@ -56,7 +56,7 @@ public: void setGeometry(const QRect& r) override { QWidget::setGeometry(r); } void SetTimeRange(const Range& r) { m_timeRange = r; } - void SetTimeMarker(float fTime); + void SetTimeMarker(float fTime) override; float GetTimeMarker() const { return m_fTimeMarker; } void SetZoom(float fZoom); @@ -113,7 +113,7 @@ protected: void OnLButtonUp(const QPoint& point, Qt::KeyboardModifiers modifiers); void OnRButtonDown(const QPoint& point, Qt::KeyboardModifiers modifiers); void OnRButtonUp(const QPoint& point, Qt::KeyboardModifiers modifiers); - void keyPressEvent(QKeyEvent* event); + void keyPressEvent(QKeyEvent* event) override; // Drawing functions float ClientToTime(int x); diff --git a/Code/Editor/EditorToolsApplication.h b/Code/Editor/EditorToolsApplication.h index 93916cfc8c..422772cbc4 100644 --- a/Code/Editor/EditorToolsApplication.h +++ b/Code/Editor/EditorToolsApplication.h @@ -28,7 +28,7 @@ namespace EditorInternal void RegisterCoreComponents() override; - AZ::ComponentTypeList GetRequiredSystemComponents() const; + AZ::ComponentTypeList GetRequiredSystemComponents() const override; void StartCommon(AZ::Entity* systemEntity) override; diff --git a/Code/Editor/Export/ExportManager.h b/Code/Editor/Export/ExportManager.h index 4417a0ae89..14318be957 100644 --- a/Code/Editor/Export/ExportManager.h +++ b/Code/Editor/Export/ExportManager.h @@ -36,8 +36,8 @@ namespace Export public: CMesh(); - virtual int GetFaceCount() const { return static_cast(m_faces.size()); } - virtual const Face* GetFaceBuffer() const { return m_faces.size() ? &m_faces[0] : 0; } + int GetFaceCount() const override { return static_cast(m_faces.size()); } + const Face* GetFaceBuffer() const override { return !m_faces.empty() ? &m_faces[0] : nullptr; } private: std::vector m_faces; @@ -54,13 +54,13 @@ namespace Export CObject(const char* pName); int GetVertexCount() const override { return static_cast(m_vertices.size()); } - const Vector3D* GetVertexBuffer() const override { return m_vertices.size() ? &m_vertices[0] : nullptr; } + const Vector3D* GetVertexBuffer() const override { return !m_vertices.empty() ? &m_vertices[0] : nullptr; } int GetNormalCount() const override { return static_cast(m_normals.size()); } - const Vector3D* GetNormalBuffer() const override { return m_normals.size() ? &m_normals[0] : nullptr; } + const Vector3D* GetNormalBuffer() const override { return !m_normals.empty() ? &m_normals[0] : nullptr; } int GetTexCoordCount() const override { return static_cast(m_texCoords.size()); } - const UV* GetTexCoordBuffer() const override { return m_texCoords.size() ? &m_texCoords[0] : nullptr; } + const UV* GetTexCoordBuffer() const override { return !m_texCoords.empty() ? &m_texCoords[0] : nullptr; } int GetMeshCount() const override { return static_cast(m_meshes.size()); } Mesh* GetMesh(int index) const override { return m_meshes[index]; } @@ -68,9 +68,9 @@ namespace Export size_t MeshHash() const override{return m_MeshHash; } void SetMaterialName(const char* pName); - virtual int GetEntityAnimationDataCount() const {return static_cast(m_entityAnimData.size()); } - virtual const EntityAnimData* GetEntityAnimationData(int index) const {return &m_entityAnimData[index]; } - virtual void SetEntityAnimationData(EntityAnimData entityData){ m_entityAnimData.push_back(entityData); }; + int GetEntityAnimationDataCount() const override {return static_cast(m_entityAnimData.size()); } + const EntityAnimData* GetEntityAnimationData(int index) const override {return &m_entityAnimData[index]; } + void SetEntityAnimationData(EntityAnimData entityData) override{ m_entityAnimData.push_back(entityData); }; void SetLastPtr(CBaseObject* pObject){m_pLastObject = pObject; }; CBaseObject* GetLastObjectPtr(){return m_pLastObject; }; @@ -94,9 +94,9 @@ namespace Export public: virtual ~CData() = default; - virtual int GetObjectCount() const { return static_cast(m_objects.size()); } - virtual Object* GetObject(int index) const { return m_objects[index]; } - virtual Object* AddObject(const char* objectName); + int GetObjectCount() const override { return static_cast(m_objects.size()); } + Object* GetObject(int index) const override { return m_objects[index]; } + Object* AddObject(const char* objectName) override; void Clear(); private: @@ -119,7 +119,7 @@ public: //! Register exporter //! return true if succeed, otherwise false - virtual bool RegisterExporter(IExporter* pExporter); + bool RegisterExporter(IExporter* pExporter) override; //! Export specified geometry //! return true if succeed, otherwise false @@ -141,15 +141,15 @@ public: //! Exports the stat obj to the obj file specified //! returns true if succeeded, otherwise false - virtual bool ExportSingleStatObj(IStatObj* pStatObj, const char* filename); + bool ExportSingleStatObj(IStatObj* pStatObj, const char* filename) override; void SetBakedKeysSequenceExport(bool bBaked){m_bBakedKeysSequenceExport = bBaked; }; void SaveNodeKeysTimeToXML(); private: - void AddMesh(Export::CObject* pObj, const IIndexedMesh* pIndMesh, Matrix34A* pTm = 0); - bool AddStatObj(Export::CObject* pObj, IStatObj* pStatObj, Matrix34A* pTm = 0); + void AddMesh(Export::CObject* pObj, const IIndexedMesh* pIndMesh, Matrix34A* pTm = nullptr); + bool AddStatObj(Export::CObject* pObj, IStatObj* pStatObj, Matrix34A* pTm = nullptr); bool AddMeshes(Export::CObject* pObj); bool AddObject(CBaseObject* pBaseObj); void SolveHierarchy(); diff --git a/Code/Editor/IEditorImpl.h b/Code/Editor/IEditorImpl.h index 762dd1db11..26701edec2 100644 --- a/Code/Editor/IEditorImpl.h +++ b/Code/Editor/IEditorImpl.h @@ -79,70 +79,70 @@ public: void SetGameEngine(CGameEngine* ge); - void DeleteThis() { delete this; }; - IEditorClassFactory* GetClassFactory(); - CEditorCommandManager* GetCommandManager() { return m_pCommandManager; }; - ICommandManager* GetICommandManager() { return m_pCommandManager; } - void ExecuteCommand(const char* sCommand, ...); - void ExecuteCommand(const QString& command); - void SetDocument(CCryEditDoc* pDoc); - CCryEditDoc* GetDocument() const; + void DeleteThis() override { delete this; }; + IEditorClassFactory* GetClassFactory() override; + CEditorCommandManager* GetCommandManager() override { return m_pCommandManager; }; + ICommandManager* GetICommandManager() override { return m_pCommandManager; } + void ExecuteCommand(const char* sCommand, ...) override; + void ExecuteCommand(const QString& command) override; + void SetDocument(CCryEditDoc* pDoc) override; + CCryEditDoc* GetDocument() const override; bool IsLevelLoaded() const override; - void SetModifiedFlag(bool modified = true); - void SetModifiedModule(EModifiedModule eModifiedModule, bool boSet = true); - bool IsLevelExported() const; - bool SetLevelExported(bool boExported = true); + void SetModifiedFlag(bool modified = true) override; + void SetModifiedModule(EModifiedModule eModifiedModule, bool boSet = true) override; + bool IsLevelExported() const override; + bool SetLevelExported(bool boExported = true) override; void InitFinished(); - bool IsModified(); - bool IsInitialized() const{ return m_bInitialized; } - bool SaveDocument(); - ISystem* GetSystem(); - void WriteToConsole(const char* string) { CLogFile::WriteLine(string); }; - void WriteToConsole(const QString& string) { CLogFile::WriteLine(string); }; + bool IsModified() override; + bool IsInitialized() const override{ return m_bInitialized; } + bool SaveDocument() override; + ISystem* GetSystem() override; + void WriteToConsole(const char* string) override { CLogFile::WriteLine(string); }; + void WriteToConsole(const QString& string) override { CLogFile::WriteLine(string); }; // Change the message in the status bar - void SetStatusText(const QString& pszString); - virtual IMainStatusBar* GetMainStatusBar() override; - bool ShowConsole([[maybe_unused]] bool show) + void SetStatusText(const QString& pszString) override; + IMainStatusBar* GetMainStatusBar() override; + bool ShowConsole([[maybe_unused]] bool show) override { //if (AfxGetMainWnd())return ((CMainFrame *) (AfxGetMainWnd()))->ShowConsole(show); return false; } - void SetConsoleVar(const char* var, float value); - float GetConsoleVar(const char* var); + void SetConsoleVar(const char* var, float value) override; + float GetConsoleVar(const char* var) override; //! Query main window of the editor QMainWindow* GetEditorMainWindow() const override { return MainWindow::instance(); }; - QString GetPrimaryCDFolder(); + QString GetPrimaryCDFolder() override; QString GetLevelName() override; - QString GetLevelFolder(); - QString GetLevelDataFolder(); - QString GetSearchPath(EEditorPathName path); - QString GetResolvedUserFolder(); - bool ExecuteConsoleApp(const QString& CommandLine, QString& OutputText, bool bNoTimeOut = false, bool bShowWindow = false); - virtual bool IsInGameMode() override; - virtual void SetInGameMode(bool inGame) override; - virtual bool IsInSimulationMode() override; - virtual bool IsInTestMode() override; - virtual bool IsInPreviewMode() override; - virtual bool IsInConsolewMode() override; - virtual bool IsInLevelLoadTestMode() override; - virtual bool IsInMatEditMode() override { return m_bMatEditMode; } + QString GetLevelFolder() override; + QString GetLevelDataFolder() override; + QString GetSearchPath(EEditorPathName path) override; + QString GetResolvedUserFolder() override; + bool ExecuteConsoleApp(const QString& CommandLine, QString& OutputText, bool bNoTimeOut = false, bool bShowWindow = false) override; + bool IsInGameMode() override; + void SetInGameMode(bool inGame) override; + bool IsInSimulationMode() override; + bool IsInTestMode() override; + bool IsInPreviewMode() override; + bool IsInConsolewMode() override; + bool IsInLevelLoadTestMode() override; + bool IsInMatEditMode() override { return m_bMatEditMode; } //! Enables/Disable updates of editor. - void EnableUpdate(bool enable) { m_bUpdates = enable; }; + void EnableUpdate(bool enable) override { m_bUpdates = enable; }; //! Enable/Disable accelerator table, (Enabled by default). - void EnableAcceleratos(bool bEnable); - CGameEngine* GetGameEngine() { return m_pGameEngine; }; - CDisplaySettings* GetDisplaySettings() { return m_pDisplaySettings; }; - const SGizmoParameters& GetGlobalGizmoParameters(); - CBaseObject* NewObject(const char* typeName, const char* fileName = "", const char* name = "", float x = 0.0f, float y = 0.0f, float z = 0.0f, bool modifyDoc = true); - void DeleteObject(CBaseObject* obj); - CBaseObject* CloneObject(CBaseObject* obj); - IObjectManager* GetObjectManager(); + void EnableAcceleratos(bool bEnable) override; + CGameEngine* GetGameEngine() override { return m_pGameEngine; }; + CDisplaySettings* GetDisplaySettings() override { return m_pDisplaySettings; }; + const SGizmoParameters& GetGlobalGizmoParameters() override; + CBaseObject* NewObject(const char* typeName, const char* fileName = "", const char* name = "", float x = 0.0f, float y = 0.0f, float z = 0.0f, bool modifyDoc = true) override; + void DeleteObject(CBaseObject* obj) override; + CBaseObject* CloneObject(CBaseObject* obj) override; + IObjectManager* GetObjectManager() override; // This will return a null pointer if CrySystem is not loaded before // Global Sandbox Settings are loaded from the registry before CrySystem // At that stage GetSettingsManager will return null and xml node in @@ -150,27 +150,27 @@ public: // After m_IEditor is created and CrySystem loaded, it is possible // to feed memory node with all necessary data needed for export // (gSettings.Load() and CXTPDockingPaneManager/CXTPDockingPaneLayout Sandbox layout management) - CSettingsManager* GetSettingsManager(); - CSelectionGroup* GetSelection(); - int ClearSelection(); - CBaseObject* GetSelectedObject(); - void SelectObject(CBaseObject* obj); - void LockSelection(bool bLock); - bool IsSelectionLocked(); + CSettingsManager* GetSettingsManager() override; + CSelectionGroup* GetSelection() override; + int ClearSelection() override; + CBaseObject* GetSelectedObject() override; + void SelectObject(CBaseObject* obj) override; + void LockSelection(bool bLock) override; + bool IsSelectionLocked() override; - IDataBaseManager* GetDBItemManager(EDataBaseItemType itemType); - CMusicManager* GetMusicManager() { return m_pMusicManager; }; + IDataBaseManager* GetDBItemManager(EDataBaseItemType itemType) override; + CMusicManager* GetMusicManager() override { return m_pMusicManager; }; IEditorFileMonitor* GetFileMonitor() override; void RegisterEventLoopHook(IEventLoopHook* pHook) override; void UnregisterEventLoopHook(IEventLoopHook* pHook) override; - IIconManager* GetIconManager(); - float GetTerrainElevation(float x, float y); - Editor::EditorQtApplication* GetEditorQtApplication() { return m_QtApplication; } + IIconManager* GetIconManager() override; + float GetTerrainElevation(float x, float y) override; + Editor::EditorQtApplication* GetEditorQtApplication() override { return m_QtApplication; } const QColor& GetColorByName(const QString& name) override; ////////////////////////////////////////////////////////////////////////// - IMovieSystem* GetMovieSystem() + IMovieSystem* GetMovieSystem() override { if (m_pSystem) { @@ -179,37 +179,37 @@ public: return nullptr; }; - CPluginManager* GetPluginManager() { return m_pPluginManager; } - CViewManager* GetViewManager(); - CViewport* GetActiveView(); - void SetActiveView(CViewport* viewport); + CPluginManager* GetPluginManager() override { return m_pPluginManager; } + CViewManager* GetViewManager() override; + CViewport* GetActiveView() override; + void SetActiveView(CViewport* viewport) override; - CLevelIndependentFileMan* GetLevelIndependentFileMan() { return m_pLevelIndependentFileMan; } + CLevelIndependentFileMan* GetLevelIndependentFileMan() override { return m_pLevelIndependentFileMan; } - void UpdateViews(int flags, const AABB* updateRegion); - void ResetViews(); - void ReloadTrackView(); - Vec3 GetMarkerPosition() { return m_marker; }; - void SetMarkerPosition(const Vec3& pos) { m_marker = pos; }; - void SetSelectedRegion(const AABB& box); - void GetSelectedRegion(AABB& box); + void UpdateViews(int flags, const AABB* updateRegion) override; + void ResetViews() override; + void ReloadTrackView() override; + Vec3 GetMarkerPosition() override { return m_marker; }; + void SetMarkerPosition(const Vec3& pos) override { m_marker = pos; }; + void SetSelectedRegion(const AABB& box) override; + void GetSelectedRegion(AABB& box) override; bool AddToolbarItem(uint8 iId, IUIEvent* pIHandler); - void SetDataModified(); - void SetOperationMode(EOperationMode mode); - EOperationMode GetOperationMode(); + void SetDataModified() override; + void SetOperationMode(EOperationMode mode) override; + EOperationMode GetOperationMode() override; - ITransformManipulator* ShowTransformManipulator(bool bShow); - ITransformManipulator* GetTransformManipulator(); - void SetAxisConstraints(AxisConstrains axis); - AxisConstrains GetAxisConstrains(); - void SetAxisVectorLock(bool bAxisVectorLock) { m_bAxisVectorLock = bAxisVectorLock; } - bool IsAxisVectorLocked() { return m_bAxisVectorLock; } - void SetTerrainAxisIgnoreObjects(bool bIgnore); - bool IsTerrainAxisIgnoreObjects(); - void SetReferenceCoordSys(RefCoordSys refCoords); - RefCoordSys GetReferenceCoordSys(); - XmlNodeRef FindTemplate(const QString& templateName); - void AddTemplate(const QString& templateName, XmlNodeRef& tmpl); + ITransformManipulator* ShowTransformManipulator(bool bShow) override; + ITransformManipulator* GetTransformManipulator() override; + void SetAxisConstraints(AxisConstrains axis) override; + AxisConstrains GetAxisConstrains() override; + void SetAxisVectorLock(bool bAxisVectorLock) override { m_bAxisVectorLock = bAxisVectorLock; } + bool IsAxisVectorLocked() override { return m_bAxisVectorLock; } + void SetTerrainAxisIgnoreObjects(bool bIgnore) override; + bool IsTerrainAxisIgnoreObjects() override; + void SetReferenceCoordSys(RefCoordSys refCoords) override; + RefCoordSys GetReferenceCoordSys() override; + XmlNodeRef FindTemplate(const QString& templateName) override; + void AddTemplate(const QString& templateName, XmlNodeRef& tmpl) override; const QtViewPane* OpenView(QString sViewClassName, bool reuseOpened = true) override; @@ -220,87 +220,87 @@ public: */ QWidget* FindView(QString viewClassName) override; - bool CloseView(const char* sViewClassName); - bool SetViewFocus(const char* sViewClassName); + bool CloseView(const char* sViewClassName) override; + bool SetViewFocus(const char* sViewClassName) override; - virtual QWidget* OpenWinWidget(WinWidgetId openId) override; - virtual WinWidget::WinWidgetManager* GetWinWidgetManager() const override; + QWidget* OpenWinWidget(WinWidgetId openId) override; + WinWidget::WinWidgetManager* GetWinWidgetManager() const override; // close ALL panels related to classId, used when unloading plugins. - void CloseView(const GUID& classId); + void CloseView(const GUID& classId) override; bool SelectColor(QColor &color, QWidget *parent = 0) override; void Update(); - SFileVersion GetFileVersion() { return m_fileVersion; }; - SFileVersion GetProductVersion() { return m_productVersion; }; + SFileVersion GetFileVersion() override { return m_fileVersion; }; + SFileVersion GetProductVersion() override { return m_productVersion; }; //! Get shader enumerator. - CUndoManager* GetUndoManager() { return m_pUndoManager; }; - void BeginUndo(); - void RestoreUndo(bool undo); - void AcceptUndo(const QString& name); - void CancelUndo(); - void SuperBeginUndo(); - void SuperAcceptUndo(const QString& name); - void SuperCancelUndo(); - void SuspendUndo(); - void ResumeUndo(); - void Undo(); - void Redo(); - bool IsUndoRecording(); - bool IsUndoSuspended(); - void RecordUndo(IUndoObject* obj); - bool FlushUndo(bool isShowMessage = false); - bool ClearLastUndoSteps(int steps); - bool ClearRedoStack(); + CUndoManager* GetUndoManager() override { return m_pUndoManager; }; + void BeginUndo() override; + void RestoreUndo(bool undo) override; + void AcceptUndo(const QString& name) override; + void CancelUndo() override; + void SuperBeginUndo() override; + void SuperAcceptUndo(const QString& name) override; + void SuperCancelUndo() override; + void SuspendUndo() override; + void ResumeUndo() override; + void Undo() override; + void Redo() override; + bool IsUndoRecording() override; + bool IsUndoSuspended() override; + void RecordUndo(IUndoObject* obj) override; + bool FlushUndo(bool isShowMessage = false) override; + bool ClearLastUndoSteps(int steps) override; + bool ClearRedoStack() override; //! Retrieve current animation context. - CAnimationContext* GetAnimation(); + CAnimationContext* GetAnimation() override; CTrackViewSequenceManager* GetSequenceManager() override; ITrackViewSequenceManager* GetSequenceManagerInterface() override; - CToolBoxManager* GetToolBoxManager() { return m_pToolBoxManager; }; - IErrorReport* GetErrorReport() { return m_pErrorReport; } - IErrorReport* GetLastLoadedLevelErrorReport() { return m_pLasLoadedLevelErrorReport; } + CToolBoxManager* GetToolBoxManager() override { return m_pToolBoxManager; }; + IErrorReport* GetErrorReport() override { return m_pErrorReport; } + IErrorReport* GetLastLoadedLevelErrorReport() override { return m_pLasLoadedLevelErrorReport; } void StartLevelErrorReportRecording() override; - void CommitLevelErrorReport() {SAFE_DELETE(m_pLasLoadedLevelErrorReport); m_pLasLoadedLevelErrorReport = new CErrorReport(*m_pErrorReport); } - virtual IFileUtil* GetFileUtil() override { return m_pFileUtil; } - void Notify(EEditorNotifyEvent event); - void NotifyExcept(EEditorNotifyEvent event, IEditorNotifyListener* listener); - void RegisterNotifyListener(IEditorNotifyListener* listener); - void UnregisterNotifyListener(IEditorNotifyListener* listener); + void CommitLevelErrorReport() override {SAFE_DELETE(m_pLasLoadedLevelErrorReport); m_pLasLoadedLevelErrorReport = new CErrorReport(*m_pErrorReport); } + IFileUtil* GetFileUtil() override { return m_pFileUtil; } + void Notify(EEditorNotifyEvent event) override; + void NotifyExcept(EEditorNotifyEvent event, IEditorNotifyListener* listener) override; + void RegisterNotifyListener(IEditorNotifyListener* listener) override; + void UnregisterNotifyListener(IEditorNotifyListener* listener) override; //! Register document notifications listener. - void RegisterDocListener(IDocListener* listener); + void RegisterDocListener(IDocListener* listener) override; //! Unregister document notifications listener. - void UnregisterDocListener(IDocListener* listener); + void UnregisterDocListener(IDocListener* listener) override; //! Retrieve interface to the source control. - ISourceControl* GetSourceControl(); + ISourceControl* GetSourceControl() override; //! Retrieve true if source control is provided and enabled in settings bool IsSourceControlAvailable() override; //! Only returns true if source control is both available AND currently connected and functioning bool IsSourceControlConnected() override; //! Setup Material Editor mode void SetMatEditMode(bool bIsMatEditMode); - CUIEnumsDatabase* GetUIEnumsDatabase() { return m_pUIEnumsDatabase; }; - void AddUIEnums(); - void ReduceMemory(); + CUIEnumsDatabase* GetUIEnumsDatabase() override { return m_pUIEnumsDatabase; }; + void AddUIEnums() override; + void ReduceMemory() override; // Get Export manager - IExportManager* GetExportManager(); + IExportManager* GetExportManager() override; // Set current configuration spec of the editor. - void SetEditorConfigSpec(ESystemConfigSpec spec, ESystemConfigPlatform platform); - ESystemConfigSpec GetEditorConfigSpec() const; - ESystemConfigPlatform GetEditorConfigPlatform() const; - void ReloadTemplates(); + void SetEditorConfigSpec(ESystemConfigSpec spec, ESystemConfigPlatform platform) override; + ESystemConfigSpec GetEditorConfigSpec() const override; + ESystemConfigPlatform GetEditorConfigPlatform() const override; + void ReloadTemplates() override; void AddErrorMessage(const QString& text, const QString& caption); - virtual void ShowStatusText(bool bEnable); + void ShowStatusText(bool bEnable) override; void OnObjectContextMenuOpened(QMenu* pMenu, const CBaseObject* pObject); - virtual void RegisterObjectContextMenuExtension(TContextMenuExtensionFunc func) override; + void RegisterObjectContextMenuExtension(TContextMenuExtensionFunc func) override; - virtual SSystemGlobalEnvironment* GetEnv() override; - virtual IBaseLibraryManager* GetMaterialManagerLibrary() override; // Vladimir@Conffx - virtual IEditorMaterialManager* GetIEditorMaterialManager() override; // Vladimir@Conffx - virtual IImageUtil* GetImageUtil() override; // Vladimir@conffx - virtual SEditorSettings* GetEditorSettings() override; - virtual IEditorPanelUtils* GetEditorPanelUtils() override; - virtual ILogFile* GetLogFile() override { return m_pLogFile; } + SSystemGlobalEnvironment* GetEnv() override; + IBaseLibraryManager* GetMaterialManagerLibrary() override; // Vladimir@Conffx + IEditorMaterialManager* GetIEditorMaterialManager() override; // Vladimir@Conffx + IImageUtil* GetImageUtil() override; // Vladimir@conffx + SEditorSettings* GetEditorSettings() override; + IEditorPanelUtils* GetEditorPanelUtils() override; + ILogFile* GetLogFile() override { return m_pLogFile; } void UnloadPlugins() override; void LoadPlugins() override; diff --git a/Code/Editor/LevelTreeModel.h b/Code/Editor/LevelTreeModel.h index 4f0e36a311..7cc5cf5496 100644 --- a/Code/Editor/LevelTreeModel.h +++ b/Code/Editor/LevelTreeModel.h @@ -23,7 +23,7 @@ class LevelTreeModelFilter Q_OBJECT public: explicit LevelTreeModelFilter(QObject* parent = nullptr); - bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const; + bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override; void setFilterText(const QString&); QVariant data(const QModelIndex& index, int role) const override; private: diff --git a/Code/Editor/Objects/AxisGizmo.h b/Code/Editor/Objects/AxisGizmo.h index dfd35388b6..bab667a629 100644 --- a/Code/Editor/Objects/AxisGizmo.h +++ b/Code/Editor/Objects/AxisGizmo.h @@ -35,21 +35,21 @@ public: ////////////////////////////////////////////////////////////////////////// // Ovverides from CGizmo ////////////////////////////////////////////////////////////////////////// - virtual void GetWorldBounds(AABB& bbox); - virtual void Display(DisplayContext& dc); - virtual bool HitTest(HitContext& hc); - virtual const Matrix34& GetMatrix() const; + void GetWorldBounds(AABB& bbox) override; + void Display(DisplayContext& dc) override; + bool HitTest(HitContext& hc) override; + const Matrix34& GetMatrix() const override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // ITransformManipulator implementation. ////////////////////////////////////////////////////////////////////////// - virtual Matrix34 GetTransformation(RefCoordSys coordSys, IDisplayViewport* view = nullptr) const; - virtual void SetTransformation(RefCoordSys coordSys, const Matrix34& tm); - virtual bool HitTestManipulator(HitContext& hc); - virtual bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int nFlags); - virtual void SetAlwaysUseLocal(bool on) + Matrix34 GetTransformation(RefCoordSys coordSys, IDisplayViewport* view = nullptr) const override; + void SetTransformation(RefCoordSys coordSys, const Matrix34& tm) override; + bool HitTestManipulator(HitContext& hc) override; + bool MouseCallback(CViewport* view, EMouseEvent event, QPoint& point, int nFlags) override; + void SetAlwaysUseLocal(bool on) override { m_bAlwaysUseLocal = on; } ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Editor/Objects/BaseObject.h b/Code/Editor/Objects/BaseObject.h index 0b37a3b852..3865696ecb 100644 --- a/Code/Editor/Objects/BaseObject.h +++ b/Code/Editor/Objects/BaseObject.h @@ -712,7 +712,7 @@ protected: // May be overridden in derived classes to handle helpers scaling. ////////////////////////////////////////////////////////////////////////// virtual void SetHelperScale([[maybe_unused]] float scale) {}; - virtual float GetHelperScale() { return 1; }; + virtual float GetHelperScale() { return 1.0f; }; void SetNameInternal(const QString& name) { m_name = name; } diff --git a/Code/Editor/Objects/EntityObject.h b/Code/Editor/Objects/EntityObject.h index 6150685c45..dcc6ff7b22 100644 --- a/Code/Editor/Objects/EntityObject.h +++ b/Code/Editor/Objects/EntityObject.h @@ -82,14 +82,14 @@ public: // Overrides from CBaseObject. ////////////////////////////////////////////////////////////////////////// //! Return type name of Entity. - QString GetTypeDescription() const { return GetEntityClass(); }; + QString GetTypeDescription() const override { return GetEntityClass(); }; ////////////////////////////////////////////////////////////////////////// - bool IsSameClass(CBaseObject* obj); + bool IsSameClass(CBaseObject* obj) override; - virtual bool Init(IEditor* ie, CBaseObject* prev, const QString& file); - virtual void InitVariables(); - virtual void Done(); + bool Init(IEditor* ie, CBaseObject* prev, const QString& file) override; + void InitVariables() override; + void Done() override; void DrawExtraLightInfo (DisplayContext& disp); @@ -102,30 +102,30 @@ public: void SetEntityPropertyFloat(const char* name, float value); void SetEntityPropertyString(const char* name, const QString& value); - virtual int MouseCreateCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags); - virtual void OnContextMenu(QMenu* menu); + int MouseCreateCallback(CViewport* view, EMouseEvent event, QPoint& point, int flags) override; + void OnContextMenu(QMenu* menu) override; - void SetName(const QString& name); - void SetSelected(bool bSelect); + void SetName(const QString& name) override; + void SetSelected(bool bSelect) override; - virtual void GetLocalBounds(AABB& box); + void GetLocalBounds(AABB& box) override; - virtual bool HitTest(HitContext& hc); - virtual bool HitHelperTest(HitContext& hc); - virtual bool HitTestRect(HitContext& hc); - void UpdateVisibility(bool bVisible); - bool ConvertFromObject(CBaseObject* object); + bool HitTest(HitContext& hc) override; + bool HitHelperTest(HitContext& hc) override; + bool HitTestRect(HitContext& hc) override; + void UpdateVisibility(bool bVisible) override; + bool ConvertFromObject(CBaseObject* object) override; using CBaseObject::Serialize; void Serialize(CObjectArchive& ar) override; - virtual void PostLoad(CObjectArchive& ar); + void PostLoad(CObjectArchive& ar) override; - XmlNodeRef Export(const QString& levelPath, XmlNodeRef& xmlNode); + XmlNodeRef Export(const QString& levelPath, XmlNodeRef& xmlNode) override; ////////////////////////////////////////////////////////////////////////// - void OnEvent(ObjectEvent event); + void OnEvent(ObjectEvent event) override; - virtual void SetTransformDelegate(ITransformDelegate* pTransformDelegate) override; + void SetTransformDelegate(ITransformDelegate* pTransformDelegate) override; // Set attach flags and target enum EAttachmentType @@ -140,15 +140,15 @@ public: EAttachmentType GetAttachType() const { return m_attachmentType; } QString GetAttachTarget() const { return m_attachmentTarget; } - virtual void SetHelperScale(float scale); - virtual float GetHelperScale(); + void SetHelperScale(float scale) override; + float GetHelperScale() override; - virtual void GatherUsedResources(CUsedResources& resources); - virtual bool IsSimilarObject(CBaseObject* pObject); + void GatherUsedResources(CUsedResources& resources) override; + bool IsSimilarObject(CBaseObject* pObject) override; - virtual bool HasMeasurementAxis() const { return false; } + bool HasMeasurementAxis() const override { return false; } - virtual bool IsIsolated() const { return false; } + bool IsIsolated() const override { return false; } ////////////////////////////////////////////////////////////////////////// // END CBaseObject @@ -233,7 +233,7 @@ protected: ////////////////////////////////////////////////////////////////////////// //! Must be called after cloning the object on clone of object. //! This will make sure object references are cloned correctly. - virtual void PostClone(CBaseObject* pFromObject, CObjectCloneContext& ctx); + void PostClone(CBaseObject* pFromObject, CObjectCloneContext& ctx) override; //! Draw default object items. void DrawProjectorPyramid(DisplayContext& dc, float dist); @@ -265,7 +265,7 @@ public: } protected: - void DeleteThis() { delete this; }; + void DeleteThis() override { delete this; }; ////////////////////////////////////////////////////////////////////////// // Radius callbacks. diff --git a/Code/Editor/Objects/GizmoManager.h b/Code/Editor/Objects/GizmoManager.h index c3a71ad81b..efc3e99205 100644 --- a/Code/Editor/Objects/GizmoManager.h +++ b/Code/Editor/Objects/GizmoManager.h @@ -23,14 +23,14 @@ class CGizmoManager : public IGizmoManager { public: - void AddGizmo(CGizmo* gizmo); - void RemoveGizmo(CGizmo* gizmo); + void AddGizmo(CGizmo* gizmo) override; + void RemoveGizmo(CGizmo* gizmo) override; int GetGizmoCount() const override; CGizmo* GetGizmoByIndex(int nIndex) const override; - void Display(DisplayContext& dc); - bool HitTest(HitContext& hc); + void Display(DisplayContext& dc) override; + bool HitTest(HitContext& hc) override; void DeleteAllTransformManipulators(); diff --git a/Code/Editor/Objects/LineGizmo.h b/Code/Editor/Objects/LineGizmo.h index af3b38b199..e50f044f3c 100644 --- a/Code/Editor/Objects/LineGizmo.h +++ b/Code/Editor/Objects/LineGizmo.h @@ -30,10 +30,10 @@ public: ////////////////////////////////////////////////////////////////////////// // Ovverides from CGizmo ////////////////////////////////////////////////////////////////////////// - virtual void SetName(const char* sName); - virtual void GetWorldBounds(AABB& bbox); - virtual void Display(DisplayContext& dc); - virtual bool HitTest(HitContext& hc); + void SetName(const char* sName) override; + void GetWorldBounds(AABB& bbox) override; + void Display(DisplayContext& dc) override; + bool HitTest(HitContext& hc) override; ////////////////////////////////////////////////////////////////////////// void SetObjects(CBaseObject* pObject1, CBaseObject* pObject2, const QString& boneName = ""); diff --git a/Code/Editor/Objects/ObjectManager.h b/Code/Editor/Objects/ObjectManager.h index de0a4ce849..4ffa5e9a07 100644 --- a/Code/Editor/Objects/ObjectManager.h +++ b/Code/Editor/Objects/ObjectManager.h @@ -103,142 +103,142 @@ public: void RegisterObjectClasses(); - CBaseObject* NewObject(CObjectClassDesc* cls, CBaseObject* prev = 0, const QString& file = "", const char* newObjectName = nullptr); - CBaseObject* NewObject(const QString& typeName, CBaseObject* prev = 0, const QString& file = "", const char* newEntityName = nullptr); + CBaseObject* NewObject(CObjectClassDesc* cls, CBaseObject* prev = 0, const QString& file = "", const char* newObjectName = nullptr) override; + CBaseObject* NewObject(const QString& typeName, CBaseObject* prev = 0, const QString& file = "", const char* newEntityName = nullptr) override; - void DeleteObject(CBaseObject* obj); - void DeleteSelection(CSelectionGroup* pSelection); - void DeleteAllObjects(); - CBaseObject* CloneObject(CBaseObject* obj); + void DeleteObject(CBaseObject* obj) override; + void DeleteSelection(CSelectionGroup* pSelection) override; + void DeleteAllObjects() override; + CBaseObject* CloneObject(CBaseObject* obj) override; - void BeginEditParams(CBaseObject* obj, int flags); - void EndEditParams(int flags = 0); + void BeginEditParams(CBaseObject* obj, int flags) override; + void EndEditParams(int flags = 0) override; // Hides all transform manipulators. void HideTransformManipulators(); //! Get number of objects manager by ObjectManager (not contain sub objects of groups). - int GetObjectCount() const; + int GetObjectCount() const override; //! Get array of objects, managed by manager (not contain sub objects of groups). //! @param layer if 0 get objects for all layers, or layer to get objects from. - void GetObjects(CBaseObjectsArray& objects) const; + void GetObjects(CBaseObjectsArray& objects) const override; //! Get array of objects that pass the filter. //! @param filter The filter functor, return true if you want to get the certain obj, return false if want to skip it. - void GetObjects(CBaseObjectsArray& objects, BaseObjectFilterFunctor const& filter) const; + void GetObjects(CBaseObjectsArray& objects, BaseObjectFilterFunctor const& filter) const override; //! Update objects. void Update(); //! Display objects on display context. - void Display(DisplayContext& dc); + void Display(DisplayContext& dc) override; //! Called when selecting without selection helpers - this is needed since //! the visible object cache is normally not updated when not displaying helpers. - void ForceUpdateVisibleObjectCache(DisplayContext& dc); + void ForceUpdateVisibleObjectCache(DisplayContext& dc) override; //! Check intersection with objects. //! Find intersection with nearest to ray origin object hit by ray. //! If distance tollerance is specified certain relaxation applied on collision test. //! @return true if hit any object, and fills hitInfo structure. - bool HitTest(HitContext& hitInfo); + bool HitTest(HitContext& hitInfo) override; //! Check intersection with an object. //! @return true if hit, and fills hitInfo structure. - bool HitTestObject(CBaseObject* obj, HitContext& hc); + bool HitTestObject(CBaseObject* obj, HitContext& hc) override; //! Send event to all objects. //! Will cause OnEvent handler to be called on all objects. - void SendEvent(ObjectEvent event); + void SendEvent(ObjectEvent event) override; //! Send event to all objects within given bounding box. //! Will cause OnEvent handler to be called on objects within bounding box. - void SendEvent(ObjectEvent event, const AABB& bounds); + void SendEvent(ObjectEvent event, const AABB& bounds) override; ////////////////////////////////////////////////////////////////////////// //! Find object by ID. - CBaseObject* FindObject(REFGUID guid) const; + CBaseObject* FindObject(REFGUID guid) const override; ////////////////////////////////////////////////////////////////////////// //! Find object by name. - CBaseObject* FindObject(const QString& sName) const; + CBaseObject* FindObject(const QString& sName) const override; ////////////////////////////////////////////////////////////////////////// //! Find objects of given type. void FindObjectsOfType(const QMetaObject* pClass, std::vector& result) override; void FindObjectsOfType(ObjectType type, std::vector& result) override; ////////////////////////////////////////////////////////////////////////// //! Find objects which intersect with a given AABB. - virtual void FindObjectsInAABB(const AABB& aabb, std::vector& result) const; + void FindObjectsInAABB(const AABB& aabb, std::vector& result) const override; ////////////////////////////////////////////////////////////////////////// // Operations on objects. ////////////////////////////////////////////////////////////////////////// //! Makes object visible or invisible. - void HideObject(CBaseObject* obj, bool hide); + void HideObject(CBaseObject* obj, bool hide) override; //! Shows the last hidden object based on hidden ID - void ShowLastHiddenObject(); + void ShowLastHiddenObject() override; //! Freeze object, making it unselectable. - void FreezeObject(CBaseObject* obj, bool freeze); + void FreezeObject(CBaseObject* obj, bool freeze) override; //! Unhide all hidden objects. - void UnhideAll(); + void UnhideAll() override; //! Unfreeze all frozen objects. - void UnfreezeAll(); + void UnfreezeAll() override; ////////////////////////////////////////////////////////////////////////// // Object Selection. ////////////////////////////////////////////////////////////////////////// - bool SelectObject(CBaseObject* obj, bool bUseMask = true); - void UnselectObject(CBaseObject* obj); + bool SelectObject(CBaseObject* obj, bool bUseMask = true) override; + void UnselectObject(CBaseObject* obj) override; //! Select objects within specified distance from given position. //! Return number of selected objects. - int SelectObjects(const AABB& box, bool bUnselect = false); + int SelectObjects(const AABB& box, bool bUnselect = false) override; - virtual void SelectEntities(std::set& s); + void SelectEntities(std::set& s) override; - int MoveObjects(const AABB& box, const Vec3& offset, ImageRotationDegrees rotation, bool bIsCopy = false); + int MoveObjects(const AABB& box, const Vec3& offset, ImageRotationDegrees rotation, bool bIsCopy = false) override; //! Selects/Unselects all objects within 2d rectangle in given viewport. - void SelectObjectsInRect(CViewport* view, const QRect& rect, bool bSelect); - void FindObjectsInRect(CViewport* view, const QRect& rect, std::vector& guids); + void SelectObjectsInRect(CViewport* view, const QRect& rect, bool bSelect) override; + void FindObjectsInRect(CViewport* view, const QRect& rect, std::vector& guids) override; //! Clear default selection set. //! @Return number of objects removed from selection. - int ClearSelection(); + int ClearSelection() override; //! Deselect all current selected objects and selects object that were unselected. //! @Return number of selected objects. - int InvertSelection(); + int InvertSelection() override; //! Get current selection. - CSelectionGroup* GetSelection() const { return m_currSelection; }; + CSelectionGroup* GetSelection() const override { return m_currSelection; }; //! Get named selection. - CSelectionGroup* GetSelection(const QString& name) const; + CSelectionGroup* GetSelection(const QString& name) const override; // Get selection group names - void GetNameSelectionStrings(QStringList& names); + void GetNameSelectionStrings(QStringList& names) override; //! Change name of current selection group. //! And store it in list. - void NameSelection(const QString& name); + void NameSelection(const QString& name) override; //! Set one of name selections as current selection. - void SetSelection(const QString& name); - void RemoveSelection(const QString& name); + void SetSelection(const QString& name) override; + void RemoveSelection(const QString& name) override; bool IsObjectDeletionAllowed(CBaseObject* pObject); //! Delete all objects in selection group. - void DeleteSelection(); + void DeleteSelection() override; - uint32 ForceID() const{return m_ForceID; } - void ForceID(uint32 FID){m_ForceID = FID; } + uint32 ForceID() const override{return m_ForceID; } + void ForceID(uint32 FID) override{m_ForceID = FID; } //! Generates uniq name base on type name of object. - QString GenerateUniqueObjectName(const QString& typeName); + QString GenerateUniqueObjectName(const QString& typeName) override; //! Register object name in object manager, needed for generating uniq names. - void RegisterObjectName(const QString& name); + void RegisterObjectName(const QString& name) override; //! Decrease name number and remove if it was last in object manager, needed for generating uniq names. void UpdateRegisterObjectName(const QString& name); //! Enable/Disable generating of unique object names (Enabled by default). //! Return previous value. - bool EnableUniqObjectNames(bool bEnable); + bool EnableUniqObjectNames(bool bEnable) override; //! Register XML template of runtime class. void RegisterClassTemplate(const XmlNodeRef& templ); @@ -249,25 +249,25 @@ public: void RegisterCVars(); //! Find object class by name. - CObjectClassDesc* FindClass(const QString& className); - void GetClassCategories(QStringList& categories); + CObjectClassDesc* FindClass(const QString& className) override; + void GetClassCategories(QStringList& categories) override; void GetClassCategoryToolClassNamePairs(std::vector< std::pair >& categoryToolClassNamePairs) override; - void GetClassTypes(const QString& category, QStringList& types); + void GetClassTypes(const QString& category, QStringList& types) override; //! Export objects to xml. //! When onlyShared is true ony objects with shared flags exported, overwise only not shared object exported. - void Export(const QString& levelPath, XmlNodeRef& rootNode, bool onlyShared); - void ExportEntities(XmlNodeRef& rootNode); + void Export(const QString& levelPath, XmlNodeRef& rootNode, bool onlyShared) override; + void ExportEntities(XmlNodeRef& rootNode) override; //! Serialize Objects in manager to specified XML Node. //! @param flags Can be one of SerializeFlags. - void Serialize(XmlNodeRef& rootNode, bool bLoading, int flags = SERIALIZE_ALL); + void Serialize(XmlNodeRef& rootNode, bool bLoading, int flags = SERIALIZE_ALL) override; - void SerializeNameSelection(XmlNodeRef& rootNode, bool bLoading); + void SerializeNameSelection(XmlNodeRef& rootNode, bool bLoading) override; //! Load objects from object archive. //! @param bSelect if set newly loaded object will be selected. - void LoadObjects(CObjectArchive& ar, bool bSelect); + void LoadObjects(CObjectArchive& ar, bool bSelect) override; //! Delete from Object manager all objects without SHARED flag. void DeleteNotSharedObjects(); @@ -276,57 +276,57 @@ public: bool AddObject(CBaseObject* obj); void RemoveObject(CBaseObject* obj); - void ChangeObjectId(REFGUID oldId, REFGUID newId); - bool IsDuplicateObjectName(const QString& newName) const + void ChangeObjectId(REFGUID oldId, REFGUID newId) override; + bool IsDuplicateObjectName(const QString& newName) const override { return FindObject(newName) ? true : false; } - void ShowDuplicationMsgWarning(CBaseObject* obj, const QString& newName, bool bShowMsgBox) const; - void ChangeObjectName(CBaseObject* obj, const QString& newName); + void ShowDuplicationMsgWarning(CBaseObject* obj, const QString& newName, bool bShowMsgBox) const override; + void ChangeObjectName(CBaseObject* obj, const QString& newName) override; //! Convert object of one type to object of another type. //! Original object is deleted. - bool ConvertToType(CBaseObject* pObject, const QString& typeName); + bool ConvertToType(CBaseObject* pObject, const QString& typeName) override; //! Set new selection callback. //! @return previous selection callback. - IObjectSelectCallback* SetSelectCallback(IObjectSelectCallback* callback); + IObjectSelectCallback* SetSelectCallback(IObjectSelectCallback* callback) override; // Enables/Disables creating of game objects. - void SetCreateGameObject(bool enable) { m_createGameObjects = enable; }; + void SetCreateGameObject(bool enable) override { m_createGameObjects = enable; }; //! Return true if objects loaded from xml should immidiatly create game objects associated with them. - bool IsCreateGameObjects() const { return m_createGameObjects; }; + bool IsCreateGameObjects() const override { return m_createGameObjects; }; ////////////////////////////////////////////////////////////////////////// //! Get access to gizmo manager. - IGizmoManager* GetGizmoManager(); + IGizmoManager* GetGizmoManager() override; ////////////////////////////////////////////////////////////////////////// //! Invalidate visibily settings of objects. - void InvalidateVisibleList(); + void InvalidateVisibleList() override; ////////////////////////////////////////////////////////////////////////// // ObjectManager notification Callbacks. ////////////////////////////////////////////////////////////////////////// - void AddObjectEventListener(EventListener* listener); - void RemoveObjectEventListener(EventListener* listener); + void AddObjectEventListener(EventListener* listener) override; + void RemoveObjectEventListener(EventListener* listener) override; ////////////////////////////////////////////////////////////////////////// // Used to indicate starting and ending of objects loading. ////////////////////////////////////////////////////////////////////////// - void StartObjectsLoading(int numObjects); - void EndObjectsLoading(); + void StartObjectsLoading(int numObjects) override; + void EndObjectsLoading() override; ////////////////////////////////////////////////////////////////////////// // Gathers all resources used by all objects. - void GatherUsedResources(CUsedResources& resources); + void GatherUsedResources(CUsedResources& resources) override; - virtual bool IsLightClass(CBaseObject* pObject); + bool IsLightClass(CBaseObject* pObject) override; - virtual void FindAndRenameProperty2(const char* property2Name, const QString& oldValue, const QString& newValue); - virtual void FindAndRenameProperty2If(const char* property2Name, const QString& oldValue, const QString& newValue, const char* otherProperty2Name, const QString& otherValue); + virtual void FindAndRenameProperty2(const char* property2Name, const QString& oldValue, const QString& newValue) override; + virtual void FindAndRenameProperty2If(const char* property2Name, const QString& oldValue, const QString& newValue, const char* otherProperty2Name, const QString& otherValue) override; - bool IsReloading() const { return m_bInReloading; } + bool IsReloading() const override { return m_bInReloading; } void SetSkipUpdate(bool bSkipUpdate) override { m_bSkipObjectUpdate = bSkipUpdate; } void SetExportingLevel(bool bExporting) override { m_bLevelExporting = bExporting; } @@ -341,7 +341,7 @@ private: @param objectNode Xml node to serialize object info from. @param pUndoObject Pointer to deleted object for undo. */ - CBaseObject* NewObject(CObjectArchive& archive, CBaseObject* pUndoObject, bool bMakeNewId); + CBaseObject* NewObject(CObjectArchive& archive, CBaseObject* pUndoObject, bool bMakeNewId) override; //! Update visibility of all objects. void UpdateVisibilityList(); diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h b/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h index 23151eb05c..bb19f4d77e 100644 --- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h +++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/Objects/ComponentEntityObject.h @@ -86,7 +86,7 @@ public: // Always returns false as Component entity highlighting (accenting) is taken care of elsewhere bool IsHighlighted() { return false; } // Component entity highlighting (accenting) is taken care of elsewhere - void DrawHighlight(DisplayContext& /*dc*/) {}; + void DrawHighlight(DisplayContext& /*dc*/) override {}; // Don't auto-clone children. Cloning happens in groups with reference fixups, // and individually selected objercts should be cloned as individuals. @@ -164,7 +164,7 @@ protected: float GetRadius(); - void DeleteThis() { delete this; }; + void DeleteThis() override { delete this; }; bool IsNonLayerAncestorSelected() const; bool IsLayer() const; diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h b/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h index f2764681b2..617c5cb2c8 100644 --- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h +++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/SandboxIntegration.h @@ -182,7 +182,7 @@ private: ////////////////////////////////////////////////////////////////////////// // AzToolsFramework::EditorContextMenu::Bus::Handler overrides void PopulateEditorGlobalContextMenu(QMenu* menu, const AZ::Vector2& point, int flags) override; - int GetMenuPosition() const; + int GetMenuPosition() const override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FavoriteComponentList.h b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FavoriteComponentList.h index 5f704237ab..2bd2d83e04 100644 --- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FavoriteComponentList.h +++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/ComponentPalette/FavoriteComponentList.h @@ -102,7 +102,7 @@ protected: void AddFavorites(const AZStd::vector& classDataContainer) override; ////////////////////////////////////////////////////////////////////////// - void rowsInserted(const QModelIndex& parent, int start, int end); + void rowsInserted(const QModelIndex& parent, int start, int end) override; // Context menu handlers void ShowContextMenu(const QPoint&); diff --git a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.hxx b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.hxx index 346a5e938a..8acb2f1a72 100644 --- a/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.hxx +++ b/Code/Editor/Plugins/ComponentEntityEditorPlugin/UI/Outliner/OutlinerListModel.hxx @@ -255,7 +255,7 @@ protected: bool DropMimeDataAssets(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); bool CanDropMimeDataAssets(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) const; - QMap itemData(const QModelIndex &index) const; + QMap itemData(const QModelIndex &index) const override; QVariant dataForAll(const QModelIndex& index, int role) const; QVariant dataForName(const QModelIndex& index, int role) const; QVariant dataForVisibility(const QModelIndex& index, int role) const; diff --git a/Code/Editor/PreferencesStdPages.h b/Code/Editor/PreferencesStdPages.h index f4a6e0b783..8a182bde55 100644 --- a/Code/Editor/PreferencesStdPages.h +++ b/Code/Editor/PreferencesStdPages.h @@ -28,16 +28,16 @@ public: ////////////////////////////////////////////////////////////////////////// // IUnkown implementation. - virtual HRESULT STDMETHODCALLTYPE QueryInterface(const IID& riid, void** ppvObj); - virtual ULONG STDMETHODCALLTYPE AddRef(); - virtual ULONG STDMETHODCALLTYPE Release(); + HRESULT STDMETHODCALLTYPE QueryInterface(const IID& riid, void** ppvObj) override; + ULONG STDMETHODCALLTYPE AddRef() override; + ULONG STDMETHODCALLTYPE Release() override; ////////////////////////////////////////////////////////////////////////// - virtual REFGUID ClassID(); + REFGUID ClassID() override; ////////////////////////////////////////////////////////////////////////// - virtual int GetPagesCount(); - virtual IPreferencesPage* CreateEditorPreferencesPage(int index) override; + int GetPagesCount() override; + IPreferencesPage* CreateEditorPreferencesPage(int index) override; }; #endif // CRYINCLUDE_EDITOR_PREFERENCESSTDPAGES_H diff --git a/Code/Editor/QtViewPane.h b/Code/Editor/QtViewPane.h index 09fc215833..194dd8919a 100644 --- a/Code/Editor/QtViewPane.h +++ b/Code/Editor/QtViewPane.h @@ -123,18 +123,18 @@ public: { } - virtual ESystemClassID SystemClassID() { return m_classId; }; + ESystemClassID SystemClassID() override { return m_classId; }; static const GUID& GetClassID() { return TWidget::GetClassID(); } - virtual const GUID& ClassID() + const GUID& ClassID() override { return GetClassID(); } - virtual QString ClassName() { return m_name; }; - virtual QString Category() { return m_category; }; + QString ClassName() override { return m_name; }; + QString Category() override { return m_category; }; QObject* CreateQObject() const override { return new TWidget(); }; QString GetPaneTitle() override { return m_name; }; diff --git a/Code/Editor/SelectSequenceDialog.h b/Code/Editor/SelectSequenceDialog.h index 5531949c1a..960da7ebe3 100644 --- a/Code/Editor/SelectSequenceDialog.h +++ b/Code/Editor/SelectSequenceDialog.h @@ -30,7 +30,7 @@ protected: void OnInitDialog() override; // Derived Dialogs should override this - virtual void GetItems(std::vector& outItems); + void GetItems(std::vector& outItems) override; }; #endif // CRYINCLUDE_EDITOR_SELECTSEQUENCEDIALOG_H diff --git a/Code/Editor/ToolbarCustomizationDialog.h b/Code/Editor/ToolbarCustomizationDialog.h index 7063c2b792..0e64bfbb5b 100644 --- a/Code/Editor/ToolbarCustomizationDialog.h +++ b/Code/Editor/ToolbarCustomizationDialog.h @@ -39,7 +39,7 @@ public: protected: void dragMoveEvent(QDragMoveEvent* ev) override; void dragEnterEvent(QDragEnterEvent* ev) override; - void dropEvent(QDropEvent* ev); + void dropEvent(QDropEvent* ev) override; private: void OnTabChanged(int index); diff --git a/Code/Editor/TopRendererWnd.h b/Code/Editor/TopRendererWnd.h index 3a5c1026bc..c5bc7a31f2 100644 --- a/Code/Editor/TopRendererWnd.h +++ b/Code/Editor/TopRendererWnd.h @@ -35,11 +35,11 @@ public: /** Get type of this viewport. */ - virtual EViewportType GetType() const { return ET_ViewportMap; } - virtual void SetType(EViewportType type); + EViewportType GetType() const override { return ET_ViewportMap; } + void SetType(EViewportType type) override; - virtual void ResetContent(); - virtual void UpdateContent(int flags); + void ResetContent() override; + void UpdateContent(int flags) override; //! Map viewport position to world space position. virtual Vec3 ViewToWorld(const QPoint& vp, bool* collideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override; @@ -52,7 +52,7 @@ public: protected: // Draw everything. - virtual void Draw(DisplayContext& dc); + void Draw(DisplayContext& dc) override; private: bool m_bContentsUpdated; diff --git a/Code/Editor/TrackView/SequenceBatchRenderDialog.h b/Code/Editor/TrackView/SequenceBatchRenderDialog.h index 5d8934f783..9be10c22af 100644 --- a/Code/Editor/TrackView/SequenceBatchRenderDialog.h +++ b/Code/Editor/TrackView/SequenceBatchRenderDialog.h @@ -187,7 +187,7 @@ protected: int m_customFPS; void InitializeContext(); - virtual void OnMovieEvent(IMovieListener::EMovieEvent event, IAnimSequence* pSequence); + void OnMovieEvent(IMovieListener::EMovieEvent event, IAnimSequence* pSequence) override; void CaptureItemStart(); diff --git a/Code/Editor/TrackView/TrackViewCurveEditor.h b/Code/Editor/TrackView/TrackViewCurveEditor.h index b2e019899b..1af55a9e0c 100644 --- a/Code/Editor/TrackView/TrackViewCurveEditor.h +++ b/Code/Editor/TrackView/TrackViewCurveEditor.h @@ -50,8 +50,8 @@ public: void SetPlayCallback(const std::function& callback); // IAnimationContextListener - virtual void OnSequenceChanged(CTrackViewSequence* pNewSequence); - virtual void OnTimeChanged(float newTime); + void OnSequenceChanged(CTrackViewSequence* pNewSequence) override; + void OnTimeChanged(float newTime) override; protected: void showEvent(QShowEvent* event) override; @@ -65,7 +65,7 @@ private: void OnSplineTimeMarkerChange(); // IEditorNotifyListener - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event) override; + void OnEditorNotifyEvent(EEditorNotifyEvent event) override; //ITrackViewSequenceListener void OnKeysChanged(CTrackViewSequence* pSequence) override; @@ -109,8 +109,8 @@ public: float GetFPS() const { return m_widget->GetFPS(); } void SetTickDisplayMode(ETVTickMode mode) { m_widget->SetTickDisplayMode(mode); } - virtual void OnSequenceChanged(CTrackViewSequence* pNewSequence) { m_widget->OnSequenceChanged(pNewSequence); } - virtual void OnTimeChanged(float newTime) { m_widget->OnTimeChanged(newTime); } + void OnSequenceChanged(CTrackViewSequence* pNewSequence) override { m_widget->OnSequenceChanged(pNewSequence); } + void OnTimeChanged(float newTime) override { m_widget->OnTimeChanged(newTime); } // ITrackViewSequenceListener delegation to m_widget void OnKeysChanged(CTrackViewSequence* pSequence) override { m_widget->OnKeysChanged(pSequence); } diff --git a/Code/Editor/TrackView/TrackViewDialog.h b/Code/Editor/TrackView/TrackViewDialog.h index f6c1126713..c66f31e1f7 100644 --- a/Code/Editor/TrackView/TrackViewDialog.h +++ b/Code/Editor/TrackView/TrackViewDialog.h @@ -69,10 +69,10 @@ public: void UpdateSequenceLockStatus(); // IAnimationContextListener - virtual void OnSequenceChanged(CTrackViewSequence* pNewSequence) override; + void OnSequenceChanged(CTrackViewSequence* pNewSequence) override; // ITrackViewSequenceListener - virtual void OnSequenceSettingsChanged(CTrackViewSequence* pSequence) override; + void OnSequenceSettingsChanged(CTrackViewSequence* pSequence) override; void UpdateDopeSheetTime(CTrackViewSequence* pSequence); @@ -197,8 +197,8 @@ private: bool processRawInput(MSG* pMsg); #endif - virtual void OnNodeSelectionChanged(CTrackViewSequence* pSequence) override; - virtual void OnNodeRenamed(CTrackViewNode* pNode, const char* pOldName) override; + void OnNodeSelectionChanged(CTrackViewSequence* pSequence) override; + void OnNodeRenamed(CTrackViewNode* pNode, const char* pOldName) override; void OnSequenceAdded(CTrackViewSequence* pSequence) override; void OnSequenceRemoved(CTrackViewSequence* pSequence) override; @@ -209,8 +209,8 @@ private: void AddDialogListeners(); void RemoveDialogListeners(); - virtual void BeginUndoTransaction(); - virtual void EndUndoTransaction(); + void BeginUndoTransaction() override; + void EndUndoTransaction() override; void SaveCurrentSequenceToFBX(); void SaveSequenceTimingToXML(); diff --git a/Code/Editor/TrackView/TrackViewSequence.h b/Code/Editor/TrackView/TrackViewSequence.h index 69858adf8f..a392ad00f9 100644 --- a/Code/Editor/TrackView/TrackViewSequence.h +++ b/Code/Editor/TrackView/TrackViewSequence.h @@ -100,16 +100,16 @@ public: void Load() override; // ITrackViewNode - virtual ETrackViewNodeType GetNodeType() const override { return eTVNT_Sequence; } + ETrackViewNodeType GetNodeType() const override { return eTVNT_Sequence; } - virtual AZStd::string GetName() const override { return m_pAnimSequence->GetName(); } - virtual bool SetName(const char* pName) override; - virtual bool CanBeRenamed() const override { return true; } + AZStd::string GetName() const override { return m_pAnimSequence->GetName(); } + bool SetName(const char* pName) override; + bool CanBeRenamed() const override { return true; } // Binding/Unbinding - virtual void BindToEditorObjects() override; - virtual void UnBindFromEditorObjects() override; - virtual bool IsBoundToEditorObjects() const override; + void BindToEditorObjects() override; + void UnBindFromEditorObjects() override; + bool IsBoundToEditorObjects() const override; // Time range void SetTimeRange(Range timeRange); @@ -136,10 +136,10 @@ public: uint32 GetCryMovieId() const { return m_pAnimSequence->GetId(); } // Rendering - virtual void Render(const SAnimContext& animContext) override; + void Render(const SAnimContext& animContext) override; // Playback control - virtual void Animate(const SAnimContext& animContext) override; + void Animate(const SAnimContext& animContext) override; void Resume() { m_pAnimSequence->Resume(); } void Pause() { m_pAnimSequence->Pause(); } void StillUpdate() { m_pAnimSequence->StillUpdate(); } @@ -162,7 +162,7 @@ public: void TimeChanged(float newTime) { m_pAnimSequence->TimeChanged(newTime); } // Check if it's a group node - virtual bool IsGroupNode() const override { return true; } + bool IsGroupNode() const override { return true; } // Track Events (TODO: Undo?) int GetTrackEventsCount() const { return m_pAnimSequence->GetTrackEventsCount(); } @@ -195,7 +195,7 @@ public: bool IsActiveSequence() const; // The root sequence node is always an active director - virtual bool IsActiveDirector() const override { return true; } + bool IsActiveDirector() const override { return true; } // Copy keys to clipboard (in XML form) void CopyKeysToClipboard(const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks); @@ -306,15 +306,15 @@ private: // Called when an animation updates needs to be schedules void ForceAnimation(); - virtual void CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks) override; + void CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks) override; std::deque GetMatchingTracks(CTrackViewAnimNode* pAnimNode, XmlNodeRef trackNode); void GetMatchedPasteLocationsRec(std::vector& locations, CTrackViewNode* pCurrentNode, XmlNodeRef clipboardNode); - virtual void BeginUndoTransaction(); - virtual void EndUndoTransaction(); - virtual void BeginRestoreTransaction(); - virtual void EndRestoreTransaction(); + void BeginUndoTransaction() override; + void EndUndoTransaction() override; + void BeginRestoreTransaction() override; + void EndRestoreTransaction() override; // For record mode on AZ::Entities - connect (or disconnect) to buses for notification of property changes void ConnectToBusesForRecording(const AZ::EntityId& entityIdForBus, bool enableConnection); diff --git a/Code/Editor/TrackView/TrackViewSequenceManager.h b/Code/Editor/TrackView/TrackViewSequenceManager.h index 21c10f009a..1474323dc6 100644 --- a/Code/Editor/TrackView/TrackViewSequenceManager.h +++ b/Code/Editor/TrackView/TrackViewSequenceManager.h @@ -27,7 +27,7 @@ public: CTrackViewSequenceManager(); ~CTrackViewSequenceManager(); - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event); + void OnEditorNotifyEvent(EEditorNotifyEvent event) override; unsigned int GetCount() const { return static_cast(m_sequences.size()); } @@ -65,7 +65,7 @@ private: void OnSequenceAdded(CTrackViewSequence* pSequence); void OnSequenceRemoved(CTrackViewSequence* pSequence); - virtual void OnDataBaseItemEvent(IDataBaseItem* pItem, EDataBaseItemEvent event); + void OnDataBaseItemEvent(IDataBaseItem* pItem, EDataBaseItemEvent event) override; // AZ::EntitySystemBus void OnEntityNameChanged(const AZ::EntityId& entityId, const AZStd::string& name) override; diff --git a/Code/Editor/TrackView/TrackViewSplineCtrl.h b/Code/Editor/TrackView/TrackViewSplineCtrl.h index 2f4c790627..7c5a13cdb6 100644 --- a/Code/Editor/TrackView/TrackViewSplineCtrl.h +++ b/Code/Editor/TrackView/TrackViewSplineCtrl.h @@ -28,7 +28,7 @@ public: CTrackViewSplineCtrl(QWidget* parent); virtual ~CTrackViewSplineCtrl(); - virtual void ClearSelection(); + void ClearSelection() override; void AddSpline(ISplineInterpolator* pSpline, CTrackViewTrack* pTrack, const QColor& color); void AddSpline(ISplineInterpolator * pSpline, CTrackViewTrack * pTrack, QColor anColorArray[4]); @@ -53,12 +53,12 @@ protected: void wheelEvent(QWheelEvent* event) override; private: - virtual void SelectKey(ISplineInterpolator* pSpline, int nKey, int nDimension, bool bSelect) override; - virtual void SelectRectangle(const QRect& rc, bool bSelect) override; + void SelectKey(ISplineInterpolator* pSpline, int nKey, int nDimension, bool bSelect) override; + void SelectRectangle(const QRect& rc, bool bSelect) override; std::vector m_tracks; - virtual bool GetTangentHandlePts(QPoint& inTangentPt, QPoint& pt, QPoint& outTangentPt, + bool GetTangentHandlePts(QPoint& inTangentPt, QPoint& pt, QPoint& outTangentPt, int nSpline, int nKey, int nDimension) override; void ComputeIncomingTangentAndEaseTo(float& ds, float& easeTo, QPoint inTangentPt, int nSpline, int nKey, int nDimension); @@ -67,7 +67,7 @@ private: void AdjustTCB(float d_tension, float d_continuity, float d_bias); void MoveSelectedTangentHandleTo(const QPoint& point); - virtual ISplineCtrlUndo* CreateSplineCtrlUndoObject(std::vector& splineContainer); + virtual ISplineCtrlUndo* CreateSplineCtrlUndoObject(std::vector& splineContainer) override; bool m_bKeysFreeze; bool m_bTangentsFreeze; diff --git a/Code/Editor/Util/ColumnGroupTreeView.h b/Code/Editor/Util/ColumnGroupTreeView.h index 3c7dea91c3..eda5f8e9c9 100644 --- a/Code/Editor/Util/ColumnGroupTreeView.h +++ b/Code/Editor/Util/ColumnGroupTreeView.h @@ -44,7 +44,7 @@ public slots: QVector Groups() const; protected: - void paintEvent(QPaintEvent* event) + void paintEvent(QPaintEvent* event) override { if (model() && model()->rowCount() > 0) { diff --git a/Code/Editor/Util/Variable.h b/Code/Editor/Util/Variable.h index 0965756488..639161775c 100644 --- a/Code/Editor/Util/Variable.h +++ b/Code/Editor/Util/Variable.h @@ -399,7 +399,7 @@ public: //! Get name of parameter. QString GetDescription() const override { return m_description; }; - EType GetType() const { return IVariable::UNKNOWN; }; + EType GetType() const override { return IVariable::UNKNOWN; }; int GetSize() const override { return sizeof(*this); }; unsigned char GetDataType() const override { return m_dataType; }; @@ -409,8 +409,8 @@ public: int GetFlags() const override { return m_flags; } void SetFlagRecursive(EFlags flag) override { m_flags |= flag; } - void SetUserData(const QVariant &data){ m_userData = data; }; - QVariant GetUserData() const { return m_userData; } + void SetUserData(const QVariant &data) override { m_userData = data; }; + QVariant GetUserData() const override { return m_userData; } ////////////////////////////////////////////////////////////////////////// // Set methods. @@ -1114,44 +1114,44 @@ public: } //! Get name of parameter. - virtual EType GetType() const { return (EType)var_type::type_traits::type(); }; - virtual int GetSize() const { return sizeof(T); }; + EType GetType() const override { return (EType)var_type::type_traits::type(); }; + int GetSize() const override { return sizeof(T); }; ////////////////////////////////////////////////////////////////////////// // Set methods. ////////////////////////////////////////////////////////////////////////// - virtual void Set(int value) { SetValue(value); } - virtual void Set(bool value) { SetValue(value); } - virtual void Set(float value) { SetValue(value); } - virtual void Set(double value) { SetValue(value); } - virtual void Set(const Vec2& value) { SetValue(value); } - virtual void Set(const Vec3& value) { SetValue(value); } - virtual void Set(const Vec4& value) { SetValue(value); } - virtual void Set(const Ang3& value) { SetValue(value); } - virtual void Set(const Quat& value) { SetValue(value); } - virtual void Set(const QString& value) { SetValue(value); } - virtual void Set(const char* value) { SetValue(QString(value)); } + void Set(int value) override { SetValue(value); } + void Set(bool value) override { SetValue(value); } + void Set(float value) override { SetValue(value); } + void Set(double value) override { SetValue(value); } + void Set(const Vec2& value) override { SetValue(value); } + void Set(const Vec3& value) override { SetValue(value); } + void Set(const Vec4& value) override { SetValue(value); } + void Set(const Ang3& value) override { SetValue(value); } + void Set(const Quat& value) override { SetValue(value); } + void Set(const QString& value) override { SetValue(value); } + void Set(const char* value) override { SetValue(QString(value)); } ////////////////////////////////////////////////////////////////////////// // Get methods. ////////////////////////////////////////////////////////////////////////// - virtual void Get(int& value) const { GetValue(value); } - virtual void Get(bool& value) const { GetValue(value); } - virtual void Get(float& value) const { GetValue(value); } - virtual void Get(double& value) const { GetValue(value); } - virtual void Get(Vec2& value) const { GetValue(value); } - virtual void Get(Vec3& value) const { GetValue(value); } - virtual void Get(Vec4& value) const { GetValue(value); } - virtual void Get(Quat& value) const { GetValue(value); } - virtual void Get(QString& value) const { GetValue(value); } - virtual bool HasDefaultValue() const + void Get(int& value) const override { GetValue(value); } + void Get(bool& value) const override { GetValue(value); } + void Get(float& value) const override { GetValue(value); } + void Get(double& value) const override { GetValue(value); } + void Get(Vec2& value) const override { GetValue(value); } + void Get(Vec3& value) const override { GetValue(value); } + void Get(Vec4& value) const override { GetValue(value); } + void Get(Quat& value) const override { GetValue(value); } + void Get(QString& value) const override { GetValue(value); } + bool HasDefaultValue() const override { T defval; var_type::init(defval); return m_valueDef == defval; } - virtual void ResetToDefault() + void ResetToDefault() override { T defval; var_type::init(defval); @@ -1161,7 +1161,7 @@ public: ////////////////////////////////////////////////////////////////////////// // Limits. ////////////////////////////////////////////////////////////////////////// - virtual void SetLimits(float fMin, float fMax, float fStep = 0.f, bool bHardMin = true, bool bHardMax = true) + void SetLimits(float fMin, float fMax, float fStep = 0.f, bool bHardMin = true, bool bHardMax = true) override { m_valueMin = fMin; m_valueMax = fMax; @@ -1173,7 +1173,7 @@ public: m_customLimits = true; } - virtual void GetLimits(float& fMin, float& fMax, float& fStep, bool& bHardMin, bool& bHardMax) + void GetLimits(float& fMin, float& fMax, float& fStep, bool& bHardMin, bool& bHardMax) override { if (!m_customLimits && var_type::type_traits::supports_range()) { @@ -1201,7 +1201,7 @@ public: m_customLimits = false; } - virtual bool HasCustomLimits() + bool HasCustomLimits() override { return m_customLimits; } @@ -1219,14 +1219,14 @@ public: void operator=(const T& value) { SetValue(value); } ////////////////////////////////////////////////////////////////////////// - IVariable* Clone([[maybe_unused]] bool bRecursive) const + IVariable* Clone([[maybe_unused]] bool bRecursive) const override { Self* var = new Self(*this); return var; } ////////////////////////////////////////////////////////////////////////// - void CopyValue(IVariable* fromVar) + void CopyValue(IVariable* fromVar) override { assert(fromVar); T val; @@ -1670,7 +1670,7 @@ struct CSmartVariableBase return *pV; } // Cast to CVariableBase& VarType& operator*() const { return *pVar; } - VarType* operator->(void) const { return pVar; } + VarType* operator->() const { return pVar; } VarType* GetVar() const { return pVar; }; @@ -1732,7 +1732,7 @@ struct CSmartVariableArray } VarType& operator*() const { return *pVar; } - VarType* operator->(void) const { return pVar; } + VarType* operator->() const { return pVar; } VarType* GetVar() const { return pVar; }; @@ -1754,35 +1754,35 @@ public: // Dtor. virtual ~CVarBlock() {} //! Add variable to block. - virtual void AddVariable(IVariable* var); + void AddVariable(IVariable* var) override; //! Remove variable from block - virtual bool DeleteVariable(IVariable* var, bool bRecursive = false); + bool DeleteVariable(IVariable* var, bool bRecursive = false) override; void AddVariable(IVariable* pVar, const char* varName, unsigned char dataType = IVariable::DT_SIMPLE); // This used from smart variable pointer. void AddVariable(CVariableBase& var, const char* varName, unsigned char dataType = IVariable::DT_SIMPLE); //! Returns number of variables in block. - virtual int GetNumVariables() const { return static_cast(m_vars.size()); } + int GetNumVariables() const override { return static_cast(m_vars.size()); } //! Get pointer to stored variable by index. - virtual IVariable* GetVariable(int index) const + IVariable* GetVariable(int index) const override { assert(index >= 0 && index < m_vars.size()); return m_vars[index]; } // Clear all vars from VarBlock. - virtual void DeleteAllVariables() { m_vars.clear(); }; + void DeleteAllVariables() override { m_vars.clear(); }; //! Return true if variable block is empty (Does not have any vars). - virtual bool IsEmpty() const { return m_vars.empty(); } + bool IsEmpty() const override { return m_vars.empty(); } // Returns true if var block contains specified variable. - virtual bool IsContainsVariable(IVariable* pVar, bool bRecursive = true) const; + bool IsContainsVariable(IVariable* pVar, bool bRecursive = true) const override; //! Find variable by name. - virtual IVariable* FindVariable(const char* name, bool bRecursive = true, bool bHumanName = false) const; + IVariable* FindVariable(const char* name, bool bRecursive = true, bool bHumanName = false) const override; ////////////////////////////////////////////////////////////////////////// //! Clone var block. diff --git a/Code/Editor/Viewport.h b/Code/Editor/Viewport.h index e54eca6083..e1cd822404 100644 --- a/Code/Editor/Viewport.h +++ b/Code/Editor/Viewport.h @@ -172,7 +172,7 @@ public: //! Get current view matrix. //! This is a matrix that transforms from world space to view space. - virtual const Matrix34& GetViewTM() const + const Matrix34& GetViewTM() const override { AZ_Error("CryLegacy", false, "QtViewport::GetViewTM not implemented"); static const Matrix34 m; @@ -182,7 +182,7 @@ public: ////////////////////////////////////////////////////////////////////////// //! Get current screen matrix. //! Screen matrix transform from World space to Screen space. - virtual const Matrix34& GetScreenTM() const + const Matrix34& GetScreenTM() const override { return m_screenTM; } @@ -190,9 +190,9 @@ public: virtual Vec3 MapViewToCP(const QPoint& point) = 0; //! Map viewport position to world space position. - virtual Vec3 ViewToWorld(const QPoint& vp, bool* pCollideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const = 0; + Vec3 ViewToWorld(const QPoint& vp, bool* pCollideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override = 0; //! Convert point on screen to world ray. - virtual void ViewToWorldRay(const QPoint& vp, Vec3& raySrc, Vec3& rayDir) const = 0; + void ViewToWorldRay(const QPoint& vp, Vec3& raySrc, Vec3& rayDir) const override = 0; //! Get normal for viewport position virtual Vec3 ViewToWorldNormal(const QPoint& vp, bool onlyTerrain, bool bTestRenderMesh = false) = 0; @@ -261,7 +261,7 @@ public: virtual void SetCursorString(const QString& str) = 0; virtual void SetFocus() = 0; - virtual void Invalidate(bool bErase = 1) = 0; + virtual void Invalidate(bool bErase = true) = 0; // Is overridden by RenderViewport virtual void SetFOV([[maybe_unused]] float fov) {} @@ -280,7 +280,7 @@ public: virtual void PreWidgetRendering() {} virtual void PostWidgetRendering() {} - virtual CViewport *asCViewport() { return this; } + CViewport *asCViewport() override { return this; } protected: CLayoutViewPane* m_viewPane = nullptr; @@ -342,7 +342,7 @@ public: void SetActiveWindow() override { activateWindow(); } //! Called while window is idle. - virtual void Update(); + void Update() override; /** Set name of this viewport. */ @@ -350,24 +350,24 @@ public: /** Get name of viewport */ - QString GetName() const; + QString GetName() const override; - virtual void SetFocus() { setFocus(); } - virtual void Invalidate([[maybe_unused]] bool bErase = 1) { update(); } + void SetFocus() override { setFocus(); } + void Invalidate([[maybe_unused]] bool bErase = 1) override { update(); } // Is overridden by RenderViewport - virtual void SetFOV([[maybe_unused]] float fov) {} - virtual float GetFOV() const; + void SetFOV([[maybe_unused]] float fov) override {} + float GetFOV() const override; // Must be overridden in derived classes. // Returns: // e.g. 4.0/3.0 - virtual float GetAspectRatio() const = 0; - virtual void GetDimensions(int* pWidth, int* pHeight) const; - virtual void ScreenToClient(QPoint& pPoint) const override; + float GetAspectRatio() const override = 0; + void GetDimensions(int* pWidth, int* pHeight) const override; + void ScreenToClient(QPoint& pPoint) const override; - virtual void ResetContent(); - virtual void UpdateContent(int flags); + void ResetContent() override; + void UpdateContent(int flags) override; //! Set current zoom factor for this viewport. virtual void SetZoomFactor(float fZoomFactor); @@ -379,10 +379,10 @@ public: virtual void OnDeactivate(); //! Map world space position to viewport position. - virtual QPoint WorldToView(const Vec3& wp) const override; + QPoint WorldToView(const Vec3& wp) const override; //! Map world space position to 3D viewport position. - virtual Vec3 WorldToView3D(const Vec3& wp, int nFlags = 0) const; + Vec3 WorldToView3D(const Vec3& wp, int nFlags = 0) const override; //! Map viewport position to world space position. virtual Vec3 ViewToWorld(const QPoint& vp, bool* pCollideWithTerrain = nullptr, bool onlyTerrain = false, bool bSkipVegetation = false, bool bTestRenderMesh = false, bool* collideWithObject = nullptr) const override; @@ -398,17 +398,17 @@ public: //! This method return a vector (p2-p1) in world space alligned to construction plane and restriction axises. //! p1 and p2 must be given in world space and lie on construction plane. using CViewport::GetCPVector; - virtual Vec3 GetCPVector(const Vec3& p1, const Vec3& p2, int axis); + Vec3 GetCPVector(const Vec3& p1, const Vec3& p2, int axis) override; //! Snap any given 3D world position to grid lines if snap is enabled. Vec3 SnapToGrid(const Vec3& vec) override; - virtual float GetGridStep() const; + float GetGridStep() const override; //! Returns the screen scale factor for a point given in world coordinates. //! This factor gives the width in world-space units at the point's distance of the viewport. - virtual float GetScreenScaleFactor([[maybe_unused]] const Vec3& worldPoint) const { return 1; }; + float GetScreenScaleFactor([[maybe_unused]] const Vec3& worldPoint) const override { return 1; }; - void SetAxisConstrain(int axis); + void SetAxisConstrain(int axis) override; /// Take raw input and create a final mouse interaction. /// @attention Do not map **point** from widget to viewport explicitly, @@ -420,7 +420,7 @@ public: // Selection. ////////////////////////////////////////////////////////////////////////// //! Resets current selection region. - virtual void ResetSelectionRegion(); + void ResetSelectionRegion() override; //! Set 2D selection rectangle. void SetSelectionRectangle(const QRect& rect) override; @@ -429,12 +429,12 @@ public: //! Called when dragging selection rectangle. void OnDragSelectRectangle(const QRect& rect, bool bNormalizeRect = false) override; //! Get selection procision tolerance. - float GetSelectionTolerance() const { return m_selectionTolerance; } + float GetSelectionTolerance() const override { return m_selectionTolerance; } //! Center viewport on selection. void CenterOnSelection() override {} void CenterOnAABB([[maybe_unused]] const AABB& aabb) override {} - virtual void CenterOnSliceInstance() {} + void CenterOnSliceInstance() override {} //! Performs hit testing of 2d point in view to find which object hit. bool HitTest(const QPoint& point, HitContext& hitInfo) override; @@ -447,10 +447,10 @@ public: float GetDistanceToLine(const Vec3& lineP1, const Vec3& lineP2, const QPoint& point) const override; // Access to the member m_bAdvancedSelectMode so interested modules can know its value. - bool GetAdvancedSelectModeFlag(); + bool GetAdvancedSelectModeFlag() override; - virtual void GetPerpendicularAxis(EAxis* pAxis, bool* pIs2D) const; - virtual const ::Plane* GetConstructionPlane() const { return &m_constructionPlane; } + void GetPerpendicularAxis(EAxis* pAxis, bool* pIs2D) const override; + const ::Plane* GetConstructionPlane() const override { return &m_constructionPlane; } ////////////////////////////////////////////////////////////////////////// @@ -458,7 +458,7 @@ public: //! Set construction plane from given position construction matrix refrence coord system and axis settings. ////////////////////////////////////////////////////////////////////////// void MakeConstructionPlane(int axis) override; - virtual void SetConstructionMatrix(RefCoordSys coordSys, const Matrix34& xform); + void SetConstructionMatrix(RefCoordSys coordSys, const Matrix34& xform) override; virtual const Matrix34& GetConstructionMatrix(RefCoordSys coordSys); // Set simple construction plane origin. void SetConstructionOrigin(const Vec3& worldPos); @@ -468,11 +468,11 @@ public: ////////////////////////////////////////////////////////////////////////// // Undo for viewpot operations. - void BeginUndo(); - void AcceptUndo(const QString& undoDescription); - void CancelUndo(); - void RestoreUndo(); - bool IsUndoRecording() const; + void BeginUndo() override; + void AcceptUndo(const QString& undoDescription) override; + void CancelUndo() override; + void RestoreUndo() override; + bool IsUndoRecording() const override; ////////////////////////////////////////////////////////////////////////// //! Get prefered original size for this viewport. @@ -480,39 +480,39 @@ public: virtual QSize GetIdealSize() const; //! Check if world space bounding box is visible in this view. - virtual bool IsBoundsVisible(const AABB& box) const; + bool IsBoundsVisible(const AABB& box) const override; ////////////////////////////////////////////////////////////////////////// - void SetCursor(const QCursor& cursor) + void SetCursor(const QCursor& cursor) override { setCursor(cursor); } // Set`s current cursor string. void SetCurrentCursor(const QCursor& hCursor, const QString& cursorString); - virtual void SetCurrentCursor(EStdCursor stdCursor, const QString& cursorString); - void SetCurrentCursor(EStdCursor stdCursor); - virtual void SetCursorString(const QString& cursorString); - void ResetCursor(); - void SetSupplementaryCursorStr(const QString& str); + void SetCurrentCursor(EStdCursor stdCursor, const QString& cursorString) override; + void SetCurrentCursor(EStdCursor stdCursor) override; + void SetCursorString(const QString& cursorString) override; + void ResetCursor() override; + void SetSupplementaryCursorStr(const QString& str) override; ////////////////////////////////////////////////////////////////////////// // Return visble objects cache. - CBaseObjectsCache* GetVisibleObjectsCache() { return m_pVisibleObjectsCache; }; + CBaseObjectsCache* GetVisibleObjectsCache() override { return m_pVisibleObjectsCache; }; - void RegisterRenderListener(IRenderListener* piListener); - bool UnregisterRenderListener(IRenderListener* piListener); - bool IsRenderListenerRegistered(IRenderListener* piListener); + void RegisterRenderListener(IRenderListener* piListener) override; + bool UnregisterRenderListener(IRenderListener* piListener) override; + bool IsRenderListenerRegistered(IRenderListener* piListener) override; - void AddPostRenderer(IPostRenderer* pPostRenderer); - bool RemovePostRenderer(IPostRenderer* pPostRenderer); + void AddPostRenderer(IPostRenderer* pPostRenderer) override; + bool RemovePostRenderer(IPostRenderer* pPostRenderer) override; void CaptureMouse() override { m_mouseCaptured = true; QWidget::grabMouse(); } void ReleaseMouse() override { m_mouseCaptured = false; QWidget::releaseMouse(); } - virtual void setRay(QPoint& vp, Vec3& raySrc, Vec3& rayDir); - virtual void setHitcontext(QPoint& vp, Vec3& raySrc, Vec3& rayDir); + void setRay(QPoint& vp, Vec3& raySrc, Vec3& rayDir) override; + void setHitcontext(QPoint& vp, Vec3& raySrc, Vec3& rayDir) override; QPoint m_vp; AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING Vec3 m_raySrc; @@ -576,8 +576,8 @@ protected: //Child classes can override these to provide extra logic that wraps //widget rendering. Needed by the RenderViewport to handle raycasts //from screen-space to world-space. - virtual void PreWidgetRendering() {} - virtual void PostWidgetRendering() {} + void PreWidgetRendering() override {} + void PostWidgetRendering() override {} AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING AzToolsFramework::ViewportUi::ViewportUiManager m_viewportUi; diff --git a/Code/Editor/ViewportTitleDlg.h b/Code/Editor/ViewportTitleDlg.h index 5acb04ca99..4a2a454907 100644 --- a/Code/Editor/ViewportTitleDlg.h +++ b/Code/Editor/ViewportTitleDlg.h @@ -77,7 +77,7 @@ Q_SIGNALS: protected: virtual void OnInitDialog(); - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event); + void OnEditorNotifyEvent(EEditorNotifyEvent event) override; void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) override; void OnMaximize(); From 7484f3adff36c81ecdd86ea62063720280243b33 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:15:33 -0700 Subject: [PATCH 247/355] Code/Tools/SceneAPI Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h | 2 +- .../SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h | 2 +- Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h index 8c73b5fe17..fbfd553caa 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/ManifestNameHandler.h @@ -34,7 +34,7 @@ namespace AZ QWidget* CreateGUI(QWidget* parent) override; u32 GetHandlerName() const override; - bool AutoDelete() const; + bool AutoDelete() const override; void ConsumeAttribute(ManifestNameWidget* widget, u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override; diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h index 3b8f028be8..8717e23ac4 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/NodeListSelectionHandler.h @@ -57,7 +57,7 @@ namespace AZ QWidget* CreateGUI(QWidget* parent) override; u32 GetHandlerName() const override; - bool AutoDelete() const; + bool AutoDelete() const override; void ConsumeAttribute(NodeListSelectionWidget* widget, u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override; diff --git a/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h b/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h index 664fea9f85..0fd9aede88 100644 --- a/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h +++ b/Code/Tools/SceneAPI/SceneUI/RowWidgets/TransformRowHandler.h @@ -33,7 +33,7 @@ namespace AZ QWidget* CreateGUI(QWidget* parent) override; u32 GetHandlerName() const override; - bool AutoDelete() const; + bool AutoDelete() const override; bool IsDefaultHandler() const override; From 7755c39d09063872fb6867f4d3910bfb82952770 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:15:55 -0700 Subject: [PATCH 248/355] Code/Tools/Standalone Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Standalone/Source/LUA/LUAEditorContext.h | 128 +++++++++--------- .../Source/LUA/LUAEditorMainWindow.hxx | 36 ++--- .../Standalone/Source/LUA/LUAEditorView.hxx | 10 +- .../Source/StandaloneToolsApplication.h | 2 +- .../Source/Telemetry/TelemetryComponent.h | 4 +- 5 files changed, 90 insertions(+), 90 deletions(-) diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorContext.h b/Code/Tools/Standalone/Source/LUA/LUAEditorContext.h index fc0e78089d..f844eaf395 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorContext.h +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorContext.h @@ -84,22 +84,22 @@ namespace LUAEditor ////////////////////////////////////////////////////////////////////////// // AZ::Component - virtual void Init(); - virtual void Activate(); - virtual void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; ////////////////////////////////////////////////////////////////////////// static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required); ////////////////////////////////////////////////////////////////////////// // EditorFramework::CoreMessageBus::Handler - virtual void RunAsAnotherInstance(); + void RunAsAnotherInstance() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // AzToolsFramework::AssetSystemInfoBus::Handler - virtual void AssetCompilationSuccess(const AZStd::string& assetPath) override; - virtual void AssetCompilationFailed(const AZStd::string& assetPath) override; + void AssetCompilationSuccess(const AZStd::string& assetPath) override; + void AssetCompilationFailed(const AZStd::string& assetPath) override; ////////////////////////////////////////////////////////////////////////// @@ -111,110 +111,110 @@ namespace LUAEditor ////////////////////////////////////////////////////////////////////////// // ContextInterface Messages // it is an error to call GetDocumentData when the data is not yet ready. - virtual void ShowLUAEditorView(); + void ShowLUAEditorView() override; // this occurs from time to time, generally triggered when some external event occurs // that makes it suspect that its document statuses might be invalid: ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// //Context_DocumentManagement Messages - virtual void OnNewDocument(const AZStd::string& assetId); - virtual void OnLoadDocument(const AZStd::string& assetId, bool errorOnNotFound); - virtual void OnCloseDocument(const AZStd::string& assetId); - virtual void OnSaveDocument(const AZStd::string& assetId, bool bCloseAfterSaved, bool bSaveAs); - virtual bool OnSaveDocumentAs(const AZStd::string& assetId, bool bCloseAfterSaved); - virtual void NotifyDocumentModified(const AZStd::string& assetId, bool modified); - virtual void DocumentCheckOutRequested(const AZStd::string& assetId); - virtual void RefreshAllDocumentPerforceStat(); - virtual void OnReloadDocument(const AZStd::string assetId); + void OnNewDocument(const AZStd::string& assetId) override; + void OnLoadDocument(const AZStd::string& assetId, bool errorOnNotFound) override; + void OnCloseDocument(const AZStd::string& assetId) override; + void OnSaveDocument(const AZStd::string& assetId, bool bCloseAfterSaved, bool bSaveAs) override; + bool OnSaveDocumentAs(const AZStd::string& assetId, bool bCloseAfterSaved) override; + void NotifyDocumentModified(const AZStd::string& assetId, bool modified) override; + void DocumentCheckOutRequested(const AZStd::string& assetId) override; + void RefreshAllDocumentPerforceStat() override; + void OnReloadDocument(const AZStd::string assetId) override; - virtual void UpdateDocumentData(const AZStd::string& assetId, const char* dataPtr, const AZStd::size_t dataLength); - virtual void GetDocumentData(const AZStd::string& assetId, const char** dataPtr, AZStd::size_t& dataLength); + void UpdateDocumentData(const AZStd::string& assetId, const char* dataPtr, const AZStd::size_t dataLength) override; + void GetDocumentData(const AZStd::string& assetId, const char** dataPtr, AZStd::size_t& dataLength) override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // Target Manager ////////////////////////////////////////////////////////////////////////// - virtual void DesiredTargetConnected(bool connected); - virtual void DesiredTargetChanged(AZ::u32 newTargetID, AZ::u32 oldTargetID); + void DesiredTargetConnected(bool connected) override; + void DesiredTargetChanged(AZ::u32 newTargetID, AZ::u32 oldTargetID) override; ////////////////////////////////////////////////////////////////////////// //Context_DebuggerManagement Messages ////////////////////////////////////////////////////////////////////////// - void ExecuteScriptBlob(const AZStd::string& fromAssetId, bool executeLocal); - virtual void SynchronizeBreakpoints(); - virtual void CreateBreakpoint(const AZStd::string& fromAssetId, int lineNumber); - virtual void MoveBreakpoint(const AZ::Uuid& breakpointUID, int lineNumber); - virtual void DeleteBreakpoint(const AZ::Uuid& breakpointUID); - virtual void CleanUpBreakpoints(); + void ExecuteScriptBlob(const AZStd::string& fromAssetId, bool executeLocal) override; + void SynchronizeBreakpoints() override; + void CreateBreakpoint(const AZStd::string& fromAssetId, int lineNumber) override; + void MoveBreakpoint(const AZ::Uuid& breakpointUID, int lineNumber) override; + void DeleteBreakpoint(const AZ::Uuid& breakpointUID) override; + void CleanUpBreakpoints() override; // These come from the VM - virtual void OnDebuggerAttached(); - virtual void OnDebuggerRefused(); - virtual void OnDebuggerDetached(); - virtual void OnBreakpointHit(const AZStd::string& assetIdString, int lineNumber); - virtual void OnBreakpointAdded(const AZStd::string& assetIdString, int lineNumber); - virtual void OnBreakpointRemoved(const AZStd::string& assetIdString, int lineNumber); - virtual void OnReceivedAvailableContexts(const AZStd::vector& contexts); - virtual void OnReceivedRegisteredClasses(const AzFramework::ScriptUserClassList& classes); - virtual void OnReceivedRegisteredEBuses(const AzFramework::ScriptUserEBusList& ebuses); - virtual void OnReceivedRegisteredGlobals(const AzFramework::ScriptUserMethodList& methods, const AzFramework::ScriptUserPropertyList& properties); - virtual void OnReceivedLocalVariables(const AZStd::vector& vars); - virtual void OnReceivedCallstack(const AZStd::vector& callstack); - virtual void OnReceivedValueState(const AZ::ScriptContextDebug::DebugValue& value); - virtual void OnSetValueResult(const AZStd::string& name, bool success); - virtual void OnExecutionResumed(); - virtual void OnExecuteScriptResult(bool success); + void OnDebuggerAttached() override; + void OnDebuggerRefused() override; + void OnDebuggerDetached() override; + void OnBreakpointHit(const AZStd::string& assetIdString, int lineNumber) override; + void OnBreakpointAdded(const AZStd::string& assetIdString, int lineNumber) override; + void OnBreakpointRemoved(const AZStd::string& assetIdString, int lineNumber) override; + void OnReceivedAvailableContexts(const AZStd::vector& contexts) override; + void OnReceivedRegisteredClasses(const AzFramework::ScriptUserClassList& classes) override; + void OnReceivedRegisteredEBuses(const AzFramework::ScriptUserEBusList& ebuses) override; + void OnReceivedRegisteredGlobals(const AzFramework::ScriptUserMethodList& methods, const AzFramework::ScriptUserPropertyList& properties) override; + void OnReceivedLocalVariables(const AZStd::vector& vars) override; + void OnReceivedCallstack(const AZStd::vector& callstack) override; + void OnReceivedValueState(const AZ::ScriptContextDebug::DebugValue& value) override; + void OnSetValueResult(const AZStd::string& name, bool success) override; + void OnExecutionResumed() override; + void OnExecuteScriptResult(bool success) override; ////////////////////////////////////////////////////////////////////////// //BreakpointTracker Messages ////////////////////////////////////////////////////////////////////////// - virtual const BreakpointMap* RequestBreakpoints(); - virtual void RequestEditorFocus(const AZStd::string& assetIdString, int lineNumber); - virtual void RequestDeleteBreakpoint(const AZStd::string& assetIdString, int lineNumber); + const BreakpointMap* RequestBreakpoints() override; + void RequestEditorFocus(const AZStd::string& assetIdString, int lineNumber) override; + void RequestDeleteBreakpoint(const AZStd::string& assetIdString, int lineNumber) override; ////////////////////////////////////////////////////////////////////////// //StackTracker Messages ////////////////////////////////////////////////////////////////////////// - virtual void RequestStackClicked(const AZStd::string& stackString, int lineNumber); + void RequestStackClicked(const AZStd::string& stackString, int lineNumber) override; ////////////////////////////////////////////////////////////////////////// //TargetContextTracker Messages ////////////////////////////////////////////////////////////////////////// - virtual const AZStd::vector RequestTargetContexts(); - virtual const AZStd::string RequestCurrentTargetContext(); - virtual void SetCurrentTargetContext(AZStd::string& contextName); + virtual const AZStd::vector RequestTargetContexts() override; + const AZStd::string RequestCurrentTargetContext() override; + void SetCurrentTargetContext(AZStd::string& contextName) override; ////////////////////////////////////////////////////////////////////////// //Watch window messages ////////////////////////////////////////////////////////////////////////// - virtual void RequestWatchedVariable(const AZStd::string& varName); + void RequestWatchedVariable(const AZStd::string& varName) override; ////////////////////////////////////////////////////////////////////////// //Debug Request messages ////////////////////////////////////////////////////////////////////////// - virtual void RequestDetachDebugger(); - virtual void RequestAttachDebugger(); + void RequestDetachDebugger() override; + void RequestAttachDebugger() override; ////////////////////////////////////////////////////////////////////////// // AzToolsFramework CoreMessages - virtual void OnRestoreState(); // sent when everything is registered up and ready to go, this is what bootstraps stuff to get going. - virtual bool OnGetPermissionToShutDown(); - virtual bool CheckOkayToShutDown(); - virtual void OnSaveState(); // sent to everything when the app is about to shut down - do what you need to do. - virtual void OnDestroyState(); - virtual void ApplicationDeactivated(); - virtual void ApplicationActivated(); - virtual void ApplicationShow(AZ::Uuid id); - virtual void ApplicationHide(AZ::Uuid id); - virtual void ApplicationCensus(); + void OnRestoreState() override; // sent when everything is registered up and ready to go, this is what bootstraps stuff to get going. + bool OnGetPermissionToShutDown() override; + bool CheckOkayToShutDown() override; + void OnSaveState() override; // sent to everything when the app is about to shut down - do what you need to do. + void OnDestroyState() override; + void ApplicationDeactivated() override; + void ApplicationActivated() override; + void ApplicationShow(AZ::Uuid id) override; + void ApplicationHide(AZ::Uuid id) override; + void ApplicationCensus() override; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // HighlightedWords - virtual const HighlightedWords::LUAKeywordsType* GetLUAKeywords() { return &m_LUAKeywords; } - virtual const HighlightedWords::LUAKeywordsType* GetLUALibraryFunctions() { return &m_LUALibraryFunctions; } + const HighlightedWords::LUAKeywordsType* GetLUAKeywords() override { return &m_LUAKeywords; } + const HighlightedWords::LUAKeywordsType* GetLUALibraryFunctions() override { return &m_LUALibraryFunctions; } // internal data structure for the LUA debugger class/member/property reference panel // this is what we serialize and work with diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.hxx index c01893909b..1b23504fed 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorMainWindow.hxx @@ -86,14 +86,14 @@ namespace LUAEditor public: AZ_CLASS_ALLOCATOR(LUAEditorMainWindow,AZ::SystemAllocator,0); LUAEditorMainWindow(QStandardItemModel* dataModel, bool connectedState, QWidget* parent = NULL, Qt::WindowFlags flags = Qt::WindowFlags()); - virtual ~LUAEditorMainWindow(void); + virtual ~LUAEditorMainWindow(); bool OnGetPermissionToShutDown(); ////////////////////////////////////////////////////////////////////////// // Qt Events private: - virtual void closeEvent(QCloseEvent* event); + void closeEvent(QCloseEvent* event) override; Ui::LUAEditorMainWindow* m_gui; AzToolsFramework::TargetSelectorButtonAction* m_pTargetButton; @@ -204,7 +204,7 @@ namespace LUAEditor AZStd::string m_lastOpenFilePath; AZStd::vector m_dProcessFindListClicked; - void OnDataLoadedAndSet(const DocumentInfo& info, LUAViewWidget* pLUAViewWidget); + void OnDataLoadedAndSet(const DocumentInfo& info, LUAViewWidget* pLUAViewWidget) override; AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* m_filterModel; QSharedPointer CreateFilter(); @@ -243,18 +243,18 @@ namespace LUAEditor // LUAEditorMainWindow Messages. public: virtual void OnCloseView(const AZStd::string& assetId); - virtual void OnFocusInEvent(const AZStd::string& assetId); - virtual void OnFocusOutEvent(const AZStd::string& assetId); - virtual void OnRequestCheckOut(const AZStd::string& assetId); - virtual void OnConnectedToTarget(); - virtual void OnDisconnectedFromTarget(); - virtual void OnConnectedToDebugger(); - virtual void OnDisconnectedFromDebugger(); + void OnFocusInEvent(const AZStd::string& assetId) override; + void OnFocusOutEvent(const AZStd::string& assetId) override; + void OnRequestCheckOut(const AZStd::string& assetId) override; + void OnConnectedToTarget() override; + void OnDisconnectedFromTarget() override; + void OnConnectedToDebugger() override; + void OnDisconnectedFromDebugger() override; void Repaint() override; ////////////////////////////////////////////////////////////////////////// - virtual void dragEnterEvent(QDragEnterEvent *pEvent); - virtual void dropEvent(QDropEvent *pEvent); + void dragEnterEvent(QDragEnterEvent *pEvent) override; + void dropEvent(QDropEvent *pEvent) override; void IgnoreFocusEvents(bool ignore) { m_bIgnoreFocusRequests = ignore; } @@ -327,7 +327,7 @@ namespace LUAEditor // support for windows-ish Ctrl+Tab cycling through documents via the above Tab actions typedef AZStd::list TrackedLUACtrlTabOrder; TrackedLUACtrlTabOrder m_CtrlTabOrder; - bool eventFilter(QObject *obj, QEvent *event); + bool eventFilter(QObject *obj, QEvent *event) override; AZStd::string m_StoredTabAssetId; bool m_bIgnoreFocusRequests; @@ -338,10 +338,10 @@ namespace LUAEditor ////////////////////////////////////////////////////////////////////////// //Debugger Messages, from the LUAEditor::LUABreakpointTrackerMessages::Bus - virtual void BreakpointsUpdate(const LUAEditor::BreakpointMap& uniqueBreakpoints); - virtual void BreakpointHit(const LUAEditor::Breakpoint& breakpoint); - virtual void BreakpointResume(); - virtual void OnExecuteScriptResult(bool success); + void BreakpointsUpdate(const LUAEditor::BreakpointMap& uniqueBreakpoints) override; + void BreakpointHit(const LUAEditor::Breakpoint& breakpoint) override; + void BreakpointResume() override; + void OnExecuteScriptResult(bool success) override; ////////////////////////////////////////////////////////////////////////// // track activity and synchronize the appropriate widgets' states to match @@ -433,7 +433,7 @@ namespace LUAEditor bool m_bAutoReloadUnmodifiedFiles = false; LUAEditorMainWindowSavedState() {} - void Init(const QByteArray& windowState,const QByteArray& windowGeom) + void Init(const QByteArray& windowState,const QByteArray& windowGeom) override { AzToolsFramework::MainWindowSavedState::Init(windowState, windowGeom); } diff --git a/Code/Tools/Standalone/Source/LUA/LUAEditorView.hxx b/Code/Tools/Standalone/Source/LUA/LUAEditorView.hxx index 70e4ba625f..ada99929aa 100644 --- a/Code/Tools/Standalone/Source/LUA/LUAEditorView.hxx +++ b/Code/Tools/Standalone/Source/LUA/LUAEditorView.hxx @@ -73,7 +73,7 @@ namespace LUAEditor LUADockWidget* luaDockWidget(){ return m_pLUADockWidget;} void SetLuaDockWidget(LUADockWidget* pLUADockWidget){m_pLUADockWidget = pLUADockWidget;} - virtual void dropEvent(QDropEvent *e); + void dropEvent(QDropEvent *e) override; // point a little arrow at this line. -1 means remove it. void UpdateCurrentExecutingLine(int lineNumber); @@ -83,9 +83,9 @@ namespace LUAEditor ////////////////////////////////////////////////////////////////////////// //Debugger Messages, from the LUAEditor::LUABreakpointTrackerMessages::Bus - virtual void BreakpointsUpdate(const LUAEditor::BreakpointMap& uniqueBreakpoints); - virtual void BreakpointHit(const LUAEditor::Breakpoint& breakpoint); - virtual void BreakpointResume(); + void BreakpointsUpdate(const LUAEditor::BreakpointMap& uniqueBreakpoints) override; + void BreakpointHit(const LUAEditor::Breakpoint& breakpoint) override; + void BreakpointResume() override; void BreakpointToggle(int line); @@ -153,7 +153,7 @@ namespace LUAEditor void RegainFocus(); private: - virtual void keyPressEvent(QKeyEvent *ev); + void keyPressEvent(QKeyEvent *ev) override; int CalcDocPosition(int line, int column); template //callabe must take a const QTextCursor& as a parameter void UpdateCursor(Callable callable); diff --git a/Code/Tools/Standalone/Source/StandaloneToolsApplication.h b/Code/Tools/Standalone/Source/StandaloneToolsApplication.h index 82028d7b9f..4ca45b8669 100644 --- a/Code/Tools/Standalone/Source/StandaloneToolsApplication.h +++ b/Code/Tools/Standalone/Source/StandaloneToolsApplication.h @@ -42,7 +42,7 @@ namespace StandaloneTools bool LaunchDiscoveryService(); // AZ::UserSettingsFileLocatorBus::Handler - AZStd::string ResolveFilePath(AZ::u32 /*providerId*/); + AZStd::string ResolveFilePath(AZ::u32 /*providerId*/) override; ////////////////////////////////////////////////////////////////////////// }; } diff --git a/Code/Tools/Standalone/Source/Telemetry/TelemetryComponent.h b/Code/Tools/Standalone/Source/Telemetry/TelemetryComponent.h index a715466cdb..f924908ea2 100644 --- a/Code/Tools/Standalone/Source/Telemetry/TelemetryComponent.h +++ b/Code/Tools/Standalone/Source/Telemetry/TelemetryComponent.h @@ -26,8 +26,8 @@ namespace Telemetry ////////////////// // AZ::Component - void Activate(); - void Deactivate(); + void Activate() override; + void Deactivate() override; static void Reflect(AZ::ReflectContext* context); ////////////////// From a7780b6dbedac5c479389c24b403e5904bde7f3b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:16:11 -0700 Subject: [PATCH 249/355] Gems/Atom* Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Editor/MipmapSettingWidget.h | 2 +- .../Code/Source/Editor/TexturePreviewWidget.h | 2 +- .../Source/Editor/TexturePropertyEditor.h | 2 +- .../StartParamFunctionsOverrideImpl.inl | 19 +++++++++++++++++++ .../Source/Checkerboard/CheckerboardPass.h | 2 +- .../Common/Code/Source/ImGui/ImGuiPass.h | 2 +- .../Source/PostProcess/Bloom/BloomSettings.h | 2 +- .../Source/PostProcess/PostProcessSettings.h | 2 +- .../Source/PostProcess/Ssao/SsaoSettings.h | 2 +- .../Source/ScreenSpace/DeferredFogSettings.h | 18 +++++++++--------- .../Shadows/ProjectedShadowFeatureProcessor.h | 2 +- .../atom_feature_common_public_files.cmake | 1 + .../RHI.Builders/ShaderPlatformInterface.h | 2 +- Gems/Atom/RPI/Code/Tests/Common/RHI/Stubs.h | 18 +++++++++--------- .../MaterialPropertySerializerTests.cpp | 4 ++-- .../Viewport/RenderViewportWidget.h | 2 +- .../Source/Animation/AttachmentComponent.h | 2 +- .../CoreLights/SimplePointLightDelegate.h | 3 +-- .../CoreLights/SimpleSpotLightDelegate.h | 2 +- .../Source/Mesh/MeshComponentController.h | 17 +++++++---------- .../Code/Source/AtomActorInstance.h | 4 ++-- 21 files changed, 63 insertions(+), 47 deletions(-) create mode 100644 Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ParamMacros/StartParamFunctionsOverrideImpl.inl diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/MipmapSettingWidget.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/MipmapSettingWidget.h index 9ea7f9c6ae..27efdb084b 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/MipmapSettingWidget.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/MipmapSettingWidget.h @@ -47,7 +47,7 @@ namespace ImageProcessingAtomEditor protected: //////////////////////////////////////////////////////////////////////// //EditorInternalNotificationBus - void OnEditorSettingsChanged(bool needRefresh, const AZStd::string& platform); + void OnEditorSettingsChanged(bool needRefresh, const AZStd::string& platform) override; //////////////////////////////////////////////////////////////////////// private: diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePreviewWidget.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePreviewWidget.h index db3c95c142..d97698cc63 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePreviewWidget.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePreviewWidget.h @@ -70,7 +70,7 @@ namespace ImageProcessingAtomEditor protected: //////////////////////////////////////////////////////////////////////// //EditorInternalNotificationBus - void OnEditorSettingsChanged(bool needRefresh, const AZStd::string& platform); + void OnEditorSettingsChanged(bool needRefresh, const AZStd::string& platform) override; //////////////////////////////////////////////////////////////////////// void resizeEvent(QResizeEvent* event) override; bool eventFilter(QObject* obj, QEvent* event) override; diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePropertyEditor.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePropertyEditor.h index 988561f3ce..83bcec9c83 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePropertyEditor.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Editor/TexturePropertyEditor.h @@ -52,7 +52,7 @@ namespace ImageProcessingAtomEditor //////////////////////////////////////////////////////////////////////// //EditorInternalNotificationBus - void OnEditorSettingsChanged(bool needRefresh, const AZStd::string& platform); + void OnEditorSettingsChanged(bool needRefresh, const AZStd::string& platform) override; //////////////////////////////////////////////////////////////////////// bool event(QEvent* event) override; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ParamMacros/StartParamFunctionsOverrideImpl.inl b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ParamMacros/StartParamFunctionsOverrideImpl.inl new file mode 100644 index 0000000000..37a853c94c --- /dev/null +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/ParamMacros/StartParamFunctionsOverrideImpl.inl @@ -0,0 +1,19 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +// Auto-generates override function declarations for getters and setters of specified parameters and overrides + +#define AZ_GFX_COMMON_PARAM(ValueType, Name, MemberName, DefaultValue) \ + ValueType Get##Name() const override { return MemberName; } \ + void Set##Name(ValueType val) override { MemberName = val; } \ + +#define AZ_GFX_COMMON_OVERRIDE(ValueType, Name, MemberName, OverrideValueType) \ + OverrideValueType Get##Name##Override() const override { return MemberName##Override; } \ + void Set##Name##Override(OverrideValueType val) override { MemberName##Override = val; } \ + +#include diff --git a/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardPass.h b/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardPass.h index 3ef4e5f851..5db9a7e487 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/Checkerboard/CheckerboardPass.h @@ -35,7 +35,7 @@ namespace AZ protected: // Pass overrides... - void FrameBeginInternal(FramePrepareParams params); + void FrameBeginInternal(FramePrepareParams params) override; void BuildInternal() override; void FrameEndInternal() override; diff --git a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h index 0bde3edb4f..018d2d46b7 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/ImGui/ImGuiPass.h @@ -77,7 +77,7 @@ namespace AZ void RenderImguiDrawData(const ImDrawData& drawData); // TickBus::Handler overrides... - void OnTick(float deltaTime, AZ::ScriptTimePoint timePoint); + void OnTick(float deltaTime, AZ::ScriptTimePoint timePoint) override; // AzFramework::InputTextEventListener overrides... bool OnInputTextEventFiltered(const AZStd::string& textUTF8) override; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/Bloom/BloomSettings.h b/Gems/Atom/Feature/Common/Code/Source/PostProcess/Bloom/BloomSettings.h index 1c245732aa..a433305d92 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/Bloom/BloomSettings.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/Bloom/BloomSettings.h @@ -47,7 +47,7 @@ namespace AZ void ApplySettingsTo(BloomSettings* target, float alpha) const; // Generate getters and setters. -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/PostProcessSettings.h b/Gems/Atom/Feature/Common/Code/Source/PostProcess/PostProcessSettings.h index 2bb1eee277..515326e357 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/PostProcessSettings.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/PostProcessSettings.h @@ -52,7 +52,7 @@ namespace AZ #undef POST_PROCESS_MEMBER // Auto-gen getter and setter functions for post process members... -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcess/Ssao/SsaoSettings.h b/Gems/Atom/Feature/Common/Code/Source/PostProcess/Ssao/SsaoSettings.h index f49b8151b1..4b3eb6e535 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcess/Ssao/SsaoSettings.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcess/Ssao/SsaoSettings.h @@ -47,7 +47,7 @@ namespace AZ void ApplySettingsTo(SsaoSettings* target, float alpha) const; // Generate getters and setters. -#include +#include #include #include diff --git a/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogSettings.h b/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogSettings.h index 57d1dd24b5..85ced5496b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogSettings.h +++ b/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogSettings.h @@ -56,7 +56,7 @@ namespace AZ ~DeferredFogSettings() = default; // DeferredFogSettingsInterface overrides... - void OnSettingsChanged(); + void OnSettingsChanged() override; bool GetSettingsNeedUpdate() { return m_needUpdate; @@ -66,35 +66,35 @@ namespace AZ m_needUpdate = needUpdate; } - void SetEnabled(bool value); - virtual bool GetEnabled() const override + void SetEnabled(bool value) override; + bool GetEnabled() const override { return m_enabled; } - virtual void SetInitialized(bool isInitialized) override + void SetInitialized(bool isInitialized) override { m_isInitialized = isInitialized; } - virtual bool IsInitialized() override + bool IsInitialized() override { return m_isInitialized; } - virtual void SetUseNoiseTextureShaderOption(bool value) override + void SetUseNoiseTextureShaderOption(bool value) override { m_useNoiseTextureShaderOption = value; } - virtual bool GetUseNoiseTextureShaderOption() override + bool GetUseNoiseTextureShaderOption() override { return m_useNoiseTextureShaderOption; } - virtual void SetEnableFogLayerShaderOption(bool value) override + void SetEnableFogLayerShaderOption(bool value) override { m_enableFogLayerShaderOption = value; } - virtual bool GetEnableFogLayerShaderOption() override + bool GetEnableFogLayerShaderOption() override { return m_enableFogLayerShaderOption; } diff --git a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h index 8beed800b6..cd74ba3797 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h @@ -48,7 +48,7 @@ namespace AZ::Render void SetFieldOfViewY(ShadowId id, float fieldOfViewYRadians) override; void SetShadowmapMaxResolution(ShadowId id, ShadowmapSize size) override; void SetShadowBias(ShadowId id, float bias) override; - void SetPcfMethod(ShadowId id, PcfMethod method); + void SetPcfMethod(ShadowId id, PcfMethod method) override; void SetEsmExponent(ShadowId id, float exponent); void SetShadowFilterMethod(ShadowId id, ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(ShadowId id, float boundaryWidthRadians) override; diff --git a/Gems/Atom/Feature/Common/Code/atom_feature_common_public_files.cmake b/Gems/Atom/Feature/Common/Code/atom_feature_common_public_files.cmake index 886a9f0f22..89febbcf3d 100644 --- a/Gems/Atom/Feature/Common/Code/atom_feature_common_public_files.cmake +++ b/Gems/Atom/Feature/Common/Code/atom_feature_common_public_files.cmake @@ -39,6 +39,7 @@ set(FILES Include/Atom/Feature/ParamMacros/StartParamCopySettingsTo.inl Include/Atom/Feature/ParamMacros/StartParamFunctions.inl Include/Atom/Feature/ParamMacros/StartParamFunctionsOverride.inl + Include/Atom/Feature/ParamMacros/StartParamFunctionsOverrideImpl.inl Include/Atom/Feature/ParamMacros/StartParamFunctionsVirtual.inl Include/Atom/Feature/ParamMacros/StartParamMembers.inl Include/Atom/Feature/ParamMacros/StartParamSerializeContext.inl diff --git a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h index 0a03211ca6..a9176ac750 100644 --- a/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h +++ b/Gems/Atom/RHI/Null/Code/Source/RHI.Builders/ShaderPlatformInterface.h @@ -34,7 +34,7 @@ namespace AZ const AssetBuilderSDK::PlatformInfo& platform, const AZStd::string& shaderSourcePath, const AZStd::string& functionName, RHI::ShaderHardwareStage shaderStage, const AZStd::string& tempFolderPath, StageDescriptor& outputDescriptor, const RHI::ShaderCompilerArguments& shaderCompilerArguments) const override; - AZStd::string GetAzslCompilerWarningParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const; + AZStd::string GetAzslCompilerWarningParameters(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const override; bool BuildHasDebugInfo(const RHI::ShaderCompilerArguments& shaderCompilerArguments) const override; const char* GetAzslHeader(const AssetBuilderSDK::PlatformInfo& platform) const override; bool BuildPipelineLayoutDescriptor( diff --git a/Gems/Atom/RPI/Code/Tests/Common/RHI/Stubs.h b/Gems/Atom/RPI/Code/Tests/Common/RHI/Stubs.h index c3768c1ce6..2ed2875cad 100644 --- a/Gems/Atom/RPI/Code/Tests/Common/RHI/Stubs.h +++ b/Gems/Atom/RPI/Code/Tests/Common/RHI/Stubs.h @@ -69,8 +69,8 @@ namespace UnitTest void FillFormatsCapabilitiesInternal([[maybe_unused]] FormatCapabilitiesList& formatsCapabilities) override {} AZ::RHI::ResultCode InitializeLimits() override { return AZ::RHI::ResultCode::Success; } void PreShutdown() override {} - AZ::RHI::ResourceMemoryRequirements GetResourceMemoryRequirements([[maybe_unused]] const AZ::RHI::ImageDescriptor& descriptor) { return AZ::RHI::ResourceMemoryRequirements{}; }; - AZ::RHI::ResourceMemoryRequirements GetResourceMemoryRequirements([[maybe_unused]] const AZ::RHI::BufferDescriptor& descriptor) { return AZ::RHI::ResourceMemoryRequirements{}; }; + AZ::RHI::ResourceMemoryRequirements GetResourceMemoryRequirements([[maybe_unused]] const AZ::RHI::ImageDescriptor& descriptor) override { return AZ::RHI::ResourceMemoryRequirements{}; }; + AZ::RHI::ResourceMemoryRequirements GetResourceMemoryRequirements([[maybe_unused]] const AZ::RHI::BufferDescriptor& descriptor) override { return AZ::RHI::ResourceMemoryRequirements{}; }; void ObjectCollectionNotify(AZ::RHI::ObjectCollectorNotifyFunction notifyFunction) override {} }; @@ -228,12 +228,12 @@ namespace UnitTest AZ_CLASS_ALLOCATOR(Fence, AZ::SystemAllocator, 0); private: - virtual AZ::RHI::ResultCode InitInternal(AZ::RHI::Device&, AZ::RHI::FenceState) override { return AZ::RHI::ResultCode::Success; } - virtual void ShutdownInternal() override {} - virtual void SignalOnCpuInternal() override {} - virtual void WaitOnCpuInternal() const override {}; - virtual void ResetInternal() override {} - virtual AZ::RHI::FenceState GetFenceStateInternal() const override { return AZ::RHI::FenceState::Reset; } + AZ::RHI::ResultCode InitInternal(AZ::RHI::Device&, AZ::RHI::FenceState) override { return AZ::RHI::ResultCode::Success; } + void ShutdownInternal() override {} + void SignalOnCpuInternal() override {} + void WaitOnCpuInternal() const override {}; + void ResetInternal() override {} + AZ::RHI::FenceState GetFenceStateInternal() const override { return AZ::RHI::FenceState::Reset; } }; class ShaderResourceGroupPool @@ -276,7 +276,7 @@ namespace UnitTest AZ_CLASS_ALLOCATOR(ShaderStageFunction, AZ::SystemAllocator, 0); private: - virtual AZ::RHI::ResultCode FinalizeInternal() { return AZ::RHI::ResultCode::Success; } + AZ::RHI::ResultCode FinalizeInternal() override { return AZ::RHI::ResultCode::Success; } }; class PipelineState diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp index 5386af1cfa..ce842d385d 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialPropertySerializerTests.cpp @@ -21,14 +21,14 @@ namespace JsonSerializationTests public JsonSerializerConformityTestDescriptor { public: - void Reflect(AZStd::unique_ptr& context) + void Reflect(AZStd::unique_ptr& context) override { AZ::RPI::MaterialTypeSourceData::Reflect(context.get()); AZ::RPI::MaterialPropertyDescriptor::Reflect(context.get()); AZ::RPI::ReflectMaterialDynamicMetadata(context.get()); } - void Reflect(AZStd::unique_ptr& context) + void Reflect(AZStd::unique_ptr& context) override { AZ::RPI::MaterialTypeSourceData::Reflect(context.get()); } diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 4210c82921..071bc5c997 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -113,7 +113,7 @@ namespace AtomToolsFramework void ToggleFullScreenState() override; float GetDpiScaleFactor() const override; uint32_t GetSyncInterval() const override; - uint32_t GetDisplayRefreshRate() const; + uint32_t GetDisplayRefreshRate() const override; protected: // AzFramework::InputChannelEventListener ... diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.h index 3e8feb2182..bd7c52c851 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Animation/AttachmentComponent.h @@ -75,7 +75,7 @@ namespace AZ //////////////////////////////////////////////////////////////////////// // AttachmentComponentRequests - void Reattach(bool detachFirst); + void Reattach(bool detachFirst) override; void Attach(AZ::EntityId targetId, const char* targetBoneName, const AZ::Transform& offset) override; void Detach() override; void SetAttachmentOffset(const AZ::Transform& offset) override; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimplePointLightDelegate.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimplePointLightDelegate.h index ef6c0b9da8..c239055be8 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimplePointLightDelegate.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimplePointLightDelegate.h @@ -31,8 +31,7 @@ namespace AZ float GetEffectiveSolidAngle() const override { return PhotometricValue::OmnidirectionalSteradians; } private: - virtual void HandleShapeChanged(); - + void HandleShapeChanged() override; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimpleSpotLightDelegate.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimpleSpotLightDelegate.h index 6b2b9bf4bb..7f9c4abc0f 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimpleSpotLightDelegate.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SimpleSpotLightDelegate.h @@ -34,7 +34,7 @@ namespace AZ void SetShutterAngles(float innerAngleDegrees, float outerAngleDegrees) override; private: - virtual void HandleShapeChanged(); + void HandleShapeChanged() override; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h index 2c7cc78979..6b0731fbf7 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Mesh/MeshComponentController.h @@ -30,9 +30,6 @@ namespace AZ { namespace Render { - - - //! A configuration structure for the MeshComponentController class MeshComponentConfig final : public AZ::ComponentConfig @@ -107,14 +104,14 @@ namespace AZ void SetLodType(RPI::Cullable::LodType lodType) override; RPI::Cullable::LodType GetLodType() const override; - virtual void SetLodOverride(RPI::Cullable::LodOverride lodOverride); - virtual RPI::Cullable::LodOverride GetLodOverride() const; + void SetLodOverride(RPI::Cullable::LodOverride lodOverride) override; + RPI::Cullable::LodOverride GetLodOverride() const override; - virtual void SetMinimumScreenCoverage(float minimumScreenCoverage); - virtual float GetMinimumScreenCoverage() const; + void SetMinimumScreenCoverage(float minimumScreenCoverage) override; + float GetMinimumScreenCoverage() const override; - virtual void SetQualityDecayRate(float qualityDecayRate); - virtual float GetQualityDecayRate() const; + void SetQualityDecayRate(float qualityDecayRate) override; + float GetQualityDecayRate() const override; void SetVisibility(bool visible) override; bool GetVisibility() const override; @@ -130,7 +127,7 @@ namespace AZ void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; // MaterialReceiverRequestBus::Handler overrides ... - virtual MaterialAssignmentId FindMaterialAssignmentId( + MaterialAssignmentId FindMaterialAssignmentId( const MaterialAssignmentLodIndex lod, const AZStd::string& label) const override; RPI::ModelMaterialSlotMap GetModelMaterialSlots() const override; MaterialAssignmentMap GetMaterialAssignments() const override; diff --git a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h index a74cc46e65..5ddab8bc61 100644 --- a/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h +++ b/Gems/AtomLyIntegration/EMotionFXAtom/Code/Source/AtomActorInstance.h @@ -88,7 +88,7 @@ namespace AZ void UpdateBounds() override; void DebugDraw(const DebugOptions& debugOptions) override; void SetMaterials(const EMotionFX::Integration::ActorAsset::MaterialList& materialPerLOD) override { AZ_UNUSED(materialPerLOD); }; - void SetSkinningMethod(EMotionFX::Integration::SkinningMethod emfxSkinningMethod); + void SetSkinningMethod(EMotionFX::Integration::SkinningMethod emfxSkinningMethod) override; SkinningMethod GetAtomSkinningMethod() const; void SetIsVisible(bool isVisible) override; @@ -120,7 +120,7 @@ namespace AZ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MaterialReceiverRequestBus::Handler overrides... - virtual MaterialAssignmentId FindMaterialAssignmentId( + MaterialAssignmentId FindMaterialAssignmentId( const MaterialAssignmentLodIndex lod, const AZStd::string& label) const override; RPI::ModelMaterialSlotMap GetModelMaterialSlots() const override; MaterialAssignmentMap GetMaterialAssignments() const override; From b8d0bffdd04998092cd955c6447ea81452b3ced1 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:16:39 -0700 Subject: [PATCH 250/355] Gems/AudioSystem Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/AudioSystem/Code/Source/Editor/ATLControlsPanel.h | 4 ++-- .../Code/Source/Editor/ATLControlsResourceDialog.h | 2 +- .../Code/Source/Editor/AudioControlsEditorWindow.h | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Gems/AudioSystem/Code/Source/Editor/ATLControlsPanel.h b/Gems/AudioSystem/Code/Source/Editor/ATLControlsPanel.h index 1bb6cef3de..3942a6b18a 100644 --- a/Gems/AudioSystem/Code/Source/Editor/ATLControlsPanel.h +++ b/Gems/AudioSystem/Code/Source/Editor/ATLControlsPanel.h @@ -73,11 +73,11 @@ namespace AudioControls void HandleExternalDropEvent(QDropEvent* pDropEvent); // ------------- IATLControlModelListener ---------------- - virtual void OnControlAdded(CATLControl* pControl) override; + void OnControlAdded(CATLControl* pControl) override; // ------------------------------------------------------- // ------------------ QWidget ---------------------------- - bool eventFilter(QObject* pObject, QEvent* pEvent); + bool eventFilter(QObject* pObject, QEvent* pEvent) override; // ------------------------------------------------------- private slots: diff --git a/Gems/AudioSystem/Code/Source/Editor/ATLControlsResourceDialog.h b/Gems/AudioSystem/Code/Source/Editor/ATLControlsResourceDialog.h index 10186f9c74..daa8c195c3 100644 --- a/Gems/AudioSystem/Code/Source/Editor/ATLControlsResourceDialog.h +++ b/Gems/AudioSystem/Code/Source/Editor/ATLControlsResourceDialog.h @@ -63,7 +63,7 @@ namespace AudioControls QString GetWindowTitle(EACEControlType type) const; // ------------------ QWidget ---------------------------- - bool eventFilter(QObject* pObject, QEvent* pEvent); + bool eventFilter(QObject* pObject, QEvent* pEvent) override; // ------------------------------------------------------- // Filtering diff --git a/Gems/AudioSystem/Code/Source/Editor/AudioControlsEditorWindow.h b/Gems/AudioSystem/Code/Source/Editor/AudioControlsEditorWindow.h index bfa08828ac..abe5fd4511 100644 --- a/Gems/AudioSystem/Code/Source/Editor/AudioControlsEditorWindow.h +++ b/Gems/AudioSystem/Code/Source/Editor/AudioControlsEditorWindow.h @@ -63,8 +63,8 @@ namespace AudioControls void Update(); protected: - void keyPressEvent(QKeyEvent* pEvent); - void closeEvent(QCloseEvent* pEvent); + void keyPressEvent(QKeyEvent* pEvent) override; + void closeEvent(QCloseEvent* pEvent) override; private: void UpdateAudioSystemData(); From 48652dcac7c38d55539e30cdf0e518f90130dc3b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:17:50 -0700 Subject: [PATCH 251/355] Gems/EditorPythonBindings Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp b/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp index 78ac2a0a45..9940a01b7a 100644 --- a/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp +++ b/Gems/EditorPythonBindings/Code/Tests/PythonAssetTypesTests.cpp @@ -116,7 +116,7 @@ namespace UnitTest return AZ::Data::AssetType("{7FD86523-3903-4037-BCD1-542027BFC553}"); } - virtual const char* GetFileFilter() const + const char* GetFileFilter() const override { return nullptr; } From 0800e95aa77b19ebf4294a4459d618f9708a1de3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:18:05 -0700 Subject: [PATCH 252/355] Gems/EMotionFX Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../EMStudioSDK/Source/MainWindow.h | 2 +- .../Source/RenderPlugin/RenderPlugin.h | 2 +- .../Source/RenderPlugin/RenderWidget.h | 4 ++-- .../Source/OpenGLRender/GLWidget.h | 18 +++++++++--------- .../Source/OpenGLRender/OpenGLRenderPlugin.h | 6 +++--- .../Source/AnimGraph/AnimGraphItemDelegate.h | 2 +- .../Source/AnimGraph/AttributesWindow.h | 2 +- .../Source/AnimGraph/BlendTreeVisualNode.h | 4 ++-- .../Source/TimeView/TrackHeaderWidget.h | 4 ++-- .../Integration/System/SystemComponent.h | 2 +- .../Tests/AnimGraphTransitionCommandTests.cpp | 4 ++-- .../Code/Tests/MotionEventTrackTests.cpp | 2 +- 12 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.h index 318838b2b1..a11f11c6a8 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/MainWindow.h @@ -290,7 +290,7 @@ namespace EMStudio /// CommandManagerCallback implementation void OnPreExecuteCommand(MCore::CommandGroup* group, MCore::Command* command, const MCore::CommandLine& commandLine) override; void OnPostExecuteCommand(MCore::CommandGroup* /*group*/, MCore::Command* /*command*/, const MCore::CommandLine& /*commandLine*/, bool /*wasSuccess*/, const AZStd::string& /*outResult*/) override { } - void OnPreUndoCommand(MCore::Command* command, const MCore::CommandLine& commandLine); + void OnPreUndoCommand(MCore::Command* command, const MCore::CommandLine& commandLine) override; void OnPreExecuteCommandGroup(MCore::CommandGroup* /*group*/, bool /*undo*/) override { } void OnPostExecuteCommandGroup(MCore::CommandGroup* /*group*/, bool /*wasSuccess*/) override { } void OnAddCommandToHistory(size_t /*historyIndex*/, MCore::CommandGroup* /*group*/, MCore::Command* /*command*/, const MCore::CommandLine& /*commandLine*/) override { } diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderPlugin.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderPlugin.h index 01678e024d..6e4a68fa6f 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderPlugin.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderPlugin.h @@ -95,7 +95,7 @@ namespace EMStudio virtual bool CreateEMStudioActor(EMotionFX::Actor* actor) = 0; // SkeletonOutlinerNotificationBus - void ZoomToJoints(EMotionFX::ActorInstance* actorInstance, const AZStd::vector& joints); + void ZoomToJoints(EMotionFX::ActorInstance* actorInstance, const AZStd::vector& joints) override; // ActorNotificationBus void OnActorReady(EMotionFX::Actor* actor) override; diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderWidget.h index d4906355da..01644362de 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/EMStudioSDK/Source/RenderPlugin/RenderWidget.h @@ -81,8 +81,8 @@ namespace EMStudio // overloaded const AZStd::vector GetHandledEventTypes() const override { return { EMotionFX::EVENT_TYPE_ON_DRAW_LINE, EMotionFX::EVENT_TYPE_ON_DRAW_TRIANGLE, EMotionFX::EVENT_TYPE_ON_DRAW_TRIANGLES }; } - MCORE_INLINE void OnDrawTriangle(const AZ::Vector3& posA, const AZ::Vector3& posB, const AZ::Vector3& posC, const AZ::Vector3& normalA, const AZ::Vector3& normalB, const AZ::Vector3& normalC, uint32 color) { m_widget->AddTriangle(posA, posB, posC, normalA, normalB, normalC, color); } - MCORE_INLINE void OnDrawTriangles() { m_widget->RenderTriangles(); } + MCORE_INLINE void OnDrawTriangle(const AZ::Vector3& posA, const AZ::Vector3& posB, const AZ::Vector3& posC, const AZ::Vector3& normalA, const AZ::Vector3& normalB, const AZ::Vector3& normalC, uint32 color) override { m_widget->AddTriangle(posA, posB, posC, normalA, normalB, normalC, color); } + MCORE_INLINE void OnDrawTriangles() override { m_widget->RenderTriangles(); } private: RenderWidget* m_widget; diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/GLWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/GLWidget.h index 685ff4ef88..f821a7710e 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/GLWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/GLWidget.h @@ -53,7 +53,7 @@ namespace EMStudio void initializeGL() override; void paintGL() override; - void resizeGL(int width, int height); + void resizeGL(int width, int height) override; private slots: void CloneSelectedActorInstances() { CommandSystem::CloneSelectedActorInstances(); } @@ -64,16 +64,16 @@ namespace EMStudio void ResetToBindPose() { CommandSystem::ResetToBindPose(); } protected: - void mouseMoveEvent(QMouseEvent* event) { RenderWidget::OnMouseMoveEvent(this, event); } - void mousePressEvent(QMouseEvent* event) { RenderWidget::OnMousePressEvent(this, event); } - void mouseReleaseEvent(QMouseEvent* event) { RenderWidget::OnMouseReleaseEvent(this, event); } - void wheelEvent(QWheelEvent* event) { RenderWidget::OnWheelEvent(this, event); } + void mouseMoveEvent(QMouseEvent* event) override { RenderWidget::OnMouseMoveEvent(this, event); } + void mousePressEvent(QMouseEvent* event) override { RenderWidget::OnMousePressEvent(this, event); } + void mouseReleaseEvent(QMouseEvent* event) override { RenderWidget::OnMouseReleaseEvent(this, event); } + void wheelEvent(QWheelEvent* event) override { RenderWidget::OnWheelEvent(this, event); } - void focusInEvent(QFocusEvent* event); - void focusOutEvent(QFocusEvent* event); + void focusInEvent(QFocusEvent* event) override; + void focusOutEvent(QFocusEvent* event) override; - void Render(); - void Update() { update(); } + void Render() override; + void Update() override { update(); } void RenderBorder(const MCore::RGBAColor& color); RenderGL::GBuffer m_gBuffer; diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/OpenGLRenderPlugin.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/OpenGLRenderPlugin.h index 1203d7e381..ba2bb0f462 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/OpenGLRenderPlugin.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/RenderPlugins/Source/OpenGLRender/OpenGLRenderPlugin.h @@ -43,8 +43,8 @@ namespace EMStudio bool GetIsVertical() const override { return false; } // overloaded main init function - bool Init(); - EMStudioPlugin* Clone() { return new OpenGLRenderPlugin(); } + bool Init() override; + EMStudioPlugin* Clone() override { return new OpenGLRenderPlugin(); } // overloaded functions void CreateRenderWidget(RenderViewWidget* renderViewWidget, RenderWidget** outRenderWidget, QWidget** outWidget) override; @@ -57,7 +57,7 @@ namespace EMStudio RenderGL::GraphicsManager* m_graphicsManager; // shared OpenGL engine object // overloaded emstudio actor create function which creates an OpenGL render actor internally - bool CreateEMStudioActor(EMotionFX::Actor* actor); + bool CreateEMStudioActor(EMotionFX::Actor* actor) override; void RenderActorInstance(EMotionFX::ActorInstance* actorInstance, float timePassedInSeconds) override; }; diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.h index 4066601cf5..c2c7499727 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AnimGraphItemDelegate.h @@ -28,7 +28,7 @@ namespace EMStudio void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; - void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const; + void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const override; signals: void linkActivated(const QString& link); diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AttributesWindow.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AttributesWindow.h index 38bceb4426..b19304b898 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AttributesWindow.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/AttributesWindow.h @@ -152,7 +152,7 @@ namespace EMStudio void OnDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector& roles); private: AddConditionButton* m_addConditionButton = nullptr; - void contextMenuEvent(QContextMenuEvent* event); + void contextMenuEvent(QContextMenuEvent* event) override; void PasteTransition(bool pasteTransitionProperties, bool pasteConditions); diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendTreeVisualNode.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendTreeVisualNode.h index a72985cae6..ef87fc9a00 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendTreeVisualNode.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/BlendTreeVisualNode.h @@ -34,11 +34,11 @@ namespace EMStudio ~BlendTreeVisualNode(); void Sync() override; - uint32 GetType() const { return BlendTreeVisualNode::TYPE_ID; } + uint32 GetType() const override { return BlendTreeVisualNode::TYPE_ID; } void Render(QPainter& painter, QPen* pen, bool renderShadow) override; - int32 CalcRequiredHeight() const; + int32 CalcRequiredHeight() const override; private: QColor GetPortColor(const EMotionFX::AnimGraphNode::Port& port) const; diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TrackHeaderWidget.h b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TrackHeaderWidget.h index b794f248f6..2839e52e11 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TrackHeaderWidget.h +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/TimeView/TrackHeaderWidget.h @@ -70,8 +70,8 @@ namespace EMStudio void NameEdited(const QString& text); void EnabledCheckBoxChanged(int state); - void keyPressEvent(QKeyEvent* event); - void keyReleaseEvent(QKeyEvent* event); + void keyPressEvent(QKeyEvent* event) override; + void keyReleaseEvent(QKeyEvent* event) override; }; /** diff --git a/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.h b/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.h index 7d0c3f4725..a716f0aa9b 100644 --- a/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.h +++ b/Gems/EMotionFX/Code/Source/Integration/System/SystemComponent.h @@ -110,7 +110,7 @@ namespace EMotionFX #if defined (EMOTIONFXANIMATION_EDITOR) void UpdateAnimationEditorPlugins(float delta); void NotifyRegisterViews() override; - bool IsSystemActive(EditorAnimationSystemRequests::AnimationSystem systemType); + bool IsSystemActive(EditorAnimationSystemRequests::AnimationSystem systemType) override; ////////////////////////////////////////////////////////////////////////////////////// // AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler diff --git a/Gems/EMotionFX/Code/Tests/AnimGraphTransitionCommandTests.cpp b/Gems/EMotionFX/Code/Tests/AnimGraphTransitionCommandTests.cpp index 49d53f1f91..bb13744b46 100644 --- a/Gems/EMotionFX/Code/Tests/AnimGraphTransitionCommandTests.cpp +++ b/Gems/EMotionFX/Code/Tests/AnimGraphTransitionCommandTests.cpp @@ -62,14 +62,14 @@ namespace EMotionFX m_motionNodeAnimGraph->InitAfterLoading(); } - void SetUp() + void SetUp() override { AnimGraphFixture::SetUp(); m_animGraphInstance->Destroy(); m_animGraphInstance = m_motionNodeAnimGraph->GetAnimGraphInstance(m_actorInstance, m_motionSet); } - void TearDown() + void TearDown() override { AnimGraphFixture::TearDown(); } diff --git a/Gems/EMotionFX/Code/Tests/MotionEventTrackTests.cpp b/Gems/EMotionFX/Code/Tests/MotionEventTrackTests.cpp index 30ab36e35a..08d67b8bee 100644 --- a/Gems/EMotionFX/Code/Tests/MotionEventTrackTests.cpp +++ b/Gems/EMotionFX/Code/Tests/MotionEventTrackTests.cpp @@ -122,7 +122,7 @@ namespace EMotionFX { } - virtual const AZStd::vector GetHandledEventTypes() const + const AZStd::vector GetHandledEventTypes() const override { return { EVENT_TYPE_ON_EVENT }; } From 545beaab7d7489a41a240d57c1255e9d3b749824 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:18:22 -0700 Subject: [PATCH 253/355] Gems/GameStateSamples Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/GameStateSamples/Code/Source/GameStateSamplesModule.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/GameStateSamples/Code/Source/GameStateSamplesModule.cpp b/Gems/GameStateSamples/Code/Source/GameStateSamplesModule.cpp index f175619bf4..a83a5abdd1 100644 --- a/Gems/GameStateSamples/Code/Source/GameStateSamplesModule.cpp +++ b/Gems/GameStateSamples/Code/Source/GameStateSamplesModule.cpp @@ -84,7 +84,7 @@ namespace GameStateSamples } protected: - void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& systemInitParams) + void OnCrySystemInitialized(ISystem& system, const SSystemInitParams& systemInitParams) override { CryHooksModule::OnCrySystemInitialized(system, systemInitParams); From 35a7ad612b1943474e40eb426adddfdea038666d Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:18:37 -0700 Subject: [PATCH 254/355] Gems/GradientSignal Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../GradientSignal/Editor/EditorGradientComponentBase.h | 2 +- .../GradientSignal/Code/Source/UI/GradientPreviewDataWidget.h | 2 +- Gems/GradientSignal/Code/Tests/GradientSignalTestMocks.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gems/GradientSignal/Code/Include/GradientSignal/Editor/EditorGradientComponentBase.h b/Gems/GradientSignal/Code/Include/GradientSignal/Editor/EditorGradientComponentBase.h index 1eac48a109..2083837934 100644 --- a/Gems/GradientSignal/Code/Include/GradientSignal/Editor/EditorGradientComponentBase.h +++ b/Gems/GradientSignal/Code/Include/GradientSignal/Editor/EditorGradientComponentBase.h @@ -92,7 +92,7 @@ namespace GradientSignal using BaseClassType::m_component; using BaseClassType::m_configuration; - virtual AZ::u32 ConfigurationChanged(); + AZ::u32 ConfigurationChanged() override; // This is used by the preview so we can pass an invalid entity Id if our component is disabled AZ::EntityId GetGradientEntityId() const; diff --git a/Gems/GradientSignal/Code/Source/UI/GradientPreviewDataWidget.h b/Gems/GradientSignal/Code/Source/UI/GradientPreviewDataWidget.h index 3aa5987924..7fc3a53463 100644 --- a/Gems/GradientSignal/Code/Source/UI/GradientPreviewDataWidget.h +++ b/Gems/GradientSignal/Code/Source/UI/GradientPreviewDataWidget.h @@ -66,7 +66,7 @@ namespace GradientSignal AZ::u32 GetHandlerName() const override; bool ReadValueIntoGUI(size_t index, GradientPreviewDataWidget* GUI, void* value, const AZ::Uuid& propertyType) override; - void ConsumeAttribute(GradientPreviewDataWidget* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName); + void ConsumeAttribute(GradientPreviewDataWidget* GUI, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override; QWidget* CreateGUI(QWidget* pParent) override; void PreventRefresh(QWidget* widget, bool shouldPrevent) override; diff --git a/Gems/GradientSignal/Code/Tests/GradientSignalTestMocks.h b/Gems/GradientSignal/Code/Tests/GradientSignalTestMocks.h index cf3843ce4a..9c0d8be588 100644 --- a/Gems/GradientSignal/Code/Tests/GradientSignalTestMocks.h +++ b/Gems/GradientSignal/Code/Tests/GradientSignalTestMocks.h @@ -174,8 +174,8 @@ namespace UnitTest } AZ::EntityId GetPreviewEntity() const override { return m_id; } - virtual AZ::Aabb GetPreviewBounds() const { return m_previewBounds; } - virtual bool GetConstrainToShape() const { return m_constrainToShape; } + AZ::Aabb GetPreviewBounds() const override { return m_previewBounds; } + bool GetConstrainToShape() const override { return m_constrainToShape; } protected: AZ::EntityId m_id; From fa1d1bd2fc4ba1cd7183d66d9849dcba1092d04b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:19:06 -0700 Subject: [PATCH 255/355] Gems/GraphCanvas Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Include/GraphCanvas/Widgets/RootGraphicsItem.h | 10 +++++----- .../BookmarkAnchor/BookmarkAnchorVisualComponent.h | 2 +- .../Connections/ConnectionLayerControllerComponent.h | 2 +- .../Code/Source/Components/GeometryComponent.h | 2 +- .../NodePropertyDisplays/StringNodePropertyDisplay.h | 2 +- .../NodePropertyDisplays/VectorNodePropertyDisplay.h | 2 +- .../Nodes/Comment/CommentNodeFrameComponent.h | 2 +- .../Nodes/Comment/CommentNodeLayoutComponent.h | 8 ++++---- .../Nodes/Comment/CommentNodeTextComponent.h | 2 +- .../Nodes/Comment/CommentTextGraphicsWidget.h | 2 +- .../Nodes/General/GeneralNodeFrameComponent.h | 2 +- .../Nodes/General/GeneralSlotLayoutComponent.h | 4 ++-- .../Nodes/Group/CollapsedNodeGroupComponent.h | 4 ++-- .../Components/Nodes/Group/NodeGroupFrameComponent.h | 10 +++++----- .../Components/Nodes/Group/NodeGroupLayoutComponent.h | 8 ++++---- .../Code/Source/Components/Nodes/NodeComponent.h | 2 +- .../Nodes/Wrapper/WrapperNodeLayoutComponent.h | 6 +++--- .../Source/Components/Slots/Data/DataSlotComponent.h | 6 +++--- .../Slots/Default/DefaultSlotLayoutComponent.h | 2 +- .../Slots/Execution/ExecutionSlotLayoutComponent.h | 8 ++++---- .../Components/Slots/Extender/ExtenderSlotComponent.h | 6 +++--- .../Slots/Extender/ExtenderSlotLayoutComponent.h | 8 ++++---- .../Components/Slots/Property/PropertySlotComponent.h | 8 ++++---- .../Slots/Property/PropertySlotLayoutComponent.h | 2 +- .../Code/Source/Components/Slots/SlotComponent.h | 2 +- .../Code/Source/Components/Slots/SlotLayoutComponent.h | 8 ++++---- .../Code/Source/Components/Slots/SlotLayoutItem.h | 4 ++-- .../Code/Source/Widgets/NodePropertyDisplayWidget.h | 4 ++-- .../GraphCanvas/Components/GraphCanvasPropertyBus.h | 8 ++++---- .../GraphicsItems/GlowOutlineGraphicsItem.h | 4 ++-- .../GraphCanvas/Styling/SelectorImplementations.h | 2 +- .../Code/StaticLib/GraphCanvas/Styling/Style.cpp | 8 ++++---- .../GraphCanvas/Types/SceneMemberComponentSaveData.h | 2 +- .../StateControllers/PrioritizedStateController.h | 4 ++-- .../Utils/StateControllers/StackStateController.h | 4 ++-- .../GraphCanvas/Widgets/Bookmarks/BookmarkDockWidget.h | 2 +- .../GraphCanvas/Widgets/Bookmarks/BookmarkTableModel.h | 4 ++-- .../GraphCanvas/Widgets/ComboBox/ComboBoxItemModels.h | 4 ++-- .../GraphCanvasGraphicsView/GraphCanvasGraphicsView.h | 4 ++-- .../TreeItems/IconDecoratedNodePaletteTreeItem.h | 4 ++-- .../NodePalette/TreeItems/NodePaletteTreeItem.h | 2 +- 41 files changed, 90 insertions(+), 90 deletions(-) diff --git a/Gems/GraphCanvas/Code/Include/GraphCanvas/Widgets/RootGraphicsItem.h b/Gems/GraphCanvas/Code/Include/GraphCanvas/Widgets/RootGraphicsItem.h index cd7283c53c..e7c884da92 100644 --- a/Gems/GraphCanvas/Code/Include/GraphCanvas/Widgets/RootGraphicsItem.h +++ b/Gems/GraphCanvas/Code/Include/GraphCanvas/Widgets/RootGraphicsItem.h @@ -163,14 +163,14 @@ namespace GraphCanvas } // StateController - void OnStateChanged([[maybe_unused]] const RootGraphicsItemDisplayState& displayState) + void OnStateChanged([[maybe_unused]] const RootGraphicsItemDisplayState& displayState) override { UpdateActualDisplayState(); } //// // TickBus - void OnTick(float delta, AZ::ScriptTimePoint) + void OnTick(float delta, AZ::ScriptTimePoint) override { m_currentAnimationTime += delta; @@ -191,7 +191,7 @@ namespace GraphCanvas //// // RootGraphicsItemRequestBus - void AnimatePositionTo(const QPointF& scenePoint, const AZStd::chrono::milliseconds& duration) + void AnimatePositionTo(const QPointF& scenePoint, const AZStd::chrono::milliseconds& duration) override { if (!IsAnimating()) { @@ -231,7 +231,7 @@ namespace GraphCanvas GeometryRequestBus::Event(GetEntityId(), &GeometryRequests::SetAnimationTarget, m_targetPoint); } - void CancelAnimation() + void CancelAnimation() override { m_currentAnimationTime = m_animationDuration; CleanUpAnimation(); @@ -315,7 +315,7 @@ namespace GraphCanvas } } - RootGraphicsItemEnabledState GetEnabledState() const + RootGraphicsItemEnabledState GetEnabledState() const override { return m_enabledState; } diff --git a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h index 2e2d9b9ab0..7e7ac6489f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/BookmarkAnchor/BookmarkAnchorVisualComponent.h @@ -57,7 +57,7 @@ namespace GraphCanvas //// // StyleNotificationBus - void OnStyleChanged(); + void OnStyleChanged() override; //// // GeometryNotificationBus diff --git a/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h b/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h index f991409b17..2532492d64 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Connections/ConnectionLayerControllerComponent.h @@ -39,7 +39,7 @@ namespace GraphCanvas //// // LayerControllerNotificationBus - void OnOffsetsChanged(int selectionOffset, int groupOffset); + void OnOffsetsChanged(int selectionOffset, int groupOffset) override; //// private: diff --git a/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.h b/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.h index 1c7bf39445..61b66bcbf9 100644 --- a/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/GeometryComponent.h @@ -69,7 +69,7 @@ namespace GraphCanvas void SetIsPositionAnimating(bool animating) override; - void SetAnimationTarget(const AZ::Vector2& targetPoint); + void SetAnimationTarget(const AZ::Vector2& targetPoint) override; //// // VisualNotificationBus diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/StringNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/StringNodePropertyDisplay.h index ac179832d3..1e50262194 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/StringNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/StringNodePropertyDisplay.h @@ -81,7 +81,7 @@ namespace GraphCanvas //// // AZ::SystemTickBus::Handler - void OnSystemTick(); + void OnSystemTick() override; //// private: diff --git a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h index e0c50821a8..9c12dae08e 100644 --- a/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h +++ b/Gems/GraphCanvas/Code/Source/Components/NodePropertyDisplays/VectorNodePropertyDisplay.h @@ -95,7 +95,7 @@ namespace GraphCanvas //// // DataSlotNotifications - void OnDragDropStateStateChanged(const DragDropState& dragState); + void OnDragDropStateStateChanged(const DragDropState& dragState) override; //// private: diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h index 0c85f366ed..9baeccb78f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeFrameComponent.h @@ -65,7 +65,7 @@ namespace GraphCanvas //// // NodeNotifications - void OnNodeActivated(); + void OnNodeActivated() override; //// private: diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h index 057261743f..8e2692ce0e 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeLayoutComponent.h @@ -50,9 +50,9 @@ namespace GraphCanvas required.push_back(AZ_CRC("GraphCanvas_StyledGraphicItemService", 0xeae4cdf4)); } - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // EntityBus @@ -64,7 +64,7 @@ namespace GraphCanvas //// // NodeNotification - void OnNodeActivated(); + void OnNodeActivated() override; //// protected: diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeTextComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeTextComponent.h index 36ddfeafe5..fa047d56a2 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeTextComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentNodeTextComponent.h @@ -82,7 +82,7 @@ namespace GraphCanvas //// // NodeNotification - void OnAddedToScene(const AZ::EntityId&); + void OnAddedToScene(const AZ::EntityId&) override; //// // CommentRequestBus diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h index 1f6a4ce9a7..390fb1ef9e 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Comment/CommentTextGraphicsWidget.h @@ -163,7 +163,7 @@ namespace GraphCanvas void SubmitValue(); void UpdateSizePolicies(); - bool sceneEventFilter(QGraphicsItem*, QEvent* event); + bool sceneEventFilter(QGraphicsItem*, QEvent* event) override; const AZ::EntityId& GetEntityId() const { return m_entityId; } void SetupProxyWidget(); diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h index f38157e82e..123f21f13d 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralNodeFrameComponent.h @@ -68,7 +68,7 @@ namespace GraphCanvas //// // NodeNotifications - void OnNodeActivated(); + void OnNodeActivated() override; void OnNodeWrapped(const AZ::EntityId& wrappingNode) override; void OnNodeUnwrapped(const AZ::EntityId& wrappingNode) override; diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h index c9290021c9..397aea5a38 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/General/GeneralSlotLayoutComponent.h @@ -158,7 +158,7 @@ namespace GraphCanvas //// // SceneMemberNotificationBus - void OnSceneSet(const AZ::EntityId& sceneId); + void OnSceneSet(const AZ::EntityId& sceneId) override; //// // SlotLayoutRequestBus @@ -168,7 +168,7 @@ namespace GraphCanvas bool IsSlotGroupVisible(SlotGroup group) const override; void SetSlotGroupVisible(SlotGroup group, bool visible) override; - void ClearSlotGroup(SlotGroup group); + void ClearSlotGroup(SlotGroup group) override; //// // StyleNotificationBus diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/CollapsedNodeGroupComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/CollapsedNodeGroupComponent.h index 17ef858b52..fd9706f7ea 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/CollapsedNodeGroupComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/CollapsedNodeGroupComponent.h @@ -94,7 +94,7 @@ namespace GraphCanvas //// // GeometryNotifications - void OnBoundsChanged(); + void OnBoundsChanged() override; void OnPositionChanged(const AZ::EntityId& targetEntity, const AZ::Vector2& position) override; //// @@ -117,7 +117,7 @@ namespace GraphCanvas AZ::EntityId GetSourceGroup() const override; - AZStd::vector< Endpoint > GetRedirectedEndpoints() const; + AZStd::vector< Endpoint > GetRedirectedEndpoints() const override; void ForceEndpointRedirection(const AZStd::vector< Endpoint >& endpoints) override; //// diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupFrameComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupFrameComponent.h index 4f791d913d..cc54866ccb 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupFrameComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupFrameComponent.h @@ -239,7 +239,7 @@ namespace GraphCanvas //// // SystemTickBus - void OnSystemTick(); + void OnSystemTick() override; //// // VisualNotificationBus @@ -446,13 +446,13 @@ namespace GraphCanvas //// // CommentNotificationBus - void OnEditBegin(); - void OnEditEnd(); + void OnEditBegin() override; + void OnEditEnd() override; void OnCommentSizeChanged(const QSizeF& oldSize, const QSizeF& newSize) override; - void OnCommentFontReloadBegin(); - void OnCommentFontReloadEnd(); + void OnCommentFontReloadBegin() override; + void OnCommentFontReloadEnd() override; //// // QGraphicsItem diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h index ec3bbdda28..5685702051 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Group/NodeGroupLayoutComponent.h @@ -61,13 +61,13 @@ namespace GraphCanvas //// // AZ::Component - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // NodeNotification - void OnNodeActivated(); + void OnNodeActivated() override; //// void UpdateLayoutParameters(); diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeComponent.h index 996ba2e8c9..4e2052555f 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/NodeComponent.h @@ -109,7 +109,7 @@ namespace GraphCanvas void SetTranslationKeyedTooltip(const TranslationKeyedString& tooltip) override; const AZStd::string GetTooltip() const override { return m_configuration.GetTooltip(); } - void SetShowInOutliner(bool showInOutliner) { m_configuration.SetShowInOutliner(showInOutliner); } + void SetShowInOutliner(bool showInOutliner) override { m_configuration.SetShowInOutliner(showInOutliner); } bool ShowInOutliner() const override { return m_configuration.GetShowInOutliner(); } void AddSlot(const AZ::EntityId& slotId) override; diff --git a/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h index 4fa98dbadd..0423f061f6 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Nodes/Wrapper/WrapperNodeLayoutComponent.h @@ -155,9 +155,9 @@ namespace GraphCanvas required.push_back(AZ_CRC("GraphCanvas_StyledGraphicItemService", 0xeae4cdf4)); } - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // WrapperNodeRequestBus diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h index d6c6b71771..fb76c2c80e 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Data/DataSlotComponent.h @@ -29,9 +29,9 @@ namespace GraphCanvas ~DataSlotComponent(); // Component - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // SlotRequestBus diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h index 7d963af0bf..c1b6b5b0ac 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Default/DefaultSlotLayoutComponent.h @@ -43,7 +43,7 @@ namespace GraphCanvas //// // StyleNotificationBus - void OnStyleChanged(); + void OnStyleChanged() override; //// private: diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotLayoutComponent.h index 812bef7187..5df2b9f68c 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Execution/ExecutionSlotLayoutComponent.h @@ -51,7 +51,7 @@ namespace GraphCanvas //// // StyleNotificationBus - void OnStyleChanged(); + void OnStyleChanged() override; //// private: @@ -88,9 +88,9 @@ namespace GraphCanvas ExecutionSlotLayoutComponent(); ~ExecutionSlotLayoutComponent() override = default; - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; private: ExecutionSlotLayout* m_layout; diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h index 5ca93d5c26..b37704156d 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotComponent.h @@ -40,9 +40,9 @@ namespace GraphCanvas ~ExtenderSlotComponent(); // Component - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // SceneMemberNotifications diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h index de8e95d7ff..ed477d40cf 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Extender/ExtenderSlotLayoutComponent.h @@ -53,7 +53,7 @@ namespace GraphCanvas //// // StyleNotificationBus - void OnStyleChanged(); + void OnStyleChanged() override; //// private: @@ -82,9 +82,9 @@ namespace GraphCanvas ExtenderSlotLayoutComponent(); ~ExtenderSlotLayoutComponent() override = default; - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; private: diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotComponent.h index 309e4bb762..65e537458b 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotComponent.h @@ -27,9 +27,9 @@ namespace GraphCanvas ~PropertySlotComponent(); // Component - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // Slot RequestBus @@ -38,7 +38,7 @@ namespace GraphCanvas //// // PropertySlotBus - const AZ::Crc32& GetPropertyId() const; + const AZ::Crc32& GetPropertyId() const override; //// private: diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h index 9b63882ec8..0891f51f06 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/Property/PropertySlotLayoutComponent.h @@ -49,7 +49,7 @@ namespace GraphCanvas // SlotNotificationBus void OnRegisteredToNode(const AZ::EntityId& nodeId) override; - void OnTooltipChanged(const TranslationKeyedString& tooltip); + void OnTooltipChanged(const TranslationKeyedString& tooltip) override; //// // StyleNotificationBus diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h index 319ffd7216..5afa3fbc14 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotComponent.h @@ -72,7 +72,7 @@ namespace GraphCanvas const AZ::EntityId& GetNode() const override; void SetNode(const AZ::EntityId&) override; - Endpoint GetEndpoint() const; + Endpoint GetEndpoint() const override; const AZStd::string GetName() const override { return m_slotConfiguration.m_name.GetDisplayString(); } void SetName(const AZStd::string& name) override; diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutComponent.h b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutComponent.h index 87917cbe29..d73018f40b 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutComponent.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutComponent.h @@ -52,16 +52,16 @@ namespace GraphCanvas required.push_back(AZ_CRC("GraphCanvas_SlotService", 0x701eaf6b)); } - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // VisualRequestBus QGraphicsItem* AsGraphicsItem() override; QGraphicsLayoutItem* AsGraphicsLayoutItem() override; - bool Contains(const AZ::Vector2& position) const; + bool Contains(const AZ::Vector2& position) const override; void SetVisible(bool visible) override; bool IsVisible() const override; //// diff --git a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutItem.h b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutItem.h index ee97284be8..98134a7362 100644 --- a/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutItem.h +++ b/Gems/GraphCanvas/Code/Source/Components/Slots/SlotLayoutItem.h @@ -38,7 +38,7 @@ namespace GraphCanvas protected: // QGraphicsItem - void mousePressEvent(QGraphicsSceneMouseEvent* event) + void mousePressEvent(QGraphicsSceneMouseEvent* event) override { bool result = false; VisualNotificationBus::EventResult(result, GetEntityId(), &VisualNotifications::OnMousePress, GetEntityId(), event); @@ -48,7 +48,7 @@ namespace GraphCanvas } } - void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) + void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override { bool result = false; VisualNotificationBus::EventResult(result, GetEntityId(), &VisualNotifications::OnMouseRelease, GetEntityId(), event); diff --git a/Gems/GraphCanvas/Code/Source/Widgets/NodePropertyDisplayWidget.h b/Gems/GraphCanvas/Code/Source/Widgets/NodePropertyDisplayWidget.h index dbd8a983cf..955ec490d6 100644 --- a/Gems/GraphCanvas/Code/Source/Widgets/NodePropertyDisplayWidget.h +++ b/Gems/GraphCanvas/Code/Source/Widgets/NodePropertyDisplayWidget.h @@ -45,7 +45,7 @@ namespace GraphCanvas //// // RootGraphicsItemNotificationBus - void OnDisplayStateChanged(RootGraphicsItemDisplayState oldState, RootGraphicsItemDisplayState newState); + void OnDisplayStateChanged(RootGraphicsItemDisplayState oldState, RootGraphicsItemDisplayState newState) override; //// // NodePropertiesRequestBus @@ -56,7 +56,7 @@ namespace GraphCanvas //// // NodePropertyRequestBus - void SetDisabled(bool disabled); + void SetDisabled(bool disabled) override; void SetNodePropertyDisplay(NodePropertyDisplay* nodePropertyDisplay) override; NodePropertyDisplay* GetNodePropertyDisplay() const override; diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GraphCanvasPropertyBus.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GraphCanvasPropertyBus.h index 6dda23692b..2a26fc3fe0 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GraphCanvasPropertyBus.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Components/GraphCanvasPropertyBus.h @@ -57,12 +57,12 @@ namespace GraphCanvas GraphCanvasPropertyBus::MultiHandler::BusDisconnect(); } - void AddBusId(const AZ::EntityId& busId) override final + void AddBusId(const AZ::EntityId& busId) final { GraphCanvasPropertyBus::MultiHandler::BusConnect(busId); } - void RemoveBusId(const AZ::EntityId& busId) override final + void RemoveBusId(const AZ::EntityId& busId) final { GraphCanvasPropertyBus::MultiHandler::BusDisconnect(busId); } @@ -86,12 +86,12 @@ namespace GraphCanvas void Init() override {}; - void Activate() + void Activate() override { GraphCanvasPropertyBusHandler::OnActivate(GetEntityId()); } - void Deactivate() + void Deactivate() override { GraphCanvasPropertyBusHandler::OnDeactivate(); } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GlowOutlineGraphicsItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GlowOutlineGraphicsItem.h index d54c34f8f0..05302ee889 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GlowOutlineGraphicsItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/GraphicsItems/GlowOutlineGraphicsItem.h @@ -77,7 +77,7 @@ namespace GraphCanvas //// // SystemTick - void OnSystemTick(); + void OnSystemTick() override; //// // TickBus @@ -86,7 +86,7 @@ namespace GraphCanvas // GeometryNotificationBus::Handler void OnPositionChanged(const AZ::EntityId& /*targetEntity*/, const AZ::Vector2& /*position*/) override; - void OnBoundsChanged(); + void OnBoundsChanged() override; //// // ViewNotificationBus diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/SelectorImplementations.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/SelectorImplementations.h index 86b2cafdc9..1c65bf1915 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/SelectorImplementations.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/SelectorImplementations.h @@ -37,7 +37,7 @@ namespace GraphCanvas return 0; } - bool Matches([[maybe_unused]] const AZ::EntityId& object) const + bool Matches([[maybe_unused]] const AZ::EntityId& object) const override { return false; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.cpp b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.cpp index 166a333d24..048bdf1736 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.cpp +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Styling/Style.cpp @@ -129,7 +129,7 @@ namespace : public AZ::SerializeContext::IDataSerializer { /// Store the class data into a binary buffer - virtual size_t Save(const void* classPtr, AZ::IO::GenericStream& stream, bool isDataBigEndian /*= false*/) + size_t Save(const void* classPtr, AZ::IO::GenericStream& stream, bool isDataBigEndian /*= false*/) override { auto variant = reinterpret_cast(classPtr); @@ -142,7 +142,7 @@ namespace } /// Convert binary data to text - virtual size_t DataToText(AZ::IO::GenericStream& in, AZ::IO::GenericStream& out, bool isDataBigEndian /*= false*/) + size_t DataToText(AZ::IO::GenericStream& in, AZ::IO::GenericStream& out, bool isDataBigEndian /*= false*/) override { (void)isDataBigEndian; @@ -152,7 +152,7 @@ namespace } /// Convert text data to binary, to support loading old version formats. We must respect text version if the text->binary format has changed! - virtual size_t TextToData(const char* text, unsigned int textVersion, AZ::IO::GenericStream& stream, bool isDataBigEndian = false) + size_t TextToData(const char* text, unsigned int textVersion, AZ::IO::GenericStream& stream, bool isDataBigEndian = false) override { (void)textVersion; (void)isDataBigEndian; @@ -164,7 +164,7 @@ namespace } /// Load the class data from a stream. - virtual bool Load(void* classPtr, AZ::IO::GenericStream& in, unsigned int, bool isDataBigEndian = false) + bool Load(void* classPtr, AZ::IO::GenericStream& in, unsigned int, bool isDataBigEndian = false) override { QByteArray buffer = ReadAll(in); QDataStream qtStream(&buffer, QIODevice::ReadOnly); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/SceneMemberComponentSaveData.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/SceneMemberComponentSaveData.h index 4c07c82aef..b30857d71f 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/SceneMemberComponentSaveData.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Types/SceneMemberComponentSaveData.h @@ -43,7 +43,7 @@ namespace GraphCanvas } // SceneMemberNotificationBus::Handler - void OnSceneSet(const AZ::EntityId& graphId) + void OnSceneSet(const AZ::EntityId& graphId) override { const AZ::EntityId* ownerId = SceneMemberNotificationBus::GetCurrentBusId(); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h index 1e31cc6c8a..583e755dfa 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/PrioritizedStateController.h @@ -45,7 +45,7 @@ namespace GraphCanvas m_valueSet.clear(); } - bool HasState() const + bool HasState() const override { return !m_valueSet.empty(); } @@ -85,7 +85,7 @@ namespace GraphCanvas return releasedValue; } - const T& GetCalculatedState() const + const T& GetCalculatedState() const override { auto valueIter = m_valueSet.begin(); return (*valueIter); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h index d77cd43861..948e286f77 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Utils/StateControllers/StackStateController.h @@ -43,7 +43,7 @@ namespace GraphCanvas m_states.clear(); } - bool HasState() const + bool HasState() const override { return !m_states.empty(); } @@ -79,7 +79,7 @@ namespace GraphCanvas return releasedValue; } - const T& GetCalculatedState() const + const T& GetCalculatedState() const override { return m_states.back().second; } diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkDockWidget.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkDockWidget.h index 0326a5e5a0..74207315e1 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkDockWidget.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkDockWidget.h @@ -57,7 +57,7 @@ namespace GraphCanvas //// // GraphCanvas::SceneNotifications - void OnSelectionChanged(); + void OnSelectionChanged() override; //// public Q_SLOTS: diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkTableModel.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkTableModel.h index 2e14011d47..a1c5e15a3b 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkTableModel.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/Bookmarks/BookmarkTableModel.h @@ -79,7 +79,7 @@ namespace GraphCanvas // QAbstractTableModel int rowCount(const QModelIndex& parent = QModelIndex()) const override; - int columnCount(const QModelIndex& index = QModelIndex()) const; + int columnCount(const QModelIndex& index = QModelIndex()) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; @@ -125,7 +125,7 @@ namespace GraphCanvas BookmarkTableSortProxyModel(BookmarkTableSourceModel* sourceModel); ~BookmarkTableSortProxyModel() override = default; - bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const; + bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override; void SetFilter(const QString& filter); void ClearFilter(); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModels.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModels.h index 4eeb98b23a..1f78a109a9 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModels.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/ComboBox/ComboBoxItemModels.h @@ -415,7 +415,7 @@ namespace GraphCanvas return index(nextRow, GetSortColumn()); } - void OnDropDownAboutToShow() + void OnDropDownAboutToShow() override { beginResetModel(); setSourceModel(m_modelInterface->GetDropDownItemModel()); @@ -424,7 +424,7 @@ namespace GraphCanvas invalidate(); } - void OnDropDownHidden() + void OnDropDownHidden() override { beginResetModel(); setSourceModel(nullptr); diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasGraphicsView/GraphCanvasGraphicsView.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasGraphicsView/GraphCanvasGraphicsView.h index 7dd8a01dc3..70b3e16166 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasGraphicsView/GraphCanvasGraphicsView.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/GraphCanvasGraphicsView/GraphCanvasGraphicsView.h @@ -129,7 +129,7 @@ namespace GraphCanvas ToastId ShowToastAtCursor(const ToastConfiguration& toastConfiguration) override; ToastId ShowToastAtPoint(const QPoint& screenPosition, const QPointF& anchorPoint, const ToastConfiguration& toastConfiguration) override; - bool IsShowing() const; + bool IsShowing() const override; //// // TickBus @@ -159,7 +159,7 @@ namespace GraphCanvas void wheelEvent(QWheelEvent* event) override; - void focusOutEvent(QFocusEvent* event); + void focusOutEvent(QFocusEvent* event) override; void resizeEvent(QResizeEvent* event) override; void moveEvent(QMoveEvent* event) override; diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h index b214f00416..cfb4fe477a 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/IconDecoratedNodePaletteTreeItem.h @@ -27,8 +27,8 @@ namespace GraphCanvas void AddIconColorPalette(const AZStd::string& colorPalette); - void OnStylesUnloaded(); - void OnStylesLoaded(); + void OnStylesUnloaded() override; + void OnStylesLoaded() override; protected: diff --git a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h index fdeb20dadf..fcb4d79077 100644 --- a/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h +++ b/Gems/GraphCanvas/Code/StaticLib/GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h @@ -95,7 +95,7 @@ namespace GraphCanvas const EditorId& GetEditorId() const; // Child Overrides - virtual bool LessThan(const GraphCanvasTreeItem* graphItem) const; + bool LessThan(const GraphCanvasTreeItem* graphItem) const override; virtual QVariant OnData(const QModelIndex& index, int role) const; virtual Qt::ItemFlags OnFlags() const; From 32b4958778cdd4d372b9c351712600ecdc3c1f03 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:19:32 -0700 Subject: [PATCH 256/355] Code/Framework/AzToolsFramework Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Core/EditorFrameworkApplication.h | 38 +++++++++---------- .../UI/Outliner/EntityOutlinerListModel.hxx | 2 +- .../PropertyEditor/EntityPropertyEditor.hxx | 8 ++-- .../PropertyEditor/MultiLineTextEditHandler.h | 2 +- .../UI/PropertyEditor/PropertyEditorAPI.h | 4 +- .../ViewportUi/ViewportUiManager.h | 2 +- .../SliceStabilityTestFramework.h | 2 +- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.h index bcd9d23203..99235c420c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/LegacyFramework/Core/EditorFrameworkApplication.h @@ -63,23 +63,23 @@ namespace LegacyFramework // ------------------------------------------------------------------ // implementation of FrameworkApplicationMessages::Handler - virtual bool IsRunningInGUIMode() { return m_desc.m_enableGUI; } - virtual bool RequiresGameProject() { return m_desc.m_enableProjectManager; } - virtual bool ShouldRunAssetProcessor() { return m_desc.m_shouldRunAssetProcessor; } - virtual void* GetMainModule(); - virtual const char* GetApplicationName(); - virtual const char* GetApplicationModule(); - virtual const char* GetApplicationDirectory(); - virtual const AzFramework::CommandLine* GetCommandLineParser(); - virtual void TeardownApplicationComponent(); - virtual void RunAssetProcessor() override; + bool IsRunningInGUIMode() override { return m_desc.m_enableGUI; } + bool RequiresGameProject() override { return m_desc.m_enableProjectManager; } + bool ShouldRunAssetProcessor() override { return m_desc.m_shouldRunAssetProcessor; } + void* GetMainModule() override; + const char* GetApplicationName() override; + const char* GetApplicationModule() override; + const char* GetApplicationDirectory() override; + const AzFramework::CommandLine* GetCommandLineParser() override; + void TeardownApplicationComponent() override; + void RunAssetProcessor() override; // ------------------------------------------------------------------ void SetSettingsRegistrySpecializations(AZ::SettingsRegistryInterface::Specializations& specializations) override; // ------------------------------------------------------------------ // implementation of CoreMessageBus::Handler - virtual void OnProjectSet(const char* /*pathToProject*/); + void OnProjectSet(const char* /*pathToProject*/) override; // ------------------------------------------------------------------ // This is called during the bootstrap and makes all the components we should have for SYSTEM minimal functionality. @@ -114,17 +114,17 @@ namespace LegacyFramework * ComponentApplication::RegisterCoreComponents and then register the application * specific core components. */ - virtual void RegisterCoreComponents(); + void RegisterCoreComponents() override; AZ::Entity* m_ptrSystemEntity; - virtual int GetDesiredExitCode() override { return m_desiredExitCode; } - virtual void SetDesiredExitCode(int code) override { m_desiredExitCode = code; } - virtual bool GetAbortRequested() override { return m_abortRequested; } - virtual void SetAbortRequested() override { m_abortRequested = true; } - virtual AZStd::string GetApplicationGlobalStoragePath() override; - virtual bool IsPrimary() override { return m_isPrimary; } + int GetDesiredExitCode() override { return m_desiredExitCode; } + void SetDesiredExitCode(int code) override { m_desiredExitCode = code; } + bool GetAbortRequested() override { return m_abortRequested; } + void SetAbortRequested() override { m_abortRequested = true; } + AZStd::string GetApplicationGlobalStoragePath() override; + bool IsPrimary() override { return m_isPrimary; } - virtual bool IsAppConfigWritable() override; + bool IsAppConfigWritable() override; AZ::Entity* m_applicationEntity; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx index a6ac859971..25e4276dd4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.hxx @@ -230,7 +230,7 @@ namespace AzToolsFramework bool DropMimeDataAssets(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent); bool CanDropMimeDataAssets(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) const; - QMap itemData(const QModelIndex& index) const; + QMap itemData(const QModelIndex& index) const override; QVariant dataForAll(const QModelIndex& index, int role) const; QVariant dataForName(const QModelIndex& index, int role) const; QVariant dataForVisibility(const QModelIndex& index, int role) const; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx index 3ff69f80e0..83b275b81a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/EntityPropertyEditor.hxx @@ -139,8 +139,8 @@ namespace AzToolsFramework EntityPropertyEditor(QWidget* pParent = NULL, Qt::WindowFlags flags = Qt::WindowFlags(), bool isLevelEntityEditor = false); virtual ~EntityPropertyEditor(); - virtual void BeforeUndoRedo(); - virtual void AfterUndoRedo(); + void BeforeUndoRedo() override; + void AfterUndoRedo() override; static void Reflect(AZ::ReflectContext* context); @@ -249,8 +249,8 @@ namespace AzToolsFramework bool IsEntitySelected(const AZ::EntityId& id) const; bool IsSingleEntitySelected(const AZ::EntityId& id) const; - virtual void GotSceneSourceControlStatus(AzToolsFramework::SourceControlFileInfo& fileInfo); - virtual void PerformActionsBasedOnSceneStatus(bool sceneIsNew, bool readOnly); + void GotSceneSourceControlStatus(AzToolsFramework::SourceControlFileInfo& fileInfo) override; + void PerformActionsBasedOnSceneStatus(bool sceneIsNew, bool readOnly) override; // enable/disable editor void EnableEditor(bool enabled); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h index 88a3d89f9f..c4a8980d29 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/MultiLineTextEditHandler.h @@ -41,7 +41,7 @@ namespace AzToolsFramework QWidget* CreateGUI(QWidget* parent) override; AZ::u32 GetHandlerName() const override; - bool AutoDelete() const; + bool AutoDelete() const override; void ConsumeAttribute(GrowTextEdit* widget, AZ::u32 attrib, AzToolsFramework::PropertyAttributeReader* attrValue, const char* debugName) override; void WriteGUIValuesIntoProperty(size_t index, GrowTextEdit* GUI, property_t& instance, AzToolsFramework::InstanceDataNode* node) override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h index 6d3ccd45bd..f5529eec15 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyEditorAPI.h @@ -130,8 +130,8 @@ namespace AzToolsFramework } QWidget* GetFirstInTabOrder(WidgetType* widget) override { return widget; } - virtual QWidget* GetLastInTabOrder(WidgetType* widget) { return widget; } - virtual void UpdateWidgetInternalTabbing(WidgetType* /*widget*/) { } + QWidget* GetLastInTabOrder(WidgetType* widget) override { return widget; } + void UpdateWidgetInternalTabbing(WidgetType* /*widget*/) override {} QWidget* CreateGUI(QWidget *pParent) override = 0; protected: diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h index 137ee7b2c0..c5ecf7aee6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportUi/ViewportUiManager.h @@ -40,7 +40,7 @@ namespace AzToolsFramework::ViewportUi void RegisterSwitcherEventHandler(SwitcherId switcherId, AZ::Event::Handler& handler) override; void RemoveCluster(ClusterId clusterId) override; void RemoveSwitcher(SwitcherId switcherId) override; - void SetClusterVisible(ClusterId clusterId, bool visible); + void SetClusterVisible(ClusterId clusterId, bool visible) override; void SetSwitcherVisible(SwitcherId switcherId, bool visible); void SetClusterGroupVisible(const AZStd::vector& clusterGroup, bool visible) override; const TextFieldId CreateTextField( diff --git a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.h b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.h index 64dd8636a7..93e86374db 100644 --- a/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.h +++ b/Code/Framework/AzToolsFramework/Tests/SliceStabilityTests/SliceStabilityTestFramework.h @@ -137,7 +137,7 @@ namespace UnitTest void CreateEditorRepresentation(AZ::Entity* entity) override; void BrowseForAssets(AzToolsFramework::AssetBrowser::AssetSelectionModel& selection) override { AZ_UNUSED(selection); } int GetIconTextureIdFromEntityIconPath(const AZStd::string& entityIconPath) override { AZ_UNUSED(entityIconPath); return 0; } - bool DisplayHelpersVisible() { return false; } + bool DisplayHelpersVisible() override { return false; } /* * AssetSystemRequestBus From 287d2a0fe74d972604a7e3cc4b76229ac8b3979b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:19:52 -0700 Subject: [PATCH 257/355] Code/Framework/AzManipulatorTestFramework Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Include/AzManipulatorTestFramework/ViewportInteraction.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index 8b6ea5c59b..1bc329d404 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -40,7 +40,7 @@ namespace AzManipulatorTestFramework // ViewportInteractionRequestBus overrides ... AzFramework::CameraState GetCameraState() override; - AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition); + AzFramework::ScreenPoint ViewportWorldToScreen(const AZ::Vector3& worldPosition) override; AZStd::optional ViewportScreenToWorld(const AzFramework::ScreenPoint& screenPosition, float depth) override; AZStd::optional ViewportScreenToWorldRay( const AzFramework::ScreenPoint& screenPosition) override; From d046389a30ab9696428dc56eb8b9922bbc6ed66a Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:20:14 -0700 Subject: [PATCH 258/355] Code/Tools/AssetProcessor Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Tools/AssetProcessor/AssetBuilder/TraceMessageHook.h | 4 ++-- .../AssetProcessor/native/AssetManager/AssetCatalog.h | 8 ++++---- .../native/resourcecompiler/rcjoblistmodel.h | 2 +- .../assetBuilderSDK/SerializationDependenciesTests.cpp | 2 +- .../native/unittests/AssetRequestHandlerUnitTests.cpp | 4 ++-- .../native/unittests/UtilitiesUnitTests.cpp | 2 +- .../native/utilities/ApplicationManagerBase.h | 2 +- .../AssetProcessor/native/utilities/AssetServerHandler.h | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/Code/Tools/AssetProcessor/AssetBuilder/TraceMessageHook.h b/Code/Tools/AssetProcessor/AssetBuilder/TraceMessageHook.h index 7774816cb2..dcb186b81a 100644 --- a/Code/Tools/AssetProcessor/AssetBuilder/TraceMessageHook.h +++ b/Code/Tools/AssetProcessor/AssetBuilder/TraceMessageHook.h @@ -26,8 +26,8 @@ namespace AssetBuilder void EnableDebugMode(bool enable); bool OnAssert(const char* message) override; - bool OnPreError(const char* window, const char* fileName, int line, const char* func, const char* message); - bool OnPreWarning(const char* window, const char* fileName, int line, const char* func, const char* message); + bool OnPreError(const char* window, const char* fileName, int line, const char* func, const char* message) override; + bool OnPreWarning(const char* window, const char* fileName, int line, const char* func, const char* message) override; bool OnException(const char* message) override; bool OnPrintf(const char* window, const char* message) override; bool OnOutput(const char* window, const char* message) override; diff --git a/Code/Tools/AssetProcessor/native/AssetManager/AssetCatalog.h b/Code/Tools/AssetProcessor/native/AssetManager/AssetCatalog.h index 6d25b654c5..84e96bcf3e 100644 --- a/Code/Tools/AssetProcessor/native/AssetManager/AssetCatalog.h +++ b/Code/Tools/AssetProcessor/native/AssetManager/AssetCatalog.h @@ -122,8 +122,8 @@ namespace AssetProcessor ////////////////////////////////////////////////////////////////////////// // AzToolsFramework::ToolsAssetSystemBus::Handler - void RegisterSourceAssetType(const AZ::Data::AssetType& assetType, const char* assetFileFilter); - void UnregisterSourceAssetType(const AZ::Data::AssetType& assetType); + void RegisterSourceAssetType(const AZ::Data::AssetType& assetType, const char* assetFileFilter) override; + void UnregisterSourceAssetType(const AZ::Data::AssetType& assetType) override; ////////////////////////////////////////////////////////////////////////// //! given some absolute path, please respond with its relative product path. For now, this will be a @@ -163,9 +163,9 @@ namespace AssetProcessor AZ::Outcome, AZStd::string> GetAllProductDependenciesFilter( const AZ::Data::AssetId& id, const AZStd::unordered_set& exclusionList, - const AZStd::vector& wildcardPatternExclusionList); + const AZStd::vector& wildcardPatternExclusionList) override; - bool DoesAssetIdMatchWildcardPattern(const AZ::Data::AssetId& assetId, const AZStd::string& wildcardPattern); + bool DoesAssetIdMatchWildcardPattern(const AZ::Data::AssetId& assetId, const AZStd::string& wildcardPattern) override; void AddAssetDependencies( const AZ::Data::AssetId& searchAssetId, diff --git a/Code/Tools/AssetProcessor/native/resourcecompiler/rcjoblistmodel.h b/Code/Tools/AssetProcessor/native/resourcecompiler/rcjoblistmodel.h index 97a59c90ea..5c055087a8 100644 --- a/Code/Tools/AssetProcessor/native/resourcecompiler/rcjoblistmodel.h +++ b/Code/Tools/AssetProcessor/native/resourcecompiler/rcjoblistmodel.h @@ -67,7 +67,7 @@ namespace AssetProcessor int columnCount(const QModelIndex& parent = QModelIndex()) const override; int rowCount(const QModelIndex& parent = QModelIndex()) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override; - QVariant data(const QModelIndex& index, int role) const; + QVariant data(const QModelIndex& index, int role) const override; void markAsProcessing(RCJob* rcJob); void markAsStarted(RCJob* rcJob); diff --git a/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/SerializationDependenciesTests.cpp b/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/SerializationDependenciesTests.cpp index cb7b1b5c4d..86c363075d 100644 --- a/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/SerializationDependenciesTests.cpp +++ b/Code/Tools/AssetProcessor/native/tests/assetBuilderSDK/SerializationDependenciesTests.cpp @@ -95,7 +95,7 @@ namespace SerializationDependencyTests // Use an arbitrary ID for the asset type. return AZ::Data::AssetType("{03FD33E2-DA2F-4021-A266-0DC9714FF84D}"); } - virtual const char* GetFileFilter() const + const char* GetFileFilter() const override { return nullptr; } diff --git a/Code/Tools/AssetProcessor/native/unittests/AssetRequestHandlerUnitTests.cpp b/Code/Tools/AssetProcessor/native/unittests/AssetRequestHandlerUnitTests.cpp index 010d1cc069..8b0ee56c32 100644 --- a/Code/Tools/AssetProcessor/native/unittests/AssetRequestHandlerUnitTests.cpp +++ b/Code/Tools/AssetProcessor/native/unittests/AssetRequestHandlerUnitTests.cpp @@ -49,13 +49,13 @@ namespace bool m_deleteFenceFileResult = false; protected: - virtual QString CreateFenceFile(unsigned int fenceId) + QString CreateFenceFile(unsigned int fenceId) override { m_numTimesCreateFenceFileCalled++; m_fenceId = fenceId; return m_fenceFileName; } - virtual bool DeleteFenceFile(QString fenceFileName) + bool DeleteFenceFile(QString fenceFileName) override { m_numTimesDeleteFenceFileCalled++; return m_deleteFenceFileResult; diff --git a/Code/Tools/AssetProcessor/native/unittests/UtilitiesUnitTests.cpp b/Code/Tools/AssetProcessor/native/unittests/UtilitiesUnitTests.cpp index bbeafda342..9f2d855811 100644 --- a/Code/Tools/AssetProcessor/native/unittests/UtilitiesUnitTests.cpp +++ b/Code/Tools/AssetProcessor/native/unittests/UtilitiesUnitTests.cpp @@ -543,7 +543,7 @@ public: Q_EMIT UnitTestPassed(); } - bool OnPreAssert(const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) + bool OnPreAssert(const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override { m_assertTriggered = true; return true; diff --git a/Code/Tools/AssetProcessor/native/utilities/ApplicationManagerBase.h b/Code/Tools/AssetProcessor/native/utilities/ApplicationManagerBase.h index 7e6347b4d1..886880df3a 100644 --- a/Code/Tools/AssetProcessor/native/utilities/ApplicationManagerBase.h +++ b/Code/Tools/AssetProcessor/native/utilities/ApplicationManagerBase.h @@ -114,7 +114,7 @@ public: void Rescan(); - bool IsAssetProcessorManagerIdle() const; + bool IsAssetProcessorManagerIdle() const override; bool CheckFullIdle(); Q_SIGNALS: void CheckAssetProcessorManagerIdleState(); diff --git a/Code/Tools/AssetProcessor/native/utilities/AssetServerHandler.h b/Code/Tools/AssetProcessor/native/utilities/AssetServerHandler.h index 840c3e6f5b..04f00e6dff 100644 --- a/Code/Tools/AssetProcessor/native/utilities/AssetServerHandler.h +++ b/Code/Tools/AssetProcessor/native/utilities/AssetServerHandler.h @@ -22,7 +22,7 @@ namespace AssetProcessor virtual ~AssetServerHandler(); ////////////////////////////////////////////////////////////////////////// // AssetServerBus::Handler overrides - bool IsServerAddressValid(); + bool IsServerAddressValid() override; //! StoreJobResult will store all the files in the the temp folder provided by AP to a zip file on the network drive //! whose file name will be based on the server key bool StoreJobResult(const AssetProcessor::BuilderParams& builderParams, AZStd::vector& sourceFileList) override; From 8f0f462f077becb521b47f81368b804ccab70d13 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:20:34 -0700 Subject: [PATCH 259/355] Code/Tools/SceneAPI Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../SceneAPI/SceneCore/Tests/Containers/SceneGraphTests.cpp | 2 +- Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.h | 2 +- Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.h | 4 ++-- Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneGraphTests.cpp b/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneGraphTests.cpp index 87e2cbdbde..f51304c000 100644 --- a/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneGraphTests.cpp +++ b/Code/Tools/SceneAPI/SceneCore/Tests/Containers/SceneGraphTests.cpp @@ -108,7 +108,7 @@ namespace AZ BusDisconnect(); } - bool OnPreAssert(const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) + bool OnPreAssert(const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override { m_assertTriggered = true; return true; diff --git a/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.h b/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.h index c26dc7563e..f5d9239865 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.h +++ b/Code/Tools/SceneAPI/SceneData/Groups/AnimationGroup.h @@ -38,7 +38,7 @@ namespace AZ void OverrideId(const Uuid& id); Containers::RuleContainer& GetRuleContainer() override; - const Containers::RuleContainer& GetRuleContainerConst() const; + const Containers::RuleContainer& GetRuleContainerConst() const override; const AZStd::string& GetSelectedRootBone() const override; uint32_t GetStartFrame() const override; diff --git a/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.h b/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.h index 7c6ed2dc57..3318f89b8d 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.h +++ b/Code/Tools/SceneAPI/SceneData/Groups/SkeletonGroup.h @@ -39,8 +39,8 @@ namespace AZ const Uuid& GetId() const override; void OverrideId(const Uuid& id); - Containers::RuleContainer& GetRuleContainer(); - const Containers::RuleContainer& GetRuleContainerConst() const; + Containers::RuleContainer& GetRuleContainer() override; + const Containers::RuleContainer& GetRuleContainerConst() const override; const AZStd::string& GetSelectedRootBone() const override; void SetSelectedRootBone(const AZStd::string& selectedRootBone) override; diff --git a/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h b/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h index 6708654463..010091e3eb 100644 --- a/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h +++ b/Code/Tools/SceneAPI/SceneData/Groups/SkinGroup.h @@ -46,8 +46,8 @@ namespace AZ const Uuid& GetId() const override; void OverrideId(const Uuid& id); - Containers::RuleContainer& GetRuleContainer(); - const Containers::RuleContainer& GetRuleContainerConst() const; + Containers::RuleContainer& GetRuleContainer() override; + const Containers::RuleContainer& GetRuleContainerConst() const override; DataTypes::ISceneNodeSelectionList& GetSceneNodeSelectionList() override; const DataTypes::ISceneNodeSelectionList& GetSceneNodeSelectionList() const override; From c7a234473853878896f72e92415cc65eb83d0f95 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:21:01 -0700 Subject: [PATCH 260/355] Code/Tools/DeltaCataloger Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Tools/DeltaCataloger/Tests/tests_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Tools/DeltaCataloger/Tests/tests_main.cpp b/Code/Tools/DeltaCataloger/Tests/tests_main.cpp index 34dd6dbddb..1a3b86d34b 100644 --- a/Code/Tools/DeltaCataloger/Tests/tests_main.cpp +++ b/Code/Tools/DeltaCataloger/Tests/tests_main.cpp @@ -84,7 +84,7 @@ protected: } - bool OnPreError([[maybe_unused]] const char* window, [[maybe_unused]] const char* fileName, [[maybe_unused]] int line, [[maybe_unused]] const char* func, [[maybe_unused]] const char* message) + bool OnPreError([[maybe_unused]] const char* window, [[maybe_unused]] const char* fileName, [[maybe_unused]] int line, [[maybe_unused]] const char* func, [[maybe_unused]] const char* message) override { return true; } From a55dfece641b020a067737d9a643e03df6f55b0c Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:21:16 -0700 Subject: [PATCH 261/355] Gems/GraphModel Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Include/GraphModel/Integration/GraphController.h | 6 +++--- Gems/GraphModel/Code/Tests/MockGraphCanvas.h | 6 +++--- Gems/GraphModel/Code/Tests/TestEnvironment.h | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h b/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h index a8051e16e4..3705b91b15 100644 --- a/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h +++ b/Gems/GraphModel/Code/Include/GraphModel/Integration/GraphController.h @@ -78,8 +78,8 @@ namespace GraphModelIntegration GraphModel::NodePtrList GetSelectedNodes() override; void SetSelected(GraphModel::NodePtrList nodes, bool selected) override; void ClearSelection() override; - void EnableNode(GraphModel::NodePtr node); - void DisableNode(GraphModel::NodePtr node); + void EnableNode(GraphModel::NodePtr node) override; + void DisableNode(GraphModel::NodePtr node) override; void CenterOnNodes(GraphModel::NodePtrList nodes) override; AZ::Vector2 GetMajorPitch() const override; @@ -166,7 +166,7 @@ namespace GraphModelIntegration void EnableNodes(const AZStd::unordered_set& nodeIds) override; void DisableNodes(const AZStd::unordered_set& nodeIds) override; - AZStd::string GetDataTypeString(const AZ::Uuid& typeId); + AZStd::string GetDataTypeString(const AZ::Uuid& typeId) override; //! This is where we find all of the graph metadata (like node positions, comments, etc) and store it in the node graph for serialization // CJS TODO: Use this instead of the above undo functions diff --git a/Gems/GraphModel/Code/Tests/MockGraphCanvas.h b/Gems/GraphModel/Code/Tests/MockGraphCanvas.h index e66a47a79c..774e6aab9f 100644 --- a/Gems/GraphModel/Code/Tests/MockGraphCanvas.h +++ b/Gems/GraphModel/Code/Tests/MockGraphCanvas.h @@ -137,8 +137,8 @@ namespace MockGraphCanvasServices ~MockExtenderSlotComponent() = default; // Component overrides ... - void Activate(); - void Deactivate(); + void Activate() override; + void Deactivate() override; //// // ExtenderSlotComponent overrides ... @@ -177,7 +177,7 @@ namespace MockGraphCanvasServices void SetTooltip(const AZStd::string& tooltip) override; void SetTranslationKeyedTooltip(const GraphCanvas::TranslationKeyedString& tooltip) override; const AZStd::string GetTooltip() const override; - void SetShowInOutliner(bool showInOutliner); + void SetShowInOutliner(bool showInOutliner) override; bool ShowInOutliner() const override; void AddSlot(const AZ::EntityId& slotId) override; void RemoveSlot(const AZ::EntityId& slotId) override; diff --git a/Gems/GraphModel/Code/Tests/TestEnvironment.h b/Gems/GraphModel/Code/Tests/TestEnvironment.h index 908a4990e1..a9b2a548f4 100644 --- a/Gems/GraphModel/Code/Tests/TestEnvironment.h +++ b/Gems/GraphModel/Code/Tests/TestEnvironment.h @@ -87,7 +87,7 @@ namespace GraphModelIntegrationTest const char* GetTitle() const override; protected: - void RegisterSlots(); + void RegisterSlots() override; AZStd::shared_ptr m_graphContext = nullptr; }; @@ -108,7 +108,7 @@ namespace GraphModelIntegrationTest const char* GetTitle() const override; protected: - void RegisterSlots(); + void RegisterSlots() override; AZStd::shared_ptr m_graphContext = nullptr; }; @@ -129,7 +129,7 @@ namespace GraphModelIntegrationTest const char* GetTitle() const override; protected: - void RegisterSlots(); + void RegisterSlots() override; AZStd::shared_ptr m_graphContext = nullptr; }; From d92dd162d049af6d3a21b72b5362bc78a7c2dff5 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:21:32 -0700 Subject: [PATCH 262/355] Gems/ImGui Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/ImGui/Code/Source/ImGuiManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gems/ImGui/Code/Source/ImGuiManager.h b/Gems/ImGui/Code/Source/ImGuiManager.h index 52862205a5..c4fa5169f7 100644 --- a/Gems/ImGui/Code/Source/ImGuiManager.h +++ b/Gems/ImGui/Code/Source/ImGuiManager.h @@ -48,8 +48,8 @@ namespace ImGui void SetClientMenuBarState(DisplayState state) override { m_clientMenuBarState = state; } bool IsControllerSupportModeEnabled(ImGuiControllerModeFlags::FlagType controllerMode) const override; void EnableControllerSupportMode(ImGuiControllerModeFlags::FlagType controllerMode, bool enable) override; - void SetControllerMouseSensitivity(float sensitivity) { m_controllerMouseSensitivity = sensitivity; } - float GetControllerMouseSensitivity() const { return m_controllerMouseSensitivity; } + void SetControllerMouseSensitivity(float sensitivity) override { m_controllerMouseSensitivity = sensitivity; } + float GetControllerMouseSensitivity() const override { return m_controllerMouseSensitivity; } bool GetEnableDiscreteInputMode() const override { return m_enableDiscreteInputMode; } void SetEnableDiscreteInputMode(bool enabled) override { m_enableDiscreteInputMode = enabled; } ImGuiResolutionMode GetResolutionMode() const override { return m_resolutionMode; } From a9a295275098651a56a2ff7cbbcd9b337554960c Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:21:46 -0700 Subject: [PATCH 263/355] Gems/LmbrCentral Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Ai/NavigationComponent.h | 8 ++++---- .../Source/Audio/AudioSystemComponent.cpp | 4 ++-- .../EditorRandomTimedSpawnerComponent.h | 2 +- .../Source/Scripting/SimpleStateComponent.cpp | 2 +- .../Builders/CopyDependencyBuilderTest.cpp | 20 +++++++++---------- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h index 17a5183dfe..3c6ce745ca 100644 --- a/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h +++ b/Gems/LmbrCentral/Code/Source/Ai/NavigationComponent.h @@ -168,9 +168,9 @@ namespace LmbrCentral { public: - bool IsPathIntersectingObstacles(const NavigationMeshID /*meshID*/, const Vec3& /*start*/, const Vec3& /*end*/, float /*radius*/) const { return false; } - bool IsPointInsideObstacles(const Vec3& /*position*/) const { return false; } - bool IsLineSegmentIntersectingObstaclesOrCloseToThem(const Lineseg& /*linesegToTest*/, float /*maxDistanceToConsiderClose*/) const { return false; } + bool IsPathIntersectingObstacles(const NavigationMeshID /*meshID*/, const Vec3& /*start*/, const Vec3& /*end*/, float /*radius*/) const override { return false; } + bool IsPointInsideObstacles(const Vec3& /*position*/) const override { return false; } + bool IsLineSegmentIntersectingObstaclesOrCloseToThem(const Lineseg& /*linesegToTest*/, float /*maxDistanceToConsiderClose*/) const override { return false; } }; NullPathObstacles m_pathObstacles; @@ -344,7 +344,7 @@ namespace LmbrCentral bool GetValidPositionNearby(const Vec3&, Vec3&) const override { return false; } bool GetTeleportPosition(Vec3&) const override { return false; } class IPathFollower* GetPathFollower() const override { return nullptr; } - bool IsPointValidForAgent(const Vec3&, AZ::u32) const { return true; }; + bool IsPointValidForAgent(const Vec3&, AZ::u32) const override { return true; }; //// ~IAIPathAgent }; } // namespace LmbrCentral diff --git a/Gems/LmbrCentral/Code/Source/Audio/AudioSystemComponent.cpp b/Gems/LmbrCentral/Code/Source/Audio/AudioSystemComponent.cpp index cd4cff09ae..0c3531902f 100644 --- a/Gems/LmbrCentral/Code/Source/Audio/AudioSystemComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Audio/AudioSystemComponent.cpp @@ -35,12 +35,12 @@ namespace LmbrCentral OnGameUnpaused ); - void OnGamePaused() + void OnGamePaused() override { Call(FN_OnGamePaused); } - void OnGameUnpaused() + void OnGameUnpaused() override { Call(FN_OnGameUnpaused); } diff --git a/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h b/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h index d55463abd8..cc8a1a3a9e 100644 --- a/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h +++ b/Gems/LmbrCentral/Code/Source/Scripting/EditorRandomTimedSpawnerComponent.h @@ -57,7 +57,7 @@ namespace LmbrCentral void SetSpawnDelayVariation(double spawnDelayVariation) override { m_config.m_spawnDelayVariation = spawnDelayVariation; } double GetSpawnDelayVariation() override { return m_config.m_spawnDelayVariation; } - void BuildGameEntity(AZ::Entity* gameEntity); + void BuildGameEntity(AZ::Entity* gameEntity) override; private: //Reflected members diff --git a/Gems/LmbrCentral/Code/Source/Scripting/SimpleStateComponent.cpp b/Gems/LmbrCentral/Code/Source/Scripting/SimpleStateComponent.cpp index ad60e86834..e278f18e8b 100644 --- a/Gems/LmbrCentral/Code/Source/Scripting/SimpleStateComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Scripting/SimpleStateComponent.cpp @@ -29,7 +29,7 @@ namespace LmbrCentral AZ_EBUS_BEHAVIOR_BINDER(BehaviorSimpleStateComponentNotificationBusHandler, "{F935125C-AE4E-48C1-BB60-24A0559BC4D2}", AZ::SystemAllocator, OnStateChanged); - void OnStateChanged(const char* oldState, const char* newState) + void OnStateChanged(const char* oldState, const char* newState) override { Call(FN_OnStateChanged, oldState, newState); } diff --git a/Gems/LmbrCentral/Code/Tests/Builders/CopyDependencyBuilderTest.cpp b/Gems/LmbrCentral/Code/Tests/Builders/CopyDependencyBuilderTest.cpp index 08eb7df669..65847a7fef 100644 --- a/Gems/LmbrCentral/Code/Tests/Builders/CopyDependencyBuilderTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/Builders/CopyDependencyBuilderTest.cpp @@ -213,18 +213,18 @@ namespace UnitTest // AzToolsFramework::AssetSystem::AssetSystemRequestBus::Handler overrides const char* GetAbsoluteDevGameFolderPath() override { return ""; } const char* GetAbsoluteDevRootFolderPath() override { return ""; } - bool GetRelativeProductPathFromFullSourceOrProductPath([[maybe_unused]] const AZStd::string& fullPath, [[maybe_unused]] AZStd::string& relativeProductPath) { return true; } + bool GetRelativeProductPathFromFullSourceOrProductPath([[maybe_unused]] const AZStd::string& fullPath, [[maybe_unused]] AZStd::string& relativeProductPath) override { return true; } bool GenerateRelativeSourcePath( [[maybe_unused]] const AZStd::string& sourcePath, [[maybe_unused]] AZStd::string& relativePath, - [[maybe_unused]] AZStd::string& watchFolder) { return true; } - bool GetFullSourcePathFromRelativeProductPath([[maybe_unused]] const AZStd::string& relPath, [[maybe_unused]] AZStd::string& fullSourcePath) { return true; } - bool GetAssetInfoById([[maybe_unused]] const AZ::Data::AssetId& assetId, [[maybe_unused]] const AZ::Data::AssetType& assetType, [[maybe_unused]] const AZStd::string& platformName, [[maybe_unused]] AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] AZStd::string& rootFilePath) { return true; } - bool GetSourceInfoBySourcePath([[maybe_unused]] const char* sourcePath, [[maybe_unused]] AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] AZStd::string& watchFolder) { return true; } - bool GetSourceInfoBySourceUUID([[maybe_unused]] const AZ::Uuid& sourceUuid, [[maybe_unused]] AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] AZStd::string& watchFolder) { return true; } - bool GetScanFolders([[maybe_unused]] AZStd::vector& scanFolders) { return true; } - bool IsAssetPlatformEnabled([[maybe_unused]] const char* platform) { return true; } - int GetPendingAssetsForPlatform([[maybe_unused]] const char* platform) { return 0; } - bool GetAssetsProducedBySourceUUID([[maybe_unused]] const AZ::Uuid& sourceUuid, [[maybe_unused]] AZStd::vector& productsAssetInfo) { return true; } + [[maybe_unused]] AZStd::string& watchFolder) override { return true; } + bool GetFullSourcePathFromRelativeProductPath([[maybe_unused]] const AZStd::string& relPath, [[maybe_unused]] AZStd::string& fullSourcePath) override { return true; } + bool GetAssetInfoById([[maybe_unused]] const AZ::Data::AssetId& assetId, [[maybe_unused]] const AZ::Data::AssetType& assetType, [[maybe_unused]] const AZStd::string& platformName, [[maybe_unused]] AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] AZStd::string& rootFilePath) override { return true; } + bool GetSourceInfoBySourcePath([[maybe_unused]] const char* sourcePath, [[maybe_unused]] AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] AZStd::string& watchFolder) override { return true; } + bool GetSourceInfoBySourceUUID([[maybe_unused]] const AZ::Uuid& sourceUuid, [[maybe_unused]] AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] AZStd::string& watchFolder) override { return true; } + bool GetScanFolders([[maybe_unused]] AZStd::vector& scanFolders) override { return true; } + bool IsAssetPlatformEnabled([[maybe_unused]] const char* platform) override { return true; } + int GetPendingAssetsForPlatform([[maybe_unused]] const char* platform) override { return 0; } + bool GetAssetsProducedBySourceUUID([[maybe_unused]] const AZ::Uuid& sourceUuid, [[maybe_unused]] AZStd::vector& productsAssetInfo) override { return true; } bool GetAssetSafeFolders(AZStd::vector& assetSafeFolders) override { char resolvedBuffer[AZ_MAX_PATH_LEN] = { 0 }; From 6e51bbcd53844894c2504d3eb73d199e2298b9c5 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:22:04 -0700 Subject: [PATCH 264/355] Gems/LyShine Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Editor/Animation/AnimationContext.h | 8 +- .../Animation/Controls/UiSplineCtrlEx.h | 4 +- .../Animation/Controls/UiTimelineCtrl.h | 4 +- .../Animation/UiAVTrackEventKeyUIControls.h | 4 +- .../Editor/Animation/UiAnimViewCurveEditor.h | 8 +- .../Code/Editor/Animation/UiAnimViewDialog.h | 10 +- .../Animation/UiAnimViewDopeSheetBase.h | 2 +- .../Editor/Animation/UiAnimViewSequence.h | 10 +- .../Animation/UiAnimViewSequenceManager.h | 2 +- .../Editor/Animation/UiAnimViewSplineCtrl.h | 4 +- Gems/LyShine/Code/Source/Animation/AnimNode.h | 40 +++--- .../Code/Source/Animation/AnimSequence.h | 106 +++++++-------- .../Code/Source/Animation/AnimSplineTrack.h | 118 ++++++++--------- .../LyShine/Code/Source/Animation/AnimTrack.h | 114 ++++++++-------- .../Code/Source/Animation/AzEntityNode.h | 42 +++--- .../Source/Animation/CompoundSplineTrack.h | 122 +++++++++--------- .../Code/Source/Animation/TrackEventTrack.h | 6 +- .../Code/Source/Animation/UiAnimationSystem.h | 112 ++++++++-------- .../Code/Source/LyShineSystemComponent.h | 4 +- .../Code/Source/UiLayoutFitterComponent.h | 2 +- .../Code/Source/UiScrollBarComponent.h | 2 +- .../Code/Source/UiTooltipDisplayComponent.h | 2 +- 22 files changed, 363 insertions(+), 363 deletions(-) diff --git a/Gems/LyShine/Code/Editor/Animation/AnimationContext.h b/Gems/LyShine/Code/Editor/Animation/AnimationContext.h index 9534902f99..cb45fb9653 100644 --- a/Gems/LyShine/Code/Editor/Animation/AnimationContext.h +++ b/Gems/LyShine/Code/Editor/Animation/AnimationContext.h @@ -167,12 +167,12 @@ public: void UpdateTimeRange(); private: - virtual void BeginUndoTransaction() override; - virtual void EndUndoTransaction() override; + void BeginUndoTransaction() override; + void EndUndoTransaction() override; - virtual void OnSequenceRemoved(CUiAnimViewSequence* pSequence) override; + void OnSequenceRemoved(CUiAnimViewSequence* pSequence) override; - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event); + void OnEditorNotifyEvent(EEditorNotifyEvent event) override; void AnimateActiveSequence(); diff --git a/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.h b/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.h index 1bbcf8eea7..05b86bd380 100644 --- a/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.h +++ b/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.h @@ -345,8 +345,8 @@ public: SplineWidget(QWidget* parent); virtual ~SplineWidget(); - void update() { QWidget::update(); } - void update(const QRect& rect) { QWidget::update(rect); } + void update() override { QWidget::update(); } + void update(const QRect& rect) override { QWidget::update(rect); } QPoint mapFromGlobal(const QPoint& point) const override { return QWidget::mapFromGlobal(point); } diff --git a/Gems/LyShine/Code/Editor/Animation/Controls/UiTimelineCtrl.h b/Gems/LyShine/Code/Editor/Animation/Controls/UiTimelineCtrl.h index 701d187ddc..ed0d8ce02d 100644 --- a/Gems/LyShine/Code/Editor/Animation/Controls/UiTimelineCtrl.h +++ b/Gems/LyShine/Code/Editor/Animation/Controls/UiTimelineCtrl.h @@ -54,7 +54,7 @@ public: void setGeometry(const QRect& r) override { QWidget::setGeometry(r); } void SetTimeRange(const Range& r) { m_timeRange = r; } - void SetTimeMarker(float fTime); + void SetTimeMarker(float fTime) override; float GetTimeMarker() const { return m_fTimeMarker; } void SetZoom(float fZoom); @@ -111,7 +111,7 @@ protected: void OnLButtonUp(const QPoint& point, Qt::KeyboardModifiers modifiers); void OnRButtonDown(const QPoint& point, Qt::KeyboardModifiers modifiers); void OnRButtonUp(const QPoint& point, Qt::KeyboardModifiers modifiers); - void keyPressEvent(QKeyEvent* event); + void keyPressEvent(QKeyEvent* event) override; // Drawing functions float ClientToTime(int x); diff --git a/Gems/LyShine/Code/Editor/Animation/UiAVTrackEventKeyUIControls.h b/Gems/LyShine/Code/Editor/Animation/UiAVTrackEventKeyUIControls.h index df3b7fa24f..ed47e6a160 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAVTrackEventKeyUIControls.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAVTrackEventKeyUIControls.h @@ -17,13 +17,13 @@ public: CSmartVariableEnum mv_event; CSmartVariable mv_value; - virtual void OnCreateVars(); + void OnCreateVars() override; bool SupportTrackType(const CUiAnimParamType& paramType, EUiAnimCurveType trackType, EUiAnimValue valueType) const override; bool OnKeySelectionChange(CUiAnimViewKeyBundle& selectedKeys) override; void OnUIChange(IVariable* pVar, CUiAnimViewKeyBundle& keys) override; - virtual unsigned int GetPriority() const { return 1; } + unsigned int GetPriority() const override { return 1; } static const GUID& GetClassID() { diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.h index edde246e1c..863e8c1cdd 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewCurveEditor.h @@ -49,8 +49,8 @@ public: void SetPlayCallback(const std::function& callback); // IUiAnimationContextListener - virtual void OnSequenceChanged(CUiAnimViewSequence* pNewSequence); - virtual void OnTimeChanged(float newTime); + void OnSequenceChanged(CUiAnimViewSequence* pNewSequence) override; + void OnTimeChanged(float newTime) override; protected: void showEvent(QShowEvent* event) override; @@ -112,8 +112,8 @@ public: float GetFPS() const { return m_widget->GetFPS(); } void SetTickDisplayMode(EUiAVTickMode mode) { m_widget->SetTickDisplayMode(mode); } - virtual void OnSequenceChanged(CUiAnimViewSequence* pNewSequence) { m_widget->OnSequenceChanged(pNewSequence); } - virtual void OnTimeChanged(float newTime) { m_widget->OnTimeChanged(newTime); } + void OnSequenceChanged(CUiAnimViewSequence* pNewSequence) override { m_widget->OnSequenceChanged(pNewSequence); } + void OnTimeChanged(float newTime) override { m_widget->OnTimeChanged(newTime); } virtual void OnKeysChanged(CUiAnimViewSequence* pSequence) override { m_widget->OnKeysChanged(pSequence); } virtual void OnKeySelectionChanged(CUiAnimViewSequence* pSequence) override { m_widget->OnKeySelectionChanged(pSequence); } diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.h index a7ecbd3499..4671612695 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDialog.h @@ -70,7 +70,7 @@ public: // UiEditorAnimationStateInterface UiEditorAnimationStateInterface::UiEditorAnimationEditState GetCurrentEditState() override; - void RestoreCurrentEditState(const UiEditorAnimationStateInterface::UiEditorAnimationEditState& animEditState); + void RestoreCurrentEditState(const UiEditorAnimationStateInterface::UiEditorAnimationEditState& animEditState) override; // ~UiEditorAnimationStateInterface // UiEditorAnimListenerInterface @@ -167,11 +167,11 @@ private: virtual void OnNodeSelectionChanged(CUiAnimViewSequence* pSequence) override; virtual void OnNodeRenamed(CUiAnimViewNode* pNode, const char* pOldName) override; - virtual void OnSequenceAdded(CUiAnimViewSequence* pSequence); - virtual void OnSequenceRemoved(CUiAnimViewSequence* pSequence); + void OnSequenceAdded(CUiAnimViewSequence* pSequence) override; + void OnSequenceRemoved(CUiAnimViewSequence* pSequence) override; - virtual void BeginUndoTransaction(); - virtual void EndUndoTransaction(); + void BeginUndoTransaction() override; + void EndUndoTransaction() override; void SaveSequenceTimingToXML(); // Instance diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.h index ff1984184f..504c39e630 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewDopeSheetBase.h @@ -87,7 +87,7 @@ public: void SetEditLock(bool bLock) { m_bEditLock = bLock; } // IUiAnimationContextListener - virtual void OnTimeChanged(float newTime); + void OnTimeChanged(float newTime) override; float TickSnap(float time) const; diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequence.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequence.h index 3aa8d74563..494cebd573 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequence.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequence.h @@ -234,17 +234,17 @@ private: // Called when an animation updates needs to be schedules void ForceAnimation(); - virtual void CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks) override; + void CopyKeysToClipboard(XmlNodeRef& xmlNode, const bool bOnlySelectedKeys, const bool bOnlyFromSelectedTracks) override; void UpdateLightAnimationRefs(const char* pOldName, const char* pNewName); std::deque GetMatchingTracks(CUiAnimViewAnimNode* pAnimNode, XmlNodeRef trackNode); void GetMatchedPasteLocationsRec(std::vector& locations, CUiAnimViewNode* pCurrentNode, XmlNodeRef clipboardNode); - virtual void BeginUndoTransaction(); - virtual void EndUndoTransaction(); - virtual void BeginRestoreTransaction(); - virtual void EndRestoreTransaction(); + void BeginUndoTransaction() override; + void EndUndoTransaction() override; + void BeginRestoreTransaction() override; + void EndRestoreTransaction() override; // Current time when animated float m_time; diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequenceManager.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequenceManager.h index f29f0e58e1..1fe9d96f85 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequenceManager.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSequenceManager.h @@ -35,7 +35,7 @@ public: CUiAnimViewSequenceManager(); ~CUiAnimViewSequenceManager(); - virtual void OnEditorNotifyEvent(EEditorNotifyEvent event); + void OnEditorNotifyEvent(EEditorNotifyEvent event) override; unsigned int GetCount() const { return static_cast(m_sequences.size()); } diff --git a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.h b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.h index 8dd0ec0c79..45b3816f29 100644 --- a/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.h +++ b/Gems/LyShine/Code/Editor/Animation/UiAnimViewSplineCtrl.h @@ -26,7 +26,7 @@ public: CUiAnimViewSplineCtrl(QWidget* parent); virtual ~CUiAnimViewSplineCtrl(); - virtual void ClearSelection(); + void ClearSelection() override; void AddSpline(ISplineInterpolator* pSpline, CUiAnimViewTrack* pTrack, const QColor& color); void AddSpline(ISplineInterpolator * pSpline, CUiAnimViewTrack * pTrack, QColor anColorArray[4]); @@ -64,7 +64,7 @@ private: void AdjustTCB(float d_tension, float d_continuity, float d_bias); void MoveSelectedTangentHandleTo(const QPoint& point); - virtual ISplineCtrlUndo* CreateSplineCtrlUndoObject(std::vector& splineContainer); + ISplineCtrlUndo* CreateSplineCtrlUndoObject(std::vector& splineContainer) override; bool m_bKeysFreeze; bool m_bTangentsFreeze; diff --git a/Gems/LyShine/Code/Source/Animation/AnimNode.h b/Gems/LyShine/Code/Source/Animation/AnimNode.h index 6ac198a5c7..0076276204 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimNode.h +++ b/Gems/LyShine/Code/Source/Animation/AnimNode.h @@ -64,10 +64,10 @@ public: // Return Animation Sequence that owns this node. IUiAnimSequence* GetSequence() const override { return m_pSequence; }; - void SetFlags(int flags); - int GetFlags() const; + void SetFlags(int flags) override; + int GetFlags() const override; - IUiAnimationSystem* GetUiAnimationSystem() const { return m_pSequence->GetUiAnimationSystem(); }; + IUiAnimationSystem* GetUiAnimationSystem() const override { return m_pSequence->GetUiAnimationSystem(); }; virtual void OnStart() {} void OnReset() override {} @@ -80,23 +80,23 @@ public: virtual Matrix34 GetReferenceMatrix() const; ////////////////////////////////////////////////////////////////////////// - bool IsParamValid(const CUiAnimParamType& paramType) const; + bool IsParamValid(const CUiAnimParamType& paramType) const override; AZStd::string GetParamName(const CUiAnimParamType& param) const override; - virtual EUiAnimValue GetParamValueType(const CUiAnimParamType& paramType) const; - virtual IUiAnimNode::ESupportedParamFlags GetParamFlags(const CUiAnimParamType& paramType) const; - virtual unsigned int GetParamCount() const { return 0; }; + EUiAnimValue GetParamValueType(const CUiAnimParamType& paramType) const override; + IUiAnimNode::ESupportedParamFlags GetParamFlags(const CUiAnimParamType& paramType) const override; + unsigned int GetParamCount() const override { return 0; }; - bool SetParamValue(float time, CUiAnimParamType param, float val); - bool SetParamValue(float time, CUiAnimParamType param, const Vec3& val); - bool SetParamValue(float time, CUiAnimParamType param, const Vec4& val); - bool GetParamValue(float time, CUiAnimParamType param, float& val); - bool GetParamValue(float time, CUiAnimParamType param, Vec3& val); - bool GetParamValue(float time, CUiAnimParamType param, Vec4& val); + bool SetParamValue(float time, CUiAnimParamType param, float val) override; + bool SetParamValue(float time, CUiAnimParamType param, const Vec3& val) override; + bool SetParamValue(float time, CUiAnimParamType param, const Vec4& val) override; + bool GetParamValue(float time, CUiAnimParamType param, float& val) override; + bool GetParamValue(float time, CUiAnimParamType param, Vec3& val) override; + bool GetParamValue(float time, CUiAnimParamType param, Vec4& val) override; void SetTarget([[maybe_unused]] IUiAnimNode* node) {}; IUiAnimNode* GetTarget() const { return 0; }; - void StillUpdate() {} + void StillUpdate() override {} void Animate(SUiAnimContext& ec) override; virtual void PrecacheStatic([[maybe_unused]] float startTime) {} @@ -109,7 +109,7 @@ public: IUiAnimNodeOwner* GetNodeOwner() override { return m_pOwner; }; // Called by sequence when needs to activate a node. - virtual void Activate(bool bActivate); + void Activate(bool bActivate) override; ////////////////////////////////////////////////////////////////////////// void SetParent(IUiAnimNode* pParent) override; @@ -132,7 +132,7 @@ public: IUiAnimTrack* GetTrackForAzField([[maybe_unused]] const UiAnimParamData& param) const override { return nullptr; } IUiAnimTrack* CreateTrackForAzField([[maybe_unused]] const UiAnimParamData& param) override { return nullptr; } - virtual void SetTrack(const CUiAnimParamType& paramType, IUiAnimTrack* track); + void SetTrack(const CUiAnimParamType& paramType, IUiAnimTrack* track) override; IUiAnimTrack* CreateTrack(const CUiAnimParamType& paramType) override; void SetTimeRange(Range timeRange) override; void AddTrack(IUiAnimTrack* track) override; @@ -147,7 +147,7 @@ public: void SetId(int id) { m_id = id; } const char* GetNameFast() const { return m_name.c_str(); } - virtual void Render(){} + void Render() override{} static void Reflect(AZ::SerializeContext* serializeContext); @@ -168,7 +168,7 @@ protected: // sets track animNode pointer to this node and sorts tracks void RegisterTrack(IUiAnimTrack* track); - virtual bool NeedToRender() const { return false; } + bool NeedToRender() const override { return false; } protected: int m_refCount; @@ -199,7 +199,7 @@ class CUiAnimNodeGroup public: CUiAnimNodeGroup(const int id) : CUiAnimNode(id, eUiAnimNodeType_Group) { SetFlags(GetFlags() | eUiAnimNodeFlags_CanChangeName); } - EUiAnimNodeType GetType() const { return eUiAnimNodeType_Group; } + EUiAnimNodeType GetType() const override { return eUiAnimNodeType_Group; } - virtual CUiAnimParamType GetParamType([[maybe_unused]] unsigned int nIndex) const { return eUiAnimParamType_Invalid; } + CUiAnimParamType GetParamType([[maybe_unused]] unsigned int nIndex) const override { return eUiAnimParamType_Invalid; } }; diff --git a/Gems/LyShine/Code/Source/Animation/AnimSequence.h b/Gems/LyShine/Code/Source/Animation/AnimSequence.h index e4026ce250..1451770b4e 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimSequence.h +++ b/Gems/LyShine/Code/Source/Animation/AnimSequence.h @@ -34,95 +34,95 @@ public: // Animation system. IUiAnimationSystem* GetUiAnimationSystem() const override { return m_pUiAnimationSystem; }; - void SetName(const char* name); - const char* GetName() const; - uint32 GetId() const { return m_id; } + void SetName(const char* name) override; + const char* GetName() const override; + uint32 GetId() const override { return m_id; } float GetTime() const { return m_time; } - virtual void SetOwner(IUiAnimSequenceOwner* pOwner) { m_pOwner = pOwner; } - virtual IUiAnimSequenceOwner* GetOwner() const { return m_pOwner; } + void SetOwner(IUiAnimSequenceOwner* pOwner) override { m_pOwner = pOwner; } + IUiAnimSequenceOwner* GetOwner() const override { return m_pOwner; } - virtual void SetActiveDirector(IUiAnimNode* pDirectorNode); - virtual IUiAnimNode* GetActiveDirector() const; + void SetActiveDirector(IUiAnimNode* pDirectorNode) override; + IUiAnimNode* GetActiveDirector() const override; - virtual void SetFlags(int flags); - virtual int GetFlags() const; - virtual int GetCutSceneFlags(const bool localFlags = false) const; + void SetFlags(int flags) override; + int GetFlags() const override; + int GetCutSceneFlags(const bool localFlags = false) const override; - virtual void SetParentSequence(IUiAnimSequence* pParentSequence); - virtual const IUiAnimSequence* GetParentSequence() const; - virtual bool IsAncestorOf(const IUiAnimSequence* pSequence) const; + void SetParentSequence(IUiAnimSequence* pParentSequence) override; + const IUiAnimSequence* GetParentSequence() const override; + bool IsAncestorOf(const IUiAnimSequence* pSequence) const override; - void SetTimeRange(Range timeRange); - Range GetTimeRange() { return m_timeRange; }; + void SetTimeRange(Range timeRange) override; + Range GetTimeRange() override { return m_timeRange; }; - void AdjustKeysToTimeRange(const Range& timeRange); + void AdjustKeysToTimeRange(const Range& timeRange) override; //! Return number of animation nodes in sequence. - int GetNodeCount() const; + int GetNodeCount() const override; //! Get specified animation node. - IUiAnimNode* GetNode(int index) const; + IUiAnimNode* GetNode(int index) const override; - IUiAnimNode* FindNodeByName(const char* sNodeName, const IUiAnimNode* pParentDirector); + IUiAnimNode* FindNodeByName(const char* sNodeName, const IUiAnimNode* pParentDirector) override; IUiAnimNode* FindNodeById(int nNodeId); - virtual void ReorderNode(IUiAnimNode* node, IUiAnimNode* pPivotNode, bool next); + void ReorderNode(IUiAnimNode* node, IUiAnimNode* pPivotNode, bool next) override; - void Reset(bool bSeekToStart); - void ResetHard(); - void Pause(); - void Resume(); - bool IsPaused() const; + void Reset(bool bSeekToStart) override; + void ResetHard() override; + void Pause() override; + void Resume() override; + bool IsPaused() const override; virtual void OnStart(); virtual void OnStop(); void OnLoop() override; //! Add animation node to sequence. - bool AddNode(IUiAnimNode* node); - IUiAnimNode* CreateNode(EUiAnimNodeType nodeType); - IUiAnimNode* CreateNode(XmlNodeRef node); - void RemoveNode(IUiAnimNode* node); + bool AddNode(IUiAnimNode* node) override; + IUiAnimNode* CreateNode(EUiAnimNodeType nodeType) override; + IUiAnimNode* CreateNode(XmlNodeRef node) override; + void RemoveNode(IUiAnimNode* node) override; //! Add scene node to sequence. - void RemoveAll(); + void RemoveAll() override; - virtual void Activate(); - virtual bool IsActivated() const { return m_bActive; } - virtual void Deactivate(); + void Activate() override; + bool IsActivated() const override { return m_bActive; } + void Deactivate() override; - virtual void PrecacheData(float startTime); + void PrecacheData(float startTime) override; void PrecacheStatic(const float startTime); void PrecacheDynamic(float time); - void StillUpdate(); - void Animate(const SUiAnimContext& ec); - void Render(); + void StillUpdate() override; + void Animate(const SUiAnimContext& ec) override; + void Render() override; - void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true, uint32 overrideId = 0, bool bResetLightAnimSet = false); - void InitPostLoad(IUiAnimationSystem* pUiAnimationSystem, bool remapIds, LyShine::EntityIdMap* entityIdMap); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true, uint32 overrideId = 0, bool bResetLightAnimSet = false) override; + void InitPostLoad(IUiAnimationSystem* pUiAnimationSystem, bool remapIds, LyShine::EntityIdMap* entityIdMap) override; - void CopyNodes(XmlNodeRef& xmlNode, IUiAnimNode** pSelectedNodes, uint32 count); - void PasteNodes(const XmlNodeRef& xmlNode, IUiAnimNode* pParent); + void CopyNodes(XmlNodeRef& xmlNode, IUiAnimNode** pSelectedNodes, uint32 count) override; + void PasteNodes(const XmlNodeRef& xmlNode, IUiAnimNode* pParent) override; //! Add/remove track events in sequence - virtual bool AddTrackEvent(const char* szEvent); - virtual bool RemoveTrackEvent(const char* szEvent); - virtual bool RenameTrackEvent(const char* szEvent, const char* szNewEvent); - virtual bool MoveUpTrackEvent(const char* szEvent); - virtual bool MoveDownTrackEvent(const char* szEvent); - virtual void ClearTrackEvents(); + bool AddTrackEvent(const char* szEvent) override; + bool RemoveTrackEvent(const char* szEvent) override; + bool RenameTrackEvent(const char* szEvent, const char* szNewEvent) override; + bool MoveUpTrackEvent(const char* szEvent) override; + bool MoveDownTrackEvent(const char* szEvent) override; + void ClearTrackEvents() override; //! Get the track events in the sequence - virtual int GetTrackEventsCount() const; - virtual char const* GetTrackEvent(int iIndex) const; - virtual IUiAnimStringTable* GetTrackEventStringTable() { return m_pEventStrings.get(); } + int GetTrackEventsCount() const override; + char const* GetTrackEvent(int iIndex) const override; + IUiAnimStringTable* GetTrackEventStringTable() override { return m_pEventStrings.get(); } //! Call to trigger a track event - virtual void TriggerTrackEvent(const char* event, const char* param = NULL); + void TriggerTrackEvent(const char* event, const char* param = NULL) override; //! Track event listener - virtual void AddTrackEventListener(IUiTrackEventListener* pListener); - virtual void RemoveTrackEventListener(IUiTrackEventListener* pListener); + void AddTrackEventListener(IUiTrackEventListener* pListener) override; + void RemoveTrackEventListener(IUiTrackEventListener* pListener) override; static void Reflect(AZ::SerializeContext* serializeContext); diff --git a/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h b/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h index 0bc625155a..bf49546916 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h +++ b/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h @@ -45,23 +45,23 @@ public: void release() override; ////////////////////////////////////////////////////////////////////////// - virtual int GetSubTrackCount() const { return 0; }; - virtual IUiAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const { return 0; }; + int GetSubTrackCount() const override { return 0; }; + IUiAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const override { return 0; }; AZStd::string GetSubTrackName([[maybe_unused]] int nIndex) const override { return AZStd::string(); }; - virtual void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) { assert(0); } + void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) override { assert(0); } - virtual const CUiAnimParamType& GetParameterType() const { return m_nParamType; }; - virtual void SetParameterType(CUiAnimParamType type) { m_nParamType = type; }; + const CUiAnimParamType& GetParameterType() const override { return m_nParamType; }; + void SetParameterType(CUiAnimParamType type) override { m_nParamType = type; }; - virtual const UiAnimParamData& GetParamData() const { return m_componentParamData; } - virtual void SetParamData(const UiAnimParamData& param) { m_componentParamData = param; } + const UiAnimParamData& GetParamData() const override { return m_componentParamData; } + void SetParamData(const UiAnimParamData& param) override { m_componentParamData = param; } - virtual void GetKeyValueRange(float& fMin, float& fMax) const { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; - virtual void SetKeyValueRange(float fMin, float fMax){ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; + void GetKeyValueRange(float& fMin, float& fMax) const override { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; + void SetKeyValueRange(float fMin, float fMax) override{ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; - ISplineInterpolator* GetSpline() const { return m_spline.get(); }; + ISplineInterpolator* GetSpline() const override { return m_spline.get(); }; - virtual bool IsKeySelected(int key) const + bool IsKeySelected(int key) const override { if (GetSpline() && GetSpline()->IsKeySelectedAtAnyDimension(key)) { @@ -70,7 +70,7 @@ public: return false; } - virtual void SelectKey(int key, bool select) + void SelectKey(int key, bool select) override { if (GetSpline()) { @@ -78,22 +78,22 @@ public: } } - int GetNumKeys() const + int GetNumKeys() const override { return m_spline->num_keys(); } - void SetNumKeys(int numKeys) + void SetNumKeys(int numKeys) override { m_spline->resize(numKeys); } - bool HasKeys() const + bool HasKeys() const override { return GetNumKeys() != 0; } - void RemoveKey(int num) + void RemoveKey(int num) override { if (m_spline && m_spline->num_keys() > num) { @@ -105,7 +105,7 @@ public: } } - void GetKey(int index, IKey* key) const + void GetKey(int index, IKey* key) const override { assert(index >= 0 && index < GetNumKeys()); assert(key != 0); @@ -123,7 +123,7 @@ public: tcbkey->SetValue(k.value); } - void SetKey(int index, IKey* key) + void SetKey(int index, IKey* key) override { assert(index >= 0 && index < GetNumKeys()); assert(key != 0); @@ -140,76 +140,76 @@ public: Invalidate(); } - float GetKeyTime(int index) const + float GetKeyTime(int index) const override { assert(index >= 0 && index < GetNumKeys()); return m_spline->time(index); } - void SetKeyTime(int index, float time) + void SetKeyTime(int index, float time) override { assert(index >= 0 && index < GetNumKeys()); m_spline->SetKeyTime(index, time); Invalidate(); } - int GetKeyFlags(int index) + int GetKeyFlags(int index) override { assert(index >= 0 && index < GetNumKeys()); return m_spline->key(index).flags; } - void SetKeyFlags(int index, int flags) + void SetKeyFlags(int index, int flags) override { assert(index >= 0 && index < GetNumKeys()); m_spline->key(index).flags = flags; } - virtual EUiAnimCurveType GetCurveType() { assert(0); return eUiAnimCurveType_Unknown; } - virtual EUiAnimValue GetValueType() { assert(0); return eUiAnimValue_Unknown; } + EUiAnimCurveType GetCurveType() override { assert(0); return eUiAnimCurveType_Unknown; } + EUiAnimValue GetValueType() override { assert(0); return eUiAnimValue_Unknown; } - virtual void GetValue(float time, float& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector2& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector3& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector4& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Color& value) { assert(0); } + void GetValue(float time, float& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector2& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector3& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector4& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Color& value) override { assert(0); } - virtual void SetValue(float time, const float& value, bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector2& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector3& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector4& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Color& value, [[maybe_unused]] bool bDefault = false) { assert(0); } + void SetValue(float time, const float& value, bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector2& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector3& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector4& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Color& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } - virtual void OffsetKeyPosition([[maybe_unused]] const Vec3& value) { assert(0); }; + void OffsetKeyPosition([[maybe_unused]] const Vec3& value) override { assert(0); }; - bool Serialize(IUiAnimationSystem* uiAnimationSystem, XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); - bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected, float fTimeOffset); + bool Serialize(IUiAnimationSystem* uiAnimationSystem, XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; + bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected, float fTimeOffset) override; - void GetKeyInfo(int key, const char*& description, float& duration) + void GetKeyInfo(int key, const char*& description, float& duration) override { description = 0; duration = 0; } //! Sort keys in track (after time of keys was modified). - void SortKeys() + void SortKeys() override { m_spline->sort_keys(); }; //! Get track flags. - int GetFlags() { return m_flags; } + int GetFlags() override { return m_flags; } //! Check if track is masked by mask - virtual bool IsMasked([[maybe_unused]] const uint32 mask) const { return false; } + bool IsMasked([[maybe_unused]] const uint32 mask) const override { return false; } //! Set track flags. - void SetFlags(int flags) + void SetFlags(int flags) override { m_flags = flags; if (m_flags & eUiAnimTrackFlags_Loop) @@ -231,12 +231,12 @@ public: m_spline->flag_set(Spline::MODIFIED); }; - void SetTimeRange(const Range& timeRange) + void SetTimeRange(const Range& timeRange) override { m_spline->SetRange(timeRange.start, timeRange.end); } - int FindKey(float time) + int FindKey(float time) override { // Find key with given time. int num = m_spline->num_keys(); @@ -252,7 +252,7 @@ public: } //! Create key at given time, and return its index. - int CreateKey(float time) + int CreateKey(float time) override { ValueType value; @@ -272,12 +272,12 @@ public: return m_spline->InsertKey(time, tmp); } - int CloneKey(int srcKey) + int CloneKey(int srcKey) override { return CopyKey(this, srcKey); } - int CopyKey(IUiAnimTrack* pFromTrack, int nFromKey) + int CopyKey(IUiAnimTrack* pFromTrack, int nFromKey) override { ITcbKey key; pFromTrack->GetKey(nFromKey, &key); @@ -326,16 +326,16 @@ public: m_defaultValue = value; } - virtual ColorB GetCustomColor() const + ColorB GetCustomColor() const override { return m_customColor; } - virtual void SetCustomColor(ColorB color) + void SetCustomColor(ColorB color) override { m_customColor = color; m_bCustomColorSet = true; } - virtual bool HasCustomColor() const + bool HasCustomColor() const override { return m_bCustomColorSet; } - virtual void ClearCustomColor() + void ClearCustomColor() override { m_bCustomColorSet = false; } static void Reflect(AZ::SerializeContext* serializeContext) {} diff --git a/Gems/LyShine/Code/Source/Animation/AnimTrack.h b/Gems/LyShine/Code/Source/Animation/AnimTrack.h index 9645572e3e..1ab5c26ab0 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimTrack.h +++ b/Gems/LyShine/Code/Source/Animation/AnimTrack.h @@ -27,19 +27,19 @@ public: TUiAnimTrack(); - virtual EUiAnimCurveType GetCurveType() { return eUiAnimCurveType_Unknown; }; - virtual EUiAnimValue GetValueType() { return eUiAnimValue_Unknown; } + EUiAnimCurveType GetCurveType() override { return eUiAnimCurveType_Unknown; }; + EUiAnimValue GetValueType() override { return eUiAnimValue_Unknown; } - virtual int GetSubTrackCount() const { return 0; }; - virtual IUiAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const { return 0; }; + int GetSubTrackCount() const override { return 0; }; + IUiAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const override { return 0; }; AZStd::string GetSubTrackName([[maybe_unused]] int nIndex) const override { return AZStd::string(); }; - virtual void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) { assert(0); } + void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) override { assert(0); } - virtual const CUiAnimParamType& GetParameterType() const { return m_nParamType; }; - virtual void SetParameterType(CUiAnimParamType type) { m_nParamType = type; }; + const CUiAnimParamType& GetParameterType() const override { return m_nParamType; }; + void SetParameterType(CUiAnimParamType type) override { m_nParamType = type; }; - virtual const UiAnimParamData& GetParamData() const { return m_componentParamData; } - virtual void SetParamData(const UiAnimParamData& param) { m_componentParamData = param; } + const UiAnimParamData& GetParamData() const override { return m_componentParamData; } + void SetParamData(const UiAnimParamData& param) override { m_componentParamData = param; } ////////////////////////////////////////////////////////////////////////// // for intrusive_ptr support @@ -47,7 +47,7 @@ public: void release() override; ////////////////////////////////////////////////////////////////////////// - virtual bool IsKeySelected(int key) const + bool IsKeySelected(int key) const override { AZ_Assert(key >= 0 && key < (int)m_keys.size(), "Key index is out of range"); if (m_keys[key].flags & AKEY_SELECTED) @@ -57,7 +57,7 @@ public: return false; } - virtual void SelectKey(int key, bool select) + void SelectKey(int key, bool select) override { AZ_Assert(key >= 0 && key < (int)m_keys.size(), "Key index is out of range"); if (select) @@ -71,100 +71,100 @@ public: } //! Return number of keys in track. - virtual int GetNumKeys() const { return static_cast(m_keys.size()); }; + int GetNumKeys() const override { return static_cast(m_keys.size()); }; //! Return true if keys exists in this track - virtual bool HasKeys() const { return !m_keys.empty(); } + bool HasKeys() const override { return !m_keys.empty(); } //! Set number of keys in track. //! If needed adds empty keys at end or remove keys from end. - virtual void SetNumKeys(int numKeys) { m_keys.resize(numKeys); }; + void SetNumKeys(int numKeys) override { m_keys.resize(numKeys); }; //! Remove specified key. - virtual void RemoveKey(int num); + void RemoveKey(int num) override; - int CreateKey(float time); - int CloneKey(int fromKey); - int CopyKey(IUiAnimTrack* pFromTrack, int nFromKey); + int CreateKey(float time) override; + int CloneKey(int fromKey) override; + int CopyKey(IUiAnimTrack* pFromTrack, int nFromKey) override; //! Get key at specified location. //! @param key Must be valid pointer to compatible key structure, to be filled with specified key location. - virtual void GetKey(int index, IKey* key) const; + void GetKey(int index, IKey* key) const override; //! Get time of specified key. //! @return key time. - virtual float GetKeyTime(int index) const; + float GetKeyTime(int index) const override; //! Find key at given time. //! @return Index of found key, or -1 if key with this time not found. - virtual int FindKey(float time); + int FindKey(float time) override; //! Get flags of specified key. //! @return key time. - virtual int GetKeyFlags(int index); + int GetKeyFlags(int index) override; //! Set key at specified location. //! @param key Must be valid pointer to compatible key structure. - virtual void SetKey(int index, IKey* key); + void SetKey(int index, IKey* key) override; //! Set time of specified key. - virtual void SetKeyTime(int index, float time); + void SetKeyTime(int index, float time) override; //! Set flags of specified key. - virtual void SetKeyFlags(int index, int flags); + void SetKeyFlags(int index, int flags) override; //! Sort keys in track (after time of keys was modified). - virtual void SortKeys(); + void SortKeys() override; //! Get track flags. - virtual int GetFlags() { return m_flags; } + int GetFlags() override { return m_flags; } //! Check if track is masked - virtual bool IsMasked([[maybe_unused]] const uint32 mask) const { return false; } + bool IsMasked([[maybe_unused]] const uint32 mask) const override { return false; } //! Set track flags. - virtual void SetFlags(int flags) { m_flags = flags; } + void SetFlags(int flags) override { m_flags = flags; } ////////////////////////////////////////////////////////////////////////// // Get track value at specified time. // Interpolates keys if needed. ////////////////////////////////////////////////////////////////////////// - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] float& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector2& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector3& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector4& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Color& value) { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] float& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector2& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector3& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Vector4& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] AZ::Color& value) override { assert(0); }; ////////////////////////////////////////////////////////////////////////// // Set track value at specified time. // Adds new keys if required. ////////////////////////////////////////////////////////////////////////// - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const float& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector2& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector3& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector4& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Color& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const float& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector2& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector3& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Vector4& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const AZ::Color& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; - virtual void OffsetKeyPosition([[maybe_unused]] const Vec3& value) { assert(0); }; + void OffsetKeyPosition([[maybe_unused]] const Vec3& value) override { assert(0); }; /** Assign active time range for this track. */ - virtual void SetTimeRange(const Range& timeRange) { m_timeRange = timeRange; }; + void SetTimeRange(const Range& timeRange) override { m_timeRange = timeRange; }; /** Serialize this animation track to XML. Do not override this method, prefer to override SerializeKey. */ - virtual bool Serialize(IUiAnimationSystem* uiAnimationSystem, XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true); + bool Serialize(IUiAnimationSystem* uiAnimationSystem, XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true) override; - virtual bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0); + bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0) override; /** Serialize single key of this track. @@ -181,21 +181,21 @@ public: int GetActiveKey(float time, KeyType* key); #ifdef UI_ANIMATION_SYSTEM_SUPPORT_EDITING - virtual ColorB GetCustomColor() const + ColorB GetCustomColor() const override { return m_customColor; } - virtual void SetCustomColor(ColorB color) + void SetCustomColor(ColorB color) override { m_customColor = color; m_bCustomColorSet = true; } - virtual bool HasCustomColor() const + bool HasCustomColor() const override { return m_bCustomColorSet; } - virtual void ClearCustomColor() + void ClearCustomColor() override { m_bCustomColorSet = false; } #endif - virtual void GetKeyValueRange(float& fMin, float& fMax) const { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; - virtual void SetKeyValueRange(float fMin, float fMax){ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; + void GetKeyValueRange(float& fMin, float& fMax) const override { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; + void SetKeyValueRange(float fMin, float fMax) override{ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; static void Reflect(AZ::SerializeContext* serializeContext) {} diff --git a/Gems/LyShine/Code/Source/Animation/AzEntityNode.h b/Gems/LyShine/Code/Source/Animation/AzEntityNode.h index 9771ac7be3..f3a0fd641f 100644 --- a/Gems/LyShine/Code/Source/Animation/AzEntityNode.h +++ b/Gems/LyShine/Code/Source/Animation/AzEntityNode.h @@ -37,24 +37,24 @@ public: void EnableEntityPhysics(bool bEnable); - virtual EUiAnimNodeType GetType() const { return eUiAnimNodeType_AzEntity; } + EUiAnimNodeType GetType() const override { return eUiAnimNodeType_AzEntity; } - virtual void AddTrack(IUiAnimTrack* track); + void AddTrack(IUiAnimTrack* track) override; ////////////////////////////////////////////////////////////////////////// // Overrides from CUiAnimNode ////////////////////////////////////////////////////////////////////////// // UiAnimNodeInterface - virtual AZ::EntityId GetAzEntityId() override { return m_entityId; }; - virtual void SetAzEntity(AZ::Entity* entity) override { m_entityId = entity->GetId(); } + AZ::EntityId GetAzEntityId() override { return m_entityId; }; + void SetAzEntity(AZ::Entity* entity) override { m_entityId = entity->GetId(); } // ~UiAnimNodeInterface - virtual void StillUpdate(); - virtual void Animate(SUiAnimContext& ec); + void StillUpdate() override; + void Animate(SUiAnimContext& ec) override; - virtual void CreateDefaultTracks(); + void CreateDefaultTracks() override; bool SetParamValueAz(float time, const UiAnimParamData& param, float value) override; bool SetParamValueAz(float time, const UiAnimParamData& param, bool value) override; @@ -67,30 +67,30 @@ public: bool GetParamValueAz(float time, const UiAnimParamData& param, float& value) override; - virtual void PrecacheStatic(float startTime) override; - virtual void PrecacheDynamic(float time) override; + void PrecacheStatic(float startTime) override; + void PrecacheDynamic(float time) override; Vec3 GetPos() { return m_pos; }; Quat GetRotate() { return m_rotate; }; Vec3 GetScale() { return m_scale; }; - virtual void Activate(bool bActivate); + void Activate(bool bActivate) override; IUiAnimTrack* GetTrackForAzField(const UiAnimParamData& param) const override; IUiAnimTrack* CreateTrackForAzField(const UiAnimParamData& param) override; ////////////////////////////////////////////////////////////////////////// - void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); - virtual void InitPostLoad(IUiAnimSequence* pSequence, bool remapIds, LyShine::EntityIdMap* entityIdMap); - void OnReset(); - void OnResetHard(); - void OnStart(); - void OnPause(); - void OnStop(); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; + void InitPostLoad(IUiAnimSequence* pSequence, bool remapIds, LyShine::EntityIdMap* entityIdMap) override; + void OnReset() override; + void OnResetHard() override; + void OnStart() override; + void OnPause() override; + void OnStop() override; ////////////////////////////////////////////////////////////////////////// - virtual unsigned int GetParamCount() const; - virtual CUiAnimParamType GetParamType(unsigned int nIndex) const; + unsigned int GetParamCount() const override; + CUiAnimParamType GetParamType(unsigned int nIndex) const override; AZStd::string GetParamName(const CUiAnimParamType& param) const override; AZStd::string GetParamNameForTrack(const CUiAnimParamType& param, const IUiAnimTrack* track) const override; @@ -100,7 +100,7 @@ public: static void Reflect(AZ::SerializeContext* serializeContext); protected: - virtual bool GetParamInfoFromType(const CUiAnimParamType& paramId, SParamInfo& info) const; + bool GetParamInfoFromType(const CUiAnimParamType& paramId, SParamInfo& info) const override; //! Given the class data definition and a track for a field within it, //! compute the offset for the field and set it in the track @@ -115,7 +115,7 @@ protected: void ReleaseSounds(); // functions involved in the process to parse and store lua animated properties - virtual void UpdateDynamicParams(); + void UpdateDynamicParams() override; virtual void UpdateDynamicParams_Editor(); virtual void UpdateDynamicParams_PureGame(); diff --git a/Gems/LyShine/Code/Source/Animation/CompoundSplineTrack.h b/Gems/LyShine/Code/Source/Animation/CompoundSplineTrack.h index 127b6593fb..83a1f82588 100644 --- a/Gems/LyShine/Code/Source/Animation/CompoundSplineTrack.h +++ b/Gems/LyShine/Code/Source/Animation/CompoundSplineTrack.h @@ -26,8 +26,8 @@ public: UiCompoundSplineTrack(int nDims, EUiAnimValue inValueType, CUiAnimParamType subTrackParamTypes[MAX_SUBTRACKS]); UiCompoundSplineTrack(); - void add_ref() { ++m_refCount; } - void release() + void add_ref() override { ++m_refCount; } + void release() override { if (--m_refCount <= 0) { @@ -35,107 +35,107 @@ public: } } - virtual int GetSubTrackCount() const { return m_nDimensions; }; - virtual IUiAnimTrack* GetSubTrack(int nIndex) const; + int GetSubTrackCount() const override { return m_nDimensions; }; + IUiAnimTrack* GetSubTrack(int nIndex) const override; AZStd::string GetSubTrackName(int nIndex) const override; - virtual void SetSubTrackName(int nIndex, const char* name); + void SetSubTrackName(int nIndex, const char* name) override; - virtual EUiAnimCurveType GetCurveType() { return eUiAnimCurveType_BezierFloat; }; - virtual EUiAnimValue GetValueType() { return m_valueType; }; + EUiAnimCurveType GetCurveType() override { return eUiAnimCurveType_BezierFloat; }; + EUiAnimValue GetValueType() override { return m_valueType; }; - virtual const CUiAnimParamType& GetParameterType() const { return m_nParamType; }; - virtual void SetParameterType(CUiAnimParamType type) { m_nParamType = type; } + const CUiAnimParamType& GetParameterType() const override { return m_nParamType; }; + void SetParameterType(CUiAnimParamType type) override { m_nParamType = type; } - virtual const UiAnimParamData& GetParamData() const { return m_componentParamData; } - virtual void SetParamData(const UiAnimParamData& param) { m_componentParamData = param; } + const UiAnimParamData& GetParamData() const override { return m_componentParamData; } + void SetParamData(const UiAnimParamData& param) override { m_componentParamData = param; } - virtual int GetNumKeys() const; - virtual void SetNumKeys([[maybe_unused]] int numKeys) { assert(0); }; - virtual bool HasKeys() const; - virtual void RemoveKey(int num); + int GetNumKeys() const override; + void SetNumKeys([[maybe_unused]] int numKeys) override { assert(0); }; + bool HasKeys() const override; + void RemoveKey(int num) override; - virtual void GetKeyInfo(int key, const char*& description, float& duration); - virtual int CreateKey([[maybe_unused]] float time) { assert(0); return 0; }; - virtual int CloneKey([[maybe_unused]] int fromKey) { assert(0); return 0; }; - virtual int CopyKey([[maybe_unused]] IUiAnimTrack* pFromTrack, [[maybe_unused]] int nFromKey) { assert(0); return 0; }; - virtual void GetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) const { assert(0); }; - virtual float GetKeyTime(int index) const; - virtual int FindKey([[maybe_unused]] float time) { assert(0); return 0; }; - virtual int GetKeyFlags([[maybe_unused]] int index) { assert(0); return 0; }; - virtual void SetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) { assert(0); }; - virtual void SetKeyTime(int index, float time); - virtual void SetKeyFlags([[maybe_unused]] int index, [[maybe_unused]] int flags) { assert(0); }; - virtual void SortKeys() { assert(0); }; + void GetKeyInfo(int key, const char*& description, float& duration) override; + int CreateKey([[maybe_unused]] float time) override { assert(0); return 0; }; + int CloneKey([[maybe_unused]] int fromKey) override { assert(0); return 0; }; + int CopyKey([[maybe_unused]] IUiAnimTrack* pFromTrack, [[maybe_unused]] int nFromKey) override { assert(0); return 0; }; + void GetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) const override { assert(0); }; + float GetKeyTime(int index) const override; + int FindKey([[maybe_unused]] float time) override { assert(0); return 0; }; + int GetKeyFlags([[maybe_unused]] int index) override { assert(0); return 0; }; + void SetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) override { assert(0); }; + void SetKeyTime(int index, float time) override; + void SetKeyFlags([[maybe_unused]] int index, [[maybe_unused]] int flags) override { assert(0); }; + void SortKeys() override { assert(0); }; - virtual bool IsKeySelected(int key) const; - virtual void SelectKey(int key, bool select); + bool IsKeySelected(int key) const override; + void SelectKey(int key, bool select) override; - virtual int GetFlags() { return m_flags; }; - virtual bool IsMasked([[maybe_unused]] const uint32 mask) const { return false; } - virtual void SetFlags(int flags) { m_flags = flags; }; + int GetFlags() override { return m_flags; }; + bool IsMasked([[maybe_unused]] const uint32 mask) const override { return false; } + void SetFlags(int flags) override { m_flags = flags; }; ////////////////////////////////////////////////////////////////////////// // Get track value at specified time. // Interpolates keys if needed. ////////////////////////////////////////////////////////////////////////// - virtual void GetValue(float time, float& value); - virtual void GetValue(float time, Vec3& value); - virtual void GetValue(float time, Vec4& value); - virtual void GetValue(float time, Quat& value); - virtual void GetValue(float time, AZ::Vector2& value); - virtual void GetValue(float time, AZ::Vector3& value); - virtual void GetValue(float time, AZ::Vector4& value); - virtual void GetValue(float time, AZ::Color& value); - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) { assert(0); }; + void GetValue(float time, float& value) override; + void GetValue(float time, Vec3& value) override; + void GetValue(float time, Vec4& value) override; + void GetValue(float time, Quat& value) override; + void GetValue(float time, AZ::Vector2& value) override; + void GetValue(float time, AZ::Vector3& value) override; + void GetValue(float time, AZ::Vector4& value) override; + void GetValue(float time, AZ::Color& value) override; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) override { assert(0); }; ////////////////////////////////////////////////////////////////////////// // Set track value at specified time. // Adds new keys if required. ////////////////////////////////////////////////////////////////////////// - virtual void SetValue(float time, const float& value, bool bDefault = false); - virtual void SetValue(float time, const Vec3& value, bool bDefault = false); - void SetValue(float time, const Vec4& value, bool bDefault = false); - virtual void SetValue(float time, const Quat& value, bool bDefault = false); - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue(float time, const AZ::Vector2& value, bool bDefault = false); - virtual void SetValue(float time, const AZ::Vector3& value, bool bDefault = false); - virtual void SetValue(float time, const AZ::Vector4& value, bool bDefault = false); - virtual void SetValue(float time, const AZ::Color& value, bool bDefault = false); + void SetValue(float time, const float& value, bool bDefault = false) override; + void SetValue(float time, const Vec3& value, bool bDefault = false) override; + void SetValue(float time, const Vec4& value, bool bDefault = false) override; + void SetValue(float time, const Quat& value, bool bDefault = false) override; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue(float time, const AZ::Vector2& value, bool bDefault = false) override; + void SetValue(float time, const AZ::Vector3& value, bool bDefault = false) override; + void SetValue(float time, const AZ::Vector4& value, bool bDefault = false) override; + void SetValue(float time, const AZ::Color& value, bool bDefault = false) override; - virtual void OffsetKeyPosition(const Vec3& value); + void OffsetKeyPosition(const Vec3& value) override; - virtual void SetTimeRange(const Range& timeRange); + void SetTimeRange(const Range& timeRange) override; - virtual bool Serialize(IUiAnimationSystem* uiAnimationSystem, XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true); + bool Serialize(IUiAnimationSystem* uiAnimationSystem, XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true) override; - virtual bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0); + bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0) override; - virtual int NextKeyByTime(int key) const; + int NextKeyByTime(int key) const override; void SetSubTrackName(const int i, const AZStd::string& name) { assert (i < MAX_SUBTRACKS); m_subTrackNames[i] = name; } #ifdef UI_ANIMATION_SYSTEM_SUPPORT_EDITING - virtual ColorB GetCustomColor() const + ColorB GetCustomColor() const override { return m_customColor; } - virtual void SetCustomColor(ColorB color) + void SetCustomColor(ColorB color) override { m_customColor = color; m_bCustomColorSet = true; } - virtual bool HasCustomColor() const + bool HasCustomColor() const override { return m_bCustomColorSet; } - virtual void ClearCustomColor() + void ClearCustomColor() override { m_bCustomColorSet = false; } #endif - virtual void GetKeyValueRange(float& fMin, float& fMax) const + void GetKeyValueRange(float& fMin, float& fMax) const override { if (GetSubTrackCount() > 0) { m_subTracks[0]->GetKeyValueRange(fMin, fMax); } }; - virtual void SetKeyValueRange(float fMin, float fMax) + void SetKeyValueRange(float fMin, float fMax) override { for (int i = 0; i < m_nDimensions; ++i) { diff --git a/Gems/LyShine/Code/Source/Animation/TrackEventTrack.h b/Gems/LyShine/Code/Source/Animation/TrackEventTrack.h index 5896b19a2a..c7499c15d0 100644 --- a/Gems/LyShine/Code/Source/Animation/TrackEventTrack.h +++ b/Gems/LyShine/Code/Source/Animation/TrackEventTrack.h @@ -66,9 +66,9 @@ public: ////////////////////////////////////////////////////////////////////////// // Overrides of IAnimTrack. ////////////////////////////////////////////////////////////////////////// - void GetKeyInfo(int key, const char*& description, float& duration); - void SerializeKey(IEventKey& key, XmlNodeRef& keyNode, bool bLoading); - void SetKey(int index, IKey* key); + void GetKeyInfo(int key, const char*& description, float& duration) override; + void SerializeKey(IEventKey& key, XmlNodeRef& keyNode, bool bLoading) override; + void SetKey(int index, IKey* key) override; void InitPostLoad(IUiAnimSequence* sequence) override; static void Reflect(AZ::SerializeContext* serializeContext); diff --git a/Gems/LyShine/Code/Source/Animation/UiAnimationSystem.h b/Gems/LyShine/Code/Source/Animation/UiAnimationSystem.h index c1dbdcfcda..c270d9ca60 100644 --- a/Gems/LyShine/Code/Source/Animation/UiAnimationSystem.h +++ b/Gems/LyShine/Code/Source/Animation/UiAnimationSystem.h @@ -44,94 +44,94 @@ public: ~UiAnimationSystem(); - void Release() { delete this; }; + void Release() override { delete this; }; - bool Load(const char* pszFile, const char* pszMission); + bool Load(const char* pszFile, const char* pszMission) override; - ISystem* GetSystem() { return m_pSystem; } + ISystem* GetSystem() override { return m_pSystem; } - IUiAnimTrack* CreateTrack(EUiAnimCurveType type); + IUiAnimTrack* CreateTrack(EUiAnimCurveType type) override; - IUiAnimSequence* CreateSequence(const char* sequence, bool bLoad = false, uint32 id = 0); + IUiAnimSequence* CreateSequence(const char* sequence, bool bLoad = false, uint32 id = 0) override; IUiAnimSequence* LoadSequence(const char* pszFilePath); - IUiAnimSequence* LoadSequence(XmlNodeRef& xmlNode, bool bLoadEmpty = true); + IUiAnimSequence* LoadSequence(XmlNodeRef& xmlNode, bool bLoadEmpty = true) override; - void AddSequence(IUiAnimSequence* pSequence); - void RemoveSequence(IUiAnimSequence* pSequence); - IUiAnimSequence* FindSequence(const char* sequence) const; - IUiAnimSequence* FindSequenceById(uint32 id) const; - IUiAnimSequence* GetSequence(int i) const; - int GetNumSequences() const; - IUiAnimSequence* GetPlayingSequence(int i) const; - int GetNumPlayingSequences() const; - bool IsCutScenePlaying() const; + void AddSequence(IUiAnimSequence* pSequence) override; + void RemoveSequence(IUiAnimSequence* pSequence) override; + IUiAnimSequence* FindSequence(const char* sequence) const override; + IUiAnimSequence* FindSequenceById(uint32 id) const override; + IUiAnimSequence* GetSequence(int i) const override; + int GetNumSequences() const override; + IUiAnimSequence* GetPlayingSequence(int i) const override; + int GetNumPlayingSequences() const override; + bool IsCutScenePlaying() const override; - uint32 GrabNextSequenceId() + uint32 GrabNextSequenceId() override { return m_nextSequenceId++; } - int OnSequenceRenamed(const char* before, const char* after); - int OnCameraRenamed(const char* before, const char* after); + int OnSequenceRenamed(const char* before, const char* after) override; + int OnCameraRenamed(const char* before, const char* after) override; - bool AddUiAnimationListener(IUiAnimSequence* pSequence, IUiAnimationListener* pListener); - bool RemoveUiAnimationListener(IUiAnimSequence* pSequence, IUiAnimationListener* pListener); + bool AddUiAnimationListener(IUiAnimSequence* pSequence, IUiAnimationListener* pListener) override; + bool RemoveUiAnimationListener(IUiAnimSequence* pSequence, IUiAnimationListener* pListener) override; - void RemoveAllSequences(); + void RemoveAllSequences() override; ////////////////////////////////////////////////////////////////////////// // Sequence playback. ////////////////////////////////////////////////////////////////////////// void PlaySequence(const char* sequence, IUiAnimSequence* parentSeq = NULL, bool bResetFX = true, - bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX); + bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX) override; void PlaySequence(IUiAnimSequence* seq, IUiAnimSequence* parentSeq = NULL, bool bResetFX = true, - bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX); - void PlayOnLoadSequences(); + bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX) override; + void PlayOnLoadSequences() override; - bool StopSequence(const char* sequence); - bool StopSequence(IUiAnimSequence* seq); - bool AbortSequence(IUiAnimSequence* seq, bool bLeaveTime = false); + bool StopSequence(const char* sequence) override; + bool StopSequence(IUiAnimSequence* seq) override; + bool AbortSequence(IUiAnimSequence* seq, bool bLeaveTime = false) override; - void StopAllSequences(); - void StopAllCutScenes(); + void StopAllSequences() override; + void StopAllCutScenes() override; void Pause(bool bPause); - void Reset(bool bPlayOnReset, bool bSeekToStart); - void StillUpdate(); - void PreUpdate(const float dt); - void PostUpdate(const float dt); - void Render(); + void Reset(bool bPlayOnReset, bool bSeekToStart) override; + void StillUpdate() override; + void PreUpdate(const float dt) override; + void PostUpdate(const float dt) override; + void Render() override; - bool IsPlaying(IUiAnimSequence* seq) const; + bool IsPlaying(IUiAnimSequence* seq) const override; - void Pause(); - void Resume(); + void Pause() override; + void Resume() override; - void SetRecording(bool recording) { m_bRecording = recording; }; - bool IsRecording() const { return m_bRecording; }; + void SetRecording(bool recording) override { m_bRecording = recording; }; + bool IsRecording() const override { return m_bRecording; }; - void SetCallback(IUiAnimationCallback* pCallback) { m_pCallback = pCallback; } - IUiAnimationCallback* GetCallback() { return m_pCallback; } + void SetCallback(IUiAnimationCallback* pCallback) override { m_pCallback = pCallback; } + IUiAnimationCallback* GetCallback() override { return m_pCallback; } void Callback(IUiAnimationCallback::ECallbackReason Reason, IUiAnimNode* pNode); - void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bRemoveOldNodes = false, bool bLoadEmpty = true); - void InitPostLoad(bool remapIds, LyShine::EntityIdMap* entityIdMap); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bRemoveOldNodes = false, bool bLoadEmpty = true) override; + void InitPostLoad(bool remapIds, LyShine::EntityIdMap* entityIdMap) override; - void SetSequenceStopBehavior(ESequenceStopBehavior behavior); - IUiAnimationSystem::ESequenceStopBehavior GetSequenceStopBehavior(); + void SetSequenceStopBehavior(ESequenceStopBehavior behavior) override; + IUiAnimationSystem::ESequenceStopBehavior GetSequenceStopBehavior() override; - float GetPlayingTime(IUiAnimSequence* pSeq); - bool SetPlayingTime(IUiAnimSequence* pSeq, float fTime); + float GetPlayingTime(IUiAnimSequence* pSeq) override; + bool SetPlayingTime(IUiAnimSequence* pSeq, float fTime) override; - float GetPlayingSpeed(IUiAnimSequence* pSeq); - bool SetPlayingSpeed(IUiAnimSequence* pSeq, float fTime); + float GetPlayingSpeed(IUiAnimSequence* pSeq) override; + bool SetPlayingSpeed(IUiAnimSequence* pSeq, float fTime) override; - bool GetStartEndTime(IUiAnimSequence* pSeq, float& fStartTime, float& fEndTime); - bool SetStartEndTime(IUiAnimSequence* pSeq, const float fStartTime, const float fEndTime); + bool GetStartEndTime(IUiAnimSequence* pSeq, float& fStartTime, float& fEndTime) override; + bool SetStartEndTime(IUiAnimSequence* pSeq, const float fStartTime, const float fEndTime) override; - void GoToFrame(const char* seqName, float targetFrame); + void GoToFrame(const char* seqName, float targetFrame) override; void SerializeNodeType(EUiAnimNodeType& animNodeType, XmlNodeRef& xmlNode, bool bLoading, const uint version, int flags); - virtual void SerializeParamType(CUiAnimParamType& animParamType, XmlNodeRef& xmlNode, bool bLoading, const uint version); - virtual void SerializeParamData(UiAnimParamData& animParamData, XmlNodeRef& xmlNode, bool bLoading); + void SerializeParamType(CUiAnimParamType& animParamType, XmlNodeRef& xmlNode, bool bLoading, const uint version) override; + void SerializeParamData(UiAnimParamData& animParamData, XmlNodeRef& xmlNode, bool bLoading) override; static const char* GetParamTypeName(const CUiAnimParamType& animParamType); @@ -156,8 +156,8 @@ private: void UpdateInternal(const float dt, const bool bPreUpdate); #ifdef UI_ANIMATION_SYSTEM_SUPPORT_EDITING - virtual EUiAnimNodeType GetNodeTypeFromString(const char* pString) const; - virtual CUiAnimParamType GetParamTypeFromString(const char* pString) const; + EUiAnimNodeType GetNodeTypeFromString(const char* pString) const override; + CUiAnimParamType GetParamTypeFromString(const char* pString) const override; #endif ISystem* m_pSystem; diff --git a/Gems/LyShine/Code/Source/LyShineSystemComponent.h b/Gems/LyShine/Code/Source/LyShineSystemComponent.h index 3d5e81f7c5..5b4086007b 100644 --- a/Gems/LyShine/Code/Source/LyShineSystemComponent.h +++ b/Gems/LyShine/Code/Source/LyShineSystemComponent.h @@ -65,7 +65,7 @@ namespace LyShine // UiSystemBus interface implementation void RegisterComponentTypeForMenuOrdering(const AZ::Uuid& typeUuid) override; const AZStd::vector* GetComponentTypesForMenuOrdering() override; - const AZStd::list* GetLyShineComponentDescriptors(); + const AZStd::list* GetLyShineComponentDescriptors() override; //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// @@ -89,7 +89,7 @@ namespace LyShine // CrySystemEventBus /////////////////////////////////////////////////////// void OnCrySystemInitialized(ISystem& system, const SSystemInitParams&) override; - virtual void OnCrySystemShutdown(ISystem&) override; + void OnCrySystemShutdown(ISystem&) override; //////////////////////////////////////////////////////////////////////////// void BroadcastCursorImagePathname(); diff --git a/Gems/LyShine/Code/Source/UiLayoutFitterComponent.h b/Gems/LyShine/Code/Source/UiLayoutFitterComponent.h index d8ca9462bc..c5ceef4a74 100644 --- a/Gems/LyShine/Code/Source/UiLayoutFitterComponent.h +++ b/Gems/LyShine/Code/Source/UiLayoutFitterComponent.h @@ -72,7 +72,7 @@ protected: // member functions // ~AZ::Component // UiLayoutControllerInterface - unsigned int GetPriority() const; + unsigned int GetPriority() const override; // ~UiLayoutControllerInterface AZ_DISABLE_COPY_MOVE(UiLayoutFitterComponent); diff --git a/Gems/LyShine/Code/Source/UiScrollBarComponent.h b/Gems/LyShine/Code/Source/UiScrollBarComponent.h index 78bfa708c7..ba7abdf5e5 100644 --- a/Gems/LyShine/Code/Source/UiScrollBarComponent.h +++ b/Gems/LyShine/Code/Source/UiScrollBarComponent.h @@ -53,7 +53,7 @@ public: // member functions // UiScrollerInterface Orientation GetOrientation() override; - void SetOrientation(Orientation orientation); + void SetOrientation(Orientation orientation) override; AZ::EntityId GetScrollableEntity() override; void SetScrollableEntity(AZ::EntityId entityId) override; float GetValue() override; diff --git a/Gems/LyShine/Code/Source/UiTooltipDisplayComponent.h b/Gems/LyShine/Code/Source/UiTooltipDisplayComponent.h index 7aa0c0f618..d1fd53ec28 100644 --- a/Gems/LyShine/Code/Source/UiTooltipDisplayComponent.h +++ b/Gems/LyShine/Code/Source/UiTooltipDisplayComponent.h @@ -70,7 +70,7 @@ public: // member functions // ~UiInitializationInterface //! IUiAnimationListener - void OnUiAnimationEvent(EUiAnimationEvent uiAnimationEvent, IUiAnimSequence* pAnimSequence); + void OnUiAnimationEvent(EUiAnimationEvent uiAnimationEvent, IUiAnimSequence* pAnimSequence) override; // ~IUiAnimationListener State GetState(); From bd7bd3648b736e2c0ad85c7ad006ee45455b842b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:22:23 -0700 Subject: [PATCH 265/355] Gems/Maestro Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Cinematics/AnimAZEntityNode.h | 2 +- .../Source/Cinematics/AnimComponentNode.h | 2 +- .../Maestro/Code/Source/Cinematics/AnimNode.h | 32 ++-- .../Code/Source/Cinematics/AnimPostFXNode.h | 14 +- .../Source/Cinematics/AnimScreenFaderNode.h | 20 +-- .../Code/Source/Cinematics/AnimSequence.h | 98 ++++++------- .../Code/Source/Cinematics/AnimSplineTrack.h | 110 +++++++------- .../Code/Source/Cinematics/AnimTrack.h | 104 ++++++------- .../Code/Source/Cinematics/BoolTrack.h | 10 +- .../Maestro/Code/Source/Cinematics/CVarNode.h | 16 +- .../Source/Cinematics/CompoundSplineTrack.h | 106 +++++++------- .../Code/Source/Cinematics/EventTrack.h | 6 +- .../Code/Source/Cinematics/MaterialNode.h | 10 +- Gems/Maestro/Code/Source/Cinematics/Movie.h | 138 +++++++++--------- .../Code/Source/Cinematics/SceneNode.cpp | 4 +- .../Code/Source/Cinematics/SceneNode.h | 20 +-- .../Code/Source/Cinematics/ScreenFaderTrack.h | 4 +- .../Code/Source/Cinematics/SoundTrack.h | 6 +- .../Code/Source/Cinematics/TrackEventTrack.h | 6 +- .../Components/EditorSequenceComponent.h | 2 +- 20 files changed, 355 insertions(+), 355 deletions(-) diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h index f5af0a7ab8..68399aa53e 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimAZEntityNode.h @@ -63,7 +63,7 @@ public: Vec3 GetScale() override; ////////////////////////////////////////////////////////////////////////// - void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; // this is an unfortunate hold-over from legacy entities - used when a SceneNode overrides the camera animation so // we must disable the transform and camera components from updating animation on this entity because the SceneNode diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h index 43f49e8b80..6f4fe4cdd6 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimComponentNode.h @@ -86,7 +86,7 @@ public: // EditorSequenceAgentComponentNotificationBus::Handler Interface void OnSequenceAgentConnected() override; - void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; const AZ::Uuid& GetComponentTypeId() const { return m_componentTypeId; } diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimNode.h index 7c56d8f641..d0f22599e8 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimNode.h @@ -46,7 +46,7 @@ public: ////////////////////////////////////////////////////////////////////////// void SetName(const char* name) override { m_name = name; }; - const char* GetName() { return m_name.c_str(); }; + const char* GetName() override { return m_name.c_str(); }; void SetSequence(IAnimSequence* sequence) override { m_pSequence = sequence; } // Return Animation Sequence that owns this node. @@ -60,7 +60,7 @@ public: int GetFlags() const override; bool AreFlagsSetOnNodeOrAnyParent(EAnimNodeFlags flagsToCheck) const override; - IMovieSystem* GetMovieSystem() const { return gEnv->pMovieSystem; }; + IMovieSystem* GetMovieSystem() const override { return gEnv->pMovieSystem; }; virtual void OnStart() {} void OnReset() override {} @@ -85,23 +85,23 @@ public: virtual Matrix34 GetReferenceMatrix() const; ////////////////////////////////////////////////////////////////////////// - bool IsParamValid(const CAnimParamType& paramType) const; + bool IsParamValid(const CAnimParamType& paramType) const override; AZStd::string GetParamName(const CAnimParamType& param) const override; - virtual AnimValueType GetParamValueType(const CAnimParamType& paramType) const; - virtual IAnimNode::ESupportedParamFlags GetParamFlags(const CAnimParamType& paramType) const; - virtual unsigned int GetParamCount() const { return 0; }; + AnimValueType GetParamValueType(const CAnimParamType& paramType) const override; + IAnimNode::ESupportedParamFlags GetParamFlags(const CAnimParamType& paramType) const override; + unsigned int GetParamCount() const override { return 0; }; - bool SetParamValue(float time, CAnimParamType param, float val); - bool SetParamValue(float time, CAnimParamType param, const Vec3& val); - bool SetParamValue(float time, CAnimParamType param, const Vec4& val); - bool GetParamValue(float time, CAnimParamType param, float& val); - bool GetParamValue(float time, CAnimParamType param, Vec3& val); - bool GetParamValue(float time, CAnimParamType param, Vec4& val); + bool SetParamValue(float time, CAnimParamType param, float val) override; + bool SetParamValue(float time, CAnimParamType param, const Vec3& val) override; + bool SetParamValue(float time, CAnimParamType param, const Vec4& val) override; + bool GetParamValue(float time, CAnimParamType param, float& val) override; + bool GetParamValue(float time, CAnimParamType param, Vec3& val) override; + bool GetParamValue(float time, CAnimParamType param, Vec4& val) override; void SetTarget([[maybe_unused]] IAnimNode* node) {}; IAnimNode* GetTarget() const { return 0; }; - void StillUpdate() {} + void StillUpdate() override {} void Animate(SAnimContext& ec) override; virtual void PrecacheStatic([[maybe_unused]] float startTime) {} @@ -114,7 +114,7 @@ public: IAnimNodeOwner* GetNodeOwner() override { return m_pOwner; }; // Called by sequence when needs to activate a node. - virtual void Activate(bool bActivate); + void Activate(bool bActivate) override; ////////////////////////////////////////////////////////////////////////// void SetParent(IAnimNode* parent) override; @@ -149,7 +149,7 @@ public: void SetId(int id) { m_id = id; } const char* GetNameFast() const { return m_name.c_str(); } - virtual void Render(){} + void Render() override{} void UpdateDynamicParams() final; @@ -177,7 +177,7 @@ protected: CMovieSystem* GetCMovieSystem() const { return (CMovieSystem*)gEnv->pMovieSystem; } - virtual bool NeedToRender() const { return false; } + bool NeedToRender() const override { return false; } // nodes which support sounds should override this to reset their start/stop sound states virtual void ResetSounds() {} diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h index 6ce44607aa..25c4c89b94 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimPostFXNode.h @@ -37,32 +37,32 @@ public: //----------------------------------------------------------------------------- //! - virtual void SerializeAnims(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); + void SerializeAnims(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; //----------------------------------------------------------------------------- //! - virtual unsigned int GetParamCount() const; - virtual CAnimParamType GetParamType(unsigned int nIndex) const; + unsigned int GetParamCount() const override; + CAnimParamType GetParamType(unsigned int nIndex) const override; //----------------------------------------------------------------------------- //! //----------------------------------------------------------------------------- //! - virtual void CreateDefaultTracks(); + void CreateDefaultTracks() override; - virtual void OnReset(); + void OnReset() override; //----------------------------------------------------------------------------- //! - virtual void Animate(SAnimContext& ac); + void Animate(SAnimContext& ac) override; void InitPostLoad(IAnimSequence* sequence) override; static void Reflect(AZ::ReflectContext* context); protected: - virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; + bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const override; typedef std::map< AnimNodeType, _smart_ptr > FxNodeDescriptionMap; static StaticInstance s_fxNodeDescriptions; diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h b/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h index 1e16cc5fb0..8f4b0de4fb 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimScreenFaderNode.h @@ -32,32 +32,32 @@ public: //----------------------------------------------------------------------------- //! Overrides from CAnimNode - virtual void Animate(SAnimContext& ac); + void Animate(SAnimContext& ac) override; - virtual void CreateDefaultTracks(); + void CreateDefaultTracks() override; - virtual void OnReset(); + void OnReset() override; - virtual void Activate(bool bActivate); + void Activate(bool bActivate) override; - virtual void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; //----------------------------------------------------------------------------- //! Overrides from IAnimNode - virtual unsigned int GetParamCount() const; - virtual CAnimParamType GetParamType(unsigned int nIndex) const; + unsigned int GetParamCount() const override; + CAnimParamType GetParamType(unsigned int nIndex) const override; void SetFlags(int flags) override; - virtual void Render(); + void Render() override; bool IsAnyTextureVisible() const; static void Reflect(AZ::ReflectContext* context); protected: - virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; + bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const override; - virtual bool NeedToRender() const { return true; } + bool NeedToRender() const override { return true; } private: CAnimScreenFaderNode(const CAnimScreenFaderNode&); diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSequence.h b/Gems/Maestro/Code/Source/Cinematics/AnimSequence.h index 0a1d4a931c..f824cf519d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSequence.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSequence.h @@ -40,48 +40,48 @@ public: // Movie system. IMovieSystem* GetMovieSystem() const { return m_pMovieSystem; }; - void SetName(const char* name); - const char* GetName() const; - uint32 GetId() const { return m_id; } + void SetName(const char* name) override; + const char* GetName() const override; + uint32 GetId() const override { return m_id; } void ResetId() override; float GetTime() const { return m_time; } void SetLegacySequenceObject(IAnimLegacySequenceObject* legacySequenceObject) override { m_legacySequenceObject = legacySequenceObject; } - virtual IAnimLegacySequenceObject* GetLegacySequenceObject() const override { return m_legacySequenceObject; } + IAnimLegacySequenceObject* GetLegacySequenceObject() const override { return m_legacySequenceObject; } void SetSequenceEntityId(const AZ::EntityId& sequenceEntityId) override; const AZ::EntityId& GetSequenceEntityId() const override { return m_sequenceEntityId; } - virtual void SetActiveDirector(IAnimNode* pDirectorNode); - virtual IAnimNode* GetActiveDirector() const; + void SetActiveDirector(IAnimNode* pDirectorNode) override; + IAnimNode* GetActiveDirector() const override; - virtual void SetFlags(int flags); - virtual int GetFlags() const; - virtual int GetCutSceneFlags(const bool localFlags = false) const; + void SetFlags(int flags) override; + int GetFlags() const override; + int GetCutSceneFlags(const bool localFlags = false) const override; - virtual void SetParentSequence(IAnimSequence* pParentSequence); - virtual const IAnimSequence* GetParentSequence() const; - virtual bool IsAncestorOf(const IAnimSequence* pSequence) const; + void SetParentSequence(IAnimSequence* pParentSequence) override; + const IAnimSequence* GetParentSequence() const override; + bool IsAncestorOf(const IAnimSequence* pSequence) const override; - void SetTimeRange(Range timeRange); - Range GetTimeRange() { return m_timeRange; }; + void SetTimeRange(Range timeRange) override; + Range GetTimeRange() override { return m_timeRange; }; - void AdjustKeysToTimeRange(const Range& timeRange); + void AdjustKeysToTimeRange(const Range& timeRange) override; //! Return number of animation nodes in sequence. - int GetNodeCount() const; + int GetNodeCount() const override; //! Get specified animation node. - IAnimNode* GetNode(int index) const; + IAnimNode* GetNode(int index) const override; - IAnimNode* FindNodeByName(const char* sNodeName, const IAnimNode* pParentDirector); + IAnimNode* FindNodeByName(const char* sNodeName, const IAnimNode* pParentDirector) override; IAnimNode* FindNodeById(int nNodeId); - virtual void ReorderNode(IAnimNode* node, IAnimNode* pPivotNode, bool next); + void ReorderNode(IAnimNode* node, IAnimNode* pPivotNode, bool next) override; - void Reset(bool bSeekToStart); - void ResetHard(); - void Pause(); - void Resume(); - bool IsPaused() const; + void Reset(bool bSeekToStart) override; + void ResetHard() override; + void Pause() override; + void Resume() override; + bool IsPaused() const override; virtual void OnStart(); virtual void OnStop(); @@ -90,49 +90,49 @@ public: void TimeChanged(float newTime) override; //! Add animation node to sequence. - bool AddNode(IAnimNode* node); - IAnimNode* CreateNode(AnimNodeType nodeType); - IAnimNode* CreateNode(XmlNodeRef node); + bool AddNode(IAnimNode* node) override; + IAnimNode* CreateNode(AnimNodeType nodeType) override; + IAnimNode* CreateNode(XmlNodeRef node) override; void RemoveNode(IAnimNode* node, bool removeChildRelationships=true) override; //! Add scene node to sequence. - void RemoveAll(); + void RemoveAll() override; - virtual void Activate(); - virtual bool IsActivated() const { return m_bActive; } - virtual void Deactivate(); + void Activate() override; + bool IsActivated() const override { return m_bActive; } + void Deactivate() override; - virtual void PrecacheData(float startTime); + void PrecacheData(float startTime) override; void PrecacheStatic(const float startTime); void PrecacheDynamic(float time); - void StillUpdate(); - void Animate(const SAnimContext& ec); - void Render(); + void StillUpdate() override; + void Animate(const SAnimContext& ec) override; + void Render() override; void InitPostLoad() override; - void CopyNodes(XmlNodeRef& xmlNode, IAnimNode** pSelectedNodes, uint32 count); - void PasteNodes(const XmlNodeRef& xmlNode, IAnimNode* pParent); + void CopyNodes(XmlNodeRef& xmlNode, IAnimNode** pSelectedNodes, uint32 count) override; + void PasteNodes(const XmlNodeRef& xmlNode, IAnimNode* pParent) override; //! Add/remove track events in sequence - virtual bool AddTrackEvent(const char* szEvent); - virtual bool RemoveTrackEvent(const char* szEvent); - virtual bool RenameTrackEvent(const char* szEvent, const char* szNewEvent); - virtual bool MoveUpTrackEvent(const char* szEvent); - virtual bool MoveDownTrackEvent(const char* szEvent); - virtual void ClearTrackEvents(); + bool AddTrackEvent(const char* szEvent) override; + bool RemoveTrackEvent(const char* szEvent) override; + bool RenameTrackEvent(const char* szEvent, const char* szNewEvent) override; + bool MoveUpTrackEvent(const char* szEvent) override; + bool MoveDownTrackEvent(const char* szEvent) override; + void ClearTrackEvents() override; //! Get the track events in the sequence - virtual int GetTrackEventsCount() const; - virtual char const* GetTrackEvent(int iIndex) const; - virtual IAnimStringTable* GetTrackEventStringTable() { return m_pEventStrings.get(); } + int GetTrackEventsCount() const override; + char const* GetTrackEvent(int iIndex) const override; + IAnimStringTable* GetTrackEventStringTable() override { return m_pEventStrings.get(); } //! Call to trigger a track event - virtual void TriggerTrackEvent(const char* event, const char* param = NULL); + void TriggerTrackEvent(const char* event, const char* param = NULL) override; //! Track event listener - virtual void AddTrackEventListener(ITrackEventListener* pListener); - virtual void RemoveTrackEventListener(ITrackEventListener* pListener); + void AddTrackEventListener(ITrackEventListener* pListener) override; + void RemoveTrackEventListener(ITrackEventListener* pListener) override; SequenceType GetSequenceType() const override { return m_sequenceType; } diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h index 46dcb63daa..d6f969b21d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h @@ -52,24 +52,24 @@ public: ////////////////////////////////////////////////////////////////////////// - virtual int GetSubTrackCount() const { return 0; }; - virtual IAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const { return 0; }; - AZStd::string GetSubTrackName([[maybe_unused]] int nIndex) const { return AZStd::string(); }; - virtual void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) { assert(0); } + int GetSubTrackCount() const override { return 0; }; + IAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const override { return 0; }; + AZStd::string GetSubTrackName([[maybe_unused]] int nIndex) const override { return AZStd::string(); }; + void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) override { assert(0); } void SetNode(IAnimNode* node) override { m_node = node; } // Return Animation Node that owns this Track. IAnimNode* GetNode() override { return m_node; } - virtual const CAnimParamType& GetParameterType() const { return m_nParamType; }; - virtual void SetParameterType(CAnimParamType type) { m_nParamType = type; }; + const CAnimParamType& GetParameterType() const override { return m_nParamType; }; + void SetParameterType(CAnimParamType type) override { m_nParamType = type; }; - virtual void GetKeyValueRange(float& fMin, float& fMax) const { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; - virtual void SetKeyValueRange(float fMin, float fMax){ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; + void GetKeyValueRange(float& fMin, float& fMax) const override { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; + void SetKeyValueRange(float fMin, float fMax) override{ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; - ISplineInterpolator* GetSpline() const { return m_spline.get(); }; + ISplineInterpolator* GetSpline() const override { return m_spline.get(); }; - virtual bool IsKeySelected(int key) const + bool IsKeySelected(int key) const override { if (GetSpline() && GetSpline()->IsKeySelectedAtAnyDimension(key)) { @@ -78,7 +78,7 @@ public: return false; } - virtual void SelectKey(int key, bool select) + void SelectKey(int key, bool select) override { if (GetSpline()) { @@ -86,22 +86,22 @@ public: } } - int GetNumKeys() const + int GetNumKeys() const override { return m_spline->num_keys(); } - void SetNumKeys(int numKeys) + void SetNumKeys(int numKeys) override { m_spline->resize(numKeys); } - bool HasKeys() const + bool HasKeys() const override { return GetNumKeys() != 0; } - void RemoveKey(int num) + void RemoveKey(int num) override { if (m_spline && m_spline->num_keys() > num) { @@ -113,7 +113,7 @@ public: } } - void GetKey(int index, IKey* key) const + void GetKey(int index, IKey* key) const override { assert(index >= 0 && index < GetNumKeys()); assert(key != 0); @@ -131,7 +131,7 @@ public: tcbkey->SetValue(k.value); } - void SetKey(int index, IKey* key) + void SetKey(int index, IKey* key) override { assert(index >= 0 && index < GetNumKeys()); assert(key != 0); @@ -148,71 +148,71 @@ public: Invalidate(); } - float GetKeyTime(int index) const + float GetKeyTime(int index) const override { assert(index >= 0 && index < GetNumKeys()); return m_spline->time(index); } - void SetKeyTime(int index, float time) + void SetKeyTime(int index, float time) override { assert(index >= 0 && index < GetNumKeys()); m_spline->SetKeyTime(index, time); Invalidate(); } - int GetKeyFlags(int index) + int GetKeyFlags(int index) override { assert(index >= 0 && index < GetNumKeys()); return m_spline->key(index).flags; } - void SetKeyFlags(int index, int flags) + void SetKeyFlags(int index, int flags) override { assert(index >= 0 && index < GetNumKeys()); m_spline->key(index).flags = flags; } - virtual EAnimCurveType GetCurveType() { assert(0); return eAnimCurveType_Unknown; } - virtual AnimValueType GetValueType() { assert(0); return static_cast(0xFFFFFFFF); } + EAnimCurveType GetCurveType() override { assert(0); return eAnimCurveType_Unknown; } + AnimValueType GetValueType() override { assert(0); return static_cast(0xFFFFFFFF); } - virtual void GetValue(float time, float& value, bool applyMultiplier = false) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value, [[maybe_unused]] bool applyMultiplier = false) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value, [[maybe_unused]] bool applyMultiplier = false) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) { assert(0); } - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Maestro::AssetBlends& value) { assert(0); } + void GetValue(float time, float& value, bool applyMultiplier = false) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) override { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Maestro::AssetBlends& value) override { assert(0); } - virtual void SetValue(float time, const float& value, bool bDefault = false, bool applyMultiplier = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) { assert(0); } - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Maestro::AssetBlends& value, [[maybe_unused]] bool bDefault = false) { assert(0); } + void SetValue(float time, const float& value, bool bDefault = false, bool applyMultiplier = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Maestro::AssetBlends& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } - virtual void OffsetKeyPosition([[maybe_unused]] const Vec3& value) { assert(0); }; - virtual void UpdateKeyDataAfterParentChanged([[maybe_unused]] const AZ::Transform& oldParentWorldTM, [[maybe_unused]] const AZ::Transform& newParentWorldTM) { assert(0); }; + void OffsetKeyPosition([[maybe_unused]] const Vec3& value) override { assert(0); }; + void UpdateKeyDataAfterParentChanged([[maybe_unused]] const AZ::Transform& oldParentWorldTM, [[maybe_unused]] const AZ::Transform& newParentWorldTM) override { assert(0); }; - bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); - bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected, float fTimeOffset); + bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; + bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected, float fTimeOffset) override; - void GetKeyInfo(int key, const char*& description, float& duration) + void GetKeyInfo(int key, const char*& description, float& duration) override { description = 0; duration = 0; } //! Sort keys in track (after time of keys was modified). - void SortKeys() + void SortKeys() override { m_spline->sort_keys(); }; //! Get track flags. - int GetFlags() { return m_flags; }; + int GetFlags() override { return m_flags; }; //! Check if track is masked by mask - virtual bool IsMasked([[maybe_unused]] const uint32 mask) const { return false; } + bool IsMasked([[maybe_unused]] const uint32 mask) const override { return false; } //! Set track flags. - void SetFlags(int flags) + void SetFlags(int flags) override { m_flags = flags; if (m_flags & eAnimTrackFlags_Loop) @@ -234,12 +234,12 @@ public: m_spline->flag_set(Spline::MODIFIED); }; - void SetTimeRange(const Range& timeRange) + void SetTimeRange(const Range& timeRange) override { m_spline->SetRange(timeRange.start, timeRange.end); } - int FindKey(float time) + int FindKey(float time) override { // Find key with given time. int num = m_spline->num_keys(); @@ -255,7 +255,7 @@ public: } //! Create key at given time, and return its index. - int CreateKey(float time) + int CreateKey(float time) override { ValueType value; @@ -275,12 +275,12 @@ public: return m_spline->InsertKey(time, tmp); } - int CloneKey(int srcKey) + int CloneKey(int srcKey) override { return CopyKey(this, srcKey); } - int CopyKey(IAnimTrack* pFromTrack, int nFromKey) + int CopyKey(IAnimTrack* pFromTrack, int nFromKey) override { ITcbKey key; pFromTrack->GetKey(nFromKey, &key); @@ -329,16 +329,16 @@ public: m_defaultValue = value; } - virtual ColorB GetCustomColor() const + ColorB GetCustomColor() const override { return m_customColor; } - virtual void SetCustomColor(ColorB color) + void SetCustomColor(ColorB color) override { m_customColor = color; m_bCustomColorSet = true; } - virtual bool HasCustomColor() const + bool HasCustomColor() const override { return m_bCustomColorSet; } - virtual void ClearCustomColor() + void ClearCustomColor() override { m_bCustomColorSet = false; } void SetMultiplier(float trackMultiplier) override @@ -346,12 +346,12 @@ public: m_trackMultiplier = trackMultiplier; } - void SetExpanded([[maybe_unused]] bool expanded) + void SetExpanded([[maybe_unused]] bool expanded) override { AZ_Assert(false, "Not expected to be used."); } - bool GetExpanded() const + bool GetExpanded() const override { return false; } diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h index e16f64c7c1..e39ae3e2ee 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimTrack.h @@ -28,20 +28,20 @@ public: TAnimTrack(); - virtual EAnimCurveType GetCurveType() { return eAnimCurveType_Unknown; }; - virtual AnimValueType GetValueType() { return kAnimValueUnknown; } + EAnimCurveType GetCurveType() override { return eAnimCurveType_Unknown; }; + AnimValueType GetValueType() override { return kAnimValueUnknown; } void SetNode(IAnimNode* node) override { m_node = node; } // Return Animation Node that owns this Track. IAnimNode* GetNode() override { return m_node; } - virtual int GetSubTrackCount() const { return 0; }; - virtual IAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const { return 0; }; + int GetSubTrackCount() const override { return 0; }; + IAnimTrack* GetSubTrack([[maybe_unused]] int nIndex) const override { return 0; }; AZStd::string GetSubTrackName([[maybe_unused]] int nIndex) const override { return AZStd::string(); }; - virtual void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) { assert(0); } + void SetSubTrackName([[maybe_unused]] int nIndex, [[maybe_unused]] const char* name) override { assert(0); } - virtual const CAnimParamType& GetParameterType() const { return m_nParamType; }; - virtual void SetParameterType(CAnimParamType type) { m_nParamType = type; }; + const CAnimParamType& GetParameterType() const override { return m_nParamType; }; + void SetParameterType(CAnimParamType type) override { m_nParamType = type; }; ////////////////////////////////////////////////////////////////////////// // for intrusive_ptr support @@ -49,7 +49,7 @@ public: void release() override; ////////////////////////////////////////////////////////////////////////// - virtual bool IsKeySelected(int key) const + bool IsKeySelected(int key) const override { AZ_Assert(key >= 0 && key < (int)m_keys.size(), "Key index is out of range"); if (m_keys[key].flags & AKEY_SELECTED) @@ -59,7 +59,7 @@ public: return false; } - virtual void SelectKey(int key, bool select) + void SelectKey(int key, bool select) override { AZ_Assert(key >= 0 && key < (int)m_keys.size(), "Key index is out of range"); if (select) @@ -96,59 +96,59 @@ public: } //! Return number of keys in track. - virtual int GetNumKeys() const { return static_cast(m_keys.size()); }; + int GetNumKeys() const override { return static_cast(m_keys.size()); }; //! Return true if keys exists in this track - virtual bool HasKeys() const { return !m_keys.empty(); } + bool HasKeys() const override { return !m_keys.empty(); } //! Set number of keys in track. //! If needed adds empty keys at end or remove keys from end. - virtual void SetNumKeys(int numKeys) { m_keys.resize(numKeys); }; + void SetNumKeys(int numKeys) override { m_keys.resize(numKeys); }; //! Remove specified key. - virtual void RemoveKey(int num); + void RemoveKey(int num) override; - int CreateKey(float time); - int CloneKey(int fromKey); - int CopyKey(IAnimTrack* pFromTrack, int nFromKey); + int CreateKey(float time) override; + int CloneKey(int fromKey) override; + int CopyKey(IAnimTrack* pFromTrack, int nFromKey) override; //! Get key at specified location. //! @param key Must be valid pointer to compatible key structure, to be filled with specified key location. - virtual void GetKey(int index, IKey* key) const; + void GetKey(int index, IKey* key) const override; //! Get time of specified key. //! @return key time. - virtual float GetKeyTime(int index) const; + float GetKeyTime(int index) const override; //! Find key at given time. //! @return Index of found key, or -1 if key with this time not found. - virtual int FindKey(float time); + int FindKey(float time) override; //! Get flags of specified key. //! @return key time. - virtual int GetKeyFlags(int index); + int GetKeyFlags(int index) override; //! Set key at specified location. //! @param key Must be valid pointer to compatible key structure. - virtual void SetKey(int index, IKey* key); + void SetKey(int index, IKey* key) override; //! Set time of specified key. - virtual void SetKeyTime(int index, float time); + void SetKeyTime(int index, float time) override; //! Set flags of specified key. - virtual void SetKeyFlags(int index, int flags); + void SetKeyFlags(int index, int flags) override; //! Sort keys in track (after time of keys was modified). - virtual void SortKeys(); + void SortKeys() override; //! Get track flags. - virtual int GetFlags() { return m_flags; }; + int GetFlags() override { return m_flags; }; //! Check if track is masked - virtual bool IsMasked([[maybe_unused]] const uint32 mask) const { return false; } + bool IsMasked([[maybe_unused]] const uint32 mask) const override { return false; } //! Set track flags. - virtual void SetFlags(int flags) + void SetFlags(int flags) override { m_flags = flags; } @@ -157,37 +157,37 @@ public: // Get track value at specified time. // Interpolates keys if needed. ////////////////////////////////////////////////////////////////////////// - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] float& value, [[maybe_unused]] bool applyMultiplier = false) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value, [[maybe_unused]] bool applyMultiplier = false) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value, [[maybe_unused]] bool applyMultiplier = false) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Maestro::AssetBlends& value) { assert(0); } + void GetValue([[maybe_unused]] float time, [[maybe_unused]] float& value, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec3& value, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Vec4& value, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Quat& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Maestro::AssetBlends& value) override { assert(0); } ////////////////////////////////////////////////////////////////////////// // Set track value at specified time. // Adds new keys if required. ////////////////////////////////////////////////////////////////////////// - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const float& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Maestro::AssetBlends& value, [[maybe_unused]] bool bDefault = false) { assert(0); } + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const float& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec3& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Vec4& value, [[maybe_unused]] bool bDefault = false, [[maybe_unused]] bool applyMultiplier = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Quat& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Maestro::AssetBlends& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } - virtual void OffsetKeyPosition([[maybe_unused]] const Vec3& value) { assert(0); }; - virtual void UpdateKeyDataAfterParentChanged([[maybe_unused]] const AZ::Transform& oldParentWorldTM, [[maybe_unused]] const AZ::Transform& newParentWorldTM) { assert(0); }; + void OffsetKeyPosition([[maybe_unused]] const Vec3& value) override { assert(0); }; + void UpdateKeyDataAfterParentChanged([[maybe_unused]] const AZ::Transform& oldParentWorldTM, [[maybe_unused]] const AZ::Transform& newParentWorldTM) override { assert(0); }; /** Assign active time range for this track. */ - virtual void SetTimeRange(const Range& timeRange) { m_timeRange = timeRange; }; + void SetTimeRange(const Range& timeRange) override { m_timeRange = timeRange; }; /** Serialize this animation track to XML. Do not override this method, prefer to override SerializeKey. */ - virtual bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true); + bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true) override; - virtual bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0); + bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0) override; /** Serialize single key of this track. @@ -204,33 +204,33 @@ public: int GetActiveKey(float time, KeyType* key); #ifdef MOVIESYSTEM_SUPPORT_EDITING - virtual ColorB GetCustomColor() const + ColorB GetCustomColor() const override { return m_customColor; } - virtual void SetCustomColor(ColorB color) + void SetCustomColor(ColorB color) override { m_customColor = color; m_bCustomColorSet = true; } - virtual bool HasCustomColor() const + bool HasCustomColor() const override { return m_bCustomColorSet; } - virtual void ClearCustomColor() + void ClearCustomColor() override { m_bCustomColorSet = false; } #endif - virtual void GetKeyValueRange(float& fMin, float& fMax) const { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; - virtual void SetKeyValueRange(float fMin, float fMax){ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; + void GetKeyValueRange(float& fMin, float& fMax) const override { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; + void SetKeyValueRange(float fMin, float fMax) override{ m_fMinKeyValue = fMin; m_fMaxKeyValue = fMax; }; void SetMultiplier(float trackMultiplier) override { m_trackMultiplier = trackMultiplier; } - void SetExpanded([[maybe_unused]] bool expanded) + void SetExpanded([[maybe_unused]] bool expanded) override { AZ_Assert(false, "Not expected to be used."); } - bool GetExpanded() const + bool GetExpanded() const override { return false; } diff --git a/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h b/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h index edee77437c..a24f695b56 100644 --- a/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/BoolTrack.h @@ -28,14 +28,14 @@ public: CBoolTrack(); - virtual AnimValueType GetValueType(); + AnimValueType GetValueType() override; - virtual void GetValue(float time, bool& value); - virtual void SetValue(float time, const bool& value, bool bDefault = false); + void GetValue(float time, bool& value) override; + void SetValue(float time, const bool& value, bool bDefault = false) override; - void SerializeKey([[maybe_unused]] IBoolKey& key, [[maybe_unused]] XmlNodeRef& keyNode, [[maybe_unused]] bool bLoading) {}; - void GetKeyInfo(int key, const char*& description, float& duration); + void SerializeKey([[maybe_unused]] IBoolKey& key, [[maybe_unused]] XmlNodeRef& keyNode, [[maybe_unused]] bool bLoading) override {}; + void GetKeyInfo(int key, const char*& description, float& duration) override; void SetDefaultValue(const bool bDefaultValue); diff --git a/Gems/Maestro/Code/Source/Cinematics/CVarNode.h b/Gems/Maestro/Code/Source/Cinematics/CVarNode.h index 5068140f11..af5ce43b2f 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CVarNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/CVarNode.h @@ -26,21 +26,21 @@ public: ////////////////////////////////////////////////////////////////////////// // Overrides from CAnimNode ////////////////////////////////////////////////////////////////////////// - void SetName(const char* name); - void Animate(SAnimContext& ec); - void CreateDefaultTracks(); - void OnReset(); - void OnResume(); + void SetName(const char* name) override; + void Animate(SAnimContext& ec) override; + void CreateDefaultTracks() override; + void OnReset() override; + void OnResume() override; - virtual unsigned int GetParamCount() const; - virtual CAnimParamType GetParamType(unsigned int nIndex) const; + unsigned int GetParamCount() const override; + CAnimParamType GetParamType(unsigned int nIndex) const override; int GetDefaultKeyTangentFlags() const override; static void Reflect(AZ::ReflectContext* context); protected: - virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; + bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const override; private: float m_value; diff --git a/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h b/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h index 443bad584b..4d7065a06d 100644 --- a/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/CompoundSplineTrack.h @@ -36,41 +36,41 @@ public: // Return Animation Node that owns this Track. IAnimNode* GetNode() override { return m_node; } - virtual int GetSubTrackCount() const { return m_nDimensions; }; - virtual IAnimTrack* GetSubTrack(int nIndex) const; - AZStd::string GetSubTrackName(int nIndex) const; - virtual void SetSubTrackName(int nIndex, const char* name); + int GetSubTrackCount() const override { return m_nDimensions; }; + IAnimTrack* GetSubTrack(int nIndex) const override; + AZStd::string GetSubTrackName(int nIndex) const override; + void SetSubTrackName(int nIndex, const char* name) override; - virtual EAnimCurveType GetCurveType() { return eAnimCurveType_BezierFloat; }; - virtual AnimValueType GetValueType() { return m_valueType; }; + EAnimCurveType GetCurveType() override { return eAnimCurveType_BezierFloat; }; + AnimValueType GetValueType() override { return m_valueType; }; - virtual const CAnimParamType& GetParameterType() const { return m_nParamType; }; - virtual void SetParameterType(CAnimParamType type) { m_nParamType = type; } + const CAnimParamType& GetParameterType() const override { return m_nParamType; }; + void SetParameterType(CAnimParamType type) override { m_nParamType = type; } - virtual int GetNumKeys() const; - virtual void SetNumKeys([[maybe_unused]] int numKeys) { assert(0); }; - virtual bool HasKeys() const; - virtual void RemoveKey(int num); + int GetNumKeys() const override; + void SetNumKeys([[maybe_unused]] int numKeys) override { assert(0); }; + bool HasKeys() const override; + void RemoveKey(int num) override; - virtual void GetKeyInfo(int key, const char*& description, float& duration); - virtual int CreateKey([[maybe_unused]] float time) { assert(0); return 0; }; - virtual int CloneKey([[maybe_unused]] int fromKey) { assert(0); return 0; }; - virtual int CopyKey([[maybe_unused]] IAnimTrack* pFromTrack, [[maybe_unused]] int nFromKey) { assert(0); return 0; }; - virtual void GetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) const { assert(0); }; - virtual float GetKeyTime(int index) const; - virtual int FindKey([[maybe_unused]] float time) { assert(0); return 0; }; - virtual int GetKeyFlags([[maybe_unused]] int index) { assert(0); return 0; }; - virtual void SetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) { assert(0); }; - virtual void SetKeyTime(int index, float time); - virtual void SetKeyFlags([[maybe_unused]] int index, [[maybe_unused]] int flags) { assert(0); }; - virtual void SortKeys() { assert(0); }; + void GetKeyInfo(int key, const char*& description, float& duration) override; + int CreateKey([[maybe_unused]] float time) override { assert(0); return 0; }; + int CloneKey([[maybe_unused]] int fromKey) override { assert(0); return 0; }; + int CopyKey([[maybe_unused]] IAnimTrack* pFromTrack, [[maybe_unused]] int nFromKey) override { assert(0); return 0; }; + void GetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) const override { assert(0); }; + float GetKeyTime(int index) const override; + int FindKey([[maybe_unused]] float time) override { assert(0); return 0; }; + int GetKeyFlags([[maybe_unused]] int index) override { assert(0); return 0; }; + void SetKey([[maybe_unused]] int index, [[maybe_unused]] IKey* key) override { assert(0); }; + void SetKeyTime(int index, float time) override; + void SetKeyFlags([[maybe_unused]] int index, [[maybe_unused]] int flags) override { assert(0); }; + void SortKeys() override { assert(0); }; - virtual bool IsKeySelected(int key) const; - virtual void SelectKey(int key, bool select); + bool IsKeySelected(int key) const override; + void SelectKey(int key, bool select) override; - virtual int GetFlags() { return m_flags; }; - virtual bool IsMasked([[maybe_unused]] const uint32 mask) const { return false; } - virtual void SetFlags(int flags) + int GetFlags() override { return m_flags; }; + bool IsMasked([[maybe_unused]] const uint32 mask) const override { return false; } + void SetFlags(int flags) override { m_flags = flags; } @@ -79,59 +79,59 @@ public: // Get track value at specified time. // Interpolates keys if needed. ////////////////////////////////////////////////////////////////////////// - virtual void GetValue(float time, float& value, bool applyMultiplier = false); - virtual void GetValue(float time, Vec3& value, bool applyMultiplier = false); - virtual void GetValue(float time, Vec4& value, bool applyMultiplier = false); - virtual void GetValue(float time, Quat& value); - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) { assert(0); }; - virtual void GetValue([[maybe_unused]] float time, [[maybe_unused]] Maestro::AssetBlends& value) { assert(0); } + void GetValue(float time, float& value, bool applyMultiplier = false) override; + void GetValue(float time, Vec3& value, bool applyMultiplier = false) override; + void GetValue(float time, Vec4& value, bool applyMultiplier = false) override; + void GetValue(float time, Quat& value) override; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] bool& value) override { assert(0); }; + void GetValue([[maybe_unused]] float time, [[maybe_unused]] Maestro::AssetBlends& value) override { assert(0); } ////////////////////////////////////////////////////////////////////////// // Set track value at specified time. // Adds new keys if required. ////////////////////////////////////////////////////////////////////////// - virtual void SetValue(float time, const float& value, bool bDefault = false, bool applyMultiplier = false); - virtual void SetValue(float time, const Vec3& value, bool bDefault = false, bool applyMultiplier = false); - void SetValue(float time, const Vec4& value, bool bDefault = false, bool applyMultiplier = false); - virtual void SetValue(float time, const Quat& value, bool bDefault = false); - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) { assert(0); }; - virtual void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Maestro::AssetBlends& value, [[maybe_unused]] bool bDefault = false) { assert(0); } + void SetValue(float time, const float& value, bool bDefault = false, bool applyMultiplier = false) override; + void SetValue(float time, const Vec3& value, bool bDefault = false, bool applyMultiplier = false) override; + void SetValue(float time, const Vec4& value, bool bDefault = false, bool applyMultiplier = false) override; + void SetValue(float time, const Quat& value, bool bDefault = false) override; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const bool& value, [[maybe_unused]] bool bDefault = false) override { assert(0); }; + void SetValue([[maybe_unused]] float time, [[maybe_unused]] const Maestro::AssetBlends& value, [[maybe_unused]] bool bDefault = false) override { assert(0); } - virtual void OffsetKeyPosition(const Vec3& value); - virtual void UpdateKeyDataAfterParentChanged(const AZ::Transform& oldParentWorldTM, const AZ::Transform& newParentWorldTM); + void OffsetKeyPosition(const Vec3& value) override; + void UpdateKeyDataAfterParentChanged(const AZ::Transform& oldParentWorldTM, const AZ::Transform& newParentWorldTM) override; - virtual void SetTimeRange(const Range& timeRange); + void SetTimeRange(const Range& timeRange) override; - virtual bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true); + bool Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks = true) override; - virtual bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0); + bool SerializeSelection(XmlNodeRef& xmlNode, bool bLoading, bool bCopySelected = false, float fTimeOffset = 0) override; - virtual int NextKeyByTime(int key) const; + int NextKeyByTime(int key) const override; void SetSubTrackName(const int i, const AZStd::string& name) { assert (i < MAX_SUBTRACKS); m_subTrackNames[i] = name; } #ifdef MOVIESYSTEM_SUPPORT_EDITING - virtual ColorB GetCustomColor() const + ColorB GetCustomColor() const override { return m_customColor; } - virtual void SetCustomColor(ColorB color) + void SetCustomColor(ColorB color) override { m_customColor = color; m_bCustomColorSet = true; } - virtual bool HasCustomColor() const + bool HasCustomColor() const override { return m_bCustomColorSet; } - virtual void ClearCustomColor() + void ClearCustomColor() override { m_bCustomColorSet = false; } #endif - virtual void GetKeyValueRange(float& fMin, float& fMax) const + void GetKeyValueRange(float& fMin, float& fMax) const override { if (GetSubTrackCount() > 0) { m_subTracks[0]->GetKeyValueRange(fMin, fMax); } }; - virtual void SetKeyValueRange(float fMin, float fMax) + void SetKeyValueRange(float fMin, float fMax) override { for (int i = 0; i < m_nDimensions; ++i) { diff --git a/Gems/Maestro/Code/Source/Cinematics/EventTrack.h b/Gems/Maestro/Code/Source/Cinematics/EventTrack.h index afe7eb6602..6430119e5e 100644 --- a/Gems/Maestro/Code/Source/Cinematics/EventTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/EventTrack.h @@ -33,9 +33,9 @@ public: ////////////////////////////////////////////////////////////////////////// // Overrides of IAnimTrack. ////////////////////////////////////////////////////////////////////////// - void GetKeyInfo(int key, const char*& description, float& duration); - void SerializeKey(IEventKey& key, XmlNodeRef& keyNode, bool bLoading); - void SetKey(int index, IKey* key); + void GetKeyInfo(int key, const char*& description, float& duration) override; + void SerializeKey(IEventKey& key, XmlNodeRef& keyNode, bool bLoading) override; + void SetKey(int index, IKey* key) override; void InitPostLoad(IAnimSequence* sequence) override; static void Reflect(AZ::ReflectContext* context); diff --git a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h index fcc308e5c8..5878ee0269 100644 --- a/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/MaterialNode.h @@ -26,19 +26,19 @@ public: CAnimMaterialNode(const int id); static void Initialize(); - virtual void SetName(const char* name); + void SetName(const char* name) override; ////////////////////////////////////////////////////////////////////////// // Overrides from CAnimNode ////////////////////////////////////////////////////////////////////////// - void Animate(SAnimContext& ec); + void Animate(SAnimContext& ec) override; void AddTrack(IAnimTrack* track) override; ////////////////////////////////////////////////////////////////////////// // Supported tracks description. ////////////////////////////////////////////////////////////////////////// - virtual unsigned int GetParamCount() const; - virtual CAnimParamType GetParamType(unsigned int nIndex) const; + unsigned int GetParamCount() const override; + CAnimParamType GetParamType(unsigned int nIndex) const override; AZStd::string GetParamName(const CAnimParamType& paramType) const override; virtual void GetKeyValueRange(float& fMin, float& fMax) const { fMin = m_fMinKeyValue; fMax = m_fMaxKeyValue; }; @@ -49,7 +49,7 @@ public: static void Reflect(AZ::ReflectContext* context); protected: - virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; + bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const override; void UpdateDynamicParamsInternal() override; private: diff --git a/Gems/Maestro/Code/Source/Cinematics/Movie.h b/Gems/Maestro/Code/Source/Cinematics/Movie.h index 8ab888178d..15295da353 100644 --- a/Gems/Maestro/Code/Source/Cinematics/Movie.h +++ b/Gems/Maestro/Code/Source/Cinematics/Movie.h @@ -42,7 +42,7 @@ class CLightAnimWrapper { public: // ILightAnimWrapper interface - virtual bool Resolve(); + bool Resolve() override; public: static CLightAnimWrapper* Create(const char* name); @@ -80,116 +80,116 @@ public: CMovieSystem(ISystem* system); CMovieSystem(); - void Release() { delete this; }; + void Release() override { delete this; }; - void SetUser(IMovieUser* pUser) { m_pUser = pUser; } - IMovieUser* GetUser() { return m_pUser; } + void SetUser(IMovieUser* pUser) override { m_pUser = pUser; } + IMovieUser* GetUser() override { return m_pUser; } - ISystem* GetSystem() { return m_pSystem; } + ISystem* GetSystem() override { return m_pSystem; } - IAnimSequence* CreateSequence(const char* sequence, bool bLoad = false, uint32 id = 0, SequenceType = kSequenceTypeDefault, AZ::EntityId entityId = AZ::EntityId()); + IAnimSequence* CreateSequence(const char* sequence, bool bLoad = false, uint32 id = 0, SequenceType = kSequenceTypeDefault, AZ::EntityId entityId = AZ::EntityId()) override; - void AddSequence(IAnimSequence* pSequence); - void RemoveSequence(IAnimSequence* pSequence); + void AddSequence(IAnimSequence* pSequence) override; + void RemoveSequence(IAnimSequence* pSequence) override; IAnimSequence* FindLegacySequenceByName(const char* sequence) const override; IAnimSequence* FindSequence(const AZ::EntityId& componentEntitySequenceId) const override; IAnimSequence* FindSequenceById(uint32 id) const override; - IAnimSequence* GetSequence(int i) const; - int GetNumSequences() const; - IAnimSequence* GetPlayingSequence(int i) const; - int GetNumPlayingSequences() const; - bool IsCutScenePlaying() const; + IAnimSequence* GetSequence(int i) const override; + int GetNumSequences() const override; + IAnimSequence* GetPlayingSequence(int i) const override; + int GetNumPlayingSequences() const override; + bool IsCutScenePlaying() const override; uint32 GrabNextSequenceId() override { return m_nextSequenceId++; } void OnSetSequenceId(uint32 sequenceId) override; - int OnSequenceRenamed(const char* before, const char* after); - int OnCameraRenamed(const char* before, const char* after); + int OnSequenceRenamed(const char* before, const char* after) override; + int OnCameraRenamed(const char* before, const char* after) override; - bool AddMovieListener(IAnimSequence* pSequence, IMovieListener* pListener); - bool RemoveMovieListener(IAnimSequence* pSequence, IMovieListener* pListener); + bool AddMovieListener(IAnimSequence* pSequence, IMovieListener* pListener) override; + bool RemoveMovieListener(IAnimSequence* pSequence, IMovieListener* pListener) override; - void RemoveAllSequences(); + void RemoveAllSequences() override; ////////////////////////////////////////////////////////////////////////// // Sequence playback. ////////////////////////////////////////////////////////////////////////// void PlaySequence(const char* sequence, IAnimSequence* parentSeq = NULL, bool bResetFX = true, - bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX); + bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX) override; void PlaySequence(IAnimSequence* seq, IAnimSequence* parentSeq = NULL, bool bResetFX = true, - bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX); - void PlayOnLoadSequences(); + bool bTrackedSequence = false, float startTime = -FLT_MAX, float endTime = -FLT_MAX) override; + void PlayOnLoadSequences() override; - bool StopSequence(const char* sequence); - bool StopSequence(IAnimSequence* seq); - bool AbortSequence(IAnimSequence* seq, bool bLeaveTime = false); + bool StopSequence(const char* sequence) override; + bool StopSequence(IAnimSequence* seq) override; + bool AbortSequence(IAnimSequence* seq, bool bLeaveTime = false) override; - void StopAllSequences(); - void StopAllCutScenes(); + void StopAllSequences() override; + void StopAllCutScenes() override; void Pause(bool bPause); - void Reset(bool bPlayOnReset, bool bSeekToStart); - void StillUpdate(); - void PreUpdate(const float dt); - void PostUpdate(const float dt); - void Render(); + void Reset(bool bPlayOnReset, bool bSeekToStart) override; + void StillUpdate() override; + void PreUpdate(const float dt) override; + void PostUpdate(const float dt) override; + void Render() override; - void EnableFixedStepForCapture(float step); - void DisableFixedStepForCapture(); - void StartCapture(const ICaptureKey& key, int frame); - void EndCapture(); - void ControlCapture(); - bool IsCapturing() const; + void EnableFixedStepForCapture(float step) override; + void DisableFixedStepForCapture() override; + void StartCapture(const ICaptureKey& key, int frame) override; + void EndCapture() override; + void ControlCapture() override; + bool IsCapturing() const override; - bool IsPlaying(IAnimSequence* seq) const; + bool IsPlaying(IAnimSequence* seq) const override; - void Pause(); - void Resume(); + void Pause() override; + void Resume() override; - virtual void PauseCutScenes(); - virtual void ResumeCutScenes(); + void PauseCutScenes() override; + void ResumeCutScenes() override; - void SetRecording(bool recording) { m_bRecording = recording; }; - bool IsRecording() const { return m_bRecording; }; + void SetRecording(bool recording) override { m_bRecording = recording; }; + bool IsRecording() const override { return m_bRecording; }; - void EnableCameraShake(bool bEnabled){ m_bEnableCameraShake = bEnabled; }; + void EnableCameraShake(bool bEnabled) override{ m_bEnableCameraShake = bEnabled; }; - void SetCallback(IMovieCallback* pCallback) { m_pCallback = pCallback; } - IMovieCallback* GetCallback() { return m_pCallback; } + void SetCallback(IMovieCallback* pCallback) override { m_pCallback = pCallback; } + IMovieCallback* GetCallback() override { return m_pCallback; } void Callback(IMovieCallback::ECallbackReason Reason, IAnimNode* pNode); - const SCameraParams& GetCameraParams() const { return m_ActiveCameraParams; } - void SetCameraParams(const SCameraParams& Params); + const SCameraParams& GetCameraParams() const override { return m_ActiveCameraParams; } + void SetCameraParams(const SCameraParams& Params) override; - void SendGlobalEvent(const char* pszEvent); - void SetSequenceStopBehavior(ESequenceStopBehavior behavior); - IMovieSystem::ESequenceStopBehavior GetSequenceStopBehavior(); + void SendGlobalEvent(const char* pszEvent) override; + void SetSequenceStopBehavior(ESequenceStopBehavior behavior) override; + IMovieSystem::ESequenceStopBehavior GetSequenceStopBehavior() override; - float GetPlayingTime(IAnimSequence* pSeq); - bool SetPlayingTime(IAnimSequence* pSeq, float fTime); + float GetPlayingTime(IAnimSequence* pSeq) override; + bool SetPlayingTime(IAnimSequence* pSeq, float fTime) override; - float GetPlayingSpeed(IAnimSequence* pSeq); - bool SetPlayingSpeed(IAnimSequence* pSeq, float fTime); + float GetPlayingSpeed(IAnimSequence* pSeq) override; + bool SetPlayingSpeed(IAnimSequence* pSeq, float fTime) override; - bool GetStartEndTime(IAnimSequence* pSeq, float& fStartTime, float& fEndTime); - bool SetStartEndTime(IAnimSequence* pSeq, const float fStartTime, const float fEndTime); + bool GetStartEndTime(IAnimSequence* pSeq, float& fStartTime, float& fEndTime) override; + bool SetStartEndTime(IAnimSequence* pSeq, const float fStartTime, const float fEndTime) override; - void GoToFrame(const char* seqName, float targetFrame); + void GoToFrame(const char* seqName, float targetFrame) override; - const char* GetOverrideCamName() const + const char* GetOverrideCamName() const override { return m_mov_overrideCam->GetString(); } - virtual bool IsPhysicsEventsEnabled() const { return m_bPhysicsEventsEnabled; } - virtual void EnablePhysicsEvents(bool enable) { m_bPhysicsEventsEnabled = enable; } + bool IsPhysicsEventsEnabled() const override { return m_bPhysicsEventsEnabled; } + void EnablePhysicsEvents(bool enable) override { m_bPhysicsEventsEnabled = enable; } - virtual void EnableBatchRenderMode(bool bOn) { m_bBatchRenderMode = bOn; } - virtual bool IsInBatchRenderMode() const { return m_bBatchRenderMode; } + void EnableBatchRenderMode(bool bOn) override { m_bBatchRenderMode = bOn; } + bool IsInBatchRenderMode() const override { return m_bBatchRenderMode; } void SerializeNodeType(AnimNodeType& animNodeType, XmlNodeRef& xmlNode, bool bLoading, const uint version, int flags) override; - virtual void LoadParamTypeFromXml(CAnimParamType& animParamType, const XmlNodeRef& xmlNode, const uint version) override; - virtual void SaveParamTypeToXml(const CAnimParamType& animParamType, XmlNodeRef& xmlNode) override; - virtual void SerializeParamType(CAnimParamType& animParamType, XmlNodeRef& xmlNode, bool bLoading, const uint version); + void LoadParamTypeFromXml(CAnimParamType& animParamType, const XmlNodeRef& xmlNode, const uint version) override; + void SaveParamTypeToXml(const CAnimParamType& animParamType, XmlNodeRef& xmlNode) override; + void SerializeParamType(CAnimParamType& animParamType, XmlNodeRef& xmlNode, bool bLoading, const uint version) override; static const char* GetParamTypeName(const CAnimParamType& animParamType); @@ -226,8 +226,8 @@ private: void UpdateInternal(const float dt, const bool bPreUpdate); #ifdef MOVIESYSTEM_SUPPORT_EDITING - virtual AnimNodeType GetNodeTypeFromString(const char* pString) const; - virtual CAnimParamType GetParamTypeFromString(const char* pString) const; + AnimNodeType GetNodeTypeFromString(const char* pString) const override; + CAnimParamType GetParamTypeFromString(const char* pString) const override; #endif ISystem* m_pSystem; diff --git a/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp b/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp index 10014a8700..b93215d397 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp +++ b/Gems/Maestro/Code/Source/Cinematics/SceneNode.cpp @@ -89,13 +89,13 @@ namespace { AZ::Quaternion quat = LYQuaternionToAZQuaternion(localRotation); AZ::TransformBus::Event(m_cameraEntityId, &AZ::TransformBus::Events::SetLocalRotationQuaternion, quat); } - float GetFoV() const + float GetFoV() const override { float retFoV = DEFAULT_FOV; Camera::CameraRequestBus::EventResult(retFoV, m_cameraEntityId, &Camera::CameraComponentRequests::GetFovDegrees); return retFoV; } - float GetNearZ() const + float GetNearZ() const override { float retNearZ = DEFAULT_NEAR; Camera::CameraRequestBus::EventResult(retNearZ, m_cameraEntityId, &Camera::CameraComponentRequests::GetNearClipDistance); diff --git a/Gems/Maestro/Code/Source/Cinematics/SceneNode.h b/Gems/Maestro/Code/Source/Cinematics/SceneNode.h index d4d0410728..c577839fce 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SceneNode.h +++ b/Gems/Maestro/Code/Source/Cinematics/SceneNode.h @@ -65,12 +65,12 @@ public: ////////////////////////////////////////////////////////////////////////// // Overrides from CAnimNode ////////////////////////////////////////////////////////////////////////// - void Animate(SAnimContext& ec); - void CreateDefaultTracks(); + void Animate(SAnimContext& ec) override; + void CreateDefaultTracks() override; - virtual void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks); + void Serialize(XmlNodeRef& xmlNode, bool bLoading, bool bLoadEmptyTracks) override; - virtual void Activate(bool bActivate); + void Activate(bool bActivate) override; // overridden from IAnimNode/CAnimNode void OnStart() override; @@ -80,11 +80,11 @@ public: void OnLoop() override; ////////////////////////////////////////////////////////////////////////// - virtual unsigned int GetParamCount() const; - virtual CAnimParamType GetParamType(unsigned int nIndex) const; + unsigned int GetParamCount() const override; + CAnimParamType GetParamType(unsigned int nIndex) const override; - virtual void PrecacheStatic(float startTime) override; - virtual void PrecacheDynamic(float time) override; + void PrecacheStatic(float startTime) override; + void PrecacheDynamic(float time) override; static void Reflect(AZ::ReflectContext* context); @@ -92,7 +92,7 @@ public: static IAnimSequence* GetSequenceFromSequenceKey(const ISequenceKey& sequenceKey); protected: - virtual bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const; + bool GetParamInfoFromType(const CAnimParamType& paramId, SParamInfo& info) const override; void ResetSounds() override; void ReleaseSounds(); // Stops audio @@ -111,7 +111,7 @@ private: void InterpolateCameras(SCameraParams& retInterpolatedCameraParams, ISceneCamera* firstCamera, ISelectKey& firstKey, ISelectKey& secondKey, float time); - virtual void InitializeTrackDefaultValue(IAnimTrack* pTrack, const CAnimParamType& paramType) override; + void InitializeTrackDefaultValue(IAnimTrack* pTrack, const CAnimParamType& paramType) override; // Cached parameters of node at given time. float m_time = 0.0f; diff --git a/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h b/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h index 410dd41e2c..b5cb81dbc6 100644 --- a/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/ScreenFaderTrack.h @@ -30,8 +30,8 @@ public: //----------------------------------------------------------------------------- //! IAnimTrack Method Overriding. //----------------------------------------------------------------------------- - virtual void GetKeyInfo(int key, const char*& description, float& duration); - virtual void SerializeKey(IScreenFaderKey& key, XmlNodeRef& keyNode, bool bLoading); + void GetKeyInfo(int key, const char*& description, float& duration) override; + void SerializeKey(IScreenFaderKey& key, XmlNodeRef& keyNode, bool bLoading) override; void SetFlags(int flags) override; void PreloadTextures(); diff --git a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h index c55b2de520..435eccfb0b 100644 --- a/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/SoundTrack.h @@ -29,11 +29,11 @@ public: AZ_CLASS_ALLOCATOR(CSoundTrack, AZ::SystemAllocator, 0); AZ_RTTI(CSoundTrack, "{B87D8805-F583-4154-B554-45518BC487F4}", IAnimTrack); - void GetKeyInfo(int key, const char*& description, float& duration); - void SerializeKey(ISoundKey& key, XmlNodeRef& keyNode, bool bLoading); + void GetKeyInfo(int key, const char*& description, float& duration) override; + void SerializeKey(ISoundKey& key, XmlNodeRef& keyNode, bool bLoading) override; //! Check if track is masked - virtual bool IsMasked(const uint32 mask) const { return (mask & eTrackMask_MaskSound) != 0; } + bool IsMasked(const uint32 mask) const override { return (mask & eTrackMask_MaskSound) != 0; } bool UsesMute() const override { return true; } diff --git a/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h b/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h index 13a6549220..b0a7de63a7 100644 --- a/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/TrackEventTrack.h @@ -70,9 +70,9 @@ public: ////////////////////////////////////////////////////////////////////////// // Overrides of IAnimTrack. ////////////////////////////////////////////////////////////////////////// - void GetKeyInfo(int key, const char*& description, float& duration); - void SerializeKey(IEventKey& key, XmlNodeRef& keyNode, bool bLoading); - void SetKey(int index, IKey* key); + void GetKeyInfo(int key, const char*& description, float& duration) override; + void SerializeKey(IEventKey& key, XmlNodeRef& keyNode, bool bLoading) override; + void SetKey(int index, IKey* key) override; void InitPostLoad(IAnimSequence* sequence) override; static void Reflect(AZ::ReflectContext* context); diff --git a/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h b/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h index 83caaeea19..76b21faff4 100644 --- a/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h +++ b/Gems/Maestro/Code/Source/Components/EditorSequenceComponent.h @@ -78,7 +78,7 @@ namespace Maestro ////////////////////////////////////////////////////////////////////////// // TickBus - used to refresh property displays when values are animated - virtual void OnTick(float deltaTime, AZ::ScriptTimePoint time); + void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; ////////////////////////////////////////////////////////////////////////// // TODO - this should be on a Bus, right? From 61247f8019b99248a0be9cf47632686294828b2b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:22:37 -0700 Subject: [PATCH 266/355] Gems/PhysX Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/PhysX/Code/Source/EditorColliderComponent.h | 2 +- Gems/PhysX/Code/Source/EditorShapeColliderComponent.h | 2 +- .../PhysXCharacters/Components/CharacterControllerComponent.h | 2 +- Gems/PhysX/Code/Source/Pipeline/HeightFieldAssetHandler.h | 2 +- Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.h | 2 +- Gems/PhysX/Code/Tests/TestColliderComponent.h | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.h b/Gems/PhysX/Code/Source/EditorColliderComponent.h index 50cf9d0c8b..1331fd08b6 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.h +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.h @@ -144,7 +144,7 @@ namespace PhysX void OnDeselected() override; // DisplayCallback - void Display(AzFramework::DebugDisplayRequests& debugDisplay) const; + void Display(AzFramework::DebugDisplayRequests& debugDisplay) const override; void DisplayMeshCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; void DisplayUnscaledPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; void DisplayScaledPrimitiveCollider(AzFramework::DebugDisplayRequests& debugDisplay) const; diff --git a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h index 47da6eb772..792d3c4327 100644 --- a/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h +++ b/Gems/PhysX/Code/Source/EditorShapeColliderComponent.h @@ -129,7 +129,7 @@ namespace PhysX void OnShapeChanged(LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons changeReason) override; // DisplayCallback - void Display(AzFramework::DebugDisplayRequests& debugDisplay) const; + void Display(AzFramework::DebugDisplayRequests& debugDisplay) const override; // ColliderShapeRequestBus AZ::Aabb GetColliderShapeAabb() override; diff --git a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h index a5b64c9c76..02de77568e 100644 --- a/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h +++ b/Gems/PhysX/Code/Source/PhysXCharacters/Components/CharacterControllerComponent.h @@ -108,7 +108,7 @@ namespace PhysX // CharacterControllerRequestBus void Resize(float height) override; float GetHeight() override; - void SetHeight(float height); + void SetHeight(float height) override; float GetRadius() override; void SetRadius(float radius) override; float GetHalfSideExtent() override; diff --git a/Gems/PhysX/Code/Source/Pipeline/HeightFieldAssetHandler.h b/Gems/PhysX/Code/Source/Pipeline/HeightFieldAssetHandler.h index eb99a7e306..b1f55027b8 100644 --- a/Gems/PhysX/Code/Source/Pipeline/HeightFieldAssetHandler.h +++ b/Gems/PhysX/Code/Source/Pipeline/HeightFieldAssetHandler.h @@ -52,7 +52,7 @@ namespace PhysX // AZ::AssetTypeInfoBus AZ::Data::AssetType GetAssetType() const override; void GetAssetTypeExtensions(AZStd::vector& extensions) override; - const char* GetAssetTypeDisplayName() const; + const char* GetAssetTypeDisplayName() const override; const char* GetBrowserIcon() const override; const char* GetGroup() const override; AZ::Uuid GetComponentTypeId() const override; diff --git a/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.h b/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.h index ccaddc0c86..0cb8a58b65 100644 --- a/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.h +++ b/Gems/PhysX/Code/Source/Pipeline/MeshAssetHandler.h @@ -48,7 +48,7 @@ namespace PhysX // AZ::AssetTypeInfoBus AZ::Data::AssetType GetAssetType() const override; void GetAssetTypeExtensions(AZStd::vector& extensions) override; - const char* GetAssetTypeDisplayName() const; + const char* GetAssetTypeDisplayName() const override; const char* GetBrowserIcon() const override; const char* GetGroup() const override; AZ::Uuid GetComponentTypeId() const override; diff --git a/Gems/PhysX/Code/Tests/TestColliderComponent.h b/Gems/PhysX/Code/Tests/TestColliderComponent.h index 4df96a9ff1..91d3f16122 100644 --- a/Gems/PhysX/Code/Tests/TestColliderComponent.h +++ b/Gems/PhysX/Code/Tests/TestColliderComponent.h @@ -49,7 +49,7 @@ namespace UnitTest m_componentModeDelegate.Disconnect(); } - void SetColliderOffset(const AZ::Vector3& offset) { m_offset = offset; } + void SetColliderOffset(const AZ::Vector3& offset) override { m_offset = offset; } AZ::Vector3 GetColliderOffset() override { return m_offset; } void SetColliderRotation(const AZ::Quaternion& rotation) override { m_rotation = rotation; } AZ::Quaternion GetColliderRotation() override { return m_rotation; } From 5cb3ccfbada02b5a2a3dd94d0fe467cc6210d753 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:23:21 -0700 Subject: [PATCH 267/355] Gems/PythonAssetBuilder Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../PythonAssetBuilder/Code/Tests/PythonBuilderTestShared.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Gems/PythonAssetBuilder/Code/Tests/PythonBuilderTestShared.h b/Gems/PythonAssetBuilder/Code/Tests/PythonBuilderTestShared.h index 3a16e28ee0..eb01d5011b 100644 --- a/Gems/PythonAssetBuilder/Code/Tests/PythonBuilderTestShared.h +++ b/Gems/PythonAssetBuilder/Code/Tests/PythonBuilderTestShared.h @@ -37,7 +37,7 @@ namespace UnitTest return response; } - AssetBuilderSDK::ProcessJobResponse OnProcessJobRequest(const AssetBuilderSDK::ProcessJobRequest& request) + AssetBuilderSDK::ProcessJobResponse OnProcessJobRequest(const AssetBuilderSDK::ProcessJobRequest& request) override { if (request.m_sourceFileUUID.IsNull()) { @@ -49,12 +49,12 @@ namespace UnitTest return response; } - void OnShutdown() + void OnShutdown() override { ++m_onShutdownCount; } - void OnCancel() + void OnCancel() override { ++m_onCancelCount; } From e317585e60534cb5669edb74e060576c1d7fe658 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:23:35 -0700 Subject: [PATCH 268/355] Gems/SceneLoggingExample Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h | 4 ++-- .../Code/Processors/LoadingTrackingProcessor.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h b/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h index ae1989a284..a3ed7c1b20 100644 --- a/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h +++ b/Gems/SceneLoggingExample/Code/Behaviors/LoggingGroupBehavior.h @@ -28,8 +28,8 @@ namespace SceneLoggingExample ~LoggingGroupBehavior() override = default; - void Activate(); - void Deactivate(); + void Activate() override; + void Deactivate() override; static void Reflect(AZ::ReflectContext* context); void GetCategoryAssignments(CategoryRegistrationList& categories, const AZ::SceneAPI::Containers::Scene& scene) override; diff --git a/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h b/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h index d6480b7dcd..959098cb97 100644 --- a/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h +++ b/Gems/SceneLoggingExample/Code/Processors/LoadingTrackingProcessor.h @@ -34,7 +34,7 @@ namespace SceneLoggingExample RequestingApplication requester) override; AZ::SceneAPI::Events::LoadingResult LoadAsset(AZ::SceneAPI::Containers::Scene& scene, const AZStd::string& path, const AZ::Uuid& guid, RequestingApplication requester) override; - void FinalizeAssetLoading(AZ::SceneAPI::Containers::Scene& scene, RequestingApplication requester); + void FinalizeAssetLoading(AZ::SceneAPI::Containers::Scene& scene, RequestingApplication requester) override; AZ::SceneAPI::Events::ProcessingResult UpdateManifest(AZ::SceneAPI::Containers::Scene& scene, ManifestAction action, RequestingApplication requester) override; From 1d53200eda77a0aa8db7edd65ed4f9bab3fd26e5 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:23:49 -0700 Subject: [PATCH 269/355] Gems/SceneProcessing Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Config/SettingsObjects/FileSoftNameSetting.h | 2 +- .../Code/Source/Config/Widgets/GraphTypeSelector.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gems/SceneProcessing/Code/Source/Config/SettingsObjects/FileSoftNameSetting.h b/Gems/SceneProcessing/Code/Source/Config/SettingsObjects/FileSoftNameSetting.h index d6dcdb9de9..15c407a0cb 100644 --- a/Gems/SceneProcessing/Code/Source/Config/SettingsObjects/FileSoftNameSetting.h +++ b/Gems/SceneProcessing/Code/Source/Config/SettingsObjects/FileSoftNameSetting.h @@ -68,7 +68,7 @@ namespace AZ const char* virtualType, bool inclusive, std::initializer_list graphTypes); ~FileSoftNameSetting() override = default; - bool IsVirtualType(const SceneAPI::Containers::Scene& scene, SceneAPI::Containers::SceneGraph::NodeIndex node) const; + bool IsVirtualType(const SceneAPI::Containers::Scene& scene, SceneAPI::Containers::SceneGraph::NodeIndex node) const override; static void Reflect(AZ::ReflectContext* context); diff --git a/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h b/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h index 19ab410384..813f791310 100644 --- a/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h +++ b/Gems/SceneProcessing/Code/Source/Config/Widgets/GraphTypeSelector.h @@ -32,7 +32,7 @@ namespace AZ QWidget* CreateGUI(QWidget* parent) override; u32 GetHandlerName() const override; - bool AutoDelete() const; + bool AutoDelete() const override; bool IsDefaultHandler() const override; From 711b332ebe1fe84270afc660f8f2bc5d61761d87 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:24:15 -0700 Subject: [PATCH 270/355] Gems/ScriptCanvas* Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Editor/Assets/ScriptCanvasAssetTracker.h | 2 +- .../Framework/ScriptCanvasTraceUtilities.h | 18 +++++++++--------- .../Components/DynamicSlotComponent.h | 6 +++--- .../GraphCanvas/Components/MappingComponent.h | 8 ++++---- .../NodeDescriptors/NodeDescriptorComponent.h | 6 +++--- ...EventReceiverEventNodeDescriptorComponent.h | 2 +- .../VariableNodeDescriptorComponent.h | 2 +- .../ScriptCanvasColorDataInterface.h | 2 +- .../ScriptCanvasVariableDataInterface.h | 14 +++++++------- .../ScriptCanvasVectorDataInterface.h | 2 +- ...ptCanvasEnumComboBoxPropertyDataInterface.h | 2 +- .../ScriptCanvasPropertyDataInterface.h | 2 +- .../ScriptCanvas/Assets/ScriptCanvasAsset.h | 4 ++-- .../ScriptCanvas/Components/EditorGraph.h | 6 +++--- .../ScriptCanvas/Components/GraphUpgrade.h | 2 +- Gems/ScriptCanvas/Code/Editor/Settings.h | 2 +- .../View/EditCtrls/GenericLineEditCtrl.h | 2 +- .../ScriptCanvas/Code/Editor/SystemComponent.h | 4 ++-- .../Code/Editor/View/Widgets/CanvasWidget.h | 2 +- .../LoggingAssetDataAggregator.h | 18 +++++++++--------- .../LiveLoggingDataAggregator.h | 4 ++-- .../LiveLoggingWindowSession.h | 4 ++-- .../LoggingPanel/LoggingDataAggregator.h | 2 +- .../LoggingPanel/LoggingWindowTreeItems.h | 2 +- .../FunctionNodePaletteTreeItemTypes.h | 4 ++-- .../ScriptEventsNodePaletteTreeItemTypes.h | 4 ++-- .../SpecializedNodePaletteTreeItemTypes.h | 4 ++-- .../VariablePanel/GraphVariablesTableView.h | 2 +- .../Code/Editor/View/Windows/MainWindow.h | 14 +++++++------- .../Code/Include/ScriptCanvas/Core/Graph.h | 6 +++--- .../DataValidation/InvalidVariableTypeEvent.h | 8 ++++---- .../DataValidation/ScopedDataConnectionEvent.h | 8 ++++---- .../ScriptEventVersionMismatch.h | 8 ++++---- .../DataValidation/UnknownEndpointEvent.h | 2 +- .../ExecutionValidation/UnusedNodeEvent.h | 2 +- .../ParsingValidation/ParsingValidations.h | 2 +- .../Internal/Nodes/StringFormatted.h | 4 +--- .../Libraries/Core/EBusEventHandler.h | 4 ++-- .../ScriptCanvas/Libraries/Core/Method.h | 2 +- .../ScriptCanvas/Libraries/Logic/Cycle.h | 4 ++-- .../ScriptCanvas/Libraries/Logic/IsNull.h | 2 +- .../Libraries/Logic/OrderedSequencer.h | 4 ++-- .../Libraries/Logic/TargetedSequencer.h | 4 ++-- .../Libraries/Logic/WeightedRandomSequencer.h | 2 +- .../Include/ScriptCanvas/SystemComponent.h | 2 +- .../Code/scriptcanvasgem_debugger_files.cmake | 1 + .../CreateElementsActions.h | 6 +++--- .../ScriptCanvasActions/ElementInteractions.h | 8 ++++---- .../ScriptCanvasActions/VariableActions.h | 4 ++-- .../EditorAutomationStates/EditorViewStates.h | 2 +- .../Include/ScriptCanvasDeveloperEditor/Mock.h | 2 +- .../ScriptCanvasDeveloperEditor/WrapperMock.h | 2 +- .../Editor/Source/EditorAutomationTestDialog.h | 2 +- .../EditorAutomationTests/GraphCreationTests.h | 4 ++-- .../Framework/ScriptCanvasTestUtilities.h | 2 +- .../Code/Source/ScriptCanvasTestBus.cpp | 2 +- .../Code/Tests/ScriptCanvas_MethodOverload.cpp | 2 +- 57 files changed, 123 insertions(+), 124 deletions(-) diff --git a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetTracker.h b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetTracker.h index 6101f292a1..4850e669ff 100644 --- a/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetTracker.h +++ b/Gems/ScriptCanvas/Code/Editor/Assets/ScriptCanvasAssetTracker.h @@ -86,7 +86,7 @@ namespace ScriptCanvasEditor void UpdateFileState(AZ::Data::AssetId assetId, Tracker::ScriptCanvasFileState state) override; AssetTrackerRequests::AssetList GetUnsavedAssets() override; - AssetTrackerRequests::AssetList GetAssets(); + AssetTrackerRequests::AssetList GetAssets() override; AssetTrackerRequests::AssetList GetAssetsIf(AZStd::function pred = []() { return true; }) override; AZ::EntityId GetSceneEntityIdFromEditorEntityId(AZ::Data::AssetId assetId, AZ::EntityId editorEntityId) override; diff --git a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasTraceUtilities.h b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasTraceUtilities.h index e9a850a2a4..a87f4450c2 100644 --- a/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasTraceUtilities.h +++ b/Gems/ScriptCanvas/Code/Editor/Framework/ScriptCanvasTraceUtilities.h @@ -128,15 +128,15 @@ namespace ScriptCanvasEditor } } - bool OnPreAssert(const char*, int, const char*, const char*) { return suppressPreAssert; } - bool OnAssert(const char*) { return suppressAssert; } - bool OnException(const char*) { return suppressException; } - bool OnPreError(const char*, const char*, int, const char*, const char*) { return suppressPreError; } - bool OnError(const char*, const char*) { return suppressError; } - bool OnPreWarning(const char*, const char*, int, const char*, const char*) { return suppressPreWarning; } - bool OnWarning(const char*, const char*) { return suppressWarning; } - bool OnPrintf(const char*, const char*) { return suppressPrintf; } - bool OnOutput(const char*, const char*) { return suppressAllOutput; } + bool OnPreAssert(const char*, int, const char*, const char*) override { return suppressPreAssert; } + bool OnAssert(const char*) override { return suppressAssert; } + bool OnException(const char*) override { return suppressException; } + bool OnPreError(const char*, const char*, int, const char*, const char*) override { return suppressPreError; } + bool OnError(const char*, const char*) override { return suppressError; } + bool OnPreWarning(const char*, const char*, int, const char*, const char*) override { return suppressPreWarning; } + bool OnWarning(const char*, const char*) override { return suppressWarning; } + bool OnPrintf(const char*, const char*) override { return suppressPrintf; } + bool OnOutput(const char*, const char*) override { return suppressAllOutput; } void SuppressPreAssert(bool suppress) override { suppressPreAssert = suppress; } void SuppressAssert(bool suppress)override { suppressAssert = suppress; } diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicSlotComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicSlotComponent.h index 5f1372d8c3..a30e6c999f 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicSlotComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/DynamicSlotComponent.h @@ -33,9 +33,9 @@ namespace ScriptCanvasEditor ~DynamicSlotComponent() override = default; // AZ::Component - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // GraphCanvas::SceneMemberNotificationBus diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/MappingComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/MappingComponent.h index f5345f8bc8..fdc5ebc9fa 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/MappingComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/MappingComponent.h @@ -31,8 +31,8 @@ namespace ScriptCanvasEditor SceneMemberMappingComponent(const AZ::EntityId& sourceId); ~SceneMemberMappingComponent() = default; - void Activate(); - void Deactivate(); + void Activate() override; + void Deactivate() override; // SceneMemberMappingConfigurationRequestBus void ConfigureMapping(const AZ::EntityId& scriptCanvasMemberId) override; @@ -68,8 +68,8 @@ namespace ScriptCanvasEditor SlotMappingComponent(const AZ::EntityId& sourceId); ~SlotMappingComponent() = default; - void Activate(); - void Deactivate(); + void Activate() override; + void Deactivate() override; // GraphCanvas::NodeNotificationBus void OnAddedToScene(const AZ::EntityId&) override; diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h index c885c26624..1c42d1bdb0 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/NodeDescriptorComponent.h @@ -33,9 +33,9 @@ namespace ScriptCanvasEditor ~NodeDescriptorComponent() override = default; // Component - void Init(); - void Activate(); - void Deactivate(); + void Init() override; + void Activate() override; + void Deactivate() override; //// // NodeDescriptorBus::Handler diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ScriptEventReceiverEventNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ScriptEventReceiverEventNodeDescriptorComponent.h index 7a991fc791..4a75432ad9 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ScriptEventReceiverEventNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/ScriptEventReceiverEventNodeDescriptorComponent.h @@ -74,7 +74,7 @@ namespace ScriptCanvasEditor //// // ScriptEventReceiveNodeDescriptorNotifications - void OnScriptEventReloaded(const AZ::Data::Asset& asset); + void OnScriptEventReloaded(const AZ::Data::Asset& asset) override; //// protected: diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h index 9a14a7ca23..be5eacc397 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/Components/NodeDescriptors/VariableNodeDescriptorComponent.h @@ -52,7 +52,7 @@ namespace ScriptCanvasEditor //// // VariableNodeDescriptorBus - ScriptCanvas::VariableId GetVariableId() const; + ScriptCanvas::VariableId GetVariableId() const override; //// protected: diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasColorDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasColorDataInterface.h index b7db5a4e08..37d5ba0181 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasColorDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasColorDataInterface.h @@ -131,7 +131,7 @@ namespace ScriptCanvasEditor return "vectorized"; } - virtual AZStd::string GetElementStyle(int index) const + AZStd::string GetElementStyle(int index) const override { return AZStd::string::format("vector_%i", index); } diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVariableDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVariableDataInterface.h index 7b93dc3a71..29dc17deca 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVariableDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVariableDataInterface.h @@ -88,12 +88,12 @@ namespace ScriptCanvasEditor //// // GeneralEditorNotifications - void OnUndoRedoBegin() + void OnUndoRedoBegin() override { ScriptCanvas::GraphVariableManagerNotificationBus::Handler::BusDisconnect(); } - void OnUndoRedoEnd() + void OnUndoRedoEnd() override { FinalizeActivation(); } @@ -250,7 +250,7 @@ namespace ScriptCanvasEditor } // SystemTickBus - void OnSystemTick() + void OnSystemTick() override { AZ::SystemTickBus::Handler::BusDisconnect(); AssignIndex(m_variableTypeModel.GetDefaultIndex()); @@ -440,7 +440,7 @@ namespace ScriptCanvasEditor } // SystemTickBus - void OnSystemTick() + void OnSystemTick() override { AZ::SystemTickBus::Handler::BusDisconnect(); AssignIndex(m_variableTypeModel.GetDefaultIndex()); @@ -449,7 +449,7 @@ namespace ScriptCanvasEditor //// // NodeNotificationBus - void OnSlotDisplayTypeChanged(const ScriptCanvas::SlotId& slotId, [[maybe_unused]] const ScriptCanvas::Data::Type& slotType) + void OnSlotDisplayTypeChanged(const ScriptCanvas::SlotId& slotId, [[maybe_unused]] const ScriptCanvas::Data::Type& slotType) override { if (slotId == GetSlotId()) { @@ -482,7 +482,7 @@ namespace ScriptCanvasEditor //// // EndpointNotificationBus - void OnEndpointReferenceChanged(const ScriptCanvas::VariableId& variableId) + void OnEndpointReferenceChanged(const ScriptCanvas::VariableId& variableId) override { ScriptCanvas::VariableNotificationBus::Handler::BusDisconnect(); ScriptCanvas::VariableNotificationBus::Handler::BusConnect(ScriptCanvas::GraphScopedVariableId(GetScriptCanvasId(), variableId)); @@ -490,7 +490,7 @@ namespace ScriptCanvasEditor SignalValueChanged(); } - void OnSlotRecreated() + void OnSlotRecreated() override { ScriptCanvas::Slot* slot = GetSlot(); diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h index 717022c19d..6d76d5504a 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/DataInterfaces/ScriptCanvasVectorDataInterface.h @@ -103,7 +103,7 @@ namespace ScriptCanvasEditor return "???"; } - AZStd::string GetStyle() const + AZStd::string GetStyle() const override { return "vectorized"; } diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasEnumComboBoxPropertyDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasEnumComboBoxPropertyDataInterface.h index 6faac13659..c283fc8802 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasEnumComboBoxPropertyDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasEnumComboBoxPropertyDataInterface.h @@ -50,7 +50,7 @@ namespace ScriptCanvasEditor return m_comboBoxModel.GetIndexForValue(dataValue); } - QString GetDisplayString() const + QString GetDisplayString() const override { int32_t dataValue = GetValue(); return m_comboBoxModel.GetNameForValue(dataValue); diff --git a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasPropertyDataInterface.h b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasPropertyDataInterface.h index 768773e676..f69315bc86 100644 --- a/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasPropertyDataInterface.h +++ b/Gems/ScriptCanvas/Code/Editor/GraphCanvas/PropertyInterfaces/ScriptCanvasPropertyDataInterface.h @@ -177,7 +177,7 @@ namespace ScriptCanvasEditor return m_comboBoxModel.GetIndexForValue(dataValue); } - QString GetDisplayString() const + QString GetDisplayString() const override { DataType dataValue = this->GetValue(); return m_comboBoxModel.GetNameForValue(dataValue); diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAsset.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAsset.h index 9942e349c5..fdc8cbc1d8 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAsset.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Assets/ScriptCanvasAsset.h @@ -81,8 +81,8 @@ namespace ScriptCanvasEditor ScriptCanvas::Graph* GetScriptCanvasGraph() const; using Description = ScriptCanvasAssetDescription; - ScriptCanvas::ScriptCanvasData& GetScriptCanvasData(); - const ScriptCanvas::ScriptCanvasData& GetScriptCanvasData() const; + ScriptCanvas::ScriptCanvasData& GetScriptCanvasData() override; + const ScriptCanvas::ScriptCanvasData& GetScriptCanvasData() const override; }; } diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h index cb6689091b..6f73e84493 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/EditorGraph.h @@ -248,8 +248,8 @@ namespace ScriptCanvasEditor GraphCanvas::GraphId GetGraphCanvasGraphId() const override; - AZStd::unordered_map< AZ::EntityId, GraphCanvas::EntitySaveDataContainer* > GetGraphCanvasSaveData(); - void UpdateGraphCanvasSaveData(const AZStd::unordered_map< AZ::EntityId, GraphCanvas::EntitySaveDataContainer* >& saveData); + AZStd::unordered_map< AZ::EntityId, GraphCanvas::EntitySaveDataContainer* > GetGraphCanvasSaveData() override; + void UpdateGraphCanvasSaveData(const AZStd::unordered_map< AZ::EntityId, GraphCanvas::EntitySaveDataContainer* >& saveData) override; NodeIdPair CreateCustomNode(const AZ::Uuid& typeId, const AZ::Vector2& position) override; @@ -325,7 +325,7 @@ namespace ScriptCanvasEditor } protected: - void PostRestore(const UndoData& restoredData); + void PostRestore(const UndoData& restoredData) override; void UnregisterToast(const GraphCanvas::ToastId& toastId); diff --git a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h index 89ee0f3b55..fb6e109156 100644 --- a/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h +++ b/Gems/ScriptCanvas/Code/Editor/Include/ScriptCanvas/Components/GraphUpgrade.h @@ -82,7 +82,7 @@ namespace ScriptCanvasEditor StateMachine* GetStateMachine() override { return m_stateMachine; } - virtual int GetStateId() const { return Traits::StateID(); } + int GetStateId() const override { return Traits::StateID(); } static int StateID() { return Traits::StateID(); } diff --git a/Gems/ScriptCanvas/Code/Editor/Settings.h b/Gems/ScriptCanvas/Code/Editor/Settings.h index b282e114ac..7eff40ec43 100644 --- a/Gems/ScriptCanvas/Code/Editor/Settings.h +++ b/Gems/ScriptCanvas/Code/Editor/Settings.h @@ -40,7 +40,7 @@ namespace ScriptCanvasEditor ScriptCanvasConstructPresets(); ~ScriptCanvasConstructPresets() override = default; - void InitializeConstructType(GraphCanvas::ConstructType constructType); + void InitializeConstructType(GraphCanvas::ConstructType constructType) override; }; class EditorWorkspace diff --git a/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h b/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h index 9b83819860..950fa8ef2e 100644 --- a/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h +++ b/Gems/ScriptCanvas/Code/Editor/Static/Include/ScriptCanvas/View/EditCtrls/GenericLineEditCtrl.h @@ -59,7 +59,7 @@ namespace ScriptCanvasEditor void onChildLineEditValueChange(const QString& value); protected: - virtual void focusInEvent(QFocusEvent* e); + void focusInEvent(QFocusEvent* e) override; private: QLineEdit* m_pLineEdit; diff --git a/Gems/ScriptCanvas/Code/Editor/SystemComponent.h b/Gems/ScriptCanvas/Code/Editor/SystemComponent.h index ba850401d6..3e18262c98 100644 --- a/Gems/ScriptCanvas/Code/Editor/SystemComponent.h +++ b/Gems/ScriptCanvas/Code/Editor/SystemComponent.h @@ -65,7 +65,7 @@ namespace ScriptCanvasEditor //////////////////////////////////////////////////////////////////////// // SystemRequestBus::Handler... void AddAsyncJob(AZStd::function&& jobFunc) override; - void GetEditorCreatableTypes(AZStd::unordered_set& outCreatableTypes); + void GetEditorCreatableTypes(AZStd::unordered_set& outCreatableTypes) override; void CreateEditorComponentsOnEntity(AZ::Entity* entity, const AZ::Data::AssetType& assetType) override; //////////////////////////////////////////////////////////////////////// @@ -110,7 +110,7 @@ namespace ScriptCanvasEditor //////////////////////////////////////////////////////////////////////// // IUpgradeRequests... - void ClearGraphsThatNeedUpgrade() + void ClearGraphsThatNeedUpgrade() override { m_assetsThatNeedManualUpgrade.clear(); } diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CanvasWidget.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CanvasWidget.h index 2ebc71f785..9abb41aacc 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/CanvasWidget.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/CanvasWidget.h @@ -61,7 +61,7 @@ namespace ScriptCanvasEditor protected: - void resizeEvent(QResizeEvent *ev); + void resizeEvent(QResizeEvent *ev) override; void OnClicked(); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetDataAggregator.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetDataAggregator.h index ae92586c4d..71efcbb017 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetDataAggregator.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/AssetWindowSession/LoggingAssetDataAggregator.h @@ -27,15 +27,15 @@ namespace ScriptCanvasEditor bool IsCapturingData() const override { return false; } protected: - void Visit(ScriptCanvas::AnnotateNodeSignal&); - void Visit(ScriptCanvas::ExecutionThreadEnd&); - void Visit(ScriptCanvas::ExecutionThreadBeginning&); - void Visit(ScriptCanvas::GraphActivation&); - void Visit(ScriptCanvas::GraphDeactivation&); - void Visit(ScriptCanvas::NodeStateChange&); - void Visit(ScriptCanvas::InputSignal&); - void Visit(ScriptCanvas::OutputSignal&); - void Visit(ScriptCanvas::VariableChange&); + void Visit(ScriptCanvas::AnnotateNodeSignal&) override; + void Visit(ScriptCanvas::ExecutionThreadEnd&) override; + void Visit(ScriptCanvas::ExecutionThreadBeginning&) override; + void Visit(ScriptCanvas::GraphActivation&) override; + void Visit(ScriptCanvas::GraphDeactivation&) override; + void Visit(ScriptCanvas::NodeStateChange&) override; + void Visit(ScriptCanvas::InputSignal&) override; + void Visit(ScriptCanvas::OutputSignal&) override; + void Visit(ScriptCanvas::VariableChange&) override; private: diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingDataAggregator.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingDataAggregator.h index d26939a217..8efeba4613 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingDataAggregator.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingDataAggregator.h @@ -38,8 +38,8 @@ namespace ScriptCanvasEditor void OnCurrentTargetChanged() override; //// - bool CanCaptureData() const; - bool IsCapturingData() const; + bool CanCaptureData() const override; + bool IsCapturingData() const override; void StartCaptureData(); void StopCaptureData(); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h index ba2e5b4a56..3fa0cf8d01 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LiveWindowSession/LiveLoggingWindowSession.h @@ -97,8 +97,8 @@ namespace ScriptCanvasEditor //// // AzToolsFramework::EditorEntityContextNotificationBus::Handler - void OnStartPlayInEditorBegin(); - void OnStopPlayInEditor(); + void OnStartPlayInEditorBegin() override; + void OnStopPlayInEditor() override; //// // ScriptCavnas::Debugger::ServiceNotificationsBus diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingDataAggregator.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingDataAggregator.h index 0e4d35e270..9892245fa4 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingDataAggregator.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingDataAggregator.h @@ -88,7 +88,7 @@ namespace ScriptCanvasEditor AZ::NamedEntityId FindNamedEntityId(const AZ::EntityId& entityId) override; //// - virtual bool IsCapturingData() const = 0; + bool IsCapturingData() const override = 0; virtual bool CanCaptureData() const = 0; // Should be bus methods, but don't want to copy data diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowTreeItems.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowTreeItems.h index 751c1c30b7..862b231f3a 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowTreeItems.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/LoggingPanel/LoggingWindowTreeItems.h @@ -115,7 +115,7 @@ namespace ScriptCanvasEditor protected: - bool OnMatchesFilter([[maybe_unused]] const DebugLogFilter& treeFilter) { return true; } + bool OnMatchesFilter([[maybe_unused]] const DebugLogFilter& treeFilter) override { return true; } UpdatePolicy m_updatePolicy; QTimer m_additionTimer; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h index b03efa5813..479fed1097 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/FunctionNodePaletteTreeItemTypes.h @@ -59,8 +59,8 @@ namespace ScriptCanvasEditor FunctionPaletteTreeItem(const char* name, const ScriptCanvas::Grammar::FunctionSourceId& sourceId, AZ::Data::Asset asset); ~FunctionPaletteTreeItem() = default; - GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const; - QVariant OnData(const QModelIndex& index, int role) const; + GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const override; + QVariant OnData(const QModelIndex& index, int role) const override; ScriptCanvas::Grammar::FunctionSourceId GetFunctionSourceId() const; AZ::Data::AssetId GetSourceAssetId() const; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.h index c3b37369ca..f47a224564 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/ScriptEventsNodePaletteTreeItemTypes.h @@ -232,8 +232,8 @@ namespace ScriptCanvasEditor ScriptEventsEventNodePaletteTreeItem(const AZ::Data::AssetId& m_assetId, const ScriptEvents::Method& methodDefinition, const ScriptCanvas::EBusEventId& eventId); ~ScriptEventsEventNodePaletteTreeItem() = default; - GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const; - QVariant OnData(const QModelIndex& index, int role) const; + GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const override; + QVariant OnData(const QModelIndex& index, int role) const override; ScriptCanvas::EBusBusId GetBusIdentifier() const; ScriptCanvas::EBusEventId GetEventIdentifier() const; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h index cfc056e705..244e2bf645 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/SpecializedNodePaletteTreeItemTypes.h @@ -25,7 +25,7 @@ namespace ScriptCanvasEditor CreateCommentNodeMimeEvent() = default; ~CreateCommentNodeMimeEvent() = default; - NodeIdPair ConstructNode(const AZ::EntityId& sceneId, const AZ::Vector2& scenePosition); + NodeIdPair ConstructNode(const AZ::EntityId& sceneId, const AZ::Vector2& scenePosition) override; bool ExecuteEvent(const AZ::Vector2& mousePosition, AZ::Vector2& sceneDropPosition, const AZ::EntityId& sceneId) override; }; @@ -54,7 +54,7 @@ namespace ScriptCanvasEditor CreateNodeGroupMimeEvent() = default; ~CreateNodeGroupMimeEvent() = default; - NodeIdPair ConstructNode(const GraphCanvas::GraphId& sceneId, const AZ::Vector2& scenePosition); + NodeIdPair ConstructNode(const GraphCanvas::GraphId& sceneId, const AZ::Vector2& scenePosition) override; bool ExecuteEvent(const AZ::Vector2& mousePosition, AZ::Vector2& sceneDropPosition, const GraphCanvas::GraphId& sceneId) override; }; diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h index 27923fbe63..962aadb8c8 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/VariablePanel/GraphVariablesTableView.h @@ -160,7 +160,7 @@ namespace ScriptCanvasEditor //// // GraphCanvas::SceneNotifications - void OnSelectionChanged(); + void OnSelectionChanged() override; //// void ApplyPreferenceSort(); diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h index d11d2f0052..ba5ff7f97f 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h +++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h @@ -272,7 +272,7 @@ namespace ScriptCanvasEditor private: // UIRequestBus QMainWindow* GetMainWindow() override { return qobject_cast(this); } - void OpenValidationPanel(); + void OpenValidationPanel() override; // // Undo Handlers @@ -299,9 +299,9 @@ namespace ScriptCanvasEditor bool ContainsGraph(const GraphCanvas::GraphId& graphId) const override; bool CloseGraph(const GraphCanvas::GraphId& graphId) override; - void CustomizeConnectionEntity(AZ::Entity* connectionEntity); + void CustomizeConnectionEntity(AZ::Entity* connectionEntity) override; - void ShowAssetPresetsMenu(GraphCanvas::ConstructType constructType); + void ShowAssetPresetsMenu(GraphCanvas::ConstructType constructType) override; GraphCanvas::ContextMenuAction::SceneReaction ShowSceneContextMenuWithGroup(const QPoint& screenPoint, const QPointF& scenePoint, AZ::EntityId groupTarget) override; @@ -327,8 +327,8 @@ namespace ScriptCanvasEditor //// //! ScriptCanvas::BatchOperationsNotificationBus - void OnCommandStarted(AZ::Crc32 commandTag); - void OnCommandFinished(AZ::Crc32 commandTag); + void OnCommandStarted(AZ::Crc32 commandTag) override; + void OnCommandFinished(AZ::Crc32 commandTag) override; // File menu void OnFileNew(); @@ -427,7 +427,7 @@ namespace ScriptCanvasEditor QVariant GetTabData(const AZ::Data::AssetId& assetId); //! GeneralRequestBus - AZ::Outcome OpenScriptCanvasAssetId(const AZ::Data::AssetId& assetId); + AZ::Outcome OpenScriptCanvasAssetId(const AZ::Data::AssetId& assetId) override; AZ::Outcome OpenScriptCanvasAsset(AZ::Data::AssetId scriptCanvasAssetId, int tabIndex = -1) override; AZ::Outcome OpenScriptCanvasAsset(const ScriptCanvasMemoryAsset& scriptCanvasAsset, int tabIndex = -1); int CloseScriptCanvasAsset(const AZ::Data::AssetId& assetId) override; @@ -497,7 +497,7 @@ namespace ScriptCanvasEditor float GetEdgePanningScrollSpeed() const override; GraphCanvas::EditorConstructPresets* GetConstructPresets() const override; - const GraphCanvas::ConstructTypePresetBucket* GetConstructTypePresetBucket(GraphCanvas::ConstructType constructType) const; + const GraphCanvas::ConstructTypePresetBucket* GetConstructTypePresetBucket(GraphCanvas::ConstructType constructType) const override; GraphCanvas::Styling::ConnectionCurveType GetConnectionCurveType() const override; GraphCanvas::Styling::ConnectionCurveType GetDataConnectionCurveType() const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.h index bb1ea21f30..46e8a103bb 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Core/Graph.h @@ -109,11 +109,11 @@ namespace ScriptCanvas //! NOTE: There can be multiple Graph components on the same entity so calling FindComponent may not not return this GraphComponent AZ::Entity* GetGraphEntity() const override { return GetEntity(); } - Graph* GetGraph() { return this; } + Graph* GetGraph() override { return this; } GraphData* GetGraphData() override { return &m_graphData; } const GraphData* GetGraphDataConst() const override { return &m_graphData; } - const VariableData* GetVariableDataConst() const { return const_cast(this)->GetVariableData(); } + const VariableData* GetVariableDataConst() const override { return const_cast(this)->GetVariableData(); } bool AddGraphData(const GraphData&) override; void RemoveGraphData(const GraphData&) override; @@ -131,7 +131,7 @@ namespace ScriptCanvas /////////////////////////////////////////////////////////// // StatusRequestBus - void ValidateGraph(ValidationResults& validationEvents); + void ValidateGraph(ValidationResults& validationEvents) override; void ReportValidationResults(ValidationResults&) override { } //// diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidVariableTypeEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidVariableTypeEvent.h index 85ce975968..602e6626a1 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidVariableTypeEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidVariableTypeEvent.h @@ -31,12 +31,12 @@ namespace ScriptCanvas SetDescription(AZStd::string::format("Variable with id %s has an invalid type.", variableId.ToString().c_str())); } - bool CanAutoFix() const + bool CanAutoFix() const override { return true; } - AZStd::string GetIdentifier() const + AZStd::string GetIdentifier() const override { return DataValidationIds::InvalidVariableTypeId; } @@ -46,12 +46,12 @@ namespace ScriptCanvas return m_variableId; } - AZ::Crc32 GetIdCrc() const + AZ::Crc32 GetIdCrc() const override { return DataValidationIds::InvalidVariableTypeCrc; } - AZStd::string_view GetTooltip() const + AZStd::string_view GetTooltip() const override { return "Invalid type for variable, auto fixing will remove all invalid variable nodes."; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScopedDataConnectionEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScopedDataConnectionEvent.h index 09c372da9a..0b2150448b 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScopedDataConnectionEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScopedDataConnectionEvent.h @@ -59,17 +59,17 @@ namespace ScriptCanvas , targetNode.GetNodeName().data())); } - bool CanAutoFix() const + bool CanAutoFix() const override { return false; } - AZStd::string GetIdentifier() const + AZStd::string GetIdentifier() const override { return DataValidationIds::ScopedDataConnectionId; } - AZ::Crc32 GetIdCrc() const + AZ::Crc32 GetIdCrc() const override { return DataValidationIds::ScopedDataConnectionCrc; } @@ -79,7 +79,7 @@ namespace ScriptCanvas return m_connectionId; } - AZStd::string_view GetTooltip() const + AZStd::string_view GetTooltip() const override { return "Out of Scope Data Connection"; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScriptEventVersionMismatch.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScriptEventVersionMismatch.h index b23c241967..c0443f9cc2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScriptEventVersionMismatch.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScriptEventVersionMismatch.h @@ -37,17 +37,17 @@ namespace ScriptCanvas SetDescription("The Script Event asset this node uses has changed. This node is no longer valid. You can fix this by deleting this node, re-adding it and reconnecting it."); } - bool CanAutoFix() const + bool CanAutoFix() const override { return false; } - AZStd::string GetIdentifier() const + AZStd::string GetIdentifier() const override { return DataValidationIds::ScriptEventVersionMismatchId; } - AZ::Crc32 GetIdCrc() const + AZ::Crc32 GetIdCrc() const override { return DataValidationIds::ScriptEventVersionMismatchCrc; } @@ -57,7 +57,7 @@ namespace ScriptCanvas return m_definition; } - AZStd::string_view GetTooltip() const + AZStd::string_view GetTooltip() const override { return "The Script Event asset has changed, you can fix this problem by deleting the out of date node and re-adding it to your graph."; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h index b654448dc6..36f12527a2 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h @@ -86,7 +86,7 @@ namespace ScriptCanvas return DataValidationIds::UnknownSourceEndpointCrc; } - AZStd::string_view GetTooltip() const + AZStd::string_view GetTooltip() const override { return "Unknown Source Endpoint"; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/UnusedNodeEvent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/UnusedNodeEvent.h index a49998e555..d2c028985f 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/UnusedNodeEvent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ExecutionValidation/UnusedNodeEvent.h @@ -60,7 +60,7 @@ namespace ScriptCanvas } // HighlightEntityEffect - AZ::EntityId GetHighlightTarget() const + AZ::EntityId GetHighlightTarget() const override { return m_nodeId; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ParsingValidation/ParsingValidations.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ParsingValidation/ParsingValidations.h index ac8f41862e..a862cca2eb 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ParsingValidation/ParsingValidations.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Debugger/ValidationEvents/ParsingValidation/ParsingValidations.h @@ -43,7 +43,7 @@ namespace ScriptCanvas } // HighlightEntityEffect - AZ::EntityId GetHighlightTarget() const + AZ::EntityId GetHighlightTarget() const override { return m_nodeId; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h index 205ae4ea60..2a327bd37d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Internal/Nodes/StringFormatted.h @@ -40,7 +40,7 @@ namespace ScriptCanvas return true; } - AZ::Outcome GetDependencies() const + AZ::Outcome GetDependencies() const override { return AZ::Success(DependencyReport{}); } @@ -49,8 +49,6 @@ namespace ScriptCanvas AZ_INLINE const NamedSlotIdMap& GetNamedSlotIdMap() const { return m_formatSlotMap; } AZ_INLINE const int GetPostDecimalPrecision() const { return m_numericPrecision; } - - protected: // This is a map that binds the index into m_unresolvedString to the SlotId that needs to be checked for a valid datum. diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h index c6d4a8b512..05419f3ec3 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/EBusEventHandler.h @@ -102,7 +102,7 @@ namespace ScriptCanvas AZ::Outcome GetFunctionCallName(const Slot* /*slot*/) const override; bool IsEBusAddressed() const override; - AZStd::optional GetEventIndex(AZStd::string eventName) const; + AZStd::optional GetEventIndex(AZStd::string eventName) const override; const EBusEventEntry* FindEvent(const AZStd::string& name) const; AZStd::string GetEBusName() const override; bool IsAutoConnected() const override; @@ -138,7 +138,7 @@ namespace ScriptCanvas void SetAutoConnectToGraphOwner(bool enabled); - void OnDeserialize(); + void OnDeserialize() override; #if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)//// void OnWriteEnd(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h index 5584212048..1f1daddc71 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Core/Method.h @@ -107,7 +107,7 @@ namespace ScriptCanvas SlotId GetBusSlotId() const; - void OnDeserialize(); + void OnDeserialize() override; #if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)//// void OnWriteEnd(); diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h index 17c203626f..7edd83794a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/Cycle.h @@ -36,9 +36,9 @@ namespace ScriptCanvas void OnConfigured() override; void ConfigureVisualExtensions() override; - bool CanDeleteSlot(const SlotId& slotId) const; + bool CanDeleteSlot(const SlotId& slotId) const override; - SlotId HandleExtension(AZ::Crc32 extensionId); + SlotId HandleExtension(AZ::Crc32 extensionId) override; AZ::Outcome GetDependencies() const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h index 71ea8870c2..24bcd8e5e5 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/IsNull.h @@ -29,7 +29,7 @@ namespace ScriptCanvas IsNull(); - AZ::Outcome GetDependencies() const; + AZ::Outcome GetDependencies() const override; bool IsIfBranch() const override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h index 10517502a5..0547f59db0 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/OrderedSequencer.h @@ -30,13 +30,13 @@ namespace ScriptCanvas OrderedSequencer(); - bool CanDeleteSlot(const SlotId& slotId) const; + bool CanDeleteSlot(const SlotId& slotId) const override; AZ::Outcome GetDependencies() const override; ConstSlotsOutcome GetSlotsInExecutionThreadByTypeImpl(const Slot& executionSlot, CombinedSlotType targetSlotType, const Slot* /*executionChildSlot*/) const override; - SlotId HandleExtension(AZ::Crc32 extensionId); + SlotId HandleExtension(AZ::Crc32 extensionId) override; void OnInit() override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h index a2c4d93ef8..f4f590751a 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/TargetedSequencer.h @@ -33,9 +33,9 @@ namespace ScriptCanvas void OnConfigured() override; void ConfigureVisualExtensions() override; - bool CanDeleteSlot(const SlotId& slotId) const; + bool CanDeleteSlot(const SlotId& slotId) const override; - SlotId HandleExtension(AZ::Crc32 extensionId); + SlotId HandleExtension(AZ::Crc32 extensionId) override; // Script Canvas Translation... bool IsSwitchStatement() const override { return true; } diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h index f9cbaac652..b51327b65d 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/Libraries/Logic/WeightedRandomSequencer.h @@ -39,7 +39,7 @@ namespace ScriptCanvas void OnInit() override; void ConfigureVisualExtensions() override; - bool OnValidateNode(ValidationResults& validationResults); + bool OnValidateNode(ValidationResults& validationResults) override; SlotId HandleExtension(AZ::Crc32 extensionId) override; diff --git a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h index f208e3b9d4..7dbde3224e 100644 --- a/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h +++ b/Gems/ScriptCanvas/Code/Include/ScriptCanvas/SystemComponent.h @@ -74,7 +74,7 @@ namespace ScriptCanvas ScriptCanvasId FindScriptCanvasId(AZ::Entity* graphEntity) override; ScriptCanvas::Node* GetNode(const AZ::EntityId&, const AZ::Uuid&) override; ScriptCanvas::Node* CreateNodeOnEntity(const AZ::EntityId& entityId, ScriptCanvasId scriptCanvasId, const AZ::Uuid& nodeType) override; - SystemComponentConfiguration GetSystemComponentConfiguration() + SystemComponentConfiguration GetSystemComponentConfiguration() override { SystemComponentConfiguration configuration; configuration.m_maxIterationsForInfiniteLoopDetection = m_infiniteLoopDetectionMaxIterations; diff --git a/Gems/ScriptCanvas/Code/scriptcanvasgem_debugger_files.cmake b/Gems/ScriptCanvas/Code/scriptcanvasgem_debugger_files.cmake index 38182dc251..0a68a9b175 100644 --- a/Gems/ScriptCanvas/Code/scriptcanvasgem_debugger_files.cmake +++ b/Gems/ScriptCanvas/Code/scriptcanvasgem_debugger_files.cmake @@ -35,6 +35,7 @@ set(FILES Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/DynamicDataTypeEvent.h Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidExpressionEvent.h Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidRandomSignalEvent.h + Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/InvalidVariableTypeEvent.h Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/ScopedDataConnectionEvent.h Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/SlotReferenceEvent.h Include/ScriptCanvas/Debugger/ValidationEvents/DataValidation/UnknownEndpointEvent.h diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/CreateElementsActions.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/CreateElementsActions.h index d2f1feb0d1..c9eda4c0bc 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/CreateElementsActions.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/CreateElementsActions.h @@ -139,7 +139,7 @@ namespace ScriptCanvasDeveloper protected: - void OnActionsComplete(); + void OnActionsComplete() override; private: @@ -222,7 +222,7 @@ namespace ScriptCanvasDeveloper CreateGroupAction(GraphCanvas::EditorId editorGraph, GraphCanvas::GraphId graphId, CreationType creationType = CreationType::Hotkey); ~CreateGroupAction() override = default; - void SetupAction(); + void SetupAction() override; // GraphCanvas::SceneNotificationBus::Handler void OnNodeAdded(const AZ::EntityId& groupId, bool isPaste = false) override; @@ -236,7 +236,7 @@ namespace ScriptCanvasDeveloper void SetupToolbarAction(); void SetupHotkeyAction(); - void OnActionsComplete(); + void OnActionsComplete() override; private: diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/ElementInteractions.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/ElementInteractions.h index 4a83ab2637..b7498ff56e 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/ElementInteractions.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/ElementInteractions.h @@ -32,7 +32,7 @@ namespace ScriptCanvasDeveloper bool IsMissingPrecondition() override; EditorAutomationAction* GenerateMissingPreconditionAction() override; - void SetupAction(); + void SetupAction() override; private: @@ -66,9 +66,9 @@ namespace ScriptCanvasDeveloper ActionReport GenerateReport() const override; // SceneNotificaitonBus - void OnNodeRemoved(const AZ::EntityId& nodeId); + void OnNodeRemoved(const AZ::EntityId& nodeId) override; - void OnConnectionRemoved(const AZ::EntityId& connectionId); + void OnConnectionRemoved(const AZ::EntityId& connectionId) override; //// protected: @@ -98,7 +98,7 @@ namespace ScriptCanvasDeveloper MouseToNodePropertyEditorAction(GraphCanvas::SlotId slotId); ~MouseToNodePropertyEditorAction() override = default; - void SetupAction(); + void SetupAction() override; private: diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/VariableActions.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/VariableActions.h index 2ce49ba3ed..a8d7165feb 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/VariableActions.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationActions/ScriptCanvasActions/VariableActions.h @@ -96,7 +96,7 @@ namespace ScriptCanvasDeveloper bool IsMissingPrecondition() override; EditorAutomationAction* GenerateMissingPreconditionAction() override; - void SetupAction(); + void SetupAction() override; // GraphCanvas::SceneNotificationBus void OnNodeAdded(const AZ::EntityId& nodeId, bool isPaste) override; @@ -146,7 +146,7 @@ namespace ScriptCanvasDeveloper ShowGraphVariablesAction() = default; ~ShowGraphVariablesAction() override = default; - void SetupAction(); + void SetupAction() override; ActionReport GenerateReport() const override; }; diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/EditorViewStates.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/EditorViewStates.h index fa7db8ce9f..daba20b8c8 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/EditorViewStates.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/EditorViewStates.h @@ -70,7 +70,7 @@ namespace ScriptCanvasDeveloper FindViewCenterState(AutomationStateModelId outputId); ~FindViewCenterState() override = default; - void OnCustomAction(); + void OnCustomAction() override; private: diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h index 221aa501a9..41eddbfc02 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/Mock.h @@ -118,7 +118,7 @@ namespace ScriptCanvasDeveloper private: //// ScriptCanvasEditor::EditorGraphNotificationBus - void OnGraphCanvasNodeDisplayed(AZ::EntityId graphCanvasEntityId); + void OnGraphCanvasNodeDisplayed(AZ::EntityId graphCanvasEntityId) override; //// AZStd::string m_nodeTitle; diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h index 4ffafbd2a5..4b0155ec29 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/WrapperMock.h @@ -52,7 +52,7 @@ namespace ScriptCanvasDeveloper void OnActionNameChanged(); - void OnClear(); + void OnClear() override; void OnNodeDisplayed(const GraphCanvas::NodeId& graphCanvasNodeId) override; private: diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTestDialog.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTestDialog.h index 84597a991c..865738eadc 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTestDialog.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTestDialog.h @@ -101,7 +101,7 @@ namespace ScriptCanvasDeveloper void RunTest(QModelIndex index); // SystemTickBus - void OnSystemTick(); + void OnSystemTick() override; //// // EditorAutomationTestDialogRequestBus::Handler diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/GraphCreationTests.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/GraphCreationTests.h index c09f219da0..c02d5cf081 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/GraphCreationTests.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Source/EditorAutomationTests/GraphCreationTests.h @@ -55,8 +55,8 @@ namespace ScriptCanvasDeveloper protected: - void OnSetupStateActions(EditorAutomationActionRunner& actionRunner); - void OnStateActionsComplete(); + void OnSetupStateActions(EditorAutomationActionRunner& actionRunner) override; + void OnStateActionsComplete() override; private: diff --git a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h index 56ecdc33a1..8272e647a3 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h +++ b/Gems/ScriptCanvasTesting/Code/Source/Framework/ScriptCanvasTestUtilities.h @@ -548,7 +548,7 @@ namespace ScriptCanvasTests bool DestroyEntityById(AZ::EntityId entityId) override; AZ::Entity* CloneEntity(const AZ::Entity& sourceEntity) override; void ResetContext() override; - AZ::EntityId FindLoadedEntityIdMapping(const AZ::EntityId& staticId) const; + AZ::EntityId FindLoadedEntityIdMapping(const AZ::EntityId& staticId) const override; //// void AddEntity(AZ::EntityId entityId); diff --git a/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp b/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp index 7ab7fa2540..c8db1169ed 100644 --- a/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp +++ b/Gems/ScriptCanvasTesting/Code/Source/ScriptCanvasTestBus.cpp @@ -237,7 +237,7 @@ namespace ScriptCanvasTesting return result; } - void Void(AZStd::string_view value) + void Void(AZStd::string_view value) override { Call(FN_Void, value); } diff --git a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_MethodOverload.cpp b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_MethodOverload.cpp index 13f6657d62..d7e5bbfb02 100644 --- a/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_MethodOverload.cpp +++ b/Gems/ScriptCanvasTesting/Code/Tests/ScriptCanvas_MethodOverload.cpp @@ -99,7 +99,7 @@ public: } } - void ConfigureSlots() + void ConfigureSlots() override { ScriptCanvas::SlotExecution::Ins ins; { From 629d836142cf6c31c9db04db6d7d50a70c210873 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:24:32 -0700 Subject: [PATCH 271/355] Gems/Script* Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Editor/ScriptEventsSystemEditorComponent.h | 2 +- .../Code/Source/ScriptedEntityTweenerModule.cpp | 2 +- .../Code/Source/ScriptedEntityTweenerSystemComponent.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gems/ScriptEvents/Code/Source/Editor/ScriptEventsSystemEditorComponent.h b/Gems/ScriptEvents/Code/Source/Editor/ScriptEventsSystemEditorComponent.h index 4365873b3a..9463b2a047 100644 --- a/Gems/ScriptEvents/Code/Source/Editor/ScriptEventsSystemEditorComponent.h +++ b/Gems/ScriptEvents/Code/Source/Editor/ScriptEventsSystemEditorComponent.h @@ -46,7 +46,7 @@ namespace ScriptEventsEditor // AssetEditorValidationRequestBus::Handler AZ::Outcome IsAssetDataValid(const AZ::Data::Asset& asset) override; - void PreAssetSave(AZ::Data::Asset asset); + void PreAssetSave(AZ::Data::Asset asset) override; void BeforePropertyEdit(AzToolsFramework::InstanceDataNode* node, AZ::Data::Asset asset) override; void SetSaveAsBinary(bool saveAsBinary) { m_saveAsBinary = saveAsBinary; } diff --git a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerModule.cpp b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerModule.cpp index 8d5057e17f..20f59b94a9 100644 --- a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerModule.cpp +++ b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerModule.cpp @@ -39,7 +39,7 @@ namespace ScriptedEntityTweener }; } - void OnSystemEvent(ESystemEvent systemEvent, UINT_PTR wparam, UINT_PTR lparam) + void OnSystemEvent(ESystemEvent systemEvent, UINT_PTR wparam, UINT_PTR lparam) override { CryHooksModule::OnSystemEvent(systemEvent, wparam, lparam); diff --git a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerSystemComponent.cpp b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerSystemComponent.cpp index f1f4977164..67a5038aec 100644 --- a/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerSystemComponent.cpp +++ b/Gems/ScriptedEntityTweener/Code/Source/ScriptedEntityTweenerSystemComponent.cpp @@ -47,7 +47,7 @@ namespace ScriptedEntityTweener Call(FN_RemoveCallback, callbackId); } - void OnTimelineAnimationStart(int timelineId, const AZ::Uuid& uuid, const AZStd::string& componentName, const AZStd::string& propertyName) + void OnTimelineAnimationStart(int timelineId, const AZ::Uuid& uuid, const AZStd::string& componentName, const AZStd::string& propertyName) override { Call(FN_OnTimelineAnimationStart, timelineId, uuid, componentName, propertyName); } From df1a6e6af9a8642107c1b9fe65e04417f15a73b0 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:26:22 -0700 Subject: [PATCH 272/355] Gems/SurfaceData Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Components/SurfaceDataShapeComponent.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.h b/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.h index 31b960c2b6..f2c478ed27 100644 --- a/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.h +++ b/Gems/SurfaceData/Code/Source/Components/SurfaceDataShapeComponent.h @@ -64,7 +64,7 @@ namespace SurfaceData ////////////////////////////////////////////////////////////////////////// // SurfaceDataProviderRequestBus - void GetSurfacePoints(const AZ::Vector3& inPosition, SurfacePointList& surfacePointList) const; + void GetSurfacePoints(const AZ::Vector3& inPosition, SurfacePointList& surfacePointList) const override; ////////////////////////////////////////////////////////////////////////// // SurfaceDataModifierRequestBus From de02f9bb553efa038f1a167f13c06e58daf0714b Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:26:35 -0700 Subject: [PATCH 273/355] Gems/Twitch Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/Twitch/Code/Source/TwitchReflection.cpp | 54 ++++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/Gems/Twitch/Code/Source/TwitchReflection.cpp b/Gems/Twitch/Code/Source/TwitchReflection.cpp index 618fb6814a..510d1d94f5 100644 --- a/Gems/Twitch/Code/Source/TwitchReflection.cpp +++ b/Gems/Twitch/Code/Source/TwitchReflection.cpp @@ -595,137 +595,137 @@ namespace Twitch StartChannelCommercial, ResetChannelStreamKey); - void UserIDNotify(const StringValue& userID) + void UserIDNotify(const StringValue& userID) override { Call(FN_UserIDNotify, userID); } - void OAuthTokenNotify(const StringValue& token) + void OAuthTokenNotify(const StringValue& token) override { Call(FN_OAuthTokenNotify, token); } - void GetUser(const UserInfoValue& result) + void GetUser(const UserInfoValue& result) override { Call(FN_GetUser, result); } - void ResetFriendsNotificationCountNotify(const Int64Value& result) + void ResetFriendsNotificationCountNotify(const Int64Value& result) override { Call(FN_ResetFriendsNotificationCountNotify, result); } - void GetFriendNotificationCount(const Int64Value& result) + void GetFriendNotificationCount(const Int64Value& result) override { Call(FN_GetFriendNotificationCount, result); } - void GetFriendRecommendations(const FriendRecommendationValue& result) + void GetFriendRecommendations(const FriendRecommendationValue& result) override { Call(FN_GetFriendRecommendations, result); } - void GetFriends(const GetFriendValue& result) + void GetFriends(const GetFriendValue& result) override { Call(FN_GetFriends, result); } - void GetFriendStatus(const FriendStatusValue& result) + void GetFriendStatus(const FriendStatusValue& result) override { Call(FN_GetFriendStatus, result); } - void AcceptFriendRequest(const Int64Value& result) + void AcceptFriendRequest(const Int64Value& result) override { Call(FN_AcceptFriendRequest, result); } - void GetFriendRequests(const FriendRequestValue& result) + void GetFriendRequests(const FriendRequestValue& result) override { Call(FN_GetFriendRequests, result); } - void CreateFriendRequest(const Int64Value& result) + void CreateFriendRequest(const Int64Value& result) override { Call(FN_CreateFriendRequest, result); } - void DeclineFriendRequest(const Int64Value& result) + void DeclineFriendRequest(const Int64Value& result) override { Call(FN_DeclineFriendRequest, result); } - void UpdatePresenceStatus(const Int64Value& result) + void UpdatePresenceStatus(const Int64Value& result) override { Call(FN_UpdatePresenceStatus, result); } - void GetPresenceStatusofFriends(const PresenceStatusValue& result) + void GetPresenceStatusofFriends(const PresenceStatusValue& result) override { Call(FN_GetPresenceStatusofFriends, result); } - void GetPresenceSettings(const PresenceSettingsValue& result) + void GetPresenceSettings(const PresenceSettingsValue& result) override { Call(FN_GetPresenceSettings, result); } - void UpdatePresenceSettings(const PresenceSettingsValue& result) + void UpdatePresenceSettings(const PresenceSettingsValue& result) override { Call(FN_UpdatePresenceSettings, result); } - void GetChannelbyID(const ChannelInfoValue& result) + void GetChannelbyID(const ChannelInfoValue& result) override { Call(FN_GetChannelbyID, result); } - void GetChannel(const ChannelInfoValue& result) + void GetChannel(const ChannelInfoValue& result) override { Call(FN_GetChannel, result); } - void UpdateChannel(const ChannelInfoValue& result) + void UpdateChannel(const ChannelInfoValue& result) override { Call(FN_UpdateChannel, result); } - void GetChannelEditors(const UserInfoListValue& result) + void GetChannelEditors(const UserInfoListValue& result) override { Call(FN_GetChannelEditors, result); } - void GetChannelFollowers(const FollowerResultValue& result) + void GetChannelFollowers(const FollowerResultValue& result) override { Call(FN_GetChannelFollowers, result); } - void GetChannelTeams(const ChannelTeamValue& result) + void GetChannelTeams(const ChannelTeamValue& result) override { Call(FN_GetChannelTeams, result); } - void GetChannelSubscribers(const SubscriberValue& result) + void GetChannelSubscribers(const SubscriberValue& result) override { Call(FN_GetChannelSubscribers, result); } - void CheckChannelSubscriptionbyUser(const SubscriberbyUserValue& result) + void CheckChannelSubscriptionbyUser(const SubscriberbyUserValue& result) override { Call(FN_CheckChannelSubscriptionbyUser, result); } - void GetChannelVideos(const VideoReturnValue& result) + void GetChannelVideos(const VideoReturnValue& result) override { Call(FN_GetChannelVideos, result); } - void StartChannelCommercial(const StartChannelCommercialValue& result) + void StartChannelCommercial(const StartChannelCommercialValue& result) override { Call(FN_StartChannelCommercial, result); } - void ResetChannelStreamKey(const ChannelInfoValue& result) + void ResetChannelStreamKey(const ChannelInfoValue& result) override { Call(FN_ResetChannelStreamKey, result); } From 5ce7b76ca5d46facdb9c7e6e619ea86e5bada849 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 20:26:50 -0700 Subject: [PATCH 274/355] Gems/Vegetation Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Include/Vegetation/Editor/EditorAreaComponentBase.h | 2 +- Gems/Vegetation/Code/Tests/DynamicSliceInstanceSpawnerTests.cpp | 2 +- Gems/Vegetation/Code/Tests/PrefabInstanceSpawnerTests.cpp | 2 +- Gems/Vegetation/Code/Tests/VegetationMocks.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h index 60ef04b46e..87a1546ad0 100644 --- a/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h +++ b/Gems/Vegetation/Code/Include/Vegetation/Editor/EditorAreaComponentBase.h @@ -63,7 +63,7 @@ namespace Vegetation AZ::Aabb GetPreviewBounds() const override; bool GetConstrainToShape() const override; - GradientSignal::GradientPreviewContextPriority GetPreviewContextPriority() const; + GradientSignal::GradientPreviewContextPriority GetPreviewContextPriority() const override; ////////////////////////////////////////////////////////////////////////// // AzToolsFramework::EntitySelectionEvents::Bus::Handler diff --git a/Gems/Vegetation/Code/Tests/DynamicSliceInstanceSpawnerTests.cpp b/Gems/Vegetation/Code/Tests/DynamicSliceInstanceSpawnerTests.cpp index 01a2e059e6..9838a7b6a1 100644 --- a/Gems/Vegetation/Code/Tests/DynamicSliceInstanceSpawnerTests.cpp +++ b/Gems/Vegetation/Code/Tests/DynamicSliceInstanceSpawnerTests.cpp @@ -191,7 +191,7 @@ namespace UnitTest AZ::Data::AssetHandler::LoadResult LoadAssetData( const AZ::Data::Asset& asset, AZStd::shared_ptr stream, - [[maybe_unused]] const AZ::Data::AssetFilterCB& assetLoadFilterCB) + [[maybe_unused]] const AZ::Data::AssetFilterCB& assetLoadFilterCB) override { MockAssetData* temp = reinterpret_cast(asset.GetData()); temp->SetStatus(AZ::Data::AssetData::AssetStatus::Ready); diff --git a/Gems/Vegetation/Code/Tests/PrefabInstanceSpawnerTests.cpp b/Gems/Vegetation/Code/Tests/PrefabInstanceSpawnerTests.cpp index ed48aec134..b0d88f2d63 100644 --- a/Gems/Vegetation/Code/Tests/PrefabInstanceSpawnerTests.cpp +++ b/Gems/Vegetation/Code/Tests/PrefabInstanceSpawnerTests.cpp @@ -185,7 +185,7 @@ namespace UnitTest AZ::Data::AssetHandler::LoadResult LoadAssetData( const AZ::Data::Asset& asset, AZStd::shared_ptr stream, - [[maybe_unused]] const AZ::Data::AssetFilterCB& assetLoadFilterCB) + [[maybe_unused]] const AZ::Data::AssetFilterCB& assetLoadFilterCB) override { MockAssetData* temp = reinterpret_cast(asset.GetData()); temp->SetStatus(AZ::Data::AssetData::AssetStatus::Ready); diff --git a/Gems/Vegetation/Code/Tests/VegetationMocks.h b/Gems/Vegetation/Code/Tests/VegetationMocks.h index 97eaa50b69..ee620c81a2 100644 --- a/Gems/Vegetation/Code/Tests/VegetationMocks.h +++ b/Gems/Vegetation/Code/Tests/VegetationMocks.h @@ -268,7 +268,7 @@ namespace UnitTest } } - void GetSystemConfig(AZ::ComponentConfig* config) const + void GetSystemConfig(AZ::ComponentConfig* config) const override { if (azrtti_typeid(m_areaSystemConfig) == azrtti_typeid(*config)) { From 5815b48a0050a05a2415898ea14f8740916db45a Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Fri, 10 Sep 2021 21:16:03 -0700 Subject: [PATCH 275/355] disabling the warning after merge Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/Clang/Configurations_clang.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 5c24161a19..86f4faccfb 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -19,9 +19,9 @@ ly_append_configurations_options( ################### # Disabled warnings (please do not disable any others without first consulting sig-build) ################### - # -Wno-inconsistent-missing-override # unfortunately there is no warning in MSVC to detect missing overrides, - # MSVC's static analyzer can, but that is a different run that most developers are not ware of. A pass was - # done to fix all hits. Leaving this disabled until there is a matching warning in MSVC. + -Wno-inconsistent-missing-override # unfortunately there is no warning in MSVC to detect missing overrides, + # MSVC's static analyzer can, but that is a different run that most developers are not ware of. A pass + # was done to fix all hits. Leaving this disabled until there is a matching warning in MSVC. -Wrange-loop-analysis -Wno-unknown-warning-option # used as a way to mark warnings that are MSVC only From 51ce59e24099f2d32b8bfa203289df4ca1e0c1b2 Mon Sep 17 00:00:00 2001 From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com> Date: Mon, 13 Sep 2021 08:25:38 +0200 Subject: [PATCH 276/355] EMotion FX: Resetting the anim graph while in the middle of selecting transitions for interruption crashes the Editor (#4026) Signed-off-by: Benjamin Jillich --- .../Editor/PropertyWidgets/AnimGraphTransitionHandler.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.cpp b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.cpp index ce114a498e..c49f5de085 100644 --- a/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/PropertyWidgets/AnimGraphTransitionHandler.cpp @@ -24,7 +24,6 @@ #include #include - namespace EMotionFX { AZ_CLASS_ALLOCATOR_IMPL(AnimGraphTransitionIdPicker, AZ::SystemAllocator, 0) @@ -126,8 +125,13 @@ namespace EMotionFX } } - void AnimGraphTransitionIdPicker::OnAboutToBeRemoved(const QModelIndex &parent, int first, int last) + void AnimGraphTransitionIdPicker::OnAboutToBeRemoved(const QModelIndex& parent, int first, int last) { + if (!parent.isValid()) + { + return; + } + EMStudio::EMStudioPlugin* plugin = EMStudio::GetPluginManager()->FindActivePlugin(EMStudio::AnimGraphPlugin::CLASS_ID); EMStudio::AnimGraphPlugin* animGraphPlugin = static_cast(plugin); if (animGraphPlugin) From 28d45891f29210cca73aed56f5996fa4e0bb9caf Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Mon, 13 Sep 2021 09:36:34 +0100 Subject: [PATCH 277/355] Remove redundant API calls from EditorViewportWidget and use new WorldToScreen call (#4022) * remove redundant API calls from EditorViewportWidget and use new WorldToScreen call Signed-off-by: hultonha * remove additional pre/post widget render calls that are no longer required Signed-off-by: hultonha --- Code/Editor/EditorViewportWidget.cpp | 64 +++++-------------- Code/Editor/EditorViewportWidget.h | 5 +- Code/Editor/IEditorImpl.cpp | 7 -- Code/Editor/Viewport.cpp | 27 -------- Code/Editor/Viewport.h | 16 +---- .../Manipulators/EditorVertexSelection.cpp | 7 +- .../Viewport/ViewportMessages.h | 27 -------- .../ViewportSelection/EditorHelpers.cpp | 7 +- .../ViewportSelection/EditorSelectionUtil.cpp | 12 ---- .../ViewportSelection/EditorSelectionUtil.h | 3 - .../EditorTransformComponentSelection.cpp | 15 +---- .../Editor/EditorViewportEntityPicker.cpp | 38 +++++------ 12 files changed, 42 insertions(+), 186 deletions(-) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 736bbe5feb..61c7355273 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -295,28 +295,17 @@ void EditorViewportWidget::mousePressEvent(QMouseEvent* event) QtViewport::mousePressEvent(event); } -AzToolsFramework::ViewportInteraction::MousePick EditorViewportWidget::BuildMousePickInternal(const QPoint& point) const +AzToolsFramework::ViewportInteraction::MousePick EditorViewportWidget::BuildMousePick(const QPoint& point) const { - using namespace AzToolsFramework::ViewportInteraction; - - MousePick mousePick; - mousePick.m_screenCoordinates = ScreenPointFromQPoint(point); - const auto& ray = m_renderViewport->ViewportScreenToWorldRay(mousePick.m_screenCoordinates); - if (ray.has_value()) + AzToolsFramework::ViewportInteraction::MousePick mousePick; + mousePick.m_screenCoordinates = AzToolsFramework::ViewportInteraction::ScreenPointFromQPoint(point); + if (const auto& ray = m_renderViewport->ViewportScreenToWorldRay(mousePick.m_screenCoordinates); + ray.has_value()) { mousePick.m_rayOrigin = ray.value().origin; mousePick.m_rayDirection = ray.value().direction; } - return mousePick; -} -AzToolsFramework::ViewportInteraction::MousePick EditorViewportWidget::BuildMousePick(const QPoint& point) -{ - using namespace AzToolsFramework::ViewportInteraction; - - PreWidgetRendering(); - const MousePick mousePick = BuildMousePickInternal(point); - PostWidgetRendering(); return mousePick; } @@ -325,9 +314,7 @@ AzToolsFramework::ViewportInteraction::MouseInteraction EditorViewportWidget::Bu const AzToolsFramework::ViewportInteraction::KeyboardModifiers modifiers, const AzToolsFramework::ViewportInteraction::MousePick& mousePick) const { - using namespace AzToolsFramework::ViewportInteraction; - - MouseInteraction mouse; + AzToolsFramework::ViewportInteraction::MouseInteraction mouse; mouse.m_interactionId.m_cameraId = m_viewEntityId; mouse.m_interactionId.m_viewportId = GetViewportId(); mouse.m_mouseButtons = buttons; @@ -339,11 +326,11 @@ AzToolsFramework::ViewportInteraction::MouseInteraction EditorViewportWidget::Bu AzToolsFramework::ViewportInteraction::MouseInteraction EditorViewportWidget::BuildMouseInteraction( const Qt::MouseButtons buttons, const Qt::KeyboardModifiers modifiers, const QPoint& point) { - using namespace AzToolsFramework::ViewportInteraction; + namespace AztfVi = AzToolsFramework::ViewportInteraction; return BuildMouseInteractionInternal( - BuildMouseButtons(buttons), - BuildKeyboardModifiers(modifiers), + AztfVi::BuildMouseButtons(buttons), + AztfVi::BuildKeyboardModifiers(modifiers), BuildMousePick(WidgetToViewport(point))); } @@ -721,8 +708,6 @@ void EditorViewportWidget::OnBeginPrepareRender() return; } - PreWidgetRendering(); - RenderAll(); // Draw 2D helpers. @@ -748,8 +733,6 @@ void EditorViewportWidget::OnBeginPrepareRender() m_debugDisplay->SetState(prevState); m_debugDisplay->DepthTestOn(); - - PostWidgetRendering(); } ////////////////////////////////////////////////////////////////////////// @@ -769,15 +752,15 @@ void EditorViewportWidget::RenderAll() if (m_manipulatorManager != nullptr) { - using namespace AzToolsFramework::ViewportInteraction; + namespace AztfVi = AzToolsFramework::ViewportInteraction; m_debugDisplay->DepthTestOff(); m_manipulatorManager->DrawManipulators( *m_debugDisplay, GetCameraState(), BuildMouseInteractionInternal( - MouseButtons(TranslateMouseButtons(QGuiApplication::mouseButtons())), - BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()), - BuildMousePickInternal(WidgetToViewport(mapFromGlobal(QCursor::pos()))))); + AztfVi::MouseButtons(AztfVi::TranslateMouseButtons(QGuiApplication::mouseButtons())), + AztfVi::BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()), + BuildMousePick(WidgetToViewport(mapFromGlobal(QCursor::pos()))))); m_debugDisplay->DepthTestOn(); } } @@ -950,8 +933,6 @@ AZ::Vector3 EditorViewportWidget::PickTerrain(const AzFramework::ScreenPoint& po AZ::EntityId EditorViewportWidget::PickEntity(const AzFramework::ScreenPoint& point) { - PreWidgetRendering(); - AZ::EntityId entityId; HitContext hitInfo; hitInfo.view = this; @@ -964,8 +945,6 @@ AZ::EntityId EditorViewportWidget::PickEntity(const AzFramework::ScreenPoint& po } } - PostWidgetRendering(); - return entityId; } @@ -999,28 +978,17 @@ QWidget* EditorViewportWidget::GetWidgetForViewportContextMenu() return this; } -void EditorViewportWidget::BeginWidgetContext() -{ - PreWidgetRendering(); -} - -void EditorViewportWidget::EndWidgetContext() -{ - PostWidgetRendering(); -} - bool EditorViewportWidget::ShowingWorldSpace() { - using namespace AzToolsFramework::ViewportInteraction; - return BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()).Shift(); + return AzToolsFramework::ViewportInteraction::BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()).Shift(); } void EditorViewportWidget::SetViewportId(int id) { CViewport::SetViewportId(id); - // Clear the cached debugdisplay pointer. we're about to delete that render viewport, and deleting the render - // viewport invalidates the debugdisplay. + // Clear the cached DebugDisplay pointer. we're about to delete that render viewport, and deleting the render + // viewport invalidates the DebugDisplay. m_debugDisplay = nullptr; // First delete any existing layout diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index dff0adb55a..426b7c5ad1 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -211,8 +211,6 @@ private: float TerrainHeight(const AZ::Vector2& position) override; bool ShowingWorldSpace() override; QWidget* GetWidgetForViewportContextMenu() override; - void BeginWidgetContext() override; - void EndWidgetContext() override; // EditorEntityViewportInteractionRequestBus overrides ... void FindVisibleEntities(AZStd::vector& visibleEntities) override; @@ -271,7 +269,7 @@ private: // note: The argument passed to parameter **point**, originating // from a Qt event, must first be passed to WidgetToViewport before being // passed to BuildMousePick. - AzToolsFramework::ViewportInteraction::MousePick BuildMousePick(const QPoint& point); + AzToolsFramework::ViewportInteraction::MousePick BuildMousePick(const QPoint& point) const; bool CheckRespondToInput() const; @@ -281,7 +279,6 @@ private: void PushDisableRendering(); void PopDisableRendering(); bool IsRenderingDisabled() const; - AzToolsFramework::ViewportInteraction::MousePick BuildMousePickInternal(const QPoint& point) const; void RestoreViewportAfterGameMode(); diff --git a/Code/Editor/IEditorImpl.cpp b/Code/Editor/IEditorImpl.cpp index 51ef0dedc3..66c64d5bef 100644 --- a/Code/Editor/IEditorImpl.cpp +++ b/Code/Editor/IEditorImpl.cpp @@ -632,14 +632,7 @@ void CEditorImpl::SetReferenceCoordSys(RefCoordSys refCoords) CViewport* pViewport = GetActiveView(); if (pViewport) { - //Pre and Post widget rendering calls are made here to make sure that the proper camera state is set. - //MakeConstructionPlane will make a call to ViewToWorldRay which needs the correct camera state - //in the CRenderViewport to be set. - pViewport->PreWidgetRendering(); - pViewport->MakeConstructionPlane(GetIEditor()->GetAxisConstrains()); - - pViewport->PostWidgetRendering(); } Notify(eNotify_OnRefCoordSysChange); diff --git a/Code/Editor/Viewport.cpp b/Code/Editor/Viewport.cpp index 9c6088e340..2d41538d92 100644 --- a/Code/Editor/Viewport.cpp +++ b/Code/Editor/Viewport.cpp @@ -43,12 +43,7 @@ void QtViewport::BuildDragDropContext(AzQtComponents::ViewportDragContext& context, const QPoint& pt) { context.m_hitLocation = AZ::Vector3::CreateZero(); - - PreWidgetRendering(); // required so that the current render cam is set. - context.m_hitLocation = GetHitLocation(pt); - - PostWidgetRendering(); } @@ -1352,28 +1347,6 @@ bool QtViewport::MouseCallback(EMouseEvent event, const QPoint& point, Qt::Keybo return true; } - // RAII wrapper for Pre / PostWidgetRendering calls. - // It also tracks the times a mouse callback potentially created a new viewport context. - struct ScopedProcessingMouseCallback - { - explicit ScopedProcessingMouseCallback(QtViewport* viewport) - : m_viewport(viewport) - { - m_viewport->m_processingMouseCallbacksCounter++; - m_viewport->PreWidgetRendering(); - } - - ~ScopedProcessingMouseCallback() - { - m_viewport->PostWidgetRendering(); - m_viewport->m_processingMouseCallbacksCounter--; - } - - QtViewport* m_viewport; - }; - - ScopedProcessingMouseCallback scopedProcessingMouseCallback(this); - ////////////////////////////////////////////////////////////////////////// // Hit test gizmo objects. ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Editor/Viewport.h b/Code/Editor/Viewport.h index 6b5bfb5c34..74897508f0 100644 --- a/Code/Editor/Viewport.h +++ b/Code/Editor/Viewport.h @@ -274,12 +274,6 @@ public: void SetViewPane(CLayoutViewPane* viewPane) { m_viewPane = viewPane; } - //Child classes can override these to provide extra logic that wraps - //widget rendering. Needed by the RenderViewport to handle raycasts - //from screen-space to world-space. - virtual void PreWidgetRendering() {} - virtual void PostWidgetRendering() {} - virtual CViewport *asCViewport() { return this; } protected: @@ -289,7 +283,7 @@ protected: // Screen Matrix Matrix34 m_screenTM; int m_nCurViewportID; - // Final game view matrix before drpping back to editor + // Final game view matrix before dropping back to editor Matrix34 m_gameTM; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING @@ -427,7 +421,7 @@ public: QRect GetSelectionRectangle() const override { return m_selectedRect; }; //! Called when dragging selection rectangle. void OnDragSelectRectangle(const QRect& rect, bool bNormalizeRect = false) override; - //! Get selection procision tolerance. + //! Get selection precision tolerance. float GetSelectionTolerance() const { return m_selectionTolerance; } //! Center viewport on selection. void CenterOnSelection() override {} @@ -572,12 +566,6 @@ protected: void dragLeaveEvent(QDragLeaveEvent* event) override; void dropEvent(QDropEvent* event) override; - //Child classes can override these to provide extra logic that wraps - //widget rendering. Needed by the RenderViewport to handle raycasts - //from screen-space to world-space. - virtual void PreWidgetRendering() {} - virtual void PostWidgetRendering() {} - AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING AzToolsFramework::ViewportUi::ViewportUiManager m_viewportUi; AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp index af5a9004e3..7b2ce53613 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -363,9 +364,7 @@ namespace AzToolsFramework boxSelectData.m_activeSelection = boxSelectData.m_startSelection; } - // set the widget context before calls to ViewportWorldToScreen so we are not - // going to constantly be pushing/popping the widget context - ViewportInteraction::WidgetContextGuard widgetContextGuard(viewportId); + const AzFramework::CameraState cameraState = GetCameraState(viewportId); // box select active (clicking and dragging) if (editorBoxSelect.BoxRegion()) @@ -385,7 +384,7 @@ namespace AzToolsFramework found, fixedVertices, &AZ::FixedVerticesRequestBus::Handler::GetVertex, vertexIndex, localVertex); const AZ::Vector3 worldVertex = worldFromLocal.TransformPoint(AZ::AdaptVertexOut(localVertex)); - const AzFramework::ScreenPoint screenPosition = GetScreenPosition(viewportId, worldVertex); + const AzFramework::ScreenPoint screenPosition = AzFramework::WorldToScreen(worldVertex, cameraState); // check if a vertex is inside the box select region if (editorBoxSelect.BoxRegion()->contains(ViewportInteraction::QPointFromScreenPoint(screenPosition))) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index 942fee1a49..fa4d8dfe11 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -254,11 +254,6 @@ namespace AzToolsFramework virtual bool ShowingWorldSpace() = 0; //! Return the widget to use as the parent for the viewport context menu. virtual QWidget* GetWidgetForViewportContextMenu() = 0; - //! Set the render context for the viewport. - virtual void BeginWidgetContext() = 0; - //! End the render context for the viewport. - //! Return to previous context before Begin was called. - virtual void EndWidgetContext() = 0; protected: ~MainEditorViewportInteractionRequests() = default; @@ -297,28 +292,6 @@ namespace AzToolsFramework //! Type to inherit to implement MainEditorViewportInteractionRequests. using ViewportMouseCursorRequestBus = AZ::EBus; - - //! A helper to wrap Begin/EndWidgetContext. - class WidgetContextGuard - { - public: - explicit WidgetContextGuard(const int viewportId) - : m_viewportId(viewportId) - { - MainEditorViewportInteractionRequestBus::Event( - viewportId, &MainEditorViewportInteractionRequestBus::Events::BeginWidgetContext); - } - - ~WidgetContextGuard() - { - MainEditorViewportInteractionRequestBus::Event( - m_viewportId, &MainEditorViewportInteractionRequestBus::Events::EndWidgetContext); - } - - private: - int m_viewportId; //!< The viewport id the widget context is being set on. - }; - } // namespace ViewportInteraction //! Utility function to return EntityContextId. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorHelpers.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorHelpers.cpp index 7abff230e3..25b10463dc 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorHelpers.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorHelpers.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -118,10 +119,6 @@ namespace AzToolsFramework const int viewportId = mouseInteraction.m_mouseInteraction.m_interactionId.m_viewportId; - // set the widget context before calls to ViewportWorldToScreen so we are not - // going to constantly be pushing/popping the widget context - ViewportInteraction::WidgetContextGuard widgetContextGuard(viewportId); - const bool helpersVisible = HelpersVisible(); // selecting new entities @@ -145,7 +142,7 @@ namespace AzToolsFramework const AZ::Vector3& entityPosition = m_entityDataCache->GetVisibleEntityPosition(entityCacheIndex); // selecting based on 2d icon - should only do it when visible and not selected - const AzFramework::ScreenPoint screenPosition = GetScreenPosition(viewportId, entityPosition); + const AzFramework::ScreenPoint screenPosition = AzFramework::WorldToScreen(entityPosition, cameraState); const float distSqFromCamera = cameraState.m_position.GetDistanceSq(entityPosition); const auto iconRange = static_cast(GetIconScale(distSqFromCamera) * s_iconSize * 0.5f); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp index f4b68b5970..a5ef66e7a3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.cpp @@ -48,18 +48,6 @@ namespace AzToolsFramework return AZ::GetMax(projectedCameraDistance, cameraState.m_nearClip) / apparentDistance; } - AzFramework::ScreenPoint GetScreenPosition(const int viewportId, const AZ::Vector3& worldTranslation) - { - AZ_PROFILE_FUNCTION(AzToolsFramework); - - auto screenPosition = AzFramework::ScreenPoint(0, 0); - ViewportInteraction::ViewportInteractionRequestBus::EventResult( - screenPosition, viewportId, &ViewportInteraction::ViewportInteractionRequestBus::Events::ViewportWorldToScreen, - worldTranslation); - - return screenPosition; - } - bool AabbIntersectRay(const AZ::Vector3& origin, const AZ::Vector3& direction, const AZ::Aabb& aabb, float& distance) { AZ_PROFILE_FUNCTION(AzToolsFramework); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h index ec9bde9f9c..d58549b329 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorSelectionUtil.h @@ -39,9 +39,6 @@ namespace AzToolsFramework //! Calculate scale factor based on distance from camera float CalculateScreenToWorldMultiplier(const AZ::Vector3& worldPosition, const AzFramework::CameraState& cameraState); - //! Map from world space to screen space. - AzFramework::ScreenPoint GetScreenPosition(int viewportId, const AZ::Vector3& worldTranslation); - //! Given a mouse interaction, determine if the pick ray from its position //! in screen space intersected an aabb in world space. bool AabbIntersectMouseRay(const ViewportInteraction::MouseInteraction& mouseInteraction, const AZ::Aabb& aabb); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index afcade944a..6442559ede 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -412,10 +412,7 @@ namespace AzToolsFramework potentialSelectedEntityIds.clear(); } - // set the widget context before calls to ViewportWorldToScreen so we are not - // going to constantly be pushing/popping the widget context - ViewportInteraction::WidgetContextGuard widgetContextGuard(viewportId); - + const AzFramework::CameraState cameraState = GetCameraState(viewportId); for (size_t entityCacheIndex = 0; entityCacheIndex < entityDataCache.VisibleEntityDataCount(); ++entityCacheIndex) { if (entityDataCache.IsVisibleEntityLocked(entityCacheIndex) || !entityDataCache.IsVisibleEntityVisible(entityCacheIndex)) @@ -426,7 +423,7 @@ namespace AzToolsFramework const AZ::EntityId entityId = entityDataCache.GetVisibleEntityId(entityCacheIndex); const AZ::Vector3& entityPosition = entityDataCache.GetVisibleEntityPosition(entityCacheIndex); - const AzFramework::ScreenPoint screenPosition = GetScreenPosition(viewportId, entityPosition); + const AzFramework::ScreenPoint screenPosition = AzFramework::WorldToScreen(entityPosition, cameraState); if (currentKeyboardModifiers.Ctrl()) { @@ -1779,13 +1776,7 @@ namespace AzToolsFramework CheckDirtyEntityIds(); - const int viewportId = mouseInteraction.m_mouseInteraction.m_interactionId.m_viewportId; - - const AzFramework::CameraState cameraState = GetCameraState(viewportId); - - // set the widget context before calls to ViewportWorldToScreen so we are not - // going to constantly be pushing/popping the widget context - ViewportInteraction::WidgetContextGuard widgetContextGuard(viewportId); + const AzFramework::CameraState cameraState = GetCameraState(mouseInteraction.m_mouseInteraction.m_interactionId.m_viewportId); m_cachedEntityIdUnderCursor = m_editorHelpers->HandleMouseInteraction(cameraState, mouseInteraction); diff --git a/Gems/PhysX/Code/Editor/EditorViewportEntityPicker.cpp b/Gems/PhysX/Code/Editor/EditorViewportEntityPicker.cpp index 605e6f213f..7f46f961f2 100644 --- a/Gems/PhysX/Code/Editor/EditorViewportEntityPicker.cpp +++ b/Gems/PhysX/Code/Editor/EditorViewportEntityPicker.cpp @@ -6,12 +6,12 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #include #include #include #include #include - #include namespace PhysX @@ -28,17 +28,13 @@ namespace PhysX } AZ::EntityId EditorViewportEntityPicker::PickEntity( - [[maybe_unused]] const AzFramework::CameraState& cameraState - , const AzToolsFramework::ViewportInteraction::MouseInteractionEvent& mouseInteraction - , AZ::Vector3& pickPosition - , AZ::Aabb& pickAabb) - { + [[maybe_unused]] const AzFramework::CameraState& cameraState, + const AzToolsFramework::ViewportInteraction::MouseInteractionEvent& mouseInteraction, + AZ::Vector3& pickPosition, + AZ::Aabb& pickAabb) + { const int viewportId = mouseInteraction.m_mouseInteraction.m_interactionId.m_viewportId; - // set the widget context before calls to ViewportWorldToScreen so we are not - // going to constantly be pushing/popping the widget context - AzToolsFramework::ViewportInteraction::WidgetContextGuard widgetContextGuard(viewportId); - // selecting new entities AZ::EntityId entityIdUnderCursor; pickPosition = AZ::Vector3::CreateZero(); @@ -48,31 +44,29 @@ namespace PhysX { const AZ::EntityId entityId = m_entityDataCache->GetVisibleEntityId(entityCacheIndex); - if (m_entityDataCache->IsVisibleEntityLocked(entityCacheIndex) - || !m_entityDataCache->IsVisibleEntityVisible(entityCacheIndex)) + if (m_entityDataCache->IsVisibleEntityLocked(entityCacheIndex) || !m_entityDataCache->IsVisibleEntityVisible(entityCacheIndex)) { continue; } // Ignore the case where the mouse hovers over an icon. Proceed to check for intersection with entity's AABB. - if (const AZ::Aabb aabb = AzToolsFramework::CalculateEditorEntitySelectionBounds( - entityId, AzFramework::ViewportInfo{viewportId}); + if (const AZ::Aabb aabb = + AzToolsFramework::CalculateEditorEntitySelectionBounds(entityId, AzFramework::ViewportInfo{ viewportId }); aabb.IsValid()) { const float pickRayLength = 1000.0f; - const AZ::Vector3 rayScaledDir = - mouseInteraction.m_mouseInteraction.m_mousePick.m_rayDirection * pickRayLength; + const AZ::Vector3 rayScaledDir = mouseInteraction.m_mouseInteraction.m_mousePick.m_rayDirection * pickRayLength; AZ::Vector3 startNormal; float t, end; int intersectResult = AZ::Intersect::IntersectRayAABB( - mouseInteraction.m_mouseInteraction.m_mousePick.m_rayOrigin, rayScaledDir, - rayScaledDir.GetReciprocal(), aabb, t, end, startNormal); + mouseInteraction.m_mouseInteraction.m_mousePick.m_rayOrigin, rayScaledDir, rayScaledDir.GetReciprocal(), aabb, t, end, + startNormal); if (intersectResult > 0) { entityIdUnderCursor = entityId; - pickPosition = mouseInteraction.m_mouseInteraction.m_mousePick.m_rayOrigin - + (mouseInteraction.m_mouseInteraction.m_mousePick.m_rayDirection * pickRayLength * t); + pickPosition = mouseInteraction.m_mouseInteraction.m_mousePick.m_rayOrigin + + (mouseInteraction.m_mouseInteraction.m_mousePick.m_rayDirection * pickRayLength * t); pickAabb = aabb; } } @@ -82,10 +76,8 @@ namespace PhysX } void EditorViewportEntityPicker::DisplayViewport( - const AzFramework::ViewportInfo& viewportInfo, - AzFramework::DebugDisplayRequests& debugDisplay) + const AzFramework::ViewportInfo& viewportInfo, [[maybe_unused]] AzFramework::DebugDisplayRequests& debugDisplay) { - AZ_UNUSED(debugDisplay); m_entityDataCache->CalculateVisibleEntityDatas(viewportInfo); } } // namespace PhysX From 7a58b72f1509ba46a4b854bff4070c2cd4929182 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Mon, 13 Sep 2021 15:19:46 +0100 Subject: [PATCH 278/355] Add remaining integration tests for viewport selection (box select) (#4075) * updates to viewport box select tests Signed-off-by: hultonha * add interface for querying keyboard modifiers Signed-off-by: hultonha * remove redundant casts Signed-off-by: hultonha * update formatting options for trace functions in ActionDispatcher Signed-off-by: hultonha * remove redundant GetKeyboardModifiers call Signed-off-by: hultonha * update how trace/log functions have been fixed to output during tests Signed-off-by: hultonha --- Code/Editor/EditorViewportWidget.cpp | 10 +- Code/Editor/EditorViewportWidget.h | 6 +- .../ActionDispatcher.h | 99 +++++---- .../ImmediateModeActionDispatcher.h | 13 +- .../Source/ImmediateModeActionDispatcher.cpp | 6 +- .../Manipulators/EditorVertexSelection.cpp | 3 +- .../Viewport/ViewportMessages.h | 23 ++ .../ViewportSelection/EditorBoxSelect.cpp | 10 +- .../ViewportSelection/EditorBoxSelect.h | 2 +- .../EditorDefaultSelection.cpp | 4 +- .../EditorTransformComponentSelection.cpp | 21 +- .../EditorTransformComponentSelection.h | 22 +- ...EditorTransformComponentSelectionTests.cpp | 204 ++++++++++-------- .../Source/EditorWhiteBoxComponentMode.cpp | 3 +- .../Code/Tests/WhiteBoxComponentTest.cpp | 2 +- 15 files changed, 256 insertions(+), 172 deletions(-) diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 61c7355273..851d2c5b6f 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -758,8 +758,7 @@ void EditorViewportWidget::RenderAll() m_manipulatorManager->DrawManipulators( *m_debugDisplay, GetCameraState(), BuildMouseInteractionInternal( - AztfVi::MouseButtons(AztfVi::TranslateMouseButtons(QGuiApplication::mouseButtons())), - AztfVi::BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()), + AztfVi::MouseButtons(AztfVi::TranslateMouseButtons(QGuiApplication::mouseButtons())), QueryKeyboardModifiers(), BuildMousePick(WidgetToViewport(mapFromGlobal(QCursor::pos()))))); m_debugDisplay->DepthTestOn(); } @@ -980,7 +979,12 @@ QWidget* EditorViewportWidget::GetWidgetForViewportContextMenu() bool EditorViewportWidget::ShowingWorldSpace() { - return AzToolsFramework::ViewportInteraction::BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()).Shift(); + return QueryKeyboardModifiers().Shift(); +} + +AzToolsFramework::ViewportInteraction::KeyboardModifiers EditorViewportWidget::QueryKeyboardModifiers() +{ + return AzToolsFramework::ViewportInteraction::BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()); } void EditorViewportWidget::SetViewportId(int id) diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index 426b7c5ad1..825d21a034 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -92,6 +92,7 @@ class SANDBOX_API EditorViewportWidget final , private AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler , private AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler , private AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler + , private AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler , private AzFramework::AssetCatalogEventBus::Handler , private AZ::RPI::SceneNotificationBus::Handler { @@ -205,7 +206,7 @@ private: bool IsViewportInputFrozen() override; void FreezeViewportInput(bool freeze) override; - // AzToolsFramework::MainEditorViewportInteractionRequestBus + // AzToolsFramework::MainEditorViewportInteractionRequestBus overrides ... AZ::EntityId PickEntity(const AzFramework::ScreenPoint& point) override; AZ::Vector3 PickTerrain(const AzFramework::ScreenPoint& point) override; float TerrainHeight(const AZ::Vector2& position) override; @@ -215,6 +216,9 @@ private: // EditorEntityViewportInteractionRequestBus overrides ... void FindVisibleEntities(AZStd::vector& visibleEntities) override; + // EditorModifierKeyRequestBus overrides ... + AzToolsFramework::ViewportInteraction::KeyboardModifiers QueryKeyboardModifiers() override; + // Camera::EditorCameraRequestBus overrides ... void SetViewFromEntityPerspective(const AZ::EntityId& entityId) override; void SetViewAndMovementLockFromEntityPerspective(const AZ::EntityId& entityId, bool lockCameraMovement) override; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h index 6ae09340e3..1b555a4a81 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h @@ -8,15 +8,15 @@ #pragma once -#include +#include #include #include -#include +#include namespace AzManipulatorTestFramework { //! Base class for derived immediate and retained action dispatchers. - template + template class ActionDispatcher { public: @@ -31,7 +31,7 @@ namespace AzManipulatorTestFramework //! Enable/disable action logging. DerivedDispatcherT* LogActions(bool logging); //! Output a trace debug message. - template + template DerivedDispatcherT* Trace(const char* format, const Args&... args); //! Set the camera state. DerivedDispatcherT* CameraState(const AzFramework::CameraState& cameraState); @@ -60,8 +60,9 @@ namespace AzManipulatorTestFramework //! Break out to the debugger mid action sequence (note: do not leave uses in production code). DerivedDispatcherT* DebugBreak(); //! Enter component mode for the specified component type. - template + template DerivedDispatcherT* EnterComponentMode(); + protected: // Actions to be implemented by derived immediate and retained action dispatchers. virtual void EnableSnapToGridImpl() = 0; @@ -79,32 +80,50 @@ namespace AzManipulatorTestFramework virtual void SetSelectedEntityImpl(AZ::EntityId entity) = 0; virtual void SetSelectedEntitiesImpl(const AzToolsFramework::EntityIdList& entities) = 0; virtual void EnterComponentModeImpl(const AZ::Uuid& uuid) = 0; - template + template void Log(const char* format, const Args&... args); bool m_logging = false; + private: const char* KeyboardModifierString(const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier); + static void DebugPrint(const char* format, ...); }; - template + template + void ActionDispatcher::DebugPrint(const char* format, ...) + { + va_list args; + va_start(args, format); + + vprintf(format, args); + printf("\n"); + + va_end(args); + } + + template template void ActionDispatcher::Log(const char* format, const Args&... args) { if (m_logging) { - AZ_Printf("ActionDispatcher", format, args...); + DebugPrint(format, args...); } } - template + template template DerivedDispatcherT* ActionDispatcher::Trace(const char* format, const Args&... args) { - Log(format, args...); + if (m_logging) + { + DebugPrint(format, args...); + } + return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::EnableSnapToGrid() { Log("Enabling SnapToGrid"); @@ -112,7 +131,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::DisableSnapToGrid() { Log("Disabling SnapToGrid"); @@ -120,15 +139,15 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::GridSize(float size) { - Log("GridSize: %f", size); + Log("GridSize: %.3f", size); GridSizeImpl(size); return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::LogActions(bool logging) { m_logging = logging; @@ -136,17 +155,16 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::CameraState(const AzFramework::CameraState& cameraState) { - Log("Camera state: p(%f, %f, %f) d(%f, %f, %f)", - float(cameraState.m_position.GetX()), float(cameraState.m_position.GetY()), float(cameraState.m_position.GetZ()), - float(cameraState.m_forward.GetX()), float(cameraState.m_forward.GetY()), float(cameraState.m_forward.GetZ())); + Log("Camera state: p(%.3f, %.3f, %.3f) d(%.3f, %.3f, %.3f)", cameraState.m_position.GetX(), cameraState.m_position.GetY(), + cameraState.m_position.GetZ(), cameraState.m_forward.GetX(), cameraState.m_forward.GetY(), cameraState.m_forward.GetZ()); CameraStateImpl(cameraState); return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::MouseLButtonDown() { Log("%s", "Mouse left button down"); @@ -154,14 +172,15 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::MouseLButtonUp() { Log("%s", "Mouse left button up"); MouseLButtonUpImpl(); return static_cast(this); } - template + + template const char* ActionDispatcher::KeyboardModifierString( const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) { @@ -176,11 +195,12 @@ namespace AzManipulatorTestFramework return "Shift"; case KeyboardModifier::None: return "None"; - default: return "Unknown modifier"; + default: + return "Unknown modifier"; } } - template + template DerivedDispatcherT* ActionDispatcher::KeyboardModifierDown( const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) { @@ -189,7 +209,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::KeyboardModifierUp( const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) { @@ -198,7 +218,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::MousePosition(const AzFramework::ScreenPoint& position) { Log("Mouse position: (%i, %i)", position.m_x, position.m_y); @@ -206,7 +226,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::ExpectManipulatorBeingInteracted() { Log("Expecting manipulator interacting"); @@ -214,7 +234,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::ExpectManipulatorNotBeingInteracted() { Log("Not expecting manipulator interacting"); @@ -222,27 +242,24 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template - DerivedDispatcherT* ActionDispatcher::SetEntityWorldTransform( - AZ::EntityId entityId, const AZ::Transform& transform) + template + DerivedDispatcherT* ActionDispatcher::SetEntityWorldTransform(AZ::EntityId entityId, const AZ::Transform& transform) { Log("Setting entity world transform: %s", AZ::ToString(transform).c_str()); SetEntityWorldTransformImpl(entityId, transform); return static_cast(this); } - template - DerivedDispatcherT* ActionDispatcher::SetSelectedEntity( - AZ::EntityId entity) + template + DerivedDispatcherT* ActionDispatcher::SetSelectedEntity(AZ::EntityId entity) { Log("Selecting entity: %u", static_cast(entity)); SetSelectedEntityImpl(entity); return static_cast(this); } - template - DerivedDispatcherT* ActionDispatcher::SetSelectedEntities( - const AzToolsFramework::EntityIdList& entities) + template + DerivedDispatcherT* ActionDispatcher::SetSelectedEntities(const AzToolsFramework::EntityIdList& entities) { for (const auto& entity : entities) { @@ -252,7 +269,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::EnterComponentMode(const AZ::Uuid& uuid) { Log("Entering component mode: %s", uuid.ToString().c_str()); @@ -260,7 +277,7 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template + template DerivedDispatcherT* ActionDispatcher::DebugBreak() { Log("Breaking to debugger"); @@ -268,8 +285,8 @@ namespace AzManipulatorTestFramework return static_cast(this); } - template - template + template + template DerivedDispatcherT* ActionDispatcher::EnterComponentMode() { EnterComponentMode(AZ::AzTypeInfo::Uuid()); diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h index 89be56bab7..7a4773a37c 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h @@ -10,11 +10,14 @@ #include #include +#include namespace AzManipulatorTestFramework { //! Dispatches actions immediately to the manipulators. - class ImmediateModeActionDispatcher : public ActionDispatcher + class ImmediateModeActionDispatcher + : public ActionDispatcher + , public AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler { using KeyboardModifier = AzToolsFramework::ViewportInteraction::KeyboardModifier; using KeyboardModifiers = AzToolsFramework::ViewportInteraction::KeyboardModifiers; @@ -44,8 +47,8 @@ namespace AzManipulatorTestFramework //! Execute an arbitrary section of code inline in the action dispatcher. ImmediateModeActionDispatcher* ExecuteBlock(const AZStd::function& blockFn); - //! Get the current state of the keyboard modifiers. - KeyboardModifiers GetKeyboardModifiers() const; + // EditorModifierKeyRequestBus overrides ... + KeyboardModifiers QueryKeyboardModifiers() override; protected: // ActionDispatcher ... @@ -94,11 +97,11 @@ namespace AzManipulatorTestFramework inline ImmediateModeActionDispatcher* ImmediateModeActionDispatcher::GetKeyboardModifiers(KeyboardModifiers& keyboardModifiers) { - keyboardModifiers = GetKeyboardModifiers(); + keyboardModifiers = QueryKeyboardModifiers(); return this; } - inline AzToolsFramework::ViewportInteraction::KeyboardModifiers ImmediateModeActionDispatcher::GetKeyboardModifiers() const + inline AzToolsFramework::ViewportInteraction::KeyboardModifiers ImmediateModeActionDispatcher::QueryKeyboardModifiers() { return GetMouseInteractionEvent()->m_mouseInteraction.m_keyboardModifiers; } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp index 4a6ed6a771..895899cf3f 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp @@ -32,9 +32,13 @@ namespace AzManipulatorTestFramework ImmediateModeActionDispatcher::ImmediateModeActionDispatcher(ManipulatorViewportInteraction& viewportManipulatorInteraction) : m_viewportManipulatorInteraction(viewportManipulatorInteraction) { + AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler::BusConnect(); } - ImmediateModeActionDispatcher::~ImmediateModeActionDispatcher() = default; + ImmediateModeActionDispatcher::~ImmediateModeActionDispatcher() + { + AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler::BusDisconnect(); + } void ImmediateModeActionDispatcher::MouseMoveAfterButton() { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp index 7b2ce53613..00f5b1ac47 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Manipulators/EditorVertexSelection.cpp @@ -657,8 +657,7 @@ namespace AzToolsFramework m_editorBoxSelect.InstallDisplayScene( [this, vertexBoxSelectData](const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& /*debugDisplay*/) { - const auto keyboardModifiers = ViewportInteraction::KeyboardModifiers( - ViewportInteraction::TranslateKeyboardModifiers(QApplication::queryKeyboardModifiers())); + const auto keyboardModifiers = AzToolsFramework::ViewportInteraction::QueryKeyboardModifiers(); // when modifiers change ensure we refresh box selection for immediate update if (keyboardModifiers != m_editorBoxSelect.PreviousModifiers()) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index fa4d8dfe11..c90c506a05 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -275,6 +275,29 @@ namespace AzToolsFramework using EditorEntityViewportInteractionRequestBus = AZ::EBus; + //! An interface to query editor modifier keys. + class EditorModifierKeyRequests : public AZ::EBusTraits + { + public: + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; + + //! Returns the current state of the keyboard modifier keys. + virtual KeyboardModifiers QueryKeyboardModifiers() = 0; + + protected: + ~EditorModifierKeyRequests() = default; + }; + + using EditorModifierKeyRequestBus = AZ::EBus; + + inline KeyboardModifiers QueryKeyboardModifiers() + { + KeyboardModifiers keyboardModifiers; + EditorModifierKeyRequestBus::BroadcastResult(keyboardModifiers, &EditorModifierKeyRequestBus::Events::QueryKeyboardModifiers); + return keyboardModifiers; + } + //! Viewport requests for managing the viewport cursor state. class ViewportMouseCursorRequests { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp index eafd37f199..a1b653225b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.cpp @@ -19,6 +19,13 @@ namespace AzToolsFramework static const AZ::Color s_boxSelectColor = AZ::Color(1.0f, 1.0f, 1.0f, 0.4f); static const float s_boxSelectLineWidth = 2.0f; + EditorBoxSelect::EditorBoxSelect() + { + // discard double click interval as box select is only interested in 'move' detection + // note: this also simplifies integration tests that do not have delays between presses + m_clickDetector.SetDoubleClickInterval(0.0f); + } + void EditorBoxSelect::HandleMouseInteraction(const ViewportInteraction::MouseInteractionEvent& mouseInteraction) { AZ_PROFILE_FUNCTION(AzToolsFramework); @@ -95,8 +102,7 @@ namespace AzToolsFramework debugDisplay.DepthTestOn(); - m_previousModifiers = ViewportInteraction::KeyboardModifiers( - ViewportInteraction::TranslateKeyboardModifiers(QApplication::queryKeyboardModifiers())); + m_previousModifiers = AzToolsFramework::ViewportInteraction::QueryKeyboardModifiers(); } } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h index f1c59f9fd8..3a638b80b6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorBoxSelect.h @@ -29,7 +29,7 @@ namespace AzToolsFramework class EditorBoxSelect { public: - EditorBoxSelect() = default; + EditorBoxSelect(); //! Return if a box select action is currently taking place. bool Active() const { return m_boxSelectRegion.has_value(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorDefaultSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorDefaultSelection.cpp index d7dd008c9e..7903668409 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorDefaultSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorDefaultSelection.cpp @@ -293,8 +293,8 @@ namespace AzToolsFramework } // poll and set the keyboard modifiers to ensure the mouse interaction is up to date - m_currentInteraction.m_keyboardModifiers = - AzToolsFramework::ViewportInteraction::BuildKeyboardModifiers(QGuiApplication::queryKeyboardModifiers()); + m_currentInteraction.m_keyboardModifiers = AzToolsFramework::ViewportInteraction::QueryKeyboardModifiers(); + // draw the manipulators const AzFramework::CameraState cameraState = GetCameraState(viewportInfo.m_viewportId); debugDisplay.DepthTestOff(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 6442559ede..3db8492d70 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -399,16 +399,18 @@ namespace AzToolsFramework // modifier has changed - swapped from additive to subtractive box select (or vice versa) if (previousKeyboardModifiers != currentKeyboardModifiers) { - for (AZ::EntityId entityId : potentialDeselectedEntityIds) + for (const AZ::EntityId& entityId : potentialDeselectedEntityIds) { editorTransformComponentSelection.AddEntityToSelection(entityId); } + potentialDeselectedEntityIds.clear(); - for (AZ::EntityId entityId : potentialSelectedEntityIds) + for (const AZ::EntityId& entityId : potentialSelectedEntityIds) { editorTransformComponentSelection.RemoveEntityFromSelection(entityId); } + potentialSelectedEntityIds.clear(); } @@ -1162,15 +1164,13 @@ namespace AzToolsFramework m_boxSelect.InstallDisplayScene( [this, entityBoxSelectData](const AzFramework::ViewportInfo& viewportInfo, AzFramework::DebugDisplayRequests& debugDisplay) { - const auto modifiers = ViewportInteraction::KeyboardModifiers( - ViewportInteraction::TranslateKeyboardModifiers(QApplication::queryKeyboardModifiers())); - - if (m_boxSelect.PreviousModifiers() != modifiers) + if (const auto keyboardModifiers = AzToolsFramework::ViewportInteraction::QueryKeyboardModifiers(); + m_boxSelect.PreviousModifiers() != keyboardModifiers) { EntityBoxSelectUpdateGeneral( m_boxSelect.BoxRegion(), *this, m_selectedEntityIds, entityBoxSelectData->m_selectedEntityIdsBeforeBoxSelect, entityBoxSelectData->m_potentialSelectedEntityIds, entityBoxSelectData->m_potentialDeselectedEntityIds, - *m_entityDataCache, viewportInfo.m_viewportId, modifiers, m_boxSelect.PreviousModifiers()); + *m_entityDataCache, viewportInfo.m_viewportId, keyboardModifiers, m_boxSelect.PreviousModifiers()); } debugDisplay.DepthTestOff(); @@ -3324,16 +3324,15 @@ namespace AzToolsFramework CheckDirtyEntityIds(); - const auto modifiers = - ViewportInteraction::KeyboardModifiers(ViewportInteraction::TranslateKeyboardModifiers(QApplication::queryKeyboardModifiers())); + const auto keyboardModifiers = AzToolsFramework::ViewportInteraction::QueryKeyboardModifiers(); m_cursorState.Update(); HandleAccents( - !m_selectedEntityIds.empty(), m_cachedEntityIdUnderCursor, modifiers.Ctrl(), m_hoveredEntityId, + !m_selectedEntityIds.empty(), m_cachedEntityIdUnderCursor, keyboardModifiers.Ctrl(), m_hoveredEntityId, ViewportInteraction::BuildMouseButtons(QGuiApplication::mouseButtons()), m_boxSelect.Active()); - const ReferenceFrame referenceFrame = m_spaceCluster.m_spaceLock.value_or(ReferenceFrameFromModifiers(modifiers)); + const ReferenceFrame referenceFrame = m_spaceCluster.m_spaceLock.value_or(ReferenceFrameFromModifiers(keyboardModifiers)); UpdateSpaceCluster(referenceFrame); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h index f528a11688..35d3587d0b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h @@ -235,7 +235,7 @@ namespace AzToolsFramework // can be returned to its previous state after an undo/redo operation void CreateEntityManipulatorDeselectCommand(ScopedUndoBatch& undoBatch); - // EditorTransformComponentSelectionRequestBus ... + // EditorTransformComponentSelectionRequestBus overrides ... Mode GetTransformMode() override; void SetTransformMode(Mode mode) override; void RefreshManipulators(RefreshType refreshType) override; @@ -252,34 +252,34 @@ namespace AzToolsFramework void CopyScaleToSelectedEntitiesIndividualWorld(float scale) override; void SnapSelectedEntitiesToWorldGrid(float gridSize) override; - // EditorManipulatorCommandUndoRedoRequestBus ... + // EditorManipulatorCommandUndoRedoRequestBus overrides ... void UndoRedoEntityManipulatorCommand(AZ::u8 pivotOverride, const AZ::Transform& transform, AZ::EntityId entityId) override; - // EditorContextMenuBus... + // EditorContextMenuBus overrides ... void PopulateEditorGlobalContextMenu(QMenu* menu, const AZ::Vector2& point, int flags) override; int GetMenuPosition() const override; AZStd::string GetMenuIdentifier() const override; - // EditorEventsBus ... + // EditorEventsBus overrides ... void OnEscape() override; - // ToolsApplicationNotificationBus ... + // ToolsApplicationNotificationBus overrides ... void BeforeEntitySelectionChanged() override; void AfterEntitySelectionChanged(const EntityIdList& newlySelectedEntities, const EntityIdList& newlyDeselectedEntities) override; - // TransformNotificationBus ... + // TransformNotificationBus overrides ... void OnTransformChanged(const AZ::Transform& localTM, const AZ::Transform& worldTM) override; - // Camera::EditorCameraNotificationBus ... + // Camera::EditorCameraNotificationBus overrides ... void OnViewportViewEntityChanged(const AZ::EntityId& newViewId) override; - // EditorContextVisibilityNotificationBus ... + // EditorContextVisibilityNotificationBus overrides ... void OnEntityVisibilityChanged(bool visibility) override; - // EditorContextLockComponentNotificationBus ... + // EditorContextLockComponentNotificationBus overrides ... void OnEntityLockChanged(bool locked) override; - // EditorComponentModeNotificationBus ... + // EditorComponentModeNotificationBus overrides ... void EnteredComponentMode(const AZStd::vector& componentModeTypes) override; void LeftComponentMode(const AZStd::vector& componentModeTypes) override; @@ -301,7 +301,7 @@ namespace AzToolsFramework //! Responsible for keeping the space cluster in sync with the current reference frame. void UpdateSpaceCluster(ReferenceFrame referenceFrame); - //! Hides/Shows all viewportUi toolbars. + //! Hides/Shows all viewportUi tool bars. void SetAllViewportUiVisible(bool visible); AZ::EntityId m_hoveredEntityId; //!< What EntityId is the mouse currently hovering over (if any). diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index dc6e38ecd5..8a958af567 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -238,10 +238,32 @@ namespace UnitTest m_entityId3 = createEntityWithBoundsFn("Entity3"); } - public: + void PositionEntities() + { + // the initial starting position of the entities + AZ::TransformBus::Event( + m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(m_entity1WorldTranslation)); + AZ::TransformBus::Event( + m_entityId2, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(m_entity2WorldTranslation)); + AZ::TransformBus::Event( + m_entityId3, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(m_entity3WorldTranslation)); + } + + static void PositionCamera(AzFramework::CameraState& cameraState) + { + // initial camera position (looking down the negative x-axis) + AzFramework::SetCameraTransform( + cameraState, + AZ::Transform::CreateFromQuaternionAndTranslation( + AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + } + AZ::EntityId m_entityId1; AZ::EntityId m_entityId2; AZ::EntityId m_entityId3; + AZ::Vector3 m_entity1WorldTranslation = AZ::Vector3(5.0f, 15.0f, 10.0f); + AZ::Vector3 m_entity2WorldTranslation = AZ::Vector3(5.0f, 14.0f, 10.0f); + AZ::Vector3 m_entity3WorldTranslation = AZ::Vector3(5.0f, 16.0f, 10.0f); }; void ArrangeIndividualRotatedEntitySelection(const AzToolsFramework::EntityIdList& entityIds, const AZ::Quaternion& orientation) @@ -596,25 +618,18 @@ namespace UnitTest { AzToolsFramework::ed_viewportStickySelect = true; - // the initial starting position of the entity - const auto initialTransformWorld = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f)); - AZ::TransformBus::Event(m_entityId1, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorld); - - // initial camera position (looking down the negative x-axis) - AzFramework::SetCameraTransform( - m_cameraState, - AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + PositionEntities(); + PositionCamera(m_cameraState); using ::testing::Eq; auto selectedEntitiesBefore = SelectedEntities(); EXPECT_TRUE(selectedEntitiesBefore.empty()); // calculate the position in screen space of the initial entity position - const auto initialPositionScreen = AzFramework::WorldToScreen(initialTransformWorld.GetTranslation(), m_cameraState); + const auto entity1ScreenPosition = AzFramework::WorldToScreen(m_entity1WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(initialPositionScreen)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity1ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); // entity is selected auto selectedEntitiesAfter = SelectedEntities(); @@ -626,19 +641,12 @@ namespace UnitTest { AzToolsFramework::ed_viewportStickySelect = true; - // the initial starting position of the entity - AZ::TransformBus::Event( - m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); + PositionEntities(); + PositionCamera(m_cameraState); // position in space above the entity const auto clickOffPositionWorld = AZ::Vector3(5.0f, 15.0f, 12.0f); - // initial camera position (looking down the negative x-axis) - AzFramework::SetCameraTransform( - m_cameraState, - AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); - AzToolsFramework::SelectEntity(m_entityId1); // calculate the position in screen space of the initial position of the entity @@ -660,30 +668,16 @@ namespace UnitTest { AzToolsFramework::ed_viewportStickySelect = true; - // the initial starting position of the entity - AZ::TransformBus::Event( - m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); - - const auto initialTransformWorldSecondEntity = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 10.0f, 10.0f)); - AZ::TransformBus::Event(m_entityId2, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorldSecondEntity); - - // initial camera position (looking down the negative x-axis) - AzFramework::SetCameraTransform( - m_cameraState, - AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + PositionEntities(); + PositionCamera(m_cameraState); AzToolsFramework::SelectEntity(m_entityId1); // calculate the position in screen space of the second entity - const auto initialPositionScreenSecondEntity = - AzFramework::WorldToScreen(initialTransformWorldSecondEntity.GetTranslation(), m_cameraState); + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState) - ->MousePosition(initialPositionScreenSecondEntity) - ->MouseLButtonDown() - ->MouseLButtonUp(); + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity2ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); // entity selection was not changed using ::testing::Eq; @@ -698,28 +692,17 @@ namespace UnitTest { AzToolsFramework::ed_viewportStickySelect = true; - // the initial starting position of the entity - AZ::TransformBus::Event( - m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); - - const auto initialTransformWorldSecondEntity = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 10.0f, 10.0f)); - AZ::TransformBus::Event(m_entityId2, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorldSecondEntity); - - // initial camera position (looking down the negative x-axis) - AzFramework::SetCameraTransform( - m_cameraState, - AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + PositionEntities(); + PositionCamera(m_cameraState); AzToolsFramework::SelectEntity(m_entityId1); // calculate the position in screen space of the second entity - const auto initialPositionScreenSecondEntity = - AzFramework::WorldToScreen(initialTransformWorldSecondEntity.GetTranslation(), m_cameraState); + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport m_actionDispatcher->CameraState(m_cameraState) - ->MousePosition(initialPositionScreenSecondEntity) + ->MousePosition(entity2ScreenPosition) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() ->MouseLButtonUp(); @@ -736,28 +719,17 @@ namespace UnitTest { AzToolsFramework::ed_viewportStickySelect = true; - // the initial starting position of the entity - AZ::TransformBus::Event( - m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); - - const auto initialTransformWorldSecondEntity = AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 10.0f, 10.0f)); - AZ::TransformBus::Event(m_entityId2, &AZ::TransformBus::Events::SetWorldTM, initialTransformWorldSecondEntity); - - // initial camera position (looking down the negative x-axis) - AzFramework::SetCameraTransform( - m_cameraState, - AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + PositionEntities(); + PositionCamera(m_cameraState); AzToolsFramework::SelectEntities({ m_entityId1, m_entityId2 }); // calculate the position in screen space of the second entity - const auto initialPositionScreenSecondEntity = - AzFramework::WorldToScreen(initialTransformWorldSecondEntity.GetTranslation(), m_cameraState); + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport m_actionDispatcher->CameraState(m_cameraState) - ->MousePosition(initialPositionScreenSecondEntity) + ->MousePosition(entity2ScreenPosition) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() ->MouseLButtonUp(); @@ -768,39 +740,26 @@ namespace UnitTest EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1)); } - TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, DISABLED_BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) { AzToolsFramework::ed_viewportStickySelect = true; - // the initial starting position of the entities - AZ::TransformBus::Event( - m_entityId1, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 15.0f, 10.0f))); - AZ::TransformBus::Event( - m_entityId2, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 14.0f, 10.0f))); - AZ::TransformBus::Event( - m_entityId3, &AZ::TransformBus::Events::SetWorldTM, AZ::Transform::CreateTranslation(AZ::Vector3(5.0f, 16.0f, 10.0f))); - - // initial camera position (looking down the negative x-axis) - AzFramework::SetCameraTransform( - m_cameraState, - AZ::Transform::CreateFromQuaternionAndTranslation( - AZ::Quaternion::CreateFromEulerAnglesDegrees(AZ::Vector3(0.0f, 0.0f, 90.0f)), AZ::Vector3(10.0f, 15.0f, 10.0f))); + PositionEntities(); + PositionCamera(m_cameraState); using ::testing::Eq; auto selectedEntitiesBefore = SelectedEntities(); EXPECT_THAT(selectedEntitiesBefore.size(), Eq(0)); // calculate the position in screen space of where to begin and end the box select action - const auto beginningPositionWorldBoxSelectStart = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 13.5f, 10.5f), m_cameraState); - const auto middlePositionWorldBoxSelectStart = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 15.0f, 10.0f), m_cameraState); - const auto endingPositionWorldBoxSelectStart = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); + const auto beginningPositionWorldBoxSelect = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 13.5f, 10.5f), m_cameraState); + const auto endingPositionWorldBoxSelect = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); // perform a box select in the viewport m_actionDispatcher->CameraState(m_cameraState) - ->MousePosition(beginningPositionWorldBoxSelectStart) + ->MousePosition(beginningPositionWorldBoxSelect) ->MouseLButtonDown() - ->MousePosition(middlePositionWorldBoxSelectStart) - ->MousePosition(endingPositionWorldBoxSelectStart) + ->MousePosition(endingPositionWorldBoxSelect) ->MouseLButtonUp(); // entities are selected @@ -809,6 +768,73 @@ namespace UnitTest EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1, m_entityId2, m_entityId3)); } + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectWithSelectionAppendsEntitiesToSelection) + { + AzToolsFramework::ed_viewportStickySelect = true; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntity(m_entityId1); + + using ::testing::UnorderedElementsAre; + auto selectedEntitiesBefore = SelectedEntities(); + EXPECT_THAT(selectedEntitiesBefore, UnorderedElementsAre(m_entityId1)); + + // calculate the position in screen space of where to begin and end the box select action + const auto beginningPositionWorldBoxSelect1 = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 14.5f, 10.5f), m_cameraState); + const auto endingPositionWorldBoxSelect1 = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 13.5f, 9.5f), m_cameraState); + const auto beginningPositionWorldBoxSelect2 = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 15.5f, 10.5f), m_cameraState); + const auto endingPositionWorldBoxSelect2 = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); + + // perform a box select in the viewport (going left and right) + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(beginningPositionWorldBoxSelect1) + ->MouseLButtonDown() + ->MousePosition(endingPositionWorldBoxSelect1) + ->MouseLButtonUp() + ->MousePosition(beginningPositionWorldBoxSelect2) + ->MouseLButtonDown() + ->MousePosition(endingPositionWorldBoxSelect2) + ->MouseLButtonUp(); + + // entities are selected + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1, m_entityId2, m_entityId3)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + BoxSelectHoldingCtrlWithSelectionRemovesEntitiesFromSelection) + { + AzToolsFramework::ed_viewportStickySelect = true; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntities({ m_entityId1, m_entityId2, m_entityId3 }); + + using ::testing::UnorderedElementsAre; + auto selectedEntitiesBefore = SelectedEntities(); + EXPECT_THAT(selectedEntitiesBefore, UnorderedElementsAre(m_entityId1, m_entityId2, m_entityId3)); + + // calculate the position in screen space of where to begin and end the box select action + const auto beginningPositionWorldBoxSelect = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 13.5f, 10.5f), m_cameraState); + const auto endingPositionWorldBoxSelect = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); + + // perform a box select in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(beginningPositionWorldBoxSelect) + ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) + ->MouseLButtonDown() + ->MousePosition(endingPositionWorldBoxSelect) + ->MouseLButtonUp(); + + // entities are selected + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_TRUE(selectedEntitiesAfter.empty()); + } + using EditorTransformComponentSelectionManipulatorTestFixture = IndirectCallManipulatorViewportInteractionFixtureMixin; diff --git a/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp b/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp index 13dc29599d..4bca7a9c96 100644 --- a/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp +++ b/Gems/WhiteBox/Code/Source/EditorWhiteBoxComponentMode.cpp @@ -52,8 +52,7 @@ namespace WhiteBox // default behavior for querying modifier keys (ask the QApplication) m_keyboardMofifierQueryFn = []() { - namespace vi = AzToolsFramework::ViewportInteraction; - return vi::KeyboardModifiers(vi::TranslateKeyboardModifiers(QApplication::queryKeyboardModifiers())); + return AzToolsFramework::ViewportInteraction::QueryKeyboardModifiers(); }; m_worldFromLocal = AzToolsFramework::WorldFromLocalWithUniformScale(entityComponentIdPair.GetEntityId()); diff --git a/Gems/WhiteBox/Code/Tests/WhiteBoxComponentTest.cpp b/Gems/WhiteBox/Code/Tests/WhiteBoxComponentTest.cpp index e2549a6126..0e93f38195 100644 --- a/Gems/WhiteBox/Code/Tests/WhiteBoxComponentTest.cpp +++ b/Gems/WhiteBox/Code/Tests/WhiteBoxComponentTest.cpp @@ -301,7 +301,7 @@ namespace UnitTest &WhiteBox::EditorWhiteBoxComponentModeRequestBus::Events::OverrideKeyboardModifierQuery, [this]() { - return m_actionDispatcher->GetKeyboardModifiers(); + return m_actionDispatcher->QueryKeyboardModifiers(); }); AzFramework::SetCameraTransform( From 6628f5bad176151eef37290c9919b3e4bf39385f Mon Sep 17 00:00:00 2001 From: moraaar Date: Mon, 13 Sep 2021 15:22:00 +0100 Subject: [PATCH 279/355] Marking script canvas failing tests as xfail until they can be reworked to make them pass. (#4077) Signed-off-by: moraaar --- .../Gem/PythonTests/scripting/CMakeLists.txt | 2 ++ .../Gem/PythonTests/scripting/TestSuite_Periodic.py | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt index 25988216b2..ed61dfaf33 100644 --- a/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/scripting/CMakeLists.txt @@ -28,5 +28,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED AND PAL_TRAIT_BUILD_HOST_TOOLS) Legacy::Editor AZ::AssetProcessor AutomatedTesting.Assets + COMPONENT + ScriptCanvas ) endif() diff --git a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py index 642818281b..0862e03a79 100755 --- a/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py +++ b/AutomatedTesting/Gem/PythonTests/scripting/TestSuite_Periodic.py @@ -37,6 +37,7 @@ class TestAutomation(TestAutomationBase): from . import Pane_HappyPath_ResizesProperly as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptCanvas_TwoComponents_InteractSuccessfully(self, request, workspace, editor, launcher_platform, level): def teardown(): @@ -46,6 +47,7 @@ class TestAutomation(TestAutomationBase): from . import ScriptCanvas_TwoComponents_InteractSuccessfully as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptCanvas_ChangingAssets_ComponentStable(self, request, workspace, editor, launcher_platform, project, level): def teardown(): @@ -63,6 +65,7 @@ class TestAutomation(TestAutomationBase): from . import NodePalette_HappyPath_CanSelectNode as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptCanvasComponent_OnEntityActivatedDeactivated_PrintMessage(self, request, workspace, editor, launcher_platform, project, level): def teardown(): @@ -76,6 +79,7 @@ class TestAutomation(TestAutomationBase): from . import NodePalette_HappyPath_ClearSelection as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptCanvas_TwoEntities_UseSimultaneously(self, request, workspace, editor, launcher_platform, project, level): def teardown(): @@ -139,6 +143,7 @@ class TestAutomation(TestAutomationBase): from . import Pane_Default_RetainOnSCRestart as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptEvents_HappyPath_SendReceiveAcrossMultiple(self, request, workspace, editor, launcher_platform, project, level): def teardown(): @@ -148,6 +153,7 @@ class TestAutomation(TestAutomationBase): from . import ScriptEvents_HappyPath_SendReceiveAcrossMultiple as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptEvents_Default_SendReceiveSuccessfully(self, request, workspace, editor, launcher_platform, project, level): def teardown(): @@ -157,6 +163,7 @@ class TestAutomation(TestAutomationBase): from . import ScriptEvents_Default_SendReceiveSuccessfully as test_module self._run_test(request, workspace, editor, test_module) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") @pytest.mark.parametrize("level", ["tmp_level"]) def test_ScriptEvents_ReturnSetType_Successfully(self, request, workspace, editor, launcher_platform, project, level): def teardown(): @@ -204,6 +211,7 @@ class TestScriptCanvasTests(object): The following tests use hydra_test_utils.py to launch the editor and validate the results. """ + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") def test_FileMenu_Default_NewAndOpen(self, request, editor, launcher_platform): expected_lines = [ "File->New action working as expected: True", @@ -213,6 +221,7 @@ class TestScriptCanvasTests(object): request, TEST_DIRECTORY, editor, "FileMenu_Default_NewAndOpen.py", expected_lines, auto_test_mode=False, timeout=60, ) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") def test_NewScriptEventButton_HappyPath_ContainsSCCategory(self, request, editor, launcher_platform): expected_lines = [ "New Script event action found: True", @@ -295,6 +304,7 @@ class TestScriptCanvasTests(object): timeout=60, ) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") def test_ScriptEvent_AddRemoveMethod_UpdatesInSC(self, request, workspace, editor, launcher_platform): def teardown(): file_system.delete( @@ -322,6 +332,7 @@ class TestScriptCanvasTests(object): timeout=60, ) + @pytest.mark.xfail(reason="Test fails to find expected lines, it needs to be fixed.") def test_ScriptEvents_AllParamDatatypes_CreationSuccess(self, request, workspace, editor, launcher_platform): def teardown(): file_system.delete( From 9c07078ee859d65f46e1775f1eb9b06f5f3425ec Mon Sep 17 00:00:00 2001 From: sphrose <82213493+sphrose@users.noreply.github.com> Date: Mon, 13 Sep 2021 16:58:20 +0100 Subject: [PATCH 280/355] Change shape type in test mock plus bugfix. (#4073) Signed-off-by: sphrose <82213493+sphrose@users.noreply.github.com> --- Gems/Terrain/Code/Tests/TerrainMocks.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/Terrain/Code/Tests/TerrainMocks.h b/Gems/Terrain/Code/Tests/TerrainMocks.h index 5f90cafd69..674104e26b 100644 --- a/Gems/Terrain/Code/Tests/TerrainMocks.h +++ b/Gems/Terrain/Code/Tests/TerrainMocks.h @@ -46,6 +46,7 @@ namespace UnitTest { provided.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); provided.push_back(AZ_CRC("BoxShapeService", 0x946a0032)); + provided.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); } static void GetIncompatibleServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& incompatible) @@ -74,7 +75,7 @@ namespace UnitTest Terrain::TerrainSystemServiceRequestBus::Handler::BusDisconnect(); } - void SetWorldBounds(const AZ::Aabb& worldBounds) override + void SetWorldBounds([[maybe_unused]] const AZ::Aabb& worldBounds) override { } From 4c1c2d6f6bc8e66ff90432e77861844aabf4099d Mon Sep 17 00:00:00 2001 From: "rgba16f [Amazon]" <82187279+rgba16f@users.noreply.github.com> Date: Mon, 13 Sep 2021 11:19:20 -0500 Subject: [PATCH 281/355] update freetype library revision used (#4065) * Update freetype linux package revision * Update mac & ios revisions of the freetype library * Update Mac freetype to use rev 16 * update linux to use freetype rev 16 * Update Android & Mac to use freetype rev 16 Signed-off-by: rgba16f <82187279+rgba16f@users.noreply.github.com> --- cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake | 2 +- cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 2 +- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 2 +- cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index f22de7e4c8..0d9be5bb49 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -16,7 +16,7 @@ ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zst ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) # platform-specific: -ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-android TARGETS freetype PACKAGE_HASH 74dd75382688323c3a2a5090f473840b5d7e9d2aed1a4fcdff05ed2a09a664f2) +ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-android TARGETS freetype PACKAGE_HASH df9e4d559ea0f03b0666b48c79813b1cd4d9624429148a249865de9f5c2c11cd) ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-android TARGETS tiff PACKAGE_HASH a9b30a1980946390c2fad0ed94562476a1d7ba8c1f36934ae140a89c54a8efd0) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev6-android TARGETS AWSNativeSDK PACKAGE_HASH 1624ba9aaf03d001ed0ffc57d2f945ff82590e75a7ea868de35043cf673e82fb) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-android TARGETS Lua PACKAGE_HASH 1f638e94a17a87fe9e588ea456d5893876094b4db191234380e4c4eb9e06c300) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index c9315336b9..2f0669f635 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -25,7 +25,7 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform # platform-specific: ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-linux TARGETS AWSGameLiftServerSDK PACKAGE_HASH a8149a95bd100384af6ade97e2b21a56173740d921e6c3da8188cd51554d39af) -ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-linux TARGETS freetype PACKAGE_HASH 9ad246873067717962c6b780d28a5ce3cef3321b73c9aea746a039c798f52e93) +ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-linux TARGETS freetype PACKAGE_HASH 3f10c703d9001ecd2bb51a3bd003d3237c02d8f947ad0161c0252fdc54cbcf97) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-linux TARGETS tiff PACKAGE_HASH ae92b4d3b189c42ef644abc5cac865d1fb2eb7cb5622ec17e35642b00d1a0a76) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev6-linux TARGETS AWSNativeSDK PACKAGE_HASH 490291e4c8057975c3ab86feb971b8a38871c58bac5e5d86abdd1aeb7141eec4) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-linux TARGETS Lua PACKAGE_HASH 1adc812abe3dd0dbb2ca9756f81d8f0e0ba45779ac85bf1d8455b25c531a38b0) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 4d62f6a7bf..1799fde7b9 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -27,7 +27,7 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform # platform-specific: ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-mac TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 3f77367dbb0342136ec4ebbd44bc1fedf7198089a0f83c5631248530769b2be6) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-mac TARGETS SPIRVCross PACKAGE_HASH 78c6376ed2fd195b9b1f5fb2b56e5267a32c3aa21fb399e905308de470eb4515) -ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-mac-ios TARGETS freetype PACKAGE_HASH 67b4f57aed92082d3fd7c16aa244a7d908d90122c296b0a63f73e0a0b8761977) +ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-mac TARGETS freetype PACKAGE_HASH f159b346ac3251fb29cb8dd5f805c99b0015ed7fdb3887f656945ca701a61d0d) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev5-mac TARGETS AWSNativeSDK PACKAGE_HASH ffb890bd9cf23afb429b9214ad9bac1bf04696f07a0ebb93c42058c482ab2f01) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev6-mac TARGETS Lua PACKAGE_HASH b9079fd35634774c9269028447562c6b712dbc83b9c64975c095fd423ff04c08) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 64cbfa05dd..e0b77fb0fa 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -28,7 +28,7 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-windows TARGETS AWSGameLiftServerSDK PACKAGE_HASH a0586b006e4def65cc25f388de17dc475e417dc1e6f9d96749777c88aa8271b0) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 803e10b94006b834cbbdd30f562a8ddf04174c2cb6956c8399ec164ef8418d1f) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-windows TARGETS SPIRVCross PACKAGE_HASH 7d601ea9d625b1d509d38bd132a1f433d7e895b16adab76bac6103567a7a6817) -ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-windows TARGETS freetype PACKAGE_HASH 88dedc86ccb8c92f14c2c033e51ee7d828fa08eafd6475c6aa963938a99f4bf3) +ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-windows TARGETS freetype PACKAGE_HASH 9809255f1c59b07875097aa8d8c6c21c97c47a31fb35e30f2bb93188e99a85ff) ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-windows TARGETS tiff PACKAGE_HASH ab60d1398e4e1e375ec0f1a00cdb1d812a07c0096d827db575ce52dd6d714207) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev4-windows TARGETS AWSNativeSDK PACKAGE_HASH a900e80f7259e43aed5c847afee2599ada37f29db70505481397675bcbb6c76c) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-windows TARGETS Lua PACKAGE_HASH 136faccf1f73891e3fa3b95f908523187792e56f5b92c63c6a6d7e72d1158d40) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index 69576bb665..ea51158f4a 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -17,7 +17,7 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS gla ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) # platform-specific: -ly_associate_package(PACKAGE_NAME freetype-2.10.4.14-mac-ios TARGETS freetype PACKAGE_HASH 67b4f57aed92082d3fd7c16aa244a7d908d90122c296b0a63f73e0a0b8761977) +ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-ios TARGETS freetype PACKAGE_HASH 3ac3c35e056ae4baec2e40caa023d76a7a3320895ef172b6655e9261b0dc2e29) ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-ios TARGETS AWSNativeSDK PACKAGE_HASH 1246219a213ccfff76b526011febf521586d44dbc1753e474f8fb5fd861654a4) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-ios TARGETS Lua PACKAGE_HASH c2d3c4e67046c293049292317a7d60fdb8f23effeea7136aefaef667163e5ffe) From 1e3c8edc401ffa6a19ea09ef500c2c11f41b996a Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Mon, 13 Sep 2021 18:04:20 +0100 Subject: [PATCH 282/355] Remove viewport freeze request bus (#4089) Signed-off-by: hultonha --- Code/Editor/CryEditPy.cpp | 4 ---- Code/Editor/EditorViewportWidget.cpp | 22 ------------------- Code/Editor/EditorViewportWidget.h | 8 ------- .../Viewport/ViewportMessages.h | 18 --------------- 4 files changed, 52 deletions(-) diff --git a/Code/Editor/CryEditPy.cpp b/Code/Editor/CryEditPy.cpp index 7a407aac37..1b38fe23b8 100644 --- a/Code/Editor/CryEditPy.cpp +++ b/Code/Editor/CryEditPy.cpp @@ -77,10 +77,6 @@ namespace // This closes the current document (level) currentLevel->OnNewDocument(); - // Then we freeze the viewport's input - AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Broadcast( - &AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Events::FreezeViewportInput, true); - // Then we need to tell the game engine there is no level to render anymore if (GetIEditor()->GetGameEngine()) { diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 851d2c5b6f..7631ac6237 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -669,16 +669,6 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event) case eNotify_OnEndSceneSave: PopDisableRendering(); break; - - case eNotify_OnBeginLoad: // disables viewport input when starting to load an existing level - case eNotify_OnBeginCreate: // disables viewport input when starting to create a new level - m_freezeViewportInput = true; - break; - - case eNotify_OnEndLoad: // enables viewport input when finished loading an existing level - case eNotify_OnEndCreate: // enables viewport input when finished creating a new level - m_freezeViewportInput = false; - break; } } @@ -962,16 +952,6 @@ AzFramework::ScreenPoint EditorViewportWidget::ViewportWorldToScreen(const AZ::V return m_renderViewport->ViewportWorldToScreen(worldPosition); } -bool EditorViewportWidget::IsViewportInputFrozen() -{ - return m_freezeViewportInput; -} - -void EditorViewportWidget::FreezeViewportInput(bool freeze) -{ - m_freezeViewportInput = freeze; -} - QWidget* EditorViewportWidget::GetWidgetForViewportContextMenu() { return this; @@ -1057,7 +1037,6 @@ void EditorViewportWidget::SetViewportId(int id) void EditorViewportWidget::ConnectViewportInteractionRequestBus() { - AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler::BusConnect(GetViewportId()); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); m_viewportUi.ConnectViewportUiBus(GetViewportId()); @@ -1072,7 +1051,6 @@ void EditorViewportWidget::DisconnectViewportInteractionRequestBus() m_viewportUi.DisconnectViewportUiBus(); AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusDisconnect(); - AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler::BusDisconnect(); } namespace AZ::ViewportHelpers diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index 825d21a034..c4a8e9fcca 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -89,7 +89,6 @@ class SANDBOX_API EditorViewportWidget final , private Camera::EditorCameraRequestBus::Handler , private Camera::CameraNotificationBus::Handler , private AzFramework::InputSystemCursorConstraintRequestBus::Handler - , private AzToolsFramework::ViewportInteraction::ViewportFreezeRequestBus::Handler , private AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler , private AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler , private AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler @@ -202,10 +201,6 @@ private: // AzFramework::InputSystemCursorConstraintRequestBus overrides ... void* GetSystemCursorConstraintWindow() const override; - // AzToolsFramework::ViewportFreezeRequestBus overrides ... - bool IsViewportInputFrozen() override; - void FreezeViewportInput(bool freeze) override; - // AzToolsFramework::MainEditorViewportInteractionRequestBus overrides ... AZ::EntityId PickEntity(const AzFramework::ScreenPoint& point) override; AZ::Vector3 PickTerrain(const AzFramework::ScreenPoint& point) override; @@ -387,9 +382,6 @@ private: // Unclear if it's still necessary. QSet m_keyDown; - // State for ViewportFreezeRequestBus, currently does nothing - bool m_freezeViewportInput = false; - // This widget holds a reference to the manipulator manage because its responsible for drawing manipulators AZStd::shared_ptr m_manipulatorManager; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index c90c506a05..8bddeb7a44 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -221,24 +221,6 @@ namespace AzToolsFramework using ViewportSettingsNotificationBus = AZ::EBus; - //! Requests to freeze the Viewport Input - //! Added to prevent a bug with the legacy CryEngine Viewport code that would - //! keep doing raycast tests even when no level is loaded, causing a crash. - class ViewportFreezeRequests - { - public: - //! Return if Viewport Input is frozen - virtual bool IsViewportInputFrozen() = 0; - //! Sets the Viewport Input freeze state - virtual void FreezeViewportInput(bool freeze) = 0; - - protected: - ~ViewportFreezeRequests() = default; - }; - - //! Type to inherit to implement ViewportFreezeRequests. - using ViewportFreezeRequestBus = AZ::EBus; - //! Viewport requests that are only guaranteed to be serviced by the Main Editor viewport. class MainEditorViewportInteractionRequests { From 32e6473de2d6db4b7c4725a86baeaff5ee068752 Mon Sep 17 00:00:00 2001 From: Scott Romero <24445312+AMZN-ScottR@users.noreply.github.com> Date: Mon, 13 Sep 2021 10:41:53 -0700 Subject: [PATCH 283/355] [development] Update RapidXML package info (#4057) Signed-off-by: AMZN-ScottR <24445312+AMZN-ScottR@users.noreply.github.com> --- cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake | 2 +- cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 2 +- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 2 +- cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index 0d9be5bb49..119fc324c6 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -9,7 +9,7 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) -ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) +ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 2f0669f635..f66f762f7a 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -12,7 +12,7 @@ ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev11-multiplatform ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) -ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) +ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 1799fde7b9..ebc5de729a 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -12,7 +12,7 @@ ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev11-multiplatform ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) -ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) +ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index e0b77fb0fa..05368d1f6a 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -12,7 +12,7 @@ ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev11-multiplatform ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) -ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) +ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) ly_associate_package(PACKAGE_NAME pybind11-2.4.3-rev2-multiplatform TARGETS pybind11 PACKAGE_HASH d8012f907b6c54ac990b899a0788280857e7c93a9595405a28114b48c354eb1b) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index ea51158f4a..2f12d7f81e 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -9,7 +9,7 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) -ly_associate_package(PACKAGE_NAME RapidXML-1.13-multiplatform TARGETS RapidXML PACKAGE_HASH 510b3c12f8872c54b34733e34f2f69dd21837feafa55bfefa445c98318d96ebf) +ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) ly_associate_package(PACKAGE_NAME cityhash-1.1-multiplatform TARGETS cityhash PACKAGE_HASH 0ace9e6f0b2438c5837510032d2d4109125845c0efd7d807f4561ec905512dd2) ly_associate_package(PACKAGE_NAME expat-2.1.0-multiplatform TARGETS expat PACKAGE_HASH 452256acd1fd699cef24162575b3524fccfb712f5321c83f1df1ce878de5b418) ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zstd PACKAGE_HASH 45d466c435f1095898578eedde85acf1fd27190e7ea99aeaa9acfd2f09e12665) From de3d2a2b693be2d9f1769fb7247282b4281e3ab3 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 13 Sep 2021 11:15:23 -0700 Subject: [PATCH 284/355] Detects that binary dir and install prefix are not the same (#4091) Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/OutputDirectory.cmake | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cmake/OutputDirectory.cmake b/cmake/OutputDirectory.cmake index a75b47e818..6906f76de5 100644 --- a/cmake/OutputDirectory.cmake +++ b/cmake/OutputDirectory.cmake @@ -14,6 +14,16 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin CACHE PATH "Build dir # We install outside of the binary dir because our install support muliple platforms to # be installed together. We also have an exclusion rule in the AP that filters out the # "install" folder to avoid the AP picking it up +unset(define_with_force) if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "Install directory" FORCE) + set(define_with_force FORCE) +endif() +set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install CACHE PATH "Install directory" ${define_with_force}) + +cmake_path(ABSOLUTE_PATH CMAKE_BINARY_DIR NORMALIZE OUTPUT_VARIABLE cmake_binary_dir_normalized) +cmake_path(ABSOLUTE_PATH CMAKE_INSTALL_PREFIX NORMALIZE OUTPUT_VARIABLE cmake_install_prefix_normalized) +cmake_path(COMPARE ${cmake_binary_dir_normalized} EQUAL ${cmake_install_prefix_normalized} are_paths_equal) +if(are_paths_equal) + message(FATAL_ERROR "Binary dir is the same path as install prefix, indicate a different install prefix with " + "CMAKE_INSTALL_PREFIX or a different binary dir with -B ") endif() From 6103c9c63cca0889243b8e49729bfbbfc304cfa4 Mon Sep 17 00:00:00 2001 From: Nicholas Lawson <70027408+lawsonamzn@users.noreply.github.com> Date: Mon, 13 Sep 2021 12:35:29 -0700 Subject: [PATCH 285/355] Updates libtiff for all platforms (#4068) The new libtiff is uniform, and static, across all platforms. It includes zlib support and uses our own zlib. Signed-off-by: lawsonamzn <70027408+lawsonamzn@users.noreply.github.com> --- cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake | 2 +- cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake | 2 +- cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake | 2 +- cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake | 2 +- cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake index 119fc324c6..47c3c66463 100644 --- a/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake +++ b/cmake/3rdParty/Platform/Android/BuiltInPackages_android.cmake @@ -16,8 +16,8 @@ ly_associate_package(PACKAGE_NAME zstd-1.35-multiplatform TARGETS zst ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS glad PACKAGE_HASH ff97ee9664e97d0854b52a3734c2289329d9f2b4cd69478df6d0ca1f1c9392ee) ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) # platform-specific: +ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev2-android TARGETS tiff PACKAGE_HASH 252b99e5886ec59fdccf38603c1399dd3fc02d878641aba35a7f8d2504065a06) ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-android TARGETS freetype PACKAGE_HASH df9e4d559ea0f03b0666b48c79813b1cd4d9624429148a249865de9f5c2c11cd) -ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-android TARGETS tiff PACKAGE_HASH a9b30a1980946390c2fad0ed94562476a1d7ba8c1f36934ae140a89c54a8efd0) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev6-android TARGETS AWSNativeSDK PACKAGE_HASH 1624ba9aaf03d001ed0ffc57d2f945ff82590e75a7ea868de35043cf673e82fb) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-android TARGETS Lua PACKAGE_HASH 1f638e94a17a87fe9e588ea456d5893876094b4db191234380e4c4eb9e06c300) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-android TARGETS PhysX PACKAGE_HASH b8cb6aa46b2a21671f6cb1f6a78713a3ba88824d0447560ff5ce6c01014b9f43) diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index f66f762f7a..429665f04a 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -25,8 +25,8 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform # platform-specific: ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-linux TARGETS AWSGameLiftServerSDK PACKAGE_HASH a8149a95bd100384af6ade97e2b21a56173740d921e6c3da8188cd51554d39af) +ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev2-linux TARGETS tiff PACKAGE_HASH 19791da0a370470a6c187199f97c2c46efcc2d89146e2013775fb3600fd7317d) ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-linux TARGETS freetype PACKAGE_HASH 3f10c703d9001ecd2bb51a3bd003d3237c02d8f947ad0161c0252fdc54cbcf97) -ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-linux TARGETS tiff PACKAGE_HASH ae92b4d3b189c42ef644abc5cac865d1fb2eb7cb5622ec17e35642b00d1a0a76) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev6-linux TARGETS AWSNativeSDK PACKAGE_HASH 490291e4c8057975c3ab86feb971b8a38871c58bac5e5d86abdd1aeb7141eec4) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-linux TARGETS Lua PACKAGE_HASH 1adc812abe3dd0dbb2ca9756f81d8f0e0ba45779ac85bf1d8455b25c531a38b0) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-linux TARGETS PhysX PACKAGE_HASH a110249cbef4f266b0002c4ee9a71f59f373040cefbe6b82f1e1510c811edde6) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index ebc5de729a..4900a9d77e 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -27,8 +27,8 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform # platform-specific: ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-mac TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 3f77367dbb0342136ec4ebbd44bc1fedf7198089a0f83c5631248530769b2be6) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-mac TARGETS SPIRVCross PACKAGE_HASH 78c6376ed2fd195b9b1f5fb2b56e5267a32c3aa21fb399e905308de470eb4515) +ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev2-mac TARGETS tiff PACKAGE_HASH b6f3040319f5bfe465d7e3f9b12ceed0dc951e66e05562beaac1c8da3b1b5d3f) ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-mac TARGETS freetype PACKAGE_HASH f159b346ac3251fb29cb8dd5f805c99b0015ed7fdb3887f656945ca701a61d0d) -ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev5-mac TARGETS AWSNativeSDK PACKAGE_HASH ffb890bd9cf23afb429b9214ad9bac1bf04696f07a0ebb93c42058c482ab2f01) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev6-mac TARGETS Lua PACKAGE_HASH b9079fd35634774c9269028447562c6b712dbc83b9c64975c095fd423ff04c08) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-mac TARGETS PhysX PACKAGE_HASH 5e092a11d5c0a50c4dd99bb681a04b566a4f6f29aa08443d9bffc8dc12c27c8e) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 05368d1f6a..3855b7d712 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -28,8 +28,8 @@ ly_associate_package(PACKAGE_NAME PVRTexTool-4.24.0-rev4-multiplatform ly_associate_package(PACKAGE_NAME AWSGameLiftServerSDK-3.4.1-rev1-windows TARGETS AWSGameLiftServerSDK PACKAGE_HASH a0586b006e4def65cc25f388de17dc475e417dc1e6f9d96749777c88aa8271b0) ly_associate_package(PACKAGE_NAME DirectXShaderCompilerDxc-1.6.2104-o3de-rev3-windows TARGETS DirectXShaderCompilerDxc PACKAGE_HASH 803e10b94006b834cbbdd30f562a8ddf04174c2cb6956c8399ec164ef8418d1f) ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-windows TARGETS SPIRVCross PACKAGE_HASH 7d601ea9d625b1d509d38bd132a1f433d7e895b16adab76bac6103567a7a6817) +ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev2-windows TARGETS tiff PACKAGE_HASH ff03464ca460fc34a8406b2a0c548ad221b10e40480b0abb954f1e649c20bad0) ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-windows TARGETS freetype PACKAGE_HASH 9809255f1c59b07875097aa8d8c6c21c97c47a31fb35e30f2bb93188e99a85ff) -ly_associate_package(PACKAGE_NAME tiff-4.2.0.14-windows TARGETS tiff PACKAGE_HASH ab60d1398e4e1e375ec0f1a00cdb1d812a07c0096d827db575ce52dd6d714207) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev4-windows TARGETS AWSNativeSDK PACKAGE_HASH a900e80f7259e43aed5c847afee2599ada37f29db70505481397675bcbb6c76c) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-windows TARGETS Lua PACKAGE_HASH 136faccf1f73891e3fa3b95f908523187792e56f5b92c63c6a6d7e72d1158d40) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-windows TARGETS PhysX PACKAGE_HASH 0c5ffbd9fa588e5cf7643721a7cfe74d0fe448bf82252d39b3a96d06dfca2298) diff --git a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake index 2f12d7f81e..25fbaf830f 100644 --- a/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake +++ b/cmake/3rdParty/Platform/iOS/BuiltInPackages_ios.cmake @@ -17,8 +17,8 @@ ly_associate_package(PACKAGE_NAME glad-2.0.0-beta-rev2-multiplatform TARGETS gla ly_associate_package(PACKAGE_NAME lux_core-2.2-rev5-multiplatform TARGETS lux_core PACKAGE_HASH c8c13cf7bc351643e1abd294d0841b24dee60e51647dff13db7aec396ad1e0b5) # platform-specific: +ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-rev2-ios TARGETS tiff PACKAGE_HASH d864beb0c955a55f28c2a993843afb2ecf6e01519ddfc857cedf34fc5db68d49) ly_associate_package(PACKAGE_NAME freetype-2.10.4.16-ios TARGETS freetype PACKAGE_HASH 3ac3c35e056ae4baec2e40caa023d76a7a3320895ef172b6655e9261b0dc2e29) -ly_associate_package(PACKAGE_NAME tiff-4.2.0.15-mac-ios TARGETS tiff PACKAGE_HASH a23ae1f8991a29f8e5df09d6d5b00d7768a740f90752cef465558c1768343709) ly_associate_package(PACKAGE_NAME AWSNativeSDK-1.7.167-rev3-ios TARGETS AWSNativeSDK PACKAGE_HASH 1246219a213ccfff76b526011febf521586d44dbc1753e474f8fb5fd861654a4) ly_associate_package(PACKAGE_NAME Lua-5.3.5-rev5-ios TARGETS Lua PACKAGE_HASH c2d3c4e67046c293049292317a7d60fdb8f23effeea7136aefaef667163e5ffe) ly_associate_package(PACKAGE_NAME PhysX-4.1.2.29882248-rev3-ios TARGETS PhysX PACKAGE_HASH b1bbc1fc068d2c6e1eb18eecd4e8b776adc516833e8da3dcb1970cef2a8f0cbd) From 880e3c99beac237775f84574f080b046c5838e25 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 13 Sep 2021 14:07:28 -0700 Subject: [PATCH 286/355] PR comments Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Editor/TrackView/TrackViewNode.h | 8 ++++---- Code/Editor/TrackView/TrackViewSplineCtrl.h | 2 +- .../Tests/IO/Streamer/StorageDriveTests_Windows.cpp | 2 ++ Code/Legacy/CrySystem/Timer.h | 2 +- Code/Legacy/CrySystem/ViewSystem/View.h | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Code/Editor/TrackView/TrackViewNode.h b/Code/Editor/TrackView/TrackViewNode.h index a3918d61a4..80ca7b9d49 100644 --- a/Code/Editor/TrackView/TrackViewNode.h +++ b/Code/Editor/TrackView/TrackViewNode.h @@ -119,12 +119,12 @@ public: : m_bAllOfSameType(true) {} virtual ~CTrackViewKeyBundle() = default; - virtual bool AreAllKeysOfSameType() const override { return m_bAllOfSameType; } + bool AreAllKeysOfSameType() const override { return m_bAllOfSameType; } - virtual unsigned int GetKeyCount() const override { return static_cast(m_keys.size()); } - virtual CTrackViewKeyHandle GetKey(unsigned int index) override { return m_keys[index]; } + unsigned int GetKeyCount() const override { return static_cast(m_keys.size()); } + CTrackViewKeyHandle GetKey(unsigned int index) override { return m_keys[index]; } - virtual void SelectKeys(const bool bSelected) override; + void SelectKeys(const bool bSelected) override; CTrackViewKeyHandle GetSingleSelectedKey(); diff --git a/Code/Editor/TrackView/TrackViewSplineCtrl.h b/Code/Editor/TrackView/TrackViewSplineCtrl.h index 7c5a13cdb6..7cf12fb750 100644 --- a/Code/Editor/TrackView/TrackViewSplineCtrl.h +++ b/Code/Editor/TrackView/TrackViewSplineCtrl.h @@ -67,7 +67,7 @@ private: void AdjustTCB(float d_tension, float d_continuity, float d_bias); void MoveSelectedTangentHandleTo(const QPoint& point); - virtual ISplineCtrlUndo* CreateSplineCtrlUndoObject(std::vector& splineContainer) override; + ISplineCtrlUndo* CreateSplineCtrlUndoObject(std::vector& splineContainer) override; bool m_bKeysFreeze; bool m_bTangentsFreeze; diff --git a/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp b/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp index 51fa68cc2b..22fb6379d2 100644 --- a/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp +++ b/Code/Framework/AzCore/Tests/Platform/Windows/Tests/IO/Streamer/StorageDriveTests_Windows.cpp @@ -1163,12 +1163,14 @@ namespace Benchmark m_absolutePath.swap(temp); delete m_streamer; + m_streamer = nullptr; SystemFile::Delete(TestFileName); AZ::IO::FileIOBase::SetInstance(nullptr); AZ::IO::FileIOBase::SetInstance(m_previousFileIO); delete m_fileIO; + m_fileIO = nullptr; } public: constexpr static const char* TestFileName = "StreamerBenchmark.bin"; diff --git a/Code/Legacy/CrySystem/Timer.h b/Code/Legacy/CrySystem/Timer.h index c988c1fa38..69fd2357e0 100644 --- a/Code/Legacy/CrySystem/Timer.h +++ b/Code/Legacy/CrySystem/Timer.h @@ -21,7 +21,7 @@ public: // constructor CTimer(); // destructor - ~CTimer() = default;; + ~CTimer() = default; bool Init(); diff --git a/Code/Legacy/CrySystem/ViewSystem/View.h b/Code/Legacy/CrySystem/ViewSystem/View.h index d1fc905eef..001bf694fd 100644 --- a/Code/Legacy/CrySystem/ViewSystem/View.h +++ b/Code/Legacy/CrySystem/ViewSystem/View.h @@ -26,7 +26,7 @@ class CView public: CView(ISystem* pSystem); - virtual ~CView(); + ~CView() override; //shaking struct SShake From 2b7caa685b8989f6772bca93ad3d6e5eb99aa5cd Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Mon, 13 Sep 2021 14:23:00 -0700 Subject: [PATCH 287/355] Introduce default font size. This fixes sizing and spacing for text rendered via a painter with not font specified. (#4069) Also removed some qss for windows that have been removed. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- Code/Editor/Style/Editor.qss | 90 ------------------- .../Components/StyleManager.cpp | 4 + 2 files changed, 4 insertions(+), 90 deletions(-) diff --git a/Code/Editor/Style/Editor.qss b/Code/Editor/Style/Editor.qss index 302b7703a5..5eb280260e 100644 --- a/Code/Editor/Style/Editor.qss +++ b/Code/Editor/Style/Editor.qss @@ -191,94 +191,4 @@ ConsoleTextEdit:focus, border-width: 0px; border-color: #e9e9e9; border-style: solid; -} - -/* Welcome Screen styling */ - -WelcomeScreenDialog QLabel -{ - font-size: 12px; - color: #FFFFFF; - line-height: 20px; - background-color: transparent; - margin: 0; -} - -WelcomeScreenDialog QLabel#currentProjectLabel -{ - margin-top: 10px; -} - -WelcomeScreenDialog QPushButton -{ - font-size: 14px; - line-height: 16px; -} - -WelcomeScreenDialog QWidget#articleViewContainerRoot -{ - background: #444444; -} - -WelcomeScreenDialog QWidget#levelViewFTUEContainer -{ - background: #282828; -} - -QTableWidget#recentLevelTable::item { - background-color: rgb(64,64,64); - margin-bottom: 4px; - margin-top: 4px; -} - -/* Particle Editor */ - -#NumParticlesLabel -{ - margin-top: 6px; -} - -#LibrarySearchIcon -{ - max-width: 16px; - max-height: 16px; - qproperty-iconSize: 16px 16px; -} - - -#ClosePrefabDialog, #SavePrefabDialog -{ - min-width : 640px; -} - -#SaveDependentPrefabsCard -{ - margin: 0px 15px 10px 15px; -} - -#PrefabSavedMessageFrame{ - border: 1px solid green; - margin: 10px 15px 10px 15px; - border-radius: 2px; - padding: 5px 2px 5px 2px; -} - -#ClosePrefabDialog #PrefabSaveWarningFrame -{ - border: 1px solid orange; - margin: 10px 15px 10px 15px; - border-radius: 2px; - padding: 5px 2px 5px 2px; - color : white; -} - -#SavePrefabDialog #FooterSeparatorLine -{ - color: gray; -} - -#SavePrefabDialog #PrefabSavePreferenceHint -{ - font: italic; - color: #999999; } \ No newline at end of file diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/StyleManager.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/StyleManager.cpp index c7ec4d4c7a..8f659afb7e 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/StyleManager.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/StyleManager.cpp @@ -169,6 +169,10 @@ namespace AzQtComponents initializeSearchPaths(application, engineRootPath); initializeFonts(); + QFont defaultFont("Open Sans"); + defaultFont.setPixelSize(12); + QApplication::setFont(defaultFont); + m_titleBarOverdrawHandler = TitleBarOverdrawHandler::createHandler(application, this); // The window decoration wrappers require the titlebar overdraw handler From 850d401bb3de889a9bd2e4337abef4d7156f6175 Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Mon, 13 Sep 2021 14:55:55 -0700 Subject: [PATCH 288/355] PerScreenDpi | Moving windows between screens with different scale changes the window size (#4064) * Fix window size when dropped on a screen with a different scale setting compared to the one it was dragged from. Note that this fixes a bug that could only be reproduced with the PerScreenDpiAware setting activated - current editor uses SystemDpiAware. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Fix loss of precision warning. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../AzQtComponents/Components/FancyDocking.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp index d73ebbec28..f60a98f392 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp @@ -2461,6 +2461,18 @@ namespace AzQtComponents placeholderRect.translate(0, -margins.bottom()); } + // Also adjust the placeholderRect by the relative dpi change from the original screen, since setGeometry uses the screen's + // virtualGeometry! + QScreen* fromScreen = dock->screen(); + QScreen* toScreen = Utilities::ScreenAtPoint(placeholderRect.topLeft()); + + if (fromScreen != toScreen) + { + qreal factorRatio = QHighDpiScaling::factor(fromScreen) / QHighDpiScaling::factor(toScreen); + placeholderRect.setWidth(aznumeric_cast(aznumeric_cast(placeholderRect.width()) * factorRatio)); + placeholderRect.setHeight(aznumeric_cast(aznumeric_cast(placeholderRect.height()) * factorRatio)); + } + // Place the floating dock widget makeDockWidgetFloating(dock, placeholderRect); clearDraggingState(); From b2963f2bc1018e3bf0be54b2a31e9582a81d36c0 Mon Sep 17 00:00:00 2001 From: srikappa-amzn <82230713+srikappa-amzn@users.noreply.github.com> Date: Mon, 13 Sep 2021 15:55:28 -0700 Subject: [PATCH 289/355] Renamed AtomMaxFileSize to DefaultMaxFileSize (#4067) Signed-off-by: srikappa-amzn --- .../Asset/Shader/Code/Source/Editor/AzslCompiler.cpp | 4 ++-- .../Shader/Code/Source/Editor/ShaderAssetBuilder.cpp | 2 +- .../Shader/Code/Source/Editor/ShaderBuilderUtility.cpp | 8 ++++---- .../Code/Source/Editor/ShaderVariantAssetBuilder.cpp | 10 +++++----- .../RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h | 4 ++-- .../Source/RPI.Builders/Material/MaterialBuilder.cpp | 4 ++-- .../RPI.Edit/Material/MaterialSourceDataSerializer.cpp | 2 +- .../Code/Source/RPI.Edit/Material/MaterialUtils.cpp | 2 +- .../Editor/AssetCollectionAsyncLoaderTestComponent.cpp | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp index a82c731d7b..79a39ff793 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/AzslCompiler.cpp @@ -1150,7 +1150,7 @@ namespace AZ return BuildResult::CompilationFailed; } - auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (readJsonResult.IsSuccess()) { @@ -1171,7 +1171,7 @@ namespace AZ AZStd::string outputFile = m_inputFilePath; AzFramework::StringFunc::Path::ReplaceExtension(outputFile, outputExtension); - auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto readJsonResult = JsonSerializationUtils::ReadJsonFile(outputFile, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (readJsonResult.IsSuccess()) { diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp index 6b673759cf..6673da2be3 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp @@ -556,7 +556,7 @@ namespace AZ shaderAssetCreator.SetRenderStates(renderStates); } - Outcome hlslSourceCodeOutcome = Utils::ReadFile(hlslFullPath, AZ::RPI::JsonUtils::AtomMaxFileSize); + Outcome hlslSourceCodeOutcome = Utils::ReadFile(hlslFullPath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!hlslSourceCodeOutcome.IsSuccess()) { AZ_Error( diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp index 9c616569bd..e47dd55a97 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp @@ -52,7 +52,7 @@ namespace AZ { RPI::ShaderSourceData shaderSourceData; - auto document = JsonSerializationUtils::ReadJsonFile(fullPathToJsonFile, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto document = JsonSerializationUtils::ReadJsonFile(fullPathToJsonFile, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!document.IsSuccess()) { @@ -128,7 +128,7 @@ namespace AZ AZStd::unordered_map> outcomes; for (int i : indicesOfInterest) { - outcomes[i] = JsonSerializationUtils::ReadJsonFile(pathOfJsonFiles[i], AZ::RPI::JsonUtils::AtomMaxFileSize); + outcomes[i] = JsonSerializationUtils::ReadJsonFile(pathOfJsonFiles[i], AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!outcomes[i].IsSuccess()) { AZ_Error(builderName, false, "%s", outcomes[i].GetError().c_str()); @@ -623,7 +623,7 @@ namespace AZ StructData inputStruct; inputStruct.m_id = ""; - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToIaJson, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToIaJson, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderBuilderUtilityName, false, "%s", jsonOutcome.GetError().c_str()); @@ -716,7 +716,7 @@ namespace AZ StructData outputStruct; outputStruct.m_id = ""; - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToOmJson, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(pathToOmJson, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderBuilderUtilityName, false, "%s", jsonOutcome.GetError().c_str()); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp index 5a552a2702..7c5be89508 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderVariantAssetBuilder.cpp @@ -478,7 +478,7 @@ namespace AZ RPI::Ptr shaderOptionGroupLayout = RPI::ShaderOptionGroupLayout::Create(); // The shader options define what options are available, what are the allowed values/range // for each option and what is its default value. - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(optionsGroupJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(optionsGroupJsonPath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -509,7 +509,7 @@ namespace AZ } auto functionsJsonPath = functionsJsonPathOutcome.TakeValue(); - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(functionsJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(functionsJsonPath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -541,7 +541,7 @@ namespace AZ } auto srgJsonPath = srgJsonPathOutcome.TakeValue(); - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(srgJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(srgJsonPath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -598,7 +598,7 @@ namespace AZ } auto bindingsJsonPath = bindingsJsonPathOutcome.TakeValue(); - auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(bindingsJsonPath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto jsonOutcome = JsonSerializationUtils::ReadJsonFile(bindingsJsonPath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!jsonOutcome.IsSuccess()) { AZ_Error(ShaderVariantAssetBuilderName, false, "%s", jsonOutcome.GetError().c_str()); @@ -630,7 +630,7 @@ namespace AZ } hlslSourcePath = hlslSourcePathOutcome.TakeValue(); - Outcome hlslSourceOutcome = Utils::ReadFile(hlslSourcePath, AZ::RPI::JsonUtils::AtomMaxFileSize); + Outcome hlslSourceOutcome = Utils::ReadFile(hlslSourcePath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!hlslSourceOutcome.IsSuccess()) { AZ_Error( diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h index 913a9702b1..4715acd64c 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Edit/Common/JsonUtils.h @@ -22,7 +22,7 @@ namespace AZ { //! Protects from allocating too much memory. The choice of a 1MB threshold is arbitrary. //! If you need to work with larger files, please use AZ::IO directly instead of these utility functions. - inline constexpr size_t AtomMaxFileSize = 1024 * 1024; + inline constexpr size_t DefaultMaxFileSize = 1024 * 1024; // Declarations... @@ -43,7 +43,7 @@ namespace AZ { objectData = ObjectType(); - auto loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(path, AtomMaxFileSize); + auto loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(path, DefaultMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error("AZ::RPI::JsonUtils", false, "%s", loadOutcome.GetError().c_str()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp index 62e078c628..5ddeb08ef8 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Builders/Material/MaterialBuilder.cpp @@ -152,7 +152,7 @@ namespace AZ AZStd::string fullSourcePath; AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.data(), request.m_sourceFile.data(), fullSourcePath, true); - auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error(MaterialBuilderName, false, "%s", loadOutcome.GetError().c_str()); @@ -299,7 +299,7 @@ namespace AZ AZStd::string fullSourcePath; AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.data(), request.m_sourceFile.data(), fullSourcePath, true); - auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto loadOutcome = JsonSerializationUtils::ReadJsonFile(fullSourcePath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error(MaterialBuilderName, false, "Failed to load material file: %s", loadOutcome.GetError().c_str()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp index 6f68115ccb..5e4af07aae 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialSourceDataSerializer.cpp @@ -68,7 +68,7 @@ namespace AZ { AZStd::string materialTypePath = AssetUtils::ResolvePathReference(jsonFileLoadContext->GetFilePath(), materialSourceData->m_materialType); - auto materialTypeJson = JsonSerializationUtils::ReadJsonFile(materialTypePath, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto materialTypeJson = JsonSerializationUtils::ReadJsonFile(materialTypePath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!materialTypeJson.IsSuccess()) { AZStd::string failureMessage; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp index 80b292ea9b..62f4f02e3c 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Edit/Material/MaterialUtils.cpp @@ -65,7 +65,7 @@ namespace AZ AZ::Outcome loadOutcome; if (document == nullptr) { - loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(filePath, AZ::RPI::JsonUtils::AtomMaxFileSize); + loadOutcome = AZ::JsonSerializationUtils::ReadJsonFile(filePath, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!loadOutcome.IsSuccess()) { AZ_Error("AZ::RPI::JsonUtils", false, "%s", loadOutcome.GetError().c_str()); diff --git a/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp b/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp index 8270901b6b..92e09bf4b1 100644 --- a/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp +++ b/Gems/AtomLyIntegration/AtomBridge/Code/Source/Editor/AssetCollectionAsyncLoaderTestComponent.cpp @@ -115,7 +115,7 @@ namespace AZ { rapidjson::Document jsonDoc; - auto readJsonResult = JsonSerializationUtils::ReadJsonFile(pathToAssetListJson, AZ::RPI::JsonUtils::AtomMaxFileSize); + auto readJsonResult = JsonSerializationUtils::ReadJsonFile(pathToAssetListJson, AZ::RPI::JsonUtils::DefaultMaxFileSize); if (!readJsonResult.IsSuccess()) { From 2c55ea574da185ea14aefec1b9b801c073fece1b Mon Sep 17 00:00:00 2001 From: santorac <55155825+santorac@users.noreply.github.com> Date: Mon, 13 Sep 2021 16:56:00 -0700 Subject: [PATCH 290/355] Added a new ScopedValue utility class that simply sets a value when it goes out of scope. This is particularly handy for flags that track whether the callstack is inside a particular scope, like a m_isInitializing flag. Signed-off-by: santorac <55155825+santorac@users.noreply.github.com> --- .../AtomCore/AtomCore/Utils/ScopedValue.h | 36 ++++++++++++++++++ .../AtomCore/AtomCore/atomcore_files.cmake | 1 + .../AtomCore/Tests/ScopedValueTest.cpp | 37 +++++++++++++++++++ .../AtomCore/Tests/atomcore_tests_files.cmake | 1 + 4 files changed, 75 insertions(+) create mode 100644 Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h create mode 100644 Code/Framework/AtomCore/Tests/ScopedValueTest.cpp diff --git a/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h b/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h new file mode 100644 index 0000000000..8cb985cffe --- /dev/null +++ b/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include + +namespace AZ +{ + //! Sets a variable upon construction and again when the object goes out of scope. + template + class ScopedValue + { + private: + T* m_ptr; + T m_finalValue; + + public: + ScopedValue(T* ptr, T initialValue, T finalValue) + { + m_ptr = ptr; + *m_ptr = initialValue; + m_finalValue = finalValue; + } + + ~ScopedValue() + { + *m_ptr = m_finalValue; + } + }; + +} // namespace AZ diff --git a/Code/Framework/AtomCore/AtomCore/atomcore_files.cmake b/Code/Framework/AtomCore/AtomCore/atomcore_files.cmake index c90263468f..9167c1e645 100644 --- a/Code/Framework/AtomCore/AtomCore/atomcore_files.cmake +++ b/Code/Framework/AtomCore/AtomCore/atomcore_files.cmake @@ -19,4 +19,5 @@ set(FILES std/containers/vector_set.h std/containers/vector_set_base.h std/parallel/concurrency_checker.h + Utils/ScopedValue.h ) diff --git a/Code/Framework/AtomCore/Tests/ScopedValueTest.cpp b/Code/Framework/AtomCore/Tests/ScopedValueTest.cpp new file mode 100644 index 0000000000..9578cb2329 --- /dev/null +++ b/Code/Framework/AtomCore/Tests/ScopedValueTest.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +namespace UnitTest +{ + TEST(ScopedValueTest, TestBoolValue) + { + bool localValue = false; + + { + AZ::ScopedValue scopedValue(&localValue, true, false); + EXPECT_EQ(true, localValue); + } + + EXPECT_EQ(false, localValue); + } + + TEST(ScopedValueTest, TestIntValue) + { + int localValue = 0; + + { + AZ::ScopedValue scopedValue(&localValue, 1, 2); + EXPECT_EQ(1, localValue); + } + + EXPECT_EQ(2, localValue); + } +} diff --git a/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake b/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake index 0f5fcb441d..4522a4b7b6 100644 --- a/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake +++ b/Code/Framework/AtomCore/Tests/atomcore_tests_files.cmake @@ -12,5 +12,6 @@ set(FILES InstanceDatabase.cpp lru_cache.cpp Main.cpp + ScopedValueTest.cpp vector_set.cpp ) From f75fa435f9fbb2ae272875e80fb40bb39dd7a938 Mon Sep 17 00:00:00 2001 From: santorac <55155825+santorac@users.noreply.github.com> Date: Mon, 13 Sep 2021 17:00:58 -0700 Subject: [PATCH 291/355] Made a couple imporvements to material_find_overrides_demo.lua: - Made the target material slot name configurable through an exposed component property. - Fixed a timing issue where the assignmentId was invalid if FindMaterialAssignmentId is called too early. Signed-off-by: santorac <55155825+santorac@users.noreply.github.com> --- .../Scripts/material_find_overrides_demo.lua | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/Gems/Atom/Feature/Common/Assets/Scripts/material_find_overrides_demo.lua b/Gems/Atom/Feature/Common/Assets/Scripts/material_find_overrides_demo.lua index 41df35e355..4a1b8c8f06 100644 --- a/Gems/Atom/Feature/Common/Assets/Scripts/material_find_overrides_demo.lua +++ b/Gems/Atom/Feature/Common/Assets/Scripts/material_find_overrides_demo.lua @@ -22,6 +22,7 @@ local FindMaterialAssignmentTest = "materials/presets/macbeth/12_orange_yellow_srgb.tif.streamingimage", "materials/presets/macbeth/17_magenta_srgb.tif.streamingimage" }, + MaterialSlotFilter = "" }, } @@ -50,18 +51,6 @@ function FindMaterialAssignmentTest:OnActivate() self.colors = {} self.lerpDirs = {} - self.assignmentIds = - { - MaterialComponentRequestBus.Event.FindMaterialAssignmentId(self.entityId, -1, "lambert"), - } - - for index = 1, #self.assignmentIds do - local id = self.assignmentIds[index] - if (id ~= nil) then - self.colors[index] = randomColor() - self.lerpDirs[index] = randomDir() - end - end self.tickBusHandler = TickBus.Connect(self); end @@ -144,10 +133,33 @@ function FindMaterialAssignmentTest:lerpColors(deltaTime) end function FindMaterialAssignmentTest:OnTick(deltaTime, timePoint) + + + if(nil == self.assignmentIds) then + + local originalAssignments = MaterialComponentRequestBus.Event.GetOriginalMaterialAssignments(self.entityId) + if(nil == originalAssignments or #originalAssignments <= 1) then -- There is always 1 entry for the default assignment; a loaded model will have at least 2 assignments + return + end + + self.assignmentIds = + { + MaterialComponentRequestBus.Event.FindMaterialAssignmentId(self.entityId, -1, self.Properties.MaterialSlotFilter), + } + + for index = 1, #self.assignmentIds do + local id = self.assignmentIds[index] + if (id ~= nil) then + self.colors[index] = randomColor() + self.lerpDirs[index] = randomDir() + end + end + end + self.timer = self.timer + deltaTime self.totalTime = self.totalTime + deltaTime self:lerpColors(deltaTime) - + if (self.timer > self.timeUpdate and self.totalTime < self.totalTimeMax) then self.timer = self.timer - self.timeUpdate self:UpdateProperties() @@ -155,6 +167,7 @@ function FindMaterialAssignmentTest:OnTick(deltaTime, timePoint) self:ClearProperties() self.tickBusHandler:Disconnect(self); end + end -return FindMaterialAssignmentTest \ No newline at end of file +return FindMaterialAssignmentTest From 0d0b6c80330d2804d494d1944713db596c584f14 Mon Sep 17 00:00:00 2001 From: brianherrera Date: Mon, 13 Sep 2021 17:04:47 -0700 Subject: [PATCH 292/355] Add support for nvme volumes Signed-off-by: brianherrera --- scripts/build/bootstrap/incremental_build_util.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scripts/build/bootstrap/incremental_build_util.py b/scripts/build/bootstrap/incremental_build_util.py index 10543d5951..101e31b5db 100644 --- a/scripts/build/bootstrap/incremental_build_util.py +++ b/scripts/build/bootstrap/incremental_build_util.py @@ -320,10 +320,14 @@ def mount_volume_to_device(created): time.sleep(1) else: - subprocess.call(['file', '-s', '/dev/xvdf']) + device_name = '/dev/xvdf' + nvme_device_name = '/dev/nvme1n1' + if os.path.exists(nvme_device_name): + device_name = nvme_device_name + subprocess.call(['file', '-s', device_name]) if created: - subprocess.call(['mkfs', '-t', 'ext4', '/dev/xvdf']) - subprocess.call(['mount', '/dev/xvdf', MOUNT_PATH]) + subprocess.call(['mkfs', '-t', 'ext4', device_name]) + subprocess.call(['mount', device_name, MOUNT_PATH]) def attach_volume_to_ec2_instance(volume, volume_id, instance_id, timeout_duration=DEFAULT_TIMEOUT): @@ -515,4 +519,4 @@ def main(action, snapshot_hint, repository_name, project, pipeline, branch, plat if __name__ == "__main__": args = parse_args() ret = main(args.action, args.snapshot_hint, args.repository_name, args.project, args.pipeline, args.branch, args.platform, args.build_type, args.disk_size, args.disk_type) - sys.exit(ret) \ No newline at end of file + sys.exit(ret) From 51f101748dda11a34a5308d3e27055e06507c069 Mon Sep 17 00:00:00 2001 From: santorac <55155825+santorac@users.noreply.github.com> Date: Mon, 13 Sep 2021 17:05:11 -0700 Subject: [PATCH 293/355] These changes make material system report warnings when gameplay scripts attempt to change PSO-impacting material properties at runtime. So far the material system has always allowed any properties to be changed at runtime, including those that affect Pipeline State Objects (PSOs), as this is supported on several platforms. But some platforms require that Pipeline State Objects be pre-compiled and shipped with the game. At some point we will need to add new restrictions that limit what material properties can be changed at runtime. In the meantime, these warnings should alert users to avoid this, as the functionality likely won't be supported in the future. - Made the Material and LuaMaterialFunctor classes configurable to report errors or warnings when material properties modify Pipeline State Objects. This is controlled by a new "MaterialPropertyPsoHandling" enum. - Made the EditorMaterialComponent override PSO handling as Enabled, to prevent warnings when the user is editing material instance property overrides. This requried a new MaterialComponentNotificationBus bus message "OnMaterialInstanceCreated". - Removed unnecessary GetMaterialPropertyDependencies member from material functor context classes, as this is already available as part of the functor itself. - Made Material::SetPropertyValue return early when the property value hadn't actually changed. Besides being more efficientn, this prevents unnecessary spamming of the new warning. Signed-off-by: santorac <55155825+santorac@users.noreply.github.com> --- .../Atom/RPI.Public/Material/Material.h | 20 ++- .../RPI.Reflect/Material/LuaMaterialFunctor.h | 22 +++- .../RPI.Reflect/Material/MaterialFunctor.h | 34 +++++- .../Source/RPI.Public/Material/Material.cpp | 28 ++++- .../Material/LuaMaterialFunctor.cpp | 115 ++++++++++++++---- .../RPI.Reflect/Material/MaterialFunctor.cpp | 4 +- .../Code/Source/Document/MaterialDocument.cpp | 4 + .../Material/MaterialComponentBus.h | 9 +- .../Material/EditorMaterialComponent.cpp | 14 ++- .../Source/Material/EditorMaterialComponent.h | 1 + .../Material/MaterialComponentController.cpp | 5 + 11 files changed, 217 insertions(+), 39 deletions(-) diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h index 59c5d571fc..3976ef989b 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Material/Material.h @@ -74,6 +74,7 @@ namespace AZ MaterialPropertyIndex FindPropertyIndex(const Name& name) const; //! Sets the value of a material property. The template data type must match the property's data type. + //! @return true if property value was changed template bool SetPropertyValue(MaterialPropertyIndex index, const Type& value); @@ -81,12 +82,15 @@ namespace AZ template const Type& GetPropertyValue(MaterialPropertyIndex index) const; - //! Gets flags indicating which properties have been modified. - const MaterialPropertyFlags& GetPropertyDirtyFlags() const; - + //! Sets the value of a material property. The @value data type must match the property's data type. + //! @return true if property value was changed bool SetPropertyValue(MaterialPropertyIndex index, const MaterialPropertyValue& value); + const MaterialPropertyValue& GetPropertyValue(MaterialPropertyIndex index) const; const AZStd::vector& GetPropertyValues() const; + + //! Gets flags indicating which properties have been modified. + const MaterialPropertyFlags& GetPropertyDirtyFlags() const; //! Gets the material properties layout. RHI::ConstPtr GetMaterialPropertiesLayout() const; @@ -111,6 +115,12 @@ namespace AZ //! @param return the number of shader options that were updated, or Failure if the material owns the indicated shader option. AZ::Outcome SetSystemShaderOption(const Name& shaderOptionName, RPI::ShaderOptionValue value); + //! Override the material's default PSO handling setting. + //! This is normally used in tools like Asset Processor or Material Editor to allow changes that impact + //! Pipeline State Objects which is not allowed at runtime. See MaterialPropertyPsoHandling for more details. + //! Do not set this in the shipping runtime unless you know what you are doing. + void SetPsoHandlingOverride(MaterialPropertyPsoHandling psoHandlingOverride); + const RHI::ShaderResourceGroup* GetRHIShaderResourceGroup() const; const Data::Asset& GetAsset() const; @@ -189,6 +199,10 @@ namespace AZ //! Records the m_currentChangeId when the material was last compiled. ChangeId m_compiledChangeId = DEFAULT_CHANGE_ID; + + bool m_isInitializing = false; + + MaterialPropertyPsoHandling m_psoHandling = MaterialPropertyPsoHandling::Warning; }; } // namespace RPI diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h index 026e9f7f18..5f4dce40e5 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/LuaMaterialFunctor.h @@ -83,14 +83,19 @@ namespace AZ AZ_TYPE_INFO(AZ::RPI::LuaMaterialFunctorCommonContext, "{2CCCB9A9-AD4F-447C-B587-E7A91CEA8088}"); explicit LuaMaterialFunctorCommonContext(MaterialFunctor::RuntimeContext* runtimeContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix); explicit LuaMaterialFunctorCommonContext(MaterialFunctor::EditorContext* editorContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix); + + //! Returns false if PSO changes are not allowed, and may report errors or warnings + bool CheckPsoChangesAllowed(); protected: @@ -100,6 +105,12 @@ namespace AZ MaterialPropertyIndex GetMaterialPropertyIndex(const char* name, const char* functionName) const; const MaterialPropertyValue& GetMaterialPropertyValue(MaterialPropertyIndex propertyIndex) const; + + MaterialPropertyPsoHandling GetMaterialPropertyPsoHandling() const; + + RHI::ConstPtr GetMaterialPropertiesLayout() const; + + AZStd::string GetMaterialPropertyDependenciesString() const; // These are prefix strings that will be applied to every name lookup in the lua functor. // This allows the lua script to be reused in different contexts. @@ -112,6 +123,8 @@ namespace AZ // Only one of these will be valid MaterialFunctor::RuntimeContext* m_runtimeContextImpl = nullptr; MaterialFunctor::EditorContext* m_editorContextImpl = nullptr; + const MaterialPropertyFlags* m_materialPropertyDependencies = nullptr; + bool m_psoChangesReported = false; //!< errors/warnings about PSO changes will only be reported once per execution of the functor }; //! Wraps RHI::RenderStates for LuaMaterialFunctor access @@ -241,7 +254,11 @@ namespace AZ static void Reflect(BehaviorContext* behaviorContext); - explicit LuaMaterialFunctorShaderItem(ShaderCollection::Item* shaderItem) : m_shaderItem(shaderItem) {} + LuaMaterialFunctorShaderItem() : + m_context(nullptr), m_shaderItem(nullptr) {} + + explicit LuaMaterialFunctorShaderItem(LuaMaterialFunctorCommonContext* context, ShaderCollection::Item* shaderItem) : + m_context(context), m_shaderItem(shaderItem) {} LuaMaterialFunctorRenderStates GetRenderStatesOverride(); void SetEnabled(bool enable); @@ -253,6 +270,7 @@ namespace AZ private: void SetShaderOptionValue(const Name& name, AZStd::function setValueCommand); + LuaMaterialFunctorCommonContext* m_context = nullptr; ShaderCollection::Item* m_shaderItem = nullptr; }; @@ -265,6 +283,7 @@ namespace AZ static void Reflect(BehaviorContext* behaviorContext); explicit LuaMaterialFunctorRuntimeContext(MaterialFunctor::RuntimeContext* runtimeContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix); @@ -304,6 +323,7 @@ namespace AZ static void Reflect(BehaviorContext* behaviorContext); explicit LuaMaterialFunctorEditorContext(MaterialFunctor::EditorContext* editorContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h index 682183f70c..09d10bf538 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Reflect/Material/MaterialFunctor.h @@ -28,6 +28,24 @@ namespace AZ class MaterialPropertiesLayout; using MaterialPropertyFlags = AZStd::bitset; + + //! Indicates how the material system should respond to any material property changes that + //! impact Pipeline State Object configuration. This is significant because some platforms + //! require that PSOs be pre-compiled and shipped with the game. + enum class MaterialPropertyPsoHandling + { + //! PSO-impacting property changes are not allowed, are ignored, and will report an error. + //! This should be used at runtime. It is recommended to do this on all platforms, not just the restricted ones, + //! to encourage best-practices. However, if a game project is not shipping on any restricted platforms, + //! then the team could decide to allow PSO changes. + Error, + + //! PSO-impacting property changes are allowed, but produce a warning message. + Warning, + + //! PSO-impacting property changes are allowed. This can be used during asset processing, in developer tools, or on platforms that don't restrict PSO changes. + Allowed + }; //! MaterialFunctor objects provide custom logic and calculations to configure shaders, render states, //! editor metadata, and more. @@ -81,6 +99,8 @@ namespace AZ const MaterialPropertyValue& GetMaterialPropertyValue(const MaterialPropertyIndex& index) const; const MaterialPropertiesLayout* GetMaterialPropertiesLayout() const { return m_materialPropertiesLayout.get(); } + + MaterialPropertyPsoHandling GetMaterialPropertyPsoHandling() const { return m_psoHandling; } //! Set the value of a shader option //! @param shaderIndex the index of a shader in the material's ShaderCollection @@ -126,16 +146,18 @@ namespace AZ RHI::ConstPtr materialPropertiesLayout, ShaderCollection* shaderCollection, ShaderResourceGroup* shaderResourceGroup, - const MaterialPropertyFlags* materialPropertyDependencies + const MaterialPropertyFlags* materialPropertyDependencies, + MaterialPropertyPsoHandling psoHandling ); private: bool SetShaderOptionValue(ShaderCollection::Item& shaderItem, ShaderOptionIndex optionIndex, ShaderOptionValue value); const AZStd::vector& m_materialPropertyValues; RHI::ConstPtr m_materialPropertiesLayout; - ShaderCollection* m_shaderCollection; - ShaderResourceGroup* m_shaderResourceGroup; + ShaderCollection* m_shaderCollection; + ShaderResourceGroup* m_shaderResourceGroup; const MaterialPropertyFlags* m_materialPropertyDependencies = nullptr; + MaterialPropertyPsoHandling m_psoHandling = MaterialPropertyPsoHandling::Error; }; class EditorContext @@ -144,7 +166,7 @@ namespace AZ public: const MaterialPropertyDynamicMetadata* GetMaterialPropertyMetadata(const Name& propertyName) const; const MaterialPropertyDynamicMetadata* GetMaterialPropertyMetadata(const MaterialPropertyIndex& index) const; - + const MaterialPropertyGroupDynamicMetadata* GetMaterialPropertyGroupMetadata(const Name& propertyName) const; //! Get the property value. The type must be one of those in MaterialPropertyValue. @@ -158,6 +180,8 @@ namespace AZ const MaterialPropertyValue& GetMaterialPropertyValue(const MaterialPropertyIndex& index) const; const MaterialPropertiesLayout* GetMaterialPropertiesLayout() const { return m_materialPropertiesLayout.get(); } + + MaterialPropertyPsoHandling GetMaterialPropertyPsoHandling() const { return MaterialPropertyPsoHandling::Allowed; } //! Set the visibility dynamic metadata of a material property. bool SetMaterialPropertyVisibility(const Name& propertyName, MaterialPropertyVisibility visibility); @@ -177,7 +201,7 @@ namespace AZ bool SetMaterialPropertySoftMaxValue(const Name& propertyName, const MaterialPropertyValue& max); bool SetMaterialPropertySoftMaxValue(const MaterialPropertyIndex& index, const MaterialPropertyValue& max); - + bool SetMaterialPropertyGroupVisibility(const Name& propertyGroupName, MaterialPropertyGroupVisibility visibility); // [GFX TODO][ATOM-4168] Replace the workaround for unlink-able RPI.Public classes in MaterialFunctor diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp index 3b82114a69..2dcaa70deb 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Material/Material.cpp @@ -20,6 +20,7 @@ #include #include +#include namespace AZ { @@ -58,6 +59,8 @@ namespace AZ { AZ_TRACE_METHOD(); + ScopedValue isInitializing(&m_isInitializing, true, false); + m_materialAsset = { &materialAsset, AZ::Data::AssetLoadBehavior::PreLoad }; // Cache off pointers to some key data structures from the material type... @@ -198,6 +201,11 @@ namespace AZ return AZ::Success(appliedCount); } + void Material::SetPsoHandlingOverride(MaterialPropertyPsoHandling psoHandlingOverride) + { + m_psoHandling = psoHandlingOverride; + } + const RHI::ShaderResourceGroup* Material::GetRHIShaderResourceGroup() const { return m_rhiShaderResourceGroup; @@ -310,6 +318,16 @@ namespace AZ if (NeedsCompile() && CanCompile()) { + // On some platforms, PipelineStateObjects must be pre-compiled and shipped with the game; they cannot be compiled at runtime. So at some + // point the material system needs to be smart about when it allows PSO changes and when it doesn't. There is a task scheduled to + // thoroughly address this in 2022, but for now we just report a warning to alert users who are using the engine in a way that might + // not be supported for much longer. PSO changes should only be allowed in developer tools (though we could also expose a way for users to + // enable dynamic PSO changes if their project only targets platforms that support this). + // PSO modifications are allowed during initialization because that's using the stored asset data, which the asset system can + // access to pre-compile the necessary PSOs. + MaterialPropertyPsoHandling psoHandling = m_isInitializing ? MaterialPropertyPsoHandling::Allowed : m_psoHandling; + + AZ_PROFILE_BEGIN(RPI, "Material::Compile() Processing Functors"); for (const Ptr& functor : m_materialAsset->GetMaterialFunctors()) { @@ -325,7 +343,8 @@ namespace AZ m_layout, &m_shaderCollection, m_shaderResourceGroup.get(), - &materialPropertyDependencies + &materialPropertyDependencies, + psoHandling ); @@ -484,6 +503,13 @@ namespace AZ } MaterialPropertyValue& savedPropertyValue = m_propertyValues[index.GetIndex()]; + + // If the property value didn't actually change, don't waste time running functors and compiling the changes + if (savedPropertyValue == value) + { + return false; + } + savedPropertyValue = value; m_propertyDirtyFlags.set(index.GetIndex()); m_propertyOverrideFlags.set(index.GetIndex()); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp index 77902093f0..9338d52cb2 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/LuaMaterialFunctor.cpp @@ -128,7 +128,7 @@ namespace AZ if (m_scriptStatus == ScriptStatus::Ready) { - LuaMaterialFunctorRuntimeContext luaContext{&context, m_propertyNamePrefix, m_srgNamePrefix, m_optionsNamePrefix}; + LuaMaterialFunctorRuntimeContext luaContext{&context, &GetMaterialPropertyDependencies(), m_propertyNamePrefix, m_srgNamePrefix, m_optionsNamePrefix}; AZ::ScriptDataContext call; if (m_scriptContext->Call("Process", call)) { @@ -146,7 +146,7 @@ namespace AZ if (m_scriptStatus == ScriptStatus::Ready) { - LuaMaterialFunctorEditorContext luaContext{&context, m_propertyNamePrefix, m_srgNamePrefix, m_optionsNamePrefix}; + LuaMaterialFunctorEditorContext luaContext{&context, &GetMaterialPropertyDependencies(), m_propertyNamePrefix, m_srgNamePrefix, m_optionsNamePrefix}; AZ::ScriptDataContext call; if (m_scriptContext->Call("ProcessEditor", call)) { @@ -157,10 +157,12 @@ namespace AZ } LuaMaterialFunctorCommonContext::LuaMaterialFunctorCommonContext(MaterialFunctor::RuntimeContext* runtimeContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix) : m_runtimeContextImpl(runtimeContextImpl) + , m_materialPropertyDependencies(materialPropertyDependencies) , m_propertyNamePrefix(propertyNamePrefix) , m_srgNamePrefix(srgNamePrefix) , m_optionsNamePrefix(optionsNamePrefix) @@ -168,34 +170,96 @@ namespace AZ } LuaMaterialFunctorCommonContext::LuaMaterialFunctorCommonContext(MaterialFunctor::EditorContext* editorContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix) : m_editorContextImpl(editorContextImpl) + , m_materialPropertyDependencies(materialPropertyDependencies) , m_propertyNamePrefix(propertyNamePrefix) , m_srgNamePrefix(srgNamePrefix) , m_optionsNamePrefix(optionsNamePrefix) { } + + MaterialPropertyPsoHandling LuaMaterialFunctorCommonContext::GetMaterialPropertyPsoHandling() const + { + if (m_runtimeContextImpl) + { + return m_runtimeContextImpl->GetMaterialPropertyPsoHandling(); + } + else + { + return m_editorContextImpl->GetMaterialPropertyPsoHandling(); + } + } + + RHI::ConstPtr LuaMaterialFunctorCommonContext::GetMaterialPropertiesLayout() const + { + if (m_runtimeContextImpl) + { + return m_runtimeContextImpl->GetMaterialPropertiesLayout(); + } + else + { + return m_editorContextImpl->GetMaterialPropertiesLayout(); + } + } + + AZStd::string LuaMaterialFunctorCommonContext::GetMaterialPropertyDependenciesString() const + { + AZStd::vector propertyList; + for (size_t i = 0; i < m_materialPropertyDependencies->size(); ++i) + { + if ((*m_materialPropertyDependencies)[i]) + { + propertyList.push_back(GetMaterialPropertiesLayout()->GetPropertyDescriptor(MaterialPropertyIndex{i})->GetName().GetStringView()); + } + } + + AZStd::string propertyListString; + AzFramework::StringFunc::Join(propertyListString, propertyList.begin(), propertyList.end(), ", "); + + return propertyListString; + } + + bool LuaMaterialFunctorCommonContext::CheckPsoChangesAllowed() + { + if (GetMaterialPropertyPsoHandling() == MaterialPropertyPsoHandling::Error) + { + if (!m_psoChangesReported) + { + LuaMaterialFunctorUtilities::Script_Error( + AZStd::string::format( + "The following material properties must not be changed at runtime because they impact Pipeline State Objects: %s", GetMaterialPropertyDependenciesString().c_str())); + + m_psoChangesReported = true; + } + + return false; + } + else if (GetMaterialPropertyPsoHandling() == MaterialPropertyPsoHandling::Warning) + { + if (!m_psoChangesReported) + { + LuaMaterialFunctorUtilities::Script_Warning( + AZStd::string::format( + "The following material properties should not be changed at runtime because they impact Pipeline State Objects: %s", GetMaterialPropertyDependenciesString().c_str())); + + m_psoChangesReported = true; + } + } + + return true; + } MaterialPropertyIndex LuaMaterialFunctorCommonContext::GetMaterialPropertyIndex(const char* name, const char* functionName) const { MaterialPropertyIndex propertyIndex; Name propertyFullName{m_propertyNamePrefix + name}; - - if (m_runtimeContextImpl) - { - propertyIndex = m_runtimeContextImpl->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyFullName); - } - else if (m_editorContextImpl) - { - propertyIndex = m_editorContextImpl->GetMaterialPropertiesLayout()->FindPropertyIndex(propertyFullName); - } - else - { - AZ_Assert(false, "Context not initialized properly"); - } + + propertyIndex = GetMaterialPropertiesLayout()->FindPropertyIndex(propertyFullName); if (!propertyIndex.IsValid()) { @@ -297,10 +361,11 @@ namespace AZ } LuaMaterialFunctorRuntimeContext::LuaMaterialFunctorRuntimeContext(MaterialFunctor::RuntimeContext* runtimeContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix) - : LuaMaterialFunctorCommonContext(runtimeContextImpl, propertyNamePrefix, srgNamePrefix, optionsNamePrefix) + : LuaMaterialFunctorCommonContext(runtimeContextImpl, materialPropertyDependencies, propertyNamePrefix, srgNamePrefix, optionsNamePrefix) , m_runtimeContextImpl(runtimeContextImpl) { } @@ -331,7 +396,7 @@ namespace AZ if (!shaderItem.MaterialOwnsShaderOption(optionIndex)) { - LuaMaterialFunctorUtilities::Script_Error(AZStd::string::format("Shader option '%s' is not owned by this material.", fullOptionName.GetCStr()).c_str()); + LuaMaterialFunctorUtilities::Script_Error(AZStd::string::format("Shader option '%s' is not owned by this material.", fullOptionName.GetCStr())); break; } @@ -398,12 +463,12 @@ namespace AZ { if (index < GetShaderCount()) { - return LuaMaterialFunctorShaderItem{&(*m_runtimeContextImpl->m_shaderCollection)[index]}; + return LuaMaterialFunctorShaderItem{this, &(*m_runtimeContextImpl->m_shaderCollection)[index]}; } else { LuaMaterialFunctorUtilities::Script_Error(AZStd::string::format("GetShader(%zu) is invalid.", index)); - return LuaMaterialFunctorShaderItem{nullptr}; + return {}; } } @@ -412,13 +477,13 @@ namespace AZ const AZ::Name tag{shaderTag}; if (m_runtimeContextImpl->m_shaderCollection->HasShaderTag(tag)) { - return LuaMaterialFunctorShaderItem{&(*m_runtimeContextImpl->m_shaderCollection)[tag]}; + return LuaMaterialFunctorShaderItem{this, &(*m_runtimeContextImpl->m_shaderCollection)[tag]}; } else { LuaMaterialFunctorUtilities::Script_Error(AZStd::string::format( "GetShaderByTag('%s') is invalid: Could not find a shader with the tag '%s'.", tag.GetCStr(), tag.GetCStr())); - return LuaMaterialFunctorShaderItem{nullptr}; + return {}; } } @@ -459,10 +524,11 @@ namespace AZ } LuaMaterialFunctorEditorContext::LuaMaterialFunctorEditorContext(MaterialFunctor::EditorContext* editorContextImpl, + const MaterialPropertyFlags* materialPropertyDependencies, const AZStd::string& propertyNamePrefix, const AZStd::string& srgNamePrefix, const AZStd::string& optionsNamePrefix) - : LuaMaterialFunctorCommonContext(editorContextImpl, propertyNamePrefix, srgNamePrefix, optionsNamePrefix) + : LuaMaterialFunctorCommonContext(editorContextImpl, materialPropertyDependencies, propertyNamePrefix, srgNamePrefix, optionsNamePrefix) , m_editorContextImpl(editorContextImpl) { } @@ -595,7 +661,7 @@ namespace AZ LuaMaterialFunctorRenderStates LuaMaterialFunctorShaderItem::GetRenderStatesOverride() { - if (m_shaderItem) + if (m_context->CheckPsoChangesAllowed() && m_shaderItem) { return LuaMaterialFunctorRenderStates{m_shaderItem->GetRenderStatesOverlay()}; } @@ -638,8 +704,7 @@ namespace AZ { LuaMaterialFunctorUtilities::Script_Error( AZStd::string::format( - "Shader option '%s' is not owned by the shader '%s'.", name.GetCStr(), m_shaderItem->GetShaderTag().GetCStr()) - .c_str()); + "Shader option '%s' is not owned by the shader '%s'.", name.GetCStr(), m_shaderItem->GetShaderTag().GetCStr())); return; } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp index d08fa3e58e..0f70d0af35 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialFunctor.cpp @@ -35,13 +35,15 @@ namespace AZ RHI::ConstPtr materialPropertiesLayout, ShaderCollection* shaderCollection, ShaderResourceGroup* shaderResourceGroup, - const MaterialPropertyFlags* materialPropertyDependencies + const MaterialPropertyFlags* materialPropertyDependencies, + MaterialPropertyPsoHandling psoHandling ) : m_materialPropertyValues(propertyValues) , m_materialPropertiesLayout(materialPropertiesLayout) , m_shaderCollection(shaderCollection) , m_shaderResourceGroup(shaderResourceGroup) , m_materialPropertyDependencies(materialPropertyDependencies) + , m_psoHandling(psoHandling) {} bool MaterialFunctor::RuntimeContext::SetShaderOptionValue(ShaderCollection::Item& shaderItem, ShaderOptionIndex optionIndex, ShaderOptionValue value) diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp index 11834beb73..d032f35e38 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocument.cpp @@ -763,6 +763,10 @@ namespace MaterialEditor return false; } + // Pipeline State Object changes are always allowed in the material editor because it only runs on developer systems + // where such changes are supported at runtime. + m_materialInstance->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed); + // Populate the property map from a combination of source data and assets // Assets must still be used for now because they contain the final accumulated value after all other materials // in the hierarchy are applied diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h index 01c87fa2fb..1ed8469749 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h @@ -105,8 +105,15 @@ namespace AZ : public ComponentBus { public: - virtual void OnMaterialsUpdated([[maybe_unused]] const MaterialAssignmentMap& materials) {} + + //! This message is sent every time a material property is updated. virtual void OnMaterialsEdited([[maybe_unused]] const MaterialAssignmentMap& materials) {} + + //! This message is sent when one or more material property changes have been applied, at most once per frame. + virtual void OnMaterialsUpdated([[maybe_unused]] const MaterialAssignmentMap& materials) {} + + //! This message is sent when the component has created the material instance to be used for rendering. + virtual void OnMaterialInstanceCreated([[maybe_unused]] const MaterialAssignment& materialAssignment) {} }; using MaterialComponentNotificationBus = EBus; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp index a4e058561e..4249ed0c3b 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp @@ -257,6 +257,16 @@ namespace AZ &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); } + + void EditorMaterialComponent::OnMaterialInstanceCreated(const MaterialAssignment& materialAssignment) + { + // PSO-impacting property changes are allowed in the editor + // because the saved slice data can be analyzed to pre-compile the necessary PSOs. + if (materialAssignment.m_materialInstance) + { + materialAssignment.m_materialInstance->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed); + } + } void EditorMaterialComponent::UpdateConfiguration(const MaterialComponentConfig& config) { @@ -280,19 +290,19 @@ namespace AZ { continue; } + + MaterialAssignment& materialAssignment = config.m_materials[materialSlot->m_id]; // Only material slots with a valid asset IDs or property overrides will be copied // to minimize the amount of data stored in the controller and game component if (materialSlot->m_materialAsset.GetId().IsValid()) { - MaterialAssignment& materialAssignment = config.m_materials[materialSlot->m_id]; materialAssignment.m_materialAsset = materialSlot->m_materialAsset; materialAssignment.m_propertyOverrides = materialSlot->m_propertyOverrides; materialAssignment.m_matModUvOverrides = materialSlot->m_matModUvOverrides; } else if (!materialSlot->m_propertyOverrides.empty() || !materialSlot->m_matModUvOverrides.empty()) { - MaterialAssignment& materialAssignment = config.m_materials[materialSlot->m_id]; materialAssignment.m_materialAsset = materialSlot->m_defaultMaterialAsset; materialAssignment.m_propertyOverrides = materialSlot->m_propertyOverrides; materialAssignment.m_matModUvOverrides = materialSlot->m_matModUvOverrides; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h index 88ffef9366..0c468b10a6 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h @@ -51,6 +51,7 @@ namespace AZ //! MaterialComponentNotificationBus::Handler overrides... void OnMaterialsEdited(const MaterialAssignmentMap& materials) override; + void OnMaterialInstanceCreated(const MaterialAssignment& materialAssignment) override; // Apply a material component configuration to the active controller void UpdateConfiguration(const MaterialComponentConfig& config); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp index 6e1e710282..97e8301bc9 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp @@ -249,6 +249,7 @@ namespace AZ for (auto& materialPair : m_configuration.m_materials) { materialPair.second.RebuildInstance(); + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialInstanceCreated, materialPair.second); QueuePropertyChanges(materialPair.first); } QueueMaterialUpdateNotification(); @@ -364,6 +365,7 @@ namespace AZ { materialAssignment.m_propertyOverrides[AZ::Name(propertyName)] = value; materialAssignment.RebuildInstance(); + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialInstanceCreated, materialAssignment); QueueMaterialUpdateNotification(); } else @@ -561,6 +563,7 @@ namespace AZ if (materialIt->second.m_propertyOverrides.empty()) { materialIt->second.RebuildInstance(); + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialInstanceCreated, materialIt->second); QueueMaterialUpdateNotification(); } @@ -581,6 +584,7 @@ namespace AZ { materialIt->second.m_propertyOverrides = {}; materialIt->second.RebuildInstance(); + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialInstanceCreated, materialIt->second); QueueMaterialUpdateNotification(); MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } @@ -595,6 +599,7 @@ namespace AZ { materialPair.second.m_propertyOverrides = {}; materialPair.second.RebuildInstance(); + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialInstanceCreated, materialPair.second); QueueMaterialUpdateNotification(); cleared = true; } From 4db353eb22e9a74cb1a3b3616206ef8876d1842f Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Mon, 13 Sep 2021 17:38:58 -0700 Subject: [PATCH 294/355] PR comments Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../Code/Source/Shadows/ProjectedShadowFeatureProcessor.h | 3 ++- Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp | 2 +- Gems/LyShine/Code/Source/Animation/AnimSequence.h | 4 ++-- Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp | 2 -- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h index cd74ba3797..eca8b91f1d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h @@ -49,7 +49,6 @@ namespace AZ::Render void SetShadowmapMaxResolution(ShadowId id, ShadowmapSize size) override; void SetShadowBias(ShadowId id, float bias) override; void SetPcfMethod(ShadowId id, PcfMethod method) override; - void SetEsmExponent(ShadowId id, float exponent); void SetShadowFilterMethod(ShadowId id, ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(ShadowId id, float boundaryWidthRadians) override; void SetPredictionSampleCount(ShadowId id, uint16_t count) override; @@ -57,6 +56,8 @@ namespace AZ::Render void SetShadowProperties(ShadowId id, const ProjectedShadowDescriptor& descriptor) override; const ProjectedShadowDescriptor& GetShadowProperties(ShadowId id) override; + void SetEsmExponent(ShadowId id, float exponent); + private: // GPU data stored in m_projectedShadows. diff --git a/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp b/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp index 86f97b96e9..f7476c0bc4 100644 --- a/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Image/StreamingImageTests.cpp @@ -53,7 +53,7 @@ namespace AZ : public UnitTest::AssetTester { public: - ImageMipChainAssetTester() {} + ImageMipChainAssetTester() = default; ~ImageMipChainAssetTester() override = default; void SetAssetReady(Data::Asset& asset) override diff --git a/Gems/LyShine/Code/Source/Animation/AnimSequence.h b/Gems/LyShine/Code/Source/Animation/AnimSequence.h index 1451770b4e..5441dc3860 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimSequence.h +++ b/Gems/LyShine/Code/Source/Animation/AnimSequence.h @@ -118,7 +118,7 @@ public: IUiAnimStringTable* GetTrackEventStringTable() override { return m_pEventStrings.get(); } //! Call to trigger a track event - void TriggerTrackEvent(const char* event, const char* param = NULL) override; + void TriggerTrackEvent(const char* event, const char* param = nullptr) override; //! Track event listener void AddTrackEventListener(IUiTrackEventListener* pListener) override; @@ -130,7 +130,7 @@ private: void ComputeTimeRange(); void CopyNodeChildren(XmlNodeRef& xmlNode, IUiAnimNode* pAnimNode); void NotifyTrackEvent(IUiTrackEventListener::ETrackEventReason reason, - const char* event, const char* param = NULL); + const char* event, const char* param = nullptr); // Create a new animation node. IUiAnimNode* CreateNodeInternal(EUiAnimNodeType nodeType, uint32 nNodeId = -1); diff --git a/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp b/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp index df714d7143..de8a9d2146 100644 --- a/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp +++ b/Gems/PhysX/Code/Tests/Benchmarks/PhysXJointBenchmarks.cpp @@ -183,7 +183,6 @@ namespace PhysX::Benchmarks class PhysXJointBenchmarkFixture : public PhysXBaseBenchmarkFixture { - public: void internalSetUp() { PhysXBaseBenchmarkFixture::SetUpInternal(); @@ -194,7 +193,6 @@ namespace PhysX::Benchmarks PhysXBaseBenchmarkFixture::TearDownInternal(); } - protected: public: void SetUp(const benchmark::State&) override { From db63dcbcd9c6b1758870ed20f91e869394e06ae8 Mon Sep 17 00:00:00 2001 From: Nicholas Van Sickle Date: Mon, 13 Sep 2021 17:57:42 -0700 Subject: [PATCH 295/355] Refresh rate driven rendering tick logic (#3375) * Implement sync interval and refresh rate API for RenderViewportWidget Signed-off-by: nvsickle * Measure actual frame timings in the viewport info overlay. Takes the median of the sum of (frame end - frame begin) to provide more a more representative view of when frames begin and end. Note: Until VSync is internally supported by the event loop, this will produce nearly identical frame timings as the frame will spend as much time as needed synchronously waiting on a vblank. Signed-off-by: nvsickle * Make frame timing per-pipeline, wire up refresh rate info to ViewportContext Signed-off-by: nvsickle * POC: Frame limit pipeline rendering Signed-off-by: nvsickle * Switch Editor tick to every 0ms to allow better tick accumulation behavior Signed-off-by: nvsickle * Move RPISystemComponent to the tick bus, remove tick accumulation logic Signed-off-by: nvsickle * Add `AddToRenderTickAtInterval` to RenderPipeline API This allows a pipeline to update at a set cadence, instead of rendering every frame or being directly told when to tick. Signed-off-by: nvsickle * Make ViewportContext enforce a target framerate -Adds GetFpsLimit/SetFpsLimit for actively limiting FPS -Calculates a render tick interval based on vsync and the vps limit and updates the current pipeline Signed-off-by: nvsickle * Add r_fps_limit and ed_inactive_viewport_fps_limit cvars Signed-off-by: nvsickle * Quick null check from a crash I bumped into Signed-off-by: nvsickle * Fix off-by-one on FPS calculation (shouldn't include the not-yet-rendered frame) Signed-off-by: nvsickle * Clarify frame time begin initialization Signed-off-by: nvsickle * Fix TrackView export. Signed-off-by: nvsickle * Address some reviewer feedback, revert RPISystem API change, fix CPU profiler. Signed-off-by: nvsickle * Add g_simulation_tick_rate Signed-off-by: nvsickle * Address review feedback, make frame limit updates event driven Signed-off-by: nvsickle * Remove timestamp update from ComponentApplication::Tick Signed-off-by: nvsickle --- Code/Editor/Core/QtEditorApplication.cpp | 2 +- .../TrackView/SequenceBatchRenderDialog.cpp | 10 + .../AzCore/Component/ComponentApplication.cpp | 19 ++ .../AzCore/AzCore/Component/TickBus.h | 2 + .../Atom/Bootstrap/BootstrapNotificationBus.h | 3 +- .../Atom/Bootstrap/BootstrapRequestBus.h | 2 + .../Code/Source/BootstrapSystemComponent.cpp | 39 +-- .../Code/Source/BootstrapSystemComponent.h | 2 + .../RHI/Code/Source/RHI/CpuProfilerImpl.cpp | 2 +- .../Include/Atom/RPI.Public/RenderPipeline.h | 43 +++- .../Code/Include/Atom/RPI.Public/SceneBus.h | 3 + .../Include/Atom/RPI.Public/ViewportContext.h | 49 +++- .../Atom/RPI.Public/ViewportContextBus.h | 8 +- .../Source/RPI.Private/RPISystemComponent.cpp | 18 +- .../Source/RPI.Private/RPISystemComponent.h | 7 +- .../RPI/Code/Source/RPI.Public/Pass/Pass.cpp | 7 +- .../Code/Source/RPI.Public/RenderPipeline.cpp | 44 +++- .../Atom/RPI/Code/Source/RPI.Public/Scene.cpp | 21 +- Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp | 5 +- .../Source/RPI.Public/ViewportContext.cpp | 142 +++++++++-- .../Viewport/RenderViewportWidget.h | 24 ++ .../RenderViewportWidgetNotificationBus.h | 35 +++ .../Source/Viewport/RenderViewportWidget.cpp | 223 ++++++++++++++---- .../Code/atomtoolsframework_files.cmake | 1 + ...AtomViewportDisplayInfoSystemComponent.cpp | 31 ++- .../AtomViewportDisplayInfoSystemComponent.h | 15 +- 26 files changed, 633 insertions(+), 124 deletions(-) create mode 100644 Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidgetNotificationBus.h diff --git a/Code/Editor/Core/QtEditorApplication.cpp b/Code/Editor/Core/QtEditorApplication.cpp index a4aab24be4..66ed42af8f 100644 --- a/Code/Editor/Core/QtEditorApplication.cpp +++ b/Code/Editor/Core/QtEditorApplication.cpp @@ -44,7 +44,7 @@ enum { // in milliseconds GameModeIdleFrequency = 0, - EditorModeIdleFrequency = 1, + EditorModeIdleFrequency = 0, InactiveModeFrequency = 10, UninitializedFrequency = 9999, }; diff --git a/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp b/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp index b510315995..6b3f1c2633 100644 --- a/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp +++ b/Code/Editor/TrackView/SequenceBatchRenderDialog.cpp @@ -36,6 +36,9 @@ #include "CryEdit.h" #include "Viewport.h" +// Atom Renderer +#include + AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING #include AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING @@ -1234,6 +1237,13 @@ void CSequenceBatchRenderDialog::OnKickIdleTimout() { componentApplication->TickSystem(); } + + // Directly tick the renderer, as it's no longer part of the system tick + if (auto rpiSystem = AZ::RPI::RPISystemInterface::Get()) + { + rpiSystem->SimulationTick(); + rpiSystem->RenderTick(); + } } } diff --git a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp index c76156c006..04a76b0f8e 100644 --- a/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp +++ b/Code/Framework/AzCore/AzCore/Component/ComponentApplication.cpp @@ -74,6 +74,8 @@ #include #include +AZ_CVAR(float, g_simulation_tick_rate, 0, nullptr, AZ::ConsoleFunctorFlags::Null, "The rate at which the game simulation tick loop runs, or 0 for as fast as possible"); + static void PrintEntityName(const AZ::ConsoleCommandContainer& arguments) { if (arguments.empty()) @@ -1392,6 +1394,23 @@ namespace AZ AZ_PROFILE_SCOPE(AzCore, "ComponentApplication::Tick:OnTick"); EBUS_EVENT(TickBus, OnTick, m_deltaTime, ScriptTimePoint(now)); } + + // If tick rate limiting is on, ensure (1 / g_simulation_tick_rate) ms has elapsed since the last frame, + // sleeping if there's still time remaining. + if (g_simulation_tick_rate > 0.f) + { + now = AZStd::chrono::system_clock::now(); + + // Work in microsecond durations here as that's the native measurement time for time_point + constexpr float microsecondsPerSecond = 1000.f * 1000.f; + const AZStd::chrono::microseconds timeBudgetPerTick(static_cast(microsecondsPerSecond / g_simulation_tick_rate)); + AZStd::chrono::microseconds timeUntilNextTick = m_currentTime + timeBudgetPerTick - now; + + if (timeUntilNextTick.count() > 0) + { + AZStd::this_thread::sleep_for(timeUntilNextTick); + } + } } } diff --git a/Code/Framework/AzCore/AzCore/Component/TickBus.h b/Code/Framework/AzCore/AzCore/Component/TickBus.h index e65efb93f2..966a3c303e 100644 --- a/Code/Framework/AzCore/AzCore/Component/TickBus.h +++ b/Code/Framework/AzCore/AzCore/Component/TickBus.h @@ -46,6 +46,8 @@ namespace AZ TICK_PRE_RENDER = 750, ///< Suggested tick handler position to update render-related data. + TICK_RENDER = 800, ///< Suggested tick handler position for rendering. + TICK_DEFAULT = 1000, ///< Default tick handler position when the handler is constructed. TICK_UI = 2000, ///< Suggested tick handler position for UI components. diff --git a/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapNotificationBus.h b/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapNotificationBus.h index e40bf39923..f4ce51fc02 100644 --- a/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapNotificationBus.h +++ b/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapNotificationBus.h @@ -56,7 +56,8 @@ namespace AZ ////////////////////////////////////////////////////////////////////////// - virtual void OnBootstrapSceneReady(AZ::RPI::Scene* bootstrapScene) = 0; + virtual void OnBootstrapSceneReady([[maybe_unused]]AZ::RPI::Scene* bootstrapScene){} + virtual void OnFrameRateLimitChanged([[maybe_unused]]float fpsLimit){} }; using NotificationBus = AZ::EBus; } // namespace Bootstrap diff --git a/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapRequestBus.h b/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapRequestBus.h index 21cc91420b..fbf3bad935 100644 --- a/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapRequestBus.h +++ b/Gems/Atom/Bootstrap/Code/Include/Atom/Bootstrap/BootstrapRequestBus.h @@ -23,6 +23,8 @@ namespace AZ::Render::Bootstrap virtual AZ::RPI::ScenePtr GetOrCreateAtomSceneFromAzScene(AzFramework::Scene* scene) = 0; virtual bool EnsureDefaultRenderPipelineInstalledForScene(AZ::RPI::ScenePtr scene, AZ::RPI::ViewportContextPtr viewportContext) = 0; + virtual float GetFrameRateLimit() const = 0; + virtual void SetFrameRateLimit(float fpsLimit) = 0; protected: ~Request() = default; diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp index d837988cfb..97faa7380f 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp @@ -41,7 +41,14 @@ #include #include +static void OnFrameRateLimitChanged(const float& fpsLimit) +{ + AZ::Render::Bootstrap::RequestBus::Broadcast( + &AZ::Render::Bootstrap::RequestBus::Events::SetFrameRateLimit, fpsLimit); +} + AZ_CVAR(AZ::CVarFixedString, r_default_pipeline_name, AZ_TRAIT_BOOTSTRAPSYSTEMCOMPONENT_PIPELINE_NAME, nullptr, AZ::ConsoleFunctorFlags::DontReplicate, "Default Render pipeline name"); +AZ_CVAR(float, r_fps_limit, 0, OnFrameRateLimitChanged, AZ::ConsoleFunctorFlags::Null, "The maximum framerate to render at, or 0 for unlimited"); namespace AZ { @@ -342,6 +349,22 @@ namespace AZ return true; } + float BootstrapSystemComponent::GetFrameRateLimit() const + { + return r_fps_limit; + } + + void BootstrapSystemComponent::SetFrameRateLimit(float fpsLimit) + { + r_fps_limit = fpsLimit; + if (m_viewportContext) + { + m_viewportContext->SetFpsLimit(r_fps_limit); + } + Render::Bootstrap::NotificationBus::Broadcast( + &Render::Bootstrap::NotificationBus::Events::OnFrameRateLimitChanged, fpsLimit); + } + void BootstrapSystemComponent::CreateDefaultRenderPipeline() { EnsureDefaultRenderPipelineInstalledForScene(m_defaultScene, m_viewportContext); @@ -381,23 +404,11 @@ namespace AZ } void BootstrapSystemComponent::OnTick([[maybe_unused]] float deltaTime, [[maybe_unused]] ScriptTimePoint time) - { - // Temp: When running in the launcher without the legacy renderer - // we need to call RenderTick on the viewport context each frame. - if (m_viewportContext) - { - AZ::ApplicationTypeQuery appType; - ComponentApplicationBus::Broadcast(&AZ::ComponentApplicationBus::Events::QueryApplicationType, appType); - if (appType.IsGame()) - { - m_viewportContext->RenderTick(); - } - } - } + { } int BootstrapSystemComponent::GetTickOrder() { - return TICK_LAST; + return TICK_PRE_RENDER; } void BootstrapSystemComponent::OnWindowClosed() diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h index 566d19b1a4..438c6cb236 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.h @@ -69,6 +69,8 @@ namespace AZ // Render::Bootstrap::RequestBus::Handler overrides ... AZ::RPI::ScenePtr GetOrCreateAtomSceneFromAzScene(AzFramework::Scene* scene) override; bool EnsureDefaultRenderPipelineInstalledForScene(AZ::RPI::ScenePtr scene, AZ::RPI::ViewportContextPtr viewportContext) override; + float GetFrameRateLimit() const override; + void SetFrameRateLimit(float fpsLimit) override; protected: // Component overrides ... diff --git a/Gems/Atom/RHI/Code/Source/RHI/CpuProfilerImpl.cpp b/Gems/Atom/RHI/Code/Source/RHI/CpuProfilerImpl.cpp index 8099fc3a32..e16b89b5cd 100644 --- a/Gems/Atom/RHI/Code/Source/RHI/CpuProfilerImpl.cpp +++ b/Gems/Atom/RHI/Code/Source/RHI/CpuProfilerImpl.cpp @@ -144,7 +144,7 @@ namespace AZ // Try to lock here, the shutdownMutex will only be contested when the CpuProfiler is shutting down. if (m_shutdownMutex.try_lock_shared()) { - if (m_enabled) + if (m_enabled && ms_threadLocalStorage != nullptr) { ms_threadLocalStorage->RegionStackPopBack(); } diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h index 90389687de..cc25aa17c4 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/RenderPipeline.h @@ -161,19 +161,25 @@ namespace AZ //! Add this RenderPipeline to RPI system's RenderTick and it will be rendered whenever //! the RPI system's RenderTick is called. - //! The RenderPipeline is rendered per RenderTick by default unless AddToRenderTickOnce() was called. + //! The RenderPipeline is rendered per RenderTick by default. void AddToRenderTick(); + //! Add this RenderPipeline to RPI system's RenderTick and it will be rendered every RenderTick + //! after the specified interval has elapsed since the last rendered frame. + //! @param renderInterval The desired time between rendered frames, in seconds. + void AddToRenderTickAtInterval(AZStd::chrono::duration renderInterval); + //! Disable render for this RenderPipeline void RemoveFromRenderTick(); ~RenderPipeline(); - + enum class RenderMode : uint8_t { - RenderEveryTick, // Render at each RPI system render tick - RenderOnce, // Render once in next RPI system render tick - NoRender // Render disabled. + RenderEveryTick, //!< Render at each RPI system render tick. + RenderAtTargetRate, //!< Render on RPI system render tick after a target refresh rate interval has passed. + RenderOnce, //!< Render once in next RPI system render tick. + NoRender //!< Render disabled. }; //! Get current render mode @@ -185,6 +191,12 @@ namespace AZ //! Get draw filter mask RHI::DrawFilterMask GetDrawFilterMask() const; + using FrameNotificationEvent = AZ::Event<>; + //! Notifies a listener when a frame is about to be prepared for render, before SRGs are bound. + void ConnectPrepareFrameHandler(FrameNotificationEvent::Handler& handler); + //! Notifies a listener when the rendering of a frame has finished + void ConnectEndFrameHandler(FrameNotificationEvent::Handler& handler); + private: RenderPipeline() = default; @@ -202,8 +214,11 @@ namespace AZ void OnAddedToScene(Scene* scene); void OnRemovedFromScene(Scene* scene); + // Called before this pipeline is about to be rendered and before SRGs are bound. + void OnPrepareFrame(); + // Called when this pipeline is about to be rendered - void OnStartFrame(const TickTimeInfo& tick); + void OnStartFrame(); // Called when the rendering of current frame is finished. void OnFrameEnd(); @@ -228,8 +243,14 @@ namespace AZ PipelineViewMap m_pipelineViewsByTag; - /// The system time when the last time this pipeline render was started - float m_lastRenderStartTime = 0; + // The system time when the last time this pipeline render was started + AZStd::chrono::system_clock::time_point m_lastRenderStartTime; + + // The current system time, as of OnPrepareFrame's execution. + AZStd::chrono::system_clock::time_point m_lastRenderRequestTime; + + // The target time between renders when m_renderMode is RenderMode::RenderAtTargetRate + AZStd::chrono::duration m_targetRefreshRate; // RenderPipeline's name id, it will be used to identify the render pipeline when it's added to a Scene RenderPipelineId m_nameId; @@ -259,7 +280,11 @@ namespace AZ RHI::DrawFilterTag m_drawFilterTag; // A mask to filter draw items submitted by passes of this render pipeline. // This mask is created from the value of m_drawFilterTag. - RHI::DrawFilterMask m_drawFilterMask = 0; + RHI::DrawFilterMask m_drawFilterMask = 0; + + // Events for notification on render state + FrameNotificationEvent m_prepareFrameEvent; + FrameNotificationEvent m_endFrameEvent; }; } // namespace RPI diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h index ca531d2de6..748c470edf 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/SceneBus.h @@ -67,6 +67,9 @@ namespace AZ //! Notifies when the PrepareRender phase is ending virtual void OnEndPrepareRender() {} + + //! Notifies when the render tick for a given frame has finished. + virtual void OnFrameEnd() {} }; using SceneNotificationBus = AZ::EBus; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h index 966e6b3016..feed24a80d 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContext.h @@ -51,9 +51,21 @@ namespace AZ //! Sets the root scene associated with this viewport. //! This does not provide a default render pipeline, one must be provided to enable rendering. void SetRenderScene(ScenePtr scene); - //! Runs one simulation and render tick and renders a frame to this viewport's window. - //! @note This is likely to be replaced by a tick management system in the RPI. - void RenderTick(); + + //! Gets the maximum frame rate this viewport context's pipeline can render at, 0 for unlimited. + //! The target framerate for the pipeline will be determined by this frame limit and the + //! vsync settings for the current window. + float GetFpsLimit() const; + + //! Sets the maximum frame rate this viewport context's pipeline can render at, 0 for unlimited. + //! The target framerate for the pipeline will be determined by this frame limit and the + //! vsync settings for the current window. + void SetFpsLimit(float fpsLimit); + + //! Gets the target frame rate for this viewport context. + //! This returns the lowest of either the current VSync refresh rate + //! or 0 for an unlimited frame rate (if there's no FPS limit and vsync is off). + float GetTargetFrameRate() const; //! Gets the current name of this ViewportContext. //! This name is used to tie this ViewportContext to its View stack, and ViewportContexts may be @@ -74,19 +86,28 @@ namespace AZ //! \see AzFramework::WindowRequests::GetDpiScaleFactor float GetDpiScalingFactor() const; + //! Gets the current vsync interval, as a divisor of the current refresh rate. + //! A value of 0 indicates that vsync is disabled. + uint32_t GetVsyncInterval() const; + + //! Gets the current display refresh rate, in frames per second. + uint32_t GetRefreshRate() const; + // SceneNotificationBus interface overrides... //! Ensures our default view remains set when our scene's render pipelines are modified. void OnRenderPipelineAdded(RenderPipelinePtr pipeline) override; //! Ensures our default view remains set when our scene's render pipelines are modified. void OnRenderPipelineRemoved(RenderPipeline* pipeline) override; - //! OnBeginPrepareRender is forwarded to our RenderTick notification to allow subscribers to do rendering. - void OnBeginPrepareRender() override; // WindowNotificationBus interface overrides... //! Used to fire a notification when our window resizes. void OnWindowResized(uint32_t width, uint32_t height) override; //! Used to fire a notification when our window DPI changes. void OnDpiScaleFactorChanged(float dpiScaleFactor) override; + //! Used to fire a notification when our vsync interval changes. + void OnVsyncIntervalChanged(uint32_t interval) override; + //! Used to fire a notification when our refresh rate changes. + void OnRefreshRateChanged(uint32_t refreshRate) override; using SizeChangedEvent = AZ::Event; //! Notifies consumers when the viewport size has changed. @@ -98,6 +119,12 @@ namespace AZ //! Alternatively, connect to ViewportContextNotificationsBus and listen to ViewportContextNotifications::OnViewportDpiScalingChanged. void ConnectDpiScalingFactorChangedHandler(ScalarChangedEvent::Handler& handler); + using UintChangedEvent = AZ::Event; + //! Notifies consumers when the vsync interval has changed. + void ConnectVsyncIntervalChangedHandler(UintChangedEvent::Handler& handler); + //! Notifies consumers when the refresh rate has changed. + void ConnectRefreshRateChangedHandler(UintChangedEvent::Handler& handler); + using MatrixChangedEvent = AZ::Event; //! Notifies consumers when the view matrix has changed. void ConnectViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler); @@ -139,15 +166,24 @@ namespace AZ void SetDefaultView(ViewPtr view); // Ensures our render pipeline's default camera matches ours. void UpdatePipelineView(); + // Ensures our render pipeline refresh rate matches our refresh rate. + void UpdatePipelineRefreshRate(); + // Resets the current pipeline reference and ensures pipeline events are disconnected. + void ResetCurrentPipeline(); ScenePtr m_rootScene; WindowContextSharedPtr m_windowContext; ViewPtr m_defaultView; AzFramework::WindowSize m_viewportSize; float m_viewportDpiScaleFactor = 1.0f; + uint32_t m_vsyncInterval = 1; + uint32_t m_refreshRate = 60; + float m_fpsLimit = 0.f; SizeChangedEvent m_sizeChangedEvent; ScalarChangedEvent m_dpiScalingFactorChangedEvent; + UintChangedEvent m_vsyncIntervalChangedEvent; + UintChangedEvent m_refreshRateChangedEvent; MatrixChangedEvent m_viewMatrixChangedEvent; MatrixChangedEvent::Handler m_onViewMatrixChangedHandler; MatrixChangedEvent m_projectionMatrixChangedEvent; @@ -157,6 +193,9 @@ namespace AZ ViewChangedEvent m_defaultViewChangedEvent; ViewportIdEvent m_aboutToBeDestroyedEvent; + AZ::Event<>::Handler m_prepareFrameHandler; + AZ::Event<>::Handler m_endFrameHandler; + ViewportContextManager* m_manager; RenderPipelinePtr m_currentPipeline; Name m_name; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h index 0b53172ba2..fa13a3987a 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/ViewportContextBus.h @@ -110,11 +110,13 @@ namespace AZ virtual void OnViewportSizeChanged(AzFramework::WindowSize size){AZ_UNUSED(size);} //! Called when the window DPI scaling changes for a given viewport context. virtual void OnViewportDpiScalingChanged(float dpiScale){AZ_UNUSED(dpiScale);} - //! Called when the active view for a given viewport context name changes. + //! Called when the active view changes for a given viewport context. virtual void OnViewportDefaultViewChanged(AZ::RPI::ViewPtr view){AZ_UNUSED(view);} //! Called when the viewport is to be rendered. - //! Add draws to this functions if they only need to be rendered to this viewport. - virtual void OnRenderTick(){}; + //! Add draws to this function if they only need to be rendered to this viewport. + virtual void OnRenderTick(){} + //! Called when the viewport finishes rendering a frame. + virtual void OnFrameEnd(){} protected: ~ViewportContextNotifications() = default; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.cpp b/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.cpp index 2567d221e5..789d43712e 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.cpp @@ -14,6 +14,9 @@ #include #include +#include +#include +#include #include #include @@ -93,20 +96,29 @@ namespace AZ } m_rpiSystem.Initialize(m_rpiDescriptor); - AZ::SystemTickBus::Handler::BusConnect(); + AZ::TickBus::Handler::BusConnect(); } void RPISystemComponent::Deactivate() { - AZ::SystemTickBus::Handler::BusDisconnect(); + AZ::TickBus::Handler::BusDisconnect(); m_rpiSystem.Shutdown(); } - void RPISystemComponent::OnSystemTick() + void RPISystemComponent::OnTick([[maybe_unused]]float deltaTime, [[maybe_unused]]ScriptTimePoint time) { + if (deltaTime == 0.f) + { + return; + } + m_rpiSystem.SimulationTick(); m_rpiSystem.RenderTick(); } + int RPISystemComponent::GetTickOrder() + { + return AZ::ComponentTickBus::TICK_RENDER; + } } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.h b/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.h index e0a128c3f1..7933e1581c 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.h +++ b/Gems/Atom/RPI/Code/Source/RPI.Private/RPISystemComponent.h @@ -32,7 +32,7 @@ namespace AZ */ class RPISystemComponent final : public AZ::Component - , public AZ::SystemTickBus::Handler + , private AZ::TickBus::Handler { public: AZ_COMPONENT(RPISystemComponent, "{83E301F3-7A0C-4099-B530-9342B91B1BC0}"); @@ -50,8 +50,9 @@ namespace AZ private: RPISystemComponent(const RPISystemComponent&) = delete; - // SystemTickBus overrides... - void OnSystemTick() override; + // TickBus overrides... + void OnTick(float deltaTime, ScriptTimePoint time) override; + int GetTickOrder() override; RPISystem m_rpiSystem; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp index a8d94e9a91..c5e871697b 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp @@ -93,8 +93,11 @@ namespace AZ void Pass::SetEnabled(bool enabled) { - m_flags.m_enabled = enabled; - OnHierarchyChange(); + if (m_flags.m_enabled != enabled) + { + m_flags.m_enabled = enabled; + OnHierarchyChange(); + } } bool Pass::IsEnabled() const diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp index 6d974a074f..7f0ab9c8aa 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp @@ -301,6 +301,26 @@ namespace AZ m_drawFilterMask = 0; } + void RenderPipeline::OnPrepareFrame() + { + m_lastRenderRequestTime = AZStd::chrono::system_clock::now(); + + // If we're attempting to render at a target interval, check to see if we're within + // 1ms of that interval, enabling rendering only if we are. + if (m_renderMode == RenderMode::RenderAtTargetRate) + { + constexpr AZStd::chrono::duration updateThresholdMs(0.001f); + const bool shouldRender = + m_lastRenderRequestTime - m_lastRenderStartTime + updateThresholdMs >= m_targetRefreshRate; + m_rootPass->SetEnabled(shouldRender); + } + + if (NeedsRender()) + { + m_prepareFrameEvent.Signal(); + } + } + void RenderPipeline::OnPassModified() { if (m_needsPassRecreate) @@ -375,11 +395,11 @@ namespace AZ m_scene->RemoveRenderPipeline(m_nameId); } - void RenderPipeline::OnStartFrame(const TickTimeInfo& tick) + void RenderPipeline::OnStartFrame() { AZ_PROFILE_FUNCTION(RPI); - m_lastRenderStartTime = tick.m_currentGameTime; + m_lastRenderStartTime = m_lastRenderRequestTime; OnPassModified(); @@ -407,6 +427,7 @@ namespace AZ { RemoveFromRenderTick(); } + m_endFrameEvent.Signal(); } void RenderPipeline::CollectPersistentViews(AZStd::map& outViewMasks) const @@ -489,6 +510,13 @@ namespace AZ m_renderMode = RenderMode::RenderEveryTick; } + void RenderPipeline::AddToRenderTickAtInterval(AZStd::chrono::duration renderInterval) + { + m_rootPass->SetEnabled(false); + m_renderMode = RenderMode::RenderAtTargetRate; + m_targetRefreshRate = renderInterval; + } + void RenderPipeline::RemoveFromRenderTick() { m_renderMode = RenderMode::NoRender; @@ -502,7 +530,7 @@ namespace AZ bool RenderPipeline::NeedsRender() const { - return m_renderMode != RenderMode::NoRender; + return m_rootPass->IsEnabled(); } RHI::DrawFilterTag RenderPipeline::GetDrawFilterTag() const @@ -515,6 +543,16 @@ namespace AZ return m_drawFilterMask; } + void RenderPipeline::ConnectPrepareFrameHandler(FrameNotificationEvent::Handler& handler) + { + handler.Connect(m_prepareFrameEvent); + } + + void RenderPipeline::ConnectEndFrameHandler(FrameNotificationEvent::Handler& handler) + { + handler.Connect(m_endFrameEvent); + } + void RenderPipeline::SetDrawFilterTag(RHI::DrawFilterTag tag) { m_drawFilterTag = tag; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp index 0b0481b960..9fa49f7f2a 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp @@ -420,7 +420,7 @@ namespace AZ } } - void Scene::PrepareRender(const TickTimeInfo& tickInfo, RHI::JobPolicy jobPolicy) + void Scene::PrepareRender([[maybe_unused]]const TickTimeInfo& tickInfo, RHI::JobPolicy jobPolicy) { AZ_ATOM_PROFILE_FUNCTION("RPI", "Scene: PrepareRender"); @@ -432,20 +432,27 @@ namespace AZ SceneNotificationBus::Event(GetId(), &SceneNotification::OnBeginPrepareRender); - // Get active pipelines which need to be rendered and notify them frame started + // Get active pipelines which need to be rendered and notify them of an impending frame. AZStd::vector activePipelines; { - AZ_ATOM_PROFILE_TIME_GROUP_REGION("RPI", "Scene: OnStartFrame"); + AZ_ATOM_PROFILE_TIME_GROUP_REGION("RPI", "Scene: OnPrepareFrame"); for (auto& pipeline : m_pipelines) { + pipeline->OnPrepareFrame(); if (pipeline->NeedsRender()) { activePipelines.push_back(pipeline); - pipeline->OnStartFrame(tickInfo); } } } + // Get active pipelines which need to be rendered and notify them frame started + for (const auto& pipeline : activePipelines) + { + AZ_ATOM_PROFILE_TIME_GROUP_REGION("RPI", "Scene: OnStartFrame"); + pipeline->OnStartFrame(); + } + // Return if there is no active render pipeline if (activePipelines.empty()) { @@ -587,10 +594,12 @@ namespace AZ void Scene::OnFrameEnd() { AZ_ATOM_PROFILE_FUNCTION("RPI", "Scene: OnFrameEnd"); + bool didRender = false; for (auto& pipeline : m_pipelines) { if (pipeline->NeedsRender()) { + didRender = true; pipeline->OnFrameEnd(); } } @@ -598,6 +607,10 @@ namespace AZ { fp->OnRenderEnd(); } + if (didRender) + { + SceneNotificationBus::Event(GetId(), &SceneNotification::OnFrameEnd); + } } void Scene::UpdateSrgs() diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index b07728938f..bdb3ea8899 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -241,7 +241,10 @@ namespace AZ { AZ_PROFILE_FUNCTION(RPI); m_drawListContext.FinalizeLists(); - SortFinalizedDrawLists(); + if (m_passesByDrawList) + { + SortFinalizedDrawLists(); + } } void View::SortFinalizedDrawLists() diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp index 77114e5cf5..3dcbae2fb9 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/ViewportContext.cpp @@ -25,14 +25,13 @@ namespace AZ , m_viewportSize(1, 1) { m_windowContext->Initialize(device, nativeWindow); - AzFramework::WindowRequestBus::EventResult( - m_viewportSize, - nativeWindow, - &AzFramework::WindowRequestBus::Events::GetClientAreaSize); - AzFramework::WindowRequestBus::EventResult( - m_viewportDpiScaleFactor, - nativeWindow, - &AzFramework::WindowRequestBus::Events::GetDpiScaleFactor); + AzFramework::WindowRequestBus::Event(nativeWindow, [this](AzFramework::WindowRequestBus::Events* window) + { + m_viewportSize = window->GetClientAreaSize(); + m_viewportDpiScaleFactor = window->GetDpiScaleFactor(); + m_vsyncInterval = window->GetSyncInterval(); + m_refreshRate = window->GetDisplayRefreshRate(); + }); AzFramework::WindowNotificationBus::Handler::BusConnect(nativeWindow); AzFramework::ViewportRequestBus::Handler::BusConnect(id); @@ -46,6 +45,20 @@ namespace AZ m_viewMatrixChangedEvent.Signal(matrix); }); + m_prepareFrameHandler = RenderPipeline::FrameNotificationEvent::Handler( + [this]() + { + ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnRenderTick); + ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnRenderTick); + }); + + m_endFrameHandler = RenderPipeline::FrameNotificationEvent::Handler( + [this]() + { + ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnFrameEnd); + ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnFrameEnd); + }); + SetRenderScene(renderScene); } @@ -111,26 +124,38 @@ namespace AZ { SceneNotificationBus::Handler::BusConnect(m_rootScene->GetId()); } - m_currentPipeline.reset(); + ResetCurrentPipeline(); UpdatePipelineView(); + UpdatePipelineRefreshRate(); } m_sceneChangedEvent.Signal(scene); } - void ViewportContext::RenderTick() + float ViewportContext::GetFpsLimit() const { - // add the current pipeline to next render tick if it's not already added. - if (m_currentPipeline && m_currentPipeline->GetRenderMode() != RenderPipeline::RenderMode::RenderOnce) - { - m_currentPipeline->AddToRenderTickOnce(); - } + return m_fpsLimit; } - void ViewportContext::OnBeginPrepareRender() + void ViewportContext::SetFpsLimit(float fpsLimit) { - ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnRenderTick); - ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnRenderTick); + m_fpsLimit = fpsLimit; + UpdatePipelineRefreshRate(); + } + + float ViewportContext::GetTargetFrameRate() const + { + float targetFrameRate = GetFpsLimit(); + const AZ::u32 vsyncInterval = GetVsyncInterval(); + if (vsyncInterval != 0) + { + const float vsyncFrameRate = static_cast(GetRefreshRate()) / static_cast(vsyncInterval); + if (targetFrameRate == 0.f || vsyncFrameRate < targetFrameRate) + { + targetFrameRate = vsyncFrameRate; + } + } + return targetFrameRate; } AZ::Name ViewportContext::GetName() const @@ -158,6 +183,16 @@ namespace AZ return m_viewportDpiScaleFactor; } + uint32_t ViewportContext::GetVsyncInterval() const + { + return m_vsyncInterval; + } + + uint32_t ViewportContext::GetRefreshRate() const + { + return m_refreshRate; + } + void ViewportContext::ConnectSizeChangedHandler(SizeChangedEvent::Handler& handler) { handler.Connect(m_sizeChangedEvent); @@ -168,6 +203,16 @@ namespace AZ handler.Connect(m_dpiScalingFactorChangedEvent); } + void ViewportContext::ConnectVsyncIntervalChangedHandler(UintChangedEvent::Handler& handler) + { + handler.Connect(m_vsyncIntervalChangedEvent); + } + + void ViewportContext::ConnectRefreshRateChangedHandler(UintChangedEvent::Handler& handler) + { + handler.Connect(m_refreshRateChangedEvent); + } + void ViewportContext::ConnectViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler) { handler.Connect(m_viewMatrixChangedEvent); @@ -263,12 +308,43 @@ namespace AZ m_currentPipelineChangedEvent.Signal(m_currentPipeline); } - if (auto pipeline = GetCurrentPipeline()) + if (m_currentPipeline) { - pipeline->SetDefaultView(m_defaultView); + if (!m_prepareFrameHandler.IsConnected()) + { + m_currentPipeline->ConnectPrepareFrameHandler(m_prepareFrameHandler); + m_currentPipeline->ConnectEndFrameHandler(m_endFrameHandler); + } + m_currentPipeline->SetDefaultView(m_defaultView); } } + void ViewportContext::UpdatePipelineRefreshRate() + { + if (!m_currentPipeline) + { + return; + } + + const float refreshRate = GetTargetFrameRate(); + // If we have a truly unlimited framerate, just render every tick + if (refreshRate == 0.f) + { + m_currentPipeline->AddToRenderTick(); + } + else + { + m_currentPipeline->AddToRenderTickAtInterval(AZStd::chrono::duration(1.f / refreshRate)); + } + } + + void ViewportContext::ResetCurrentPipeline() + { + m_prepareFrameHandler.Disconnect(); + m_endFrameHandler.Disconnect(); + m_currentPipeline.reset(); + } + RenderPipelinePtr ViewportContext::GetCurrentPipeline() { return m_currentPipeline; @@ -281,8 +357,9 @@ namespace AZ // in the event prioritization is added later if (pipeline->GetWindowHandle() == m_windowContext->GetWindowHandle()) { - m_currentPipeline.reset(); + ResetCurrentPipeline(); UpdatePipelineView(); + UpdatePipelineRefreshRate(); } } @@ -290,8 +367,9 @@ namespace AZ { if (m_currentPipeline.get() == pipeline) { - m_currentPipeline.reset(); + ResetCurrentPipeline(); UpdatePipelineView(); + UpdatePipelineRefreshRate(); } } @@ -305,10 +383,30 @@ namespace AZ } } + void ViewportContext::OnRefreshRateChanged(uint32_t refreshRate) + { + if (m_refreshRate != refreshRate) + { + m_refreshRate = refreshRate; + m_refreshRateChangedEvent.Signal(m_refreshRate); + UpdatePipelineRefreshRate(); + } + } + void ViewportContext::OnDpiScaleFactorChanged(float dpiScaleFactor) { m_viewportDpiScaleFactor = dpiScaleFactor; m_dpiScalingFactorChangedEvent.Signal(dpiScaleFactor); } + + void ViewportContext::OnVsyncIntervalChanged(uint32_t interval) + { + if (m_vsyncInterval != interval) + { + m_vsyncInterval = interval; + m_vsyncIntervalChangedEvent.Signal(m_vsyncInterval); + UpdatePipelineRefreshRate(); + } + } } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h index 4210c82921..60ddf33cf7 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidget.h @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -21,6 +22,8 @@ #include #include #include +#include +#include namespace AtomToolsFramework { @@ -35,6 +38,8 @@ namespace AtomToolsFramework , public AzFramework::WindowRequestBus::Handler , protected AzFramework::InputChannelEventListener , protected AZ::TickBus::Handler + , protected AZ::Render::Bootstrap::NotificationBus::Handler + , protected AtomToolsFramework::RenderViewportWidgetNotificationBus::Handler { public: //! Creates a RenderViewportWidget. @@ -121,6 +126,7 @@ namespace AtomToolsFramework // AZ::TickBus::Handler ... void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; + int GetTickOrder() override; // QWidget ... void resizeEvent(QResizeEvent *event) override; @@ -128,9 +134,21 @@ namespace AtomToolsFramework void enterEvent(QEvent* event) override; void leaveEvent(QEvent* event) override; void mouseMoveEvent(QMouseEvent* event) override; + void focusInEvent(QFocusEvent* event) override; + + // AZ::Render::Bootstrap::NotificationBus::Handler ... + void OnFrameRateLimitChanged(float fpsLimit) override; + + // AtomToolsFramework::RenderViewportWidgetNotificationBus::Handler ... + void OnInactiveViewportFrameRateChanged(float fpsLimit) override; private: + AzFramework::NativeWindowHandle GetNativeWindowHandle() const; + void UpdateFrameRate(); + + void SetScreen(QScreen* screen); void SendWindowResizeEvent(); + void NotifyUpdateRefreshRate(); // The underlying ViewportContext, our entry-point to the Atom RPI. AZ::RPI::ViewportContextPtr m_viewportContext; @@ -153,5 +171,11 @@ namespace AtomToolsFramework AZ::ScriptTimePoint m_time; // Maps our internal Qt events into AzFramework InputChannels for our ViewportControllerList. AzToolsFramework::QtEventToAzInputMapper* m_inputChannelMapper = nullptr; + // Stores our current screen, used for tracking the current refresh rate. + QScreen* m_screen = nullptr; + // Stores the last RenderViewportWidget that has received user focus. + // This is used for optional framerate throtting for "inactive" viewports via the + // ed_inactive_viewport_fps_limit CVAR. + AZ::EnvironmentVariable m_lastFocusedViewport; }; } //namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidgetNotificationBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidgetNotificationBus.h new file mode 100644 index 0000000000..0563bd6bf2 --- /dev/null +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Viewport/RenderViewportWidgetNotificationBus.h @@ -0,0 +1,35 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include + +namespace AtomToolsFramework +{ + //! Provides an interface for providing notifications specific to RenderViewportWidget. + //! @note Most behaviors in RenderViewportWidget are handled by its underyling + //! ViewportContext, this bus is specifically for functionality exclusive to the + //! Qt layer provided by RenderViewportWidget. + class RenderViewportWidgetNotifications : public AZ::EBusTraits + { + public: + static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; + static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Multiple; + + //! Triggered when the idle frame rate limit for inactive viewports changed. + //! Controlled by the ed_inactive_viewport_fps_limit CVAR. + //! Active viewports are controlled by the r_fps_limit CVAR. + virtual void OnInactiveViewportFrameRateChanged([[maybe_unused]]float fpsLimit){} + + protected: + ~RenderViewportWidgetNotifications() = default; + }; + + using RenderViewportWidgetNotificationBus = AZ::EBus; +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp index 027ac80151..4446e11231 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Viewport/RenderViewportWidget.cpp @@ -6,23 +6,42 @@ * */ -#include +#include +#include +#include #include #include -#include +#include +#include +#include #include #include #include #include -#include -#include -#include #include -#include #include -#include +#include #include +#include +#include +#include + +static void OnInactiveViewportFrameRateChanged(const float& fpsLimit) +{ + AtomToolsFramework::RenderViewportWidgetNotificationBus::Broadcast( + &AtomToolsFramework::RenderViewportWidgetNotificationBus::Events::OnInactiveViewportFrameRateChanged, fpsLimit); +} + +AZ_CVAR( + float, + ed_inactive_viewport_fps_limit, + 0, + OnInactiveViewportFrameRateChanged, + AZ::ConsoleFunctorFlags::Null, + "The maximum framerate to render viewports that don't have focus at"); + +static constexpr const char* LastFocusedViewportVariableName = "AtomToolsFramework::RenderViewportWidget::LastFocusedViewport"; namespace AtomToolsFramework { @@ -30,6 +49,12 @@ namespace AtomToolsFramework : QWidget(parent) , AzFramework::InputChannelEventListener(AzFramework::InputChannelEventListener::GetPriorityDefault()) { + m_lastFocusedViewport = AZ::Environment::FindVariable(LastFocusedViewportVariableName); + if (!m_lastFocusedViewport) + { + m_lastFocusedViewport = AZ::Environment::CreateVariable(LastFocusedViewportVariableName, nullptr); + } + if (shouldInitializeViewportContext) { InitializeViewportContext(); @@ -38,13 +63,24 @@ namespace AtomToolsFramework setUpdatesEnabled(false); setFocusPolicy(Qt::FocusPolicy::WheelFocus); setMouseTracking(true); + + // Wait a frame for our window handle to be constructed, then wire up our screen change signals. + QTimer::singleShot( + 0, + [this]() + { + QObject::connect(windowHandle(), &QWindow::screenChanged, this, &RenderViewportWidget::SetScreen); + }); + SetScreen(screen()); } bool RenderViewportWidget::InitializeViewportContext(AzFramework::ViewportId id) { if (m_viewportContext != nullptr) { - AZ_Assert(id == AzFramework::InvalidViewportId || m_viewportContext->GetId() == id, "Attempted to reinitialize RenderViewportWidget with a different ID"); + AZ_Assert( + id == AzFramework::InvalidViewportId || m_viewportContext->GetId() == id, + "Attempted to reinitialize RenderViewportWidget with a different ID"); return true; } @@ -59,7 +95,7 @@ namespace AtomToolsFramework // Before we do anything else, we must create a ViewportContext which will give us a ViewportId if we didn't manually specify one. AZ::RPI::ViewportContextRequestsInterface::CreationParameters params; params.device = AZ::RHI::RHISystemInterface::Get()->GetDevice(); - params.windowHandle = reinterpret_cast(winId()); + params.windowHandle = GetNativeWindowHandle(); params.id = id; AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle); m_viewportContext = viewportContextManager->CreateViewportContext(AZ::Name(), params); @@ -80,29 +116,46 @@ namespace AtomToolsFramework AzFramework::InputChannelEventListener::Connect(); AZ::TickBus::Handler::BusConnect(); AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle); + AZ::Render::Bootstrap::NotificationBus::Handler::BusConnect(); + AtomToolsFramework::RenderViewportWidgetNotificationBus::Handler::BusConnect(); m_inputChannelMapper = new AzToolsFramework::QtEventToAzInputMapper(this, id); // Forward input events to our controller list. - QObject::connect(m_inputChannelMapper, &AzToolsFramework::QtEventToAzInputMapper::InputChannelUpdated, this, + QObject::connect( + m_inputChannelMapper, &AzToolsFramework::QtEventToAzInputMapper::InputChannelUpdated, this, [this](const AzFramework::InputChannel* inputChannel, QEvent* event) - { - AzFramework::NativeWindowHandle windowId = reinterpret_cast(winId()); - if (m_controllerList->HandleInputChannelEvent(AzFramework::ViewportControllerInputEvent{GetId(), windowId, *inputChannel})) { - // If the controller handled the input event, mark the event as accepted so it doesn't continue to propagate. - if (event) + const AzFramework::NativeWindowHandle windowId = GetNativeWindowHandle(); + if (m_controllerList->HandleInputChannelEvent( + AzFramework::ViewportControllerInputEvent{ GetId(), windowId, *inputChannel })) { - event->setAccepted(true); + // If the controller handled the input event, mark the event as accepted so it doesn't continue to propagate. + if (event) + { + event->setAccepted(true); + } } - } - }); + }); + + // Update our target frame rate. If we're the only viewport, become active. + if (m_lastFocusedViewport.Get() == nullptr) + { + m_lastFocusedViewport.Set(this); + } + UpdateFrameRate(); + return true; } RenderViewportWidget::~RenderViewportWidget() { + if (m_lastFocusedViewport.Get() == this) + { + m_lastFocusedViewport.Set(nullptr); + } + AzFramework::WindowRequestBus::Handler::BusDisconnect(); AZ::TickBus::Handler::BusDisconnect(); AzFramework::InputChannelEventListener::Disconnect(); @@ -181,17 +234,22 @@ namespace AtomToolsFramework bool shouldConsumeEvent = true; - AzFramework::NativeWindowHandle windowId = reinterpret_cast(winId()); - const bool eventHandled = m_controllerList->HandleInputChannelEvent({GetId(), windowId, inputChannel}); + const bool eventHandled = m_controllerList->HandleInputChannelEvent({ GetId(), GetNativeWindowHandle(), inputChannel }); - // If our controllers handled the event and it's one we can safely consume (i.e. it's not an Ended event that other viewports might need), consume it. + // If our controllers handled the event and it's one we can safely consume (i.e. it's not an Ended event that other viewports might + // need), consume it. return eventHandled && shouldConsumeEvent; } - void RenderViewportWidget::OnTick([[maybe_unused]]float deltaTime, AZ::ScriptTimePoint time) + void RenderViewportWidget::OnTick([[maybe_unused]] float deltaTime, AZ::ScriptTimePoint time) { m_time = time; - m_controllerList->UpdateViewport({GetId(), AzFramework::FloatSeconds(deltaTime), m_time}); + m_controllerList->UpdateViewport({ GetId(), AzFramework::FloatSeconds(deltaTime), m_time }); + } + + int RenderViewportWidget::GetTickOrder() + { + return AZ::ComponentTickBus::TICK_PRE_RENDER; } void RenderViewportWidget::resizeEvent([[maybe_unused]] QResizeEvent* event) @@ -236,6 +294,75 @@ namespace AtomToolsFramework m_mousePosition = event->localPos(); } + void RenderViewportWidget::focusInEvent([[maybe_unused]] QFocusEvent* event) + { + RenderViewportWidget* lastFocusedViewport = m_lastFocusedViewport.Get(); + if (lastFocusedViewport == this) + { + return; + } + + RenderViewportWidget* previousFocusWidget = lastFocusedViewport; + m_lastFocusedViewport.Set(this); + + // Ensure this viewport and whatever viewport last had focus (if any) respect + // the active / inactive viewport frame rate settings. + UpdateFrameRate(); + if (previousFocusWidget != nullptr) + { + previousFocusWidget->UpdateFrameRate(); + } + } + + void RenderViewportWidget::OnFrameRateLimitChanged([[maybe_unused]] float fpsLimit) + { + UpdateFrameRate(); + } + + void RenderViewportWidget::OnInactiveViewportFrameRateChanged([[maybe_unused]] float fpsLimit) + { + UpdateFrameRate(); + } + + AzFramework::NativeWindowHandle RenderViewportWidget::GetNativeWindowHandle() const + { + return reinterpret_cast(winId()); + } + + void RenderViewportWidget::UpdateFrameRate() + { + if (ed_inactive_viewport_fps_limit > 0.f && m_lastFocusedViewport.Get() != this) + { + m_viewportContext->SetFpsLimit(ed_inactive_viewport_fps_limit); + } + else + { + float fpsLimit = 0.f; + AZ::Render::Bootstrap::RequestBus::BroadcastResult(fpsLimit, &AZ::Render::Bootstrap::RequestBus::Events::GetFrameRateLimit); + m_viewportContext->SetFpsLimit(fpsLimit); + } + } + + void RenderViewportWidget::SetScreen(QScreen* screen) + { + if (m_screen != screen) + { + if (m_screen) + { + QObject::disconnect(m_screen, &QScreen::refreshRateChanged, this, &RenderViewportWidget::NotifyUpdateRefreshRate); + } + + if (screen) + { + QObject::connect(m_screen, &QScreen::refreshRateChanged, this, &RenderViewportWidget::NotifyUpdateRefreshRate); + } + + NotifyUpdateRefreshRate(); + + m_screen = screen; + } + } + void RenderViewportWidget::SendWindowResizeEvent() { // Scale the size by the DPI of the platform to @@ -243,11 +370,17 @@ namespace AtomToolsFramework const QSize uiWindowSize = size(); const QSize windowSize = uiWindowSize * devicePixelRatioF(); - const AzFramework::NativeWindowHandle windowId = reinterpret_cast(winId()); - AzFramework::WindowNotificationBus::Event(windowId, &AzFramework::WindowNotifications::OnWindowResized, windowSize.width(), windowSize.height()); + AzFramework::WindowNotificationBus::Event( + GetNativeWindowHandle(), &AzFramework::WindowNotifications::OnWindowResized, windowSize.width(), windowSize.height()); m_windowResizedEvent = false; } + void RenderViewportWidget::NotifyUpdateRefreshRate() + { + AzFramework::WindowNotificationBus::Event( + GetNativeWindowHandle(), &AzFramework::WindowNotificationBus::Events::OnRefreshRateChanged, GetDisplayRefreshRate()); + } + AZ::Name RenderViewportWidget::GetCurrentContextName() const { return m_viewportContext->GetName(); @@ -303,9 +436,7 @@ namespace AtomToolsFramework // Build camera state from Atom camera transforms AzFramework::CameraState cameraState = AzFramework::CreateCameraFromWorldFromViewMatrix( - currentView->GetViewToWorldMatrix(), - AZ::Vector2{aznumeric_cast(width()), aznumeric_cast(height())} - ); + currentView->GetViewToWorldMatrix(), AZ::Vector2{ aznumeric_cast(width()), aznumeric_cast(height()) }); AzFramework::SetCameraClippingVolumeFromPerspectiveFovMatrixRH(cameraState, currentView->GetViewToClipMatrix()); // Convert from Z-up @@ -317,8 +448,7 @@ namespace AtomToolsFramework AzFramework::ScreenPoint RenderViewportWidget::ViewportWorldToScreen(const AZ::Vector3& worldPosition) { - if (AZ::RPI::ViewPtr currentView = m_viewportContext->GetDefaultView(); - currentView == nullptr) + if (AZ::RPI::ViewPtr currentView = m_viewportContext->GetDefaultView(); currentView == nullptr) { return AzFramework::ScreenPoint(0, 0); } @@ -331,12 +461,10 @@ namespace AtomToolsFramework const auto& cameraProjection = m_viewportContext->GetCameraProjectionMatrix(); const auto& cameraView = m_viewportContext->GetCameraViewMatrix(); - const AZ::Vector4 normalizedScreenPosition { - screenPosition.m_x * 2.f / width() - 1.0f, - (height() - screenPosition.m_y) * 2.f / height() - 1.0f, - 1.f - depth, // [GFX TODO] [ATOM-1501] Currently we always assume reverse depth - 1.f - }; + const AZ::Vector4 normalizedScreenPosition{ screenPosition.m_x * 2.f / width() - 1.0f, + (height() - screenPosition.m_y) * 2.f / height() - 1.0f, + 1.f - depth, // [GFX TODO] [ATOM-1501] Currently we always assume reverse depth + 1.f }; AZ::Matrix4x4 worldFromScreen = cameraProjection * cameraView; worldFromScreen.InvertFull(); @@ -365,7 +493,7 @@ namespace AtomToolsFramework AZ::Vector3 rayDirection = pos1.value() - pos0.value(); rayDirection.Normalize(); - return AzToolsFramework::ViewportInteraction::ProjectedViewportRay{rayOrigin, rayDirection}; + return AzToolsFramework::ViewportInteraction::ProjectedViewportRay{ rayOrigin, rayDirection }; } float RenderViewportWidget::DeviceScalingFactor() @@ -395,12 +523,12 @@ namespace AtomToolsFramework AzFramework::WindowSize RenderViewportWidget::GetClientAreaSize() const { - return AzFramework::WindowSize{aznumeric_cast(width()), aznumeric_cast(height())}; + return AzFramework::WindowSize{ aznumeric_cast(width()), aznumeric_cast(height()) }; } void RenderViewportWidget::ResizeClientArea(AzFramework::WindowSize clientAreaSize) { - const QSize targetSize = QSize{aznumeric_cast(clientAreaSize.m_width), aznumeric_cast(clientAreaSize.m_height)}; + const QSize targetSize = QSize{ aznumeric_cast(clientAreaSize.m_width), aznumeric_cast(clientAreaSize.m_height) }; resize(targetSize); } @@ -410,7 +538,7 @@ namespace AtomToolsFramework return false; } - void RenderViewportWidget::SetFullScreenState([[maybe_unused]]bool fullScreenState) + void RenderViewportWidget::SetFullScreenState([[maybe_unused]] bool fullScreenState) { // The RenderViewportWidget does not currently support full screen. } @@ -433,11 +561,20 @@ namespace AtomToolsFramework uint32_t RenderViewportWidget::GetDisplayRefreshRate() const { - return 60; + return static_cast(screen()->refreshRate()); } uint32_t RenderViewportWidget::GetSyncInterval() const { - return 1; + uint32_t interval = 1; + + // Get vsync_interval from AzFramework::NativeWindow, which owns it. + // NativeWindow also handles broadcasting OnVsyncIntervalChanged to all + // WindowNotificationBus listeners. + if (auto console = AZ::Interface::Get()) + { + console->GetCvarValue("vsync_interval", interval); + } + return interval; } -} //namespace AtomToolsFramework +} // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake index 3d4bb82eec..a24b45179f 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/atomtoolsframework_files.cmake @@ -28,6 +28,7 @@ set(FILES Include/AtomToolsFramework/Util/MaterialPropertyUtil.h Include/AtomToolsFramework/Util/Util.h Include/AtomToolsFramework/Viewport/RenderViewportWidget.h + Include/AtomToolsFramework/Viewport/RenderViewportWidgetNotificationBus.h Include/AtomToolsFramework/Viewport/ModularViewportCameraController.h Include/AtomToolsFramework/Viewport/ModularViewportCameraControllerRequestBus.h Include/AtomToolsFramework/Window/AtomToolsMainWindow.h diff --git a/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.cpp b/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.cpp index 7d659ebb7a..bf356fa4b5 100644 --- a/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.cpp +++ b/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.cpp @@ -183,6 +183,15 @@ namespace AZ::Render DrawFramerate(); } + void AtomViewportDisplayInfoSystemComponent::OnFrameEnd() + { + auto currentTime = AZStd::chrono::system_clock::now(); + if (!m_fpsHistory.empty()) + { + m_fpsHistory.back().m_endFrameTime = currentTime; + } + } + AtomBridge::ViewportInfoDisplayState AtomViewportDisplayInfoSystemComponent::GetDisplayState() const { return aznumeric_cast(r_displayInfo.operator int()); @@ -248,11 +257,11 @@ namespace AZ::Render void AtomViewportDisplayInfoSystemComponent::UpdateFramerate() { auto currentTime = AZStd::chrono::system_clock::now(); - while (!m_fpsHistory.empty() && (currentTime - m_fpsHistory.front()) > m_fpsInterval) + while (!m_fpsHistory.empty() && (currentTime - m_fpsHistory.front().m_beginFrameTime) > m_fpsInterval) { m_fpsHistory.pop_front(); } - m_fpsHistory.push_back(currentTime); + m_fpsHistory.push_back(FrameTimingInfo(currentTime)); } void AtomViewportDisplayInfoSystemComponent::DrawFramerate() @@ -261,25 +270,31 @@ namespace AZ::Render double minFPS = DBL_MAX; double maxFPS = 0; AZStd::chrono::duration deltaTime; + AZStd::chrono::milliseconds totalFrameMS(0); for (const auto& time : m_fpsHistory) { if (lastTime.has_value()) { - deltaTime = time - lastTime.value(); + deltaTime = time.m_beginFrameTime - lastTime.value(); double fps = AZStd::chrono::seconds(1) / deltaTime; minFPS = AZStd::min(minFPS, fps); maxFPS = AZStd::max(maxFPS, fps); } - lastTime = time; + lastTime = time.m_beginFrameTime; + + if (time.m_endFrameTime.has_value()) + { + totalFrameMS += time.m_endFrameTime.value() - time.m_beginFrameTime; + } } double averageFPS = 0; double averageFrameMs = 0; if (m_fpsHistory.size() > 1) { - deltaTime = m_fpsHistory.back() - m_fpsHistory.front(); - averageFPS = AZStd::chrono::seconds(m_fpsHistory.size()) / deltaTime; - averageFrameMs = 1000.0f/averageFPS; + deltaTime = m_fpsHistory.back().m_beginFrameTime - m_fpsHistory.front().m_beginFrameTime; + averageFPS = AZStd::chrono::seconds(m_fpsHistory.size() - 1) / deltaTime; + averageFrameMs = aznumeric_cast(totalFrameMS.count()) / (m_fpsHistory.size() - 1); } const double frameIntervalSeconds = m_fpsInterval.count(); @@ -288,7 +303,7 @@ namespace AZ::Render AZStd::string::format( "FPS %.1f [%.0f..%.0f], %.1fms/frame, avg over %.1fs", averageFPS, - minFPS, + minFPS == DBL_MAX ? 0.0 : minFPS, maxFPS, averageFrameMs, frameIntervalSeconds), diff --git a/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.h b/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.h index 1d53e188d0..689cfdb43b 100644 --- a/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.h +++ b/Gems/AtomLyIntegration/AtomViewportDisplayInfo/Code/Source/AtomViewportDisplayInfoSystemComponent.h @@ -45,6 +45,7 @@ namespace AZ // AZ::RPI::ViewportContextNotificationBus::Handler overrides... void OnRenderTick() override; + void OnFrameEnd() override; // AZ::AtomBridge::AtomViewportInfoDisplayRequestBus::Handler overrides... AtomBridge::ViewportInfoDisplayState GetDisplayState() const override; @@ -61,6 +62,8 @@ namespace AZ void DrawPassInfo(); void DrawFramerate(); + void UpdateScene(AZ::RPI::ScenePtr scene); + static constexpr float BaseFontSize = 0.7f; AZStd::string m_rendererDescription; @@ -68,7 +71,17 @@ namespace AZ AzFramework::FontDrawInterface* m_fontDrawInterface = nullptr; float m_lineSpacing; AZStd::chrono::duration m_fpsInterval = AZStd::chrono::seconds(1); - AZStd::deque m_fpsHistory; + struct FrameTimingInfo + { + AZStd::chrono::system_clock::time_point m_beginFrameTime; + AZStd::optional m_endFrameTime; + + explicit FrameTimingInfo(AZStd::chrono::system_clock::time_point beginFrameTime) + : m_beginFrameTime(beginFrameTime) + { + } + }; + AZStd::deque m_fpsHistory; AZStd::optional m_lastMemoryUpdate; bool m_updateRootPassQuery = true; }; From 9d2352c3b74e3cf03127b09a184c66ad9d0b1170 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Tue, 14 Sep 2021 13:24:01 +0100 Subject: [PATCH 296/355] Update the viewport interaction model to support single click select (#4094) * add support for single click select Signed-off-by: hultonha * remove redundant profile macro Signed-off-by: hultonha * updates following review feedback Signed-off-by: hultonha * fix behaviour for fallthrough to match previous code Signed-off-by: hultonha --- Code/Editor/EditorViewportWidget.cpp | 2 + .../ActionDispatcher.h | 15 +- .../ImmediateModeActionDispatcher.h | 1 + .../RetainedModeActionDispatcher.h | 55 --- .../Source/ImmediateModeActionDispatcher.cpp | 12 +- .../Source/RetainedModeActionDispatcher.cpp | 129 ------ .../azmanipulatortestframework_files.cmake | 2 - .../EditorTransformComponentSelection.cpp | 367 ++++++++++-------- .../EditorTransformComponentSelection.h | 6 + ...EditorTransformComponentSelectionTests.cpp | 170 +++++++- 10 files changed, 400 insertions(+), 359 deletions(-) delete mode 100644 Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/RetainedModeActionDispatcher.h delete mode 100644 Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index 7631ac6237..f009fe7602 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -1039,6 +1039,7 @@ void EditorViewportWidget::ConnectViewportInteractionRequestBus() { AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusConnect(GetViewportId()); + AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler::BusConnect(); m_viewportUi.ConnectViewportUiBus(GetViewportId()); AzFramework::InputSystemCursorConstraintRequestBus::Handler::BusConnect(); @@ -1049,6 +1050,7 @@ void EditorViewportWidget::DisconnectViewportInteractionRequestBus() AzFramework::InputSystemCursorConstraintRequestBus::Handler::BusDisconnect(); m_viewportUi.DisconnectViewportUiBus(); + AzToolsFramework::ViewportInteraction::EditorModifierKeyRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::EditorEntityViewportInteractionRequestBus::Handler::BusDisconnect(); AzToolsFramework::ViewportInteraction::MainEditorViewportInteractionRequestBus::Handler::BusDisconnect(); } diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h index 1b555a4a81..6bd72f5101 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h @@ -39,6 +39,8 @@ namespace AzManipulatorTestFramework DerivedDispatcherT* MouseLButtonDown(); //! Set the left mouse button up. DerivedDispatcherT* MouseLButtonUp(); + //! Send a double click event. + DerivedDispatcherT* MouseLButtonDoubleClick(); //! Set the keyboard modifier button down. DerivedDispatcherT* KeyboardModifierDown(const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier); //! Set the keyboard modifier button up. @@ -71,6 +73,7 @@ namespace AzManipulatorTestFramework virtual void CameraStateImpl(const AzFramework::CameraState& cameraState) = 0; virtual void MouseLButtonDownImpl() = 0; virtual void MouseLButtonUpImpl() = 0; + virtual void MouseLButtonDoubleClickImpl() = 0; virtual void MousePositionImpl(const AzFramework::ScreenPoint& position) = 0; virtual void KeyboardModifierDownImpl(const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) = 0; virtual void KeyboardModifierUpImpl(const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) = 0; @@ -167,7 +170,7 @@ namespace AzManipulatorTestFramework template DerivedDispatcherT* ActionDispatcher::MouseLButtonDown() { - Log("%s", "Mouse left button down"); + Log("Mouse left button down"); MouseLButtonDownImpl(); return static_cast(this); } @@ -175,11 +178,19 @@ namespace AzManipulatorTestFramework template DerivedDispatcherT* ActionDispatcher::MouseLButtonUp() { - Log("%s", "Mouse left button up"); + Log("Mouse left button up"); MouseLButtonUpImpl(); return static_cast(this); } + template + DerivedDispatcherT* ActionDispatcher::MouseLButtonDoubleClick() + { + Log("Mouse left button double click"); + MouseLButtonDoubleClickImpl(); + return static_cast(this); + } + template const char* ActionDispatcher::KeyboardModifierString( const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h index 7a4773a37c..9e11a7543c 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h @@ -58,6 +58,7 @@ namespace AzManipulatorTestFramework void CameraStateImpl(const AzFramework::CameraState& cameraState) override; void MouseLButtonDownImpl() override; void MouseLButtonUpImpl() override; + void MouseLButtonDoubleClickImpl() override; void MousePositionImpl(const AzFramework::ScreenPoint& position) override; void KeyboardModifierDownImpl(const KeyboardModifier& keyModifier) override; void KeyboardModifierUpImpl(const KeyboardModifier& keyModifier) override; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/RetainedModeActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/RetainedModeActionDispatcher.h deleted file mode 100644 index d9aceedf8a..0000000000 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/RetainedModeActionDispatcher.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#pragma once - -#include -#include -#include -#include -#include - -namespace AzManipulatorTestFramework -{ - //! Buffers actions to be dispatched upon a call to Execute(). - class RetainedModeActionDispatcher - : public ActionDispatcher - { - public: - explicit RetainedModeActionDispatcher(ManipulatorViewportInteraction& viewportManipulatorInteraction); - //! Execute the sequence of actions and lock the dispatcher from adding further actions. - RetainedModeActionDispatcher* Execute(); - //! Reset the sequence of actions and unlock the dispatcher from adding further actions. - RetainedModeActionDispatcher* ResetSequence(); - - protected: - // ActionDispatcher ... - void EnableSnapToGridImpl() override; - void DisableSnapToGridImpl() override; - void GridSizeImpl(float size) override; - void CameraStateImpl(const AzFramework::CameraState& cameraState) override; - void MouseLButtonDownImpl() override; - void MouseLButtonUpImpl() override; - void MousePositionImpl(const AzFramework::ScreenPoint& position) override; - void KeyboardModifierDownImpl(const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) override; - void KeyboardModifierUpImpl(const AzToolsFramework::ViewportInteraction::KeyboardModifier& keyModifier) override; - void ExpectManipulatorBeingInteractedImpl() override; - void ExpectManipulatorNotBeingInteractedImpl() override; - void SetEntityWorldTransformImpl(AZ::EntityId entityId, const AZ::Transform& transform) override; - void SetSelectedEntityImpl(AZ::EntityId entity) override; - void SetSelectedEntitiesImpl(const AzToolsFramework::EntityIdList& entities) override; - void EnterComponentModeImpl(const AZ::Uuid& uuid) override; - - private: - using Action = AZStd::function; - void AddActionToSequence(Action&& action); - ImmediateModeActionDispatcher m_dispatcher; - AZStd::list m_actions; - bool m_locked = false; - }; -} // namespace AzManipulatorTestFramework diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp index 895899cf3f..23cc2a21f5 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp @@ -83,7 +83,17 @@ namespace AzManipulatorTestFramework void ImmediateModeActionDispatcher::MouseLButtonUpImpl() { GetMouseInteractionEvent()->m_mouseEvent = AzToolsFramework::ViewportInteraction::MouseEvent::Up; - m_viewportManipulatorInteraction.GetManipulatorManager().ConsumeMouseInteractionEvent(*GetMouseInteractionEvent()); + m_viewportManipulatorInteraction.GetManipulatorManager().ConsumeMouseInteractionEvent(*m_event); + ToggleOff(GetMouseInteractionEvent()->m_mouseInteraction.m_mouseButtons.m_mouseButtons, MouseButton::Left); + // the mouse position will be the same as the previous event, thus the delta will be 0 + MouseMoveAfterButton(); + } + + void ImmediateModeActionDispatcher::MouseLButtonDoubleClickImpl() + { + GetMouseInteractionEvent()->m_mouseEvent = AzToolsFramework::ViewportInteraction::MouseEvent::DoubleClick; + ToggleOn(GetMouseInteractionEvent()->m_mouseInteraction.m_mouseButtons.m_mouseButtons, MouseButton::Left); + m_viewportManipulatorInteraction.GetManipulatorManager().ConsumeMouseInteractionEvent(*m_event); ToggleOff(GetMouseInteractionEvent()->m_mouseInteraction.m_mouseButtons.m_mouseButtons, MouseButton::Left); // the mouse position will be the same as the previous event, thus the delta will be 0 MouseMoveAfterButton(); diff --git a/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp b/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp deleted file mode 100644 index 34ae4aaf4a..0000000000 --- a/Code/Framework/AzManipulatorTestFramework/Source/RetainedModeActionDispatcher.cpp +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -#include - -namespace AzManipulatorTestFramework -{ - using KeyboardModifier = AzToolsFramework::ViewportInteraction::KeyboardModifier; - - RetainedModeActionDispatcher::RetainedModeActionDispatcher( - ManipulatorViewportInteraction& viewportManipulatorInteraction) - : m_dispatcher(viewportManipulatorInteraction) - { - } - - void RetainedModeActionDispatcher::AddActionToSequence(Action&& action) - { - if (m_locked) - { - const char* error = "Couldn't add action to sequence, dispatcher is locked (you must call ResetSequence() \ - before adding actions to this dispatcher)"; - Log("%s", error); - AZ_Assert(false, "Error: %s", error); - } - - m_actions.emplace_back(action); - } - - void RetainedModeActionDispatcher::EnableSnapToGridImpl() - { - AddActionToSequence([=]() { m_dispatcher.EnableSnapToGrid(); }); - } - - void RetainedModeActionDispatcher::DisableSnapToGridImpl() - { - AddActionToSequence([=]() { m_dispatcher.DisableSnapToGrid(); }); - } - - void RetainedModeActionDispatcher::GridSizeImpl(float size) - { - AddActionToSequence([=]() { m_dispatcher.GridSize(size); }); - } - - void RetainedModeActionDispatcher::CameraStateImpl(const AzFramework::CameraState& cameraState) - { - AddActionToSequence([=]() { m_dispatcher.CameraState(cameraState); }); - } - - void RetainedModeActionDispatcher::MouseLButtonDownImpl() - { - AddActionToSequence([=]() { m_dispatcher.MouseLButtonDown(); }); - } - - void RetainedModeActionDispatcher::MouseLButtonUpImpl() - { - AddActionToSequence([=]() { m_dispatcher.MouseLButtonUp(); }); - } - - void RetainedModeActionDispatcher::MousePositionImpl(const AzFramework::ScreenPoint& position) - { - AddActionToSequence([=]() { m_dispatcher.MousePosition(position); }); - } - - void RetainedModeActionDispatcher::KeyboardModifierDownImpl(const KeyboardModifier& keyModifier) - { - AddActionToSequence([=]() { m_dispatcher.KeyboardModifierDown(keyModifier); }); - } - - void RetainedModeActionDispatcher::KeyboardModifierUpImpl(const KeyboardModifier& keyModifier) - { - AddActionToSequence([=]() { m_dispatcher.KeyboardModifierUp(keyModifier); }); - } - - void RetainedModeActionDispatcher::ExpectManipulatorBeingInteractedImpl() - { - AddActionToSequence([=]() { m_dispatcher.ExpectManipulatorBeingInteracted(); }); - } - - void RetainedModeActionDispatcher::ExpectManipulatorNotBeingInteractedImpl() - { - AddActionToSequence([=]() { m_dispatcher.ExpectManipulatorNotBeingInteracted(); }); - } - - void RetainedModeActionDispatcher::SetEntityWorldTransformImpl(AZ::EntityId entityId, const AZ::Transform& transform) - { - AddActionToSequence([=]() { m_dispatcher.SetEntityWorldTransform(entityId, transform); }); - } - - void RetainedModeActionDispatcher::SetSelectedEntityImpl(AZ::EntityId entity) - { - AddActionToSequence([=]() { m_dispatcher.SetSelectedEntity(entity); }); - } - - void RetainedModeActionDispatcher::SetSelectedEntitiesImpl(const AzToolsFramework::EntityIdList& entities) - { - AddActionToSequence([=]() { m_dispatcher.SetSelectedEntities(entities); }); - } - - void RetainedModeActionDispatcher::EnterComponentModeImpl(const AZ::Uuid& uuid) - { - AddActionToSequence([=]() { m_dispatcher.EnterComponentMode(uuid); }); - } - - RetainedModeActionDispatcher* RetainedModeActionDispatcher::ResetSequence() - { - Log("%s", "Resetting the action sequence"); - m_actions.clear(); - m_dispatcher.ResetEvent(); - m_locked = false; - return this; - } - - RetainedModeActionDispatcher* RetainedModeActionDispatcher::Execute() - { - Log("Executing %u actions", m_actions.size()); - for (auto& action : m_actions) - { - action(); - } - m_dispatcher.ResetEvent(); - m_locked = true; - return this; - } -} // namespace AzManipulatorTestFramework diff --git a/Code/Framework/AzManipulatorTestFramework/azmanipulatortestframework_files.cmake b/Code/Framework/AzManipulatorTestFramework/azmanipulatortestframework_files.cmake index 3fe9f4266c..9f480a3e2a 100644 --- a/Code/Framework/AzManipulatorTestFramework/azmanipulatortestframework_files.cmake +++ b/Code/Framework/AzManipulatorTestFramework/azmanipulatortestframework_files.cmake @@ -14,12 +14,10 @@ set(FILES Include/AzManipulatorTestFramework/DirectManipulatorViewportInteraction.h Include/AzManipulatorTestFramework/IndirectManipulatorViewportInteraction.h Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h - Include/AzManipulatorTestFramework/RetainedModeActionDispatcher.h Include/AzManipulatorTestFramework/AzManipulatorTestFrameworkUtils.h Source/ViewportInteraction.cpp Source/DirectManipulatorViewportInteraction.cpp Source/IndirectManipulatorViewportInteraction.cpp Source/ImmediateModeActionDispatcher.cpp - Source/RetainedModeActionDispatcher.cpp Source/AzManipulatorTestFrameworkUtils.cpp ) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 3db8492d70..5a7b097e29 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -1770,6 +1770,12 @@ namespace AzToolsFramework return false; } + void EditorTransformComponentSelection::ChangeSelectedEntity(const AZ::EntityId entityId) + { + DeselectEntities(); + SelectDeselect(entityId); + } + bool EditorTransformComponentSelection::HandleMouseInteraction(const ViewportInteraction::MouseInteractionEvent& mouseInteraction) { AZ_PROFILE_FUNCTION(AzToolsFramework); @@ -1821,202 +1827,239 @@ namespace AzToolsFramework return true; } - // double click to deselect all - if (Input::DeselectAll(mouseInteraction)) + if (ed_viewportStickySelect) { - // note: even if m_selectedEntityIds is technically empty, we - // may still have an entity selected that was clicked in the - // entity outliner - we still want to make sure the deselect all - // action clears the selection - DeselectEntities(); - return false; + // double click to deselect all + if (Input::DeselectAll(mouseInteraction)) + { + // note: even if m_selectedEntityIds is technically empty, we + // may still have an entity selected that was clicked in the + // entity outliner - we still want to make sure the deselect all + // action clears the selection + DeselectEntities(); + return false; + } + } + + // select/deselect (add/remove) entities with ctrl held + if (Input::AdditiveIndividualSelect(clickOutcome, mouseInteraction)) + { + if (SelectDeselect(entityIdUnderCursor)) + { + if (m_selectedEntityIds.empty()) + { + m_pivotOverrideFrame.Reset(); + } + + return false; + } } if (!m_selectedEntityIds.empty()) { - // select/deselect (add/remove) entities with ctrl held - if (Input::AdditiveIndividualSelect(clickOutcome, mouseInteraction)) - { - if (SelectDeselect(entityIdUnderCursor)) - { - if (m_selectedEntityIds.empty()) - { - m_pivotOverrideFrame.Reset(); - } - - return false; - } - } - // group copying/alignment to specific entity - 'ditto' position/orientation for group - if (Input::GroupDitto(mouseInteraction)) + if (Input::GroupDitto(mouseInteraction) && PerformGroupDitto(entityIdUnderCursor)) { - if (entityIdUnderCursor.IsValid()) - { - AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(worldFromLocal, entityIdUnderCursor, &AZ::TransformBus::Events::GetWorldTM); - - switch (m_mode) - { - case Mode::Rotation: - CopyOrientationToSelectedEntitiesGroup(QuaternionFromTransformNoScaling(worldFromLocal)); - break; - case Mode::Scale: - CopyScaleToSelectedEntitiesIndividualWorld(worldFromLocal.GetUniformScale()); - break; - case Mode::Translation: - CopyTranslationToSelectedEntitiesGroup(worldFromLocal.GetTranslation()); - break; - default: - // do nothing - break; - } - - return false; - } + return false; } // individual copying/alignment to specific entity - 'ditto' position/orientation for individual - if (Input::IndividualDitto(mouseInteraction)) + if (Input::IndividualDitto(mouseInteraction) && PerformIndividualDitto(entityIdUnderCursor)) { - if (entityIdUnderCursor.IsValid()) - { - AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(worldFromLocal, entityIdUnderCursor, &AZ::TransformBus::Events::GetWorldTM); - - switch (m_mode) - { - case Mode::Rotation: - CopyOrientationToSelectedEntitiesIndividual(QuaternionFromTransformNoScaling(worldFromLocal)); - break; - case Mode::Scale: - CopyScaleToSelectedEntitiesIndividualWorld(worldFromLocal.GetUniformScale()); - break; - case Mode::Translation: - CopyTranslationToSelectedEntitiesIndividual(worldFromLocal.GetTranslation()); - break; - default: - // do nothing - break; - } - - return false; - } + return false; } // try snapping to the terrain (if in Translation mode) and entity wasn't picked if (Input::SnapTerrain(mouseInteraction)) { - for (AZ::EntityId entityId : m_selectedEntityIds) - { - ScopedUndoBatch::MarkEntityDirty(entityId); - } - - if (m_mode == Mode::Translation) - { - const AZ::Vector3 finalSurfacePosition = PickTerrainPosition(mouseInteraction.m_mouseInteraction); - - // handle modifier alternatives - if (Input::IndividualDitto(mouseInteraction)) - { - CopyTranslationToSelectedEntitiesIndividual(finalSurfacePosition); - } - else if (Input::GroupDitto(mouseInteraction)) - { - CopyTranslationToSelectedEntitiesGroup(finalSurfacePosition); - } - } - else if (m_mode == Mode::Rotation) - { - // handle modifier alternatives - if (Input::IndividualDitto(mouseInteraction)) - { - CopyOrientationToSelectedEntitiesIndividual(AZ::Quaternion::CreateIdentity()); - } - else if (Input::GroupDitto(mouseInteraction)) - { - CopyOrientationToSelectedEntitiesGroup(AZ::Quaternion::CreateIdentity()); - } - } - + PerformSnapToTerrain(mouseInteraction); return false; } // set manipulator pivot override translation or orientation (update manipulators) if (Input::ManipulatorDitto(mouseInteraction)) { - if (m_entityIdManipulators.m_manipulators) - { - ScopedUndoBatch undoBatch(s_dittoManipulatorUndoRedoDesc); - - auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); - - if (entityIdUnderCursor.IsValid()) - { - AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); - AZ::TransformBus::EventResult(worldFromLocal, entityIdUnderCursor, &AZ::TransformBus::Events::GetWorldTM); - - // set orientation/translation to match picked entity - switch (m_mode) - { - case Mode::Rotation: - OverrideManipulatorOrientation(QuaternionFromTransformNoScaling(worldFromLocal)); - break; - case Mode::Translation: - OverrideManipulatorTranslation(worldFromLocal.GetTranslation()); - break; - case Mode::Scale: - // do nothing - break; - default: - break; - } - - // only update pivot override when in translation or rotation mode - switch (m_mode) - { - case Mode::Rotation: - m_pivotOverrideFrame.m_pickTypes |= OptionalFrame::PickType::Orientation; - [[fallthrough]]; - case Mode::Translation: - m_pivotOverrideFrame.m_pickTypes |= OptionalFrame::PickType::Translation; - m_pivotOverrideFrame.m_pickedEntityIdOverride = entityIdUnderCursor; - break; - case Mode::Scale: - // do nothing - break; - default: - break; - } - } - else - { - // match the same behavior as if we pressed Ctrl+R to reset the manipulator - DelegateClearManipulatorOverride(); - } - - manipulatorCommand->SetManipulatorAfter(EntityManipulatorCommand::State( - BuildPivotOverride(m_pivotOverrideFrame.HasTranslationOverride(), m_pivotOverrideFrame.HasOrientationOverride()), - m_entityIdManipulators.m_manipulators->GetLocalTransform(), entityIdUnderCursor)); - - manipulatorCommand->SetParent(undoBatch.GetUndoBatch()); - manipulatorCommand.release(); - } + PerformManipulatorDitto(entityIdUnderCursor); + return false; } - return false; + if (ed_viewportStickySelect) + { + return false; + } } // standard toggle selection if (Input::IndividualSelect(clickOutcome)) { - SelectDeselect(entityIdUnderCursor); + if (!ed_viewportStickySelect) + { + ChangeSelectedEntity(entityIdUnderCursor); + } + else + { + SelectDeselect(entityIdUnderCursor); + } } return false; } + bool EditorTransformComponentSelection::PerformGroupDitto(const AZ::EntityId entityId) + { + if (entityId.IsValid()) + { + AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); + AZ::TransformBus::EventResult(worldFromLocal, entityId, &AZ::TransformBus::Events::GetWorldTM); + + switch (m_mode) + { + case Mode::Rotation: + CopyOrientationToSelectedEntitiesGroup(QuaternionFromTransformNoScaling(worldFromLocal)); + break; + case Mode::Scale: + CopyScaleToSelectedEntitiesIndividualWorld(worldFromLocal.GetUniformScale()); + break; + case Mode::Translation: + CopyTranslationToSelectedEntitiesGroup(worldFromLocal.GetTranslation()); + break; + default: + // do nothing + break; + } + + return true; + } + + return false; + } + + bool EditorTransformComponentSelection::PerformIndividualDitto(const AZ::EntityId entityId) + { + if (entityId.IsValid()) + { + AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); + AZ::TransformBus::EventResult(worldFromLocal, entityId, &AZ::TransformBus::Events::GetWorldTM); + + switch (m_mode) + { + case Mode::Rotation: + CopyOrientationToSelectedEntitiesIndividual(QuaternionFromTransformNoScaling(worldFromLocal)); + break; + case Mode::Scale: + CopyScaleToSelectedEntitiesIndividualWorld(worldFromLocal.GetUniformScale()); + break; + case Mode::Translation: + CopyTranslationToSelectedEntitiesIndividual(worldFromLocal.GetTranslation()); + break; + default: + // do nothing + break; + } + + return true; + } + + return false; + } + + void EditorTransformComponentSelection::PerformSnapToTerrain(const ViewportInteraction::MouseInteractionEvent& mouseInteraction) + { + for (AZ::EntityId entityId : m_selectedEntityIds) + { + ScopedUndoBatch::MarkEntityDirty(entityId); + } + + if (m_mode == Mode::Translation) + { + const AZ::Vector3 finalSurfacePosition = PickTerrainPosition(mouseInteraction.m_mouseInteraction); + + // handle modifier alternatives + if (Input::IndividualDitto(mouseInteraction)) + { + CopyTranslationToSelectedEntitiesIndividual(finalSurfacePosition); + } + else if (Input::GroupDitto(mouseInteraction)) + { + CopyTranslationToSelectedEntitiesGroup(finalSurfacePosition); + } + } + else if (m_mode == Mode::Rotation) + { + // handle modifier alternatives + if (Input::IndividualDitto(mouseInteraction)) + { + CopyOrientationToSelectedEntitiesIndividual(AZ::Quaternion::CreateIdentity()); + } + else if (Input::GroupDitto(mouseInteraction)) + { + CopyOrientationToSelectedEntitiesGroup(AZ::Quaternion::CreateIdentity()); + } + } + } + + void EditorTransformComponentSelection::PerformManipulatorDitto(const AZ::EntityId entityId) + { + if (m_entityIdManipulators.m_manipulators) + { + ScopedUndoBatch undoBatch(s_dittoManipulatorUndoRedoDesc); + + auto manipulatorCommand = + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + + if (entityId.IsValid()) + { + AZ::Transform worldFromLocal = AZ::Transform::CreateIdentity(); + AZ::TransformBus::EventResult(worldFromLocal, entityId, &AZ::TransformBus::Events::GetWorldTM); + + // set orientation/translation to match picked entity + switch (m_mode) + { + case Mode::Rotation: + OverrideManipulatorOrientation(QuaternionFromTransformNoScaling(worldFromLocal)); + break; + case Mode::Translation: + OverrideManipulatorTranslation(worldFromLocal.GetTranslation()); + break; + case Mode::Scale: + // do nothing + break; + default: + break; + } + + // only update pivot override when in translation or rotation mode + switch (m_mode) + { + case Mode::Rotation: + m_pivotOverrideFrame.m_pickTypes |= OptionalFrame::PickType::Orientation; + [[fallthrough]]; + case Mode::Translation: + m_pivotOverrideFrame.m_pickTypes |= OptionalFrame::PickType::Translation; + m_pivotOverrideFrame.m_pickedEntityIdOverride = entityId; + break; + case Mode::Scale: + // do nothing + break; + default: + break; + } + } + else + { + // match the same behavior as if we pressed Ctrl+R to reset the manipulator + DelegateClearManipulatorOverride(); + } + + manipulatorCommand->SetManipulatorAfter(EntityManipulatorCommand::State( + BuildPivotOverride(m_pivotOverrideFrame.HasTranslationOverride(), m_pivotOverrideFrame.HasOrientationOverride()), + m_entityIdManipulators.m_manipulators->GetLocalTransform(), entityId)); + + manipulatorCommand->SetParent(undoBatch.GetUndoBatch()); + manipulatorCommand.release(); + } + } + template static void AddAction( AZStd::vector>& actions, diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h index 35d3587d0b..478c0b775e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h @@ -207,6 +207,7 @@ namespace AzToolsFramework void SetSelectedEntities(const EntityIdList& entityIds); void DeselectEntities(); bool SelectDeselect(AZ::EntityId entityId); + void ChangeSelectedEntity(AZ::EntityId entityId); void RefreshSelectedEntityIds(); void RefreshSelectedEntityIds(const EntityIdList& selectedEntityIds); @@ -298,6 +299,11 @@ namespace AzToolsFramework void SetEntityLocalRotation(AZ::EntityId entityId, const AZ::Vector3& localRotation); void SetEntityLocalRotation(AZ::EntityId entityId, const AZ::Quaternion& localRotation); + bool PerformGroupDitto(AZ::EntityId entityId); + bool PerformIndividualDitto(AZ::EntityId entityId); + void PerformManipulatorDitto(AZ::EntityId entityId); + void PerformSnapToTerrain(const ViewportInteraction::MouseInteractionEvent& mouseInteraction); + //! Responsible for keeping the space cluster in sync with the current reference frame. void UpdateSpaceCluster(ReferenceFrame referenceFrame); diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index 8a958af567..241ee3f576 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -614,7 +614,7 @@ namespace UnitTest using EditorTransformComponentSelectionViewportPickingManipulatorTestFixture = IndirectCallManipulatorViewportInteractionFixtureMixin; - TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, SingleClickWithNoSelectionWillSelectEntity) + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickySingleClickWithNoSelectionWillSelectEntity) { AzToolsFramework::ed_viewportStickySelect = true; @@ -637,19 +637,44 @@ namespace UnitTest EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId1)); } - TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, SingleClickOffEntityWithSelectionWillNotDeselectEntity) + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickySingleClickWithNoSelectionWillSelectEntity) + { + AzToolsFramework::ed_viewportStickySelect = false; + + PositionEntities(); + PositionCamera(m_cameraState); + + using ::testing::Eq; + auto selectedEntitiesBefore = SelectedEntities(); + EXPECT_TRUE(selectedEntitiesBefore.empty()); + + // calculate the position in screen space of the initial entity position + const auto entity1ScreenPosition = AzFramework::WorldToScreen(m_entity1WorldTranslation, m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity1ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + + // entity is selected + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter.size(), Eq(1)); + EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId1)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + StickySingleClickOffEntityWithSelectionWillNotDeselectEntity) { AzToolsFramework::ed_viewportStickySelect = true; PositionEntities(); PositionCamera(m_cameraState); - // position in space above the entity + // position in space above the entities const auto clickOffPositionWorld = AZ::Vector3(5.0f, 15.0f, 12.0f); AzToolsFramework::SelectEntity(m_entityId1); - // calculate the position in screen space of the initial position of the entity + // calculate the screen space position of the click const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); // click the empty space in the viewport @@ -662,9 +687,32 @@ namespace UnitTest EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId1)); } + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickySingleClickOffEntityWithSelectionWillDeselectEntity) + { + AzToolsFramework::ed_viewportStickySelect = false; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntity(m_entityId1); + + // position in space above the entities + const auto clickOffPositionWorld = AZ::Vector3(5.0f, 15.0f, 12.0f); + // calculate the screen space position of the click + const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); + + // click the empty space in the viewport + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(clickOffPositionScreen)->MouseLButtonDown()->MouseLButtonUp(); + + // entity was deselected + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_TRUE(selectedEntitiesAfter.empty()); + } + TEST_F( EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, - SingleClickOnNewEntityWithSelectionWillNotChangeSelectedEntity) + StickySingleClickOnNewEntityWithSelectionWillNotChangeSelectedEntity) { AzToolsFramework::ed_viewportStickySelect = true; @@ -688,7 +736,31 @@ namespace UnitTest TEST_F( EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, - CtrlSingleClickOnNewEntityWithSelectionWillAppendSelectedEntityToSelection) + UnstickySingleClickOnNewEntityWithSelectionWillChangeSelectedEntity) + { + AzToolsFramework::ed_viewportStickySelect = false; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntity(m_entityId1); + + // calculate the position in screen space of the second entity + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity2ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + + // entity selection was changed + using ::testing::Eq; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter.size(), Eq(1)); + EXPECT_THAT(selectedEntitiesAfter.front(), Eq(m_entityId2)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + StickyCtrlSingleClickOnNewEntityWithSelectionWillAppendSelectedEntityToSelection) { AzToolsFramework::ed_viewportStickySelect = true; @@ -715,7 +787,34 @@ namespace UnitTest TEST_F( EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, - CtrlSingleClickOnEntityInSelectionWillRemoveEntityFromSelection) + UnstickyCtrlSingleClickOnNewEntityWithSelectionWillAppendSelectedEntityToSelection) + { + AzToolsFramework::ed_viewportStickySelect = false; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntity(m_entityId1); + + // calculate the position in screen space of the second entity + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(entity2ScreenPosition) + ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) + ->MouseLButtonDown() + ->MouseLButtonUp(); + + // entity selection was changed (one entity selected to two) + using ::testing::UnorderedElementsAre; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1, m_entityId2)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + StickyCtrlSingleClickOnEntityInSelectionWillRemoveEntityFromSelection) { AzToolsFramework::ed_viewportStickySelect = true; @@ -740,7 +839,36 @@ namespace UnitTest EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1)); } - TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + UnstickyCtrlSingleClickOnEntityInSelectionWillRemoveEntityFromSelection) + { + AzToolsFramework::ed_viewportStickySelect = false; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntities({ m_entityId1, m_entityId2 }); + + // calculate the position in screen space of the second entity + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); + + // click the entity in the viewport + m_actionDispatcher->CameraState(m_cameraState) + ->MousePosition(entity2ScreenPosition) + ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) + ->MouseLButtonDown() + ->MouseLButtonUp(); + + // entity selection was changed (entity2 was deselected) + using ::testing::UnorderedElementsAre; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1)); + } + + TEST_F( + EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, + BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) { AzToolsFramework::ed_viewportStickySelect = true; @@ -835,6 +963,32 @@ namespace UnitTest EXPECT_TRUE(selectedEntitiesAfter.empty()); } + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickyDoubleClickWithSelectionWillDeselectEntities) + { + AzToolsFramework::ed_viewportStickySelect = true; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntities({ m_entityId1, m_entityId2, m_entityId3 }); + + using ::testing::UnorderedElementsAre; + auto selectedEntitiesBefore = SelectedEntities(); + EXPECT_THAT(selectedEntitiesBefore, UnorderedElementsAre(m_entityId1, m_entityId2, m_entityId3)); + + // position in space above the entities + const auto clickOffPositionWorld = AZ::Vector3(5.0f, 15.0f, 12.0f); + // calculate the screen space position of the click + const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); + + // double click to deselect entities + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(clickOffPositionScreen)->MouseLButtonDoubleClick(); + + // no entities are selected + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_TRUE(selectedEntitiesAfter.empty()); + } + using EditorTransformComponentSelectionManipulatorTestFixture = IndirectCallManipulatorViewportInteractionFixtureMixin; From 988a6b7443c0d6dd69e0765bc57429a950c01972 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 14 Sep 2021 10:29:20 -0700 Subject: [PATCH 297/355] PR comments Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Code/Framework/AzCore/AzCore/std/string/regex.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/std/string/regex.h b/Code/Framework/AzCore/AzCore/std/string/regex.h index e20f67905c..3d4a2a0b38 100644 --- a/Code/Framework/AzCore/AzCore/std/string/regex.h +++ b/Code/Framework/AzCore/AzCore/std/string/regex.h @@ -215,6 +215,7 @@ namespace AZStd struct ErrorSink { + virtual ~ErrorSink() = default; virtual void RegexError(regex_constants::error_type code) = 0; }; } @@ -1079,7 +1080,7 @@ namespace AZStd NodeBase* m_next; NodeBase* m_previous; - virtual ~NodeBase() { } + virtual ~NodeBase() = default; }; inline void DestroyNode(NodeBase* node, NodeBase* end = nullptr) @@ -1758,7 +1759,7 @@ namespace AZStd return (*this); } - virtual ~basic_regex() + ~basic_regex() override { // destroy the object Clear(); } @@ -2916,7 +2917,7 @@ namespace AZStd } template - inline NodeBase* Builder::BeginGroup(void) + inline NodeBase* Builder::BeginGroup() { // add group node return (NewNode(NT_group)); } @@ -3026,7 +3027,7 @@ namespace AZStd } template - inline RootNode* Builder::EndPattern(void) + inline RootNode* Builder::EndPattern() { // wrap up NewNode(NT_end); return m_root; From a91ea7d549eaefe55b1ffa08ecc0167d866fa576 Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Tue, 14 Sep 2021 13:04:52 -0500 Subject: [PATCH 298/355] Removed unused EngineJson.cmake file (#4107) Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- cmake/EngineJson.cmake | 45 ----------------------------------------- cmake/cmake_files.cmake | 2 +- 2 files changed, 1 insertion(+), 46 deletions(-) delete mode 100644 cmake/EngineJson.cmake diff --git a/cmake/EngineJson.cmake b/cmake/EngineJson.cmake deleted file mode 100644 index f175ff5a8b..0000000000 --- a/cmake/EngineJson.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright (c) Contributors to the Open 3D Engine Project. -# For complete copyright and license terms please see the LICENSE at the root of this distribution. -# -# SPDX-License-Identifier: Apache-2.0 OR MIT -# -# -# This file is copied during engine registration. Edits to this file will be lost next -# time a registration happens. - -include_guard() - -set(LY_EXTERNAL_SUBDIRS "" CACHE STRING "Additional list of subdirectory to recurse into via the cmake `add_subdirectory()` command. \ - The subdirectories are included after the restricted platform folders have been visited by a call to `add_subdirectory(restricted/\${restricted_platform})`") - -#! read_engine_external_subdirs -# Read the external subdirectories from the engine.json file -# External subdirectories are any folders with CMakeLists.txt in them -# This could be regular subdirectories, Gems(contains an additional gem.json), -# Restricted folders(contains an additional restricted.json), etc... -# \arg:output_external_subdirs name of output variable to store external subdirectories into -function(read_engine_external_subdirs output_external_subdirs) - ly_file_read(${LY_ROOT_FOLDER}/engine.json engine_json_data) - string(JSON external_subdirs_count ERROR_VARIABLE engine_json_error - LENGTH ${engine_json_data} "external_subdirectories") - if(engine_json_error) - message(FATAL_ERROR "Error querying number of elements in JSON array \"external_subdirectories\": ${engine_json_error}") - endif() - - if(external_subdirs_count GREATER 0) - math(EXPR external_subdir_range "${external_subdirs_count}-1") - # Convert the paths the relative paths to absolute paths using the engine root - # as the base directory - foreach(external_subdir_index RANGE ${external_subdir_range}) - string(JSON external_subdir ERROR_VARIABLE engine_json_error - GET ${engine_json_data} "external_subdirectories" "${external_subdir_index}") - if(engine_json_error) - message(FATAL_ERROR "Error reading field at index ${external_subdir_index} in \"external_subdirectories\" JSON array: ${engine_json_error}") - endif() - file(REAL_PATH ${external_subdir} real_external_subdir BASE_DIRECTORY ${CMAKE_SOURCE_DIR}) - list(APPEND external_subdirs ${real_external_subdir}) - endforeach() - endif() - set(${output_external_subdirs} ${external_subdirs} PARENT_SCOPE) -endfunction() diff --git a/cmake/cmake_files.cmake b/cmake/cmake_files.cmake index aa275b634a..caeab9d12e 100644 --- a/cmake/cmake_files.cmake +++ b/cmake/cmake_files.cmake @@ -15,7 +15,6 @@ set(FILES Configurations.cmake Dependencies.cmake Deployment.cmake - EngineJson.cmake FileUtil.cmake Findo3de.cmake Gems.cmake @@ -28,6 +27,7 @@ set(FILES LYPython.cmake LYWrappers.cmake Monolithic.cmake + O3DEJson.cmake OutputDirectory.cmake Packaging.cmake PAL.cmake From 73b04d7e34f1049f5d535e6bb7e7045c9ea41f9d Mon Sep 17 00:00:00 2001 From: Gene Walters <32776221+AMZN-Gene@users.noreply.github.com> Date: Tue, 14 Sep 2021 12:01:32 -0700 Subject: [PATCH 299/355] Network Input Exposed to Script (#3990) * NetworkInput now has new attribute called ExposeToScript. NetworkInput with this attribute set to True will be exposed to behavior context. Also added a CreateFromValues for the NetworkInput where scripters can create an instance of the MyComponentNetworkInput class which will eventually be passed around CreateInput and ProcessInput events. Signed-off-by: Gene Walters * Adding Create Input event handler. SC can now receive the event to create input, and send it over the network Signed-off-by: Gene Walters * Auto-component controller will now generate CreateInput/ProcessInput methods if they have input exposed to script, not ready for use yet, just stubbed in Signed-off-by: Gene Walters * Reducing code replication by putting common network input variables into AutoComponent_Common.jinja Signed-off-by: Gene Walters * Fix minor comment typo in the CreateInput method Signed-off-by: Gene Walters * Small fix. Changing ebus call from MyComponentNameCreateInput to just CreateInput. It's part of the MyComponentRequestBus so adding the component name before CreateInput is noisy Signed-off-by: Gene Walters * Cleaning with jinja a bit using macro calls to iterate over scriptable netinputs Signed-off-by: Gene Walters * ProcessInput will now be triggered in script Signed-off-by: Gene Walters * ProcessInput event is sent to script. Script can now create and process input. Tested locally with a simple script. Signed-off-by: Gene Walters * Created a seperate CreateInputFromScript and ProcessInputFromScript. Developers no longer need to remember to call the BaseClass::CreateInput and ProcessInput since CreateInputFromScript will automatically be called beforehand. Signed-off-by: Gene Walters --- .../Components/MultiplayerController.h | 12 +++ .../Source/AutoGen/AutoComponent_Common.jinja | 60 +++++++++++++- .../Source/AutoGen/AutoComponent_Header.jinja | 56 ++++++++++++- .../Source/AutoGen/AutoComponent_Source.jinja | 82 +++++++++++++++++-- .../Source/Components/NetBindComponent.cpp | 2 + 5 files changed, 204 insertions(+), 8 deletions(-) diff --git a/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerController.h b/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerController.h index 2467b0566d..545706db4b 100644 --- a/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerController.h +++ b/Gems/Multiplayer/Code/Include/Multiplayer/Components/MultiplayerController.h @@ -89,11 +89,23 @@ namespace Multiplayer //! @param deltaTime amount of time to integrate the provided inputs over virtual void ProcessInput(NetworkInput& networkInput, float deltaTime) = 0; + //! Similar to ProcessInput, do not call directly. + //! This only needs to be overridden in components which allow NetworkInput to be processed by script. + //! @param networkInput input structure to process + //! @param deltaTime amount of time to integrate the provided inputs over + virtual void ProcessInputFromScript([[maybe_unused]] NetworkInput& networkInput, [[maybe_unused]] float deltaTime){} + //! Only valid on a client, should never be invoked on the server. //! @param networkInput input structure to process //! @param deltaTime amount of time to integrate the provided inputs over virtual void CreateInput(NetworkInput& networkInput, float deltaTime) = 0; + //! Similar to CreateInput, should never be invoked on the server. + //! This only needs to be overridden in components which allow NetworkInput creation to be handled by scripts. + //! @param networkInput input structure to process + //! @param deltaTime amount of time to integrate the provided inputs over + virtual void CreateInputFromScript([[maybe_unused]]NetworkInput& networkInput, [[maybe_unused]] float deltaTime) {} + template const ComponentType* FindComponent() const; diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja index 811039feda..5bf0a4823f 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Common.jinja @@ -252,7 +252,44 @@ void Signal{{ PropertyName }}({{ ', '.join(paramDefines) }}); {# #} -{%- macro EmitDerivedClassesComment(dataFileNames, Component, ComponentName, ComponentNameBase, ComponentDerived, ControllerName, ControllerNameBase, ControllerDerived, NetworkInputCount) -%} +{% macro GetNetworkInputCount(Component) -%} +{{ Component.findall('NetworkInput') | len }} +{%- endmacro -%} +{# + +#} +{% macro ParseNetworkInputsExposedToScript(Component) -%} +{% set NetworkInputsExposedToScript = namespace(value=0) %} +{% for netInput in Component.findall('NetworkInput') %} +{% if ('ExposeToScript' in netInput.attrib) and (netInput.attrib['ExposeToScript'] |booleanTrue) %} +{{ caller(netInput) -}} +{% endif %} +{% endfor %} +{%- endmacro -%} +{# + +#} +{% macro GetNetworkInputsExposedToScriptCount(Component) -%} +{% set NetworkInputsExposedToScript = namespace(value=0) %} +{% call (netInput) ParseNetworkInputsExposedToScript(Component) %} +{% set NetworkInputsExposedToScript.value = NetworkInputsExposedToScript.value + 1 %} +{% endcall %} +{{ NetworkInputsExposedToScript.value }} +{%- endmacro -%} +{# + +#} +{% macro GetCommaSeparatedParamListOfScriptableNetworkInputs(Component) -%} +{% set parameters = [] %} +{% call (netInput) ParseNetworkInputsExposedToScript(Component) %} +{% set parameters = parameters.append(netInput.attrib['Type'] + ' ' + LowerFirst(netInput.attrib['Name'])) %} +{% endcall %} +{{ parameters | join(', ') }} +{%- endmacro -%} +{# + +#} +{%- macro EmitDerivedClassesComment(dataFileNames, Component, ComponentName, ComponentNameBase, ComponentDerived, ControllerName, ControllerNameBase, ControllerDerived) -%} {% if ComponentDerived or ControllerDerived %} /* /// You may use the classes below as a basis for your new derived classes. Derived classes must be marked in {{ (dataFileNames[0] | basename) }} @@ -293,7 +330,16 @@ namespace {{ Component.attrib['Namespace'] }} void OnActivate(Multiplayer::EntityIsMigrating entityIsMigrating) override; void OnDeactivate(Multiplayer::EntityIsMigrating entityIsMigrating) override; +{% set NetworkInputCount = GetNetworkInputCount(Component) | int %} {% if NetworkInputCount > 0 %} + + //! Common input creation logic for the NetworkInput. + //! Fill out the input struct and the MultiplayerInputDriver will send the input data over the network + //! to ensure it's processed. + //! @param input input structure which to store input data for sending to the authority + //! @param deltaTime amount of time to integrate the provided inputs over + void CreateInput(Multiplayer::NetworkInput& input, float deltaTime) override; + //! Common input processing logic for the NetworkInput. //! @param input input structure to process //! @param deltaTime amount of time to integrate the provided inputs over @@ -366,6 +412,18 @@ namespace {{ Component.attrib['Namespace'] }} { } {% if NetworkInputCount > 0 %} +{% set net_input_parameters_name = [] %} +{% call (netInput) ParseNetworkInputsExposedToScript(Component) %} +{% set net_input_parameters_name = net_input_parameters_name.append(LowerFirst(netInput.attrib['Name'])) %} +{% endcall %} + + void {{ ControllerName }}::CreateInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) + { +{% if (GetNetworkInputsExposedToScriptCount(Component) | int) > 0 %} + // Remember the following NetworkInputs have been exposed to script: {{ net_input_parameters_name|join(', ') }}. + // If a script is handling these inputs they will have already be filled out by now. +{% endif %} + } void {{ ControllerName }}::ProcessInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) { diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja index 8cde9613b7..0f62da11f3 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Header.jinja @@ -230,7 +230,8 @@ AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] } {% if ControllerDerived %} {% set ControllerBaseName = ControllerName + "Base" %} {% endif %} -{% set NetworkInputCount = Component.findall('NetworkInput') | len %} +{% set NetworkInputCount = AutoComponentMacros.GetNetworkInputCount(Component) | int %} +{% set NetworkInputsExposedToScriptCount = AutoComponentMacros.GetNetworkInputsExposedToScriptCount(Component) | int %} {% set NetworkPropertyCount = Component.findall('NetworkProperty') | len %} {% set RpcCount = Component.findall('RemoteProcedure') | len %} #include "AutoComponentTypes.h" @@ -250,6 +251,10 @@ AZStd::fixed_vector<{{ Property.attrib['Type'] }}, {{ Property.attrib['Count'] } {% call(Include) AutoComponentMacros.ParseIncludes(Component) %} #include <{{ Include.attrib['File'] }}> {% endcall %} +{% if NetworkInputsExposedToScriptCount > 0 %} +#include +{% endif %} + {% for Service in Component.iter('ComponentRelation') %} {% if Service.attrib['Constraint'] != 'Incompatible' %} @@ -263,7 +268,7 @@ namespace {{ Service.attrib['Namespace'] }} {% endif %} {% endfor %} -{{ AutoComponentMacros.EmitDerivedClassesComment(dataFileNames, Component, ComponentName, ComponentBaseName, ComponentDerived, ControllerName, ControllerBaseName, ControllerDerived, NetworkInputCount) }} +{{ AutoComponentMacros.EmitDerivedClassesComment(dataFileNames, Component, ComponentName, ComponentBaseName, ComponentDerived, ControllerName, ControllerBaseName, ControllerDerived) }} namespace {{ Component.attrib['Namespace'] }} { //! Forward declarations @@ -337,6 +342,13 @@ namespace {{ Component.attrib['Namespace'] }} : public Multiplayer::IMultiplayerComponentInput { public: +{% if NetworkInputsExposedToScriptCount > 0 %} + AZ_TYPE_INFO({{ ComponentName }}NetworkInput, "{{ (ComponentName ~ "NetworkInput") | createHashGuid }}") + {{ ComponentName }}NetworkInput() = default; + {{ ComponentName }}NetworkInput({{ AutoComponentMacros.GetCommaSeparatedParamListOfScriptableNetworkInputs(Component) }}); + static void Reflect(AZ::ReflectContext* context); + +{% endif%} Multiplayer::NetComponentId GetNetComponentId() const override; bool Serialize(AzNetworking::ISerializer& serializer) override; Multiplayer::IMultiplayerComponentInput& operator =(const Multiplayer::IMultiplayerComponentInput& rhs) override; @@ -348,7 +360,41 @@ namespace {{ Component.attrib['Namespace'] }} static Multiplayer::NetComponentId s_netComponentId; friend void RegisterMultiplayerComponents(); }; +{% if NetworkInputsExposedToScriptCount > 0 %} + class {{ ComponentName }}Requests + : public AZ::ComponentBus + { + public: + AZ_RTTI({{ ComponentName }}Requests, "{{ (ComponentName ~ "Requests") | createHashGuid }}") + + virtual {{ ComponentName }}NetworkInput CreateInput(float deltaTime) = 0; + virtual void ProcessInput({{ ComponentName }}NetworkInput* networkInput, float deltaTime) = 0; + }; + + using {{ ComponentName }}RequestBus = AZ::EBus<{{ ComponentName }}Requests>; + + class {{ ComponentName }}BusHandler final + : public {{ ComponentName }}RequestBus::Handler + , public AZ::BehaviorEBusHandler + { + public: + AZ_EBUS_BEHAVIOR_BINDER({{ ComponentName }}BusHandler, "{{ (ComponentName ~ "BusHandler") | createHashGuid }}", AZ::SystemAllocator, CreateInput, ProcessInput) + + {{ ComponentName }}NetworkInput CreateInput(float deltaTime) override + { + {{ ComponentName }}NetworkInput result; + CallResult(result, FN_CreateInput, deltaTime); + return result; + } + + void ProcessInput({{ ComponentName }}NetworkInput* networkInput, float deltaTime) override + { + Call(FN_ProcessInput, networkInput, deltaTime); + } + }; + +{% endif %} {% endif %} class {{ ControllerBaseName }}{% if not ControllerDerived %} final{% endif %}{{ "" }} : public Multiplayer::MultiplayerController @@ -373,8 +419,14 @@ namespace {{ Component.attrib['Namespace'] }} //! MultiplayerController interface //! @{ Multiplayer::MultiplayerController::InputPriorityOrder GetInputOrder() const override { return Multiplayer::MultiplayerController::InputPriorityOrder::Default; } + +{% if NetworkInputsExposedToScriptCount > 0 %} + void CreateInputFromScript([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) final; + void ProcessInputFromScript([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) final; +{% endif %} void CreateInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) override {} void ProcessInput([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) override {} + //! @} {{ DeclareNetworkPropertyAccessors(Component, 'Authority', 'Server', false)|indent(8) -}} diff --git a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja index d8e729afd6..e57e8dad2f 100644 --- a/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja +++ b/Gems/Multiplayer/Code/Source/AutoGen/AutoComponent_Source.jinja @@ -1152,7 +1152,8 @@ m_{{ LowerFirst(Property.attrib['Name']) }} = m_{{ LowerFirst(Property.attrib['N {% else %} {% set ControllerBaseName = ControllerName %} {% endif %} -{% set NetworkInputCount = Component.findall('NetworkInput') | len %} +{% set NetworkInputCount = AutoComponentMacros.GetNetworkInputCount(Component) | int %} +{% set NetworkInputsExposedToScriptCount = AutoComponentMacros.GetNetworkInputsExposedToScriptCount(Component) | int %} {% set NetworkPropertyCount = Component.findall('NetworkProperty') | len %} {% set RpcCount = Component.findall('RemoteProcedure') | len %} #include "{{ includeFile }}" @@ -1299,6 +1300,56 @@ namespace {{ Component.attrib['Namespace'] }} } {% if NetworkInputCount > 0 %} +{% set ScriptableNetworkInputParamNames = [] %} +{% call(netInput) AutoComponentMacros.ParseNetworkInputsExposedToScript(Component) %} +{% set ScriptableNetworkInputParamNames = ScriptableNetworkInputParamNames.append(LowerFirst(netInput.attrib['Name'])) %} +{% endcall %} +{% if NetworkInputsExposedToScriptCount > 0 %} + {{ ComponentName }}NetworkInput Construct{{ ComponentName }}NetworkInput({{ AutoComponentMacros.GetCommaSeparatedParamListOfScriptableNetworkInputs(Component) }}) + { + return {{ ComponentName }}NetworkInput({{ ScriptableNetworkInputParamNames|join(', ') }}); + } + + {{ ComponentName }}NetworkInput::{{ ComponentName }}NetworkInput({{ AutoComponentMacros.GetCommaSeparatedParamListOfScriptableNetworkInputs(Component) }}) + : {% for param_name in ScriptableNetworkInputParamNames %}m_{{ LowerFirst(param_name) }}({{ LowerFirst(param_name) }}){% if not loop.last %}, {% endif %}{% endfor -%}{} + + void {{ ComponentName }}NetworkInput::Reflect(AZ::ReflectContext* context) + { + AZ::SerializeContext* serializeContext = azrtti_cast(context); + if (serializeContext) + { + serializeContext->Class<{{ ComponentName }}NetworkInput>() + ->Version(1) + ; + } + + AZ::BehaviorContext* behaviorContext = azrtti_cast(context); + if (behaviorContext) + { + behaviorContext->Class<{{ ComponentName }}NetworkInput>("{{ ComponentName }}NetworkInput") + ->Attribute(AZ::Script::Attributes::Module, "{{ LowerFirst(Component.attrib['Namespace']) }}") + ->Attribute(AZ::Script::Attributes::Category, "{{ UpperFirst(Component.attrib['Namespace']) }}") +{% set ScriptableNetInputNames = [] %} +{% call (netInput) AutoComponentMacros.ParseNetworkInputsExposedToScript(Component) %} +{% set ScriptableNetInputNames = ScriptableNetInputNames.append(netInput.attrib['Name']) %} +{% endcall %} + ->Method("CreateFromValues", &Construct{{ ComponentName }}NetworkInput, { { {% for param_name in ScriptableNetInputNames %}{"{{ LowerFirst(param_name) }}"}{% if not loop.last %}, {% endif %}{% endfor -%} } }) + +{% for param_name in ScriptableNetInputNames %} + ->Property("{{ param_name }}", BehaviorValueProperty(&{{ ComponentName }}NetworkInput::m_{{ LowerFirst(param_name) }})) +{% endfor %} + ; + + behaviorContext->EBus<{{ ComponentName }}RequestBus>("{{ ComponentName }}BusHandler") + ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Common) + ->Attribute(AZ::Script::Attributes::Module, "{{ LowerFirst(Component.attrib['Namespace']) }}") + ->Attribute(AZ::Script::Attributes::Category, "{{ UpperFirst(Component.attrib['Namespace']) }}") + ->Handler<{{ ComponentName }}BusHandler>() + ; + } + } +{% endif %} + Multiplayer::NetComponentId {{ ComponentName }}NetworkInput::GetNetComponentId() const { return {{ ComponentName }}NetworkInput::s_netComponentId; @@ -1347,6 +1398,26 @@ namespace {{ Component.attrib['Namespace'] }} {% endif %} } +{% if NetworkInputsExposedToScriptCount > 0 %} + void {{ ControllerBaseName }}::CreateInputFromScript([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) + { + {{ ComponentName }}NetworkInput result; + {{ ComponentName }}RequestBus::EventResult(result, GetEntity()->GetId(), &{{ ComponentName }}RequestBus::Events::CreateInput, deltaTime); + + // Inputs for your own component always exist + {{ ComponentName }}NetworkInput* {{ LowerFirst(ComponentName) }}Input = input.FindComponentInput<{{ ComponentName }}NetworkInput>(); +{% call(netInput) AutoComponentMacros.ParseNetworkInputsExposedToScript(Component) %} + {{ LowerFirst(ComponentName) }}Input->m_{{ LowerFirst(netInput.attrib['Name']) }} = result.m_{{ LowerFirst(netInput.attrib['Name']) }}; +{% endcall %} + } + + void {{ ControllerBaseName }}::ProcessInputFromScript([[maybe_unused]] Multiplayer::NetworkInput& input, [[maybe_unused]] float deltaTime) + { + {{ ComponentName }}NetworkInput* {{ LowerFirst(ComponentName) }}Input = input.FindComponentInput<{{ ComponentName }}NetworkInput>(); + {{ ComponentName }}RequestBus::Event(GetEntity()->GetId(), &{{ ComponentName }}RequestBus::Events::ProcessInput, {{ LowerFirst(ComponentName) }}Input, deltaTime); + } +{% endif %} + const {{ ComponentName }}& {{ ControllerBaseName }}::GetParent() const { return static_cast(GetOwner()); @@ -1399,6 +1470,9 @@ namespace {{ Component.attrib['Namespace'] }} } ReflectToEditContext(context); ReflectToBehaviorContext(context); +{% if NetworkInputsExposedToScriptCount > 0 %} + {{ ComponentName }}NetworkInput::Reflect(context); +{% endif %} } void {{ ComponentBaseName }}::ReflectToEditContext(AZ::ReflectContext* context) @@ -1448,8 +1522,8 @@ namespace {{ Component.attrib['Namespace'] }} {{ DefineNetworkPropertyBehaviorReflection(Component, 'Authority', 'Server', ComponentName) | indent(16) -}} {{ DefineNetworkPropertyBehaviorReflection(Component, 'Authority', 'Client', ComponentName) | indent(16) -}} {{ DefineNetworkPropertyBehaviorReflection(Component, 'Authority', 'Autonomous', ComponentName) | indent(16) -}} - {{ DefineNetworkPropertyBehaviorReflection(Component, 'Autonomous', 'Authority', ComponentName) | indent(16) -}} - + {{ DefineNetworkPropertyBehaviorReflection(Component, 'Autonomous', 'Authority', ComponentName) | indent(16) }} + // Reflect RPCs {{ ReflectRpcInvocations(Component, ComponentName, 'Server', 'Authority')|indent(4) -}} {{ ReflectRpcInvocations(Component, ComponentName, 'Autonomous', 'Authority')|indent(4) -}} @@ -1459,7 +1533,6 @@ namespace {{ Component.attrib['Namespace'] }} {{ ReflectRpcEvents(Component, ComponentName, 'Autonomous', 'Authority')|indent(4) -}} {{ ReflectRpcEvents(Component, ComponentName, 'Authority', 'Autonomous')|indent(4) -}} {{ ReflectRpcEvents(Component, ComponentName, 'Authority', 'Client')|indent(4) -}} - {{- DefineArchetypePropertyBehaviorReflection(Component, ComponentName) | indent(16) }} ; } @@ -1508,7 +1581,6 @@ namespace {{ Component.attrib['Namespace'] }} } {{ ComponentBaseName }}::{{ ComponentBaseName }}() = default; - {{ ComponentBaseName }}::~{{ ComponentBaseName }}() = default; void {{ ComponentBaseName }}::Init() diff --git a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp index d8e8a765ce..43577525c0 100644 --- a/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp +++ b/Gems/Multiplayer/Code/Source/Components/NetBindComponent.cpp @@ -278,6 +278,7 @@ namespace Multiplayer AZ_Assert(IsNetEntityRoleAutonomous(), "Incorrect network role for input creation"); for (MultiplayerComponent* multiplayerComponent : m_multiplayerInputComponentVector) { + multiplayerComponent->GetController()->CreateInputFromScript(networkInput, deltaTime); multiplayerComponent->GetController()->CreateInput(networkInput, deltaTime); } } @@ -289,6 +290,7 @@ namespace Multiplayer AZ_Assert((NetworkRoleHasController(m_netEntityRole)), "Incorrect network role for input processing"); for (MultiplayerComponent* multiplayerComponent : m_multiplayerInputComponentVector) { + multiplayerComponent->GetController()->ProcessInputFromScript(networkInput, deltaTime); multiplayerComponent->GetController()->ProcessInput(networkInput, deltaTime); } m_isProcessingInput = false; From ae735ad3381d0d51c3b11647c5828d8c5504ec7f Mon Sep 17 00:00:00 2001 From: Jonny Gallowy Date: Tue, 14 Sep 2021 14:26:50 -0500 Subject: [PATCH 300/355] new postfx layer categories and ordering values Signed-off-by: Jonny Gallowy --- .../PostProcess/default.postfxlayercategories | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Assets/PostProcess/default.postfxlayercategories b/Gems/AtomLyIntegration/CommonFeatures/Assets/PostProcess/default.postfxlayercategories index 33adccfd33..d6bffb0e6a 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Assets/PostProcess/default.postfxlayercategories +++ b/Gems/AtomLyIntegration/CommonFeatures/Assets/PostProcess/default.postfxlayercategories @@ -1,17 +1,30 @@ + - - + + - - + + + + + + + + + + - + + + + + From c0426ba465dfd002a7cfded7b15ad953a1ec56d0 Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Tue, 14 Sep 2021 12:35:56 -0700 Subject: [PATCH 301/355] PerScreenDpi | QLabels incorrectly handle scale for icons (#4070) * Fixes to icon generation. Generating a pixmap out of a size won't take the screen scaling factor into account, resulting in blurry results. Note that this is not a catchall solution, every case needs to be addressed manually. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * HighDpi fixes for startup splashscreen and About dialog Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> * Add helper function to generate appropriate pixmaps for a screen based on its dpi settings. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- Code/Editor/AboutDialog.cpp | 10 ++++-- Code/Editor/StartupLogoDialog.cpp | 17 +++++----- .../WelcomeScreen/WelcomeScreenDialog.cpp | 6 +++- .../Utilities/PixmapScaleUtilities.cpp | 31 +++++++++++++++++++ .../Utilities/PixmapScaleUtilities.h | 19 ++++++++++++ .../AzQtComponents/azqtcomponents_files.cmake | 2 ++ .../EditorEntityUiHandlerBase.cpp | 4 +-- .../EditorEntityUiHandlerBase.h | 2 +- .../UI/Layer/LayerUiHandler.cpp | 4 +-- .../UI/Layer/LayerUiHandler.h | 2 +- .../UI/Outliner/EntityOutlinerListModel.cpp | 14 ++++----- .../UI/Prefab/LevelRootUiHandler.cpp | 4 +-- .../UI/Prefab/LevelRootUiHandler.h | 2 +- .../UI/Prefab/PrefabUiHandler.cpp | 6 ++-- .../UI/Prefab/PrefabUiHandler.h | 2 +- 15 files changed, 94 insertions(+), 31 deletions(-) create mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.cpp create mode 100644 Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.h diff --git a/Code/Editor/AboutDialog.cpp b/Code/Editor/AboutDialog.cpp index f8abe67376..2c76526731 100644 --- a/Code/Editor/AboutDialog.cpp +++ b/Code/Editor/AboutDialog.cpp @@ -20,6 +20,7 @@ // AzCore #include // for aznumeric_cast +#include AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING #include @@ -46,8 +47,13 @@ CAboutDialog::CAboutDialog(QString versionText, QString richTextCopyrightNotice, CAboutDialog > QLabel#link { text-decoration: underline; color: #94D2FF; }"); // Prepare background image - QImage backgroundImage(QStringLiteral(":/StartupLogoDialog/splashscreen_background_developer_preview.jpg")); - m_backgroundImage = QPixmap::fromImage(backgroundImage.scaled(m_enforcedWidth, m_enforcedHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + m_backgroundImage = AzQtComponents::ScalePixmapForScreenDpi( + QPixmap(QStringLiteral(":/StartupLogoDialog/splashscreen_background_developer_preview.jpg")), + screen(), + QSize(m_enforcedWidth, m_enforcedHeight), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation + ); // Draw the Open 3D Engine logo from svg m_ui->m_logo->load(QStringLiteral(":/StartupLogoDialog/o3de_logo.svg")); diff --git a/Code/Editor/StartupLogoDialog.cpp b/Code/Editor/StartupLogoDialog.cpp index d9625aff1a..ab251b1564 100644 --- a/Code/Editor/StartupLogoDialog.cpp +++ b/Code/Editor/StartupLogoDialog.cpp @@ -9,11 +9,11 @@ // Description : implementation file - #include "EditorDefs.h" - #include "StartupLogoDialog.h" +#include + // Qt #include #include @@ -22,8 +22,6 @@ AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING #include AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING - - ///////////////////////////////////////////////////////////////////////////// // CStartupLogoDialog dialog @@ -36,13 +34,16 @@ CStartupLogoDialog::CStartupLogoDialog(QString versionText, QString richTextCopy m_ui->setupUi(this); s_pLogoWindow = this; - - m_backgroundImage = QPixmap(QStringLiteral(":/StartupLogoDialog/splashscreen_background_developer_preview.jpg")); setFixedSize(QSize(600, 300)); // Prepare background image - QImage backgroundImage(QStringLiteral(":/StartupLogoDialog/splashscreen_background_developer_preview.jpg")); - m_backgroundImage = QPixmap::fromImage(backgroundImage.scaled(m_enforcedWidth, m_enforcedHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + m_backgroundImage = AzQtComponents::ScalePixmapForScreenDpi( + QPixmap(QStringLiteral(":/StartupLogoDialog/splashscreen_background_developer_preview.jpg")), + screen(), + QSize(m_enforcedWidth, m_enforcedHeight), + Qt::IgnoreAspectRatio, + Qt::SmoothTransformation + ); // Draw the Open 3D Engine logo from svg m_ui->m_logo->load(QStringLiteral(":/StartupLogoDialog/o3de_logo.svg")); diff --git a/Code/Editor/WelcomeScreen/WelcomeScreenDialog.cpp b/Code/Editor/WelcomeScreen/WelcomeScreenDialog.cpp index 0f73023acf..17f576b5ee 100644 --- a/Code/Editor/WelcomeScreen/WelcomeScreenDialog.cpp +++ b/Code/Editor/WelcomeScreen/WelcomeScreenDialog.cpp @@ -34,6 +34,7 @@ // AzQtComponents #include #include +#include // Editor #include "Settings.h" @@ -79,8 +80,11 @@ WelcomeScreenDialog::WelcomeScreenDialog(QWidget* pParent) { projectPreviewPath = ":/WelcomeScreenDialog/DefaultProjectImage.png"; } + ui->activeProjectIcon->setPixmap( - QPixmap(projectPreviewPath).scaled( + AzQtComponents::ScalePixmapForScreenDpi( + QPixmap(projectPreviewPath), + screen(), ui->activeProjectIcon->size(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.cpp new file mode 100644 index 0000000000..fa32b708d7 --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.cpp @@ -0,0 +1,31 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +#include + +namespace AzQtComponents +{ + QPixmap ScalePixmapForScreenDpi( + QPixmap pixmap, QScreen* screen, QSize size, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformationMode) + { + qreal screenDpiFactor = QHighDpiScaling::factor(screen); + pixmap.setDevicePixelRatio(screenDpiFactor); + + QPixmap scaledPixmap; + + size.setWidth(aznumeric_cast(aznumeric_cast(size.width()) * screenDpiFactor)); + size.setHeight(aznumeric_cast(aznumeric_cast(size.height()) * screenDpiFactor)); + + scaledPixmap = pixmap.scaled(size, aspectRatioMode, transformationMode); + + return scaledPixmap; + } +} diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.h b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.h new file mode 100644 index 0000000000..4b083855d5 --- /dev/null +++ b/Code/Framework/AzQtComponents/AzQtComponents/Utilities/PixmapScaleUtilities.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include + +#include +#include + +namespace AzQtComponents +{ + AZ_QT_COMPONENTS_API QPixmap ScalePixmapForScreenDpi(QPixmap pixmap, QScreen* screen, QSize size, Qt::AspectRatioMode aspectRatioMode, Qt::TransformationMode transformationMode); +}; // namespace AzQtComponents diff --git a/Code/Framework/AzQtComponents/AzQtComponents/azqtcomponents_files.cmake b/Code/Framework/AzQtComponents/AzQtComponents/azqtcomponents_files.cmake index c214b81405..8219ab04b2 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/azqtcomponents_files.cmake +++ b/Code/Framework/AzQtComponents/AzQtComponents/azqtcomponents_files.cmake @@ -276,6 +276,8 @@ set(FILES Utilities/HandleDpiAwareness.cpp Utilities/HandleDpiAwareness.h Utilities/MouseHider.h + Utilities/PixmapScaleUtilities.cpp + Utilities/PixmapScaleUtilities.h Utilities/QtPluginPaths.cpp Utilities/QtPluginPaths.h Utilities/QtWindowUtilities.cpp diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp index f0462532e6..a0da20ebf0 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.cpp @@ -47,9 +47,9 @@ namespace AzToolsFramework return QString(); } - QPixmap EditorEntityUiHandlerBase::GenerateItemIcon(AZ::EntityId /*entityId*/) const + QIcon EditorEntityUiHandlerBase::GenerateItemIcon(AZ::EntityId /*entityId*/) const { - return QPixmap(); + return QIcon(); } bool EditorEntityUiHandlerBase::CanToggleLockVisibility(AZ::EntityId /*entityId*/) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h index e7008b7abf..c37b099272 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/EditorEntityUi/EditorEntityUiHandlerBase.h @@ -40,7 +40,7 @@ namespace AzToolsFramework //! Returns the item tooltip text to display in the Outliner. virtual QString GenerateItemTooltip(AZ::EntityId entityId) const; //! Returns the item icon pixmap to display in the Outliner. - virtual QPixmap GenerateItemIcon(AZ::EntityId entityId) const; + virtual QIcon GenerateItemIcon(AZ::EntityId entityId) const; //! Returns whether the element's lock and visibility state should be accessible in the Outliner virtual bool CanToggleLockVisibility(AZ::EntityId entityId) const; //! Returns whether the element's name should be editable diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp index b0eee96abc..8a001bc04f 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.cpp @@ -66,9 +66,9 @@ namespace AzToolsFramework return result; } - QPixmap LayerUiHandler::GenerateItemIcon(AZ::EntityId /*entityId*/) const + QIcon LayerUiHandler::GenerateItemIcon(AZ::EntityId /*entityId*/) const { - return QPixmap(m_layerIconPath); + return QIcon(m_layerIconPath); } void LayerUiHandler::PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h index 56b62832ce..b1af9d694e 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Layer/LayerUiHandler.h @@ -24,7 +24,7 @@ namespace AzToolsFramework // EditorEntityUiHandler... QString GenerateItemInfoString(AZ::EntityId entityId) const override; - QPixmap GenerateItemIcon(AZ::EntityId entityId) const override; + QIcon GenerateItemIcon(AZ::EntityId entityId) const override; void PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; void PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp index b9180f8ef6..d9f3ff8bb8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Outliner/EntityOutlinerListModel.cpp @@ -280,17 +280,17 @@ namespace AzToolsFramework QVariant EntityOutlinerListModel::GetEntityIcon(const AZ::EntityId& id) const { auto entityUiHandler = m_editorEntityFrameworkInterface->GetHandler(id); - QPixmap pixmap; + QIcon icon; // Retrieve the icon from the handler if (entityUiHandler != nullptr) { - pixmap = entityUiHandler->GenerateItemIcon(id); + icon = entityUiHandler->GenerateItemIcon(id); } - if (!pixmap.isNull()) + if (!icon.isNull()) { - return QIcon(pixmap); + return icon; } // If no icon was returned by the handler, use the default one. @@ -299,7 +299,7 @@ namespace AzToolsFramework if (isEditorOnly) { - return QIcon(QPixmap(QString(":/Icons/Entity_Editor_Only.svg"))); + return QIcon(QString(":/Icons/Entity_Editor_Only.svg")); } AZ::Entity* entity = nullptr; @@ -308,10 +308,10 @@ namespace AzToolsFramework if (!isInitiallyActive) { - return QIcon(QPixmap(QString(":/Icons/Entity_Not_Active.svg"))); + return QIcon(QString(":/Icons/Entity_Not_Active.svg")); } - return QIcon(QPixmap(QString(":/Icons/Entity.svg"))); + return QIcon(QString(":/Icons/Entity.svg")); } QVariant EntityOutlinerListModel::GetEntityTooltip(const AZ::EntityId& id) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp index 73a28a3edc..c75f6aa86d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.cpp @@ -41,9 +41,9 @@ namespace AzToolsFramework } } - QPixmap LevelRootUiHandler::GenerateItemIcon(AZ::EntityId /*entityId*/) const + QIcon LevelRootUiHandler::GenerateItemIcon(AZ::EntityId /*entityId*/) const { - return QPixmap(m_levelRootIconPath); + return QIcon(m_levelRootIconPath); } QString LevelRootUiHandler::GenerateItemInfoString(AZ::EntityId entityId) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h index 29bb5a7d49..6eeccfe88d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/LevelRootUiHandler.h @@ -29,7 +29,7 @@ namespace AzToolsFramework ~LevelRootUiHandler() override = default; // EditorEntityUiHandler... - QPixmap GenerateItemIcon(AZ::EntityId entityId) const override; + QIcon GenerateItemIcon(AZ::EntityId entityId) const override; QString GenerateItemInfoString(AZ::EntityId entityId) const override; bool CanToggleLockVisibility(AZ::EntityId entityId) const override; bool CanRename(AZ::EntityId entityId) const override; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp index 1a9632b0e1..fda56b79f1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.cpp @@ -81,14 +81,14 @@ namespace AzToolsFramework return tooltip; } - QPixmap PrefabUiHandler::GenerateItemIcon(AZ::EntityId entityId) const + QIcon PrefabUiHandler::GenerateItemIcon(AZ::EntityId entityId) const { if (m_prefabEditInterface->IsOwningPrefabBeingEdited(entityId)) { - return QPixmap(m_prefabEditIconPath); + return QIcon(m_prefabEditIconPath); } - return QPixmap(m_prefabIconPath); + return QIcon(m_prefabIconPath); } void PrefabUiHandler::PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h index 0d73fba049..d900fae427 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/Prefab/PrefabUiHandler.h @@ -31,7 +31,7 @@ namespace AzToolsFramework // EditorEntityUiHandler... QString GenerateItemInfoString(AZ::EntityId entityId) const override; QString GenerateItemTooltip(AZ::EntityId entityId) const override; - QPixmap GenerateItemIcon(AZ::EntityId entityId) const override; + QIcon GenerateItemIcon(AZ::EntityId entityId) const override; void PaintItemBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; void PaintDescendantBackground(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index, const QModelIndex& descendantIndex) const override; From 2382b5cbd3bcf53f83807b0160c897b5c8a6fb9a Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Tue, 14 Sep 2021 12:42:16 -0700 Subject: [PATCH 302/355] Linux fix launch project manager from editor (#4105) Signed-off-by: Steve Pham --- .../Process/ProcessWatcher_Linux.cpp | 37 +++++++++---------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp index 2d29fac73d..d2cd681012 100644 --- a/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp +++ b/Code/Framework/AzFramework/Platform/Linux/AzFramework/Process/ProcessWatcher_Linux.cpp @@ -263,21 +263,29 @@ namespace AzFramework } commandAndArgs[commandTokens.size()] = nullptr; + AZStd::vector> environmentVariablesManaged; + AZStd::vector environmentVariablesVector; char** environmentVariables = nullptr; - int numEnvironmentVars = 0; if (processLaunchInfo.m_environmentVariables) { - numEnvironmentVars = processLaunchInfo.m_environmentVariables->size(); - // Adding one more as exec expects the array to have a nullptr as the last element - environmentVariables = new char*[numEnvironmentVars + 1]; - for (int i = 0; i < numEnvironmentVars; i++) + for (const auto& envVarString : *processLaunchInfo.m_environmentVariables) { - const AZStd::string& envVarString = processLaunchInfo.m_environmentVariables->at(i); - environmentVariables[i] = new char[envVarString.size() + 1]; - environmentVariables[i][0] = '\0'; - azstrcat(environmentVariables[i], envVarString.size(), envVarString.c_str()); + auto& environmentVariable = environmentVariablesManaged.emplace_back(AZStd::make_unique(envVarString.size() + 1)); + environmentVariable[0] = '\0'; + azstrcat(environmentVariable.get(), envVarString.size() + 1, envVarString.c_str()); + environmentVariablesVector.emplace_back(environmentVariable.get()); } - environmentVariables[numEnvironmentVars] = nullptr; + // Adding one more as exec expects the array to have a nullptr as the last element + environmentVariablesVector.emplace_back(nullptr); + environmentVariables = environmentVariablesVector.data(); + } + else + { + // If no environment variables were specified, then use the current process's environment variables + // and pass it along for the execute . + extern char **environ; // Defined in unistd.h + environmentVariables = ::environ; + AZ_Assert(environmentVariables, "Environment variables for current process not available\n"); } pid_t child_pid = fork(); @@ -290,15 +298,6 @@ namespace AzFramework // Close these handles as they are only to be used by the child process processData.m_startupInfo.CloseAllHandles(); - if (processLaunchInfo.m_environmentVariables) - { - for (int i = 0; i < numEnvironmentVars; i++) - { - delete [] environmentVariables[i]; - } - delete [] environmentVariables; - } - for (int i = 0; i < commandTokens.size(); i++) { delete [] commandAndArgs[i]; From e356003fb558374b6f1a2598cfe03a3fd3a49385 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 14 Sep 2021 14:10:17 -0700 Subject: [PATCH 303/355] Fixes for VS < 17 and Android Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h | 8 ++++---- Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h | 8 ++++---- cmake/Platform/Common/MSVC/Configurations_msvc.cmake | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h b/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h index bf49546916..414b1cb3cb 100644 --- a/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h +++ b/Gems/LyShine/Code/Source/Animation/AnimSplineTrack.h @@ -326,16 +326,16 @@ public: m_defaultValue = value; } - ColorB GetCustomColor() const override + ColorB GetCustomColor() const { return m_customColor; } - void SetCustomColor(ColorB color) override + void SetCustomColor(ColorB color) { m_customColor = color; m_bCustomColorSet = true; } - bool HasCustomColor() const override + bool HasCustomColor() const { return m_bCustomColorSet; } - void ClearCustomColor() override + void ClearCustomColor() { m_bCustomColorSet = false; } static void Reflect(AZ::SerializeContext* serializeContext) {} diff --git a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h index d6f969b21d..6388c9709e 100644 --- a/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h +++ b/Gems/Maestro/Code/Source/Cinematics/AnimSplineTrack.h @@ -329,16 +329,16 @@ public: m_defaultValue = value; } - ColorB GetCustomColor() const override + ColorB GetCustomColor() const { return m_customColor; } - void SetCustomColor(ColorB color) override + void SetCustomColor(ColorB color) { m_customColor = color; m_bCustomColorSet = true; } - bool HasCustomColor() const override + bool HasCustomColor() const { return m_bCustomColorSet; } - void ClearCustomColor() override + void ClearCustomColor() { m_bCustomColorSet = false; } void SetMultiplier(float trackMultiplier) override diff --git a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake index 8885624a81..a4d8533626 100644 --- a/cmake/Platform/Common/MSVC/Configurations_msvc.cmake +++ b/cmake/Platform/Common/MSVC/Configurations_msvc.cmake @@ -141,7 +141,6 @@ endif() ly_set(LY_CXX_SYSTEM_INCLUDE_CONFIGURATION_FLAG /experimental:external # Turns on "external" headers feature for MSVC compilers /external:W0 # Set warning level in external headers to 0. This is used to suppress warnings 3rdParty libraries which uses the "system_includes" option in their json configuration - /analyze:external- # disable analysis on external headers ) if(NOT CMAKE_INCLUDE_SYSTEM_FLAG_CXX) ly_set(CMAKE_INCLUDE_SYSTEM_FLAG_CXX /external:I) From 4e8d4c0c512b33ebb8697a72ebe30e55f32f1ef2 Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Tue, 14 Sep 2021 16:15:46 -0500 Subject: [PATCH 304/355] Added a max_size function to all AZStd container style allocator functions (#4106) * Added a max_size function to all AZStd container style allocator functions The max_size functions returns the maximum value that a single contiguous allocation value returns Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the BestFitExternalMapSchema and MallocSchema GetMaxContiguousAllocationSize function Those functions now return a Max allocation size of AZ_CORE_MAX_ALLOCATOR size to indicate the maximum size for a single allocation Changed the IAllocatorAllocator::GetMaxContiguousAllocationSize function from a pure virtual function to regular virtual function Removed the left over String.cpp test to validate that the issue with the allocator::max_size() function was occuring Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- .../AzCore/AzCore/EBus/Environment.h | 2 +- .../AzCore/Memory/AllocatorOverrideShim.cpp | 5 ++ .../AzCore/Memory/AllocatorOverrideShim.h | 1 + .../Memory/BestFitExternalMapAllocator.cpp | 5 ++ .../Memory/BestFitExternalMapAllocator.h | 1 + .../Memory/BestFitExternalMapSchema.cpp | 6 ++ .../AzCore/Memory/BestFitExternalMapSchema.h | 1 + .../AzCore/AzCore/Memory/HeapSchema.cpp | 5 ++ .../AzCore/AzCore/Memory/HeapSchema.h | 1 + .../AzCore/AzCore/Memory/HphaSchema.cpp | 11 ++++ .../AzCore/AzCore/Memory/HphaSchema.h | 1 + .../AzCore/AzCore/Memory/IAllocator.h | 2 + .../AzCore/AzCore/Memory/MallocSchema.cpp | 5 ++ .../AzCore/AzCore/Memory/MallocSchema.h | 1 + Code/Framework/AzCore/AzCore/Memory/Memory.h | 11 +++- .../AzCore/AzCore/Memory/OSAllocator.h | 1 + .../Memory/OverrunDetectionAllocator.cpp | 11 ++++ .../AzCore/Memory/OverrunDetectionAllocator.h | 1 + .../AzCore/AzCore/Memory/PoolSchema.cpp | 10 +++ .../AzCore/AzCore/Memory/PoolSchema.h | 2 + .../AzCore/Memory/SimpleSchemaAllocator.h | 5 ++ .../AzCore/AzCore/Memory/SystemAllocator.h | 1 + .../AzCore/AzCore/Module/Environment.cpp | 2 +- .../AzCore/AzCore/Script/ScriptContext.cpp | 4 +- .../AzCore/AzCore/UnitTest/TestTypes.h | 5 +- .../Framework/AzCore/AzCore/std/allocator.cpp | 10 +-- Code/Framework/AzCore/AzCore/std/allocator.h | 9 +-- .../AzCore/AzCore/std/allocator_ref.h | 2 +- .../AzCore/AzCore/std/allocator_stack.h | 2 +- .../AzCore/AzCore/std/allocator_static.h | 4 +- .../AzCore/AzCore/std/containers/deque.h | 7 +-- .../AzCore/std/containers/forward_list.h | 2 +- .../AzCore/AzCore/std/containers/list.h | 8 +-- .../AzCore/AzCore/std/containers/rbtree.h | 2 +- .../AzCore/std/containers/ring_buffer.h | 10 ++- .../AzCore/AzCore/std/containers/vector.h | 3 +- .../parallel/allocator_concurrent_static.h | 4 +- .../AzCore/AzCore/std/string/string.h | 4 +- .../AzCore/Tests/AZStd/Allocators.cpp | 63 ++++++++++--------- .../Tests/AZStd/ConcurrentAllocators.cpp | 14 ++--- Code/Framework/AzCore/Tests/Memory.cpp | 2 + .../Code/MCore/Source/StaticAllocator.cpp | 2 +- .../Code/MCore/Source/StaticAllocator.h | 2 +- 43 files changed, 166 insertions(+), 84 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/EBus/Environment.h b/Code/Framework/AzCore/AzCore/EBus/Environment.h index e5cec765be..93a0f714f9 100644 --- a/Code/Framework/AzCore/AzCore/EBus/Environment.h +++ b/Code/Framework/AzCore/AzCore/EBus/Environment.h @@ -96,7 +96,7 @@ namespace AZ const char* get_name() const { return m_name; } void set_name(const char* name) { m_name = name; } - size_type get_max_size() const { return AZ_CORE_MAX_ALLOCATOR_SIZE; } + constexpr size_type max_size() const { return AZ_CORE_MAX_ALLOCATOR_SIZE; } size_type get_allocated_size() const { return 0; } bool is_lock_free() { return false; } diff --git a/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.cpp b/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.cpp index 69fbe2a519..154d59edd3 100644 --- a/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.cpp @@ -216,6 +216,11 @@ namespace AZ return m_source->GetMaxAllocationSize(); } + auto AllocatorOverrideShim::GetMaxContiguousAllocationSize() const -> size_type + { + return m_source->GetMaxContiguousAllocationSize(); + } + IAllocatorAllocate* AllocatorOverrideShim::GetSubAllocator() { return m_source->GetSubAllocator(); diff --git a/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.h b/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.h index ae3859a938..3b45b9953e 100644 --- a/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.h +++ b/Code/Framework/AzCore/AzCore/Memory/AllocatorOverrideShim.h @@ -52,6 +52,7 @@ namespace AZ size_type NumAllocatedBytes() const override; size_type Capacity() const override; size_type GetMaxAllocationSize() const override; + size_type GetMaxContiguousAllocationSize() const override; IAllocatorAllocate* GetSubAllocator() override; private: diff --git a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp index cf26c8f723..ca414df4b5 100644 --- a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.cpp @@ -188,6 +188,11 @@ BestFitExternalMapAllocator::GetMaxAllocationSize() const return m_schema->GetMaxAllocationSize(); } +auto BestFitExternalMapAllocator::GetMaxContiguousAllocationSize() const -> size_type +{ + return m_schema->GetMaxContiguousAllocationSize(); +} + //========================================================================= // GetSubAllocator // [1/28/2011] diff --git a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.h b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.h index 474619ad9f..17425625b7 100644 --- a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapAllocator.h @@ -63,6 +63,7 @@ namespace AZ size_type NumAllocatedBytes() const override; size_type Capacity() const override; size_type GetMaxAllocationSize() const override; + size_type GetMaxContiguousAllocationSize() const override; IAllocatorAllocate* GetSubAllocator() override; ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp index d94d1dfe35..715ecd221e 100644 --- a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.cpp @@ -136,6 +136,12 @@ BestFitExternalMapSchema::GetMaxAllocationSize() const return 0; } +auto BestFitExternalMapSchema::GetMaxContiguousAllocationSize() const -> size_type +{ + // Return the maximum size of any single allocation + return AZ_CORE_MAX_ALLOCATOR_SIZE; +} + //========================================================================= // GarbageCollect // [1/28/2011] diff --git a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.h b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.h index 221407421f..eaab614593 100644 --- a/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/BestFitExternalMapSchema.h @@ -57,6 +57,7 @@ namespace AZ AZ_FORCE_INLINE size_type NumAllocatedBytes() const { return m_used; } AZ_FORCE_INLINE size_type Capacity() const { return m_desc.m_memoryBlockByteSize; } size_type GetMaxAllocationSize() const; + size_type GetMaxContiguousAllocationSize() const; AZ_FORCE_INLINE IAllocatorAllocate* GetSubAllocator() const { return m_desc.m_mapAllocator; } /** diff --git a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp index 50e6a47630..aceafa1b28 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.cpp @@ -244,6 +244,11 @@ namespace AZ return maxChunk; } + auto HeapSchema::GetMaxContiguousAllocationSize() const -> size_type + { + return MAX_REQUEST; + } + AZ_FORCE_INLINE HeapSchema::size_type HeapSchema::ChunckSize(pointer_type ptr) { diff --git a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h index af3e2d9986..f6c6f98315 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/HeapSchema.h @@ -57,6 +57,7 @@ namespace AZ virtual size_type NumAllocatedBytes() const { return m_used; } virtual size_type Capacity() const { return m_capacity; } virtual size_type GetMaxAllocationSize() const; + size_type GetMaxContiguousAllocationSize() const override; virtual IAllocatorAllocate* GetSubAllocator() { return m_subAllocator; } virtual void GarbageCollect() {} diff --git a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp index f5df0dfe96..6af8f201c2 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.cpp @@ -1069,6 +1069,7 @@ namespace AZ { /// returns allocation size for the pointer if it belongs to the allocator. result is undefined if the pointer doesn't belong to the allocator. size_t AllocationSize(void* ptr); size_t GetMaxAllocationSize() const; + size_t GetMaxContiguousAllocationSize() const; size_t GetUnAllocatedMemory(bool isPrint) const; void* SystemAlloc(size_t size, size_t align); @@ -2301,6 +2302,11 @@ namespace AZ { return maxSize; } + size_t HpAllocator::GetMaxContiguousAllocationSize() const + { + return AZ_CORE_MAX_ALLOCATOR_SIZE; + } + //========================================================================= // GetUnAllocatedMemory // [9/30/2013] @@ -2677,6 +2683,11 @@ namespace AZ { return m_allocator->GetMaxAllocationSize(); } + auto HphaSchema::GetMaxContiguousAllocationSize() const -> size_type + { + return m_allocator->GetMaxContiguousAllocationSize(); + } + //========================================================================= // GetUnAllocatedMemory // [9/30/2013] diff --git a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h index fc10bcd768..0f84ca1e68 100644 --- a/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/HphaSchema.h @@ -66,6 +66,7 @@ namespace AZ virtual size_type NumAllocatedBytes() const; virtual size_type Capacity() const; virtual size_type GetMaxAllocationSize() const; + size_type GetMaxContiguousAllocationSize() const override; virtual size_type GetUnAllocatedMemory(bool isPrint = false) const; virtual IAllocatorAllocate* GetSubAllocator() { return m_desc.m_subAllocator; } diff --git a/Code/Framework/AzCore/AzCore/Memory/IAllocator.h b/Code/Framework/AzCore/AzCore/Memory/IAllocator.h index 02f08fe77f..1aa4cf70f5 100644 --- a/Code/Framework/AzCore/AzCore/Memory/IAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/IAllocator.h @@ -62,6 +62,8 @@ namespace AZ virtual size_type Capacity() const = 0; /// Returns max allocation size if possible. If not returned value is 0 virtual size_type GetMaxAllocationSize() const { return 0; } + /// Returns the maximum contiguous allocation size of a single allocation + virtual size_type GetMaxContiguousAllocationSize() const { return 0; } /** * Returns memory allocated by the allocator and available to the user for allocations. * IMPORTANT: this is not the overhead memory this is just the memory that is allocated, but not used. Example: the pool allocators diff --git a/Code/Framework/AzCore/AzCore/Memory/MallocSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/MallocSchema.cpp index 581b6f2d57..76a71e0f08 100644 --- a/Code/Framework/AzCore/AzCore/Memory/MallocSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/MallocSchema.cpp @@ -144,6 +144,11 @@ AZ::MallocSchema::size_type AZ::MallocSchema::GetMaxAllocationSize() const return 0xFFFFFFFFull; } +AZ::MallocSchema::size_type AZ::MallocSchema::GetMaxContiguousAllocationSize() const +{ + return AZ_CORE_MAX_ALLOCATOR_SIZE; +} + AZ::IAllocatorAllocate* AZ::MallocSchema::GetSubAllocator() { return nullptr; diff --git a/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h b/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h index 3a363cb069..cbf928e189 100644 --- a/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/MallocSchema.h @@ -50,6 +50,7 @@ namespace AZ virtual size_type NumAllocatedBytes() const override; virtual size_type Capacity() const override; virtual size_type GetMaxAllocationSize() const override; + virtual size_type GetMaxContiguousAllocationSize() const override; virtual IAllocatorAllocate* GetSubAllocator() override; virtual void GarbageCollect() override; diff --git a/Code/Framework/AzCore/AzCore/Memory/Memory.h b/Code/Framework/AzCore/AzCore/Memory/Memory.h index af175c7a64..d09003f3f0 100644 --- a/Code/Framework/AzCore/AzCore/Memory/Memory.h +++ b/Code/Framework/AzCore/AzCore/Memory/Memory.h @@ -839,6 +839,11 @@ namespace AZ return AZ::AllocatorInstance::Get().GetMaxAllocationSize(); } + size_type GetMaxContiguousAllocationSize() const override + { + return AZ::AllocatorInstance::Get().GetMaxContiguousAllocationSize(); + } + size_type GetUnAllocatedMemory(bool isPrint = false) const override { return AZ::AllocatorInstance::Get().GetUnAllocatedMemory(isPrint); @@ -896,7 +901,7 @@ namespace AZ } AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - size_type get_max_size() const { return AllocatorInstance::Get().GetMaxAllocationSize(); } + size_type max_size() const { return AllocatorInstance::Get().GetMaxContiguousAllocationSize(); } size_type get_allocated_size() const { return AllocatorInstance::Get().NumAllocatedBytes(); } AZ_FORCE_INLINE bool is_lock_free() { return AllocatorInstance::Get().is_lock_free(); } @@ -954,7 +959,7 @@ namespace AZ } AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - size_type get_max_size() const { return m_allocator->GetMaxAllocationSize(); } + size_type max_size() const { return m_allocator->GetMaxContiguousAllocationSize(); } size_type get_allocated_size() const { return m_allocator->NumAllocatedBytes(); } AZ_FORCE_INLINE bool operator==(const AZStdIAllocator& rhs) const { return m_allocator == rhs.m_allocator; } @@ -1006,7 +1011,7 @@ namespace AZ } constexpr const char* get_name() const { return m_name; } void set_name(const char* name) { m_name = name; } - size_type get_max_size() const { return m_allocatorFunctor().GetMaxAllocationSize(); } + size_type max_size() const { return m_allocatorFunctor().GetMaxContiguousAllocationSize(); } size_type get_allocated_size() const { return m_allocatorFunctor().NumAllocatedBytes(); } constexpr bool operator==(const AZStdFunctorAllocator& rhs) const { return m_allocatorFunctor == rhs.m_allocatorFunctor; } diff --git a/Code/Framework/AzCore/AzCore/Memory/OSAllocator.h b/Code/Framework/AzCore/AzCore/Memory/OSAllocator.h index 6154e97f38..b327cf6349 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OSAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/OSAllocator.h @@ -61,6 +61,7 @@ namespace AZ size_type NumAllocatedBytes() const override { return m_custom ? m_custom->NumAllocatedBytes() : m_numAllocatedBytes; } size_type Capacity() const override { return m_custom ? m_custom->Capacity() : AZ_CORE_MAX_ALLOCATOR_SIZE; } // custom size or unlimited size_type GetMaxAllocationSize() const override { return m_custom ? m_custom->GetMaxAllocationSize() : AZ_CORE_MAX_ALLOCATOR_SIZE; } // custom size or unlimited + size_type GetMaxContiguousAllocationSize() const override { return m_custom ? m_custom->GetMaxContiguousAllocationSize() : AZ_CORE_MAX_ALLOCATOR_SIZE; } // custom size or unlimited IAllocatorAllocate* GetSubAllocator() override { return m_custom ? m_custom : NULL; } protected: diff --git a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp index 35ad19dd9e..ed5e0febc2 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.cpp @@ -232,6 +232,7 @@ namespace AZ size_type NumAllocatedBytes() const; size_type Capacity() const; size_type GetMaxAllocationSize() const; + size_type GetMaxContiguousAllocationSize() const; IAllocatorAllocate* GetSubAllocator(); void GarbageCollect(); @@ -674,6 +675,11 @@ AZ::OverrunDetectionSchema::size_type AZ::OverrunDetectionSchemaImpl::GetMaxAllo return 0; } +auto AZ::OverrunDetectionSchemaImpl::GetMaxContiguousAllocationSize() const -> size_type +{ + return 0; +} + AZ::IAllocatorAllocate* AZ::OverrunDetectionSchemaImpl::GetSubAllocator() { return nullptr; @@ -799,6 +805,11 @@ AZ::OverrunDetectionSchema::size_type AZ::OverrunDetectionSchema::GetMaxAllocati return m_impl->GetMaxAllocationSize(); } +auto AZ::OverrunDetectionSchema::GetMaxContiguousAllocationSize() const -> size_type +{ + return m_impl->GetMaxContiguousAllocationSize(); +} + AZ::IAllocatorAllocate* AZ::OverrunDetectionSchema::GetSubAllocator() { return m_impl->GetSubAllocator(); diff --git a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h index 669fda8a04..3dffdfad56 100644 --- a/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/OverrunDetectionAllocator.h @@ -86,6 +86,7 @@ namespace AZ virtual size_type NumAllocatedBytes() const override; virtual size_type Capacity() const override; virtual size_type GetMaxAllocationSize() const override; + size_type GetMaxContiguousAllocationSize() const override; virtual IAllocatorAllocate* GetSubAllocator() override; virtual void GarbageCollect() override; diff --git a/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp b/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp index 3e71f530a0..0bef6b7d28 100644 --- a/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp +++ b/Code/Framework/AzCore/AzCore/Memory/PoolSchema.cpp @@ -707,6 +707,11 @@ PoolSchema::GarbageCollect() //m_impl->GarbageCollect(); } +auto PoolSchema::GetMaxContiguousAllocationSize() const -> size_type +{ + return m_impl->m_allocator.m_maxAllocationSize; +} + //========================================================================= // NumAllocatedBytes // [11/1/2010] @@ -1052,6 +1057,11 @@ ThreadPoolSchema::GarbageCollect() m_impl->GarbageCollect(); } +auto ThreadPoolSchema::GetMaxContiguousAllocationSize() const -> size_type +{ + return m_impl->m_maxAllocationSize; +} + //========================================================================= // NumAllocatedBytes // [11/1/2010] diff --git a/Code/Framework/AzCore/AzCore/Memory/PoolSchema.h b/Code/Framework/AzCore/AzCore/Memory/PoolSchema.h index d9c89d28bd..cfc5e3ea07 100644 --- a/Code/Framework/AzCore/AzCore/Memory/PoolSchema.h +++ b/Code/Framework/AzCore/AzCore/Memory/PoolSchema.h @@ -70,6 +70,7 @@ namespace AZ /// Return unused memory to the OS. Don't call this too often because you will force unnecessary allocations. void GarbageCollect() override; + size_type GetMaxContiguousAllocationSize() const override; size_type NumAllocatedBytes() const override; size_type Capacity() const override; IAllocatorAllocate* GetSubAllocator() override; @@ -115,6 +116,7 @@ namespace AZ /// Return unused memory to the OS. Don't call this too often because you will force unnecessary allocations. void GarbageCollect() override; + size_type GetMaxContiguousAllocationSize() const override; size_type NumAllocatedBytes() const override; size_type Capacity() const override; IAllocatorAllocate* GetSubAllocator() override; diff --git a/Code/Framework/AzCore/AzCore/Memory/SimpleSchemaAllocator.h b/Code/Framework/AzCore/AzCore/Memory/SimpleSchemaAllocator.h index e9d001aec3..5fbc890203 100644 --- a/Code/Framework/AzCore/AzCore/Memory/SimpleSchemaAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/SimpleSchemaAllocator.h @@ -179,6 +179,11 @@ namespace AZ return m_schema->GetMaxAllocationSize(); } + size_type GetMaxContiguousAllocationSize() const override + { + return m_schema->GetMaxContiguousAllocationSize(); + } + size_type GetUnAllocatedMemory(bool isPrint = false) const override { return m_schema->GetUnAllocatedMemory(isPrint); diff --git a/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.h b/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.h index 9fd5734dbb..c02ada5843 100644 --- a/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.h +++ b/Code/Framework/AzCore/AzCore/Memory/SystemAllocator.h @@ -103,6 +103,7 @@ namespace AZ size_type Capacity() const override { return m_allocator->Capacity(); } /// Keep in mind this operation will execute GarbageCollect to make sure it returns, max allocation. This function WILL be slow. size_type GetMaxAllocationSize() const override { return m_allocator->GetMaxAllocationSize(); } + size_type GetMaxContiguousAllocationSize() const override { return m_allocator->GetMaxContiguousAllocationSize(); } size_type GetUnAllocatedMemory(bool isPrint = false) const override { return m_allocator->GetUnAllocatedMemory(isPrint); } IAllocatorAllocate* GetSubAllocator() override { return m_isCustom ? m_allocator : m_allocator->GetSubAllocator(); } diff --git a/Code/Framework/AzCore/AzCore/Module/Environment.cpp b/Code/Framework/AzCore/AzCore/Module/Environment.cpp index c07b7444d4..71da948a35 100644 --- a/Code/Framework/AzCore/AzCore/Module/Environment.cpp +++ b/Code/Framework/AzCore/AzCore/Module/Environment.cpp @@ -61,7 +61,7 @@ namespace AZ const char* get_name() const { return m_name; } void set_name(const char* name) { m_name = name; } - size_type get_max_size() const { return AZ_CORE_MAX_ALLOCATOR_SIZE; } + constexpr size_type max_size() const { return AZ_CORE_MAX_ALLOCATOR_SIZE; } size_type get_allocated_size() const { return 0; } bool is_lock_free() { return false; } diff --git a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp index 5a35603d0a..b03d413507 100644 --- a/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp +++ b/Code/Framework/AzCore/AzCore/Script/ScriptContext.cpp @@ -2306,7 +2306,7 @@ LUA_API const Node* lua_getDummyNode() else // even references are stored by value as we need to convert from lua native type, i.e. there is not real reference for NativeTypes (numbers, strings, etc.) { bool usedBackupAlloc = false; - if (backupAllocator != nullptr && sizeof(T) > tempAllocator.get_max_size()) + if (backupAllocator != nullptr && sizeof(T) > AZStd::allocator_traits::max_size(tempAllocator)) { value.m_value = backupAllocator->allocate(sizeof(T), AZStd::alignment_of::value, 0); usedBackupAlloc = true; @@ -2340,7 +2340,7 @@ LUA_API const Node* lua_getDummyNode() else // it's a value type { bool usedBackupAlloc = false; - if (backupAllocator != nullptr && valueClass->m_size > tempAllocator.get_max_size()) + if (backupAllocator != nullptr && valueClass->m_size > AZStd::allocator_traits::max_size(tempAllocator)) { value.m_value = backupAllocator->allocate(valueClass->m_size, valueClass->m_alignment, 0); usedBackupAlloc = true; diff --git a/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h b/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h index c3e3f5210a..d9e3dfad1e 100644 --- a/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h +++ b/Code/Framework/AzCore/AzCore/UnitTest/TestTypes.h @@ -45,7 +45,7 @@ namespace UnitTest virtual ~AllocatorsBase() = default; - void SetupAllocator() + void SetupAllocator(const AZ::SystemAllocator::Descriptor& allocatorDesc = {}) { m_drillerManager = AZ::Debug::DrillerManager::Create(); m_drillerManager->Register(aznew AZ::Debug::MemoryDriller); @@ -54,7 +54,7 @@ namespace UnitTest // Only create the SystemAllocator if it s not ready if (!AZ::AllocatorInstance::IsReady()) { - AZ::AllocatorInstance::Create(); + AZ::AllocatorInstance::Create(allocatorDesc); m_ownsAllocator = true; } } @@ -85,6 +85,7 @@ namespace UnitTest { public: ScopedAllocatorSetupFixture() { SetupAllocator(); } + explicit ScopedAllocatorSetupFixture(const AZ::SystemAllocator::Descriptor& allocatorDesc) { SetupAllocator(allocatorDesc); } ~ScopedAllocatorSetupFixture() { TeardownAllocator(); } }; diff --git a/Code/Framework/AzCore/AzCore/std/allocator.cpp b/Code/Framework/AzCore/AzCore/std/allocator.cpp index 0aaad5a5a8..fdf1903882 100644 --- a/Code/Framework/AzCore/AzCore/std/allocator.cpp +++ b/Code/Framework/AzCore/AzCore/std/allocator.cpp @@ -40,15 +40,11 @@ namespace AZStd return AZ::AllocatorInstance::Get().Resize(ptr, newSize); } - //========================================================================= - // get_max_size - // [1/1/2008] - //========================================================================= - allocator::size_type - allocator::get_max_size() const + auto allocator::max_size() const -> size_type { - return AZ::AllocatorInstance::Get().GetMaxAllocationSize(); + return AZ::AllocatorInstance::Get().GetMaxContiguousAllocationSize(); } + //========================================================================= // get_allocated_size // [1/1/2008] diff --git a/Code/Framework/AzCore/AzCore/std/allocator.h b/Code/Framework/AzCore/AzCore/std/allocator.h index 0fee5481e2..225350e883 100644 --- a/Code/Framework/AzCore/AzCore/std/allocator.h +++ b/Code/Framework/AzCore/AzCore/std/allocator.h @@ -49,8 +49,8 @@ namespace AZStd * const char* get_name() const; * void set_name(const char* name); * - * // Returns maximum size we can allocate from this allocator. - * size_type get_max_size() const; + * // Returns theoretical maximum size of a single contiguous allocation from this allocator. + * size_type max_size() const; * size_type get_allocated_size() const; * }; * @@ -100,7 +100,8 @@ namespace AZStd pointer_type allocate(size_type byteSize, size_type alignment, int flags = 0); void deallocate(pointer_type ptr, size_type byteSize, size_type alignment); size_type resize(pointer_type ptr, size_type newSize); - size_type get_max_size() const; + // max_size actually returns the true maximum size of a single allocation + size_type max_size() const; size_type get_allocated_size() const; AZ_FORCE_INLINE bool is_lock_free() { return false; } @@ -157,7 +158,7 @@ namespace AZStd AZ_FORCE_INLINE const char* get_name() const; AZ_FORCE_INLINE void set_name(const char* name); - AZ_FORCE_INLINE size_type get_max_size() const; + AZ_FORCE_INLINE size_type max_size() const; AZ_FORCE_INLINE bool is_lock_free(); AZ_FORCE_INLINE bool is_stale_read_allowed(); diff --git a/Code/Framework/AzCore/AzCore/std/allocator_ref.h b/Code/Framework/AzCore/AzCore/std/allocator_ref.h index 659ee0cc8f..62a3cf68de 100644 --- a/Code/Framework/AzCore/AzCore/std/allocator_ref.h +++ b/Code/Framework/AzCore/AzCore/std/allocator_ref.h @@ -41,7 +41,7 @@ namespace AZStd AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - AZ_FORCE_INLINE size_type get_max_size() const { return m_allocator->get_max_size(); } + constexpr size_type max_size() const { return m_allocator->max_size(); } AZ_FORCE_INLINE size_type get_allocated_size() const { return m_allocator->get_allocated_size(); } diff --git a/Code/Framework/AzCore/AzCore/std/allocator_stack.h b/Code/Framework/AzCore/AzCore/std/allocator_stack.h index 202e62bd0f..d8546bfd18 100644 --- a/Code/Framework/AzCore/AzCore/std/allocator_stack.h +++ b/Code/Framework/AzCore/AzCore/std/allocator_stack.h @@ -59,7 +59,7 @@ namespace AZStd AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - AZ_FORCE_INLINE size_type get_max_size() const { return m_size - (m_freeData - m_data); } + constexpr size_type max_size() const { return m_size; } AZ_FORCE_INLINE size_type get_allocated_size() const { return m_freeData - m_data; } pointer_type allocate(size_type byteSize, size_type alignment, int flags = 0) diff --git a/Code/Framework/AzCore/AzCore/std/allocator_static.h b/Code/Framework/AzCore/AzCore/std/allocator_static.h index 0c079eaa9d..7f793c6d6b 100644 --- a/Code/Framework/AzCore/AzCore/std/allocator_static.h +++ b/Code/Framework/AzCore/AzCore/std/allocator_static.h @@ -63,7 +63,7 @@ namespace AZStd AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - AZ_FORCE_INLINE size_type get_max_size() const { return Size - (m_freeData - reinterpret_cast(&m_data)); } + constexpr size_type max_size() const { return Size; } AZ_FORCE_INLINE size_type get_allocated_size() const { return m_freeData - reinterpret_cast(&m_data); } pointer_type allocate(size_type byteSize, size_type alignment, int flags = 0) @@ -190,7 +190,7 @@ namespace AZStd AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - AZ_FORCE_INLINE size_type get_max_size() const { return (NumNodes - m_numOfAllocatedNodes) * sizeof(Node); } + constexpr size_type max_size() const { return NumNodes * sizeof(Node); } AZ_FORCE_INLINE size_type get_allocated_size() const { return m_numOfAllocatedNodes * sizeof(Node); } inline Node* allocate() diff --git a/Code/Framework/AzCore/AzCore/std/containers/deque.h b/Code/Framework/AzCore/AzCore/std/containers/deque.h index 215845a8f4..db585e0ec9 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/deque.h +++ b/Code/Framework/AzCore/AzCore/std/containers/deque.h @@ -6,11 +6,10 @@ * */ #pragma once -#ifndef AZSTD_DEQUE_H -#define AZSTD_DEQUE_H 1 #include +#include #include #include #include @@ -350,7 +349,7 @@ namespace AZStd } AZ_FORCE_INLINE size_type size() const { return m_size; } - AZ_FORCE_INLINE size_type max_size() const { return m_allocator.get_max_size() / sizeof(block_node_type); } + AZ_FORCE_INLINE size_type max_size() const { return AZStd::allocator_traits::max_size(m_allocator) / sizeof(block_node_type); } AZ_FORCE_INLINE bool empty() const { return m_size == 0; } AZ_FORCE_INLINE const_reference at(size_type offset) const { return *const_iterator(AZSTD_CHECKED_ITERATOR_2(const_iterator_impl, m_firstOffset + offset, this)); } @@ -1243,5 +1242,3 @@ namespace AZStd return removedCount; } } - -#endif // AZSTD_DEQUE_H diff --git a/Code/Framework/AzCore/AzCore/std/containers/forward_list.h b/Code/Framework/AzCore/AzCore/std/containers/forward_list.h index c311991ee3..407d65ffa9 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/forward_list.h +++ b/Code/Framework/AzCore/AzCore/std/containers/forward_list.h @@ -286,7 +286,7 @@ namespace AZStd } AZ_FORCE_INLINE size_type size() const { return m_numElements; } - AZ_FORCE_INLINE size_type max_size() const { return m_allocator.max_size() / sizeof(node_type); } + AZ_FORCE_INLINE size_type max_size() const { return AZStd::allocator_traits::max_size(m_allocator) / sizeof(node_type); } AZ_FORCE_INLINE bool empty() const { return (m_numElements == 0); } AZ_FORCE_INLINE iterator begin() { return iterator(AZSTD_CHECKED_ITERATOR(iterator_impl, m_head.m_next)); } diff --git a/Code/Framework/AzCore/AzCore/std/containers/list.h b/Code/Framework/AzCore/AzCore/std/containers/list.h index 124d8b7d7c..60d2977749 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/list.h +++ b/Code/Framework/AzCore/AzCore/std/containers/list.h @@ -5,11 +5,11 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#ifndef AZSTD_LIST_H -#define AZSTD_LIST_H 1 + #pragma once #include +#include #include #include #include @@ -316,7 +316,7 @@ namespace AZStd } AZ_FORCE_INLINE size_type size() const { return m_numElements; } - AZ_FORCE_INLINE size_type max_size() const { return m_allocator.max_size() / sizeof(node_type); } + AZ_FORCE_INLINE size_type max_size() const { return AZStd::allocator_traits::max_size(m_allocator) / sizeof(node_type); } AZ_FORCE_INLINE bool empty() const { return (m_numElements == 0); } AZ_FORCE_INLINE iterator begin() { return iterator(AZSTD_CHECKED_ITERATOR(iterator_impl, m_head.m_next)); } @@ -1346,5 +1346,3 @@ namespace AZStd return container.remove_if(predicate); } } - -#endif // AZSTD_LIST_H diff --git a/Code/Framework/AzCore/AzCore/std/containers/rbtree.h b/Code/Framework/AzCore/AzCore/std/containers/rbtree.h index c8f0883eaf..fd268f4936 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/rbtree.h +++ b/Code/Framework/AzCore/AzCore/std/containers/rbtree.h @@ -484,7 +484,7 @@ namespace AZStd AZ_FORCE_INLINE bool empty() const { return m_numElements == 0; } AZ_FORCE_INLINE size_type size() const { return m_numElements; } - AZ_FORCE_INLINE size_type max_size() const { return m_allocator.max_size() / sizeof(node_type); } + AZ_FORCE_INLINE size_type max_size() const { return AZStd::allocator_traits::max_size(m_allocator) / sizeof(node_type); } rbtree(this_type&& rhs) : m_numElements(0) // it will be set during swap diff --git a/Code/Framework/AzCore/AzCore/std/containers/ring_buffer.h b/Code/Framework/AzCore/AzCore/std/containers/ring_buffer.h index 7e84124958..d8c3c6ecda 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/ring_buffer.h +++ b/Code/Framework/AzCore/AzCore/std/containers/ring_buffer.h @@ -5,10 +5,11 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#ifndef AZSTD_RINGBUFFER_H -#define AZSTD_RINGBUFFER_H 1 + +#pragma once #include +#include #include #include #include @@ -416,7 +417,7 @@ namespace AZStd } AZ_FORCE_INLINE size_type size() const { return m_size; } - AZ_FORCE_INLINE size_type max_size() const { return m_allocator.max_size() / sizeof(node_type); } + AZ_FORCE_INLINE size_type max_size() const { return AZStd::allocator_traits::max_size(m_allocator) / sizeof(node_type); } AZ_FORCE_INLINE bool empty() const { return m_size == 0; } AZ_FORCE_INLINE bool full() const { return size_type(m_end - m_buff) == m_size; } AZ_FORCE_INLINE size_type free() const { return size_type(m_end - m_buff) - m_size; } @@ -1240,6 +1241,3 @@ namespace AZStd lhs.swap(rhs); } } - -#endif // AZSTD_RINGBUFFER_H -#pragma once diff --git a/Code/Framework/AzCore/AzCore/std/containers/vector.h b/Code/Framework/AzCore/AzCore/std/containers/vector.h index bf02527d77..48de12a5b4 100644 --- a/Code/Framework/AzCore/AzCore/std/containers/vector.h +++ b/Code/Framework/AzCore/AzCore/std/containers/vector.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -431,7 +432,7 @@ namespace AZStd } AZ_FORCE_INLINE size_type size() const { return m_last - m_start; } - AZ_FORCE_INLINE size_type max_size() const { return m_allocator.get_max_size() / sizeof(node_type); } + AZ_FORCE_INLINE size_type max_size() const { return AZStd::allocator_traits::max_size(m_allocator) / sizeof(node_type); } AZ_FORCE_INLINE bool empty() const { return m_start == m_last; } void reserve(size_type numElements) diff --git a/Code/Framework/AzCore/AzCore/std/parallel/allocator_concurrent_static.h b/Code/Framework/AzCore/AzCore/std/parallel/allocator_concurrent_static.h index 72c687beab..b9cd5207dd 100644 --- a/Code/Framework/AzCore/AzCore/std/parallel/allocator_concurrent_static.h +++ b/Code/Framework/AzCore/AzCore/std/parallel/allocator_concurrent_static.h @@ -22,7 +22,7 @@ namespace AZStd * Internally the buffer is allocated using aligned_storage. * \note only allocate/deallocate are thread safe. * reset, leak_before_destroy and comparison operators are not thread safe. - * get_max_size and get_allocated_size are thread safe but the returned value is not perfectly in + * get_allocated_size is thread safe but the returned value is not perfectly in * sync on the actual number of allocations (the number of allocations is incremented before the * allocation happens and decremented after the allocation happens, trying to give a conservative * number) @@ -71,7 +71,7 @@ namespace AZStd AZ_FORCE_INLINE const char* get_name() const { return m_name; } AZ_FORCE_INLINE void set_name(const char* name) { m_name = name; } - AZ_FORCE_INLINE size_type get_max_size() const { return (NumNodes - m_numOfAllocatedNodes.load(AZStd::memory_order_relaxed)) * sizeof(Node); } + constexpr size_type max_size() const { return NumNodes * sizeof(Node); } AZ_FORCE_INLINE size_type get_allocated_size() const { return m_numOfAllocatedNodes.load(AZStd::memory_order_relaxed) * sizeof(Node); } inline Node* allocate() diff --git a/Code/Framework/AzCore/AzCore/std/string/string.h b/Code/Framework/AzCore/AzCore/std/string/string.h index ad3546ab09..c02c6805a1 100644 --- a/Code/Framework/AzCore/AzCore/std/string/string.h +++ b/Code/Framework/AzCore/AzCore/std/string/string.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -862,8 +863,7 @@ namespace AZStd inline size_type max_size() const { // return maximum possible length of sequence - size_type num = m_allocator.get_max_size(); - return (num <= 1 ? 1 : num - 1); + return AZStd::allocator_traits::max_size(m_allocator) / sizeof(value_type); } inline void resize(size_type newSize) diff --git a/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp b/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp index 6b82c642d5..8b5d1494fc 100644 --- a/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/Allocators.cpp @@ -122,8 +122,15 @@ namespace UnitTest TEST_F(AllocatorDefaultTest, AllocatorTraitsMaxSizeCompilesWithoutErrors) { - using AZStdAllocatorTraits = AZStd::allocator_traits; - AZStd::allocator testAllocator("trait allocator"); + struct AllocatorWithGetMaxSize + : AZStd::allocator + { + using AZStd::allocator::allocator; + size_t get_max_size() { return max_size(); } + }; + + using AZStdAllocatorTraits = AZStd::allocator_traits; + AllocatorWithGetMaxSize testAllocator("trait allocator"); typename AZStdAllocatorTraits::size_type maxSize = AZStdAllocatorTraits::max_size(testAllocator); EXPECT_EQ(testAllocator.get_max_size(), maxSize); } @@ -149,32 +156,32 @@ namespace UnitTest myalloc.set_name(newName); AZ_TEST_ASSERT(strcmp(myalloc.get_name(), newName) == 0); - AZ_TEST_ASSERT(myalloc.get_max_size() == AZStd::size_t(bufferSize)); + EXPECT_EQ(bufferSize, myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); buffer_alloc_type::pointer_type data = myalloc.allocate(100, 1); AZ_TEST_ASSERT(data != nullptr); - AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize - 100); + EXPECT_EQ(bufferSize - 100, myalloc.max_size() - myalloc.get_allocated_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 100); myalloc.deallocate(data, 100, 1); // we can free the last allocation only - AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize); + EXPECT_EQ(bufferSize, myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); data = myalloc.allocate(100, 1); myalloc.allocate(3, 1); myalloc.deallocate(data); // can't free allocation which is not the last. - AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize - 103); + EXPECT_EQ(bufferSize - 103, myalloc.max_size() - myalloc.get_allocated_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 103); myalloc.reset(); - AZ_TEST_ASSERT(myalloc.get_max_size() == AZStd::size_t(bufferSize)); + EXPECT_EQ(bufferSize, myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); data = myalloc.allocate(50, 64); AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(((AZStd::size_t)data & 63) == 0); - AZ_TEST_ASSERT(myalloc.get_max_size() <= bufferSize - 50); + EXPECT_LE(myalloc.max_size() - myalloc.get_allocated_size(), bufferSize - 50); AZ_TEST_ASSERT(myalloc.get_allocated_size() >= 50); buffer_alloc_type myalloc2; @@ -194,28 +201,28 @@ namespace UnitTest myalloc.set_name(newName); AZ_TEST_ASSERT(strcmp(myalloc.get_name(), newName) == 0); - AZ_TEST_ASSERT(myalloc.get_max_size() == sizeof(int) * numNodes); + EXPECT_EQ(numNodes * sizeof(int), myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); int* data = reinterpret_cast(myalloc.allocate(sizeof(int), 1)); AZ_TEST_ASSERT(data != nullptr); - AZ_TEST_ASSERT(myalloc.get_max_size() == (numNodes - 1) * sizeof(int)); + EXPECT_EQ((numNodes - 1) * sizeof(int), myalloc.max_size() - myalloc.get_allocated_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == sizeof(int)); myalloc.deallocate(data, sizeof(int), 1); - AZ_TEST_ASSERT(myalloc.get_max_size() == sizeof(int) * numNodes); + EXPECT_EQ(numNodes * sizeof(int), myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); for (int i = 0; i < numNodes; ++i) { data = reinterpret_cast(myalloc.allocate(sizeof(int), 1)); AZ_TEST_ASSERT(data != nullptr); - AZ_TEST_ASSERT(myalloc.get_max_size() == (numNodes - (i + 1)) * sizeof(int)); + EXPECT_EQ((numNodes - (i + 1)) * sizeof(int), myalloc.max_size() - myalloc.get_allocated_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == (i + 1) * sizeof(int)); } myalloc.reset(); - AZ_TEST_ASSERT(myalloc.get_max_size() == numNodes * sizeof(int)); + EXPECT_EQ(numNodes * sizeof(int), myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); AZ_TEST_ASSERT(myalloc == myalloc); @@ -233,7 +240,7 @@ namespace UnitTest AZ_TEST_ASSERT(aligned_data != nullptr); AZ_TEST_ASSERT(((AZStd::size_t)aligned_data & (dataAlignment - 1)) == 0); - AZ_TEST_ASSERT(myaligned_pool.get_max_size() == (numNodes - 1) * sizeof(aligned_int_type)); + EXPECT_EQ((numNodes - 1) * sizeof(aligned_int_type), myaligned_pool.max_size() - myaligned_pool.get_allocated_size()); AZ_TEST_ASSERT(myaligned_pool.get_allocated_size() == sizeof(aligned_int_type)); myaligned_pool.deallocate(aligned_data, sizeof(aligned_int_type), dataAlignment); // Make sure we free what we have allocated. @@ -268,32 +275,32 @@ namespace UnitTest ref_allocator_type::pointer_type data1 = ref_allocator1.allocate(10, 1); AZ_TEST_ASSERT(data1 != nullptr); - AZ_TEST_ASSERT(ref_allocator1.get_max_size() == bufferSize - 10); + EXPECT_EQ(bufferSize - 10, ref_allocator1.max_size() - ref_allocator1.get_allocated_size()); AZ_TEST_ASSERT(ref_allocator1.get_allocated_size() == 10); - AZ_TEST_ASSERT(shared_allocator.get_max_size() == bufferSize - 10); + EXPECT_EQ(bufferSize - 10, shared_allocator.max_size() - shared_allocator.get_allocated_size()); AZ_TEST_ASSERT(shared_allocator.get_allocated_size() == 10); ref_allocator_type::pointer_type data2 = ref_allocator2.allocate(10, 1); AZ_TEST_ASSERT(data2 != nullptr); - AZ_TEST_ASSERT(ref_allocator2.get_max_size() <= bufferSize - 20); + EXPECT_LE(ref_allocator2.max_size() - ref_allocator2.get_allocated_size(), bufferSize - 20); AZ_TEST_ASSERT(ref_allocator2.get_allocated_size() >= 20); - AZ_TEST_ASSERT(shared_allocator.get_max_size() <= bufferSize - 20); + EXPECT_LE(shared_allocator.max_size() - shared_allocator.get_allocated_size(), bufferSize - 20); AZ_TEST_ASSERT(shared_allocator.get_allocated_size() >= 20); shared_allocator.reset(); data1 = ref_allocator1.allocate(10, 32); AZ_TEST_ASSERT(data1 != nullptr); - AZ_TEST_ASSERT(ref_allocator1.get_max_size() <= bufferSize - 10); + EXPECT_LE(ref_allocator1.max_size() - ref_allocator1.get_allocated_size(), bufferSize - 10); AZ_TEST_ASSERT(ref_allocator1.get_allocated_size() >= 10); - AZ_TEST_ASSERT(shared_allocator.get_max_size() <= bufferSize - 10); + EXPECT_LE(shared_allocator.max_size() - shared_allocator.get_allocated_size(), bufferSize - 10); AZ_TEST_ASSERT(shared_allocator.get_allocated_size() >= 10); data2 = ref_allocator2.allocate(10, 32); AZ_TEST_ASSERT(data2 != nullptr); - AZ_TEST_ASSERT(ref_allocator1.get_max_size() <= bufferSize - 20); + EXPECT_LE(ref_allocator1.max_size() - ref_allocator1.get_allocated_size(), bufferSize - 20); AZ_TEST_ASSERT(ref_allocator1.get_allocated_size() >= 20); - AZ_TEST_ASSERT(shared_allocator.get_max_size() <= bufferSize - 20); + EXPECT_LE(shared_allocator.max_size() - shared_allocator.get_allocated_size(), bufferSize - 20); AZ_TEST_ASSERT(shared_allocator.get_allocated_size() >= 20); AZ_TEST_ASSERT(ref_allocator1 == ref_allocator2); @@ -312,31 +319,31 @@ namespace UnitTest myalloc.set_name(newName); AZ_TEST_ASSERT(strcmp(myalloc.get_name(), newName) == 0); - AZ_TEST_ASSERT(myalloc.get_max_size() == AZStd::size_t(bufferSize)); + EXPECT_EQ(bufferSize, myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); stack_allocator::pointer_type data = myalloc.allocate(100, 1); AZ_TEST_ASSERT(data != nullptr); - AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize - 100); + EXPECT_EQ(bufferSize - 100, myalloc.max_size() - myalloc.get_allocated_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 100); myalloc.deallocate(data, 100, 1); // this allocator doesn't free data - AZ_TEST_ASSERT(myalloc.get_max_size() == bufferSize - 100); + EXPECT_EQ(bufferSize - 100, myalloc.max_size() - myalloc.get_allocated_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 100); myalloc.reset(); - AZ_TEST_ASSERT(myalloc.get_max_size() == AZStd::size_t(bufferSize)); + EXPECT_EQ(bufferSize, myalloc.max_size()); AZ_TEST_ASSERT(myalloc.get_allocated_size() == 0); data = myalloc.allocate(50, 64); AZ_TEST_ASSERT(data != nullptr); AZ_TEST_ASSERT(((AZStd::size_t)data & 63) == 0); - AZ_TEST_ASSERT(myalloc.get_max_size() <= bufferSize - 50); + EXPECT_LE(myalloc.max_size() - myalloc.get_allocated_size(), bufferSize - 50); AZ_TEST_ASSERT(myalloc.get_allocated_size() >= 50); AZ_STACK_ALLOCATOR(myalloc2, 200); // test the macro declaration - AZ_TEST_ASSERT(myalloc2.get_max_size() == 200); + EXPECT_EQ(200, myalloc2.max_size() ); AZ_TEST_ASSERT(myalloc == myalloc); AZ_TEST_ASSERT((myalloc2 != myalloc)); diff --git a/Code/Framework/AzCore/Tests/AZStd/ConcurrentAllocators.cpp b/Code/Framework/AzCore/Tests/AZStd/ConcurrentAllocators.cpp index 5be17a75e2..86ac22bfc9 100644 --- a/Code/Framework/AzCore/Tests/AZStd/ConcurrentAllocators.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/ConcurrentAllocators.cpp @@ -49,7 +49,7 @@ namespace UnitTest const char newName[] = "My new test allocator"; myalloc.set_name(newName); EXPECT_EQ(0, strcmp(myalloc.get_name(), newName)); - EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * s_allocatorCapacity, myalloc.get_max_size()); + EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * s_allocatorCapacity, myalloc.max_size()); } } @@ -61,10 +61,10 @@ namespace UnitTest typename TestFixture::allocator_type::pointer_type data = myalloc.allocate(); EXPECT_NE(nullptr, data); EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type), myalloc.get_allocated_size()); - EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * (s_allocatorCapacity - 1), myalloc.get_max_size()); + EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * (s_allocatorCapacity - 1), myalloc.max_size() - myalloc.get_allocated_size()); myalloc.deallocate(data); EXPECT_EQ(0, myalloc.get_allocated_size()); - EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * s_allocatorCapacity, myalloc.get_max_size()); + EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * s_allocatorCapacity, myalloc.max_size()); } TYPED_TEST(ConcurrentAllocatorTestFixture, MultipleAllocateDeallocate) @@ -84,19 +84,19 @@ namespace UnitTest EXPECT_EQ(dataSize, dataSet.size()); dataSet.clear(); EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * dataSize, myalloc.get_allocated_size()); - EXPECT_EQ((s_allocatorCapacity - dataSize) * sizeof(typename TestFixture::allocator_type::value_type), myalloc.get_max_size()); + EXPECT_EQ((s_allocatorCapacity - dataSize) * sizeof(typename TestFixture::allocator_type::value_type), myalloc.max_size() - myalloc.get_allocated_size()); for (size_t i = 0; i < dataSize; i += 2) { myalloc.deallocate(data[i]); } EXPECT_EQ(sizeof(typename TestFixture::allocator_type::value_type) * (dataSize / 2), myalloc.get_allocated_size()); - EXPECT_EQ((s_allocatorCapacity - dataSize / 2) * sizeof(typename TestFixture::allocator_type::value_type), myalloc.get_max_size()); + EXPECT_EQ((s_allocatorCapacity - dataSize / 2) * sizeof(typename TestFixture::allocator_type::value_type), myalloc.max_size() - myalloc.get_allocated_size()); for (size_t i = 1; i < dataSize; i += 2) { myalloc.deallocate(data[i]); } EXPECT_EQ(0, myalloc.get_allocated_size()); - EXPECT_EQ(s_allocatorCapacity * sizeof(typename TestFixture::allocator_type::value_type), myalloc.get_max_size()); + EXPECT_EQ(s_allocatorCapacity * sizeof(typename TestFixture::allocator_type::value_type), myalloc.max_size()); } TYPED_TEST(ConcurrentAllocatorTestFixture, ConcurrentAllocateoDeallocate) @@ -159,7 +159,7 @@ namespace UnitTest EXPECT_NE(nullptr, aligned_data); EXPECT_EQ(0, ((AZStd::size_t)aligned_data & (dataAlignment - 1))); - EXPECT_EQ((s_allocatorCapacity - 1) * sizeof(aligned_int_type), myaligned_pool.get_max_size()); + EXPECT_EQ((s_allocatorCapacity - 1) * sizeof(aligned_int_type), myaligned_pool.max_size() - myaligned_pool.get_allocated_size()); EXPECT_EQ(sizeof(aligned_int_type), myaligned_pool.get_allocated_size()); myaligned_pool.deallocate(aligned_data, sizeof(aligned_int_type), dataAlignment); // Make sure we free what we have allocated. diff --git a/Code/Framework/AzCore/Tests/Memory.cpp b/Code/Framework/AzCore/Tests/Memory.cpp index 611af827d2..eb854050b6 100644 --- a/Code/Framework/AzCore/Tests/Memory.cpp +++ b/Code/Framework/AzCore/Tests/Memory.cpp @@ -1179,6 +1179,8 @@ namespace UnitTest size_type Capacity() const override { return 1 * 1024 * 1024 * 1024; } /// Returns max allocation size if possible. If not returned value is 0 size_type GetMaxAllocationSize() const override { return 1 * 1024 * 1024 * 1024; } + /// Returns max allocation size of a single contiguous allocation + size_type GetMaxContiguousAllocationSize() const override { return 1 * 1024 * 1024 * 1024; } /// Returns a pointer to a sub-allocator or NULL. IAllocatorAllocate* GetSubAllocator() override { return NULL; } }; diff --git a/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.cpp b/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.cpp index dfb397a02c..35faa74b19 100644 --- a/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.cpp +++ b/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.cpp @@ -39,7 +39,7 @@ namespace MCore return 0; } - StaticAllocator::size_type StaticAllocator::get_max_size() const + StaticAllocator::size_type StaticAllocator::max_size() const { return 0; } diff --git a/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.h b/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.h index d3b1c68855..50d8dac04c 100644 --- a/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.h +++ b/Gems/EMotionFX/Code/MCore/Source/StaticAllocator.h @@ -22,7 +22,7 @@ namespace MCore StaticAllocator::size_type resize(pointer_type ptr, size_type newSize); - StaticAllocator::size_type get_max_size() const; + StaticAllocator::size_type max_size() const; StaticAllocator::size_type get_allocated_size() const; }; From 2c066a81daec45277246757ec8be7fd5dfc068e4 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:11:11 -0700 Subject: [PATCH 305/355] Adds support for creating an SDK layout from a Monolithic build (#4097) Adds support for creating an SDK layout from a Monolithic build and have the same install prefix used between monolithic and non-monolithic Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/Install_common.cmake | 96 +++++++++++++++------- cmake/Platform/Mac/Install_mac.cmake | 10 +-- cmake/install/ConfigurationTypes.cmake | 11 ++- cmake/install/InstalledTarget.in | 2 +- 4 files changed, 82 insertions(+), 37 deletions(-) diff --git a/cmake/Platform/Common/Install_common.cmake b/cmake/Platform/Common/Install_common.cmake index 86f46a6e0b..fdd3256d78 100644 --- a/cmake/Platform/Common/Install_common.cmake +++ b/cmake/Platform/Common/Install_common.cmake @@ -23,12 +23,12 @@ ly_set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME Core) cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory) cmake_path(RELATIVE_PATH CMAKE_LIBRARY_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE library_output_directory) -# Anywhere CMAKE_INSTALL_PREFIX is used, it has to be escaped so it is baked into the cmake_install.cmake script instead -# of baking the path. This is needed so `cmake --install --prefix ` works regardless of the CMAKE_INSTALL_PREFIX -# used to generate the solution. -# CMAKE_INSTALL_PREFIX is still used when building the INSTALL target -set(install_output_folder "\${CMAKE_INSTALL_PREFIX}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/$") +if(LY_MONOLITHIC_GAME) + set(LY_BUILD_PERMUTATION Monolithic) +else() + set(LY_BUILD_PERMUTATION Default) +endif() #! ly_setup_target: Setup the data needed to re-create the cmake target commands for a single target function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_target_source_dir) @@ -91,6 +91,10 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar cmake_path(RELATIVE_PATH target_library_output_directory BASE_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} OUTPUT_VARIABLE target_library_output_subdirectory) endif() + cmake_path(APPEND archive_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}") + cmake_path(APPEND library_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}") + cmake_path(APPEND runtime_output_directory "${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}") + if(COMMAND ly_install_target_override) # Mac needs special handling because of a cmake issue ly_install_target_override(TARGET ${TARGET_NAME} @@ -104,18 +108,18 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar install( TARGETS ${TARGET_NAME} ARCHIVE - DESTINATION ${archive_output_directory}/${PAL_PLATFORM_NAME}/$ + DESTINATION ${archive_output_directory} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} LIBRARY - DESTINATION ${library_output_directory}/${PAL_PLATFORM_NAME}/$/${target_library_output_subdirectory} + DESTINATION ${library_output_directory}/${target_library_output_subdirectory} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} RUNTIME - DESTINATION ${runtime_output_directory}/${PAL_PLATFORM_NAME}/$/${target_runtime_output_subdirectory} + DESTINATION ${runtime_output_directory}/${target_runtime_output_subdirectory} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) endif() - # CMakeLists.txt file + # CMakeLists.txt related files string(REGEX MATCH "(.*)::(.*)$" match ${ALIAS_TARGET_NAME}) if(match) set(NAMESPACE_PLACEHOLDER "NAMESPACE ${CMAKE_MATCH_1}") @@ -140,7 +144,7 @@ function(ly_setup_target OUTPUT_CONFIGURED_TARGET ALIAS_TARGET_NAME absolute_tar if(TARGET_TYPE_PLACEHOLDER IN_LIST GEM_LIBRARY_TYPES) get_target_property(gem_module ${TARGET_NAME} GEM_MODULE) if(gem_module) - set(TARGET_TYPE_PLACEHOLDER "GEM_MODULE") + string(PREPEND TARGET_TYPE_PLACEHOLDER "GEM_") endif() endif() @@ -222,32 +226,32 @@ set_target_properties(${RUN_TARGET_NAME} PROPERTIES ) endif() - # Config file + # Config files set(target_file_contents "# Generated by O3DE install\n\n") if(NOT target_type STREQUAL INTERFACE_LIBRARY) unset(target_location) set(runtime_types EXECUTABLE APPLICATION) if(target_type IN_LIST runtime_types) - set(target_location "\${LY_ROOT_FOLDER}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/$/${target_runtime_output_subdirectory}/$") + set(target_location "\${LY_ROOT_FOLDER}/${runtime_output_directory}/${target_runtime_output_subdirectory}/$") elseif(target_type STREQUAL MODULE_LIBRARY) - set(target_location "\${LY_ROOT_FOLDER}/${library_output_directory}/${PAL_PLATFORM_NAME}/$/${target_library_output_subdirectory}/$") + set(target_location "\${LY_ROOT_FOLDER}/${library_output_directory}/${target_library_output_subdirectory}/$") elseif(target_type STREQUAL SHARED_LIBRARY) string(APPEND target_file_contents "set_property(TARGET ${NAME_PLACEHOLDER} APPEND_STRING PROPERTY IMPORTED_IMPLIB - $<$$:\"\${LY_ROOT_FOLDER}/${archive_output_directory}/${PAL_PLATFORM_NAME}/$/$\"$ + $<$$:\"\${LY_ROOT_FOLDER}/${archive_output_directory}/$\"$ ) ") string(APPEND target_file_contents "set_property(TARGET ${NAME_PLACEHOLDER} PROPERTY IMPORTED_IMPLIB_$> - \"\${LY_ROOT_FOLDER}/${archive_output_directory}/${PAL_PLATFORM_NAME}/$/$\" + \"\${LY_ROOT_FOLDER}/${archive_output_directory}/$\" ) ") - set(target_location "\${LY_ROOT_FOLDER}/${library_output_directory}/${PAL_PLATFORM_NAME}/$/${target_library_output_subdirectory}/$") + set(target_location "\${LY_ROOT_FOLDER}/${library_output_directory}/${target_library_output_subdirectory}/$") else() # STATIC_LIBRARY, OBJECT_LIBRARY, INTERFACE_LIBRARY - set(target_location "\${LY_ROOT_FOLDER}/${archive_output_directory}/${PAL_PLATFORM_NAME}/$/$") + set(target_location "\${LY_ROOT_FOLDER}/${archive_output_directory}/$") endif() if(target_location) @@ -265,9 +269,9 @@ set_property(TARGET ${NAME_PLACEHOLDER} endif() set(target_install_source_dir ${CMAKE_CURRENT_BINARY_DIR}/install/${relative_target_source_dir}) - file(GENERATE OUTPUT "${target_install_source_dir}/${NAME_PLACEHOLDER}_$.cmake" CONTENT "${target_file_contents}") - install(FILES "${target_install_source_dir}/${NAME_PLACEHOLDER}_$.cmake" - DESTINATION ${relative_target_source_dir} + file(GENERATE OUTPUT "${target_install_source_dir}/Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION}/${NAME_PLACEHOLDER}_$.cmake" CONTENT "${target_file_contents}") + install(FILES "${target_install_source_dir}/Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION}/${NAME_PLACEHOLDER}_$.cmake" + DESTINATION ${relative_target_source_dir}/Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) @@ -299,16 +303,44 @@ function(ly_setup_subdirectory absolute_target_source_dir) string(APPEND all_configured_targets "${configured_target}") endforeach() + # Initialize the target install source directory to path underneath the current binary directory + set(target_install_source_dir "${CMAKE_CURRENT_BINARY_DIR}/install/${relative_target_source_dir}") + + ly_file_read(${LY_ROOT_FOLDER}/cmake/install/Copyright.in cmake_copyright_comment) + + # 1. Create the base CMakeLists.txt that will just include a cmake file per platform + file(CONFIGURE OUTPUT "${target_install_source_dir}/CMakeLists.txt" CONTENT [[ +@cmake_copyright_comment@ +include(Platform/${PAL_PLATFORM_NAME}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake) +]] @ONLY) + install(FILES "${target_install_source_dir}/CMakeLists.txt" + DESTINATION ${relative_target_source_dir} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) + + # 2. For this platform file, create a Platform/${PAL_PLATFORM_NAME}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake file + # that will include different configuration permutations (e.g. monolithic vs non-monolithic) + file(CONFIGURE OUTPUT "${target_install_source_dir}/Platform/${PAL_PLATFORM_NAME}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake" CONTENT [[ +@cmake_copyright_comment@ +if(LY_MONOLITHIC_GAME) + include(Platform/${PAL_PLATFORM_NAME}/Monolithic/permutation.cmake) +else() + include(Platform/${PAL_PLATFORM_NAME}/Default/permutation.cmake) +endif() +]]) + install(FILES "${target_install_source_dir}/Platform/${PAL_PLATFORM_NAME}/platform_${PAL_PLATFORM_NAME_LOWERCASE}.cmake" + DESTINATION ${relative_target_source_dir}/Platform/${PAL_PLATFORM_NAME} + COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} + ) + + # 3. For this configuration permutation, generate a Platform/${PAL_PLATFORM_NAME}/${permutation}/permutation.cmake + # that will declare the target and configure it ly_setup_subdirectory_create_alias("${absolute_target_source_dir}" CREATE_ALIASES_PLACEHOLDER) ly_setup_subdirectory_set_gem_variant_to_load("${absolute_target_source_dir}" GEM_VARIANT_TO_LOAD_PLACEHOLDER) ly_setup_subdirectory_enable_gems("${absolute_target_source_dir}" ENABLE_GEMS_PLACEHOLDER) - ly_file_read(${LY_ROOT_FOLDER}/cmake/install/Copyright.in cmake_copyright_comment) - - # Initialize the target install source directory to path underneath the current binary directory - set(target_install_source_dir ${CMAKE_CURRENT_BINARY_DIR}/install/${relative_target_source_dir}) # Write out all the aggregated ly_add_target function calls and the final ly_create_alias() calls to the target CMakeLists.txt - file(WRITE ${target_install_source_dir}/CMakeLists.txt + file(WRITE "${target_install_source_dir}/Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION}/permutation.cmake" "${cmake_copyright_comment}" "${all_configured_targets}" "\n" @@ -316,9 +348,8 @@ function(ly_setup_subdirectory absolute_target_source_dir) "${GEM_VARIANT_TO_LOAD_PLACEHOLDER}" "${ENABLE_GEMS_PLACEHOLDER}" ) - - install(FILES "${target_install_source_dir}/CMakeLists.txt" - DESTINATION ${relative_target_source_dir} + install(FILES "${target_install_source_dir}/Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION}/permutation.cmake" + DESTINATION ${relative_target_source_dir}//Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) @@ -362,10 +393,10 @@ function(ly_setup_cmake_install) # Inject code that will generate each ConfigurationType_.cmake file set(install_configuration_type_template [=[ configure_file(@LY_ROOT_FOLDER@/cmake/install/ConfigurationType_config.cmake.in - ${CMAKE_INSTALL_PREFIX}/cmake/ConfigurationTypes_${CMAKE_INSTALL_CONFIG_NAME}.cmake + ${CMAKE_INSTALL_PREFIX}/cmake/Platform/@PAL_PLATFORM_NAME@/@LY_BUILD_PERMUTATION@/ConfigurationTypes_${CMAKE_INSTALL_CONFIG_NAME}.cmake @ONLY ) - message(STATUS "Generated ${CMAKE_INSTALL_PREFIX}/cmake/ConfigurationTypes_${CMAKE_INSTALL_CONFIG_NAME}.cmake") + message(STATUS "Generated ${CMAKE_INSTALL_PREFIX}/cmake/Platform/@PAL_PLATFORM_NAME@/@LY_BUILD_PERMUTATION@/ConfigurationTypes_${CMAKE_INSTALL_CONFIG_NAME}.cmake") ]=]) string(CONFIGURE "${install_configuration_type_template}" install_configuration_type @ONLY) install(CODE "${install_configuration_type}" @@ -493,6 +524,11 @@ endfunction()" endif() # runtime dependencies that need to be copied to the output + # Anywhere CMAKE_INSTALL_PREFIX is used, it has to be escaped so it is baked into the cmake_install.cmake script instead + # of baking the path. This is needed so `cmake --install --prefix ` works regardless of the CMAKE_INSTALL_PREFIX + # used to generate the solution. + # CMAKE_INSTALL_PREFIX is still used when building the INSTALL target + set(install_output_folder "\${CMAKE_INSTALL_PREFIX}/${runtime_output_directory}/${PAL_PLATFORM_NAME}/$/${LY_BUILD_PERMUTATION}") set(target_file_dir "${install_output_folder}/${target_runtime_output_subdirectory}") ly_get_runtime_dependencies(runtime_dependencies ${target}) foreach(runtime_dependency ${runtime_dependencies}) diff --git a/cmake/Platform/Mac/Install_mac.cmake b/cmake/Platform/Mac/Install_mac.cmake index f3c2b31b31..8f07b1bfde 100644 --- a/cmake/Platform/Mac/Install_mac.cmake +++ b/cmake/Platform/Mac/Install_mac.cmake @@ -54,19 +54,19 @@ function(ly_install_target_override) install( TARGETS ${ly_platform_install_target_TARGET} ARCHIVE - DESTINATION ${ly_platform_install_target_ARCHIVE_DIR}/${PAL_PLATFORM_NAME}/$ + DESTINATION ${ly_platform_install_target_ARCHIVE_DIR} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} LIBRARY - DESTINATION ${ly_platform_install_target_LIBRARY_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_LIBRARY_SUBDIR} + DESTINATION ${ly_platform_install_target_LIBRARY_DIR}/${ly_platform_install_target_LIBRARY_SUBDIR} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} RUNTIME - DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_RUNTIME_SUBDIR} + DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${ly_platform_install_target_RUNTIME_SUBDIR} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} BUNDLE - DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_RUNTIME_SUBDIR} + DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${ly_platform_install_target_RUNTIME_SUBDIR} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} RESOURCE - DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${PAL_PLATFORM_NAME}/$/${ly_platform_install_target_RUNTIME_SUBDIR}/ + DESTINATION ${ly_platform_install_target_RUNTIME_DIR}/${ly_platform_install_target_RUNTIME_SUBDIR} COMPONENT ${CMAKE_INSTALL_DEFAULT_COMPONENT_NAME} ) diff --git a/cmake/install/ConfigurationTypes.cmake b/cmake/install/ConfigurationTypes.cmake index 709f3e71ab..ce0fbd7963 100644 --- a/cmake/install/ConfigurationTypes.cmake +++ b/cmake/install/ConfigurationTypes.cmake @@ -15,7 +15,16 @@ include_guard(GLOBAL) set(CMAKE_CONFIGURATION_TYPES "" CACHE STRING "" FORCE) # For the SDK case, we want to only define the confiuguration types that have been added to the SDK -file(GLOB configuration_type_files "cmake/ConfigurationTypes_*.cmake") +# We need to redeclare LY_BUILD_PERMUTATION because Configurations is one of the first things included by the +# root CMakeLists.txt. Even LY_MONOLITHIC_GAME is declared after, but since is a passed cache variable, and +# default is the same as undeclared, we can use it at this point. +if(LY_MONOLITHIC_GAME) + set(LY_BUILD_PERMUTATION Monolithic) +else() + set(LY_BUILD_PERMUTATION Default) +endif() + +file(GLOB configuration_type_files "cmake/Platform/${PAL_PLATFORM_NAME}/${LY_BUILD_PERMUTATION}/ConfigurationTypes_*.cmake") foreach(configuration_type_file ${configuration_type_files}) include(${configuration_type_file}) endforeach() diff --git a/cmake/install/InstalledTarget.in b/cmake/install/InstalledTarget.in index 2095211bb2..5022a108e8 100644 --- a/cmake/install/InstalledTarget.in +++ b/cmake/install/InstalledTarget.in @@ -23,5 +23,5 @@ ly_add_target( set(configs @CMAKE_CONFIGURATION_TYPES@) foreach(config ${configs}) - include("@NAME_PLACEHOLDER@_${config}.cmake" OPTIONAL) + include("Platform/@PAL_PLATFORM_NAME@/@LY_BUILD_PERMUTATION@/@NAME_PLACEHOLDER@_${config}.cmake" OPTIONAL) endforeach() From 603e33d7f774f17c61da0335a3c8077b11b526b1 Mon Sep 17 00:00:00 2001 From: mrieggeramzn <61609885+mrieggeramzn@users.noreply.github.com> Date: Tue, 14 Sep 2021 16:10:06 -0700 Subject: [PATCH 306/355] Removing the boundary search method. (#4024) * Removing the boundary search method. Bicubic is now the default and only PCF filtering method * Removing padding (based upon feedback) * Removing PCF method from py auto testing Signed-off-by: mrieggeramzn --- ...dra_AtomEditorComponents_LightComponent.py | 2 - .../atom_renderer/test_Atom_MainSuite.py | 2 - .../Shadow/DirectionalLightShadow.azsli | 96 +++------------ .../Features/Shadow/ProjectedShadow.azsli | 109 +++--------------- .../CoreLights/ViewSrg.azsli | 4 +- ...irectionalLightFeatureProcessorInterface.h | 9 -- .../DiskLightFeatureProcessorInterface.h | 4 - .../PointLightFeatureProcessorInterface.h | 5 - .../Atom/Feature/CoreLights/ShadowConstants.h | 8 -- ...ProjectedShadowFeatureProcessorInterface.h | 4 - .../DirectionalLightFeatureProcessor.cpp | 23 ---- .../DirectionalLightFeatureProcessor.h | 4 - .../CoreLights/DiskLightFeatureProcessor.cpp | 10 -- .../CoreLights/DiskLightFeatureProcessor.h | 2 - .../CoreLights/PointLightFeatureProcessor.cpp | 10 -- .../CoreLights/PointLightFeatureProcessor.h | 2 - .../ProjectedShadowFeatureProcessor.cpp | 24 +--- .../Shadows/ProjectedShadowFeatureProcessor.h | 5 +- .../CommonFeatures/CoreLights/AreaLightBus.h | 13 --- .../CoreLights/AreaLightComponentConfig.h | 8 -- .../CoreLights/DirectionalLightBus.h | 16 --- .../DirectionalLightComponentConfig.h | 8 -- .../CoreLights/AreaLightComponentConfig.cpp | 24 ---- .../AreaLightComponentController.cpp | 36 ------ .../CoreLights/AreaLightComponentController.h | 4 - .../DirectionalLightComponentConfig.cpp | 24 ---- .../DirectionalLightComponentController.cpp | 34 ------ .../DirectionalLightComponentController.h | 4 - .../Source/CoreLights/DiskLightDelegate.cpp | 16 --- .../Source/CoreLights/DiskLightDelegate.h | 2 - .../CoreLights/EditorAreaLightComponent.cpp | 18 +-- .../EditorDirectionalLightComponent.cpp | 18 +-- .../Source/CoreLights/LightDelegateBase.h | 2 - .../CoreLights/LightDelegateInterface.h | 4 - .../Source/CoreLights/SphereLightDelegate.cpp | 16 --- .../Source/CoreLights/SphereLightDelegate.h | 2 - 36 files changed, 37 insertions(+), 535 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py index 24866f3b19..8d138e67b8 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py @@ -31,8 +31,6 @@ SPHERE_AND_SPOT_DISK_LIGHT_PROPERTIES = [ ("Controller|Configuration|Shadows|Shadow filter method", 1), # PCF ("Controller|Configuration|Shadows|Filtering sample count", 4.0), ("Controller|Configuration|Shadows|Filtering sample count", 64.0), - ("Controller|Configuration|Shadows|PCF method", 0), # Bicubic - ("Controller|Configuration|Shadows|PCF method", 1), # Boundary search ("Controller|Configuration|Shadows|Shadow filter method", 2), # ECM ("Controller|Configuration|Shadows|ESM exponent", 50), ("Controller|Configuration|Shadows|ESM exponent", 5000), diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py index c40dc8f178..ce496ce268 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py @@ -200,8 +200,6 @@ class TestAtomEditorComponentsMain(object): "Controller|Configuration|Shadows|Shadow filter method set to 1", # PCF "Controller|Configuration|Shadows|Filtering sample count set to 4", "Controller|Configuration|Shadows|Filtering sample count set to 64", - "Controller|Configuration|Shadows|PCF method set to 0", - "Controller|Configuration|Shadows|PCF method set to 1", "Controller|Configuration|Shadows|Shadow filter method set to 2", # ESM "Controller|Configuration|Shadows|ESM exponent set to 50.0", "Controller|Configuration|Shadows|ESM exponent set to 5000.0", diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli index 8df13bd19a..dd235fcd3a 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/DirectionalLightShadow.azsli @@ -101,7 +101,6 @@ class DirectionalLightShadow // This outputs visibility ratio (from 0.0 to 1.0) for ESM+PCF. float GetVisibilityFromLightEsmPcf(); - float SamplePcfBicubic(); float SamplePcfBicubic(float3 shadowCoord, uint indexOfCascade); uint m_lightIndex; @@ -278,70 +277,26 @@ float DirectionalLightShadow::GetVisibilityFromLightNoFilter() } float DirectionalLightShadow::GetVisibilityFromLightPcf() -{ - const uint predictionCount = ViewSrg::m_directionalLightShadows[m_lightIndex].m_predictionSampleCount; +{ + static const float DepthMargin = 0.01; // avoiding artifact when near depth bounds. + static const float PixelMargin = 1.5; // avoiding artifact between cascade levels. - if (predictionCount <= 1) + const uint size = ViewSrg::m_directionalLightShadows[m_lightIndex].m_shadowmapSize; + const uint cascadeCount = ViewSrg::m_directionalLightShadows[m_lightIndex].m_cascadeCount; + for (uint indexOfCascade = 0; indexOfCascade < cascadeCount; ++indexOfCascade) { - return GetVisibilityFromLightNoFilter(); - } + const float3 shadowCoord = m_shadowCoords[indexOfCascade]; - if (ViewSrg::m_directionalLightShadows[m_lightIndex].m_pcfFilterMethod == PcfFilterMethod_Bicubic) - { - return SamplePcfBicubic(); - } - - const float3 lightDirection = - normalize(SceneSrg::m_directionalLights[m_lightIndex].m_direction); - const float4 jitterUnitVectorDepthDiffBase = - Shadow::GetJitterUnitVectorDepthDiffBase(m_normalVector, lightDirection); - const float3 jitterUnit = jitterUnitVectorDepthDiffBase.xyz; - const float jitterDepthDiffBase = jitterUnitVectorDepthDiffBase.w; - - uint shadowedCount = 0; - uint jitterIndex = 0; - - // Predicting - for (; jitterIndex < predictionCount; ++jitterIndex) - { - if (IsShadowedWithJitter( - jitterUnit, - jitterDepthDiffBase, - jitterIndex)) + if (shadowCoord.x >= 0. && shadowCoord.x * size < size - PixelMargin && + shadowCoord.y >= 0. && shadowCoord.y * size < size - PixelMargin && + shadowCoord.z < 1. - DepthMargin) { - ++shadowedCount; + m_debugInfo.m_cascadeIndex = indexOfCascade; + return SamplePcfBicubic(shadowCoord, indexOfCascade); } } - if (shadowedCount == 0) - { - return 1.; - } - else if (shadowedCount == predictionCount) - { - return 0.; - } - - // Filtering - - // When the prediction detects the point on the boundary of shadow, - // i.e., both of a lit point and a a shadowed one exists in the jittering area, - // we calculate the more precious lit ratio in the area. - const uint filteringCount = max( - predictionCount, - ViewSrg::m_directionalLightShadows[m_lightIndex].m_filteringSampleCount); - - for (; jitterIndex < filteringCount; ++jitterIndex) - { - if (IsShadowedWithJitter( - jitterUnit, - jitterDepthDiffBase, - jitterIndex)) - { - ++shadowedCount; - } - } - - return (filteringCount - shadowedCount) * 1. / filteringCount; + m_debugInfo.m_cascadeIndex = cascadeCount; + return 1.; } float DirectionalLightShadow::GetVisibilityFromLightEsm() @@ -415,29 +370,6 @@ float DirectionalLightShadow::GetVisibilityFromLightEsmPcf() return 1.; } -float DirectionalLightShadow::SamplePcfBicubic() -{ - static const float DepthMargin = 0.01; // avoiding artifact when near depth bounds. - static const float PixelMargin = 1.5; // avoiding artifact between cascade levels. - - const uint size = ViewSrg::m_directionalLightShadows[m_lightIndex].m_shadowmapSize; - const uint cascadeCount = ViewSrg::m_directionalLightShadows[m_lightIndex].m_cascadeCount; - for (uint indexOfCascade = 0; indexOfCascade < cascadeCount; ++indexOfCascade) - { - const float3 shadowCoord = m_shadowCoords[indexOfCascade]; - - if (shadowCoord.x >= 0. && shadowCoord.x * size < size - PixelMargin && - shadowCoord.y >= 0. && shadowCoord.y * size < size - PixelMargin && - shadowCoord.z < 1. - DepthMargin) - { - m_debugInfo.m_cascadeIndex = indexOfCascade; - return SamplePcfBicubic(shadowCoord, indexOfCascade); - } - } - m_debugInfo.m_cascadeIndex = cascadeCount; - return 1.; -} - float DirectionalLightShadow::SamplePcfBicubic(float3 shadowCoord, uint indexOfCascade) { const uint filteringSampleCount = ViewSrg::m_directionalLightShadows[m_lightIndex].m_filteringSampleCount; diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli index 2fea4650b3..899fbb1553 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/Shadow/ProjectedShadow.azsli @@ -44,8 +44,6 @@ class ProjectedShadow float GetVisibilityEsmPcf(); float GetThickness(); - float SamplePcfBicubic(); - bool IsShadowed(float3 shadowPosition); bool IsShadowedWithJitter( float3 jitterUnitX, @@ -87,8 +85,7 @@ float ProjectedShadow::GetVisibility( shadow.SetShadowPosition(); float visibility = 1.; - // Filter method is stored in top 16 bits. - uint filterMethod = ViewSrg::m_projectedShadows[shadow.m_shadowIndex].m_shadowFilterMethod & 0x0000FFFF; + const uint filterMethod = ViewSrg::m_projectedShadows[shadow.m_shadowIndex].m_shadowFilterMethod; switch (filterMethod) { case ViewSrg::ShadowFilterMethodNone: @@ -145,72 +142,29 @@ float ProjectedShadow::GetVisibilityNoFilter() float ProjectedShadow::GetVisibilityPcf() { - // PCF filter method is stored in bottom 16 bits. - const uint pcfFilterMethod = ViewSrg::m_projectedShadows[m_shadowIndex].m_shadowFilterMethod >> 16; - if (pcfFilterMethod == PcfFilterMethod_Bicubic) + const uint filteringSampleCount = ViewSrg::m_projectedShadows[m_shadowIndex].m_filteringSampleCount; + const float3 atlasPosition = GetAtlasPosition(m_shadowPosition.xy); + + SampleShadowMapBicubicParameters param; + param.shadowMap = PassSrg::m_projectedShadowmaps; + param.shadowPos = float3(atlasPosition.xy * ViewSrg::m_invShadowmapAtlasSize, atlasPosition.z); + param.shadowMapSize = ViewSrg::m_shadowmapAtlasSize; + param.invShadowMapSize = ViewSrg::m_invShadowmapAtlasSize; + param.comparisonValue = m_shadowPosition.z - m_bias; + param.samplerState = SceneSrg::m_hwPcfSampler; + + if (filteringSampleCount <= 4) { - return SamplePcfBicubic(); + return SampleShadowMapBicubic_4Tap(param); } - - const uint predictionCount = ViewSrg::m_projectedShadows[m_shadowIndex].m_predictionSampleCount; - - if (predictionCount <= 1) + else if (filteringSampleCount <= 9) { - return GetVisibilityNoFilter(); + return SampleShadowMapBicubic_9Tap(param); } - - const float4 jitterUnitVectorDepthDiffBase = - Shadow::GetJitterUnitVectorDepthDiffBase(m_normalVector, m_lightDirection); - const float3 jitterUnitY = jitterUnitVectorDepthDiffBase.xyz; - const float3 jitterUnitX = cross(jitterUnitY, m_lightDirection); - const float jitterDepthDiffBase = jitterUnitVectorDepthDiffBase.w; - - uint shadowedCount = 0; - uint jitterIndex = 0; - - // Predicting - for (; jitterIndex < predictionCount; ++jitterIndex) + else { - if (IsShadowedWithJitter( - jitterUnitX, - jitterUnitY, - jitterDepthDiffBase, - jitterIndex)) - { - ++shadowedCount; - } + return SampleShadowMapBicubic_16Tap(param); } - if (shadowedCount == 0) - { - return 1.; - } - else if (shadowedCount == predictionCount) - { - return 0.; - } - - // Filtering - - // When the prediction detects the point on the boundary of shadow, - // i.e., both of a lit point and a a shadowed one exists in the jittering area, - // we calculate the more precious lit ratio in the area. - const uint filteringCount = max( - predictionCount, - ViewSrg::m_projectedShadows[m_shadowIndex].m_filteringSampleCount); - - for (; jitterIndex < filteringCount; ++jitterIndex) - { - if (IsShadowedWithJitter( - jitterUnitX, - jitterUnitY, - jitterDepthDiffBase, - jitterIndex)) - { - ++shadowedCount; - } - } - - return (filteringCount - shadowedCount) * 1. / filteringCount; } float ProjectedShadow::GetVisibilityEsm() @@ -337,33 +291,6 @@ float ProjectedShadow::GetThickness() return 0.; } -float ProjectedShadow::SamplePcfBicubic() -{ - const uint filteringSampleCount = ViewSrg::m_projectedShadows[m_shadowIndex].m_filteringSampleCount; - const float3 atlasPosition = GetAtlasPosition(m_shadowPosition.xy); - - SampleShadowMapBicubicParameters param; - param.shadowMap = PassSrg::m_projectedShadowmaps; - param.shadowPos = float3(atlasPosition.xy * ViewSrg::m_invShadowmapAtlasSize, atlasPosition.z); - param.shadowMapSize = ViewSrg::m_shadowmapAtlasSize; - param.invShadowMapSize = ViewSrg::m_invShadowmapAtlasSize; - param.comparisonValue = m_shadowPosition.z - m_bias; - param.samplerState = SceneSrg::m_hwPcfSampler; - - if (filteringSampleCount <= 4) - { - return SampleShadowMapBicubic_4Tap(param); - } - else if (filteringSampleCount <= 9) - { - return SampleShadowMapBicubic_9Tap(param); - } - else - { - return SampleShadowMapBicubic_16Tap(param); - } -} - bool ProjectedShadow::IsShadowed(float3 shadowPosition) { static const float PixelMargin = 1.5; // avoiding artifact between cascade levels. diff --git a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/CoreLights/ViewSrg.azsli b/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/CoreLights/ViewSrg.azsli index 01e5f3e61c..2065e28703 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/CoreLights/ViewSrg.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderResourceGroups/CoreLights/ViewSrg.azsli @@ -82,7 +82,7 @@ partial ShaderResourceGroup ViewSrg { float4x4 m_depthBiasMatrix; uint m_shadowmapArraySlice; // array slice who has shadowmap in the atlas. - uint m_shadowFilterMethod; // Includes overall filter method in top 16 bits and pcf method in bottom 16 bits. + uint m_shadowFilterMethod; float m_boundaryScale; uint m_predictionSampleCount; uint m_filteringSampleCount; @@ -117,8 +117,6 @@ partial ShaderResourceGroup ViewSrg uint m_debugFlags; uint m_shadowFilterMethod; float m_far_minus_near; - uint m_pcfFilterMethod; // Matches with PcfFilterMethod in ShadowConstants.h - uint m_padding[3]; }; enum ShadowFilterMethod diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h index 3244c8249e..75d266cc52 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DirectionalLightFeatureProcessorInterface.h @@ -149,12 +149,6 @@ namespace AZ //! @param method filter method. virtual void SetShadowFilterMethod(LightHandle handle, ShadowFilterMethod method) = 0; - //! This sets sample count to predict boundary of shadow. - //! @param handle the light handle. - //! @param count Sample Count for prediction of whether the pixel is on the boundary (up to 16) - //! The value should be less than or equal to m_filteringSampleCount. - virtual void SetPredictionSampleCount(LightHandle handle, uint16_t count) = 0; - //! This sets sample count for filtering of shadow boundary. //! @param handle the light handle. //! @param count Sample Count for filtering (up to 64) @@ -166,9 +160,6 @@ namespace AZ //! If width == 0, softening edge is disabled. Units are in meters. virtual void SetShadowBoundaryWidth(LightHandle handle, float boundaryWidth) = 0; - //! Sets the shadowmap Pcf method. - virtual void SetPcfMethod(LightHandle handle, PcfMethod method) = 0; - //! Sets whether the directional shadowmap should use receiver plane bias. //! This attempts to reduce shadow acne when using large pcf filters. virtual void SetShadowReceiverPlaneBiasEnabled(LightHandle handle, bool enable) = 0; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DiskLightFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DiskLightFeatureProcessorInterface.h index bcb470d831..3ab83200ae 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DiskLightFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/DiskLightFeatureProcessorInterface.h @@ -92,12 +92,8 @@ namespace AZ virtual void SetShadowFilterMethod(LightHandle handle, ShadowFilterMethod method) = 0; //! Specifies the width of boundary between shadowed area and lit area in radians. The degree ofshadowed gradually changes on the boundary. 0 disables softening. virtual void SetSofteningBoundaryWidthAngle(LightHandle handle, float boundaryWidthRadians) = 0; - //! Sets sample count to predict boundary of shadow (up to 16). It will be clamped to be less than or equal to the filtering sample count. - virtual void SetPredictionSampleCount(LightHandle handle, uint16_t count) = 0; //! Sets sample count for filtering of shadow boundary (up to 64) virtual void SetFilteringSampleCount(LightHandle handle, uint16_t count) = 0; - //! Sets the shadowmap Pcf (percentage closer filtering) method. - virtual void SetPcfMethod(LightHandle handle, PcfMethod method) = 0; //! Sets the Esm exponent to use. Higher values produce a steeper falloff in the border areas between light and shadow. virtual void SetEsmExponent(LightHandle handle, float exponent) = 0; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/PointLightFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/PointLightFeatureProcessorInterface.h index 3383378dc7..6752ac4c52 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/PointLightFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/PointLightFeatureProcessorInterface.h @@ -73,13 +73,8 @@ namespace AZ //! Specifies the width of boundary between shadowed area and lit area in radians. The degree ofshadowed gradually changes on //! the boundary. 0 disables softening. virtual void SetSofteningBoundaryWidthAngle(LightHandle handle, float boundaryWidthRadians) = 0; - //! Sets sample count to predict boundary of shadow (up to 16). It will be clamped to be less than or equal to the filtering - //! sample count. - virtual void SetPredictionSampleCount(LightHandle handle, uint16_t count) = 0; //! Sets sample count for filtering of shadow boundary (up to 64) virtual void SetFilteringSampleCount(LightHandle handle, uint16_t count) = 0; - //! Sets the shadowmap Pcf (percentage closer filtering) method. - virtual void SetPcfMethod(LightHandle handle, PcfMethod method) = 0; //! Sets the Esm exponent to use. Higher values produce a steeper falloff in the border areas between light and shadow. virtual void SetEsmExponent(LightHandle handle, float exponent) = 0; //! Sets all of the the point data for the provided LightHandle. diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/ShadowConstants.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/ShadowConstants.h index 2d0811be9e..dbad3af21f 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/ShadowConstants.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/CoreLights/ShadowConstants.h @@ -37,14 +37,6 @@ namespace AZ Count }; - enum class PcfMethod : uint16_t - { - BoundarySearch = 0, // Performs a variable number of taps, first to determine if we are on a shadow boundary, then the remaining taps are to find the occlusion amount - Bicubic, // Uses a fixed size Pcf kernel with kernel weights set to approximate bicubic filtering - - Count - }; - namespace Shadow { // [GFX TODO][ATOM-2408] Make the max number of cascade modifiable at runtime. diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Shadows/ProjectedShadowFeatureProcessorInterface.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Shadows/ProjectedShadowFeatureProcessorInterface.h index 6cbb0cfef1..3d6c0c3015 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Shadows/ProjectedShadowFeatureProcessorInterface.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/Shadows/ProjectedShadowFeatureProcessorInterface.h @@ -52,14 +52,10 @@ namespace AZ::Render virtual void SetShadowmapMaxResolution(ShadowId id, ShadowmapSize size) = 0; //! Sets the shadow bias virtual void SetShadowBias(ShadowId id, float bias) = 0; - //! Sets the shadowmap Pcf method. - virtual void SetPcfMethod(ShadowId id, PcfMethod method) = 0; //! Sets the shadow filter method virtual void SetShadowFilterMethod(ShadowId id, ShadowFilterMethod method) = 0; //! Sets the width of boundary between shadowed area and lit area. virtual void SetSofteningBoundaryWidthAngle(ShadowId id, float boundaryWidthRadians) = 0; - //! Sets the sample count to predict the boundary of the shadow. Max 16, should be less than filtering sample count. - virtual void SetPredictionSampleCount(ShadowId id, uint16_t count) = 0; //! Sets the sample count for filtering of the shadow boundary, max 64. virtual void SetFilteringSampleCount(ShadowId id, uint16_t count) = 0; //! Sets all of the shadow properites in one call diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp index 44f95a8b85..c235f78595 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.cpp @@ -571,20 +571,6 @@ namespace AZ } } - void DirectionalLightFeatureProcessor::SetPredictionSampleCount(LightHandle handle, uint16_t count) - { - if (count > Shadow::MaxPcfSamplingCount) - { - AZ_Warning(FeatureProcessorName, false, "Sampling count exceed the limit."); - count = Shadow::MaxPcfSamplingCount; - } - for (auto& it : m_shadowData) - { - it.second.GetData(handle.GetIndex()).m_predictionSampleCount = count; - } - m_shadowBufferNeedsUpdate = true; - } - void DirectionalLightFeatureProcessor::SetFilteringSampleCount(LightHandle handle, uint16_t count) { if (count > Shadow::MaxPcfSamplingCount) @@ -608,15 +594,6 @@ namespace AZ m_shadowBufferNeedsUpdate = true; } - void DirectionalLightFeatureProcessor::SetPcfMethod(LightHandle handle, PcfMethod method) - { - for (auto& it : m_shadowData) - { - it.second.GetData(handle.GetIndex()).m_pcfMethod = method; - } - m_shadowBufferNeedsUpdate = true; - } - void DirectionalLightFeatureProcessor::SetShadowReceiverPlaneBiasEnabled(LightHandle handle, bool enable) { m_shadowProperties.GetData(handle.GetIndex()).m_isReceiverPlaneBiasEnabled = enable; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h index d57b3aaf2b..039f51d549 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DirectionalLightFeatureProcessor.h @@ -102,8 +102,6 @@ namespace AZ uint32_t m_debugFlags = 0; uint32_t m_shadowFilterMethod = 0; float m_far_minus_near = 0; - PcfMethod m_pcfMethod = PcfMethod::BoundarySearch; - uint32_t m_padding[3]; }; class DirectionalLightFeatureProcessor final @@ -218,10 +216,8 @@ namespace AZ void SetViewFrustumCorrectionEnabled(LightHandle handle, bool enabled) override; void SetDebugFlags(LightHandle handle, DebugDrawFlags flags) override; void SetShadowFilterMethod(LightHandle handle, ShadowFilterMethod method) override; - void SetPredictionSampleCount(LightHandle handle, uint16_t count) override; void SetFilteringSampleCount(LightHandle handle, uint16_t count) override; void SetShadowBoundaryWidth(LightHandle handle, float boundaryWidth) override; - void SetPcfMethod(LightHandle handle, PcfMethod method) override; void SetShadowReceiverPlaneBiasEnabled(LightHandle handle, bool enable) override; const Data::Instance GetLightBuffer() const; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.cpp index 55be9d232e..dfbeea0ffe 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.cpp @@ -329,21 +329,11 @@ namespace AZ SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetSofteningBoundaryWidthAngle, boundaryWidthRadians); } - void DiskLightFeatureProcessor::SetPredictionSampleCount(LightHandle handle, uint16_t count) - { - SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetPredictionSampleCount, count); - } - void DiskLightFeatureProcessor::SetFilteringSampleCount(LightHandle handle, uint16_t count) { SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetFilteringSampleCount, count); } - void DiskLightFeatureProcessor::SetPcfMethod(LightHandle handle, PcfMethod method) - { - SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetPcfMethod, method); - } - void DiskLightFeatureProcessor::SetEsmExponent(LightHandle handle, float exponent) { SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetEsmExponent, exponent); diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.h index 36837a67fb..d65f587718 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/DiskLightFeatureProcessor.h @@ -54,9 +54,7 @@ namespace AZ void SetShadowmapMaxResolution(LightHandle handle, ShadowmapSize shadowmapSize) override; void SetShadowFilterMethod(LightHandle handle, ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(LightHandle handle, float boundaryWidthRadians) override; - void SetPredictionSampleCount(LightHandle handle, uint16_t count) override; void SetFilteringSampleCount(LightHandle handle, uint16_t count) override; - void SetPcfMethod(LightHandle handle, PcfMethod method) override; void SetEsmExponent(LightHandle handle, float esmExponent) override; void SetDiskData(LightHandle handle, const DiskLightData& data) override; diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.cpp index 9baa2ae1c2..af440e5040 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.cpp @@ -298,21 +298,11 @@ namespace AZ SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetSofteningBoundaryWidthAngle, boundaryWidthRadians); } - void PointLightFeatureProcessor::SetPredictionSampleCount(LightHandle handle, uint16_t count) - { - SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetPredictionSampleCount, count); - } - void PointLightFeatureProcessor::SetFilteringSampleCount(LightHandle handle, uint16_t count) { SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetFilteringSampleCount, count); } - void PointLightFeatureProcessor::SetPcfMethod(LightHandle handle, PcfMethod method) - { - SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetPcfMethod, method); - } - void PointLightFeatureProcessor::SetEsmExponent(LightHandle handle, float esmExponent) { SetShadowSetting(handle, &ProjectedShadowFeatureProcessor::SetEsmExponent, esmExponent); diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.h index 3c231c1fb0..b784eb1bb5 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/PointLightFeatureProcessor.h @@ -51,9 +51,7 @@ namespace AZ void SetShadowmapMaxResolution(LightHandle handle, ShadowmapSize shadowmapSize) override; void SetShadowFilterMethod(LightHandle handle, ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(LightHandle handle, float boundaryWidthRadians) override; - void SetPredictionSampleCount(LightHandle handle, uint16_t count) override; void SetFilteringSampleCount(LightHandle handle, uint16_t count) override; - void SetPcfMethod(LightHandle handle, PcfMethod method) override; void SetEsmExponent(LightHandle handle, float esmExponent) override; void SetPointData(LightHandle handle, const PointLightData& data) override; diff --git a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.cpp b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.cpp index 68dac8f773..68c31bd859 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.cpp @@ -165,15 +165,6 @@ namespace AZ::Render m_filterParameterNeedsUpdate = true; } - void ProjectedShadowFeatureProcessor::SetPcfMethod(ShadowId id, PcfMethod method) - { - AZ_Assert(id.IsValid(), "Invalid ShadowId passed to ProjectedShadowFeatureProcessor::SetPcfMethod()."); - ShadowData& shadowData = m_shadowData.GetElement(id.GetIndex()); - shadowData.m_pcfMethod = method; - - m_deviceBufferNeedsUpdate = true; - } - void ProjectedShadowFeatureProcessor::SetEsmExponent(ShadowId id, float exponent) { AZ_Assert(id.IsValid(), "Invalid ShadowId passed to ProjectedShadowFeatureProcessor::SetEsmExponent()."); @@ -188,7 +179,7 @@ namespace AZ::Render ShadowProperty& shadowProperty = GetShadowPropertyFromShadowId(id); ShadowData& shadowData = m_shadowData.GetElement(id.GetIndex()); - shadowData.m_shadowFilterMethod = aznumeric_cast(method); + shadowData.m_shadowFilterMethod = aznumeric_cast(method); UpdateShadowView(shadowProperty); @@ -207,19 +198,6 @@ namespace AZ::Render m_filterParameterNeedsUpdate = true; } - void ProjectedShadowFeatureProcessor::SetPredictionSampleCount(ShadowId id, uint16_t count) - { - AZ_Assert(id.IsValid(), "Invalid ShadowId passed to ProjectedShadowFeatureProcessor::SetPredictionSampleCount()."); - - AZ_Warning("ProjectedShadowFeatureProcessor", count <= Shadow::MaxPcfSamplingCount, "Sampling count exceed the limit."); - count = GetMin(count, Shadow::MaxPcfSamplingCount); - - ShadowData& shadowData = m_shadowData.GetElement(id.GetIndex()); - shadowData.m_predictionSampleCount = count; - - m_deviceBufferNeedsUpdate = true; - } - void ProjectedShadowFeatureProcessor::SetFilteringSampleCount(ShadowId id, uint16_t count) { AZ_Assert(id.IsValid(), "Invalid ShadowId passed to ProjectedShadowFeatureProcessor::SetFilteringSampleCount()."); diff --git a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h index 8beed800b6..f4c6cad7bf 100644 --- a/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h +++ b/Gems/Atom/Feature/Common/Code/Source/Shadows/ProjectedShadowFeatureProcessor.h @@ -48,11 +48,9 @@ namespace AZ::Render void SetFieldOfViewY(ShadowId id, float fieldOfViewYRadians) override; void SetShadowmapMaxResolution(ShadowId id, ShadowmapSize size) override; void SetShadowBias(ShadowId id, float bias) override; - void SetPcfMethod(ShadowId id, PcfMethod method); void SetEsmExponent(ShadowId id, float exponent); void SetShadowFilterMethod(ShadowId id, ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(ShadowId id, float boundaryWidthRadians) override; - void SetPredictionSampleCount(ShadowId id, uint16_t count) override; void SetFilteringSampleCount(ShadowId id, uint16_t count) override; void SetShadowProperties(ShadowId id, const ProjectedShadowDescriptor& descriptor) override; const ProjectedShadowDescriptor& GetShadowProperties(ShadowId id) override; @@ -64,8 +62,7 @@ namespace AZ::Render { Matrix4x4 m_depthBiasMatrix = Matrix4x4::CreateIdentity(); uint32_t m_shadowmapArraySlice = 0; // array slice who has shadowmap in the atlas. - uint16_t m_shadowFilterMethod = 0; // filtering method of shadows. - PcfMethod m_pcfMethod = PcfMethod::BoundarySearch; // method for performing Pcf (uint16_t) + uint32_t m_shadowFilterMethod = 0; // filtering method of shadows. float m_boundaryScale = 0.f; // the half of boundary of lit/shadowed areas. (in degrees) uint32_t m_predictionSampleCount = 0; // sample count to judge whether it is on the shadow boundary or not. uint32_t m_filteringSampleCount = 0; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightBus.h index 06b00a6b84..557e6b3dd2 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightBus.h @@ -127,25 +127,12 @@ namespace AZ //! 0 disables softening. virtual void SetSofteningBoundaryWidthAngle(float degrees) = 0; - //! Gets the sample count to predict boundary of shadow. - virtual uint32_t GetPredictionSampleCount() const = 0; - - //! Sets the sample count to predict boundary of shadow. Maximum 16, and should also be - //! less than the filtering sample count. - virtual void SetPredictionSampleCount(uint32_t count) = 0; - //! Gets the sample count for filtering of the shadow boundary. virtual uint32_t GetFilteringSampleCount() const = 0; //! Sets the sample count for filtering of the shadow boundary. Maximum 64. virtual void SetFilteringSampleCount(uint32_t count) = 0; - //! Gets the type of Pcf (percentage-closer filtering) to use. - virtual PcfMethod GetPcfMethod() const = 0; - - //! Sets the type of Pcf (percentage-closer filtering) to use. - virtual void SetPcfMethod(PcfMethod method) = 0; - //! Gets the Esm exponent. Higher values produce a steeper falloff between light and shadow. virtual float GetEsmExponent() const = 0; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h index 74eb10fdb6..a6d3c6fbed 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/AreaLightComponentConfig.h @@ -59,9 +59,7 @@ namespace AZ float m_bias = 0.1f; ShadowmapSize m_shadowmapMaxSize = ShadowmapSize::Size256; ShadowFilterMethod m_shadowFilterMethod = ShadowFilterMethod::None; - PcfMethod m_pcfMethod = PcfMethod::Bicubic; float m_boundaryWidthInDegrees = 0.25f; - uint16_t m_predictionSampleCount = 4; uint16_t m_filteringSampleCount = 12; float m_esmExponent = 87.0f; @@ -119,14 +117,8 @@ namespace AZ //! Returns true if pcf shadows are disabled. bool IsShadowPcfDisabled() const; - //! Returns true if pcf boundary search is disabled. - bool IsPcfBoundarySearchDisabled() const; - //! Returns true if exponential shadow maps are disabled. bool IsEsmDisabled() const; - - //! Returns true if the softening boundary width parameter is disabled. - bool IsSofteningBoundaryWidthDisabled() const; }; } } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h index 610578ee2d..644856e768 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightBus.h @@ -162,15 +162,6 @@ namespace AZ //! If width == 0, softening edge is disabled. Units are in meters. virtual void SetSofteningBoundaryWidth(float width) = 0; - //! This gets sample count to predict boundary of shadow. - //! @return Sample Count for prediction of whether the pixel is on the boundary (up to 16) - virtual uint32_t GetPredictionSampleCount() const = 0; - - //! This sets sample count to predict boundary of shadow. - //! @param count Sample Count for prediction of whether the pixel is on the boundary (up to 16) - //! The value should be less than or equal to m_filteringSampleCount. - virtual void SetPredictionSampleCount(uint32_t count) = 0; - //! This gets the sample count for filtering of the shadow boundary. //! @return Sample Count for filtering (up to 64) virtual uint32_t GetFilteringSampleCount() const = 0; @@ -179,13 +170,6 @@ namespace AZ //! @param count Sample Count for filtering (up to 64) virtual void SetFilteringSampleCount(uint32_t count) = 0; - //! This gets the type of Pcf (percentage-closer filtering) to use. - virtual PcfMethod GetPcfMethod() const = 0; - - //! This sets the type of Pcf (percentage-closer filtering) to use. - //! @param method The Pcf method to use. - virtual void SetPcfMethod(PcfMethod method) = 0; - //! Gets whether the directional shadowmap should use receiver plane bias. //! This attempts to reduce shadow acne when using large pcf filters. virtual bool GetShadowReceiverPlaneBiasEnabled() const = 0; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h index e9e5778086..0123d06275 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/CoreLights/DirectionalLightComponentConfig.h @@ -105,16 +105,10 @@ namespace AZ //! If this is 0, edge softening is disabled. Units are in meters. float m_boundaryWidth = 0.03f; // 3cm - //! Sample Count for prediction of whether the pixel is on the boundary (from 4 to 16) - //! The value should be less than or equal to m_filteringSampleCount. - uint16_t m_predictionSampleCount = 4; - //! Sample Count for filtering (from 4 to 64) //! It is used only when the pixel is predicted as on the boundary. uint16_t m_filteringSampleCount = 32; - PcfMethod m_pcfMethod = PcfMethod::Bicubic; - //! Whether not to enable the receiver plane bias. //! This uses partial derivatives to reduce shadow acne when using large pcf kernels. bool m_receiverPlaneBiasEnabled = true; @@ -124,8 +118,6 @@ namespace AZ bool IsCascadeCorrectionDisabled() const; bool IsShadowFilteringDisabled() const; bool IsShadowPcfDisabled() const; - bool IsPcfBoundarySearchDisabled() const; - bool IsSofteningBoundaryWidthDisabled() const; bool IsEsmDisabled() const; }; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentConfig.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentConfig.cpp index 550a09469f..c7af44a28e 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentConfig.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentConfig.cpp @@ -37,9 +37,7 @@ namespace AZ ->Field("Shadowmap Max Size", &AreaLightComponentConfig::m_shadowmapMaxSize) ->Field("Shadow Filter Method", &AreaLightComponentConfig::m_shadowFilterMethod) ->Field("Softening Boundary Width", &AreaLightComponentConfig::m_boundaryWidthInDegrees) - ->Field("Prediction Sample Count", &AreaLightComponentConfig::m_predictionSampleCount) ->Field("Filtering Sample Count", &AreaLightComponentConfig::m_filteringSampleCount) - ->Field("Pcf Method", &AreaLightComponentConfig::m_pcfMethod) ->Field("Esm Exponent", &AreaLightComponentConfig::m_esmExponent) ; } @@ -182,31 +180,9 @@ namespace AZ m_shadowFilterMethod == ShadowFilterMethod::EsmPcf); } - bool AreaLightComponentConfig::IsPcfBoundarySearchDisabled() const - { - if (IsShadowPcfDisabled()) - { - return true; - } - - return m_pcfMethod != PcfMethod::BoundarySearch; - } - bool AreaLightComponentConfig::IsEsmDisabled() const { return !(m_shadowFilterMethod == ShadowFilterMethod::Esm || m_shadowFilterMethod == ShadowFilterMethod::EsmPcf); } - - bool AreaLightComponentConfig::IsSofteningBoundaryWidthDisabled() const - { - // softening boundary width is always available with ESM. It controls the width of the blur kernel during the ESM gaussian - // blur passes - if (!IsEsmDisabled()) - return false; - - // with PCF, softening boundary width is used with the boundary search method and NOT the bicubic pcf methods - return IsPcfBoundarySearchDisabled(); - } - } } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.cpp index 0a5598a74a..c0204ecac5 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.cpp @@ -76,12 +76,8 @@ namespace AZ::Render ->Event("SetShadowFilterMethod", &AreaLightRequestBus::Events::SetShadowFilterMethod) ->Event("GetSofteningBoundaryWidthAngle", &AreaLightRequestBus::Events::GetSofteningBoundaryWidthAngle) ->Event("SetSofteningBoundaryWidthAngle", &AreaLightRequestBus::Events::SetSofteningBoundaryWidthAngle) - ->Event("GetPredictionSampleCount", &AreaLightRequestBus::Events::GetPredictionSampleCount) - ->Event("SetPredictionSampleCount", &AreaLightRequestBus::Events::SetPredictionSampleCount) ->Event("GetFilteringSampleCount", &AreaLightRequestBus::Events::GetFilteringSampleCount) ->Event("SetFilteringSampleCount", &AreaLightRequestBus::Events::SetFilteringSampleCount) - ->Event("GetPcfMethod", &AreaLightRequestBus::Events::GetPcfMethod) - ->Event("SetPcfMethod", &AreaLightRequestBus::Events::SetPcfMethod) ->Event("GetEsmExponent", &AreaLightRequestBus::Events::GetEsmExponent) ->Event("SetEsmExponent", &AreaLightRequestBus::Events::SetEsmExponent) @@ -100,9 +96,7 @@ namespace AZ::Render ->VirtualProperty("ShadowmapMaxSize", "GetShadowmapMaxSize", "SetShadowmapMaxSize") ->VirtualProperty("ShadowFilterMethod", "GetShadowFilterMethod", "SetShadowFilterMethod") ->VirtualProperty("SofteningBoundaryWidthAngle", "GetSofteningBoundaryWidthAngle", "SetSofteningBoundaryWidthAngle") - ->VirtualProperty("PredictionSampleCount", "GetPredictionSampleCount", "SetPredictionSampleCount") ->VirtualProperty("FilteringSampleCount", "GetFilteringSampleCount", "SetFilteringSampleCount") - ->VirtualProperty("PcfMethod", "GetPcfMethod", "SetPcfMethod") ->VirtualProperty("EsmExponent", "GetEsmExponent", "SetEsmExponent"); ; } @@ -314,9 +308,7 @@ namespace AZ::Render m_lightShapeDelegate->SetShadowmapMaxSize(m_configuration.m_shadowmapMaxSize); m_lightShapeDelegate->SetShadowFilterMethod(m_configuration.m_shadowFilterMethod); m_lightShapeDelegate->SetSofteningBoundaryWidthAngle(m_configuration.m_boundaryWidthInDegrees); - m_lightShapeDelegate->SetPredictionSampleCount(m_configuration.m_predictionSampleCount); m_lightShapeDelegate->SetFilteringSampleCount(m_configuration.m_filteringSampleCount); - m_lightShapeDelegate->SetPcfMethod(m_configuration.m_pcfMethod); m_lightShapeDelegate->SetEsmExponent(m_configuration.m_esmExponent); } } @@ -528,20 +520,6 @@ namespace AZ::Render } } - uint32_t AreaLightComponentController::GetPredictionSampleCount() const - { - return m_configuration.m_predictionSampleCount; - } - - void AreaLightComponentController::SetPredictionSampleCount(uint32_t count) - { - m_configuration.m_predictionSampleCount = static_cast(count); - if (m_lightShapeDelegate) - { - m_lightShapeDelegate->SetPredictionSampleCount(count); - } - } - uint32_t AreaLightComponentController::GetFilteringSampleCount() const { return m_configuration.m_filteringSampleCount; @@ -568,20 +546,6 @@ namespace AZ::Render m_lightShapeDelegate->DrawDebugDisplay(transform, m_configuration.m_color, debugDisplay, isSelected); } } - - PcfMethod AreaLightComponentController::GetPcfMethod() const - { - return m_configuration.m_pcfMethod; - } - - void AreaLightComponentController::SetPcfMethod(PcfMethod method) - { - m_configuration.m_pcfMethod = method; - if (m_lightShapeDelegate) - { - m_lightShapeDelegate->SetPcfMethod(method); - } - } float AreaLightComponentController::GetEsmExponent() const { diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.h index d290beb81d..3bec61551f 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/AreaLightComponentController.h @@ -84,12 +84,8 @@ namespace AZ void SetShadowFilterMethod(ShadowFilterMethod method) override; float GetSofteningBoundaryWidthAngle() const override; void SetSofteningBoundaryWidthAngle(float width) override; - uint32_t GetPredictionSampleCount() const override; - void SetPredictionSampleCount(uint32_t count) override; uint32_t GetFilteringSampleCount() const override; void SetFilteringSampleCount(uint32_t count) override; - PcfMethod GetPcfMethod() const override; - void SetPcfMethod(PcfMethod method) override; float GetEsmExponent() const override; void SetEsmExponent(float exponent) override; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp index 24ce566fb4..37d94f5ed1 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentConfig.cpp @@ -38,9 +38,7 @@ namespace AZ ->Field("IsDebugColoringEnabled", &DirectionalLightComponentConfig::m_isDebugColoringEnabled) ->Field("ShadowFilterMethod", &DirectionalLightComponentConfig::m_shadowFilterMethod) ->Field("SofteningBoundaryWidth", &DirectionalLightComponentConfig::m_boundaryWidth) - ->Field("PcfPredictionSampleCount", &DirectionalLightComponentConfig::m_predictionSampleCount) ->Field("PcfFilteringSampleCount", &DirectionalLightComponentConfig::m_filteringSampleCount) - ->Field("Pcf Method", &DirectionalLightComponentConfig::m_pcfMethod) ->Field("ShadowReceiverPlaneBiasEnabled", &DirectionalLightComponentConfig::m_receiverPlaneBiasEnabled); } } @@ -118,31 +116,9 @@ namespace AZ m_shadowFilterMethod == ShadowFilterMethod::EsmPcf); } - bool DirectionalLightComponentConfig::IsPcfBoundarySearchDisabled() const - { - if (IsShadowPcfDisabled()) - { - return true; - } - - return m_pcfMethod != PcfMethod::BoundarySearch; - } - bool DirectionalLightComponentConfig::IsEsmDisabled() const { return !(m_shadowFilterMethod == ShadowFilterMethod::Esm || m_shadowFilterMethod == ShadowFilterMethod::EsmPcf); } - - bool DirectionalLightComponentConfig::IsSofteningBoundaryWidthDisabled() const - { - // softening boundary width is always available with ESM. It controls the width of the blur kernel during the ESM gaussian - // blur passes - if (!IsEsmDisabled()) - return false; - - // with PCF, softening boundary width is used with the boundary search method and NOT the bicubic pcf methods - return IsPcfBoundarySearchDisabled(); - } - } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp index 6bf449803b..fbc1ccc35d 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.cpp @@ -82,12 +82,8 @@ namespace AZ ->Event("SetShadowFilterMethod", &DirectionalLightRequestBus::Events::SetShadowFilterMethod) ->Event("GetSofteningBoundaryWidth", &DirectionalLightRequestBus::Events::GetSofteningBoundaryWidth) ->Event("SetSofteningBoundaryWidth", &DirectionalLightRequestBus::Events::SetSofteningBoundaryWidth) - ->Event("GetPredictionSampleCount", &DirectionalLightRequestBus::Events::GetPredictionSampleCount) - ->Event("SetPredictionSampleCount", &DirectionalLightRequestBus::Events::SetPredictionSampleCount) ->Event("GetFilteringSampleCount", &DirectionalLightRequestBus::Events::GetFilteringSampleCount) ->Event("SetFilteringSampleCount", &DirectionalLightRequestBus::Events::SetFilteringSampleCount) - ->Event("GetPcfMethod", &DirectionalLightRequestBus::Events::GetPcfMethod) - ->Event("SetPcfMethod", &DirectionalLightRequestBus::Events::SetPcfMethod) ->Event("GetShadowReceiverPlaneBiasEnabled", &DirectionalLightRequestBus::Events::GetShadowReceiverPlaneBiasEnabled) ->Event("SetShadowReceiverPlaneBiasEnabled", &DirectionalLightRequestBus::Events::SetShadowReceiverPlaneBiasEnabled) ->VirtualProperty("Color", "GetColor", "SetColor") @@ -104,9 +100,7 @@ namespace AZ ->VirtualProperty("DebugColoringEnabled", "GetDebugColoringEnabled", "SetDebugColoringEnabled") ->VirtualProperty("ShadowFilterMethod", "GetShadowFilterMethod", "SetShadowFilterMethod") ->VirtualProperty("SofteningBoundaryWidth", "GetSofteningBoundaryWidth", "SetSofteningBoundaryWidth") - ->VirtualProperty("PredictionSampleCount", "GetPredictionSampleCount", "SetPredictionSampleCount") ->VirtualProperty("FilteringSampleCount", "GetFilteringSampleCount", "SetFilteringSampleCount") - ->VirtualProperty("PcfMethod", "GetPcfMethod", "SetPcfMethod") ->VirtualProperty("ShadowReceiverPlaneBiasEnabled", "GetShadowReceiverPlaneBiasEnabled", "SetShadowReceiverPlaneBiasEnabled"); ; } @@ -425,21 +419,6 @@ namespace AZ } } - uint32_t DirectionalLightComponentController::GetPredictionSampleCount() const - { - return aznumeric_cast(m_configuration.m_predictionSampleCount); - } - - void DirectionalLightComponentController::SetPredictionSampleCount(uint32_t count) - { - const uint16_t count16 = GetMin(Shadow::MaxPcfSamplingCount, aznumeric_cast(count)); - m_configuration.m_predictionSampleCount = count16; - if (m_featureProcessor) - { - m_featureProcessor->SetPredictionSampleCount(m_lightHandle, count16); - } - } - uint32_t DirectionalLightComponentController::GetFilteringSampleCount() const { return aznumeric_cast(m_configuration.m_filteringSampleCount); @@ -539,9 +518,7 @@ namespace AZ SetDebugColoringEnabled(m_configuration.m_isDebugColoringEnabled); SetShadowFilterMethod(m_configuration.m_shadowFilterMethod); SetSofteningBoundaryWidth(m_configuration.m_boundaryWidth); - SetPredictionSampleCount(m_configuration.m_predictionSampleCount); SetFilteringSampleCount(m_configuration.m_filteringSampleCount); - SetPcfMethod(m_configuration.m_pcfMethod); SetShadowReceiverPlaneBiasEnabled(m_configuration.m_receiverPlaneBiasEnabled); // [GFX TODO][ATOM-1726] share config for multiple light (e.g., light ID). @@ -631,17 +608,6 @@ namespace AZ } } - PcfMethod DirectionalLightComponentController::GetPcfMethod() const - { - return m_configuration.m_pcfMethod; - } - - void DirectionalLightComponentController::SetPcfMethod(PcfMethod method) - { - m_configuration.m_pcfMethod = method; - m_featureProcessor->SetPcfMethod(m_lightHandle, method); - } - bool DirectionalLightComponentController::GetShadowReceiverPlaneBiasEnabled() const { return m_configuration.m_receiverPlaneBiasEnabled; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h index 6b788c241c..b8052bfc36 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DirectionalLightComponentController.h @@ -78,12 +78,8 @@ namespace AZ void SetShadowFilterMethod(ShadowFilterMethod method) override; float GetSofteningBoundaryWidth() const override; void SetSofteningBoundaryWidth(float width) override; - uint32_t GetPredictionSampleCount() const override; - void SetPredictionSampleCount(uint32_t count) override; uint32_t GetFilteringSampleCount() const override; void SetFilteringSampleCount(uint32_t count) override; - PcfMethod GetPcfMethod() const override; - void SetPcfMethod(PcfMethod method) override; bool GetShadowReceiverPlaneBiasEnabled() const override; void SetShadowReceiverPlaneBiasEnabled(bool enable) override; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp index 91856f7ee5..baf0cdced1 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.cpp @@ -155,14 +155,6 @@ namespace AZ::Render } } - void DiskLightDelegate::SetPredictionSampleCount(uint32_t count) - { - if (GetShadowsEnabled() && GetLightHandle().IsValid()) - { - GetFeatureProcessor()->SetPredictionSampleCount(GetLightHandle(), static_cast(count)); - } - } - void DiskLightDelegate::SetFilteringSampleCount(uint32_t count) { if (GetShadowsEnabled() && GetLightHandle().IsValid()) @@ -171,14 +163,6 @@ namespace AZ::Render } } - void DiskLightDelegate::SetPcfMethod(PcfMethod method) - { - if (GetShadowsEnabled() && GetLightHandle().IsValid()) - { - GetFeatureProcessor()->SetPcfMethod(GetLightHandle(), method); - } - } - void DiskLightDelegate::SetEsmExponent(float exponent) { if (GetShadowsEnabled() && GetLightHandle().IsValid()) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.h index 6931068635..e0fd16f6be 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/DiskLightDelegate.h @@ -45,9 +45,7 @@ namespace AZ void SetShadowmapMaxSize(ShadowmapSize size) override; void SetShadowFilterMethod(ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(float widthInDegrees) override; - void SetPredictionSampleCount(uint32_t count) override; void SetFilteringSampleCount(uint32_t count) override; - void SetPcfMethod(PcfMethod method) override; void SetEsmExponent(float exponent) override; private: diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp index 17fb9a5e1d..659c394cba 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorAreaLightComponent.cpp @@ -162,29 +162,13 @@ namespace AZ ->Attribute(Edit::Attributes::Max, 1.f) ->Attribute(Edit::Attributes::Suffix, " deg") ->Attribute(Edit::Attributes::Visibility, &AreaLightComponentConfig::SupportsShadows) - ->Attribute(Edit::Attributes::ReadOnly, &AreaLightComponentConfig::IsSofteningBoundaryWidthDisabled) - ->DataElement(Edit::UIHandlers::Slider, &AreaLightComponentConfig::m_predictionSampleCount, "Prediction sample count", - "Sample count for prediction of whether the pixel is on the boundary. Specific to PCF and ESM+PCF.") - ->Attribute(Edit::Attributes::Min, 4) - ->Attribute(Edit::Attributes::Max, 16) - ->Attribute(Edit::Attributes::Visibility, &AreaLightComponentConfig::SupportsShadows) - ->Attribute(Edit::Attributes::ReadOnly, &AreaLightComponentConfig::IsPcfBoundarySearchDisabled) + ->Attribute(Edit::Attributes::ReadOnly, &AreaLightComponentConfig::IsEsmDisabled) ->DataElement(Edit::UIHandlers::Slider, &AreaLightComponentConfig::m_filteringSampleCount, "Filtering sample count", "This is only used when the pixel is predicted to be on the boundary. Specific to PCF and ESM+PCF.") ->Attribute(Edit::Attributes::Min, 4) ->Attribute(Edit::Attributes::Max, 64) ->Attribute(Edit::Attributes::Visibility, &AreaLightComponentConfig::SupportsShadows) ->Attribute(Edit::Attributes::ReadOnly, &AreaLightComponentConfig::IsShadowPcfDisabled) - ->DataElement( - Edit::UIHandlers::ComboBox, &AreaLightComponentConfig::m_pcfMethod, "PCF method", - "Type of PCF to use.\n" - " Bicubic: a smooth, fixed-size kernel \n" - " Boundary search: do several taps to first determine if we are on a shadow boundary\n") - ->EnumAttribute(PcfMethod::Bicubic, "Bicubic") - ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary search") - ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) - ->Attribute(Edit::Attributes::Visibility, &AreaLightComponentConfig::SupportsShadows) - ->Attribute(Edit::Attributes::ReadOnly, &AreaLightComponentConfig::IsShadowPcfDisabled) ->DataElement( Edit::UIHandlers::Slider, &AreaLightComponentConfig::m_esmExponent, "ESM exponent", "Exponent used by ESM shadows. " diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp index 18d9ad70e0..ef9c73c0b4 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/EditorDirectionalLightComponent.cpp @@ -141,14 +141,7 @@ namespace AZ ->Attribute(Edit::Attributes::Max, 0.1f) ->Attribute(Edit::Attributes::Suffix, " m") ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) - ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsSofteningBoundaryWidthDisabled) - ->DataElement(Edit::UIHandlers::Slider, &DirectionalLightComponentConfig::m_predictionSampleCount, "Prediction sample count", - "Sample count for prediction of whether the pixel is on the boundary. " - "Specific to PCF and ESM+PCF.") - ->Attribute(Edit::Attributes::Min, 4) - ->Attribute(Edit::Attributes::Max, 16) - ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) - ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsPcfBoundarySearchDisabled) + ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsEsmDisabled) ->DataElement(Edit::UIHandlers::Slider, &DirectionalLightComponentConfig::m_filteringSampleCount, "Filtering sample count", "This is used only when the pixel is predicted as on the boundary. " "Specific to PCF and ESM+PCF.") @@ -156,15 +149,6 @@ namespace AZ ->Attribute(Edit::Attributes::Max, 64) ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsShadowPcfDisabled) - ->DataElement( - Edit::UIHandlers::ComboBox, &DirectionalLightComponentConfig::m_pcfMethod, "Pcf method", - "Type of PCF to use.\n" - " Bicubic: a smooth, fixed-size kernel \n" - " Boundary search: do several taps to first determine if we are on a shadow boundary\n") - ->EnumAttribute(PcfMethod::Bicubic, "Bicubic") - ->EnumAttribute(PcfMethod::BoundarySearch, "Boundary search") - ->Attribute(Edit::Attributes::ChangeNotify, Edit::PropertyRefreshLevels::ValuesOnly) - ->Attribute(Edit::Attributes::ReadOnly, &DirectionalLightComponentConfig::IsShadowPcfDisabled) ->DataElement( Edit::UIHandlers::CheckBox, &DirectionalLightComponentConfig::m_receiverPlaneBiasEnabled, "Shadow Receiver Plane Bias Enable", diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateBase.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateBase.h index 415878081c..2bd25b76a3 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateBase.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateBase.h @@ -57,9 +57,7 @@ namespace AZ void SetShadowmapMaxSize([[maybe_unused]] ShadowmapSize size) override {}; void SetShadowFilterMethod([[maybe_unused]] ShadowFilterMethod method) override {}; void SetSofteningBoundaryWidthAngle([[maybe_unused]] float widthInDegrees) override {}; - void SetPredictionSampleCount([[maybe_unused]] uint32_t count) override {}; void SetFilteringSampleCount([[maybe_unused]] uint32_t count) override {}; - void SetPcfMethod([[maybe_unused]] PcfMethod method) override {}; void SetEsmExponent([[maybe_unused]] float esmExponent) override{}; protected: diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateInterface.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateInterface.h index f18c3ef9af..6d08971542 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateInterface.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/LightDelegateInterface.h @@ -77,12 +77,8 @@ namespace AZ virtual void SetShadowFilterMethod(ShadowFilterMethod method) = 0; //! Sets the width of boundary between shadowed area and lit area in degrees. virtual void SetSofteningBoundaryWidthAngle(float widthInDegrees) = 0; - //! Sets the sample count to predict the boundary of the shadow. Max 16, should be less than filtering sample count. - virtual void SetPredictionSampleCount(uint32_t count) = 0; //! Sets the sample count for filtering of the shadow boundary, max 64. virtual void SetFilteringSampleCount(uint32_t count) = 0; - //! Sets the Pcf (Percentage closer filtering) method to use. - virtual void SetPcfMethod(PcfMethod method) = 0; //! Sets the Esm exponent to use. Higher values produce a steeper falloff between light and shadow. virtual void SetEsmExponent(float exponent) = 0; }; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp index b4728c0c38..8853db5751 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.cpp @@ -100,14 +100,6 @@ namespace AZ::Render } } - void SphereLightDelegate::SetPredictionSampleCount(uint32_t count) - { - if (GetShadowsEnabled() && GetLightHandle().IsValid()) - { - GetFeatureProcessor()->SetPredictionSampleCount(GetLightHandle(), static_cast(count)); - } - } - void SphereLightDelegate::SetFilteringSampleCount(uint32_t count) { if (GetShadowsEnabled() && GetLightHandle().IsValid()) @@ -116,14 +108,6 @@ namespace AZ::Render } } - void SphereLightDelegate::SetPcfMethod(PcfMethod method) - { - if (GetShadowsEnabled() && GetLightHandle().IsValid()) - { - GetFeatureProcessor()->SetPcfMethod(GetLightHandle(), method); - } - } - void SphereLightDelegate::SetEsmExponent(float esmExponent) { if (GetShadowsEnabled() && GetLightHandle().IsValid()) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.h index 984af56c17..e2903b2d72 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/CoreLights/SphereLightDelegate.h @@ -35,9 +35,7 @@ namespace AZ void SetShadowmapMaxSize(ShadowmapSize size) override; void SetShadowFilterMethod(ShadowFilterMethod method) override; void SetSofteningBoundaryWidthAngle(float widthInDegrees) override; - void SetPredictionSampleCount(uint32_t count) override; void SetFilteringSampleCount(uint32_t count) override; - void SetPcfMethod(PcfMethod method) override; void SetEsmExponent(float esmExponent) override; private: From f7d4b8e70f5efd91b52a237dc31aaafa8d75f7f9 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Tue, 14 Sep 2021 19:11:11 -0500 Subject: [PATCH 307/355] Changing material component property inspector to dockable view pane MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Inspector is locked to a specific entity and material assignment ID • All modifications are made via the material component request bus • Removed complicated configuration management in editor material component • Multiple material property inspectors can be opened • Multiple materials across different entities can be edited simultaneously • No longer blocks the viewport or other interactions • Added functions to material component request bus for retrieving material slot labels, default materials, getting and setting property and UV overrides • Added more asset related types to material property value conversion from any • Added support for static heading widget on top of atom tools inspector, currently used for menus and messages WIP: Still investigating intermittent crash because of corrupt asset property Signed-off-by: Guthrie Adams --- .../Material/MaterialPropertyValue.cpp | 20 +- .../Inspector/InspectorRequestBus.h | 6 + .../Inspector/InspectorWidget.h | 5 +- .../InspectorPropertyGroupWidget.cpp | 2 +- .../Code/Source/Inspector/InspectorWidget.cpp | 56 +-- .../Code/Source/Inspector/InspectorWidget.ui | 147 ++++-- .../EditorMaterialSystemComponentRequestBus.h | 10 +- .../Material/MaterialComponentBus.h | 16 +- .../Material/EditorMaterialComponent.cpp | 194 ++------ .../Source/Material/EditorMaterialComponent.h | 16 +- .../EditorMaterialComponentInspector.cpp | 440 ++++++++++++------ .../EditorMaterialComponentInspector.h | 60 ++- .../Material/EditorMaterialComponentSlot.cpp | 155 +++--- .../Material/EditorMaterialComponentSlot.h | 19 +- .../EditorMaterialSystemComponent.cpp | 70 ++- .../Material/EditorMaterialSystemComponent.h | 16 +- .../Material/MaterialBrowserInteractions.cpp | 15 +- .../Material/MaterialComponentController.cpp | 126 +++-- .../Material/MaterialComponentController.h | 9 +- 19 files changed, 826 insertions(+), 556 deletions(-) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyValue.cpp b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyValue.cpp index 849e6cfffb..13ecea52dc 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyValue.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialPropertyValue.cpp @@ -109,11 +109,20 @@ namespace AZ { result.m_value = AZStd::any_cast(value); } + else if (value.is()) + { + result.m_value = Data::Asset( + AZStd::any_cast(value), azrtti_typeid()); + } + else if (value.is>()) + { + result.m_value = Data::Asset( + AZStd::any_cast>(value).GetId(), azrtti_typeid()); + } else if (value.is>()) { result.m_value = Data::Asset( - AZStd::any_cast>(value).GetId(), - azrtti_typeid()); + AZStd::any_cast>(value).GetId(), azrtti_typeid()); } else if (value.is>()) { @@ -129,7 +138,8 @@ namespace AZ } else { - AZ_Warning("MaterialPropertyValue", false, "Cannot convert any to variant. Type in any is: %s.", + AZ_Warning( + "MaterialPropertyValue", false, "Cannot convert any to variant. Type in any is: %s.", value.get_type_info().m_id.ToString().data()); } @@ -187,5 +197,5 @@ namespace AZ return result; } - } -} + } // namespace RPI +} // namespace AZ diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h index ec16653540..900dc3535c 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorRequestBus.h @@ -24,6 +24,12 @@ namespace AtomToolsFramework static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::ById; typedef AZ::Uuid BusIdType; + //! Add heading widget above scroll area + virtual void AddHeading(QWidget* headingWidget) = 0; + + //! Clear heading widgets + virtual void ClearHeading() = 0; + //! Clear all inspector groups and content virtual void Reset() = 0; diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h index 3d4e252967..adcd94ca10 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Inspector/InspectorWidget.h @@ -41,6 +41,10 @@ namespace AtomToolsFramework ~InspectorWidget() override; // InspectorRequestBus::Handler overrides... + void AddHeading(QWidget* headingWidget) override; + + void ClearHeading() override; + void Reset() override; void AddGroupsBegin() override; @@ -77,7 +81,6 @@ namespace AtomToolsFramework virtual void OnHeaderClicked(const AZStd::string& groupNameId, QMouseEvent* event); private: - QVBoxLayout* m_layout = nullptr; QScopedPointer m_ui; struct GroupWidgetPair diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp index 56f9538452..e1f8573bb3 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorPropertyGroupWidget.cpp @@ -38,7 +38,7 @@ namespace AtomToolsFramework m_propertyEditor->Setup(context, instanceNotificationHandler, false); m_propertyEditor->AddInstance(instance, instanceClassId, nullptr, instanceToCompare); m_propertyEditor->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - m_propertyEditor->QueueInvalidation(AzToolsFramework::PropertyModificationRefreshLevel::Refresh_EntireTree); + m_propertyEditor->InvalidateAll(); m_layout->addWidget(m_propertyEditor); setLayout(m_layout); diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp index fe3af1d0ef..5eda93ca59 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.cpp @@ -29,30 +29,40 @@ namespace AtomToolsFramework { } + void InspectorWidget::AddHeading(QWidget* headingWidget) + { + headingWidget->setParent(m_ui->m_headingSection); + m_ui->m_headingSectionLayout->addWidget(headingWidget); + } + + void InspectorWidget::ClearHeading() + { + qDeleteAll(m_ui->m_headingSection->findChildren(QString(), Qt::FindDirectChildrenOnly)); + qDeleteAll(m_ui->m_headingSectionLayout->children()); + } + void InspectorWidget::Reset() { - qDeleteAll(m_ui->m_propertyContent->children()); - m_layout = new QVBoxLayout(m_ui->m_propertyContent); - m_layout->setContentsMargins(0, 0, 0, 0); - m_layout->setSpacing(0); + qDeleteAll(m_ui->m_groupContents->findChildren(QString(), Qt::FindDirectChildrenOnly)); + qDeleteAll(m_ui->m_groupContentsLayout->children()); m_groups.clear(); } void InspectorWidget::AddGroupsBegin() { - setUpdatesEnabled(false); + setVisible(false); Reset(); } void InspectorWidget::AddGroupsEnd() { - m_layout->addStretch(); + m_ui->m_groupContentsLayout->addStretch(); // Scroll to top whenever there is new content - m_ui->m_propertyScrollArea->verticalScrollBar()->setValue(m_ui->m_propertyScrollArea->verticalScrollBar()->minimum()); + m_ui->m_groupScrollArea->verticalScrollBar()->setValue(m_ui->m_groupScrollArea->verticalScrollBar()->minimum()); - setUpdatesEnabled(true); + setVisible(true); } void InspectorWidget::AddGroup( @@ -61,14 +71,14 @@ namespace AtomToolsFramework const AZStd::string& groupDescription, QWidget* groupWidget) { - InspectorGroupHeaderWidget* groupHeader = new InspectorGroupHeaderWidget(m_ui->m_propertyContent); + InspectorGroupHeaderWidget* groupHeader = new InspectorGroupHeaderWidget(m_ui->m_groupContents); groupHeader->setText(groupDisplayName.c_str()); groupHeader->setToolTip(groupDescription.c_str()); - m_layout->addWidget(groupHeader); + m_ui->m_groupContentsLayout->addWidget(groupHeader); groupWidget->setObjectName(groupNameId.c_str()); - groupWidget->setParent(m_ui->m_propertyContent); - m_layout->addWidget(groupWidget); + groupWidget->setParent(m_ui->m_groupContents); + m_ui->m_groupContentsLayout->addWidget(groupWidget); m_groups[groupNameId] = {groupHeader, groupWidget}; @@ -101,28 +111,18 @@ namespace AtomToolsFramework bool InspectorWidget::IsGroupVisible(const AZStd::string& groupNameId) const { auto groupItr = m_groups.find(groupNameId); - if (groupItr != m_groups.end()) - { - return groupItr->second.m_header->isVisible(); - } - - return false; + return groupItr != m_groups.end() ? groupItr->second.m_header->isVisible() : false; } bool InspectorWidget::IsGroupHidden(const AZStd::string& groupNameId) const { auto groupItr = m_groups.find(groupNameId); - if (groupItr != m_groups.end()) - { - return groupItr->second.m_header->isHidden(); - } - - return false; + return groupItr != m_groups.end() ? groupItr->second.m_header->isHidden() : false; } void InspectorWidget::RefreshGroup(const AZStd::string& groupNameId) { - for (auto groupWidget : m_ui->m_propertyContent->findChildren(groupNameId.c_str())) + for (auto groupWidget : m_ui->m_groupContents->findChildren(groupNameId.c_str())) { groupWidget->Refresh(); } @@ -130,7 +130,7 @@ namespace AtomToolsFramework void InspectorWidget::RebuildGroup(const AZStd::string& groupNameId) { - for (auto groupWidget : m_ui->m_propertyContent->findChildren(groupNameId.c_str())) + for (auto groupWidget : m_ui->m_groupContents->findChildren(groupNameId.c_str())) { groupWidget->Rebuild(); } @@ -138,7 +138,7 @@ namespace AtomToolsFramework void InspectorWidget::RefreshAll() { - for (auto groupWidget : m_ui->m_propertyContent->findChildren()) + for (auto groupWidget : m_ui->m_groupContents->findChildren()) { groupWidget->Refresh(); } @@ -146,7 +146,7 @@ namespace AtomToolsFramework void InspectorWidget::RebuildAll() { - for (auto groupWidget : m_ui->m_propertyContent->findChildren()) + for (auto groupWidget : m_ui->m_groupContents->findChildren()) { groupWidget->Rebuild(); } diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.ui b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.ui index 54976db849..13f9c9e41c 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.ui +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Inspector/InspectorWidget.ui @@ -6,20 +6,14 @@ 0 0 - 693 - 798 + 685 + 775 - - - 0 - 0 - - Inspector - + 0 @@ -36,50 +30,103 @@ 0 - - - Qt::ScrollBarAsNeeded - - - true - - - - - 0 - 0 - 691 - 796 - + + + + 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - QFrame::StyledPanel + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 - - QFrame::Raised + + 0 - - - - + + 0 + + + 0 + + + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::ScrollBarAsNeeded + + + true + + + + + 0 + 0 + 683 + 763 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h index c75d596b52..47fad038b6 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/EditorMaterialSystemComponentRequestBus.h @@ -7,6 +7,8 @@ */ #pragma once +#include +#include #include #include @@ -23,8 +25,12 @@ namespace AZ static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusAddressPolicy::Single; static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; - //! Open document in material editor - virtual void OpenInMaterialEditor(const AZStd::string& sourcePath) = 0; + //! Open source material in material editor + virtual void OpenMaterialEditor(const AZStd::string& sourcePath) = 0; + + //! Open material instance editor + virtual void OpenMaterialInspector( + const AZ::EntityId& entityId, const AZ::Render::MaterialAssignmentId& materialAssignmentId) = 0; }; using EditorMaterialSystemComponentRequestBus = AZ::EBus; } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h index 01c87fa2fb..23fd276e95 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Include/AtomLyIntegration/CommonFeatures/Material/MaterialComponentBus.h @@ -23,6 +23,10 @@ namespace AZ virtual MaterialAssignmentMap GetOriginalMaterialAssignments() const = 0; //! Get material assignment id matching lod and label substring virtual MaterialAssignmentId FindMaterialAssignmentId(const MaterialAssignmentLodIndex lod, const AZStd::string& label) const = 0; + //! Get default material asset + virtual AZ::Data::AssetId GetDefaultMaterialAssetId(const MaterialAssignmentId& materialAssignmentId) const = 0; + //! Get material slot label + virtual AZStd::string GetMaterialSlotLabel(const MaterialAssignmentId& materialAssignmentId) const = 0; //! Set material overrides virtual void SetMaterialOverrides(const MaterialAssignmentMap& materials) = 0; //! Get material overrides @@ -38,7 +42,7 @@ namespace AZ //! Set material override virtual void SetMaterialOverride(const MaterialAssignmentId& materialAssignmentId, const AZ::Data::AssetId& materialAssetId) = 0; //! Get material override - virtual const AZ::Data::AssetId GetMaterialOverride(const MaterialAssignmentId& materialAssignmentId) const = 0; + virtual AZ::Data::AssetId GetMaterialOverride(const MaterialAssignmentId& materialAssignmentId) const = 0; //! Clear material override virtual void ClearMaterialOverride(const MaterialAssignmentId& materialAssignmentId) = 0; //! Set a material property override value wrapped by an AZStd::any @@ -95,8 +99,16 @@ namespace AZ virtual void ClearPropertyOverrides(const MaterialAssignmentId& materialAssignmentId) = 0; //! Clear all property overrides virtual void ClearAllPropertyOverrides() = 0; + //! Set Property overrides for a specific material assignment + virtual void SetPropertyOverrides( + const MaterialAssignmentId& materialAssignmentId, const MaterialPropertyOverrideMap& propertyOverrides) = 0; //! Get Property overrides for a specific material assignment virtual MaterialPropertyOverrideMap GetPropertyOverrides(const MaterialAssignmentId& materialAssignmentId) const = 0; + //! Set Model UV overrides for a specific material assignment + virtual void SetModelUvOverrides( + const MaterialAssignmentId& materialAssignmentId, const AZ::RPI::MaterialModelUvOverrideMap& modelUvOverrides) = 0; + //! Get Model UV overrides for a specific material assignment + virtual AZ::RPI::MaterialModelUvOverrideMap GetModelUvOverrides(const MaterialAssignmentId& materialAssignmentId) const = 0; }; using MaterialComponentRequestBus = EBus; @@ -106,7 +118,7 @@ namespace AZ { public: virtual void OnMaterialsUpdated([[maybe_unused]] const MaterialAssignmentMap& materials) {} - virtual void OnMaterialsEdited([[maybe_unused]] const MaterialAssignmentMap& materials) {} + virtual void OnMaterialsEdited() {} }; using MaterialComponentNotificationBus = EBus; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp index a4e058561e..848a6cc992 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.cpp @@ -215,91 +215,21 @@ namespace AZ void EditorMaterialComponent::SetPrimaryAsset(const AZ::Data::AssetId& assetId) { m_controller.SetDefaultMaterialOverride(assetId); + + MaterialComponentNotificationBus::Event(GetEntityId(), &MaterialComponentNotifications::OnMaterialsEdited); + + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); } AZ::u32 EditorMaterialComponent::OnConfigurationChanged() { - // Whenever the user makes changes to the editor component data the controller configuration must be rebuilt - m_configurationChangeInProgress = true; - UpdateController(); - m_configurationChangeInProgress = false; - return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; } void EditorMaterialComponent::OnMaterialAssignmentsChanged() { - // [GFX TODO][ATOM-4604] remove flag after mesh component material handling is fixed to not recreate/reload mesh for material changes - if (!m_configurationChangeInProgress) - { - UpdateMaterialSlots(); - } - } - - void EditorMaterialComponent::OnMaterialsEdited(const MaterialAssignmentMap& materials) - { - AzToolsFramework::ScopedUndoBatch undoBatch("Materials edited."); - SetDirty(); - - // The layout of the materials slots is already set. - // We just need to read the values from any edited overrides into the editor component - // and refresh. - for (auto& materialSlotPair : GetMaterialSlots()) - { - EditorMaterialComponentSlot& slot = *materialSlotPair.second; - const MaterialAssignment& materialFromController = GetMaterialAssignmentFromMap(materials, slot.m_id); - slot.m_materialAsset = materialFromController.m_materialAsset; - slot.m_propertyOverrides = materialFromController.m_propertyOverrides; - slot.m_matModUvOverrides = materialFromController.m_matModUvOverrides; - } - - AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( - &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, - AzToolsFramework::Refresh_AttributesAndValues); - } - - void EditorMaterialComponent::UpdateConfiguration(const MaterialComponentConfig& config) - { - m_controller.SetMaterialOverrides(config.m_materials); - } - - void EditorMaterialComponent::UpdateController() - { - SetDirty(); - - // Build the controller configuration from the editor configuration - MaterialComponentConfig config = m_controller.GetConfiguration(); - config.m_materials.clear(); - - for (const auto& materialSlotPair : GetMaterialSlots()) - { - const EditorMaterialComponentSlot* materialSlot = materialSlotPair.second; - - // Do not apply materials for lods if they are disabled - if (materialSlot->m_id.m_lodIndex != MaterialAssignmentId::NonLodIndex && !m_materialSlotsByLodEnabled) - { - continue; - } - - // Only material slots with a valid asset IDs or property overrides will be copied - // to minimize the amount of data stored in the controller and game component - if (materialSlot->m_materialAsset.GetId().IsValid()) - { - MaterialAssignment& materialAssignment = config.m_materials[materialSlot->m_id]; - materialAssignment.m_materialAsset = materialSlot->m_materialAsset; - materialAssignment.m_propertyOverrides = materialSlot->m_propertyOverrides; - materialAssignment.m_matModUvOverrides = materialSlot->m_matModUvOverrides; - } - else if (!materialSlot->m_propertyOverrides.empty() || !materialSlot->m_matModUvOverrides.empty()) - { - MaterialAssignment& materialAssignment = config.m_materials[materialSlot->m_id]; - materialAssignment.m_materialAsset = materialSlot->m_defaultMaterialAsset; - materialAssignment.m_propertyOverrides = materialSlot->m_propertyOverrides; - materialAssignment.m_matModUvOverrides = materialSlot->m_matModUvOverrides; - } - } - - UpdateConfiguration(config); + UpdateMaterialSlots(); } void EditorMaterialComponent::UpdateMaterialSlots() @@ -315,64 +245,18 @@ namespace AZ MaterialAssignmentMap materialsFromSource; MaterialReceiverRequestBus::EventResult(materialsFromSource, GetEntityId(), &MaterialReceiverRequestBus::Events::GetMaterialAssignments); - RPI::ModelMaterialSlotMap modelMaterialSlots; - MaterialReceiverRequestBus::EventResult(modelMaterialSlots, GetEntityId(), &MaterialReceiverRequestBus::Events::GetModelMaterialSlots); - // Generate the table of editable materials using the source data to define number of groups, elements, and initial values for (const auto& materialPair : materialsFromSource) { // Setup the material slot entry EditorMaterialComponentSlot slot; + slot.m_entityId = GetEntityId(); slot.m_id = materialPair.first; - slot.m_materialChangedCallback = [this]() { - // This callback is triggered whenever an individual material slot changes outside of normal inspector interactions - // So we must manually handle undo, update configuration, and refresh the inspector to display the new values - AzToolsFramework::ScopedUndoBatch undoBatch("Material slot changed."); - SetDirty(); - - OnConfigurationChanged(); - - AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( - &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, - AzToolsFramework::Refresh_AttributesAndValues); - }; - slot.m_propertyChangedCallback = [this]() { - OnConfigurationChanged(); - }; - - const char* UnknownSlotName = ""; - - // If this is the default material assignment ID then it represents the default slot which is not contained in any other group - if (slot.m_id == DefaultMaterialAssignmentId) - { - slot.m_label = "Default Material"; - } - else - { - auto slotIter = modelMaterialSlots.find(slot.m_id.m_materialSlotStableId); - if (slotIter != modelMaterialSlots.end()) - { - const Name& displayName = slotIter->second.m_displayName; - slot.m_label = !displayName.IsEmpty() ? displayName.GetStringView() : UnknownSlotName; - - slot.m_defaultMaterialAsset = slotIter->second.m_defaultMaterialAsset; - } - else - { - slot.m_label = UnknownSlotName; - } - } // if material is present in controller configuration, assign its data const MaterialAssignment& materialFromController = GetMaterialAssignmentFromMap(config.m_materials, slot.m_id); slot.m_materialAsset = materialFromController.m_materialAsset; - slot.m_propertyOverrides = materialFromController.m_propertyOverrides; - slot.m_matModUvOverrides = materialFromController.m_matModUvOverrides; - - // Attempt to get the UV names from model meshes. - MaterialReceiverRequestBus::EventResult(slot.m_modelUvNames, GetEntityId(), &MaterialReceiverRequestBus::Events::GetModelUvNames); - if (slot.m_id.IsDefault()) { m_defaultMaterialSlot = slot; @@ -388,7 +272,8 @@ namespace AZ if (slot.m_id.IsLodAndSlotId()) { // Resize the containers to fit all elements - m_materialSlotsByLod.resize(AZ::GetMax(m_materialSlotsByLod.size(), aznumeric_cast(slot.m_id.m_lodIndex + 1))); + m_materialSlotsByLod.resize( + AZ::GetMax(m_materialSlotsByLod.size(), aznumeric_cast(slot.m_id.m_lodIndex + 1))); m_materialSlotsByLod[slot.m_id.m_lodIndex].push_back(slot); continue; } @@ -404,9 +289,10 @@ namespace AZ [](const auto& a, const auto& b) { return a.GetLabel() < b.GetLabel(); }); } + MaterialComponentNotificationBus::Event(GetEntityId(), &MaterialComponentNotifications::OnMaterialsEdited); + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( - &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, - AzToolsFramework::Refresh_EntireTree); + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree); } AZ::u32 EditorMaterialComponent::ResetMaterialSlots() @@ -414,15 +300,15 @@ namespace AZ AzToolsFramework::ScopedUndoBatch undoBatch("Resetting materials."); SetDirty(); - UpdateConfiguration(MaterialComponentConfig()); + m_controller.SetMaterialOverrides(MaterialAssignmentMap()); UpdateMaterialSlots(); m_materialSlotsByLodEnabled = false; - // Forcing refresh in case triggered from context menu action + MaterialComponentNotificationBus::Event(GetEntityId(), &MaterialComponentNotifications::OnMaterialsEdited); + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( - &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, - AzToolsFramework::Refresh_EntireTree); + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree); return AZ::Edit::PropertyRefreshLevels::EntireTree; } @@ -431,26 +317,26 @@ namespace AZ { AzToolsFramework::ScopedUndoBatch undoBatch("Generating materials."); SetDirty(); - + // First generating a unique set of all material asset IDs that will be used for source data generation AZStd::unordered_map assetIdMap; auto materialSlots = GetMaterialSlots(); for (auto& materialSlotPair : materialSlots) { - Data::AssetId defaultMaterialAssetId = materialSlotPair.second->m_defaultMaterialAsset.GetId(); + Data::AssetId defaultMaterialAssetId = materialSlotPair.second->GetDefaultAssetId(); if (defaultMaterialAssetId.IsValid()) { assetIdMap[defaultMaterialAssetId] = materialSlotPair.second->GetLabel(); } } - // Convert the unique set of asset IDs into export items that can be configured in the dialog + // Convert the unique set of asset IDs into export items that can be configured in the dialog // The order should not matter because the table in the dialog can sort itself for a specific row EditorMaterialComponentExporter::ExportItemsContainer exportItems; for (auto assetIdInfo : assetIdMap) { - EditorMaterialComponentExporter::ExportItem exportItem{assetIdInfo.first, assetIdInfo.second}; + EditorMaterialComponentExporter::ExportItem exportItem{ assetIdInfo.first, assetIdInfo.second }; exportItems.push_back(exportItem); } @@ -474,9 +360,9 @@ namespace AZ if (editorMaterialSlot) { // We need to check whether replaced material corresponds to this slot's default material. - if (editorMaterialSlot->m_defaultMaterialAsset.GetId() == exportItem.GetOriginalAssetId()) + if (editorMaterialSlot->GetDefaultAssetId() == exportItem.GetOriginalAssetId()) { - editorMaterialSlot->m_materialAsset.Create(assetIdOutcome.GetValue()); + editorMaterialSlot->SetAsset(assetIdOutcome.GetValue()); } } } @@ -484,17 +370,31 @@ namespace AZ } } - // Forcing refresh in case triggered from context menu action - AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( - &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, - AzToolsFramework::Refresh_AttributesAndValues); + MaterialComponentNotificationBus::Event(GetEntityId(), &MaterialComponentNotifications::OnMaterialsEdited); - return OnConfigurationChanged(); + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); + + return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; } AZ::u32 EditorMaterialComponent::OnLodsToggled() { - OnConfigurationChanged(); + AzToolsFramework::ScopedUndoBatch undoBatch("Toggling LOD materials."); + SetDirty(); + + if (!m_materialSlotsByLodEnabled) + { + MaterialComponentConfig config = m_controller.GetConfiguration(); + AZStd::erase_if(config.m_materials, [](const auto& item) { + const auto& [key, value] = item; + return key.m_lodIndex != MaterialAssignmentId::NonLodIndex; + }); + m_controller.SetMaterialOverrides(config.m_materials); + } + + MaterialComponentNotificationBus::Event(GetEntityId(), &MaterialComponentNotifications::OnMaterialsEdited); + return AZ::Edit::PropertyRefreshLevels::EntireTree; } @@ -541,11 +441,14 @@ namespace AZ materialSlots[slot.m_id] = &slot; } - for (auto& slotsForLod : component.m_materialSlotsByLod) + if (component.m_materialSlotsByLodEnabled) { - for (auto& slot : slotsForLod) + for (auto& slotsForLod : component.m_materialSlotsByLod) { - materialSlots[slot.m_id] = &slot; + for (auto& slot : slotsForLod) + { + materialSlots[slot.m_id] = &slot; + } } } } @@ -565,4 +468,3 @@ namespace AZ } } // namespace Render } // namespace AZ - diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h index 88ffef9366..6ae96b5c3c 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponent.h @@ -8,11 +8,11 @@ #pragma once +#include #include #include -#include -#include #include +#include namespace AZ { @@ -49,16 +49,6 @@ namespace AZ //! MaterialReceiverNotificationBus::Handler overrides... void OnMaterialAssignmentsChanged() override; - //! MaterialComponentNotificationBus::Handler overrides... - void OnMaterialsEdited(const MaterialAssignmentMap& materials) override; - - // Apply a material component configuration to the active controller - void UpdateConfiguration(const MaterialComponentConfig& config); - - // Converts the editor components material slots to the material component - // configuration and updates the controller - void UpdateController(); - // Regenerates the editor component material slots based on the material and // LOD mapping from the model or other consumer of materials. // If any corresponding material assignments are found in the component @@ -101,8 +91,6 @@ namespace AZ EditorMaterialComponentSlotsByLodContainer m_materialSlotsByLod; bool m_materialSlotsByLodEnabled = false; - bool m_configurationChangeInProgress = false; // when true, model changes are ignored - static const char* GenerateMaterialsButtonText; static const char* GenerateMaterialsToolTipText; static const char* ResetMaterialsButtonText; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp index b9a4adc068..939417f236 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp @@ -27,19 +27,16 @@ #include #include #include - #include +#include +#include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // disable warnings spawned by QT #include -#include -#include #include -#include #include #include #include -#include #include AZ_POP_DISABLE_WARNING @@ -49,26 +46,59 @@ namespace AZ { namespace EditorMaterialComponentInspector { - MaterialPropertyInspector::MaterialPropertyInspector( - const AZStd::string& slotName, const AZ::Data::AssetId& assetId, PropertyChangedCallback propertyChangedCallback, - QWidget* parent) + MaterialPropertyInspector::MaterialPropertyInspector(QWidget* parent) : AtomToolsFramework::InspectorWidget(parent) - , m_slotName(slotName) - , m_materialAssetId(assetId) - , m_propertyChangedCallback(propertyChangedCallback) { + // Create the menu button + QToolButton* menuButton = new QToolButton(this); + menuButton->setAutoRaise(true); + menuButton->setIcon(QIcon(":/Cards/img/UI20/Cards/menu_ico.svg")); + menuButton->setVisible(true); + QObject::connect(menuButton, &QToolButton::clicked, this, [this]() { OpenMenu(); }); + AddHeading(menuButton); + + m_messageLabel = new QLabel(this); + m_messageLabel->setWordWrap(true); + m_messageLabel->setVisible(true); + m_messageLabel->setAlignment(Qt::AlignCenter); + m_messageLabel->setText(tr("Material not available")); + AddHeading(m_messageLabel); + + AZ::EntitySystemBus::Handler::BusConnect(); } MaterialPropertyInspector::~MaterialPropertyInspector() { AtomToolsFramework::InspectorRequestBus::Handler::BusDisconnect(); + AZ::EntitySystemBus::Handler::BusDisconnect(); + AZ::TickBus::Handler::BusDisconnect(); + MaterialComponentNotificationBus::Handler::BusDisconnect(); } - bool MaterialPropertyInspector::LoadMaterial() + bool MaterialPropertyInspector::LoadMaterial( + const AZ::EntityId& entityId, const AZ::Render::MaterialAssignmentId& materialAssignmentId) { - if (!EditorMaterialComponentUtil::LoadMaterialEditDataFromAssetId(m_materialAssetId, m_editData)) + UnloadMaterial(); + + m_entityId = entityId; + m_materialAssignmentId = materialAssignmentId; + MaterialComponentNotificationBus::Handler::BusDisconnect(); + MaterialComponentNotificationBus::Handler::BusConnect(m_entityId); + + AZ::Data::AssetId materialAssetId = {}; + MaterialComponentRequestBus::EventResult( + materialAssetId, m_entityId, &MaterialComponentRequestBus::Events::GetMaterialOverride, m_materialAssignmentId); + + if (!materialAssetId.IsValid()) + { + UnloadMaterial(); + return false; + } + + if (!EditorMaterialComponentUtil::LoadMaterialEditDataFromAssetId(materialAssetId, m_editData)) { AZ_Warning("AZ::Render::EditorMaterialComponentInspector", false, "Failed to load material data."); + UnloadMaterial(); return false; } @@ -77,6 +107,7 @@ namespace AZ if (!m_materialInstance) { AZ_Error("AZ::Render::EditorMaterialComponentInspector", false, "Material instance could not be created."); + UnloadMaterial(); return false; } @@ -102,15 +133,36 @@ namespace AZ } } + Populate(); + m_messageLabel->setVisible(false); return true; } + void MaterialPropertyInspector::UnloadMaterial() + { + Reset(); + m_editData = EditorMaterialComponentUtil::MaterialEditData(); + m_materialInstance = {}; + m_dirtyPropertyFlags.set(); + m_editorFunctors = {}; + m_internalEditNotification = {}; + m_messageLabel->setVisible(true); + m_messageLabel->setText(tr("Material not available")); + } + + bool MaterialPropertyInspector::IsLoaded() const + { + return m_entityId.IsValid() && m_materialInstance && m_editData.m_materialAsset.IsReady(); + } + void MaterialPropertyInspector::Reset() { m_activeProperty = {}; m_groups = {}; m_dirtyPropertyFlags.set(); + m_internalEditNotification = {}; + AZ::TickBus::Handler::BusDisconnect(); AtomToolsFramework::InspectorRequestBus::Handler::BusDisconnect(); AtomToolsFramework::InspectorWidget::Reset(); } @@ -150,9 +202,18 @@ namespace AZ QFileInfo materialTypeSourceFileInfo(m_editData.m_materialTypeSourcePath.c_str()); QFileInfo materialParentSourceFileInfo(AZ::RPI::AssetUtils::GetSourcePathByAssetId(m_editData.m_materialParentAsset.GetId()).c_str()); + AZStd::string entityName; + AZ::ComponentApplicationBus::BroadcastResult( + entityName, &AZ::ComponentApplicationBus::Events::GetEntityName, m_entityId); + + AZStd::string slotName; + MaterialComponentRequestBus::EventResult( + slotName, m_entityId, &MaterialComponentRequestBus::Events::GetMaterialSlotLabel, m_materialAssignmentId); + QString materialInfo; materialInfo += tr(""); - materialInfo += tr("").arg(m_slotName.c_str()); + materialInfo += tr("").arg(entityName.c_str()); + materialInfo += tr("").arg(slotName.c_str()); if (!materialFileInfo.fileName().isEmpty()) { materialInfo += tr("").arg(materialFileInfo.fileName()); @@ -209,16 +270,8 @@ namespace AZ } // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties - const AZ::Crc32 saveStateKey(AZStd::string::format( - "MaterialPropertyInspector::PropertyGroup::%s::%s", m_materialAssetId.ToString().c_str(), - groupNameId.c_str())); auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, &group, group.TYPEINFO_Uuid(), this, this, saveStateKey, - [](const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) { - AZ_UNUSED(source); - const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(target); - return property && AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); - }); + &group, nullptr, group.TYPEINFO_Uuid(), this, this, GetSaveStateKeyForGroup(groupNameId)); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } @@ -262,35 +315,90 @@ namespace AZ } // Passing in same group as main and comparison instance to enable custom value comparison for highlighting modified properties - const AZ::Crc32 saveStateKey(AZStd::string::format( - "MaterialPropertyInspector::PropertyGroup::%s::%s", m_materialAssetId.ToString().c_str(), - groupNameId.c_str())); auto propertyGroupWidget = new AtomToolsFramework::InspectorPropertyGroupWidget( - &group, &group, group.TYPEINFO_Uuid(), this, this, saveStateKey, - [](const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) { - AZ_UNUSED(source); - const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(target); - return property && AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); - }); + &group, nullptr, group.TYPEINFO_Uuid(), this, this, GetSaveStateKeyForGroup(groupNameId)); AddGroup(groupNameId, groupDisplayName, groupDescription, propertyGroupWidget); } AddGroupsEnd(); - m_dirtyPropertyFlags.set(); - RunEditorMaterialFunctors(); + LoadOverridesFromEntity(); } - void MaterialPropertyInspector::RunPropertyChangedCallback() + void MaterialPropertyInspector::LoadOverridesFromEntity() { - if (m_propertyChangedCallback) + if (!IsLoaded()) { - m_propertyChangedCallback(m_editData.m_materialPropertyOverrideMap); + return; + } + + m_editData.m_materialPropertyOverrideMap.clear(); + MaterialComponentRequestBus::EventResult( + m_editData.m_materialPropertyOverrideMap, m_entityId, &MaterialComponentRequestBus::Events::GetPropertyOverrides, + m_materialAssignmentId); + + for (auto& group : m_groups) + { + for (auto& property : group.second.m_properties) + { + const AtomToolsFramework::DynamicPropertyConfig& propertyConfig = property.GetConfig(); + const auto overrideItr = m_editData.m_materialPropertyOverrideMap.find(propertyConfig.m_id); + const auto& editValue = overrideItr != m_editData.m_materialPropertyOverrideMap.end() ? overrideItr->second : propertyConfig.m_originalValue; + + // This first converts to an acceptable runtime type in case the value came from script + const auto propertyIndex = m_materialInstance->FindPropertyIndex(property.GetId()); + if (!propertyIndex.IsNull()) + { + const auto runtimeValue = AtomToolsFramework::ConvertToRuntimeType(editValue); + if (runtimeValue.IsValid()) + { + property.SetValue(AtomToolsFramework::ConvertToEditableType(runtimeValue)); + } + } + else + { + property.SetValue(editValue); + } + + UpdateMaterialInstanceProperty(property); + } + } + + m_dirtyPropertyFlags.set(); + RunEditorMaterialFunctors(); + RefreshAll(); + } + + void MaterialPropertyInspector::SaveOverridesToEntity(bool commitChanges) + { + if (!IsLoaded()) + { + return; + } + + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetPropertyOverrides, m_materialAssignmentId, + m_editData.m_materialPropertyOverrideMap); + + if (commitChanges) + { + AzToolsFramework::ScopedUndoBatch undoBatch("Material slot changed."); + AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity, m_entityId); + + m_internalEditNotification = true; + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited); + m_internalEditNotification = false; } } void MaterialPropertyInspector::RunEditorMaterialFunctors() { + if (!IsLoaded()) + { + return; + } + AZStd::unordered_set changedPropertyNames; AZStd::unordered_set changedPropertyGroupNames; @@ -337,11 +445,13 @@ namespace AZ // Apply any changes to material property meta data back to the editor property configurations for (auto& groupPair : m_groups) { - AZ::Name groupName{groupPair.first}; + AZ::Name groupName{ groupPair.first }; if (changedPropertyGroupNames.find(groupName) != changedPropertyGroupNames.end()) { - SetGroupVisible(groupPair.first, propertyGroupDynamicMetadata[groupName].m_visibility == AZ::RPI::MaterialPropertyGroupVisibility::Enabled); + SetGroupVisible( + groupPair.first, + propertyGroupDynamicMetadata[groupName].m_visibility == AZ::RPI::MaterialPropertyGroupVisibility::Enabled); } for (auto& property : groupPair.second.m_properties) @@ -355,12 +465,12 @@ namespace AZ if (oldReadOnly != propertyConfig.m_readOnly) { - RefreshAll(); + RefreshGroup(groupPair.first); } if (oldVisible != propertyConfig.m_visible) { - RebuildAll(); + RebuildGroup(groupPair.first); } } } @@ -368,57 +478,37 @@ namespace AZ void MaterialPropertyInspector::UpdateMaterialInstanceProperty(const AtomToolsFramework::DynamicProperty& property) { - if (m_materialInstance) + if (!IsLoaded()) { - const auto propertyIndex = m_materialInstance->FindPropertyIndex(property.GetId()); - if (!propertyIndex.IsNull()) - { - m_dirtyPropertyFlags.set(propertyIndex.GetIndex()); + return; + } - const auto runtimeValue = AtomToolsFramework::ConvertToRuntimeType(property.GetValue()); - if (runtimeValue.IsValid()) - { - m_materialInstance->SetPropertyValue(propertyIndex, runtimeValue); - } + const auto propertyIndex = m_materialInstance->FindPropertyIndex(property.GetId()); + if (!propertyIndex.IsNull()) + { + m_dirtyPropertyFlags.set(propertyIndex.GetIndex()); + + const auto runtimeValue = AtomToolsFramework::ConvertToRuntimeType(property.GetValue()); + if (runtimeValue.IsValid()) + { + m_materialInstance->SetPropertyValue(propertyIndex, runtimeValue); } } } - void MaterialPropertyInspector::SetOverrides(const MaterialPropertyOverrideMap& propertyOverrideMap) + AZ::Crc32 MaterialPropertyInspector::GetSaveStateKeyForGroup(const AZStd::string& groupNameId) const { - m_editData.m_materialPropertyOverrideMap = propertyOverrideMap; + return AZ::Crc32(AZStd::string::format( + "MaterialPropertyInspector::PropertyGroup::%s::%s", m_editData.m_materialAssetId.ToString().c_str(), + groupNameId.c_str())); + } - for (auto& group : m_groups) - { - for (auto& property : group.second.m_properties) - { - const AtomToolsFramework::DynamicPropertyConfig& propertyConfig = property.GetConfig(); - const auto overrideItr = m_editData.m_materialPropertyOverrideMap.find(propertyConfig.m_id); - const auto& editValue = overrideItr != m_editData.m_materialPropertyOverrideMap.end() ? overrideItr->second : propertyConfig.m_originalValue; - - // This first converts to an acceptable runtime type in case the value came from script - const auto propertyIndex = m_materialInstance->FindPropertyIndex(property.GetId()); - if (!propertyIndex.IsNull()) - { - const auto runtimeValue = AtomToolsFramework::ConvertToRuntimeType(editValue); - if (runtimeValue.IsValid()) - { - property.SetValue(AtomToolsFramework::ConvertToEditableType(runtimeValue)); - } - } - else - { - property.SetValue(editValue); - } - - UpdateMaterialInstanceProperty(property); - } - } - - m_dirtyPropertyFlags.set(); - RunPropertyChangedCallback(); - RunEditorMaterialFunctors(); - RebuildAll(); + bool MaterialPropertyInspector::AreNodePropertyValuesEqual( + const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target) + { + AZ_UNUSED(source); + const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(target); + return property && AtomToolsFramework::ArePropertyValuesEqual(property->GetValue(), property->GetConfig().m_parentValue); } bool MaterialPropertyInspector::SaveMaterial() const @@ -446,7 +536,8 @@ namespace AZ bool MaterialPropertyInspector::SaveMaterialToSource() const { - const QString saveFilePath = AtomToolsFramework::GetSaveFileInfo(m_editData.m_materialSourcePath.c_str()).absoluteFilePath(); + const QString saveFilePath = + AtomToolsFramework::GetSaveFileInfo(m_editData.m_materialSourcePath.c_str()).absoluteFilePath(); if (saveFilePath.isEmpty()) { return false; @@ -463,13 +554,13 @@ namespace AZ bool MaterialPropertyInspector::HasMaterialSource() const { - return !m_editData.m_materialSourcePath.empty() && + return IsLoaded() && !m_editData.m_materialSourcePath.empty() && AZ::StringFunc::Path::IsExtension(m_editData.m_materialSourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension); } bool MaterialPropertyInspector::HasMaterialParentSource() const { - return !m_editData.m_materialParentSourcePath.empty() && + return IsLoaded() && !m_editData.m_materialParentSourcePath.empty() && AZ::StringFunc::Path::IsExtension( m_editData.m_materialParentSourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension); } @@ -479,7 +570,7 @@ namespace AZ if (HasMaterialSource()) { EditorMaterialSystemComponentRequestBus::Broadcast( - &EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, m_editData.m_materialSourcePath); + &EditorMaterialSystemComponentRequestBus::Events::OpenMaterialEditor, m_editData.m_materialSourcePath); } } @@ -488,10 +579,42 @@ namespace AZ if (HasMaterialParentSource()) { EditorMaterialSystemComponentRequestBus::Broadcast( - &EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, m_editData.m_materialParentSourcePath); + &EditorMaterialSystemComponentRequestBus::Events::OpenMaterialEditor, m_editData.m_materialParentSourcePath); } } + void MaterialPropertyInspector::OpenMenu() + { + QAction* action = nullptr; + + QMenu menu(this); + action = menu.addAction("Clear Overrides", [this] { + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetPropertyOverrides, m_materialAssignmentId, + MaterialPropertyOverrideMap()); + QueueUpdateUI(); + }); + action->setEnabled(IsLoaded()); + + menu.addSeparator(); + + action = menu.addAction("Save Material", [this] { SaveMaterial(); }); + action->setEnabled(IsLoaded()); + + action = menu.addAction("Save Material To Source", [this] { SaveMaterialToSource(); }); + action->setEnabled(HasMaterialSource()); + + menu.addSeparator(); + + action = menu.addAction("Open Source Material In Editor", [this] { OpenMaterialSourceInEditor(); }); + action->setEnabled(HasMaterialSource()); + + action = menu.addAction("Open Parent Material In Editor", [this] { OpenMaterialParentSourceInEditor(); }); + action->setEnabled(HasMaterialParentSource()); + + menu.exec(QCursor::pos()); + } + const EditorMaterialComponentUtil::MaterialEditData& MaterialPropertyInspector::GetEditData() const { return m_editData; @@ -501,7 +624,8 @@ namespace AZ { // For some reason the reflected property editor notifications are not symmetrical // This function is called continuously anytime a property changes until the edit has completed - // Because of that, we have to track whether or not we are continuing to edit the same property to know when editing has started and ended + // Because of that, we have to track whether or not we are continuing to edit the same property to know when editing has + // started and ended const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(pNode); if (property) { @@ -521,15 +645,16 @@ namespace AZ { m_editData.m_materialPropertyOverrideMap[m_activeProperty->GetId()] = m_activeProperty->GetValue(); UpdateMaterialInstanceProperty(*m_activeProperty); - RunPropertyChangedCallback(); + SaveOverridesToEntity(false); } } } void MaterialPropertyInspector::SetPropertyEditingComplete(AzToolsFramework::InstanceDataNode* pNode) { - // As above, there are symmetrical functions on the notification interface for when editing begins and ends and has been completed but they are not being called following that pattern. - // when this function executes the changes to the property are ready to be committed or reverted + // As above, there are symmetrical functions on the notification interface for when editing begins and ends and has been + // completed but they are not being called following that pattern. when this function executes the changes to the property + // are ready to be committed or reverted const AtomToolsFramework::DynamicProperty* property = AtomToolsFramework::FindDynamicPropertyForInstanceDataNode(pNode); if (property) { @@ -537,85 +662,92 @@ namespace AZ { m_editData.m_materialPropertyOverrideMap[m_activeProperty->GetId()] = m_activeProperty->GetValue(); UpdateMaterialInstanceProperty(*m_activeProperty); - RunPropertyChangedCallback(); + SaveOverridesToEntity(true); RunEditorMaterialFunctors(); m_activeProperty = nullptr; } } } - bool OpenInspectorDialog( - const AZStd::string& slotName, const AZ::Data::AssetId& assetId, MaterialPropertyOverrideMap propertyOverrideMap, - PropertyChangedCallback propertyChangedCallback) + void MaterialPropertyInspector::OnEntityInitialized(const AZ::EntityId& entityId) { - QWidget* activeWindow = nullptr; - AzToolsFramework::EditorWindowRequestBus::BroadcastResult(activeWindow, &AzToolsFramework::EditorWindowRequests::GetAppMainWindow); - - // Constructing a dialog with a table to display all configurable material export items - QDialog dialog(activeWindow); - dialog.setWindowTitle("Material Inspector"); - - MaterialPropertyInspector* inspector = new MaterialPropertyInspector(slotName, assetId, propertyChangedCallback, &dialog); - if (!inspector->LoadMaterial()) + if (m_entityId == entityId) { - return false; + UnloadMaterial(); } + } - inspector->Populate(); - inspector->SetOverrides(propertyOverrideMap); + void MaterialPropertyInspector::OnEntityDestroyed(const AZ::EntityId& entityId) + { + if (m_entityId == entityId) + { + UnloadMaterial(); + } + } - // Create the menu button - QToolButton* menuButton = new QToolButton(&dialog); - menuButton->setAutoRaise(true); - menuButton->setIcon(QIcon(":/Cards/img/UI20/Cards/menu_ico.svg")); - menuButton->setVisible(true); - QObject::connect(menuButton, &QToolButton::clicked, &dialog, [&]() { - QAction* action = nullptr; + void MaterialPropertyInspector::OnEntityActivated(const AZ::EntityId& entityId) + { + if (m_entityId == entityId) + { + QueueUpdateUI(); + } + } - QMenu menu(&dialog); - action = menu.addAction("Clear Overrides", [&] { inspector->SetOverrides(MaterialPropertyOverrideMap()); }); - action = menu.addAction("Revert Changes", [&] { inspector->SetOverrides(propertyOverrideMap); }); + void MaterialPropertyInspector::OnEntityDeactivated(const AZ::EntityId& entityId) + { + if (m_entityId == entityId) + { + UnloadMaterial(); + } + } - menu.addSeparator(); - action = menu.addAction("Save Material", [&] { inspector->SaveMaterial(); }); - action = menu.addAction("Save Material To Source", [&] { inspector->SaveMaterialToSource(); }); - action->setEnabled(inspector->HasMaterialSource()); + void MaterialPropertyInspector::OnEntityNameChanged(const AZ::EntityId& entityId, const AZStd::string& name) + { + AZ_UNUSED(name); + if (m_entityId == entityId) + { + QueueUpdateUI(); + } + } - menu.addSeparator(); - action = menu.addAction("Open Source Material In Editor", [&] { inspector->OpenMaterialSourceInEditor(); }); - action->setEnabled(inspector->HasMaterialSource()); - action = menu.addAction("Open Parent Material In Editor", [&] { inspector->OpenMaterialParentSourceInEditor(); }); - action->setEnabled(inspector->HasMaterialParentSource()); - menu.exec(QCursor::pos()); - }); + void MaterialPropertyInspector::OnTick(float deltaTime, ScriptTimePoint time) + { + AZ_UNUSED(time); + AZ_UNUSED(deltaTime); + UpdateUI(); + AZ::TickBus::Handler::BusDisconnect(); + } - QDialogButtonBox* buttonBox = new QDialogButtonBox(&dialog); - buttonBox->setStandardButtons(QDialogButtonBox::Cancel | QDialogButtonBox::Ok); - QObject::connect(buttonBox, &QDialogButtonBox::accepted, &dialog, &QDialog::accept); - QObject::connect(buttonBox, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); + void MaterialPropertyInspector::OnMaterialsEdited() + { + if (!m_internalEditNotification) + { + QueueUpdateUI(); + } + } - QObject::connect(&dialog, &QDialog::rejected, &dialog, [&] { inspector->SetOverrides(propertyOverrideMap); }); + void MaterialPropertyInspector::UpdateUI() + { + AZ::Data::AssetId assetId; + MaterialComponentRequestBus::EventResult( + assetId, m_entityId, &MaterialComponentRequestBus::Events::GetMaterialOverride, m_materialAssignmentId); - QVBoxLayout* dialogLayout = new QVBoxLayout(&dialog); - dialogLayout->addWidget(menuButton); - dialogLayout->addWidget(inspector); - dialogLayout->addWidget(buttonBox); - dialog.setLayout(dialogLayout); - dialog.setModal(true); + if (IsLoaded() && m_editData.m_materialAssetId == assetId) + { + LoadOverridesFromEntity(); + } + else + { + LoadMaterial(m_entityId, m_materialAssignmentId); + } + } - // Forcing the initial dialog size to accomodate typical content. - // Temporarily settng fixed size because dialog.show/exec invokes WindowDecorationWrapper::showEvent. - // This forces the dialog to be centered and sized based on the layout of content. - // Resizing the dialog after show will not be centered and moving the dialog programatically doesn't m0ve the custmk frame. - dialog.setFixedSize(500, 800); - dialog.show(); - - // Removing fixed size to allow drag resizing - dialog.setMinimumSize(0, 0); - dialog.setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); - - // Return true if the user press the export button - return dialog.exec() == QDialog::Accepted; + void MaterialPropertyInspector::QueueUpdateUI() + { + if (!AZ::TickBus::Handler::BusIsConnected()) + { + AZ::TickBus::Handler::BusConnect(); + } } } // namespace EditorMaterialComponentInspector } // namespace Render diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h index 12c4fbfdd9..11eb2cec51 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.h @@ -9,17 +9,22 @@ #pragma once #if !defined(Q_MOC_RUN) +#include #include #include #include +#include +#include #include #include -#include #include +#include #include #include #endif +class QLabel; + namespace AZ { namespace Render @@ -31,31 +36,33 @@ namespace AZ class MaterialPropertyInspector : public AtomToolsFramework::InspectorWidget , public AzToolsFramework::IPropertyEditorNotify - { + , public AZ::EntitySystemBus::Handler + , public AZ::TickBus::Handler + , public MaterialComponentNotificationBus::Handler + { Q_OBJECT public: AZ_CLASS_ALLOCATOR(MaterialPropertyInspector, AZ::SystemAllocator, 0); - explicit MaterialPropertyInspector( - const AZStd::string& slotName, const AZ::Data::AssetId& assetId, PropertyChangedCallback propertyChangedCallback, - QWidget* parent = nullptr); + MaterialPropertyInspector(QWidget* parent = nullptr); ~MaterialPropertyInspector() override; - bool LoadMaterial(); + bool LoadMaterial(const AZ::EntityId& entityId, const AZ::Render::MaterialAssignmentId& materialAssignmentId); + void UnloadMaterial(); + bool IsLoaded() const; // AtomToolsFramework::InspectorRequestBus::Handler overrides... void Reset() override; void Populate(); - void SetOverrides(const MaterialPropertyOverrideMap& propertyOverrideMap); - bool SaveMaterial() const; bool SaveMaterialToSource() const; bool HasMaterialSource() const; bool HasMaterialParentSource() const; void OpenMaterialSourceInEditor() const; void OpenMaterialParentSourceInEditor() const; + void OpenMenu(); const EditorMaterialComponentUtil::MaterialEditData& GetEditData() const; private: @@ -69,28 +76,47 @@ namespace AZ void RequestPropertyContextMenu([[maybe_unused]] AzToolsFramework::InstanceDataNode*, const QPoint&) override {} void PropertySelectionChanged([[maybe_unused]] AzToolsFramework::InstanceDataNode*, bool) override {} + // AZ::EntitySystemBus::Handler overrides... + void OnEntityInitialized(const AZ::EntityId& entityId) override; + void OnEntityDestroyed(const AZ::EntityId& entityId) override; + void OnEntityActivated(const AZ::EntityId& entityId) override; + void OnEntityDeactivated(const AZ::EntityId& entityId) override; + void OnEntityNameChanged(const AZ::EntityId& entityId, const AZStd::string& name) override; + + //! AZ::TickBus::Handler overrides... + void OnTick(float deltaTime, ScriptTimePoint time) override; + + //! MaterialComponentNotificationBus::Handler overrides... + void OnMaterialsEdited() override; + + void UpdateUI(); + void QueueUpdateUI(); + void AddDetailsGroup(); void AddUvNamesGroup(); - void RunPropertyChangedCallback(); + + void LoadOverridesFromEntity(); + void SaveOverridesToEntity(bool commitChanges); void RunEditorMaterialFunctors(); void UpdateMaterialInstanceProperty(const AtomToolsFramework::DynamicProperty& property); + AZ::Crc32 GetSaveStateKeyForGroup(const AZStd::string& groupNameId) const; + static bool AreNodePropertyValuesEqual( + const AzToolsFramework::InstanceDataNode* source, const AzToolsFramework::InstanceDataNode* target); + // Tracking the property that is actively being edited in the inspector const AtomToolsFramework::DynamicProperty* m_activeProperty = {}; - AZStd::string m_slotName; - AZ::Data::AssetId m_materialAssetId = {}; + AZ::EntityId m_entityId; + AZ::Render::MaterialAssignmentId m_materialAssignmentId; EditorMaterialComponentUtil::MaterialEditData m_editData; - PropertyChangedCallback m_propertyChangedCallback = {}; AZ::Data::Instance m_materialInstance = {}; AZStd::vector> m_editorFunctors = {}; AZ::RPI::MaterialPropertyFlags m_dirtyPropertyFlags = {}; AZStd::unordered_map m_groups = {}; - }; - - bool OpenInspectorDialog( - const AZStd::string& slotName, const AZ::Data::AssetId& assetId, MaterialPropertyOverrideMap propertyOverrideMap, - PropertyChangedCallback propertyChangedCallback); + bool m_internalEditNotification = {}; + QLabel* m_messageLabel = {}; + }; } // namespace EditorMaterialComponentInspector } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp index 39dde65a99..37a9ee7b93 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.cpp @@ -80,10 +80,9 @@ namespace AZ if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) { serializeContext->Class() - ->Version(6, &EditorMaterialComponentSlot::ConvertVersion) + ->Version(7, &EditorMaterialComponentSlot::ConvertVersion) ->Field("id", &EditorMaterialComponentSlot::m_id) ->Field("materialAsset", &EditorMaterialComponentSlot::m_materialAsset) - ->Field("defaultMaterialAsset", &EditorMaterialComponentSlot::m_defaultMaterialAsset) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) @@ -114,20 +113,22 @@ namespace AZ ->Constructor() ->Property("id", BehaviorValueProperty(&EditorMaterialComponentSlot::m_id)) ->Property("materialAsset", BehaviorValueProperty(&EditorMaterialComponentSlot::m_materialAsset)) - ->Property("propertyOverrides", BehaviorValueProperty(&EditorMaterialComponentSlot::m_propertyOverrides)) - ->Property("matModUvOverrides", BehaviorValueProperty(&EditorMaterialComponentSlot::m_matModUvOverrides)) ; } }; AZ::Data::AssetId EditorMaterialComponentSlot::GetDefaultAssetId() const { - return m_defaultMaterialAsset.GetId(); + AZ::Data::AssetId assetId; + MaterialComponentRequestBus::EventResult(assetId, m_entityId, &MaterialComponentRequestBus::Events::GetDefaultMaterialAssetId, m_id); + return assetId; } AZStd::string EditorMaterialComponentSlot::GetLabel() const { - return m_label; + AZStd::string label; + MaterialComponentRequestBus::EventResult(label, m_entityId, &MaterialComponentRequestBus::Events::GetMaterialSlotLabel, m_id); + return label; } bool EditorMaterialComponentSlot::HasSourceData() const @@ -137,50 +138,45 @@ namespace AZ return !sourcePath.empty() && AZ::StringFunc::Path::IsExtension(sourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension); } - void EditorMaterialComponentSlot::OnMaterialChanged() const + void EditorMaterialComponentSlot::SetAsset(const Data::AssetId& assetId) { - if (m_materialChangedCallback) - { - m_materialChangedCallback(); - } + m_materialAsset.Create(assetId); + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetMaterialOverride, m_id, m_materialAsset.GetId()); + OnDataChanged(); } - void EditorMaterialComponentSlot::OnPropertyChanged() const + void EditorMaterialComponentSlot::SetAsset(const Data::Asset& asset) { - if (m_propertyChangedCallback) - { - m_propertyChangedCallback(); - } - } - - void EditorMaterialComponentSlot::OpenMaterialEditor() const - { - const AZStd::string& sourcePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(m_materialAsset.GetId()); - if (!sourcePath.empty() && AZ::StringFunc::Path::IsExtension(sourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension)) - { - EditorMaterialSystemComponentRequestBus::Broadcast(&EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, sourcePath); - } + m_materialAsset = asset; + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetMaterialOverride, m_id, m_materialAsset.GetId()); + OnDataChanged(); } void EditorMaterialComponentSlot::Clear() { m_materialAsset = {}; + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetMaterialOverride, m_id, m_materialAsset.GetId()); + ClearOverrides(); + } + + void EditorMaterialComponentSlot::ClearToDefaultAsset() + { + m_materialAsset.Create(GetDefaultAssetId()); + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetMaterialOverride, m_id, m_materialAsset.GetId()); ClearOverrides(); } void EditorMaterialComponentSlot::ClearOverrides() { - m_propertyOverrides = {}; - m_matModUvOverrides = {}; - OnMaterialChanged(); - } - - void EditorMaterialComponentSlot::ResetToDefaultAsset() - { - m_materialAsset = m_defaultMaterialAsset; - m_propertyOverrides = {}; - m_matModUvOverrides = {}; - OnMaterialChanged(); + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetPropertyOverrides, m_id, MaterialPropertyOverrideMap()); + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetModelUvOverrides, m_id, AZ::RPI::MaterialModelUvOverrideMap()); + OnDataChanged(); } void EditorMaterialComponentSlot::OpenMaterialExporter() @@ -189,7 +185,7 @@ namespace AZ // But we still need to allow the user to reconfigure it using the dialog EditorMaterialComponentExporter::ExportItemsContainer exportItems; { - EditorMaterialComponentExporter::ExportItem exportItem{m_defaultMaterialAsset.GetId(), m_label}; + EditorMaterialComponentExporter::ExportItem exportItem{ GetDefaultAssetId(), GetLabel() }; exportItems.push_back(exportItem); } @@ -203,7 +199,8 @@ namespace AZ continue; } - // Generate a new asset ID utilizing the export file path so that we can update this material slot to reference the new asset + // Generate a new asset ID utilizing the export file path so that we can update this material slot to reference the new + // asset const auto& assetIdOutcome = AZ::RPI::AssetUtils::MakeAssetId(exportItem.GetExportPath(), 0); if (assetIdOutcome) { @@ -219,37 +216,43 @@ namespace AZ } } + void EditorMaterialComponentSlot::OpenMaterialEditor() const + { + const AZStd::string& sourcePath = AZ::RPI::AssetUtils::GetSourcePathByAssetId(m_materialAsset.GetId()); + if (!sourcePath.empty() && AZ::StringFunc::Path::IsExtension(sourcePath.c_str(), AZ::RPI::MaterialSourceData::Extension)) + { + EditorMaterialSystemComponentRequestBus::Broadcast( + &EditorMaterialSystemComponentRequestBus::Events::OpenMaterialEditor, sourcePath); + } + } + void EditorMaterialComponentSlot::OpenMaterialInspector() { - MaterialPropertyOverrideMap initialPropertyOverrides = m_propertyOverrides; - auto applyPropertyChangedCallback = [this](const MaterialPropertyOverrideMap& propertyOverrides) { - m_propertyOverrides = propertyOverrides; - OnPropertyChanged(); - }; - - if (m_materialAsset.GetId().IsValid()) - { - if (EditorMaterialComponentInspector::OpenInspectorDialog(GetLabel(), m_materialAsset.GetId(), m_propertyOverrides, applyPropertyChangedCallback)) - { - OnMaterialChanged(); - } - } + EditorMaterialSystemComponentRequestBus::Broadcast( + &EditorMaterialSystemComponentRequestBus::Events::OpenMaterialInspector, m_entityId, m_id); } void EditorMaterialComponentSlot::OpenUvNameMapInspector() { - RPI::MaterialModelUvOverrideMap initialUvOverrides = m_matModUvOverrides; - auto applyMatModUvOverrideChangedCallback = [this](const RPI::MaterialModelUvOverrideMap& matModUvOverrides) { - m_matModUvOverrides = matModUvOverrides; - // Treated as a special property. It will be updated together with properties. - OnPropertyChanged(); - }; - if (m_materialAsset.GetId().IsValid()) { - if (EditorMaterialComponentInspector::OpenInspectorDialog(m_materialAsset.GetId(), m_matModUvOverrides, m_modelUvNames, applyMatModUvOverrideChangedCallback)) + AZStd::unordered_set modelUvNames; + MaterialReceiverRequestBus::EventResult(modelUvNames, m_entityId, &MaterialReceiverRequestBus::Events::GetModelUvNames); + + RPI::MaterialModelUvOverrideMap matModUvOverrides; + MaterialComponentRequestBus::EventResult( + matModUvOverrides, m_entityId, &MaterialComponentRequestBus::Events::GetModelUvOverrides, m_id); + + auto applyMatModUvOverrideChangedCallback = [this](const RPI::MaterialModelUvOverrideMap& matModUvOverrides) { - OnMaterialChanged(); + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetModelUvOverrides, m_id, matModUvOverrides); + }; + + if (EditorMaterialComponentInspector::OpenInspectorDialog( + m_materialAsset.GetId(), matModUvOverrides, modelUvNames, applyMatModUvOverrideChangedCallback)) + { + OnDataChanged(); } } } @@ -261,7 +264,7 @@ namespace AZ QAction* action = nullptr; action = menu.addAction("Generate/Manage Source Material...", [this]() { OpenMaterialExporter(); }); - action->setEnabled(m_defaultMaterialAsset.GetId().IsValid()); + action->setEnabled(GetDefaultAssetId().IsValid()); menu.addSeparator(); @@ -276,10 +279,38 @@ namespace AZ menu.addSeparator(); + MaterialPropertyOverrideMap propertyOverrides; + MaterialComponentRequestBus::EventResult( + propertyOverrides, m_entityId, &MaterialComponentRequestBus::Events::GetPropertyOverrides, m_id); + RPI::MaterialModelUvOverrideMap matModUvOverrides; + MaterialComponentRequestBus::EventResult( + matModUvOverrides, m_entityId, &MaterialComponentRequestBus::Events::GetModelUvOverrides, m_id); + action = menu.addAction("Clear Material Instance Overrides", [this]() { ClearOverrides(); }); - action->setEnabled(!m_propertyOverrides.empty() || !m_matModUvOverrides.empty()); + action->setEnabled(!propertyOverrides.empty() || !matModUvOverrides.empty()); menu.exec(QCursor::pos()); } + + void EditorMaterialComponentSlot::OnMaterialChanged() const + { + MaterialComponentRequestBus::Event( + m_entityId, &MaterialComponentRequestBus::Events::SetMaterialOverride, m_id, m_materialAsset.GetId()); + OnDataChanged(); + } + + void EditorMaterialComponentSlot::OnDataChanged() const + { + // This is triggered whenever a material slot changes outside of normal inspector interactions + // Handle undo, update configuration, and refresh the inspector to display the new values + AzToolsFramework::ScopedUndoBatch undoBatch("Material slot changed."); + AzToolsFramework::ToolsApplicationRequests::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationRequests::Bus::Events::AddDirtyEntity, m_entityId); + + MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited); + + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues); + } } // namespace Render } // namespace AZ diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.h index 58d6fa9ab0..01e357f1bb 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentSlot.h @@ -33,29 +33,26 @@ namespace AZ AZ::Data::AssetId GetDefaultAssetId() const; AZStd::string GetLabel() const; bool HasSourceData() const; - void OpenMaterialEditor() const; - void ResetToDefaultAsset(); + + void SetAsset(const Data::AssetId& assetId); + void SetAsset(const Data::Asset& asset); void Clear(); + void ClearToDefaultAsset(); void ClearOverrides(); + void OpenMaterialExporter(); + void OpenMaterialEditor() const; void OpenMaterialInspector(); void OpenUvNameMapInspector(); + AZ::EntityId m_entityId; MaterialAssignmentId m_id; - AZStd::string m_label; Data::Asset m_materialAsset; - Data::Asset m_defaultMaterialAsset; - MaterialPropertyOverrideMap m_propertyOverrides; - AZStd::function m_materialChangedCallback; - AZStd::function m_propertyChangedCallback; - - RPI::MaterialModelUvOverrideMap m_matModUvOverrides; - AZStd::unordered_set m_modelUvNames; // Cached for override options. private: void OpenPopupMenu(const AZ::Data::AssetId& assetId, const AZ::Data::AssetType& assetType); void OnMaterialChanged() const; - void OnPropertyChanged() const; + void OnDataChanged() const; }; // Vector of slots for assignable or overridable material data. diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp index e25653988e..83ddbf46c5 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.cpp @@ -6,33 +6,31 @@ * */ -#include - -#include +#include +#include #include #include +#include #include #include - #include - #include +#include #include - -#include - -#include - +#include +#include +#include #include // Disables warning messages triggered by the Qt library // 4251: class needs to have dll-interface to be used by clients of class // 4800: forcing value to bool 'true' or 'false' (performance warning) AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") -#include -#include -#include #include +#include +#include +#include +#include AZ_POP_DISABLE_WARNING void InitMaterialEditorResources() @@ -95,6 +93,7 @@ namespace AZ AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusConnect(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusConnect(); AzToolsFramework::EditorMenuNotificationBus::Handler::BusConnect(); + AzToolsFramework::EditorEvents::Bus::Handler::BusConnect(); SetupThumbnails(); m_materialBrowserInteractions.reset(aznew MaterialBrowserInteractions); @@ -106,6 +105,7 @@ namespace AZ AzFramework::ApplicationLifecycleEvents::Bus::Handler::BusDisconnect(); AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler::BusDisconnect(); AzToolsFramework::EditorMenuNotificationBus::Handler::BusDisconnect(); + AzToolsFramework::EditorEvents::Bus::Handler::BusDisconnect(); TeardownThumbnails(); m_materialBrowserInteractions.reset(); @@ -117,7 +117,7 @@ namespace AZ } } - void EditorMaterialSystemComponent::OpenInMaterialEditor(const AZStd::string& sourcePath) + void EditorMaterialSystemComponent::OpenMaterialEditor(const AZStd::string& sourcePath) { AZ_TracePrintf("MaterialComponent", "Launching Material Editor"); @@ -140,6 +140,20 @@ namespace AZ AtomToolsFramework::LaunchTool("MaterialEditor", ".exe", arguments); } + void EditorMaterialSystemComponent::OpenMaterialInspector( + const AZ::EntityId& entityId, const AZ::Render::MaterialAssignmentId& materialAssignmentId) + { + auto dockWidget = AzToolsFramework::InstanceViewPane("Material Property Inspector"); + if (dockWidget) + { + auto inspector = static_cast(dockWidget->widget()); + if (inspector) + { + inspector->LoadMaterial(entityId, materialAssignmentId); + } + } + } + void EditorMaterialSystemComponent::OnApplicationAboutToStop() { TeardownThumbnails(); @@ -157,11 +171,12 @@ namespace AZ QObject::connect( m_openMaterialEditorAction, &QAction::triggered, m_openMaterialEditorAction, [this]() { - OpenInMaterialEditor(""); + OpenMaterialEditor(""); } ); - AzToolsFramework::EditorMenuRequestBus::Broadcast(&AzToolsFramework::EditorMenuRequestBus::Handler::AddMenuAction, "ToolMenu", m_openMaterialEditorAction, true); + AzToolsFramework::EditorMenuRequestBus::Broadcast( + &AzToolsFramework::EditorMenuRequestBus::Handler::AddMenuAction, "ToolMenu", m_openMaterialEditorAction, true); } } @@ -174,13 +189,25 @@ namespace AZ } } + void EditorMaterialSystemComponent::NotifyRegisterViews() + { + AzToolsFramework::ViewPaneOptions inspectorOptions; + inspectorOptions.canHaveMultipleInstances = true; + inspectorOptions.preferedDockingArea = Qt::NoDockWidgetArea; + inspectorOptions.paneRect = QRect(50, 50, 400, 700); + inspectorOptions.showInMenu = false; + inspectorOptions.showOnToolsToolbar = false; + AzToolsFramework::RegisterViewPane( + "Material Property Inspector", LyViewPane::CategoryTools, inspectorOptions); + } + void EditorMaterialSystemComponent::SetupThumbnails() { using namespace AzToolsFramework::Thumbnailer; using namespace LyIntegration; - ThumbnailerRequestsBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, - MAKE_TCACHE(Thumbnails::MaterialThumbnailCache), + ThumbnailerRequestsBus::Broadcast( + &ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(Thumbnails::MaterialThumbnailCache), ThumbnailContext::DefaultContext); } @@ -189,12 +216,13 @@ namespace AZ using namespace AzToolsFramework::Thumbnailer; using namespace LyIntegration; - ThumbnailerRequestsBus::Broadcast(&ThumbnailerRequests::UnregisterThumbnailProvider, - Thumbnails::MaterialThumbnailCache::ProviderName, + ThumbnailerRequestsBus::Broadcast( + &ThumbnailerRequests::UnregisterThumbnailProvider, Thumbnails::MaterialThumbnailCache::ProviderName, ThumbnailContext::DefaultContext); } - AzToolsFramework::AssetBrowser::SourceFileDetails EditorMaterialSystemComponent::GetSourceFileDetails(const char* fullSourceFileName) + AzToolsFramework::AssetBrowser::SourceFileDetails EditorMaterialSystemComponent::GetSourceFileDetails( + const char* fullSourceFileName) { static const char* MaterialTypeIconPath = ":/Icons/materialtype.svg"; static const char* MaterialTypeExtension = "materialtype"; diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h index 267f31f92b..7fa43ea309 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialSystemComponent.h @@ -8,11 +8,10 @@ #pragma once #include - #include - -#include +#include #include +#include #include #include @@ -28,8 +27,9 @@ namespace AZ : public AZ::Component , private EditorMaterialSystemComponentRequestBus::Handler , private AzFramework::ApplicationLifecycleEvents::Bus::Handler - , public AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler - , public AzToolsFramework::EditorMenuNotificationBus::Handler + , private AzToolsFramework::AssetBrowser::AssetBrowserInteractionNotificationBus::Handler + , private AzToolsFramework::EditorMenuNotificationBus::Handler + , private AzToolsFramework::EditorEvents::Bus::Handler { public: AZ_COMPONENT(EditorMaterialSystemComponent, "{96652157-DA0B-420F-B49C-0207C585144C}"); @@ -49,7 +49,8 @@ namespace AZ private: //! EditorMaterialSystemComponentRequestBus::Handler overrides... - void OpenInMaterialEditor(const AZStd::string& sourcePath) override; + void OpenMaterialEditor(const AZStd::string& sourcePath) override; + void OpenMaterialInspector(const AZ::EntityId& entityId, const AZ::Render::MaterialAssignmentId& materialAssignmentId) override; // AzFramework::ApplicationLifecycleEvents overrides... void OnApplicationAboutToStop() override; @@ -61,6 +62,9 @@ namespace AZ void OnPopulateToolMenuItems() override; void OnResetToolMenuItems() override; + // AztoolsFramework::EditorEvents::Bus::Handler overrides... + void NotifyRegisterViews() override; + void SetupThumbnails(); void TeardownThumbnails(); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp index 258727e835..18812d45e9 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialBrowserInteractions.cpp @@ -29,16 +29,13 @@ namespace AZ { if (HandlesSource(fullSourceFileName)) { - openers.push_back( - { - "Material_Editor", - "Open in Material Editor...", - QIcon(), + openers.push_back({ "Material_Editor", "Open in Material Editor...", QIcon(), [&](const char* fullSourceFileNameInCallback, [[maybe_unused]] const AZ::Uuid& sourceUUID) - { - EditorMaterialSystemComponentRequestBus::Broadcast(&EditorMaterialSystemComponentRequestBus::Events::OpenInMaterialEditor, fullSourceFileNameInCallback); - } - }); + { + EditorMaterialSystemComponentRequestBus::Broadcast( + &EditorMaterialSystemComponentRequestBus::Events::OpenMaterialEditor, + fullSourceFileNameInCallback); + } }); } } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp index 6e1e710282..3e41a8072e 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp @@ -35,6 +35,8 @@ namespace AZ ->Attribute(AZ::Script::Attributes::Module, "render") ->Event("GetOriginalMaterialAssignments", &MaterialComponentRequestBus::Events::GetOriginalMaterialAssignments) ->Event("FindMaterialAssignmentId", &MaterialComponentRequestBus::Events::FindMaterialAssignmentId) + ->Event("GetDefaultMaterialAssetId", &MaterialComponentRequestBus::Events::GetDefaultMaterialAssetId) + ->Event("GetMaterialSlotLabel", &MaterialComponentRequestBus::Events::GetMaterialSlotLabel) ->Event("SetMaterialOverrides", &MaterialComponentRequestBus::Events::SetMaterialOverrides) ->Event("GetMaterialOverrides", &MaterialComponentRequestBus::Events::GetMaterialOverrides) ->Event("ClearAllMaterialOverrides", &MaterialComponentRequestBus::Events::ClearAllMaterialOverrides) @@ -71,6 +73,7 @@ namespace AZ ->Event("ClearPropertyOverride", &MaterialComponentRequestBus::Events::ClearPropertyOverride) ->Event("ClearPropertyOverrides", &MaterialComponentRequestBus::Events::ClearPropertyOverrides) ->Event("ClearAllPropertyOverrides", &MaterialComponentRequestBus::Events::ClearAllPropertyOverrides) + ->Event("SetPropertyOverrides", &MaterialComponentRequestBus::Events::SetPropertyOverrides) ->Event("GetPropertyOverrides", &MaterialComponentRequestBus::Events::GetPropertyOverrides) ; } @@ -168,19 +171,26 @@ namespace AZ const auto& propertyOverrides2 = materialIt->second.m_propertyOverrides; for (auto& propertyPair : propertyOverrides2) { - const auto& materialPropertyIndex = materialInstance->FindPropertyIndex(propertyPair.first); - if (!materialPropertyIndex.IsNull()) + if (propertyPair.second.empty()) { - if (propertyPair.second.is()) - { - const auto& assetId = *AZStd::any_cast(&propertyPair.second); - Data::Asset imageAsset(assetId, azrtti_typeid()); - materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue(imageAsset)); - } - else - { - materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue::FromAny(propertyPair.second)); - } + continue; + } + + const auto& materialPropertyIndex = materialInstance->FindPropertyIndex(propertyPair.first); + if (materialPropertyIndex.IsNull()) + { + continue; + } + + if (propertyPair.second.is()) + { + const auto& assetId = *AZStd::any_cast(&propertyPair.second); + Data::Asset imageAsset(assetId, azrtti_typeid()); + materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue(imageAsset)); + } + else + { + materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue::FromAny(propertyPair.second)); } } @@ -288,6 +298,40 @@ namespace AZ return materialAssignmentId; } + AZ::Data::AssetId MaterialComponentController::GetDefaultMaterialAssetId(const MaterialAssignmentId& materialAssignmentId) const + { + RPI::ModelMaterialSlotMap modelMaterialSlots; + MaterialReceiverRequestBus::EventResult( + modelMaterialSlots, m_entityId, &MaterialReceiverRequestBus::Events::GetModelMaterialSlots); + + auto slotIter = modelMaterialSlots.find(materialAssignmentId.m_materialSlotStableId); + return slotIter != modelMaterialSlots.end() ? slotIter->second.m_defaultMaterialAsset.GetId() : AZ::Data::AssetId(); + } + + AZStd::string MaterialComponentController::GetMaterialSlotLabel(const MaterialAssignmentId& materialAssignmentId) const + { + if (materialAssignmentId == DefaultMaterialAssignmentId) + { + return "Default Material"; + } + + RPI::ModelMaterialSlotMap modelMaterialSlots; + MaterialReceiverRequestBus::EventResult( + modelMaterialSlots, m_entityId, &MaterialReceiverRequestBus::Events::GetModelMaterialSlots); + + auto slotIter = modelMaterialSlots.find(materialAssignmentId.m_materialSlotStableId); + if (slotIter != modelMaterialSlots.end()) + { + const Name& displayName = slotIter->second.m_displayName; + if (!displayName.IsEmpty()) + { + return displayName.GetStringView(); + } + } + + return ""; + } + void MaterialComponentController::SetMaterialOverrides(const MaterialAssignmentMap& materials) { // this function is called twice once material asset is changed, a temp variable is @@ -309,7 +353,6 @@ namespace AZ { m_configuration.m_materials.clear(); QueueMaterialUpdateNotification(); - MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } } @@ -334,12 +377,11 @@ namespace AZ LoadMaterials(); } - const AZ::Data::AssetId MaterialComponentController::GetMaterialOverride(const MaterialAssignmentId& materialAssignmentId) const + AZ::Data::AssetId MaterialComponentController::GetMaterialOverride(const MaterialAssignmentId& materialAssignmentId) const { auto materialIt = m_configuration.m_materials.find(materialAssignmentId); if (materialIt == m_configuration.m_materials.end()) { - AZ_Error("MaterialComponentController", false, "MaterialAssignmentId not found."); return {}; } @@ -351,7 +393,6 @@ namespace AZ if (m_configuration.m_materials.erase(materialAssignmentId) > 0) { QueueMaterialUpdateNotification(); - MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } } @@ -372,7 +413,6 @@ namespace AZ } QueuePropertyChanges(materialAssignmentId); - MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } void MaterialComponentController::SetPropertyOverrideBool( @@ -450,14 +490,12 @@ namespace AZ const auto materialIt = m_configuration.m_materials.find(materialAssignmentId); if (materialIt == m_configuration.m_materials.end()) { - AZ_Error("MaterialComponentController", false, "MaterialAssignmentId not found."); return {}; } const auto propertyIt = materialIt->second.m_propertyOverrides.find(AZ::Name(propertyName)); if (propertyIt == materialIt->second.m_propertyOverrides.end()) { - AZ_Error("MaterialComponentController", false, "Property not found: %s.", propertyName.c_str()); return {}; } @@ -546,14 +584,12 @@ namespace AZ auto materialIt = m_configuration.m_materials.find(materialAssignmentId); if (materialIt == m_configuration.m_materials.end()) { - AZ_Error("MaterialComponentController", false, "MaterialAssignmentId not found."); return; } auto propertyIt = materialIt->second.m_propertyOverrides.find(AZ::Name(propertyName)); if (propertyIt == materialIt->second.m_propertyOverrides.end()) { - AZ_Error("MaterialComponentController", false, "Property not found: %s.", propertyName.c_str()); return; } @@ -565,7 +601,6 @@ namespace AZ } QueuePropertyChanges(materialAssignmentId); - MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } void MaterialComponentController::ClearPropertyOverrides(const MaterialAssignmentId& materialAssignmentId) @@ -573,7 +608,6 @@ namespace AZ auto materialIt = m_configuration.m_materials.find(materialAssignmentId); if (materialIt == m_configuration.m_materials.end()) { - AZ_Error("MaterialComponentController", false, "MaterialAssignmentId not found."); return; } @@ -582,7 +616,6 @@ namespace AZ materialIt->second.m_propertyOverrides = {}; materialIt->second.RebuildInstance(); QueueMaterialUpdateNotification(); - MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } } @@ -602,21 +635,62 @@ namespace AZ if (cleared) { - MaterialComponentNotificationBus::Event(m_entityId, &MaterialComponentNotifications::OnMaterialsEdited, m_configuration.m_materials); } } + void MaterialComponentController::SetPropertyOverrides( + const MaterialAssignmentId& materialAssignmentId, const MaterialPropertyOverrideMap& propertyOverrides) + { + auto& materialAssignment = m_configuration.m_materials[materialAssignmentId]; + const bool wasEmpty = materialAssignment.m_propertyOverrides.empty(); + materialAssignment.m_propertyOverrides = propertyOverrides; + + if (wasEmpty != materialAssignment.m_propertyOverrides.empty()) + { + materialAssignment.RebuildInstance(); + QueueMaterialUpdateNotification(); + } + + QueuePropertyChanges(materialAssignmentId); + } + MaterialPropertyOverrideMap MaterialComponentController::GetPropertyOverrides(const MaterialAssignmentId& materialAssignmentId) const { const auto materialIt = m_configuration.m_materials.find(materialAssignmentId); if (materialIt == m_configuration.m_materials.end()) { - AZ_Warning("MaterialComponentController", false, "MaterialAssignmentId not found."); return {}; } return materialIt->second.m_propertyOverrides; } + void MaterialComponentController::SetModelUvOverrides( + const MaterialAssignmentId& materialAssignmentId, const AZ::RPI::MaterialModelUvOverrideMap& modelUvOverrides) + { + auto& materialAssignment = m_configuration.m_materials[materialAssignmentId]; + const bool wasEmpty = materialAssignment.m_matModUvOverrides.empty(); + materialAssignment.m_matModUvOverrides = modelUvOverrides; + + if (wasEmpty != materialAssignment.m_matModUvOverrides.empty()) + { + materialAssignment.RebuildInstance(); + QueueMaterialUpdateNotification(); + } + + QueuePropertyChanges(materialAssignmentId); + } + + AZ::RPI::MaterialModelUvOverrideMap MaterialComponentController::GetModelUvOverrides( + const MaterialAssignmentId& materialAssignmentId) const + { + const auto materialIt = m_configuration.m_materials.find(materialAssignmentId); + if (materialIt == m_configuration.m_materials.end()) + { + return {}; + } + return materialIt->second.m_matModUvOverrides; + } + void MaterialComponentController::QueuePropertyChanges(const MaterialAssignmentId& materialAssignmentId) { m_queuedPropertyOverrides.emplace(materialAssignmentId); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h index 9e59bbef19..c9dd330412 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.h @@ -47,6 +47,8 @@ namespace AZ //! MaterialComponentRequestBus overrides... MaterialAssignmentMap GetOriginalMaterialAssignments() const override; MaterialAssignmentId FindMaterialAssignmentId(const MaterialAssignmentLodIndex lod, const AZStd::string& label) const override; + AZ::Data::AssetId GetDefaultMaterialAssetId(const MaterialAssignmentId& materialAssignmentId) const override; + AZStd::string GetMaterialSlotLabel(const MaterialAssignmentId& materialAssignmentId) const override; void SetMaterialOverrides(const MaterialAssignmentMap& materials) override; const MaterialAssignmentMap& GetMaterialOverrides() const override; void ClearAllMaterialOverrides() override; @@ -54,7 +56,7 @@ namespace AZ const AZ::Data::AssetId GetDefaultMaterialOverride() const override; void ClearDefaultMaterialOverride() override; void SetMaterialOverride(const MaterialAssignmentId& materialAssignmentId, const AZ::Data::AssetId& materialAssetId) override; - const AZ::Data::AssetId GetMaterialOverride(const MaterialAssignmentId& materialAssignmentId) const override; + AZ::Data::AssetId GetMaterialOverride(const MaterialAssignmentId& materialAssignmentId) const override; void ClearMaterialOverride(const MaterialAssignmentId& materialAssignmentId) override; void SetPropertyOverride(const MaterialAssignmentId& materialAssignmentId, const AZStd::string& propertyName, const AZStd::any& value) override; @@ -86,7 +88,12 @@ namespace AZ void ClearPropertyOverride(const MaterialAssignmentId& materialAssignmentId, const AZStd::string& propertyName) override; void ClearPropertyOverrides(const MaterialAssignmentId& materialAssignmentId) override; void ClearAllPropertyOverrides() override; + void SetPropertyOverrides( + const MaterialAssignmentId& materialAssignmentId, const MaterialPropertyOverrideMap& propertyOverrides) override; MaterialPropertyOverrideMap GetPropertyOverrides(const MaterialAssignmentId& materialAssignmentId) const override; + void SetModelUvOverrides( + const MaterialAssignmentId& materialAssignmentId, const AZ::RPI::MaterialModelUvOverrideMap& modelUvOverrides) override; + AZ::RPI::MaterialModelUvOverrideMap GetModelUvOverrides(const MaterialAssignmentId& materialAssignmentId) const override; private: From bd8c53550a5e00f89f4f89107c0a7bd8c24cac52 Mon Sep 17 00:00:00 2001 From: mrieggeramzn <61609885+mrieggeramzn@users.noreply.github.com> Date: Tue, 14 Sep 2021 17:12:17 -0700 Subject: [PATCH 308/355] Replacing the old esm shadow blur with faster blur (#4095) * Replacing the old gaussian blur with a much faster, better quality kawase blur Signed-off-by: mrieggeramzn * Removing atomtesting outdated msg Signed-off-by: mrieggeramzn * Some recommendations from Tommy Signed-off-by: mrieggeramzn * Adding early termination from previous gaussian filtering algorithm that kawase replaces Signed-off-by: mrieggeramzn * Removing pcf method Signed-off-by: mrieggeramzn * removing the old blur and adding in the new kawase blur into .cmake file Signed-off-by: mrieggeramzn --- .../Common/Assets/Passes/EsmShadowmaps.pass | 19 +-- .../Assets/Passes/FilterDepthHorizontal.pass | 72 ---------- ...pthVertical.pass => KawaseShadowBlur.pass} | 10 +- .../Assets/Passes/PassTemplates.azasset | 14 +- .../Math/GaussianFilterFloatHorizontal.azsl | 60 -------- .../Math/GaussianFilterFloatHorizontal.shader | 16 --- .../Math/GaussianFilterFloatVertical.azsl | 60 -------- .../Shaders/Shadow/KawaseShadowBlur.azsl | 132 ++++++++++++++++++ .../KawaseShadowBlur.shader} | 2 +- .../atom_feature_common_asset_files.cmake | 9 +- .../Source/CoreLights/EsmShadowmapsPass.cpp | 52 ++++--- .../Source/CoreLights/EsmShadowmapsPass.h | 14 +- 12 files changed, 201 insertions(+), 259 deletions(-) delete mode 100644 Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass rename Gems/Atom/Feature/Common/Assets/Passes/{FilterDepthVertical.pass => KawaseShadowBlur.pass} (88%) delete mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.azsl delete mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.shader delete mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.azsl create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.azsl rename Gems/Atom/Feature/Common/Assets/Shaders/{Math/GaussianFilterFloatVertical.shader => Shadow/KawaseShadowBlur.shader} (79%) diff --git a/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass b/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass index 27b777d549..a3bd6604dc 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/EsmShadowmaps.pass @@ -40,9 +40,11 @@ } ] }, + { - "Name": "HorizontalGaussianFilter", - "TemplateName": "FilterDepthHorizontalTemplate", + "Name": "KawaseBlur0", + "TemplateName": "KawaseShadowBlurTemplate", + "Enabled": true, "Connections": [ { "LocalSlot": "Input", @@ -54,26 +56,27 @@ ] }, { - "Name": "VerticalGaussianFiter", - "TemplateName": "FilterDepthVerticalTemplate", + "Name": "KawaseBlur1", + "TemplateName": "KawaseShadowBlurTemplate", + "Enabled": true, "Connections": [ { "LocalSlot": "Input", "AttachmentRef": { - "Pass": "HorizontalGaussianFilter", + "Pass": "KawaseBlur0", "Attachment": "Output" } } ] - } + } ], "Connections": [ { "LocalSlot": "EsmShadowmaps", "AttachmentRef": { - "Pass": "VerticalGaussianFiter", + "Pass": "KawaseBlur1", "Attachment": "Output" - } + } } ] } diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass b/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass deleted file mode 100644 index 2b2ae40fdc..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthHorizontal.pass +++ /dev/null @@ -1,72 +0,0 @@ -{ - "Type": "JsonSerialization", - "Version": 1, - "ClassName": "PassAsset", - "ClassData": { - "PassTemplate": { - "Name": "FilterDepthHorizontalTemplate", - "PassClass": "ComputePass", - "Slots": [ - { - "Name": "Input", - "SlotType": "Input", - "ShaderInputName": "m_inputImage", - "ScopeAttachmentUsage": "Shader", - "LoadStoreAction": { - "LoadAction": "Load", - "StoreAction": "DontCare" - }, - "ImageViewDesc": { - "IsArray": 1 - } - }, - { - "Name": "Output", - "SlotType": "Output", - "ShaderInputName": "m_outputImage", - "ScopeAttachmentUsage": "Shader", - "LoadStoreAction": { - "LoadAction": "DontCare", - "StoreAction": "Store" - }, - "ImageViewDesc": { - "IsArray": 1 - } - } - ], - "PassData": { - "$type": "ComputePassData", - "ShaderAsset": { - "FilePath": "Shaders/Math/GaussianFilterFloatHorizontal.shader" - } - }, - "ImageAttachments": [ - { - "Name": "HorizontalFiltered", - "SizeSource": { - "Source": { - "Pass": "This", - "Attachment": "Input" - } - }, - "ArraySizeSource": { - "Pass": "This", - "Attachment": "Input" - }, - "ImageDescriptor": { - "Format": "R32_FLOAT" - } - } - ], - "Connections": [ - { - "localSlot": "Output", - "AttachmentRef": { - "Pass": "This", - "Attachment": "HorizontalFiltered" - } - } - ] - } - } -} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass b/Gems/Atom/Feature/Common/Assets/Passes/KawaseShadowBlur.pass similarity index 88% rename from Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass rename to Gems/Atom/Feature/Common/Assets/Passes/KawaseShadowBlur.pass index 5d8a4de21b..46ef8ba8ae 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/FilterDepthVertical.pass +++ b/Gems/Atom/Feature/Common/Assets/Passes/KawaseShadowBlur.pass @@ -4,7 +4,7 @@ "ClassName": "PassAsset", "ClassData": { "PassTemplate": { - "Name": "FilterDepthVerticalTemplate", + "Name": "KawaseShadowBlurTemplate", "PassClass": "ComputePass", "Slots": [ { @@ -28,7 +28,7 @@ "LoadStoreAction": { "LoadAction": "DontCare", "StoreAction": "Store" - }, + }, "ImageViewDesc": { "IsArray": 1 } @@ -37,12 +37,12 @@ "PassData": { "$type": "ComputePassData", "ShaderAsset": { - "FilePath": "Shaders/Math/GaussianFilterFloatVertical.shader" + "FilePath": "Shaders/Shadow/KawaseShadowBlur.shader" } }, "ImageAttachments": [ { - "Name": "VerticalFiltered", + "Name": "FilteredImage", "SizeSource": { "Source": { "Pass": "This", @@ -63,7 +63,7 @@ "localSlot": "Output", "AttachmentRef": { "Pass": "This", - "Attachment": "VerticalFiltered" + "Attachment": "FilteredImage" } } ] diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset index 57d35fb48d..8b7d6a8438 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset +++ b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset @@ -184,14 +184,6 @@ "Name": "DepthOfFieldWriteFocusDepthFromGpuTemplate", "Path": "Passes/DepthOfFieldWriteFocusDepthFromGpu.pass" }, - { - "Name": "FilterDepthHorizontalTemplate", - "Path": "Passes/FilterDepthHorizontal.pass" - }, - { - "Name": "FilterDepthVerticalTemplate", - "Path": "Passes/FilterDepthVertical.pass" - }, { "Name": "EsmShadowmapsTemplate", "Path": "Passes/EsmShadowmaps.pass" @@ -503,7 +495,11 @@ { "Name": "LowEndPipelineTemplate", "Path": "Passes/LowEndPipeline.pass" - } + }, + { + "Name": "KawaseShadowBlurTemplate", + "Path": "Passes/KawaseShadowBlur.pass" + } ] } } diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.azsl deleted file mode 100644 index 353f08427d..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.azsl +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -// [GFX TODO][ATOM-3365] optimization using intermediary results in groupshared memory. - -#include -#include -#include - -[numthreads(16,16,1)] -void MainCS(uint3 dispatchId: SV_DispatchThreadID) -{ - const float3 inputSize = GetImageSize(FilterPassSrg::m_inputImage); - const float3 outputSize = GetImageSize(FilterPassSrg::m_outputImage); - - const uint shadowmapIndex = GetShadowmapIndex( - FilterPassSrg::m_shadowmapIndexTable, - dispatchId, - inputSize.x); - // Early return if thread is outside of shadowmaps. - if (shadowmapIndex == ~0) - { - return; - } - const FilterParameter filterParameter = FilterPassSrg::m_filterParameters[shadowmapIndex]; - const uint shadowmapSize = filterParameter.m_shadowmapSize; - // Early return if filter is disabled. - if (!filterParameter.m_isEnabled || shadowmapSize <= 1) - { - return; // early return if filter parameter is empty. - } - - const uint sourceMin = filterParameter.m_shadowmapOriginInSlice.x; - const uint sourceMax = sourceMin + shadowmapSize - 1; - - uint filterTableSize = 0; - FilterPassSrg::m_filterTable.GetDimensions(filterTableSize); - if (filterTableSize == 0 || filterParameter.m_parameterCount == 0) - { - return; // If filter parameter is empty, early return. - } - - // [GFX TODO][ATOM-5676] pass proper source min/max for each shadowmap - const float result = FilteredFloat( - dispatchId, - FilterPassSrg::m_inputImage, - uint2(1, 0), // horizontal - sourceMin, - sourceMax, - FilterPassSrg::m_filterTable, - filterParameter.m_parameterOffset, - filterParameter.m_parameterCount); - - FilterPassSrg::m_outputImage[dispatchId].r = result; -} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.shader deleted file mode 100644 index 6998fd000c..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatHorizontal.shader +++ /dev/null @@ -1,16 +0,0 @@ -{ - "Source" : "GaussianFilterFloatHorizontal", - - "DrawList" : "shadow", - - "ProgramSettings": - { - "EntryPoints": - [ - { - "name": "MainCS", - "type": "Compute" - } - ] - } -} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.azsl deleted file mode 100644 index 11c7d04bb1..0000000000 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.azsl +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) Contributors to the Open 3D Engine Project. - * For complete copyright and license terms please see the LICENSE at the root of this distribution. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT - * - */ - -// [GFX TODO][ATOM-3365] optimization using intermediary results in groupshared memory. - -#include -#include -#include - -[numthreads(16,16,1)] -void MainCS(uint3 dispatchId: SV_DispatchThreadID) -{ - const float3 inputSize = GetImageSize(FilterPassSrg::m_inputImage); - const float3 outputSize = GetImageSize(FilterPassSrg::m_outputImage); - - const uint shadowmapIndex = GetShadowmapIndex( - FilterPassSrg::m_shadowmapIndexTable, - dispatchId, - inputSize.x); - // Early return if thread is outside of shadowmaps. - if (shadowmapIndex == ~0) - { - return; - } - const FilterParameter filterParameter = FilterPassSrg::m_filterParameters[shadowmapIndex]; - const uint shadowmapSize = filterParameter.m_shadowmapSize; - // Early return if filter is disabled. - if (!filterParameter.m_isEnabled || shadowmapSize <= 1) - { - return; // early return if filter parameter is empty. - } - - const uint sourceMin = filterParameter.m_shadowmapOriginInSlice.y; - const uint sourceMax = sourceMin + shadowmapSize - 1; - - uint filterTableSize = 0; - FilterPassSrg::m_filterTable.GetDimensions(filterTableSize); - if (filterTableSize == 0 || filterParameter.m_parameterCount == 0) - { - return; // If filter parameter is empty, early return. - } - - // [GFX TODO][ATOM-5676] pass proper source min/max for each shadowmap - const float result = FilteredFloat( - dispatchId, - FilterPassSrg::m_inputImage, - uint2(0, 1), // vertical - sourceMin, - sourceMax, - FilterPassSrg::m_filterTable, - filterParameter.m_parameterOffset, - filterParameter.m_parameterCount); - - FilterPassSrg::m_outputImage[dispatchId].r = result; -} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.azsl new file mode 100644 index 0000000000..9b480a4e40 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.azsl @@ -0,0 +1,132 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +// [GFX TODO][ATOM-3365] optimization using intermediary results in groupshared memory. + +// This shader blurs the ESM results using a multi-pass kawase filter. +// It should generally be faster than separable gaussian blur +// https://software.intel.com/content/www/us/en/develop/blogs/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms.html + +#include +#include +#include +#include + +ShaderResourceGroup FilterPassSrg : SRG_PerPass +{ + // This shader filters multiple images with distinct filter parameters. + // So, the input and output are arrays of texture2Ds. + Texture2DArray m_inputImage; + RWTexture2DArray m_outputImage; + + // This can convert a coordinate in an atlas to + // the shadowmap index. + Buffer m_shadowmapIndexTable; + + // This contains parameters related to filtering. + StructuredBuffer m_filterParameters; + + // x and y contain the inverse of the texture map resolution, z contains the kawase iteration + // i.e. a two pass kawase blur passes in 0 for the 1st pass and 1 for the second pass + float4 m_rcpResolutionAndIteration; + + Sampler LinearSampler + { + MinFilter = Linear; + MagFilter = Linear; + MipFilter = Linear; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; + }; +} + +void CalculateBlurBoundaries(const uint shadowmapIndex, out float2 sourceMinTex, out float2 sourceMaxTex) +{ + const float2 rcpPixelSize = FilterPassSrg::m_rcpResolutionAndIteration.xy; + + const FilterParameter filterParameter = FilterPassSrg::m_filterParameters[shadowmapIndex]; + const uint shadowmapSize = filterParameter.m_shadowmapSize; + + // location of the shadow bounds in texels + const uint2 sourceMinPixel = filterParameter.m_shadowmapOriginInSlice.xy; + const uint2 sourceMaxPixel = sourceMinPixel + shadowmapSize - 1; + + // location of the shadow bounds in uv space + sourceMinTex = (sourceMinPixel + 0.5f) * rcpPixelSize; + sourceMaxTex = (sourceMaxPixel + 0.5f) * rcpPixelSize; +} + +float AccumulateShadowSamples(Texture2DArray tex, float3 texCoord, SamplerState s) +{ + float4 values = tex.GatherRed(s, texCoord); + float result = values.x + values.y + values.z + values.w; + return result; +} + +[numthreads(16,16,1)] +void MainCS(uint3 dispatchId: SV_DispatchThreadID) +{ + const float inputSize = GetImageSize(FilterPassSrg::m_inputImage).x; + const uint shadowmapIndex = GetShadowmapIndex( + FilterPassSrg::m_shadowmapIndexTable, + dispatchId, + inputSize); + + // Early return if thread is outside of shadowmaps. + if (shadowmapIndex == ~0) + { + return; + } + + const FilterParameter filterParameter = FilterPassSrg::m_filterParameters[shadowmapIndex]; + const uint shadowmapSize = filterParameter.m_shadowmapSize; + // Early return if filter is disabled. + if (!filterParameter.m_isEnabled || shadowmapSize <= 1) + { + return; // early return if filter parameter is empty. + } + + const float2 rcpPixelSize = FilterPassSrg::m_rcpResolutionAndIteration.xy; + const float blurIteration = FilterPassSrg::m_rcpResolutionAndIteration.z; + + float2 sourceMinTex, sourceMaxTex; + CalculateBlurBoundaries(shadowmapIndex, sourceMinTex, sourceMaxTex); + + const float2 halfRcpPixelSize = rcpPixelSize / 2.0f; + const float2 dUV = rcpPixelSize.xy * blurIteration + halfRcpPixelSize.xy; + const float2 texCoord = (dispatchId.xy + 0.5f) * rcpPixelSize; + + const float3 texCoordSamples[4] = { + float3(texCoord.x - dUV.x, texCoord.y - dUV.y, dispatchId.z), + float3(texCoord.x - dUV.x, texCoord.y + dUV.y, dispatchId.z), + float3(texCoord.x + dUV.x, texCoord.y - dUV.y, dispatchId.z), + float3(texCoord.x + dUV.x, texCoord.y + dUV.y, dispatchId.z), + }; + + float accumulatedBlur = 0; + float numSamplesAccumulated = 0; + for(int i = 0 ; i < 4; ++i) + { + if (texCoordSamples[i].x >= sourceMinTex.x && + texCoordSamples[i].y >= sourceMinTex.y && + texCoordSamples[i].x < sourceMaxTex.x && + texCoordSamples[i].y < sourceMaxTex.y) + { + // we should be tapping the location directly in between 4 adjacent texels + accumulatedBlur += AccumulateShadowSamples(FilterPassSrg::m_inputImage, texCoordSamples[i], FilterPassSrg::LinearSampler); + numSamplesAccumulated += 4; + } + } + + if (numSamplesAccumulated > 0) + { + float result = accumulatedBlur / numSamplesAccumulated; + FilterPassSrg::m_outputImage[dispatchId].r = result; + } +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader b/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.shader similarity index 79% rename from Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader rename to Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.shader index db303e1ea7..dacacdafff 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/Math/GaussianFilterFloatVertical.shader +++ b/Gems/Atom/Feature/Common/Assets/Shaders/Shadow/KawaseShadowBlur.shader @@ -1,5 +1,5 @@ { - "Source" : "GaussianFilterFloatVertical", + "Source" : "KawaseShadowBlur", "DrawList" : "shadow", diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake index e43498c55d..8435625833 100644 --- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake +++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake @@ -137,8 +137,6 @@ set(FILES Passes/FastDepthAwareBlur.pass Passes/FastDepthAwareBlurHor.pass Passes/FastDepthAwareBlurVer.pass - Passes/FilterDepthHorizontal.pass - Passes/FilterDepthVertical.pass Passes/Forward.pass Passes/ForwardCheckerboard.pass Passes/ForwardMSAA.pass @@ -146,6 +144,7 @@ set(FILES Passes/FullscreenCopy.pass Passes/FullscreenOutputOnly.pass Passes/ImGui.pass + Passes/KawaseShadowBlur.pass Passes/LightAdaptationParent.pass Passes/LightCulling.pass Passes/LightCullingHeatmap.pass @@ -331,10 +330,6 @@ set(FILES Shaders/LightCulling/LightCullingTilePrepare.shader Shaders/LuxCore/RenderTexture.azsl Shaders/LuxCore/RenderTexture.shader - Shaders/Math/GaussianFilterFloatHorizontal.azsl - Shaders/Math/GaussianFilterFloatHorizontal.shader - Shaders/Math/GaussianFilterFloatVertical.azsl - Shaders/Math/GaussianFilterFloatVertical.shader Shaders/MorphTargets/MorphTargetCS.azsl Shaders/MorphTargets/MorphTargetCS.shader Shaders/MorphTargets/MorphTargetSRG.azsli @@ -457,6 +452,8 @@ set(FILES Shaders/ScreenSpace/DeferredFog.shader Shaders/Shadow/DepthExponentiation.azsl Shaders/Shadow/DepthExponentiation.shader + Shaders/Shadow/KawaseShadowBlur.azsl + Shaders/Shadow/KawaseShadowBlur.shader Shaders/Shadow/Shadowmap.azsl Shaders/Shadow/Shadowmap.shader Shaders/SkinnedMesh/LinearSkinningCS.azsl diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.cpp b/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.cpp index 6948eb598e..99eaa8a919 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.cpp @@ -130,32 +130,17 @@ namespace AZ const AZStd::array_view>& children = GetChildren(); AZ_Assert(children.size() == EsmChildPassKindCount, "[EsmShadowmapsPass '%s'] The count of children is wrong.", GetPathName().GetCStr()); - for (uint32_t index = 0; index < EsmChildPassKindCount; ++index) + for (uint32_t childPassIndex = 0; childPassIndex < EsmChildPassKindCount; ++childPassIndex) { - RPI::ComputePass* child = azrtti_cast(children[index].get()); + RPI::ComputePass* child = azrtti_cast(children[childPassIndex].get()); AZ_Assert(child, "[EsmShadowmapsPass '%s'] A child does not compute.", GetPathName().GetCStr()); Data::Instance srg = child->GetShaderResourceGroup(); - if (m_shadowmapIndexTableBufferIndices[index].IsNull()) + SetBlurParameters(srg, childPassIndex); + if (childPassIndex >= aznumeric_cast(EsmChildPassKind::KawaseBlur0)) { - m_shadowmapIndexTableBufferIndices[index] = srg->FindShaderInputBufferIndex(Name("m_shadowmapIndexTable")); - } - srg->SetBuffer(m_shadowmapIndexTableBufferIndices[index], m_shadowmapIndexTableBuffer); - - if (m_filterParameterBufferIndices[index].IsNull()) - { - m_filterParameterBufferIndices[index] = srg->FindShaderInputBufferIndex(Name("m_filterParameters")); - } - srg->SetBuffer(m_filterParameterBufferIndices[index], m_filterParameterBuffer); - - if (index != static_cast(EsmChildPassKind::Exponentiation)) - { - if (m_filterTableBufferIndices[index].IsNull()) - { - m_filterTableBufferIndices[index] = srg->FindShaderInputBufferIndex(Name("m_filterTable")); - } - srg->SetBuffer(m_filterTableBufferIndices[index], m_filterTableBuffer); + SetKawaseBlurSpecificParameters(srg, childPassIndex - aznumeric_cast(EsmChildPassKind::KawaseBlur0)); } child->SetTargetThreadCounts( @@ -165,5 +150,32 @@ namespace AZ } } + void EsmShadowmapsPass::SetBlurParameters(Data::Instance srg, const uint32_t childPassIndex) + { + if (m_shadowmapIndexTableBufferIndices[childPassIndex].IsNull()) + { + m_shadowmapIndexTableBufferIndices[childPassIndex] = srg->FindShaderInputBufferIndex(Name("m_shadowmapIndexTable")); + } + srg->SetBuffer(m_shadowmapIndexTableBufferIndices[childPassIndex], m_shadowmapIndexTableBuffer); + + if (m_filterParameterBufferIndices[childPassIndex].IsNull()) + { + m_filterParameterBufferIndices[childPassIndex] = srg->FindShaderInputBufferIndex(Name("m_filterParameters")); + } + srg->SetBuffer(m_filterParameterBufferIndices[childPassIndex], m_filterParameterBuffer); + } + + void EsmShadowmapsPass::SetKawaseBlurSpecificParameters(Data::Instance srg, uint32_t kawaseBlurIndex) + { + if (m_kawaseBlurConstantIndices[kawaseBlurIndex].IsNull()) + { + m_kawaseBlurConstantIndices[kawaseBlurIndex] = srg->FindShaderInputConstantIndex(Name("m_rcpResolutionAndIteration")); + } + const AZ::Vector4 data( + 1.0f / m_shadowmapImageSize.m_width, 1.0f / m_shadowmapImageSize.m_height, aznumeric_cast(kawaseBlurIndex), 0.0f); + + srg->SetConstant(m_kawaseBlurConstantIndices[kawaseBlurIndex], data); + } + } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.h b/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.h index 236855c8c5..6e5e1aa311 100644 --- a/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/CoreLights/EsmShadowmapsPass.h @@ -21,12 +21,17 @@ namespace AZ { + namespace RPI + { + class ShaderResourceGroup; + } + namespace Render { AZ_ENUM_CLASS_WITH_UNDERLYING_TYPE(EsmChildPassKind, uint32_t, (Exponentiation, 0), - HorizontalFilter, - VerticalFilter); + KawaseBlur0, + KawaseBlur1); //! This pass outputs filtered shadowmap images used in ESM. //! ESM is an abbreviation of Exponential Shadow Maps. @@ -88,6 +93,9 @@ namespace AZ void FrameBeginInternal(FramePrepareParams params) override; void UpdateChildren(); + // Parameters for both the depth exponentiation pass along with the kawase blur passes + void SetBlurParameters(Data::Instance srg, const uint32_t childPassIndex); + void SetKawaseBlurSpecificParameters(Data::Instance srg, const uint32_t kawaseBlurIndex); bool m_computationEnabled = false; Name m_lightTypeName; @@ -102,6 +110,8 @@ namespace AZ Data::Instance m_shadowmapIndexTableBuffer; AZStd::array m_filterParameterBufferIndices; Data::Instance m_filterParameterBuffer; + + AZStd::array m_kawaseBlurConstantIndices; }; } // namespace Render } // namespace AZ From ce72e32cfc640af8029194578fe1ecf4766c8d49 Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Tue, 14 Sep 2021 19:21:29 -0500 Subject: [PATCH 309/355] Fixed issue where two Paths could compare equal to each other, but hash differently (#4126) * Fixed issue where two Paths could compare equal to each other, but hash differently This issue is caused by the Path comparison logic using the path separator of the left path in a comparison of two paths(left and right) to determine whether the PathComparison is case-sensitive or not. The logic has been updated to only perform a non-case-sensitive path comparison if both paths are using the WindowsPathSeperator of `\` Also fixed issue with the Hashing algorihtm of the Path class to always hash the root directory as if it is `/`. This allows a path of "C:\foo" and "C:/foo" to hash to the equivalent value. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * MS Build Tools 14.29 workaround around suppressing warnings using the external header feature Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- Code/Framework/AzCore/AzCore/IO/Path/Path.h | 4 +- Code/Framework/AzCore/AzCore/IO/Path/Path.inl | 55 +++++--------- .../AzCore/AzCore/IO/Path/PathParser.inl | 56 ++++++++++++-- .../AzCore/Tests/IO/Path/PathTests.cpp | 76 +++++++++++++++++++ 4 files changed, 148 insertions(+), 43 deletions(-) diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.h b/Code/Framework/AzCore/AzCore/IO/Path/Path.h index c0c4b1c974..24f26daa51 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.h +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.h @@ -273,7 +273,7 @@ namespace AZ::IO // If the path input = 'D:bar', then the new PathIterable parts = [D:, 'bar' ] static constexpr void AppendNormalPathParts(PathIterable& pathIterableResult, const AZ::IO::PathView& path) noexcept; - constexpr int compare_string_view(AZStd::string_view other) const; + constexpr int ComparePathView(const PathView& other) const; constexpr AZStd::string_view root_name_view() const; constexpr AZStd::string_view root_directory_view() const; constexpr AZStd::string_view root_path_raw_view() const; @@ -480,6 +480,8 @@ namespace AZ::IO // compare //! Performs a compare of each of the path parts for equivalence //! Each part of the path is compare using string comparison + //! If both *this path and the input path uses the WindowsPathSeparator + //! then a non-case sensitive compare is performed //! Ex: Comparing "test/foo" against "test/fop" returns -1; //! Path separators of the contained path string aren't compared //! Ex. Comparing "C:/test\foo" against C:\test/foo" returns 0; diff --git a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl index 40cbf6f46b..0147ad3356 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/Path.inl +++ b/Code/Framework/AzCore/AzCore/IO/Path/Path.inl @@ -224,15 +224,15 @@ namespace AZ::IO // compare constexpr int PathView::Compare(const PathView& other) const noexcept { - return compare_string_view(other.m_path); + return ComparePathView(other); } constexpr int PathView::Compare(AZStd::string_view pathView) const noexcept { - return compare_string_view(pathView); + return ComparePathView(PathView(pathView, m_preferred_separator)); } constexpr int PathView::Compare(const value_type* path) const noexcept { - return compare_string_view(path); + return ComparePathView(PathView(path, m_preferred_separator)); } constexpr AZStd::fixed_string PathView::FixedMaxPathString() const noexcept @@ -398,10 +398,10 @@ namespace AZ::IO return true; } - constexpr int PathView::compare_string_view(AZStd::string_view pathView) const + constexpr int PathView::ComparePathView(const PathView& other) const { auto lhsPathParser = parser::PathParser::CreateBegin(m_path, m_preferred_separator); - auto rhsPathParser = parser::PathParser::CreateBegin(pathView, m_preferred_separator); + auto rhsPathParser = parser::PathParser::CreateBegin(other.m_path, other.m_preferred_separator); if (int res = CompareRootName(&lhsPathParser, &rhsPathParser); res != 0) { @@ -476,6 +476,8 @@ namespace AZ::IO template constexpr void PathView::MakeRelativeTo(PathResultType& pathResult, const AZ::IO::PathView& path, const AZ::IO::PathView& base) { + const bool exactCaseCompare = path.m_preferred_separator == PosixPathSeparator + || base.m_preferred_separator == PosixPathSeparator; { // perform root-name/root-directory mismatch checks auto pathParser = parser::PathParser::CreateBegin(path.m_path, path.m_preferred_separator); @@ -487,7 +489,7 @@ namespace AZ::IO }; if (pathParser.InRootName() && pathParserBase.InRootName()) { - if (int res = Internal::ComparePathSegment(*pathParser, *pathParserBase, pathParser.m_preferred_separator); + if (int res = Internal::ComparePathSegment(*pathParser, *pathParserBase, exactCaseCompare); res != 0) { pathResult.m_path = AZStd::string_view{}; @@ -519,7 +521,7 @@ namespace AZ::IO auto pathParser = parser::PathParser::CreateBegin(path.m_path, path.m_preferred_separator); auto pathParserBase = parser::PathParser::CreateBegin(base.m_path, base.m_preferred_separator); while (pathParser && pathParserBase && pathParser.m_parser_state == pathParserBase.m_parser_state && - Internal::ComparePathSegment(*pathParser, *pathParserBase, pathParser.m_preferred_separator) == 0) + Internal::ComparePathSegment(*pathParser, *pathParserBase, exactCaseCompare) == 0) { ++pathParser; ++pathParserBase; @@ -1080,25 +1082,25 @@ namespace AZ::IO template constexpr int BasicPath::Compare(const PathView& other) const noexcept { - return static_cast(*this).compare_string_view(other.m_path); + return static_cast(*this).ComparePathView(other); } template constexpr int BasicPath::Compare(const string_type& pathString) const { - return static_cast(*this).compare_string_view(pathString); + return static_cast(*this).ComparePathView(PathView(pathString, m_preferred_separator)); } template constexpr int BasicPath::Compare(AZStd::string_view pathView) const noexcept { - return static_cast(*this).compare_string_view(pathView); + return static_cast(*this).ComparePathView(pathView); } template constexpr int BasicPath::Compare(const value_type* pathString) const noexcept { - return static_cast(*this).compare_string_view(pathString); + return static_cast(*this).ComparePathView(pathString); } // decomposition @@ -1330,10 +1332,12 @@ namespace AZ::IO // PathView::LexicallyRelative is not being used as it returns a FixedMaxPath // which has a limitation that it requires the relative path to fit within // an AZ::IO::MaxPathLength buffer - auto ComparePathPart = [pathSeparator = m_preferred_separator]( + const bool exactCaseCompare = m_preferred_separator == PosixPathSeparator + || base.m_preferred_separator == PosixPathSeparator; + auto ComparePathPart = [exactCaseCompare]( const PathIterable::PartKindPair& left, const PathIterable::PartKindPair& right) -> bool { - return Internal::ComparePathSegment(left.first, right.first, pathSeparator) == 0; + return Internal::ComparePathSegment(left.first, right.first, exactCaseCompare) == 0; }; const PathIterable thisPathParts = GetNormalPathParts(*this); @@ -1471,37 +1475,16 @@ namespace AZStd template <> struct hash { - /// Path is using FNV-1a algorithm 64 bit version. - static size_t hash_path(AZStd::string_view pathSegment, const char pathSeparator) - { - size_t hash = 14695981039346656037ULL; - constexpr size_t fnvPrime = 1099511628211ULL; - - for (const char first : pathSegment) - { - hash ^= static_cast((pathSeparator == AZ::IO::PosixPathSeparator) - ? first : tolower(first)); - hash *= fnvPrime; - } - return hash; - } - size_t operator()(const AZ::IO::PathView& pathToHash) noexcept { auto pathParser = AZ::IO::parser::PathParser::CreateBegin(pathToHash.Native(), pathToHash.m_preferred_separator); - size_t hash_value = 0; - while (pathParser) - { - AZStd::hash_combine(hash_value, hash_path(*pathParser, pathToHash.m_preferred_separator)); - ++pathParser; - } - return hash_value; + return AZ::IO::parser::HashPath(pathParser); } }; template struct hash> { - const size_t operator()(const AZ::IO::BasicPath& pathToHash) noexcept + size_t operator()(const AZ::IO::BasicPath& pathToHash) noexcept { return AZStd::hash{}(pathToHash); } diff --git a/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl b/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl index 3ab2c4376c..b19c518ff9 100644 --- a/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl +++ b/Code/Framework/AzCore/AzCore/IO/Path/PathParser.inl @@ -183,13 +183,12 @@ namespace AZ::IO::Internal return IsAbsolute(pathView.begin(), pathView.end(), preferredSeparator); } - // Compares path segments using either Posix or Windows path rules based on the path separator in use - // Posix paths perform a case-sensitive comparison, while Windows paths perform a case-insensitive comparison - static int ComparePathSegment(AZStd::string_view left, AZStd::string_view right, char pathSeparator) + // Compares path segments using either Posix or Windows path rules based on the exactCaseCompare option + static int ComparePathSegment(AZStd::string_view left, AZStd::string_view right, bool exactCaseCompare) { const size_t maxCharsToCompare = (AZStd::min)(left.size(), right.size()); - int charCompareResult = pathSeparator == PosixPathSeparator + int charCompareResult = exactCaseCompare ? maxCharsToCompare ? strncmp(left.data(), right.data(), maxCharsToCompare) : 0 : maxCharsToCompare ? azstrnicmp(left.data(), right.data(), maxCharsToCompare) : 0; return charCompareResult == 0 @@ -594,7 +593,10 @@ namespace AZ::IO::parser { return pathParser->InRootName() ? **pathParser : ""; }; - int res = Internal::ComparePathSegment(GetRootName(lhsPathParser), GetRootName(rhsPathParser), lhsPathParser->m_preferred_separator); + + const bool exactCaseCompare = lhsPathParser->m_preferred_separator == PosixPathSeparator + || rhsPathParser->m_preferred_separator == PosixPathSeparator; + int res = Internal::ComparePathSegment(GetRootName(lhsPathParser), GetRootName(rhsPathParser), exactCaseCompare); ConsumeRootName(lhsPathParser); ConsumeRootName(rhsPathParser); return res; @@ -621,9 +623,11 @@ namespace AZ::IO::parser auto& lhsPathParser = *lhsPathParserPtr; auto& rhsPathParser = *rhsPathParserPtr; + const bool exactCaseCompare = lhsPathParser.m_preferred_separator == PosixPathSeparator + || rhsPathParser.m_preferred_separator == PosixPathSeparator; while (lhsPathParser && rhsPathParser) { - if (int res = Internal::ComparePathSegment(*lhsPathParser, *rhsPathParser, lhsPathParser.m_preferred_separator); + if (int res = Internal::ComparePathSegment(*lhsPathParser, *rhsPathParser, exactCaseCompare); res != 0) { return res; @@ -646,6 +650,46 @@ namespace AZ::IO::parser return 0; } + //path.hash + /// Path is using FNV-1a algorithm 64 bit version. + inline size_t HashSegment(AZStd::string_view pathSegment, bool hashExactPath) + { + size_t hash = 14695981039346656037ULL; + constexpr size_t fnvPrime = 1099511628211ULL; + + for (const char first : pathSegment) + { + hash ^= static_cast(hashExactPath ? first : tolower(first)); + hash *= fnvPrime; + } + return hash; + } + constexpr size_t HashPath(PathParser& pathParser) + { + size_t hash_value = 0; + const bool hashExactPath = pathParser.m_preferred_separator == AZ::IO::PosixPathSeparator; + while (pathParser) + { + switch (pathParser.m_parser_state) + { + case PS_InRootName: + case PS_InFilenames: + AZStd::hash_combine(hash_value, HashSegment(*pathParser, hashExactPath)); + break; + case PS_InRootDir: + // Only hash the PosixPathSeparator when a root directory is seen + // This makes the hash consistent for root directories path of C:\ and C:/ + AZStd::hash_combine(hash_value, HashSegment("/", hashExactPath)); + break; + default: + // The BeforeBegin and AtEnd states contain no segments to hash + break; + } + ++pathParser; + } + return hash_value; + } + constexpr int DetermineLexicalElementCount(PathParser pathParser) { int count = 0; diff --git a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp index dbdb4fee78..cf212aa34c 100644 --- a/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp +++ b/Code/Framework/AzCore/Tests/IO/Path/PathTests.cpp @@ -213,6 +213,82 @@ namespace UnitTest AZStd::tuple(R"(foO/Bar)", "foo/bar") )); + + struct PathHashCompareParams + { + AZ::IO::PathView m_testPath{}; + ::testing::Matcher m_compareMatcher; + ::testing::Matcher m_hashMatcher; + }; + + class PathHashCompareFixture + : public ScopedAllocatorSetupFixture + , public ::testing::WithParamInterface + {}; + + // Verifies that two paths that compare equal has their hash value compare equal + TEST_P(PathHashCompareFixture, PathsWhichCompareEqual_HashesToSameValue_Succeeds) + { + auto&& [testPath1, compareMatcher, hashMatcher] = GetParam(); + + // Compare path using parameterized Matcher + EXPECT_THAT(testPath1, compareMatcher); + // Compare hash using parameterized Matcher + const size_t testPath1Hash = AZStd::hash{}(testPath1); +AZ_PUSH_DISABLE_WARNING(4296, "-Wunknown-warning-option") + EXPECT_THAT(testPath1Hash, hashMatcher); +AZ_POP_DISABLE_WARNING + } + + INSTANTIATE_TEST_CASE_P( + HashPathCompareValidation, + PathHashCompareFixture, + ::testing::Values( + PathHashCompareParams{ AZ::IO::PathView("C:/test/foo", AZ::IO::WindowsPathSeparator), + testing::Eq(AZ::IO::PathView(R"(c:\test/foo)", AZ::IO::WindowsPathSeparator)), + testing::Eq(AZStd::hash{}(AZ::IO::PathView(R"(c:\test/foo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/foo", AZ::IO::WindowsPathSeparator), + testing::Eq(AZ::IO::PathView(R"(/test/FOO)", AZ::IO::WindowsPathSeparator)), + testing::Eq(AZStd::hash{}(AZ::IO::PathView(R"(/test/FOO)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("C:/test/foo", AZ::IO::WindowsPathSeparator), + testing::Eq(AZ::IO::PathView(R"(c:\test/foo)", AZ::IO::WindowsPathSeparator)), + testing::Eq(AZStd::hash{}(AZ::IO::PathView(R"(c:\test/foo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("C:/test/foo", AZ::IO::PosixPathSeparator), + testing::Ne(AZ::IO::PathView(R"(c:\test/foo)", AZ::IO::WindowsPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(c:\test/foo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView(R"(C:\test\foo)", AZ::IO::WindowsPathSeparator), + testing::Ne(AZ::IO::PathView(R"(c:/test/foo)", AZ::IO::PosixPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(c:/test/foo)", AZ::IO::PosixPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/aoo", AZ::IO::WindowsPathSeparator), + testing::Eq(AZ::IO::PathView(R"(/test/AOO)", AZ::IO::WindowsPathSeparator)), + testing::Eq(AZStd::hash{}(AZ::IO::PathView(R"(/test/AOO)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/aoo", AZ::IO::PosixPathSeparator), + testing::Gt(AZ::IO::PathView(R"(/test/AOO)", AZ::IO::WindowsPathSeparator)), + testing::Eq(AZStd::hash{}(AZ::IO::PathView(R"(/test/AOO)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/aoo", AZ::IO::WindowsPathSeparator), + testing::Gt(AZ::IO::PathView(R"(/test/AOO)", AZ::IO::PosixPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(/test/AOO)", AZ::IO::PosixPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/AOO", AZ::IO::PosixPathSeparator), + testing::Lt(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::WindowsPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/AOO", AZ::IO::WindowsPathSeparator), + testing::Lt(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::PosixPathSeparator)), + testing::Eq(AZStd::hash{}(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::PosixPathSeparator))) }, + // Paths with different character values, comparison based on path separator + PathHashCompareParams{ AZ::IO::PathView("/test/BOO", AZ::IO::PosixPathSeparator), + testing::Le(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::WindowsPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/BOO", AZ::IO::WindowsPathSeparator), + testing::Ge(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::WindowsPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(/test/aoo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/aoo", AZ::IO::WindowsPathSeparator), + testing::Le(AZ::IO::PathView(R"(/test/Boo)", AZ::IO::WindowsPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(/test/Boo)", AZ::IO::WindowsPathSeparator))) }, + PathHashCompareParams{ AZ::IO::PathView("/test/aoo", AZ::IO::PosixPathSeparator), + testing::Ge(AZ::IO::PathView(R"(/test/Boo)", AZ::IO::WindowsPathSeparator)), + testing::Ne(AZStd::hash{}(AZ::IO::PathView(R"(/test/Boo)", AZ::IO::WindowsPathSeparator))) } + )); + class PathSingleParamFixture : public ScopedAllocatorSetupFixture , public ::testing::WithParamInterface> From bdf9005c53cc968e3dc8aefef874f58761a50794 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 14 Sep 2021 18:19:42 -0700 Subject: [PATCH 310/355] PR comments Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/Clang/Configurations_clang.cmake | 2 +- cmake/Platform/Common/MSVC/Directory.Build.props | 2 +- cmake/Platform/Common/MSVC/VisualStudio_common.cmake | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/Platform/Common/Clang/Configurations_clang.cmake b/cmake/Platform/Common/Clang/Configurations_clang.cmake index 86f4faccfb..2a311d6079 100644 --- a/cmake/Platform/Common/Clang/Configurations_clang.cmake +++ b/cmake/Platform/Common/Clang/Configurations_clang.cmake @@ -20,7 +20,7 @@ ly_append_configurations_options( # Disabled warnings (please do not disable any others without first consulting sig-build) ################### -Wno-inconsistent-missing-override # unfortunately there is no warning in MSVC to detect missing overrides, - # MSVC's static analyzer can, but that is a different run that most developers are not ware of. A pass + # MSVC's static analyzer can, but that is a different run that most developers are not aware of. A pass # was done to fix all hits. Leaving this disabled until there is a matching warning in MSVC. -Wrange-loop-analysis diff --git a/cmake/Platform/Common/MSVC/Directory.Build.props b/cmake/Platform/Common/MSVC/Directory.Build.props index 589e14a6cb..b8e9b716d9 100644 --- a/cmake/Platform/Common/MSVC/Directory.Build.props +++ b/cmake/Platform/Common/MSVC/Directory.Build.props @@ -14,7 +14,7 @@ SPDX-License-Identifier: Apache-2.0 OR MIT @VCPKG_CONFIGURATION_MAPPING@ false - @LY_ROOT_FOLDER@\cmake\Platform\Common\MSVC\CodeAnalysis.ruleset + $(MSBuildThisFileDirectory)CodeAnalysis.ruleset diff --git a/cmake/Platform/Common/MSVC/VisualStudio_common.cmake b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake index 9124758b18..d9e58090d9 100644 --- a/cmake/Platform/Common/MSVC/VisualStudio_common.cmake +++ b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake @@ -15,4 +15,4 @@ foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) endforeach() configure_file("${CMAKE_CURRENT_LIST_DIR}/Directory.Build.props" "${CMAKE_BINARY_DIR}/Directory.Build.props" @ONLY) - +file(COPY_FILE "${CMAKE_CURRENT_LIST_DIR}/CodeAnalysis.ruleset" "${CMAKE_BINARY_DIR}/CodeAnalysis.ruleset" ONLY_IF_DIFFERENT) From 9f0de3b916caa03a5073dcb7db0842f14a07d0ba Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Tue, 14 Sep 2021 18:20:44 -0700 Subject: [PATCH 311/355] Fixes for toolchain 19.28.29913.0 Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- .../RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h index 85b782aa6b..2eef783932 100644 --- a/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h +++ b/Gems/Atom/RHI/DX12/Code/Source/Platform/Windows/RHI/DX12_Windows.h @@ -16,7 +16,10 @@ #include #include + +AZ_PUSH_DISABLE_WARNING(4265, "-Wunknown-warning-option") // class has virtual functions, but its non-trivial destructor is not virtual; #include +AZ_POP_DISABLE_WARNING #include #include From 81bd7b1f5f6a63e5dcc68846c1695a64dc32d5f6 Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Tue, 14 Sep 2021 20:11:00 -0700 Subject: [PATCH 312/355] Implement a system that resizes the ghost widget appropriately to avoid undefined behavior due to it being moved into the gap between screens caused by scaling. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../Components/FancyDocking.cpp | 14 +++--- .../Components/FancyDockingGhostWidget.cpp | 50 ++++++++++++++++++- .../Components/FancyDockingGhostWidget.h | 9 ++++ 3 files changed, 65 insertions(+), 8 deletions(-) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp index f60a98f392..7a76781cd7 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDocking.cpp @@ -1615,14 +1615,16 @@ namespace AzQtComponents } // Handle snapping to the screen edges/other floating windows while dragging - QScreen* screen = Utilities::ScreenAtPoint(globalPos); + QScreen* screen = QApplication::screenAt(globalPos); - AdjustForSnapping(placeholder, screen); + if (screen) + { + AdjustForSnapping(placeholder, screen); + m_state.setPlaceholder(placeholder, screen); - m_state.setPlaceholder(placeholder, screen); - - m_ghostWidget->Enable(); - RepaintFloatingIndicators(); + m_ghostWidget->Enable(); + RepaintFloatingIndicators(); + } } return m_dropZoneState.dragging(); diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp index 6894e5b011..04387875df 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -76,7 +77,32 @@ namespace AzQtComponents window->setScreen(screen); } - setGeometry(targetRect); + QPoint midPoint = targetRect.topLeft() + QPoint(targetRect.width() / 2, targetRect.height() / 2); + QScreen* pointScreen = QApplication::screenAt(midPoint); + QRect rect(targetRect); + + if (!pointScreen || pointScreen != screen) + { + if (midPoint.x() >= QCursor::pos().x()) + { + rect.setLeft(rect.left() - rect.width()); + rect.setTop(rect.top() - rect.height()); + m_paintMode = PaintMode::BOTTOMRIGHT; + } + else + { + rect.setRight(rect.right() + rect.width()); + rect.setTop(rect.top() - rect.height()); + m_paintMode = PaintMode::BOTTOMLEFT; + } + } + else + { + m_paintMode = PaintMode::FULL; + } + + setGeometry(rect); + setPixmapVisible(true); if (needsRepaint) { @@ -135,7 +161,27 @@ namespace AzQtComponents yOffset = widgetSize.height() - aspectRatioHeight; } - painter.drawPixmap(QRect(0, yOffset, widgetSize.width(), aspectRatioHeight), m_pixmap); + switch (m_paintMode) + { + case PaintMode::FULL: + { + painter.drawPixmap(QRect(0, yOffset, widgetSize.width(), aspectRatioHeight), m_pixmap); + } + break; + + case PaintMode::BOTTOMLEFT: + { + painter.drawPixmap(QRect(0, (widgetSize.height() + yOffset) / 2, widgetSize.width() / 2, aspectRatioHeight / 2), m_pixmap); + } + break; + + case PaintMode::BOTTOMRIGHT: + { + painter.drawPixmap(QRect(widgetSize.width() / 2, (widgetSize.height() + yOffset) / 2, widgetSize.width() / 2, aspectRatioHeight / 2), m_pixmap); + } + break; + } + if (m_clipToWidgets) { painter.restore(); diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h index cadcbd9c8a..6649c6d848 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h @@ -45,5 +45,14 @@ namespace AzQtComponents QPixmap m_pixmap; bool m_visible = false; // maintain our own flag, so that we're always ready to render ignoring Qt's widget caching system bool m_clipToWidgets = false; + + enum class PaintMode + { + FULL = 0, + BOTTOMLEFT, + BOTTOMRIGHT + }; + + PaintMode m_paintMode = PaintMode::FULL; }; } // namespace AzQtComponents From 52095e3e165ccc0d1cab0d11da74e882efa73919 Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:12:26 +0100 Subject: [PATCH 313/355] Ensure undo/redo operation for change entity selection is atomic (#4122) --- .../EditorTransformComponentSelection.cpp | 258 +++++++++--------- ...EditorTransformComponentSelectionTests.cpp | 28 +- 2 files changed, 158 insertions(+), 128 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 5a7b097e29..064fbb9da6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -86,59 +86,60 @@ namespace AzToolsFramework "Sticky select implies a single click will not change selection with an entity already selected"); // strings related to new viewport interaction model (EditorTransformComponentSelection) - static const char* const s_togglePivotTitleRightClick = "Toggle pivot"; - static const char* const s_togglePivotTitleEditMenu = "Toggle Pivot Location"; - static const char* const s_togglePivotDesc = "Toggle pivot location"; - static const char* const s_manipulatorUndoRedoName = "Manipulator Adjustment"; - static const char* const s_lockSelectionTitle = "Lock Selection"; - static const char* const s_lockSelectionDesc = "Lock the selected entities so that they can't be selected in the viewport"; - static const char* const s_hideSelectionTitle = "Hide Selection"; - static const char* const s_hideSelectionDesc = "Hide the selected entities so that they don't appear in the viewport"; - static const char* const s_unlockAllTitle = "Unlock All Entities"; - static const char* const s_unlockAllDesc = "Unlock all entities the level"; - static const char* const s_showAllTitle = "Show All"; - static const char* const s_showAllDesc = "Show all entities so that they appear in the viewport"; - static const char* const s_selectAllTitle = "Select All"; - static const char* const s_selectAllDesc = "Select all entities"; - static const char* const s_invertSelectionTitle = "Invert Selection"; - static const char* const s_invertSelectionDesc = "Invert the current entity selection"; - static const char* const s_duplicateTitle = "Duplicate"; - static const char* const s_duplicateDesc = "Duplicate selected entities"; - static const char* const s_deleteTitle = "Delete"; - static const char* const s_deleteDesc = "Delete selected entities"; - static const char* const s_resetEntityTransformTitle = "Reset Entity Transform"; - static const char* const s_resetEntityTransformDesc = "Reset transform based on manipulator mode"; - static const char* const s_resetManipulatorTitle = "Reset Manipulator"; - static const char* const s_resetManipulatorDesc = "Reset the manipulator to recenter it on the selected entity"; - static const char* const s_resetTransformLocalTitle = "Reset Transform (Local)"; - static const char* const s_resetTransformLocalDesc = "Reset transform to local space"; - static const char* const s_resetTransformWorldTitle = "Reset Transform (World)"; - static const char* const s_resetTransformWorldDesc = "Reset transform to world space"; + static const char* const TogglePivotTitleRightClick = "Toggle pivot"; + static const char* const TogglePivotTitleEditMenu = "Toggle Pivot Location"; + static const char* const TogglePivotDesc = "Toggle pivot location"; + static const char* const ManipulatorUndoRedoName = "Manipulator Adjustment"; + static const char* const LockSelectionTitle = "Lock Selection"; + static const char* const LockSelectionDesc = "Lock the selected entities so that they can't be selected in the viewport"; + static const char* const HideSelectionTitle = "Hide Selection"; + static const char* const HideSelectionDesc = "Hide the selected entities so that they don't appear in the viewport"; + static const char* const UnlockAllTitle = "Unlock All Entities"; + static const char* const UnlockAllDesc = "Unlock all entities the level"; + static const char* const ShowAllTitle = "Show All"; + static const char* const ShowAllDesc = "Show all entities so that they appear in the viewport"; + static const char* const SelectAllTitle = "Select All"; + static const char* const SelectAllDesc = "Select all entities"; + static const char* const InvertSelectionTitle = "Invert Selection"; + static const char* const InvertSelectionDesc = "Invert the current entity selection"; + static const char* const DuplicateTitle = "Duplicate"; + static const char* const DuplicateDesc = "Duplicate selected entities"; + static const char* const DeleteTitle = "Delete"; + static const char* const DeleteDesc = "Delete selected entities"; + static const char* const ResetEntityTransformTitle = "Reset Entity Transform"; + static const char* const ResetEntityTransformDesc = "Reset transform based on manipulator mode"; + static const char* const ResetManipulatorTitle = "Reset Manipulator"; + static const char* const ResetManipulatorDesc = "Reset the manipulator to recenter it on the selected entity"; + static const char* const ResetTransformLocalTitle = "Reset Transform (Local)"; + static const char* const ResetTransformLocalDesc = "Reset transform to local space"; + static const char* const ResetTransformWorldTitle = "Reset Transform (World)"; + static const char* const ResetTransformWorldDesc = "Reset transform to world space"; - static const char* const s_entityBoxSelectUndoRedoDesc = "Box Select Entities"; - static const char* const s_entityDeselectUndoRedoDesc = "Deselect Entity"; - static const char* const s_entitiesDeselectUndoRedoDesc = "Deselect Entities"; - static const char* const s_entitySelectUndoRedoDesc = "Select Entity"; - static const char* const s_dittoManipulatorUndoRedoDesc = "Ditto Manipulator"; - static const char* const s_resetManipulatorTranslationUndoRedoDesc = "Reset Manipulator Translation"; - static const char* const s_resetManipulatorOrientationUndoRedoDesc = "Reset Manipulator Orientation"; - static const char* const s_dittoEntityOrientationIndividualUndoRedoDesc = "Ditto orientation individual"; - static const char* const s_dittoEntityOrientationGroupUndoRedoDesc = "Ditto orientation group"; - static const char* const s_resetTranslationToParentUndoRedoDesc = "Reset translation to parent"; - static const char* const s_resetOrientationToParentUndoRedoDesc = "Reset orientation to parent"; - static const char* const s_dittoTranslationGroupUndoRedoDesc = "Ditto translation group"; - static const char* const s_dittoTranslationIndividualUndoRedoDesc = "Ditto translation individual"; - static const char* const s_dittoScaleIndividualWorldUndoRedoDesc = "Ditto scale individual world"; - static const char* const s_dittoScaleIndividualLocalUndoRedoDesc = "Ditto scale individual local"; - static const char* const s_snapToWorldGridUndoRedoDesc = "Snap to world grid"; - static const char* const s_showAllEntitiesUndoRedoDesc = s_showAllTitle; - static const char* const s_lockSelectionUndoRedoDesc = s_lockSelectionTitle; - static const char* const s_hideSelectionUndoRedoDesc = s_hideSelectionTitle; - static const char* const s_unlockAllUndoRedoDesc = s_unlockAllTitle; - static const char* const s_selectAllEntitiesUndoRedoDesc = s_selectAllTitle; - static const char* const s_invertSelectionUndoRedoDesc = s_invertSelectionTitle; - static const char* const s_duplicateUndoRedoDesc = s_duplicateTitle; - static const char* const s_deleteUndoRedoDesc = s_deleteTitle; + static const char* const EntityBoxSelectUndoRedoDesc = "Box Select Entities"; + static const char* const EntityDeselectUndoRedoDesc = "Deselect Entity"; + static const char* const EntitiesDeselectUndoRedoDesc = "Deselect Entities"; + static const char* const ChangeEntitySelectionUndoRedoDesc = "Change Selected Entity"; + static const char* const EntitySelectUndoRedoDesc = "Select Entity"; + static const char* const DittoManipulatorUndoRedoDesc = "Ditto Manipulator"; + static const char* const ResetManipulatorTranslationUndoRedoDesc = "Reset Manipulator Translation"; + static const char* const ResetManipulatorOrientationUndoRedoDesc = "Reset Manipulator Orientation"; + static const char* const DittoEntityOrientationIndividualUndoRedoDesc = "Ditto orientation individual"; + static const char* const DittoEntityOrientationGroupUndoRedoDesc = "Ditto orientation group"; + static const char* const ResetTranslationToParentUndoRedoDesc = "Reset translation to parent"; + static const char* const ResetOrientationToParentUndoRedoDesc = "Reset orientation to parent"; + static const char* const DittoTranslationGroupUndoRedoDesc = "Ditto translation group"; + static const char* const DittoTranslationIndividualUndoRedoDesc = "Ditto translation individual"; + static const char* const DittoScaleIndividualWorldUndoRedoDesc = "Ditto scale individual world"; + static const char* const DittoScaleIndividualLocalUndoRedoDesc = "Ditto scale individual local"; + static const char* const SnapToWorldGridUndoRedoDesc = "Snap to world grid"; + static const char* const ShowAllEntitiesUndoRedoDesc = ShowAllTitle; + static const char* const LockSelectionUndoRedoDesc = LockSelectionTitle; + static const char* const HideSelectionUndoRedoDesc = HideSelectionTitle; + static const char* const UnlockAllUndoRedoDesc = UnlockAllTitle; + static const char* const SelectAllEntitiesUndoRedoDesc = SelectAllTitle; + static const char* const InvertSelectionUndoRedoDesc = InvertSelectionTitle; + static const char* const DuplicateUndoRedoDesc = DuplicateTitle; + static const char* const DeleteUndoRedoDesc = DeleteTitle; static const char* const TransformModeClusterTranslateTooltip = "Switch to translate mode"; static const char* const TransformModeClusterRotateTooltip = "Switch to rotate mode"; @@ -148,14 +149,14 @@ namespace AzToolsFramework static const char* const SpaceClusterLocalTooltip = "Toggle local space lock"; static const char* const SnappingClusterSnapToWorldTooltip = "Snap selected entities to the world space grid"; - static const AZ::Color s_fadedXAxisColor = AZ::Color(AZ::u8(200), AZ::u8(127), AZ::u8(127), AZ::u8(255)); - static const AZ::Color s_fadedYAxisColor = AZ::Color(AZ::u8(127), AZ::u8(190), AZ::u8(127), AZ::u8(255)); - static const AZ::Color s_fadedZAxisColor = AZ::Color(AZ::u8(120), AZ::u8(120), AZ::u8(180), AZ::u8(255)); + static const AZ::Color FadedXAxisColor = AZ::Color(AZ::u8(200), AZ::u8(127), AZ::u8(127), AZ::u8(255)); + static const AZ::Color FadedYAxisColor = AZ::Color(AZ::u8(127), AZ::u8(190), AZ::u8(127), AZ::u8(255)); + static const AZ::Color FadedZAxisColor = AZ::Color(AZ::u8(120), AZ::u8(120), AZ::u8(180), AZ::u8(255)); - static const AZ::Color s_pickedOrientationColor = AZ::Color(0.0f, 1.0f, 0.0f, 1.0f); - static const AZ::Color s_selectedEntityAabbColor = AZ::Color(0.6f, 0.6f, 0.6f, 0.4f); + static const AZ::Color PickedOrientationColor = AZ::Color(0.0f, 1.0f, 0.0f, 1.0f); + static const AZ::Color SelectedEntityAabbColor = AZ::Color(0.6f, 0.6f, 0.6f, 0.4f); - static const float s_pivotSize = 0.075f; // the size of the pivot (box) to render when selected + static const float PivotSize = 0.075f; // the size of the pivot (box) to render when selected // data passed to manipulators when processing mouse interactions // m_entityIds should be sorted based on the entity hierarchy @@ -1107,7 +1108,7 @@ namespace AzToolsFramework { // begin selection undo/redo command entityBoxSelectData->m_boxSelectSelectionCommand = - AZStd::make_unique(EntityIdList(), s_entityBoxSelectUndoRedoDesc); + AZStd::make_unique(EntityIdList(), EntityBoxSelectUndoRedoDesc); // grab currently selected entities entityBoxSelectData->m_selectedEntityIdsBeforeBoxSelect = m_selectedEntityIds; }); @@ -1131,7 +1132,7 @@ namespace AzToolsFramework if (!entityBoxSelectData->m_potentialDeselectedEntityIds.empty() || !entityBoxSelectData->m_potentialSelectedEntityIds.empty()) { - ScopedUndoBatch undoBatch(s_entityBoxSelectUndoRedoDesc); + ScopedUndoBatch undoBatch(EntityBoxSelectUndoRedoDesc); // restore manipulator overrides when undoing if (m_entityIdManipulators.m_manipulators && m_selectedEntityIds.empty()) @@ -1174,7 +1175,7 @@ namespace AzToolsFramework } debugDisplay.DepthTestOff(); - debugDisplay.SetColor(s_selectedEntityAabbColor); + debugDisplay.SetColor(SelectedEntityAabbColor); for (AZ::EntityId entityId : entityBoxSelectData->m_potentialSelectedEntityIds) { @@ -1222,7 +1223,7 @@ namespace AzToolsFramework { // check here if translation or orientation override are set m_manipulatorMoveCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); } } @@ -1696,7 +1697,7 @@ namespace AzToolsFramework if (!UndoRedoOperationInProgress()) { - ScopedUndoBatch undoBatch(s_entitiesDeselectUndoRedoDesc); + ScopedUndoBatch undoBatch(EntitiesDeselectUndoRedoDesc); // restore manipulator overrides when undoing if (m_entityIdManipulators.m_manipulators) @@ -1706,7 +1707,7 @@ namespace AzToolsFramework // select must happen after to ensure in the undo/redo step the selection command // happens before the manipulator command - auto selectionCommand = AZStd::make_unique(EntityIdList(), s_entitiesDeselectUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(EntityIdList(), EntitiesDeselectUndoRedoDesc); selectionCommand->SetParent(undoBatch.GetUndoBatch()); selectionCommand.release(); } @@ -1732,7 +1733,7 @@ namespace AzToolsFramework const auto nextEntityIds = EntityIdVectorFromContainer(m_selectedEntityIds); - ScopedUndoBatch undoBatch(s_entityDeselectUndoRedoDesc); + ScopedUndoBatch undoBatch(EntityDeselectUndoRedoDesc); // store manipulator state when removing last entity from selection if (m_entityIdManipulators.m_manipulators && nextEntityIds.empty()) @@ -1740,7 +1741,7 @@ namespace AzToolsFramework CreateEntityManipulatorDeselectCommand(undoBatch); } - auto selectionCommand = AZStd::make_unique(nextEntityIds, s_entityDeselectUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(nextEntityIds, EntityDeselectUndoRedoDesc); selectionCommand->SetParent(undoBatch.GetUndoBatch()); selectionCommand.release(); @@ -1755,8 +1756,8 @@ namespace AzToolsFramework const auto nextEntityIds = EntityIdVectorFromContainer(m_selectedEntityIds); - ScopedUndoBatch undoBatch(s_entitySelectUndoRedoDesc); - auto selectionCommand = AZStd::make_unique(nextEntityIds, s_entitySelectUndoRedoDesc); + ScopedUndoBatch undoBatch(EntitySelectUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(nextEntityIds, EntitySelectUndoRedoDesc); selectionCommand->SetParent(undoBatch.GetUndoBatch()); selectionCommand.release(); @@ -1772,6 +1773,13 @@ namespace AzToolsFramework void EditorTransformComponentSelection::ChangeSelectedEntity(const AZ::EntityId entityId) { + AZ_Assert( + !UndoRedoOperationInProgress(), + "ChangeSelectedEntity called from undo/redo operation - this is unexpected and not currently supported"); + + // ensure deselect/select is tracked as an atomic undo/redo operation + ScopedUndoBatch undoBatch(ChangeEntitySelectionUndoRedoDesc); + DeselectEntities(); SelectDeselect(entityId); } @@ -1799,7 +1807,7 @@ namespace AzToolsFramework const AZ::Transform& worldFromLocal = m_entityDataCache->GetVisibleEntityTransform(*entityIndex); const AZ::Vector3 boxPosition = worldFromLocal.TransformPoint(CalculateCenterOffset(entityId, m_pivotMode)); const AZ::Vector3 scaledSize = - AZ::Vector3(s_pivotSize) * CalculateScreenToWorldMultiplier(worldFromLocal.GetTranslation(), cameraState); + AZ::Vector3(PivotSize) * CalculateScreenToWorldMultiplier(worldFromLocal.GetTranslation(), cameraState); if (AabbIntersectMouseRay( mouseInteraction.m_mouseInteraction, @@ -2002,10 +2010,10 @@ namespace AzToolsFramework { if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch(s_dittoManipulatorUndoRedoDesc); + ScopedUndoBatch undoBatch(DittoManipulatorUndoRedoDesc); auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); if (entityId.IsValid()) { @@ -2131,7 +2139,7 @@ namespace AzToolsFramework { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_lockSelectionUndoRedoDesc); + ScopedUndoBatch undoBatch(LockSelectionUndoRedoDesc); if (m_entityIdManipulators.m_manipulators) { @@ -2151,7 +2159,7 @@ namespace AzToolsFramework // lock selection AddAction( - m_actions, { QKeySequence(Qt::Key_L) }, LockSelection, s_lockSelectionTitle, s_lockSelectionDesc, + m_actions, { QKeySequence(Qt::Key_L) }, LockSelection, LockSelectionTitle, LockSelectionDesc, [lockUnlock]() { lockUnlock(true); @@ -2159,7 +2167,7 @@ namespace AzToolsFramework // unlock selection AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::Key_L) }, UnlockSelection, s_lockSelectionTitle, s_lockSelectionDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::Key_L) }, UnlockSelection, LockSelectionTitle, LockSelectionDesc, [lockUnlock]() { lockUnlock(false); @@ -2169,7 +2177,7 @@ namespace AzToolsFramework { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_hideSelectionUndoRedoDesc); + ScopedUndoBatch undoBatch(HideSelectionUndoRedoDesc); if (m_entityIdManipulators.m_manipulators) { @@ -2189,7 +2197,7 @@ namespace AzToolsFramework // hide selection AddAction( - m_actions, { QKeySequence(Qt::Key_H) }, HideSelection, s_hideSelectionTitle, s_hideSelectionDesc, + m_actions, { QKeySequence(Qt::Key_H) }, HideSelection, HideSelectionTitle, HideSelectionDesc, [showHide]() { showHide(false); @@ -2197,7 +2205,7 @@ namespace AzToolsFramework // show selection AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::Key_H) }, ShowSelection, s_hideSelectionTitle, s_hideSelectionDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::Key_H) }, ShowSelection, HideSelectionTitle, HideSelectionDesc, [showHide]() { showHide(true); @@ -2205,12 +2213,12 @@ namespace AzToolsFramework // unlock all entities in the level/scene AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_L) }, UnlockAll, s_unlockAllTitle, s_unlockAllDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_L) }, UnlockAll, UnlockAllTitle, UnlockAllDesc, []() { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_unlockAllUndoRedoDesc); + ScopedUndoBatch undoBatch(UnlockAllUndoRedoDesc); EnumerateEditorEntities( [](AZ::EntityId entityId) @@ -2222,12 +2230,12 @@ namespace AzToolsFramework // show all entities in the level/scene AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_H) }, ShowAll, s_showAllTitle, s_showAllDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_H) }, ShowAll, ShowAllTitle, ShowAllDesc, []() { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_showAllEntitiesUndoRedoDesc); + ScopedUndoBatch undoBatch(ShowAllEntitiesUndoRedoDesc); EnumerateEditorEntities( [](AZ::EntityId entityId) @@ -2239,17 +2247,17 @@ namespace AzToolsFramework // select all entities in the level/scene AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::Key_A) }, SelectAll, s_selectAllTitle, s_selectAllDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::Key_A) }, SelectAll, SelectAllTitle, SelectAllDesc, [this]() { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_selectAllEntitiesUndoRedoDesc); + ScopedUndoBatch undoBatch(SelectAllEntitiesUndoRedoDesc); if (m_entityIdManipulators.m_manipulators) { auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); // note, nothing will change that the manipulatorCommand needs to keep track // for after so no need to call SetManipulatorAfter @@ -2269,7 +2277,7 @@ namespace AzToolsFramework auto nextEntityIds = EntityIdVectorFromContainer(m_selectedEntityIds); - auto selectionCommand = AZStd::make_unique(nextEntityIds, s_selectAllEntitiesUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(nextEntityIds, SelectAllEntitiesUndoRedoDesc); selectionCommand->SetParent(undoBatch.GetUndoBatch()); selectionCommand.release(); @@ -2279,17 +2287,17 @@ namespace AzToolsFramework // invert current selection AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_I) }, InvertSelect, s_invertSelectionTitle, s_invertSelectionDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_I) }, InvertSelect, InvertSelectionTitle, InvertSelectionDesc, [this]() { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_invertSelectionUndoRedoDesc); + ScopedUndoBatch undoBatch(InvertSelectionUndoRedoDesc); if (m_entityIdManipulators.m_manipulators) { auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); // note, nothing will change that the manipulatorCommand needs to keep track // for after so no need to call SetManipulatorAfter @@ -2316,7 +2324,7 @@ namespace AzToolsFramework auto nextEntityIds = EntityIdVectorFromContainer(entityIds); - auto selectionCommand = AZStd::make_unique(nextEntityIds, s_invertSelectionUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(nextEntityIds, InvertSelectionUndoRedoDesc); selectionCommand->SetParent(undoBatch.GetUndoBatch()); selectionCommand.release(); @@ -2326,7 +2334,7 @@ namespace AzToolsFramework // duplicate selection AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::Key_D) }, DuplicateSelect, s_duplicateTitle, s_duplicateDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::Key_D) }, DuplicateSelect, DuplicateTitle, DuplicateDesc, []() { AZ_PROFILE_FUNCTION(AzToolsFramework); @@ -2338,8 +2346,8 @@ namespace AzToolsFramework QApplication::focusWidget()->clearFocus(); } - ScopedUndoBatch undoBatch(s_duplicateUndoRedoDesc); - auto selectionCommand = AZStd::make_unique(EntityIdList(), s_duplicateUndoRedoDesc); + ScopedUndoBatch undoBatch(DuplicateUndoRedoDesc); + auto selectionCommand = AZStd::make_unique(EntityIdList(), DuplicateUndoRedoDesc); selectionCommand->SetParent(undoBatch.GetUndoBatch()); selectionCommand.release(); @@ -2351,12 +2359,12 @@ namespace AzToolsFramework // delete selection AddAction( - m_actions, { QKeySequence(Qt::Key_Delete) }, DeleteSelect, s_deleteTitle, s_deleteDesc, + m_actions, { QKeySequence(Qt::Key_Delete) }, DeleteSelect, DeleteTitle, DeleteDesc, [this]() { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_deleteUndoRedoDesc); + ScopedUndoBatch undoBatch(DeleteUndoRedoDesc); CreateEntityManipulatorDeselectCommand(undoBatch); @@ -2375,14 +2383,14 @@ namespace AzToolsFramework }); AddAction( - m_actions, { QKeySequence(Qt::Key_P) }, EditPivot, s_togglePivotTitleEditMenu, s_togglePivotDesc, + m_actions, { QKeySequence(Qt::Key_P) }, EditPivot, TogglePivotTitleEditMenu, TogglePivotDesc, [this]() { ToggleCenterPivotSelection(); }); AddAction( - m_actions, { QKeySequence(Qt::Key_R) }, EditReset, s_resetEntityTransformTitle, s_resetEntityTransformDesc, + m_actions, { QKeySequence(Qt::Key_R) }, EditReset, ResetEntityTransformTitle, ResetEntityTransformDesc, [this]() { switch (m_mode) @@ -2400,11 +2408,11 @@ namespace AzToolsFramework }); AddAction( - m_actions, { QKeySequence(Qt::CTRL + Qt::Key_R) }, EditResetManipulator, s_resetManipulatorTitle, s_resetManipulatorDesc, + m_actions, { QKeySequence(Qt::CTRL + Qt::Key_R) }, EditResetManipulator, ResetManipulatorTitle, ResetManipulatorDesc, AZStd::bind(AZStd::mem_fn(&EditorTransformComponentSelection::DelegateClearManipulatorOverride), this)); AddAction( - m_actions, { QKeySequence(Qt::ALT + Qt::Key_R) }, EditResetLocal, s_resetTransformLocalTitle, s_resetTransformLocalDesc, + m_actions, { QKeySequence(Qt::ALT + Qt::Key_R) }, EditResetLocal, ResetTransformLocalTitle, ResetTransformLocalDesc, [this]() { switch (m_mode) @@ -2422,7 +2430,7 @@ namespace AzToolsFramework }); AddAction( - m_actions, { QKeySequence(Qt::SHIFT + Qt::Key_R) }, EditResetWorld, s_resetTransformWorldTitle, s_resetTransformWorldDesc, + m_actions, { QKeySequence(Qt::SHIFT + Qt::Key_R) }, EditResetWorld, ResetTransformWorldTitle, ResetTransformWorldDesc, [this]() { switch (m_mode) @@ -2431,7 +2439,7 @@ namespace AzToolsFramework { // begin an undo batch so operations inside CopyOrientation... and // DelegateClear... are grouped into a single undo/redo - ScopedUndoBatch undoBatch{ s_resetTransformWorldTitle }; + ScopedUndoBatch undoBatch{ ResetTransformWorldTitle }; CopyOrientationToSelectedEntitiesIndividual(AZ::Quaternion::CreateIdentity()); ClearManipulatorOrientationOverride(); } @@ -2685,7 +2693,7 @@ namespace AzToolsFramework const AZStd::array snapAxes = { AZ::Vector3::CreateAxisX(), AZ::Vector3::CreateAxisY(), AZ::Vector3::CreateAxisZ() }; - ScopedUndoBatch undoBatch(s_snapToWorldGridUndoRedoDesc); + ScopedUndoBatch undoBatch(SnapToWorldGridUndoRedoDesc); for (const AZ::EntityId& entityId : m_selectedEntityIds) { ScopedUndoBatch::MarkEntityDirty(entityId); @@ -2870,10 +2878,10 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch(s_resetManipulatorTranslationUndoRedoDesc); + ScopedUndoBatch undoBatch(ResetManipulatorTranslationUndoRedoDesc); auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); m_pivotOverrideFrame.ResetPickedTranslation(); m_pivotOverrideFrame.m_pickedEntityIdOverride.SetInvalid(); @@ -2896,10 +2904,10 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch{ s_resetManipulatorOrientationUndoRedoDesc }; + ScopedUndoBatch undoBatch{ ResetManipulatorOrientationUndoRedoDesc }; auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); m_pivotOverrideFrame.ResetPickedOrientation(); m_pivotOverrideFrame.m_pickedEntityIdOverride.SetInvalid(); @@ -2961,13 +2969,13 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch(s_dittoTranslationGroupUndoRedoDesc); + ScopedUndoBatch undoBatch(DittoTranslationGroupUndoRedoDesc); // store previous translation manipulator position const AZ::Vector3 previousPivotTranslation = m_entityIdManipulators.m_manipulators->GetLocalTransform().GetTranslation(); auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); // refresh the transform pivot override if it's set if (m_pivotOverrideFrame.m_translationOverride) @@ -3017,10 +3025,10 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch(s_dittoTranslationIndividualUndoRedoDesc); + ScopedUndoBatch undoBatch(DittoTranslationIndividualUndoRedoDesc); auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); // refresh the transform pivot override if it's set if (m_pivotOverrideFrame.m_translationOverride) @@ -3055,7 +3063,7 @@ namespace AzToolsFramework { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_dittoScaleIndividualWorldUndoRedoDesc); + ScopedUndoBatch undoBatch(DittoScaleIndividualWorldUndoRedoDesc); ManipulatorEntityIds manipulatorEntityIds; BuildSortedEntityIdVectorFromEntityIdMap(m_entityIdManipulators.m_lookups, manipulatorEntityIds.m_entityIds); @@ -3089,7 +3097,7 @@ namespace AzToolsFramework { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_dittoScaleIndividualLocalUndoRedoDesc); + ScopedUndoBatch undoBatch(DittoScaleIndividualLocalUndoRedoDesc); ManipulatorEntityIds manipulatorEntityIds; BuildSortedEntityIdVectorFromEntityIdMap(m_entityIdManipulators.m_lookups, manipulatorEntityIds.m_entityIds); @@ -3110,10 +3118,10 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch{ s_dittoEntityOrientationIndividualUndoRedoDesc }; + ScopedUndoBatch undoBatch{ DittoEntityOrientationIndividualUndoRedoDesc }; auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); ManipulatorEntityIds manipulatorEntityIds; BuildSortedEntityIdVectorFromEntityIdMap(m_entityIdManipulators.m_lookups, manipulatorEntityIds.m_entityIds); @@ -3148,10 +3156,10 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch(s_dittoEntityOrientationGroupUndoRedoDesc); + ScopedUndoBatch undoBatch(DittoEntityOrientationGroupUndoRedoDesc); auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); ManipulatorEntityIds manipulatorEntityIds; BuildSortedEntityIdVectorFromEntityIdMap(m_entityIdManipulators.m_lookups, manipulatorEntityIds.m_entityIds); @@ -3194,7 +3202,7 @@ namespace AzToolsFramework { AZ_PROFILE_FUNCTION(AzToolsFramework); - ScopedUndoBatch undoBatch(s_resetOrientationToParentUndoRedoDesc); + ScopedUndoBatch undoBatch(ResetOrientationToParentUndoRedoDesc); for (const auto& entityIdLookup : m_entityIdManipulators.m_lookups) { ScopedUndoBatch::MarkEntityDirty(entityIdLookup.first); @@ -3215,7 +3223,7 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { - ScopedUndoBatch undoBatch(s_resetTranslationToParentUndoRedoDesc); + ScopedUndoBatch undoBatch(ResetTranslationToParentUndoRedoDesc); ManipulatorEntityIds manipulatorEntityIds; BuildSortedEntityIdVectorFromEntityIdMap(m_entityIdManipulators.m_lookups, manipulatorEntityIds.m_entityIds); @@ -3251,7 +3259,7 @@ namespace AzToolsFramework void EditorTransformComponentSelection::PopulateEditorGlobalContextMenu( QMenu* menu, [[maybe_unused]] const AZ::Vector2& point, [[maybe_unused]] int flags) { - QAction* action = menu->addAction(QObject::tr(s_togglePivotTitleRightClick)); + QAction* action = menu->addAction(QObject::tr(TogglePivotTitleRightClick)); QObject::connect( action, &QAction::triggered, action, [this]() @@ -3329,15 +3337,15 @@ namespace AzToolsFramework : 1.0f; }; - display.SetColor(s_fadedXAxisColor); + display.SetColor(FadedXAxisColor); display.DrawLine( transform.GetTranslation(), transform.GetTranslation() + transform.GetBasisX().GetNormalizedSafe() * axisLength * axisFlip(AZ::Vector3::CreateAxisX())); - display.SetColor(s_fadedYAxisColor); + display.SetColor(FadedYAxisColor); display.DrawLine( transform.GetTranslation(), transform.GetTranslation() + transform.GetBasisY().GetNormalizedSafe() * axisLength * axisFlip(AZ::Vector3::CreateAxisY())); - display.SetColor(s_fadedZAxisColor); + display.SetColor(FadedZAxisColor); display.DrawLine( transform.GetTranslation(), transform.GetTranslation() + transform.GetBasisZ().GetNormalizedSafe() * axisLength * axisFlip(AZ::Vector3::CreateAxisZ())); @@ -3416,11 +3424,11 @@ namespace AzToolsFramework CalculatePivotTranslation(m_pivotOverrideFrame.m_pickedEntityIdOverride, m_pivotMode)); const float scaledSize = - s_pivotSize * CalculateScreenToWorldMultiplier(pickedEntityWorldTransform.GetTranslation(), cameraState); + PivotSize * CalculateScreenToWorldMultiplier(pickedEntityWorldTransform.GetTranslation(), cameraState); debugDisplay.DepthWriteOff(); debugDisplay.DepthTestOff(); - debugDisplay.SetColor(s_pickedOrientationColor); + debugDisplay.SetColor(PickedOrientationColor); debugDisplay.DrawWireSphere(pickedEntityWorldTransform.GetTranslation(), scaledSize); @@ -3462,7 +3470,7 @@ namespace AzToolsFramework const AZ::Vector3 boxPosition = worldFromLocal.TransformPoint(CalculateCenterOffset(entityId, m_pivotMode)); const AZ::Vector3 scaledSize = - AZ::Vector3(s_pivotSize) * CalculateScreenToWorldMultiplier(worldFromLocal.GetTranslation(), cameraState); + AZ::Vector3(PivotSize) * CalculateScreenToWorldMultiplier(worldFromLocal.GetTranslation(), cameraState); const AZ::Color hiddenNormal[] = { AzFramework::ViewportColors::SelectedColor, AzFramework::ViewportColors::HiddenColor }; @@ -3708,7 +3716,7 @@ namespace AzToolsFramework if (m_entityIdManipulators.m_manipulators) { auto manipulatorCommand = - AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), s_manipulatorUndoRedoName); + AZStd::make_unique(CreateManipulatorCommandStateFromSelf(), ManipulatorUndoRedoName); manipulatorCommand->SetManipulatorAfter(EntityManipulatorCommand::State()); diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index 241ee3f576..72cafe5cd5 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -866,9 +866,7 @@ namespace UnitTest EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1)); } - TEST_F( - EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, - BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) { AzToolsFramework::ed_viewportStickySelect = true; @@ -989,6 +987,30 @@ namespace UnitTest EXPECT_TRUE(selectedEntitiesAfter.empty()); } + TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickyUndoOperationForChangeInSelectionIsAtomic) + { + AzToolsFramework::ed_viewportStickySelect = false; + + PositionEntities(); + PositionCamera(m_cameraState); + + AzToolsFramework::SelectEntity(m_entityId1); + + // calculate the position in screen space of the second entity + const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); + + // single click select entity2 + m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity2ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + + // undo action + AzToolsFramework::ToolsApplicationRequestBus::Broadcast(&AzToolsFramework::ToolsApplicationRequestBus::Events::UndoPressed); + + // entity1 is selected after undo + using ::testing::UnorderedElementsAre; + auto selectedEntitiesAfter = SelectedEntities(); + EXPECT_THAT(selectedEntitiesAfter, UnorderedElementsAre(m_entityId1)); + } + using EditorTransformComponentSelectionManipulatorTestFixture = IndirectCallManipulatorViewportInteractionFixtureMixin; From 169b8f36793f93d0dcab7902f736617b1952cd4c Mon Sep 17 00:00:00 2001 From: galibzon <66021303+galibzon@users.noreply.github.com> Date: Wed, 15 Sep 2021 07:50:14 -0500 Subject: [PATCH 314/355] [ATOM-5441] Shader Builders May Fail When Multiple New Files Are Added (#3862) * [ATOM-5441] Shader Builders May Fail When Multiple New Files Are Added ShaderAssetBuilder::CreateJobs now recursively parses *.azsl files looking for #include lines and builds the list of source dependencies using a depth-first algorithm. It was using MCPP before but not anymore (during CreateJobs). The new algorithm may over prescribe, but fixes the issues when multiple new shader related files are added, at once or out of order, to a game project or Gem. Overall the new ShaderAssetBuilder::CreateJobs() is around 40% faster and, of course, handles source dependencies in a robust way. * Added new test suite to AutomatedTesting project: Gem/PythonTests/atom_renderer/test_Atom_ShaderBuildPipelineSuite.py Bug fix to Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp discovered thanks to the automated test suite. The idea is that CreateJobs doesn't fail if the AZSL file doesn't exist. The failure is deferred during ProcessJob. This way if the AZSL file exists the .shader file is rebuilt automatically. * For testability purposes and avoid memory leakage errors during Unit Tests created the class ShaderBuilderUtility::IncludedFilesParser Now accepts "# include " with space between '#' and 'include'. Also now accepts the '-' character inside the file path. Added Unit Test to validate all cases of "#include " parsing. * Fixed linux runtime issues for Unit Tests in Atom_Asset_Shader.Tests Signed-off-by: garrieta --- .../PythonTests/atom_renderer/CMakeLists.txt | 11 + .../DependencyValidation.azsl.txt | 55 +++++ .../DependencyValidation.shader.txt | 26 +++ .../ShaderAssetBuilder/Test1Color.azsli.txt | 18 ++ .../ShaderAssetBuilder/Test2Color.azsli.txt | 16 ++ .../ShaderAssetBuilder/Test3Color.azsli.txt | 16 ++ ...pilesShaderAsChainOfDependenciesChanges.py | 188 ++++++++++++++++++ .../test_Atom_ShaderBuildPipelineSuite.py | 19 ++ Gems/Atom/Asset/Shader/Code/CMakeLists.txt | 1 + .../Code/Source/Editor/ShaderAssetBuilder.cpp | 150 +++++++++++--- .../Source/Editor/ShaderBuilderUtility.cpp | 46 +++++ .../Code/Source/Editor/ShaderBuilderUtility.h | 23 +++ .../Code/Tests/ShaderBuilderUtilityTests.cpp | 86 ++++++++ ...om_asset_shader_builders_tests_files.cmake | 1 + .../PostProcessing/FastDepthAwareBlurHor.azsl | 2 +- .../PostProcessing/FastDepthAwareBlurVer.azsl | 2 +- .../Assets/Shaders/PostProcessing/SMAA.azsli | 2 +- 17 files changed, 629 insertions(+), 33 deletions(-) create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.azsl.txt create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.shader.txt create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test1Color.azsli.txt create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test2Color.azsli.txt create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test3Color.azsli.txt create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_ShaderBuildPipelineSuite.py create mode 100644 Gems/Atom/Asset/Shader/Code/Tests/ShaderBuilderUtilityTests.cpp diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt index f056623ecd..992420904c 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt @@ -46,4 +46,15 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT AutomatedTesting.Assets Editor ) + ly_add_pytest( + NAME AutomatedTesting::AtomRenderer_HydraTests_ShaderBuildPipeline + TEST_SUITE main + PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_ShaderBuildPipelineSuite.py + TEST_SERIAL + TIMEOUT 600 + RUNTIME_DEPENDENCIES + AssetProcessor + AutomatedTesting.Assets + Editor + ) endif() diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.azsl.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.azsl.txt new file mode 100644 index 0000000000..c0b64f40b7 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.azsl.txt @@ -0,0 +1,55 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + /* + This is a dummy shader used to validate detection of "#included files" + */ + +#include + +#include "Test1Color.azsli" +#include + +ShaderResourceGroup DummySrg : SRG_PerDraw +{ + float4 m_color; +} + +struct VSInput +{ + float3 m_position : POSITION; + float4 m_color : COLOR0; +}; + +struct VSOutput +{ + float4 m_position : SV_Position; + float4 m_color : COLOR0; +}; + +VSOutput MainVS(VSInput vsInput) +{ + VSOutput OUT; + OUT.m_position = float4(vsInput.m_position, 1.0); + OUT.m_color = vsInput.m_color; + return OUT; +} + +struct PSOutput +{ + float4 m_color : SV_Target0; +}; + +PSOutput MainPS(VSOutput vsOutput) +{ + PSOutput OUT; + + OUT.m_color = GetTest1Color(DummySrg::m_color) + GetTest3Color(DummySrg::m_color); + + return OUT; +} diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.shader.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.shader.txt new file mode 100644 index 0000000000..b0eac1783e --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/DependencyValidation.shader.txt @@ -0,0 +1,26 @@ +// This is a dummy shader used to validate detection of "#included files" +{ + "Source" : "DependencyValidation.azsl", + + "DepthStencilState" : { + "Depth" : { "Enable" : false, "CompareFunc" : "GreaterEqual" } + }, + + "DrawList" : "forward", + + "ProgramSettings": + { + "EntryPoints": + [ + { + "name": "MainVS", + "type": "Vertex" + }, + { + "name": "MainPS", + "type": "Fragment" + } + ] + } + +} diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test1Color.azsli.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test1Color.azsli.txt new file mode 100644 index 0000000000..7d097beafb --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test1Color.azsli.txt @@ -0,0 +1,18 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + /* + This is a dummy shader used to validate detection of "#included files" + */ + +#include "Test2Color.azsli" + +float4 GetTest1Color(float4 color) +{ + return color + GetTest2Color(color); +} diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test2Color.azsli.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test2Color.azsli.txt new file mode 100644 index 0000000000..2ef946b947 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test2Color.azsli.txt @@ -0,0 +1,16 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + /* + This is a dummy shader used to validate detection of "#included files" + */ + +float4 GetTest2Color(float4 color) +{ + return color * 0.5; +} diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test3Color.azsli.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test3Color.azsli.txt new file mode 100644 index 0000000000..73b0cca434 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/TestAssets/ShaderAssetBuilder/Test3Color.azsli.txt @@ -0,0 +1,16 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + + /* + This is a dummy shader used to validate detection of "#included files" + */ + +float4 GetTest3Color(float4 color) +{ + return color * 0.13; +} diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges.py new file mode 100644 index 0000000000..a05420d960 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges.py @@ -0,0 +1,188 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT + +""" + +import os +import shutil + +def _copy_file(src_file, src_path, target_file, target_path): + # type: (str, str, str, str) -> None + """ + Copies the [src_file] located in [src_path] to the [target_file] located at [target_path]. + Leaves the [target_file] unlocked for reading and writing privileges + :param src_file: The source file to copy (file name) + :param src_path: The source file's path + :param target_file: The target file to copy into (file name) + :param target_path: The target file's path + :return: None + """ + target_file_path = os.path.join(target_path, target_file) + src_file_path = os.path.join(src_path, src_file) + if os.path.exists(target_file_path): + fs.unlock_file(target_file_path) + shutil.copyfile(src_file_path, target_file_path) + +def _copy_tmp_files_in_order(src_directory, file_list, dst_directory, wait_time_in_between = 0.0): + # type: (str, list, str, float) -> None + """ + This function assumes that for each file name listed in @file_list + there's file named "@filename.txt" which the original source file + but they will be copied with just the @filename (.txt removed). + """ + for filename in file_list: + src_name = f"{filename}.txt" + _copy_file(src_name, src_directory, filename, dst_directory) + if wait_time_in_between > 0.0: + print(f"Created {filename} in {dst_directory}") + general.idle_wait(wait_time_in_between) + + +def _remove_file(src_file, src_path): + # type: (str, str) -> None + """ + Removes the [src_file] located in [src_path]. + :param src_file: The source file to copy (file name) + :param src_path: The source file's path + :return: None + """ + src_file_path = os.path.join(src_path, src_file) + if os.path.exists(src_file_path): + fs.unlock_file(src_file_path) + os.remove(src_file_path) + + +def _remove_files(directory, file_list): + for filename in file_list: + _remove_file(filename, directory) + + +def _asset_exists(cache_relative_path): + asset_id = azasset.AssetCatalogRequestBus(azbus.Broadcast, "GetAssetIdByPath", cache_relative_path, azmath.Uuid(), False) + return asset_id.is_valid() + +# List of results that we want to check, this is not 100% necessary but it's a good +# practice to make it easier to debug tests. +# Here we define a tuple of tests +class Results(): + azshader_was_removed = ("azshader was removed", "Failed to remove azshader") + azshader_was_compiled = ("azshader was compiled", "Failed to compile azshader") + + +def ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges(): + """ + This test validates [ATOM-5441] Shader Builders May Fail When Multiple New Files Are Added + It creates source assets to compile a particular shader. + 1- The first phase generates the source assets out of order and slowly. The AP should + wakeup each time one of the source dependencies appears but will fail each time. Only when the + last dependency appears then the shader should build successfully. + 2- The second phase is similar as above, except that all source assets will be created + at once and We also expect that in the end the shader is built successfully. + """ + # Required for automated tests + helper.init_idle() + + game_root_path = os.path.normpath(general.get_game_folder()) + game_asset_path = os.path.join(game_root_path, "Assets") + + base_dir = os.path.dirname(__file__) + src_assets_subdir = os.path.join(base_dir, "TestAssets", "ShaderAssetBuilder") + + with Tracer() as error_tracer: + # The script drives the execution of the test, to return the flow back to the editor, + # we will tick it one time + general.idle_wait_frames(1) + + # This is the order in which the source assets should be deployed + # to avoid source dependency issues with the old MCPP-based CreateJobs. + file_list = [ + "Test2Color.azsli", + "Test3Color.azsli", + "Test1Color.azsli", + "DependencyValidation.azsl", + "DependencyValidation.shader" + ] + + reverse_file_list = file_list[::-1] + + # Remove files in reverse order + _remove_files(game_asset_path, reverse_file_list) + + # Wait here until the azshader doesn't exist anymore. + azshader_name = "assets/dependencyvalidation.azshader" + helper.wait_for_condition(lambda: not _asset_exists(azshader_name), 5.0) + + Report.critical_result(Results.azshader_was_removed, not _asset_exists(azshader_name)) + + _copy_tmp_files_in_order(src_assets_subdir, file_list, game_asset_path, 1.0) + + # Give enough time to AP to compile the shader + helper.wait_for_condition(lambda: _asset_exists(azshader_name), 60.0) + + Report.critical_result(Results.azshader_was_compiled, _asset_exists(azshader_name)) + + # The first part was about compiling the shader under normal conditions. + # Let's remove the files from the previous phase and will proceed + # to make the source files visible to the AP in reverse order. The + # ShaderAssetBuilder will only succeed when the last file becomes visible. + _remove_files(game_asset_path, reverse_file_list) + helper.wait_for_condition(lambda: not _asset_exists(azshader_name), 5.0) + Report.critical_result(Results.azshader_was_removed, not _asset_exists(azshader_name)) + + # Remark, if you are running this test manually from the Editor with "pyRunFile", + # You'll notice how the AP issues notifications that it fails to compile the shader + # as the source files are being copied to the "Assets" subfolder. + # Those errors are OK and also expected because We need the AP to wake up as each + # reported source dependency exists. Once the last file is copied then all source + # dependencies are fully satisfied and the shader should compile successfully. + # And this summarizes the importance of this Test: The previous version + # of ShaderAssetBuilder::CreateJobs was incapable of compiling the shader under the conditions + # presented in this test, but with the new version of ShaderAssetBuilder::CreateJobs, which + # doesn't use MCPP for #include files discovery, it should eventually compile the shader + # once all the source files are in place. + _copy_tmp_files_in_order(src_assets_subdir, reverse_file_list, game_asset_path, 3.0) + + # Give enough time to AP to compile the shader + helper.wait_for_condition(lambda: _asset_exists(azshader_name), 60.0) + + Report.critical_result(Results.azshader_was_compiled, _asset_exists(azshader_name)) + + # The last phase of the test puts stress on potential race conditions + # when all required files appear as soon as possible. + + # First Clean up. + # Remove left over files. + _remove_files(game_asset_path, reverse_file_list) + helper.wait_for_condition(lambda: not _asset_exists(azshader_name), 5.0) + Report.critical_result(Results.azshader_was_removed, not _asset_exists(azshader_name)) + + # Now let's copy all the source files to the "Assets" folder as fast as possible. + _copy_tmp_files_in_order(src_assets_subdir, reverse_file_list, game_asset_path) + + # Give enough time to AP to compile the shader + helper.wait_for_condition(lambda: _asset_exists(azshader_name), 60.0) + + Report.critical_result(Results.azshader_was_compiled, _asset_exists(azshader_name)) + + # All good, let's cleanup leftover files before closing the test. + _remove_files(game_asset_path, reverse_file_list) + helper.wait_for_condition(lambda: not _asset_exists(azshader_name), 5.0) + + +if __name__ == "__main__": + # All exposed python bindings are in azlmbr + import azlmbr.legacy.general as general + import azlmbr.bus as azbus + import azlmbr.asset as azasset + import azlmbr.math as azmath + + # Import report and test helper utilities + from editor_python_test_tools.utils import Report + from editor_python_test_tools.utils import TestHelper as helper + from editor_python_test_tools.utils import Tracer + import ly_test_tools.environment.file_system as fs + + Report.start_test(ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges) \ No newline at end of file diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_ShaderBuildPipelineSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_ShaderBuildPipelineSuite.py new file mode 100644 index 0000000000..9ef93ea238 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_ShaderBuildPipelineSuite.py @@ -0,0 +1,19 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT + +Main suite tests for the Shader Build Pipeline. +""" +import pytest +from ly_test_tools import LAUNCHERS +from ly_test_tools.o3de.editor_test import EditorTestSuite, EditorSingleTest + +@pytest.mark.parametrize("project", ["AutomatedTesting"]) +@pytest.mark.parametrize("launcher_platform", ['windows_editor']) +class TestShaderBuildPipelineMain(EditorTestSuite): + """Holds tests for Shader Build Pipeline validation""" + + class ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges(EditorSingleTest): + from .atom_hydra_scripts import hydra_ShaderAssetBuilder_RecompilesShaderAsChainOfDependenciesChanges as test_module \ No newline at end of file diff --git a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt index c0bdfd4a8b..efbedb0a38 100644 --- a/Gems/Atom/Asset/Shader/Code/CMakeLists.txt +++ b/Gems/Atom/Asset/Shader/Code/CMakeLists.txt @@ -65,6 +65,7 @@ ly_add_target( AZ::AzFramework AZ::AzToolsFramework Gem::Atom_RHI.Edit + Gem::Atom_RPI.Edit Gem::Atom_RPI.Public ) diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp index 6673da2be3..2babba1ecc 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderAssetBuilder.cpp @@ -61,10 +61,99 @@ namespace AZ static constexpr char ShaderAssetBuilderName[] = "ShaderAssetBuilder"; static constexpr uint32_t ShaderAssetBuildTimestampParam = 0; + //! The search will start in @currentFolderPath. + //! if the file is not found then it searches in order of appearence in @includeDirectories. + //! If the search yields no existing file it returns an empty string. + static AZStd::string DiscoverFullPath(AZStd::string_view normalizedRelativePath, AZStd::string_view currentFolderPath, const AZStd::vector& includeDirectories) + { + AZStd::string fullPath; + AzFramework::StringFunc::Path::Join(currentFolderPath.data(), normalizedRelativePath.data(), fullPath); + if (AZ::IO::SystemFile::Exists(fullPath.c_str())) + { + return fullPath; + } + + for (const auto &includeDir : includeDirectories) + { + AzFramework::StringFunc::Path::Join(includeDir.c_str(), normalizedRelativePath.data(), fullPath); + if (AZ::IO::SystemFile::Exists(fullPath.c_str())) + { + return fullPath; + } + } + + return ""; + } + + // Appends to @includedFiles normalized paths of possible future locations of the file @normalizedRelativePath. + // The future locations are each directory listed in @includeDirectories joined with @normalizedRelativePath. + // This function is called when an included file doesn't exist but We need to declare source dependency so a .shader + // asset is rebuilt when the missing file appears in the future. + static void AppendListOfPossibleFutureLocations(AZStd::unordered_set& includedFiles, AZStd::string_view normalizedRelativePath, AZStd::string_view currentFolderPath, const AZStd::vector& includeDirectories) + { + AZStd::string fullPath; + AzFramework::StringFunc::Path::Join(currentFolderPath.data(), normalizedRelativePath.data(), fullPath); + includedFiles.insert(fullPath); + for (const auto &includeDir : includeDirectories) + { + AzFramework::StringFunc::Path::Join(includeDir.c_str(), normalizedRelativePath.data(), fullPath); + includedFiles.insert(fullPath); + } + } + + //! Parses, using depth-first recursive approach, azsl files. Looks for '#include ' or '#include "foo/bar/blah.h"' lines + //! and in turn parses the included files. + //! The included files are searched in the directories listed in @includeDirectories. Basically it's a similar approach + //! as how most C-preprocessors would find included files. + static void GetListOfIncludedFiles(AZStd::string_view sourceFilePath, const AZStd::vector& includeDirectories, + const ShaderBuilderUtility::IncludedFilesParser& includedFilesParser, AZStd::unordered_set& includedFiles) + { + auto outcome = includedFilesParser.ParseFileAndGetIncludedFiles(sourceFilePath); + if (!outcome.IsSuccess()) + { + AZ_Warning(ShaderAssetBuilderName, false, outcome.GetError().c_str()); + return; + } + + // Cache the path of the folder where @sourceFilePath is located. + AZStd::string sourceFileFolderPath; + { + AZStd::string drive; + AzFramework::StringFunc::Path::Split(sourceFilePath.data(), &drive, &sourceFileFolderPath); + if (!drive.empty()) + { + AzFramework::StringFunc::Path::Join(drive.c_str(), sourceFileFolderPath.c_str(), sourceFileFolderPath); + } + } + + auto listOfRelativePaths = outcome.TakeValue(); + for (auto relativePath : listOfRelativePaths) + { + auto fullPath = DiscoverFullPath(relativePath, sourceFileFolderPath, includeDirectories); + if (fullPath.empty()) + { + // The file doesn't exist in any of the includeDirectories. It doesn't exist in @sourceFileFolderPath either. + // The file may appear in the future in one of those directories, We must build an exhaustive list + // of full file paths where the file may appear in the future. + AppendListOfPossibleFutureLocations(includedFiles, relativePath, sourceFileFolderPath, includeDirectories); + continue; + } + + // Add the file to the list and keep parsing recursively. + if (includedFiles.count(fullPath)) + { + continue; + } + includedFiles.insert(fullPath); + GetListOfIncludedFiles(fullPath, includeDirectories, includedFilesParser, includedFiles); + } + } + void ShaderAssetBuilder::CreateJobs(const AssetBuilderSDK::CreateJobsRequest& request, AssetBuilderSDK::CreateJobsResponse& response) const { AZStd::string fullPath; AzFramework::StringFunc::Path::ConstructFull(request.m_watchFolder.data(), request.m_sourceFile.data(), fullPath, true); + ShaderBuilderUtility::IncludedFilesParser includedFilesParser; AZ_TracePrintf(ShaderAssetBuilderName, "CreateJobs for Shader \"%s\"\n", fullPath.data()); @@ -90,36 +179,6 @@ namespace AZ AZStd::string azslFullPath; ShaderBuilderUtility::GetAbsolutePathToAzslFile(fullPath, shaderSourceData.m_source, azslFullPath); - if (!IO::FileIOBase::GetInstance()->Exists(azslFullPath.c_str())) - { - AZ_Error( - ShaderAssetBuilderName, false, "Shader program listed as the source entry does not exist: %s.", azslFullPath.c_str()); - response.m_result = AssetBuilderSDK::CreateJobsResultCode::Failed; - return; - } - - - GlobalBuildOptions buildOptions = ReadBuildOptions(ShaderAssetBuilderName); - - // [GFX TODO] [ATOM-14966] In principle, based on macro definitions, included files can change per supervariant. - // So, the list of source asset dependencies must be collected by running MCPP on each supervariant. - // For now, we will run MCPP only once because CreateJobs() should be as light as possible. - // - // Regardless of the PlatformInfo and enabled ShaderPlatformInterfaces, the azsl file will be preprocessed - // with the sole purpose of extracting all included files. For each included file a SourceDependency will be declared. - PreprocessorData output; - buildOptions.m_compilerArguments.Merge(shaderSourceData.m_compiler); - PreprocessFile(azslFullPath, output, buildOptions.m_preprocessorSettings, true, true); - for (auto includePath : output.includedPaths) - { - // m_sourceFileDependencyList does not support paths with "." or ".." for relative lookup, but the preprocessor - // may produce path strings like "C:/a/b/c/../../d/file.azsli" so we have to normalize - AzFramework::StringFunc::Path::Normalize(includePath); - - AssetBuilderSDK::SourceFileDependency includeFileDependency; - includeFileDependency.m_sourceFileDependencyPath = includePath; - response.m_sourceFileDependencyList.emplace_back(includeFileDependency); - } { // Add the AZSL as source dependency @@ -128,6 +187,26 @@ namespace AZ response.m_sourceFileDependencyList.emplace_back(azslFileDependency); } + if (!IO::FileIOBase::GetInstance()->Exists(azslFullPath.c_str())) + { + AZ_Error( + ShaderAssetBuilderName, false, "Shader program listed as the source entry does not exist: %s.", azslFullPath.c_str()); + // Treat as success, so when the azsl file shows up the AP will try to recompile. + response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; + return; + } + + GlobalBuildOptions buildOptions = ReadBuildOptions(ShaderAssetBuilderName); + + AZStd::unordered_set includedFiles; + GetListOfIncludedFiles(azslFullPath, buildOptions.m_preprocessorSettings.m_projectIncludePaths, includedFilesParser, includedFiles); + for (auto includePath : includedFiles) + { + AssetBuilderSDK::SourceFileDependency includeFileDependency; + includeFileDependency.m_sourceFileDependencyPath = includePath; + response.m_sourceFileDependencyList.emplace_back(includeFileDependency); + } + for (const AssetBuilderSDK::PlatformInfo& platformInfo : request.m_enabledPlatforms) { AZ_TraceContext("For platform", platformInfo.m_identifier.data()); @@ -149,6 +228,10 @@ namespace AZ response.m_createJobOutputs.push_back(jobDescriptor); } // for all request.m_enabledPlatforms + const AZStd::sys_time_t createJobsEndStamp = AZStd::GetTimeNowMicroSecond(); + const u64 createJobDurationMicros = createJobsEndStamp - shaderAssetBuildTimestamp; + AZ_TracePrintf(ShaderAssetBuilderName, "CreateJobs for %s took %llu microseconds", fullPath.c_str(), createJobDurationMicros ); + response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; } @@ -286,6 +369,13 @@ namespace AZ return; } } + else + { + // CreateJobs was not successful if there's no timestamp property in m_jobParameters. + response.m_resultCode = AssetBuilderSDK::ProcessJobResult_Failed; + AZ_Assert(false, "Missing ShaderAssetBuildTimestampParam"); + return; + } auto supervariantList = ShaderBuilderUtility::GetSupervariantListFromShaderSourceData(shaderSourceData); diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp index e47dd55a97..eb91d9e866 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include @@ -814,6 +815,51 @@ namespace AZ return success; } + IncludedFilesParser::IncludedFilesParser() + { + AZStd::regex regex(R"(#\s*include\s+[<|"]([\w|/|\\|\.|-]+)[>|"])", AZStd::regex::ECMAScript); + m_includeRegex.swap(regex); + } + + AZStd::vector IncludedFilesParser::ParseStringAndGetIncludedFiles(AZStd::string_view haystack) const + { + AZStd::vector listOfFilePaths; + AZStd::smatch match; + AZStd::string::const_iterator searchStart(haystack.cbegin()); + while (AZStd::regex_search(searchStart, haystack.cend(), match, m_includeRegex)) + { + if (match.size() > 1) + { + AZStd::string relativeFilePath(match[1].str().c_str()); + AzFramework::StringFunc::Path::Normalize(relativeFilePath); + listOfFilePaths.push_back(relativeFilePath); + } + searchStart = match.suffix().first; + } + return listOfFilePaths; + } + + AZ::Outcome, AZStd::string> IncludedFilesParser::ParseFileAndGetIncludedFiles(AZStd::string_view sourceFilePath) const + { + AZ::IO::FileIOStream stream(sourceFilePath.data(), AZ::IO::OpenMode::ModeRead); + if (!stream.IsOpen()) + { + return AZ::Failure(AZStd::string::format("\"%s\" source file could not be opened.", sourceFilePath.data())); + } + + if (!stream.CanRead()) + { + return AZ::Failure(AZStd::string::format("\"%s\" source file could not be read.", sourceFilePath.data())); + } + + AZStd::string hayStack; + hayStack.resize_no_construct(stream.GetLength()); + stream.Read(stream.GetLength(), hayStack.data()); + + auto listOfFilePaths = ParseStringAndGetIncludedFiles(hayStack); + return AZ::Success(AZStd::move(listOfFilePaths)); + } + } // namespace ShaderBuilderUtility } // namespace ShaderBuilder } // AZ diff --git a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h index c000ba9df6..5d45ade9cb 100644 --- a/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h +++ b/Gems/Atom/Asset/Shader/Code/Source/Editor/ShaderBuilderUtility.h @@ -141,6 +141,29 @@ namespace AZ const uint32_t rhiUniqueIndex, const AZStd::string& platformIdentifier, const AZStd::string& shaderJsonPath, const uint32_t supervariantIndex, RPI::ShaderAssetSubId shaderAssetSubId); + + class IncludedFilesParser + { + public: + IncludedFilesParser(); + ~IncludedFilesParser() = default; + + //! This static function was made public for testability purposes only. + //! Parses the string @haystack, looking for "#include file" lines with a regular expression. + //! Returns the list of relative paths as included by the file. + //! REMARK: The algorithm may over prescribe what files to include because it doesn't discern between comments, etc. + //! Also, a #include line may be protected by #ifdef macros but this algorithm doesn't care. + //! Over prescribing is not a real problem, albeit potential waste in processing. Under prescribing would be a real problem. + AZStd::vector ParseStringAndGetIncludedFiles(AZStd::string_view haystack) const; + + //! This static function was made public for testability purposes only. + //! Opens the file @sourceFilePath, loads the content into a string and returns ParseStringAndGetIncludedFiles(content) + AZ::Outcome, AZStd::string> ParseFileAndGetIncludedFiles(AZStd::string_view sourceFilePath) const; + + private: + AZStd::regex m_includeRegex; + }; + } // ShaderBuilderUtility namespace } // ShaderBuilder namespace } // AZ diff --git a/Gems/Atom/Asset/Shader/Code/Tests/ShaderBuilderUtilityTests.cpp b/Gems/Atom/Asset/Shader/Code/Tests/ShaderBuilderUtilityTests.cpp new file mode 100644 index 0000000000..d477060d04 --- /dev/null +++ b/Gems/Atom/Asset/Shader/Code/Tests/ShaderBuilderUtilityTests.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +#include "Common/ShaderBuilderTestFixture.h" + +#include + +namespace UnitTest +{ + using namespace AZ; + + // The main purpose of this class is to test ShaderBuilderUtility functions + class ShaderBuilderUtilityTests : public ShaderBuilderTestFixture + { + }; // class ShaderBuilderUtilityTests + + + TEST_F(ShaderBuilderUtilityTests, IncludedFilesParser_ParseStringAndGetIncludedFiles) + { + AZStd::string haystack( + "Some content to parse\n" + "#include \n" + "// #include \n" + "blah # include \"valid_file3.azsli\"\n" + "bar include \n" + "foo # include \"a/directory/valid-file5.azsli\"\n" + "# include \n" + "#includ \"a\\dire-ctory\\invalid-file7.azsli\"\n" + ); + + AZ::ShaderBuilder::ShaderBuilderUtility::IncludedFilesParser includedFilesParser; + auto fileList = includedFilesParser.ParseStringAndGetIncludedFiles(haystack); + EXPECT_EQ(fileList.size(), 5); + + auto it = AZStd::find(fileList.begin(), fileList.end(), "valid_file1.azsli"); + EXPECT_TRUE(it != fileList.end()); + + it = AZStd::find(fileList.begin(), fileList.end(), "valid_file2.azsli"); + EXPECT_TRUE(it != fileList.end()); + + it = AZStd::find(fileList.begin(), fileList.end(), "valid_file3.azsli"); + EXPECT_TRUE(it != fileList.end()); + + // Remark: From now on We must normalize because internally AZ::ShaderBuilder::ShaderBuilderUtility::IncludedFilesParser + // always returns normalized paths. + { + AZStd::string fileName("a\\dire-ctory\\invalid-file4.azsli"); + AzFramework::StringFunc::Path::Normalize(fileName); + it = AZStd::find(fileList.begin(), fileList.end(), fileName); + EXPECT_TRUE(it == fileList.end()); + } + + { + AZStd::string fileName("a\\directory\\valid-file5.azsli"); + AzFramework::StringFunc::Path::Normalize(fileName); + it = AZStd::find(fileList.begin(), fileList.end(), fileName); + EXPECT_TRUE(it != fileList.end()); + } + + { + AZStd::string fileName("a\\dire-ctory\\valid-file6.azsli"); + AzFramework::StringFunc::Path::Normalize(fileName); + it = AZStd::find(fileList.begin(), fileList.end(), fileName); + EXPECT_TRUE(it != fileList.end()); + } + + { + AZStd::string fileName("a\\dire-ctory\\invalid-file7.azsli"); + AzFramework::StringFunc::Path::Normalize(fileName); + it = AZStd::find(fileList.begin(), fileList.end(), fileName); + EXPECT_TRUE(it == fileList.end()); + } + } + +} //namespace UnitTest + +//AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV); + diff --git a/Gems/Atom/Asset/Shader/Code/atom_asset_shader_builders_tests_files.cmake b/Gems/Atom/Asset/Shader/Code/atom_asset_shader_builders_tests_files.cmake index 033b399478..ab8df70bdb 100644 --- a/Gems/Atom/Asset/Shader/Code/atom_asset_shader_builders_tests_files.cmake +++ b/Gems/Atom/Asset/Shader/Code/atom_asset_shader_builders_tests_files.cmake @@ -11,4 +11,5 @@ set(FILES Tests/Common/ShaderBuilderTestFixture.cpp Tests/SupervariantCmdArgumentTests.cpp Tests/McppBinderTests.cpp + Tests/ShaderBuilderUtilityTests.cpp ) diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurHor.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurHor.azsl index 64f6b3a4b5..a7dfad1c24 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurHor.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurHor.azsl @@ -55,7 +55,7 @@ int GetLdsIndex(int2 ldsPosition) // --- Common file start --- -// #include +// include ('#' symbol before 'include' was removed on purpose to avoid parsing this azsli file during ShaderAssetBuilder::CreateJobs) // This include fails with the asset processor when generating the .shader for this file // Everything below this is copy pasted from FastDepthAwareBlurCommon.azsli up until the // "Common file end" marker below diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurVer.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurVer.azsl index cfb49f5911..b4f230c99c 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurVer.azsl +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/FastDepthAwareBlurVer.azsl @@ -55,7 +55,7 @@ int GetLdsIndex(int2 ldsPosition) // --- Common file start --- -// #include +// include ('#' symbol before 'include' was removed on purpose to avoid parsing this azsli file during ShaderAssetBuilder::CreateJobs) // This include fails with the asset processor when generating the .shader for this file // Everything below this is copy pasted from FastDepthAwareBlurCommon.azsli up until the // "Common file end" marker below diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAA.azsli b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAA.azsli index 8c03816b26..a32b56857c 100644 --- a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAA.azsli +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/SMAA.azsli @@ -157,7 +157,7 @@ * #define SMAA_RT_METRICS float4(1.0 / 1280.0, 1.0 / 720.0, 1280.0, 720.0) * #define SMAA_HLSL_4 * #define SMAA_PRESET_HIGH - * #include "SMAA.h" + * include "SMAA.h" ('#' symbol before 'include' was removed on purpose to avoid parsing this azsli file during ShaderAssetBuilder::CreateJobs) * * Note that SMAA_RT_METRICS doesn't need to be a macro, it can be a * uniform variable. The code is designed to minimize the impact of not From dc930a5987af99e333e7f858a498faf682c045e7 Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Wed, 15 Sep 2021 08:32:52 -0700 Subject: [PATCH 315/355] Fix LuaIDE crash at startup caused by missing System Allocator Initialization (#4130) Signed-off-by: Steve Pham --- Code/Tools/Standalone/Source/Editor/LuaEditor.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Code/Tools/Standalone/Source/Editor/LuaEditor.cpp b/Code/Tools/Standalone/Source/Editor/LuaEditor.cpp index 89ab8207ff..f6d905515b 100644 --- a/Code/Tools/Standalone/Source/Editor/LuaEditor.cpp +++ b/Code/Tools/Standalone/Source/Editor/LuaEditor.cpp @@ -35,6 +35,10 @@ int main(int argc, char* argv[]) { AZ::AllocatorInstance::Create(); } + if (!AZ::AllocatorInstance::IsReady()) + { + AZ::AllocatorInstance::Create(); + } AZStd::unique_ptr fileIO = AZStd::unique_ptr(aznew AZ::IO::LocalFileIO()); AZ::IO::FileIOBase::SetInstance(fileIO.get()); @@ -70,6 +74,10 @@ int main(int argc, char* argv[]) // if its in GUI mode or not. } + if (AZ::AllocatorInstance::IsReady()) + { + AZ::AllocatorInstance::Destroy(); + } if (AZ::AllocatorInstance::IsReady()) { AZ::AllocatorInstance::Destroy(); From 089391f761ab3a1e1bda34273e8c7f3333ee1b9b Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Wed, 15 Sep 2021 10:57:37 -0500 Subject: [PATCH 316/355] Terrain System cleanups and unit tests (#4119) * Remove the "TEST_SUPPORTED" traits. Terrain unit tests should be usable on all platforms, so they shouldn't need a platform-specific trait to enable/disable. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fix a few misc terrain bugs. * Change Activate/Deactivate to happen immediately instead of deferring. There were too many order-of-operation bugs caused by trying to defer this. * Added implementation for calculating normals. * Fixed bug where GetHeightSynchronous wasn't stopping at the highest-priority layer. * Added locks for SurfaceData bus to help ensure we lock our mutexes in the correct order and avoid deadlocks. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Add trivial TerrainSystem tests. Tests construction, Activate(), Deactivate(), and destruction. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Unified Terrain system calls on single bus. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Added mock for TerrainDataNotificationBus listener. Also added unit tests to verify the listener, and added in missing notification events. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Removed extra Sampler class. Fixed up APIs to correctly pass Sampler and terrainExistsPtr around. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Switched MockTerrainSystem to be proper gmock. This makes it for flexible to use and easier to reuse from other test environments. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fix settings bug caused by bad order of operations that occurred when the methods moved to a different bus. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Eliminate extra EBus by simplifying area initialization. Previously, there was a back-and-forth ebus signal used for the terrain system to find any terrain spawners that were created prior to the terrain system activation. Now it uses the more simple technique of just grabbing all the spawners that are currently hooked up to the spawner ebus. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Switch to NiceMock so that "uninteresting" mock calls get ignored. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Addressed PR feedback. Filled in terrainExistsPtr at the end, and added it to GetNormal as well. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fixed shader height calculation. It was off by half a pixel, and it was interpolating, both of which were wrong. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> --- Code/Editor/GameExporter.cpp | 2 +- .../Terrain/TerrainDataRequestBus.cpp | 3 +- .../Terrain/TerrainDataRequestBus.h | 5 +- Gems/PhysX/Code/Tests/PhysXTestUtil.h | 23 +- .../Shaders/Terrain/TerrainCommon.azsli | 14 +- Gems/Terrain/Code/CMakeLists.txt | 67 +++--- .../TerrainHeightGradientListComponent.cpp | 12 +- .../TerrainHeightGradientListComponent.h | 10 +- .../TerrainLayerSpawnerComponent.cpp | 7 - .../Components/TerrainLayerSpawnerComponent.h | 5 +- .../Components/TerrainWorldComponent.cpp | 14 +- .../TerrainWorldDebuggerComponent.cpp | 4 +- .../Source/TerrainSystem/TerrainSystem.cpp | 221 +++++++++++------- .../Code/Source/TerrainSystem/TerrainSystem.h | 17 +- .../Source/TerrainSystem/TerrainSystemBus.h | 47 +--- Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp | 59 +++-- Gems/Terrain/Code/Tests/TerrainMocks.h | 60 ++--- Gems/Terrain/Code/Tests/TerrainSystemTest.cpp | 92 ++++++++ Gems/Terrain/Code/Tests/TerrainTest.cpp | 20 -- Gems/Terrain/Code/terrain_tests_files.cmake | 1 + 20 files changed, 395 insertions(+), 288 deletions(-) create mode 100644 Gems/Terrain/Code/Tests/TerrainSystemTest.cpp diff --git a/Code/Editor/GameExporter.cpp b/Code/Editor/GameExporter.cpp index 1fc980fdac..00dc3d8de1 100644 --- a/Code/Editor/GameExporter.cpp +++ b/Code/Editor/GameExporter.cpp @@ -318,7 +318,7 @@ void CGameExporter::ExportLevelInfo(const QString& path) root->setAttr("Name", levelName.toUtf8().data()); auto terrain = AzFramework::Terrain::TerrainDataRequestBus::FindFirstHandler(); const AZ::Aabb terrainAabb = terrain ? terrain->GetTerrainAabb() : AZ::Aabb::CreateFromPoint(AZ::Vector3::CreateZero()); - const AZ::Vector2 terrainGridResolution = terrain ? terrain->GetTerrainGridResolution() : AZ::Vector2::CreateOne(); + const AZ::Vector2 terrainGridResolution = terrain ? terrain->GetTerrainHeightQueryResolution() : AZ::Vector2::CreateOne(); const int compiledHeightmapSize = static_cast(terrainAabb.GetXExtent() / terrainGridResolution.GetX()); root->setAttr("HeightmapSize", compiledHeightmapSize); diff --git a/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp b/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp index 947d3821ab..1fb29cfa30 100644 --- a/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp +++ b/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.cpp @@ -51,7 +51,8 @@ namespace AzFramework ->Event("GetNormal", &AzFramework::Terrain::TerrainDataRequestBus::Events::GetNormal) ->Event("GetNormalFromFloats", &AzFramework::Terrain::TerrainDataRequestBus::Events::GetNormalFromFloats) ->Event("GetTerrainAabb", &AzFramework::Terrain::TerrainDataRequestBus::Events::GetTerrainAabb) - ->Event("GetTerrainGridResolution", &AzFramework::Terrain::TerrainDataRequestBus::Events::GetTerrainGridResolution) + ->Event("GetTerrainHeightQueryResolution", + &AzFramework::Terrain::TerrainDataRequestBus::Events::GetTerrainHeightQueryResolution) ; } diff --git a/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.h b/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.h index 08e238434e..92eb28a110 100644 --- a/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.h +++ b/Code/Framework/AzFramework/AzFramework/Terrain/TerrainDataRequestBus.h @@ -59,8 +59,11 @@ namespace AzFramework static AZ::Vector3 GetDefaultTerrainNormal() { return AZ::Vector3::CreateAxisZ(); } // System-level queries to understand world size and resolution - virtual AZ::Vector2 GetTerrainGridResolution() const = 0; + virtual AZ::Vector2 GetTerrainHeightQueryResolution() const = 0; + virtual void SetTerrainHeightQueryResolution(AZ::Vector2 queryResolution) = 0; + virtual AZ::Aabb GetTerrainAabb() const = 0; + virtual void SetTerrainAabb(const AZ::Aabb& worldBounds) = 0; //! Returns terrains height in meters at location x,y. //! @terrainExistsPtr: Can be nullptr. If != nullptr then, if there's no terrain at location x,y or location x,y is inside a terrain HOLE then *terrainExistsPtr will become false, diff --git a/Gems/PhysX/Code/Tests/PhysXTestUtil.h b/Gems/PhysX/Code/Tests/PhysXTestUtil.h index b1ba23600a..8e81b9cb89 100644 --- a/Gems/PhysX/Code/Tests/PhysXTestUtil.h +++ b/Gems/PhysX/Code/Tests/PhysXTestUtil.h @@ -93,9 +93,26 @@ namespace PhysX //////////////////////////////////////////////////////////////////////// // TerrainDataRequestBus interface dummy implementation - AZ::Vector2 GetTerrainGridResolution() const override { return {}; } - AZ::Aabb GetTerrainAabb() const override { return {}; } - float GetHeight(AZ::Vector3, Sampler, bool*) const override { return {}; } + AZ::Vector2 GetTerrainHeightQueryResolution() const override + { + return {}; + } + void SetTerrainHeightQueryResolution([[maybe_unused]] AZ::Vector2 queryResolution) override + { + } + + AZ::Aabb GetTerrainAabb() const override + { + return {}; + } + void SetTerrainAabb([[maybe_unused]] const AZ::Aabb& worldBounds) override + { + } + + float GetHeight(AZ::Vector3, Sampler, bool*) const override + { + return {}; + } float GetHeightFromFloats(float, float, Sampler, bool*) const override { return {}; } AzFramework::SurfaceData::SurfaceTagWeight GetMaxSurfaceWeight(AZ::Vector3, Sampler, bool*) const override { return {}; } AzFramework::SurfaceData::SurfaceTagWeight GetMaxSurfaceWeightFromFloats(float, float, Sampler, bool*) const override { return {}; } diff --git a/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli b/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli index 6e489796d7..18b85bbd43 100644 --- a/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli +++ b/Gems/Terrain/Assets/Shaders/Terrain/TerrainCommon.azsli @@ -11,16 +11,16 @@ ShaderResourceGroup ObjectSrg : SRG_PerObject { Texture2D m_heightmapImage; - Sampler LinearSampler + Sampler PointSampler { - MinFilter = Linear; - MagFilter = Linear; - MipFilter = Linear; + MinFilter = Point; + MagFilter = Point; + MipFilter = Point; AddressU = Clamp; AddressV = Clamp; AddressW = Clamp; }; - + row_major float3x4 m_modelToWorld; struct TerrainData @@ -57,8 +57,8 @@ float4x4 GetObject_WorldMatrix() float GetHeight(float2 origUv) { - float2 uv = clamp(origUv, 0.0f, 1.0f); - return ObjectSrg::m_terrainData.m_heightScale * (ObjectSrg::m_heightmapImage.SampleLevel(ObjectSrg::LinearSampler, uv, 0).r - 0.5f); + float2 uv = clamp(origUv + (ObjectSrg::m_terrainData.m_uvStep * 0.5f), 0.0f, 1.0f); + return ObjectSrg::m_terrainData.m_heightScale * (ObjectSrg::m_heightmapImage.SampleLevel(ObjectSrg::PointSampler, uv, 0).r - 0.5f); } float4 GetTerrainProjectedPosition(ObjectSrg::TerrainData terrainData, float2 vertexPosition, float2 uv) diff --git a/Gems/Terrain/Code/CMakeLists.txt b/Gems/Terrain/Code/CMakeLists.txt index b4a35edbbf..0feacdaf71 100644 --- a/Gems/Terrain/Code/CMakeLists.txt +++ b/Gems/Terrain/Code/CMakeLists.txt @@ -83,15 +83,36 @@ endif() ################################################################################ # See if globally, tests are supported if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) - # We globally support tests, see if we support tests on this platform for Terrain.Static - if(PAL_TRAIT_TERRAIN_TEST_SUPPORTED) - # We support Terrain.Tests on this platform, add Terrain.Tests target which depends on Terrain.Static + ly_add_target( + NAME Terrain.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} + NAMESPACE Gem + FILES_CMAKE + terrain_files.cmake + terrain_tests_files.cmake + INCLUDE_DIRECTORIES + PRIVATE + Tests + Source + BUILD_DEPENDENCIES + PRIVATE + AZ::AzTest + AZ::AzFramework + Gem::Terrain.Static + ) + + # Add Terrain.Tests to googletest + ly_add_googletest( + NAME Gem::Terrain.Tests + ) + + # If we are a host platform we want to add tools test like editor tests here + if(PAL_TRAIT_BUILD_HOST_TOOLS) + # We support Terrain.Editor.Tests on this platform, add Terrain.Editor.Tests target which depends on Terrain.Editor ly_add_target( - NAME Terrain.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} + NAME Terrain.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} NAMESPACE Gem FILES_CMAKE - terrain_files.cmake - terrain_tests_files.cmake + terrain_editor_tests_files.cmake INCLUDE_DIRECTORIES PRIVATE Tests @@ -99,40 +120,12 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) BUILD_DEPENDENCIES PRIVATE AZ::AzTest - AZ::AzFramework - Gem::Terrain.Static + Gem::Terrain.Editor ) - # Add Terrain.Tests to googletest + # Add Terrain.Editor.Tests to googletest ly_add_googletest( - NAME Gem::Terrain.Tests + NAME Gem::Terrain.Editor.Tests ) endif() - - # If we are a host platform we want to add tools test like editor tests here - if(PAL_TRAIT_BUILD_HOST_TOOLS) - # We are a host platform, see if Editor tests are supported on this platform - if(PAL_TRAIT_TERRAIN_EDITOR_TEST_SUPPORTED) - # We support Terrain.Editor.Tests on this platform, add Terrain.Editor.Tests target which depends on Terrain.Editor - ly_add_target( - NAME Terrain.Editor.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} - NAMESPACE Gem - FILES_CMAKE - terrain_editor_tests_files.cmake - INCLUDE_DIRECTORIES - PRIVATE - Tests - Source - BUILD_DEPENDENCIES - PRIVATE - AZ::AzTest - Gem::Terrain.Editor - ) - - # Add Terrain.Editor.Tests to googletest - ly_add_googletest( - NAME Gem::Terrain.Editor.Tests - ) - endif() - endif() endif() diff --git a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp index d64f660d90..4d0cb6576d 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp @@ -166,14 +166,20 @@ namespace Terrain } void TerrainHeightGradientListComponent::GetHeight( - const AZ::Vector3& inPosition, AZ::Vector3& outPosition, [[maybe_unused]] Sampler sampleFilter = Sampler::DEFAULT) + const AZ::Vector3& inPosition, + AZ::Vector3& outPosition, + [[maybe_unused]] AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = + AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) { const float height = GetHeight(inPosition.GetX(), inPosition.GetY()); outPosition.SetZ(height); } void TerrainHeightGradientListComponent::GetNormal( - const AZ::Vector3& inPosition, AZ::Vector3& outNormal, [[maybe_unused]] Sampler sampleFilter = Sampler::DEFAULT) + const AZ::Vector3& inPosition, + AZ::Vector3& outNormal, + [[maybe_unused]] AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = + AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) { const float x = inPosition.GetX(); const float y = inPosition.GetY(); @@ -206,7 +212,7 @@ namespace Terrain // Get the height range of the entire world m_cachedHeightQueryResolution = AZ::Vector2(1.0f); AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( - m_cachedHeightQueryResolution, &AzFramework::Terrain::TerrainDataRequestBus::Events::GetTerrainGridResolution); + m_cachedHeightQueryResolution, &AzFramework::Terrain::TerrainDataRequestBus::Events::GetTerrainHeightQueryResolution); AZ::Aabb worldBounds = AZ::Aabb::CreateNull(); AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( diff --git a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h index 7635680815..509f003afa 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h @@ -64,8 +64,14 @@ namespace Terrain TerrainHeightGradientListComponent() = default; ~TerrainHeightGradientListComponent() = default; - void GetHeight(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, Sampler sampleFilter) override; - void GetNormal(const AZ::Vector3& inPosition, AZ::Vector3& outNormal, Sampler sampleFilter) override; + void GetHeight( + const AZ::Vector3& inPosition, + AZ::Vector3& outPosition, + AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter) override; + void GetNormal( + const AZ::Vector3& inPosition, + AZ::Vector3& outNormal, + AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter) override; ////////////////////////////////////////////////////////////////////////// // AZ::Component interface implementation diff --git a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp index e17dbd0e93..245c98ccac 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.cpp @@ -104,7 +104,6 @@ namespace Terrain { AZ::TransformNotificationBus::Handler::BusConnect(GetEntityId()); LmbrCentral::ShapeComponentNotificationsBus::Handler::BusConnect(GetEntityId()); - TerrainAreaRequestBus::Handler::BusConnect(GetEntityId()); TerrainSpawnerRequestBus::Handler::BusConnect(GetEntityId()); TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::RegisterArea, GetEntityId()); @@ -114,7 +113,6 @@ namespace Terrain { TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::UnregisterArea, GetEntityId()); TerrainSpawnerRequestBus::Handler::BusDisconnect(); - TerrainAreaRequestBus::Handler::BusDisconnect(); LmbrCentral::ShapeComponentNotificationsBus::Handler::BusDisconnect(); AZ::TransformNotificationBus::Handler::BusDisconnect(); @@ -161,11 +159,6 @@ namespace Terrain return m_configuration.m_useGroundPlane; } - void TerrainLayerSpawnerComponent::RegisterArea() - { - TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::RegisterArea, GetEntityId()); - } - void TerrainLayerSpawnerComponent::RefreshArea() { TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::RefreshArea, GetEntityId()); diff --git a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h index 3f8e72e1b8..c7398bf93e 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainLayerSpawnerComponent.h @@ -58,7 +58,6 @@ namespace Terrain : public AZ::Component , private AZ::TransformNotificationBus::Handler , private LmbrCentral::ShapeComponentNotificationsBus::Handler - , private Terrain::TerrainAreaRequestBus::Handler , private Terrain::TerrainSpawnerRequestBus::Handler { public: @@ -81,6 +80,7 @@ namespace Terrain bool ReadInConfig(const AZ::ComponentConfig* baseConfig) override; bool WriteOutConfig(AZ::ComponentConfig* outBaseConfig) const override; + protected: ////////////////////////////////////////////////////////////////////////// // AZ::TransformNotificationBus::Handler void OnTransformChanged(const AZ::Transform& local, const AZ::Transform& world) override; @@ -92,8 +92,7 @@ namespace Terrain void GetPriority(AZ::u32& outLayer, AZ::u32& outPriority) override; bool GetUseGroundPlane() override; - void RegisterArea() override; - void RefreshArea() override; + void RefreshArea(); private: TerrainLayerSpawnerConfig m_configuration; diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp index 669a8f4b02..d8b7308ef7 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldComponent.cpp @@ -13,6 +13,7 @@ #include #include #include +#include namespace Terrain { @@ -85,17 +86,16 @@ namespace Terrain void TerrainWorldComponent::Activate() { - TerrainSystemServiceRequestBus::Broadcast( - &TerrainSystemServiceRequestBus::Events::SetWorldBounds, - AZ::Aabb::CreateFromMinMax(m_configuration.m_worldMin, m_configuration.m_worldMax) - ); - TerrainSystemServiceRequestBus::Broadcast( - &TerrainSystemServiceRequestBus::Events::SetHeightQueryResolution, m_configuration.m_heightQueryResolution); - // Currently, the Terrain System Component owns the Terrain System instance because the Terrain World component gets recreated // every time an entity is added or removed to a level. If this ever changes, the Terrain System ownership could move into // the level component. TerrainSystemServiceRequestBus::Broadcast(&TerrainSystemServiceRequestBus::Events::Activate); + + AzFramework::Terrain::TerrainDataRequestBus::Broadcast( + &AzFramework::Terrain::TerrainDataRequestBus::Events::SetTerrainAabb, + AZ::Aabb::CreateFromMinMax(m_configuration.m_worldMin, m_configuration.m_worldMax)); + AzFramework::Terrain::TerrainDataRequestBus::Broadcast( + &AzFramework::Terrain::TerrainDataRequestBus::Events::SetTerrainHeightQueryResolution, m_configuration.m_heightQueryResolution); } void TerrainWorldComponent::Deactivate() diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp index d7504295c2..89ffa6364f 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp @@ -171,7 +171,7 @@ namespace Terrain // Determine how far to draw in each direction in world space based on our MaxSectorsToDraw AZ::Vector2 queryResolution = AZ::Vector2(1.0f); AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( - queryResolution, &AzFramework::Terrain::TerrainDataRequests::GetTerrainGridResolution); + queryResolution, &AzFramework::Terrain::TerrainDataRequests::GetTerrainHeightQueryResolution); AZ::Vector3 viewDistance( queryResolution.GetX() * SectorSizeInGridPoints * sqrtf(MaxSectorsToDraw), queryResolution.GetY() * SectorSizeInGridPoints * sqrtf(MaxSectorsToDraw), @@ -214,7 +214,7 @@ namespace Terrain AZ::Vector2 queryResolution = AZ::Vector2(1.0f); AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( - queryResolution, &AzFramework::Terrain::TerrainDataRequests::GetTerrainGridResolution); + queryResolution, &AzFramework::Terrain::TerrainDataRequests::GetTerrainHeightQueryResolution); // Calculate the world size of each sector. Note that this size actually ends at the last point, not the last square. // So for example, the sector size for 3 points will go from (*--*--*) even though it will be used to draw (*--*--*--). diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp index a271d624f5..674af376e4 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -53,7 +54,7 @@ TerrainSystem::TerrainSystem() m_currentSettings.m_worldBounds = AZ::Aabb::CreateNull(); m_requestedSettings = m_currentSettings; - m_requestedSettings.m_worldBounds = AZ::Aabb::CreateFromMinMax(AZ::Vector3(0.0f, 0.0f, 0.0f), AZ::Vector3(4096.0f, 4096.0f, 2048.0f)); + m_requestedSettings.m_worldBounds = AZ::Aabb::CreateFromMinMax(AZ::Vector3(-512.0f), AZ::Vector3(512.0f)); } TerrainSystem::~TerrainSystem() @@ -66,23 +67,76 @@ TerrainSystem::~TerrainSystem() void TerrainSystem::Activate() { - m_requestedSettings.m_systemActive = true; + AzFramework::Terrain::TerrainDataNotificationBus::Broadcast( + &AzFramework::Terrain::TerrainDataNotificationBus::Events::OnTerrainDataCreateBegin); + + m_dirtyRegion = AZ::Aabb::CreateNull(); + m_terrainHeightDirty = true; m_terrainSettingsDirty = true; + m_requestedSettings.m_systemActive = true; + + { + AZStd::shared_lock lock(m_areaMutex); + m_registeredAreas.clear(); + } + + AzFramework::Terrain::TerrainDataRequestBus::Handler::BusConnect(); + + // Register any terrain spawners that were already active before the terrain system activated. + auto enumerationCallback = [&]([[maybe_unused]] Terrain::TerrainSpawnerRequests* terrainSpawner) -> bool + { + AZ::EntityId areaId = *(Terrain::TerrainSpawnerRequestBus::GetCurrentBusId()); + RegisterArea(areaId); + + // Keep Enumerating + return true; + }; + Terrain::TerrainSpawnerRequestBus::EnumerateHandlers(enumerationCallback); + + AzFramework::Terrain::TerrainDataNotificationBus::Broadcast( + &AzFramework::Terrain::TerrainDataNotificationBus::Events::OnTerrainDataCreateEnd); } void TerrainSystem::Deactivate() { - m_requestedSettings.m_systemActive = false; + AzFramework::Terrain::TerrainDataNotificationBus::Broadcast( + &AzFramework::Terrain::TerrainDataNotificationBus::Events::OnTerrainDataDestroyBegin); + + AzFramework::Terrain::TerrainDataRequestBus::Handler::BusDisconnect(); + + { + AZStd::shared_lock lock(m_areaMutex); + m_registeredAreas.clear(); + } + + m_dirtyRegion = AZ::Aabb::CreateNull(); + m_terrainHeightDirty = true; m_terrainSettingsDirty = true; + m_requestedSettings.m_systemActive = false; + + if (auto rpi = AZ::RPI::RPISystemInterface::Get(); rpi) + { + if (auto defaultScene = rpi->GetDefaultScene(); defaultScene) + { + const AZ::RPI::Scene* scene = defaultScene.get(); + if (auto terrainFeatureProcessor = scene->GetFeatureProcessor(); terrainFeatureProcessor) + { + terrainFeatureProcessor->RemoveTerrainData(); + } + } + } + + AzFramework::Terrain::TerrainDataNotificationBus::Broadcast( + &AzFramework::Terrain::TerrainDataNotificationBus::Events::OnTerrainDataDestroyEnd); } -void TerrainSystem::SetWorldBounds(const AZ::Aabb& worldBounds) +void TerrainSystem::SetTerrainAabb(const AZ::Aabb& worldBounds) { m_requestedSettings.m_worldBounds = worldBounds; m_terrainSettingsDirty = true; } -void TerrainSystem::SetHeightQueryResolution(AZ::Vector2 queryResolution) +void TerrainSystem::SetTerrainHeightQueryResolution(AZ::Vector2 queryResolution) { m_requestedSettings.m_heightQueryResolution = queryResolution; m_terrainSettingsDirty = true; @@ -93,13 +147,15 @@ AZ::Aabb TerrainSystem::GetTerrainAabb() const return m_currentSettings.m_worldBounds; } -AZ::Vector2 TerrainSystem::GetTerrainGridResolution() const +AZ::Vector2 TerrainSystem::GetTerrainHeightQueryResolution() const { return m_currentSettings.m_heightQueryResolution; } -float TerrainSystem::GetHeightSynchronous(float x, float y) const +float TerrainSystem::GetHeightSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const { + bool terrainExists = false; + AZ::Vector3 inPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); AZ::Vector3 outPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); @@ -111,67 +167,77 @@ float TerrainSystem::GetHeightSynchronous(float x, float y) const if (areaBounds.Contains(inPosition)) { Terrain::TerrainAreaHeightRequestBus::Event( - areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, - Terrain::TerrainAreaHeightRequestBus::Events::Sampler::DEFAULT); + areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, sampler); + + terrainExists = true; + + break; } } + if (terrainExistsPtr) + { + *terrainExistsPtr = terrainExists; + } + return AZ::GetClamp( outPosition.GetZ(), m_currentSettings.m_worldBounds.GetMin().GetZ(), m_currentSettings.m_worldBounds.GetMax().GetZ()); } -float TerrainSystem::GetHeight(AZ::Vector3 position, [[maybe_unused]] Sampler sampler, [[maybe_unused]] bool* terrainExistsPtr) const +float TerrainSystem::GetHeight(AZ::Vector3 position, Sampler sampler, bool* terrainExistsPtr) const { - if (terrainExistsPtr) + return GetHeightSynchronous(position.GetX(), position.GetY(), sampler, terrainExistsPtr); +} + +float TerrainSystem::GetHeightFromFloats(float x, float y, Sampler sampler, bool* terrainExistsPtr) const +{ + return GetHeightSynchronous(x, y, sampler, terrainExistsPtr); +} + +bool TerrainSystem::GetIsHoleFromFloats(float x, float y, Sampler sampler) const +{ + bool terrainExists = false; + GetHeightSynchronous(x, y, sampler, &terrainExists); + return !terrainExists; +} + +AZ::Vector3 TerrainSystem::GetNormalSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const +{ + bool terrainExists = false; + + AZ::Vector3 inPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); + AZ::Vector3 outNormal = AZ::Vector3::CreateAxisZ(); + + AZStd::shared_lock lock(m_areaMutex); + + for (auto& [areaId, areaBounds] : m_registeredAreas) { - *terrainExistsPtr = true; + inPosition.SetZ(areaBounds.GetMin().GetZ()); + if (areaBounds.Contains(inPosition)) + { + Terrain::TerrainAreaHeightRequestBus::Event( + areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetNormal, inPosition, outNormal, sampler); + terrainExists = true; + break; + } } - return GetHeightSynchronous(position.GetX(), position.GetY()); -} - -float TerrainSystem::GetHeightFromFloats( - float x, float y, [[maybe_unused]] Sampler sampler, [[maybe_unused]] bool* terrainExistsPtr) const -{ if (terrainExistsPtr) { - *terrainExistsPtr = true; + *terrainExistsPtr = terrainExists; } - return GetHeightSynchronous(x, y); + return outNormal; } -bool TerrainSystem::GetIsHoleFromFloats( - [[maybe_unused]] float x, [[maybe_unused]] float y, [[maybe_unused]] Sampler sampleFilter) const +AZ::Vector3 TerrainSystem::GetNormal(AZ::Vector3 position, Sampler sampler, bool* terrainExistsPtr) const { - return false; + return GetNormalSynchronous(position.GetX(), position.GetY(), sampler, terrainExistsPtr); } -AZ::Vector3 TerrainSystem::GetNormalSynchronous([[maybe_unused]] float x, [[maybe_unused]] float y) const +AZ::Vector3 TerrainSystem::GetNormalFromFloats(float x, float y, Sampler sampler, bool* terrainExistsPtr) const { - return AZ::Vector3::CreateAxisZ(); -} - -AZ::Vector3 TerrainSystem::GetNormal( - AZ::Vector3 position, [[maybe_unused]] Sampler sampleFilter, [[maybe_unused]] bool* terrainExistsPtr) const -{ - if (terrainExistsPtr) - { - *terrainExistsPtr = true; - } - - return GetNormalSynchronous(position.GetX(), position.GetY()); -} - -AZ::Vector3 TerrainSystem::GetNormalFromFloats( - float x, float y, [[maybe_unused]] Sampler sampleFilter, [[maybe_unused]] bool* terrainExistsPtr) const -{ - if (terrainExistsPtr) - { - *terrainExistsPtr = true; - } - - return GetNormalSynchronous(x, y); + return GetNormalSynchronous(x, y, sampler, terrainExistsPtr); } @@ -298,35 +364,6 @@ void TerrainSystem::ProcessSurfacePointsFromRegion(const AZ::Aabb& inRegion, con } */ -void TerrainSystem::SystemActivate() -{ - { - AZStd::shared_lock lock(m_areaMutex); - m_registeredAreas.clear(); - } - - AzFramework::Terrain::TerrainDataRequestBus::Handler::BusConnect(); - - TerrainAreaRequestBus::Broadcast(&TerrainAreaRequestBus::Events::RegisterArea); -} - -void TerrainSystem::SystemDeactivate() -{ - AzFramework::Terrain::TerrainDataRequestBus::Handler::BusDisconnect(); - - { - AZStd::shared_lock lock(m_areaMutex); - m_registeredAreas.clear(); - } - - const AZ::RPI::Scene* scene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get(); - auto terrainFeatureProcessor = scene->GetFeatureProcessor(); - if (terrainFeatureProcessor) - { - terrainFeatureProcessor->RemoveTerrainData(); - } -} - void TerrainSystem::RegisterArea(AZ::EntityId areaId) { AZStd::unique_lock lock(m_areaMutex); @@ -383,6 +420,7 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) if (m_terrainSettingsDirty) { + terrainSettingsChanged = true; m_terrainSettingsDirty = false; // This needs to happen before the "system active" check below, because activating the system will cause the various @@ -393,24 +431,12 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) m_dirtyRegion.AddAabb(m_requestedSettings.m_worldBounds); m_terrainHeightDirty = true; m_currentSettings.m_worldBounds = m_requestedSettings.m_worldBounds; - terrainSettingsChanged = true; } if (m_requestedSettings.m_heightQueryResolution != m_currentSettings.m_heightQueryResolution) { m_dirtyRegion = AZ::Aabb::CreateNull(); m_terrainHeightDirty = true; - terrainSettingsChanged = true; - } - - if (m_requestedSettings.m_systemActive != m_currentSettings.m_systemActive) - { - m_requestedSettings.m_systemActive ? SystemActivate() : SystemDeactivate(); - - // Null dirty region will be interpreted as updating everything - m_dirtyRegion = AZ::Aabb::CreateNull(); - m_terrainHeightDirty = true; - terrainSettingsChanged = true; } m_currentSettings = m_requestedSettings; @@ -420,6 +446,14 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) { AZStd::shared_lock lock(m_areaMutex); + // Block other threads from accessing the surface data bus while we are in GetValue (which may call into the SurfaceData bus). + // We lock our surface data mutex *before* checking / setting "isRequestInProgress" so that we prevent race conditions + // that create false detection of cyclic dependencies when multiple requests occur on different threads simultaneously. + // (One case where this was previously able to occur was in rapid updating of the Preview widget on the + // GradientSurfaceDataComponent in the Editor when moving the threshold sliders back and forth rapidly) + auto& surfaceDataContext = SurfaceData::SurfaceDataSystemRequestBus::GetOrCreateContext(false); + typename SurfaceData::SurfaceDataSystemRequestBus::Context::DispatchLockGuard scopeLock(surfaceDataContext.m_contextMutex); + AZ::Transform transform = AZ::Transform::CreateTranslation(m_currentSettings.m_worldBounds.GetCenter()); uint32_t width = aznumeric_cast( @@ -449,7 +483,8 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) } AZ::Vector3 outPosition; - const Terrain::TerrainAreaHeightRequests::Sampler sampleFilter = Terrain::TerrainAreaHeightRequests::Sampler::DEFAULT; + const AzFramework::Terrain::TerrainDataRequestBus::Events::Sampler sampleFilter = + AzFramework::Terrain::TerrainDataRequestBus::Events::Sampler::DEFAULT; Terrain::TerrainAreaHeightRequestBus::Event( areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, sampleFilter); @@ -476,6 +511,14 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) if (terrainSettingsChanged || m_terrainHeightDirty) { + // Block other threads from accessing the surface data bus while we are in GetValue (which may call into the SurfaceData bus). + // We lock our surface data mutex *before* checking / setting "isRequestInProgress" so that we prevent race conditions + // that create false detection of cyclic dependencies when multiple requests occur on different threads simultaneously. + // (One case where this was previously able to occur was in rapid updating of the Preview widget on the + // GradientSurfaceDataComponent in the Editor when moving the threshold sliders back and forth rapidly) + auto& surfaceDataContext = SurfaceData::SurfaceDataSystemRequestBus::GetOrCreateContext(false); + typename SurfaceData::SurfaceDataSystemRequestBus::Context::DispatchLockGuard scopeLock(surfaceDataContext.m_contextMutex); + AzFramework::Terrain::TerrainDataNotifications::TerrainDataChangedMask changeMask = AzFramework::Terrain::TerrainDataNotifications::TerrainDataChangedMask::None; diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h index a75685fb12..c52165da6b 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h @@ -42,10 +42,6 @@ namespace Terrain /////////////////////////////////////////// // TerrainSystemServiceRequestBus::Handler Impl - - void SetWorldBounds(const AZ::Aabb& worldBounds) override; - void SetHeightQueryResolution(AZ::Vector2 queryResolution) override; - void Activate() override; void Deactivate() override; @@ -55,8 +51,12 @@ namespace Terrain /////////////////////////////////////////// // TerrainDataRequestBus::Handler Impl - AZ::Vector2 GetTerrainGridResolution() const override; + AZ::Vector2 GetTerrainHeightQueryResolution() const override; + void SetTerrainHeightQueryResolution(AZ::Vector2 queryResolution) override; + AZ::Aabb GetTerrainAabb() const override; + void SetTerrainAabb(const AZ::Aabb& worldBounds) override; + //! Returns terrains height in meters at location x,y. //! @terrainExistsPtr: Can be nullptr. If != nullptr then, if there's no terrain at location x,y or location x,y is inside a terrain @@ -94,15 +94,12 @@ namespace Terrain float x, float y, Sampler sampleFilter = Sampler::BILINEAR, bool* terrainExistsPtr = nullptr) const override; private: - float GetHeightSynchronous(float x, float y) const; - AZ::Vector3 GetNormalSynchronous(float x, float y) const; + float GetHeightSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const; + AZ::Vector3 GetNormalSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const; // AZ::TickBus::Handler overrides ... void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; - void SystemActivate(); - void SystemDeactivate(); - struct TerrainSystemSettings { AZ::Aabb m_worldBounds; diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h index cb41ba9957..1ba63a8f84 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h @@ -16,6 +16,8 @@ #include #include +#include + namespace Terrain { /** @@ -39,9 +41,6 @@ namespace Terrain virtual void Activate() = 0; virtual void Deactivate() = 0; - virtual void SetWorldBounds(const AZ::Aabb& worldBounds) = 0; - virtual void SetHeightQueryResolution(AZ::Vector2 queryResolution) = 0; - // register an area to override terrain virtual void RegisterArea(AZ::EntityId areaId) = 0; virtual void UnregisterArea(AZ::EntityId areaId) = 0; @@ -50,27 +49,6 @@ namespace Terrain using TerrainSystemServiceRequestBus = AZ::EBus; - /** - * A bus to signal the life times of terrain areas - * Note: all the API are meant to be queued events - */ - class TerrainAreaRequests - : public AZ::ComponentBus - { - public: - //////////////////////////////////////////////////////////////////////// - // EBusTraits - using MutexType = AZStd::recursive_mutex; - //////////////////////////////////////////////////////////////////////// - - virtual ~TerrainAreaRequests() = default; - - virtual void RegisterArea() = 0; - virtual void RefreshArea() = 0; - - }; - - using TerrainAreaRequestBus = AZ::EBus; /** * A bus to signal the life times of terrain areas @@ -87,15 +65,6 @@ namespace Terrain virtual ~TerrainAreaHeightRequests() = default; - enum class Sampler - { - BILINEAR, // Get the value at the requested location, using terrain sample grid to bilinear filter between sample grid points - CLAMP, // Clamp the input point to the terrain sample grid, then get the exact value - EXACT, // Directly get the value at the location, regardless of terrain sample grid density - - DEFAULT = BILINEAR - }; - enum SurfacePointDataMask { POSITION = 0x01, @@ -107,8 +76,16 @@ namespace Terrain // Synchronous single input location. The Vector3 input position versions are defined to ignore the input Z value. - virtual void GetHeight(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, Sampler sampleFilter = Sampler::DEFAULT) = 0; - virtual void GetNormal(const AZ::Vector3& inPosition, AZ::Vector3& outNormal, Sampler sampleFilter = Sampler::DEFAULT) = 0; + virtual void GetHeight( + const AZ::Vector3& inPosition, + AZ::Vector3& outPosition, + AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = + AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) = 0; + virtual void GetNormal( + const AZ::Vector3& inPosition, + AZ::Vector3& outNormal, + AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = + AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) = 0; }; using TerrainAreaHeightRequestBus = AZ::EBus; diff --git a/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp b/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp index 91d6a26f75..f0533322c8 100644 --- a/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp +++ b/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp @@ -17,6 +17,10 @@ #include +using ::testing::NiceMock; +using ::testing::AtLeast; +using ::testing::_; + class LayerSpawnerComponentTest : public ::testing::Test { @@ -26,7 +30,7 @@ protected: AZStd::unique_ptr m_entity; Terrain::TerrainLayerSpawnerComponent* m_layerSpawnerComponent; UnitTest::MockBoxShapeComponent* m_shapeComponent; - AZStd::unique_ptr m_terrainSystem; + AZStd::unique_ptr> m_terrainSystem; void SetUp() override { @@ -40,10 +44,8 @@ protected: void TearDown() override { - if (m_terrainSystem) - { - m_terrainSystem->Deactivate(); - } + m_entity.reset(); + m_terrainSystem.reset(); m_app.Destroy(); } @@ -72,16 +74,9 @@ protected: ASSERT_TRUE(m_shapeComponent); } - void ResetEntity() - { - m_entity->Deactivate(); - m_entity->Reset(); - } - void CreateMockTerrainSystem() { - m_terrainSystem = AZStd::make_unique(); - m_terrainSystem->Activate(); + m_terrainSystem = AZStd::make_unique>(); } }; @@ -93,7 +88,7 @@ TEST_F(LayerSpawnerComponentTest, ActivatEntityActivateSuccess) m_entity->Activate(); EXPECT_EQ(m_entity->GetState(), AZ::Entity::State::Active); - ResetEntity(); + m_entity->Deactivate(); } TEST_F(LayerSpawnerComponentTest, LayerSpawnerDefaultValuesCorrect) @@ -115,7 +110,7 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerDefaultValuesCorrect) EXPECT_TRUE(useGroundPlane); - ResetEntity(); + m_entity->Deactivate(); } TEST_F(LayerSpawnerComponentTest, LayerSpawnerConfigValuesCorrect) @@ -147,7 +142,7 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerConfigValuesCorrect) EXPECT_FALSE(useGroundPlane); - ResetEntity(); + m_entity->Deactivate(); } TEST_F(LayerSpawnerComponentTest, LayerSpawnerRegisterAreaUpdatesTerrainSystem) @@ -156,14 +151,14 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerRegisterAreaUpdatesTerrainSystem) CreateMockTerrainSystem(); + // The Activate call should register the area. + EXPECT_CALL(*m_terrainSystem, RegisterArea(_)).Times(1); + AddLayerSpawnerAndShapeComponentToEntity(); m_entity->Activate(); - // The Activate call should have registered the area. - EXPECT_EQ(1, m_terrainSystem->m_registerAreaCalledCount); - - ResetEntity(); + m_entity->Deactivate(); } TEST_F(LayerSpawnerComponentTest, LayerSpawnerUnregisterAreaUpdatesTerrainSystem) @@ -172,16 +167,14 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerUnregisterAreaUpdatesTerrainSystem CreateMockTerrainSystem(); + // The Deactivate call should unregister the area. + EXPECT_CALL(*m_terrainSystem, UnregisterArea(_)).Times(1); + AddLayerSpawnerAndShapeComponentToEntity(); m_entity->Activate(); - m_layerSpawnerComponent->Deactivate(); - - // The Deactivate call should have unregistered the area. - EXPECT_EQ(1, m_terrainSystem->m_unregisterAreaCalledCount); - - ResetEntity(); + m_entity->Deactivate(); } TEST_F(LayerSpawnerComponentTest, LayerSpawnerTransformChangedUpdatesTerrainSystem) @@ -190,6 +183,9 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerTransformChangedUpdatesTerrainSyst CreateMockTerrainSystem(); + // The TransformChanged call should refresh the area. + EXPECT_CALL(*m_terrainSystem, RefreshArea(_)).Times(1); + AddLayerSpawnerAndShapeComponentToEntity(); m_entity->Activate(); @@ -197,9 +193,7 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerTransformChangedUpdatesTerrainSyst AZ::TransformNotificationBus::Event( m_entity->GetId(), &AZ::TransformNotificationBus::Events::OnTransformChanged, AZ::Transform(), AZ::Transform()); - EXPECT_EQ(1, m_terrainSystem->m_refreshAreaCalledCount); - - ResetEntity(); + m_entity->Deactivate(); } TEST_F(LayerSpawnerComponentTest, LayerSpawnerShapeChangedUpdatesTerrainSystem) @@ -208,6 +202,9 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerShapeChangedUpdatesTerrainSystem) CreateMockTerrainSystem(); + // The ShapeChanged call should refresh the area. + EXPECT_CALL(*m_terrainSystem, RefreshArea(_)).Times(1); + AddLayerSpawnerAndShapeComponentToEntity(); m_entity->Activate(); @@ -216,7 +213,5 @@ TEST_F(LayerSpawnerComponentTest, LayerSpawnerShapeChangedUpdatesTerrainSystem) m_entity->GetId(), &LmbrCentral::ShapeComponentNotificationsBus::Events::OnShapeChanged, LmbrCentral::ShapeComponentNotifications::ShapeChangeReasons::ShapeChanged); - EXPECT_EQ(1, m_terrainSystem->m_refreshAreaCalledCount); - - ResetEntity(); + m_entity->Deactivate(); } diff --git a/Gems/Terrain/Code/Tests/TerrainMocks.h b/Gems/Terrain/Code/Tests/TerrainMocks.h index 674104e26b..03a2eccf1d 100644 --- a/Gems/Terrain/Code/Tests/TerrainMocks.h +++ b/Gems/Terrain/Code/Tests/TerrainMocks.h @@ -7,7 +7,10 @@ */ #pragma once +#include + #include +#include #include namespace UnitTest @@ -62,44 +65,45 @@ namespace UnitTest } }; - class MockTerrainSystem : private Terrain::TerrainSystemServiceRequestBus::Handler + class MockTerrainSystemService : private Terrain::TerrainSystemServiceRequestBus::Handler { public: - void Activate() override + MockTerrainSystemService() { Terrain::TerrainSystemServiceRequestBus::Handler::BusConnect(); } - void Deactivate() override + ~MockTerrainSystemService() { Terrain::TerrainSystemServiceRequestBus::Handler::BusDisconnect(); } - void SetWorldBounds([[maybe_unused]] const AZ::Aabb& worldBounds) override - { - } + MOCK_METHOD0(Activate, void()); + MOCK_METHOD0(Deactivate, void()); - void SetHeightQueryResolution([[maybe_unused]] AZ::Vector2 queryResolution) override - { - } - - void RegisterArea([[maybe_unused]] AZ::EntityId areaId) override - { - m_registerAreaCalledCount++; - } - - void UnregisterArea([[maybe_unused]] AZ::EntityId areaId) override - { - m_unregisterAreaCalledCount++; - } - - void RefreshArea([[maybe_unused]] AZ::EntityId areaId) override - { - m_refreshAreaCalledCount++; - } - - int m_registerAreaCalledCount = 0; - int m_refreshAreaCalledCount = 0; - int m_unregisterAreaCalledCount = 0; + MOCK_METHOD1(RegisterArea, void(AZ::EntityId areaId)); + MOCK_METHOD1(UnregisterArea, void(AZ::EntityId areaId)); + MOCK_METHOD1(RefreshArea, void(AZ::EntityId areaId)); }; + + class MockTerrainDataNotificationListener : public AzFramework::Terrain::TerrainDataNotificationBus::Handler + { + public: + MockTerrainDataNotificationListener() + { + AzFramework::Terrain::TerrainDataNotificationBus::Handler::BusConnect(); + } + + ~MockTerrainDataNotificationListener() + { + AzFramework::Terrain::TerrainDataNotificationBus::Handler::BusDisconnect(); + } + + MOCK_METHOD0(OnTerrainDataCreateBegin, void()); + MOCK_METHOD0(OnTerrainDataCreateEnd, void()); + MOCK_METHOD0(OnTerrainDataDestroyBegin, void()); + MOCK_METHOD0(OnTerrainDataDestroyEnd, void()); + MOCK_METHOD2(OnTerrainDataChanged, void(const AZ::Aabb& dirtyRegion, TerrainDataChangedMask dataChangedMask)); + }; + } diff --git a/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp b/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp new file mode 100644 index 0000000000..3e557c66a6 --- /dev/null +++ b/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include + +#include + +#include +#include + +using ::testing::AtLeast; +using ::testing::NiceMock; + +class TerrainSystemTest : public ::testing::Test +{ +protected: + AZ::ComponentApplication m_app; + + AZStd::unique_ptr m_entity; + AZStd::unique_ptr m_terrainSystem; + + void SetUp() override + { + AZ::ComponentApplication::Descriptor appDesc; + appDesc.m_memoryBlocksByteSize = 20 * 1024 * 1024; + appDesc.m_recordingMode = AZ::Debug::AllocationRecords::RECORD_NO_RECORDS; + appDesc.m_stackRecordLevels = 20; + + m_app.Create(appDesc); + } + + void TearDown() override + { + m_terrainSystem.reset(); + m_app.Destroy(); + } + + void CreateEntity() + { + m_entity = AZStd::make_unique(); + m_entity->Init(); + + ASSERT_TRUE(m_entity); + } + + void ResetEntity() + { + m_entity->Deactivate(); + m_entity->Reset(); + } +}; + +TEST_F(TerrainSystemTest, TrivialCreateDestroy) +{ + m_terrainSystem = AZStd::make_unique(); +} + +TEST_F(TerrainSystemTest, TrivialActivateDeactivate) +{ + m_terrainSystem = AZStd::make_unique(); + m_terrainSystem->Activate(); + m_terrainSystem->Deactivate(); +} + +TEST_F(TerrainSystemTest, CreateEventsCalledOnActivation) +{ + NiceMock mockTerrainListener; + EXPECT_CALL(mockTerrainListener, OnTerrainDataCreateBegin()).Times(AtLeast(1)); + EXPECT_CALL(mockTerrainListener, OnTerrainDataCreateEnd()).Times(AtLeast(1)); + + m_terrainSystem = AZStd::make_unique(); + m_terrainSystem->Activate(); +} + +TEST_F(TerrainSystemTest, DestroyEventsCalledOnDeactivation) +{ + NiceMock mockTerrainListener; + EXPECT_CALL(mockTerrainListener, OnTerrainDataDestroyBegin()).Times(AtLeast(1)); + EXPECT_CALL(mockTerrainListener, OnTerrainDataDestroyEnd()).Times(AtLeast(1)); + + m_terrainSystem = AZStd::make_unique(); + m_terrainSystem->Activate(); + m_terrainSystem->Deactivate(); +} + + diff --git a/Gems/Terrain/Code/Tests/TerrainTest.cpp b/Gems/Terrain/Code/Tests/TerrainTest.cpp index 9b47c91a31..40217ff9bc 100644 --- a/Gems/Terrain/Code/Tests/TerrainTest.cpp +++ b/Gems/Terrain/Code/Tests/TerrainTest.cpp @@ -8,24 +8,4 @@ #include -class TerrainTest - : public ::testing::Test -{ -protected: - void SetUp() override - { - - } - - void TearDown() override - { - - } -}; - -TEST_F(TerrainTest, SanityTest) -{ - ASSERT_TRUE(true); -} - AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV); diff --git a/Gems/Terrain/Code/terrain_tests_files.cmake b/Gems/Terrain/Code/terrain_tests_files.cmake index b44f143f3b..6d1cf97fd9 100644 --- a/Gems/Terrain/Code/terrain_tests_files.cmake +++ b/Gems/Terrain/Code/terrain_tests_files.cmake @@ -9,5 +9,6 @@ set(FILES Tests/TerrainMocks.h Tests/TerrainTest.cpp + Tests/TerrainSystemTest.cpp Tests/LayerSpawnerTests.cpp ) From b53bf52e0dc0a2af6886b35478a9c65eb64e03ba Mon Sep 17 00:00:00 2001 From: Chris Burel Date: Wed, 15 Sep 2021 09:48:08 -0700 Subject: [PATCH 317/355] Perform global deinitialization when exiting the game launcher (#4131) * Fix code that deregisters the Atom Scene subsystem from the AzFramework Scene The AzFramework Scene subsystem API is a generic container based on the type of argument that is passed to it. It maintains a vector of typeids, and only one object of any type is stored at a time. The Bootstrap system component registers the Atom scene as a `ScenePtr` (aka `AZStd::shared_ptr`) with the AzFramework Scene's generic subsystem. However, the component was previously deregistering the type by value, `RPI::Scene`. Since no subsystem for the type `RPI::Scene` was set, unsetting this type did nothing. The result was that the `RPI::Scene` object would still be around by the time that all the Atom `InstanceDatabse`s were being destroyed, resulting in a large number of errors reported about leaked instances during global shutdown. This fixes the above issue by passing the `m_defaultScene` as a parameter to `AzFramework::Scene::UnsetSubsystem`, the same value that is passed to `SetSubsystem`. This is better, because instead of providing explicit template arguments (which were specifying the incorrect type), this now allows the compiler to deduce the correct type, and the syntax is symmetric with the call to `SetSubsystem`. Signed-off-by: Chris Burel * Correctly release the AWS API from the `HttpRequestManager` module This code was incorrectly assuming that `AWSNativeSDKInit::InitializationManager::Shutdown()` would be called automatically by the `InitializationManager` itself. However, all that `InitAwsApi()` does is create an `AZ::EnvironmentVariable`, which is a ref-counted type, and stores it in a global static. That global static is defined in a static library (namely `AWSNativeSDKInit`), which is linked in to the `HttpRequestManager` dynamic lib. Because it is a global static, it has to be explicitly cleared with the call to `Shutdown()`. Otherwise the destructor of the EnvironmentVariable doesn't happen until global destruction, by which time the allocator that is supplied to the AWS SDK has already been destroyed, and the shutdown of the AWS SDK attempts to use the already-destroyed allocator. Signed-off-by: Chris Burel * Avoid blocking the remote console server thread if there are no connections The Remote console server runs in a separate thread. Previously, it would directly call `AzSock::Accept()` and block the server thread until some client connected to it. However, if no client connected, the thread would continue to be blocked, even if the game launcher tried to exit. This adds a check to see if there's a client on the socket before calling `Accept()`, to avoid the deadlock on launcher exit. Signed-off-by: Chris Burel * Fix a log message to print one message per line Signed-off-by: Chris Burel * Allow pumping the event loop to close the launcher window Events from the OS are handled in the game's main loop. The general loop looks like this: * Read events from the OS * Tick the game application One of the events that can come from the OS is that the window hosting the game is closed. When this event happens, many resources provided by the renderer are freed, and the game application's `shouldExit` bit is set. However, when the game's `Tick()` is called, there is lots of code that assumes the renderer is still there. To avoid crashing in the `Tick()` call, check if the game should exit after pumping the system events. Signed-off-by: Chris Burel * Unload the level when exiting the launcher This ensures that any resources held onto by the level are freed before the launcher exits. Signed-off-by: Chris Burel * Add an explicit bus `Disconnect()` call to `AZCoreLogSink` This is necessary because this bus has virtual functions and can be called from multiple threads. Signed-off-by: Chris Burel * Allow normal cleanup to take place when exiting the game launcher Previously, global cleanup was side-stepped by calling `TerminateProcess` or `exit`, when quitting the game launcher. This is in contrast to the call to `_exit` on Linux and Mac when exiting the Editor. That leading `_` makes a big difference: the former runs object destruction, the latter does not. Instead of making the launcher exit with `_exit` on Linux, instead, remove that call and actually run all the atexit code. This does not modify the Editor's behavior however. It still uses `_exit` and `TerminateProcess`. Signed-off-by: Chris Burel --- .../AzFramework/Archive/Archive.cpp | 2 +- Code/LauncherUnified/Launcher.cpp | 11 +++++---- Code/Legacy/CrySystem/AZCoreLogSink.h | 5 ++++ .../CrySystem/LevelSystem/LevelSystem.cpp | 1 + Code/Legacy/CrySystem/System.cpp | 23 ------------------- .../RemoteConsole/Core/RemoteConsoleCore.cpp | 5 ++++ .../Code/Source/BootstrapSystemComponent.cpp | 2 +- .../Code/Source/HttpRequestManager.cpp | 3 +-- 8 files changed, 20 insertions(+), 32 deletions(-) diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp index 012d713cf5..1891c50d10 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp @@ -2185,7 +2185,7 @@ namespace AZ::IO AZStd::unique_lock lock(m_archiveMutex); if (pArchive) { - AZ_TracePrintf("Archive", "Closing Archive file: %s", pArchive->GetFullPath()); + AZ_TracePrintf("Archive", "Closing Archive file: %s\n", pArchive->GetFullPath()); } ArchiveArray::iterator it; if (m_arrArchives.size() < 16) diff --git a/Code/LauncherUnified/Launcher.cpp b/Code/LauncherUnified/Launcher.cpp index de4c496b2a..27aab074ef 100644 --- a/Code/LauncherUnified/Launcher.cpp +++ b/Code/LauncherUnified/Launcher.cpp @@ -232,13 +232,17 @@ namespace // our frame time to be managed by AzGameFramework::GameApplication // instead, which probably isn't going to happen anytime soon given // how many things depend on the ITimer interface). - bool continueRunning = true; ISystem* system = gEnv ? gEnv->pSystem : nullptr; - while (continueRunning) + while (!gameApplication.WasExitMainLoopRequested()) { // Pump the system event loop gameApplication.PumpSystemEventLoopUntilEmpty(); + if (gameApplication.WasExitMainLoopRequested()) + { + break; + } + // Update the AzFramework system tick bus gameApplication.TickSystem(); @@ -256,9 +260,6 @@ namespace { system->UpdatePostTickBus(); } - - // Check for quit requests - continueRunning = !gameApplication.WasExitMainLoopRequested() && continueRunning; } } } diff --git a/Code/Legacy/CrySystem/AZCoreLogSink.h b/Code/Legacy/CrySystem/AZCoreLogSink.h index e824c4c172..a54a78157c 100644 --- a/Code/Legacy/CrySystem/AZCoreLogSink.h +++ b/Code/Legacy/CrySystem/AZCoreLogSink.h @@ -31,6 +31,11 @@ class AZCoreLogSink : public AZ::Debug::TraceMessageBus::Handler { public: + ~AZCoreLogSink() + { + Disconnect(); + } + inline static void Connect() { GetInstance().m_ignoredAsserts = new IgnoredAssertMap(); diff --git a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp index a0338941b5..c5d364a025 100644 --- a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp +++ b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp @@ -233,6 +233,7 @@ CLevelSystem::CLevelSystem(ISystem* pSystem, const char* levelsFolder) //------------------------------------------------------------------------ CLevelSystem::~CLevelSystem() { + UnloadLevel(); } //------------------------------------------------------------------------ diff --git a/Code/Legacy/CrySystem/System.cpp b/Code/Legacy/CrySystem/System.cpp index 4a9d9ece5f..2e18e13841 100644 --- a/Code/Legacy/CrySystem/System.cpp +++ b/Code/Legacy/CrySystem/System.cpp @@ -548,29 +548,6 @@ void CSystem::Quit() logger->Flush(); } - /* - * TODO: This call to _exit, _Exit, TerminateProcess etc. needs to - * eventually be removed. This causes an extremely early exit before we - * actually perform cleanup. When this gets called most managers are - * simply never deleted and we leave it to the OS to clean up our mess - * which is just really bad practice. However there are LOTS of issues - * with shutdown at the moment. Removing this will simply cause - * a crash when either the Editor or Launcher initiate shutdown. Both - * applications crash differently too. Bugs will be logged about those - * issues. - */ -#if defined(AZ_RESTRICTED_PLATFORM) -#define AZ_RESTRICTED_SECTION SYSTEM_CPP_SECTION_4 -#include AZ_RESTRICTED_FILE(System_cpp) -#endif -#if defined(AZ_RESTRICTED_SECTION_IMPLEMENTED) -#undef AZ_RESTRICTED_SECTION_IMPLEMENTED -#elif defined(WIN32) || defined(WIN64) - TerminateProcess(GetCurrentProcess(), m_env.retCode); -#else - exit(m_env.retCode); -#endif - #ifdef WIN32 //Post a WM_QUIT message to the Win32 api which causes the message loop to END //This is not the same as handling a WM_DESTROY event which destroys a window diff --git a/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.cpp b/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.cpp index d0e9e6a760..0a8d9d8eb7 100644 --- a/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.cpp +++ b/Code/Tools/RemoteConsole/Core/RemoteConsoleCore.cpp @@ -239,6 +239,11 @@ void SRemoteServer::Run() while (m_bAcceptClients) { + AZTIMEVAL timeout { 1, 0 }; + if (!AZ::AzSock::IsRecvPending(m_socket, &timeout)) + { + continue; + } AZ::AzSock::AzSocketAddress clientAddress; sClient = AZ::AzSock::Accept(m_socket, clientAddress); if (!m_bAcceptClients || !AZ::AzSock::IsAzSocketValid(sClient)) diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp index 97faa7380f..ddd88a1f52 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp @@ -386,7 +386,7 @@ namespace AZ // Unbind m_defaultScene to the GameEntityContext's AzFramework::Scene if (m_defaultFrameworkScene) { - m_defaultFrameworkScene->UnsetSubsystem(); + m_defaultFrameworkScene->UnsetSubsystem(m_defaultScene); } m_defaultScene = nullptr; diff --git a/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp b/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp index 8ed40c1599..523d84f0f5 100644 --- a/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp +++ b/Gems/HttpRequestor/Code/Source/HttpRequestManager.cpp @@ -35,7 +35,6 @@ namespace HttpRequestor desc.m_name = s_loggingName; desc.m_cpuId = AFFINITY_MASK_USERTHREADS; m_runThread = true; - // Shutdown will be handled by the InitializationManager - no need to call in the destructor AWSNativeSDKInit::InitializationManager::InitAwsApi(); auto function = AZStd::bind(&Manager::ThreadFunction, this); m_thread = AZStd::thread(function, &desc); @@ -43,7 +42,7 @@ namespace HttpRequestor Manager::~Manager() { - // NativeSDK Shutdown does not need to be called here - will be taken care of by the InitializationManager + AWSNativeSDKInit::InitializationManager::Shutdown(); m_runThread = false; m_requestConditionVar.notify_all(); if (m_thread.joinable()) From c2864e2ec035455856e190120f927a63ec681ca7 Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 15 Sep 2021 09:49:28 -0700 Subject: [PATCH 318/355] used a CMake 3.21 function, but that is not the min version we support Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/MSVC/VisualStudio_common.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Platform/Common/MSVC/VisualStudio_common.cmake b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake index d9e58090d9..7de7da3cc7 100644 --- a/cmake/Platform/Common/MSVC/VisualStudio_common.cmake +++ b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake @@ -15,4 +15,4 @@ foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) endforeach() configure_file("${CMAKE_CURRENT_LIST_DIR}/Directory.Build.props" "${CMAKE_BINARY_DIR}/Directory.Build.props" @ONLY) -file(COPY_FILE "${CMAKE_CURRENT_LIST_DIR}/CodeAnalysis.ruleset" "${CMAKE_BINARY_DIR}/CodeAnalysis.ruleset" ONLY_IF_DIFFERENT) +file(COPY "${CMAKE_CURRENT_LIST_DIR}/CodeAnalysis.ruleset" "${CMAKE_BINARY_DIR}/CodeAnalysis.ruleset") From a5306f10f346ff465b0805b1279ed493b6af732a Mon Sep 17 00:00:00 2001 From: smurly Date: Wed, 15 Sep 2021 11:27:26 -0700 Subject: [PATCH 319/355] Reflection Probe component added to AtomEditorComponents test (#4135) Signed-off-by: Scott Murray --- ...ydra_AtomEditorComponents_AddedToEntity.py | 22 +++++++++++++++++-- .../atom_renderer/test_Atom_MainSuite.py | 15 +++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py index cd10caf57b..a2e950e1dc 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_AddedToEntity.py @@ -3,8 +3,6 @@ Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. SPDX-License-Identifier: Apache-2.0 OR MIT - -Hydra script that creates an entity and attaches Atom components to it for test verification. """ import os @@ -17,6 +15,7 @@ import azlmbr.asset as asset import azlmbr.entity as entity import azlmbr.legacy.general as general import azlmbr.editor as editor +import azlmbr.render as render sys.path.append(os.path.join(azlmbr.paths.devroot, "AutomatedTesting", "Gem", "PythonTests")) @@ -125,6 +124,19 @@ def run(): def verify_set_property(entity_obj, path, value): entity_obj.get_set_test(0, path, value) + # Verify cubemap generation + def verify_cubemap_generation(component_name, entity_obj): + # Initially Check if the component has Reflection Probe component + if not hydra.has_components(entity_obj.id, ["Reflection Probe"]): + raise ValueError(f"Given entity {entity_obj.name} has no Reflection Probe component") + render.EditorReflectionProbeBus(azlmbr.bus.Event, "BakeReflectionProbe", entity_obj.id) + + def get_value(): + hydra.get_component_property_value(entity_obj.components[0], "Cubemap|Baked Cubemap Path") + + TestHelper.wait_for_condition(lambda: get_value() != "", 20.0) + general.log(f"{component_name}_test: Cubemap is generated: {get_value() != ''}") + # Wait for Editor idle loop before executing Python hydra scripts. TestHelper.init_idle() @@ -215,6 +227,12 @@ def run(): # Display Mapper Component ComponentTests("Display Mapper") + # Reflection Probe Component + reflection_probe = "Reflection Probe" + ComponentTests( + reflection_probe, + lambda entity_obj: verify_required_component_addition(entity_obj, ["Box Shape"], reflection_probe), + lambda entity_obj: verify_cubemap_generation(reflection_probe, entity_obj),) if __name__ == "__main__": run() diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py index ce496ce268..16e281e494 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite.py @@ -161,6 +161,21 @@ class TestAtomEditorComponentsMain(object): "Display Mapper_test: Entity deleted: True", "Display Mapper_test: UNDO entity deletion works: True", "Display Mapper_test: REDO entity deletion works: True", + # Reflection Probe Component + "Reflection Probe Entity successfully created", + "Reflection Probe_test: Component added to the entity: True", + "Reflection Probe_test: Component removed after UNDO: True", + "Reflection Probe_test: Component added after REDO: True", + "Reflection Probe_test: Entered game mode: True", + "Reflection Probe_test: Exit game mode: True", + "Reflection Probe_test: Entity disabled initially: True", + "Reflection Probe_test: Entity enabled after adding required components: True", + "Reflection Probe_test: Cubemap is generated: True", + "Reflection Probe_test: Entity is hidden: True", + "Reflection Probe_test: Entity is shown: True", + "Reflection Probe_test: Entity deleted: True", + "Reflection Probe_test: UNDO entity deletion works: True", + "Reflection Probe_test: REDO entity deletion works: True", ] unexpected_lines = [ From 2c464c3ee0dc79775d77c32780b8cc2e9212c833 Mon Sep 17 00:00:00 2001 From: santorac <55155825+santorac@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:35:09 -0700 Subject: [PATCH 320/355] Updated the ScopedValue constructor per code review feedback. Signed-off-by: santorac <55155825+santorac@users.noreply.github.com> --- Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h b/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h index 8cb985cffe..f6ed6d6df4 100644 --- a/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h +++ b/Code/Framework/AtomCore/AtomCore/Utils/ScopedValue.h @@ -20,11 +20,11 @@ namespace AZ T m_finalValue; public: - ScopedValue(T* ptr, T initialValue, T finalValue) + ScopedValue(T* ptr, T initialValue, T finalValue) : + m_ptr(ptr), m_finalValue(finalValue) { - m_ptr = ptr; + AZ_Assert(m_ptr, "ScopedValue::m_ptr is null"); *m_ptr = initialValue; - m_finalValue = finalValue; } ~ScopedValue() From 9cba144e3942356b7bb93e7338b41ea59c3943ee Mon Sep 17 00:00:00 2001 From: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> Date: Wed, 15 Sep 2021 11:44:45 -0700 Subject: [PATCH 321/355] forgot destination Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com> --- cmake/Platform/Common/MSVC/VisualStudio_common.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Platform/Common/MSVC/VisualStudio_common.cmake b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake index 7de7da3cc7..843b3dcd9d 100644 --- a/cmake/Platform/Common/MSVC/VisualStudio_common.cmake +++ b/cmake/Platform/Common/MSVC/VisualStudio_common.cmake @@ -15,4 +15,4 @@ foreach(conf IN LISTS CMAKE_CONFIGURATION_TYPES) endforeach() configure_file("${CMAKE_CURRENT_LIST_DIR}/Directory.Build.props" "${CMAKE_BINARY_DIR}/Directory.Build.props" @ONLY) -file(COPY "${CMAKE_CURRENT_LIST_DIR}/CodeAnalysis.ruleset" "${CMAKE_BINARY_DIR}/CodeAnalysis.ruleset") +file(COPY "${CMAKE_CURRENT_LIST_DIR}/CodeAnalysis.ruleset" DESTINATION "${CMAKE_BINARY_DIR}") From 346e2d9f663b27ef0b4a29afe7450fb330b53510 Mon Sep 17 00:00:00 2001 From: santorac <55155825+santorac@users.noreply.github.com> Date: Wed, 15 Sep 2021 13:26:48 -0700 Subject: [PATCH 322/355] Fixed unit test compile issues, and added a unit test for PSO handling setting. Signed-off-by: santorac <55155825+santorac@users.noreply.github.com> --- .../Material/LuaMaterialFunctorTests.cpp | 43 ++++++++++++++++++- .../Tests/Material/MaterialFunctorTests.cpp | 12 ++++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp index 99efa38c3a..37d0930d97 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/LuaMaterialFunctorTests.cpp @@ -1039,6 +1039,42 @@ namespace UnitTest drawListTagRegistry->ReleaseTag(tag); } + + TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_PsoChangesNotAllowed_Error) + { + using namespace AZ::RPI; + + const char* functorScript = + R"( + function GetMaterialPropertyDependencies() + return {"general.MyBool"} + end + + function GetShaderOptionDependencies() + return {} + end + + function Process(context) + local boolValue = context:GetMaterialPropertyValue_bool("general.MyBool") + if(boolValue) then + context:GetShader(0):GetRenderStatesOverride():SetFillMode(FillMode_Wireframe) + else + context:GetShader(0):GetRenderStatesOverride():ClearFillMode() + end + end + )"; + + TestMaterialData testData; + testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript); + + testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true}); + + ErrorMessageFinder errorMessageFinder; + + errorMessageFinder.AddExpectedErrorMessage("not be changed at runtime because they impact Pipeline State Objects: general.MyBool"); + EXPECT_TRUE(testData.GetMaterial()->Compile()); + errorMessageFinder.CheckExpectedErrorsFound(); + } TEST_F(LuaMaterialFunctorTests, LuaMaterialFunctor_RuntimeContext_MultisampleCustomPositionCountIndex_Error) { @@ -1067,6 +1103,7 @@ namespace UnitTest TestMaterialData testData; testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript); + testData.GetMaterial()->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed); testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true}); ErrorMessageFinder errorMessageFinder; @@ -1107,7 +1144,8 @@ namespace UnitTest errorMessageFinder.AddExpectedErrorMessage("ClearMultisampleCustomPosition(18,...) index is out of range. Must be less than 16."); testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript); errorMessageFinder.CheckExpectedErrorsFound(); - + + testData.GetMaterial()->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed); testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true}); errorMessageFinder.AddExpectedErrorMessage("SetMultisampleCustomPosition(17,...) index is out of range. Must be less than 16."); @@ -1146,7 +1184,8 @@ namespace UnitTest errorMessageFinder.AddExpectedErrorMessage("ClearBlendEnabled(10,...) index is out of range. Must be less than 8."); testData.Setup(MaterialPropertyDataType::Bool, "general.MyBool", functorScript); errorMessageFinder.CheckExpectedErrorsFound(); - + + testData.GetMaterial()->SetPsoHandlingOverride(AZ::RPI::MaterialPropertyPsoHandling::Allowed); testData.GetMaterial()->SetPropertyValue(testData.GetMaterialPropertyIndex(), MaterialPropertyValue{true}); errorMessageFinder.AddExpectedErrorMessage("SetBlendEnabled(9,...) index is out of range. Must be less than 8."); diff --git a/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp b/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp index 0c84484508..6cd84b6e4c 100644 --- a/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp +++ b/Gems/Atom/RPI/Code/Tests/Material/MaterialFunctorTests.cpp @@ -165,7 +165,8 @@ namespace UnitTest materialTypeAsset->GetMaterialPropertiesLayout(), &shaderCollectionCopy, unusedSrg, - &testFunctorSetOptionA.GetMaterialPropertyDependencies() + &testFunctorSetOptionA.GetMaterialPropertyDependencies(), + AZ::RPI::MaterialPropertyPsoHandling::Allowed }; testFunctorSetOptionA.Process(runtimeContext); EXPECT_TRUE(testFunctorSetOptionA.GetProcessResult()); @@ -181,7 +182,8 @@ namespace UnitTest materialTypeAsset->GetMaterialPropertiesLayout(), &shaderCollectionCopy, unusedSrg, - &testFunctorSetOptionB.GetMaterialPropertyDependencies() + &testFunctorSetOptionB.GetMaterialPropertyDependencies(), + AZ::RPI::MaterialPropertyPsoHandling::Allowed }; testFunctorSetOptionB.Process(runtimeContext); EXPECT_TRUE(testFunctorSetOptionB.GetProcessResult()); @@ -198,7 +200,8 @@ namespace UnitTest materialTypeAsset->GetMaterialPropertiesLayout(), &shaderCollectionCopy, unusedSrg, - &testFunctorSetOptionC.GetMaterialPropertyDependencies() + &testFunctorSetOptionC.GetMaterialPropertyDependencies(), + AZ::RPI::MaterialPropertyPsoHandling::Allowed }; testFunctorSetOptionC.Process(runtimeContext); EXPECT_FALSE(testFunctorSetOptionC.GetProcessResult()); @@ -213,7 +216,8 @@ namespace UnitTest materialTypeAsset->GetMaterialPropertiesLayout(), &shaderCollectionCopy, unusedSrg, - &testFunctorSetOptionInvalid.GetMaterialPropertyDependencies() + &testFunctorSetOptionInvalid.GetMaterialPropertyDependencies(), + AZ::RPI::MaterialPropertyPsoHandling::Allowed }; testFunctorSetOptionInvalid.Process(runtimeContext); EXPECT_FALSE(testFunctorSetOptionInvalid.GetProcessResult()); From c50f3b263885c0716e4bc2344cceb2719fac8034 Mon Sep 17 00:00:00 2001 From: Junbo Liang <68558268+junbo75@users.noreply.github.com> Date: Wed, 15 Sep 2021 14:03:45 -0700 Subject: [PATCH 323/355] Fix the destruction failure and update the instructions for running automation tests (#4124) Signed-off-by: Junbo Liang --- AutomatedTesting/Gem/PythonTests/AWS/README.md | 2 +- .../aws_metrics/aws_metrics_automation_test.py | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/AutomatedTesting/Gem/PythonTests/AWS/README.md b/AutomatedTesting/Gem/PythonTests/AWS/README.md index 1429fc487f..1bb36f178d 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/README.md +++ b/AutomatedTesting/Gem/PythonTests/AWS/README.md @@ -11,7 +11,7 @@ 3. Open a new Command Prompt window at the engine root and set the following environment variables: Set O3DE_AWS_PROJECT_NAME=AWSAUTO Set O3DE_AWS_DEPLOY_REGION=us-east-1 - Set ASSUME_ROLE_ARN="arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests" + Set ASSUME_ROLE_ARN=arn:aws:iam::{your_aws_account_id}:role/o3de-automation-tests Set COMMIT_ID=HEAD 4. In the same Command Prompt window, Deploy the CDK applications for AWS gems by running deploy_cdk_applications.cmd. diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py index a0a53f92b5..5f6103c46a 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py @@ -139,7 +139,6 @@ def update_kinesis_analytics_application_status(aws_metrics_utils: pytest.fixtur @pytest.mark.usefixtures('resource_mappings') @pytest.mark.parametrize('assume_role_arn', [constants.ASSUME_ROLE_ARN]) @pytest.mark.parametrize('feature_name', [AWS_METRICS_FEATURE_NAME]) -@pytest.mark.parametrize('level', ['AWS/Metrics']) @pytest.mark.parametrize('profile_name', ['AWSAutomationTest']) @pytest.mark.parametrize('project', ['AutomatedTesting']) @pytest.mark.parametrize('region_name', [constants.AWS_REGION]) @@ -150,6 +149,7 @@ class TestAWSMetricsWindows(object): """ Test class to verify the real-time and batch analytics for metrics. """ + @pytest.mark.parametrize('level', ['AWS/Metrics']) def test_realtime_and_batch_analytics(self, level: str, launcher: pytest.fixture, @@ -201,10 +201,7 @@ class TestAWSMetricsWindows(object): for thread in operational_threads: thread.join() - # Clear the analytics bucket objects so that the S3 bucket can be destroyed during tear down. - aws_metrics_utils.empty_bucket( - resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName')) - + @pytest.mark.parametrize('level', ['AWS/Metrics']) def test_unauthorized_user_request_rejected(self, level: str, launcher: pytest.fixture, @@ -227,3 +224,13 @@ class TestAWSMetricsWindows(object): halt_on_unexpected=True) assert result, 'Metrics events are sent successfully by unauthorized user' logger.info('Unauthorized user is rejected to send metrics.') + + def test_clean_up_s3_bucket(self, + aws_utils: pytest.fixture, + resource_mappings: pytest.fixture, + aws_metrics_utils: pytest.fixture): + """ + Clear the analytics bucket objects so that the S3 bucket can be destroyed during tear down. + """ + aws_metrics_utils.empty_bucket( + resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName')) From b2445ebe0cebbc37bea3f47221dca64a1adf6fae Mon Sep 17 00:00:00 2001 From: hershey5045 <43485729+hershey5045@users.noreply.github.com> Date: Wed, 15 Sep 2021 14:28:50 -0700 Subject: [PATCH 324/355] Add color grading pass into main pipeline (#4005) * Add HDR color grading pass and shaders. Signed-off-by: Robin * Improve code quality. Signed-off-by: Robin * Code refactor. Signed-off-by: Robin * Remove color grading pass from light adaptation parent pass due to failing ASV tests. This will be added back later on. Signed-off-by: Robin * Add newline. Signed-off-by: Robin * Correct case for file. Signed-off-by: Robin * Update comment. Signed-off-by: Robin Co-authored-by: Robin --- .../Common/Assets/Passes/HDRColorGrading.pass | 215 ++++++++++++ .../Assets/Passes/PassTemplates.azasset | 6 +- .../Features/PostProcessing/KelvinToRgb.azsli | 75 +++++ .../PSstyleColorBlends_NonSeparable.azsli | 177 ++++++++++ .../PSstyleColorBlends_Separable.azsli | 306 ++++++++++++++++++ .../GeneratedTransforms/AcesCcToAcesCg.azsli | 80 +++++ .../GeneratedTransforms/AcesCgToAcesCc.azsli | 79 +++++ .../ColorManagement/TransformColor.azsli | 45 ++- .../PostProcessing/HDRColorGrading.azsl | 206 ++++++++++++ .../PostProcessing/HDRColorGrading.shader | 22 ++ .../atom_feature_common_asset_files.cmake | 8 + 11 files changed, 1217 insertions(+), 2 deletions(-) create mode 100644 Gems/Atom/Feature/Common/Assets/Passes/HDRColorGrading.pass create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/KelvinToRgb.azsli create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_NonSeparable.azsli create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_Separable.azsli create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCcToAcesCg.azsli create mode 100644 Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCgToAcesCc.azsli create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl create mode 100644 Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.shader diff --git a/Gems/Atom/Feature/Common/Assets/Passes/HDRColorGrading.pass b/Gems/Atom/Feature/Common/Assets/Passes/HDRColorGrading.pass new file mode 100644 index 0000000000..f1e8304b30 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Passes/HDRColorGrading.pass @@ -0,0 +1,215 @@ +{ + "Type": "JsonSerialization", + "Version": 1, + "ClassName": "PassAsset", + "ClassData": { + "PassTemplate": { + "Name": "HDRColorGradingTemplate", + "PassClass": "FullScreenTriangle", + "Slots": [ + { + "Name": "Input", + "SlotType": "Input", + "ShaderInputName": "m_framebuffer", + "ScopeAttachmentUsage": "Shader" + }, + { + "Name": "Output", + "SlotType": "Output", + "ScopeAttachmentUsage": "RenderTarget", + "LoadStoreAction": { + "LoadAction": "DontCare" + } + } + ], + "ImageAttachments": [ + { + "Name": "ColorGradingOutput", + "SizeSource": { + "Source": { + "Pass": "This", + "Attachment": "Input" + } + }, + "FormatSource": { + "Pass": "This", + "Attachment": "Input" + } + } + ], + "Connections": [ + { + "LocalSlot": "Output", + "AttachmentRef": { + "Pass": "This", + "Attachment": "ColorGradingOutput" + } + } + ], + "FallbackConnections": [ + { + "Input": "Input", + "Output": "Output" + } + ], + "PassData": { + "$type": "FullscreenTrianglePassData", + "ShaderAsset": { + "FilePath": "Shaders/PostProcessing/HDRColorGrading.shader" + }, + "ShaderDataMappings": { + "FloatMappings": [ + { + "Name": "m_colorGradingExposure", + "Value": 0.0 // unconstrained, log2 stops + }, + { + "Name": "m_colorGradingContrast", + "Value": 0.0 // -100 ... 100 + }, + { + "Name": "m_colorGradingHueShift", + "Value": 0.0 // 0 ... 1, can wrap + }, + { + "Name": "m_colorGradingPreSaturation", + "Value": 1.0 // -100 ... 100 + }, + { + "Name": "m_colorFilterIntensity", + "Value": 1.0 // unconstrained, log2 stops + }, + { + "Name": "m_colorFilterMultiply", + "Value": 0.0 // modulate, 0 ... 1 + }, + { + "Name": "m_whiteBalanceKelvin", + "Value": 6500.0 // 1000.0f ... 40000.0f kelvin + }, + { + "Name": "m_whiteBalanceTint", + "Value": 0.0 // -100 ... 100 + }, + { + "Name": "m_splitToneBalance", + "Value": 0.0 // -1 ... 1 + }, + { + "Name": "m_splitToneMix", + "Value": 0.0 // 0 ... 1 + }, + { + "Name": "m_colorGradingPostSaturation", + "Value": 1.0 // -100 ... 100 + }, + { + "Name": "m_smhShadowsStart", + "Value": 0.0 // 0 ... 1 + }, + { + "Name": "m_smhShadowsEnd", + "Value": 0.3 // 0 ... 1 + }, + { + "Name": "m_smhHighlightsStart", + "Value": 0.55 // 0 ... 1 + }, + { + "Name": "m_smhHighlightsEnd", + "Value": 1.0 // 0 ... 1 + }, + { + "Name": "m_smhMix", + "Value": 0.0 // 0 ... 1 + } + ], + // The colors defined here are expected to be in linear rgb color space. + // These are converted to ACEScg color space within the HDRColorGrading.azsl shader + "ColorMappings": [ + { + "Name": "m_colorFilterSwatch", + "Value": [ + 1.0, + 0.5, + 0.5, + 1.0 + ] + }, + { + "Name": "m_splitToneShadowsColor", + "Value": [ + 1.0, + 0.1, + 0.1, + 1.0 + ] + }, + { + "Name": "m_splitToneHighlightsColor", + "Value": [ + 0.1, + 1.0, + 0.1, + 1.0 + ] + }, + { + "Name": "m_smhShadowsColor", + "Value": [ + 1.0, + 0.25, + 0.25, + 1.0 + ] + }, + { + "Name": "m_smhMidtonesColor", + "Value": [ + 0.1, + 0.1, + 1.0, + 1.0 + ] + }, + { + "Name": "m_smhHighlightsColor", + "Value": [ + 1.0, + 0.0, + 1.0, + 1.0 + ] + } + ], + "Float3Mappings": [ + { + "Name": "m_channelMixingRed", + "Value": [ + 1.0, + 0.0, + 0.0 + ] + }, + { + "Name": "m_channelMixingGreen", + "Value": [ + 0.0, + 1.0, + 0.0 + ] + }, + { + "Name": "m_channelMixingBlue", + "Value": [ + 0.0, + 0.0, + 1.0 + ] + } + ] + } + } + } + } +} diff --git a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset index 8b7d6a8438..4e38717d31 100644 --- a/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset +++ b/Gems/Atom/Feature/Common/Assets/Passes/PassTemplates.azasset @@ -499,7 +499,11 @@ { "Name": "KawaseShadowBlurTemplate", "Path": "Passes/KawaseShadowBlur.pass" - } + }, + { + "Name": "HDRColorGradingTemplate", + "Path": "Passes/HDRColorGrading.pass" + } ] } } diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/KelvinToRgb.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/KelvinToRgb.azsli new file mode 100644 index 0000000000..aa57f0f4a1 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/KelvinToRgb.azsli @@ -0,0 +1,75 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: (Apache-2.0 OR MIT) AND Creative Commons 3.0 + * + */ + +// Ref: https://www.shadertoy.com/view/lsSXW1 +// ported by Renaud Bédard (@renaudbedard) from original code from Tanner Helland +// http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/ + +// color space functions translated from HLSL versions on Chilli Ant (by Ian Taylor) +// http://www.chilliant.com/rgb2hsv.html + +// licensed and released under Creative Commons 3.0 Attribution +// https://creativecommons.org/licenses/by/3.0/ + +float3 HueToRgb(float hue) +{ + return saturate(float3(abs(hue * 6.0f - 3.0f) - 1.0f, + 2.0f - abs(hue * 6.0f - 2.0f), + 2.0f - abs(hue * 6.0f - 4.0f))); +} + +float3 RgbToHcv(float3 rgb) +{ + // Based on work by Sam Hocevar and Emil Persson + const float4 p = (rgb.g < rgb.b) ? float4(rgb.bg, -1.0f, 2.0f/3.0f) : float4(rgb.gb, 0.0f, -1.0f/3.0f); + const float4 q1 = (rgb.r < p.x) ? float4(p.xyw, rgb.r) : float4(rgb.r, p.yzx); + const float c = q1.x - min(q1.w, q1.y); + const float h = abs((q1.w - q1.y) / (6.0f * c + 0.000001f ) + q1.z); + return float3(h, c, q1.x); +} + +float3 RgbToHsl(float3 rgb) +{ + rgb.xyz = max(rgb.xyz, 0.000001f); + const float3 hcv = RgbToHcv(rgb); + const float L = hcv.z - hcv.y * 0.5f; + const float S = hcv.y / (1.0f - abs(L * 2.0f - 1.0f) + 0.000001f); + return float3(hcv.x, S, L); +} + +float3 HslToRgb(float3 hsl) +{ + const float3 rgb = HueToRgb(hsl.x); + const float c = (1.0f - abs(2.0f * hsl.z - 1.0f)) * hsl.y; + return (rgb - 0.5f) * c + hsl.z; +} + +// Color temperature +float3 KelvinToRgb(float kelvin) +{ + float3 ret; + kelvin = clamp(kelvin, 1000.0f, 40000.0f) / 100.0f; + if(kelvin <= 66.0f) + { + ret.r = 1.0f; + ret.g = saturate(0.39008157876901960784f * log(kelvin) - 0.63184144378862745098f); + } + else + { + float t = max(kelvin - 60.0f, 0.0f); + ret.r = saturate(1.29293618606274509804f * pow(t, -0.1332047592f)); + ret.g = saturate(1.12989086089529411765f * pow(t, -0.0755148492f)); + } + if(kelvin >= 66.0f) + ret.b = 1.0f; + else if(kelvin < 19.0f) + ret.b = 0.0f; + else + ret.b = saturate(0.54320678911019607843f * log(kelvin - 10.0f) - 1.19625408914f); + return ret; +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_NonSeparable.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_NonSeparable.azsli new file mode 100644 index 0000000000..9c2a5bc306 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_NonSeparable.azsli @@ -0,0 +1,177 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +/* +------------------------------------------------------------------------------ + Public Domain +------------------------------------------------------------------------------ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +Source: https://www.ryanjuckett.com/photoshop-blend-modes-in-hlsl/ +*/ +//****************************************************************************** +//****************************************************************************** +float Color_GetLuminosity(float3 c) +{ + return 0.3*c.r + 0.59*c.g + 0.11*c.b; +} + +//****************************************************************************** +//****************************************************************************** +float3 Color_SetLuminosity(float3 c, float lum) +{ + float d = lum - Color_GetLuminosity(c); + c.rgb += float3(d,d,d); + + // clip back into legal range + lum = Color_GetLuminosity(c); + float cMin = min(c.r, min(c.g, c.b)); + float cMax = max(c.r, max(c.g, c.b)); + + if(cMin < 0) + c = lerp(float3(lum,lum,lum), c, lum / (lum - cMin)); + + if(cMax > 1) + c = lerp(float3(lum,lum,lum), c, (1 - lum) / (cMax - lum)); + + return c; +} + +//****************************************************************************** +//****************************************************************************** +float Color_GetSaturation(float3 c) +{ + return max(c.r, max(c.g, c.b)) - min(c.r, min(c.g, c.b)); +} + +//****************************************************************************** +// Set saturation if color components are sorted in ascending order. +//****************************************************************************** +float3 Color_SetSaturation_MinMidMax(float3 cSorted, float s) +{ + if(cSorted.z > cSorted.x) + { + cSorted.y = (((cSorted.y - cSorted.x) * s) / (cSorted.z - cSorted.x)); + cSorted.z = s; + } + else + { + cSorted.y = 0; + cSorted.z = 0; + } + + cSorted.x = 0; + + return cSorted; +} + +//****************************************************************************** +//****************************************************************************** +float3 Color_SetSaturation(float3 c, float s) +{ + if (c.r <= c.g && c.r <= c.b) + { + if (c.g <= c.b) + c.rgb = Color_SetSaturation_MinMidMax(c.rgb, s); + else + c.rbg = Color_SetSaturation_MinMidMax(c.rbg, s); + } + else if (c.g <= c.r && c.g <= c.b) + { + if (c.r <= c.b) + c.grb = Color_SetSaturation_MinMidMax(c.grb, s); + else + c.gbr = Color_SetSaturation_MinMidMax(c.gbr, s); + } + else + { + if (c.r <= c.g) + c.brg = Color_SetSaturation_MinMidMax(c.brg, s); + else + c.bgr = Color_SetSaturation_MinMidMax(c.bgr, s); + } + + return c; +} + +//****************************************************************************** +// Creates a color with the hue of the blend color and the saturation and +// luminosity of the base color. +//****************************************************************************** +float3 BlendMode_Hue(float3 base, float3 blend) +{ + return Color_SetLuminosity(Color_SetSaturation(blend, Color_GetSaturation(base)), Color_GetLuminosity(base)); +} + +//****************************************************************************** +// Creates a color with the saturation of the blend color and the hue and +// luminosity of the base color. +//****************************************************************************** +float3 BlendMode_Saturation(float3 base, float3 blend) +{ + return Color_SetLuminosity(Color_SetSaturation(base, Color_GetSaturation(blend)), Color_GetLuminosity(base)); +} + +//****************************************************************************** +// Creates a color with the hue and saturation of the blend color and the +// luminosity of the base color. +//****************************************************************************** +float3 BlendMode_Color(float3 base, float3 blend) +{ + return Color_SetLuminosity(blend, Color_GetLuminosity(base)); +} + +//****************************************************************************** +// Creates a color with the luminosity of the blend color and the hue and +// saturation of the base color. +//****************************************************************************** +float3 BlendMode_Luminosity(float3 base, float3 blend) +{ + return Color_SetLuminosity(base, Color_GetLuminosity(blend)); +} + +//****************************************************************************** +// Compares the total of all channel values for the blend and base color and +// displays the lower value color. +//****************************************************************************** +float3 BlendMode_DarkerColor(float3 base, float3 blend) +{ + return Color_GetLuminosity(base) <= Color_GetLuminosity(blend) ? base : blend; +} + +//****************************************************************************** +// Compares the total of all channel values for the blend and base color and +// displays the higher value color. +//****************************************************************************** +float3 BlendMode_LighterColor(float3 base, float3 blend) +{ + return Color_GetLuminosity(base) > Color_GetLuminosity(blend) ? base : blend; +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_Separable.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_Separable.azsli new file mode 100644 index 0000000000..f64df30231 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_Separable.azsli @@ -0,0 +1,306 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +/* +------------------------------------------------------------------------------ + Public Domain +------------------------------------------------------------------------------ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +Source: https://www.ryanjuckett.com/photoshop-blend-modes-in-hlsl/ +*/ +//****************************************************************************** +// Selects the blend color, ignoring the base. +//****************************************************************************** +float3 BlendMode_Normal(float3 base, float3 blend) +{ + return blend; +} + +//****************************************************************************** +// Looks at the color information in each channel and selects the base or blend +// color—whichever is darker—as the result color. +//****************************************************************************** +float3 BlendMode_Darken(float3 base, float3 blend) +{ + return min(base, blend); +} + +//****************************************************************************** +// Looks at the color information in each channel and multiplies the base color +// by the blend color. +//****************************************************************************** +float3 BlendMode_Multiply(float3 base, float3 blend) +{ + return base*blend; +} + +//****************************************************************************** +// Looks at the color information in each channel and darkens the base color to +// reflect the blend color by increasing the contrast between the two. +//****************************************************************************** +float BlendMode_ColorBurn(float base, float blend) +{ + return blend > 0 ? 1 - min(1, (1-base) / blend) : 0; +} + +float3 BlendMode_ColorBurn(float3 base, float3 blend) +{ + return float3( BlendMode_ColorBurn(base.r, blend.r), + BlendMode_ColorBurn(base.g, blend.g), + BlendMode_ColorBurn(base.b, blend.b) ); +} + +//****************************************************************************** +// Looks at the color information in each channel and darkens the base color to +// reflect the blend color by decreasing the brightness. +//****************************************************************************** +float BlendMode_LinearBurn(float base, float blend) +{ + return max(0, base + blend - 1); +} + +float3 BlendMode_LinearBurn(float3 base, float3 blend) +{ + return float3( BlendMode_LinearBurn(base.r, blend.r), + BlendMode_LinearBurn(base.g, blend.g), + BlendMode_LinearBurn(base.b, blend.b) ); +} + +//****************************************************************************** +// Looks at the color information in each channel and selects the base or blend +// color—whichever is lighter—as the result color. +//****************************************************************************** +float3 BlendMode_Lighten(float3 base, float3 blend) +{ + return max(base, blend); +} + +//****************************************************************************** +// Looks at each channel’s color information and multiplies the inverse of the +// blend and base colors. +//****************************************************************************** +float3 BlendMode_Screen(float3 base, float3 blend) +{ + return base + blend - base*blend; +} + +//****************************************************************************** +// Looks at the color information in each channel and brightens the base color +// to reflect the blend color by decreasing contrast between the two. +//****************************************************************************** +float BlendMode_ColorDodge(float base, float blend) +{ + return blend < 1 ? min(1, base / (1-blend)) : 1; +} + +float3 BlendMode_ColorDodge(float3 base, float3 blend) +{ + return float3( BlendMode_ColorDodge(base.r, blend.r), + BlendMode_ColorDodge(base.g, blend.g), + BlendMode_ColorDodge(base.b, blend.b) ); +} + +//****************************************************************************** +// Looks at the color information in each channel and brightens the base color +// to reflect the blend color by decreasing contrast between the two. +//****************************************************************************** +float BlendMode_LinearDodge(float base, float blend) +{ + return min(1, base + blend); +} + +float3 BlendMode_LinearDodge(float3 base, float3 blend) +{ + return float3( BlendMode_LinearDodge(base.r, blend.r), + BlendMode_LinearDodge(base.g, blend.g), + BlendMode_LinearDodge(base.b, blend.b) ); +} + +//****************************************************************************** +// Multiplies or screens the colors, depending on the base color. +//****************************************************************************** +float BlendMode_Overlay(float base, float blend) +{ + return (base <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + +float3 BlendMode_Overlay(float3 base, float3 blend) +{ + return float3( BlendMode_Overlay(base.r, blend.r), + BlendMode_Overlay(base.g, blend.g), + BlendMode_Overlay(base.b, blend.b) ); +} + +//****************************************************************************** +// Darkens or lightens the colors, depending on the blend color. +//****************************************************************************** +float BlendMode_SoftLight(float base, float blend) +{ + if (blend <= 0.5) + { + return base - (1-2*blend)*base*(1-base); + } + else + { + float d = (base <= 0.25) ? ((16*base-12)*base+4)*base : sqrt(base); + return base + (2*blend-1)*(d-base); + } +} + +float3 BlendMode_SoftLight(float3 base, float3 blend) +{ + return float3( BlendMode_SoftLight(base.r, blend.r), + BlendMode_SoftLight(base.g, blend.g), + BlendMode_SoftLight(base.b, blend.b) ); +} + +//****************************************************************************** +// Multiplies or screens the colors, depending on the blend color. +//****************************************************************************** +float BlendMode_HardLight(float base, float blend) +{ + return (blend <= 0.5) ? 2*base*blend : 1 - 2*(1-base)*(1-blend); +} + +float3 BlendMode_HardLight(float3 base, float3 blend) +{ + return float3( BlendMode_HardLight(base.r, blend.r), + BlendMode_HardLight(base.g, blend.g), + BlendMode_HardLight(base.b, blend.b) ); +} + +//****************************************************************************** +// Burns or dodges the colors by increasing or decreasing the contrast, +// depending on the blend color. +//****************************************************************************** +float BlendMode_VividLight(float base, float blend) +{ + return (blend <= 0.5) ? BlendMode_ColorBurn(base,2*blend) : BlendMode_ColorDodge(base,2*(blend-0.5)); +} + +float3 BlendMode_VividLight(float3 base, float3 blend) +{ + return float3( BlendMode_VividLight(base.r, blend.r), + BlendMode_VividLight(base.g, blend.g), + BlendMode_VividLight(base.b, blend.b) ); +} + +//****************************************************************************** +// Burns or dodges the colors by decreasing or increasing the brightness, +// depending on the blend color. +//****************************************************************************** +float BlendMode_LinearLight(float base, float blend) +{ + return (blend <= 0.5) ? BlendMode_LinearBurn(base,2*blend) : BlendMode_LinearDodge(base,2*(blend-0.5)); +} + +float3 BlendMode_LinearLight(float3 base, float3 blend) +{ + return float3( BlendMode_LinearLight(base.r, blend.r), + BlendMode_LinearLight(base.g, blend.g), + BlendMode_LinearLight(base.b, blend.b) ); +} + +//****************************************************************************** +// Replaces the colors, depending on the blend color. +//****************************************************************************** +float BlendMode_PinLight(float base, float blend) +{ + return (blend <= 0.5) ? min(base,2*blend) : max(base,2*(blend-0.5)); +} + +float3 BlendMode_PinLight(float3 base, float3 blend) +{ + return float3( BlendMode_PinLight(base.r, blend.r), + BlendMode_PinLight(base.g, blend.g), + BlendMode_PinLight(base.b, blend.b) ); +} + +//****************************************************************************** +// Adds the red, green and blue channel values of the blend color to the RGB +// values of the base color. If the resulting sum for a channel is 255 or +// greater, it receives a value of 255; if less than 255, a value of 0. +//****************************************************************************** +float BlendMode_HardMix(float base, float blend) +{ + return (base + blend >= 1.0) ? 1.0 : 0.0; +} + +float3 BlendMode_HardMix(float3 base, float3 blend) +{ + return float3( BlendMode_HardMix(base.r, blend.r), + BlendMode_HardMix(base.g, blend.g), + BlendMode_HardMix(base.b, blend.b) ); +} + +//****************************************************************************** +// Looks at the color information in each channel and subtracts either the +// blend color from the base color or the base color from the blend color, +// depending on which has the greater brightness value. +//****************************************************************************** +float3 BlendMode_Difference(float3 base, float3 blend) +{ + return abs(base-blend); +} + +//****************************************************************************** +// Creates an effect similar to but lower in contrast than the Difference mode. +//****************************************************************************** +float3 BlendMode_Exclusion(float3 base, float3 blend) +{ + return base + blend - 2*base*blend; +} + +//****************************************************************************** +// Looks at the color information in each channel and subtracts the blend color +// from the base color. +//****************************************************************************** +float3 BlendMode_Subtract(float3 base, float3 blend) +{ + return max(0, base - blend); +} + +//****************************************************************************** +// Looks at the color information in each channel and divides the blend color +// from the base color. +//****************************************************************************** +float BlendMode_Divide(float base, float blend) +{ + return blend > 0 ? min(1, base / blend) : 1; +} + +float3 BlendMode_Divide(float3 base, float3 blend) +{ + return float3( BlendMode_Divide(base.r, blend.r), + BlendMode_Divide(base.g, blend.g), + BlendMode_Divide(base.b, blend.b) ); +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCcToAcesCg.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCcToAcesCg.azsli new file mode 100644 index 0000000000..e84b18c550 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCcToAcesCg.azsli @@ -0,0 +1,80 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: (MIT OR Apache-2.0) AND LicenseRef-ACES + * + */ + +/* +License Terms for Academy Color Encoding System Components + +Academy Color Encoding System (ACES) software and tools are provided by the + Academy under the following terms and conditions: A worldwide, royalty-free, + non-exclusive right to copy, modify, create derivatives, and use, in source and + binary forms, is hereby granted, subject to acceptance of this license. + +Copyright © 2015 Academy of Motion Picture Arts and Sciences (A.M.P.A.S.). +Portions contributed by others as indicated. All rights reserved. + +Performance of any of the aforementioned acts indicates acceptance to be bound + by the following terms and conditions: + +* Copies of source code, in whole or in part, must retain the above copyright + notice, this list of conditions and the Disclaimer of Warranty. +* Use in binary form must retain the above copyright notice, this list of + conditions and the Disclaimer of Warranty in the documentation and/or other + materials provided with the distribution. +* Nothing in this license shall be deemed to grant any rights to trademarks, + copyrights, patents, trade secrets or any other intellectual property of + A.M.P.A.S. or any contributors, except as expressly stated herein. +* Neither the name "A.M.P.A.S." nor the name of any other contributors to this + software may be used to endorse or promote products derivative of or based on + this software without express prior written permission of A.M.P.A.S. or the + contributors, as appropriate. + +This license shall be construed pursuant to the laws of the State of California, +and any disputes related thereto shall be subject to the jurisdiction of the + courts therein. + +Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., OR ANY +CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, RESITUTIONARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +//////////////////////////////////////////////////////////////////////////////// +WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY SPECIFICALLY +DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER RELATED TO PATENT OR +OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY COLOR ENCODING SYSTEM, OR +APPLICATIONS THEREOF, HELD BY PARTIES OTHER THAN A.M.P.A.S.,WHETHER DISCLOSED OR +UNDISCLOSED. +*/ + +#pragma once + +static const float HALF_MAX = 65504.0f; + +float AcesCcToLinear(float value) +{ + if (value < -0.3013698630) // (9.72-15)/17.52 + return (pow( 2., value*17.52-9.72) - pow( 2.,-16.))*2.0; + else if (value < (log2(HALF_MAX)+9.72)/17.52) + return pow( 2., value*17.52-9.72); + else // (value >= (log2(HALF_MAX)+9.72)/17.52) + return HALF_MAX; +} + +float3 AcesCcToAcesCg(float3 color) +{ + return float3( + AcesCcToLinear(color.r), + AcesCcToLinear(color.g), + AcesCcToLinear(color.b)); +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCgToAcesCc.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCgToAcesCc.azsli new file mode 100644 index 0000000000..f784a76990 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCgToAcesCc.azsli @@ -0,0 +1,79 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: (MIT OR Apache-2.0) AND LicenseRef-ACES + * + */ + +/* +License Terms for Academy Color Encoding System Components + +Academy Color Encoding System (ACES) software and tools are provided by the + Academy under the following terms and conditions: A worldwide, royalty-free, + non-exclusive right to copy, modify, create derivatives, and use, in source and + binary forms, is hereby granted, subject to acceptance of this license. + +Copyright © 2015 Academy of Motion Picture Arts and Sciences (A.M.P.A.S.). +Portions contributed by others as indicated. All rights reserved. + +Performance of any of the aforementioned acts indicates acceptance to be bound + by the following terms and conditions: + +* Copies of source code, in whole or in part, must retain the above copyright + notice, this list of conditions and the Disclaimer of Warranty. +* Use in binary form must retain the above copyright notice, this list of + conditions and the Disclaimer of Warranty in the documentation and/or other + materials provided with the distribution. +* Nothing in this license shall be deemed to grant any rights to trademarks, + copyrights, patents, trade secrets or any other intellectual property of + A.M.P.A.S. or any contributors, except as expressly stated herein. +* Neither the name "A.M.P.A.S." nor the name of any other contributors to this + software may be used to endorse or promote products derivative of or based on + this software without express prior written permission of A.M.P.A.S. or the + contributors, as appropriate. + +This license shall be construed pursuant to the laws of the State of California, +and any disputes related thereto shall be subject to the jurisdiction of the + courts therein. + +Disclaimer of Warranty: THIS SOFTWARE IS PROVIDED BY A.M.P.A.S. AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +AND NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL A.M.P.A.S., OR ANY +CONTRIBUTORS OR DISTRIBUTORS, BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, RESITUTIONARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +//////////////////////////////////////////////////////////////////////////////// +WITHOUT LIMITING THE GENERALITY OF THE FOREGOING, THE ACADEMY SPECIFICALLY +DISCLAIMS ANY REPRESENTATIONS OR WARRANTIES WHATSOEVER RELATED TO PATENT OR +OTHER INTELLECTUAL PROPERTY RIGHTS IN THE ACADEMY COLOR ENCODING SYSTEM, OR +APPLICATIONS THEREOF, HELD BY PARTIES OTHER THAN A.M.P.A.S.,WHETHER DISCLOSED OR +UNDISCLOSED. +*/ + +#pragma once + +float LinearToAcesCc(float value) +{ + if (value <= 0) + return -0.3584474886; // =(log2( pow(2.,-16.))+9.72)/17.52 + else if (value < pow(2.,-15.)) + return (log2( pow(2.,-16.) + value * 0.5) + 9.72) / 17.52; + else // (value >= pow(2.,-15)) + return (log2(value) + 9.72) / 17.52; +} + +float3 AcesCgToAcesCc(float3 color) +{ + return float3( + LinearToAcesCc(color.r), + LinearToAcesCc(color.g), + LinearToAcesCc(color.b) + ); +} diff --git a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/TransformColor.azsli b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/TransformColor.azsli index e298445c7c..c9d1b7d979 100644 --- a/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/TransformColor.azsli +++ b/Gems/Atom/Feature/Common/Assets/ShaderLib/Atom/Features/ColorManagement/TransformColor.azsli @@ -8,11 +8,14 @@ #pragma once +#include #include "GeneratedTransforms/LinearSrgb_To_AcesCg.azsli" #include "GeneratedTransforms/AcesCg_To_LinearSrgb.azsli" #include "GeneratedTransforms/LinearSrgb_To_Srgb.azsli" #include "GeneratedTransforms/Srgb_To_LinearSrgb.azsli" #include "GeneratedTransforms/Aces_To_AcesCg.azsli" +#include "GeneratedTransforms/AcesCcToAcesCg.azsli" +#include "GeneratedTransforms/AcesCgToAcesCc.azsli" #include "GeneratedTransforms/CalculateLuminance_LinearSrgb.azsli" #include "GeneratedTransforms/CalculateLuminance_AcesCg.azsli" @@ -20,6 +23,7 @@ enum class ColorSpaceId { SRGB = 0, LinearSRGB, + ACEScc, ACEScg, ACES2065, XYZ, @@ -51,15 +55,27 @@ float3 TransformColor(in float3 color, ColorSpaceId fromColorSpace, ColorSpaceId color = AcesCg_To_LinearSrgb(color); color = LinearSrgb_To_Srgb(color); } + else if (fromColorSpace == ColorSpaceId::ACEScg && toColorSpace == ColorSpaceId::LinearSRGB) + { + color = AcesCg_To_LinearSrgb(color); + } + else if (fromColorSpace == ColorSpaceId::ACEScg && toColorSpace == ColorSpaceId::ACEScc) + { + color = AcesCgToAcesCc(color); + } else if (fromColorSpace == ColorSpaceId::ACES2065 && toColorSpace == ColorSpaceId::ACEScg) { color = Aces_To_AcesCg(color); } + else if (fromColorSpace == ColorSpaceId::ACEScc && toColorSpace == ColorSpaceId::ACEScg) + { + color = AcesCcToAcesCg(color); + } else { color = float3(1, 0, 1); } - + return color; } @@ -75,6 +91,7 @@ float CalculateLuminance(in float3 color, ColorSpaceId colorSpace) luminance = CalculateLuminance_AcesCg(color); break; case ColorSpaceId::SRGB: + case ColorSpaceId::ACEScc: case ColorSpaceId::ACES2065: case ColorSpaceId::XYZ: case ColorSpaceId::Invalid: @@ -83,3 +100,29 @@ float CalculateLuminance(in float3 color, ColorSpaceId colorSpace) return luminance; } + +float RotateHue(float hue, float low, float hi) +{ + return (hue < low) + ? hue + hi + : (hue > hi) + ? hue - hi + : hue; +} + +float3 RgbToHsv(float3 color) +{ + const float4 k = float4(0.0f, -1.0f / 3.0f, 2.0f / 3.0f, -1.0f); + const float4 p = lerp(float4(color.bg, k.wz), float4(color.gb, k.xy), step(color.b, color.g)); + const float4 q = lerp(float4(p.xyw, color.r), float4(color.r, p.yzx), step(p.x, color.r)); + const float d = q.x - min(q.w, q.y); + const float e = EPSILON; + return float3(abs(q.z + (q.w - q.y) / (6.0f * d + e)), d / (q.x + e), q.x); +} + +float3 HsvToRgb(float3 color) +{ + const float4 k = float4(1.0f, 2.0f / 3.0f, 1.0f / 3.0f, 3.0f); + const float3 p = abs(frac(color.xxx + k.xyz) * 6.0f - k.www); + return color.z * lerp(k.xxx, saturate(p - k.xxx), color.y); +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl new file mode 100644 index 0000000000..9ae4a2bd68 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.azsl @@ -0,0 +1,206 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include + +#include + +#include +#include + +#include +#include +#include <3rdParty/Features/PostProcessing/PSstyleColorBlends_Separable.azsli> +#include <3rdParty/Features/PostProcessing/PSstyleColorBlends_NonSeparable.azsli> +#include <3rdParty/Features/PostProcessing/KelvinToRgb.azsli> + +static const float FloatEpsilon = 1.192092896e-07; // 1.0 + FloatEpsilon != 1.0, smallest positive float +static const float FloatMin = FLOAT_32_MIN; // Min float number that is positive +static const float FloatMax = FLOAT_32_MAX; // Max float number representable + +static const float AcesCcMidGrey = 0.4135884; + +ShaderResourceGroup PassSrg : SRG_PerPass_WithFallback +{ + // get the framebuffer + Texture2D m_framebuffer; + + // framebuffer sampler + Sampler LinearSampler + { + MinFilter = Linear; + MagFilter = Linear; + MipFilter = Linear; + AddressU = Clamp; + AddressV = Clamp; + AddressW = Clamp; + }; + + float m_colorGradingExposure; + float m_colorGradingContrast; + float m_colorGradingHueShift; + float m_colorGradingPreSaturation; + float m_colorFilterIntensity; + float m_colorFilterMultiply; + float m_whiteBalanceKelvin; + float m_whiteBalanceTint; + float m_splitToneBalance; + float m_splitToneMix; + float m_colorGradingPostSaturation; + float m_smhShadowsStart; + float m_smhShadowsEnd; + float m_smhHighlightsStart; + float m_smhHighlightsEnd; + float m_smhMix; + + float3 m_channelMixingRed; + float3 m_channelMixingGreen; + float3 m_channelMixingBlue; + + float4 m_colorFilterSwatch; + float4 m_splitToneShadowsColor; + float4 m_splitToneHighlightsColor; + + float4 m_smhShadowsColor; + float4 m_smhMidtonesColor; + float4 m_smhHighlightsColor; + + // my color grading output + float4 m_color; +} + +float SaturateWithEpsilon(float value) +{ + return clamp(value, FloatEpsilon, 1.0f); +} + +// Below are the color grading functions. These expect the frame color to be in ACEScg space. +// Note that some functions may have some quirks in their implementation and is subject to change. +float3 ColorGradePostExposure (float3 frameColor, float exposure) +{ + frameColor *= pow(2.0f, exposure); + return frameColor; +} + +// The contrast equation is performed in ACEScc (logarithmic) color space. +float3 ColorGradingContrast (float3 frameColor, float midgrey, float amount) +{ + const float contrastAdjustment = amount * 0.01f + 1.0f; + frameColor = TransformColor(frameColor.rgb, ColorSpaceId::ACEScg, ColorSpaceId::ACEScc); + frameColor = (frameColor - midgrey) * contrastAdjustment + midgrey; + return frameColor = TransformColor(frameColor.rgb, ColorSpaceId::ACEScc, ColorSpaceId::ACEScg); +} + +// The swatchColor param expects a linear RGB value. +float3 ColorGradeColorFilter (float3 frameColor, float3 swatchColor, float alpha) +{ + swatchColor = TransformColor(swatchColor, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); + swatchColor *= pow(2.0f, PassSrg::m_colorFilterIntensity); + const float3 frameAdjust = frameColor * swatchColor; + return frameColor = lerp(frameColor, frameAdjust, alpha); +} + +float3 ColorGradeHueShift (float3 frameColor, float amount) +{ + float3 frameHsv = RgbToHsv(frameColor); + const float hue = frameHsv.x + amount; + frameHsv.x = RotateHue(hue, 0.0, 1.0); + return HsvToRgb(frameHsv); +} + +float3 ColorGradeSaturation (float3 frameColor, float control) +{ + const float vLuminance = CalculateLuminance(frameColor, ColorSpaceId::ACEScg); + return (frameColor - vLuminance) * control + vLuminance; +} + +float3 ColorGradeKelvinColorTemp(float3 frameColor, float kelvin) +{ + const float3 kColor = TransformColor(KelvinToRgb(kelvin), ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); + const float luminance = CalculateLuminance(frameColor, ColorSpaceId::ACEScg); + const float3 resHsl = RgbToHsl(frameColor.rgb * kColor.rgb); // Apply Kelvin color and convert to HSL + return HslToRgb(float3(resHsl.xy, luminance)); // Preserve luminance +} + +// pow(f, e) won't work if f is negative, or may cause inf/NAN. +float3 NoNanPow(float3 base, float3 power) +{ + return pow(max(abs(base), float3(FloatEpsilon, FloatEpsilon, FloatEpsilon)), power); +} + +float3 ColorGradeSplitTone (float3 frameColor, float balance, float mix) +{ + float3 frameSplitTone = NoNanPow(frameColor, 1.0 / 2.2); + const float t = SaturateWithEpsilon(CalculateLuminance(SaturateWithEpsilon(frameSplitTone), ColorSpaceId::ACEScg) + balance); + const float3 shadows = lerp(0.5, PassSrg::m_splitToneShadowsColor.rgb, 1.0 - t); + const float3 highlights = lerp(0.5, PassSrg::m_splitToneHighlightsColor.rgb, t); + frameSplitTone = BlendMode_SoftLight(frameSplitTone, shadows); + frameSplitTone = BlendMode_SoftLight(frameSplitTone, highlights); + frameSplitTone = NoNanPow(frameSplitTone, 2.2); + return lerp(frameColor.rgb, frameSplitTone.rgb, mix); +} + +float3 ColorGradeChannelMixer (float3 frameColor) +{ + return mul(float3x3(PassSrg::m_channelMixingRed.rgb, + PassSrg::m_channelMixingGreen.rgb, + PassSrg::m_channelMixingBlue.rgb), + frameColor); +} + +float3 ColorGradeShadowsMidtonesHighlights (float3 frameColor, float shadowsStart, float shadowsEnd, + float highlightsStart, float highlightsEnd, float mix, + float4 shadowsColor, float4 midtonesColor, float4 highlightsColor) +{ + const float3 shadowsColorACEScg = TransformColor(shadowsColor.rgb, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); + const float3 midtonesColorACEScg = TransformColor(midtonesColor.rgb, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); + const float3 highlightsColorACEScg = TransformColor(highlightsColor.rgb, ColorSpaceId::LinearSRGB, ColorSpaceId::ACEScg); + + const float cLuminance = CalculateLuminance(frameColor, ColorSpaceId::ACEScg); + const float shadowsWeight = 1.0 - smoothstep(shadowsStart, shadowsEnd, cLuminance); + const float highlightsWeight = smoothstep(highlightsStart, highlightsEnd, cLuminance); + const float midtonesWeight = 1.0 - shadowsWeight - highlightsWeight; + + const float3 frameSmh = frameColor * shadowsColorACEScg * shadowsWeight + + frameColor * midtonesColorACEScg * midtonesWeight + + frameColor * highlightsColorACEScg * highlightsWeight; + return lerp(frameColor.rgb, frameSmh.rgb, mix); +} + +float3 ColorGrade (float3 frameColor) +{ + frameColor = ColorGradePostExposure(frameColor, PassSrg::m_colorGradingExposure); + frameColor = ColorGradeKelvinColorTemp(frameColor, PassSrg::m_whiteBalanceKelvin); + frameColor = ColorGradingContrast(frameColor, AcesCcMidGrey, PassSrg::m_colorGradingContrast); + frameColor = ColorGradeColorFilter(frameColor, PassSrg::m_colorFilterSwatch.rgb, + PassSrg::m_colorFilterMultiply); + frameColor = max(frameColor, 0.0); + frameColor = ColorGradeSaturation(frameColor, PassSrg::m_colorGradingPreSaturation); + frameColor = ColorGradeSplitTone(frameColor, PassSrg::m_splitToneBalance, PassSrg::m_splitToneMix); + frameColor = ColorGradeChannelMixer(frameColor); + frameColor = max(frameColor, 0.0); + frameColor = ColorGradeShadowsMidtonesHighlights(frameColor, PassSrg::m_smhShadowsStart, PassSrg::m_smhShadowsEnd, + PassSrg::m_smhHighlightsStart, PassSrg::m_smhHighlightsEnd, PassSrg::m_smhMix, + PassSrg::m_smhShadowsColor, PassSrg::m_smhMidtonesColor, PassSrg::m_smhHighlightsColor); + frameColor = ColorGradeHueShift(frameColor, PassSrg::m_colorGradingHueShift); + frameColor = ColorGradeSaturation(frameColor, PassSrg::m_colorGradingPostSaturation); + return frameColor.rgb; +} + +PSOutput MainPS(VSOutput IN) +{ + PSOutput OUT; + + // Fetch the pixel color from the input texture + float3 frameColor = PassSrg::m_framebuffer.Sample(PassSrg::LinearSampler, IN.m_texCoord).rgb; + + OUT.m_color.rgb = ColorGrade(frameColor); + OUT.m_color.w = 1; + + return OUT; +} diff --git a/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.shader b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.shader new file mode 100644 index 0000000000..f76f6708b7 --- /dev/null +++ b/Gems/Atom/Feature/Common/Assets/Shaders/PostProcessing/HDRColorGrading.shader @@ -0,0 +1,22 @@ +{ + "Source" : "HDRColorGrading", + + "DepthStencilState" : { + "Depth" : { "Enable" : false } + }, + + "ProgramSettings": + { + "EntryPoints": + [ + { + "name": "MainVS", + "type": "Vertex" + }, + { + "name": "MainPS", + "type": "Fragment" + } + ] + } +} diff --git a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake index 8435625833..c8f99cdb24 100644 --- a/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake +++ b/Gems/Atom/Feature/Common/Assets/atom_feature_common_asset_files.cmake @@ -86,6 +86,7 @@ set(FILES Passes/CascadedShadowmaps.pass Passes/CheckerboardResolveColor.pass Passes/CheckerboardResolveDepth.pass + Passes/HDRColorGrading.pass Passes/ContrastAdaptiveSharpening.pass Passes/ConvertToAcescg.pass Passes/DebugOverlayParent.pass @@ -221,6 +222,8 @@ set(FILES ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/LinearSrgb_To_AcesCg.azsli ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/LinearSrgb_To_Srgb.azsli ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/Srgb_To_LinearSrgb.azsli + ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCcToAcesCg.azsli + ShaderLib/Atom/Features/ColorManagement/GeneratedTransforms/AcesCgToAcesCc.azsli ShaderLib/Atom/Features/CoreLights/PhotometricValue.azsli ShaderLib/Atom/Features/Decals/DecalTextureUtil.azsli ShaderLib/Atom/Features/LightCulling/LightCullingShared.azsli @@ -286,6 +289,9 @@ set(FILES ShaderLib/Atom/Features/Shadow/Shadow.azsli ShaderLib/Atom/Features/Shadow/ShadowmapAtlasLib.azsli ShaderLib/Atom/Features/Vertex/VertexHelper.azsli + ShaderLib/3rdParty/Features/PostProcessing/KelvinToRgb.azsli + ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_NonSeparable.azsli + ShaderLib/3rdParty/Features/PostProcessing/PSstyleColorBlends_Separable.azsli ShaderResourceGroups/SceneSrg.azsli ShaderResourceGroups/SceneSrgAll.azsli ShaderResourceGroups/ViewSrg.azsli @@ -392,6 +398,8 @@ set(FILES Shaders/PostProcessing/FastDepthAwareBlurVer.shader Shaders/PostProcessing/FullscreenCopy.azsl Shaders/PostProcessing/FullscreenCopy.shader + Shaders/PostProcessing/HDRColorGrading.azsl + Shaders/PostProcessing/HDRColorGrading.shader Shaders/PostProcessing/LookModificationTransform.azsl Shaders/PostProcessing/LookModificationTransform.shader Shaders/PostProcessing/LuminanceHeatmap.azsl From f111b67df608b504b48c71f8a4661ff6e0fed6ce Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Wed, 15 Sep 2021 14:44:27 -0700 Subject: [PATCH 325/355] Fix issue with one frame flicker in the transition between paint modes. Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../Components/FancyDockingGhostWidget.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp index 04387875df..5456356458 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp @@ -48,7 +48,7 @@ namespace AzQtComponents void FancyDockingGhostWidget::setPixmap(const QPixmap& pixmap, const QRect& targetRect, QScreen* screen) { - const bool needsRepaint = m_pixmap.cacheKey() != pixmap.cacheKey() || m_clipToWidgets; + bool needsRepaint = m_pixmap.cacheKey() != pixmap.cacheKey() || m_clipToWidgets; m_pixmap = pixmap; if (pixmap.isNull() || targetRect.isNull() || !screen) @@ -80,6 +80,7 @@ namespace AzQtComponents QPoint midPoint = targetRect.topLeft() + QPoint(targetRect.width() / 2, targetRect.height() / 2); QScreen* pointScreen = QApplication::screenAt(midPoint); QRect rect(targetRect); + PaintMode paintMode = PaintMode::FULL; if (!pointScreen || pointScreen != screen) { @@ -87,26 +88,28 @@ namespace AzQtComponents { rect.setLeft(rect.left() - rect.width()); rect.setTop(rect.top() - rect.height()); - m_paintMode = PaintMode::BOTTOMRIGHT; + paintMode = PaintMode::BOTTOMRIGHT; } else { rect.setRight(rect.right() + rect.width()); rect.setTop(rect.top() - rect.height()); - m_paintMode = PaintMode::BOTTOMLEFT; + paintMode = PaintMode::BOTTOMLEFT; } } - else + + if (m_paintMode != paintMode) { - m_paintMode = PaintMode::FULL; + needsRepaint = true; } setGeometry(rect); + m_paintMode = paintMode; setPixmapVisible(true); if (needsRepaint) { - update(); + repaint(); } } From 50e4d549f44ade8b615c73a33b76e975fb21347f Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Wed, 15 Sep 2021 14:51:36 -0700 Subject: [PATCH 326/355] Add comments Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../AzQtComponents/Components/FancyDockingGhostWidget.cpp | 8 ++++++++ .../AzQtComponents/Components/FancyDockingGhostWidget.h | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp index 5456356458..d259b28636 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp @@ -80,6 +80,14 @@ namespace AzQtComponents QPoint midPoint = targetRect.topLeft() + QPoint(targetRect.width() / 2, targetRect.height() / 2); QScreen* pointScreen = QApplication::screenAt(midPoint); QRect rect(targetRect); + + // On environment with multiple screens with different scaling settings, the screen coordinate system may have gaps + // due to the screen real estate shrinking according to the scale. When that happens, if a widget is moved into the gap + // it will resize and translate with undefined behavior, causing a lot of jitter and flashes. + // To prevent this, whenever the widget would end up outside screen boundaries, we resize the widget to be twice its + // original size so that the center of the widget is back inside the screen boundaries, and set the ghost widget + // to paint the widget pixmap at half the previous size to make the process seamless. + // This makes the dragging a lot smoother in most situations. PaintMode paintMode = PaintMode::FULL; if (!pointScreen || pointScreen != screen) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h index 6649c6d848..5244bcdd0a 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.h @@ -46,11 +46,12 @@ namespace AzQtComponents bool m_visible = false; // maintain our own flag, so that we're always ready to render ignoring Qt's widget caching system bool m_clipToWidgets = false; + //! Determines the way the ghost widget pixmap should be painted on the widget. enum class PaintMode { - FULL = 0, - BOTTOMLEFT, - BOTTOMRIGHT + FULL = 0, //!< Paint the pixmap on the full widget + BOTTOMLEFT, //!< Paint the pixmap on the bottom left quarter of the widget, halving its size + BOTTOMRIGHT //!< Paint the pixmap on the bottom right quarter of the widget, halving its size }; PaintMode m_paintMode = PaintMode::FULL; From 28b18a33bd170e2e482c6ca35532cd005eb27bc4 Mon Sep 17 00:00:00 2001 From: Jonny Galloway Date: Wed, 15 Sep 2021 16:55:14 -0500 Subject: [PATCH 327/355] Atom/gallowj/clean up atom content (#4151) * Update the atom content to make best practice (latest conventions) Signed-off-by: Jonny Gallowy * file tweaks cleanup Signed-off-by: Jonny Gallowy * correct license headers Signed-off-by: Jonny Gallowy --- Gems/AtomContent/.gitignore | 8 ++ .../ReferenceMaterials/Launch_WingIDE-7-1.bat | 79 ------------- .../ReferenceMaterials/LyProjectRootStub | 0 .../ReferenceMaterials/Project_Env.bat | 70 ----------- .../{ => Tools}/Launch_Cmd.bat | 18 ++- .../Launch_Maya.bat} | 10 +- .../ReferenceMaterials/Tools/Project_Env.bat | 110 ++++++++++++++++++ .../Tools/User_Env.bat.template | 42 +++++++ Gems/AtomContent/ReferenceMaterials/gem.json | 10 +- Gems/AtomContent/Sponza/Project_Env.bat | 72 ------------ Gems/AtomContent/Sponza/Tools/Launch_Cmd.bat | 16 +-- .../Launch_Maya_2020.bat => Launch_Maya.bat} | 36 +++--- .../Sponza/Tools/Maya/Scripts/stub | 0 Gems/AtomContent/Sponza/Tools/Project_Env.bat | 110 ++++++++++++++++++ .../Sponza/Tools/User_Env.bat.template | 42 +++++++ Gems/AtomContent/Sponza/User_env.bat.template | 1 - .../Launchers/Windows/Env_Maya.bat | 2 +- .../azpy/config_utils.py | 32 ++++- 18 files changed, 383 insertions(+), 275 deletions(-) create mode 100644 Gems/AtomContent/.gitignore delete mode 100644 Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat delete mode 100644 Gems/AtomContent/ReferenceMaterials/LyProjectRootStub delete mode 100644 Gems/AtomContent/ReferenceMaterials/Project_Env.bat rename Gems/AtomContent/ReferenceMaterials/{ => Tools}/Launch_Cmd.bat (72%) rename Gems/AtomContent/ReferenceMaterials/{Launch_Maya_2020.bat => Tools/Launch_Maya.bat} (82%) create mode 100644 Gems/AtomContent/ReferenceMaterials/Tools/Project_Env.bat create mode 100644 Gems/AtomContent/ReferenceMaterials/Tools/User_Env.bat.template delete mode 100644 Gems/AtomContent/Sponza/Project_Env.bat rename Gems/AtomContent/Sponza/Tools/{Maya/Launch_Maya_2020.bat => Launch_Maya.bat} (63%) delete mode 100644 Gems/AtomContent/Sponza/Tools/Maya/Scripts/stub create mode 100644 Gems/AtomContent/Sponza/Tools/Project_Env.bat create mode 100644 Gems/AtomContent/Sponza/Tools/User_Env.bat.template delete mode 100644 Gems/AtomContent/Sponza/User_env.bat.template diff --git a/Gems/AtomContent/.gitignore b/Gems/AtomContent/.gitignore new file mode 100644 index 0000000000..174c2dd972 --- /dev/null +++ b/Gems/AtomContent/.gitignore @@ -0,0 +1,8 @@ +_savebackup/ +.mayaSwatches/ +*.swatches +[Bb]uild/ +[Cc]ache/ +[Uu]ser/ +[Uu]ser_Env.bat +.maya_data/ \ No newline at end of file diff --git a/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat b/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat deleted file mode 100644 index c9b380ad64..0000000000 --- a/Gems/AtomContent/ReferenceMaterials/Launch_WingIDE-7-1.bat +++ /dev/null @@ -1,79 +0,0 @@ -@echo off -:: Launches Wing IDE and the DccScriptingInterface Project Files - -REM -REM Copyright (c) Contributors to the Open 3D Engine Project. -REM For complete copyright and license terms please see the LICENSE at the root of this distribution. -REM -REM SPDX-License-Identifier: Apache-2.0 OR MIT -REM -REM - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up LY DCCsi WingIDE Dev Env... -echo _____________________________________________________________________ -echo. - -:: Store current dir -%~d0 -cd %~dp0 -PUSHD %~dp0 - -:: Keep changes local -SETLOCAL enableDelayedExpansion - -SET ABS_PATH=%~dp0 -echo Current Dir, %ABS_PATH% - -:: WingIDE version Major -SET WING_VERSION_MAJOR=7 -echo WING_VERSION_MAJOR = %WING_VERSION_MAJOR% - -:: WingIDE version Major -SET WING_VERSION_MINOR=1 -echo WING_VERSION_MINOR = %WING_VERSION_MINOR% - -:: note the changed path from IDE to Pro -set WINGHOME=%PROGRAMFILES(X86)%\Wing Pro %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% -echo WINGHOME = %WINGHOME% - -CALL %~dp0\Project_Env.bat - -echo. -echo _____________________________________________________________________ -echo. -echo ~ WingIDE Version %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% -echo _____________________________________________________________________ -echo. - -SET WING_PROJ=%DCCSIG_PATH%\Solutions\.wing\DCCsi_%WING_VERSION_MAJOR%x.wpr -echo WING_PROJ = %WING_PROJ% - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Launching %LY_PROJECT% project in WingIDE %WING_VERSION_MAJOR%.%WING_VERSION_MINOR% ... -echo _____________________________________________________________________ -echo. - - -IF EXIST "%WINGHOME%\bin\wing.exe" ( - start "" "%WINGHOME%\bin\wing.exe" "%WING_PROJ%" -) ELSE ( - Where wing.exe 2> NUL - IF ERRORLEVEL 1 ( - echo wing.exe could not be found - pause - ) ELSE ( - start "" wing.exe "%WING_PROJ%" - ) -) - -ENDLOCAL - -:: Return to starting directory -POPD - -:END_OF_FILE diff --git a/Gems/AtomContent/ReferenceMaterials/LyProjectRootStub b/Gems/AtomContent/ReferenceMaterials/LyProjectRootStub deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Gems/AtomContent/ReferenceMaterials/Project_Env.bat b/Gems/AtomContent/ReferenceMaterials/Project_Env.bat deleted file mode 100644 index 6612ca5399..0000000000 --- a/Gems/AtomContent/ReferenceMaterials/Project_Env.bat +++ /dev/null @@ -1,70 +0,0 @@ -@echo off -:: Sets up environment for Lumberyard DCC tools and code access - -REM -REM Copyright (c) Contributors to the Open 3D Engine Project. -REM For complete copyright and license terms please see the LICENSE at the root of this distribution. -REM -REM SPDX-License-Identifier: Apache-2.0 OR MIT -REM -REM - -:: Store current dir -%~d0 -cd %~dp0 -PUSHD %~dp0 - -for %%a in (.) do set LY_PROJECT=%%~na - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up LY DSI PROJECT Environment ... -echo _____________________________________________________________________ -echo. - -echo LY_PROJECT = %LY_PROJECT% - -:: Put you project env vars and overrides here - -:: chanhe the relative path up to dev -set DEV_REL_PATH=../../.. -set ABS_PATH=%~dp0 - -:: Override the default maya version -set MAYA_VERSION=2020 -echo MAYA_VERSION = %MAYA_VERSION% - -set LY_PROJECT_PATH=%ABS_PATH% -echo LY_PROJECT_PATH = %LY_PROJECT_PATH% - -:: Change to root Lumberyard dev dir -CD /d %LY_PROJECT_PATH%\%DEV_REL_PATH% -set LY_DEV=%CD% -echo LY_DEV = %LY_DEV% - -CALL %LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Env.bat - -rem :: Constant Vars (Global) -rem SET LYPY_GDEBUG=0 -rem echo LYPY_GDEBUG = %LYPY_GDEBUG% -rem SET LYPY_DEV_MODE=0 -rem echo LYPY_DEV_MODE = %LYPY_DEV_MODE% -rem SET LYPY_DEBUGGER=WING -rem echo LYPY_DEBUGGER = %LYPY_DEBUGGER% - -:: Restore original directory -popd - -:: Change to root dir -CD /D %ABS_PATH% - -:: if the user has set up a custom env call it -IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat - -GOTO END_OF_FILE - -:: Return to starting directory -POPD - -:END_OF_FILE diff --git a/Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat b/Gems/AtomContent/ReferenceMaterials/Tools/Launch_Cmd.bat similarity index 72% rename from Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat rename to Gems/AtomContent/ReferenceMaterials/Tools/Launch_Cmd.bat index 8ec894c21f..d100c9ddc7 100644 --- a/Gems/AtomContent/ReferenceMaterials/Launch_Cmd.bat +++ b/Gems/AtomContent/ReferenceMaterials/Tools/Launch_Cmd.bat @@ -1,21 +1,19 @@ -:: Need to set up - @echo off REM -REM Copyright (c) Contributors to the Open 3D Engine Project. -REM For complete copyright and license terms please see the LICENSE at the root of this distribution. -REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. REM REM -:: Set up and run LY Python CMD prompt -:: Sets up the DccScriptingInterface_Env, +:: Set up and start a O3DE CMD prompt +:: Sets up the current (DCC) Project_Env, :: Puts you in the CMD within the dev environment :: Set up window -TITLE Lumberyard DCC Scripting Interface Cmd +TITLE O3DE Asset Gem Cmd :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E @@ -31,7 +29,7 @@ CALL %~dp0\Project_Env.bat echo. echo _____________________________________________________________________ echo. -echo ~ LY DCC Scripting Interface CMD ... +echo ~ O3DE Asset Gem CMD ... echo _____________________________________________________________________ echo. @@ -43,4 +41,4 @@ ENDLOCAL :: Return to starting directory POPD -:END_OF_FILE +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat b/Gems/AtomContent/ReferenceMaterials/Tools/Launch_Maya.bat similarity index 82% rename from Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat rename to Gems/AtomContent/ReferenceMaterials/Tools/Launch_Maya.bat index 1dc504e684..b9a6b399f3 100644 --- a/Gems/AtomContent/ReferenceMaterials/Launch_Maya_2020.bat +++ b/Gems/AtomContent/ReferenceMaterials/Tools/Launch_Maya.bat @@ -22,22 +22,22 @@ echo ~ calling PROJ_Env.bat SETLOCAL enableDelayedExpansion :: PY version Major -set DCCSI_PY_VERSION_MAJOR=2 +IF "%DCCSI_PY_VERSION_MAJOR%"=="" (set DCCSI_PY_VERSION_MAJOR=2) echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% :: PY version Major -set DCCSI_PY_VERSION_MINOR=7 +IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% :: Maya Version -set MAYA_VERSION=2020 -echo MAYA_VERSION = %MAYA_VERSION% +IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) +echo DCCSI_MAYA_VERSION = %DCCSI_MAYA_VERSION% :: if a local customEnv.bat exists, run it IF EXIST "%~dp0Project_Env.bat" CALL %~dp0Project_Env.bat echo ________________________________ -echo Launching Maya %MAYA_VERSION% for Lumberyard... +echo Launching Maya %DCCSI_MAYA_VERSION% for Lumberyard... :::: Set Maya native project acess to this project ::set MAYA_PROJECT=%LY_PROJECT% diff --git a/Gems/AtomContent/ReferenceMaterials/Tools/Project_Env.bat b/Gems/AtomContent/ReferenceMaterials/Tools/Project_Env.bat new file mode 100644 index 0000000000..6e2c8b5914 --- /dev/null +++ b/Gems/AtomContent/ReferenceMaterials/Tools/Project_Env.bat @@ -0,0 +1,110 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Sets up environment for O3DE DCC tools and code access + +:: Set up window +TITLE O3DE Asset Gem +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Skip initialization if already completed +IF "%O3DE_PROJ_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Put you project env vars and overrides in this file + +:: chanhe the relative path up to dev +set ABS_PATH=%~dp0 + +:: project name as a str tag +IF "%LY_PROJECT_NAME%"=="" ( + for %%I in ("%~dp0.") do for %%J in ("%%~dpI.") do set LY_PROJECT_NAME=%%~nxJ + ) + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Setting up O3DE %LY_PROJECT_NAME% Environment ... +echo _____________________________________________________________________ +echo. +echo LY_PROJECT_NAME = %LY_PROJECT_NAME% + +:: if the user has set up a custom env call it +:: this should allow the user to locally +:: set env hooks like LY_DEV or LY_PROJECT +IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat +echo LY_DEV = %LY_DEV% + +:: Constant Vars (Global) +:: global debug flag (propogates) +:: The intent here is to set and globally enter a debug mode +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates earliest debugger connection +:: we support attaching to WingIDE... PyCharm and VScode in the future +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: Override this to control the setting +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Override the default maya version +IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) +echo DCCSI_MAYA_VERSION = %DCCSI_MAYA_VERSION% + +:: LY_PROJECT is ideally treated as a full path in the env launchers +:: do to changes in o3de, external engine/project/gem folder structures, etc. +IF "%LY_PROJECT%"=="" ( + for %%i in ("%~dp0..") do set "LY_PROJECT=%%~fi" + ) +echo LY_PROJECT = %LY_PROJECT% + +:: this is here for archaic reasons, WILL DEPRECATE +IF "%LY_PROJECT_PATH%"=="" (set LY_PROJECT_PATH=%LY_PROJECT%) +echo LY_PROJECT_PATH = %LY_PROJECT_PATH% + +:: Change to root Lumberyard dev dir +:: You must set this in a User_Env.bat to match youe engine repo location! +IF "%LY_DEV%"=="" (set LY_DEV=C:\Depot\o3de-engine) +echo LY_DEV = %LY_DEV% + +CALL %LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Env_Maya.bat + +:: Restore original directory +popd + +:: Change to root dir +CD /D %ABS_PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_PROJ_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/AtomContent/ReferenceMaterials/Tools/User_Env.bat.template b/Gems/AtomContent/ReferenceMaterials/Tools/User_Env.bat.template new file mode 100644 index 0000000000..d108f30a5b --- /dev/null +++ b/Gems/AtomContent/ReferenceMaterials/Tools/User_Env.bat.template @@ -0,0 +1,42 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: copy this file, rename to User_Env.bat (remove .template) +:: use this file to override any local properties that differ from base + +:: Skip initialization if already completed +IF "%O3DE_USER_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +SET O3DE_DEV=C:\Depot\o3de-engine +::SET OCIO_APPS=C:\Depot\o3de-engine\Tools\ColorGrading\ocio\build\src\apps +SET TAG_LY_BUILD_PATH=build +SET DCCSI_GDEBUG=True +SET DCCSI_DEV_MODE=True + +set DCCSI_MAYA_VERSION=2020 + +:: set the your user name here for windows path +SET TAG_USERNAME=NOT_SET +SET DCCSI_PY_REV=rev1 +SET DCCSI_PY_PLATFORM=windows + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_USER_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomContent/ReferenceMaterials/gem.json b/Gems/AtomContent/ReferenceMaterials/gem.json index d66c2fa1db..9e145c20cc 100644 --- a/Gems/AtomContent/ReferenceMaterials/gem.json +++ b/Gems/AtomContent/ReferenceMaterials/gem.json @@ -1,11 +1,11 @@ { "gem_name": "ReferenceMaterials", - "display_name": "ReferenceMaterials", - "license": "Apache-2.0 Or MIT", - "origin": "Open 3D Engine - o3de.org", + "display_name": "PBR Reference Materials", + "license": "Code, text, data files: Apache-2.0 Or MIT, assets/content/images: CC BY 4.0", + "origin": "https://github.com/aws-lumberyard-dev/o3de.git", "type": "Asset", "summary": "Atom Asset Gem with a library of reference materials for StandardPBR (and others in the future)", "canonical_tags": ["Gem"], - "user_tags": ["Assets"], - "requirements": "" + "user_tags": ["Assets", "PBR", "Materials"], + "icon_path": "preview.png" } diff --git a/Gems/AtomContent/Sponza/Project_Env.bat b/Gems/AtomContent/Sponza/Project_Env.bat deleted file mode 100644 index 74b70a2320..0000000000 --- a/Gems/AtomContent/Sponza/Project_Env.bat +++ /dev/null @@ -1,72 +0,0 @@ -@echo off -REM -REM Copyright (c) Contributors to the Open 3D Engine Project. -REM For complete copyright and license terms please see the LICENSE at the root of this distribution. -REM -REM SPDX-License-Identifier: Apache-2.0 OR MIT -REM -REM - -:: Store current dir -%~d0 -cd %~dp0 -PUSHD %~dp0 - -:: This is a legacy envar which is being migrated to LY_PROJECT_NAME -for %%a in (.) do set LY_PROJECT=%%~na - -echo. -echo _____________________________________________________________________ -echo. -echo ~ Setting up LY DSI PROJECT Environment ... -echo _____________________________________________________________________ -echo. - -echo LY_PROJECT = %LY_PROJECT% - -set LY_PROJECT_NAME=%LY_PROJECT% -echo LY_PROJECT_NAME = %LY_PROJECT_NAME% - -:: Put you project env vars and overrides here - -:: chanhe the relative path up to dev -set DEV_REL_PATH=../../.. -set ABS_PATH=%~dp0 - -:: Override the default maya version -set MAYA_VERSION=2020 -echo MAYA_VERSION = %MAYA_VERSION% - -set LY_PROJECT_PATH=%ABS_PATH% -echo LY_PROJECT_PATH = %LY_PROJECT_PATH% - -:: Change to root Lumberyard dev dir -CD /d %LY_PROJECT_PATH%\%DEV_REL_PATH% -set LY_DEV=%CD% -echo LY_DEV = %LY_DEV% - -CALL %LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Env_Maya.bat - -rem :: Constant Vars (Global) -rem SET LYPY_GDEBUG=0 -rem echo LYPY_GDEBUG = %LYPY_GDEBUG% -rem SET LYPY_DEV_MODE=0 -rem echo LYPY_DEV_MODE = %LYPY_DEV_MODE% -rem SET LYPY_DEBUGGER=WING -rem echo LYPY_DEBUGGER = %LYPY_DEBUGGER% - -:: Restore original directory -popd - -:: Change to root dir -CD /D %ABS_PATH% - -:: if the user has set up a custom env call it -IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat - -GOTO END_OF_FILE - -:: Return to starting directory -POPD - -:END_OF_FILE diff --git a/Gems/AtomContent/Sponza/Tools/Launch_Cmd.bat b/Gems/AtomContent/Sponza/Tools/Launch_Cmd.bat index 2636b3dea4..99c2c12c51 100644 --- a/Gems/AtomContent/Sponza/Tools/Launch_Cmd.bat +++ b/Gems/AtomContent/Sponza/Tools/Launch_Cmd.bat @@ -1,19 +1,19 @@ @echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project REM -REM Copyright (c) Contributors to the Open 3D Engine Project. -REM For complete copyright and license terms please see the LICENSE at the root of this distribution. -REM REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. REM REM -@echo off -:: Set up and run LY Python CMD prompt -:: Sets up the DccScriptingInterface_Env, +:: Set up and start a O3DE CMD prompt +:: Sets up the current (DCC) Project_Env, :: Puts you in the CMD within the dev environment :: Set up window -TITLE Lumberyard DCC Scripting Interface Cmd +TITLE O3DE DCC Scripting Interface Cmd :: Use obvious color to prevent confusion (Grey with Yellow Text) COLOR 8E @@ -24,7 +24,7 @@ PUSHD %~dp0 :: Keep changes local SETLOCAL enableDelayedExpansion -CALL %~dp0\..\Project_Env.bat +CALL %~dp0\Project_Env.bat echo. echo _____________________________________________________________________ diff --git a/Gems/AtomContent/Sponza/Tools/Maya/Launch_Maya_2020.bat b/Gems/AtomContent/Sponza/Tools/Launch_Maya.bat similarity index 63% rename from Gems/AtomContent/Sponza/Tools/Maya/Launch_Maya_2020.bat rename to Gems/AtomContent/Sponza/Tools/Launch_Maya.bat index 53344d527e..d774adf79b 100644 --- a/Gems/AtomContent/Sponza/Tools/Maya/Launch_Maya_2020.bat +++ b/Gems/AtomContent/Sponza/Tools/Launch_Maya.bat @@ -1,4 +1,5 @@ @echo off + REM REM Copyright (c) Contributors to the Open 3D Engine Project. REM For complete copyright and license terms please see the LICENSE at the root of this distribution. @@ -7,11 +8,6 @@ REM SPDX-License-Identifier: Apache-2.0 OR MIT REM REM -:: Launches maya wityh a bunch of local hooks for Lumberyard -:: ToDo: move all of this to a .json data driven boostrapping system - -@echo off - %~d0 cd %~dp0 PUSHD %~dp0 @@ -23,22 +19,22 @@ echo ~ calling PROJ_Env.bat SETLOCAL enableDelayedExpansion :: PY version Major -set DCCSI_PY_VERSION_MAJOR=2 +IF "%DCCSI_PY_VERSION_MAJOR%"=="" (set DCCSI_PY_VERSION_MAJOR=2) echo DCCSI_PY_VERSION_MAJOR = %DCCSI_PY_VERSION_MAJOR% :: PY version Major -set DCCSI_PY_VERSION_MINOR=7 +IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) echo DCCSI_PY_VERSION_MINOR = %DCCSI_PY_VERSION_MINOR% :: Maya Version -set MAYA_VERSION=2020 -echo MAYA_VERSION = %MAYA_VERSION% +IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) +echo DCCSI_MAYA_VERSION = %DCCSI_MAYA_VERSION% :: if a local customEnv.bat exists, run it -IF EXIST "%~dp0..\..\Project_Env.bat" CALL %~dp0..\..\Project_Env.bat +IF EXIST "%~dp0Project_Env.bat" CALL %~dp0Project_Env.bat echo ________________________________ -echo Launching Maya %MAYA_VERSION% for Lumberyard... +echo Launching Maya %DCCSI_MAYA_VERSION% for Lumberyard... :::: Set Maya native project acess to this project ::set MAYA_PROJECT=%LY_PROJECT% @@ -49,15 +45,15 @@ Set MAYA_VP2_DEVICE_OVERRIDE = VirtualDeviceDx11 :: Default to the right version of Maya if we can detect it... and launch IF EXIST "%MAYA_LOCATION%\bin\Maya.exe" ( - start "" "%MAYA_LOCATION%\bin\Maya.exe" %* + start "" "%MAYA_LOCATION%\bin\Maya.exe" %* ) ELSE ( - Where maya.exe 2> NUL - IF ERRORLEVEL 1 ( - echo Maya.exe could not be found - pause - ) ELSE ( - start "" Maya.exe %* - ) + Where maya.exe 2> NUL + IF ERRORLEVEL 1 ( + echo Maya.exe could not be found + pause + ) ELSE ( + start "" Maya.exe %* + ) ) :: Return to starting directory @@ -65,4 +61,4 @@ POPD :END_OF_FILE -exit /b 0 \ No newline at end of file +exit /b 0 diff --git a/Gems/AtomContent/Sponza/Tools/Maya/Scripts/stub b/Gems/AtomContent/Sponza/Tools/Maya/Scripts/stub deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/Gems/AtomContent/Sponza/Tools/Project_Env.bat b/Gems/AtomContent/Sponza/Tools/Project_Env.bat new file mode 100644 index 0000000000..6e2c8b5914 --- /dev/null +++ b/Gems/AtomContent/Sponza/Tools/Project_Env.bat @@ -0,0 +1,110 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: Sets up environment for O3DE DCC tools and code access + +:: Set up window +TITLE O3DE Asset Gem +:: Use obvious color to prevent confusion (Grey with Yellow Text) +COLOR 8E + +:: Skip initialization if already completed +IF "%O3DE_PROJ_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +:: Put you project env vars and overrides in this file + +:: chanhe the relative path up to dev +set ABS_PATH=%~dp0 + +:: project name as a str tag +IF "%LY_PROJECT_NAME%"=="" ( + for %%I in ("%~dp0.") do for %%J in ("%%~dpI.") do set LY_PROJECT_NAME=%%~nxJ + ) + +echo. +echo _____________________________________________________________________ +echo. +echo ~ Setting up O3DE %LY_PROJECT_NAME% Environment ... +echo _____________________________________________________________________ +echo. +echo LY_PROJECT_NAME = %LY_PROJECT_NAME% + +:: if the user has set up a custom env call it +:: this should allow the user to locally +:: set env hooks like LY_DEV or LY_PROJECT +IF EXIST "%~dp0User_Env.bat" CALL %~dp0User_Env.bat +echo LY_DEV = %LY_DEV% + +:: Constant Vars (Global) +:: global debug flag (propogates) +:: The intent here is to set and globally enter a debug mode +IF "%DCCSI_GDEBUG%"=="" (set DCCSI_GDEBUG=false) +echo DCCSI_GDEBUG = %DCCSI_GDEBUG% +:: initiates earliest debugger connection +:: we support attaching to WingIDE... PyCharm and VScode in the future +IF "%DCCSI_DEV_MODE%"=="" (set DCCSI_DEV_MODE=false) +echo DCCSI_DEV_MODE = %DCCSI_DEV_MODE% +:: sets debugger, options: WING, PYCHARM +IF "%DCCSI_GDEBUGGER%"=="" (set DCCSI_GDEBUGGER=WING) +echo DCCSI_GDEBUGGER = %DCCSI_GDEBUGGER% +:: Default level logger will handle +:: Override this to control the setting +:: CRITICAL:50 +:: ERROR:40 +:: WARNING:30 +:: INFO:20 +:: DEBUG:10 +:: NOTSET:0 +IF "%DCCSI_LOGLEVEL%"=="" (set DCCSI_LOGLEVEL=20) +echo DCCSI_LOGLEVEL = %DCCSI_LOGLEVEL% + +:: Override the default maya version +IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) +echo DCCSI_MAYA_VERSION = %DCCSI_MAYA_VERSION% + +:: LY_PROJECT is ideally treated as a full path in the env launchers +:: do to changes in o3de, external engine/project/gem folder structures, etc. +IF "%LY_PROJECT%"=="" ( + for %%i in ("%~dp0..") do set "LY_PROJECT=%%~fi" + ) +echo LY_PROJECT = %LY_PROJECT% + +:: this is here for archaic reasons, WILL DEPRECATE +IF "%LY_PROJECT_PATH%"=="" (set LY_PROJECT_PATH=%LY_PROJECT%) +echo LY_PROJECT_PATH = %LY_PROJECT_PATH% + +:: Change to root Lumberyard dev dir +:: You must set this in a User_Env.bat to match youe engine repo location! +IF "%LY_DEV%"=="" (set LY_DEV=C:\Depot\o3de-engine) +echo LY_DEV = %LY_DEV% + +CALL %LY_DEV%\Gems\AtomLyIntegration\TechnicalArt\DccScriptingInterface\Launchers\Windows\Env_Maya.bat + +:: Restore original directory +popd + +:: Change to root dir +CD /D %ABS_PATH% + +::ENDLOCAL + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_PROJ_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE diff --git a/Gems/AtomContent/Sponza/Tools/User_Env.bat.template b/Gems/AtomContent/Sponza/Tools/User_Env.bat.template new file mode 100644 index 0000000000..d108f30a5b --- /dev/null +++ b/Gems/AtomContent/Sponza/Tools/User_Env.bat.template @@ -0,0 +1,42 @@ +@echo off + +REM +REM Copyright (c) Contributors to the Open 3D Engine Project +REM +REM SPDX-License-Identifier: Apache-2.0 OR MIT +REM For complete copyright and license terms please see the LICENSE at the root of this distribution. +REM +REM + +:: copy this file, rename to User_Env.bat (remove .template) +:: use this file to override any local properties that differ from base + +:: Skip initialization if already completed +IF "%O3DE_USER_ENV_INIT%"=="1" GOTO :END_OF_FILE + +:: Store current dir +%~d0 +cd %~dp0 +PUSHD %~dp0 + +SET O3DE_DEV=C:\Depot\o3de-engine +::SET OCIO_APPS=C:\Depot\o3de-engine\Tools\ColorGrading\ocio\build\src\apps +SET TAG_LY_BUILD_PATH=build +SET DCCSI_GDEBUG=True +SET DCCSI_DEV_MODE=True + +set DCCSI_MAYA_VERSION=2020 + +:: set the your user name here for windows path +SET TAG_USERNAME=NOT_SET +SET DCCSI_PY_REV=rev1 +SET DCCSI_PY_PLATFORM=windows + +:: Set flag so we don't initialize dccsi environment twice +SET O3DE_USER_ENV_INIT=1 +GOTO END_OF_FILE + +:: Return to starting directory +POPD + +:END_OF_FILE \ No newline at end of file diff --git a/Gems/AtomContent/Sponza/User_env.bat.template b/Gems/AtomContent/Sponza/User_env.bat.template deleted file mode 100644 index 99bc7a951d..0000000000 --- a/Gems/AtomContent/Sponza/User_env.bat.template +++ /dev/null @@ -1 +0,0 @@ -set LY_DEV=C:\Depot\o3de-engine \ No newline at end of file diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat index f3d9aaec69..cceaa80b75 100644 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Launchers/Windows/Env_Maya.bat @@ -27,7 +27,7 @@ IF "%DCCSI_PY_VERSION_MINOR%"=="" (set DCCSI_PY_VERSION_MINOR=7) IF "%DCCSI_PY_VERSION_RELEASE%"=="" (set DCCSI_PY_VERSION_RELEASE=11) :: Default Maya Version -IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=2020) +IF "%DCCSI_MAYA_VERSION%"=="" (set DCCSI_MAYA_VERSION=%MAYA_VERSION%) :: Initialize env CALL %~dp0\Env_Core.bat diff --git a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py index 4baf68d85e..2df85cbfaa 100755 --- a/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py +++ b/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/azpy/config_utils.py @@ -7,15 +7,16 @@ # SPDX-License-Identifier: Apache-2.0 OR MIT # # -# -- This line is 75 characters ------------------------------------------- +# note: this module should reamin py2.7 compatible (Maya) so no f'strings +# -------------------------------------------------------------------------- import sys import os import re import site import logging as _logging +# ------------------------------------------------------------------------- + -from pathlib import Path # note: we provide this in py2.7 -# so using it here suggests some boostrapping has occured before using azpy # -------------------------------------------------------------------------- _PACKAGENAME = 'azpy.config_utils' @@ -28,8 +29,31 @@ _LOGGER.debug('Initializing: {0}.'.format({_PACKAGENAME})) __all__ = ['get_os', 'return_stub', 'get_stub_check_path', 'get_dccsi_config', 'get_current_project'] +# ------------------------------------------------------------------------- -# note: this module should reamin py2.7 compatible (Maya) so no f'strings + +# ------------------------------------------------------------------------- +# just a quick check to ensure what paths have code access +_G_DEBUG = False # enable for debug prints +if _G_DEBUG: + known_paths = list() + for p in sys.path: + known_paths.append(p) + _LOGGER.debug(known_paths) + +# this import can fail in Maya 2020 (and earlier) stuck on py2.7 +# wrapped in a try, to trap and providing messaging to help user correct +try: + from pathlib import Path # note: we provide this in py2.7 + # so using it here suggests some boostrapping has occured before using azpy +except Exception as e: + _LOGGER.warning('Maya 2020 and below, use py2.7') + _LOGGER.warning('py2.7 does not include pathlib') + _LOGGER.warning('Try installing the O3DE DCCsi py2.7 requirements.txt') + _LOGGER.warning("See instructions: 'C:\\< your o3de engine >\\Gems\\AtomLyIntegration\\TechnicalArt\\DccScriptingInterface\\SDK\Maya\\readme.txt'") + _LOGGER.warning("Other code in this module with fail!!!") + _LOGGER.error(e) + pass # fail gracefully, note: code accesing Path will fail! # ------------------------------------------------------------------------- From 1591f6519297221d287d79ab7265792a1d68cfc1 Mon Sep 17 00:00:00 2001 From: AMZN-tpeng <82184807+AMZN-tpeng@users.noreply.github.com> Date: Wed, 15 Sep 2021 15:14:33 -0700 Subject: [PATCH 328/355] [ATOM][RHI][Vulkan] - Account for null descriptor for sampler. (#4127) Signed-off-by: Peng --- Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSet.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSet.cpp index c192b49a48..d70d4a01b5 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSet.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/DescriptorSet.cpp @@ -466,7 +466,7 @@ namespace AZ bool DescriptorSet::IsNullDescriptorInfo(const VkDescriptorImageInfo& descriptorInfo) { - return descriptorInfo.imageView == VK_NULL_HANDLE; + return (descriptorInfo.imageView == VK_NULL_HANDLE && descriptorInfo.sampler == VK_NULL_HANDLE); } bool DescriptorSet::IsNullDescriptorInfo(const VkBufferView& descriptorInfo) From 0f5fc1de4d824d9a298a2343d5c0578145c9bbd4 Mon Sep 17 00:00:00 2001 From: AMZN-tpeng <82184807+AMZN-tpeng@users.noreply.github.com> Date: Wed, 15 Sep 2021 15:15:20 -0700 Subject: [PATCH 329/355] =?UTF-8?q?[ATOM][RHI][Vulkan]=20Make=20sure=20to?= =?UTF-8?q?=20set=20super-variant=20for=20non-MSAA=20pipel=E2=80=A6=20(#41?= =?UTF-8?q?34)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ATOM][RHI][Vulkan] Make sure to set super-variant for non-MSAA pipeline. Separate out reflection probe draw packet checks. Signed-off-by: Peng * Missed from previous commit to make sure non-MSAA super-variant is used. Signed-off-by: Peng * Minor comment edit. Signed-off-by: Peng --- .../Code/Source/BootstrapSystemComponent.cpp | 6 +++++ .../ReflectionProbe/ReflectionProbe.cpp | 26 +++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp index ddd88a1f52..e3749175bc 100644 --- a/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp +++ b/Gems/Atom/Bootstrap/Code/Source/BootstrapSystemComponent.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -303,6 +304,11 @@ namespace AZ RPI::RenderPipelineDescriptor renderPipelineDescriptor = *RPI::GetDataFromAnyAsset(pipelineAsset); renderPipelineDescriptor.m_name = AZStd::string::format("%s_%i", renderPipelineDescriptor.m_name.c_str(), viewportContext->GetId()); + // Make sure non-msaa super variant is used for non-msaa pipeline + bool isNonMsaaPipeline = (renderPipelineDescriptor.m_renderSettings.m_multisampleState.m_samples == 1); + const char* supervariantName = isNonMsaaPipeline ? AZ::RPI::NoMsaaSupervariantName : ""; + AZ::RPI::ShaderSystemInterface::Get()->SetSupervariantName(AZ::Name(supervariantName)); + if (!scene->GetRenderPipeline(AZ::Name(renderPipelineDescriptor.m_name))) { RPI::RenderPipelinePtr renderPipeline = RPI::RenderPipeline::CreateRenderPipelineForWindow(renderPipelineDescriptor, *viewportContext->GetWindowContext().get()); diff --git a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp index 66c326e6e7..778f06c3be 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ReflectionProbe/ReflectionProbe.cpp @@ -370,11 +370,27 @@ namespace AZ { // set draw list mask m_cullable.m_cullData.m_drawListMask.reset(); - m_cullable.m_cullData.m_drawListMask = - m_stencilDrawPacket->GetDrawListMask() | - m_blendWeightDrawPacket->GetDrawListMask() | - m_renderOuterDrawPacket->GetDrawListMask() | - m_renderInnerDrawPacket->GetDrawListMask(); + + // check for draw packets due certain render pipelines such as lowend render pipeline that might not have this feature enabled + if (m_stencilDrawPacket) + { + m_cullable.m_cullData.m_drawListMask |= m_stencilDrawPacket->GetDrawListMask(); + } + + if (m_blendWeightDrawPacket) + { + m_cullable.m_cullData.m_drawListMask |= m_blendWeightDrawPacket->GetDrawListMask(); + } + + if (m_renderOuterDrawPacket) + { + m_cullable.m_cullData.m_drawListMask |= m_renderOuterDrawPacket->GetDrawListMask(); + } + + if (m_renderInnerDrawPacket) + { + m_cullable.m_cullData.m_drawListMask |= m_renderInnerDrawPacket->GetDrawListMask(); + } // setup the Lod entry, using one entry for all four draw packets m_cullable.m_lodData.m_lods.clear(); From a9091b0a72572f05f5871b26a3231d678fc10bb8 Mon Sep 17 00:00:00 2001 From: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> Date: Wed, 15 Sep 2021 15:47:23 -0700 Subject: [PATCH 330/355] Minor changes to comments Signed-off-by: Danilo Aimini <82231674+AMZN-daimini@users.noreply.github.com> --- .../AzQtComponents/Components/FancyDockingGhostWidget.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp index d259b28636..fd20f4d125 100644 --- a/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp +++ b/Code/Framework/AzQtComponents/AzQtComponents/Components/FancyDockingGhostWidget.cpp @@ -81,9 +81,8 @@ namespace AzQtComponents QScreen* pointScreen = QApplication::screenAt(midPoint); QRect rect(targetRect); - // On environment with multiple screens with different scaling settings, the screen coordinate system may have gaps - // due to the screen real estate shrinking according to the scale. When that happens, if a widget is moved into the gap - // it will resize and translate with undefined behavior, causing a lot of jitter and flashes. + // In environments with multiple screens the screen coordinate system may have gaps, especially when different scaling settings + // are involved. When that happens, if a widget is moved into the gap it will resize and translate with undefined behavior. // To prevent this, whenever the widget would end up outside screen boundaries, we resize the widget to be twice its // original size so that the center of the widget is back inside the screen boundaries, and set the ghost widget // to paint the widget pixmap at half the previous size to make the process seamless. @@ -117,6 +116,8 @@ namespace AzQtComponents setPixmapVisible(true); if (needsRepaint) { + // We use repaint instead of update since the latter has a delay of 1 frame, + // which would cause the ghost widget to flicker when changing paint mode. repaint(); } } From d07b115569e5cb7b343dd0d0ea1fccc448cfd633 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Wed, 15 Sep 2021 18:14:18 -0500 Subject: [PATCH 331/355] Rebuilding UI and instance data hierarchy on any external property change Signed-off-by: Guthrie Adams --- .../Code/Source/Material/EditorMaterialComponentInspector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp index 939417f236..a3152faf87 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/EditorMaterialComponentInspector.cpp @@ -366,7 +366,7 @@ namespace AZ m_dirtyPropertyFlags.set(); RunEditorMaterialFunctors(); - RefreshAll(); + RebuildAll(); } void MaterialPropertyInspector::SaveOverridesToEntity(bool commitChanges) From 9f6527790639b2fc073a8f79d24d96127cf7f731 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Wed, 15 Sep 2021 19:17:33 -0500 Subject: [PATCH 332/355] restoring changes lost in merge Signed-off-by: Guthrie Adams --- .../Source/Material/MaterialComponentController.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp index fab62be530..14f81c5021 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/Material/MaterialComponentController.cpp @@ -182,16 +182,7 @@ namespace AZ continue; } - if (propertyPair.second.is()) - { - const auto& assetId = *AZStd::any_cast(&propertyPair.second); - Data::Asset imageAsset(assetId, azrtti_typeid()); - materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue(imageAsset)); - } - else - { - materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue::FromAny(propertyPair.second)); - } + materialInstance->SetPropertyValue(materialPropertyIndex, AZ::RPI::MaterialPropertyValue::FromAny(propertyPair.second)); } materialInstance->Compile(); From a8908a987a23efdb12c7ecf507ebd29553b7a76d Mon Sep 17 00:00:00 2001 From: Mikhail Naumov <82239319+AMZN-mnaumov@users.noreply.github.com> Date: Wed, 15 Sep 2021 19:19:01 -0500 Subject: [PATCH 333/355] Fixing Save level As template path (#4054) * Fixing Save level As template path Signed-off-by: Mikhail Naumov * CR Feedback Signed-off-by: Mikhail Naumov * CR feedback Signed-off-by: Mikhail Naumov * PR feedback Signed-off-by: Mikhail Naumov * remove emplace Signed-off-by: Mikhail Naumov * more PR feedback Signed-off-by: Mikhail Naumov --- .../PrefabEditorEntityOwnershipService.cpp | 3 +- .../Prefab/PrefabSystemComponent.cpp | 42 +++++++++++++++++++ .../Prefab/PrefabSystemComponent.h | 7 ++++ .../Prefab/PrefabSystemComponentInterface.h | 1 + .../Prefab/Template/Template.cpp | 4 ++ .../Prefab/Template/Template.h | 1 + 6 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp index 114f45d501..0f2b896b40 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Entity/PrefabEditorEntityOwnershipService.cpp @@ -221,7 +221,8 @@ namespace AzToolsFramework AZ::IO::Path relativePath = m_loaderInterface->GenerateRelativePath(filename); m_rootInstance->SetTemplateSourcePath(relativePath); - + m_prefabSystemComponent->UpdateTemplateFilePath(m_rootInstance->GetTemplateId(), relativePath); + AZStd::string out; if (!m_loaderInterface->SaveTemplateToString(m_rootInstance->GetTemplateId(), out)) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp index e88e999878..0d2696f14b 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.cpp @@ -424,6 +424,48 @@ namespace AzToolsFramework return newTemplateId; } + void PrefabSystemComponent::UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) + { + auto findTemplateResult = FindTemplate(templateId); + if (!findTemplateResult.has_value()) + { + AZ_Error( + "Prefab", false, + "Template associated by given Id '%llu' doesn't exist in PrefabSystemComponent.", + templateId); + return; + } + + if (!filePath.IsRelative()) + { + AZ_Error("Prefab", false, "Provided filePath '%.*s' must be relative.", AZ_STRING_ARG(filePath.Native())); + return; + } + + Template& templateToChange = findTemplateResult->get(); + if (templateToChange.GetFilePath() == filePath) + { + return; + } + + m_templateFilePathToIdMap.erase(templateToChange.GetFilePath()); + if (!m_templateFilePathToIdMap.try_emplace(filePath, templateId).second) + { + AZ_Error("Prefab", false, "Provided filePath '%.*s' already exists.", AZ_STRING_ARG(filePath.Native())); + return; + } + + PrefabDom& prefabDom = templateToChange.GetPrefabDom(); + PrefabDomValueReference pathReference = Prefab::PrefabDomUtils::FindPrefabDomValue(prefabDom, "Source"); + if (pathReference) + { + const AZStd::string_view pathStr = filePath.Native(); + pathReference->get().SetString(pathStr.data(), aznumeric_caster(pathStr.length()), prefabDom.GetAllocator()); + } + + templateToChange.SetFilePath(filePath); + } + void PrefabSystemComponent::RemoveTemplate(const TemplateId& templateId) { auto findTemplateResult = FindTemplate(templateId); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h index 04bcee2961..d6908922c9 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponent.h @@ -101,6 +101,13 @@ namespace AzToolsFramework */ TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) override; + /** + * Updates relative filepath location of a prefab (in case of SaveAs operation). + * @param templateId An id of a Template to change filepath of. + * @param filePath new relative path of the Template. + */ + void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) override; + /** * Remove the Template associated with the given id from Prefab System Component. * @param templateId A unique id of a Template. diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h index ae66700728..1f59088518 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/PrefabSystemComponentInterface.h @@ -33,6 +33,7 @@ namespace AzToolsFramework virtual LinkReference FindLink(const LinkId& id) = 0; virtual TemplateId AddTemplate(const AZ::IO::Path& filePath, PrefabDom prefabDom) = 0; + virtual void UpdateTemplateFilePath(TemplateId templateId, const AZ::IO::PathView& filePath) = 0; virtual void RemoveTemplate(const TemplateId& templateId) = 0; virtual void RemoveAllTemplates() = 0; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp index 99dce3d14f..e5ab403ea6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.cpp @@ -180,5 +180,9 @@ namespace AzToolsFramework return m_filePath; } + void Template::SetFilePath(const AZ::IO::PathView& path) + { + m_filePath = path; + } } // namespace Prefab } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h index fbc9a26f36..f7a41431f8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Prefab/Template/Template.h @@ -63,6 +63,7 @@ namespace AzToolsFramework PrefabDomValueConstReference GetInstancesValue() const; const AZ::IO::Path& GetFilePath() const; + void SetFilePath(const AZ::IO::PathView& path); private: // Container for keeping links representing the Template's nested instances. From 7e85b1512a7b95cf54fe2b26aad44a697669959f Mon Sep 17 00:00:00 2001 From: hultonha <82228511+hultonha@users.noreply.github.com> Date: Thu, 16 Sep 2021 09:14:37 +0100 Subject: [PATCH 334/355] Expose sticky select option to the SettingsRegistry and disable by default (#4149) * expose sticky select option to the SettingsRegistry Signed-off-by: hultonha * update missed callsites after API change to Manipulator Test Framework Signed-off-by: hultonha * updates following review feedback Signed-off-by: hultonha --- .../EditorPreferencesPageViewportGeneral.cpp | 172 ++++++++++++------ .../EditorPreferencesPageViewportGeneral.h | 22 +-- Code/Editor/EditorViewportSettings.cpp | 11 ++ Code/Editor/EditorViewportSettings.h | 3 + Code/Editor/EditorViewportWidget.cpp | 5 + Code/Editor/EditorViewportWidget.h | 1 + Code/Editor/ViewportTitleDlg.cpp | 2 + .../ActionDispatcher.h | 28 +-- .../AzManipulatorTestFramework.h | 24 ++- .../ImmediateModeActionDispatcher.h | 4 +- .../ViewportInteraction.h | 9 +- .../Source/ImmediateModeActionDispatcher.cpp | 10 +- .../Source/ViewportInteraction.cpp | 31 ++-- .../Tests/GridSnappingTest.cpp | 4 +- .../Tests/ViewportInteractionTest.cpp | 10 +- .../Viewport/ViewportMessages.h | 2 + .../EditorTransformComponentSelection.cpp | 20 +- .../EditorTransformComponentSelection.h | 2 - ...EditorTransformComponentSelectionTests.cpp | 97 +++++----- 19 files changed, 275 insertions(+), 182 deletions(-) diff --git a/Code/Editor/EditorPreferencesPageViewportGeneral.cpp b/Code/Editor/EditorPreferencesPageViewportGeneral.cpp index a9eec22e69..77560e24f8 100644 --- a/Code/Editor/EditorPreferencesPageViewportGeneral.cpp +++ b/Code/Editor/EditorPreferencesPageViewportGeneral.cpp @@ -5,9 +5,11 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #include "EditorDefs.h" #include "EditorPreferencesPageViewportGeneral.h" +#include "EditorViewportSettings.h" #include @@ -15,7 +17,6 @@ #include "DisplaySettings.h" #include "Settings.h" - void CEditorPreferencesPage_ViewportGeneral::Reflect(AZ::SerializeContext& serialize) { serialize.Class() @@ -23,7 +24,8 @@ void CEditorPreferencesPage_ViewportGeneral::Reflect(AZ::SerializeContext& seria ->Field("Sync2DViews", &General::m_sync2DViews) ->Field("DefaultFOV", &General::m_defaultFOV) ->Field("DefaultAspectRatio", &General::m_defaultAspectRatio) - ->Field("EnableContextMenu", &General::m_enableContextMenu); + ->Field("EnableContextMenu", &General::m_contextMenuEnabled) + ->Field("StickySelect", &General::m_stickySelectEnabled); serialize.Class() ->Version(1) @@ -46,10 +48,12 @@ void CEditorPreferencesPage_ViewportGeneral::Reflect(AZ::SerializeContext& seria ->Field("ShowGridGuide", &Display::m_showGridGuide) ->Field("DisplayDimensions", &Display::m_displayDimension); + // clang-format off serialize.Class() ->Version(1) ->Field("SwapXY", &MapViewport::m_swapXY) ->Field("Resolution", &MapViewport::m_resolution); + // clang-format on serialize.Class() ->Version(1) @@ -80,31 +84,51 @@ void CEditorPreferencesPage_ViewportGeneral::Reflect(AZ::SerializeContext& seria editContext->Class("General Viewport Settings", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &General::m_sync2DViews, "Synchronize 2D Viewports", "Synchronize 2D Viewports") ->DataElement(AZ::Edit::UIHandlers::SpinBox, &General::m_defaultFOV, "Perspective View FOV", "Perspective View FOV") - ->Attribute("Multiplier", RAD2DEG(1)) - ->Attribute(AZ::Edit::Attributes::Min, 1.0f) - ->Attribute(AZ::Edit::Attributes::Max, 120.0f) - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &General::m_defaultAspectRatio, "Perspective View Aspect Ratio", "Perspective View Aspect Ratio") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &General::m_enableContextMenu, "Enable Right-Click Context Menu", "Enable Right-Click Context Menu"); + ->Attribute("Multiplier", RAD2DEG(1)) + ->Attribute(AZ::Edit::Attributes::Min, 1.0f) + ->Attribute(AZ::Edit::Attributes::Max, 120.0f) + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &General::m_defaultAspectRatio, "Perspective View Aspect Ratio", + "Perspective View Aspect Ratio") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &General::m_contextMenuEnabled, "Enable Right-Click Context Menu", + "Enable Right-Click Context Menu") + ->DataElement(AZ::Edit::UIHandlers::CheckBox, &General::m_stickySelectEnabled, "Enable Sticky Select", "Enable Sticky Select"); editContext->Class("Viewport Display Settings", "") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_showSafeFrame, "Show 4:3 Aspect Ratio Frame", "Show 4:3 Aspect Ratio Frame") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_highlightSelGeom, "Highlight Selected Geometry", "Highlight Selected Geometry") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_highlightSelVegetation, "Highlight Selected Vegetation", "Highlight Selected Vegetation") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_highlightOnMouseOver, "Highlight Geometry On Mouse Over", "Highlight Geometry On Mouse Over") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_hideMouseCursorWhenCaptured, "Hide Cursor When Captured", "Hide Mouse Cursor When Captured") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_showSafeFrame, "Show 4:3 Aspect Ratio Frame", "Show 4:3 Aspect Ratio Frame") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_highlightSelGeom, "Highlight Selected Geometry", "Highlight Selected Geometry") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_highlightSelVegetation, "Highlight Selected Vegetation", + "Highlight Selected Vegetation") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_highlightOnMouseOver, "Highlight Geometry On Mouse Over", + "Highlight Geometry On Mouse Over") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_hideMouseCursorWhenCaptured, "Hide Cursor When Captured", + "Hide Mouse Cursor When Captured") ->DataElement(AZ::Edit::UIHandlers::SpinBox, &Display::m_dragSquareSize, "Drag Square Size", "Drag Square Size") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_displayLinks, "Display Object Links", "Display Object Links") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_displayTracks, "Display Animation Tracks", "Display Animation Tracks") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_alwaysShowRadii, "Always Show Radii", "Always Show Radii") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_showBBoxes, "Show Bounding Boxes", "Show Bounding Boxes") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_drawEntityLabels, "Always Draw Entity Labels", "Always Draw Entity Labels") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_showTriggerBounds, "Always Show Trigger Bounds", "Always Show Trigger Bounds") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_drawEntityLabels, "Always Draw Entity Labels", "Always Draw Entity Labels") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_showTriggerBounds, "Always Show Trigger Bounds", "Always Show Trigger Bounds") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_showIcons, "Show Object Icons", "Show Object Icons") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_distanceScaleIcons, "Scale Object Icons with Distance", "Scale Object Icons with Distance") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_showFrozenHelpers, "Show Helpers of Frozen Objects", "Show Helpers of Frozen Objects") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_distanceScaleIcons, "Scale Object Icons with Distance", + "Scale Object Icons with Distance") + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_showFrozenHelpers, "Show Helpers of Frozen Objects", + "Show Helpers of Frozen Objects") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_fillSelectedShapes, "Fill Selected Shapes", "Fill Selected Shapes") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_showGridGuide, "Show Snapping Grid Guide", "Show Snapping Grid Guide") - ->DataElement(AZ::Edit::UIHandlers::CheckBox, &Display::m_displayDimension, "Display Dimension Figures", "Display Dimension Figures"); + ->DataElement( + AZ::Edit::UIHandlers::CheckBox, &Display::m_displayDimension, "Display Dimension Figures", "Display Dimension Figures"); editContext->Class("Map Viewport Settings", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &MapViewport::m_swapXY, "Swap X/Y Axis", "Swap X/Y Axis") @@ -113,42 +137,64 @@ void CEditorPreferencesPage_ViewportGeneral::Reflect(AZ::SerializeContext& seria editContext->Class("Text Label Settings", "") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &TextLabels::m_labelsOn, "Enabled", "Enabled") ->DataElement(AZ::Edit::UIHandlers::CheckBox, &TextLabels::m_labelsDistance, "Distance", "Distance") - ->Attribute(AZ::Edit::Attributes::Min, 0.f) - ->Attribute(AZ::Edit::Attributes::Max, 100000.f); + ->Attribute(AZ::Edit::Attributes::Min, 0.f) + ->Attribute(AZ::Edit::Attributes::Max, 100000.f); editContext->Class("Selection Preview Color Settings", "") ->DataElement(AZ::Edit::UIHandlers::Color, &SelectionPreviewColor::m_colorGroupBBox, "Group Bounding Box", "Group Bounding Box") - ->DataElement(AZ::Edit::UIHandlers::Color, &SelectionPreviewColor::m_colorEntityBBox, "Entity Bounding Box", "Entity Bounding Box") - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &SelectionPreviewColor::m_fBBoxAlpha, "Bounding Box Highlight Alpha", "Bounding Box Highlight Alpha") - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) + ->DataElement( + AZ::Edit::UIHandlers::Color, &SelectionPreviewColor::m_colorEntityBBox, "Entity Bounding Box", "Entity Bounding Box") + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &SelectionPreviewColor::m_fBBoxAlpha, "Bounding Box Highlight Alpha", + "Bounding Box Highlight Alpha") + ->Attribute(AZ::Edit::Attributes::Min, 0.0f) + ->Attribute(AZ::Edit::Attributes::Max, 1.0f) ->DataElement(AZ::Edit::UIHandlers::Color, &SelectionPreviewColor::m_geometryHighlightColor, "Geometry Color", "Geometry Color") - ->DataElement(AZ::Edit::UIHandlers::Color, &SelectionPreviewColor::m_solidBrushGeometryColor, "Solid Brush Geometry Color", "Solid Brush Geometry Color") - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &SelectionPreviewColor::m_fgeomAlpha, "Geometry Highlight Alpha", "Geometry Highlight Alpha") - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f) - ->DataElement(AZ::Edit::UIHandlers::SpinBox, &SelectionPreviewColor::m_childObjectGeomAlpha, "Child Geometry Highlight Alpha", "Child Geometry Highlight Alpha") - ->Attribute(AZ::Edit::Attributes::Min, 0.0f) - ->Attribute(AZ::Edit::Attributes::Max, 1.0f); + ->DataElement( + AZ::Edit::UIHandlers::Color, &SelectionPreviewColor::m_solidBrushGeometryColor, "Solid Brush Geometry Color", + "Solid Brush Geometry Color") + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &SelectionPreviewColor::m_fgeomAlpha, "Geometry Highlight Alpha", "Geometry Highlight Alpha") + ->Attribute(AZ::Edit::Attributes::Min, 0.0f) + ->Attribute(AZ::Edit::Attributes::Max, 1.0f) + ->DataElement( + AZ::Edit::UIHandlers::SpinBox, &SelectionPreviewColor::m_childObjectGeomAlpha, "Child Geometry Highlight Alpha", + "Child Geometry Highlight Alpha") + ->Attribute(AZ::Edit::Attributes::Min, 0.0f) + ->Attribute(AZ::Edit::Attributes::Max, 1.0f); editContext->Class("General Viewport Preferences", "General Viewport Preferences") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20)) - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_general, "General Viewport Settings", "General Viewport Settings") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_display, "Viewport Display Settings", "Viewport Display Settings") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_map, "Map Viewport Settings", "Map Viewport Settings") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_textLabels, "Text Label Settings", "Text Label Settings") - ->DataElement(AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_selectionPreviewColor, "Selection Preview Color Settings", "Selection Preview Color Settings"); + ->DataElement( + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_general, "General Viewport Settings", + "General Viewport Settings") + ->DataElement( + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_display, "Viewport Display Settings", + "Viewport Display Settings") + ->DataElement( + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_map, "Map Viewport Settings", + "Map Viewport Settings") + ->DataElement( + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_textLabels, "Text Label Settings", + "Text Label Settings") + ->DataElement( + AZ::Edit::UIHandlers::Default, &CEditorPreferencesPage_ViewportGeneral::m_selectionPreviewColor, + "Selection Preview Color Settings", "Selection Preview Color Settings"); } } - CEditorPreferencesPage_ViewportGeneral::CEditorPreferencesPage_ViewportGeneral() { InitializeSettings(); m_icon = QIcon(":/res/Viewport.svg"); } +const char* CEditorPreferencesPage_ViewportGeneral::GetCategory() +{ + return "Viewports"; +} + const char* CEditorPreferencesPage_ViewportGeneral::GetTitle() { return "Viewport"; @@ -159,14 +205,25 @@ QIcon& CEditorPreferencesPage_ViewportGeneral::GetIcon() return m_icon; } +void CEditorPreferencesPage_ViewportGeneral::OnCancel() +{ + // noop +} + +bool CEditorPreferencesPage_ViewportGeneral::OnQueryCancel() +{ + return true; +} + void CEditorPreferencesPage_ViewportGeneral::OnApply() { CDisplaySettings* ds = GetIEditor()->GetDisplaySettings(); gSettings.viewports.fDefaultAspectRatio = m_general.m_defaultAspectRatio; gSettings.viewports.fDefaultFov = m_general.m_defaultFOV; - gSettings.viewports.bEnableContextMenu = m_general.m_enableContextMenu; + gSettings.viewports.bEnableContextMenu = m_general.m_contextMenuEnabled; gSettings.viewports.bSync2DViews = m_general.m_sync2DViews; + SandboxEditor::SetStickySelectEnabled(m_general.m_stickySelectEnabled); gSettings.viewports.bShowSafeFrame = m_display.m_showSafeFrame; gSettings.viewports.bHighlightSelectedGeometry = m_display.m_highlightSelGeom; @@ -202,19 +259,19 @@ void CEditorPreferencesPage_ViewportGeneral::OnApply() gSettings.objectColorSettings.fChildGeomAlpha = m_selectionPreviewColor.m_childObjectGeomAlpha; gSettings.objectColorSettings.entityHighlight = QColor( - static_cast(m_selectionPreviewColor.m_colorEntityBBox.GetR() * 255.0f), - static_cast(m_selectionPreviewColor.m_colorEntityBBox.GetG() * 255.0f), - static_cast(m_selectionPreviewColor.m_colorEntityBBox.GetB() * 255.0f)); + static_cast(m_selectionPreviewColor.m_colorEntityBBox.GetR() * 255.0f), + static_cast(m_selectionPreviewColor.m_colorEntityBBox.GetG() * 255.0f), + static_cast(m_selectionPreviewColor.m_colorEntityBBox.GetB() * 255.0f)); gSettings.objectColorSettings.groupHighlight = QColor( - static_cast(m_selectionPreviewColor.m_colorGroupBBox.GetR() * 255.0f), - static_cast(m_selectionPreviewColor.m_colorGroupBBox.GetG() * 255.0f), - static_cast(m_selectionPreviewColor.m_colorGroupBBox.GetB() * 255.0f)); + static_cast(m_selectionPreviewColor.m_colorGroupBBox.GetR() * 255.0f), + static_cast(m_selectionPreviewColor.m_colorGroupBBox.GetG() * 255.0f), + static_cast(m_selectionPreviewColor.m_colorGroupBBox.GetB() * 255.0f)); gSettings.objectColorSettings.fBBoxAlpha = m_selectionPreviewColor.m_fBBoxAlpha; gSettings.objectColorSettings.fGeomAlpha = m_selectionPreviewColor.m_fgeomAlpha; gSettings.objectColorSettings.geometryHighlightColor = QColor( - static_cast(m_selectionPreviewColor.m_geometryHighlightColor.GetR() * 255.0f), - static_cast(m_selectionPreviewColor.m_geometryHighlightColor.GetG() * 255.0f), - static_cast(m_selectionPreviewColor.m_geometryHighlightColor.GetB() * 255.0f)); + static_cast(m_selectionPreviewColor.m_geometryHighlightColor.GetR() * 255.0f), + static_cast(m_selectionPreviewColor.m_geometryHighlightColor.GetG() * 255.0f), + static_cast(m_selectionPreviewColor.m_geometryHighlightColor.GetB() * 255.0f)); gSettings.objectColorSettings.solidBrushGeometryColor = QColor( static_cast(m_selectionPreviewColor.m_solidBrushGeometryColor.GetR() * 255.0f), static_cast(m_selectionPreviewColor.m_solidBrushGeometryColor.GetG() * 255.0f), @@ -227,8 +284,9 @@ void CEditorPreferencesPage_ViewportGeneral::InitializeSettings() m_general.m_defaultAspectRatio = gSettings.viewports.fDefaultAspectRatio; m_general.m_defaultFOV = gSettings.viewports.fDefaultFov; - m_general.m_enableContextMenu = gSettings.viewports.bEnableContextMenu; + m_general.m_contextMenuEnabled = gSettings.viewports.bEnableContextMenu; m_general.m_sync2DViews = gSettings.viewports.bSync2DViews; + m_general.m_stickySelectEnabled = SandboxEditor::StickySelectEnabled(); m_display.m_showSafeFrame = gSettings.viewports.bShowSafeFrame; m_display.m_highlightSelGeom = gSettings.viewports.bHighlightSelectedGeometry; @@ -256,10 +314,22 @@ void CEditorPreferencesPage_ViewportGeneral::InitializeSettings() m_textLabels.m_labelsDistance = ds->GetLabelsDistance(); m_selectionPreviewColor.m_childObjectGeomAlpha = gSettings.objectColorSettings.fChildGeomAlpha; - m_selectionPreviewColor.m_colorEntityBBox.Set(static_cast(gSettings.objectColorSettings.entityHighlight.redF()), static_cast(gSettings.objectColorSettings.entityHighlight.greenF()), static_cast(gSettings.objectColorSettings.entityHighlight.blueF()), 1.0f); - m_selectionPreviewColor.m_colorGroupBBox.Set(static_cast(gSettings.objectColorSettings.groupHighlight.redF()), static_cast(gSettings.objectColorSettings.groupHighlight.greenF()), static_cast(gSettings.objectColorSettings.groupHighlight.blueF()), 1.0f); + m_selectionPreviewColor.m_colorEntityBBox.Set( + static_cast(gSettings.objectColorSettings.entityHighlight.redF()), + static_cast(gSettings.objectColorSettings.entityHighlight.greenF()), + static_cast(gSettings.objectColorSettings.entityHighlight.blueF()), 1.0f); + m_selectionPreviewColor.m_colorGroupBBox.Set( + static_cast(gSettings.objectColorSettings.groupHighlight.redF()), + static_cast(gSettings.objectColorSettings.groupHighlight.greenF()), + static_cast(gSettings.objectColorSettings.groupHighlight.blueF()), 1.0f); m_selectionPreviewColor.m_fBBoxAlpha = gSettings.objectColorSettings.fBBoxAlpha; m_selectionPreviewColor.m_fgeomAlpha = gSettings.objectColorSettings.fGeomAlpha; - m_selectionPreviewColor.m_geometryHighlightColor.Set(static_cast(gSettings.objectColorSettings.geometryHighlightColor.redF()), static_cast(gSettings.objectColorSettings.geometryHighlightColor.greenF()), static_cast(gSettings.objectColorSettings.geometryHighlightColor.blueF()), 1.0f); - m_selectionPreviewColor.m_solidBrushGeometryColor.Set(static_cast(gSettings.objectColorSettings.solidBrushGeometryColor.redF()), static_cast(gSettings.objectColorSettings.solidBrushGeometryColor.greenF()), static_cast(gSettings.objectColorSettings.solidBrushGeometryColor.blueF()), 1.0f); + m_selectionPreviewColor.m_geometryHighlightColor.Set( + static_cast(gSettings.objectColorSettings.geometryHighlightColor.redF()), + static_cast(gSettings.objectColorSettings.geometryHighlightColor.greenF()), + static_cast(gSettings.objectColorSettings.geometryHighlightColor.blueF()), 1.0f); + m_selectionPreviewColor.m_solidBrushGeometryColor.Set( + static_cast(gSettings.objectColorSettings.solidBrushGeometryColor.redF()), + static_cast(gSettings.objectColorSettings.solidBrushGeometryColor.greenF()), + static_cast(gSettings.objectColorSettings.solidBrushGeometryColor.blueF()), 1.0f); } diff --git a/Code/Editor/EditorPreferencesPageViewportGeneral.h b/Code/Editor/EditorPreferencesPageViewportGeneral.h index a042bcf19b..be89cc6df4 100644 --- a/Code/Editor/EditorPreferencesPageViewportGeneral.h +++ b/Code/Editor/EditorPreferencesPageViewportGeneral.h @@ -5,18 +5,17 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ + #pragma once #include "Include/IPreferencesPage.h" -#include -#include -#include #include +#include +#include +#include #include - -class CEditorPreferencesPage_ViewportGeneral - : public IPreferencesPage +class CEditorPreferencesPage_ViewportGeneral : public IPreferencesPage { public: AZ_RTTI(CEditorPreferencesPage_ViewportGeneral, "{8511FF7F-F774-47E1-A99B-3DE3A867E403}", IPreferencesPage) @@ -26,12 +25,12 @@ public: CEditorPreferencesPage_ViewportGeneral(); virtual ~CEditorPreferencesPage_ViewportGeneral() = default; - virtual const char* GetCategory() override { return "Viewports"; } + virtual const char* GetCategory() override; virtual const char* GetTitle() override; virtual QIcon& GetIcon() override; virtual void OnApply() override; - virtual void OnCancel() override {} - virtual bool OnQueryCancel() override { return true; } + virtual void OnCancel() override; + virtual bool OnQueryCancel() override; private: void InitializeSettings(); @@ -43,7 +42,8 @@ private: bool m_sync2DViews; float m_defaultFOV; float m_defaultAspectRatio; - bool m_enableContextMenu; + bool m_contextMenuEnabled; + bool m_stickySelectEnabled; }; struct Display @@ -106,5 +106,3 @@ private: SelectionPreviewColor m_selectionPreviewColor; QIcon m_icon; }; - - diff --git a/Code/Editor/EditorViewportSettings.cpp b/Code/Editor/EditorViewportSettings.cpp index c1bd85a174..063ec125ba 100644 --- a/Code/Editor/EditorViewportSettings.cpp +++ b/Code/Editor/EditorViewportSettings.cpp @@ -20,6 +20,7 @@ namespace SandboxEditor constexpr AZStd::string_view AngleSnappingSetting = "/Amazon/Preferences/Editor/AngleSnapping"; constexpr AZStd::string_view AngleSizeSetting = "/Amazon/Preferences/Editor/AngleSize"; constexpr AZStd::string_view ShowGridSetting = "/Amazon/Preferences/Editor/ShowGrid"; + constexpr AZStd::string_view StickySelectSetting = "/Amazon/Preferences/Editor/StickySelect"; constexpr AZStd::string_view ManipulatorLineBoundWidthSetting = "/Amazon/Preferences/Editor/Manipulator/LineBoundWidth"; constexpr AZStd::string_view ManipulatorCircleBoundWidthSetting = "/Amazon/Preferences/Editor/Manipulator/CircleBoundWidth"; constexpr AZStd::string_view CameraTranslateSpeedSetting = "/Amazon/Preferences/Editor/Camera/TranslateSpeed"; @@ -158,6 +159,16 @@ namespace SandboxEditor SetRegistry(ShowGridSetting, showing); } + bool StickySelectEnabled() + { + return GetRegistry(StickySelectSetting, false); + } + + void SetStickySelectEnabled(const bool enabled) + { + SetRegistry(StickySelectSetting, enabled); + } + float ManipulatorLineBoundWidth() { return aznumeric_cast(GetRegistry(ManipulatorLineBoundWidthSetting, 0.1)); diff --git a/Code/Editor/EditorViewportSettings.h b/Code/Editor/EditorViewportSettings.h index 8aeeee1384..20d397a29e 100644 --- a/Code/Editor/EditorViewportSettings.h +++ b/Code/Editor/EditorViewportSettings.h @@ -47,6 +47,9 @@ namespace SandboxEditor SANDBOX_API bool ShowingGrid(); SANDBOX_API void SetShowingGrid(bool showing); + SANDBOX_API bool StickySelectEnabled(); + SANDBOX_API void SetStickySelectEnabled(bool enabled); + SANDBOX_API float ManipulatorLineBoundWidth(); SANDBOX_API void SetManipulatorLineBoundWidth(float lineBoundWidth); diff --git a/Code/Editor/EditorViewportWidget.cpp b/Code/Editor/EditorViewportWidget.cpp index f009fe7602..1ed901e514 100644 --- a/Code/Editor/EditorViewportWidget.cpp +++ b/Code/Editor/EditorViewportWidget.cpp @@ -2522,6 +2522,11 @@ float EditorViewportSettings::ManipulatorCircleBoundWidth() const return SandboxEditor::ManipulatorCircleBoundWidth(); } +bool EditorViewportSettings::StickySelectEnabled() const +{ + return SandboxEditor::StickySelectEnabled(); +} + AZ_CVAR_EXTERNED(bool, ed_previewGameInFullscreen_once); bool EditorViewportWidget::ShouldPreviewFullscreen() const diff --git a/Code/Editor/EditorViewportWidget.h b/Code/Editor/EditorViewportWidget.h index c4a8e9fcca..6b46524394 100644 --- a/Code/Editor/EditorViewportWidget.h +++ b/Code/Editor/EditorViewportWidget.h @@ -77,6 +77,7 @@ struct EditorViewportSettings : public AzToolsFramework::ViewportInteraction::Vi float AngleStep() const override; float ManipulatorLineBoundWidth() const override; float ManipulatorCircleBoundWidth() const override; + bool StickySelectEnabled() const override; }; // EditorViewportWidget window diff --git a/Code/Editor/ViewportTitleDlg.cpp b/Code/Editor/ViewportTitleDlg.cpp index 1f04f71712..65d6de8944 100644 --- a/Code/Editor/ViewportTitleDlg.cpp +++ b/Code/Editor/ViewportTitleDlg.cpp @@ -154,6 +154,8 @@ void CViewportTitleDlg::SetupCameraDropdownMenu() cameraMenu->addMenu(GetFovMenu()); m_ui->m_cameraMenu->setMenu(cameraMenu); m_ui->m_cameraMenu->setPopupMode(QToolButton::InstantPopup); + QObject::connect(cameraMenu, &QMenu::aboutToShow, this, &CViewportTitleDlg::CheckForCameraSpeedUpdate); + QAction* gotoPositionAction = new QAction("Go to position", cameraMenu); connect(gotoPositionAction, &QAction::triggered, this, &CViewportTitleDlg::OnBnClickedGotoPosition); cameraMenu->addAction(gotoPositionAction); diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h index 6bd72f5101..06db67a05f 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ActionDispatcher.h @@ -15,19 +15,19 @@ namespace AzManipulatorTestFramework { - //! Base class for derived immediate and retained action dispatchers. + //! Base class for derived immediate action dispatchers. template class ActionDispatcher { public: virtual ~ActionDispatcher() = default; - //! Enable grid snapping. - DerivedDispatcherT* EnableSnapToGrid(); - //! Disable grid snapping. - DerivedDispatcherT* DisableSnapToGrid(); + //! Enable/disable grid snapping. + DerivedDispatcherT* SetSnapToGrid(bool enabled); //! Set the grid size. DerivedDispatcherT* GridSize(float size); + //! Enable/disable sticky select. + DerivedDispatcherT* SetStickySelect(bool enabled); //! Enable/disable action logging. DerivedDispatcherT* LogActions(bool logging); //! Output a trace debug message. @@ -66,9 +66,9 @@ namespace AzManipulatorTestFramework DerivedDispatcherT* EnterComponentMode(); protected: - // Actions to be implemented by derived immediate and retained action dispatchers. - virtual void EnableSnapToGridImpl() = 0; - virtual void DisableSnapToGridImpl() = 0; + // Actions to be implemented by derived immediate action dispatcher. + virtual void SetSnapToGridImpl(bool enabled) = 0; + virtual void SetStickySelectImpl(bool enabled) = 0; virtual void GridSizeImpl(float size) = 0; virtual void CameraStateImpl(const AzFramework::CameraState& cameraState) = 0; virtual void MouseLButtonDownImpl() = 0; @@ -127,18 +127,18 @@ namespace AzManipulatorTestFramework } template - DerivedDispatcherT* ActionDispatcher::EnableSnapToGrid() + DerivedDispatcherT* ActionDispatcher::SetSnapToGrid(const bool enabled) { - Log("Enabling SnapToGrid"); - EnableSnapToGridImpl(); + Log("SnapToGrid %s", enabled ? "on" : "off"); + SetSnapToGridImpl(enabled); return static_cast(this); } template - DerivedDispatcherT* ActionDispatcher::DisableSnapToGrid() + DerivedDispatcherT* ActionDispatcher::SetStickySelect(bool enabled) { - Log("Disabling SnapToGrid"); - DisableSnapToGridImpl(); + Log("StickySelect %s", enabled ? "on" : "off"); + SetStickySelectImpl(enabled); return static_cast(this); } diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h index 7f838b0073..a911534dd9 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/AzManipulatorTestFramework.h @@ -16,7 +16,7 @@ namespace AzFramework { class DebugDisplayRequests; struct CameraState; -} +} // namespace AzFramework namespace AzManipulatorTestFramework { @@ -31,14 +31,10 @@ namespace AzManipulatorTestFramework virtual void SetCameraState(const AzFramework::CameraState& cameraState) = 0; //! Retrieve the debug display. virtual AzFramework::DebugDisplayRequests& GetDebugDisplay() = 0; - //! Enable grid snapping. - virtual void EnableGridSnaping() = 0; - //! Disable grid snapping. - virtual void DisableGridSnaping() = 0; - //! Enable grid snapping. - virtual void EnableAngularSnaping() = 0; - //! Disable grid snapping. - virtual void DisableAngularSnaping() = 0; + //! Set if grid snapping is enabled or not. + virtual void SetGridSnapping(bool enabled) = 0; + //! Set if angular snapping is enabled or not. + virtual void SetAngularSnapping(bool enabled) = 0; //! Set the grid size. virtual void SetGridSize(float size) = 0; //! Set the angular step. @@ -48,6 +44,8 @@ namespace AzManipulatorTestFramework //! Updates the visibility state. //! Updates which entities are currently visible given the current camera state. virtual void UpdateVisibility() = 0; + //! Set if sticky select is enabled or not. + virtual void SetStickySelect(bool enabled) = 0; }; //! This interface is used to simulate the manipulator manager while the manipulators are under test. @@ -82,15 +80,15 @@ namespace AzManipulatorTestFramework //! Return the representation of the viewport interaction model. ViewportInteractionInterface& GetViewportInteraction() { - return const_cast< - ViewportInteractionInterface&>(const_cast(this)->GetViewportInteraction()); + return const_cast( + const_cast(this)->GetViewportInteraction()); } //! Return the const representation of the manipulator manager. ManipulatorManagerInterface& GetManipulatorManager() { - return const_cast< - ManipulatorManagerInterface&>(const_cast(this)->GetManipulatorManager()); + return const_cast( + const_cast(this)->GetManipulatorManager()); } }; } // namespace AzManipulatorTestFramework diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h index 9e11a7543c..7eddd8b915 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ImmediateModeActionDispatcher.h @@ -52,8 +52,8 @@ namespace AzManipulatorTestFramework protected: // ActionDispatcher ... - void EnableSnapToGridImpl() override; - void DisableSnapToGridImpl() override; + void SetSnapToGridImpl(bool enabled) override; + void SetStickySelectImpl(bool enabled) override; void GridSizeImpl(float size) override; void CameraStateImpl(const AzFramework::CameraState& cameraState) override; void MouseLButtonDownImpl() override; diff --git a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h index 1bc329d404..cfecc0c91a 100644 --- a/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h +++ b/Code/Framework/AzManipulatorTestFramework/Include/AzManipulatorTestFramework/ViewportInteraction.h @@ -29,14 +29,13 @@ namespace AzManipulatorTestFramework // ViewportInteractionInterface overrides ... void SetCameraState(const AzFramework::CameraState& cameraState) override; AzFramework::DebugDisplayRequests& GetDebugDisplay() override; - void EnableGridSnaping() override; - void DisableGridSnaping() override; - void EnableAngularSnaping() override; - void DisableAngularSnaping() override; + void SetGridSnapping(bool enabled) override; + void SetAngularSnapping(bool enabled) override; void SetGridSize(float size) override; void SetAngularStep(float step) override; int GetViewportId() const override; void UpdateVisibility() override; + void SetStickySelect(bool enabled) override; // ViewportInteractionRequestBus overrides ... AzFramework::CameraState GetCameraState() override; @@ -54,6 +53,7 @@ namespace AzManipulatorTestFramework float AngleStep() const override; float ManipulatorLineBoundWidth() const override; float ManipulatorCircleBoundWidth() const override; + bool StickySelectEnabled() const override; // EditorEntityViewportInteractionRequestBus overrides ... void FindVisibleEntities(AZStd::vector& visibleEntities) override; @@ -65,6 +65,7 @@ namespace AzManipulatorTestFramework AzFramework::CameraState m_cameraState; bool m_gridSnapping = false; bool m_angularSnapping = false; + bool m_stickySelect = true; float m_gridSize = 1.0f; float m_angularStep = 0.0f; }; diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp index 23cc2a21f5..08db7497f4 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ImmediateModeActionDispatcher.cpp @@ -49,17 +49,17 @@ namespace AzManipulatorTestFramework m_viewportManipulatorInteraction.GetManipulatorManager().ConsumeMouseInteractionEvent(*m_event); } - void ImmediateModeActionDispatcher::EnableSnapToGridImpl() + void ImmediateModeActionDispatcher::SetSnapToGridImpl(const bool enabled) { - m_viewportManipulatorInteraction.GetViewportInteraction().EnableGridSnaping(); + m_viewportManipulatorInteraction.GetViewportInteraction().SetGridSnapping(enabled); } - void ImmediateModeActionDispatcher::DisableSnapToGridImpl() + void ImmediateModeActionDispatcher::SetStickySelectImpl(const bool enabled) { - m_viewportManipulatorInteraction.GetViewportInteraction().DisableGridSnaping(); + m_viewportManipulatorInteraction.GetViewportInteraction().SetStickySelect(enabled); } - void ImmediateModeActionDispatcher::GridSizeImpl(float size) + void ImmediateModeActionDispatcher::GridSizeImpl(const float size) { m_viewportManipulatorInteraction.GetViewportInteraction().SetGridSize(size); } diff --git a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp index 4dae4fc00d..509674e5c0 100644 --- a/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Source/ViewportInteraction.cpp @@ -6,16 +6,15 @@ * */ -#include -#include #include +#include +#include #include namespace AzManipulatorTestFramework { // Null debug display for dummy draw calls - class NullDebugDisplayRequests - : public AzFramework::DebugDisplayRequests + class NullDebugDisplayRequests : public AzFramework::DebugDisplayRequests { public: virtual ~NullDebugDisplayRequests() = default; @@ -76,6 +75,11 @@ namespace AzManipulatorTestFramework return 0.1f; } + bool ViewportInteraction::StickySelectEnabled() const + { + return m_stickySelect; + } + void ViewportInteraction::FindVisibleEntities(AZStd::vector& visibleEntitiesOut) { visibleEntitiesOut.assign(m_entityVisibilityQuery.Begin(), m_entityVisibilityQuery.End()); @@ -101,24 +105,19 @@ namespace AzManipulatorTestFramework return *m_nullDebugDisplayRequests; } - void ViewportInteraction::EnableGridSnaping() + void ViewportInteraction::SetGridSnapping(const bool enabled) { - m_gridSnapping = true; + m_gridSnapping = enabled; } - void ViewportInteraction::DisableGridSnaping() + void ViewportInteraction::SetAngularSnapping(const bool enabled) { - m_gridSnapping = false; + m_angularSnapping = enabled; } - void ViewportInteraction::EnableAngularSnaping() + void ViewportInteraction::SetStickySelect(const bool enabled) { - m_angularSnapping = true; - } - - void ViewportInteraction::DisableAngularSnaping() - { - m_angularSnapping = false; + m_stickySelect = enabled; } void ViewportInteraction::SetGridSize(float size) @@ -152,4 +151,4 @@ namespace AzManipulatorTestFramework { return 1.0f; } -}// namespace AzManipulatorTestFramework +} // namespace AzManipulatorTestFramework diff --git a/Code/Framework/AzManipulatorTestFramework/Tests/GridSnappingTest.cpp b/Code/Framework/AzManipulatorTestFramework/Tests/GridSnappingTest.cpp index 12b2a6546c..4af66edc0a 100644 --- a/Code/Framework/AzManipulatorTestFramework/Tests/GridSnappingTest.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Tests/GridSnappingTest.cpp @@ -76,7 +76,7 @@ namespace UnitTest linearManipulator->SetLocalPosition(action.LocalPosition()); }); - m_actionDispatcher->EnableSnapToGrid() + m_actionDispatcher->SetSnapToGrid(true) ->GridSize(5.0f) ->CameraState(m_cameraState) ->MousePosition(initialPositionScreen) @@ -114,7 +114,7 @@ namespace UnitTest manipulator->SetLocalPosition(action.LocalPosition()); }); - actionDispatcher->EnableSnapToGrid() + actionDispatcher->SetSnapToGrid(true) ->GridSize(1.0f) ->CameraState(cameraState) ->MousePosition(initialPositionScreen) diff --git a/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp b/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp index f1fba39651..38c3e33977 100644 --- a/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp +++ b/Code/Framework/AzManipulatorTestFramework/Tests/ViewportInteractionTest.cpp @@ -48,7 +48,7 @@ namespace UnitTest { bool snapping = false; - m_viewportInteraction->EnableGridSnaping(); + m_viewportInteraction->SetGridSnapping(true); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::GridSnappingEnabled); @@ -60,7 +60,7 @@ namespace UnitTest { bool snapping = true; - m_viewportInteraction->DisableGridSnaping(); + m_viewportInteraction->SetGridSnapping(false); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::GridSnappingEnabled); @@ -75,7 +75,7 @@ namespace UnitTest m_viewportInteraction->SetGridSize(expectedGridSize); - m_viewportInteraction->DisableGridSnaping(); + m_viewportInteraction->SetGridSnapping(false); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( gridSize, m_viewportInteraction->GetViewportId(), &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::GridSize); @@ -87,7 +87,7 @@ namespace UnitTest { bool snapping = false; - m_viewportInteraction->EnableAngularSnaping(); + m_viewportInteraction->SetAngularSnapping(true); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::AngleSnappingEnabled); @@ -99,7 +99,7 @@ namespace UnitTest { bool snapping = true; - m_viewportInteraction->DisableAngularSnaping(); + m_viewportInteraction->SetAngularSnapping(false); AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::EventResult( snapping, m_viewportInteraction->GetViewportId(), &AzToolsFramework::ViewportInteraction::ViewportSettingsRequestBus::Events::AngleSnappingEnabled); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h index 8bddeb7a44..c9438e640d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Viewport/ViewportMessages.h @@ -196,6 +196,8 @@ namespace AzToolsFramework virtual float ManipulatorLineBoundWidth() const = 0; //! Returns the current circle (torus) bound width for manipulators. virtual float ManipulatorCircleBoundWidth() const = 0; + //! Returns if sticky select is enabled or not. + virtual bool StickySelectEnabled() const = 0; protected: ~ViewportSettingsRequests() = default; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp index 064fbb9da6..5820eaafe1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.cpp @@ -77,13 +77,6 @@ namespace AzToolsFramework nullptr, AZ::ConsoleFunctorFlags::Null, "The screen position of the gizmo in normalized (0-1) ndc space"); - AZ_CVAR( - bool, - ed_viewportStickySelect, - true, - nullptr, - AZ::ConsoleFunctorFlags::Null, - "Sticky select implies a single click will not change selection with an entity already selected"); // strings related to new viewport interaction model (EditorTransformComponentSelection) static const char* const TogglePivotTitleRightClick = "Toggle pivot"; @@ -1790,7 +1783,8 @@ namespace AzToolsFramework CheckDirtyEntityIds(); - const AzFramework::CameraState cameraState = GetCameraState(mouseInteraction.m_mouseInteraction.m_interactionId.m_viewportId); + const AzFramework::ViewportId viewportId = mouseInteraction.m_mouseInteraction.m_interactionId.m_viewportId; + const AzFramework::CameraState cameraState = GetCameraState(viewportId); m_cachedEntityIdUnderCursor = m_editorHelpers->HandleMouseInteraction(cameraState, mouseInteraction); @@ -1835,7 +1829,11 @@ namespace AzToolsFramework return true; } - if (ed_viewportStickySelect) + bool stickySelect = false; + ViewportInteraction::ViewportSettingsRequestBus::EventResult( + stickySelect, viewportId, &ViewportInteraction::ViewportSettingsRequestBus::Events::StickySelectEnabled); + + if (stickySelect) { // double click to deselect all if (Input::DeselectAll(mouseInteraction)) @@ -1891,7 +1889,7 @@ namespace AzToolsFramework return false; } - if (ed_viewportStickySelect) + if (stickySelect) { return false; } @@ -1900,7 +1898,7 @@ namespace AzToolsFramework // standard toggle selection if (Input::IndividualSelect(clickOutcome)) { - if (!ed_viewportStickySelect) + if (!stickySelect) { ChangeSelectedEntity(entityIdUnderCursor); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h index 478c0b775e..935e80951a 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/ViewportSelection/EditorTransformComponentSelection.h @@ -33,8 +33,6 @@ namespace AzToolsFramework { - AZ_CVAR_EXTERNED(bool, ed_viewportStickySelect); - class EditorVisibleEntityDataCache; using EntityIdSet = AZStd::unordered_set; //!< Alias for unordered_set of EntityIds. diff --git a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp index 72cafe5cd5..c94e174108 100644 --- a/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/EditorTransformComponentSelectionTests.cpp @@ -616,8 +616,6 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickySingleClickWithNoSelectionWillSelectEntity) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -629,7 +627,11 @@ namespace UnitTest const auto entity1ScreenPosition = AzFramework::WorldToScreen(m_entity1WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity1ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) + ->MousePosition(entity1ScreenPosition) + ->MouseLButtonDown() + ->MouseLButtonUp(); // entity is selected auto selectedEntitiesAfter = SelectedEntities(); @@ -639,8 +641,6 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickySingleClickWithNoSelectionWillSelectEntity) { - AzToolsFramework::ed_viewportStickySelect = false; - PositionEntities(); PositionCamera(m_cameraState); @@ -652,7 +652,11 @@ namespace UnitTest const auto entity1ScreenPosition = AzFramework::WorldToScreen(m_entity1WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity1ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(false) + ->CameraState(m_cameraState) + ->MousePosition(entity1ScreenPosition) + ->MouseLButtonDown() + ->MouseLButtonUp(); // entity is selected auto selectedEntitiesAfter = SelectedEntities(); @@ -664,8 +668,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickySingleClickOffEntityWithSelectionWillNotDeselectEntity) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -678,7 +680,11 @@ namespace UnitTest const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); // click the empty space in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(clickOffPositionScreen)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) + ->MousePosition(clickOffPositionScreen) + ->MouseLButtonDown() + ->MouseLButtonUp(); // entity was not deselected using ::testing::Eq; @@ -690,8 +696,6 @@ namespace UnitTest TEST_F( EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickySingleClickOffEntityWithSelectionWillDeselectEntity) { - AzToolsFramework::ed_viewportStickySelect = false; - PositionEntities(); PositionCamera(m_cameraState); @@ -703,7 +707,11 @@ namespace UnitTest const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); // click the empty space in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(clickOffPositionScreen)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(false) + ->CameraState(m_cameraState) + ->MousePosition(clickOffPositionScreen) + ->MouseLButtonDown() + ->MouseLButtonUp(); // entity was deselected auto selectedEntitiesAfter = SelectedEntities(); @@ -714,8 +722,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickySingleClickOnNewEntityWithSelectionWillNotChangeSelectedEntity) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -725,7 +731,11 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity2ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) + ->MousePosition(entity2ScreenPosition) + ->MouseLButtonDown() + ->MouseLButtonUp(); // entity selection was not changed using ::testing::Eq; @@ -738,8 +748,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickySingleClickOnNewEntityWithSelectionWillChangeSelectedEntity) { - AzToolsFramework::ed_viewportStickySelect = false; - PositionEntities(); PositionCamera(m_cameraState); @@ -749,7 +757,11 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity2ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(false) + ->CameraState(m_cameraState) + ->MousePosition(entity2ScreenPosition) + ->MouseLButtonDown() + ->MouseLButtonUp(); // entity selection was changed using ::testing::Eq; @@ -762,8 +774,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickyCtrlSingleClickOnNewEntityWithSelectionWillAppendSelectedEntityToSelection) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -773,7 +783,7 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(true)->CameraState(m_cameraState) ->MousePosition(entity2ScreenPosition) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() @@ -789,8 +799,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickyCtrlSingleClickOnNewEntityWithSelectionWillAppendSelectedEntityToSelection) { - AzToolsFramework::ed_viewportStickySelect = false; - PositionEntities(); PositionCamera(m_cameraState); @@ -800,7 +808,8 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(false) + ->CameraState(m_cameraState) ->MousePosition(entity2ScreenPosition) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() @@ -816,8 +825,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickyCtrlSingleClickOnEntityInSelectionWillRemoveEntityFromSelection) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -827,7 +834,8 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) ->MousePosition(entity2ScreenPosition) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() @@ -843,8 +851,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickyCtrlSingleClickOnEntityInSelectionWillRemoveEntityFromSelection) { - AzToolsFramework::ed_viewportStickySelect = false; - PositionEntities(); PositionCamera(m_cameraState); @@ -854,7 +860,8 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // click the entity in the viewport - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(false) + ->CameraState(m_cameraState) ->MousePosition(entity2ScreenPosition) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() @@ -868,8 +875,6 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectWithNoInitialSelectionAddsEntitiesToSelection) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -882,7 +887,8 @@ namespace UnitTest const auto endingPositionWorldBoxSelect = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); // perform a box select in the viewport - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) ->MousePosition(beginningPositionWorldBoxSelect) ->MouseLButtonDown() ->MousePosition(endingPositionWorldBoxSelect) @@ -896,8 +902,6 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectWithSelectionAppendsEntitiesToSelection) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -914,7 +918,8 @@ namespace UnitTest const auto endingPositionWorldBoxSelect2 = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); // perform a box select in the viewport (going left and right) - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) ->MousePosition(beginningPositionWorldBoxSelect1) ->MouseLButtonDown() ->MousePosition(endingPositionWorldBoxSelect1) @@ -933,8 +938,6 @@ namespace UnitTest EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, BoxSelectHoldingCtrlWithSelectionRemovesEntitiesFromSelection) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -949,7 +952,8 @@ namespace UnitTest const auto endingPositionWorldBoxSelect = AzFramework::WorldToScreen(AZ::Vector3(5.0f, 16.5f, 9.5f), m_cameraState); // perform a box select in the viewport - m_actionDispatcher->CameraState(m_cameraState) + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) ->MousePosition(beginningPositionWorldBoxSelect) ->KeyboardModifierDown(AzToolsFramework::ViewportInteraction::KeyboardModifier::Control) ->MouseLButtonDown() @@ -963,8 +967,6 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, StickyDoubleClickWithSelectionWillDeselectEntities) { - AzToolsFramework::ed_viewportStickySelect = true; - PositionEntities(); PositionCamera(m_cameraState); @@ -980,7 +982,10 @@ namespace UnitTest const auto clickOffPositionScreen = AzFramework::WorldToScreen(clickOffPositionWorld, m_cameraState); // double click to deselect entities - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(clickOffPositionScreen)->MouseLButtonDoubleClick(); + m_actionDispatcher->SetStickySelect(true) + ->CameraState(m_cameraState) + ->MousePosition(clickOffPositionScreen) + ->MouseLButtonDoubleClick(); // no entities are selected auto selectedEntitiesAfter = SelectedEntities(); @@ -989,8 +994,6 @@ namespace UnitTest TEST_F(EditorTransformComponentSelectionViewportPickingManipulatorTestFixture, UnstickyUndoOperationForChangeInSelectionIsAtomic) { - AzToolsFramework::ed_viewportStickySelect = false; - PositionEntities(); PositionCamera(m_cameraState); @@ -1000,7 +1003,11 @@ namespace UnitTest const auto entity2ScreenPosition = AzFramework::WorldToScreen(m_entity2WorldTranslation, m_cameraState); // single click select entity2 - m_actionDispatcher->CameraState(m_cameraState)->MousePosition(entity2ScreenPosition)->MouseLButtonDown()->MouseLButtonUp(); + m_actionDispatcher->SetStickySelect(false) + ->CameraState(m_cameraState) + ->MousePosition(entity2ScreenPosition) + ->MouseLButtonDown() + ->MouseLButtonUp(); // undo action AzToolsFramework::ToolsApplicationRequestBus::Broadcast(&AzToolsFramework::ToolsApplicationRequestBus::Events::UndoPressed); From 7c3f59ba5e99948886c79e3e3234ff812546ea2d Mon Sep 17 00:00:00 2001 From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com> Date: Thu, 16 Sep 2021 12:41:24 +0200 Subject: [PATCH 335/355] EMotion FX: Resetting the Motion extraction joint when the Anim Graph is active crashes the Editor (#4138) Wrong invalid index type caused the crash. Selecting another joint was broken as well and got fixed directly, too. The selection done event was never received due to not being connected to the node hierarchy widget. Resolves #4108 Signed-off-by: Benjamin Jillich --- Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp | 2 +- Gems/EMotionFX/Code/Source/Editor/ActorJointBrowseEdit.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp index 94a56cc0d5..3e592113b1 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Actor.cpp @@ -1245,7 +1245,7 @@ namespace EMotionFX } else { - SetMotionExtractionNodeIndex(MCORE_INVALIDINDEX32); + SetMotionExtractionNodeIndex(InvalidIndex); } } diff --git a/Gems/EMotionFX/Code/Source/Editor/ActorJointBrowseEdit.cpp b/Gems/EMotionFX/Code/Source/Editor/ActorJointBrowseEdit.cpp index 41253a513e..b1f8733bfe 100644 --- a/Gems/EMotionFX/Code/Source/Editor/ActorJointBrowseEdit.cpp +++ b/Gems/EMotionFX/Code/Source/Editor/ActorJointBrowseEdit.cpp @@ -66,6 +66,7 @@ namespace EMStudio m_jointSelectionWindow = new NodeSelectionWindow(this, m_singleJointSelection); connect(m_jointSelectionWindow, &NodeSelectionWindow::rejected, this, &ActorJointBrowseEdit::OnSelectionRejected); connect(m_jointSelectionWindow->GetNodeHierarchyWidget()->GetTreeWidget(), &QTreeWidget::itemSelectionChanged, this, &ActorJointBrowseEdit::OnSelectionChanged); + connect(m_jointSelectionWindow->GetNodeHierarchyWidget(), &NodeHierarchyWidget::OnSelectionDone, this, &ActorJointBrowseEdit::OnSelectionDone); NodeSelectionWindow::connect(m_jointSelectionWindow, &QDialog::finished, [=]([[maybe_unused]] int resultCode) { From 33b86b567b65085e9b07049a1f156f43412a525f Mon Sep 17 00:00:00 2001 From: Chris Burel Date: Wed, 15 Sep 2021 16:40:29 -0700 Subject: [PATCH 336/355] Allow for `AZCoreLogSink::Disconnect()` to be called more than once Signed-off-by: Chris Burel --- Code/Legacy/CrySystem/AZCoreLogSink.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Legacy/CrySystem/AZCoreLogSink.h b/Code/Legacy/CrySystem/AZCoreLogSink.h index a54a78157c..8c88752e9a 100644 --- a/Code/Legacy/CrySystem/AZCoreLogSink.h +++ b/Code/Legacy/CrySystem/AZCoreLogSink.h @@ -46,6 +46,7 @@ public: { GetInstance().BusDisconnect(); delete GetInstance().m_ignoredAsserts; + GetInstance().m_ignoredAsserts = nullptr; } static AZCoreLogSink& GetInstance() From b95e170f9e394d15787b8ee4205fd44302ed8841 Mon Sep 17 00:00:00 2001 From: jckand-amzn <82226555+jckand-amzn@users.noreply.github.com> Date: Thu, 16 Sep 2021 10:53:38 -0500 Subject: [PATCH 337/355] Marking DistanceBetweenFilter tests with xfail due to Editor deadlock (#4156) * Marking DistanceBetweenFilter tests with xfail due to Editor deadlock Signed-off-by: jckand-amzn * Updating xfail mark Signed-off-by: jckand-amzn --- .../largeworlds/dyn_veg/test_DistanceBetweenFilter.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py index 6d1b688315..d525e4a599 100755 --- a/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py +++ b/AutomatedTesting/Gem/PythonTests/largeworlds/dyn_veg/test_DistanceBetweenFilter.py @@ -35,6 +35,7 @@ class TestDistanceBetweenFilter(object): @pytest.mark.test_case_id("C4851066") @pytest.mark.SUITE_periodic @pytest.mark.dynveg_filter + @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4155") def test_DistanceBetweenFilter_InstancesPlantAtSpecifiedRadius(self, request, editor, level, launcher_platform): expected_lines = [ @@ -56,6 +57,7 @@ class TestDistanceBetweenFilter(object): @pytest.mark.test_case_id("C4814458") @pytest.mark.SUITE_periodic @pytest.mark.dynveg_filter + @pytest.mark.xfail(reason="https://github.com/o3de/o3de/issues/4155") def test_DistanceBetweenFilterOverrides_InstancesPlantAtSpecifiedRadius(self, request, editor, level, launcher_platform): From 447832dd81c74eab4927d1f595b029593ea59a0e Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Thu, 16 Sep 2021 11:01:00 -0500 Subject: [PATCH 338/355] Updated the GameApplication to mount the engine.pak (#4128) * Updated the GameApplication to mount the engine.pak This allows loading the autoexec.cfg and bootstrap.game...setreg from the engine.pak files The engine.pak is searched for in the following order: /engine.pak, followed by /engine.pak Removed a lot of unused APIs from the AZ::IO::Archive feature suite Updated many of the AZ::IO::Archive classes to use AZ::IO::Path internally. The logic to search for files within an Archive has been updated to use AZ::IO::Path and to remove case-insensitve string comparisons Somehow removed the CryFile dependency on anything Cry Updated the Settings Registry to support reading from the FileIOBase and therefore Archive files in the GameLauncher via the `SetUseFileIO` function Removed AzFramework Dependency on md5 3rdParty library Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Linux build fix Added an include of before the include as it usesnprintf. Added `static` to the constexpr constants in ExtractFileDescription in SettingsRegistryImpl.cpp to fix clang compile issue Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the case used to mount the Engine PAK file in the GameApplication to be Engine.pak to match the other locations where it is mounted Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the proper FFont call to FileIOBase::Size to supply the correct integer type of AZ::u64 instead of size_t This fixes building on platforms where size_t is type defined to be unsigned long Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed segmentation fault in Archive::Unregister when outputing the filename of the Archive file being closed Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fix calls to OpenPack in the Legacy LevelSystem The LevelSystem was calling the incorrect overload of OpenPack that accepts BindRoot for the mounted level.pak instead of the overload that that passes a memory block object. This was causing the level pak files to be mounted using an invalid directory, causing file accesses inside the level pak to fail. Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the error messages in the ZipDir CacheFactory class to use AZ_Warning directly Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Updated the ArchiveFileIO m_trackedFiles container to store mapped type as an AZ::IO::Path Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- Code/Editor/CryEditDoc.cpp | 8 +- Code/Editor/GameExporter.cpp | 19 - .../PerforcePlugin/PerforceSourceControl.cpp | 1 + Code/Editor/PythonEditorEventsBus.h | 3 +- Code/Editor/PythonEditorFuncs.cpp | 9 +- Code/Editor/PythonEditorFuncs.h | 2 +- Code/Editor/Settings.cpp | 3 +- Code/Editor/Settings.h | 2 - Code/Editor/Util/FileUtil.cpp | 29 +- Code/Editor/Util/XmlArchive.cpp | 2 +- .../AzCore/AzCore/Settings/SettingsRegistry.h | 5 + .../AzCore/Settings/SettingsRegistryImpl.cpp | 274 ++++-- .../AzCore/Settings/SettingsRegistryImpl.h | 10 +- .../UnitTest/Mocks/MockSettingsRegistry.h | 1 + Code/Framework/AzCore/AzCore/XML/rapidxml.h | 1 + .../AzFramework/Application/Application.cpp | 65 -- .../AzFramework/Archive/Archive.cpp | 899 ++++-------------- .../AzFramework/AzFramework/Archive/Archive.h | 102 +- .../AzFramework/Archive/ArchiveFileIO.cpp | 42 +- .../AzFramework/Archive/ArchiveFileIO.h | 3 +- .../AzFramework/Archive/ArchiveFindData.cpp | 141 ++- .../AzFramework/Archive/ArchiveFindData.h | 56 +- .../AzFramework/Archive/IArchive.h | 180 +--- .../AzFramework/Archive/INestedArchive.h | 26 +- .../AzFramework/Archive/NestedArchive.cpp | 30 +- .../AzFramework/Archive/NestedArchive.h | 10 +- .../AzFramework/Archive/ZipDirCache.cpp | 70 +- .../AzFramework/Archive/ZipDirCache.h | 12 +- .../Archive/ZipDirCacheFactory.cpp | 95 +- .../AzFramework/Archive/ZipDirCacheFactory.h | 9 +- .../AzFramework/Archive/ZipDirFind.cpp | 85 +- .../AzFramework/Archive/ZipDirFind.h | 15 +- .../AzFramework/Archive/ZipDirList.cpp | 4 +- .../AzFramework/Archive/ZipDirStructures.cpp | 25 +- .../AzFramework/Archive/ZipDirStructures.h | 4 - .../AzFramework/Archive/ZipDirTree.cpp | 57 +- .../AzFramework/Archive/ZipDirTree.h | 29 +- .../AzFramework/IO/LocalFileIO.cpp | 2 +- Code/Framework/AzFramework/CMakeLists.txt | 1 - .../Tests/ArchiveCompressionTests.cpp | 2 +- .../AzFramework/Tests/ArchiveTests.cpp | 256 +---- .../Application/GameApplication.cpp | 32 +- Code/Legacy/CryCommon/CryFile.h | 124 +-- Code/Legacy/CryCommon/CryPath.h | 1 + Code/Legacy/CryCommon/Mocks/ICryPakMock.h | 49 +- Code/Legacy/CrySystem/ConsoleBatchFile.cpp | 6 +- .../CrySystem/LevelSystem/LevelSystem.cpp | 16 +- Code/Legacy/CrySystem/SystemCFG.cpp | 18 +- Code/Legacy/CrySystem/SystemInit.cpp | 26 +- .../CrySystem/WindowsErrorReporting.cpp | 9 +- Code/Legacy/CrySystem/XConsoleVariable.h | 4 +- Code/Legacy/CrySystem/XML/XmlUtils.cpp | 2 +- Code/Legacy/CrySystem/XML/xml.cpp | 25 +- .../SettingsRegistryBuilder.cpp | 43 +- .../AtomLyIntegration/AtomFont/FFont.h | 2 +- .../AtomFont/Code/Source/FFont.cpp | 43 +- .../CommonFeatures/Code/CMakeLists.txt | 1 + 57 files changed, 992 insertions(+), 1998 deletions(-) diff --git a/Code/Editor/CryEditDoc.cpp b/Code/Editor/CryEditDoc.cpp index a61429fc87..07d946c609 100644 --- a/Code/Editor/CryEditDoc.cpp +++ b/Code/Editor/CryEditDoc.cpp @@ -1135,7 +1135,6 @@ bool CCryEditDoc::SaveLevel(const QString& filename) { // if we're saving to a new folder, we need to copy the old folder tree. auto pIPak = GetIEditor()->GetSystem()->GetIPak(); - pIPak->Lock(); const QString oldLevelPattern = QDir(oldLevelFolder).absoluteFilePath("*.*"); const QString oldLevelName = Path::GetFile(GetLevelPathName()); @@ -1199,7 +1198,6 @@ bool CCryEditDoc::SaveLevel(const QString& filename) QFile(filePath).setPermissions(QFile::ReadOther | QFile::WriteOther); }); - pIPak->Unlock(); } // Save level to XML archive. @@ -1813,8 +1811,8 @@ bool CCryEditDoc::BackupBeforeSave(bool force) QString subFolder = theTime.toString("yyyy-MM-dd [HH.mm.ss]"); QString levelName = GetIEditor()->GetGameEngine()->GetLevelName(); - QString backupPath = saveBackupPath + "/" + subFolder + "/"; - gEnv->pCryPak->MakeDir(backupPath.toUtf8().data()); + QString backupPath = saveBackupPath + "/" + subFolder; + AZ::IO::FileIOBase::GetDirectInstance()->CreatePath(backupPath.toUtf8().data()); QString sourcePath = QString::fromUtf8(resolvedLevelPath) + "/"; @@ -2028,7 +2026,7 @@ const char* CCryEditDoc::GetTemporaryLevelName() const void CCryEditDoc::DeleteTemporaryLevel() { QString tempLevelPath = (Path::GetEditingGameDataFolder() + "/Levels/" + GetTemporaryLevelName()).c_str(); - GetIEditor()->GetSystem()->GetIPak()->ClosePacks(tempLevelPath.toUtf8().data(), AZ::IO::IArchive::EPathResolutionRules::FLAGS_ADD_TRAILING_SLASH); + GetIEditor()->GetSystem()->GetIPak()->ClosePacks(tempLevelPath.toUtf8().data()); CFileUtil::Deltree(tempLevelPath.toUtf8().data(), true); } diff --git a/Code/Editor/GameExporter.cpp b/Code/Editor/GameExporter.cpp index 00dc3d8de1..9315505e08 100644 --- a/Code/Editor/GameExporter.cpp +++ b/Code/Editor/GameExporter.cpp @@ -432,25 +432,6 @@ void CGameExporter::ExportFileList(const QString& path, const QString& levelName newFileNode->setAttr("src", handle.m_filename.data()); newFileNode->setAttr("dest", handle.m_filename.data()); newFileNode->setAttr("size", handle.m_fileDesc.nSize); - - unsigned char md5[16]; - AZStd::string filenameToHash = GetIEditor()->GetGameEngine()->GetLevelPath().toUtf8().data(); - filenameToHash += "/"; - filenameToHash += AZStd::string{ handle.m_filename.data(), handle.m_filename.size() }; - if (gEnv->pCryPak->ComputeMD5(filenameToHash.data(), md5)) - { - char md5string[33]; - sprintf_s(md5string, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - md5[0], md5[1], md5[2], md5[3], - md5[4], md5[5], md5[6], md5[7], - md5[8], md5[9], md5[10], md5[11], - md5[12], md5[13], md5[14], md5[15]); - newFileNode->setAttr("md5", md5string); - } - else - { - newFileNode->setAttr("md5", ""); - } } } } while (handle = gEnv->pCryPak->FindNext(handle)); diff --git a/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.cpp b/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.cpp index 10c43c3d1b..dd9ccaa832 100644 --- a/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.cpp +++ b/Code/Editor/Plugins/PerforcePlugin/PerforceSourceControl.cpp @@ -6,6 +6,7 @@ * */ +#include #include "CryFile.h" #include "PerforceSourceControl.h" #include "PasswordDlg.h" diff --git a/Code/Editor/PythonEditorEventsBus.h b/Code/Editor/PythonEditorEventsBus.h index 5107a1c9cc..ffc357e64d 100644 --- a/Code/Editor/PythonEditorEventsBus.h +++ b/Code/Editor/PythonEditorEventsBus.h @@ -8,6 +8,7 @@ */ #pragma once +#include #include namespace AzToolsFramework @@ -138,7 +139,7 @@ namespace AzToolsFramework /* * Finds a pak file name for a given file. */ - virtual const char* GetPakFromFile(const char* filename) = 0; + virtual AZ::IO::Path GetPakFromFile(const char* filename) = 0; /* * Prints the message to the editor console window. diff --git a/Code/Editor/PythonEditorFuncs.cpp b/Code/Editor/PythonEditorFuncs.cpp index 200fd28f87..455cdfa17d 100644 --- a/Code/Editor/PythonEditorFuncs.cpp +++ b/Code/Editor/PythonEditorFuncs.cpp @@ -625,7 +625,7 @@ namespace } ////////////////////////////////////////////////////////////////////////// - const char* PyGetPakFromFile(const char* filename) + AZ::IO::Path PyGetPakFromFile(const char* filename) { auto pIPak = GetIEditor()->GetSystem()->GetIPak(); AZ::IO::HandleType fileHandle = pIPak->FOpen(filename, "rb"); @@ -633,8 +633,9 @@ namespace { throw std::logic_error("Invalid file name."); } - const char* pArchPath = pIPak->GetFileArchivePath(fileHandle); + AZ::IO::Path pArchPath = pIPak->GetFileArchivePath(fileHandle); pIPak->FClose(fileHandle); + return pArchPath; } @@ -1040,7 +1041,7 @@ namespace AzToolsFramework return PySetAxisConstraint(pConstrain); } - const char* PythonEditorComponent::GetPakFromFile(const char* filename) + AZ::IO::Path PythonEditorComponent::GetPakFromFile(const char* filename) { return PyGetPakFromFile(filename); } @@ -1114,7 +1115,7 @@ namespace AzToolsFramework addLegacyGeneral(behaviorContext->Method("get_axis_constraint", PyGetAxisConstraint, nullptr, "Gets axis.")); addLegacyGeneral(behaviorContext->Method("set_axis_constraint", PySetAxisConstraint, nullptr, "Sets axis.")); - addLegacyGeneral(behaviorContext->Method("get_pak_from_file", PyGetPakFromFile, nullptr, "Finds a pak file name for a given file.")); + addLegacyGeneral(behaviorContext->Method("get_pak_from_file", [](const char* filename) -> AZStd::string { return PyGetPakFromFile(filename).Native(); }, nullptr, "Finds a pak file name for a given file.")); addLegacyGeneral(behaviorContext->Method("log", PyLog, nullptr, "Prints the message to the editor console window.")); diff --git a/Code/Editor/PythonEditorFuncs.h b/Code/Editor/PythonEditorFuncs.h index 97ad8829ba..ef0c1327fa 100644 --- a/Code/Editor/PythonEditorFuncs.h +++ b/Code/Editor/PythonEditorFuncs.h @@ -91,7 +91,7 @@ namespace AzToolsFramework void SetAxisConstraint(AZStd::string_view pConstrain) override; - const char* GetPakFromFile(const char* filename) override; + AZ::IO::Path GetPakFromFile(const char* filename) override; void Log(const char* pMessage) override; diff --git a/Code/Editor/Settings.cpp b/Code/Editor/Settings.cpp index 80d248e1bf..05a6960695 100644 --- a/Code/Editor/Settings.cpp +++ b/Code/Editor/Settings.cpp @@ -171,7 +171,6 @@ SEditorSettings::SEditorSettings() bBackupOnSave = true; backupOnSaveMaxCount = 3; bApplyConfigSpecInEditor = true; - useLowercasePaths = 0; showErrorDialogOnLoad = 1; consoleBackgroundColorTheme = AzToolsFramework::ConsoleColorTheme::Dark; @@ -887,6 +886,7 @@ void SEditorSettings::Load() ////////////////////////////////////////////////////////////////////////// AZ_CVAR(bool, ed_previewGameInFullscreen_once, false, nullptr, AZ::ConsoleFunctorFlags::IsInvisible, "Preview the game (Ctrl+G, \"Play Game\", etc.) in fullscreen once"); +AZ_CVAR(bool, ed_lowercasepaths, false, nullptr, AZ::ConsoleFunctorFlags::Null, "Convert CCryFile paths to lowercase on Open"); void SEditorSettings::PostInitApply() { @@ -898,7 +898,6 @@ void SEditorSettings::PostInitApply() // Create CVars. REGISTER_CVAR2("ed_highlightGeometry", &viewports.bHighlightMouseOverGeometry, viewports.bHighlightMouseOverGeometry, 0, "Highlight geometry when mouse over it"); REGISTER_CVAR2("ed_showFrozenHelpers", &viewports.nShowFrozenHelpers, viewports.nShowFrozenHelpers, 0, "Show helpers of frozen objects"); - REGISTER_CVAR2("ed_lowercasepaths", &useLowercasePaths, useLowercasePaths, 0, "generate paths in lowercase"); gEnv->pConsole->RegisterInt("fe_fbx_savetempfile", 0, 0, "When importing an FBX file into Facial Editor, this will save out a conversion FSQ to the Animations/temp folder for trouble shooting"); REGISTER_CVAR2_CB("ed_toolbarIconSize", &gui.nToolbarIconSize, gui.nToolbarIconSize, VF_NULL, "Override size of the toolbar icons 0-default, 16,32,...", ToolbarIconSizeChanged); diff --git a/Code/Editor/Settings.h b/Code/Editor/Settings.h index a408822129..8bf22b43e5 100644 --- a/Code/Editor/Settings.h +++ b/Code/Editor/Settings.h @@ -340,8 +340,6 @@ AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING //! how many save backups to keep int backupOnSaveMaxCount; - int useLowercasePaths; - ////////////////////////////////////////////////////////////////////////// // Autobackup. ////////////////////////////////////////////////////////////////////////// diff --git a/Code/Editor/Util/FileUtil.cpp b/Code/Editor/Util/FileUtil.cpp index 610a9c6e16..eeb6912acf 100644 --- a/Code/Editor/Util/FileUtil.cpp +++ b/Code/Editor/Util/FileUtil.cpp @@ -149,12 +149,13 @@ bool CFileUtil::ExtractFile(QString& file, bool bMsgBoxAskForExtraction, const c // Check if in pack. if (cryfile.IsInPak()) { - const char* sPakName = cryfile.GetPakPath(); - if (bMsgBoxAskForExtraction) { + AZ::IO::FixedMaxPath sPakName{ cryfile.GetPakPath() }; // Cannot edit file in pack, suggest to extract it for editing. - if (QMessageBox::critical(QApplication::activeWindow(), QString(), QObject::tr("File %1 is inside a PAK file %2\r\nDo you want it to be extracted for editing ?").arg(file, sPakName), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) + if (QMessageBox::critical(QApplication::activeWindow(), QString(), + QObject::tr("File %1 is inside a PAK file %2\r\nDo you want it to be extracted for editing ?").arg(file, sPakName.c_str()), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } @@ -173,10 +174,9 @@ bool CFileUtil::ExtractFile(QString& file, bool bMsgBoxAskForExtraction, const c if (diskFile.open(QFile::WriteOnly)) { // Copy data from packed file to disk file. - char* data = new char[cryfile.GetLength()]; - cryfile.ReadRaw(data, cryfile.GetLength()); - diskFile.write(data, cryfile.GetLength()); - delete []data; + auto data = AZStd::make_unique(cryfile.GetLength()); + cryfile.ReadRaw(data.get(), cryfile.GetLength()); + diskFile.write(data.get(), cryfile.GetLength()); } else { @@ -185,7 +185,14 @@ bool CFileUtil::ExtractFile(QString& file, bool bMsgBoxAskForExtraction, const c } else { - file = cryfile.GetAdjustedFilename(); + + if (auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); fileIoBase != nullptr) + { + if (AZ::IO::FixedMaxPath resolvedFilePath; fileIoBase->ResolvePath(resolvedFilePath, cryfile.GetFilename())) + { + file = QString::fromUtf8(resolvedFilePath.c_str(), static_cast(resolvedFilePath.Native().size())); + } + } } return true; @@ -2157,13 +2164,13 @@ uint32 CFileUtil::GetAttributes(const char* filename, bool bUseSourceControl /*= return SCC_FILE_ATTRIBUTE_READONLY | SCC_FILE_ATTRIBUTE_INPAK; } - const char* adjustedFile = file.GetAdjustedFilename(); - if (!AZ::IO::SystemFile::Exists(adjustedFile)) + auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); + if (!fileIoBase->Exists(file.GetFilename())) { return SCC_FILE_ATTRIBUTE_INVALID; } - if (!AZ::IO::SystemFile::IsWritable(adjustedFile)) + if (fileIoBase->IsReadOnly(file.GetFilename())) { return SCC_FILE_ATTRIBUTE_NORMAL | SCC_FILE_ATTRIBUTE_READONLY; } diff --git a/Code/Editor/Util/XmlArchive.cpp b/Code/Editor/Util/XmlArchive.cpp index e6bc93fdf4..18c3fc8e63 100644 --- a/Code/Editor/Util/XmlArchive.cpp +++ b/Code/Editor/Util/XmlArchive.cpp @@ -124,7 +124,7 @@ bool CXmlArchive::SaveToPak([[maybe_unused]] const QString& levelPath, CPakFile& if (pakFile.GetArchive()) { - CLogFile::FormatLine("Saving pak file %s", (const char*)pakFile.GetArchive()->GetFullPath()); + CLogFile::FormatLine("Saving pak file %.*s", AZ_STRING_ARG(pakFile.GetArchive()->GetFullPath().Native())); } pNamedData->Save(pakFile); diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistry.h b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistry.h index 106e232904..3dc1be87c5 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistry.h +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistry.h @@ -370,6 +370,11 @@ namespace AZ //! @param applyPatchSettings The ApplyPatchSettings which are using during JSON Merging virtual void SetApplyPatchSettings(const AZ::JsonApplyPatchSettings& applyPatchSettings) = 0; virtual void GetApplyPatchSettings(AZ::JsonApplyPatchSettings& applyPatchSettings) = 0; + + //! Stores option to indicate whether the FileIOBase instance should be used for file operations + //! @param useFileIo If true the FileIOBase instance will attempted to be used for FileIOBase + //! operations before falling back to use SystemFile + virtual void SetUseFileIO(bool useFileIo) = 0; }; inline SettingsRegistryInterface::Visitor::~Visitor() = default; diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp index 6864dcd1c8..7ef1fa661d 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.cpp @@ -9,11 +9,14 @@ #include #include #include +#include +#include #include #include #include #include #include +#include #include #include @@ -131,6 +134,12 @@ namespace AZ pointer.Create(m_settings, m_settings.GetAllocator()).SetArray(); } + SettingsRegistryImpl::SettingsRegistryImpl(bool useFileIo) + : SettingsRegistryImpl() + { + m_useFileIo = useFileIo; + } + void SettingsRegistryImpl::SetContext(SerializeContext* context) { AZStd::scoped_lock lock(m_settingMutex); @@ -723,15 +732,10 @@ namespace AZ RegistryFileList fileList; scratchBuffer->clear(); - AZ::IO::FixedMaxPathString folderPath{ path }; - constexpr AZStd::string_view pathSeparators{ AZ_CORRECT_AND_WRONG_DATABASE_SEPARATOR }; - if (pathSeparators.find_first_of(folderPath.back()) == AZStd::string_view::npos) - { - folderPath.push_back(AZ_CORRECT_DATABASE_SEPARATOR); - } + AZ::IO::FixedMaxPath folderPath{ path }; - const size_t platformKeyOffset = folderPath.size(); - folderPath.push_back('*'); + const size_t platformKeyOffset = folderPath.Native().size(); + folderPath /= '*'; Value specialzationArray(kArrayType); size_t specializationCount = specializations.GetCount(); @@ -741,47 +745,13 @@ namespace AZ specialzationArray.PushBack(Value(name.data(), aznumeric_caster(name.length()), m_settings.GetAllocator()), m_settings.GetAllocator()); } pointer.Create(m_settings, m_settings.GetAllocator()).SetObject() - .AddMember(StringRef("Folder"), Value(folderPath.c_str(), aznumeric_caster(folderPath.size()), m_settings.GetAllocator()), m_settings.GetAllocator()) + .AddMember(StringRef("Folder"), Value(folderPath.c_str(), aznumeric_caster(folderPath.Native().size()), m_settings.GetAllocator()), m_settings.GetAllocator()) .AddMember(StringRef("Specializations"), AZStd::move(specialzationArray), m_settings.GetAllocator()); - auto callback = [this, &fileList, &specializations, &pointer, &folderPath](const char* filename, bool isFile) -> bool + + auto CreateSettingsFindCallback = [this, &fileList, &specializations, &pointer, &folderPath](bool isPlatformFile) { - if (isFile) - { - if (fileList.size() >= MaxRegistryFolderEntries) - { - AZ_Error("Settings Registry", false, "Too many files in registry folder."); - AZStd::scoped_lock lock(m_settingMutex); - pointer.Create(m_settings, m_settings.GetAllocator()).SetObject() - .AddMember(StringRef("Error"), StringRef("Too many files in registry folder."), m_settings.GetAllocator()) - .AddMember(StringRef("Path"), Value(folderPath.c_str(), aznumeric_caster(folderPath.size()), m_settings.GetAllocator()), m_settings.GetAllocator()) - .AddMember(StringRef("File"), Value(filename, m_settings.GetAllocator()), m_settings.GetAllocator()); - return false; - } - - fileList.push_back(); - RegistryFile& registryFile = fileList.back(); - if (!ExtractFileDescription(registryFile, filename, specializations)) - { - fileList.pop_back(); - } - } - return true; - }; - SystemFile::FindFiles(folderPath.c_str(), callback); - - - if (!platform.empty()) - { - // Move the folderPath prefix back to the supplied path before the wildcard - folderPath.erase(platformKeyOffset); - folderPath += PlatformFolder; - folderPath.push_back(AZ_CORRECT_DATABASE_SEPARATOR); - folderPath += platform; - folderPath.push_back(AZ_CORRECT_DATABASE_SEPARATOR); - folderPath.push_back('*'); - - auto platformCallback = [this, &fileList, &specializations, &pointer, &folderPath](const char* filename, bool isFile) -> bool + return [this, &fileList, &specializations, &pointer, &folderPath, isPlatformFile](AZStd::string_view filename, bool isFile) -> bool { if (isFile) { @@ -791,8 +761,8 @@ namespace AZ AZStd::scoped_lock lock(m_settingMutex); pointer.Create(m_settings, m_settings.GetAllocator()).SetObject() .AddMember(StringRef("Error"), StringRef("Too many files in registry folder."), m_settings.GetAllocator()) - .AddMember(StringRef("Path"), Value(folderPath.c_str(), aznumeric_caster(folderPath.size()), m_settings.GetAllocator()), m_settings.GetAllocator()) - .AddMember(StringRef("File"), Value(filename, m_settings.GetAllocator()), m_settings.GetAllocator()); + .AddMember(StringRef("Path"), Value(folderPath.c_str(), aznumeric_caster(folderPath.Native().size()), m_settings.GetAllocator()), m_settings.GetAllocator()) + .AddMember(StringRef("File"), Value(filename.data(), aznumeric_caster(filename.size()), m_settings.GetAllocator()), m_settings.GetAllocator()); return false; } @@ -800,7 +770,7 @@ namespace AZ RegistryFile& registryFile = fileList.back(); if (ExtractFileDescription(registryFile, filename, specializations)) { - registryFile.m_isPlatformFile = true; + registryFile.m_isPlatformFile = isPlatformFile; } else { @@ -809,7 +779,42 @@ namespace AZ } return true; }; - SystemFile::FindFiles(folderPath.c_str(), platformCallback); + }; + + struct FindFilesPayload + { + bool m_isPlatformFile{}; + AZStd::fixed_vector m_pathSegmentsToAppend; + }; + + AZStd::fixed_vector findFilesPayloads{ {false} }; + if (!platform.empty()) + { + findFilesPayloads.push_back(FindFilesPayload{ true, { PlatformFolder, platform } }); + } + + for (const FindFilesPayload& findFilesPayload : findFilesPayloads) + { + // Erase back to initial path + folderPath.Native().erase(platformKeyOffset); + for (AZStd::string_view pathSegmentToAppend : findFilesPayload.m_pathSegmentsToAppend) + { + folderPath /= pathSegmentToAppend; + } + + auto findFilesCallback = CreateSettingsFindCallback(findFilesPayload.m_isPlatformFile); + if (AZ::IO::FileIOBase* fileIo = m_useFileIo ? AZ::IO::FileIOBase::GetInstance() : nullptr; fileIo != nullptr) + { + auto FileIoToSystemFileFindFiles = [findFilesCallback = AZStd::move(findFilesCallback), fileIo](const char* filePath) -> bool + { + return findFilesCallback(AZ::IO::PathView(filePath).Filename().Native(), !fileIo->IsDirectory(filePath)); + }; + fileIo->FindFiles(folderPath.c_str(), "*", FileIoToSystemFileFindFiles); + } + else + { + SystemFile::FindFiles((folderPath / "*").c_str(), findFilesCallback); + } } if (!fileList.empty()) @@ -831,16 +836,14 @@ namespace AZ // Load the registry files in the sorted order. for (RegistryFile& registryFile : fileList) { - folderPath.erase(platformKeyOffset); // Erase all characters after the platformKeyOffset + folderPath.Native().erase(platformKeyOffset); // Erase all characters after the platformKeyOffset if (registryFile.m_isPlatformFile) { - folderPath += PlatformFolder; - folderPath.push_back(AZ_CORRECT_DATABASE_SEPARATOR); - folderPath += platform; - folderPath.push_back(AZ_CORRECT_DATABASE_SEPARATOR); + folderPath /= PlatformFolder; + folderPath /= platform; } - folderPath += registryFile.m_relativePath; + folderPath /= registryFile.m_relativePath; if (!registryFile.m_isPatch) { @@ -1027,39 +1030,44 @@ namespace AZ return false; } - bool SettingsRegistryImpl::ExtractFileDescription(RegistryFile& output, const char* filename, const Specializations& specializations) + bool SettingsRegistryImpl::ExtractFileDescription(RegistryFile& output, AZStd::string_view filename, const Specializations& specializations) { - if (!filename || filename[0] == 0) + static constexpr auto PatchExtensionWithDot = AZStd::fixed_string<32>(".") + PatchExtension; + static constexpr auto ExtensionWithDot = AZStd::fixed_string<32>(".") + Extension; + static constexpr AZ::IO::PathView PatchExtensionView(PatchExtensionWithDot); + static constexpr AZ::IO::PathView ExtensionView(ExtensionWithDot); + + if (filename.empty()) { AZ_Error("Settings Registry", false, "Settings file without name found"); return false; } - AZStd::string_view filePath{ filename }; - const size_t filePathSize = filePath.size(); + AZ::IO::PathView filePath{ filename }; + const size_t filePathSize = filePath.Native().size(); // The filePath.empty() check makes sure that the file extension after the final isn't added to the output.m_tags - AZStd::optional pathTag = AZ::StringFunc::TokenizeNext(filePath, '.'); - for (; pathTag && !filePath.empty(); pathTag = AZ::StringFunc::TokenizeNext(filePath, '.')) + auto AppendSpecTags = [&output](AZStd::string_view pathTag) { - output.m_tags.push_back(Specializations::Hash(*pathTag)); - } + output.m_tags.push_back(Specializations::Hash(pathTag)); + }; + AZ::StringFunc::TokenizeVisitor(filePath.Stem().Native(), AppendSpecTags, '.'); // If token is invalid, then the filename has no characters and therefore no extension - if (pathTag) + if (AZ::IO::PathView fileExtension = filePath.Extension(); !fileExtension.empty()) { - if (pathTag->size() >= AZStd::char_traits::length(PatchExtension) && azstrnicmp(pathTag->data(), PatchExtension, pathTag->size()) == 0) + if (fileExtension == PatchExtensionView) { output.m_isPatch = true; } - else if (pathTag->size() != AZStd::char_traits::length(Extension) || azstrnicmp(pathTag->data(), Extension, pathTag->size()) != 0) + else if (fileExtension != ExtensionView) { return false; } } else { - AZ_Error("Settings Registry", false, R"(Settings file without extension found: "%s")", filename); + AZ_Error("Settings Registry", false, R"(Settings file without extension found: "%.*s")", AZ_STRING_ARG(filename)); return false; } @@ -1074,7 +1082,7 @@ namespace AZ { if (*currentIt == *(currentIt - 1)) { - AZ_Error("Settings Registry", false, R"(One or more tags are duplicated in registry file "%s")", filename); + AZ_Error("Settings Registry", false, R"(One or more tags are duplicated in registry file "%.*s")", AZ_STRING_ARG(filename)); return false; } ++currentIt; @@ -1103,11 +1111,123 @@ namespace AZ } else { - AZ_Error("Settings Registry", false, R"(Found relative path to settings file "%s" is too long.)", filename); + AZ_Error("Settings Registry", false, R"(Found relative path to settings file "%.*s" is too long.)", AZ_STRING_ARG(filename)); return false; } } + //! Structure which encapsulates Commands to either the FileIOBase or SystemFile classes based on + //! the SettingsRegistry option to use FileIO + struct SettingsRegistryFileReader + { + using FileHandleType = AZStd::variant; + + SettingsRegistryFileReader() = default; + SettingsRegistryFileReader(bool useFileIo, const char* filePath) + { + Open(useFileIo, filePath); + } + + ~SettingsRegistryFileReader() + { + if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr) + { + if (AZ::IO::FileIOBase* fileIo = AZ::IO::FileIOBase::GetInstance(); fileIo != nullptr) + { + fileIo->Close(*fileHandle); + } + } + } + + bool Open(bool useFileIo, const char* filePath) + { + Close(); + if (AZ::IO::FileIOBase* fileIo = useFileIo ? AZ::IO::FileIOBase::GetInstance() : nullptr; fileIo != nullptr) + { + AZ::IO::HandleType fileHandle; + if (fileIo->Open(filePath, IO::OpenMode::ModeRead, fileHandle)) + { + m_file = fileHandle; + return true; + } + } + else + { + AZ::IO::SystemFile file; + if (file.Open(filePath, IO::SystemFile::OpenMode::SF_OPEN_READ_ONLY)) + { + m_file = AZStd::move(file); + return true; + } + } + + return false; + } + + bool IsOpen() const + { + if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr) + { + return *fileHandle != AZ::IO::InvalidHandle; + } + else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr) + { + return systemFile->IsOpen(); + } + + return false; + } + + void Close() + { + if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr) + { + if (AZ::IO::FileIOBase* fileIo = AZ::IO::FileIOBase::GetInstance(); fileIo != nullptr) + { + fileIo->Close(*fileHandle); + } + } + + m_file = AZStd::monostate{}; + } + + u64 Length() const + { + if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr) + { + if (u64 fileSize{}; AZ::IO::FileIOBase::GetInstance()->Size(*fileHandle, fileSize)) + { + return fileSize; + } + } + else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr) + { + return systemFile->Length(); + } + + return 0; + } + + AZ::IO::SizeType Read(AZ::IO::SizeType byteSize, void* buffer) + { + if (auto fileHandle = AZStd::get_if(&m_file); fileHandle != nullptr) + { + if (AZ::u64 bytesRead{}; AZ::IO::FileIOBase::GetInstance()->Read(*fileHandle, buffer, byteSize, false, &bytesRead)) + { + return bytesRead; + } + } + else if (auto systemFile = AZStd::get_if(&m_file); systemFile != nullptr) + { + return systemFile->Read(byteSize, buffer); + } + + return 0; + } + + FileHandleType m_file; + }; + bool SettingsRegistryImpl::MergeSettingsFileInternal(const char* path, Format format, AZStd::string_view rootKey, AZStd::vector& scratchBuffer) { @@ -1116,8 +1236,8 @@ namespace AZ Pointer pointer(AZ_SETTINGS_REGISTRY_HISTORY_KEY "/-"); - SystemFile file; - if (!file.Open(path, SystemFile::OpenMode::SF_OPEN_READ_ONLY)) + SettingsRegistryFileReader fileReader(m_useFileIo, path); + if (!fileReader.IsOpen()) { AZ_Error("Settings Registry", false, R"(Unable to open registry file "%s".)", path); pointer.Create(m_settings, m_settings.GetAllocator()).SetObject() @@ -1126,7 +1246,7 @@ namespace AZ return false; } - u64 fileSize = file.Length(); + u64 fileSize = fileReader.Length(); if (fileSize == 0) { AZ_Warning("Settings Registry", false, R"(Registry file "%s" is 0 bytes in length. There is no nothing to merge)", path); @@ -1136,9 +1256,10 @@ namespace AZ .AddMember(StringRef("Path"), Value(path, m_settings.GetAllocator()), m_settings.GetAllocator()); return false; } + scratchBuffer.clear(); scratchBuffer.resize_no_construct(fileSize + 1); - if (file.Read(fileSize, scratchBuffer.data()) != fileSize) + if (fileReader.Read(fileSize, scratchBuffer.data()) != fileSize) { AZ_Error("Settings Registry", false, R"(Unable to read registry file "%s".)", path); pointer.Create(m_settings, m_settings.GetAllocator()).SetObject() @@ -1268,4 +1389,9 @@ namespace AZ { applyPatchSettings = m_applyPatchSettings; } + + void SettingsRegistryImpl::SetUseFileIO(bool useFileIo) + { + m_useFileIo = useFileIo; + } } // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.h b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.h index 036f5c6596..ac214711b8 100644 --- a/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.h +++ b/Code/Framework/AzCore/AzCore/Settings/SettingsRegistryImpl.h @@ -35,6 +35,10 @@ namespace AZ static constexpr size_t MaxRegistryFolderEntries = 128; SettingsRegistryImpl(); + //! @param useFileIo - If true attempt to redirect + //! file read operations through the FileIOBase instance first before falling back to SystemFile + //! otherwise always use SystemFile + explicit SettingsRegistryImpl(bool useFileIo); AZ_DISABLE_COPY_MOVE(SettingsRegistryImpl); ~SettingsRegistryImpl() override = default; @@ -83,6 +87,8 @@ namespace AZ void SetApplyPatchSettings(const AZ::JsonApplyPatchSettings& applyPatchSettings) override; void GetApplyPatchSettings(AZ::JsonApplyPatchSettings& applyPatchSettings) override; + void SetUseFileIO(bool useFileIo) override; + private: using TagList = AZStd::fixed_vector; struct RegistryFile @@ -104,7 +110,7 @@ namespace AZ // Compares if lhs is less than rhs in terms of processing order. This can also detect and report conflicts. bool IsLessThan(bool& collisionFound, const RegistryFile& lhs, const RegistryFile& rhs, const Specializations& specializations, const rapidjson::Pointer& historyPointer, AZStd::string_view folderPath); - bool ExtractFileDescription(RegistryFile& output, const char* filename, const Specializations& specializations); + bool ExtractFileDescription(RegistryFile& output, AZStd::string_view filename, const Specializations& specializations); bool MergeSettingsFileInternal(const char* path, Format format, AZStd::string_view rootKey, AZStd::vector& scratchBuffer); void SignalNotifier(AZStd::string_view jsonPath, Type type); @@ -119,5 +125,7 @@ namespace AZ JsonSerializerSettings m_serializationSettings; JsonDeserializerSettings m_deserializationSettings; JsonApplyPatchSettings m_applyPatchSettings; + + bool m_useFileIo{}; }; } // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/UnitTest/Mocks/MockSettingsRegistry.h b/Code/Framework/AzCore/AzCore/UnitTest/Mocks/MockSettingsRegistry.h index 7e6bb3d7b4..91dc0924c8 100644 --- a/Code/Framework/AzCore/AzCore/UnitTest/Mocks/MockSettingsRegistry.h +++ b/Code/Framework/AzCore/AzCore/UnitTest/Mocks/MockSettingsRegistry.h @@ -57,6 +57,7 @@ namespace AZ MOCK_METHOD1(SetApplyPatchSettings, void(const JsonApplyPatchSettings&)); MOCK_METHOD1(GetApplyPatchSettings, void(JsonApplyPatchSettings&)); + MOCK_METHOD1(SetUseFileIO, void(bool)); }; } // namespace AZ diff --git a/Code/Framework/AzCore/AzCore/XML/rapidxml.h b/Code/Framework/AzCore/AzCore/XML/rapidxml.h index 694e0a1bf6..9e6d648293 100644 --- a/Code/Framework/AzCore/AzCore/XML/rapidxml.h +++ b/Code/Framework/AzCore/AzCore/XML/rapidxml.h @@ -13,6 +13,7 @@ // the intention is that you only include the customized version of rapidXML through this header, so that // you can override behavior here. +#include #include #endif // AZCORE_RAPIDXML_RAPIDXML_H_INCLUDED diff --git a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp index 958dba2cc9..12974d03cf 100644 --- a/Code/Framework/AzFramework/AzFramework/Application/Application.cpp +++ b/Code/Framework/AzFramework/AzFramework/Application/Application.cpp @@ -81,71 +81,6 @@ namespace AzFramework static constexpr const char s_prefabSystemKey[] = "/Amazon/Preferences/EnablePrefabSystem"; static constexpr const char s_prefabWipSystemKey[] = "/Amazon/Preferences/EnablePrefabSystemWipFeatures"; static constexpr const char s_legacySlicesAssertKey[] = "/Amazon/Preferences/ShouldAssertForLegacySlicesUsage"; - - // A Helper function that can load an app descriptor from file. - AZ::Outcome, AZStd::string> LoadDescriptorFromFilePath(const char* appDescriptorFilePath, AZ::SerializeContext& serializeContext) - { - AZStd::unique_ptr loadedDescriptor; - - AZ::IO::SystemFile appDescriptorFile; - if (!appDescriptorFile.Open(appDescriptorFilePath, AZ::IO::SystemFile::SF_OPEN_READ_ONLY)) - { - return AZ::Failure(AZStd::string::format("Failed to open file: %s", appDescriptorFilePath)); - } - - AZ::IO::SystemFileStream appDescriptorFileStream(&appDescriptorFile, true); - if (!appDescriptorFileStream.IsOpen()) - { - return AZ::Failure(AZStd::string::format("Failed to stream file: %s", appDescriptorFilePath)); - } - - // Callback function for allocating the root elements in the file. - AZ::ObjectStream::InplaceLoadRootInfoCB inplaceLoadCb = - [](void** rootAddress, const AZ::SerializeContext::ClassData**, const AZ::Uuid& classId, AZ::SerializeContext*) - { - if (rootAddress && classId == azrtti_typeid()) - { - // ComponentApplication::Descriptor is normally a singleton. - // Force a unique instance to be created. - *rootAddress = aznew AZ::ComponentApplication::Descriptor(); - } - }; - - // Callback function for saving the root elements in the file. - AZ::ObjectStream::ClassReadyCB classReadyCb = - [&loadedDescriptor](void* classPtr, const AZ::Uuid& classId, AZ::SerializeContext* context) - { - // Save descriptor, delete anything else loaded from file. - if (classId == azrtti_typeid()) - { - loadedDescriptor.reset(static_cast(classPtr)); - } - else if (const AZ::SerializeContext::ClassData* classData = context->FindClassData(classId)) - { - classData->m_factory->Destroy(classPtr); - } - else - { - AZ_Error("Application", false, "Unexpected type %s found in application descriptor file. This memory will leak.", - classId.ToString().c_str()); - } - }; - - // There's other stuff in the file we may not recognize (system components), but we're not interested in that stuff. - AZ::ObjectStream::FilterDescriptor loadFilter(&AZ::Data::AssetFilterNoAssetLoading, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES); - - if (!AZ::ObjectStream::LoadBlocking(&appDescriptorFileStream, serializeContext, classReadyCb, loadFilter, inplaceLoadCb)) - { - return AZ::Failure(AZStd::string::format("Failed to load objects from file: %s", appDescriptorFilePath)); - } - - if (!loadedDescriptor) - { - return AZ::Failure(AZStd::string::format("Failed to find descriptor object in file: %s", appDescriptorFilePath)); - } - - return AZ::Success(AZStd::move(loadedDescriptor)); - } } Application::Application() diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp index 1891c50d10..c94d588a90 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.cpp @@ -40,8 +40,6 @@ #include -#include - namespace AZ::IO { AZ_CVAR(int, sys_PakPriority, aznumeric_cast(ArchiveVars{}.nPriority), nullptr, AZ::ConsoleFunctorFlags::Null, @@ -64,40 +62,6 @@ namespace AZ::IO::ArchiveInternal // to the actual index , this offset is added to get the valid handle static constexpr size_t PseudoFileIdxOffset = 1; - // Explanation of this function: it is like a 'find and replace' for paths - // if the source path starts with 'aliasToLookFor' it will replace it with 'aliasToReplaceWith' - // else it will leave it untouched. - // the only caveat here is that it will perform this replacement if the source path either begins - // with the literal alias to look for, or begins with the actual absolute path that the alias to - // look for represents. It is a way of redirecting all @devassets@ to @assets@ regardless of whether - // you input a string that literally starts with @devassets@ or one that starts with the absolute path to the - // folder that @devassets@ aliases. - AZStd::optional ConvertAbsolutePathToAliasedPath(AZStd::string_view sourcePath, - AZStd::string_view aliasToLookFor, AZStd::string_view aliasToReplaceWith) - { - if (auto fileIo = AZ::IO::FileIOBase::GetDirectInstance(); !aliasToLookFor.empty() && !aliasToReplaceWith.empty() && !sourcePath.empty() && fileIo) - { - auto convertedPath = fileIo->ConvertToAlias(sourcePath); - if (!convertedPath) - { - return AZStd::nullopt; - } - - if (convertedPath->Native().starts_with(aliasToLookFor)) - { - convertedPath->Native().replace(0, aliasToLookFor.size(), aliasToReplaceWith); - } - // lowercase path if it starts with either the @assets@ or @root@ alias - if (convertedPath->Native().starts_with("@assets@") || convertedPath->Native().starts_with("@root@") - || convertedPath->Native().starts_with("@projectplatformcache@")) - { - AZStd::to_lower(convertedPath->Native().begin(), convertedPath->Native().end()); - } - return convertedPath; - } - return AZStd::make_optional(sourcePath); - } - struct CCachedFileRawData { void* m_pCachedData; @@ -146,15 +110,12 @@ namespace AZ::IO::ArchiveInternal uint32_t GetFileSize() { return GetFile() ? GetFile()->GetFileEntry()->desc.lSizeUncompressed : 0; } int FSeek(uint64_t nOffset, int nMode); - size_t FRead(void* pDest, size_t nSize, size_t nCount, AZ::IO::HandleType fileHandle); - size_t FReadAll(void* pDest, size_t nFileSize, AZ::IO::HandleType fileHandle); + size_t FRead(void* pDest, size_t bytesToRead, AZ::IO::HandleType fileHandle); void* GetFileData(size_t& nFileSize, AZ::IO::HandleType fileHandle); int FEof(); - char* FGets(char* pBuf, int n); - int Getc(); uint64_t GetModificationTime() { return m_pFileData->GetFileEntry()->GetModificationTime(); } - const char* GetArchivePath() { return m_pFileData->GetZip()->GetFilePath(); } + AZ::IO::PathView GetArchivePath() { return m_pFileData->GetZip()->GetFilePath(); } protected: uint64_t m_nCurSeek; CCachedFileDataPtr m_pFileData; @@ -205,7 +166,7 @@ namespace AZ::IO::ArchiveInternal } ////////////////////////////////////////////////////////////////////////// - size_t ArchiveInternal::CZipPseudoFile::FRead(void* pDest, size_t nSize, size_t nCount, [[maybe_unused]] AZ::IO::HandleType fileHandle) + size_t ArchiveInternal::CZipPseudoFile::FRead(void* pDest, size_t bytesToRead, [[maybe_unused]] AZ::IO::HandleType fileHandle) { AZ_PROFILE_FUNCTION(AzCore); @@ -214,21 +175,13 @@ namespace AZ::IO::ArchiveInternal return 0; } - size_t nTotal = nSize * nCount; + size_t nTotal = bytesToRead; if (!nTotal || (uint32_t)m_nCurSeek >= GetFileSize()) { return 0; } - if (nTotal > GetFileSize() - m_nCurSeek) - { - nTotal = GetFileSize() - m_nCurSeek; - if (nTotal < nSize) - { - return 0; - } - nTotal -= nTotal % nSize; - } + nTotal = (AZStd::min)(nTotal, GetFileSize() - m_nCurSeek); int64_t nReadBytes = GetFile()->ReadData(pDest, m_nCurSeek, nTotal); if (nReadBytes == -1) @@ -242,32 +195,9 @@ namespace AZ::IO::ArchiveInternal nTotal = (size_t)nReadBytes; } m_nCurSeek += nTotal; - return nTotal / nSize; + return nTotal; } - ////////////////////////////////////////////////////////////////////////// - size_t ArchiveInternal::CZipPseudoFile::FReadAll(void* pDest, size_t nFileSize, [[maybe_unused]] AZ::IO::HandleType fileHandle) - { - if (!GetFile()) - { - return 0; - } - - if (nFileSize != GetFileSize()) - { - AZ_Assert(false, "File size parameter of nFileSize does not match the file size of the zip file"); // Bad call - return 0; - } - - if (!GetFile()->ReadData(pDest, 0, nFileSize)) - { - return 0; - } - - m_nCurSeek = nFileSize; - - return nFileSize; - } ////////////////////////////////////////////////////////////////////////// void* ArchiveInternal::CZipPseudoFile::GetFileData(size_t& nFileSize, [[maybe_unused]] AZ::IO::HandleType fileHandle) @@ -292,70 +222,6 @@ namespace AZ::IO::ArchiveInternal return (uint32_t)m_nCurSeek >= GetFileSize(); } - char* ArchiveInternal::CZipPseudoFile::FGets(char* pBuf, int n) - { - if (!GetFile()) - { - return nullptr; - } - - char* pData = (char*)GetFile()->GetData(); - if (!pData) - { - return nullptr; - } - int nn = 0; - int i; - for (i = 0; i < n; i++) - { - if (i + m_nCurSeek == GetFileSize()) - { - break; - } - char c = pData[i + m_nCurSeek]; - if (c == 0xa || c == 0) - { - pBuf[nn++] = c; - i++; - break; - } - else - if (c == 0xd) - { - continue; - } - pBuf[nn++] = c; - } - pBuf[nn] = 0; - m_nCurSeek += i; - - if (m_nCurSeek == GetFileSize()) - { - return nullptr; - } - return pBuf; - } - - int ArchiveInternal::CZipPseudoFile::Getc() - { - if (!GetFile()) - { - return EOF; - } - char* pData = (char*)GetFile()->GetData(); - if (!pData) - { - return EOF; - } - int c = EOF; - if (m_nCurSeek == GetFileSize()) - { - return c; - } - c = pData[m_nCurSeek]; - m_nCurSeek += 1; - return c; - } } namespace AZ::IO @@ -379,16 +245,17 @@ namespace AZ::IO void Add(AZStd::string_view sResourceFile) override { - auto filename = ArchiveInternal::ConvertAbsolutePathToAliasedPath(sResourceFile); - if (!filename) + if (sResourceFile.empty()) { - AZ_Error("Archive", false, "Path %s cannot be converted to @alias@ form. It is longer than MaxPathLength %zu", aznumeric_cast(sResourceFile.size()), - sResourceFile.data(), AZ::IO::MaxPathLength); return; } - AZ::IO::FixedMaxPathString& convertedFilename = filename->Native(); - AZStd::replace(convertedFilename.begin(), convertedFilename.end(), AZ_WRONG_DATABASE_SEPARATOR, AZ_CORRECT_DATABASE_SEPARATOR); - AZStd::to_lower(convertedFilename.begin(), convertedFilename.end()); + AZ::IO::FixedMaxPath convertedFilename; + if (!AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(convertedFilename, sResourceFile)) + { + AZ_Error("Archive", false, "Path %.*s cannot be resolved. It is longer than MaxPathLength %zu", + AZ_STRING_ARG(sResourceFile), AZ::IO::MaxPathLength); + return; + } AZStd::scoped_lock lock(m_lock); m_set.emplace(convertedFilename); @@ -397,23 +264,20 @@ namespace AZ::IO { AZStd::scoped_lock lock(m_lock); m_set.clear(); - m_iter = m_set.begin(); + m_iter = m_set.end(); } bool IsExist(AZStd::string_view sResourceFile) override { - auto filename = ArchiveInternal::ConvertAbsolutePathToAliasedPath(sResourceFile); - if (!filename) + AZ::IO::FixedMaxPath convertedFilename; + if (!AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(convertedFilename, sResourceFile)) { - AZ_Error("Archive", false, "Path %.*s cannot be converted to @alias@ form. It is longer than MaxPathLength %zu", aznumeric_cast(sResourceFile.size()), - sResourceFile.data(), AZ::IO::MaxPathLength); + AZ_Error("Archive", false, "Path %.*s cannot be resolved. It is longer than MaxPathLength %zu", + AZ_STRING_ARG(sResourceFile), AZ::IO::MaxPathLength); return false; } - AZ::IO::FixedMaxPathString& convertedFilename = filename->Native(); - AZStd::replace(convertedFilename.begin(), convertedFilename.end(), AZ_WRONG_DATABASE_SEPARATOR, AZ_CORRECT_DATABASE_SEPARATOR); - AZStd::to_lower(convertedFilename.begin(), convertedFilename.end()); AZStd::scoped_lock lock(m_lock); - return m_set.contains(AZStd::string_view{ convertedFilename }); + return m_set.contains(AZ::IO::PathView{ convertedFilename }); } bool Load(AZStd::string_view sResourceListFilename) override { @@ -425,9 +289,8 @@ namespace AZ::IO AZ::IO::SizeType nLen = file.Length(); AZStd::string pMemBlock; - pMemBlock.resize_no_construct(nLen); - char* buf = pMemBlock.data(); - file.Read(nLen, buf); + pMemBlock.resize_no_construct(nLen);; + file.Read(pMemBlock.size(), pMemBlock.data()); // Parse file, every line in a file represents a resource filename. AZ::StringFunc::TokenizeVisitor(pMemBlock, @@ -464,7 +327,7 @@ namespace AZ::IO } private: - using ResourceSet = AZStd::set; + using ResourceSet = AZStd::set>; AZStd::recursive_mutex m_lock; ResourceSet m_set; ResourceSet::iterator m_iter; @@ -499,12 +362,13 @@ namespace AZ::IO , m_pNextLevelResourceList{ new CResourceList{} } , m_mainThreadId{ AZStd::this_thread::get_id() } { + CompressionBus::Handler::BusConnect(); } ////////////////////////////////////////////////////////////////////////// Archive::~Archive() { - Release(); + CompressionBus::Handler::BusDisconnect(); m_arrZips = {}; @@ -530,51 +394,13 @@ namespace AZ::IO AZ_Assert(m_cachedFileRawDataSet.empty(), "All Archive file cached raw data instances not closed"); } - bool Archive::CheckFileAccessDisabled([[maybe_unused]] AZStd::string_view name, [[maybe_unused]] const char* mode) - { - return false; - } - void Archive::LogFileAccessCallStack([[maybe_unused]] AZStd::string_view name, [[maybe_unused]] AZStd::string_view nameFull, [[maybe_unused]] const char* mode) { // Print call stack for each find. - AZ_TracePrintf("Archive", "LogFileAccessCallStack() - name=%.*s; nameFull=%.*s; mode=%s\n", aznumeric_cast(name.size()), name.data(), aznumeric_cast(nameFull.size()), nameFull.data(), mode); + AZ_TracePrintf("Archive", "LogFileAccessCallStack() - name=%.*s; nameFull=%.*s; mode=%s\n", AZ_STRING_ARG(name), AZ_STRING_ARG(nameFull), mode); AZ::Debug::Trace::PrintCallstack("Archive", 32); } - ////////////////////////////////////////////////////////////////////////// - - bool Archive::IsInstalledToHDD(AZStd::string_view) const - { - return true; - } - - ////////////////////////////////////////////////////////////////////////// - void Archive::ParseAliases(AZStd::string_view szCommandLine) - { - // this is a list of pairs separated by commas, i.e. Folder1,FolderNew,Textures,TestBuildTextures etc. - AZStd::optional aliasKey = AZ::StringFunc::TokenizeNext(szCommandLine, ','); - AZStd::optional aliasPath = AZ::StringFunc::TokenizeNext(szCommandLine, ','); - for ( ;aliasKey && aliasPath; aliasKey = AZ::StringFunc::TokenizeNext(szCommandLine,','), AZ::StringFunc::TokenizeNext(szCommandLine,',')) - { - // inform the Archive system - SetAlias(*aliasKey, *aliasPath, true); - AZ_TracePrintf("Archive", "Archive ALIAS:%.*s = %.*s\n", aznumeric_cast(aliasKey->size()), aliasKey->data(), - aznumeric_cast(aliasPath->size()), aliasPath->data()); - - } - } - - ////////////////////////////////////////////////////////////////////////// - //! if bReturnSame==true, it will return the input name if an alias doesn't exist. Otherwise returns nullptr - const char* Archive::GetAlias(AZStd::string_view szName, bool bReturnSame) - { - constexpr size_t MaxAliasLength = 32; - AZStd::fixed_string aliasKey{ szName }; - const char* dest = AZ::IO::FileIOBase::GetDirectInstance()->GetAlias(aliasKey.c_str()); - return (bReturnSame && !dest) ? szName.data() : dest; - } - ////////////////////////////////////////////////////////////////////////// void Archive::SetLocalizationFolder(AZStd::string_view sLocalizationFolder) { @@ -591,28 +417,6 @@ namespace AZ::IO m_sLocalizationFolder += AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING; } - ////////////////////////////////////////////////////////////////////////// - void Archive::SetAlias(AZStd::string_view szName, AZStd::string_view szAlias, bool bAdd) - { - constexpr size_t MaxAliasLength = 32; - AZStd::fixed_string aliasKey{ szName }; - if (bAdd) - { - AZ::IO::PathString aliasPath{ szAlias }; - AZ::IO::FileIOBase::GetDirectInstance()->SetAlias(aliasKey.c_str(), aliasPath.c_str()); - } - else - { - AZ::IO::FileIOBase::GetDirectInstance()->ClearAlias(aliasKey.c_str()); - } - } - - - const char* Archive::AdjustFileName(AZStd::string_view src, char* dst, size_t dstSize, uint32_t, bool) - { - AZ::IO::FixedMaxPathString srcPath{ src }; - return AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(srcPath.c_str(), dst, dstSize) ? dst : nullptr; - } ////////////////////////////////////////////////////////////////////////// bool Archive::IsFileExist(AZStd::string_view sFilename, EFileSearchLocation fileLocation) @@ -679,52 +483,50 @@ namespace AZ::IO } ////////////////////////////////////////////////////////////////////////// - AZ::IO::HandleType Archive::FOpen(AZStd::string_view pName, const char* szMode, uint32_t nInputFlags) + AZ::IO::HandleType Archive::FOpen(AZStd::string_view pName, const char* szMode) { AZ_PROFILE_FUNCTION(AzCore); const size_t pathLen = pName.size(); - if (pathLen == 0 || pathLen >= MaxPath) + if (pathLen == 0 || pathLen >= AZ::IO::MaxPathLength) { return AZ::IO::InvalidHandle; } SAutoCollectFileAccessTime accessTime(this); - AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; - - const bool bFileCanBeOnDisk = 0 != (nInputFlags & FOPEN_ONDISK); - // get the priority into local variable to avoid it changing in the course of // this function execution (?) const ArchiveLocationPriority nVarPakPriority = GetPakPriority(); AZ::IO::OpenMode nOSFlags = AZ::IO::GetOpenModeFromStringMode(szMode); - auto szFullPath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pName); - if (!szFullPath) + AZ::IO::FixedMaxPath szFullPath; + if (!AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(szFullPath, pName)) { - AZ_Assert(szFullPath, "Unable to resolve path for filepath %.*s", aznumeric_cast(pName.size()), pName.data()); + AZ_Assert(false, "Unable to resolve path for filepath %.*s", aznumeric_cast(pName.size()), pName.data()); return false; } const bool fileWritable = (nOSFlags & (AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeAppend | AZ::IO::OpenMode::ModeUpdate)) != AZ::IO::OpenMode::Invalid; - AZ_PROFILE_SCOPE(Game, "File: %s Archive: %p", szFullPath->c_str(), this); + AZ_PROFILE_SCOPE(Game, "File: %s Archive: %p", szFullPath.c_str(), this); if (fileWritable) { // we need to open the file for writing, but we failed to do so. // the only reason that can be is that there are no directories for that file. // now create those dirs - if (!MakeDir(szFullPath->ParentPath().Native())) + if (AZ::IO::FixedMaxPath parentPath = szFullPath.ParentPath(); + !AZ::IO::FileIOBase::GetDirectInstance()->CreatePath(parentPath.c_str())) { return AZ::IO::InvalidHandle; } - if (AZ::IO::FileIOBase::GetDirectInstance()->Open(szFullPath->c_str(), nOSFlags, fileHandle)) + if (AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; + AZ::IO::FileIOBase::GetDirectInstance()->Open(szFullPath.c_str(), nOSFlags, fileHandle)) { if (az_archive_verbosity) { - AZ_TracePrintf("Archive", " Archive::FOpen() has directly opened requested file %s for writing", szFullPath->c_str()); + AZ_TracePrintf("Archive", " Archive::FOpen() has directly opened requested file %s for writing", szFullPath.c_str()); } return fileHandle; } @@ -732,35 +534,41 @@ namespace AZ::IO return AZ::IO::InvalidHandle; } - if (nVarPakPriority == ArchiveLocationPriority::ePakPriorityFileFirst) // if the file system files have priority now.. + auto OpenFromFileSystem = [this, &szFullPath, pName, nOSFlags]() -> HandleType { - if (AZ::IO::FileIOBase::GetDirectInstance()->Open(szFullPath->c_str(), nOSFlags, fileHandle)) + if (AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; + AZ::IO::FileIOBase::GetDirectInstance()->Open(szFullPath.c_str(), nOSFlags, fileHandle)) { if (az_archive_verbosity) { - AZ_TracePrintf("Archive", " Archive::FOpen() has directly opened requested file %s with FileFirst priority", szFullPath->c_str()); + AZ_TracePrintf("Archive", " Archive::FOpen() has directly opened requested file %s on for reading", szFullPath.c_str()); } RecordFile(fileHandle, pName); return fileHandle; } - } - uint32_t archiveFlags = 0; - CCachedFileDataPtr pFileData = GetFileData(szFullPath->Native(), archiveFlags); - if (pFileData) + return AZ::IO::InvalidHandle; + }; + auto OpenFromArchive = [this, &szFullPath, pName]() -> HandleType { - bool logged = false; - ZipDir::Cache* pZip = pFileData->GetZip(); - if (pZip) + uint32_t archiveFlags = 0; + CCachedFileDataPtr pFileData = GetFileData(szFullPath.Native(), archiveFlags); + if (pFileData == nullptr) { - const char* pZipFilePath = pZip->GetFilePath(); - if (pZipFilePath && pZipFilePath[0]) + return AZ::IO::InvalidHandle; + } + + bool logged = false; + if (ZipDir::Cache* pZip = pFileData->GetZip(); pZip != nullptr) + { + AZ::IO::PathView pZipFilePath = pZip->GetFilePath(); + if (!pZipFilePath.empty()) { if (az_archive_verbosity) { - AZ_TracePrintf("Archive", " Archive::FOpen() has opened requested file %s from archive %s, disk offset %u", - szFullPath->c_str(), pZipFilePath, pFileData->GetFileEntry()->nFileDataOffset); + AZ_TracePrintf("Archive", " Archive::FOpen() has opened requested file %s from archive %.*s, disk offset %u", + szFullPath.c_str(), AZ_STRING_ARG(pZipFilePath.Native()), pFileData->GetFileEntry()->nFileDataOffset); logged = true; } } @@ -771,57 +579,54 @@ namespace AZ::IO if (az_archive_verbosity) { AZ_TracePrintf("Archive", " Archive::FOpen() has opened requested file %s from an archive file who's path isn't known", - szFullPath->c_str()); + szFullPath.c_str()); } } - } - else - { - if (nVarPakPriority != ArchiveLocationPriority::ePakPriorityPakOnly || bFileCanBeOnDisk) // if the archive files had more priority, we didn't attempt fopen before- try it now + + size_t nFile; + // find the empty slot and open the file there; return the handle { - if (AZ::IO::FileIOBase::GetDirectInstance()->Open(szFullPath->c_str(), nOSFlags, fileHandle)) + // try to open the pseudofile from one of the zips, make sure there is no user alias + AZStd::unique_lock lock(m_csOpenFiles); + for (nFile = 0; nFile < m_arrOpenFiles.size() && m_arrOpenFiles[nFile]->GetFile(); ++nFile) { - if (az_archive_verbosity) - { - AZ_TracePrintf("Archive", " Archive::FOpen() has directly opened requested file %s after failing to open from archives", - szFullPath->c_str()); - } - - RecordFile(fileHandle, pName); - return fileHandle; + continue; } + if (nFile == m_arrOpenFiles.size()) + { + m_arrOpenFiles.emplace_back(AZStd::make_unique()); + } + AZStd::unique_ptr& rZipFile = m_arrOpenFiles[nFile]; + rZipFile->Construct(pFileData.get()); } - return AZ::IO::InvalidHandle; // we can't find such file in the pack files - } - // try to open the pseudofile from one of the zips, make sure there is no user alias - AZStd::unique_lock lock(m_csOpenFiles); + AZ::IO::HandleType handle = (AZ::IO::HandleType)(nFile + ArchiveInternal::PseudoFileIdxOffset); - size_t nFile; - // find the empty slot and open the file there; return the handle + RecordFile(handle, pName); + + return handle; // the handle to the file + }; + + switch (nVarPakPriority) { - for (nFile = 0; nFile < m_arrOpenFiles.size() && m_arrOpenFiles[nFile]->GetFile(); ++nFile) - { - continue; - } - if (nFile == m_arrOpenFiles.size()) - { - m_arrOpenFiles.emplace_back(AZStd::make_unique()); - } - AZStd::unique_ptr& rZipFile = m_arrOpenFiles[nFile]; - rZipFile->Construct(pFileData.get()); - } - - AZ::IO::HandleType ret = (AZ::IO::HandleType)(nFile + ArchiveInternal::PseudoFileIdxOffset); - - if (az_archive_verbosity) + case ArchiveLocationPriority::ePakPriorityFileFirst: { - AZ_TracePrintf("Archive", " Archive::FOpen() has opened psuedo zip file %.*s", aznumeric_cast(pName.size()), pName.data()); + AZ::IO::HandleType fileHandle = OpenFromFileSystem(); + return fileHandle != AZ::IO::InvalidHandle ? fileHandle : OpenFromArchive(); + } + case ArchiveLocationPriority::ePakPriorityPakFirst: + { + AZ::IO::HandleType fileHandle = OpenFromArchive(); + return fileHandle != AZ::IO::InvalidHandle ? fileHandle : OpenFromFileSystem(); + } + case ArchiveLocationPriority::ePakPriorityPakOnly: + { + return OpenFromArchive(); + } + default: + return AZ::IO::InvalidHandle; } - RecordFile(ret, pName); - - return ret; // the handle to the file } ////////////////////////////////////////////////////////////////////////// @@ -872,19 +677,14 @@ namespace AZ::IO ////////////////////////////////////////////////////////////////////////// // tests if the given file path refers to an existing file inside registered (opened) packs // the path must be absolute normalized lower-case with forward-slashes - ZipDir::FileEntry* Archive::FindPakFileEntry(AZStd::string_view szPath, uint32_t& nArchiveFlags, ZipDir::CachePtr* pZip, bool bSkipInMemoryArchives) const + ZipDir::FileEntry* Archive::FindPakFileEntry(AZStd::string_view szPath, uint32_t& nArchiveFlags, ZipDir::CachePtr* pZip) const { - AZ::IO::FixedMaxPath unaliasedPath; + AZ::IO::FixedMaxPath resolvedPath; + if (!AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(resolvedPath, szPath)) { - auto convertedPath = ArchiveInternal::ConvertAbsolutePathToAliasedPath(szPath); - - if (!convertedPath) - { - AZ_Error("Archive", false, "Path %s cannot be converted to @alias@ form. It is longer than MaxPathLength %zu", aznumeric_cast(szPath.size()), - szPath.data(), AZ::IO::MaxPathLength); - return nullptr; - } - unaliasedPath = AZStd::move(*convertedPath); + AZ_Error("Archive", false, "Path %s cannot be converted to @alias@ form. It is longer than MaxPathLength %zu", aznumeric_cast(szPath.size()), + szPath.data(), AZ::IO::MaxPathLength); + return nullptr; } @@ -892,28 +692,17 @@ namespace AZ::IO // scan through registered archive files and try to find this file for (auto itZip = m_arrZips.rbegin(); itZip != m_arrZips.rend(); ++itZip) { - if (bSkipInMemoryArchives && itZip->pArchive->GetFlags() & INestedArchive::FLAGS_IN_MEMORY_MASK) - { - continue; - } - if (itZip->pArchive->GetFlags() & INestedArchive::FLAGS_DISABLE_PAK) { continue; } - auto [bindRootIter, unaliasedIter] = AZStd::mismatch(itZip->m_pathBindRoot.begin(), itZip->m_pathBindRoot.end(), - unaliasedPath.begin(), unaliasedPath.end()); // If the bindRootIter is at the end then it is a prefix of the source path - if (bindRootIter == itZip->m_pathBindRoot.end()) + if (resolvedPath.IsRelativeTo(itZip->m_pathBindRoot)) { // unaliasedIter is past the bind root, so append the rest of it to a new relative path object - AZ::IO::FixedMaxPath relativePathInZip; - for (; unaliasedIter != unaliasedPath.end(); ++unaliasedIter) - { - relativePathInZip /= *unaliasedIter; - } + AZ::IO::FixedMaxPath relativePathInZip = resolvedPath.LexicallyRelative(itZip->m_pathBindRoot); ZipDir::FileEntry* pFileEntry = itZip->pZip->FindFile(relativePathInZip.Native()); if (pFileEntry) @@ -955,7 +744,7 @@ namespace AZ::IO } // returns the path to the archive in which the file was opened - const char* Archive::GetFileArchivePath(AZ::IO::HandleType fileHandle) + AZ::IO::PathView Archive::GetFileArchivePath(AZ::IO::HandleType fileHandle) { ArchiveInternal::CZipPseudoFile* pseudoFile = GetPseudoFile(fileHandle); if (pseudoFile) @@ -964,7 +753,7 @@ namespace AZ::IO } else { - return nullptr; + return {}; } } @@ -1066,7 +855,7 @@ namespace AZ::IO return 1; } - size_t Archive::FWrite(const void* data, size_t length, size_t elems, AZ::IO::HandleType fileHandle) + size_t Archive::FWrite(const void* data, size_t bytesToWrite, AZ::IO::HandleType fileHandle) { SAutoCollectFileAccessTime accessTime(this); @@ -1077,47 +866,28 @@ namespace AZ::IO } AZ_Assert(fileHandle != AZ::IO::InvalidHandle, "Invalid file has been passed to FWrite"); - if (AZ::IO::FileIOBase::GetDirectInstance()->Write(fileHandle, data, length * elems)) + if (AZ::u64 bytesWritten{}; AZ::IO::FileIOBase::GetDirectInstance()->Write(fileHandle, data, bytesToWrite, &bytesWritten)) { - return elems; + return bytesWritten; } return 0; } ////////////////////////////////////////////////////////////////////////// - size_t Archive::FReadRaw(void* pData, size_t nSize, size_t nCount, AZ::IO::HandleType fileHandle) + size_t Archive::FRead(void* pData, size_t bytesToRead, AZ::IO::HandleType fileHandle) { AZ_PROFILE_FUNCTION(AzCore); - AZ_PROFILE_SCOPE(Game, "Size: %d Archive: %p", nSize, this); SAutoCollectFileAccessTime accessTime(this); ArchiveInternal::CZipPseudoFile* pseudoFile = GetPseudoFile(fileHandle); if (pseudoFile) { - return pseudoFile->FRead(pData, nSize, nCount, fileHandle); + return pseudoFile->FRead(pData, bytesToRead, fileHandle); } AZ::u64 bytesRead = 0; - AZ::IO::FileIOBase::GetDirectInstance()->Read(fileHandle, pData, nSize * nCount, false, &bytesRead); - return static_cast(bytesRead / nSize); - } - - ////////////////////////////////////////////////////////////////////////// - size_t Archive::FReadRawAll(void* pData, size_t nFileSize, AZ::IO::HandleType fileHandle) - { - AZ_PROFILE_FUNCTION(AzCore); - - SAutoCollectFileAccessTime accessTime(this); - ArchiveInternal::CZipPseudoFile* pseudoFile = GetPseudoFile(fileHandle); - if (pseudoFile) - { - return pseudoFile->FReadAll(pData, nFileSize, fileHandle); - } - - AZ::IO::FileIOBase::GetDirectInstance()->Seek(fileHandle, 0, AZ::IO::SeekType::SeekFromStart); - AZ::u64 bytesRead = 0; - AZ::IO::FileIOBase::GetDirectInstance()->Read(fileHandle, pData, nFileSize, false, &bytesRead); - return static_cast(bytesRead); + AZ::IO::FileIOBase::GetDirectInstance()->Read(fileHandle, pData, bytesToRead, false, &bytesRead); + return bytesRead; } ////////////////////////////////////////////////////////////////////////// @@ -1234,48 +1004,6 @@ namespace AZ::IO } - int Archive::FPrintf(AZ::IO::HandleType fileHandle, const char* szFormat, ...) - { - SAutoCollectFileAccessTime accessTime(this); - ArchiveInternal::CZipPseudoFile* pseudoFile = GetPseudoFile(fileHandle); - if (pseudoFile) - { - return 0; // we don't support it now - } - - va_list arglist; - int rv; - va_start(arglist, szFormat); - rv = static_cast(AZ::IO::PrintV(fileHandle, szFormat, arglist)); - va_end(arglist); - return rv; - } - - char* Archive::FGets(char* str, int n, AZ::IO::HandleType fileHandle) - { - SAutoCollectFileAccessTime accessTime(this); - ArchiveInternal::CZipPseudoFile* pseudoFile = GetPseudoFile(fileHandle); - if (pseudoFile) - { - return pseudoFile->FGets(str, n); - } - - return AZ::IO::FGetS(str, n, fileHandle); - } - - int Archive::Getc(AZ::IO::HandleType fileHandle) - { - SAutoCollectFileAccessTime accessTime(this); - ArchiveInternal::CZipPseudoFile* pseudoFile = GetPseudoFile(fileHandle); - if (pseudoFile) - { - return pseudoFile->Getc(); - } - - return AZ::IO::GetC(fileHandle); - } - - ////////////////////////////////////////////////////////////////////////// AZ::IO::ArchiveFileIterator Archive::FindFirst(AZStd::string_view pDir, EFileSearchType searchType) { @@ -1304,7 +1032,7 @@ namespace AZ::IO break; } - AZStd::intrusive_ptr pFindData = new AZ::IO::FindData(); + AZStd::intrusive_ptr pFindData = aznew AZ::IO::FindData(); pFindData->Scan(this, szFullPath->Native(), bAllowUseFileSystem, bScanZips); return pFindData->Fetch(); @@ -1322,18 +1050,6 @@ namespace AZ::IO return true; } - ////////////////////////////////////////////////////////////////////////// - bool Archive::LoadPakToMemory([[maybe_unused]] AZStd::string_view pName, [[maybe_unused]] IArchive::EInMemoryArchiveLocation nLoadPakToMemory, - [[maybe_unused]] AZStd::intrusive_ptr pMemoryBlock) - { - return true; - } - - ////////////////////////////////////////////////////////////////////////// - void Archive::LoadPaksToMemory([[maybe_unused]] int nMaxArchiveSize, [[maybe_unused]] bool bLoadToMemory) - { - } - auto Archive::GetLevelPackOpenEvent() -> LevelPackOpenEvent* { return &m_levelOpenEvent; @@ -1344,7 +1060,7 @@ namespace AZ::IO return &m_levelCloseEvent; } //====================================================================== - bool Archive::OpenPack(AZStd::string_view szBindRootIn, AZStd::string_view szPath, uint32_t nFlags, + bool Archive::OpenPack(AZStd::string_view szBindRootIn, AZStd::string_view szPath, AZStd::intrusive_ptr pData, AZ::IO::FixedMaxPathString* pFullPath, bool addLevels) { AZ_Assert(!szBindRootIn.empty(), "Bind Root should not be empty"); @@ -1363,7 +1079,7 @@ namespace AZ::IO return false; } - bool result = OpenPackCommon(szBindRoot->Native(), szFullPath->Native(), nFlags, pData, addLevels); + bool result = OpenPackCommon(szBindRoot->Native(), szFullPath->Native(), pData, addLevels); if (pFullPath) { @@ -1373,7 +1089,7 @@ namespace AZ::IO return result; } - bool Archive::OpenPack(AZStd::string_view szPath, uint32_t nFlags, AZStd::intrusive_ptr pData, + bool Archive::OpenPack(AZStd::string_view szPath, AZStd::intrusive_ptr pData, AZ::IO::FixedMaxPathString* pFullPath, bool addLevels) { auto szFullPath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(szPath); @@ -1385,7 +1101,7 @@ namespace AZ::IO AZStd::string_view bindRoot = szFullPath->ParentPath().Native(); - bool result = OpenPackCommon(bindRoot, szFullPath->Native(), nFlags, pData, addLevels); + bool result = OpenPackCommon(bindRoot, szFullPath->Native(), pData, addLevels); if (pFullPath) { @@ -1396,34 +1112,22 @@ namespace AZ::IO } - bool Archive::OpenPackCommon(AZStd::string_view szBindRoot, AZStd::string_view szFullPath, uint32_t nArchiveFlags, + bool Archive::OpenPackCommon(AZStd::string_view szBindRoot, AZStd::string_view szFullPath, AZStd::intrusive_ptr pData, bool addLevels) { - // Note this will replace @devassets@ with @assets@ to provide a proper bind root for the archives - auto conversionResult = ArchiveInternal::ConvertAbsolutePathToAliasedPath(szBindRoot); - if (!conversionResult) - { - AZ_Error("Archive", false, "Path %.*s cannot be converted to @alias@ form. It is longer than MaxPathLength %zu", - aznumeric_cast(szBindRoot.size()), szBindRoot.data(), AZ::IO::MaxPathLength); - return false; - } - // setup PackDesc before the duplicate test PackDesc desc; - desc.strFileName = szFullPath; + desc.m_strFileName = szFullPath; - if (!conversionResult || conversionResult->empty()) + if (AZ::IO::FixedMaxPath pathBindRoot; !AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pathBindRoot, szBindRoot)) { - desc.m_pathBindRoot = "@assets@"; + AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pathBindRoot, "@assets@"); + desc.m_pathBindRoot = pathBindRoot.LexicallyNormal().String(); } else { - // Create a bind root without any trailing slashes - desc.m_pathBindRoot = AZStd::move(*conversionResult); - if (desc.m_pathBindRoot.HasRelativePath() && !desc.m_pathBindRoot.HasFilename()) - { - desc.m_pathBindRoot = desc.m_pathBindRoot.ParentPath(); - } + // Create a bind root + desc.m_pathBindRoot = pathBindRoot.LexicallyNormal().String(); } // hold the lock from the point we query the zip array, @@ -1433,56 +1137,23 @@ namespace AZ::IO // try to find this - maybe the pack has already been opened for (auto it = m_arrZips.begin(); it != m_arrZips.end(); ++it) { - const char* pFilePath = it->pZip->GetFilePath(); - if (pFilePath == desc.strFileName && it->m_pathBindRoot == desc.m_pathBindRoot) + if (AZ::IO::PathView archiveFilePath = it->pZip->GetFilePath(); + archiveFilePath == desc.m_strFileName && it->m_pathBindRoot == desc.m_pathBindRoot) { return true; // already opened } } } - int flags = INestedArchive::FLAGS_OPTIMIZED_READ_ONLY | INestedArchive::FLAGS_ABSOLUTE_PATHS; - if ((nArchiveFlags & FLAGS_PAK_IN_MEMORY) != 0) - { - flags |= INestedArchive::FLAGS_IN_MEMORY; - } - if ((nArchiveFlags & FLAGS_PAK_IN_MEMORY_CPU) != 0) - { - flags |= INestedArchive::FLAGS_IN_MEMORY_CPU; - } - if ((nArchiveFlags & FLAGS_FILENAMES_AS_CRC32) != 0) - { - flags |= INestedArchive::FLAGS_FILENAMES_AS_CRC32; - } - if ((nArchiveFlags & FLAGS_REDIRECT_TO_DISC) != 0) - { - flags |= FLAGS_REDIRECT_TO_DISC; - } - if ((nArchiveFlags & INestedArchive::FLAGS_OVERRIDE_PAK) != 0) - { - flags |= INestedArchive::FLAGS_OVERRIDE_PAK; - } - if ((nArchiveFlags & FLAGS_LEVEL_PAK_INSIDE_PAK) != 0) - { - flags |= INestedArchive::FLAGS_INSIDE_PAK; - } + const int flags = INestedArchive::FLAGS_OPTIMIZED_READ_ONLY | INestedArchive::FLAGS_ABSOLUTE_PATHS; desc.pArchive = OpenArchive(szFullPath, szBindRoot, flags, pData); if (!desc.pArchive) { return false; // couldn't open the archive } - if (m_filesCachedOnHDD.size()) - { - uint32_t crc = AZ::Crc32(szFullPath); - if (m_filesCachedOnHDD.find(crc) != m_filesCachedOnHDD.end()) - { - uint32_t eFlags = desc.pArchive->GetFlags(); - desc.pArchive->SetFlags(eFlags | INestedArchive::FLAGS_ON_HDD); - } - } - AZ_TracePrintf("Archive", "Opening archive file %.*s\n", aznumeric_cast(szFullPath.size()), szFullPath.data()); + AZ_TracePrintf("Archive", "Opening archive file %.*s\n", AZ_STRING_ARG(szFullPath)); desc.pZip = static_cast(desc.pArchive.get())->GetCache(); AZStd::unique_lock lock(m_csZips); @@ -1493,20 +1164,14 @@ namespace AZ::IO // All we have to do is name the archive appropriately to make // sure later archives added to the current set of archives sort higher // and therefore get used instead of lower sorted archives - AZStd::string_view nextBundle; + AZ::IO::PathView nextBundle; ZipArray::reverse_iterator revItZip = m_arrZips.rbegin(); - if ((nArchiveFlags & INestedArchive::FLAGS_OVERRIDE_PAK) == 0) + for (; revItZip != m_arrZips.rend(); ++revItZip) { - for (; revItZip != m_arrZips.rend(); ++revItZip) + nextBundle = revItZip->GetFullPath(); + if (desc.GetFullPath() > revItZip->GetFullPath()) { - if ((revItZip->pArchive->GetFlags() & INestedArchive::FLAGS_OVERRIDE_PAK) == 0) - { - nextBundle = revItZip->GetFullPath(); - if (azstricmp(desc.GetFullPath(), revItZip->GetFullPath()) > 0) - { - break; - } - } + break; } } @@ -1555,17 +1220,17 @@ namespace AZ::IO } AZ::IO::ArchiveNotificationBus::Broadcast([](AZ::IO::ArchiveNotifications* archiveNotifications, const char* bundleName, - AZStd::shared_ptr bundleManifest, const char* nextBundle, AZStd::shared_ptr bundleCatalog) + AZStd::shared_ptr bundleManifest, const AZ::IO::FixedMaxPath& nextBundle, AZStd::shared_ptr bundleCatalog) { - archiveNotifications->BundleOpened(bundleName, bundleManifest, nextBundle, bundleCatalog); - }, desc.strFileName.c_str(), bundleManifest, nextBundle.data(), bundleCatalog); + archiveNotifications->BundleOpened(bundleName, bundleManifest, nextBundle.c_str(), bundleCatalog); + }, desc.m_strFileName.c_str(), bundleManifest, nextBundle, bundleCatalog); return true; } // after this call, the file will be unlocked and closed, and its contents won't be used to search for files - bool Archive::ClosePack(AZStd::string_view pName, [[maybe_unused]] uint32_t nFlags) + bool Archive::ClosePack(AZStd::string_view pName) { auto szZipPath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pName); if (!szZipPath) @@ -1581,16 +1246,16 @@ namespace AZ::IO AZStd::unique_lock lock(m_csZips); for (auto it = m_arrZips.begin(); it != m_arrZips.end();) { - if (azstricmp(szZipPath->c_str(), it->GetFullPath()) == 0) + if (szZipPath == it->GetFullPath()) { // this is the pack with the given name - remove it, and if possible it will be deleted // the zip is referenced from the archive and *it; the archive is referenced only from *it // // the pZip (cache) can be referenced from stream engine and pseudo-files. // the archive can be referenced from outside - AZ::IO::ArchiveNotificationBus::Broadcast([](AZ::IO::ArchiveNotifications* archiveNotifications, const char* bundleName) + AZ::IO::ArchiveNotificationBus::Broadcast([](AZ::IO::ArchiveNotifications* archiveNotifications, const AZ::IO::FixedMaxPath& bundleName) { - archiveNotifications->BundleClosed(bundleName); + archiveNotifications->BundleClosed(bundleName.c_str()); }, it->GetFullPath()); if (usePrefabSystemForLevels) @@ -1643,7 +1308,7 @@ namespace AZ::IO return foundMatchingPackFile; } - bool Archive::OpenPacks(AZStd::string_view pWildcardIn, uint32_t nFlags, AZStd::vector* pFullPaths) + bool Archive::OpenPacks(AZStd::string_view pWildcardIn, AZStd::vector* pFullPaths) { auto strBindRoot{ AZ::IO::PathView(pWildcardIn).ParentPath() }; AZ::IO::FixedMaxPath bindRoot; @@ -1651,10 +1316,10 @@ namespace AZ::IO { bindRoot = strBindRoot; } - return OpenPacksCommon(bindRoot.Native(), pWildcardIn, nFlags, pFullPaths); + return OpenPacksCommon(bindRoot.Native(), pWildcardIn, pFullPaths); } - bool Archive::OpenPacks(AZStd::string_view szBindRoot, AZStd::string_view pWildcardIn, uint32_t nFlags, AZStd::vector* pFullPaths) + bool Archive::OpenPacks(AZStd::string_view szBindRoot, AZStd::string_view pWildcardIn, AZStd::vector* pFullPaths) { auto bindRoot = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(szBindRoot); if (!bindRoot) @@ -1662,16 +1327,16 @@ namespace AZ::IO AZ_Assert(false, "Unable to resolve path for filepath %.*s", aznumeric_cast(szBindRoot.size()), szBindRoot.data()); return false; } - return OpenPacksCommon(bindRoot->Native(), pWildcardIn, nFlags, pFullPaths); + return OpenPacksCommon(bindRoot->Native(), pWildcardIn, pFullPaths); } - bool Archive::OpenPacksCommon(AZStd::string_view szDir, AZStd::string_view pWildcardIn, uint32_t nArchiveFlags, AZStd::vector* pFullPaths, bool addLevels) + bool Archive::OpenPacksCommon(AZStd::string_view szDir, AZStd::string_view pWildcardIn, AZStd::vector* pFullPaths, bool addLevels) { constexpr AZStd::string_view wildcards{ "*?" }; if (wildcards.find_first_of(pWildcardIn) == AZStd::string_view::npos) { // No wildcards, just open pack - if (OpenPackCommon(szDir, pWildcardIn, nArchiveFlags, nullptr, addLevels)) + if (OpenPackCommon(szDir, pWildcardIn, nullptr, addLevels)) { if (pFullPaths) { @@ -1683,25 +1348,24 @@ namespace AZ::IO if (AZ::IO::ArchiveFileIterator fileIterator = FindFirst(pWildcardIn, IArchive::eFileSearchType_AllowOnDiskOnly); fileIterator) { - AZStd::vector files; + AZStd::vector files; do { - AZStd::string foundFilename{ fileIterator.m_filename }; - AZStd::to_lower(foundFilename.begin(), foundFilename.end()); - files.emplace_back(AZStd::move(foundFilename)); + auto& foundFilename = files.emplace_back(fileIterator.m_filename); + AZStd::to_lower(foundFilename.Native().begin(), foundFilename.Native().end()); } while (fileIterator = FindNext(fileIterator)); - // Open files in alphabet order. + // Open files in alphabetical order. AZStd::sort(files.begin(), files.end()); bool bAllOk = true; - for (const AZStd::string& file : files) + for (const AZ::IO::FixedMaxPath& file : files) { - bAllOk = OpenPackCommon(szDir, file, nArchiveFlags, nullptr, addLevels) && bAllOk; + bAllOk = OpenPackCommon(szDir, file.Native(), nullptr, addLevels) && bAllOk; if (pFullPaths) { - pFullPaths->emplace_back(file.begin(), file.end()); + pFullPaths->emplace_back(AZStd::move(file.Native())); } } @@ -1713,7 +1377,7 @@ namespace AZ::IO } - bool Archive::ClosePacks(AZStd::string_view pWildcardIn, uint32_t nFlags) + bool Archive::ClosePacks(AZStd::string_view pWildcardIn) { auto path = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pWildcardIn); if (!path) @@ -1723,26 +1387,13 @@ namespace AZ::IO } return AZ::IO::FileIOBase::GetDirectInstance()->FindFiles(AZ::IO::FixedMaxPath(path->ParentPath()).c_str(), - AZ::IO::FixedMaxPath(path->Filename()).c_str(), [&](const char* filePath) -> bool + AZ::IO::FixedMaxPath(path->Filename()).c_str(), [this](const char* filePath) -> bool { - ClosePack(filePath, nFlags); + ClosePack(filePath); return true; }); } - - ///////////////////////////////////////////////////// - bool Archive::Init([[maybe_unused]] AZStd::string_view szBasePath) - { - BusConnect(); - return true; - } - - void Archive::Release() - { - BusDisconnect(); - } - ////////////////////////////////////////////////////////////////////////// ArchiveInternal::CZipPseudoFile* Archive::GetPseudoFile(AZ::IO::HandleType fileHandle) const { @@ -1912,36 +1563,6 @@ namespace AZ::IO return m_pFileEntry->nFileDataOffset; } - bool Archive::MakeDir(AZStd::string_view szPathIn) - { - AZ::IO::StackString pathStr{ szPathIn }; - // Determine if there is a period ('.') after the last slash to determine if the path contains a file. - // This used to be a strchr on the whole path which could contain a period in a path, such as network domain paths (domain.user). - size_t findDotFromPos = pathStr.rfind(AZ_CORRECT_FILESYSTEM_SEPARATOR); - if (findDotFromPos == AZ::IO::StackString::npos) - { - findDotFromPos = pathStr.rfind(AZ_WRONG_FILESYSTEM_SEPARATOR); - if (findDotFromPos == AZ::IO::StackString::npos) - { - findDotFromPos = 0; - } - } - size_t dotPos = pathStr.find('.', findDotFromPos); - if (dotPos != AZ::IO::StackString::npos) - { - AZStd::string fullPath; - AZ::StringFunc::Path::GetFullPath(pathStr.c_str(), fullPath); - pathStr = fullPath; - } - - if (pathStr.empty()) - { - return true; - } - - return AZ::IO::FileIOBase::GetDirectInstance()->CreatePath(pathStr.c_str()); - } - ////////////////////////////////////////////////////////////////////////// // open the physical archive file - creates if it doesn't exist // returns nullptr if it's invalid or can't open the file @@ -1962,15 +1583,6 @@ namespace AZ::IO uint32_t nFactoryFlags = 0; - if (nFlags & INestedArchive::FLAGS_IN_MEMORY) - { - nFactoryFlags |= ZipDir::CacheFactory::FLAGS_IN_MEMORY; - } - - if (nFlags & INestedArchive::FLAGS_IN_MEMORY_CPU) - { - nFactoryFlags |= ZipDir::CacheFactory::FLAGS_IN_MEMORY_CPU; - } if (nFlags & INestedArchive::FLAGS_DONT_COMPACT) { @@ -1982,10 +1594,6 @@ namespace AZ::IO nFactoryFlags |= ZipDir::CacheFactory::FLAGS_READ_ONLY; } - if (nFlags & INestedArchive::FLAGS_INSIDE_PAK) - { - nFactoryFlags |= ZipDir::CacheFactory::FLAGS_READ_INSIDE_PAK; - } INestedArchive* pArchive = FindArchive(szFullPath->Native()); if (pArchive) @@ -2016,7 +1624,10 @@ namespace AZ::IO if (!pakOnDisk && (nFactoryFlags & ZipDir::CacheFactory::FLAGS_READ_ONLY)) { // Archive file not found. - AZ_TracePrintf("Archive", "Archive file %s does not exist\n", szFullPath->c_str()); + if (az_archive_verbosity) + { + AZ_TracePrintf("Archive", "Archive file %s does not exist\n", szFullPath->c_str()); + } return nullptr; } @@ -2031,148 +1642,6 @@ namespace AZ::IO return nullptr; } - uint32_t Archive::ComputeCRC(AZStd::string_view szPath, [[maybe_unused]] uint32_t nFileOpenFlags) - { - AZ_Assert(!szPath.empty(), "Path to compute Crc cannot be empty"); - - AZ::Crc32 dwCRC = 0; - - // generate crc32 - { - // avoid heap allocation by working in 8k chunks - const uint32_t dwChunkSize = 1024 * 8; - - // note that the actual CRC algorithm can work on various sized words but operates on individual words - // so there's little difference between feeding it 8k and 8mb, except you might save yourself some io calls. - - uint8_t pMem[dwChunkSize]; - - - AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance(); - if (!fileIO) - { - return ZipDir::ZD_ERROR_INVALID_CALL; - } - - AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; - - if (AZ::IO::PathString filepath{ szPath }; !fileIO->Open(filepath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary, fileHandle)) - { - return ZipDir::ZD_ERROR_INVALID_PATH; - } - // load whole file in chunks and compute CRC - while (true) - { - AZ::u64 bytesRead = 0; - fileIO->Read(fileHandle, pMem, dwChunkSize, false, &bytesRead); // read up to ChunkSize bytes and put the actual number of bytes read into bytesRead. - - if (bytesRead) - { - dwCRC.Add(pMem, aznumeric_caster(bytesRead)); - } - else - { - break; - } - } - - FClose(fileHandle); - } - - return dwCRC; - } - - bool Archive::ComputeMD5(AZStd::string_view szPath, uint8_t* md5, uint32_t nFileOpenFlags, bool useDirectFileAccess) - { - if (szPath.empty() || !md5) - { - return false; - } - - MD5Context context; - MD5Init(&context); - - // generate checksum - { - const AZ::u64 dwChunkSize = 1024 * 1024; // 1MB chunks - AZStd::unique_ptr pMem{ reinterpret_cast(AZ::AllocatorInstance::Get().Allocate(dwChunkSize, alignof(uint8_t))), - [](uint8_t* ptr) { AZ::AllocatorInstance::Get().DeAllocate(ptr); } - }; - - if (!pMem) - { - return false; - } - - AZ::u64 dwSize = 0; - - AZ::IO::PathString filepath{ szPath }; - if (useDirectFileAccess) - { - - AZ::IO::FileIOBase::GetDirectInstance()->Size(filepath.c_str(), dwSize); - } - else - { - AZ::IO::HandleType fileHandle = FOpen(filepath, "rb", nFileOpenFlags); - - if (fileHandle != AZ::IO::InvalidHandle) - { - dwSize = FGetSize(fileHandle); - FClose(fileHandle); - } - } - - // rbx open flags, x is a hint to not cache whole file in memory. - AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; - if (useDirectFileAccess) - { - AZ::IO::FileIOBase::GetDirectInstance()->Open(filepath.c_str(), AZ::IO::OpenMode::ModeRead | AZ::IO::OpenMode::ModeBinary, fileHandle); - } - else - { - fileHandle = FOpen(filepath, "rbx", nFileOpenFlags); - } - - if (fileHandle == AZ::IO::InvalidHandle) - { - return false; - } - - // load whole file in chunks and compute Md5 - while (dwSize > 0) - { - uint64_t dwLocalSize = AZStd::min(dwSize, dwChunkSize); - - AZ::u64 read{ 0 }; - if (useDirectFileAccess) - { - AZ::IO::FileIOBase::GetDirectInstance()->Read(fileHandle, pMem.get(), dwLocalSize, false, &read); - } - else - { - read = FReadRaw(pMem.get(), 1, dwLocalSize, fileHandle); - } - AZ_Assert(read == dwLocalSize, "Failed to read dwLocalSize %" PRIu32 " bytes from file", dwLocalSize); - - MD5Update(&context, pMem.get(), aznumeric_cast(dwLocalSize)); - dwSize -= dwLocalSize; - } - - if (useDirectFileAccess) - { - AZ::IO::FileIOBase::GetDirectInstance()->Close(fileHandle); - } - else - { - FClose(fileHandle); - } - } - - MD5Final(md5, &context); - return true; - } - void Archive::Register(INestedArchive* pArchive) { AZStd::unique_lock lock(m_archiveMutex); @@ -2185,7 +1654,7 @@ namespace AZ::IO AZStd::unique_lock lock(m_archiveMutex); if (pArchive) { - AZ_TracePrintf("Archive", "Closing Archive file: %s\n", pArchive->GetFullPath()); + AZ_TracePrintf("Archive", "Closing Archive file: %.*s\n", AZ_STRING_ARG(pArchive->GetFullPath().Native())); } ArchiveArray::iterator it; if (m_arrArchives.size() < 16) @@ -2212,7 +1681,7 @@ namespace AZ::IO { AZStd::shared_lock lock(m_archiveMutex); auto it = AZStd::lower_bound(m_arrArchives.begin(), m_arrArchives.end(), szFullPath, NestedArchiveSortByName()); - if (it != m_arrArchives.end() && !azstrnicmp(szFullPath.data(), (*it)->GetFullPath(), szFullPath.size())) + if (it != m_arrArchives.end() && szFullPath == (*it)->GetFullPath()) { return *it; } @@ -2280,7 +1749,7 @@ namespace AZ::IO case RFOM_Disabled: default: - AZ_Assert(false, "File record option %d", aznumeric_cast(eList));; + AZ_Assert(false, "File record option %d", aznumeric_cast(eList)); } return nullptr; } @@ -2325,11 +1794,14 @@ namespace AZ::IO if (m_eRecordFileOpenList != IArchive::RFOM_Disabled) { // we only want to record ASSET access - // assets are identified as things which start with no alias, or with the @assets@ alias - auto assetPath = AZ::IO::FileIOBase::GetInstance()->ConvertToAlias(szFilename); - if (assetPath && (assetPath->Native().starts_with("@assets@") - || assetPath->Native().starts_with("@root@") - || assetPath->Native().starts_with("@projectplatformcache@"))) + // assets are identified as files that are relative to the resolved @assets@ alias path + auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); + const char* aliasValue = fileIoBase->GetAlias("@assets@"); + + if (AZ::IO::FixedMaxPath resolvedFilePath; + fileIoBase->ResolvePath(resolvedFilePath, szFilename) + && aliasValue != nullptr + && resolvedFilePath.IsRelativeTo(aliasValue)) { IResourceList* pList = GetResourceList(m_eRecordFileOpenList); @@ -2360,13 +1832,8 @@ namespace AZ::IO bool prev = false; if (threadId == m_mainThreadId) { - prev = m_disableRuntimeFileAccess[0]; - m_disableRuntimeFileAccess[0] = status; - } - else if (threadId == m_renderThreadId) - { - prev = m_disableRuntimeFileAccess[1]; - m_disableRuntimeFileAccess[1] = status; + prev = m_disableRuntimeFileAccess; + m_disableRuntimeFileAccess = status; } return prev; } @@ -2440,16 +1907,6 @@ namespace AZ::IO return AZ::AllocatorInstance::Get().DeAllocate(p); } - void Archive::Lock() - { - m_csMain.lock(); - } - - void Archive::Unlock() - { - m_csMain.unlock(); - } - // gets the current archive priority ArchiveLocationPriority Archive::GetPakPriority() const { @@ -2519,7 +1976,7 @@ namespace AZ::IO { found = true; - info.m_archiveFilename.InitFromRelativePath(archive->GetFilePath()); + info.m_archiveFilename.InitFromRelativePath(archive->GetFilePath().Native()); info.m_offset = pFileData->GetFileDataOffset(); info.m_compressedSize = entry->desc.lSizeCompressed; info.m_uncompressedSize = entry->desc.lSizeUncompressed; @@ -2561,7 +2018,7 @@ namespace AZ::IO ZipDir::CachePtr pZip; uint32_t nArchiveFlags; - ZipDir::FileEntry* pFileEntry = FindPakFileEntry(szFullPath->Native(), nArchiveFlags, &pZip, false); + ZipDir::FileEntry* pFileEntry = FindPakFileEntry(szFullPath->Native(), nArchiveFlags, &pZip); if (!pFileEntry) { return 0; @@ -2589,7 +2046,7 @@ namespace AZ::IO return static_cast(StreamMediaType::TypeHDD); } - bool Archive::SetPacksAccessible(bool bAccessible, AZStd::string_view pWildcard, uint32_t nFlags) + bool Archive::SetPacksAccessible(bool bAccessible, AZStd::string_view pWildcard) { auto filePath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pWildcard); if (!filePath) @@ -2601,24 +2058,24 @@ namespace AZ::IO return AZ::IO::FileIOBase::GetDirectInstance()->FindFiles(AZ::IO::FixedMaxPath(filePath->ParentPath()).c_str(), AZ::IO::FixedMaxPath(filePath->Filename()).c_str(), [&](const char* filePath) -> bool { - SetPackAccessible(bAccessible, filePath, nFlags); + SetPackAccessible(bAccessible, filePath); return true; }); } - bool Archive::SetPackAccessible(bool bAccessible, AZStd::string_view pName, [[maybe_unused]] uint32_t nFlags) + bool Archive::SetPackAccessible(bool bAccessible, AZStd::string_view pName) { auto szZipPath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(pName); if (!szZipPath) { - AZ_Assert(false, "Unable to resolve path for filepath %.*s", aznumeric_cast(pName.size()), pName.data()); + AZ_Assert(false, "Unable to resolve path for filepath %.*s", AZ_STRING_ARG(pName)); return false; } AZStd::unique_lock lock(m_csZips); for (auto it = m_arrZips.begin(); it != m_arrZips.end(); ++it) { - if (!azstricmp(szZipPath->c_str(), it->GetFullPath())) + if (szZipPath == it->GetFullPath()) { return it->pArchive->SetPackAccessible(bAccessible); } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/Archive.h b/Code/Framework/AzFramework/AzFramework/Archive/Archive.h index ec964f7fa3..f08d90a66e 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/Archive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/Archive.h @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -26,7 +27,6 @@ #include #include #include -#include #include #include @@ -115,12 +115,12 @@ namespace AZ::IO struct PackDesc { AZ::IO::Path m_pathBindRoot; // the zip binding root - AZStd::string strFileName; // the zip file name (with path) - very useful for debugging so please don't remove + AZ::IO::Path m_strFileName; // the zip file name (with path) - very useful for debugging so please don't remove // [LYN-2376] Remove once legacy slice support is removed bool m_containsLevelPak = false; // indicates whether this archive has level.pak inside it or not - const char* GetFullPath() const { return pZip->GetFilePath(); } + AZ::IO::PathView GetFullPath() const { return pZip->GetFilePath(); } AZStd::intrusive_ptr pArchive; ZipDir::CachePtr pZip; @@ -129,10 +129,7 @@ namespace AZ::IO // ArchiveFindDataSet entire purpose is to keep a reference to the intrusive_ptr of ArchiveFindData // so that it doesn't go out of scope - using ArchiveFindDataSet = AZStd::set, AZ::OSStdAllocator>; - - // given the source relative path, constructs the full path to the file according to the flags - const char* AdjustFileName(AZStd::string_view src, char* dst, size_t dstSize, uint32_t nFlags, bool skipMods = false) override; + using ArchiveFindDataSet = AZStd::set>; /** @@ -154,29 +151,17 @@ namespace AZ::IO //! CompressionBus Handler implementation. void FindCompressionInfo(bool& found, AZ::IO::CompressionInfo& info, const AZStd::string_view filename) override; - //! Processes an alias command line containing multiple aliases. - void ParseAliases(AZStd::string_view szCommandLine) override; - //! adds or removes an alias from the list - if bAdd set to false will remove it - void SetAlias(AZStd::string_view szName, AZStd::string_view szAlias, bool bAdd) override; - //! gets an alias from the list, if any exist. - //! if bReturnSame==true, it will return the input name if an alias doesn't exist. Otherwise returns nullptr - const char* GetAlias(AZStd::string_view szName, bool bReturnSame = true) override; - // Set the localization folder void SetLocalizationFolder(AZStd::string_view sLocalizationFolder) override; const char* GetLocalizationFolder() const override { return m_sLocalizationFolder.c_str(); } const char* GetLocalizationRoot() const override { return m_sLocalizationRoot.c_str(); } - // lock all the operations - void Lock() override; - void Unlock() override; - // open the physical archive file - creates if it doesn't exist // returns nullptr if it's invalid or can't open the file - AZStd::intrusive_ptr OpenArchive(AZStd::string_view szPath, AZStd::string_view bindRoot = {}, uint32_t nFlags = 0, AZStd::intrusive_ptr pData = nullptr) override; + AZStd::intrusive_ptr OpenArchive(AZStd::string_view szPath, AZStd::string_view bindRoot = {}, uint32_t nArchiveFlags = 0, AZStd::intrusive_ptr pData = nullptr) override; // returns the path to the archive in which the file was opened - const char* GetFileArchivePath(AZ::IO::HandleType fileHandle) override; + AZ::IO::PathView GetFileArchivePath(AZ::IO::HandleType fileHandle) override; ////////////////////////////////////////////////////////////////////////// @@ -192,40 +177,31 @@ namespace AZ::IO void RegisterFileAccessSink(IArchiveFileAccessSink* pSink) override; void UnregisterFileAccessSink(IArchiveFileAccessSink* pSink) override; - bool Init(AZStd::string_view szBasePath) override; - void Release() override; - - bool IsInstalledToHDD(AZStd::string_view acFilePath = 0) const override; - // [LYN-2376] Remove 'addLevels' parameter once legacy slice support is removed - bool OpenPack(AZStd::string_view pName, uint32_t nFlags = 0, AZStd::intrusive_ptr pData = nullptr, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) override; - bool OpenPack(AZStd::string_view szBindRoot, AZStd::string_view pName, uint32_t nFlags = 0, AZStd::intrusive_ptr pData = nullptr, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) override; + bool OpenPack(AZStd::string_view pName, AZStd::intrusive_ptr pData = nullptr, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) override; + bool OpenPack(AZStd::string_view szBindRoot, AZStd::string_view pName, AZStd::intrusive_ptr pData = nullptr, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) override; // after this call, the file will be unlocked and closed, and its contents won't be used to search for files - bool ClosePack(AZStd::string_view pName, uint32_t nFlags = 0) override; - bool OpenPacks(AZStd::string_view pWildcard, uint32_t nFlags = 0, AZStd::vector* pFullPaths = nullptr) override; - bool OpenPacks(AZStd::string_view szBindRoot, AZStd::string_view pWildcard, uint32_t nFlags = 0, AZStd::vector* pFullPaths = nullptr) override; + bool ClosePack(AZStd::string_view pName) override; + bool OpenPacks(AZStd::string_view pWildcard, AZStd::vector* pFullPaths = nullptr) override; + bool OpenPacks(AZStd::string_view szBindRoot, AZStd::string_view pWildcard, AZStd::vector* pFullPaths = nullptr) override; // closes pack files by the path and wildcard - bool ClosePacks(AZStd::string_view pWildcard, uint32_t nFlags = 0) override; + bool ClosePacks(AZStd::string_view pWildcard) override; //returns if a archive exists matching the wildcard bool FindPacks(AZStd::string_view pWildcardIn) override; // prevent access to specific archive files - bool SetPacksAccessible(bool bAccessible, AZStd::string_view pWildcard, uint32_t nFlags = 0) override; - bool SetPackAccessible(bool bAccessible, AZStd::string_view pName, uint32_t nFlags = 0) override; + bool SetPacksAccessible(bool bAccessible, AZStd::string_view pWildcard) override; + bool SetPackAccessible(bool bAccessible, AZStd::string_view pName) override; // returns the file modification time uint64_t GetModificationTime(AZ::IO::HandleType fileHandle) override; - bool LoadPakToMemory(AZStd::string_view pName, EInMemoryArchiveLocation nLoadArchiveToMemory, AZStd::intrusive_ptr pMemoryBlock = nullptr) override; - void LoadPaksToMemory(int nMaxArchiveSize, bool bLoadToMemory) override; - - AZ::IO::HandleType FOpen(AZStd::string_view pName, const char* mode, uint32_t nPathFlags = 0) override; - size_t FReadRaw(void* data, size_t length, size_t elems, AZ::IO::HandleType handle) override; - size_t FReadRawAll(void* data, size_t nFileSize, AZ::IO::HandleType handle) override; + AZ::IO::HandleType FOpen(AZStd::string_view pName, const char* mode) override; + size_t FRead(void* data, size_t bytesToRead, AZ::IO::HandleType handle) override; void* FGetCachedFileData(AZ::IO::HandleType handle, size_t& nFileSize) override; - size_t FWrite(const void* data, size_t length, size_t elems, AZ::IO::HandleType handle) override; + size_t FWrite(const void* data, size_t bytesToWrite, AZ::IO::HandleType handle) override; size_t FSeek(AZ::IO::HandleType handle, uint64_t seek, int mode) override; uint64_t FTell(AZ::IO::HandleType handle) override; int FFlush(AZ::IO::HandleType handle) override; @@ -234,9 +210,7 @@ namespace AZ::IO AZ::IO::ArchiveFileIterator FindNext(AZ::IO::ArchiveFileIterator fileIterator) override; bool FindClose(AZ::IO::ArchiveFileIterator fileIterator) override; int FEof(AZ::IO::HandleType handle) override; - char* FGets(char*, int, AZ::IO::HandleType) override; - int Getc(AZ::IO::HandleType) override; - int FPrintf(AZ::IO::HandleType handle, const char* format, ...) override; + size_t FGetSize(AZ::IO::HandleType fileHandle) override; size_t FGetSize(AZStd::string_view sFilename, bool bAllowUseFileSystem = false) override; bool IsInPak(AZ::IO::HandleType handle) override; @@ -248,9 +222,6 @@ namespace AZ::IO bool IsFolder(AZStd::string_view sPath) override; IArchive::SignedFileSize GetFileSizeOnDisk(AZStd::string_view filename) override; - // creates a directory - bool MakeDir(AZStd::string_view szPath) override; - // compresses the raw data into raw data. The buffer for compressed data itself with the heap passed. Uses method 8 (deflate) // returns one of the Z_* errors (Z_OK upon success) // MT-safe @@ -275,22 +246,12 @@ namespace AZ::IO IResourceList* GetResourceList(ERecordFileOpenList eList) override; void SetResourceList(ERecordFileOpenList eList, IResourceList* pResourceList) override; - uint32_t ComputeCRC(AZStd::string_view szPath, uint32_t nFileOpenFlags = 0) override; - bool ComputeMD5(AZStd::string_view szPath, uint8_t* md5, uint32_t nFileOpenFlags = 0, bool useDirectFileAccess = false) override; - void DisableRuntimeFileAccess(bool status) override { - m_disableRuntimeFileAccess[0] = status; - m_disableRuntimeFileAccess[1] = status; + m_disableRuntimeFileAccess = status; } bool DisableRuntimeFileAccess(bool status, AZStd::thread_id threadId) override; - bool CheckFileAccessDisabled(AZStd::string_view name, const char* mode) override; - - void SetRenderThreadId(AZStd::thread_id renderThreadId) override - { - m_renderThreadId = renderThreadId; - } // gets the current archive priority ArchiveLocationPriority GetPakPriority() const override; @@ -307,11 +268,11 @@ namespace AZ::IO // Return cached file data for entries inside archive file. CCachedFileDataPtr GetOpenedFileDataInZip(AZ::IO::HandleType file); ZipDir::FileEntry* FindPakFileEntry(AZStd::string_view szPath, uint32_t& nArchiveFlags, - ZipDir::CachePtr* pZip = {}, bool bSkipInMemoryArchives = {}) const; + ZipDir::CachePtr* pZip = {}) const; private: - bool OpenPackCommon(AZStd::string_view szBindRoot, AZStd::string_view pName, uint32_t nArchiveFlags, AZStd::intrusive_ptr pData = nullptr, bool addLevels = true); - bool OpenPacksCommon(AZStd::string_view szDir, AZStd::string_view pWildcardIn, uint32_t nArchiveFlags, AZStd::vector* pFullPaths = nullptr, bool addLevels = true); + bool OpenPackCommon(AZStd::string_view szBindRoot, AZStd::string_view pName, AZStd::intrusive_ptr pData = nullptr, bool addLevels = true); + bool OpenPacksCommon(AZStd::string_view szDir, AZStd::string_view pWildcardIn, AZStd::vector* pFullPaths = nullptr, bool addLevels = true); ZipDir::FileEntry* FindPakFileEntry(AZStd::string_view szPath) const; @@ -346,9 +307,6 @@ namespace AZ::IO AZStd::mutex m_cachedFileRawDataMutex; // For m_pCachedFileRawDataSet using RawDataCacheLockGuard = AZStd::scoped_lock; - // The F* emulation functions critical section: protects all F* functions - // that don't have a chance to be called recursively (to avoid deadlocks) - AZStd::mutex m_csMain; mutable AZStd::shared_mutex m_archiveMutex; ArchiveArray m_arrArchives; @@ -360,8 +318,6 @@ namespace AZ::IO ////////////////////////////////////////////////////////////////////////// IArchive::ERecordFileOpenList m_eRecordFileOpenList = RFOM_Disabled; - using RecordedFilesSet = AZStd::set; - RecordedFilesSet m_recordedFilesSet; AZStd::intrusive_ptr m_pEngineStartupResourceList; @@ -372,28 +328,16 @@ namespace AZ::IO float m_fFileAccessTime{}; // Time used to perform file operations AZStd::vector m_FileAccessSinks; // useful for gathering file access statistics - bool m_disableRuntimeFileAccess[2]{}; + bool m_disableRuntimeFileAccess{}; //threads which we don't want to access files from during the game AZStd::thread_id m_mainThreadId{}; - AZStd::thread_id m_renderThreadId{}; AZStd::fixed_string<128> m_sLocalizationFolder; AZStd::fixed_string<128> m_sLocalizationRoot; - AZStd::set, AZ::OSStdAllocator> m_filesCachedOnHDD; - // [LYN-2376] Remove once legacy slice support is removed LevelPackOpenEvent m_levelOpenEvent; LevelPackCloseEvent m_levelCloseEvent; }; } - -namespace AZ::IO::ArchiveInternal -{ - // Utility function to de-alias archive file opening and file-within-archive opening - // if the file specified was an absolute path but it points at one of the aliases, de-alias it and replace it with that alias. - // this works around problems where the level editor is in control but still mounts asset packs (ie, level.pak mounted as @assets@) - AZStd::optional ConvertAbsolutePathToAliasedPath(AZStd::string_view sourcePath, - AZStd::string_view aliasToLookFor = "@devassets@", AZStd::string_view aliasToReplaceWith = "@assets@"); -} diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.cpp index 55f7640785..85ce0b6f9a 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.cpp @@ -5,10 +5,9 @@ * SPDX-License-Identifier: Apache-2.0 OR MIT * */ -#include +#include #include #include // for function<> in the find files callback. -#include #include #include @@ -188,7 +187,7 @@ namespace AZ::IO return IO::ResultCode::Error; } - size_t result = m_archive->FReadRaw(buffer, 1, size, fileHandle); + size_t result = m_archive->FRead(buffer, size, fileHandle); if (bytesRead) { *bytesRead = static_cast(result); @@ -213,7 +212,7 @@ namespace AZ::IO return IO::ResultCode::Error; } - size_t result = m_archive->FWrite(buffer, 1, size, fileHandle); + size_t result = m_archive->FWrite(buffer, size, fileHandle); if (bytesWritten) { *bytesWritten = static_cast(result); @@ -357,14 +356,8 @@ namespace AZ::IO return IO::ResultCode::Error; } - // avoid using AZStd::string if possible - use OSString instead of StringFunc - AZ::OSString destPath(destinationFilePath); + IO::Path destPath(IO::PathView(destinationFilePath).ParentPath()); - AZ::OSString::size_type pos = destPath.find_last_of(AZ_CORRECT_AND_WRONG_FILESYSTEM_SEPARATOR); - if (pos != AZ::OSString::npos) - { - destPath.resize(pos); - } CreatePath(destPath.c_str()); if (!Open(destinationFilePath, IO::OpenMode::ModeWrite | IO::OpenMode::ModeBinary, destinationFile)) @@ -466,31 +459,25 @@ namespace AZ::IO return IO::ResultCode::Error; } - AZStd::fixed_string total = filePath; + AZ::IO::FixedMaxPath total = filePath; if (total.empty()) { return IO::ResultCode::Error; } - if (!total.ends_with(AZ_CORRECT_FILESYSTEM_SEPARATOR) && !total.ends_with(AZ_WRONG_FILESYSTEM_SEPARATOR)) - { - total.append(AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING); - } - - total.append(filter); + total /= filter; AZ::IO::ArchiveFileIterator fileIterator = m_archive->FindFirst(total.c_str()); if (!fileIterator) { return IO::ResultCode::Success; // its not an actual fatal error to not find anything. } - for (;fileIterator; fileIterator = m_archive->FindNext(fileIterator)) + for (; fileIterator; fileIterator = m_archive->FindNext(fileIterator)) { - total = AZStd::fixed_string::format("%s/%.*s", filePath, aznumeric_cast(fileIterator.m_filename.size()), fileIterator.m_filename.data()); - AZStd::optional resolvedAliasLength = ConvertToAlias(total.data(), total.capacity()); - if (resolvedAliasLength) + total = filePath; + total /= fileIterator.m_filename; + if (ConvertToAlias(total, total)) { - total.resize_no_construct(*resolvedAliasLength); if (!callback(total.c_str())) { break; @@ -510,8 +497,13 @@ namespace AZ::IO const auto fileIt = m_trackedFiles.find(fileHandle); if (fileIt != m_trackedFiles.end()) { - AZ_Assert(filenameSize >= fileIt->second.length(), "Filename size %" PRIu64 " is larger than the size of the tracked file %s:%zu", fileIt->second.c_str(), fileIt->second.size()); - azstrncpy(filename, filenameSize, fileIt->second.c_str(), fileIt->second.length()); + const AZStd::string_view trackedFileView = fileIt->second.Native(); + if (filenameSize <= trackedFileView.size()) + { + return false; + } + size_t trackedFileViewLength = trackedFileView.copy(filename, trackedFileView.size()); + filename[trackedFileViewLength] = '\0'; return true; } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h index c99fbb14c5..21cef18a7a 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFileIO.h @@ -13,7 +13,6 @@ #include #include #include -#include namespace AZ::IO @@ -78,7 +77,7 @@ namespace AZ::IO protected: // we keep a list of file names ever opened so that we can easily return it. mutable AZStd::recursive_mutex m_operationGuard; - AZStd::unordered_map, AZStd::equal_to, AZ::OSStdAllocator> m_trackedFiles; + AZStd::unordered_map m_trackedFiles; AZStd::fixed_vector m_copyBuffer; IArchive* m_archive; }; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp index c4c845a832..d7a92efbf6 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.cpp @@ -15,34 +15,6 @@ namespace AZ::IO { - size_t ArchiveFileIteratorHash::operator()(const AZ::IO::ArchiveFileIterator& iter) const - { - return iter.GetHash(); - } - - bool AZStdStringLessCaseInsensitive::operator()(AZStd::string_view left, AZStd::string_view right) const - { - // If one or both strings are 0-length, return true if the left side is smaller, false if they're equal or left is larger. - size_t compareLength = (AZStd::min)(left.size(), right.size()); - if (compareLength == 0) - { - return left.size() < right.size(); - } - - // They're both non-zero, so compare the strings up until the length of the shorter string. - int compareResult = azstrnicmp(left.data(), right.data(), compareLength); - - // If both strings are equal for the number of characters compared, return true if the left side is shorter, false if - // they're equal or left is longer. - if (compareResult == 0) - { - return left.size() < right.size(); - } - - // Return true if the left side should come first alphabetically, false if the right side should. - return compareResult < 0; - } - FileDesc::FileDesc(Attribute fileAttribute, uint64_t fileSize, time_t accessTime, time_t creationTime, time_t writeTime) : nAttrib{ fileAttribute } , nSize{ fileSize } @@ -52,10 +24,9 @@ namespace AZ::IO { } - ArchiveFileIterator::ArchiveFileIterator(FindData* findData, AZStd::string_view filename, const FileDesc& fileDesc) + // ArchiveFileIterator + ArchiveFileIterator::ArchiveFileIterator(FindData* findData) : m_findData{ findData } - , m_filename{ filename } - , m_fileDesc{ fileDesc } { } @@ -73,21 +44,36 @@ namespace AZ::IO return operator++(); } - bool ArchiveFileIterator::operator==(const AZ::IO::ArchiveFileIterator& rhs) const - { - return GetHash() == rhs.GetHash(); - } ArchiveFileIterator::operator bool() const { return m_findData && m_lastFetchValid; } - size_t ArchiveFileIterator::GetHash() const + // FindData::ArchiveFile + FindData::ArchiveFile::ArchiveFile() = default; + FindData::ArchiveFile::ArchiveFile(AZStd::string_view filename, const FileDesc& fileDesc) + : m_filename(filename) + , m_fileDesc(fileDesc) + { + } + size_t FindData::ArchiveFile::GetHash() const { return AZStd::hash{}(m_filename.c_str()); } + bool FindData::ArchiveFile::operator==(const ArchiveFile& rhs) const + { + return GetHash() == rhs.GetHash(); + } + + // FindData::ArchiveFilehash + size_t FindData::ArchiveFileHash::operator()(const ArchiveFile& archiveFile) const + { + return archiveFile.GetHash(); + } + + // FindData void FindData::Scan(IArchive* archive, AZStd::string_view szDir, bool bAllowUseFS, bool bScanZips) { // get the priority into local variable to avoid it changing in the course of @@ -119,40 +105,37 @@ namespace AZ::IO void FindData::ScanFS([[maybe_unused]] IArchive* archive, AZStd::string_view szDirIn) { - AZStd::string searchDirectory; - AZStd::string pattern; + AZ::IO::PathView directory{ szDirIn }; + AZ::IO::FixedMaxPath searchDirectory = directory.ParentPath(); + AZ::IO::FixedMaxPath pattern = directory.Filename(); + auto ScanFileSystem = [this](const char* filePath) -> bool { - AZ::IO::PathString directory{ szDirIn }; - AZ::StringFunc::Path::GetFullPath(directory.c_str(), searchDirectory); - AZ::StringFunc::Path::GetFullFileName(directory.c_str(), pattern); - } - AZ::IO::FileIOBase::GetDirectInstance()->FindFiles(searchDirectory.c_str(), pattern.c_str(), [&](const char* filePath) -> bool - { - AZ::IO::ArchiveFileIterator fileIterator{ nullptr, AZ::IO::PathView(filePath).Filename().Native(), {} }; + ArchiveFile archiveFile{ AZ::IO::PathView(filePath).Filename().Native(), {} }; if (AZ::IO::FileIOBase::GetDirectInstance()->IsDirectory(filePath)) { - fileIterator.m_fileDesc.nAttrib = fileIterator.m_fileDesc.nAttrib | AZ::IO::FileDesc::Attribute::Subdirectory; - m_fileSet.emplace(AZStd::move(fileIterator)); + archiveFile.m_fileDesc.nAttrib = archiveFile.m_fileDesc.nAttrib | AZ::IO::FileDesc::Attribute::Subdirectory; + m_fileSet.emplace(AZStd::move(archiveFile)); } else { if (AZ::IO::FileIOBase::GetDirectInstance()->IsReadOnly(filePath)) { - fileIterator.m_fileDesc.nAttrib = fileIterator.m_fileDesc.nAttrib | AZ::IO::FileDesc::Attribute::ReadOnly; + archiveFile.m_fileDesc.nAttrib = archiveFile.m_fileDesc.nAttrib | AZ::IO::FileDesc::Attribute::ReadOnly; } AZ::u64 fileSize = 0; AZ::IO::FileIOBase::GetDirectInstance()->Size(filePath, fileSize); - fileIterator.m_fileDesc.nSize = fileSize; - fileIterator.m_fileDesc.tWrite = AZ::IO::FileIOBase::GetDirectInstance()->ModificationTime(filePath); + archiveFile.m_fileDesc.nSize = fileSize; + archiveFile.m_fileDesc.tWrite = AZ::IO::FileIOBase::GetDirectInstance()->ModificationTime(filePath); // These times are not supported by our file interface - fileIterator.m_fileDesc.tAccess = fileIterator.m_fileDesc.tWrite; - fileIterator.m_fileDesc.tCreate = fileIterator.m_fileDesc.tWrite; - m_fileSet.emplace(AZStd::move(fileIterator)); + archiveFile.m_fileDesc.tAccess = archiveFile.m_fileDesc.tWrite; + archiveFile.m_fileDesc.tCreate = archiveFile.m_fileDesc.tWrite; + m_fileSet.emplace(AZStd::move(archiveFile)); } return true; - }); + }; + AZ::IO::FileIOBase::GetDirectInstance()->FindFiles(searchDirectory.c_str(), pattern.c_str(), ScanFileSystem); } ////////////////////////////////////////////////////////////////////////// @@ -180,7 +163,7 @@ namespace AZ::IO fileDesc.nAttrib = AZ::IO::FileDesc::Attribute::ReadOnly | AZ::IO::FileDesc::Attribute::Archive; fileDesc.nSize = fileEntry->desc.lSizeUncompressed; fileDesc.tWrite = fileEntry->GetModificationTime(); - m_fileSet.emplace(AZ::IO::ArchiveFileIterator{ this, fname, fileDesc }); + m_fileSet.emplace(fname, fileDesc); } ZipDir::FindDir findDirectoryEntry(zipCache); @@ -193,7 +176,7 @@ namespace AZ::IO } AZ::IO::FileDesc fileDesc; fileDesc.nAttrib = AZ::IO::FileDesc::Attribute::ReadOnly | AZ::IO::FileDesc::Attribute::Archive | AZ::IO::FileDesc::Attribute::Subdirectory; - m_fileSet.emplace(AZ::IO::ArchiveFileIterator{ this, fname, fileDesc }); + m_fileSet.emplace(fname, fileDesc); } }; @@ -208,30 +191,16 @@ namespace AZ::IO // so there's really no way to filter out opening the pack and looking at the files inside. // however, the bind root is not part of the inner zip entry name either // and the ZipDir::FindFile actually expects just the chopped off piece. - // we have to find whats in common between them and check that: + // we have to find the common path segments between them and check that: - auto resolvedBindRoot = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(it->m_pathBindRoot); - if (!resolvedBindRoot) + AZ::IO::FixedMaxPath bindRoot; + if (!AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(bindRoot, it->m_pathBindRoot)) { AZ_Assert(false, "Unable to resolve Path for archive %s bind root %s", it->GetFullPath(), it->m_pathBindRoot.c_str()); return; } - AZ::IO::FixedMaxPath bindRoot{ *resolvedBindRoot }; - auto [bindRootIter, sourcePathIter] = AZStd::mismatch(AZStd::begin(bindRoot), AZStd::end(bindRoot), - AZStd::begin(sourcePath), AZStd::end(sourcePath)); - if (sourcePathIter == AZStd::begin(sourcePath)) - { - // The path has no characters in common , early out the search as filepath is not part of the iterated zip - continue; - } - - AZ::IO::FixedMaxPath sourcePathRemainder; - for (; sourcePathIter != AZStd::end(sourcePath); ++sourcePathIter) - { - sourcePathRemainder /= *sourcePathIter; - } // Example: // "@assets@\\levels\\*" <--- szDir // "@assets@\\" <--- mount point @@ -256,18 +225,26 @@ namespace AZ::IO // then it means that the pack's mount point itself might be a return value, not the files inside the pack // in that case, we compare the mount point remainder itself with the search filter + auto [bindRootIter, sourcePathIter] = AZStd::mismatch(bindRoot.begin(), bindRoot.end(), + sourcePath.begin(), sourcePath.end()); if (bindRootIter != bindRoot.end()) { + AZ::IO::FixedMaxPath sourcePathRemainder; + for (; sourcePathIter != sourcePath.end(); ++sourcePathIter) + { + sourcePathRemainder /= *sourcePathIter; + } + // Retrieve next path component of the mount point remainder - if (!bindRootIter->empty() && AZStd::wildcard_match(sourcePathRemainder.Native(), bindRootIter->Native())) + if (!bindRootIter->empty() && bindRootIter->Match(sourcePathRemainder.Native())) { AZ::IO::FileDesc fileDesc{ AZ::IO::FileDesc::Attribute::ReadOnly | AZ::IO::FileDesc::Attribute::Archive | AZ::IO::FileDesc::Attribute::Subdirectory }; - m_fileSet.emplace(AZ::IO::ArchiveFileIterator{ this, bindRootIter->Native(), fileDesc }); + m_fileSet.emplace(AZStd::move(bindRootIter->Native()), fileDesc); } } else { - + AZ::IO::FixedMaxPath sourcePathRemainder = sourcePath.LexicallyRelative(bindRoot); // if we get here, it means that the search pattern's root and the mount point for this pack are identical // which means we may search inside the pack. ScanInZip(it->pZip.get(), sourcePathRemainder.Native()); @@ -280,17 +257,17 @@ namespace AZ::IO { if (m_fileSet.empty()) { - AZ::IO::ArchiveFileIterator emptyFileIterator; - emptyFileIterator.m_lastFetchValid = false; - emptyFileIterator.m_findData = this; - return emptyFileIterator; + return {}; } // Remove Fetched item from the FindData map so that the iteration continues - AZ::IO::ArchiveFileIterator fileIterator{ *m_fileSet.begin() }; + AZ::IO::ArchiveFileIterator fileIterator; + auto archiveFileIt = m_fileSet.begin(); + fileIterator.m_filename = archiveFileIt->m_filename; + fileIterator.m_fileDesc = archiveFileIt->m_fileDesc; fileIterator.m_lastFetchValid = true; fileIterator.m_findData = this; - m_fileSet.erase(m_fileSet.begin()); + m_fileSet.erase(archiveFileIt); return fileIterator; } } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.h b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.h index 12544d124d..ebdbf45626 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ArchiveFindData.h @@ -36,56 +36,72 @@ namespace AZ::IO AZ_DEFINE_ENUM_BITWISE_OPERATORS(AZ::IO::FileDesc::Attribute); + inline constexpr size_t ArchiveFilenameMaxLength = 256; + using ArchiveFileString = AZStd::fixed_string; + class FindData; + //! This is not really an iterator, but a handle + //! that extends ownership of any found filenames from an archive file or the file system struct ArchiveFileIterator { ArchiveFileIterator() = default; - ArchiveFileIterator(FindData* findData, AZStd::string_view filename, const FileDesc& fileDesc); + explicit ArchiveFileIterator(FindData* findData); ArchiveFileIterator operator++(); ArchiveFileIterator operator++(int); - bool operator==(const AZ::IO::ArchiveFileIterator& rhs) const; - explicit operator bool() const; - size_t GetHash() const; - - inline static constexpr size_t FilenameMaxLength = 256; - AZStd::fixed_string m_filename; + ArchiveFileString m_filename; FileDesc m_fileDesc; - AZStd::intrusive_ptr m_findData{}; private: friend class FindData; + friend class Archive; + AZStd::intrusive_ptr m_findData; bool m_lastFetchValid{}; }; - struct ArchiveFileIteratorHash - { - size_t operator()(const AZ::IO::ArchiveFileIterator& iter) const; - }; - struct AZStdStringLessCaseInsensitive - { - bool operator()(AZStd::string_view left, AZStd::string_view right) const; - - using is_transparent = void; - }; class FindData : public AZStd::intrusive_base { public: AZ_CLASS_ALLOCATOR(FindData, AZ::SystemAllocator, 0); FindData() = default; - AZ::IO::ArchiveFileIterator Fetch(); + ArchiveFileIterator Fetch(); void Scan(IArchive* archive, AZStd::string_view path, bool bAllowUseFS = false, bool bScanZips = true); protected: void ScanFS(IArchive* archive, AZStd::string_view path); + // Populates the FileSet with files within the that match the path pattern that is + // if it refers to a file within a bound archive root or returns the archive root + // path if the path pattern matches it. void ScanZips(IArchive* archive, AZStd::string_view path); - using FileSet = AZStd::unordered_set; + class ArchiveFile + { + public: + friend class FindData; + + ArchiveFile(); + ArchiveFile(AZStd::string_view filename, const FileDesc& fileDesc); + + size_t GetHash() const; + bool operator==(const ArchiveFile& rhs) const; + + private: + ArchiveFileString m_filename; + FileDesc m_fileDesc; + }; + + struct ArchiveFileHash + { + size_t operator()(const ArchiveFile& archiveFile) const; + }; + + using FileSet = AZStd::unordered_set; FileSet m_fileSet; }; + } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h index 5ac417564a..bd9615110a 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/IArchive.h @@ -12,12 +12,10 @@ #include #include #include -#include #include #include #include #include -#include #include @@ -106,66 +104,6 @@ namespace AZ::IO { AZ_RTTI(IArchive, "{764A2260-FF8A-4C86-B958-EBB0B69D9DFA}"); using FileTime = uint64_t; - // Flags used in file path resolution rules - enum EPathResolutionRules - { - // If used, the source path will be treated as the destination path - // and no transformations will be done. Pass this flag when the path is to be the actual - // path on the disk/in the packs and doesn't need adjustment (or after it has come through adjustments already) - // if this is set, AdjustFileName will not map the input path into the folder (Ex: Shaders will not be converted to Game\Shaders) - FLAGS_PATH_REAL = 1 << 16, - - // AdjustFileName will always copy the file path to the destination path: - // regardless of the returned value, szDestpath can be used - FLAGS_COPY_DEST_ALWAYS = 1 << 17, - - // Adds trailing slash to the path - FLAGS_ADD_TRAILING_SLASH = 1L << 18, - - // if this is set, AdjustFileName will not make relative paths into full paths - FLAGS_NO_FULL_PATH = 1 << 21, - - // if this is set, AdjustFileName will redirect path to disc - FLAGS_REDIRECT_TO_DISC = 1 << 22, - - // if this is set, AdjustFileName will not adjust path for writing files - FLAGS_FOR_WRITING = 1 << 23, - - // if this is set, the archive would be stored in memory (gpu) - FLAGS_PAK_IN_MEMORY = 1 << 25, - - // Store all file names as crc32 in a flat directory structure. - FLAGS_FILENAMES_AS_CRC32 = 1 << 26, - - // if this is set, AdjustFileName will try to find the file under any mod paths we know about - FLAGS_CHECK_MOD_PATHS = 1 << 27, - - // if this is set, AdjustFileName will always check the filesystem/disk and not check inside open archives - FLAGS_NEVER_IN_PAK = 1 << 28, - - // returns existing file name from the local data or existing cache file name - // used by the resource compiler to pass the real file name - FLAGS_RESOLVE_TO_CACHE = 1 << 29, - - // if this is set, the archive would be stored in memory (cpu) - FLAGS_PAK_IN_MEMORY_CPU = 1 << 30, - - // if this is set, the level pak is inside another archive - FLAGS_LEVEL_PAK_INSIDE_PAK = 1 << 31, - }; - - // Used for widening FOpen functionality. They're ignored for the regular File System files. - enum EFOpenFlags - { - // If possible, will prevent the file from being read from memory. - FOPEN_HINT_DIRECT_OPERATION = 1, - // Will prevent a "missing file" warnings to be created. - FOPEN_HINT_QUIET = 1 << 1, - // File should be on disk - FOPEN_ONDISK = 1 << 2, - // Open is done by the streaming thread. - FOPEN_FORSTREAMING = 1 << 3, - }; // enum ERecordFileOpenList @@ -175,8 +113,6 @@ namespace AZ::IO RFOM_Level, // during level loading till export2game -> resourcelist.txt, used to generate the list for level2level loading RFOM_NextLevel // used for level2level loading }; - // the size of the buffer that receives the full path to the file - inline static constexpr size_t MaxPath = 1024; //file location enum used in isFileExist to control where the archive system looks for the file. enum EFileSearchLocation @@ -205,63 +141,31 @@ namespace AZ::IO virtual ~IArchive() = default; - /** - * Deprecated: Use the AZ::IO::FileIOBase::ResolvePath function below that doesn't accept the nFlags or skipMods parameters - * given the source relative path, constructs the full path to the file according to the flags - * returns the pointer to the constructed path (can be either szSourcePath, or szDestPath, or NULL in case of error - */ - // - virtual const char* AdjustFileName(AZStd::string_view src, char* dst, size_t dstSize, uint32_t nFlags, bool skipMods = false) = 0; - - virtual bool Init(AZStd::string_view szBasePath) = 0; - virtual void Release() = 0; - - // Summary: - // Returns true if given archivepath is installed to HDD - // If no file path is given it will return true if whole application is installed to HDD - virtual bool IsInstalledToHDD(AZStd::string_view acFilePath = 0) const = 0; - // after this call, the archive file will be searched for files when they aren't on the OS file system // Arguments: // pName - must not be 0 - virtual bool OpenPack(AZStd::string_view pName, uint32_t nFlags = FLAGS_PATH_REAL, AZStd::intrusive_ptr pData = {}, + virtual bool OpenPack(AZStd::string_view pName, AZStd::intrusive_ptr pData = {}, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) = 0; // after this call, the archive file will be searched for files when they aren't on the OS file system - virtual bool OpenPack(AZStd::string_view pBindingRoot, AZStd::string_view pName, uint32_t nFlags = FLAGS_PATH_REAL, + virtual bool OpenPack(AZStd::string_view pBindingRoot, AZStd::string_view pName, AZStd::intrusive_ptr pData = {}, AZ::IO::FixedMaxPathString* pFullPath = nullptr, bool addLevels = true) = 0; // after this call, the file will be unlocked and closed, and its contents won't be used to search for files - virtual bool ClosePack(AZStd::string_view pName, uint32_t nFlags = FLAGS_PATH_REAL) = 0; + virtual bool ClosePack(AZStd::string_view pName) = 0; // opens pack files by the path and wildcard - virtual bool OpenPacks(AZStd::string_view pWildcard, uint32_t nFlags = FLAGS_PATH_REAL, AZStd::vector* pFullPaths = nullptr) = 0; + virtual bool OpenPacks(AZStd::string_view pWildcard, AZStd::vector* pFullPaths = nullptr) = 0; // opens pack files by the path and wildcard - virtual bool OpenPacks(AZStd::string_view pBindingRoot, AZStd::string_view pWildcard, uint32_t nFlags = FLAGS_PATH_REAL, + virtual bool OpenPacks(AZStd::string_view pBindingRoot, AZStd::string_view pWildcard, AZStd::vector* pFullPaths = nullptr) = 0; // closes pack files by the path and wildcard - virtual bool ClosePacks(AZStd::string_view pWildcard, uint32_t nFlags = FLAGS_PATH_REAL) = 0; + virtual bool ClosePacks(AZStd::string_view pWildcard) = 0; //returns if a archive exists matching the wildcard virtual bool FindPacks(AZStd::string_view pWildcardIn) = 0; // Set access status of a archive files with a wildcard - virtual bool SetPacksAccessible(bool bAccessible, AZStd::string_view pWildcard, uint32_t nFlags = FLAGS_PATH_REAL) = 0; + virtual bool SetPacksAccessible(bool bAccessible, AZStd::string_view pWildcard) = 0; // Set access status of a pack file - virtual bool SetPackAccessible(bool bAccessible, AZStd::string_view pName, uint32_t nFlags = FLAGS_PATH_REAL) = 0; - - // Load or unload archive file completely to memory. - virtual bool LoadPakToMemory(AZStd::string_view pName, EInMemoryArchiveLocation eLoadToMemory, AZStd::intrusive_ptr pMemoryBlock = nullptr) = 0; - virtual void LoadPaksToMemory(int nMaxArchiveSize, bool bLoadToMemory) = 0; - - // Processes an alias command line containing multiple aliases. - virtual void ParseAliases(AZStd::string_view szCommandLine) = 0; - // adds or removes an alias from the list - virtual void SetAlias(AZStd::string_view szName, AZStd::string_view szAlias, bool bAdd) = 0; - // gets an alias from the list, if any exist. - // if bReturnSame==true, it will return the input name if an alias doesn't exist. Otherwise returns NULL - virtual const char* GetAlias(AZStd::string_view szName, bool bReturnSame = true) = 0; - - // lock all the operations - virtual void Lock() = 0; - virtual void Unlock() = 0; + virtual bool SetPackAccessible(bool bAccessible, AZStd::string_view pName) = 0; // Set and Get the localization folder name (Languages, Localization, ...) virtual void SetLocalizationFolder(AZStd::string_view sLocalizationFolder) = 0; @@ -273,28 +177,19 @@ namespace AZ::IO // ex: AZ::IO::HandleType fileHandle = FOpen( "test.txt","rbx" ); // mode x is a direct access mode, when used file reads will go directly into the low level file system without any internal data caching. // Text mode is not supported for files in Archives. - // for nFlags @see IArchive::EFOpenFlags - virtual AZ::IO::HandleType FOpen(AZStd::string_view pName, const char* mode, uint32_t nFlags = 0) = 0; - - // Read raw data from file, no endian conversion. - virtual size_t FReadRaw(void* data, size_t length, size_t elems, AZ::IO::HandleType fileHandle) = 0; - - // Read all file contents into the provided memory, nSizeOfFile must be the same as returned by GetFileSize(handle) - // Current seek pointer is ignored and reseted to 0. - // no endian conversion. - virtual size_t FReadRawAll(void* data, size_t nFileSize, AZ::IO::HandleType fileHandle) = 0; + virtual AZ::IO::HandleType FOpen(AZStd::string_view pName, const char* mode) = 0; // Get pointer to the internally cached, loaded data of the file. // WARNING! The returned pointer is only valid while the fileHandle has not been closed. virtual void* FGetCachedFileData(AZ::IO::HandleType fileHandle, size_t& nFileSize) = 0; - // Write file data, cannot be used for writing into the Archive. - // Use INestedArchive interface for writing into the archivefiles. - virtual size_t FWrite(const void* data, size_t length, size_t elems, AZ::IO::HandleType fileHandle) = 0; + // Read raw data from file, no endian conversion. + virtual size_t FRead(void* data, size_t bytesToRead, AZ::IO::HandleType fileHandle) = 0; + + // Write file data, cannot be used for writing into the Archive. + // Use INestedArchive interface for writing into the archive files. + virtual size_t FWrite(const void* data, size_t bytesToWrite, AZ::IO::HandleType fileHandle) = 0; - virtual int FPrintf(AZ::IO::HandleType fileHandle, const char* format, ...) = 0; - virtual char* FGets(char*, int, AZ::IO::HandleType) = 0; - virtual int Getc(AZ::IO::HandleType) = 0; virtual size_t FGetSize(AZ::IO::HandleType fileHandle) = 0; virtual size_t FGetSize(AZStd::string_view pName, bool bAllowUseFileSystem = false) = 0; virtual bool IsInPak(AZ::IO::HandleType fileHandle) = 0; @@ -318,7 +213,6 @@ namespace AZ::IO virtual AZStd::intrusive_ptr PoolAllocMemoryBlock(size_t nSize, const char* sUsage, size_t nAlign = 1) = 0; // Arguments: - // nFlags is a combination of EPathResolutionRules flags. virtual ArchiveFileIterator FindFirst(AZStd::string_view pDir, EFileSearchType searchType = eFileSearchType_AllowInZipsOnly) = 0; virtual ArchiveFileIterator FindNext(AZ::IO::ArchiveFileIterator handle) = 0; virtual bool FindClose(AZ::IO::ArchiveFileIterator handle) = 0; @@ -334,9 +228,6 @@ namespace AZ::IO virtual IArchive::SignedFileSize GetFileSizeOnDisk(AZStd::string_view filename) = 0; - // creates a directory - virtual bool MakeDir(AZStd::string_view szPath) = 0; - // open the physical archive file - creates if it doesn't exist // returns NULL if it's invalid or can't open the file // nFlags is a combination of flags from EArchiveFlags enum. @@ -344,8 +235,8 @@ namespace AZ::IO AZStd::intrusive_ptr pData = nullptr) = 0; // returns the path to the archive in which the file was opened - // returns NULL if the file is a physical file, and "" if the path to archive is unknown (shouldn't ever happen) - virtual const char* GetFileArchivePath(AZ::IO::HandleType fileHandle) = 0; + // returns empty path view if the file is a physical file + virtual AZ::IO::PathView GetFileArchivePath(AZ::IO::HandleType fileHandle) = 0; // compresses the raw data into raw data. The buffer for compressed data itself with the heap passed. Uses method 8 (deflate) // returns one of the Z_* errors (Z_OK upon success) @@ -378,25 +269,7 @@ namespace AZ::IO // get the current mode, can be set by RecordFileOpen() virtual IArchive::ERecordFileOpenList GetRecordFileOpenList() = 0; - // computes CRC (zip compatible) for a file - // useful if a huge uncompressed file is generation in non continuous way - // good for big files - low memory overhead (1MB) - // Arguments: - // szPath - must not be 0 - // Returns: - // error code - virtual uint32_t ComputeCRC(AZStd::string_view szPath, uint32_t nFileOpenFlags = 0) = 0; - - // computes MD5 checksum for a file - // good for big files - low memory overhead (1MB) - // Arguments: - // szPath - must not be 0 - // md5 - destination array of uint8_t [16] - // Returns: - // true if success, false on failure - virtual bool ComputeMD5(AZStd::string_view szPath, uint8_t* md5, uint32_t nFileOpenFlags = 0, bool useDirectFileAccess = false) = 0; - - // useful for gathering file access statistics, assert if it was inserted already but then it does not become insersted + // useful for gathering file access statistics, assert if it was inserted already but then it does not become inserted // Arguments: // pSink - must not be 0 virtual void RegisterFileAccessSink(IArchiveFileAccessSink* pSink) = 0; @@ -408,8 +281,6 @@ namespace AZ::IO // When enabled, files accessed at runtime will be tracked virtual void DisableRuntimeFileAccess(bool status) = 0; virtual bool DisableRuntimeFileAccess(bool status, AZStd::thread_id threadId) = 0; - virtual bool CheckFileAccessDisabled(AZStd::string_view name, const char* mode) = 0; - virtual void SetRenderThreadId(AZStd::thread_id renderThreadId) = 0; // gets the current pak priority virtual ArchiveLocationPriority GetPakPriority() const = 0; @@ -431,21 +302,6 @@ namespace AZ::IO using LevelPackCloseEvent = AZ::Event; virtual auto GetLevelPackCloseEvent()->LevelPackCloseEvent* = 0; - // Type-safe endian conversion read. - template - size_t FRead(T* data, size_t elems, AZ::IO::HandleType fileHandle, bool bSwapEndian = false) - { - size_t count = FReadRaw(data, sizeof(T), elems, fileHandle); - SwapEndian(data, count, bSwapEndian); - return count; - } - // Type-independent Write. - template - void FWrite(T* data, size_t elems, AZ::IO::HandleType fileHandle) - { - FWrite((void*)data, sizeof(T), elems, fileHandle); - } - inline static constexpr IArchive::SignedFileSize FILE_NOT_PRESENT = -1; }; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h index b45d705259..f85fd273ce 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/INestedArchive.h @@ -9,9 +9,9 @@ #pragma once +#include #include #include -#include #include namespace AZ::IO @@ -71,28 +71,10 @@ namespace AZ::IO // multiple times FLAGS_DONT_COMPACT = 1 << 5, - // flag is set when complete pak has been loaded into memory - FLAGS_IN_MEMORY = 1 << 6, - FLAGS_IN_MEMORY_CPU = 1 << 7, - FLAGS_IN_MEMORY_MASK = FLAGS_IN_MEMORY | FLAGS_IN_MEMORY_CPU, - - // Store all file names as crc32 in a flat directory structure. - FLAGS_FILENAMES_AS_CRC32 = 1 << 8, - - // flag is set when pak is stored on HDD - FLAGS_ON_HDD = 1 << 9, - - //Override pak - paks opened with this flag go at the end of the list and contents will be found before other paks - //Used for patching - FLAGS_OVERRIDE_PAK = 1 << 10, - // Disable a pak file without unloading it, this flag is used in combination with patches and multiplayer - // to ensure that specific paks stay in the position(to keep the same priority) but beeing disabled + // to ensure that specific paks stay in the position(to keep the same priority) but being disabled // when running multiplayer FLAGS_DISABLE_PAK = 1 << 11, - - // flag is set when pak is inside another pak - FLAGS_INSIDE_PAK = 1 << 12, }; using Handle = void*; @@ -122,7 +104,7 @@ namespace AZ::IO virtual int StartContinuousFileUpdate(AZStd::string_view szRelativePath, uint64_t nSize) = 0; // Summary: - // Adds a new file to the zip or update an existing's segment if it is not compressed - just stored + // Adds a new file to the zip or update an existing segment if it is not compressed - just stored // adds a directory (creates several nested directories if needed) // ( name might be misleading as if nOverwriteSeekPos is used the update is not continuous ) // Arguments: @@ -164,7 +146,7 @@ namespace AZ::IO // Summary: // Get the full path to the archive file. - virtual const char* GetFullPath() const = 0; + virtual AZ::IO::PathView GetFullPath() const = 0; // Summary: // Get the flags of this object. diff --git a/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.cpp b/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.cpp index dc1d4aa864..1e0f237df5 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.cpp @@ -174,7 +174,7 @@ namespace AZ::IO return m_pCache->ReadFile(reinterpret_cast(fileHandle), nullptr, pBuffer); } - const char* NestedArchive::GetFullPath() const + AZ::IO::PathView NestedArchive::GetFullPath() const { return m_pCache->GetFilePath(); } @@ -193,19 +193,9 @@ namespace AZ::IO if (nFlagsToSet & FLAGS_RELATIVE_PATHS_ONLY) { m_nFlags |= FLAGS_RELATIVE_PATHS_ONLY; - } - - if (nFlagsToSet & FLAGS_ON_HDD) - { - m_nFlags |= FLAGS_ON_HDD; - } - - if (nFlagsToSet & FLAGS_RELATIVE_PATHS_ONLY || - nFlagsToSet & FLAGS_ON_HDD) - { - // we don't support changing of any other flags return true; } + return false; } @@ -252,20 +242,12 @@ namespace AZ::IO return AZ::IO::FixedMaxPathString{ szRelativePath }; } - if ((szRelativePath.size() > 1 && szRelativePath[1] == ':') || (m_nFlags & FLAGS_ABSOLUTE_PATHS)) + if ((m_nFlags & FLAGS_ABSOLUTE_PATHS) == FLAGS_ABSOLUTE_PATHS) { // make the normalized full path and try to match it against the binding root of this object - auto resolvedPath = AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(szRelativePath); - - // Make sure the resolve path is longer than the bind root and that it starts with the bind root - if (!resolvedPath || resolvedPath->Native().size() <= m_strBindRoot.size() || azstrnicmp(resolvedPath->c_str(), m_strBindRoot.c_str(), m_strBindRoot.size()) != 0) - { - return {}; - } - - // Remove the bind root prefix from the resolved path - resolvedPath->Native().erase(0, m_strBindRoot.size() + 1); - return resolvedPath->Native(); + AZ::IO::FixedMaxPath resolvedPath; + AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(resolvedPath, szRelativePath); + return resolvedPath.LexicallyProximate(m_strBindRoot).Native(); } return AZ::IO::FixedMaxPathString{ szRelativePath }; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h b/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h index eac98b2f07..34bbcdc201 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/NestedArchive.h @@ -19,15 +19,15 @@ namespace AZ::IO { bool operator()(const INestedArchive* left, const INestedArchive* right) const { - return azstricmp(left->GetFullPath(), right->GetFullPath()) < 0; + return left->GetFullPath() < right->GetFullPath(); } bool operator()(AZStd::string_view left, const INestedArchive* right) const { - return azstrnicmp(left.data(), right->GetFullPath(), left.size()) < 0; + return AZ::IO::PathView(left) < right->GetFullPath(); } bool operator()(const INestedArchive* left, AZStd::string_view right) const { - return azstrnicmp(left->GetFullPath(), right.data(), right.size()) < 0; + return left->GetFullPath() < AZ::IO::PathView(right); } }; @@ -78,7 +78,7 @@ namespace AZ::IO int ReadFile(Handle fileHandle, void* pBuffer) override; // returns the full path to the archive file - const char* GetFullPath() const override; + AZ::IO::PathView GetFullPath() const override; ZipDir::Cache* GetCache(); uint32_t GetFlags() const override; @@ -95,7 +95,7 @@ namespace AZ::IO ZipDir::CachePtr m_pCache; // the binding root may be empty string - in this case, the absolute path binding won't work - AZStd::string m_strBindRoot; + AZ::IO::Path m_strBindRoot; IArchive* m_archive{}; uint32_t m_nFlags{}; }; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp index 81f26d78b8..328541c4d0 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include @@ -104,24 +103,21 @@ namespace AZ::IO::ZipDir : m_pCache(pCache) , m_bCommitted(false) { - AZ::IO::PathString normalizedPath{ szRelativePath }; - AZ::StringFunc::Path::Normalize(normalizedPath); - AZStd::to_lower(AZStd::begin(normalizedPath), AZStd::end(normalizedPath)); // Update the cache string pool with the relative path to the file - auto pathIt = m_pCache->m_relativePathPool.emplace(normalizedPath); + auto pathIt = m_pCache->m_relativePathPool.emplace(AZ::IO::PathView(szRelativePath).LexicallyNormal()); m_szRelativePath = *pathIt.first; // this is the name of the directory - create it or find it - m_pFileEntry = m_pCache->GetRoot()->Add(m_szRelativePath); + m_pFileEntry = m_pCache->GetRoot()->Add(m_szRelativePath.Native()); if (m_pFileEntry && az_archive_zip_directory_cache_verbosity) { - AZ_TracePrintf("Archive", R"(File "%s" has been added to archive at root "%s")", normalizedPath.c_str(), pCache->GetFilePath()); + AZ_TracePrintf("Archive", R"(File "%s" has been added to archive at root "%s")", pathIt.first->c_str(), pCache->GetFilePath()); } } ~FileEntryTransactionAdd() { if (m_pFileEntry && !m_bCommitted) { - m_pCache->RemoveFile(m_szRelativePath); + m_pCache->RemoveFile(m_szRelativePath.Native()); m_pCache->m_relativePathPool.erase(m_szRelativePath); } } @@ -131,11 +127,11 @@ namespace AZ::IO::ZipDir } AZStd::string_view GetRelativePath() const { - return m_szRelativePath; + return m_szRelativePath.Native(); } private: Cache* m_pCache; - AZStd::string_view m_szRelativePath; + AZ::IO::PathView m_szRelativePath; FileEntry* m_pFileEntry; bool m_bCommitted; }; @@ -587,34 +583,27 @@ namespace AZ::IO::ZipDir // deletes the file from the archive ErrorEnum Cache::RemoveFile(AZStd::string_view szRelativePathSrc) { - // Normalize and lower case the relative path - AZ::IO::PathString szRelativePath{ szRelativePathSrc }; - AZ::StringFunc::Path::Normalize(szRelativePath); - AZStd::to_lower(AZStd::begin(szRelativePath), AZStd::end(szRelativePath)); - AZStd::string_view normalizedRelativePath = szRelativePath; - - // find the last slash in the path - size_t slashOffset = normalizedRelativePath.find_last_of(AZ_CORRECT_AND_WRONG_FILESYSTEM_SEPARATOR); + AZ::IO::PathView szRelativePath{ szRelativePathSrc }; AZStd::string_view fileName; // the name of the file to delete FileEntryTree* pDir; // the dir from which the subdir will be deleted - if (slashOffset != AZStd::string_view::npos) + if (szRelativePath.HasParentPath()) { FindDir fd(GetRoot()); // the directory to remove - pDir = fd.FindExact(normalizedRelativePath.substr(0, slashOffset)); + pDir = fd.FindExact(szRelativePath.ParentPath()); if (!pDir) { return ZD_ERROR_DIR_NOT_FOUND;// there is no such directory } - fileName = normalizedRelativePath.substr(slashOffset + 1); + fileName = szRelativePath.Filename().Native(); } else { pDir = GetRoot(); - fileName = normalizedRelativePath; + fileName = szRelativePath.Native(); } ErrorEnum e = pDir->RemoveFile(fileName); @@ -625,7 +614,7 @@ namespace AZ::IO::ZipDir if (az_archive_zip_directory_cache_verbosity) { AZ_TracePrintf("Archive", R"(File "%.*s" has been remove from archive at root "%s")", - aznumeric_cast(fileName.size()), fileName.data(), GetFilePath()); + AZ_STRING_ARG(szRelativePath.Native()), GetFilePath()); } } return e; @@ -635,45 +624,38 @@ namespace AZ::IO::ZipDir // deletes the directory, with all its descendants (files and subdirs) ErrorEnum Cache::RemoveDir(AZStd::string_view szRelativePathSrc) { - // Normalize and lower case the relative path - AZ::IO::PathString szRelativePath{ szRelativePathSrc }; - AZ::StringFunc::Path::Normalize(szRelativePath); - AZStd::to_lower(AZStd::begin(szRelativePath), AZStd::end(szRelativePath)); - AZStd::string_view normalizedRelativePath = szRelativePath; - - // find the last slash in the path - size_t slashOffset = normalizedRelativePath.find_last_of(AZ_CORRECT_AND_WRONG_FILESYSTEM_SEPARATOR); + AZ::IO::PathView szRelativePath{ szRelativePathSrc }; AZStd::string_view dirName; // the name of the dir to delete FileEntryTree* pDir; // the dir from which the subdir will be deleted - if (slashOffset != AZStd::string_view::npos) + if (szRelativePath.HasParentPath()) { FindDir fd(GetRoot()); // the directory to remove - pDir = fd.FindExact(normalizedRelativePath.substr(0, slashOffset)); + pDir = fd.FindExact(szRelativePath.ParentPath()); if (!pDir) { return ZD_ERROR_DIR_NOT_FOUND;// there is no such directory } - dirName = normalizedRelativePath.substr(slashOffset + 1); + dirName = szRelativePath.Filename().Native(); } else { pDir = GetRoot(); - dirName = normalizedRelativePath; + dirName = szRelativePath.Native(); } - ErrorEnum e = pDir->RemoveDir(normalizedRelativePath); + ErrorEnum e = pDir->RemoveDir(dirName); if (e == ZD_ERROR_SUCCESS) { m_nFlags |= FLAGS_UNCOMPACTED | FLAGS_CDR_DIRTY; if (az_archive_zip_directory_cache_verbosity) { - AZ_TracePrintf("Archive", R"(File "%.*s" has been remove from archive at root "%s")", - aznumeric_cast(normalizedRelativePath.size()), normalizedRelativePath.data(), GetFilePath()); + AZ_TracePrintf("Archive", R"(Directory "%.*s" has been remove from archive at root "%s")", + AZ_STRING_ARG(szRelativePath.Native()), GetFilePath()); } } return e; @@ -769,9 +751,7 @@ namespace AZ::IO::ZipDir // finds the file by exact path FileEntry* Cache::FindFile(AZStd::string_view szPathSrc, [[maybe_unused]] bool bFullInfo) { - AZ::IO::PathString szPath{ szPathSrc }; - AZ::StringFunc::Path::Normalize(szPath); - AZStd::to_lower(AZStd::begin(szPath), AZStd::end(szPath)); + AZ::IO::PathView szPath{ szPathSrc }; ZipDir::FindFile fd(GetRoot()); FileEntry* fileEntry = fd.FindExact(szPath); @@ -779,19 +759,13 @@ namespace AZ::IO::ZipDir { if (az_archive_zip_directory_cache_verbosity) { - AZ_TracePrintf("Archive", "FindExact failed to find file %s at root %s", szPath.c_str(), GetFilePath()); + AZ_TracePrintf("Archive", "FindExact failed to find file %.*s at root %s", AZ_STRING_ARG(szPath.Native()), GetFilePath()); } return {}; } return fileEntry; } - // returns the size of memory occupied by the instance referred to by this cache - size_t Cache::GetSize() const - { - return sizeof(*this) + m_strFilePath.capacity() + m_treeDir.GetSize() - sizeof(m_treeDir); - } - // refreshes information about the given file entry into this file entry ErrorEnum Cache::Refresh(FileEntryBase* pFileEntry) { diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.h b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.h index 35bf0ae251..646410f8db 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCache.h @@ -16,6 +16,7 @@ #pragma once #include +#include #include #include #include @@ -89,9 +90,6 @@ namespace AZ::IO::ZipDir // refreshes information about the given file entry into this file entry ErrorEnum Refresh(FileEntryBase* pFileEntry); - // returns the size of memory occupied by the instance of this cache - size_t GetSize() const; - // QUICK check to determine whether the file entry belongs to this object bool IsOwnerOf(const FileEntry* pFileEntry) const { @@ -100,9 +98,9 @@ namespace AZ::IO::ZipDir // returns the string - path to the zip file from which this object was constructed. // this will be "" if the object was constructed with a factory that wasn't created with FLAGS_MEMORIZE_ZIP_PATH - const char* GetFilePath() const + AZ::IO::PathView GetFilePath() const { - return m_strFilePath.c_str(); + return m_strFilePath; } FileEntryTree* GetRoot() @@ -135,10 +133,10 @@ namespace AZ::IO::ZipDir FileEntryTree m_treeDir; AZ::IO::HandleType m_fileHandle; AZ::IAllocatorAllocate* m_allocator; - AZStd::string m_strFilePath; + AZ::IO::Path m_strFilePath; // String Pool for persistently storing paths as long as they reside in the cache - AZStd::unordered_set m_relativePathPool; + AZStd::unordered_set m_relativePathPool; // offset to the start of CDR in the file,even if there's no CDR there currently // when a new file is added, it can start from here, but this value will need to be updated then diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.cpp index 0092c7c8f8..6adab594ed 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.cpp @@ -41,13 +41,6 @@ namespace AZ::IO::ZipDir m_encryptedHeaders = ZipFile::HEADERS_NOT_ENCRYPTED; m_signedHeaders = ZipFile::HEADERS_NOT_SIGNED; - if (m_nFlags & FLAGS_FILENAMES_AS_CRC32) - { - m_bBuildFileEntryMap = false; - m_bBuildFileEntryTree = false; - m_bBuildOptimizedFileEntry = true; - } - if (m_nFlags & FLAGS_READ_INSIDE_PAK) { m_fileExt.m_fileIOBase = AZ::IO::FileIOBase::GetInstance(); @@ -88,12 +81,12 @@ namespace AZ::IO::ZipDir if (m_fileExt.m_fileHandle == AZ::IO::InvalidHandle) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Could not open file in binary mode for reading"); + AZ_Warning("Archive", false, R"(ZD_ERROR_IO_FAILED: Could not open file "%s" in binary mode for reading)", szFileName); return {}; } if (!ReadCache(*pCache)) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Could not read the CDR of the pack file."); + AZ_Warning("Archive", false, R"(ZD_ERROR_IO_FAILED: Could not read the CDR of the pack file "%s".)", pCache->m_strFilePath.c_str()); return {}; } } @@ -113,12 +106,12 @@ namespace AZ::IO::ZipDir size_t nFileSize = (size_t)Tell(); Seek(0, SEEK_SET); - AZ_Assert(nFileSize != 0, "File of size 0 will not be open for reading"); + AZ_Warning("Archive", nFileSize != 0, R"(ZD_ERROR_IO_FAILED: File "%s" with size 0 will not be open for reading)", szFileName); if (nFileSize) { if (!ReadCache(*pCache)) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Could not open file in binary mode for reading"); + AZ_Warning("Archive", false, R"(ZD_ERROR_IO_FAILED: Could not open file "%s" in binary mode for reading)", szFileName); return {}; } bOpenForWriting = false; @@ -143,7 +136,7 @@ namespace AZ::IO::ZipDir if (m_fileExt.m_fileHandle == AZ::IO::InvalidHandle) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Could not open file in binary mode for appending (read/write)"); + AZ_Warning("Archive", false, R"(ZD_ERROR_IO_FAILED: Could not open file "%s" in binary mode for appending (read/write))", szFileName); return {}; } } @@ -211,7 +204,7 @@ namespace AZ::IO::ZipDir if (m_headerExtended.nHeaderSize != sizeof(m_headerExtended)) { // Extended Header is not valid - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Bad extended header"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: Bad extended header"); return false; } //We have the header, so read the encryption and signing techniques @@ -224,7 +217,7 @@ namespace AZ::IO::ZipDir if (m_headerExtended.nEncryption != ZipFile::HEADERS_NOT_ENCRYPTED && m_encryptedHeaders != ZipFile::HEADERS_NOT_ENCRYPTED) { //Encryption technique has been specified in both the disk number (old technique) and the custom header (new technique). - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Unexpected encryption technique in header"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: Unexpected encryption technique in header"); return false; } else @@ -240,7 +233,7 @@ namespace AZ::IO::ZipDir break; default: // Unexpected technique - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Bad encryption technique in header"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: Bad encryption technique in header"); return false; } } @@ -255,7 +248,7 @@ namespace AZ::IO::ZipDir break; default: // Unexpected technique - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Bad signing technique in header"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: Bad signing technique in header"); return false; } @@ -266,7 +259,7 @@ namespace AZ::IO::ZipDir Read(&m_headerSignature, sizeof(m_headerSignature)); if (m_headerSignature.nHeaderSize != sizeof(m_headerSignature)) { - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Bad signature header"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: Bad signature header"); return false; } } @@ -274,7 +267,7 @@ namespace AZ::IO::ZipDir else { // Unexpected technique - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Comment field is the wrong length"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: Comment field is the wrong length"); return false; } } @@ -285,7 +278,7 @@ namespace AZ::IO::ZipDir || m_CDREnd.nCDRStartDisk != 0 || m_CDREnd.numEntriesOnDisk != m_CDREnd.numEntriesTotal) { - THROW_ZIPDIR_ERROR(ZD_ERROR_UNSUPPORTED, "Multivolume archive detected. Current version of ZipDir does not support multivolume archives"); + AZ_Warning("Archive", false, "ZD_ERROR_UNSUPPORTED: Multivolume archive detected.Current version of ZipDir does not support multivolume archives"); return false; } @@ -295,7 +288,7 @@ namespace AZ::IO::ZipDir || m_CDREnd.lCDRSize > m_nCDREndPos || m_CDREnd.lCDROffset + m_CDREnd.lCDRSize > m_nCDREndPos) { - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "The central directory offset or size are out of range, the pak is probably corrupt, try to repare or delete the file"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT: The central directory offset or size are out of range, the pak is probably corrupt, try to repare or delete the file"); return false; } @@ -394,7 +387,12 @@ namespace AZ::IO::ZipDir // if there's nothing to search if (nNewBufPos >= nOldBufPos) { - THROW_ZIPDIR_ERROR(ZD_ERROR_NO_CDR, "Cannot find Central Directory Record in pak. This is either not a pak file, or a pak file without Central Directory. It does not mean that the data is permanently lost, but it may be severely damaged. Please repair the file with external tools, there may be enough information left to recover the file completely."); // we didn't find anything + AZ_Warning("Archive", false, "ZD_ERROR_NO_CDR: Cannot find Central Directory Record in pak." + " This is either not a pak file, or a pak file without Central Directory." + " It does not mean that the data is permanently lost," + " but it may be severely damaged." + " Please repair the file with external tools," + " there may be enough information left to recover the file completely."); // we didn't find anything return false; } @@ -418,7 +416,11 @@ namespace AZ::IO::ZipDir } else { - THROW_ZIPDIR_ERROR(ZD_ERROR_DATA_IS_CORRUPT, "Central Directory Record is followed by a comment of inconsistent length. This might be a minor misconsistency, please try to repair the file. However, it is dangerous to open the file because I will have to guess some structure offsets, which can lead to permanent unrecoverable damage of the archive content"); + AZ_Warning("Archive", false, "ZD_ERROR_DATA_IS_CORRUPT:" + " Central Directory Record is followed by a comment of inconsistent length." + " This might be a minor misconsistency, please try to repair the file.However," + " it is dangerous to open the file because I will have to guess some structure offsets," + " which can lead to permanent unrecoverable damage of the archive content"); return false; } } @@ -436,7 +438,7 @@ namespace AZ::IO::ZipDir nOldBufPos = nNewBufPos; memmove(&pReservedBuffer[CDRSearchWindowSize], pWindow, sizeof(ZipFile::CDREnd) - 1); } - THROW_ZIPDIR_ERROR(ZD_ERROR_UNEXPECTED, "The program flow may not have possibly lead here. This error is unexplainable"); // we shouldn't be here + AZ_Assert(false, "ZD_ERROR_UNEXPECTED: The program flow may not have possibly lead here. This error is unexplainable"); // we shouldn't be here return false; } @@ -460,13 +462,13 @@ namespace AZ::IO::ZipDir if (pBuffer.empty()) // couldn't allocate enough memory for temporary copy of CDR { - THROW_ZIPDIR_ERROR(ZD_ERROR_NO_MEMORY, "Not enough memory to cache Central Directory record for fast initialization. This error may not happen on non-console systems"); + AZ_Warning("Archive", false, "ZD_ERROR_NO_MEMORY: Not enough memory to cache Central Directory record for fast initialization. This error may not happen on non-console systems"); return false; } if (!ReadHeaderData(&pBuffer[0], m_CDREnd.lCDRSize)) { - THROW_ZIPDIR_ERROR(ZD_ERROR_CORRUPTED_DATA, "Archive contains corrupted CDR."); + AZ_Warning("Archive", false, "ZD_ERROR_CORRUPTED_DATA: Archive contains corrupted CDR."); return false; } @@ -482,7 +484,7 @@ namespace AZ::IO::ZipDir if ((pFile->nVersionNeeded & 0xFF) > 20) { - THROW_ZIPDIR_ERROR(ZD_ERROR_UNSUPPORTED, "Cannot read the archive file (nVersionNeeded > 20)."); + AZ_Warning("Archive", false, "ZD_ERROR_UNSUPPORTED: Cannot read the archive file (nVersionNeeded > 20)."); return false; } //if (pFile->lSignature != pFile->SIGNATURE) // Timur, Dont compare signatures as signatue in memory can be overwritten by the code below @@ -492,7 +494,8 @@ namespace AZ::IO::ZipDir // if the record overlaps with the End Of CDR structure, something is wrong if (pEndOfRecord > pEndOfData) { - THROW_ZIPDIR_ERROR(ZD_ERROR_CDR_IS_CORRUPT, "Central Directory record is either corrupt, or truncated, or missing. Cannot read the archive directory"); + AZ_Warning("Archive", false, "ZD_ERROR_CDR_IS_CORRUPT: Central Directory record is either corrupt, or truncated, or missing." + " Cannot read the archive directory"); return false; } @@ -555,13 +558,17 @@ namespace AZ::IO::ZipDir { if (pFileHeader->lLocalHeaderOffset > m_CDREnd.lCDROffset) { - THROW_ZIPDIR_ERROR(ZD_ERROR_CDR_IS_CORRUPT, "Central Directory contains file descriptors pointing outside the archive file boundaries. The archive file is either truncated or damaged. Please try to repair the file"); // the file offset is beyond the CDR: impossible + AZ_Warning("Archive", false, "ZD_ERROR_CDR_IS_CORRUPT:" + " Central Directory contains file descriptors pointing outside the archive file boundaries." + " The archive file is either truncated or damaged.Please try to repair the file"); // the file offset is beyond the CDR: impossible return; } if ((pFileHeader->nMethod == ZipFile::METHOD_STORE || pFileHeader->nMethod == ZipFile::METHOD_STORE_AND_STREAMCIPHER_KEYTABLE) && pFileHeader->desc.lSizeUncompressed != pFileHeader->desc.lSizeCompressed) { - THROW_ZIPDIR_ERROR(ZD_ERROR_VALIDATION_FAILED, "File with STORE compression method declares its compressed size not matching its uncompressed size. File descriptor is inconsistent, archive content may be damaged, please try to repair the archive"); + AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:" + " File with STORE compression method declares its compressed size not matching its uncompressed size." + " File descriptor is inconsistent, archive content may be damaged, please try to repair the archive"); return; } @@ -617,7 +624,9 @@ namespace AZ::IO::ZipDir //|| pFileHeader->nLastModTime != pLocalFileHeader->nLastModTime ) { - THROW_ZIPDIR_ERROR(ZD_ERROR_VALIDATION_FAILED, "The local file header descriptor doesn't match the basic parameters declared in the global file header in the file. The archive content is misconsistent and may be damaged. Please try to repair the archive"); + AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:" + " The local file header descriptor doesn't match the basic parameters declared in the global file header in the file." + " The archive content is misconsistent and may be damaged. Please try to repair the archive"); return; } @@ -628,7 +637,9 @@ namespace AZ::IO::ZipDir if (!AZStd::equal(zipFileDataBegin, zipFileDataEnd, reinterpret_cast(pFileHeader + 1), CompareNoCase)) { // either file name, or the extra field do not match - THROW_ZIPDIR_ERROR(ZD_ERROR_VALIDATION_FAILED, "The local file header contains file name which does not match the file name of the global file header. The archive content is misconsistent with its directory. Please repair the archive"); + AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:" + " The local file header contains file name which does not match the file name of the global file header." + " The archive content is misconsistent with its directory. Please repair the archive"); return; } @@ -642,7 +653,9 @@ namespace AZ::IO::ZipDir if (fileEntry.nFileDataOffset >= m_nCDREndPos) { - THROW_ZIPDIR_ERROR(ZD_ERROR_VALIDATION_FAILED, "The global file header declares the file which crosses the boundaries of the archive. The archive is either corrupted or truncated, please try to repair it"); + AZ_Warning("Archive", false, "ZD_ERROR_VALIDATION_FAILED:" + " The global file header declares the file which crosses the boundaries of the archive." + " The archive is either corrupted or truncated, please try to repair it"); return; } @@ -686,29 +699,29 @@ namespace AZ::IO::ZipDir case Z_OK: break; case Z_MEM_ERROR: - THROW_ZIPDIR_ERROR(ZD_ERROR_ZLIB_NO_MEMORY, "ZLib reported out-of-memory error"); + AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_NO_MEMORY: ZLib reported out-of-memory error"); return; case Z_BUF_ERROR: - THROW_ZIPDIR_ERROR(ZD_ERROR_ZLIB_CORRUPTED_DATA, "ZLib reported compressed stream buffer error"); + AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_CORRUPTED_DATA: ZLib reported compressed stream buffer error"); return; case Z_DATA_ERROR: - THROW_ZIPDIR_ERROR(ZD_ERROR_ZLIB_CORRUPTED_DATA, "ZLib reported compressed stream data error"); + AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_CORRUPTED_DATA: ZLib reported compressed stream data error"); return; default: - THROW_ZIPDIR_ERROR(ZD_ERROR_ZLIB_FAILED, "ZLib reported an unexpected unknown error"); + AZ_Warning("Archive", false, "ZD_ERROR_ZLIB_FAILED: ZLib reported an unexpected unknown error"); return; } if (nDestSize != fileEntry.desc.lSizeUncompressed) { - THROW_ZIPDIR_ERROR(ZD_ERROR_CORRUPTED_DATA, "Uncompressed stream doesn't match the size of uncompressed file stored in the archive file headers"); + AZ_Warning("Archive", false, "ZD_ERROR_CORRUPTED_DATA: Uncompressed stream doesn't match the size of uncompressed file stored in the archive file headers"); return; } uLong uCRC32 = AZ::Crc32((Bytef*)pUncompressed, nDestSize); if (uCRC32 != fileEntry.desc.lCRC32) { - THROW_ZIPDIR_ERROR(ZD_ERROR_CRC32_CHECK, "Uncompressed stream CRC32 check failed"); + AZ_Warning("Archive", false, "ZD_ERROR_CRC32_CHECK: Uncompressed stream CRC32 check failed"); return; } } @@ -737,7 +750,7 @@ namespace AZ::IO::ZipDir { if (FSeek(&m_fileExt, nPos, nOrigin)) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Cannot fseek() to the new position in the file. This is unexpected error and should not happen under any circumstances. Perhaps some network or disk failure error has caused this"); + AZ_Warning("Archive", false, "ZD_ERROR_IO_FAILED: Cannot fseek() to the new position in the file. This is unexpected error and should not happen under any circumstances. Perhaps some network or disk failure error has caused this"); return; } } @@ -747,7 +760,7 @@ namespace AZ::IO::ZipDir int64_t nPos = FTell(&m_fileExt); if (nPos == -1) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Cannot ftell() position in the archive. This is unexpected error and should not happen under any circumstances. Perhaps some network or disk failure error has caused this"); + AZ_Warning("Archive", false, "ZD_ERROR_IO_FAILED: Cannot ftell() position in the archive. This is unexpected error and should not happen under any circumstances. Perhaps some network or disk failure error has caused this"); return 0; } return nPos; @@ -757,7 +770,7 @@ namespace AZ::IO::ZipDir { if (FRead(&m_fileExt, pDest, nSize, 1) != 1) { - THROW_ZIPDIR_ERROR(ZD_ERROR_IO_FAILED, "Cannot fread() a portion of data from archive"); + AZ_Warning("Archive", false, "ZD_ERROR_IO_FAILED: Cannot fread() a portion of data from archive"); return false; } return true; diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.h b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.h index 1f27cb5504..c31d4d7dfd 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirCacheFactory.h @@ -33,20 +33,13 @@ namespace AZ::IO::ZipDir // if this is set, the archive will be created anew (the existing file will be overwritten) FLAGS_CREATE_NEW = 1 << 3, - // Cache will be loaded completely into the memory. - FLAGS_IN_MEMORY = 1 << 4, - FLAGS_IN_MEMORY_CPU = 1 << 5, - - // Store all file names as crc32 in a flat directory structure. - FLAGS_FILENAMES_AS_CRC32 = 1 << 6, - // if this is set, zip path will be searched inside other zips FLAGS_READ_INSIDE_PAK = 1 << 7, }; // initializes the internal structures // nFlags can have FLAGS_READ_ONLY flag, in this case the object will be opened only for reading - CacheFactory (InitMethodEnum nInitMethod, uint32_t nFlags = 0); + CacheFactory(InitMethodEnum nInitMethod, uint32_t nFlags = 0); ~CacheFactory(); // the new function creates a new cache diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.cpp index 30c8676f75..4fb1a54ded 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.cpp @@ -17,7 +17,7 @@ namespace AZ::IO::ZipDir { - bool FindFile::FindFirst(AZStd::string_view szWildcard) + bool FindFile::FindFirst(AZ::IO::PathView szWildcard) { if (!PreFind(szWildcard)) { @@ -29,7 +29,7 @@ namespace AZ::IO::ZipDir return SkipNonMatchingFiles(); } - bool FindDir::FindFirst(AZStd::string_view szWildcard) + bool FindDir::FindFirst(AZ::IO::PathView szWildcard) { if (!PreFind(szWildcard)) { @@ -42,37 +42,20 @@ namespace AZ::IO::ZipDir } // matches the file wildcard in the m_szWildcard to the given file/dir name - // this takes into account the fact that xxx. is the alias name for xxx - bool FindData::MatchWildcard(AZStd::string_view szName) + bool FindData::MatchWildcard(AZ::IO::PathView szName) { - if (AZStd::wildcard_match(m_szWildcard, szName)) - { - return true; - } - - // check if the file object name contains extension sign (.) - size_t extensionOffset = szName.find('.'); - if (extensionOffset != AZStd::string_view::npos) - { - return false; - } - - // no extension sign - add it - AZStd::fixed_string szAlias{ szName }; - szAlias.push_back('.'); - - return AZStd::wildcard_match(m_szWildcard, szAlias); + return szName.Match(m_szWildcard.Native()); } - FileEntry* FindFile::FindExact(AZStd::string_view szPath) + FileEntry* FindFile::FindExact(AZ::IO::PathView szPath) { if (!PreFind(szPath)) { return nullptr; } - FileEntryTree::FileMap::iterator itFile = m_pDirHeader->FindFile(m_szWildcard.c_str()); + FileEntryTree::FileMap::iterator itFile = m_pDirHeader->FindFile(m_szWildcard); if (itFile == m_pDirHeader->GetFileEnd()) { m_pDirHeader = nullptr; // we didn't find it, fail the search @@ -84,7 +67,7 @@ namespace AZ::IO::ZipDir return m_pDirHeader->GetFileEntry(m_itFile); } - FileEntryTree* FindDir::FindExact(AZStd::string_view szPath) + FileEntryTree* FindDir::FindExact(AZ::IO::PathView szPath) { if (!PreFind(szPath)) { @@ -97,40 +80,50 @@ namespace AZ::IO::ZipDir ////////////////////////////////////////////////////////////////////////// // after this call returns successfully (with true returned), the m_szWildcard - // contains the file name/wildcard and m_pDirHeader contains the directory where + // contains the file name/glob and m_pDirHeader contains the directory where // the file (s) are to be found - bool FindData::PreFind(AZStd::string_view szWildcard) + bool FindData::PreFind(AZ::IO::PathView pathGlob) { if (!m_pRoot) { return false; } - // start the search from the root - m_pDirHeader = m_pRoot; - m_szWildcard = szWildcard; - - // for each path directory, copy it into the wildcard buffer and try to find the subdirectory - for (AZStd::optional pathEntry = AZ::StringFunc::TokenizeNext(szWildcard, AZ_CORRECT_AND_WRONG_FILESYSTEM_SEPARATOR); pathEntry; - pathEntry = AZ::StringFunc::TokenizeNext(szWildcard, AZ_CORRECT_AND_WRONG_FILESYSTEM_SEPARATOR)) + FileEntryTree* entryTreeHeader = m_pRoot; + // If there is a root path in the glob path, attempt to locate it from the root + if (AZ::IO::PathView rootPath = m_szWildcard.RootPath(); !rootPath.empty()) { - // Update wildcard to new path entry - m_szWildcard = *pathEntry; - - // If the wildcard parameter that has been passed to TokenizeNext is empty - // Then pathEntry is the final portion of the path - if (!szWildcard.empty()) + FileEntryTree* dirEntry = entryTreeHeader->FindDir(rootPath); + if (dirEntry == nullptr) { - FileEntryTree* dirEntry = m_pDirHeader->FindDir(*pathEntry); - if (!dirEntry) - { - m_pDirHeader = nullptr; // an intermediate directory has not been found continue the search - return false; - } - m_pDirHeader = dirEntry->GetDirectory(); + return false; } + + entryTreeHeader = dirEntry->GetDirectory(); + pathGlob = pathGlob.RelativePath(); + } + + + AZ::IO::PathView filenameSegment = pathGlob; + // Recurse through the directories within the file tree for each remaining parent path segment + // of pathGlob parameter + auto parentPathIter = pathGlob.begin(); + for (auto filenamePathIter = parentPathIter == pathGlob.end() ? pathGlob.end() : AZStd::next(parentPathIter, 1); + filenamePathIter != pathGlob.end(); ++parentPathIter, ++filenamePathIter) + { + FileEntryTree* dirEntry = entryTreeHeader->FindDir(*parentPathIter); + if (dirEntry == nullptr) + { + return false; + } + entryTreeHeader = dirEntry->GetDirectory(); + filenameSegment = *filenamePathIter; } + // At this point the all the intermediate directories have been found + // so update the directory header to point at the last file entry tree + m_pDirHeader = entryTreeHeader; + m_szWildcard = filenameSegment; return true; } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.h b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.h index 2bb3932aa9..f9b773a42d 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirFind.h @@ -38,11 +38,10 @@ namespace AZ::IO::ZipDir // after this call returns successfully (with true returned), the m_szWildcard // contains the file name/wildcard and m_pDirHeader contains the directory where // the file (s) are to be found - bool PreFind(AZStd::string_view szWildcard); + bool PreFind(AZ::IO::PathView szWildcard); // matches the file wildcard in the m_szWildcard to the given file/dir name - // this takes into account the fact that xxx. is the alias name for xxx - bool MatchWildcard(AZStd::string_view szName); + bool MatchWildcard(AZ::IO::PathView szName); // the directory inside which the current object (file or directory) is being searched FileEntryTree* m_pDirHeader{}; @@ -50,7 +49,7 @@ namespace AZ::IO::ZipDir FileEntryTree* m_pRoot{}; // the root of the zip file in which to search // the actual wildcard being used in the current scan - the file name wildcard only! - AZStd::fixed_string m_szWildcard; + AZ::IO::FixedMaxPath m_szWildcard; }; class FindFile @@ -66,9 +65,9 @@ namespace AZ::IO::ZipDir { } // if bExactFile is passed, only the file is searched, and besides with the exact name as passed (no wildcards) - bool FindFirst(AZStd::string_view szWildcard); + bool FindFirst(AZ::IO::PathView szWildcard); - FileEntry* FindExact(AZStd::string_view szPath); + FileEntry* FindExact(AZ::IO::PathView szPath); // goes on to the next file entry bool FindNext(); @@ -94,9 +93,9 @@ namespace AZ::IO::ZipDir { } // if bExactFile is passed, only the file is searched, and besides with the exact name as passed (no wildcards) - bool FindFirst(AZStd::string_view szWildcard); + bool FindFirst(AZ::IO::PathView szWildcard); - FileEntryTree* FindExact(AZStd::string_view szPath); + FileEntryTree* FindExact(AZ::IO::PathView szPath); // goes on to the next file entry bool FindNext(); diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirList.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirList.cpp index 2f96a93a82..729f394b9d 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirList.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirList.cpp @@ -68,14 +68,14 @@ namespace AZ::IO::ZipDir { for (FileEntryTree::SubdirMap::iterator it = pTree->GetDirBegin(); it != pTree->GetDirEnd(); ++it) { - AddAllFiles(it->second.get(), AZStd::string::format("%.*s%.*s/", aznumeric_cast(strRoot.size()), strRoot.data(), aznumeric_cast(it->first.size()), it->first.data())); + AddAllFiles(it->second.get(), (AZ::IO::Path(strRoot) / it->first).Native()); } for (FileEntryTree::FileMap::iterator it = pTree->GetFileBegin(); it != pTree->GetFileEnd(); ++it) { FileRecord rec; rec.pFileEntryBase = pTree->GetFileEntry(it); - rec.strPath = AZStd::string::format("%.*s%.*s", aznumeric_cast(strRoot.size()), strRoot.data(), aznumeric_cast(it->first.size()), it->first.data()); + rec.strPath = (AZ::IO::Path(strRoot) / it->first).Native(); push_back(rec); } } diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.cpp index 1d09705900..f9aa249339 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.cpp @@ -432,18 +432,18 @@ namespace AZ::IO::ZipDir bool CZipFile::EvaluateSectorSize(const char* filename) { - char volume[AZ_MAX_PATH_LEN]; + AZ::IO::FixedMaxPath volume; - if (AZ::StringFunc::Path::IsRelative(filename)) + if (AZ::IO::PathView(filename).IsRelative()) { - AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(filename, volume, AZ_ARRAY_SIZE(volume)); + AZ::IO::FileIOBase::GetDirectInstance()->ResolvePath(volume, filename); } else { - azstrcpy(volume, AZ_ARRAY_SIZE(volume), filename); + volume = filename; } - AZ::IO::FixedMaxPathString drive{ AZ::IO::PathView(volume).RootName().Native() }; + AZ::IO::FixedMaxPath drive = volume.RootName(); if (drive.empty()) { return false; @@ -666,7 +666,9 @@ namespace AZ::IO::ZipDir DirEntry* pEnd = pBegin + this->numDirs; DirEntry* pEntry = AZStd::lower_bound(pBegin, pEnd, szName, pred); #if AZ_TRAIT_LEGACY_CRYPAK_UNIX_LIKE_FILE_SYSTEM - if (pEntry != pEnd && !azstrnicmp(szName.data(), pEntry->GetName(pNamePool), szName.size())) + AZ::IO::PathView searchPath(szName, AZ::IO::WindowsPathSeparator); + AZ::IO::PathView entryPath(pEntry->GetName(pNamePool), AZ::IO::WindowsPathSeparator); + if (pEntry != pEnd && searchPath == entryPath) #else if (pEntry != pEnd && szName == pEntry->GetName(pNamePool)) #endif @@ -690,7 +692,9 @@ namespace AZ::IO::ZipDir FileEntry* pEnd = pBegin + this->numFiles; FileEntry* pEntry = AZStd::lower_bound(pBegin, pEnd, szName, pred); #if AZ_TRAIT_LEGACY_CRYPAK_UNIX_LIKE_FILE_SYSTEM - if (pEntry != pEnd && !azstrnicmp(szName.data(), pEntry->GetName(pNamePool), szName.size())) + AZ::IO::PathView searchPath(szName, AZ::IO::WindowsPathSeparator); + AZ::IO::PathView entryPath(pEntry->GetName(pNamePool), AZ::IO::WindowsPathSeparator); + if (pEntry != pEnd && searchPath == entryPath) #else if (pEntry != pEnd && szName == pEntry->GetName(pNamePool)) #endif @@ -990,13 +994,6 @@ namespace AZ::IO::ZipDir } ////////////////////////////////////////////////////////////////////////// - uint32_t FileNameHash(AZStd::string_view filename) - { - AZ::IO::StackString pathname{ filename }; - AZStd::replace(AZStd::begin(pathname), AZStd::end(pathname), AZ_WRONG_DATABASE_SEPARATOR, AZ_CORRECT_DATABASE_SEPARATOR); - - return AZ::Crc32(pathname); - } int64_t FSeek(CZipFile* file, int64_t origin, int command) { diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.h b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.h index 2f9046f53e..7e1d54b405 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirStructures.h @@ -119,8 +119,6 @@ namespace AZ::IO::ZipDir const char* m_szDescription; }; -#define THROW_ZIPDIR_ERROR(ZD_ERR, DESC) AZ_Warning("Archive", false, DESC) - // possible initialization methods enum InitMethodEnum { @@ -157,8 +155,6 @@ namespace AZ::IO::ZipDir int FEof(CZipFile* zipFile); - uint32_t FileNameHash(AZStd::string_view filename); - ////////////////////////////////////////////////////////////////////////// struct SExtraZipFileData diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.cpp b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.cpp index 213287ef74..e772cb596a 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.cpp +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.cpp @@ -9,7 +9,6 @@ #include #include -#include #include #include #include @@ -18,37 +17,42 @@ namespace AZ::IO::ZipDir { // Adds or finds the file. Returns non-initialized structure if it was added, // or an IsInitialized() structure if it was found - FileEntry* FileEntryTree::Add(AZStd::string_view szPath) + FileEntry* FileEntryTree::Add(AZ::IO::PathView inputPathView) { - AZStd::optional pathEntry = AZ::StringFunc::TokenizeNext(szPath, AZ_CORRECT_AND_WRONG_FILESYSTEM_SEPARATOR); - if (!pathEntry) + if (inputPathView.empty()) { AZ_Assert(false, "An empty file path cannot be added to the zip file entry tree"); return nullptr; } // If a path separator was found, add a subdirectory - if (!szPath.empty()) + auto inputPathIter = inputPathView.begin(); + AZ::IO::PathView firstPathSegment(*inputPathIter); + auto inputPathNextIter = inputPathIter == inputPathView.end() ? inputPathView.end() : AZStd::next(inputPathIter, 1); + AZ::IO::PathView remainingPath = inputPathNextIter != inputPathView.end() ? + AZStd::string_view(inputPathNextIter->Native().begin(), inputPathView.Native().end()) + : AZStd::string_view{}; + if (!remainingPath.empty()) { - auto dirEntryIter = m_mapDirs.find(*pathEntry); + auto dirEntryIter = m_mapDirs.find(firstPathSegment); // we have a subdirectory here - create the file in it if (dirEntryIter == m_mapDirs.end()) { - dirEntryIter = m_mapDirs.emplace(*pathEntry, AZStd::make_unique()).first; + dirEntryIter = m_mapDirs.emplace(firstPathSegment, AZStd::make_unique()).first; } - return dirEntryIter->second->Add(szPath); + return dirEntryIter->second->Add(remainingPath); } // Add the filename - auto fileEntryIter = m_mapFiles.find(*pathEntry); + auto fileEntryIter = m_mapFiles.find(firstPathSegment); if (fileEntryIter == m_mapFiles.end()) { - fileEntryIter = m_mapFiles.emplace(*pathEntry, AZStd::make_unique()).first; + fileEntryIter = m_mapFiles.emplace(firstPathSegment, AZStd::make_unique()).first; } return fileEntryIter->second.get(); } // adds a file to this directory - ErrorEnum FileEntryTree::Add(AZStd::string_view szPath, const FileEntryBase& file) + ErrorEnum FileEntryTree::Add(AZ::IO::PathView szPath, const FileEntryBase& file) { FileEntry* pFile = Add(szPath); if (!pFile) @@ -63,7 +67,7 @@ namespace AZ::IO::ZipDir return ZD_ERROR_SUCCESS; } - // returns the number of files in this tree, including this and sublevels + // returns the number of files in this tree, including this and subdirectories uint32_t FileEntryTree::NumFilesTotal() const { uint32_t numFiles = aznumeric_cast(m_mapFiles.size()); @@ -91,21 +95,6 @@ namespace AZ::IO::ZipDir m_mapFiles.clear(); } - size_t FileEntryTree::GetSize() const - { - size_t nSize = sizeof(*this); - for (const auto& [dirname, dirEntry] : m_mapDirs) - { - nSize += dirname.size() + sizeof(decltype(m_mapDirs)::value_type) + dirEntry->GetSize(); - } - - for (const auto& [filename, fileEntry] : m_mapFiles) - { - nSize += filename.size() + sizeof(decltype(m_mapFiles)::value_type); - } - return nSize; - } - bool FileEntryTree::IsOwnerOf(const FileEntry* pFileEntry) const { for (const auto& [path, fileEntry] : m_mapFiles) @@ -127,7 +116,7 @@ namespace AZ::IO::ZipDir return false; } - FileEntryTree* FileEntryTree::FindDir(AZStd::string_view szDirName) + FileEntryTree* FileEntryTree::FindDir(AZ::IO::PathView szDirName) { if (auto it = m_mapDirs.find(szDirName); it != m_mapDirs.end()) { @@ -137,7 +126,7 @@ namespace AZ::IO::ZipDir return nullptr; } - FileEntryTree::FileMap::iterator FileEntryTree::FindFile(AZStd::string_view szFileName) + FileEntryTree::FileMap::iterator FileEntryTree::FindFile(AZ::IO::PathView szFileName) { return m_mapFiles.find(szFileName); } @@ -152,7 +141,7 @@ namespace AZ::IO::ZipDir return it == GetDirEnd() ? nullptr : it->second.get(); } - ErrorEnum FileEntryTree::RemoveDir(AZStd::string_view szDirName) + ErrorEnum FileEntryTree::RemoveDir(AZ::IO::PathView szDirName) { SubdirMap::iterator itRemove = m_mapDirs.find(szDirName); if (itRemove == m_mapDirs.end()) @@ -164,7 +153,13 @@ namespace AZ::IO::ZipDir return ZD_ERROR_SUCCESS; } - ErrorEnum FileEntryTree::RemoveFile(AZStd::string_view szFileName) + ErrorEnum FileEntryTree::RemoveAll() + { + Clear(); + return ZD_ERROR_SUCCESS; + } + + ErrorEnum FileEntryTree::RemoveFile(AZ::IO::PathView szFileName) { FileMap::iterator itRemove = m_mapFiles.find(szFileName); if (itRemove == m_mapFiles.end()) diff --git a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.h b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.h index cfe539e896..9bdc047a7a 100644 --- a/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.h +++ b/Code/Framework/AzFramework/AzFramework/Archive/ZipDirTree.h @@ -10,6 +10,7 @@ #pragma once #include +#include #include #include #include @@ -24,12 +25,12 @@ namespace AZ::IO::ZipDir // adds a file to this directory // Function can modify szPath input - ErrorEnum Add(AZStd::string_view szPath, const FileEntryBase& file); + ErrorEnum Add(AZ::IO::PathView szPath, const FileEntryBase& file); // Adds or finds the file. Returns non-initialized structure if it was added, // or an IsInitialized() structure if it was found // Function can modify szPath input - FileEntry* Add(AZStd::string_view szPath); + FileEntry* Add(AZ::IO::PathView szPath); // returns the number of files in this tree, including this and sublevels uint32_t NumFilesTotal() const; @@ -45,24 +46,18 @@ namespace AZ::IO::ZipDir m_mapFiles.swap(rThat.m_mapFiles); } - size_t GetSize() const; - bool IsOwnerOf(const FileEntry* pFileEntry) const; // subdirectories - using SubdirMap = AZStd::map>; + using SubdirMap = AZStd::map>; // file entries - using FileMap = AZStd::map>; + using FileMap = AZStd::map>; - FileEntryTree* FindDir(AZStd::string_view szDirName); - ErrorEnum RemoveDir (AZStd::string_view szDirName); - ErrorEnum RemoveAll () - { - Clear(); - return ZD_ERROR_SUCCESS; - } - FileMap::iterator FindFile(AZStd::string_view szFileName); - ErrorEnum RemoveFile(AZStd::string_view szFileName); + FileEntryTree* FindDir(AZ::IO::PathView szDirName); + ErrorEnum RemoveDir(AZ::IO::PathView szDirName); + ErrorEnum RemoveAll(); + FileMap::iterator FindFile(AZ::IO::PathView szFileName); + ErrorEnum RemoveFile(AZ::IO::PathView szFileName); // the FileEntryTree is simultaneously an entry in the dir list AND the directory header FileEntryTree* GetDirectory() { @@ -75,8 +70,8 @@ namespace AZ::IO::ZipDir SubdirMap::iterator GetDirBegin() { return m_mapDirs.begin(); } SubdirMap::iterator GetDirEnd() { return m_mapDirs.end(); } uint32_t NumDirs() const { return aznumeric_cast(m_mapDirs.size()); } - AZStd::string_view GetFileName(FileMap::iterator it) { return it->first; } - AZStd::string_view GetDirName(SubdirMap::iterator it) { return it->first; } + AZStd::string_view GetFileName(FileMap::iterator it) { return it->first.Native(); } + AZStd::string_view GetDirName(SubdirMap::iterator it) { return it->first.Native(); } FileEntry* GetFileEntry(FileMap::iterator it); FileEntryTree* GetDirEntry(SubdirMap::iterator it); diff --git a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp index 50190ac7d5..4072c17ea0 100644 --- a/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp +++ b/Code/Framework/AzFramework/AzFramework/IO/LocalFileIO.cpp @@ -734,7 +734,7 @@ namespace AZ { if (AZ::StringFunc::StartsWith(pathStrView, aliasKey)) { - // Reduce of the size result result path by the size of the and add the resolved alias size + // Add to the size of result path by the resolved alias length - the alias key length AZStd::string_view postAliasView = pathStrView.substr(aliasKey.size()); size_t requiredFixedMaxPathSize = postAliasView.size(); requiredFixedMaxPathSize += aliasValue.size(); diff --git a/Code/Framework/AzFramework/CMakeLists.txt b/Code/Framework/AzFramework/CMakeLists.txt index 1164d81f04..6f6e47855e 100644 --- a/Code/Framework/AzFramework/CMakeLists.txt +++ b/Code/Framework/AzFramework/CMakeLists.txt @@ -29,7 +29,6 @@ ly_add_target( AZ::AzCore PUBLIC AZ::GridMate - 3rdParty::md5 3rdParty::zlib 3rdParty::zstd 3rdParty::lz4 diff --git a/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp b/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp index b8eb8d2f9f..d2a6d63db5 100644 --- a/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp +++ b/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp @@ -68,7 +68,7 @@ namespace UnitTest return false; } - if (!archive->OpenPack(path, AZ::IO::IArchive::FLAGS_PATH_REAL)) + if (!archive->OpenPack(path)) { return false; } diff --git a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp index f3764a5e96..ecb495cd61 100644 --- a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp +++ b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp @@ -30,16 +30,17 @@ namespace UnitTest : public ScopedAllocatorSetupFixture { public: + // Use an Immediately invoked function to initlaize the m_stackRecordLevels value of the AZ::SystemAllocator::Descriptor class ArchiveTestFixture() - : m_application{ AZStd::make_unique() } + : ScopedAllocatorSetupFixture( + []() { AZ::SystemAllocator::Descriptor desc; desc.m_stackRecordLevels = 30; return desc; }() + ) + , m_application{ AZStd::make_unique() } { } void SetUp() override { - AZ::ComponentApplication::Descriptor descriptor; - descriptor.m_stackRecordLevels = 30; - AZ::SettingsRegistryInterface* registry = AZ::SettingsRegistry::Get(); auto projectPathKey = @@ -47,7 +48,7 @@ namespace UnitTest registry->Set(projectPathKey, "AutomatedTesting"); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(*registry); - m_application->Start(descriptor); + m_application->Start({}); // Without this, the user settings component would attempt to save on finalize/shutdown. Since the file is // shared across the whole engine, if multiple tests are run in parallel, the saving could cause a crash // in the unit tests. @@ -68,7 +69,7 @@ namespace UnitTest return false; } - return archive->OpenPack(path, AZ::IO::IArchive::FLAGS_PATH_REAL) && archive->ClosePack(path); + return archive->OpenPack(path) && archive->ClosePack(path); } template @@ -116,7 +117,7 @@ namespace UnitTest { // Canary tests first - AZ::IO::HandleType fileHandle = archive->FOpen(testFilePath, "rb", 0); + AZ::IO::HandleType fileHandle = archive->FOpen(testFilePath, "rb"); ASSERT_NE(AZ::IO::InvalidHandle, fileHandle); @@ -136,9 +137,9 @@ namespace UnitTest // open already open file and call FGetCachedFileData fileSize = 0; { - AZ::IO::HandleType fileHandle2 = archive->FOpen(testFilePath, "rb", 0); + AZ::IO::HandleType fileHandle2 = archive->FOpen(testFilePath, "rb"); char* pFileBuffer3 = (char*)archive->FGetCachedFileData(fileHandle2, fileSize); - ASSERT_NE(nullptr,pFileBuffer3); + ASSERT_NE(nullptr, pFileBuffer3); EXPECT_EQ(dataLen, fileSize); EXPECT_EQ(0, memcmp(pFileBuffer3, testData, dataLen)); archive->FClose(fileHandle2); @@ -174,7 +175,7 @@ namespace UnitTest // Multithreaded Test #2 reading from the same file concurrently auto concurrentArchiveFileReadFunc = [archive, testFilePath, dataLen, testData]() { - AZ::IO::HandleType threadFileHandle = archive->FOpen(testFilePath, "rb", 0); + AZ::IO::HandleType threadFileHandle = archive->FOpen(testFilePath, "rb"); if (threadFileHandle == AZ::IO::InvalidHandle) { @@ -305,7 +306,7 @@ namespace UnitTest // open and fetch the opened pak file using a *.pak AZStd::vector fullPaths; - archive->OpenPacks("@usercache@/*.pak", AZ::IO::IArchive::EPathResolutionRules::FLAGS_PATH_REAL, &fullPaths); + archive->OpenPacks("@usercache@/*.pak", &fullPaths); EXPECT_TRUE(AZStd::any_of(fullPaths.cbegin(), fullPaths.cend(), [](auto& path) { return path.ends_with("one.pak"); })); EXPECT_TRUE(AZStd::any_of(fullPaths.cbegin(), fullPaths.cend(), [](auto& path) { return path.ends_with("two.pak"); })); } @@ -712,13 +713,16 @@ namespace UnitTest EXPECT_TRUE(cpfio.Exists("@log@/unittesttemp/copiedfile2.xml")); // find files test. - + AZ::IO::FixedMaxPath resolvedTestFilePath; + EXPECT_TRUE(cpfio.ResolvePath(resolvedTestFilePath, AZ::IO::PathView("@assets@/testfile.xml"))); bool foundIt = false; // note that this file exists only in the archive. - cpfio.FindFiles("@assets@", "*.xml", [&foundIt](const char* foundName) + cpfio.FindFiles("@assets@", "*.xml", [&foundIt, &cpfio, &resolvedTestFilePath](const char* foundName) { + AZ::IO::FixedMaxPath resolvedFoundPath; + EXPECT_TRUE(cpfio.ResolvePath(resolvedFoundPath, AZ::IO::PathView(foundName))); // according to the contract stated in the FileIO.h file, we expect full paths. (Aliases are full paths) - if (azstricmp(foundName, "@assets@/testfile.xml") == 0) + if (resolvedTestFilePath == resolvedFoundPath) { foundIt = true; return false; @@ -803,40 +807,49 @@ namespace UnitTest EXPECT_TRUE(archive->ClosePack(realNameBuf)); } - TEST_F(ArchiveTestFixture, IResourceList_Add_EmptyFileName_DoesNotCrash) + TEST_F(ArchiveTestFixture, IResourceList_Add_EmptyFileName_DoesNotInsert) { AZ::IO::IResourceList* reslist = AZ::Interface::Get()->GetResourceList(AZ::IO::IArchive::RFOM_EngineStartup); ASSERT_NE(nullptr, reslist); reslist->Clear(); reslist->Add(""); - EXPECT_STREQ(reslist->GetFirst(), ""); - reslist->Clear(); + EXPECT_EQ(nullptr, reslist->GetFirst()); } - TEST_F(ArchiveTestFixture, IResourceList_Add_RegularFileName_NormalizesAppropriately) + TEST_F(ArchiveTestFixture, IResourceList_Add_RegularFileName_ResolvesAppropriately) { AZ::IO::IResourceList* reslist = AZ::Interface::Get()->GetResourceList(AZ::IO::IArchive::RFOM_EngineStartup); ASSERT_NE(nullptr, reslist); + AZ::IO::FileIOBase* ioBase = AZ::IO::FileIOBase::GetInstance(); + ASSERT_NE(nullptr, ioBase); + AZ::IO::FixedMaxPath resolvedTestPath; + EXPECT_TRUE(ioBase->ResolvePath(resolvedTestPath, "blah/blah/abcde")); + reslist->Clear(); reslist->Add("blah\\blah/AbCDE"); - - // it normalizes the string, so the slashes flip and everything is lowercased. - EXPECT_STREQ(reslist->GetFirst(), "blah/blah/abcde"); + AZ::IO::FixedMaxPath resolvedAddedPath; + EXPECT_TRUE(ioBase->ResolvePath(resolvedAddedPath, reslist->GetFirst())); + EXPECT_EQ(resolvedTestPath, resolvedAddedPath); reslist->Clear(); } - TEST_F(ArchiveTestFixture, IResourceList_Add_ReallyShortFileName_NormalizesAppropriately) + TEST_F(ArchiveTestFixture, IResourceList_Add_ReallyShortFileName_ResolvesAppropriately) { AZ::IO::IResourceList* reslist = AZ::Interface::Get()->GetResourceList(AZ::IO::IArchive::RFOM_EngineStartup); ASSERT_NE(nullptr, reslist); + AZ::IO::FileIOBase* ioBase = AZ::IO::FileIOBase::GetInstance(); + ASSERT_NE(nullptr, ioBase); + AZ::IO::FixedMaxPath resolvedTestPath; + EXPECT_TRUE(ioBase->ResolvePath(resolvedTestPath, "a")); + reslist->Clear(); reslist->Add("A"); - - // it normalizes the string, so the slashes flip and everything is lowercased. - EXPECT_STREQ(reslist->GetFirst(), "a"); + AZ::IO::FixedMaxPath resolvedAddedPath; + EXPECT_TRUE(ioBase->ResolvePath(resolvedAddedPath, reslist->GetFirst())); + EXPECT_EQ(resolvedTestPath, resolvedAddedPath); reslist->Clear(); } @@ -848,7 +861,7 @@ namespace UnitTest AZ::IO::FileIOBase* ioBase = AZ::IO::FileIOBase::GetInstance(); ASSERT_NE(nullptr, ioBase); - const char *assetsPath = ioBase->GetAlias("@assets@"); + const char* assetsPath = ioBase->GetAlias("@assets@"); ASSERT_NE(nullptr, assetsPath); auto stringToAdd = AZ::IO::Path(assetsPath) / "textures" / "test.dds"; @@ -864,195 +877,4 @@ namespace UnitTest EXPECT_EQ(resolvedAddedPath, resolvedResourcePath); reslist->Clear(); } - - - class ArchiveUnitTestsWithAllocators - : public ScopedAllocatorSetupFixture - { - protected: - - void SetUp() override - { - m_localFileIO = aznew AZ::IO::LocalFileIO(); - AZ::IO::FileIOBase::SetDirectInstance(m_localFileIO); - m_localFileIO->SetAlias(m_firstAlias.c_str(), m_firstAliasPath.c_str()); - m_localFileIO->SetAlias(m_secondAlias.c_str(), m_secondAliasPath.c_str()); - } - - void TearDown() override - { - AZ::IO::FileIOBase::SetDirectInstance(nullptr); - delete m_localFileIO; - m_localFileIO = nullptr; - } - - AZ::IO::FileIOBase* m_localFileIO = nullptr; - AZStd::string m_firstAlias = "@devassets@"; - AZStd::string m_firstAliasPath = "devassets_absolutepath"; - AZStd::string m_secondAlias = "@assets@"; - AZStd::string m_secondAliasPath = "assets_absolutepath"; - }; - - // ConvertAbsolutePathToAliasedPath tests are built to verify existing behavior doesn't change. - // It's a legacy function and the actual intended behavior is unknown, so these are black box unit tests. - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_NullString_ReturnsSuccess) - { - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath(nullptr); - EXPECT_TRUE(conversionResult); - EXPECT_TRUE(conversionResult->empty()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_NoAliasInSource_ReturnsSource) - { - AZStd::string sourceString("NoAlias"); - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath(sourceString.c_str()); - EXPECT_TRUE(conversionResult); - // ConvertAbsolutePathToAliasedPath returns sourceString if there is no alias in the source. - EXPECT_STREQ(sourceString.c_str(), conversionResult->c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_NullAliasToLookFor_ReturnsSource) - { - AZStd::string sourceString("NoAlias"); - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath(sourceString.c_str(), nullptr); - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(sourceString.c_str(), conversionResult->c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_NullAliasToReplaceWith_ReturnsSource) - { - AZStd::string sourceString("NoAlias"); - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath(sourceString.c_str(), "@SomeAlias", nullptr); - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(sourceString.c_str(), conversionResult->c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_NullAliases_ReturnsSource) - { - AZStd::string sourceString("NoAlias"); - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath(sourceString.c_str(), nullptr, nullptr); - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(sourceString.c_str(), conversionResult->c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_AbsPathInSource_ReturnsReplacedAlias) - { - // ConvertAbsolutePathToAliasedPath only replaces data if GetDirectInstance is valid. - EXPECT_TRUE(AZ::IO::FileIOBase::GetDirectInstance() != nullptr); - - const char* fullPath = AZ::IO::FileIOBase::GetDirectInstance()->GetAlias(m_firstAlias.c_str()); - AZStd::string sourceString = AZStd::string::format("%s" AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING "SomeStringWithAlias", fullPath); - AZStd::string expectedResult = AZStd::string::format("%s" AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING "somestringwithalias", m_secondAlias.c_str()); - - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath( - sourceString.c_str(), - m_firstAlias.c_str(), // find any instance of FirstAlias in sourceString - m_secondAlias.c_str()); // replace it with SecondAlias - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(conversionResult->c_str(), expectedResult.c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_AliasInSource_ReturnsReplacedAlias) - { - // ConvertAbsolutePathToAliasedPath only replaces data if GetDirectInstance is valid. - EXPECT_TRUE(AZ::IO::FileIOBase::GetDirectInstance() != nullptr); - - AZStd::string sourceString = AZStd::string::format("%s" AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING "SomeStringWithAlias", m_firstAlias.c_str()); - AZStd::string expectedResult = AZStd::string::format("%s" AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING "somestringwithalias", m_secondAlias.c_str()); - - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath( - sourceString.c_str(), - m_firstAlias.c_str(), // find any instance of FirstAlias in sourceString - m_secondAlias.c_str()); // replace it with SecondAlias - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(conversionResult->c_str(), expectedResult.c_str()); - } - -#if AZ_TRAIT_OS_USE_WINDOWS_FILE_PATHS - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_AbsPathInSource_DOSSlashInSource_ReturnsReplacedAlias) - { - // ConvertAbsolutePathToAliasedPath only replaces data if GetDirectInstance is valid. - EXPECT_TRUE(AZ::IO::FileIOBase::GetDirectInstance() != nullptr); - - const char* fullPath = AZ::IO::FileIOBase::GetDirectInstance()->GetAlias(m_firstAlias.c_str()); - AZStd::string sourceString = AZStd::string::format("%s" AZ_WRONG_DATABASE_SEPARATOR_STRING "SomeStringWithAlias", fullPath); - AZStd::string expectedResult = AZStd::string::format("%s" AZ_CORRECT_FILESYSTEM_SEPARATOR_STRING "somestringwithalias", m_secondAlias.c_str()); - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath( - sourceString.c_str(), - m_firstAlias.c_str(), // find any instance of FirstAlias in sourceString - m_secondAlias.c_str()); // replace it with SecondAlias - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(conversionResult->c_str(), expectedResult.c_str()); - } -#endif // AZ_TRAIT_OS_USE_WINDOWS_FILE_PATHS - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_AbsPathInSource_UNIXSlashInSource_ReturnsReplacedAlias) - { - // ConvertAbsolutePathToAliasedPath only replaces data if GetDirectInstance is valid. - EXPECT_TRUE(AZ::IO::FileIOBase::GetDirectInstance() != nullptr); - - const char* fullPath = AZ::IO::FileIOBase::GetDirectInstance()->GetAlias(m_firstAlias.c_str()); - AZStd::string sourceString = AZStd::string::format("%s" AZ_CORRECT_DATABASE_SEPARATOR_STRING "SomeStringWithAlias", fullPath); - AZStd::string expectedResult = AZStd::string::format("%s" AZ_CORRECT_DATABASE_SEPARATOR_STRING "somestringwithalias", m_secondAlias.c_str()); - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath( - sourceString.c_str(), - m_firstAlias.c_str(), // find any instance of FirstAlias in sourceString - m_secondAlias.c_str()); // replace it with SecondAlias - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(conversionResult->c_str(), expectedResult.c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_AliasInSource_DOSSlashInSource_ReturnsReplacedAlias) - { - // ConvertAbsolutePathToAliasedPath only replaces data if GetDirectInstance is valid. - EXPECT_TRUE(AZ::IO::FileIOBase::GetDirectInstance() != nullptr); - - AZStd::string sourceString = AZStd::string::format("%s" AZ_WRONG_DATABASE_SEPARATOR_STRING "SomeStringWithAlias", m_firstAlias.c_str()); - AZStd::string expectedResult = AZStd::string::format("%s" AZ_WRONG_DATABASE_SEPARATOR_STRING "somestringwithalias", m_secondAlias.c_str()); - - // sourceString is now (firstAlias)SomeStringWithAlias - - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath( - sourceString.c_str(), - m_firstAlias.c_str(), // find any instance of FirstAlias in sourceString - m_secondAlias.c_str()); // replace it with SecondAlias - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(conversionResult->c_str(), expectedResult.c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_AliasInSource_UNIXSlashInSource_ReturnsReplacedAlias) - { - // ConvertAbsolutePathToAliasedPath only replaces data if GetDirectInstance is valid. - EXPECT_TRUE(AZ::IO::FileIOBase::GetDirectInstance() != nullptr); - - AZStd::string sourceString = AZStd::string::format("%s" AZ_CORRECT_DATABASE_SEPARATOR_STRING "SomeStringWithAlias", m_firstAlias.c_str()); - AZStd::string expectedResult = AZStd::string::format("%s" AZ_CORRECT_DATABASE_SEPARATOR_STRING "somestringwithalias", m_secondAlias.c_str()); - - // sourceString is now (firstAlias)SomeStringWithAlias - - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath( - sourceString.c_str(), - m_firstAlias.c_str(), // find any instance of FirstAlias in sourceString - m_secondAlias.c_str()); // replace it with SecondAlias - EXPECT_TRUE(conversionResult); - EXPECT_STREQ(conversionResult->c_str(), expectedResult.c_str()); - } - - TEST_F(ArchiveUnitTestsWithAllocators, ConvertAbsolutePathToAliasedPath_SourceLongerThanMaxPath_ReturnsFailure) - { - const int longPathArraySize = AZ::IO::MaxPathLength + 2; - char longPath[longPathArraySize]; - memset(longPath, 'a', sizeof(char) * longPathArraySize); - longPath[longPathArraySize - 1] = '\0'; - AZ_TEST_START_TRACE_SUPPRESSION; - auto conversionResult = AZ::IO::ArchiveInternal::ConvertAbsolutePathToAliasedPath(longPath); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); - EXPECT_FALSE(conversionResult); - } - - class ArchivePathCompareTestFixture - : public ScopedAllocatorSetupFixture - , public ::testing::WithParamInterface> - { - }; } diff --git a/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp b/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp index c42720311c..f759857505 100644 --- a/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp +++ b/Code/Framework/AzGameFramework/AzGameFramework/Application/GameApplication.cpp @@ -9,12 +9,10 @@ #include "GameApplication.h" #include #include -#include -#include -#include -#include +#include + +#include #include -#include #include namespace AzGameFramework @@ -26,6 +24,28 @@ namespace AzGameFramework GameApplication::GameApplication(int argc, char** argv) : Application(&argc, &argv) { + // In the Launcher Applications the Settings Registry + // can read from the FileIOBase instance if available + m_settingsRegistry->SetUseFileIO(true); + + // Attempt to mount the engine pak from the Executable Directory + // at the Assets alias, otherwise to attempting to mount the engine pak + // from the Cache folder + AZ::IO::FixedMaxPath enginePakPath = AZ::Utils::GetExecutableDirectory(); + enginePakPath /= "Engine.pak"; + if (m_archiveFileIO->Exists(enginePakPath.c_str())) + { + m_archive->OpenPack("@assets@", enginePakPath.Native()); + } + else if (enginePakPath.clear(); m_settingsRegistry->Get(enginePakPath.Native(), AZ::SettingsRegistryMergeUtils::FilePathKey_CacheRootFolder)) + { + // fall back to checking if there is an Engine.pak in the Asset Cache + enginePakPath /= "Engine.pak"; + if (m_archiveFileIO->Exists(enginePakPath.c_str())) + { + m_archive->OpenPack("@assets@", enginePakPath.Native()); + } + } } GameApplication::~GameApplication() @@ -50,8 +70,8 @@ namespace AzGameFramework AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(registry, m_commandLine, false); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_ProjectUserRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_CommandLine(registry, m_commandLine, false); - AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(registry); #endif + AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_AddRuntimeFilePaths(registry); AZ::SettingsRegistryMergeUtils::MergeSettingsToRegistry_TargetBuildDependencyRegistry(registry, AZ_TRAIT_OS_PLATFORM_CODENAME, specializations, &scratchBuffer); diff --git a/Code/Legacy/CryCommon/CryFile.h b/Code/Legacy/CryCommon/CryFile.h index 56d7097344..8850b90932 100644 --- a/Code/Legacy/CryCommon/CryFile.h +++ b/Code/Legacy/CryCommon/CryFile.h @@ -9,11 +9,11 @@ // Description : File wrapper. #pragma once -#include -#include -#include -#include +#include +#include #include +#include +#include ////////////////////////////////////////////////////////////////////////// #define CRYFILE_MAX_PATH 260 @@ -28,7 +28,7 @@ public: CCryFile(const char* filename, const char* mode); ~CCryFile(); - bool Open(const char* filename, const char* mode, int nOpenFlagsEx = 0); + bool Open(const char* filename, const char* mode); void Close(); // Summary: @@ -58,15 +58,7 @@ public: // Description: // Retrieves the filename of the selected file. - const char* GetFilename() const { return m_filename; }; - - // Description: - // Retrieves the filename after adjustment to the real relative to engine root path. - // Example: - // Original filename "textures/red.dds" adjusted filename will look like "game/textures/red.dds" - // Return: - // Adjusted filename, this is a pointer to a static string, copy return value if you want to keep it. - const char* GetAdjustedFilename() const; + const char* GetFilename() const { return m_filename.c_str(); }; // Summary: // Checks if file is opened from Archive file. @@ -74,12 +66,11 @@ public: // Summary: // Gets path of archive this file is in. - const char* GetPakPath() const; + AZ::IO::PathView GetPakPath() const; private: - char m_filename[CRYFILE_MAX_PATH]; + AZ::IO::FixedMaxPath m_filename; AZ::IO::HandleType m_fileHandle; - AZ::IO::IArchive* m_pIArchive; }; // Summary: @@ -87,14 +78,12 @@ private: inline CCryFile::CCryFile() { m_fileHandle = AZ::IO::InvalidHandle; - m_pIArchive = gEnv ? gEnv->pCryPak : NULL; } ////////////////////////////////////////////////////////////////////////// inline CCryFile::CCryFile(const char* filename, const char* mode) { m_fileHandle = AZ::IO::InvalidHandle; - m_pIArchive = gEnv ? gEnv->pCryPak : NULL; Open(filename, mode); } @@ -109,22 +98,17 @@ inline CCryFile::~CCryFile() // For nOpenFlagsEx see IArchive::EFOpenFlags // See also: // IArchive::EFOpenFlags -inline bool CCryFile::Open(const char* filename, const char* mode, int nOpenFlagsEx) +inline bool CCryFile::Open(const char* filename, const char* mode) { - char tempfilename[CRYFILE_MAX_PATH] = ""; - azstrcpy(tempfilename, CRYFILE_MAX_PATH, filename); - + m_filename = filename; #if !defined (_RELEASE) - if (gEnv && gEnv->IsEditor() && gEnv->pConsole) + if (auto console = AZ::Interface::Get(); console != nullptr) { - ICVar* const pCvar = gEnv->pConsole->GetCVar("ed_lowercasepaths"); - if (pCvar) + if (bool lowercasePaths{}; console->GetCvarValue("ed_lowercasepaths", lowercasePaths) == AZ::GetValueResult::Success) { - const int lowercasePaths = pCvar->GetIVal(); if (lowercasePaths) { - const AZStd::string lowerString = PathUtil::ToLower(tempfilename); - azstrcpy(tempfilename, CRYFILE_MAX_PATH, lowerString.c_str()); + AZStd::to_lower(m_filename.Native().begin(), m_filename.Native().end()); } } } @@ -133,16 +117,8 @@ inline bool CCryFile::Open(const char* filename, const char* mode, int nOpenFlag { Close(); } - azstrcpy(m_filename, CRYFILE_MAX_PATH, tempfilename); - if (m_pIArchive) - { - m_fileHandle = m_pIArchive->FOpen(tempfilename, mode, nOpenFlagsEx); - } - else - { - AZ::IO::FileIOBase::GetInstance()->Open(tempfilename, AZ::IO::GetOpenModeFromStringMode(mode), m_fileHandle); - } + AZ::IO::FileIOBase::GetInstance()->Open(m_filename.c_str(), AZ::IO::GetOpenModeFromStringMode(mode), m_fileHandle); return m_fileHandle != AZ::IO::InvalidHandle; } @@ -152,27 +128,17 @@ inline void CCryFile::Close() { if (m_fileHandle != AZ::IO::InvalidHandle) { - if (m_pIArchive) - { - m_pIArchive->FClose(m_fileHandle); - } - else - { - AZ::IO::FileIOBase::GetInstance()->Close(m_fileHandle); - } + AZ::IO::FileIOBase::GetInstance()->Close(m_fileHandle); + m_fileHandle = AZ::IO::InvalidHandle; - m_filename[0] = 0; + m_filename.clear(); } } ////////////////////////////////////////////////////////////////////////// inline size_t CCryFile::Write(const void* lpBuf, size_t nSize) { - assert(m_fileHandle != AZ::IO::InvalidHandle); - if (m_pIArchive) - { - return m_pIArchive->FWrite(lpBuf, 1, nSize, m_fileHandle); - } + AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot Write"); if (AZ::IO::FileIOBase::GetInstance()->Write(m_fileHandle, lpBuf, nSize)) { @@ -185,11 +151,7 @@ inline size_t CCryFile::Write(const void* lpBuf, size_t nSize) ////////////////////////////////////////////////////////////////////////// inline size_t CCryFile::ReadRaw(void* lpBuf, size_t nSize) { - assert(m_fileHandle != AZ::IO::InvalidHandle); - if (m_pIArchive) - { - return m_pIArchive->FReadRaw(lpBuf, 1, nSize, m_fileHandle); - } + AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot Read"); AZ::u64 bytesRead = 0; AZ::IO::FileIOBase::GetInstance()->Read(m_fileHandle, lpBuf, nSize, false, &bytesRead); @@ -200,11 +162,7 @@ inline size_t CCryFile::ReadRaw(void* lpBuf, size_t nSize) ////////////////////////////////////////////////////////////////////////// inline size_t CCryFile::GetLength() { - assert(m_fileHandle != AZ::IO::InvalidHandle); - if (m_pIArchive) - { - return m_pIArchive->FGetSize(m_fileHandle); - } + AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot query file length"); //long curr = ftell(m_file); AZ::u64 size = 0; AZ::IO::FileIOBase::GetInstance()->Size(m_fileHandle, size); @@ -214,11 +172,7 @@ inline size_t CCryFile::GetLength() ////////////////////////////////////////////////////////////////////////// inline size_t CCryFile::Seek(size_t seek, int mode) { - assert(m_fileHandle != AZ::IO::InvalidHandle); - if (m_pIArchive) - { - return m_pIArchive->FSeek(m_fileHandle, long(seek), mode); - } + AZ_Assert(m_fileHandle != AZ::IO::InvalidHandle, "File Handle is invalid. Cannot seek in unopen file"); if (AZ::IO::FileIOBase::GetInstance()->Seek(m_fileHandle, seek, AZ::IO::GetSeekTypeFromFSeekMode(mode))) { @@ -230,45 +184,25 @@ inline size_t CCryFile::Seek(size_t seek, int mode) ////////////////////////////////////////////////////////////////////////// inline bool CCryFile::IsInPak() const { - if (m_fileHandle != AZ::IO::InvalidHandle && m_pIArchive) + if (auto archive = AZ::Interface::Get(); + m_fileHandle != AZ::IO::InvalidHandle && archive != nullptr) { - return m_pIArchive->GetFileArchivePath(m_fileHandle) != NULL; + return !archive->GetFileArchivePath(m_fileHandle).empty(); } return false; } ////////////////////////////////////////////////////////////////////////// -inline const char* CCryFile::GetPakPath() const +inline AZ::IO::PathView CCryFile::GetPakPath() const { - if (m_fileHandle != AZ::IO::InvalidHandle && m_pIArchive) + if (auto archive = AZ::Interface::Get(); + m_fileHandle != AZ::IO::InvalidHandle && archive != nullptr) { - const char* sPath = m_pIArchive->GetFileArchivePath(m_fileHandle); - if (sPath != NULL) + if (AZ::IO::PathView sPath(archive->GetFileArchivePath(m_fileHandle)); sPath.empty()) { return sPath; } } - return ""; + return {}; } - -////////////////////////////////////////////////////////////////////////// -inline const char* CCryFile::GetAdjustedFilename() const -{ - static char szAdjustedFile[AZ::IO::IArchive::MaxPath]; - assert(m_pIArchive); - if (!m_pIArchive) - { - return ""; - } - - // Gets mod path to file. - const char* gameUrl = m_pIArchive->AdjustFileName(m_filename, szAdjustedFile, AZ::IO::IArchive::MaxPath, 0); - - // Returns standard path otherwise. - if (gameUrl != &szAdjustedFile[0]) - { - azstrcpy(szAdjustedFile, AZ::IO::IArchive::MaxPath, gameUrl); - } - return szAdjustedFile; -} diff --git a/Code/Legacy/CryCommon/CryPath.h b/Code/Legacy/CryCommon/CryPath.h index 046006f738..197c9b2d56 100644 --- a/Code/Legacy/CryCommon/CryPath.h +++ b/Code/Legacy/CryCommon/CryPath.h @@ -19,6 +19,7 @@ #include #include #include +#include #include "platform.h" diff --git a/Code/Legacy/CryCommon/Mocks/ICryPakMock.h b/Code/Legacy/CryCommon/Mocks/ICryPakMock.h index ab3b3875af..50cae45991 100644 --- a/Code/Legacy/CryCommon/Mocks/ICryPakMock.h +++ b/Code/Legacy/CryCommon/Mocks/ICryPakMock.h @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -20,35 +21,23 @@ struct CryPakMock MOCK_METHOD5(AdjustFileName, const char*(AZStd::string_view src, char* dst, size_t dstSize, uint32_t nFlags, bool skipMods)); MOCK_METHOD1(Init, bool(AZStd::string_view szBasePath)); MOCK_METHOD0(Release, void()); - MOCK_CONST_METHOD1(IsInstalledToHDD, bool(AZStd::string_view acFilePath)); - MOCK_METHOD5(OpenPack, bool(AZStd::string_view, uint32_t, AZStd::intrusive_ptr, AZStd::fixed_string*, bool)); - MOCK_METHOD6(OpenPack, bool(AZStd::string_view, AZStd::string_view, uint32_t, AZStd::intrusive_ptr, AZStd::fixed_string*, bool)); - MOCK_METHOD3(OpenPacks, bool(AZStd::string_view pWildcard, uint32_t nFlags, AZStd::vector>* pFullPaths)); - MOCK_METHOD4(OpenPacks, bool(AZStd::string_view pBindingRoot, AZStd::string_view pWildcard, uint32_t nFlags, AZStd::vector>* pFullPaths)); - MOCK_METHOD2(ClosePack, bool(AZStd::string_view pName, uint32_t nFlags)); - MOCK_METHOD2(ClosePacks, bool(AZStd::string_view pWildcard, uint32_t nFlags)); + MOCK_METHOD4(OpenPack, bool(AZStd::string_view, AZStd::intrusive_ptr, AZ::IO::FixedMaxPathString*, bool)); + MOCK_METHOD5(OpenPack, bool(AZStd::string_view, AZStd::string_view, AZStd::intrusive_ptr, AZ::IO::FixedMaxPathString*, bool)); + MOCK_METHOD2(OpenPacks, bool(AZStd::string_view pWildcard, AZStd::vector* pFullPaths)); + MOCK_METHOD3(OpenPacks, bool(AZStd::string_view pBindingRoot, AZStd::string_view pWildcard, AZStd::vector* pFullPaths)); + MOCK_METHOD1(ClosePack, bool(AZStd::string_view pName)); + MOCK_METHOD1(ClosePacks, bool(AZStd::string_view pWildcard)); MOCK_METHOD1(FindPacks, bool(AZStd::string_view pWildcardIn)); - MOCK_METHOD3(SetPacksAccessible, bool(bool bAccessible, AZStd::string_view pWildcard, uint32_t nFlags)); - MOCK_METHOD3(SetPackAccessible, bool(bool bAccessible, AZStd::string_view pName, uint32_t nFlags)); - MOCK_METHOD3(LoadPakToMemory, bool(AZStd::string_view pName, EInMemoryArchiveLocation eLoadToMemory, AZStd::intrusive_ptr pMemoryBlock)); - MOCK_METHOD2(LoadPaksToMemory, void(int nMaxPakSize, bool bLoadToMemory)); - MOCK_METHOD1(GetMod, const char*(int index)); - MOCK_METHOD1(ParseAliases, void(AZStd::string_view szCommandLine)); - MOCK_METHOD3(SetAlias, void(AZStd::string_view szName, AZStd::string_view szAlias, bool bAdd)); - MOCK_METHOD2(GetAlias, const char*(AZStd::string_view szName, bool bReturnSame)); - MOCK_METHOD0(Lock, void()); - MOCK_METHOD0(Unlock, void()); + MOCK_METHOD2(SetPacksAccessible, bool(bool bAccessible, AZStd::string_view pWildcard)); + MOCK_METHOD2(SetPackAccessible, bool(bool bAccessible, AZStd::string_view pName)); MOCK_METHOD1(SetLocalizationFolder, void(AZStd::string_view sLocalizationFolder)); MOCK_CONST_METHOD0(GetLocalizationFolder, const char*()); MOCK_CONST_METHOD0(GetLocalizationRoot, const char*()); - MOCK_METHOD3(FOpen, AZ::IO::HandleType(AZStd::string_view pName, const char* mode, uint32_t nFlags)); - MOCK_METHOD4(FReadRaw, size_t(void* data, size_t length, size_t elems, AZ::IO::HandleType handle)); - MOCK_METHOD3(FReadRawAll, size_t(void* data, size_t nFileSize, AZ::IO::HandleType handle)); - MOCK_METHOD2(FGetCachedFileData, void*(AZ::IO::HandleType handle, size_t & nFileSize)); - MOCK_METHOD4(FWrite, size_t(const void* data, size_t length, size_t elems, AZ::IO::HandleType handle)); - MOCK_METHOD3(FGets, char*(char*, int, AZ::IO::HandleType)); - MOCK_METHOD1(Getc, int(AZ::IO::HandleType)); + MOCK_METHOD2(FOpen, AZ::IO::HandleType(AZStd::string_view pName, const char* mode)); + MOCK_METHOD2(FGetCachedFileData, void*(AZ::IO::HandleType handle, size_t& nFileSize)); + MOCK_METHOD3(FRead, size_t(void* data, size_t bytesToRead, AZ::IO::HandleType handle)); + MOCK_METHOD3(FWrite, size_t(const void* data, size_t bytesToWrite, AZ::IO::HandleType handle)); MOCK_METHOD1(FGetSize, size_t(AZ::IO::HandleType f)); MOCK_METHOD2(FGetSize, size_t(AZStd::string_view pName, bool bAllowUseFileSystem)); MOCK_METHOD1(IsInPak, bool(AZ::IO::HandleType handle)); @@ -70,9 +59,8 @@ struct CryPakMock MOCK_METHOD2(IsFileExist, bool(AZStd::string_view sFilename, EFileSearchLocation)); MOCK_METHOD1(IsFolder, bool(AZStd::string_view sPath)); MOCK_METHOD1(GetFileSizeOnDisk, AZ::IO::IArchive::SignedFileSize(AZStd::string_view filename)); - MOCK_METHOD1(MakeDir, bool(AZStd::string_view szPath)); MOCK_METHOD4(OpenArchive, AZStd::intrusive_ptr (AZStd::string_view szPath, AZStd::string_view bindRoot, uint32_t nFlags, AZStd::intrusive_ptr pData)); - MOCK_METHOD1(GetFileArchivePath, const char* (AZ::IO::HandleType f)); + MOCK_METHOD1(GetFileArchivePath, AZ::IO::PathView (AZ::IO::HandleType f)); MOCK_METHOD5(RawCompress, int(const void* pUncompressed, size_t* pDestSize, void* pCompressed, size_t nSrcSize, int nLevel)); MOCK_METHOD4(RawUncompress, int(void* pUncompressed, size_t* pDestSize, const void* pCompressed, size_t nSrcSize)); MOCK_METHOD1(RecordFileOpen, void(ERecordFileOpenList eList)); @@ -80,24 +68,15 @@ struct CryPakMock MOCK_METHOD1(GetResourceList, AZ::IO::IResourceList * (ERecordFileOpenList eList)); MOCK_METHOD2(SetResourceList, void(ERecordFileOpenList eList, AZ::IO::IResourceList * pResourceList)); MOCK_METHOD0(GetRecordFileOpenList, AZ::IO::IArchive::ERecordFileOpenList()); - MOCK_METHOD2(ComputeCRC, uint32_t(AZStd::string_view szPath, uint32_t nFileOpenFlags)); - MOCK_METHOD4(ComputeMD5, bool(AZStd::string_view szPath, uint8_t* md5, uint32_t nFileOpenFlags, bool useDirectAccess)); MOCK_METHOD1(RegisterFileAccessSink, void(AZ::IO::IArchiveFileAccessSink * pSink)); MOCK_METHOD1(UnregisterFileAccessSink, void(AZ::IO::IArchiveFileAccessSink * pSink)); MOCK_METHOD1(DisableRuntimeFileAccess, void(bool status)); MOCK_METHOD2(DisableRuntimeFileAccess, bool(bool status, AZStd::thread_id threadId)); - MOCK_METHOD2(CheckFileAccessDisabled, bool(AZStd::string_view name, const char* mode)); - MOCK_METHOD1(SetRenderThreadId, void(AZStd::thread_id renderThreadId)); MOCK_CONST_METHOD0(GetPakPriority, AZ::IO::ArchiveLocationPriority()); MOCK_CONST_METHOD1(GetFileOffsetOnMedia, uint64_t(AZStd::string_view szName)); MOCK_CONST_METHOD1(GetFileMediaType, EStreamSourceMediaType(AZStd::string_view szName)); MOCK_METHOD0(GetLevelPackOpenEvent, auto()->LevelPackOpenEvent*); MOCK_METHOD0(GetLevelPackCloseEvent, auto()->LevelPackCloseEvent*); - // Implementations required for variadic functions - virtual int FPrintf([[maybe_unused]] AZ::IO::HandleType handle, [[maybe_unused]] const char* format, ...) PRINTF_PARAMS(3, 4) - { - return 0; - } }; diff --git a/Code/Legacy/CrySystem/ConsoleBatchFile.cpp b/Code/Legacy/CrySystem/ConsoleBatchFile.cpp index d3a0ccf4de..bdc8d6de7d 100644 --- a/Code/Legacy/CrySystem/ConsoleBatchFile.cpp +++ b/Code/Legacy/CrySystem/ConsoleBatchFile.cpp @@ -91,15 +91,15 @@ bool CConsoleBatchFile::ExecuteConfigFile(const char* sFilename) AZStd::string filenameLog; AZStd::string sfn = PathUtil::GetFile(filename); - if (file.Open(filename.c_str(), "rb", AZ::IO::IArchive::FOPEN_HINT_QUIET | AZ::IO::IArchive::FOPEN_ONDISK)) + if (file.Open(filename.c_str(), "rb")) { filenameLog = AZStd::string("game/") + sfn; } - else if (file.Open((AZStd::string("config/") + sfn).c_str(), "rb", AZ::IO::IArchive::FOPEN_HINT_QUIET | AZ::IO::IArchive::FOPEN_ONDISK)) + else if (file.Open((AZStd::string("config/") + sfn).c_str(), "rb")) { filenameLog = AZStd::string("game/config/") + sfn; } - else if (file.Open((AZStd::string("./") + sfn).c_str(), "rb", AZ::IO::IArchive::FOPEN_HINT_QUIET | AZ::IO::IArchive::FOPEN_ONDISK)) + else if (file.Open((AZStd::string("./") + sfn).c_str(), "rb")) { filenameLog = AZStd::string("./") + sfn; } diff --git a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp index c5d364a025..2e61760d8c 100644 --- a/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp +++ b/Code/Legacy/CrySystem/LevelSystem/LevelSystem.cpp @@ -50,12 +50,11 @@ bool CLevelInfo::OpenLevelPak() return false; } - AZStd::string levelpak(m_levelPath); - levelpak += "/level.pak"; - AZStd::fixed_string fullLevelPakPath; - bool bOk = gEnv->pCryPak->OpenPack( - levelpak.c_str(), m_isPak ? AZ::IO::IArchive::FLAGS_LEVEL_PAK_INSIDE_PAK : (unsigned)0, NULL, &fullLevelPakPath, false); - m_levelPakFullPath.assign(fullLevelPakPath.c_str()); + AZ::IO::Path levelPak(m_levelPath); + levelPak /= "level.pak"; + AZ::IO::FixedMaxPathString fullLevelPakPath; + bool bOk = gEnv->pCryPak->OpenPack(levelPak.Native(), nullptr, &fullLevelPakPath, false); + m_levelPakFullPath.assign(fullLevelPakPath.c_str(), fullLevelPakPath.size()); return bOk; } @@ -74,7 +73,7 @@ void CLevelInfo::CloseLevelPak() if (!m_levelPakFullPath.empty()) { - gEnv->pCryPak->ClosePack(m_levelPakFullPath.c_str(), AZ::IO::IArchive::FLAGS_PATH_REAL); + gEnv->pCryPak->ClosePack(m_levelPakFullPath.c_str()); m_levelPakFullPath.clear(); } } @@ -324,8 +323,7 @@ void CLevelSystem::ScanFolder(const char* subfolder, bool modFolder) // Open all the available paks found in the levels folder for (auto iter = pakList.begin(); iter != pakList.end(); iter++) { - AZStd::fixed_string fullLevelPakPath; - gEnv->pCryPak->OpenPack(iter->c_str(), (unsigned)0, nullptr, &fullLevelPakPath, false); + gEnv->pCryPak->OpenPack(iter->c_str(), nullptr, nullptr, false); } // Levels in bundles now take priority over levels outside of bundles. diff --git a/Code/Legacy/CrySystem/SystemCFG.cpp b/Code/Legacy/CrySystem/SystemCFG.cpp index 802e577386..c97345a518 100644 --- a/Code/Legacy/CrySystem/SystemCFG.cpp +++ b/Code/Legacy/CrySystem/SystemCFG.cpp @@ -272,14 +272,12 @@ static bool ParseSystemConfig(const AZStd::string& strSysConfigFilePath, ILoadCo CCryFile file; AZStd::string filenameLog; { - int flags = AZ::IO::IArchive::FOPEN_HINT_QUIET | AZ::IO::IArchive::FOPEN_ONDISK; - if (filename[0] == '@') { // this is used when theres a very specific file to read, like @user@/game.cfg which is read // IN ADDITION to the one in the game folder, and afterwards to override values in it. // if the file is missing and its already prefixed with an alias, there is no need to look any further. - if (!(file.Open(filename.c_str(), "rb", flags))) + if (!(file.Open(filename.c_str(), "rb"))) { if (warnIfMissing) { @@ -293,11 +291,11 @@ static bool ParseSystemConfig(const AZStd::string& strSysConfigFilePath, ILoadCo // otherwise, if the file isn't prefixed with an alias, then its likely one of the convenience mappings // to either root or assets/config. this is done so that code can just request a simple file name and get its data if ( - !(file.Open(filename.c_str(), "rb", flags)) && - !(file.Open((AZStd::string("@root@/") + filename).c_str(), "rb", flags)) && - !(file.Open((AZStd::string("@assets@/") + filename).c_str(), "rb", flags)) && - !(file.Open((AZStd::string("@assets@/config/") + filename).c_str(), "rb", flags)) && - !(file.Open((AZStd::string("@assets@/config/spec/") + filename).c_str(), "rb", flags)) + !(file.Open(filename.c_str(), "rb")) && + !(file.Open((AZStd::string("@root@/") + filename).c_str(), "rb")) && + !(file.Open((AZStd::string("@assets@/") + filename).c_str(), "rb")) && + !(file.Open((AZStd::string("@assets@/config/") + filename).c_str(), "rb")) && + !(file.Open((AZStd::string("@assets@/config/spec/") + filename).c_str(), "rb")) ) { if (warnIfMissing) @@ -308,7 +306,9 @@ static bool ParseSystemConfig(const AZStd::string& strSysConfigFilePath, ILoadCo } } - filenameLog = file.GetAdjustedFilename(); + AZ::IO::FixedMaxPath resolvedFilePath; + AZ::IO::FileIOBase::GetInstance()->ResolvePath(resolvedFilePath, file.GetFilename()); + filenameLog = resolvedFilePath.String(); } INDENT_LOG_DURING_SCOPE(); diff --git a/Code/Legacy/CrySystem/SystemInit.cpp b/Code/Legacy/CrySystem/SystemInit.cpp index 5205b19e19..2c70717e8f 100644 --- a/Code/Legacy/CrySystem/SystemInit.cpp +++ b/Code/Legacy/CrySystem/SystemInit.cpp @@ -588,25 +588,6 @@ bool CSystem::InitFileSystem() m_env.pCryPak->RecordFileOpen(AZ::IO::IArchive::RFOM_EngineStartup); } - //init crypak - if (m_env.pCryPak->Init("")) - { -#if !defined(_RELEASE) - const ICmdLineArg* pakalias = m_pCmdLine->FindArg(eCLAT_Pre, "pakalias"); -#else - const ICmdLineArg* pakalias = nullptr; -#endif // !defined(_RELEASE) - if (pakalias && strlen(pakalias->GetValue()) > 0) - { - m_env.pCryPak->ParseAliases(pakalias->GetValue()); - } - } - else - { - AZ_Assert(false, "Failed to initialize CryPak."); - return false; - } - // Now that file systems are init, we will clear any events that have arrived // during file system init, so that systems do not reload assets that were already compiled in the // critical compilation section. @@ -844,9 +825,6 @@ void CSystem::OpenBasicPaks() #endif //AZ_PLATFORM_ANDROID InlineInitializationProcessing("CSystem::OpenBasicPaks OpenPacks( Engine... )"); - - // Load paks required for game init to mem - gEnv->pCryPak->LoadPakToMemory("Engine.pak", AZ::IO::IArchive::eInMemoryPakLocale_GPU); } ////////////////////////////////////////////////////////////////////////// @@ -891,8 +869,6 @@ void CSystem::OpenLanguageAudioPak([[maybe_unused]] const char* sLanguage) // Initialize languages. - int nPakFlags = 0; - // Omit the trailing slash! AZStd::string sLocalizationFolder(AZStd::string().assign(PathUtil::GetLocalizationFolder(), 0, PathUtil::GetLocalizationFolder().size() - 1)); @@ -904,7 +880,7 @@ void CSystem::OpenLanguageAudioPak([[maybe_unused]] const char* sLanguage) // load localized pak with crc32 filenames on consoles to save memory. AZStd::string sLocalizedPath = "loc.pak"; - if (!m_env.pCryPak->OpenPacks(sLocalizationFolder.c_str(), sLocalizedPath.c_str(), nPakFlags)) + if (!m_env.pCryPak->OpenPacks(sLocalizationFolder.c_str(), sLocalizedPath.c_str())) { // make sure the localized language is found - not really necessary, for TC AZ_Error(AZ_TRACE_SYSTEM_WINDOW, false, "Localized language content(%s) not available or modified from the original installation.", sLanguage); diff --git a/Code/Legacy/CrySystem/WindowsErrorReporting.cpp b/Code/Legacy/CrySystem/WindowsErrorReporting.cpp index d467923c74..cde5d4f8c6 100644 --- a/Code/Legacy/CrySystem/WindowsErrorReporting.cpp +++ b/Code/Legacy/CrySystem/WindowsErrorReporting.cpp @@ -101,8 +101,11 @@ LONG WINAPI CryEngineExceptionFilterWER(struct _EXCEPTION_POINTERS* pExceptionPo { if (g_cvars.sys_WER > 1) { - char szScratch [_MAX_PATH]; - const char* szDumpPath = gEnv->pCryPak->AdjustFileName("@log@/CE2Dump.dmp", szScratch, AZ_ARRAY_SIZE(szScratch), 0); + AZ::IO::FixedMaxPath dumpPath{ "@log@/CE2Dump.dmp" }; + if (auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); fileIoBase != nullptr) + { + dumpPath = fileIoBase->ResolvePath(dumpPath, "@log@/CE2Dump.dmp"); + } MINIDUMP_TYPE mdumpValue = (MINIDUMP_TYPE)(MiniDumpNormal); if (g_cvars.sys_WER > 1) @@ -110,7 +113,7 @@ LONG WINAPI CryEngineExceptionFilterWER(struct _EXCEPTION_POINTERS* pExceptionPo mdumpValue = (MINIDUMP_TYPE)(g_cvars.sys_WER - 2); } - return CryEngineExceptionFilterMiniDump(pExceptionPointers, szDumpPath, mdumpValue); + return CryEngineExceptionFilterMiniDump(pExceptionPointers, dumpPath.c_str(), mdumpValue); } LONG lRet = EXCEPTION_CONTINUE_SEARCH; diff --git a/Code/Legacy/CrySystem/XConsoleVariable.h b/Code/Legacy/CrySystem/XConsoleVariable.h index 3ff71f9f39..d62685c94c 100644 --- a/Code/Legacy/CrySystem/XConsoleVariable.h +++ b/Code/Legacy/CrySystem/XConsoleVariable.h @@ -257,12 +257,12 @@ public: void Set(const char* s) override; void Set(float f) override { - stack_string s = stack_string::format("%g", f); + AZStd::fixed_string<32> s = AZStd::fixed_string<32>::format("%g", f); Set(s.c_str()); } void Set(int i) override { - stack_string s = stack_string::format("%d", i); + AZStd::fixed_string<32> s = AZStd::fixed_string<32>::format("%d", i); Set(s.c_str()); } int GetType() override { return CVAR_STRING; } diff --git a/Code/Legacy/CrySystem/XML/XmlUtils.cpp b/Code/Legacy/CrySystem/XML/XmlUtils.cpp index 111831ed41..3e6a49f266 100644 --- a/Code/Legacy/CrySystem/XML/XmlUtils.cpp +++ b/Code/Legacy/CrySystem/XML/XmlUtils.cpp @@ -169,7 +169,7 @@ public: { if (m_fileHandle != AZ::IO::InvalidHandle) { - gEnv->pCryPak->FWrite(pData, size, 1, m_fileHandle); + gEnv->pCryPak->FWrite(pData, size, m_fileHandle); } } private: diff --git a/Code/Legacy/CrySystem/XML/xml.cpp b/Code/Legacy/CrySystem/XML/xml.cpp index 826e74b758..65a2cb6ffd 100644 --- a/Code/Legacy/CrySystem/XML/xml.cpp +++ b/Code/Legacy/CrySystem/XML/xml.cpp @@ -948,10 +948,12 @@ void CXmlNode::AddToXmlString(XmlString& xml, int level, AZ::IO::HandleType file { if (fileHandle != AZ::IO::InvalidHandle && chunkSize > 0) { + auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); + AZ_Assert(fileIoBase != nullptr, "FileIOBase is expected to be initialized for CXmlNode"); size_t len = xml.length(); if (len >= chunkSize) { - gEnv->pCryPak->FWrite(xml.c_str(), len, 1, fileHandle); + fileIoBase->Write(fileHandle, xml.c_str(), len); xml.assign (""); // should not free memory and does not! } } @@ -1258,7 +1260,8 @@ bool CXmlNode::saveToFile([[maybe_unused]] const char* fileName, size_t chunkSiz XmlString xml; xml.assign (""); xml.reserve(chunkSize * 2); // we reserve double memory, as writing in chunks is not really writing in fixed blocks but a bit fuzzy - auto pCryPak = gEnv->pCryPak; + auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); + AZ_Assert(fileIoBase != nullptr, "FileIOBase is expected to be initialized for CXmlNode"); if (fileHandle == AZ::IO::InvalidHandle) { return false; @@ -1267,7 +1270,7 @@ bool CXmlNode::saveToFile([[maybe_unused]] const char* fileName, size_t chunkSiz size_t len = xml.length(); if (len > 0) { - pCryPak->FWrite(xml.c_str(), len, 1, fileHandle); + fileIoBase->Write(fileHandle, xml.c_str(), len); } xml.clear(); // xml.resize(0) would not reclaim memory return true; @@ -1639,10 +1642,18 @@ XmlNodeRef XmlParserImp::ParseFile(const char* filename, XmlString& errorString, CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "%s", str); return 0; } - adjustedFilename = xmlFile.GetAdjustedFilename(); - AZStd::replace(adjustedFilename.begin(), adjustedFilename.end(), '\\', '/'); - pakPath = xmlFile.GetPakPath(); - AZStd::replace(pakPath.begin(), pakPath.end(), '\\', '/'); + + AZ::IO::FixedMaxPath resolvedPath(AZ::IO::PosixPathSeparator); + auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); + AZ_Assert(fileIoBase != nullptr, "FileIOBase is expected to be initialized for CXmlNode"); + if (fileIoBase->ResolvePath(resolvedPath, xmlFile.GetFilename())) + { + adjustedFilename = resolvedPath.MakePreferred().Native(); + } + if (fileIoBase->ResolvePath(resolvedPath, xmlFile.GetPakPath())) + { + pakPath = resolvedPath.MakePreferred().Native(); + } } XMLBinary::XMLBinaryReader reader; diff --git a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp index 7c88c4324c..e6d9894116 100644 --- a/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp +++ b/Code/Tools/AssetProcessor/native/InternalBuilders/SettingsRegistryBuilder.cpp @@ -191,10 +191,51 @@ namespace AssetProcessor response.m_createJobOutputs.push_back(AZStd::move(job)); } - AZ::IO::Path settingsRegistryWildcard = AZ::SettingsRegistryInterface::RegistryFolder; + AZ::IO::Path settingsRegistryWildcard = AZStd::string_view(AZ::Utils::GetEnginePath()); + settingsRegistryWildcard /= AZ::SettingsRegistryInterface::RegistryFolder; settingsRegistryWildcard /= "*.setreg"; response.m_sourceFileDependencyList.emplace_back(AZStd::move(settingsRegistryWildcard.Native()), AZ::Uuid::CreateNull(), AssetBuilderSDK::SourceFileDependency::SourceFileDependencyType::Wildcards); + + auto projectPath = AZ::IO::Path(AZStd::string_view(AZ::Utils::GetProjectPath())); + response.m_sourceFileDependencyList.emplace_back( + AZStd::move((projectPath / AZ::SettingsRegistryInterface::RegistryFolder / "*.setreg").Native()), + AZ::Uuid::CreateNull(), + AssetBuilderSDK::SourceFileDependency::SourceFileDependencyType::Wildcards); + response.m_sourceFileDependencyList.emplace_back( + AZStd::move((projectPath / AZ::SettingsRegistryInterface::DevUserRegistryFolder / "*.setreg").Native()), + AZ::Uuid::CreateNull(), + AssetBuilderSDK::SourceFileDependency::SourceFileDependencyType::Wildcards); + + if (auto settingsRegistry = AZ::Interface::Get(); settingsRegistry != nullptr) + { + AZStd::vector gemInfos; + if (AzFramework::GetGemsInfo(gemInfos, *settingsRegistry)) + { + // Gather unique list of Settings Registry wildcard directories + AZStd::vector gemSettingsRegistryWildcards; + for (const AzFramework::GemInfo& gemInfo : gemInfos) + { + for (const AZ::IO::Path& absoluteSourcePath : gemInfo.m_absoluteSourcePaths) + { + auto gemSettingsRegistryWildcard = absoluteSourcePath / AZ::SettingsRegistryInterface::RegistryFolder / "*.setreg"; + if (auto foundIt = AZStd::find(gemSettingsRegistryWildcards.begin(), gemSettingsRegistryWildcards.end(), gemSettingsRegistryWildcard); + foundIt == gemSettingsRegistryWildcards.end()) + { + gemSettingsRegistryWildcards.emplace_back(gemSettingsRegistryWildcard); + } + } + } + + // Add to the Source File Dependency list + for (AZ::IO::Path& gemSettingsRegistryWildcard : gemSettingsRegistryWildcards) + { + response.m_sourceFileDependencyList.emplace_back( + AZStd::move(gemSettingsRegistryWildcard.Native()), AZ::Uuid::CreateNull(), + AssetBuilderSDK::SourceFileDependency::SourceFileDependencyType::Wildcards); + } + } + } response.m_result = AssetBuilderSDK::CreateJobsResultCode::Success; } diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h index 83f53ffec2..2cc8a67cfa 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h +++ b/Gems/AtomLyIntegration/AtomFont/Code/Include/AtomLyIntegration/AtomFont/FFont.h @@ -283,7 +283,7 @@ namespace AZ FontTexture* m_fontTexture = nullptr; size_t m_fontBufferSize = 0; - unsigned char* m_fontBuffer = nullptr; + AZStd::unique_ptr m_fontBuffer; AZ::Data::Instance m_fontStreamingImage; AZ::RHI::Ptr m_fontImage; diff --git a/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp b/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp index 5e96af0b1b..c5268b427f 100644 --- a/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp +++ b/Gems/AtomLyIntegration/AtomFont/Code/Source/FFont.cpp @@ -13,8 +13,6 @@ #if !defined(USE_NULLFONT_ALWAYS) -#include - #include #include #include @@ -124,17 +122,10 @@ bool AZ::FFont::Load(const char* fontFilePath, unsigned int width, unsigned int Free(); - auto pPak = gEnv->pCryPak; + auto fileIoBase = AZ::IO::FileIOBase::GetInstance(); - AZStd::string fullFile; - if (pPak->IsAbsPath(fontFilePath)) - { - fullFile = fontFilePath; - } - else - { - fullFile = m_curPath + fontFilePath; - } + AZ::IO::Path fullFile(m_curPath); + fullFile /= fontFilePath; int smoothMethodFlag = (flags & TTFFLAG_SMOOTH_MASK) >> TTFFLAG_SMOOTH_SHIFT; AZ::FontSmoothMethod smoothMethod = AZ::FontSmoothMethod::None; @@ -161,42 +152,41 @@ bool AZ::FFont::Load(const char* fontFilePath, unsigned int width, unsigned int } - AZ::IO::HandleType fileHandle = pPak->FOpen(fullFile.c_str(), "rb"); + AZ::IO::HandleType fileHandle = AZ::IO::InvalidHandle; + fileIoBase->Open(fullFile.c_str(), AZ::IO::GetOpenModeFromStringMode("rb"), fileHandle); if (fileHandle == AZ::IO::InvalidHandle) { return false; } - size_t fileSize = pPak->FGetSize(fileHandle); + AZ::u64 fileSize{}; + fileIoBase->Size(fileHandle, fileSize); if (!fileSize) { - pPak->FClose(fileHandle); + fileIoBase->Close(fileHandle); return false; } - unsigned char* buffer = new unsigned char[fileSize]; - if (!pPak->FReadRaw(buffer, fileSize, 1, fileHandle)) + auto buffer = AZStd::make_unique(fileSize); + if (!fileIoBase->Read(fileHandle, buffer.get(), fileSize)) { - pPak->FClose(fileHandle); - delete [] buffer; + fileIoBase->Close(fileHandle); return false; } - pPak->FClose(fileHandle); + fileIoBase->Close(fileHandle); if (!m_fontTexture) { m_fontTexture = new FontTexture(); } - - if (!m_fontTexture || !m_fontTexture->CreateFromMemory(buffer, (int)fileSize, width, height, smoothMethod, smoothAmount, widthNumSlots, heightNumSlots, sizeRatio)) + if (!m_fontTexture || !m_fontTexture->CreateFromMemory(buffer.get(), (int)fileSize, width, height, smoothMethod, smoothAmount, widthNumSlots, heightNumSlots, sizeRatio)) { - delete [] buffer; return false; } m_monospacedFont = m_fontTexture->GetMonospaced(); - m_fontBuffer = buffer; + m_fontBuffer = AZStd::move(buffer); m_fontBufferSize = fileSize; m_fontTexDirty = false; m_sizeRatio = sizeRatio; @@ -213,10 +203,9 @@ void AZ::FFont::Free() m_fontImageVersion = 0; delete m_fontTexture; - m_fontTexture = 0; + m_fontTexture = nullptr; - delete[] m_fontBuffer; - m_fontBuffer = 0; + m_fontBuffer.reset(); m_fontBufferSize = 0; } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt b/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt index df5ab134fa..bf28ed3f14 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/CMakeLists.txt @@ -115,6 +115,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS) ly_create_alias(NAME AtomLyIntegration_CommonFeatures.Builders NAMESPACE Gem TARGETS Gem::AtomLyIntegration_CommonFeatures.Editor + Gem::Atom_Feature_Common.Builders Gem::Atom_RPI.Builders Gem::GradientSignal.Builders ) From db14d378057ccc2a98246cdc9da0b2d912a5843d Mon Sep 17 00:00:00 2001 From: Dihara Wijetunga <84074485+DiharaWijetunga@users.noreply.github.com> Date: Thu, 16 Sep 2021 18:08:34 +0100 Subject: [PATCH 339/355] Fixed crash in Atom Vulkan RHI when physical device limits timestampComputeAndGraphics is false (#4051) * Fixed crash in Atom Vulkan RHI when physical device limits timestampComputeAndGraphics is false. Signed-off-by: Dihara Wijetunga * Revert "Fixed crash in Atom Vulkan RHI when physical device limits timestampComputeAndGraphics is false." This reverts commit f2b7d4eb704ef13701cb66b6b5802cb4e5eb9632. Signed-off-by: Dihara Wijetunga * Moved ATOM Vulkan RHI Device::InitFeaturesAndLimits() after m_commandQueueContext is initialized. Signed-off-by: Dihara Wijetunga --- Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp index 4f800f114b..35bc966d1d 100644 --- a/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp +++ b/Gems/Atom/RHI/Vulkan/Code/Source/RHI/Device.cpp @@ -235,8 +235,6 @@ namespace AZ //Load device features now that we have loaded all extension info physicalDevice.LoadSupportedFeatures(); - - InitFeaturesAndLimits(physicalDevice); return RHI::ResultCode::Success; } @@ -247,6 +245,8 @@ namespace AZ RHI::ResultCode result = m_commandQueueContext.Init(*this, commandQueueContextDescriptor); RETURN_RESULT_IF_UNSUCCESSFUL(result); + InitFeaturesAndLimits(static_cast(GetPhysicalDevice())); + // Initialize member variables. ReleaseQueue::Descriptor releaseQueueDescriptor; releaseQueueDescriptor.m_collectLatency = m_descriptor.m_frameCountMax - 1; From 2a9cf06b6b5c28b11945177be3bbc140218819e6 Mon Sep 17 00:00:00 2001 From: Chris Galvan Date: Thu, 16 Sep 2021 12:49:28 -0500 Subject: [PATCH 340/355] Fixed the Comment component viewport icon. Signed-off-by: Chris Galvan --- Gems/LmbrCentral/Code/Source/Editor/EditorCommentComponent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gems/LmbrCentral/Code/Source/Editor/EditorCommentComponent.cpp b/Gems/LmbrCentral/Code/Source/Editor/EditorCommentComponent.cpp index 7eb0db1832..97f8dc60a2 100644 --- a/Gems/LmbrCentral/Code/Source/Editor/EditorCommentComponent.cpp +++ b/Gems/LmbrCentral/Code/Source/Editor/EditorCommentComponent.cpp @@ -30,7 +30,7 @@ namespace LmbrCentral ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Category, "Editor") ->Attribute(AZ::Edit::Attributes::Icon, "Icons/Components/Comment.svg") - ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Comment.png") + ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Icons/Components/Viewport/Comment.svg") ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZStd::vector({ AZ_CRC("Level", 0x9aeacc13), AZ_CRC("Game", 0x232b318c), AZ_CRC("Layer", 0xe4db211a) })) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/comment/") From 58c227ceb13285f327cd57ebc1cdce91a5ed064f Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Thu, 16 Sep 2021 12:50:18 -0500 Subject: [PATCH 341/355] Implemented C++23 deleted nullptr_t constructor/assignment for AZStd string classes (#4158) * Added string and string_view class constructor overloads which is deleted that prevents initializing them from a nullptr or an integer type Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fixed locations where string and string_view were initialized with nullptr Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> * Fix IArchive::IsInstalledToHDD signature Updated calls to ConvertAbsolutePathToAliasedPath to use an list initialization instead of nullptr Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- Code/Editor/Controls/SplineCtrlEx.cpp | 2 +- Code/Editor/Util/PakFile.cpp | 4 ++-- .../AzCore/AzCore/std/string/fixed_string.h | 5 +++++ Code/Framework/AzCore/AzCore/std/string/string.h | 4 ++++ .../AzCore/AzCore/std/string/string_view.h | 3 +++ Code/Framework/AzCore/Tests/AZStd/String.cpp | 16 +--------------- Code/Framework/AzCore/Tests/Name/NameTests.cpp | 2 +- .../AzCore/Tests/SettingsRegistryTests.cpp | 16 ++++++++-------- .../Tests/ArchiveCompressionTests.cpp | 12 ++++++------ .../Framework/AzFramework/Tests/ArchiveTests.cpp | 10 +++++----- .../AssetEditor/AssetEditorWidget.cpp | 2 +- .../Code/MCore/Source/MCoreCommandManager.h | 2 +- .../Editor/Animation/Controls/UiSplineCtrlEx.cpp | 2 +- .../Android/SaveData_SystemComponent_Android.cpp | 2 +- .../Apple/SaveData_SystemComponent_Apple.mm | 2 +- .../Windows/SaveData_SystemComponent_Windows.cpp | 2 +- .../Widgets/NodePalette/NodePaletteModel.cpp | 2 +- .../CreateElementsStates.h | 2 +- 18 files changed, 44 insertions(+), 46 deletions(-) diff --git a/Code/Editor/Controls/SplineCtrlEx.cpp b/Code/Editor/Controls/SplineCtrlEx.cpp index 9e0a954c79..1dc2ff19e1 100644 --- a/Code/Editor/Controls/SplineCtrlEx.cpp +++ b/Code/Editor/Controls/SplineCtrlEx.cpp @@ -70,7 +70,7 @@ protected: m_splineEntries.resize(m_splineEntries.size() + 1); SplineEntry& entry = m_splineEntries.back(); ISplineSet* pSplineSet = (pCtrl ? pCtrl->m_pSplineSet : nullptr); - entry.id = (pSplineSet ? pSplineSet->GetIDFromSpline(pSpline) : nullptr); + entry.id = (pSplineSet ? pSplineSet->GetIDFromSpline(pSpline) : AZStd::string{}); entry.pSpline = pSpline; const int numKeys = pSpline->GetKeyCount(); diff --git a/Code/Editor/Util/PakFile.cpp b/Code/Editor/Util/PakFile.cpp index fc8431ef24..b629b45f74 100644 --- a/Code/Editor/Util/PakFile.cpp +++ b/Code/Editor/Util/PakFile.cpp @@ -68,7 +68,7 @@ bool CPakFile::Open(const char* filename, bool bAbsolutePath) if (bAbsolutePath) { - m_pArchive = pCryPak->OpenArchive(filename, nullptr, AZ::IO::INestedArchive::FLAGS_ABSOLUTE_PATHS); + m_pArchive = pCryPak->OpenArchive(filename, {}, AZ::IO::INestedArchive::FLAGS_ABSOLUTE_PATHS); } else { @@ -93,7 +93,7 @@ bool CPakFile::OpenForRead(const char* filename) { return false; } - m_pArchive = pCryPak->OpenArchive(filename, nullptr, AZ::IO::INestedArchive::FLAGS_OPTIMIZED_READ_ONLY | AZ::IO::INestedArchive::FLAGS_ABSOLUTE_PATHS); + m_pArchive = pCryPak->OpenArchive(filename, {}, AZ::IO::INestedArchive::FLAGS_OPTIMIZED_READ_ONLY | AZ::IO::INestedArchive::FLAGS_ABSOLUTE_PATHS); if (m_pArchive) { return true; diff --git a/Code/Framework/AzCore/AzCore/std/string/fixed_string.h b/Code/Framework/AzCore/AzCore/std/string/fixed_string.h index 079fe40cda..b68f21784b 100644 --- a/Code/Framework/AzCore/AzCore/std/string/fixed_string.h +++ b/Code/Framework/AzCore/AzCore/std/string/fixed_string.h @@ -96,6 +96,10 @@ namespace AZStd && !is_convertible_v>> constexpr basic_fixed_string(const T& convertibleToView, size_type rhsOffset, size_type count); + + // #12 + constexpr basic_fixed_string(AZStd::nullptr_t) = delete; + constexpr operator AZStd::basic_string_view() const; constexpr auto begin() -> iterator; @@ -120,6 +124,7 @@ namespace AZStd constexpr auto operator=(const T& convertible_to_view) -> AZStd::enable_if_t> && !is_convertible_v, basic_fixed_string&>; + constexpr auto operator=(AZStd::nullptr_t) -> basic_fixed_string& = delete; constexpr auto operator+=(const basic_fixed_string& rhs) -> basic_fixed_string&; constexpr auto operator+=(const_pointer ptr) -> basic_fixed_string&; diff --git a/Code/Framework/AzCore/AzCore/std/string/string.h b/Code/Framework/AzCore/AzCore/std/string/string.h index c02c6805a1..9ef7ea3086 100644 --- a/Code/Framework/AzCore/AzCore/std/string/string.h +++ b/Code/Framework/AzCore/AzCore/std/string/string.h @@ -168,6 +168,9 @@ namespace AZStd { } + // C++23 overload to prevent initializing a string_view via a nullptr or integer type + constexpr basic_string(AZStd::nullptr_t) = delete; + inline ~basic_string() { // destroy the string @@ -197,6 +200,7 @@ namespace AZStd inline this_type& operator=(AZStd::basic_string_view view) { return assign(view); } inline this_type& operator=(const_pointer ptr) { return assign(ptr); } inline this_type& operator=(Element ch) { return assign(1, ch); } + inline this_type& operator=(AZStd::nullptr_t) = delete; inline this_type& operator+=(const this_type& rhs) { return append(rhs); } inline this_type& operator+=(const_pointer ptr) { return append(ptr); } inline this_type& operator+=(Element ch) { return append(1, ch); } diff --git a/Code/Framework/AzCore/AzCore/std/string/string_view.h b/Code/Framework/AzCore/AzCore/std/string/string_view.h index b2390c293a..30e61f95ce 100644 --- a/Code/Framework/AzCore/AzCore/std/string/string_view.h +++ b/Code/Framework/AzCore/AzCore/std/string/string_view.h @@ -502,6 +502,9 @@ namespace AZStd swap(other); } + // C++23 overload to prevent initializing a string_view via a nullptr or integer type + constexpr basic_string_view(AZStd::nullptr_t) = delete; + constexpr const_reference operator[](size_type index) const { return data()[index]; } /// Returns value, not reference. If index is out of bounds, 0 is returned (can't be reference). constexpr value_type at(size_type index) const diff --git a/Code/Framework/AzCore/Tests/AZStd/String.cpp b/Code/Framework/AzCore/Tests/AZStd/String.cpp index 91d2237ca2..68bdd311d5 100644 --- a/Code/Framework/AzCore/Tests/AZStd/String.cpp +++ b/Code/Framework/AzCore/Tests/AZStd/String.cpp @@ -1210,9 +1210,6 @@ namespace UnitTest AZStd::string findStr("Hay"); string_view view3(findStr); - string_view nullptrView4(nullptr); - - EXPECT_EQ(emptyView1, nullptrView4); // copy const size_t destBufferSize = 32; @@ -1264,9 +1261,6 @@ namespace UnitTest AZStd::size_t rfindResult = view3.rfind('a', 2); EXPECT_EQ(1, rfindResult); - rfindResult = nullptrView4.rfind(""); - EXPECT_EQ(string_view::npos, rfindResult); - rfindResult = emptyView1.rfind(""); EXPECT_EQ(string_view::npos, rfindResult); @@ -1373,17 +1367,11 @@ namespace UnitTest { string_view view1("The quick brown fox jumped over the lazy dog"); string_view view2("Needle in Haystack"); - string_view nullBeaverView(nullptr); string_view emptyBeaverView; string_view superEmptyBeaverView(""); - EXPECT_EQ(nullBeaverView, emptyBeaverView); - EXPECT_EQ(superEmptyBeaverView, nullBeaverView); - EXPECT_EQ(emptyBeaverView, superEmptyBeaverView); - EXPECT_EQ(nullBeaverView, ""); - EXPECT_EQ(nullBeaverView, nullptr); EXPECT_EQ("", emptyBeaverView); - EXPECT_EQ(nullptr, superEmptyBeaverView); + EXPECT_EQ("", superEmptyBeaverView); EXPECT_EQ("The quick brown fox jumped over the lazy dog", view1); EXPECT_NE("The slow brown fox jumped over the lazy dog", view1); @@ -1421,8 +1409,6 @@ namespace UnitTest EXPECT_LE(beaverView, "Busy Beaver"); EXPECT_LE("Likable Beaver", notBeaverView); EXPECT_LE("Busy Beaver", beaverView); - EXPECT_LE(nullBeaverView, nullBeaverView); - EXPECT_LE(nullBeaverView, lowerBeaverStr); EXPECT_LE(microBeaverStr, view1); EXPECT_LE(compareStr, beaverView); diff --git a/Code/Framework/AzCore/Tests/Name/NameTests.cpp b/Code/Framework/AzCore/Tests/Name/NameTests.cpp index 5417d36051..eb0a048e2f 100644 --- a/Code/Framework/AzCore/Tests/Name/NameTests.cpp +++ b/Code/Framework/AzCore/Tests/Name/NameTests.cpp @@ -362,7 +362,7 @@ namespace UnitTest // Test specific construction case that was failing. // The constructor calls Name::SetName() which does a move assignment // Name& Name::operator=(Name&& rhs) was leaving m_view pointing to the m_data in a temporary Name object. - AZ::Name emptyName(AZStd::string_view(nullptr)); + AZ::Name emptyName(AZStd::string_view{}); EXPECT_TRUE(emptyName.IsEmpty()); EXPECT_EQ(0, emptyName.GetStringView().data()[0]); } diff --git a/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp b/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp index 8485747991..2da5701207 100644 --- a/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp +++ b/Code/Framework/AzCore/Tests/SettingsRegistryTests.cpp @@ -1517,7 +1517,7 @@ namespace SettingsRegistryTests m_testFolder->push_back(AZ_CORRECT_DATABASE_SEPARATOR); *m_testFolder += AZ::SettingsRegistryInterface::RegistryFolder; - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}, nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}); EXPECT_TRUE(result); EXPECT_EQ(4, counter); @@ -1559,7 +1559,7 @@ namespace SettingsRegistryTests m_testFolder->push_back(AZ_CORRECT_DATABASE_SEPARATOR); *m_testFolder += AZ::SettingsRegistryInterface::RegistryFolder; - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, "Special", nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, "Special"); EXPECT_TRUE(result); EXPECT_EQ(6, counter); @@ -1598,7 +1598,7 @@ namespace SettingsRegistryTests m_testFolder->push_back(AZ_CORRECT_DATABASE_SEPARATOR); *m_testFolder += AZ::SettingsRegistryInterface::RegistryFolder; - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}, nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}); EXPECT_TRUE(result); EXPECT_EQ(4, counter); @@ -1639,7 +1639,7 @@ namespace SettingsRegistryTests m_testFolder->push_back(AZ_CORRECT_DATABASE_SEPARATOR); *m_testFolder += AZ::SettingsRegistryInterface::RegistryFolder; - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}, nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}); EXPECT_TRUE(result); EXPECT_EQ(4, counter); @@ -1672,7 +1672,7 @@ namespace SettingsRegistryTests m_testFolder->push_back(AZ_CORRECT_DATABASE_SEPARATOR); *m_testFolder += AZ::SettingsRegistryInterface::RegistryFolder; - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, "Special", nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, "Special"); EXPECT_TRUE(result); EXPECT_EQ(1, counter); @@ -1722,7 +1722,7 @@ namespace SettingsRegistryTests TEST_F(SettingsRegistryTest, MergeSettingsFolder_EmptyFolder_ReportsSuccessButNothingAdded) { - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}, nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}); EXPECT_TRUE(result); EXPECT_EQ(AZ::SettingsRegistryInterface::Type::Object, m_registry->GetType(AZ_SETTINGS_REGISTRY_HISTORY_KEY "/0")); // Folder and specialization settings. @@ -1734,7 +1734,7 @@ namespace SettingsRegistryTests constexpr AZStd::fixed_string path(AZ::IO::MaxPathLength + 1, 'a'); AZ_TEST_START_TRACE_SUPPRESSION; - bool result = m_registry->MergeSettingsFolder(path, { "editor", "test" }, {}, nullptr); + bool result = m_registry->MergeSettingsFolder(path, { "editor", "test" }, {}); AZ_TEST_STOP_TRACE_SUPPRESSION(1); EXPECT_FALSE(result); @@ -1751,7 +1751,7 @@ namespace SettingsRegistryTests AZ_TEST_START_TRACE_SUPPRESSION; m_testFolder->push_back(AZ_CORRECT_DATABASE_SEPARATOR); *m_testFolder += AZ::SettingsRegistryInterface::RegistryFolder; - bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}, nullptr); + bool result = m_registry->MergeSettingsFolder(*m_testFolder, { "editor", "test" }, {}); EXPECT_GT(::UnitTest::TestRunner::Instance().StopAssertTests(), 0); EXPECT_FALSE(result); diff --git a/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp b/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp index d2a6d63db5..6cde5b5e84 100644 --- a/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp +++ b/Code/Framework/AzFramework/Tests/ArchiveCompressionTests.cpp @@ -94,7 +94,7 @@ namespace UnitTest fileIo->Remove(testArchivePath.c_str()); // ------------ BASIC TEST: Create and read Empty Archive ------------ - AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath.c_str(), nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath.c_str(), {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); pArchive.reset(); EXPECT_TRUE(IsPackValid(testArchivePath.c_str())); @@ -122,7 +122,7 @@ namespace UnitTest checkSums[pos] = static_cast(pos % 256); } - auto pArchive = archive->OpenArchive(testArchivePath.c_str(), nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + auto pArchive = archive->OpenArchive(testArchivePath.c_str(), {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); // the strategy here is to find errors related to file sizes, alignment, overwrites @@ -143,7 +143,7 @@ namespace UnitTest // --------------------------------------------- read it back and verify - pArchive = archive->OpenArchive(testArchivePath.c_str(), nullptr, openFlags); + pArchive = archive->OpenArchive(testArchivePath.c_str(), {}, openFlags); EXPECT_NE(nullptr, pArchive); for (int j = 0; j < iterations; ++j) @@ -241,7 +241,7 @@ namespace UnitTest // ------------------------------------------------------------------------------------------- // read it back and verify - pArchive = archive->OpenArchive(testArchivePath.c_str(), nullptr, openFlags); + pArchive = archive->OpenArchive(testArchivePath.c_str(), {}, openFlags); EXPECT_NE(nullptr, pArchive); for (int j = 0; j < iterations; ++j) @@ -298,7 +298,7 @@ namespace UnitTest } // first, reset the pack to the original state: - auto pArchive = archive->OpenArchive(testArchivePath.c_str(), nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + auto pArchive = archive->OpenArchive(testArchivePath.c_str(), {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); for (int j = 0; j < iterations; ++j) @@ -382,7 +382,7 @@ namespace UnitTest // ------------------------------------------------------------------------------------------- // read it back and verify - pArchive = archive->OpenArchive(testArchivePath.c_str(), nullptr, openFlags); + pArchive = archive->OpenArchive(testArchivePath.c_str(), {}, openFlags); EXPECT_NE(nullptr, pArchive); writeCount = 0; diff --git a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp index ecb495cd61..8e88ccfc39 100644 --- a/Code/Framework/AzFramework/Tests/ArchiveTests.cpp +++ b/Code/Framework/AzFramework/Tests/ArchiveTests.cpp @@ -256,7 +256,7 @@ namespace UnitTest fileIo->CreatePath("@usercache@/levels/test"); // setup test archive and file - AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath_withSubfolders.c_str(), nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath_withSubfolders.c_str(), {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); EXPECT_EQ(0, pArchive->UpdateFile(fileInArchiveFile, dataString.data(), dataString.size(), AZ::IO::INestedArchive::METHOD_COMPRESS, AZ::IO::INestedArchive::LEVEL_FASTEST)); pArchive.reset(); @@ -291,7 +291,7 @@ namespace UnitTest archive->ClosePack(filePath.c_str()); fileIo->Remove(filePath.c_str()); - auto pArchive = archive->OpenArchive(filePath.c_str(), nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + auto pArchive = archive->OpenArchive(filePath.c_str(), {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); pArchive.reset(); archive->ClosePack(filePath.c_str()); @@ -478,7 +478,7 @@ namespace UnitTest bool found_mylevel_file{}; bool found_mylevel_folder{}; - AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath_withMountPoint, nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath_withMountPoint, {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); EXPECT_EQ(0, pArchive->UpdateFile("levelinfo.xml", dataString.data(), dataString.size(), AZ::IO::INestedArchive::METHOD_COMPRESS, AZ::IO::INestedArchive::LEVEL_FASTEST)); pArchive.reset(); @@ -629,7 +629,7 @@ namespace UnitTest normalFileHandle = InvalidHandle; EXPECT_TRUE(cpfio.Exists("@log@/unittesttemp/realfileforunittest.xml")); - AZStd::intrusive_ptr pArchive = archive->OpenArchive(genericArchiveFileName, nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + AZStd::intrusive_ptr pArchive = archive->OpenArchive(genericArchiveFileName, {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); EXPECT_EQ(0, pArchive->UpdateFile("testfile.xml", dataString, aznumeric_cast(dataLen), AZ::IO::INestedArchive::METHOD_COMPRESS, AZ::IO::INestedArchive::LEVEL_FASTEST)); pArchive.reset(); @@ -773,7 +773,7 @@ namespace UnitTest fileIo->Remove(testArchivePath); // ------------ BASIC TEST: Create and read Empty Archive ------------ - AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath, nullptr, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); + AZStd::intrusive_ptr pArchive = archive->OpenArchive(testArchivePath, {}, AZ::IO::INestedArchive::FLAGS_CREATE_NEW); EXPECT_NE(nullptr, pArchive); EXPECT_EQ(0, pArchive->UpdateFile("foundit.dat", const_cast("test"), 4, AZ::IO::INestedArchive::METHOD_COMPRESS, AZ::IO::INestedArchive::LEVEL_BEST)); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp index 77b9185e82..95dc0f36c4 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetEditor/AssetEditorWidget.cpp @@ -102,7 +102,7 @@ namespace AzToolsFramework else { AZStd::string error = AZStd::string::format("Could not resolve path name for asset {%s}.", id.ToString().c_str()); - assetCheckoutAndSaveCallback(false, error, nullptr); + assetCheckoutAndSaveCallback(false, error, AZStd::string{}); } } diff --git a/Gems/EMotionFX/Code/MCore/Source/MCoreCommandManager.h b/Gems/EMotionFX/Code/MCore/Source/MCoreCommandManager.h index d59639dee5..495fdcde07 100644 --- a/Gems/EMotionFX/Code/MCore/Source/MCoreCommandManager.h +++ b/Gems/EMotionFX/Code/MCore/Source/MCoreCommandManager.h @@ -40,7 +40,7 @@ namespace MCore CommandHistoryEntry() : m_commandGroup(nullptr) , m_executedCommand(nullptr) - , m_parameters(nullptr) {} + {} /** * Extended Constructor. diff --git a/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.cpp b/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.cpp index 94a4c77593..60109fc49c 100644 --- a/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.cpp +++ b/Gems/LyShine/Code/Editor/Animation/Controls/UiSplineCtrlEx.cpp @@ -78,7 +78,7 @@ protected: m_splineEntries.resize(m_splineEntries.size() + 1); SplineEntry& entry = m_splineEntries.back(); ISplineSet* pSplineSet = (pCtrl ? pCtrl->m_pSplineSet : 0); - entry.id = (pSplineSet ? pSplineSet->GetIDFromSpline(pSpline) : 0); + entry.id = (pSplineSet ? pSplineSet->GetIDFromSpline(pSpline) : AZStd::string{}); entry.pSpline = pSpline; const int numKeys = pSpline->GetKeyCount(); diff --git a/Gems/SaveData/Code/Source/Platform/Android/SaveData_SystemComponent_Android.cpp b/Gems/SaveData/Code/Source/Platform/Android/SaveData_SystemComponent_Android.cpp index 26760ca002..cf083e26ca 100644 --- a/Gems/SaveData/Code/Source/Platform/Android/SaveData_SystemComponent_Android.cpp +++ b/Gems/SaveData/Code/Source/Platform/Android/SaveData_SystemComponent_Android.cpp @@ -59,7 +59,7 @@ namespace SaveData //////////////////////////////////////////////////////////////////////////////////////////// //! The absolute path to the application's save data dircetory. - AZStd::string m_saveDataDircetoryPathAbsolute = nullptr; + AZStd::string m_saveDataDircetoryPathAbsolute; }; //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Gems/SaveData/Code/Source/Platform/Common/Apple/SaveData_SystemComponent_Apple.mm b/Gems/SaveData/Code/Source/Platform/Common/Apple/SaveData_SystemComponent_Apple.mm index 882723de13..e4c1f8a0d8 100644 --- a/Gems/SaveData/Code/Source/Platform/Common/Apple/SaveData_SystemComponent_Apple.mm +++ b/Gems/SaveData/Code/Source/Platform/Common/Apple/SaveData_SystemComponent_Apple.mm @@ -60,7 +60,7 @@ namespace SaveData //////////////////////////////////////////////////////////////////////////////////////////// //! The absolute path to the application's save data dircetory. - AZStd::string m_saveDataDircetoryPathAbsolute = nullptr; + AZStd::string m_saveDataDircetoryPathAbsolute; }; //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Gems/SaveData/Code/Source/Platform/Windows/SaveData_SystemComponent_Windows.cpp b/Gems/SaveData/Code/Source/Platform/Windows/SaveData_SystemComponent_Windows.cpp index 2e473cfea7..4c182ecd17 100644 --- a/Gems/SaveData/Code/Source/Platform/Windows/SaveData_SystemComponent_Windows.cpp +++ b/Gems/SaveData/Code/Source/Platform/Windows/SaveData_SystemComponent_Windows.cpp @@ -62,7 +62,7 @@ namespace SaveData //////////////////////////////////////////////////////////////////////////////////////////// //! The absolute path to the application's save data dircetory. - AZStd::string m_saveDataDircetoryPathAbsolute = nullptr; + AZStd::string m_saveDataDircetoryPathAbsolute; }; //////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp index 390dbaf0fb..b29992f9b1 100644 --- a/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp +++ b/Gems/ScriptCanvas/Code/Editor/View/Widgets/NodePalette/NodePaletteModel.cpp @@ -1322,7 +1322,7 @@ namespace ScriptCanvasEditor if (seperator == AZStd::string_view::npos) { - categoryTrail = nullptr; + categoryTrail = {}; } else { diff --git a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/CreateElementsStates.h b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/CreateElementsStates.h index 156933063f..58779e91f6 100644 --- a/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/CreateElementsStates.h +++ b/Gems/ScriptCanvasDeveloper/Code/Editor/Include/ScriptCanvasDeveloperEditor/EditorAutomation/EditorAutomationStates/CreateElementsStates.h @@ -131,7 +131,7 @@ namespace ScriptCanvasDeveloper QString m_nodeName; - AutomationStateModelId m_endpointId = nullptr; + AutomationStateModelId m_endpointId; AutomationStateModelId m_scenePointId; AutomationStateModelId m_nodeOutputId; From 47a8dbc1d05a1a5a7b6125ae677896de18666104 Mon Sep 17 00:00:00 2001 From: jromnoa <80134229+jromnoa@users.noreply.github.com> Date: Thu, 16 Sep 2021 10:59:23 -0700 Subject: [PATCH 342/355] Adds Atom component tests into the new parallel + batched test approach (#4039) * create PoC for starting point for parallel + batched Atom tests Signed-off-by: jromnoa * CMakeLists.txt update Signed-off-by: jromnoa * saving progress on re-factor for parallel and batched tests, added Tracer(), added Report(), and added new exit code validation method but code is unfinished still Signed-off-by: jromnoa * finalize conversion of component tests into new optimized test setup for batched/parallel runs Signed-off-by: jromnoa * fix REDO deletion check, remove class referencing a test not yet added to parallel runs Signed-off-by: jromnoa * revert hydra_AtomEditorComponents_AddedToEntity.py back to its original version Signed-off-by: jromnoa * re-add the DepthOfField component to expected_lines for non-optimized main suite (removed on accident) Signed-off-by: jromnoa * remove test comments from legal header, add EditorEntity() class, remove hydra calls - updated for Decal component, but the next commit will get the rest Signed-off-by: jromnoa * saving progress on converting over fully to using EditorEntity() per PR comments - almost done, will finish tomorrow Signed-off-by: jromnoa * add new test setup docstring, fix the create entity test step wording, re-add accidental removal of string text from editor_entity_utils.py Signed-off-by: jromnoa * finalize PR concerns, use EditorEntity object for most/all calls, tests pass when run Signed-off-by: jromnoa * remove accidental change Signed-off-by: jromnoa * update helper.open_level() call to not include 'Physics' in path, remove unnecessary f-string calls Signed-off-by: jromnoa * editor_python_test_tools.asset_utils.Asset.find_asset_by_path(), add is_hidden() and is_visible() to editor_python_test_tools to use for verification, clean up UNDO/REDO comments, fix test order in file to match the order of the test files Signed-off-by: jromnoa --- .../editor_entity_utils.py | 47 ++++- .../PythonTests/atom_renderer/CMakeLists.txt | 19 ++ .../hydra_AtomEditorComponents_DecalAdded.py | 151 +++++++++++++++ ..._AtomEditorComponents_DepthOfFieldAdded.py | 173 ++++++++++++++++++ ...mEditorComponents_DirectionalLightAdded.py | 157 ++++++++++++++++ ...AtomEditorComponents_DisplayMapperAdded.py | 137 ++++++++++++++ ...omEditorComponents_ExposureControlAdded.py | 145 +++++++++++++++ ...EditorComponents_GlobalSkylightIBLAdded.py | 164 +++++++++++++++++ .../hydra_AtomEditorComponents_LightAdded.py | 136 ++++++++++++++ ...dra_AtomEditorComponents_LightComponent.py | 6 +- ...a_AtomEditorComponents_PhysicalSkyAdded.py | 136 ++++++++++++++ ...ponents_PostFXRadiusWeightModifierAdded.py | 138 ++++++++++++++ .../hydra_AtomMaterialEditor_BasicTests.py | 8 +- ...GPUTest_AtomFeatureIntegrationBenchmark.py | 5 - .../hydra_GPUTest_BasicLevelSetup.py | 5 - .../hydra_GPUTest_LightComponent.py | 6 - .../test_Atom_MainSuite_Optimized.py | 43 +++++ 17 files changed, 1450 insertions(+), 26 deletions(-) create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DecalAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DepthOfFieldAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DirectionalLightAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DisplayMapperAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_ExposureControlAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PhysicalSkyAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py create mode 100644 AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite_Optimized.py diff --git a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py index fec9d9880b..154b5730d7 100644 --- a/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py +++ b/AutomatedTesting/Gem/PythonTests/EditorPythonTestTools/editor_python_test_tools/editor_entity_utils.py @@ -20,6 +20,7 @@ import azlmbr.legacy.general as general # Helper file Imports from editor_python_test_tools.utils import Report + class EditorComponent: """ EditorComponent class used to set and get the component property value using path @@ -28,7 +29,6 @@ class EditorComponent: which also assigns self.id and self.type_id to the EditorComponent object. """ - # Methods def get_component_name(self) -> str: """ Used to get name of component @@ -87,6 +87,13 @@ class EditorComponent: outcome.IsSuccess() ), f"Failure: Could not set value to '{self.get_component_name()}' : '{component_property_path}'" + def is_enabled(self): + """ + Used to verify if the component is enabled. + :return: True if enabled, otherwise False. + """ + return editor.EditorComponentAPIBus(bus.Broadcast, "IsComponentEnabled", self.id) + @staticmethod def get_type_ids(component_names: list) -> list: """ @@ -254,7 +261,7 @@ class EditorEntity: def get_components_of_type(self, component_names: list) -> List[EditorComponent]: """ Used to get components of type component_name that already exists on Entity - :param component_name: Name to component to check + :param component_names: List of names of components to check :return: List of Entity Component objects of given component name """ component_list = [] @@ -318,3 +325,39 @@ class EditorEntity: editor.EditorEntityAPIBus(bus.Event, "SetStartStatus", self.id, status_to_set) set_status = self.get_start_status() assert set_status == status_to_set, f"Failed to set start status of {desired_start_status} to {self.get_name}" + + def delete(self) -> None: + """ + Used to delete the Entity. + :return: None + """ + editor.ToolsApplicationRequestBus(bus.Broadcast, "DeleteEntityById", self.id) + + def set_visibility_state(self, is_visible: bool) -> None: + """ + Sets the visibility state on the object to visible or not visible. + :param is_visible: True for making visible, False to make not visible. + :return: None + """ + editor.EditorEntityAPIBus(bus.Event, "SetVisibilityState", self.id, is_visible) + + def exists(self) -> bool: + """ + Used to verify if the Entity exists. + :return: True if the Entity exists, False otherwise. + """ + return editor.ToolsApplicationRequestBus(bus.Broadcast, "EntityExists", self.id) + + def is_hidden(self) -> bool: + """ + Gets the "isHidden" value from the Entity. + :return: True if "isHidden" is enabled, False otherwise. + """ + return editor.EditorEntityInfoRequestBus(bus.Event, "IsHidden", self.id) + + def is_visible(self) -> bool: + """ + Gets the "isVisible" value from the Entity. + :return: True if "isVisible" is enabled, False otherwise. + """ + return editor.EditorEntityInfoRequestBus(bus.Event, "IsVisible", self.id) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt index 992420904c..f91423324d 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/CMakeLists.txt @@ -22,6 +22,21 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT AssetProcessor AutomatedTesting.Assets Editor + COMPONENT + Atom + ) + ly_add_pytest( + NAME AutomatedTesting::AtomRenderer_HydraTests_MainOptimized + TEST_SUITE main + PATH ${CMAKE_CURRENT_LIST_DIR}/test_Atom_MainSuite_Optimized.py + TEST_SERIAL + TIMEOUT 600 + RUNTIME_DEPENDENCIES + AssetProcessor + AutomatedTesting.Assets + Editor + COMPONENT + Atom ) ly_add_pytest( NAME AutomatedTesting::AtomRenderer_HydraTests_Sandbox @@ -33,6 +48,8 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT AssetProcessor AutomatedTesting.Assets Editor + COMPONENT + Atom ) ly_add_pytest( NAME AutomatedTesting::AtomRenderer_HydraTests_GPUTests @@ -45,6 +62,8 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS AND PAL_TRAIT_BUILD_TESTS_SUPPORTED AND AutomatedT AssetProcessor AutomatedTesting.Assets Editor + COMPONENT + Atom ) ly_add_pytest( NAME AutomatedTesting::AtomRenderer_HydraTests_ShaderBuildPipeline diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DecalAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DecalAdded.py new file mode 100644 index 0000000000..d68e1f5844 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DecalAdded.py @@ -0,0 +1,151 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + decal_creation = ("Decal Entity successfully created", "Decal Entity failed to be created") + decal_component = ("Entity has a Decal component", "Entity failed to find Decal component") + material_property_set = ("Material property set on Decal component", "Couldn't set Material property on Decal component") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_Decal_AddedToEntity(): + """ + Summary: + Tests the Decal component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Decal entity with no components. + 2) Add Decal component to Decal entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Set Material property on Decal component. + 9) Delete Decal entity. + 10) UNDO deletion. + 11) REDO deletion. + 12) Look for errors. + + :return: None + """ + import os + + import azlmbr.asset as asset + import azlmbr.bus as bus + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Decal entity with no components. + decal_name = "Decal (Atom)" + decal_entity = EditorEntity.create_editor_entity_at(math.Vector3(512.0, 512.0, 34.0), decal_name) + Report.critical_result(Tests.decal_creation, decal_entity.exists()) + + # 2. Add Decal component to Decal entity. + decal_component = decal_entity.add_component(decal_name) + Report.critical_result(Tests.decal_component, decal_entity.has_component(decal_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not decal_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, decal_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + decal_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, decal_entity.is_hidden() is True) + + # 7. Test IsVisible. + decal_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, decal_entity.is_visible() is True) + + # 8. Set Material property on Decal component. + decal_material_property_path = "Controller|Configuration|Material" + decal_material_asset_path = os.path.join("AutomatedTesting", "Materials", "basic_grey.material") + decal_material_asset = asset.AssetCatalogRequestBus( + bus.Broadcast, "GetAssetIdByPath", decal_material_asset_path, math.Uuid(), False) + decal_component.set_component_property_value(decal_material_property_path, decal_material_asset) + get_material_property = decal_component.get_component_property_value(decal_material_property_path) + Report.result(Tests.material_property_set, get_material_property == decal_material_asset) + + # 9. Delete Decal entity. + decal_entity.delete() + Report.result(Tests.entity_deleted, not decal_entity.exists()) + + # 10. UNDO deletion. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.deletion_undo, decal_entity.exists()) + + # 11. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not decal_entity.exists()) + + # 12. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_Decal_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DepthOfFieldAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DepthOfFieldAdded.py new file mode 100644 index 0000000000..80284902ea --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DepthOfFieldAdded.py @@ -0,0 +1,173 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to Camera entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + camera_property_set = ("DepthOfField Entity set Camera Entity", "DepthOfField Entity could not set Camera Entity") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + depth_of_field_creation = ("DepthOfField Entity successfully created", "DepthOfField Entity failed to be created") + depth_of_field_component = ("Entity has a DepthOfField component", "Entity failed to find DepthOfField component") + depth_of_field_disabled = ("DepthOfField component disabled", "DepthOfField component was not disabled.") + post_fx_component = ("Entity has a Post FX Layer component", "Entity did not have a Post FX Layer component") + depth_of_field_enabled = ("DepthOfField component enabled", "DepthOfField component was not enabled.") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_DepthOfField_AddedToEntity(): + """ + Summary: + Tests the DepthOfField component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a DepthOfField entity with no components. + 2) Add a DepthOfField component to DepthOfField entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Verify DepthOfField component not enabled. + 6) Add Post FX Layer component since it is required by the DepthOfField component. + 7) Verify DepthOfField component is enabled. + 8) Enter/Exit game mode. + 9) Test IsHidden. + 10) Test IsVisible. + 11) Add Camera entity. + 12) Add Camera component to Camera entity. + 13) Set the DepthOfField components's Camera Entity to the newly created Camera entity. + 14) Delete DepthOfField entity. + 15) UNDO deletion. + 16) REDO deletion. + 17) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a DepthOfField entity with no components. + depth_of_field_name = "DepthOfField" + depth_of_field_entity = EditorEntity.create_editor_entity_at( + math.Vector3(512.0, 512.0, 34.0), depth_of_field_name) + Report.critical_result(Tests.depth_of_field_creation, depth_of_field_entity.exists()) + + # 2. Add a DepthOfField component to DepthOfField entity. + depth_of_field_component = depth_of_field_entity.add_component(depth_of_field_name) + Report.critical_result(Tests.depth_of_field_component, depth_of_field_entity.has_component(depth_of_field_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not depth_of_field_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, depth_of_field_entity.exists()) + + # 5. Verify DepthOfField component not enabled. + Report.result(Tests.depth_of_field_disabled, not depth_of_field_component.is_enabled()) + + # 6. Add Post FX Layer component since it is required by the DepthOfField component. + post_fx_layer = "PostFX Layer" + depth_of_field_entity.add_component(post_fx_layer) + Report.result(Tests.post_fx_component, depth_of_field_entity.has_component(post_fx_layer)) + + # 7. Verify DepthOfField component is enabled. + Report.result(Tests.depth_of_field_enabled, depth_of_field_component.is_enabled()) + + # 8. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 9. Test IsHidden. + depth_of_field_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, depth_of_field_entity.is_hidden() is True) + + # 10. Test IsVisible. + depth_of_field_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, depth_of_field_entity.is_visible() is True) + + # 11. Add Camera entity. + camera_name = "Camera" + camera_entity = EditorEntity.create_editor_entity_at(math.Vector3(512.0, 512.0, 34.0), camera_name) + Report.result(Tests.camera_creation, camera_entity.exists()) + + # 12. Add Camera component to Camera entity. + camera_entity.add_component(camera_name) + Report.result(Tests.camera_component_added, camera_entity.has_component(camera_name)) + + # 13. Set the DepthOfField components's Camera Entity to the newly created Camera entity. + depth_of_field_camera_property_path = "Controller|Configuration|Camera Entity" + depth_of_field_component.set_component_property_value(depth_of_field_camera_property_path, camera_entity.id) + camera_entity_set = depth_of_field_component.get_component_property_value(depth_of_field_camera_property_path) + Report.result(Tests.camera_property_set, camera_entity.id == camera_entity_set) + + # 14. Delete DepthOfField entity. + depth_of_field_entity.delete() + Report.result(Tests.entity_deleted, not depth_of_field_entity.exists()) + + # 15. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, depth_of_field_entity.exists()) + + # 16. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not depth_of_field_entity.exists()) + + # 17. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_DepthOfField_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DirectionalLightAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DirectionalLightAdded.py new file mode 100644 index 0000000000..048e132df4 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DirectionalLightAdded.py @@ -0,0 +1,157 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + directional_light_creation = ("Directional Light Entity successfully created", "Directional Light Entity failed to be created") + directional_light_component = ("Entity has a Directional Light component", "Entity failed to find Directional Light component") + shadow_camera_check = ("Directional Light component Shadow camera set", "Directional Light component Shadow camera was not set") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_DirectionalLight_AddedToEntity(): + """ + Summary: + Tests the Directional Light component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Directional Light entity with no components. + 2) Add Directional Light component to Directional Light entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Add Camera entity. + 9) Add Camera component to Camera entity + 10) Set the Directional Light component property Shadow|Camera to the Camera entity. + 11) Delete Directional Light entity. + 12) UNDO deletion. + 13) REDO deletion. + 14) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Directional Light entity with no components. + directional_light_name = "Directional Light" + directional_light_entity = EditorEntity.create_editor_entity_at( + math.Vector3(512.0, 512.0, 34.0), directional_light_name) + Report.critical_result(Tests.directional_light_creation, directional_light_entity.exists()) + + # 2. Add Directional Light component to Directional Light entity. + directional_light_component = directional_light_entity.add_component(directional_light_name) + Report.critical_result( + Tests.directional_light_component, directional_light_entity.has_component(directional_light_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not directional_light_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, directional_light_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + directional_light_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, directional_light_entity.is_hidden() is True) + + # 7. Test IsVisible. + directional_light_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, directional_light_entity.is_visible() is True) + + # 8. Add Camera entity. + camera_name = "Camera" + camera_entity = EditorEntity.create_editor_entity_at(math.Vector3(512.0, 512.0, 34.0), camera_name) + Report.result(Tests.camera_creation, camera_entity.exists()) + + # 9. Add Camera component to Camera entity. + camera_entity.add_component(camera_name) + Report.result(Tests.camera_component_added, camera_entity.has_component(camera_name)) + + # 10. Set the Directional Light component property Shadow|Camera to the Camera entity. + shadow_camera_property_path = "Controller|Configuration|Shadow|Camera" + directional_light_component.set_component_property_value(shadow_camera_property_path, camera_entity.id) + shadow_camera_set = directional_light_component.get_component_property_value(shadow_camera_property_path) + Report.result(Tests.shadow_camera_check, camera_entity.id == shadow_camera_set) + + # 11. Delete DirectionalLight entity. + directional_light_entity.delete() + Report.result(Tests.entity_deleted, not directional_light_entity.exists()) + + # 12. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, directional_light_entity.exists()) + + # 13. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not directional_light_entity.exists()) + + # 14. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_DirectionalLight_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DisplayMapperAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DisplayMapperAdded.py new file mode 100644 index 0000000000..39d7acf4f4 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_DisplayMapperAdded.py @@ -0,0 +1,137 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + display_mapper_creation = ("Display Mapper Entity successfully created", "Display Mapper Entity failed to be created") + display_mapper_component = ("Entity has a Display Mapper component", "Entity failed to find Display Mapper component") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_DisplayMapper_AddedToEntity(): + """ + Summary: + Tests the Display Mapper component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Display Mapper entity with no components. + 2) Add Display Mapper component to Display Mapper entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Delete Display Mapper entity. + 9) UNDO deletion. + 10) REDO deletion. + 11) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Display Mapper entity with no components. + display_mapper = "Display Mapper" + display_mapper_entity = EditorEntity.create_editor_entity_at( + math.Vector3(512.0, 512.0, 34.0), f"{display_mapper}") + Report.critical_result(Tests.display_mapper_creation, display_mapper_entity.exists()) + + # 2. Add Display Mapper component to Display Mapper entity. + display_mapper_entity.add_component(display_mapper) + Report.critical_result(Tests.display_mapper_component, display_mapper_entity.has_component(display_mapper)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not display_mapper_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, display_mapper_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + display_mapper_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, display_mapper_entity.is_hidden() is True) + + # 7. Test IsVisible. + display_mapper_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, display_mapper_entity.is_visible() is True) + + # 8. Delete Display Mapper entity. + display_mapper_entity.delete() + Report.result(Tests.entity_deleted, not display_mapper_entity.exists()) + + # 9. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, display_mapper_entity.exists()) + + # 10. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not display_mapper_entity.exists()) + + # 11. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_DisplayMapper_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_ExposureControlAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_ExposureControlAdded.py new file mode 100644 index 0000000000..23a84435f7 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_ExposureControlAdded.py @@ -0,0 +1,145 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + exposure_control_creation = ("ExposureControl Entity successfully created", "ExposureControl Entity failed to be created") + exposure_control_component = ("Entity has a Exposure Control component", "Entity failed to find Exposure Control component") + post_fx_component = ("Entity has a Post FX Layer component", "Entity did not have a Post FX Layer component") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_ExposureControl_AddedToEntity(): + """ + Summary: + Tests the Exposure Control component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create an Exposure Control entity with no components. + 2) Add Exposure Control component to Exposure Control entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Add Post FX Layer component. + 9) Delete Exposure Control entity. + 10) UNDO deletion. + 11) REDO deletion. + 12) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Creation of Exposure Control entity with no components. + exposure_control_name = "Exposure Control" + exposure_control_entity = EditorEntity.create_editor_entity_at( + math.Vector3(512.0, 512.0, 34.0), f"{exposure_control_name}") + Report.critical_result(Tests.exposure_control_creation, exposure_control_entity.exists()) + + # 2. Add Exposure Control component to Exposure Control entity. + exposure_control_entity.add_component(exposure_control_name) + Report.critical_result( + Tests.exposure_control_component, exposure_control_entity.has_component(exposure_control_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not exposure_control_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, exposure_control_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + exposure_control_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, exposure_control_entity.is_hidden() is True) + + # 7. Test IsVisible. + exposure_control_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, exposure_control_entity.is_visible() is True) + + # 8. Add Post FX Layer component. + post_fx_layer_name = "PostFX Layer" + exposure_control_entity.add_component(post_fx_layer_name) + Report.result(Tests.post_fx_component, exposure_control_entity.has_component(post_fx_layer_name)) + + # 9. Delete ExposureControl entity. + exposure_control_entity.delete() + Report.result(Tests.entity_deleted, not exposure_control_entity.exists()) + + # 10. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, exposure_control_entity.exists()) + + # 11. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not exposure_control_entity.exists()) + + # 12. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_ExposureControl_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py new file mode 100644 index 0000000000..cc891f5929 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_GlobalSkylightIBLAdded.py @@ -0,0 +1,164 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + global_skylight_creation = ("Global Skylight (IBL) Entity successfully created", "Global Skylight (IBL) Entity failed to be created") + global_skylight_component = ("Entity has a Global Skylight (IBL) component", "Entity failed to find Global Skylight (IBL) component") + diffuse_image_set = ("Entity has the Diffuse Image set", "Entity did not the Diffuse Image set") + specular_image_set = ("Entity has the Specular Image set", "Entity did not the Specular Image set") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_GlobalSkylightIBL_AddedToEntity(): + """ + Summary: + Tests the Global Skylight (IBL) component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Global Skylight (IBL) entity with no components. + 2) Add Global Skylight (IBL) component to Global Skylight (IBL) entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Add Post FX Layer component. + 9) Add Camera component + 10) Delete Global Skylight (IBL) entity. + 11) UNDO deletion. + 12) REDO deletion. + 13) Look for errors. + + :return: None + """ + import os + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.asset_utils import Asset + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Global Skylight (IBL) entity with no components. + global_skylight_name = "Global Skylight (IBL)" + global_skylight_entity = EditorEntity.create_editor_entity_at( + math.Vector3(512.0, 512.0, 34.0), global_skylight_name) + Report.critical_result(Tests.global_skylight_creation, global_skylight_entity.exists()) + + # 2. Add Global Skylight (IBL) component to Global Skylight (IBL) entity. + global_skylight_component = global_skylight_entity.add_component(global_skylight_name) + Report.critical_result( + Tests.global_skylight_component, global_skylight_entity.has_component(global_skylight_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not global_skylight_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, global_skylight_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + global_skylight_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, global_skylight_entity.is_hidden() is True) + + # 7. Test IsVisible. + global_skylight_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, global_skylight_entity.is_visible() is True) + + # 8. Set the Diffuse Image asset on the Global Skylight (IBL) entity. + global_skylight_diffuse_image_property = "Controller|Configuration|Diffuse Image" + diffuse_image_path = os.path.join("LightingPresets", "greenwich_park_02_4k_iblskyboxcm.exr.streamingimage") + diffuse_image_asset = Asset.find_asset_by_path(diffuse_image_path, False) + global_skylight_component.set_component_property_value( + global_skylight_diffuse_image_property, diffuse_image_asset.id) + diffuse_image_set = global_skylight_component.get_component_property_value( + global_skylight_diffuse_image_property) + Report.result(Tests.diffuse_image_set, diffuse_image_set == diffuse_image_asset.id) + + # 9. Set the Specular Image asset on the Global Light (IBL) entity. + global_skylight_specular_image_property = "Controller|Configuration|Specular Image" + specular_image_path = os.path.join("LightingPresets", "greenwich_park_02_4k_iblskyboxcm.exr.streamingimage") + specular_image_asset = Asset.find_asset_by_path(specular_image_path, False) + global_skylight_component.set_component_property_value( + global_skylight_specular_image_property, specular_image_asset.id) + specular_image_added = global_skylight_component.get_component_property_value( + global_skylight_specular_image_property) + Report.result(Tests.specular_image_set, specular_image_added == specular_image_asset.id) + + # 10. Delete Global Skylight (IBL) entity. + global_skylight_entity.delete() + Report.result(Tests.entity_deleted, not global_skylight_entity.exists()) + + # 11. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, global_skylight_entity.exists()) + + # 12. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not global_skylight_entity.exists()) + + # 13. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_GlobalSkylightIBL_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightAdded.py new file mode 100644 index 0000000000..8b1432f1f7 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightAdded.py @@ -0,0 +1,136 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + light_creation = ("Light Entity successfully created", "Light Entity failed to be created") + light_component = ("Entity has a Light component", "Entity failed to find Light component") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_Light_AddedToEntity(): + """ + Summary: + Tests the Light component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Light entity with no components. + 2) Add Light component to the Light entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Delete Light entity. + 9) UNDO deletion. + 10) REDO deletion. + 11) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Light entity with no components. + light_name = "Light" + light_entity = EditorEntity.create_editor_entity_at(math.Vector3(512.0, 512.0, 34.0), light_name) + Report.critical_result(Tests.light_creation, light_entity.exists()) + + # 2. Add Light component to the Light entity. + light_entity.add_component(light_name) + Report.critical_result(Tests.light_component, light_entity.has_component(light_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not light_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, light_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + light_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, light_entity.is_hidden() is True) + + # 7. Test IsVisible. + light_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, light_entity.is_visible() is True) + + # 8. Delete Light entity. + light_entity.delete() + Report.result(Tests.entity_deleted, not light_entity.exists()) + + # 9. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, light_entity.exists()) + + # 10. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not light_entity.exists()) + + # 11. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_Light_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py index 8d138e67b8..6da922bd9f 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_LightComponent.py @@ -1,10 +1,8 @@ """ -Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. SPDX-License-Identifier: Apache-2.0 OR MIT - -Hydra script that creates an entity, attaches the Light component to it for test verifications. -The test verifies that each light type option is available and can be selected without errors. """ import os diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PhysicalSkyAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PhysicalSkyAdded.py new file mode 100644 index 0000000000..04441d5b2c --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PhysicalSkyAdded.py @@ -0,0 +1,136 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + physical_sky_creation = ("Physical Sky Entity successfully created", "Physical Sky Entity failed to be created") + physical_sky_component = ("Entity has a Physical Sky component", "Entity failed to find Physical Sky component") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_PhysicalSky_AddedToEntity(): + """ + Summary: + Tests the Physical Sky component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Physical Sky entity with no components. + 2) Add Physical Sky component to Physical Sky entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Delete Physical Sky entity. + 9) UNDO deletion. + 10) REDO deletion. + 11) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Physical Sky entity with no components. + physical_sky_name = "Physical Sky" + physical_sky_entity = EditorEntity.create_editor_entity_at(math.Vector3(512.0, 512.0, 34.0), physical_sky_name) + Report.critical_result(Tests.physical_sky_creation, physical_sky_entity.exists()) + + # 2. Add Physical Sky component to Physical Sky entity. + physical_sky_entity.add_component(physical_sky_name) + Report.critical_result(Tests.physical_sky_component, physical_sky_entity.has_component(physical_sky_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not physical_sky_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, physical_sky_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + physical_sky_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, physical_sky_entity.is_hidden() is True) + + # 7. Test IsVisible. + physical_sky_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, physical_sky_entity.is_visible() is True) + + # 8. Delete Physical Sky entity. + physical_sky_entity.delete() + Report.result(Tests.entity_deleted, not physical_sky_entity.exists()) + + # 9. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, physical_sky_entity.exists()) + + # 10. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not physical_sky_entity.exists()) + + # 11. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_PhysicalSky_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py new file mode 100644 index 0000000000..8914ab9e7e --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded.py @@ -0,0 +1,138 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +# fmt: off +class Tests: + camera_creation = ("Camera Entity successfully created", "Camera Entity failed to be created") + camera_component_added = ("Camera component was added to entity", "Camera component failed to be added to entity") + camera_component_check = ("Entity has a Camera component", "Entity failed to find Camera component") + creation_undo = ("UNDO Entity creation success", "UNDO Entity creation failed") + creation_redo = ("REDO Entity creation success", "REDO Entity creation failed") + postfx_radius_weight_creation = ("PostFX Radius Weight Modifier Entity successfully created", "PostFX Radius Weight Modifier Entity failed to be created") + postfx_radius_weight_component = ("Entity has a PostFX Radius Weight Modifier component", "Entity failed to find PostFX Radius Weight Modifier component") + enter_game_mode = ("Entered game mode", "Failed to enter game mode") + exit_game_mode = ("Exited game mode", "Couldn't exit game mode") + is_visible = ("Entity is visible", "Entity was not visible") + is_hidden = ("Entity is hidden", "Entity was not hidden") + entity_deleted = ("Entity deleted", "Entity was not deleted") + deletion_undo = ("UNDO deletion success", "UNDO deletion failed") + deletion_redo = ("REDO deletion success", "REDO deletion failed") + no_error_occurred = ("No errors detected", "Errors were detected") +# fmt: on + + +def AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity(): + """ + Summary: + Tests the PostFX Radius Weight Modifier component can be added to an entity and has the expected functionality. + + Test setup: + - Wait for Editor idle loop. + - Open the "Base" level. + + Expected Behavior: + The component can be added, used in game mode, hidden/shown, deleted, and has accurate required components. + Creation and deletion undo/redo should also work. + + Test Steps: + 1) Create a Post FX Radius Weight Modifier entity with no components. + 2) Add Post FX Radius Weight Modifier component to Post FX Radius Weight Modifier entity. + 3) UNDO the entity creation and component addition. + 4) REDO the entity creation and component addition. + 5) Enter/Exit game mode. + 6) Test IsHidden. + 7) Test IsVisible. + 8) Delete PostFX Radius Weight Modifier entity. + 9) UNDO deletion. + 10) REDO deletion. + 11) Look for errors. + + :return: None + """ + + import azlmbr.legacy.general as general + import azlmbr.math as math + + from editor_python_test_tools.editor_entity_utils import EditorEntity + from editor_python_test_tools.utils import Report, Tracer, TestHelper as helper + + with Tracer() as error_tracer: + # Test setup begins. + # Setup: Wait for Editor idle loop before executing Python hydra scripts then open "Base" level. + helper.init_idle() + helper.open_level("", "Base") + + # Test steps begin. + # 1. Create a Post FX Radius Weight Modifier entity with no components. + postfx_radius_weight_name = "PostFX Radius Weight Modifier" + postfx_radius_weight_entity = EditorEntity.create_editor_entity_at( + math.Vector3(512.0, 512.0, 34.0), postfx_radius_weight_name) + Report.critical_result(Tests.postfx_radius_weight_creation, postfx_radius_weight_entity.exists()) + + # 2. Add Post FX Radius Weight Modifier component to Post FX Radius Weight Modifier entity. + postfx_radius_weight_entity.add_component(postfx_radius_weight_name) + Report.critical_result( + Tests.postfx_radius_weight_component, postfx_radius_weight_entity.has_component(postfx_radius_weight_name)) + + # 3. UNDO the entity creation and component addition. + # -> UNDO component addition. + general.undo() + # -> UNDO naming entity. + general.undo() + # -> UNDO selecting entity. + general.undo() + # -> UNDO entity creation. + general.undo() + general.idle_wait_frames(1) + Report.result(Tests.creation_undo, not postfx_radius_weight_entity.exists()) + + # 4. REDO the entity creation and component addition. + # -> REDO entity creation. + general.redo() + # -> REDO selecting entity. + general.redo() + # -> REDO naming entity. + general.redo() + # -> REDO component addition. + general.redo() + general.idle_wait_frames(1) + Report.result(Tests.creation_redo, postfx_radius_weight_entity.exists()) + + # 5. Enter/Exit game mode. + helper.enter_game_mode(Tests.enter_game_mode) + general.idle_wait_frames(1) + helper.exit_game_mode(Tests.exit_game_mode) + + # 6. Test IsHidden. + postfx_radius_weight_entity.set_visibility_state(False) + Report.result(Tests.is_hidden, postfx_radius_weight_entity.is_hidden() is True) + + # 7. Test IsVisible. + postfx_radius_weight_entity.set_visibility_state(True) + general.idle_wait_frames(1) + Report.result(Tests.is_visible, postfx_radius_weight_entity.is_visible() is True) + + # 8. Delete PostFX Radius Weight Modifier entity. + postfx_radius_weight_entity.delete() + Report.result(Tests.entity_deleted, not postfx_radius_weight_entity.exists()) + + # 9. UNDO deletion. + general.undo() + Report.result(Tests.deletion_undo, postfx_radius_weight_entity.exists()) + + # 10. REDO deletion. + general.redo() + Report.result(Tests.deletion_redo, not postfx_radius_weight_entity.exists()) + + # 11. Look for errors. + helper.wait_for_condition(lambda: error_tracer.has_errors, 1.0) + Report.result(Tests.no_error_occurred, not error_tracer.has_errors) + + +if __name__ == "__main__": + from editor_python_test_tools.utils import Report + Report.start_test(AtomEditorComponents_PostFXRadiusWeightModifier_AddedToEntity) diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py index 9047b4c871..1e250e5b9f 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_AtomMaterialEditor_BasicTests.py @@ -3,12 +3,12 @@ Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. SPDX-License-Identifier: Apache-2.0 OR MIT - -import azlmbr.materialeditor will fail with a ModuleNotFound error when using this script with Editor.exe -This is because azlmbr.materialeditor only binds to MaterialEditor.exe and not Editor.exe -You need to launch this script with MaterialEditor.exe in order for azlmbr.materialeditor to appear. """ +# import azlmbr.materialeditor will fail with a ModuleNotFound error when using this script with Editor.exe +# This is because azlmbr.materialeditor only binds to MaterialEditor.exe and not Editor.exe +# You need to launch this script with MaterialEditor.exe in order for azlmbr.materialeditor to appear. + import os import sys import time diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_AtomFeatureIntegrationBenchmark.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_AtomFeatureIntegrationBenchmark.py index 3aa9fe660c..7e7087fb42 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_AtomFeatureIntegrationBenchmark.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_AtomFeatureIntegrationBenchmark.py @@ -3,11 +3,6 @@ Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. SPDX-License-Identifier: Apache-2.0 OR MIT - -Hydra script that is used to create a new level with a default rendering setup. -After the level is setup, screenshots are diffed against golden images are used to verify pass/fail results of the test. - -See the run() function for more in-depth test info. """ import os diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_BasicLevelSetup.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_BasicLevelSetup.py index 920c044be0..24ebbdff63 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_BasicLevelSetup.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_BasicLevelSetup.py @@ -3,11 +3,6 @@ Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. SPDX-License-Identifier: Apache-2.0 OR MIT - -Hydra script that is used to create a new level with a default rendering setup. -After the level is setup, screenshots are diffed against golden images are used to verify pass/fail results of the test. - -See the run() function for more in-depth test info. """ import os diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_LightComponent.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_LightComponent.py index 8063445608..5c019dc3f3 100644 --- a/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_LightComponent.py +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/atom_hydra_scripts/hydra_GPUTest_LightComponent.py @@ -3,12 +3,6 @@ Copyright (c) Contributors to the Open 3D Engine Project. For complete copyright and license terms please see the LICENSE at the root of this distribution. SPDX-License-Identifier: Apache-2.0 OR MIT - -Hydra script that is used to create an entity with a Light component attached. -It then updates the property values of the Light component and takes a screenshot. -The screenshot is compared against an expected golden image for test verification. - -See the run() function for more in-depth test info. """ import os import sys diff --git a/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite_Optimized.py b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite_Optimized.py new file mode 100644 index 0000000000..329d3ecb91 --- /dev/null +++ b/AutomatedTesting/Gem/PythonTests/atom_renderer/test_Atom_MainSuite_Optimized.py @@ -0,0 +1,43 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" +import pytest + +from ly_test_tools.o3de.editor_test import EditorSharedTest, EditorTestSuite + + +@pytest.mark.xfail(reason="Optimized tests are experimental, we will enable xfail and monitor them temporarily.") +@pytest.mark.parametrize("project", ["AutomatedTesting"]) +@pytest.mark.parametrize("launcher_platform", ['windows_editor']) +class TestAutomation(EditorTestSuite): + + class AtomEditorComponents_DecalAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_DecalAdded as test_module + + class AtomEditorComponents_DepthOfFieldAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_DepthOfFieldAdded as test_module + + class AtomEditorComponents_DirectionalLightAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_DirectionalLightAdded as test_module + + class AtomEditorComponents_ExposureControlAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_ExposureControlAdded as test_module + + class AtomEditorComponents_GlobalSkylightIBLAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_GlobalSkylightIBLAdded as test_module + + class AtomEditorComponents_PhysicalSkyAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_PhysicalSkyAdded as test_module + + class AtomEditorComponents_PostFXRadiusWeightModifierAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import ( + hydra_AtomEditorComponents_PostFXRadiusWeightModifierAdded as test_module) + + class AtomEditorComponents_LightAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_LightAdded as test_module + + class AtomEditorComponents_DisplayMapperAdded(EditorSharedTest): + from atom_renderer.atom_hydra_scripts import hydra_AtomEditorComponents_DisplayMapperAdded as test_module From 86ccf1c86e5a4255a8c5e09231d0351a34ac3cb8 Mon Sep 17 00:00:00 2001 From: bosnichd Date: Thu, 16 Sep 2021 12:26:57 -0600 Subject: [PATCH 343/355] Input context component (#4152) * Create a new InputContextComponent. - An InputContextComponent is used to configure (at edit time) the data necessary to create an AzFrameowrk::InputContext (at run time). The lifecycle of any InputContextComponent is controlled by the AZ::Entity it is attached to (adhering to the same rules as any other AZ::Component), and the InputContext which it owns is created/destroyed when the component is activated/deactivated. - The underlying AzFramework::InputContext and AzFramework::InputMapping* classes already exist, along with comprehensive unit tests (see Code/Framework/AzFramework/Tests/InputTests.cpp). All changes in this PR are simply to allow input contexts / input mappings to be defined/edited from the editor using data. - The new InputContextComponent is similar in many respects to the InputConfigurationComponent found in the StartingPointInput Gem, the main difference being that the user-defined input mapping objects the new component creates are identical (from the perspective of any input consumer) to 'raw' engine-defined input channels (the existing AzFramework::InputMapping class inherits from the existing AzFramework::InputChannel class). This means that any system which consumes input (in either C++ or lua) can seamlessly interchange between obtaining input using either the 'raw' engine-defined input channels (eg. InputDeviceGamepad::Button::A, InputDeviceKeyboard::Key::AlphanumericA, etc.) or any user-defined input mapping, which can now be defined from the editor using data. Ultimately I would like to deprecate the StartingPointInput::InputConfigurationComponent in favour of this new InputContextComponent, which isn't realistic at present because the former is used pervasively throughout many different projects, and it integrates with ScriptCanvas in a way that I have yet to replicate, but this is a step towards the goal of a unified, engine-wide input context/input mapping solution that can be used interchangeably by any system, project, or Gem. Signed-off-by: bosnichd * Edited some reflected property descriptions for clarity. Signed-off-by: bosnichd * Fix clang builds: - Add a missing virtual destructor. - Fix the scope of two reflected property attribute functions. Signed-off-by: bosnichd * Fix for InputContextComponent being reflected twice in some cirsumstances. Signed-off-by: bosnichd * Updates in response to PR feedback. Signed-off-by: bosnichd * More updates based on review feedback. Signed-off-by: bosnichd --- .../AzFramework/AzFrameworkModule.cpp | 2 + .../AzFramework/Input/Contexts/InputContext.h | 4 + .../Input/Contexts/InputContextComponent.cpp | 172 ++++++++++++++++++ .../Input/Contexts/InputContextComponent.h | 129 +++++++++++++ .../Input/Mappings/InputMapping.cpp | 147 +++++++++++++++ .../AzFramework/Input/Mappings/InputMapping.h | 106 +++++++++++ .../Input/Mappings/InputMappingAnd.cpp | 63 +++++++ .../Input/Mappings/InputMappingAnd.h | 32 ++++ .../Input/Mappings/InputMappingOr.cpp | 63 +++++++ .../Input/Mappings/InputMappingOr.h | 32 ++++ .../AzFramework/azframework_files.cmake | 2 + 11 files changed, 752 insertions(+) create mode 100644 Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.cpp create mode 100644 Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.h diff --git a/Code/Framework/AzFramework/AzFramework/AzFrameworkModule.cpp b/Code/Framework/AzFramework/AzFramework/AzFrameworkModule.cpp index c5fee7ec9a..83f1954e11 100644 --- a/Code/Framework/AzFramework/AzFramework/AzFrameworkModule.cpp +++ b/Code/Framework/AzFramework/AzFramework/AzFrameworkModule.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -47,6 +48,7 @@ namespace AzFramework AzFramework::CreateScriptDebugAgentFactory(), AzFramework::AssetSystem::AssetSystemComponent::CreateDescriptor(), AzFramework::InputSystemComponent::CreateDescriptor(), + AzFramework::InputContextComponent::CreateDescriptor(), #if !defined(AZCORE_EXCLUDE_LUA) AzFramework::ScriptComponent::CreateDescriptor(), diff --git a/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContext.h b/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContext.h index 7220b8b8d5..e7143a25b9 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContext.h +++ b/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContext.h @@ -55,6 +55,10 @@ namespace AzFramework // Allocator AZ_CLASS_ALLOCATOR(InputContext, AZ::SystemAllocator, 0); + //////////////////////////////////////////////////////////////////////////////////////////// + // Type Info + AZ_RTTI(InputContext, "{D17A85B2-405F-40AB-BBA7-F118256D39AB}", InputDevice); + //////////////////////////////////////////////////////////////////////////////////////////// //! Constructor //! \param[in] name Unique, will be truncated if exceeds InputDeviceId::MAX_NAME_LENGTH = 64 diff --git a/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.cpp b/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.cpp new file mode 100644 index 0000000000..ff147bd9d8 --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.cpp @@ -0,0 +1,172 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include + +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace AzFramework +{ + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC("InputContextService", 0xa2734425)); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(0) + ->Field("Unique Name", &InputContextComponent::m_uniqueName) + ->Field("Input Mappings", &InputContextComponent::m_inputMappings) + ->Field("Local Player Index", &InputContextComponent::m_localPlayerIndex) + ->Field("Input Listener Priority", &InputContextComponent::m_inputListenerPriority) + ->Field("Consumes Processed Input", &InputContextComponent::m_consumesProcessedInput) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("Input Context", + "An input context is a collection of input mappings, which map 'raw' input to custom input channels (ie. events).") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::Category, "Input") + ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) + ->DataElement(AZ::Edit::UIHandlers::Default, &InputContextComponent::m_uniqueName, "Unique Name", + "The name of the input context, unique among all active input contexts and input devices.\n" + "This will be truncated if its length exceeds that of InputDeviceId::MAX_NAME_LENGTH = 64") + ->DataElement(AZ::Edit::UIHandlers::Default, &InputContextComponent::m_inputMappings, "Input Mappings", + "The list of all input mappings that will be created when the input context is activated.") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->DataElement(AZ::Edit::UIHandlers::SpinBox, &InputContextComponent::m_localPlayerIndex, "Local Player Index", + "The local player index that this context will receive input from (0 based, -1 means all controllers).\n" + "Will only work on platforms such as PC where the local user id corresponds to the local player index.\n" + "For other platforms, SetLocalUserId must be called at runtime with the id of a logged in user.") + ->Attribute(AZ::Edit::Attributes::Min, -1) + ->Attribute(AZ::Edit::Attributes::Max, 3) + ->DataElement(AZ::Edit::UIHandlers::SpinBox, &InputContextComponent::m_inputListenerPriority, "Input Listener Priority", + "The priority used to sort the input context relative to all other input event listeners.\n" + "Higher numbers indicate greater priority.") + ->Attribute(AZ::Edit::Attributes::Min, InputChannelEventListener::GetPriorityLast()) + ->Attribute(AZ::Edit::Attributes::Max, InputChannelEventListener::GetPriorityFirst()) + ->DataElement(AZ::Edit::UIHandlers::CheckBox, &InputContextComponent::m_consumesProcessedInput, "Consumes Processed Input", + "Should the input context consume input that is processed by any of its input mappings?") + ; + } + } + + InputMapping::ConfigBase::Reflect(context); + InputMappingAnd::Config::Reflect(context); + InputMappingOr::Config::Reflect(context); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + InputContextComponent::~InputContextComponent() + { + Deactivate(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::Init() + { + // The local player index that this component will receive input from (0 base, -1 wildcard) + // can be set from data, but will only work on platforms where the local user id corresponds + // to a local player index. For other platforms SetLocalUserId must be called at runtime with + // the id of a logged in local user, which will overwrite anything that is set here from data. + const LocalUserId localUserId = (m_localPlayerIndex == -1) ? LocalUserIdAny : aznumeric_cast(m_localPlayerIndex); + SetLocalUserId(localUserId); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::Activate() + { + InputContextComponentRequestBus::Handler::BusConnect(GetEntityId()); + CreateInputContext(); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::Deactivate() + { + ResetInputContext(); + InputContextComponentRequestBus::Handler::BusDisconnect(GetEntityId()); + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::SetLocalUserId(LocalUserId localUserId) + { + // Create a new filter, or reset any existing one if we have been passed LocalUserIdAny. + if (localUserId != LocalUserIdAny) + { + m_localUserIdFilter = AZStd::make_shared(InputChannelEventFilter::AnyChannelNameCrc32, + InputChannelEventFilter::AnyDeviceNameCrc32, + aznumeric_cast(m_localPlayerIndex)); + } + else + { + m_localUserIdFilter.reset(); + } + + // Set the filter if the input context has already been created. + if (m_inputContext) + { + m_inputContext->SetFilter(m_localUserIdFilter); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::CreateInputContext() + { + if (m_uniqueName.empty()) + { + AZ_Error("InputContextComponent", false, "Cannot create input context with empty name."); + return; + } + + if (InputDeviceRequests::FindInputDevice(InputDeviceId(m_uniqueName.c_str()))) + { + AZ_Error("InputContextComponent", false, + "Cannot create input context '%s' with non-unique name.", m_uniqueName.c_str()); + return; + } + + if (m_inputMappings.empty()) + { + AZ_Error("InputContextComponent", false, + "Cannot create input context '%s' with no input mappings.", m_uniqueName.c_str()); + return; + } + + // Create the input context. + InputContext::InitData initData; + initData.autoActivate = true; + initData.filter = m_localUserIdFilter; + initData.priority = m_inputListenerPriority; + initData.consumesProcessedInput = m_consumesProcessedInput; + m_inputContext = AZStd::make_unique(m_uniqueName.c_str(), initData); + + // Create and add all input mappings. + for (const InputMapping::ConfigBase* inputMapping : m_inputMappings) + { + inputMapping->CreateInputMappingAndAddToContext(*m_inputContext); + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputContextComponent::ResetInputContext() + { + m_inputContext.reset(); + } +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.h b/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.h new file mode 100644 index 0000000000..1b9286bd4c --- /dev/null +++ b/Code/Framework/AzFramework/AzFramework/Input/Contexts/InputContextComponent.h @@ -0,0 +1,129 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////////////////////////// +namespace AzFramework +{ + //////////////////////////////////////////////////////////////////////////////////////////////// + class InputContextComponentRequests : public AZ::ComponentBus + { + public: + //////////////////////////////////////////////////////////////////////////////////////////// + //! Set the local user id that the InputContextComponent should process input from + //! \param[in] localUserId Local user id the InputContextComponent should process input from + virtual void SetLocalUserId(LocalUserId localUserId) = 0; + }; + using InputContextComponentRequestBus = AZ::EBus; + + //////////////////////////////////////////////////////////////////////////////////////////////// + //! An InputContextComponent is used to configure (at edit time) the data necessary to create an + //! InputContext (at run time). The life cycle of any InputContextComponent is controlled by the + //! AZ::Entity it is attached to, adhering to the same rules as any other AZ::Component, and the + //! InputContext which it owns is created/destroyed when the component is activated/deactivated. + class InputContextComponent : public AZ::Component + , public InputContextComponentRequestBus::Handler + { + public: + //////////////////////////////////////////////////////////////////////////////////////////// + // AZ::Component Setup + AZ_COMPONENT(InputContextComponent, "{321689F8-A572-47D7-9D1C-EF9E0D2CD472}"); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AZ::ComponentDescriptor::GetProvidedServices + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AZ::ComponentDescriptor::Reflect + static void Reflect(AZ::ReflectContext* context); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Default Constructor + InputContextComponent() = default; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Destructor + ~InputContextComponent() override; + + protected: + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AZ::Component::Init + void Init() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AZ::Component::Activate + void Activate() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! \ref AZ::Component::Deactivate + void Deactivate() override; + + //////////////////////////////////////////////////////////////////////////////////////////// + // \ref AzFramework::InputContextComponentRequests::SetLocalUserId + void SetLocalUserId(LocalUserId localUserId) override; + + private: + //////////////////////////////////////////////////////////////////////////////////////////// + //! Create the input context. + void CreateInputContext(); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Reset the input context. + void ResetInputContext(); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! The list of all input mappings that will be created when the input context is activated. + //! Reflected to EditContext, then used to create and add input mapping classes in Activate. + AZStd::vector m_inputMappings; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! The name of the input context, unique among all active input contexts and input devices. + //! This will be truncated if its length exceeds that of InputDeviceId::MAX_NAME_LENGTH = 64 + //! Reflected to EditContext, then used to create the unique input context class in Activate. + AZStd::string m_uniqueName; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Input context that is created and owned by this component. Not reflected to EditContext. + AZStd::unique_ptr m_inputContext; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Filter used to determine whether an input event should be handled by this input context. + //! Not reflected, but created inside SetLocalUserId if needed to fliter by a local user id. + AZStd::shared_ptr m_localUserIdFilter; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! The local player index that this component will receive input from (0 base, -1 wildcard). + //! Will only work on platforms where the local user id corresponds to the local player index. + //! For other platforms, SetLocalUserId must be called at runtime with id of a logged in user. + //! Reflected to EditContext, then used if needed to create the local user id filter in Init. + AZ::s32 m_localPlayerIndex = -1; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! The priority used to sort the input context relative to all other input event listeners. + //! Reflected to EditContext, then used to create the unique input context class in Activate. + AZ::s32 m_inputListenerPriority = InputChannelEventListener::GetPriorityDefault(); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Should the input context consume input that is processed by any of its input mappings? + //! Reflected to EditContext, then used to create the unique input context class in Activate. + bool m_consumesProcessedInput = false; + }; +} // namespace AzFramework diff --git a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.cpp b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.cpp index 2f848368ca..b8a261677f 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.cpp +++ b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.cpp @@ -9,9 +9,156 @@ #include #include +#include +#include +#include + //////////////////////////////////////////////////////////////////////////////////////////////////// namespace AzFramework { + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputMapping::InputChannelNameFilteredByDeviceType::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(0) + ->Field("Input Device Type", &InputChannelNameFilteredByDeviceType::m_inputDeviceType) + ->Field("Input Channel Name", &InputChannelNameFilteredByDeviceType::m_inputChannelName) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("InputChannelNameFilteredByDeviceType", + "An input channel name (filtered by an input device type) to add to the input mapping.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &InputChannelNameFilteredByDeviceType::GetNameLabelOverride) + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &InputChannelNameFilteredByDeviceType::m_inputDeviceType, "Input Device Type", + "The type of input device by which to filter input channel names.") + ->Attribute(AZ::Edit::Attributes::StringList, &InputChannelNameFilteredByDeviceType::GetValidInputDeviceTypes) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, &InputChannelNameFilteredByDeviceType::OnInputDeviceTypeSelected) + ->DataElement(AZ::Edit::UIHandlers::ComboBox, &InputChannelNameFilteredByDeviceType::m_inputChannelName, "Input Channel Name", + "The input channel name to add to the input mapping.") + ->Attribute(AZ::Edit::Attributes::StringList, &InputChannelNameFilteredByDeviceType::GetValidInputChannelNamesBySelectedDevice) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ; + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + InputMapping::InputChannelNameFilteredByDeviceType::InputChannelNameFilteredByDeviceType() + { + // Try initialize the selected input device type and input channel name to something valid. + if (m_inputDeviceType.empty()) + { + const AZStd::vector validInputDeviceTypes = GetValidInputDeviceTypes(); + if (!validInputDeviceTypes.empty()) + { + m_inputDeviceType = validInputDeviceTypes[0]; + OnInputDeviceTypeSelected(); + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + AZ::Crc32 InputMapping::InputChannelNameFilteredByDeviceType::OnInputDeviceTypeSelected() + { + const AZStd::vector validInputNames = GetValidInputChannelNamesBySelectedDevice(); + if (!validInputNames.empty()) + { + m_inputChannelName = validInputNames[0]; + } + return AZ::Edit::PropertyRefreshLevels::AttributesAndValues; + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + AZStd::string InputMapping::InputChannelNameFilteredByDeviceType::GetNameLabelOverride() const + { + return m_inputChannelName.empty() ? "" : m_outputInputChannelName; + } + //////////////////////////////////////////////////////////////////////////////////////////////// InputMapping::InputMapping(const InputChannelId& inputChannelId, const InputContext& inputContext) : InputChannel(inputChannelId, inputContext) diff --git a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.h b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.h index 93ca96eded..c2f82fb7f8 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.h +++ b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMapping.h @@ -12,6 +12,7 @@ #include #include +#include //////////////////////////////////////////////////////////////////////////////////////////////////// namespace AzFramework @@ -26,6 +27,111 @@ namespace AzFramework class InputMapping : public InputChannel { public: + //////////////////////////////////////////////////////////////////////////////////////////// + //! Convenience class that allows for selection of an input channel name filtered by device. + struct InputChannelNameFilteredByDeviceType + { + public: + //////////////////////////////////////////////////////////////////////////////////////// + // Allocator + AZ_CLASS_ALLOCATOR(InputChannelNameFilteredByDeviceType, AZ::SystemAllocator, 0); + + //////////////////////////////////////////////////////////////////////////////////////// + // Type Info + AZ_RTTI(InputChannelNameFilteredByDeviceType, "{68CC4865-1C0E-4E2E-BDAE-AF42EA30DBE8}"); + + //////////////////////////////////////////////////////////////////////////////////////// + // Reflection + static void Reflect(AZ::ReflectContext* context); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Constructor + InputChannelNameFilteredByDeviceType(); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Destructor + virtual ~InputChannelNameFilteredByDeviceType() = default; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Get the currently selected input device type. + //! \return Currently selected input device type. + inline const AZStd::string& GetInputDeviceType() const { return m_inputDeviceType; } + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Get the currently selected input channel name. + //! \return Currently selected input channel name. + inline const AZStd::string& GetInputChannelName() const { return m_inputChannelName; } + + protected: + //////////////////////////////////////////////////////////////////////////////////////////// + //! Called when an input device type is selected. + //! \return The AZ::Edit::PropertyRefreshLevels to apply to the property tree view. + virtual AZ::Crc32 OnInputDeviceTypeSelected(); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Get the name label override to display. + //! \return Name label override to display. + virtual AZStd::string GetNameLabelOverride() const; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Get the valid input device types for this input mapping. + //! \return Valid input device types for this input mapping. + virtual AZStd::vector GetValidInputDeviceTypes() const; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Get the valid input channel names for this input mapping given the selected device type. + //! \return Valid input channel names for this input mapping given the selected device type. + virtual AZStd::vector GetValidInputChannelNamesBySelectedDevice() const; + + private: + //////////////////////////////////////////////////////////////////////////////////////////// + // Variables + AZStd::string m_inputDeviceType; //!< The currently selected input device type. + AZStd::string m_inputChannelName; //!< The currently selected input channel name. + }; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Base class for input mapping configuration values that are exposed to the editor. + class ConfigBase + { + public: + //////////////////////////////////////////////////////////////////////////////////////// + // Allocator + AZ_CLASS_ALLOCATOR(ConfigBase, AZ::SystemAllocator, 0); + + //////////////////////////////////////////////////////////////////////////////////////// + // Type Info + AZ_RTTI(ConfigBase, "{72EBBBCC-D57E-4085-AFD9-4910506010B6}"); + + //////////////////////////////////////////////////////////////////////////////////////// + // Reflection + static void Reflect(AZ::ReflectContext* context); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Destructor + virtual ~ConfigBase() = default; + + //////////////////////////////////////////////////////////////////////////////////////// + //! Create an input mapping and add it to the input context. + //! \param[in] inputContext Input context that the input mapping will be added to. + AZStd::shared_ptr CreateInputMappingAndAddToContext(InputContext& inputContext) const; + + //////////////////////////////////////////////////////////////////////////////////////// + //! Override to create the relevant input mapping. + //! \param[in] inputContext Input context that owns the input mapping. + virtual AZStd::shared_ptr CreateInputMapping(const InputContext& inputContext) const = 0; + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Get the name label override to display. + //! \return Name label override to display. + virtual AZStd::string GetNameLabelOverride() const; + + protected: + //////////////////////////////////////////////////////////////////////////////////////// + //! The unique input channel name (event) output by the input mapping. + AZStd::string m_outputInputChannelName; + }; + //////////////////////////////////////////////////////////////////////////////////////////// // Allocator AZ_CLASS_ALLOCATOR(InputMapping, AZ::SystemAllocator, 0); diff --git a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.cpp b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.cpp index 5d371888da..6837807f4e 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.cpp +++ b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.cpp @@ -8,9 +8,72 @@ #include +#include +#include +#include + //////////////////////////////////////////////////////////////////////////////////////////////////// namespace AzFramework { + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputMappingAnd::Config::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(0) + ->Field("Source Input Channel Names", &Config::m_sourceInputChannelNames) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("Input Mapping: And", + "Maps multiple different input sources to a single output using 'AND' logic.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &InputMappingAnd::Config::GetNameLabelOverride) + ->DataElement(AZ::Edit::UIHandlers::Default, &Config::m_sourceInputChannelNames, "Source Input Channel Names", + "The source input channel names that will be mapped to the output input channel name.") + ; + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + AZStd::shared_ptr InputMappingAnd::Config::CreateInputMapping(const InputContext& inputContext) const + { + if (m_outputInputChannelName.empty()) + { + AZ_Error("InputMappingAnd::Config", false, "Cannot create input mapping with empty name."); + return nullptr; + } + + if (InputChannelRequests::FindInputChannel(InputChannelId(m_outputInputChannelName.c_str()))) + { + AZ_Error("InputMappingAnd::Config", false, + "Cannot create input mapping '%s' with non-unique name.", m_outputInputChannelName.c_str()); + return nullptr; + } + + if (m_sourceInputChannelNames.empty()) + { + AZ_Error("InputMappingAnd::Config", false, + "Cannot create input mapping '%s' with no source inputs.", m_outputInputChannelName.c_str()); + return nullptr; + } + + const InputChannelId outputInputChannelId(m_outputInputChannelName.c_str()); + AZStd::shared_ptr inputMapping = AZStd::make_shared(outputInputChannelId, + inputContext); + for (const InputChannelNameFilteredByDeviceType& sourceInputChannelName : m_sourceInputChannelNames) + { + const InputChannelId sourceInputChannelId(sourceInputChannelName.GetInputChannelName().c_str()); + inputMapping->AddSourceInput(sourceInputChannelId); + } + return inputMapping; + } + //////////////////////////////////////////////////////////////////////////////////////////////// InputMappingAnd::InputMappingAnd(const InputChannelId& inputChannelId, const InputContext& inputContext) : InputMapping(inputChannelId, inputContext) diff --git a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.h b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.h index d7a767e3a5..61e54497db 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.h +++ b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingAnd.h @@ -19,6 +19,38 @@ namespace AzFramework class InputMappingAnd : public InputMapping { public: + //////////////////////////////////////////////////////////////////////////////////////////// + //! The input mapping configuration values that are exposed to the editor. + class Config : public InputMapping::ConfigBase + { + public: + //////////////////////////////////////////////////////////////////////////////////////// + // Allocator + AZ_CLASS_ALLOCATOR(Config, AZ::SystemAllocator, 0); + + //////////////////////////////////////////////////////////////////////////////////////// + // Type Info + AZ_RTTI(Config, "{54E972F3-0477-4E2E-93F5-4E06ED755DF6}", InputMapping::ConfigBase); + + //////////////////////////////////////////////////////////////////////////////////////// + // Reflection + static void Reflect(AZ::ReflectContext* context); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Destructor + ~Config() override = default; + + protected: + //////////////////////////////////////////////////////////////////////////////////////// + //! \ref AzFramework::InputMapping::Type::CreateInputMapping + AZStd::shared_ptr CreateInputMapping(const InputContext& inputContext) const override; + + private: + //////////////////////////////////////////////////////////////////////////////////////// + //! The source input channel names that will be mapped to the output input channel name. + AZStd::vector m_sourceInputChannelNames; + }; + //////////////////////////////////////////////////////////////////////////////////////////// // Allocator AZ_CLASS_ALLOCATOR(InputMappingAnd, AZ::SystemAllocator, 0); diff --git a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.cpp b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.cpp index 459d32dc68..bc47065c05 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.cpp +++ b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.cpp @@ -8,9 +8,72 @@ #include +#include +#include +#include + //////////////////////////////////////////////////////////////////////////////////////////////////// namespace AzFramework { + //////////////////////////////////////////////////////////////////////////////////////////////// + void InputMappingOr::Config::Reflect(AZ::ReflectContext* context) + { + if (AZ::SerializeContext* serializeContext = azrtti_cast(context)) + { + serializeContext->Class() + ->Version(0) + ->Field("Source Input Channel Names", &Config::m_sourceInputChannelNames) + ; + + if (AZ::EditContext* editContext = serializeContext->GetEditContext()) + { + editContext->Class("Input Mapping: Or", + "Maps multiple different input sources to a single output using 'OR' logic.") + ->ClassElement(AZ::Edit::ClassElements::EditorData, "") + ->Attribute(AZ::Edit::Attributes::AutoExpand, true) + ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::AttributesAndValues) + ->Attribute(AZ::Edit::Attributes::NameLabelOverride, &InputMappingOr::Config::GetNameLabelOverride) + ->DataElement(AZ::Edit::UIHandlers::Default, &Config::m_sourceInputChannelNames, "Source Input Channel Names", + "The source input channel names that will be mapped to the output input channel name.") + ; + } + } + } + + //////////////////////////////////////////////////////////////////////////////////////////////// + AZStd::shared_ptr InputMappingOr::Config::CreateInputMapping(const InputContext& inputContext) const + { + if (m_outputInputChannelName.empty()) + { + AZ_Error("InputMappingOr::Config", false, "Cannot create input mapping with empty name."); + return nullptr; + } + + if (InputChannelRequests::FindInputChannel(InputChannelId(m_outputInputChannelName.c_str()))) + { + AZ_Error("InputMappingOr::Config", false, + "Cannot create input mapping '%s' with non-unique name.", m_outputInputChannelName.c_str()); + return nullptr; + } + + if (m_sourceInputChannelNames.empty()) + { + AZ_Error("InputMappingOr::Config", false, + "Cannot create input mapping '%s' with no source inputs.", m_outputInputChannelName.c_str()); + return nullptr; + } + + const InputChannelId outputInputChannelId(m_outputInputChannelName.c_str()); + AZStd::shared_ptr inputMapping = AZStd::make_shared(outputInputChannelId, + inputContext); + for (const InputChannelNameFilteredByDeviceType& sourceInputChannelName : m_sourceInputChannelNames) + { + const InputChannelId sourceInputChannelId(sourceInputChannelName.GetInputChannelName().c_str()); + inputMapping->AddSourceInput(sourceInputChannelId); + } + return inputMapping; + } + //////////////////////////////////////////////////////////////////////////////////////////////// InputMappingOr::InputMappingOr(const InputChannelId& inputChannelId, const InputContext& inputContext) : InputMapping(inputChannelId, inputContext) diff --git a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.h b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.h index b8359f828e..a0440d1855 100644 --- a/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.h +++ b/Code/Framework/AzFramework/AzFramework/Input/Mappings/InputMappingOr.h @@ -19,6 +19,38 @@ namespace AzFramework class InputMappingOr : public InputMapping { public: + //////////////////////////////////////////////////////////////////////////////////////////// + //! The input mapping configuration values that are exposed to the editor. + class Config : public InputMapping::ConfigBase + { + public: + //////////////////////////////////////////////////////////////////////////////////////// + // Allocator + AZ_CLASS_ALLOCATOR(Config, AZ::SystemAllocator, 0); + + //////////////////////////////////////////////////////////////////////////////////////// + // Type Info + AZ_RTTI(Config, "{428AFDD4-D353-494A-BBAC-37E00F82CFFD}", InputMapping::ConfigBase); + + //////////////////////////////////////////////////////////////////////////////////////// + // Reflection + static void Reflect(AZ::ReflectContext* context); + + //////////////////////////////////////////////////////////////////////////////////////////// + //! Destructor + ~Config() override = default; + + protected: + //////////////////////////////////////////////////////////////////////////////////////// + //! \ref AzFramework::InputMapping::Type::CreateInputMapping + AZStd::shared_ptr CreateInputMapping(const InputContext& inputContext) const override; + + private: + //////////////////////////////////////////////////////////////////////////////////////// + //! The source input channel names that will be mapped to the output input channel name. + AZStd::vector m_sourceInputChannelNames; + }; + //////////////////////////////////////////////////////////////////////////////////////////// // Allocator AZ_CLASS_ALLOCATOR(InputMappingOr, AZ::SystemAllocator, 0); diff --git a/Code/Framework/AzFramework/AzFramework/azframework_files.cmake b/Code/Framework/AzFramework/AzFramework/azframework_files.cmake index 87cf29ffec..e752e5ae04 100644 --- a/Code/Framework/AzFramework/AzFramework/azframework_files.cmake +++ b/Code/Framework/AzFramework/AzFramework/azframework_files.cmake @@ -343,6 +343,8 @@ set(FILES Input/Channels/InputChannelQuaternion.h Input/Contexts/InputContext.cpp Input/Contexts/InputContext.h + Input/Contexts/InputContextComponent.cpp + Input/Contexts/InputContextComponent.h Input/Devices/InputDevice.cpp Input/Devices/InputDevice.h Input/Devices/InputDeviceId.cpp From b40e0494291f85b5a6ecee87c9d2a074c94b0f1d Mon Sep 17 00:00:00 2001 From: AMZN-koppersr <82230785+AMZN-koppersr@users.noreply.github.com> Date: Thu, 16 Sep 2021 12:13:28 -0700 Subject: [PATCH 344/355] Added array index operators to Spawnable(Const)EntityContainerView. (#4153) * Added array index operators to Spawnable(Const)EntityContainerView. This commit also includes some tweaks to the begin/end functions and unit tests. Ticket: https://github.com/o3de/o3de/issues/4110 Signed-off-by: AMZN-koppersr <82230785+AMZN-koppersr@users.noreply.github.com> * Fixed string formatter for assert in Spawnable(Const)EntityContainerView. Signed-off-by: AMZN-koppersr <82230785+AMZN-koppersr@users.noreply.github.com> * Added empty() to Spawnable(Const)EntityContainerView and made move functions use [[nodiscard]] Signed-off-by: AMZN-koppersr <82230785+AMZN-koppersr@users.noreply.github.com> --- .../Spawnable/SpawnableEntitiesInterface.cpp | 58 ++++++++- .../Spawnable/SpawnableEntitiesInterface.h | 34 +++-- .../SpawnableEntitiesInterfaceTests.cpp | 122 ++++++++++++++++++ .../Tests/frameworktests_files.cmake | 1 + 4 files changed, 203 insertions(+), 12 deletions(-) create mode 100644 Code/Framework/AzFramework/Tests/Spawnable/SpawnableEntitiesInterfaceTests.cpp diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp index 617eb3a0b9..75fca39574 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.cpp @@ -36,6 +36,16 @@ namespace AzFramework return m_end; } + const AZ::Entity* const* SpawnableEntityContainerView::begin() const + { + return m_begin; + } + + const AZ::Entity* const* SpawnableEntityContainerView::end() const + { + return m_end; + } + const AZ::Entity* const* SpawnableEntityContainerView::cbegin() { return m_begin; @@ -46,11 +56,28 @@ namespace AzFramework return m_end; } - size_t SpawnableEntityContainerView::size() + AZ::Entity* SpawnableEntityContainerView::operator[](size_t n) + { + AZ_Assert(n < size(), "Index %zu is out of bounds (size: %llu) for Spawnable Entity Container View", n, size()); + return *(m_begin + n); + } + + const AZ::Entity* SpawnableEntityContainerView::operator[](size_t n) const + { + AZ_Assert(n < size(), "Index %zu is out of bounds (size: %llu) for Spawnable Entity Container View", n, size()); + return *(m_begin + n); + } + + size_t SpawnableEntityContainerView::size() const { return AZStd::distance(m_begin, m_end); } + bool SpawnableEntityContainerView::empty() const + { + return m_begin == m_end; + } + // // SpawnableConstEntityContainerView @@ -78,6 +105,16 @@ namespace AzFramework return m_end; } + const AZ::Entity* const* SpawnableConstEntityContainerView::begin() const + { + return m_begin; + } + + const AZ::Entity* const* SpawnableConstEntityContainerView::end() const + { + return m_end; + } + const AZ::Entity* const* SpawnableConstEntityContainerView::cbegin() { return m_begin; @@ -88,11 +125,28 @@ namespace AzFramework return m_end; } - size_t SpawnableConstEntityContainerView::size() + const AZ::Entity* SpawnableConstEntityContainerView::operator[](size_t n) + { + AZ_Assert(n < size(), "Index %zu is out of bounds (size: %llu) for Spawnable Const Entity Container View", n, size()); + return *(m_begin + n); + } + + const AZ::Entity* SpawnableConstEntityContainerView::operator[](size_t n) const + { + AZ_Assert(n < size(), "Index %zu is out of bounds (size: %llu) for Spawnable Entity Container View", n, size()); + return *(m_begin + n); + } + + size_t SpawnableConstEntityContainerView::size() const { return AZStd::distance(m_begin, m_end); } + bool SpawnableConstEntityContainerView::empty() const + { + return m_begin == m_end; + } + // // SpawnableIndexEntityPair diff --git a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h index 4b09dcbc75..6901fc7116 100644 --- a/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h +++ b/Code/Framework/AzFramework/AzFramework/Spawnable/SpawnableEntitiesInterface.h @@ -36,11 +36,18 @@ namespace AzFramework SpawnableEntityContainerView(AZ::Entity** begin, size_t length); SpawnableEntityContainerView(AZ::Entity** begin, AZ::Entity** end); - AZ::Entity** begin(); - AZ::Entity** end(); - const AZ::Entity* const* cbegin(); - const AZ::Entity* const* cend(); - size_t size(); + [[nodiscard]] AZ::Entity** begin(); + [[nodiscard]] AZ::Entity** end(); + [[nodiscard]] const AZ::Entity* const* begin() const; + [[nodiscard]] const AZ::Entity* const* end() const; + [[nodiscard]] const AZ::Entity* const* cbegin(); + [[nodiscard]] const AZ::Entity* const* cend(); + + [[nodiscard]] AZ::Entity* operator[](size_t n); + [[nodiscard]] const AZ::Entity* operator[](size_t n) const; + + [[nodiscard]] size_t size() const; + [[nodiscard]] bool empty() const; private: AZ::Entity** m_begin; @@ -53,11 +60,18 @@ namespace AzFramework SpawnableConstEntityContainerView(AZ::Entity** begin, size_t length); SpawnableConstEntityContainerView(AZ::Entity** begin, AZ::Entity** end); - const AZ::Entity* const* begin(); - const AZ::Entity* const* end(); - const AZ::Entity* const* cbegin(); - const AZ::Entity* const* cend(); - size_t size(); + [[nodiscard]] const AZ::Entity* const* begin(); + [[nodiscard]] const AZ::Entity* const* end(); + [[nodiscard]] const AZ::Entity* const* begin() const; + [[nodiscard]] const AZ::Entity* const* end() const; + [[nodiscard]] const AZ::Entity* const* cbegin(); + [[nodiscard]] const AZ::Entity* const* cend(); + + [[nodiscard]] const AZ::Entity* operator[](size_t n); + [[nodiscard]] const AZ::Entity* operator[](size_t n) const; + + [[nodiscard]] size_t size() const; + [[nodiscard]] bool empty() const; private: AZ::Entity** m_begin; diff --git a/Code/Framework/AzFramework/Tests/Spawnable/SpawnableEntitiesInterfaceTests.cpp b/Code/Framework/AzFramework/Tests/Spawnable/SpawnableEntitiesInterfaceTests.cpp new file mode 100644 index 0000000000..ed90231073 --- /dev/null +++ b/Code/Framework/AzFramework/Tests/Spawnable/SpawnableEntitiesInterfaceTests.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include +#include +#include +#include + +namespace UnitTest +{ + // + // SpawnableEntityContainerView + // + + class SpawnableEntityContainerViewTest : public ::testing::Test + { + protected: + AZStd::array m_values{ reinterpret_cast(1), reinterpret_cast(2), + reinterpret_cast(3), reinterpret_cast(4) }; + AzFramework::SpawnableEntityContainerView m_view{ m_values.begin(), m_values.end() }; + }; + + TEST_F(SpawnableEntityContainerViewTest, begin_Get_MatchesBeginOfArray) + { + EXPECT_EQ(m_view.begin(), m_values.begin()); + } + + TEST_F(SpawnableEntityContainerViewTest, end_Get_MatchesEndOfArray) + { + EXPECT_EQ(m_view.end(), m_values.end()); + } + + TEST_F(SpawnableEntityContainerViewTest, cbegin_Get_MatchesBeginOfArray) + { + EXPECT_EQ(m_view.cbegin(), m_values.cbegin()); + } + + TEST_F(SpawnableEntityContainerViewTest, cend_Get_MatchesEndOfArray) + { + EXPECT_EQ(m_view.cend(), m_values.cend()); + } + + TEST_F(SpawnableEntityContainerViewTest, IndexOperator_Get_MatchesThirdElement) + { + EXPECT_EQ(m_view[2], m_values[2]); + } + + TEST_F(SpawnableEntityContainerViewTest, Size_Get_MatchesSizeOfArray) + { + EXPECT_EQ(m_view.size(), m_values.size()); + } + + TEST_F(SpawnableEntityContainerViewTest, empty_GetFromFilledArray_ReturnsFalse) + { + EXPECT_FALSE(m_view.empty()); + } + + TEST_F(SpawnableEntityContainerViewTest, empty_GetFromEmtpyView_ReturnsTrue) + { + AzFramework::SpawnableEntityContainerView view{ nullptr, nullptr }; + EXPECT_TRUE(view.empty()); + } + + + // + // SpawnableConstEntityContainerView + // + + class SpawnableConstEntityContainerViewTest : public ::testing::Test + { + protected: + AZStd::array m_values{ reinterpret_cast(1), reinterpret_cast(2), + reinterpret_cast(3), reinterpret_cast(4) }; + AzFramework::SpawnableConstEntityContainerView m_view{ m_values.begin(), m_values.end() }; + }; + + TEST_F(SpawnableConstEntityContainerViewTest, begin_Get_MatchesBeginOfArray) + { + EXPECT_EQ(m_view.begin(), m_values.begin()); + } + + TEST_F(SpawnableConstEntityContainerViewTest, end_Get_MatchesEndOfArray) + { + EXPECT_EQ(m_view.end(), m_values.end()); + } + + TEST_F(SpawnableConstEntityContainerViewTest, cbegin_Get_MatchesBeginOfArray) + { + EXPECT_EQ(m_view.cbegin(), m_values.cbegin()); + } + + TEST_F(SpawnableConstEntityContainerViewTest, cend_Get_MatchesEndOfArray) + { + EXPECT_EQ(m_view.cend(), m_values.cend()); + } + + TEST_F(SpawnableConstEntityContainerViewTest, IndexOperator_Get_MatchesThirdElement) + { + EXPECT_EQ(m_view[2], m_values[2]); + } + + TEST_F(SpawnableConstEntityContainerViewTest, size_Get_MatchesSizeOfArray) + { + EXPECT_EQ(m_view.size(), m_values.size()); + } + + TEST_F(SpawnableConstEntityContainerViewTest, empty_GetFromFilledArray_ReturnsFalse) + { + EXPECT_FALSE(m_view.empty()); + } + + TEST_F(SpawnableConstEntityContainerViewTest, empty_GetFromEmtpyView_ReturnsTrue) + { + AzFramework::SpawnableConstEntityContainerView view{ nullptr, nullptr }; + EXPECT_TRUE(view.empty()); + } +} // namespace UnitTest diff --git a/Code/Framework/AzFramework/Tests/frameworktests_files.cmake b/Code/Framework/AzFramework/Tests/frameworktests_files.cmake index f70f8624c9..680155d49d 100644 --- a/Code/Framework/AzFramework/Tests/frameworktests_files.cmake +++ b/Code/Framework/AzFramework/Tests/frameworktests_files.cmake @@ -8,6 +8,7 @@ set(FILES ../../AzCore/Tests/Main.cpp + Spawnable/SpawnableEntitiesInterfaceTests.cpp Spawnable/SpawnableEntitiesManagerTests.cpp ArchiveCompressionTests.cpp ArchiveTests.cpp From 2b092bae812424c1b8ec3887fcbbfa00803c2f6c Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Thu, 16 Sep 2021 12:51:36 -0700 Subject: [PATCH 345/355] Fix missing virtual destructor causing debug build failure (#4174) Signed-off-by: Steve Pham --- Code/Framework/AzCore/AzCore/EBus/EBus.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Framework/AzCore/AzCore/EBus/EBus.h b/Code/Framework/AzCore/AzCore/EBus/EBus.h index 1bff4ff297..58754ff9b8 100644 --- a/Code/Framework/AzCore/AzCore/EBus/EBus.h +++ b/Code/Framework/AzCore/AzCore/EBus/EBus.h @@ -1717,6 +1717,7 @@ AZ_POP_DISABLE_WARNING { EBusRouterNode m_routerNode; public: + virtual ~EBusNestedVersionRouter() = default; template void BusRouterConnect(Container& container, int order = 0); From ac5cc04b592750561f891ef3fcd6b8c77714edc9 Mon Sep 17 00:00:00 2001 From: Junbo Liang <68558268+junbo75@users.noreply.github.com> Date: Thu, 16 Sep 2021 13:52:27 -0700 Subject: [PATCH 346/355] [AWSI Automation] Export more AWS resource names via CloudFormation stack outputs for the automation tests (#4161) * Read resources name via CloudFormation stack outputs and trim resource names when they are too long Signed-off-by: Junbo Liang --- .../aws_metrics_automation_test.py | 27 ++++++----- Gems/AWSClientAuth/cdk/utils/name_utils.py | 6 ++- .../cdk/utils/resource_name_sanitizer.py | 45 +++++++++++++++++++ .../cdk/aws_metrics/aws_metrics_stack.py | 2 + .../cdk/aws_metrics/batch_analytics.py | 8 ++++ .../cdk/aws_metrics/batch_processing.py | 8 ++++ Gems/AWSMetrics/cdk/aws_metrics/dashboard.py | 2 +- .../cdk/aws_metrics/data_ingestion.py | 4 +- .../cdk/aws_metrics/data_lake_integration.py | 10 ++++- .../aws_metrics/real_time_data_processing.py | 8 +++- 10 files changed, 98 insertions(+), 22 deletions(-) create mode 100644 Gems/AWSClientAuth/cdk/utils/resource_name_sanitizer.py diff --git a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py index 5f6103c46a..34b2217916 100644 --- a/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py +++ b/AutomatedTesting/Gem/PythonTests/AWS/Windows/aws_metrics/aws_metrics_automation_test.py @@ -31,7 +31,7 @@ def setup(launcher: pytest.fixture, Set up the resource mapping configuration and start the log monitor. :param launcher: Client launcher for running the test level. :param asset_processor: asset_processor fixture. - :return log monitor object, metrics file path and the metrics stack name. + :return log monitor object. """ asset_processor.start() asset_processor.wait_for_idle() @@ -73,12 +73,11 @@ def monitor_metrics_submission(log_monitor: pytest.fixture) -> None: f'unexpected_lines values: {unexpected_lines}') -def query_metrics_from_s3(aws_metrics_utils: pytest.fixture, resource_mappings: pytest.fixture, stack_name: str) -> None: +def query_metrics_from_s3(aws_metrics_utils: pytest.fixture, resource_mappings: pytest.fixture) -> None: """ Verify that the metrics events are delivered to the S3 bucket and can be queried. :param aws_metrics_utils: aws_metrics_utils fixture. :param resource_mappings: resource_mappings fixture. - :param stack_name: name of the CloudFormation stack. """ aws_metrics_utils.verify_s3_delivery( resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsBucketName') @@ -89,23 +88,24 @@ def query_metrics_from_s3(aws_metrics_utils: pytest.fixture, resource_mappings: resource_mappings.get_resource_name_id('AWSMetrics.EventsCrawlerName')) # Remove the events_json table if exists so that the sample query can create a table with the same name. - aws_metrics_utils.delete_table(f'{stack_name}-eventsdatabase', 'events_json') - aws_metrics_utils.run_named_queries(f'{stack_name}-AthenaWorkGroup') + aws_metrics_utils.delete_table(resource_mappings.get_resource_name_id('AWSMetrics.EventDatabaseName'), 'events_json') + aws_metrics_utils.run_named_queries(resource_mappings.get_resource_name_id('AWSMetrics.AthenaWorkGroupName')) logger.info('Query metrics from S3 successfully.') -def verify_operational_metrics(aws_metrics_utils: pytest.fixture, stack_name: str, start_time: datetime) -> None: +def verify_operational_metrics(aws_metrics_utils: pytest.fixture, + resource_mappings: pytest.fixture, start_time: datetime) -> None: """ Verify that operational health metrics are delivered to CloudWatch. - aws_metrics_utils: aws_metrics_utils fixture. - stack_name: name of the CloudFormation stack. - start_time: Time when the game launcher starts. + :param aws_metrics_utils: aws_metrics_utils fixture. + :param resource_mappings: resource_mappings fixture. + :param start_time: Time when the game launcher starts. """ aws_metrics_utils.verify_cloud_watch_delivery( 'AWS/Lambda', 'Invocations', [{'Name': 'FunctionName', - 'Value': f'{stack_name}-AnalyticsProcessingLambda'}], + 'Value': resource_mappings.get_resource_name_id('AWSMetrics.AnalyticsProcessingLambdaName')}], start_time) logger.info('AnalyticsProcessingLambda metrics are sent to CloudWatch.') @@ -113,7 +113,7 @@ def verify_operational_metrics(aws_metrics_utils: pytest.fixture, stack_name: st 'AWS/Lambda', 'Invocations', [{'Name': 'FunctionName', - 'Value': f'{stack_name}-EventsProcessingLambda'}], + 'Value': resource_mappings.get_resource_name_id('AWSMetrics.EventProcessingLambdaName')}], start_time) logger.info('EventsProcessingLambda metrics are sent to CloudWatch.') @@ -157,7 +157,6 @@ class TestAWSMetricsWindows(object): workspace: pytest.fixture, aws_utils: pytest.fixture, resource_mappings: pytest.fixture, - stacks: typing.List, aws_metrics_utils: pytest.fixture): """ Verify that the metrics events are sent to CloudWatch and S3 for analytics. @@ -189,10 +188,10 @@ class TestAWSMetricsWindows(object): operational_threads = list() operational_threads.append( AWSMetricsThread(target=query_metrics_from_s3, - args=(aws_metrics_utils, resource_mappings, stacks[0]))) + args=(aws_metrics_utils, resource_mappings))) operational_threads.append( AWSMetricsThread(target=verify_operational_metrics, - args=(aws_metrics_utils, stacks[0], start_time))) + args=(aws_metrics_utils, resource_mappings, start_time))) operational_threads.append( AWSMetricsThread(target=update_kinesis_analytics_application_status, args=(aws_metrics_utils, resource_mappings, False))) diff --git a/Gems/AWSClientAuth/cdk/utils/name_utils.py b/Gems/AWSClientAuth/cdk/utils/name_utils.py index 4921b735eb..ea9dd68060 100755 --- a/Gems/AWSClientAuth/cdk/utils/name_utils.py +++ b/Gems/AWSClientAuth/cdk/utils/name_utils.py @@ -6,10 +6,11 @@ SPDX-License-Identifier: Apache-2.0 OR MIT """ import re from aws_cdk import core +from .resource_name_sanitizer import sanitize_resource_name def format_aws_resource_name(feature_name: str, project_name: str, env: core.Environment, resource_type: str): - return f'{project_name}-{feature_name}-{resource_type}-{env.region}' + return sanitize_resource_name(f'{project_name}-{feature_name}-{resource_type}-{env.region}', resource_type) def format_aws_resource_id(feature_name: str, project_name: str, env: core.Environment, resource_type: str): @@ -31,4 +32,5 @@ def format_aws_resource_authenticated_id(feature_name: str, project_name: str, e def format_aws_resource_authenticated_name(feature_name: str, project_name: str, env: core.Environment, resource_type: str, authenticated: bool): authenticated_string = 'Authenticated' if authenticated else 'Unauthenticated' - return f'{project_name}{feature_name}{resource_type}{authenticated_string}-{env.region}' + return sanitize_resource_name( + f'{project_name}{feature_name}{resource_type}{authenticated_string}-{env.region}', resource_type) diff --git a/Gems/AWSClientAuth/cdk/utils/resource_name_sanitizer.py b/Gems/AWSClientAuth/cdk/utils/resource_name_sanitizer.py new file mode 100644 index 0000000000..d4a2d77f44 --- /dev/null +++ b/Gems/AWSClientAuth/cdk/utils/resource_name_sanitizer.py @@ -0,0 +1,45 @@ +""" +Copyright (c) Contributors to the Open 3D Engine Project. +For complete copyright and license terms please see the LICENSE at the root of this distribution. + +SPDX-License-Identifier: Apache-2.0 OR MIT +""" + +import hashlib +from aws_cdk import ( + core, + aws_cognito as cognito, + aws_iam as iam +) + +MAX_RESOURCE_NAME_LENGTH_MAPPING = { + core.Stack.__name__: 128, + iam.Role.__name__: 64, + iam.ManagedPolicy.__name__: 144, + cognito.CfnUserPoolClient.__name__: 128, + cognito.CfnUserPool.__name__: 128, + cognito.CfnIdentityPool.__name__: 128 + +} + + +def sanitize_resource_name(resource_name: str, resource_type: str) -> str: + """ + Truncate the resource name if its length exceeds the limit. + This is the best effort for sanitizing resource names based on the AWS documents since each AWS service + has its unique restrictions. Customers can extend this function for validation or sanitization. + + :param resource_name: Original name of the resource. + :param resource_type: Type of the resource. + :return Sanitized resource name that can be deployed with AWS. + """ + result = resource_name + if not MAX_RESOURCE_NAME_LENGTH_MAPPING.get(resource_type): + return result + + if len(resource_name) > MAX_RESOURCE_NAME_LENGTH_MAPPING[resource_type]: + # PYTHONHASHSEED is set to "random" by default in Python 3.3 and up. Cannot use + # the built-in hash function here since it will give a different return value in each session + digest = "-%x" % (int(hashlib.md5(resource_name.encode('ascii', 'ignore')).hexdigest(), 16) & 0xffffffff) + result = resource_name[:MAX_RESOURCE_NAME_LENGTH_MAPPING[resource_type] - len(digest)] + digest + return result diff --git a/Gems/AWSMetrics/cdk/aws_metrics/aws_metrics_stack.py b/Gems/AWSMetrics/cdk/aws_metrics/aws_metrics_stack.py index 337a14a301..41d70f83ec 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/aws_metrics_stack.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/aws_metrics_stack.py @@ -53,6 +53,7 @@ class AWSMetricsStack(core.Stack): self._batch_processing = BatchProcessing( self, input_stream_arn=self._data_ingestion.input_stream_arn, + application_name=application_name, analytics_bucket_arn=self._data_lake_integration.analytics_bucket_arn, events_database_name=self._data_lake_integration.events_database_name, events_table_name=self._data_lake_integration.events_table_name @@ -60,6 +61,7 @@ class AWSMetricsStack(core.Stack): self._batch_analytics = BatchAnalytics( self, + application_name=application_name, analytics_bucket_name=self._data_lake_integration.analytics_bucket_name, events_database_name=self._data_lake_integration.events_database_name, events_table_name=self._data_lake_integration.events_table_name diff --git a/Gems/AWSMetrics/cdk/aws_metrics/batch_analytics.py b/Gems/AWSMetrics/cdk/aws_metrics/batch_analytics.py index 8398113bc4..eb36d8a5da 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/batch_analytics.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/batch_analytics.py @@ -20,10 +20,12 @@ class BatchAnalytics: """ def __init__(self, stack: core.Construct, + application_name: str, analytics_bucket_name: str, events_database_name: str, events_table_name) -> None: self._stack = stack + self._application_name = application_name self._analytics_bucket_name = analytics_bucket_name self._events_database_name = events_database_name self._events_table_name = events_table_name @@ -58,6 +60,12 @@ class BatchAnalytics: ) ) ) + core.CfnOutput( + self._stack, + id='AthenaWorkGroupName', + description='Name of the Athena work group that contains sample queries', + export_name=f"{self._application_name}:AthenaWorkGroup", + value=self._athena_work_group.name) def _create_athena_queries(self) -> None: """ diff --git a/Gems/AWSMetrics/cdk/aws_metrics/batch_processing.py b/Gems/AWSMetrics/cdk/aws_metrics/batch_processing.py index 4dbb3b2120..803f6076c8 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/batch_processing.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/batch_processing.py @@ -26,11 +26,13 @@ class BatchProcessing: """ def __init__(self, stack: core.Construct, + application_name: str, input_stream_arn: str, analytics_bucket_arn: str, events_database_name: str, events_table_name) -> None: self._stack = stack + self._application_name = application_name self._input_stream_arn = input_stream_arn self._analytics_bucket_arn = analytics_bucket_arn self._events_database_name = events_database_name @@ -60,6 +62,12 @@ class BatchProcessing: os.path.join(os.path.dirname(__file__), 'lambdas', 'events_processing_lambda')), role=self._events_processing_lambda_role ) + core.CfnOutput( + self._stack, + id='EventProcessingLambdaName', + description='Lambda function for processing metrics events data.', + export_name=f"{self._application_name}:EventProcessingLambda", + value=self._events_processing_lambda.function_name) def _create_events_processing_lambda_role(self, function_name: str) -> None: """ diff --git a/Gems/AWSMetrics/cdk/aws_metrics/dashboard.py b/Gems/AWSMetrics/cdk/aws_metrics/dashboard.py index 32ff0d9c84..616643ebb1 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/dashboard.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/dashboard.py @@ -52,7 +52,7 @@ class Dashboard: max_width=aws_metrics_constants.DASHBOARD_MAX_WIDGET_WIDTH) ) - dashboard_output = core.CfnOutput( + core.CfnOutput( stack, id='DashboardName', description='CloudWatch dashboard to monitor the operational health and real-time metrics', diff --git a/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py b/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py index a21e629c38..cc11796ee9 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/data_ingestion.py @@ -69,14 +69,14 @@ class DataIngestion: cfn_rest_api.add_property_deletion_override("BodyS3Location") cfn_rest_api.add_property_override("FailOnWarnings", True) - api_id_output = core.CfnOutput( + core.CfnOutput( self._stack, id='RESTApiId', description='Service API Id for the analytics pipeline', export_name=f"{application_name}:RestApiId", value=self._rest_api.rest_api_id) - stage_output = core.CfnOutput( + core.CfnOutput( self._stack, id='RESTApiStage', description='Stage for the REST API deployment', diff --git a/Gems/AWSMetrics/cdk/aws_metrics/data_lake_integration.py b/Gems/AWSMetrics/cdk/aws_metrics/data_lake_integration.py index e47b1a95c2..a0b93eb212 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/data_lake_integration.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/data_lake_integration.py @@ -67,7 +67,7 @@ class DataLakeIntegration: cfn_bucket = self._analytics_bucket.node.find_child('Resource') cfn_bucket.apply_removal_policy(core.RemovalPolicy.DESTROY) - analytics_bucket_output = core.CfnOutput( + core.CfnOutput( self._stack, id='AnalyticsBucketName', description='Name of the S3 bucket for storing metrics event data', @@ -89,6 +89,12 @@ class DataLakeIntegration: name=f'{self._stack.stack_name}-EventsDatabase'.lower() ) ) + core.CfnOutput( + self._stack, + id='EventDatabaseName', + description='Glue database for metrics events.', + export_name=f"{self._application_name}:EventsDatabase", + value=self._events_database.ref) def _create_events_table(self) -> None: """ @@ -199,7 +205,7 @@ class DataLakeIntegration: configuration=aws_metrics_constants.CRAWLER_CONFIGURATION ) - events_crawler_output = core.CfnOutput( + core.CfnOutput( self._stack, id='EventsCrawlerName', description='Glue Crawler to populate the AWS Glue Data Catalog with metrics events tables', diff --git a/Gems/AWSMetrics/cdk/aws_metrics/real_time_data_processing.py b/Gems/AWSMetrics/cdk/aws_metrics/real_time_data_processing.py index 4ef9caa022..ffd74a51a9 100755 --- a/Gems/AWSMetrics/cdk/aws_metrics/real_time_data_processing.py +++ b/Gems/AWSMetrics/cdk/aws_metrics/real_time_data_processing.py @@ -113,7 +113,7 @@ class RealTimeDataProcessing: ), ) - analytics_application_output = core.CfnOutput( + core.CfnOutput( self._stack, id='AnalyticsApplicationName', description='Kinesis Data Analytics application to process the real-time metrics data', @@ -199,6 +199,12 @@ class RealTimeDataProcessing: os.path.join(os.path.dirname(__file__), 'lambdas', 'analytics_processing_lambda')), role=self._analytics_processing_lambda_role ) + core.CfnOutput( + self._stack, + id='AnalyticsProcessingLambdaName', + description='Lambda function for sending processed data to CloudWatch.', + export_name=f"{self._application_name}:AnalyticsProcessingLambda", + value=self._analytics_processing_lambda.function_name) def _create_analytics_processing_lambda_role(self, function_name: str) -> iam.Role: """ From 2d156364dae9b02f2cbdf7230a54c0cb5f24f5a8 Mon Sep 17 00:00:00 2001 From: Steve Pham <82231385+spham-amzn@users.noreply.github.com> Date: Thu, 16 Sep 2021 13:53:32 -0700 Subject: [PATCH 347/355] Fix remain copyright header issues for .in files (#4177) Signed-off-by: Steve Pham --- .../Platform/Windows/Launcher.rc.in | 16 ++++++---------- Code/LauncherUnified/StaticModules.in | 16 ++++++---------- .../Tools/Android/ProjectBuilder/build.gradle.in | 14 +++++--------- .../Android/ProjectBuilder/gradle.properties.in | 10 +++------- .../Android/ProjectBuilder/local.properties.in | 10 +++------- .../Android/ProjectBuilder/root.build.gradle.in | 11 ++++------- 6 files changed, 27 insertions(+), 50 deletions(-) diff --git a/Code/LauncherUnified/Platform/Windows/Launcher.rc.in b/Code/LauncherUnified/Platform/Windows/Launcher.rc.in index ae08976c2a..52a238032e 100644 --- a/Code/LauncherUnified/Platform/Windows/Launcher.rc.in +++ b/Code/LauncherUnified/Platform/Windows/Launcher.rc.in @@ -1,13 +1,9 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ IDI_ICON1 ICON DISCARDABLE "@ICON_FILE@" diff --git a/Code/LauncherUnified/StaticModules.in b/Code/LauncherUnified/StaticModules.in index 03b22b076a..ef5a565480 100644 --- a/Code/LauncherUnified/StaticModules.in +++ b/Code/LauncherUnified/StaticModules.in @@ -1,14 +1,10 @@ /* -* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -* its licensors. -* -* For complete copyright and license terms please see the LICENSE at the root of this -* distribution (the "License"). All use of this software is governed by the License, -* or, if provided, by the license below or the license accompanying this file. Do not -* remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* -*/ + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ ///////////////////////////////////////////////////////// ///////////////////////////////////////////////////////// // THIS CODE IS AUTOGENERATED, DO NOT MODIFY diff --git a/Code/Tools/Android/ProjectBuilder/build.gradle.in b/Code/Tools/Android/ProjectBuilder/build.gradle.in index 5980984516..da5f4b599a 100644 --- a/Code/Tools/Android/ProjectBuilder/build.gradle.in +++ b/Code/Tools/Android/ProjectBuilder/build.gradle.in @@ -1,13 +1,9 @@ // -// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -// its licensors. +// Copyright (c) Contributors to the Open 3D Engine Project. +// For complete copyright and license terms please see the LICENSE at the root of this distribution. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT // -// For complete copyright and license terms please see the LICENSE at the root of this -// distribution (the "License"). All use of this software is governed by the License, -// or, if provided, by the license below or the license accompanying this file. Do not -// remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - apply plugin: "com.android.${TARGET_TYPE}" @@ -16,7 +12,7 @@ ${SIGNING_CONFIGS} compileSdkVersion sdkVer buildToolsVersion buildToolsVer ndkVersion ndkPlatformVer - lintOptions { + lintOptions { abortOnError false checkReleaseBuilds false } diff --git a/Code/Tools/Android/ProjectBuilder/gradle.properties.in b/Code/Tools/Android/ProjectBuilder/gradle.properties.in index 71a1cadde9..4ade102ae0 100644 --- a/Code/Tools/Android/ProjectBuilder/gradle.properties.in +++ b/Code/Tools/Android/ProjectBuilder/gradle.properties.in @@ -1,12 +1,8 @@ ### -### All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -### its licensors. +### Copyright (c) Contributors to the Open 3D Engine Project. +### For complete copyright and license terms please see the LICENSE at the root of this distribution. ### -### For complete copyright and license terms please see the LICENSE at the root of this -### distribution (the "License"). All use of this software is governed by the License, -### or, if provided, by the license below or the license accompanying this file. Do not -### remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### SPDX-License-Identifier: Apache-2.0 OR MIT ### # For more details on how to configure your build environment visit diff --git a/Code/Tools/Android/ProjectBuilder/local.properties.in b/Code/Tools/Android/ProjectBuilder/local.properties.in index 4e82cb2940..e9843fe5c3 100644 --- a/Code/Tools/Android/ProjectBuilder/local.properties.in +++ b/Code/Tools/Android/ProjectBuilder/local.properties.in @@ -1,12 +1,8 @@ ### -### All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -### its licensors. +### Copyright (c) Contributors to the Open 3D Engine Project. +### For complete copyright and license terms please see the LICENSE at the root of this distribution. ### -### For complete copyright and license terms please see the LICENSE at the root of this -### distribution (the "License"). All use of this software is governed by the License, -### or, if provided, by the license below or the license accompanying this file. Do not -### remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -### WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +### SPDX-License-Identifier: Apache-2.0 OR MIT ### ## This file must *NOT* be checked into Version Control Systems, diff --git a/Code/Tools/Android/ProjectBuilder/root.build.gradle.in b/Code/Tools/Android/ProjectBuilder/root.build.gradle.in index dfce99c3c7..14606bee7b 100644 --- a/Code/Tools/Android/ProjectBuilder/root.build.gradle.in +++ b/Code/Tools/Android/ProjectBuilder/root.build.gradle.in @@ -1,12 +1,9 @@ // -// All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or -// its licensors. +// Copyright (c) Contributors to the Open 3D Engine Project. +// For complete copyright and license terms please see the LICENSE at the root of this distribution. +// +// SPDX-License-Identifier: Apache-2.0 OR MIT // -// For complete copyright and license terms please see the LICENSE at the root of this -// distribution (the "License"). All use of this software is governed by the License, -// or, if provided, by the license below or the license accompanying this file. Do not -// remove or modify any license notices. This file is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. buildscript { repositories { From 4dab267dc90513af1c46b4c8e6d615e44fb628c5 Mon Sep 17 00:00:00 2001 From: Gene Walters Date: Thu, 16 Sep 2021 21:36:33 -0700 Subject: [PATCH 348/355] Fix AzAutoGen output to use a proper output using path.commonpath instead of path.commonprefix, which unlike commonprefix always return a valid path. For example, commonprefix [usr/hello.txt, usr/helium.cpp] would return usr/he Signed-off-by: Gene Walters --- cmake/AzAutoGen.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/AzAutoGen.py b/cmake/AzAutoGen.py index 51c46b53d8..19b9711325 100755 --- a/cmake/AzAutoGen.py +++ b/cmake/AzAutoGen.py @@ -71,10 +71,10 @@ def SearchPaths(filename, paths=[]): return None def ComputeOutputPath(inputFiles, projectDir, outputDir): - commonInputPath = os.path.commonprefix(inputFiles) # If we've globbed many source files, this finds the common prefix + commonInputPath = os.path.commonpath(inputFiles) # If we've globbed many source files, this finds the common path if os.path.isfile(commonInputPath): # If the commonInputPath resolves to an actual file, slice off the filename commonInputPath = os.path.dirname(commonInputPath) - commonPath = os.path.commonprefix([commonInputPath, projectDir]) # Finds the common path between the data source files and our project directory (//depot/dev/Code/Framework/AzCore/) + commonPath = os.path.commonpath([commonInputPath, projectDir]) # Finds the common path between the data source files and our project directory (//depot/dev/Code/Framework/AzCore/) inputRelativePath = os.path.relpath(commonInputPath, commonPath) # Computes the relative path for the project source directory (Code/Framework/AzCore/AutoGen/) return os.path.join(outputDir, inputRelativePath) # Returns a suitable output directory (//depot/dev/Generated/Code/Framework/AzCore/AutoGen/) From f5bd450673c656eb81f3081fbd92ba9fd6ce05e4 Mon Sep 17 00:00:00 2001 From: Roman <69218254+amzn-rhhong@users.noreply.github.com> Date: Fri, 17 Sep 2021 04:06:19 -0700 Subject: [PATCH 349/355] Fixed the crash by clear out the item and map array (#4162) * Fixed the crash by clear out the item and map array Signed-off-by: rhhong * emplace is doing an insert which is not expected. Signed-off-by: rhhong --- .../Code/EMotionFX/Source/Recorder.cpp | 19 ++++++++----------- .../Code/EMotionFX/Source/Recorder.h | 8 ++++---- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.cpp b/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.cpp index 085d164a94..54fb130ad3 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.cpp @@ -1421,17 +1421,16 @@ namespace EMotionFX // extract sorted active items void Recorder::ExtractNodeHistoryItems(const ActorInstanceData& actorInstanceData, float timeValue, bool sort, EValueType valueType, AZStd::vector* outItems, AZStd::vector* outMap) const { - // clear the map array + // Reinit the item array. const size_t maxIndex = CalcMaxNodeHistoryTrackIndex(actorInstanceData); outItems->resize(maxIndex + 1); for (size_t i = 0; i <= maxIndex; ++i) { - ExtractedNodeHistoryItem item; - item.m_trackIndex = i; - item.m_value = 0.0f; + ExtractedNodeHistoryItem& item = (*outItems)[i]; + item.m_nodeHistoryItem = nullptr; + item.m_trackIndex = i; item.m_keyTrackSampleTime = 0.0f; - item.m_nodeHistoryItem = nullptr; - outItems->emplace(AZStd::next(begin(*outItems), i), AZStd::move(item)); + item.m_value = 0.0f; } // find all node history items @@ -1440,7 +1439,7 @@ namespace EMotionFX { if (curItem->m_startTime <= timeValue && curItem->m_endTime > timeValue) { - ExtractedNodeHistoryItem item; + ExtractedNodeHistoryItem& item = (*outItems)[curItem->m_trackIndex]; item.m_trackIndex = curItem->m_trackIndex; item.m_keyTrackSampleTime = timeValue - curItem->m_startTime; item.m_nodeHistoryItem = curItem; @@ -1463,8 +1462,6 @@ namespace EMotionFX MCORE_ASSERT(false); // unsupported mode item.m_value = curItem->m_globalWeights.GetValueAtTime(item.m_keyTrackSampleTime, nullptr, nullptr, m_recordSettings.m_interpolate); } - - outItems->emplace(AZStd::next(begin(*outItems), curItem->m_trackIndex), item); } } @@ -1472,7 +1469,7 @@ namespace EMotionFX outMap->resize(maxIndex + 1); for (size_t i = 0; i <= maxIndex; ++i) { - outMap->emplace(AZStd::next(begin(*outMap), i), i); + (*outMap)[i] = i; } // sort if desired @@ -1482,7 +1479,7 @@ namespace EMotionFX for (size_t i = 0; i <= maxIndex; ++i) { - outMap->emplace(AZStd::next(begin(*outMap), outItems->at(i).m_trackIndex), i); + (*outMap)[outItems->at(i).m_trackIndex] = i; } } } diff --git a/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.h b/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.h index fe87d36ea1..c486427159 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.h +++ b/Gems/EMotionFX/Code/EMotionFX/Source/Recorder.h @@ -168,10 +168,10 @@ namespace EMotionFX struct EMFX_API ExtractedNodeHistoryItem { - NodeHistoryItem* m_nodeHistoryItem; - size_t m_trackIndex; - float m_value; - float m_keyTrackSampleTime; + NodeHistoryItem* m_nodeHistoryItem = nullptr; + size_t m_trackIndex = 0; + float m_value = 0.0f; + float m_keyTrackSampleTime = 0.0f; friend bool operator< (const ExtractedNodeHistoryItem& a, const ExtractedNodeHistoryItem& b) { return (a.m_value > b.m_value); } friend bool operator==(const ExtractedNodeHistoryItem& a, const ExtractedNodeHistoryItem& b) { return (a.m_value == b.m_value); } From 9a71a902d0037fa717ba8af7bd74db67fe519b4a Mon Sep 17 00:00:00 2001 From: Benjamin Jillich <43751992+amzn-jillich@users.noreply.github.com> Date: Fri, 17 Sep 2021 13:07:01 +0200 Subject: [PATCH 350/355] Animation Editor: Closing the Create Group window creates a new Parameter Group (#4167) Signed-off-by: Benjamin Jillich --- .../StandardPlugins/Source/AnimGraph/ParameterWindow.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterWindow.cpp b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterWindow.cpp index 3f3c7c1c7d..c8ce48fe18 100644 --- a/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterWindow.cpp +++ b/Gems/EMotionFX/Code/EMotionFX/Tools/EMotionStudio/Plugins/StandardPlugins/Source/AnimGraph/ParameterWindow.cpp @@ -1461,10 +1461,15 @@ namespace EMStudio // show the create window auto createWindow = new ParameterCreateRenameWindow("Create Group", "Please enter the group name:", uniqueGroupName.c_str(), "", invalidNames, this); - connect(createWindow, &QDialog::finished, this, [this, createWindow]() + connect(createWindow, &QDialog::finished, this, [this, createWindow](int resultCode) { createWindow->deleteLater(); + if (resultCode == QDialog::Rejected) + { + return; + } + AZStd::string command = AZStd::string::format("AnimGraphAddGroupParameter -animGraphID %i -name \"%s\"", m_animGraph->GetID(), createWindow->GetName().c_str()); const EMotionFX::GroupParameter* parentGroup = nullptr; const EMotionFX::Parameter* selectedParameter = GetSingleSelectedParameter(); From c28bc7c6d8c7316f9c7053423d40a7b8ebd0c696 Mon Sep 17 00:00:00 2001 From: jonawals Date: Fri, 17 Sep 2021 12:41:19 +0100 Subject: [PATCH 351/355] Add deserialization to sequence reports. (#4018) * Add deserialization to sequence reports. Signed-off-by: John * Address PR comments. Signed-off-by: John * Address PR comments. Signed-off-by: John * Address PR comments. Signed-off-by: John * Revert last change. Signed-off-by: John --- .../TestImpactClientSequenceReport.h | 159 ++++++----- ...TestImpactClientSequenceReportSerializer.h | 20 +- .../TestImpactFramework/TestImpactUtils.h | 39 +++ .../Source/TestImpactClientSequenceReport.cpp | 111 +++----- ...stImpactClientSequenceReportSerializer.cpp | 262 +++++++++++++++++- .../Runtime/Code/Source/TestImpactUtils.cpp | 252 +++++++++++++++++ 6 files changed, 684 insertions(+), 159 deletions(-) diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h index b39c2c8bcb..b668bda155 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReport.h @@ -122,12 +122,14 @@ namespace TestImpact }; //! Base class for all sequence report types. - template + template class SequenceReportBase { public: + static constexpr SequenceReportType ReportType = Type; + using PolicyState = PolicyStateType; + //! Constructs the report for a sequence of selected tests. - //! @param type The type of sequence this report is generated for. //! @param maxConcurrency The maximum number of concurrent test targets in flight at any given time. //! @param testTargetTimeout The maximum duration individual test targets may be in flight for (infinite if empty). //! @param globalTimeout The maximum duration the entire test sequence may run for (infinite if empty). @@ -136,33 +138,49 @@ namespace TestImpact //! @param selectedTestRuns The target names of the selected test runs. //! @param selectedTestRunReport The report for the set of selected test runs. SequenceReportBase( - SequenceReportType type, size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const PolicyStateType& policyState, + AZStd::optional testTargetTimeout, + AZStd::optional globalTimeout, + PolicyStateType policyState, SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - TestRunReport&& selectedTestRunReport) - : m_type(type) - , m_maxConcurrency(maxConcurrency) - , m_testTargetTimeout(testTargetTimeout) - , m_globalTimeout(globalTimeout) - , m_policyState(policyState) + TestRunSelection selectedTestRuns, + TestRunReport selectedTestRunReport) + : m_maxConcurrency(maxConcurrency) + , m_testTargetTimeout(AZStd::move(testTargetTimeout)) + , m_globalTimeout(AZStd::move(globalTimeout)) + , m_policyState(AZStd::move(policyState)) , m_suite(suiteType) - , m_selectedTestRuns(selectedTestRuns) + , m_selectedTestRuns(AZStd::move(selectedTestRuns)) , m_selectedTestRunReport(AZStd::move(selectedTestRunReport)) { } - virtual ~SequenceReportBase() = default; - - //! Returns the identifying type for this sequence report. - SequenceReportType GetType() const + SequenceReportBase(SequenceReportBase&& report) + : SequenceReportBase( + AZStd::move(report.m_maxConcurrency), + AZStd::move(report.m_testTargetTimeout), + AZStd::move(report.m_globalTimeout), + AZStd::move(report.m_policyState), + AZStd::move(report.m_suite), + AZStd::move(report.m_selectedTestRuns), + AZStd::move(report.m_selectedTestRunReport)) { - return m_type; } + SequenceReportBase(const SequenceReportBase& report) + : SequenceReportBase( + report.m_maxConcurrency, + report.m_testTargetTimeout, + report.m_globalTimeout, + report.m_policyState, + report.m_suite, + report.m_selectedTestRuns, + report.m_selectedTestRunReport) + { + } + + virtual ~SequenceReportBase() = default; + //! Returns the maximum concurrency for this sequence. size_t GetMaxConcurrency() const { @@ -284,7 +302,6 @@ namespace TestImpact } private: - SequenceReportType m_type; size_t m_maxConcurrency = 0; AZStd::optional m_testTargetTimeout; AZStd::optional m_globalTimeout; @@ -296,58 +313,27 @@ namespace TestImpact //! Report type for regular test sequences. class RegularSequenceReport - : public SequenceReportBase + : public SequenceReportBase { public: - //! Constructs the report for a regular sequence. - //! @param maxConcurrency The maximum number of concurrent test targets in flight at any given time. - //! @param testTargetTimeout The maximum duration individual test targets may be in flight for (infinite if empty). - //! @param globalTimeout The maximum duration the entire test sequence may run for (infinite if empty). - //! @param policyState The policy state this sequence was executed under. - //! @param suiteType The suite from which the tests have been selected from. - //! @param selectedTestRuns The target names of the selected test runs. - //! @param selectedTestRunReport The report for the set of selected test runs. - RegularSequenceReport( - size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const SequencePolicyState& policyState, - SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - TestRunReport&& selectedTestRunReport); + using SequenceReportBase::SequenceReportBase; }; //! Report type for seed test sequences. class SeedSequenceReport - : public SequenceReportBase + : public SequenceReportBase { public: - //! Constructs the report for a seed sequence. - //! @param maxConcurrency The maximum number of concurrent test targets in flight at any given time. - //! @param testTargetTimeout The maximum duration individual test targets may be in flight for (infinite if empty). - //! @param globalTimeout The maximum duration the entire test sequence may run for (infinite if empty). - //! @param policyState The policy state this sequence was executed under. - //! @param suiteType The suite from which the tests have been selected from. - //! @param selectedTestRuns The target names of the selected test runs. - //! @param selectedTestRunReport The report for the set of selected test runs. - SeedSequenceReport( - size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const SequencePolicyState& policyState, - SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - TestRunReport&& selectedTestRunReport); + using SequenceReportBase::SequenceReportBase; }; //! Report detailing a test run sequence of selected and drafted tests. - template + template class DraftingSequenceReportBase - : public SequenceReportBase + : public SequenceReportBase { public: //! Constructs the report for sequences that draft in previously failed/newly added test targets. - //! @param type The type of sequence this report is generated for. //! @param maxConcurrency The maximum number of concurrent test targets in flight at any given time. //! @param testTargetTimeout The maximum duration individual test targets may be in flight for (infinite if empty). //! @param globalTimeout The maximum duration the entire test sequence may run for (infinite if empty). @@ -358,18 +344,16 @@ namespace TestImpact //! @param selectedTestRunReport The report for the set of selected test runs. //! @param draftedTestRunReport The report for the set of drafted test runs. DraftingSequenceReportBase( - SequenceReportType type, size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const PolicyStateType& policyState, + AZStd::optional testTargetTimeout, + AZStd::optional globalTimeout, + PolicyStateType policyState, SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - const AZStd::vector& draftedTestRuns, + TestRunSelection selectedTestRuns, + AZStd::vector draftedTestRuns, TestRunReport&& selectedTestRunReport, TestRunReport&& draftedTestRunReport) - : SequenceReportBase ( - type, + : SequenceReportBase( maxConcurrency, testTargetTimeout, globalTimeout, @@ -377,7 +361,17 @@ namespace TestImpact suiteType, selectedTestRuns, AZStd::move(selectedTestRunReport)) - , m_draftedTestRuns(draftedTestRuns) + , m_draftedTestRuns(AZStd::move(draftedTestRuns)) + , m_draftedTestRunReport(AZStd::move(draftedTestRunReport)) + { + } + + DraftingSequenceReportBase( + SequenceReportBase&& report, + AZStd::vector draftedTestRuns, + TestRunReport&& draftedTestRunReport) + : SequenceReportBase(AZStd::move(report)) + , m_draftedTestRuns(AZStd::move(draftedTestRuns)) , m_draftedTestRunReport(AZStd::move(draftedTestRunReport)) { } @@ -456,7 +450,7 @@ namespace TestImpact //! Report detailing an impact analysis sequence of selected, discarded and drafted tests. class ImpactAnalysisSequenceReport - : public DraftingSequenceReportBase + : public DraftingSequenceReportBase { public: //! Constructs the report for an impact analysis sequence. @@ -471,16 +465,18 @@ namespace TestImpact //! @param draftedTestRunReport The report for the set of drafted test runs. ImpactAnalysisSequenceReport( size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const ImpactAnalysisSequencePolicyState& policyState, + AZStd::optional testTargetTimeout, + AZStd::optional globalTimeout, + ImpactAnalysisSequencePolicyState policyState, SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - const AZStd::vector& discardedTestRuns, - const AZStd::vector& draftedTestRuns, + TestRunSelection selectedTestRuns, + AZStd::vector discardedTestRuns, + AZStd::vector draftedTestRuns, TestRunReport&& selectedTestRunReport, TestRunReport&& draftedTestRunReport); + ImpactAnalysisSequenceReport(DraftingSequenceReportBase&& report, AZStd::vector discardedTestRuns); + //! Returns the test runs discarded from running in the sequence. const AZStd::vector& GetDiscardedTestRuns() const; private: @@ -489,7 +485,7 @@ namespace TestImpact //! Report detailing an impact analysis sequence of selected, discarded and drafted test runs. class SafeImpactAnalysisSequenceReport - : public DraftingSequenceReportBase + : public DraftingSequenceReportBase { public: //! Constructs the report for a sequence of selected, discarded and drafted test runs. @@ -506,17 +502,20 @@ namespace TestImpact //! @param draftedTestRunReport The report for the set of drafted test runs. SafeImpactAnalysisSequenceReport( size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const SafeImpactAnalysisSequencePolicyState& policyState, + AZStd::optional testTargetTimeout, + AZStd::optional globalTimeout, + SafeImpactAnalysisSequencePolicyState policyState, SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - const TestRunSelection& discardedTestRuns, - const AZStd::vector& draftedTestRuns, + TestRunSelection selectedTestRuns, + TestRunSelection discardedTestRuns, + AZStd::vector draftedTestRuns, TestRunReport&& selectedTestRunReport, TestRunReport&& discardedTestRunReport, TestRunReport&& draftedTestRunReport); + SafeImpactAnalysisSequenceReport( + DraftingSequenceReportBase&& report, TestRunSelection discardedTestRuns, TestRunReport&& discardedTestRunReport); + // SequenceReport overrides ... AZStd::chrono::milliseconds GetDuration() const override; TestSequenceResult GetResult() const override; diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReportSerializer.h b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReportSerializer.h index fc226588e7..06bb0cdaa1 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReportSerializer.h +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactClientSequenceReportSerializer.h @@ -14,15 +14,27 @@ namespace TestImpact { - //! Serializes a regular sequence report to JSON format. + //! Serializes a regular sequence report to Json format. AZStd::string SerializeSequenceReport(const Client::RegularSequenceReport& sequenceReport); - //! Serializes a seed sequence report to JSON format. + //! Serializes a seed sequence report to Json format. AZStd::string SerializeSequenceReport(const Client::SeedSequenceReport& sequenceReport); - //! Serializes an impact analysis sequence report to JSON format. + //! Serializes an impact analysis sequence report to Json format. AZStd::string SerializeSequenceReport(const Client::ImpactAnalysisSequenceReport& sequenceReport); - //! Serializes a safe impact analysis sequence report to JSON format. + //! Serializes a safe impact analysis sequence report to Json format. AZStd::string SerializeSequenceReport(const Client::SafeImpactAnalysisSequenceReport& sequenceReport); + + //! Deserialize a regular sequence report from Json format. + Client::RegularSequenceReport DeserializeRegularSequenceReport(const AZStd::string& sequenceReportJson); + + //! Deserialize a seed sequence report from Json format. + Client::SeedSequenceReport DeserializeSeedSequenceReport(const AZStd::string& sequenceReportJson); + + //! Deserialize an impact analysis sequence report from Json format. + Client::ImpactAnalysisSequenceReport DeserializeImpactAnalysisSequenceReport(const AZStd::string& sequenceReportJson); + + //! Deserialize a safe impact analysis sequence report from Json format. + Client::SafeImpactAnalysisSequenceReport DeserializeSafeImpactAnalysisSequenceReport(const AZStd::string& sequenceReportJson); } // namespace TestImpact diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactUtils.h b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactUtils.h index c4625e9d2c..f7afd49b26 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactUtils.h +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Include/TestImpactFramework/TestImpactUtils.h @@ -103,4 +103,43 @@ namespace TestImpact //! User-friendly names for the client test result types. AZStd::string ClientTestResultAsString(Client::TestResult result); + + //! User-friendly names for the suite types. + SuiteType SuiteTypeFromString(const AZStd::string& suiteType); + + //! Returns the sequence report type for the specified string. + Client::SequenceReportType SequenceReportTypeFromString(const AZStd::string& type); + + //! Returns the test run result for the specified string. + Client::TestRunResult TestRunResultFromString(const AZStd::string& result); + + //! Returns the test result for the specified string. + Client::TestResult TestResultFromString(const AZStd::string& result); + + //! Returns the test sequence result for the specified string. + TestSequenceResult TestSequenceResultFromString(const AZStd::string& result); + + //! Returns the execution failure policy for the specified string. + Policy::ExecutionFailure ExecutionFailurePolicyFromString(const AZStd::string& executionFailurePolicy); + + //! Returns the failed test coverage policy for the specified string. + Policy::FailedTestCoverage FailedTestCoveragePolicyFromString(const AZStd::string& failedTestCoveragePolicy); + + //! Returns the test prioritization policy for the specified string. + Policy::TestPrioritization TestPrioritizationPolicyFromString(const AZStd::string& testPrioritizationPolicy); + + //! Returns the test failure policy for the specified string. + Policy::TestFailure TestFailurePolicyFromString(const AZStd::string& testFailurePolicy); + + //! Returns the integrity failure policy for the specified string. + Policy::IntegrityFailure IntegrityFailurePolicyFromString(const AZStd::string& integrityFailurePolicy); + + //! Returns the dynamic dependency map policy for the specified string. + Policy::DynamicDependencyMap DynamicDependencyMapPolicyFromString(const AZStd::string& dynamicDependencyMapPolicy); + + //! Returns the test sharding policy for the specified string. + Policy::TestSharding TestShardingPolicyFromString(const AZStd::string& testShardingPolicy); + + //! Returns the target output capture policy for the specified string. + Policy::TargetOutputCapture TargetOutputCapturePolicyFromString(const AZStd::string& targetOutputCapturePolicy); } // namespace TestImpact diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReport.cpp b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReport.cpp index 3f4656758a..17157e70fc 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReport.cpp +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReport.cpp @@ -159,69 +159,35 @@ namespace TestImpact return m_totalNumDisabledTests; } - RegularSequenceReport::RegularSequenceReport( + ImpactAnalysisSequenceReport::ImpactAnalysisSequenceReport( size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const SequencePolicyState& policyState, + AZStd::optional testTargetTimeout, + AZStd::optional globalTimeout, + ImpactAnalysisSequencePolicyState policyState, SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - TestRunReport&& selectedTestRunReport) - : SequenceReportBase( - SequenceReportType::RegularSequence, - maxConcurrency, - testTargetTimeout, - globalTimeout, - policyState, - suiteType, - selectedTestRuns, - AZStd::move(selectedTestRunReport)) - { - } - - SeedSequenceReport::SeedSequenceReport( - size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const SequencePolicyState& policyState, - SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - TestRunReport&& selectedTestRunReport) - : SequenceReportBase( - SequenceReportType::SeedSequence, - maxConcurrency, - testTargetTimeout, - globalTimeout, - policyState, - suiteType, - selectedTestRuns, - AZStd::move(selectedTestRunReport)) + TestRunSelection selectedTestRuns, + AZStd::vector discardedTestRuns, + AZStd::vector draftedTestRuns, + TestRunReport&& selectedTestRunReport, + TestRunReport&& draftedTestRunReport) + : DraftingSequenceReportBase( + maxConcurrency, + AZStd::move(testTargetTimeout), + AZStd::move(globalTimeout), + AZStd::move(policyState), + suiteType, + AZStd::move(selectedTestRuns), + AZStd::move(draftedTestRuns), + AZStd::move(selectedTestRunReport), + AZStd::move(draftedTestRunReport)) + , m_discardedTestRuns(discardedTestRuns) { } ImpactAnalysisSequenceReport::ImpactAnalysisSequenceReport( - size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const ImpactAnalysisSequencePolicyState& policyState, - SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - const AZStd::vector& discardedTestRuns, - const AZStd::vector& draftedTestRuns, - TestRunReport&& selectedTestRunReport, - TestRunReport&& draftedTestRunReport) - : DraftingSequenceReportBase( - SequenceReportType::ImpactAnalysisSequence, - maxConcurrency, - testTargetTimeout, - globalTimeout, - policyState, - suiteType, - selectedTestRuns, - draftedTestRuns, - AZStd::move(selectedTestRunReport), - AZStd::move(draftedTestRunReport)) - , m_discardedTestRuns(discardedTestRuns) + DraftingSequenceReportBase&& report, AZStd::vector discardedTestRuns) + : DraftingSequenceReportBase(AZStd::move(report)) + , m_discardedTestRuns(AZStd::move(discardedTestRuns)) { } @@ -232,25 +198,24 @@ namespace TestImpact SafeImpactAnalysisSequenceReport::SafeImpactAnalysisSequenceReport( size_t maxConcurrency, - const AZStd::optional& testTargetTimeout, - const AZStd::optional& globalTimeout, - const SafeImpactAnalysisSequencePolicyState& policyState, + AZStd::optional testTargetTimeout, + AZStd::optional globalTimeout, + SafeImpactAnalysisSequencePolicyState policyState, SuiteType suiteType, - const TestRunSelection& selectedTestRuns, - const TestRunSelection& discardedTestRuns, - const AZStd::vector& draftedTestRuns, + TestRunSelection selectedTestRuns, + TestRunSelection discardedTestRuns, + AZStd::vector draftedTestRuns, TestRunReport&& selectedTestRunReport, TestRunReport&& discardedTestRunReport, TestRunReport&& draftedTestRunReport) : DraftingSequenceReportBase( - SequenceReportType::SafeImpactAnalysisSequence, maxConcurrency, - testTargetTimeout, - globalTimeout, - policyState, + AZStd::move(testTargetTimeout), + AZStd::move(globalTimeout), + AZStd::move(policyState), suiteType, - selectedTestRuns, - draftedTestRuns, + AZStd::move(selectedTestRuns), + AZStd::move(draftedTestRuns), AZStd::move(selectedTestRunReport), AZStd::move(draftedTestRunReport)) , m_discardedTestRuns(discardedTestRuns) @@ -258,6 +223,14 @@ namespace TestImpact { } + SafeImpactAnalysisSequenceReport::SafeImpactAnalysisSequenceReport( + DraftingSequenceReportBase&& report, TestRunSelection discardedTestRuns, TestRunReport&& discardedTestRunReport) + : DraftingSequenceReportBase(AZStd::move(report)) + , m_discardedTestRuns(AZStd::move(discardedTestRuns)) + , m_discardedTestRunReport(AZStd::move(discardedTestRunReport)) + { + } + TestSequenceResult SafeImpactAnalysisSequenceReport::GetResult() const { return CalculateMultiTestSequenceResult({ DraftingSequenceReportBase::GetResult(), m_discardedTestRunReport.GetResult() }); diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReportSerializer.cpp b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReportSerializer.cpp index 99a187fe16..944fd4ac38 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReportSerializer.cpp +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactClientSequenceReportSerializer.cpp @@ -21,7 +21,7 @@ namespace TestImpact { namespace SequenceReportFields { - // Keys for pertinent JSON node and attribute names + // Keys for pertinent Json node and attribute names constexpr const char* Keys[] = { "name", @@ -417,13 +417,13 @@ namespace TestImpact writer.String(DynamicDependencyMapPolicyAsString(policyState.m_dynamicDependencyMap).c_str()); } - template + template void SerializeSequenceReportBaseMembers( - const Client::SequenceReportBase& sequenceReport, rapidjson::PrettyWriter& writer) + const SequenceReportBaseType& sequenceReport, rapidjson::PrettyWriter& writer) { // Type writer.Key(SequenceReportFields::Keys[SequenceReportFields::Type]); - writer.String(SequenceReportTypeAsString(sequenceReport.GetType()).c_str()); + writer.String(SequenceReportTypeAsString(sequenceReport.ReportType).c_str()); // Test target timeout writer.Key(SequenceReportFields::Keys[SequenceReportFields::TestTargetTimeout]); @@ -510,9 +510,9 @@ namespace TestImpact writer.Uint64(sequenceReport.GetTotalNumDisabledTests()); } - template + template void SerializeDraftingSequenceReportMembers( - const Client::DraftingSequenceReportBase& sequenceReport, rapidjson::PrettyWriter& writer) + const DraftingSequenceReportBaseType& sequenceReport, rapidjson::PrettyWriter& writer) { SerializeSequenceReportBaseMembers(sequenceReport, writer); @@ -603,4 +603,254 @@ namespace TestImpact return stringBuffer.GetString(); } + + AZStd::chrono::high_resolution_clock::time_point TimePointFromMsInt64(AZ::s64 ms) + { + return AZStd::chrono::high_resolution_clock::time_point(AZStd::chrono::milliseconds(ms)); + } + + AZStd::vector DeserializeTests(const rapidjson::Value& serialTests) + { + AZStd::vector tests; + tests.reserve(serialTests[SequenceReportFields::Keys[SequenceReportFields::Tests]].GetArray().Size()); + for (const auto& test : serialTests[SequenceReportFields::Keys[SequenceReportFields::Tests]].GetArray()) + { + const AZStd::string name = test[SequenceReportFields::Keys[SequenceReportFields::Name]].GetString(); + const auto result = TestResultFromString(test[SequenceReportFields::Keys[SequenceReportFields::Result]].GetString()); + tests.emplace_back(name, result); + } + + return tests; + } + + Client::TestRunBase DeserializeTestRunBase(const rapidjson::Value& serialTestRun) + { + return Client::TestRunBase( + serialTestRun[SequenceReportFields::Keys[SequenceReportFields::Name]].GetString(), + serialTestRun[SequenceReportFields::Keys[SequenceReportFields::CommandArgs]].GetString(), + TimePointFromMsInt64(serialTestRun[SequenceReportFields::Keys[SequenceReportFields::StartTime]].GetInt64()), + AZStd::chrono::milliseconds(serialTestRun[SequenceReportFields::Keys[SequenceReportFields::Duration]].GetInt64()), + TestRunResultFromString(serialTestRun[SequenceReportFields::Keys[SequenceReportFields::Result]].GetString())); + } + + template + AZStd::vector DeserializeTestRuns(const rapidjson::Value& serialTestRuns) + { + AZStd::vector testRuns; + testRuns.reserve(serialTestRuns.GetArray().Size()); + for (const auto& testRun : serialTestRuns.GetArray()) + { + testRuns.emplace_back(DeserializeTestRunBase(testRun)); + } + + return testRuns; + } + + template + AZStd::vector DeserializeCompletedTestRuns(const rapidjson::Value& serialCompletedTestRuns) + { + AZStd::vector testRuns; + testRuns.reserve(serialCompletedTestRuns.GetArray().Size()); + for (const auto& testRun : serialCompletedTestRuns.GetArray()) + { + testRuns.emplace_back( + DeserializeTestRunBase(testRun), DeserializeTests(testRun[SequenceReportFields::Keys[SequenceReportFields::Tests]])); + } + + return testRuns; + } + + Client::TestRunReport DeserializeTestRunReport(const rapidjson::Value& serialTestRunReport) + { + return Client::TestRunReport( + TestSequenceResultFromString(serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::Result]].GetString()), + TimePointFromMsInt64(serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::StartTime]].GetInt64()), + AZStd::chrono::milliseconds(serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::Duration]].GetInt64()), + DeserializeCompletedTestRuns( + serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::PassingTestRuns]]), + DeserializeCompletedTestRuns( + serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::FailingTestRuns]]), + DeserializeTestRuns( + serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::ExecutionFailureTestRuns]]), + DeserializeTestRuns( + serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::TimedOutTestRuns]]), + DeserializeTestRuns( + serialTestRunReport[SequenceReportFields::Keys[SequenceReportFields::UnexecutedTestRuns]])); + } + + Client::TestRunSelection DeserializeTestSelection(const rapidjson::Value& serialTestRunSelection) + { + const auto extractTestTargetNames = [](const rapidjson::Value& serialTestTargets) + { + AZStd::vector testTargets; + testTargets.reserve(serialTestTargets.GetArray().Size()); + for (const auto& testTarget : serialTestTargets.GetArray()) + { + testTargets.emplace_back(testTarget.GetString()); + } + + return testTargets; + }; + + return Client::TestRunSelection( + extractTestTargetNames(serialTestRunSelection[SequenceReportFields::Keys[SequenceReportFields::IncludedTestRuns]]), + extractTestTargetNames(serialTestRunSelection[SequenceReportFields::Keys[SequenceReportFields::ExcludedTestRuns]])); + } + + PolicyStateBase DeserializePolicyStateBaseMembers(const rapidjson::Value& serialPolicyState) + { + return + { + ExecutionFailurePolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::ExecutionFailure]].GetString()), + FailedTestCoveragePolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::CoverageFailure]].GetString()), + TestFailurePolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::TestFailure]].GetString()), + IntegrityFailurePolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::IntegrityFailure]].GetString()), + TestShardingPolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::TestSharding]].GetString()), + TargetOutputCapturePolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::TargetOutputCapture]].GetString()) + }; + } + + SequencePolicyState DeserializePolicyStateMembers(const rapidjson::Value& serialPolicyState) + { + return { DeserializePolicyStateBaseMembers(serialPolicyState) }; + } + + SafeImpactAnalysisSequencePolicyState DeserializeSafeImpactAnalysisPolicyStateMembers(const rapidjson::Value& serialPolicyState) + { + return + { + DeserializePolicyStateBaseMembers(serialPolicyState), + TestPrioritizationPolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::TestPrioritization]].GetString()) + }; + } + + ImpactAnalysisSequencePolicyState DeserializeImpactAnalysisSequencePolicyStateMembers(const rapidjson::Value& serialPolicyState) + { + return + { + DeserializePolicyStateBaseMembers(serialPolicyState), + TestPrioritizationPolicyFromString(serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::TestPrioritization]].GetString()), + DynamicDependencyMapPolicyFromString( + serialPolicyState[SequenceReportFields::Keys[SequenceReportFields::DynamicDependencyMap]].GetString()) + }; + } + + template + PolicyStateType DeserializePolicyStateType(const rapidjson::Value& serialPolicyStateType) + { + if constexpr (AZStd::is_same_v) + { + return DeserializePolicyStateMembers(serialPolicyStateType); + } + else if constexpr (AZStd::is_same_v) + { + return DeserializeSafeImpactAnalysisPolicyStateMembers(serialPolicyStateType); + } + else if constexpr (AZStd::is_same_v) + { + return DeserializeImpactAnalysisSequencePolicyStateMembers(serialPolicyStateType); + } + else + { + static_assert(false, "Template paramater must be a valid policy state type"); + } + } + + template + SequenceReportBaseType DeserialiseSequenceReportBase(const rapidjson::Value& serialSequenceReportBase) + { + const auto type = SequenceReportTypeFromString(serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::Type]].GetString()); + AZ_TestImpact_Eval( + type == SequenceReportBaseType::ReportType, + SequenceReportException, AZStd::string::format( + "The JSON sequence report type '%s' does not match the constructed report type", + serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::Type]].GetString())); + + const auto testTargetTimeout = + serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::TestTargetTimeout]].GetUint64(); + const auto globalTimeout = + serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::GlobalTimeout]].GetUint64(); + + return SequenceReportBaseType( + serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::MaxConcurrency]].GetUint64(), + testTargetTimeout ? AZStd::optional{ testTargetTimeout } : AZStd::nullopt, + globalTimeout ? AZStd::optional{ globalTimeout } : AZStd::nullopt, + DeserializePolicyStateType(serialSequenceReportBase), + SuiteTypeFromString(serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::Suite]].GetString()), + DeserializeTestSelection(serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::SelectedTestRuns]]), + DeserializeTestRunReport(serialSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::SelectedTestRunReport]])); + } + + template + Client::DraftingSequenceReportBase + DeserializeDraftingSequenceReportBase(const rapidjson::Value& serialDraftingSequenceReportBase) + { + AZStd::vector draftingTestRuns; + draftingTestRuns.reserve( + serialDraftingSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::DraftedTestRuns]].GetArray().Size()); + for (const auto& testRun : + serialDraftingSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::DraftedTestRuns]].GetArray()) + { + draftingTestRuns.emplace_back(testRun.GetString()); + } + + using SequenceBase = + Client::SequenceReportBase; + using DraftingSequenceBase = + Client::DraftingSequenceReportBase; + + return DraftingSequenceBase( + DeserialiseSequenceReportBase(serialDraftingSequenceReportBase), + AZStd::move(draftingTestRuns), + DeserializeTestRunReport(serialDraftingSequenceReportBase[SequenceReportFields::Keys[SequenceReportFields::DraftedTestRunReport]])); + } + + rapidjson::Document OpenSequenceReportJson(const AZStd::string& sequenceReportJson) + { + rapidjson::Document doc; + + if (doc.Parse<0>(sequenceReportJson.c_str()).HasParseError()) + { + throw SequenceReportException("Could not parse sequence report data"); + } + + return doc; + } + + Client::RegularSequenceReport DeserializeRegularSequenceReport(const AZStd::string& sequenceReportJson) + { + const auto doc = OpenSequenceReportJson(sequenceReportJson); + return DeserialiseSequenceReportBase(doc); + } + + Client::SeedSequenceReport DeserializeSeedSequenceReport(const AZStd::string& sequenceReportJson) + { + const auto doc = OpenSequenceReportJson(sequenceReportJson); + return DeserialiseSequenceReportBase(doc); + } + + Client::ImpactAnalysisSequenceReport DeserializeImpactAnalysisSequenceReport(const AZStd::string& sequenceReportJson) + { + const auto doc = OpenSequenceReportJson(sequenceReportJson); + + AZStd::vector discardedTestRuns; + discardedTestRuns.reserve(doc[SequenceReportFields::Keys[SequenceReportFields::DiscardedTestRuns]].GetArray().Size()); + for (const auto& testRun : doc[SequenceReportFields::Keys[SequenceReportFields::DiscardedTestRuns]].GetArray()) + { + discardedTestRuns.emplace_back(testRun.GetString()); + } + + return Client::ImpactAnalysisSequenceReport( + DeserializeDraftingSequenceReportBase(doc), AZStd::move(discardedTestRuns)); + } + + Client::SafeImpactAnalysisSequenceReport DeserializeSafeImpactAnalysisSequenceReport(const AZStd::string& sequenceReportJson) + { + const auto doc = OpenSequenceReportJson(sequenceReportJson); + + return Client::SafeImpactAnalysisSequenceReport( + DeserializeDraftingSequenceReportBase(doc), + DeserializeTestSelection(doc[SequenceReportFields::Keys[SequenceReportFields::DiscardedTestRuns]]), + DeserializeTestRunReport(doc[SequenceReportFields::Keys[SequenceReportFields::DiscardedTestRunReport]])); + } } // namespace TestImpact diff --git a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp index 3f6c9dafd4..ecfdec287b 100644 --- a/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp +++ b/Code/Tools/TestImpactFramework/Runtime/Code/Source/TestImpactUtils.cpp @@ -243,4 +243,256 @@ namespace TestImpact throw(Exception(AZStd::string::format("Unexpected client test case result: %u", aznumeric_cast(result)))); } } + + SuiteType SuiteTypeFromString(const AZStd::string& suiteType) + { + if (suiteType == SuiteTypeAsString(SuiteType::Main)) + { + return SuiteType::Main; + } + else if (suiteType == SuiteTypeAsString(SuiteType::Periodic)) + { + return SuiteType::Periodic; + } + else if (suiteType == SuiteTypeAsString(SuiteType::Sandbox)) + { + return SuiteType::Sandbox; + } + else + { + throw Exception(AZStd::string::format("Unexpected suite type: '%s'", suiteType.c_str())); + } + } + + Client::SequenceReportType SequenceReportTypeFromString(const AZStd::string& type) + { + if (type == SequenceReportTypeAsString(Client::SequenceReportType::ImpactAnalysisSequence)) + { + return Client::SequenceReportType::ImpactAnalysisSequence; + } + else if (type == SequenceReportTypeAsString(Client::SequenceReportType::RegularSequence)) + { + return Client::SequenceReportType::RegularSequence; + } + else if (type == SequenceReportTypeAsString(Client::SequenceReportType::SafeImpactAnalysisSequence)) + { + return Client::SequenceReportType::SafeImpactAnalysisSequence; + } + else if (type == SequenceReportTypeAsString(Client::SequenceReportType::SeedSequence)) + { + return Client::SequenceReportType::SeedSequence; + } + else + { + throw Exception(AZStd::string::format("Unexpected sequence report type: '%s'", type.c_str())); + } + } + + Client::TestRunResult TestRunResultFromString(const AZStd::string& result) + { + if (result == TestRunResultAsString(Client::TestRunResult::AllTestsPass)) + { + return Client::TestRunResult::AllTestsPass; + } + else if (result == TestRunResultAsString(Client::TestRunResult::FailedToExecute)) + { + return Client::TestRunResult::FailedToExecute; + } + else if (result == TestRunResultAsString(Client::TestRunResult::NotRun)) + { + return Client::TestRunResult::NotRun; + } + else if (result == TestRunResultAsString(Client::TestRunResult::TestFailures)) + { + return Client::TestRunResult::TestFailures; + } + else if (result == TestRunResultAsString(Client::TestRunResult::Timeout)) + { + return Client::TestRunResult::Timeout; + } + else + { + throw Exception(AZStd::string::format("Unexpected client test run result: '%s'", result.c_str())); + } + } + + Client::TestResult TestResultFromString(const AZStd::string& result) + { + if (result == ClientTestResultAsString(Client::TestResult::Failed)) + { + return Client::TestResult::Failed; + } + else if (result == ClientTestResultAsString(Client::TestResult::NotRun)) + { + return Client::TestResult::NotRun; + } + else if (result == ClientTestResultAsString(Client::TestResult::Passed)) + { + return Client::TestResult::Passed; + } + else + { + throw Exception(AZStd::string::format("Unexpected client test result: '%s'", result.c_str())); + } + } + + TestSequenceResult TestSequenceResultFromString(const AZStd::string& result) + { + if (result == TestSequenceResultAsString(TestSequenceResult::Failure)) + { + return TestSequenceResult::Failure; + } + else if (result == TestSequenceResultAsString(TestSequenceResult::Success)) + { + return TestSequenceResult::Success; + } + else if (result == TestSequenceResultAsString(TestSequenceResult::Timeout)) + { + return TestSequenceResult::Timeout; + } + else + { + throw Exception(AZStd::string::format("Unexpected test sequence result: '%s'", result.c_str())); + } + } + + Policy::ExecutionFailure ExecutionFailurePolicyFromString(const AZStd::string& executionFailurePolicy) + { + if (executionFailurePolicy == ExecutionFailurePolicyAsString(Policy::ExecutionFailure::Abort)) + { + return Policy::ExecutionFailure::Abort; + } + else if (executionFailurePolicy == ExecutionFailurePolicyAsString(Policy::ExecutionFailure::Continue)) + { + return Policy::ExecutionFailure::Continue; + } + else if (executionFailurePolicy == ExecutionFailurePolicyAsString(Policy::ExecutionFailure::Ignore)) + { + return Policy::ExecutionFailure::Ignore; + } + else + { + throw Exception(AZStd::string::format("Unexpected execution failure policy: '%s'", executionFailurePolicy.c_str())); + } + } + + Policy::FailedTestCoverage FailedTestCoveragePolicyFromString(const AZStd::string& failedTestCoveragePolicy) + { + if (failedTestCoveragePolicy == FailedTestCoveragePolicyAsString(Policy::FailedTestCoverage::Discard)) + { + return Policy::FailedTestCoverage::Discard; + } + else if (failedTestCoveragePolicy == FailedTestCoveragePolicyAsString(Policy::FailedTestCoverage::Keep)) + { + return Policy::FailedTestCoverage::Keep; + } + else + { + throw Exception(AZStd::string::format("Unexpected failed test coverage policy: '%s'", failedTestCoveragePolicy.c_str())); + } + } + + Policy::TestPrioritization TestPrioritizationPolicyFromString(const AZStd::string& testPrioritizationPolicy) + { + if (testPrioritizationPolicy == TestPrioritizationPolicyAsString(Policy::TestPrioritization::DependencyLocality)) + { + return Policy::TestPrioritization::DependencyLocality; + } + else if (testPrioritizationPolicy == TestPrioritizationPolicyAsString(Policy::TestPrioritization::None)) + { + return Policy::TestPrioritization::None; + } + else + { + throw Exception(AZStd::string::format("Unexpected test prioritization policy: '%s'", testPrioritizationPolicy.c_str())); + } + } + + Policy::TestFailure TestFailurePolicyFromString(const AZStd::string& testFailurePolicy) + { + if (testFailurePolicy == TestFailurePolicyAsString(Policy::TestFailure::Abort)) + { + return Policy::TestFailure::Abort; + } + else if (testFailurePolicy == TestFailurePolicyAsString(Policy::TestFailure::Continue)) + { + return Policy::TestFailure::Continue; + } + else + { + throw Exception(AZStd::string::format("Unexpected test failure policy: '%s'", testFailurePolicy.c_str())); + } + } + + Policy::IntegrityFailure IntegrityFailurePolicyFromString(const AZStd::string& integrityFailurePolicy) + { + if (integrityFailurePolicy == IntegrityFailurePolicyAsString(Policy::IntegrityFailure::Abort)) + { + return Policy::IntegrityFailure::Abort; + } + else if (integrityFailurePolicy == IntegrityFailurePolicyAsString(Policy::IntegrityFailure::Continue)) + { + return Policy::IntegrityFailure::Continue; + } + else + { + throw Exception(AZStd::string::format("Unexpected integration failure policy: '%s'", integrityFailurePolicy.c_str())); + } + } + + Policy::DynamicDependencyMap DynamicDependencyMapPolicyFromString(const AZStd::string& dynamicDependencyMapPolicy) + { + if (dynamicDependencyMapPolicy == DynamicDependencyMapPolicyAsString(Policy::DynamicDependencyMap::Discard)) + { + return Policy::DynamicDependencyMap::Discard; + } + else if (dynamicDependencyMapPolicy == DynamicDependencyMapPolicyAsString(Policy::DynamicDependencyMap::Update)) + { + return Policy::DynamicDependencyMap::Update; + } + else + { + throw Exception(AZStd::string::format("Unexpected dynamic dependency map policy: '%s'", dynamicDependencyMapPolicy.c_str())); + } + } + + Policy::TestSharding TestShardingPolicyFromString(const AZStd::string& testShardingPolicy) + { + if (testShardingPolicy == TestShardingPolicyAsString(Policy::TestSharding::Always)) + { + return Policy::TestSharding::Always; + } + else if (testShardingPolicy == TestShardingPolicyAsString(Policy::TestSharding::Never)) + { + return Policy::TestSharding::Never; + } + else + { + throw Exception(AZStd::string::format("Unexpected test sharding policy: '%s'", testShardingPolicy.c_str())); + } + } + + Policy::TargetOutputCapture TargetOutputCapturePolicyFromString(const AZStd::string& targetOutputCapturePolicy) + { + if (targetOutputCapturePolicy == TargetOutputCapturePolicyAsString(Policy::TargetOutputCapture::File)) + { + return Policy::TargetOutputCapture::File; + } + else if (targetOutputCapturePolicy == TargetOutputCapturePolicyAsString(Policy::TargetOutputCapture::None)) + { + return Policy::TargetOutputCapture::None; + } + else if (targetOutputCapturePolicy == TargetOutputCapturePolicyAsString(Policy::TargetOutputCapture::StdOut)) + { + return Policy::TargetOutputCapture::StdOut; + } + else if (targetOutputCapturePolicy == TargetOutputCapturePolicyAsString(Policy::TargetOutputCapture::StdOutAndFile)) + { + return Policy::TargetOutputCapture::StdOutAndFile; + } + else + { + throw Exception(AZStd::string::format("Unexpected target output capture policy: '%s'", targetOutputCapturePolicy.c_str())); + } + } } // namespace TestImpact From 4167bb6cde4e703b201544ef0bddf8f9f1dcfff6 Mon Sep 17 00:00:00 2001 From: AMZN-Alexandre Corcia Aguilera <82398284+aaguilea@users.noreply.github.com> Date: Fri, 17 Sep 2021 14:49:48 +0100 Subject: [PATCH 352/355] Warning System Changes (polish) Redo (#4009) * Restores the branch to the old status from old branch Signed-off-by: aaguilea * Changes that didnt make it from merge manually fixed Signed-off-by: aaguilea * forgot one Signed-off-by: aaguilea * Added Ebus in order to remove rigidbody's dependencies Signed-off-by: aaguilea * answering some of the comments in the PR Signed-off-by: aaguilea * Small typo changed Signed-off-by: aaguilea --- .../UI/PropertyEditor/ComponentEditor.cpp | 6 --- .../PhysX/EditorColliderComponentRequestBus.h | 14 ++++++ .../Code/Source/EditorColliderComponent.cpp | 47 ++++++++++++++----- .../Code/Source/EditorColliderComponent.h | 10 ++-- .../Code/Source/EditorRigidBodyComponent.cpp | 3 ++ 5 files changed, 58 insertions(+), 22 deletions(-) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditor.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditor.cpp index 85676df243..91d2359ca6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditor.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ComponentEditor.cpp @@ -395,12 +395,6 @@ namespace AzToolsFramework AzQtComponents::CardNotification* ComponentEditor::CreateNotificationForWarningComponents(const QString& message) { AzQtComponents::CardNotification * notification = CreateNotification(message); - const QPushButton * featureButton = notification->addButtonFeature(tr("Continue")); - - connect(featureButton, &QPushButton::clicked, this, [notification]() - { - notification->close(); - }); return notification; } diff --git a/Gems/PhysX/Code/Include/PhysX/EditorColliderComponentRequestBus.h b/Gems/PhysX/Code/Include/PhysX/EditorColliderComponentRequestBus.h index 2cfb48effa..20b02b7098 100644 --- a/Gems/PhysX/Code/Include/PhysX/EditorColliderComponentRequestBus.h +++ b/Gems/PhysX/Code/Include/PhysX/EditorColliderComponentRequestBus.h @@ -82,4 +82,18 @@ namespace PhysX }; using EditorColliderComponentRequestBus = AZ::EBus; + + /// + /// This is a Bus in order to communicate the status of the meshes of the collider and avoid dependencies with the rigidbody + /// + class EditorColliderValidationRequests : public AZ::ComponentBus + { + public: + /// Checks if the the mesh in the collider is correct with the current state of the Rigidbody! + virtual void ValidateRigidBodyMeshGeometryType() = 0; + }; + + using EditorColliderValidationRequestBus = AZ::EBus; } + + diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp index 4aa240eaae..566903d84a 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.cpp @@ -118,11 +118,10 @@ namespace PhysX AZ::u32 EditorProxyShapeConfig::OnShapeTypeChanged() { - //reset the physics asset if the shape type was Physics Asset - if (m_shapeType != Physics::ShapeType::PhysicsAsset && - m_lastShapeType == Physics::ShapeType::PhysicsAsset) + // reset the physics asset if the shape type was Physics Asset + if (m_shapeType != Physics::ShapeType::PhysicsAsset && m_lastShapeType == Physics::ShapeType::PhysicsAsset) { - //clean up any reference to a physics assets, and re-initialize to an empty Pipeline::MeshAsset asset. + // clean up any reference to a physics assets, and re-initialize to an empty Pipeline::MeshAsset asset. m_physicsAsset.m_pxAsset.Reset(); m_physicsAsset.m_pxAsset = AZ::Data::Asset(AZ::Data::AssetLoadBehavior::QueueLoad); @@ -212,6 +211,7 @@ namespace PhysX ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_shapeConfiguration, "Shape Configuration", "Configuration of the shape") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::ChangeNotify, &EditorColliderComponent::OnConfigurationChanged) + ->Attribute(AZ::Edit::Attributes::RemoveNotify, &EditorColliderComponent::ValidateRigidBodyMeshGeometryType) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_componentModeDelegate, "Component Mode", "Collider Component Mode") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->DataElement(AZ::Edit::UIHandlers::Default, &EditorColliderComponent::m_colliderDebugDraw, @@ -383,6 +383,7 @@ namespace PhysX ColliderShapeRequestBus::Handler::BusConnect(GetEntityId()); AZ::Render::MeshComponentNotificationBus::Handler::BusConnect(GetEntityId()); EditorColliderComponentRequestBus::Handler::BusConnect(AZ::EntityComponentIdPair(GetEntityId(), GetId())); + EditorColliderValidationRequestBus::Handler::BusConnect(GetEntityId()); m_nonUniformScaleChangedHandler = AZ::NonUniformScaleChangedEvent::Handler( [this](const AZ::Vector3& scale) {OnNonUniformScaleChanged(scale); }); AZ::NonUniformScaleRequestBus::Event(GetEntityId(), &AZ::NonUniformScaleRequests::RegisterScaleChangedEvent, @@ -427,6 +428,7 @@ namespace PhysX m_colliderDebugDraw.Disconnect(); AZ::Data::AssetBus::MultiHandler::BusDisconnect(); m_nonUniformScaleChangedHandler.Disconnect(); + EditorColliderValidationRequestBus::Handler::BusDisconnect(); EditorColliderComponentRequestBus::Handler::BusDisconnect(); AZ::Render::MeshComponentNotificationBus::Handler::BusDisconnect(); ColliderShapeRequestBus::Handler::BusDisconnect(); @@ -466,6 +468,7 @@ namespace PhysX UpdateShapeConfigurationScale(); CreateStaticEditorCollider(); + ValidateRigidBodyMeshGeometryType(); m_colliderDebugDraw.ClearCachedGeometry(); @@ -768,15 +771,16 @@ namespace PhysX { m_componentWarnings.clear(); m_configuration.m_materialSelection.SetMaterialSlots(Physics::MaterialSelection::SlotsArray()); + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree); } - AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree); } void EditorColliderComponent::ValidateRigidBodyMeshGeometryType() { const PhysX::EditorRigidBodyComponent* entityRigidbody = m_entity->FindComponent(); - if (m_shapeConfiguration.m_physicsAsset.m_configuration.GetShapeType() == Physics::ShapeType::PhysicsAsset && entityRigidbody) + if (m_shapeConfiguration.m_physicsAsset.m_pxAsset && (m_shapeConfiguration.m_shapeType == Physics::ShapeType::PhysicsAsset) && entityRigidbody) { AZStd::vector> shapes; Utils::GetShapesFromAsset(m_shapeConfiguration.m_physicsAsset.m_configuration, m_configuration, m_hasNonUniformScale, @@ -784,17 +788,32 @@ namespace PhysX if (shapes.empty()) { + m_componentWarnings.clear(); + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree); return; } - //We grab the first shape to check if it is a triangle mesh. - auto shape = AZStd::rtti_pointer_cast(shapes[0]); + //We check if the shapes are triangle meshes, if any mesh is a triangle mesh we activate the warning. + bool shapeIsTriangleMesh = false; - if (shape && - shape->GetPxShape()->getGeometryType() == physx::PxGeometryType::eTRIANGLEMESH && - entityRigidbody->GetRigidBody() && - entityRigidbody->GetRigidBody()->IsKinematic() == false) + for (const auto& shape : shapes) { + auto current_shape = AZStd::rtti_pointer_cast(shape); + if (current_shape && + current_shape->GetPxShape()->getGeometryType() == physx::PxGeometryType::eTRIANGLEMESH && + entityRigidbody->GetRigidBody() && + entityRigidbody->GetRigidBody()->IsKinematic() == false) + { + shapeIsTriangleMesh = true; + break; + } + } + + if (shapeIsTriangleMesh) + { + m_componentWarnings.clear(); + AZStd::string assetPath = m_shapeConfiguration.m_physicsAsset.m_configuration.m_asset.GetHint().c_str(); const size_t lastSlash = assetPath.rfind('/'); if (lastSlash != AZStd::string::npos) @@ -816,6 +835,10 @@ namespace PhysX { m_componentWarnings.clear(); } + + AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast( + &AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree); + } void EditorColliderComponent::OnAssetReloaded(AZ::Data::Asset asset) diff --git a/Gems/PhysX/Code/Source/EditorColliderComponent.h b/Gems/PhysX/Code/Source/EditorColliderComponent.h index 1331fd08b6..773dd0a9b8 100644 --- a/Gems/PhysX/Code/Source/EditorColliderComponent.h +++ b/Gems/PhysX/Code/Source/EditorColliderComponent.h @@ -58,8 +58,8 @@ namespace PhysX //! Proxy container for only displaying a specific shape configuration depending on the shapeType selected. struct EditorProxyShapeConfig { - AZ_CLASS_ALLOCATOR(PhysX::EditorProxyShapeConfig, AZ::SystemAllocator, 0); - AZ_RTTI(PhysX::EditorProxyShapeConfig, "{531FB42A-42A9-4234-89BA-FD349EF83D0C}"); + AZ_CLASS_ALLOCATOR(EditorProxyShapeConfig, AZ::SystemAllocator, 0); + AZ_RTTI(EditorProxyShapeConfig, "{531FB42A-42A9-4234-89BA-FD349EF83D0C}"); static void Reflect(AZ::ReflectContext* context); EditorProxyShapeConfig() = default; @@ -106,6 +106,7 @@ namespace PhysX , private PhysX::ColliderShapeRequestBus::Handler , private AZ::Render::MeshComponentNotificationBus::Handler , private PhysX::EditorColliderComponentRequestBus::Handler + , private PhysX::EditorColliderValidationRequestBus::Handler , private AzPhysics::SimulatedBodyComponentRequestsBus::Handler { public: @@ -197,6 +198,9 @@ namespace PhysX void SetAssetScale(const AZ::Vector3& scale) override; AZ::Vector3 GetAssetScale() override; + // PhysX::EditorColliderValidationRequestBus overrides ... + void ValidateRigidBodyMeshGeometryType() override; + AZ::Transform GetColliderLocalTransform() const; EditorProxyShapeConfig m_shapeConfiguration; @@ -223,8 +227,6 @@ namespace PhysX void BuildDebugDrawMesh() const; - void ValidateRigidBodyMeshGeometryType(); - AZ::ComponentDescriptor::StringWarningArray GetComponentWarnings() const { return m_componentWarnings; }; using ComponentModeDelegate = AzToolsFramework::ComponentModeFramework::ComponentModeDelegate; diff --git a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp index ce812a9f31..447c2755c6 100644 --- a/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp +++ b/Gems/PhysX/Code/Source/EditorRigidBodyComponent.cpp @@ -286,6 +286,9 @@ namespace PhysX } CreateEditorWorldRigidBody(); + PhysX::EditorColliderValidationRequestBus::Event( + GetEntityId(), &PhysX::EditorColliderValidationRequestBus::Events::ValidateRigidBodyMeshGeometryType); + AzPhysics::SimulatedBodyComponentRequestsBus::Handler::BusConnect(GetEntityId()); } From 9184d52a9bb75ac6f8523082a7cff3bc4ec9b0e0 Mon Sep 17 00:00:00 2001 From: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> Date: Fri, 17 Sep 2021 11:14:09 -0500 Subject: [PATCH 353/355] Fixed creation of the Engine.pak file (#4188) First the Cache directory itself was being added to the archive. It has been updated to query the assets from the asset type folder i.e Cache/ Second execute_process is being used to invoke CMake `tar` command to create the zip archive since the CMake `file(ARCHIVE_CREATE)` adds the files to the archive relative to the current working directory which is ${CMAKE_BINARY_DIR} when invoking the install script. This was causing the archive to store files with a path of "../../Cache/pc" Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com> --- cmake/Platform/Linux/PAL_linux.cmake | 2 +- cmake/Projects.cmake | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/cmake/Platform/Linux/PAL_linux.cmake b/cmake/Platform/Linux/PAL_linux.cmake index c088163dca..e74adb287e 100644 --- a/cmake/Platform/Linux/PAL_linux.cmake +++ b/cmake/Platform/Linux/PAL_linux.cmake @@ -35,7 +35,7 @@ else() endif() # Set the default asset type for deployment -set(LY_ASSET_DEPLOY_ASSET_TYPE "pc" CACHE STRING "Set the asset type for deployment.") +set(LY_ASSET_DEPLOY_ASSET_TYPE "linux" CACHE STRING "Set the asset type for deployment.") # Set the python cmd tool ly_set(LY_PYTHON_CMD ${CMAKE_CURRENT_SOURCE_DIR}/python/python.sh) diff --git a/cmake/Projects.cmake b/cmake/Projects.cmake index 7f2ac6a4fd..d3f4b33b03 100644 --- a/cmake/Projects.cmake +++ b/cmake/Projects.cmake @@ -147,14 +147,24 @@ foreach(project ${LY_PROJECTS}) cmake_path(RELATIVE_PATH CMAKE_RUNTIME_OUTPUT_DIRECTORY BASE_DIRECTORY ${CMAKE_BINARY_DIR} OUTPUT_VARIABLE runtime_output_directory) set(install_engine_pak_template [=[ if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") - set(install_output_folder "${CMAKE_INSTALL_PREFIX}/@runtime_output_directory@/@PAL_PLATFORM_NAME@/${CMAKE_INSTALL_CONFIG_NAME}") - message(STATUS "Generating ${install_output_folder}/Engine.pak from @full_directory_path@/Cache") + set(install_output_folder "${CMAKE_INSTALL_PREFIX}/@runtime_output_directory@/@PAL_PLATFORM_NAME@/${CMAKE_INSTALL_CONFIG_NAME}/@LY_BUILD_PERMUTATION@") + if(NOT DEFINED LY_ASSET_DEPLOY_ASSET_TYPE) + set(LY_ASSET_DEPLOY_ASSET_TYPE @LY_ASSET_DEPLOY_ASSET_TYPE@) + endif() + message(STATUS "Generating ${install_output_folder}/Engine.pak from @full_directory_path@/Cache/${LY_ASSET_DEPLOY_ASSET_TYPE}") file(MAKE_DIRECTORY "${install_output_folder}") - file(ARCHIVE_CREATE OUTPUT "${install_output_folder}/Engine.pak" - PATHS "@full_directory_path@/Cache" - FORMAT zip - ) - message(STATUS "${install_output_folder}/Engine.pak generated") + cmake_path(SET cache_product_path "@full_directory_path@/Cache/${LY_ASSET_DEPLOY_ASSET_TYPE}") + file(GLOB product_assets "${cache_product_path}/*") + if(product_assets) + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar "cf" "${install_output_folder}/Engine.pak" --format=zip -- ${product_assets} + WORKING_DIRECTORY "${cache_product_path}" + RESULT_VARIABLE archive_creation_result + ) + if(archive_creation_result EQUAL 0) + message(STATUS "${install_output_folder}/Engine.pak generated") + endif() + endif() endif() ]=]) string(CONFIGURE "${install_engine_pak_template}" install_engine_pak_code @ONLY) From fc8697edd5e68d00fef899ba51faf3f4584d358f Mon Sep 17 00:00:00 2001 From: Qing Tao <55564570+VickyAtAZ@users.noreply.github.com> Date: Fri, 17 Sep 2021 09:36:55 -0700 Subject: [PATCH 354/355] ATOM-16029 Add direct support for Astc compression (#4157) * ATOM-16029 Add direct support for Astc compression Changes include: - Add ASTCCompressor class - Enabled 3rdparty::astc-encoder static library. - Remove ASTC support in PVRTC compressor and ISPC compressor. - Update unit test to include texts for ASTC compress/decompress. Signed-off-by: Qing Tao --- .../ImageProcessingAtom/Code/CMakeLists.txt | 3 +- .../Source/Compressors/ASTCCompressor.cpp | 322 ++++++++++++++++++ .../Code/Source/Compressors/ASTCCompressor.h | 30 ++ .../Code/Source/Compressors/Compressor.cpp | 14 +- .../Code/Source/Compressors/Compressor.h | 3 +- .../Compressors/ISPCTextureCompressor.cpp | 32 +- .../Code/Source/Compressors/PVRTC.cpp | 53 +-- .../Code/Source/Processing/ImageConvert.cpp | 20 +- .../Code/Source/Processing/ImageConvert.h | 2 + .../Code/Tests/ImageProcessing_Test.cpp | 152 ++++++++- .../Tests/TestAssets/1024x1024_normal.tiff | 3 + .../Code/Tests/TestAssets/512x512_RGB_N.tga | 3 - .../Code/imageprocessing_files.cmake | 2 + .../Linux/BuiltInPackages_linux.cmake | 2 +- .../Platform/Mac/BuiltInPackages_mac.cmake | 2 +- .../Windows/BuiltInPackages_windows.cmake | 2 +- 16 files changed, 539 insertions(+), 106 deletions(-) create mode 100644 Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.cpp create mode 100644 Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.h create mode 100644 Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_normal.tiff delete mode 100644 Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/512x512_RGB_N.tga diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt b/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt index dfeee011cc..1463124e27 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/CMakeLists.txt @@ -62,6 +62,7 @@ ly_add_target( 3rdParty::Qt::Core 3rdParty::Qt::Widgets 3rdParty::Qt::Gui + 3rdParty::astc-encoder 3rdParty::etc2comp 3rdParty::PVRTexTool 3rdParty::squish-ccr @@ -77,8 +78,6 @@ ly_add_target( Gem::Atom_RPI.Public Gem::Atom_RHI.Reflect Gem::Atom_Utils.Static - RUNTIME_DEPENDENCIES - 3rdParty::ASTCEncoder ) ly_add_source_properties( diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.cpp new file mode 100644 index 0000000000..4ef47c043d --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.cpp @@ -0,0 +1,322 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + + +namespace ImageProcessingAtom +{ + bool ASTCCompressor::IsCompressedPixelFormatSupported(EPixelFormat fmt) + { + return IsASTCFormat(fmt); + } + + bool ASTCCompressor::IsUncompressedPixelFormatSupported(EPixelFormat fmt) + { + // astc encoder requires the compress input image or decompress output image to have four channels + switch (fmt) + { + // uint 8 + case ePixelFormat_R8G8B8A8: + case ePixelFormat_R8G8B8X8: + // fp16 + case ePixelFormat_R16G16B16A16F: + // fp32 + case ePixelFormat_R32G32B32A32F: + return true; + default: + return false; + } + } + + EPixelFormat ASTCCompressor::GetSuggestedUncompressedFormat([[maybe_unused]] EPixelFormat compressedfmt, EPixelFormat uncompressedfmt) const + { + if (IsUncompressedPixelFormatSupported(uncompressedfmt)) + { + return uncompressedfmt; + } + + auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(uncompressedfmt); + switch (formatInfo->eSampleType) + { + case ESampleType::eSampleType_Half: + return ePixelFormat_R16G16B16A16F; + case ESampleType::eSampleType_Float: + return ePixelFormat_R32G32B32A32F; + } + + return ePixelFormat_R8G8B8A8; + } + + ColorSpace ASTCCompressor::GetSupportedColorSpace([[maybe_unused]] EPixelFormat compressFormat) const + { + return ColorSpace::autoSelect; + } + + const char* ASTCCompressor::GetName() const + { + return "ASTCCompressor"; + } + + bool ASTCCompressor::DoesSupportDecompress([[maybe_unused]] EPixelFormat fmtDst) + { + return true; + } + + astcenc_profile GetAstcProfile(bool isSrgb, EPixelFormat pixelFormat) + { + // select profile depends on LDR or HDR, SRGB or Linear + // ASTCENC_PRF_LDR + // ASTCENC_PRF_LDR_SRGB + // ASTCENC_PRF_HDR_RGB_LDR_A + // ASTCENC_PRF_HDR + + auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); + bool isHDR = formatInfo->eSampleType == ESampleType::eSampleType_Half || formatInfo->eSampleType == ESampleType::eSampleType_Float; + astcenc_profile profile; + if (isHDR) + { + // HDR is not support in core vulkan 1.1 for android. + // https://arm-software.github.io/vulkan-sdk/_a_s_t_c.html + profile = isSrgb?ASTCENC_PRF_HDR_RGB_LDR_A:ASTCENC_PRF_HDR; + } + else + { + + profile = isSrgb?ASTCENC_PRF_LDR_SRGB:ASTCENC_PRF_LDR; + } + return profile; + } + + astcenc_type GetAstcDataType(EPixelFormat pixelFormat) + { + auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); + astcenc_type dataType = ASTCENC_TYPE_U8; + + switch (formatInfo->eSampleType) + { + case ESampleType::eSampleType_Uint8: + dataType = ASTCENC_TYPE_U8; + break; + case ESampleType::eSampleType_Half: + dataType = ASTCENC_TYPE_F16; + break; + case ESampleType::eSampleType_Float: + dataType = ASTCENC_TYPE_F32; + break; + default: + dataType = ASTCENC_TYPE_U8; + AZ_Assert(false, "Unsupport uncompressed format %s", formatInfo->szName); + break; + } + + return dataType; + } + + float GetAstcCompressQuality(ICompressor::EQuality quality) + { + switch (quality) + { + case ICompressor::EQuality::eQuality_Fast: + return ASTCENC_PRE_FAST; + case ICompressor::EQuality::eQuality_Slow: + return ASTCENC_PRE_THOROUGH; + case ICompressor::EQuality::eQuality_Preview: + case ICompressor::EQuality::eQuality_Normal: + default: + return ASTCENC_PRE_MEDIUM; + } + } + + IImageObjectPtr ASTCCompressor::CompressImage(IImageObjectPtr srcImage, EPixelFormat fmtDst, const CompressOption* compressOption) const + { + //validate input + EPixelFormat fmtSrc = srcImage->GetPixelFormat(); + + //src format need to be uncompressed and dst format need to compressed. + if (!IsUncompressedPixelFormatSupported(fmtSrc) || !IsCompressedPixelFormatSupported(fmtDst)) + { + return nullptr; + } + + astcenc_swizzle swizzle {ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, compressOption->discardAlpha? ASTCENC_SWZ_1:ASTCENC_SWZ_A}; + AZ::u32 flags = 0; + if (srcImage->HasImageFlags(EIF_RenormalizedTexture)) + { + ImageToProcess imageToProcess(srcImage); + imageToProcess.ConvertFormatUncompressed(ePixelFormat_R8G8B8X8); + srcImage = imageToProcess.Get(); + fmtSrc = srcImage->GetPixelFormat(); + + flags = ASTCENC_FLG_MAP_NORMAL; + swizzle = astcenc_swizzle{ ASTCENC_SWZ_R, ASTCENC_SWZ_R, ASTCENC_SWZ_R, ASTCENC_SWZ_G }; + } + + auto dstFormatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(fmtDst); + + const float quality = GetAstcCompressQuality(compressOption->compressQuality); + const astcenc_profile profile = GetAstcProfile(srcImage->HasImageFlags(EIF_SRGBRead), fmtSrc); + + astcenc_config config; + astcenc_error status; + status = astcenc_config_init(profile, dstFormatInfo->blockWidth, dstFormatInfo->blockHeight, 1, quality, flags, &config); + + //ASTCENC_FLG_MAP_NORMAL + AZ_Assert( status == ASTCENC_SUCCESS, "ERROR: Codec config init failed: %s\n", astcenc_get_error_string(status)); + + // Create a context based on the configuration + astcenc_context* context; + AZ::u32 blockCount = ((srcImage->GetWidth(0)+ dstFormatInfo->blockWidth-1)/dstFormatInfo->blockWidth) * ((srcImage->GetHeight(0) + dstFormatInfo->blockHeight-1)/dstFormatInfo->blockHeight); + AZ::u32 threadCount = AZStd::min(AZStd::thread::hardware_concurrency(), blockCount); + status = astcenc_context_alloc(&config, threadCount, &context); + AZ_Assert( status == ASTCENC_SUCCESS, "ERROR: Codec context alloc failed: %s\n", astcenc_get_error_string(status)); + + const astcenc_type dataType =GetAstcDataType(fmtSrc); + + // Compress the image for each mips + IImageObjectPtr dstImage(srcImage->AllocateImage(fmtDst)); + const AZ::u32 dstMips = dstImage->GetMipCount(); + for (AZ::u32 mip = 0; mip < dstMips; ++mip) + { + astcenc_image image; + image.dim_x = srcImage->GetWidth(mip); + image.dim_y = srcImage->GetHeight(mip); + image.dim_z = 1; + image.data_type = dataType; + + AZ::u8* srcMem; + AZ::u32 srcPitch; + srcImage->GetImagePointer(mip, srcMem, srcPitch); + image.data = reinterpret_cast(&srcMem); + + AZ::u8* dstMem; + AZ::u32 dstPitch; + dstImage->GetImagePointer(mip, dstMem, dstPitch); + AZ::u32 dataSize = dstImage->GetMipBufSize(mip); + + // Create jobs for each compression thread + auto completionJob = aznew AZ::JobCompletion(); + for (AZ::u32 threadIdx = 0; threadIdx < threadCount; threadIdx++) + { + const auto jobLambda = [&status, context, &image, &swizzle, dstMem, dataSize, threadIdx]() + { + astcenc_error error = astcenc_compress_image(context, &image, &swizzle, dstMem, dataSize, threadIdx); + if (error != ASTCENC_SUCCESS) + { + status = error; + } + }; + + AZ::Job* simulationJob = AZ::CreateJobFunction(AZStd::move(jobLambda), true, nullptr); //auto-deletes + simulationJob->SetDependent(completionJob); + simulationJob->Start(); + } + + if (completionJob) + { + completionJob->StartAndWaitForCompletion(); + delete completionJob; + completionJob = nullptr; + } + + if (status != ASTCENC_SUCCESS) + { + AZ_Error("Image Processing", false, "ASTCCompressor::CompressImage failed: %s\n", astcenc_get_error_string(status)); + astcenc_context_free(context); + return nullptr; + } + + // Need to reset to compress next mip + astcenc_compress_reset(context); + } + astcenc_context_free(context); + + return dstImage; + } + + IImageObjectPtr ASTCCompressor::DecompressImage(IImageObjectPtr srcImage, EPixelFormat fmtDst) const + { + //validate input + EPixelFormat fmtSrc = srcImage->GetPixelFormat(); //compressed + auto srcFormatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(fmtSrc); + + if (!IsCompressedPixelFormatSupported(fmtSrc) || !IsUncompressedPixelFormatSupported(fmtDst)) + { + return nullptr; + } + + const float quality = ASTCENC_PRE_MEDIUM; + astcenc_swizzle swizzle {ASTCENC_SWZ_R, ASTCENC_SWZ_G, ASTCENC_SWZ_B, ASTCENC_SWZ_A}; + if (srcImage->HasImageFlags(EIF_RenormalizedTexture)) + { + swizzle = astcenc_swizzle{ASTCENC_SWZ_R, ASTCENC_SWZ_A, ASTCENC_SWZ_Z, ASTCENC_SWZ_1}; + } + + astcenc_config config; + astcenc_error status; + astcenc_profile profile = GetAstcProfile(srcImage->HasImageFlags(EIF_SRGBRead), fmtDst); + AZ::u32 flags = ASTCENC_FLG_DECOMPRESS_ONLY; + status = astcenc_config_init(profile, srcFormatInfo->blockWidth, srcFormatInfo->blockHeight, 1, quality, flags, &config); + + //ASTCENC_FLG_MAP_NORMAL + AZ_Assert( status == ASTCENC_SUCCESS, "astcenc_config_init failed: %s\n", astcenc_get_error_string(status)); + + // Create a context based on the configuration + const AZ::u32 threadCount = 1; // Decompress function doesn't support multiple threads + astcenc_context* context; + status = astcenc_context_alloc(&config, threadCount, &context); + AZ_Assert( status == ASTCENC_SUCCESS, "astcenc_context_alloc failed: %s\n", astcenc_get_error_string(status)); + + astcenc_type dataType =GetAstcDataType(fmtDst); + + // Decompress the image for each mips + IImageObjectPtr dstImage(srcImage->AllocateImage(fmtDst)); + const AZ::u32 dstMips = dstImage->GetMipCount(); + for (AZ::u32 mip = 0; mip < dstMips; ++mip) + { + astcenc_image image; + image.dim_x = srcImage->GetWidth(mip); + image.dim_y = srcImage->GetHeight(mip); + image.dim_z = 1; + image.data_type = dataType; + + AZ::u8* srcMem; + AZ::u32 srcPitch; + srcImage->GetImagePointer(mip, srcMem, srcPitch); + AZ::u32 srcDataSize = srcImage->GetMipBufSize(mip); + + AZ::u8* dstMem; + AZ::u32 dstPitch; + dstImage->GetImagePointer(mip, dstMem, dstPitch); + image.data = reinterpret_cast(&dstMem); + + status = astcenc_decompress_image(context, srcMem, srcDataSize, &image, &swizzle, 0); + + if (status != ASTCENC_SUCCESS) + { + AZ_Error("Image Processing", false, "ASTCCompressor::DecompressImage failed: %s\n", astcenc_get_error_string(status)); + astcenc_context_free(context); + return nullptr; + } + } + + astcenc_context_free(context); + + return dstImage; + } +} //namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.h new file mode 100644 index 0000000000..cf191c7072 --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ASTCCompressor.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ + +#pragma once + +#include + +namespace ImageProcessingAtom +{ + class ASTCCompressor + : public ICompressor + { + public: + static bool IsCompressedPixelFormatSupported(EPixelFormat fmt); + static bool IsUncompressedPixelFormatSupported(EPixelFormat fmt); + static bool DoesSupportDecompress(EPixelFormat fmtDst); + + IImageObjectPtr CompressImage(IImageObjectPtr srcImage, EPixelFormat fmtDst, const CompressOption* compressOption) const override; + IImageObjectPtr DecompressImage(IImageObjectPtr srcImage, EPixelFormat fmtDst) const override; + + EPixelFormat GetSuggestedUncompressedFormat(EPixelFormat compressedfmt, EPixelFormat uncompressedfmt) const override; + ColorSpace GetSupportedColorSpace(EPixelFormat compressFormat) const final; + const char* GetName() const final; + }; +} // namespace ImageProcessingAtom diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.cpp index 9013bff1db..1dd18faaf3 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.cpp @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -15,11 +16,8 @@ namespace ImageProcessingAtom { - ICompressorPtr ICompressor::FindCompressor(EPixelFormat fmt, [[maybe_unused]] ColorSpace colorSpace, bool isCompressing) + ICompressorPtr ICompressor::FindCompressor(EPixelFormat fmt, ColorSpace colorSpace, bool isCompressing) { - // The ISPC texture compressor is able to compress BC1, BC3, BC6H and BC7 formats, and all of the ASTC formats. - // Note: The ISPC texture compressor is only able to compress images that are a multiple of the compressed format's blocksize. - // Another limitation is that the compressor requires LDR source images to be in sRGB colorspace. if (ISPCCompressor::IsCompressedPixelFormatSupported(fmt)) { if ((isCompressing && ISPCCompressor::IsSourceColorSpaceSupported(colorSpace, fmt)) || (!isCompressing && ISPCCompressor::DoesSupportDecompress(fmt))) @@ -35,6 +33,14 @@ namespace ImageProcessingAtom return ICompressorPtr(new CTSquisher()); } } + + if (ASTCCompressor::IsCompressedPixelFormatSupported(fmt)) + { + if (isCompressing || (!isCompressing && ASTCCompressor::DoesSupportDecompress(fmt))) + { + return ICompressorPtr(new ASTCCompressor()); + } + } // Both ETC2Compressor and PVRTCCompressor can process ETC formats // According to Mobile team, Etc2Com is faster than PVRTexLib, so we check with ETC2Compressor before PVRTCCompressor diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.h index dff71e59db..6920ae0cc1 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/Compressor.h @@ -38,8 +38,7 @@ namespace ImageProcessingAtom EQuality compressQuality = eQuality_Normal; //required for CTSquisher AZ::Vector3 rgbWeight = AZ::Vector3(0.3333f, 0.3334f, 0.3333f); - //required for ISPC texture compressor - bool ispcDiscardAlpha = false; + bool discardAlpha = false; }; public: diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ISPCTextureCompressor.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ISPCTextureCompressor.cpp index 5e96c7274d..b1b41d98bc 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ISPCTextureCompressor.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/ISPCTextureCompressor.cpp @@ -57,6 +57,12 @@ namespace ImageProcessingAtom bool ISPCCompressor::IsCompressedPixelFormatSupported(EPixelFormat fmt) { + // Even though the ISPC compressor support ASTC formats. But it has restrictions + // 1. Only supports LDR color profile + // 2. Only supports a subset of 2D block sizes + // Also it has overall lower quality compare to astc-encoder + // So we won't add ASTC as part of supported formats here + // Ref: https://solidpixel.github.io/2020/03/02/astc-compared.html switch (fmt) { case ePixelFormat_BC3: @@ -152,7 +158,7 @@ namespace ImageProcessingAtom if (compressOption) { quality = compressOption->compressQuality; - discardAlpha = compressOption->ispcDiscardAlpha; + discardAlpha = compressOption->discardAlpha; } // Get the compression profile @@ -230,24 +236,12 @@ namespace ImageProcessingAtom } break; default: - if (IsASTCFormat(destinationFormat)) - { - const PixelFormatInfo* info = CPixelFormats::GetInstance().GetPixelFormatInfo(destinationFormat); - astc_enc_settings settings = {}; - - const auto setProfile = compressionProfile->GetASTC(discardAlpha); - setProfile(&settings, info->blockWidth, info->blockHeight); - - // Compress with ASTC - CompressBlocksASTC(&sourceSurface, destinationImageData, &settings); - } - else - { - // No valid pixel format - AZ_Assert(false, "Unhandled pixel format %d", destinationFormat); - return nullptr; - } - break; + { + // No valid pixel format + AZ_Assert(false, "Unhandled pixel format %d", destinationFormat); + return nullptr; + } + break; } } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/PVRTC.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/PVRTC.cpp index 7c899e4ad2..f3a630e8c1 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/PVRTC.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Compressors/PVRTC.cpp @@ -19,7 +19,7 @@ namespace ImageProcessingAtom { - // Note: PVRTexLib supports ASTC formats, ETC formats, PVRTC formats and BC formats + // Note: PVRTexLib supports ETC formats, PVRTC formats and BC formats // We haven't tested the performace to compress BC formats compare to CTSquisher // For PVRTC formats, we only added PVRTC 1 support for now // The compression for ePVRTPF_EAC_R11 and ePVRTPF_EAC_RG11 are very slow. It takes 7 and 14 minutes for a 2048x2048 texture. @@ -27,34 +27,6 @@ namespace ImageProcessingAtom { switch (fmt) { - case ePixelFormat_ASTC_4x4: - return ePVRTPF_ASTC_4x4; - case ePixelFormat_ASTC_5x4: - return ePVRTPF_ASTC_5x4; - case ePixelFormat_ASTC_5x5: - return ePVRTPF_ASTC_5x5; - case ePixelFormat_ASTC_6x5: - return ePVRTPF_ASTC_6x5; - case ePixelFormat_ASTC_6x6: - return ePVRTPF_ASTC_6x6; - case ePixelFormat_ASTC_8x5: - return ePVRTPF_ASTC_8x5; - case ePixelFormat_ASTC_8x6: - return ePVRTPF_ASTC_8x6; - case ePixelFormat_ASTC_8x8: - return ePVRTPF_ASTC_8x8; - case ePixelFormat_ASTC_10x5: - return ePVRTPF_ASTC_10x5; - case ePixelFormat_ASTC_10x6: - return ePVRTPF_ASTC_10x6; - case ePixelFormat_ASTC_10x8: - return ePVRTPF_ASTC_10x8; - case ePixelFormat_ASTC_10x10: - return ePVRTPF_ASTC_10x10; - case ePixelFormat_ASTC_12x10: - return ePVRTPF_ASTC_12x10; - case ePixelFormat_ASTC_12x12: - return ePVRTPF_ASTC_12x12; case ePixelFormat_PVRTC2: return ePVRTPF_PVRTCI_2bpp_RGBA; case ePixelFormat_PVRTC4: @@ -156,26 +128,7 @@ namespace ImageProcessingAtom internalQuality = pvrtexture::eETCSlow; } } - else if (IsASTCFormat(fmtDst)) - { - if (quality == eQuality_Preview) - { - internalQuality = pvrtexture::eASTCVeryFast; - } - else if (quality == eQuality_Fast) - { - internalQuality = pvrtexture::eASTCFast; - } - else if (quality == eQuality_Normal) - { - internalQuality = pvrtexture::eASTCMedium; - } - else - { - internalQuality = pvrtexture::eASTCThorough; - } - } - else + else { if (quality == eQuality_Preview) { @@ -252,7 +205,7 @@ namespace ImageProcessingAtom if (!isSuccess) { - AZ_Error("Image Processing", false, "Failed to compress image with PVRTexLib. You may not have astcenc.exe for compressing ASTC formates"); + AZ_Error("Image Processing", false, "Failed to compress image with PVRTexLib."); return nullptr; } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp index 9b41645280..5995146c59 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.cpp @@ -117,6 +117,11 @@ namespace ImageProcessingAtom } } + const ImageConvertProcessDescriptor* ImageConvertProcess::GetInputDesc() const + { + return m_input.get(); + } + ImageConvertProcess::ImageConvertProcess(AZStd::unique_ptr&& descriptor) : m_image(nullptr) , m_progressStep(0) @@ -554,12 +559,6 @@ namespace ImageProcessingAtom // pixel format conversion bool ImageConvertProcess::ConvertPixelformat() { - //For ASTC compression we need to clear out the alpha to get accurate rgb compression. - if(m_alphaImage && IsASTCFormat(m_input->m_presetSetting.m_pixelFormat)) - { - m_image->Get()->Swizzle("rgb1"); - } - //set up compress option ICompressor::EQuality quality; if (m_input->m_isPreview) @@ -574,7 +573,14 @@ namespace ImageProcessingAtom // set the compression options m_image->GetCompressOption().compressQuality = quality; m_image->GetCompressOption().rgbWeight = m_input->m_presetSetting.GetColorWeight(); - m_image->GetCompressOption().ispcDiscardAlpha = m_input->m_presetSetting.m_discardAlpha; + m_image->GetCompressOption().discardAlpha = m_input->m_presetSetting.m_discardAlpha; + + //For ASTC compression we need to clear out the alpha to get accurate rgb compression. + if(m_alphaImage && IsASTCFormat(m_input->m_presetSetting.m_pixelFormat)) + { + m_image->GetCompressOption().discardAlpha = true; + } + m_image->ConvertFormat(m_input->m_presetSetting.m_pixelFormat); return true; diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.h b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.h index 190e68ca31..6ab866ee09 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.h +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Processing/ImageConvert.h @@ -122,6 +122,8 @@ namespace ImageProcessingAtom // Get output JobProducts and append them to the outProducts vector. void GetAppendOutputProducts(AZStd::vector& outProducts); + const ImageConvertProcessDescriptor* GetInputDesc() const; + private: //input image and settings AZStd::shared_ptr m_input; diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp index 0656fb4e46..c4240306c4 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/ImageProcessing_Test.cpp @@ -12,8 +12,12 @@ #include +#include + #include #include +#include +#include #include #include #include @@ -123,6 +127,9 @@ namespace UnitTest AZStd::string m_outputRootFolder; AZStd::string m_outputFolder; + AZStd::unique_ptr m_jobManager; + AZStd::unique_ptr m_jobContext; + void SetUp() override { AllocatorsBase::SetupAllocator(); @@ -159,6 +166,27 @@ namespace UnitTest m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get()); BuilderPluginComponent::Reflect(m_jsonRegistrationContext.get()); + // Setup job context for job system + JobManagerDesc jobManagerDesc; + JobManagerThreadDesc threadDesc; +#if AZ_TRAIT_SET_JOB_PROCESSOR_ID + threadDesc.m_cpuId = 0; // Don't set processors IDs on windows +#endif + + uint32_t numWorkerThreads = AZStd::thread::hardware_concurrency(); + + for (unsigned int i = 0; i < numWorkerThreads; ++i) + { + jobManagerDesc.m_workerThreads.push_back(threadDesc); +#if AZ_TRAIT_SET_JOB_PROCESSOR_ID + threadDesc.m_cpuId++; +#endif + } + + m_jobManager = AZStd::make_unique(jobManagerDesc); + m_jobContext = AZStd::make_unique(*m_jobManager); + JobContext::SetGlobalContext(m_jobContext.get()); + // Startup default local FileIO (hits OSAllocator) if not already setup. if (AZ::IO::FileIOBase::GetInstance() == nullptr) { @@ -192,6 +220,10 @@ namespace UnitTest delete AZ::IO::FileIOBase::GetInstance(); AZ::IO::FileIOBase::SetInstance(nullptr); + JobContext::SetGlobalContext(nullptr); + m_jobContext = nullptr; + m_jobManager = nullptr; + m_jsonRegistrationContext->EnableRemoveReflection(); m_jsonSystemComponent->Reflect(m_jsonRegistrationContext.get()); BuilderPluginComponent::Reflect(m_jsonRegistrationContext.get()); @@ -223,7 +255,7 @@ namespace UnitTest Image_512X288_RGB8_Tga, Image_1024X1024_RGB8_Tif, Image_UpperCase_Tga, - Image_512x512_Normal_Tga, // QImage doesn't support loading this file. + Image_1024x1024_normal_tiff, Image_128x128_Transparent_Tga, Image_237x177_RGB_Jpg, Image_GreyScale_Png, @@ -251,7 +283,7 @@ namespace UnitTest m_imagFileNameMap[Image_512X288_RGB8_Tga] = m_testFileFolder + "512x288_24bit.tga"; m_imagFileNameMap[Image_1024X1024_RGB8_Tif] = m_testFileFolder + "1024x1024_24bit.tif"; m_imagFileNameMap[Image_UpperCase_Tga] = m_testFileFolder + "uppercase.TGA"; - m_imagFileNameMap[Image_512x512_Normal_Tga] = m_testFileFolder + "512x512_RGB_N.tga"; + m_imagFileNameMap[Image_1024x1024_normal_tiff] = m_testFileFolder + "1024x1024_normal.tiff"; m_imagFileNameMap[Image_128x128_Transparent_Tga] = m_testFileFolder + "128x128_RGBA8.tga"; m_imagFileNameMap[Image_237x177_RGB_Jpg] = m_testFileFolder + "237x177_RGB.jpg"; m_imagFileNameMap[Image_GreyScale_Png] = m_testFileFolder + "greyscale.png"; @@ -801,8 +833,7 @@ namespace UnitTest auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); if (formatInfo->bCompressed) { - // exclude astc formats until we add astc compressor to all platforms - // exclude pvrtc formats (deprecating) + // skip ASTC formats which are tested in TestConvertASTCCompressor if (!IsASTCFormat(pixelFormat) && pixelFormat != ePixelFormat_PVRTC2 && pixelFormat != ePixelFormat_PVRTC4 && !IsETCFormat(pixelFormat)) // skip ETC since it's very slow @@ -830,32 +861,121 @@ namespace UnitTest continue; } - [[maybe_unused]] auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); - imageToProcess.Set(srcImage); - imageToProcess.ConvertFormat(pixelFormat); + auto formatInfo = CPixelFormats::GetInstance().GetPixelFormatInfo(pixelFormat); + ColorSpace sourceColorSpace = srcImage->HasImageFlags(EIF_SRGBRead) ? ColorSpace::sRGB : ColorSpace::linear; + ICompressorPtr compressor = ICompressor::FindCompressor(pixelFormat, sourceColorSpace, true); - if (!imageToProcess.Get()) + if (!compressor) { AZ_Warning("test", false, "unsupported format: %s", formatInfo->szName); continue; } + + imageToProcess.Set(srcImage); + imageToProcess.ConvertFormat(pixelFormat); + ASSERT_TRUE(imageToProcess.Get()); ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == pixelFormat); - // Get compressor name - ColorSpace sourceColorSpace = srcImage->HasImageFlags(EIF_SRGBRead) ? ColorSpace::sRGB : ColorSpace::linear; - ICompressorPtr compressor = ICompressor::FindCompressor(pixelFormat, sourceColorSpace, true); + //convert back to an uncompressed format and expect it will be successful + imageToProcess.ConvertFormat(srcImage->GetPixelFormat()); + ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == srcImage->GetPixelFormat()); - //save the image to a file so we can check the visual result + // Save the image to a file so we can check the visual result AZStd::string outputName = AZStd::string::format("%s_%s", imageName.c_str(), compressor->GetName()); SaveImageToFile(imageToProcess.Get(), outputName, 1); - - //convert back to an uncompressed format and expect it will be successful - imageToProcess.ConvertFormat(ePixelFormat_R8G8B8A8); - ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == ePixelFormat_R8G8B8A8); } } } + + TEST_F(ImageProcessingTest, Test_ConvertAllAstc_Success) + { + // Compress/Decompress to all astc formats (LDR) + auto imageIdx = Image_237x177_RGB_Jpg; + IImageObjectPtr srcImage = IImageObjectPtr(LoadImageFromFile(m_imagFileNameMap[imageIdx])); + QFileInfo fi(m_imagFileNameMap[imageIdx].c_str()); + AZStd::string imageName = fi.baseName().toUtf8().constData(); + for (uint32 i = 0; i < ePixelFormat_Count; i++) + { + EPixelFormat pixelFormat = (EPixelFormat)i; + if (IsASTCFormat(pixelFormat)) + { + ImageToProcess imageToProcess(srcImage); + imageToProcess.ConvertFormat(pixelFormat); + + ASSERT_TRUE(imageToProcess.Get()); + ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == pixelFormat); + ASSERT_TRUE(imageToProcess.Get()->GetWidth(0) == srcImage->GetWidth(0)); + ASSERT_TRUE(imageToProcess.Get()->GetHeight(0) == srcImage->GetHeight(0)); + + // convert back to an uncompressed format and expect it will be successful + imageToProcess.ConvertFormat(srcImage->GetPixelFormat()); + ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == srcImage->GetPixelFormat()); + + // save the image to a file so we can check the visual result + AZStd::string outputName = AZStd::string::format("ASTC_%s", imageName.c_str()); + SaveImageToFile(imageToProcess.Get(), outputName, 1); + } + } + } + + TEST_F(ImageProcessingTest, Test_ConvertHdrToAstc_Success) + { + // Compress/Decompress HDR + auto imageIdx = Image_defaultprobe_cm_1536x256_64bits_tif; + IImageObjectPtr srcImage = IImageObjectPtr(LoadImageFromFile(m_imagFileNameMap[imageIdx])); + + EPixelFormat dstFormat = ePixelFormat_ASTC_4x4; + ImageToProcess imageToProcess(srcImage); + imageToProcess.ConvertFormat(ePixelFormat_ASTC_4x4); + + ASSERT_TRUE(imageToProcess.Get()); + ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == dstFormat); + ASSERT_TRUE(imageToProcess.Get()->GetWidth(0) == srcImage->GetWidth(0)); + ASSERT_TRUE(imageToProcess.Get()->GetHeight(0) == srcImage->GetHeight(0)); + + //convert back to an uncompressed format and expect it will be successful + imageToProcess.ConvertFormat(srcImage->GetPixelFormat()); + ASSERT_TRUE(imageToProcess.Get()->GetPixelFormat() == srcImage->GetPixelFormat()); + + //save the image to a file so we can check the visual result + SaveImageToFile(imageToProcess.Get(), "ASTC_HDR", 1); + } + + TEST_F(ImageProcessingTest, Test_AstcNormalPreset_Success) + { + // Normal.preset which uses ASTC as output format + // This test compress a normal texture and its mipmaps + + auto outcome = BuilderSettingManager::Instance()->LoadConfigFromFolder(m_defaultSettingFolder); + ASSERT_TRUE(outcome.IsSuccess()); + + AZStd::string inputFile; + AZStd::vector outProducts; + + inputFile = m_imagFileNameMap[Image_1024x1024_normal_tiff]; + IImageObjectPtr srcImage = IImageObjectPtr(LoadImageFromFile(inputFile)); + + ImageConvertProcess* process = CreateImageConvertProcess(inputFile, m_outputFolder, "ios", outProducts, m_context.get()); + + const PresetSettings* preset = &process->GetInputDesc()->m_presetSetting; + + if (process != nullptr) + { + process->ProcessAll(); + + //get process result + ASSERT_TRUE(process->IsSucceed()); + auto outputImage = process->GetOutputImage(); + ASSERT_TRUE(outputImage->GetPixelFormat() == preset->m_pixelFormat); + ASSERT_TRUE(outputImage->GetWidth(0) == srcImage->GetWidth(0)); + ASSERT_TRUE(outputImage->GetHeight(0) == srcImage->GetHeight(0)); + + SaveImageToFile(outputImage, "ASTC_Normal", 10); + + delete process; + } + } TEST_F(ImageProcessingTest, DISABLED_TestImageFilter) { diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_normal.tiff b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_normal.tiff new file mode 100644 index 0000000000..8120514ddc --- /dev/null +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/1024x1024_normal.tiff @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:120aaf43057b07fb3c784264eb48b899cc612f30917d316fe843bb839220dc22 +size 203062 diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/512x512_RGB_N.tga b/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/512x512_RGB_N.tga deleted file mode 100644 index d47f00912a..0000000000 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Tests/TestAssets/512x512_RGB_N.tga +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:646a9a9035cc3f4dfd57babc0055710d2f5bb8aee0a792f2b65d69b4fd6a94b3 -size 786450 diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake b/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake index 55ccdf1d89..ba9e9f29b7 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/imageprocessing_files.cmake @@ -114,6 +114,8 @@ set(FILES ../External/CubeMapGen/CImageSurface.cpp ../External/CubeMapGen/CImageSurface.h ../External/CubeMapGen/VectorMacros.h + Source/Compressors/ASTCCompressor.cpp + Source/Compressors/ASTCCompressor.h Source/Compressors/Compressor.h Source/Compressors/Compressor.cpp Source/Compressors/CTSquisher.h diff --git a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake index 429665f04a..816ef6db30 100644 --- a/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake +++ b/cmake/3rdParty/Platform/Linux/BuiltInPackages_linux.cmake @@ -9,7 +9,6 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME ilmbase-2.3.0-rev4-multiplatform TARGETS ilmbase PACKAGE_HASH 97547fdf1fbc4d81b8ccf382261f8c25514ed3b3c4f8fd493f0a4fa873bba348) ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev11-multiplatform TARGETS assimplib PACKAGE_HASH 1a9113788b893ef4a2ee63ac01eb71b981a92894a5a51175703fa225f5804dec) -ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) @@ -44,5 +43,6 @@ ly_associate_package(PACKAGE_NAME SPIRVCross-2021.04.29-rev1-linux ly_associate_package(PACKAGE_NAME azslc-1.7.23-rev2-linux TARGETS azslc PACKAGE_HASH 1ba84d8321a566d35a1e9aa7400211ba8e6d1c11c08e4be3c93e6e74b8f7aef1) ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-linux TARGETS zlib PACKAGE_HASH 16f3b9e11cda525efb62144f354c1cfc30a5def9eff020dbe49cb00ee7d8234f) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-linux TARGETS squish-ccr PACKAGE_HASH 85fecafbddc6a41a27c5f59ed4a5dfb123a94cb4666782cf26e63c0a4724c530) +ly_associate_package(PACKAGE_NAME astc-encoder-3.2-rev1-linux TARGETS astc-encoder PACKAGE_HASH 2ba97a06474d609945f0ab4419af1f6bbffdd294ca6b869f5fcebec75c573c0f) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-linux TARGETS ISPCTexComp PACKAGE_HASH 065fd12abe4247dde247330313763cf816c3375c221da030bdec35024947f259) ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-linux TARGETS lz4 PACKAGE_HASH 5de3dbd3e2a3537c6555d759b3c5bb98e5456cf85c74ff6d046f809b7087290d) diff --git a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake index 4900a9d77e..58cafdd4b8 100644 --- a/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake +++ b/cmake/3rdParty/Platform/Mac/BuiltInPackages_mac.cmake @@ -9,7 +9,6 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME ilmbase-2.3.0-rev4-multiplatform TARGETS ilmbase PACKAGE_HASH 97547fdf1fbc4d81b8ccf382261f8c25514ed3b3c4f8fd493f0a4fa873bba348) ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev11-multiplatform TARGETS assimplib PACKAGE_HASH 1a9113788b893ef4a2ee63ac01eb71b981a92894a5a51175703fa225f5804dec) -ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) @@ -42,6 +41,7 @@ ly_associate_package(PACKAGE_NAME qt-5.15.2-rev5-mac ly_associate_package(PACKAGE_NAME libsamplerate-0.2.1-rev2-mac TARGETS libsamplerate PACKAGE_HASH b912af40c0ac197af9c43d85004395ba92a6a859a24b7eacd920fed5854a97fe) ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-mac TARGETS zlib PACKAGE_HASH 21714e8a6de4f2523ee92a7f52d51fbee29c5f37ced334e00dc3c029115b472e) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-mac TARGETS squish-ccr PACKAGE_HASH 155bfbfa17c19a9cd2ef025de14c5db598f4290045d5b0d83ab58cb345089a77) +ly_associate_package(PACKAGE_NAME astc-encoder-3.2-rev1-mac TARGETS astc-encoder PACKAGE_HASH 96f6ea8c3e45ec7fe525230c7c53ca665c8300d8e28456cc19bb3159ce6f8dcc) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-mac TARGETS ISPCTexComp PACKAGE_HASH 8a4e93277b8face6ea2fd57c6d017bdb55643ed3d6387110bc5f6b3b884dd169) ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-mac TARGETS lz4 PACKAGE_HASH 891ff630bf34f7ab1d8eaee2ea0a8f1fca89dbdc63fca41ee592703dd488a73b) diff --git a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake index 3855b7d712..d02fefc0e9 100644 --- a/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake +++ b/cmake/3rdParty/Platform/Windows/BuiltInPackages_windows.cmake @@ -9,7 +9,6 @@ # shared by other platforms: ly_associate_package(PACKAGE_NAME ilmbase-2.3.0-rev4-multiplatform TARGETS ilmbase PACKAGE_HASH 97547fdf1fbc4d81b8ccf382261f8c25514ed3b3c4f8fd493f0a4fa873bba348) ly_associate_package(PACKAGE_NAME assimp-5.0.1-rev11-multiplatform TARGETS assimplib PACKAGE_HASH 1a9113788b893ef4a2ee63ac01eb71b981a92894a5a51175703fa225f5804dec) -ly_associate_package(PACKAGE_NAME ASTCEncoder-2017_11_14-rev2-multiplatform TARGETS ASTCEncoder PACKAGE_HASH c240ffc12083ee39a5ce9dc241de44d116e513e1e3e4cc1d05305e7aa3bdc326) ly_associate_package(PACKAGE_NAME md5-2.0-multiplatform TARGETS md5 PACKAGE_HASH 29e52ad22c78051551f78a40c2709594f0378762ae03b417adca3f4b700affdf) ly_associate_package(PACKAGE_NAME RapidJSON-1.1.0-rev1-multiplatform TARGETS RapidJSON PACKAGE_HASH 2f5e26ecf86c3b7a262753e7da69ac59928e78e9534361f3d00c1ad5879e4023) ly_associate_package(PACKAGE_NAME RapidXML-1.13-rev1-multiplatform TARGETS RapidXML PACKAGE_HASH 4b7b5651e47cfd019b6b295cc17bb147b65e53073eaab4a0c0d20a37ab74a246) @@ -49,5 +48,6 @@ ly_associate_package(PACKAGE_NAME OpenSSL-1.1.1b-rev2-windows ly_associate_package(PACKAGE_NAME Crashpad-0.8.0-rev1-windows TARGETS Crashpad PACKAGE_HASH d162aa3070147bc0130a44caab02c5fe58606910252caf7f90472bd48d4e31e2) ly_associate_package(PACKAGE_NAME zlib-1.2.11-rev2-windows TARGETS zlib PACKAGE_HASH 9afab1d67641ed8bef2fb38fc53942da47f2ab339d9e77d3d20704a48af2da0b) ly_associate_package(PACKAGE_NAME squish-ccr-deb557d-rev1-windows TARGETS squish-ccr PACKAGE_HASH 5c3d9fa491e488ccaf802304ad23b932268a2b2846e383f088779962af2bfa84) +ly_associate_package(PACKAGE_NAME astc-encoder-3.2-rev1-windows TARGETS astc-encoder PACKAGE_HASH 3addc6fc1a7eb0d6b7f3d530e962af967e6d92b3825ef485da243346357cf78e) ly_associate_package(PACKAGE_NAME ISPCTexComp-36b80aa-rev1-windows TARGETS ISPCTexComp PACKAGE_HASH b6fa6ea28a2808a9a5524c72c37789c525925e435770f2d94eb2d387360fa2d0) ly_associate_package(PACKAGE_NAME lz4-1.9.3-vcpkg-rev4-windows TARGETS lz4 PACKAGE_HASH 4ea457b833cd8cfaf8e8e06ed6df601d3e6783b606bdbc44a677f77e19e0db16) From dc050d4acd45f4764364e098c34547fb70867e56 Mon Sep 17 00:00:00 2001 From: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> Date: Fri, 17 Sep 2021 12:59:25 -0500 Subject: [PATCH 355/355] Terrain System bugfixes (#4180) * Remove the "TEST_SUPPORTED" traits. Terrain unit tests should be usable on all platforms, so they shouldn't need a platform-specific trait to enable/disable. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fix a few misc terrain bugs. * Change Activate/Deactivate to happen immediately instead of deferring. There were too many order-of-operation bugs caused by trying to defer this. * Added implementation for calculating normals. * Fixed bug where GetHeightSynchronous wasn't stopping at the highest-priority layer. * Added locks for SurfaceData bus to help ensure we lock our mutexes in the correct order and avoid deadlocks. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Add trivial TerrainSystem tests. Tests construction, Activate(), Deactivate(), and destruction. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Unified Terrain system calls on single bus. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Added mock for TerrainDataNotificationBus listener. Also added unit tests to verify the listener, and added in missing notification events. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Removed extra Sampler class. Fixed up APIs to correctly pass Sampler and terrainExistsPtr around. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Switched MockTerrainSystem to be proper gmock. This makes it for flexible to use and easier to reuse from other test environments. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fix settings bug caused by bad order of operations that occurred when the methods moved to a different bus. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Eliminate extra EBus by simplifying area initialization. Previously, there was a back-and-forth ebus signal used for the terrain system to find any terrain spawners that were created prior to the terrain system activation. Now it uses the more simple technique of just grabbing all the spawners that are currently hooked up to the spawner ebus. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Switch to NiceMock so that "uninteresting" mock calls get ignored. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Addressed PR feedback. Filled in terrainExistsPtr at the end, and added it to GetNormal as well. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fixed shader height calculation. It was off by half a pixel, and it was interpolating, both of which were wrong. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Create initial LmbrCentral mocks that other Gems can use. To help improve mock maintenance over time, this creates mocks in the same Gem as the systems being mocked, instead of the other Gems that need to use mocked systems during testing. This way, the mocks should more easily stay in sync with the interface that they mock out. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Null-guard any uses of Atom to make the class easier to unit test. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Add more mocked terrain services Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Moved Terrain mocks to publicly-available Mocks directory. Also added more unit tests. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Change debug code to use EXACT instead of BILINEAR height sampling, because it's specifically using the terrain grid. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Added support for the sampler filters. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Fix bad merge. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Add unit test to verify terrain layers define terrain regions. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Moved the AABB component mock into a private terrain header, since it's a specialized mock just for the terrain tests. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Moved sampler and normal calculations into TerrainSystem so that they can work across multiple adjacent areas. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Missed a couple of unit test changes. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Removed normal query as well, that needs a seprate unit test. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Removed unused variable that was only caught in Linux/Android builds. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Addressed PR feedback Made the parameter names consistently listed in MockShapes.h. Added comments to TerrainHeightGradientListComponent explaining why terrainExists is always true when a gradient exists. Also fixed a bug where terrainExists should technically be *false* if no gradient exists. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> * Added more descriptive comments and names for ClampPosition. Signed-off-by: Mike Balfour <82224783+mbalfour-amzn@users.noreply.github.com> --- Gems/LmbrCentral/Code/CMakeLists.txt | 11 ++ .../Code/Mocks/LmbrCentral/Shape/MockShapes.h | 60 ++++++ .../Code/Tests/LmbrCentralTest.cpp | 3 + .../Code/lmbrcentral_mocks_files.cmake | 11 ++ Gems/Terrain/Code/CMakeLists.txt | 13 ++ .../Terrain/MockTerrain.h} | 86 ++++----- .../TerrainHeightGradientListComponent.cpp | 51 ++---- .../TerrainHeightGradientListComponent.h | 13 +- .../TerrainWorldDebuggerComponent.cpp | 6 +- .../Source/TerrainSystem/TerrainSystem.cpp | 172 ++++++++++++------ .../Code/Source/TerrainSystem/TerrainSystem.h | 5 +- .../Source/TerrainSystem/TerrainSystemBus.h | 21 +-- Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp | 11 +- .../Tests/MockAxisAlignedBoxShapeComponent.h | 45 +++++ Gems/Terrain/Code/Tests/TerrainSystemTest.cpp | 162 +++++++++++++++-- Gems/Terrain/Code/terrain_mocks_files.cmake | 11 ++ Gems/Terrain/Code/terrain_tests_files.cmake | 2 +- 17 files changed, 482 insertions(+), 201 deletions(-) create mode 100644 Gems/LmbrCentral/Code/Mocks/LmbrCentral/Shape/MockShapes.h create mode 100644 Gems/LmbrCentral/Code/lmbrcentral_mocks_files.cmake rename Gems/Terrain/Code/{Tests/TerrainMocks.h => Mocks/Terrain/MockTerrain.h} (57%) create mode 100644 Gems/Terrain/Code/Tests/MockAxisAlignedBoxShapeComponent.h create mode 100644 Gems/Terrain/Code/terrain_mocks_files.cmake diff --git a/Gems/LmbrCentral/Code/CMakeLists.txt b/Gems/LmbrCentral/Code/CMakeLists.txt index 00176ae2c2..b047a9f65e 100644 --- a/Gems/LmbrCentral/Code/CMakeLists.txt +++ b/Gems/LmbrCentral/Code/CMakeLists.txt @@ -114,6 +114,16 @@ endif() # Tests ################################################################################ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) + ly_add_target( + NAME LmbrCentral.Mocks HEADERONLY + NAMESPACE Gem + FILES_CMAKE + lmbrcentral_mocks_files.cmake + INCLUDE_DIRECTORIES + INTERFACE + Mocks + ) + ly_add_target( NAME LmbrCentral.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} NAMESPACE Gem @@ -131,6 +141,7 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) Legacy::CryCommon AZ::AzFramework Gem::LmbrCentral.Static + Gem::LmbrCentral.Mocks ) ly_add_googletest( NAME Gem::LmbrCentral.Tests diff --git a/Gems/LmbrCentral/Code/Mocks/LmbrCentral/Shape/MockShapes.h b/Gems/LmbrCentral/Code/Mocks/LmbrCentral/Shape/MockShapes.h new file mode 100644 index 0000000000..20be74dd90 --- /dev/null +++ b/Gems/LmbrCentral/Code/Mocks/LmbrCentral/Shape/MockShapes.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include + +#include +#include +#include + +namespace UnitTest +{ + class MockBoxShapeComponentRequests + : public LmbrCentral::BoxShapeComponentRequestsBus::Handler + { + public: + MockBoxShapeComponentRequests(AZ::EntityId entityId) + { + LmbrCentral::BoxShapeComponentRequestsBus::Handler::BusConnect(entityId); + } + + ~MockBoxShapeComponentRequests() + { + LmbrCentral::BoxShapeComponentRequestsBus::Handler::BusDisconnect(); + } + + MOCK_METHOD0(GetBoxConfiguration, LmbrCentral::BoxShapeConfig()); + MOCK_METHOD0(GetBoxDimensions, AZ::Vector3()); + MOCK_METHOD1(SetBoxDimensions, void(const AZ::Vector3& newDimensions)); + }; + + class MockShapeComponentRequests + : public LmbrCentral::ShapeComponentRequestsBus::Handler + { + public: + MockShapeComponentRequests(AZ::EntityId entityId) + { + LmbrCentral::ShapeComponentRequestsBus::Handler::BusConnect(entityId); + } + + ~MockShapeComponentRequests() + { + LmbrCentral::ShapeComponentRequestsBus::Handler::BusDisconnect(); + } + + MOCK_METHOD0(GetShapeType, AZ::Crc32()); + MOCK_METHOD0(GetEncompassingAabb, AZ::Aabb()); + MOCK_METHOD2(GetTransformAndLocalBounds, void(AZ::Transform& transform, AZ::Aabb& bounds)); + MOCK_METHOD1(IsPointInside, bool(const AZ::Vector3& point)); + MOCK_METHOD1(DistanceSquaredFromPoint, float(const AZ::Vector3& point)); + MOCK_METHOD1(GenerateRandomPointInside, AZ::Vector3(AZ::RandomDistributionType randomDistribution)); + MOCK_METHOD3(IntersectRay, bool(const AZ::Vector3& src, const AZ::Vector3& dir, float& distance)); + }; +} + diff --git a/Gems/LmbrCentral/Code/Tests/LmbrCentralTest.cpp b/Gems/LmbrCentral/Code/Tests/LmbrCentralTest.cpp index 40217ff9bc..f36978f22d 100644 --- a/Gems/LmbrCentral/Code/Tests/LmbrCentralTest.cpp +++ b/Gems/LmbrCentral/Code/Tests/LmbrCentralTest.cpp @@ -8,4 +8,7 @@ #include +// Include any public mocks here to ensure they get compiled as a part of the test project. +#include + AZ_UNIT_TEST_HOOK(DEFAULT_UNIT_TEST_ENV); diff --git a/Gems/LmbrCentral/Code/lmbrcentral_mocks_files.cmake b/Gems/LmbrCentral/Code/lmbrcentral_mocks_files.cmake new file mode 100644 index 0000000000..c3a5cca3f8 --- /dev/null +++ b/Gems/LmbrCentral/Code/lmbrcentral_mocks_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + Mocks/LmbrCentral/Shape/MockShapes.h +) diff --git a/Gems/Terrain/Code/CMakeLists.txt b/Gems/Terrain/Code/CMakeLists.txt index 0feacdaf71..fc07294dab 100644 --- a/Gems/Terrain/Code/CMakeLists.txt +++ b/Gems/Terrain/Code/CMakeLists.txt @@ -83,6 +83,15 @@ endif() ################################################################################ # See if globally, tests are supported if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) + ly_add_target( + NAME Terrain.Mocks HEADERONLY + NAMESPACE Gem + FILES_CMAKE + terrain_mocks_files.cmake + INCLUDE_DIRECTORIES + INTERFACE + Mocks + ) ly_add_target( NAME Terrain.Tests ${PAL_TRAIT_TEST_TARGET_TYPE} NAMESPACE Gem @@ -97,6 +106,8 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) PRIVATE AZ::AzTest AZ::AzFramework + Gem::LmbrCentral.Mocks + Gem::Terrain.Mocks Gem::Terrain.Static ) @@ -120,6 +131,8 @@ if(PAL_TRAIT_BUILD_TESTS_SUPPORTED) BUILD_DEPENDENCIES PRIVATE AZ::AzTest + Gem::LmbrCentral.Mocks + Gem::Terrain.Mocks Gem::Terrain.Editor ) diff --git a/Gems/Terrain/Code/Tests/TerrainMocks.h b/Gems/Terrain/Code/Mocks/Terrain/MockTerrain.h similarity index 57% rename from Gems/Terrain/Code/Tests/TerrainMocks.h rename to Gems/Terrain/Code/Mocks/Terrain/MockTerrain.h index 03a2eccf1d..ea0413be9a 100644 --- a/Gems/Terrain/Code/Tests/TerrainMocks.h +++ b/Gems/Terrain/Code/Mocks/Terrain/MockTerrain.h @@ -11,59 +11,9 @@ #include #include -#include namespace UnitTest { - static const AZ::Uuid BoxShapeComponentTypeId = "{5EDF4B9E-0D3D-40B8-8C91-5142BCFC30A6}"; - - class MockBoxShapeComponent - : public AZ::Component - { - public: - AZ_COMPONENT(MockBoxShapeComponent, BoxShapeComponentTypeId) - static void Reflect([[maybe_unused]] AZ::ReflectContext* context) - { - } - - void Activate() override - { - } - - void Deactivate() override - { - } - - bool ReadInConfig([[maybe_unused]] const AZ::ComponentConfig* baseConfig) override - { - return true; - } - - bool WriteOutConfig([[maybe_unused]] AZ::ComponentConfig* outBaseConfig) const override - { - return true; - } - - private: - static void GetProvidedServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& provided) - { - provided.push_back(AZ_CRC("ShapeService", 0xe86aa5fe)); - provided.push_back(AZ_CRC("BoxShapeService", 0x946a0032)); - provided.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); - } - - static void GetIncompatibleServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& incompatible) - { - } - - static void GetRequiredServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& required) - { - } - - static void GetDependentServices([[maybe_unused]] AZ::ComponentDescriptor::DependencyArrayType& dependent) - { - } - }; class MockTerrainSystemService : private Terrain::TerrainSystemServiceRequestBus::Handler { @@ -106,4 +56,40 @@ namespace UnitTest MOCK_METHOD2(OnTerrainDataChanged, void(const AZ::Aabb& dirtyRegion, TerrainDataChangedMask dataChangedMask)); }; + class MockTerrainAreaHeightRequests : public Terrain::TerrainAreaHeightRequestBus::Handler + { + public: + MockTerrainAreaHeightRequests(AZ::EntityId entityId) + { + Terrain::TerrainAreaHeightRequestBus::Handler::BusConnect(entityId); + } + + ~MockTerrainAreaHeightRequests() + { + Terrain::TerrainAreaHeightRequestBus::Handler::BusDisconnect(); + } + + MOCK_METHOD3(GetHeight, void( + const AZ::Vector3& inPosition, + AZ::Vector3& outPosition, + bool& terrainExists)); + + }; + + class MockTerrainSpawnerRequests : public Terrain::TerrainSpawnerRequestBus::Handler + { + public: + MockTerrainSpawnerRequests(AZ::EntityId entityId) + { + Terrain::TerrainSpawnerRequestBus::Handler::BusConnect(entityId); + } + + ~MockTerrainSpawnerRequests() + { + Terrain::TerrainSpawnerRequestBus::Handler::BusDisconnect(); + } + + MOCK_METHOD2(GetPriority, void(AZ::u32& outLayer, AZ::u32& outPriority)); + MOCK_METHOD0(GetUseGroundPlane, bool()); + }; } diff --git a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp index 4d0cb6576d..4ea16018d1 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.cpp @@ -142,11 +142,15 @@ namespace Terrain return false; } - float TerrainHeightGradientListComponent::GetHeight(float x, float y) + void TerrainHeightGradientListComponent::GetHeight( + const AZ::Vector3& inPosition, + AZ::Vector3& outPosition, + bool& terrainExists) { float maxSample = 0.0f; + terrainExists = false; - GradientSignal::GradientSampleParams params(AZ::Vector3(x, y, 0.0f)); + GradientSignal::GradientSampleParams params(AZ::Vector3(inPosition.GetX(), inPosition.GetY(), 0.0f)); // Right now, when the list contains multiple entries, we will use the highest point from each gradient. // This is needed in part because gradients don't really have world bounds, so they exist everywhere but generally have a value @@ -155,49 +159,20 @@ namespace Terrain // make this list a prioritized list from top to bottom for any points that overlap. for (auto& gradientId : m_configuration.m_gradientEntities) { + // If gradients ever provide bounds, or if we add a value threshold in this component, it would be possible for terrain + // to *not* exist at a specific point. + terrainExists = true; + float sample = 0.0f; - GradientSignal::GradientRequestBus::EventResult(sample, gradientId, &GradientSignal::GradientRequestBus::Events::GetValue, params); + GradientSignal::GradientRequestBus::EventResult( + sample, gradientId, &GradientSignal::GradientRequestBus::Events::GetValue, params); maxSample = AZ::GetMax(maxSample, sample); } const float height = AZ::Lerp(m_cachedShapeBounds.GetMin().GetZ(), m_cachedShapeBounds.GetMax().GetZ(), maxSample); - - return AZ::GetClamp(height, m_cachedMinWorldHeight, m_cachedMaxWorldHeight); + outPosition.SetZ(AZ::GetClamp(height, m_cachedMinWorldHeight, m_cachedMaxWorldHeight)); } - void TerrainHeightGradientListComponent::GetHeight( - const AZ::Vector3& inPosition, - AZ::Vector3& outPosition, - [[maybe_unused]] AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) - { - const float height = GetHeight(inPosition.GetX(), inPosition.GetY()); - outPosition.SetZ(height); - } - - void TerrainHeightGradientListComponent::GetNormal( - const AZ::Vector3& inPosition, - AZ::Vector3& outNormal, - [[maybe_unused]] AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) - { - const float x = inPosition.GetX(); - const float y = inPosition.GetY(); - - if ((x >= m_cachedShapeBounds.GetMin().GetX()) && (x <= m_cachedShapeBounds.GetMax().GetX()) && - (y >= m_cachedShapeBounds.GetMin().GetY()) && (y <= m_cachedShapeBounds.GetMax().GetY())) - { - AZ::Vector2 fRange = (m_cachedHeightQueryResolution / 2.0f) + AZ::Vector2(0.05f); - - AZ::Vector3 v1(x - fRange.GetX(), y - fRange.GetY(), GetHeight(x - fRange.GetX(), y - fRange.GetY())); - AZ::Vector3 v2(x - fRange.GetX(), y + fRange.GetY(), GetHeight(x - fRange.GetX(), y + fRange.GetY())); - AZ::Vector3 v3(x + fRange.GetX(), y - fRange.GetY(), GetHeight(x + fRange.GetX(), y - fRange.GetY())); - AZ::Vector3 v4(x + fRange.GetX(), y + fRange.GetY(), GetHeight(x + fRange.GetX(), y + fRange.GetY())); - outNormal = (v3 - v2).Cross(v4 - v1).GetNormalized(); - } - } - - void TerrainHeightGradientListComponent::OnCompositionChanged() { RefreshMinMaxHeights(); diff --git a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h index 509f003afa..6c3fd7b820 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h +++ b/Gems/Terrain/Code/Source/Components/TerrainHeightGradientListComponent.h @@ -64,14 +64,7 @@ namespace Terrain TerrainHeightGradientListComponent() = default; ~TerrainHeightGradientListComponent() = default; - void GetHeight( - const AZ::Vector3& inPosition, - AZ::Vector3& outPosition, - AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter) override; - void GetNormal( - const AZ::Vector3& inPosition, - AZ::Vector3& outNormal, - AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter) override; + void GetHeight(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, bool& terrainExists) override; ////////////////////////////////////////////////////////////////////////// // AZ::Component interface implementation @@ -91,11 +84,7 @@ namespace Terrain private: TerrainHeightGradientListConfig m_configuration; - /////////////////////////////////////////// - void GetNormalSynchronous(float x, float y, AZ::Vector3& normal); - void RefreshMinMaxHeights(); - float GetHeight(float x, float y); float m_cachedMinWorldHeight{ 0.0f }; float m_cachedMaxWorldHeight{ 0.0f }; diff --git a/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp b/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp index 89ffa6364f..7233d08281 100644 --- a/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp +++ b/Gems/Terrain/Code/Source/Components/TerrainWorldDebuggerComponent.cpp @@ -285,13 +285,13 @@ namespace Terrain AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( z00, &AzFramework::Terrain::TerrainDataRequests::GetHeightFromFloats, x, y, - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT, &terrainExists); + AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT, &terrainExists); AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( z01, &AzFramework::Terrain::TerrainDataRequests::GetHeightFromFloats, x, y1, - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT, &terrainExists); + AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT, &terrainExists); AzFramework::Terrain::TerrainDataRequestBus::BroadcastResult( z10, &AzFramework::Terrain::TerrainDataRequests::GetHeightFromFloats, x1, y, - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT, &terrainExists); + AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT, &terrainExists); sector.m_lineVertices.push_back(AZ::Vector3(x, y, z00)); sector.m_lineVertices.push_back(AZ::Vector3(x1, y, z10)); diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp index 674af376e4..5ec6af6f37 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.cpp @@ -152,27 +152,69 @@ AZ::Vector2 TerrainSystem::GetTerrainHeightQueryResolution() const return m_currentSettings.m_heightQueryResolution; } +void TerrainSystem::ClampPosition(float x, float y, AZ::Vector2& outPosition, AZ::Vector2& normalizedDelta) const +{ + // Given an input position, clamp the values to our terrain grid, where it will always go to the terrain grid point + // at a lower value, whether positive or negative. Ex: 3.3 -> 3, -3.3 -> -4 + // Also, return the normalized delta as a value of [0-1) describing what fraction of a grid point the value moved. + + // Scale the position by the query resolution, so that integer values represent exact steps on the grid, + // and fractional values are the amount in-between each grid point, in the range [0-1). + AZ::Vector2 normalizedPosition = AZ::Vector2(x, y) / m_currentSettings.m_heightQueryResolution; + normalizedDelta = AZ::Vector2( + normalizedPosition.GetX() - floor(normalizedPosition.GetX()), normalizedPosition.GetY() - floor(normalizedPosition.GetY())); + + // Remove the fractional part, then scale back down into world space. + outPosition = (normalizedPosition - normalizedDelta) * m_currentSettings.m_heightQueryResolution; +} + float TerrainSystem::GetHeightSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const { bool terrainExists = false; - - AZ::Vector3 inPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); - AZ::Vector3 outPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); + float height = m_currentSettings.m_worldBounds.GetMin().GetZ(); AZStd::shared_lock lock(m_areaMutex); - for (auto& [areaId, areaBounds] : m_registeredAreas) + switch (sampler) { - inPosition.SetZ(areaBounds.GetMin().GetZ()); - if (areaBounds.Contains(inPosition)) + // Get the value at the requested location, using the terrain grid to bilinear filter between sample grid points. + case AzFramework::Terrain::TerrainDataRequests::Sampler::BILINEAR: { - Terrain::TerrainAreaHeightRequestBus::Event( - areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, sampler); + // pos0 contains one corner of our grid square, pos1 contains the opposite corner, and normalizedDelta is the fractional + // amount the position exists between those corners. + // Ex: (3.3, 4.4) would have a pos0 of (3, 4), a pos1 of (4, 5), and a delta of (0.3, 0.4). + AZ::Vector2 normalizedDelta; + AZ::Vector2 pos0; + ClampPosition(x, y, pos0, normalizedDelta); + const AZ::Vector2 pos1 = pos0 + m_currentSettings.m_heightQueryResolution; - terrainExists = true; - - break; + const float heightX0Y0 = GetTerrainAreaHeight(pos0.GetX(), pos0.GetY(), terrainExists); + const float heightX1Y0 = GetTerrainAreaHeight(pos1.GetX(), pos0.GetY(), terrainExists); + const float heightX0Y1 = GetTerrainAreaHeight(pos0.GetX(), pos1.GetY(), terrainExists); + const float heightX1Y1 = GetTerrainAreaHeight(pos1.GetX(), pos1.GetY(), terrainExists); + const float heightXY0 = AZ::Lerp(heightX0Y0, heightX1Y0, normalizedDelta.GetX()); + const float heightXY1 = AZ::Lerp(heightX0Y1, heightX1Y1, normalizedDelta.GetX()); + height = AZ::Lerp(heightXY0, heightXY1, normalizedDelta.GetY()); } + break; + + //! Clamp the input point to the terrain sample grid, then get the height at the given grid location. + case AzFramework::Terrain::TerrainDataRequests::Sampler::CLAMP: + { + AZ::Vector2 normalizedDelta; + AZ::Vector2 clampedPosition; + ClampPosition(x, y, clampedPosition, normalizedDelta); + + height = GetTerrainAreaHeight(clampedPosition.GetX(), clampedPosition.GetY(), terrainExists); + } + break; + + //! Directly get the value at the location, regardless of terrain sample grid density. + case AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT: + [[fallthrough]]; + default: + height = GetTerrainAreaHeight(x, y, terrainExists); + break; } if (terrainExistsPtr) @@ -181,7 +223,30 @@ float TerrainSystem::GetHeightSynchronous(float x, float y, Sampler sampler, boo } return AZ::GetClamp( - outPosition.GetZ(), m_currentSettings.m_worldBounds.GetMin().GetZ(), m_currentSettings.m_worldBounds.GetMax().GetZ()); + height, m_currentSettings.m_worldBounds.GetMin().GetZ(), m_currentSettings.m_worldBounds.GetMax().GetZ()); +} + +float TerrainSystem::GetTerrainAreaHeight(float x, float y, bool& terrainExists) const +{ + AZ::Vector3 inPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); + float height = m_currentSettings.m_worldBounds.GetMin().GetZ(); + + AZStd::shared_lock lock(m_areaMutex); + + for (auto& [areaId, areaBounds] : m_registeredAreas) + { + inPosition.SetZ(areaBounds.GetMin().GetZ()); + if (areaBounds.Contains(inPosition)) + { + AZ::Vector3 outPosition; + Terrain::TerrainAreaHeightRequestBus::Event( + areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, terrainExists); + height = outPosition.GetZ(); + break; + } + } + + return height; } float TerrainSystem::GetHeight(AZ::Vector3 position, Sampler sampler, bool* terrainExistsPtr) const @@ -203,24 +268,24 @@ bool TerrainSystem::GetIsHoleFromFloats(float x, float y, Sampler sampler) const AZ::Vector3 TerrainSystem::GetNormalSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const { - bool terrainExists = false; - - AZ::Vector3 inPosition((float)x, (float)y, m_currentSettings.m_worldBounds.GetMin().GetZ()); - AZ::Vector3 outNormal = AZ::Vector3::CreateAxisZ(); - AZStd::shared_lock lock(m_areaMutex); - for (auto& [areaId, areaBounds] : m_registeredAreas) - { - inPosition.SetZ(areaBounds.GetMin().GetZ()); - if (areaBounds.Contains(inPosition)) - { - Terrain::TerrainAreaHeightRequestBus::Event( - areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetNormal, inPosition, outNormal, sampler); - terrainExists = true; - break; - } - } + bool terrainExists = false; + + AZ::Vector3 outNormal = AZ::Vector3::CreateAxisZ(); + + const AZ::Vector2 range = (m_currentSettings.m_heightQueryResolution / 2.0f); + const AZ::Vector2 left (x - range.GetX(), y); + const AZ::Vector2 right(x + range.GetX(), y); + const AZ::Vector2 up (x, y - range.GetY()); + const AZ::Vector2 down (x, y + range.GetY()); + + AZ::Vector3 v1(up.GetX(), up.GetY(), GetHeightSynchronous(up.GetX(), up.GetY(), sampler, &terrainExists)); + AZ::Vector3 v2(left.GetX(), left.GetY(), GetHeightSynchronous(left.GetX(), left.GetY(), sampler, &terrainExists)); + AZ::Vector3 v3(right.GetX(), right.GetY(), GetHeightSynchronous(right.GetX(), right.GetY(), sampler, &terrainExists)); + AZ::Vector3 v4(down.GetX(), down.GetY(), GetHeightSynchronous(down.GetX(), down.GetY(), sampler, &terrainExists)); + + outNormal = (v3 - v2).Cross(v4 - v1).GetNormalized(); if (terrainExistsPtr) { @@ -469,43 +534,30 @@ void TerrainSystem::OnTick(float /*deltaTime*/, AZ::ScriptTimePoint /*time*/) { for (uint32_t x = 0; x < width; x++) { - // Find the first terrain layer that covers this position. This will be the highest priority, so others can be ignored. - for (auto& [areaId, areaBounds] : m_registeredAreas) - { - AZ::Vector3 inPosition( - (x * m_currentSettings.m_heightQueryResolution.GetX()) + m_currentSettings.m_worldBounds.GetMin().GetX(), - (y * m_currentSettings.m_heightQueryResolution.GetY()) + m_currentSettings.m_worldBounds.GetMin().GetY(), - areaBounds.GetMin().GetZ()); + bool terrainExists; + float terrainHeight = GetTerrainAreaHeight( + (x * m_currentSettings.m_heightQueryResolution.GetX()) + m_currentSettings.m_worldBounds.GetMin().GetX(), + (y * m_currentSettings.m_heightQueryResolution.GetY()) + m_currentSettings.m_worldBounds.GetMin().GetY(), + terrainExists); - if (!areaBounds.Contains(inPosition)) - { - continue; - } - - AZ::Vector3 outPosition; - const AzFramework::Terrain::TerrainDataRequestBus::Events::Sampler sampleFilter = - AzFramework::Terrain::TerrainDataRequestBus::Events::Sampler::DEFAULT; - - Terrain::TerrainAreaHeightRequestBus::Event( - areaId, &Terrain::TerrainAreaHeightRequestBus::Events::GetHeight, inPosition, outPosition, sampleFilter); - - pixels[(y * width) + x] = (outPosition.GetZ() - m_currentSettings.m_worldBounds.GetMin().GetZ()) / - m_currentSettings.m_worldBounds.GetExtents().GetZ(); - - break; - } + pixels[(y * width) + x] = + (terrainHeight - m_currentSettings.m_worldBounds.GetMin().GetZ()) / + m_currentSettings.m_worldBounds.GetExtents().GetZ(); } } - - const AZ::RPI::Scene* scene = AZ::RPI::RPISystemInterface::Get()->GetDefaultScene().get(); - auto terrainFeatureProcessor = scene->GetFeatureProcessor(); - - AZ_Assert(terrainFeatureProcessor, "Unable to find a TerrainFeatureProcessor."); - if (terrainFeatureProcessor) + if (auto rpi = AZ::RPI::RPISystemInterface::Get(); rpi) { - terrainFeatureProcessor->UpdateTerrainData( - transform, m_currentSettings.m_worldBounds, m_currentSettings.m_heightQueryResolution.GetX(), width, height, pixels); + if (auto defaultScene = rpi->GetDefaultScene(); defaultScene) + { + const AZ::RPI::Scene* scene = defaultScene.get(); + if (auto terrainFeatureProcessor = scene->GetFeatureProcessor(); terrainFeatureProcessor) + { + terrainFeatureProcessor->UpdateTerrainData( + transform, m_currentSettings.m_worldBounds, m_currentSettings.m_heightQueryResolution.GetX(), width, height, + pixels); + } + } } } diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h index c52165da6b..a9240e02a6 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystem.h @@ -94,8 +94,11 @@ namespace Terrain float x, float y, Sampler sampleFilter = Sampler::BILINEAR, bool* terrainExistsPtr = nullptr) const override; private: + void ClampPosition(float x, float y, AZ::Vector2& outPosition, AZ::Vector2& normalizedDelta) const; + float GetHeightSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const; - AZ::Vector3 GetNormalSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const; + float GetTerrainAreaHeight(float x, float y, bool& terrainExists) const; + AZ::Vector3 GetNormalSynchronous(float x, float y, Sampler sampler, bool* terrainExistsPtr) const; // AZ::TickBus::Handler overrides ... void OnTick(float deltaTime, AZ::ScriptTimePoint time) override; diff --git a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h index 1ba63a8f84..cda6d65a1e 100644 --- a/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h +++ b/Gems/Terrain/Code/Source/TerrainSystem/TerrainSystemBus.h @@ -65,27 +65,8 @@ namespace Terrain virtual ~TerrainAreaHeightRequests() = default; - enum SurfacePointDataMask - { - POSITION = 0x01, - NORMAL = 0x02, - SURFACE_WEIGHTS = 0x04, - - DEFAULT = POSITION | NORMAL | SURFACE_WEIGHTS - }; - // Synchronous single input location. The Vector3 input position versions are defined to ignore the input Z value. - - virtual void GetHeight( - const AZ::Vector3& inPosition, - AZ::Vector3& outPosition, - AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) = 0; - virtual void GetNormal( - const AZ::Vector3& inPosition, - AZ::Vector3& outNormal, - AzFramework::Terrain::TerrainDataRequests::Sampler sampleFilter = - AzFramework::Terrain::TerrainDataRequests::Sampler::DEFAULT) = 0; + virtual void GetHeight(const AZ::Vector3& inPosition, AZ::Vector3& outPosition, bool& terrainExists) = 0; }; using TerrainAreaHeightRequestBus = AZ::EBus; diff --git a/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp b/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp index f0533322c8..ee4b18e2fb 100644 --- a/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp +++ b/Gems/Terrain/Code/Tests/LayerSpawnerTests.cpp @@ -15,7 +15,12 @@ #include #include -#include +#include +#include + +using ::testing::NiceMock; +using ::testing::AtLeast; +using ::testing::_; using ::testing::NiceMock; using ::testing::AtLeast; @@ -29,7 +34,7 @@ protected: AZStd::unique_ptr m_entity; Terrain::TerrainLayerSpawnerComponent* m_layerSpawnerComponent; - UnitTest::MockBoxShapeComponent* m_shapeComponent; + UnitTest::MockAxisAlignedBoxShapeComponent* m_shapeComponent; AZStd::unique_ptr> m_terrainSystem; void SetUp() override @@ -67,7 +72,7 @@ protected: m_layerSpawnerComponent = m_entity->CreateComponent(config); m_app.RegisterComponentDescriptor(m_layerSpawnerComponent->CreateDescriptor()); - m_shapeComponent = m_entity->CreateComponent(); + m_shapeComponent = m_entity->CreateComponent(); m_app.RegisterComponentDescriptor(m_shapeComponent->CreateDescriptor()); ASSERT_TRUE(m_layerSpawnerComponent); diff --git a/Gems/Terrain/Code/Tests/MockAxisAlignedBoxShapeComponent.h b/Gems/Terrain/Code/Tests/MockAxisAlignedBoxShapeComponent.h new file mode 100644 index 0000000000..aeaaa609c4 --- /dev/null +++ b/Gems/Terrain/Code/Tests/MockAxisAlignedBoxShapeComponent.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) Contributors to the Open 3D Engine Project. + * For complete copyright and license terms please see the LICENSE at the root of this distribution. + * + * SPDX-License-Identifier: Apache-2.0 OR MIT + * + */ +#pragma once + +#include + +#include +#include +#include +#include + +namespace UnitTest +{ + class MockAxisAlignedBoxShapeComponent + : public AZ::Component + { + public: + AZ_COMPONENT(MockAxisAlignedBoxShapeComponent, "{77CBEED3-FAA3-4BC7-85A9-1A2BFC37BC2A}"); + + static void Reflect([[maybe_unused]] AZ::ReflectContext* context) + { + } + + void Activate() override + { + } + + void Deactivate() override + { + } + + private: + static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) + { + provided.push_back(AZ_CRC_CE("ShapeService")); + provided.push_back(AZ_CRC_CE("BoxShapeService")); + provided.push_back(AZ_CRC_CE("AxisAlignedBoxShapeService")); + } + }; +} diff --git a/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp b/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp index 3e557c66a6..91a9744f0b 100644 --- a/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp +++ b/Gems/Terrain/Code/Tests/TerrainSystemTest.cpp @@ -9,20 +9,23 @@ #include #include -#include - #include -#include + +#include +#include +#include + +#include +#include using ::testing::AtLeast; using ::testing::NiceMock; +using ::testing::Return; class TerrainSystemTest : public ::testing::Test { protected: AZ::ComponentApplication m_app; - - AZStd::unique_ptr m_entity; AZStd::unique_ptr m_terrainSystem; void SetUp() override @@ -41,28 +44,46 @@ protected: m_app.Destroy(); } - void CreateEntity() + AZStd::unique_ptr CreateEntity() { - m_entity = AZStd::make_unique(); - m_entity->Init(); - - ASSERT_TRUE(m_entity); + return AZStd::make_unique(); } - void ResetEntity() + void ActivateEntity(AZ::Entity* entity) { - m_entity->Deactivate(); - m_entity->Reset(); + entity->Init(); + EXPECT_EQ(AZ::Entity::State::Init, entity->GetState()); + + entity->Activate(); + EXPECT_EQ(AZ::Entity::State::Active, entity->GetState()); + } + + template + AZ::Component* CreateComponent(AZ::Entity* entity, const Configuration& config) + { + m_app.RegisterComponentDescriptor(Component::CreateDescriptor()); + return entity->CreateComponent(config); + } + + template + AZ::Component* CreateComponent(AZ::Entity* entity) + { + m_app.RegisterComponentDescriptor(Component::CreateDescriptor()); + return entity->CreateComponent(); } }; TEST_F(TerrainSystemTest, TrivialCreateDestroy) { + // Trivially verify that the terrain system can successfully be constructed and destructed without errors. + m_terrainSystem = AZStd::make_unique(); } TEST_F(TerrainSystemTest, TrivialActivateDeactivate) { + // Verify that the terrain system can be activated and deactivated without errors. + m_terrainSystem = AZStd::make_unique(); m_terrainSystem->Activate(); m_terrainSystem->Deactivate(); @@ -70,6 +91,8 @@ TEST_F(TerrainSystemTest, TrivialActivateDeactivate) TEST_F(TerrainSystemTest, CreateEventsCalledOnActivation) { + // Verify that when the terrain system is activated, the OnTerrainDataCreate* ebus notifications are generated. + NiceMock mockTerrainListener; EXPECT_CALL(mockTerrainListener, OnTerrainDataCreateBegin()).Times(AtLeast(1)); EXPECT_CALL(mockTerrainListener, OnTerrainDataCreateEnd()).Times(AtLeast(1)); @@ -80,6 +103,8 @@ TEST_F(TerrainSystemTest, CreateEventsCalledOnActivation) TEST_F(TerrainSystemTest, DestroyEventsCalledOnDeactivation) { + // Verify that when the terrain system is deactivated, the OnTerrainDataDestroy* ebus notifications are generated. + NiceMock mockTerrainListener; EXPECT_CALL(mockTerrainListener, OnTerrainDataDestroyBegin()).Times(AtLeast(1)); EXPECT_CALL(mockTerrainListener, OnTerrainDataDestroyEnd()).Times(AtLeast(1)); @@ -89,4 +114,115 @@ TEST_F(TerrainSystemTest, DestroyEventsCalledOnDeactivation) m_terrainSystem->Deactivate(); } +TEST_F(TerrainSystemTest, TerrainDoesNotExistWhenNoTerrainLayerSpawnersAreRegistered) +{ + // For the terrain system, terrain should only exist where terrain layer spawners are present. + + // Verify that in the active terrain system, if there are no terrain layer spawners, any arbitrary point + // will return false for terrainExists, returns a height equal to the min world bounds of the terrain system, and returns + // a normal facing up the Z axis. + + // Create the terrain system and give it one tick to fully initialize itself. + m_terrainSystem = AZStd::make_unique(); + m_terrainSystem->Activate(); + AZ::TickBus::Broadcast(&AZ::TickBus::Events::OnTick, 0.f, AZ::ScriptTimePoint{}); + + AZ::Aabb worldBounds = m_terrainSystem->GetTerrainAabb(); + + // Loop through several points within the world bounds, including on the edges, and verify that they all return false for + // terrainExists with default heights and normals. + for (float y = worldBounds.GetMin().GetY(); y <= worldBounds.GetMax().GetY(); y += (worldBounds.GetExtents().GetY() / 4.0f)) + { + for (float x = worldBounds.GetMin().GetX(); x <= worldBounds.GetMax().GetX(); x += (worldBounds.GetExtents().GetX() / 4.0f)) + { + AZ::Vector3 position(x, y, 0.0f); + bool terrainExists = true; + float height = m_terrainSystem->GetHeight(position, AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT, &terrainExists); + EXPECT_FALSE(terrainExists); + EXPECT_EQ(height, worldBounds.GetMin().GetZ()); + + terrainExists = true; + AZ::Vector3 normal = m_terrainSystem->GetNormal( + position, AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT, &terrainExists); + EXPECT_FALSE(terrainExists); + EXPECT_EQ(normal, AZ::Vector3::CreateAxisZ()); + + bool isHole = m_terrainSystem->GetIsHoleFromFloats( + position.GetX(), position.GetY(), AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT); + EXPECT_TRUE(isHole); + } + } +} + +TEST_F(TerrainSystemTest, TerrainExistsOnlyWithinTerrainLayerSpawnerBounds) +{ + // Verify that the presence of a TerrainLayerSpawner causes terrain to exist in (and *only* in) the box where the TerrainLayerSpawner + // is defined. + + // The terrain system should only query Heights from the TerrainAreaHeightRequest bus within the + // TerrainLayerSpawner region, and so those values should only get returned from GetHeight for queries inside that region. + + // Create the base entity with a mock Box Shape and a Terrain Layer Spawner. + auto entity = CreateEntity(); + CreateComponent(entity.get()); + CreateComponent(entity.get()); + + // Set up the box shape to return a box from (0,0,5) to (10, 10, 15) + AZ::Aabb spawnerBox = AZ::Aabb::CreateFromMinMaxValues(0.0f, 0.0f, 5.0f, 10.0f, 10.0f, 15.0f); + NiceMock boxShapeRequests(entity->GetId()); + NiceMock shapeRequests(entity->GetId()); + ON_CALL(shapeRequests, GetEncompassingAabb).WillByDefault(Return(spawnerBox)); + + // Set up a mock height provider that always returns 5.0 and a normal of Y-up. + const float spawnerHeight = 5.0f; + NiceMock terrainAreaHeightRequests(entity->GetId()); + ON_CALL(terrainAreaHeightRequests, GetHeight) + .WillByDefault( + [spawnerHeight](const AZ::Vector3& inPosition, AZ::Vector3& outPosition, bool& terrainExists) + { + outPosition = inPosition; + outPosition.SetZ(spawnerHeight); + terrainExists = true; + }); + + ActivateEntity(entity.get()); + + // Verify that terrain exists within the layer spawner bounds, and doesn't exist outside of it. + + // Create the terrain system and give it one tick to fully initialize itself. + m_terrainSystem = AZStd::make_unique(); + m_terrainSystem->Activate(); + AZ::TickBus::Broadcast(&AZ::TickBus::Events::OnTick, 0.f, AZ::ScriptTimePoint{}); + + // Create a box that's twice as big as the layer spawner box. Loop through it and verify that points within the layer box contain + // terrain and the expected height & normal values, and points outside the layer box don't contain terrain. + const AZ::Aabb encompassingBox = + AZ::Aabb::CreateFromMinMax(spawnerBox.GetMin() - (spawnerBox.GetExtents() / 2.0f), + spawnerBox.GetMax() + (spawnerBox.GetExtents() / 2.0f)); + + for (float y = encompassingBox.GetMin().GetY(); y < encompassingBox.GetMax().GetY(); y += 1.0f) + { + for (float x = encompassingBox.GetMin().GetX(); x < encompassingBox.GetMax().GetX(); x += 1.0f) + { + AZ::Vector3 position(x, y, 0.0f); + bool heightQueryTerrainExists = false; + float height = + m_terrainSystem->GetHeight(position, AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT, &heightQueryTerrainExists); + bool isHole = m_terrainSystem->GetIsHoleFromFloats( + position.GetX(), position.GetY(), AzFramework::Terrain::TerrainDataRequests::Sampler::EXACT); + + if (spawnerBox.Contains(AZ::Vector3(position.GetX(), position.GetY(), spawnerBox.GetMin().GetZ()))) + { + EXPECT_TRUE(heightQueryTerrainExists); + EXPECT_FALSE(isHole); + EXPECT_EQ(height, spawnerHeight); + } + else + { + EXPECT_FALSE(heightQueryTerrainExists); + EXPECT_TRUE(isHole); + } + } + } +} diff --git a/Gems/Terrain/Code/terrain_mocks_files.cmake b/Gems/Terrain/Code/terrain_mocks_files.cmake new file mode 100644 index 0000000000..2aedd1c5d8 --- /dev/null +++ b/Gems/Terrain/Code/terrain_mocks_files.cmake @@ -0,0 +1,11 @@ +# +# Copyright (c) Contributors to the Open 3D Engine Project. +# For complete copyright and license terms please see the LICENSE at the root of this distribution. +# +# SPDX-License-Identifier: Apache-2.0 OR MIT +# +# + +set(FILES + Mocks/Terrain/MockTerrain.h +) diff --git a/Gems/Terrain/Code/terrain_tests_files.cmake b/Gems/Terrain/Code/terrain_tests_files.cmake index 6d1cf97fd9..3ce1d05003 100644 --- a/Gems/Terrain/Code/terrain_tests_files.cmake +++ b/Gems/Terrain/Code/terrain_tests_files.cmake @@ -7,8 +7,8 @@ # set(FILES - Tests/TerrainMocks.h Tests/TerrainTest.cpp Tests/TerrainSystemTest.cpp Tests/LayerSpawnerTests.cpp + Tests/MockAxisAlignedBoxShapeComponent.h )
Material Slot %1
Entity %1
Material Slot %1
Material %1

TLNUqC~|_2C!L zU-J4mR=3OEOk=&CFv^XUY{1(!*gI*zy@kD&<~x1t4@KYI#w-v%#)@m%EMxG-HKSt% zxRyF+>>W`x&PPeTWt=$fobf+|6Ec+Oca*ybG3(GhdobO<1kt@fAkC!&&Y${()gS+e z8CHT$1ASN2elD89jZk~%z zdM+VKJpNLCp&X&aSj2Ih5yZJbIs!a!MwAOF(+Pw5sQ!7>=AWtZPn2_}a8^I=5mzWT z8+ZfFWu5s@`={9ebg68F&X>i|dE7E1m^Jp)U9uY%h4ec(#t7S#1nH5e?D2m~X^ zGshkb_AyXpo+ch7^k05qES4OE~?4pZ)_%JR_KKEqUL5(4 zFwmST7of`5Q{^cemIxE1%%}!A3TX`1>-xa5T9vMW>-zY>k z_Y&WipoTr_bYEhO2;kPMdKoO1xD5sgEC7wSC4w^KEmCgyCb)xgJ>_CT*FTh>DXB-f zQp>wi&92n)u5{D{$WrCh=DuG^+2;eH_ssM1S^UqMy}c!6t=$#O7V6=TQMLITHK#RM?sTsLilH@Ywv6oF_V zi2s9Bp$qj5muvJ$H6?l-f6bwcr-Vo1h&!P_Vm|z&mny$Nm7gZ`Iy=n{%{NBUp!VaV zMc|&!8&Dh490P@~D&K(`#g)+WFhd7qL~jRK{Ll)Q3l6ZWi@gc_+J#$fE^-XtBzJ=M z$kX}GH5?jX-a_bihIPOoO2h(`%_#8+l+jvHm~s~-8|6w$7DC?~s@#k!7p2PSyF@&B zr+JB;M~HE{oN;>aB;U{tjhO15`qLa(@V)UeobcO?J>5j%&bawXR2G=;Cey6)8 zXqQux8rtGyBxwZ-3iN}l95=D@npxBcz9kwQpHg;HQp^9JtHadtj@0sww55);rH*d& zlQ<*1WeL@MhtTsBp+_>Id&2YqXf7Bz1GU#5aYE-z=L@2?`7{)sx`4>%yto)~#wjr) z6kHh%wT@MOa-gn*C%Duk1T*m+HES?e5|PKjLlB~LT)yvBipXdvDO&L^~= zp&X}tPT5P@MtO;{jFQe2UI(aVI_J7yCuKK!Mb))nS{iE4jnqSD=ObdnADxq+WHXL9 z=3jt!Is7di14GGv%$^zT0T%h$fzl57Si{YjoC9msNI6szqtH%I5WZ)3fD=*3ZsSrd zkZQI?Ut-NoHQPR;W!e|E*J&B!bdf)~(zjyNHk&+mYkL&y)(KnM7anx{x_u+cU1=7= zrI3`JQ>WFTHhZLh5e|#zxW@hk%1a)d!rGHY#sa(z(o#i z*h5}5c?t%oVO-isOYwsn1YaRLIKAC`X}9&0Wo2s)Sl@yY9cx4=wnf%xEqj4ATFdEg zos9L}8f)|`cf7Sbc08M{EwNXZwnm%xDp||oPNKvAyLRSE*E}wC6gbnlz=_Uij%%hZ zpmxm&Jl3B3kuG$qcddoCgyt7e^7MilD0Bkj$+|M*KFAY|Rxqyl)qo}rpTVW3D;M0e zx~0B(Gs7xLDuzqi%4)y%E-9}1b`jHP zw{5`4D0D_YvWLQwF2n%FK=W6S^8)RwH%L7b4KR=2e^Xr2oWWHtwcK28WrXxQa{=rO4w`dfeVt&=idE_- zb7)f7Wri~<8k@aFPB6jjA@Z0H%`oOwX3XIKYAem)|LVMEbX+^+Qq9!nw*91RlTB#t zJRJ$0h9f_q)9?{`($b?#1_}$VtU&hq1$n2c`JNL-$YAwNB`r9G0pa0B(TAh z&(TQC#^jM{f^@t|g8D`IL=zQhN#zYDTMisioizTs19@=c0ag~xWaC!kwKI&Xk%v8L zd=eSt>&Eax-K*reD!og_u%P~VV>HR&nlbv@u!1~SWt3yQ8+*Gj<1J_^{DEp-PROVr zw4yVzCC@ba%3{&za%lVW2r<)aNtZF!^n6#)3nq>iPT?F?Cjwcmj8|of?Wr{iiQyIN zF=Fu-Jz{Nm%rQ-c#Zc7rj;6oCnEG#B4}&w(Gwj%O8pk_jeZrB^^z+!)QM)JRjUgZG=YEhVhMAYCXKBH=8m`zWq$z$!PpoZw?H=)LX^+B52QtU?LRiQj! zOmze+wggp-?jRmj^bXWU6U_#lg!;O|Ay}~}$wyQ>9mAc-Q z#3Pbw_En3tuBk?!_+%oj(vo@2T2N&{OpD_xWiS6XZkv@xo%B5?mHf>v`5sYPp}Eoj zj$*6q{J;x}kwOWOF5v zIqMNqNKQ$kt512aBIlKh2C531ssydB%Wpl&<`^$`B=eJp)RBOgSzj&LdjUHFn`I9= zm4t4QX*6FJv06q(GcL+d`kib-%wp*h;r+3m(vG~*aY@o*8-tE2OK+UJ;^;$Z=!mzL z!ip;Xw-n~KggB{2WYL#N6@xian5~j_OSyt|Qt+;1QK`e=HK`p$zZ$*&TxE>tSDGSJ zTuUgg`E}VU#*y=*nTN(@*&cIhv`Js+nlUSp(z){3{)Hr0m4!!u_`j1H{%geNAL9*q zb9h~>NTksr%>dU}S+N4A@9~Oa3(P$dzlcU^{z?8Ly6y;DYMe;B@W-^fB4N9t)9;GN zZ(frTBEr5vC}UQH1^M$JVdy`$K=?KoD_j9Gh0~Bf4<&a#WiJ%g2BXL?vS7PB$Pr4xi&o!~VEejDV)F35(ORABVy2Jf7&}GE{@dazC%obc(|7P- zaaBsF`~mTkQPFGnFFD4DmlAj#8<;G~|1scl+JF3uoz*fE_Gy{-XMNjyM$0d!e=pmS zx;*hc4I*ccJMA&yi_F*GvzF~d{><*zi**W|c4MR!yxM&n*>aoRp5UY1h?YevyAkP% zuI-+SY`HkOa$j7<*MvJCxAA3w8GJ58zeG9FeCR8os2-EKR7B_wlPP)WfbLgCy&-|` zqkXoz`)VFLdal|N`=4x3BA?GyzNp2#Syfl!PjNS$Y)E;!bIq~*%tWr>*ef~w+t~wI zj(c!CbS^FUzU`)kXt5A`yVm51FI#8i6i!KO)f2Tkt-s~Y?!XfMEf!lhmUL`cvCOel zkPRcP^fVjvmu+G*C3l;%ae|*Wze1kXbn{v8;bsTq%)~eIfM+*NAb+!J(?z0xKV9?l zV-+;tZ#UkBCC$U@#$*~+@0|D5(cw8~&geH^L-y5=)57I9r~T)8G=W`Nt{2WG+6< zc7n+~lDSTj$uzyW+?mOAJvKMX0dMyjguAJKG~w&-#*DL1XBjG&}z(`I2(CcBXT{bMp^(L+ooS#23aU09J^EHYqYL^+kNZIX-IMUetLi3H{!^NUYn$Ta{h+fF5yJ8Ogvn>mu-?`Ndv!)!$OIvNlq6^P`-a=V% z@ogwPe5Zp8Yu}F@cagu1?Ucmo*@R@37NvK-BYL`E4G{YY5MGWt#VM&r{r7>C??_Ol z6PoWMYQ4~pOlA~Xhqt(VAv~@E{r^t=g8t*=-TP0ZFW$p91?r7(M?Qbk4D>&1*$e&O z+KQn6-%UilqnaHG(BIRQ0R4@3&^oJwY}ZbN>ZlAI=QoGvI%O4>&13DACKfuYU=lAI`~S#u*bHb0j3c;mc&6 zvBA4s_FY8l-rlXpdihD<6|5lcxV578Yd*I)F_yTxaE8;0-S~XANiRS2H{Qog6D<3n z1S=JZeps6!InaaEM-s`FE0sTnl_Xl9fdzI6#uH!10|LbjtLYlAb$g@1JFCzc!_!_m(nezrQ0ZgL2PdI{4g7_pz+cNT* zl*w;-F`1m>cWIJ8%{6#RPhXZ`lNt zaJWx=#3vHh$zi{u+|^ z5u?)m)?_7C>MWn|SA)}^LDd~!8W1m9rckdi$JA5oW-m+&;#s7`X?$zb?DQp!g5%Ra ziK?%MDXA}gg~gzSg;Itxit+{_q6Xb9#?oC(OdOeoqv>5(QFXu3lE^oc@Po)5FQG3Y zpbuvWf6|@{s?^`Xnz7>y)P(6BM>%vn$pp*_gVjQhxDSDNw*lJILGGdq$(4iML%f9B zL2Yh~mJrbu@X-)%q9J4x`{xh4PS>utj)xAC!diwHHHkaXtDnZ2cK)=sa^A<z{+_XI!E1 z`SF*aM-uU#4Po0**KK!rSa1vjJ`pUhdk|bFkJ^Ghi>w6uxM6{y#+7PdDbWx_<9$#H zEu$tJ@uPI6w4&6dRHlT7;xiaAQ0_u4uSG4dK$X*b$s(M7Pe60tq%br;c$olh>q9?> zhPES8gnX!f3)-Ctgtn>Uuy$~45^4_S3lqSZpL(zoRSfu5kg={7$V=|A3Stov#|q;W z_b}MG5@!gkCmI6JQ5I2VP#&eEGeDpRE!$ASU-5Z$N?F2a-17jRp?A(i(!ETC4mlF; z{Cf(TvnSEk(B7As;HEzGVTfOQGjxvDVHK1Hln@O87*SvnWjLibr6Z*|C9HtY$Wv0k`rof? zMKP$&r3fPgsq%w_VamUMLbKN-;$}$2%R;D~BJ*OfYCHTksJR}W3F1GK4Q);2*NFm^ zlHgYXAH!gwfa4z0pe_TS30SY2gsb z6OIc~a#N!3afFU>f5ZsPy>yI6?xdQTR5Q(jhW?Lp{>+DR?nxbJHX$=mP)Q%!9r&aD zA!yrxGX*?8QwCb*v*XMklh7~z$HF|p!yaZh|BN*!*r>1da?+-lv4UaD+x1a&-;m)0CLW;U^tbIn6wT()bw?LyiO=`$NWB z{iFrdj=sDE?&?Ed1cbG}hQhZE7^nV*5L`K_k65kVBya ztGXGnU0~lXD0i!0M|grLaZ9J93f+jc>)l}OMd@xBMJs-~X<~in?lgBFS=UU@bz~1?jn=vR*1G|AC`^L+Vks-1yZG`6Zr<#ox4vXs zmWvctKo4C6up4l9;li49rOR5Z>=axUVV7*;{2O~UGiQ8LAjBCxy`bp*`&^-#j}m&>5qcW`F@RbId6%7g@bE$?Jl9tWRqt*pfZ`2ki%a2Ii~^T6 z`8bnvMzRaY9exM%2;~}h4w>j>`S})8IqgCdf<7#Brr5)k5axo6yv6F6f7$^77 zJ0Oa|!oE~9T{(D+kg_{%i(C00c)M%aWD68F4YNVpi@s)X!%Yilb7(k+%cdu`PN87Dl!KnwJr}wiCLf6FPhT34u<#$%jzrK8*7@r1qg~-*OW%#C~A|eA~|G ztT!^*9R+h)(`-ePTli{hI>HM?6KzaA>tw8L=G)XNIaoL9pH%m=4p5q-&1Nls=&jxc z>n(fM8n`fiY??J%$asaU@fOB?WaO7J+L85M!l(s5GRlxy{*RG^9qt)M0x~g$i~!^V zd>BsHl`1k!u{YYpP$T+X#i?4Fg>$0UVjK^XBMz(nWI*AsN%WQNuVGbiMIYL2BXsjP zb|wK0?{JQ`vpF2s89W7i!fUOvlP6^NTCs(9tJ+#tdVbWNw$!otYUp9{SO1e~tVN5G ztwo$g!eJZ6Tnn>3ZPq_5MAaQjFmtoBEm9B7t`-=oDVl9d*`oK@^i;$=)Ay#lUIL6=CU*23%H;g;>CU|%o7jLokJY^g`_pg_$u_yeP-IxIm8Dr-1IchA4 z*vD_o4?Z%+OzD?lj5hioF!~EVHo}Mw2r@z&p%ytS*t3R^Aw+0N`@$mrPb+#)`xBy+ z+5Ta))s*i6-}<>GA~&B2YZx;c1r%qDvd+HK%`tpi5NAHmP%1^+X4If5Ldxl;fvA_S zyO92U+idUk`rZcBek=8PmDK`N^gf6u1o7!z*{2nJUN2*7c}Rnv&w_?fXFW^Iql@*R zJglDlqEoo49%kF{S9*xl5dnJe{K&237o8&ObVsn(lq0|B6g8lGgXp&$CYmh{5t^MR zG^O`)7~lW%7*_}4KZ)SVi|+7Awoe9P50npo)fc+?M{Qb9qtU?loUYfoRn{+bE*I20 z*XhhliSx|V#_i{R=e6E>H3uEj3bK6@#-g>_aCtaF;Ln6Go;lOER+ZL{I)GVWS@4_tM3Yc9LRWf`Zj zqA}8`Se^Zxl$X4kdcj!0H`Rocwy@ucJbgYk3fATqIOq@OSkt+ci!tPb>-7dz)0F<(xzkSq4-5%<)&i6*kOk&9AIWaoREX9URv z+MUXhlKyHqmE$CxqB4-TTv|-h`sjFm10BT}$!p{bM!_*_Z` zIde_&YaK=HO zJxZ0&juxGb)H}{4%Hw^h;Fn04{k-Bh;TJ|uC!>YURqapD6Z$Q+qeNY(Oz=*rfsobq z4`r)__N|^@mL{|m+44UJvF0fEJ=hHnAB4g)$_LZHO9wI2pXEEK4IVpq5d3v;E#5kA za{zN0W;3c^wv6bPmSHmSOCn#GOtq}TSN>{RZ5KQBsmVQ4q~O(_pgy7c2d`rmA9#1G zEXjSp%H@?AzXcl3z04Kn*DA~}nA!V1HQ~g?J&z+#mCWDW>9eG)oNvV5`OIIwRYtGQ zJ>F%fI#VIVJ1jL&>BZ}`zwUwq?}8nNs@CzeuQjMj=0QZRn&NRoR??bB2JGO0!fGCF z_)>KWcL&MVaA)Hk<7V8L?`p1dW2I8d!M%m(KXisD7eW4fkHA5+LgSfWGwwq7-}m^h zw|DrS<)4Pa9d;?b(o0y%UHouG#&)iMw;ts-b0%MwD>}7p#raLAt+(7Md{*AHIVAPr zd9IB?k<%AM*8BOmTr6LE(f&zI|7xbOZCw&;oLb(cC#wvl3+rcAiXNzH7+j&b^Gsv- z^3wH9jUSeC&%JV4Z5bl`<@#la7fq{|q8FOn$sHa|-AgdLH}78p?`lq8j4|Fkz8LZ9 ziu@wXOvoZF#r^Xg+-QZ)!1gsvro*qTn9%|#MDVB0>X?TNuj-I%$k$Mly2f=5 ztY!kqGoS~%TmRuHfCFvt;7tN;f3VgRzF|Pr+_+5GzLL_8@+#p?L~#(F1Y+jLn^NeJ zJ$qOum`vU6^Y1a4PS;5OEg0)m+{>+kce%7?PU2l0f(3|fuc}J|kn{CE_Y3-EF4{o< zRgynHUwj#US>$$=1^NS9K0|*MQROSsUJL#AZlP?F+yQS;pY0UIy$&i}ScwQd?)r_j zX3>91SPkp_2fttDdqH1ndXepuqRgPgXYl55amrLmI(zAa5Vg(^2tyqRlf(#f zaOS_Gqxe~4agsk^bKH@yy$@`o&s=r0GqGc_i!Om_0WRy0_7}W zzXBy~S3fL?H=+npMiaWE5VheL4|t0U+K9|QW;oo-4Ga8RS?LM=33a`=XL@-v7ta3l z`g!QDyQu-c6d~6gD!98>A-c`)Rl~b==d(-j+|a@O*oOoS!Y9{64)#Ni!*d>@>N)BKn+b=|v!EVjG36-Xi+zMq zuqu<8DM(mcL3nNlA$dmmpL7%EkI&aygP~vHHtf*9;SK}(zxQ5*{^$o-BUS_rz$V3v zCzH^hGH3+-BSXp1U;Yv;a&jDgjal9O^>(rjeuG|+`}YP`5|bFo##Jz`(Pg-bbbS;y zUq3>AGi|~6=rmFF78U@*D4_vaWLOE*r_84uBFx%D)ShAxR{9gxe;{l@UH{x}?S}rz zJGRgtdhaguYxf_+GZMm2(3?%2&oSaEx?Va%|K-={!SoL!>B#5lye-EXYx@{Rhtur% zJ*=VDLh>9f=KBdm>-QfpE)H3J)Wy!KLI2I^e(XSczM`x! z{LLFz!O~}NPJwMRf!H@*nrX*X7>n=oFbYb)s}NP+aW=4%aCQMDq8ZA`l+cW4j202r z9wBP4LIaa|>j&Z8&x8*#bNuUlhW`Cx_%amwCr2cqzh^86`ddG+LciH3SfLY$Sh3k^tZw;!3Se|`|3a*=@c&(cl~l_K+a>ZY}}n#^l@CUe*q}!v<2HOqBbMo=Zp=3xnntPvODw(%r^T+tA_y9=P}bI&YqaZ^aoM zi$pEVSbQtC+P@NXb3z})@|%RC-oI*SOUz@*ENa~_*P7(Kl~#m&PfqeG|30okzZ?!o|HTc-X+hEMptjd zccalyU@~PCCC-Z@v@Oxrv}{BPJK{L)spvzr4C}yWHc|bHsQv|1IlT)#f#wzCoxhty zbLChX)c$>n-itHuhQG%4wM2oc7vDqMQ}U}hF|Nl>f@|V-pq4g&jM(T9Co53W;Dndb_xYon+#&-_d+cdY$A6NM`n}fdLsijy#djeAo>`@SwQp?NMmH=E?Q=%TuZr_ zFybHOH^RinRCz1ajFl%e-y)2AMY-a;7c{Gll|gO(Gn^y(TXzCzN1peK8mwLdI-WK` zjo*)Tg2i##pi%(piDYpqLR~jaaJGmvwX2|mwp6(Z)oe`|8%h{+_B(7CJv>$e?tQi$YL9m3LECgo zHRx2m6}3;D_5h=f5mh_lTyf@m0X$%$6GlO}f+-?w_-eH;*qu*EZ3a8|MZmLcY~V4X zA&mM@81OWx&dK@z({;EbPO({&dhZ1VwEi6>?8>*ScpO~kl9Q}!M1DQ*rG{&GL zGVhrn6n^YJ2O78BfU3LII1;XR8lyYx)v@nHNgR47YUnldTIJCmKS~D_}3>P0D7^p``5%q3w+`q{?ZuiQ%N0DWm9- zNQ3YAUPRIu&K-XLnJmcFeFX|rS_YuxSG5utbsD}Dx-4rA&R-RG4%7=kFN7?0hIa&a znkIpn>JFeidEY>=i~zhVc>9(Fa4FG4-aG|)vQ1@)2qPY+ekT#n=n-N`(@~K8~Xx<70(=@>U%e82r{|O zg4)}wgTW)GALDHQW$A*paZnMkko+RB{}pFX(9aas^*>DB_Tj%$+8S%qF@axT7dys| zANm74g|%mqAM~u4=NFIF^lm?lx(zyhUU*7-k~~qs9^(fud0L*J8f$TPy=A;O@k?_J=g@p;gx^$ceXINtpeO1@ub1I?>*Q2VpfGoV?P zKlUx(j;;rD13rLC&gIxi{xcH?Z)r%b*zA)h-M%Hk$3rl5N1l%c`}8hyD&)l7RKkc*T9_J1FOPVMncP#F6x8>+hQt^+x)i$YaYHG0+iN6AJoC=0#nz4GW0 zTtTP|+_(8sVX zovi{JsoH2le;PmisQ>$#eTV1x_>S{K+v#T)pl#?b%3gxk^>K|OwR!*=BaH z0j@ae$yM%tCQxrbyStvtR&h!9`DWcmc-*=)CY2Vr<;oPR&bYbmFV|e*rp(c+E$qg> zU`D5wTnW;>@3sQjw6|{1q(A8T75A<5y2A2?Ew0az$Gq)|v0z-~dIS6EY*$##G{E&7 z(eM9=X!fJmOns>@`Op=G_gr$^i)D5Zbgmj#hBl#RUAR)OiJT*wHd+QB{6r$6c-m~HPhLk<32;Gwj-NI)%pfGM6$ zhy9gh4f~$8j$I|Gl39*I*__JX9a@h**7<@LZ+9De+E2Tjv6!(xY3^mS-QHBQ!Cumy zTQ=Kq$nN`rkIp~r`nErG4YI3Ww#F^a?lkJtvdcu>8|?ELA+)e--wcAegdmN`~`3PNm30;y1os9{dq-PJIt%t@V&~Bx{xv+%u-L%bV zcIDSwL{Hg{*C;Eg*(#S@)8n_C z;3r`%Mf+=wY+l8+k*`KH<}x}Dh9Kf z{kGT_w$tpQ)`^I4GoK@MQDJ71LQXO4W~+Cuh*dP5W@U-nUz(fnqPQS zj!$TIuhYoS)2zY$=WLp=cEJfv%wL6TG%=zJk80Y2KQy(GAq&xj=NEm{+>LC9h30zj zp5{EF-*h+CN$qc#LCX3ggnBwmrdXoR;B39lcI|)(7VAhY!NFthKQx#EM514hMoS&KXVltElxrY=E3s28kjXR>#BqGr{Z2 zu6TFwYIvlAM~~sr7J0GOg0#7EOKK&vdXFqB?ap5=yD}%fc#n*Dg3GB_(!s$6rT3)< z+^(JRlajF#0 zX9?K3T9^FtMRkM3a%9UllHWh8i6_5&Q8P|{`Jz^Z{PIO@rFb&YuSV}2P@W{p6`P>^ zoO}-6DDH9uan)H}=G5%ZfIm`Q6B^M&lB)(slSjn8dt$TpANtqYoqt8_Sgr4gU!r4P z&!(sGD@=H6%TzA5a(~O+P$#}KFmYLf?T*DEx|iQ=f8w5TWglm? z)tjq-IGS~bTCBHCE1tiew@vX-bZZWK?HabL&0}s zZQ3rm6(hGjXA7cJ`?oC^9XD0CU_{(Jy=5Ob!$#Mu2d?1Ge|Z7y+%0SOsN%OoKk$a* zUhb1SPT^i|4~~mJ)brH0WKWzsnYmH%x#F1%Yf5`QT}WS1)+Sv$u_&f?rcq_?in2WN zMwDE)mIOpMw>Doy@b>mD%q=T#VF$wq>VWO^(mG#ZO%u@tYaKrJ-$&#>o9`f|Z!0Ak z;FTx3v135ayp!-QR$HJmQ9-zG7gl3R4@9wcOnr#8Cjb10n4dV4`}yz`1G7Jh=;?n% zIIx4#lM)_}_lKh=K%5h-pqwFOVE=$O=U{B(nuRc7Hf9LC#l@QNTru>Q)?lUZe!*qf z=Xqs|4fLD0BVM;Pcd|f#$Q?xC^4-0Nae1rB{fSB359^^nXW%AQ04$HuM(ez%oY4P@ zym3Wk%^)a|`g{x4%BIiZ*<7we`0M()LumWln4w!l)eDSUP@fX924(6iFGWcCCDsBU zW@xPGHxiwR;e>e}ge6!NF_{-&Z6>pU7yA3I!5`j>w6{Y4>n=s;&%Zkj{XhF;p#Nrn zFZ72zfu20qXV9FKJOulPEquud{jtOEFe~!E*1~Es_YGRD@}9hpL^5}j3;EB6QM7cY z%G=GjGim6p6Rsi^y`{eK_9xNyPMQ)vfN~$<*m_D6O4_c}6r!_e9^tvggmsdHSLYM9 z7vfzm3;%=9y!X1d5?2wn_rtGxUp|S!7*lwD6z|g6`0_FIKY0!N`XgF&ecF$^=#PB5iu|qVXSAK|^=EtRzBE5q6K$VA z6Mhk-M8rWEp9FsqP93HUB_z+kBJ;n5umPUHWVW&rcCr)pazOu~eqHE4{}g8!GJgRj z_qM$*g#OgGw$N`sj#ixE|KNjn83~c!%}aLu`~z#OMN{w%uZpi&qu9oMOD9iN&LCc^ z-T96&DE)dCBlO_eS)6Crf!XiaA9|5@{;f{`0n4DzZ&1P$P(O}?^!U#roy{P>KDR-L_K7bM?^Qj)b>HcyX^uHc~HHM1D(7*R=KBPha|gdWs~xf1B9gh|9`@2c>W8%dx$WXW+8HDE-ss{>$2{V<5?T0;G@U9-=Oa^ zpY_8>Gxa*4JEQ;d0BCpqE7p&{3wMF#sc2`qZuk_qn%tq8_R!h_Jf(XV43aMe^@T82 z(?mF7oit9OF%3QoViY1DPRA~JiU{Q~%3(^>gd^~A@D}A2!aOIcoNCVTB;{WbC=J-(M zH0PO>OEtF=X8xd*nc4@<`EQ^k{ZBtypYGF93x!`Ue*&W_V868Wh03V?dg>|AH3C{v zdB`ssr;L-kSW_DG@R^hp`Cp);&@iaNiSe0oa84n}MfK3=n6iwPVG)d_AC$B&k`ak< zWQY=D3*~OY9CxbRhA_*S@EFZPWS%GGjMtPrQ?OHd*qd1B9PYml8gyVJq&~R(7qqV6 zgoba0W?)e&;!cWE#6fVbS0-w?W!(&>ll!WY?G^TdGQ!ZC%(WenGBghL$8nJx6e>0-}84tgtKi zWcvs3##~q+v4$u~#Ml7yDKjYJDZ?odq48H|N(Loj+yCw1ng6ph-MOUCP~|j=rKyo} zYTA?zbiRCZ5|r$RCnnc+pcToxn#hWwu>zixq*#c#A@O}G?3b7u;SOqg!9x>Q*v!ZN z^{F0oB~&YvfQiDeWr8!8C#X9gy_O(DlqA3k;4VrI$_b*haNviFK#gaHXaE`>|O~N2o1^${)S4gxOq``CJ z|3##Mm%V;~em46-Nxl2vS_QQ3=%ff6*vs_~Y+QieIa*Hi9K|>RQz&C7gDBBX97oTA zhzKC83BqddkXJ-u+8wI-HdRY^@yQ=ZIhpoClKvDTPvYq}#BRR^SV8AbST+7-lRD^7 z5s0&WD{KLC($FJEB_rTDaWmd1$JLSFC5Q{vUkYj|@`JlX!oWp4pf~pOB8-Aq^d;Cw z*+F@Y5;G5u)AeR7`X1#R%4EtY!nE~N^KYt_M$04`bCOuekwiK#B=}54Lg%$N4~Pv1 zc0yr9Cu|t^rO6HqtjGrE77pV4Wobu1m53+E%>VP&1h3c}2cz}T(ij6p_;L(Cc?u(D z#ZGBlCHb}l$D`j6CDD&4v2sMYjk1yQ0_7>nTuRzU(X@|J1gLU4UnVlCW|}!n*g(qh z*b76g*VHj6y!>VqTsnYA66@P32o0~BB0z_V8r1lu5WX3mn&to=h(t9}W8P33b=u}0 z=%}9#9#(_}qE?IQ;VQ$YofF{WW!u2pL{;Qv%1TQ3B95TtU@B!aC3+f1JSfqxu<$HV znDBtAy-w9)M+TkLqhjBaaxB}_8R#^BLljmG!26%Z`&$8pk#R-rAV(T> zMzlxrgMQw1;2ztRSPxC8? z;am~UgEhsa@U6)6^M|j-y-pqB3vkEK*RbEXul`TiH1h4!VdF%9d`r@V_|?<|23KG#hy5;+19QkP^MwgTT4E0~>Wvyg zi)=L)wuf37@NIb=DyWpkb3AmunC8Bkkk>qp2UJ43R`v-Sh9Iho7Kgw_hs;9|rw%^} zffXc_LgKJjs0j(iid8rS5lto~#0IOsCm}}2x3h(45dE>Asak6D=;Ndu1vi3Dx{8Q6 zMatnFQ?OXr?-4#wcHk&fo$SQ9Ls^=hVXqrjxgPn;Uqz@P_*fdETJXNeoQ?WHLq0sa zZG$px^Mz)DbPZy}-v(`0`YCG~_)YAELPlU8ucUHpU?b}#)vQ2xi~5ehEUfP=0&#Xt z_rMU`apM<=$fF$+2tUy&4m3uNy)Y1(^|AwHv7bu{6e0SfxvAPQ!U*a=;b%!X>@;C$ zHDO546nr)K?+7d$EIEMMg7P}cuzUO3g#HY4t~`t@9dC<{uT2XGNZ+vcZvbm#_n~3` z79V@LP=7buH>y(pdkvmzarpgGcGBba>pkRRXz6!$*J|TRzvML@rs{qH$oi%FVdR)6 z`yWJ0cWr{k*ulV$)t1H#{ z*hVeV`swq3QFh)zSv=dDSHI?*b4F2uiXw`jf&>L6h)R&0bIv*EoO8}OBZ?p(s06`8 zP!Lf;P(e`y1E}vl-S_^gwraQT-Sv-8b&bQ!Gu@|8pFZ91%rf(QndfG=G*2kZnpw-7 zQF&-4Ao50IvDrGFWm?&$9}mvx1etcM=hA&|dK3BXuckT3Cf_%WLmu44GzhtSPE&Xo z!}q4>vqoj6y2uBpnJQscy2kVh*kF2|=(o40YH37nLtDYRh8(duZ;EhzFrAkla^A(nJmI^Pl<`ckyZjpC09PSZA7c*lui6`p z`ZWFYWsM?bQjJ25ltdLwFB=`=$ukc#n#VF^dBSjb!oI;nDV7g9EpCo~l$G!dOV zgQr&+N<~e0cQ0aTH+=A5&ADfWD{op|<})zMZ%|0k?@K(S@lanOxL*Ih-iT{}=>|O? z3qi{UJ$B9awyL^sW!F3G*Ub?fb@J1-uG0ZF!qM8_|~CUV4p zwt{~2B>ah9%Fx~8p1L*NY@%s8UmoztrR%WYOxKXm_Q{_#yrwmrsAaKLOEvhf-8{`9 z*Jn=Anhq9GZaJDev_w6hYdn(m^%2(yyJ+rbq#<{DZNOm-R<^f+wi=7KxCUvdLv!#B z^5*H_QuTI3y+_pRz+&>!;Lt2#`3Gi7K_`?4~-de;LDy=UqRZ+4o;t6eK#vKLa# zOH6WQQr#AE#_O6&q}w(>ZIuHSBSFiQ8?^F5#+8j^e}ywCvtIlgxkl;h>E@^crF!;( z=w79`ZF^!$m7M3e#>y$d!ea-O;2YzvDT#tDO7IKurVR3%u>lGm$VP)6%y6Hv9$mLlI#HPvdXm3d1m3=K|m&7j{ zb161uo~-m4-&7mf-G?U90%U$}f0cekrfxh4EoE!4zj+07AI81Sg`Yt0wRa=Y1g~)c8=Y09+M9Y zG-SnxxoqTR*t+vvtE5>UH2Dr)| zBUIRYw?Q?Ju=w(T>O16pP&W?>Zv;Js=YoSmpO7c#5kfD%l_qot{3Dcy_m{{Dpg(ZE{x#nB>IZFJQg&PV_@C79mmaaaV9BNn*cBawY@`m!6rB-G)$4@Kj*w%dK zeJH=XHi%bIJfd!rXPSRu{WhNDqgU&H@Tlxv*AUIavFcspTApRd%2=I(=En9@UC5B{ zIaLE%pGpOLPq|^w`Jq#o#WlH|!syo2d+Hd`FM0;bwa>$5B$9-XKi952hbY>1K3^$= z;pK4#tq_{RYxzweuIH5Va7|j($@Ctc+>>0BEo#NPkDtFaT0VK~aiM&*&QYbLUp3Pl z2SOX~a2=j;?`h~f^v7zj>Byl~I%w(A+B#UCA!p9Uf>Es9k;Mai$Rdx-`3@E?(1rz1_ps&Q2=bSk4x%kObPi&q zW3JUsr$mta}&?J7o6kl>$)(1+y08Kr~jPWDAj#-9!A^l=y|Bq?zeMY z@y?z@b60?NBty~DF$eyqcQdK+UQJ4jbBKk6Snp!BMQ}f?$Yo+TqUGSkZ6?V4XKvub zd%3GtbYge0!u$i@GAiq_qnhdVaa^mgAqDTXd37%VR%qUeaiwsw!ymt>$#|Ru@9aXp z2kKGWjhNE9x3?AJ#?}{B@CqyX5amn0>i>vc=z}j`llfwWal|I2Q5Z?Yt*c?On za1$X}<(U$E?h5@+1~Q;u|1HjJEgC_6-j@Dg3H{^a$nm)@YxOtOo~_8f`k|FeHOjkd@@k@V$lO7odOo z%MR$z`X-5yM(8`3y8UMz@?raDW})BzH?Cki{nrLDR4C&y^wSmEt8|CXg#~1^;ZYFT5{etCNH(<%HL0v?8*RlzGbtId&87 zmm=KqnsC`#LUQN-&im9(9%quXUziiVfwzTbs{HdoQvL=zpZfL_Z8s9~8}|I1#&>P- zxOf*3jW~+`l5*-eVdQc`?+`-!?SzJip)hxHAe5%r8c~e!nAy@Zk7DG67xE_DPBVY2 z>6zrt|6M=sN?S2SjhvlqMVJ&znAk>1?~x!s10NB8b4(N5`!ay+v*^4A?x@#CA1W); z07cS`u$nL#i5iJX^@3lBQLtSGZrA;eEd2+0ey{<7*PQ5h-d@n*pcSaT{4D8 zq&z~&Ou374BjpOp1%y$52vba{ato^5lWL~(--KRLPS`{kuQdaI5!X0o3?6(5g|Qi( zsvuLn4HQY9~Fio)R^JbKpPF(!U9l^{8@Ps@#rhj-#3%P|}_jCpCjR z#1@X(gKJ-+|HlM$;#p#r*2Bj|CzN@B9O+@W@{7njpqKY5kl&UMoTCRH6xk+^R*Os% zQve-L!w*I(u&{%IEAN9GRL@>YTF>OW$T+@`FoM=|#1t*l@gZWEmiq~l1gLU;s$7C< zHYALr{V=wRlw)_yC_$|?SqF`N`LZ0m+UW#sPwUYZQEFw;xYsoKB4lJ@WH%_{4SyFo z&sG_CzpEz;2Fl+6)x;t|-qZN2h^;Jy^H#yXhffeC;cqDM_b7Kz-lMFe#9eVbpE8{i z{Sp>3OEuG;6F-+Kr@b!r0x8G15=K9m(F1plL1&c5%SLGX)fo(0)#G}R|CE6dG3mHZ z#OX+A2_N-_hYe4&bp=)Q2wCJuF*g4dYX^Hz4}n#zOTom|Js{c!bfh$;)S*a1FH9w_XN*Hx{#uhrW#xlW$FP}oELuV>fP1VC%!ad3w zz_sZ_Np%!arRI(Mhi$dR`JvDC@N}VR3R^%c@nxXI8QeLPofTFWx^B&9kO-L*@|ALg za)7dn@*(A2%3G9WlyrQHn@1GJe5Yz@TSTv>nz;xg^$8=2W_+OV@7N7c`7-O zC{m9*gm#s^0JYL_|Io!ztWZ+w?GNhO;?5yVdKeLd#}%%E4dRku?3obIifuWlxQ_Y`f*(IZ`n66Fk=;XIO-Cv-|bxr`rG0@LFe_MFleO$GzY#Gj{~dE zd;z1`Fh&MCtUm+7Izc%~F-q!719@oqDCGgl9h4ZIa6YaJ+t8+(uTafYdAJhQY)=@P zLm2XIrT{!T_7VyM2H+cles-d_1sOKLLj-;+Uk$os907MmnPAnX*&8hqU~jh%JgzT< zb&y{QkHL2FF);nCEa<`xUH+OIEWyh}i9bK(aY{By>XH06(=zUgbErr1`$Nips5RII zjX%O^D})JA&2&r+q0bc@Mverv&eVZx$6z6WdIMTlmj%yQ6OTquiS@GrQsrA0Zg)UW8e~6ZcH)DO~7|K663d9sNhd&D{$#_6&D> z?8Le2j=Q36pHQ`#R4w(QzHX%KLo-_5^te~Y>^vx3G7i7%d1b%~s>&W+1vfUp2fBxs z;|}g?GSIu-vZLWM+ys1*n1Wot*e~SNaLq6fKXc4gLut9-uq%h8f#^lodHllSK`#A= zzh6#tso$D$rPU=Dk*PCTEt0*+(v9`S_kb+g-`>f1Q_o!iNQ2&{30J+igcrXm%6#5HnM(Qj<6QZ*N*40r#aj4G;)`^jz_U4o5c~HM|X}R6zJY@ zT!ZBb6Y=+zODAqTHW`mE|2v>`yQibR;7k~=B!q_ z%7?5Rtd3l6vAu5jTVS63ZOg|;bsSwROLyLNYO{=<>+1a261M0PXK4vF?3Nf2Tx%_r zP>&LpuvE9NmeB9+W{DBOW2GfLwMVig)$cS))H+h-4%CaxIFa4^8Z1U)y9-6R_< zF^Px2<}g8@4JtEnhnEpBLE8s6nc%rX&Y8eFg*2L=T~Lz_R4rWvux=n_D|bRmX+jHR zfzY<6W@EN5FcTf`=ig< z!wlbHuWUnJ2M52$2K`3!g0>n2s;mpiHMk_zA2w{TPEaM{p8i`-!6-KUJ9}!PIrY;P zzm1ts-h~j8rSE`vcN_UOP;98a8sgxE`sf#Ne){Maaewqt|M6z}@SpL+`WSnlllpuM z8Z(XP=jzUO0J^J99q8{O?6=`F7) zch}d|$oj|kqR#Ue#~^>5Ykuru1==GH9Z`DPE=KCH8rp0sUh!30qgON%>$M7mmL^+k z*&IKVaz{&&X?tpk*0JS!X{K7}q3Qo